summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2015-08-25 08:08:24 -0300
committerRenato Botelho <renato@netgate.com>2015-08-25 14:49:54 -0300
commit46bc6e545a17e77202aaf01ec0cd8d5a46567525 (patch)
tree32d18dda436ec739c67c489ceb771e8629cd926f /src
parent4d9801c2dbd2b3e54a39578ee62b93af66607227 (diff)
downloadpfsense-46bc6e545a17e77202aaf01ec0cd8d5a46567525.zip
pfsense-46bc6e545a17e77202aaf01ec0cd8d5a46567525.tar.gz
Move main pfSense content to src/
Diffstat (limited to 'src')
-rw-r--r--src/cf/conf/trigger_initial_wizard0
-rw-r--r--src/conf.default/config.xml277
-rw-r--r--src/etc/ascii-art/pfsense-logo-small.txt5
-rw-r--r--src/etc/bogons10
-rw-r--r--src/etc/bogonsv60
-rw-r--r--src/etc/ca_countries237
-rw-r--r--src/etc/crontab5
-rw-r--r--src/etc/ddb.conf3
-rw-r--r--src/etc/devd.conf80
-rw-r--r--src/etc/dh-parameters.10245
-rw-r--r--src/etc/dh-parameters.20488
-rw-r--r--src/etc/dh-parameters.409613
-rw-r--r--src/etc/disktab204
-rwxr-xr-xsrc/etc/ecl.php189
-rw-r--r--src/etc/fbtab4
-rw-r--r--src/etc/gettytab235
-rw-r--r--src/etc/group31
-rw-r--r--src/etc/host.conf7
-rw-r--r--src/etc/hosts.allow5
-rw-r--r--src/etc/inc/CHAP.inc463
-rw-r--r--src/etc/inc/IPv6.inc1110
-rw-r--r--src/etc/inc/PEAR.inc1103
-rw-r--r--src/etc/inc/auth.inc1627
-rw-r--r--src/etc/inc/authgui.inc335
-rw-r--r--src/etc/inc/basic_sasl_client.inc63
-rw-r--r--src/etc/inc/captiveportal.inc2409
-rw-r--r--src/etc/inc/certs.inc867
-rw-r--r--src/etc/inc/config.console.inc560
-rw-r--r--src/etc/inc/config.gui.inc96
-rw-r--r--src/etc/inc/config.inc226
-rw-r--r--src/etc/inc/config.lib.inc1020
-rw-r--r--src/etc/inc/cram_md5_sasl_client.inc67
-rw-r--r--src/etc/inc/crypt.inc101
-rw-r--r--src/etc/inc/digest_sasl_client.inc135
-rw-r--r--src/etc/inc/dot.hushlogin0
-rw-r--r--src/etc/inc/dyndns.class1634
-rw-r--r--src/etc/inc/easyrule.inc495
-rw-r--r--src/etc/inc/filter.inc4228
-rw-r--r--src/etc/inc/filter_log.inc441
-rw-r--r--src/etc/inc/functions.inc158
-rw-r--r--src/etc/inc/globals.inc195
-rw-r--r--src/etc/inc/gmirror.inc342
-rw-r--r--src/etc/inc/growl.class102
-rw-r--r--src/etc/inc/gwlb.inc1252
-rw-r--r--src/etc/inc/interfaces.inc5814
-rw-r--r--src/etc/inc/ipsec.attributes.php200
-rwxr-xr-xsrc/etc/inc/ipsec.auth-user.php169
-rw-r--r--src/etc/inc/ipsec.inc777
-rw-r--r--src/etc/inc/itemid.inc108
-rw-r--r--src/etc/inc/led.inc356
-rw-r--r--src/etc/inc/login_sasl_client.inc69
-rw-r--r--src/etc/inc/meta.inc215
-rw-r--r--src/etc/inc/notices.inc453
-rw-r--r--src/etc/inc/ntlm_sasl_client.inc180
-rw-r--r--src/etc/inc/openvpn.attributes.php203
-rw-r--r--src/etc/inc/openvpn.auth-user.php213
-rw-r--r--src/etc/inc/openvpn.inc1589
-rw-r--r--src/etc/inc/openvpn.tls-verify.php97
-rw-r--r--src/etc/inc/pfsense-utils.inc3211
-rw-r--r--src/etc/inc/pkg-utils.inc953
-rw-r--r--src/etc/inc/plain_sasl_client.inc99
-rw-r--r--src/etc/inc/priv.defs.inc1403
-rw-r--r--src/etc/inc/priv.inc337
-rw-r--r--src/etc/inc/priv/user.priv.inc74
-rw-r--r--src/etc/inc/r53.class754
-rw-r--r--src/etc/inc/radius.inc1208
-rw-r--r--src/etc/inc/rrd.inc989
-rw-r--r--src/etc/inc/sasl.inc422
-rw-r--r--src/etc/inc/service-utils.inc749
-rw-r--r--src/etc/inc/services.inc2541
-rw-r--r--src/etc/inc/shaper.inc4969
-rw-r--r--src/etc/inc/simplepie/LICENSE.txt26
-rw-r--r--src/etc/inc/simplepie/simplepie.inc13672
-rw-r--r--src/etc/inc/smtp.inc862
-rw-r--r--src/etc/inc/system.inc2258
-rw-r--r--src/etc/inc/unbound.inc717
-rw-r--r--src/etc/inc/upgrade_config.inc3825
-rw-r--r--src/etc/inc/util.inc2259
-rw-r--r--src/etc/inc/uuid.php327
-rw-r--r--src/etc/inc/voucher.inc785
-rw-r--r--src/etc/inc/vpn.inc2056
-rw-r--r--src/etc/inc/vslb.inc564
-rw-r--r--src/etc/inc/wizardapp.inc668
-rw-r--r--src/etc/inc/xmlparse.inc334
-rw-r--r--src/etc/inc/xmlparse_attr.inc237
-rw-r--r--src/etc/inc/xmlreader.inc277
-rw-r--r--src/etc/inc/xmlrpc.inc148
-rw-r--r--src/etc/inc/xmlrpc_client.inc2060
-rw-r--r--src/etc/inc/xmlrpc_server.inc678
-rw-r--r--src/etc/inc/zeromq.inc340
-rw-r--r--src/etc/inetd.conf1
-rw-r--r--src/etc/login.conf317
-rw-r--r--src/etc/master.passwd29
-rw-r--r--src/etc/motd0
-rw-r--r--src/etc/mtree/BSD.local.dist0
-rw-r--r--src/etc/networks17
-rw-r--r--src/etc/passwd26
-rw-r--r--src/etc/pf.os698
-rw-r--r--src/etc/pfSense.obsoletedfiles1018
-rw-r--r--src/etc/phpshellsessions/changepassword79
-rw-r--r--src/etc/phpshellsessions/disablecarp17
-rw-r--r--src/etc/phpshellsessions/disabledhcpd13
-rw-r--r--src/etc/phpshellsessions/disablereferercheck11
-rw-r--r--src/etc/phpshellsessions/enableallowallwan36
-rw-r--r--src/etc/phpshellsessions/enablecarp23
-rw-r--r--src/etc/phpshellsessions/enablesshd12
-rw-r--r--src/etc/phpshellsessions/externalconfiglocator3
-rw-r--r--src/etc/phpshellsessions/generateguicert8
-rw-r--r--src/etc/phpshellsessions/gitsync434
-rw-r--r--src/etc/phpshellsessions/installpkg36
-rw-r--r--src/etc/phpshellsessions/listpkg16
-rw-r--r--src/etc/phpshellsessions/removepkgconfig8
-rw-r--r--src/etc/phpshellsessions/removeshaper25
-rw-r--r--src/etc/phpshellsessions/restartdhcpd4
-rw-r--r--src/etc/phpshellsessions/restartipsec7
-rw-r--r--src/etc/phpshellsessions/svc99
-rw-r--r--src/etc/phpshellsessions/uninstallpkg34
-rw-r--r--src/etc/platform1
-rw-r--r--src/etc/printcap0
-rw-r--r--src/etc/protocols158
-rw-r--r--src/etc/pubkey.pem1
-rwxr-xr-xsrc/etc/rc439
-rwxr-xr-xsrc/etc/rc.backup_dhcpleases.sh8
-rwxr-xr-xsrc/etc/rc.backup_rrd.sh27
-rwxr-xr-xsrc/etc/rc.banner123
-rwxr-xr-xsrc/etc/rc.bootup428
-rwxr-xr-xsrc/etc/rc.captiveportal_configure40
-rwxr-xr-xsrc/etc/rc.captiveportal_configure_mac52
-rwxr-xr-xsrc/etc/rc.carpbackup97
-rwxr-xr-xsrc/etc/rc.carpmaster105
-rwxr-xr-xsrc/etc/rc.cdrom39
-rw-r--r--src/etc/rc.conf1
-rwxr-xr-xsrc/etc/rc.conf_mount_ro36
-rwxr-xr-xsrc/etc/rc.conf_mount_rw36
-rwxr-xr-xsrc/etc/rc.create_full_backup18
-rwxr-xr-xsrc/etc/rc.d/etcmfs80
-rwxr-xr-xsrc/etc/rc.d/hostid137
-rwxr-xr-xsrc/etc/rc.d/varmfs66
-rwxr-xr-xsrc/etc/rc.dhclient_cron53
-rwxr-xr-xsrc/etc/rc.disable_hdd_apm13
-rwxr-xr-xsrc/etc/rc.dumpon30
-rwxr-xr-xsrc/etc/rc.dyndns.update58
-rwxr-xr-xsrc/etc/rc.embedded32
-rwxr-xr-xsrc/etc/rc.expireaccounts70
-rwxr-xr-xsrc/etc/rc.filter_configure43
-rwxr-xr-xsrc/etc/rc.filter_configure_sync41
-rwxr-xr-xsrc/etc/rc.filter_configure_xmlrpc53
-rwxr-xr-xsrc/etc/rc.filter_synchronize488
-rwxr-xr-xsrc/etc/rc.firmware476
-rwxr-xr-xsrc/etc/rc.firmware_auto72
-rwxr-xr-xsrc/etc/rc.halt13
-rwxr-xr-xsrc/etc/rc.initial167
-rwxr-xr-xsrc/etc/rc.initial.defaults62
-rwxr-xr-xsrc/etc/rc.initial.firmware_update190
-rwxr-xr-xsrc/etc/rc.initial.halt61
-rwxr-xr-xsrc/etc/rc.initial.password89
-rwxr-xr-xsrc/etc/rc.initial.ping55
-rwxr-xr-xsrc/etc/rc.initial.reboot61
-rwxr-xr-xsrc/etc/rc.initial.setlanip556
-rwxr-xr-xsrc/etc/rc.initial.setports51
-rwxr-xr-xsrc/etc/rc.initial.store_config_to_removable_device93
-rwxr-xr-xsrc/etc/rc.initial.toggle_sshd75
-rwxr-xr-xsrc/etc/rc.interfaces_carp_configure39
-rwxr-xr-xsrc/etc/rc.interfaces_lan_configure39
-rwxr-xr-xsrc/etc/rc.interfaces_opt_configure41
-rwxr-xr-xsrc/etc/rc.interfaces_wan_configure50
-rwxr-xr-xsrc/etc/rc.kill_states94
-rwxr-xr-xsrc/etc/rc.linkup165
-rwxr-xr-xsrc/etc/rc.nanobsd_switch_boot_slice27
-rwxr-xr-xsrc/etc/rc.newipsecdns61
-rwxr-xr-xsrc/etc/rc.newroutedns59
-rwxr-xr-xsrc/etc/rc.newwanip268
-rwxr-xr-xsrc/etc/rc.newwanipv6204
-rwxr-xr-xsrc/etc/rc.notify_message64
-rwxr-xr-xsrc/etc/rc.ntpdate39
-rwxr-xr-xsrc/etc/rc.openvpn132
-rwxr-xr-xsrc/etc/rc.packages88
-rwxr-xr-xsrc/etc/rc.php-fpm_restart17
-rwxr-xr-xsrc/etc/rc.php_ini_setup417
-rwxr-xr-xsrc/etc/rc.prunecaptiveportal66
-rwxr-xr-xsrc/etc/rc.reboot35
-rwxr-xr-xsrc/etc/rc.reload_all46
-rwxr-xr-xsrc/etc/rc.reload_interfaces45
-rwxr-xr-xsrc/etc/rc.resolv_conf_generate36
-rwxr-xr-xsrc/etc/rc.restart_webgui28
-rwxr-xr-xsrc/etc/rc.restore_config_backup129
-rwxr-xr-xsrc/etc/rc.restore_full_backup20
-rwxr-xr-xsrc/etc/rc.savecore22
-rwxr-xr-xsrc/etc/rc.savevoucher40
-rwxr-xr-xsrc/etc/rc.shutdown37
-rwxr-xr-xsrc/etc/rc.start_packages88
-rwxr-xr-xsrc/etc/rc.stop_packages5
-rwxr-xr-xsrc/etc/rc.update_alias_url_data43
-rwxr-xr-xsrc/etc/rc.update_bogons.sh152
-rwxr-xr-xsrc/etc/rc.update_urltables60
-rw-r--r--src/etc/services4111
-rw-r--r--src/etc/shells12
-rw-r--r--src/etc/skel/dot.profile5
-rw-r--r--src/etc/skel/dot.shrc14
-rw-r--r--src/etc/skel/dot.tcshrc30
-rw-r--r--src/etc/ssh/sshd_config103
-rwxr-xr-xsrc/etc/sshd207
-rw-r--r--src/etc/ssl/openssl.cnf309
-rw-r--r--src/etc/syslog.conf12
-rw-r--r--src/etc/ttys49
-rw-r--r--src/etc/version1
-rw-r--r--src/home/.empty0
-rw-r--r--src/root/.gitsync_merge.sample3
-rw-r--r--src/root/.hushlogin0
-rw-r--r--src/root/.profile5
-rw-r--r--src/root/.shrc14
-rw-r--r--src/root/.tcshrc30
-rwxr-xr-xsrc/sbin/athctrl.sh41
-rwxr-xr-xsrc/sbin/dhclient-script404
-rwxr-xr-xsrc/usr/local/bin/3gstats.php83
-rwxr-xr-xsrc/usr/local/bin/beep.sh43
-rw-r--r--src/usr/local/bin/captiveportal_gather_stats.php115
-rwxr-xr-xsrc/usr/local/bin/easyrule147
-rwxr-xr-xsrc/usr/local/bin/filterparser.php58
-rwxr-xr-xsrc/usr/local/bin/mail.php25
-rwxr-xr-xsrc/usr/local/bin/ping_hosts.sh134
-rwxr-xr-xsrc/usr/local/bin/runmsntp.sh12
-rwxr-xr-xsrc/usr/local/bin/slowdownpipe.sh9
-rwxr-xr-xsrc/usr/local/bin/viconfig3
-rw-r--r--src/usr/local/captiveportal/index.php252
-rw-r--r--src/usr/local/captiveportal/radius_accounting.inc323
-rw-r--r--src/usr/local/captiveportal/radius_authentication.inc189
l---------src/usr/local/openssl/openssl.cnf1
-rw-r--r--src/usr/local/pkg/miniupnpd.inc297
-rw-r--r--src/usr/local/pkg/miniupnpd.xml135
-rwxr-xr-xsrc/usr/local/sbin/cleargmirror.sh26
-rwxr-xr-xsrc/usr/local/sbin/cleargpt.sh13
-rw-r--r--src/usr/local/sbin/gmirror_status_check.php96
-rw-r--r--src/usr/local/sbin/mpd.script1642
-rwxr-xr-xsrc/usr/local/sbin/ntpdate_sync_once.sh46
-rwxr-xr-xsrc/usr/local/sbin/openvpn.attributes.sh16
-rwxr-xr-xsrc/usr/local/sbin/ovpn-linkdown7
-rwxr-xr-xsrc/usr/local/sbin/ovpn-linkup21
-rwxr-xr-xsrc/usr/local/sbin/ovpn_auth_verify16
-rwxr-xr-xsrc/usr/local/sbin/pfSsh.php344
-rwxr-xr-xsrc/usr/local/sbin/ppp-linkdown31
-rwxr-xr-xsrc/usr/local/sbin/ppp-linkup62
-rwxr-xr-xsrc/usr/local/sbin/ppp-log-uptime.sh5
-rwxr-xr-xsrc/usr/local/sbin/ppp-uptime.sh3
-rw-r--r--src/usr/local/sbin/prefixes.php93
-rwxr-xr-xsrc/usr/local/sbin/show_filter_reload_status.php26
-rwxr-xr-xsrc/usr/local/sbin/ufslabels.sh149
-rwxr-xr-xsrc/usr/local/sbin/vpn-linkdown6
-rwxr-xr-xsrc/usr/local/sbin/vpn-linkup16
-rw-r--r--src/usr/local/share/locale/en/LC_MESSAGES/pfSense.pot29959
-rw-r--r--src/usr/local/share/locale/ja/LC_MESSAGES/pfSense.po48738
-rw-r--r--src/usr/local/share/locale/pt_BR/LC_MESSAGES/pfSense.mobin0 -> 651246 bytes
-rw-r--r--src/usr/local/share/locale/pt_BR/LC_MESSAGES/pfSense.po41314
-rw-r--r--src/usr/local/share/locale/tr/LC_MESSAGES/pfSense.mobin0 -> 578231 bytes
-rw-r--r--src/usr/local/share/locale/tr/LC_MESSAGES/pfSense.po34350
-rwxr-xr-xsrc/usr/local/share/mobile-broadband-provider-info/iso_3166-1_list_en.xml987
-rw-r--r--src/usr/local/share/mobile-broadband-provider-info/serviceproviders.xml13576
-rw-r--r--src/usr/local/share/pbi-keys/pfSense-BETA.ssl14
-rwxr-xr-xsrc/usr/local/share/pfSense/post_upgrade_command64
-rwxr-xr-xsrc/usr/local/share/pfSense/post_upgrade_command.php31
-rw-r--r--src/usr/local/share/pfSense/pre_upgrade_command58
-rw-r--r--src/usr/local/share/protocols/100bao.pat12
-rw-r--r--src/usr/local/share/protocols/EAOrigin.pat7
-rw-r--r--src/usr/local/share/protocols/LICENSE605
-rw-r--r--src/usr/local/share/protocols/aim.pat28
-rw-r--r--src/usr/local/share/protocols/aimwebcontent.pat10
-rw-r--r--src/usr/local/share/protocols/any.pat8
-rw-r--r--src/usr/local/share/protocols/applejuice.pat12
-rw-r--r--src/usr/local/share/protocols/ares.pat63
-rw-r--r--src/usr/local/share/protocols/armagetron.pat12
-rw-r--r--src/usr/local/share/protocols/audiogalaxy.pat19
-rw-r--r--src/usr/local/share/protocols/battlefield1942.pat14
-rw-r--r--src/usr/local/share/protocols/battlefield2.pat26
-rw-r--r--src/usr/local/share/protocols/battlefield2142.pat14
-rw-r--r--src/usr/local/share/protocols/bgp.pat19
-rw-r--r--src/usr/local/share/protocols/biff.pat16
-rw-r--r--src/usr/local/share/protocols/bittorrent.pat25
-rw-r--r--src/usr/local/share/protocols/chikka.pat17
-rw-r--r--src/usr/local/share/protocols/cimd.pat19
-rw-r--r--src/usr/local/share/protocols/ciscovpn.pat11
-rw-r--r--src/usr/local/share/protocols/citrix.pat12
-rw-r--r--src/usr/local/share/protocols/code_red.pat8
-rw-r--r--src/usr/local/share/protocols/counterstrike-source.pat42
-rw-r--r--src/usr/local/share/protocols/cvs.pat14
-rw-r--r--src/usr/local/share/protocols/dayofdefeat-source.pat11
-rw-r--r--src/usr/local/share/protocols/dazhihui.pat11
-rw-r--r--src/usr/local/share/protocols/dhcp.pat36
-rw-r--r--src/usr/local/share/protocols/directconnect.pat14
-rw-r--r--src/usr/local/share/protocols/dns.pat63
-rw-r--r--src/usr/local/share/protocols/doom3.pat10
-rw-r--r--src/usr/local/share/protocols/edonkey.pat37
-rw-r--r--src/usr/local/share/protocols/exe.pat20
-rw-r--r--src/usr/local/share/protocols/fasttrack.pat23
-rw-r--r--src/usr/local/share/protocols/finger.pat15
-rw-r--r--src/usr/local/share/protocols/flash.pat18
-rw-r--r--src/usr/local/share/protocols/freenet.pat10
-rw-r--r--src/usr/local/share/protocols/ftp.pat46
-rw-r--r--src/usr/local/share/protocols/gif.pat8
-rw-r--r--src/usr/local/share/protocols/gkrellm.pat13
-rw-r--r--src/usr/local/share/protocols/gnucleuslan.pat10
-rw-r--r--src/usr/local/share/protocols/gnutella.pat34
-rw-r--r--src/usr/local/share/protocols/goboogy.pat13
-rw-r--r--src/usr/local/share/protocols/gopher.pat25
-rw-r--r--src/usr/local/share/protocols/gtalk.pat11
-rw-r--r--src/usr/local/share/protocols/guildwars.pat14
-rw-r--r--src/usr/local/share/protocols/h323.pat36
-rw-r--r--src/usr/local/share/protocols/halflife2-deathmatch.pat10
-rw-r--r--src/usr/local/share/protocols/hddtemp.pat14
-rw-r--r--src/usr/local/share/protocols/hotline.pat12
-rw-r--r--src/usr/local/share/protocols/html.pat11
-rw-r--r--src/usr/local/share/protocols/http-dap.pat19
-rw-r--r--src/usr/local/share/protocols/http-freshdownload.pat17
-rw-r--r--src/usr/local/share/protocols/http-itunes.pat14
-rw-r--r--src/usr/local/share/protocols/http-rtsp.pat16
-rw-r--r--src/usr/local/share/protocols/http.pat28
-rw-r--r--src/usr/local/share/protocols/httpaudio.pat32
-rw-r--r--src/usr/local/share/protocols/httpcachehit.pat19
-rw-r--r--src/usr/local/share/protocols/httpcachemiss.pat17
-rw-r--r--src/usr/local/share/protocols/httpvideo.pat32
-rw-r--r--src/usr/local/share/protocols/ident.pat15
-rw-r--r--src/usr/local/share/protocols/imap.pat14
-rw-r--r--src/usr/local/share/protocols/imesh.pat15
-rw-r--r--src/usr/local/share/protocols/ipp.pat12
-rw-r--r--src/usr/local/share/protocols/irc.pat20
-rw-r--r--src/usr/local/share/protocols/jabber.pat24
-rw-r--r--src/usr/local/share/protocols/jpeg.pat8
-rw-r--r--src/usr/local/share/protocols/kugoo.pat21
-rw-r--r--src/usr/local/share/protocols/live365.pat15
-rw-r--r--src/usr/local/share/protocols/liveforspeed.pat13
-rw-r--r--src/usr/local/share/protocols/lpd.pat18
-rw-r--r--src/usr/local/share/protocols/mohaa.pat11
-rw-r--r--src/usr/local/share/protocols/mp3.pat11
-rw-r--r--src/usr/local/share/protocols/msn-filetransfer.pat30
-rw-r--r--src/usr/local/share/protocols/msnmessenger.pat28
-rw-r--r--src/usr/local/share/protocols/mute.pat11
-rw-r--r--src/usr/local/share/protocols/napster.pat24
-rw-r--r--src/usr/local/share/protocols/nbns.pat20
-rw-r--r--src/usr/local/share/protocols/ncp.pat23
-rw-r--r--src/usr/local/share/protocols/netbios.pat29
-rw-r--r--src/usr/local/share/protocols/nimda.pat8
-rw-r--r--src/usr/local/share/protocols/nntp.pat21
-rw-r--r--src/usr/local/share/protocols/ntp.pat17
-rw-r--r--src/usr/local/share/protocols/ogg.pat7
-rw-r--r--src/usr/local/share/protocols/openft.pat13
-rw-r--r--src/usr/local/share/protocols/pcanywhere.pat12
-rw-r--r--src/usr/local/share/protocols/pdf.pat11
-rw-r--r--src/usr/local/share/protocols/perl.pat7
-rw-r--r--src/usr/local/share/protocols/png.pat13
-rw-r--r--src/usr/local/share/protocols/poco.pat12
-rw-r--r--src/usr/local/share/protocols/pop3.pat50
-rw-r--r--src/usr/local/share/protocols/postscript.pat7
-rw-r--r--src/usr/local/share/protocols/pplive.pat11
-rw-r--r--src/usr/local/share/protocols/pressplay.pat15
-rw-r--r--src/usr/local/share/protocols/qq.pat26
-rw-r--r--src/usr/local/share/protocols/quake-halflife.pat32
-rw-r--r--src/usr/local/share/protocols/quake1.pat19
-rw-r--r--src/usr/local/share/protocols/quicktime.pat21
-rw-r--r--src/usr/local/share/protocols/radmin.pat17
-rw-r--r--src/usr/local/share/protocols/rar.pat7
-rw-r--r--src/usr/local/share/protocols/rdp.pat20
-rw-r--r--src/usr/local/share/protocols/replaytv-ivs.pat11
-rw-r--r--src/usr/local/share/protocols/rlogin.pat19
-rw-r--r--src/usr/local/share/protocols/rpm.pat7
-rw-r--r--src/usr/local/share/protocols/rtf.pat8
-rw-r--r--src/usr/local/share/protocols/rtmp.pat13
-rw-r--r--src/usr/local/share/protocols/rtp.pat33
-rw-r--r--src/usr/local/share/protocols/rtsp.pat15
-rw-r--r--src/usr/local/share/protocols/runesofmagic.pat63
-rw-r--r--src/usr/local/share/protocols/shoutcast.pat27
-rw-r--r--src/usr/local/share/protocols/sip.pat20
-rw-r--r--src/usr/local/share/protocols/skypeout.pat50
-rw-r--r--src/usr/local/share/protocols/skypetoskype.pat14
-rw-r--r--src/usr/local/share/protocols/smb.pat19
-rw-r--r--src/usr/local/share/protocols/smtp.pat40
-rw-r--r--src/usr/local/share/protocols/snmp-mon.pat32
-rw-r--r--src/usr/local/share/protocols/snmp-trap.pat33
-rw-r--r--src/usr/local/share/protocols/snmp.pat19
-rw-r--r--src/usr/local/share/protocols/socks.pat32
-rw-r--r--src/usr/local/share/protocols/soribada.pat51
-rw-r--r--src/usr/local/share/protocols/soulseek.pat17
-rw-r--r--src/usr/local/share/protocols/ssdp.pat21
-rw-r--r--src/usr/local/share/protocols/ssh.pat17
-rw-r--r--src/usr/local/share/protocols/ssl.pat16
-rw-r--r--src/usr/local/share/protocols/stun.pat46
-rw-r--r--src/usr/local/share/protocols/subspace.pat21
-rw-r--r--src/usr/local/share/protocols/subversion.pat13
-rw-r--r--src/usr/local/share/protocols/swf.pat2
-rw-r--r--src/usr/local/share/protocols/tar.pat12
-rw-r--r--src/usr/local/share/protocols/teamfortress2.pat11
-rw-r--r--src/usr/local/share/protocols/teamspeak.pat15
-rw-r--r--src/usr/local/share/protocols/telnet.pat16
-rw-r--r--src/usr/local/share/protocols/tesla.pat15
-rw-r--r--src/usr/local/share/protocols/tftp.pat21
-rw-r--r--src/usr/local/share/protocols/thecircle.pat12
-rw-r--r--src/usr/local/share/protocols/tonghuashun.pat11
-rw-r--r--src/usr/local/share/protocols/tor.pat17
-rw-r--r--src/usr/local/share/protocols/tsp.pat14
-rw-r--r--src/usr/local/share/protocols/unset.pat8
-rw-r--r--src/usr/local/share/protocols/uucp.pat12
-rw-r--r--src/usr/local/share/protocols/validcertssl.pat25
-rw-r--r--src/usr/local/share/protocols/ventrilo.pat18
-rw-r--r--src/usr/local/share/protocols/vnc.pat23
-rw-r--r--src/usr/local/share/protocols/whois.pat14
-rw-r--r--src/usr/local/share/protocols/worldofwarcraft.pat66
-rw-r--r--src/usr/local/share/protocols/x11.pat23
-rw-r--r--src/usr/local/share/protocols/xboxlive.pat41
-rw-r--r--src/usr/local/share/protocols/xunlei.pat83
-rw-r--r--src/usr/local/share/protocols/yahoo.pat27
-rw-r--r--src/usr/local/share/protocols/zip.pat7
-rw-r--r--src/usr/local/share/protocols/zmaap.pat18
-rw-r--r--src/usr/local/share/rrdtool/fonts/DejaVuSansMono-Roman.ttfbin0 -> 60444 bytes
-rwxr-xr-xsrc/usr/local/www/apple-touch-icon.pngbin0 -> 4068 bytes
-rwxr-xr-xsrc/usr/local/www/bandwidth_by_ip.php150
-rw-r--r--src/usr/local/www/carp_status.php252
-rw-r--r--src/usr/local/www/classes/maintable.inc206
-rw-r--r--src/usr/local/www/code-syntax-highlighter/SyntaxHighlighter.css166
-rw-r--r--src/usr/local/www/code-syntax-highlighter/gpl.txt340
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushCSharp.js30
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushCpp.js72
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushCss.js50
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushDelphi.js31
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushJScript.js22
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushJava.js26
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushPhp.js23
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushPython.js71
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushRuby.js26
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushSql.js40
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushVb.js29
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shBrushXml.js61
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shCore.js589
-rw-r--r--src/usr/local/www/code-syntax-highlighter/shCore.uncompressed.js636
-rw-r--r--src/usr/local/www/crash_reporter.php156
-rw-r--r--src/usr/local/www/csrf/csrf-magic.js186
-rw-r--r--src/usr/local/www/csrf/csrf-magic.php403
-rw-r--r--src/usr/local/www/css/table.css46
-rw-r--r--src/usr/local/www/diag_arp.php365
-rw-r--r--src/usr/local/www/diag_authentication.php138
-rw-r--r--src/usr/local/www/diag_backup.php818
-rw-r--r--src/usr/local/www/diag_confbak.php301
-rwxr-xr-xsrc/usr/local/www/diag_defaults.php90
-rw-r--r--src/usr/local/www/diag_dns.php320
-rwxr-xr-xsrc/usr/local/www/diag_dump_states.php280
-rw-r--r--src/usr/local/www/diag_dump_states_sources.php211
-rw-r--r--src/usr/local/www/diag_gmirror.php406
-rw-r--r--src/usr/local/www/diag_ipsec.php555
-rw-r--r--src/usr/local/www/diag_ipsec_leases.php131
-rw-r--r--src/usr/local/www/diag_ipsec_sad.php141
-rw-r--r--src/usr/local/www/diag_ipsec_spd.php138
-rw-r--r--src/usr/local/www/diag_ipsec_xml.php84
-rw-r--r--src/usr/local/www/diag_limiter_info.php121
-rwxr-xr-xsrc/usr/local/www/diag_logs.php145
-rw-r--r--src/usr/local/www/diag_logs_auth.php112
-rw-r--r--src/usr/local/www/diag_logs_dhcp.php115
-rw-r--r--src/usr/local/www/diag_logs_filter.php503
-rwxr-xr-xsrc/usr/local/www/diag_logs_filter_dynamic.php223
-rw-r--r--src/usr/local/www/diag_logs_filter_summary.php249
-rwxr-xr-xsrc/usr/local/www/diag_logs_gateways.php147
-rw-r--r--src/usr/local/www/diag_logs_ipsec.php123
-rw-r--r--src/usr/local/www/diag_logs_ntpd.php110
-rw-r--r--src/usr/local/www/diag_logs_openvpn.php111
-rw-r--r--src/usr/local/www/diag_logs_ppp.php109
-rw-r--r--src/usr/local/www/diag_logs_relayd.php111
-rwxr-xr-xsrc/usr/local/www/diag_logs_resolver.php152
-rw-r--r--src/usr/local/www/diag_logs_routing.php123
-rw-r--r--src/usr/local/www/diag_logs_settings.php517
-rwxr-xr-xsrc/usr/local/www/diag_logs_vpn.php211
-rw-r--r--src/usr/local/www/diag_logs_wireless.php125
-rw-r--r--src/usr/local/www/diag_nanobsd.php289
-rw-r--r--src/usr/local/www/diag_ndp.php184
-rw-r--r--src/usr/local/www/diag_packet_capture.php485
-rw-r--r--src/usr/local/www/diag_patterns.php97
-rw-r--r--src/usr/local/www/diag_pf_info.php117
-rw-r--r--src/usr/local/www/diag_ping.php202
-rwxr-xr-xsrc/usr/local/www/diag_pkglogs.php147
-rw-r--r--src/usr/local/www/diag_resetstate.php143
-rw-r--r--src/usr/local/www/diag_routes.php247
-rw-r--r--src/usr/local/www/diag_smart.php453
-rw-r--r--src/usr/local/www/diag_sockets.php181
-rw-r--r--src/usr/local/www/diag_states_summary.php206
-rw-r--r--src/usr/local/www/diag_system_activity.php115
-rw-r--r--src/usr/local/www/diag_system_pftop.php216
-rw-r--r--src/usr/local/www/diag_tables.php191
-rw-r--r--src/usr/local/www/diag_testport.php290
-rw-r--r--src/usr/local/www/diag_traceroute.php218
-rw-r--r--src/usr/local/www/easyrule.php89
-rw-r--r--src/usr/local/www/edit.php254
-rw-r--r--src/usr/local/www/exec.php355
-rwxr-xr-xsrc/usr/local/www/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/fbegin.inc459
-rwxr-xr-xsrc/usr/local/www/fend.inc27
-rw-r--r--src/usr/local/www/filebrowser/browser.js48
-rw-r--r--src/usr/local/www/filebrowser/browser.php165
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_code.gifbin0 -> 610 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_database.gifbin0 -> 621 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_doc.gifbin0 -> 1061 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_flash.gifbin0 -> 627 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_generic.gifbin0 -> 1068 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_image.gifbin0 -> 608 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_js.gifbin0 -> 1077 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_pdf.gifbin0 -> 603 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_php.gifbin0 -> 603 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_ppt.gifbin0 -> 1071 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_system.gifbin0 -> 601 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_xls.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/file_zip.gifbin0 -> 612 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/folder_generic.gifbin0 -> 996 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/icon_cancel.gifbin0 -> 1024 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/icon_contract.gifbin0 -> 599 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/icon_expand.gifbin0 -> 613 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/icon_home.gifbin0 -> 1027 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/icon_left.gifbin0 -> 306 bytes
-rwxr-xr-xsrc/usr/local/www/filebrowser/images/icon_magnifier.gifbin0 -> 568 bytes
-rw-r--r--src/usr/local/www/firewall_aliases.php311
-rwxr-xr-xsrc/usr/local/www/firewall_aliases_edit.php890
-rwxr-xr-xsrc/usr/local/www/firewall_aliases_import.php246
-rw-r--r--src/usr/local/www/firewall_nat.php399
-rw-r--r--src/usr/local/www/firewall_nat_1to1.php371
-rw-r--r--src/usr/local/www/firewall_nat_1to1_edit.php592
-rw-r--r--src/usr/local/www/firewall_nat_edit.php1016
-rw-r--r--src/usr/local/www/firewall_nat_npt.php195
-rw-r--r--src/usr/local/www/firewall_nat_npt_edit.php311
-rw-r--r--src/usr/local/www/firewall_nat_out.php695
-rw-r--r--src/usr/local/www/firewall_nat_out_edit.php905
-rw-r--r--src/usr/local/www/firewall_rules.php944
-rw-r--r--src/usr/local/www/firewall_rules_edit.php1946
-rw-r--r--src/usr/local/www/firewall_schedule.php255
-rw-r--r--src/usr/local/www/firewall_schedule_edit.php1151
-rw-r--r--src/usr/local/www/firewall_shaper.php486
-rw-r--r--src/usr/local/www/firewall_shaper_layer7.php584
-rw-r--r--src/usr/local/www/firewall_shaper_queues.php244
-rw-r--r--src/usr/local/www/firewall_shaper_vinterface.php475
-rw-r--r--src/usr/local/www/firewall_shaper_wizards.php146
-rw-r--r--src/usr/local/www/firewall_virtual_ip.php373
-rw-r--r--src/usr/local/www/firewall_virtual_ip_edit.php572
-rw-r--r--src/usr/local/www/getserviceproviders.php150
-rw-r--r--src/usr/local/www/getstats.php50
-rwxr-xr-xsrc/usr/local/www/graph.php408
-rw-r--r--src/usr/local/www/graph_cpu.php211
-rwxr-xr-xsrc/usr/local/www/green_dot.jpgbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/gui.css363
-rw-r--r--src/usr/local/www/guiconfig.inc1252
-rwxr-xr-xsrc/usr/local/www/halt.php77
-rwxr-xr-xsrc/usr/local/www/head.inc120
-rw-r--r--src/usr/local/www/headjs.php186
-rw-r--r--src/usr/local/www/help.php377
-rw-r--r--src/usr/local/www/ifstats.php66
-rw-r--r--src/usr/local/www/includes/functions.inc.php407
-rw-r--r--src/usr/local/www/index.php799
-rw-r--r--src/usr/local/www/interfaces.php3882
-rw-r--r--src/usr/local/www/interfaces_assign.php597
-rw-r--r--src/usr/local/www/interfaces_bridge.php179
-rw-r--r--src/usr/local/www/interfaces_bridge_edit.php708
-rw-r--r--src/usr/local/www/interfaces_gif.php162
-rw-r--r--src/usr/local/www/interfaces_gif_edit.php272
-rw-r--r--src/usr/local/www/interfaces_gre.php158
-rw-r--r--src/usr/local/www/interfaces_gre_edit.php262
-rw-r--r--src/usr/local/www/interfaces_groups.php171
-rw-r--r--src/usr/local/www/interfaces_groups_edit.php378
-rw-r--r--src/usr/local/www/interfaces_lagg.php169
-rw-r--r--src/usr/local/www/interfaces_lagg_edit.php278
-rw-r--r--src/usr/local/www/interfaces_ppps.php159
-rw-r--r--src/usr/local/www/interfaces_ppps_edit.php903
-rw-r--r--src/usr/local/www/interfaces_qinq.php181
-rw-r--r--src/usr/local/www/interfaces_qinq_edit.php444
-rw-r--r--src/usr/local/www/interfaces_vlan.php165
-rw-r--r--src/usr/local/www/interfaces_vlan_edit.php236
-rw-r--r--src/usr/local/www/interfaces_wireless.php160
-rw-r--r--src/usr/local/www/interfaces_wireless_edit.php230
-rw-r--r--src/usr/local/www/javascript/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/base64.js142
-rw-r--r--src/usr/local/www/javascript/carp_status/carp_status.js5
-rw-r--r--src/usr/local/www/javascript/chosen/chosen-sprite.pngbin0 -> 1866 bytes
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.css317
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.jquery.js755
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.jquery.min.js9
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.proto.js765
-rw-r--r--src/usr/local/www/javascript/chosen/chosen.proto.min.js9
-rw-r--r--src/usr/local/www/javascript/chosen/coffee/chosen.jquery.coffee633
-rw-r--r--src/usr/local/www/javascript/chosen/coffee/chosen.proto.coffee629
-rw-r--r--src/usr/local/www/javascript/datepicker/css/datepicker.css178
-rw-r--r--src/usr/local/www/javascript/datepicker/js/blank.html6
-rw-r--r--src/usr/local/www/javascript/datepicker/js/datepicker.js1111
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/bg_header.jpgbin0 -> 1792 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/bullet1.gifbin0 -> 55 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/bullet2.gifbin0 -> 262 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/cal.gifbin0 -> 127 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/datepicker/media/gradient-e5e5e5-ffffff.gifbin0 -> 526 bytes
-rw-r--r--src/usr/local/www/javascript/domTT/LICENSE202
-rw-r--r--src/usr/local/www/javascript/domTT/behaviour.js254
-rw-r--r--src/usr/local/www/javascript/domTT/domLib.js706
-rw-r--r--src/usr/local/www/javascript/domTT/domTT.js1132
-rw-r--r--src/usr/local/www/javascript/domTT/fadomatic.js180
-rw-r--r--src/usr/local/www/javascript/filter_log.js168
-rw-r--r--src/usr/local/www/javascript/firebug-lite.js1000
-rw-r--r--src/usr/local/www/javascript/firewall_nat_edit/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/firewall_nat_edit/disablekeys.js6
-rw-r--r--src/usr/local/www/javascript/firewall_nat_edit/firewall_nat_edit.js203
-rw-r--r--src/usr/local/www/javascript/firewall_nat_edit/suggestions.js33
-rw-r--r--src/usr/local/www/javascript/firewall_rules_edit/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/firewall_rules_edit/disablekeys.js6
-rw-r--r--src/usr/local/www/javascript/firewall_rules_edit/firewall_rules_edit.js237
-rw-r--r--src/usr/local/www/javascript/firewall_rules_edit/suggestions.js33
-rw-r--r--src/usr/local/www/javascript/firewall_shaper_edit/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/firewall_shaper_edit/disablekeys.js6
-rw-r--r--src/usr/local/www/javascript/firewall_shaper_edit/firewall_shaper_edit.js37
-rw-r--r--src/usr/local/www/javascript/firewall_shaper_edit/suggestions.js33
-rw-r--r--src/usr/local/www/javascript/global.js43
-rw-r--r--src/usr/local/www/javascript/index/ajax.js196
-rw-r--r--src/usr/local/www/javascript/interfaces_ppps_edit/ppps_edit.js253
-rw-r--r--src/usr/local/www/javascript/jquery-1.11.1.min.js4
-rw-r--r--src/usr/local/www/javascript/jquery-migrate-1.2.1.min.js2
-rw-r--r--src/usr/local/www/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css7
-rw-r--r--src/usr/local/www/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js1326
-rwxr-xr-xsrc/usr/local/www/javascript/jquery.ipv4v6ify.js140
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_18_b81900_40x40.pngbin0 -> 260 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_20_666666_40x40.pngbin0 -> 251 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.pngbin0 -> 180 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.pngbin0 -> 180 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_10_000000_40x100.pngbin0 -> 178 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.pngbin0 -> 213 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.pngbin0 -> 180 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f6f6f6_1x400.pngbin0 -> 104 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.pngbin0 -> 105 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_100_fdf5ce_1x400.pngbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.pngbin0 -> 109 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.pngbin0 -> 110 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_glass_65_ffffff_1x400.pngbin0 -> 105 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_gloss-wave_35_f6a828_500x100.pngbin0 -> 3762 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_100_eeeeee_1x100.pngbin0 -> 90 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_75_ffe45c_1x100.pngbin0 -> 129 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.pngbin0 -> 114 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.pngbin0 -> 96 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_222222_256x240.pngbin0 -> 4369 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_228ef1_256x240.pngbin0 -> 4369 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_3383bb_256x240.pngbin0 -> 4369 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_454545_256x240.pngbin0 -> 4369 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_70b2e1_256x240.pngbin0 -> 4369 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_999999_256x240.pngbin0 -> 4369 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_ef8c08_256x240.pngbin0 -> 4369 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_fbc856_256x240.pngbin0 -> 5355 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_ffd27a_256x240.pngbin0 -> 4369 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/jquery/images/ui-icons_ffffff_256x240.pngbin0 -> 4369 bytes
-rw-r--r--src/usr/local/www/javascript/jquery/jquery-ui-1.11.1.min.js13
-rw-r--r--src/usr/local/www/javascript/load_balancer_pool_edit/pool.js191
-rw-r--r--src/usr/local/www/javascript/load_balancer_relay_protocol_edit/load_balancer_relay_protocol_edit.js56
-rw-r--r--src/usr/local/www/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/javascript/numericupdown/css/numericupdown.css40
-rwxr-xr-xsrc/usr/local/www/javascript/numericupdown/images/down.gifbin0 -> 60 bytes
-rwxr-xr-xsrc/usr/local/www/javascript/numericupdown/images/up.gifbin0 -> 60 bytes
-rw-r--r--src/usr/local/www/javascript/numericupdown/js/numericupdown.js287
-rw-r--r--src/usr/local/www/javascript/pi.js682
-rw-r--r--src/usr/local/www/javascript/row_helper.js97
-rw-r--r--src/usr/local/www/javascript/row_helper_dynamic.js98
-rw-r--r--src/usr/local/www/javascript/row_toggle.js66
-rw-r--r--src/usr/local/www/javascript/scriptaculous/builder.js136
-rw-r--r--src/usr/local/www/javascript/scriptaculous/controls.js965
-rw-r--r--src/usr/local/www/javascript/scriptaculous/dragdrop.js974
-rw-r--r--src/usr/local/www/javascript/scriptaculous/effects.js1123
-rw-r--r--src/usr/local/www/javascript/scriptaculous/prototype.js6079
-rw-r--r--src/usr/local/www/javascript/scriptaculous/scriptaculous.js68
-rw-r--r--src/usr/local/www/javascript/scriptaculous/slider.js275
-rw-r--r--src/usr/local/www/javascript/scriptaculous/sound.js59
-rw-r--r--src/usr/local/www/javascript/scriptaculous/unittest.js568
-rw-r--r--src/usr/local/www/javascript/sorttable.js584
-rw-r--r--src/usr/local/www/javascript/suggestions.js33
-rw-r--r--src/usr/local/www/javascript/ticker.js73
-rw-r--r--src/usr/local/www/javascript/wizard/autosuggest.js337
-rw-r--r--src/usr/local/www/javascript/wizard/disablekeys.js6
-rw-r--r--src/usr/local/www/javascript/wizard/suggestions.js33
-rw-r--r--src/usr/local/www/license.php133
-rw-r--r--src/usr/local/www/load_balancer_monitor.php138
-rw-r--r--src/usr/local/www/load_balancer_monitor_edit.php390
-rw-r--r--src/usr/local/www/load_balancer_pool.php159
-rw-r--r--src/usr/local/www/load_balancer_pool_edit.php368
-rw-r--r--src/usr/local/www/load_balancer_setting.php173
-rw-r--r--src/usr/local/www/load_balancer_virtual_server.php152
-rw-r--r--src/usr/local/www/load_balancer_virtual_server_edit.php315
-rwxr-xr-xsrc/usr/local/www/logobig.jpgbin0 -> 7540 bytes
-rwxr-xr-xsrc/usr/local/www/niftycssCode.css21
-rwxr-xr-xsrc/usr/local/www/niftycssprintCode.css1
-rwxr-xr-xsrc/usr/local/www/pkg.php582
-rw-r--r--src/usr/local/www/pkg_edit.php1267
-rw-r--r--src/usr/local/www/pkg_mgr.php221
-rw-r--r--src/usr/local/www/pkg_mgr_install.php323
-rw-r--r--src/usr/local/www/pkg_mgr_installed.php259
-rw-r--r--src/usr/local/www/pkg_mgr_settings.php163
-rw-r--r--src/usr/local/www/protochart/ProtoChart.js2653
-rw-r--r--src/usr/local/www/protochart/excanvas-compressed.js19
-rw-r--r--src/usr/local/www/protochart/excanvas.js785
-rwxr-xr-xsrc/usr/local/www/reboot.php72
-rw-r--r--src/usr/local/www/restart_httpd.php68
-rw-r--r--src/usr/local/www/services_captiveportal.php1253
-rw-r--r--src/usr/local/www/services_captiveportal_filemanager.php267
-rw-r--r--src/usr/local/www/services_captiveportal_hostname.php232
-rw-r--r--src/usr/local/www/services_captiveportal_hostname_edit.php244
-rw-r--r--src/usr/local/www/services_captiveportal_ip.php208
-rw-r--r--src/usr/local/www/services_captiveportal_ip_edit.php253
-rw-r--r--src/usr/local/www/services_captiveportal_mac.php244
-rw-r--r--src/usr/local/www/services_captiveportal_mac_edit.php270
-rw-r--r--src/usr/local/www/services_captiveportal_vouchers.php715
-rw-r--r--src/usr/local/www/services_captiveportal_vouchers_edit.php230
-rw-r--r--src/usr/local/www/services_captiveportal_zones.php154
-rw-r--r--src/usr/local/www/services_captiveportal_zones_edit.php124
-rw-r--r--src/usr/local/www/services_dhcp.php1442
-rw-r--r--src/usr/local/www/services_dhcp_edit.php625
-rw-r--r--src/usr/local/www/services_dhcp_relay.php216
-rw-r--r--src/usr/local/www/services_dhcpv6.php995
-rw-r--r--src/usr/local/www/services_dhcpv6_edit.php285
-rw-r--r--src/usr/local/www/services_dhcpv6_relay.php216
-rw-r--r--src/usr/local/www/services_dnsmasq.php582
-rw-r--r--src/usr/local/www/services_dnsmasq_domainoverride_edit.php197
-rw-r--r--src/usr/local/www/services_dnsmasq_edit.php345
-rw-r--r--src/usr/local/www/services_dyndns.php229
-rw-r--r--src/usr/local/www/services_dyndns_edit.php485
-rw-r--r--src/usr/local/www/services_igmpproxy.php189
-rw-r--r--src/usr/local/www/services_igmpproxy_edit.php312
-rw-r--r--src/usr/local/www/services_ntpd.php462
-rw-r--r--src/usr/local/www/services_ntpd_gps.php619
-rw-r--r--src/usr/local/www/services_ntpd_pps.php251
-rw-r--r--src/usr/local/www/services_rfc2136.php206
-rw-r--r--src/usr/local/www/services_rfc2136_edit.php276
-rw-r--r--src/usr/local/www/services_router_advertisements.php480
-rw-r--r--src/usr/local/www/services_snmp.php443
-rw-r--r--src/usr/local/www/services_unbound.php626
-rw-r--r--src/usr/local/www/services_unbound_acls.php421
-rw-r--r--src/usr/local/www/services_unbound_advanced.php469
-rw-r--r--src/usr/local/www/services_unbound_domainoverride_edit.php183
-rw-r--r--src/usr/local/www/services_unbound_host_edit.php337
-rw-r--r--src/usr/local/www/services_wol.php233
-rw-r--r--src/usr/local/www/services_wol_edit.php180
-rw-r--r--src/usr/local/www/shortcuts.inc289
-rw-r--r--src/usr/local/www/shortcuts/pkg_upnp.inc11
-rw-r--r--src/usr/local/www/stats.php46
-rwxr-xr-xsrc/usr/local/www/status.php281
-rw-r--r--src/usr/local/www/status_captiveportal.php260
-rw-r--r--src/usr/local/www/status_captiveportal_expire.php126
-rw-r--r--src/usr/local/www/status_captiveportal_test.php128
-rw-r--r--src/usr/local/www/status_captiveportal_voucher_rolls.php147
-rw-r--r--src/usr/local/www/status_captiveportal_vouchers.php150
-rw-r--r--src/usr/local/www/status_dhcp_leases.php457
-rw-r--r--src/usr/local/www/status_dhcpv6_leases.php581
-rw-r--r--src/usr/local/www/status_filter_reload.php179
-rwxr-xr-xsrc/usr/local/www/status_gateway_groups.php173
-rw-r--r--src/usr/local/www/status_gateways.php169
-rw-r--r--src/usr/local/www/status_graph.php352
-rw-r--r--src/usr/local/www/status_graph_cpu.php55
-rw-r--r--src/usr/local/www/status_interfaces.php607
-rw-r--r--src/usr/local/www/status_lb_pool.php231
-rw-r--r--src/usr/local/www/status_lb_vs.php158
-rw-r--r--src/usr/local/www/status_ntpd.php320
-rw-r--r--src/usr/local/www/status_openvpn.php443
-rw-r--r--src/usr/local/www/status_queues.php310
-rw-r--r--src/usr/local/www/status_rrd_graph.php834
-rw-r--r--src/usr/local/www/status_rrd_graph_img.php1278
-rw-r--r--src/usr/local/www/status_rrd_graph_settings.php316
-rwxr-xr-xsrc/usr/local/www/status_services.php135
-rw-r--r--src/usr/local/www/status_upnp.php130
-rw-r--r--src/usr/local/www/status_wireless.php201
-rw-r--r--src/usr/local/www/system.php565
-rw-r--r--src/usr/local/www/system_advanced_admin.php657
-rw-r--r--src/usr/local/www/system_advanced_firewall.php807
-rw-r--r--src/usr/local/www/system_advanced_misc.php738
-rw-r--r--src/usr/local/www/system_advanced_network.php320
-rw-r--r--src/usr/local/www/system_advanced_notifications.php413
-rw-r--r--src/usr/local/www/system_advanced_sysctl.php305
-rw-r--r--src/usr/local/www/system_authservers.php912
-rw-r--r--src/usr/local/www/system_camanager.php770
-rw-r--r--src/usr/local/www/system_certmanager.php1349
-rw-r--r--src/usr/local/www/system_crlmanager.php722
-rw-r--r--src/usr/local/www/system_firmware.php343
-rwxr-xr-xsrc/usr/local/www/system_firmware_auto.php296
-rw-r--r--src/usr/local/www/system_firmware_check.php206
-rw-r--r--src/usr/local/www/system_firmware_restorefullbackup.php220
-rw-r--r--src/usr/local/www/system_firmware_settings.php318
-rw-r--r--src/usr/local/www/system_gateway_groups.php235
-rw-r--r--src/usr/local/www/system_gateway_groups_edit.php378
-rw-r--r--src/usr/local/www/system_gateways.php436
-rw-r--r--src/usr/local/www/system_gateways_edit.php950
-rw-r--r--src/usr/local/www/system_groupmanager.php607
-rw-r--r--src/usr/local/www/system_groupmanager_addprivs.php255
-rwxr-xr-xsrc/usr/local/www/system_hasync.php365
-rw-r--r--src/usr/local/www/system_routes.php407
-rw-r--r--src/usr/local/www/system_routes_edit.php445
-rw-r--r--src/usr/local/www/system_usermanager.php1040
-rw-r--r--src/usr/local/www/system_usermanager_addprivs.php220
-rw-r--r--src/usr/local/www/system_usermanager_passwordmg.php155
-rw-r--r--src/usr/local/www/system_usermanager_settings.php185
-rw-r--r--src/usr/local/www/system_usermanager_settings_ldapacpicker.php131
-rwxr-xr-xsrc/usr/local/www/system_usermanager_settings_test.php134
-rw-r--r--src/usr/local/www/themes/_corporate/all.css1209
-rw-r--r--src/usr/local/www/themes/_corporate/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/_corporate/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/alert_bgr.gifbin0 -> 3415 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/footer.gifbin0 -> 5630 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/header.gifbin0 -> 16536 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/help.pngbin0 -> 324 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/horizontal.gifbin0 -> 460 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_3g.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_3g_inactive.gifbin0 -> 200 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_advanced.gifbin0 -> 306 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_advanced_s.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_alert.gifbin0 -> 1015 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_host.gifbin0 -> 348 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_net.gifbin0 -> 331 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_port.gifbin0 -> 346 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_url.gifbin0 -> 314 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_alias_url_reload.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_block.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_block_add.gifbin0 -> 192 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_block_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_cablenic.gifbin0 -> 91 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_cal.gifbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_cal_mo.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_carp.gifbin0 -> 352 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_carp_d.gifbin0 -> 357 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_chain.pngbin0 -> 161 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_check.gifbin0 -> 1291 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_clock_green.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_clock_grey.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_clock_red.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_close.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_configure.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_down.gifbin0 -> 1114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_down_d.gifbin0 -> 689 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_down_mo.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_e.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_e_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_error.gifbin0 -> 1312 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_exclam.gifbin0 -> 1274 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_flag_de.pngbin0 -> 114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_flag_en.pngbin0 -> 618 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_flag_es.pngbin0 -> 281 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_flag_pt_BR.pngbin0 -> 502 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_cert.pngbin0 -> 1528 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_file.pngbin0 -> 687 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_group.pngbin0 -> 748 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_host.pngbin0 -> 513 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_imp.pngbin0 -> 644 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_mail.pngbin0 -> 371 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_pwd.pngbin0 -> 620 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_search.pngbin0 -> 593 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_time.pngbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_unknown.pngbin0 -> 487 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_url.pngbin0 -> 704 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_frmfld_user.pngbin0 -> 654 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_fw-update.gifbin0 -> 43785 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_help.gifbin0 -> 1669 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_ifalias.gifbin0 -> 315 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_ifalias_d.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_import_alias.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_in_d.gifbin0 -> 190 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_info_pkg.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_interface_down.gifbin0 -> 88 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_interface_up.gifbin0 -> 87 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_left.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_left_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_left_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_log.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_log_d.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_log_s.gifbin0 -> 305 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_log_s_d.gifbin0 -> 305 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_logs.gifbin0 -> 2092 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_match.gifbin0 -> 847 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_match_d.gifbin0 -> 843 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_minus.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_open.gifbin0 -> 62 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_other.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_other_d.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_parp.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_parp_d.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_pass.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_pass_add.gifbin0 -> 183 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_pass_d.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus.gifbin0 -> 1100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_bl.gifbin0 -> 1096 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_bl_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_d.gifbin0 -> 682 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_plus_p.gifbin0 -> 1087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_d.gifbin0 -> 701 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_d.gifbin0 -> 694 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_mo.gifbin0 -> 1135 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml.gifbin0 -> 1105 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_d.gifbin0 -> 686 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_mo.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reject.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_reject_d.gifbin0 -> 193 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_right.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_restart.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_restart_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_service_running.gifbin0 -> 1390 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_start.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_start_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_service_status.gifbin0 -> 2150 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_stop.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_service_stop_d.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_service_stopped.gifbin0 -> 1695 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_services_restart_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_services_start_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_services_stop_mo.gifbin0 -> 1126 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system-group-grey.pngbin0 -> 1566 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system-group.pngbin0 -> 3128 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system-user-grey.pngbin0 -> 1107 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system-user.pngbin0 -> 2084 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_system_lock_screen.pngbin0 -> 1841 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_system_logout.pngbin0 -> 2087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_trapped.gifbin0 -> 1101 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_trapped_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_ts_rule.gifbin0 -> 194 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_ts_rule_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_up.gifbin0 -> 1116 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_up_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_up_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_wlan.gifbin0 -> 66 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_wlan_d.gifbin0 -> 100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_wol_all.gifbin0 -> 1126 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_wzd_nsaved.pngbin0 -> 512 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/icon_wzd_saved.pngbin0 -> 399 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_x.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_x_d.gifbin0 -> 680 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_x_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/icons/icon_x_p.gifbin0 -> 1090 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/in.gifbin0 -> 177 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/in_d.gifbin0 -> 190 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/out.gifbin0 -> 179 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/images/icons/out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/log.pngbin0 -> 270 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/logo.gifbin0 -> 10012 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/menu_down.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/menu_footer.gifbin0 -> 234 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/menu_right.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/metal_bgr.gifbin0 -> 734 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/metal_bgr_red.gifbin0 -> 734 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bar_blue.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bar_gray.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bar_left.gifbin0 -> 63 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bar_right.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bullet_toggle_minus.pngbin0 -> 154 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/bullet_toggle_plus.pngbin0 -> 156 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/button.gifbin0 -> 805 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/key_128.gifbin0 -> 2766 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/key_152.gifbin0 -> 2772 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/key_256.gifbin0 -> 2808 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/key_64.gifbin0 -> 2723 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/left_background.gifbin0 -> 38943 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/loader.gifbin0 -> 5971 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/loader_tab.gifbin0 -> 5852 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/logon.pngbin0 -> 27029 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_0.gifbin0 -> 2195 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_1.gifbin0 -> 3851 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_10.gifbin0 -> 10624 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_2.gifbin0 -> 4611 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_3.gifbin0 -> 5572 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_4.gifbin0 -> 7103 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_5.gifbin0 -> 8717 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_6.gifbin0 -> 9422 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_7.gifbin0 -> 9443 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_8.gifbin0 -> 10240 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/plogo_9.gifbin0 -> 10823 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/progress_bar.gifbin0 -> 44791 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/tri_c.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/tri_c_black.gifbin0 -> 69 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/tri_o.gifbin0 -> 58 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/tri_o_black.gifbin0 -> 67 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/misc/widget_loader.gifbin0 -> 1064 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/new_tab_menu.pngbin0 -> 444 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/status.pngbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/transparent.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/images/transparent_pixel.gifbin0 -> 43 bytes
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/javascript/ie7/blank.gifbin0 -> 48 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/javascript/ie7/test-trans.pngbin0 -> 106 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/_corporate/loader.js29
-rw-r--r--src/usr/local/www/themes/_corporate/new_tab_menu.css101
-rwxr-xr-xsrc/usr/local/www/themes/_corporate/new_tab_menu.pngbin0 -> 444 bytes
-rw-r--r--src/usr/local/www/themes/_corporate/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/_corporate/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/code-red/all.css1301
-rwxr-xr-xsrc/usr/local/www/themes/code-red/bottom-loader.js10
-rwxr-xr-xsrc/usr/local/www/themes/code-red/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/alert_bgr.pngbin0 -> 1407 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/background.gifbin0 -> 112090 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/background.pngbin0 -> 8502 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/button_left.gifbin0 -> 534 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/button_mid.gifbin0 -> 149 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/button_right.gifbin0 -> 333 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/footer.pngbin0 -> 25072 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/header.pngbin0 -> 43633 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/help.pngbin0 -> 324 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/horizontal.gifbin0 -> 461 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_3g.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_3g_inactive.gifbin0 -> 200 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_advanced.gifbin0 -> 306 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_advanced_s.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alert.gifbin0 -> 1015 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_host.gifbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_net.gifbin0 -> 331 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_port.gifbin0 -> 346 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_url.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_alias_url_reload.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_block.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_block_add.gifbin0 -> 192 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_block_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_cablenic.gifbin0 -> 109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_cal.gifbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_cal_mo.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_carp.gifbin0 -> 352 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_carp_d.gifbin0 -> 357 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_chain.pngbin0 -> 161 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_check.gifbin0 -> 1291 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_clock_green.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_clock_grey.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_clock_red.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_close.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_configure.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_down.gifbin0 -> 1114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_down_d.gifbin0 -> 689 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_down_mo.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_e.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_e_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_error.gifbin0 -> 1312 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_exclam.gifbin0 -> 1274 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_flag_de.pngbin0 -> 114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_flag_en.pngbin0 -> 618 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_flag_es.pngbin0 -> 281 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_flag_pt_BR.pngbin0 -> 502 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_cert.pngbin0 -> 1528 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_file.pngbin0 -> 687 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_group.pngbin0 -> 748 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_host.pngbin0 -> 513 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_imp.pngbin0 -> 644 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_mail.pngbin0 -> 371 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_pwd.pngbin0 -> 620 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_search.pngbin0 -> 593 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_time.pngbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_unknown.pngbin0 -> 487 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_url.pngbin0 -> 704 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_frmfld_user.pngbin0 -> 654 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_fw-update.gifbin0 -> 43785 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_help.gifbin0 -> 1669 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_ifalias.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_ifalias_d.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_import_alias.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_info_pkg.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_interface_down.gifbin0 -> 88 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_interface_up.gifbin0 -> 87 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_left.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_left_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_left_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_log.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_log_d.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_log_s.gifbin0 -> 305 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_log_s_d.gifbin0 -> 305 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_logs.gifbin0 -> 2092 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_match.gifbin0 -> 847 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_match_d.gifbin0 -> 843 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_minus.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_open.gifbin0 -> 62 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_other.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_other_d.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_parp.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_parp_d.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_pass.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_pass_add.gifbin0 -> 183 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_pass_d.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus.gifbin0 -> 1100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_bl.gifbin0 -> 1096 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_bl_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_d.gifbin0 -> 682 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_plus_p.gifbin0 -> 1087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_d.gifbin0 -> 701 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_d.gifbin0 -> 694 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_mo.gifbin0 -> 1135 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml.gifbin0 -> 1105 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_d.gifbin0 -> 686 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_mo.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reject.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_reject_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_right.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_restart.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_restart_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_service_running.gifbin0 -> 1390 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_start.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_start_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_service_status.gifbin0 -> 2150 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_stop.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_service_stop_d.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/code-red/images/icons/icon_service_stopped.gifbin0 -> 1695 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_services_restart_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_services_start_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_services_stop_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system-group-grey.pngbin0 -> 1566 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system-group.pngbin0 -> 3128 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system-user-grey.pngbin0 -> 1107 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system-user.pngbin0 -> 2084 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system_lock_screen.pngbin0 -> 1841 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_system_logout.pngbin0 -> 2087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_trapped.gifbin0 -> 1101 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_trapped_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_ts_rule.gifbin0 -> 194 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_ts_rule_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_up.gifbin0 -> 1116 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_up_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_up_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wlan.gifbin0 -> 66 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wlan_d.gifbin0 -> 100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wol_all.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wzd_nsaved.pngbin0 -> 512 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_wzd_saved.pngbin0 -> 399 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_x.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_x_d.gifbin0 -> 680 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_x_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/icon_x_p.gifbin0 -> 1090 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/icons/out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/log.pngbin0 -> 270 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/logo.gifbin0 -> 7555 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/logobig.jpgbin0 -> 7697 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/logon-background.gifbin0 -> 114596 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menu_down.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menu_footer.gifbin0 -> 234 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menu_right.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menubgr.pngbin0 -> 132 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menubgr_footer.pngbin0 -> 372 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/menubgr_highlight.pngbin0 -> 129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/metal_bgr.gifbin0 -> 734 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/metal_bgr_red.gifbin0 -> 734 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/background.gifbin0 -> 115138 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bar_blue.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bar_gray.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bar_left.gifbin0 -> 289 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bar_right.gifbin0 -> 288 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bullet_toggle_minus.pngbin0 -> 154 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/bullet_toggle_plus.pngbin0 -> 156 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/button.gifbin0 -> 805 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/graph.pngbin0 -> 2256 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/key_128.gifbin0 -> 2766 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/key_152.gifbin0 -> 2772 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/key_256.gifbin0 -> 2808 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/key_64.gifbin0 -> 2723 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/left_background.gifbin0 -> 38943 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/loader.gifbin0 -> 5971 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/loader_all.gifbin0 -> 1398 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/loader_filter.gifbin0 -> 1436 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/loader_tab.gifbin0 -> 5852 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/logon.pngbin0 -> 65956 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_0.gifbin0 -> 2195 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_1.gifbin0 -> 3851 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_10.gifbin0 -> 10624 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_2.gifbin0 -> 4611 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_3.gifbin0 -> 5572 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_4.gifbin0 -> 7103 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_5.gifbin0 -> 8717 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_6.gifbin0 -> 9422 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_7.gifbin0 -> 9443 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_8.gifbin0 -> 10240 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/plogo_9.gifbin0 -> 10823 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/progress_bar.gifbin0 -> 44791 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/rrd_error.pngbin0 -> 38898 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_alerter.gifbin0 -> 2203 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_carpmaster.gifbin0 -> 1558 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_left.gifbin0 -> 600 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_page_loading.gifbin0 -> 1621 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_reload_all.gifbin0 -> 1611 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_reload_filter.gifbin0 -> 1612 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/status_right.gifbin0 -> 599 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/tri_c.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/tri_c_black.gifbin0 -> 69 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/tri_o.gifbin0 -> 58 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/tri_o_black.gifbin0 -> 67 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/misc/widget_loader.gifbin0 -> 2545 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/new_tab_menu.pngbin0 -> 444 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/status.pngbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/transparent.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/images/transparent_pixel.gifbin0 -> 43 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/blank.gifbin0 -> 48 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-box-model.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-core.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-css-strict.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-css2.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-css3.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-fixed.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-html4.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite-p.js3
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-lite.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-png.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard-p.js3
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/ie7/test-trans.pngbin0 -> 106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/grey-40.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/submenu-off.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/submenu-on.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/white-90.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/img/x.gifbin0 -> 43 bytes
-rw-r--r--src/usr/local/www/themes/code-red/javascript/niftyjsCode.js174
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/transmenu-body.php53
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/transmenu-head.php87
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/transmenu.org785
-rwxr-xr-xsrc/usr/local/www/themes/code-red/javascript/transmenuC.js86
-rwxr-xr-xsrc/usr/local/www/themes/code-red/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/code-red/loader.js29
-rwxr-xr-xsrc/usr/local/www/themes/code-red/login.css1136
-rwxr-xr-xsrc/usr/local/www/themes/code-red/menu.inc177
-rw-r--r--src/usr/local/www/themes/code-red/new_tab_menu.css101
-rwxr-xr-xsrc/usr/local/www/themes/code-red/no_big_logo1
-rwxr-xr-xsrc/usr/local/www/themes/code-red/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/code-red/styles/jquery-ui-1.11.1.css1226
-rwxr-xr-xsrc/usr/local/www/themes/code-red/styles/menustyles.css44
-rwxr-xr-xsrc/usr/local/www/themes/code-red/styles/transmenu.css75
-rwxr-xr-xsrc/usr/local/www/themes/code-red/wizard.css1068
-rw-r--r--src/usr/local/www/themes/metallic/all.css1269
-rwxr-xr-xsrc/usr/local/www/themes/metallic/apple-touch-icon.pngbin0 -> 4068 bytes
-rw-r--r--src/usr/local/www/themes/metallic/bottom-loader.js10
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/alert_bgr.gifbin0 -> 3415 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/footer.gifbin0 -> 20440 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/header.gifbin0 -> 33347 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/help.pngbin0 -> 324 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/horizontal.gifbin0 -> 461 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_3g.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_3g_inactive.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_advanced.gifbin0 -> 306 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_advanced_s.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alert.gifbin0 -> 1015 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_host.gifbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_net.gifbin0 -> 331 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_port.gifbin0 -> 346 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_url.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_alias_url_reload.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_block.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_block_add.gifbin0 -> 192 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_block_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_cablenic.gifbin0 -> 91 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_cal.gifbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_cal_mo.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_carp.gifbin0 -> 352 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_carp_d.gifbin0 -> 357 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_chain.pngbin0 -> 161 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_check.gifbin0 -> 1291 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_clock_green.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_clock_grey.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_clock_red.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_close.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_configure.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_down.gifbin0 -> 1114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_down_d.gifbin0 -> 689 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_down_mo.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_e.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_e_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_error.gifbin0 -> 1312 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_exclam.gifbin0 -> 1274 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_flag_de.pngbin0 -> 114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_flag_en.pngbin0 -> 618 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_flag_es.pngbin0 -> 281 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_flag_pt_BR.pngbin0 -> 502 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_cert.pngbin0 -> 1528 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_file.pngbin0 -> 687 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_group.pngbin0 -> 748 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_host.pngbin0 -> 513 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_imp.pngbin0 -> 644 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_mail.pngbin0 -> 371 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_pwd.pngbin0 -> 620 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_search.pngbin0 -> 593 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_time.pngbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_unknown.pngbin0 -> 487 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_url.pngbin0 -> 704 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_frmfld_user.pngbin0 -> 654 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_fw-update.gifbin0 -> 43785 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_help.gifbin0 -> 1669 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_ifalias.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_ifalias_d.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_import_alias.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_info_pkg.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_interface_down.gifbin0 -> 88 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_interface_up.gifbin0 -> 87 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_left.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_left_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_left_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_log.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_log_d.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_log_s.gifbin0 -> 305 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_log_s_d.gifbin0 -> 305 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_logs.gifbin0 -> 2092 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_match.gifbin0 -> 847 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_match_d.gifbin0 -> 843 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_minus.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_open.gifbin0 -> 62 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_other.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_other_d.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_parp.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_parp_d.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_pass.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_pass_add.gifbin0 -> 183 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_pass_d.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus.gifbin0 -> 1100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_bl.gifbin0 -> 1096 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_bl_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_d.gifbin0 -> 682 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_plus_p.gifbin0 -> 1087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_d.gifbin0 -> 701 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_d.gifbin0 -> 694 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_mo.gifbin0 -> 1135 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml.gifbin0 -> 1105 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_d.gifbin0 -> 686 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_mo.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reject.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_reject_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_right.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_restart.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_restart_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_service_running.gifbin0 -> 1390 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_start.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_start_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_service_status.gifbin0 -> 2150 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_stop.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_service_stop_d.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/metallic/images/icons/icon_service_stopped.gifbin0 -> 1695 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_services_restart_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_services_start_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_services_stop_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system-group-grey.pngbin0 -> 1566 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system-group.pngbin0 -> 3128 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system-user-grey.pngbin0 -> 1107 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system-user.pngbin0 -> 2084 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system_lock_screen.pngbin0 -> 1841 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_system_logout.pngbin0 -> 2087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_trapped.gifbin0 -> 1101 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_trapped_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_ts_rule.gifbin0 -> 194 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_ts_rule_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_up.gifbin0 -> 1116 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_up_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_up_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wlan.gifbin0 -> 66 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wlan_d.gifbin0 -> 100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wol_all.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wzd_nsaved.pngbin0 -> 512 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_wzd_saved.pngbin0 -> 399 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_x.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_x_d.gifbin0 -> 680 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_x_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/icon_x_p.gifbin0 -> 1090 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/icons/out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/log.pngbin0 -> 270 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/logo.gifbin0 -> 10012 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/logobig.jpgbin0 -> 7540 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/menu_down.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/menu_footer.gifbin0 -> 234 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/menu_right.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/metal_bgr.gifbin0 -> 734 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/metal_bgr_red.gifbin0 -> 734 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bar_blue.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bar_gray.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bar_left.gifbin0 -> 289 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bar_right.gifbin0 -> 288 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bullet_toggle_minus.pngbin0 -> 154 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/bullet_toggle_plus.pngbin0 -> 156 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/button.gifbin0 -> 805 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/graph.pngbin0 -> 2256 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/key_128.gifbin0 -> 2766 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/key_152.gifbin0 -> 2772 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/key_256.gifbin0 -> 2808 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/key_64.gifbin0 -> 2723 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/left_background.gifbin0 -> 38943 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/loader.gifbin0 -> 5971 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/loader_all.gifbin0 -> 1398 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/loader_filter.gifbin0 -> 1436 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/loader_tab.gifbin0 -> 5852 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/logon.pngbin0 -> 27029 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/progress_bar.gifbin0 -> 44791 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/rrd_error.pngbin0 -> 38898 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_alerter.gifbin0 -> 2203 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_carpmaster.gifbin0 -> 1558 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_left.gifbin0 -> 600 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_page_loading.gifbin0 -> 1621 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_reload_all.gifbin0 -> 1611 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_reload_filter.gifbin0 -> 1612 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/status_right.gifbin0 -> 599 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/tri_c.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/tri_c_black.gifbin0 -> 84 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/tri_o.gifbin0 -> 58 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/tri_o_black.gifbin0 -> 82 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/misc/widget_loader.gifbin0 -> 1064 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/new_tab_menu.pngbin0 -> 444 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/status.pngbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/transparent.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/images/transparent_pixel.gifbin0 -> 43 bytes
-rwxr-xr-xsrc/usr/local/www/themes/metallic/javascript/ie7/blank.gifbin0 -> 48 bytes
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/metallic/javascript/ie7/test-trans.pngbin0 -> 106 bytes
-rw-r--r--src/usr/local/www/themes/metallic/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/metallic/loader.js29
-rw-r--r--src/usr/local/www/themes/metallic/login.css1127
-rw-r--r--src/usr/local/www/themes/metallic/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/metallic/no_big_logo1
-rw-r--r--src/usr/local/www/themes/metallic/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/metallic/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/nervecenter/all.css1301
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/apple-touch-icon.pngbin0 -> 4068 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/nervecenter/favicon.icobin0 -> 1406 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/alert_bgr.pngbin0 -> 10240 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/background.gifbin0 -> 44574 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/background.pngbin0 -> 8502 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/footer.pngbin0 -> 41755 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/header.pngbin0 -> 49602 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/help.pngbin0 -> 324 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/horizontal.gifbin0 -> 461 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_3g.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_3g_inactive.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_advanced.gifbin0 -> 306 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_advanced_s.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alert.gifbin0 -> 1015 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_host.gifbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_net.gifbin0 -> 331 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_port.gifbin0 -> 346 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_url.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_alias_url_reload.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_block.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_block_add.gifbin0 -> 192 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_block_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_cablenic.gifbin0 -> 91 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_cal.gifbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_cal_mo.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_carp.gifbin0 -> 352 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_carp_d.gifbin0 -> 357 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_chain.pngbin0 -> 161 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_check.gifbin0 -> 1291 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_clock_green.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_clock_grey.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_clock_red.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_close.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_configure.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_down.gifbin0 -> 1114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_down_d.gifbin0 -> 689 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_down_mo.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_e.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_e_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_error.gifbin0 -> 1312 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_exclam.gifbin0 -> 1274 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_flag_de.pngbin0 -> 114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_flag_en.pngbin0 -> 618 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_flag_es.pngbin0 -> 281 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_flag_pt_BR.pngbin0 -> 502 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_cert.pngbin0 -> 1528 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_file.pngbin0 -> 687 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_group.pngbin0 -> 748 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_host.pngbin0 -> 513 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_imp.pngbin0 -> 644 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_mail.pngbin0 -> 371 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_pwd.pngbin0 -> 620 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_search.pngbin0 -> 593 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_time.pngbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_unknown.pngbin0 -> 487 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_url.pngbin0 -> 704 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_user.pngbin0 -> 654 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_fw-update.gifbin0 -> 43785 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_help.gifbin0 -> 1669 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_ifalias.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_ifalias_d.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_import_alias.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_info_pkg.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_interface_down.gifbin0 -> 88 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_interface_up.gifbin0 -> 87 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_left.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_left_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_left_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_log.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_log_d.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_log_s.gifbin0 -> 305 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_log_s_d.gifbin0 -> 305 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_logs.gifbin0 -> 2092 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_match.gifbin0 -> 847 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_match_d.gifbin0 -> 843 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_minus.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_open.gifbin0 -> 62 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_other.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_other_d.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_parp.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_parp_d.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_pass.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_pass_add.gifbin0 -> 183 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_pass_d.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus.gifbin0 -> 1100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl.gifbin0 -> 1096 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_d.gifbin0 -> 682 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_plus_p.gifbin0 -> 1087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_d.gifbin0 -> 701 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_d.gifbin0 -> 694 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_mo.gifbin0 -> 1135 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml.gifbin0 -> 1105 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_d.gifbin0 -> 686 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_mo.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reject.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_reject_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_right.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_restart.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_restart_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_service_running.gifbin0 -> 1390 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_start.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_start_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_service_status.gifbin0 -> 2150 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_stop.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_service_stop_d.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/images/icons/icon_service_stopped.gifbin0 -> 1695 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_services_restart_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_services_start_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_services_stop_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system-group-grey.pngbin0 -> 1566 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system-group.pngbin0 -> 3128 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system-user-grey.pngbin0 -> 1107 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system-user.pngbin0 -> 2084 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system_lock_screen.pngbin0 -> 1841 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_system_logout.pngbin0 -> 2087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_trapped.gifbin0 -> 1101 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_trapped_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule.gifbin0 -> 194 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_up.gifbin0 -> 1116 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_up_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_up_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wlan.gifbin0 -> 66 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wlan_d.gifbin0 -> 100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wol_all.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wzd_nsaved.pngbin0 -> 512 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_wzd_saved.pngbin0 -> 399 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_x.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_x_d.gifbin0 -> 680 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_x_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/icon_x_p.gifbin0 -> 1090 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/icons/out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/log.pngbin0 -> 270 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/logo.gifbin0 -> 7599 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/logobig.jpgbin0 -> 7540 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/menu_down.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/menu_footer.gifbin0 -> 234 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/menu_right.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/metal_bgr.gifbin0 -> 734 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/metal_bgr_red.gifbin0 -> 734 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bar_blue.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bar_gray.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bar_left.gifbin0 -> 289 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bar_right.gifbin0 -> 288 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_minus.pngbin0 -> 154 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_plus.pngbin0 -> 156 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/button.gifbin0 -> 805 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/graph.pngbin0 -> 2256 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/key_128.gifbin0 -> 2766 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/key_152.gifbin0 -> 2772 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/key_256.gifbin0 -> 2808 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/key_64.gifbin0 -> 2723 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/left_background.gifbin0 -> 38943 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/loader.gifbin0 -> 5971 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/loader_all.gifbin0 -> 1398 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/loader_filter.gifbin0 -> 1436 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/loader_tab.gifbin0 -> 5852 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/logon.pngbin0 -> 47467 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/progress_bar.gifbin0 -> 44791 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/rrd_error.pngbin0 -> 38898 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_alerter.gifbin0 -> 2203 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_carpmaster.gifbin0 -> 1558 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_left.gifbin0 -> 600 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_page_loading.gifbin0 -> 1621 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_reload_all.gifbin0 -> 1611 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_reload_filter.gifbin0 -> 1612 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/status_right.gifbin0 -> 599 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/tri_c.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/tri_c_black.gifbin0 -> 69 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/tri_o.gifbin0 -> 58 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/tri_o_black.gifbin0 -> 67 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/misc/widget_loader.gifbin0 -> 2545 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/new_tab_menu.pngbin0 -> 444 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/status.pngbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/transparent.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/images/transparent_pixel.gifbin0 -> 43 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/ie7/blank.gifbin0 -> 48 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/ie7/test-trans.pngbin0 -> 106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/grey-40.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/submenu-off.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/submenu-on.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/white-90.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/nervecenter/javascript/img/x.gifbin0 -> 43 bytes
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/transmenu-body.php51
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/transmenu-head.php85
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/transmenu.org785
-rw-r--r--src/usr/local/www/themes/nervecenter/javascript/transmenuC.js86
-rw-r--r--src/usr/local/www/themes/nervecenter/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/nervecenter/loader.js29
-rw-r--r--src/usr/local/www/themes/nervecenter/login.css1127
-rw-r--r--src/usr/local/www/themes/nervecenter/menu.inc177
-rw-r--r--src/usr/local/www/themes/nervecenter/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/nervecenter/no_big_logo1
-rw-r--r--src/usr/local/www/themes/nervecenter/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/nervecenter/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/nervecenter/styles/menustyles.css44
-rw-r--r--src/usr/local/www/themes/nervecenter/styles/transmenu.css75
-rw-r--r--src/usr/local/www/themes/nervecenter/wizard.css1060
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/all.css1028
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/apple-touch-icon.pngbin0 -> 4068 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/bottom-loader.js11
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/alert_bgr.gifbin0 -> 1651 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/header-alert.gifbin0 -> 4910 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/header.gifbin0 -> 7932 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/help.pngbin0 -> 324 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g_inactive.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced.gifbin0 -> 306 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced_s.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alert.gifbin0 -> 1044 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_host.gifbin0 -> 348 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_net.gifbin0 -> 331 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_port.gifbin0 -> 346 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url.gifbin0 -> 314 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url_reload.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_add.gifbin0 -> 192 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cablenic.gifbin0 -> 91 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal.gifbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal_mo.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp.gifbin0 -> 352 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp_d.gifbin0 -> 357 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_chain.pngbin0 -> 161 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_check.gifbin0 -> 1291 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_green.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_grey.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_red.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_close.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_configure.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down.gifbin0 -> 1114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_d.gifbin0 -> 689 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_mo.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_error.gifbin0 -> 1312 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_exclam.gifbin0 -> 1274 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_de.pngbin0 -> 114 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_en.pngbin0 -> 618 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_es.pngbin0 -> 281 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_pt_BR.pngbin0 -> 502 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_cert.pngbin0 -> 1528 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_file.pngbin0 -> 687 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_group.pngbin0 -> 748 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_host.pngbin0 -> 513 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_imp.pngbin0 -> 644 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_mail.pngbin0 -> 371 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_pwd.pngbin0 -> 620 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_search.pngbin0 -> 593 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_time.pngbin0 -> 646 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_unknown.pngbin0 -> 487 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_url.pngbin0 -> 704 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_user.pngbin0 -> 654 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_fw-update.gifbin0 -> 43785 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_help.gifbin0 -> 1669 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias.gifbin0 -> 315 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias_d.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_import_alias.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in_d.gifbin0 -> 190 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_info_pkg.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_down.gifbin0 -> 88 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_up.gifbin0 -> 87 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_d.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s.gifbin0 -> 305 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s_d.gifbin0 -> 305 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_logs.gifbin0 -> 2092 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match.gifbin0 -> 847 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match_d.gifbin0 -> 843 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_minus.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_open.gifbin0 -> 62 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other_d.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp_d.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_add.gifbin0 -> 183 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_d.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl.gifbin0 -> 1096 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_d.gifbin0 -> 682 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_mo.gifbin0 -> 1120 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_p.gifbin0 -> 1087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_d.gifbin0 -> 701 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_d.gifbin0 -> 694 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_mo.gifbin0 -> 1135 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml.gifbin0 -> 1105 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_d.gifbin0 -> 686 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_mo.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_right.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_running.gifbin0 -> 1390 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_status.gifbin0 -> 2150 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop_d.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stopped.gifbin0 -> 1695 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_restart_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_start_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_stop_mo.gifbin0 -> 1126 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group-grey.pngbin0 -> 1566 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group.pngbin0 -> 3128 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user-grey.pngbin0 -> 1107 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user.pngbin0 -> 2084 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_lock_screen.pngbin0 -> 1841 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_logout.pngbin0 -> 2087 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped.gifbin0 -> 1101 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule.gifbin0 -> 194 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up.gifbin0 -> 1116 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan.gifbin0 -> 66 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan_d.gifbin0 -> 100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wol_all.gifbin0 -> 1114 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_nsaved.pngbin0 -> 512 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_saved.pngbin0 -> 399 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_d.gifbin0 -> 680 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_p.gifbin0 -> 1090 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/in.gifbin0 -> 177 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/in_d.gifbin0 -> 190 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/out.gifbin0 -> 179 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/images/icons/out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/log.pngbin0 -> 270 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/logo.gifbin0 -> 4878 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/logobig.jpgbin0 -> 7540 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/menu.gifbin0 -> 460 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/bar_blue.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/bar_gray.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/bar_left.gifbin0 -> 289 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/bar_right.gifbin0 -> 288 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/button.gifbin0 -> 805 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/key_128.gifbin0 -> 2766 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/key_152.gifbin0 -> 2772 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/key_256.gifbin0 -> 2808 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/key_64.gifbin0 -> 2723 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/left_background.gifbin0 -> 38943 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/loader.gifbin0 -> 5971 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/loader_tab.gifbin0 -> 5852 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/logon.pngbin0 -> 27029 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/progress_bar.gifbin0 -> 44791 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/rrd_error.pngbin0 -> 38898 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c_black.gifbin0 -> 69 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o.gifbin0 -> 58 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o_black.gifbin0 -> 67 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/misc/widget_loader.gifbin0 -> 1064 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/new_tab_menu.pngbin0 -> 444 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/status.pngbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/transparent.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/images/transparent_pixel.gifbin0 -> 43 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/javascript/ie7/blank.gifbin0 -> 48 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/pfsense-dropdown/javascript/ie7/test-trans.pngbin0 -> 106 bytes
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/loader.js29
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/login.css1127
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/pfsense-dropdown/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/pfsense/all.css1036
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/apple-touch-icon.pngbin0 -> 4068 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/bottom-loader.js12
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/alert_bgr.gifbin0 -> 1651 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/header-alert.gifbin0 -> 4910 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/header.gifbin0 -> 18510 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/help.pngbin0 -> 324 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_3g.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_3g_inactive.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_advanced.gifbin0 -> 306 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_advanced_s.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_alert.gifbin0 -> 1044 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_host.gifbin0 -> 348 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_net.gifbin0 -> 331 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_port.gifbin0 -> 346 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_url.gifbin0 -> 314 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_alias_url_reload.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_block.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_block_add.gifbin0 -> 192 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_block_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_cablenic.gifbin0 -> 91 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_cal.gifbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_cal_mo.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_carp.gifbin0 -> 352 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_carp_d.gifbin0 -> 357 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_chain.pngbin0 -> 161 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_check.gifbin0 -> 1291 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_clock_green.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_clock_grey.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_clock_red.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_close.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_configure.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_down.gifbin0 -> 1114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_down_d.gifbin0 -> 689 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_down_mo.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_e.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_e_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_error.gifbin0 -> 1312 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_exclam.gifbin0 -> 1274 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_flag_de.pngbin0 -> 114 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_flag_en.pngbin0 -> 618 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_flag_es.pngbin0 -> 281 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_flag_pt_BR.pngbin0 -> 502 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_cert.pngbin0 -> 1528 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_file.pngbin0 -> 687 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_group.pngbin0 -> 748 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_host.pngbin0 -> 513 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_imp.pngbin0 -> 644 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_mail.pngbin0 -> 371 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_pwd.pngbin0 -> 620 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_search.pngbin0 -> 593 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_time.pngbin0 -> 646 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_unknown.pngbin0 -> 487 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_url.pngbin0 -> 704 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_user.pngbin0 -> 654 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_fw-update.gifbin0 -> 43785 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_help.gifbin0 -> 1669 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_ifalias.gifbin0 -> 315 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_ifalias_d.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_import_alias.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_info_pkg.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_interface_down.gifbin0 -> 88 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_interface_up.gifbin0 -> 87 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_left.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_left_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_left_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_log.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_log_d.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_log_s.gifbin0 -> 305 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_log_s_d.gifbin0 -> 305 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_logs.gifbin0 -> 2092 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_match.gifbin0 -> 847 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_match_d.gifbin0 -> 843 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_minus.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_open.gifbin0 -> 62 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_other.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_other_d.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_parp.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_parp_d.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_pass.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_pass_add.gifbin0 -> 183 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_pass_d.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_plus.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl.gifbin0 -> 1096 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_plus_d.gifbin0 -> 682 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_plus_mo.gifbin0 -> 1120 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_plus_p.gifbin0 -> 1087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_d.gifbin0 -> 701 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_d.gifbin0 -> 694 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_mo.gifbin0 -> 1135 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml.gifbin0 -> 1105 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_d.gifbin0 -> 686 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_mo.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reject.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_reject_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_right.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_restart.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_restart_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_service_running.gifbin0 -> 1390 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_start.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_start_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_service_status.gifbin0 -> 2150 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_stop.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_service_stop_d.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_service_stopped.gifbin0 -> 1695 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_services_restart_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_services_start_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_services_stop_mo.gifbin0 -> 1126 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system-group-grey.pngbin0 -> 1566 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system-group.pngbin0 -> 3128 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system-user-grey.pngbin0 -> 1107 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system-user.pngbin0 -> 2084 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system_lock_screen.pngbin0 -> 1841 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_system_logout.pngbin0 -> 2087 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_trapped.gifbin0 -> 1101 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_trapped_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_ts_rule.gifbin0 -> 194 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_ts_rule_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_up.gifbin0 -> 1116 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_up_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_up_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_wlan.gifbin0 -> 66 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_wlan_d.gifbin0 -> 100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_wol_all.gifbin0 -> 1126 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_wzd_nsaved.pngbin0 -> 512 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/icon_wzd_saved.pngbin0 -> 399 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_x.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_x_d.gifbin0 -> 680 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_x_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/icons/icon_x_p.gifbin0 -> 1090 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/in.gifbin0 -> 177 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/in_d.gifbin0 -> 190 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/out.gifbin0 -> 179 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/images/icons/out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/log.pngbin0 -> 270 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/logo.gifbin0 -> 4878 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/logobig.jpgbin0 -> 7540 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/bar_blue.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/bar_gray.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/bar_left.gifbin0 -> 289 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/bar_right.gifbin0 -> 288 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/button.gifbin0 -> 805 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/key_128.gifbin0 -> 2766 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/key_152.gifbin0 -> 2772 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/key_256.gifbin0 -> 2808 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/key_64.gifbin0 -> 2723 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/left_background.gifbin0 -> 38943 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/loader.gifbin0 -> 5971 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/loader_tab.gifbin0 -> 5852 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/logon.pngbin0 -> 27029 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/progress_bar.gifbin0 -> 44791 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/rrd_error.pngbin0 -> 38898 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/tri_c.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/tri_c_black.gifbin0 -> 69 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/tri_o.gifbin0 -> 58 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/tri_o_black.gifbin0 -> 67 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/misc/widget_loader.gifbin0 -> 1064 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/new_tab_menu.pngbin0 -> 444 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/status.pngbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/transparent.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense/images/transparent_pixel.gifbin0 -> 43 bytes
-rw-r--r--src/usr/local/www/themes/pfsense/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/pfsense/loader.js30
-rw-r--r--src/usr/local/www/themes/pfsense/login.css1127
-rw-r--r--src/usr/local/www/themes/pfsense/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/pfsense/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/pfsense/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/pfsense_ng/all.css1414
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/apple-touch-icon.pngbin0 -> 4068 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/pfsense_ng/favicon.icobin0 -> 1406 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/alert_bgr.pngbin0 -> 2483 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/alerter.pngbin0 -> 3748 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/background.jpgbin0 -> 49431 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/footer.pngbin0 -> 2956 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/header.pngbin0 -> 4994 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/help.pngbin0 -> 324 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/horizontal.pngbin0 -> 191 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/hostname.pngbin0 -> 1899 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_3g.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_3g_inactive.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced.gifbin0 -> 306 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced_s.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alert.gifbin0 -> 1015 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_host.gifbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_net.gifbin0 -> 331 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_port.gifbin0 -> 346 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url_reload.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_block.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_block_add.gifbin0 -> 192 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_block_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_cablenic.gifbin0 -> 91 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_cal.gifbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_cal_mo.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_carp.gifbin0 -> 352 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_carp_d.gifbin0 -> 357 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_chain.pngbin0 -> 161 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_check.gifbin0 -> 1291 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_green.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_grey.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_red.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_close.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_configure.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_down.gifbin0 -> 1114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_down_d.gifbin0 -> 689 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_down_mo.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_e.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_e_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_error.gifbin0 -> 1312 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_exclam.gifbin0 -> 1274 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_de.pngbin0 -> 114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_en.pngbin0 -> 618 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_es.pngbin0 -> 281 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_pt_BR.pngbin0 -> 502 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_cert.pngbin0 -> 1528 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_file.pngbin0 -> 687 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_group.pngbin0 -> 748 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_host.pngbin0 -> 513 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_imp.pngbin0 -> 644 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_mail.pngbin0 -> 371 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_pwd.pngbin0 -> 620 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_search.pngbin0 -> 593 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_time.pngbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_unknown.pngbin0 -> 487 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_url.pngbin0 -> 704 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_user.pngbin0 -> 654 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_fw-update.gifbin0 -> 43785 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_help.gifbin0 -> 1669 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias_d.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_import_alias.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_info_pkg.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_down.gifbin0 -> 88 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_up.gifbin0 -> 87 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_left.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_left_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_left_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_log.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_log_d.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s.gifbin0 -> 305 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s_d.gifbin0 -> 305 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_logs.gifbin0 -> 2092 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_match.gifbin0 -> 847 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_match_d.gifbin0 -> 843 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_minus.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_open.gifbin0 -> 62 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_other.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_other_d.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_parp.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_parp_d.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_pass.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_add.gifbin0 -> 183 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_d.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus.gifbin0 -> 1100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl.gifbin0 -> 1096 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_d.gifbin0 -> 682 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_p.gifbin0 -> 1087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_d.gifbin0 -> 701 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_d.gifbin0 -> 694 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_mo.gifbin0 -> 1135 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml.gifbin0 -> 1105 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_d.gifbin0 -> 686 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_mo.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reject.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_reject_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_right.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_running.gifbin0 -> 1390 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_status.gifbin0 -> 2150 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop_d.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stopped.gifbin0 -> 1695 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_services_restart_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_services_start_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_services_stop_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group-grey.pngbin0 -> 1566 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group.pngbin0 -> 3128 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user-grey.pngbin0 -> 1107 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user.pngbin0 -> 2084 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system_lock_screen.pngbin0 -> 1841 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_system_logout.pngbin0 -> 2087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped.gifbin0 -> 1101 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule.gifbin0 -> 194 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_up.gifbin0 -> 1116 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_up_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_up_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan.gifbin0 -> 66 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan_d.gifbin0 -> 100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wol_all.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_nsaved.pngbin0 -> 512 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_saved.pngbin0 -> 399 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_x.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_x_d.gifbin0 -> 680 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_x_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/icon_x_p.gifbin0 -> 1090 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/icons/out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/log.pngbin0 -> 270 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/logo.gifbin0 -> 2471 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/logobig.jpgbin0 -> 7540 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/mainmenu-down.gifbin0 -> 55 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/mainmenu-right.gifbin0 -> 56 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/mainmenuitem.gifbin0 -> 54 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menu-dot.gifbin0 -> 54 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menu_footer.gifbin0 -> 234 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menu_right.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menubgr.pngbin0 -> 132 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menubgr_footer.pngbin0 -> 496 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/menubgr_highlight.pngbin0 -> 252 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bar_blue.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bar_gray.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bar_left.gifbin0 -> 289 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bar_right.gifbin0 -> 288 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_minus.pngbin0 -> 154 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_plus.pngbin0 -> 156 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/button.gifbin0 -> 805 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/graph.pngbin0 -> 2256 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/key_128.gifbin0 -> 2766 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/key_152.gifbin0 -> 2772 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/key_256.gifbin0 -> 2808 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/key_64.gifbin0 -> 2723 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/left_background.gifbin0 -> 38943 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/loader.gifbin0 -> 5971 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/loader_all.gifbin0 -> 1398 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/loader_filter.gifbin0 -> 1436 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/loader_tab.gifbin0 -> 5852 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/logon.pngbin0 -> 50494 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/progress_bar.gifbin0 -> 44791 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/rrd_error.pngbin0 -> 38898 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_alerter.gifbin0 -> 2203 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_carpmaster.gifbin0 -> 1558 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_left.gifbin0 -> 600 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_page_loading.gifbin0 -> 1621 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_reload_all.gifbin0 -> 1611 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_reload_filter.gifbin0 -> 1612 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/status_right.gifbin0 -> 599 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/tri_c.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/tri_c_black.gifbin0 -> 69 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/tri_o.gifbin0 -> 58 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/tri_o_black.gifbin0 -> 67 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/misc/widget_loader.gifbin0 -> 2545 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/new_tab_menu.pngbin0 -> 444 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/status.pngbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/transparent.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/images/transparent_pixel.gifbin0 -> 43 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/ie7/blank.gifbin0 -> 48 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/ie7/test-trans.pngbin0 -> 106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/grey-40.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/submenu-off.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/submenu-on.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/white-90.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng/javascript/img/x.gifbin0 -> 43 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/transmenu-body.php51
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/transmenu-head.php85
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/transmenu.org785
-rw-r--r--src/usr/local/www/themes/pfsense_ng/javascript/transmenuC.js86
-rw-r--r--src/usr/local/www/themes/pfsense_ng/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/pfsense_ng/loader.js36
-rw-r--r--src/usr/local/www/themes/pfsense_ng/login.css1127
-rw-r--r--src/usr/local/www/themes/pfsense_ng/menu.inc177
-rw-r--r--src/usr/local/www/themes/pfsense_ng/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/pfsense_ng/no_big_logo1
-rw-r--r--src/usr/local/www/themes/pfsense_ng/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/pfsense_ng/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/pfsense_ng/styles/menustyles.css44
-rw-r--r--src/usr/local/www/themes/pfsense_ng/styles/transmenu.css75
-rw-r--r--src/usr/local/www/themes/pfsense_ng/wizard.css1117
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/all.css1375
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/apple-touch-icon.pngbin0 -> 4068 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/favicon.icobin0 -> 1406 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/alert_bgr.pngbin0 -> 2483 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/alerter.pngbin0 -> 3748 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/background.jpgbin0 -> 49431 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/footer.pngbin0 -> 2956 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/header.pngbin0 -> 4994 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/help.pngbin0 -> 324 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/horizontal.pngbin0 -> 191 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/hostname.pngbin0 -> 1899 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g_inactive.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced.gifbin0 -> 306 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced_s.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alert.gifbin0 -> 1015 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_host.gifbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_net.gifbin0 -> 331 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_port.gifbin0 -> 346 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url_reload.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_add.gifbin0 -> 192 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cablenic.gifbin0 -> 91 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal.gifbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal_mo.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp.gifbin0 -> 352 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp_d.gifbin0 -> 357 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_chain.pngbin0 -> 161 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_check.gifbin0 -> 1291 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_green.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_grey.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_red.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_close.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_configure.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down.gifbin0 -> 1114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_d.gifbin0 -> 689 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_mo.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_error.gifbin0 -> 1312 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_exclam.gifbin0 -> 1274 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_de.pngbin0 -> 114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_en.pngbin0 -> 618 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_es.pngbin0 -> 281 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_pt_BR.pngbin0 -> 502 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_cert.pngbin0 -> 1528 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_file.pngbin0 -> 687 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_group.pngbin0 -> 748 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_host.pngbin0 -> 513 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_imp.pngbin0 -> 644 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_mail.pngbin0 -> 371 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_pwd.pngbin0 -> 620 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_search.pngbin0 -> 593 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_time.pngbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_unknown.pngbin0 -> 487 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_url.pngbin0 -> 704 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_user.pngbin0 -> 654 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_fw-update.gifbin0 -> 43785 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_help.gifbin0 -> 1669 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias_d.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_import_alias.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_info_pkg.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_down.gifbin0 -> 88 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_up.gifbin0 -> 87 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_d.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s.gifbin0 -> 305 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s_d.gifbin0 -> 305 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_logs.gifbin0 -> 2092 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match.gifbin0 -> 847 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match_d.gifbin0 -> 843 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_minus.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_open.gifbin0 -> 62 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other_d.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp_d.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_add.gifbin0 -> 183 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_d.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus.gifbin0 -> 1100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl.gifbin0 -> 1096 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_d.gifbin0 -> 682 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_p.gifbin0 -> 1087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_d.gifbin0 -> 701 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_d.gifbin0 -> 694 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_mo.gifbin0 -> 1135 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml.gifbin0 -> 1105 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_d.gifbin0 -> 686 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_mo.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_right.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_running.gifbin0 -> 1390 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_status.gifbin0 -> 2150 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop_d.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stopped.gifbin0 -> 1695 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_restart_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_start_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_stop_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group-grey.pngbin0 -> 1566 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group.pngbin0 -> 3128 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user-grey.pngbin0 -> 1107 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user.pngbin0 -> 2084 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_lock_screen.pngbin0 -> 1841 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_logout.pngbin0 -> 2087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped.gifbin0 -> 1101 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule.gifbin0 -> 194 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up.gifbin0 -> 1116 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan.gifbin0 -> 66 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan_d.gifbin0 -> 100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wol_all.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_nsaved.pngbin0 -> 512 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_saved.pngbin0 -> 399 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_d.gifbin0 -> 680 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_p.gifbin0 -> 1090 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/icons/out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/log.pngbin0 -> 270 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/logo.gifbin0 -> 2471 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/logobig.jpgbin0 -> 7540 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-down.gifbin0 -> 55 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-right.gifbin0 -> 56 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/mainmenuitem.gifbin0 -> 54 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menu-dot.gifbin0 -> 54 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menu_footer.gifbin0 -> 234 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menu_right.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menubgr.pngbin0 -> 132 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menubgr_footer.pngbin0 -> 496 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/menubgr_highlight.pngbin0 -> 252 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_blue.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_gray.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_left.gifbin0 -> 289 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_right.gifbin0 -> 288 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_minus.pngbin0 -> 154 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_plus.pngbin0 -> 156 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/button.gifbin0 -> 805 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/graph.pngbin0 -> 2256 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/key_128.gifbin0 -> 2766 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/key_152.gifbin0 -> 2772 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/key_256.gifbin0 -> 2808 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/key_64.gifbin0 -> 2723 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/left_background.gifbin0 -> 38943 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/loader.gifbin0 -> 5971 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_all.gifbin0 -> 1398 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_filter.gifbin0 -> 1436 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_tab.gifbin0 -> 5852 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/logon.pngbin0 -> 50494 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/progress_bar.gifbin0 -> 44791 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/rrd_error.pngbin0 -> 38898 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_alerter.gifbin0 -> 2203 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_carpmaster.gifbin0 -> 1558 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_left.gifbin0 -> 600 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_page_loading.gifbin0 -> 1621 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_all.gifbin0 -> 1611 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_filter.gifbin0 -> 1612 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/status_right.gifbin0 -> 599 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c_black.gifbin0 -> 69 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o.gifbin0 -> 58 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o_black.gifbin0 -> 67 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/misc/widget_loader.gifbin0 -> 2545 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/new_tab_menu.pngbin0 -> 444 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/status.pngbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/transparent.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/images/transparent_pixel.gifbin0 -> 43 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/blank.gifbin0 -> 48 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/test-trans.pngbin0 -> 106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/grey-40.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-off.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-on.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/white-90.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/pfsense_ng_fs/javascript/img/x.gifbin0 -> 43 bytes
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-body.php51
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-head.php85
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu.org785
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenuC.js86
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/loader.js294
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/login.css1127
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/menu.inc177
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/no_big_logo1
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/styles/menustyles.css44
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/styles/transmenu.css75
-rw-r--r--src/usr/local/www/themes/pfsense_ng_fs/wizard.css1117
-rw-r--r--src/usr/local/www/themes/the_wall/all.css1308
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/apple-touch-icon.pngbin0 -> 4068 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/bottom-loader.js10
-rw-r--r--src/usr/local/www/themes/the_wall/favicon.icobin0 -> 1406 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/graphlink.css43
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/alert_bgr.pngbin0 -> 12705 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/background.jpgbin0 -> 50449 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/footer.pngbin0 -> 7774 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/header.pngbin0 -> 44524 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/help.pngbin0 -> 324 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/horizontal.gifbin0 -> 461 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/horizontal.pngbin0 -> 190 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/favicon.icobin0 -> 1406 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_3g.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_3g_inactive.gifbin0 -> 200 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_advanced.gifbin0 -> 306 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_advanced_s.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alert.gifbin0 -> 1015 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_host.gifbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_net.gifbin0 -> 331 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_port.gifbin0 -> 346 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_url.gifbin0 -> 314 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_alias_url_reload.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_block.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_block_add.gifbin0 -> 192 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_block_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_cablenic.gifbin0 -> 91 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_cal.gifbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_cal_mo.gifbin0 -> 1060 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_carp.gifbin0 -> 352 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_carp_d.gifbin0 -> 357 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_chain.pngbin0 -> 161 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_check.gifbin0 -> 1291 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_clock_green.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_clock_grey.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_clock_red.gifbin0 -> 308 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_close.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_configure.gifbin0 -> 64 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_down.gifbin0 -> 1114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_down_d.gifbin0 -> 689 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_down_mo.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_e.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_e_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_error.gifbin0 -> 1312 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_exclam.gifbin0 -> 1274 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_flag_de.pngbin0 -> 114 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_flag_en.pngbin0 -> 618 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_flag_es.pngbin0 -> 281 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_flag_pt_BR.pngbin0 -> 502 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_cert.pngbin0 -> 1528 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_file.pngbin0 -> 687 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_group.pngbin0 -> 748 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_host.pngbin0 -> 513 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_imp.pngbin0 -> 644 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_mail.pngbin0 -> 371 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_pwd.pngbin0 -> 620 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_search.pngbin0 -> 593 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_time.pngbin0 -> 646 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_unknown.pngbin0 -> 487 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_url.pngbin0 -> 704 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_frmfld_user.pngbin0 -> 654 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_fw-update.gifbin0 -> 43785 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_help.gifbin0 -> 1669 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_ifalias.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_ifalias_d.gifbin0 -> 315 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_import_alias.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_info_pkg.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_interface_down.gifbin0 -> 88 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_interface_up.gifbin0 -> 87 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_left.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_left_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_left_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_log.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_log_d.gifbin0 -> 297 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_log_s.gifbin0 -> 305 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_log_s_d.gifbin0 -> 305 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_logs.gifbin0 -> 2092 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_match.gifbin0 -> 847 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_match_d.gifbin0 -> 843 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_minus.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_open.gifbin0 -> 62 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_other.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_other_d.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_parp.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_parp_d.gifbin0 -> 303 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_pass.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_pass_add.gifbin0 -> 183 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_pass_d.gifbin0 -> 182 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus.gifbin0 -> 1100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_bl.gifbin0 -> 1096 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_bl_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_d.gifbin0 -> 682 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_mo.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_plus_p.gifbin0 -> 1087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_d.gifbin0 -> 701 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg.gifbin0 -> 1109 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_d.gifbin0 -> 694 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_mo.gifbin0 -> 1135 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml.gifbin0 -> 1105 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_d.gifbin0 -> 686 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_mo.gifbin0 -> 1131 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reject.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_reject_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_right.gifbin0 -> 1117 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_restart.gifbin0 -> 1120 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_restart_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_service_running.gifbin0 -> 1390 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_start.gifbin0 -> 1119 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_start_d.gifbin0 -> 1115 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_service_status.gifbin0 -> 2150 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_stop.gifbin0 -> 1106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_service_stop_d.gifbin0 -> 1100 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/images/icons/icon_service_stopped.gifbin0 -> 1695 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_services_restart_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_services_start_mo.gifbin0 -> 1130 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_services_stop_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system-group-grey.pngbin0 -> 1566 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system-group.pngbin0 -> 3128 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system-user-grey.pngbin0 -> 1107 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system-user.pngbin0 -> 2084 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system_lock_screen.pngbin0 -> 1841 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_system_logout.pngbin0 -> 2087 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_trapped.gifbin0 -> 1101 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_trapped_p.gifbin0 -> 1079 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_ts_rule.gifbin0 -> 194 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_ts_rule_d.gifbin0 -> 193 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_up.gifbin0 -> 1116 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_up_d.gifbin0 -> 691 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_up_mo.gifbin0 -> 1129 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wlan.gifbin0 -> 66 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wlan_d.gifbin0 -> 100 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wol_all.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wzd_nsaved.pngbin0 -> 512 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_wzd_saved.pngbin0 -> 399 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_x.gifbin0 -> 1111 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_x_d.gifbin0 -> 680 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_x_mo.gifbin0 -> 1126 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/icon_x_p.gifbin0 -> 1090 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/in.gifbin0 -> 177 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/in_d.gifbin0 -> 190 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/out.gifbin0 -> 179 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/icons/out_d.gifbin0 -> 189 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/log.pngbin0 -> 270 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/logo.gifbin0 -> 7599 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/logobig.jpgbin0 -> 7540 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/menu_down.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/menu_right.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bar_blue.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bar_gray.gifbin0 -> 94 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bar_left.gifbin0 -> 289 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bar_right.gifbin0 -> 288 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bullet_toggle_minus.pngbin0 -> 154 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/bullet_toggle_plus.pngbin0 -> 156 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/button.gifbin0 -> 805 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/graph.pngbin0 -> 2256 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/key_128.gifbin0 -> 2766 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/key_152.gifbin0 -> 2772 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/key_256.gifbin0 -> 2808 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/key_64.gifbin0 -> 2723 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/loader.gifbin0 -> 2248 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/loader_all.gifbin0 -> 1398 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/loader_filter.gifbin0 -> 1436 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/loader_tab.gifbin0 -> 2248 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/logon.pngbin0 -> 22000 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/progress_bar.gifbin0 -> 44791 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/rrd_error.pngbin0 -> 38898 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_alerter.gifbin0 -> 2203 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_carpmaster.gifbin0 -> 1558 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_left.gifbin0 -> 600 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_page_loading.gifbin0 -> 1621 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_reload_all.gifbin0 -> 1611 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_reload_filter.gifbin0 -> 1612 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/status_right.gifbin0 -> 599 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/tri_c.gifbin0 -> 61 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/tri_c_black.gifbin0 -> 69 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/tri_o.gifbin0 -> 58 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/tri_o_black.gifbin0 -> 67 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/widget_loader.gifbin0 -> 2545 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/misc/widget_loader_old.gifbin0 -> 1064 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/new_tab_menu.pngbin0 -> 444 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/status.pngbin0 -> 348 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/transparent.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/images/transparent_pixel.gifbin0 -> 43 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/ie7/blank.gifbin0 -> 48 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-box-model.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-core.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css-strict.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css2.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css3.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-fixed.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-html4.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-ie5.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite-p.js3
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-png.js2
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-server.css43
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard-p.js3
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard.js2
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/ie7/test-trans.pngbin0 -> 106 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/grey-40.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/submenu-off.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/submenu-on.gifbin0 -> 65 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/white-90.pngbin0 -> 223 bytes
-rwxr-xr-xsrc/usr/local/www/themes/the_wall/javascript/img/x.gifbin0 -> 43 bytes
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/niftyjsCode.js174
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/transmenu-body.php51
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/transmenu-head.php85
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/transmenu.org785
-rw-r--r--src/usr/local/www/themes/the_wall/javascript/transmenuC.js86
-rw-r--r--src/usr/local/www/themes/the_wall/jsevents/body.def7
-rw-r--r--src/usr/local/www/themes/the_wall/loader.js30
-rw-r--r--src/usr/local/www/themes/the_wall/login.css1159
-rw-r--r--src/usr/local/www/themes/the_wall/menu.inc177
-rw-r--r--src/usr/local/www/themes/the_wall/new_tab_menu.css101
-rw-r--r--src/usr/local/www/themes/the_wall/no_big_logo1
-rw-r--r--src/usr/local/www/themes/the_wall/rrdcolors.inc.php89
-rw-r--r--src/usr/local/www/themes/the_wall/styles/jquery-ui-1.11.1.css1226
-rw-r--r--src/usr/local/www/themes/the_wall/styles/menustyles.css44
-rw-r--r--src/usr/local/www/themes/the_wall/styles/transmenu.css75
-rw-r--r--src/usr/local/www/themes/the_wall/wizard.css1060
-rwxr-xr-xsrc/usr/local/www/tree-images/empty.gifbin0 -> 837 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/join.gifbin0 -> 857 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/joinbottom.gifbin0 -> 850 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/line.gifbin0 -> 853 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/minus_.gifbin0 -> 913 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/minus_up.gifbin0 -> 911 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/page.gifbin0 -> 980 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/plus_.gifbin0 -> 910 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/plus_up.gifbin0 -> 913 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/plus_updown.gifbin0 -> 915 bytes
-rwxr-xr-xsrc/usr/local/www/tree-images/zone.gifbin0 -> 318 bytes
-rwxr-xr-xsrc/usr/local/www/tree/i-bottom.gifbin0 -> 125 bytes
-rwxr-xr-xsrc/usr/local/www/tree/i-repeater.gifbin0 -> 91 bytes
-rw-r--r--src/usr/local/www/tree/index.html228
-rwxr-xr-xsrc/usr/local/www/tree/l.gifbin0 -> 131 bytes
-rwxr-xr-xsrc/usr/local/www/tree/minus.gifbin0 -> 146 bytes
-rwxr-xr-xsrc/usr/local/www/tree/page-file.pngbin0 -> 211 bytes
-rwxr-xr-xsrc/usr/local/www/tree/page-file_play.gifbin0 -> 1021 bytes
-rwxr-xr-xsrc/usr/local/www/tree/page-file_x.gifbin0 -> 630 bytes
-rwxr-xr-xsrc/usr/local/www/tree/page-foldericon.pngbin0 -> 210 bytes
-rwxr-xr-xsrc/usr/local/www/tree/page-openfoldericon.pngbin0 -> 219 bytes
-rwxr-xr-xsrc/usr/local/www/tree/plus.gifbin0 -> 149 bytes
-rwxr-xr-xsrc/usr/local/www/tree/t.gifbin0 -> 141 bytes
-rw-r--r--src/usr/local/www/tree/tree.css136
-rw-r--r--src/usr/local/www/tree/tree.js195
-rw-r--r--src/usr/local/www/treeview.css48
-rw-r--r--src/usr/local/www/uploadconfig.php65
-rw-r--r--src/usr/local/www/vpn_ipsec.php704
-rw-r--r--src/usr/local/www/vpn_ipsec_keys.php230
-rw-r--r--src/usr/local/www/vpn_ipsec_keys_edit.php199
-rw-r--r--src/usr/local/www/vpn_ipsec_mobile.php740
-rw-r--r--src/usr/local/www/vpn_ipsec_phase1.php1092
-rw-r--r--src/usr/local/www/vpn_ipsec_phase2.php983
-rw-r--r--src/usr/local/www/vpn_ipsec_settings.php445
-rw-r--r--src/usr/local/www/vpn_l2tp.php493
-rw-r--r--src/usr/local/www/vpn_l2tp_users.php146
-rw-r--r--src/usr/local/www/vpn_l2tp_users_edit.php212
-rw-r--r--src/usr/local/www/vpn_openvpn_client.php1271
-rw-r--r--src/usr/local/www/vpn_openvpn_csc.php868
-rw-r--r--src/usr/local/www/vpn_openvpn_server.php2042
-rw-r--r--src/usr/local/www/vpn_pppoe.php167
-rw-r--r--src/usr/local/www/vpn_pppoe_edit.php671
-rw-r--r--src/usr/local/www/vpn_pptp.php504
-rw-r--r--src/usr/local/www/vpn_pptp_users.php142
-rw-r--r--src/usr/local/www/vpn_pptp_users_edit.php184
-rw-r--r--src/usr/local/www/widgets/include/captiveportal.inc4
-rw-r--r--src/usr/local/www/widgets/include/carp_status.inc7
-rw-r--r--src/usr/local/www/widgets/include/dyn_dns_status.inc7
-rw-r--r--src/usr/local/www/widgets/include/gateways.inc5
-rw-r--r--src/usr/local/www/widgets/include/gmirror_status.inc4
-rw-r--r--src/usr/local/www/widgets/include/installed_packages.inc7
-rw-r--r--src/usr/local/www/widgets/include/interface_statistics.inc5
-rw-r--r--src/usr/local/www/widgets/include/interfaces.inc6
-rw-r--r--src/usr/local/www/widgets/include/ipsec.inc4
-rw-r--r--src/usr/local/www/widgets/include/load_balancer.inc4
-rw-r--r--src/usr/local/www/widgets/include/log.inc6
-rw-r--r--src/usr/local/www/widgets/include/ntp_status.inc5
-rw-r--r--src/usr/local/www/widgets/include/openvpn.inc4
-rw-r--r--src/usr/local/www/widgets/include/services_status.inc7
-rw-r--r--src/usr/local/www/widgets/include/smart_status.inc5
-rw-r--r--src/usr/local/www/widgets/include/thermal_sensors.inc27
-rw-r--r--src/usr/local/www/widgets/include/traffic_graph.inc4
-rw-r--r--src/usr/local/www/widgets/include/wake_on_lan.inc7
-rw-r--r--src/usr/local/www/widgets/javascript/cpu_graphs.js245
-rw-r--r--src/usr/local/www/widgets/javascript/ipsec.js9
-rw-r--r--src/usr/local/www/widgets/javascript/thermal_sensors.js296
-rw-r--r--src/usr/local/www/widgets/javascript/traffic_graph.js41
-rw-r--r--src/usr/local/www/widgets/widgets/captive_portal_status.widget.php146
-rw-r--r--src/usr/local/www/widgets/widgets/carp_status.widget.php85
-rw-r--r--src/usr/local/www/widgets/widgets/deactivated/cpu_graphs.widget.php76
-rw-r--r--src/usr/local/www/widgets/widgets/dyn_dns_status.widget.php174
-rw-r--r--src/usr/local/www/widgets/widgets/gateways.widget.php227
-rw-r--r--src/usr/local/www/widgets/widgets/gmirror_status.widget.php52
-rw-r--r--src/usr/local/www/widgets/widgets/installed_packages.widget.php126
-rw-r--r--src/usr/local/www/widgets/widgets/interface_statistics.widget.php216
-rw-r--r--src/usr/local/www/widgets/widgets/interfaces.widget.php126
-rw-r--r--src/usr/local/www/widgets/widgets/ipsec.widget.php265
-rw-r--r--src/usr/local/www/widgets/widgets/load_balancer_status.widget.php155
-rw-r--r--src/usr/local/www/widgets/widgets/log.widget.php281
-rw-r--r--src/usr/local/www/widgets/widgets/ntp_status.widget.php515
-rw-r--r--src/usr/local/www/widgets/widgets/openvpn.widget.php290
-rw-r--r--src/usr/local/www/widgets/widgets/picture.widget.php96
-rw-r--r--src/usr/local/www/widgets/widgets/rss.widget.php198
-rw-r--r--src/usr/local/www/widgets/widgets/services_status.widget.php105
-rw-r--r--src/usr/local/www/widgets/widgets/smart_status.widget.php76
-rw-r--r--src/usr/local/www/widgets/widgets/system_information.widget.php322
-rw-r--r--src/usr/local/www/widgets/widgets/thermal_sensors.widget.php279
-rw-r--r--src/usr/local/www/widgets/widgets/traffic_graphs.widget.php193
-rw-r--r--src/usr/local/www/widgets/widgets/wake_on_lan.widget.php80
-rw-r--r--src/usr/local/www/wizard.php1061
-rw-r--r--src/usr/local/www/wizards/openvpn_wizard.inc676
-rw-r--r--src/usr/local/www/wizards/openvpn_wizard.xml987
-rw-r--r--src/usr/local/www/wizards/setup_wizard.xml703
-rw-r--r--src/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc1664
-rwxr-xr-xsrc/usr/local/www/wizards/traffic_shaper_wizard_dedicated.xml1649
-rw-r--r--src/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc1741
-rwxr-xr-xsrc/usr/local/www/wizards/traffic_shaper_wizard_multi_all.xml1657
-rwxr-xr-xsrc/usr/local/www/xmlrpc.php592
-rw-r--r--src/usr/share/doc/legal/intel_ipw/LICENSE207
-rw-r--r--src/usr/share/doc/legal/intel_iwi/LICENSE210
-rw-r--r--src/usr/share/doc/legal/intel_wpi/LICENSE39
-rw-r--r--src/usr/share/zoneinfo.tgzbin0 -> 194726 bytes
2850 files changed, 464776 insertions, 0 deletions
diff --git a/src/cf/conf/trigger_initial_wizard b/src/cf/conf/trigger_initial_wizard
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cf/conf/trigger_initial_wizard
diff --git a/src/conf.default/config.xml b/src/conf.default/config.xml
new file mode 100644
index 0000000..e16800e
--- /dev/null
+++ b/src/conf.default/config.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0"?>
+<pfsense>
+ <version>11.9</version>
+ <lastchange/>
+ <theme>pfsense_ng</theme>
+ <system>
+ <optimization>normal</optimization>
+ <hostname>pfSense</hostname>
+ <domain>localdomain</domain>
+ <dnsserver/>
+ <dnsallowoverride/>
+ <group>
+ <name>all</name>
+ <description><![CDATA[All Users]]></description>
+ <scope>system</scope>
+ <gid>1998</gid>
+ <member>0</member>
+ </group>
+ <group>
+ <name>admins</name>
+ <description><![CDATA[System Administrators]]></description>
+ <scope>system</scope>
+ <gid>1999</gid>
+ <member>0</member>
+ <priv>page-all</priv>
+ </group>
+ <user>
+ <name>admin</name>
+ <descr><![CDATA[System Administrator]]></descr>
+ <scope>system</scope>
+ <groupname>admins</groupname>
+ <password>$1$dSJImFph$GvZ7.1UbuWu.Yb8etC0re.</password>
+ <uid>0</uid>
+ <priv>user-shell-access</priv>
+ </user>
+ <nextuid>2000</nextuid>
+ <nextgid>2000</nextgid>
+ <timezone>Etc/UTC</timezone>
+ <time-update-interval>300</time-update-interval>
+ <timeservers>0.pfsense.pool.ntp.org</timeservers>
+ <webgui>
+ <protocol>https</protocol>
+ <loginautocomplete/>
+ </webgui>
+ <disablenatreflection>yes</disablenatreflection>
+ <disablesegmentationoffloading/>
+ <disablelargereceiveoffloading/>
+ <ipv6allow/>
+ <powerd_ac_mode>hadp</powerd_ac_mode>
+ <powerd_battery_mode>hadp</powerd_battery_mode>
+ <powerd_normal_mode>hadp</powerd_normal_mode>
+ <bogons>
+ <interval>monthly</interval>
+ </bogons>
+ <kill_states/>
+ </system>
+ <interfaces>
+ <wan>
+ <enable/>
+ <if>em0</if>
+ <mtu/>
+ <ipaddr>dhcp</ipaddr>
+ <ipaddrv6>dhcp6</ipaddrv6>
+ <subnet/>
+ <gateway/>
+ <blockpriv/>
+ <blockbogons/>
+ <dhcphostname/>
+ <media/>
+ <mediaopt/>
+ <dhcp6-duid/>
+ <dhcp6-ia-pd-len>0</dhcp6-ia-pd-len>
+ </wan>
+ <lan>
+ <enable/>
+ <if>em1</if>
+ <ipaddr>192.168.1.1</ipaddr>
+ <subnet>24</subnet>
+ <ipaddrv6>track6</ipaddrv6>
+ <subnetv6>64</subnetv6>
+ <media/>
+ <mediaopt/>
+ </lan>
+ </interfaces>
+ <staticroutes/>
+ <dhcpd>
+ <lan>
+ <enable/>
+ <range>
+ <from>192.168.1.100</from>
+ <to>192.168.1.199</to>
+ </range>
+ </lan>
+ </dhcpd>
+ <pptpd>
+ <mode/>
+ <redir/>
+ <localip/>
+ <remoteip/>
+ </pptpd>
+ <snmpd>
+ <syslocation/>
+ <syscontact/>
+ <rocommunity>public</rocommunity>
+ </snmpd>
+ <diag>
+ <ipv6nat>
+ <ipaddr/>
+ </ipv6nat>
+ </diag>
+ <bridge/>
+ <syslog/>
+ <nat>
+ <outbound>
+ <mode>automatic</mode>
+ </outbound>
+ </nat>
+ <filter>
+ <rule>
+ <type>pass</type>
+ <ipprotocol>inet</ipprotocol>
+ <descr><![CDATA[Default allow LAN to any rule]]></descr>
+ <interface>lan</interface>
+ <tracker>0100000101</tracker>
+ <source>
+ <network>lan</network>
+ </source>
+ <destination>
+ <any/>
+ </destination>
+ </rule>
+ <rule>
+ <type>pass</type>
+ <ipprotocol>inet6</ipprotocol>
+ <descr><![CDATA[Default allow LAN IPv6 to any rule]]></descr>
+ <interface>lan</interface>
+ <tracker>0100000102</tracker>
+ <source>
+ <network>lan</network>
+ </source>
+ <destination>
+ <any/>
+ </destination>
+ </rule>
+ </filter>
+ <shaper/>
+ <ipsec/>
+ <aliases/>
+ <proxyarp/>
+ <cron>
+ <item>
+ <minute>1,31</minute>
+ <hour>0-5</hour>
+ <mday>*</mday>
+ <month>*</month>
+ <wday>*</wday>
+ <who>root</who>
+ <command>/usr/bin/nice -n20 adjkerntz -a</command>
+ </item>
+ <item>
+ <minute>1</minute>
+ <hour>3</hour>
+ <mday>1</mday>
+ <month>*</month>
+ <wday>*</wday>
+ <who>root</who>
+ <command>/usr/bin/nice -n20 /etc/rc.update_bogons.sh</command>
+ </item>
+ <item>
+ <minute>*/60</minute>
+ <hour>*</hour>
+ <mday>*</mday>
+ <month>*</month>
+ <wday>*</wday>
+ <who>root</who>
+ <command>/usr/bin/nice -n20 /usr/local/sbin/expiretable -v -t 3600 sshlockout</command>
+ </item>
+ <item>
+ <minute>*/60</minute>
+ <hour>*</hour>
+ <mday>*</mday>
+ <month>*</month>
+ <wday>*</wday>
+ <who>root</who>
+ <command>/usr/bin/nice -n20 /usr/local/sbin/expiretable -v -t 3600 webConfiguratorlockout</command>
+ </item>
+ <item>
+ <minute>1</minute>
+ <hour>1</hour>
+ <mday>*</mday>
+ <month>*</month>
+ <wday>*</wday>
+ <who>root</who>
+ <command>/usr/bin/nice -n20 /etc/rc.dyndns.update</command>
+ </item>
+ <item>
+ <minute>*/60</minute>
+ <hour>*</hour>
+ <mday>*</mday>
+ <month>*</month>
+ <wday>*</wday>
+ <who>root</who>
+ <command>/usr/bin/nice -n20 /usr/local/sbin/expiretable -v -t 3600 virusprot</command>
+ </item>
+ <item>
+ <minute>30</minute>
+ <hour>12</hour>
+ <mday>*</mday>
+ <month>*</month>
+ <wday>*</wday>
+ <who>root</who>
+ <command>/usr/bin/nice -n20 /etc/rc.update_urltables</command>
+ </item>
+ </cron>
+ <wol/>
+ <rrd>
+ <enable/>
+ </rrd>
+ <load_balancer>
+ <monitor_type>
+ <name>ICMP</name>
+ <type>icmp</type>
+ <descr><![CDATA[ICMP]]></descr>
+ <options/>
+ </monitor_type>
+ <monitor_type>
+ <name>TCP</name>
+ <type>tcp</type>
+ <descr><![CDATA[Generic TCP]]></descr>
+ <options/>
+ </monitor_type>
+ <monitor_type>
+ <name>HTTP</name>
+ <type>http</type>
+ <descr><![CDATA[Generic HTTP]]></descr>
+ <options>
+ <path>/</path>
+ <host/>
+ <code>200</code>
+ </options>
+ </monitor_type>
+ <monitor_type>
+ <name>HTTPS</name>
+ <type>https</type>
+ <descr><![CDATA[Generic HTTPS]]></descr>
+ <options>
+ <path>/</path>
+ <host/>
+ <code>200</code>
+ </options>
+ </monitor_type>
+ <monitor_type>
+ <name>SMTP</name>
+ <type>send</type>
+ <descr><![CDATA[Generic SMTP]]></descr>
+ <options>
+ <send/>
+ <expect>220 *</expect>
+ </options>
+ </monitor_type>
+ </load_balancer>
+ <widgets>
+ <sequence>system_information-container:col1:show,captive_portal_status-container:col1:close,carp_status-container:col1:close,cpu_graphs-container:col1:close,gateways-container:col1:close,gmirror_status-container:col1:close,installed_packages-container:col1:close,interface_statistics-container:col1:close,interfaces-container:col2:show,ipsec-container:col2:close,load_balancer_status-container:col2:close,log-container:col2:close,picture-container:col2:close,rss-container:col2:close,services_status-container:col2:close,traffic_graphs-container:col2:close</sequence>
+ </widgets>
+ <openvpn/>
+ <dnshaper/>
+ <unbound>
+ <enable/>
+ <dnssec/>
+ <active_interface/>
+ <outgoing_interface/>
+ <custom_options/>
+ <hideidentity/>
+ <hideversion/>
+ <dnssecstripped/>
+ </unbound>
+</pfsense>
diff --git a/src/etc/ascii-art/pfsense-logo-small.txt b/src/etc/ascii-art/pfsense-logo-small.txt
new file mode 100644
index 0000000..01d8bc5
--- /dev/null
+++ b/src/etc/ascii-art/pfsense-logo-small.txt
@@ -0,0 +1,5 @@
+ ___
+ ___/ f \
+/ p \___/ Sense
+\___/ \
+ \___/ \ No newline at end of file
diff --git a/src/etc/bogons b/src/etc/bogons
new file mode 100644
index 0000000..9be218d
--- /dev/null
+++ b/src/etc/bogons
@@ -0,0 +1,10 @@
+0.0.0.0/8
+127.0.0.0/8
+169.254.0.0/16
+192.0.0.0/24
+192.0.2.0/24
+198.18.0.0/15
+198.51.100.0/24
+203.0.113.0/24
+224.0.0.0/4
+240.0.0.0/4
diff --git a/src/etc/bogonsv6 b/src/etc/bogonsv6
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/etc/bogonsv6
diff --git a/src/etc/ca_countries b/src/etc/ca_countries
new file mode 100644
index 0000000..1a9ca9e
--- /dev/null
+++ b/src/etc/ca_countries
@@ -0,0 +1,237 @@
+US United States of America
+CA Canada
+AX Aland Islands
+AD Andorra
+AE United Arab Emirates
+AF Afghanistan
+AG Antigua and Barbuda
+AI Anguilla
+AL Albania
+AM Armenia
+AN Netherlands Antilles
+AO Angola
+AQ Antarctica
+AR Argentina
+AS American Samoa
+AT Austria
+AU Australia
+AW Aruba
+AZ Azerbaijan
+BA Bosnia and Herzegovina
+BB Barbados
+BD Bangladesh
+BE Belgium
+BF Burkina Faso
+BG Bulgaria
+BH Bahrain
+BI Burundi
+BJ Benin
+BM Bermuda
+BN Brunei Darussalam
+BO Bolivia
+BR Brazil
+BS Bahamas
+BT Bhutan
+BV Bouvet Island
+BW Botswana
+BZ Belize
+CA Canada
+CC Cocos (Keeling) Islands
+CF Central African Republic
+CH Switzerland
+CI Cote D'Ivoire (Ivory Coast)
+CK Cook Islands
+CL Chile
+CM Cameroon
+CN China
+CO Colombia
+CR Costa Rica
+CS Czechoslovakia (former)
+CV Cape Verde
+CX Christmas Island
+CY Cyprus
+CZ Czech Republic
+DE Germany
+DJ Djibouti
+DK Denmark
+DM Dominica
+DO Dominican Republic
+DZ Algeria
+EC Ecuador
+EE Estonia
+EG Egypt
+EH Western Sahara
+ER Eritrea
+ES Spain
+ET Ethiopia
+FI Finland
+FJ Fiji
+FK Falkland Islands (Malvinas)
+FM Micronesia
+FO Faroe Islands
+FR France
+FX France, Metropolitan
+GA Gabon
+GB Great Britain (UK)
+GD Grenada
+GE Georgia
+GF French Guiana
+GG Guernsey
+GH Ghana
+GI Gibraltar
+GL Greenland
+GM Gambia
+GN Guinea
+GP Guadeloupe
+GQ Equatorial Guinea
+GR Greece
+GS S. Georgia and S. Sandwich Isls.
+GT Guatemala
+GU Guam
+GW Guinea-Bissau
+GY Guyana
+HK Hong Kong
+HM Heard and McDonald Islands
+HN Honduras
+HR Croatia (Hrvatska)
+HT Haiti
+HU Hungary
+ID Indonesia
+IE Ireland
+IL Israel
+IM Isle of Man
+IN India
+IO British Indian Ocean Territory
+IS Iceland
+IT Italy
+JE Jersey
+JM Jamaica
+JO Jordan
+JP Japan
+KE Kenya
+KG Kyrgyzstan
+KH Cambodia
+KI Kiribati
+KM Comoros
+KN Saint Kitts and Nevis
+KR Korea (South)
+KW Kuwait
+KY Cayman Islands
+KZ Kazakhstan
+LA Laos
+LC Saint Lucia
+LI Liechtenstein
+LK Sri Lanka
+LS Lesotho
+LT Lithuania
+LU Luxembourg
+LV Latvia
+LY Libya
+MA Morocco
+MC Monaco
+MD Moldova
+ME Montenegro
+MG Madagascar
+MH Marshall Islands
+MK Macedonia
+ML Mali
+MM Myanmar
+MN Mongolia
+MO Macau
+MP Northern Mariana Islands
+MQ Martinique
+MR Mauritania
+MS Montserrat
+MT Malta
+MU Mauritius
+MV Maldives
+MW Malawi
+MX Mexico
+MY Malaysia
+MZ Mozambique
+NA Namibia
+NC New Caledonia
+NE Niger
+NF Norfolk Island
+NG Nigeria
+NI Nicaragua
+NL Netherlands
+NO Norway
+NP Nepal
+NR Nauru
+NT Neutral Zone
+NU Niue
+NZ New Zealand (Aotearoa)
+OM Oman
+PA Panama
+PE Peru
+PF French Polynesia
+PG Papua New Guinea
+PH Philippines
+PK Pakistan
+PL Poland
+PM St. Pierre and Miquelon
+PN Pitcairn
+PR Puerto Rico
+PS Palestinian Territory
+PT Portugal
+PW Palau
+PY Paraguay
+QA Qatar
+RE Reunion
+RO Romania
+RS Serbia
+RU Russian Federation
+RW Rwanda
+SA Saudi Arabia
+SB Solomon Islands
+SC Seychelles
+SE Sweden
+SG Singapore
+SH St. Helena
+SI Slovenia
+SJ Svalbard and Jan Mayen Islands
+SK Slovak Republic
+SL Sierra Leone
+SM San Marino
+SN Senegal
+SR Suriname
+ST Sao Tome and Principe
+SU USSR (former)
+SV El Salvador
+SZ Swaziland
+TC Turks and Caicos Islands
+TD Chad
+TF French Southern Territories
+TG Togo
+TH Thailand
+TJ Tajikistan
+TK Tokelau
+TM Turkmenistan
+TN Tunisia
+TO Tonga
+TP East Timor
+TR Turkey
+TT Trinidad and Tobago
+TV Tuvalu
+TW Taiwan
+TZ Tanzania
+UA Ukraine
+UG Uganda
+UM US Minor Outlying Islands
+US United States
+UY Uruguay
+UZ Uzbekistan
+VA Vatican City State (Holy See)
+VC Saint Vincent and the Grenadines
+VE Venezuela
+VG Virgin Islands (British)
+VI Virgin Islands (U.S.)
+VN Viet Nam
+VU Vanuatu
+WF Wallis and Futuna Islands
+WS Samoa
+YE Yemen
+YT Mayotte
+ZA South Africa
+ZM Zambia \ No newline at end of file
diff --git a/src/etc/crontab b/src/etc/crontab
new file mode 100644
index 0000000..8be8494
--- /dev/null
+++ b/src/etc/crontab
@@ -0,0 +1,5 @@
+SHELL=/bin/sh
+PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
+HOME=/var/log
+#minute hour mday month wday who command
+# \ No newline at end of file
diff --git a/src/etc/ddb.conf b/src/etc/ddb.conf
new file mode 100644
index 0000000..65f49c2
--- /dev/null
+++ b/src/etc/ddb.conf
@@ -0,0 +1,3 @@
+script lockinfo=show locks; show alllocks; show lockedvnods
+script kdb.enter.default=textdump set; capture on; run lockinfo; show pcpu; bt; ps; alltrace; capture off; call doadump; reset
+script kdb.enter.witness=run lockinfo
diff --git a/src/etc/devd.conf b/src/etc/devd.conf
new file mode 100644
index 0000000..ea67ba6
--- /dev/null
+++ b/src/etc/devd.conf
@@ -0,0 +1,80 @@
+# $Id$
+# $FreeBSD: src/etc/devd.conf,v 1.26.2.1 2005/09/03 22:49:22 sam Exp $
+
+options {
+ directory "/etc/devd";
+ directory "/usr/local/etc/devd";
+ pid-file "/var/run/devd.pid";
+ set scsi-controller-regex
+ "(aac|adv|adw|aha|ahb|ahc|ahd|aic|amd|amr|asr|bt|ciss|ct|dpt|\
+ esp|ida|iir|ips|isp|mlx|mly|mpt|ncr|ncv|nsp|stg|sym|trm|wds)\
+ [0-9]+";
+};
+
+# CARP notify hooks. This will call carpup/carpdown with the
+# interface (carp0, carp1) as the first parameter.
+notify 100 {
+ match "system" "CARP";
+ match "type" "MASTER";
+ action "/usr/local/sbin/pfSctl -c 'interface carpmaster $subsystem'";
+};
+
+notify 100 {
+ match "system" "CARP";
+ match "type" "BACKUP";
+ action "/usr/local/sbin/pfSctl -c 'interface carpbackup $subsystem'";
+};
+
+notify 100 {
+ match "system" "CARP";
+ match "type" "INIT";
+ action "/usr/local/sbin/pfSctl -c 'interface carpbackup $subsystem'";
+};
+
+# When a USB keyboard arrives, attach it as the console keyboard.
+attach 100 {
+ device-name "ukbd0";
+ action "kbdcontrol -k /dev/ukbd0 < /dev/console 2>/dev/null";
+};
+
+detach 100 {
+ device-name "ukbd0";
+ action "kbdcontrol -k /dev/kbd0 < /dev/console 2>/dev/null";
+};
+
+#
+# Signal upper levels that an event happened on ethernet class interface
+#
+notify 0 {
+ match "system" "IFNET";
+ match "type" "LINK_UP";
+ media-type "ethernet";
+ action "/usr/local/sbin/pfSctl -c 'interface linkup start $subsystem'";
+};
+
+notify 0 {
+ match "system" "IFNET";
+ match "type" "LINK_DOWN";
+ media-type "ethernet";
+ action "/usr/local/sbin/pfSctl -c 'interface linkup stop $subsystem'";
+};
+
+#
+# Signal upper levels that an event happened on 802.11 class interface
+#
+notify 0 {
+ match "system" "IFNET";
+ match "type" "LINK_UP";
+ match "subsystem" "[a-z]+[0-9]+_wlan[0-9]+";
+ action "/usr/local/sbin/pfSctl -c 'interface linkup start $subsystem'";
+};
+
+# Notify all users before beginning emergency shutdown when we get
+# a _CRT or _HOT thermal event and we're going to power down the system
+# very soon.
+notify 10 {
+ match "system" "ACPI";
+ match "subsystem" "Thermal";
+ match "notify" "0xcc";
+ action "logger -p kern.emerg 'WARNING: system temperature too high, shutting down soon!'";
+};
diff --git a/src/etc/dh-parameters.1024 b/src/etc/dh-parameters.1024
new file mode 100644
index 0000000..3148f4c
--- /dev/null
+++ b/src/etc/dh-parameters.1024
@@ -0,0 +1,5 @@
+-----BEGIN DH PARAMETERS-----
+MIGHAoGBAINPWm4z+KHppuzSZFjreaLrKdI/wkP0ojutrSlkiszXsGkbU6++GB1C
+7ZH2ZVpSIo4z31XyQnlraIkyY2pAItxqN8ozWaz84QLSHcwVcWKDEU7ZP0ISyTep
+alnFPGG8nJBSzxch+7H3HOfM68y6kfMtFDWuZtYj/9Zw4W42fVDLAgEC
+-----END DH PARAMETERS-----
diff --git a/src/etc/dh-parameters.2048 b/src/etc/dh-parameters.2048
new file mode 100644
index 0000000..f0e1a5d
--- /dev/null
+++ b/src/etc/dh-parameters.2048
@@ -0,0 +1,8 @@
+-----BEGIN DH PARAMETERS-----
+MIIBCAKCAQEAmWwXhRjeqPYl1TvXeKZt5W8MHe0keJK7wC+uPMxpGFVXlvPnWdN+
+W/GyimtD2rHYWF1gyr5IbhiEkXSAuTCnwokwz9XiNQ3hKY/iwTPDo0Go8beB5Ezr
+wz8DibSIv93Va5C+fHzwosuwTAqaOgpOzPqSmVS/UmUATssxOuCK6Crv7YyA5knW
+v0JsJK3VfloeXq/p4skn/KRgL2twO5puJvZWGycMd3cv9+afsWjES/ItwzEHNSEG
+sPen/kNDB4nH+WFKdXnP3fUAqPZCxiqaBC+UnuHngm7Se4smc7DeJkUsed7NLIeg
+zDZ0a3bKZ3UB0lcLGbqXIhh74TtFQ1egmwIBAg==
+-----END DH PARAMETERS-----
diff --git a/src/etc/dh-parameters.4096 b/src/etc/dh-parameters.4096
new file mode 100644
index 0000000..30058a1
--- /dev/null
+++ b/src/etc/dh-parameters.4096
@@ -0,0 +1,13 @@
+-----BEGIN DH PARAMETERS-----
+MIICCAKCAgEA1G0VaCFVkFFPB0pL1Y6NtAlysfvZaAXXmmJ89Xy5wrNLEZfTdmqT
+NmABAhr0DD6+1rcI5d4LriRLhTFf77COjW/+FelEA5BZBsoQDL6QsxWt4VoLT6uK
+bKVkbtwKycz0uOU1areS5gWHF71KRmKgooOuY2yl7a75uLn4QYCS7hKLXsAIB8eC
+63nl81T5gXOAc3hMiKrk8hKLUA6zkMfqWIpG06wvicaPlg8GyQavwGxONDNl/Y2r
+XyRoh/4ja7Moz0tUCmZV+iKtGgq5wekJ1fCN3zhXPX6h6WujoYqzcCmPLFCuIuEa
+kxRy9XaDTe8V40p1RDc4yMYQrl2hxrO8YPRBewigILYxEfe+51qE5Sb//UZszwNL
+kIhW9ObfAkotXoH81xke4EN0RX+rVK1ZYbeBIDCn62ZqNsUVkMh5Otsh0TiK7SP9
+O14IflklQqpyYc+aHMNknhsN30MFV3aD/785QS8zcWUdSdQeZlbjjFgJ4Xpt+r3p
+X6Vv8cwEh8qDHn2CaOfZtyTx2V3B2LU1sJZQ9ynVzlxy2clQcVboXPM1xNgzHSsd
+bFgPMJUAq9VjLGrbN6a3NqWwXnQPMuczX1G3T690fKF55e/boIAXZD1hEZqKt1f0
+DuCwyf/D4CEGyHhHIdVm7f1kTaErWzSgqcc2wGsjFi3ABTG2byxTnSsCAQI=
+-----END DH PARAMETERS-----
diff --git a/src/etc/disktab b/src/etc/disktab
new file mode 100644
index 0000000..5726c4d
--- /dev/null
+++ b/src/etc/disktab
@@ -0,0 +1,204 @@
+# $FreeBSD: stable/10/etc/disktab 242462 2012-11-02 00:17:30Z eadler $
+#
+# Disk geometry and partition layout tables.
+# See disktab(5) for format of this file.
+#
+
+#
+# Floppy formats:
+#
+# To make a filesystem on a floppy:
+# fdformat [-f <size>] fd<drive>[.<size>]
+# disklabel -B -r -w fd<drive>[.<size>] fd<size>
+# newfs <opts> fd<drive>[.<size>]
+#
+# with <opts>:
+# -t 2 - two heads
+# -u 9|15|18 - sectors per track
+# (using the default value of 1/4096 is not much useful for floppies)
+# -l 1 - interleave 1 (for most floppies)
+# -i 65536 - bytes of data per i-node
+# (the default -i value will render you with a floppy wasting way
+# too much space in i-node areas)
+#
+
+fd360:\
+ :ty=floppy:se#512:nt#2:rm#300:ns#9:nc#40:\
+ :pa#720:oa#0:ba#4096:fa#512:\
+ :pc#720:oc#0:bc#4096:fc#512:
+
+fd720:\
+ :ty=floppy:se#512:nt#2:rm#300:ns#9:nc#80:\
+ :pa#1440:oa#0:ba#4096:fa#512:\
+ :pc#1440:oc#0:bc#4096:fc#512:
+
+fd1200|floppy5|5in|5.25in High Density Floppy:\
+ :ty=floppy:se#512:nt#2:rm#360:ns#15:nc#80:\
+ :pa#2400:oa#0:ba#4096:fa#512:\
+ :pc#2400:oc#0:bc#4096:fc#512:
+
+fd1440|floppy|floppy3|3in|3.5in High Density Floppy:\
+ :ty=floppy:se#512:nt#2:rm#300:ns#18:nc#80:\
+ :pa#2880:oa#0:ba#4096:fa#512:\
+ :pc#2880:oc#0:bc#4096:fc#512:
+
+fd2880|2.88MB 3.5in Extra High Density Floppy:\
+ :ty=floppy:se#512:nt#2:rm#300:ns#36:nc#80:\
+ :pa#5760:oa#0:ba#4096:fa#512:\
+ :pb#5760:ob#0:bb#4096:fa#512:\
+ :pc#5760:oc#0:bb#4096:fa#512:
+
+#
+# Stressed floppy-formats. No guarantees given.
+#
+
+fd800:\
+ :ty=floppy:se#512:nt#2:rm#300:ns#10:nc#80:\
+ :pa#1600:oa#0:ba#4096:fa#512:\
+ :pc#1600:oc#0:bc#4096:fc#512:
+
+fd820:\
+ :ty=floppy:se#512:nt#2:rm#300:ns#10:nc#82:\
+ :pa#1640:oa#0:ba#4096:fa#512:\
+ :pc#1640:oc#0:bc#4096:fc#512:
+
+fd1480:\
+ :ty=floppy:se#512:nt#2:rm#300:ns#18:nc#82:\
+ :pa#2952:oa#0:ba#4096:fa#512:\
+ :pc#2952:oc#0:bc#4096:fc#512:
+
+fd1720:\
+ :ty=floppy:se#512:nt#2:rm#300:ns#21:nc#82:\
+ :pa#3444:oa#0:ba#4096:fa#512:\
+ :pc#3444:oc#0:bc#4096:fc#512:
+
+#
+# LS-120 floppy-format.
+#
+fd120m|floppy120|floppy120m|3.5in LS-120 Floppy:\
+ :ty=floppy:se#512:nt#8:rm#300:ns#32:nc#963:\
+ :pa#246528:oa#0:ba#4096:fa#512:\
+ :pc#246528:oc#0:bc#4096:fc#512:
+
+#
+# Harddisk formats
+#
+qp120at|Quantum Peripherals 120MB IDE:\
+ :dt=ESDI:ty=winchester:se#512:nt#9:ns#32:nc#813:sf: \
+ :pa#13824:oa#0:ta=4.2BSD:ba#4096:fa#512: \
+ :pb#13824:ob#13824:tb=swap: \
+ :pc#234144:oc#0: \
+ :ph#206496:oh#27648:th=4.2BSD:bh#4096:fh#512:
+
+pan60|Panasonic Laptop's 60MB IDE:\
+ :dt=ST506:ty=winchester:se#512:nt#13:ns#17:nc#565:\
+ :pa#13260:oa#0:ta=4.2BSD:ba#4096:fa#512:\
+ :pb#13260:ob#13260:tb=swap: \
+ :pc#124865:oc#0: \
+ :ph#97682:oh#26520:th=4.2BSD:bh#4096:fh#512:
+
+mk156|toshiba156|Toshiba MK156 156Mb:\
+ :dt=SCSI:ty=winchester:se#512:nt#10:ns#35:nc#825:\
+ :pa#15748:oa#0:ba#4096:fa#512:ta=4.2BSD:\
+ :pb#15748:ob#15748:tb=swap:\
+ :pc#288750:oc#0:\
+ :ph#257250:oh#31500:bh#4096:fh#512:th=4.2BSD:
+
+cp3100|Connor Peripherals 100MB IDE:\
+ :dt=ST506:ty=winchester:se#512:nt#8:ns#33:nc#766: \
+ :pa#12144:oa#0:ta=4.2BSD:ba#4096:fa#512: \
+ :pb#12144:ob#12144:tb=swap: \
+ :pc#202224:oc#0: \
+ :ph#177936:oh#24288:th=4.2BSD:bh#4096:fh#512:
+
+# a == root
+# b == swap
+# c == d == whole disk
+# e == /var
+# f == scratch
+# h == /usr
+
+cp3100new|Connor Peripherals 100MB IDE, with a different configuration:\
+ :dt=ST506:ty=winchester:se#512:nt#8:ns#33:nc#766: \
+ :pa#15840:oa#0:ta=4.2BSD:ba#4096:fa#512: \
+ :pb#24288:ob#15840:tb=swap: \
+ :pc#202224:oc#0: \
+ :pd#202224:od#0: \
+ :pe#15840:oe#40128:te=4.2BSD:be#4096:fe#512: \
+ :pg#15840:og#55968:tg=4.2BSD:bg#4096:fg#512: \
+ :ph#130416:oh#71808:th=4.2BSD:bh#4096:fh#512:
+
+maxtor4380|Maxtor XT4380E ESDI :\
+ :dt=ESDI:ty=winchester:se#512:nt#15:ns#36:nc#1222:sf: \
+ :pa#21600:oa#0:ta=4.2BSD:ba#4096:fa#512:\
+ :pb#21600:ob#21600:tb=swap: \
+ :pc#659880:oc#0: \
+ :pd#216000:od#53200:td=4.2BSD:bd#4096:fd#512: \
+ :ph#398520:oh#269200:th=4.2BSD:bh#4096:fh#512:
+
+miniscribe9380|compaq38|Miniscribe 9380 ESDI :\
+ :ty=winchester:dt=ESDI:se#512:nt#15:ns#35:nc#1223:rm#3600:sf: \
+ :pa#21000:oa#0:ba#8192:fa#1024:ta=4.2BSD: \
+ :pb#42000:ob#21000:tb=swap: \
+ :pc#642075:oc#0: \
+ :pd#21000:od#63000:bd#8192:fd#1024:td=4.2BSD: \
+ :ph#556500:oh#84000:bh#8192:fh#1024:th=4.2BSD:
+
+ida4|compaq88|Compaq IDA (4 drives) :\
+ :ty=winchester:dt=IDA:se#512:nt#16:ns#63:nc#1644:rm#3600:\
+ :pa#20160:oa#0:ba#8192:fa#1024:ta=4.2BSD: \
+ :pb#80640:ob#20160:tb=swap: \
+ :pc#1659168:oc#0: \
+ :pd#201600:od#100800:bd#8192:fd#1024:td=4.2BSD: \
+ :pe#20160:oe#1310400:be#8192:fe#1024:te=4.2BSD: \
+ :ph#1008000:oh#302400:bh#8192:fh#1024:th=4.2BSD: \
+ :pg#302400:og#1330560:bg#4096:fg#512:tg=4.2BSD:
+
+fuji513|Fujitsu M22XXXX: \
+ :ty=winchester:dt=ESDI:se#512:nt#16:ns#63:nc#954:rm#3600:\
+ :pa#20160:oa#82656:ba#4096:fa#512:ta=4.2BSD: \
+ :pb#40320:ob#102816:tb=swap: \
+ :pc#961632:oc#0: \
+ :ph#656208:oh#143136:bh#4096:fh#512:th=4.2BSD:
+
+sony650|Sony 650 MB MOD|\
+ :ty=removable:dt=SCSI:se#512:nt#1:ns#31:nc#18600:ts#1:rm#4800:\
+ :pc#576600:oc#0:\
+ :pa#576600:oa#0:ta=4.2BSD:ba#8192:fa#1024:
+
+mta3230|mo230|IBM MTA-3230 230 Meg 3.5inch Magneto-Optical:\
+ :ty=removeable:dt=SCSI:rm#3600:\
+ :se#512:nt#64:ns#32:nc#216:sc#2048:su#444384:\
+ :pa#444384:oa#0:ba#4096:fa#0:ta=4.2BSD:\
+ :pc#444384:oc#0:
+
+minimum:ty=mfs:se#512:nt#1:rm#300:\
+ :ns#2880:nc#1:\
+ :pa#2880:oa#0:ba#4096:fa#512:\
+ :pc#2880:oc#0:bc#4096:fc#512:
+
+minimum2:ty=mfs:se#512:nt#1:rm#300:\
+ :ns#5760:nc#1:\
+ :pa#5760:oa#0:ba#4096:fa#512:\
+ :pc#5760:oc#0:bc#4096:fc#512:
+
+minimum3:ty=mfs:se#512:nt#1:rm#300:\
+ :ns#8640:nc#1:\
+ :pa#8640:oa#0:ba#4096:fa#512:\
+ :pc#8640:oc#0:bc#4096:fc#512:
+
+zip100|zip 100:\
+ :ty=removable:se#512:nc#96:nt#64:ns#32:\
+ :pa#196608:oa#0:ba#4096:fa#512:\
+ :pc#196608:oc#0:bc#4096:fc#512:
+
+zip250|zip 250:\
+ :ty=removable:se#512:nc#239:nt#64:ns#32:\
+ :pa#489472:oa#0:ba#4096:fa#512:\
+ :pc#489472:oc#0:bc#4096:fc#512:
+
+orb2200|orb22|orb:\
+ :ty=removable:ns#63:nt#128:nc#4273:sc#1008:su#4307184:se#512:\
+ :pa#4307184:oa#0:ba#8192:fa#1024:\
+ :pc#4307184:oc#0:bc#8192:fc#1024:
+
diff --git a/src/etc/ecl.php b/src/etc/ecl.php
new file mode 100755
index 0000000..15205f1
--- /dev/null
+++ b/src/etc/ecl.php
@@ -0,0 +1,189 @@
+<?php
+/*
+ external config loader
+ Copyright (C) 2010 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ Currently supported file system types: MS-Dos, FreeBSD UFS
+
+*/
+
+require_once("globals.inc");
+require_once("functions.inc");
+require_once("config.lib.inc");
+require_once("config.inc");
+
+$debug = false;
+
+function get_boot_disk() {
+ global $g, $debug;
+ $disk = exec("/sbin/mount | /usr/bin/grep \"on / \" | /usr/bin/cut -d'/' -f3 | /usr/bin/cut -d' ' -f1");
+ return $disk;
+}
+
+function get_swap_disks() {
+ exec("/usr/sbin/swapinfo | /usr/bin/sed '/^\/dev/!d; s,^/dev/,,; s, .*\$,,'", $disks);
+ return $disks;
+}
+
+function get_disk_slices($disk) {
+ global $g, $debug;
+ $slices_array = array();
+ $slices = trim(exec("/bin/ls " . escapeshellarg("/dev/" . $disk . "s*") . " 2>/dev/null"));
+ $slices = str_replace("/dev/", "", $slices);
+ if ($slices == "ls: No match.") {
+ return;
+ }
+ $slices_array = explode(" ", $slices);
+ return $slices_array;
+}
+
+function get_disks() {
+ global $g, $debug;
+ $disks_array = array();
+ $disks_s = explode(" ", get_single_sysctl("kern.disks"));
+ foreach ($disks_s as $disk) {
+ if (trim($disk)) {
+ $disks_array[] = $disk;
+ }
+ }
+ return $disks_array;
+}
+
+function discover_config($mountpoint) {
+ global $g, $debug;
+ $locations_to_check = array("/", "/config");
+ foreach ($locations_to_check as $ltc) {
+ $tocheck = "/tmp/mnt/cf{$ltc}config.xml";
+ if ($debug) {
+ echo "\nChecking for $tocheck";
+ if (file_exists($tocheck)) {
+ echo " -> found!";
+ }
+ }
+ if (file_exists($tocheck)) {
+ return $tocheck;
+ }
+ }
+ return "";
+}
+
+function test_config($file_location) {
+ global $g, $debug;
+ if (!$file_location) {
+ return;
+ }
+ // config.xml was found. ensure it is sound.
+ $root_obj = trim("<{$g['xml_rootobj']}>");
+ $xml_file_head = exec("/usr/bin/head -2 " . escapeshellarg($file_location) . " | /usr/bin/tail -n1");
+ if ($debug) {
+ echo "\nroot obj = $root_obj";
+ echo "\nfile head = $xml_file_head";
+ }
+ if ($xml_file_head == $root_obj) {
+ // Now parse config to make sure
+ $config_status = config_validate($file_location);
+ if ($config_status) {
+ return true;
+ }
+ }
+ return false;
+}
+
+// Probes all disks looking for config.xml
+function find_config_xml() {
+ global $g, $debug;
+ $disks = get_disks();
+ // Safety check.
+ if (!is_array($disks)) {
+ return;
+ }
+ $boot_disk = get_boot_disk();
+ $swap_disks = get_swap_disks();
+ exec("/bin/mkdir -p /tmp/mnt/cf");
+ foreach ($disks as $disk) {
+ $slices = get_disk_slices($disk);
+ if (is_array($slices)) {
+ foreach ($slices as $slice) {
+ if ($slice == "") {
+ continue;
+ }
+ if (stristr($slice, $boot_disk)) {
+ if ($debug) {
+ echo "\nSkipping boot device slice $slice";
+ }
+ continue;
+ }
+ if (in_array($slice, $swap_disks)) {
+ if ($debug) {
+ echo "\nSkipping swap device slice $slice";
+ }
+ continue;
+ }
+ echo " $slice";
+ // First try msdos fs
+ if ($debug) {
+ echo "\n/sbin/mount -t msdosfs /dev/{$slice} /tmp/mnt/cf 2>/dev/null \n";
+ }
+ $result = exec("/sbin/mount -t msdosfs /dev/{$slice} /tmp/mnt/cf 2>/dev/null");
+ // Next try regular fs (ufs)
+ if (!$result) {
+ if ($debug) {
+ echo "\n/sbin/mount /dev/{$slice} /tmp/mnt/cf 2>/dev/null \n";
+ }
+ $result = exec("/sbin/mount /dev/{$slice} /tmp/mnt/cf 2>/dev/null");
+ }
+ $mounted = trim(exec("/sbin/mount | /usr/bin/grep -v grep | /usr/bin/grep '/tmp/mnt/cf' | /usr/bin/wc -l"));
+ if ($debug) {
+ echo "\nmounted: $mounted ";
+ }
+ if (intval($mounted) > 0) {
+ // Item was mounted - look for config.xml file
+ $config_location = discover_config($slice);
+ if ($config_location) {
+ if (test_config($config_location)) {
+ // We have a valid configuration. Install it.
+ echo " -> found config.xml\n";
+ echo "Backing up old configuration...\n";
+ backup_config();
+ echo "Restoring [{$slice}] {$config_location}...\n";
+ restore_backup($config_location);
+ echo "Cleaning up...\n";
+ exec("/sbin/umount /tmp/mnt/cf");
+ exit;
+ }
+ }
+ exec("/sbin/umount /tmp/mnt/cf");
+ }
+ }
+ }
+ }
+}
+
+echo "External config loader 1.0 is now starting...";
+find_config_xml();
+echo "\n";
+
+?>
diff --git a/src/etc/fbtab b/src/etc/fbtab
new file mode 100644
index 0000000..06d2d61
--- /dev/null
+++ b/src/etc/fbtab
@@ -0,0 +1,4 @@
+# $FreeBSD: src/etc/fbtab,v 1.3 1999/09/13 17:09:07 peter Exp $
+#
+#/dev/ttyv0 0600 /dev/console
+#/dev/ttyv0 0600 /dev/pcaudio:/dev/pcaudioctl
diff --git a/src/etc/gettytab b/src/etc/gettytab
new file mode 100644
index 0000000..5af5aae
--- /dev/null
+++ b/src/etc/gettytab
@@ -0,0 +1,235 @@
+# $FreeBSD: stable/10/etc/gettytab 241708 2012-10-18 22:20:02Z peterj $
+# from: @(#)gettytab 5.14 (Berkeley) 3/27/91
+#
+# Most of the table entries here are just copies of the old getty table,
+# it is by no means certain, or even likely, that any of them are optimal
+# for any purpose whatever. Nor is it likely that more than a couple are
+# even correct.
+#
+# The default gettytab entry, used to set defaults for all other
+# entries, and in cases where getty is called with no table name.
+#
+# cb, ce and ck are desirable on most crt's. The non-crt entries need to
+# be changed to turn them off (:cb@:ce@:ck@:).
+#
+# lc should always be on; it's a remainder of some stone age when there
+# have been terminals around not being able of handling lower-case
+# characters. Those terminals aren't supported any longer, but getty is
+# `smart' about them by default.
+#
+# Parity defaults to even, but the Pc entry and all the `std' entries
+# specify no parity. The different parities are:
+# (none): same as ep for getty. login will use terminal as is.
+# ep: getty will use raw mode (cs8 -parenb) (unless rw is set) and
+# fake parity. login will use even parity (cs7 parenb -parodd).
+# op: same as ep except odd parity (cs7 parenb parodd) for login.
+# getty will fake odd parity as well.
+# ap: same as ep except -inpck instead of inpck for login.
+# ap overrides op and ep.
+# np: 1. don't fake parity in getty. The fake parity garbles
+# characters on non-terminals (like pccons) that don't
+# support parity. It would probably better for getty not to
+# try to fake parity. It could just use cbreak mode so as
+# not to force cs8 and let the hardware handle the parity.
+# login has to be rely on the hardware anyway.
+# 2. set cs8 -parenb -istrip -inpck.
+# ep:op: same as ap.
+#
+default:\
+ :cb:ce:ck:lc:fd#1000:im=\r\n%s/%m (%h) (%t)\r\n\r\n:sp#1200:\
+ :if=/etc/issue:
+
+#
+# Fixed speed entries
+#
+# The "std.NNN" names are known to the special case
+# portselector code in getty, however they can
+# be assigned to any table desired.
+# The "NNN-baud" names are known to the special case
+# autobaud code in getty, and likewise can
+# be assigned to any table desired (hopefully the same speed).
+#
+a|std.110|110-baud:\
+ :np:nd#1:cd#1:uc:sp#110:
+b|std.134|134.5-baud:\
+ :np:nd#1:cd#2:ff#1:td#1:sp#134:ht:nl:
+1|std.150|150-baud:\
+ :np:nd#1:cd#2:td#1:fd#1:sp#150:ht:nl:lm=\E\72\6\6\17login\72 :
+c|std.300|300-baud:\
+ :np:nd#1:cd#1:sp#300:
+d|std.600|600-baud:\
+ :np:nd#1:cd#1:sp#600:
+f|std.1200|1200-baud:\
+ :np:fd#1:sp#1200:
+6|std.2400|2400-baud:\
+ :np:sp#2400:
+7|std.4800|4800-baud:\
+ :np:sp#4800:
+2|std.9600|9600-baud:\
+ :np:sp#9600:
+g|std.19200|19200-baud:\
+ :np:sp#19200:
+std.38400|38400-baud:\
+ :np:sp#38400:
+std.57600|57600-baud:\
+ :np:sp#57600:
+std.115200|115200-baud:\
+ :np:sp#115200:
+std.230400|230400-baud:\
+ :np:sp#230400:
+
+#
+# Entry specifying explicit device settings. See termios(4) and
+# /usr/include/termios.h, too. The entry forces the tty into
+# CLOCAL mode (so no DCD is required), and uses Xon/Xoff flow control.
+#
+# cflags: CLOCAL | HUPCL | CREAD | CS8
+# oflags: OPOST | ONLCR | OXTABS
+# iflags: IXOFF | IXON | ICRNL | IGNPAR
+# lflags: IEXTEN | ICANON | ISIG | ECHOCTL | ECHO | ECHOK | ECHOE | ECHOKE
+#
+# The `0' flags don't have input enabled. The `1' flags don't echo.
+# (Echoing is done inside getty itself.)
+#
+local.9600|CLOCAL tty @ 9600 Bd:\
+ :c0#0x0000c300:c1#0x0000cb00:c2#0x0000cb00:\
+ :o0#0x00000007:o1#0x00000002:o2#0x00000007:\
+ :i0#0x00000704:i1#0x00000000:i2#0x00000704:\
+ :l0#0x000005cf:l1#0x00000000:l2#0x000005cf:\
+ :sp#9600:np:
+
+#
+# Dial in rotary tables, speed selection via 'break'
+#
+0|d300|Dial-300:\
+ :nx=d1200:cd#2:sp#300:
+d1200|Dial-1200:\
+ :nx=d150:fd#1:sp#1200:
+d150|Dial-150:\
+ :nx=d110:lm@:tc=150-baud:
+d110|Dial-110:\
+ :nx=d300:tc=300-baud:
+
+#
+# Fast dialup terminals, 2400/1200/300 rotary (can start either way)
+#
+D2400|d2400|Fast-Dial-2400:\
+ :nx=D1200:tc=2400-baud:
+3|D1200|Fast-Dial-1200:\
+ :nx=D300:tc=1200-baud:
+5|D300|Fast-Dial-300:\
+ :nx=D2400:tc=300-baud:
+
+#
+#telebit (19200)
+#
+t19200:\
+ :nx=t2400:tc=19200-baud:
+t2400:\
+ :nx=t1200:tc=2400-baud:
+t1200:\
+ :nx=t19200:tc=1200-baud:
+
+#
+#telebit (9600)
+#
+t9600:\
+ :nx=t2400a:tc=9600-baud:
+t2400a:\
+ :nx=t1200a:tc=2400-baud:
+t1200a:\
+ :nx=t9600:tc=1200-baud:
+
+#
+# Odd special case terminals
+#
+-|tty33|asr33|Pity the poor user of this beast:\
+ :tc=110-baud:
+
+4|Console|Console Decwriter II:\
+ :nd@:cd@:rw:tc=300-baud:
+
+e|Console-1200|Console Decwriter III:\
+ :fd@:nd@:cd@:rw:tc=1200-baud:
+
+i|Interdata console:\
+ :uc:sp#0:
+
+l|lsi chess terminal:\
+ :sp#300:
+
+X|Xwindow|X window system:\
+ :fd@:nd@:cd@:rw:sp#9600:
+
+P|Pc|Pc console:\
+ :ht:np:sp#9600:
+
+al.Pc:\
+ :ht:np:sp#9600:al=root:
+
+# Weirdo special case for fast crt's with hardcopy devices
+#
+8|T9600|CRT with hardcopy:\
+ :nx=T300:tc=9600-baud:
+9|T300|CRT with hardcopy (300):\
+ :nx=T9600:tc=300-baud:
+
+#
+# Plugboard, and misc other terminals
+#
+plug-9600|Plugboard-9600:\
+ :pf#1:tc=9600-baud:
+p|P9600|Plugboard-9600-rotary:\
+ :pf#1:nx=P300:tc=9600-baud:
+q|P300|Plugboard-300:\
+ :pf#1:nx=P1200:tc=300-baud:
+r|P1200|Plugboard-1200:\
+ :pf#1:nx=P9600:tc=1200-baud:
+
+#
+# XXXX Port selector
+#
+s|DSW|Port Selector:\
+ :ps:sp#2400:
+
+#
+# Auto-baud speed detect entry for Micom 600.
+# Special code in getty will switch this out
+# to one of the NNN-baud entries.
+#
+A|Auto-baud:\
+ :ab:sp#2400:f0#040:
+
+#
+# autologin - automatically log in as root
+#
+
+autologin|al.9600:\
+ :al=root:tc=std.9600:
+al.19200:\
+ :al=root:tc=std.19200:
+al.38400:\
+ :al=root:tc=std.38400:
+al.57600:\
+ :al=root:tc=std.57600:
+al.115200:\
+ :al=root:tc=std.115200:
+al.230400:\
+ :al=root:tc=std.230400:
+
+#
+# Entries for 3-wire serial terminals. These don't supply carrier, so
+# clocal needs to be set, and crtscts needs to be unset.
+#
+3wire.9600|9600-3wire:\
+ :np:nc:sp#9600:
+3wire.19200|19200-3wire:\
+ :np:nc:sp#19200:
+3wire.38400|38400-3wire:\
+ :np:nc:sp#38400:
+3wire.57600|57600-3wire:\
+ :np:nc:sp#57600:
+3wire.115200|115200-3wire:\
+ :np:nc:sp#115200:
+3wire.230400|230400-3wire:\
+ :np:nc:sp#230400:
diff --git a/src/etc/group b/src/etc/group
new file mode 100644
index 0000000..a0ca8ce
--- /dev/null
+++ b/src/etc/group
@@ -0,0 +1,31 @@
+wheel:*:0:root,admin
+daemon:*:1:daemon
+kmem:*:2:root
+sys:*:3:root
+tty:*:4:root
+operator:*:5:root
+mail:*:6:
+bin:*:7:
+news:*:8:
+man:*:9:
+games:*:13:
+staff:*:20:root
+sshd:*:22:
+smmsp:*:25:
+mailnull:*:26:
+guest:*:31:root
+bind:*:53:
+unbound:*:59:
+proxy:*:62:
+_pflogd:*:64:
+_dhcp:*:65:
+authpf:*:63:
+uucp:*:66:
+dialer:*:68:
+network:*:69:
+www:*:80:
+nogroup:*:65533:
+nobody:*:65534:
+audit:*:77:
+_ntp:*:123:
+_relayd:*:913:
diff --git a/src/etc/host.conf b/src/etc/host.conf
new file mode 100644
index 0000000..6643c7f
--- /dev/null
+++ b/src/etc/host.conf
@@ -0,0 +1,7 @@
+# $FreeBSD: src/etc/host.conf,v 1.6 1999/08/27 23:23:41 peter Exp $
+# First try the /etc/hosts file
+hosts
+# Now try the nameserver next.
+bind
+# If you have YP/NIS configured, uncomment the next line
+# nis
diff --git a/src/etc/hosts.allow b/src/etc/hosts.allow
new file mode 100644
index 0000000..ab11cc0
--- /dev/null
+++ b/src/etc/hosts.allow
@@ -0,0 +1,5 @@
+#
+# hosts.allow access control file for "tcp wrapped" applications.
+#
+ALL : ALL : allow
+
diff --git a/src/etc/inc/CHAP.inc b/src/etc/inc/CHAP.inc
new file mode 100644
index 0000000..6eb22f7
--- /dev/null
+++ b/src/etc/inc/CHAP.inc
@@ -0,0 +1,463 @@
+<?php
+/*
+Copyright (c) 2002-2010, Michael Bretterklieber <michael@bretterklieber.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+This code cannot simply be copied and put under the GNU Public License or
+any other GPL-like (LGPL, GPL2) License.
+
+ $Id: CHAP.php 302857 2010-08-28 21:12:59Z mbretter $
+*/
+
+require_once 'PEAR.inc';
+
+/**
+* Classes for generating packets for various CHAP Protocols:
+* CHAP-MD5: RFC1994
+* MS-CHAPv1: RFC2433
+* MS-CHAPv2: RFC2759
+*
+* @package Crypt_CHAP
+* @author Michael Bretterklieber <michael@bretterklieber.com>
+* @access public
+* @version $Revision: 302857 $
+*/
+
+/**
+ * class Crypt_CHAP
+ *
+ * Abstract base class for CHAP
+ *
+ * @package Crypt_CHAP
+ */
+class Crypt_CHAP extends PEAR
+{
+ /**
+ * Random binary challenge
+ * @var string
+ */
+ var $challenge = null;
+
+ /**
+ * Binary response
+ * @var string
+ */
+ var $response = null;
+
+ /**
+ * User password
+ * @var string
+ */
+ var $password = null;
+
+ /**
+ * Id of the authentication request. Should incremented after every request.
+ * @var integer
+ */
+ var $chapid = 1;
+
+ /**
+ * Constructor
+ *
+ * Generates a random challenge
+ * @return void
+ */
+ function Crypt_CHAP()
+ {
+ $this->PEAR();
+ $this->generateChallenge();
+ }
+
+ /**
+ * Generates a random binary challenge
+ *
+ * @param string $varname Name of the property
+ * @param integer $size Size of the challenge in Bytes
+ * @return void
+ */
+ function generateChallenge($varname = 'challenge', $size = 8)
+ {
+ $this->$varname = '';
+ for ($i = 0; $i < $size; $i++) {
+ $this->$varname .= pack('C', 1 + mt_rand() % 255);
+ }
+ return $this->$varname;
+ }
+
+ /**
+ * Generates the response. Overwrite this.
+ *
+ * @return void
+ */
+ function challengeResponse()
+ {
+ }
+
+}
+
+/**
+ * class Crypt_CHAP_MD5
+ *
+ * Generate CHAP-MD5 Packets
+ *
+ * @package Crypt_CHAP
+ */
+class Crypt_CHAP_MD5 extends Crypt_CHAP
+{
+
+ /**
+ * Generates the response.
+ *
+ * CHAP-MD5 uses MD5-Hash for generating the response. The Hash consists
+ * of the chapid, the plaintext password and the challenge.
+ *
+ * @return string
+ */
+ function challengeResponse()
+ {
+ return pack('H*', md5(pack('C', $this->chapid) . $this->password . $this->challenge));
+ }
+}
+
+/**
+ * class Crypt_CHAP_MSv1
+ *
+ * Generate MS-CHAPv1 Packets. MS-CHAP doesen't use the plaintext password, it uses the
+ * NT-HASH wich is stored in the SAM-Database or in the smbpasswd, if you are using samba.
+ * The NT-HASH is MD4(str2unicode(plaintextpass)).
+ * You need the hash extension for this class.
+ *
+ * @package Crypt_CHAP
+ */
+class Crypt_CHAP_MSv1 extends Crypt_CHAP
+{
+ /**
+ * Wether using deprecated LM-Responses or not.
+ * 0 = use LM-Response, 1 = use NT-Response
+ * @var bool
+ */
+ var $flags = 1;
+
+ /**
+ * Constructor
+ *
+ * Loads the hash extension
+ * @return void
+ */
+ function Crypt_CHAP_MSv1()
+ {
+ $this->Crypt_CHAP();
+ $this->loadExtension('hash');
+ }
+
+ /**
+ * Generates the NT-HASH from the given plaintext password.
+ *
+ * @access public
+ * @return string
+ */
+ function ntPasswordHash($password = null)
+ {
+ if (isset($password)) {
+ return pack('H*',hash('md4', $this->str2unicode($password)));
+ } else {
+ return pack('H*',hash('md4', $this->str2unicode($this->password)));
+ }
+ }
+
+ /**
+ * Converts ascii to unicode.
+ *
+ * @access public
+ * @return string
+ */
+ function str2unicode($str)
+ {
+ $uni = '';
+ $str = (string) $str;
+ for ($i = 0; $i < strlen($str); $i++) {
+ $a = ord($str{$i}) << 8;
+ $uni .= sprintf("%X", $a);
+ }
+ return pack('H*', $uni);
+ }
+
+ /**
+ * Generates the NT-Response.
+ *
+ * @access public
+ * @return string
+ */
+ function challengeResponse()
+ {
+ return $this->_challengeResponse();
+ }
+
+ /**
+ * Generates the NT-Response.
+ *
+ * @access public
+ * @return string
+ */
+ function ntChallengeResponse()
+ {
+ return $this->_challengeResponse(false);
+ }
+
+ /**
+ * Generates the LAN-Manager-Response.
+ *
+ * @access public
+ * @return string
+ */
+ function lmChallengeResponse()
+ {
+ return $this->_challengeResponse(true);
+ }
+
+ /**
+ * Generates the response.
+ *
+ * Generates the response using DES.
+ *
+ * @param bool $lm wether generating LAN-Manager-Response
+ * @access private
+ * @return string
+ */
+ function _challengeResponse($lm = false)
+ {
+ if ($lm) {
+ $hash = $this->lmPasswordHash();
+ } else {
+ $hash = $this->ntPasswordHash();
+ }
+
+ while (strlen($hash) < 21) {
+ $hash .= "\0";
+ }
+
+ $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_ECB, '');
+ $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
+ $key = $this->_desAddParity(substr($hash, 0, 7));
+ mcrypt_generic_init($td, $key, $iv);
+ $resp1 = mcrypt_generic($td, $this->challenge);
+ mcrypt_generic_deinit($td);
+
+ $key = $this->_desAddParity(substr($hash, 7, 7));
+ mcrypt_generic_init($td, $key, $iv);
+ $resp2 = mcrypt_generic($td, $this->challenge);
+ mcrypt_generic_deinit($td);
+
+ $key = $this->_desAddParity(substr($hash, 14, 7));
+ mcrypt_generic_init($td, $key, $iv);
+ $resp3 = mcrypt_generic($td, $this->challenge);
+ mcrypt_generic_deinit($td);
+ mcrypt_module_close($td);
+
+ return $resp1 . $resp2 . $resp3;
+ }
+
+ /**
+ * Generates the LAN-Manager-HASH from the given plaintext password.
+ *
+ * @access public
+ * @return string
+ */
+ function lmPasswordHash($password = null)
+ {
+ $plain = isset($password) ? $password : $this->password;
+
+ $plain = substr(strtoupper($plain), 0, 14);
+ while (strlen($plain) < 14) {
+ $plain .= "\0";
+ }
+
+ return $this->_desHash(substr($plain, 0, 7)) . $this->_desHash(substr($plain, 7, 7));
+ }
+
+ /**
+ * Generates an irreversible HASH.
+ *
+ * @access private
+ * @return string
+ */
+ function _desHash($plain)
+ {
+ $key = $this->_desAddParity($plain);
+ $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_ECB, '');
+ $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
+ mcrypt_generic_init($td, $key, $iv);
+ $hash = mcrypt_generic($td, 'KGS!@#$%');
+ mcrypt_generic_deinit($td);
+ mcrypt_module_close($td);
+ return $hash;
+ }
+
+ /**
+ * Adds the parity bit to the given DES key.
+ *
+ * @access private
+ * @param string $key 7-Bytes Key without parity
+ * @return string
+ */
+ function _desAddParity($key)
+ {
+ static $odd_parity = array(
+ 1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14,
+ 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
+ 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
+ 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
+ 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
+ 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
+ 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
+ 112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
+ 128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
+ 145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
+ 161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
+ 176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
+ 193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
+ 208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
+ 224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
+ 241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254);
+
+ $bin = '';
+ for ($i = 0; $i < strlen($key); $i++) {
+ $bin .= sprintf('%08s', decbin(ord($key{$i})));
+ }
+
+ $str1 = explode('-', substr(chunk_split($bin, 7, '-'), 0, -1));
+ $x = '';
+ foreach($str1 as $s) {
+ $x .= sprintf('%02s', dechex($odd_parity[bindec($s . '0')]));
+ }
+
+ return pack('H*', $x);
+
+ }
+
+ /**
+ * Generates the response-packet.
+ *
+ * @param bool $lm wether including LAN-Manager-Response
+ * @access private
+ * @return string
+ */
+ function response($lm = false)
+ {
+ $ntresp = $this->ntChallengeResponse();
+ if ($lm) {
+ $lmresp = $this->lmChallengeResponse();
+ } else {
+ $lmresp = str_repeat ("\0", 24);
+ }
+
+ // Response: LM Response, NT Response, flags (0 = use LM Response, 1 = use NT Response)
+ return $lmresp . $ntresp . pack('C', !$lm);
+ }
+}
+
+/**
+ * class Crypt_CHAP_MSv2
+ *
+ * Generate MS-CHAPv2 Packets. This version of MS-CHAP uses a 16 Bytes authenticator
+ * challenge and a 16 Bytes peer Challenge. LAN-Manager responses no longer exists
+ * in this version. The challenge is already a SHA1 challenge hash of both challenges
+ * and of the username.
+ *
+ * @package Crypt_CHAP
+ */
+class Crypt_CHAP_MSv2 extends Crypt_CHAP_MSv1
+{
+ /**
+ * The username
+ * @var string
+ */
+ var $username = null;
+
+ /**
+ * The 16 Bytes random binary peer challenge
+ * @var string
+ */
+ var $peerChallenge = null;
+
+ /**
+ * The 16 Bytes random binary authenticator challenge
+ * @var string
+ */
+ var $authChallenge = null;
+
+ /**
+ * Constructor
+ *
+ * Generates the 16 Bytes peer and authentication challenge
+ * @return void
+ */
+ function Crypt_CHAP_MSv2()
+ {
+ $this->Crypt_CHAP_MSv1();
+ $this->generateChallenge('peerChallenge', 16);
+ $this->generateChallenge('authChallenge', 16);
+ }
+
+ /**
+ * Generates a hash from the NT-HASH.
+ *
+ * @access public
+ * @param string $nthash The NT-HASH
+ * @return string
+ */
+ function ntPasswordHashHash($nthash)
+ {
+ return pack('H*',hash('md4', $nthash));
+ }
+
+ /**
+ * Generates the challenge hash from the peer and the authenticator challenge and
+ * the username. SHA1 is used for this, but only the first 8 Bytes are used.
+ *
+ * @access public
+ * @return string
+ */
+ function challengeHash()
+ {
+ return substr(pack('H*',hash('sha1', $this->peerChallenge . $this->authChallenge . $this->username)), 0, 8);
+ }
+
+ /**
+ * Generates the response.
+ *
+ * @access public
+ * @return string
+ */
+ function challengeResponse()
+ {
+ $this->challenge = $this->challengeHash();
+ return $this->_challengeResponse();
+ }
+}
+
+
+?>
diff --git a/src/etc/inc/IPv6.inc b/src/etc/inc/IPv6.inc
new file mode 100644
index 0000000..faacb8d
--- /dev/null
+++ b/src/etc/inc/IPv6.inc
@@ -0,0 +1,1110 @@
+<?php
+
+/*
+ pfSense_MODULE: utils
+*/
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * This file contains the implementation of the Net_IPv6 class
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: This source file is subject to the New BSD license, that is
+ * available through the world-wide-web at
+ * http://www.opensource.org/licenses/bsd-license.php
+ * If you did not receive a copy of the new BSDlicense and are unable
+ * to obtain it through the world-wide-web, please send a note to
+ * license@php.net so we can mail you a copy immediately
+ *
+ * @category Net
+ * @package Net_IPv6
+ * @author Alexander Merz <alexander.merz@web.de>
+ * @copyright 2003-2005 The PHP Group
+ * @license BSD License http://www.opensource.org/licenses/bsd-license.php
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Net_IPv6
+ */
+
+// {{{ constants
+
+/**
+ * Error message if netmask bits was not found
+ * @see isInNetmask
+ */
+define("NET_IPV6_NO_NETMASK_MSG", "Netmask length not found");
+
+/**
+ * Error code if netmask bits was not found
+ * @see isInNetmask
+ */
+define("NET_IPV6_NO_NETMASK", 10);
+
+/**
+ * Address Type: Unassigned (RFC 1884, Section 2.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_UNASSIGNED", 1);
+
+/**
+ * Address Type: Reserved (RFC 1884, Section 2.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_RESERVED", 11);
+
+/**
+ * Address Type: Reserved for NSAP Allocation (RFC 1884, Section 2.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_RESERVED_NSAP", 12);
+
+/**
+ * Address Type: Reserved for IPX Allocation (RFC 1884, Section 2.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_RESERVED_IPX", 13);
+
+/**
+ * Address Type: Reserved for Geographic-Based Unicast Addresses
+ * (RFC 1884, Section 2.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_RESERVED_UNICAST_GEOGRAPHIC", 14);
+
+/**
+ * Address Type: Provider-Based Unicast Address (RFC 1884, Section 2.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_UNICAST_PROVIDER", 22);
+
+/**
+ * Address Type: Multicast Addresses (RFC 1884, Section 2.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_MULTICAST", 31);
+
+/**
+ * Address Type: Link Local Use Addresses (RFC 1884, Section 2.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_LOCAL_LINK", 42);
+
+/**
+ * Address Type: Link Local Use Addresses (RFC 1884, Section 2.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_LOCAL_SITE", 43);
+
+/**
+ * Address Type: Address range to embedded IPv4 ip in an IPv6 address (RFC 4291, Section 2.5.5)
+ * @see getAddressType()
+ */
+define("NET_IPV6_IPV4MAPPING", 51);
+
+/**
+ * Address Type: Unspecified (RFC 4291, Section 2.5.2)
+ * @see getAddressType()
+ */
+define("NET_IPV6_UNSPECIFIED", 52);
+
+/**
+ * Address Type: Unspecified (RFC 4291, Section 2.5.3)
+ * @see getAddressType()
+ */
+define("NET_IPV6_LOOPBACK", 53);
+
+/**
+ * Address Type: address can not assigned to a specific type
+ * @see getAddressType()
+ */
+define("NET_IPV6_UNKNOWN_TYPE", 1001);
+
+// }}}
+// {{{ Net_IPv6
+
+/**
+ * Class to validate and to work with IPv6 addresses.
+ *
+ * @category Net
+ * @package Net_IPv6
+ * @author Alexander Merz <alexander.merz@web.de>
+ * @author <elfrink at introweb dot nl>
+ * @author Josh Peck <jmp at joshpeck dot org>
+ * @copyright 2003-2010 The PHP Group
+ * @license BSD License http://www.opensource.org/licenses/bsd-license.php
+ * @version Release: 1.1.0RC5
+ * @link http://pear.php.net/package/Net_IPv6
+ */
+class Net_IPv6
+{
+
+ // {{{ separate()
+ /**
+ * Separates an IPv6 address into the address and a prefix length part
+ *
+ * @param String $ip the (compressed) IP as Hex representation
+ *
+ * @return Array the first element is the IP, the second the prefix length
+ * @since 1.2.0
+ * @access public
+ * @static
+ */
+ static function separate($ip)
+ {
+
+ $addr = $ip;
+ $spec = '';
+
+ if(false === strrpos($ip, '/')) {
+
+ return array($addr, $spec);
+
+ }
+
+ $elements = explode('/', $ip);
+
+ if(2 == count($elements)) {
+
+ $addr = $elements[0];
+ $spec = $elements[1];
+
+ }
+
+ return array($addr, $spec);
+
+ }
+ // }}}
+
+ // {{{ removeNetmaskSpec()
+
+ /**
+ * Removes a possible existing prefix length/ netmask specification at an IP address.
+ *
+ * @param String $ip the (compressed) IP as Hex representation
+ *
+ * @return String the IP without netmask length
+ * @since 1.1.0
+ * @access public
+ * @static
+ */
+ static function removeNetmaskSpec($ip)
+ {
+
+ $elements = Net_IPv6::separate($ip);
+
+ return $elements[0];
+
+ }
+ // }}}
+ // {{{ removePrefixLength()
+
+ /**
+ * Tests for a prefix length specification in the address
+ * and removes the prefix length, if exists
+ *
+ * The method is technically identical to removeNetmaskSpec() and
+ * will be dropped in a future release.
+ *
+ * @param String $ip a valid ipv6 address
+ *
+ * @return String the address without a prefix length
+ * @access public
+ * @static
+ * @see removeNetmaskSpec()
+ * @deprecated
+ */
+ static function removePrefixLength($ip)
+ {
+ $pos = strrpos($ip, '/');
+
+ if (false !== $pos) {
+
+ return substr($ip, 0, $pos);
+
+ }
+
+ return $ip;
+ }
+
+ // }}}
+ // {{{ getNetmaskSpec()
+
+ /**
+ * Returns a possible existing prefix length/netmask specification on an IP address.
+ *
+ * @param String $ip the (compressed) IP as Hex representation
+ *
+ * @return String the netmask spec
+ * @since 1.1.0
+ * @access public
+ * @static
+ */
+ static function getNetmaskSpec($ip)
+ {
+
+ $elements = Net_IPv6::separate($ip);
+
+ return $elements[1];
+
+ }
+
+ // }}}
+ // {{{ getPrefixLength()
+
+ /**
+ * Tests for a prefix length specification in the address
+ * and returns the prefix length, if exists
+ *
+ * The method is technically identical to getNetmaskSpec() and
+ * will be dropped in a future release.
+ *
+ * @param String $ip a valid ipv6 address
+ *
+ * @return Mixed the prefix as String or false, if no prefix was found
+ * @access public
+ * @static
+ * @deprecated
+ */
+ static function getPrefixLength($ip)
+ {
+ if (preg_match("/^([0-9a-fA-F:]{2,39})\/(\d{1,3})*$/",
+ $ip, $matches)) {
+
+ return $matches[2];
+
+ } else {
+
+ return false;
+
+ }
+
+ }
+
+ // }}}
+ // {{{ getNetmask()
+
+ /**
+ * Calculates the network prefix based on the netmask bits.
+ *
+ * @param String $ip the (compressed) IP in Hex format
+ * @param int $bits if the number of netmask bits is not part of the IP
+ * you must provide the number of bits
+ *
+ * @return String the network prefix
+ * @since 1.1.0
+ * @access public
+ * @static
+ */
+ static function getNetmask($ip, $bits = null)
+ {
+ if (null==$bits) {
+
+ $elements = explode('/', $ip);
+
+ if (2 == count($elements)) {
+
+ $addr = $elements[0];
+ $bits = $elements[1];
+
+ } else {
+
+ include_once 'PEAR.inc';
+
+ return PEAR::raiseError(NET_IPV6_NO_NETMASK_MSG,
+ NET_IPV6_NO_NETMASK);
+ }
+
+ } else {
+
+ $addr = $ip;
+
+ }
+
+ $addr = Net_IPv6::uncompress($addr);
+ $binNetmask = str_repeat('1', $bits).str_repeat('0', 128 - $bits);
+
+ return Net_IPv6::_bin2Ip(Net_IPv6::_ip2Bin($addr) & $binNetmask);
+ }
+
+ // }}}
+ // {{{ isInNetmask()
+
+ /**
+ * Checks if an (compressed) IP is in a specific address space.
+ *
+ * If the IP does not contain the number of netmask bits (F8000::FFFF/16)
+ * then you have to use the $bits parameter.
+ *
+ * @param String $ip the IP to check (eg. F800::FFFF)
+ * @param String $netmask the netmask (eg F800::)
+ * @param int $bits the number of netmask bits to compare,
+ * if not given in $ip
+ *
+ * @return boolean true if $ip is in the netmask
+ * @since 1.1.0
+ * @access public
+ * @static
+ */
+ static function isInNetmask($ip, $netmask, $bits=null)
+ {
+ // try to get the bit count
+
+ if (null == $bits) {
+
+ $elements = explode('/', $ip);
+
+ if (2 == count($elements)) {
+
+ $ip = $elements[0];
+ $bits = $elements[1];
+
+ } else if (null == $bits) {
+
+ $elements = explode('/', $netmask);
+
+ if (2 == count($elements)) {
+
+ $netmask = $elements[0];
+ $bits = $elements[1];
+
+ }
+
+ if (null == $bits) {
+
+ include_once 'PEAR.inc';
+ return PEAR::raiseError(NET_IPV6_NO_NETMASK_MSG,
+ NET_IPV6_NO_NETMASK);
+
+ }
+
+ }
+
+ }
+
+ $binIp = Net_IPv6::_ip2Bin(Net_IPv6::removeNetmaskSpec($ip));
+ $binNetmask = Net_IPv6::_ip2Bin(Net_IPv6::removeNetmaskSpec($netmask));
+
+ if (null != $bits
+ && "" != $bits
+ && 0 == strncmp($binNetmask, $binIp, $bits)) {
+
+ return true;
+
+ }
+
+ return false;
+ }
+
+ // }}}
+ // {{{ getAddressType()
+
+ /**
+ * Returns the type of an IPv6 address.
+ *
+ * RFC 2373, Section 2.3 describes several types of addresses in
+ * the IPv6 address space.
+ * Several address types are markers for reserved spaces and as
+ * a consequence are subject to change.
+ *
+ * @param String $ip the IP address in Hex format,
+ * compressed IPs are allowed
+ *
+ * @return int one of the address type constants
+ * @access public
+ * @since 1.1.0
+ * @static
+ *
+ * @see NET_IPV6_UNASSIGNED
+ * @see NET_IPV6_RESERVED
+ * @see NET_IPV6_RESERVED_NSAP
+ * @see NET_IPV6_RESERVED_IPX
+ * @see NET_IPV6_RESERVED_UNICAST_GEOGRAPHIC
+ * @see NET_IPV6_UNICAST_PROVIDER
+ * @see NET_IPV6_MULTICAST
+ * @see NET_IPV6_LOCAL_LINK
+ * @see NET_IPV6_LOCAL_SITE
+ * @see NET_IPV6_IPV4MAPPING
+ * @see NET_IPV6_UNSPECIFIED
+ * @see NET_IPV6_LOOPBACK
+ * @see NET_IPV6_UNKNOWN_TYPE
+ */
+ static function getAddressType($ip)
+ {
+ $ip = Net_IPv6::removeNetmaskSpec($ip);
+ $binip = Net_IPv6::_ip2Bin($ip);
+
+ if(0 == strncmp(str_repeat('0', 128), $binip, 128)) { // ::/128
+
+ return NET_IPV6_UNSPECIFIED;
+
+ } else if(0 == strncmp(str_repeat('0', 127).'1', $binip, 128)) { // ::/128
+
+ return NET_IPV6_LOOPBACK;
+
+ } else if (0 == strncmp(str_repeat('0', 80).str_repeat('1', 16), $binip, 96)) { // ::ffff/96
+
+ return NET_IPV6_IPV4MAPPING;
+
+ } else if (0 == strncmp('1111111010', $binip, 10)) {
+
+ return NET_IPV6_LOCAL_LINK;
+
+ } else if (0 == strncmp('1111111011', $binip, 10)) {
+
+ return NET_IPV6_LOCAL_SITE;
+
+ } else if (0 == strncmp('111111100', $binip, 9)) {
+
+ return NET_IPV6_UNASSIGNED;
+
+ } else if (0 == strncmp('11111111', $binip, 8)) {
+
+ return NET_IPV6_MULTICAST;
+
+ } else if (0 == strncmp('00000000', $binip, 8)) {
+
+ return NET_IPV6_RESERVED;
+
+ } else if (0 == strncmp('00000001', $binip, 8)
+ || 0 == strncmp('1111110', $binip, 7)) {
+
+ return NET_IPV6_UNASSIGNED;
+
+ } else if (0 == strncmp('0000001', $binip, 7)) {
+
+ return NET_IPV6_RESERVED_NSAP;
+
+ } else if (0 == strncmp('0000010', $binip, 7)) {
+
+ return NET_IPV6_RESERVED_IPX;
+
+ } else if (0 == strncmp('0000011', $binip, 7) ||
+ 0 == strncmp('111110', $binip, 6) ||
+ 0 == strncmp('11110', $binip, 5) ||
+ 0 == strncmp('00001', $binip, 5) ||
+ 0 == strncmp('1110', $binip, 4) ||
+ 0 == strncmp('0001', $binip, 4) ||
+ 0 == strncmp('001', $binip, 3) ||
+ 0 == strncmp('011', $binip, 3) ||
+ 0 == strncmp('101', $binip, 3) ||
+ 0 == strncmp('110', $binip, 3)) {
+
+ return NET_IPV6_UNASSIGNED;
+
+ } else if (0 == strncmp('010', $binip, 3)) {
+
+ return NET_IPV6_UNICAST_PROVIDER;
+
+ } else if (0 == strncmp('100', $binip, 3)) {
+
+ return NET_IPV6_RESERVED_UNICAST_GEOGRAPHIC;
+
+ }
+
+ return NET_IPV6_UNKNOWN_TYPE;
+ }
+
+ // }}}
+ // {{{ Uncompress()
+
+ /**
+ * Uncompresses an IPv6 address
+ *
+ * RFC 2373 allows you to compress zeros in an address to '::'. This
+ * function expects a valid IPv6 address and expands the '::' to
+ * the required zeros.
+ *
+ * Example: FF01::101 -> FF01:0:0:0:0:0:0:101
+ * ::1 -> 0:0:0:0:0:0:0:1
+ *
+ * Note: You can also pass an invalid IPv6 address (usually as part of the process
+ * of validation by checkIPv6, which will validate the return string).
+ * This function will insert the "0" between "::" even if this results in too many
+ * numbers in total. It is NOT the purpose of this function to validate your input.
+ *
+ * Example of calling with invalid input: 1::2:3:4:5:6:7:8:9 -> 1:0:2:3:4:5:6:7:8:9
+ *
+ * @param String $ip a (possibly) valid IPv6-address (hex format)
+ * @param Boolean $leadingZeros if true, leading zeros are added to each
+ * block of the address
+ * (FF01::101 ->
+ * FF01:0000:0000:0000:0000:0000:0000:0101)
+ *
+ * @return String the uncompressed IPv6-address (hex format)
+ * @access public
+ * @see Compress()
+ * @static
+ * @author Pascal Uhlmann
+ */
+ static function uncompress($ip, $leadingZeros = false)
+ {
+
+ $prefix = Net_IPv6::getPrefixLength($ip);
+
+ if (false === $prefix) {
+
+ $prefix = '';
+
+ } else {
+
+ $ip = Net_IPv6::removePrefixLength($ip);
+ $prefix = '/'.$prefix;
+
+ }
+
+ $netmask = Net_IPv6::getNetmaskSpec($ip);
+ $uip = Net_IPv6::removeNetmaskSpec($ip);
+
+ $c1 = -1;
+ $c2 = -1;
+
+ if (false !== strpos($uip, '::') ) {
+
+ list($ip1, $ip2) = explode('::', $uip);
+
+ if ("" == $ip1) {
+
+ $c1 = -1;
+
+ } else {
+
+ $pos = 0;
+
+ if (0 < ($pos = substr_count($ip1, ':'))) {
+
+ $c1 = $pos;
+
+ } else {
+
+ $c1 = 0;
+
+ }
+ }
+ if ("" == $ip2) {
+
+ $c2 = -1;
+
+ } else {
+
+ $pos = 0;
+
+ if (0 < ($pos = substr_count($ip2, ':'))) {
+
+ $c2 = $pos;
+
+ } else {
+
+ $c2 = 0;
+
+ }
+
+ }
+
+ if (strstr($ip2, '.')) {
+
+ $c2++;
+
+ }
+ if (-1 == $c1 && -1 == $c2) { // ::
+
+ $uip = "0:0:0:0:0:0:0:0";
+
+ } else if (-1 == $c1) { // ::xxx
+
+ $fill = str_repeat('0:', 7-$c2);
+ $uip = str_replace('::', $fill, $uip);
+
+ } else if (-1 == $c2) { // xxx::
+
+ $fill = str_repeat(':0', 7-$c1);
+ $uip = str_replace('::', $fill, $uip);
+
+ } else { // xxx::xxx
+
+ $fill = str_repeat(':0:', max(1, 6-$c2-$c1));
+ $uip = str_replace('::', $fill, $uip);
+ $uip = str_replace('::', ':', $uip);
+
+ }
+ }
+
+ if(true == $leadingZeros) {
+
+ $uipT = array();
+ $uiparts = explode(':', $uip);
+
+ foreach($uiparts as $p) {
+
+ $uipT[] = sprintf('%04s', $p);
+
+ }
+
+ $uip = implode(':', $uipT);
+ }
+
+ if ('' != $netmask) {
+
+ $uip = $uip.'/'.$netmask;
+
+ }
+
+ return $uip.$prefix;
+ }
+
+ // }}}
+ // {{{ Compress()
+
+ /**
+ * Compresses an IPv6 address
+ *
+ * RFC 2373 allows you to compress zeros in an address to '::'. This
+ * function expects a valid IPv6 address and compresses successive zeros
+ * to '::'
+ *
+ * Example: FF01:0:0:0:0:0:0:101 -> FF01::101
+ * 0:0:0:0:0:0:0:1 -> ::1
+ *
+ * When $ip is an already compressed address and $force is false, the method returns
+ * the value as is, even if the address can be compressed further.
+ *
+ * Example: FF01::0:1 -> FF01::0:1
+ *
+ * To enforce maximum compression, you can set the second argument $force to true.
+ *
+ * Example: FF01::0:1 -> FF01::1
+ *
+ * @param String $ip a valid IPv6-address (hex format)
+ * @param boolean $force if true the address will be compressed as best as possible (since 1.2.0)
+ *
+ * @return String the compressed IPv6-address (hex format)
+ * @access public
+ * @see Uncompress()
+ * @static
+ * @author elfrink at introweb dot nl
+ */
+ static function compress($ip, $force = false)
+ {
+
+ if(false !== strpos($ip, '::')) { // its already compressed
+
+ if(true == $force) {
+
+ $ip = Net_IPv6::uncompress($ip);
+
+ } else {
+
+ return $ip;
+
+ }
+
+ }
+
+ $prefix = Net_IPv6::getPrefixLength($ip);
+
+ if (false === $prefix) {
+
+ $prefix = '';
+
+ } else {
+
+ $ip = Net_IPv6::removePrefixLength($ip);
+ $prefix = '/'.$prefix;
+
+ }
+
+ $netmask = Net_IPv6::getNetmaskSpec($ip);
+ $ip = Net_IPv6::removeNetmaskSpec($ip);
+
+ $ipp = explode(':', $ip);
+
+ for ($i = 0; $i < count($ipp); $i++) {
+
+ $ipp[$i] = dechex(hexdec($ipp[$i]));
+
+ }
+
+ $cip = ':' . join(':', $ipp) . ':';
+
+ preg_match_all("/(:0)(:0)+/", $cip, $zeros);
+
+ if (count($zeros[0]) > 0) {
+
+ $match = '';
+
+ foreach ($zeros[0] as $zero) {
+
+ if (strlen($zero) > strlen($match)) {
+
+ $match = $zero;
+
+ }
+ }
+
+ $cip = preg_replace('/' . $match . '/', ':', $cip, 1);
+
+ }
+
+ $cip = preg_replace('/((^:)|(:$))/', '', $cip);
+ $cip = preg_replace('/((^:)|(:$))/', '::', $cip);
+
+ if (empty($cip)) {
+
+ $cip = "::";
+
+ }
+
+ if ('' != $netmask) {
+
+ $cip = $cip.'/'.$netmask;
+
+ }
+
+ return $cip.$prefix;
+
+ }
+
+ // }}}
+ // {{{ recommendedFormat()
+ /**
+ * Represent IPv6 address in RFC5952 format.
+ *
+ * @param String $ip a valid IPv6-address (hex format)
+ *
+ * @return String the recommended representation of IPv6-address (hex format)
+ * @access public
+ * @see compress()
+ * @static
+ * @author koyama at hoge dot org
+ * @todo This method may become a part of compress() in a further releases
+ */
+ static function recommendedFormat($ip)
+ {
+ $compressed = self::compress($ip, true);
+ // RFC5952 4.2.2
+ // The symbol "::" MUST NOT be used to shorten just one
+ // 16-bit 0 field.
+ if ((substr_count($compressed, ':') == 7) &&
+ (strpos($compressed, '::') !== false)) {
+ $compressed = str_replace('::', ':0:', $compressed);
+ }
+ return $compressed;
+ }
+ // }}}
+
+ // {{{ isCompressible()
+
+ /**
+ * Checks, if an IPv6 address can be compressed
+ *
+ * @param String $ip a valid IPv6 address
+ *
+ * @return Boolean true, if address can be compressed
+ *
+ * @access public
+ * @since 1.2.0b
+ * @static
+ * @author Manuel Schmitt
+ */
+ static function isCompressible($ip)
+ {
+
+ return (bool)($ip != Net_IPv6::compress($address));
+
+ }
+
+ // }}}
+ // {{{ SplitV64()
+
+ /**
+ * Splits an IPv6 address into the IPv6 and a possible IPv4 part
+ *
+ * RFC 2373 allows you to note the last two parts of an IPv6 address as
+ * an IPv4 compatible address
+ *
+ * Example: 0:0:0:0:0:0:13.1.68.3
+ * 0:0:0:0:0:FFFF:129.144.52.38
+ *
+ * @param String $ip a valid IPv6-address (hex format)
+ * @param Boolean $uncompress if true, the address will be uncompressed
+ * before processing
+ *
+ * @return Array [0] contains the IPv6 part,
+ * [1] the IPv4 part (hex format)
+ * @access public
+ * @static
+ */
+ static function SplitV64($ip, $uncompress = true)
+ {
+ $ip = Net_IPv6::removeNetmaskSpec($ip);
+
+ if ($uncompress) {
+
+ $ip = Net_IPv6::Uncompress($ip);
+
+ }
+
+ if (strstr($ip, '.')) {
+
+ $pos = strrpos($ip, ':');
+ $ip{$pos} = '_';
+ $ipPart = explode('_', $ip);
+
+ return $ipPart;
+
+ } else {
+
+ return array($ip, "");
+
+ }
+ }
+
+ // }}}
+ // {{{ checkIPv6()
+
+ /**
+ * Checks an IPv6 address
+ *
+ * Checks if the given IP is IPv6-compatible
+ *
+ * @param String $ip a valid IPv6-address
+ *
+ * @return Boolean true if $ip is an IPv6 address
+ * @access public
+ * @static
+ */
+ static function checkIPv6($ip)
+ {
+
+ $elements = Net_IPv6::separate($ip);
+
+ $ip = $elements[0];
+
+ if('' != $elements[1] && ( !is_numeric($elements[1]) || 0 > $elements[1] || 128 < $elements[1])) {
+
+ return false;
+
+ }
+
+ $ipPart = Net_IPv6::SplitV64($ip);
+ $count = 0;
+
+ if (!empty($ipPart[0])) {
+ $ipv6 = explode(':', $ipPart[0]);
+
+ foreach($ipv6 as $element) { // made a validate precheck
+ if(!preg_match('/[0-9a-fA-F]*/', $element)) {
+ return false;
+ }
+ }
+
+ for ($i = 0; $i < count($ipv6); $i++) {
+
+ if(4 < strlen($ipv6[$i])) {
+
+ return false;
+
+ }
+
+ $dec = hexdec($ipv6[$i]);
+ $hex = strtoupper(preg_replace("/^[0]{1,3}(.*[0-9a-fA-F])$/",
+ "\\1",
+ $ipv6[$i]));
+
+ if ($ipv6[$i] >= 0 && $dec <= 65535
+ && $hex == strtoupper(dechex($dec))) {
+
+ $count++;
+
+ }
+
+ }
+
+ if (8 == $count) {
+
+ return true;
+
+ } else if (6 == $count and !empty($ipPart[1])) {
+
+ $ipv4 = explode('.', $ipPart[1]);
+ $count = 0;
+
+ for ($i = 0; $i < count($ipv4); $i++) {
+
+ if ($ipv4[$i] >= 0 && (integer)$ipv4[$i] <= 255
+ && preg_match("/^\d{1,3}$/", $ipv4[$i])) {
+
+ $count++;
+
+ }
+
+ }
+
+ if (4 == $count) {
+
+ return true;
+
+ }
+
+ } else {
+
+ return false;
+
+ }
+
+ } else {
+
+ return false;
+
+ }
+
+ }
+
+ // }}}
+
+ // {{{ _parseAddress()
+
+ /**
+ * Returns the lowest and highest IPv6 address
+ * for a given IP and netmask specification
+ *
+ * The netmask may be a part of the $ip or
+ * the number of netmask bits is provided via $bits
+ *
+ * The result is an indexed array. The key 'start'
+ * contains the lowest possible IP address. The key
+ * 'end' the highest address.
+ *
+ * @param String $ipToParse the IPv6 address
+ * @param String $bits the optional count of netmask bits
+ *
+ * @return Array ['start', 'end'] the lowest and highest IPv6 address
+ * @access public
+ * @static
+ * @author Nicholas Williams
+ */
+
+ static function parseAddress($ipToParse, $bits = null)
+ {
+
+ $ip = null;
+ $bitmask = null;
+
+ if ( null == $bits ) {
+
+ $elements = explode('/', $ipToParse);
+
+ if ( 2 == count($elements) ) {
+
+ $ip = Net_IPv6::uncompress($elements[0]);
+ $bitmask = $elements[1];
+
+ } else {
+
+ include_once 'PEAR.inc';
+
+ return PEAR::raiseError(NET_IPV6_NO_NETMASK_MSG,
+ NET_IPV6_NO_NETMASK);
+ }
+ } else {
+
+ $ip = Net_IPv6::uncompress($ipToParse);
+ $bitmask = $bits;
+
+ }
+
+ $binNetmask = str_repeat('1', $bitmask).
+ str_repeat('0', 128 - $bitmask);
+ $maxNetmask = str_repeat('1', 128);
+ $netmask = Net_IPv6::_bin2Ip($binNetmask);
+
+ $startAddress = Net_IPv6::_bin2Ip(Net_IPv6::_ip2Bin($ip)
+ & $binNetmask);
+ $endAddress = Net_IPv6::_bin2Ip(Net_IPv6::_ip2Bin($ip)
+ | ($binNetmask ^ $maxNetmask));
+
+ return array('start' => $startAddress, 'end' => $endAddress);
+ }
+
+ // }}}
+
+ // {{{ _ip2Bin()
+
+ /**
+ * Converts an IPv6 address from Hex into Binary representation.
+ *
+ * @param String $ip the IP to convert (a:b:c:d:e:f:g:h),
+ * compressed IPs are allowed
+ *
+ * @return String the binary representation
+ * @access private
+ @ @since 1.1.0
+ */
+ static function _ip2Bin($ip)
+ {
+ $binstr = '';
+
+ $ip = Net_IPv6::removeNetmaskSpec($ip);
+ $ip = Net_IPv6::Uncompress($ip);
+
+ $parts = explode(':', $ip);
+
+ foreach ( $parts as $v ) {
+
+ $str = base_convert($v, 16, 2);
+ $binstr .= str_pad($str, 16, '0', STR_PAD_LEFT);
+
+ }
+
+ return $binstr;
+ }
+
+ // }}}
+ // {{{ _bin2Ip()
+
+ /**
+ * Converts an IPv6 address from Binary into Hex representation.
+ *
+ * @param String $bin the IP address as binary
+ *
+ * @return String the uncompressed Hex representation
+ * @access private
+ @ @since 1.1.0
+ */
+ static function _bin2Ip($bin)
+ {
+ $ip = "";
+
+ if (strlen($bin) < 128) {
+
+ $bin = str_pad($bin, 128, '0', STR_PAD_LEFT);
+
+ }
+
+ $parts = str_split($bin, "16");
+
+ foreach ( $parts as $v ) {
+
+ $str = base_convert($v, 2, 16);
+ $ip .= $str.":";
+
+ }
+
+ $ip = substr($ip, 0, -1);
+
+ return $ip;
+ }
+
+ // }}}
+}
+// }}}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+
+?>
diff --git a/src/etc/inc/PEAR.inc b/src/etc/inc/PEAR.inc
new file mode 100644
index 0000000..a280602
--- /dev/null
+++ b/src/etc/inc/PEAR.inc
@@ -0,0 +1,1103 @@
+<?php
+/**
+ * PEAR, the PHP Extension and Application Repository
+ *
+ * PEAR class and PEAR_Error class
+ *
+ * PHP versions 4 and 5
+ *
+ * @category pear
+ * @package PEAR
+ * @author Sterling Hughes <sterling@php.net>
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V.Cox <cox@idecnet.com>
+ * @author Greg Beaver <cellog@php.net>
+ * @copyright 1997-2010 The Authors
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/PEAR
+ * @since File available since Release 0.1
+ */
+
+/**#@+
+ * ERROR constants
+ */
+define('PEAR_ERROR_RETURN', 1);
+define('PEAR_ERROR_PRINT', 2);
+define('PEAR_ERROR_TRIGGER', 4);
+define('PEAR_ERROR_DIE', 8);
+define('PEAR_ERROR_CALLBACK', 16);
+/**
+ * WARNING: obsolete
+ * @deprecated
+ */
+define('PEAR_ERROR_EXCEPTION', 32);
+/**#@-*/
+define('PEAR_ZE2', (function_exists('version_compare') &&
+ version_compare(zend_version(), "2-dev", "ge")));
+
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ define('OS_WINDOWS', true);
+ define('OS_UNIX', false);
+ define('PEAR_OS', 'Windows');
+} else {
+ define('OS_WINDOWS', false);
+ define('OS_UNIX', true);
+ define('PEAR_OS', 'Unix'); // blatant assumption
+}
+
+$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN;
+$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE;
+$GLOBALS['_PEAR_destructor_object_list'] = array();
+$GLOBALS['_PEAR_shutdown_funcs'] = array();
+$GLOBALS['_PEAR_error_handler_stack'] = array();
+
+@ini_set('track_errors', true);
+
+/**
+ * Base class for other PEAR classes. Provides rudimentary
+ * emulation of destructors.
+ *
+ * If you want a destructor in your class, inherit PEAR and make a
+ * destructor method called _yourclassname (same name as the
+ * constructor, but with a "_" prefix). Also, in your constructor you
+ * have to call the PEAR constructor: $this->PEAR();.
+ * The destructor method will be called without parameters. Note that
+ * at in some SAPI implementations (such as Apache), any output during
+ * the request shutdown (in which destructors are called) seems to be
+ * discarded. If you need to get any debug information from your
+ * destructor, use error_log(), syslog() or something similar.
+ *
+ * IMPORTANT! To use the emulated destructors you need to create the
+ * objects by reference: $obj =& new PEAR_child;
+ *
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V. Cox <cox@idecnet.com>
+ * @author Greg Beaver <cellog@php.net>
+ * @copyright 1997-2006 The PHP Group
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PEAR
+ * @see PEAR_Error
+ * @since Class available since PHP 4.0.2
+ * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear
+ */
+class PEAR
+{
+ /**
+ * Whether to enable internal debug messages.
+ *
+ * @var bool
+ * @access private
+ */
+ var $_debug = false;
+
+ /**
+ * Default error mode for this object.
+ *
+ * @var int
+ * @access private
+ */
+ var $_default_error_mode = null;
+
+ /**
+ * Default error options used for this object when error mode
+ * is PEAR_ERROR_TRIGGER.
+ *
+ * @var int
+ * @access private
+ */
+ var $_default_error_options = null;
+
+ /**
+ * Default error handler (callback) for this object, if error mode is
+ * PEAR_ERROR_CALLBACK.
+ *
+ * @var string
+ * @access private
+ */
+ var $_default_error_handler = '';
+
+ /**
+ * Which class to use for error objects.
+ *
+ * @var string
+ * @access private
+ */
+ var $_error_class = 'PEAR_Error';
+
+ /**
+ * An array of expected errors.
+ *
+ * @var array
+ * @access private
+ */
+ var $_expected_errors = array();
+
+ /**
+ * Constructor. Registers this object in
+ * $_PEAR_destructor_object_list for destructor emulation if a
+ * destructor object exists.
+ *
+ * @param string $error_class (optional) which class to use for
+ * error objects, defaults to PEAR_Error.
+ * @access public
+ * @return void
+ */
+ function PEAR($error_class = null)
+ {
+ $classname = strtolower(get_class($this));
+ if ($this->_debug) {
+ print "PEAR constructor called, class=$classname\n";
+ }
+
+ if ($error_class !== null) {
+ $this->_error_class = $error_class;
+ }
+
+ while ($classname && strcasecmp($classname, "pear")) {
+ $destructor = "_$classname";
+ if (method_exists($this, $destructor)) {
+ global $_PEAR_destructor_object_list;
+ $_PEAR_destructor_object_list[] = &$this;
+ if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
+ register_shutdown_function("_PEAR_call_destructors");
+ $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
+ }
+ break;
+ } else {
+ $classname = get_parent_class($classname);
+ }
+ }
+ }
+
+ /**
+ * Destructor (the emulated type of...). Does nothing right now,
+ * but is included for forward compatibility, so subclass
+ * destructors should always call it.
+ *
+ * See the note in the class description about output from
+ * destructors.
+ *
+ * @access public
+ * @return void
+ */
+ function _PEAR() {
+ if ($this->_debug) {
+ printf("PEAR destructor called, class=%s\n", strtolower(get_class($this)));
+ }
+ }
+
+ /**
+ * If you have a class that's mostly/entirely static, and you need static
+ * properties, you can use this method to simulate them. Eg. in your method(s)
+ * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
+ * You MUST use a reference, or they will not persist!
+ *
+ * @access public
+ * @param string $class The calling classname, to prevent clashes
+ * @param string $var The variable to retrieve.
+ * @return mixed A reference to the variable. If not set it will be
+ * auto initialised to NULL.
+ */
+ function &getStaticProperty($class, $var)
+ {
+ static $properties;
+ if (!isset($properties[$class])) {
+ $properties[$class] = array();
+ }
+
+ if (!array_key_exists($var, $properties[$class])) {
+ $properties[$class][$var] = null;
+ }
+
+ return $properties[$class][$var];
+ }
+
+ /**
+ * Use this function to register a shutdown method for static
+ * classes.
+ *
+ * @access public
+ * @param mixed $func The function name (or array of class/method) to call
+ * @param mixed $args The arguments to pass to the function
+ * @return void
+ */
+ function registerShutdownFunc($func, $args = array())
+ {
+ // if we are called statically, there is a potential
+ // that no shutdown func is registered. Bug #6445
+ if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
+ register_shutdown_function("_PEAR_call_destructors");
+ $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
+ }
+ $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
+ }
+
+ /**
+ * Tell whether a value is a PEAR error.
+ *
+ * @param mixed $data the value to test
+ * @param int $code if $data is an error object, return true
+ * only if $code is a string and
+ * $obj->getMessage() == $code or
+ * $code is an integer and $obj->getCode() == $code
+ * @access public
+ * @return bool true if parameter is an error
+ */
+ function isError($data, $code = null)
+ {
+ if (!is_object($data)) {
+ return false;
+ }
+ if (!is_a($data, 'PEAR_Error')) {
+ return false;
+ }
+
+ if (is_null($code)) {
+ return true;
+ } elseif (is_string($code)) {
+ return $data->getMessage() == $code;
+ }
+
+ return $data->getCode() == $code;
+ }
+
+ /**
+ * Sets how errors generated by this object should be handled.
+ * Can be invoked both in objects and statically. If called
+ * statically, setErrorHandling sets the default behaviour for all
+ * PEAR objects. If called in an object, setErrorHandling sets
+ * the default behaviour for that object.
+ *
+ * @param int $mode
+ * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
+ * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
+ * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
+ *
+ * @param mixed $options
+ * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
+ * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
+ *
+ * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
+ * to be the callback function or method. A callback
+ * function is a string with the name of the function, a
+ * callback method is an array of two elements: the element
+ * at index 0 is the object, and the element at index 1 is
+ * the name of the method to call in the object.
+ *
+ * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
+ * a printf format string used when printing the error
+ * message.
+ *
+ * @access public
+ * @return void
+ * @see PEAR_ERROR_RETURN
+ * @see PEAR_ERROR_PRINT
+ * @see PEAR_ERROR_TRIGGER
+ * @see PEAR_ERROR_DIE
+ * @see PEAR_ERROR_CALLBACK
+ * @see PEAR_ERROR_EXCEPTION
+ *
+ * @since PHP 4.0.5
+ */
+ function setErrorHandling($mode = null, $options = null)
+ {
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $setmode = &$this->_default_error_mode;
+ $setoptions = &$this->_default_error_options;
+ } else {
+ $setmode = &$GLOBALS['_PEAR_default_error_mode'];
+ $setoptions = &$GLOBALS['_PEAR_default_error_options'];
+ }
+
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $setmode = $mode;
+ $setoptions = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $setmode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $setoptions = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ }
+
+ /**
+ * This method is used to tell which errors you expect to get.
+ * Expected errors are always returned with error mode
+ * PEAR_ERROR_RETURN. Expected error codes are stored in a stack,
+ * and this method pushes a new element onto it. The list of
+ * expected errors are in effect until they are popped off the
+ * stack with the popExpect() method.
+ *
+ * Note that this method can not be called statically
+ *
+ * @param mixed $code a single error code or an array of error codes to expect
+ *
+ * @return int the new depth of the "expected errors" stack
+ * @access public
+ */
+ function expectError($code = '*')
+ {
+ if (is_array($code)) {
+ array_push($this->_expected_errors, $code);
+ } else {
+ array_push($this->_expected_errors, array($code));
+ }
+ return count($this->_expected_errors);
+ }
+
+ /**
+ * This method pops one element off the expected error codes
+ * stack.
+ *
+ * @return array the list of error codes that were popped
+ */
+ function popExpect()
+ {
+ return array_pop($this->_expected_errors);
+ }
+
+ /**
+ * This method checks unsets an error code if available
+ *
+ * @param mixed error code
+ * @return bool true if the error code was unset, false otherwise
+ * @access private
+ * @since PHP 4.3.0
+ */
+ function _checkDelExpect($error_code)
+ {
+ $deleted = false;
+ foreach ($this->_expected_errors as $key => $error_array) {
+ if (in_array($error_code, $error_array)) {
+ unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
+ $deleted = true;
+ }
+
+ // clean up empty arrays
+ if (0 == count($this->_expected_errors[$key])) {
+ unset($this->_expected_errors[$key]);
+ }
+ }
+
+ return $deleted;
+ }
+
+ /**
+ * This method deletes all occurrences of the specified element from
+ * the expected error codes stack.
+ *
+ * @param mixed $error_code error code that should be deleted
+ * @return mixed list of error codes that were deleted or error
+ * @access public
+ * @since PHP 4.3.0
+ */
+ function delExpect($error_code)
+ {
+ $deleted = false;
+ if ((is_array($error_code) && (0 != count($error_code)))) {
+ // $error_code is a non-empty array here; we walk through it trying
+ // to unset all values
+ foreach ($error_code as $key => $error) {
+ $deleted = $this->_checkDelExpect($error) ? true : false;
+ }
+
+ return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
+ } elseif (!empty($error_code)) {
+ // $error_code comes alone, trying to unset it
+ if ($this->_checkDelExpect($error_code)) {
+ return true;
+ }
+
+ return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
+ }
+
+ // $error_code is empty
+ return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
+ }
+
+ /**
+ * This method is a wrapper that returns an instance of the
+ * configured error class with this object's default error
+ * handling applied. If the $mode and $options parameters are not
+ * specified, the object's defaults are used.
+ *
+ * @param mixed $message a text error message or a PEAR error object
+ *
+ * @param int $code a numeric error code (it is up to your class
+ * to define these if you want to use codes)
+ *
+ * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
+ * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
+ * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
+ *
+ * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
+ * specifies the PHP-internal error level (one of
+ * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
+ * If $mode is PEAR_ERROR_CALLBACK, this
+ * parameter specifies the callback function or
+ * method. In other error modes this parameter
+ * is ignored.
+ *
+ * @param string $userinfo If you need to pass along for example debug
+ * information, this parameter is meant for that.
+ *
+ * @param string $error_class The returned error object will be
+ * instantiated from this class, if specified.
+ *
+ * @param bool $skipmsg If true, raiseError will only pass error codes,
+ * the error message parameter will be dropped.
+ *
+ * @access public
+ * @return object a PEAR error object
+ * @see PEAR::setErrorHandling
+ * @since PHP 4.0.5
+ */
+ function &raiseError($message = null,
+ $code = null,
+ $mode = null,
+ $options = null,
+ $userinfo = null,
+ $error_class = null,
+ $skipmsg = false)
+ {
+ // The error is yet a PEAR error object
+ if (is_object($message)) {
+ $code = $message->getCode();
+ $userinfo = $message->getUserInfo();
+ $error_class = $message->getType();
+ $message->error_message_prefix = '';
+ $message = $message->getMessage();
+
+ // Make sure right data gets passed.
+ $r = new ReflectionClass($error_class);
+ $c = $r->getConstructor();
+ $p = array_shift($c->getParameters());
+ $skipmsg = ($p->getName() != 'message');
+ }
+
+ if (
+ isset($this) &&
+ isset($this->_expected_errors) &&
+ count($this->_expected_errors) > 0 &&
+ count($exp = end($this->_expected_errors))
+ ) {
+ if ($exp[0] == "*" ||
+ (is_int(reset($exp)) && in_array($code, $exp)) ||
+ (is_string(reset($exp)) && in_array($message, $exp))
+ ) {
+ $mode = PEAR_ERROR_RETURN;
+ }
+ }
+
+ // No mode given, try global ones
+ if ($mode === null) {
+ // Class error handler
+ if (isset($this) && isset($this->_default_error_mode)) {
+ $mode = $this->_default_error_mode;
+ $options = $this->_default_error_options;
+ // Global error handler
+ } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {
+ $mode = $GLOBALS['_PEAR_default_error_mode'];
+ $options = $GLOBALS['_PEAR_default_error_options'];
+ }
+ }
+
+ if ($error_class !== null) {
+ $ec = $error_class;
+ } elseif (isset($this) && isset($this->_error_class)) {
+ $ec = $this->_error_class;
+ } else {
+ $ec = 'PEAR_Error';
+ }
+
+ if (intval(PHP_VERSION) < 5) {
+ // little non-eval hack to fix bug #12147
+ include 'PEAR/FixPHP5PEARWarnings.php';
+ return $a;
+ }
+
+ if ($skipmsg) {
+ $a = new $ec($code, $mode, $options, $userinfo);
+ } else {
+ $a = new $ec($message, $code, $mode, $options, $userinfo);
+ }
+
+ return $a;
+ }
+
+ /**
+ * Simpler form of raiseError with fewer options. In most cases
+ * message, code and userinfo are enough.
+ *
+ * @param mixed $message a text error message or a PEAR error object
+ *
+ * @param int $code a numeric error code (it is up to your class
+ * to define these if you want to use codes)
+ *
+ * @param string $userinfo If you need to pass along for example debug
+ * information, this parameter is meant for that.
+ *
+ * @access public
+ * @return object a PEAR error object
+ * @see PEAR::raiseError
+ */
+ function &throwError($message = null, $code = null, $userinfo = null)
+ {
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $a = &$this->raiseError($message, $code, null, null, $userinfo);
+ return $a;
+ }
+
+ $a = &PEAR::raiseError($message, $code, null, null, $userinfo);
+ return $a;
+ }
+
+ function staticPushErrorHandling($mode, $options = null)
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ $def_mode = &$GLOBALS['_PEAR_default_error_mode'];
+ $def_options = &$GLOBALS['_PEAR_default_error_options'];
+ $stack[] = array($def_mode, $def_options);
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $def_mode = $mode;
+ $def_options = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $def_mode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $def_options = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ $stack[] = array($mode, $options);
+ return true;
+ }
+
+ function staticPopErrorHandling()
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ $setmode = &$GLOBALS['_PEAR_default_error_mode'];
+ $setoptions = &$GLOBALS['_PEAR_default_error_options'];
+ array_pop($stack);
+ list($mode, $options) = $stack[sizeof($stack) - 1];
+ array_pop($stack);
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $setmode = $mode;
+ $setoptions = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $setmode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $setoptions = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ return true;
+ }
+
+ /**
+ * Push a new error handler on top of the error handler options stack. With this
+ * you can easily override the actual error handler for some code and restore
+ * it later with popErrorHandling.
+ *
+ * @param mixed $mode (same as setErrorHandling)
+ * @param mixed $options (same as setErrorHandling)
+ *
+ * @return bool Always true
+ *
+ * @see PEAR::setErrorHandling
+ */
+ function pushErrorHandling($mode, $options = null)
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $def_mode = &$this->_default_error_mode;
+ $def_options = &$this->_default_error_options;
+ } else {
+ $def_mode = &$GLOBALS['_PEAR_default_error_mode'];
+ $def_options = &$GLOBALS['_PEAR_default_error_options'];
+ }
+ $stack[] = array($def_mode, $def_options);
+
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $this->setErrorHandling($mode, $options);
+ } else {
+ PEAR::setErrorHandling($mode, $options);
+ }
+ $stack[] = array($mode, $options);
+ return true;
+ }
+
+ /**
+ * Pop the last error handler used
+ *
+ * @return bool Always true
+ *
+ * @see PEAR::pushErrorHandling
+ */
+ function popErrorHandling()
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ array_pop($stack);
+ list($mode, $options) = $stack[sizeof($stack) - 1];
+ array_pop($stack);
+ if (isset($this) && is_a($this, 'PEAR')) {
+ $this->setErrorHandling($mode, $options);
+ } else {
+ PEAR::setErrorHandling($mode, $options);
+ }
+ return true;
+ }
+
+ /**
+ * OS independent PHP extension load. Remember to take care
+ * on the correct extension name for case sensitive OSes.
+ *
+ * @param string $ext The extension name
+ * @return bool Success or not on the dl() call
+ */
+ static function loadExtension($ext)
+ {
+ if (extension_loaded($ext)) {
+ return true;
+ }
+
+ // if either returns true dl() will produce a FATAL error, stop that
+ if (
+ function_exists('dl') === false ||
+ ini_get('enable_dl') != 1 ||
+ ini_get('safe_mode') == 1
+ ) {
+ return false;
+ }
+
+ if (OS_WINDOWS) {
+ $suffix = '.dll';
+ } elseif (PHP_OS == 'HP-UX') {
+ $suffix = '.sl';
+ } elseif (PHP_OS == 'AIX') {
+ $suffix = '.a';
+ } elseif (PHP_OS == 'OSX') {
+ $suffix = '.bundle';
+ } else {
+ $suffix = '.so';
+ }
+
+ return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
+ }
+}
+
+if (PEAR_ZE2) {
+ /**
+ * This is only meant for PHP 5 to get rid of certain strict warning
+ * that doesn't get hidden since it's in the shutdown function
+ */
+ class PEAR5
+ {
+ /**
+ * If you have a class that's mostly/entirely static, and you need static
+ * properties, you can use this method to simulate them. Eg. in your method(s)
+ * do this: $myVar = &PEAR5::getStaticProperty('myclass', 'myVar');
+ * You MUST use a reference, or they will not persist!
+ *
+ * @access public
+ * @param string $class The calling classname, to prevent clashes
+ * @param string $var The variable to retrieve.
+ * @return mixed A reference to the variable. If not set it will be
+ * auto initialised to NULL.
+ */
+ static function &getStaticProperty($class, $var)
+ {
+ static $properties;
+ if (!isset($properties[$class])) {
+ $properties[$class] = array();
+ }
+
+ if (!array_key_exists($var, $properties[$class])) {
+ $properties[$class][$var] = null;
+ }
+
+ return $properties[$class][$var];
+ }
+ }
+}
+
+function _PEAR_call_destructors()
+{
+ global $_PEAR_destructor_object_list;
+ if (is_array($_PEAR_destructor_object_list) &&
+ sizeof($_PEAR_destructor_object_list))
+ {
+ reset($_PEAR_destructor_object_list);
+ if (PEAR_ZE2) {
+ $destructLifoExists = PEAR5::getStaticProperty('PEAR', 'destructlifo');
+ } else {
+ $destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo');
+ }
+
+ if ($destructLifoExists) {
+ $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
+ }
+
+ while (list($k, $objref) = each($_PEAR_destructor_object_list)) {
+ $classname = get_class($objref);
+ while ($classname) {
+ $destructor = "_$classname";
+ if (method_exists($objref, $destructor)) {
+ $objref->$destructor();
+ break;
+ } else {
+ $classname = get_parent_class($classname);
+ }
+ }
+ }
+ // Empty the object list to ensure that destructors are
+ // not called more than once.
+ $_PEAR_destructor_object_list = array();
+ }
+
+ // Now call the shutdown functions
+ if (
+ isset($GLOBALS['_PEAR_shutdown_funcs']) &&
+ is_array($GLOBALS['_PEAR_shutdown_funcs']) &&
+ !empty($GLOBALS['_PEAR_shutdown_funcs'])
+ ) {
+ foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
+ call_user_func_array($value[0], $value[1]);
+ }
+ }
+}
+
+/**
+ * Standard PEAR error class for PHP 4
+ *
+ * This class is superseded by {@link PEAR_Exception} in PHP 5
+ *
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V. Cox <cox@idecnet.com>
+ * @author Gregory Beaver <cellog@php.net>
+ * @copyright 1997-2006 The PHP Group
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/manual/en/core.pear.pear-error.php
+ * @see PEAR::raiseError(), PEAR::throwError()
+ * @since Class available since PHP 4.0.2
+ */
+class PEAR_Error
+{
+ var $error_message_prefix = '';
+ var $mode = PEAR_ERROR_RETURN;
+ var $level = E_USER_NOTICE;
+ var $code = -1;
+ var $message = '';
+ var $userinfo = '';
+ var $backtrace = null;
+
+ /**
+ * PEAR_Error constructor
+ *
+ * @param string $message message
+ *
+ * @param int $code (optional) error code
+ *
+ * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN,
+ * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
+ * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
+ *
+ * @param mixed $options (optional) error level, _OR_ in the case of
+ * PEAR_ERROR_CALLBACK, the callback function or object/method
+ * tuple.
+ *
+ * @param string $userinfo (optional) additional user/debug info
+ *
+ * @access public
+ *
+ */
+ function PEAR_Error($message = 'unknown error', $code = null,
+ $mode = null, $options = null, $userinfo = null)
+ {
+ if ($mode === null) {
+ $mode = PEAR_ERROR_RETURN;
+ }
+ $this->message = $message;
+ $this->code = $code;
+ $this->mode = $mode;
+ $this->userinfo = $userinfo;
+
+ if (PEAR_ZE2) {
+ $skiptrace = PEAR5::getStaticProperty('PEAR_Error', 'skiptrace');
+ } else {
+ $skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace');
+ }
+
+ if (!$skiptrace) {
+ $this->backtrace = debug_backtrace();
+ if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) {
+ unset($this->backtrace[0]['object']);
+ }
+ }
+
+ if ($mode & PEAR_ERROR_CALLBACK) {
+ $this->level = E_USER_NOTICE;
+ $this->callback = $options;
+ } else {
+ if ($options === null) {
+ $options = E_USER_NOTICE;
+ }
+
+ $this->level = $options;
+ $this->callback = null;
+ }
+
+ if ($this->mode & PEAR_ERROR_PRINT) {
+ if (is_null($options) || is_int($options)) {
+ $format = "%s";
+ } else {
+ $format = $options;
+ }
+
+ printf($format, $this->getMessage());
+ }
+
+ if ($this->mode & PEAR_ERROR_TRIGGER) {
+ trigger_error($this->getMessage(), $this->level);
+ }
+
+ if ($this->mode & PEAR_ERROR_DIE) {
+ $msg = $this->getMessage();
+ if (is_null($options) || is_int($options)) {
+ $format = "%s";
+ if (substr($msg, -1) != "\n") {
+ $msg .= "\n";
+ }
+ } else {
+ $format = $options;
+ }
+ die(sprintf($format, $msg));
+ }
+
+ if ($this->mode & PEAR_ERROR_CALLBACK && is_callable($this->callback)) {
+ call_user_func($this->callback, $this);
+ }
+
+ if ($this->mode & PEAR_ERROR_EXCEPTION) {
+ trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);
+ eval('$e = new Exception($this->message, $this->code);throw($e);');
+ }
+ }
+
+ /**
+ * Get the error mode from an error object.
+ *
+ * @return int error mode
+ * @access public
+ */
+ function getMode()
+ {
+ return $this->mode;
+ }
+
+ /**
+ * Get the callback function/method from an error object.
+ *
+ * @return mixed callback function or object/method array
+ * @access public
+ */
+ function getCallback()
+ {
+ return $this->callback;
+ }
+
+ /**
+ * Get the error message from an error object.
+ *
+ * @return string full error message
+ * @access public
+ */
+ function getMessage()
+ {
+ return ($this->error_message_prefix . $this->message);
+ }
+
+ /**
+ * Get error code from an error object
+ *
+ * @return int error code
+ * @access public
+ */
+ function getCode()
+ {
+ return $this->code;
+ }
+
+ /**
+ * Get the name of this error/exception.
+ *
+ * @return string error/exception name (type)
+ * @access public
+ */
+ function getType()
+ {
+ return get_class($this);
+ }
+
+ /**
+ * Get additional user-supplied information.
+ *
+ * @return string user-supplied information
+ * @access public
+ */
+ function getUserInfo()
+ {
+ return $this->userinfo;
+ }
+
+ /**
+ * Get additional debug information supplied by the application.
+ *
+ * @return string debug information
+ * @access public
+ */
+ function getDebugInfo()
+ {
+ return $this->getUserInfo();
+ }
+
+ /**
+ * Get the call backtrace from where the error was generated.
+ * Supported with PHP 4.3.0 or newer.
+ *
+ * @param int $frame (optional) what frame to fetch
+ * @return array Backtrace, or NULL if not available.
+ * @access public
+ */
+ function getBacktrace($frame = null)
+ {
+ if (defined('PEAR_IGNORE_BACKTRACE')) {
+ return null;
+ }
+ if ($frame === null) {
+ return $this->backtrace;
+ }
+ return $this->backtrace[$frame];
+ }
+
+ function addUserInfo($info)
+ {
+ if (empty($this->userinfo)) {
+ $this->userinfo = $info;
+ } else {
+ $this->userinfo .= " ** $info";
+ }
+ }
+
+ function __toString()
+ {
+ return $this->getMessage();
+ }
+
+ /**
+ * Make a string representation of this object.
+ *
+ * @return string a string with an object summary
+ * @access public
+ */
+ function toString()
+ {
+ $modes = array();
+ $levels = array(E_USER_NOTICE => 'notice',
+ E_USER_WARNING => 'warning',
+ E_USER_ERROR => 'error');
+ if ($this->mode & PEAR_ERROR_CALLBACK) {
+ if (is_array($this->callback)) {
+ $callback = (is_object($this->callback[0]) ?
+ strtolower(get_class($this->callback[0])) :
+ $this->callback[0]) . '::' .
+ $this->callback[1];
+ } else {
+ $callback = $this->callback;
+ }
+ return sprintf('[%s: message="%s" code=%d mode=callback '.
+ 'callback=%s prefix="%s" info="%s"]',
+ strtolower(get_class($this)), $this->message, $this->code,
+ $callback, $this->error_message_prefix,
+ $this->userinfo);
+ }
+ if ($this->mode & PEAR_ERROR_PRINT) {
+ $modes[] = 'print';
+ }
+ if ($this->mode & PEAR_ERROR_TRIGGER) {
+ $modes[] = 'trigger';
+ }
+ if ($this->mode & PEAR_ERROR_DIE) {
+ $modes[] = 'die';
+ }
+ if ($this->mode & PEAR_ERROR_RETURN) {
+ $modes[] = 'return';
+ }
+ return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.
+ 'prefix="%s" info="%s"]',
+ strtolower(get_class($this)), $this->message, $this->code,
+ implode("|", $modes), $levels[$this->level],
+ $this->error_message_prefix,
+ $this->userinfo);
+ }
+}
+
+/*
+ * Local Variables:
+ * mode: php
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/src/etc/inc/auth.inc b/src/etc/inc/auth.inc
new file mode 100644
index 0000000..3c0acaa
--- /dev/null
+++ b/src/etc/inc/auth.inc
@@ -0,0 +1,1627 @@
+<?php
+/* $Id$ */
+/*
+ Copyright (C) 2010 Ermal Luçi
+ All rights reserved.
+
+ Copyright (C) 2007, 2008 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Copyright (C) 2005-2006 Bill Marquette <bill.marquette@gmail.com>
+ All rights reserved.
+
+ Copyright (C) 2006 Paul Taylor <paultaylor@winn-dixie.com>.
+ All rights reserved.
+
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_BUILDER_BINARIES: /usr/sbin/pw /bin/cp
+ pfSense_MODULE: auth
+*/
+
+/*
+ * NOTE : Portions of the mschapv2 support was based on the BSD licensed CHAP.php
+ * file courtesy of Michael Retterklieber.
+ */
+if (!$do_not_include_config_gui_inc) {
+ require_once("config.gui.inc");
+}
+
+// Will be changed to false if security checks fail
+$security_passed = true;
+
+/* If this function doesn't exist, we're being called from Captive Portal or
+ another internal subsystem which does not include authgui.inc */
+if (function_exists("display_error_form") && !isset($config['system']['webgui']['nodnsrebindcheck'])) {
+ /* DNS ReBinding attack prevention. https://redmine.pfsense.org/issues/708 */
+ $found_host = false;
+
+ /* Either a IPv6 address with or without a alternate port */
+ if (strstr($_SERVER['HTTP_HOST'], "]")) {
+ $http_host_port = explode("]", $_SERVER['HTTP_HOST']);
+ /* v6 address has more parts, drop the last part */
+ if (count($http_host_port) > 1) {
+ array_pop($http_host_port);
+ $http_host = str_replace(array("[", "]"), "", implode(":", $http_host_port));
+ } else {
+ $http_host = str_replace(array("[", "]"), "", implode(":", $http_host_port));
+ }
+ } else {
+ $http_host = explode(":", $_SERVER['HTTP_HOST']);
+ $http_host = $http_host[0];
+ }
+ if (is_ipaddr($http_host) or $_SERVER['SERVER_ADDR'] == "127.0.0.1" or
+ strcasecmp($http_host, "localhost") == 0 or $_SERVER['SERVER_ADDR'] == "::1") {
+ $found_host = true;
+ }
+ if (strcasecmp($http_host, $config['system']['hostname'] . "." . $config['system']['domain']) == 0 or
+ strcasecmp($http_host, $config['system']['hostname']) == 0) {
+ $found_host = true;
+ }
+
+ if (is_array($config['dyndnses']['dyndns']) && !$found_host) {
+ foreach ($config['dyndnses']['dyndns'] as $dyndns) {
+ if (strcasecmp($dyndns['host'], $http_host) == 0) {
+ $found_host = true;
+ break;
+ }
+ }
+ }
+
+ if (is_array($config['dnsupdates']['dnsupdate']) && !$found_host) {
+ foreach ($config['dnsupdates']['dnsupdate'] as $rfc2136) {
+ if (strcasecmp($rfc2136['host'], $http_host) == 0) {
+ $found_host = true;
+ break;
+ }
+ }
+ }
+
+ if (!empty($config['system']['webgui']['althostnames']) && !$found_host) {
+ $althosts = explode(" ", $config['system']['webgui']['althostnames']);
+ foreach ($althosts as $ah) {
+ if (strcasecmp($ah, $http_host) == 0 or strcasecmp($ah, $_SERVER['SERVER_ADDR']) == 0) {
+ $found_host = true;
+ break;
+ }
+ }
+ }
+
+ if ($found_host == false) {
+ if (!security_checks_disabled()) {
+ display_error_form("501", gettext("Potential DNS Rebind attack detected, see http://en.wikipedia.org/wiki/DNS_rebinding<br />Try accessing the router by IP address instead of by hostname."));
+ exit;
+ }
+ $security_passed = false;
+ }
+}
+
+// If the HTTP_REFERER is something other than ourselves then disallow.
+if (function_exists("display_error_form") && !isset($config['system']['webgui']['nohttpreferercheck'])) {
+ if ($_SERVER['HTTP_REFERER']) {
+ if (file_exists("{$g['tmp_path']}/setupwizard_lastreferrer")) {
+ if ($_SERVER['HTTP_REFERER'] == file_get_contents("{$g['tmp_path']}/setupwizard_lastreferrer")) {
+ unlink("{$g['tmp_path']}/setupwizard_lastreferrer");
+ header("Refresh: 1; url=index.php");
+ echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
+ echo "<html><head><title>" . gettext("Redirecting...") . "</title></head><body>" . gettext("Redirecting to the dashboard...") . "</body></html>";
+ exit;
+ }
+ }
+ $found_host = false;
+ $referrer_host = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
+ $referrer_host = str_replace(array("[", "]"), "", $referrer_host);
+ if ($referrer_host) {
+ if (strcasecmp($referrer_host, $config['system']['hostname'] . "." . $config['system']['domain']) == 0 ||
+ strcasecmp($referrer_host, $config['system']['hostname']) == 0) {
+ $found_host = true;
+ }
+
+ if (!empty($config['system']['webgui']['althostnames']) && !$found_host) {
+ $althosts = explode(" ", $config['system']['webgui']['althostnames']);
+ foreach ($althosts as $ah) {
+ if (strcasecmp($referrer_host, $ah) == 0) {
+ $found_host = true;
+ break;
+ }
+ }
+ }
+
+ if (is_array($config['dyndnses']['dyndns']) && !$found_host) {
+ foreach ($config['dyndnses']['dyndns'] as $dyndns) {
+ if (strcasecmp($dyndns['host'], $referrer_host) == 0) {
+ $found_host = true;
+ break;
+ }
+ }
+ }
+
+ if (is_array($config['dnsupdates']['dnsupdate']) && !$found_host) {
+ foreach ($config['dnsupdates']['dnsupdate'] as $rfc2136) {
+ if (strcasecmp($rfc2136['host'], $referrer_host) == 0) {
+ $found_host = true;
+ break;
+ }
+ }
+ }
+
+ if (!$found_host) {
+ $interface_list_ips = get_configured_ip_addresses();
+ foreach ($interface_list_ips as $ilips) {
+ if (strcasecmp($referrer_host, $ilips) == 0) {
+ $found_host = true;
+ break;
+ }
+ }
+ $interface_list_ipv6s = get_configured_ipv6_addresses();
+ foreach ($interface_list_ipv6s as $ilipv6s) {
+ if (strcasecmp($referrer_host, $ilipv6s) == 0) {
+ $found_host = true;
+ break;
+ }
+ }
+ if ($referrer_host == "127.0.0.1" || $referrer_host == "localhost") {
+ // allow SSH port forwarded connections and links from localhost
+ $found_host = true;
+ }
+ }
+ }
+ if ($found_host == false) {
+ if (!security_checks_disabled()) {
+ display_error_form("501", "An HTTP_REFERER was detected other than what is defined in System -> Advanced (" . htmlspecialchars($_SERVER['HTTP_REFERER']) . "). You can disable this check if needed in System -> Advanced -> Admin.");
+ exit;
+ }
+ $security_passed = false;
+ }
+ } else {
+ $security_passed = false;
+ }
+}
+
+if (function_exists("display_error_form") && $security_passed) {
+ /* Security checks passed, so it should be OK to turn them back on */
+ restore_security_checks();
+}
+unset($security_passed);
+
+$groupindex = index_groups();
+$userindex = index_users();
+
+function index_groups() {
+ global $g, $debug, $config, $groupindex;
+
+ $groupindex = array();
+
+ if (is_array($config['system']['group'])) {
+ $i = 0;
+ foreach ($config['system']['group'] as $groupent) {
+ $groupindex[$groupent['name']] = $i;
+ $i++;
+ }
+ }
+
+ return ($groupindex);
+}
+
+function index_users() {
+ global $g, $debug, $config;
+
+ if (is_array($config['system']['user'])) {
+ $i = 0;
+ foreach ($config['system']['user'] as $userent) {
+ $userindex[$userent['name']] = $i;
+ $i++;
+ }
+ }
+
+ return ($userindex);
+}
+
+function & getUserEntry($name) {
+ global $debug, $config, $userindex;
+ if (isset($userindex[$name])) {
+ return $config['system']['user'][$userindex[$name]];
+ }
+}
+
+function & getUserEntryByUID($uid) {
+ global $debug, $config;
+
+ if (is_array($config['system']['user'])) {
+ foreach ($config['system']['user'] as & $user) {
+ if ($user['uid'] == $uid) {
+ return $user;
+ }
+ }
+ }
+
+ return false;
+}
+
+function & getGroupEntry($name) {
+ global $debug, $config, $groupindex;
+ if (isset($groupindex[$name])) {
+ return $config['system']['group'][$groupindex[$name]];
+ }
+}
+
+function & getGroupEntryByGID($gid) {
+ global $debug, $config;
+
+ if (is_array($config['system']['group'])) {
+ foreach ($config['system']['group'] as & $group) {
+ if ($group['gid'] == $gid) {
+ return $group;
+ }
+ }
+ }
+
+ return false;
+}
+
+function get_user_privileges(& $user) {
+
+ $privs = $user['priv'];
+ if (!is_array($privs)) {
+ $privs = array();
+ }
+
+ $names = local_user_get_groups($user, true);
+
+ foreach ($names as $name) {
+ $group = getGroupEntry($name);
+ if (is_array($group['priv'])) {
+ $privs = array_merge($privs, $group['priv']);
+ }
+ }
+
+ return $privs;
+}
+
+function userHasPrivilege($userent, $privid = false) {
+
+ if (!$privid || !is_array($userent)) {
+ return false;
+ }
+
+ $privs = get_user_privileges($userent);
+
+ if (!is_array($privs)) {
+ return false;
+ }
+
+ if (!in_array($privid, $privs)) {
+ return false;
+ }
+
+ return true;
+}
+
+function local_backed($username, $passwd) {
+
+ $user = getUserEntry($username);
+ if (!$user) {
+ return false;
+ }
+
+ if (is_account_disabled($username) || is_account_expired($username)) {
+ return false;
+ }
+
+ if ($user['password']) {
+ if (crypt($passwd, $user['password']) == $user['password']) {
+ return true;
+ }
+ }
+
+ if ($user['md5-hash']) {
+ if (md5($passwd) == $user['md5-hash']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function local_sync_accounts() {
+ global $debug, $config;
+ conf_mount_rw();
+
+ /* remove local users to avoid uid conflicts */
+ $fd = popen("/usr/sbin/pw usershow -a", "r");
+ if ($fd) {
+ while (!feof($fd)) {
+ $line = explode(":", fgets($fd));
+ if (((!strncmp($line[0], "_", 1)) || ($line[2] < 2000) || ($line[2] > 65000)) && ($line[0] != "admin")) {
+ continue;
+ }
+ /*
+ * If a crontab was created to user, pw userdel will be interactive and
+ * can cause issues. Just remove crontab before run it when necessary
+ */
+ unlink_if_exists("/var/cron/tabs/{$line[0]}");
+ $cmd = "/usr/sbin/pw userdel -n '{$line[0]}'";
+ if ($debug) {
+ log_error(sprintf(gettext("Running: %s"), $cmd));
+ }
+ mwexec($cmd);
+ }
+ pclose($fd);
+ }
+
+ /* remove local groups to avoid gid conflicts */
+ $gids = array();
+ $fd = popen("/usr/sbin/pw groupshow -a", "r");
+ if ($fd) {
+ while (!feof($fd)) {
+ $line = explode(":", fgets($fd));
+ if (!strncmp($line[0], "_", 1)) {
+ continue;
+ }
+ if ($line[2] < 2000) {
+ continue;
+ }
+ if ($line[2] > 65000) {
+ continue;
+ }
+ $cmd = "/usr/sbin/pw groupdel {$line[2]}";
+ if ($debug) {
+ log_error(sprintf(gettext("Running: %s"), $cmd));
+ }
+ mwexec($cmd);
+ }
+ pclose($fd);
+ }
+
+ /* make sure the all group exists */
+ $allgrp = getGroupEntryByGID(1998);
+ local_group_set($allgrp, true);
+
+ /* sync all local users */
+ if (is_array($config['system']['user'])) {
+ foreach ($config['system']['user'] as $user) {
+ local_user_set($user);
+ }
+ }
+
+ /* sync all local groups */
+ if (is_array($config['system']['group'])) {
+ foreach ($config['system']['group'] as $group) {
+ local_group_set($group);
+ }
+ }
+
+ conf_mount_ro();
+
+}
+
+function local_user_set(& $user) {
+ global $g, $debug;
+
+ if (empty($user['password'])) {
+ log_error("There is something wrong in your config because user {$user['name']} password is missing!");
+ return;
+ }
+
+ conf_mount_rw();
+
+ $home_base = "/home/";
+ $user_uid = $user['uid'];
+ $user_name = $user['name'];
+ $user_home = "{$home_base}{$user_name}";
+ $user_shell = "/etc/rc.initial";
+ $user_group = "nobody";
+
+ // Ensure $home_base exists and is writable
+ if (!is_dir($home_base)) {
+ mkdir($home_base, 0755);
+ }
+
+ $lock_account = false;
+ /* configure shell type */
+ /* Cases here should be ordered by most privileged to least privileged. */
+ if (userHasPrivilege($user, "user-shell-access") || userHasPrivilege($user, "page-all")) {
+ $user_shell = "/bin/tcsh";
+ } elseif (userHasPrivilege($user, "user-copy-files")) {
+ $user_shell = "/usr/local/bin/scponly";
+ } elseif (userHasPrivilege($user, "user-ssh-tunnel")) {
+ $user_shell = "/usr/local/sbin/ssh_tunnel_shell";
+ } elseif (userHasPrivilege($user, "user-ipsec-xauth-dialin")) {
+ $user_shell = "/sbin/nologin";
+ } else {
+ $user_shell = "/sbin/nologin";
+ $lock_account = true;
+ }
+
+ /* Lock out disabled or expired users, unless it's root/admin. */
+ if ((is_account_disabled($user_name) || is_account_expired($user_name)) && ($user_uid != 0)) {
+ $user_shell = "/sbin/nologin";
+ $lock_account = true;
+ }
+
+ /* root user special handling */
+ if ($user_uid == 0) {
+ $cmd = "/usr/sbin/pw usermod -q -n root -s /bin/sh -H 0";
+ if ($debug) {
+ log_error(sprintf(gettext("Running: %s"), $cmd));
+ }
+ $fd = popen($cmd, "w");
+ fwrite($fd, $user['password']);
+ pclose($fd);
+ $user_group = "wheel";
+ $user_home = "/root";
+ $user_shell = "/etc/rc.initial";
+ }
+
+ /* read from pw db */
+ $fd = popen("/usr/sbin/pw usershow -n {$user_name} 2>&1", "r");
+ $pwread = fgets($fd);
+ pclose($fd);
+ $userattrs = explode(":", trim($pwread));
+
+ /* determine add or mod */
+ if (($userattrs[0] != $user['name']) || (!strncmp($pwread, "pw:", 3))) {
+ $user_op = "useradd -m -k /etc/skel -o";
+ } else {
+ $user_op = "usermod";
+ }
+
+ $comment = str_replace(array(":", "!", "@"), " ", $user['descr']);
+ /* add or mod pw db */
+ $cmd = "/usr/sbin/pw {$user_op} -q -u {$user_uid} -n {$user_name}".
+ " -g {$user_group} -s {$user_shell} -d {$user_home}".
+ " -c ".escapeshellarg($comment)." -H 0 2>&1";
+
+ if ($debug) {
+ log_error(sprintf(gettext("Running: %s"), $cmd));
+ }
+ $fd = popen($cmd, "w");
+ fwrite($fd, $user['password']);
+ pclose($fd);
+
+ /* create user directory if required */
+ if (!is_dir($user_home)) {
+ mkdir($user_home, 0700);
+ }
+ @chown($user_home, $user_name);
+ @chgrp($user_home, $user_group);
+
+ /* write out ssh authorized key file */
+ if ($user['authorizedkeys']) {
+ if (!is_dir("{$user_home}/.ssh")) {
+ @mkdir("{$user_home}/.ssh", 0700);
+ @chown("{$user_home}/.ssh", $user_name);
+ }
+ $keys = base64_decode($user['authorizedkeys']);
+ @file_put_contents("{$user_home}/.ssh/authorized_keys", $keys);
+ @chown("{$user_home}/.ssh/authorized_keys", $user_name);
+ } else {
+ unlink_if_exists("{$user_home}/.ssh/authorized_keys");
+ }
+
+ $un = $lock_account ? "" : "un";
+ exec("/usr/sbin/pw {$un}lock {$user_name} -q");
+
+ conf_mount_ro();
+}
+
+function local_user_del($user) {
+ global $debug;
+
+ /* remove all memberships */
+ local_user_set_groups($user);
+
+ /* Don't remove /root */
+ if ($user['uid'] != 0) {
+ $rmhome = "-r";
+ }
+
+ /* read from pw db */
+ $fd = popen("/usr/sbin/pw usershow -n {$user['name']} 2>&1", "r");
+ $pwread = fgets($fd);
+ pclose($fd);
+ $userattrs = explode(":", trim($pwread));
+
+ if ($userattrs[0] != $user['name']) {
+ log_error("Tried to remove user {$user['name']} but got user {$userattrs[0]} instead. Bailing.");
+ return;
+ }
+
+ /* delete from pw db */
+ $cmd = "/usr/sbin/pw userdel -n {$user['name']} {$rmhome}";
+
+ if ($debug) {
+ log_error(sprintf(gettext("Running: %s"), $cmd));
+ }
+ mwexec($cmd);
+
+ /* Delete user from groups needs a call to write_config() */
+ local_group_del_user($user);
+}
+
+function local_user_set_password(&$user, $password) {
+
+ $user['password'] = crypt($password);
+ $user['md5-hash'] = md5($password);
+
+ // Converts ascii to unicode.
+ $astr = (string) $password;
+ $ustr = '';
+ for ($i = 0; $i < strlen($astr); $i++) {
+ $a = ord($astr{$i}) << 8;
+ $ustr .= sprintf("%X", $a);
+ }
+
+}
+
+function local_user_get_groups($user, $all = false) {
+ global $debug, $config;
+
+ $groups = array();
+ if (!is_array($config['system']['group'])) {
+ return $groups;
+ }
+
+ foreach ($config['system']['group'] as $group) {
+ if ($all || (!$all && ($group['name'] != "all"))) {
+ if (is_array($group['member'])) {
+ if (in_array($user['uid'], $group['member'])) {
+ $groups[] = $group['name'];
+ }
+ }
+ }
+ }
+
+ if ($all) {
+ $groups[] = "all";
+ }
+
+ sort($groups);
+
+ return $groups;
+
+}
+
+function local_user_set_groups($user, $new_groups = NULL) {
+ global $debug, $config, $groupindex;
+
+ if (!is_array($config['system']['group'])) {
+ return;
+ }
+
+ $cur_groups = local_user_get_groups($user, true);
+ $mod_groups = array();
+
+ if (!is_array($new_groups)) {
+ $new_groups = array();
+ }
+
+ if (!is_array($cur_groups)) {
+ $cur_groups = array();
+ }
+
+ /* determine which memberships to add */
+ foreach ($new_groups as $groupname) {
+ if ($groupname == '' || in_array($groupname, $cur_groups)) {
+ continue;
+ }
+ $group = & $config['system']['group'][$groupindex[$groupname]];
+ $group['member'][] = $user['uid'];
+ $mod_groups[] = $group;
+ }
+ unset($group);
+
+ /* determine which memberships to remove */
+ foreach ($cur_groups as $groupname) {
+ if (in_array($groupname, $new_groups)) {
+ continue;
+ }
+ if (!isset($config['system']['group'][$groupindex[$groupname]])) {
+ continue;
+ }
+ $group = & $config['system']['group'][$groupindex[$groupname]];
+ if (is_array($group['member'])) {
+ $index = array_search($user['uid'], $group['member']);
+ array_splice($group['member'], $index, 1);
+ $mod_groups[] = $group;
+ }
+ }
+ unset($group);
+
+ /* sync all modified groups */
+ foreach ($mod_groups as $group) {
+ local_group_set($group);
+ }
+}
+
+function local_group_del_user($user) {
+ global $config;
+
+ if (!is_array($config['system']['group'])) {
+ return;
+ }
+
+ foreach ($config['system']['group'] as $group) {
+ if (is_array($group['member'])) {
+ foreach ($group['member'] as $idx => $uid) {
+ if ($user['uid'] == $uid) {
+ unset($config['system']['group']['member'][$idx]);
+ }
+ }
+ }
+ }
+}
+
+function local_group_set($group, $reset = false) {
+ global $debug;
+
+ $group_name = $group['name'];
+ $group_gid = $group['gid'];
+ $group_members = '';
+ if (!$reset && !empty($group['member']) && count($group['member']) > 0) {
+ $group_members = implode(",", $group['member']);
+ }
+
+ if (empty($group_name)) {
+ return;
+ }
+
+ /* read from group db */
+ $fd = popen("/usr/sbin/pw groupshow {$group_name} 2>&1", "r");
+ $pwread = fgets($fd);
+ pclose($fd);
+
+ /* determine add or mod */
+ if (!strncmp($pwread, "pw:", 3)) {
+ $group_op = "groupadd";
+ } else {
+ $group_op = "groupmod";
+ }
+
+ /* add or mod group db */
+ $cmd = "/usr/sbin/pw {$group_op} {$group_name} -g {$group_gid} -M '{$group_members}' 2>&1";
+
+ if ($debug) {
+ log_error(sprintf(gettext("Running: %s"), $cmd));
+ }
+ mwexec($cmd);
+
+}
+
+function local_group_del($group) {
+ global $debug;
+
+ /* delete from group db */
+ $cmd = "/usr/sbin/pw groupdel {$group['name']}";
+
+ if ($debug) {
+ log_error(sprintf(gettext("Running: %s"), $cmd));
+ }
+ mwexec($cmd);
+}
+
+function ldap_test_connection($authcfg) {
+ global $debug, $config, $g;
+
+ if ($authcfg) {
+ if (strstr($authcfg['ldap_urltype'], "Standard")) {
+ $ldapproto = "ldap";
+ } else {
+ $ldapproto = "ldaps";
+ }
+ $ldapserver = "{$ldapproto}://" . ldap_format_host($authcfg['host']);
+ $ldapport = $authcfg['ldap_port'];
+ if (!empty($ldapport)) {
+ $ldapserver .= ":{$ldapport}";
+ }
+ $ldapbasedn = $authcfg['ldap_basedn'];
+ $ldapbindun = $authcfg['ldap_binddn'];
+ $ldapbindpw = $authcfg['ldap_bindpw'];
+ } else {
+ return false;
+ }
+
+ /* first check if there is even an LDAP server populated */
+ if (!$ldapserver) {
+ return false;
+ }
+
+ /* Setup CA environment if needed. */
+ ldap_setup_caenv($authcfg);
+
+ /* connect and see if server is up */
+ $error = false;
+ if (!($ldap = ldap_connect($ldapserver))) {
+ $error = true;
+ }
+
+ if ($error == true) {
+ log_error(sprintf(gettext("ERROR! Could not connect to server %s."), $ldapname));
+ return false;
+ }
+
+ return true;
+}
+
+function ldap_setup_caenv($authcfg) {
+ global $g;
+ require_once("certs.inc");
+
+ unset($caref);
+ if (empty($authcfg['ldap_caref']) || !strstr($authcfg['ldap_urltype'], "SSL")) {
+ putenv('LDAPTLS_REQCERT=never');
+ return;
+ } else {
+ $caref = lookup_ca($authcfg['ldap_caref']);
+ if (!$caref) {
+ log_error(sprintf(gettext("LDAP: Could not lookup CA by reference for host %s."), $authcfg['ldap_caref']));
+ /* XXX: Prevent for credential leaking since we cannot setup the CA env. Better way? */
+ putenv('LDAPTLS_REQCERT=hard');
+ return;
+ }
+ if (!is_dir("{$g['varrun_path']}/certs")) {
+ @mkdir("{$g['varrun_path']}/certs");
+ }
+ if (file_exists("{$g['varrun_path']}/certs/{$caref['refid']}.ca")) {
+ @unlink("{$g['varrun_path']}/certs/{$caref['refid']}.ca");
+ }
+ file_put_contents("{$g['varrun_path']}/certs/{$caref['refid']}.ca", base64_decode($caref['crt']));
+ @chmod("{$g['varrun_path']}/certs/{$caref['refid']}.ca", 0600);
+ putenv('LDAPTLS_REQCERT=hard');
+ /* XXX: Probably even the hashed link should be created for this? */
+ putenv("LDAPTLS_CACERTDIR={$g['varrun_path']}/certs");
+ putenv("LDAPTLS_CACERT={$g['varrun_path']}/certs/{$caref['refid']}.ca");
+ }
+}
+
+function ldap_test_bind($authcfg) {
+ global $debug, $config, $g;
+
+ if ($authcfg) {
+ if (strstr($authcfg['ldap_urltype'], "Standard")) {
+ $ldapproto = "ldap";
+ } else {
+ $ldapproto = "ldaps";
+ }
+ $ldapserver = "{$ldapproto}://" . ldap_format_host($authcfg['host']);
+ $ldapport = $authcfg['ldap_port'];
+ if (!empty($ldapport)) {
+ $ldapserver .= ":{$ldapport}";
+ }
+ $ldapbasedn = $authcfg['ldap_basedn'];
+ $ldapbindun = $authcfg['ldap_binddn'];
+ $ldapbindpw = $authcfg['ldap_bindpw'];
+ $ldapver = $authcfg['ldap_protver'];
+ if (empty($ldapbndun) || empty($ldapbindpw)) {
+ $ldapanon = true;
+ } else {
+ $ldapanon = false;
+ }
+ } else {
+ return false;
+ }
+
+ /* first check if there is even an LDAP server populated */
+ if (!$ldapserver) {
+ return false;
+ }
+
+ /* Setup CA environment if needed. */
+ ldap_setup_caenv($authcfg);
+
+ /* connect and see if server is up */
+ $error = false;
+ if (!($ldap = ldap_connect($ldapserver))) {
+ $error = true;
+ }
+
+ if ($error == true) {
+ log_error(sprintf(gettext("ERROR! Could not connect to server %s."), $ldapname));
+ return false;
+ }
+
+ ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
+ ldap_set_option($ldap, LDAP_OPT_DEREF, LDAP_DEREF_SEARCHING);
+ ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, (int)$ldapver);
+
+ $ldapbindun = isset($authcfg['ldap_utf8']) ? utf8_encode($ldapbindun) : $ldapbindun;
+ $ldapbindpw = isset($authcfg['ldap_utf8']) ? utf8_encode($ldapbindpw) : $ldapbindpw;
+ if ($ldapanon == true) {
+ if (!($res = @ldap_bind($ldap))) {
+ @ldap_close($ldap);
+ return false;
+ }
+ } else if (!($res = @ldap_bind($ldap, $ldapbindun, $ldapbindpw))) {
+ @ldap_close($ldap);
+ return false;
+ }
+
+ @ldap_unbind($ldap);
+
+ return true;
+}
+
+function ldap_get_user_ous($show_complete_ou=true, $authcfg) {
+ global $debug, $config, $g;
+
+ if (!function_exists("ldap_connect")) {
+ return;
+ }
+
+ $ous = array();
+
+ if ($authcfg) {
+ if (strstr($authcfg['ldap_urltype'], "Standard")) {
+ $ldapproto = "ldap";
+ } else {
+ $ldapproto = "ldaps";
+ }
+ $ldapserver = "{$ldapproto}://" . ldap_format_host($authcfg['host']);
+ $ldapport = $authcfg['ldap_port'];
+ if (!empty($ldapport)) {
+ $ldapserver .= ":{$ldapport}";
+ }
+ $ldapbasedn = $authcfg['ldap_basedn'];
+ $ldapbindun = $authcfg['ldap_binddn'];
+ $ldapbindpw = $authcfg['ldap_bindpw'];
+ $ldapver = $authcfg['ldap_protver'];
+ if (empty($ldapbindun) || empty($ldapbindpw)) {
+ $ldapanon = true;
+ } else {
+ $ldapanon = false;
+ }
+ $ldapname = $authcfg['name'];
+ $ldapfallback = false;
+ $ldapscope = $authcfg['ldap_scope'];
+ } else {
+ return false;
+ }
+
+ /* first check if there is even an LDAP server populated */
+ if (!$ldapserver) {
+ log_error(gettext("ERROR! ldap_get_user_ous() backed selected with no LDAP authentication server defined."));
+ return $ous;
+ }
+
+ /* Setup CA environment if needed. */
+ ldap_setup_caenv($authcfg);
+
+ /* connect and see if server is up */
+ $error = false;
+ if (!($ldap = ldap_connect($ldapserver))) {
+ $error = true;
+ }
+
+ if ($error == true) {
+ log_error(sprintf(gettext("ERROR! Could not connect to server %s."), $ldapname));
+ return $ous;
+ }
+
+ $ldapfilter = "(|(ou=*)(cn=Users))";
+
+ ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
+ ldap_set_option($ldap, LDAP_OPT_DEREF, LDAP_DEREF_SEARCHING);
+ ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, (int)$ldapver);
+
+ $ldapbindun = isset($authcfg['ldap_utf8']) ? utf8_encode($ldapbindun) : $ldapbindun;
+ $ldapbindpw = isset($authcfg['ldap_utf8']) ? utf8_encode($ldapbindpw) : $ldapbindpw;
+ if ($ldapanon == true) {
+ if (!($res = @ldap_bind($ldap))) {
+ log_error(sprintf(gettext("ERROR! ldap_get_user_ous() could not bind anonymously to server %s."), $ldapname));
+ @ldap_close($ldap);
+ return $ous;
+ }
+ } else if (!($res = @ldap_bind($ldap, $ldapbindun, $ldapbindpw))) {
+ log_error(sprintf(gettext("ERROR! ldap_get_user_ous() could not bind to server %s."), $ldapname));
+ @ldap_close($ldap);
+ return $ous;
+ }
+
+ if ($ldapscope == "one") {
+ $ldapfunc = "ldap_list";
+ } else {
+ $ldapfunc = "ldap_search";
+ }
+
+ $search = @$ldapfunc($ldap, $ldapbasedn, $ldapfilter);
+ $info = @ldap_get_entries($ldap, $search);
+
+ if (is_array($info)) {
+ foreach ($info as $inf) {
+ if (!$show_complete_ou) {
+ $inf_split = explode(",", $inf['dn']);
+ $ou = $inf_split[0];
+ $ou = str_replace("OU=", "", $ou);
+ $ou = str_replace("CN=", "", $ou);
+ } else {
+ if ($inf['dn']) {
+ $ou = $inf['dn'];
+ }
+ }
+ if ($ou) {
+ $ous[] = $ou;
+ }
+ }
+ }
+
+ @ldap_unbind($ldap);
+
+ return $ous;
+}
+
+function ldap_get_groups($username, $authcfg) {
+ global $debug, $config;
+
+ if (!function_exists("ldap_connect")) {
+ return;
+ }
+
+ if (!$username) {
+ return false;
+ }
+
+ if (!isset($authcfg['ldap_nostrip_at']) && stristr($username, "@")) {
+ $username_split = explode("@", $username);
+ $username = $username_split[0];
+ }
+
+ if (stristr($username, "\\")) {
+ $username_split = explode("\\", $username);
+ $username = $username_split[0];
+ }
+
+ //log_error("Getting LDAP groups for {$username}.");
+ if ($authcfg) {
+ if (strstr($authcfg['ldap_urltype'], "Standard")) {
+ $ldapproto = "ldap";
+ } else {
+ $ldapproto = "ldaps";
+ }
+ $ldapserver = "{$ldapproto}://" . ldap_format_host($authcfg['host']);
+ $ldapport = $authcfg['ldap_port'];
+ if (!empty($ldapport)) {
+ $ldapserver .= ":{$ldapport}";
+ }
+ $ldapbasedn = $authcfg['ldap_basedn'];
+ $ldapbindun = $authcfg['ldap_binddn'];
+ $ldapbindpw = $authcfg['ldap_bindpw'];
+ $ldapauthcont = $authcfg['ldap_authcn'];
+ $ldapnameattribute = strtolower($authcfg['ldap_attr_user']);
+ $ldapgroupattribute = strtolower($authcfg['ldap_attr_member']);
+ $ldapfilter = "({$ldapnameattribute}={$username})";
+ $ldaptype = "";
+ $ldapver = $authcfg['ldap_protver'];
+ if (empty($ldapbindun) || empty($ldapbindpw)) {
+ $ldapanon = true;
+ } else {
+ $ldapanon = false;
+ }
+ $ldapname = $authcfg['name'];
+ $ldapfallback = false;
+ $ldapscope = $authcfg['ldap_scope'];
+ } else {
+ return false;
+ }
+
+ $ldapdn = $_SESSION['ldapdn'];
+
+ /*Convert attribute to lowercase. php ldap arrays put everything in lowercase */
+ $ldapgroupattribute = strtolower($ldapgroupattribute);
+ $memberof = array();
+
+ /* Setup CA environment if needed. */
+ ldap_setup_caenv($authcfg);
+
+ /* connect and see if server is up */
+ $error = false;
+ if (!($ldap = ldap_connect($ldapserver))) {
+ $error = true;
+ }
+
+ if ($error == true) {
+ log_error(sprintf(gettext("ERROR! ldap_get_groups() Could not connect to server %s."), $ldapname));
+ return memberof;
+ }
+
+ ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
+ ldap_set_option($ldap, LDAP_OPT_DEREF, LDAP_DEREF_SEARCHING);
+ ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, (int)$ldapver);
+
+ /* bind as user that has rights to read group attributes */
+ $ldapbindun = isset($authcfg['ldap_utf8']) ? utf8_encode($ldapbindun) : $ldapbindun;
+ $ldapbindpw = isset($authcfg['ldap_utf8']) ? utf8_encode($ldapbindpw) : $ldapbindpw;
+ if ($ldapanon == true) {
+ if (!($res = @ldap_bind($ldap))) {
+ log_error(sprintf(gettext("ERROR! ldap_get_groups() could not bind anonymously to server %s."), $ldapname));
+ @ldap_close($ldap);
+ return false;
+ }
+ } else if (!($res = @ldap_bind($ldap, $ldapbindun, $ldapbindpw))) {
+ log_error(sprintf(gettext("ERROR! ldap_get_groups() could not bind to server %s."), $ldapname));
+ @ldap_close($ldap);
+ return memberof;
+ }
+
+ /* get groups from DN found */
+ /* use ldap_read instead of search so we don't have to do a bunch of extra work */
+ /* since we know the DN is in $_SESSION['ldapdn'] */
+ //$search = ldap_read($ldap, $ldapdn, "(objectclass=*)", array($ldapgroupattribute));
+ if ($ldapscope == "one") {
+ $ldapfunc = "ldap_list";
+ } else {
+ $ldapfunc = "ldap_search";
+ }
+
+ $search = @$ldapfunc($ldap, $ldapdn, $ldapfilter, array($ldapgroupattribute));
+ $info = @ldap_get_entries($ldap, $search);
+
+ $countem = $info["count"];
+
+ if (is_array($info[0][$ldapgroupattribute])) {
+ /* Iterate through the groups and throw them into an array */
+ foreach ($info[0][$ldapgroupattribute] as $member) {
+ if (stristr($member, "CN=") !== false) {
+ $membersplit = explode(",", $member);
+ $memberof[] = preg_replace("/CN=/i", "", $membersplit[0]);
+ }
+ }
+ }
+
+ /* Time to close LDAP connection */
+ @ldap_unbind($ldap);
+
+ $groups = print_r($memberof, true);
+
+ //log_error("Returning groups ".$groups." for user $username");
+
+ return $memberof;
+}
+
+function ldap_format_host($host) {
+ return is_ipaddrv6($host) ? "[$host]" : $host ;
+}
+
+function ldap_backed($username, $passwd, $authcfg) {
+ global $debug, $config;
+
+ if (!$username) {
+ return;
+ }
+
+ if (!function_exists("ldap_connect")) {
+ return;
+ }
+
+ if (!isset($authcfg['ldap_nostrip_at']) && stristr($username, "@")) {
+ $username_split = explode("@", $username);
+ $username = $username_split[0];
+ }
+ if (stristr($username, "\\")) {
+ $username_split = explode("\\", $username);
+ $username = $username_split[0];
+ }
+
+ if ($authcfg) {
+ if (strstr($authcfg['ldap_urltype'], "Standard")) {
+ $ldapproto = "ldap";
+ } else {
+ $ldapproto = "ldaps";
+ }
+ $ldapserver = "{$ldapproto}://" . ldap_format_host($authcfg['host']);
+ $ldapport = $authcfg['ldap_port'];
+ if (!empty($ldapport)) {
+ $ldapserver .= ":{$ldapport}";
+ }
+ $ldapbasedn = $authcfg['ldap_basedn'];
+ $ldapbindun = $authcfg['ldap_binddn'];
+ $ldapbindpw = $authcfg['ldap_bindpw'];
+ if (empty($ldapbindun) || empty($ldapbindpw)) {
+ $ldapanon = true;
+ } else {
+ $ldapanon = false;
+ }
+ $ldapauthcont = $authcfg['ldap_authcn'];
+ $ldapnameattribute = strtolower($authcfg['ldap_attr_user']);
+ $ldapextendedqueryenabled = $authcfg['ldap_extended_enabled'];
+ $ldapextendedquery = $authcfg['ldap_extended_query'];
+ $ldapfilter = "";
+ if (!$ldapextendedqueryenabled) {
+ $ldapfilter = "({$ldapnameattribute}={$username})";
+ } else {
+ $ldapfilter = "(&({$ldapnameattribute}={$username})({$ldapextendedquery}))";
+ }
+ $ldaptype = "";
+ $ldapver = $authcfg['ldap_protver'];
+ $ldapname = $authcfg['name'];
+ $ldapscope = $authcfg['ldap_scope'];
+ } else {
+ return false;
+ }
+
+ /* first check if there is even an LDAP server populated */
+ if (!$ldapserver) {
+ if ($ldapfallback) {
+ log_error(gettext("ERROR! ldap_backed() called with no LDAP authentication server defined. Defaulting to local user database. Visit System -> User Manager."));
+ return local_backed($username, $passwd);
+ } else {
+ log_error(gettext("ERROR! ldap_backed() called with no LDAP authentication server defined."));
+ }
+
+ return false;
+ }
+
+ /* Setup CA environment if needed. */
+ ldap_setup_caenv($authcfg);
+
+ ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
+ ldap_set_option($ldap, LDAP_OPT_DEREF, LDAP_DEREF_SEARCHING);
+ ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, (int)$ldapver);
+
+ /* Make sure we can connect to LDAP */
+ $error = false;
+ if (!($ldap = ldap_connect($ldapserver))) {
+ $error = true;
+ }
+
+ if ($error == true) {
+ log_error(sprintf(gettext("ERROR! Could not connect to server %s."), $ldapname));
+ return false;
+ }
+
+ /* ok, its up. now, lets bind as the bind user so we can search it */
+ $error = false;
+ $ldapbindun = isset($authcfg['ldap_utf8']) ? utf8_encode($ldapbindun) : $ldapbindun;
+ $ldapbindpw = isset($authcfg['ldap_utf8']) ? utf8_encode($ldapbindpw) : $ldapbindpw;
+ if ($ldapanon == true) {
+ if (!($res = @ldap_bind($ldap))) {
+ $error = true;
+ }
+ } else if (!($res = @ldap_bind($ldap, $ldapbindun, $ldapbindpw))) {
+ $error = true;
+ }
+
+ if ($error == true) {
+ @ldap_close($ldap);
+ log_error(sprintf(gettext("ERROR! Could not bind to server %s."), $ldapname));
+ return false;
+ }
+
+ /* Get LDAP Authcontainers and split em up. */
+ $ldac_splits = explode(";", $ldapauthcont);
+
+ /* setup the usercount so we think we haven't found anyone yet */
+ $usercount = 0;
+
+ /*****************************************************************/
+ /* We First find the user based on username and filter */
+ /* Then, once we find the first occurrence of that person */
+ /* We set session variables to point to the OU and DN of the */
+ /* Person. To later be used by ldap_get_groups. */
+ /* that way we don't have to search twice. */
+ /*****************************************************************/
+ if ($debug) {
+ log_auth(sprintf(gettext("Now Searching for %s in directory."), $username));
+ }
+ /* Iterate through the user containers for search */
+ foreach ($ldac_splits as $i => $ldac_split) {
+ $ldac_split = isset($authcfg['ldap_utf8']) ? utf8_encode($ldac_split) : $ldac_split;
+ $ldapfilter = isset($authcfg['ldap_utf8']) ? utf8_encode($ldapfilter) : $ldapfilter;
+ $ldapsearchbasedn = isset($authcfg['ldap_utf8']) ? utf8_encode("{$ldac_split},{$ldapbasedn}") : "{$ldac_split},{$ldapbasedn}";
+ /* Make sure we just use the first user we find */
+ if ($debug) {
+ log_auth(sprintf(gettext('Now Searching in server %1$s, container %2$s with filter %3$s.'), $ldapname, utf8_decode($ldac_split), utf8_decode($ldapfilter)));
+ }
+ if ($ldapscope == "one") {
+ $ldapfunc = "ldap_list";
+ } else {
+ $ldapfunc = "ldap_search";
+ }
+ /* Support legacy auth container specification. */
+ if (stristr($ldac_split, "DC=") || empty($ldapbasedn)) {
+ $search = @$ldapfunc($ldap,$ldac_split,$ldapfilter);
+ } else {
+ $search = @$ldapfunc($ldap,$ldapsearchbasedn,$ldapfilter);
+ }
+ if (!$search) {
+ log_error(sprintf(gettext("Search resulted in error: %s"), ldap_error($ldap)));
+ continue;
+ }
+ $info = ldap_get_entries($ldap, $search);
+ $matches = $info['count'];
+ if ($matches == 1) {
+ $userdn = $_SESSION['ldapdn'] = $info[0]['dn'];
+ $_SESSION['ldapou'] = $ldac_split[$i];
+ $_SESSION['ldapon'] = "true";
+ $usercount = 1;
+ break;
+ }
+ }
+
+ if ($usercount != 1) {
+ @ldap_unbind($ldap);
+ log_error(gettext("ERROR! Either LDAP search failed, or multiple users were found."));
+ return false;
+ }
+
+ /* Now lets bind as the user we found */
+ $passwd = isset($authcfg['ldap_utf8']) ? utf8_encode($passwd) : $passwd;
+ if (!($res = @ldap_bind($ldap, $userdn, $passwd))) {
+ log_error(sprintf(gettext('ERROR! Could not login to server %1$s as user %2$s: %3$s'), $ldapname, $username, ldap_error($ldap)));
+ @ldap_unbind($ldap);
+ return false;
+ }
+
+ if ($debug) {
+ $userdn = isset($authcfg['ldap_utf8']) ? utf8_decode($userdn) : $userdn;
+ log_auth(sprintf(gettext('Logged in successfully as %1$s via LDAP server %2$s with DN = %3$s.'), $username, $ldapname, $userdn));
+ }
+
+ /* At this point we are bound to LDAP so the user was auth'd okay. Close connection. */
+ @ldap_unbind($ldap);
+
+ return true;
+}
+
+function radius_backed($username, $passwd, $authcfg, &$attributes = array()) {
+ global $debug, $config;
+ $ret = false;
+
+ require_once("radius.inc");
+
+ $rauth = new Auth_RADIUS_PAP($username, $passwd);
+ if ($authcfg) {
+ $radiusservers = array();
+ $radiusservers[0]['ipaddr'] = $authcfg['host'];
+ $radiusservers[0]['port'] = $authcfg['radius_auth_port'];
+ $radiusservers[0]['sharedsecret'] = $authcfg['radius_secret'];
+ $radiusservers[0]['timeout'] = $authcfg['radius_timeout'];
+ } else {
+ return false;
+ }
+
+ /* Add new servers to our instance */
+ foreach ($radiusservers as $radsrv) {
+ $timeout = (is_numeric($radsrv['timeout'])) ? $radsrv['timeout'] : 5;
+ $rauth->addServer($radsrv['ipaddr'], $radsrv['port'], $radsrv['sharedsecret'], $timeout);
+ }
+
+ if (PEAR::isError($rauth->start())) {
+ $retvalue['auth_val'] = 1;
+ $retvalue['error'] = $rauth->getError();
+ if ($debug) {
+ printf(gettext("Radius start: %s<br />\n"), $retvalue['error']);
+ }
+ }
+
+ // XXX - billm - somewhere in here we need to handle securid challenge/response
+
+ /* Send request */
+ $result = $rauth->send();
+ if (PEAR::isError($result)) {
+ $retvalue['auth_val'] = 1;
+ $retvalue['error'] = $result->getMessage();
+ if ($debug) {
+ printf(gettext("Radius send failed: %s<br />\n"), $retvalue['error']);
+ }
+ } else if ($result === true) {
+ if ($rauth->getAttributes()) {
+ $attributes = $rauth->listAttributes();
+ }
+ $retvalue['auth_val'] = 2;
+ if ($debug) {
+ printf(gettext("Radius Auth succeeded")."<br />\n");
+ }
+ $ret = true;
+ } else {
+ $retvalue['auth_val'] = 3;
+ if ($debug) {
+ printf(gettext("Radius Auth rejected")."<br />\n");
+ }
+ }
+
+ // close OO RADIUS_AUTHENTICATION
+ $rauth->close();
+
+ return $ret;
+}
+
+/*
+ $attributes must contain a "class" key containing the groups and local
+ groups must exist to match.
+*/
+function radius_get_groups($attributes) {
+ $groups = array();
+ if (!empty($attributes) && is_array($attributes) && !empty($attributes['class'])) {
+ $groups = explode(";", $attributes['class']);
+ foreach ($groups as & $grp) {
+ $grp = trim($grp);
+ if (strtolower(substr($grp, 0, 3)) == "ou=") {
+ $grp = substr($grp, 3);
+ }
+ }
+ }
+ return $groups;
+}
+
+function get_user_expiration_date($username) {
+ $user = getUserEntry($username);
+ if ($user['expires']) {
+ return $user['expires'];
+ }
+}
+
+function is_account_expired($username) {
+ $expirydate = get_user_expiration_date($username);
+ if ($expirydate) {
+ if (strtotime("-1 day") > strtotime(date("m/d/Y", strtotime($expirydate)))) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function is_account_disabled($username) {
+ $user = getUserEntry($username);
+ if (isset($user['disabled'])) {
+ return true;
+ }
+
+ return false;
+}
+
+function auth_get_authserver($name) {
+ global $config;
+
+ if (is_array($config['system']['authserver'])) {
+ foreach ($config['system']['authserver'] as $authcfg) {
+ if ($authcfg['name'] == $name) {
+ return $authcfg;
+ }
+ }
+ }
+ if ($name == "Local Database") {
+ return array("name" => gettext("Local Database"), "type" => "Local Auth", "host" => $config['system']['hostname']);
+ }
+}
+
+function auth_get_authserver_list() {
+ global $config;
+
+ $list = array();
+
+ if (is_array($config['system']['authserver'])) {
+ foreach ($config['system']['authserver'] as $authcfg) {
+ /* Add support for disabled entries? */
+ $list[$authcfg['name']] = $authcfg;
+ }
+ }
+
+ $list["Local Database"] = array("name" => gettext("Local Database"), "type" => "Local Auth", "host" => $config['system']['hostname']);
+ return $list;
+}
+
+function getUserGroups($username, $authcfg, &$attributes = array()) {
+ global $config;
+
+ $allowed_groups = array();
+
+ switch ($authcfg['type']) {
+ case 'ldap':
+ $allowed_groups = @ldap_get_groups($username, $authcfg);
+ break;
+ case 'radius':
+ $allowed_groups = @radius_get_groups($attributes);
+ break;
+ default:
+ $user = getUserEntry($username);
+ $allowed_groups = @local_user_get_groups($user, true);
+ break;
+ }
+
+ $member_groups = array();
+ if (is_array($config['system']['group'])) {
+ foreach ($config['system']['group'] as $group) {
+ if (in_array($group['name'], $allowed_groups)) {
+ $member_groups[] = $group['name'];
+ }
+ }
+ }
+
+ return $member_groups;
+}
+
+function authenticate_user($username, $password, $authcfg = NULL, &$attributes = array()) {
+
+ if (!$authcfg) {
+ return local_backed($username, $password);
+ }
+
+ $authenticated = false;
+ switch ($authcfg['type']) {
+ case 'ldap':
+ if (ldap_backed($username, $password, $authcfg)) {
+ $authenticated = true;
+ }
+ break;
+ case 'radius':
+ if (radius_backed($username, $password, $authcfg, $attributes)) {
+ $authenticated = true;
+ }
+ break;
+ default:
+ /* lookup user object by name */
+ if (local_backed($username, $password)) {
+ $authenticated = true;
+ }
+ break;
+ }
+
+ return $authenticated;
+}
+
+function session_auth() {
+ global $config, $_SESSION, $page;
+
+ // Handle HTTPS httponly and secure flags
+ $currentCookieParams = session_get_cookie_params();
+ session_set_cookie_params(
+ $currentCookieParams["lifetime"],
+ $currentCookieParams["path"],
+ NULL,
+ ($config['system']['webgui']['protocol'] == "https"),
+ true
+ );
+
+ if (!session_id()) {
+ session_start();
+ }
+
+ // Detect protocol change
+ if (!isset($_POST['login']) && !empty($_SESSION['Logged_In']) && $_SESSION['protocol'] != $config['system']['webgui']['protocol']) {
+ return false;
+ }
+
+ /* Validate incoming login request */
+ $attributes = array();
+ if (isset($_POST['login']) && !empty($_POST['usernamefld']) && !empty($_POST['passwordfld'])) {
+ $authcfg = auth_get_authserver($config['system']['webgui']['authmode']);
+ if (authenticate_user($_POST['usernamefld'], $_POST['passwordfld'], $authcfg, $attributes) ||
+ authenticate_user($_POST['usernamefld'], $_POST['passwordfld'])) {
+ // Generate a new id to avoid session fixation
+ session_regenerate_id();
+ $_SESSION['Logged_In'] = "True";
+ $_SESSION['Username'] = $_POST['usernamefld'];
+ $_SESSION['user_radius_attributes'] = $attributes;
+ $_SESSION['last_access'] = time();
+ $_SESSION['protocol'] = $config['system']['webgui']['protocol'];
+ if (!isset($config['system']['webgui']['quietlogin'])) {
+ log_auth(sprintf(gettext("Successful login for user '%1\$s' from: %2\$s"), $_POST['usernamefld'], $_SERVER['REMOTE_ADDR']));
+ }
+ if (isset($_POST['postafterlogin'])) {
+ return true;
+ } else {
+ if (empty($page)) {
+ $page = "/";
+ }
+ header("Location: {$page}");
+ }
+ exit;
+ } else {
+ /* give the user an error message */
+ $_SESSION['Login_Error'] = "Username or Password incorrect";
+ log_auth("webConfigurator authentication error for '{$_POST['usernamefld']}' from {$_SERVER['REMOTE_ADDR']}");
+ if (isAjax()) {
+ echo "showajaxmessage('{$_SESSION['Login_Error']}');";
+ return;
+ }
+ }
+ }
+
+ /* Show login page if they aren't logged in */
+ if (empty($_SESSION['Logged_In'])) {
+ return false;
+ }
+
+ /* If session timeout isn't set, we don't mark sessions stale */
+ if (!isset($config['system']['webgui']['session_timeout'])) {
+ /* Default to 4 hour timeout if one is not set */
+ if ($_SESSION['last_access'] < (time() - 14400)) {
+ $_GET['logout'] = true;
+ $_SESSION['Logout'] = true;
+ } else {
+ $_SESSION['last_access'] = time();
+ }
+ } else if (intval($config['system']['webgui']['session_timeout']) == 0) {
+ /* only update if it wasn't ajax */
+ if (!isAjax()) {
+ $_SESSION['last_access'] = time();
+ }
+ } else {
+ /* Check for stale session */
+ if ($_SESSION['last_access'] < (time() - ($config['system']['webgui']['session_timeout'] * 60))) {
+ $_GET['logout'] = true;
+ $_SESSION['Logout'] = true;
+ } else {
+ /* only update if it wasn't ajax */
+ if (!isAjax()) {
+ $_SESSION['last_access'] = time();
+ }
+ }
+ }
+
+ /* user hit the logout button */
+ if (isset($_GET['logout'])) {
+
+ if ($_SESSION['Logout']) {
+ log_error(sprintf(gettext("Session timed out for user '%1\$s' from: %2\$s"), $_SESSION['Username'], $_SERVER['REMOTE_ADDR']));
+ } else {
+ log_error(sprintf(gettext("User logged out for user '%1\$s' from: %2\$s"), $_SESSION['Username'], $_SERVER['REMOTE_ADDR']));
+ }
+
+ /* wipe out $_SESSION */
+ $_SESSION = array();
+
+ if (isset($_COOKIE[session_name()])) {
+ setcookie(session_name(), '', time()-42000, '/');
+ }
+
+ /* and destroy it */
+ session_destroy();
+
+ $scriptName = explode("/", $_SERVER["SCRIPT_FILENAME"]);
+ $scriptElms = count($scriptName);
+ $scriptName = $scriptName[$scriptElms-1];
+
+ if (isAjax()) {
+ return false;
+ }
+
+ /* redirect to page the user is on, it'll prompt them to login again */
+ header("Location: {$scriptName}");
+
+ return false;
+ }
+
+ /*
+ * this is for debugging purpose if you do not want to use Ajax
+ * to submit a HTML form. It basically disables the observation
+ * of the submit event and hence does not trigger Ajax.
+ */
+ if ($_GET['disable_ajax']) {
+ $_SESSION['NO_AJAX'] = "True";
+ }
+
+ /*
+ * Same to re-enable Ajax.
+ */
+ if ($_GET['enable_ajax']) {
+ unset($_SESSION['NO_AJAX']);
+ }
+
+ return true;
+}
+
+?>
diff --git a/src/etc/inc/authgui.inc b/src/etc/inc/authgui.inc
new file mode 100644
index 0000000..07cf9a9
--- /dev/null
+++ b/src/etc/inc/authgui.inc
@@ -0,0 +1,335 @@
+<?php
+/* $Id$ */
+/*
+ Copyright (C) 2007, 2008 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Copyright (C) 2005-2006 Bill Marquette <bill.marquette@gmail.com>
+ All rights reserved.
+
+ Copyright (C) 2006 Paul Taylor <paultaylor@winn-dixie.com>.
+ All rights reserved.
+
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_MODULE: authgui
+*/
+
+include_once("auth.inc");
+include_once("priv.inc");
+if (!function_exists('platform_booting')) {
+ require_once('globals.inc');
+}
+
+/* Authenticate user - exit if failed */
+if (!session_auth()) {
+ display_login_form();
+ exit;
+}
+
+/*
+ * Once here, the user has authenticated with the web server.
+ * We give them access only to the appropriate pages based on
+ * the user or group privileges.
+ */
+$allowedpages = getAllowedPages($_SESSION['Username'], $_SESSION['user_radius_attributes']);
+
+/*
+ * redirect to first allowed page if requesting a wrong url
+ */
+if (!isAllowedPage($_SERVER['REQUEST_URI'])) {
+ if (count($allowedpages) > 0) {
+ $page = str_replace('*', '', $allowedpages[0]);
+ $_SESSION['Post_Login'] = true;
+ require_once("functions.inc");
+ pfSenseHeader("/{$page}");
+
+ $username = empty($_SESSION["Username"]) ? "(system)" : $_SESSION['Username'];
+ if (!empty($_SERVER['REMOTE_ADDR'])) {
+ $username .= '@' . $_SERVER['REMOTE_ADDR'];
+ }
+ log_error("{$username} attempted to access {$_SERVER['SCRIPT_NAME']} but does not have access to that page. Redirecting to {$page}.");
+
+ exit;
+ } else {
+ display_error_form("201", gettext("No page assigned to this user! Click here to logout."));
+ exit;
+ }
+} else {
+ $_SESSION['Post_Login'] = true;
+}
+
+/*
+ * redirect browsers post-login to avoid pages
+ * taking action in response to a POST request
+ */
+if (!$_SESSION['Post_Login']) {
+ $_SESSION['Post_Login'] = true;
+ require_once("functions.inc");
+ pfSenseHeader($_SERVER['REQUEST_URI']);
+ exit;
+}
+
+/*
+ * Close session data to allow other scripts from same host to come in.
+ * A session can be reactivated from calling session_start again
+ */
+session_commit();
+
+/*
+ * determine if the user is allowed access to the requested page
+ */
+function display_error_form($http_code, $desc) {
+ global $config, $g;
+ $g['theme'] = get_current_theme();
+ if (isAjax()) {
+ printf(gettext('Error: %1$s Description: %2$s'), $http_code, $desc);
+ return;
+ }
+
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <script type="text/javascript" src="/javascript/jquery-1.11.1.min.js"></script>
+ <script type="text/javascript" src="/javascript/jquery-migrate-1.2.1.min.js"></script>
+ <title><?=$http_code?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link rel="shortcut icon" href="/themes/<?= $g['theme'] ?>/images/icons/favicon.ico" />
+ <?php if (file_exists("{$g['www_path']}/themes/{$g['theme']}/login.css")): ?>
+ <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/login.css" media="all" />
+ <?php else: ?>
+ <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/all.css" media="all" />
+ <?php endif; ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ function page_load() {}
+ function clearError() {
+ if ($('#inputerrors')) {
+ $('#inputerrors').html('');
+ }
+ }
+ <?php
+ require("headjs.php");
+ echo getHeadJS();
+ ?>
+ //]]>
+ </script>
+ <script type="text/javascript" src="/themes/<?= $g['theme'] ?>/javascript/niftyjsCode.js"></script>
+ </head>
+ <body onload="page_load();">
+ <div id="errordesc">
+ <h1>&nbsp</h1>
+ <a href="/index.php?logout">
+ <p id="errortext" style="vertical-align: middle; text-align: center;">
+ <span style="color: #000000; font-weight: bold;">
+ <?=$desc;?>
+ </span>
+ </p>
+ </div>
+ </body>
+</html>
+
+<?php
+
+} // end function
+
+
+function display_login_form() {
+ require_once("globals.inc");
+ global $config, $g;
+ $g['theme'] = get_current_theme();
+
+ unset($input_errors);
+
+ if (isAjax()) {
+ if (isset($_POST['login'])) {
+ if ($_SESSION['Logged_In'] <> "True") {
+ isset($_SESSION['Login_Error']) ? $login_error = $_SESSION['Login_Error'] : $login_error = gettext("unknown reason");
+ printf("showajaxmessage('" . gettext("Invalid login (%s).") . "')", $login_error);
+ }
+ if (file_exists("{$g['tmp_path']}/webconfigurator.lock")) {
+ // TODO: add the IP from the user who did lock the device
+ $whom = file_get_contents("{$g['tmp_path']}/webconfigurator.lock");
+ printf("showajaxmessage('" . gettext("This device is currently being maintained by: %s.") . "');", $whom);
+ }
+ }
+ exit;
+ }
+
+/* Check against locally configured IP addresses, which will catch when someone
+ port forwards WebGUI access from WAN to an internal IP on the router. */
+global $FilterIflist, $nifty_background;
+$local_ip = false;
+if (strpos($_SERVER['HTTP_HOST'], ":") === FALSE) {
+ $http_host_port = explode(":", $_SERVER['HTTP_HOST']);
+ $http_host = $http_host_port[0];
+} else {
+ $http_host = $_SERVER['HTTP_HOST'];
+}
+if (empty($FilterIflist)) {
+ require_once('filter.inc');
+ require_once('shaper.inc');
+ filter_generate_optcfg_array();
+}
+foreach ($FilterIflist as $iflist) {
+ if ($iflist['ip'] == $http_host) {
+ $local_ip = true;
+ } else if ($iflist['ipv6'] == $http_host) {
+ $local_ip = true;
+ } else if (is_array($iflist['vips'])) {
+ foreach ($iflist['vips'] as $vip) {
+ if ($vip['ip'] == $http_host) {
+ $local_ip = true;
+ break;
+ }
+ }
+ unset($vip);
+ }
+ if ($local_ip == true) {
+ break;
+ }
+}
+unset($FilterIflist);
+unset($iflist);
+
+if ($local_ip == false) {
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $ovpns) {
+ if (is_ipaddrv4($http_host) && !empty($ovpns['tunnel_network']) && ip_in_subnet($http_host, $ovpns['tunnel_network'])) {
+ $local_ip = true;
+ } else if (is_ipaddrv6($http_host) && !empty($ovpns['tunnel_networkv6']) && ip_in_subnet($http_host, $ovpns['tunnel_networkv6'])) {
+ $local_ip = true;
+ }
+ if ($local_ip == true) {
+ break;
+ }
+ }
+ }
+}
+
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <script type="text/javascript" src="/javascript/jquery-1.11.1.min.js"></script>
+ <script type="text/javascript" src="/javascript/jquery-migrate-1.2.1.min.js"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+ $(document).ready(function() { jQuery('#usernamefld').focus(); });
+ //]]>
+ </script>
+
+ <title><?=gettext("Login"); ?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link rel="shortcut icon" href="/themes/<?= $g['theme'] ?>/images/icons/favicon.ico" />
+ <?php if (file_exists("{$g['www_path']}/themes/{$g['theme']}/login.css")): ?>
+ <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/login.css" media="all" />
+ <?php else: ?>
+ <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/all.css" media="all" />
+ <?php endif; ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ function page_load() {}
+ function clearError() {
+ if ($('#inputerrors')) {
+ $('#inputerrors').html('');
+ }
+ }
+ <?php
+ require("headjs.php");
+ echo getHeadJS();
+ ?>
+ //]]>
+ </script>
+ <script type="text/javascript" src="/themes/<?= $g['theme'] ?>/javascript/niftyjsCode.js"></script>
+ </head>
+ <body onload="page_load()">
+ <div id="login">
+ <?php
+ if (is_ipaddr($http_host) && !$local_ip && !isset($config['system']['webgui']['nohttpreferercheck'])) {
+ $nifty_background = "#999";
+ print_info_box(gettext("You are accessing this router by an IP address not configured locally, which may be forwarded by NAT or other means. <br /><br />If you did not setup this forwarding, you may be the target of a man-in-the-middle attack."));
+ }
+ $loginautocomplete = isset($config['system']['webgui']['loginautocomplete']) ? '' : 'autocomplete="off"';
+ ?>
+ <form id="iform" name="iform" method="post" <?= $loginautocomplete ?> action="<?=$_SERVER['SCRIPT_NAME'];?>">
+ <h1>&nbsp;</h1>
+ <div id="inputerrors"><?=$_SESSION['Login_Error'];?></div>
+ <p>
+ <span style="text-align:left">
+ <?=gettext("Username:"); ?><br />
+ <input onclick="clearError();" onchange="clearError();" id="usernamefld" type="text" name="usernamefld" class="formfld user" tabindex="1" />
+ </span>
+ </p>
+ <p>
+ <br />
+ <span style="text-align:left">
+ <?=gettext("Password:"); ?> <br />
+ <input onclick="clearError();" onchange="clearError();" id="passwordfld" type="password" name="passwordfld" class="formfld pwd" tabindex="2" />
+ </span>
+ </p>
+ <p>
+ <br />
+ <span style="text-align:center; font-weight: normal ; font-style: italic">
+ <?=gettext("Enter username and password to login."); ?>
+ </span>
+
+ <span style="text-align:center; font-weight: normal ; font-style: italic; color: #ff0000; display:none" id="no_cookies">
+ <br /><br />
+ <?= gettext("Your browser must support cookies to login."); ?>
+ </span>
+ </p>
+ <p>
+ <span style="text-align:center">
+ <input type="submit" name="login" class="formbtn" value="<?=gettext("Login"); ?>" tabindex="3" />
+ </span>
+ </p>
+ </form>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ document.cookie=
+ "cookie_test=1" +
+ "<?php echo $config['system']['webgui']['protocol'] == 'https' ? '; secure' : '';?>";
+
+ if (document.cookie.indexOf("cookie_test") == -1) {
+ document.getElementById("no_cookies").style.display="";
+ }
+
+ // Delete it
+ document.cookie = "cookie_test=1; expires=Thu, 01-Jan-1970 00:00:01 GMT";
+ //]]>
+ </script>
+ </body>
+</html>
+<?php
+} // end function
+
+?>
diff --git a/src/etc/inc/basic_sasl_client.inc b/src/etc/inc/basic_sasl_client.inc
new file mode 100644
index 0000000..c817664
--- /dev/null
+++ b/src/etc/inc/basic_sasl_client.inc
@@ -0,0 +1,63 @@
+<?php
+/*
+ * basic_sasl_client.php
+ *
+ * @(#) $Id: basic_sasl_client.php,v 1.1 2004/11/17 08:01:23 mlemos Exp $
+ *
+ */
+
+define("SASL_BASIC_STATE_START", 0);
+define("SASL_BASIC_STATE_DONE", 1);
+
+class basic_sasl_client_class
+{
+ var $credentials=array();
+ var $state=SASL_BASIC_STATE_START;
+
+ Function Initialize(&$client)
+ {
+ return(1);
+ }
+
+ Function Start(&$client, &$message, &$interactions)
+ {
+ if ($this->state!=SASL_BASIC_STATE_START)
+ {
+ $client->error="Basic authentication state is not at the start";
+ return(SASL_FAIL);
+ }
+ $this->credentials=array(
+ "user"=>"",
+ "password"=>""
+ );
+ $defaults=array(
+ );
+ $status=$client->GetCredentials($this->credentials,$defaults,$interactions);
+ if ($status==SASL_CONTINUE)
+ {
+ $message=$this->credentials["user"].":".$this->credentials["password"];
+ $this->state=SASL_BASIC_STATE_DONE;
+ }
+ else
+ {
+ Unset($message);
+ }
+ return($status);
+ }
+
+ Function Step(&$client, $response, &$message, &$interactions)
+ {
+ switch ($this->state)
+ {
+ case SASL_BASIC_STATE_DONE:
+ $client->error="Basic authentication was finished without success";
+ return(SASL_FAIL);
+ default:
+ $client->error="invalid Basic authentication step state";
+ return(SASL_FAIL);
+ }
+ return(SASL_CONTINUE);
+ }
+};
+
+?> \ No newline at end of file
diff --git a/src/etc/inc/captiveportal.inc b/src/etc/inc/captiveportal.inc
new file mode 100644
index 0000000..bd294e4
--- /dev/null
+++ b/src/etc/inc/captiveportal.inc
@@ -0,0 +1,2409 @@
+<?php
+/*
+ captiveportal.inc
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004-2011 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2009-2012 Ermal Luçi <eri@pfsense.org>
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ This version of captiveportal.inc has been modified by Rob Parker
+ <rob.parker@keycom.co.uk> to include changes for per-user bandwidth management
+ via returned RADIUS attributes. This page has been modified to delete any
+ added rules which may have been created by other per-user code (index.php, etc).
+ These changes are (c) 2004 Keycom PLC.
+
+ pfSense_BUILDER_BINARIES: /sbin/ipfw /sbin/route
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/lighttpd /usr/local/bin/minicron /sbin/pfctl
+ pfSense_BUILDER_BINARIES: /bin/hostname /bin/cp
+ pfSense_MODULE: captiveportal
+*/
+
+/* include all configuration functions */
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("radius.inc");
+require_once("voucher.inc");
+
+function get_default_captive_portal_html() {
+ global $config, $g, $cpzone;
+
+ $htmltext = <<<EOD
+<html>
+<body>
+<form method="post" action="\$PORTAL_ACTION\$">
+ <input name="redirurl" type="hidden" value="\$PORTAL_REDIRURL\$">
+ <input name="zone" type="hidden" value="\$PORTAL_ZONE\$">
+ <center>
+ <table cellpadding="6" cellspacing="0" width="550" height="380" style="border:1px solid #000000">
+ <tr height="10" bgcolor="#990000">
+ <td style="border-bottom:1px solid #000000">
+ <font color='white'>
+ <b>
+ {$g['product_name']} captive portal
+ </b>
+ </font>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainlevel">
+ <center>
+ <table width="100%" border="0" cellpadding="5" cellspacing="0">
+ <tr>
+ <td>
+ <center>
+ <div id="mainarea">
+ <center>
+ <table width="100%" border="0" cellpadding="5" cellspacing="5">
+ <tr>
+ <td>
+ <div id="maindivarea">
+ <center>
+ <div id='statusbox'>
+ <font color='red' face='arial' size='+1'>
+ <b>
+ \$PORTAL_MESSAGE\$
+ </b>
+ </font>
+ </div>
+ <br />
+ <div id='loginbox'>
+ <table>
+ <tr><td colspan="2"><center>Welcome to the {$g['product_name']} Captive Portal!</td></tr>
+ <tr><td>&nbsp;</td></tr>
+ <tr><td align="right">Username:</td><td><input name="auth_user" type="text" style="border: 1px dashed;"></td></tr>
+ <tr><td align="right">Password:</td><td><input name="auth_pass" type="password" style="border: 1px dashed;"></td></tr>
+ <tr><td>&nbsp;</td></tr>
+
+EOD;
+
+ if (isset($config['voucher'][$cpzone]['enable'])) {
+ $htmltext .= <<<EOD
+ <tr>
+ <td align="right">Enter Voucher Code: </td>
+ <td><input name="auth_voucher" type="text" style="border:1px dashed;" size="22"></td>
+ </tr>
+
+EOD;
+ }
+
+ $htmltext .= <<<EOD
+ <tr>
+ <td colspan="2"><center><input name="accept" type="submit" value="Continue"></center></td>
+ </tr>
+ </table>
+ </div>
+ </center>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ </center>
+ </td>
+ </tr>
+ </table>
+ </center>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </center>
+</form>
+</body>
+</html>
+
+EOD;
+
+ return $htmltext;
+}
+
+function captiveportal_load_modules() {
+ global $config;
+
+ mute_kernel_msgs();
+ if (!is_module_loaded("ipfw.ko")) {
+ mwexec("/sbin/kldload ipfw");
+ /* make sure ipfw is not on pfil hooks */
+ set_sysctl(array(
+ "net.inet.ip.pfil.inbound" => "pf", "net.inet6.ip6.pfil.inbound" => "pf",
+ "net.inet.ip.pfil.outbound" => "pf", "net.inet6.ip6.pfil.outbound" => "pf")
+ );
+ }
+ /* Activate layer2 filtering */
+ set_sysctl(array("net.link.ether.ipfw" => "1", "net.inet.ip.fw.one_pass" => "1"));
+
+ /* Always load dummynet now that even allowed ip and mac passthrough use it. */
+ if (!is_module_loaded("dummynet.ko")) {
+ mwexec("/sbin/kldload dummynet");
+ set_sysctl(array("net.inet.ip.dummynet.io_fast" => "1", "net.inet.ip.dummynet.hash_size" => "256"));
+ }
+ unmute_kernel_msgs();
+}
+
+function captiveportal_configure() {
+ global $config, $cpzone, $cpzoneid;
+
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cpkey => $cp) {
+ $cpzone = $cpkey;
+ $cpzoneid = $cp['zoneid'];
+ captiveportal_configure_zone($cp);
+ }
+ }
+}
+
+function captiveportal_configure_zone($cpcfg) {
+ global $config, $g, $cpzone, $cpzoneid;
+
+ $captiveportallck = lock("captiveportal{$cpzone}", LOCK_EX);
+
+ if (isset($cpcfg['enable'])) {
+
+ if (platform_booting()) {
+ echo "Starting captive portal({$cpcfg['zone']})... ";
+
+ /* remove old information */
+ unlink_if_exists("{$g['vardb_path']}/captiveportal{$cpzone}.db");
+ } else {
+ captiveportal_syslog("Reconfiguring captive portal({$cpcfg['zone']}).");
+ }
+
+ /* init ipfw rules */
+ captiveportal_init_rules(true);
+
+ /* kill any running minicron */
+ killbypid("{$g['varrun_path']}/cp_prunedb_{$cpzone}.pid");
+
+ /* initialize minicron interval value */
+ $croninterval = $cpcfg['croninterval'] ? $cpcfg['croninterval'] : 60;
+
+ /* double check if the $croninterval is numeric and at least 10 seconds. If not we set it to 60 to avoid problems */
+ if ((!is_numeric($croninterval)) || ($croninterval < 10)) {
+ $croninterval = 60;
+ }
+
+ /* write portal page */
+ if (is_array($cpcfg['page']) && $cpcfg['page']['htmltext']) {
+ $htmltext = base64_decode($cpcfg['page']['htmltext']);
+ } else {
+ /* example/template page */
+ $htmltext = get_default_captive_portal_html();
+ }
+
+ $fd = @fopen("{$g['varetc_path']}/captiveportal_{$cpzone}.html", "w");
+ if ($fd) {
+ // Special case handling. Convert so that we can pass this page
+ // through the PHP interpreter later without clobbering the vars.
+ $htmltext = str_replace("\$PORTAL_ZONE\$", "#PORTAL_ZONE#", $htmltext);
+ $htmltext = str_replace("\$PORTAL_REDIRURL\$", "#PORTAL_REDIRURL#", $htmltext);
+ $htmltext = str_replace("\$PORTAL_MESSAGE\$", "#PORTAL_MESSAGE#", $htmltext);
+ $htmltext = str_replace("\$CLIENT_MAC\$", "#CLIENT_MAC#", $htmltext);
+ $htmltext = str_replace("\$CLIENT_IP\$", "#CLIENT_IP#", $htmltext);
+ $htmltext = str_replace("\$ORIGINAL_PORTAL_IP\$", "#ORIGINAL_PORTAL_IP#", $htmltext);
+ $htmltext = str_replace("\$PORTAL_ACTION\$", "#PORTAL_ACTION#", $htmltext);
+ if ($cpcfg['preauthurl']) {
+ $htmltext = str_replace("\$PORTAL_REDIRURL\$", "{$cpcfg['preauthurl']}", $htmltext);
+ $htmltext = str_replace("#PORTAL_REDIRURL#", "{$cpcfg['preauthurl']}", $htmltext);
+ }
+ fwrite($fd, $htmltext);
+ fclose($fd);
+ }
+ unset($htmltext);
+
+ /* write error page */
+ if (is_array($cpcfg['page']) && $cpcfg['page']['errtext']) {
+ $errtext = base64_decode($cpcfg['page']['errtext']);
+ } else {
+ /* example page */
+ $errtext = get_default_captive_portal_html();
+ }
+
+ $fd = @fopen("{$g['varetc_path']}/captiveportal-{$cpzone}-error.html", "w");
+ if ($fd) {
+ // Special case handling. Convert so that we can pass this page
+ // through the PHP interpreter later without clobbering the vars.
+ $errtext = str_replace("\$PORTAL_ZONE\$", "#PORTAL_ZONE#", $errtext);
+ $errtext = str_replace("\$PORTAL_REDIRURL\$", "#PORTAL_REDIRURL#", $errtext);
+ $errtext = str_replace("\$PORTAL_MESSAGE\$", "#PORTAL_MESSAGE#", $errtext);
+ $errtext = str_replace("\$CLIENT_MAC\$", "#CLIENT_MAC#", $errtext);
+ $errtext = str_replace("\$CLIENT_IP\$", "#CLIENT_IP#", $errtext);
+ $errtext = str_replace("\$ORIGINAL_PORTAL_IP\$", "#ORIGINAL_PORTAL_IP#", $errtext);
+ $errtext = str_replace("\$PORTAL_ACTION\$", "#PORTAL_ACTION#", $errtext);
+ if ($cpcfg['preauthurl']) {
+ $errtext = str_replace("\$PORTAL_REDIRURL\$", "{$cpcfg['preauthurl']}", $errtext);
+ $errtext = str_replace("#PORTAL_REDIRURL#", "{$cpcfg['preauthurl']}", $errtext);
+ }
+ fwrite($fd, $errtext);
+ fclose($fd);
+ }
+ unset($errtext);
+
+ /* write logout page */
+ if (is_array($cpcfg['page']) && $cpcfg['page']['logouttext']) {
+ $logouttext = base64_decode($cpcfg['page']['logouttext']);
+ } else {
+ /* example page */
+ $logouttext = <<<EOD
+<html>
+<head><title>Redirecting...</title></head>
+<body>
+<span style="font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px;">
+<b>Redirecting to <a href="<?=\$my_redirurl;?>"><?=\$my_redirurl;?></a>...</b>
+</span>
+<script type="text/javascript">
+//<![CDATA[
+LogoutWin = window.open('', 'Logout', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=256,height=64');
+if (LogoutWin) {
+ LogoutWin.document.write('<html>');
+ LogoutWin.document.write('<head><title>Logout</title></head>') ;
+ LogoutWin.document.write('<body bgcolor="#435370">');
+ LogoutWin.document.write('<div align="center" style="color: #ffffff; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px;">') ;
+ LogoutWin.document.write('<b>Click the button below to disconnect</b><p />');
+ LogoutWin.document.write('<form method="POST" action="<?=\$logouturl;?>">');
+ LogoutWin.document.write('<input name="logout_id" type="hidden" value="<?=\$sessionid;?>" />');
+ LogoutWin.document.write('<input name="zone" type="hidden" value="<?=\$cpzone;?>" />');
+ LogoutWin.document.write('<input name="logout" type="submit" value="Logout" />');
+ LogoutWin.document.write('</form>');
+ LogoutWin.document.write('</div></body>');
+ LogoutWin.document.write('</html>');
+ LogoutWin.document.close();
+}
+
+document.location.href="<?=\$my_redirurl;?>";
+//]]>
+</script>
+</body>
+</html>
+
+EOD;
+ }
+
+ $fd = @fopen("{$g['varetc_path']}/captiveportal-{$cpzone}-logout.html", "w");
+ if ($fd) {
+ fwrite($fd, $logouttext);
+ fclose($fd);
+ }
+ unset($logouttext);
+
+ /* write elements */
+ captiveportal_write_elements();
+
+ /* kill any running mini_httpd */
+ killbypid("{$g['varrun_path']}/lighty-{$cpzone}-CaptivePortal.pid");
+ killbypid("{$g['varrun_path']}/lighty-{$cpzone}-CaptivePortal-SSL.pid");
+
+ /* start up the webserving daemon */
+ captiveportal_init_webgui_zone($cpcfg);
+
+ /* Kill any existing prunecaptiveportal processes */
+ if (file_exists("{$g['varrun_path']}/cp_prunedb_{$cpzone}.pid")) {
+ killbypid("{$g['varrun_path']}/cp_prunedb_{$cpzone}.pid");
+ }
+
+ /* start pruning process (interval defaults to 60 seconds) */
+ mwexec("/usr/local/bin/minicron $croninterval {$g['varrun_path']}/cp_prunedb_{$cpzone}.pid " .
+ "/etc/rc.prunecaptiveportal {$cpzone}");
+
+ /* generate radius server database */
+ unlink_if_exists("{$g['vardb_path']}/captiveportal_radius_{$cpzone}.db");
+ captiveportal_init_radius_servers();
+
+ if (platform_booting()) {
+ /* send Accounting-On to server */
+ captiveportal_send_server_accounting();
+ echo "done\n";
+ }
+
+ } else {
+ killbypid("{$g['varrun_path']}/lighty-{$cpzone}-CaptivePortal.pid");
+ killbypid("{$g['varrun_path']}/lighty-{$cpzone}-CaptivePortal-SSL.pid");
+ killbypid("{$g['varrun_path']}/cp_prunedb_{$cpzone}.pid");
+ @unlink("{$g['varetc_path']}/captiveportal_{$cpzone}.html");
+ @unlink("{$g['varetc_path']}/captiveportal-{$cpzone}-error.html");
+ @unlink("{$g['varetc_path']}/captiveportal-{$cpzone}-logout.html");
+
+ captiveportal_radius_stop_all();
+
+ /* send Accounting-Off to server */
+ if (!platform_booting()) {
+ captiveportal_send_server_accounting(true);
+ }
+
+ /* remove old information */
+ unlink_if_exists("{$g['vardb_path']}/captiveportal{$cpzone}.db");
+ unlink_if_exists("{$g['vardb_path']}/captiveportal_radius_{$cpzone}.db");
+ unlink_if_exists("{$g['vardb_path']}/captiveportal_{$cpzone}.rules");
+ /* Release allocated pipes for this zone */
+ captiveportal_free_dnrules();
+
+ mwexec("/sbin/ipfw zone {$cpzoneid} destroy", true);
+
+ if (empty($config['captiveportal'])) {
+ set_single_sysctl("net.link.ether.ipfw", "0");
+ } else {
+ /* Deactivate ipfw(4) if not needed */
+ $cpactive = false;
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cpkey => $cp) {
+ if (isset($cp['enable'])) {
+ $cpactive = true;
+ break;
+ }
+ }
+ }
+ if ($cpactive === false) {
+ set_single_sysctl("net.link.ether.ipfw", "0");
+ }
+ }
+ }
+
+ unlock($captiveportallck);
+
+ return 0;
+}
+
+function captiveportal_init_webgui() {
+ global $config, $cpzone;
+
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cpkey => $cp) {
+ $cpzone = $cpkey;
+ captiveportal_init_webgui_zone($cp);
+ }
+ }
+}
+
+function captiveportal_init_webgui_zonename($zone) {
+ global $config, $cpzone;
+
+ if (isset($config['captiveportal'][$zone])) {
+ $cpzone = $zone;
+ captiveportal_init_webgui_zone($config['captiveportal'][$zone]);
+ }
+}
+
+function captiveportal_init_webgui_zone($cpcfg) {
+ global $g, $config, $cpzone;
+
+ if (!isset($cpcfg['enable'])) {
+ return;
+ }
+
+ if (isset($cpcfg['httpslogin'])) {
+ $cert = lookup_cert($cpcfg['certref']);
+ $crt = base64_decode($cert['crt']);
+ $key = base64_decode($cert['prv']);
+ $ca = ca_chain($cert);
+
+ /* generate lighttpd configuration */
+ if (!empty($cpcfg['listenporthttps'])) {
+ $listenporthttps = $cpcfg['listenporthttps'];
+ } else {
+ $listenporthttps = 8001 + $cpcfg['zoneid'];
+ }
+ system_generate_lighty_config("{$g['varetc_path']}/lighty-{$cpzone}-CaptivePortal-SSL.conf",
+ $crt, $key, $ca, "lighty-{$cpzone}-CaptivePortal-SSL.pid", $listenporthttps, "/usr/local/captiveportal",
+ "cert-{$cpzone}-portal.pem", "ca-{$cpzone}-portal.pem", $cpzone);
+ }
+
+ /* generate lighttpd configuration */
+ if (!empty($cpcfg['listenporthttp'])) {
+ $listenporthttp = $cpcfg['listenporthttp'];
+ } else {
+ $listenporthttp = 8000 + $cpcfg['zoneid'];
+ }
+ system_generate_lighty_config("{$g['varetc_path']}/lighty-{$cpzone}-CaptivePortal.conf",
+ "", "", "", "lighty-{$cpzone}-CaptivePortal.pid", $listenporthttp, "/usr/local/captiveportal",
+ "", "", $cpzone);
+
+ @unlink("{$g['varrun']}/lighty-{$cpzone}-CaptivePortal.pid");
+ /* attempt to start lighttpd */
+ $res = mwexec("/usr/local/sbin/lighttpd -f {$g['varetc_path']}/lighty-{$cpzone}-CaptivePortal.conf");
+
+ /* fire up https instance */
+ if (isset($cpcfg['httpslogin'])) {
+ @unlink("{$g['varrun']}/lighty-{$cpzone}-CaptivePortal-SSL.pid");
+ $res = mwexec("/usr/local/sbin/lighttpd -f {$g['varetc_path']}/lighty-{$cpzone}-CaptivePortal-SSL.conf");
+ }
+}
+
+function captiveportal_init_rules_byinterface($interface) {
+ global $cpzone, $cpzoneid, $config;
+
+ if (!is_array($config['captiveportal'])) {
+ return;
+ }
+
+ foreach ($config['captiveportal'] as $cpkey => $cp) {
+ $cpzone = $cpkey;
+ $cpzoneid = $cp['zoneid'];
+ $cpinterfaces = explode(",", $cp['interface']);
+ if (in_array($interface, $cpinterfaces)) {
+ captiveportal_init_rules();
+ break;
+ }
+ }
+}
+
+/* reinit will disconnect all users, be careful! */
+function captiveportal_init_rules($reinit = false) {
+ global $config, $g, $cpzone, $cpzoneid;
+
+ if (!isset($config['captiveportal'][$cpzone]['enable'])) {
+ return;
+ }
+
+ captiveportal_load_modules();
+ mwexec("/sbin/ipfw zone {$cpzoneid} create", true);
+
+ /* Cleanup so nothing is leaked */
+ captiveportal_free_dnrules();
+ unlink_if_exists("{$g['vardb_path']}/captiveportal_{$cpzone}.rules");
+
+ $cpips = array();
+ $ifaces = get_configured_interface_list();
+ $cpinterfaces = explode(",", $config['captiveportal'][$cpzone]['interface']);
+ $firsttime = 0;
+ foreach ($cpinterfaces as $cpifgrp) {
+ if (!isset($ifaces[$cpifgrp])) {
+ continue;
+ }
+ $tmpif = get_real_interface($cpifgrp);
+ if (!empty($tmpif)) {
+ $cpipm = get_interface_ip($cpifgrp);
+ if (is_ipaddr($cpipm)) {
+ $cpips[] = $cpipm;
+ if (!is_array($config['virtualip']) || !is_array($config['virtualip']['vip'])) {
+ continue;
+ }
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if (($vip['interface'] == $cpifgrp) && (($vip['mode'] == "carp") || ($vip['mode'] == "ipalias"))) {
+ $cpips[] = $vip['subnet'];
+ }
+ }
+ }
+ mwexec("/sbin/ipfw zone {$cpzoneid} madd {$tmpif}", true);
+ }
+ }
+ if (count($cpips) > 0) {
+ $cpactive = true;
+ } else {
+ return false;
+ }
+
+ if ($reinit == false) {
+ $captiveportallck = lock("captiveportal{$cpzone}");
+ }
+
+ $cprules = <<<EOD
+
+flush
+add 65291 allow pfsync from any to any
+add 65292 allow carp from any to any
+
+# layer 2: pass ARP
+add 65301 pass layer2 mac-type arp,rarp
+# pfsense requires for WPA
+add 65302 pass layer2 mac-type 0x888e,0x88c7
+# PPP Over Ethernet Session Stage/Discovery Stage
+add 65303 pass layer2 mac-type 0x8863,0x8864
+
+# layer 2: block anything else non-IP(v4/v6)
+add 65307 deny layer2 not mac-type ip,ipv6
+
+EOD;
+
+ $rulenum = 65310;
+ /* These tables contain host ips */
+ $cprules .= "add {$rulenum} pass ip from any to table(100) in\n";
+ $rulenum++;
+ $cprules .= "add {$rulenum} pass ip from table(100) to any out\n";
+ $rulenum++;
+ $ips = "";
+ foreach ($cpips as $cpip) {
+ $cprules .= "table 100 add {$cpip}\n";
+ }
+ $cprules .= "table 100 add 255.255.255.255\n";
+ $cprules .= "add {$rulenum} pass ip from any to {$ips} in\n";
+ $rulenum++;
+ $cprules .= "add {$rulenum} pass ip from {$ips} to any out\n";
+ $rulenum++;
+ $cprules .= "add {$rulenum} pass icmp from {$ips} to any out icmptype 0\n";
+ $rulenum++;
+ $cprules .= "add {$rulenum} pass icmp from any to {$ips} in icmptype 8 \n";
+ $rulenum++;
+ /* Allowed ips */
+ $cprules .= "add {$rulenum} pipe tablearg ip from table(3) to any in\n";
+ $rulenum++;
+ $cprules .= "add {$rulenum} pipe tablearg ip from any to table(4) in\n";
+ $rulenum++;
+ $cprules .= "add {$rulenum} pipe tablearg ip from table(3) to any out\n";
+ $rulenum++;
+ $cprules .= "add {$rulenum} pipe tablearg ip from any to table(4) out\n";
+ $rulenum++;
+
+ /* Authenticated users rules. */
+ $cprules .= "add {$rulenum} pipe tablearg ip from table(1) to any in\n";
+ $rulenum++;
+ $cprules .= "add {$rulenum} pipe tablearg ip from any to table(2) out\n";
+ $rulenum++;
+
+ if (!empty($config['captiveportal'][$cpzone]['listenporthttp'])) {
+ $listenporthttp = $config['captiveportal'][$cpzone]['listenporthttp'];
+ } else {
+ $listenporthttp = 8000 + $cpzoneid;
+ }
+
+ if (isset($config['captiveportal'][$cpzone]['httpslogin'])) {
+ if (!empty($config['captiveportal'][$cpzone]['listenporthttps'])) {
+ $listenporthttps = $config['captiveportal'][$cpzone]['listenporthttps'];
+ } else {
+ $listenporthttps = 8001 + $cpzoneid;
+ }
+ if (!isset($config['captiveportal'][$cpzone]['nohttpsforwards'])) {
+ $cprules .= "add 65531 fwd 127.0.0.1,{$listenporthttps} tcp from any to any dst-port 443 in\n";
+ }
+ }
+
+ $cprules .= <<<EOD
+
+# redirect non-authenticated clients to captive portal
+add 65532 fwd 127.0.0.1,{$listenporthttp} tcp from any to any dst-port 80 in
+# let the responses from the captive portal web server back out
+add 65533 pass tcp from any to any out
+# block everything else
+add 65534 deny all from any to any
+
+EOD;
+
+ /* generate passthru mac database */
+ $cprules .= captiveportal_passthrumac_configure(true);
+ $cprules .= "\n";
+
+ /* allowed ipfw rules to make allowed ip work */
+ $cprules .= captiveportal_allowedip_configure();
+
+ /* allowed ipfw rules to make allowed hostnames work */
+ $cprules .= captiveportal_allowedhostname_configure();
+
+ /* load rules */
+ file_put_contents("{$g['tmp_path']}/ipfw_{$cpzone}.cp.rules", $cprules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} -q {$g['tmp_path']}/ipfw_{$cpzone}.cp.rules", true);
+ //@unlink("{$g['tmp_path']}/ipfw_{$cpzone}.cp.rules");
+ unset($cprules);
+
+ if ($reinit == false) {
+ unlock($captiveportallck);
+ }
+}
+
+/*
+ * Remove clients that have been around for longer than the specified amount of time
+ * db file structure:
+ * timestamp,ipfw_rule_no,clientip,clientmac,username,sessionid,password,session_timeout,idle_timeout,session_terminate_time,interim_interval
+ * (password is in Base64 and only saved when reauthentication is enabled)
+ */
+function captiveportal_prune_old() {
+ global $g, $config, $cpzone, $cpzoneid;
+
+ if (empty($cpzone)) {
+ return;
+ }
+
+ $cpcfg = $config['captiveportal'][$cpzone];
+ $vcpcfg = $config['voucher'][$cpzone];
+
+ /* check for expired entries */
+ $idletimeout = 0;
+ $timeout = 0;
+ if (!empty($cpcfg['timeout']) && is_numeric($cpcfg['timeout'])) {
+ $timeout = $cpcfg['timeout'] * 60;
+ }
+
+ if (!empty($cpcfg['idletimeout']) && is_numeric($cpcfg['idletimeout'])) {
+ $idletimeout = $cpcfg['idletimeout'] * 60;
+ }
+
+ /* Is there any job to do? */
+ if (!$timeout && !$idletimeout && !isset($cpcfg['reauthenticate']) &&
+ !isset($cpcfg['radiussession_timeout']) && !isset($vcpcfg['enable'])) {
+ return;
+ }
+
+ $radiussrvs = captiveportal_get_radius_servers();
+
+ /* Read database */
+ /* NOTE: while this can be simplified in non radius case keep as is for now */
+ $cpdb = captiveportal_read_db();
+
+ $unsetindexes = array();
+ $voucher_needs_sync = false;
+ /*
+ * Snapshot the time here to use for calculation to speed up the process.
+ * If something is missed next run will catch it!
+ */
+ $pruning_time = time();
+ $stop_time = $pruning_time;
+ foreach ($cpdb as $cpentry) {
+
+ $timedout = false;
+ $term_cause = 1;
+ if (empty($cpentry[11])) {
+ $cpentry[11] = 'first';
+ }
+ $radiusservers = $radiussrvs[$cpentry[11]];
+
+ /* hard timeout? */
+ if ($timeout) {
+ if (($pruning_time - $cpentry[0]) >= $timeout) {
+ $timedout = true;
+ $term_cause = 5; // Session-Timeout
+ }
+ }
+
+ /* Session-Terminate-Time */
+ if (!$timedout && !empty($cpentry[9])) {
+ if ($pruning_time >= $cpentry[9]) {
+ $timedout = true;
+ $term_cause = 5; // Session-Timeout
+ }
+ }
+
+ /* check if the radius idle_timeout attribute has been set and if its set change the idletimeout to this value */
+ $uidletimeout = (is_numeric($cpentry[8])) ? $cpentry[8] : $idletimeout;
+ /* if an idle timeout is specified, get last activity timestamp from ipfw */
+ if (!$timedout && $uidletimeout > 0) {
+ $lastact = captiveportal_get_last_activity($cpentry[2], $cpentry[3]);
+ /* If the user has logged on but not sent any traffic they will never be logged out.
+ * We "fix" this by setting lastact to the login timestamp.
+ */
+ $lastact = $lastact ? $lastact : $cpentry[0];
+ if ($lastact && (($pruning_time - $lastact) >= $uidletimeout)) {
+ $timedout = true;
+ $term_cause = 4; // Idle-Timeout
+ $stop_time = $lastact; // Entry added to comply with WISPr
+ }
+ }
+
+ /* if vouchers are configured, activate session timeouts */
+ if (!$timedout && isset($vcpcfg['enable']) && !empty($cpentry[7])) {
+ if ($pruning_time >= ($cpentry[0] + $cpentry[7])) {
+ $timedout = true;
+ $term_cause = 5; // Session-Timeout
+ $voucher_needs_sync = true;
+ }
+ }
+
+ /* if radius session_timeout is enabled and the session_timeout is not null, then check if the user should be logged out */
+ if (!$timedout && isset($cpcfg['radiussession_timeout']) && !empty($cpentry[7])) {
+ if ($pruning_time >= ($cpentry[0] + $cpentry[7])) {
+ $timedout = true;
+ $term_cause = 5; // Session-Timeout
+ }
+ }
+
+ if ($timedout) {
+ captiveportal_disconnect($cpentry, $radiusservers, $term_cause, $stop_time);
+ captiveportal_logportalauth($cpentry[4], $cpentry[3], $cpentry[2], "TIMEOUT");
+ $unsetindexes[] = $cpentry[5];
+ }
+
+ /* do periodic RADIUS reauthentication? */
+ if (!$timedout && !empty($radiusservers)) {
+ if (isset($cpcfg['radacct_enable'])) {
+ if ($cpcfg['reauthenticateacct'] == "stopstart") {
+ /* stop and restart accounting */
+ RADIUS_ACCOUNTING_STOP($cpentry[1], // ruleno
+ $cpentry[4], // username
+ $cpentry[5], // sessionid
+ $cpentry[0], // start time
+ $radiusservers,
+ $cpentry[2], // clientip
+ $cpentry[3], // clientmac
+ 10); // NAS Request
+ $clientsn = (is_ipaddrv6($cpentry[2])) ? 128 : 32;
+ $_gb = @pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XZEROENTRY, 1, $cpentry[2], $clientsn, $cpentry[3]);
+ $_gb = @pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XZEROENTRY, 2, $cpentry[2], $clientsn, $cpentry[3]);
+ RADIUS_ACCOUNTING_START($cpentry[1], // ruleno
+ $cpentry[4], // username
+ $cpentry[5], // sessionid
+ $radiusservers,
+ $cpentry[2], // clientip
+ $cpentry[3]); // clientmac
+ } else if ($cpcfg['reauthenticateacct'] == "interimupdate") {
+ $session_time = $pruning_time - $cpentry[0];
+ if (!empty($cpentry[10]) && $cpentry[10] > 60) {
+ $interval = $cpentry[10];
+ } else {
+ $interval = 0;
+ }
+ $past_interval_min = ($session_time > $interval);
+ if ($interval != 0) {
+ $within_interval = ($session_time % $interval >= 0 && $session_time % $interval <= 59);
+ }
+ if ($interval === 0 || ($interval > 0 && $past_interval_min && $within_interval)) {
+ RADIUS_ACCOUNTING_STOP($cpentry[1], // ruleno
+ $cpentry[4], // username
+ $cpentry[5], // sessionid
+ $cpentry[0], // start time
+ $radiusservers,
+ $cpentry[2], // clientip
+ $cpentry[3], // clientmac
+ 10, // NAS Request
+ true); // Interim Updates
+ }
+ }
+ }
+
+ /* check this user against RADIUS again */
+ if (isset($cpcfg['reauthenticate'])) {
+ $auth_list = RADIUS_AUTHENTICATION($cpentry[4], // username
+ base64_decode($cpentry[6]), // password
+ $radiusservers,
+ $cpentry[2], // clientip
+ $cpentry[3], // clientmac
+ $cpentry[1]); // ruleno
+ if ($auth_list['auth_val'] == 3) {
+ captiveportal_disconnect($cpentry, $radiusservers, 17);
+ captiveportal_logportalauth($cpentry[4], $cpentry[3], $cpentry[2], "RADIUS_DISCONNECT", $auth_list['reply_message']);
+ $unsetindexes[] = $cpentry[5];
+ } else if ($auth_list['auth_val'] == 2) {
+ captiveportal_reapply_attributes($cpentry, $auth_list);
+ }
+ }
+ }
+ }
+ unset($cpdb);
+
+ captiveportal_prune_old_automac();
+
+ if ($voucher_needs_sync == true) {
+ /* Trigger a sync of the vouchers on config */
+ send_event("service sync vouchers");
+ }
+
+ /* write database */
+ if (!empty($unsetindexes)) {
+ captiveportal_remove_entries($unsetindexes);
+ }
+}
+
+function captiveportal_prune_old_automac() {
+ global $g, $config, $cpzone, $cpzoneid;
+
+ if (is_array($config['captiveportal'][$cpzone]['passthrumac']) && isset($config['captiveportal'][$cpzone]['passthrumacaddusername'])) {
+ $tmpvoucherdb = array();
+ $macrules = "";
+ $writecfg = false;
+ foreach ($config['captiveportal'][$cpzone]['passthrumac'] as $eid => $emac) {
+ if ($emac['logintype'] == "voucher") {
+ if (isset($config['captiveportal'][$cpzone]['noconcurrentlogins'])) {
+ if (isset($tmpvoucherdb[$emac['username']])) {
+ $temac = $config['captiveportal'][$cpzone]['passthrumac'][$tmpvoucherdb[$emac['username']]];
+ $ruleno = captiveportal_get_ipfw_passthru_ruleno($temac['mac']);
+ $pipeno = captiveportal_get_dn_passthru_ruleno($temac['mac']);
+ if ($ruleno) {
+ captiveportal_free_ipfw_ruleno($ruleno);
+ $macrules .= "delete {$ruleno}";
+ ++$ruleno;
+ $macrules .= "delete {$ruleno}";
+ }
+ if ($pipeno) {
+ captiveportal_free_dn_ruleno($pipeno);
+ $macrules .= "pipe delete {$pipeno}\n";
+ ++$pipeno;
+ $macrules .= "pipe delete {$pipeno}\n";
+ }
+ $writecfg = true;
+ captiveportal_logportalauth($temac['username'], $temac['mac'], $temac['ip'], "DUPLICATE {$temac['username']} LOGIN - TERMINATING OLD SESSION");
+ unset($config['captiveportal'][$cpzone]['passthrumac'][$tmpvoucherdb[$emac['username']]]);
+ }
+ $tmpvoucherdb[$emac['username']] = $eid;
+ }
+ if (voucher_auth($emac['username']) <= 0) {
+ $ruleno = captiveportal_get_ipfw_passthru_ruleno($emac['mac']);
+ $pipeno = captiveportal_get_dn_passthru_ruleno($emac['mac']);
+ if ($ruleno) {
+ captiveportal_free_ipfw_ruleno($ruleno);
+ $macrules .= "delete {$ruleno}";
+ ++$ruleno;
+ $macrules .= "delete {$ruleno}";
+ }
+ if ($pipeno) {
+ captiveportal_free_dn_ruleno($pipeno);
+ $macrules .= "pipe delete {$pipeno}\n";
+ ++$pipeno;
+ $macrules .= "pipe delete {$pipeno}\n";
+ }
+ $writecfg = true;
+ captiveportal_logportalauth($emac['username'], $emac['mac'], $emac['ip'], "EXPIRED {$emac['username']} LOGIN - TERMINATING SESSION");
+ unset($config['captiveportal'][$cpzone]['passthrumac'][$eid]);
+ }
+ }
+ }
+ unset($tmpvoucherdb);
+ if (!empty($macrules)) {
+ @file_put_contents("{$g['tmp_path']}/macentry.prunerules.tmp", $macrules);
+ unset($macrules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} -q {$g['tmp_path']}/macentry.prunerules.tmp");
+ }
+ if ($writecfg === true) {
+ write_config("Prune session for auto-added macs");
+ }
+ }
+}
+
+/* remove a single client according to the DB entry */
+function captiveportal_disconnect($dbent, $radiusservers, $term_cause = 1, $stop_time = null) {
+ global $g, $config, $cpzone, $cpzoneid;
+
+ $stop_time = (empty($stop_time)) ? time() : $stop_time;
+
+ /* this client needs to be deleted - remove ipfw rules */
+ if (isset($config['captiveportal'][$cpzone]['radacct_enable']) && !empty($radiusservers)) {
+ RADIUS_ACCOUNTING_STOP($dbent[1], // ruleno
+ $dbent[4], // username
+ $dbent[5], // sessionid
+ $dbent[0], // start time
+ $radiusservers,
+ $dbent[2], // clientip
+ $dbent[3], // clientmac
+ $term_cause, // Acct-Terminate-Cause
+ false,
+ $stop_time);
+ }
+
+ if (is_ipaddr($dbent[2])) {
+ /* Delete client's ip entry from tables 1 and 2. */
+ $clientsn = (is_ipaddrv6($dbent[2])) ? 128 : 32;
+ pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XDEL, 1, $dbent[2], $clientsn, $dbent[3]);
+ pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XDEL, 2, $dbent[2], $clientsn, $dbent[3]);
+ /* XXX: Redundant?! Ensure all pf(4) states are killed. */
+ $_gb = @pfSense_kill_states($dbent[2]);
+ $_gb = @pfSense_kill_srcstates($dbent[2]);
+ }
+
+ /*
+ * These are the pipe numbers we use to control traffic shaping for each logged in user via captive portal
+ * We could get an error if the pipe doesn't exist but everything should still be fine
+ */
+ if (!empty($dbent[1])) {
+ $_gb = @pfSense_pipe_action("pipe delete {$dbent[1]}");
+ $_gb = @pfSense_pipe_action("pipe delete " . ($dbent[1]+1));
+
+ /* Release the ruleno so it can be reallocated to new clients. */
+ captiveportal_free_dn_ruleno($dbent[1]);
+ }
+
+ // XMLRPC Call over to the master Voucher node
+ if (!empty($config['voucher'][$cpzone]['vouchersyncdbip'])) {
+ $syncip = $config['voucher'][$cpzone]['vouchersyncdbip'];
+ $syncport = $config['voucher'][$cpzone]['vouchersyncport'];
+ $syncpass = $config['voucher'][$cpzone]['vouchersyncpass'];
+ $vouchersyncusername = $config['voucher'][$cpzone]['vouchersyncusername'];
+ $remote_status = xmlrpc_sync_voucher_disconnect($dbent, $syncip, $syncport, $syncpass, $vouchersyncusername, $term_cause, $stop_time);
+ }
+
+}
+
+/* remove a single client by sessionid */
+function captiveportal_disconnect_client($sessionid, $term_cause = 1, $logoutReason = "LOGOUT") {
+ global $g, $config;
+
+ $radiusservers = captiveportal_get_radius_servers();
+
+ /* read database */
+ $result = captiveportal_read_db("WHERE sessionid = '{$sessionid}'");
+
+ /* find entry */
+ if (!empty($result)) {
+ captiveportal_write_db("DELETE FROM captiveportal WHERE sessionid = '{$sessionid}'");
+
+ foreach ($result as $cpentry) {
+ if (empty($cpentry[11])) {
+ $cpentry[11] = 'first';
+ }
+ captiveportal_disconnect($cpentry, $radiusservers[$cpentry[11]], $term_cause);
+ captiveportal_logportalauth($cpentry[4], $cpentry[3], $cpentry[2], "DISCONNECT");
+ }
+ unset($result);
+ }
+}
+
+/* send RADIUS acct stop for all current clients */
+function captiveportal_radius_stop_all() {
+ global $config, $cpzone;
+
+ if (!isset($config['captiveportal'][$cpzone]['radacct_enable'])) {
+ return;
+ }
+
+ $radiusservers = captiveportal_get_radius_servers();
+ if (!empty($radiusservers)) {
+ $cpdb = captiveportal_read_db();
+ foreach ($cpdb as $cpentry) {
+ if (empty($cpentry[11])) {
+ $cpentry[11] = 'first';
+ }
+ if (!empty($radiusservers[$cpentry[11]])) {
+ RADIUS_ACCOUNTING_STOP($cpentry[1], // ruleno
+ $cpentry[4], // username
+ $cpentry[5], // sessionid
+ $cpentry[0], // start time
+ $radiusservers[$cpentry[11]],
+ $cpentry[2], // clientip
+ $cpentry[3], // clientmac
+ 7); // Admin Reboot
+ }
+ }
+ }
+}
+
+function captiveportal_passthrumac_configure_entry($macent, $pipeinrule = false) {
+ global $config, $g, $cpzone;
+
+ $bwUp = 0;
+ if (!empty($macent['bw_up'])) {
+ $bwUp = $macent['bw_up'];
+ } else if (!empty($config['captiveportal'][$cpzone]['bwdefaultup'])) {
+ $bwUp = $config['captiveportal'][$cpzone]['bwdefaultup'];
+ }
+ $bwDown = 0;
+ if (!empty($macent['bw_down'])) {
+ $bwDown = $macent['bw_down'];
+ } else if (!empty($config['captiveportal'][$cpzone]['bwdefaultdn'])) {
+ $bwDown = $config['captiveportal'][$cpzone]['bwdefaultdn'];
+ }
+
+ $ruleno = captiveportal_get_next_ipfw_ruleno();
+
+ if ($macent['action'] == 'pass') {
+ $rules = "";
+ $pipeno = captiveportal_get_next_dn_ruleno();
+
+ $pipeup = $pipeno;
+ if ($pipeinrule == true) {
+ $_gb = @pfSense_pipe_action("pipe {$pipeno} config bw {$bwUp}Kbit/s queue 100 buckets 16");
+ } else {
+ $rules .= "pipe {$pipeno} config bw {$bwUp}Kbit/s queue 100 buckets 16\n";
+ }
+
+ $pipedown = $pipeno + 1;
+ if ($pipeinrule == true) {
+ $_gb = @pfSense_pipe_action("pipe {$pipedown} config bw {$bwDown}Kbit/s queue 100 buckets 16");
+ } else {
+ $rules .= "pipe {$pipedown} config bw {$bwDown}Kbit/s queue 100 buckets 16\n";
+ }
+
+ $rules .= "add {$ruleno} pipe {$pipeup} ip from any to any MAC any {$macent['mac']}\n";
+ $ruleno++;
+ $rules .= "add {$ruleno} pipe {$pipedown} ip from any to any MAC {$macent['mac']} any\n";
+ }
+
+ return $rules;
+}
+
+function captiveportal_passthrumac_delete_entry($macent) {
+ $rules = "";
+
+ if ($macent['action'] == 'pass') {
+ $ruleno = captiveportal_get_ipfw_passthru_ruleno($macent['mac']);
+
+ if (!$ruleno) {
+ return $rules;
+ }
+
+ captiveportal_free_ipfw_ruleno($ruleno);
+
+ $rules .= "delete {$ruleno}\n";
+ $rules .= "delete " . ++$ruleno . "\n";
+
+ $pipeno = captiveportal_get_dn_passthru_ruleno($macent['mac']);
+
+ if (!empty($pipeno)) {
+ captiveportal_free_dn_ruleno($pipeno);
+ $rules .= "pipe delete " . $pipeno . "\n";
+ $rules .= "pipe delete " . ++$pipeno . "\n";
+ }
+ }
+
+ return $rules;
+}
+
+function captiveportal_passthrumac_configure($filename = false, $startindex = 0, $stopindex = 0) {
+ global $config, $g, $cpzone;
+
+ $rules = "";
+
+ if (is_array($config['captiveportal'][$cpzone]['passthrumac'])) {
+ if ($stopindex > 0) {
+ $fd = fopen($filename, "w");
+ for ($idx = $startindex; $idx <= $stopindex; $idx++) {
+ if (isset($config['captiveportal'][$cpzone]['passthrumac'][$idx])) {
+ $rules = captiveportal_passthrumac_configure_entry($config['captiveportal'][$cpzone]['passthrumac'][$idx]);
+ fwrite($fd, $rules);
+ }
+ }
+ fclose($fd);
+
+ return;
+ } else {
+ $nentries = count($config['captiveportal'][$cpzone]['passthrumac']);
+ if ($nentries > 2000) {
+ $nloops = $nentries / 1000;
+ $remainder= $nentries % 1000;
+ for ($i = 0; $i < $nloops; $i++) {
+ mwexec_bg("/usr/local/sbin/fcgicli -f /etc/rc.captiveportal_configure_mac -d \"cpzone={$cpzone}&startidx=" . ($i * 1000) . "&stopidx=" . ((($i+1) * 1000) - 1) . "\"");
+ }
+ if ($remainder > 0) {
+ mwexec_bg("/usr/local/sbin/fcgicli -f /etc/rc.captiveportal_configure_mac -d \"cpzone={$cpzone}&startidx=" . ($i * 1000) . "&stopidx=" . (($i* 1000) + $remainder) ."\"");
+ }
+ } else {
+ foreach ($config['captiveportal'][$cpzone]['passthrumac'] as $macent) {
+ $rules .= captiveportal_passthrumac_configure_entry($macent, true);
+ }
+ }
+ }
+ }
+
+ return $rules;
+}
+
+function captiveportal_passthrumac_findbyname($username) {
+ global $config, $cpzone;
+
+ if (is_array($config['captiveportal'][$cpzone]['passthrumac'])) {
+ foreach ($config['captiveportal'][$cpzone]['passthrumac'] as $macent) {
+ if ($macent['username'] == $username) {
+ return $macent;
+ }
+ }
+ }
+ return NULL;
+}
+
+/*
+ * table (3=IN)/(4=OUT) hold allowed ip's without bw limits
+ */
+function captiveportal_allowedip_configure_entry($ipent, $ishostname = false) {
+ global $g;
+
+ /* Instead of copying this entire function for something
+ * easy such as hostname vs ip address add this check
+ */
+ if ($ishostname === true) {
+ if (!platform_booting()) {
+ $ipaddress = gethostbyname($ipent['hostname']);
+ if (!is_ipaddr($ipaddress)) {
+ return;
+ }
+ } else {
+ $ipaddress = "";
+ }
+ } else {
+ $ipaddress = $ipent['ip'];
+ }
+
+ $rules = "";
+ $cp_filterdns_conf = "";
+ $enBwup = 0;
+ if (!empty($ipent['bw_up'])) {
+ $enBwup = intval($ipent['bw_up']);
+ } else if (!empty($config['captiveportal'][$cpzone]['bwdefaultup'])) {
+ $enBwup = $config['captiveportal'][$cpzone]['bwdefaultup'];
+ }
+ $enBwdown = 0;
+ if (!empty($ipent['bw_down'])) {
+ $enBwdown = intval($ipent['bw_down']);
+ } else if (!empty($config['captiveportal'][$cpzone]['bwdefaultdn'])) {
+ $enBwdown = $config['captiveportal'][$cpzone]['bwdefaultdn'];
+ }
+
+ $pipeno = captiveportal_get_next_dn_ruleno();
+ $_gb = @pfSense_pipe_action("pipe {$pipeno} config bw {$enBwup}Kbit/s queue 100 buckets 16");
+ $pipedown = $pipeno + 1;
+ $_gb = @pfSense_pipe_action("pipe {$pipedown} config bw {$enBwdown}Kbit/s queue 100 buckets 16");
+ if ($ishostname === true) {
+ $cp_filterdns_conf .= "ipfw {$ipent['hostname']} 3 pipe {$pipeno}\n";
+ $cp_filterdns_conf .= "ipfw {$ipent['hostname']} 4 pipe {$pipedown}\n";
+ if (!is_ipaddr($ipaddress)) {
+ return array("", $cp_filterdns_conf);
+ }
+ }
+ $subnet = "";
+ if (!empty($ipent['sn'])) {
+ $subnet = "/{$ipent['sn']}";
+ }
+ $rules .= "table 3 add {$ipaddress}{$subnet} {$pipeno}\n";
+ $rules .= "table 4 add {$ipaddress}{$subnet} {$pipedown}\n";
+
+ if ($ishostname === true) {
+ return array($rules, $cp_filterdns_conf);
+ } else {
+ return $rules;
+ }
+}
+
+function captiveportal_allowedhostname_configure() {
+ global $config, $g, $cpzone, $cpzoneid;
+
+ $rules = "";
+ if (is_array($config['captiveportal'][$cpzone]['allowedhostname'])) {
+ $rules = "\n# captiveportal_allowedhostname_configure()\n";
+ $cp_filterdns_conf = "";
+ foreach ($config['captiveportal'][$cpzone]['allowedhostname'] as $hostnameent) {
+ $tmprules = captiveportal_allowedip_configure_entry($hostnameent, true);
+ $rules .= $tmprules[0];
+ $cp_filterdns_conf .= $tmprules[1];
+ }
+ $cp_filterdns_filename = "{$g['varetc_path']}/filterdns-{$cpzone}-captiveportal.conf";
+ @file_put_contents($cp_filterdns_filename, $cp_filterdns_conf);
+ unset($cp_filterdns_conf);
+ if (isvalidpid("{$g['varrun_path']}/filterdns-{$cpzone}-cpah.pid")) {
+ sigkillbypid("{$g['varrun_path']}/filterdns-{$cpzone}-cpah.pid", "HUP");
+ } else {
+ mwexec("/usr/local/sbin/filterdns -p {$g['varrun_path']}/filterdns-{$cpzone}-cpah.pid -i 300 -c {$cp_filterdns_filename} -y {$cpzoneid} -d 1");
+ }
+ } else {
+ killbypid("{$g['varrun_path']}/filterdns-{$cpzone}-cpah.pid");
+ @unlink("{$g['varrun_path']}/filterdns-{$cpzone}-cpah.pid");
+ }
+
+ return $rules;
+}
+
+function captiveportal_allowedip_configure() {
+ global $config, $g, $cpzone;
+
+ $rules = "";
+ if (is_array($config['captiveportal'][$cpzone]['allowedip'])) {
+ foreach ($config['captiveportal'][$cpzone]['allowedip'] as $ipent) {
+ $rules .= captiveportal_allowedip_configure_entry($ipent);
+ }
+ }
+
+ return $rules;
+}
+
+/* get last activity timestamp given client IP address */
+function captiveportal_get_last_activity($ip, $mac = NULL, $table = 1) {
+ global $cpzoneid;
+
+ $ipfwoutput = pfSense_ipfw_getTablestats($cpzoneid, IP_FW_TABLE_XLISTENTRY, $table, $ip, $mac);
+ /* Reading only from one of the tables is enough of approximation. */
+ if (is_array($ipfwoutput)) {
+ /* Workaround for #46652 */
+ if ($ipfwoutput['packets'] > 0) {
+ return $ipfwoutput['timestamp'];
+ } else {
+ return 0;
+ }
+ }
+
+ return 0;
+}
+
+function captiveportal_init_radius_servers() {
+ global $config, $g, $cpzone;
+
+ /* generate radius server database */
+ if ($config['captiveportal'][$cpzone]['radiusip'] &&
+ (!isset($config['captiveportal'][$cpzone]['auth_method']) || $config['captiveportal'][$cpzone]['auth_method'] == "radius")) {
+ $radiusip = $config['captiveportal'][$cpzone]['radiusip'];
+ $radiusip2 = ($config['captiveportal'][$cpzone]['radiusip2']) ? $config['captiveportal'][$cpzone]['radiusip2'] : null;
+ $radiusip3 = ($config['captiveportal'][$cpzone]['radiusip3']) ? $config['captiveportal'][$cpzone]['radiusip3'] : null;
+ $radiusip4 = ($config['captiveportal'][$cpzone]['radiusip4']) ? $config['captiveportal'][$cpzone]['radiusip4'] : null;
+
+ if ($config['captiveportal'][$cpzone]['radiusport']) {
+ $radiusport = $config['captiveportal'][$cpzone]['radiusport'];
+ } else {
+ $radiusport = 1812;
+ }
+ if ($config['captiveportal'][$cpzone]['radiusacctport']) {
+ $radiusacctport = $config['captiveportal'][$cpzone]['radiusacctport'];
+ } else {
+ $radiusacctport = 1813;
+ }
+ if ($config['captiveportal'][$cpzone]['radiusport2']) {
+ $radiusport2 = $config['captiveportal'][$cpzone]['radiusport2'];
+ } else {
+ $radiusport2 = 1812;
+ }
+ if ($config['captiveportal'][$cpzone]['radiusport3']) {
+ $radiusport3 = $config['captiveportal'][$cpzone]['radiusport3'];
+ } else {
+ $radiusport3 = 1812;
+ }
+ if ($config['captiveportal'][$cpzone]['radiusport4']) {
+ $radiusport4 = $config['captiveportal'][$cpzone]['radiusport4'];
+ } else {
+ $radiusport4 = 1812;
+ }
+
+ $radiuskey = $config['captiveportal'][$cpzone]['radiuskey'];
+ $radiuskey2 = $config['captiveportal'][$cpzone]['radiuskey2'];
+ $radiuskey3 = $config['captiveportal'][$cpzone]['radiuskey3'];
+ $radiuskey4 = $config['captiveportal'][$cpzone]['radiuskey4'];
+
+ $cprdsrvlck = lock("captiveportalradius{$cpzone}", LOCK_EX);
+ $fd = @fopen("{$g['vardb_path']}/captiveportal_radius_{$cpzone}.db", "w");
+ if (!$fd) {
+ captiveportal_syslog("Error: cannot open radius DB file in captiveportal_configure().\n");
+ unlock($cprdsrvlck);
+ return 1;
+ }
+ if (isset($radiusip)) {
+ fwrite($fd, $radiusip . "," . $radiusport . "," . $radiusacctport . "," . $radiuskey . ",first");
+ }
+ if (isset($radiusip2)) {
+ fwrite($fd, "\n" . $radiusip2 . "," . $radiusport2 . "," . $radiusacctport . "," . $radiuskey2 . ",first");
+ }
+ if (isset($radiusip3)) {
+ fwrite($fd, "\n" . $radiusip3 . "," . $radiusport3 . "," . $radiusacctport . "," . $radiuskey3 . ",second");
+ }
+ if (isset($radiusip4)) {
+ fwrite($fd, "\n" . $radiusip4 . "," . $radiusport4 . "," . $radiusacctport . "," . $radiuskey4 . ",second");
+ }
+
+ fclose($fd);
+ unlock($cprdsrvlck);
+ }
+}
+
+/* read RADIUS servers into array */
+function captiveportal_get_radius_servers() {
+ global $g, $cpzone;
+
+ $cprdsrvlck = lock("captiveportalradius{$cpzone}");
+ if (file_exists("{$g['vardb_path']}/captiveportal_radius_{$cpzone}.db")) {
+ $radiusservers = array();
+ $cpradiusdb = file("{$g['vardb_path']}/captiveportal_radius_{$cpzone}.db",
+ FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if ($cpradiusdb) {
+ foreach ($cpradiusdb as $cpradiusentry) {
+ $line = trim($cpradiusentry);
+ if ($line) {
+ $radsrv = array();
+ list($radsrv['ipaddr'], $radsrv['port'], $radsrv['acctport'], $radsrv['key'], $context) = explode(",", $line);
+ }
+ if (empty($context)) {
+ if (!is_array($radiusservers['first'])) {
+ $radiusservers['first'] = array();
+ }
+ $radiusservers['first'] = $radsrv;
+ } else {
+ if (!is_array($radiusservers[$context])) {
+ $radiusservers[$context] = array();
+ }
+ $radiusservers[$context][] = $radsrv;
+ }
+ }
+ }
+ unlock($cprdsrvlck);
+ return $radiusservers;
+ }
+
+ unlock($cprdsrvlck);
+ return false;
+}
+
+/* log successful captive portal authentication to syslog */
+/* part of this code from php.net */
+function captiveportal_logportalauth($user, $mac, $ip, $status, $message = null) {
+ // Log it
+ if (!$message) {
+ $message = "{$status}: {$user}, {$mac}, {$ip}";
+ } else {
+ $message = trim($message);
+ $message = "{$status}: {$user}, {$mac}, {$ip}, {$message}";
+ }
+ captiveportal_syslog($message);
+}
+
+/* log simple messages to syslog */
+function captiveportal_syslog($message) {
+ global $cpzone;
+
+ $message = trim($message);
+ $message = "Zone: {$cpzone} - {$message}";
+ openlog("logportalauth", LOG_PID, LOG_LOCAL4);
+ // Log it
+ syslog(LOG_INFO, $message);
+ closelog();
+}
+
+function radius($username, $password, $clientip, $clientmac, $type, $radiusctx = null) {
+ global $g, $config, $cpzoneid;
+
+ $pipeno = captiveportal_get_next_dn_ruleno();
+
+ /* If the pool is empty, return appropriate message and fail authentication */
+ if (empty($pipeno)) {
+ $auth_list = array();
+ $auth_list['auth_val'] = 1;
+ $auth_list['error'] = "System reached maximum login capacity";
+ return $auth_list;
+ }
+
+ $radiusservers = captiveportal_get_radius_servers();
+
+ if (is_null($radiusctx)) {
+ $radiusctx = 'first';
+ }
+
+ $auth_list = RADIUS_AUTHENTICATION($username,
+ $password,
+ $radiusservers[$radiusctx],
+ $clientip,
+ $clientmac,
+ $pipeno);
+
+ if ($auth_list['auth_val'] == 2) {
+ captiveportal_logportalauth($username, $clientmac, $clientip, $type);
+ $sessionid = portal_allow($clientip,
+ $clientmac,
+ $username,
+ $password,
+ $auth_list,
+ $pipeno,
+ $radiusctx);
+ } else {
+ captiveportal_free_dn_ruleno($pipeno);
+ }
+
+ return $auth_list;
+}
+
+function captiveportal_opendb() {
+ global $g, $cpzone;
+
+ $db_path = "{$g['vardb_path']}/captiveportal{$cpzone}.db";
+ $createquery = "CREATE TABLE IF NOT EXISTS captiveportal (" .
+ "allow_time INTEGER, pipeno INTEGER, ip TEXT, mac TEXT, username TEXT, " .
+ "sessionid TEXT, bpassword TEXT, session_timeout INTEGER, idle_timeout INTEGER, " .
+ "session_terminate_time INTEGER, interim_interval INTEGER, radiusctx TEXT); " .
+ "CREATE UNIQUE INDEX IF NOT EXISTS idx_active ON captiveportal (sessionid, username); " .
+ "CREATE INDEX IF NOT EXISTS user ON captiveportal (username); " .
+ "CREATE INDEX IF NOT EXISTS ip ON captiveportal (ip); " .
+ "CREATE INDEX IF NOT EXISTS starttime ON captiveportal (allow_time)";
+
+ try {
+ $DB = new SQLite3($db_path);
+ } catch (Exception $e) {
+ captiveportal_syslog("Could not open {$db_path} as an sqlite database for {$cpzone}. Error message: " . $e->getMessage() . " -- Trying again.");
+ unlink_if_exists($db_path);
+ try {
+ $DB = new SQLite3($db_path);
+ } catch (Exception $e) {
+ captiveportal_syslog("Still could not open {$db_path} as an sqlite database for {$cpzone}. Error message: " . $e->getMessage() . " -- Remove the database file manually and ensure there is enough free space.");
+ return;
+ }
+ }
+
+ if (!$DB) {
+ captiveportal_syslog("Could not open {$db_path} as an sqlite database for {$cpzone}. Error message: {$DB->lastErrorMsg()}. Trying again.");
+ unlink_if_exists($db_path);
+ $DB = new SQLite3($db_path);
+ if (!$DB) {
+ captiveportal_syslog("Still could not open {$db_path} as an sqlite database for {$cpzone}. Error message: {$DB->lastErrorMsg()}. Remove the database file manually and ensure there is enough free space.");
+ return;
+ }
+ }
+
+ if (! $DB->exec($createquery)) {
+ captiveportal_syslog("Error during table {$cpzone} creation. Error message: {$DB->lastErrorMsg()}. Resetting and trying again.");
+
+ /* If unable to initialize the database, reset and try again. */
+ $DB->close();
+ unset($DB);
+ unlink_if_exists($db_path);
+ $DB = new SQLite3($db_path);
+ if ($DB->exec($createquery)) {
+ captiveportal_syslog("Successfully reinitialized tables for {$cpzone} -- database has been reset.");
+ } else {
+ captiveportal_syslog("Still unable to create tables for {$cpzone}. Error message: {$DB->lastErrorMsg()}. Remove the database file manually and try again.");
+ }
+ }
+
+ return $DB;
+}
+
+/* read captive portal DB into array */
+function captiveportal_read_db($query = "") {
+ $cpdb = array();
+
+ $DB = captiveportal_opendb();
+ if ($DB) {
+ $response = $DB->query("SELECT * FROM captiveportal {$query}");
+ if ($response != FALSE) {
+ while ($row = $response->fetchArray()) {
+ $cpdb[] = $row;
+ }
+ }
+ $DB->close();
+ }
+
+ return $cpdb;
+}
+
+function captiveportal_remove_entries($remove) {
+
+ if (!is_array($remove) || empty($remove)) {
+ return;
+ }
+
+ $query = "DELETE FROM captiveportal WHERE sessionid in (";
+ foreach ($remove as $idx => $unindex) {
+ $query .= "'{$unindex}'";
+ if ($idx < (count($remove) - 1)) {
+ $query .= ",";
+ }
+ }
+ $query .= ")";
+ captiveportal_write_db($query);
+}
+
+/* write captive portal DB */
+function captiveportal_write_db($queries) {
+ global $g;
+
+ if (is_array($queries)) {
+ $query = implode(";", $queries);
+ } else {
+ $query = $queries;
+ }
+
+ $DB = captiveportal_opendb();
+ if ($DB) {
+ $DB->exec("BEGIN TRANSACTION");
+ $result = $DB->exec($query);
+ if (!$result) {
+ captiveportal_syslog("Trying to modify DB returned error: {$DB->lastErrorMsg()}");
+ } else {
+ $DB->exec("END TRANSACTION");
+ }
+ $DB->close();
+ return $result;
+ } else {
+ return true;
+ }
+}
+
+function captiveportal_write_elements() {
+ global $g, $config, $cpzone;
+
+ $cpcfg = $config['captiveportal'][$cpzone];
+
+ if (!is_dir($g['captiveportal_element_path'])) {
+ @mkdir($g['captiveportal_element_path']);
+ }
+
+ if (is_array($cpcfg['element'])) {
+ conf_mount_rw();
+ foreach ($cpcfg['element'] as $data) {
+ if (!@file_put_contents("{$g['captiveportal_element_path']}/{$data['name']}", base64_decode($data['content']))) {
+ printf(gettext("Error: cannot open '%s' in captiveportal_write_elements()%s"), $data['name'], "\n");
+ return 1;
+ }
+ if (!file_exists("{$g['captiveportal_path']}/{$data['name']}")) {
+ @symlink("{$g['captiveportal_element_path']}/{$data['name']}", "{$g['captiveportal_path']}/{$data['name']}");
+ }
+ }
+ conf_mount_ro();
+ }
+
+ return 0;
+}
+
+function captiveportal_free_dnrules($rulenos_start = 2000, $rulenos_range_max = 64500) {
+ global $cpzone;
+
+ $cpruleslck = lock("captiveportalrulesdn", LOCK_EX);
+ if (file_exists("{$g['vardb_path']}/captiveportaldn.rules")) {
+ $rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportaldn.rules"));
+ $ridx = $rulenos_start;
+ while ($ridx < $rulenos_range_max) {
+ if ($rules[$ridx] == $cpzone) {
+ $rules[$ridx] = false;
+ $ridx++;
+ $rules[$ridx] = false;
+ $ridx++;
+ } else {
+ $ridx += 2;
+ }
+ }
+ file_put_contents("{$g['vardb_path']}/captiveportaldn.rules", serialize($rules));
+ unset($rules);
+ }
+ unlock($cpruleslck);
+}
+
+function captiveportal_get_next_dn_ruleno($rulenos_start = 2000, $rulenos_range_max = 64500) {
+ global $config, $g, $cpzone;
+
+ $cpruleslck = lock("captiveportalrulesdn", LOCK_EX);
+ $ruleno = 0;
+ if (file_exists("{$g['vardb_path']}/captiveportaldn.rules")) {
+ $rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportaldn.rules"));
+ $ridx = $rulenos_start;
+ while ($ridx < $rulenos_range_max) {
+ if (empty($rules[$ridx])) {
+ $ruleno = $ridx;
+ $rules[$ridx] = $cpzone;
+ $ridx++;
+ $rules[$ridx] = $cpzone;
+ break;
+ } else {
+ $ridx += 2;
+ }
+ }
+ } else {
+ $rules = array_pad(array(), $rulenos_range_max, false);
+ $ruleno = $rulenos_start;
+ $rules[$rulenos_start] = $cpzone;
+ $rulenos_start++;
+ $rules[$rulenos_start] = $cpzone;
+ }
+ file_put_contents("{$g['vardb_path']}/captiveportaldn.rules", serialize($rules));
+ unlock($cpruleslck);
+ unset($rules);
+
+ return $ruleno;
+}
+
+function captiveportal_free_dn_ruleno($ruleno) {
+ global $config, $g;
+
+ $cpruleslck = lock("captiveportalrulesdn", LOCK_EX);
+ if (file_exists("{$g['vardb_path']}/captiveportaldn.rules")) {
+ $rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportaldn.rules"));
+ $rules[$ruleno] = false;
+ $ruleno++;
+ $rules[$ruleno] = false;
+ file_put_contents("{$g['vardb_path']}/captiveportaldn.rules", serialize($rules));
+ unset($rules);
+ }
+ unlock($cpruleslck);
+}
+
+function captiveportal_get_dn_passthru_ruleno($value) {
+ global $config, $g, $cpzone, $cpzoneid;
+
+ $cpcfg = $config['captiveportal'][$cpzone];
+ if (!isset($cpcfg['enable'])) {
+ return NULL;
+ }
+
+ $cpruleslck = lock("captiveportalrulesdn", LOCK_EX);
+ $ruleno = NULL;
+ if (file_exists("{$g['vardb_path']}/captiveportaldn.rules")) {
+ $rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportaldn.rules"));
+ unset($output);
+ $_gb = exec("/sbin/ipfw -x {$cpzoneid} show | /usr/bin/grep " . escapeshellarg($value) . " | /usr/bin/grep -v grep | /usr/bin/awk '{print $5}' | /usr/bin/head -n 1", $output);
+ $ruleno = intval($output[0]);
+ if (!$rules[$ruleno]) {
+ $ruleno = NULL;
+ }
+ unset($rules);
+ }
+ unlock($cpruleslck);
+
+ return $ruleno;
+}
+
+/*
+ * This function will calculate the lowest free firewall ruleno
+ * within the range specified based on the actual logged on users
+ *
+ */
+function captiveportal_get_next_ipfw_ruleno($rulenos_start = 2, $rulenos_range_max = 64500) {
+ global $config, $g, $cpzone;
+
+ $cpcfg = $config['captiveportal'][$cpzone];
+ if (!isset($cpcfg['enable'])) {
+ return NULL;
+ }
+
+ $cpruleslck = lock("captiveportalrules{$cpzone}", LOCK_EX);
+ $ruleno = 0;
+ if (file_exists("{$g['vardb_path']}/captiveportal_{$cpzone}.rules")) {
+ $rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportal_{$cpzone}.rules"));
+ $ridx = $rulenos_start;
+ while ($ridx < $rulenos_range_max) {
+ if (empty($rules[$ridx])) {
+ $ruleno = $ridx;
+ $rules[$ridx] = $cpzone;
+ $ridx++;
+ $rules[$ridx] = $cpzone;
+ break;
+ } else {
+ /*
+ * This allows our traffic shaping pipes to be the in pipe the same as ruleno
+ * and the out pipe ruleno + 1.
+ */
+ $ridx += 2;
+ }
+ }
+ } else {
+ $rules = array_pad(array(), $rulenos_range_max, false);
+ $ruleno = $rulenos_start;
+ $rules[$rulenos_start] = $cpzone;
+ $rulenos_start++;
+ $rules[$rulenos_start] = $cpzone;
+ }
+ file_put_contents("{$g['vardb_path']}/captiveportal_{$cpzone}.rules", serialize($rules));
+ unlock($cpruleslck);
+ unset($rules);
+
+ return $ruleno;
+}
+
+function captiveportal_free_ipfw_ruleno($ruleno) {
+ global $config, $g, $cpzone;
+
+ $cpcfg = $config['captiveportal'][$cpzone];
+ if (!isset($cpcfg['enable'])) {
+ return NULL;
+ }
+
+ $cpruleslck = lock("captiveportalrules{$cpzone}", LOCK_EX);
+ if (file_exists("{$g['vardb_path']}/captiveportal_{$cpzone}.rules")) {
+ $rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportal_{$cpzone}.rules"));
+ $rules[$ruleno] = false;
+ $ruleno++;
+ $rules[$ruleno] = false;
+ file_put_contents("{$g['vardb_path']}/captiveportal_{$cpzone}.rules", serialize($rules));
+ unset($rules);
+ }
+ unlock($cpruleslck);
+}
+
+function captiveportal_get_ipfw_passthru_ruleno($value) {
+ global $config, $g, $cpzone, $cpzoneid;
+
+ $cpcfg = $config['captiveportal'][$cpzone];
+ if (!isset($cpcfg['enable'])) {
+ return NULL;
+ }
+
+ $cpruleslck = lock("captiveportalrules{$cpzone}", LOCK_EX);
+ $ruleno = NULL;
+ if (file_exists("{$g['vardb_path']}/captiveportal_{$cpzone}.rules")) {
+ $rules = unserialize(file_get_contents("{$g['vardb_path']}/captiveportal_{$cpzone}.rules"));
+ unset($output);
+ $_gb = exec("/sbin/ipfw -x {$cpzoneid} show | /usr/bin/grep " . escapeshellarg($value) . " | /usr/bin/grep -v grep | /usr/bin/awk '{print $1}' | /usr/bin/head -n 1", $output);
+ $ruleno = intval($output[0]);
+ if (!$rules[$ruleno]) {
+ $ruleno = NULL;
+ }
+ unset($rules);
+ }
+ unlock($cpruleslck);
+
+ return $ruleno;
+}
+
+/**
+ * This function will calculate the traffic produced by a client
+ * based on its firewall rule
+ *
+ * Point of view: NAS
+ *
+ * Input means: from the client
+ * Output means: to the client
+ *
+ */
+
+function getVolume($ip, $mac = NULL) {
+ global $config, $cpzone, $cpzoneid;
+
+ $reverse = empty($config['captiveportal'][$cpzone]['reverseacct']) ? false : true;
+ $volume = array();
+ // Initialize vars properly, since we don't want NULL vars
+ $volume['input_pkts'] = $volume['input_bytes'] = $volume['output_pkts'] = $volume['output_bytes'] = 0 ;
+
+ $ipfw = pfSense_ipfw_getTablestats($cpzoneid, IP_FW_TABLE_XLISTENTRY, 1, $ip, $mac);
+ if (is_array($ipfw)) {
+ if ($reverse) {
+ $volume['output_pkts'] = $ipfw['packets'];
+ $volume['output_bytes'] = $ipfw['bytes'];
+ }
+ else {
+ $volume['input_pkts'] = $ipfw['packets'];
+ $volume['input_bytes'] = $ipfw['bytes'];
+ }
+ }
+
+ $ipfw = pfSense_ipfw_getTablestats($cpzoneid, IP_FW_TABLE_XLISTENTRY, 2, $ip, $mac);
+ if (is_array($ipfw)) {
+ if ($reverse) {
+ $volume['input_pkts'] = $ipfw['packets'];
+ $volume['input_bytes'] = $ipfw['bytes'];
+ }
+ else {
+ $volume['output_pkts'] = $ipfw['packets'];
+ $volume['output_bytes'] = $ipfw['bytes'];
+ }
+ }
+
+ return $volume;
+}
+
+/**
+ * Get the NAS-IP-Address based on the current wan address
+ *
+ * Use functions in interfaces.inc to find this out
+ *
+ */
+
+function getNasIP() {
+ global $config, $cpzone;
+
+ if (empty($config['captiveportal'][$cpzone]['radiussrcip_attribute'])) {
+ $nasIp = get_interface_ip();
+ } else {
+ if (is_ipaddr($config['captiveportal'][$cpzone]['radiussrcip_attribute'])) {
+ $nasIp = $config['captiveportal'][$cpzone]['radiussrcip_attribute'];
+ } else {
+ $nasIp = get_interface_ip($config['captiveportal'][$cpzone]['radiussrcip_attribute']);
+ }
+ }
+
+ if (!is_ipaddr($nasIp)) {
+ $nasIp = "0.0.0.0";
+ }
+
+ return $nasIp;
+}
+
+function portal_ip_from_client_ip($cliip) {
+ global $config, $cpzone;
+
+ $isipv6 = is_ipaddrv6($cliip);
+ $interfaces = explode(",", $config['captiveportal'][$cpzone]['interface']);
+ foreach ($interfaces as $cpif) {
+ if ($isipv6) {
+ $ip = get_interface_ipv6($cpif);
+ $sn = get_interface_subnetv6($cpif);
+ } else {
+ $ip = get_interface_ip($cpif);
+ $sn = get_interface_subnet($cpif);
+ }
+ if (ip_in_subnet($cliip, "{$ip}/{$sn}")) {
+ return $ip;
+ }
+ }
+
+ $inet = ($isipv6) ? '-inet6' : '-inet';
+ $iface = exec_command("/sbin/route -n get {$inet} {$cliip} | /usr/bin/awk '/interface/ { print \$2; };'");
+ $iface = trim($iface, "\n");
+ if (!empty($iface)) {
+ $ip = ($isipv6) ? find_interface_ipv6($iface) : find_interface_ip($iface);
+ if (is_ipaddr($ip)) {
+ return $ip;
+ }
+ }
+
+ // doesn't match up to any particular interface
+ // so let's set the portal IP to what PHP says
+ // the server IP issuing the request is.
+ // allows same behavior as 1.2.x where IP isn't
+ // in the subnet of any CP interface (static routes, etc.)
+ // rather than forcing to DNS hostname resolution
+ $ip = $_SERVER['SERVER_ADDR'];
+ if (is_ipaddr($ip)) {
+ return $ip;
+ }
+
+ return false;
+}
+
+function portal_hostname_from_client_ip($cliip) {
+ global $config, $cpzone;
+
+ $cpcfg = $config['captiveportal'][$cpzone];
+
+ if (isset($cpcfg['httpslogin'])) {
+ $listenporthttps = $cpcfg['listenporthttps'] ? $cpcfg['listenporthttps'] : ($cpcfg['zoneid'] + 8001);
+ $ourhostname = $cpcfg['httpsname'];
+
+ if ($listenporthttps != 443) {
+ $ourhostname .= ":" . $listenporthttps;
+ }
+ } else {
+ $listenporthttp = $cpcfg['listenporthttp'] ? $cpcfg['listenporthttp'] : ($cpcfg['zoneid'] + 8000);
+ $ifip = portal_ip_from_client_ip($cliip);
+ if (!$ifip) {
+ $ourhostname = "{$config['system']['hostname']}.{$config['system']['domain']}";
+ } else {
+ $ourhostname = (is_ipaddrv6($ifip)) ? "[{$ifip}]" : "{$ifip}";
+ }
+
+ if ($listenporthttp != 80) {
+ $ourhostname .= ":" . $listenporthttp;
+ }
+ }
+
+ return $ourhostname;
+}
+
+/* functions move from index.php */
+
+function portal_reply_page($redirurl, $type = null, $message = null, $clientmac = null, $clientip = null, $username = null, $password = null) {
+ global $g, $config, $cpzone;
+
+ /* Get captive portal layout */
+ if ($type == "redir") {
+ header("Location: {$redirurl}");
+ return;
+ } else if ($type == "login") {
+ $htmltext = get_include_contents("{$g['varetc_path']}/captiveportal_{$cpzone}.html");
+ } else {
+ $htmltext = get_include_contents("{$g['varetc_path']}/captiveportal-{$cpzone}-error.html");
+ }
+
+ $cpcfg = $config['captiveportal'][$cpzone];
+
+ /* substitute the PORTAL_REDIRURL variable */
+ if ($cpcfg['preauthurl']) {
+ $htmltext = str_replace("\$PORTAL_REDIRURL\$", "{$cpcfg['preauthurl']}", $htmltext);
+ $htmltext = str_replace("#PORTAL_REDIRURL#", "{$cpcfg['preauthurl']}", $htmltext);
+ }
+
+ /* substitute other variables */
+ $ourhostname = portal_hostname_from_client_ip($clientip);
+ $protocol = (isset($cpcfg['httpslogin'])) ? 'https://' : 'http://';
+ $htmltext = str_replace("\$PORTAL_ACTION\$", "{$protocol}{$ourhostname}/", $htmltext);
+ $htmltext = str_replace("#PORTAL_ACTION#", "{$protocol}{$ourhostname}/", $htmltext);
+
+ $htmltext = str_replace("\$PORTAL_ZONE\$", htmlspecialchars($cpzone), $htmltext);
+ $htmltext = str_replace("\$PORTAL_REDIRURL\$", htmlspecialchars($redirurl), $htmltext);
+ $htmltext = str_replace("\$PORTAL_MESSAGE\$", htmlspecialchars($message), $htmltext);
+ $htmltext = str_replace("\$CLIENT_MAC\$", htmlspecialchars($clientmac), $htmltext);
+ $htmltext = str_replace("\$CLIENT_IP\$", htmlspecialchars($clientip), $htmltext);
+
+ // Special handling case for captive portal master page so that it can be ran
+ // through the PHP interpreter using the include method above. We convert the
+ // $VARIABLE$ case to #VARIABLE# in /etc/inc/captiveportal.inc before writing out.
+ $htmltext = str_replace("#PORTAL_ZONE#", htmlspecialchars($cpzone), $htmltext);
+ $htmltext = str_replace("#PORTAL_REDIRURL#", htmlspecialchars($redirurl), $htmltext);
+ $htmltext = str_replace("#PORTAL_MESSAGE#", htmlspecialchars($message), $htmltext);
+ $htmltext = str_replace("#CLIENT_MAC#", htmlspecialchars($clientmac), $htmltext);
+ $htmltext = str_replace("#CLIENT_IP#", htmlspecialchars($clientip), $htmltext);
+ $htmltext = str_replace("#USERNAME#", htmlspecialchars($username), $htmltext);
+ $htmltext = str_replace("#PASSWORD#", htmlspecialchars($password), $htmltext);
+
+ echo $htmltext;
+}
+
+function portal_mac_radius($clientmac, $clientip) {
+ global $config, $cpzone;
+
+ $radmac_secret = $config['captiveportal'][$cpzone]['radmac_secret'];
+
+ /* authentication against the radius server */
+ $username = mac_format($clientmac);
+ $auth_list = radius($username, $radmac_secret, $clientip, $clientmac, "MACHINE LOGIN");
+ if ($auth_list['auth_val'] == 2) {
+ return TRUE;
+ }
+
+ if (!empty($auth_list['url_redirection'])) {
+ portal_reply_page($auth_list['url_redirection'], "redir");
+ }
+
+ return FALSE;
+}
+
+function captiveportal_reapply_attributes($cpentry, $attributes) {
+ global $config, $cpzone, $g;
+
+ if (isset($config['captiveportal'][$cpzone]['peruserbw'])) {
+ $dwfaultbw_up = !empty($config['captiveportal'][$cpzone]['bwdefaultup']) ? $config['captiveportal'][$cpzone]['bwdefaultup'] : 0;
+ $dwfaultbw_down = !empty($config['captiveportal'][$cpzone]['bwdefaultdn']) ? $config['captiveportal'][$cpzone]['bwdefaultdn'] : 0;
+ } else {
+ $dwfaultbw_up = $dwfaultbw_down = 0;
+ }
+ $bw_up = !empty($attributes['bw_up']) ? round(intval($attributes['bw_up'])/1000, 2) : $dwfaultbw_up;
+ $bw_down = !empty($attributes['bw_down']) ? round(intval($attributes['bw_down'])/1000, 2) : $dwfaultbw_down;
+ $bw_up_pipeno = $cpentry[1];
+ $bw_down_pipeno = $cpentry[1]+1;
+
+ $_gb = @pfSense_pipe_action("pipe {$bw_up_pipeno} config bw {$bw_up}Kbit/s queue 100 buckets 16");
+ $_gb = @pfSense_pipe_action("pipe {$bw_down_pipeno} config bw {$bw_down}Kbit/s queue 100 buckets 16");
+ //captiveportal_logportalauth($cpentry[4], $cpentry[3], $cpentry[2], "RADIUS_BANDWIDTH_REAPPLY", "{$bw_up}/{$bw_down}");
+
+ unset($bw_up_pipeno, $bw_down_pipeno, $bw_up, $bw_down);
+}
+
+function portal_allow($clientip, $clientmac, $username, $password = null, $attributes = null, $pipeno = null, $radiusctx = null) {
+ global $redirurl, $g, $config, $type, $passthrumac, $_POST, $cpzone, $cpzoneid;
+
+ // Ensure we create an array if we are missing attributes
+ if (!is_array($attributes)) {
+ $attributes = array();
+ }
+
+ unset($sessionid);
+
+ /* Do not allow concurrent login execution. */
+ $cpdblck = lock("captiveportaldb{$cpzone}", LOCK_EX);
+
+ if ($attributes['voucher']) {
+ $remaining_time = $attributes['session_timeout'];
+ }
+
+ $writecfg = false;
+ /* Find an existing session */
+ if ((isset($config['captiveportal'][$cpzone]['noconcurrentlogins'])) && $passthrumac) {
+ if (isset($config['captiveportal'][$cpzone]['passthrumacadd'])) {
+ $mac = captiveportal_passthrumac_findbyname($username);
+ if (!empty($mac)) {
+ if ($_POST['replacemacpassthru']) {
+ foreach ($config['captiveportal'][$cpzone]['passthrumac'] as $idx => $macent) {
+ if ($macent['mac'] == $mac['mac']) {
+ $macrules = "";
+ $ruleno = captiveportal_get_ipfw_passthru_ruleno($mac['mac']);
+ $pipeno = captiveportal_get_dn_passthru_ruleno($mac['mac']);
+ if ($ruleno) {
+ captiveportal_free_ipfw_ruleno($ruleno);
+ $macrules .= "delete {$ruleno}\n";
+ ++$ruleno;
+ $macrules .= "delete {$ruleno}\n";
+ }
+ if ($pipeno) {
+ captiveportal_free_dn_ruleno($pipeno);
+ $macrules .= "pipe delete {$pipeno}\n";
+ ++$pipeno;
+ $macrules .= "pipe delete {$pipeno}\n";
+ }
+ unset($config['captiveportal'][$cpzone]['passthrumac'][$idx]);
+ $mac['action'] = 'pass';
+ $mac['mac'] = $clientmac;
+ $config['captiveportal'][$cpzone]['passthrumac'][] = $mac;
+ $macrules .= captiveportal_passthrumac_configure_entry($mac);
+ file_put_contents("{$g['tmp_path']}/macentry_{$cpzone}.rules.tmp", $macrules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} -q {$g['tmp_path']}/macentry_{$cpzone}.rules.tmp");
+ $writecfg = true;
+ $sessionid = true;
+ break;
+ }
+ }
+ } else {
+ portal_reply_page($redirurl, "error", "Username: {$username} is already authenticated using another MAC address.",
+ $clientmac, $clientip, $username, $password);
+ unlock($cpdblck);
+ return;
+ }
+ }
+ }
+ }
+
+ /* read in client database */
+ $query = "WHERE ip = '{$clientip}'";
+ $tmpusername = strtolower($username);
+ if (isset($config['captiveportal'][$cpzone]['noconcurrentlogins'])) {
+ $query .= " OR (username != 'unauthenticated' AND lower(username) = '{$tmpusername}')";
+ }
+ $cpdb = captiveportal_read_db($query);
+
+ /* Snapshot the timestamp */
+ $allow_time = time();
+ $radiusservers = captiveportal_get_radius_servers();
+ $unsetindexes = array();
+ if (is_null($radiusctx)) {
+ $radiusctx = 'first';
+ }
+
+ foreach ($cpdb as $cpentry) {
+ if (empty($cpentry[11])) {
+ $cpentry[11] = 'first';
+ }
+ /* on the same ip */
+ if ($cpentry[2] == $clientip) {
+ if (isset($config['captiveportal'][$cpzone]['nomacfilter']) || $cpentry[3] == $clientmac) {
+ captiveportal_logportalauth($cpentry[4], $cpentry[3], $cpentry[2], "CONCURRENT LOGIN - REUSING OLD SESSION");
+ } else {
+ captiveportal_logportalauth($cpentry[4], $cpentry[3], $cpentry[2], "CONCURRENT LOGIN - REUSING IP {$cpentry[2]} WITH DIFFERENT MAC ADDRESS {$cpentry[3]}");
+ }
+ $sessionid = $cpentry[5];
+ break;
+ } elseif (($attributes['voucher']) && ($username != 'unauthenticated') && ($cpentry[4] == $username)) {
+ // user logged in with an active voucher. Check for how long and calculate
+ // how much time we can give him (voucher credit - used time)
+ $remaining_time = $cpentry[0] + $cpentry[7] - $allow_time;
+ if ($remaining_time < 0) { // just in case.
+ $remaining_time = 0;
+ }
+
+ /* This user was already logged in so we disconnect the old one */
+ captiveportal_disconnect($cpentry, $radiusservers[$cpentry[11]], 13);
+ captiveportal_logportalauth($cpentry[4], $cpentry[3], $cpentry[2], "CONCURRENT LOGIN - TERMINATING OLD SESSION");
+ $unsetindexes[] = $cpentry[5];
+ break;
+ } elseif ((isset($config['captiveportal'][$cpzone]['noconcurrentlogins'])) && ($username != 'unauthenticated')) {
+ /* on the same username */
+ if (strcasecmp($cpentry[4], $username) == 0) {
+ /* This user was already logged in so we disconnect the old one */
+ captiveportal_disconnect($cpentry, $radiusservers[$cpentry[11]], 13);
+ captiveportal_logportalauth($cpentry[4], $cpentry[3], $cpentry[2], "CONCURRENT LOGIN - TERMINATING OLD SESSION");
+ $unsetindexes[] = $cpentry[5];
+ break;
+ }
+ }
+ }
+ unset($cpdb);
+
+ if (!empty($unsetindexes)) {
+ captiveportal_remove_entries($unsetindexes);
+ }
+
+ if ($attributes['voucher'] && $remaining_time <= 0) {
+ return 0; // voucher already used and no time left
+ }
+
+ if (!isset($sessionid)) {
+ /* generate unique session ID */
+ $tod = gettimeofday();
+ $sessionid = substr(md5(mt_rand() . $tod['sec'] . $tod['usec'] . $clientip . $clientmac), 0, 16);
+
+ if ($passthrumac) {
+ $mac = array();
+ $mac['action'] = 'pass';
+ $mac['mac'] = $clientmac;
+ $mac['ip'] = $clientip; /* Used only for logging */
+ if (isset($config['captiveportal'][$cpzone]['passthrumacaddusername'])) {
+ $mac['username'] = $username;
+ if ($attributes['voucher']) {
+ $mac['logintype'] = "voucher";
+ }
+ }
+ if ($username == "unauthenticated") {
+ $mac['descr'] = "Auto-added";
+ } else {
+ $mac['descr'] = "Auto-added for user {$username}";
+ }
+ if (!empty($bw_up)) {
+ $mac['bw_up'] = $bw_up;
+ }
+ if (!empty($bw_down)) {
+ $mac['bw_down'] = $bw_down;
+ }
+ if (!is_array($config['captiveportal'][$cpzone]['passthrumac'])) {
+ $config['captiveportal'][$cpzone]['passthrumac'] = array();
+ }
+ $config['captiveportal'][$cpzone]['passthrumac'][] = $mac;
+ unlock($cpdblck);
+ $macrules = captiveportal_passthrumac_configure_entry($mac);
+ file_put_contents("{$g['tmp_path']}/macentry_{$cpzone}.rules.tmp", $macrules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} -q {$g['tmp_path']}/macentry_{$cpzone}.rules.tmp");
+ $writecfg = true;
+ } else {
+ /* See if a pipeno is passed, if not start sessions because this means there isn't one atm */
+ if (is_null($pipeno)) {
+ $pipeno = captiveportal_get_next_dn_ruleno();
+ }
+
+ /* if the pool is empty, return appropriate message and exit */
+ if (is_null($pipeno)) {
+ portal_reply_page($redirurl, "error", "System reached maximum login capacity");
+ log_error("Zone: {$cpzone} - WARNING! Captive portal has reached maximum login capacity");
+ unlock($cpdblck);
+ return;
+ }
+
+ if (isset($config['captiveportal'][$cpzone]['peruserbw'])) {
+ $dwfaultbw_up = !empty($config['captiveportal'][$cpzone]['bwdefaultup']) ? $config['captiveportal'][$cpzone]['bwdefaultup'] : 0;
+ $dwfaultbw_down = !empty($config['captiveportal'][$cpzone]['bwdefaultdn']) ? $config['captiveportal'][$cpzone]['bwdefaultdn'] : 0;
+ } else {
+ $dwfaultbw_up = $dwfaultbw_down = 0;
+ }
+ $bw_up = !empty($attributes['bw_up']) ? round(intval($attributes['bw_up'])/1000, 2) : $dwfaultbw_up;
+ $bw_down = !empty($attributes['bw_down']) ? round(intval($attributes['bw_down'])/1000, 2) : $dwfaultbw_down;
+
+ $bw_up_pipeno = $pipeno;
+ $bw_down_pipeno = $pipeno + 1;
+ //$bw_up /= 1000; // Scale to Kbit/s
+ $_gb = @pfSense_pipe_action("pipe {$bw_up_pipeno} config bw {$bw_up}Kbit/s queue 100 buckets 16");
+ $_gb = @pfSense_pipe_action("pipe {$bw_down_pipeno} config bw {$bw_down}Kbit/s queue 100 buckets 16");
+
+ $clientsn = (is_ipaddrv6($clientip)) ? 128 : 32;
+ if (!isset($config['captiveportal'][$cpzone]['nomacfilter'])) {
+ $_gb = @pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XADD, 1, $clientip, $clientsn, $clientmac, $bw_up_pipeno);
+ } else {
+ $_gb = @pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XADD, 1, $clientip, $clientsn, NULL, $bw_up_pipeno);
+ }
+
+ if (!isset($config['captiveportal'][$cpzone]['nomacfilter'])) {
+ $_gb = @pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XADD, 2, $clientip, $clientsn, $clientmac, $bw_down_pipeno);
+ } else {
+ $_gb = @pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XADD, 2, $clientip, $clientsn, NULL, $bw_down_pipeno);
+ }
+
+ if ($attributes['voucher']) {
+ $attributes['session_timeout'] = $remaining_time;
+ }
+
+ /* handle empty attributes */
+ $session_timeout = (!empty($attributes['session_timeout'])) ? $attributes['session_timeout'] : 'NULL';
+ $idle_timeout = (!empty($attributes['idle_timeout'])) ? $attributes['idle_timeout'] : 'NULL';
+ $session_terminate_time = (!empty($attributes['session_terminate_time'])) ? $attributes['session_terminate_time'] : 'NULL';
+ $interim_interval = (!empty($attributes['interim_interval'])) ? $attributes['interim_interval'] : 'NULL';
+
+ /* escape username */
+ $safe_username = SQLite3::escapeString($username);
+
+ /* encode password in Base64 just in case it contains commas */
+ $bpassword = base64_encode($password);
+ $insertquery = "INSERT INTO captiveportal (allow_time, pipeno, ip, mac, username, sessionid, bpassword, session_timeout, idle_timeout, session_terminate_time, interim_interval, radiusctx) ";
+ $insertquery .= "VALUES ({$allow_time}, {$pipeno}, '{$clientip}', '{$clientmac}', '{$safe_username}', '{$sessionid}', '{$bpassword}', ";
+ $insertquery .= "{$session_timeout}, {$idle_timeout}, {$session_terminate_time}, {$interim_interval}, '{$radiusctx}')";
+
+ /* store information to database */
+ captiveportal_write_db($insertquery);
+ unlock($cpdblck);
+ unset($insertquery, $bpassword);
+
+ if (isset($config['captiveportal'][$cpzone]['radacct_enable']) && !empty($radiusservers[$radiusctx])) {
+ $acct_val = RADIUS_ACCOUNTING_START($pipeno, $username, $sessionid, $radiusservers[$radiusctx], $clientip, $clientmac);
+ if ($acct_val == 1) {
+ captiveportal_logportalauth($username, $clientmac, $clientip, $type, "RADIUS ACCOUNTING FAILED");
+ }
+ }
+ }
+ } else {
+ /* NOTE: #3062-11 If the pipeno has been allocated free it to not DoS the CP and maintain proper operation as in radius() case */
+ if (!is_null($pipeno)) {
+ captiveportal_free_dn_ruleno($pipeno);
+ }
+
+ unlock($cpdblck);
+ }
+
+ if ($writecfg == true) {
+ write_config();
+ }
+
+ /* redirect user to desired destination */
+ if (!empty($attributes['url_redirection'])) {
+ $my_redirurl = $attributes['url_redirection'];
+ } else if (!empty($redirurl)) {
+ $my_redirurl = $redirurl;
+ } else if (!empty($config['captiveportal'][$cpzone]['redirurl'])) {
+ $my_redirurl = $config['captiveportal'][$cpzone]['redirurl'];
+ }
+
+ if (isset($config['captiveportal'][$cpzone]['logoutwin_enable']) && !$passthrumac) {
+ $ourhostname = portal_hostname_from_client_ip($clientip);
+ $protocol = (isset($config['captiveportal'][$cpzone]['httpslogin'])) ? 'https://' : 'http://';
+ $logouturl = "{$protocol}{$ourhostname}/";
+
+ if (isset($attributes['reply_message'])) {
+ $message = $attributes['reply_message'];
+ } else {
+ $message = 0;
+ }
+
+ include("{$g['varetc_path']}/captiveportal-{$cpzone}-logout.html");
+
+ } else {
+ portal_reply_page($my_redirurl, "redir", "Just redirect the user.");
+ }
+
+ return $sessionid;
+}
+
+
+/*
+ * Used for when pass-through credits are enabled.
+ * Returns true when there was at least one free login to deduct for the MAC.
+ * Expired entries are removed as they are seen.
+ * Active entries are updated according to the configuration.
+ */
+function portal_consume_passthrough_credit($clientmac) {
+ global $config, $cpzone;
+
+ if (!empty($config['captiveportal'][$cpzone]['freelogins_count']) && is_numeric($config['captiveportal'][$cpzone]['freelogins_count'])) {
+ $freeloginscount = $config['captiveportal'][$cpzone]['freelogins_count'];
+ } else {
+ return false;
+ }
+
+ if (!empty($config['captiveportal'][$cpzone]['freelogins_resettimeout']) && is_numeric($config['captiveportal'][$cpzone]['freelogins_resettimeout'])) {
+ $resettimeout = $config['captiveportal'][$cpzone]['freelogins_resettimeout'];
+ } else {
+ return false;
+ }
+
+ if ($freeloginscount < 1 || $resettimeout <= 0 || !$clientmac) {
+ return false;
+ }
+
+ $updatetimeouts = isset($config['captiveportal'][$cpzone]['freelogins_updatetimeouts']);
+
+ /*
+ * Read database of used MACs. Lines are a comma-separated list
+ * of the time, MAC, then the count of pass-through credits remaining.
+ */
+ $usedmacs = captiveportal_read_usedmacs_db();
+
+ $currenttime = time();
+ $found = false;
+ foreach ($usedmacs as $key => $usedmac) {
+ $usedmac = explode(",", $usedmac);
+
+ if ($usedmac[1] == $clientmac) {
+ if ($usedmac[0] + ($resettimeout * 3600) > $currenttime) {
+ if ($usedmac[2] < 1) {
+ if ($updatetimeouts) {
+ $usedmac[0] = $currenttime;
+ unset($usedmacs[$key]);
+ $usedmacs[] = implode(",", $usedmac);
+ captiveportal_write_usedmacs_db($usedmacs);
+ }
+
+ return false;
+ } else {
+ $usedmac[2] -= 1;
+ $usedmacs[$key] = implode(",", $usedmac);
+ }
+
+ $found = true;
+ } else {
+ unset($usedmacs[$key]);
+ }
+
+ break;
+ } else if ($usedmac[0] + ($resettimeout * 3600) <= $currenttime) {
+ unset($usedmacs[$key]);
+ }
+ }
+
+ if (!$found) {
+ $usedmac = array($currenttime, $clientmac, $freeloginscount - 1);
+ $usedmacs[] = implode(",", $usedmac);
+ }
+
+ captiveportal_write_usedmacs_db($usedmacs);
+ return true;
+}
+
+function captiveportal_read_usedmacs_db() {
+ global $g, $cpzone;
+
+ $cpumaclck = lock("captiveusedmacs{$cpzone}");
+ if (file_exists("{$g['vardb_path']}/captiveportal_usedmacs_{$cpzone}.db")) {
+ $usedmacs = file("{$g['vardb_path']}/captiveportal_usedmacs_{$cpzone}.db", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if (!$usedmacs) {
+ $usedmacs = array();
+ }
+ } else {
+ $usedmacs = array();
+ }
+
+ unlock($cpumaclck);
+ return $usedmacs;
+}
+
+function captiveportal_write_usedmacs_db($usedmacs) {
+ global $g, $cpzone;
+
+ $cpumaclck = lock("captiveusedmacs{$cpzone}", LOCK_EX);
+ @file_put_contents("{$g['vardb_path']}/captiveportal_usedmacs_{$cpzone}.db", implode("\n", $usedmacs));
+ unlock($cpumaclck);
+}
+
+function captiveportal_blocked_mac($mac) {
+ global $config, $g, $cpzone;
+
+ if (empty($mac) || !is_macaddr($mac)) {
+ return false;
+ }
+
+ if (!is_array($config['captiveportal'][$cpzone]['passthrumac'])) {
+ return false;
+ }
+
+ foreach ($config['captiveportal'][$cpzone]['passthrumac'] as $passthrumac) {
+ if (($passthrumac['action'] == 'block') &&
+ ($passthrumac['mac'] == strtolower($mac))) {
+ return true;
+ }
+ }
+
+ return false;
+
+}
+
+function captiveportal_send_server_accounting($off = false) {
+ global $cpzone, $config;
+
+ if (!isset($config['captiveportal'][$cpzone]['radacct_enable'])) {
+ return;
+ }
+ if ($off) {
+ $racct = new Auth_RADIUS_Acct_Off;
+ } else {
+ $racct = new Auth_RADIUS_Acct_On;
+ }
+ $radiusservers = captiveportal_get_radius_servers();
+ if (empty($radiusservers)) {
+ return;
+ }
+ foreach ($radiusservers['first'] as $radsrv) {
+ // Add a new server to our instance
+ $racct->addServer($radsrv['ipaddr'], $radsrv['acctport'], $radsrv['key']);
+ }
+ if (PEAR::isError($racct->start())) {
+ $retvalue['acct_val'] = 1;
+ $retvalue['error'] = $racct->getMessage();
+
+ // If we encounter an error immediately stop this function and go back
+ $racct->close();
+ return $retvalue;
+ }
+ // Send request
+ $result = $racct->send();
+ // Evaluation of the response
+ // 5 -> Accounting-Response
+ // See RFC2866 for this.
+ if (PEAR::isError($result)) {
+ $retvalue['acct_val'] = 1;
+ $retvalue['error'] = $result->getMessage();
+ } else if ($result === true) {
+ $retvalue['acct_val'] = 5 ;
+ } else {
+ $retvalue['acct_val'] = 1 ;
+ }
+
+ $racct->close();
+ return $retvalue;
+}
+?>
diff --git a/src/etc/inc/certs.inc b/src/etc/inc/certs.inc
new file mode 100644
index 0000000..9c99952
--- /dev/null
+++ b/src/etc/inc/certs.inc
@@ -0,0 +1,867 @@
+<?php
+/* $Id$ */
+/*
+ certs.inc
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2010 Jim Pingle <jimp@pfsense.org>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_MODULE: certificate_manager
+*/
+
+define("OPEN_SSL_CONF_PATH", "/etc/ssl/openssl.cnf");
+
+require_once("functions.inc");
+
+global $openssl_digest_algs;
+$openssl_digest_algs = array("sha1", "sha224", "sha256", "sha384", "sha512");
+
+global $openssl_crl_status;
+$openssl_crl_status = array(
+ OCSP_REVOKED_STATUS_NOSTATUS => "No Status (default)",
+ OCSP_REVOKED_STATUS_UNSPECIFIED => "Unspecified",
+ OCSP_REVOKED_STATUS_KEYCOMPROMISE => "Key Compromise",
+ OCSP_REVOKED_STATUS_CACOMPROMISE => "CA Compromise",
+ OCSP_REVOKED_STATUS_AFFILIATIONCHANGED => "Affiliation Changed",
+ OCSP_REVOKED_STATUS_SUPERSEDED => "Superseded",
+ OCSP_REVOKED_STATUS_CESSATIONOFOPERATION => "Cessation of Operation",
+ OCSP_REVOKED_STATUS_CERTIFICATEHOLD => "Certificate Hold"
+);
+
+function & lookup_ca($refid) {
+ global $config;
+
+ if (is_array($config['ca'])) {
+ foreach ($config['ca'] as & $ca) {
+ if ($ca['refid'] == $refid) {
+ return $ca;
+ }
+ }
+ }
+
+ return false;
+}
+
+function & lookup_ca_by_subject($subject) {
+ global $config;
+
+ if (is_array($config['ca'])) {
+ foreach ($config['ca'] as & $ca) {
+ $ca_subject = cert_get_subject($ca['crt']);
+ if ($ca_subject == $subject) {
+ return $ca;
+ }
+ }
+ }
+
+ return false;
+}
+
+function & lookup_cert($refid) {
+ global $config;
+
+ if (is_array($config['cert'])) {
+ foreach ($config['cert'] as & $cert) {
+ if ($cert['refid'] == $refid) {
+ return $cert;
+ }
+ }
+ }
+
+ return false;
+}
+
+function & lookup_cert_by_name($name) {
+ global $config;
+ if (is_array($config['cert'])) {
+ foreach ($config['cert'] as & $cert) {
+ if ($cert['descr'] == $name) {
+ return $cert;
+ }
+ }
+ }
+}
+
+function & lookup_crl($refid) {
+ global $config;
+
+ if (is_array($config['crl'])) {
+ foreach ($config['crl'] as & $crl) {
+ if ($crl['refid'] == $refid) {
+ return $crl;
+ }
+ }
+ }
+
+ return false;
+}
+
+function ca_chain_array(& $cert) {
+ if ($cert['caref']) {
+ $chain = array();
+ $crt = lookup_ca($cert['caref']);
+ $chain[] = $crt;
+ while ($crt) {
+ $caref = $crt['caref'];
+ if ($caref) {
+ $crt = lookup_ca($caref);
+ } else {
+ $crt = false;
+ }
+ if ($crt) {
+ $chain[] = $crt;
+ }
+ }
+ return $chain;
+ }
+ return false;
+}
+
+function ca_chain(& $cert) {
+ if ($cert['caref']) {
+ $ca = "";
+ $cas = ca_chain_array($cert);
+ if (is_array($cas)) {
+ foreach ($cas as & $ca_cert) {
+ $ca .= base64_decode($ca_cert['crt']);
+ $ca .= "\n";
+ }
+ }
+ return $ca;
+ }
+ return "";
+}
+
+function ca_import(& $ca, $str, $key = "", $serial = 0) {
+ global $config;
+
+ $ca['crt'] = base64_encode($str);
+ if (!empty($key)) {
+ $ca['prv'] = base64_encode($key);
+ }
+ if (!empty($serial)) {
+ $ca['serial'] = $serial;
+ }
+ $subject = cert_get_subject($str, false);
+ $issuer = cert_get_issuer($str, false);
+
+ // Find my issuer unless self-signed
+ if ($issuer <> $subject) {
+ $issuer_crt =& lookup_ca_by_subject($issuer);
+ if ($issuer_crt) {
+ $ca['caref'] = $issuer_crt['refid'];
+ }
+ }
+
+ /* Correct if child certificate was loaded first */
+ if (is_array($config['ca'])) {
+ foreach ($config['ca'] as & $oca) {
+ $issuer = cert_get_issuer($oca['crt']);
+ if ($ca['refid'] <> $oca['refid'] && $issuer == $subject) {
+ $oca['caref'] = $ca['refid'];
+ }
+ }
+ }
+ if (is_array($config['cert'])) {
+ foreach ($config['cert'] as & $cert) {
+ $issuer = cert_get_issuer($cert['crt']);
+ if ($issuer == $subject) {
+ $cert['caref'] = $ca['refid'];
+ }
+ }
+ }
+ return true;
+}
+
+function ca_create(& $ca, $keylen, $lifetime, $dn, $digest_alg = "sha256") {
+
+ $args = array(
+ "x509_extensions" => "v3_ca",
+ "digest_alg" => $digest_alg,
+ "private_key_bits" => (int)$keylen,
+ "private_key_type" => OPENSSL_KEYTYPE_RSA,
+ "encrypt_key" => false);
+
+ // generate a new key pair
+ $res_key = openssl_pkey_new($args);
+ if (!$res_key) {
+ return false;
+ }
+
+ // generate a certificate signing request
+ $res_csr = openssl_csr_new($dn, $res_key, $args);
+ if (!$res_csr) {
+ return false;
+ }
+
+ // self sign the certificate
+ $res_crt = openssl_csr_sign($res_csr, null, $res_key, $lifetime, $args);
+ if (!$res_crt) {
+ return false;
+ }
+
+ // export our certificate data
+ if (!openssl_pkey_export($res_key, $str_key) ||
+ !openssl_x509_export($res_crt, $str_crt)) {
+ return false;
+ }
+
+ // return our ca information
+ $ca['crt'] = base64_encode($str_crt);
+ $ca['prv'] = base64_encode($str_key);
+ $ca['serial'] = 0;
+
+ return true;
+}
+
+function ca_inter_create(& $ca, $keylen, $lifetime, $dn, $caref, $digest_alg = "sha256") {
+ // Create Intermediate Certificate Authority
+ $signing_ca =& lookup_ca($caref);
+ if (!$signing_ca) {
+ return false;
+ }
+
+ $signing_ca_res_crt = openssl_x509_read(base64_decode($signing_ca['crt']));
+ $signing_ca_res_key = openssl_pkey_get_private(array(0 => base64_decode($signing_ca['prv']) , 1 => ""));
+ if (!$signing_ca_res_crt || !$signing_ca_res_key) {
+ return false;
+ }
+ $signing_ca_serial = ++$signing_ca['serial'];
+
+ $args = array(
+ "x509_extensions" => "v3_ca",
+ "digest_alg" => $digest_alg,
+ "private_key_bits" => (int)$keylen,
+ "private_key_type" => OPENSSL_KEYTYPE_RSA,
+ "encrypt_key" => false);
+
+ // generate a new key pair
+ $res_key = openssl_pkey_new($args);
+ if (!$res_key) {
+ return false;
+ }
+
+ // generate a certificate signing request
+ $res_csr = openssl_csr_new($dn, $res_key, $args);
+ if (!$res_csr) {
+ return false;
+ }
+
+ // Sign the certificate
+ $res_crt = openssl_csr_sign($res_csr, $signing_ca_res_crt, $signing_ca_res_key, $lifetime, $args, $signing_ca_serial);
+ if (!$res_crt) {
+ return false;
+ }
+
+ // export our certificate data
+ if (!openssl_pkey_export($res_key, $str_key) ||
+ !openssl_x509_export($res_crt, $str_crt)) {
+ return false;
+ }
+
+ // return our ca information
+ $ca['crt'] = base64_encode($str_crt);
+ $ca['prv'] = base64_encode($str_key);
+ $ca['serial'] = 0;
+
+ return true;
+}
+
+function cert_import(& $cert, $crt_str, $key_str) {
+
+ $cert['crt'] = base64_encode($crt_str);
+ $cert['prv'] = base64_encode($key_str);
+
+ $subject = cert_get_subject($crt_str, false);
+ $issuer = cert_get_issuer($crt_str, false);
+
+ // Find my issuer unless self-signed
+ if ($issuer <> $subject) {
+ $issuer_crt =& lookup_ca_by_subject($issuer);
+ if ($issuer_crt) {
+ $cert['caref'] = $issuer_crt['refid'];
+ }
+ }
+ return true;
+}
+
+function cert_create(& $cert, $caref, $keylen, $lifetime, $dn, $type = "user", $digest_alg = "sha256") {
+
+ $cert['type'] = $type;
+
+ if ($type != "self-signed") {
+ $cert['caref'] = $caref;
+ $ca =& lookup_ca($caref);
+ if (!$ca) {
+ return false;
+ }
+
+ $ca_str_crt = base64_decode($ca['crt']);
+ $ca_str_key = base64_decode($ca['prv']);
+ $ca_res_crt = openssl_x509_read($ca_str_crt);
+ $ca_res_key = openssl_pkey_get_private(array(0 => $ca_str_key, 1 => ""));
+ if (!$ca_res_key) {
+ return false;
+ }
+ $ca_serial = ++$ca['serial'];
+ }
+
+ switch ($type) {
+ case "ca":
+ $cert_type = "v3_ca";
+ break;
+ case "server":
+ case "self-signed":
+ $cert_type = "server";
+ break;
+ default:
+ $cert_type = "usr_cert";
+ break;
+ }
+
+ // in case of using Subject Alternative Names use other sections (with postfix '_san')
+ // pass subjectAltName over environment variable 'SAN'
+ if ($dn['subjectAltName']) {
+ putenv("SAN={$dn['subjectAltName']}"); // subjectAltName can be set _only_ via configuration file
+ $cert_type .= '_san';
+ unset($dn['subjectAltName']);
+ }
+
+ $args = array(
+ "x509_extensions" => $cert_type,
+ "digest_alg" => $digest_alg,
+ "private_key_bits" => (int)$keylen,
+ "private_key_type" => OPENSSL_KEYTYPE_RSA,
+ "encrypt_key" => false);
+
+ // generate a new key pair
+ $res_key = openssl_pkey_new($args);
+ if (!$res_key) {
+ return false;
+ }
+
+ // If this is a self-signed cert, blank out the CA and sign with the cert's key
+ if ($type == "self-signed") {
+ $ca = null;
+ $ca_res_crt = null;
+ $ca_res_key = $res_key;
+ $ca_serial = 0;
+ $cert['type'] = "server";
+ }
+
+ // generate a certificate signing request
+ $res_csr = openssl_csr_new($dn, $res_key, $args);
+ if (!$res_csr) {
+ return false;
+ }
+
+ // sign the certificate using an internal CA
+ $res_crt = openssl_csr_sign($res_csr, $ca_res_crt, $ca_res_key, $lifetime,
+ $args, $ca_serial);
+ if (!$res_crt) {
+ return false;
+ }
+
+ // export our certificate data
+ if (!openssl_pkey_export($res_key, $str_key) ||
+ !openssl_x509_export($res_crt, $str_crt)) {
+ return false;
+ }
+
+ // return our certificate information
+ $cert['crt'] = base64_encode($str_crt);
+ $cert['prv'] = base64_encode($str_key);
+
+ return true;
+}
+
+function csr_generate(& $cert, $keylen, $dn, $digest_alg = "sha256") {
+
+ $args = array(
+ "x509_extensions" => "v3_req",
+ "digest_alg" => $digest_alg,
+ "private_key_bits" => (int)$keylen,
+ "private_key_type" => OPENSSL_KEYTYPE_RSA,
+ "encrypt_key" => false);
+
+ // generate a new key pair
+ $res_key = openssl_pkey_new($args);
+ if (!$res_key) {
+ return false;
+ }
+
+ // generate a certificate signing request
+ $res_csr = openssl_csr_new($dn, $res_key, $args);
+ if (!$res_csr) {
+ return false;
+ }
+
+ // export our request data
+ if (!openssl_pkey_export($res_key, $str_key) ||
+ !openssl_csr_export($res_csr, $str_csr)) {
+ return false;
+ }
+
+ // return our request information
+ $cert['csr'] = base64_encode($str_csr);
+ $cert['prv'] = base64_encode($str_key);
+
+ return true;
+}
+
+function csr_complete(& $cert, $str_crt) {
+
+ // return our request information
+ $cert['crt'] = base64_encode($str_crt);
+ unset($cert['csr']);
+
+ return true;
+}
+
+function csr_get_subject($str_crt, $decode = true) {
+
+ if ($decode) {
+ $str_crt = base64_decode($str_crt);
+ }
+
+ $components = openssl_csr_get_subject($str_crt);
+
+ if (empty($components) || !is_array($components)) {
+ return "unknown";
+ }
+
+ ksort($components);
+ foreach ($components as $a => $v) {
+ if (!strlen($subject)) {
+ $subject = "{$a}={$v}";
+ } else {
+ $subject = "{$a}={$v}, {$subject}";
+ }
+ }
+
+ return $subject;
+}
+
+function cert_get_subject($str_crt, $decode = true) {
+
+ if ($decode) {
+ $str_crt = base64_decode($str_crt);
+ }
+
+ $inf_crt = openssl_x509_parse($str_crt);
+ $components = $inf_crt['subject'];
+
+ if (empty($components) || !is_array($components)) {
+ return "unknown";
+ }
+
+ ksort($components);
+ foreach ($components as $a => $v) {
+ if (is_array($v)) {
+ ksort($v);
+ foreach ($v as $w) {
+ $asubject = "{$a}={$w}";
+ $subject = (strlen($subject)) ? "{$asubject}, {$subject}" : $asubject;
+ }
+ } else {
+ $asubject = "{$a}={$v}";
+ $subject = (strlen($subject)) ? "{$asubject}, {$subject}" : $asubject;
+ }
+ }
+
+ return $subject;
+}
+
+function cert_get_subject_array($crt) {
+ $str_crt = base64_decode($crt);
+ $inf_crt = openssl_x509_parse($str_crt);
+ $components = $inf_crt['subject'];
+
+ if (!is_array($components)) {
+ return;
+ }
+
+ $subject_array = array();
+
+ foreach ($components as $a => $v) {
+ $subject_array[] = array('a' => $a, 'v' => $v);
+ }
+
+ return $subject_array;
+}
+
+function cert_get_subject_hash($crt) {
+ $str_crt = base64_decode($crt);
+ $inf_crt = openssl_x509_parse($str_crt);
+ return $inf_crt['subject'];
+}
+
+function cert_get_issuer($str_crt, $decode = true) {
+
+ if ($decode) {
+ $str_crt = base64_decode($str_crt);
+ }
+
+ $inf_crt = openssl_x509_parse($str_crt);
+ $components = $inf_crt['issuer'];
+
+ if (empty($components) || !is_array($components)) {
+ return "unknown";
+ }
+
+ ksort($components);
+ foreach ($components as $a => $v) {
+ if (is_array($v)) {
+ ksort($v);
+ foreach ($v as $w) {
+ $aissuer = "{$a}={$w}";
+ $issuer = (strlen($issuer)) ? "{$aissuer}, {$issuer}" : $aissuer;
+ }
+ } else {
+ $aissuer = "{$a}={$v}";
+ $issuer = (strlen($issuer)) ? "{$aissuer}, {$issuer}" : $aissuer;
+ }
+ }
+
+ return $issuer;
+}
+
+/* this function works on x509 (crt), rsa key (prv), and req(csr) */
+function cert_get_modulus($str_crt, $decode = true, $type = "crt") {
+ if ($decode) {
+ $str_crt = base64_decode($str_crt);
+ }
+
+ $modulus = "";
+ if (in_array($type, array("crt", "prv", "csr"))) {
+ $type = str_replace(array("crt", "prv", "csr"), array("x509", "rsa", "req"), $type);
+ $modulus = exec("echo \"{$str_crt}\" | openssl {$type} -noout -modulus");
+ }
+ return $modulus;
+}
+function csr_get_modulus($str_crt, $decode = true) {
+ return cert_get_modulus($str_crt, $decode, "csr");
+}
+
+function cert_get_purpose($str_crt, $decode = true) {
+ if ($decode) {
+ $str_crt = base64_decode($str_crt);
+ }
+ $crt_details = openssl_x509_parse($str_crt);
+ $purpose = array();
+ $purpose['ca'] = (stristr($crt_details['extensions']['basicConstraints'], 'CA:TRUE') === false) ? 'No': 'Yes';
+ $purpose['server'] = ($crt_details['extensions']['nsCertType'] == "SSL Server") ? 'Yes': 'No';
+ return $purpose;
+}
+
+function cert_get_dates($str_crt, $decode = true) {
+ if ($decode) {
+ $str_crt = base64_decode($str_crt);
+ }
+ $crt_details = openssl_x509_parse($str_crt);
+ if ($crt_details['validFrom_time_t'] > 0) {
+ $start = date('r', $crt_details['validFrom_time_t']);
+ }
+ if ($crt_details['validTo_time_t'] > 0) {
+ $end = date('r', $crt_details['validTo_time_t']);
+ }
+ return array($start, $end);
+}
+
+function cert_get_serial($str_crt, $decode = true) {
+ if ($decode) {
+ $str_crt = base64_decode($str_crt);
+ }
+ $crt_details = openssl_x509_parse($str_crt);
+ if (isset($crt_details['serialNumber']) && !empty($crt_details['serialNumber'])) {
+ return $crt_details['serialNumber'];
+ } else {
+ return NULL;
+ }
+}
+
+function prv_get_modulus($str_crt, $decode = true) {
+ return cert_get_modulus($str_crt, $decode, "prv");
+}
+
+function is_user_cert($certref) {
+ global $config;
+ if (!is_array($config['system']['user'])) {
+ return;
+ }
+ foreach ($config['system']['user'] as $user) {
+ if (!is_array($user['cert'])) {
+ continue;
+ }
+ foreach ($user['cert'] as $cert) {
+ if ($certref == $cert) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+function is_openvpn_server_cert($certref) {
+ global $config;
+ if (!is_array($config['openvpn']['openvpn-server'])) {
+ return;
+ }
+ foreach ($config['openvpn']['openvpn-server'] as $ovpns) {
+ if ($ovpns['certref'] == $certref) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function is_openvpn_client_cert($certref) {
+ global $config;
+ if (!is_array($config['openvpn']['openvpn-client'])) {
+ return;
+ }
+ foreach ($config['openvpn']['openvpn-client'] as $ovpnc) {
+ if ($ovpnc['certref'] == $certref) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function is_ipsec_cert($certref) {
+ global $config;
+ if (!is_array($config['ipsec']['phase1'])) {
+ return;
+ }
+ foreach ($config['ipsec']['phase1'] as $ipsec) {
+ if ($ipsec['certref'] == $certref) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function is_webgui_cert($certref) {
+ global $config;
+ if (($config['system']['webgui']['ssl-certref'] == $certref) &&
+ ($config['system']['webgui']['protocol'] != "http")) {
+ return true;
+ }
+}
+
+function is_captiveportal_cert($certref) {
+ global $config;
+ if (!is_array($config['captiveportal'])) {
+ return;
+ }
+ foreach ($config['captiveportal'] as $portal) {
+ if (isset($portal['enable']) && isset($portal['httpslogin']) && ($portal['certref'] == $certref)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function cert_in_use($certref) {
+ return (is_webgui_cert($certref) ||
+ is_user_cert($certref) ||
+ is_openvpn_server_cert($certref) ||
+ is_openvpn_client_cert($certref) ||
+ is_ipsec_cert($certref) ||
+ is_captiveportal_cert($certref));
+}
+
+function crl_create(& $crl, $caref, $name, $serial = 0, $lifetime = 9999) {
+ global $config;
+ $ca =& lookup_ca($caref);
+ if (!$ca) {
+ return false;
+ }
+ $crl['descr'] = $name;
+ $crl['caref'] = $caref;
+ $crl['serial'] = $serial;
+ $crl['lifetime'] = $lifetime;
+ $crl['cert'] = array();
+ $crl_res = crl_update($crl);
+ $config['crl'][] = $crl;
+ return $crl_res;
+}
+
+function crl_update(& $crl) {
+ global $config;
+ $ca =& lookup_ca($crl['caref']);
+ if (!$ca) {
+ return false;
+ }
+ // If we have text but no certs, it was imported and cannot be updated.
+ if (($crl["method"] != "internal") && (!empty($crl['text']) && empty($crl['cert']))) {
+ return false;
+ }
+ $crl['serial']++;
+ $ca_str_crt = base64_decode($ca['crt']);
+ $ca_str_key = base64_decode($ca['prv']);
+ $crl_res = openssl_crl_new($ca_str_crt, $crl['serial'], $crl['lifetime']);
+ if (is_array($crl['cert']) && (count($crl['cert']) > 0)) {
+ foreach ($crl['cert'] as $cert) {
+ openssl_crl_revoke_cert($crl_res, base64_decode($cert["crt"]), $cert["revoke_time"], $cert["reason"]);
+ }
+ }
+ openssl_crl_export($crl_res, $crl_text, $ca_str_key);
+ $crl['text'] = base64_encode($crl_text);
+ return $crl_res;
+}
+
+function cert_revoke($cert, & $crl, $reason = OCSP_REVOKED_STATUS_UNSPECIFIED) {
+ global $config;
+ if (is_cert_revoked($cert, $crl['refid'])) {
+ return true;
+ }
+ // If we have text but no certs, it was imported and cannot be updated.
+ if (!is_crl_internal($crl)) {
+ return false;
+ }
+ $cert["reason"] = $reason;
+ $cert["revoke_time"] = time();
+ $crl["cert"][] = $cert;
+ crl_update($crl);
+ return true;
+}
+
+function cert_unrevoke($cert, & $crl) {
+ global $config;
+ if (!is_crl_internal($crl)) {
+ return false;
+ }
+ foreach ($crl['cert'] as $id => $rcert) {
+ if (($rcert['refid'] == $cert['refid']) || ($rcert['descr'] == $cert['descr'])) {
+ unset($crl['cert'][$id]);
+ if (count($crl['cert']) == 0) {
+ // Protect against accidentally switching the type to imported, for older CRLs
+ if (!isset($crl['method'])) {
+ $crl['method'] = "internal";
+ }
+ crl_update($crl);
+ } else {
+ crl_update($crl);
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+/* Compare two certificates to see if they match. */
+function cert_compare($cert1, $cert2) {
+ /* Ensure two certs are identical by first checking that their issuers match, then
+ subjects, then serial numbers, and finally the moduli. Anything less strict
+ could accidentally count two similar, but different, certificates as
+ being identical. */
+ $c1 = base64_decode($cert1['crt']);
+ $c2 = base64_decode($cert2['crt']);
+ if ((cert_get_issuer($c1, false) == cert_get_issuer($c2, false)) &&
+ (cert_get_subject($c1, false) == cert_get_subject($c2, false)) &&
+ (cert_get_serial($c1, false) == cert_get_serial($c2, false)) &&
+ (cert_get_modulus($c1, false) == cert_get_modulus($c2, false))) {
+ return true;
+ }
+ return false;
+}
+
+function is_cert_revoked($cert, $crlref = "") {
+ global $config;
+ if (!is_array($config['crl'])) {
+ return false;
+ }
+
+ if (!empty($crlref)) {
+ $crl = lookup_crl($crlref);
+ if (!is_array($crl['cert'])) {
+ return false;
+ }
+ foreach ($crl['cert'] as $rcert) {
+ if (cert_compare($rcert, $cert)) {
+ return true;
+ }
+ }
+ } else {
+ foreach ($config['crl'] as $crl) {
+ if (!is_array($crl['cert'])) {
+ continue;
+ }
+ foreach ($crl['cert'] as $rcert) {
+ if (cert_compare($rcert, $cert)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+function is_openvpn_server_crl($crlref) {
+ global $config;
+ if (!is_array($config['openvpn']['openvpn-server'])) {
+ return;
+ }
+ foreach ($config['openvpn']['openvpn-server'] as $ovpns) {
+ if (!empty($ovpns['crlref']) && ($ovpns['crlref'] == $crlref)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+// Keep this general to allow for future expansion. See cert_in_use() above.
+function crl_in_use($crlref) {
+ return (is_openvpn_server_crl($crlref));
+}
+
+function is_crl_internal($crl) {
+ return (!(!empty($crl['text']) && empty($crl['cert'])) || ($crl["method"] == "internal"));
+}
+
+function cert_get_cn($crt, $isref = false) {
+ /* If this is a certref, not an actual cert, look up the cert first */
+ if ($isref) {
+ $cert = lookup_cert($crt);
+ /* If it's not a valid cert, bail. */
+ if (!(is_array($cert) && !empty($cert['crt']))) {
+ return "";
+ }
+ $cert = $cert['crt'];
+ } else {
+ $cert = $crt;
+ }
+ $sub = cert_get_subject_array($cert);
+ if (is_array($sub)) {
+ foreach ($sub as $s) {
+ if (strtoupper($s['a']) == "CN") {
+ return $s['v'];
+ }
+ }
+ }
+ return "";
+}
+
+?>
diff --git a/src/etc/inc/config.console.inc b/src/etc/inc/config.console.inc
new file mode 100644
index 0000000..df3fa6f
--- /dev/null
+++ b/src/etc/inc/config.console.inc
@@ -0,0 +1,560 @@
+<?php
+/****h* pfSense/config
+ * NAME
+ * config.inc - Functions to manipulate config.xml
+ * DESCRIPTION
+ * This include contains various config.xml specific functions.
+ * HISTORY
+ * $Id$
+ ******
+
+ config.console.inc
+ Copyright (C) 2004-2010 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ pfSense_BUILDER_BINARIES: /sbin/mount /sbin/umount /sbin/halt /sbin/fsck
+ pfSense_MODULE: config
+*/
+
+function set_networking_interfaces_ports() {
+ global $noreboot;
+ global $config;
+ global $g;
+ global $fp;
+
+ $fp = fopen('php://stdin', 'r');
+
+ $memory = get_memory();
+ $physmem = $memory[0];
+ $realmem = $memory[1];
+
+ if ($physmem < $g['minimum_ram_warning']) {
+ echo "\n\n\n";
+ echo gettext("DANGER! WARNING! ACHTUNG!") . "\n\n";
+ printf(gettext("%s requires *AT LEAST* %s RAM to function correctly.%s"), $g['product_name'], $g['minimum_ram_warning_text'], "\n");
+ printf(gettext("Only (%s) MB RAM has been detected, with (%s) available to %s.%s"), $realmem, $physmem, $g['product_name'], "\n");
+ echo "\n" . gettext("Press ENTER to continue.") . " ";
+ fgets($fp);
+ echo "\n";
+ }
+
+ $iflist = get_interface_list();
+
+ /* Function flow is based on $key and $auto_assign or the lack thereof */
+ $key = null;
+
+ /* Only present auto interface option if running from LiveCD and interface mismatch*/
+ if ((preg_match("/cdrom/", $g['platform'])) && is_interface_mismatch()) {
+ $auto_assign = false;
+ }
+
+ echo <<<EOD
+
+Valid interfaces are:
+
+
+EOD;
+
+ if (!is_array($iflist)) {
+ echo gettext("No interfaces found!") . "\n";
+ $iflist = array();
+ } else {
+ foreach ($iflist as $iface => $ifa) {
+ echo sprintf("% -7s%s %s %s\n", $iface, $ifa['mac'],
+ $ifa['up'] ? " (up)" : "(down)", $ifa['dmesg']);
+ }
+ }
+
+ if ($auto_assign) {
+ echo <<<EOD
+
+ !!! LiveCD Detected: Auto Interface Option !!!!
+BEGIN MANUAL CONFIGURATION OR WE WILL PROCEED WITH AUTO CONFIGURATION.
+
+EOD;
+ }
+
+ echo <<<EOD
+
+Do you want to set up VLANs first?
+
+If you are not going to use VLANs, or only for optional interfaces, you should
+say no here and use the webConfigurator to configure VLANs later, if required.
+
+Do you want to set up VLANs now [y|n]?
+EOD;
+
+ if ($auto_assign) {
+ $key = timeout();
+ } else {
+ $key = chop(fgets($fp));
+ }
+
+ if (!isset($key) and $auto_assign) { // Auto Assign Interfaces
+ do {
+ echo <<<EOD
+
+ !!! Auto Assigning Interfaces !!!
+
+For installation purposes, you must plug in at least one NIC
+for the LAN connection. If you plug in a second NIC it will be
+assigned to WAN. Otherwise, we'll temporarily assign WAN to the
+next available NIC found regardless of activity. You should
+assign and configure the WAN interface according to your requirements
+
+If you haven't plugged in any network cables yet,
+now is the time to do so.
+We'll keep trying until you do.
+
+Searching for active interfaces...
+
+EOD;
+ unset($wanif, $lanif);
+
+ $media_iflist = $plugged_in = array();
+ $media_iflist = get_interface_list("media");
+ foreach ($media_iflist as $iface => $ifa) {
+ if ($ifa['up']) {
+ $plugged_in[] = $iface;
+ }
+ }
+
+ $lanif = array_shift($plugged_in);
+ $wanif = array_shift($plugged_in);
+
+ if (isset($lanif) && !isset($wanif)) {
+ foreach ($iflist as $iface => $ifa) {
+ if ($iface != $lanif) {
+ $wanif = $iface;
+ break;
+ }
+ }
+ }
+
+ echo <<<EOD
+
+Assigned WAN to : $wanif
+Assigned LAN to : $lanif
+
+If you don't like this assignment,
+press any key to go back to manual configuration.
+
+EOD;
+ $key = timeout(20);
+ if (isset($key)) {
+ return;
+ }
+ } while (!isset($wanif));
+
+ $config['system']['enablesshd'] = 'enabled';
+ $key = 'y';
+
+ } else {
+ //Manually assign interfaces
+ if (in_array($key, array('y', 'Y'))) {
+ vlan_setup();
+ }
+
+ if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
+
+ echo "\n\n" . gettext("VLAN interfaces:") . "\n\n";
+ foreach ($config['vlans']['vlan'] as $vlan) {
+
+ echo sprintf("% -16s%s\n", "{$vlan['if']}_vlan{$vlan['tag']}",
+ "VLAN tag {$vlan['tag']}, parent interface {$vlan['if']}");
+
+ $iflist[$vlan['if'] . '_vlan' . $vlan['tag']] = array();
+ }
+ }
+
+ echo <<<EOD
+
+If you do not know the names of your interfaces, you may choose to use
+auto-detection. In that case, disconnect all interfaces now before
+hitting 'a' to initiate auto detection.
+
+EOD;
+
+ do {
+ echo "\n" . gettext("Enter the WAN interface name or 'a' for auto-detection:") . " ";
+ $wanif = chop(fgets($fp));
+ if ($wanif === "") {
+ return;
+ }
+ if ($wanif === "a") {
+ $wanif = autodetect_interface("WAN", $fp);
+ } else if (!array_key_exists($wanif, $iflist)) {
+ printf(gettext("%sInvalid interface name '%s'%s"), "\n", $wanif, "\n");
+ unset($wanif);
+ continue;
+ }
+ } while (!$wanif);
+
+ do {
+ printf(gettext("%sEnter the LAN interface name or 'a' for auto-detection %s" .
+ "NOTE: this enables full Firewalling/NAT mode.%s" .
+ "(or nothing if finished):%s"), "\n", "\n", "\n", " ");
+
+ $lanif = chop(fgets($fp));
+
+ if ($lanif == "exit") {
+ exit;
+ }
+
+ if ($lanif == "") {
+ /* It is OK to have just a WAN, without a LAN so break if the user does not want LAN. */
+ break;
+ }
+
+ if ($lanif === "a") {
+ $lanif = autodetect_interface("LAN", $fp);
+ } else if (!array_key_exists($lanif, $iflist)) {
+ printf(gettext("%sInvalid interface name '%s'%s"), "\n", $lanif, "\n");
+ unset($lanif);
+ continue;
+ }
+ } while (!$lanif);
+
+ /* optional interfaces */
+ $i = 0;
+ $optif = array();
+
+ if ($lanif <> "") {
+ while (1) {
+ if ($optif[$i]) {
+ $i++;
+ }
+ $io = $i + 1;
+
+ if ($config['interfaces']['opt' . $io]['descr']) {
+ printf(gettext("%sOptional interface %s description found: %s"), "\n", $io, $config['interfaces']['opt' . $io]['descr']);
+ }
+
+ printf(gettext("%sEnter the Optional %s interface name or 'a' for auto-detection%s" .
+ "(or nothing if finished):%s"), "\n", $io, "\n", " ");
+
+ $optif[$i] = chop(fgets($fp));
+
+ if ($optif[$i]) {
+ if ($optif[$i] === "a") {
+ $ad = autodetect_interface(gettext("Optional") . " " . $io, $fp);
+ if ($ad) {
+ $optif[$i] = $ad;
+ } else {
+ unset($optif[$i]);
+ }
+ } else if (!array_key_exists($optif[$i], $iflist)) {
+ printf(gettext("%sInvalid interface name '%s'%s"), "\n", $optif[$i], "\n");
+ unset($optif[$i]);
+ continue;
+ }
+ } else {
+ unset($optif[$i]);
+ break;
+ }
+ }
+ }
+
+ /* check for double assignments */
+ $ifarr = array_merge(array($lanif, $wanif), $optif);
+
+ for ($i = 0; $i < (count($ifarr)-1); $i++) {
+ for ($j = ($i+1); $j < count($ifarr); $j++) {
+ if ($ifarr[$i] == $ifarr[$j]) {
+ echo <<<EOD
+
+Error: you cannot assign the same interface name twice!
+
+EOD;
+ fclose($fp);
+ return;
+ }
+ }
+ }
+
+ echo "\n" . gettext("The interfaces will be assigned as follows:") . "\n\n";
+
+ echo "WAN -> " . $wanif . "\n";
+ if ($lanif != "") {
+ echo "LAN -> " . $lanif . "\n";
+ }
+ for ($i = 0; $i < count($optif); $i++) {
+ echo "OPT" . ($i+1) . " -> " . $optif[$i] . "\n";
+ }
+
+ echo <<<EOD
+
+Do you want to proceed [y|n]?
+EOD;
+ $key = chop(fgets($fp));
+ }
+
+ if (in_array($key, array('y', 'Y'))) {
+ if ($lanif) {
+ if (!is_array($config['interfaces']['lan'])) {
+ $config['interfaces']['lan'] = array();
+ }
+ $config['interfaces']['lan']['if'] = $lanif;
+ $config['interfaces']['lan']['enable'] = true;
+ } elseif (!platform_booting() && !$auto_assign) {
+
+echo <<<EODD
+
+You have chosen to remove the LAN interface.
+
+Would you like to remove the LAN IP address and
+unload the interface now? [y|n]?
+EODD;
+
+ if (strcasecmp(chop(fgets($fp)), "y") == 0) {
+ if (isset($config['interfaces']['lan']) && $config['interfaces']['lan']['if']) {
+ mwexec("/sbin/ifconfig " . $config['interfaces']['lan']['if'] . " delete");
+ }
+ }
+ if (isset($config['interfaces']['lan'])) {
+ unset($config['interfaces']['lan']);
+ }
+ if (isset($config['dhcpd']['lan'])) {
+ unset($config['dhcpd']['lan']);
+ }
+ if (isset($config['interfaces']['lan']['if'])) {
+ unset($config['interfaces']['lan']['if']);
+ }
+ if (isset($config['interfaces']['wan']['blockpriv'])) {
+ unset($config['interfaces']['wan']['blockpriv']);
+ }
+ if (isset($config['shaper'])) {
+ unset($config['shaper']);
+ }
+ if (isset($config['ezshaper'])) {
+ unset($config['ezshaper']);
+ }
+ if (isset($config['nat'])) {
+ unset($config['nat']);
+ }
+ } else {
+ if (isset($config['interfaces']['lan']['if'])) {
+ mwexec("/sbin/ifconfig " . $config['interfaces']['lan']['if'] . " delete");
+ }
+ if (isset($config['interfaces']['lan'])) {
+ unset($config['interfaces']['lan']);
+ }
+ if (isset($config['dhcpd']['lan'])) {
+ unset($config['dhcpd']['lan']);
+ }
+ if (isset($config['interfaces']['lan']['if'])) {
+ unset($config['interfaces']['lan']['if']);
+ }
+ if (isset($config['interfaces']['wan']['blockpriv'])) {
+ unset($config['interfaces']['wan']['blockpriv']);
+ }
+ if (isset($config['shaper'])) {
+ unset($config['shaper']);
+ }
+ if (isset($config['ezshaper'])) {
+ unset($config['ezshaper']);
+ }
+ if (isset($config['nat'])) {
+ unset($config['nat']);
+ }
+ }
+ if (preg_match($g['wireless_regex'], $lanif)) {
+ if (is_array($config['interfaces']['lan']) &&
+ !is_array($config['interfaces']['lan']['wireless'])) {
+ $config['interfaces']['lan']['wireless'] = array();
+ }
+ } else {
+ if (isset($config['interfaces']['lan'])) {
+ unset($config['interfaces']['lan']['wireless']);
+ }
+ }
+
+ if (!is_array($config['interfaces']['wan'])) {
+ $config['interfaces']['wan'] = array();
+ }
+ $config['interfaces']['wan']['if'] = $wanif;
+ $config['interfaces']['wan']['enable'] = true;
+ if (preg_match($g['wireless_regex'], $wanif)) {
+ if (is_array($config['interfaces']['wan']) &&
+ !is_array($config['interfaces']['wan']['wireless'])) {
+ $config['interfaces']['wan']['wireless'] = array();
+ }
+ } else {
+ if (isset($config['interfaces']['wan'])) {
+ unset($config['interfaces']['wan']['wireless']);
+ }
+ }
+
+ for ($i = 0; $i < count($optif); $i++) {
+ if (!is_array($config['interfaces']['opt' . ($i+1)])) {
+ $config['interfaces']['opt' . ($i+1)] = array();
+ }
+
+ $config['interfaces']['opt' . ($i+1)]['if'] = $optif[$i];
+
+ /* wireless interface? */
+ if (preg_match($g['wireless_regex'], $optif[$i])) {
+ if (!is_array($config['interfaces']['opt' . ($i+1)]['wireless'])) {
+ $config['interfaces']['opt' . ($i+1)]['wireless'] = array();
+ }
+ } else {
+ unset($config['interfaces']['opt' . ($i+1)]['wireless']);
+ }
+
+ if (empty($config['interfaces']['opt' . ($i+1)]['descr'])) {
+ $config['interfaces']['opt' . ($i+1)]['descr'] = "OPT" . ($i+1);
+ unset($config['interfaces']['opt' . ($i+1)]['enable']);
+ }
+ }
+
+ /* remove all other (old) optional interfaces */
+ for (; isset($config['interfaces']['opt' . ($i+1)]); $i++) {
+ unset($config['interfaces']['opt' . ($i+1)]);
+ }
+
+ printf(gettext("%sWriting configuration..."), "\n");
+ write_config("Console assignment of interfaces");
+ printf(gettext("done.%s"), "\n");
+
+ fclose($fp);
+
+ if (platform_booting()) {
+ return;
+ }
+
+ echo gettext("One moment while we reload the settings...");
+ echo gettext(" done!") . "\n";
+
+ touch("{$g['tmp_path']}/assign_complete");
+
+ }
+}
+
+function autodetect_interface($ifname, $fp) {
+ $iflist_prev = get_interface_list("media");
+ echo <<<EOD
+
+Connect the {$ifname} interface now and make sure that the link is up.
+Then press ENTER to continue.
+
+EOD;
+ fgets($fp);
+ $iflist = get_interface_list("media");
+
+ foreach ($iflist_prev as $ifn => $ifa) {
+ if (!$ifa['up'] && $iflist[$ifn]['up']) {
+ printf(gettext("Detected link-up on interface %s.%s"), $ifn, "\n");
+ return $ifn;
+ }
+ }
+
+ printf(gettext("No link-up detected.%s"), "\n");
+
+ return null;
+}
+
+function interfaces_setup() {
+ global $iflist, $config, $g, $fp;
+
+ $iflist = get_interface_list();
+}
+
+function vlan_setup() {
+ global $iflist, $config, $g, $fp;
+
+ $iflist = get_interface_list();
+
+ if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
+
+ echo <<<EOD
+
+WARNING: all existing VLANs will be cleared if you proceed!
+
+Do you want to proceed [y|n]?
+EOD;
+
+ if (strcasecmp(chop(fgets($fp)), "y") != 0) {
+ return;
+ }
+ }
+
+ $config['vlans']['vlan'] = array();
+ echo "\n";
+
+ $vlanif = 0;
+
+ while (1) {
+ $vlan = array();
+
+ echo "\n\n" . gettext("VLAN Capable interfaces:") . "\n\n";
+ if (!is_array($iflist)) {
+ echo gettext("No interfaces found!") . "\n";
+ } else {
+ $vlan_capable = 0;
+ foreach ($iflist as $iface => $ifa) {
+ if (is_jumbo_capable($iface)) {
+ echo sprintf("% -8s%s%s\n", $iface, $ifa['mac'],
+ $ifa['up'] ? " (up)" : "");
+ $vlan_capable++;
+ }
+ }
+ }
+
+ if ($vlan_capable == 0) {
+ echo gettext("No VLAN capable interfaces detected.") . "\n";
+ return;
+ }
+
+ echo "\n" . gettext("Enter the parent interface name for the new VLAN (or nothing if finished):") . " ";
+ $vlan['if'] = chop(fgets($fp));
+
+ if ($vlan['if']) {
+ if (!array_key_exists($vlan['if'], $iflist) or
+ !is_jumbo_capable($vlan['if'])) {
+ printf(gettext("%sInvalid interface name '%s'%s"), "\n", $vlan['if'], "\n");
+ continue;
+ }
+ } else {
+ break;
+ }
+
+ echo gettext("Enter the VLAN tag (1-4094):") . " ";
+ $vlan['tag'] = chop(fgets($fp));
+ $vlan['vlanif'] = "{$vlan['if']}_vlan{$vlan['tag']}";
+ if (!is_numericint($vlan['tag']) || ($vlan['tag'] < 1) || ($vlan['tag'] > 4094)) {
+ printf(gettext("%sInvalid VLAN tag '%s'%s"), "\n", $vlan['tag'], "\n");
+ continue;
+ }
+
+ $config['vlans']['vlan'][] = $vlan;
+ $vlanif++;
+ }
+}
+
+?>
diff --git a/src/etc/inc/config.gui.inc b/src/etc/inc/config.gui.inc
new file mode 100644
index 0000000..56b5555
--- /dev/null
+++ b/src/etc/inc/config.gui.inc
@@ -0,0 +1,96 @@
+<?php
+/****h* pfSense/config
+ * NAME
+ * config.gui.inc - Functions to manipulate config.xml
+ * DESCRIPTION
+ * This include contains various config.xml specific functions.
+ * HISTORY
+ * $Id$
+ ******
+
+ config.gui.inc
+ Copyright (C) 2004-2010 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ pfSense_BUILDER_BINARIES: /sbin/mount /sbin/umount /sbin/halt /sbin/fsck
+ pfSense_MODULE: config
+*/
+
+require_once("globals.inc");
+
+/* do not load this file twice. */
+if ($config_parsed == true) {
+ return;
+} else {
+ $config_parsed = true;
+}
+
+/* include globals from notices.inc /utility/XML parser files */
+require_once('config.lib.inc');
+require_once("notices.inc");
+require_once("util.inc");
+require_once("IPv6.inc");
+if (file_exists("/cf/conf/use_xmlreader")) {
+ require_once("xmlreader.inc");
+} else {
+ require_once("xmlparse.inc");
+}
+require_once("crypt.inc");
+
+/* read platform */
+if (file_exists("{$g['etc_path']}/platform")) {
+ $g['platform'] = chop(file_get_contents("{$g['etc_path']}/platform"));
+} else {
+ $g['platform'] = "unknown";
+}
+
+/* if /debugging exists, lets set $debugging
+ so we can output more information */
+if (file_exists("/debugging")) {
+ $debugging = true;
+ $g['debug'] = true;
+}
+
+$config = parse_config();
+
+/* set timezone */
+$timezone = $config['system']['timezone'];
+if (!$timezone) {
+ $timezone = "Etc/UTC";
+}
+date_default_timezone_set("$timezone");
+
+if ($config_parsed == true) {
+ /* process packager manager custom rules */
+ if (is_dir("/usr/local/pkg/parse_config")) {
+ run_plugins("/usr/local/pkg/parse_config/");
+ }
+}
+
+?>
diff --git a/src/etc/inc/config.inc b/src/etc/inc/config.inc
new file mode 100644
index 0000000..4792ac3
--- /dev/null
+++ b/src/etc/inc/config.inc
@@ -0,0 +1,226 @@
+<?php
+/****h* pfSense/config
+ * NAME
+ * config.inc - Functions to manipulate config.xml
+ * DESCRIPTION
+ * This include contains various config.xml specific functions.
+ * HISTORY
+ * $Id$
+ ******
+
+ config.inc
+ Copyright (C) 2004-2010 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ pfSense_BUILDER_BINARIES: /sbin/mount /sbin/umount /sbin/halt /sbin/fsck
+ pfSense_MODULE: config
+*/
+
+if (!function_exists('platform_booting')) {
+ require_once('globals.inc');
+}
+
+/* do not load this file twice. */
+//if (in_array("/etc/inc/config.inc", get_included_files()))
+// return;
+
+// Set the memory limit to 128M on i386. When someone has something like 500+ tunnels
+// the parser needs quite a bit of ram. Do not remove this line unless you
+// know what you are doing. If in doubt, check with dev@ _/FIRST/_!
+if (!$ARCH) {
+ $ARCH = php_uname("m");
+}
+
+// Set memory limit to 256M on amd64.
+if ($ARCH == "amd64") {
+ ini_set("memory_limit", "256M");
+} else {
+ ini_set("memory_limit", "128M");
+}
+
+/* include globals from notices.inc /utility/XML parser files */
+require_once("notices.inc");
+require_once("util.inc");
+require_once("IPv6.inc");
+require_once('config.lib.inc');
+if (file_exists("/cf/conf/use_xmlreader")) {
+ require_once("xmlreader.inc");
+} else {
+ require_once("xmlparse.inc");
+}
+require_once("crypt.inc");
+
+/* read platform */
+if (file_exists("{$g['etc_path']}/platform")) {
+ $g['platform'] = chop(file_get_contents("{$g['etc_path']}/platform"));
+} else {
+ $g['platform'] = "unknown";
+}
+
+/* if /debugging exists, lets set $debugging
+ so we can output more information */
+if (file_exists("/debugging")) {
+ $debugging = true;
+ $g['debug'] = true;
+}
+
+if (platform_booting(true)) {
+ echo ".";
+ if (file_exists("/cf/conf/config.xml")) {
+ $config_contents = file_get_contents("/cf/conf/config.xml");
+ if (stristr($config_contents, "<m0n0wall>") == true) {
+ echo ".";
+ /* user has just upgraded from m0n0wall, replace root xml tags */
+ log_error(gettext("Upgrading m0n0wall configuration to pfSense... "));
+ $config_contents = str_replace("m0n0wall", "pfsense", $config_contents);
+ if (!config_validate("{$g['conf_path']}/config.xml")) {
+ log_error(gettext("ERROR! Could not convert m0n0wall -> pfsense in config.xml"));
+ }
+ conf_mount_rw();
+ file_put_contents("/cf/conf/config.xml", $config_contents);
+ conf_mount_ro();
+ }
+ unset($config_contents);
+ }
+ /* if our config file exists bail out, we're already set. */
+ else if (!file_exists($g['cf_conf_path'] . "/config.xml")) {
+ echo ".";
+ /* find the device where config.xml resides and write out an fstab */
+ unset($cfgdevice);
+ echo ".";
+ /* check if there's already an fstab (NFS booting?) */
+ if (!file_exists("{$g['etc_path']}/fstab")) {
+ echo ".";
+ if (strstr($g['platform'], "cdrom")) {
+ /* config is on floppy disk for CD-ROM version */
+ $cfgdevice = $cfgpartition = "fd0";
+ $_gb = exec('/sbin/dmesg -a', $dmesg);
+ if (preg_match("/da0/", $dmesg) == true) {
+ $cfgdevice = $cfgpartition = "da0" ;
+ if (mwexec("/sbin/mount -r /dev/{$cfgdevice} /cf")) {
+ /* could not mount, fallback to floppy */
+ $cfgdevice = $cfgpartition = "fd0";
+ }
+ }
+ unset($dmesg);
+ $cfgfstype = "msdosfs";
+ echo gettext("CDROM build") . "\n";
+ echo " " . gettext("CFG:") . " {$cfgpartition}\n";
+ echo " " . gettext("CFG:") . " {$cfgpartition}\n";
+ echo " " . gettext("TYPE:") . " {$cfgfstype}\n";
+ } else {
+ echo ".";
+ /* probe kernel known disks until we find one with config.xml */
+ $disks = explode(" ", get_single_sysctl("kern.disks"));
+ foreach ($disks as $mountdisk) {
+ /* skip mfs mounted filesystems */
+ if (strstr($mountdisk, "md")) {
+ continue;
+ }
+ if (mwexec("/sbin/mount -r /dev/{$mountdisk}a {$g['cf_path']}") == 0) {
+ if (file_exists("{$g['cf_conf_path']}/config.xml")) {
+ /* found it */
+ $cfgdevice = $mountdisk;
+ $cfgpartition = $cfgdevice . "a";
+ $cfgfstype = "ufs";
+ printf(gettext("Found configuration on %s.%s"), $cfgdevice, "\n");
+ }
+
+ mwexec("/sbin/umount -f {$g['cf_path']}");
+
+ if ($cfgdevice) {
+ break;
+ }
+ }
+ if (mwexec("/sbin/mount -r /dev/{$mountdisk}d {$g['cf_path']}") == 0) {
+ if (platform_booting()) {
+ echo ".";
+ }
+ if (file_exists("{$g['cf_conf_path']}/config.xml")) {
+ /* found it */
+ $cfgdevice = $mountdisk;
+ $cfgpartition = $cfgdevice . "d";
+ $cfgfstype = "ufs";
+ printf(gettext("Found configuration on %s.%s"), $cfgdevice, "\n");
+ }
+
+ mwexec("/sbin/umount -f {$g['cf_path']}");
+
+ if ($cfgdevice) {
+ break;
+ }
+ }
+ }
+ }
+ echo ".";
+ if (!$cfgdevice) {
+ $last_backup = discover_last_backup();
+ if ($last_backup) {
+ log_error(gettext("No config.xml found, attempting last known config restore."));
+ file_notice("config.xml", gettext("No config.xml found, attempting last known config restore."), "pfSenseConfigurator", "");
+ restore_backup("/cf/conf/backup/{$last_backup}");
+ } else {
+ log_error(gettext("No config.xml or config backups found, resetting to factory defaults."));
+ restore_backup('/conf.default/config.xml');
+ }
+ }
+
+ /* write device name to a file for rc.firmware */
+ file_put_contents("{$g['varetc_path']}/cfdevice", $cfgdevice . "\n");
+
+ /* write out an fstab */
+
+ $fstab = "/dev/{$cfgpartition} {$g['cf_path']} {$cfgfstype} ro,noatime 1 1\n";
+ $fstab .= "proc /proc procfs rw 0 0\n";
+ file_put_contents("{$g['etc_path']}/fstab", $fstab);
+ }
+ echo ".";
+ /* mount all filesystems */
+ mwexec("/sbin/mount -a");
+ }
+ echo ".";
+}
+
+$config = parse_config();
+
+/* set timezone */
+$timezone = $config['system']['timezone'];
+if (!$timezone) {
+ $timezone = "Etc/UTC";
+}
+date_default_timezone_set("$timezone");
+
+if ($config_parsed == true) {
+ /* process packager manager custom rules */
+ if (is_dir("/usr/local/pkg/parse_config")) {
+ run_plugins("/usr/local/pkg/parse_config/");
+ }
+}
+
+?>
diff --git a/src/etc/inc/config.lib.inc b/src/etc/inc/config.lib.inc
new file mode 100644
index 0000000..222d9d8
--- /dev/null
+++ b/src/etc/inc/config.lib.inc
@@ -0,0 +1,1020 @@
+<?php
+/****h* pfSense/config
+ * NAME
+ * config.lib.inc - Functions to manipulate config.xml
+ * DESCRIPTION
+ * This include contains various config.xml specific functions.
+ * HISTORY
+ * $Id$
+ ******
+
+ config.lib.inc
+ Ported from config.inc by Erik Kristensen
+ Copyright (C) 2004-2010 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ pfSense_BUILDER_BINARIES: /sbin/mount /sbin/umount /sbin/halt
+ pfSense_MODULE: config
+*/
+
+/****f* config/encrypted_configxml
+ * NAME
+ * encrypted_configxml - Checks to see if config.xml is encrypted and if so, prompts to unlock.
+ * INPUTS
+ * None
+ * RESULT
+ * $config - rewrites config.xml without encryption
+ ******/
+function encrypted_configxml() {
+ global $g, $config;
+
+ if (!file_exists($g['conf_path'] . "/config.xml")) {
+ return;
+ }
+
+ if (!platform_booting()) {
+ return;
+ }
+
+ $configtxt = file_get_contents($g['conf_path'] . "/config.xml");
+ if (tagfile_deformat($configtxt, $configtxt, "config.xml")) {
+ $fp = fopen('php://stdin', 'r');
+ $data = "";
+ echo "\n\n*** Encrypted config.xml detected ***\n";
+ while ($data == "") {
+ echo "\nEnter the password to decrypt config.xml: ";
+ $decrypt_password = chop(fgets($fp));
+ $data = decrypt_data($configtxt, $decrypt_password);
+ if (!strstr($data, "<pfsense>")) {
+ $data = "";
+ }
+ if ($data) {
+ $fd = fopen($g['conf_path'] . "/config.xml.tmp", "w");
+ fwrite($fd, $data);
+ fclose($fd);
+ exec("/bin/mv {$g['conf_path']}/config.xml.tmp {$g['conf_path']}/config.xml");
+ echo "\n" . gettext("Config.xml unlocked.") . "\n";
+ fclose($fp);
+ pfSense_fsync("{$g['conf_path']}/config.xml");
+ } else {
+ echo "\n" . gettext("Invalid password entered. Please try again.") . "\n";
+ }
+ }
+ }
+}
+
+/****f* config/parse_config
+ * NAME
+ * parse_config - Read in config.cache or config.xml if needed and return $config array
+ * INPUTS
+ * $parse - boolean to force parse_config() to read config.xml and generate config.cache
+ * RESULT
+ * $config - array containing all configuration variables
+ ******/
+function parse_config($parse = false) {
+ global $g, $config_parsed, $config_extra;
+
+ $lockkey = lock('config');
+ $config_parsed = false;
+
+ if (!file_exists("{$g['conf_path']}/config.xml") || filesize("{$g['conf_path']}/config.xml") == 0) {
+ $last_backup = discover_last_backup();
+ if ($last_backup) {
+ log_error(gettext("No config.xml found, attempting last known config restore."));
+ file_notice("config.xml", gettext("No config.xml found, attempting last known config restore."), "pfSenseConfigurator", "");
+ restore_backup("{$g['conf_path']}/backup/{$last_backup}");
+ } else {
+ unlock($lockkey);
+ die(gettext("Config.xml is corrupted and is 0 bytes. Could not restore a previous backup."));
+ }
+ }
+
+ if (platform_booting(true)) {
+ echo ".";
+ }
+
+ // Check for encrypted config.xml
+ encrypted_configxml();
+
+ if (!$parse) {
+ if (file_exists($g['tmp_path'] . '/config.cache')) {
+ $config = unserialize(file_get_contents($g['tmp_path'] . '/config.cache'));
+ if (is_null($config)) {
+ $parse = true;
+ }
+ } else {
+ $parse = true;
+ }
+ }
+ if ($parse == true) {
+ if (!file_exists($g['conf_path'] . "/config.xml")) {
+ if (platform_booting(true)) {
+ echo ".";
+ }
+ log_error("No config.xml found, attempting last known config restore.");
+ file_notice("config.xml", "No config.xml found, attempting last known config restore.", "pfSenseConfigurator", "");
+ $last_backup = discover_last_backup();
+ if ($last_backup) {
+ restore_backup("/cf/conf/backup/{$last_backup}");
+ } else {
+ log_error(gettext("Could not restore config.xml."));
+ unlock($lockkey);
+ die(gettext("Config.xml is corrupted and is 0 bytes. Could not restore a previous backup."));
+ }
+ }
+ $config = parse_xml_config($g['conf_path'] . '/config.xml', array($g['xml_rootobj'], 'pfsense'));
+ if ($config == -1) {
+ $last_backup = discover_last_backup();
+ if ($last_backup) {
+ restore_backup("/cf/conf/backup/{$last_backup}");
+ } else {
+ log_error(gettext("Could not restore config.xml."));
+ unlock($lockkey);
+ die("Config.xml is corrupted and is 0 bytes. Could not restore a previous backup.");
+ }
+ }
+ generate_config_cache($config);
+ }
+
+ if (platform_booting(true)) {
+ echo ".";
+ }
+
+ $config_parsed = true;
+ unlock($lockkey);
+
+ alias_make_table($config);
+
+ return $config;
+}
+
+/****f* config/generate_config_cache
+ * NAME
+ * generate_config_cache - Write serialized configuration to cache.
+ * INPUTS
+ * $config - array containing current firewall configuration
+ * RESULT
+ * boolean - true on completion
+ ******/
+function generate_config_cache($config) {
+ global $g, $config_extra;
+
+ $configcache = fopen($g['tmp_path'] . '/config.cache', "w");
+ fwrite($configcache, serialize($config));
+ fclose($configcache);
+ pfSense_fsync("{$g['tmp_path']}/config.cache");
+
+ unset($configcache);
+ /* Used for config.extra.xml */
+ if (file_exists($g['tmp_path'] . '/config.extra.cache') && $config_extra) {
+ $configcacheextra = fopen($g['tmp_path'] . '/config.extra.cache', "w");
+ fwrite($configcacheextra, serialize($config_extra));
+ fclose($configcacheextra);
+ pfSense_fsync("{$g['tmp_path']}/config.extra.cache");
+ unset($configcacheextra);
+ }
+}
+
+function discover_last_backup() {
+ $backups = glob('/cf/conf/backup/*.xml');
+ $last_backup = "";
+ $last_mtime = 0;
+ foreach ($backups as $backup) {
+ if (filemtime($backup) > $last_mtime) {
+ $last_mtime = filemtime($backup);
+ $last_backup = $backup;
+ }
+ }
+
+ return basename($last_backup);
+}
+
+function restore_backup($file) {
+ global $g;
+
+ if (file_exists($file)) {
+ conf_mount_rw();
+ unlink_if_exists("{$g['tmp_path']}/config.cache");
+ copy("$file", "/cf/conf/config.xml");
+ pfSense_fsync("/cf/conf/config.xml");
+ pfSense_fsync($g['conf_path']);
+ disable_security_checks();
+ log_error(sprintf(gettext('%1$s is restoring the configuration %2$s'), $g['product_name'], $file));
+ file_notice("config.xml", sprintf(gettext('%1$s is restoring the configuration %2$s'), $g['product_name'], $file), "pfSenseConfigurator", "");
+ conf_mount_ro();
+ }
+}
+
+/****f* config/parse_config_bootup
+ * NAME
+ * parse_config_bootup - Bootup-specific configuration checks.
+ * RESULT
+ * null
+ ******/
+function parse_config_bootup() {
+ global $config, $g;
+
+ if (platform_booting()) {
+ echo ".";
+ }
+
+ $lockkey = lock('config');
+ if (!file_exists("{$g['conf_path']}/config.xml")) {
+ if (platform_booting()) {
+ if (strstr($g['platform'], "cdrom")) {
+ /* try copying the default config. to the floppy */
+ echo gettext("Resetting factory defaults...") . "\n";
+ reset_factory_defaults(true);
+ if (!file_exists("{$g['conf_path']}/config.xml")) {
+ echo gettext("No XML configuration file found - using factory defaults.\n" .
+ "Make sure that the configuration floppy disk with the conf/config.xml\n" .
+ "file is inserted. If it isn't, your configuration changes will be lost\n" .
+ "on reboot.\n");
+ }
+ } else {
+ $last_backup = discover_last_backup();
+ if ($last_backup) {
+ log_error("No config.xml found, attempting last known config restore.");
+ file_notice("config.xml", gettext("No config.xml found, attempting last known config restore."), "pfSenseConfigurator", "");
+ restore_backup("/cf/conf/backup/{$last_backup}");
+ }
+ if (!file_exists("{$g['conf_path']}/config.xml")) {
+ echo sprintf(gettext("XML configuration file not found. %s cannot continue booting."), $g['product_name']) . "\n";
+ unlock($lockkey);
+ mwexec("/sbin/halt");
+ exit;
+ }
+ log_error("Last known config found and restored. Please double check your configuration file for accuracy.");
+ file_notice("config.xml", gettext("Last known config found and restored. Please double check your configuration file for accuracy."), "pfSenseConfigurator", "");
+ }
+ } else {
+ unlock($lockkey);
+ log_error(gettext("Could not find a usable configuration file! Exiting...."));
+ exit(0);
+ }
+ }
+
+ if (filesize("{$g['conf_path']}/config.xml") == 0) {
+ $last_backup = discover_last_backup();
+ if ($last_backup) {
+ log_error(gettext("No config.xml found, attempting last known config restore."));
+ file_notice("config.xml", gettext("No config.xml found, attempting last known config restore."), "pfSenseConfigurator", "");
+ restore_backup("{$g['conf_path']}/backup/{$last_backup}");
+ } else {
+ unlock($lockkey);
+ die(gettext("Config.xml is corrupted and is 0 bytes. Could not restore a previous backup."));
+ }
+ }
+ unlock($lockkey);
+
+ $config = parse_config(true);
+
+ if ((float)$config['version'] > (float)$g['latest_config']) {
+ echo <<<EOD
+
+
+*******************************************************************************
+* WARNING! *
+* The current configuration has been created with a newer version of {$g['product_name']} *
+* than this one! This can lead to serious misbehavior and even security *
+* holes! You are urged to either upgrade to a newer version of {$g['product_name']} or *
+* revert to the default configuration immediately! *
+*******************************************************************************
+
+
+EOD;
+ }
+
+ /* make alias table (for faster lookups) */
+ alias_make_table($config);
+}
+
+/****f* config/conf_mount_rw
+ * NAME
+ * conf_mount_rw - Mount filesystems read/write.
+ * RESULT
+ * null
+ ******/
+/* mount flash card read/write */
+function conf_mount_rw() {
+ global $g, $config;
+
+ /* do not mount on cdrom platform */
+ if ($g['platform'] == "cdrom" or $g['platform'] == "pfSense") {
+ return;
+ }
+
+ if ((refcount_reference(1000) > 1) && is_writable("/")) {
+ return;
+ }
+
+ $status = mwexec("/sbin/mount -u -w -o sync,noatime {$g['cf_path']}");
+ if ($status <> 0) {
+ if (platform_booting()) {
+ echo gettext("/cf Filesystem is dirty.") . "\n";
+ }
+ $status = mwexec("/sbin/mount -u -w -o sync,noatime {$g['cf_path']}");
+ }
+
+ /* if the platform is soekris or wrap or pfSense, lets mount the
+ * compact flash cards root.
+ */
+ $status = mwexec("/sbin/mount -u -w -o sync,noatime /");
+ /* we could not mount this correctly. */
+ if ($status <> 0) {
+ log_error(gettext("/ File system is dirty."));
+ $status = mwexec("/sbin/mount -u -w -o sync,noatime /");
+ }
+
+ mark_subsystem_dirty('mount');
+}
+
+/****f* config/conf_mount_ro
+ * NAME
+ * conf_mount_ro - Mount filesystems readonly.
+ * RESULT
+ * null
+ ******/
+function conf_mount_ro() {
+ global $g, $config;
+
+ /* Do not trust $g['platform'] since this can be clobbered during factory reset. */
+ $platform = trim(file_get_contents("/etc/platform"));
+ /* do not umount on cdrom or pfSense platforms */
+ if ($platform == "cdrom" or $platform == "pfSense") {
+ return;
+ }
+
+ if (refcount_unreference(1000) > 0) {
+ return;
+ }
+
+ if (isset($config['system']['nanobsd_force_rw'])) {
+ return;
+ }
+
+ if (platform_booting()) {
+ return;
+ }
+
+ clear_subsystem_dirty('mount');
+ /* sync data, then force a remount of /cf */
+ pfSense_fsync($g['cf_path']);
+ mwexec("/sbin/mount -u -r -f -o sync,noatime {$g['cf_path']}");
+ mwexec("/sbin/mount -u -r -f -o sync,noatime /");
+}
+
+/****f* config/convert_config
+ * NAME
+ * convert_config - Attempt to update config.xml.
+ * DESCRIPTION
+ * convert_config() reads the current global configuration
+ * and attempts to convert it to conform to the latest
+ * config.xml version. This allows major formatting changes
+ * to be made with a minimum of breakage.
+ * RESULT
+ * null
+ ******/
+/* convert configuration, if necessary */
+function convert_config() {
+ global $config, $g;
+ $now = date("H:i:s");
+ log_error(sprintf(gettext("Start Configuration upgrade at %s, set execution timeout to 15 minutes"), $now));
+ //ini_set("max_execution_time", "900");
+
+ /* special case upgrades */
+ /* fix every minute crontab bogons entry */
+ if (is_array($config['cron'])) {
+ $cron_item_count = count($config['cron']['item']);
+ for ($x = 0; $x < $cron_item_count; $x++) {
+ if (stristr($config['cron']['item'][$x]['command'], "rc.update_bogons.sh")) {
+ if ($config['cron']['item'][$x]['hour'] == "*") {
+ $config['cron']['item'][$x]['hour'] = "3";
+ write_config(gettext("Updated bogon update frequency to 3am"));
+ log_error(gettext("Updated bogon update frequency to 3am"));
+ }
+ }
+ }
+ }
+ if ($config['version'] == $g['latest_config']) {
+ return; /* already at latest version */
+ }
+
+ // Save off config version
+ $prev_version = $config['version'];
+
+ include_once('auth.inc');
+ include_once('upgrade_config.inc');
+ if (file_exists("/etc/inc/upgrade_config_custom.inc")) {
+ include_once("upgrade_config_custom.inc");
+ }
+ /* Loop and run upgrade_VER_to_VER() until we're at current version */
+ while ($config['version'] < $g['latest_config']) {
+ $cur = $config['version'] * 10;
+ $next = $cur + 1;
+ $migration_function = sprintf('upgrade_%03d_to_%03d', $cur, $next);
+ if (function_exists($migration_function)) {
+ $migration_function();
+ }
+ $migration_function = "{$migration_function}_custom";
+ if (function_exists($migration_function)) {
+ $migration_function();
+ }
+ $config['version'] = sprintf('%.1f', $next / 10);
+ if (platform_booting()) {
+ echo ".";
+ }
+ }
+
+ $now = date("H:i:s");
+ log_error(sprintf(gettext("Ended Configuration upgrade at %s"), $now));
+
+ if ($prev_version != $config['version']) {
+ write_config(sprintf(gettext('Upgraded config version level from %1$s to %2$s'), $prev_version, $config['version']));
+ }
+}
+
+/****f* config/safe_write_file
+ * NAME
+ * safe_write_file - Write a file out atomically
+ * DESCRIPTION
+ * safe_write_file() Writes a file out atomically by first writing to a
+ * temporary file of the same name but ending with the pid of the current
+ * process, them renaming the temporary file over the original.
+ * INPUTS
+ * $filename - string containing the filename of the file to write
+ * $content - string containing the file content to write to file
+ * $force_binary - boolean denoting whether we should force binary
+ * mode writing.
+ * RESULT
+ * boolean - true if successful, false if not
+ ******/
+function safe_write_file($file, $content, $force_binary) {
+ $tmp_file = $file . "." . getmypid();
+ $write_mode = $force_binary ? "wb" : "w";
+
+ $fd = fopen($tmp_file, $write_mode);
+ if (!$fd) {
+ // Unable to open temporary file for writing
+ return false;
+ }
+ if (!fwrite($fd, $content)) {
+ // Unable to write to temporary file
+ fclose($fd);
+ return false;
+ }
+ fflush($fd);
+ fclose($fd);
+
+ if (!pfSense_fsync($tmp_file) || !rename($tmp_file, $file)) {
+ // Unable to move temporary file to original
+ @unlink($tmp_file);
+ return false;
+ }
+
+ // Sync file before returning
+ return pfSense_fsync($file);
+}
+
+/****f* config/write_config
+ * NAME
+ * write_config - Backup and write the firewall configuration.
+ * DESCRIPTION
+ * write_config() handles backing up the current configuration,
+ * applying changes, and regenerating the configuration cache.
+ * INPUTS
+ * $desc - string containing the a description of configuration changes
+ * $backup - boolean: do not back up current configuration if false.
+ * RESULT
+ * null
+ ******/
+/* save the system configuration */
+function write_config($desc="Unknown", $backup = true) {
+ global $config, $g;
+
+ if (!empty($_SERVER['REMOTE_ADDR'])) {
+ if (!session_id()) {
+ @session_start();
+ }
+ if (!empty($_SESSION['Username']) && ($_SESSION['Username'] != "admin")) {
+ $user = getUserEntry($_SESSION['Username']);
+ if (is_array($user) && userHasPrivilege($user, "user-config-readonly")) {
+ session_commit();
+ return false;
+ }
+ }
+ }
+
+ if (!isset($argc)) {
+ session_commit();
+ }
+
+ if ($backup) {
+ backup_config();
+ }
+
+ $config['revision'] = make_config_revision_entry($desc);
+
+ conf_mount_rw();
+ $lockkey = lock('config', LOCK_EX);
+
+ /* generate configuration XML */
+ $xmlconfig = dump_xml_config($config, $g['xml_rootobj']);
+
+ /* write new configuration */
+ if (!safe_write_file("{$g['cf_conf_path']}/config.xml", $xmlconfig, false)) {
+ log_error(gettext("WARNING: Config contents could not be saved. Could not open file!"));
+ unlock($lockkey);
+ file_notice("config.xml", sprintf(gettext("Unable to open %s/config.xml for writing in write_config()%s"), $g['cf_conf_path'], "\n"));
+ return -1;
+ }
+
+ cleanup_backupcache(true);
+
+ /* re-read configuration */
+ /* NOTE: We assume that the file can be parsed since we wrote it. */
+ $config = parse_xml_config("{$g['conf_path']}/config.xml", $g['xml_rootobj']);
+ if ($config == -1) {
+ copy("{$g['conf_path']}/config.xml", "{$g['conf_path']}/config.xml.bad");
+ $last_backup = discover_last_backup();
+ if ($last_backup) {
+ restore_backup("/cf/conf/backup/{$last_backup}");
+ $config = parse_xml_config("{$g['conf_path']}/config.xml", $g['xml_rootobj']);
+ if (platform_booting()) {
+ echo "\n\n ************** WARNING **************";
+ echo "\n\n Configuration could not be validated. A previous configuration was restored. \n";
+ echo "\n The failed configuration file has been saved as {$g['conf_path']}/config.xml.bad \n\n";
+ }
+ } else {
+ log_error(gettext("Could not restore config.xml."));
+ }
+ } else {
+ generate_config_cache($config);
+ }
+
+ unlock($lockkey);
+
+ unlink_if_exists("/usr/local/pkg/pf/carp_sync_client.php");
+
+ /* tell kernel to sync fs data */
+ conf_mount_ro();
+
+ /* sync carp entries to other firewalls */
+ carp_sync_client();
+
+ if (is_dir("/usr/local/pkg/write_config")) {
+ /* process packager manager custom rules */
+ run_plugins("/usr/local/pkg/write_config/");
+ }
+
+ return $config;
+}
+
+/****f* config/reset_factory_defaults
+ * NAME
+ * reset_factory_defaults - Reset the system to its default configuration.
+ * RESULT
+ * integer - indicates completion
+ ******/
+function reset_factory_defaults($lock = false) {
+ global $g;
+
+ conf_mount_rw();
+ if (!$lock) {
+ $lockkey = lock('config', LOCK_EX);
+ }
+
+ /* create conf directory, if necessary */
+ safe_mkdir("{$g['cf_conf_path']}");
+
+ /* clear out /conf */
+ $dh = opendir($g['conf_path']);
+ while ($filename = readdir($dh)) {
+ if (($filename != ".") && ($filename != "..")) {
+ unlink_if_exists($g['conf_path'] . "/" . $filename);
+ }
+ }
+ closedir($dh);
+ unlink_if_exists($g['tmp_path'] . "/config.cache");
+
+ /* copy default configuration */
+ copy("{$g['conf_default_path']}/config.xml", "{$g['conf_path']}/config.xml");
+
+ disable_security_checks();
+
+ /* call the wizard */
+ touch("/conf/trigger_initial_wizard");
+ if (!$lock) {
+ unlock($lockkey);
+ }
+ conf_mount_ro();
+ setup_serial_port();
+ return 0;
+}
+
+function config_restore($conffile) {
+ global $config, $g;
+
+ if (!file_exists($conffile)) {
+ return 1;
+ }
+
+ backup_config();
+
+ conf_mount_rw();
+
+ $lockkey = lock('config', LOCK_EX);
+
+ unlink_if_exists("{$g['tmp_path']}/config.cache");
+ copy($conffile, "{$g['cf_conf_path']}/config.xml");
+
+ disable_security_checks();
+
+ unlock($lockkey);
+
+ $config = parse_config(true);
+
+ conf_mount_ro();
+
+ write_config(gettext("Reverted to") . " " . array_pop(explode("/", $conffile)) . ".", false);
+
+ return 0;
+}
+
+function config_install($conffile) {
+ global $config, $g;
+
+ if (!file_exists($conffile)) {
+ return 1;
+ }
+
+ if (!config_validate("{$conffile}")) {
+ return 1;
+ }
+
+ if (platform_booting()) {
+ echo gettext("Installing configuration...") . "\n";
+ } else {
+ log_error(gettext("Installing configuration ...."));
+ }
+
+ conf_mount_rw();
+ $lockkey = lock('config', LOCK_EX);
+
+ copy($conffile, "{$g['conf_path']}/config.xml");
+
+ disable_security_checks();
+
+ /* unlink cache file if it exists */
+ if (file_exists("{$g['tmp_path']}/config.cache")) {
+ unlink("{$g['tmp_path']}/config.cache");
+ }
+
+ unlock($lockkey);
+ conf_mount_ro();
+
+ return 0;
+}
+
+/*
+ * Disable security checks for DNS rebind and HTTP referrer until next time
+ * they pass (or reboot), to aid in preventing accidental lockout when
+ * restoring settings like hostname, domain, IP addresses, and settings
+ * related to the DNS rebind and HTTP referrer checks.
+ * Intended for use when restoring a configuration or directly
+ * modifying config.xml without an unconditional reboot.
+ */
+function disable_security_checks() {
+ global $g;
+ touch("{$g['tmp_path']}/disable_security_checks");
+}
+
+/* Restores security checks. Should be called after all succeed. */
+function restore_security_checks() {
+ global $g;
+ unlink_if_exists("{$g['tmp_path']}/disable_security_checks");
+}
+
+/* Returns status of security check temporary disable. */
+function security_checks_disabled() {
+ global $g;
+ return file_exists("{$g['tmp_path']}/disable_security_checks");
+}
+
+function config_validate($conffile) {
+
+ global $g, $xmlerr;
+
+ $xml_parser = xml_parser_create();
+
+ if (!($fp = fopen($conffile, "r"))) {
+ $xmlerr = gettext("XML error: unable to open file");
+ return false;
+ }
+
+ while ($data = fread($fp, 4096)) {
+ if (!xml_parse($xml_parser, $data, feof($fp))) {
+ $xmlerr = sprintf(gettext('%1$s at line %2$d'),
+ xml_error_string(xml_get_error_code($xml_parser)),
+ xml_get_current_line_number($xml_parser));
+ return false;
+ }
+ }
+ xml_parser_free($xml_parser);
+
+ fclose($fp);
+
+ return true;
+}
+
+function cleanup_backupcache($lock = false) {
+ global $g;
+ $i = false;
+
+ $revisions = get_config_backup_count();
+
+ if (!$lock) {
+ $lockkey = lock('config');
+ }
+
+ conf_mount_rw();
+
+ $backups = get_backups();
+ if ($backups) {
+ $baktimes = $backups['versions'];
+ unset($backups['versions']);
+ } else {
+ $backups = array();
+ $baktimes = array();
+ }
+ $newbaks = array();
+ $bakfiles = glob($g['cf_conf_path'] . "/backup/config-*");
+ $tocache = array();
+
+ foreach ($bakfiles as $backup) { // Check for backups in the directory not represented in the cache.
+ $backupsize = filesize($backup);
+ if ($backupsize == 0) {
+ unlink($backup);
+ continue;
+ }
+ $backupexp = explode('-', $backup);
+ $backupexp = explode('.', array_pop($backupexp));
+ $tocheck = array_shift($backupexp);
+ unset($backupexp);
+ if (!in_array($tocheck, $baktimes)) {
+ $i = true;
+ if (platform_booting()) {
+ echo ".";
+ }
+ $newxml = parse_xml_config($backup, array($g['xml_rootobj'], 'pfsense'));
+ if ($newxml == "-1") {
+ log_error(sprintf(gettext("The backup cache file %s is corrupted. Unlinking."), $backup));
+ unlink($backup);
+ log_error(sprintf(gettext("The backup cache file %s is corrupted. Unlinking."), $backup));
+ continue;
+ }
+ if ($newxml['revision']['description'] == "") {
+ $newxml['revision']['description'] = "Unknown";
+ }
+ if ($newxml['version'] == "") {
+ $newxml['version'] = "?";
+ }
+ $tocache[$tocheck] = array('description' => $newxml['revision']['description'], 'version' => $newxml['version'], 'filesize' => $backupsize);
+ }
+ }
+ foreach ($backups as $checkbak) {
+ if (count(preg_grep('/' . $checkbak['time'] . '/i', $bakfiles)) != 0) {
+ $newbaks[] = $checkbak;
+ } else {
+ $i = true;
+ if (platform_booting()) print " " . $tocheck . "r";
+ }
+ }
+ foreach ($newbaks as $todo) {
+ $tocache[$todo['time']] = array('description' => $todo['description'], 'version' => $todo['version'], 'filesize' => $todo['filesize']);
+ }
+ if (is_int($revisions) and (count($tocache) > $revisions)) {
+ $toslice = array_slice(array_keys($tocache), 0, $revisions);
+ foreach ($toslice as $sliced) {
+ $newcache[$sliced] = $tocache[$sliced];
+ }
+ foreach ($tocache as $version => $versioninfo) {
+ if (!in_array($version, array_keys($newcache))) {
+ unlink_if_exists($g['conf_path'] . '/backup/config-' . $version . '.xml');
+ }
+ }
+ $tocache = $newcache;
+ }
+ $bakout = fopen($g['cf_conf_path'] . '/backup/backup.cache', "w");
+ fwrite($bakout, serialize($tocache));
+ fclose($bakout);
+ pfSense_fsync("{$g['cf_conf_path']}/backup/backup.cache");
+ conf_mount_ro();
+
+ if (!$lock) {
+ unlock($lockkey);
+ }
+}
+
+function get_backups() {
+ global $g;
+ if (file_exists("{$g['cf_conf_path']}/backup/backup.cache")) {
+ $confvers = unserialize(file_get_contents("{$g['cf_conf_path']}/backup/backup.cache"));
+ $bakvers = array_keys($confvers);
+ $toreturn = array();
+ sort($bakvers);
+ // $bakvers = array_reverse($bakvers);
+ foreach (array_reverse($bakvers) as $bakver) {
+ $toreturn[] = array('time' => $bakver, 'description' => $confvers[$bakver]['description'], 'version' => $confvers[$bakver]['version'], 'filesize' => $confvers[$bakver]['filesize']);
+ }
+ } else {
+ return false;
+ }
+ $toreturn['versions'] = $bakvers;
+ return $toreturn;
+}
+
+function backup_config() {
+ global $config, $g;
+
+ if ($g['platform'] == "cdrom") {
+ return;
+ }
+
+ conf_mount_rw();
+
+ /* Create backup directory if needed */
+ safe_mkdir("{$g['cf_conf_path']}/backup");
+ if ($config['revision']['time'] == "") {
+ $baktime = 0;
+ } else {
+ $baktime = $config['revision']['time'];
+ }
+
+ if ($config['revision']['description'] == "") {
+ $bakdesc = "Unknown";
+ } else {
+ $bakdesc = $config['revision']['description'];
+ }
+
+ $bakver = ($config['version'] == "") ? "?" : $config['version'];
+ $bakfilename = $g['cf_conf_path'] . '/backup/config-' . $baktime . '.xml';
+ copy($g['cf_conf_path'] . '/config.xml', $bakfilename);
+
+ if (file_exists($g['cf_conf_path'] . '/backup/backup.cache')) {
+ $backupcache = unserialize(file_get_contents($g['cf_conf_path'] . '/backup/backup.cache'));
+ } else {
+ $backupcache = array();
+ }
+ $backupcache[$baktime] = array('description' => $bakdesc, 'version' => $bakver, 'filesize' => filesize($bakfilename));
+ $bakout = fopen($g['cf_conf_path'] . '/backup/backup.cache', "w");
+ fwrite($bakout, serialize($backupcache));
+ fclose($bakout);
+ pfSense_fsync("{$g['cf_conf_path']}/backup/backup.cache");
+
+ conf_mount_ro();
+
+ return true;
+}
+
+function set_device_perms() {
+ $devices = array(
+ 'pf' => array(
+ 'user' => 'root',
+ 'group' => 'proxy',
+ 'mode' => 0660),
+ );
+
+ foreach ($devices as $name => $attr) {
+ $path = "/dev/$name";
+ if (file_exists($path)) {
+ chown($path, $attr['user']);
+ chgrp($path, $attr['group']);
+ chmod($path, $attr['mode']);
+ }
+ }
+}
+
+function get_config_user() {
+ if (empty($_SESSION["Username"])) {
+ $username = getenv("USER");
+ if (empty($conuser) || $conuser == "root") {
+ $username = "(system)";
+ }
+ } else {
+ $username = $_SESSION["Username"];
+ }
+
+ if (!empty($_SERVER['REMOTE_ADDR'])) {
+ $username .= '@' . $_SERVER['REMOTE_ADDR'];
+ }
+
+ return $username;
+}
+
+function make_config_revision_entry($desc = null, $override_user = null) {
+ if (empty($override_user)) {
+ $username = get_config_user();
+ } else {
+ $username = $override_user;
+ }
+
+ $revision = array();
+
+ if (time() > mktime(0, 0, 0, 9, 1, 2004)) { /* make sure the clock settings are plausible */
+ $revision['time'] = time();
+ }
+
+ /* Log the running script so it's not entirely unlogged what changed */
+ if ($desc == "Unknown") {
+ $desc = sprintf(gettext("%s made unknown change"), $_SERVER['SCRIPT_NAME']);
+ }
+ if (!empty($desc)) {
+ $revision['description'] = "{$username}: " . $desc;
+ }
+ $revision['username'] = $username;
+ return $revision;
+}
+
+function get_config_backup_count() {
+ global $config, $g;
+ if (isset($config['system']['backupcount']) && is_numeric($config['system']['backupcount']) && ($config['system']['backupcount'] >= 0)) {
+ return intval($config['system']['backupcount']);
+ } elseif ($g['platform'] == "nanobsd") {
+ return 5;
+ } else {
+ return 30;
+ }
+}
+
+function pfSense_clear_globals() {
+ global $config, $FilterIfList, $GatewaysList, $filterdns, $aliases, $aliastable;
+
+ $error = error_get_last();
+
+ if ($error !== NULL) {
+ if ($error['type'] == E_ERROR) {
+ $errorstr = "PHP ERROR: Type: {$error['type']}, File: {$error['file']}, Line: {$error['line']}, Message: {$error['message']}";
+ print($errorstr);
+ log_error($errorstr);
+ } else if ($error['type'] != E_NOTICE) {
+ $errorstr = "PHP WARNING: Type: {$error['type']}, File: {$error['file']}, Line: {$error['line']}, Message: {$error['message']}";
+ // XXX: comment out for now, should re-enable post-2.2
+ //print($errorstr);
+ //log_error($errorstr);
+ }
+ }
+
+ if (isset($FilterIfList)) {
+ unset($FilterIfList);
+ }
+
+ if (isset($GatewaysList)) {
+ unset($GatewaysList);
+ }
+
+ /* Used for the hostname dns resolver */
+ if (isset($filterdns)) {
+ unset($filterdns);
+ }
+
+ /* Used for aliases and interface macros */
+ if (isset($aliases)) {
+ unset($aliases);
+ }
+ if (isset($aliastable)) {
+ unset($aliastable);
+ }
+
+ unset($config);
+}
+
+register_shutdown_function('pfSense_clear_globals');
+
+?>
diff --git a/src/etc/inc/cram_md5_sasl_client.inc b/src/etc/inc/cram_md5_sasl_client.inc
new file mode 100644
index 0000000..69bd625
--- /dev/null
+++ b/src/etc/inc/cram_md5_sasl_client.inc
@@ -0,0 +1,67 @@
+<?php
+/*
+ * cram_md5_sasl_client.php
+ *
+ * @(#) $Id: cram_md5_sasl_client.php,v 1.3 2004/11/17 08:00:37 mlemos Exp $
+ *
+ */
+
+define("SASL_CRAM_MD5_STATE_START", 0);
+define("SASL_CRAM_MD5_STATE_RESPOND_CHALLENGE", 1);
+define("SASL_CRAM_MD5_STATE_DONE", 2);
+
+class cram_md5_sasl_client_class
+{
+ var $credentials=array();
+ var $state=SASL_CRAM_MD5_STATE_START;
+
+ Function Initialize(&$client)
+ {
+ return(1);
+ }
+
+ Function HMACMD5($key,$text)
+ {
+ $key=(strlen($key)<64 ? str_pad($key,64,"\0") : substr($key,0,64));
+ return(md5((str_repeat("\x5c", 64)^$key).pack("H32", md5((str_repeat("\x36", 64)^$key).$text))));
+ }
+
+ Function Start(&$client, &$message, &$interactions)
+ {
+ if($this->state!=SASL_CRAM_MD5_STATE_START)
+ {
+ $client->error="CRAM-MD5 authentication state is not at the start";
+ return(SASL_FAIL);
+ }
+ $this->credentials=array(
+ "user"=>"",
+ "password"=>""
+ );
+ $defaults=array();
+ $status=$client->GetCredentials($this->credentials,$defaults,$interactions);
+ if($status==SASL_CONTINUE)
+ $this->state=SASL_CRAM_MD5_STATE_RESPOND_CHALLENGE;
+ Unset($message);
+ return($status);
+ }
+
+ Function Step(&$client, $response, &$message, &$interactions)
+ {
+ switch($this->state)
+ {
+ case SASL_CRAM_MD5_STATE_RESPOND_CHALLENGE:
+ $message=$this->credentials["user"]." ".$this->HMACMD5($this->credentials["password"], $response);
+ $this->state=SASL_CRAM_MD5_STATE_DONE;
+ break;
+ case SASL_CRAM_MD5_STATE_DONE:
+ $client->error="CRAM-MD5 authentication was finished without success";
+ return(SASL_FAIL);
+ default:
+ $client->error="invalid CRAM-MD5 authentication step state";
+ return(SASL_FAIL);
+ }
+ return(SASL_CONTINUE);
+ }
+};
+
+?> \ No newline at end of file
diff --git a/src/etc/inc/crypt.inc b/src/etc/inc/crypt.inc
new file mode 100644
index 0000000..8d96b26
--- /dev/null
+++ b/src/etc/inc/crypt.inc
@@ -0,0 +1,101 @@
+<?php
+
+/* $Id$ */
+/*
+ Copyright (C) 2008 Shrew Soft Inc
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_BUILDER_BINARIES: /usr/bin/openssl
+ pfSense_MODULE: crypto
+
+*/
+
+ function crypt_data($val, $pass, $opt) {
+ $file = tempnam("/tmp", "php-encrypt");
+ file_put_contents("{$file}.dec", $val);
+ exec("/usr/bin/openssl enc {$opt} -aes-256-cbc -in {$file}.dec -out {$file}.enc -k " . escapeshellarg($pass));
+ if (file_exists("{$file}.enc")) {
+ $result = file_get_contents("{$file}.enc");
+ } else {
+ $result = "";
+ log_error("Failed to encrypt/decrypt data!");
+ }
+ @unlink($file);
+ @unlink("{$file}.dec");
+ @unlink("{$file}.enc");
+ return $result;
+ }
+
+ function encrypt_data(& $data, $pass) {
+ return base64_encode(crypt_data($data, $pass, "-e"));
+ }
+
+ function decrypt_data(& $data, $pass) {
+ return crypt_data(base64_decode($data), $pass, "-d");
+ }
+
+ function tagfile_reformat($in, & $out, $tag) {
+
+ $out = "---- BEGIN {$tag} ----\n";
+
+ $size = 80;
+ $oset = 0;
+ while ($size >= 64) {
+ $line = substr($in, $oset, 64);
+ $out .= $line."\n";
+ $size = strlen($line);
+ $oset += $size;
+ }
+
+ $out .= "---- END {$tag} ----\n";
+
+ return true;
+ }
+
+ function tagfile_deformat($in, & $out, $tag) {
+
+ $btag_val = "---- BEGIN {$tag} ----";
+ $etag_val = "---- END {$tag} ----";
+
+ $btag_len = strlen($btag_val);
+ $etag_len = strlen($etag_val);
+
+ $btag_pos = stripos($in, $btag_val);
+ $etag_pos = stripos($in, $etag_val);
+
+ if (($btag_pos === false) || ($etag_pos === false)) {
+ return false;
+ }
+
+ $body_pos = $btag_pos + $btag_len;
+ $body_len = strlen($in);
+ $body_len -= $btag_len;
+ $body_len -= $etag_len + 1;
+
+ $out = substr($in, $body_pos, $body_len);
+
+ return true;
+ }
+
+?>
diff --git a/src/etc/inc/digest_sasl_client.inc b/src/etc/inc/digest_sasl_client.inc
new file mode 100644
index 0000000..924887d
--- /dev/null
+++ b/src/etc/inc/digest_sasl_client.inc
@@ -0,0 +1,135 @@
+<?php
+/*
+ * digest_sasl_client.php
+ *
+ * @(#) $Id: digest_sasl_client.php,v 1.1 2005/10/27 05:24:15 mlemos Exp $
+ *
+ */
+
+define('SASL_DIGEST_STATE_START', 0);
+define('SASL_DIGEST_STATE_RESPOND_CHALLENGE', 1);
+define('SASL_DIGEST_STATE_DONE', 2);
+
+class digest_sasl_client_class
+{
+ var $credentials=array();
+ var $state=SASL_DIGEST_STATE_START;
+
+ Function unq($string)
+ {
+ return(($string[0]=='"' && $string[strlen($string)-1]=='"') ? substr($string, 1, strlen($string)-2) : $string);
+ }
+
+ Function H($data)
+ {
+ return md5($data);
+ }
+
+ Function KD($secret, $data)
+ {
+ return $this->H($secret.':'.$data);
+ }
+
+ Function Initialize(&$client)
+ {
+ return(1);
+ }
+
+ Function Start(&$client, &$message, &$interactions)
+ {
+ if($this->state!=SASL_DIGEST_STATE_START)
+ {
+ $client->error='Digest authentication state is not at the start';
+ return(SASL_FAIL);
+ }
+ $this->credentials=array(
+ 'user'=>'',
+ 'password'=>'',
+ 'uri'=>'',
+ 'method'=>'',
+ 'session'=>''
+ );
+ $defaults=array();
+ $status=$client->GetCredentials($this->credentials,$defaults,$interactions);
+ if($status==SASL_CONTINUE)
+ $this->state=SASL_DIGEST_STATE_RESPOND_CHALLENGE;
+ Unset($message);
+ return($status);
+ }
+
+ Function Step(&$client, $response, &$message, &$interactions)
+ {
+ switch($this->state)
+ {
+ case SASL_DIGEST_STATE_RESPOND_CHALLENGE:
+ $values=explode(',',$response);
+ $parameters=array();
+ for($v=0; $v<count($values); $v++)
+ $parameters[strtok(trim($values[$v]), '=')]=strtok('');
+
+ $message='username="'.$this->credentials['user'].'"';
+ if(!IsSet($parameters[$p='realm'])
+ && !IsSet($parameters[$p='nonce']))
+ {
+ $client->error='Digest authentication parameter '.$p.' is missing from the server response';
+ return(SASL_FAIL);
+ }
+ $message.=', realm='.$parameters['realm'];
+ $message.=', nonce='.$parameters['nonce'];
+ $message.=', uri="'.$this->credentials['uri'].'"';
+ if(IsSet($parameters['algorithm']))
+ {
+ $algorithm=$this->unq($parameters['algorithm']);
+ $message.=', algorithm='.$parameters['algorithm'];
+ }
+ else
+ $algorithm='';
+
+ $realm=$this->unq($parameters['realm']);
+ $nonce=$this->unq($parameters['nonce']);
+ if(IsSet($parameters['qop']))
+ {
+ switch($qop=$this->unq($parameters['qop']))
+ {
+ case "auth":
+ $cnonce=$this->credentials['session'];
+ break;
+ default:
+ $client->error='Digest authentication quality of protection '.$qop.' is not yet supported';
+ return(SASL_FAIL);
+ }
+ }
+ $nc_value='00000001';
+ if(IsSet($parameters['qop'])
+ && !strcmp($algorithm, 'MD5-sess'))
+ $A1=$this->H($this->credentials['user'].':'. $realm.':'. $this->credentials['password']).':'.$nonce.':'.$cnonce;
+ else
+ $A1=$this->credentials['user'].':'. $realm.':'. $this->credentials['password'];
+ $A2=$this->credentials['method'].':'.$this->credentials['uri'];
+ if(IsSet($parameters['qop']))
+ $response=$this->KD($this->H($A1), $nonce.':'. $nc_value.':'. $cnonce.':'. $qop.':'. $this->H($A2));
+ else
+ $response=$this->KD($this->H($A1), $nonce.':'. $this->H($A2));
+ $message.=', response="'.$response.'"';
+ if(IsSet($parameters['opaque']))
+ $message.=', opaque='.$parameters['opaque'];
+ if(IsSet($parameters['qop']))
+ $message.=', qop="'.$qop.'"';
+ $message.=', nc='.$nc_value;
+ if(IsSet($parameters['qop']))
+ $message.=', cnonce="'.$cnonce.'"';
+ $client->encode_response=0;
+ $this->state=SASL_DIGEST_STATE_DONE;
+ break;
+ case SASL_DIGEST_STATE_DONE:
+ $client->error='Digest authentication was finished without success';
+ return(SASL_FAIL);
+ default:
+ $client->error='invalid Digest authentication step state';
+ return(SASL_FAIL);
+ }
+ return(SASL_CONTINUE);
+ }
+};
+
+?> \ No newline at end of file
diff --git a/src/etc/inc/dot.hushlogin b/src/etc/inc/dot.hushlogin
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/etc/inc/dot.hushlogin
diff --git a/src/etc/inc/dyndns.class b/src/etc/inc/dyndns.class
new file mode 100644
index 0000000..cb21fb5
--- /dev/null
+++ b/src/etc/inc/dyndns.class
@@ -0,0 +1,1634 @@
+<?php
+ /*
+ * PHP.updateDNS (pfSense version)
+ *
+ * +====================================================+
+ * Services Supported:
+ * - DynDns (dyndns.org) [dynamic, static, custom]
+ * - DHSDns (dhs.org)
+ * - No-IP (no-ip.com)
+ * - EasyDNS (easydns.com)
+ * - DHS (www.dhs.org)
+ * - HN (hn.org) -- incomplete checking!
+ * - DynS (dyns.org)
+ * - ZoneEdit (zoneedit.com)
+ * - FreeDNS (freedns.afraid.org)
+ * - Loopia (loopia.se)
+ * - StaticCling (staticcling.org)
+ * - DNSexit (dnsexit.com)
+ * - OpenDNS (opendns.com)
+ * - Namecheap (namecheap.com)
+ * - HE.net (dns.he.net)
+ * - HE.net IPv6 (dns.he.net)
+ * - HE.net Tunnelbroker IP update (ipv4.tunnelbroker.net)
+ * - SelfHost (selfhost.de)
+ * - Amazon Route 53 (aws.amazon.com)
+ * - DNS-O-Matic (dnsomatic.com)
+ * - Custom DDNS (any URL)
+ * - Custom DDNS IPv6 (any URL)
+ * - CloudFlare (www.cloudflare.com)
+ * - Eurodns (eurodns.com)
+ * - GratisDNS (gratisdns.dk)
+ * - City Network (citynetwork.se)
+ * - GleSYS (glesys.com)
+ * - DNSimple (dnsimple.com)
+ * - Google Domains (domains.google.com)
+ * - DNS Made Easy (www.dnsmadeeasy.com)
+ * +----------------------------------------------------+
+ * Requirements:
+ * - PHP version 4.0.2 or higher with the CURL Library and the PCRE Library
+ * +----------------------------------------------------+
+ * Public Functions
+ * - updatedns()
+ *
+ * Private Functions
+ * - _update()
+ * - _checkStatus()
+ * - _error()
+ * - _detectChange()
+ * - _debug()
+ * - _checkIP()
+ * +----------------------------------------------------+
+ * DynDNS Dynamic - Last Tested: 12 July 2005
+ * DynDNS Static - Last Tested: NEVER
+ * DynDNS Custom - Last Tested: NEVER
+ * No-IP - Last Tested: 20 July 2008
+ * HN.org - Last Tested: 12 July 2005
+ * EasyDNS - Last Tested: 20 July 2008
+ * DHS - Last Tested: 12 July 2005
+ * ZoneEdit - Last Tested: NEVER
+ * Dyns - Last Tested: NEVER
+ * ODS - Last Tested: 02 August 2005
+ * FreeDNS - Last Tested: 23 Feb 2011
+ * Loopia - Last Tested: NEVER
+ * StaticCling - Last Tested: 27 April 2006
+ * DNSexit - Last Tested: 20 July 2008
+ * OpenDNS - Last Tested: 4 August 2008
+ * Namecheap - Last Tested: 31 August 2010
+ * HE.net - Last Tested: 7 July 2013
+ * HE.net IPv6 - Last Tested: 7 July 2013
+ * HE.net Tunnel - Last Tested: 28 June 2011
+ * SelfHost - Last Tested: 26 December 2011
+ * Amazon Route 53 - Last tested: 01 April 2012
+ * DNS-O-Matic - Last Tested: 9 September 2010
+ * CloudFlare - Last Tested: 30 May 2013
+ * Eurodns - Last Tested: 27 June 2013
+ * GratisDNS - Last Tested: 15 August 2012
+ * OVH DynHOST - Last Tested: NEVER
+ * City Network - Last Tested: 13 November 2013
+ * GleSYS - Last Tested: 3 February 2015
+ * DNSimple - Last Tested: 09 February 2015
+ * Google Domains - Last Tested: 27 April 2015
+ * DNS Made Easy - Last Tested: 27 April 2015
+ * +====================================================+
+ *
+ * @author E.Kristensen
+ * @link http://www.idylldesigns.com/projects/phpdns/
+ * @version 0.8
+ * @updated 13 October 05 at 21:02:42 GMT
+ *
+ * DNSexit/OpenDNS support and multiwan extension for pfSense by Ermal Luçi
+ * Custom DNS support by Matt Corallo
+ *
+ */
+
+ class updatedns {
+ var $_cacheFile;
+ var $_cacheFile_v6;
+ var $_debugFile;
+ var $_UserAgent = 'User-Agent: phpDynDNS/0.7';
+ var $_errorVerbosity = 0;
+ var $_dnsService;
+ var $_dnsUser;
+ var $_dnsPass;
+ var $_dnsHost;
+ var $_dnsIP;
+ var $_dnsWildcard;
+ var $_dnsMX;
+ var $_dnsBackMX;
+ var $_dnsServer;
+ var $_dnsPort;
+ var $_dnsUpdateURL;
+ var $_dnsZoneID;
+ var $_dnsTTL;
+ var $status;
+ var $_debugID;
+ var $_if;
+ var $_dnsResultMatch;
+ var $_dnsRequestIf;
+ var $_dnsRequestIfIP;
+ var $_dnsVerboseLog;
+ var $_curlIpresolveV4;
+ var $_curlSslVerifypeer;
+ var $_dnsMaxCacheAgeDays;
+ var $_dnsDummyUpdateDone;
+ var $_forceUpdateNeeded;
+ var $_useIPv6;
+
+ /*
+ * Public Constructor Function (added 12 July 05) [beta]
+ * - Gets the dice rolling for the update.
+ * - $dnsResultMatch should only be used with $dnsService = 'custom'
+ * - $dnsResultMatch is parsed for '%IP%', which is the IP the provider was updated to,
+ * - it is otherwise expected to be exactly identical to what is returned by the Provider.
+ * - $dnsUser, and $dnsPass indicate HTTP Auth for custom DNS, if they are needed in the URL (GET Variables), include them in $dnsUpdateURL.
+ * - $For custom requests, $dnsUpdateURL is parsed for '%IP%', which is replaced with the new IP.
+ */
+ function updatedns ($dnsService = '', $dnsHost = '', $dnsUser = '', $dnsPass = '',
+ $dnsWildcard = 'OFF', $dnsMX = '', $dnsIf = '', $dnsBackMX = '',
+ $dnsServer = '', $dnsPort = '', $dnsUpdateURL = '', $forceUpdate = false,
+ $dnsZoneID ='', $dnsTTL='', $dnsResultMatch = '', $dnsRequestIf = '',
+ $dnsID = '', $dnsVerboseLog = false, $curlIpresolveV4 = false, $curlSslVerifypeer = true) {
+
+ global $config, $g;
+
+ $this->_cacheFile = "{$g['conf_path']}/dyndns_{$dnsIf}{$dnsService}" . escapeshellarg($dnsHost) . "{$dnsID}.cache";
+ $this->_cacheFile_v6 = "{$g['conf_path']}/dyndns_{$dnsIf}{$dnsService}" . escapeshellarg($dnsHost) . "{$dnsID}_v6.cache";
+ $this->_debugFile = "{$g['varetc_path']}/dyndns_{$dnsIf}{$dnsService}" . escapeshellarg($dnsHost) . "{$dnsID}.debug";
+
+ $this->_curlIpresolveV4 = $curlIpresolveV4;
+ $this->_curlSslVerifypeer = $curlSslVerifypeer;
+ $this->_dnsVerboseLog = $dnsVerboseLog;
+ if ($this->_dnsVerboseLog) {
+ log_error("DynDns: updatedns() starting");
+ }
+
+ $dyndnslck = lock("DDNS".$dnsID, LOCK_EX);
+
+ if (!$dnsService) $this->_error(2);
+ switch ($dnsService) {
+ case 'freedns':
+ if (!$dnsHost) $this->_error(5);
+ break;
+ case 'namecheap':
+ if (!$dnsPass) $this->_error(4);
+ if (!$dnsHost) $this->_error(5);
+ break;
+ case 'route53':
+ if (!$dnsZoneID) $this->_error(8);
+ if (!$dnsTTL) $this->_error(9);
+ break;
+ case 'custom':
+ if (!$dnsUpdateURL) $this->_error(7);
+ break;
+ default:
+ if (!$dnsUser) $this->_error(3);
+ if (!$dnsPass) $this->_error(4);
+ if (!$dnsHost) $this->_error(5);
+ }
+
+ switch ($dnsService) {
+ case 'he-net-v6':
+ case 'custom-v6':
+ $this->_useIPv6 = true;
+ break;
+ default:
+ $this->_useIPv6 = false;
+ }
+ $this->_dnsService = strtolower($dnsService);
+ $this->_dnsUser = $dnsUser;
+ $this->_dnsPass = $dnsPass;
+ $this->_dnsHost = $dnsHost;
+ $this->_dnsServer = $dnsServer;
+ $this->_dnsPort = $dnsPort;
+ $this->_dnsWildcard = $dnsWildcard;
+ $this->_dnsMX = $dnsMX;
+ $this->_dnsZoneID = $dnsZoneID;
+ $this->_dnsTTL = $dnsTTL;
+ $this->_if = get_failover_interface($dnsIf);
+ $this->_checkIP();
+ $this->_dnsUpdateURL = $dnsUpdateURL;
+ $this->_dnsResultMatch = $dnsResultMatch;
+ $this->_dnsRequestIf = get_failover_interface($dnsRequestIf);
+ if ($this->_dnsVerboseLog) {
+ log_error("DynDNS ({$this->_dnsHost}): running get_failover_interface for {$dnsRequestIf}. found {$this->_dnsRequestIf}");
+ }
+ $this->_dnsRequestIfIP = get_interface_ip($dnsRequestIf);
+ $this->_dnsMaxCacheAgeDays = 25;
+ $this->_dnsDummyUpdateDone = false;
+ $this->_forceUpdateNeeded = $forceUpdate;
+
+ // Ensure that we were able to lookup the IP
+ if (!is_ipaddr($this->_dnsIP)) {
+ log_error("DynDNS ({$this->_dnsHost}) There was an error trying to determine the public IP for interface - {$dnsIf}({$this->_if}). Probably interface is not a WAN interface.");
+ unlock($dyndnslck);
+ return;
+ }
+
+ $this->_debugID = rand(1000000, 9999999);
+
+ if ($forceUpdate == false && $this->_detectChange() == false) {
+ $this->_error(10);
+ } else {
+ switch ($this->_dnsService) {
+ case 'glesys':
+ case 'dnsomatic':
+ case 'dyndns':
+ case 'dyndns-static':
+ case 'dyndns-custom':
+ case 'dhs':
+ case 'noip':
+ case 'noip-free':
+ case 'easydns':
+ case 'hn':
+ case 'zoneedit':
+ case 'dyns':
+ case 'ods':
+ case 'freedns':
+ case 'loopia':
+ case 'staticcling':
+ case 'dnsexit':
+ case 'custom':
+ case 'custom-v6':
+ case 'opendns':
+ case 'namecheap':
+ case 'he-net':
+ case 'he-net-v6':
+ case 'selfhost':
+ case 'he-net-tunnelbroker':
+ case 'route53':
+ case 'cloudflare':
+ case 'eurodns':
+ case 'gratisdns':
+ case 'ovh-dynhost':
+ case 'citynetwork':
+ case 'dnsimple':
+ case 'googledomains':
+ case 'dnsmadeeasy':
+ $this->_update();
+ if ($this->_dnsDummyUpdateDone == true) {
+ // If a dummy update was needed, then sleep a while and do the update again to put the proper address back.
+ // Some providers (e.g. No-IP free accounts) need to have at least 1 address change every month.
+ // If the address has not changed recently, or the user did "Force Update", then the code does
+ // a dummy address change for providers like this.
+ sleep(10);
+ $this->_update();
+ }
+ break;
+ default:
+ $this->_error(6);
+ break;
+ }
+ }
+
+ unlock($dyndnslck);
+ }
+
+ /*
+ * Private Function (added 12 July 05) [beta]
+ * Send Update To Selected Service.
+ */
+ function _update() {
+
+ if ($this->_dnsVerboseLog) {
+ log_error("DynDNS ({$this->_dnsHost}): DynDns _update() starting.");
+ }
+
+ if ($this->_dnsService != 'ods' and $this->_dnsService != 'route53 ') {
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_HEADER, 0);
+ curl_setopt($ch, CURLOPT_USERAGENT, $this->_UserAgent);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
+ curl_setopt($ch, CURLOPT_INTERFACE, 'if!' . $this->_dnsRequestIf);
+ curl_setopt($ch, CURLOPT_TIMEOUT, 120); // Completely empirical
+ }
+
+ switch ($this->_dnsService) {
+ case 'glesys':
+ $needsIP = TRUE;
+ if ($this->_dnsVerboseLog) {
+ log_error("DynDNS: ({$this->_dnsHost}) DNS update() starting.");
+ }
+ $server = 'https://api.glesys.com/domain/updaterecord/format/json';
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ $post_data['recordid'] = $this->_dnsHost;
+ $post_data['data'] = $this->_dnsIP;
+ curl_setopt($ch, CURLOPT_URL, $server);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
+ break;
+ case 'dyndns':
+ case 'dyndns-static':
+ case 'dyndns-custom':
+ $needsIP = FALSE;
+ if ($this->_dnsVerboseLog) {
+ log_error("DynDNS: ({$this->_dnsHost}) DNS update() starting.");
+ }
+ if (isset($this->_dnsWildcard) && $this->_dnsWildcard != "OFF") {
+ $this->_dnsWildcard = "ON";
+ }
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ $server = "https://members.dyndns.org/nic/update";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server .$port . '?system=dyndns&hostname=' . $this->_dnsHost . '&myip=' . $this->_dnsIP . '&wildcard='.$this->_dnsWildcard . '&mx=' . $this->_dnsMX . '&backmx=NO');
+ break;
+ case 'dhs':
+ $needsIP = TRUE;
+ $post_data['hostscmd'] = 'edit';
+ $post_data['hostscmdstage'] = '2';
+ $post_data['type'] = '4';
+ $post_data['updatetype'] = 'Online';
+ $post_data['mx'] = $this->_dnsMX;
+ $post_data['mx2'] = '';
+ $post_data['txt'] = '';
+ $post_data['offline_url'] = '';
+ $post_data['cloak'] = 'Y';
+ $post_data['cloak_title'] = '';
+ $post_data['ip'] = $this->_dnsIP;
+ $post_data['domain'] = 'dyn.dhs.org';
+ $post_data['hostname'] = $this->_dnsHost;
+ $post_data['submit'] = 'Update';
+ $server = "https://members.dhs.org/nic/hosts";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, '{$server}{$port}');
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
+ break;
+ case 'noip':
+ case 'noip-free':
+ $needsIP = TRUE;
+ $server = "https://dynupdate.no-ip.com/ducupdate.php";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ if (($this->_dnsService == "noip-free") &&
+ ($this->_forceUpdateNeeded == true) &&
+ ($this->_dnsDummyUpdateDone == false)) {
+ // Update the IP to a dummy value to force No-IP free accounts to see a change.
+ $iptoset = "192.168.1.1";
+ $this->_dnsDummyUpdateDone = true;
+ log_error("DynDNS ({$this->_dnsHost}): Processing dummy update on No-IP free account. IP temporarily set to " . $iptoset);
+ } else {
+ $iptoset = $this->_dnsIP;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server . $port . '?username=' . urlencode($this->_dnsUser) . '&pass=' . urlencode($this->_dnsPass) . '&hostname=' . $this->_dnsHost.'&ip=' . $iptoset);
+ break;
+ case 'easydns':
+ $needsIP = TRUE;
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ $server = "https://members.easydns.com/dyn/dyndns.php";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server . $port . '?hostname=' . $this->_dnsHost . '&myip=' . $this->_dnsIP . '&wildcard=' . $this->_dnsWildcard . '&mx=' . $this->_dnsMX . '&backmx=' . $this->_dnsBackMX);
+ break;
+ case 'hn':
+ $needsIP = TRUE;
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ $server = "http://dup.hn.org/vanity/update";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server . $port . '?ver=1&IP=' . $this->_dnsIP);
+ break;
+ case 'zoneedit':
+ $needsIP = FALSE;
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+
+ $server = "https://dynamic.zoneedit.com/auth/dynamic.html";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, "{$server}{$port}?host=" .$this->_dnsHost);
+ break;
+ case 'dyns':
+ $needsIP = FALSE;
+ $server = "https://www.dyns.cx/postscript011.php";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server . $port . '?username=' . urlencode($this->_dnsUser) . '&password=' . $this->_dnsPass . '&host=' . $this->_dnsHost);
+ break;
+ case 'ods':
+ $needsIP = FALSE;
+ $misc_errno = 0;
+ $misc_error = "";
+ $server = "ods.org";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ $this->con['socket'] = fsockopen("{$server}{$port}", "7070", $misc_errno, $misc_error, 30);
+ /* Check that we have connected */
+ if (!$this->con['socket']) {
+ print "error! could not connect.";
+ break;
+ }
+ /* Here is the loop. Read the incoming data (from the socket connection) */
+ while (!feof($this->con['socket'])) {
+ $this->con['buffer']['all'] = trim(fgets($this->con['socket'], 4096));
+ $code = substr($this->con['buffer']['all'], 0, 3);
+ sleep(1);
+ switch ($code) {
+ case 100:
+ fputs($this->con['socket'], "LOGIN ".$this->_dnsUser." ".$this->_dnsPass."\n");
+ break;
+ case 225:
+ fputs($this->con['socket'], "DELRR ".$this->_dnsHost." A\n");
+ break;
+ case 901:
+ fputs($this->con['socket'], "ADDRR ".$this->_dnsHost." A ".$this->_dnsIP."\n");
+ break;
+ case 795:
+ fputs($this->con['socket'], "QUIT\n");
+ break;
+ }
+ }
+ $this->_checkStatus(0, $code);
+ break;
+ case 'freedns':
+ $needIP = FALSE;
+ curl_setopt($ch, CURLOPT_URL, 'https://freedns.afraid.org/dynamic/update.php?' . $this->_dnsPass);
+ break;
+ case 'dnsexit':
+ $needsIP = TRUE;
+ curl_setopt($ch, CURLOPT_URL, 'https://www.dnsexit.com/RemoteUpdate.sv?login='.$this->_dnsUser. '&password='.$this->_dnsPass.'&host='.$this->_dnsHost.'&myip='.$this->_dnsIP);
+ break;
+ case 'loopia':
+ $needsIP = TRUE;
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ curl_setopt($ch, CURLOPT_URL, 'https://dns.loopia.se/XDynDNSServer/XDynDNS.php?hostname='.$this->_dnsHost.'&myip='.$this->_dnsIP);
+ break;
+ case 'opendns':
+ $needsIP = FALSE;
+ if (isset($this->_dnsWildcard) && $this->_dnsWildcard != "OFF") $this->_dnsWildcard = "ON";
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ $server = "https://updates.opendns.com/nic/update?hostname=". $this->_dnsHost;
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server .$port);
+ break;
+
+ case 'staticcling':
+ $needsIP = FALSE;
+ curl_setopt($ch, CURLOPT_URL, 'https://www.staticcling.org/update.html?login='.$this->_dnsUser.'&pass='.$this->_dnsPass);
+ break;
+ case 'dnsomatic':
+ /* Example syntax
+ https://username:password@updates.dnsomatic.com/nic/update?hostname=yourhostname&myip=ipaddress&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG
+ */
+ $needsIP = FALSE;
+ if ($this->_dnsVerboseLog) {
+ log_error("DNS-O-Matic: DNS update() starting.");
+ }
+ if (isset($this->_dnsWildcard) && $this->_dnsWildcard != "OFF") {
+ $this->_dnsWildcard = "ON";
+ }
+ /*
+ Reference: https://www.dnsomatic.com/wiki/api
+ DNS-O-Matic usernames are 3-25 characters.
+ DNS-O-Matic passwords are 6-20 characters.
+ All ASCII letters and numbers accepted.
+ Dots, dashes, and underscores allowed, but not at the beginning or end of the string.
+ Required: "rawurlencode" http://www.php.net/manual/en/function.rawurlencode.php
+ Encodes the given string according to RFC 3986.
+ */
+ $server = "https://" . rawurlencode($this->_dnsUser) . ":" . rawurlencode($this->_dnsPass) . "@updates.dnsomatic.com/nic/update?hostname=";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server . $this->_dnsHost . '&myip=' . $this->_dnsIP . '&wildcard='.$this->_dnsWildcard . '&mx=' . $this->_dnsMX . '&backmx=NOCHG');
+ break;
+ case 'namecheap':
+ /* Example:
+ https://dynamicdns.park-your-domain.com/update?host=[host_name]&domain=[domain.com]&password=[domain_password]&ip=[your_ip]
+ */
+ $needsIP = FALSE;
+ if ($this->_dnsVerboseLog) {
+ log_error("Namecheap ({$this->_dnsHost}): DNS update() starting.");
+ }
+ $dparts = explode(".", trim($this->_dnsHost));
+ $domain_part_count = ($dparts[count($dparts)-1] == "uk") ? 3 : 2;
+ $domain_offset = count($dparts) - $domain_part_count;
+ $hostname = implode(".", array_slice($dparts, 0, $domain_offset));
+ $domain = implode(".", array_slice($dparts, $domain_offset));
+ $dnspass = trim($this->_dnsPass);
+ $server = "https://dynamicdns.park-your-domain.com/update?host={$hostname}&domain={$domain}&password={$dnspass}&ip={$this->_dnsIP}";
+ curl_setopt($ch, CURLOPT_URL, $server);
+ break;
+ case 'he-net':
+ case 'he-net-v6':
+ $needsIP = FALSE;
+ if ($this->_dnsVerboseLog) {
+ log_error("HE.net ({$this->_dnsHost}): DNS update() starting.");
+ }
+ $server = "https://dyn.dns.he.net/nic/update?";
+ curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+ curl_setopt($ch, CURLOPT_URL, $server . 'hostname=' . $this->_dnsHost . '&password=' . $this->_dnsPass . '&myip=' . $this->_dnsIP);
+ break;
+ case 'he-net-tunnelbroker':
+ $needsIP = FALSE;
+ if ($this->_dnsVerboseLog) {
+ log_error("HE.net Tunnelbroker: DNS update() starting.");
+ }
+ $server = "https://ipv4.tunnelbroker.net/ipv4_end.php?";
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser . ':' . $this->_dnsPass);
+ curl_setopt($ch, CURLOPT_URL, $server . 'tid=' . $this->_dnsHost);
+ break;
+ case 'selfhost':
+ $needsIP = FALSE;
+ if ($this->_dnsVerboseLog) {
+ log_error("SelfHost: DNS update() starting.");
+ }
+ if (isset($this->_dnsWildcard) && $this->_dnsWildcard != "OFF") {
+ $this->_dnsWildcard = "ON";
+ }
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ $server = "https://carol.selfhost.de/nic/update";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server .$port . '?system=dyndns&hostname=' . $this->_dnsHost . '&myip=' . $this->_dnsIP . '&wildcard='.$this->_dnsWildcard . '&mx=' . $this->_dnsMX . '&backmx=NO');
+ break;
+ case 'route53':
+ if ($this->_dnsVerboseLog) {
+ log_error("Route53 ({$this->_dnsHost}): DNS update() starting.");
+ }
+
+ /* Setting Variables */
+ $hostname = "{$this->_dnsHost}.";
+ $ZoneID = $this->_dnsZoneID;
+ $AccessKeyId = $this->_dnsUser;
+ $SecretAccessKey = $this->_dnsPass;
+ $NewIP = $this->_dnsIP;
+ $NewTTL = $this->_dnsTTL;
+
+ /* Include Route 53 Library Class */
+ require_once('/etc/inc/r53.class');
+
+ /* Set Amazon AWS Credentials for this record */
+ $r53 = new Route53($AccessKeyId, $SecretAccessKey);
+
+ /* Function to find old values of records in Route 53 */
+ if (!function_exists('Searchrecords')) {
+ function SearchRecords($records, $name) {
+ $result = array();
+ foreach ($records as $record) {
+ if (strtolower($record['Name']) == strtolower($name)) {
+ $result [] = $record;
+ }
+ }
+ return ($result) ? $result : false;
+ }
+ }
+
+ $records = $r53->listResourceRecordSets("/hostedzone/$ZoneID");
+
+ /* Get IP for your hostname in Route 53 */
+ if (false !== ($a_result = SearchRecords($records['ResourceRecordSets'], "$hostname"))) {
+ $OldTTL = $a_result[0][TTL];
+ $OldIP = $a_result[0][ResourceRecords][0];
+ } else {
+ $OldIP = "";
+ }
+
+ /* Check if we need to update DNS Record */
+ if ($OldIP !== $NewIP) {
+ if (!empty($OldIP)) {
+ /* Your Hostname already exists, deleting and creating it again */
+ $changes = array();
+ $changes[] = $r53->prepareChange(DELETE, $hostname, A, $OldTTL, $OldIP);
+ $changes[] = $r53->prepareChange(CREATE, $hostname, A, $NewTTL, $NewIP);
+ $result = $r53->changeResourceRecordSets("/hostedzone/$ZoneID", $changes);
+ } else {
+ /* Your Hostname does not exist yet, creating it */
+ $changes = $r53->prepareChange(CREATE, $hostname, A, $NewTTL, $NewIP);
+ $result = $r53->changeResourceRecordSets("/hostedzone/$ZoneID", $changes);
+ }
+ }
+ $this->_checkStatus(0, $result);
+ break;
+ case 'custom':
+ case 'custom-v6':
+ if ($this->_dnsVerboseLog) {
+ log_error("Custom DDNS ({$this->_dnsHost}): DNS update() starting.");
+ }
+ if (strstr($this->dnsUpdateURL, "%IP%")) {$needsIP = TRUE;} else {$needsIP = FALSE;}
+ if ($this->_dnsUser != '') {
+ if ($this->_curlIpresolveV4) {
+ curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
+ }
+ if ($this->_curlSslVerifypeer) {
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
+ } else {
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+ }
+ curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
+ curl_setopt($ch, CURLOPT_USERPWD, "{$this->_dnsUser}:{$this->_dnsPass}");
+ }
+ $server = str_replace("%IP%", $this->_dnsIP, $this->_dnsUpdateURL);
+ if ($this->_dnsVerboseLog) {
+ log_error("Sending request to: ".$server);
+ }
+ curl_setopt($ch, CURLOPT_URL, $server);
+ break;
+ case 'cloudflare':
+ $needsIP = TRUE;
+ $dnsServer ='www.cloudflare.com';
+ $dnsHost = str_replace(' ', '', $this->_dnsHost);
+ $URL = "https://{$dnsServer}/api.html?a=DIUP&email={$this->_dnsUser}&tkn={$this->_dnsPass}&ip={$this->_dnsIP}&hosts={$dnsHost}";
+ curl_setopt($ch, CURLOPT_URL, $URL);
+ break;
+ case 'eurodns':
+ $needsIP = TRUE;
+ if ($this->_dnsVerboseLog) {
+ log_error("EuroDynDns ({$this->_dnsHost}) DNS update() starting.");
+ }
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ $server = "https://update.eurodyndns.org/update/";
+ $port = "";
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server .$port . '?hostname=' . $this->_dnsHost . '&myip=' . $this->_dnsIP);
+ break;
+ case 'gratisdns':
+ $needsIP = TRUE;
+ if ($this->_dnsVerboseLog) {
+ log_error("GratisDNS.dk ({$this->_dnsHost}): DNS update() starting.");
+ }
+ $server = "https://ssl.gratisdns.dk/ddns.phtml";
+ list($hostname, $domain) = explode(".", $this->_dnsHost, 2);
+ curl_setopt($ch, CURLOPT_URL, $server . '?u=' . $this->_dnsUser . '&p=' . $this->_dnsPass . '&h=' . $this->_dnsHost . '&d=' . $domain . '&i=' . $this->_dnsIP);
+ break;
+ case 'ovh-dynhost':
+ $needsIP = FALSE;
+ if ($this->_dnsVerboseLog) {
+ log_error("OVH DynHOST: ({$this->_dnsHost}) DNS update() starting.");
+ }
+ if (isset($this->_dnsWildcard) && $this->_dnsWildcard != "OFF") $this->_dnsWildcard = "ON";
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ $server = "https://www.ovh.com/nic/update";
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server .$port . '?system=dyndns&hostname=' . $this->_dnsHost . '&myip=' . $this->_dnsIP . '&wildcard='.$this->_dnsWildcard . '&mx=' . $this->_dnsMX . '&backmx=NO');
+ break;
+ case 'citynetwork':
+ $needsIP = TRUE;
+ if ($this->_dnsVerboseLog) {
+ log_error("City Network: ({$this->_dnsHost}) DNS update() starting.");
+ }
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ $server = 'https://dyndns.citynetwork.se/nic/update';
+ $port = "";
+ if ($this->_dnsServer) {
+ $server = $this->_dnsServer;
+ }
+ if ($this->_dnsPort) {
+ $port = ":" . $this->_dnsPort;
+ }
+ curl_setopt($ch, CURLOPT_URL, $server .$port . '?hostname=' . $this->_dnsHost . '&myip=' . $this->_dnsIP);
+ break;
+ case 'dnsimple':
+ /* Uses DNSimple's REST API
+ Requires username and Account API token passed in header
+ Piggybacks on Route 53's ZoneID field for DNSimple record ID
+ Data sent as JSON */
+ $needsIP = TRUE;
+ $server = 'https://api.dnsimple.com/v1/domains/';
+ $token = $this->_dnsUser . ':' . $this->_dnsPass;
+ $jsondata = '{"record":{"content":"' . $this->_dnsIP . '","ttl":"' . $this->_dnsTTL . '"}}';
+ curl_setopt($ch, CURLOPT_HEADER, 1);
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Content-Type: application/json', 'X-DNSimple-Token: ' . $token));
+ curl_setopt($ch, CURLOPT_URL, $server . $this->_dnsHost . '/records/' . $this->_dnsZoneID);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $jsondata);
+ break;
+ case 'googledomains':
+ $needsIP = FALSE;
+ if ($this->_dnsVerboseLog) {
+ log_error("Google Domains: ({$this->_dnsHost}) DNS update() starting.");
+ }
+ $post_data['username:password'] = $this->_dnsUser . ':' . $this->_dnsPass;
+ $post_data['hostname'] = $this->_dnsHost;
+ $post_data['myip'] = $this->_dnsIP;
+ $post_data['offline'] = 'no';
+ $server = "https://domains.google.com/nic/update";
+ $port = "";
+ curl_setopt($ch, CURLOPT_URL, 'https://domains.google.com/nic/update');
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_dnsUser.':'.$this->_dnsPass);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
+ break;
+ case 'dnsmadeeasy':
+ $needsIP = TRUE;
+ if ($this->_dnsVerboseLog) {
+ log_error("DNS Made Easy ({$this->_dnsHost}): DNS update() starting.");
+ }
+ $server = "https://cp.dnsmadeeasy.com/servlet/updateip";
+ curl_setopt($ch, CURLOPT_URL, $server . '?username=' . $this->_dnsUser . '&password=' . $this->_dnsPass . '&id=' . $this->_dnsHost . '&ip=' . $this->_dnsIP);
+ break;
+ default:
+ break;
+ }
+ if ($this->_dnsService != 'ods' and $this->_dnsService != 'route53') {
+ $data = curl_exec($ch);
+ $this->_checkStatus($ch, $data);
+ @curl_close($ch);
+ }
+ }
+
+ /*
+ * Private Function (added 12 July 2005) [beta]
+ * Retrieve Update Status
+ */
+ function _checkStatus($ch, $data) {
+ if ($this->_dnsVerboseLog) {
+ log_error("DynDNS ({$this->_dnsHost}): DynDns _checkStatus() starting.");
+ log_error("DynDNS ({$this->_dnsHost}): Current Service: {$this->_dnsService}");
+ }
+ $successful_update = false;
+ if ($this->_dnsService != 'ods' and $this->_dnsService != 'route53' && @curl_error($ch)) {
+ $status = "Curl error occurred: " . curl_error($ch);
+ log_error($status);
+ $this->status = $status;
+ return;
+ }
+ switch ($this->_dnsService) {
+ case 'glesys':
+ if (preg_match('/Record updated/i', $data)) {
+ $status = "GleSYS ({$this->_dnsHost}): (Success) IP Address Changed Successfully! (" . $this->_dnsIP . ")";
+ $successful_update = true;
+ } else {
+ $status = "GleSYS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("GleSYS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'dnsomatic':
+ if (preg_match('/badauth/i', $data)) {
+ $status = "DNS-O-Matic ({$this->_dnsHost}): The DNS-O-Matic username or password specified are incorrect. No updates will be distributed to services until this is resolved.";
+ } else if (preg_match('/notfqdn /i', $data)) {
+ $status = "DNS-O-Matic ({$this->_dnsHost}): The hostname specified is not a fully-qualified domain name. If no hostnames included, notfqdn will be returned once.";
+ } else if (preg_match('/nohost/i', $data)) {
+ $status = "DNS-O-Matic ({$this->_dnsHost}): The hostname passed could not be matched to any services configured. The service field will be blank in the return code.";
+ } else if (preg_match('/numhost/i', $data)) {
+ $status = "DNS-O-Matic ({$this->_dnsHost}): You may update up to 20 hosts. numhost is returned if you try to update more than 20 or update a round-robin.";
+ } else if (preg_match('/abuse/i', $data)) {
+ $status = "DNS-O-Matic ({$this->_dnsHost}): The hostname is blocked for update abuse.";
+ } else if (preg_match('/good/i', $data)) {
+ $status = "DNS-O-Matic ({$this->_dnsHost}): (Success) IP Address Changed Successfully! (" . $this->_dnsIP . ")";
+ $successful_update = true;
+ } else if (preg_match('/dnserr/i', $data)) {
+ $status = "DNS-O-Matic ({$this->_dnsHost}): DNS error encountered. Stop updating for 30 minutes.";
+ } else {
+ $status = "DNS-O-Matic ({$this->_dnsHost}): (Unknown Response)";
+ log_error("DNS-O-Matic ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'citynetwork':
+ if (preg_match('/notfqdn/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Not A FQDN!";
+ } else if (preg_match('/nohost/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) No such host";
+ } else if (preg_match('/nochg/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match('/good/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Changed Successfully! (" . $this->_dnsIP . ")";
+ $successful_update = true;
+ } else if (preg_match('/badauth/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) User Authorization Failed";
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'ovh-dynhost':
+ case 'dyndns':
+ if (preg_match('/notfqdn/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Not A FQDN!";
+ } else if (preg_match('/nochg/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match('/good/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Changed Successfully! (" . $this->_dnsIP . ")";
+ $successful_update = true;
+ } else if (preg_match('/noauth/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) User Authorization Failed";
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'dyndns-static':
+ if (preg_match('/notfqdn/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Not A FQDN!";
+ } else if (preg_match('/nochg/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match('/good/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Changed Successfully!";
+ $successful_update = true;
+ } else if (preg_match('/noauth/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) User Authorization Failed";
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'dyndns-custom':
+ if (preg_match('/notfqdn/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Not A FQDN!";
+ } else if (preg_match('/nochg/i', $data)) {
+ $status = "phpDynDNS: (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match('/good/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Changed Successfully!";
+ $successful_update = true;
+ } else if (preg_match('/noauth/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) User Authorization Failed";
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'dhs':
+ break;
+ case 'noip':
+ case 'noip-free':
+ list($ip, $code) = explode(":", $data);
+ switch ($code) {
+ case 0:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP address is current, no update performed.";
+ $successful_update = true;
+ break;
+ case 1:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) DNS hostname update successful.";
+ $successful_update = true;
+ break;
+ case 2:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Hostname supplied does not exist.";
+ break;
+ case 3:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Invalid Username.";
+ break;
+ case 4:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Invalid Password.";
+ break;
+ case 5:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) To many updates sent.";
+ break;
+ case 6:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Account disabled due to violation of No-IP terms of service.";
+ break;
+ case 7:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Invalid IP. IP Address submitted is improperly formatted or is a private IP address or is on a blacklist.";
+ break;
+ case 8:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Disabled / Locked Hostname.";
+ break;
+ case 9:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Host updated is configured as a web redirect and no update was performed.";
+ break;
+ case 10:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Group supplied does not exist.";
+ break;
+ case 11:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) DNS group update is successful.";
+ $successful_update = true;
+ break;
+ case 12:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) DNS group is current, no update performed.";
+ $successful_update = true;
+ break;
+ case 13:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Update client support not available for supplied hostname or group.";
+ break;
+ case 14:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Hostname supplied does not have offline settings configured.";
+ break;
+ case 99:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Client disabled. Client should exit and not perform any more updates without user intervention.";
+ break;
+ case 100:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Client disabled. Client should exit and not perform any more updates without user intervention.";
+ break;
+ default:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ $this->_debug("Unknown Response: ".$data);
+ break;
+ }
+ break;
+ case 'easydns':
+ if (preg_match('/NOACCESS/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Authentication Failed: Username and/or Password was Incorrect.";
+ } else if (preg_match('/NOSERVICE/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) No Service: Dynamic DNS Service has been disabled for this domain.";
+ } else if (preg_match('/ILLEGAL INPUT/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Illegal Input: Self-Explanatory";
+ } else if (preg_match('/TOOSOON/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Too Soon: Not Enough Time Has Elapsed Since Last Update";
+ } else if (preg_match('/NOERROR/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Updated Successfully!";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'hn':
+ /* FIXME: add checks */
+ break;
+ case 'zoneedit':
+ if (preg_match('/799/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error 799) Update Failed!";
+ } else if (preg_match('/700/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error 700) Update Failed!";
+ } else if (preg_match('/200/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else if (preg_match('/201/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'dyns':
+ if (preg_match("/400/i", $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Bad Request - The URL was malformed. Required parameters were not provided.";
+ } else if (preg_match('/402/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Update Too Soon - You have tried updating to quickly since last change.";
+ } else if (preg_match('/403/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Database Error - There was a server-sided database error.";
+ } else if (preg_match('/405/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Hostname Error - The hostname (".$this->_dnsHost.") doesn't belong to you.";
+ } else if (preg_match('/200/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'ods':
+ if (preg_match("/299/i", $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'freedns':
+ if (preg_match("/has not changed./i", $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match("/Updated/i", $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Changed Successfully!";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'dnsexit':
+ if (preg_match("/is the same/i", $data)) {
+ $status = "phpDynDns ({$this->_dnsHost}): (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match("/Success/i", $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Changed Successfully!";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'loopia':
+ if (preg_match("/nochg/i", $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match("/good/i", $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Changed Successfully!";
+ $successful_update = true;
+ } else if (preg_match('/badauth/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) User Authorization Failed";
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'opendns':
+ if (preg_match('/badauth/i', $data)) {
+ $status = "phpDynDNS({$this->_dnsHost}): (Error) Not a valid username or password!";
+ } else if (preg_match('/nohost/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Hostname you are trying to update does not exist.";
+ $successful_update = true;
+ } else if (preg_match('/good/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Changed Successfully! (" . $this->_dnsIP . ")";
+ $successful_update = true;
+ } else if (preg_match('/yours/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) hostname specified exists, but not under the username specified.";
+ } else if (preg_match('/abuse/i', $data)) {
+ $status = "phpDynDns ({$this->_dnsHost}): (Error) Updating too frequently, considered abuse.";
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'staticcling':
+ if (preg_match("/invalid ip/i", $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Bad Request - The IP provided was invalid.";
+ } else if (preg_match('/required info missing/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Bad Request - Required parameters were not provided.";
+ } else if (preg_match('/invalid characters/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Bad Request - Illegal characters in either the username or the password.";
+ } else if (preg_match('/bad password/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Invalid password.";
+ } else if (preg_match('/account locked/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) This account has been administratively locked.";
+ } else if (preg_match('/update too frequent/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Updating too frequently.";
+ } else if (preg_match('/DB error/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Server side error.";
+ } else if (preg_match('/success/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'namecheap':
+ $tmp = str_replace("^M", "", $data);
+ $ncresponse = @xml2array($tmp);
+ if (preg_match("/internal server error/i", $data)) {
+ $status = "phpDynDNS: (Error) Server side error.";
+ } else if (preg_match("/request is badly formed/i", $data)) {
+ $status = "phpDynDNS: (Error) Badly Formed Request (check your settings).";
+ } else if ($ncresponse['interface-response']['ErrCount'] === "0") {
+ $status = "phpDynDNS: (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else if (is_numeric($ncresponse['interface-response']['ErrCount']) && ($ncresponse['interface-response']['ErrCount'] > 0)) {
+ $status = "phpDynDNS: (Error) " . implode(", ", $ncresponse["interface-response"]["errors"]);
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS: (Unknown Response)";
+ log_error("phpDynDNS: PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+
+ case 'he-net':
+ case 'he-net-v6':
+ if (preg_match("/badip/i", $data)) {
+ $status = "phpDynDNS: (Error) Bad Request - The IP provided was invalid.";
+ } else if (preg_match('/nohost/i', $data)) {
+ $status = "phpDynDNS: (Error) Bad Request - A hostname was not provided.";
+ } else if (preg_match('/badauth/i', $data)) {
+ $status = "phpDynDNS: (Error) Invalid username or password.";
+ } else if (preg_match('/good/i', $data)) {
+ $status = "phpDynDNS: (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else if (preg_match('/nochg/i', $data)) {
+ $status = "phpDynDNS: (Success) No Change In IP Address.";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS: (Unknown Response)";
+ log_error("phpDynDNS: PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'he-net-tunnelbroker':
+ /*
+ -ERROR: Missing parameter(s).
+ -ERROR: Invalid API key or password
+ -ERROR: Tunnel not found
+ -ERROR: Another tunnel exists for this IP.
+ -ERROR: This tunnel is already associated with this IP address
+ +OK: Tunnel endpoint updated to: x.x.x.x
+ */
+ if (preg_match("/Missing parameter/i", $data)) {
+ $status = "phpDynDNS: (Error) Bad Request - Missing/Invalid Parameters.";
+ } else if (preg_match('/Tunnel not found/i', $data)) {
+ $status = "phpDynDNS: (Error) Bad Request - Invalid Tunnel ID.";
+ } else if (preg_match('/Invalid API key or password/i', $data)) {
+ $status = "phpDynDNS: (Error) Invalid username or password.";
+ } else if (preg_match('/OK:/i', $data)) {
+ $status = "phpDynDNS: (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else if (preg_match('/This tunnel is already associated with this IP address/i', $data)) {
+ $status = "phpDynDNS: (Success) No Change In IP Address.";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS: (Unknown Response)";
+ log_error("phpDynDNS: PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'selfhost':
+ if (preg_match('/notfqdn/i', $data)) {
+ $status = "phpDynDNS: (Error) Not A FQDN!";
+ } else if (preg_match('/nochg/i', $data)) {
+ $status = "phpDynDNS: (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match('/good/i', $data)) {
+ $status = "phpDynDNS: (Success) IP Address Changed Successfully! (" . $this->_dnsIP . ")";
+ $successful_update = true;
+ } else if (preg_match('/noauth/i', $data)) {
+ $status = "phpDynDNS: (Error) User Authorization Failed";
+ } else {
+ $status = "phpDynDNS: (Unknown Response)";
+ log_error("phpDynDNS: PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'route53':
+ $successful_update = true;
+ break;
+ case 'custom':
+ case 'custom-v6':
+ $successful_update = false;
+ if ($this->_dnsResultMatch == "") {
+ $successful_update = true;
+ } else {
+ $this->_dnsResultMatch = str_replace("%IP%", $this->_dnsIP, $this->_dnsResultMatch);
+ $matches = preg_split("/(?<!\\\\)\\|/", $this->_dnsResultMatch);
+ foreach ($matches as $match) {
+ $match= str_replace("\\|", "|", $match);
+ if (strcmp($match, trim($data, "\t\n\r")) == 0) {
+ $successful_update = true;
+ }
+ }
+ unset ($matches);
+ }
+ if ($successful_update == true) {
+ $status = "phpDynDNS: (Success) IP Address Updated Successfully!";
+ } else {
+ $status = "phpDynDNS: (Error) Result did not match.";
+ }
+ break;
+ case 'cloudflare':
+ // receive multiple results
+ $data = explode("\n", $data);
+ $lines = count($data)-1;
+
+ // loop over the lines
+ for ($pos = 0; ($successful_update || $pos == 0) && $pos < $lines; $pos++) {
+ $resp = $data[$pos];
+ if (preg_match('/UAUTH/i', $resp)) {
+ $status = "DynDNS: The username specified is not authorized to update this hostname and domain.";
+ } else if (preg_match('/NOHOST/i', $resp)) {
+ $status = "DynDNS: No valid FQDN (fully qualified domain name) was specified";
+ } else if (preg_match('/INVLDHST/i', $resp)) {
+ $status = "DynDNS: An invalid hostname was specified. This may be due to the fact the hostname has not been created in the system. Creating new host names via clients is not supported.";
+ } else if (preg_match('/INVLDIP/i', $resp)) {
+ $status = "DynDNS: The IP address given is not valid.";
+ } else if (preg_match('/DUPHST/i', $resp)) {
+ $status = "DynDNS: Duplicate values exist for a record. Only single values for records are supported currently.";
+ } else if (preg_match('/NOUPDATE/i', $resp)) {
+ $status = "DynDNS: No changes made to the hostname (" . strtok($resp, ' ') . "). Continual updates with no changes lead to blocked clients.";
+ $successful_update = true; //success if it is the same so that it saves
+ } else if (preg_match('/OK/i', $resp)) {
+ $status = "DynDNS: (Success) (" . strtok($resp, ' ') . ") IP Address for Changed Successfully!";
+ $successful_update = true;
+ } else {
+ $status = "DynDNS: (Unknown Response)";
+ log_error("DynDNS: PAYLOAD: {$resp}");
+ $this->_debug($resp);
+ }
+ log_error($status);
+ }
+ break;
+ case 'eurodns':
+ if (preg_match('/notfqdn/i', $data)) {
+ $status = "phpDynDNS: (Error) Not A FQDN!";
+ } else if (preg_match('/nochg/i', $data)) {
+ $status = "phpDynDNS: (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match('/good/i', $data)) {
+ $status = "phpDynDNS: (Success) IP Address Changed Successfully! (" . $this->_dnsIP . ")";
+ $successful_update = true;
+ } else if (preg_match('/badauth/i', $data)) {
+ $status = "phpDynDNS: (Error) User Authorization Failed";
+ } else {
+ $status = "phpDynDNS: (Unknown Response)";
+ log_error("phpDynDNS: PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'gratisdns':
+ if (preg_match('/Forkerte værdier/i', $data)) {
+ $status = "phpDynDNS: (Error) Wrong values - Update could not be completed.";
+ } else if (preg_match('/Bruger login: Bruger eksistere ikke/i', $data)) {
+ $status = "phpDynDNS: (Error) Unknown username - User does not exist.";
+ } else if (preg_match('/Bruger login: 1Fejl i kodeord/i', $data)) {
+ $status = "phpDynDNS: (Error) Wrong password - Remember password is case sensitive.";
+ } else if (preg_match('/Domæne kan IKKE administreres af bruger/i', $data)) {
+ $status = "phpDynDNS: (Error) User unable to administer the selected domain.";
+ } else if (preg_match('/OK/i', $data)) {
+ $status = "phpDynDNS: (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else {
+ $status = "phpDynDNS: (Unknown Response)";
+ log_error("phpDynDNS: PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'dnsimple':
+ /* Responds with HTTP 200 on success.
+ Responds with HTTP 4xx on error.
+ Returns JSON data as body */
+ $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
+ $header = substr($data, 0, $header_size);
+ $body = substr($data, $header_size);
+ if (preg_match("/Status: 200\s/i", $header)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Updated Successfully!";
+ $successful_update = true;
+ } else if (preg_match("/Status: 4\d\d\s/i", $header)) {
+ $arrbody = json_decode($body, true);
+ $message = $arrbody['message'] . ".";
+ if (isset($arrbody['errors']['content'])) {
+ foreach ($arrbody['errors']['content'] as $key => $content) {
+ $message .= " " . $content . ".";
+ }
+ }
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) " . $message;
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$body}");
+ $this->_debug($body);
+ }
+ break;
+ case 'googledomains':
+ if (preg_match('/notfqdn/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Not A FQDN";
+ } else if (preg_match('/nochg/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) No Change In IP Address";
+ $successful_update = true;
+ } else if (preg_match('/good/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Success) IP Address Changed Successfully! (" . $this->_dnsIP . ")";
+ $successful_update = true;
+ } else if (preg_match('/badauth/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) User Authorization Failed";
+ } else if (preg_match('/nohost/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Hostname does not exist or DynDNS not enabled";
+ } else if (preg_match('/badagent/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Bad request";
+ } else if (preg_match('/abuse/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Dynamic DNS access has been blocked!";
+ } else if (preg_match('/911/i', $data)) {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Error on Google's end, retry in 5 minutes";
+ } else {
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ }
+ break;
+ case 'dnsmadeeasy':
+ switch ($data) {
+ case 'success':
+ $status = "phpDynDNS({$this->_dnsHost}): (Success) IP Address Changed Successfully! (" . $this->_dnsIP . ")";
+ $successful_update = true;
+ break;
+ case 'error-auth':
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Invalid username or password";
+ break;
+ case 'error-auth-suspend':
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Account suspended";
+ break;
+ case 'error-auth-voided':
+ $status = "phpDynDNS ({$this->_dnsHost}): (Error) Account revoked";
+ break;
+ case 'error-record-invalid':
+ $status = "phpDynDns ({$this->_dnsHost}): (Error) Record does not exist in the system. Unable to update record";
+ break;
+ case 'error-record-auth':
+ $status = "phpDynDns ({$this->_dnsHost}): (Error) User does not have access to this record";
+ break;
+ case 'error-record-ip-same':
+ $status = "phpDynDns ({$this->_dnsHost}): (Success) No change in IP Address";
+ $successful_update = true;
+ break;
+ case 'error-system':
+ $status = "phpDynDns ({$this->_dnsHost}): (Error) General system error recognized by the system";
+ break;
+ case 'error':
+ $status = "phpDynDns ({$this->_dnsHost}): (Error) General system error unrecognized by the system";
+ break;
+ default:
+ $status = "phpDynDNS ({$this->_dnsHost}): (Unknown Response)";
+ log_error("phpDynDNS ({$this->_dnsHost}): PAYLOAD: {$data}");
+ $this->_debug($data);
+ break;
+ }
+ break;
+ }
+
+ if ($successful_update == true) {
+ /* Write WAN IP to cache file */
+ $wan_ip = $this->_checkIP();
+ conf_mount_rw();
+ if ($this->_useIPv6 == false && $wan_ip > 0) {
+ $currentTime = time();
+ notify_all_remote(sprintf(gettext("DynDNS updated IP Address on %s (%s) to %s"), convert_real_interface_to_friendly_descr($this->_if), $this->_if, $wan_ip));
+ log_error("phpDynDNS: updating cache file {$this->_cacheFile}: {$wan_ip}");
+ @file_put_contents($this->_cacheFile, "{$wan_ip}:{$currentTime}");
+ } else {
+ @unlink($this->_cacheFile);
+ }
+ if ($this->_useIPv6 == true && $wan_ip > 0) {
+ $currentTime = time();
+ notify_all_remote(sprintf(gettext("DynDNS updated IPv6 Address on %s (%s) to %s"), convert_real_interface_to_friendly_descr($this->_if), $this->_if, $wan_ip));
+ log_error("phpDynDNS: updating cache file {$this->_cacheFile_v6}: {$wan_ip}");
+ @file_put_contents($this->_cacheFile_v6, "{$wan_ip}|{$currentTime}");
+ } else {
+ @unlink($this->_cacheFile_v6);
+ }
+ conf_mount_ro();
+ }
+ $this->status = $status;
+ log_error($status);
+ }
+
+ /*
+ * Private Function (added 12 July 05) [beta]
+ * Return Error, Set Last Error, and Die.
+ */
+ function _error($errorNumber = '1') {
+ switch ($errorNumber) {
+ case 0:
+ break;
+ case 2:
+ $error = 'phpDynDNS: (ERROR!) No Dynamic DNS Service provider was selected.';
+ break;
+ case 3:
+ $error = 'phpDynDNS: (ERROR!) No Username Provided.';
+ break;
+ case 4:
+ $error = 'phpDynDNS: (ERROR!) No Password Provided.';
+ break;
+ case 5:
+ $error = 'phpDynDNS: (ERROR!) No Hostname Provided.';
+ break;
+ case 6:
+ $error = 'phpDynDNS: (ERROR!) The Dynamic DNS Service provided is not yet supported.';
+ break;
+ case 7:
+ $error = 'phpDynDNS: (ERROR!) No Update URL Provided.';
+ break;
+ case 8:
+ $status = "Route 53: (Error) Invalid ZoneID";
+ break;
+ case 9:
+ $status = "Route 53: (Error) Invalid TTL";
+ break;
+ case 10:
+ $error = "phpDynDNS ({$this->_dnsHost}): No change in my IP address and/or " . $this->_dnsMaxCacheAgeDays . " days has not passed. Not updating dynamic DNS entry.";
+ break;
+ default:
+ $error = "phpDynDNS: (ERROR!) Unknown Response.";
+ /* FIXME: $data isn't in scope here */
+ /* $this->_debug($data); */
+ break;
+ }
+ $this->lastError = $error;
+ log_error($error);
+ }
+
+ /*
+ * Private Function (added 12 July 05) [beta]
+ * - Detect whether or not IP needs to be updated.
+ * | Written Specifically for pfSense (https://www.pfsense.org) may
+ * | work with other systems. pfSense base is FreeBSD.
+ */
+ function _detectChange() {
+ global $debug;
+
+ if ($debug) {
+ log_error("DynDns ({$this->_dnsHost}): _detectChange() starting.");
+ }
+
+ $currentTime = time();
+
+ $wan_ip = $this->_checkIP();
+ if ($wan_ip == 0) {
+ log_error("DynDns ({$this->_dnsHost}): Current WAN IP could not be determined, skipping update process.");
+ return false;
+ }
+ $log_error = "DynDns ({$this->_dnsHost}): Current WAN IP: {$wan_ip} ";
+
+ if ($this->_useIPv6 == true) {
+ if (file_exists($this->_cacheFile_v6)) {
+ $contents = file_get_contents($this->_cacheFile_v6);
+ list($cacheIP, $cacheTime) = explode('|', $contents);
+ $this->_debug($cacheIP.'/'.$cacheTime);
+ $initial = false;
+ $log_error .= "Cached IPv6: {$cacheIP} ";
+ } else {
+ conf_mount_rw();
+ $cacheIP = '::';
+ @file_put_contents($this->_cacheFile, "::|{$currentTime}");
+ conf_mount_ro();
+ $cacheTime = $currentTime;
+ $initial = true;
+ $log_error .= "No Cached IPv6 found.";
+ }
+ } else {
+ if (file_exists($this->_cacheFile)) {
+ $contents = file_get_contents($this->_cacheFile);
+ list($cacheIP, $cacheTime) = explode(':', $contents);
+ $this->_debug($cacheIP.'/'.$cacheTime);
+ $initial = false;
+ $log_error .= "Cached IP: {$cacheIP} ";
+ } else {
+ conf_mount_rw();
+ $cacheIP = '0.0.0.0';
+ @file_put_contents($this->_cacheFile, "0.0.0.0:{$currentTime}");
+ conf_mount_ro();
+ $cacheTime = $currentTime;
+ $initial = true;
+ $log_error .= "No Cached IP found.";
+ }
+ }
+ if ($this->_dnsVerboseLog) {
+ log_error($log_error);
+ }
+
+ // Convert seconds = days * hr/day * min/hr * sec/min
+ $maxCacheAgeSecs = $this->_dnsMaxCacheAgeDays * 24 * 60 * 60;
+
+ $needs_updating = FALSE;
+ /* lets determine if the item needs updating */
+ if ($cacheIP != $wan_ip) {
+ $needs_updating = true;
+ $update_reason = "DynDns: cacheIP != wan_ip. Updating. ";
+ $update_reason .= "Cached IP: {$cacheIP} WAN IP: {$wan_ip} ";
+ }
+ if (($currentTime - $cacheTime) > $maxCacheAgeSecs) {
+ $needs_updating = true;
+ $this->_forceUpdateNeeded = true;
+ $update_reason = "DynDns: More than " . $this->_dnsMaxCacheAgeDays . " days. Updating. ";
+ $update_reason .= "{$currentTime} - {$cacheTime} > {$maxCacheAgeSecs} ";
+ }
+ if ($initial == true) {
+ $needs_updating = true;
+ $update_reason .= "Initial update. ";
+ }
+
+ /* finally if we need updating then store the
+ * new cache value and return true
+ */
+ if ($needs_updating == true) {
+ if ($this->_dnsVerboseLog) {
+ log_error("DynDns ({$this->_dnsHost}): {$update_reason}");
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ /*
+ * Private Function (added 16 July 05) [beta]
+ * - Writes debug information to a file.
+ * - This function is only called when a unknown response
+ * - status is returned from a DynDNS service provider.
+ */
+ function _debug($data) {
+ global $g;
+
+ if (!$g['debug']) {
+ return;
+ }
+ $string = date('m-d-y h:i:s').' - ('.$this->_debugID.') - ['.$this->_dnsService.'] - '.$data."\n";
+ conf_mount_rw();
+ $file = fopen($this->_debugFile, 'a');
+ fwrite($file, $string);
+ fclose($file);
+ conf_mount_ro();
+ }
+ function _checkIP() {
+ global $debug;
+
+ if ($debug) {
+ log_error("DynDns ({$this->_dnsHost}): _checkIP() starting.");
+ }
+
+ if ($this->_useIPv6 == true) {
+ $ip_address = find_interface_ipv6($this->_if);
+ if (!is_ipaddrv6($ip_address)) {
+ return 0;
+ }
+ } else {
+ $ip_address = find_interface_ip($this->_if);
+ if (!is_ipaddr($ip_address)) {
+ return 0;
+ }
+ }
+ if ($this->_useIPv6 == false && is_private_ip($ip_address)) {
+ $hosttocheck = "checkip.dyndns.org";
+ $try = 0;
+ while ($try < 3) {
+ $checkip = gethostbyname($hosttocheck);
+ if (is_ipaddr($checkip)) {
+ break;
+ }
+ $try++;
+ }
+ if ($try >= 3) {
+ log_error("Dyndns debug information ({$this->_dnsHost}): Could not resolve {$hosttocheck} to IP using interface IP {$ip_address}.");
+ return 0;
+ }
+ $ip_ch = curl_init("http://{$checkip}");
+ curl_setopt($ip_ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ip_ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+ curl_setopt($ip_ch, CURLOPT_INTERFACE, 'host!' . $ip_address);
+ curl_setopt($ip_ch, CURLOPT_CONNECTTIMEOUT, '30');
+ curl_setopt($ip_ch, CURLOPT_TIMEOUT, 120);
+ if ($this->_useIPv6 == false) {
+ curl_setopt($ip_ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
+ }
+ $ip_result_page = curl_exec($ip_ch);
+ curl_close($ip_ch);
+ $ip_result_decoded = urldecode($ip_result_page);
+ preg_match('/Current IP Address: (.*)<\/body>/', $ip_result_decoded, $matches);
+ $ip_address = trim($matches[1]);
+ if (is_ipaddr($ip_address)) {
+ if ($this->_dnsVerboseLog) {
+ log_error("DynDns ({$this->_dnsHost}): {$ip_address} extracted from {$hosttocheck}");
+ }
+ } else {
+ log_error("DynDns ({$this->_dnsHost}): IP address could not be extracted from {$hosttocheck}");
+ return 0;
+ }
+ } else {
+ if ($this->_dnsVerboseLog) {
+ log_error("DynDns ({$this->_dnsHost}): {$ip_address} extracted from local system.");
+ }
+ }
+ $this->_dnsIP = $ip_address;
+
+ return $ip_address;
+ }
+
+ }
+
+?>
diff --git a/src/etc/inc/easyrule.inc b/src/etc/inc/easyrule.inc
new file mode 100644
index 0000000..c46e84d
--- /dev/null
+++ b/src/etc/inc/easyrule.inc
@@ -0,0 +1,495 @@
+<?php
+/*
+ easyrule.inc
+
+ Copyright (C) 2009-2010 Jim Pingle (jpingle@gmail.com)
+ Originally Sponsored By Anathematic @ pfSense Forums
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES:
+ pfSense_MODULE: filter
+*/
+
+$blockaliasname = 'EasyRuleBlockHosts';
+$protocols_with_ports = array('tcp', 'udp');
+require_once("functions.inc");
+require_once("util.inc");
+require_once("config.inc");
+
+function easyrule_find_rule_interface($int) {
+ global $config;
+ /* Borrowed from firewall_rules.php */
+ $iflist = get_configured_interface_with_descr(false, true);
+
+ if ($config['pptpd']['mode'] == "server") {
+ $iflist['pptp'] = "PPTP VPN";
+ }
+
+ if ($config['pppoe']['mode'] == "server") {
+ $iflist['pppoe'] = "PPPoE Server";
+ }
+
+ if ($config['l2tp']['mode'] == "server") {
+ $iflist['l2tp'] = "L2TP VPN";
+ }
+
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ $iflist["enc0"] = "IPSEC";
+ }
+
+ if (isset($iflist[$int])) {
+ return $int;
+ }
+
+ foreach ($iflist as $if => $ifd) {
+ if (strtolower($int) == strtolower($ifd)) {
+ return $if;
+ }
+ }
+
+ if (substr($int, 0, 4) == "ovpn") {
+ return "openvpn";
+ }
+
+ return false;
+}
+
+function easyrule_block_rule_exists($int = 'wan', $ipproto = "inet") {
+ global $blockaliasname, $config;
+ /* No rules, we we know it doesn't exist */
+ if (!is_array($config['filter']['rule'])) {
+ return false;
+ }
+
+ /* Search through the rules for one referencing our alias */
+ foreach ($config['filter']['rule'] as $rule) {
+ if (!is_array($rule) || !is_array($rule['source'])) {
+ continue;
+ }
+ $checkproto = isset($rule['ipprotocol']) ? $rule['ipprotocol'] : "inet";
+ if ($rule['source']['address'] == $blockaliasname . strtoupper($int) && ($rule['interface'] == $int) && ($checkproto == $ipproto)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function easyrule_block_rule_create($int = 'wan', $ipproto = "inet") {
+ global $blockaliasname, $config;
+ /* If the alias doesn't exist, exit.
+ * Can't create an empty alias, and we don't know a host */
+ if (easyrule_block_alias_getid($int) === false) {
+ return false;
+ }
+
+ /* If the rule already exists, no need to do it again */
+ if (easyrule_block_rule_exists($int, $ipproto)) {
+ return true;
+ }
+
+ /* No rules, start a new array */
+ if (!is_array($config['filter']['rule'])) {
+ $config['filter']['rule'] = array();
+ }
+
+ filter_rules_sort();
+ $a_filter = &$config['filter']['rule'];
+
+ /* Make up a new rule */
+ $filterent = array();
+ $filterent['type'] = 'block';
+ $filterent['interface'] = $int;
+ $filterent['ipprotocol'] = $ipproto;
+ $filterent['source']['address'] = $blockaliasname . strtoupper($int);
+ $filterent['destination']['any'] = '';
+ $filterent['descr'] = gettext("Easy Rule: Blocked from Firewall Log View");
+ $filterent['created'] = make_config_revision_entry(null, gettext("Easy Rule"));
+
+ array_splice($a_filter, 0, 0, array($filterent));
+
+ return true;
+}
+
+function easyrule_block_alias_getid($int = 'wan') {
+ global $blockaliasname, $config;
+ if (!is_array($config['aliases'])) {
+ return false;
+ }
+
+ /* Hunt down an alias with the name we want, return its id */
+ foreach ($config['aliases']['alias'] as $aliasid => $alias) {
+ if ($alias['name'] == $blockaliasname . strtoupper($int)) {
+ return $aliasid;
+ }
+ }
+
+ return false;
+}
+
+function easyrule_block_alias_add($host, $int = 'wan') {
+ global $blockaliasname, $config;
+ /* If the host isn't a valid IP address, bail */
+ $host = trim($host, "[]");
+ if (!is_ipaddr($host) && !is_subnet($host)) {
+ return false;
+ }
+
+ /* If there are no aliases, start an array */
+ if (!is_array($config['aliases']['alias'])) {
+ $config['aliases']['alias'] = array();
+ }
+
+ $a_aliases = &$config['aliases']['alias'];
+
+ /* Try to get the ID if the alias already exists */
+ $id = easyrule_block_alias_getid($int);
+ if ($id === false) {
+ unset($id);
+ }
+
+ $alias = array();
+
+ if (is_subnet($host)) {
+ list($host, $mask) = explode("/", $host);
+ } elseif (is_specialnet($host)) {
+ $mask = 0;
+ } elseif (is_ipaddrv6($host)) {
+ $mask = 128;
+ } else {
+ $mask = 32;
+ }
+
+ if (isset($id) && $a_aliases[$id]) {
+
+ // Catch case when the list is empty
+ if (empty($a_aliases[$id]['address'])) {
+ $a_address = array();
+ $a_detail = array();
+ } else {
+ $a_address = explode(" ", $a_aliases[$id]['address']);
+
+ /* Make sure this IP isn't already in the list. */
+ if (in_array($host.'/'.$mask, $a_address)) {
+ return true;
+ }
+ $a_detail = explode("||", $a_aliases[$id]['detail']);
+ }
+
+ /* Since the alias already exists, just add to it. */
+ $alias['name'] = $a_aliases[$id]['name'];
+ $alias['type'] = $a_aliases[$id]['type'];
+ $alias['descr'] = $a_aliases[$id]['descr'];
+
+ $a_address[] = $host.'/'.$mask;
+ $a_detail[] = gettext('Entry added') . ' ' . date('r');
+
+ $alias['address'] = join(" ", $a_address);
+ $alias['detail'] = join("||", $a_detail);
+
+ } else {
+ /* Create a new alias with all the proper information */
+ $alias['name'] = $blockaliasname . strtoupper($int);
+ $alias['type'] = 'network';
+ $alias['descr'] = gettext("Hosts blocked from Firewall Log view");
+
+ $alias['address'] = $host . '/' . $mask;
+ $alias['detail'] = gettext('Entry added') . ' ' . date('r') . '||';
+ }
+
+ /* Replace the old alias if needed, otherwise tack it on the end */
+ if (isset($id) && $a_aliases[$id]) {
+ $a_aliases[$id] = $alias;
+ } else {
+ $a_aliases[] = $alias;
+ }
+
+ // Sort list
+ $a_aliases = msort($a_aliases, "name");
+
+ return true;
+}
+
+function easyrule_block_host_add($host, $int = 'wan', $ipproto = "inet") {
+ global $retval;
+ /* Bail if the supplied host is not a valid IP address */
+ $host = trim($host, "[]");
+ if (!is_ipaddr($host) && !is_subnet($host)) {
+ return false;
+ }
+
+ /* Flag whether or not we need to reload the filter */
+ $dirty = false;
+
+ /* Attempt to add this host to the alias */
+ if (easyrule_block_alias_add($host, $int)) {
+ $dirty = true;
+ } else {
+ /* Couldn't add the alias, or adding the host failed. */
+ return false;
+ }
+
+ /* Attempt to add the firewall rule if it doesn't exist.
+ * Failing to add the rule isn't necessarily an error, it may
+ * have been modified by the user in some way. Adding to the
+ * Alias is what's important.
+ */
+ if (!easyrule_block_rule_exists($int, $ipproto)) {
+ if (easyrule_block_rule_create($int, $ipproto)) {
+ $dirty = true;
+ } else {
+ return false;
+ }
+ }
+
+ /* If needed, write the config and reload the filter */
+ if ($dirty) {
+ write_config();
+ $retval = filter_configure();
+ if (!empty($_SERVER['DOCUMENT_ROOT'])) {
+ header("Location: firewall_aliases.php");
+ exit;
+ } else {
+ return true;
+ }
+ } else {
+ return false;
+ }
+}
+
+function easyrule_pass_rule_add($int, $proto, $srchost, $dsthost, $dstport, $ipproto) {
+ global $config;
+
+ /* No rules, start a new array */
+ if (!is_array($config['filter']['rule'])) {
+ $config['filter']['rule'] = array();
+ }
+
+ filter_rules_sort();
+ $a_filter = &$config['filter']['rule'];
+
+ /* Make up a new rule */
+ $filterent = array();
+ $filterent['type'] = 'pass';
+ $filterent['interface'] = $int;
+ $filterent['ipprotocol'] = $ipproto;
+ $filterent['descr'] = gettext("Easy Rule: Passed from Firewall Log View");
+
+ if ($proto != "any") {
+ $filterent['protocol'] = $proto;
+ } else {
+ unset($filterent['protocol']);
+ }
+
+ /* Default to only allow echo requests, since that's what most people want and
+ * it should be a safe choice. */
+ if ($proto == "icmp") {
+ $filterent['icmptype'] = 'echoreq';
+ }
+
+ if ((strtolower($proto) == "icmp6") || (strtolower($proto) == "icmpv6")) {
+ $filterent['protocol'] = "icmp";
+ }
+
+ if (is_subnet($srchost)) {
+ list($srchost, $srcmask) = explode("/", $srchost);
+ } elseif (is_specialnet($srchost)) {
+ $srcmask = 0;
+ } elseif (is_ipaddrv6($srchost)) {
+ $srcmask = 128;
+ } else {
+ $srcmask = 32;
+ }
+
+ if (is_subnet($dsthost)) {
+ list($dsthost, $dstmask) = explode("/", $dsthost);
+ } elseif (is_specialnet($dsthost)) {
+ $dstmask = 0;
+ } elseif (is_ipaddrv6($dsthost)) {
+ $dstmask = 128;
+ } else {
+ $dstmask = 32;
+ }
+
+ pconfig_to_address($filterent['source'], $srchost, $srcmask);
+ pconfig_to_address($filterent['destination'], $dsthost, $dstmask, '', $dstport, $dstport);
+
+ $filterent['created'] = make_config_revision_entry(null, gettext("Easy Rule"));
+ $a_filter[] = $filterent;
+
+ write_config($filterent['descr']);
+ $retval = filter_configure();
+ if (!empty($_SERVER['DOCUMENT_ROOT'])) {
+ header("Location: firewall_rules.php?if={$int}");
+ exit;
+ } else {
+ return true;
+ }
+}
+
+function easyrule_parse_block($int, $src, $ipproto = "inet") {
+ if (!empty($src) && !empty($int)) {
+ $src = trim($src, "[]");
+ if (!is_ipaddr($src) && !is_subnet($src)) {
+ return gettext("Tried to block invalid IP:") . ' ' . htmlspecialchars($src);
+ }
+ $int = easyrule_find_rule_interface($int);
+ if ($int === false) {
+ return gettext("Invalid interface for block rule:") . ' ' . htmlspecialchars($int);
+ }
+ if (easyrule_block_host_add($src, $int, $ipproto)) {
+ return gettext("Host added successfully");
+ } else {
+ return gettext("Failed to create block rule, alias, or add host.");
+ }
+ } else {
+ return gettext("Tried to block but had no host IP or interface");
+ }
+ return gettext("Unknown block error.");
+}
+
+function easyrule_parse_unblock($int, $host, $ipproto = "inet") {
+ global $blockaliasname, $config;
+
+ if (!empty($host) && !empty($int)) {
+ $host = trim($host, "[]");
+ if (!is_ipaddr($host) && !is_subnet($host)) {
+ return gettext("Tried to unblock invalid IP:") . ' ' . htmlspecialchars($host);
+ }
+ $real_int = easyrule_find_rule_interface($int);
+ if ($real_int === false) {
+ return gettext("Invalid interface for block rule:") . ' ' . htmlspecialchars($int);
+ }
+
+ /* Try to get the ID - will fail if there are no rules/alias on this interface */
+ $id = easyrule_block_alias_getid($real_int);
+ if ($id === false || !$config['aliases']['alias'][$id]) {
+ return gettext("No block rules set on interface:") . ' ' . htmlspecialchars($int);
+ }
+
+ $alias = &$config['aliases']['alias'][$id];
+
+ if (is_subnet($host)) {
+ list($host, $mask) = explode("/", $host);
+ } elseif (is_specialnet($host)) {
+ $mask = 0;
+ } elseif (is_ipaddrv6($host)) {
+ $mask = 128;
+ } else {
+ $mask = 32;
+ }
+
+ // Create the expected string representation
+ $unblock = $host.'/'.$mask;
+
+ $a_address = explode(" ", $config['aliases']['alias'][$id]['address']);
+ $a_detail = explode("||", $config['aliases']['alias'][$id]['detail']);
+
+ if (($key = array_search($unblock, $a_address)) !== false) {
+ unset($a_address[$key]);
+ unset($a_detail[$key]);
+ // Write back the result to the config array
+ $config['aliases']['alias'][$id]['address'] = join(" ", $a_address);
+ $config['aliases']['alias'][$id]['detail'] = join("||", $a_detail);
+
+ // Update config
+ write_config();
+ $retval = filter_configure();
+ if (!empty($_SERVER['DOCUMENT_ROOT'])) {
+ header("Location: firewall_aliases.php");
+ exit;
+ } else {
+ return gettext("Host unblocked successfully");
+ }
+ } else {
+ return gettext("Host ist not on block list: " . $host);
+ }
+ }
+
+ return gettext("Tried to unblock but had no host IP or interface");
+
+}
+
+function easyrule_parse_getblock($int = 'wan', $sep = "\n") {
+ global $blockaliasname, $config;
+
+ $real_int = easyrule_find_rule_interface($int);
+ if ($real_int === false) {
+ return gettext("Invalid interface for block rule:") . ' ' . htmlspecialchars($int);
+ }
+
+ /* Try to get the ID - will fail if there are no rules/alias on this interface */
+ $id = easyrule_block_alias_getid($real_int);
+
+ if ($id === false || !$config['aliases']['alias'][$id] || empty($config['aliases']['alias'][$id]['address'])) {
+ return gettext("No block rules set on interface:") . ' ' . htmlspecialchars($int);
+ }
+ return join($sep, explode(" ", $config['aliases']['alias'][$id]['address']));
+
+}
+
+function easyrule_parse_pass($int, $proto, $src, $dst, $dstport = 0, $ipproto = "inet") {
+ /* Check for valid int, srchost, dsthost, dstport, and proto */
+ global $protocols_with_ports;
+ $src = trim($src, "[]");
+ $dst = trim($dst, "[]");
+
+ if (!empty($int) && !empty($proto) && !empty($src) && !empty($dst)) {
+ $int = easyrule_find_rule_interface($int);
+ if ($int === false) {
+ return gettext("Invalid interface for pass rule:") . ' ' . htmlspecialchars($int);
+ }
+ if (getprotobyname($proto) == -1) {
+ return gettext("Invalid protocol for pass rule:") . ' ' . htmlspecialchars($proto);
+ }
+ if (!is_ipaddr($src) && !is_subnet($src) && !is_ipaddroralias($src) && !is_specialnet($src)) {
+ return gettext("Tried to pass invalid source IP:") . ' ' . htmlspecialchars($src);
+ }
+ if (!is_ipaddr($dst) && !is_subnet($dst) && !is_ipaddroralias($dst) && !is_specialnet($dst)) {
+ return gettext("Tried to pass invalid destination IP:") . ' ' . htmlspecialchars($dst);
+ }
+ if (in_array($proto, $protocols_with_ports)) {
+ if (empty($dstport)) {
+ return gettext("Missing destination port:") . ' ' . htmlspecialchars($dstport);
+ }
+ if (!is_port($dstport) && ($dstport != "any")) {
+ return gettext("Tried to pass invalid destination port:") . ' ' . htmlspecialchars($dstport);
+ }
+ } else {
+ $dstport = 0;
+ }
+ /* Should have valid input... */
+ if (easyrule_pass_rule_add($int, $proto, $src, $dst, $dstport, $ipproto)) {
+ return gettext("Successfully added pass rule!");
+ } else {
+ return gettext("Failed to add pass rule.");
+ }
+ } else {
+ return gettext("Missing parameters for pass rule.");
+ }
+ return gettext("Unknown pass error.");
+}
+
+?>
diff --git a/src/etc/inc/filter.inc b/src/etc/inc/filter.inc
new file mode 100644
index 0000000..36bbe2b
--- /dev/null
+++ b/src/etc/inc/filter.inc
@@ -0,0 +1,4228 @@
+<?php
+/* $Id$ */
+/*
+ filter.inc
+ Copyright (C) 2004-2006 Scott Ullrich
+ Copyright (C) 2005 Bill Marquette
+ Copyright (C) 2006 Peter Allgeyer
+ Copyright (C) 2008-2010 Ermal Luçi
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_BUILDER_BINARIES: /sbin/kldload /usr/sbin/tcpdump /sbin/pfctl /bin/rm
+ pfSense_BUILDER_BINARIES: /usr/sbin/inetd
+ pfSense_MODULE: filter
+*/
+
+
+/* holds the items that will be executed *AFTER* the filter is fully loaded */
+$after_filter_configure_run = array();
+
+/* For installing cron job of schedules */
+$time_based_rules = false;
+
+/* Used to hold the interface list that will be used on ruleset creation. */
+$FilterIflist = array();
+
+/* Create a global array to avoid errors on rulesets. */
+$GatewaysList = array();
+
+/* Used for the hostname dns resolver */
+$filterdns = array();
+
+/* Used for aliases and interface macros */
+$aliases = "";
+
+/* ICMP v4 types */
+$icmptypes = array(
+ "" => gettext("any"),
+ "echoreq" => gettext("Echo request"),
+ "echorep" => gettext("Echo reply"),
+ "unreach" => gettext("Destination unreachable"),
+ "squench" => gettext("Source quench"),
+ "redir" => gettext("Redirect"),
+ "althost" => gettext("Alternate Host"),
+ "routeradv" => gettext("Router advertisement"),
+ "routersol" => gettext("Router solicitation"),
+ "timex" => gettext("Time exceeded"),
+ "paramprob" => gettext("Invalid IP header"),
+ "timereq" => gettext("Timestamp"),
+ "timerep" => gettext("Timestamp reply"),
+ "inforeq" => gettext("Information request"),
+ "inforep" => gettext("Information reply"),
+ "maskreq" => gettext("Address mask request"),
+ "maskrep" => gettext("Address mask reply"),
+ "trace" => gettext("Traceroute"),
+ "dataconv" => gettext("Datagram conversion error"),
+ "mobredir" => gettext("Mobile host redirect"),
+ "ipv6-where" => gettext("IPv6 where-are-you"),
+ "ipv6-here" => gettext("IPv6 I-am-here"),
+ "mobregreq" => gettext("Mobile registration request"),
+ "mobregrep" => gettext("Mobile registration reply"),
+ "skip" => gettext("SKIP"),
+ "photuris" => gettext("Photuris")
+);
+
+/* ICMP v6 types */
+$icmp6types = array(
+ "" => gettext("any"),
+ "unreach" => gettext("Destination unreachable"),
+ "toobig" => gettext("Packet too big"),
+ "timex" => gettext("Time exceeded"),
+ "paramprob" => gettext("Parameter problem"),
+ "echoreq" => gettext("Echo request"),
+ "echorep" => gettext("Echo reply"),
+ "groupqry" => gettext("Group membership query"),
+ "listqry" => gettext("Multicast listener query"),
+ "grouprep" => gettext("Group membership report"),
+ "listenrep" => gettext("Multicast listener report"),
+ "groupterm" => gettext("Group membership termination"),
+ "listendone" => gettext("Multicast listener done"),
+ "routersol" => gettext("Router solicitation"),
+ "routeradv" => gettext("Router advertisement"),
+ "neighbrsol" => gettext("Neighbor solicitation"),
+ "neighbradv" => gettext("Neighbor advertisement"),
+ "redir" => gettext("Redirect"),
+ "routrrenum" => gettext("Router renumbering"),
+ "wrureq" => gettext("Who are you request"),
+ "wrurep" => gettext("Who are you reply"),
+ "fqdnreq" => gettext("FQDN query"),
+ "fqdnrep" => gettext("FQDN reply"),
+ "niqry" => gettext("Node information request"),
+ "nirep" => gettext("Node information reply"),
+ "mtraceresp" => gettext("mtrace resp"),
+ "mtrace" => gettext("mtrace messages")
+);
+
+global $tracker;
+global $negate_tracker;
+$tracker = 1000000000;
+$negate_tracker = 10000000;
+
+function filter_rule_tracker($tracker) {
+ global $tracker;
+
+ return (++$tracker);
+}
+
+function filter_negaterule_tracker() {
+ global $negate_tracker;
+
+ ++$negate_tracker;
+ return "tracker {$negate_tracker} ";
+}
+
+function fix_rule_label($descr) {
+ $descr = str_replace('"', '', $descr);
+ if (strlen($descr) > 63) {
+ return substr($descr, 0, 60) . "...";
+ } else {
+ return $descr;
+ }
+}
+
+function is_bogonsv6_used() {
+ global $config, $g;
+ # Only use bogonsv6 table if IPv6 Allow is on, and at least 1 enabled interface also has "blockbogons" enabled.
+ $usebogonsv6 = false;
+ if (isset($config['system']['ipv6allow'])) {
+ foreach ($config['interfaces'] as $ifacedata) {
+ if (isset($ifacedata['enable']) && isset($ifacedata['blockbogons'])) {
+ $usebogonsv6 = true;
+ break;
+ }
+ }
+ }
+ return $usebogonsv6;
+}
+
+function filter_pflog_start($kill_first = false) {
+ global $config, $g;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_pflog_start() being called $mt\n";
+ }
+ if ((!file_exists("{$g['varrun_path']}/filterlog.pid")) ||
+ (!isvalidpid("{$g['varrun_path']}/filterlog.pid"))) {
+ mwexec("/usr/local/sbin/filterlog -i pflog0 -p {$g['varrun_path']}/filterlog.pid");
+ }
+}
+
+/* reload filter async */
+function filter_configure() {
+ global $g;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_configure() being called $mt\n";
+ }
+
+ /*
+ * NOTE: Check here for bootup status since this should not be triggered during bootup.
+ * The reason is that rc.bootup calls filter_configure_sync directly which does this too.
+ */
+ if (!platform_booting()) {
+ send_event("filter reload");
+ }
+}
+
+function filter_delete_states_for_down_gateways() {
+ global $config, $GatewaysList;
+
+ if (isset($config['system']['kill_states'])) {
+ return;
+ }
+
+ $any_gateway_down = false;
+ $a_gateways = return_gateways_status();
+ if (is_array($GatewaysList)) {
+ foreach ($GatewaysList as $gwname => $gateway) {
+ if (empty($gateway['monitor'])) {
+ continue;
+ }
+ if (!is_ipaddr($gateway['monitor'])) {
+ continue;
+ }
+ if (strstr($gateway['monitor'], "127.0.0.")) {
+ continue;
+ }
+ if (empty($a_gateways[$gateway['monitor']])) {
+ continue;
+ }
+ $gwstatus =& $a_gateways[$gateway['monitor']];
+ if (strstr($gwstatus['status'], "down")) {
+ $any_gateway_down = true;
+ break;
+ }
+ }
+ }
+ if ($any_gateway_down == true) {
+ mwexec("/sbin/pfctl -Fs");
+ }
+}
+
+/* reload filter sync */
+function filter_configure_sync($delete_states_if_needed = true) {
+ global $config, $g, $after_filter_configure_run, $FilterIflist;
+ global $time_based_rules, $filterdns, $aliases, $dummynet_name_list;
+
+ /* Use filter lock to not allow concurrent filter reloads during this run. */
+ $filterlck = lock('filter', LOCK_EX);
+
+ filter_pflog_start();
+ update_filter_reload_status(gettext("Initializing"));
+
+ /* invalidate interface cache */
+ get_interface_arr(true);
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_configure_sync() being called $mt\n";
+ }
+ /* Get interface list to work with. */
+ filter_generate_optcfg_array();
+ if (platform_booting() == true) {
+ echo gettext("Configuring firewall");
+ }
+
+ /* generate aliases */
+ if (platform_booting() == true) {
+ echo ".";
+ }
+ update_filter_reload_status(gettext("Creating aliases"));
+ $aliases = filter_generate_aliases();
+ $gateways = filter_generate_gateways();
+ if (platform_booting() == true) {
+ echo ".";
+ }
+ update_filter_reload_status(gettext("Generating Limiter rules"));
+ $dummynet_rules = filter_generate_dummynet_rules();
+ $dummynet_name_list = get_unique_dnqueue_list();
+ update_filter_reload_status(gettext("Generating NAT rules"));
+ /* generate nat rules */
+ $natrules = filter_nat_rules_generate();
+ if (platform_booting() == true) {
+ echo ".";
+ }
+ update_filter_reload_status(gettext("Generating filter rules"));
+ /* generate pfctl rules */
+ $pfrules = filter_rules_generate();
+ /* generate altq, limiter */
+ if (platform_booting() == true) {
+ echo ".";
+ }
+ update_filter_reload_status(gettext("Generating ALTQ queues"));
+ $altq_queues = filter_generate_altq_queues();
+ update_filter_reload_status(gettext("Generating Layer7 rules"));
+ generate_layer7_files();
+ if (platform_booting() == true) {
+ echo ".";
+ }
+ update_filter_reload_status(gettext("Loading filter rules"));
+ /* enable pf if we need to, otherwise disable */
+ if (!isset ($config['system']['disablefilter'])) {
+ mwexec("/sbin/pfctl -e", true);
+ } else {
+ mwexec("/sbin/pfctl -d", true);
+ unlink_if_exists("{$g['tmp_path']}/filter_loading");
+ update_filter_reload_status(gettext("Filter is disabled. Not loading rules."));
+ if (platform_booting() == true) {
+ echo gettext("done.") . "\n";
+ }
+ unlock($filterlck);
+ return;
+ }
+
+ $limitrules = "";
+ /* User defined maximum table entries in Advanced menu. */
+ if ($config['system']['maximumtableentries'] <> "" && is_numeric($config['system']['maximumtableentries'])) {
+ $limitrules .= "set limit table-entries {$config['system']['maximumtableentries']}\n";
+ }
+
+ if ($config['system']['optimization'] <> "") {
+ $limitrules .= "set optimization {$config['system']['optimization']}\n";
+ if ($config['system']['optimization'] == "conservative") {
+ $limitrules .= "set timeout { udp.first 300, udp.single 150, udp.multiple 900 }\n";
+ }
+ } else {
+ $limitrules .= "set optimization normal\n";
+ }
+
+ $timeoutlist = "";
+ if (isset($config['system']['tcpfirsttimeout']) && is_numericint($config['system']['tcpfirsttimeout'])) {
+ $timeoutlist .= " tcp.first {$config['system']['tcpfirsttimeout']} ";
+ }
+ if (isset($config['system']['tcpopeningtimeout']) && is_numericint($config['system']['tcpopeningtimeout'])) {
+ $timeoutlist .= " tcp.opening {$config['system']['tcpopeningtimeout']} ";
+ }
+ if (isset($config['system']['tcpestablishedtimeout']) && is_numericint($config['system']['tcpestablishedtimeout'])) {
+ $timeoutlist .= " tcp.established {$config['system']['tcpestablishedtimeout']} ";
+ }
+ if (isset($config['system']['tcpclosingtimeout']) && is_numericint($config['system']['tcpclosingtimeout'])) {
+ $timeoutlist .= " tcp.closing {$config['system']['tcpclosingtimeout']} ";
+ }
+ if (isset($config['system']['tcpfinwaittimeout']) && is_numericint($config['system']['tcpfinwaittimeout'])) {
+ $timeoutlist .= " tcp.finwait {$config['system']['tcpfinwaittimeout']} ";
+ }
+ if (isset($config['system']['tcpclosedtimeout']) && is_numericint($config['system']['tcpclosedtimeout'])) {
+ $timeoutlist .= " tcp.closed {$config['system']['tcpclosedtimeout']} ";
+ }
+ if (isset($config['system']['udpfirsttimeout']) && is_numericint($config['system']['udpfirsttimeout'])) {
+ $timeoutlist .= " udp.first {$config['system']['udpfirsttimeout']} ";
+ }
+ if (isset($config['system']['udpsingletimeout']) && is_numericint($config['system']['udpsingletimeout'])) {
+ $timeoutlist .= " udp.single {$config['system']['udpsingletimeout']} ";
+ }
+ if (isset($config['system']['udpmultipletimeout']) && is_numericint($config['system']['udpmultipletimeout'])) {
+ $timeoutlist .= " udp.multiple {$config['system']['udpmultipletimeout']} ";
+ }
+ if (isset($config['system']['icmpfirsttimeout']) && is_numericint($config['system']['icmpfirsttimeout'])) {
+ $timeoutlist .= " icmp.first {$config['system']['icmpfirsttimeout']} ";
+ }
+ if (isset($config['system']['icmperrortimeout']) && is_numericint($config['system']['icmperrortimeout'])) {
+ $timeoutlist .= " icmp.error {$config['system']['icmperrortimeout']} ";
+ }
+ if (isset($config['system']['otherfirsttimeout']) && is_numericint($config['system']['otherfirsttimeout'])) {
+ $timeoutlist .= " other.first {$config['system']['otherfirsttimeout']} ";
+ }
+ if (isset($config['system']['othersingletimeout']) && is_numericint($config['system']['othersingletimeout'])) {
+ $timeoutlist .= " other.single {$config['system']['othersingletimeout']} ";
+ }
+ if (isset($config['system']['othermultipletimeout']) && is_numericint($config['system']['othermultipletimeout'])) {
+ $timeoutlist .= " other.multiple {$config['system']['othermultipletimeout']} ";
+ }
+
+ if ($timeoutlist <> "") {
+ $limitrules .= "set timeout { $timeoutlist }\n";
+ }
+
+ if (!empty($config['system']['adaptivestart']) && !empty($config['system']['adaptiveend'])) {
+ $limitrules .= "set timeout { adaptive.start {$config['system']['adaptivestart']}, adaptive.end {$config['system']['adaptiveend']} }\n";
+ }
+
+ if ($config['system']['maximumstates'] <> "" && is_numeric($config['system']['maximumstates'])) {
+ /* User defined maximum states in Advanced menu. */
+ $limitrules .= "set limit states {$config['system']['maximumstates']}\n";
+ $limitrules .= "set limit src-nodes {$config['system']['maximumstates']}\n";
+ } else {
+ $max_states = pfsense_default_state_size();
+ $limitrules .= "set limit states {$max_states}\n";
+ $limitrules .= "set limit src-nodes {$max_states}\n";
+ }
+
+ /* Frag limit. pf default is 5000 */
+ if ($config['system']['maximumfrags'] <> "" && is_numeric($config['system']['maximumfrags'])) {
+ $limitrules .= "set limit frags {$config['system']['maximumfrags']}\n";
+ }
+
+ if (isset($config['system']['lb_use_sticky']) && is_numeric($config['system']['srctrack']) && ($config['system']['srctrack'] > 0)) {
+ $limitrules .= "set timeout src.track {$config['system']['srctrack']}\n";
+ }
+
+ $rules = "";
+ $rules = "{$limitrules}\n";
+ $rules .= "{$aliases} \n";
+ $rules .= "{$gateways} \n";
+ update_filter_reload_status(gettext("Setting up logging information"));
+ $rules .= filter_setup_logging_interfaces();
+ $rules .= "\n";
+ $rules .= "set skip on pfsync0\n";
+ $rules .= "\n";
+ update_filter_reload_status(gettext("Setting up SCRUB information"));
+ $rules .= filter_generate_scrubing();
+ $rules .= "\n";
+ $rules .= "{$altq_queues}\n";
+ $rules .= "{$natrules}\n";
+ $rules .= "{$pfrules}\n";
+ $rules .= discover_pkg_rules("filter");
+
+ unset($aliases, $gateways, $altq_queues, $natrules, $pfrules);
+
+ // Copy rules.debug to rules.debug.old
+ if (file_exists("{$g['tmp_path']}/rules.debug")) {
+ @copy("{$g['tmp_path']}/rules.debug", "{$g['tmp_path']}/rules.debug.old");
+ }
+
+ if (!@file_put_contents("{$g['tmp_path']}/rules.debug", $rules, LOCK_EX)) {
+ log_error("WARNING: Could not write new rules!");
+ unlock($filterlck);
+ return;
+ }
+
+ @file_put_contents("{$g['tmp_path']}/rules.limits", $limitrules);
+ mwexec("/sbin/pfctl -Of {$g['tmp_path']}/rules.limits");
+ unset($rules, $limitrules);
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "pfctl being called at $mt\n";
+ }
+ unset($rules_loading, $rules_error);
+ $_grbg = exec("/sbin/pfctl -o basic -f {$g['tmp_path']}/rules.debug 2>&1", $rules_error, $rules_loading);
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "pfctl done at $mt\n";
+ }
+ /*
+ * check for a error while loading the rules file. if an error has occurred
+ * then output the contents of the error to the caller
+ */
+ if ($rules_loading <> 0) {
+ $saved_line_error = $rules_error[0];
+ $line_error = explode(":", $rules_error[0]);
+ $line_number = $line_error[1];
+ $line_split = file("{$g['tmp_path']}/rules.debug");
+ if (is_array($line_split)) {
+ $line_error = sprintf(gettext('The line in question reads [%1$d]: %2$s'), $line_number, $line_split[$line_number-1]);
+ }
+ unset($line_split);
+
+ /* Brutal ugly hack but required -- PF is stuck, unwedge */
+ if (strstr("$rules_error[0]", "busy")) {
+ exec("/sbin/pfctl -d; /sbin/pfctl -e; /sbin/pfctl -f {$g['tmp_path']}/rules.debug");
+ $error_msg = gettext("PF was wedged/busy and has been reset.");
+ file_notice("pf_busy", $error_msg, "pf_busy", "");
+ } else {
+ $_grbg = exec("/sbin/pfctl -o basic -f {$g['tmp_path']}/rules.debug.old 2>&1");
+ }
+ unset($rules_loading, $rules_error);
+
+ if ($line_error and $line_number) {
+ file_notice("filter_load", sprintf(gettext('There were error(s) loading the rules: %1$s - %2$s'), $saved_line_error, $line_error), "Filter Reload", "");
+ update_filter_reload_status(sprintf(gettext('There were error(s) loading the rules: %1$s - %2$s'), $saved_line_error, $line_error));
+ unlock($filterlck);
+ return;
+ }
+ }
+
+ # If we are not using bogonsv6 then we can remove any bogonsv6 table from the running pf (if the table is not there, the kill is still fine).
+ if (!is_bogonsv6_used()) {
+ $_grbg = exec("/sbin/pfctl -t bogonsv6 -T kill 2>/dev/null");
+ }
+
+ update_filter_reload_status(gettext("Starting up layer7 daemon"));
+ layer7_start_l7daemon();
+
+ if (!platform_booting()) {
+ if (!empty($filterdns)) {
+ @file_put_contents("{$g['varetc_path']}/filterdns.conf", implode("", $filterdns));
+ unset($filterdns);
+ if (isvalidpid("{$g['varrun_path']}/filterdns.pid")) {
+ sigkillbypid("{$g['varrun_path']}/filterdns.pid", "HUP");
+ } else {
+ /*
+ * FilterDNS has three debugging levels. The default chosen is 1.
+ * Available are level 2 and greater then 2.
+ */
+ if (isset($config['system']['aliasesresolveinterval']) && is_numeric($config['system']['aliasesresolveinterval'])) {
+ $resolve_interval = $config['system']['aliasesresolveinterval'];
+ } else {
+ $resolve_interval = 300;
+ }
+ mwexec("/usr/local/sbin/filterdns -p {$g['varrun_path']}/filterdns.pid -i {$resolve_interval} -c {$g['varetc_path']}/filterdns.conf -d 1");
+ }
+ } else {
+ killbypid("{$g['varrun_path']}/filterdns.pid");
+ @unlink("{$g['varrun_path']}/filterdns.pid");
+ }
+ }
+
+ /* run items scheduled for after filter configure run */
+ $fda = fopen("{$g['tmp_path']}/commands.txt", "w");
+ if ($fda) {
+ if ($after_filter_configure_run) {
+ foreach ($after_filter_configure_run as $afcr) {
+ fwrite($fda, $afcr . "\n");
+ }
+ unset($after_filter_configure_run);
+ }
+
+ /*
+ * we need a way to let a user run a shell cmd after each
+ * filter_configure() call. run this xml command after
+ * each change.
+ */
+ if ($config['system']['afterfilterchangeshellcmd'] <> "") {
+ fwrite($fda, $config['system']['afterfilterchangeshellcmd'] . "\n");
+ }
+
+ fclose($fda);
+ }
+
+ if (file_exists("{$g['tmp_path']}/commands.txt")) {
+ mwexec("sh {$g['tmp_path']}/commands.txt &");
+ unlink("{$g['tmp_path']}/commands.txt");
+ }
+
+ /* if time based rules are enabled then swap in the set */
+ if ($time_based_rules == true) {
+ filter_tdr_install_cron(true);
+ } else {
+ filter_tdr_install_cron(false);
+ }
+
+ if (platform_booting() == true) {
+ echo ".";
+ }
+
+ if ($delete_states_if_needed) {
+ update_filter_reload_status(gettext("Processing down interface states"));
+ filter_delete_states_for_down_gateways();
+ }
+
+ update_filter_reload_status(gettext("Running plugins"));
+
+ if (is_dir("/usr/local/pkg/pf/")) {
+ /* process packager manager custom rules */
+ update_filter_reload_status(gettext("Running plugins (pf)"));
+ run_plugins("/usr/local/pkg/pf/");
+ update_filter_reload_status(gettext("Plugins completed."));
+ }
+
+ update_filter_reload_status(gettext("Done"));
+ if (platform_booting() == true) {
+ echo gettext("done.") . "\n";
+ }
+
+ unlock($filterlck);
+ return 0;
+}
+
+function filter_generate_scrubing() {
+ global $config, $FilterIflist;
+ $scrubrules = "";
+
+ if (isset($config['system']['maxmss_enable'])) {
+ $maxmss = 1400;
+ if (!empty($config['system']['maxmss'])) {
+ $maxmss = $config['system']['maxmss'];
+ }
+
+ $scrubrules .= "scrub from any to <vpn_networks> max-mss {$maxmss}\n";
+ $scrubrules .= "scrub from <vpn_networks> to any max-mss {$maxmss}\n";
+ }
+ /* disable scrub option */
+ foreach ($FilterIflist as $scrubif => $scrubcfg) {
+ if (isset($scrubcfg['virtual']) || empty($scrubcfg['descr'])) {
+ continue;
+ }
+ /* set up MSS clamping */
+ if (($scrubcfg['mss'] <> "") &&
+ (is_numeric($scrubcfg['mss'])) &&
+ ($scrubcfg['if'] != "pppoe") &&
+ ($scrubcfg['if'] != "pptp") &&
+ ($scrubif['if'] != "l2tp")) {
+ $mssclamp = "max-mss " . (intval($scrubcfg['mss'] - 40));
+ } else {
+ $mssclamp = "";
+ }
+ /* configure no-df for linux nfs and others */
+ if ($config['system']['scrubnodf']) {
+ $scrubnodf = "no-df";
+ } else {
+ $scrubnodf = "";
+ }
+ if ($config['system']['scrubrnid']) {
+ $scrubrnid = "random-id";
+ } else {
+ $scrubrnid = "";
+ }
+ if (!isset($config['system']['disablescrub'])) {
+ $scrubrules .= "scrub on \${$scrubcfg['descr']} all {$scrubnodf} {$scrubrnid} {$mssclamp} fragment reassemble\n"; // reassemble all directions
+ } else if (!empty($mssclamp)) {
+ $scrubrules .= "scrub on \${$scrubcfg['descr']} {$mssclamp}\n";
+ }
+ }
+ return $scrubrules;
+}
+
+function filter_generate_nested_alias($name, $alias, &$aliasnesting, &$aliasaddrnesting) {
+ global $aliastable, $filterdns;
+
+ $addresses = explode(" ", $alias);
+ $use_filterdns = false;
+ $finallist = "";
+ $builtlist = "";
+ $urltable_nesting = "";
+ $aliasnesting[$name] = $name;
+ $alias_type = alias_get_type($name);
+ foreach ($addresses as $address) {
+ if (empty($address)) {
+ continue;
+ }
+ $linelength = strlen($builtlist);
+ $tmpline = "";
+ if (is_alias($address)) {
+ if (alias_get_type($address) == 'urltable') {
+ // Feature#1603. For this type of alias we do not need to recursively call filter_generate_nested_alias. Just load IPs from the file.
+ $urltable_nesting = alias_expand_urltable($address);
+ if (!empty($urltable_nesting)) {
+ $urlfile_as_arr = file($urltable_nesting);
+ foreach ($urlfile_as_arr as $line) {
+ $address= rtrim($line);
+ if ((strlen($tmpline) + $linelength) > 4036) {
+ $finallist .= "{$tmpline} \\\n";
+ $tmpline = "";
+ }
+ $tmpline .= " {$address}";
+ }
+ }
+ }
+ /* We already expanded this alias so there is no necessity to do it again. */
+ else if (!isset($aliasnesting[$address])) {
+ $tmpline = filter_generate_nested_alias($name, $aliastable[$address], $aliasnesting, $aliasaddrnesting);
+ }
+ } else if (!isset($aliasaddrnesting[$address])) {
+ if (!is_ipaddr($address) && !is_subnet($address) && !((($alias_type == 'port') || ($alias_type == 'url_ports')) && (is_port($address) || is_portrange($address))) && is_hostname($address)) {
+ if (!isset($filterdns["{$address}{$name}"])) {
+ $use_filterdns = true;
+ $filterdns["{$address}{$name}"] = "pf {$address} {$name}\n";
+ }
+ continue;
+ }
+ $aliasaddrnesting[$address] = $address;
+ $tmpline = " {$address}";
+ }
+ if ((strlen($tmpline)+ $linelength) > 4036) {
+ $finallist .= "{$builtlist} \\\n";
+ $builtlist = "";
+ }
+ if (!empty($tmpline)) {
+ $builtlist .= " {$tmpline}";
+ }
+ }
+ $finallist .= $builtlist;
+
+ if ($use_filterdns === true && !empty($finallist)) {
+ foreach (explode(" ", $finallist) as $address) {
+ if (empty($address)) {
+ continue;
+ }
+ if ((is_ipaddr($address) || is_subnet($address)) && !isset($filterdns["{$address}{$name}"])) {
+ $filterdns["{$address}{$name}"] = "pf {$address} {$name}\n";
+ }
+ }
+ $finallist = '';
+ }
+
+ return $finallist;
+}
+
+function filter_expand_alias($alias_name) {
+ global $config;
+
+ if (isset($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $aliased) {
+ if ($aliased['name'] == $alias_name) {
+ $aliasnesting = array();
+ $aliasaddrnesting = array();
+ return filter_generate_nested_alias($aliased['name'], $aliased['address'], $aliasnesting, $aliasaddrnesting);
+ }
+ }
+ }
+}
+
+function filter_expand_alias_array($alias_name) {
+ $expansion = filter_expand_alias($alias_name);
+ return explode(" ", preg_replace('/\s+/', ' ', trim($expansion)));
+}
+
+function filter_generate_aliases() {
+ global $config, $FilterIflist, $after_filter_configure_run;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_generate_aliases() being called $mt\n";
+ }
+
+ $alias = "#System aliases\n ";
+ $aliases = "loopback = \"{ lo0 }\"\n";
+
+ foreach ($FilterIflist as $if => $ifcfg) {
+ if (is_array($ifcfg[0])) {
+ if ($ifcfg[0]['if'] == 'pppoe') {
+ $aliases .= "{$ifcfg[0]['descr']} = \"{ {$ifcfg[0]['if']}";
+ $aliases .= " }\"\n";
+ }
+ } elseif (!empty($ifcfg['descr']) && !empty($ifcfg['if'])) {
+ if ($ifcfg['type6'] == '6rd') {
+ $aliases .= "{$ifcfg['descr']} = \"{ {$ifcfg['if']} {$if}_stf";
+ } else if ($ifcfg['type6'] == '6to4') {
+ $aliases .= "{$ifcfg['descr']} = \"{ {$ifcfg['if']} {$if}_stf";
+ } else {
+ $aliases .= "{$ifcfg['descr']} = \"{ {$ifcfg['if']}";
+
+ if ($ifcfg['type'] == 'pptp') {
+ foreach (get_parent_interface($ifcfg['if']) as $parent_if) {
+ if ($parent_if != $ifcfg['if']) {
+ $aliases .= " {$parent_if}";
+ }
+ }
+ }
+ }
+ $aliases .= " }\"\n";
+ }
+ }
+
+ $aliases .= "\n#SSH Lockout Table\n";
+ $aliases .= "table <sshlockout> persist\n";
+ $aliases .= "table <webConfiguratorlockout> persist\n";
+
+ $aliases .= "#Snort tables\n";
+ $aliases .= "table <snort2c>\n";
+ $aliases .= "table <virusprot>\n";
+ if (!file_exists("/etc/bogons") || !file_exists("/etc/bogonsv6")) {
+ conf_mount_rw();
+ if (!file_exists("/etc/bogons")) {
+ @file_put_contents("/etc/bogons", "");
+ }
+ if (!file_exists("/etc/bogonsv6")) {
+ @file_put_contents("/etc/bogonsv6", "");
+ }
+ conf_mount_ro();
+ }
+ $aliases .= "table <bogons> persist file \"/etc/bogons\"\n";
+ if (is_bogonsv6_used()) {
+ $aliases .= "table <bogonsv6> persist file \"/etc/bogonsv6\"\n";
+ }
+
+ $vpns_list = filter_get_vpns_list();
+ if ($vpns_list) {
+ $aliases .= "table <vpn_networks> { $vpns_list }\n";
+ }
+
+ /* add a Negate_networks table */
+ $aliases .= "table <negate_networks> ";
+ if ($vpns_list) {
+ $aliases .= "{ $vpns_list }";
+ }
+ $aliases .= "\n";
+
+ $aliases .= "\n# User Aliases \n";
+ /* Setup pf groups */
+ if (isset($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $aliased) {
+ $extralias = "";
+ $aliasnesting = array();
+ $aliasaddrnesting = array();
+ if (is_numericint($aliased['name'])) {
+ // skip aliases with numeric-only names. redmine #4289
+ file_notice("Filter_Reload", "Aliases with numeric-only names are not valid. Skipping alias " . $aliased['name']);
+ continue;
+ }
+ $addrlist = filter_generate_nested_alias($aliased['name'], $aliased['address'], $aliasnesting, $aliasaddrnesting);
+ switch ($aliased['type']) {
+ case "host":
+ case "network":
+ case "url":
+ $tableaddrs = "{$addrlist}{$extralias}";
+ if (empty($tableaddrs)) {
+ $aliases .= "table <{$aliased['name']}> persist\n";
+ if (empty($aliased['address'])) {
+ $after_filter_configure_run[] = "/sbin/pfctl -T flush -t " . escapeshellarg($aliased['name']);
+ }
+ } else {
+ $aliases .= "table <{$aliased['name']}> { {$addrlist}{$extralias} } \n";
+ }
+
+ $aliases .= "{$aliased['name']} = \"<{$aliased['name']}>\"\n";
+ break;
+ case "openvpn":
+ $openvpncfg = array();
+ if ($config['openvpn']['user']) {
+ /* XXX: Check if we have a correct ip? */
+ foreach ($config['openvpn']['user'] as $openvpn) {
+ $openvpncfg[$openvpn['name']] = $openvpn['ip'];
+ }
+ }
+ $vpn_lines = explode("\n", $addrlist);
+ foreach ($vpn_lines as $vpn_line) {
+ $vpn_address_split = explode(" ", $vpn_line);
+ foreach ($vpn_address_split as $vpnsplit) {
+ if (isset($openvpncfg[$vpnsplit])) {
+ $newaddress .= " ";
+ $newaddress .= $openvpn[$vpnsplit];
+ break;
+ }
+ }
+ }
+ $aliases .= "table <{$aliased['name']}> { {$newaddress}{$extralias} } \n";
+ $aliases .= "{$aliased['name']} = \"<{$aliased['name']}>\"\n";
+ break;
+ case "urltable":
+ $urlfn = alias_expand_urltable($aliased['name']);
+ if ($urlfn) {
+ $aliases .= "table <{$aliased['name']}> persist file \"{$urlfn}\"\n";
+ $aliases .= "{$aliased['name']} = \"<{$aliased['name']}>\"\n";
+ }
+ break;
+ case "urltable_ports":
+ // TODO: Change it when pf supports tables with ports
+ $urlfn = alias_expand_urltable($aliased['name']);
+ if ($urlfn) {
+ $aliases .= "{$aliased['name']} = \"{ " . preg_replace("/\n/", " ", file_get_contents($urlfn)) . " }\"\n";
+ }
+ break;
+ case "port":
+ case "url_ports":
+ $aliases .= "{$aliased['name']} = \"{ {$addrlist} }\"\n";
+ break;
+ default:
+ $aliases .= "{$aliased['name']} = \"{ {$aliased['address']}{$extralias} }\"\n";
+ break;
+ }
+ }
+ }
+ $result = "{$alias} \n";
+ $result .= "{$aliases}";
+
+ return $result;
+}
+
+function filter_generate_gateways() {
+ global $config, $g, $GatewaysList;
+
+ $rules = "# Gateways\n";
+
+ update_filter_reload_status(gettext("Creating gateway group item..."));
+
+ /* Lookup Gateways to be used in filter rules once */
+ $GatewaysList = return_gateways_array();
+ $GatewayGroupsList = return_gateway_groups_array();
+
+ if (is_array($GatewaysList)) {
+ foreach ($GatewaysList as $gwname => $gateway) {
+ $int = $gateway['interface'];
+ $gwip = $gateway['gateway'];
+ $route = "";
+ if (!is_ipaddr($gwip)) {
+ $gwip = get_interface_gateway($gateway['friendlyiface']);
+ }
+ if (is_ipaddr($gwip) && !empty($int) && !isset($gateway['force_down'])) {
+ $route = "route-to ( {$int} {$gwip} )";
+ }
+ if (($route === "") && isset($config['system']['skip_rules_gw_down'])) {
+ unset($GatewaysList[$gwname]);
+ } else {
+ $rules .= "GW{$gwname} = \" {$route} \"\n";
+ }
+ }
+ }
+
+ if (is_array($GatewayGroupsList)) {
+ foreach ($GatewayGroupsList as $gateway => $members) {
+ $route = "";
+ /* hey, that's not a group member! */
+ unset($members['ipprotocol']);
+ if (count($members) > 0) {
+ $foundlb = 0;
+ $routeto = "";
+ foreach ($members as $idx => $member) {
+ $int = $member['int'];
+ $gatewayip = $member['gwip'];
+ if (($int <> "") && is_ipaddr($gatewayip)) {
+ if ($g['debug']) {
+ log_error(sprintf(gettext('Setting up route with %1$s on %2$s'), $gatewayip, $int));
+ }
+ if ($member['weight'] > 1) {
+ $routeto .= str_repeat("( {$int} {$gatewayip} ) ", $member['weight']);
+ } else {
+ $routeto .= "( {$int} {$gatewayip} ) ";
+ }
+ $foundlb++;
+ } else {
+ log_error(sprintf(gettext("An error occurred while trying to find the interface got %s . The rule has not been added."), $gatewayip));
+ }
+ }
+ $route = "";
+ if ($foundlb > 0) {
+ $route = " route-to { {$routeto} } ";
+ if ($foundlb > 1) {
+ $route .= " round-robin ";
+ if (isset($config['system']['lb_use_sticky'])) {
+ $route .= " sticky-address ";
+ }
+ }
+ }
+ }
+ if (($route === "") && isset($config['system']['skip_rules_gw_down'])) {
+ unset($GatewayGroupsList[$gateway]);
+ } else {
+ $rules .= "GW{$gateway} = \" {$route} \"\n";
+ }
+ }
+ }
+
+ /* Create a global array to avoid errors on rulesets. */
+ $GatewaysList = $GatewaysList + $GatewayGroupsList;
+
+ $rules .= "\n";
+
+ return $rules;
+}
+
+/* returns space separated list of vpn subnets */
+function filter_get_vpns_list() {
+ global $config;
+
+ $vpns = "";
+ $vpns_arr = array();
+
+ /* ipsec */
+ if (isset($config['ipsec']['enable'])) {
+ if (is_array($config['ipsec']['phase2'])) {
+ foreach ($config['ipsec']['phase2'] as $ph2ent) {
+ if ((!$ph2ent['mobile']) && ($ph2ent['mode'] != 'transport')) {
+ if (!function_exists('ipsec_idinfo_to_cidr')) {
+ require_once("ipsec.inc");
+ }
+ if (!is_array($ph2ent['remoteid'])) {
+ continue;
+ }
+ $ph2ent['remoteid']['mode'] = $ph2ent['mode'];
+ $vpns_subnet = ipsec_idinfo_to_cidr($ph2ent['remoteid']);
+ if (!is_subnet($vpns_subnet) || $vpns_subnet == "0.0.0.0/0") {
+ continue;
+ }
+ $vpns_arr[] = $vpns_subnet;
+ }
+ }
+ }
+ }
+
+ /* openvpn */
+ foreach (array('client', 'server') as $type) {
+ if (is_array($config['openvpn']["openvpn-$type"])) {
+ foreach ($config['openvpn']["openvpn-$type"] as $settings) {
+ if (is_array($settings)) {
+ if (!isset($settings['disable'])) {
+ $remote_networks = explode(',', $settings['remote_network']);
+ foreach ($remote_networks as $remote_network) {
+ if (is_subnet($remote_network) && ($remote_network <> "0.0.0.0/0")) {
+ $vpns_arr[] = $remote_network;
+ }
+ }
+ if (is_subnet($settings['tunnel_network']) && $settings['tunnel_network'] <> "0.0.0.0/0") {
+ $vpns_arr[] = $settings['tunnel_network'];
+ }
+ }
+ }
+ }
+ }
+ }
+ /* pppoe */
+ if (is_array($config['pppoes']['pppoe'])) {
+ foreach ($config['pppoes']['pppoe'] as $pppoe) {
+ if ($pppoe['mode'] == "server") {
+ if (is_ipaddr($pppoe['remoteip'])) {
+ $pppoesub = gen_subnet($pppoe['remoteip'], $pppoe['pppoe_subnet']);
+ if (is_subnet($pppoesub)) {
+ $vpns_arr[] = $pppoesub;
+ }
+ }
+ }
+ }
+ }
+
+ if (!empty($vpns_arr)) {
+ $vpns = implode(" ", $vpns_arr);
+ }
+
+ return $vpns;
+}
+
+/* returns space separated list of directly connected networks
+ * optionally returns an array instead, including friendly interface and gateway (if applicable)
+ */
+function filter_get_direct_networks_list($returnsubnetsonly = true) {
+ global $config, $FilterIflist, $GatewaysList;
+ /* build list of directly connected interfaces and networks */
+ $networks = "";
+ $networks_arr = array();
+ if (empty($FilterIflist)) {
+ filter_generate_optcfg_array();
+ }
+ foreach ($FilterIflist as $ifent => $ifcfg) {
+ $subnet = "{$ifcfg['sa']}/{$ifcfg['sn']}";
+ if (is_subnet($subnet)) {
+ if ($returnsubnetsonly) {
+ $networks_arr[] = $subnet;
+ } else {
+ $networks_arr[] = array(
+ 'subnet' => $subnet,
+ 'if' => $ifent,
+ 'ip' => $ifcfg['ip']);
+ }
+ }
+ }
+ foreach (get_configured_ip_aliases_list(true) as $vip) {
+ $subnet = "{$vip['subnet']}/{$vip['subnet_bits']}";
+ if (is_subnet($subnet) && !(is_subnetv4($subnet) && $vip['subnet_bits'] == 32) && !(is_subnetv6($subnet) && $vip['subnet_bits'] == 128)) {
+ if (is_subnetv4($subnet)) {
+ $subnet = gen_subnet($vip['subnet'], $vip['subnet_bits']) . "/{$vip['subnet_bits']}";
+ } else if (is_subnetv6($subnet)) {
+ $subnet = gen_subnetv6($vip['subnet'], $vip['subnet_bits']) . "/{$vip['subnet_bits']}";
+ }
+ if ($returnsubnetsonly) {
+ $networks_arr[] = $subnet;
+ } else {
+ $networks_arr[] = array(
+ 'subnet' => $subnet,
+ 'if' => $vip['interface'],
+ 'ip' => $vip['subnet']);
+ }
+ }
+ }
+ foreach (get_staticroutes() as $netent) {
+ if (is_subnet($netent['network'])) {
+ if ($returnsubnetsonly) {
+ $networks_arr[] = $netent['network'];
+ } else if (isset($GatewaysList[$netent['gateway']])) {
+ $networks_arr[] = array(
+ 'subnet' => $netent['network'],
+ 'if' => $GatewaysList[$netent['gateway']]['friendlyiface'],
+ 'gateway' => $GatewaysList[$netent['gateway']]['gateway']);
+ }
+ }
+ }
+ if ($returnsubnetsonly) {
+ if (!empty($networks_arr)) {
+ $networks = implode(" ", $networks_arr);
+ }
+ return $networks;
+ } else {
+ return $networks_arr;
+ }
+}
+
+function filter_generate_optcfg_array() {
+ global $config, $FilterIflist;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_generate_optcfg_array() being called $mt\n";
+ }
+
+ read_layer7_config();
+ /* if list */
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $if => $ifdetail) {
+ $oc = $config['interfaces'][$if];
+ $oic = array();
+ $oic['if'] = get_real_interface($if);
+ if (!does_interface_exist($oic['if'])) {
+ continue;
+ }
+ $oic['ifv6'] = get_real_interface($if, "inet6");
+ $oic['ip'] = get_interface_ip($if);
+ $oic['ipv6'] = get_interface_ipv6($if);
+ if (!is_ipaddrv4($oc['ipaddr']) && !empty($oc['ipaddr'])) {
+ $oic['type'] = $oc['ipaddr'];
+ }
+ if (!is_ipaddrv6($oc['ipaddrv6']) && !empty($oc['ipaddrv6'])) {
+ $oic['type6'] = $oc['ipaddrv6'];
+ }
+ if (!empty($oc['track6-interface'])) {
+ $oic['track6-interface'] = $oc['track6-interface'];
+ }
+ $oic['sn'] = get_interface_subnet($if);
+ $oic['snv6'] = get_interface_subnetv6($if);
+ $oic['mtu'] = empty($oc['mtu']) ? 1500 : $oc['mtu'];
+ $oic['mss'] = empty($oc['mss']) ? '' : $oc['mss'];
+ $oic['descr'] = $ifdetail;
+ $oic['sa'] = gen_subnet($oic['ip'], $oic['sn']);
+ $oic['sav6'] = gen_subnetv6($oic['ipv6'], $oic['snv6']);
+ $oic['nonat'] = $oc['nonat'];
+ $oic['alias-address'] = $oc['alias-address'];
+ $oic['alias-subnet'] = $oc['alias-subnet'];
+ $oic['gateway'] = $oc['gateway'];
+ $oic['gatewayv6'] = $oc['gatewayv6'];
+ $oic['spoofcheck'] = "yes";
+ $oic['bridge'] = link_interface_to_bridge($if);
+ $vips = link_interface_to_vips($if);
+ if (!empty($vips)) {
+ foreach ($vips as $vipidx => $vip) {
+ if (is_ipaddrv4($vip['subnet'])) {
+ if (!is_array($oic['vips'])) {
+ $oic['vips'] = array();
+ }
+ $oic['vips'][$vipidx]['ip'] = $vip['subnet'];
+ if (empty($vip['subnet_bits'])) {
+ $oic['vips'][$vipidx]['sn'] = 32;
+ } else {
+ $oic['vips'][$vipidx]['sn'] = $vip['subnet_bits'];
+ }
+ } else if (is_ipaddrv6($vip['subnet'])) {
+ if (!is_array($oic['vips6'])) {
+ $oic['vips6'] = array();
+ }
+ $oic['vips6'][$vipidx]['ip'] = $vip['subnet'];
+ if (empty($vip['subnet_bits'])) {
+ $oic['vips6'][$vipidx]['sn'] = 128;
+ } else {
+ $oic['vips6'][$vipidx]['sn'] = $vip['subnet_bits'];
+ }
+ }
+ }
+ }
+ unset($vips);
+ $FilterIflist[$if] = $oic;
+ }
+
+ if ($config['pptpd']['mode'] == "server" || $config['pptpd']['mode'] == "redir") {
+ $oic = array();
+ $oic['if'] = 'pptp';
+ $oic['descr'] = 'pptp';
+ $oic['ip'] = $config['pptpd']['localip'];
+ $oic['sa'] = $config['pptpd']['remoteip'];
+ $oic['mode'] = $config['pptpd']['mode'];
+ $oic['virtual'] = true;
+ if ($config['pptpd']['pptp_subnet'] <> "") {
+ $oic['sn'] = $config['pptpd']['pptp_subnet'];
+ } else {
+ $oic['sn'] = "32";
+ }
+ $FilterIflist['pptp'] = $oic;
+ }
+ if ($config['l2tp']['mode'] == "server") {
+ $oic = array();
+ $oic['if'] = 'l2tp';
+ $oic['descr'] = 'L2TP';
+ $oic['ip'] = $config['l2tp']['localip'];
+ $oic['sa'] = $config['l2tp']['remoteip'];
+ if ($config['l2tp']['l2tp_subnet'] <> "") {
+ $oic['sn'] = $config['l2tp']['l2tp_subnet'];
+ } else {
+ $oic['sn'] = "32";
+ }
+ $oic['mode'] = $config['l2tp']['mode'];
+ $oic['virtual'] = true;
+ $FilterIflist['l2tp'] = $oic;
+ }
+ if (is_array($config['pppoes']['pppoe']) && (count($config['pppoes']['pppoe']) > 0)) {
+ $pppoeifs = array();
+ foreach ($config['pppoes']['pppoe'] as $pppoe) {
+ if ($pppoe['mode'] == "server") {
+ $oic = array();
+ $oic['if'] = 'pppoe';
+ $oic['descr'] = 'pppoe';
+ $oic['ip'] = $pppoe['localip'];
+ $oic['sa'] = $pppoe['remoteip'];
+ $oic['mode'] = $pppoe['mode'];
+ $oic['virtual'] = true;
+ if ($pppoe['pppoe_subnet'] <> "") {
+ $oic['sn'] = $pppoe['pppoe_subnet'];
+ } else {
+ $oic['sn'] = "32";
+ }
+ $pppoeifs[] = $oic;
+ }
+ }
+ if (count($pppoeifs)) {
+ $FilterIflist['pppoe'] = $pppoeifs;
+ }
+ }
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ $oic = array();
+ $oic['if'] = 'enc0';
+ $oic['descr'] = 'IPsec';
+ $oic['type'] = "none";
+ $oic['virtual'] = true;
+ $FilterIflist['enc0'] = $oic;
+ }
+ /* add openvpn interfaces */
+ if ($config['openvpn']['openvpn-server'] || $config['openvpn']['openvpn-client']) {
+ $oic = array();
+ $oic['if'] = "openvpn";
+ $oic['descr'] = 'OpenVPN';
+ $oic['type'] = "none";
+ $oic['virtual'] = true;
+ $FilterIflist['openvpn'] = $oic;
+ }
+ /* add interface groups */
+ if (is_array($config['ifgroups']['ifgroupentry'])) {
+ foreach ($config['ifgroups']['ifgroupentry'] as $ifgen) {
+ $oc = array();
+ $oc['if'] = $ifgen['ifname'];
+ $oc['descr'] = $ifgen['ifname'];
+ $oc['virtual'] = true;
+ $FilterIflist[$ifgen['ifname']] = $oc;
+ }
+ }
+}
+
+function filter_flush_nat_table() {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_flush_nat_table() being called $mt\n";
+ }
+ return mwexec("/sbin/pfctl -F nat");
+}
+
+function filter_flush_state_table() {
+ return mwexec("/sbin/pfctl -F state");
+}
+
+function filter_get_reflection_interfaces($natif = "") {
+ global $FilterIflist;
+
+ $nat_if_list = array();
+
+ foreach ($FilterIflist as $ifent => $ifname) {
+ if ($ifname['if'] == $natif) {
+ continue;
+ }
+
+ /* Do not add reflection redirects for interfaces with gateways */
+ if (interface_has_gateway($ifent)) {
+ continue;
+ }
+
+ $nat_if_list[] = $ifname['if'];
+ }
+
+ return $nat_if_list;
+}
+
+function filter_generate_reflection_nat($rule, &$route_table, $nat_ifs, $protocol, $target, $target_ip, $target_subnet = "") {
+ global $config, $FilterIflist;
+
+ if (!isset($config['system']['enablenatreflectionhelper'])) {
+ return "";
+ }
+
+ // Initialize natrules holder string
+ $natrules = "";
+
+ update_filter_reload_status(sprintf(gettext("Creating reflection NAT rule for %s..."), $rule['descr']));
+
+ /* TODO: Add this option to port forwards page. */
+ if (isset($rule['staticnatport'])) {
+ $static_port = " static-port";
+ } else {
+ $static_port = " port 1024:65535";
+ }
+
+ if (!empty($protocol)) {
+ $protocol_text = " proto {$protocol}";
+ } else {
+ $protocol_text = "";
+ }
+
+ if (empty($target_subnet) || !is_numeric($target_subnet)) {
+ $target_subnet = 32;
+ }
+
+ if (!is_array($route_table)) {
+ /* get a simulated IPv4-only route table based on the config */
+ $route_table = filter_get_direct_networks_list(false);
+ foreach ($route_table as $rt_key => $rt_ent) {
+ if (!is_subnetv4($rt_ent['subnet'])) {
+ unset($route_table[$rt_key]);
+ }
+ if (isset($route_table[$rt_key]) && isset($FilterIflist[$rt_ent['if']]['if'])) {
+ $route_table[$rt_key]['if'] = $FilterIflist[$rt_ent['if']]['if'];
+ }
+ }
+ }
+
+ /* Check if the target is accessed through a static route */
+ foreach ($route_table as $route) {
+ if (isset($route['gateway']) && is_ipaddr($route['gateway'])) {
+ $subnet_split = explode("/", $route['subnet']);
+ if (in_array($route['if'], $nat_ifs) && check_subnets_overlap($target_ip, $target_subnet, $subnet_split[0], $subnet_split[1])) {
+ $target_ip = $route['gateway'];
+ $target_subnet = 32;
+ break;
+ }
+ }
+ }
+
+ /* Search for matching subnets in the routing table */
+ foreach ($route_table as $route) {
+ $subnet = $route['subnet'];
+ $subnet_split = explode("/", $subnet);
+ $subnet_if = $route['if'];
+ /* Blacklist invalid "from" sources since they can be picked up accidentally and cause rule errors. */
+ $no_reflect_from = array("l2tp");
+ if (in_array($subnet_if, $nat_ifs) && check_subnets_overlap($target_ip, $target_subnet, $subnet_split[0], $subnet_split[1])) {
+ $ifsubnet_ip = "";
+ /* Find interface IP to use for NAT */
+ foreach ($route_table as $ifnetwork) {
+ if (isset($ifnetwork['ip']) && is_ipaddr($ifnetwork['ip']) && $ifnetwork['if'] == $subnet_if && ip_in_subnet($ifnetwork['ip'], $subnet)) {
+ $ifsubnet_ip = $ifnetwork['ip'];
+ break;
+ }
+ }
+ if(!empty($ifsubnet_ip) && !in_array($subnet, $no_reflect_from)) {
+ $subnets = array($subnet);
+ /* Find static routes that also need to be referenced in the NAT rule */
+ foreach ($route_table as $rtentry) {
+ if (isset($rtentry['gateway']) && is_ipaddr($rtentry['gateway']) && $rtentry['if'] == $subnet_if && ip_in_subnet($rtentry['gateway'], $subnet)) {
+ $subnets[] = $rtentry['subnet'];
+ }
+ }
+ if (count($subnets) > 1) {
+ $subnet = "{ " . implode(" ", $subnets) . " }";
+ }
+ $natrules .= "no nat on {$subnet_if}{$protocol_text} from {$subnet_if} to {$target}\n";
+ $natrules .= "nat on {$subnet_if}{$protocol_text} from {$subnet} to {$target} -> {$ifsubnet_ip}{$static_port}\n";
+ }
+ }
+ }
+
+ if (!empty($natrules)) {
+ $natrules .= "\n";
+ }
+
+ return $natrules;
+}
+
+function filter_generate_reflection_proxy($rule, $nordr, $rdr_ifs, $srcaddr, $dstaddr_port, &$starting_localhost_port, &$reflection_txt) {
+ global $FilterIflist, $config;
+
+ // Initialize natrules holder string
+ $natrules = "";
+ $reflection_txt = array();
+
+ if (!empty($rdr_ifs)) {
+ if ($config['system']['reflectiontimeout']) {
+ $reflectiontimeout = $config['system']['reflectiontimeout'];
+ } else {
+ $reflectiontimeout = "2000";
+ }
+
+ update_filter_reload_status(sprintf(gettext("Creating reflection rule for %s..."), $rule['descr']));
+
+ $rdr_if_list = implode(" ", $rdr_ifs);
+ if (count($rdr_ifs) > 1) {
+ $rdr_if_list = "{ {$rdr_if_list} }";
+ }
+
+ $natrules .= "\n# Reflection redirects\n";
+
+ $localport = $rule['local-port'];
+ if (!empty($localport) && is_alias($localport)) {
+ $localport = filter_expand_alias($localport);
+ $localport = explode(" ", trim($localport));
+ // The translation port for rdr, when specified, does not support more than one port or range.
+ // Emulating for behavior consistent with the original port forward.
+ $localport = $localport[0];
+ }
+
+ if (is_alias($rule['destination']['port'])) {
+ if (empty($localport) || $rule['destination']['port'] == $rule['local-port']) {
+ $dstport = filter_expand_alias($rule['destination']['port']);
+ $dstport = array_filter(explode(" ", trim($dstport)));
+ $localport = "";
+ } else if (!empty($localport)) {
+ $dstport = array($localport);
+ }
+ } else {
+ $dstport = array(str_replace("-", ":", $rule['destination']['port']));
+ $dstport_split = explode(":", $dstport[0]);
+
+ if (!empty($localport) && $dstport_split[0] != $rule['local-port']) {
+ if (!is_alias($rule['local-port']) && $dstport_split[1] && $dstport_split[0] != $dstport_split[1]) {
+ $localendport = $localport + ($dstport_split[1] - $dstport_split[0]);
+ $localport .= ":$localendport";
+ }
+
+ $dstport = array($localport);
+ } else {
+ $localport = "";
+ }
+ }
+
+ $dstaddr = explode(" ", $dstaddr_port);
+ if ($dstaddr[2]) {
+ $rflctintrange = array_pop($dstaddr);
+ array_pop($dstaddr);
+ } else {
+ return "";
+ }
+ $dstaddr = implode(" ", $dstaddr);
+ if (empty($dstaddr) || trim($dstaddr) == "0.0.0.0" || strtolower(trim($dstaddr)) == "port") {
+ return "";
+ }
+
+ if (isset($rule['destination']['any'])) {
+ if (!$rule['interface']) {
+ $natif = "wan";
+ } else {
+ $natif = $rule['interface'];
+ }
+
+ if (!isset($FilterIflist[$natif])) {
+ return "";
+ }
+ if (is_ipaddr($FilterIflist[$natif]['ip'])) {
+ $dstaddr = $FilterIflist[$natif]['ip'];
+ } else {
+ return "";
+ }
+
+ if (!empty($FilterIflist[$natif]['sn'])) {
+ $dstaddr = gen_subnet($dstaddr, $FilterIflist[$natif]['sn']) . '/' . $FilterIflist[$natif]['sn'];
+ }
+ }
+
+ switch ($rule['protocol']) {
+ case "tcp/udp":
+ $protocol = "{ tcp udp }";
+ $reflect_protos = array('tcp', 'udp');
+ break;
+ case "tcp":
+ case "udp":
+ $protocol = $rule['protocol'];
+ $reflect_protos = array($rule['protocol']);
+ break;
+ default:
+ return "";
+ break;
+ }
+
+ if (!empty($nordr)) {
+ $natrules .= "no rdr on {$rdr_if_list} proto {$protocol} from {$srcaddr} to {$dstaddr} port {$rflctintrange}\n";
+ return $natrules;
+ }
+
+ if (is_alias($rule['target'])) {
+ $target = filter_expand_alias($rule['target']);
+ } else if (is_ipaddr($rule['target'])) {
+ $target = $rule['target'];
+ } else if (is_ipaddr($FilterIflist[$rule['target']]['ip'])) {
+ $target = $FilterIflist[$rule['target']]['ip'];
+ } else {
+ return "";
+ }
+ $starting_localhost_port_tmp = $starting_localhost_port;
+ $toomanyports = false;
+ /* only install reflection rules for < 19991 items */
+ foreach ($dstport as $loc_pt) {
+ if ($starting_localhost_port < 19991) {
+ $toadd_array = array();
+ $inetdport = $starting_localhost_port;
+ $rflctrange = $starting_localhost_port;
+
+ $loc_pt = explode(":", $loc_pt);
+ if ($loc_pt[1] && $loc_pt[1] > $loc_pt[0]) {
+ $delta = $loc_pt[1] - $loc_pt[0];
+ } else {
+ $delta = 0;
+ }
+
+ if (($inetdport + $delta + 1) - $starting_localhost_port_tmp > 500) {
+ log_error("Not installing NAT reflection rules for a port range > 500");
+ $inetdport = $starting_localhost_port;
+ $toadd_array = array();
+ $toomanyports = true;
+ break;
+ } else if (($inetdport + $delta) > 19990) {
+ log_error("Installing partial NAT reflection rules. Maximum 1,000 reached.");
+ $delta = 19990 - $inetdport;
+ $loc_pt[1] = $loc_pt[0] + $delta;
+ if ($delta == 0) {
+ unset($loc_pt[1]);
+ }
+ $toomanyports = true;
+
+ if (!empty($localport)) {
+ if (is_alias($rule['destination']['port'])) {
+ $rflctintrange = alias_expand($rule['destination']['port']);
+ } else {
+ if ($dstport_split[1]) {
+ $dstport_split[1] = $dstport_split[0] + $inetdport + $delta - $starting_localhost_port;
+ }
+ $rflctintrange = implode(":", $dstport_split);
+ }
+ }
+ }
+
+ if (empty($localport)) {
+ $rflctintrange = implode(":", $loc_pt);
+ }
+ if ($inetdport + $delta > $starting_localhost_port) {
+ $rflctrange .= ":" . ($inetdport + $delta);
+ }
+ $starting_localhost_port = $inetdport + $delta + 1;
+ $toadd_array = array_merge($toadd_array, range($loc_pt[0], $loc_pt[0] + $delta));
+
+ if (!empty($toadd_array)) {
+ $rtarget = explode(" ", trim($target));
+ foreach ($toadd_array as $tda) {
+ if (empty($tda)) {
+ continue;
+ }
+ foreach ($reflect_protos as $reflect_proto) {
+ if ($reflect_proto == "udp") {
+ $socktype = "dgram";
+ $dash_u = "-u ";
+ $wait = "wait\t";
+ } else {
+ $socktype = "stream";
+ $dash_u = "";
+ $wait = "nowait/0";
+ }
+ foreach ($rtarget as $targip) {
+ if (empty($targip)) {
+ continue;
+ }
+ $reflection_txt[] = "{$inetdport}\t{$socktype}\t{$reflect_proto}\t{$wait}\tnobody\t/usr/bin/nc\tnc {$dash_u}-w {$reflectiontimeout} {$targip} {$tda}\n";
+ }
+ }
+ $inetdport++;
+ }
+ $natrules .= "rdr on {$rdr_if_list} proto {$protocol} from {$srcaddr} to {$dstaddr} port {$rflctintrange} tag PFREFLECT -> 127.0.0.1 port {$rflctrange}\n";
+ }
+ }
+
+ if ($toomanyports) {
+ break;
+ }
+ }
+
+ $reflection_txt = array_unique($reflection_txt);
+ }
+
+ return $natrules;
+}
+
+function filter_nat_rules_automatic_tonathosts($with_descr = false) {
+ global $config, $FilterIflist, $GatewaysList;
+
+ $tonathosts = array("127.0.0.0/8");
+ $descriptions = array(gettext("localhost"));
+
+ foreach (get_staticroutes() as $route) {
+ $netip = explode("/", $route['network']);
+ if (isset($GatewaysList[$route['gateway']])) {
+ $gateway =& $GatewaysList[$route['gateway']];
+ if (!interface_has_gateway($gateway['interface']) && is_private_ip($netip[0])) {
+ $tonathosts[] = $route['network'];
+ $descriptions[] = gettext("static route");
+ }
+ }
+ }
+
+ /* create outbound nat entries for all local networks */
+ foreach ($FilterIflist as $ocname => $oc) {
+ if (interface_has_gateway($ocname)) {
+ continue;
+ }
+ if (is_ipaddr($oc['alias-address'])) {
+ $tonathosts[] = "{$oc['alias-address']}/{$oc['alias-subnet']}";
+ $descriptions[] = $oc['descr'] . " " . gettext("DHCP alias address");
+ }
+ if ($oc['sa']) {
+ $tonathosts[] = "{$oc['sa']}/{$oc['sn']}";
+ $descriptions[] = $oc['descr'];
+ if (isset($oc['vips']) && is_array($oc['vips'])) {
+ $if_subnets = array("{$oc['sa']}/{$oc['sn']}");
+ foreach ($oc['vips'] as $vip) {
+ if (!is_ipaddrv4($vip['ip'])) {
+ continue;
+ }
+
+ foreach ($if_subnets as $subnet) {
+ if (ip_in_subnet($vip['ip'], $subnet)) {
+ continue 2;
+ }
+ }
+
+ $network = gen_subnet($vip['ip'], $vip['sn']);
+ array_unshift($tonathosts, $network . '/' . $vip['sn']);
+ array_unshift($descriptions, "Virtual IP ({$oc['descr']})");
+ $if_subnets[] = $network . '/' . $vip['sn'];
+ unset($network);
+ }
+ unset($if_subnets);
+ }
+ }
+ }
+
+ /* PPTP subnet */
+ if (($config['pptpd']['mode'] == "server") && is_private_ip($config['pptpd']['remoteip'])) {
+ if (isset($config['pptpd']['n_pptp_units']) && is_numeric($config['pptpd']['n_pptp_units'])) {
+ $pptp_subnets = ip_range_to_subnet_array($config['pptpd']['remoteip'],
+ long2ip32(ip2long($config['pptpd']['remoteip'])+($config['pptpd']['n_pptp_units']-1)));
+ } else {
+ $pptp_subnets = ip_range_to_subnet_array($config['pptpd']['remoteip'],
+ long2ip32(ip2long($config['pptpd']['remoteip'])));
+ }
+
+ foreach ($pptp_subnets as $subnet) {
+ $tonathosts[] = $subnet;
+ $descriptions[] = gettext("PPTP server");
+ }
+ }
+
+ /* PPPoE subnet */
+ if (is_array($FilterIflist['pppoe'])) {
+ foreach ($FilterIflist['pppoe'] as $pppoe) {
+ if (is_private_ip($pppoe['ip'])) {
+ $tonathosts[] = "{$pppoe['sa']}/{$pppoe['sn']}";
+ $descriptions[] = gettext("PPPoE server");
+ }
+ }
+ }
+
+ /* L2TP subnet */
+ if (isset($FilterIflist['l2tp']) && $FilterIflist['l2tp']['mode'] == "server") {
+ $l2tp_sa = $FilterIflist['l2tp']['sa'];
+ $l2tp_sn = $FilterIflist['l2tp']['sn'];
+ if (is_private_ip($l2tp_sa) && !empty($l2tp_sn)) {
+ $tonathosts[] = "{$l2tp_sa}/{$l2tp_sn}";
+ $descriptions[] = gettext("L2TP server");
+ }
+ }
+
+ /* add openvpn interfaces */
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $ovpnsrv) {
+ if (!isset($ovpnsrv['disable']) && !empty($ovpnsrv['tunnel_network'])) {
+ $tonathosts[] = $ovpnsrv['tunnel_network'];
+ $descriptions[] = gettext("OpenVPN server");
+ }
+ }
+ }
+
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as $ovpncli) {
+ if (!isset($ovpncli['disable']) && !empty($ovpncli['tunnel_network'])) {
+ $tonathosts[] = $ovpncli['tunnel_network'];
+ $descriptions[] = gettext("OpenVPN client");
+ }
+ }
+ }
+
+ /* IPsec mode_cfg subnet */
+ if ((isset($config['ipsec']['client']['enable'])) &&
+ (!empty($config['ipsec']['client']['pool_address'])) &&
+ (!empty($config['ipsec']['client']['pool_netbits']))) {
+ $tonathosts[] = "{$config['ipsec']['client']['pool_address']}/{$config['ipsec']['client']['pool_netbits']}";
+ $descriptions[] = gettext("IPsec client");
+ }
+
+ if ($with_descr) {
+ $combined = array();
+ foreach ($tonathosts as $idx => $subnet) {
+ $combined[] = array(
+ "subnet" => $subnet,
+ "descr" => $descriptions[$idx]);
+ }
+
+ return $combined;
+ } else {
+ return $tonathosts;
+ }
+}
+
+function filter_nat_rules_outbound_automatic($src) {
+ global $config, $FilterIflist;
+
+ $rules = array();
+ foreach ($FilterIflist as $if => $ifcfg) {
+ if (substr($ifcfg['if'], 0, 4) == "ovpn") {
+ continue;
+ }
+ if (!interface_has_gateway($if)) {
+ continue;
+ }
+
+ $natent = array();
+ $natent['interface'] = $if;
+ $natent['source']['network'] = $src;
+ $natent['dstport'] = "500";
+ $natent['target'] = "";
+ $natent['destination']['any'] = true;
+ $natent['staticnatport'] = true;
+ $natent['descr'] = gettext('Auto created rule for ISAKMP');
+ $rules[] = $natent;
+
+ $natent = array();
+ $natent['interface'] = $if;
+ $natent['source']['network'] = $src;
+ $natent['sourceport'] = "";
+ $natent['target'] = "";
+ $natent['destination']['any'] = true;
+ $natent['natport'] = "";
+ $natent['descr'] = gettext('Auto created rule');
+ if (isset($ifcfg['nonat'])) {
+ $natent['nonat'] = true;
+ }
+ $rules[] = $natent;
+ }
+
+ return $rules;
+}
+
+/* Generate a 'nat on' or 'no nat on' rule for given interface */
+function filter_nat_rules_generate_if ($if, $src = "any", $srcport = "", $dst = "any", $dstport = "", $natip = "", $natport = "", $nonat = false, $staticnatport = false, $proto = "", $poolopts = "") {
+ global $config, $FilterIflist;
+ /* XXX: billm - any idea if this code is needed? */
+ if ($src == "/32" || $src{0} == "/") {
+ return "# src incorrectly specified\n";
+ }
+ if ($natip != "") {
+ if (is_subnet($natip)) {
+ $tgt = $natip;
+ } elseif (is_alias($natip)) {
+ $tgt = "\${$natip}";
+ } else {
+ $tgt = "{$natip}/32";
+ }
+ } else {
+ $natip = get_interface_ip($if);
+ if (is_ipaddr($natip)) {
+ $tgt = "{$natip}/32";
+ } else {
+ $tgt = "(" . $FilterIflist[$if]['if'] . ")";
+ }
+ }
+ /* Add the protocol, if defined */
+ if (!empty($proto) && $proto != "any") {
+ if ($proto == "tcp/udp") {
+ $protocol = " proto { tcp udp }";
+ } else {
+ $protocol = " proto {$proto}";
+ }
+ } else {
+ $protocol = "";
+ }
+ /* Set tgt for IPv6 */
+ if ($proto == "ipv6") {
+ $natip = get_interface_ipv6($if);
+ if (is_ipaddrv6($natip)) {
+ $tgt = "{$natip}/128";
+ }
+ }
+ /* Add the hard set source port (useful for ISAKMP) */
+ if ($natport != "") {
+ $tgt .= " port {$natport}";
+ }
+ /* sometimes this gets called with "" instead of a value */
+ if ($src == "") {
+ $src = "any";
+ }
+ /* Match on this source port */
+ if ($srcport != "") {
+ $srcportexpand = alias_expand($srcport);
+ if (!$srcportexpand) {
+ $srcportexpand = $srcport;
+ }
+ $src .= " port {$srcportexpand}";
+ }
+ /* sometimes this gets called with "" instead of a value */
+ if ($dst == "") {
+ $dst = "any";
+ }
+ /* Match on this dest port */
+ if ($dstport != "") {
+ $dstportexpand = alias_expand($dstport);
+ if (!$dstportexpand) {
+ $dstportexpand = $dstport;
+ }
+ $dst .= " port {$dstportexpand}";
+ }
+ /* outgoing static-port option, hamachi, Grandstream, VOIP, etc */
+ $staticnatport_txt = "";
+ if ($staticnatport) {
+ $staticnatport_txt = "static-port";
+ } elseif (!$natport) {
+ $tgt .= " port 1024:65535"; // set source port range
+ }
+ /* Allow for negating NAT entries */
+ if ($nonat) {
+ $nat = "no nat";
+ $target = "";
+ $staticnatport_txt = "";
+ $poolopts = "";
+ } else {
+ $nat = "nat";
+ $target = "-> {$tgt}";
+ }
+ $if_friendly = $FilterIflist[$if]['descr'];
+ /* Put all the pieces together */
+ if ($if_friendly) {
+ $natrule = "{$nat} on \${$if_friendly} {$protocol} from {$src} to {$dst} {$target} {$poolopts} {$staticnatport_txt}\n";
+ } else {
+ $natrule .= "# Could not convert {$if} to friendly name(alias)\n";
+ }
+ return $natrule;
+}
+
+function filter_nat_rules_generate() {
+ global $config, $g, $after_filter_configure_run, $FilterIflist, $GatewaysList, $aliases;
+
+ $natrules = "no nat proto carp\n";
+ $natrules .= "no rdr proto carp\n";
+ $natrules .= "nat-anchor \"natearly/*\"\n";
+
+ $natrules .= "nat-anchor \"natrules/*\"\n\n";
+ update_filter_reload_status(gettext("Creating 1:1 rules..."));
+
+ $reflection_txt = "";
+ $route_table = "";
+
+ /* any 1:1 mappings? */
+ if (is_array($config['nat']['onetoone'])) {
+ foreach ($config['nat']['onetoone'] as $rule) {
+ if (isset($rule['disabled'])) {
+ continue;
+ }
+
+ $sn = "";
+ $sn1 = "";
+ $target = alias_expand($rule['external']);
+ if (!$target) {
+ $natrules .= "# Unresolvable alias {$rule['target']}\n";
+ continue; /* unresolvable alias */
+ }
+
+ if (!$rule['interface']) {
+ $natif = "wan";
+ } else {
+ $natif = $rule['interface'];
+ }
+ if (!isset($FilterIflist[$natif])) {
+ continue;
+ }
+
+ $srcaddr = filter_generate_address($rule, 'source');
+ $dstaddr = filter_generate_address($rule, 'destination');
+ if (!$dstaddr) {
+ $dstaddr = $FilterIflist[$natif]['ip'];
+ }
+
+ $srcaddr = trim($srcaddr);
+ $dstaddr = trim($dstaddr);
+
+ $tmp = explode('/', $srcaddr);
+ $srcip = $tmp[0];
+ if (!empty($tmp[1]) && is_numeric($tmp[1])) {
+ $sn = $tmp[1];
+ $sn1 = "/{$sn}";
+ }
+
+ $natif = $FilterIflist[$natif]['if'];
+
+ /*
+ * If reflection is enabled, turn on extra redirections
+ * for this rule by adding other interfaces to an rdr rule.
+ */
+ if ((isset($config['system']['enablebinatreflection']) || $rule['natreflection'] == "enable") &&
+ ($rule['natreflection'] != "disable")) {
+ $nat_if_list = filter_get_reflection_interfaces($natif);
+ } else {
+ $nat_if_list = array();
+ }
+
+ $natrules .= "binat on {$natif} from {$srcaddr} to {$dstaddr} -> {$target}{$sn1}\n";
+ if (!empty($nat_if_list)) {
+ $binat_if_list = implode(" ", $nat_if_list);
+ $binat_if_list = "{ {$binat_if_list} }";
+ $reflection_txt .= "rdr on {$binat_if_list} from {$dstaddr} to {$target}{$sn1} -> {$srcaddr} bitmask\n";
+ }
+
+ $nat_if_list = array_merge(array($natif), $nat_if_list);
+ $reflection_txt .= filter_generate_reflection_nat($rule, $route_table, $nat_if_list, "", $srcaddr, $srcip, $sn);
+ }
+ }
+
+ /* Add binat rules for Network Prefix translation */
+ if (is_array($config['nat']['npt'])) {
+ foreach ($config['nat']['npt'] as $rule) {
+ if (isset($rule['disabled'])) {
+ continue;
+ }
+
+ if (!$rule['interface']) {
+ $natif = "wan";
+ } else {
+ $natif = $rule['interface'];
+ }
+ if (!isset($FilterIflist[$natif])) {
+ continue;
+ }
+
+ $srcaddr = filter_generate_address($rule, 'source');
+ $dstaddr = filter_generate_address($rule, 'destination');
+
+ $srcaddr = trim($srcaddr);
+ $dstaddr = trim($dstaddr);
+
+ $natif = $FilterIflist[$natif]['descr'];
+
+ $natrules .= "binat on \${$natif} from {$srcaddr} to any -> {$dstaddr}\n";
+ $natrules .= "binat on \${$natif} from any to {$dstaddr} -> {$srcaddr}\n";
+
+ }
+ }
+
+ /* ipsec nat */
+ if (is_array($config['ipsec']) && isset($config['ipsec']['enable'])) {
+ if (is_array($config['ipsec']['phase2'])) {
+ foreach ($config['ipsec']['phase2'] as $ph2ent) {
+ if ($ph2ent['mode'] != 'transport' && !empty($ph2ent['natlocalid'])) {
+ if (!function_exists('ipsec_idinfo_to_cidr')) {
+ require_once("ipsec.inc");
+ }
+ if (!is_array($ph2ent['localid'])) {
+ $ph2ent['localid'] = array();
+ }
+ $ph2ent['localid']['mode'] = $ph2ent['mode'];
+ $local_subnet = ipsec_idinfo_to_cidr($ph2ent['localid']);
+ if (empty($local_subnet) || $local_subnet == "0.0.0.0/0") {
+ continue;
+ }
+ if (!is_subnet($local_subnet) && !is_ipaddr($local_subnet)) {
+ continue;
+ }
+ if (!is_array($ph2ent['natlocalid'])) {
+ $ph2ent['natlocalid'] = array();
+ }
+ $ph2ent['natlocalid']['mode'] = $ph2ent['mode'];
+ $natlocal_subnet = ipsec_idinfo_to_cidr($ph2ent['natlocalid']);
+ if (empty($natlocal_subnet) || $natlocal_subnet == "0.0.0.0/0") {
+ continue;
+ }
+ if (!is_subnet($natlocal_subnet) && !is_ipaddr($natlocal_subnet)) {
+ continue;
+ }
+ if (!is_array($ph2ent['remoteid'])) {
+ $ph2ent['remoteid'] = array();
+ }
+ $ph2ent['remoteid']['mode'] = $ph2ent['mode'];
+ $remote_subnet = ipsec_idinfo_to_cidr($ph2ent['remoteid']);
+ if (empty($remote_subnet)) {
+ continue;
+ }
+ if (!is_subnet($remote_subnet) && !is_ipaddr($remote_subnet)) {
+ continue;
+ }
+ if ($remote_subnet == "0.0.0.0/0") {
+ $remote_subnet = "any";
+ }
+ if (is_ipaddr($natlocal_subnet) && !is_ipaddr($local_subnet)) {
+ $nattype = "nat";
+ } else {
+ list($natnet, $natmask) = explode('/', $natlocal_subnet);
+ list($locnet, $locmask) = explode('/', $local_subnet);
+ if (intval($natmask) != intval($locmask)) {
+ $nattype = "nat";
+ } else {
+ $nattype = "binat";
+ }
+ unset($natnet, $natmask, $locnet, $locmask);
+ }
+ $natrules .= "{$nattype} on enc0 from {$local_subnet} to {$remote_subnet} -> {$natlocal_subnet}\n";
+ }
+ }
+ }
+ }
+
+ if ($config['nat']['outbound']['mode'] == "disabled") {
+ $natrules .= "\n# Outbound NAT rules are disabled\n";
+ }
+
+ if ($config['nat']['outbound']['mode'] == "advanced" || $config['nat']['outbound']['mode'] == "hybrid") {
+ $natrules .= "\n# Outbound NAT rules (manual)\n";
+ /* advanced outbound rules */
+ if (is_array($config['nat']['outbound']['rule'])) {
+ foreach ($config['nat']['outbound']['rule'] as $obent) {
+ if (isset($obent['disabled'])) {
+ continue;
+ }
+ update_filter_reload_status(sprintf(gettext("Creating advanced outbound rule %s"), $obent['descr']));
+ $src = alias_expand($obent['source']['network']);
+ if (!$src) {
+ $src = $obent['source']['network'];
+ }
+ $dst = alias_expand($obent['destination']['address']);
+ if (!$dst) {
+ $dst = $obent['destination']['address'];
+ }
+ if (isset($obent['destination']['not']) && !isset($obent['destination']['any'])) {
+ $dst = "!" . $dst;
+ }
+
+ if (!$obent['interface'] || !isset($FilterIflist[$obent['interface']])) {
+ continue;
+ }
+
+ $obtarget = ($obent['target'] == "other-subnet") ? $obent['targetip'] . '/' . $obent['targetip_subnet']: $obent['target'];
+ $poolopts = (is_subnet($obtarget) || is_alias($obtarget)) ? $obent['poolopts'] : "";
+
+ $natrules .= filter_nat_rules_generate_if($obent['interface'],
+ $src,
+ $obent['sourceport'],
+ $dst,
+ $obent['dstport'],
+ $obtarget,
+ $obent['natport'],
+ isset($obent['nonat']),
+ isset($obent['staticnatport']),
+ $obent['protocol'],
+ $poolopts
+ );
+ }
+ }
+ }
+
+ /* outbound rules */
+ if ((!isset($config['nat']['outbound']['mode'])) ||
+ ($config['nat']['outbound']['mode'] == "automatic") ||
+ ($config['nat']['outbound']['mode'] == "hybrid")) {
+ $natrules .= "\n# Outbound NAT rules (automatic)\n";
+ /* standard outbound rules (one for each interface) */
+ update_filter_reload_status(gettext("Creating outbound NAT rules"));
+ $tonathosts_array = filter_nat_rules_automatic_tonathosts();
+ $tonathosts = implode(" ", $tonathosts_array);
+ $numberofnathosts = count($tonathosts_array);
+
+ $natrules .= "\n# Subnets to NAT \n";
+ if ($numberofnathosts > 0) {
+ update_filter_reload_status(gettext('Creating automatic outbound rules'));
+
+ if ($numberofnathosts > 4) {
+ $natrules .= "table <tonatsubnets> { {$tonathosts} }\n";
+ $macroortable = "<tonatsubnets>";
+ } else {
+ $natrules .= "tonatsubnets = \"{ {$tonathosts} }\"\n";
+ $macroortable = "\$tonatsubnets";
+ }
+
+ $a_outs = filter_nat_rules_outbound_automatic($macroortable);
+ foreach ($a_outs as $a_out) {
+ $natrules .= filter_nat_rules_generate_if($a_out['interface'],
+ $a_out['source']['network'],
+ $a_out['sourceport'],
+ $a_out['destination']['address'],
+ $a_out['dstport'],
+ $a_out['target'],
+ $a_out['natport'],
+ isset($a_out['nonat']),
+ isset($a_out['staticnatport']));
+ }
+ }
+ unset($tonathosts, $tonathosts_array, $numberofnathosts);
+ }
+
+ /* load balancer anchor */
+ $natrules .= "\n# Load balancing anchor\n";
+ $natrules .= "rdr-anchor \"relayd/*\"\n";
+
+ update_filter_reload_status(gettext("Setting up TFTP helper"));
+ $natrules .= "# TFTP proxy\n";
+ $natrules .= "rdr-anchor \"tftp-proxy/*\"\n";
+
+ if (!empty($config['system']['tftpinterface'])) {
+ $tftpifs = explode(",", $config['system']['tftpinterface']);
+ foreach ($tftpifs as $tftpif) {
+ if ($FilterIflist[$tftpif]) {
+ $natrules .= "rdr pass on {$FilterIflist[$tftpif]['if']} proto udp from any to any port tftp -> 127.0.0.1 port 6969\n";
+ }
+ }
+ }
+
+ /* DIAG: add ipv6 NAT, if requested */
+ if ((isset($config['diag']['ipv6nat']['enable'])) &&
+ (is_ipaddr($config['diag']['ipv6nat']['ipaddr'])) &&
+ (is_array($FilterIflist['wan']))) {
+ /* XXX: FIX ME! IPV6 */
+ $natrules .= "rdr on \${$FilterIflist['wan']['descr']} proto ipv6 from any to any -> {$config['diag']['ipv6nat']['ipaddr']}\n";
+ }
+
+ if (file_exists("/var/etc/inetd.conf")) {
+ @unlink("/var/etc/inetd.conf");
+ }
+ // Open inetd.conf write handle
+ $inetd_fd = fopen("/var/etc/inetd.conf", "w");
+ /* add tftp protocol helper */
+ fwrite($inetd_fd, "tftp-proxy\tdgram\tudp\twait\t\troot\t/usr/libexec/tftp-proxy\ttftp-proxy -v\n");
+
+ if (isset($config['nat']['rule'])) {
+ /* start reflection redirects on port 19000 of localhost */
+ $starting_localhost_port = 19000;
+ $natrules .= "# NAT Inbound Redirects\n";
+ foreach ($config['nat']['rule'] as $rule) {
+ update_filter_reload_status(sprintf(gettext("Creating NAT rule %s"), $rule['descr']));
+
+ if (isset($rule['disabled'])) {
+ continue;
+ }
+
+ /* if item is an alias, expand */
+ $dstport = "";
+ $dstport[0] = alias_expand($rule['destination']['port']);
+ if (!$dstport[0]) {
+ $dstport = explode("-", $rule['destination']['port']);
+ }
+
+ /* if item is an alias, expand */
+ $localport = alias_expand($rule['local-port']);
+ if (!$localport || $dstport[0] == $localport) {
+ $localport = "";
+ } else if (is_alias($rule['local-port'])) {
+ $localport = filter_expand_alias($rule['local-port']);
+ if ($localport) {
+ $localport = explode(" ", trim($localport));
+ $localport = $localport[0];
+ $localport = " port {$localport}";
+ }
+ } else if (is_alias($rule['destination']['port'])) {
+ $localport = " port {$localport}";
+ } else {
+ if (($dstport[1]) && ($dstport[0] != $dstport[1])) {
+ $localendport = $localport + ($dstport[1] - $dstport[0]);
+
+ $localport .= ":$localendport";
+ }
+
+ $localport = " port {$localport}";
+ }
+
+ switch (strtolower($rule['protocol'])) {
+ case "tcp/udp":
+ $protocol = "{ tcp udp }";
+ break;
+ case "tcp":
+ case "udp":
+ $protocol = strtolower($rule['protocol']);
+ break;
+ default:
+ $protocol = strtolower($rule['protocol']);
+ $localport = "";
+ break;
+ }
+
+ $target = alias_expand($rule['target']);
+ if (!$target && !isset($rule['nordr'])) {
+ $natrules .= "# Unresolvable alias {$rule['target']}\n";
+ continue; /* unresolvable alias */
+ }
+
+ if (is_alias($rule['target'])) {
+ $target_ip = filter_expand_alias($rule['target']);
+ } else if (is_ipaddr($rule['target'])) {
+ $target_ip = $rule['target'];
+ } else if (is_ipaddr($FilterIflist[$rule['target']]['ip'])) {
+ $target_ip = $FilterIflist[$rule['target']]['ip'];
+ } else {
+ $target_ip = $rule['target'];
+ }
+ $target_ip = trim($target_ip);
+
+ if ($rule['associated-rule-id'] == "pass") {
+ $rdrpass = "pass ";
+ } else {
+ $rdrpass = "";
+ }
+
+ if (isset($rule['nordr'])) {
+ $nordr = "no ";
+ $rdrpass = "";
+ } else {
+ $nordr = "";
+ }
+
+ if (!$rule['interface']) {
+ $natif = "wan";
+ } else {
+ $natif = $rule['interface'];
+ }
+
+ if (!isset($FilterIflist[$natif])) {
+ continue;
+ }
+
+ $srcaddr = filter_generate_address($rule, 'source', true);
+ $dstaddr = filter_generate_address($rule, 'destination', true);
+ $srcaddr = trim($srcaddr);
+ $dstaddr = trim($dstaddr);
+
+ if (!$dstaddr) {
+ $dstaddr = $FilterIflist[$natif]['ip'];
+ }
+
+ $dstaddr_port = explode(" ", $dstaddr);
+ if (empty($dstaddr_port[0]) || strtolower(trim($dstaddr_port[0])) == "port") {
+ continue; // Skip port forward if no destination address found
+ }
+ $dstaddr_reflect = $dstaddr;
+ if (isset($rule['destination']['any'])) {
+ /* With reflection enabled, destination of 'any' has side effects
+ * that most people would not expect, so change it on reflection rules. */
+
+ if (!empty($FilterIflist[$natif]['ip'])) {
+ $dstaddr_reflect = $FilterIflist[$natif]['ip'];
+ } else {
+ // no IP, bail
+ continue;
+ }
+
+ if (!empty($FilterIflist[$natif]['sn'])) {
+ $dstaddr_reflect = gen_subnet($dstaddr_reflect, $FilterIflist[$natif]['sn']) . '/' . $FilterIflist[$natif]['sn'];
+ }
+
+ if ($dstaddr_port[2]) {
+ $dstaddr_reflect .= " port " . $dstaddr_port[2];
+ }
+ }
+
+ $natif = $FilterIflist[$natif]['if'];
+
+ $reflection_type = "none";
+ if ($rule['natreflection'] != "disable" && $dstaddr_port[0] != "0.0.0.0") {
+ if ($rule['natreflection'] == "enable") {
+ $reflection_type = "proxy";
+ } else if ($rule['natreflection'] == "purenat") {
+ $reflection_type = "purenat";
+ } else if (!isset($config['system']['disablenatreflection'])) {
+ if (isset($config['system']['enablenatreflectionpurenat'])) {
+ $reflection_type = "purenat";
+ } else {
+ $reflection_type = "proxy";
+ }
+ }
+ }
+
+ if ($reflection_type != "none") {
+ $nat_if_list = filter_get_reflection_interfaces($natif);
+ } else {
+ $nat_if_list = array();
+ }
+
+ if (empty($nat_if_list)) {
+ $reflection_type = "none";
+ }
+
+ $localport_nat = $localport;
+ if (empty($localport_nat) && $dstaddr_port[2]) {
+ $localport_nat = " port " . $dstaddr_port[2];
+ }
+
+ if ($srcaddr <> "" && $dstaddr <> "" && $natif) {
+ $natrules .= "{$nordr}rdr {$rdrpass}on {$natif} proto {$protocol} from {$srcaddr} to {$dstaddr}" . ($nordr == "" ? " -> {$target}{$localport}" : "");
+
+ /* Does this rule redirect back to a internal host? */
+ if (isset($rule['destination']['any']) && !isset($rule['nordr']) && !isset($config['system']['enablenatreflectionhelper']) && !interface_has_gateway($rule['interface'])) {
+ $rule_interface_ip = find_interface_ip($natif);
+ $rule_interface_subnet = find_interface_subnet($natif);
+ if (!empty($rule_interface_ip) && !empty($rule_interface_subnet)) {
+ $rule_subnet = gen_subnet($rule_interface_ip, $rule_interface_subnet);
+ $natrules .= "\n";
+ $natrules .= "no nat on {$natif} proto tcp from ({$natif}) to {$rule_subnet}/{$rule_interface_subnet}\n";
+ $natrules .= "nat on {$natif} proto tcp from {$rule_subnet}/{$rule_interface_subnet} to {$target} port {$dstport[0]} -> ({$natif})\n";
+ }
+ }
+
+ if ($reflection_type != "none") {
+ if ($reflection_type == "proxy" && !isset($rule['nordr'])) {
+ $natrules .= filter_generate_reflection_proxy($rule, $nordr, $nat_if_list, $srcaddr, $dstaddr, $starting_localhost_port, $reflection_rules);
+ $nat_if_list = array($natif);
+ foreach ($reflection_rules as $txtline) {
+ fwrite($inetd_fd, $txtline);
+ }
+ } else if ($reflection_type == "purenat" || isset($rule['nordr'])) {
+ $rdr_if_list = implode(" ", $nat_if_list);
+ if (count($nat_if_list) > 1) {
+ $rdr_if_list = "{ {$rdr_if_list} }";
+ }
+ $natrules .= "\n# Reflection redirect\n";
+ $natrules .= "{$nordr}rdr {$rdrpass}on {$rdr_if_list} proto {$protocol} from {$srcaddr} to {$dstaddr_reflect}" . ($nordr == "" ? " -> {$target}{$localport}" : "");
+ $nat_if_list = array_merge(array($natif), $nat_if_list);
+ }
+ }
+
+ if (empty($nat_if_list)) {
+ $nat_if_list = array($natif);
+ }
+
+ $natrules .= "\n";
+ if (!isset($rule['nordr'])) {
+ $natrules .= filter_generate_reflection_nat($rule, $route_table, $nat_if_list, $protocol, "{$target}{$localport_nat}", $target_ip);
+ }
+ }
+ }
+ }
+ fclose($inetd_fd); // Close file handle
+
+ if (isset($config['pptpd']['mode']) && ($config['pptpd']['mode'] != "off")) {
+ if ($config['pptpd']['mode'] == "redir") {
+ $pptpdtarget = $config['pptpd']['redir'];
+ $natrules .= "# PPTP\n";
+ $natrules .= "rdr on \${$FilterIflist['wan']['descr']} proto gre from any to any -> {$pptpdtarget}\n";
+ $natrules .= "rdr on \${$FilterIflist['wan']['descr']} proto tcp from any to any port 1723 -> {$pptpdtarget}\n";
+ }
+ }
+
+ $natrules .= discover_pkg_rules("nat");
+
+ $natrules .= "# UPnPd rdr anchor\n";
+ $natrules .= "rdr-anchor \"miniupnpd\"\n";
+
+ if (!empty($reflection_txt)) {
+ $natrules .= "\n# Reflection redirects and NAT for 1:1 mappings\n" . $reflection_txt;
+ }
+
+ // Check if inetd is running, if not start it. If so, restart it gracefully.
+ $helpers = isvalidproc("inetd");
+ if (file_exists("/var/etc/inetd.conf")) {
+ if (!$helpers) {
+ mwexec("/usr/sbin/inetd -wW -R 0 -a 127.0.0.1 /var/etc/inetd.conf");
+ } else {
+ sigkillbypid("/var/run/inetd.pid", "HUP");
+ }
+ }
+
+ return $natrules;
+}
+
+function filter_generate_user_rule_arr($rule) {
+ global $config;
+ update_filter_reload_status(sprintf(gettext("Creating filter rule %s ..."), $rule['descr']));
+ $ret = array();
+ $line = filter_generate_user_rule($rule);
+ $ret['rule'] = $line;
+ $ret['interface'] = $rule['interface'];
+ if ($rule['descr'] != "" and $line != "") {
+ $ret['descr'] = "label \"" . fix_rule_label("USER_RULE: {$rule['descr']}") . "\"";
+ } else {
+ $ret['descr'] = "label \"USER_RULE\"";
+ }
+
+ return $ret;
+}
+
+function filter_generate_port(& $rule, $target = "source", $isnat = false) {
+
+ $src = "";
+
+ $rule['protocol'] = strtolower($rule['protocol']);
+ if (in_array($rule['protocol'], array("tcp", "udp", "tcp/udp"))) {
+ if ($rule[$target]['port']) {
+ $srcport = explode("-", $rule[$target]['port']);
+ $srcporta = alias_expand($srcport[0]);
+ if (!$srcporta) {
+ log_error(sprintf(gettext("filter_generate_port: %s is not a valid {$target} port."), $srcport[0]));
+ } else if ((!$srcport[1]) || ($srcport[0] == $srcport[1])) {
+ $src .= " port {$srcporta} ";
+ } else if (($srcport[0] == 1) && ($srcport[1] == 65535)) {
+ /* no need for a port statement here */
+ } else if ($isnat) {
+ $src .= " port {$srcport[0]}:{$srcport[1]}";
+ } else {
+ if (is_port($srcporta) && $srcport[1] == 65535) {
+ $src .= " port >= {$srcporta} ";
+ } else if ($srcport[0] == 1) {
+ $src .= " port <= {$srcport[1]} ";
+ } else {
+ $srcport[0]--;
+ $srcport[1]++;
+ $src .= " port {$srcport[0]} >< {$srcport[1]} ";
+ }
+ }
+ }
+ }
+
+ return $src;
+}
+
+function filter_address_add_vips_subnets(&$subnets, $if, $not) {
+ global $FilterIflist;
+
+ $if_subnets = array($subnets);
+
+ if ($not == true) {
+ $subnets = "!{$subnets}";
+ }
+
+ if (!isset($FilterIflist[$if]['vips']) || !is_array($FilterIflist[$if]['vips'])) {
+ return;
+ }
+
+ foreach ($FilterIflist[$if]['vips'] as $vip) {
+ foreach ($if_subnets as $subnet) {
+ if (ip_in_subnet($vip['ip'], $subnet)) {
+ continue 2;
+ }
+ }
+
+ if (is_ipaddrv4($vip['ip'])) {
+ if (!is_subnetv4($if_subnets[0])) {
+ continue;
+ }
+
+ $network = gen_subnet($vip['ip'], $vip['sn']);
+ } else if (is_ipaddrv6($vip['ip'])) {
+ if (!is_subnetv6($if_subnets[0])) {
+ continue;
+ }
+
+ $network = gen_subnetv6($vip['ip'], $vip['sn']);
+ } else {
+ continue;
+ }
+
+ $subnets .= ' ' . ($not == true ? '!' : '') . $network . '/' . $vip['sn'];
+ $if_subnets[] = $network . '/' . $vip['sn'];
+ }
+ unset($if_subnets);
+
+ if (strpos($subnets, ' ') !== false) {
+ $subnets = "{ {$subnets} }";
+ }
+}
+
+function filter_generate_address(& $rule, $target = "source", $isnat = false) {
+ global $FilterIflist, $config;
+ $src = "";
+
+ if (isset($rule[$target]['any'])) {
+ $src = "any";
+ } else if ($rule[$target]['network']) {
+ if (strstr($rule[$target]['network'], "opt")) {
+ $optmatch = "";
+ $matches = "";
+ if ($rule['ipprotocol'] == "inet6") {
+ if (preg_match("/opt([0-9]*)$/", $rule[$target]['network'], $optmatch)) {
+ $opt_sa = $FilterIflist["opt{$optmatch[1]}"]['sav6'];
+ if (!is_ipaddrv6($opt_sa)) {
+ return "";
+ }
+ $src = $opt_sa . "/" . $FilterIflist["opt{$optmatch[1]}"]['snv6'];
+ /* check for opt$NUMip here */
+ } else if (preg_match("/opt([0-9]*)ip/", $rule[$target]['network'], $matches)) {
+ $src = $FilterIflist["opt{$matches[1]}"]['ipv6'];
+ if (!is_ipaddrv6($src)) {
+ return "";
+ }
+ if (isset($rule[$target]['not'])) {
+ $src = " !{$src}";
+ }
+ }
+ } else {
+ if (preg_match("/opt([0-9]*)$/", $rule[$target]['network'], $optmatch)) {
+ $opt_sa = $FilterIflist["opt{$optmatch[1]}"]['sa'];
+ if (!is_ipaddrv4($opt_sa)) {
+ return "";
+ }
+ $src = $opt_sa . "/" . $FilterIflist["opt{$optmatch[1]}"]['sn'];
+ /* check for opt$NUMip here */
+ } else if (preg_match("/opt([0-9]*)ip/", $rule[$target]['network'], $matches)) {
+ $src = $FilterIflist["opt{$matches[1]}"]['ip'];
+ if (!is_ipaddrv4($src)) {
+ return "";
+ }
+ if (isset($rule[$target]['not'])) {
+ $src = " !{$src}";
+ }
+ }
+ }
+ } else {
+ if ($rule['ipprotocol'] == "inet6") {
+ switch ($rule[$target]['network']) {
+ case 'wan':
+ $wansa = $FilterIflist['wan']['sav6'];
+ if (!is_ipaddrv6($wansa)) {
+ return "";
+ }
+ $wansn = $FilterIflist['wan']['snv6'];
+ $src = "{$wansa}/{$wansn}";
+ break;
+ case 'wanip':
+ $src = $FilterIflist["wan"]['ipv6'];
+ if (!is_ipaddrv6($src)) {
+ return "";
+ }
+ break;
+ case 'lanip':
+ $src = $FilterIflist["lan"]['ipv6'];
+ if (!is_ipaddrv6($src)) {
+ return "";
+ }
+ break;
+ case 'lan':
+ $lansa = $FilterIflist['lan']['sav6'];
+ if (!is_ipaddrv6($lansa)) {
+ return "";
+ }
+ $lansn = $FilterIflist['lan']['snv6'];
+ $src = "{$lansa}/{$lansn}";
+ break;
+ case '(self)':
+ $src = "(self)";
+ break;
+ case 'pptp':
+ $pptpsav6 = gen_subnetv6($FilterIflist['pptp']['sav6'], $FilterIflist['pptp']['snv6']);
+ $pptpsnv6 = $FilterIflist['pptp']['snv6'];
+ $src = "{$pptpsav6}/{$pptpsnv6}";
+ break;
+ case 'pppoe':
+ if (is_array($FilterIflist['pppoe'])) {
+ $pppoesav6 = gen_subnetv6($FilterIflist['pppoe'][0]['ipv6'], $FilterIflist['pppoe'][0]['snv6']);
+ $pppoesnv6 = $FilterIflist['pppoe'][0]['snv6'];
+ $src = "{$pppoesav6}/{$pppoesnv6}";
+ }
+ }
+ if (isset($rule[$target]['not']) && !is_subnet($src)) {
+ $src = " !{$src}";
+ }
+ } else {
+ switch ($rule[$target]['network']) {
+ case 'wan':
+ $wansa = $FilterIflist['wan']['sa'];
+ if (!is_ipaddrv4($wansa)) {
+ return "";
+ }
+ $wansn = $FilterIflist['wan']['sn'];
+ $src = "{$wansa}/{$wansn}";
+ break;
+ case 'wanip':
+ $src = $FilterIflist["wan"]['ip'];
+ break;
+ case 'lanip':
+ $src = $FilterIflist["lan"]['ip'];
+ break;
+ case 'lan':
+ $lansa = $FilterIflist['lan']['sa'];
+ if (!is_ipaddrv4($lansa)) {
+ return "";
+ }
+ $lansn = $FilterIflist['lan']['sn'];
+ $src = "{$lansa}/{$lansn}";
+ break;
+ case '(self)':
+ $src = "(self)";
+ break;
+ case 'pptp':
+ if (isset($config['pptpd']['n_pptp_units']) && is_numeric($config['pptpd']['n_pptp_units'])) {
+ $pptp_subnets = ip_range_to_subnet_array($config['pptpd']['remoteip'], long2ip32(ip2long($config['pptpd']['remoteip'])+($config['pptpd']['n_pptp_units']-1)));
+ } else {
+ $pptp_subnets = ip_range_to_subnet_array($config['pptpd']['remoteip'], long2ip32(ip2long($config['pptpd']['remoteip'])));
+ }
+ if (empty($pptp_subnets)) {
+ return "";
+ }
+ if (isset($rule[$target]['not'])) {
+ array_walk($pptp_subnets, function (&$value, $key) {
+ $value="!{$value}";
+ });
+ }
+ $src = "{ " . implode(" ", $pptp_subnets) . " }";
+ break;
+ case 'pppoe':
+ /* XXX: This needs to be fixed somehow! */
+ if (is_array($FilterIflist['pppoe'])) {
+ $pppoesa = gen_subnet($FilterIflist['pppoe'][0]['ip'], $FilterIflist['pppoe'][0]['sn']);
+ $pppoesn = $FilterIflist['pppoe'][0]['sn'];
+ $src = "{$pppoesa}/{$pppoesn}";
+ }
+ break;
+ }
+ if ((isset($rule[$target]['not'])) &&
+ (!is_subnet($src)) &&
+ (strpos($src, '{') === false)) {
+ $src = " !{$src}";
+ }
+ }
+ }
+ if (is_subnet($src)) {
+ filter_address_add_vips_subnets($src, $rule[$target]['network'], isset($rule[$target]['not']));
+ }
+ } else if ($rule[$target]['address']) {
+ $expsrc = alias_expand($rule[$target]['address']);
+ if (isset($rule[$target]['not'])) {
+ $not = "!";
+ } else {
+ $not = "";
+ }
+ $src = " {$not} {$expsrc}";
+ }
+
+ if (empty($src)) {
+ return '';
+ }
+
+ $src .= filter_generate_port($rule, $target, $isnat);
+
+ return $src;
+}
+
+function filter_generate_user_rule($rule) {
+ global $config, $g, $FilterIflist, $GatewaysList;
+ global $layer7_rules_list, $dummynet_name_list;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_generate_user_rule() being called $mt\n";
+ }
+ /* don't include disabled rules */
+ if (isset($rule['disabled'])) {
+ return "# rule " . $rule['descr'] . " disabled \n";
+ }
+ update_filter_reload_status("Creating filter rules {$rule['descr']} ...");
+ $pptpdcfg = $config['pptpd'];
+ $int = "";
+ $aline = array();
+
+ /* Check to see if the interface is in our list */
+ if (isset($rule['floating'])) {
+ if (isset($rule['interface']) && $rule['interface'] <> "") {
+ $interfaces = explode(",", $rule['interface']);
+ $ifliste = "";
+ foreach ($interfaces as $iface) {
+ if (array_key_exists($iface, $FilterIflist)) {
+ $ifliste .= " " . $FilterIflist[$iface]['if'] . " ";
+ }
+ }
+ if ($ifliste <> "") {
+ $aline['interface'] = " on { {$ifliste} } ";
+ } else {
+ $aline['interface'] = "";
+ }
+ } else {
+ $aline['interface'] = "";
+ }
+ } else if (!array_key_exists($rule['interface'], $FilterIflist)) {
+ foreach ($FilterIflist as $oc) {
+ $items .= $oc['descr'] . " ";
+ }
+ return "# array key \"{$rule['interface']}\" does not exist for \"" . $rule['descr'] . "\" in array: {{$items}}";
+ } else if ((array_key_exists($rule['interface'], $FilterIflist)) &&
+ (is_array($FilterIflist[$rule['interface']])) &&
+ (is_array($FilterIflist[$rule['interface']][0]))) {
+ /* Currently the only case for this is the pppoe server. There should be an existing macro with this name. */
+ $aline['interface'] = " on \$" . $rule['interface'] . " ";
+ } else {
+ $aline['interface'] = " on \$" . $FilterIflist[$rule['interface']]['descr'] . " ";
+ }
+ $ifcfg = $FilterIflist[$rule['interface']];
+ if ($pptpdcfg['mode'] != "server") {
+ if (($rule['source']['network'] == "pptp") ||
+ ($rule['destination']['network'] == "pptp")) {
+ return "# source network or destination network == pptp on " . $rule['descr'];
+ }
+ }
+
+ switch ($rule['ipprotocol']) {
+ case "inet":
+ $aline['ipprotocol'] = "inet";
+ break;
+ case "inet6":
+ $aline['ipprotocol'] = "inet6";
+ break;
+ default:
+ $aline['ipprotocol'] = "";
+ break;
+ }
+
+ /* check for unresolvable aliases */
+ if ($rule['source']['address'] && !alias_expand($rule['source']['address'])) {
+ $error_text = "Unresolvable source alias '{$rule['source']['address']}' for rule '{$rule['descr']}'";
+ file_notice("Filter_Reload", $error_text);
+ return "# {$error_text}";
+ }
+ if ($rule['destination']['address'] && !alias_expand($rule['destination']['address'])) {
+ $error_text = "Unresolvable destination alias '{$rule['destination']['address']}' for rule '{$rule['descr']}'";
+ file_notice("Filter_Reload", $error_text);
+ return "# {$error_text}";
+ }
+ update_filter_reload_status("Setting up pass/block rules");
+ $type = $rule['type'];
+ if ($type != "pass" && $type != "block" && $type != "reject" && $type != "match") {
+ /* default (for older rules) is pass */
+ $type = "pass";
+ }
+ if ($type == "reject") {
+ $aline['type'] = "block return ";
+ } else {
+ $aline['type'] = $type . " ";
+ }
+ if (isset($rule['floating']) && $rule['floating'] == "yes") {
+ if ($rule['direction'] != "any") {
+ $aline['direction'] = " " . $rule['direction'] . " ";
+ }
+ } else {
+ /* ensure the direction is in */
+ $aline['direction'] = " in ";
+ }
+ if (isset($rule['log'])) {
+ $aline['log'] = "log ";
+ }
+ if (!isset($rule['floating']) || isset($rule['quick'])) {
+ $aline['quick'] = " quick ";
+ }
+
+ /* set the gateway interface */
+ update_filter_reload_status(sprintf(gettext("Setting up pass/block rules %s"), $rule['descr']));
+
+ /* do not process reply-to for gateway'd rules */
+ if ($rule['gateway'] == "" && $aline['direction'] <> "" && (interface_has_gateway($rule['interface']) || interface_has_gatewayv6($rule['interface'])) && !isset($config['system']['disablereplyto']) && !isset($rule['disablereplyto']) && $type != "match") {
+ if ($rule['ipprotocol'] == "inet6") {
+ $rg = get_interface_gateway_v6($rule['interface']);
+ if (is_ipaddrv6($rg)) {
+ $aline['reply'] = "reply-to ( {$ifcfg['ifv6']} {$rg} ) ";
+ } else if ($rule['interface'] <> "pptp") {
+ log_error(sprintf(gettext("Could not find IPv6 gateway for interface (%s)."), $rule['interface']));
+ }
+ } else {
+ $rg = get_interface_gateway($rule['interface']);
+ if (is_ipaddrv4($rg)) {
+ $aline['reply'] = "reply-to ( {$ifcfg['if']} {$rg} ) ";
+ } else if ($rule['interface'] <> "pptp") {
+ log_error(sprintf(gettext("Could not find IPv4 gateway for interface (%s)."), $rule['interface']));
+ }
+ }
+ }
+ /* if user has selected a custom gateway, lets work with it */
+ else if ($rule['gateway'] <> "" && $type == "pass") {
+ if (isset($GatewaysList[$rule['gateway']])) {
+ /* Add the load balanced gateways */
+ $aline['route'] = " \$GW{$rule['gateway']} ";
+ } else if (isset($config['system']['skip_rules_gw_down'])) {
+ return "# rule " . $rule['descr'] . " disabled because gateway " . $rule['gateway'] . " is down ";
+ } else {
+ log_error("The gateway: {$rule['gateway']} is invalid or unknown, not using it.");
+ }
+ }
+
+ if (isset($rule['protocol']) && !empty($rule['protocol'])) {
+ if ($rule['protocol'] == "tcp/udp") {
+ $aline['prot'] = " proto { tcp udp } ";
+ } elseif (($rule['protocol'] == "icmp") && ($rule['ipprotocol'] == "inet6")) {
+ $aline['prot'] = " proto ipv6-icmp ";
+ } elseif ($rule['protocol'] == "icmp") {
+ $aline['prot'] = " proto icmp ";
+ } else {
+ $aline['prot'] = " proto {$rule['protocol']} ";
+ }
+ } else {
+ if ($rule['source']['port'] <> "" || $rule['destination']['port'] <> "") {
+ $aline['prot'] = " proto tcp ";
+ }
+ }
+ update_filter_reload_status(sprintf(gettext("Creating rule %s"), $rule['descr']));
+
+ /* source address */
+ $src = trim(filter_generate_address($rule, "source"));
+ if (empty($src) || ($src == "/")) {
+ return "# at the break!";
+ }
+ $aline['src'] = " from $src ";
+
+ /* OS signatures */
+ if (($rule['protocol'] == "tcp") && ($rule['os'] <> "")) {
+ $aline['os'] = " os \"{$rule['os']}\" ";
+ }
+
+ /* destination address */
+ $dst = trim(filter_generate_address($rule, "destination"));
+ if (empty($dst) || ($dst == "/")) {
+ return "# returning at dst $dst == \"/\"";
+ }
+ $aline['dst'] = "to $dst ";
+
+ //Layer7 support
+ $l7_present = false;
+ $l7_structures = array();
+ if (isset($rule['l7container']) && $rule['l7container'] != "none") {
+ $l7_present = true;
+ $l7rule =& $layer7_rules_list[$rule['l7container']];
+ $l7_structures = $l7rule->get_unique_structures();
+ $aline['divert'] = "divert-to " . $l7rule->GetRPort() . " ";
+ }
+ if (($rule['protocol'] == "icmp") && $rule['icmptype'] && ($rule['ipprotocol'] == "inet")) {
+ $aline['icmp-type'] = "icmp-type {$rule['icmptype']} ";
+ }
+ if (($rule['protocol'] == "icmp") && $rule['icmptype'] && ($rule['ipprotocol'] == "inet6")) {
+ $aline['icmp6-type'] = "icmp6-type {$rule['icmptype']} ";
+ }
+ if (!empty($rule['tag'])) {
+ if (ctype_digit($rule['tag'])) {
+ $aline['tag'] = " tag \"" .$rule['tag']. "\" ";
+ } else {
+ $aline['tag'] = " tag " .$rule['tag']. " ";
+ }
+ }
+ if (!empty($rule['tagged'])) {
+ $aline['tagged'] = " tagged " .$rule['tagged'] . " ";
+ }
+ if (!empty($rule['dscp'])) {
+ switch (strtolower($rule['dscp'])) {
+ case 'va':
+ $aline['dscp'] = " dscp \"44\" ";
+ break;
+ case 'VA':
+ $aline['dscp'] = " dscp \"44\" ";
+ break;
+ case 'cs1':
+ $aline['dscp'] = " dscp \"8\" ";
+ break;
+ case 'cs2':
+ $aline['dscp'] = " dscp \"16\" ";
+ break;
+ case 'cs3':
+ $aline['dscp'] = " dscp \"24\" ";
+ break;
+ case 'cs4':
+ $aline['dscp'] = " dscp \"32\" ";
+ break;
+ case 'cs5':
+ $aline['dscp'] = " dscp \"40\" ";
+ break;
+ case 'cs6':
+ $aline['dscp'] = " dscp \"48\" ";
+ break;
+ case 'cs7':
+ $aline['dscp'] = " dscp \"56\" ";
+ break;
+ default:
+ $aline['dscp'] = " dscp " . $rule['dscp'] . " ";
+ break;
+ }
+ }
+ if (!empty($rule['vlanprio']) && ($rule['vlanprio'] != "none")) {
+ $aline['vlanprio'] = " ieee8021q-pcp " . $rule['vlanprio'] . " ";
+ }
+ if (!empty($rule['vlanprioset']) && ($rule['vlanprioset'] != "none")) {
+ $aline['vlanprioset'] = " ieee8021q-setpcp " . $rule['vlanprioset'] . " ";
+ }
+ if ($type == "pass") {
+ if (isset($rule['allowopts'])) {
+ $aline['allowopts'] = " allow-opts ";
+ }
+ }
+ $aline['flags'] = "";
+ if ($rule['protocol'] == "tcp") {
+ if (isset($rule['tcpflags_any'])) {
+ $aline['flags'] = "flags any ";
+ } else if (!empty($rule['tcpflags2'])) {
+ $aline['flags'] = "flags ";
+ if (!empty($rule['tcpflags1'])) {
+ $flags1 = explode(",", $rule['tcpflags1']);
+ foreach ($flags1 as $flag1) {
+ // CWR flag needs special treatment
+ if ($flag1[0] == "c") {
+ $aline['flags'] .= "W";
+ } else {
+ $aline['flags'] .= strtoupper($flag1[0]);
+ }
+ }
+ }
+ $aline['flags'] .= "/";
+ if (!empty($rule['tcpflags2'])) {
+ $flags2 = explode(",", $rule['tcpflags2']);
+ foreach ($flags2 as $flag2) {
+ // CWR flag needs special treatment
+ if ($flag2[0] == "c") {
+ $aline['flags'] .= "W";
+ } else {
+ $aline['flags'] .= strtoupper($flag2[0]);
+ }
+ }
+ }
+ $aline['flags'] .= " ";
+ } else {
+ $aline['flags'] = "flags S/SA ";
+ }
+ }
+ if ($type == "pass") {
+ /*
+ * # keep state
+ * works with TCP, UDP, and ICMP.
+ * # modulate state
+ * works only with TCP. pfSense will generate strong Initial Sequence Numbers (ISNs)
+ * for packets matching this rule.
+ * # synproxy state
+ * proxies incoming TCP connections to help protect servers from spoofed TCP SYN floods.
+ * This option includes the functionality of keep state and modulate state combined.
+ * # none
+ * do not use state mechanisms to keep track. this is only useful if your doing advanced
+ * queueing in certain situations. please check the faq.
+ */
+ $noadvoptions = false;
+ if (isset($rule['statetype']) && $rule['statetype'] <> "") {
+ switch ($rule['statetype']) {
+ case "none":
+ $noadvoptions = true;
+ $aline['flags'] .= " no state ";
+ break;
+ case "modulate state":
+ case "synproxy state":
+ if ($rule['protocol'] == "tcp") {
+ $aline['flags'] .= "{$rule['statetype']} ";
+ }
+ break;
+ case "sloppy state":
+ $aline['flags'] .= "keep state ";
+ $rule['sloppy'] = true;
+ break;
+ default:
+ $aline['flags'] .= "{$rule['statetype']} ";
+ break;
+ }
+ } else {
+ $aline['flags'] .= "keep state ";
+ }
+
+ if ($noadvoptions == false && isset($rule['nopfsync'])) {
+ $rule['nopfsync'] = true;
+ }
+
+ if ($noadvoptions == false || $l7_present) {
+ if ((isset($rule['source-track']) and $rule['source-track'] <> "") or
+ (isset($rule['max']) and $rule['max'] <> "") or
+ (isset($rule['max-src-nodes']) and $rule['max-src-nodes'] <> "") or
+ (isset($rule['max-src-states']) and $rule['max-src-states'] <> "") or
+ ((in_array($rule['protocol'], array("tcp", "tcp/udp"))) and
+ ((isset($rule['statetimeout']) and $rule['statetimeout'] <> "") or
+ (isset($rule['max-src-conn']) and $rule['max-src-conn'] <> "") or
+ (isset($rule['max-src-conn-rate']) and $rule['max-src-conn-rate'] <> "") or
+ (isset($rule['max-src-conn-rates']) and $rule['max-src-conn-rates'] <> ""))) or
+ (isset($rule['sloppy'])) or
+ (isset($rule['nopfsync'])) or
+ ($l7_present)) {
+ $aline['flags'] .= "( ";
+ if (isset($rule['sloppy'])) {
+ $aline['flags'] .= "sloppy ";
+ }
+ if (isset($rule['nopfsync'])) {
+ $aline['flags'] .= "no-sync ";
+ }
+ if (isset($rule['source-track']) and $rule['source-track'] <> "") {
+ $aline['flags'] .= "source-track rule ";
+ }
+ if (isset($rule['max']) and $rule['max'] <> "") {
+ $aline['flags'] .= "max " . $rule['max'] . " ";
+ }
+ if (isset($rule['max-src-nodes']) and $rule['max-src-nodes'] <> "") {
+ $aline['flags'] .= "max-src-nodes " . $rule['max-src-nodes'] . " ";
+ }
+ if ((in_array($rule['protocol'], array("tcp", "tcp/udp"))) and
+ (isset($rule['max-src-conn'])) and
+ ($rule['max-src-conn'] <> "")) {
+ $aline['flags'] .= "max-src-conn " . $rule['max-src-conn'] . " ";
+ }
+ if (isset($rule['max-src-states']) and $rule['max-src-states'] <> "") {
+ $aline['flags'] .= "max-src-states " . $rule['max-src-states'] . " ";
+ }
+ if ((in_array($rule['protocol'], array("tcp", "tcp/udp"))) and
+ (isset($rule['statetimeout'])) and
+ ($rule['statetimeout'] <> "")) {
+ $aline['flags'] .= "tcp.established " . $rule['statetimeout'] . " ";
+ }
+ if ((in_array($rule['protocol'], array("tcp", "tcp/udp"))) and
+ (isset($rule['max-src-conn-rate'])) and
+ ($rule['max-src-conn-rate'] <> "") and
+ (isset($rule['max-src-conn-rates'])) and
+ ($rule['max-src-conn-rates'] <> "")) {
+ $aline['flags'] .= "max-src-conn-rate " . $rule['max-src-conn-rate'] . " ";
+ $aline['flags'] .= "/" . $rule['max-src-conn-rates'] . ", overload <virusprot> flush global ";
+ }
+
+ if (!empty($aline['divert'])) {
+ $aline['flags'] .= "max-packets 8 ";
+ }
+
+ $aline['flags'] .= " ) ";
+ }
+ }
+ }
+ if ($rule['defaultqueue'] <> "") {
+ $aline['queue'] = " queue (".$rule['defaultqueue'];
+ if ($rule['ackqueue'] <> "") {
+ $aline['queue'] .= "," . $rule['ackqueue'];
+ }
+ $aline['queue'] .= ") ";
+ }
+ if ($rule['dnpipe'] <> "") {
+ if (!empty($dummynet_name_list[$rule['dnpipe']])) {
+ if ($dummynet_name_list[$rule['dnpipe']][0] == "?") {
+ $aline['dnpipe'] = " dnqueue( ";
+ $aline['dnpipe'] .= substr($dummynet_name_list[$rule['dnpipe']], 1);
+ if ($rule['pdnpipe'] <> "") {
+ $aline['dnpipe'] .= "," . substr($dummynet_name_list[$rule['pdnpipe']], 1);
+ }
+ } else {
+ $aline['dnpipe'] = " dnpipe ( " . $dummynet_name_list[$rule['dnpipe']];
+ if ($rule['pdnpipe'] <> "") {
+ $aline['dnpipe'] .= "," . $dummynet_name_list[$rule['pdnpipe']];
+ }
+ }
+ $aline['dnpipe'] .= ") ";
+ }
+ }
+
+ /* is a time based rule schedule attached? */
+ if (!empty($rule['sched']) && !empty($config['schedules'])) {
+ $aline['schedlabel'] = "";
+ foreach ($config['schedules']['schedule'] as $sched) {
+ if ($sched['name'] == $rule['sched']) {
+ if (!filter_get_time_based_rule_status($sched)) {
+ if (!isset($config['system']['schedule_states'])) {
+ mwexec("/sbin/pfctl -y {$sched['schedlabel']}");
+ }
+ return "# schedule finished - {$rule['descr']}";
+ } else if ($g['debug']) {
+ log_error("[TDR DEBUG] status true -- rule type '$type'");
+ }
+
+ $aline['schedlabel'] = " schedule \"{$sched['schedlabel']}\" ";
+ break;
+ }
+ }
+ }
+
+ if (!empty($rule['tracker'])) {
+ $aline['tracker'] = "tracker {$rule['tracker']} ";
+ }
+
+ $line = "";
+ /* exception(s) to a user rules can go here. */
+ /* rules with a gateway or pool should create another rule for routing to vpns */
+ if ((($aline['route'] <> "") && (trim($aline['type']) == "pass") && strstr($dst, "any")) && (!isset($config['system']['disablenegate']))) {
+ /* negate VPN/PPTP/PPPoE/Static Route networks for load balancer/gateway rules */
+ $negate_networks = " to <negate_networks> " . filter_generate_port($rule, "destination");
+ $line .= $aline['type'] . $aline['direction'] . $aline['log'] . $aline['quick'] .
+ $aline['interface'] . $aline['ipprotocol'] . $aline['prot'] . $aline['src'] . $aline['os'] .
+ $negate_networks . $aline['icmp-type'] . $aline['icmp6-type'] . $aline['tag'] . $aline['tagged'] .
+ $aline['vlanprio'] . $aline['vlanprioset'] . $aline['dscp'] . filter_negaterule_tracker() . $aline['allowopts'] . $aline['flags'] .
+ $aline['queue'] . $aline['dnpipe'] . $aline['schedlabel'] .
+ " label \"NEGATE_ROUTE: Negate policy routing for destination\"\n";
+
+ }
+ /* piece together the actual user rule */
+ $line .= $aline['type'] . $aline['direction'] . $aline['log'] . $aline['quick'] . $aline['interface'] .
+ $aline['reply'] . $aline['route'] . $aline['ipprotocol'] . $aline['prot'] . $aline['src'] . $aline['os'] . $aline['dst'] .
+ $aline['divert'] . $aline['icmp-type'] . $aline['icmp6-type'] . $aline['tag'] . $aline['tagged'] . $aline['dscp'] . $aline['tracker'] .
+ $aline['vlanprio'] . $aline['vlanprioset'] . $aline['allowopts'] . $aline['flags'] . $aline['queue'] . $aline['dnpipe'] . $aline['schedlabel'];
+
+ unset($aline);
+
+ return $line;
+}
+
+function filter_rules_generate() {
+ global $config, $g, $FilterIflist, $time_based_rules, $GatewaysList, $tracker;
+
+ $fix_rule_label = 'fix_rule_label';
+ $increment_tracker = 'filter_rule_tracker';
+
+ update_filter_reload_status(gettext("Creating default rules"));
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_rules_generate() being called $mt\n";
+ }
+
+ $pptpdcfg = $config['pptpd'];
+
+ $ipfrules = "";
+ $ipfrules .= discover_pkg_rules("pfearly");
+
+ /* relayd */
+ $ipfrules .= "anchor \"relayd/*\"\n";
+ /* OpenVPN user rules from radius */
+ $ipfrules .= "anchor \"openvpn/*\"\n";
+ /* IPsec user rules from radius */
+ $ipfrules .= "anchor \"ipsec/*\"\n";
+ # BEGIN OF firewall rules
+ /* default block logging? */
+ $log = array();
+ if (!isset($config['syslog']['nologdefaultblock'])) {
+ $log['block'] = "log";
+ }
+ if (isset($config['syslog']['nologdefaultpass'])) {
+ $log['pass'] = "log";
+ }
+
+ $saved_tracker = $tracker;
+
+ if (!isset($config['system']['ipv6allow'])) {
+ $ipfrules .= "# Allow IPv6 on loopback\n";
+ $ipfrules .= "pass in {$log['pass']} quick on \$loopback inet6 all tracker {$increment_tracker($tracker)} label \"pass IPv6 loopback\"\n";
+ $ipfrules .= "pass out {$log['pass']} quick on \$loopback inet6 all tracker {$increment_tracker($tracker)} label \"pass IPv6 loopback\"\n";
+ $ipfrules .= "# Block all IPv6\n";
+ $ipfrules .= "block in {$log['block']} quick inet6 all tracker {$increment_tracker($tracker)} label \"Block all IPv6\"\n";
+ $ipfrules .= "block out {$log['block']} quick inet6 all tracker {$increment_tracker($tracker)} label \"Block all IPv6\"\n";
+ }
+
+ $saved_tracker += 100;
+ $tracker = $saved_tracker;
+
+ if (!isset($config['system']['no_apipa_block'])) {
+ $ipfrules .= <<<EOD
+# block IPv4 link-local. Per RFC 3927, link local "MUST NOT" be forwarded by a routing device,
+# and clients "MUST NOT" send such packets to a router. FreeBSD won't route 169.254./16, but
+# route-to can override that, causing problems such as in redmine #2073
+block in {$log['block']} quick from 169.254.0.0/16 to any tracker {$increment_tracker($tracker)} label "Block IPv4 link-local"
+block in {$log['block']} quick from any to 169.254.0.0/16 tracker {$increment_tracker($tracker)} label "Block IPv4 link-local"
+
+EOD;
+ }
+
+ $ipfrules .= <<<EOD
+#---------------------------------------------------------------------------
+# default deny rules
+#---------------------------------------------------------------------------
+block in {$log['block']} inet all tracker {$increment_tracker($tracker)} label "Default deny rule IPv4"
+block out {$log['block']} inet all tracker {$increment_tracker($tracker)} label "Default deny rule IPv4"
+block in {$log['block']} inet6 all tracker {$increment_tracker($tracker)} label "Default deny rule IPv6"
+block out {$log['block']} inet6 all tracker {$increment_tracker($tracker)} label "Default deny rule IPv6"
+
+# IPv6 ICMP is not auxilary, it is required for operation
+# See man icmp6(4)
+# 1 unreach Destination unreachable
+# 2 toobig Packet too big
+# 128 echoreq Echo service request
+# 129 echorep Echo service reply
+# 133 routersol Router solicitation
+# 134 routeradv Router advertisement
+# 135 neighbrsol Neighbor solicitation
+# 136 neighbradv Neighbor advertisement
+pass {$log['pass']} quick inet6 proto ipv6-icmp from any to any icmp6-type {1,2,135,136} tracker {$increment_tracker($tracker)} keep state
+
+# Allow only bare essential icmpv6 packets (NS, NA, and RA, echoreq, echorep)
+pass out {$log['pass']} quick inet6 proto ipv6-icmp from fe80::/10 to fe80::/10 icmp6-type {129,133,134,135,136} tracker {$increment_tracker($tracker)} keep state
+pass out {$log['pass']} quick inet6 proto ipv6-icmp from fe80::/10 to ff02::/16 icmp6-type {129,133,134,135,136} tracker {$increment_tracker($tracker)} keep state
+pass in {$log['pass']} quick inet6 proto ipv6-icmp from fe80::/10 to fe80::/10 icmp6-type {128,133,134,135,136} tracker {$increment_tracker($tracker)} keep state
+pass in {$log['pass']} quick inet6 proto ipv6-icmp from ff02::/16 to fe80::/10 icmp6-type {128,133,134,135,136} tracker {$increment_tracker($tracker)} keep state
+pass in {$log['pass']} quick inet6 proto ipv6-icmp from fe80::/10 to ff02::/16 icmp6-type {128,133,134,135,136} tracker {$increment_tracker($tracker)} keep state
+
+# We use the mighty pf, we cannot be fooled.
+block {$log['block']} quick inet proto { tcp, udp } from any port = 0 to any tracker {$increment_tracker($tracker)} label "Block traffic from port 0"
+block {$log['block']} quick inet proto { tcp, udp } from any to any port = 0 tracker {$increment_tracker($tracker)} label "Block traffic to port 0"
+block {$log['block']} quick inet6 proto { tcp, udp } from any port = 0 to any tracker {$increment_tracker($tracker)} label "Block traffic from port 0"
+block {$log['block']} quick inet6 proto { tcp, udp } from any to any port = 0 tracker {$increment_tracker($tracker)} label "Block traffic to port 0"
+
+# Snort package
+block {$log['block']} quick from <snort2c> to any tracker {$increment_tracker($tracker)} label "Block snort2c hosts"
+block {$log['block']} quick from any to <snort2c> tracker {$increment_tracker($tracker)} label "Block snort2c hosts"
+
+EOD;
+
+ $saved_tracker += 100;
+ $tracker = $saved_tracker;
+
+ $ipfrules .= filter_process_carp_rules($log);
+
+ $saved_tracker += 100;
+ $tracker = $saved_tracker;
+
+ $ipfrules .= "\n# SSH lockout\n";
+ if (is_array($config['system']['ssh']) && !empty($config['system']['ssh']['port'])) {
+ $ipfrules .= "block in {$log['block']} quick proto tcp from <sshlockout> to (self) port ";
+ $ipfrules .= $config['system']['ssh']['port'];
+ $ipfrules .= " tracker {$increment_tracker($tracker)} label \"sshlockout\"\n";
+ } else {
+ if ($config['system']['ssh']['port'] <> "") {
+ $sshport = $config['system']['ssh']['port'];
+ } else {
+ $sshport = 22;
+ }
+ if ($sshport) {
+ $ipfrules .= "block in {$log['block']} quick proto tcp from <sshlockout> to (self) port {$sshport} tracker {$increment_tracker($tracker)} label \"sshlockout\"\n";
+ }
+ }
+
+ $saved_tracker += 50;
+ $tracker = $saved_tracker;
+
+ $ipfrules .= "\n# webConfigurator lockout\n";
+ if (!$config['system']['webgui']['port']) {
+ if ($config['system']['webgui']['protocol'] == "http") {
+ $webConfiguratorlockoutport = "80";
+ } else {
+ $webConfiguratorlockoutport = "443";
+ }
+ } else {
+ $webConfiguratorlockoutport = $config['system']['webgui']['port'];
+ }
+ if ($webConfiguratorlockoutport) {
+ $ipfrules .= "block in {$log['block']} quick proto tcp from <webConfiguratorlockout> to (self) port {$webConfiguratorlockoutport} tracker {$increment_tracker($tracker)} label \"webConfiguratorlockout\"\n";
+ }
+
+ $saved_tracker += 100;
+ $tracker = $saved_tracker;
+
+ /*
+ * Support for allow limiting of TCP connections by establishment rate
+ * Useful for protecting against sudden outbursts, etc.
+ */
+ $ipfrules .= "block in {$log['block']} quick from <virusprot> to any tracker 1000000400 label \"virusprot overload table\"\n";
+
+ $saved_tracker += 100;
+ $tracker = $saved_tracker;
+
+ /* if captive portal is enabled, ensure that access to this port
+ * is allowed on a locked down interface
+ */
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cpcfg) {
+ if (!isset($cpcfg['enable'])) {
+ continue;
+ }
+ $cpinterfaces = explode(",", $cpcfg['interface']);
+ $cpiflist = array();
+ $cpiplist = array();
+ foreach ($cpinterfaces as $cpifgrp) {
+ if (!isset($FilterIflist[$cpifgrp])) {
+ continue;
+ }
+ $tmpif = get_real_interface($cpifgrp);
+ if (!empty($tmpif)) {
+ $cpiflist[] = "{$tmpif}";
+ $cpipm = get_interface_ip($cpifgrp);
+ if (is_ipaddr($cpipm)) {
+ $cpiplist[] = $cpipm;
+ if (!is_array($config['virtualip']) || !is_array($config['virtualip']['vip'])) {
+ continue;
+ }
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if (($vip['interface'] == $cpifgrp) && (($vip['mode'] == "carp") || ($vip['mode'] == "ipalias"))) {
+ $cpiplist[] = $vip['subnet'];
+ }
+ }
+ }
+ }
+ }
+ if (count($cpiplist) > 0 && count($cpiflist) > 0) {
+ $cpinterface = implode(" ", $cpiflist);
+ $cpaddresses = implode(" ", $cpiplist);
+ $listenporthttps = $cpcfg['listenporthttps'] ? $cpcfg['listenporthttps'] : 8000 + ($cpcfg['zoneid'] + 1);
+ $listenporthttp = $cpcfg['listenporthttp'] ? $cpcfg['listenporthttp'] : 8000 + $cpcfg['zoneid'];
+ $portalias = $listenporthttps;
+ $portalias .= " {$listenporthttp}";
+ $ipfrules .= "pass in {$log['pass']} quick on { {$cpinterface} } proto tcp from any to { {$cpaddresses} } port { {$portalias} } tracker {$increment_tracker($tracker)} keep state(sloppy)\n";
+ $ipfrules .= "pass out {$log['pass']} quick on { {$cpinterface} } proto tcp from any to any flags any tracker {$increment_tracker($tracker)} keep state(sloppy)\n";
+ }
+ }
+ }
+
+ $bogontableinstalled = 0;
+ foreach ($FilterIflist as $on => $oc) {
+ $saved_tracker += 10;
+ $tracker = $saved_tracker;
+
+ if (isset($config['system']['ipv6allow']) && ($oc['type6'] == "slaac" || $oc['type6'] == "dhcp6")) {
+ // The DHCPv6 client rules ***MUST BE ABOVE BOGONSV6!*** https://redmine.pfsense.org/issues/3395
+ $ipfrules .= <<<EOD
+# allow our DHCPv6 client out to the {$oc['descr']}
+pass in {$log['pass']} quick on \${$oc['descr']} proto udp from fe80::/10 port = 546 to fe80::/10 port = 546 tracker {$increment_tracker($tracker)} label "{$fix_rule_label("allow dhcpv6 client in {$oc['descr']}")}"
+pass in {$log['pass']} quick on \${$oc['descr']} proto udp from any port = 547 to any port = 546 tracker {$increment_tracker($tracker)} label "{$fix_rule_label("allow dhcpv6 client in {$oc['descr']}")}"
+pass out {$log['pass']} quick on \${$oc['descr']} proto udp from any port = 546 to any port = 547 tracker {$increment_tracker($tracker)} label "{$fix_rule_label("allow dhcpv6 client out {$oc['descr']}")}"
+
+EOD;
+ }
+
+ /* XXX: Not static but give a step of 1000 for each interface to at least be able to match rules. */
+ $saved_tracker += 1000;
+ $tracker = $saved_tracker;
+
+ /* block bogon networks */
+ /* http://www.cymru.com/Documents/bogon-bn-nonagg.txt */
+ /* file is automatically in cron every 3000 minutes */
+ if (!isset($config['syslog']['nologbogons'])) {
+ $bogonlog = "log";
+ } else {
+ $bogonlog = "";
+ }
+
+ if (isset($config['interfaces'][$on]['blockbogons'])) {
+ $ipfrules .= <<<EOD
+# block bogon networks (IPv4)
+# http://www.cymru.com/Documents/bogon-bn-nonagg.txt
+block in $bogonlog quick on \${$oc['descr']} from <bogons> to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("block bogon IPv4 networks from {$oc['descr']}")}"
+
+EOD;
+
+ if (isset($config['system']['ipv6allow'])) {
+ $ipfrules .= <<<EOD
+# block bogon networks (IPv6)
+# http://www.team-cymru.org/Services/Bogons/fullbogons-ipv6.txt
+block in $bogonlog quick on \${$oc['descr']} from <bogonsv6> to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("block bogon IPv6 networks from {$oc['descr']}")}"
+
+EOD;
+ }
+ }
+
+ $saved_tracker += 10;
+ $tracker = $saved_tracker;
+
+ $isbridged = false;
+ if (is_array($config['bridges']['bridged'])) {
+ foreach ($config['bridges']['bridged'] as $oc2) {
+ if (stristr($oc2['members'], $on)) {
+ $isbridged = true;
+ break;
+ }
+ }
+ }
+
+ if ($oc['ip'] && !($isbridged) && isset($oc['spoofcheck'])) {
+ $ipfrules .= filter_rules_spoofcheck_generate($on, $oc, $log);
+ }
+
+ /* block private networks ? */
+ if (!isset($config['syslog']['nologprivatenets'])) {
+ $privnetlog = "log";
+ } else {
+ $privnetlog = "";
+ }
+
+ $saved_tracker += 10;
+ $tracker = $saved_tracker;
+
+ if (isset($config['interfaces'][$on]['blockpriv'])) {
+ if ($isbridged == false) {
+ $ipfrules .= <<<EOD
+# block anything from private networks on interfaces with the option set
+block in $privnetlog quick on \${$oc['descr']} from 10.0.0.0/8 to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Block private networks from {$oc['descr']} block 10/8")}"
+block in $privnetlog quick on \${$oc['descr']} from 127.0.0.0/8 to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Block private networks from {$oc['descr']} block 127/8")}"
+block in $privnetlog quick on \${$oc['descr']} from 172.16.0.0/12 to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Block private networks from {$oc['descr']} block 172.16/12")}"
+block in $privnetlog quick on \${$oc['descr']} from 192.168.0.0/16 to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Block private networks from {$oc['descr']} block 192.168/16")}"
+block in $privnetlog quick on \${$oc['descr']} from fc00::/7 to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Block ULA networks from {$oc['descr']} block fc00::/7")}"
+
+EOD;
+ }
+ }
+
+ $saved_tracker += 10;
+ $tracker = $saved_tracker;
+
+ switch ($oc['type']) {
+ case "pptp":
+ $ipfrules .= <<<EOD
+# allow PPTP client
+pass in {$log['pass']} on \${$oc['descr']} proto tcp from any to any port = 1723 flags S/SA modulate state tracker {$increment_tracker($tracker)} label "{$fix_rule_label("allow PPTP client on {$oc['descr']}")}"
+pass in {$log['pass']} on \${$oc['descr']} proto gre from any to any keep state tracker {$increment_tracker($tracker)} label "{$fix_rule_label("allow PPTP client on {$oc['descr']}")}"
+
+EOD;
+ break;
+ case "dhcp":
+ $ipfrules .= <<<EOD
+# allow our DHCP client out to the {$oc['descr']}
+pass in {$log['pass']} on \${$oc['descr']} proto udp from any port = 67 to any port = 68 tracker {$increment_tracker($tracker)} label "{$fix_rule_label("allow dhcp client out {$oc['descr']}")}"
+pass out {$log['pass']} on \${$oc['descr']} proto udp from any port = 68 to any port = 67 tracker {$increment_tracker($tracker)} label "{$fix_rule_label("allow dhcp client out {$oc['descr']}")}"
+# Not installing DHCP server firewall rules for {$oc['descr']} which is configured for DHCP.
+
+EOD;
+
+ break;
+ case "pppoe":
+ case "none":
+ /* XXX: Nothing to do in this case?! */
+ break;
+ default:
+ /* allow access to DHCP server on interfaces */
+ if (isset($config['dhcpd'][$on]['enable'])) {
+ $ipfrules .= <<<EOD
+# allow access to DHCP server on {$oc['descr']}
+pass in {$log['pass']} quick on \${$oc['descr']} proto udp from any port = 68 to 255.255.255.255 port = 67 tracker {$increment_tracker($tracker)} label "allow access to DHCP server"
+
+EOD;
+ if (is_ipaddrv4($oc['ip'])) {
+ $ipfrules .= <<<EOD
+pass in {$log['pass']} quick on \${$oc['descr']} proto udp from any port = 68 to {$oc['ip']} port = 67 tracker {$increment_tracker($tracker)} label "allow access to DHCP server"
+pass out {$log['pass']} quick on \${$oc['descr']} proto udp from {$oc['ip']} port = 67 to any port = 68 tracker {$increment_tracker($tracker)} label "allow access to DHCP server"
+
+EOD;
+ }
+
+ if (is_ipaddrv4($oc['ip']) && $config['dhcpd'][$on]['failover_peerip'] <> "") {
+ $ipfrules .= <<<EOD
+# allow access to DHCP failover on {$oc['descr']} from {$config['dhcpd'][$on]['failover_peerip']}
+pass in {$log['pass']} quick on \${$oc['descr']} proto { tcp udp } from {$config['dhcpd'][$on]['failover_peerip']} to {$oc['ip']} port = 519 tracker {$increment_tracker($tracker)} label "allow access to DHCP failover"
+pass in {$log['pass']} quick on \${$oc['descr']} proto { tcp udp } from {$config['dhcpd'][$on]['failover_peerip']} to {$oc['ip']} port = 520 tracker {$increment_tracker($tracker)} label "allow access to DHCP failover"
+
+EOD;
+ }
+
+ }
+ break;
+ }
+
+ $saved_tracker += 10;
+ $tracker = $saved_tracker;
+ switch ($oc['type6']) {
+ case "6rd":
+ $ipfrules .= <<<EOD
+# allow our proto 41 traffic from the 6RD border relay in
+pass in {$log['pass']} on \${$oc['descr']} proto 41 from {$config['interfaces'][$on]['gateway-6rd']} to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Allow 6in4 traffic in for 6rd on {$oc['descr']}")}"
+pass out {$log['pass']} on \${$oc['descr']} proto 41 from any to {$config['interfaces'][$on]['gateway-6rd']} tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Allow 6in4 traffic out for 6rd on {$oc['descr']}")}"
+
+EOD;
+ /* XXX: Really need to allow 6rd traffic coming in for v6 this is against default behaviour! */
+ if (0 && is_ipaddrv6($oc['ipv6'])) {
+ $ipfrules .= <<<EOD
+pass in {$log['pass']} on \${$oc['descr']} inet6 from any to {$oc['ipv6']}/{$oc['snv6']} tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Allow 6rd traffic in for 6rd on {$oc['descr']}")}"
+pass out {$log['pass']} on \${$oc['descr']} inet6 from {$oc['ipv6']}/{$oc['snv6']} to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Allow 6rd traffic out for 6rd on {$oc['descr']}")}"
+
+EOD;
+ }
+ break;
+ case "6to4":
+ if (is_ipaddrv4($oc['ip'])) {
+ $ipfrules .= <<<EOD
+# allow our proto 41 traffic from the 6to4 border relay in
+pass in {$log['pass']} on \${$oc['descr']} proto 41 from any to {$oc['ip']} tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Allow 6in4 traffic in for 6to4 on {$oc['descr']}")}"
+pass out {$log['pass']} on \${$oc['descr']} proto 41 from {$oc['ip']} to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Allow 6in4 traffic out for 6to4 on {$oc['descr']}")}"
+
+EOD;
+ }
+ /* XXX: Really need to allow 6to4 traffic coming in for v6 this is against default behaviour! */
+ if (0 && is_ipaddrv6($oc['ipv6'])) {
+ $ipfrules .= <<<EOD
+pass in {$log['pass']} on \${$oc['descr']} inet6 from any to {$oc['ipv6']}/{$oc['snv6']} tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Allow 6in4 traffic in for 6to4 on {$oc['descr']}")}"
+pass out {$log['pass']} on \${$oc['descr']} inet6 from {$oc['ipv6']}/{$oc['snv6']} to any tracker {$increment_tracker($tracker)} label "{$fix_rule_label("Allow 6in4 traffic out for 6to4 on {$oc['descr']}")}"
+
+EOD;
+ }
+ break;
+ default:
+ if ((is_array($config['dhcpdv6'][$on]) && isset($config['dhcpdv6'][$on]['enable'])) ||
+ (isset($oc['track6-interface'])) ||
+ (is_array($config['dhcrelay6']) && !empty($config['dhcrelay6']['interface']) && in_array($on, explode(',', $config['dhcrelay6']['interface'])))) {
+ $ipfrules .= <<<EOD
+# allow access to DHCPv6 server on {$oc['descr']}
+# We need inet6 icmp for stateless autoconfig and dhcpv6
+pass {$log['pass']} quick on \${$oc['descr']} inet6 proto udp from fe80::/10 to fe80::/10 port = 546 tracker {$increment_tracker($tracker)} label "allow access to DHCPv6 server"
+pass {$log['pass']} quick on \${$oc['descr']} inet6 proto udp from fe80::/10 to ff02::/16 port = 546 tracker {$increment_tracker($tracker)} label "allow access to DHCPv6 server"
+pass {$log['pass']} quick on \${$oc['descr']} inet6 proto udp from fe80::/10 to ff02::/16 port = 547 tracker {$increment_tracker($tracker)} label "allow access to DHCPv6 server"
+pass {$log['pass']} quick on \${$oc['descr']} inet6 proto udp from ff02::/16 to fe80::/10 port = 547 tracker {$increment_tracker($tracker)} label "allow access to DHCPv6 server"
+
+EOD;
+ if (is_ipaddrv6($oc['ipv6'])) {
+ $ipfrules .= <<<EOD
+pass in {$log['pass']} quick on \${$oc['descr']} inet6 proto udp from fe80::/10 to {$oc['ipv6']} port = 546 tracker {$increment_tracker($tracker)} label "allow access to DHCPv6 server"
+pass out {$log['pass']} quick on \${$oc['descr']} inet6 proto udp from {$oc['ipv6']} port = 547 to fe80::/10 tracker {$increment_tracker($tracker)} label "allow access to DHCPv6 server"
+
+EOD;
+ }
+ }
+ break;
+ }
+ }
+
+ $saved_tracker += 10;
+ $tracker = $saved_tracker;
+
+ /*
+ * NB: The loopback rules are needed here since the antispoof would take precedence then.
+ * If you ever add the 'quick' keyword to the antispoof rules above move the loopback
+ * rules before them.
+ */
+ $ipfrules .= <<<EOD
+
+# loopback
+pass in {$log['pass']} on \$loopback inet all tracker {$increment_tracker($tracker)} label "pass IPv4 loopback"
+pass out {$log['pass']} on \$loopback inet all tracker {$increment_tracker($tracker)} label "pass IPv4 loopback"
+pass in {$log['pass']} on \$loopback inet6 all tracker {$increment_tracker($tracker)} label "pass IPv6 loopback"
+pass out {$log['pass']} on \$loopback inet6 all tracker {$increment_tracker($tracker)} label "pass IPv6 loopback"
+# let out anything from the firewall host itself and decrypted IPsec traffic
+pass out {$log['pass']} inet all keep state allow-opts tracker {$increment_tracker($tracker)} label "let out anything IPv4 from firewall host itself"
+pass out {$log['pass']} inet6 all keep state allow-opts tracker {$increment_tracker($tracker)} label "let out anything IPv6 from firewall host itself"
+
+EOD;
+
+ $saved_tracker += 100;
+ $tracker = $saved_tracker;
+ foreach ($FilterIflist as $ifdescr => $ifcfg) {
+ if (isset($ifcfg['virtual'])) {
+ continue;
+ }
+
+ $gw = get_interface_gateway($ifdescr);
+ if (is_ipaddrv4($gw) && is_ipaddrv4($ifcfg['ip'])) {
+ $ipfrules .= "pass out {$log['pass']} route-to ( {$ifcfg['if']} {$gw} ) from {$ifcfg['ip']} to !{$ifcfg['sa']}/{$ifcfg['sn']} tracker {$increment_tracker($tracker)} keep state allow-opts label \"let out anything from firewall host itself\"\n";
+ if (is_array($ifcfg['vips'])) {
+ foreach ($ifcfg['vips'] as $vip) {
+ if (ip_in_subnet($vip['ip'], "{$ifcfg['sa']}/{$ifcfg['sn']}")) {
+ $ipfrules .= "pass out {$log['pass']} route-to ( {$ifcfg['if']} {$gw} ) from {$vip['ip']} to !{$ifcfg['sa']}/{$ifcfg['sn']} tracker {$increment_tracker($tracker)} keep state allow-opts label \"let out anything from firewall host itself\"\n";
+ } else {
+ $ipfrules .= "pass out {$log['pass']} route-to ( {$ifcfg['if']} {$gw} ) from {$vip['ip']} to !" . gen_subnet($vip['ip'], $vip['sn']) . "/{$vip['sn']} tracker {$increment_tracker($tracker)} keep state allow-opts label \"let out anything from firewall host itself\"\n";
+ }
+ }
+ }
+ }
+
+ $gwv6 = get_interface_gateway_v6($ifdescr);
+ $stf = get_real_interface($ifdescr, "inet6");
+ $pdlen = 64 - calculate_ipv6_delegation_length($ifdescr);
+ if (is_ipaddrv6($gwv6) && is_ipaddrv6($ifcfg['ipv6'])) {
+ $ipfrules .= "pass out {$log['pass']} route-to ( {$stf} {$gwv6} ) inet6 from {$ifcfg['ipv6']} to !{$ifcfg['ipv6']}/{$pdlen} tracker {$increment_tracker($tracker)} keep state allow-opts label \"let out anything from firewall host itself\"\n";
+ if (is_array($ifcfg['vips6'])) {
+ foreach ($ifcfg['vips6'] as $vip) {
+ $ipfrules .= "pass out {$log['pass']} route-to ( {$stf} {$gwv6} ) inet6 from {$vip['ip']} to !{$vip['ip']}/{$pdlen} tracker {$increment_tracker($tracker)} keep state allow-opts label \"let out anything from firewall host itself\"\n";
+ }
+ }
+ }
+ }
+
+
+ $saved_tracker += 300;
+ $tracker = $saved_tracker;
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ $ipfrules .= "pass out {$log['pass']} on \$IPsec all tracker {$increment_tracker($tracker)} tracker {$increment_tracker($tracker)} keep state label \"IPsec internal host to host\"\n";
+ }
+
+ $saved_tracker += 10;
+ $tracker = $saved_tracker;
+ if (is_array($config['system']['webgui']) && !isset($config['system']['webgui']['noantilockout'])) {
+ $alports = filter_get_antilockout_ports();
+
+ if (count($config['interfaces']) > 1 && !empty($FilterIflist['lan']['if'])) {
+ /* if antilockout is enabled, LAN exists and has
+ * an IP and subnet mask assigned
+ */
+ $lanif = $FilterIflist['lan']['if'];
+ $ipfrules .= <<<EOD
+# make sure the user cannot lock himself out of the webConfigurator or SSH
+pass in {$log['pass']} quick on {$lanif} proto tcp from any to ({$lanif}) port { {$alports} } tracker {$increment_tracker($tracker)} keep state label "anti-lockout rule"
+
+EOD;
+ } else if (count($config['interfaces']) == 1) {
+ /* single-interface deployment, add to WAN */
+ $wanif = $FilterIflist["wan"]['if'];
+ $ipfrules .= <<<EOD
+# make sure the user cannot lock himself out of the webConfigurator or SSH
+pass in {$log['pass']} quick on {$wanif} proto tcp from any to ({$wanif}) port { {$alports} } tracker {$increment_tracker($tracker)} keep state label "anti-lockout rule"
+
+EOD;
+ }
+ unset($alports);
+ }
+
+ $saved_tracker += 10;
+ $tracker = $saved_tracker;
+ /* PPTPd enabled? */
+ if ($pptpdcfg['mode'] && ($pptpdcfg['mode'] != "off") && !isset($config['system']['disablevpnrules'])) {
+ if ($pptpdcfg['mode'] == "server") {
+ $pptpdtarget = get_interface_ip();
+ } else {
+ $pptpdtarget = $pptpdcfg['redir'];
+ }
+ if (is_ipaddr($pptpdtarget) and is_array($FilterIflist['wan'])) {
+ $ipfrules .= <<<EOD
+# PPTPd rules
+pass in {$log['pass']} on \${$FilterIflist['wan']['descr']} proto tcp from any to $pptpdtarget port = 1723 tracker {$increment_tracker($tracker)} modulate state label "{$fix_rule_label("allow pptpd {$pptpdtarget}")}"
+pass in {$log['pass']} on \${$FilterIflist['wan']['descr']} proto gre from any to any tracker {$increment_tracker($tracker)} keep state label "allow gre pptpd"
+
+EOD;
+
+ } else {
+ /* this shouldnt ever happen but instead of breaking the clients ruleset
+ * log an error.
+ */
+ log_error("ERROR! PPTP enabled but could not resolve the \$pptpdtarget");
+ }
+ }
+
+ $saved_tracker += 10;
+ $tracker = $saved_tracker;
+ if (isset($config['nat']['rule']) && is_array($config['nat']['rule'])) {
+ foreach ($config['nat']['rule'] as $rule) {
+ if ((!isset($config['system']['disablenatreflection']) || $rule['natreflection'] == "enable") &&
+ ($rule['natreflection'] != "disable")) {
+ $ipfrules .= "# NAT Reflection rules\n";
+ $ipfrules .= <<<EOD
+pass in {$log['pass']} inet tagged PFREFLECT tracker {$increment_tracker($tracker)} keep state label "NAT REFLECT: Allow traffic to localhost"
+
+EOD;
+ break;
+ }
+ }
+ }
+
+ if (isset($config['filter']['rule'])) {
+ /* Pre-cache all our rules so we only have to generate them once */
+ $rule_arr1 = array();
+ $rule_arr2 = array();
+ $rule_arr3 = array();
+ $vpn_and_ppp_ifs = array("l2tp", "pptp", "pppoe", "enc0", "openvpn");
+ /*
+ * NB: The order must be: Floating rules, then interface group and then regular ones.
+ */
+ foreach ($config['filter']['rule'] as $rule) {
+ update_filter_reload_status("Pre-caching {$rule['descr']}...");
+ if (isset ($rule['disabled'])) {
+ continue;
+ }
+
+ if (!empty($rule['ipprotocol']) && $rule['ipprotocol'] == "inet46") {
+ if (isset($rule['floating'])) {
+ $rule['ipprotocol'] = "inet";
+ $rule_arr1[] = filter_generate_user_rule_arr($rule);
+ $rule['ipprotocol'] = "inet6";
+ $rule_arr1[] = filter_generate_user_rule_arr($rule);
+ } else if (is_interface_group($rule['interface']) || in_array($rule['interface'], $vpn_and_ppp_ifs)) {
+ $rule['ipprotocol'] = "inet";
+ $rule_arr2[] = filter_generate_user_rule_arr($rule);
+ $rule['ipprotocol'] = "inet6";
+ $rule_arr2[] = filter_generate_user_rule_arr($rule);
+ } else {
+ $rule['ipprotocol'] = "inet";
+ $rule_arr3[] = filter_generate_user_rule_arr($rule);
+ $rule['ipprotocol'] = "inet6";
+ $rule_arr3[] = filter_generate_user_rule_arr($rule);
+ }
+ $rule['ipprotocol'] = "inet46";
+ } else {
+ if (isset($rule['floating'])) {
+ $rule_arr1[] = filter_generate_user_rule_arr($rule);
+ } else if (is_interface_group($rule['interface']) || in_array($rule['interface'], $vpn_and_ppp_ifs)) {
+ $rule_arr2[] = filter_generate_user_rule_arr($rule);
+ } else {
+ $rule_arr3[] = filter_generate_user_rule_arr($rule);
+ }
+ }
+ if ($rule['sched']) {
+ $time_based_rules = true;
+ }
+ }
+
+ $ipfrules .= "\n# User-defined rules follow\n";
+ $ipfrules .= "\nanchor \"userrules/*\"\n";
+ /* Generate user rule lines */
+ foreach ($rule_arr1 as $rule) {
+ if (isset($rule['disabled'])) {
+ continue;
+ }
+ if (!$rule['rule']) {
+ continue;
+ }
+ $ipfrules .= "{$rule['rule']} {$rule['descr']}\n";
+ }
+ foreach ($rule_arr2 as $rule) {
+ if (isset($rule['disabled'])) {
+ continue;
+ }
+ if (!$rule['rule']) {
+ continue;
+ }
+ $ipfrules .= "{$rule['rule']} {$rule['descr']}\n";
+ }
+ foreach ($rule_arr3 as $rule) {
+ if (isset($rule['disabled'])) {
+ continue;
+ }
+ if (!$rule['rule']) {
+ continue;
+ }
+ $ipfrules .= "{$rule['rule']} {$rule['descr']}\n";
+ }
+ unset($rule_arr1, $rule_arr2, $rule_arr3);
+ }
+
+ $saved_tracker += 100;
+ $tracker = $saved_tracker;
+
+ /* pass traffic between statically routed subnets and the subnet on the
+ * interface in question to avoid problems with complicated routing
+ * topologies
+ */
+ if (isset($config['filter']['bypassstaticroutes']) && is_array($config['staticroutes']['route']) && count($config['staticroutes']['route'])) {
+ $ipfrules .= "# Add rules to bypass firewall rules for static routes\n";
+ foreach (get_staticroutes() as $route) {
+ $friendly = $GatewaysList[$route['gateway']]['friendlyiface'];
+ if (is_array($FilterIflist[$friendly])) {
+ $oc = $FilterIflist[$friendly];
+ $routeent = explode("/", $route['network']);
+ unset($sa);
+ if (is_ipaddrv4($oc['ip'])) {
+ $sa = $oc['sa'];
+ $sn = $oc['sn'];
+ }
+ if ($sa && is_ipaddrv4($routeent[0])) {
+ $ipfrules .= <<<EOD
+pass {$log['pass']} quick on \${$oc['descr']} proto tcp from {$sa}/{$sn} to {$route['network']} flags any tracker {$increment_tracker($tracker)} keep state(sloppy) label "pass traffic between statically routed subnets"
+pass {$log['pass']} quick on \${$oc['descr']} from {$sa}/{$sn} to {$route['network']} tracker {$increment_tracker($tracker)} keep state(sloppy) label "pass traffic between statically routed subnets"
+pass {$log['pass']} quick on \${$oc['descr']} proto tcp from {$route['network']} to {$sa}/{$sn} flags any tracker {$increment_tracker($tracker)} keep state(sloppy) label "pass traffic between statically routed subnets"
+pass {$log['pass']} quick on \${$oc['descr']} from {$route['network']} to {$sa}/{$sn} tracker {$increment_tracker($tracker)} keep state(sloppy) label "pass traffic between statically routed subnets"
+
+EOD;
+ }
+ unset($sa);
+ if (is_ipaddrv6($oc['ipv6'])) {
+ $sa = $oc['sav6'];
+ $sn = $oc['snv6'];
+ }
+ if ($sa && is_ipaddrv6($routeent[0])) {
+ $ipfrules .= <<<EOD
+pass {$log['pass']} quick on \${$oc['descr']} inet6 proto tcp from {$sa}/{$sn} to {$route['network']} flags any tracker {$increment_tracker($tracker)} keep state(sloppy) label "pass traffic between statically routed subnets"
+pass {$log['pass']} quick on \${$oc['descr']} inet6 from {$sa}/{$sn} to {$route['network']} tracker {$increment_tracker($tracker)} keep state(sloppy) label "pass traffic between statically routed subnets"
+pass {$log['pass']} quick on \${$oc['descr']} inet6 proto tcp from {$route['network']} to {$sa}/{$sn} flags any tracker {$increment_tracker($tracker)} keep state(sloppy) label "pass traffic between statically routed subnets"
+pass {$log['pass']} quick on \${$oc['descr']} inet6 from {$route['network']} to {$sa}/{$sn} tracker {$increment_tracker($tracker)} keep state(sloppy) label "pass traffic between statically routed subnets"
+
+EOD;
+ }
+ }
+ }
+ }
+
+ update_filter_reload_status(gettext("Creating IPsec rules..."));
+ $saved_tracker += 100000;
+ $tracker = $saved_tracker;
+ $ipfrules .= filter_generate_ipsec_rules($log);
+
+ $ipfrules .= "\nanchor \"tftp-proxy/*\"\n";
+
+ $saved_tracker += 200;
+ $tracker = $saved_tracker;
+ update_filter_reload_status("Creating uPNP rules...");
+ if (is_array($config['installedpackages']['miniupnpd']) && is_array($config['installedpackages']['miniupnpd']['config'][0])) {
+ if (isset($config['installedpackages']['miniupnpd']['config'][0]['enable'])) {
+ $ipfrules .= "anchor \"miniupnpd\"\n";
+ }
+
+ if (is_array($config['installedpackages']['miniupnpd'][0]['config'])) {
+ $upnp_interfaces = explode(",", $config['installedpackages']['miniupnpd'][0]['config']['iface_array']);
+ foreach ($upnp_interfaces as $upnp_if) {
+ if (is_array($FilterIflist[$upnp_if])) {
+ $oc = $FilterIflist[$upnp_if];
+ unset($sa);
+ if ($oc['ip']) {
+ $sa = $oc['sa'];
+ $sn = $oc['sn'];
+ }
+ if ($sa) {
+ $ipfrules .= <<<EOD
+pass in {$log['pass']} on \${$oc['descr']} proto tcp from {$sa}/{$sn} to 239.255.255.250/32 port 1900 tracker {$increment_tracker($tracker)} keep state label "pass multicast traffic to miniupnpd"
+
+EOD;
+ }
+ }
+ }
+ }
+ }
+
+ return $ipfrules;
+}
+
+function filter_rules_spoofcheck_generate($ifname, $ifcfg, $log) {
+ global $g, $config, $tracker;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_rules_spoofcheck_generate() being called $mt\n";
+ }
+ $ipfrules = "antispoof {$log['block']} for \${$ifcfg['descr']} tracker {$tracker}\n";
+ $tracker++;
+
+ return $ipfrules;
+}
+
+/* COMPAT Function */
+function tdr_install_cron($should_install) {
+ log_error(gettext("Please use filter_tdr_install_cron() function tdr_install_cron will be deprecated!"));
+ filter_tdr_install_cron($should_install);
+}
+
+/****f* filter/filter_tdr_install_cron
+ * NAME
+ * filter_tdr_install_cron
+ * INPUTS
+ * $should_install true if the cron entry should be installed, false
+ * if the entry should be removed if it is present
+ * RESULT
+ * none
+ ******/
+function filter_tdr_install_cron($should_install) {
+ global $config, $g;
+
+ if (platform_booting() == true) {
+ return;
+ }
+
+ if (!is_array($config['cron'])) {
+ $config['cron'] = array();
+ }
+ if (!is_array($config['cron']['item'])) {
+ $config['cron']['item'] = array();
+ }
+
+ $x = 0;
+ $is_installed = false;
+ foreach ($config['cron']['item'] as $item) {
+ if (strstr($item['command'], "filter_configure_sync")) {
+ $is_installed = true;
+ break;
+ }
+ $x++;
+ }
+
+ switch ($should_install) {
+ case true:
+ if (!$is_installed) {
+ $cron_item = array();
+ $cron_item['minute'] = "0,15,30,45";
+ $cron_item['hour'] = "*";
+ $cron_item['mday'] = "*";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/etc/rc.filter_configure_sync";
+ $config['cron']['item'][] = $cron_item;
+ write_config(gettext("Installed 15 minute filter reload for Time Based Rules"));
+ configure_cron();
+ }
+ break;
+ case false:
+ if ($is_installed) {
+ unset($config['cron']['item'][$x]);
+ write_config(gettext("Removed 15 minute filter reload for Time Based Rules"));
+ configure_cron();
+ }
+ break;
+ }
+}
+
+/****f* filter/filter_get_time_based_rule_status
+ * NAME
+ * filter_get_time_based_rule_status
+ * INPUTS
+ * xml schedule block
+ * RESULT
+ * true/false - true if the rule should be installed
+ ******/
+/*
+ <schedules>
+ <schedule>
+ <name>ScheduleMultipleTime</name>
+ <descr>main descr</descr>
+ <time>
+ <position>0,1,2</position>
+ <hour>0:0-24:0</hour>
+ <desc>time range 2</desc>
+ </time>
+ <time>
+ <position>4,5,6</position>
+ <hour>0:0-24:0</hour>
+ <desc>time range 1</desc>
+ </time>
+ </schedule>
+ </schedules>
+*/
+function filter_get_time_based_rule_status($schedule) {
+
+ /* no schedule? rule should be installed */
+ if (empty($schedule)) {
+ return true;
+ }
+ /*
+ * iterate through time blocks and determine
+ * if the rule should be installed or not.
+ */
+ foreach ($schedule['timerange'] as $timeday) {
+ if (empty($timeday['month'])) {
+ $monthstatus = true;
+ } else {
+ $monthstatus = filter_tdr_month($timeday['month']);
+ }
+ if (empty($timeday['day'])) {
+ $daystatus = true;
+ } else {
+ $daystatus = filter_tdr_day($timeday['day']);
+ }
+ if (empty($timeday['hour'])) {
+ $hourstatus = true;
+ } else {
+ $hourstatus = filter_tdr_hour($timeday['hour']);
+ }
+ if (empty($timeday['position'])) {
+ $positionstatus = true;
+ } else {
+ $positionstatus = filter_tdr_position($timeday['position']);
+ }
+
+ if ($monthstatus == true && $daystatus == true && $positionstatus == true && $hourstatus == true) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function filter_tdr_day($schedule) {
+ global $g;
+
+ if ($g['debug']) {
+ log_error("[TDR DEBUG] filter_tdr_day($schedule)");
+ }
+
+ /*
+ * Calculate day of month.
+ * IE: 29th of may
+ */
+ $date = date("d");
+ $defined_days = explode(",", $schedule);
+ foreach ($defined_days as $dd) {
+ if ($date == $dd) {
+ return true;
+ }
+ }
+ return false;
+}
+function filter_tdr_hour($schedule) {
+ global $g;
+
+ /* $schedule should be a string such as 16:00-19:00 */
+ $tmp = explode("-", $schedule);
+ $starting_time = strtotime($tmp[0]);
+ $ending_time = strtotime($tmp[1]);
+ $now = strtotime("now");
+ if ($g['debug']) {
+ log_error("[TDR DEBUG] S: $starting_time E: $ending_time N: $now");
+ }
+ if ($now >= $starting_time and $now < $ending_time) {
+ return true;
+ }
+ return false;
+}
+
+function filter_tdr_position($schedule) {
+ global $g;
+
+ /*
+ * Calculate position, ie: day of week.
+ * Sunday = 7, Monday = 1, Tuesday = 2
+ * Weds = 3, Thursday = 4, Friday = 5,
+ * Saturday = 6
+ * ...
+ */
+ $weekday = date("w");
+ if ($g['debug']) {
+ log_error("[TDR DEBUG] filter_tdr_position($schedule) $weekday");
+ }
+ if ($weekday == 0) {
+ $weekday = 7;
+ }
+ $schedule_days = explode(",", $schedule);
+ foreach ($schedule_days as $day) {
+ if ($day == $weekday) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function filter_tdr_month($schedule) {
+ global $g;
+
+ /*
+ * Calculate month
+ */
+ $todays_month = date("n");
+ $months = explode(",", $schedule);
+ if ($g['debug']) {
+ log_error("[TDR DEBUG] filter_tdr_month($schedule)");
+ }
+ foreach ($months as $month) {
+ if ($month == $todays_month) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function filter_setup_logging_interfaces() {
+ global $config, $FilterIflist;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_setup_logging_interfaces() being called $mt\n";
+ }
+ $rules = "";
+ if (isset($FilterIflist['lan'])) {
+ $rules .= "set loginterface {$FilterIflist['lan']['if']}\n";
+ } else if (isset($FilterIflist['wan'])) {
+ $rules .= "set loginterface {$FilterIflist['wan']['if']}\n";
+ }
+
+ return $rules;
+}
+
+function filter_process_carp_rules($log) {
+ global $g, $config, $tracker;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_process_carp_rules() being called $mt\n";
+ }
+
+ $increment_tracker = 'filter_rule_tracker';
+ $lines = "";
+ /* return if there are no carp configured items */
+ if (!empty($config['hasync']) or !empty($config['virtualip']['vip'])) {
+ $lines .= "block in {$log['block']} quick proto carp from (self) to any tracker {$increment_tracker($tracker)}\n";
+ $lines .= "pass {$log['pass']} quick proto carp tracker {$increment_tracker($tracker)}\n";
+ }
+ return $lines;
+}
+
+/* Generate IPsec Filter Items */
+function filter_generate_ipsec_rules($log = array()) {
+ global $config, $g, $FilterIflist, $tracker;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "filter_generate_ipsec_rules() being called $mt\n";
+ }
+
+ if (isset($config['system']['disablevpnrules'])) {
+ return "\n# VPN Rules not added disabled in System->Advanced.\n";
+ }
+
+ $increment_tracker = 'filter_rule_tracker';
+
+ $ipfrules = "\n# VPN Rules\n";
+ if ((isset($config['ipsec']['enable'])) &&
+ (is_array($config['ipsec']['phase1']))) {
+ /* step through all phase1 entries */
+ foreach ($config['ipsec']['phase1'] as $ph1ent) {
+ $tracker += 10;
+
+ if (isset ($ph1ent['disabled'])) {
+ continue;
+ }
+ /* determine local and remote peer addresses */
+ if (!isset($ph1ent['mobile'])) {
+ if (!function_exists('ipsec_get_phase1_dst')) {
+ require_once("ipsec.inc");
+ }
+ $rgip = ipsec_get_phase1_dst($ph1ent);
+ if (!$rgip) {
+ $ipfrules .= "# ERROR! Unable to determine remote IPsec peer address for {$ph1ent['remote-gateway']}\n";
+ continue;
+ }
+ } else {
+ $rgip = " any ";
+ }
+ /* Determine best description */
+ if ($ph1ent['descr']) {
+ $descr = $ph1ent['descr'];
+ } else {
+ $descr = $rgip;
+ }
+ /*
+ * Step through all phase2 entries and determine
+ * which protocols are in use with this peer
+ */
+ $prot_used_esp = false;
+ $prot_used_ah = false;
+ if (is_array($config['ipsec']['phase2'])) {
+ foreach ($config['ipsec']['phase2'] as $ph2ent) {
+ /* only evaluate ph2's bound to our ph1 */
+ if ($ph2ent['ikeid'] != $ph1ent['ikeid']) {
+ continue;
+ }
+ if ($ph2ent['protocol'] == 'esp') {
+ $prot_used_esp = true;
+ }
+ if ($ph2ent['protocol'] == 'ah') {
+ $prot_used_ah = true;
+ }
+ }
+ }
+
+ if (strpos($ph1ent['interface'], "_vip")) {
+ $parentinterface = get_configured_carp_interface_list($ph1ent['interface'], '', 'iface');
+ } else {
+ $parentinterface = $ph1ent['interface'];
+ }
+ if (empty($FilterIflist[$parentinterface]['descr'])) {
+ $ipfrules .= "# Could not locate interface for IPsec: {$descr}\n";
+ continue;
+ }
+
+ unset($gateway);
+ /* add endpoint routes to correct gateway on interface if the
+ remote endpoint is not on this interface's subnet */
+ if ((isset($ph1ent['mobile']) || is_ipaddrv4($rgip)) && (interface_has_gateway($parentinterface))) {
+ $parentifsubnet = get_interface_ip($parentinterface) . "/" . get_interface_subnet($parentinterface);
+ if (isset($ph1ent['mobile']) || !ip_in_subnet($rgip, $parentifsubnet)) {
+ $gateway = get_interface_gateway($parentinterface);
+ $interface = $FilterIflist[$parentinterface]['if'];
+
+ $route_to = " route-to ( $interface $gateway ) ";
+ $reply_to = " reply-to ( $interface $gateway ) ";
+ }
+ } else if ((isset($ph1ent['mobile']) || is_ipaddrv6($rgip)) && (interface_has_gatewayv6($parentinterface))) {
+ $parentifsubnet = get_interface_ipv6($parentinterface) . "/" . get_interface_subnetv6($parentinterface);
+ if (isset($ph1ent['mobile']) || !ip_in_subnet($rgip, $parentifsubnet)) {
+ $gateway = get_interface_gateway_v6($parentinterface);
+ $interface = $FilterIflist[$parentinterface]['if'];
+
+ $route_to = " route-to ( $interface $gateway ) ";
+ $reply_to = " reply-to ( $interface $gateway ) ";
+ }
+ }
+
+ /* Just in case */
+ if ((!is_ipaddr($gateway) || empty($interface))) {
+ $route_to = " ";
+ $reply_to = " ";
+ }
+
+ /* Add rules to allow IKE to pass */
+ $shorttunneldescr = substr($descr, 0, 35);
+ $ipfrules .= <<<EOD
+pass out {$log['pass']} $route_to proto udp from any to {$rgip} port = 500 tracker {$increment_tracker($tracker)} keep state label "IPsec: {$shorttunneldescr} - outbound isakmp"
+pass in {$log['pass']} on \${$FilterIflist[$parentinterface]['descr']} $reply_to proto udp from {$rgip} to any port = 500 tracker {$increment_tracker($tracker)} keep state label "IPsec: {$shorttunneldescr} - inbound isakmp"
+
+EOD;
+ /* If NAT-T is enabled, add additional rules */
+ if ($ph1ent['nat_traversal'] != "off") {
+ $ipfrules .= <<<EOD
+pass out {$log['pass']} $route_to proto udp from any to {$rgip} port = 4500 tracker {$increment_tracker($tracker)} keep state label "IPsec: {$shorttunneldescr} - outbound nat-t"
+pass in {$log['pass']} on \${$FilterIflist[$parentinterface]['descr']} $reply_to proto udp from {$rgip} to any port = 4500 tracker {$increment_tracker($tracker)} keep state label "IPsec: {$shorttunneldescr} - inbound nat-t"
+
+EOD;
+ }
+ /* Add rules to allow the protocols in use */
+ if ($prot_used_esp) {
+ $ipfrules .= <<<EOD
+pass out {$log['pass']} $route_to proto esp from any to {$rgip} tracker {$increment_tracker($tracker)} keep state label "IPsec: {$shorttunneldescr} - outbound esp proto"
+pass in {$log['pass']} on \${$FilterIflist[$parentinterface]['descr']} $reply_to proto esp from {$rgip} to any tracker {$increment_tracker($tracker)} keep state label "IPsec: {$shorttunneldescr} - inbound esp proto"
+
+EOD;
+ }
+ if ($prot_used_ah) {
+ $ipfrules .= <<<EOD
+pass out {$log['pass']} $route_to proto ah from any to {$rgip} tracker {$increment_tracker($tracker)} keep state label "IPsec: {$shorttunneldescr} - outbound ah proto"
+pass in {$log['pass']} on \${$FilterIflist[$parentinterface]['descr']} $reply_to proto ah from {$rgip} to any tracker {$increment_tracker($tracker)} keep state label "IPsec: {$shorttunneldescr} - inbound ah proto"
+
+EOD;
+ }
+ }
+ }
+ return($ipfrules);
+}
+
+function discover_pkg_rules($ruletype) {
+ global $config, $g, $aliases;
+
+ /* Bail if there is no pkg directory, or if the package files might be out of sync. */
+ if (!is_dir("/usr/local/pkg") || file_exists('/conf/needs_package_sync')) {
+ return "";
+ }
+
+ $rules = "";
+ $files = glob("/usr/local/pkg/*.inc");
+ foreach ($files as $pkg_inc) {
+ update_filter_reload_status(sprintf(gettext('Checking for %1$s PF hooks in package %2$s'), $ruletype, $pkg_inc));
+ $pkg = basename($pkg_inc, ".inc");
+ $pkg_generate_rules = "{$pkg}_generate_rules";
+ if (!function_exists($pkg_generate_rules)) {
+ require_once($pkg_inc);
+ }
+ if (function_exists($pkg_generate_rules)) {
+ update_filter_reload_status(sprintf(gettext('Processing early %1$s rules for package %2$s'), $ruletype, $pkg_inc));
+ $tmprules = $pkg_generate_rules("$ruletype");
+ file_put_contents("{$g['tmp_path']}/rules.test.packages", $aliases . $tmprules);
+ $status = mwexec("/sbin/pfctl -nf {$g['tmp_path']}/rules.test.packages");
+ if ($status <> 0) {
+ $errorrules = sprintf(gettext("There was an error while parsing the package filter rules for %s."), $pkg_inc) . "\n";
+ log_error($errorrules);
+ file_put_contents("{$g['tmp_path']}/rules.packages.{$pkg}", "#{$errorrules}\n{$tmprules}\n");
+ continue;
+ }
+ $rules .= $tmprules;
+ }
+ }
+ return $rules;
+}
+
+function filter_get_antilockout_ports($wantarray = false) {
+ global $config;
+
+ $lockoutports = array();
+ $guiport = ($config['system']['webgui']['protocol'] == "https") ? "443" : "80";
+ $guiport = empty($config['system']['webgui']['port']) ? $guiport : $config['system']['webgui']['port'];
+ $lockoutports[] = $guiport;
+
+ if (($config['system']['webgui']['protocol'] == "https") && !isset($config['system']['webgui']['disablehttpredirect']) && ($guiport != "80")) {
+ $lockoutports[] = "80";
+ }
+
+ if (isset($config['system']['enablesshd'])) {
+ $lockoutports[] = empty($config['system']['ssh']['port']) ? "22" : $config['system']['ssh']['port'];
+ }
+
+ if ($wantarray) {
+ return $lockoutports;
+ } else {
+ return implode(" ", $lockoutports);
+ }
+
+}
+
+?>
diff --git a/src/etc/inc/filter_log.inc b/src/etc/inc/filter_log.inc
new file mode 100644
index 0000000..999d81a
--- /dev/null
+++ b/src/etc/inc/filter_log.inc
@@ -0,0 +1,441 @@
+<?php
+/* $Id$ */
+/*
+ filter_log.inc
+ part of pfSesne by Scott Ullrich
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2009 Jim Pingle <myfirstname>@<mylastname>.org
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/sbin/fifolog_reader /usr/bin/tail /usr/local/sbin/clog
+ pfSense_MODULE: filter
+*/
+
+require 'config.inc';
+
+global $buffer_rules_rdr, $buffer_rules_normal;
+$buffer_rules_rdr = array();
+$buffer_rules_normal = array();
+
+/* format filter logs */
+function conv_log_filter($logfile, $nentries, $tail = 50, $filtertext = "", $filterinterface = null) {
+ global $config, $g;
+
+ /* Make sure this is a number before using it in a system call */
+ if (!(is_numeric($tail))) {
+ return;
+ }
+
+ if ($filtertext) {
+ $tail = 5000;
+ }
+
+ /* Always do a reverse tail, to be sure we're grabbing the 'end' of the log. */
+ $logarr = "";
+
+ if (isset($config['system']['usefifolog'])) {
+ exec("/usr/sbin/fifolog_reader " . escapeshellarg($logfile) . " | /usr/bin/grep 'filterlog:' | /usr/bin/tail -r -n {$tail}", $logarr);
+ } else {
+ exec("/usr/local/sbin/clog " . escapeshellarg($logfile) . " | grep -v \"CLOG\" | grep -v \"\033\" | /usr/bin/grep 'filterlog:' | /usr/bin/tail -r -n {$tail}", $logarr);
+ }
+
+ $filterlog = array();
+ $counter = 0;
+
+ $filterinterface = strtoupper($filterinterface);
+ foreach ($logarr as $logent) {
+ if ($counter >= $nentries) {
+ break;
+ }
+
+ $flent = parse_filter_line($logent);
+ if (!$filterinterface || ($filterinterface == $flent['interface'])) {
+ if ((($flent != "") && (!is_array($filtertext)) && (match_filter_line ($flent, $filtertext))) ||
+ (($flent != "") && (is_array($filtertext)) && (match_filter_field($flent, $filtertext)))) {
+ $counter++;
+ $filterlog[] = $flent;
+ }
+ }
+ }
+ /* Since the lines are in reverse order, flip them around if needed based on the user's preference */
+ return isset($config['syslog']['reverse']) ? $filterlog : array_reverse($filterlog);
+}
+
+function escape_filter_regex($filtertext) {
+ /* If the caller (user) has not already put a backslash before a slash, to escape it in the regex, */
+ /* then this will do it. Take out any "\/" already there, then turn all ordinary "/" into "\/". */
+ return str_replace('/', '\/', str_replace('\/', '/', $filtertext));
+}
+
+function match_filter_line($flent, $filtertext = "") {
+ if (!$filtertext) {
+ return true;
+ }
+ $filtertext = escape_filter_regex(str_replace(' ', '\s+', $filtertext));
+ return @preg_match("/{$filtertext}/i", implode(" ", array_values($flent)));
+}
+
+function match_filter_field($flent, $fields) {
+ foreach ($fields as $key => $field) {
+ if ($field == "All") {
+ continue;
+ }
+ if ((strpos($field, '!') === 0)) {
+ $field = substr($field, 1);
+ if (strtolower($key) == 'act') {
+ if (in_arrayi($flent[$key], explode(" ", $field))) {
+ return false;
+ }
+ } else {
+ $field_regex = escape_filter_regex($field);
+ if (@preg_match("/{$field_regex}/i", $flent[$key])) {
+ return false;
+ }
+ }
+ } else {
+ if (strtolower($key) == 'act') {
+ if (!in_arrayi($flent[$key], explode(" ", $field))) {
+ return false;
+ }
+ } else {
+ $field_regex = escape_filter_regex($field);
+ if (!@preg_match("/{$field_regex}/i", $flent[$key])) {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+}
+
+// Case Insensitive in_array function
+function in_arrayi($needle, $haystack) {
+ return in_array(strtolower($needle), array_map('strtolower', $haystack));
+}
+
+function parse_filter_line($line) {
+ global $config, $g;
+
+ $flent = array();
+ $log_split = "";
+
+ if (!preg_match("/(.*)\s(.*)\sfilterlog:\s(.*)$/", $line, $log_split)) {
+ return "";
+ }
+
+ list($all, $flent['time'], $host, $rule) = $log_split;
+
+ $rule_data = explode(",", $rule);
+ $field = 0;
+
+ $flent['rulenum'] = $rule_data[$field++];
+ $flent['subrulenum'] = $rule_data[$field++];
+ $flent['anchor'] = $rule_data[$field++];
+ $flent['tracker'] = $rule_data[$field++];
+ $flent['realint'] = $rule_data[$field++];
+ $flent['interface'] = convert_real_interface_to_friendly_descr($flent['realint']);
+ $flent['reason'] = $rule_data[$field++];
+ $flent['act'] = $rule_data[$field++];
+ $flent['direction'] = $rule_data[$field++];
+ $flent['version'] = $rule_data[$field++];
+
+ if ($flent['version'] == '4' || $flent['version'] == '6') {
+ if ($flent['version'] == '4') {
+ $flent['tos'] = $rule_data[$field++];
+ $flent['ecn'] = $rule_data[$field++];
+ $flent['ttl'] = $rule_data[$field++];
+ $flent['id'] = $rule_data[$field++];
+ $flent['offset'] = $rule_data[$field++];
+ $flent['flags'] = $rule_data[$field++];
+ $flent['protoid'] = $rule_data[$field++];
+ $flent['proto'] = strtoupper($rule_data[$field++]);
+ } else {
+ $flent['class'] = $rule_data[$field++];
+ $flent['flowlabel'] = $rule_data[$field++];
+ $flent['hlim'] = $rule_data[$field++];
+ $flent['proto'] = $rule_data[$field++];
+ $flent['protoid'] = $rule_data[$field++];
+ }
+
+ $flent['length'] = $rule_data[$field++];
+ $flent['srcip'] = $rule_data[$field++];
+ $flent['dstip'] = $rule_data[$field++];
+
+ if ($flent['protoid'] == '6' || $flent['protoid'] == '17') { // TCP or UDP
+ $flent['srcport'] = $rule_data[$field++];
+ $flent['dstport'] = $rule_data[$field++];
+
+ $flent['src'] = $flent['srcip'] . ':' . $flent['srcport'];
+ $flent['dst'] = $flent['dstip'] . ':' . $flent['dstport'];
+
+ $flent['datalen'] = $rule_data[$field++];
+ if ($flent['protoid'] == '6') { // TCP
+ $flent['tcpflags'] = $rule_data[$field++];
+ $flent['seq'] = $rule_data[$field++];
+ $flent['ack'] = $rule_data[$field++];
+ $flent['window'] = $rule_data[$field++];
+ $flent['urg'] = $rule_data[$field++];
+ $flent['options'] = explode(";", $rule_data[$field++]);
+ }
+ } else if ($flent['protoid'] == '1') { // ICMP
+ $flent['src'] = $flent['srcip'];
+ $flent['dst'] = $flent['dstip'];
+
+ $flent['icmp_type'] = $rule_data[$field++];
+
+ switch ($flent['icmp_type']) {
+ case "request":
+ case "reply":
+ $flent['icmp_id'] = $rule_data[$field++];
+ $flent['icmp_seq'] = $rule_data[$field++];
+ break;
+ case "unreachproto":
+ $flent['icmp_dstip'] = $rule_data[$field++];
+ $flent['icmp_protoid'] = $rule_data[$field++];
+ break;
+ case "unreachport":
+ $flent['icmp_dstip'] = $rule_data[$field++];
+ $flent['icmp_protoid'] = $rule_data[$field++];
+ $flent['icmp_port'] = $rule_data[$field++];
+ break;
+ case "unreach":
+ case "timexceed":
+ case "paramprob":
+ case "redirect":
+ case "maskreply":
+ $flent['icmp_descr'] = $rule_data[$field++];
+ break;
+ case "needfrag":
+ $flent['icmp_dstip'] = $rule_data[$field++];
+ $flent['icmp_mtu'] = $rule_data[$field++];
+ break;
+ case "tstamp":
+ $flent['icmp_id'] = $rule_data[$field++];
+ $flent['icmp_seq'] = $rule_data[$field++];
+ break;
+ case "tstampreply":
+ $flent['icmp_id'] = $rule_data[$field++];
+ $flent['icmp_seq'] = $rule_data[$field++];
+ $flent['icmp_otime'] = $rule_data[$field++];
+ $flent['icmp_rtime'] = $rule_data[$field++];
+ $flent['icmp_ttime'] = $rule_data[$field++];
+ break;
+ default :
+ $flent['icmp_descr'] = $rule_data[$field++];
+ break;
+ }
+
+ } else if ($flent['protoid'] == '2') { // IGMP
+ $flent['src'] = $flent['srcip'];
+ $flent['dst'] = $flent['dstip'];
+ } else if ($flent['protoid'] == '112') { // CARP
+ $flent['type'] = $rule_data[$field++];
+ $flent['ttl'] = $rule_data[$field++];
+ $flent['vhid'] = $rule_data[$field++];
+ $flent['version'] = $rule_data[$field++];
+ $flent['advskew'] = $rule_data[$field++];
+ $flent['advbase'] = $rule_data[$field++];
+ }
+ } else {
+ if ($g['debug']) {
+ log_error(sprintf(gettext("There was a error parsing rule number: %s. Please report to mailing list or forum."), $flent['rulenum']));
+ }
+ return "";
+ }
+
+ /* If there is a src, a dst, and a time, then the line should be usable/good */
+ if (!((trim($flent['src']) == "") || (trim($flent['dst']) == "") || (trim($flent['time']) == ""))) {
+ return $flent;
+ } else {
+ if ($g['debug']) {
+ log_error(sprintf(gettext("There was a error parsing rule: %s. Please report to mailing list or forum."), $errline));
+ }
+ return "";
+ }
+}
+
+function get_port_with_service($port, $proto) {
+ if (!$port) {
+ return '';
+ }
+
+ $service = getservbyport($port, $proto);
+ $portstr = "";
+ if ($service) {
+ $portstr = sprintf('<span title="' . gettext('Service %1$s/%2$s: %3$s') . '">' . htmlspecialchars($port) . '</span>', $port, $proto, $service);
+ } else {
+ $portstr = htmlspecialchars($port);
+ }
+ return ':' . $portstr;
+}
+
+function find_rule_by_number($rulenum, $trackernum, $type="block") {
+ global $g;
+
+ /* Passing arbitrary input to grep could be a Very Bad Thing(tm) */
+ if (!is_numeric($rulenum) || !is_numeric($trackernum) || !in_array($type, array('pass', 'block', 'match', 'rdr'))) {
+ return;
+ }
+
+ if ($trackernum == "0") {
+ $lookup_pattern = "^@{$rulenum}\([0-9]+\)[[:space:]]{$type}[[:space:]].*[[:space:]]log[[:space:]]";
+ } else {
+ $lookup_pattern = "^@[0-9]+\({$trackernum}\)[[:space:]]{$type}[[:space:]].*[[:space:]]log[[:space:]]";
+ }
+
+ /* At the moment, miniupnpd is the only thing I know of that
+ generates logging rdr rules */
+ unset($buffer);
+ if ($type == "rdr") {
+ $_gb = exec("/sbin/pfctl -vvPsn -a \"miniupnpd\" | /usr/bin/egrep " . escapeshellarg("^@{$rulenum}"), $buffer);
+ } else {
+ if (file_exists("{$g['tmp_path']}/rules.debug")) {
+ $_gb = exec("/sbin/pfctl -vvPnf {$g['tmp_path']}/rules.debug 2>/dev/null | /usr/bin/egrep " . escapeshellarg($lookup_pattern), $buffer);
+ } else {
+ $_gb = exec("/sbin/pfctl -vvPsr | /usr/bin/egrep " . escapeshellarg($lookup_pattern), $buffer);
+ }
+ }
+ if (is_array($buffer)) {
+ return $buffer[0];
+ }
+
+ return "";
+}
+
+function buffer_rules_load() {
+ global $g, $buffer_rules_rdr, $buffer_rules_normal;
+ unset($buffer, $buffer_rules_rdr, $buffer_rules_normal);
+ /* Redeclare globals after unset to work around PHP */
+ global $buffer_rules_rdr, $buffer_rules_normal;
+ $buffer_rules_rdr = array();
+ $buffer_rules_normal = array();
+
+ $_gb = exec("/sbin/pfctl -vvPsn -a \"miniupnpd\" | grep '^@'", $buffer);
+ if (is_array($buffer)) {
+ foreach ($buffer as $line) {
+ list($key, $value) = explode (" ", $line, 2);
+ $buffer_rules_rdr[$key] = $value;
+ }
+ }
+ unset($buffer, $_gb);
+ if (file_exists("{$g['tmp_path']}/rules.debug")) {
+ $_gb = exec("/sbin/pfctl -vvPnf {$g['tmp_path']}/rules.debug 2>/dev/null | /usr/bin/egrep '^@[0-9]+\([0-9]+\)[[:space:]].*[[:space:]]log[[:space:]]' | /usr/bin/egrep -v '^@[0-9]+\([0-9]+\)[[:space:]](nat|rdr|binat|no|scrub)'", $buffer);
+ } else {
+ $_gb = exec("/sbin/pfctl -vvPsr | /usr/bin/egrep '^@[0-9]+\([0-9]+\)[[:space:]].*[[:space:]]log[[:space:]]'", $buffer);
+ }
+
+ if (is_array($buffer)) {
+ foreach ($buffer as $line) {
+ list($key, $value) = explode (" ", $line, 2);
+ # pfctl rule number output with tracker number: @dd(dddddddddd)
+ $matches = array();
+ if (preg_match('/\@(?P<rulenum>\d+)\((?<trackernum>\d+)\)/', $key, $matches) == 1) {
+ if ($matches['trackernum'] > 0) {
+ $key = $matches['trackernum'];
+ } else {
+ $key = "@{$matches['rulenum']}";
+ }
+ }
+ $buffer_rules_normal[$key] = $value;
+ }
+ }
+ unset($_gb, $buffer);
+}
+
+function buffer_rules_clear() {
+ unset($GLOBALS['buffer_rules_normal']);
+ unset($GLOBALS['buffer_rules_rdr']);
+}
+
+function find_rule_by_number_buffer($rulenum, $trackernum, $type) {
+ global $g, $buffer_rules_rdr, $buffer_rules_normal;
+
+ if ($trackernum == "0") {
+ $lookup_key = "@{$rulenum}";
+ } else {
+ $lookup_key = $trackernum;
+ }
+
+ if ($type == "rdr") {
+ $ruleString = $buffer_rules_rdr[$lookup_key];
+ //TODO: get the correct 'description' part of a RDR log line. currently just first 30 characters..
+ $rulename = substr($ruleString, 0, 30);
+ } else {
+ $ruleString = $buffer_rules_normal[$lookup_key];
+ list(,$rulename,) = explode("\"", $ruleString);
+ $rulename = str_replace("USER_RULE: ", '<img src="/themes/' . $g['theme'] . '/images/icons/icon_frmfld_user.png" width="11" height="12" title="USER_RULE" alt="USER_RULE"/> ', $rulename);
+ }
+ return "{$rulename} ({$lookup_key})";
+}
+
+function find_action_image($action) {
+ global $g;
+ if ((strstr(strtolower($action), "p")) || (strtolower($action) == "rdr")) {
+ return "/themes/{$g['theme']}/images/icons/icon_pass.gif";
+ } else if (strstr(strtolower($action), "r")) {
+ return "/themes/{$g['theme']}/images/icons/icon_reject.gif";
+ } else {
+ return "/themes/{$g['theme']}/images/icons/icon_block.gif";
+ }
+}
+
+/* AJAX specific handlers */
+function handle_ajax($nentries, $tail = 50) {
+ global $config;
+ if ($_GET['lastsawtime'] or $_POST['lastsawtime']) {
+ global $filter_logfile, $filterent;
+ if ($_GET['lastsawtime']) {
+ $lastsawtime = $_GET['lastsawtime'];
+ }
+ if ($_POST['lastsawtime']) {
+ $lastsawtime = $_POST['lastsawtime'];
+ }
+ /* compare lastsawrule's time stamp to filter logs.
+ * afterwards return the newer records so that client
+ * can update AJAX interface screen.
+ */
+ $new_rules = "";
+ $filterlog = conv_log_filter($filter_logfile, $nentries, $tail);
+ /* We need this to always be in forward order for the AJAX update to work properly */
+ $filterlog = isset($config['syslog']['reverse']) ? array_reverse($filterlog) : $filterlog;
+ foreach ($filterlog as $log_row) {
+ $row_time = strtotime($log_row['time']);
+ $img = "<img border='0' src='" . find_action_image($log_row['act']) . "' alt={$log_row['act']} title={$log_row['act']} />";
+ if ($row_time > $lastsawtime) {
+ if ($log_row['proto'] == "TCP") {
+ $log_row['proto'] .= ":{$log_row['tcpflags']}";
+ }
+
+ $img = "<a href=\"#\" onClick=\"javascript:getURL('diag_logs_filter.php?getrulenum={$log_row['rulenum']},{$log_row['rulenum']}', outputrule);\">{$img}</a>";
+ $new_rules .= "{$img}||{$log_row['time']}||{$log_row['interface']}||{$log_row['srcip']}||{$log_row['srcport']}||{$log_row['dstip']}||{$log_row['dstport']}||{$log_row['proto']}||{$log_row['version']}||" . time() . "||\n";
+ }
+ }
+ echo $new_rules;
+ exit;
+ }
+}
+
+?>
diff --git a/src/etc/inc/functions.inc b/src/etc/inc/functions.inc
new file mode 100644
index 0000000..2c8f4c8
--- /dev/null
+++ b/src/etc/inc/functions.inc
@@ -0,0 +1,158 @@
+<?php
+/* $Id$ */
+/*
+ functions.inc
+ Copyright (C) 2004-2006 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_MODULE: utils
+
+*/
+
+/* BEGIN compatibility goo with HEAD */
+if (!function_exists("gettext")) {
+ function gettext($text) {
+ return $text;
+ }
+}
+
+if (!function_exists("pfSenseHeader")) {
+ /****f* pfsense-utils/pfSenseHeader
+ * NAME
+ * pfSenseHeader
+ * INPUTS
+ * none
+ * RESULT
+ * Javascript header change or browser Location:
+ ******/
+ function pfSenseHeader($text) {
+ global $_SERVER;
+ if (isAjax()) {
+ if ($_SERVER['HTTPS'] == "on") {
+ $protocol = "https";
+ } else {
+ $protocol = "http";
+ }
+
+ $port = ":{$_SERVER['SERVER_PORT']}";
+ if ($_SERVER['SERVER_PORT'] == "80" && $protocol == "http") {
+ $port = "";
+ }
+ if ($_SERVER['SERVER_PORT'] == "443" && $protocol == "https") {
+ $port = "";
+ }
+ $complete_url = "{$protocol}://{$_SERVER['SERVER_NAME']}{$port}/{$text}";
+ echo "\ndocument.location.href = '{$complete_url}';\n";
+ } else {
+ header("Location: $text");
+ }
+ }
+}
+/* END compatibility goo with HEAD */
+
+/*fetch menu notices function*/
+if (!function_exists("get_menu_messages")) {
+ function get_menu_messages() {
+ global $g, $config;
+ if (are_notices_pending()) {
+ $notices = get_notices();
+ $requests = array();
+
+ ## Get Query Arguments from URL ###
+ foreach ($_REQUEST as $key => $value) {
+ if ($key != "PHPSESSID") {
+ $requests[] = $key.'='.$value;
+ }
+ }
+ if (is_array($requests)) {
+ $request_string = implode("&", $requests);
+ }
+
+ if (is_array($notices)) {
+ $notice_msgs = "<table colspan=\'6\' id=\'notice_table\'>";
+ $alert_style="style=\'color:#ffffff; filter:Glow(color=#ff0000, strength=12);\' ";
+ $notice = "<a href=\'#\' onclick=notice_action(\'acknowledge\',\'all\');domTT_close(this); {$alert_style}>".gettext("Acknowledge All Notices")."</a>";
+ $alert_link="title=\'".gettext("Click to Acknowledge")."\' {$alert_style}";
+ $domtt_width=500;
+ foreach ($notices as $key => $value) {
+ $date = date("m-d-y H:i:s", $key);
+ $noticemsg = ($value['notice'] != "" ? $value['notice'] : $value['id']);
+ $noticemsg = preg_replace("/(\"|\'|\n|<.?\w+>)/i", "", $noticemsg);
+ if ((strlen($noticemsg)* 8) > $domtt_width) {
+ $domtt_width=(strlen($noticemsg) *8);
+ }
+ if ((strlen($noticemsg)* 8) > 900) {
+ $domtt_width= 900;
+ }
+ $alert_action ="onclick=notice_action(\'acknowledge\',\'{$key}\');domTT_close(this);jQuery(this).parent().parent().remove();";
+ $notice_msgs .= "<tr><td valign=\'top\' width=\'120\'><a href=\'#\' {$alert_link} {$alert_action}>{$date}</a></td><td valign=\'top\'><a href=\'#\' {$alert_link} {$alert_action}>[ ".htmlspecialchars($noticemsg)."]</a></td></tr>";
+ }
+ $notice_msgs .="</table>";
+
+ $domtt= "onclick=\"domTT_activate(this, event, 'caption', '{$notice}','content', '<br />{$notice_msgs}', 'trail', false, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle','width','{$domtt_width}','y',5,'type', 'sticky');\"";
+ $menu_messages="<div id='alerts'>\n";
+ if (count($notices) == 1) {
+ $msg= sprintf("%1$02d", count($notices)) . " " . gettext("unread notice");
+ } else {
+ $msg= sprintf("%1$02d", count($notices)) . " " . gettext("unread notices");
+ }
+ $menu_messages .= "<div id='marquee-text' style='z-index:1001;'><a href='#' {$domtt}><b> .:. {$msg} .:. </b></a></div>\n";
+ $menu_messages .= "</div>\n";
+ }
+ } else {
+ $menu_messages = '<div id="hostname">';
+ $menu_messages .= $config['system']['hostname'] . "." . $config['system']['domain'];
+ $menu_messages .= '</div>';
+ }
+ return ($menu_messages);
+ }
+}
+
+if (!function_exists("dom_title")) {
+ function dom_title($title_msg, $width=NULL) {
+ $width=preg_replace("/\D+/", "", $width);
+ if (!empty($width)) {
+ $width=",'width',$width";
+ }
+ if (!empty($title_msg)) {
+ $title_msg=preg_replace("/\s+/", " ", $title_msg);
+ $title_msg=preg_replace("/'/", "\'", $title_msg);
+ return "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '{$title_msg}', 'trail', true, 'delay', 250, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle' $width);\"";
+ }
+ }
+}
+/* include all configuration functions */
+require_once("interfaces.inc");
+require_once("gwlb.inc");
+require_once("services.inc");
+require_once("pfsense-utils.inc");
+require_once("certs.inc");
+require_once("system.inc");
+require_once("vslb.inc");
+
+?>
diff --git a/src/etc/inc/globals.inc b/src/etc/inc/globals.inc
new file mode 100644
index 0000000..f7fe0fc
--- /dev/null
+++ b/src/etc/inc/globals.inc
@@ -0,0 +1,195 @@
+<?php
+/* $Id$ */
+/*
+ globals.inc
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004-2010 Scott Ullrich
+
+ Originally Part of m0n0wall
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_MODULE: utils
+
+*/
+
+global $g;
+$g = array(
+ "base_packages" => "siproxd",
+ "event_address" => "unix:///var/run/check_reload_status",
+ "factory_shipped_username" => "admin",
+ "factory_shipped_password" => "pfsense",
+ "upload_path" => "/root",
+ "dhcpd_chroot_path" => "/var/dhcpd",
+ "unbound_chroot_path" => "/var/unbound",
+ "var_path" => "/var",
+ "varrun_path" => "/var/run",
+ "varetc_path" => "/var/etc",
+ "vardb_path" => "/var/db",
+ "varlog_path" => "/var/log",
+ "etc_path" => "/etc",
+ "tmp_path" => "/tmp",
+ "conf_path" => "/conf",
+ "conf_default_path" => "/conf.default",
+ "cf_path" => "/cf",
+ "cf_conf_path" => "/cf/conf",
+ "www_path" => "/usr/local/www",
+ "xml_rootobj" => "pfsense",
+ "admin_group" => "admins",
+ "product_name" => "pfSense",
+ "product_version" => trim(file_get_contents("/etc/version"), " \n"),
+ "product_copyright" => "Electric Sheep Fencing LLC",
+ "product_copyright_url" => "http://www.electricsheepfencing.com",
+ "product_copyright_years" => "2004 - ".date("Y"),
+ "product_website" => "www.pfsense.org",
+ "product_website_footer" => "https://www.pfsense.org/?gui22",
+ "product_email" => "coreteam@pfsense.org",
+ "hideplatform" => false,
+ "hidedownloadbackup" => false,
+ "hidebackupbeforeupgrade" => false,
+ "disablethemeselection" => false,
+ "disablehelpmenu" => false,
+ "disablehelpicon" => false,
+ "disablecrashreporter" => false,
+ "crashreporterurl" => "https://crashreporter.pfsense.org/crash_reporter.php",
+ "debug" => false,
+ "latest_config" => "11.9",
+ "nopkg_platforms" => array("cdrom"),
+ "minimum_ram_warning" => "101",
+ "minimum_ram_warning_text" => "128 MB",
+ "wan_interface_name" => "wan",
+ "xmlrpcbaseurl" => "https://packages.pfsense.org",
+ "captiveportal_path" => "/usr/local/captiveportal",
+ "captiveportal_element_path" => "/var/db/cpelements",
+ "captiveportal_element_sizelimit" => 1048576,
+ "xmlrpcpath" => "/xmlrpc.php",
+ "embeddedbootupslice" => "/dev/ad0a",
+ "services_dhcp_server_enable" => true,
+ "wireless_regex" => "/^(ndis|wi|ath|an|ral|ural|iwi|wlan|rum|run|bwn|zyd|mwl|bwi|ipw|iwn|malo|uath|upgt|urtw|wpi)/",
+ "help_base_url" => "/help.php",
+ "pkg_prefix" => "pfSense-pkg-"
+);
+
+/* IP TOS flags */
+$iptos = array("lowdelay", "throughput", "reliability");
+
+/* TCP flags */
+$tcpflags = array("syn", "ack", "fin", "rst", "psh", "urg", "ece", "cwr");
+
+if (file_exists("/etc/platform")) {
+ $arch = php_uname("m");
+
+ if (strstr($g['product_version'], "-RELEASE")) {
+ /* This is only necessary for RELEASE */
+ $arch = ($arch == "i386") ? "" : '/' . $arch;
+ /* Full installs and NanoBSD use the same update directory and manifest in 2.x */
+ $g['update_url']="https://updates.pfsense.org/_updaters{$arch}";
+ $g['update_manifest']="https://updates.pfsense.org/manifest";
+ } else {
+ /* Full installs and NanoBSD use the same update directory and manifest in 2.x */
+ $g['update_url']="https://snapshots.pfsense.org/FreeBSD_releng/10.1/{$arch}/pfSense_HEAD/.updaters/";
+ $g['update_manifest']="https://updates.pfSense.org/manifest";
+ }
+
+ $g['platform'] = trim(file_get_contents("/etc/platform"));
+ if ($g['platform'] == "nanobsd") {
+ $g['firmware_update_text']="pfSense-*.img.gz";
+ $g['hidedownloadbackup'] = true;
+ $g['hidebackupbeforeupgrade'] = true;
+
+ } else {
+ $g['firmware_update_text']="pfSense-*.tgz";
+ }
+}
+
+/* Default sysctls */
+$sysctls = array("net.inet.ip.portrange.first" => "1024",
+ "net.inet.tcp.blackhole" => "2",
+ "net.inet.udp.blackhole" => "1",
+ "net.inet.ip.random_id" => "1",
+ "net.inet.tcp.drop_synfin" => "1",
+ "net.inet.ip.redirect" => "1",
+ "net.inet6.ip6.redirect" => "1",
+ "net.inet6.ip6.use_tempaddr" => "0",
+ "net.inet6.ip6.prefer_tempaddr" => "0",
+ "net.inet.tcp.syncookies" => "1",
+ "net.inet.tcp.recvspace" => "65228",
+ "net.inet.tcp.sendspace" => "65228",
+ "net.inet.ip.fastforwarding" => "0",
+ "net.inet.tcp.delayed_ack" => "0",
+ "net.inet.udp.maxdgram" => "57344",
+ "net.link.bridge.pfil_onlyip" => "0",
+ "net.link.bridge.pfil_member" => "1",
+ "net.link.bridge.pfil_bridge" => "0",
+ "net.link.tap.user_open" => "1",
+ "kern.randompid" => "347",
+ "net.inet.ip.intr_queue_maxlen" => "1000",
+ "hw.syscons.kbd_reboot" => "0",
+ "net.inet.tcp.log_debug" => "0",
+ "net.inet.tcp.tso" => "1",
+ "net.inet.icmp.icmplim" => "0",
+ "vfs.read_max" => "32",
+ "kern.ipc.maxsockbuf" => "4262144",
+ "net.inet.ip.process_options" => 0,
+ "kern.random.sys.harvest.interrupt" => 0,
+ "kern.random.sys.harvest.point_to_point" => 0,
+ "kern.random.sys.harvest.ethernet" => 0,
+ "net.route.netisr_maxqlen" => 1024,
+ "net.inet.udp.checksum" => 1,
+ "net.bpf.zerocopy_enable" => 1,
+ "net.inet.icmp.reply_from_interface" => 1,
+ "net.inet6.ip6.rfc6204w3" => 1,
+ "net.enc.out.ipsec_bpf_mask" => "0x0001",
+ "net.enc.out.ipsec_filter_mask" => "0x0001",
+ "net.enc.in.ipsec_bpf_mask" => "0x0002",
+ "net.enc.in.ipsec_filter_mask" => "0x0002",
+ "net.key.preferred_oldsa" => "0",
+ "net.inet.carp.senderr_demotion_factor" => 0, /* Do not demote CARP for interface send errors */
+ "net.pfsync.carp_demotion_factor" => 0 /* Do not demote CARP for pfsync errors */
+);
+
+/* Include override values for the above if needed. If the file doesn't exist, don't try to load it. */
+if (file_exists("/etc/inc/globals_override.inc")) {
+ @include("globals_override.inc");
+}
+
+function platform_booting($on_console = false) {
+ global $g;
+
+ if ($g['booting'] || file_exists("{$g['varrun_path']}/booting")) {
+ if ($on_console == false || php_sapi_name() != 'fpm-fcgi') {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+if (file_exists("{$g['cf_conf_path']}/enableserial_force")) {
+ $g['enableserial_force'] = true;
+}
+
+$config_parsed = false;
+
+?>
diff --git a/src/etc/inc/gmirror.inc b/src/etc/inc/gmirror.inc
new file mode 100644
index 0000000..9e26dfb
--- /dev/null
+++ b/src/etc/inc/gmirror.inc
@@ -0,0 +1,342 @@
+<?php
+/*
+ gmirror.inc
+ Copyright (C) 2009-2014 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+global $balance_methods;
+$balance_methods = array("load", "prefer", "round-robin", "split");
+
+/* Create a status array for each mirror and its disk components. */
+function gmirror_get_status() {
+ $status = "";
+ exec("/sbin/gmirror status -s", $status);
+ $mirrors = array();
+
+ /* Empty output = no mirrors found */
+ if (count($status) > 0) {
+ /* Loop through gmirror status output. */
+ foreach ($status as $line) {
+ /* Split the line by whitespace */
+ $all = preg_split("/[\s\t]+/", trim($line), 3);
+ if (count($all) == 3) {
+ /* If there are three items on a line, it is mirror name, status, and component */
+ $currentmirror = basename($all[0]);
+ $mirrors[$currentmirror]['name'] = basename($all[0]);
+ $mirrors[$currentmirror]['status'] = $all[1];
+ if (!is_array($mirrors[$currentmirror]['components'])) {
+ $mirrors[$currentmirror]['components'] = array();
+ }
+ $mirrors[$currentmirror]['components'][] = $all[2];
+ }
+ }
+ }
+ /* Return an hash of mirrors and components */
+ return $mirrors;
+}
+
+/* Get only status word for a single mirror. */
+function gmirror_get_status_single($mirror) {
+ $status = "";
+ $mirror_status = gmirror_get_status();
+ return $mirror_status[$mirror]['status'];
+}
+
+/* Generate an HTML formatted status for mirrors and disks in a small format for the widget */
+function gmirror_html_status() {
+ $mirrors = gmirror_get_status();
+ $output = "";
+ if (count($mirrors) > 0) {
+ $output .= "<tr>\n";
+ $output .= "<td width=\"40%\" class=\"vncellt\">Name</td>\n";
+ $output .= "<td width=\"40%\" class=\"vncellt\">Status</td>\n";
+ $output .= "<td width=\"20%\" class=\"vncellt\">Component</td>\n";
+ $output .= "</tr>\n";
+ foreach ($mirrors as $mirror => $name) {
+ $components = count($name["components"]);
+ $output .= "<tr>\n";
+ $output .= "<td width=\"40%\" rowspan=\"{$components}\" class=\"listr\">{$name['name']}</td>\n";
+ $output .= "<td width=\"40%\" rowspan=\"{$components}\" class=\"listr\">{$name['status']}</td>\n";
+ $output .= "<td width=\"20%\" class=\"listr\">{$name['components'][0]}</td>\n";
+ $output .= "</tr>\n";
+ if (count($name["components"]) > 1) {
+ $morecomponents = array_slice($name["components"], 1);
+ foreach ($morecomponents as $component) {
+ $output .= "<tr>\n";
+ $output .= "<td width=\"20%\" class=\"listr\">{$component}</td>\n";
+ $output .= "</tr>\n";
+ }
+ }
+ }
+ } else {
+ $output .= "<tr><td colspan=\"3\" class=\"listr\">No Mirrors Found</td></tr>\n";
+ }
+ // $output .= "<tr><td colspan=\"3\" class=\"listr\">Updated at " . date("F j, Y, g:i:s a") . "</td></tr>\n";
+ return $output;
+}
+
+/* List all disks in the system (potential gmirror targets) */
+function gmirror_get_disks() {
+ $disklist = "";
+ /* Get a list of disks in a scriptable way, exclude optical drives */
+ exec("/sbin/geom disk status -s | /usr/bin/grep -v '[[:blank:]]*cd[[:digit:]]*' | /usr/bin/awk '{print $1;}'", $disklist);
+ return $disklist;
+}
+
+/* List all potential gmirror consumers */
+function gmirror_get_unused_consumers() {
+ $consumerlist = "";
+ $disklist = gmirror_get_disks();
+ /* Get a list of consumers, exclude existing mirrors and diskid entries */
+ exec("/sbin/geom part status -s | /usr/bin/egrep -v '(mirror|diskid)' | /usr/bin/awk '{print $1, $3;}'", $consumerlist);
+ $all_consumers = array();
+ foreach ($consumerlist as $cl) {
+ $parts = explode(" ", $cl);
+ foreach ($parts as $part) {
+ $all_consumers[] = $part;
+ }
+ }
+ foreach ($disklist as $d) {
+ if (!is_consumer_used($d) && !in_array($d, $all_consumers)) {
+ $all_consumers[] = $d;
+ }
+ }
+ return $all_consumers;
+}
+
+/* List all existing geom mirrors */
+function gmirror_get_mirrors() {
+ $mirrorlist = "";
+ exec("/sbin/gmirror list | /usr/bin/grep '^Geom name:' | /usr/bin/awk '{print $3;}'", $mirrorlist);
+ return $mirrorlist;
+}
+
+
+/* List all consumers for a given mirror */
+function gmirror_get_consumers_in_mirror($mirror) {
+ if (!is_valid_mirror($mirror)) {
+ return array();
+ }
+
+ $consumers = array();
+ exec("/sbin/gmirror status -s " . escapeshellarg($mirror) . " | /usr/bin/awk '{print $3;}'", $consumers);
+ return $consumers;
+}
+
+/* Test if a given consumer is a member of an existing mirror */
+function is_consumer_in_mirror($consumer, $mirror) {
+ if (!is_valid_consumer($consumer) || !is_valid_mirror($mirror)) {
+ return false;
+ }
+
+ $mirrorconsumers = gmirror_get_consumers_in_mirror($mirror);
+ return in_array(basename($consumer), $mirrorconsumers);
+}
+
+/* Test if a mirror exists */
+function is_valid_mirror($mirror) {
+ $mirrors = gmirror_get_mirrors();
+ return in_array($mirror, $mirrors);
+}
+
+/* Test if a disk is valid/exists */
+function is_valid_disk($disk) {
+ $adisks = gmirror_get_disks();
+ return in_array(basename($disk), $adisks);
+}
+
+/* Test if a consumer is valid and in use in a mirror */
+function is_consumer_used($consumer) {
+ $found = false;
+ $mirrors = gmirror_get_mirrors();
+ foreach ($mirrors as $mirror) {
+ $consumers = gmirror_get_consumers_in_mirror($mirror);
+ if (in_array($consumer, $consumers)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+/* Test if a consumer is valid and not in use */
+function is_consumer_unused($consumer) {
+ $consumers = gmirror_get_unused_consumers();
+ return in_array($consumer, $consumers);
+}
+
+/* Test if a consumer is valid (either a disk or partition) */
+function is_valid_consumer($consumer) {
+ return (is_consumer_unused($consumer) || is_consumer_used($consumer));
+}
+
+/* Remove all disconnected drives from a mirror */
+function gmirror_forget_disconnected($mirror) {
+ if (!is_valid_mirror($mirror)) {
+ return false;
+ }
+ return mwexec("/sbin/gmirror forget " . escapeshellarg($mirror));
+}
+
+/* Insert another consumer into a mirror */
+function gmirror_insert_consumer($mirror, $consumer) {
+ if (!is_valid_mirror($mirror) || !is_valid_consumer($consumer)) {
+ return false;
+ }
+ return mwexec("/sbin/gmirror insert " . escapeshellarg($mirror) . " " . escapeshellarg($consumer));
+}
+
+/* Remove consumer from a mirror and clear its metadata */
+function gmirror_remove_consumer($mirror, $consumer) {
+ if (!is_valid_mirror($mirror) || !is_valid_consumer($consumer)) {
+ return false;
+ }
+ return mwexec("/sbin/gmirror remove " . escapeshellarg($mirror) . " " . escapeshellarg($consumer));
+}
+
+/* Wipe geom info from drive (if mirror is not running) */
+function gmirror_clear_consumer($consumer) {
+ if (!is_valid_consumer($consumer)) {
+ return false;
+ }
+ return mwexec("/sbin/gmirror clear " . escapeshellarg($consumer));
+}
+
+/* Find the balance method used by a given mirror */
+function gmirror_get_mirror_balance($mirror) {
+ if (!is_valid_mirror($mirror)) {
+ return false;
+ }
+ $balancemethod = "";
+ exec("/sbin/gmirror list " . escapeshellarg($mirror) . " | /usr/bin/grep '^Balance:' | /usr/bin/awk '{print $2;}'", $balancemethod);
+ return $balancemethod[0];
+}
+
+/* Change balance algorithm of the mirror */
+function gmirror_configure_balance($mirror, $balancemethod) {
+ global $balance_methods;
+ if (!is_valid_mirror($mirror) || !in_array($balancemethod, $balance_methods)) {
+ return false;
+ }
+ return mwexec("/sbin/gmirror configure -b " . escapeshellarg($balancemethod) . " " . escapeshellarg($mirror));
+}
+
+/* Force a mirror member to rebuild */
+function gmirror_force_rebuild($mirror, $consumer) {
+ if (!is_valid_mirror($mirror) || !is_valid_consumer($consumer)) {
+ return false;
+ }
+ return mwexec("/sbin/gmirror rebuild " . escapeshellarg($mirror) . " " . escapeshellarg($consumer));
+}
+
+/* Show all metadata on the physical consumer */
+function gmirror_get_consumer_metadata($consumer) {
+ if (!is_valid_consumer($consumer)) {
+ return array();
+ }
+ $output = "";
+ exec("/sbin/gmirror dump " . escapeshellarg($consumer), $output);
+ return array_map('trim', $output);
+}
+
+/* Test if a consumer has metadata, indicating it is a member of a mirror (active or inactive) */
+function gmirror_consumer_has_metadata($consumer) {
+ return (count(gmirror_get_consumer_metadata($consumer)) > 0);
+}
+
+/* Find the mirror to which this consumer belongs */
+function gmirror_get_consumer_metadata_mirror($consumer) {
+ if (!is_valid_consumer($consumer)) {
+ return array();
+ }
+ $metadata = gmirror_get_consumer_metadata($consumer);
+ foreach ($metadata as $line) {
+ if (substr($line, 0, 5) == "name:") {
+ list ($key, $value) = explode(":", $line, 2);
+ return trim($value);
+ }
+ }
+}
+
+/* Deactivate consumer, removing it from service in the mirror, but leave metadata intact */
+function gmirror_deactivate_consumer($mirror, $consumer) {
+ if (!is_valid_mirror($mirror) || !is_valid_consumer($consumer)) {
+ return false;
+ }
+ return mwexec("/sbin/gmirror deactivate " . escapeshellarg($mirror) . " " . escapeshellarg($consumer));
+}
+
+/* Reactivate a deactivated consumer */
+function gmirror_activate_consumer($mirror, $consumer) {
+ if (!is_valid_mirror($mirror) || !is_valid_consumer($consumer)) {
+ return false;
+ }
+ return mwexec("/sbin/gmirror activate " . escapeshellarg($mirror) . " " . escapeshellarg($consumer));
+}
+
+/* Find the size of the given mirror */
+function gmirror_get_mirror_size($mirror) {
+ if (!is_valid_mirror($mirror)) {
+ return false;
+ }
+ $mirrorsize = "";
+ exec("/sbin/gmirror list " . escapeshellarg($mirror) . " | /usr/bin/grep 'Mediasize:' | /usr/bin/head -n 1 | /usr/bin/awk '{print $2;}'", $mirrorsize);
+ return $mirrorsize[0];
+}
+
+/* Return a list of all potential consumers on a disk with sizes. The geom part
+ list output is a little odd, we can't get the output for just the disk, if the disk contains
+ slices those get output also. */
+function gmirror_get_all_unused_consumer_sizes_on_disk($disk) {
+ if (!is_valid_disk($disk) || !is_consumer_unused($disk)) {
+ return array();
+ }
+ $output = "";
+ exec("/sbin/geom part list " . escapeshellarg($disk) . " | /usr/bin/egrep '(Name:|Mediasize:)' | /usr/bin/cut -c4- | /usr/bin/sed -l -e 'N;s/\\nMediasize://;P;D;' | /usr/bin/cut -c7-", $output);
+ if (empty($output)) {
+ exec("/sbin/geom disk list " . escapeshellarg($disk) . " | /usr/bin/egrep '(Name:|Mediasize:)' | /usr/bin/cut -c4- | /usr/bin/sed -l -e 'N;s/\\nMediasize://;P;D;' | /usr/bin/cut -c7-", $output);
+ }
+ $disk_contents = array();
+ foreach ($output as $line) {
+ list($name, $size, $humansize) = explode(" ", $line, 3);
+ $consumer = array();
+ $consumer['name'] = $name;
+ $consumer['size'] = $size;
+ $consumer['humansize'] = $humansize;
+ $disk_contents[] = $consumer;
+ }
+ return $disk_contents;
+}
+
+/* Get only the size for one specific potential consumer. */
+function gmirror_get_unused_consumer_size($consumer) {
+ $consumersizes = gmirror_get_all_unused_consumer_sizes_on_disk($consumer);
+ foreach ($consumersizes as $csize) {
+ if ($csize['name'] == $consumer) {
+ return $csize['size'];
+ }
+ }
+ return -1;
+}
+?>
diff --git a/src/etc/inc/growl.class b/src/etc/inc/growl.class
new file mode 100644
index 0000000..8f639e5
--- /dev/null
+++ b/src/etc/inc/growl.class
@@ -0,0 +1,102 @@
+<?PHP
+/*
+ pfSense_MODULE: notifications
+*/
+
+ class Growl
+ {
+ const GROWL_PRIORITY_LOW = -2;
+ const GROWL_PRIORITY_MODERATE = -1;
+ const GROWL_PRIORITY_NORMAL = 0;
+ const GROWL_PRIORITY_HIGH = 1;
+ const GROWL_PRIORITY_EMERGENCY = 2;
+
+ private $appName;
+ private $address;
+ private $notifications;
+ private $password;
+ private $port;
+
+ public function __construct($address, $password = '', $app_name = 'PHP-Growl')
+ {
+ $this->appName = utf8_encode($app_name);
+ $this->address = $address;
+ $this->notifications = array();
+ $this->password = $password;
+ $this->port = 9887;
+ }
+
+ public function addNotification($name, $enabled = true)
+ {
+ $this->notifications[] = array('name' => utf8_encode($name), 'enabled' => $enabled);
+ }
+
+ public function register()
+ {
+ $data = '';
+ $defaults = '';
+ $num_defaults = 0;
+
+ for ($i = 0; $i < count($this->notifications); $i++)
+ {
+ $data .= pack('n', strlen($this->notifications[$i]['name'])) . $this->notifications[$i]['name'];
+ if ($this->notifications[$i]['enabled'])
+ {
+ $defaults .= pack('c', $i);
+ $num_defaults++;
+ }
+ }
+
+ // pack(Protocol version, type, app name, number of notifications to register)
+ $data = pack('c2nc2', 1, 0, strlen($this->appName), count($this->notifications), $num_defaults) . $this->appName . $data . $defaults;
+ $data .= pack('H32', md5($data . $this->password));
+
+ return $this->send($data);
+ }
+
+ public function notify($name, $title, $message, $priority = 0, $sticky = false)
+ {
+ $name = utf8_encode($name);
+ $title = utf8_encode($title);
+ $message = utf8_encode($message);
+ $priority = intval($priority);
+
+ $flags = ($priority & 7) * 2;
+ if ($priority < 0) $flags |= 8;
+ if ($sticky) $flags |= 1;
+
+ // pack(protocol version, type, priority/sticky flags, notification name length, title length, message length. app name length)
+ $data = pack('c2n5', 1, 1, $flags, strlen($name), strlen($title), strlen($message), strlen($this->appName));
+ $data .= $name . $title . $message . $this->appName;
+ $data .= pack('H32', md5($data . $this->password));
+
+ return $this->send($data);
+ }
+
+ private function send($data)
+ {
+ if (function_exists('socket_create') && function_exists('socket_sendto'))
+ {
+ $sck = @socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
+ if ($sck) {
+ socket_sendto($sck, $data, strlen($data), 0x100, $this->address, $this->port);
+ return true;
+ }
+ }
+ elseif (function_exists('fsockopen'))
+ {
+ if ($this->address) {
+ $fp = @fsockopen('udp://' . $this->address, $this->port);
+ if ($fp) {
+ fwrite($fp, $data);
+ fclose($fp);
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+ }
+
+?> \ No newline at end of file
diff --git a/src/etc/inc/gwlb.inc b/src/etc/inc/gwlb.inc
new file mode 100644
index 0000000..9880cdc
--- /dev/null
+++ b/src/etc/inc/gwlb.inc
@@ -0,0 +1,1252 @@
+<?php
+/*
+ gwlb.inc
+ Copyright (C) 2008 Bill Marquette, Seth Mos
+ Copyright (C) 2010 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_BUILDER_BINARIES: /sbin/route /usr/local/sbin/apinger
+ pfSense_MODULE: routing
+
+ */
+require_once("config.inc");
+require_once("rrd.inc");
+
+/* Returns an array of default values used for apinger.conf */
+function return_apinger_defaults() {
+ return array(
+ "latencylow" => "200",
+ "latencyhigh" => "500",
+ "losslow" => "10",
+ "losshigh" => "20",
+ "interval" => "1",
+ "down" => "10",
+ "avg_delay_samples" => "10",
+ "avg_loss_samples" => "50",
+ "avg_loss_delay_samples" => "20");
+}
+
+/*
+ * Creates monitoring configuration file and
+ * adds appropriate static routes.
+ */
+function setup_gateways_monitor() {
+ global $config, $g;
+
+ $gateways_arr = return_gateways_array();
+ if (!is_array($gateways_arr)) {
+ log_error("No gateways to monitor. Apinger will not be run.");
+ killbypid("{$g['varrun_path']}/apinger.pid");
+ @unlink("{$g['varrun_path']}/apinger.status");
+ return;
+ }
+
+ $apinger_debug = "";
+ if (isset($config['system']['apinger_debug'])) {
+ $apinger_debug = "debug on";
+ }
+
+ $apinger_default = return_apinger_defaults();
+ $apingerconfig = <<<EOD
+
+# pfSense apinger configuration file. Automatically Generated!
+
+{$apinger_debug}
+
+## User and group the pinger should run as
+user "root"
+group "wheel"
+
+## Mailer to use (default: "/usr/lib/sendmail -t")
+#mailer "/var/qmail/bin/qmail-inject"
+
+## Location of the pid-file (default: "/var/run/apinger.pid")
+pid_file "{$g['varrun_path']}/apinger.pid"
+
+## Format of timestamp (%s macro) (default: "%b %d %H:%M:%S")
+#timestamp_format "%Y%m%d%H%M%S"
+
+status {
+ ## File where the status information should be written to
+ file "{$g['varrun_path']}/apinger.status"
+ ## Interval between file updates
+ ## when 0 or not set, file is written only when SIGUSR1 is received
+ interval 5s
+}
+
+########################################
+# RRDTool status gathering configuration
+# Interval between RRD updates
+rrd interval 60s;
+
+## These parameters can be overridden in a specific alarm configuration
+alarm default {
+ command on "/usr/local/sbin/pfSctl -c 'service reload dyndns %T' -c 'service reload ipsecdns' -c 'service reload openvpn %T' -c 'filter reload' "
+ command off "/usr/local/sbin/pfSctl -c 'service reload dyndns %T' -c 'service reload ipsecdns' -c 'service reload openvpn %T' -c 'filter reload' "
+ combine 10s
+}
+
+## "Down" alarm definition.
+## This alarm will be fired when target doesn't respond for 30 seconds.
+alarm down "down" {
+ time {$apinger_default['down']}s
+}
+
+## "Delay" alarm definition.
+## This alarm will be fired when responses are delayed more than 200ms
+## it will be canceled, when the delay drops below 100ms
+alarm delay "delay" {
+ delay_low {$apinger_default['latencylow']}ms
+ delay_high {$apinger_default['latencyhigh']}ms
+}
+
+## "Loss" alarm definition.
+## This alarm will be fired when packet loss goes over 20%
+## it will be canceled, when the loss drops below 10%
+alarm loss "loss" {
+ percent_low {$apinger_default['losslow']}
+ percent_high {$apinger_default['losshigh']}
+}
+
+target default {
+ ## How often the probe should be sent
+ interval {$apinger_default['interval']}s
+
+ ## How many replies should be used to compute average delay
+ ## for controlling "delay" alarms
+ avg_delay_samples {$apinger_default['avg_delay_samples']}
+
+ ## How many probes should be used to compute average loss
+ avg_loss_samples {$apinger_default['avg_loss_samples']}
+
+ ## The delay (in samples) after which loss is computed
+ ## without this delays larger than interval would be treated as loss
+ avg_loss_delay_samples {$apinger_default['avg_loss_delay_samples']}
+
+ ## Names of the alarms that may be generated for the target
+ alarms "down","delay","loss"
+
+ ## Location of the RRD
+ #rrd file "{$g['vardb_path']}/rrd/apinger-%t.rrd"
+}
+
+EOD;
+
+ $monitor_ips = array();
+ foreach ($gateways_arr as $name => $gateway) {
+ /* Do not monitor if such was requested */
+ if (isset($gateway['monitor_disable'])) {
+ continue;
+ }
+ if (empty($gateway['monitor']) || !is_ipaddr($gateway['monitor'])) {
+ if (is_ipaddr($gateway['gateway'])) {
+ $gateway['monitor'] = $gateway['gateway'];
+ } else { /* No chance to get an ip to monitor skip target. */
+ continue;
+ }
+ }
+
+ /* if the monitor address is already used before, skip */
+ if (in_array($gateway['monitor'], $monitor_ips)) {
+ continue;
+ }
+
+ /* Interface ip is needed since apinger will bind a socket to it.
+ * However the config GUI should already have checked this and when
+ * PPoE is used the IP address is set to "dynamic". So using is_ipaddrv4
+ * or is_ipaddrv6 to identify packet type would be wrong, especially as
+ * further checks (that can cope with the "dynamic" case) are present inside
+ * the if block. So using $gateway['ipprotocol'] is the better option.
+ */
+ if ($gateway['ipprotocol'] == "inet") { // This is an IPv4 gateway...
+ $gwifip = find_interface_ip($gateway['interface'], true);
+ if (!is_ipaddrv4($gwifip)) {
+ continue; //Skip this target
+ }
+
+ if ($gwifip == "0.0.0.0") {
+ continue; //Skip this target - the gateway is still waiting for DHCP
+ }
+
+ /*
+ * If the gateway is the same as the monitor we do not add a
+ * route as this will break the routing table.
+ * Add static routes for each gateway with their monitor IP
+ * not strictly necessary but is a added level of protection.
+ */
+ if (is_ipaddrv4($gateway['gateway']) && $gateway['monitor'] != $gateway['gateway']) {
+ log_error("Removing static route for monitor {$gateway['monitor']} and adding a new route through {$gateway['gateway']}");
+ if (interface_isppp_type($gateway['friendlyiface'])) {
+ mwexec("/sbin/route change -host " . escapeshellarg($gateway['monitor']) .
+ " -iface " . escapeshellarg($gateway['interface']), true);
+ } else {
+ mwexec("/sbin/route change -host " . escapeshellarg($gateway['monitor']) .
+ " " . escapeshellarg($gateway['gateway']), true);
+ }
+
+ pfSense_kill_states("0.0.0.0/0", $gateway['monitor'], $gateway['interface'], "icmp");
+ }
+ } else if ($gateway['ipprotocol'] == "inet6") { // This is an IPv6 gateway...
+ if ($gateway['monitor'] == $gateway['gateway']) {
+ /* link locals really need a different src ip */
+ if (is_linklocal($gateway['gateway'])) {
+ if (!strpos($gateway['gateway'], '%')) {
+ $gateway['gateway'] .= '%' . $gateway['interface'];
+ }
+ $gwifip = find_interface_ipv6_ll($gateway['interface'], true);
+ } else {
+ $gwifip = find_interface_ipv6($gateway['interface'], true);
+ }
+ } else {
+ /* 'monitor' has been set, so makes sure it has precedence over
+ * 'gateway' in defining the source IP. Otherwise if 'gateway'
+ * is a local link and 'monitor' is global routable then the
+ * ICMP6 response would not find its way back home...
+ */
+ $gwifip = find_interface_ipv6($gateway['interface'], true);
+ }
+
+ /* Make sure srcip and target have scope defined when they are ll */
+ if (is_linklocal($gwifip) && !strpos($gwifip, '%')) {
+ $gwifip .= '%' . $gateway['interface'];
+ }
+ if (is_linklocal($gateway['monitor']) && !strpos($gateway['monitor'], '%')) {
+ $gateway['monitor'] .= "%{$gateway['interface']}";
+ }
+
+ if (!is_ipaddrv6($gwifip)) {
+ continue; //Skip this target
+ }
+
+ /*
+ * If the gateway is the same as the monitor we do not add a
+ * route as this will break the routing table.
+ * Add static routes for each gateway with their monitor IP
+ * not strictly necessary but is a added level of protection.
+ */
+ if ($gateway['gateway'] != $gateway['monitor']) {
+ log_error("Removing static route for monitor {$gateway['monitor']} and adding a new route through {$gateway['gateway']}");
+ if (interface_isppp_type($gateway['friendlyiface'])) {
+ mwexec("/sbin/route change -host -inet6 " . escapeshellarg($gateway['monitor']) .
+ " -iface " . escapeshellarg($gateway['interface']), true);
+ } else {
+ mwexec("/sbin/route change -host -inet6 " . escapeshellarg($gateway['monitor']) .
+ " " . escapeshellarg($gateway['gateway']), true);
+ }
+
+ pfSense_kill_states("::0.0.0.0/0", $gateway['monitor'], $gateway['interface'], "icmpv6");
+ }
+ } else {
+ continue;
+ }
+
+ $monitor_ips[] = $gateway['monitor'];
+ $apingercfg = "target \"{$gateway['monitor']}\" {\n";
+ $apingercfg .= " description \"{$name}\"\n";
+ $apingercfg .= " srcip \"{$gwifip}\"\n";
+
+ ## How often the probe should be sent
+ if (!empty($gateway['interval']) && is_numeric($gateway['interval'])) {
+ $interval = intval($gateway['interval']); # Restrict to Integer
+ if ($interval < 1) {
+ $interval = 1; # Minimum
+ }
+ if ($interval != $apinger_default['interval']) { # If not default value
+ $apingercfg .= " interval " . $interval . "s\n";
+ }
+ }
+
+ ## How many replies should be used to compute average delay
+ ## for controlling "delay" alarms
+ if (!empty($gateway['avg_delay_samples']) && is_numeric($gateway['avg_delay_samples'])) {
+ $avg_delay_samples = intval($gateway['avg_delay_samples']); # Restrict to Integer
+ if ($avg_delay_samples < 1) {
+ $avg_delay_samples = 1; # Minimum
+ }
+ if ($avg_delay_samples != $apinger_default['avg_delay_samples']) { # If not default value
+ $apingercfg .= " avg_delay_samples " . $avg_delay_samples . "\n";
+ }
+ }
+
+ ## How many probes should be used to compute average loss
+ if (!empty($gateway['avg_loss_samples']) && is_numeric($gateway['avg_loss_samples'])) {
+ $avg_loss_samples = intval($gateway['avg_loss_samples']); # Restrict to Integer
+ if ($avg_loss_samples < 1) {
+ $avg_loss_samples = 1; # Minimum
+ }
+ if ($avg_loss_samples != $apinger_default['avg_loss_samples']) { # If not default value
+ $apingercfg .= " avg_loss_samples " . $avg_loss_samples . "\n";
+ }
+ }
+
+ ## The delay (in samples) after which loss is computed
+ ## without this delays larger than interval would be treated as loss
+ if (!empty($gateway['avg_loss_delay_samples']) && is_numeric($gateway['avg_loss_delay_samples'])) {
+ $avg_loss_delay_samples = intval($gateway['avg_loss_delay_samples']); # Restrict to Integer
+ if ($avg_loss_delay_samples < 1) {
+ $avg_loss_delay_samples = 1; # Minimum
+ }
+ if ($avg_loss_delay_samples != $apinger_default['avg_loss_delay_samples']) { # If not default value
+ $apingercfg .= " avg_loss_delay_samples " . $avg_loss_delay_samples . "\n";
+ }
+ }
+
+ $alarms = "";
+ $alarmscfg = "";
+ $override = false;
+ if (!empty($gateway['losslow'])) {
+ $alarmscfg .= "alarm loss \"{$name}loss\" {\n";
+ $alarmscfg .= "\tpercent_low {$gateway['losslow']}\n";
+ $alarmscfg .= "\tpercent_high {$gateway['losshigh']}\n";
+ $alarmscfg .= "}\n";
+ $alarms .= "\"{$name}loss\"";
+ $override = true;
+ } else {
+ if ($override == true) {
+ $alarms .= ",";
+ }
+ $alarms .= "\"loss\"";
+ $override = true;
+ }
+ if (!empty($gateway['latencylow'])) {
+ $alarmscfg .= "alarm delay \"{$name}delay\" {\n";
+ $alarmscfg .= "\tdelay_low {$gateway['latencylow']}ms\n";
+ $alarmscfg .= "\tdelay_high {$gateway['latencyhigh']}ms\n";
+ $alarmscfg .= "}\n";
+ if ($override == true) {
+ $alarms .= ",";
+ }
+ $alarms .= "\"{$name}delay\"";
+ $override = true;
+ } else {
+ if ($override == true) {
+ $alarms .= ",";
+ }
+ $alarms .= "\"delay\"";
+ $override = true;
+ }
+ if (!empty($gateway['down'])) {
+ $alarmscfg .= "alarm down \"{$name}down\" {\n";
+ $alarmscfg .= "\ttime {$gateway['down']}s\n";
+ $alarmscfg .= "}\n";
+ if ($override == true) {
+ $alarms .= ",";
+ }
+ $alarms .= "\"{$name}down\"";
+ $override = true;
+ } else {
+ if ($override == true) {
+ $alarms .= ",";
+ }
+ $alarms .= "\"down\"";
+ $override = true;
+ }
+ if ($override == true) {
+ $apingercfg .= "\talarms override {$alarms};\n";
+ }
+
+ if (isset($gateway['force_down'])) {
+ $apingercfg .= "\tforce_down on\n";
+ }
+
+ $apingercfg .= " rrd file \"{$g['vardb_path']}/rrd/{$gateway['name']}-quality.rrd\"\n";
+ $apingercfg .= "}\n";
+ $apingercfg .= "\n";
+
+ $apingerconfig .= $alarmscfg;
+ $apingerconfig .= $apingercfg;
+
+ # Create gateway quality RRD with settings more suitable for pfSense graph set,
+ # since apinger uses default step (300; 5 minutes) and other settings that don't
+ # match the pfSense gateway quality graph set.
+ create_gateway_quality_rrd("{$g['vardb_path']}/rrd/{$gateway['name']}-quality.rrd");
+ }
+ @file_put_contents("{$g['varetc_path']}/apinger.conf", $apingerconfig);
+ unset($apingerconfig);
+
+ /* Restart apinger process */
+ if (isvalidpid("{$g['varrun_path']}/apinger.pid")) {
+ sigkillbypid("{$g['varrun_path']}/apinger.pid", "HUP");
+ } else {
+ /* start a new apinger process */
+ @unlink("{$g['varrun_path']}/apinger.status");
+ sleep(1);
+ mwexec_bg("/usr/local/sbin/apinger -c {$g['varetc_path']}/apinger.conf");
+ sleep(1);
+ sigkillbypid("{$g['varrun_path']}/apinger.pid", "USR1");
+ }
+
+ return 0;
+}
+
+/* return the status of the apinger targets as a array */
+function return_gateways_status($byname = false) {
+ global $config, $g;
+
+ $apingerstatus = array();
+ /* Always get the latest status from apinger */
+ if (file_exists("{$g['varrun_path']}/apinger.pid")) {
+ sigkillbypid("{$g['varrun_path']}/apinger.pid", "USR1");
+ }
+ if (file_exists("{$g['varrun_path']}/apinger.status")) {
+ $apingerstatus = file("{$g['varrun_path']}/apinger.status");
+ } else {
+ $apingerstatus = array();
+ }
+
+ $status = array();
+ foreach ($apingerstatus as $line) {
+ $info = explode("|", $line);
+ if ($byname == false) {
+ $target = $info[0];
+ } else {
+ $target = $info[2];
+ }
+
+ $status[$target] = array();
+ $status[$target]['monitorip'] = $info[0];
+ $status[$target]['srcip'] = $info[1];
+ $status[$target]['name'] = $info[2];
+ $status[$target]['lastcheck'] = $info[5] ? date('r', $info[5]) : date('r');
+ $status[$target]['delay'] = empty($info[6]) ? "0ms" : round($info[6], 1) ."ms" ;
+ $status[$target]['loss'] = empty($info[7]) ? "0.0%" : round($info[7], 1) . "%";
+ $status[$target]['status'] = trim($info[8]);
+ }
+
+ /* tack on any gateways that have monitoring disabled
+ * or are down, which could cause gateway groups to fail */
+ $gateways_arr = return_gateways_array();
+ foreach ($gateways_arr as $gwitem) {
+ if (!isset($gwitem['monitor_disable'])) {
+ continue;
+ }
+ if (!is_ipaddr($gwitem['monitorip'])) {
+ $realif = $gwitem['interface'];
+ $tgtip = get_interface_gateway($realif);
+ if (!is_ipaddr($tgtip)) {
+ $tgtip = "none";
+ }
+ $srcip = find_interface_ip($realif);
+ } else {
+ $tgtip = $gwitem['monitorip'];
+ $srcip = find_interface_ip($realif);
+ }
+ if ($byname == true) {
+ $target = $gwitem['name'];
+ } else {
+ $target = $tgtip;
+ }
+
+ /* failsafe for down interfaces */
+ if ($target == "none") {
+ $target = $gwitem['name'];
+ $status[$target]['name'] = $gwitem['name'];
+ $status[$target]['lastcheck'] = date('r');
+ $status[$target]['delay'] = "0.0ms";
+ $status[$target]['loss'] = "100.0%";
+ $status[$target]['status'] = "down";
+ } else {
+ $status[$target]['monitorip'] = $tgtip;
+ $status[$target]['srcip'] = $srcip;
+ $status[$target]['name'] = $gwitem['name'];
+ $status[$target]['lastcheck'] = date('r');
+ $status[$target]['delay'] = "0.0ms";
+ $status[$target]['loss'] = "0.0%";
+ $status[$target]['status'] = "none";
+ }
+ }
+ return($status);
+}
+
+/* Return all configured gateways on the system */
+function return_gateways_array($disabled = false, $localhost = false, $inactive = false) {
+ global $config, $g;
+
+ $gateways_arr = array();
+ $gateways_arr_temp = array();
+
+ $found_defaultv4 = 0;
+ $found_defaultv6 = 0;
+
+ // Ensure the interface cache is up to date first
+ $interfaces = get_interface_arr(true);
+ $interfaces_v4 = array();
+ $interfaces_v6 = array();
+
+ $i = -1;
+ /* Process/add all the configured gateways. */
+ if (is_array($config['gateways']['gateway_item'])) {
+ foreach ($config['gateways']['gateway_item'] as $gateway) {
+ /* Increment it here to do not skip items */
+ $i++;
+
+ if (empty($config['interfaces'][$gateway['interface']])) {
+ if ($inactive === false) {
+ continue;
+ } else {
+ $gateway['inactive'] = true;
+ }
+ }
+ $wancfg = $config['interfaces'][$gateway['interface']];
+
+ /* skip disabled interfaces */
+ if ($disabled === false && (!isset($wancfg['enable']))) {
+ continue;
+ }
+
+ /* if the gateway is dynamic and we can find the IPv4, Great! */
+ if (empty($gateway['gateway']) || $gateway['gateway'] == "dynamic") {
+ if ($gateway['ipprotocol'] == "inet") {
+ /* we know which interfaces is dynamic, this should be made a function */
+ $gateway['gateway'] = get_interface_gateway($gateway['interface']);
+ /* no IP address found, set to dynamic */
+ if (!is_ipaddrv4($gateway['gateway'])) {
+ $gateway['gateway'] = "dynamic";
+ }
+ $gateway['dynamic'] = true;
+ }
+
+ /* if the gateway is dynamic and we can find the IPv6, Great! */
+ else if ($gateway['ipprotocol'] == "inet6") {
+ /* we know which interfaces is dynamic, this should be made a function, and for v6 too */
+ $gateway['gateway'] = get_interface_gateway_v6($gateway['interface']);
+ /* no IPv6 address found, set to dynamic */
+ if (!is_ipaddrv6($gateway['gateway'])) {
+ $gateway['gateway'] = "dynamic";
+ }
+ $gateway['dynamic'] = true;
+ }
+ } else {
+ /* getting this detection right is hard at this point because we still don't
+ * store the address family in the gateway item */
+ if (is_ipaddrv4($gateway['gateway'])) {
+ $gateway['ipprotocol'] = "inet";
+ } else if (is_ipaddrv6($gateway['gateway'])) {
+ $gateway['ipprotocol'] = "inet6";
+ }
+ }
+
+ if (isset($gateway['monitor_disable'])) {
+ $gateway['monitor_disable'] = true;
+ } else if (empty($gateway['monitor'])) {
+ $gateway['monitor'] = $gateway['gateway'];
+ }
+
+ $gateway['friendlyiface'] = $gateway['interface'];
+
+ /* special treatment for tunnel interfaces */
+ if ($gateway['ipprotocol'] == "inet6") {
+ $gateway['interface'] = get_real_interface($gateway['interface'], "inet6", false, false);
+ $interfaces_v6[$gateway['friendlyiface']] = $gateway['friendlyiface'];
+ } else {
+ $gateway['interface'] = get_real_interface($gateway['interface'], "all", false, false);
+ $interfaces_v4[$gateway['friendlyiface']] = $gateway['friendlyiface'];
+ }
+
+ /* entry has a default flag, use it */
+ if (isset($gateway['defaultgw'])) {
+ if ($gateway['ipprotocol'] == "inet") {
+ $gateway['defaultgw'] = true;
+ $found_defaultv4 = 1;
+ } else if ($gateway['ipprotocol'] == "inet6") {
+ $gateway['defaultgw'] = true;
+ $found_defaultv6 = 1;
+ }
+ }
+ /* include the gateway index as the attribute */
+ $gateway['attribute'] = $i;
+
+ /* Remember all the gateway names, even ones to be skipped because they are disabled. */
+ /* Then we can easily know and match them later when attempting to add dynamic gateways to the list. */
+ $gateways_arr_temp[$gateway['name']] = $gateway;
+
+ /* skip disabled gateways if the caller has not asked for them to be returned. */
+ if (!($disabled === false && isset($gateway['disabled']))) {
+ $gateways_arr[$gateway['name']] = $gateway;
+ }
+ }
+ }
+ unset($gateway);
+
+ /* Loop through all interfaces with a gateway and add it to a array */
+ if ($disabled == false) {
+ $iflist = get_configured_interface_with_descr();
+ } else {
+ $iflist = get_configured_interface_with_descr(false, true);
+ }
+
+ /* Process/add dynamic v4 gateways. */
+ foreach ($iflist as $ifname => $friendly) {
+ if (!interface_has_gateway($ifname)) {
+ continue;
+ }
+
+ if (empty($config['interfaces'][$ifname])) {
+ continue;
+ }
+
+ $ifcfg = &$config['interfaces'][$ifname];
+ if (!isset($ifcfg['enable'])) {
+ continue;
+ }
+
+ if (!empty($ifcfg['ipaddr']) && is_ipaddrv4($ifcfg['ipaddr'])) {
+ continue;
+ }
+
+ if (isset($interfaces_v4[$ifname])) {
+ continue;
+ }
+
+ $ctype = "";
+ switch ($ifcfg['ipaddr']) {
+ case "dhcp":
+ case "pppoe":
+ case "pptp":
+ case "ppp":
+ $ctype = strtoupper($ifcfg['ipaddr']);
+ break;
+ default:
+ $tunnelif = substr($ifcfg['if'], 0, 3);
+ if (substr($ifcfg['if'], 0, 4) == "ovpn") {
+ // if current iface is an ovpn server endpoint then check its type, skip tap only
+ if (substr($ifcfg['if'], 4, 1) == 's') {
+ $ovpnid = substr($ifcfg['if'], 5);
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as & $ovpnserverconf) {
+ if ($ovpnserverconf['vpnid'] == $ovpnid) {
+ if ($ovpnserverconf['dev_mode'] == "tap") {
+ continue 3;
+ }
+ }
+ }
+ }
+ }
+ $ctype = "VPNv4";
+ } else if ($tunnelif == "gif" || $tunnelif == "gre") {
+ $ctype = "TUNNELv4";
+ }
+ break;
+ }
+ $ctype = "_". strtoupper($ctype);
+
+ $gateway = array();
+ $gateway['dynamic'] = false;
+ $gateway['ipprotocol'] = "inet";
+ $gateway['gateway'] = get_interface_gateway($ifname, $gateway['dynamic']);
+ $gateway['interface'] = get_real_interface($ifname);
+ $gateway['friendlyiface'] = $ifname;
+ $gateway['name'] = "{$friendly}{$ctype}";
+ $gateway['attribute'] = "system";
+
+ if (($gateway['dynamic'] === "default") && ($found_defaultv4 == 0)) {
+ $gateway['defaultgw'] = true;
+ $gateway['dynamic'] = true;
+ $found_defaultv4 = 1;
+ }
+ /* Loopback dummy for dynamic interfaces without a IP */
+ if (!is_ipaddrv4($gateway['gateway']) && $gateway['dynamic'] == true) {
+ $gateway['gateway'] = "dynamic";
+ }
+
+ /* automatically skip known static and dynamic gateways that were previously processed */
+ foreach ($gateways_arr_temp as $gateway_item) {
+ if ((($ifname == $gateway_item['friendlyiface'] && $friendly == $gateway_item['name'])&& ($gateway['ipprotocol'] == $gateway_item['ipprotocol'])) ||
+ (($ifname == $gateway_item['friendlyiface'] && $gateway_item['dynamic'] == true) && ($gateway['ipprotocol'] == $gateway_item['ipprotocol']))) {
+ continue 2;
+ }
+ }
+
+ if (is_ipaddrv4($gateway['gateway'])) {
+ $gateway['monitor'] = $gateway['gateway'];
+ }
+
+ $gateway['descr'] = "Interface {$friendly}{$ctype} Gateway";
+ $gateways_arr[$gateway['name']] = $gateway;
+ }
+ unset($gateway);
+
+ /* Process/add dynamic v6 gateways. */
+ foreach ($iflist as $ifname => $friendly) {
+ /* If the user has disabled IPv6, they probably don't want any IPv6 gateways. */
+ if (!isset($config['system']['ipv6allow'])) {
+ break;
+ }
+
+ if (!interface_has_gatewayv6($ifname)) {
+ continue;
+ }
+
+ if (empty($config['interfaces'][$ifname])) {
+ continue;
+ }
+
+ $ifcfg = &$config['interfaces'][$ifname];
+ if (!isset($ifcfg['enable'])) {
+ continue;
+ }
+
+ if (!empty($ifcfg['ipaddrv6']) && is_ipaddrv6($ifcfg['ipaddrv6'])) {
+ continue;
+ }
+
+ if (isset($interfaces_v6[$ifname])) {
+ continue;
+ }
+
+ $ctype = "";
+ switch ($ifcfg['ipaddrv6']) {
+ case "slaac":
+ case "dhcp6":
+ case "6to4":
+ case "6rd":
+ $ctype = strtoupper($ifcfg['ipaddrv6']);
+ break;
+ default:
+ $tunnelif = substr($ifcfg['if'], 0, 3);
+ if (substr($ifcfg['if'], 0, 4) == "ovpn") {
+ // if current iface is an ovpn server endpoint then check its type, skip tap only
+ if (substr($ifcfg['if'], 4, 1) == 's') {
+ $ovpnid = substr($ifcfg['if'], 5);
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as & $ovpnserverconf) {
+ if ($ovpnserverconf['vpnid'] == $ovpnid) {
+ if ($ovpnserverconf['dev_mode'] == "tap") {
+ continue 3;
+ }
+ }
+ }
+ }
+ }
+ $ctype = "VPNv6";
+ } else if ($tunnelif == "gif" || $tunnelif == "gre") {
+ $ctype = "TUNNELv6";
+ }
+ break;
+ }
+ $ctype = "_". strtoupper($ctype);
+
+ $gateway = array();
+ $gateway['dynamic'] = false;
+ $gateway['ipprotocol'] = "inet6";
+ $gateway['gateway'] = get_interface_gateway_v6($ifname, $gateway['dynamic']);
+ $gateway['interface'] = get_real_interface($ifname, "inet6");
+ switch ($ifcfg['ipaddrv6']) {
+ case "6rd":
+ case "6to4":
+ $gateway['dynamic'] = "default";
+ break;
+ }
+ $gateway['friendlyiface'] = $ifname;
+ $gateway['name'] = "{$friendly}{$ctype}";
+ $gateway['attribute'] = "system";
+
+ if (($gateway['dynamic'] === "default") && ($found_defaultv6 == 0)) {
+ $gateway['defaultgw'] = true;
+ $gateway['dynamic'] = true;
+ $found_defaultv6 = 1;
+ }
+
+ /* Loopback dummy for dynamic interfaces without a IP */
+ if (!is_ipaddrv6($gateway['gateway']) && $gateway['dynamic'] == true) {
+ $gateway['gateway'] = "dynamic";
+ }
+
+ /* automatically skip known static and dynamic gateways that were previously processed */
+ foreach ($gateways_arr_temp as $gateway_item) {
+ if ((($ifname == $gateway_item['friendlyiface'] && $friendly == $gateway_item['name']) && ($gateway['ipprotocol'] == $gateway_item['ipprotocol'])) ||
+ (($ifname == $gateway_item['friendlyiface'] && $gateway_item['dynamic'] == true) && ($gateway['ipprotocol'] == $gateway_item['ipprotocol']))) {
+ continue 2;
+ }
+ }
+
+ if (is_ipaddrv6($gateway['gateway'])) {
+ $gateway['monitor'] = $gateway['gateway'];
+ }
+
+ $gateway['descr'] = "Interface {$friendly}{$ctype} Gateway";
+ $gateways_arr[$gateway['name']] = $gateway;
+ }
+ unset($gateway);
+
+ /* FIXME: Should this be enabled.
+ * Some interface like wan might be default but have no info recorded
+ * the config. */
+ /* this is a fallback if all else fails and we want to get packets out @smos */
+ if ($found_defaultv4 == 0 || $found_defaultv6 == 0) {
+ foreach ($gateways_arr as &$gateway) {
+ if (($gateway['friendlyiface'] == "wan") && ($found_defaultv4 == 0) && (!isset($gateway['ipprotocol']) || ($gateway['ipprotocol'] == "inet"))) {
+ if (file_exists("{$g['tmp_path']}/{$gateway['interface']}_defaultgw")) {
+ $gateway['defaultgw'] = true;
+ $found_defaultv4 = 1;
+ }
+ }
+ else if (($gateway['friendlyiface'] == "wan") && ($found_defaultv6 == 0) && ($gateway['ipprotocol'] == "inet6")) {
+ if (file_exists("{$g['tmp_path']}/{$gateway['interface']}_defaultgwv6")) {
+ $gateway['defaultgw'] = true;
+ $found_defaultv6 = 1;
+ }
+ }
+ }
+ }
+
+ if ($localhost === true) {
+ /* attach localhost for Null routes */
+ $gwlo4 = array();
+ $gwlo4['name'] = "Null4";
+ $gwlo4['interface'] = "lo0";
+ $gwlo4['ipprotocol'] = "inet";
+ $gwlo4['gateway'] = "127.0.0.1";
+ $gwlo6 = array();
+ $gwlo6['name'] = "Null6";
+ $gwlo6['interface'] = "lo0";
+ $gwlo6['ipprotocol'] = "inet6";
+ $gwlo6['gateway'] = "::1";
+ $gateways_arr['Null4'] = $gwlo4;
+ $gateways_arr['Null6'] = $gwlo6;
+ }
+ return($gateways_arr);
+}
+
+function fixup_default_gateway($ipprotocol, $gateways_status, $gateways_arr) {
+ global $config, $g;
+ /*
+ * NOTE: The code below is meant to replace the default gateway when it goes down.
+ * This facilitates services running on pfSense itself and are not handled by a PBR to continue working.
+ */
+ $upgw = '';
+ $dfltgwname = '';
+ $dfltgwdown = false;
+ $dfltgwfound = false;
+ foreach ($gateways_arr as $gwname => $gwsttng) {
+ if (($gwsttng['ipprotocol'] == $ipprotocol) && isset($gwsttng['defaultgw'])) {
+ $dfltgwfound = true;
+ $dfltgwname = $gwname;
+ if (!isset($gwsttng['monitor_disable']) && $gateways_status[$gwname]['status'] != "none") {
+ $dfltgwdown = true;
+ }
+ }
+ /* Keep a record of the last up gateway */
+ /* XXX: Blacklist lan for now since it might cause issues to those who have a gateway set for it */
+ if (empty($upgw) && ($gwsttng['ipprotocol'] == $ipprotocol) && (isset($gwsttng['monitor_disable']) || $gateways_status[$gwname]['status'] == "none") && $gwsttng[$gwname]['friendlyiface'] != "lan") {
+ $upgw = $gwname;
+ }
+ if ($dfltgwdown == true && !empty($upgw)) {
+ break;
+ }
+ }
+ if ($dfltgwfound == false) {
+ $gwname = convert_friendly_interface_to_friendly_descr("wan");
+ if (!empty($gateways_status[$gwname]) && stristr($gateways_status[$gwname]['status'], "down")) {
+ $dfltgwdown = true;
+ }
+ }
+ if ($dfltgwdown == true && !empty($upgw)) {
+ if ($gateways_arr[$upgw]['gateway'] == "dynamic") {
+ $gateways_arr[$upgw]['gateway'] = get_interface_gateway($gateways_arr[$upgw]['friendlyiface']);
+ }
+ if (is_ipaddr($gateways_arr[$upgw]['gateway'])) {
+ log_error("Default gateway down setting {$upgw} as default!");
+ if (is_ipaddrv6($gateways_arr[$upgw]['gateway'])) {
+ $inetfamily = "-inet6";
+ } else {
+ $inetfamily = "-inet";
+ }
+ mwexec("/sbin/route change {$inetfamily} default {$gateways_arr[$upgw]['gateway']}");
+ }
+ } else if (!empty($dfltgwname)) {
+ $defaultgw = trim(exec("/sbin/route -n get -{$ipprotocol} default | /usr/bin/awk '/gateway:/ {print $2}'"), " \n");
+ if ($ipprotocol == 'inet6' && !is_ipaddrv6($gateways_arr[$dfltgwname]['gateway'])) {
+ return;
+ }
+ if ($ipprotocol == 'inet' && !is_ipaddrv4($gateways_arr[$dfltgwname]['gateway'])) {
+ return;
+ }
+ if ($defaultgw != $gateways_arr[$dfltgwname]['gateway']) {
+ mwexec("/sbin/route change -{$ipprotocol} default {$gateways_arr[$dfltgwname]['gateway']}");
+ }
+ }
+}
+
+/*
+ * Return an array with all gateway groups with name as key
+ * All gateway groups will be processed before returning the array.
+ */
+function return_gateway_groups_array() {
+ global $config, $g;
+
+ /* fetch the current gateways status */
+ $gateways_status = return_gateways_status(true);
+ $gateways_arr = return_gateways_array();
+ $gateway_groups_array = array();
+
+ if (isset($config['system']['gw_switch_default'])) {
+ fixup_default_gateway("inet", $gateways_status, $gateways_arr);
+ fixup_default_gateway("inet6", $gateways_status, $gateways_arr);
+ }
+ if (is_array($config['gateways']['gateway_group'])) {
+ $carplist = get_configured_carp_interface_list();
+ foreach ($config['gateways']['gateway_group'] as $group) {
+ /* create array with group gateways members separated by tier */
+ $tiers = array();
+ $backupplan = array();
+ $gwvip_arr = array();
+ foreach ($group['item'] as $item) {
+ list($gwname, $tier, $vipname) = explode("|", $item);
+
+ if (is_ipaddr($carplist[$vipname])) {
+ if (!is_array($gwvip_arr[$group['name']])) {
+ $gwvip_arr[$group['name']] = array();
+ }
+ $gwvip_arr[$group['name']][$gwname] = $vipname;
+ }
+
+ /* Do it here rather than reiterating again the group in case no member is up. */
+ if (!is_array($backupplan[$tier])) {
+ $backupplan[$tier] = array();
+ }
+ $backupplan[$tier][] = $gwname;
+
+ /* check if the gateway is available before adding it to the array */
+ if (is_array($gateways_status[$gwname])) {
+ $status = $gateways_status[$gwname];
+ $gwdown = false;
+ if (stristr($status['status'], "down")) {
+ $msg = sprintf(gettext("MONITOR: %s is down, omitting from routing group {$group['name']}"), $gwname);
+ $gwdown = true;
+ } else if (stristr($status['status'], "loss") && strstr($group['trigger'], "loss")) {
+ /* packet loss */
+ $msg = sprintf(gettext("MONITOR: %s has packet loss, omitting from routing group {$group['name']}"), $gwname);
+ $gwdown = true;
+ } else if (stristr($status['status'], "delay") && strstr($group['trigger'] , "latency")) {
+ /* high latency */
+ $msg = sprintf(gettext("MONITOR: %s has high latency, omitting from routing group {$group['name']}"), $gwname);
+ $gwdown = true;
+ }
+ if ($gwdown == true) {
+ log_error($msg);
+ notify_via_growl($msg);
+ notify_via_smtp($msg);
+ } else {
+ /* Online add member */
+ if (!is_array($tiers[$tier])) {
+ $tiers[$tier] = array();
+ }
+ $tiers[$tier][] = $gwname;
+ }
+ } else if (isset($gateways_arr[$gwname]['monitor_disable'])) {
+ $tiers[$tier][] = $gwname;
+ }
+ }
+ $tiers_count = count($tiers);
+ if ($tiers_count == 0) {
+ /* Oh dear, we have no members! Engage Plan B */
+ if (!platform_booting()) {
+ $msg = gettext("Gateways status could not be determined, considering all as up/active. (Group: {$group['name']})");
+ log_error($msg);
+ notify_via_growl($msg);
+ //notify_via_smtp($msg);
+ }
+ $tiers = $backupplan;
+ }
+ /* sort the tiers array by the tier key */
+ ksort($tiers);
+
+ /* we do not really foreach the tiers as we stop after the first tier */
+ foreach ($tiers as $tieridx => $tier) {
+ /* process all gateways in this tier */
+ foreach ($tier as $member) {
+ /* determine interface gateway */
+ if (isset($gateways_arr[$member])) {
+ $gateway = $gateways_arr[$member];
+ $int = $gateway['interface'];
+ $gatewayip = "";
+ if (is_ipaddr($gateway['gateway'])) {
+ $gatewayip = $gateway['gateway'];
+ } else if (!empty($int)) {
+ $gatewayip = get_interface_gateway($gateway['friendlyiface']);
+ }
+
+ if (!empty($int)) {
+ $gateway_groups_array[$group['name']]['ipprotocol'] = $gateway['ipprotocol'];
+ if (is_ipaddr($gatewayip)) {
+ $groupmember = array();
+ $groupmember['int'] = $int;
+ $groupmember['gwip'] = $gatewayip;
+ $groupmember['weight'] = isset($gateway['weight']) ? $gateway['weight'] : 1;
+ if (is_array($gwvip_arr[$group['name']])&& !empty($gwvip_arr[$group['name']][$member])) {
+ $groupmember['vip'] = $gwvip_arr[$group['name']][$member];
+ }
+ $gateway_groups_array[$group['name']][] = $groupmember;
+ }
+ }
+ }
+ }
+ /* we should have the 1st available tier now, exit stage left */
+ if (count($gateway_groups_array[$group['name']]) > 0) {
+ break;
+ } else {
+ log_error("GATEWAYS: Group {$group['name']} did not have any gateways up on tier {$tieridx}!");
+ }
+ }
+ }
+ }
+
+ return ($gateway_groups_array);
+}
+
+/* Update DHCP WAN Interface ip address in gateway group item */
+function dhclient_update_gateway_groups_defaultroute($interface = "wan") {
+ global $config, $g;
+ foreach ($config['gateways']['gateway_item'] as & $gw) {
+ if ($gw['interface'] == $interface) {
+ $current_gw = get_interface_gateway($interface);
+ if ($gw['gateway'] <> $current_gw) {
+ $gw['gateway'] = $current_gw;
+ $changed = true;
+ }
+ }
+ }
+ if ($changed && $current_gw) {
+ write_config(sprintf(gettext('Updating gateway group gateway for %1$s - new gateway is %2$s'), $interfac, $current_gw));
+ }
+}
+
+function lookup_gateway_ip_by_name($name, $disabled = false) {
+
+ $gateways_arr = return_gateways_array($disabled, true);
+ foreach ($gateways_arr as $gname => $gw) {
+ if ($gw['name'] === $name || $gname === $name) {
+ return $gw['gateway'];
+ }
+ }
+
+ return false;
+}
+
+function lookup_gateway_monitor_ip_by_name($name) {
+
+ $gateways_arr = return_gateways_array(false, true);
+ if (!empty($gateways_arr[$name])) {
+ $gateway = $gateways_arr[$name];
+ if (!is_ipaddr($gateway['monitor'])) {
+ return $gateway['gateway'];
+ }
+
+ return $gateway['monitor'];
+ }
+
+ return (false);
+}
+
+function lookup_gateway_interface_by_name($name) {
+
+ $gateways_arr = return_gateways_array(false, true);
+ if (!empty($gateways_arr[$name])) {
+ $interfacegw = $gateways_arr[$name]['friendlyiface'];
+ return ($interfacegw);
+ }
+
+ return (false);
+}
+
+function get_interface_gateway($interface, &$dynamic = false) {
+ global $config, $g;
+
+ if (substr($interface, 0, 4) == '_vip') {
+ $interface = get_configured_carp_interface_list($interface, 'inet', 'iface');
+ }
+
+ $gw = NULL;
+ $gwcfg = $config['interfaces'][$interface];
+ if (!empty($gwcfg['gateway']) && is_array($config['gateways']['gateway_item'])) {
+ foreach ($config['gateways']['gateway_item'] as $gateway) {
+ if (($gateway['name'] == $gwcfg['gateway']) && (is_ipaddrv4($gateway['gateway']))) {
+ $gw = $gateway['gateway'];
+ break;
+ }
+ }
+ }
+
+ // for dynamic interfaces we handle them through the $interface_router file.
+ if (($gw == NULL || !is_ipaddrv4($gw)) && !is_ipaddrv4($gwcfg['ipaddr'])) {
+ $realif = get_real_interface($interface);
+ if (file_exists("{$g['tmp_path']}/{$realif}_router")) {
+ $gw = trim(file_get_contents("{$g['tmp_path']}/{$realif}_router"), " \n");
+ $dynamic = true;
+ }
+ if (file_exists("{$g['tmp_path']}/{$realif}_defaultgw")) {
+ $dynamic = "default";
+ }
+
+ }
+
+ /* return gateway */
+ return ($gw);
+}
+
+function get_interface_gateway_v6($interface, &$dynamic = false) {
+ global $config, $g;
+
+ if (substr($interface, 0, 4) == '_vip') {
+ $interface = get_configured_carp_interface_list($interface, 'inet6', 'iface');
+ }
+
+ $gw = NULL;
+ $gwcfg = $config['interfaces'][$interface];
+ if (!empty($gwcfg['gatewayv6']) && is_array($config['gateways']['gateway_item'])) {
+ foreach ($config['gateways']['gateway_item'] as $gateway) {
+ if (($gateway['name'] == $gwcfg['gatewayv6']) && (is_ipaddrv6($gateway['gateway']))) {
+ $gw = $gateway['gateway'];
+ break;
+ }
+ }
+ }
+
+ // for dynamic interfaces we handle them through the $interface_router file.
+ if (($gw == NULL || !is_ipaddrv6($gw)) && !is_ipaddrv6($gwcfg['ipaddrv6'])) {
+ $realif = get_real_interface($interface);
+ if (file_exists("{$g['tmp_path']}/{$realif}_routerv6")) {
+ $gw = trim(file_get_contents("{$g['tmp_path']}/{$realif}_routerv6"), " \n");
+ $dynamic = true;
+ }
+ if (file_exists("{$g['tmp_path']}/{$realif}_defaultgwv6")) {
+ $dynamic = "default";
+ }
+ }
+ /* return gateway */
+ return ($gw);
+}
+
+/* Check a IP address against a gateway IP or name
+ * to verify it's address family */
+function validate_address_family($ipaddr, $gwname, $disabled = false) {
+ $v4ip = false;
+ $v6ip = false;
+ $v4gw = false;
+ $v6gw = false;
+
+ if (is_ipaddrv4($ipaddr)) {
+ $v4ip = true;
+ }
+ if (is_ipaddrv6($ipaddr)) {
+ $v6ip = true;
+ }
+ if (is_ipaddrv4($gwname)) {
+ $v4gw = true;
+ }
+ if (is_ipaddrv6($gwname)) {
+ $v6gw = true;
+ }
+
+ if ($v4ip && $v4gw) {
+ return true;
+ }
+ if ($v6ip && $v6gw) {
+ return true;
+ }
+
+ /* still no match, carry on, lookup gateways */
+ if (is_ipaddrv4(lookup_gateway_ip_by_name($gwname, $disabled))) {
+ $v4gw = true;
+ }
+ if (is_ipaddrv6(lookup_gateway_ip_by_name($gwname, $disabled))) {
+ $v6gw = true;
+ }
+
+ $gw_array = return_gateways_array();
+ if (is_array($gw_array[$gwname])) {
+ switch ($gw_array[$gwname]['ipprotocol']) {
+ case "inet":
+ $v4gw = true;
+ break;
+ case "inet6":
+ $v6gw = true;
+ break;
+ }
+ }
+
+ if ($v4ip && $v4gw) {
+ return true;
+ }
+ if ($v6ip && $v6gw) {
+ return true;
+ }
+
+ return false;
+}
+
+/* check if a interface is part of a gateway group */
+function interface_gateway_group_member($interface) {
+ global $config;
+
+ if (is_array($config['gateways']['gateway_group'])) {
+ $groups = $config['gateways']['gateway_group'];
+ } else {
+ return false;
+ }
+
+ $gateways_arr = return_gateways_array(false, true);
+ foreach ($groups as $group) {
+ if (is_array($group['item'])) {
+ foreach ($group['item'] as $item) {
+ $elements = explode("|", $item);
+ $gwname = $elements[0];
+ if ($interface == $gateways_arr[$gwname]['interface']) {
+ unset($gateways_arr);
+ return true;
+ }
+ }
+ }
+ }
+ unset($gateways_arr);
+
+ return false;
+}
+
+function gateway_is_gwgroup_member($name) {
+ global $config;
+
+ if (is_array($config['gateways']['gateway_group'])) {
+ $groups = $config['gateways']['gateway_group'];
+ } else {
+ return false;
+ }
+
+ $members = array();
+ foreach ($groups as $group) {
+ if (is_array($group['item'])) {
+ foreach ($group['item'] as $item) {
+ $elements = explode("|", $item);
+ $gwname = $elements[0];
+ if ($name == $elements[0]) {
+ $members[] = $group['name'];
+ }
+ }
+ }
+ }
+
+ return $members;
+}
+?> \ No newline at end of file
diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc
new file mode 100644
index 0000000..4d9389a
--- /dev/null
+++ b/src/etc/inc/interfaces.inc
@@ -0,0 +1,5814 @@
+<?php
+/*
+ interfaces.inc
+ Copyright (C) 2004-2008 Scott Ullrich
+ Copyright (C) 2008-2009 Ermal Luçi
+ All rights reserved.
+
+ function interfaces_wireless_configure is
+ Copyright (C) 2005 Espen Johansen
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notices,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notices, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_BUILDER_BINARIES: /sbin/dhclient /bin/sh /usr/bin/grep /usr/bin/xargs /usr/bin/awk /usr/local/sbin/choparp
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig /sbin/route /usr/sbin/ngctl /usr/sbin/arp /bin/kill /usr/local/sbin/mpd5
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/dhcp6c
+ pfSense_MODULE: interfaces
+
+*/
+
+/* include all configuration functions */
+require_once("globals.inc");
+require_once("util.inc");
+require_once("gwlb.inc");
+
+function interfaces_bring_up($interface) {
+ if (!$interface) {
+ log_error(gettext("interfaces_bring_up() was called but no variable defined."));
+ log_error("Backtrace: " . debug_backtrace());
+ return;
+ }
+ pfSense_interface_flags($interface, IFF_UP);
+}
+
+/*
+ * Return the interface array
+ */
+function get_interface_arr($flush = false) {
+ global $interface_arr_cache;
+
+ /* If the cache doesn't exist, build it */
+ if (!isset($interface_arr_cache) or $flush) {
+ $interface_arr_cache = pfSense_interface_listget();
+ }
+
+ return $interface_arr_cache;
+}
+
+/*
+ * does_interface_exist($interface): return true or false if a interface is
+ * detected.
+ */
+function does_interface_exist($interface, $flush = true) {
+ global $config;
+
+ if (!$interface) {
+ return false;
+ }
+
+ $ints = get_interface_arr($flush);
+ if (in_array($interface, $ints)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/*
+ * does_vip_exist($vip): return true or false if a vip is
+ * configured.
+ */
+function does_vip_exist($vip) {
+ global $config;
+
+ if (!$vip) {
+ return false;
+ }
+
+
+ switch ($vip['mode']) {
+ case "carp":
+ case "ipalias":
+ /* XXX: Make proper checks? */
+ $realif = get_real_interface($vip['interface']);
+ if (!does_interface_exist($realif)) {
+ return false;
+ }
+ break;
+ case "proxyarp":
+ /* XXX: Implement this */
+ default:
+ return false;
+ }
+
+ $ifacedata = pfSense_getall_interface_addresses($realif);
+ foreach ($ifacedata as $vipips) {
+ if ($vipips == "{$vip['subnet']}/{$vip['subnet_bits']}") {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function interface_netgraph_needed($interface = "wan") {
+ global $config;
+
+ $found = false;
+ if (!empty($config['pptpd']) &&
+ $config['pptpd']['mode'] == "server") {
+ $found = true;
+ }
+ if ($found == false && !empty($config['l2tp']) &&
+ $config['l2tp']['mode'] == "server") {
+ $found = true;
+ }
+ if ($found == false && is_array($config['pppoes']['pppoe'])) {
+ foreach ($config['pppoes']['pppoe'] as $pppoe) {
+ if ($pppoe['mode'] != "server") {
+ continue;
+ }
+ if ($pppoe['interface'] == $interface) {
+ $found = true;
+ break;
+ }
+ }
+ }
+ if ($found == false) {
+ $found = interface_isppp_type($interface);
+ }
+
+ if ($found == false) {
+ $realif = get_real_interface($interface);
+ if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
+ $ports = explode(',', $ppp['ports']);
+ foreach ($ports as $pid => $port) {
+ $port = get_real_interface($port);
+ if ($realif == $port) {
+ $found = true;
+ break;
+ }
+ /* Find the parent interfaces of the vlans in the MLPPP configs
+ * there should be only one element in the array here
+ * -- this could be better . . . */
+ $parent_if = get_parent_interface($port);
+ if ($realif == $parent_if[0]) {
+ $found = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if ($found == false) {
+ $realif = get_real_interface($interface);
+ pfSense_ngctl_detach("{$realif}:", $realif);
+ }
+ /* NOTE: We make sure for this on interface_ppps_configure()
+ * no need to do it here again.
+ * else
+ * pfSense_ngctl_attach(".", $realif);
+ */
+}
+
+function interfaces_loopback_configure() {
+ global $g;
+
+ if (platform_booting()) {
+ echo gettext("Configuring loopback interface...");
+ }
+ pfSense_interface_setaddress("lo0", "127.0.0.1");
+ interfaces_bring_up("lo0");
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+ return 0;
+}
+
+function interfaces_vlan_configure($realif = "") {
+ global $config, $g;
+ if (platform_booting()) {
+ echo gettext("Configuring VLAN interfaces...");
+ }
+ if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
+ foreach ($config['vlans']['vlan'] as $vlan) {
+ if (empty($vlan['vlanif'])) {
+ $vlan['vlanif'] = "{$vlan['if']}_vlan{$vlan['tag']}";
+ }
+ if (!empty($realif) && $realif != $vlan['vlanif']) {
+ continue;
+ }
+
+ /* XXX: Maybe we should report any errors?! */
+ interface_vlan_configure($vlan);
+ }
+ }
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+}
+
+function interface_vlan_configure(&$vlan) {
+ global $config, $g;
+
+ if (!is_array($vlan)) {
+ log_error(gettext("VLAN: called with wrong options. Problems with config!"));
+ return;
+ }
+ $if = $vlan['if'];
+ $vlanif = empty($vlan['vlanif']) ? "{$if}_vlan{$vlan['tag']}" : $vlan['vlanif'];
+ $tag = $vlan['tag'];
+
+ if (empty($if)) {
+ log_error(gettext("interface_vlan_configure called with if undefined."));
+ return;
+ }
+
+ /* make sure the parent interface is up */
+ interfaces_bring_up($if);
+ /* Since we are going to add vlan(4) try to enable all that hardware supports. */
+ pfSense_interface_capabilities($if, IFCAP_VLAN_HWTAGGING|IFCAP_VLAN_MTU|IFCAP_VLAN_HWFILTER);
+
+ if (!empty($vlanif) && does_interface_exist($vlanif)) {
+ interface_bring_down($vlanif, true);
+ } else {
+ $tmpvlanif = pfSense_interface_create("vlan");
+ pfSense_interface_rename($tmpvlanif, $vlanif);
+ pfSense_ngctl_name("{$tmpvlanif}:", $vlanif);
+ }
+
+ pfSense_vlan_create($vlanif, $if, $tag);
+
+ interfaces_bring_up($vlanif);
+
+ /* invalidate interface cache */
+ get_interface_arr(true);
+
+ /* XXX: ermal -- for now leave it here at the moment it does not hurt. */
+ interfaces_bring_up($if);
+
+ return $vlanif;
+}
+
+function interface_qinq_configure(&$vlan, $fd = NULL) {
+ global $config, $g;
+
+ if (!is_array($vlan)) {
+ log_error(sprintf(gettext("QinQ compat VLAN: called with wrong options. Problems with config!%s"), "\n"));
+ return;
+ }
+
+ $qinqif = $vlan['if'];
+ $tag = $vlan['tag'];
+ if (empty($qinqif)) {
+ log_error(sprintf(gettext("interface_qinq_configure called with if undefined.%s"), "\n"));
+ return;
+ }
+
+ if (!does_interface_exist($qinqif)) {
+ log_error(sprintf(gettext("interface_qinq_configure called with invalid if.%s"), "\n"));
+ return;
+ }
+
+ $vlanif = interface_vlan_configure($vlan);
+
+ if ($fd == NULL) {
+ $exec = true;
+ $fd = fopen("{$g['tmp_path']}/netgraphcmd", "w");
+ } else {
+ $exec = false;
+ }
+ /* make sure the parent is converted to ng_vlan(4) and is up */
+ interfaces_bring_up($qinqif);
+
+ pfSense_ngctl_attach(".", $qinqif);
+ if (!empty($vlanif) && does_interface_exist($vlanif)) {
+ fwrite($fd, "shutdown {$qinqif}qinq:\n");
+ exec("/usr/sbin/ngctl msg {$qinqif}qinq: gettable", $result);
+ if (empty($result)) {
+ fwrite($fd, "mkpeer {$qinqif}: vlan lower downstream\n");
+ fwrite($fd, "name {$qinqif}:lower {$vlanif}qinq\n");
+ fwrite($fd, "connect {$qinqif}: {$vlanif}qinq: upper nomatch\n");
+ }
+ } else {
+ fwrite($fd, "mkpeer {$qinqif}: vlan lower downstream\n");
+ fwrite($fd, "name {$qinqif}:lower {$vlanif}qinq\n");
+ fwrite($fd, "connect {$qinqif}: {$vlanif}qinq: upper nomatch\n");
+ }
+
+ /* invalidate interface cache */
+ get_interface_arr(true);
+
+ if (!stristr($qinqif, "_vlan")) {
+ mwexec("/sbin/ifconfig {$qinqif} promisc\n");
+ }
+
+ $macaddr = get_interface_mac($qinqif);
+ if (!empty($vlan['members'])) {
+ $members = explode(" ", $vlan['members']);
+ foreach ($members as $qtag) {
+ $qinq = array();
+ $qinq['tag'] = $qtag;
+ $qinq['if'] = $vlanif;
+ interface_qinq2_configure($qinq, $fd, $macaddr);
+ }
+ }
+ if ($exec == true) {
+ fclose($fd);
+ mwexec("/usr/sbin/ngctl -f {$g['tmp_path']}/netgraphcmd");
+ }
+
+ interfaces_bring_up($qinqif);
+ if (!empty($vlan['members'])) {
+ $members = explode(" ", $vlan['members']);
+ foreach ($members as $qif) {
+ interfaces_bring_up("{$vlanif}_{$qif}");
+ }
+ }
+
+ return $vlanif;
+}
+
+function interfaces_qinq_configure() {
+ global $config, $g;
+ if (platform_booting()) {
+ echo gettext("Configuring QinQ interfaces...");
+ }
+ if (is_array($config['qinqs']['qinqentry']) && count($config['qinqs']['qinqentry'])) {
+ foreach ($config['qinqs']['qinqentry'] as $qinq) {
+ /* XXX: Maybe we should report any errors?! */
+ interface_qinq_configure($qinq);
+ }
+ }
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+}
+
+function interface_qinq2_configure(&$qinq, $fd, $macaddr) {
+ global $config, $g;
+
+ if (!is_array($qinq)) {
+ log_error(sprintf(gettext("QinQ compat VLAN: called with wrong options. Problems with config!%s"), "\n"));
+ return;
+ }
+
+ $if = $qinq['if'];
+ $tag = $qinq['tag'];
+ $vlanif = "{$if}_{$tag}";
+ if (empty($if)) {
+ log_error(sprintf(gettext("interface_qinq2_configure called with if undefined.%s"), "\n"));
+ return;
+ }
+
+ fwrite($fd, "shutdown {$if}h{$tag}:\n");
+ fwrite($fd, "mkpeer {$if}qinq: eiface {$if}{$tag} ether\n");
+ fwrite($fd, "name {$if}qinq:{$if}{$tag} {$if}h{$tag}\n");
+ fwrite($fd, "msg {$if}qinq: addfilter { vlan={$tag} hook=\"{$if}{$tag}\" }\n");
+ fwrite($fd, "msg {$if}h{$tag}: setifname \"{$vlanif}\"\n");
+ fwrite($fd, "msg {$if}h{$tag}: set {$macaddr}\n");
+
+ /* invalidate interface cache */
+ get_interface_arr(true);
+
+ return $vlanif;
+}
+
+function interfaces_create_wireless_clones() {
+ global $config, $g;
+
+ if (platform_booting()) {
+ echo gettext("Creating wireless clone interfaces...");
+ }
+
+ $iflist = get_configured_interface_list();
+
+ foreach ($iflist as $if) {
+ $realif = $config['interfaces'][$if]['if'];
+ if (is_interface_wireless($realif)) {
+ interface_wireless_clone(interface_get_wireless_clone($realif), $config['interfaces'][$if]);
+ }
+ }
+
+ if (isset($config['wireless']['clone']) && is_array($config['wireless']['clone']) && count($config['wireless']['clone'])) {
+ foreach ($config['wireless']['clone'] as $clone) {
+ if (empty($clone['cloneif'])) {
+ continue;
+ }
+ if (does_interface_exist($clone['cloneif'])) {
+ continue;
+ }
+ /* XXX: Maybe we should report any errors?! */
+ interface_wireless_clone($clone['cloneif'], $clone);
+ }
+ }
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+
+}
+
+function interfaces_bridge_configure($checkmember = 0, $realif = "") {
+ global $config;
+
+ $i = 0;
+ if (is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
+ foreach ($config['bridges']['bridged'] as $bridge) {
+ if (empty($bridge['bridgeif'])) {
+ $bridge['bridgeif'] = "bridge{$i}";
+ }
+ if (!empty($realif) && $realif != $bridge['bridgeif']) {
+ continue;
+ }
+
+ if ($checkmember == 1) {
+ /* XXX: It should not be possible no? */
+ if (strstr($bridge['if'], '_vip')) {
+ continue;
+ }
+ $members = explode(',', $bridge['members']);
+ foreach ($members as $member) {
+ if (!empty($config['interfaces'][$bridge['if']]) && $config['interfaces'][$bridge['if']]['ipaddrv6'] == "track6") {
+ continue 2;
+ }
+ }
+ }
+ else if ($checkmember == 2) {
+ $members = explode(',', $bridge['members']);
+ foreach ($members as $member) {
+ if (empty($config['interfaces'][$bridge['if']]) || $config['interfaces'][$bridge['if']]['ipaddrv6'] != "track6") {
+ continue 2;
+ }
+ }
+ }
+ /* XXX: Maybe we should report any errors?! */
+ interface_bridge_configure($bridge, $checkmember);
+ $i++;
+ }
+ }
+}
+
+function interface_bridge_configure(&$bridge, $checkmember = 0) {
+ global $config, $g;
+
+ if (!is_array($bridge)) {
+ return;
+ }
+
+ if (empty($bridge['members'])) {
+ log_error(sprintf(gettext("No members found on %s"), $bridge['bridgeif']));
+ return;
+ }
+
+ $members = explode(',', $bridge['members']);
+ if (!count($members)) {
+ return;
+ }
+
+ /* Calculate smaller mtu and enforce it */
+ $smallermtu = 0;
+ $commonrx = true;
+ $commontx = true;
+ $foundgif = false;
+ foreach ($members as $member) {
+ $realif = get_real_interface($member);
+ $mtu = get_interface_mtu($realif);
+ if (substr($realif, 0, 3) == "gif") {
+ $foundgif = true;
+ if ($checkmember == 1) {
+ return;
+ }
+ if ($mtu <= 1500) {
+ continue;
+ }
+ }
+ if ($smallermtu == 0 && !empty($mtu)) {
+ $smallermtu = $mtu;
+ } else if (!empty($mtu) && $mtu < $smallermtu) {
+ $smallermtu = $mtu;
+ }
+ }
+ if ($foundgif == false && $checkmember == 2) {
+ return;
+ }
+
+ /* Just in case anything is not working well */
+ if ($smallermtu == 0) {
+ $smallermtu = 1500;
+ }
+
+ if (platform_booting() || !empty($bridge['bridgeif'])) {
+ pfSense_interface_destroy($bridge['bridgeif']);
+ pfSense_interface_create($bridge['bridgeif']);
+ $bridgeif = escapeshellarg($bridge['bridgeif']);
+ } else {
+ $bridgeif = pfSense_interface_create("bridge");
+ $bridge['bridgeif'] = $bridgeif;
+ }
+
+ $bridgemtu = interface_find_child_cfgmtu($bridge['bridgeif']);
+ if ($bridgemtu > $smallermtu) {
+ $smallermtu = $bridgemtu;
+ }
+
+ $checklist = get_configured_interface_list();
+
+ /* Add interfaces to bridge */
+ foreach ($members as $member) {
+ if (empty($checklist[$member])) {
+ continue;
+ }
+ $realif = get_real_interface($member);
+ if (!$realif) {
+ log_error(gettext("realif not defined in interfaces bridge - up"));
+ continue;
+ }
+ /* make sure the parent interface is up */
+ pfSense_interface_mtu($realif, $smallermtu);
+ interfaces_bring_up($realif);
+ enable_hardware_offloading($member);
+ pfSense_bridge_add_member($bridge['bridgeif'], $realif);
+ }
+
+ if (isset($bridge['enablestp'])) {
+ /* Choose spanning tree proto */
+ mwexec("/sbin/ifconfig {$bridgeif} proto " . escapeshellarg($bridge['proto']));
+
+ if (!empty($bridge['stp'])) {
+ $stpifs = explode(',', $bridge['stp']);
+ foreach ($stpifs as $stpif) {
+ $realif = get_real_interface($stpif);
+ mwexec("/sbin/ifconfig {$bridgeif} stp {$realif}");
+ }
+ }
+ if (!empty($bridge['maxage'])) {
+ mwexec("/sbin/ifconfig {$bridgeif} maxage " . escapeshellarg($bridge['maxage']));
+ }
+ if (!empty($bridge['fwdelay'])) {
+ mwexec("/sbin/ifconfig {$bridgeif} fwddelay " . escapeshellarg($bridge['fwdelay']));
+ }
+ if (!empty($bridge['hellotime'])) {
+ mwexec("/sbin/ifconfig {$bridgeif} hellotime " . escapeshellarg($bridge['hellotime']));
+ }
+ if (!empty($bridge['priority'])) {
+ mwexec("/sbin/ifconfig {$bridgeif} priority " . escapeshellarg($bridge['priority']));
+ }
+ if (!empty($bridge['holdcnt'])) {
+ mwexec("/sbin/ifconfig {$bridgeif} holdcnt " . escapeshellarg($bridge['holdcnt']));
+ }
+ if (!empty($bridge['ifpriority'])) {
+ $pconfig = explode(",", $bridge['ifpriority']);
+ $ifpriority = array();
+ foreach ($pconfig as $cfg) {
+ $embcfg = explode_assoc(":", $cfg);
+ foreach ($embcfg as $key => $value) {
+ $ifpriority[$key] = $value;
+ }
+ }
+ foreach ($ifpriority as $key => $value) {
+ $realif = get_real_interface($key);
+ mwexec("/sbin/ifconfig ${bridgeif} ifpriority {$realif} " . escapeshellarg($value));
+ }
+ }
+ if (!empty($bridge['ifpathcost'])) {
+ $pconfig = explode(",", $bridge['ifpathcost']);
+ $ifpathcost = array();
+ foreach ($pconfig as $cfg) {
+ $embcfg = explode_assoc(":", $cfg);
+ foreach ($embcfg as $key => $value) {
+ $ifpathcost[$key] = $value;
+ }
+ }
+ foreach ($ifpathcost as $key => $value) {
+ $realif = get_real_interface($key);
+ mwexec("/sbin/ifconfig ${bridgeif} ifpathcost {$realif} " . escapeshellarg($value));
+ }
+ }
+ }
+
+ if ($bridge['maxaddr'] <> "") {
+ mwexec("/sbin/ifconfig {$bridgeif} maxaddr " . escapeshellarg($bridge['maxaddr']));
+ }
+ if ($bridge['timeout'] <> "") {
+ mwexec("/sbin/ifconfig {$bridgeif} timeout " . escapeshellarg($bridge['timeout']));
+ }
+ if ($bridge['span'] <> "") {
+ $realif = get_real_interface($bridge['span']);
+ mwexec("/sbin/ifconfig {$bridgeif} span {$realif}");
+ }
+ if (!empty($bridge['edge'])) {
+ $edgeifs = explode(',', $bridge['edge']);
+ foreach ($edgeifs as $edgeif) {
+ $realif = get_real_interface($edgeif);
+ mwexec("/sbin/ifconfig {$bridgeif} edge {$realif}");
+ }
+ }
+ if (!empty($bridge['autoedge'])) {
+ $edgeifs = explode(',', $bridge['autoedge']);
+ foreach ($edgeifs as $edgeif) {
+ $realif = get_real_interface($edgeif);
+ mwexec("/sbin/ifconfig {$bridgeif} -autoedge {$realif}");
+ }
+ }
+ if (!empty($bridge['ptp'])) {
+ $ptpifs = explode(',', $bridge['ptp']);
+ foreach ($ptpifs as $ptpif) {
+ $realif = get_real_interface($ptpif);
+ mwexec("/sbin/ifconfig {$bridgeif} ptp {$realif}");
+ }
+ }
+ if (!empty($bridge['autoptp'])) {
+ $ptpifs = explode(',', $bridge['autoptp']);
+ foreach ($ptpifs as $ptpif) {
+ $realif = get_real_interface($ptpif);
+ mwexec("/sbin/ifconfig {$bridgeif} -autoptp {$realif}");
+ }
+ }
+ if (!empty($bridge['static'])) {
+ $stickyifs = explode(',', $bridge['static']);
+ foreach ($stickyifs as $stickyif) {
+ $realif = get_real_interface($stickyif);
+ mwexec("/sbin/ifconfig {$bridgeif} sticky {$realif}");
+ }
+ }
+ if (!empty($bridge['private'])) {
+ $privateifs = explode(',', $bridge['private']);
+ foreach ($privateifs as $privateif) {
+ $realif = get_real_interface($privateif);
+ mwexec("/sbin/ifconfig {$bridgeif} private {$realif}");
+ }
+ }
+
+ if ($bridge['bridgeif']) {
+ interfaces_bring_up($bridge['bridgeif']);
+ } else {
+ log_error(gettext("bridgeif not defined -- could not bring interface up"));
+ }
+}
+
+function interface_bridge_add_member($bridgeif, $interface, $flagsapplied = false) {
+
+ if (!does_interface_exist($bridgeif) || !does_interface_exist($interface)) {
+ return;
+ }
+
+ if ($flagsapplied == false) {
+ $mtu = get_interface_mtu($bridgeif);
+ $mtum = get_interface_mtu($interface);
+ if ($mtu != $mtum && !(substr($interface, 0, 3) == "gif" && $mtu <= 1500)) {
+ pfSense_interface_mtu($interface, $mtu);
+ }
+
+ hardware_offloading_applyflags($interface);
+ interfaces_bring_up($interface);
+ }
+
+ pfSense_bridge_add_member($bridgeif, $interface);
+}
+
+function interfaces_lagg_configure($realif = "") {
+ global $config, $g;
+ if (platform_booting()) {
+ echo gettext("Configuring LAGG interfaces...");
+ }
+ $i = 0;
+ if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
+ foreach ($config['laggs']['lagg'] as $lagg) {
+ if (empty($lagg['laggif'])) {
+ $lagg['laggif'] = "lagg{$i}";
+ }
+ if (!empty($realif) && $realif != $lagg['laggif']) {
+ continue;
+ }
+ /* XXX: Maybe we should report any errors?! */
+ interface_lagg_configure($lagg);
+ $i++;
+ }
+ }
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+}
+
+function interface_lagg_configure($lagg) {
+ global $config, $g;
+
+ if (!is_array($lagg)) {
+ return -1;
+ }
+
+ $members = explode(',', $lagg['members']);
+ if (!count($members)) {
+ return -1;
+ }
+
+ if (platform_booting() || !(empty($lagg['laggif']))) {
+ pfSense_interface_destroy($lagg['laggif']);
+ pfSense_interface_create($lagg['laggif']);
+ $laggif = $lagg['laggif'];
+ } else {
+ $laggif = pfSense_interface_create("lagg");
+ }
+
+ /* Check if MTU was defined for this lagg interface */
+ $lagg_mtu = interface_find_child_cfgmtu($laggif);
+ if ($lagg_mtu == 0) {
+ /* Calculate smaller mtu and enforce it */
+ $smallermtu = 0;
+ foreach ($members as $member) {
+ $mtu = get_interface_mtu($member);
+ if ($smallermtu == 0 && !empty($mtu)) {
+ $smallermtu = $mtu;
+ } else if (!empty($mtu) && $mtu < $smallermtu) {
+ $smallermtu = $mtu;
+ }
+ }
+ $lagg_mtu = $smallermtu;
+ }
+
+ /* Just in case anything is not working well */
+ if ($lagg_mtu == 0) {
+ $lagg_mtu = 1500;
+ }
+
+ foreach ($members as $member) {
+ if (!does_interface_exist($member)) {
+ continue;
+ }
+ /* make sure the parent interface is up */
+ pfSense_interface_mtu($member, $lagg_mtu);
+ interfaces_bring_up($member);
+ hardware_offloading_applyflags($member);
+ mwexec("/sbin/ifconfig " . escapeshellarg($laggif) . " laggport " . escapeshellarg($member));
+ }
+ pfSense_interface_capabilities($laggif, -$flags_off);
+ pfSense_interface_capabilities($laggif, $flags_on);
+
+ mwexec("/sbin/ifconfig {$laggif} laggproto " . escapeshellarg($lagg['proto']));
+
+ interfaces_bring_up($laggif);
+
+ return $laggif;
+}
+
+function interfaces_gre_configure($checkparent = 0, $realif = "") {
+ global $config;
+
+ if (is_array($config['gres']['gre']) && count($config['gres']['gre'])) {
+ foreach ($config['gres']['gre'] as $i => $gre) {
+ if (empty($gre['greif'])) {
+ $gre['greif'] = "gre{$i}";
+ }
+ if (!empty($realif) && $realif != $gre['greif']) {
+ continue;
+ }
+
+ if ($checkparent == 1) {
+ if (substr($gre['if'], 0, 4) == '_vip') {
+ continue;
+ }
+ if (substr($gre['if'], 0, 5) == '_lloc') {
+ continue;
+ }
+ if (!empty($config['interfaces'][$gre['if']]) && $config['interfaces'][$gre['if']]['ipaddrv6'] == "track6") {
+ continue;
+ }
+ } else if ($checkparent == 2) {
+ if ((substr($gre['if'], 0, 4) != '_vip' && substr($gre['if'], 0, 5) != '_lloc') &&
+ (empty($config['interfaces'][$gre['if']]) || $config['interfaces'][$gre['if']]['ipaddrv6'] != "track6")) {
+ continue;
+ }
+ }
+ /* XXX: Maybe we should report any errors?! */
+ interface_gre_configure($gre);
+ }
+ }
+}
+
+/* NOTE: $grekey is not used but useful for passing this function to array_walk. */
+function interface_gre_configure(&$gre, $grekey = "") {
+ global $config, $g;
+
+ if (!is_array($gre)) {
+ return -1;
+ }
+
+ $realif = get_real_interface($gre['if']);
+ $realifip = get_interface_ip($gre['if']);
+
+ /* make sure the parent interface is up */
+ interfaces_bring_up($realif);
+
+ if (platform_booting() || !(empty($gre['greif']))) {
+ pfSense_interface_destroy($gre['greif']);
+ pfSense_interface_create($gre['greif']);
+ $greif = $gre['greif'];
+ } else {
+ $greif = pfSense_interface_create("gre");
+ }
+
+ /* Do not change the order here for more see gre(4) NOTES section. */
+ mwexec("/sbin/ifconfig {$greif} tunnel {$realifip} " . escapeshellarg($gre['remote-addr']));
+ if ((is_ipaddrv6($gre['tunnel-local-addr'])) || (is_ipaddrv6($gre['tunnel-remote-addr']))) {
+ /* XXX: The prefixlen argument for tunnels of ipv6 is useless since it needs to be 128 as enforced by kernel */
+ //mwexec("/sbin/ifconfig {$greif} inet6 " . escapeshellarg($gre['tunnel-local-addr']) . " " . escapeshellarg($gre['tunnel-remote-addr']) . " prefixlen /" . escapeshellarg($gre['tunnel-remote-net']));
+ mwexec("/sbin/ifconfig {$greif} inet6 " . escapeshellarg($gre['tunnel-local-addr']) . " " . escapeshellarg($gre['tunnel-remote-addr']) . " prefixlen 128");
+ } else {
+ mwexec("/sbin/ifconfig {$greif} " . escapeshellarg($gre['tunnel-local-addr']) . " " . escapeshellarg($gre['tunnel-remote-addr']) . " netmask " . gen_subnet_mask($gre['tunnel-remote-net']));
+ }
+ if (isset($gre['link0'])) {
+ pfSense_interface_flags($greif, IFF_LINK0);
+ }
+ if (isset($gre['link1'])) {
+ pfSense_interface_flags($greif, IFF_LINK1);
+ }
+ if (isset($gre['link2'])) {
+ pfSense_interface_flags($greif, IFF_LINK2);
+ }
+
+ if ($greif) {
+ interfaces_bring_up($greif);
+ } else {
+ log_error(gettext("Could not bring greif up -- variable not defined."));
+ }
+
+ if (isset($gre['link1']) && $gre['link1']) {
+ mwexec("/sbin/route add " . escapeshellarg($gre['tunnel-remote-addr']) . "/" . escapeshellarg($gre['tunnel-remote-net']) . " " . escapeshellarg($gre['tunnel-local-addr']));
+ }
+ if (is_ipaddrv4($gre['tunnel-remote-addr'])) {
+ file_put_contents("{$g['tmp_path']}/{$greif}_router", $gre['tunnel-remote-addr']);
+ }
+ if (is_ipaddrv6($gre['tunnel-remote-addr'])) {
+ file_put_contents("{$g['tmp_path']}/{$greif}_routerv6", $gre['tunnel-remote-addr']);
+ }
+
+ interfaces_bring_up($greif);
+
+ return $greif;
+}
+
+function interfaces_gif_configure($checkparent = 0, $realif = "") {
+ global $config;
+
+ if (is_array($config['gifs']['gif']) && count($config['gifs']['gif'])) {
+ foreach ($config['gifs']['gif'] as $i => $gif) {
+ if (empty($gif['gifif'])) {
+ $gre['gifif'] = "gif{$i}";
+ }
+ if (!empty($realif) && $realif != $gif['gifif']) {
+ continue;
+ }
+
+ if ($checkparent == 1) {
+ if (substr($gif['if'], 0, 4) == '_vip') {
+ continue;
+ }
+ if (substr($gif['if'], 0, 5) == '_lloc') {
+ continue;
+ }
+ if (!empty($config['interfaces'][$gif['if']]) && $config['interfaces'][$gif['if']]['ipaddrv6'] == "track6") {
+ continue;
+ }
+ }
+ else if ($checkparent == 2) {
+ if ((substr($gif['if'], 0, 4) != '_vip' && substr($gif['if'], 0, 5) != '_lloc') &&
+ (empty($config['interfaces'][$gif['if']]) || $config['interfaces'][$gif['if']]['ipaddrv6'] != "track6")) {
+ continue;
+ }
+ }
+ /* XXX: Maybe we should report any errors?! */
+ interface_gif_configure($gif);
+ }
+ }
+}
+
+/* NOTE: $gifkey is not used but useful for passing this function to array_walk. */
+function interface_gif_configure(&$gif, $gifkey = "") {
+ global $config, $g;
+
+ if (!is_array($gif)) {
+ return -1;
+ }
+
+ $realif = get_real_interface($gif['if']);
+ $ipaddr = get_interface_ip($gif['if']);
+
+ if (is_ipaddrv4($gif['remote-addr'])) {
+ if (is_ipaddrv4($ipaddr)) {
+ $realifip = $ipaddr;
+ } else {
+ $realifip = get_interface_ip($gif['if']);
+ }
+ $realifgw = get_interface_gateway($gif['if']);
+ } else if (is_ipaddrv6($gif['remote-addr'])) {
+ if (is_ipaddrv6($ipaddr)) {
+ $realifip = $ipaddr;
+ } else {
+ $realifip = get_interface_ipv6($gif['if']);
+ }
+ $realifgw = get_interface_gateway_v6($gif['if']);
+ }
+ /* make sure the parent interface is up */
+ if ($realif) {
+ interfaces_bring_up($realif);
+ } else {
+ log_error(gettext("could not bring realif up -- variable not defined -- interface_gif_configure()"));
+ }
+
+ if (platform_booting() || !(empty($gif['gifif']))) {
+ pfSense_interface_destroy($gif['gifif']);
+ pfSense_interface_create($gif['gifif']);
+ $gifif = $gif['gifif'];
+ } else {
+ $gifif = pfSense_interface_create("gif");
+ }
+
+ /* Do not change the order here for more see gif(4) NOTES section. */
+ mwexec("/sbin/ifconfig {$gifif} tunnel {$realifip} " . escapeshellarg($gif['remote-addr']));
+ if ((is_ipaddrv6($gif['tunnel-local-addr'])) || (is_ipaddrv6($gif['tunnel-remote-addr']))) {
+ /* XXX: The prefixlen argument for tunnels of ipv6 is useless since it needs to be 128 as enforced by kernel */
+ //mwexec("/sbin/ifconfig {$gifif} inet6 " . escapeshellarg($gif['tunnel-local-addr']) . " " . escapeshellarg($gif['tunnel-remote-addr']) . " prefixlen /" . escapeshellarg($gif['tunnel-remote-net']));
+ mwexec("/sbin/ifconfig {$gifif} inet6 " . escapeshellarg($gif['tunnel-local-addr']) . " " . escapeshellarg($gif['tunnel-remote-addr']) . " prefixlen 128");
+ } else {
+ mwexec("/sbin/ifconfig {$gifif} " . escapeshellarg($gif['tunnel-local-addr']) . " " . escapeshellarg($gif['tunnel-remote-addr']) . " netmask " . gen_subnet_mask($gif['tunnel-remote-net']));
+ }
+ if (isset($gif['link0'])) {
+ pfSense_interface_flags($gifif, IFF_LINK0);
+ }
+ if (isset($gif['link1'])) {
+ pfSense_interface_flags($gifif, IFF_LINK1);
+ }
+ if ($gifif) {
+ interfaces_bring_up($gifif);
+ } else {
+ log_error(gettext("could not bring gifif up -- variable not defined"));
+ }
+
+ if (!platform_booting()) {
+ $iflist = get_configured_interface_list();
+ foreach ($iflist as $ifname) {
+ if ($config['interfaces'][$ifname]['if'] == $gifif) {
+ if (get_interface_gateway($ifname)) {
+ system_routing_configure($ifname);
+ break;
+ }
+ if (get_interface_gateway_v6($ifname)) {
+ system_routing_configure($ifname);
+ break;
+ }
+ }
+ }
+ }
+
+
+ if (is_ipaddrv4($gif['tunnel-remote-addr'])) {
+ file_put_contents("{$g['tmp_path']}/{$gifif}_router", $gif['tunnel-remote-addr']);
+ }
+ if (is_ipaddrv6($gif['tunnel-remote-addr'])) {
+ file_put_contents("{$g['tmp_path']}/{$gifif}_routerv6", $gif['tunnel-remote-addr']);
+ }
+
+ if (is_ipaddrv4($realifgw)) {
+ mwexec("/sbin/route change -host " . escapeshellarg($gif['remote-addr']) . " {$realifgw}");
+ }
+ if (is_ipaddrv6($realifgw)) {
+ mwexec("/sbin/route change -host -inet6 " . escapeshellarg($gif['remote-addr']) . " {$realifgw}");
+ }
+
+ interfaces_bring_up($gifif);
+
+ return $gifif;
+}
+
+function interfaces_configure() {
+ global $config, $g;
+
+ /* Set up our loopback interface */
+ interfaces_loopback_configure();
+
+ /* create the unconfigured wireless clones */
+ interfaces_create_wireless_clones();
+
+ /* set up LAGG virtual interfaces */
+ interfaces_lagg_configure();
+
+ /* set up VLAN virtual interfaces */
+ interfaces_vlan_configure();
+
+ interfaces_qinq_configure();
+
+ $iflist = get_configured_interface_with_descr();
+ $delayed_list = array();
+ $bridge_list = array();
+ $track6_list = array();
+
+ /* This is needed to speedup interfaces on bootup. */
+ $reload = false;
+ if (!platform_booting()) {
+ $reload = true;
+ }
+
+ foreach ($iflist as $if => $ifname) {
+ $realif = $config['interfaces'][$if]['if'];
+ if (strstr($realif, "bridge")) {
+ $bridge_list[$if] = $ifname;
+ } else if (strstr($realif, "gre")) {
+ $delayed_list[$if] = $ifname;
+ } else if (strstr($realif, "gif")) {
+ $delayed_list[$if] = $ifname;
+ } else if (strstr($realif, "ovpn")) {
+ //echo "Delaying OpenVPN interface configuration...done.\n";
+ continue;
+ } else if (!empty($config['interfaces'][$if]['ipaddrv6']) && $config['interfaces'][$if]['ipaddrv6'] == "track6") {
+ $track6_list[$if] = $ifname;
+ } else {
+ if (platform_booting()) {
+ printf(gettext("Configuring %s interface..."), $ifname);
+ }
+
+ if ($g['debug']) {
+ log_error(sprintf(gettext("Configuring %s"), $ifname));
+ }
+ interface_configure($if, $reload);
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+ }
+ }
+
+ /*
+ * NOTE: The following function parameter consists of
+ * 1 - Do not load gre/gif/bridge with parent/member as vip
+ * 2 - Do load gre/gif/bridge with parent/member as vip
+ */
+
+ /* set up GRE virtual interfaces */
+ interfaces_gre_configure(1);
+
+ /* set up GIF virtual interfaces */
+ interfaces_gif_configure(1);
+
+ /* set up BRIDGe virtual interfaces */
+ interfaces_bridge_configure(1);
+
+ foreach ($track6_list as $if => $ifname) {
+ if (platform_booting()) {
+ printf(gettext("Configuring %s interface..."), $ifname);
+ }
+ if ($g['debug']) {
+ log_error(sprintf(gettext("Configuring %s"), $ifname));
+ }
+
+ interface_configure($if, $reload);
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+ }
+
+ /* bring up vip interfaces */
+ interfaces_vips_configure();
+
+ /* set up GRE virtual interfaces */
+ interfaces_gre_configure(2);
+
+ /* set up GIF virtual interfaces */
+ interfaces_gif_configure(2);
+
+ foreach ($delayed_list as $if => $ifname) {
+ if (platform_booting()) {
+ printf(gettext("Configuring %s interface..."), $ifname);
+ }
+ if ($g['debug']) {
+ log_error(sprintf(gettext("Configuring %s"), $ifname));
+ }
+
+ interface_configure($if, $reload);
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+ }
+
+ /* set up BRIDGe virtual interfaces */
+ interfaces_bridge_configure(2);
+
+ foreach ($bridge_list as $if => $ifname) {
+ if (platform_booting()) {
+ printf(gettext("Configuring %s interface..."), $ifname);
+ }
+ if ($g['debug']) {
+ log_error(sprintf(gettext("Configuring %s"), $ifname));
+ }
+
+ interface_configure($if, $reload);
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+ }
+
+ /* configure interface groups */
+ interfaces_group_setup();
+
+ if (!platform_booting()) {
+ /* reconfigure static routes (kernel may have deleted them) */
+ system_routing_configure();
+
+ /* reload IPsec tunnels */
+ vpn_ipsec_configure();
+
+ /* reload dhcpd (interface enabled/disabled status may have changed) */
+ services_dhcpd_configure();
+
+ /* restart dnsmasq or unbound */
+ if (isset($config['dnsmasq']['enable'])) {
+ services_dnsmasq_configure();
+ } elseif (isset($config['unbound']['enable'])) {
+ services_unbound_configure();
+ }
+ }
+
+ return 0;
+}
+
+function interface_reconfigure($interface = "wan", $reloadall = false) {
+ interface_bring_down($interface);
+ interface_configure($interface, $reloadall);
+}
+
+function interface_vip_bring_down($vip) {
+ global $g;
+
+ if (strpos($vip['interface'], '_vip')) {
+ if (is_ipaddrv6($vip['subnet'])) {
+ $family = 'inet6';
+ } else {
+ $family = 'inet';
+ }
+
+ $carpvip = get_configured_carp_interface_list($vip['interface'], $family, 'vip');
+ $iface = $carpvip['interface'];
+ } else {
+ $iface = $vip['interface'];
+ }
+
+ $vipif = get_real_interface($iface);
+ switch ($vip['mode']) {
+ case "proxyarp":
+ if (file_exists("{$g['varrun_path']}/choparp_{$vipif}.pid")) {
+ killbypid("{$g['varrun_path']}/choparp_{$vipif}.pid");
+ }
+ break;
+ case "ipalias":
+ if (does_interface_exist($vipif)) {
+ if (is_ipaddrv6($vip['subnet'])) {
+ mwexec("/sbin/ifconfig {$vipif} inet6 " . escapeshellarg($vip['subnet']) . " -alias");
+ } else {
+ pfSense_interface_deladdress($vipif, $vip['subnet']);
+ }
+ }
+ break;
+ case "carp":
+ /* XXX: Is enough to delete ip address? */
+ if (does_interface_exist($vipif)) {
+ if (is_ipaddrv6($vip['subnet'])) {
+ mwexec("/sbin/ifconfig {$vipif} inet6 " . escapeshellarg($vip['subnet']) . " delete");
+ } else {
+ pfSense_interface_deladdress($vipif, $vip['subnet']);
+ }
+ }
+ break;
+ }
+}
+
+function interface_bring_down($interface = "wan", $destroy = false, $ifacecfg = false) {
+ global $config, $g;
+
+ if (!isset($config['interfaces'][$interface])) {
+ return;
+ }
+
+ if ($g['debug']) {
+ log_error("Calling interface down for interface {$interface}, destroy is " . (($destroy) ? 'true' : 'false'));
+ }
+
+ /*
+ * NOTE: The $realifv6 is needed when WANv4 is type PPP and v6 is DHCP and the option v6 from v4 is used.
+ * In this case the real $realif of v4 is different from that of v6 for operation.
+ * Keep this in mind while doing changes here!
+ */
+ if ($ifacecfg === false) {
+ $ifcfg = $config['interfaces'][$interface];
+ $ppps = $config['ppps']['ppp'];
+ $realif = get_real_interface($interface);
+ $realifv6 = get_real_interface($interface, "inet6", true);
+ } elseif (!is_array($ifacecfg)) {
+ log_error(gettext("Wrong parameters used during interface_bring_down"));
+ $ifcfg = $config['interfaces'][$interface];
+ $ppps = $config['ppps']['ppp'];
+ $realif = get_real_interface($interface);
+ $realifv6 = get_real_interface($interface, "inet6", true);
+ } else {
+ $ifcfg = $ifacecfg['ifcfg'];
+ $ppps = $ifacecfg['ppps'];
+ if (isset($ifacecfg['ifcfg']['realif'])) {
+ $realif = $ifacecfg['ifcfg']['realif'];
+ /* XXX: Any better way? */
+ $realifv6 = $realif;
+ } else {
+ $realif = get_real_interface($interface);
+ $realifv6 = get_real_interface($interface, "inet6", true);
+ }
+ }
+
+ switch ($ifcfg['ipaddr']) {
+ case "ppp":
+ case "pppoe":
+ case "pptp":
+ case "l2tp":
+ if (is_array($ppps) && count($ppps)) {
+ foreach ($ppps as $pppid => $ppp) {
+ if ($realif == $ppp['if']) {
+ if (isset($ppp['ondemand']) && !$destroy) {
+ send_event("interface reconfigure {$interface}");
+ break;
+ }
+ if (file_exists("{$g['varrun_path']}/{$ppp['type']}_{$interface}.pid")) {
+ killbypid("{$g['varrun_path']}/{$ppp['type']}_{$interface}.pid");
+ sleep(2);
+ }
+ unlink_if_exists("{$g['varetc_path']}/mpd_{$interface}.conf");
+ break;
+ }
+ }
+ }
+ break;
+ case "dhcp":
+ kill_dhclient_process($realif);
+ unlink_if_exists("{$g['varetc_path']}/dhclient_{$interface}.conf");
+ if (does_interface_exist("$realif")) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " delete", true);
+ interface_ipalias_cleanup($interface);
+ if ($destroy == true) {
+ pfSense_interface_flags($realif, -IFF_UP);
+ }
+ mwexec("/usr/sbin/arp -d -i " . escapeshellarg($realif) . " -a");
+ }
+ break;
+ default:
+ if (does_interface_exist("$realif")) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " delete", true);
+ interface_ipalias_cleanup($interface);
+ if ($destroy == true) {
+ pfSense_interface_flags($realif, -IFF_UP);
+ }
+ mwexec("/usr/sbin/arp -d -i " . escapeshellarg($realif) . " -a");
+ }
+ break;
+ }
+
+ $track6 = array();
+ switch ($ifcfg['ipaddrv6']) {
+ case "slaac":
+ case "dhcp6":
+ $pidv6 = find_dhcp6c_process($realif);
+ if ($pidv6) {
+ posix_kill($pidv6, SIGTERM);
+ }
+ sleep(3);
+ unlink_if_exists("{$g['varetc_path']}/dhcp6c_{$interface}.conf");
+ unlink_if_exists("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh");
+ unlink_if_exists("{$g['varetc_path']}/rtsold_{$realifv6}_script.sh");
+ if (does_interface_exist($realifv6)) {
+ $ip6 = find_interface_ipv6($realifv6);
+ if (is_ipaddrv6($ip6) && $ip6 != "::") {
+ mwexec("/sbin/ifconfig " . escapeshellarg($realifv6) . " inet6 {$ip6} delete", true);
+ }
+ interface_ipalias_cleanup($interface, "inet6");
+ if ($destroy == true) {
+ pfSense_interface_flags($realif, -IFF_UP);
+ }
+ //mwexec("/usr/sbin/arp -d -i " . escapeshellarg($realif) . " -a");
+ }
+ $track6 = link_interface_to_track6($interface);
+ break;
+ case "6rd":
+ case "6to4":
+ $realif = "{$interface}_stf";
+ if (does_interface_exist("$realif")) {
+ /* destroy stf interface if tunnel is being disabled or tunnel type is being changed */
+ if (($ifcfg['ipaddrv6'] == '6rd' && (!isset($config['interfaces'][$interface]['ipaddrv6']) || $config['interfaces'][$interface]['ipaddrv6'] != '6rd')) ||
+ ($ifcfg['ipaddrv6'] == '6to4' && (!isset($config['interfaces'][$interface]['ipaddrv6']) || $config['interfaces'][$interface]['ipaddrv6'] != '6to4'))) {
+ $destroy = true;
+ } else {
+ /* get_interface_ipv6() returns empty value if interface is being disabled */
+ $ip6 = get_interface_ipv6($interface);
+ if (is_ipaddrv6($ip6)) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 {$ip6} delete", true);
+ }
+ }
+ interface_ipalias_cleanup($interface, "inet6");
+ if ($destroy == true) {
+ pfSense_interface_flags($realif, -IFF_UP);
+ }
+ }
+ $track6 = link_interface_to_track6($interface);
+ break;
+ default:
+ if (does_interface_exist("$realif")) {
+ $ip6 = get_interface_ipv6($interface);
+ if (is_ipaddrv6($ip6)) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 {$ip6} delete", true);
+ }
+ if (!empty($ifcfg['ipaddrv6']) && is_ipaddrv6($ifcfg['ipaddrv6'])) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 {$ifcfg['ipaddrv6']} delete", true);
+ }
+ interface_ipalias_cleanup($interface, "inet6");
+ if ($destroy == true) {
+ pfSense_interface_flags($realif, -IFF_UP);
+ }
+ //mwexec("/usr/sbin/arp -d -i " . escapeshellarg($realif) . " -a");
+ }
+ $track6 = link_interface_to_track6($interface);
+ break;
+ }
+
+ if (!empty($track6) && is_array($track6)) {
+ if (!function_exists('services_dhcpd_configure')) {
+ require_once('services.inc');
+ }
+ /* Bring down radvd and dhcp6 on these interfaces */
+ services_dhcpd_configure('inet6', $track6);
+ }
+
+ $old_router = '';
+ if (file_exists("{$g['tmp_path']}/{$realif}_router")) {
+ $old_router = trim(file_get_contents("{$g['tmp_path']}/{$realif}_router"));
+ }
+
+ /* remove interface up file if it exists */
+ unlink_if_exists("{$g['tmp_path']}/{$realif}up");
+ unlink_if_exists("{$g['vardb_path']}/{$interface}ip");
+ unlink_if_exists("{$g['vardb_path']}/{$interface}ipv6");
+ unlink_if_exists("{$g['tmp_path']}/{$realif}_router");
+ unlink_if_exists("{$g['tmp_path']}/{$realif}_routerv6");
+ unlink_if_exists("{$g['varetc_path']}/nameserver_{$realif}");
+ unlink_if_exists("{$g['varetc_path']}/searchdomain_{$realif}");
+
+ /* hostapd and wpa_supplicant do not need to be running when the interface is down.
+ * They will also use 100% CPU if running after the wireless clone gets deleted. */
+ if (is_array($ifcfg['wireless'])) {
+ kill_hostapd($realif);
+ mwexec(kill_wpasupplicant($realif));
+ }
+
+ if ($destroy == true) {
+ if (preg_match("/^[a-z0-9]+^tun|^ovpn|^gif|^gre|^lagg|^bridge|vlan|_stf$/i", $realif)) {
+ pfSense_interface_destroy($realif);
+ }
+ }
+
+ return;
+}
+
+function interfaces_carp_set_maintenancemode($carp_maintenancemode) {
+ global $config;
+ if (isset($config["virtualip_carp_maintenancemode"]) && $carp_maintenancemode == false) {
+ unset($config["virtualip_carp_maintenancemode"]);
+ write_config("Leave CARP maintenance mode");
+ } else if (!isset($config["virtualip_carp_maintenancemode"]) && $carp_maintenancemode == true) {
+ $config["virtualip_carp_maintenancemode"] = true;
+ write_config("Enter CARP maintenance mode");
+ }
+
+ $viparr = &$config['virtualip']['vip'];
+ foreach ($viparr as $vip) {
+ if ($vip['mode'] == "carp") {
+ interface_carp_configure($vip);
+ }
+ }
+}
+
+function interface_isppp_type($interface) {
+ global $config;
+
+ if (!is_array($config['interfaces'][$interface])) {
+ return false;
+ }
+
+ switch ($config['interfaces'][$interface]['ipaddr']) {
+ case 'pptp':
+ case 'l2tp':
+ case 'pppoe':
+ case 'ppp':
+ return true;
+ break;
+ default:
+ return false;
+ break;
+ }
+}
+
+function interfaces_ptpid_used($ptpid) {
+ global $config;
+
+ if (is_array($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as & $settings) {
+ if ($ptpid == $settings['ptpid']) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+function interfaces_ptpid_next() {
+
+ $ptpid = 0;
+ while (interfaces_ptpid_used($ptpid)) {
+ $ptpid++;
+ }
+
+ return $ptpid;
+}
+
+function getMPDCRONSettings($pppif) {
+ global $config;
+
+ $cron_cmd_file = "{$g['varetc_path']}/pppoe_restart_{$pppif}";
+ if (is_array($config['cron']['item'])) {
+ foreach ($config['cron']['item'] as $i => $item) {
+ if (stripos($item['command'], $cron_cmd_file) !== false) {
+ return array("ID" => $i, "ITEM" => $item);
+ }
+ }
+ }
+
+ return NULL;
+}
+
+function handle_pppoe_reset($post_array) {
+ global $config, $g;
+
+ $pppif = "{$post_array['type']}{$post_array['ptpid']}";
+ $cron_cmd_file = "{$g['varetc_path']}/pppoe_restart_{$pppif}";
+
+ if (!is_array($config['cron']['item'])) {
+ $config['cron']['item'] = array();
+ }
+
+ $itemhash = getMPDCRONSettings($pppif);
+
+ // reset cron items if necessary and return
+ if (empty($post_array['pppoe-reset-type'])) {
+ if (isset($itemhash)) {
+ unset($config['cron']['item'][$itemhash['ID']]);
+ }
+ sigkillbypid("{$g['varrun_path']}/cron.pid", "HUP");
+ return;
+ }
+
+ if (empty($itemhash)) {
+ $itemhash = array();
+ }
+ $item = array();
+ if (isset($post_array['pppoe-reset-type']) && $post_array['pppoe-reset-type'] == "custom") {
+ $item['minute'] = $post_array['pppoe_resetminute'];
+ $item['hour'] = $post_array['pppoe_resethour'];
+ if (isset($post_array['pppoe_resetdate']) && $post_array['pppoe_resetdate'] <> "") {
+ $date = explode("/", $post_array['pppoe_resetdate']);
+ $item['mday'] = $date[1];
+ $item['month'] = $date[0];
+ } else {
+ $item['mday'] = "*";
+ $item['month'] = "*";
+ }
+ $item['wday'] = "*";
+ $item['who'] = "root";
+ $item['command'] = $cron_cmd_file;
+ } else if (isset($post_array['pppoe-reset-type']) && $post_array['pppoe-reset-type'] == "preset") {
+ switch ($post_array['pppoe_pr_preset_val']) {
+ case "monthly":
+ $item['minute'] = "0";
+ $item['hour'] = "0";
+ $item['mday'] = "1";
+ $item['month'] = "*";
+ $item['wday'] = "*";
+ break;
+ case "weekly":
+ $item['minute'] = "0";
+ $item['hour'] = "0";
+ $item['mday'] = "*";
+ $item['month'] = "*";
+ $item['wday'] = "0";
+ break;
+ case "daily":
+ $item['minute'] = "0";
+ $item['hour'] = "0";
+ $item['mday'] = "*";
+ $item['month'] = "*";
+ $item['wday'] = "*";
+ break;
+ case "hourly":
+ $item['minute'] = "0";
+ $item['hour'] = "*";
+ $item['mday'] = "*";
+ $item['month'] = "*";
+ $item['wday'] = "*";
+ break;
+ } // end switch
+ $item['who'] = "root";
+ $item['command'] = $cron_cmd_file;
+ }
+ if (empty($item)) {
+ return;
+ }
+ if (isset($itemhash['ID'])) {
+ $config['cron']['item'][$itemhash['ID']] = $item;
+ } else {
+ $config['cron']['item'][] = $item;
+ }
+}
+
+/*
+ * This function can configure PPPoE, MLPPP (PPPoE), PPTP.
+ * It writes the mpd config file to /var/etc every time the link is opened.
+ */
+function interface_ppps_configure($interface) {
+ global $config, $g;
+
+ /* Return for unassigned interfaces. This is a minimum requirement. */
+ if (empty($config['interfaces'][$interface])) {
+ return 0;
+ }
+ $ifcfg = $config['interfaces'][$interface];
+ if (!isset($ifcfg['enable'])) {
+ return 0;
+ }
+
+ // mpd5 requires a /var/spool/lock directory for PPP modem links.
+ if (!is_dir("/var/spool/lock")) {
+ mkdir("/var/spool/lock", 0777, true);
+ }
+ // mpd5 modem chat script expected in the same directory as the mpd_xxx.conf files
+ if (!file_exists("{$g['varetc_path']}/mpd.script")) {
+ @symlink("/usr/local/sbin/mpd.script", "{$g['varetc_path']}/mpd.script");
+ }
+
+ if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
+ if ($ifcfg['if'] == $ppp['if']) {
+ break;
+ }
+ }
+ }
+ if (!$ppp || $ifcfg['if'] != $ppp['if']) {
+ log_error(sprintf(gettext("Can't find PPP config for %s in interface_ppps_configure()."), $ifcfg['if']));
+ return 0;
+ }
+ $pppif = $ifcfg['if'];
+ if ($ppp['type'] == "ppp") {
+ $type = "modem";
+ } else {
+ $type = $ppp['type'];
+ }
+ $upper_type = strtoupper($ppp['type']);
+
+ /* XXX: This does not make sense and may create trouble
+ * comment it for now to be removed later on.
+ if (platform_booting()) {
+ $descr = isset($ifcfg['descr']) ? $ifcfg['descr'] : strtoupper($interface);
+ echo "starting {$pppif} link...";
+ if (isvalidpid("{$g['varrun_path']}/{$ppp['type']}_{$interface}.pid"))
+ return 0;
+ }
+ */
+
+ $ports = explode(',', $ppp['ports']);
+ if ($type != "modem") {
+ foreach ($ports as $pid => $port) {
+ $ports[$pid] = get_real_interface($port);
+ if (empty($ports[$pid])) {
+ return 0;
+ }
+ }
+ }
+ $localips = explode(',', $ppp['localip']);
+ $gateways = explode(',', $ppp['gateway']);
+ $subnets = explode(',', $ppp['subnet']);
+
+ /* We bring up the parent interface first because if DHCP is configured on the parent we need
+ * to obtain an address first so we can write it in the mpd .conf file for PPTP and L2TP configs
+ */
+ foreach ($ports as $pid => $port) {
+ switch ($ppp['type']) {
+ case "pppoe":
+ /* Bring the parent interface up */
+ interfaces_bring_up($port);
+ pfSense_ngctl_attach(".", $port);
+ /* Enable setautosrc to automatically change mac address if parent interface's changes */
+ mwexec("ngctl msg {$port}: setautosrc 1");
+ break;
+ case "pptp":
+ case "l2tp":
+ /* configure interface */
+ if (is_ipaddr($localips[$pid])) {
+ // Manually configure interface IP/subnet
+ pfSense_interface_setaddress($port, "{$localips[$pid]}/{$subnets[$pid]}");
+ interfaces_bring_up($port);
+ } else if (empty($localips[$pid])) {
+ $localips[$pid] = get_interface_ip($port); // try to get the interface IP from the port
+ }
+
+ if (!is_ipaddr($localips[$pid])) {
+ log_error("Could not get a Local IP address for PPTP/L2TP link on {$port} in interfaces_ppps_configure. Using 0.0.0.0 ip!");
+ $localips[$pid] = "0.0.0.0";
+ }
+ if (!is_ipaddr($gateways[$pid])) {
+ log_error(sprintf(gettext('Could not get a PPTP/L2TP Remote IP address from %1$s for %2$s in interfaces_ppps_configure.'), $dhcp_gateway, $gway));
+ return 0;
+ }
+ pfSense_ngctl_attach(".", $port);
+ break;
+ case "ppp":
+ if (!file_exists("{$port}")) {
+ log_error(sprintf(gettext("Device %s does not exist. PPP link cannot start without the modem device."), $port));
+ return 0;
+ }
+ break;
+ default:
+ log_error(sprintf(gettext("Unknown %s configured as ppp interface."), $type));
+ break;
+ }
+ }
+
+ if (is_array($ports) && count($ports) > 1) {
+ $multilink = "enable";
+ } else {
+ $multilink = "disable";
+ }
+
+ if ($type == "modem") {
+ if (is_ipaddr($ppp['localip'])) {
+ $localip = $ppp['localip'];
+ } else {
+ $localip = '0.0.0.0';
+ }
+
+ if (is_ipaddr($ppp['gateway'])) {
+ $gateway = $ppp['gateway'];
+ } else {
+ $gateway = "10.64.64.{$pppid}";
+ }
+ $ranges = "{$localip}/0 {$gateway}/0";
+
+ if (empty($ppp['apnum'])) {
+ $ppp['apnum'] = 1;
+ }
+ } else {
+ $ranges = "0.0.0.0/0 0.0.0.0/0";
+ }
+
+ if (isset($ppp['ondemand'])) {
+ $ondemand = "enable";
+ } else {
+ $ondemand = "disable";
+ }
+ if (!isset($ppp['idletimeout'])) {
+ $ppp['idletimeout'] = 0;
+ }
+
+ if (empty($ppp['username']) && $type == "modem") {
+ $ppp['username'] = "user";
+ $ppp['password'] = "none";
+ }
+ if (empty($ppp['password']) && $type == "modem") {
+ $passwd = "none";
+ } else {
+ $passwd = base64_decode($ppp['password']);
+ }
+
+ $bandwidths = explode(',', $ppp['bandwidth']);
+ $defaultmtu = "1492";
+ if (!empty($ifcfg['mtu'])) {
+ $defaultmtu = intval($ifcfg['mtu']);
+ }
+ $mtus = explode(',', $ppp['mtu']);
+ $mrus = explode(',', $ppp['mru']);
+
+ if (isset($ppp['mrru'])) {
+ $mrrus = explode(',', $ppp['mrru']);
+ }
+
+ // Construct the mpd.conf file
+ $mpdconf = <<<EOD
+startup:
+ # configure the console
+ set console close
+ # configure the web server
+ set web close
+
+default:
+{$ppp['type']}client:
+ create bundle static {$interface}
+ set bundle enable ipv6cp
+ set iface name {$pppif}
+
+EOD;
+ $setdefaultgw = false;
+ $founddefaultgw = false;
+ if (is_array($config['gateways']['gateway_item'])) {
+ foreach ($config['gateways']['gateway_item'] as $gateway) {
+ if ($interface == $gateway['interface'] && isset($gateway['defaultgw'])) {
+ $setdefaultgw = true;
+ break;
+ } else if (isset($gateway['defaultgw']) && !empty($gateway['interface'])) {
+ $founddefaultgw = true;
+ break;
+ }
+ }
+ }
+
+ if (($interface == "wan" && $founddefaultgw == false) || $setdefaultgw == true) {
+ $setdefaultgw = true;
+ $mpdconf .= <<<EOD
+ set iface route default
+
+EOD;
+ }
+ $mpdconf .= <<<EOD
+ set iface {$ondemand} on-demand
+ set iface idle {$ppp['idletimeout']}
+
+EOD;
+
+ if (isset($ppp['ondemand'])) {
+ $mpdconf .= <<<EOD
+ set iface addrs 10.10.1.1 10.10.1.2
+
+EOD;
+ }
+
+ if (isset($ppp['tcpmssfix'])) {
+ $tcpmss = "disable";
+ } else {
+ $tcpmss = "enable";
+ }
+ $mpdconf .= <<<EOD
+ set iface {$tcpmss} tcpmssfix
+
+EOD;
+
+ $mpdconf .= <<<EOD
+ set iface up-script /usr/local/sbin/ppp-linkup
+ set iface down-script /usr/local/sbin/ppp-linkdown
+ set ipcp ranges {$ranges}
+
+EOD;
+ if (isset($ppp['vjcomp'])) {
+ $mpdconf .= <<<EOD
+ set ipcp no vjcomp
+
+EOD;
+ }
+
+ if (isset($config['system']['dnsallowoverride'])) {
+ $mpdconf .= <<<EOD
+ set ipcp enable req-pri-dns
+ set ipcp enable req-sec-dns
+
+EOD;
+ }
+
+ if (!isset($ppp['verbose_log'])) {
+ $mpdconf .= <<<EOD
+ #log -bund -ccp -chat -iface -ipcp -lcp -link
+
+EOD;
+ }
+
+ foreach ($ports as $pid => $port) {
+ $port = get_real_interface($port);
+ $mpdconf .= <<<EOD
+
+ create link static {$interface}_link{$pid} {$type}
+ set link action bundle {$interface}
+ set link {$multilink} multilink
+ set link keep-alive 10 60
+ set link max-redial 0
+
+EOD;
+ if (isset($ppp['shortseq'])) {
+ $mpdconf .= <<<EOD
+ set link no shortseq
+
+EOD;
+ }
+
+ if (isset($ppp['acfcomp'])) {
+ $mpdconf .= <<<EOD
+ set link no acfcomp
+
+EOD;
+ }
+
+ if (isset($ppp['protocomp'])) {
+ $mpdconf .= <<<EOD
+ set link no protocomp
+
+EOD;
+ }
+
+ $mpdconf .= <<<EOD
+ set link disable chap pap
+ set link accept chap pap eap
+ set link disable incoming
+
+EOD;
+
+
+ if (!empty($bandwidths[$pid])) {
+ $mpdconf .= <<<EOD
+ set link bandwidth {$bandwidths[$pid]}
+
+EOD;
+ }
+
+ if (empty($mtus[$pid])) {
+ $mtus[$pid] = $defaultmtu;
+ }
+ $mpdconf .= <<<EOD
+ set link mtu {$mtus[$pid]}
+
+EOD;
+
+ if (!empty($mrus[$pid])) {
+ $mpdconf .= <<<EOD
+ set link mru {$mrus[$pid]}
+
+EOD;
+ }
+
+ if (!empty($mrrus[$pid])) {
+ $mpdconf .= <<<EOD
+ set link mrru {$mrrus[$pid]}
+
+EOD;
+ }
+
+ $mpdconf .= <<<EOD
+ set auth authname "{$ppp['username']}"
+ set auth password {$passwd}
+
+EOD;
+ if ($type == "modem") {
+ $mpdconf .= <<<EOD
+ set modem device {$ppp['ports']}
+ set modem script DialPeer
+ set modem idle-script Ringback
+ set modem watch -cd
+ set modem var \$DialPrefix "DT"
+ set modem var \$Telephone "{$ppp['phone']}"
+
+EOD;
+ }
+ if (isset($ppp['connect-timeout']) && $type == "modem") {
+ $mpdconf .= <<<EOD
+ set modem var \$ConnectTimeout "{$ppp['connect-timeout']}"
+
+EOD;
+ }
+ if (isset($ppp['initstr']) && $type == "modem") {
+ $initstr = base64_decode($ppp['initstr']);
+ $mpdconf .= <<<EOD
+ set modem var \$InitString "{$initstr}"
+
+EOD;
+ }
+ if (isset($ppp['simpin']) && $type == "modem") {
+ if ($ppp['pin-wait'] == "") {
+ $ppp['pin-wait'] = 0;
+ }
+ $mpdconf .= <<<EOD
+ set modem var \$SimPin "{$ppp['simpin']}"
+ set modem var \$PinWait "{$ppp['pin-wait']}"
+
+EOD;
+ }
+ if (isset($ppp['apn']) && $type == "modem") {
+ $mpdconf .= <<<EOD
+ set modem var \$APN "{$ppp['apn']}"
+ set modem var \$APNum "{$ppp['apnum']}"
+
+EOD;
+ }
+ if ($type == "pppoe") {
+ // Send a null service name if none is set.
+ $provider = isset($ppp['provider']) ? $ppp['provider'] : "";
+ $mpdconf .= <<<EOD
+ set pppoe service "{$provider}"
+
+EOD;
+ }
+ if ($type == "pppoe") {
+ $mpdconf .= <<<EOD
+ set pppoe iface {$port}
+
+EOD;
+ }
+
+ if ($type == "pptp" || $type == "l2tp") {
+ $mpdconf .= <<<EOD
+ set {$type} self {$localips[$pid]}
+ set {$type} peer {$gateways[$pid]}
+
+EOD;
+ }
+
+ $mpdconf .= "\topen\n";
+ } //end foreach ($port)
+
+
+ /* Generate mpd.conf. If mpd_[interface].conf exists in the conf path, then link to it instead of generating a fresh conf file. */
+ if (file_exists("{$g['conf_path']}/mpd_{$interface}.conf")) {
+ @symlink("{$g['conf_path']}/mpd_{$interface}.conf", "{$g['varetc_path']}/mpd_{$interface}.conf");
+ } else {
+ $fd = fopen("{$g['varetc_path']}/mpd_{$interface}.conf", "w");
+ if (!$fd) {
+ log_error(sprintf(gettext("Error: cannot open mpd_%s.conf in interface_ppps_configure().%s"), $interface, "\n"));
+ return 0;
+ }
+ // Write out mpd_ppp.conf
+ fwrite($fd, $mpdconf);
+ fclose($fd);
+ unset($mpdconf);
+ }
+
+ // Create the uptime log if requested and if it doesn't exist already, or delete it if it is no longer requested.
+ if (isset($ppp['uptime'])) {
+ if (!file_exists("/conf/{$pppif}.log")) {
+ conf_mount_rw();
+ file_put_contents("/conf/{$pppif}.log", '');
+ conf_mount_ro();
+ }
+ } else {
+ if (file_exists("/conf/{$pppif}.log")) {
+ conf_mount_rw();
+ @unlink("/conf/{$pppif}.log");
+ conf_mount_ro();
+ }
+ }
+
+ /* clean up old lock files */
+ foreach ($ports as $port) {
+ if (file_exists("{$g['var_path']}/spool/lock/LCK..{$port}")) {
+ unlink("{$g['var_path']}/spool/lock/LCK..{$port}");
+ }
+ }
+
+ /* fire up mpd */
+ mwexec("/usr/local/sbin/mpd5 -b -k -d {$g['varetc_path']} -f mpd_{$interface}.conf -p {$g['varrun_path']}/" .
+ escapeshellarg($ppp['type']) . "_{$interface}.pid -s ppp " . escapeshellarg($ppp['type']) . "client");
+
+ // Check for PPPoE periodic reset request
+ if ($type == "pppoe") {
+ if (!empty($ppp['pppoe-reset-type'])) {
+ interface_setup_pppoe_reset_file($ppp['if'], $interface);
+ } else {
+ interface_setup_pppoe_reset_file($ppp['if']);
+ }
+ }
+ /* wait for upto 10 seconds for the interface to appear (ppp(oe)) */
+ $i = 0;
+ while ($i < 3) {
+ sleep(10);
+ if (does_interface_exist($ppp['if'], true)) {
+ break;
+ }
+ $i++;
+ }
+
+ /* we only support the 3gstats.php for huawei modems for now. Will add more later. */
+ /* We should be able to launch the right version for each modem */
+ /* We can also guess the mondev from the manufacturer */
+ exec("usbconfig | egrep -ie '(huawei)'", $usbmodemoutput);
+ mwexec("/bin/ps auxww|grep \"{$interface}\" |grep \"[3]gstats\" | awk '{print $2}' |xargs kill");
+ foreach ($ports as $port) {
+ if (preg_match("/huawei/i", implode("\n", $usbmodemoutput))) {
+ $mondev = substr(basename($port), 0, -1);
+ $devlist = glob("/dev/{$mondev}?");
+ $mondev = basename(end($devlist));
+ }
+ if (preg_match("/zte/i", implode("\n", $usbmodemoutput))) {
+ $mondev = substr(basename($port), 0, -1) . "1";
+ }
+ if ($mondev != '') {
+ log_error("Starting 3gstats.php on device '{$mondev}' for interface '{$interface}'");
+ mwexec_bg("/usr/local/bin/3gstats.php {$mondev} {$interface}");
+ }
+ }
+
+ return 1;
+}
+
+function interfaces_sync_setup() {
+ global $g, $config;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "interfaces_sync_setup() being called $mt\n";
+ }
+
+ if (platform_booting()) {
+ echo gettext("Configuring CARP settings...");
+ mute_kernel_msgs();
+ }
+
+ /* suck in configuration items */
+ if ($config['hasync']) {
+ $pfsyncenabled = $config['hasync']['pfsyncenabled'];
+ $pfsyncinterface = $config['hasync']['pfsyncinterface'];
+ $pfsyncpeerip = $config['hasync']['pfsyncpeerip'];
+ } else {
+ unset($pfsyncinterface);
+ unset($pfsyncenabled);
+ }
+
+ set_sysctl(array(
+ "net.inet.carp.preempt" => "1",
+ "net.inet.carp.log" => "1")
+ );
+
+ if (!empty($pfsyncinterface)) {
+ $carp_sync_int = get_real_interface($pfsyncinterface);
+ } else {
+ unset($carp_sync_int);
+ }
+
+ /* setup pfsync interface */
+ if (isset($carp_sync_int) and isset($pfsyncenabled)) {
+ if (is_ipaddr($pfsyncpeerip)) {
+ $syncpeer = "syncpeer {$pfsyncpeerip}";
+ } else {
+ $syncpeer = "-syncpeer";
+ }
+
+ mwexec("/sbin/ifconfig pfsync0 syncdev {$carp_sync_int} {$syncpeer} up", false);
+ mwexec("/sbin/ifconfig pfsync0 -defer", false);
+
+ sleep(1);
+
+ /* XXX: Handle an issue with pfsync(4) and carp(4). In a cluster carp will come up before pfsync(4) has updated and so will cause issues
+ * for existing sessions.
+ */
+ log_error("waiting for pfsync...");
+ $i = 0;
+ while (intval(trim(`/sbin/ifconfig pfsync0 | /usr/bin/grep 'syncok: 0' | /usr/bin/grep -v grep | /usr/bin/wc -l`)) == 0 && $i < 30) {
+ $i++;
+ sleep(1);
+ }
+ log_error("pfsync done in $i seconds.");
+ log_error("Configuring CARP settings finalize...");
+ } else {
+ mwexec("/sbin/ifconfig pfsync0 -syncdev -syncpeer down", false);
+ }
+
+ if ($config['virtualip']['vip']) {
+ set_single_sysctl("net.inet.carp.allow", "1");
+ } else {
+ set_single_sysctl("net.inet.carp.allow", "0");
+ }
+
+ if (platform_booting()) {
+ unmute_kernel_msgs();
+ echo gettext("done.") . "\n";
+ }
+}
+
+function interface_proxyarp_configure($interface = "") {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "interface_proxyarp_configure() being called $mt\n";
+ }
+
+ /* kill any running choparp */
+ if (empty($interface)) {
+ killbyname("choparp");
+ } else {
+ $vipif = get_real_interface($interface);
+ if (file_exists("{$g['varrun_path']}/choparp_{$vipif}.pid")) {
+ killbypid("{$g['varrun_path']}/choparp_{$vipif}.pid");
+ }
+ }
+
+ $paa = array();
+ if (!empty($config['virtualip']) && is_array($config['virtualip']['vip'])) {
+
+ /* group by interface */
+ foreach ($config['virtualip']['vip'] as $vipent) {
+ if ($vipent['mode'] === "proxyarp") {
+ if ($vipent['interface']) {
+ $proxyif = $vipent['interface'];
+ } else {
+ $proxyif = "wan";
+ }
+
+ if (!empty($interface) && $interface != $proxyif) {
+ continue;
+ }
+
+ if (!is_array($paa[$proxyif])) {
+ $paa[$proxyif] = array();
+ }
+
+ $paa[$proxyif][] = $vipent;
+ }
+ }
+ }
+
+ if (!empty($interface)) {
+ if (is_array($paa[$interface])) {
+ $paaifip = get_interface_ip($interface);
+ if (!is_ipaddr($paaifip)) {
+ return;
+ }
+ $args = get_real_interface($interface) . " auto";
+ foreach ($paa[$interface] as $paent) {
+ if (isset($paent['subnet'])) {
+ $args .= " " . escapeshellarg("{$paent['subnet']}/{$paent['subnet_bits']}");
+ } else if (isset($paent['range'])) {
+ $args .= " " . escapeshellarg($paent['range']['from'] . "-" . $paent['range']['to']);
+ }
+ }
+ mwexec_bg("/usr/local/sbin/choparp " . $args);
+ }
+ } else if (count($paa) > 0) {
+ foreach ($paa as $paif => $paents) {
+ $paaifip = get_interface_ip($paif);
+ if (!is_ipaddr($paaifip)) {
+ continue;
+ }
+ $args = get_real_interface($paif) . " auto";
+ foreach ($paents as $paent) {
+ if (isset($paent['subnet'])) {
+ $args .= " " . escapeshellarg("{$paent['subnet']}/{$paent['subnet_bits']}");
+ } else if (isset($paent['range'])) {
+ $args .= " " . escapeshellarg($paent['range']['from'] . "-" . $paent['range']['to']);
+ }
+ }
+ mwexec_bg("/usr/local/sbin/choparp " . $args);
+ }
+ }
+}
+
+function interface_ipalias_cleanup($interface, $inet = "inet4") {
+ global $g, $config;
+
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['mode'] == "ipalias" && $vip['interface'] == $interface) {
+ if ($inet == "inet6" && is_ipaddrv6($vip['subnet'])) {
+ interface_vip_bring_down($vip);
+ } else if ($inet == "inet4" && is_ipaddrv4($vip['subnet'])) {
+ interface_vip_bring_down($vip);
+ }
+ }
+ }
+ }
+}
+
+function interfaces_vips_configure($interface = "") {
+ global $g, $config;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "interfaces_vips_configure() being called $mt\n";
+ }
+ $paa = array();
+ if (is_array($config['virtualip']['vip'])) {
+ $carp_setuped = false;
+ $anyproxyarp = false;
+ foreach ($config['virtualip']['vip'] as $vip) {
+ switch ($vip['mode']) {
+ case "proxyarp":
+ /* nothing it is handled on interface_proxyarp_configure() */
+ if ($interface <> "" && $vip['interface'] <> $interface) {
+ continue;
+ }
+ $anyproxyarp = true;
+ break;
+ case "ipalias":
+ if ($interface <> "" && $vip['interface'] <> $interface) {
+ continue;
+ }
+ interface_ipalias_configure($vip);
+ break;
+ case "carp":
+ if ($interface <> "" && $vip['interface'] <> $interface) {
+ continue;
+ }
+ if ($carp_setuped == false) {
+ $carp_setuped = true;
+ }
+ interface_carp_configure($vip);
+ break;
+ }
+ }
+ if ($carp_setuped == true) {
+ interfaces_sync_setup();
+ }
+ if ($anyproxyarp == true) {
+ interface_proxyarp_configure();
+ }
+ }
+}
+
+function interface_ipalias_configure(&$vip) {
+ global $config;
+
+ if ($vip['mode'] != 'ipalias') {
+ return;
+ }
+
+ if ($vip['interface'] != 'lo0' && stripos($vip['interface'], '_vip') === false) {
+ if (!isset($config['interfaces'][$vip['interface']])) {
+ return;
+ }
+
+ if (!isset($config['interfaces'][$vip['interface']]['enable'])) {
+ return;
+ }
+ }
+
+ $af = 'inet';
+ if (is_ipaddrv6($vip['subnet'])) {
+ $af = 'inet6';
+ }
+ $iface = $vip['interface'];
+ $vipadd = '';
+ if (strpos($vip['interface'], '_vip')) {
+ $carpvip = get_configured_carp_interface_list($vip['interface'], $af, 'vip');
+ $iface = $carpvip['interface'];
+ $vipadd = "vhid {$carpvip['vhid']}";
+ }
+ $if = get_real_interface($iface);
+ mwexec("/sbin/ifconfig " . escapeshellarg($if) ." {$af} ". escapeshellarg($vip['subnet']) ."/" . escapeshellarg($vip['subnet_bits']) . " alias {$vipadd}");
+ unset($iface, $af, $if, $carpvip, $vipadd);
+}
+
+function interface_reload_carps($cif) {
+ global $config;
+
+ $carpifs = link_ip_to_carp_interface(find_interface_ip($cif));
+ if (empty($carpifs)) {
+ return;
+ }
+
+ $carps = explode(" ", $carpifs);
+ if (is_array($config['virtualip']['vip'])) {
+ $viparr = &$config['virtualip']['vip'];
+ foreach ($viparr as $vip) {
+ if (in_array($vip['carpif'], $carps)) {
+ switch ($vip['mode']) {
+ case "carp":
+ interface_vip_bring_down($vip);
+ sleep(1);
+ interface_carp_configure($vip);
+ break;
+ case "ipalias":
+ interface_vip_bring_down($vip);
+ sleep(1);
+ interface_ipalias_configure($vip);
+ break;
+ }
+ }
+ }
+ }
+}
+
+function interface_carp_configure(&$vip) {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "interface_carp_configure() being called $mt\n";
+ }
+
+ if ($vip['mode'] != "carp") {
+ return;
+ }
+
+ /* NOTE: Maybe its useless nowadays */
+ $realif = get_real_interface($vip['interface']);
+ if (!does_interface_exist($realif)) {
+ file_notice("CARP", sprintf(gettext("Interface specified for the virtual IP address %s does not exist. Skipping this VIP."), $vip['subnet']), "Firewall: Virtual IP", "");
+ return;
+ }
+
+ $vip_password = $vip['password'];
+ $vip_password = escapeshellarg(addslashes(str_replace(" ", "", $vip_password)));
+ if ($vip['password'] != "") {
+ $password = " pass {$vip_password}";
+ }
+
+ $advbase = "";
+ if (!empty($vip['advbase'])) {
+ $advbase = "advbase " . escapeshellarg($vip['advbase']);
+ }
+
+ $carp_maintenancemode = isset($config["virtualip_carp_maintenancemode"]);
+ if ($carp_maintenancemode) {
+ $advskew = "advskew 254";
+ } else {
+ $advskew = "advskew " . escapeshellarg($vip['advskew']);
+ }
+
+ mwexec("/sbin/ifconfig {$realif} vhid " . escapeshellarg($vip['vhid']) . " {$advskew} {$advbase} {$password}");
+
+ if (is_ipaddrv4($vip['subnet'])) {
+ mwexec("/sbin/ifconfig {$realif} " . escapeshellarg($vip['subnet']) . "/" . escapeshellarg($vip['subnet_bits']) . " alias vhid " . escapeshellarg($vip['vhid']));
+ } else if (is_ipaddrv6($vip['subnet'])) {
+ mwexec("/sbin/ifconfig {$realif} inet6 " . escapeshellarg($vip['subnet']) . " prefixlen " . escapeshellarg($vip['subnet_bits']) . " alias vhid " . escapeshellarg($vip['vhid']));
+ }
+
+ return $realif;
+}
+
+function interface_wireless_clone($realif, $wlcfg) {
+ global $config, $g;
+ /* Check to see if interface has been cloned as of yet.
+ * If it has not been cloned then go ahead and clone it.
+ */
+ $needs_clone = false;
+ if (is_array($wlcfg['wireless'])) {
+ $wlcfg_mode = $wlcfg['wireless']['mode'];
+ } else {
+ $wlcfg_mode = $wlcfg['mode'];
+ }
+ switch ($wlcfg_mode) {
+ case "hostap":
+ $mode = "wlanmode hostap";
+ break;
+ case "adhoc":
+ $mode = "wlanmode adhoc";
+ break;
+ default:
+ $mode = "";
+ break;
+ }
+ $baseif = interface_get_wireless_base($wlcfg['if']);
+ if (does_interface_exist($realif)) {
+ exec("/sbin/ifconfig " . escapeshellarg($realif), $output, $ret);
+ $ifconfig_str = implode($output);
+ if (($wlcfg_mode == "hostap") && (!preg_match("/hostap/si", $ifconfig_str))) {
+ log_error(sprintf(gettext("Interface %s changed to hostap mode"), $realif));
+ $needs_clone = true;
+ }
+ if (($wlcfg_mode == "adhoc") && (!preg_match("/adhoc/si", $ifconfig_str))) {
+ log_error(sprintf(gettext("Interface %s changed to adhoc mode"), $realif));
+ $needs_clone = true;
+ }
+ if (($wlcfg_mode == "bss") && (preg_match("/hostap|adhoc/si", $ifconfig_str))) {
+ log_error(sprintf(gettext("Interface %s changed to infrastructure mode"), $realif));
+ $needs_clone = true;
+ }
+ } else {
+ $needs_clone = true;
+ }
+
+ if ($needs_clone == true) {
+ /* remove previous instance if it exists */
+ if (does_interface_exist($realif)) {
+ pfSense_interface_destroy($realif);
+ }
+
+ log_error(sprintf(gettext("Cloning new wireless interface %s"), $realif));
+ // Create the new wlan interface. FreeBSD returns the new interface name.
+ // example: wlan2
+ exec("/sbin/ifconfig wlan create wlandev {$baseif} {$mode} bssid 2>&1", $out, $ret);
+ if ($ret <> 0) {
+ log_error(sprintf(gettext('Failed to clone interface %1$s with error code %2$s, output %3$s'), $baseif, $ret, $out[0]));
+ return false;
+ }
+ $newif = trim($out[0]);
+ // Rename the interface to {$parentnic}_wlan{$number}#: EX: ath0_wlan0
+ pfSense_interface_rename($newif, $realif);
+ file_put_contents("{$g['tmp_path']}/{$realif}_oldmac", get_interface_mac($realif));
+ }
+ return true;
+}
+
+function interface_sync_wireless_clones(&$ifcfg, $sync_changes = false) {
+ global $config, $g;
+
+ $shared_settings = array('standard', 'turbo', 'protmode', 'txpower', 'channel',
+ 'diversity', 'txantenna', 'rxantenna', 'distance',
+ 'regdomain', 'regcountry', 'reglocation');
+
+ if (!is_interface_wireless($ifcfg['if'])) {
+ return;
+ }
+
+ $baseif = interface_get_wireless_base($ifcfg['if']);
+
+ // Sync shared settings for assigned clones
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if) {
+ if ($baseif == interface_get_wireless_base($config['interfaces'][$if]['if']) && $ifcfg['if'] != $config['interfaces'][$if]['if']) {
+ if (isset($config['interfaces'][$if]['wireless']['standard']) || $sync_changes) {
+ foreach ($shared_settings as $setting) {
+ if ($sync_changes) {
+ if (isset($ifcfg['wireless'][$setting])) {
+ $config['interfaces'][$if]['wireless'][$setting] = $ifcfg['wireless'][$setting];
+ } else if (isset($config['interfaces'][$if]['wireless'][$setting])) {
+ unset($config['interfaces'][$if]['wireless'][$setting]);
+ }
+ } else {
+ if (isset($config['interfaces'][$if]['wireless'][$setting])) {
+ $ifcfg['wireless'][$setting] = $config['interfaces'][$if]['wireless'][$setting];
+ } else if (isset($ifcfg['wireless'][$setting])) {
+ unset($ifcfg['wireless'][$setting]);
+ }
+ }
+ }
+ if (!$sync_changes) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Read or write settings at shared area
+ if (isset($config['wireless']['interfaces'][$baseif]) && is_array($config['wireless']['interfaces'][$baseif])) {
+ foreach ($shared_settings as $setting) {
+ if ($sync_changes) {
+ if (isset($ifcfg['wireless'][$setting])) {
+ $config['wireless']['interfaces'][$baseif][$setting] = $ifcfg['wireless'][$setting];
+ } else if (isset($config['wireless']['interfaces'][$baseif][$setting])) {
+ unset($config['wireless']['interfaces'][$baseif][$setting]);
+ }
+ } else if (isset($config['wireless']['interfaces'][$baseif][$setting])) {
+ if (isset($config['wireless']['interfaces'][$baseif][$setting])) {
+ $ifcfg['wireless'][$setting] = $config['wireless']['interfaces'][$baseif][$setting];
+ } else if (isset($ifcfg['wireless'][$setting])) {
+ unset($ifcfg['wireless'][$setting]);
+ }
+ }
+ }
+ }
+
+ // Sync the mode on the clone creation page with the configured mode on the interface
+ if (interface_is_wireless_clone($ifcfg['if']) && isset($config['wireless']['clone']) && is_array($config['wireless']['clone'])) {
+ foreach ($config['wireless']['clone'] as &$clone) {
+ if ($clone['cloneif'] == $ifcfg['if']) {
+ if ($sync_changes) {
+ $clone['mode'] = $ifcfg['wireless']['mode'];
+ } else {
+ $ifcfg['wireless']['mode'] = $clone['mode'];
+ }
+ break;
+ }
+ }
+ unset($clone);
+ }
+}
+
+function interface_wireless_configure($if, &$wl, &$wlcfg) {
+ global $config, $g;
+
+ /* open up a shell script that will be used to output the commands.
+ * since wireless is changing a lot, these series of commands are fragile
+ * and will sometimes need to be verified by a operator by executing the command
+ * and returning the output of the command to the developers for inspection. please
+ * do not change this routine from a shell script to individual exec commands. -sullrich
+ */
+
+ // Remove script file
+ unlink_if_exists("{$g['tmp_path']}/{$if}_setup.sh");
+
+ // Clone wireless nic if needed.
+ interface_wireless_clone($if, $wl);
+
+ // Reject inadvertent changes to shared settings in case the interface hasn't been configured.
+ interface_sync_wireless_clones($wl, false);
+
+ $fd_set = fopen("{$g['tmp_path']}/{$if}_setup.sh", "w");
+ fwrite($fd_set, "#!/bin/sh\n");
+ fwrite($fd_set, "# {$g['product_name']} wireless configuration script.\n\n");
+
+ $wlan_setup_log = fopen("{$g['tmp_path']}/{$if}_setup.log", "w");
+
+ /* set values for /path/program */
+ $hostapd = "/usr/sbin/hostapd";
+ $wpa_supplicant = "/usr/sbin/wpa_supplicant";
+ $ifconfig = "/sbin/ifconfig";
+ $sysctl = "/sbin/sysctl";
+ $killall = "/usr/bin/killall";
+
+ /* Set all wireless ifconfig variables (split up to get rid of needed checking) */
+
+ $wlcmd = array();
+ $wl_sysctl = array();
+ /* Make sure it's up */
+ $wlcmd[] = "up";
+ /* Set a/b/g standard */
+ $standard = str_replace(" Turbo", "", $wlcfg['standard']);
+ /* skip mode entirely for "auto" */
+ if ($wlcfg['standard'] != "auto") {
+ $wlcmd[] = "mode " . escapeshellarg($standard);
+ }
+
+ /* XXX: Disable ampdu for now on mwl when running in 11n mode
+ * to prevent massive packet loss under certain conditions. */
+ if (preg_match("/^mwl/i", $if) && ($standard == "11ng" || $standard == "11na")) {
+ $wlcmd[] = "-ampdu";
+ }
+
+ /* Set ssid */
+ if ($wlcfg['ssid']) {
+ $wlcmd[] = "ssid " .escapeshellarg($wlcfg['ssid']);
+ }
+
+ /* Set 802.11g protection mode */
+ $wlcmd[] = "protmode " . escapeshellarg($wlcfg['protmode']);
+
+ /* set wireless channel value */
+ if (isset($wlcfg['channel'])) {
+ if ($wlcfg['channel'] == "0") {
+ $wlcmd[] = "channel any";
+ } else {
+ $wlcmd[] = "channel " . escapeshellarg($wlcfg['channel']);
+ }
+ }
+
+ /* Set antenna diversity value */
+ if (isset($wlcfg['diversity'])) {
+ $wl_sysctl[] = "diversity=" . escapeshellarg($wlcfg['diversity']);
+ }
+
+ /* Set txantenna value */
+ if (isset($wlcfg['txantenna'])) {
+ $wl_sysctl[] = "txantenna=" . escapeshellarg($wlcfg['txantenna']);
+ }
+
+ /* Set rxantenna value */
+ if (isset($wlcfg['rxantenna'])) {
+ $wl_sysctl[] = "rxantenna=" . escapeshellarg($wlcfg['rxantenna']);
+ }
+
+ /* set Distance value */
+ if ($wlcfg['distance']) {
+ $distance = escapeshellarg($wlcfg['distance']);
+ }
+
+ /* Set wireless hostap mode */
+ if ($wlcfg['mode'] == "hostap") {
+ $wlcmd[] = "mediaopt hostap";
+ } else {
+ $wlcmd[] = "-mediaopt hostap";
+ }
+
+ /* Set wireless adhoc mode */
+ if ($wlcfg['mode'] == "adhoc") {
+ $wlcmd[] = "mediaopt adhoc";
+ } else {
+ $wlcmd[] = "-mediaopt adhoc";
+ }
+
+ /* Not necessary to set BSS mode as this is default if adhoc and/or hostap is NOT set */
+
+ /* handle hide ssid option */
+ if (isset($wlcfg['hidessid']['enable'])) {
+ $wlcmd[] = "hidessid";
+ } else {
+ $wlcmd[] = "-hidessid";
+ }
+
+ /* handle pureg (802.11g) only option */
+ if (isset($wlcfg['pureg']['enable'])) {
+ $wlcmd[] = "mode 11g pureg";
+ } else {
+ $wlcmd[] = "-pureg";
+ }
+
+ /* handle puren (802.11n) only option */
+ if (isset($wlcfg['puren']['enable'])) {
+ $wlcmd[] = "puren";
+ } else {
+ $wlcmd[] = "-puren";
+ }
+
+ /* enable apbridge option */
+ if (isset($wlcfg['apbridge']['enable'])) {
+ $wlcmd[] = "apbridge";
+ } else {
+ $wlcmd[] = "-apbridge";
+ }
+
+ /* handle turbo option */
+ if (isset($wlcfg['turbo']['enable'])) {
+ $wlcmd[] = "mediaopt turbo";
+ } else {
+ $wlcmd[] = "-mediaopt turbo";
+ }
+
+ /* handle txpower setting */
+ // or don't. this has issues at the moment.
+ /*
+ if ($wlcfg['txpower'] <> "" && is_numeric($wlcfg['txpower'])) {
+ $wlcmd[] = "txpower " . escapeshellarg($wlcfg['txpower']);
+ }*/
+
+ /* handle wme option */
+ if (isset($wlcfg['wme']['enable'])) {
+ $wlcmd[] = "wme";
+ } else {
+ $wlcmd[] = "-wme";
+ }
+
+ /* set up wep if enabled */
+ $wepset = "";
+ if (isset($wlcfg['wep']['enable']) && is_array($wlcfg['wep']['key'])) {
+ switch ($wlcfg['wpa']['auth_algs']) {
+ case "1":
+ $wepset .= "authmode open wepmode on ";
+ break;
+ case "2":
+ $wepset .= "authmode shared wepmode on ";
+ break;
+ case "3":
+ $wepset .= "authmode mixed wepmode on ";
+ }
+ $i = 1;
+ foreach ($wlcfg['wep']['key'] as $wepkey) {
+ $wepset .= "wepkey " . escapeshellarg("{$i}:{$wepkey['value']}") . " ";
+ if (isset($wepkey['txkey'])) {
+ $wlcmd[] = "weptxkey {$i} ";
+ }
+ $i++;
+ }
+ $wlcmd[] = $wepset;
+ } else if (isset($wlcfg['wpa']['enable'])) {
+ $wlcmd[] = "authmode wpa wepmode off ";
+ } else {
+ $wlcmd[] = "authmode open wepmode off ";
+ }
+
+ kill_hostapd($if);
+ mwexec(kill_wpasupplicant("{$if}"));
+
+ /* generate wpa_supplicant/hostap config if wpa is enabled */
+ conf_mount_rw();
+
+ switch ($wlcfg['mode']) {
+ case 'bss':
+ if (isset($wlcfg['wpa']['enable'])) {
+ $wpa .= <<<EOD
+ctrl_interface={$g['varrun_path']}/wpa_supplicant
+ctrl_interface_group=0
+ap_scan=1
+#fast_reauth=1
+network={
+ssid="{$wlcfg['ssid']}"
+scan_ssid=1
+priority=5
+key_mgmt={$wlcfg['wpa']['wpa_key_mgmt']}
+psk="{$wlcfg['wpa']['passphrase']}"
+pairwise={$wlcfg['wpa']['wpa_pairwise']}
+group={$wlcfg['wpa']['wpa_pairwise']}
+}
+EOD;
+
+ @file_put_contents("{$g['varetc_path']}/wpa_supplicant_{$if}.conf", $wpa);
+ unset($wpa);
+ }
+ break;
+ case 'hostap':
+ if (!empty($wlcfg['wpa']['passphrase'])) {
+ $wpa_passphrase = "wpa_passphrase={$wlcfg['wpa']['passphrase']}\n";
+ } else {
+ $wpa_passphrase = "";
+ }
+ if (isset($wlcfg['wpa']['enable'])) {
+ $wpa .= <<<EOD
+interface={$if}
+driver=bsd
+logger_syslog=-1
+logger_syslog_level=0
+logger_stdout=-1
+logger_stdout_level=0
+dump_file={$g['tmp_path']}/hostapd_{$if}.dump
+ctrl_interface={$g['varrun_path']}/hostapd
+ctrl_interface_group=wheel
+#accept_mac_file={$g['tmp_path']}/hostapd_{$if}.accept
+#deny_mac_file={$g['tmp_path']}/hostapd_{$if}.deny
+#macaddr_acl={$wlcfg['wpa']['macaddr_acl']}
+ssid={$wlcfg['ssid']}
+debug={$wlcfg['wpa']['debug_mode']}
+auth_algs={$wlcfg['wpa']['auth_algs']}
+wpa={$wlcfg['wpa']['wpa_mode']}
+wpa_key_mgmt={$wlcfg['wpa']['wpa_key_mgmt']}
+wpa_pairwise={$wlcfg['wpa']['wpa_pairwise']}
+wpa_group_rekey={$wlcfg['wpa']['wpa_group_rekey']}
+wpa_gmk_rekey={$wlcfg['wpa']['wpa_gmk_rekey']}
+wpa_strict_rekey={$wlcfg['wpa']['wpa_strict_rekey']}
+{$wpa_passphrase}
+
+EOD;
+
+ if (isset($wlcfg['wpa']['rsn_preauth'])) {
+ $wpa .= <<<EOD
+# Enable the next lines for preauth when roaming. Interface = wired or wireless interface talking to the AP you want to roam from/to
+rsn_preauth=1
+rsn_preauth_interfaces={$if}
+
+EOD;
+ }
+ if (is_array($wlcfg['wpa']['ieee8021x']) && isset($wlcfg['wpa']['ieee8021x']['enable'])) {
+ $wpa .= "ieee8021x=1\n";
+
+ if (!empty($wlcfg['auth_server_addr']) && !empty($wlcfg['auth_server_shared_secret'])) {
+ $auth_server_port = "1812";
+ if (!empty($wlcfg['auth_server_port']) && is_numeric($wlcfg['auth_server_port'])) {
+ $auth_server_port = intval($wlcfg['auth_server_port']);
+ }
+ $wpa .= <<<EOD
+
+auth_server_addr={$wlcfg['auth_server_addr']}
+auth_server_port={$auth_server_port}
+auth_server_shared_secret={$wlcfg['auth_server_shared_secret']}
+
+EOD;
+ if (!empty($wlcfg['auth_server_addr2']) && !empty($wlcfg['auth_server_shared_secret2'])) {
+ $auth_server_port2 = "1812";
+ if (!empty($wlcfg['auth_server_port2']) && is_numeric($wlcfg['auth_server_port2'])) {
+ $auth_server_port2 = intval($wlcfg['auth_server_port2']);
+ }
+
+ $wpa .= <<<EOD
+auth_server_addr={$wlcfg['auth_server_addr2']}
+auth_server_port={$auth_server_port2}
+auth_server_shared_secret={$wlcfg['auth_server_shared_secret2']}
+
+EOD;
+ }
+ }
+ }
+
+ @file_put_contents("{$g['varetc_path']}/hostapd_{$if}.conf", $wpa);
+ unset($wpa);
+ }
+ break;
+ }
+
+ /*
+ * all variables are set, lets start up everything
+ */
+
+ $baseif = interface_get_wireless_base($if);
+ preg_match("/^(.*?)([0-9]*)$/", $baseif, $baseif_split);
+ $wl_sysctl_prefix = 'dev.' . $baseif_split[1] . '.' . $baseif_split[2];
+
+ /* set sysctls for the wireless interface */
+ if (!empty($wl_sysctl)) {
+ fwrite($fd_set, "# sysctls for {$baseif}\n");
+ foreach ($wl_sysctl as $wl_sysctl_line) {
+ fwrite($fd_set, "{$sysctl} {$wl_sysctl_prefix}.{$wl_sysctl_line}\n");
+ }
+ }
+
+ /* set ack timers according to users preference (if he/she has any) */
+ if ($distance) {
+ fwrite($fd_set, "# Enable ATH distance settings\n");
+ fwrite($fd_set, "/sbin/athctrl.sh -i {$baseif} -d {$distance}\n");
+ }
+
+ if (isset($wlcfg['wpa']['enable'])) {
+ if ($wlcfg['mode'] == "bss") {
+ fwrite($fd_set, "{$wpa_supplicant} -B -i {$if} -c {$g['varetc_path']}/wpa_supplicant_{$if}.conf\n");
+ }
+ if ($wlcfg['mode'] == "hostap") {
+ /* add line to script to restore old mac to make hostapd happy */
+ if (file_exists("{$g['tmp_path']}/{$if}_oldmac")) {
+ $if_oldmac = file_get_contents("{$g['tmp_path']}/{$if}_oldmac");
+ if (is_macaddr($if_oldmac)) {
+ fwrite($fd_set, "{$ifconfig} " . escapeshellarg($if) .
+ " link " . escapeshellarg($if_oldmac) . "\n");
+ }
+ }
+
+ fwrite($fd_set, "{$hostapd} -B -P {$g['varrun_path']}/hostapd_{$if}.pid {$g['varetc_path']}/hostapd_{$if}.conf\n");
+
+ /* add line to script to restore spoofed mac after running hostapd */
+ if (file_exists("{$g['tmp_path']}/{$if}_oldmac")) {
+ if ($wl['spoofmac']) {
+ $if_curmac = $wl['spoofmac'];
+ } else {
+ $if_curmac = get_interface_mac($if);
+ }
+ if (is_macaddr($if_curmac)) {
+ fwrite($fd_set, "{$ifconfig} " . escapeshellarg($if) .
+ " link " . escapeshellarg($if_curmac) . "\n");
+ }
+ }
+ }
+ }
+
+ fclose($fd_set);
+ conf_mount_ro();
+
+ /* Making sure regulatory settings have actually changed
+ * before applying, because changing them requires bringing
+ * down all wireless networks on the interface. */
+ exec("{$ifconfig} " . escapeshellarg($if), $output);
+ $ifconfig_str = implode($output);
+ unset($output);
+ $reg_changing = false;
+
+ /* special case for the debug country code */
+ if ($wlcfg['regcountry'] == 'DEBUG' && !preg_match("/\sregdomain\s+DEBUG\s/si", $ifconfig_str)) {
+ $reg_changing = true;
+ } else if ($wlcfg['regdomain'] && !preg_match("/\sregdomain\s+{$wlcfg['regdomain']}\s/si", $ifconfig_str)) {
+ $reg_changing = true;
+ } else if ($wlcfg['regcountry'] && !preg_match("/\scountry\s+{$wlcfg['regcountry']}\s/si", $ifconfig_str)) {
+ $reg_changing = true;
+ } else if ($wlcfg['reglocation'] == 'anywhere' && preg_match("/\s(indoor|outdoor)\s/si", $ifconfig_str)) {
+ $reg_changing = true;
+ } else if ($wlcfg['reglocation'] && $wlcfg['reglocation'] != 'anywhere' && !preg_match("/\s{$wlcfg['reglocation']}\s/si", $ifconfig_str)) {
+ $reg_changing = true;
+ }
+
+ if ($reg_changing) {
+ /* set regulatory domain */
+ if ($wlcfg['regdomain']) {
+ $wlregcmd[] = "regdomain " . escapeshellarg($wlcfg['regdomain']);
+ }
+
+ /* set country */
+ if ($wlcfg['regcountry']) {
+ $wlregcmd[] = "country " . escapeshellarg($wlcfg['regcountry']);
+ }
+
+ /* set location */
+ if ($wlcfg['reglocation']) {
+ $wlregcmd[] = escapeshellarg($wlcfg['reglocation']);
+ }
+
+ $wlregcmd_args = implode(" ", $wlregcmd);
+
+ /* build a complete list of the wireless clones for this interface */
+ $clone_list = array();
+ if (does_interface_exist(interface_get_wireless_clone($baseif))) {
+ $clone_list[] = interface_get_wireless_clone($baseif);
+ }
+ if (isset($config['wireless']['clone']) && is_array($config['wireless']['clone'])) {
+ foreach ($config['wireless']['clone'] as $clone) {
+ if ($clone['if'] == $baseif) {
+ $clone_list[] = $clone['cloneif'];
+ }
+ }
+ }
+
+ /* find which clones are up and bring them down */
+ $clones_up = array();
+ foreach ($clone_list as $clone_if) {
+ $clone_status = pfSense_get_interface_addresses($clone_if);
+ if ($clone_status['status'] == 'up') {
+ $clones_up[] = $clone_if;
+ mwexec("{$ifconfig} " . escapeshellarg($clone_if) . " down");
+ }
+ }
+
+ /* apply the regulatory settings */
+ mwexec("{$ifconfig} " . escapeshellarg($if) . " {$wlregcmd_args}");
+ fwrite($wlan_setup_log, "$ifconfig" . escapeshellarg($if) . "$wlregcmd_args \n");
+
+ /* bring the clones back up that were previously up */
+ foreach ($clones_up as $clone_if) {
+ interfaces_bring_up($clone_if);
+
+ /*
+ * Rerun the setup script for the interface if it isn't this interface, the interface
+ * is in infrastructure mode, and WPA is enabled.
+ * This can be removed if wpa_supplicant stops dying when you bring the interface down.
+ */
+ if ($clone_if != $if) {
+ $friendly_if = convert_real_interface_to_friendly_interface_name($clone_if);
+ if ((!empty($friendly_if)) &&
+ ($config['interfaces'][$friendly_if]['wireless']['mode'] == "bss") &&
+ (isset($config['interfaces'][$friendly_if]['wireless']['wpa']['enable']))) {
+ mwexec("/bin/sh {$g['tmp_path']}/" . escapeshellarg($clone_if) . "_setup.sh");
+ }
+ }
+ }
+ }
+
+ /* 20150318 cmb - Note: the below no longer appears to be true on FreeBSD 10.x, so don't set
+ * mode twice (for now at least). This can be removed entirely in the future if no problems are found
+
+ * The mode must be specified in a separate command before ifconfig
+ * will allow the mode and channel at the same time in the next. */
+ //mwexec("/sbin/ifconfig " . escapeshellarg($if) . " mode " . escapeshellarg($standard));
+ //fwrite($wlan_setup_log, "/sbin/ifconfig " . escapeshellarg($if) . " mode " . escapeshellarg($standard) . "\n");
+
+ /* configure wireless */
+ $wlcmd_args = implode(" ", $wlcmd);
+ mwexec("/sbin/ifconfig " . escapeshellarg($if) . " " . $wlcmd_args, false);
+ fwrite($wlan_setup_log, "/sbin/ifconfig " . escapeshellarg($if) . " " . "$wlcmd_args \n");
+ fclose($wlan_setup_log);
+
+ unset($wlcmd_args, $wlcmd);
+
+
+ sleep(1);
+ /* execute hostapd and wpa_supplicant if required in shell */
+ mwexec("/bin/sh {$g['tmp_path']}/" . escapeshellarg($if) . "_setup.sh");
+
+ return 0;
+
+}
+
+function kill_hostapd($interface) {
+ global $g;
+
+ if (isvalidpid("{$g['varrun_path']}/hostapd_{$interface}.pid")) {
+ return killbypid("{$g['varrun_path']}/hostapd_{$interface}.pid");
+ }
+}
+
+function kill_wpasupplicant($interface) {
+ return "/bin/pkill -f \"wpa_supplicant .*{$interface}\\.conf\"\n";
+}
+
+function find_dhclient_process($interface) {
+ if ($interface) {
+ $pid = `/bin/pgrep -axf "dhclient: {$interface}"`;
+ } else {
+ $pid = 0;
+ }
+
+ return intval($pid);
+}
+
+function kill_dhclient_process($interface) {
+ if (empty($interface) || !does_interface_exist($interface)) {
+ return;
+ }
+
+ $i = 0;
+ while ((($pid = find_dhclient_process($interface)) != 0) && ($i < 3)) {
+ /* 3rd time make it die for sure */
+ $sig = ($i == 2 ? SIGKILL : SIGTERM);
+ posix_kill($pid, $sig);
+ sleep(1);
+ $i++;
+ }
+ unset($i);
+}
+
+function find_dhcp6c_process($interface) {
+ global $g;
+
+ if ($interface && isvalidpid("{$g['varrun_path']}/dhcp6c_{$interface}.pid")) {
+ $pid = trim(file_get_contents("{$g['varrun_path']}/dhcp6c_{$interface}.pid"), " \n");
+ } else {
+ return(false);
+ }
+
+ return intval($pid);
+}
+
+function interface_virtual_create($interface) {
+ global $config;
+
+ if (strstr($interface, "_vlan")) {
+ interfaces_vlan_configure($vlan);
+ } else if (substr($interface, 0, 3) == "gre") {
+ interfaces_gre_configure(0, $interface);
+ } else if (substr($interface, 0, 3) == "gif") {
+ interfaces_gif_configure(0, $interface);
+ } else if (substr($interface, 0, 5) == "ovpns") {
+ if (is_array($config['openvpn']) && is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $server) {
+ if ($interface == "ovpns{$server['vpnid']}") {
+ if (!function_exists('openvpn_resync')) {
+ require_once('openvpn.inc');
+ }
+ log_error("OpenVPN: Resync server {$server['description']}");
+ openvpn_resync('server', $server);
+ }
+ }
+ unset($server);
+ }
+ } else if (substr($interface, 0, 5) == "ovpnc") {
+ if (is_array($config['openvpn']) && is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as $client) {
+ if ($interface == "ovpnc{$client['vpnid']}") {
+ if (!function_exists('openvpn_resync')) {
+ require_once('openvpn.inc');
+ }
+ log_error("OpenVPN: Resync server {$client['description']}");
+ openvpn_resync('client', $client);
+ }
+ }
+ unset($client);
+ }
+ } else if (substr($interface, 0, 4) == "lagg") {
+ interfaces_lagg_configure($interface);
+ } else if (substr($interface, 0, 6) == "bridge") {
+ interfaces_bridge_configure(0, $interface);
+ }
+}
+
+function interface_vlan_mtu_configured($realhwif, $mtu) {
+ global $config;
+
+ if (is_array($config['vlans']) && is_array($config['vlans']['vlan'])) {
+ foreach ($config['vlans']['vlan'] as $vlan) {
+ if ($vlan['if'] != $realhwif) {
+ continue;
+ }
+ $assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
+ if (!empty($assignedport) && !empty($config['interfaces'][$assignedport]['mtu'])) {
+ if (intval($config['interfaces'][$assignedport]['mtu']) > $mtu) {
+ $mtu = $config['interfaces'][$assignedport]['mtu'];
+ }
+ }
+ }
+ }
+
+ return $mtu;
+}
+
+function interface_vlan_adapt_mtu($vlanifs, $mtu) {
+ global $config;
+
+ if (!is_array($vlanifs)) {
+ return;
+ }
+
+ /* All vlans need to use the same mtu value as their parent. */
+ foreach ($vlanifs as $vlan) {
+ $assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
+ if (!empty($assignedport)) {
+ if (!empty($config['interfaces'][$assignedport]['mtu'])) {
+ pfSense_interface_mtu($vlan['vlanif'], $config['interfaces'][$assignedport]['mtu']);
+ } else {
+ if (get_interface_mtu($vlan['vlanif']) != $mtu) {
+ pfSense_interface_mtu($vlan['vlanif'], $mtu);
+ }
+ }
+ } else if (get_interface_mtu($vlan['vlanif']) != $mtu) {
+ pfSense_interface_mtu($vlan['vlanif'], $mtu);
+ }
+ }
+}
+
+function interface_configure($interface = "wan", $reloadall = false, $linkupevent = false) {
+ global $config, $g;
+ global $interface_sn_arr_cache, $interface_ip_arr_cache;
+ global $interface_snv6_arr_cache, $interface_ipv6_arr_cache;
+
+ $wancfg = $config['interfaces'][$interface];
+
+ if (!isset($wancfg['enable'])) {
+ return;
+ }
+
+ $realif = get_real_interface($interface);
+ $realhwif_array = get_parent_interface($interface);
+ // Need code to handle MLPPP if we ever use $realhwif for MLPPP handling
+ $realhwif = $realhwif_array[0];
+
+ if (!platform_booting() && !(substr($realif, 0, 4) == "ovpn")) {
+ /* remove all IPv4 and IPv6 addresses */
+ $tmpifaces = pfSense_getall_interface_addresses($realif);
+ if (is_array($tmpifaces)) {
+ foreach ($tmpifaces as $tmpiface) {
+ if (is_ipaddrv6($tmpiface) || is_subnetv6($tmpiface)) {
+ if (!is_linklocal($tmpiface)) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 {$tmpiface} delete");
+ }
+ } else {
+ if (is_subnetv4($tmpiface)) {
+ $tmpip = explode('/', $tmpiface);
+ $tmpip = $tmpip[0];
+ } else {
+ $tmpip = $tmpiface;
+ }
+ pfSense_interface_deladdress($realif, $tmpip);
+ }
+ }
+ }
+
+ /* only bring down the interface when both v4 and v6 are set to NONE */
+ if (empty($wancfg['ipaddr']) && empty($wancfg['ipaddrv6'])) {
+ interface_bring_down($interface);
+ }
+ }
+
+ $interface_to_check = $realif;
+ if (interface_isppp_type($interface)) {
+ $interface_to_check = $realhwif;
+ }
+
+ /* Need to check that the interface exists or not in the case where its coming back from disabled state see #3270 */
+ if (!platform_booting() && (in_array(substr($realif, 0, 3), array("gre", "gif")) || !does_interface_exist($interface_to_check))) {
+ interface_virtual_create($interface_to_check);
+ }
+
+ /* Disable Accepting router advertisements unless specifically requested */
+ if ($g['debug']) {
+ log_error("Deny router advertisements for interface {$interface}");
+ }
+ mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 -accept_rtadv", true);
+
+ /* wireless configuration? */
+ if (is_array($wancfg['wireless'])) {
+ interface_wireless_configure($realif, $wancfg, $wancfg['wireless']);
+ }
+
+ $mac = get_interface_mac($realhwif);
+ /*
+ * Don't try to reapply the spoofed MAC if it's already applied.
+ * When ifconfig link is used, it cycles the interface down/up, which triggers
+ * the interface config again, which attempts to spoof the MAC again,
+ * which cycles the link again...
+ */
+ if ($wancfg['spoofmac'] && ($wancfg['spoofmac'] != $mac)) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($realhwif) .
+ " link " . escapeshellarg($wancfg['spoofmac']));
+ } else {
+
+ if ($mac == "ff:ff:ff:ff:ff:ff") {
+ /* this is not a valid mac address. generate a
+ * temporary mac address so the machine can get online.
+ */
+ echo gettext("Generating new MAC address.");
+ $random_mac = generate_random_mac_address();
+ mwexec("/sbin/ifconfig " . escapeshellarg($realhwif) .
+ " link " . escapeshellarg($random_mac));
+ $wancfg['spoofmac'] = $random_mac;
+ write_config();
+ file_notice("MAC Address altered", sprintf(gettext('The INVALID MAC address (ff:ff:ff:ff:ff:ff) on interface %1$s has been automatically replaced with %2$s'), $realif, $random_mac), "Interfaces");
+ }
+ }
+
+ /* media */
+ if ($wancfg['media'] || $wancfg['mediaopt']) {
+ $cmd = "/sbin/ifconfig " . escapeshellarg($realhwif);
+ if ($wancfg['media']) {
+ $cmd .= " media " . escapeshellarg($wancfg['media']);
+ }
+ if ($wancfg['mediaopt']) {
+ $cmd .= " mediaopt " . escapeshellarg($wancfg['mediaopt']);
+ }
+ mwexec($cmd);
+ }
+
+ /* Apply hw offloading policies as configured */
+ enable_hardware_offloading($interface);
+
+ /* invalidate interface/ip/sn cache */
+ get_interface_arr(true);
+ unset($interface_ip_arr_cache[$realif]);
+ unset($interface_sn_arr_cache[$realif]);
+ unset($interface_ipv6_arr_cache[$realif]);
+ unset($interface_snv6_arr_cache[$realif]);
+
+ $tunnelif = substr($realif, 0, 3);
+
+ if (does_interface_exist($wancfg['if'])) {
+ interfaces_bring_up($wancfg['if']);
+ }
+
+ if (!empty($wancfg['mtu'])) {
+ if (stristr($realif, "_vlan")) {
+ $assignedparent = convert_real_interface_to_friendly_interface_name($realhwif);
+ if (!empty($assignedparent) && !empty($config['interfaces'][$assignedparent]['mtu'])) {
+ $parentmtu = $config['interfaces'][$assignedparent]['mtu'];
+ if ($wancfg['mtu'] > $parentmtu) {
+ log_error("There is a conflict on MTU between parent {$realhwif} and VLAN({$realif})");
+ }
+ } else {
+ $parentmtu = 0;
+ }
+
+ $parentmtu = interface_vlan_mtu_configured($realhwif, $parentmtu);
+
+ if (get_interface_mtu($realhwif) != $parentmtu) {
+ pfSense_interface_mtu($realhwif, $parentmtu);
+ }
+
+ /* All vlans need to use the same mtu value as their parent. */
+ interface_vlan_adapt_mtu(link_interface_to_vlans($realhwif), $parentmtu);
+ } else if (substr($realif, 0, 4) == 'lagg') {
+ /* LAGG interface must be destroyed and re-created to change MTU */
+ if ($wancfg['mtu'] != get_interface_mtu($realif)) {
+ if (isset($config['laggs']['lagg']) && is_array($config['laggs']['lagg'])) {
+ foreach ($config['laggs']['lagg'] as $lagg) {
+ if ($lagg['laggif'] == $realif) {
+ interface_lagg_configure($lagg);
+ break;
+ }
+ }
+ }
+ }
+ } else {
+ if ($wancfg['mtu'] != get_interface_mtu($realif)) {
+ pfSense_interface_mtu($realif, $wancfg['mtu']);
+ }
+
+ /* This case is needed when the parent of vlans is being configured */
+ $vlans = link_interface_to_vlans($realif);
+ if (is_array($vlans)) {
+ interface_vlan_adapt_mtu($vlans, $wancfg['mtu']);
+ }
+ unset($vlans);
+ }
+ /* XXX: What about gre/gif/.. ? */
+ }
+
+ switch ($wancfg['ipaddr']) {
+ case 'dhcp':
+ interface_dhcp_configure($interface);
+ break;
+ case 'pppoe':
+ case 'l2tp':
+ case 'pptp':
+ case 'ppp':
+ interface_ppps_configure($interface);
+ break;
+ default:
+ /* XXX: Kludge for now related to #3280 */
+ if (!in_array($tunnelif, array("gif", "gre", "ovp"))) {
+ if (is_ipaddrv4($wancfg['ipaddr']) && $wancfg['subnet'] <> "") {
+ pfSense_interface_setaddress($realif, "{$wancfg['ipaddr']}/{$wancfg['subnet']}");
+ }
+ }
+ break;
+ }
+
+ switch ($wancfg['ipaddrv6']) {
+ case 'slaac':
+ case 'dhcp6':
+ interface_dhcpv6_configure($interface, $wancfg);
+ break;
+ case '6rd':
+ interface_6rd_configure($interface, $wancfg);
+ break;
+ case '6to4':
+ interface_6to4_configure($interface, $wancfg);
+ break;
+ case 'track6':
+ interface_track6_configure($interface, $wancfg, $linkupevent);
+ break;
+ default:
+ /* XXX: Kludge for now related to #3280 */
+ if (!in_array($tunnelif, array("gif", "gre", "ovp"))) {
+ if (is_ipaddrv6($wancfg['ipaddrv6']) && $wancfg['subnetv6'] <> "") {
+ //pfSense_interface_setaddress($realif, "{$wancfg['ipaddrv6']}/{$wancfg['subnetv6']}");
+ // FIXME: Add IPv6 Support to the pfSense module
+ mwexec("/sbin/ifconfig " . escapeshellarg($realif) . " inet6 {$wancfg['ipaddrv6']} prefixlen " . escapeshellarg($wancfg['subnetv6']));
+ }
+ }
+ break;
+ }
+
+ interface_netgraph_needed($interface);
+
+ if (!platform_booting()) {
+ link_interface_to_vips($interface, "update");
+
+ if ($tunnelif != 'gre') {
+ unset($gre);
+ $gre = link_interface_to_gre($interface);
+ if (!empty($gre)) {
+ array_walk($gre, 'interface_gre_configure');
+ }
+ }
+
+ if ($tunnelif != 'gif') {
+ unset($gif);
+ $gif = link_interface_to_gif ($interface);
+ if (!empty($gif)) {
+ array_walk($gif, 'interface_gif_configure');
+ }
+ }
+
+ if ($linkupevent == false || substr($realif, 0, 4) == "ovpn") {
+ unset($bridgetmp);
+ $bridgetmp = link_interface_to_bridge($interface);
+ if (!empty($bridgetmp)) {
+ interface_bridge_add_member($bridgetmp, $realif);
+ }
+ }
+
+ $grouptmp = link_interface_to_group($interface);
+ if (!empty($grouptmp)) {
+ array_walk($grouptmp, 'interface_group_add_member');
+ }
+
+ if ($interface == "lan") {
+ /* make new hosts file */
+ system_hosts_generate();
+ }
+
+ if ($reloadall == true) {
+
+ /* reconfigure static routes (kernel may have deleted them) */
+ system_routing_configure($interface);
+
+ /* reload ipsec tunnels */
+ send_event("service reload ipsecdns");
+
+ /* restart dnsmasq or unbound */
+ if (isset($config['dnsmasq']['enable'])) {
+ services_dnsmasq_configure();
+ } elseif (isset($config['unbound']['enable'])) {
+ services_unbound_configure();
+ }
+
+ /* update dyndns */
+ send_event("service reload dyndns {$interface}");
+
+ /* reload captive portal */
+ if (!function_exists('captiveportal_init_rules_byinterface')) {
+ require_once('captiveportal.inc');
+ }
+ captiveportal_init_rules_byinterface($interface);
+ }
+ }
+
+ interfaces_staticarp_configure($interface);
+ return 0;
+}
+
+function interface_track6_configure($interface = "lan", $wancfg, $linkupevent = false) {
+ global $config, $g;
+
+ if (!is_array($wancfg)) {
+ return;
+ }
+
+ if (!isset($wancfg['enable'])) {
+ return;
+ }
+
+ /* If the interface is not configured via another, exit */
+ if (empty($wancfg['track6-interface'])) {
+ return;
+ }
+
+ /* always configure a link-local of fe80::1:1 on the track6 interfaces */
+ $realif = get_real_interface($interface);
+ $linklocal = find_interface_ipv6_ll($realif);
+ if (!empty($linklocal)) {
+ mwexec("/sbin/ifconfig {$realif} inet6 {$linklocal} delete");
+ }
+ /* XXX: This might break for good on a carp installation using link-local as network ips */
+ /* XXX: Probably should remove? */
+ mwexec("/sbin/ifconfig {$realif} inet6 fe80::1:1%{$realif}");
+
+ $trackcfg = $config['interfaces'][$wancfg['track6-interface']];
+ if (!isset($trackcfg['enable'])) {
+ log_error("Interface {$interface} tracking non-existant interface {$wancfg['track6-interface']}");
+ return;
+ }
+
+ switch ($trackcfg['ipaddrv6']) {
+ case "6to4":
+ if ($g['debug']) {
+ log_error("Interface {$interface} configured via {$wancfg['track6-interface']} type {$type}");
+ }
+ interface_track6_6to4_configure($interface, $wancfg);
+ break;
+ case "6rd":
+ if ($g['debug']) {
+ log_error("Interface {$interface} configured via {$wancfg['track6-interface']} type {$type}");
+ }
+ interface_track6_6rd_configure($interface, $wancfg);
+ break;
+ case "dhcp6":
+ if ($linkupevent == true) {
+ /*
+ * NOTE: Usually come here from rc.linkup calling so just call directly instead of generating event
+ * Instead of disrupting all other v4 configuration just restart DHCPv6 client for now
+ *
+ * XXX: Probably DHCPv6 client should handle this automagically itself?
+ */
+ $parentrealif = get_real_interface($wancfg['track6-interface']);
+ $pidv6 = find_dhcp6c_process($parentrealif);
+ if ($pidv6) {
+ posix_kill($pidv6, SIGHUP);
+ }
+ }
+ break;
+ }
+
+ if ($linkupevent == false) {
+ if (!function_exists('services_dhcpd_configure')) {
+ require_once("services.inc");
+ }
+
+ if (isset($config['unbound']['enable'])) {
+ services_unbound_configure();
+ }
+
+ services_dhcpd_configure("inet6");
+ }
+
+ return 0;
+}
+
+function interface_track6_6rd_configure($interface = "lan", $lancfg) {
+ global $config, $g;
+ global $interface_ipv6_arr_cache;
+ global $interface_snv6_arr_cache;
+
+ if (!is_array($lancfg)) {
+ return;
+ }
+
+ /* If the interface is not configured via another, exit */
+ if (empty($lancfg['track6-interface'])) {
+ return;
+ }
+
+ $wancfg = $config['interfaces'][$lancfg['track6-interface']];
+ if (empty($wancfg)) {
+ log_error("Interface {$interface} tracking non-existant interface {$lancfg['track6-interface']}");
+ return;
+ }
+
+ $ip4address = get_interface_ip($lancfg['track6-interface']);
+ if (!is_ipaddrv4($ip4address)) { /* XXX: This should not be needed by 6rd || (is_private_ip($ip4address))) { */
+ log_error("The interface IPv4 '{$ip4address}' address on interface '{$lancfg['track6-interface']}' is not valid, not configuring 6RD tunnel");
+ return;
+ }
+ $hexwanv4 = return_hex_ipv4($ip4address);
+
+ /* create the long prefix notation for math, save the prefix length */
+ $rd6prefix = explode("/", $wancfg['prefix-6rd']);
+ $rd6prefixlen = $rd6prefix[1];
+ $rd6prefix = Net_IPv6::uncompress($rd6prefix[0]);
+
+ /* binary presentation of the prefix for all 128 bits. */
+ $rd6lanbin = convert_ipv6_to_128bit($rd6prefix);
+
+ /* just save the left prefix length bits */
+ $rd6lanbin = substr($rd6lanbin, 0, $rd6prefixlen);
+ /* add the v4 address, offset n bits from the left */
+ $rd6lanbin .= substr(sprintf("%032b", hexdec($hexwanv4)), (0 + $wancfg['prefix-6rd-v4plen']), 32);
+
+ /* add the custom prefix id, max 32bits long? (64 bits - (prefixlen + (32 - v4plen)) */
+ /* 64 - (37 + (32 - 17)) = 8 == /52 */
+ $restbits = 64 - ($rd6prefixlen + (32 - $wancfg['prefix-6rd-v4plen']));
+ // echo "64 - (prefixlen {$rd6prefixlen} + v4len (32 - {$wancfg['prefix-6rd-v4plen']})) = {$restbits} \n";
+ $rd6lanbin .= substr(sprintf("%032b", str_pad($lancfg['track6-prefix-id'], 32, "0", STR_PAD_LEFT)), (32 - $restbits), 32);
+ /* fill the rest out with zeros */
+ $rd6lanbin = str_pad($rd6lanbin, 128, "0", STR_PAD_RIGHT);
+
+ /* convert the 128 bits for the lan address back into a valid IPv6 address */
+ $rd6lan = convert_128bit_to_ipv6($rd6lanbin) ."1";
+
+ $lanif = get_real_interface($interface);
+ $oip = find_interface_ipv6($lanif);
+ if (is_ipaddrv6($oip)) {
+ mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
+ }
+ unset($interface_ipv6_arr_cache[$lanif]);
+ unset($interface_snv6_arr_cache[$lanif]);
+ log_error("rd6 {$interface} with ipv6 address {$rd6lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
+ mwexec("/sbin/ifconfig {$lanif} inet6 {$rd6lan} prefixlen 64");
+
+ return 0;
+}
+
+function interface_track6_6to4_configure($interface = "lan", $lancfg) {
+ global $config, $g;
+ global $interface_ipv6_arr_cache;
+ global $interface_snv6_arr_cache;
+
+ if (!is_array($lancfg)) {
+ return;
+ }
+
+ /* If the interface is not configured via another, exit */
+ if (empty($lancfg['track6-interface'])) {
+ return;
+ }
+
+ $wancfg = $config['interfaces'][$lancfg['track6-interface']];
+ if (empty($wancfg)) {
+ log_error("Interface {$interface} tracking non-existant interface {$lancfg['track6-interface']}");
+ return;
+ }
+
+ $ip4address = get_interface_ip($lancfg['track6-interface']);
+ if (!is_ipaddrv4($ip4address) || is_private_ip($ip4address)) {
+ log_error("The interface IPv4 '{$ip4address}' address on interface '{$lancfg['track6-interface']}' is not public, not configuring 6RD tunnel");
+ return;
+ }
+ $hexwanv4 = return_hex_ipv4($ip4address);
+
+ /* create the long prefix notation for math, save the prefix length */
+ $sixto4prefix = "2002::";
+ $sixto4prefixlen = 16;
+ $sixto4prefix = Net_IPv6::uncompress($sixto4prefix);
+
+ /* binary presentation of the prefix for all 128 bits. */
+ $sixto4lanbin = convert_ipv6_to_128bit($sixto4prefix);
+
+ /* just save the left prefix length bits */
+ $sixto4lanbin = substr($sixto4lanbin, 0, $sixto4prefixlen);
+ /* add the v4 address */
+ $sixto4lanbin .= sprintf("%032b", hexdec($hexwanv4));
+ /* add the custom prefix id */
+ $sixto4lanbin .= sprintf("%016b", $lancfg['track6-prefix-id']);
+ /* fill the rest out with zeros */
+ $sixto4lanbin = str_pad($sixto4lanbin, 128, "0", STR_PAD_RIGHT);
+
+ /* convert the 128 bits for the lan address back into a valid IPv6 address */
+ $sixto4lan = convert_128bit_to_ipv6($sixto4lanbin) ."1";
+
+ $lanif = get_real_interface($interface);
+ $oip = find_interface_ipv6($lanif);
+ if (is_ipaddrv6($oip)) {
+ mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete");
+ }
+ unset($interface_ipv6_arr_cache[$lanif]);
+ unset($interface_snv6_arr_cache[$lanif]);
+ log_error("sixto4 {$interface} with ipv6 address {$sixto4lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}");
+ mwexec("/sbin/ifconfig {$lanif} inet6 {$sixto4lan} prefixlen 64");
+
+ return 0;
+}
+
+function interface_6rd_configure($interface = "wan", $wancfg) {
+ global $config, $g;
+
+ /* because this is a tunnel interface we can only function
+ * with a public IPv4 address on the interface */
+
+ if (!is_array($wancfg)) {
+ return;
+ }
+
+ if (!is_module_loaded('if_stf.ko')) {
+ mwexec('/sbin/kldload if_stf.ko');
+ }
+
+ $wanif = get_real_interface($interface);
+ $ip4address = find_interface_ip($wanif);
+ if (!is_ipaddrv4($ip4address)) {
+ log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel");
+ return false;
+ }
+ $hexwanv4 = return_hex_ipv4($ip4address);
+
+ if (!is_numeric($wancfg['prefix-6rd-v4plen'])) {
+ $wancfg['prefix-6rd-v4plen'] = 0;
+ }
+
+ /* create the long prefix notation for math, save the prefix length */
+ $rd6prefix = explode("/", $wancfg['prefix-6rd']);
+ $rd6prefixlen = $rd6prefix[1];
+ $brgw = explode('.', $wancfg['gateway-6rd']);
+ $rd6brgw = substr(Net_IPv6::_ip2Bin($rd6prefix[0]), 0, $rd6prefixlen);
+ $rd6brgw .= str_pad(decbin($brgw[0]), 8, '0', STR_PAD_LEFT) . str_pad(decbin($brgw[1]), 8, '0', STR_PAD_LEFT) . str_pad(decbin($brgw[2]), 8, '0', STR_PAD_LEFT) . str_pad(decbin($brgw[3]), 8, '0', STR_PAD_LEFT);
+ if (strlen($rd6brgw) < 128) {
+ $rd6brgw = str_pad($rd6brgw, 128, '0', STR_PAD_RIGHT);
+ }
+ $rd6brgw = Net_IPv6::compress(Net_IPv6::_bin2Ip($rd6brgw));
+ unset($brgw);
+ $rd6prefix = Net_IPv6::uncompress($rd6prefix[0]);
+
+ /* binary presentation of the prefix for all 128 bits. */
+ $rd6prefixbin = convert_ipv6_to_128bit($rd6prefix);
+
+ /* just save the left prefix length bits */
+ $rd6prefixbin = substr($rd6prefixbin, 0, $rd6prefixlen);
+ /* if the prefix length is not 32 bits we need to shave bits off from the left of the v4 address. */
+ $rd6prefixbin .= substr(sprintf("%032b", hexdec($hexwanv4)), $wancfg['prefix-6rd-v4plen'], 32);
+ /* fill out the rest with 0's */
+ $rd6prefixbin = str_pad($rd6prefixbin, 128, "0", STR_PAD_RIGHT);
+
+ /* convert the 128 bits for the broker address back into a valid IPv6 address */
+ $rd6prefix = convert_128bit_to_ipv6($rd6prefixbin);
+
+
+ /* XXX: need to extend to support variable prefix size for v4 */
+ if (!is_module_loaded("if_stf")) {
+ mwexec("/sbin/kldload if_stf.ko");
+ }
+ $stfiface = "{$interface}_stf";
+ if (does_interface_exist($stfiface)) {
+ pfSense_interface_destroy($stfiface);
+ }
+ $tmpstfiface = pfSense_interface_create("stf");
+ pfSense_interface_rename($tmpstfiface, $stfiface);
+ pfSense_interface_flags($stfiface, IFF_LINK2);
+ mwexec("/sbin/ifconfig {$stfiface} inet6 {$rd6prefix}/{$rd6prefixlen}");
+ mwexec("/sbin/ifconfig {$stfiface} stfv4br " . escapeshellarg($wancfg['gateway-6rd']));
+ if ($wancfg['prefix-6rd-v4plen'] >= 0 && $wancfg['prefix-6rd-v4plen'] <= 32) {
+ mwexec("/sbin/ifconfig {$stfiface} stfv4net {$ip4address}/" . escapeshellarg($wancfg['prefix-6rd-v4plen']));
+ }
+ if ($g['debug']) {
+ log_error("Created 6rd interface {$stfiface} {$rd6prefix}/{$rd6prefixlen}");
+ }
+
+ /* write out a default router file */
+ file_put_contents("{$g['tmp_path']}/{$wanif}_routerv6", "{$rd6brgw}\n");
+ file_put_contents("{$g['tmp_path']}/{$wanif}_defaultgwv6", "{$rd6brgw}\n");
+
+ $ip4gateway = get_interface_gateway($interface);
+ if (is_ipaddrv4($ip4gateway)) {
+ mwexec("/sbin/route change -host " . escapeshellarg($wancfg['gateway-6rd']) . " {$ip4gateway}");
+ }
+
+ /* configure dependent interfaces */
+ if (!platform_booting()) {
+ link_interface_to_track6($interface, "update");
+ }
+
+ return 0;
+}
+
+function interface_6to4_configure($interface = "wan", $wancfg) {
+ global $config, $g;
+
+ /* because this is a tunnel interface we can only function
+ * with a public IPv4 address on the interface */
+
+ if (!is_array($wancfg)) {
+ return;
+ }
+
+ $wanif = get_real_interface($interface);
+ $ip4address = find_interface_ip($wanif);
+ if ((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) {
+ log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel");
+ return false;
+ }
+
+ /* create the long prefix notation for math, save the prefix length */
+ $stfprefixlen = 16;
+ $stfprefix = Net_IPv6::uncompress("2002::");
+ $stfarr = explode(":", $stfprefix);
+ $v4prefixlen = "0";
+
+ /* we need the hex form of the interface IPv4 address */
+ $ip4arr = explode(".", $ip4address);
+ $hexwanv4 = "";
+ foreach ($ip4arr as $octet) {
+ $hexwanv4 .= sprintf("%02x", $octet);
+ }
+
+ /* we need the hex form of the broker IPv4 address */
+ $ip4arr = explode(".", "192.88.99.1");
+ $hexbrv4 = "";
+ foreach ($ip4arr as $octet) {
+ $hexbrv4 .= sprintf("%02x", $octet);
+ }
+
+ /* binary presentation of the prefix for all 128 bits. */
+ $stfprefixbin = "";
+ foreach ($stfarr as $element) {
+ $stfprefixbin .= sprintf("%016b", hexdec($element));
+ }
+ /* just save the left prefix length bits */
+ $stfprefixstartbin = substr($stfprefixbin, 0, $stfprefixlen);
+
+ /* if the prefix length is not 32 bits we need to shave bits off from the left of the v4 address. */
+ $stfbrokerbin = substr(sprintf("%032b", hexdec($hexbrv4)), $v4prefixlen, 32);
+ $stfbrokerbin = str_pad($stfprefixstartbin . $stfbrokerbin, 128, "0", STR_PAD_RIGHT);
+
+ /* for the local subnet too. */
+ $stflanbin = substr(sprintf("%032b", hexdec($hexwanv4)), $v4prefixlen, 32);
+ $stflanbin = str_pad($stfprefixstartbin . $stflanbin, 128, "0", STR_PAD_RIGHT);
+
+ /* convert the 128 bits for the broker address back into a valid IPv6 address */
+ $stfbrarr = array();
+ $stfbrbinarr = array();
+ $stfbrbinarr = str_split($stfbrokerbin, 16);
+ foreach ($stfbrbinarr as $bin) {
+ $stfbrarr[] = dechex(bindec($bin));
+ }
+ $stfbrgw = Net_IPv6::compress(implode(":", $stfbrarr));
+
+ /* convert the 128 bits for the broker address back into a valid IPv6 address */
+ $stflanarr = array();
+ $stflanbinarr = array();
+ $stflanbinarr = str_split($stflanbin, 16);
+ foreach ($stflanbinarr as $bin) {
+ $stflanarr[] = dechex(bindec($bin));
+ }
+ $stflanpr = Net_IPv6::compress(implode(":", $stflanarr));
+ $stflanarr[7] = 1;
+ $stflan = Net_IPv6::compress(implode(":", $stflanarr));
+
+ /* setup the stf interface */
+ if (!is_module_loaded("if_stf")) {
+ mwexec("/sbin/kldload if_stf.ko");
+ }
+ $stfiface = "{$interface}_stf";
+ if (does_interface_exist($stfiface)) {
+ pfSense_interface_destroy($stfiface);
+ }
+ $tmpstfiface = pfSense_interface_create("stf");
+ pfSense_interface_rename($tmpstfiface, $stfiface);
+ pfSense_interface_flags($stfiface, IFF_LINK2);
+ mwexec("/sbin/ifconfig {$stfiface} inet6 {$stflanpr} prefixlen 16");
+
+ if ($g['debug']) {
+ log_error("Set IPv6 address inet6 {$stflanpr} prefixlen 16 for {$stfiface}, route {$stfbrgw}");
+ }
+
+ /* write out a default router file */
+ file_put_contents("{$g['tmp_path']}/{$wanif}_routerv6", "{$stfbrgw}");
+ file_put_contents("{$g['tmp_path']}/{$wanif}_defaultgwv6", "{$stfbrgw}");
+
+ $ip4gateway = get_interface_gateway($interface);
+ if (is_ipaddrv4($ip4gateway)) {
+ mwexec("/sbin/route change -host 192.88.99.1 {$ip4gateway}");
+ }
+
+ if (!platform_booting()) {
+ link_interface_to_track6($interface, "update");
+ }
+
+ return 0;
+}
+
+function interface_dhcpv6_configure($interface = "wan", $wancfg) {
+ global $config, $g;
+
+ if (!is_array($wancfg)) {
+ return;
+ }
+
+ $wanif = get_real_interface($interface, "inet6");
+ $dhcp6cconf = "";
+
+ if ($wancfg['adv_dhcp6_config_file_override']) {
+ // DHCP6 Config File Override
+ $dhcp6cconf = DHCP6_Config_File_Override($wancfg, $wanif);
+ } elseif ($wancfg['adv_dhcp6_config_advanced']) {
+ // DHCP6 Config File Advanced
+ $dhcp6cconf = DHCP6_Config_File_Advanced($interface, $wancfg, $wanif);
+ } else {
+ // DHCP6 Config File Basic
+ $dhcp6cconf .= "interface {$wanif} {\n";
+
+ /* for SLAAC interfaces we do fire off a dhcp6 client for just our name servers */
+ if ($wancfg['ipaddrv6'] == "slaac") {
+ $dhcp6cconf .= "\tinformation-only;\n";
+ $dhcp6cconf .= "\trequest domain-name-servers;\n";
+ $dhcp6cconf .= "\trequest domain-name;\n";
+ $dhcp6cconf .= "\tscript \"{$g['varetc_path']}/dhcp6c_{$interface}_script.sh\"; # we'd like some nameservers please\n";
+ $dhcp6cconf .= "};\n";
+ } else {
+ $trackiflist = array();
+ $iflist = link_interface_to_track6($interface);
+ foreach ($iflist as $ifname => $ifcfg) {
+ if (is_numeric($ifcfg['track6-prefix-id'])) {
+ $trackiflist[$ifname] = $ifcfg;
+ }
+ }
+
+ /* skip address request if this is set */
+ if (!isset($wancfg['dhcp6prefixonly'])) {
+ $dhcp6cconf .= "\tsend ia-na 0;\t# request stateful address\n";
+ }
+ if (is_numeric($wancfg['dhcp6-ia-pd-len']) && !empty($trackiflist)) {
+ $dhcp6cconf .= "\tsend ia-pd 0;\t# request prefix delegation\n";
+ }
+
+ $dhcp6cconf .= "\trequest domain-name-servers;\n";
+ $dhcp6cconf .= "\trequest domain-name;\n";
+ $dhcp6cconf .= "\tscript \"{$g['varetc_path']}/dhcp6c_{$interface}_script.sh\"; # we'd like some nameservers please\n";
+ $dhcp6cconf .= "};\n";
+
+ if (!isset($wancfg['dhcp6prefixonly'])) {
+ $dhcp6cconf .= "id-assoc na 0 { };\n";
+ }
+
+ if (is_numeric($wancfg['dhcp6-ia-pd-len']) && !empty($trackiflist)) {
+ /* Setup the prefix delegation */
+ $dhcp6cconf .= "id-assoc pd 0 {\n";
+ $preflen = 64 - $wancfg['dhcp6-ia-pd-len'];
+ if (isset($wancfg['dhcp6-ia-pd-send-hint'])) {
+ $dhcp6cconf .= "\tprefix ::/{$preflen} infinity;\n";
+ }
+ foreach ($trackiflist as $friendly => $ifcfg) {
+ if ($g['debug']) {
+ log_error("setting up $ifdescr - {$ifcfg['track6-prefix-id']}");
+ }
+ $realif = get_real_interface($friendly);
+ $dhcp6cconf .= "\tprefix-interface {$realif} {\n";
+ $dhcp6cconf .= "\t\tsla-id {$ifcfg['track6-prefix-id']};\n";
+ $dhcp6cconf .= "\t\tsla-len {$wancfg['dhcp6-ia-pd-len']};\n";
+ $dhcp6cconf .= "\t};\n";
+ }
+ unset($preflen, $iflist, $ifcfg, $ifname);
+ $dhcp6cconf .= "};\n";
+ }
+ unset($trackiflist);
+ }
+ }
+
+ /* wide-dhcp6c works for now. */
+ if (!@file_put_contents("{$g['varetc_path']}/dhcp6c_{$interface}.conf", $dhcp6cconf)) {
+ printf("Error: cannot open dhcp6c_{$interface}.conf in interface_dhcpv6_configure() for writing.\n");
+ unset($dhcp6cconf);
+ return 1;
+ }
+ unset($dhcp6cconf);
+
+ $dhcp6cscript = "#!/bin/sh\n";
+ $dhcp6cscript .= "# This shell script launches /etc/rc.newwanipv6 with a interface argument.\n";
+ $dhcp6cscript .= "dmips=\${new_domain_name_servers}\n";
+ $dhcp6cscript .= "dmnames=\${new_domain_name}\n";
+ $dhcp6cscript .= "/usr/local/sbin/fcgicli -f /etc/rc.newwanipv6 -d \"interface={$wanif}&dmnames=\${dmnames}&dmips=\${dmips}\"\n";
+ /* Add wide-dhcp6c shell script here. Because we can not pass a argument to it. */
+ if (!@file_put_contents("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", $dhcp6cscript)) {
+ printf("Error: cannot open dhcp6c_{$interface}_script.sh in interface_dhcpv6_configure() for writing.\n");
+ unset($dhcp6cscript);
+ return 1;
+ }
+ unset($dhcp6cscript);
+ @chmod("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", 0755);
+
+ $rtsoldscript = "#!/bin/sh\n";
+ $rtsoldscript .= "# This shell script launches dhcp6c and configured gateways for this interface.\n";
+ $rtsoldscript .= "echo $2 > {$g['tmp_path']}/{$wanif}_routerv6\n";
+ $rtsoldscript .= "echo $2 > {$g['tmp_path']}/{$wanif}_defaultgwv6\n";
+ $rtsoldscript .= "/usr/bin/logger -t rtsold \"Recieved RA specifying route \$2 for interface {$interface}({$wanif})\"\n";
+ $rtsoldscript .= "if [ -f {$g['varrun_path']}/dhcp6c_{$wanif}.pid ]; then\n";
+ $rtsoldscript .= "\t/bin/pkill -F {$g['varrun_path']}/dhcp6c_{$wanif}.pid\n";
+ $rtsoldscript .= "\t/bin/sleep 1\n";
+ $rtsoldscript .= "fi\n";
+ $rtsoldscript .= "/usr/local/sbin/dhcp6c -d -c {$g['varetc_path']}/dhcp6c_{$interface}.conf -p {$g['varrun_path']}/dhcp6c_{$wanif}.pid {$wanif}\n";
+ $rtsoldscript .= "/usr/bin/logger -t rtsold \"Starting dhcp6 client for interface {$interface}({$wanif})\"\n";
+ /* Add wide-dhcp6c shell script here. Because we can not pass a argument to it. */
+ if (!@file_put_contents("{$g['varetc_path']}/rtsold_{$wanif}_script.sh", $rtsoldscript)) {
+ printf("Error: cannot open rtsold_{$interface}_script.sh in interface_dhcpv6_configure() for writing.\n");
+ unset($rtsoldscript);
+ return 1;
+ }
+ unset($rtsoldscript);
+ @chmod("{$g['varetc_path']}/rtsold_{$wanif}_script.sh", 0755);
+
+ /* accept router advertisements for this interface */
+ set_single_sysctl("net.inet6.ip6.accept_rtadv", "1");
+ log_error("Accept router advertisements on interface {$wanif} ");
+ mwexec("/sbin/ifconfig {$wanif} inet6 accept_rtadv");
+
+ /* fire up rtsold for IPv6 RAs first, this backgrounds immediately. It will call dhcp6c */
+ if (isvalidpid("{$g['varrun_path']}/rtsold_{$wanif}.pid")) {
+ killbypid("{$g['varrun_path']}/rtsold_{$wanif}.pid");
+ sleep(2);
+ }
+ mwexec("/usr/sbin/rtsold -1 -p {$g['varrun_path']}/rtsold_{$wanif}.pid -O {$g['varetc_path']}/rtsold_{$wanif}_script.sh {$wanif}");
+
+ /* NOTE: will be called from rtsold invoked script
+ * link_interface_to_track6($interface, "update");
+ */
+
+ return 0;
+}
+
+function DHCP6_Config_File_Advanced($interface, $wancfg, $wanif) {
+ global $g;
+
+ $send_options = "";
+ if ($wancfg['adv_dhcp6_interface_statement_send_options'] != '') {
+ $options = explode(',', $wancfg['adv_dhcp6_interface_statement_send_options']);
+ foreach ($options as $option) {
+ $send_options .= "\tsend " . trim($option) . ";\n";
+ }
+ }
+
+ $request_options = "";
+ if ($wancfg['adv_dhcp6_interface_statement_request_options'] != '') {
+ $options = explode(',', $wancfg['adv_dhcp6_interface_statement_request_options']);
+ foreach ($options as $option) {
+ $request_options .= "\trequest " . trim($option) . ";\n";
+ }
+ }
+
+ $information_only = "";
+ if ($wancfg['adv_dhcp6_interface_statement_information_only_enable'] != '') {
+ $information_only = "\tinformation-only;\n";
+ }
+
+ $script = "\tscript \"{$g['varetc_path']}/dhcp6c_{$interface}_script.sh\";\n";
+ if ($wancfg['adv_dhcp6_interface_statement_script'] != '') {
+ $script = "\tscript \"{$wancfg['adv_dhcp6_interface_statement_script']}\";\n";
+ }
+
+ $interface_statement = "interface";
+ $interface_statement .= " {$wanif}";
+ $interface_statement .= " {\n";
+ $interface_statement .= "$send_options";
+ $interface_statement .= "$request_options";
+ $interface_statement .= "$information_only";
+ $interface_statement .= "$script";
+ $interface_statement .= "};\n";
+
+ $id_assoc_statement_address = "";
+ if ($wancfg['adv_dhcp6_id_assoc_statement_address_enable'] != '') {
+ $id_assoc_statement_address .= "id-assoc";
+ $id_assoc_statement_address .= " na";
+ if (is_numeric($wancfg['adv_dhcp6_id_assoc_statement_address_id'])) {
+ $id_assoc_statement_address .= " {$wancfg['adv_dhcp6_id_assoc_statement_address_id']}";
+ }
+ $id_assoc_statement_address .= " { ";
+
+ if (($wancfg['adv_dhcp6_id_assoc_statement_address'] != '') &&
+ (is_numeric($wancfg['adv_dhcp6_id_assoc_statement_address_pltime']) ||
+ ($wancfg['adv_dhcp6_id_assoc_statement_address_pltime'] == 'infinity'))) {
+ $id_assoc_statement_address .= "\n\taddress";
+ $id_assoc_statement_address .= " {$wancfg['adv_dhcp6_id_assoc_statement_address']}";
+ $id_assoc_statement_address .= " {$wancfg['adv_dhcp6_id_assoc_statement_address_pltime']}";
+ if ((is_numeric($wancfg['adv_dhcp6_id_assoc_statement_address_vltime'])) ||
+ ($wancfg['adv_dhcp6_id_assoc_statement_address_vltime'] == 'infinity')) {
+ $id_assoc_statement_address .= " {$wancfg['adv_dhcp6_id_assoc_statement_address_vltime']}";
+ }
+ $id_assoc_statement_address .= ";\n";
+ }
+
+ $id_assoc_statement_address .= "};\n";
+ }
+
+ $id_assoc_statement_prefix = "";
+ if ($wancfg['adv_dhcp6_id_assoc_statement_prefix_enable'] != '') {
+ $id_assoc_statement_prefix .= "id-assoc";
+ $id_assoc_statement_prefix .= " pd";
+ if (is_numeric($wancfg['adv_dhcp6_id_assoc_statement_prefix_id'])) {
+ $id_assoc_statement_prefix .= " {$wancfg['adv_dhcp6_id_assoc_statement_prefix_id']}";
+ }
+ $id_assoc_statement_prefix .= " { ";
+
+ if (($wancfg['adv_dhcp6_id_assoc_statement_prefix'] != '') &&
+ (is_numeric($wancfg['adv_dhcp6_id_assoc_statement_prefix_pltime']) ||
+ ($wancfg['adv_dhcp6_id_assoc_statement_prefix_pltime'] == 'infinity'))) {
+ $id_assoc_statement_prefix .= "\n\tprefix";
+ $id_assoc_statement_prefix .= " {$wancfg['adv_dhcp6_id_assoc_statement_prefix']}";
+ $id_assoc_statement_prefix .= " {$wancfg['adv_dhcp6_id_assoc_statement_prefix_pltime']}";
+ if ((is_numeric($wancfg['adv_dhcp6_id_assoc_statement_prefix_vltime'])) ||
+ ($wancfg['adv_dhcp6_id_assoc_statement_prefix_vltime'] == 'infinity')) {
+ $id_assoc_statement_prefix .= " {$wancfg['adv_dhcp6_id_assoc_statement_prefix_vltime']}";
+ }
+ $id_assoc_statement_prefix .= ";";
+ }
+
+ if (is_numeric($wancfg['adv_dhcp6_prefix_interface_statement_sla_id'])) {
+ $id_assoc_statement_prefix .= "\n\tprefix-interface";
+ $id_assoc_statement_prefix .= " {$wanif}";
+ $id_assoc_statement_prefix .= " {\n";
+ $id_assoc_statement_prefix .= "\t\tsla-id {$wancfg['adv_dhcp6_prefix_interface_statement_sla_id']};\n";
+ if (($wancfg['adv_dhcp6_prefix_interface_statement_sla_len'] >= 0) &&
+ ($wancfg['adv_dhcp6_prefix_interface_statement_sla_len'] <= 128)) {
+ $id_assoc_statement_prefix .= "\t\tsla-len {$wancfg['adv_dhcp6_prefix_interface_statement_sla_len']};\n";
+ }
+ $id_assoc_statement_prefix .= "\t};";
+ }
+
+ if (($wancfg['adv_dhcp6_id_assoc_statement_prefix'] != '') ||
+ (is_numeric($wancfg['adv_dhcp6_prefix_interface_statement_sla_id']))) {
+ $id_assoc_statement_prefix .= "\n";
+ }
+
+ $id_assoc_statement_prefix .= "};\n";
+ }
+
+ $authentication_statement = "";
+ if (($wancfg['adv_dhcp6_authentication_statement_authname'] != '') &&
+ ($wancfg['adv_dhcp6_authentication_statement_protocol'] == 'delayed')) {
+ $authentication_statement .= "authentication";
+ $authentication_statement .= " {$wancfg['adv_dhcp6_authentication_statement_authname']}";
+ $authentication_statement .= " {\n";
+ $authentication_statement .= "\tprotocol {$wancfg['adv_dhcp6_authentication_statement_protocol']};\n";
+ if (preg_match("/(hmac(-)?md5)||(HMAC(-)?MD5)/", $wancfg['adv_dhcp6_authentication_statement_algorithm'])) {
+ $authentication_statement .= "\talgorithm {$wancfg['adv_dhcp6_authentication_statement_algorithm']};\n";
+ }
+ if ($wancfg['adv_dhcp6_authentication_statement_rdm'] == 'monocounter') {
+ $authentication_statement .= "\trdm {$wancfg['adv_dhcp6_authentication_statement_rdm']};\n";
+ }
+ $authentication_statement .= "};\n";
+ }
+
+ $key_info_statement = "";
+ if (($wancfg['adv_dhcp6_key_info_statement_keyname'] != '') &&
+ ($wancfg['adv_dhcp6_key_info_statement_realm'] != '') &&
+ (is_numeric($wancfg['adv_dhcp6_key_info_statement_keyid'])) &&
+ ($wancfg['adv_dhcp6_key_info_statement_secret'] != '')) {
+ $key_info_statement .= "keyinfo";
+ $key_info_statement .= " {$wancfg['adv_dhcp6_key_info_statement_keyname']}";
+ $key_info_statement .= " {\n";
+ $key_info_statement .= "\trealm \"{$wancfg['adv_dhcp6_key_info_statement_realm']}\";\n";
+ $key_info_statement .= "\tkeyid {$wancfg['adv_dhcp6_key_info_statement_keyid']};\n";
+ $key_info_statement .= "\tsecret \"{$wancfg['adv_dhcp6_key_info_statement_secret']}\";\n";
+ if (preg_match("/((([0-9]{4}-)?[0-9]{2}[0-9]{2} )?[0-9]{2}:[0-9]{2})||(foreever)/", $wancfg['adv_dhcp6_key_info_statement_expire'])) {
+ $key_info_statement .= "\texpire \"{$wancfg['adv_dhcp6_key_info_statement_expire']}\";\n";
+ }
+ $key_info_statement .= "};\n";
+ }
+
+ $dhcp6cconf = $interface_statement;
+ $dhcp6cconf .= $id_assoc_statement_address;
+ $dhcp6cconf .= $id_assoc_statement_prefix;
+ $dhcp6cconf .= $authentication_statement;
+ $dhcp6cconf .= $key_info_statement;
+
+ $dhcp6cconf = DHCP6_Config_File_Substitutions($wancfg, $wanif, $dhcp6cconf);
+
+ return $dhcp6cconf;
+}
+
+
+function DHCP6_Config_File_Override($wancfg, $wanif) {
+
+ $dhcp6cconf = @file_get_contents($wancfg['adv_dhcp6_config_file_override_path']);
+
+ if ($dhcp6cconf === false) {
+ log_error("Error: cannot open {$wancfg['adv_dhcp6_config_file_override_path']} in DHCP6_Config_File_Override() for reading.\n");
+ return '';
+ } else {
+ return DHCP6_Config_File_Substitutions($wancfg, $wanif, $dhcp6cconf);;
+ }
+}
+
+
+function DHCP6_Config_File_Substitutions($wancfg, $wanif, $dhcp6cconf) {
+
+ $dhcp6cconf = DHCP_Config_File_Substitutions($wancfg, $wanif, $dhcp6cconf);
+
+ return $dhcp6cconf;
+}
+
+
+function interface_dhcp_configure($interface = "wan") {
+ global $config, $g;
+
+ $wancfg = $config['interfaces'][$interface];
+ $wanif = $wancfg['if'];
+ if (empty($wancfg)) {
+ $wancfg = array();
+ }
+
+ /* generate dhclient_wan.conf */
+ $fd = fopen("{$g['varetc_path']}/dhclient_{$interface}.conf", "w");
+ if (!$fd) {
+ printf(printf(gettext("Error: cannot open dhclient_%s.conf in interface_dhcp_configure() for writing.%s"), $interface, "\n"));
+ return 1;
+ }
+
+ if ($wancfg['dhcphostname']) {
+ $dhclientconf_hostname = "send dhcp-client-identifier \"{$wancfg['dhcphostname']}\";\n";
+ $dhclientconf_hostname .= "\tsend host-name \"{$wancfg['dhcphostname']}\";\n";
+ } else {
+ $dhclientconf_hostname = "";
+ }
+
+ $wanif = get_real_interface($interface);
+ if (empty($wanif)) {
+ log_error(sprintf(gettext("Invalid interface \"%s\" in interface_dhcp_configure()"), $interface));
+ return 0;
+ }
+ $dhclientconf = "";
+
+ $dhclientconf .= <<<EOD
+interface "{$wanif}" {
+timeout 60;
+retry 15;
+select-timeout 0;
+initial-interval 1;
+ {$dhclientconf_hostname}
+ script "/sbin/dhclient-script";
+EOD;
+
+ if (is_ipaddrv4($wancfg['dhcprejectfrom'])) {
+ $dhclientconf .= <<<EOD
+
+ reject {$wancfg['dhcprejectfrom']};
+EOD;
+ }
+ $dhclientconf .= <<<EOD
+
+}
+
+EOD;
+
+ // DHCP Config File Advanced
+ if ($wancfg['adv_dhcp_config_advanced']) {
+ $dhclientconf = DHCP_Config_File_Advanced($interface, $wancfg, $wanif);
+ }
+
+ if (is_ipaddr($wancfg['alias-address'])) {
+ $subnetmask = gen_subnet_mask($wancfg['alias-subnet']);
+ $dhclientconf .= <<<EOD
+alias {
+ interface "{$wanif}";
+ fixed-address {$wancfg['alias-address']};
+ option subnet-mask {$subnetmask};
+}
+
+EOD;
+ }
+
+ // DHCP Config File Override
+ if ($wancfg['adv_dhcp_config_file_override']) {
+ $dhclientconf = DHCP_Config_File_Override($wancfg, $wanif);
+ }
+
+ fwrite($fd, $dhclientconf);
+ fclose($fd);
+
+ /* bring wan interface up before starting dhclient */
+ if ($wanif) {
+ interfaces_bring_up($wanif);
+ } else {
+ log_error(printf(gettext("Could not bring up %s interface in interface_dhcp_configure()"), $wanif));
+ }
+
+ /* Make sure dhclient is not running */
+ kill_dhclient_process($wanif);
+
+ /* fire up dhclient */
+ mwexec("/sbin/dhclient -c {$g['varetc_path']}/dhclient_{$interface}.conf {$wanif} > {$g['tmp_path']}/{$wanif}_output 2> {$g['tmp_path']}/{$wanif}_error_output");
+
+ return 0;
+}
+
+function DHCP_Config_File_Advanced($interface, $wancfg, $wanif) {
+
+ $hostname = "";
+ if ($wancfg['dhcphostname'] != '') {
+ $hostname = "\tsend host-name \"{$wancfg['dhcphostname']}\";\n";
+ }
+
+ /* DHCP Protocol Timings */
+ $protocol_timings = array ('adv_dhcp_pt_timeout' => "timeout", 'adv_dhcp_pt_retry' => "retry", 'adv_dhcp_pt_select_timeout' => "select-timeout", 'adv_dhcp_pt_reboot' => "reboot", 'adv_dhcp_pt_backoff_cutoff' => "backoff-cutoff", 'adv_dhcp_pt_initial_interval' => "initial-interval");
+ foreach ($protocol_timings as $Protocol_Timing => $PT_Name) {
+ $pt_variable = "{$Protocol_Timing}";
+ ${$pt_variable} = "";
+ if ($wancfg[$Protocol_Timing] != "") {
+ ${$pt_variable} = "{$PT_Name} {$wancfg[$Protocol_Timing]};\n";
+ }
+ }
+
+ $send_options = "";
+ if ($wancfg['adv_dhcp_send_options'] != '') {
+ $options = explode(',', $wancfg['adv_dhcp_send_options']);
+ foreach ($options as $option) {
+ $send_options .= "\tsend " . trim($option) . ";\n";
+ }
+ }
+
+ $request_options = "";
+ if ($wancfg['adv_dhcp_request_options'] != '') {
+ $request_options = "\trequest {$wancfg['adv_dhcp_request_options']};\n";
+ }
+
+ $required_options = "";
+ if ($wancfg['adv_dhcp_required_options'] != '') {
+ $required_options = "\trequire {$wancfg['adv_dhcp_required_options']};\n";
+ }
+
+ $option_modifiers = "";
+ if ($wancfg['adv_dhcp_option_modifiers'] != '') {
+ $modifiers = explode(',', $wancfg['adv_dhcp_option_modifiers']);
+ foreach ($modifiers as $modifier) {
+ $option_modifiers .= "\t" . trim($modifier) . ";\n";
+ }
+ }
+
+ $dhclientconf = "interface \"{$wanif}\" {\n";
+ $dhclientconf .= "\n";
+ $dhclientconf .= "# DHCP Protocol Timing Values\n";
+ $dhclientconf .= "{$adv_dhcp_pt_timeout}";
+ $dhclientconf .= "{$adv_dhcp_pt_retry}";
+ $dhclientconf .= "{$adv_dhcp_pt_select_timeout}";
+ $dhclientconf .= "{$adv_dhcp_pt_reboot}";
+ $dhclientconf .= "{$adv_dhcp_pt_backoff_cutoff}";
+ $dhclientconf .= "{$adv_dhcp_pt_initial_interval}";
+ $dhclientconf .= "\n";
+ $dhclientconf .= "# DHCP Protocol Options\n";
+ $dhclientconf .= "{$hostname}";
+ $dhclientconf .= "{$send_options}";
+ $dhclientconf .= "{$request_options}";
+ $dhclientconf .= "{$required_options}";
+ $dhclientconf .= "{$option_modifiers}";
+ $dhclientconf .= "\n";
+ $dhclientconf .= "\tscript \"/sbin/dhclient-script\";\n";
+ $dhclientconf .= "}\n";
+
+ $dhclientconf = DHCP_Config_File_Substitutions($wancfg, $wanif, $dhclientconf);
+
+ return $dhclientconf;
+}
+
+
+function DHCP_Config_File_Override($wancfg, $wanif) {
+
+ $dhclientconf = @file_get_contents($wancfg['adv_dhcp_config_file_override_path']);
+
+ if ($dhclientconf === false) {
+ log_error("Error: cannot open {$wancfg['adv_dhcp_config_file_override_path']} in DHCP_Config_File_Override() for reading.\n");
+ return '';
+ } else {
+ return DHCP_Config_File_Substitutions($wancfg, $wanif, $dhclientconf);
+ }
+}
+
+
+function DHCP_Config_File_Substitutions($wancfg, $wanif, $dhclientconf) {
+
+ /* Apply Interface Substitutions */
+ $dhclientconf = str_replace("{interface}", "{$wanif}", $dhclientconf);
+
+ /* Apply Hostname Substitutions */
+ $dhclientconf = str_replace("{hostname}", $wancfg['dhcphostname'], $dhclientconf);
+
+ /* Arrays of MAC Address Types, Cases, Delimiters */
+ /* ASCII or HEX, Upper or Lower Case, Various Delimiters (none, space, colon, hyphen, period) */
+ $various_mac_types = array("mac_addr_ascii", "mac_addr_hex");
+ $various_mac_cases = array("U", "L");
+ $various_mac_delimiters = array("", " ", ":", "-", ".");
+
+ /* Apply MAC Address Substitutions */
+ foreach ($various_mac_types as $various_mac_type) {
+ foreach ($various_mac_cases as $various_mac_case) {
+ foreach ($various_mac_delimiters as $various_mac_delimiter) {
+
+ $res = stripos($dhclientconf, $various_mac_type . $various_mac_case . $various_mac_delimiter);
+ if ($res !== false) {
+
+ /* Get MAC Address as ASCII String With Colon (:) delimiters */
+ if ("$various_mac_case" == "U") {
+ $dhcpclientconf_mac = strtoupper(get_interface_mac($wanif));
+ }
+ if ("$various_mac_case" == "L") {
+ $dhcpclientconf_mac = strtolower(get_interface_mac($wanif));
+ }
+
+ if ("$various_mac_type" == "mac_addr_hex") {
+ /* Convert MAC ascii string to HEX with colon (:) delimiters. */
+ $dhcpclientconf_mac = str_replace(":", "", $dhcpclientconf_mac);
+ $dhcpclientconf_mac_hex = "";
+ $delimiter = "";
+ for ($i = 0; $i < strlen($dhcpclientconf_mac); $i++) {
+ $dhcpclientconf_mac_hex .= $delimiter. bin2hex($dhcpclientconf_mac[$i]);
+ $delimiter = ":";
+ }
+ $dhcpclientconf_mac = $dhcpclientconf_mac_hex;
+ }
+
+ /* MAC Address Delimiter Substitutions */
+ $dhcpclientconf_mac = str_replace(":", $various_mac_delimiter, $dhcpclientconf_mac);
+
+ /* Apply MAC Address Substitutions */
+ $dhclientconf = str_replace("{" . $various_mac_type . $various_mac_case . $various_mac_delimiter . "}", $dhcpclientconf_mac, $dhclientconf);
+ }
+ }
+ }
+ }
+
+ return $dhclientconf;
+}
+
+function interfaces_group_setup() {
+ global $config;
+
+ if (!is_array($config['ifgroups']['ifgroupentry'])) {
+ return;
+ }
+
+ foreach ($config['ifgroups']['ifgroupentry'] as $groupar) {
+ interface_group_setup($groupar);
+ }
+
+ return;
+}
+
+function interface_group_setup(&$groupname /* The parameter is an array */) {
+ global $config;
+
+ if (!is_array($groupname)) {
+ return;
+ }
+ $members = explode(" ", $groupname['members']);
+ foreach ($members as $ifs) {
+ $realif = get_real_interface($ifs);
+ if ($realif && does_interface_exist($realif)) {
+ mwexec("/sbin/ifconfig {$realif} group {$groupname['ifname']}");
+ }
+ }
+
+ return;
+}
+
+function is_interface_group($if) {
+ global $config;
+
+ if (is_array($config['ifgroups']['ifgroupentry'])) {
+ foreach ($config['ifgroups']['ifgroupentry'] as $groupentry) {
+ if ($groupentry['ifname'] === $if) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+function interface_group_add_member($interface, $groupname) {
+ $interface = get_real_interface($interface);
+ if (does_interface_exist($interface)) {
+ mwexec("/sbin/ifconfig {$interface} group " . escapeshellarg($groupname), true);
+ }
+}
+
+/* COMPAT Function */
+function convert_friendly_interface_to_real_interface_name($interface) {
+ return get_real_interface($interface);
+}
+
+/* COMPAT Function */
+function get_real_wan_interface($interface = "wan") {
+ return get_real_interface($interface);
+}
+
+/* COMPAT Function */
+function get_current_wan_address($interface = "wan") {
+ return get_interface_ip($interface);
+}
+
+/*
+ * convert_real_interface_to_friendly_interface_name($interface): convert fxp0 -> wan, etc.
+ */
+function convert_real_interface_to_friendly_interface_name($interface = "wan", $checkparent = false) {
+ global $config;
+
+ if (stripos($interface, "_vip")) {
+ foreach ($config['virtualip']['vip'] as $counter => $vip) {
+ if ($vip['mode'] == "carp") {
+ if ($interface == "{$vip['interface']}_vip{$vip['vhid']}") {
+ return $vip['interface'];
+ }
+ }
+ }
+ }
+
+ /* XXX: For speed reasons reference directly the interface array */
+ $ifdescrs = &$config['interfaces'];
+ //$ifdescrs = get_configured_interface_list(false, true);
+
+ foreach ($ifdescrs as $if => $ifname) {
+ if ($if == $interface || $ifname['if'] == $interface) {
+ return $if;
+ }
+
+ if (get_real_interface($if) == $interface) {
+ return $if;
+ }
+
+ if ($checkparent == false) {
+ continue;
+ }
+
+ $int = get_parent_interface($if, true);
+ if (is_array($int)) {
+ foreach ($int as $iface) {
+ if ($iface == $interface) {
+ return $if;
+ }
+ }
+ }
+ }
+
+ if ($interface == "enc0") {
+ return 'IPsec';
+ }
+}
+
+/* attempt to resolve interface to friendly descr */
+function convert_friendly_interface_to_friendly_descr($interface) {
+ global $config;
+
+ switch ($interface) {
+ case "l2tp":
+ $ifdesc = "L2TP";
+ break;
+ case "pptp":
+ $ifdesc = "PPTP";
+ break;
+ case "pppoe":
+ $ifdesc = "PPPoE";
+ break;
+ case "openvpn":
+ $ifdesc = "OpenVPN";
+ break;
+ case "enc0":
+ case "ipsec":
+ case "IPsec":
+ $ifdesc = "IPsec";
+ break;
+ default:
+ if (isset($config['interfaces'][$interface])) {
+ if (empty($config['interfaces'][$interface]['descr'])) {
+ $ifdesc = strtoupper($interface);
+ } else {
+ $ifdesc = strtoupper($config['interfaces'][$interface]['descr']);
+ }
+ break;
+ } else if (substr($interface, 0, 4) == '_vip') {
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $counter => $vip) {
+ if ($vip['mode'] == "carp") {
+ if ($interface == "{$vip['interface']}_vip{$vip['vhid']}") {
+ return "{$vip['subnet']} - {$vip['descr']}";
+ }
+ }
+ }
+ }
+ } else if (substr($interface, 0, 5) == '_lloc') {
+ return get_interface_linklocal($interface);
+ } else {
+ /* if list */
+ $ifdescrs = get_configured_interface_with_descr(false, true);
+ foreach ($ifdescrs as $if => $ifname) {
+ if ($if == $interface || $ifname == $interface) {
+ return $ifname;
+ }
+ }
+ }
+ break;
+ }
+
+ return $ifdesc;
+}
+
+function convert_real_interface_to_friendly_descr($interface) {
+
+ $ifdesc = convert_real_interface_to_friendly_interface_name("{$interface}");
+
+ if (!empty($ifdesc)) {
+ return convert_friendly_interface_to_friendly_descr($ifdesc);
+ }
+
+ return $interface;
+}
+
+/*
+ * get_parent_interface($interface):
+ * --returns the (real or virtual) parent interface(s) array for a given interface friendly name (i.e. wan)
+ * or virtual interface (i.e. vlan)
+ * (We need array because MLPPP and bridge interfaces have more than one parent.)
+ * -- returns $interface passed in if $interface parent is not found
+ * -- returns empty array if an invalid interface is passed
+ * (Only handles ppps and vlans now.)
+ */
+function get_parent_interface($interface, $avoidrecurse = false) {
+ global $config;
+
+ $parents = array();
+ //Check that we got a valid interface passed
+ $realif = get_real_interface($interface);
+ if ($realif == NULL) {
+ return $parents;
+ }
+
+ // If we got a real interface, find it's friendly assigned name
+ if ($interface == $realif && $avoidrecurse == false) {
+ $interface = convert_real_interface_to_friendly_interface_name($interface);
+ }
+
+ if (!empty($interface) && isset($config['interfaces'][$interface])) {
+ $ifcfg = $config['interfaces'][$interface];
+ switch ($ifcfg['ipaddr']) {
+ case "ppp":
+ case "pppoe":
+ case "pptp":
+ case "l2tp":
+ if (empty($parents)) {
+ if (is_array($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as $pppidx => $ppp) {
+ if ($ifcfg['if'] == $ppp['if']) {
+ $ports = explode(',', $ppp['ports']);
+ foreach ($ports as $pid => $parent_if) {
+ $parents[$pid] = get_real_interface($parent_if);
+ }
+ break;
+ }
+ }
+ }
+ }
+ break;
+ case "dhcp":
+ case "static":
+ default:
+ // Handle _vlans
+ if (strpos($realif, '_vlan') !== FALSE) {
+ if (is_array($config['vlans']['vlan'])) {
+ foreach ($config['vlans']['vlan'] as $vlanidx => $vlan) {
+ if ($ifcfg['if'] == $vlan['vlanif']) {
+ $parents[0] = $vlan['if'];
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ if (empty($parents)) {
+ $parents[0] = $realif;
+ }
+
+ return $parents;
+}
+
+function interface_is_wireless_clone($wlif) {
+ if (!stristr($wlif, "_wlan")) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+function interface_get_wireless_base($wlif) {
+ if (!stristr($wlif, "_wlan")) {
+ return $wlif;
+ } else {
+ return substr($wlif, 0, stripos($wlif, "_wlan"));
+ }
+}
+
+function interface_get_wireless_clone($wlif) {
+ if (!stristr($wlif, "_wlan")) {
+ return $wlif . "_wlan0";
+ } else {
+ return $wlif;
+ }
+}
+
+function get_real_interface($interface = "wan", $family = "all", $realv6iface = false, $flush = true) {
+ global $config, $g;
+
+ $wanif = NULL;
+
+ switch ($interface) {
+ case "l2tp":
+ $wanif = "l2tp";
+ break;
+ case "pptp":
+ $wanif = "pptp";
+ break;
+ case "pppoe":
+ $wanif = "pppoe";
+ break;
+ case "openvpn":
+ $wanif = "openvpn";
+ break;
+ case "ipsec":
+ case "enc0":
+ $wanif = "enc0";
+ break;
+ case "ppp":
+ $wanif = "ppp";
+ break;
+ default:
+ if (substr($interface, 0, 4) == '_vip') {
+ $wanif = get_configured_carp_interface_list($interface, '', 'iface');
+ if (!empty($wanif)) {
+ $wanif = get_real_interface($wanif, $family);
+ }
+ break;
+ } else if (substr($interface, 0, 5) == '_lloc') {
+ $interface = substr($interface, 5);
+ } else if (does_interface_exist($interface, $flush)) {
+ /*
+ * If a real interface was already passed simply
+ * pass the real interface back. This encourages
+ * the usage of this function in more cases so that
+ * we can combine logic for more flexibility.
+ */
+ $wanif = $interface;
+ break;
+ }
+
+ if (empty($config['interfaces'][$interface])) {
+ break;
+ }
+
+ $cfg = &$config['interfaces'][$interface];
+
+ if ($family == "inet6") {
+ switch ($cfg['ipaddrv6']) {
+ case "6rd":
+ case "6to4":
+ $wanif = "{$interface}_stf";
+ break;
+ case 'pppoe':
+ case 'ppp':
+ case 'l2tp':
+ case 'pptp':
+ if (is_array($cfg['wireless']) || preg_match($g['wireless_regex'], $cfg['if'])) {
+ $wanif = interface_get_wireless_clone($cfg['if']);
+ } else {
+ $wanif = $cfg['if'];
+ }
+ break;
+ default:
+ switch ($cfg['ipaddr']) {
+ case 'pppoe':
+ case 'ppp':
+ case 'l2tp':
+ case 'pptp':
+ if (isset($cfg['dhcp6usev4iface']) && $realv6iface === false) {
+ $wanif = $cfg['if'];
+ } else {
+ $parents = get_parent_interface($interface);
+ if (!empty($parents[0])) {
+ $wanif = $parents[0];
+ } else {
+ $wanif = $cfg['if'];
+ }
+ }
+ break;
+ default:
+ if (is_array($cfg['wireless']) || preg_match($g['wireless_regex'], $cfg['if'])) {
+ $wanif = interface_get_wireless_clone($cfg['if']);
+ } else {
+ $wanif = $cfg['if'];
+ }
+ break;
+ }
+ break;
+ }
+ } else {
+ // Wireless cloned NIC support (FreeBSD 8+)
+ // interface name format: $parentnic_wlanparentnic#
+ // example: ath0_wlan0
+ if (is_array($cfg['wireless']) || preg_match($g['wireless_regex'], $cfg['if'])) {
+ $wanif = interface_get_wireless_clone($cfg['if']);
+ } else {
+ $wanif = $cfg['if'];
+ }
+ }
+ break;
+ }
+
+ return $wanif;
+}
+
+/* Guess the physical interface by providing a IP address */
+function guess_interface_from_ip($ipaddress) {
+
+ $family = '';
+ if (is_ipaddrv4($ipaddress)) {
+ $family = 'inet';
+ }
+ if (empty($family) && is_ipaddrv6($ipaddress)) {
+ $family = 'inet6';
+ }
+
+ if (empty($family)) {
+ return false;
+ }
+
+ /* create a route table we can search */
+ $output = '';
+ $_gb = exec("/sbin/route -n get -{$family} " . escapeshellarg($ipaddress) . " | /usr/bin/awk '/interface/ { print \$2; };'", $output);
+ $output[0] = trim($output[0], " \n");
+ if (!empty($output[0])) {
+ return $output[0];
+ }
+
+ return false;
+}
+
+/*
+ * find_ip_interface($ip): return the interface where an ip is defined
+ * (or if $bits is specified, where an IP within the subnet is defined)
+ */
+function find_ip_interface($ip, $bits = null) {
+ if (!is_ipaddr($ip)) {
+ return false;
+ }
+
+ $isv6ip = is_ipaddrv6($ip);
+
+ /* if list */
+ $ifdescrs = get_configured_interface_list();
+
+ foreach ($ifdescrs as $ifdescr => $ifname) {
+ $ifip = ($isv6ip) ? get_interface_ipv6($ifname) : get_interface_ip($ifname);
+ if (is_null($ifip)) {
+ continue;
+ }
+ if (is_null($bits)) {
+ if ($ip == $ifip) {
+ $int = get_real_interface($ifname);
+ return $int;
+ }
+ } else {
+ if (ip_in_subnet($ifip, $ip . "/" . $bits)) {
+ $int = get_real_interface($ifname);
+ return $int;
+ }
+ }
+ }
+
+ return false;
+}
+
+/*
+ * find_virtual_ip_alias($ip): return the virtual IP alias where an IP is found
+ * (or if $bits is specified, where an IP within the subnet is found)
+ */
+function find_virtual_ip_alias($ip, $bits = null) {
+ global $config;
+
+ if (!is_array($config['virtualip']['vip'])) {
+ return false;
+ }
+ if (!is_ipaddr($ip)) {
+ return false;
+ }
+
+ $isv6ip = is_ipaddrv6($ip);
+
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['mode'] === "ipalias") {
+ if (is_ipaddrv6($vip['subnet']) != $isv6ip) {
+ continue;
+ }
+ if (is_null($bits)) {
+ if (ip_in_subnet($ip, $vip['subnet'] . "/" . $vip['subnet_bits'])) {
+ return $vip;
+ }
+ } else {
+ if (($isv6ip && check_subnetsv6_overlap($ip, $bits, $vip['subnet'], $vip['subnet_bits'])) ||
+ (!$isv6ip && check_subnets_overlap($ip, $bits, $vip['subnet'], $vip['subnet_bits']))) {
+ return $vip;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+/*
+ * find_number_of_created_carp_interfaces: return the number of carp interfaces
+ */
+function find_number_of_created_carp_interfaces() {
+ return `/sbin/ifconfig | grep "carp:" | wc -l`;
+}
+
+/*
+ * find_carp_interface($ip): return the carp interface where an ip is defined
+ */
+function find_carp_interface($ip) {
+ global $config;
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['mode'] == "carp") {
+ if (is_ipaddrv4($ip)) {
+ $carp_ip = get_interface_ip($vip['interface']);
+ }
+ if (is_ipaddrv6($ip)) {
+ $carp_ip = get_interface_ipv6($vip['interface']);
+ }
+ exec("/sbin/ifconfig", $output, $return);
+ foreach ($output as $line) {
+ $elements = preg_split("/[ ]+/i", $line);
+ if (strstr($elements[0], "vip")) {
+ $curif = str_replace(":", "", $elements[0]);
+ }
+ if (stristr($line, $ip)) {
+ $if = $curif;
+ continue;
+ }
+ }
+
+ if ($if) {
+ return $if;
+ }
+ }
+ }
+ }
+}
+
+function link_carp_interface_to_parent($interface) {
+ global $config;
+
+ if (empty($interface)) {
+ return;
+ }
+
+ $carp_ip = get_interface_ip($interface);
+ $carp_ipv6 = get_interface_ipv6($interface);
+
+ if ((!is_ipaddrv4($carp_ip)) && (!is_ipaddrv6($carp_ipv6))) {
+ return;
+ }
+
+ /* if list */
+ $ifdescrs = get_configured_interface_list();
+ foreach ($ifdescrs as $ifdescr => $ifname) {
+ /* check IPv4 */
+ if (is_ipaddrv4($carp_ip)) {
+ $interfaceip = get_interface_ip($ifname);
+ $subnet_bits = get_interface_subnet($ifname);
+ $subnet_ip = gen_subnet("{$interfaceip}", "{$subnet_bits}");
+ if (ip_in_subnet($carp_ip, "{$subnet_ip}/{$subnet_bits}")) {
+ return $ifname;
+ }
+ }
+ /* Check IPv6 */
+ if (is_ipaddrv6($carp_ipv6)) {
+ $interfaceipv6 = get_interface_ipv6($ifname);
+ $prefixlen = get_interface_subnetv6($ifname);
+ if (ip_in_subnet($carp_ipv6, "{$interfaceipv6}/{$prefixlen}")) {
+ return $ifname;
+ }
+ }
+ }
+ return "";
+}
+
+
+/****f* interfaces/link_ip_to_carp_interface
+ * NAME
+ * link_ip_to_carp_interface - Find where a CARP interface links to.
+ * INPUTS
+ * $ip
+ * RESULT
+ * $carp_ints
+ ******/
+function link_ip_to_carp_interface($ip) {
+ global $config;
+
+ if (!is_ipaddr($ip)) {
+ return;
+ }
+
+ $carp_ints = "";
+ if (is_array($config['virtualip']['vip'])) {
+ $first = 0;
+ $carp_int = array();
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['mode'] == "carp") {
+ $carp_ip = $vip['subnet'];
+ $carp_sn = $vip['subnet_bits'];
+ $carp_nw = gen_subnet($carp_ip, $carp_sn);
+ if (ip_in_subnet($ip, "{$carp_nw}/{$carp_sn}")) {
+ $carp_int[] = get_real_interface($vip['interface']);
+ }
+ }
+ }
+ if (!empty($carp_int)) {
+ $carp_ints = implode(" ", array_unique($carp_int));
+ }
+ }
+
+ return $carp_ints;
+}
+
+function link_interface_to_track6($int, $action = "") {
+ global $config;
+
+ if (empty($int)) {
+ return;
+ }
+
+ if (is_array($config['interfaces'])) {
+ $list = array();
+ foreach ($config['interfaces'] as $ifname => $ifcfg) {
+ if (!isset($ifcfg['enable'])) {
+ continue;
+ }
+ if (!empty($ifcfg['ipaddrv6']) && $ifcfg['track6-interface'] == $int) {
+ if ($action == "update") {
+ interface_track6_configure($ifname, $ifcfg);
+ } else if ($action == "") {
+ $list[$ifname] = $ifcfg;
+ }
+ }
+ }
+ return $list;
+ }
+}
+
+function interface_find_child_cfgmtu($realiface) {
+ global $config;
+
+ $interface = convert_real_interface_to_friendly_interface_name($realiface);
+ $vlans = link_interface_to_vlans($realiface);
+ $bridge = link_interface_to_bridge($realiface);
+ if (!empty($interface)) {
+ $gifs = link_interface_to_gif($interface);
+ $gres = link_interface_to_gre($interface);
+ } else {
+ $gifs = array();
+ $gres = array();
+ }
+
+ $mtu = 0;
+ if (is_array($vlans)) {
+ foreach ($vlans as $vlan) {
+ $ifass = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
+ if (empty($ifass)) {
+ continue;
+ }
+ if (!empty($config['interfaces'][$ifass]['mtu'])) {
+ if (intval($config['interfaces'][$ifass]['mtu']) > $mtu) {
+ $mtu = intval($config['interfaces'][$ifass]['mtu']);
+ }
+ }
+ }
+ }
+ if (is_array($gifs)) {
+ foreach ($gifs as $vlan) {
+ $ifass = convert_real_interface_to_friendly_interface_name($vlan['gifif']);
+ if (empty($ifass)) {
+ continue;
+ }
+ if (!empty($config['interfaces'][$ifass]['mtu'])) {
+ if (intval($config['interfaces'][$ifass]['mtu']) > $mtu) {
+ $mtu = intval($config['interfaces'][$ifass]['mtu']);
+ }
+ }
+ }
+ }
+ if (is_array($gres)) {
+ foreach ($gres as $vlan) {
+ $ifass = convert_real_interface_to_friendly_interface_name($vlan['greif']);
+ if (empty($ifass)) {
+ continue;
+ }
+ if (!empty($config['interfaces'][$ifass]['mtu'])) {
+ if (intval($config['interfaces'][$ifass]['mtu']) > $mtu) {
+ $mtu = intval($config['interfaces'][$ifass]['mtu']);
+ }
+ }
+ }
+ }
+ $ifass = convert_real_interface_to_friendly_interface_name($bridge);
+ if (!empty($ifass) && !empty($config['interfaces'][$ifass]['mtu'])) {
+ if (intval($config['interfaces'][$ifass]['mtu']) > $mtu) {
+ $mtu = intval($config['interfaces'][$ifass]['mtu']);
+ }
+ }
+ unset($vlans, $bridge, $gifs, $gres, $ifass, $vlan);
+
+ return $mtu;
+}
+
+function link_interface_to_vlans($int, $action = "") {
+ global $config;
+
+ if (empty($int)) {
+ return;
+ }
+
+ if (is_array($config['vlans']['vlan'])) {
+ $ifaces = array();
+ foreach ($config['vlans']['vlan'] as $vlan) {
+ if ($int == $vlan['if']) {
+ if ($action == "update") {
+ interfaces_bring_up($int);
+ } else {
+ $ifaces[$vlan['tag']] = $vlan;
+ }
+ }
+ }
+ if (!empty($ifaces)) {
+ return $ifaces;
+ }
+ }
+}
+
+function link_interface_to_vips($int, $action = "", $vhid = '') {
+ global $config;
+
+ if (is_array($config['virtualip']['vip'])) {
+ $result = array();
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($int == $vip['interface']) {
+ if ($action == "update") {
+ interfaces_vips_configure($int);
+ } else {
+ if (empty($vhid) || ($vhid == $vip['vhid'])) {
+ $result[] = $vip;
+ }
+ }
+ }
+ }
+ return $result;
+ }
+}
+
+/****f* interfaces/link_interface_to_bridge
+ * NAME
+ * link_interface_to_bridge - Finds out a bridge group for an interface
+ * INPUTS
+ * $ip
+ * RESULT
+ * bridge[0-99]
+ ******/
+function link_interface_to_bridge($int) {
+ global $config;
+
+ if (is_array($config['bridges']['bridged'])) {
+ foreach ($config['bridges']['bridged'] as $bridge) {
+ if (in_array($int, explode(',', $bridge['members']))) {
+ return "{$bridge['bridgeif']}";
+ }
+ }
+ }
+}
+
+function link_interface_to_group($int) {
+ global $config;
+
+ $result = array();
+
+ if (is_array($config['ifgroups']['ifgroupentry'])) {
+ foreach ($config['ifgroups']['ifgroupentry'] as $group) {
+ if (in_array($int, explode(" ", $group['members']))) {
+ $result[$group['ifname']] = $int;
+ }
+ }
+ }
+
+ return $result;
+}
+
+function link_interface_to_gre($interface) {
+ global $config;
+
+ $result = array();
+
+ if (is_array($config['gres']['gre'])) {
+ foreach ($config['gres']['gre'] as $gre) {
+ if ($gre['if'] == $interface) {
+ $result[] = $gre;
+ }
+ }
+ }
+
+ return $result;
+}
+
+function link_interface_to_gif($interface) {
+ global $config;
+
+ $result = array();
+
+ if (is_array($config['gifs']['gif'])) {
+ foreach ($config['gifs']['gif'] as $gif) {
+ if ($gif['if'] == $interface) {
+ $result[] = $gif;
+ }
+ }
+ }
+
+ return $result;
+}
+
+/*
+ * find_interface_ip($interface): return the interface ip (first found)
+ */
+function find_interface_ip($interface, $flush = false) {
+ global $interface_ip_arr_cache;
+ global $interface_sn_arr_cache;
+
+ $interface = str_replace("\n", "", $interface);
+
+ if (!does_interface_exist($interface)) {
+ return;
+ }
+
+ /* Setup IP cache */
+ if (!isset($interface_ip_arr_cache[$interface]) or $flush) {
+ $ifinfo = pfSense_get_interface_addresses($interface);
+ $interface_ip_arr_cache[$interface] = $ifinfo['ipaddr'];
+ $interface_sn_arr_cache[$interface] = $ifinfo['subnetbits'];
+ }
+
+ return $interface_ip_arr_cache[$interface];
+}
+
+/*
+ * find_interface_ipv6($interface): return the interface ip (first found)
+ */
+function find_interface_ipv6($interface, $flush = false) {
+ global $interface_ipv6_arr_cache;
+ global $interface_snv6_arr_cache;
+ global $config;
+
+ $interface = trim($interface);
+ $interface = get_real_interface($interface);
+
+ if (!does_interface_exist($interface)) {
+ return;
+ }
+
+ /* Setup IP cache */
+ if (!isset($interface_ipv6_arr_cache[$interface]) or $flush) {
+ $ifinfo = pfSense_get_interface_addresses($interface);
+ $interface_ipv6_arr_cache[$interface] = $ifinfo['ipaddr6'];
+ $interface_snv6_arr_cache[$interface] = $ifinfo['subnetbits6'];
+ }
+
+ return $interface_ipv6_arr_cache[$interface];
+}
+
+/*
+ * find_interface_ipv6_ll($interface): return the interface ipv6 link local (first found)
+ */
+function find_interface_ipv6_ll($interface, $flush = false) {
+ global $interface_llv6_arr_cache;
+ global $config;
+
+ $interface = str_replace("\n", "", $interface);
+
+ if (!does_interface_exist($interface)) {
+ return;
+ }
+
+ /* Setup IP cache */
+ if (!isset($interface_llv6_arr_cache[$interface]) or $flush) {
+ $ifinfo = pfSense_getall_interface_addresses($interface);
+ foreach ($ifinfo as $line) {
+ if (strstr($line, ":")) {
+ $parts = explode("/", $line);
+ if (is_linklocal($parts[0])) {
+ $ifinfo['linklocal'] = $parts[0];
+ }
+ }
+ }
+ $interface_llv6_arr_cache[$interface] = $ifinfo['linklocal'];
+ }
+ return $interface_llv6_arr_cache[$interface];
+}
+
+function find_interface_subnet($interface, $flush = false) {
+ global $interface_sn_arr_cache;
+ global $interface_ip_arr_cache;
+
+ $interface = str_replace("\n", "", $interface);
+ if (does_interface_exist($interface) == false) {
+ return;
+ }
+
+ if (!isset($interface_sn_arr_cache[$interface]) or $flush) {
+ $ifinfo = pfSense_get_interface_addresses($interface);
+ $interface_ip_arr_cache[$interface] = $ifinfo['ipaddr'];
+ $interface_sn_arr_cache[$interface] = $ifinfo['subnetbits'];
+ }
+
+ return $interface_sn_arr_cache[$interface];
+}
+
+function find_interface_subnetv6($interface, $flush = false) {
+ global $interface_snv6_arr_cache;
+ global $interface_ipv6_arr_cache;
+
+ $interface = str_replace("\n", "", $interface);
+ if (does_interface_exist($interface) == false) {
+ return;
+ }
+
+ if (!isset($interface_snv6_arr_cache[$interface]) or $flush) {
+ $ifinfo = pfSense_get_interface_addresses($interface);
+ $interface_ipv6_arr_cache[$interface] = $ifinfo['ipaddr6'];
+ $interface_snv6_arr_cache[$interface] = $ifinfo['subnetbits6'];
+ }
+
+ return $interface_snv6_arr_cache[$interface];
+}
+
+function ip_in_interface_alias_subnet($interface, $ipalias) {
+ global $config;
+
+ if (empty($interface) || !is_ipaddr($ipalias)) {
+ return false;
+ }
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $vip) {
+ switch ($vip['mode']) {
+ case "ipalias":
+ if ($vip['interface'] <> $interface) {
+ break;
+ }
+ $subnet = is_ipaddrv6($ipalias) ? gen_subnetv6($vip['subnet'], $vip['subnet_bits']) : gen_subnet($vip['subnet'], $vip['subnet_bits']);
+ if (ip_in_subnet($ipalias, $subnet . "/" . $vip['subnet_bits'])) {
+ return true;
+ }
+ break;
+ }
+ }
+ }
+
+ return false;
+}
+
+function get_possible_listen_ips($include_ipv6_link_local=false) {
+
+ $interfaces = get_configured_interface_with_descr();
+ foreach ($interfaces as $iface => $ifacename) {
+ if ($include_ipv6_link_local) {
+ /* This is to avoid going though added ll below */
+ if (substr($iface, 0, 5) == '_lloc') {
+ continue;
+ }
+ $llip = find_interface_ipv6_ll(get_real_interface($iface));
+ if (!empty($llip)) {
+ $interfaces["_lloc{$iface}"] = "{$ifacename} IPv6 Link-Local";
+ }
+ }
+ }
+ /* XXX: Maybe use array_merge below? */
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip) {
+ $interfaces[$cif] = $carpip . ' (' . get_vip_descr($carpip) . ')';
+ }
+ $aliaslist = get_configured_ip_aliases_list();
+ foreach ($aliaslist as $aliasip => $aliasif) {
+ $interfaces[$aliasip] = $aliasip . ' (' . get_vip_descr($aliasip) . ')';
+ }
+
+ $interfaces['lo0'] = 'Localhost';
+
+ return $interfaces;
+}
+
+function get_possible_traffic_source_addresses($include_ipv6_link_local=false) {
+ global $config;
+
+ $sourceips = get_possible_listen_ips($include_ipv6_link_local);
+ foreach (array('server', 'client') as $mode) {
+ if (is_array($config['openvpn']["openvpn-{$mode}"])) {
+ foreach ($config['openvpn']["openvpn-{$mode}"] as $id => $setting) {
+ if (!isset($setting['disable'])) {
+ $sourceips_key = 'ovpn' . substr($mode, 0, 1) . $setting['vpnid'];
+ $sourceips[$sourceips_key] = gettext("OpenVPN") . " ".$mode.": ".htmlspecialchars($setting['description']);
+ }
+ }
+ }
+ }
+ return $sourceips;
+}
+
+function get_interface_ip($interface = "wan") {
+
+ $realif = get_failover_interface($interface);
+ if (!$realif) {
+ return null;
+ }
+
+ if (substr($realif, 0, 4) == '_vip') {
+ return get_configured_carp_interface_list($realif, 'inet', 'ip');
+ }
+
+ if (strstr($realif, "_vip")) {
+ return get_configured_carp_interface_list($realif);
+ }
+
+ $curip = find_interface_ip($realif);
+ if ($curip && is_ipaddr($curip) && ($curip != "0.0.0.0")) {
+ return $curip;
+ } else {
+ return null;
+ }
+}
+
+function get_interface_ipv6($interface = "wan", $flush = false) {
+ global $config;
+
+ $realif = get_failover_interface($interface, 'inet6');
+ if (!$realif) {
+ return null;
+ }
+
+ if (substr($realif, 0, 4) == '_vip') {
+ return get_configured_carp_interface_list($realif, 'inet6', 'ip');
+ } else if (substr($realif, 0, 5) == '_lloc') {
+ return get_interface_linklocal($interface);
+ }
+
+ if (is_array($config['interfaces'][$interface])) {
+ switch ($config['interfaces'][$interface]['ipaddr']) {
+ case 'pppoe':
+ case 'l2tp':
+ case 'pptp':
+ case 'ppp':
+ if ($config['interfaces'][$interface]['ipaddrv6'] == 'dhcp6') {
+ $realif = get_real_interface($interface, 'inet6', true);
+ }
+ break;
+ }
+ }
+
+ $curip = find_interface_ipv6($realif, $flush);
+ if ($curip && is_ipaddrv6($curip) && ($curip != "::")) {
+ return $curip;
+ } else {
+ /*
+ * NOTE: On the case when only the prefix is requested,
+ * the communication on WAN will be done over link-local.
+ */
+ if (is_array($config['interfaces'][$interface]) && isset($config['interfaces'][$interface]['dhcp6prefixonly'])) {
+ $curip = find_interface_ipv6_ll($realif, $flush);
+ if ($curip && is_ipaddrv6($curip) && ($curip != "::")) {
+ return $curip;
+ }
+ }
+ }
+ return null;
+}
+
+function get_interface_linklocal($interface = "wan") {
+
+ $realif = get_failover_interface($interface, 'inet6');
+ if (!$realif) {
+ return null;
+ }
+
+ if (substr($interface, 0, 4) == '_vip') {
+ $realif = get_real_interface($interface);
+ } else if (substr($interface, 0, 5) == '_lloc') {
+ $realif = get_real_interface(substr($interface, 5));
+ }
+
+ $curip = find_interface_ipv6_ll($realif);
+ if ($curip && is_ipaddrv6($curip) && ($curip != "::")) {
+ return $curip;
+ } else {
+ return null;
+ }
+}
+
+function get_interface_subnet($interface = "wan") {
+
+ if (substr($interface, 0, 4) == '_vip') {
+ return get_configured_carp_interface_list($interface, 'inet', 'subnet');
+ }
+
+ $realif = get_real_interface($interface);
+ if (!$realif) {
+ return null;
+ }
+
+ $cursn = find_interface_subnet($realif);
+ if (!empty($cursn)) {
+ return $cursn;
+ }
+
+ return null;
+}
+
+function get_interface_subnetv6($interface = "wan") {
+
+ if (substr($interface, 0, 4) == '_vip') {
+ return get_configured_carp_interface_list($interface, 'inet6', 'subnet');
+ } else if (substr($interface, 0, 5) == '_lloc') {
+ $interface = substr($interface, 5);
+ }
+
+ $realif = get_real_interface($interface, 'inet6');
+ if (!$realif) {
+ return null;
+ }
+
+ $cursn = find_interface_subnetv6($realif);
+ if (!empty($cursn)) {
+ return $cursn;
+ }
+
+ return null;
+}
+
+/* return outside interfaces with a gateway */
+function get_interfaces_with_gateway() {
+ global $config;
+
+ $ints = array();
+
+ /* loop interfaces, check config for outbound */
+ foreach ($config['interfaces'] as $ifdescr => $ifname) {
+ switch ($ifname['ipaddr']) {
+ case "dhcp":
+ case "pppoe":
+ case "pptp":
+ case "l2tp":
+ case "ppp":
+ $ints[$ifdescr] = $ifdescr;
+ break;
+ default:
+ if (substr($ifname['if'], 0, 4) == "ovpn" ||
+ !empty($ifname['gateway'])) {
+ $ints[$ifdescr] = $ifdescr;
+ }
+ break;
+ }
+ }
+ return $ints;
+}
+
+/* return true if interface has a gateway */
+function interface_has_gateway($friendly) {
+ global $config;
+
+ if (!empty($config['interfaces'][$friendly])) {
+ $ifname = &$config['interfaces'][$friendly];
+ switch ($ifname['ipaddr']) {
+ case "dhcp":
+ case "pppoe":
+ case "pptp":
+ case "l2tp":
+ case "ppp":
+ return true;
+ break;
+ default:
+ if (substr($ifname['if'], 0, 4) == "ovpn") {
+ return true;
+ }
+ $tunnelif = substr($ifname['if'], 0, 3);
+ if ($tunnelif == "gif" || $tunnelif == "gre") {
+ return true;
+ }
+ if (!empty($ifname['gateway'])) {
+ return true;
+ }
+ break;
+ }
+ }
+
+ return false;
+}
+
+/* return true if interface has a gateway */
+function interface_has_gatewayv6($friendly) {
+ global $config;
+
+ if (!empty($config['interfaces'][$friendly])) {
+ $ifname = &$config['interfaces'][$friendly];
+ switch ($ifname['ipaddrv6']) {
+ case "slaac":
+ case "dhcp6":
+ case "6to4":
+ case "6rd":
+ return true;
+ break;
+ default:
+ if (substr($ifname['if'], 0, 4) == "ovpn") {
+ return true;
+ }
+ $tunnelif = substr($ifname['if'], 0, 3);
+ if ($tunnelif == "gif" || $tunnelif == "gre") {
+ return true;
+ }
+ if (!empty($ifname['gatewayv6'])) {
+ return true;
+ }
+ break;
+ }
+ }
+
+ return false;
+}
+
+/****f* interfaces/is_altq_capable
+ * NAME
+ * is_altq_capable - Test if interface is capable of using ALTQ
+ * INPUTS
+ * $int - string containing interface name
+ * RESULT
+ * boolean - true or false
+ ******/
+
+function is_altq_capable($int) {
+ /* Per:
+ * http://www.freebsd.org/cgi/man.cgi?query=altq&apropos=0&sektion=0&manpath=FreeBSD+8.3-RELEASE&arch=default&format=html
+ * Only the following drivers have ALTQ support
+ * 20150328 - removed wireless drivers - ath, awi, bwn, iwi, ipw, ral, rum, run, wi - for now. redmine #4406
+ */
+ $capable = array("ae", "age", "alc", "ale", "an", "aue", "axe", "bce",
+ "bfe", "bge", "bridge", "cas", "dc", "de", "ed", "em", "ep", "epair", "et", "fxp", "gem",
+ "hme", "hn", "igb", "ixgbe", "jme", "le", "lem", "msk", "mxge", "my", "nfe",
+ "nge", "npe", "nve", "re", "rl", "sf", "sge", "sis", "sk",
+ "ste", "stge", "ti", "txp", "udav", "ural", "vge", "vmx", "vr", "vte", "xl",
+ "ndis", "tun", "ovpns", "ovpnc", "vlan", "pppoe", "pptp", "ng",
+ "l2tp", "ppp", "vtnet");
+
+ $int_family = remove_ifindex($int);
+
+ if (in_array($int_family, $capable)) {
+ return true;
+ } else if (stristr($int, "l2tp")) { /* VLANs are named $parent_$vlan now */
+ return true;
+ } else if (stristr($int, "_vlan")) { /* VLANs are named $parent_$vlan now */
+ return true;
+ } else if (stristr($int, "_wlan")) { /* WLANs are named $parent_$wlan now */
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/****f* interfaces/is_interface_wireless
+ * NAME
+ * is_interface_wireless - Returns if an interface is wireless
+ * RESULT
+ * $tmp - Returns if an interface is wireless
+ ******/
+function is_interface_wireless($interface) {
+ global $config, $g;
+
+ $friendly = convert_real_interface_to_friendly_interface_name($interface);
+ if (!isset($config['interfaces'][$friendly]['wireless'])) {
+ if (preg_match($g['wireless_regex'], $interface)) {
+ if (isset($config['interfaces'][$friendly])) {
+ $config['interfaces'][$friendly]['wireless'] = array();
+ }
+ return true;
+ }
+ return false;
+ } else {
+ return true;
+ }
+}
+
+function get_wireless_modes($interface) {
+ /* return wireless modes and channels */
+ $wireless_modes = array();
+
+ $cloned_interface = get_real_interface($interface);
+
+ if ($cloned_interface && is_interface_wireless($cloned_interface)) {
+ $chan_list = "/sbin/ifconfig {$cloned_interface} list chan";
+ $stack_list = "/usr/bin/awk -F\"Channel \" '{ gsub(/\\*/, \" \"); print \$2 \"\\\n\" \$3 }'";
+ $format_list = "/usr/bin/awk '{print \$5 \" \" \$6 \",\" \$1}'";
+
+ $interface_channels = "";
+ exec("$chan_list | $stack_list | sort -u | $format_list 2>&1", $interface_channels);
+ $interface_channel_count = count($interface_channels);
+
+ $c = 0;
+ while ($c < $interface_channel_count) {
+ $channel_line = explode(",", $interface_channels["$c"]);
+ $wireless_mode = trim($channel_line[0]);
+ $wireless_channel = trim($channel_line[1]);
+ if (trim($wireless_mode) != "") {
+ /* if we only have 11g also set 11b channels */
+ if ($wireless_mode == "11g") {
+ if (!isset($wireless_modes["11b"])) {
+ $wireless_modes["11b"] = array();
+ }
+ } else if ($wireless_mode == "11g ht") {
+ if (!isset($wireless_modes["11b"])) {
+ $wireless_modes["11b"] = array();
+ }
+ if (!isset($wireless_modes["11g"])) {
+ $wireless_modes["11g"] = array();
+ }
+ $wireless_mode = "11ng";
+ } else if ($wireless_mode == "11a ht") {
+ if (!isset($wireless_modes["11a"])) {
+ $wireless_modes["11a"] = array();
+ }
+ $wireless_mode = "11na";
+ }
+ $wireless_modes["$wireless_mode"]["$c"] = $wireless_channel;
+ }
+ $c++;
+ }
+ }
+ return($wireless_modes);
+}
+
+/* return channel numbers, frequency, max txpower, and max regulation txpower */
+function get_wireless_channel_info($interface) {
+ $wireless_channels = array();
+
+ $cloned_interface = get_real_interface($interface);
+
+ if ($cloned_interface && is_interface_wireless($cloned_interface)) {
+ $chan_list = "/sbin/ifconfig {$cloned_interface} list txpower";
+ $stack_list = "/usr/bin/awk -F\"Channel \" '{ gsub(/\\*/, \" \"); print \$2 \"\\\n\" \$3 }'";
+ $format_list = "/usr/bin/awk '{print \$1 \",\" \$3 \" \" \$4 \",\" \$5 \",\" \$7}'";
+
+ $interface_channels = "";
+ exec("$chan_list | $stack_list | sort -u | $format_list 2>&1", $interface_channels);
+
+ foreach ($interface_channels as $channel_line) {
+ $channel_line = explode(",", $channel_line);
+ if (!isset($wireless_channels[$channel_line[0]])) {
+ $wireless_channels[$channel_line[0]] = $channel_line;
+ }
+ }
+ }
+ return($wireless_channels);
+}
+
+/****f* interfaces/get_interface_mtu
+ * NAME
+ * get_interface_mtu - Return the mtu of an interface
+ * RESULT
+ * $tmp - Returns the mtu of an interface
+ ******/
+function get_interface_mtu($interface) {
+ $mtu = pfSense_interface_getmtu($interface);
+ return $mtu['mtu'];
+}
+
+function get_interface_mac($interface) {
+
+ $macinfo = pfSense_get_interface_addresses($interface);
+ return $macinfo["macaddr"];
+}
+
+/****f* pfsense-utils/generate_random_mac_address
+ * NAME
+ * generate_random_mac - generates a random mac address
+ * INPUTS
+ * none
+ * RESULT
+ * $mac - a random mac address
+ ******/
+function generate_random_mac_address() {
+ $mac = "02";
+ for ($x = 0; $x < 5; $x++) {
+ $mac .= ":" . dechex(rand(16, 255));
+ }
+ return $mac;
+}
+
+/****f* interfaces/is_jumbo_capable
+ * NAME
+ * is_jumbo_capable - Test if interface is jumbo frame capable. Useful for determining VLAN capability.
+ * INPUTS
+ * $int - string containing interface name
+ * RESULT
+ * boolean - true or false
+ ******/
+function is_jumbo_capable($iface) {
+ $iface = trim($iface);
+ $capable = pfSense_get_interface_addresses($iface);
+
+ if (isset($capable['caps']['vlanmtu'])) {
+ return true;
+ }
+
+ // hack for some lagg modes missing vlanmtu, but work fine w/VLANs
+ if (substr($iface, 0, 4) == "lagg") {
+ return true;
+ }
+
+ return false;
+}
+
+function interface_setup_pppoe_reset_file($pppif, $iface="") {
+ global $g;
+
+ $cron_file = "{$g['varetc_path']}/pppoe_restart_{$pppif}";
+
+ if (!empty($iface) && !empty($pppif)) {
+ $cron_cmd = <<<EOD
+#!/bin/sh
+/usr/local/sbin/pfSctl -c 'interface reload {$iface}'
+/usr/bin/logger -t {$pppif} "PPPoE periodic reset executed on {$iface}"
+
+EOD;
+
+ @file_put_contents($cron_file, $cron_cmd);
+ chmod($cron_file, 0755);
+ sigkillbypid("{$g['varrun_path']}/cron.pid", "HUP");
+ } else {
+ unlink_if_exists($cron_file);
+ }
+}
+
+function get_interface_default_mtu($type = "ethernet") {
+ switch ($type) {
+ case "gre":
+ return 1476;
+ break;
+ case "gif":
+ return 1280;
+ break;
+ case "tun":
+ case "vlan":
+ case "tap":
+ case "ethernet":
+ default:
+ return 1500;
+ break;
+ }
+
+ /* Never reached */
+ return 1500;
+}
+
+function get_vip_descr($ipaddress) {
+ global $config;
+
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['subnet'] == $ipaddress) {
+ return ($vip['descr']);
+ }
+ }
+ return "";
+}
+
+function interfaces_staticarp_configure($if) {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "interfaces_staticarp_configure($if) being called $mt\n";
+ }
+
+ $ifcfg = $config['interfaces'][$if];
+
+ if (empty($if) || empty($ifcfg['if']) || !isset($ifcfg['enable'])) {
+ return 0;
+ }
+
+ /* Enable staticarp, if enabled */
+ if (isset($config['dhcpd'][$if]['staticarp'])) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($ifcfg['if']) . " staticarp ");
+ mwexec("/usr/sbin/arp -d -i " . escapeshellarg($ifcfg['if']) . " -a > /dev/null 2>&1 ");
+ if (is_array($config['dhcpd'][$if]['staticmap'])) {
+ foreach ($config['dhcpd'][$if]['staticmap'] as $arpent) {
+ mwexec("/usr/sbin/arp -s " . escapeshellarg($arpent['ipaddr']) . " " . escapeshellarg($arpent['mac']));
+ }
+ }
+ } else {
+ mwexec("/sbin/ifconfig " . escapeshellarg($ifcfg['if']) . " -staticarp ");
+ mwexec("/usr/sbin/arp -d -i " . escapeshellarg($ifcfg['if']) . " -a > /dev/null 2>&1 ");
+ if (is_array($config['dhcpd'][$if]) && is_array($config['dhcpd'][$if]['staticmap'])) {
+ foreach ($config['dhcpd'][$if]['staticmap'] as $arpent) {
+ if (isset($arpent['arp_table_static_entry'])) {
+ mwexec("/usr/sbin/arp -s " . escapeshellarg($arpent['ipaddr']) . " " . escapeshellarg($arpent['mac']));
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+function get_failover_interface($interface, $family = "all") {
+ global $config;
+
+ /* shortcut to get_real_interface if we find it in the config */
+ if (is_array($config['interfaces'][$interface])) {
+ return get_real_interface($interface, $family);
+ }
+
+ /* compare against gateway groups */
+ $a_groups = return_gateway_groups_array();
+ if (is_array($a_groups[$interface])) {
+ /* we found a gateway group, fetch the interface or vip */
+ if (!empty($a_groups[$interface][0]['vip'])) {
+ return $a_groups[$interface][0]['vip'];
+ } else {
+ return $a_groups[$interface][0]['int'];
+ }
+ }
+ /* fall through to get_real_interface */
+ /* XXX: Really needed? */
+ return get_real_interface($interface, $family);
+}
+
+function remove_ifindex($ifname) {
+ return preg_replace("/[0-9]+$/", "", $ifname);
+}
+
+?>
diff --git a/src/etc/inc/ipsec.attributes.php b/src/etc/inc/ipsec.attributes.php
new file mode 100644
index 0000000..8a8ed5f
--- /dev/null
+++ b/src/etc/inc/ipsec.attributes.php
@@ -0,0 +1,200 @@
+<?php
+/*
+ ipsec.attributes.php
+ Copyright (C) 2011-2012 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+if (empty($common_name)) {
+ $common_name = getenv("common_name");
+ if (empty($common_name)) {
+ $common_name = getenv("username");
+ }
+}
+
+function cisco_to_cidr($addr) {
+ if (!is_ipaddr($addr)) {
+ return 0;
+ }
+ $mask = decbin(~ip2long($addr));
+ $mask = substr($mask, -32);
+ $k = 0;
+ for ($i = 0; $i <= 32; $i++) {
+ $k += intval($mask[$i]);
+ }
+ return $k;
+}
+
+function cisco_extract_index($prule) {
+
+ $index = explode("#", $prule);
+ if (is_numeric($index[1])) {
+ return intval($index[1]);
+ } else {
+ syslog(LOG_WARNING, "Error parsing rule {$prule}: Could not extract index");
+ }
+ return -1;;
+}
+
+function parse_cisco_acl($attribs) {
+ global $attributes;
+ if (!is_array($attribs)) {
+ return "";
+ }
+
+ $devname = "enc0";
+ $finalrules = "";
+ if (is_array($attribs['ciscoavpair'])) {
+ $inrules = array();
+ $outrules = array();
+ foreach ($attribs['ciscoavpair'] as $avrules) {
+ $rule = explode("=", $avrules);
+ $dir = "";
+ if (strstr($rule[0], "inacl")) {
+ $dir = "in";
+ } else if (strstr($rule[0], "outacl")) {
+ $dir = "out";
+ } else if (strstr($rule[0], "dns-servers")) {
+ $attributes['dns-servers'] = explode(" ", $rule[1]);
+ continue;
+ } else if (strstr($rule[0], "route")) {
+ if (!is_array($attributes['routes'])) {
+ $attributes['routes'] = array();
+ }
+ $attributes['routes'][] = $rule[1];
+ continue;
+ }
+ $rindex = cisco_extract_index($rule[0]);
+ if ($rindex < 0) {
+ continue;
+ }
+
+ $rule = $rule[1];
+ $rule = explode(" ", $rule);
+ $tmprule = "";
+ $index = 0;
+ $isblock = false;
+ if ($rule[$index] == "permit") {
+ $tmprule = "pass {$dir} quick on {$devname} ";
+ } else if ($rule[$index] == "deny") {
+ //continue;
+ $isblock = true;
+ $tmprule = "block {$dir} quick on {$devname} ";
+ } else {
+ continue;
+ }
+
+ $index++;
+
+ switch ($rule[$index]) {
+ case "tcp":
+ case "udp":
+ $tmprule .= "proto {$rule[$index]} ";
+ break;
+ }
+
+ $index++;
+ /* Source */
+ if (trim($rule[$index]) == "host") {
+ $index++;
+ $tmprule .= "from {$rule[$index]} ";
+ $index++;
+ if ($isblock == true) {
+ $isblock = false;
+ }
+ } else if (trim($rule[$index]) == "any") {
+ $tmprule .= "from any";
+ $index++;
+ } else {
+ $tmprule .= "from {$rule[$index]}";
+ $index++;
+ $netmask = cisco_to_cidr($rule[$index]);
+ $tmprule .= "/{$netmask} ";
+ $index++;
+ if ($isblock == true) {
+ $isblock = false;
+ }
+ }
+ /* Destination */
+ if (trim($rule[$index]) == "host") {
+ $index++;
+ $tmprule .= "to {$rule[$index]} ";
+ $index++;
+ if ($isblock == true) {
+ $isblock = false;
+ }
+ } else if (trim($rule[$index]) == "any") {
+ $index++;
+ $tmprule .= "to any";
+ } else {
+ $tmprule .= "to {$rule[$index]}";
+ $index++;
+ $netmask = cisco_to_cidr($rule[$index]);
+ $tmprule .= "/{$netmask} ";
+ $index++;
+ if ($isblock == true) {
+ $isblock = false;
+ }
+ }
+
+ if ($isblock == true) {
+ continue;
+ }
+
+ if ($dir == "in") {
+ $inrules[$rindex] = $tmprule;
+ } else if ($dir == "out") {
+ $outrules[$rindex] = $tmprule;
+ }
+ }
+
+
+ $state = "";
+ if (!empty($outrules)) {
+ $state = "no state";
+ }
+ ksort($inrules, SORT_NUMERIC);
+ foreach ($inrules as $inrule) {
+ $finalrules .= "{$inrule} {$state}\n";
+ }
+ if (!empty($outrules)) {
+ ksort($outrules, SORT_NUMERIC);
+ foreach ($outrules as $outrule) {
+ $finalrules .= "{$outrule} {$state}\n";
+ }
+ }
+ }
+ return $finalrules;
+}
+
+$rules = parse_cisco_acl($attributes);
+if (!empty($rules)) {
+ $pid = posix_getpid();
+ @file_put_contents("/tmp/ipsec_{$pid}{$common_name}.rules", $rules);
+ mwexec("/sbin/pfctl -a " . escapeshellarg("ipsec/{$common_name}") . " -f {$g['tmp_path']}/ipsec_{$pid}" . escapeshellarg($common_name) . ".rules");
+ @unlink("{$g['tmp_path']}/ipsec_{$pid}{$common_name}.rules");
+}
+
+?>
diff --git a/src/etc/inc/ipsec.auth-user.php b/src/etc/inc/ipsec.auth-user.php
new file mode 100755
index 0000000..2589598
--- /dev/null
+++ b/src/etc/inc/ipsec.auth-user.php
@@ -0,0 +1,169 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ ipsec.auth-user.php
+
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+/*
+ pfSense_BUILDER_BINARIES:
+ pfSense_MODULE: openvpn
+*/
+/*
+ * ipsec calls this script to authenticate a user
+ * based on a username and password. We lookup these
+ * in our config.xml file and check the credentials.
+ */
+
+require_once("globals.inc");
+require_once("config.inc");
+require_once("radius.inc");
+require_once("auth.inc");
+require_once("interfaces.inc");
+
+/**
+ * Get the NAS-Identifier
+ *
+ * We will use our local hostname to make up the nas_id
+ */
+if (!function_exists("getNasID")) {
+function getNasID() {
+ global $g;
+
+ $nasId = gethostname();
+ if (empty($nasId)) {
+ $nasId = $g['product_name'];
+ }
+ return $nasId;
+}
+}
+
+/**
+ * Get the NAS-IP-Address based on the current wan address
+ *
+ * Use functions in interfaces.inc to find this out
+ *
+ */
+if (!function_exists("getNasIP")) {
+function getNasIP() {
+ $nasIp = get_interface_ip();
+ if (!$nasIp) {
+ $nasIp = "0.0.0.0";
+ }
+ return $nasIp;
+}
+}
+/* setup syslog logging */
+openlog("charon", LOG_ODELAY, LOG_AUTH);
+
+if (isset($_GET['username'])) {
+ $authmodes = explode(",", $_GET['authcfg']);
+ $username = $_GET['username'];
+ $password = $_GET['password'];
+ $common_name = $_GET['cn'];
+} else {
+ /* read data from environment */
+ $username = getenv("username");
+ $password = getenv("password");
+ $common_name = getenv("common_name");
+ $authmodes = explode(",", getenv("authcfg"));
+}
+
+if (!$username || !$password) {
+ syslog(LOG_ERR, "invalid user authentication environment");
+ if (isset($_GET['username'])) {
+ echo "FAILED";
+ closelog();
+ return;
+ } else {
+ closelog();
+ exit (-1);
+ }
+}
+
+$authenticated = false;
+
+if (($strictusercn === true) && ($common_name != $username)) {
+ syslog(LOG_WARNING, "Username does not match certificate common name ({$username} != {$common_name}), access denied.\n");
+ if (isset($_GET['username'])) {
+ echo "FAILED";
+ closelog();
+ return;
+ } else {
+ closelog();
+ exit (1);
+ }
+}
+
+$attributes = array();
+foreach ($authmodes as $authmode) {
+ $authcfg = auth_get_authserver($authmode);
+ if (!$authcfg && $authmode != "local") {
+ continue;
+ }
+
+ $authenticated = authenticate_user($username, $password, $authcfg, $attributes);
+ if ($authenticated == true) {
+ if (stristr($authmode, "local")) {
+ $user = getUserEntry($username);
+ if (!is_array($user) || !userHasPrivilege($user, "user-ipsec-xauth-dialin")) {
+ $authenticated = false;
+ syslog(LOG_WARNING, "user '{$username}' cannot authenticate through IPsec since the required privileges are missing.\n");
+ continue;
+ }
+ }
+ break;
+ }
+}
+
+if ($authenticated == false) {
+ syslog(LOG_WARNING, "user '{$username}' could not authenticate.\n");
+ if (isset($_GET['username'])) {
+ echo "FAILED";
+ closelog();
+ return;
+ } else {
+ closelog();
+ exit (-1);
+ }
+}
+
+if (file_exists("/etc/inc/ipsec.attributes.php")) {
+ include_once("/etc/inc/ipsec.attributes.php");
+}
+
+syslog(LOG_NOTICE, "user '{$username}' authenticated\n");
+closelog();
+
+if (isset($_GET['username'])) {
+ echo "OK";
+} else {
+ exit (0);
+}
+
+?>
diff --git a/src/etc/inc/ipsec.inc b/src/etc/inc/ipsec.inc
new file mode 100644
index 0000000..6654166
--- /dev/null
+++ b/src/etc/inc/ipsec.inc
@@ -0,0 +1,777 @@
+<?php
+/*
+ ipsec.inc
+ Copyright (C) 2007 Scott Ullrich
+ Copyright (C) 2008 Shrew Soft Inc
+ All rights reserved.
+
+ Parts of this code was originally based on vpn_ipsec_sad.php
+ Copyright (C) 2003-2004 Manuel Kasper
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_BUILDER_BINARIES: /sbin/setkey /sbin/route
+ pfSense_MODULE: ipsec
+
+*/
+
+/* IPsec defines */
+global $ipsec_loglevels;
+$ipsec_loglevels = array("dmn" => "Daemon", "mgr" => "SA Manager", "ike" => "IKE SA", "chd" => "IKE Child SA",
+ "job" => "Job Processing", "cfg" => "Configuration backend", "knl" => "Kernel Interface",
+ "net" => "Networking", "asn" => "ASN encoding", "enc" => "Message encoding",
+ "imc" => "Integrity checker", "imv" => "Integrity Verifier", "pts" => "Platform Trust Service",
+ "tls" => "TLS handler", "esp" => "IPsec traffic", "lib" => "StrongSwan Lib");
+
+global $my_identifier_list;
+$my_identifier_list = array(
+ 'myaddress' => array('desc' => gettext('My IP address'), 'mobile' => true),
+ 'address' => array('desc' => gettext('IP address'), 'mobile' => true),
+ 'fqdn' => array('desc' => gettext('Distinguished name'), 'mobile' => true),
+ 'user_fqdn' => array('desc' => gettext('User distinguished name'), 'mobile' => true),
+ 'asn1dn' => array('desc' => gettext('ASN.1 distinguished Name'), 'mobile' => true),
+ 'keyid tag' => array('desc' => gettext('KeyID tag'), 'mobile' => true),
+ 'dyn_dns' => array('desc' => gettext('Dynamic DNS'), 'mobile' => true));
+
+global $peer_identifier_list;
+$peer_identifier_list = array(
+ 'any' => array('desc' => gettext('Any'), 'mobile' => true),
+ 'peeraddress' => array('desc' => gettext('Peer IP address'), 'mobile' => false),
+ 'address' => array('desc' => gettext('IP address'), 'mobile' => false),
+ 'fqdn' => array('desc' => gettext('Distinguished name'), 'mobile' => true),
+ 'user_fqdn' => array('desc' => gettext('User distinguished name'), 'mobile' => true),
+ 'asn1dn' => array('desc' => gettext('ASN.1 distinguished Name'), 'mobile' => true),
+ 'keyid tag' => array('desc' =>gettext('KeyID tag'), 'mobile' => true));
+
+global $ipsec_idhandling;
+$ipsec_idhandling = array(
+ 'yes' => 'YES', 'no' => 'NO', 'never' => 'NEVER', 'keep' => 'KEEP'
+ );
+
+global $p1_ealgos;
+$p1_ealgos = array(
+ 'aes' => array('name' => 'AES', 'keysel' => array('lo' => 128, 'hi' => 256, 'step' => 64)),
+ 'aes128gcm' => array('name' => 'AES128-GCM', 'keysel' => array('lo' => 64, 'hi' => 128, 'step' => 32)),
+ 'aes192gcm' => array('name' => 'AES192-GCM', 'keysel' => array('lo' => 64, 'hi' => 128, 'step' => 32)),
+ 'aes256gcm' => array('name' => 'AES256-GCM', 'keysel' => array('lo' => 64, 'hi' => 128, 'step' => 32)),
+ 'blowfish' => array('name' => 'Blowfish', 'keysel' => array('lo' => 128, 'hi' => 256, 'step' => 64)),
+ '3des' => array('name' => '3DES'),
+ 'cast128' => array('name' => 'CAST128'),
+ 'des' => array('name' => 'DES'));
+
+global $p2_ealgos;
+$p2_ealgos = array(
+ 'aes' => array('name' => 'AES', 'keysel' => array('lo' => 128, 'hi' => 256, 'step' => 64)),
+ 'aes128gcm' => array('name' => 'AES128-GCM', 'keysel' => array('lo' => 64, 'hi' => 128, 'step' => 32)),
+ 'aes192gcm' => array('name' => 'AES192-GCM', 'keysel' => array('lo' => 64, 'hi' => 128, 'step' => 32)),
+ 'aes256gcm' => array('name' => 'AES256-GCM', 'keysel' => array('lo' => 64, 'hi' => 128, 'step' => 32)),
+ 'blowfish' => array('name' => 'Blowfish', 'keysel' => array('lo' => 128, 'hi' => 256, 'step' => 64)),
+ '3des' => array('name' => '3DES'),
+ 'cast128' => array('name' => 'CAST128'),
+ 'des' => array('name' => 'DES'));
+
+global $p1_halgos;
+$p1_halgos = array(
+ 'md5' => 'MD5',
+ 'sha1' => 'SHA1',
+ 'sha256' => 'SHA256',
+ 'sha384' => 'SHA384',
+ 'sha512' => 'SHA512',
+ 'aesxcbc' => 'AES-XCBC'
+);
+
+global $p1_dhgroups;
+$p1_dhgroups = array(
+ 1 => '1 (768 bit)',
+ 2 => '2 (1024 bit)',
+ 5 => '5 (1536 bit)',
+ 14 => '14 (2048 bit)',
+ 15 => '15 (3072 bit)',
+ 16 => '16 (4096 bit)',
+ 17 => '17 (6144 bit)',
+ 18 => '18 (8192 bit)',
+ 19 => '19 (nist ecp256)',
+ 20 => '20 (nist ecp384)',
+ 21 => '21 (nist ecp521)',
+ 22 => '22 (1024(sub 160) bit)',
+ 23 => '23 (2048(sub 224) bit)',
+ 24 => '24 (2048(sub 256) bit)',
+ 28 => '28 (brainpool ecp256)',
+ 29 => '29 (brainpool ecp384)',
+ 30 => '30 (brainpool ecp512)'
+);
+
+global $p2_halgos;
+$p2_halgos = array(
+ 'hmac_md5' => 'MD5',
+ 'hmac_sha1' => 'SHA1',
+ 'hmac_sha256' => 'SHA256',
+ 'hmac_sha384' => 'SHA384',
+ 'hmac_sha512' => 'SHA512',
+ 'aesxcbc' => 'AES-XCBC'
+);
+
+global $p1_authentication_methods;
+$p1_authentication_methods = array(
+ 'hybrid_rsa_server' => array('name' => 'Hybrid RSA + Xauth', 'mobile' => true),
+ 'xauth_rsa_server' => array('name' => 'Mutual RSA + Xauth', 'mobile' => true),
+ 'xauth_psk_server' => array('name' => 'Mutual PSK + Xauth', 'mobile' => true),
+ 'eap-tls' => array('name' => 'EAP-TLS', 'mobile' => true),
+ 'eap-radius' => array('name' => 'EAP-RADIUS', 'mobile' => true),
+ 'eap-mschapv2' => array('name' => 'EAP-MSChapv2', 'mobile' => true),
+ 'rsasig' => array('name' => 'Mutual RSA', 'mobile' => false),
+ 'pre_shared_key' => array('name' => 'Mutual PSK', 'mobile' => false));
+
+global $ipsec_preshared_key_type;
+$ipsec_preshared_key_type = array(
+ 'PSK' => 'PSK',
+ 'EAP' => 'EAP'
+ );
+
+global $p2_modes;
+$p2_modes = array(
+ 'tunnel' => 'Tunnel IPv4',
+ 'tunnel6' => 'Tunnel IPv6',
+ 'transport' => 'Transport');
+
+global $p2_protos;
+$p2_protos = array(
+ 'esp' => 'ESP',
+ 'ah' => 'AH');
+
+global $p2_pfskeygroups;
+$p2_pfskeygroups = array(
+ 0 => 'off',
+ 1 => '1 (768 bit)',
+ 2 => '2 (1024 bit)',
+ 5 => '5 (1536 bit)',
+ 14 => '14 (2048 bit)',
+ 15 => '15 (3072 bit)',
+ 16 => '16 (4096 bit)',
+ 17 => '17 (6144 bit)',
+ 18 => '18 (8192 bit)',
+ 19 => '19 (nist ecp256)',
+ 20 => '20 (nist ecp384)',
+ 21 => '21 (nist ecp521)',
+ 28 => '28 (brainpool ecp256)',
+ 29 => '29 (brainpool ecp384)',
+ 30 => '30 (brainpool ecp512)'
+);
+
+/*
+ * ikeid management functions
+ */
+
+function ipsec_ikeid_used($ikeid) {
+ global $config;
+
+ foreach ($config['ipsec']['phase1'] as $ph1ent) {
+ if ($ikeid == $ph1ent['ikeid']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function ipsec_ikeid_next() {
+
+ $ikeid = 1;
+ while (ipsec_ikeid_used($ikeid)) {
+ $ikeid++;
+ }
+
+ return $ikeid;
+}
+
+/*
+ * Return phase1 local address
+ */
+function ipsec_get_phase1_src(& $ph1ent) {
+
+ if ($ph1ent['interface']) {
+ if (!is_ipaddr($ph1ent['interface'])) {
+ if (strpos($ph1ent['interface'], '_vip')) {
+ $if = $ph1ent['interface'];
+ } else {
+ $if = get_failover_interface($ph1ent['interface']);
+ }
+ if ($ph1ent['protocol'] == "inet6") {
+ $interfaceip = get_interface_ipv6($if);
+ } else {
+ $interfaceip = get_interface_ip($if);
+ }
+ } else {
+ $interfaceip = $ph1ent['interface'];
+ }
+ } else {
+ $if = "wan";
+ if ($ph1ent['protocol'] == "inet6") {
+ $interfaceip = get_interface_ipv6($if);
+ } else {
+ $interfaceip = get_interface_ip($if);
+ }
+ }
+
+ return $interfaceip;
+}
+
+/*
+ * Return phase1 local address
+ */
+function ipsec_get_phase1_dst(& $ph1ent) {
+ global $g;
+
+ if (empty($ph1ent['remote-gateway'])) {
+ return false;
+ }
+ $rg = $ph1ent['remote-gateway'];
+ if (!is_ipaddr($rg)) {
+ if (!platform_booting()) {
+ return resolve_retry($rg);
+ }
+ }
+ if (!is_ipaddr($rg)) {
+ return false;
+ }
+
+ return $rg;
+}
+
+/*
+ * Return phase2 idinfo in cidr format
+ */
+function ipsec_idinfo_to_cidr(& $idinfo, $addrbits = false, $mode = "") {
+ global $config;
+
+ switch ($idinfo['type']) {
+ case "address":
+ if ($addrbits) {
+ if ($mode == "tunnel6") {
+ return $idinfo['address']."/128";
+ } else {
+ return $idinfo['address']."/32";
+ }
+ } else {
+ return $idinfo['address'];
+ }
+ break; /* NOTREACHED */
+ case "network":
+ return "{$idinfo['address']}/{$idinfo['netbits']}";
+ break; /* NOTREACHED */
+ case "none":
+ case "mobile":
+ return '0.0.0.0/0';
+ break; /* NOTREACHED */
+ default:
+ if (empty($mode) && !empty($idinfo['mode'])) {
+ $mode = $idinfo['mode'];
+ }
+
+ if ($mode == "tunnel6") {
+ $address = get_interface_ipv6($idinfo['type']);
+ $netbits = get_interface_subnetv6($idinfo['type']);
+ $address = gen_subnetv6($address, $netbits);
+ return "{$address}/{$netbits}";
+ } else {
+ $address = get_interface_ip($idinfo['type']);
+ $netbits = get_interface_subnet($idinfo['type']);
+ $address = gen_subnet($address, $netbits);
+ return "{$address}/{$netbits}";
+ }
+ break; /* NOTREACHED */
+ }
+}
+
+/*
+ * Return phase2 idinfo in address/netmask format
+ */
+function ipsec_idinfo_to_subnet(& $idinfo, $addrbits = false) {
+ global $config;
+
+ switch ($idinfo['type']) {
+ case "address":
+ if ($addrbits) {
+ if ($idinfo['mode'] == "tunnel6") {
+ return $idinfo['address']."/128";
+ } else {
+ return $idinfo['address']."/255.255.255.255";
+ }
+ } else {
+ return $idinfo['address'];
+ }
+ break; /* NOTREACHED */
+ case "none":
+ case "network":
+ return $idinfo['address']."/".gen_subnet_mask($idinfo['netbits']);
+ break; /* NOTREACHED */
+ case "mobile":
+ return "0.0.0.0/0";
+ break; /* NOTREACHED */
+ default:
+ if ($idinfo['mode'] == "tunnel6") {
+ $address = get_interface_ipv6($idinfo['type']);
+ $netbits = get_interface_subnetv6($idinfo['type']);
+ $address = gen_subnetv6($address, $netbits);
+ return $address."/".$netbits;
+ } else {
+ $address = get_interface_ip($idinfo['type']);
+ $netbits = get_interface_subnet($idinfo['type']);
+ $address = gen_subnet($address, $netbits);
+ return $address."/".$netbits;
+ }
+ break; /* NOTREACHED */
+ }
+}
+
+/*
+ * Return phase2 idinfo in text format
+ */
+function ipsec_idinfo_to_text(& $idinfo) {
+ global $config;
+
+ switch ($idinfo['type']) {
+ case "address":
+ return $idinfo['address'];
+ break; /* NOTREACHED */
+ case "network":
+ return $idinfo['address']."/".$idinfo['netbits'];
+ break; /* NOTREACHED */
+ case "mobile":
+ return gettext("Mobile Client");
+ break; /* NOTREACHED */
+ case "none":
+ return gettext("None");
+ break; /* NOTREACHED */
+ default:
+ if (!empty($config['interfaces'][$idinfo['type']])) {
+ return convert_friendly_interface_to_friendly_descr($idinfo['type']);
+ } else {
+ return strtoupper($idinfo['type']);
+ }
+ break; /* NOTREACHED */
+ }
+}
+
+/*
+ * Return phase1 association for phase2
+ */
+function ipsec_lookup_phase1(& $ph2ent, & $ph1ent) {
+ global $config;
+
+ if (!is_array($config['ipsec'])) {
+ return false;
+ }
+ if (!is_array($config['ipsec']['phase1'])) {
+ return false;
+ }
+ if (empty($config['ipsec']['phase1'])) {
+ return false;
+ }
+
+ foreach ($config['ipsec']['phase1'] as $ph1tmp) {
+ if ($ph1tmp['ikeid'] == $ph2ent['ikeid']) {
+ $ph1ent = $ph1tmp;
+ return $ph1ent;
+ }
+ }
+
+ return false;
+}
+
+/*
+ * Check phase1 communications status
+ */
+function ipsec_phase1_status(&$ipsec_status, $ikeid) {
+
+ foreach ($ipsec_status as $ike) {
+ if ($ike['id'] == $ikeid) {
+ if ($ike['status'] == 'established') {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+/*
+ * Check phase2 communications status
+ */
+function ipsec_phase2_status(&$ipsec_status, &$phase2) {
+
+ if (ipsec_lookup_phase1($ph2ent, $ph1ent)) {
+ return ipsec_phase1_status($ipsec_status, $ph1ent['ikeid']);
+ }
+
+ return false;
+}
+
+function ipsec_smp_dump_status() {
+ global $config, $g, $custom_listtags;
+
+ if (isset($config['ipsec']['enable'])) {
+ if (!file_exists("{$g['varrun_path']}/charon.xml")) {
+ log_error("IPsec daemon not running or has a problem!");
+ return;
+ }
+ } else {
+ return;
+ }
+
+ $fd = @fsockopen("unix://{$g['varrun_path']}/charon.xml");
+ if (!$fd) {
+ log_error("Could not read status from IPsec");
+ return;
+ }
+ $query = '<?xml version="1.0"?><message xmlns="http://www.strongswan.org/smp/1.0" type="request" id="1">';
+ $query .= '<query><ikesalist/></query></message>';
+
+ @fwrite($fd, $query);
+ $response = "";
+ while (!strstr($sread, "</message>")) {
+ $sread = fgets($fd);
+ if ($sread === false) {
+ break;
+ }
+ $response .= $sread;
+ }
+ fclose($fd);
+
+ if ($sread === false) {
+ log_error("Error during reading of status from IPsec");
+ return;
+ }
+
+ @file_put_contents("{$g['tmp_path']}/smp_status.xml", $response);
+ unset($response, $sread);
+
+ $custom_listtags = array('ikesa', 'childsa', 'network', 'auth');
+ $response = parse_xml_config("{$g['tmp_path']}/smp_status.xml", "message");
+ @unlink("{$g['tmp_path']}/smp_status.xml");
+ unset($custom_listtags);
+
+ return $response;
+}
+
+/*
+ * Return dump of SPD table
+ */
+function ipsec_dump_spd() {
+ $fd = @popen("/sbin/setkey -DP", "r");
+ $spd = array();
+ if ($fd) {
+ while (!feof($fd)) {
+ $line = chop(fgets($fd));
+ if (!$line) {
+ continue;
+ }
+ if ($line == "No SPD entries.") {
+ break;
+ }
+ if ($line[0] != "\t") {
+ if (is_array($cursp)) {
+ $spd[] = $cursp;
+ }
+ $cursp = array();
+ $linea = explode(" ", $line);
+ $cursp['srcid'] = substr($linea[0], 0, strpos($linea[0], "["));
+ $cursp['dstid'] = substr($linea[1], 0, strpos($linea[1], "["));
+ $i = 0;
+ } else if (is_array($cursp)) {
+ $line = trim($line, "\t\r\n ");
+ $linea = explode(" ", $line);
+ switch ($i) {
+ case 1:
+ if ($linea[1] == "none") /* don't show default anti-lockout rule */ {
+ unset($cursp);
+ } else {
+ $cursp['dir'] = $linea[0];
+ }
+ break;
+ case 2:
+ $upperspec = explode("/", $linea[0]);
+ $cursp['proto'] = $upperspec[0];
+ list($cursp['src'], $cursp['dst']) = explode("-", $upperspec[2]);
+ $cursp['reqid'] = substr($upperspec[3], strpos($upperspec[3], "#")+1);
+ break;
+ }
+ }
+ $i++;
+ }
+ if (is_array($cursp) && count($cursp)) {
+ $spd[] = $cursp;
+ }
+ pclose($fd);
+ }
+
+ return $spd;
+}
+
+/*
+ * Return dump of SAD table
+ */
+function ipsec_dump_sad() {
+ $fd = @popen("/sbin/setkey -D", "r");
+ $sad = array();
+ if ($fd) {
+ while (!feof($fd)) {
+ $line = chop(fgets($fd));
+ if (!$line || $line[0] == " ") {
+ continue;
+ }
+ if ($line == "No SAD entries.") {
+ break;
+ }
+ if ($line[0] != "\t") {
+ if (is_array($cursa)) {
+ $sad[] = $cursa;
+ }
+ $cursa = array();
+ list($cursa['src'], $cursa['dst']) = explode(" ", $line);
+ } else {
+ $line = trim($line, "\t\n\r ");
+ $linea = explode(" ", $line);
+ foreach ($linea as $idx => $linee) {
+ if ($linee == 'esp' || $linee == 'ah' || $linee[0] == '#') {
+ $cursa['proto'] = $linee;
+ } else if (substr($linee, 0, 3) == 'spi') {
+ $cursa['spi'] = substr($linee, strpos($linee, 'x') + 1, -1);
+ } else if (substr($linee, 0, 5) == 'reqid') {
+ $cursa['reqid'] = substr($linee, strpos($linee, 'x') + 1, -1);
+ } else if (substr($linee, 0, 2) == 'E:') {
+ $cursa['ealgo'] = $linea[$idx + 1];
+ break;
+ } else if (substr($linee, 0, 2) == 'A:') {
+ $cursa['aalgo'] = $linea[$idx + 1];
+ break;
+ } else if (substr($linee, 0, 8) == 'current:') {
+ $cursa['data'] = substr($linea[$idx + 1], 0, strpos($linea[$idx + 1], 'bytes') - 1) . ' B';
+ break;
+ }
+ }
+ }
+ }
+ if (is_array($cursa) && count($cursa)) {
+ $sad[] = $cursa;
+ }
+ pclose($fd);
+ }
+
+ return $sad;
+}
+
+/*
+ * Return dump of mobile user list
+ */
+function ipsec_dump_mobile() {
+ global $g, $custom_listtags;
+
+ $_gb = exec("/usr/local/sbin/ipsec stroke leases > {$g['tmp_path']}/strongswan_leases.xml");
+
+ if (!file_exists("{$g['tmp_path']}/strongswan_leases.xml")) {
+ log_error(gettext("Unable to find IPsec daemon leases file. Could not display mobile user stats!"));
+ return array();
+ }
+
+ /* This is needed for fixing #4130 */
+ if (filesize("{$g['tmp_path']}/strongswan_leases.xml") < 200) {
+ return array();
+ }
+
+ $custom_listtags = array('lease', 'pool');
+ $response = parse_xml_config("{$g['tmp_path']}/strongswan_leases.xml", "leases");
+ @unlink("{$g['tmp_path']}/strongswan_leases.xml");
+ unset($custom_listtags, $_gb);
+
+ return $response;
+}
+
+function ipsec_mobilekey_sort() {
+ global $config;
+
+ function mobilekeycmp($a, $b) {
+ return strcmp($a['ident'][0], $b['ident'][0]);
+ }
+
+ usort($config['ipsec']['mobilekey'], "mobilekeycmp");
+}
+
+function ipsec_get_number_of_phase2($ikeid) {
+ global $config;
+ $a_phase2 = $config['ipsec']['phase2'];
+
+ $nbph2 = 0;
+
+ if (is_array($a_phase2) && count($a_phase2)) {
+ foreach ($a_phase2 as $ph2tmp) {
+ if ($ph2tmp['ikeid'] == $ikeid) {
+ $nbph2++;
+ }
+ }
+ }
+
+ return $nbph2;
+}
+
+function ipsec_get_descr($ikeid) {
+ global $config;
+
+ if (!isset($config['ipsec']['phase1']) ||
+ !is_array($config['ipsec']['phase1'])) {
+ return '';
+ }
+
+ foreach ($config['ipsec']['phase1'] as $p1) {
+ if ($p1['ikeid'] == $ikeid) {
+ return $p1['descr'];
+ }
+ }
+
+ return '';
+}
+
+function ipsec_get_phase1($ikeid) {
+ global $config;
+
+ if (!isset($config['ipsec']['phase1']) ||
+ !is_array($config['ipsec']['phase1'])) {
+ return '';
+ }
+
+ $a_phase1 = $config['ipsec']['phase1'];
+ foreach ($a_phase1 as $p1) {
+ if ($p1['ikeid'] == $ikeid) {
+ return $p1;
+ }
+ }
+ unset($a_phase1);
+}
+
+function ipsec_fixup_ip($ipaddr) {
+ if (is_ipaddrv6($ipaddr) || is_subnetv6($ipaddr)) {
+ return Net_IPv6::compress(Net_IPv6::uncompress($ipaddr));
+ } else {
+ return $ipaddr;
+ }
+}
+
+function ipsec_find_id(& $ph1ent, $side = "local", $rgmap = array()) {
+ if ($side == "local") {
+ $id_type = $ph1ent['myid_type'];
+ $id_data = $ph1ent['myid_data'];
+
+ $addr = ipsec_get_phase1_src($ph1ent);
+ if (!$addr) {
+ return array();
+ }
+ } elseif ($side == "peer") {
+ $id_type = $ph1ent['peerid_type'];
+ $id_data = $ph1ent['peerid_data'];
+
+ if (isset($ph1ent['mobile'])) {
+ $addr = "%any";
+ } else {
+ $addr = $ph1ent['remote-gateway'];
+ }
+ } else {
+ return array();
+ }
+
+
+ $thisid_type = $id_type;
+ switch ($thisid_type) {
+ case 'myaddress':
+ $thisid_type = 'address';
+ $thisid_data = $addr;
+ break;
+ case 'dyn_dns':
+ $thisid_type = 'dns';
+ $thisid_data = $id_data;
+ break;
+ case 'peeraddress':
+ $thisid_type = 'address';
+ $thisid_data = $rgmap[$ph1ent['remote-gateway']];
+ break;
+ case 'address':
+ $thisid_data = $id_data;
+ break;
+ case 'fqdn':
+ $thisid_data = "{$id_data}";
+ break;
+ case 'keyid tag':
+ $thisid_type = 'keyid';
+ $thisid_data = "{$id_data}";
+ break;
+ case 'user_fqdn':
+ $thisid_type = 'userfqdn';
+ $thisid_data = "{$id_data}";
+ break;
+ case 'asn1dn':
+ $thisid_data = $id_data;
+ break;
+ }
+ return array($thisid_type, $thisid_data);
+}
+
+function ipsec_fixup_network($network) {
+ if (substr($network, -3) == '|/0') {
+ $result = substr($network, 0, -3);
+ } else {
+ $tmp = explode('|', $network);
+ if (isset($tmp[1])) {
+ $result = $tmp[1];
+ } else {
+ $result = $tmp[0];
+ }
+ unset($tmp);
+ }
+
+ return $result;
+}
+
+function ipsec_new_reqid() {
+ global $config;
+
+ if (!is_array($config['ipsec']) || !is_array($config['ipsec']['phase2'])) {
+ return;
+ }
+
+ $ipsecreqid = lock('ipsecreqids', LOCK_EX);
+ $keyids = array();
+ $keyid = 1;
+ foreach ($config['ipsec']['phase2'] as $ph2) {
+ $keyids[$ph2['reqid']] = $ph2['reqid'];
+ }
+
+ for ($i = 1; $i < 16000; $i++) {
+ if (!isset($keyids[$i])) {
+ $keyid = $i;
+ break;
+ }
+ }
+ unlock($ipsecreqid);
+
+ return $keyid;
+}
+
+?>
diff --git a/src/etc/inc/itemid.inc b/src/etc/inc/itemid.inc
new file mode 100644
index 0000000..c698cfa
--- /dev/null
+++ b/src/etc/inc/itemid.inc
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ pfSense_MODULE: utils
+*/
+
+/*
+ Copyright (C) 2009 Janne Enberg <janne.enberg@lietu.net>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/****f* itemid/delete_id
+ * NAME
+ * delete_id - delete an item with ['id'] = $id from $array
+ * INPUTS
+ * $id - int: The ID to delete
+ * $array - array to delete the item from
+ * RESULT
+ * boolean - true if item was found and deleted
+ ******/
+function delete_id($id, &$array) {
+ // Index to delete
+ $delete_index = NULL;
+
+ if (!is_array($array)) {
+ return false;
+ }
+
+ // Search for the item in the array
+ foreach ($array as $key => $item) {
+ // If this item is the one we want to delete
+ if (isset($item['associated-rule-id']) && $item['associated-rule-id'] == $id) {
+ $delete_index = $key;
+ break;
+ }
+ }
+
+ // If we found the item, unset it
+ if ($delete_index !== NULL) {
+ unset($array[$delete_index]);
+ return true;
+ } else {
+ return false;
+ }
+
+}
+
+/****f* itemid/get_id
+ * NAME
+ * get_id - Get an item id with ['associated-rule-id'] = $id from $array
+ * INPUTS
+ * $id - string: The ID to get
+ * $array - array to get the item from
+ * RESULT
+ * mixed - The id, NULL if not found
+ ******/
+function get_id($id, &$array) {
+ // Use $foo = &get_id('id', array('id'=>'value'));
+
+ if (!is_array($array)) {
+ return false;
+ }
+
+ // Search for the item in the array
+ foreach ($array as $key => $item) {
+ // If this item is the one we want to delete
+ if (isset($item['associated-rule-id']) && $item['associated-rule-id'] == $id) {
+ return $key;
+ }
+ }
+
+ return false;
+}
+
+/****f* itemid/get_unique_id
+ * NAME
+ * get_unique_id - get a unique identifier
+ * RESULT
+ * string - unique id
+ ******/
+function get_unique_id() {
+
+ return uniqid("nat_", true);
+}
+
+?> \ No newline at end of file
diff --git a/src/etc/inc/led.inc b/src/etc/inc/led.inc
new file mode 100644
index 0000000..a08eef4
--- /dev/null
+++ b/src/etc/inc/led.inc
@@ -0,0 +1,356 @@
+<?
+/*
+ * led.inc
+ *
+ * (C) 2009 Jim Pingle <jimp@pfsense.org>
+ *
+ * LED control library that wraps around the functionality of led(4)
+ *
+ */
+/*
+ pfSense_BUILDER_BINARIES: /bin/echo
+ pfSense_MODULE: utils
+*/
+
+$led_root = "/dev/led/led";
+
+/*
+ * Send the control string to an LED
+ */
+function led_ctl($led, $str) {
+ global $led_root;
+ if (led_exists($led)) {
+ exec("/bin/echo " . escapeshellarg($str) . " > {$led_root}{$led}");
+ return true;
+ }
+ return false;
+}
+
+/*
+ * Blink an LED at set speed from 1-9 (1=Very Fast, 9=Very Slow)
+ */
+function led_blink($led, $speed = 0) {
+ switch ($speed) {
+ case "reallyfast":
+ case "veryfast":
+ $speed = 1;
+ break;
+ case "fast":
+ $speed = 3;
+ break;
+ case "medium":
+ $speed = 5;
+ break;
+ case "slow":
+ $speed = 7;
+ break;
+ case "reallyslow":
+ case "veryslow":
+ $speed = 9;
+ break;
+ }
+ if (is_numeric($speed) && ($speed > 0) && ($speed < 10)) {
+ return led_ctl($led, "f{$speed}");
+ }
+ return false;
+}
+
+/*
+ * Blink an LED in a specific pattern
+ * Letters A-J are on from 1/10s to 1s
+ * Letters a-j are off from 1/10s to 1s
+ */
+function led_pattern($led, $pattern, $repeat = true) {
+ /* End with a . to stop after one iteration. */
+ $end = $repeat ? "" : ".";
+ return led_ctl($led, "s{$pattern}{$end}");
+}
+
+/*
+ * Encode a text message into morse code, and send it to an LED
+ */
+function led_morse($led, $message) {
+ return led_ctl($led, "m" . str_to_morse($message));
+}
+
+/*
+ * Blink digits out on LED at 1/10s intervals
+ * e.g 1=1 blink, 8=8 blinks
+ * 0 is 10 pulses.
+ * One second pause between digits.
+ */
+function led_digit($led, $digitstring) {
+ $i = 0;
+ $dstring = "d";
+ while ($i < strlen($digitstring)) {
+ $thisdigit = substr($digitstring, $i++, 1);
+ if (is_numeric($thisdigit)) {
+ $dstring .= $thisdigit;
+ }
+ }
+ led_ctl($led, $dstring);
+}
+
+/*
+ * Turn an LED on
+ */
+function led_on($led) {
+ led_ctl($led, "1");
+}
+
+/*
+ * Turn an LED off
+ */
+function led_off($led) {
+ led_ctl($led, "0");
+}
+
+/*
+ * Find the number of LEDs present on the system.
+ */
+function led_count() {
+ global $led_root;
+ $count = 0;
+ $leds = array();
+ if (is_dir(dirname($led_root))) {
+ $leds = glob("{$led_root}*");
+ $count = count($leds);
+ }
+ return $count;
+}
+
+/*
+ * Test to see if a given LED exists.
+ */
+function led_exists($led) {
+ global $led_root;
+ if (!is_numeric($led)) {
+ return false;
+ }
+ return file_exists("{$led_root}{$led}");
+}
+
+/*
+ * Sweep across three LEDs in a K.I.T.T.-like way.
+ */
+function led_kitt() {
+ led_pattern(1, 'AaaaaA');
+ led_pattern(2, 'aAaaAa');
+ led_pattern(3, 'aaAAaa');
+}
+
+/*
+ * Custom pattern for assigning interfaces
+ */
+function led_assigninterfaces() {
+ led_pattern(1, 'AaaAaaaaaaaaaaaa');
+ led_pattern(2, 'aaaaaAaaAaaaaaaa');
+ led_pattern(3, 'aaaaaaaaaaAaaAaa');
+}
+
+/*
+ * Return the three LEDs to a standard setup (1=on, 2 and 3 = off)
+ */
+function led_normalize() {
+ led_on(1);
+ led_off(2);
+ led_off(3);
+}
+
+/*
+ * Shut off ALL LEDs.
+ */
+function led_alloff() {
+ led_off(1);
+ led_off(2);
+ led_off(3);
+}
+
+/*
+ * Translate a string to morse code. Characters not known to have a
+ * valid morse code representation will be ignored.
+ */
+function str_to_morse($string) {
+ $i = 0;
+ $morsestring = "";
+ while ($i < strlen($string)) {
+ $morsestring .= char_to_morse(substr($string, $i++, 1)) . " ";
+ }
+ return $morsestring . "\n";
+}
+
+/*
+ * Translate a single character to morse code. Characters not known
+ * to have a valid morse code representation will be ignored.
+ */
+function char_to_morse($char) {
+ switch (strtoupper($char)) {
+ case "A":
+ return ".-";
+ break;
+ case "B":
+ return "-...";
+ break;
+ case "C":
+ return "-.-.";
+ break;
+ case "D":
+ return "-..";
+ break;
+ case "E":
+ return ".";
+ break;
+ case "F":
+ return "..-.";
+ break;
+ case "G":
+ return "--.";
+ break;
+ case "H":
+ return "....";
+ break;
+ case "I":
+ return "..";
+ break;
+ case "J":
+ return ".---";
+ break;
+ case "K":
+ return "-.-";
+ break;
+ case "L":
+ return ".-..";
+ break;
+ case "M":
+ return "--";
+ break;
+ case "N":
+ return "-.";
+ break;
+ case "O":
+ return "---";
+ break;
+ case "P":
+ return ".--.";
+ break;
+ case "Q":
+ return "--.-";
+ break;
+ case "R":
+ return ".-.";
+ break;
+ case "S":
+ return "...";
+ break;
+ case "T":
+ return "-";
+ break;
+ case "U":
+ return "..-";
+ break;
+ case "V":
+ return "...-";
+ break;
+ case "W":
+ return ".--";
+ break;
+ case "X":
+ return "-..-";
+ break;
+ case "Y":
+ return "-.--";
+ break;
+ case "Z":
+ return "--..";
+ break;
+ case "0":
+ return "-----";
+ break;
+ case "1":
+ return ".----";
+ break;
+ case "2":
+ return "..---";
+ break;
+ case "3":
+ return "...--";
+ break;
+ case "4":
+ return "....-";
+ break;
+ case "5":
+ return ".....";
+ break;
+ case "6":
+ return "-....";
+ break;
+ case "7":
+ return "--...";
+ break;
+ case "8":
+ return "---..";
+ break;
+ case "9":
+ return "----.";
+ break;
+ case ".":
+ return ".-.-.-";
+ break;
+ case ",":
+ return "--..--";
+ break;
+ case "?":
+ return "..--..";
+ break;
+ case "'":
+ return ".----.";
+ break;
+ case "!":
+ return "-.-.--";
+ break;
+ case "/":
+ return "-..-.";
+ break;
+ case "(":
+ return "-.--.";
+ break;
+ case ")":
+ return "-.--.-";
+ break;
+ case "&":
+ return ".-...";
+ break;
+ case ":":
+ return "---...";
+ break;
+ case ";":
+ return "-.-.-.";
+ break;
+ case "=":
+ return "-...-";
+ break;
+ case "+":
+ return ".-.-.";
+ break;
+ case "-":
+ return "-....-";
+ break;
+ case "_":
+ return "..--.-";
+ break;
+ case "$":
+ return "...-..-";
+ break;
+ case "@":
+ return ".--.-.";
+ break;
+ case '"':
+ return ".-..-.";
+ break;
+ default:
+ return "";
+ break;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/src/etc/inc/login_sasl_client.inc b/src/etc/inc/login_sasl_client.inc
new file mode 100644
index 0000000..f5cc050
--- /dev/null
+++ b/src/etc/inc/login_sasl_client.inc
@@ -0,0 +1,69 @@
+<?php
+/*
+ * login_sasl_client.php
+ *
+ * @(#) $Id: login_sasl_client.php,v 1.2 2004/11/17 08:00:37 mlemos Exp $
+ *
+ */
+
+define("SASL_LOGIN_STATE_START", 0);
+define("SASL_LOGIN_STATE_IDENTIFY_USER", 1);
+define("SASL_LOGIN_STATE_IDENTIFY_PASSWORD", 2);
+define("SASL_LOGIN_STATE_DONE", 3);
+
+class login_sasl_client_class
+{
+ var $credentials=array();
+ var $state=SASL_LOGIN_STATE_START;
+
+ Function Initialize(&$client)
+ {
+ return(1);
+ }
+
+ Function Start(&$client, &$message, &$interactions)
+ {
+ if ($this->state!=SASL_LOGIN_STATE_START)
+ {
+ $client->error="LOGIN authentication state is not at the start";
+ return(SASL_FAIL);
+ }
+ $this->credentials=array(
+ "user"=>"",
+ "password"=>"",
+ "realm"=>""
+ );
+ $defaults=array(
+ "realm"=>""
+ );
+ $status=$client->GetCredentials($this->credentials,$defaults,$interactions);
+ if ($status==SASL_CONTINUE)
+ $this->state=SASL_LOGIN_STATE_IDENTIFY_USER;
+ Unset($message);
+ return($status);
+ }
+
+ Function Step(&$client, $response, &$message, &$interactions)
+ {
+ switch ($this->state)
+ {
+ case SASL_LOGIN_STATE_IDENTIFY_USER:
+ $message=$this->credentials["user"].(strlen($this->credentials["realm"]) ? "@".$this->credentials["realm"] : "");
+ $this->state=SASL_LOGIN_STATE_IDENTIFY_PASSWORD;
+ break;
+ case SASL_LOGIN_STATE_IDENTIFY_PASSWORD:
+ $message=$this->credentials["password"];
+ $this->state=SASL_LOGIN_STATE_DONE;
+ break;
+ case SASL_LOGIN_STATE_DONE:
+ $client->error="LOGIN authentication was finished without success";
+ break;
+ default:
+ $client->error="invalid LOGIN authentication step state";
+ return(SASL_FAIL);
+ }
+ return(SASL_CONTINUE);
+ }
+};
+
+?> \ No newline at end of file
diff --git a/src/etc/inc/meta.inc b/src/etc/inc/meta.inc
new file mode 100644
index 0000000..ac8bdfc
--- /dev/null
+++ b/src/etc/inc/meta.inc
@@ -0,0 +1,215 @@
+<?php
+/*
+ Copyright (C) 2008 Shrew Soft Inc
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_MODULE: utils
+
+*/
+
+/*
+ * The meta data format used in pfSense is denoted using markers
+ * followed by the appropriate value or value pair. All markers
+ * are prefixed with a ##| sequence. The + suffix is used to
+ * denote the beginning of a tag block followed by the tag name.
+ * A - suffix is used to denote the end of a tag block. Values
+ * are denoted using the * suffix and can optionally be expressed
+ * as a key value pair. An example of a metadata tag block ...
+ *
+ * ###|+INFO
+ * ###|*BLAH
+ * ###|*TEXT=SOME TEXT
+ * ###|-INFO
+ *
+ * After calling read_file_metadata, the result array would
+ * contain the following information ...
+ *
+ * metadata['<filename>']['INFO']['BLAH'][0] == true
+ * metadata['<filename>']['INFO']['TEXT'][0] == "SOME TEXT"
+ *
+ * NOTE: All statements must be at the beginning of a line and
+ * contiguous for a tag. The example shown above would not be
+ * processed due to the extra ' * ' comment chars.
+ *
+ */
+
+/*
+ * locate php files for a given path
+ */
+
+function list_phpfiles($path, & $found) {
+
+ if (!is_array($found)) {
+ $found = array();
+ }
+
+ $dir = opendir($path);
+ if (!$dir) {
+ printf(gettext("list_phpfiles: unable to examine path %s\n"), $path);
+ return;
+ }
+
+ while ($fname = readdir($dir)) {
+ if ($fname == "." || $fname == ".." || $fname[0] == '.') {
+ continue;
+ }
+ if (fnmatch('*.php', $fname)) {
+ $found[] = $fname;
+ }
+ }
+}
+
+/*
+ * read embedded metadata from a file
+ */
+
+function read_file_metadata($fpath, & $metadata, $taglist = false) {
+
+ if (!is_array($metadata)) {
+ $metadata = array();
+ }
+
+ if ($taglist) {
+ $taglist = explode(",", $taglist);
+ }
+
+ $fname = $fpath;
+ $slash = strrpos($fname, "/");
+ if ($slash) {
+ $fname = substr($fname, $slash + 1);
+ }
+
+ $fdata = @file_get_contents($fpath);
+ if (!$fdata) {
+ printf(gettext("unable to read %s\n"), $fpath);
+ continue;
+ }
+
+ $offset = 0;
+
+ $tags = array();
+
+ while (true) {
+
+ $tagbeg_off = stripos($fdata, "##|+", $offset);
+ if ($tagbeg_off === false) {
+ break;
+ }
+
+ $tagbeg_trm = stripos($fdata, "\n", $tagbeg_off);
+ if ($tagbeg_trm === false) {
+ break;
+ }
+
+ $tagend_off = stripos($fdata, "##|-", $tagbeg_trm);
+ if ($tagend_off === false) {
+ break;
+ }
+
+ $tagend_trm = stripos($fdata, "\n", $tagend_off);
+ if ($tagend_trm === false) {
+ break;
+ }
+
+ $tagbeg_len = $tagbeg_trm - $tagbeg_off;
+ $tagend_len = $tagend_trm - $tagend_off;
+
+ $tagbeg = substr($fdata, $tagbeg_off + 4, $tagbeg_len - 4);
+ $tagend = substr($fdata, $tagend_off + 4, $tagend_len - 4);
+
+ if ($tagbeg != $tagend) {
+ printf(gettext("error: tag mismatch ( %1\$s != %2\$s ) in '%3\$s'%4\$s"), $tagbeg, $tagend, $fpath, "\n");
+ break;
+ }
+
+ $mdata_off = $tagbeg_trm + 1;
+ $mdata_trm = $tagend_off - 1;
+ $mdata_len = $mdata_trm - $mdata_off;
+
+ $mdata = substr($fdata, $mdata_off, $mdata_len);
+
+ if (!strlen($mdata)) {
+ printf(gettext("warning: tag %1\$s has no data in '%2\$s'%3\$s"), $tagbeg, $fpath, "\n");
+ break;
+ }
+
+ $offset = $tagend_trm + 1;
+
+ if (is_array($taglist)) {
+ if (!in_array($tagbeg, $taglist)) {
+ continue;
+ }
+ }
+
+ $vals = array();
+
+ $lines = explode("\n", $mdata);
+ foreach ($lines as $line) {
+
+ if (!strlen($line)) {
+ continue;
+ }
+
+ $valtag = stripos($line, "##|*");
+ if ($valtag === false || $valtag) {
+ printf(gettext("warning: tag %1\$s has malformed data in '%2\$s'%3\$s"), $tagbeg, $fpath, "\n");
+ continue;
+ }
+
+ $value = substr($line, 4, strlen($line) - 1);
+ $vlist = explode("=", $value);
+
+ unset($vname);
+ unset($vdata);
+
+ switch (count($vlist)) {
+ case 1:
+ $vname = $vlist[0];
+ $vdata = true;
+ break;
+ case 2:
+ $vname = $vlist[0];
+ $vdata = $vlist[1];
+ break;
+ }
+
+ if (!isset($vname) || !isset($vdata)) {
+ printf(gettext("warning: tag %1\$s has invalid data in '%2\$s'%3\$s"), $tagbeg, $fpath, "\n");
+ continue;
+ }
+
+ $vals[$vname][] = $vdata;
+ }
+
+ if (count($vals)) {
+ $tags[$tagbeg] = $vals;
+ }
+ }
+
+ if (count($tags)) {
+ $metadata[$fname] = $tags;
+ }
+}
+
+?>
diff --git a/src/etc/inc/notices.inc b/src/etc/inc/notices.inc
new file mode 100644
index 0000000..891c18b
--- /dev/null
+++ b/src/etc/inc/notices.inc
@@ -0,0 +1,453 @@
+<?php
+/****h* pfSense/notices
+ NAME
+ notices.inc - pfSense notice utilities
+ DESCRIPTION
+ This include contains the pfSense notice facilities.
+ HISTORY
+ $Id$
+
+ Copyright (C) 2009 Scott Ullrich (sullrich@gmail.com)
+ Copyright (C) 2005 Colin Smith (ethethlay@gmail.com)
+ All rights reserved.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ RISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ pfSense_BUILDER_BINARIES: /bin/echo
+ pfSense_MODULE: notifications
+*/
+
+require_once("globals.inc");
+require_once("led.inc");
+
+$notice_path = $g['tmp_path'] . '/notices';
+$smtp_authentication_mechanisms = array(
+ 'PLAIN' => 'PLAIN',
+ 'LOGIN' => 'LOGIN');
+/* Other SMTP Authentication Mechanisms that could be supported.
+ * Note that MD5 is no longer considered secure.
+ * 'GSSAPI' => 'GSSAPI ' . gettext("Generic Security Services Application Program Interface")
+ * 'DIGEST-MD5' => 'DIGEST-MD5 ' . gettext("Digest access authentication")
+ * 'MD5' => 'MD5'
+ * 'CRAM-MD5' => 'CRAM-MD5'
+*/
+
+/****f* notices/file_notice
+ * NAME
+ * file_notice
+ * INPUTS
+ * $id, $notice, $category, $url, $priority
+ * RESULT
+ * Files a notice and kicks off the various alerts, smtp, growl, system log, LED's, etc.
+ ******/
+function file_notice($id, $notice, $category = "General", $url = "", $priority = 1) {
+ /*
+ * $category - Category that this notice should be displayed under. This can be arbitrary,
+ * but a page must be set to receive this messages for it to be displayed.
+ *
+ * $priority - A notice's priority. Higher numbers indicate greater severity.
+ * 0 = informational, 1 = warning, 2 = error, etc. This may also be arbitrary,
+ */
+ global $notice_path;
+ if (!$queue = get_notices()) {
+ $queue = array();
+ }
+ $queuekey = time();
+ $toqueue = array(
+ 'id' => $id,
+ 'notice' => $notice,
+ 'url' => $url,
+ 'category' => $category,
+ 'priority' => $priority,
+ );
+ $queue[$queuekey] = $toqueue;
+ $queueout = fopen($notice_path, "w");
+ if (!$queueout) {
+ log_error(printf(gettext("Could not open %s for writing"), $notice_path));
+ return;
+ }
+ fwrite($queueout, serialize($queue));
+ fclose($queueout);
+ log_error("New alert found: $notice");
+ /* soekris */
+ if (file_exists("/dev/led/error")) {
+ exec("/bin/echo 1 > /dev/led/error");
+ }
+ /* wrap & alix */
+ led_normalize();
+ led_morse(1, 'sos');
+ notify_via_growl($notice);
+ notify_via_smtp($notice);
+ return $queuekey;
+}
+
+/****f* notices/get_notices
+ * NAME
+ * get_notices
+ * INPUTS
+ * $category
+ * RESULT
+ * Returns a specific notices text
+ ******/
+function get_notices($category = "all") {
+ global $g;
+
+ if (file_exists("{$g['tmp_path']}/notices")) {
+ $queue = unserialize(file_get_contents("{$g['tmp_path']}/notices"));
+ if (!$queue) {
+ return false;
+ }
+ if ($category != 'all') {
+ foreach ($queue as $time => $notice) {
+ if (strtolower($notice['category']) == strtolower($category)) {
+ $toreturn[$time] = $notice;
+ }
+ }
+ return $toreturn;
+ } else {
+ return $queue;
+ }
+ } else {
+ return false;
+ }
+}
+
+/****f* notices/close_notice
+ * NAME
+ * close_notice
+ * INPUTS
+ * $id
+ * RESULT
+ * Removes a notice from the list
+ ******/
+function close_notice($id) {
+ global $notice_path;
+ require_once("util.inc");
+ /* soekris */
+ if (file_exists("/dev/led/error")) {
+ exec("/bin/echo 0 > /dev/led/error");
+ }
+ /* wrap & alix */
+ led_normalize();
+ $ids = array();
+ if (!$notices = get_notices()) {
+ return;
+ }
+ if ($id == "all") {
+ unlink_if_exists($notice_path);
+ return;
+ }
+ foreach (array_keys($notices) as $time) {
+ if ($id == $time) {
+ unset($notices[$id]);
+ break;
+ }
+ }
+ foreach ($notices as $key => $notice) {
+ $ids[$key] = $notice['id'];
+ }
+ foreach ($ids as $time => $tocheck) {
+ if ($id == $tocheck) {
+ unset($notices[$time]);
+ break;
+ }
+ }
+ if (count($notices) != 0) {
+ $queueout = fopen($notice_path, "w");
+ fwrite($queueout, serialize($notices));
+ fclose($queueout);
+ } else {
+ unlink_if_exists($notice_path);
+ }
+
+ return;
+}
+
+/****f* notices/dump_xml_notices
+ * NAME
+ * dump_xml_notices
+ * INPUTS
+ * NONE
+ * RESULT
+ * Outputs notices in XML formatted text
+ ******/
+function dump_xml_notices() {
+ if (file_exists("/cf/conf/use_xmlreader")) {
+ require_once("xmlreader.inc");
+ } else {
+ require_once("xmlparse.inc");
+ }
+ global $notice_path, $listtags;
+ $listtags[] = 'notice';
+ if (!$notices = get_notices()) {
+ return;
+ }
+ foreach ($notices as $time => $notice) {
+ $notice['time'] = $time;
+ $toput['notice'][] = $notice;
+ }
+ $xml = dump_xml_config($toput, 'notices');
+ return $xml;
+}
+
+/****f* notices/print_notices
+ * NAME
+ * print_notices
+ * INPUTS
+ * $notices, $category
+ * RESULT
+ * prints notices to the GUI
+ ******/
+function print_notices($notices, $category = "all") {
+ foreach ($notices as $notice) {
+ if ($category != "all") {
+ if (in_array($notice['category'], $category)) {
+ $categories[] = $notice['category'];
+ }
+ } else {
+ $categories[] = $notice['category'];
+ }
+ }
+ $categories = array_unique($categories);
+ sort($categories);
+ foreach ($categories as $category) {
+ $toreturn .= "<ul><li>{$category}<ul>";
+ foreach ($notices as $notice) {
+ if (strtolower($notice['category']) == strtolower($category)) {
+ if ($notice['id'] != "") {
+ if ($notice['url'] != "") {
+ $toreturn .= "<li><a href={$notice['url']}>{$notice['id']}</a> - {$notice['notice']}</li>";
+ } else {
+ $toreturn .= "<li>{$notice['id']} - {$notice['notice']}</li>";
+ }
+ }
+ }
+ }
+ $toreturn .= "</ul></li></ul>";
+ }
+ return $toreturn;
+}
+
+/****f* notices/print_notice_box
+ * NAME
+ * print_notice_box
+ * INPUTS
+ * $category
+ * RESULT
+ * prints an info box to the GUI
+ ******/
+function print_notice_box($category = "all") {
+ $notices = get_notices();
+ if (!$notices) {
+ return;
+ }
+ print_info_box_np(print_notices($notices, $category));
+ return;
+}
+
+/****f* notices/are_notices_pending
+ * NAME
+ * are_notices_pending
+ * INPUTS
+ * $category to check
+ * RESULT
+ * returns true if notices are pending, false if they are not
+ ******/
+function are_notices_pending($category = "all") {
+ global $notice_path;
+ if (file_exists($notice_path)) {
+ return true;
+ }
+ return false;
+}
+
+/****f* notices/notify_via_smtp
+ * NAME
+ * notify_via_smtp
+ * INPUTS
+ * notification string to send as an email
+ * RESULT
+ * returns true if message was sent
+ ******/
+function notify_via_smtp($message, $force = false) {
+ global $config, $g;
+ if (platform_booting()) {
+ return;
+ }
+
+ if (isset($config['notifications']['smtp']['disable']) && !$force) {
+ return;
+ }
+
+ /* Do NOT send the same message twice */
+ if (file_exists("/var/db/notices_lastmsg.txt")) {
+ $lastmsg = trim(file_get_contents("/var/db/notices_lastmsg.txt"));
+ if ($lastmsg == $message) {
+ return;
+ }
+ }
+
+ /* Store last message sent to avoid spamming */
+ $fd = fopen("/var/db/notices_lastmsg.txt", "w");
+ fwrite($fd, $message);
+ fclose($fd);
+
+ send_smtp_message($message, "{$config['system']['hostname']}.{$config['system']['domain']} - Notification", $force);
+ return;
+}
+
+function send_smtp_message($message, $subject = "(no subject)", $force = false) {
+ global $config, $g;
+ require_once("sasl.inc");
+ require_once("smtp.inc");
+
+ if (isset($config['notifications']['smtp']['disable']) && !$force) {
+ return;
+ }
+
+ if (!$config['notifications']['smtp']['ipaddress']) {
+ return;
+ }
+
+ if (!$config['notifications']['smtp']['notifyemailaddress']) {
+ return;
+ }
+
+ $smtp = new smtp_class;
+
+ $from = "pfsense@{$config['system']['hostname']}.{$config['system']['domain']}";
+ $to = $config['notifications']['smtp']['notifyemailaddress'];
+
+ $smtp->host_name = $config['notifications']['smtp']['ipaddress'];
+ $smtp->host_port = empty($config['notifications']['smtp']['port']) ? 25 : $config['notifications']['smtp']['port'];
+
+ $smtp->direct_delivery = 0;
+ $smtp->ssl = (isset($config['notifications']['smtp']['ssl'])) ? 1 : 0;
+ $smtp->tls = (isset($config['notifications']['smtp']['tls'])) ? 1 : 0;
+ $smtp->debug = 0;
+ $smtp->html_debug = 0;
+ $smtp->localhost = $config['system']['hostname'] . "." . $config['system']['domain'];
+
+ if ($config['notifications']['smtp']['fromaddress']) {
+ $from = $config['notifications']['smtp']['fromaddress'];
+ }
+
+ // Use SMTP Auth if fields are filled out
+ if ($config['notifications']['smtp']['username'] &&
+ $config['notifications']['smtp']['password']) {
+ if (isset($config['notifications']['smtp']['authentication_mechanism'])) {
+ $smtp->authentication_mechanism = $config['notifications']['smtp']['authentication_mechanism'];
+ } else {
+ $smtp->authentication_mechanism = "PLAIN";
+ }
+ $smtp->user = $config['notifications']['smtp']['username'];
+ $smtp->password = $config['notifications']['smtp']['password'];
+ }
+
+ $headers = array(
+ "From: {$from}",
+ "To: {$to}",
+ "Subject: {$subject}",
+ "Date: " . date("r")
+ );
+
+ if ($smtp->SendMessage($from, preg_split('/\s*,\s*/', trim($to)), $headers, $message)) {
+ log_error(sprintf(gettext("Message sent to %s OK"), $to));
+ return;
+ } else {
+ log_error(sprintf(gettext('Could not send the message to %1$s -- Error: %2$s'), $to, $smtp->error));
+ return(sprintf(gettext('Could not send the message to %1$s -- Error: %2$s'), $to, $smtp->error));
+ }
+}
+
+/****f* notices/notify_via_growl
+ * NAME
+ * notify_via_growl
+ * INPUTS
+ * notification string to send
+ * RESULT
+ * returns true if message was sent
+ ******/
+function notify_via_growl($message, $force=false) {
+ require_once("growl.class");
+ global $config, $g;
+
+ if (isset($config['notifications']['growl']['disable']) && !$force) {
+ return;
+ }
+
+ /* Do NOT send the same message twice */
+ if (file_exists("/var/db/growlnotices_lastmsg.txt")) {
+ $lastmsg = trim(file_get_contents("/var/db/growlnotices_lastmsg.txt"));
+ if ($lastmsg == $message) {
+ return;
+ }
+ }
+
+ $hostname = $config['system']['hostname'] . "." . $config['system']['domain'];
+ $growl_ip = $config['notifications']['growl']['ipaddress'];
+ $growl_password = $config['notifications']['growl']['password'];
+ $growl_name = $config['notifications']['growl']['name'];
+ $growl_notification = $config['notifications']['growl']['notification_name'];
+
+ if (!empty($growl_ip) && (is_ipaddr($growl_ip) || dns_get_record($growl_ip, DNS_A) || dns_get_record($growl_ip, DNS_AAAA))) {
+ $growl = new Growl($growl_ip, $growl_password, $growl_name);
+ $growl->notify("{$growl_notification}", gettext(sprintf("%s (%s) - Notification", $g['product_name'], $hostname)), "{$message}");
+ }
+
+ /* Store last message sent to avoid spamming */
+ $fd = fopen("/var/db/growlnotices_lastmsg.txt", "w");
+ fwrite($fd, $message);
+ fclose($fd);
+}
+
+/****f* notices/register_via_growl
+ * NAME
+ * register_via_growl
+ * INPUTS
+ * none
+ * RESULT
+ * none
+ ******/
+function register_via_growl() {
+ require_once("growl.class");
+ global $config;
+ $growl_ip = $config['notifications']['growl']['ipaddress'];
+ $growl_password = $config['notifications']['growl']['password'];
+ $growl_name = $config['notifications']['growl']['name'];
+ $growl_notification = $config['notifications']['growl']['notification_name'];
+
+ if ($growl_ip) {
+ $growl = new Growl($growl_ip, $growl_password, $growl_name);
+ $growl->addNotification($growl_notification);
+ $growl->register();
+ }
+}
+
+/* Notify via remote methods only - not via GUI. */
+function notify_all_remote($msg) {
+ notify_via_smtp($msg);
+ notify_via_growl($msg);
+}
+
+?>
diff --git a/src/etc/inc/ntlm_sasl_client.inc b/src/etc/inc/ntlm_sasl_client.inc
new file mode 100644
index 0000000..18e5658
--- /dev/null
+++ b/src/etc/inc/ntlm_sasl_client.inc
@@ -0,0 +1,180 @@
+<?php
+/*
+ * ntlm_sasl_client.php
+ *
+ * @(#) $Id: ntlm_sasl_client.php,v 1.3 2004/11/17 08:00:37 mlemos Exp $
+ *
+ */
+
+define("SASL_NTLM_STATE_START", 0);
+define("SASL_NTLM_STATE_IDENTIFY_DOMAIN", 1);
+define("SASL_NTLM_STATE_RESPOND_CHALLENGE", 2);
+define("SASL_NTLM_STATE_DONE", 3);
+
+class ntlm_sasl_client_class
+{
+ var $credentials=array();
+ var $state=SASL_NTLM_STATE_START;
+
+ Function Initialize(&$client)
+ {
+ if (!function_exists($function="mcrypt_encrypt") ||
+ !function_exists($function="hash"))
+ {
+ $extensions=array(
+ "mcrypt_encrypt"=>"mcrypt",
+ "hash"=>"hash"
+ );
+ $client->error="the extension ".$extensions[$function]." required by the NTLM SASL client class is not available in this PHP configuration";
+ return(0);
+ }
+ return(1);
+ }
+
+ Function ASCIIToUnicode($ascii)
+ {
+ for ($unicode="",$a=0;$a<strlen($ascii);$a++)
+ $unicode.=substr($ascii,$a,1).chr(0);
+ return($unicode);
+ }
+
+ Function TypeMsg1($domain,$workstation)
+ {
+ $domain_length=strlen($domain);
+ $workstation_length=strlen($workstation);
+ $workstation_offset=32;
+ $domain_offset=$workstation_offset+$workstation_length;
+ return(
+ "NTLMSSP\0".
+ "\x01\x00\x00\x00".
+ "\x07\x32\x00\x00".
+ pack("v",$domain_length).
+ pack("v",$domain_length).
+ pack("V",$domain_offset).
+ pack("v",$workstation_length).
+ pack("v",$workstation_length).
+ pack("V",$workstation_offset).
+ $workstation.
+ $domain
+ );
+ }
+
+ Function NTLMResponse($challenge,$password)
+ {
+ $unicode=$this->ASCIIToUnicode($password);
+ $md4=hash("md4", $unicode);
+ $padded=$md4.str_repeat(chr(0),21-strlen($md4));
+ $iv_size=mcrypt_get_iv_size(MCRYPT_DES,MCRYPT_MODE_ECB);
+ $iv=mcrypt_create_iv($iv_size,MCRYPT_RAND);
+ for ($response="",$third=0;$third<21;$third+=7)
+ {
+ for ($packed="",$p=$third;$p<$third+7;$p++)
+ $packed.=str_pad(decbin(ord(substr($padded,$p,1))),8,"0",STR_PAD_LEFT);
+ for ($key="",$p=0;$p<strlen($packed);$p+=7)
+ {
+ $s=substr($packed,$p,7);
+ $b=$s.((substr_count($s,"1") % 2) ? "0" : "1");
+ $key.=chr(bindec($b));
+ }
+ $ciphertext=mcrypt_encrypt(MCRYPT_DES,$key,$challenge,MCRYPT_MODE_ECB,$iv);
+ $response.=$ciphertext;
+ }
+ return $response;
+ }
+
+ Function TypeMsg3($ntlm_response,$user,$domain,$workstation)
+ {
+ $domain_unicode=$this->ASCIIToUnicode($domain);
+ $domain_length=strlen($domain_unicode);
+ $domain_offset=64;
+ $user_unicode=$this->ASCIIToUnicode($user);
+ $user_length=strlen($user_unicode);
+ $user_offset=$domain_offset+$domain_length;
+ $workstation_unicode=$this->ASCIIToUnicode($workstation);
+ $workstation_length=strlen($workstation_unicode);
+ $workstation_offset=$user_offset+$user_length;
+ $lm="";
+ $lm_length=strlen($lm);
+ $lm_offset=$workstation_offset+$workstation_length;
+ $ntlm=$ntlm_response;
+ $ntlm_length=strlen($ntlm);
+ $ntlm_offset=$lm_offset+$lm_length;
+ $session="";
+ $session_length=strlen($session);
+ $session_offset=$ntlm_offset+$ntlm_length;
+ return(
+ "NTLMSSP\0".
+ "\x03\x00\x00\x00".
+ pack("v",$lm_length).
+ pack("v",$lm_length).
+ pack("V",$lm_offset).
+ pack("v",$ntlm_length).
+ pack("v",$ntlm_length).
+ pack("V",$ntlm_offset).
+ pack("v",$domain_length).
+ pack("v",$domain_length).
+ pack("V",$domain_offset).
+ pack("v",$user_length).
+ pack("v",$user_length).
+ pack("V",$user_offset).
+ pack("v",$workstation_length).
+ pack("v",$workstation_length).
+ pack("V",$workstation_offset).
+ pack("v",$session_length).
+ pack("v",$session_length).
+ pack("V",$session_offset).
+ "\x01\x02\x00\x00".
+ $domain_unicode.
+ $user_unicode.
+ $workstation_unicode.
+ $lm.
+ $ntlm
+ );
+ }
+
+ Function Start(&$client, &$message, &$interactions)
+ {
+ if ($this->state!=SASL_NTLM_STATE_START)
+ {
+ $client->error="NTLM authentication state is not at the start";
+ return(SASL_FAIL);
+ }
+ $this->credentials=array(
+ "user"=>"",
+ "password"=>"",
+ "realm"=>"",
+ "workstation"=>""
+ );
+ $defaults=array();
+ $status=$client->GetCredentials($this->credentials,$defaults,$interactions);
+ if ($status==SASL_CONTINUE)
+ $this->state=SASL_NTLM_STATE_IDENTIFY_DOMAIN;
+ Unset($message);
+ return($status);
+ }
+
+ Function Step(&$client, $response, &$message, &$interactions)
+ {
+ switch ($this->state)
+ {
+ case SASL_NTLM_STATE_IDENTIFY_DOMAIN:
+ $message=$this->TypeMsg1($this->credentials["realm"],$this->credentials["workstation"]);
+ $this->state=SASL_NTLM_STATE_RESPOND_CHALLENGE;
+ break;
+ case SASL_NTLM_STATE_RESPOND_CHALLENGE:
+ $ntlm_response=$this->NTLMResponse(substr($response,24,8),$this->credentials["password"]);
+ $message=$this->TypeMsg3($ntlm_response,$this->credentials["user"],$this->credentials["realm"],$this->credentials["workstation"]);
+ $this->state=SASL_NTLM_STATE_DONE;
+ break;
+ case SASL_NTLM_STATE_DONE:
+ $client->error="NTLM authentication was finished without success";
+ return(SASL_FAIL);
+ default:
+ $client->error="invalid NTLM authentication step state";
+ return(SASL_FAIL);
+ }
+ return(SASL_CONTINUE);
+ }
+};
+
+?>
diff --git a/src/etc/inc/openvpn.attributes.php b/src/etc/inc/openvpn.attributes.php
new file mode 100644
index 0000000..467d691
--- /dev/null
+++ b/src/etc/inc/openvpn.attributes.php
@@ -0,0 +1,203 @@
+<?php
+/*
+ openvpn.attributes.php
+ Copyright (C) 2011-2012 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+if (empty($common_name)) {
+ $common_name = getenv("common_name");
+ if (empty($common_name)) {
+ $common_name = getenv("username");
+ }
+}
+
+$devname = getenv("dev");
+if (empty($devname)) {
+ $devname = "openvpn";
+}
+
+function cisco_to_cidr($addr) {
+ if (!is_ipaddr($addr)) {
+ return 0;
+ }
+ $mask = decbin(~ip2long($addr));
+ $mask = substr($mask, -32);
+ $k = 0;
+ for ($i = 0; $i <= 32; $i++) {
+ $k += intval($mask[$i]);
+ }
+ return $k;
+}
+
+function cisco_extract_index($prule) {
+
+ $index = explode("#", $prule);
+ if (is_numeric($index[1])) {
+ return intval($index[1]);
+ } else {
+ syslog(LOG_WARNING, "Error parsing rule {$prule}: Could not extract index");
+ }
+ return -1;;
+}
+
+function parse_cisco_acl($attribs) {
+ global $devname, $attributes;
+ if (!is_array($attribs)) {
+ return "";
+ }
+ $finalrules = "";
+ if (is_array($attribs['ciscoavpair'])) {
+ $inrules = array();
+ $outrules = array();
+ foreach ($attribs['ciscoavpair'] as $avrules) {
+ $rule = explode("=", $avrules);
+ $dir = "";
+ if (strstr($rule[0], "inacl")) {
+ $dir = "in";
+ } else if (strstr($rule[0], "outacl")) {
+ $dir = "out";
+ } else if (strstr($rule[0], "dns-servers")) {
+ $attributes['dns-servers'] = explode(" ", $rule[1]);
+ continue;
+ } else if (strstr($rule[0], "route")) {
+ if (!is_array($attributes['routes'])) {
+ $attributes['routes'] = array();
+ }
+ $attributes['routes'][] = $rule[1];
+ continue;
+ }
+ $rindex = cisco_extract_index($rule[0]);
+ if ($rindex < 0) {
+ continue;
+ }
+
+ $rule = $rule[1];
+ $rule = explode(" ", $rule);
+ $tmprule = "";
+ $index = 0;
+ $isblock = false;
+ if ($rule[$index] == "permit") {
+ $tmprule = "pass {$dir} quick on {$devname} ";
+ } else if ($rule[$index] == "deny") {
+ //continue;
+ $isblock = true;
+ $tmprule = "block {$dir} quick on {$devname} ";
+ } else {
+ continue;
+ }
+
+ $index++;
+
+ switch ($rule[$index]) {
+ case "tcp":
+ case "udp":
+ $tmprule .= "proto {$rule[$index]} ";
+ break;
+ }
+
+ $index++;
+ /* Source */
+ if (trim($rule[$index]) == "host") {
+ $index++;
+ $tmprule .= "from {$rule[$index]} ";
+ $index++;
+ if ($isblock == true) {
+ $isblock = false;
+ }
+ } else if (trim($rule[$index]) == "any") {
+ $tmprule .= "from any";
+ $index++;
+ } else {
+ $tmprule .= "from {$rule[$index]}";
+ $index++;
+ $netmask = cisco_to_cidr($rule[$index]);
+ $tmprule .= "/{$netmask} ";
+ $index++;
+ if ($isblock == true) {
+ $isblock = false;
+ }
+ }
+ /* Destination */
+ if (trim($rule[$index]) == "host") {
+ $index++;
+ $tmprule .= "to {$rule[$index]} ";
+ $index++;
+ if ($isblock == true) {
+ $isblock = false;
+ }
+ } else if (trim($rule[$index]) == "any") {
+ $index++;
+ $tmprule .= "to any";
+ } else {
+ $tmprule .= "to {$rule[$index]}";
+ $index++;
+ $netmask = cisco_to_cidr($rule[$index]);
+ $tmprule .= "/{$netmask} ";
+ $index++;
+ if ($isblock == true) {
+ $isblock = false;
+ }
+ }
+
+ if ($isblock == true) {
+ continue;
+ }
+
+ if ($dir == "in") {
+ $inrules[$rindex] = $tmprule;
+ } else if ($dir == "out") {
+ $outrules[$rindex] = $tmprule;
+ }
+ }
+
+
+ $state = "";
+ if (!empty($outrules)) {
+ $state = "no state";
+ }
+ ksort($inrules, SORT_NUMERIC);
+ foreach ($inrules as $inrule) {
+ $finalrules .= "{$inrule} {$state}\n";
+ }
+ if (!empty($outrules)) {
+ ksort($outrules, SORT_NUMERIC);
+ foreach ($outrules as $outrule) {
+ $finalrules .= "{$outrule} {$state}\n";
+ }
+ }
+ }
+ return $finalrules;
+}
+
+$rules = parse_cisco_acl($attributes);
+if (!empty($rules)) {
+ $pid = posix_getpid();
+ @file_put_contents("/tmp/ovpn_{$pid}{$common_name}.rules", $rules);
+ mwexec("/sbin/pfctl -a " . escapeshellarg("openvpn/{$common_name}") . " -f {$g['tmp_path']}/ovpn_{$pid}" . escapeshellarg($common_name) . ".rules");
+ @unlink("{$g['tmp_path']}/ovpn_{$pid}{$common_name}.rules");
+}
+
+?>
diff --git a/src/etc/inc/openvpn.auth-user.php b/src/etc/inc/openvpn.auth-user.php
new file mode 100644
index 0000000..e108a4f
--- /dev/null
+++ b/src/etc/inc/openvpn.auth-user.php
@@ -0,0 +1,213 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ openvpn.auth-user.php
+
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+/*
+ pfSense_BUILDER_BINARIES:
+ pfSense_MODULE: openvpn
+*/
+/*
+ * OpenVPN calls this script to authenticate a user
+ * based on a username and password. We lookup these
+ * in our config.xml file and check the credentials.
+ */
+
+require_once("globals.inc");
+require_once("config.inc");
+require_once("radius.inc");
+require_once("auth.inc");
+require_once("interfaces.inc");
+
+/**
+ * Get the NAS-Identifier
+ *
+ * We will use our local hostname to make up the nas_id
+ */
+if (!function_exists("getNasID")) {
+function getNasID() {
+ global $g;
+
+ $nasId = gethostname();
+ if (empty($nasId)) {
+ $nasId = $g['product_name'];
+ }
+ return $nasId;
+}
+}
+
+/**
+ * Get the NAS-IP-Address based on the current wan address
+ *
+ * Use functions in interfaces.inc to find this out
+ *
+ */
+if (!function_exists("getNasIP")) {
+function getNasIP() {
+ $nasIp = get_interface_ip();
+ if (!$nasIp) {
+ $nasIp = "0.0.0.0";
+ }
+ return $nasIp;
+}
+}
+/* setup syslog logging */
+openlog("openvpn", LOG_ODELAY, LOG_AUTH);
+
+if (isset($_GET['username'])) {
+ $authmodes = explode(",", $_GET['authcfg']);
+ $username = base64_decode(str_replace('%3D', '=', $_GET['username']));
+ $password = base64_decode(str_replace('%3D', '=', $_GET['password']));
+ $common_name = $_GET['cn'];
+ $modeid = $_GET['modeid'];
+ $strictusercn = $_GET['strictcn'] == "false" ? false : true;
+} else {
+ /* read data from environment */
+ $username = getenv("username");
+ $password = getenv("password");
+ $common_name = getenv("common_name");
+}
+
+if (!$username || !$password) {
+ syslog(LOG_ERR, "invalid user authentication environment");
+ if (isset($_GET['username'])) {
+ echo "FAILED";
+ closelog();
+ return;
+ } else {
+ closelog();
+ return (-1);
+ }
+}
+
+/* Replaced by a sed with proper variables used below(ldap parameters). */
+//<template>
+
+if (file_exists("{$g['varetc_path']}/openvpn/{$modeid}.ca")) {
+ putenv("LDAPTLS_CACERT={$g['varetc_path']}/openvpn/{$modeid}.ca");
+ putenv("LDAPTLS_REQCERT=never");
+}
+
+$authenticated = false;
+
+if (($strictusercn === true) && ($common_name != $username)) {
+ syslog(LOG_WARNING, "Username does not match certificate common name ({$username} != {$common_name}), access denied.\n");
+ if (isset($_GET['username'])) {
+ echo "FAILED";
+ closelog();
+ return;
+ } else {
+ closelog();
+ return (1);
+ }
+}
+
+if (!is_array($authmodes)) {
+ syslog(LOG_WARNING, "No authentication server has been selected to authenticate against. Denying authentication for user {$username}");
+ if (isset($_GET['username'])) {
+ echo "FAILED";
+ closelog();
+ return;
+ } else {
+ closelog();
+ return (1);
+ }
+}
+
+$attributes = array();
+foreach ($authmodes as $authmode) {
+ $authcfg = auth_get_authserver($authmode);
+ if (!$authcfg && $authmode != "local") {
+ continue;
+ }
+
+ $authenticated = authenticate_user($username, $password, $authcfg, $attributes);
+ if ($authenticated == true) {
+ break;
+ }
+}
+
+if ($authenticated == false) {
+ syslog(LOG_WARNING, "user '{$username}' could not authenticate.\n");
+ if (isset($_GET['username'])) {
+ echo "FAILED";
+ closelog();
+ return;
+ } else {
+ closelog();
+ return (-1);
+ }
+}
+
+if (file_exists("/etc/inc/openvpn.attributes.php")) {
+ include_once("/etc/inc/openvpn.attributes.php");
+}
+
+$content = "";
+if (is_array($attributes['dns-servers'])) {
+ foreach ($attributes['dns-servers'] as $dnssrv) {
+ if (is_ipaddr($dnssrv)) {
+ $content .= "push \"dhcp-option DNS {$dnssrv}\"\n";
+ }
+ }
+}
+if (is_array($attributes['routes'])) {
+ foreach ($attributes['routes'] as $route) {
+ $content .= "push \"route {$route} vpn_gateway\"\n";
+ }
+}
+
+if (isset($attributes['framed_ip'])) {
+/* XXX: only use when TAP windows driver >= 8.2.x */
+/* if (isset($attributes['framed_mask'])) {
+ $content .= "topology subnet\n";
+ $content .= "ifconfig-push {$attributes['framed_ip']} {$attributes['framed_mask']}";
+ } else {
+*/
+ $content .= "topology net30\n";
+ $content .= "ifconfig-push {$attributes['framed_ip']} ". long2ip((ip2long($attributes['framed_ip']) + 1));
+// }
+}
+
+if (!empty($content)) {
+ @file_put_contents("{$g['tmp_path']}/{$username}", $content);
+}
+
+syslog(LOG_NOTICE, "user '{$username}' authenticated\n");
+closelog();
+
+if (isset($_GET['username'])) {
+ echo "OK";
+} else {
+ return (0);
+}
+
+?>
diff --git a/src/etc/inc/openvpn.inc b/src/etc/inc/openvpn.inc
new file mode 100644
index 0000000..d74aa3e
--- /dev/null
+++ b/src/etc/inc/openvpn.inc
@@ -0,0 +1,1589 @@
+<?php
+/*
+ openvpn.inc part of pfSense
+
+ Copyright (C) 2008 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Copyright (C) 2006 Fernando Lemos
+ All rights reserved.
+
+ This file was rewritten from scratch by Fernando Lemos but
+ *MIGHT* contain code previously written by:
+
+ Copyright (C) 2005 Peter Allgeyer <allgeyer_AT_web.de>
+ All rights reserved.
+
+ Copyright (C) 2004 Peter Curran (peter@closeconsultants.com).
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notices,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notices, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/openvpn /usr/bin/openssl /sbin/ifconfig
+ pfSense_MODULE: openvpn
+
+*/
+require_once('config.inc');
+require_once("certs.inc");
+require_once('pfsense-utils.inc');
+require_once("auth.inc");
+
+global $openvpn_prots;
+$openvpn_prots = array("UDP", "UDP6", "TCP", "TCP6");
+
+global $openvpn_dev_mode;
+$openvpn_dev_mode = array("tun", "tap");
+
+global $openvpn_verbosity_level;
+$openvpn_verbosity_level = array(
+ 0 => "none",
+ 1 => "default",
+ 2 => "2",
+ 3 => "3 (recommended)",
+ 4 => "4",
+ 5 => "5",
+ 6 => "6",
+ 7 => "7",
+ 8 => "8",
+ 9 => "9",
+ 10 => "10",
+ 11 => "11"
+);
+
+/*
+ * The User Auth mode below is disabled because
+ * OpenVPN erroneously requires that we provide
+ * a CA configuration parameter. In this mode,
+ * clients don't send a certificate so there is
+ * no need for a CA. If we require that admins
+ * provide one in the pfSense UI due to a bogus
+ * requirement imposed by OpenVPN, it could be
+ * considered very confusing ( I know I was ).
+ *
+ * -mgrooms
+ */
+
+global $openvpn_dh_lengths;
+$openvpn_dh_lengths = array(
+ 1024, 2048, 4096);
+
+global $openvpn_cert_depths;
+$openvpn_cert_depths = array(
+ 1 => "One (Client+Server)",
+ 2 => "Two (Client+Intermediate+Server)",
+ 3 => "Three (Client+2xIntermediate+Server)",
+ 4 => "Four (Client+3xIntermediate+Server)",
+ 5 => "Five (Client+4xIntermediate+Server)"
+);
+
+global $openvpn_server_modes;
+$openvpn_server_modes = array(
+ 'p2p_tls' => gettext("Peer to Peer ( SSL/TLS )"),
+ 'p2p_shared_key' => gettext("Peer to Peer ( Shared Key )"),
+ 'server_tls' => gettext("Remote Access ( SSL/TLS )"),
+ 'server_user' => gettext("Remote Access ( User Auth )"),
+ 'server_tls_user' => gettext("Remote Access ( SSL/TLS + User Auth )"));
+
+global $openvpn_client_modes;
+$openvpn_client_modes = array(
+ 'p2p_tls' => gettext("Peer to Peer ( SSL/TLS )"),
+ 'p2p_shared_key' => gettext("Peer to Peer ( Shared Key )"));
+
+global $openvpn_compression_modes;
+$openvpn_compression_modes = array(
+ '' => gettext("No Preference"),
+ 'no' => gettext("Disabled - No Compression"),
+ 'adaptive' => gettext("Enabled with Adaptive Compression"),
+ 'yes' => gettext("Enabled without Adaptive Compression"));
+
+function openvpn_create_key() {
+
+ $fp = popen("/usr/local/sbin/openvpn --genkey --secret /dev/stdout 2>/dev/null", "r");
+ if (!$fp) {
+ return false;
+ }
+
+ $rslt = stream_get_contents($fp);
+ pclose($fp);
+
+ return $rslt;
+}
+
+function openvpn_create_dhparams($bits) {
+
+ $fp = popen("/usr/bin/openssl dhparam {$bits} 2>/dev/null", "r");
+ if (!$fp) {
+ return false;
+ }
+
+ $rslt = stream_get_contents($fp);
+ pclose($fp);
+
+ return $rslt;
+}
+
+function openvpn_vpnid_used($vpnid) {
+ global $config;
+
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as & $settings) {
+ if ($vpnid == $settings['vpnid']) {
+ return true;
+ }
+ }
+ }
+
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as & $settings) {
+ if ($vpnid == $settings['vpnid']) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+function openvpn_vpnid_next() {
+
+ $vpnid = 1;
+ while (openvpn_vpnid_used($vpnid)) {
+ $vpnid++;
+ }
+
+ return $vpnid;
+}
+
+function openvpn_port_used($prot, $interface, $port, $curvpnid = 0) {
+ global $config;
+
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as & $settings) {
+ if (isset($settings['disable'])) {
+ continue;
+ }
+
+ if ($curvpnid != 0 && $curvpnid == $settings['vpnid']) {
+ continue;
+ }
+
+ if ($port == $settings['local_port'] && $prot == $settings['protocol'] &&
+ ($interface == $settings['interface'] || $interface == "any" || $settings['interface'] == "any")) {
+ return $settings['vpnid'];
+ }
+ }
+ }
+
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as & $settings) {
+ if (isset($settings['disable'])) {
+ continue;
+ }
+
+ if ($curvpnid != 0 && $curvpnid == $settings['vpnid']) {
+ continue;
+ }
+
+ if ($port == $settings['local_port'] && $prot == $settings['protocol'] &&
+ ($interface == $settings['interface'] || $interface == "any" || $settings['interface'] == "any")) {
+ return $settings['vpnid'];
+ }
+ }
+ }
+
+ return 0;
+}
+
+function openvpn_port_next($prot, $interface = "wan") {
+
+ $port = 1194;
+ while (openvpn_port_used($prot, $interface, $port)) {
+ $port++;
+ }
+ while (openvpn_port_used($prot, "any", $port)) {
+ $port++;
+ }
+
+ return $port;
+}
+
+function openvpn_get_cipherlist() {
+
+ $ciphers = array();
+ $cipher_out = shell_exec('/usr/local/sbin/openvpn --show-ciphers | /usr/bin/grep "default key" | /usr/bin/awk \'{print $1, "(" $2 "-" $3 ")";}\'');
+ $cipher_lines = explode("\n", trim($cipher_out));
+ sort($cipher_lines);
+ foreach ($cipher_lines as $line) {
+ $words = explode(' ', $line);
+ $ciphers[$words[0]] = "{$words[0]} {$words[1]}";
+ }
+ $ciphers["none"] = gettext("None (No Encryption)");
+ return $ciphers;
+}
+
+function openvpn_get_digestlist() {
+
+ $digests = array();
+ $digest_out = shell_exec('/usr/local/sbin/openvpn --show-digests | /usr/bin/grep "digest size" | /usr/bin/awk \'{print $1, "(" $2 "-" $3 ")";}\'');
+ $digest_lines = explode("\n", trim($digest_out));
+ sort($digest_lines);
+ foreach ($digest_lines as $line) {
+ $words = explode(' ', $line);
+ $digests[$words[0]] = "{$words[0]} {$words[1]}";
+ }
+ $digests["none"] = gettext("None (No Authentication)");
+ return $digests;
+}
+
+function openvpn_get_engines() {
+ $openssl_engines = array('none' => 'No Hardware Crypto Acceleration');
+ exec("/usr/bin/openssl engine -t -c", $openssl_engine_output);
+ $openssl_engine_output = implode("\n", $openssl_engine_output);
+ $openssl_engine_output = preg_replace("/\\n\\s+/", "|", $openssl_engine_output);
+ $openssl_engine_output = explode("\n", $openssl_engine_output);
+
+ foreach ($openssl_engine_output as $oeo) {
+ $keep = true;
+ $details = explode("|", $oeo);
+ $engine = array_shift($details);
+ $linematch = array();
+ preg_match("/\((.*)\)\s(.*)/", $engine, $linematch);
+ foreach ($details as $dt) {
+ if (strpos($dt, "unavailable") !== FALSE) {
+ $keep = false;
+ }
+ if (strpos($dt, "available") !== FALSE) {
+ continue;
+ }
+ if (strpos($dt, "[") !== FALSE) {
+ $ciphers = trim($dt, "[]");
+ }
+ }
+ if (!empty($ciphers)) {
+ $ciphers = " - " . $ciphers;
+ }
+ if (strlen($ciphers) > 60) {
+ $ciphers = substr($ciphers, 0, 60) . " ... ";
+ }
+ if ($keep) {
+ $openssl_engines[$linematch[1]] = $linematch[2] . $ciphers;
+ }
+ }
+ return $openssl_engines;
+}
+
+function openvpn_validate_engine($engine) {
+ $engines = openvpn_get_engines();
+ return array_key_exists($engine, $engines);
+}
+
+function openvpn_validate_host($value, $name) {
+ $value = trim($value);
+ if (empty($value) || (!is_domain($value) && !is_ipaddr($value))) {
+ return sprintf(gettext("The field '%s' must contain a valid IP address or domain name."), $name);
+ }
+ return false;
+}
+
+function openvpn_validate_port($value, $name) {
+ $value = trim($value);
+ if (empty($value) || !is_numeric($value) || $value < 0 || ($value > 65535)) {
+ return sprintf(gettext("The field '%s' must contain a valid port, ranging from 0 to 65535."), $name);
+ }
+ return false;
+}
+
+function openvpn_validate_cidr($value, $name, $multiple = false, $ipproto = "ipv4") {
+ $value = trim($value);
+ $error = false;
+ if (empty($value)) {
+ return false;
+ }
+ $networks = explode(',', $value);
+
+ if (!$multiple && (count($networks) > 1)) {
+ return sprintf(gettext("The field '%s' must contain a single valid %s CIDR range."), $name, $ipproto);
+ }
+
+ foreach ($networks as $network) {
+ if ($ipproto == "ipv4") {
+ $error = !openvpn_validate_cidr_ipv4($network);
+ } else {
+ $error = !openvpn_validate_cidr_ipv6($network);
+ }
+ if ($error) {
+ break;
+ }
+ }
+
+ if ($error) {
+ return sprintf(gettext("The field '%s' must contain only valid %s CIDR range(s) separated by commas."), $name, $ipproto);
+ } else {
+ return false;
+ }
+}
+
+function openvpn_validate_cidr_ipv4($value) {
+ $value = trim($value);
+ if (!empty($value)) {
+ list($ip, $mask) = explode('/', $value);
+ if (!is_ipaddrv4($ip) or !is_numeric($mask) or ($mask > 32) or ($mask < 0)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function openvpn_validate_cidr_ipv6($value) {
+ $value = trim($value);
+ if (!empty($value)) {
+ list($ipv6, $prefix) = explode('/', $value);
+ if (empty($prefix)) {
+ $prefix = "128";
+ }
+ if (!is_ipaddrv6($ipv6) or !is_numeric($prefix) or ($prefix > 128) or ($prefix < 0)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function openvpn_add_dhcpopts(& $settings, & $conf) {
+
+ if (!empty($settings['dns_domain'])) {
+ $conf .= "push \"dhcp-option DOMAIN {$settings['dns_domain']}\"\n";
+ }
+
+ if (!empty($settings['dns_server1'])) {
+ $conf .= "push \"dhcp-option DNS {$settings['dns_server1']}\"\n";
+ }
+ if (!empty($settings['dns_server2'])) {
+ $conf .= "push \"dhcp-option DNS {$settings['dns_server2']}\"\n";
+ }
+ if (!empty($settings['dns_server3'])) {
+ $conf .= "push \"dhcp-option DNS {$settings['dns_server3']}\"\n";
+ }
+ if (!empty($settings['dns_server4'])) {
+ $conf .= "push \"dhcp-option DNS {$settings['dns_server4']}\"\n";
+ }
+
+ if (!empty($settings['push_register_dns'])) {
+ $conf .= "push \"register-dns\"\n";
+ }
+
+ if (!empty($settings['ntp_server1'])) {
+ $conf .= "push \"dhcp-option NTP {$settings['ntp_server1']}\"\n";
+ }
+ if (!empty($settings['ntp_server2'])) {
+ $conf .= "push \"dhcp-option NTP {$settings['ntp_server2']}\"\n";
+ }
+
+ if ($settings['netbios_enable']) {
+
+ if (!empty($settings['dhcp_nbttype']) && ($settings['dhcp_nbttype'] != 0)) {
+ $conf .= "push \"dhcp-option NBT {$settings['dhcp_nbttype']}\"\n";
+ }
+ if (!empty($settings['dhcp_nbtscope'])) {
+ $conf .= "push \"dhcp-option NBS {$settings['dhcp_nbtscope']}\"\n";
+ }
+
+ if (!empty($settings['wins_server1'])) {
+ $conf .= "push \"dhcp-option WINS {$settings['wins_server1']}\"\n";
+ }
+ if (!empty($settings['wins_server2'])) {
+ $conf .= "push \"dhcp-option WINS {$settings['wins_server2']}\"\n";
+ }
+
+ if (!empty($settings['nbdd_server1'])) {
+ $conf .= "push \"dhcp-option NBDD {$settings['nbdd_server1']}\"\n";
+ }
+ }
+
+ if ($settings['gwredir']) {
+ $conf .= "push \"redirect-gateway def1\"\n";
+ }
+}
+
+function openvpn_add_custom(& $settings, & $conf) {
+
+ if ($settings['custom_options']) {
+
+ $options = explode(';', $settings['custom_options']);
+
+ if (is_array($options)) {
+ foreach ($options as $option) {
+ $conf .= "$option\n";
+ }
+ } else {
+ $conf .= "{$settings['custom_options']}\n";
+ }
+ }
+}
+
+function openvpn_add_keyfile(& $data, & $conf, $mode_id, $directive, $opt = "") {
+ global $g;
+
+ $fpath = $g['varetc_path']."/openvpn/{$mode_id}.{$directive}";
+ openvpn_create_dirs();
+ file_put_contents($fpath, base64_decode($data));
+ //chown($fpath, 'nobody');
+ //chgrp($fpath, 'nobody');
+ @chmod($fpath, 0600);
+
+ $conf .= "{$directive} {$fpath} {$opt}\n";
+}
+
+function openvpn_reconfigure($mode, $settings) {
+ global $g, $config;
+
+ if (empty($settings)) {
+ return;
+ }
+ if (isset($settings['disable'])) {
+ return;
+ }
+ openvpn_create_dirs();
+ /*
+ * NOTE: Deleting tap devices causes spontaneous reboots. Instead,
+ * we use a vpnid number which is allocated for a particular client
+ * or server configuration. ( see openvpn_vpnid_next() )
+ */
+
+ $vpnid = $settings['vpnid'];
+ $mode_id = $mode.$vpnid;
+
+ if (isset($settings['dev_mode'])) {
+ $tunname = "{$settings['dev_mode']}{$vpnid}";
+ } else {
+ /* defaults to tun */
+ $tunname = "tun{$vpnid}";
+ $settings['dev_mode'] = "tun";
+ }
+
+ if ($mode == "server") {
+ $devname = "ovpns{$vpnid}";
+ } else {
+ $devname = "ovpnc{$vpnid}";
+ }
+
+ /* is our device already configured */
+ if (!does_interface_exist($devname)) {
+
+ /* create the tap device if required */
+ if (!file_exists("/dev/{$tunname}")) {
+ exec("/sbin/ifconfig " . escapeshellarg($tunname) . " create");
+ }
+
+ /* rename the device */
+ mwexec("/sbin/ifconfig " . escapeshellarg($tunname) . " name " . escapeshellarg($devname));
+
+ /* add the device to the openvpn group and make sure it's UP*/
+ mwexec("/sbin/ifconfig " . escapeshellarg($devname) . " group openvpn up");
+
+ $ifname = convert_real_interface_to_friendly_interface_name($devname);
+ $grouptmp = link_interface_to_group($ifname);
+ if (!empty($grouptmp)) {
+ array_walk($grouptmp, 'interface_group_add_member');
+ }
+ unset($grouptmp, $ifname);
+ }
+
+ $pfile = $g['varrun_path'] . "/openvpn_{$mode_id}.pid";
+ $proto = strtolower($settings['protocol']);
+ if (substr($settings['protocol'], 0, 3) == "TCP") {
+ $proto = "{$proto}-{$mode}";
+ }
+ $dev_mode = $settings['dev_mode'];
+ $cipher = $settings['crypto'];
+ // OpenVPN defaults to SHA1, so use it when unset to maintain compatibility.
+ $digest = !empty($settings['digest']) ? $settings['digest'] : "SHA1";
+
+ $interface = get_failover_interface($settings['interface']);
+ // The IP address in the settings can be an IPv4 or IPv6 address associated with the interface
+ $ipaddr = $settings['ipaddr'];
+
+ // If a specific ip address (VIP) is requested, use it.
+ // Otherwise, if a specific interface is requested, use it
+ // If "any" interface was selected, local directive will be omitted.
+ if (is_ipaddrv4($ipaddr)) {
+ $iface_ip = $ipaddr;
+ } else {
+ if ((!empty($interface)) && (strcmp($interface, "any"))) {
+ $iface_ip=get_interface_ip($interface);
+ }
+ }
+ if (is_ipaddrv6($ipaddr)) {
+ $iface_ipv6 = $ipaddr;
+ } else {
+ if ((!empty($interface)) && (strcmp($interface, "any"))) {
+ $iface_ipv6=get_interface_ipv6($interface);
+ }
+ }
+
+
+ $conf = "dev {$devname}\n";
+ if (isset($settings['verbosity_level'])) {
+ $conf .= "verb {$settings['verbosity_level']}\n";
+ }
+
+ $conf .= "dev-type {$settings['dev_mode']}\n";
+ switch ($settings['dev_mode']) {
+ case "tun":
+ if (!$settings['no_tun_ipv6']) {
+ $conf .= "tun-ipv6\n";
+ }
+ break;
+ }
+ $conf .= "dev-node /dev/{$tunname}\n";
+ $conf .= "writepid {$pfile}\n";
+ $conf .= "#user nobody\n";
+ $conf .= "#group nobody\n";
+ $conf .= "script-security 3\n";
+ $conf .= "daemon\n";
+ $conf .= "keepalive 10 60\n";
+ $conf .= "ping-timer-rem\n";
+ $conf .= "persist-tun\n";
+ $conf .= "persist-key\n";
+ $conf .= "proto {$proto}\n";
+ $conf .= "cipher {$cipher}\n";
+ $conf .= "auth {$digest}\n";
+ $conf .= "up /usr/local/sbin/ovpn-linkup\n";
+ $conf .= "down /usr/local/sbin/ovpn-linkdown\n";
+ if (file_exists("/usr/local/sbin/openvpn.attributes.sh")) {
+ switch ($settings['mode']) {
+ case 'server_user':
+ case 'server_tls_user':
+ $conf .= "client-connect /usr/local/sbin/openvpn.attributes.sh\n";
+ $conf .= "client-disconnect /usr/local/sbin/openvpn.attributes.sh\n";
+ break;
+ }
+ }
+
+ /* Determine the local IP to use - and make sure it matches with the selected protocol. */
+ if (is_ipaddrv4($iface_ip) && (stristr($settings['protocol'], "6") === false)) {
+ $conf .= "local {$iface_ip}\n";
+ } elseif (is_ipaddrv6($iface_ipv6) && (stristr($settings['protocol'], "6") !== false)) {
+ $conf .= "local {$iface_ipv6}\n";
+ }
+
+ if (openvpn_validate_engine($settings['engine']) && ($settings['engine'] != "none")) {
+ $conf .= "engine {$settings['engine']}\n";
+ }
+
+ // server specific settings
+ if ($mode == 'server') {
+
+ list($ip, $cidr) = explode('/', $settings['tunnel_network']);
+ list($ipv6, $prefix) = explode('/', $settings['tunnel_networkv6']);
+ $mask = gen_subnet_mask($cidr);
+
+ // configure tls modes
+ switch ($settings['mode']) {
+ case 'p2p_tls':
+ case 'server_tls':
+ case 'server_user':
+ case 'server_tls_user':
+ $conf .= "tls-server\n";
+ break;
+ }
+
+ // configure p2p/server modes
+ switch ($settings['mode']) {
+ case 'p2p_tls':
+ // If the CIDR is less than a /30, OpenVPN will complain if you try to
+ // use the server directive. It works for a single client without it.
+ // See ticket #1417
+ if (!empty($ip) && !empty($mask) && ($cidr < 30)) {
+ $conf .= "server {$ip} {$mask}\n";
+ $conf .= "client-config-dir {$g['varetc_path']}/openvpn-csc\n";
+ if (is_ipaddr($ipv6)) {
+ $conf .= "server-ipv6 {$ipv6}/{$prefix}\n";
+ }
+ }
+ case 'p2p_shared_key':
+ if (!empty($ip) && !empty($mask)) {
+ list($ip1, $ip2) = openvpn_get_interface_ip($ip, $mask);
+ if ($settings['dev_mode'] == 'tun') {
+ $conf .= "ifconfig {$ip1} {$ip2}\n";
+ } else {
+ $conf .= "ifconfig {$ip1} {$mask}\n";
+ }
+ }
+ if (!empty($ipv6) && !empty($prefix)) {
+ list($ipv6_1, $ipv6_2) = openvpn_get_interface_ipv6($ipv6, $prefix);
+ if ($settings['dev_mode'] == 'tun') {
+ $conf .= "ifconfig-ipv6 {$ipv6_1} {$ipv6_2}\n";
+ } else {
+ $conf .= "ifconfig-ipv6 {$ipv6_1} {$prefix}\n";
+ }
+ }
+ break;
+ case 'server_tls':
+ case 'server_user':
+ case 'server_tls_user':
+ if (!empty($ip) && !empty($mask)) {
+ $conf .= "server {$ip} {$mask}\n";
+ if (is_ipaddr($ipv6)) {
+ $conf .= "server-ipv6 {$ipv6}/{$prefix}\n";
+ }
+ $conf .= "client-config-dir {$g['varetc_path']}/openvpn-csc\n";
+ } else {
+ if ($settings['serverbridge_dhcp']) {
+ if ((!empty($settings['serverbridge_interface'])) && (strcmp($settings['serverbridge_interface'], "none"))) {
+ $biface_ip=get_interface_ip($settings['serverbridge_interface']);
+ $biface_sm=gen_subnet_mask(get_interface_subnet($settings['serverbridge_interface']));
+ if (is_ipaddrv4($biface_ip) && is_ipaddrv4($settings['serverbridge_dhcp_start']) && is_ipaddrv4($settings['serverbridge_dhcp_end'])) {
+ $conf .= "server-bridge {$biface_ip} {$biface_sm} {$settings['serverbridge_dhcp_start']} {$settings['serverbridge_dhcp_end']}\n";
+ $conf .= "client-config-dir {$g['varetc_path']}/openvpn-csc\n";
+ } else {
+ $conf .= "mode server\n";
+ }
+ } else {
+ $conf .= "mode server\n";
+ }
+ }
+ }
+ break;
+ }
+
+ // configure user auth modes
+ switch ($settings['mode']) {
+ case 'server_user':
+ $conf .= "client-cert-not-required\n";
+ case 'server_tls_user':
+ /* username-as-common-name is not compatible with server-bridge */
+ if (stristr($conf, "server-bridge") === false) {
+ $conf .= "username-as-common-name\n";
+ }
+ if (!empty($settings['authmode'])) {
+ $strictusercn = "false";
+ if ($settings['strictusercn']) {
+ $strictusercn = "true";
+ }
+ $conf .= "auth-user-pass-verify \"/usr/local/sbin/ovpn_auth_verify user '{$settings['authmode']}' {$strictusercn} {$mode_id}\" via-env\n";
+ }
+ break;
+ }
+ if (!isset($settings['cert_depth']) && (strstr($settings['mode'], 'tls'))) {
+ $settings['cert_depth'] = 1;
+ }
+ if (is_numeric($settings['cert_depth'])) {
+ if (($mode == 'client') && empty($settings['certref'])) {
+ $cert = "";
+ } else {
+ $cert = lookup_cert($settings['certref']);
+ /* XXX: Seems not used at all! */
+ $servercn = urlencode(cert_get_cn($cert['crt']));
+ $conf .= "tls-verify \"/usr/local/sbin/ovpn_auth_verify tls '{$servercn}' {$settings['cert_depth']} \"\n";
+ }
+ }
+
+ // The local port to listen on
+ $conf .= "lport {$settings['local_port']}\n";
+
+ // The management port to listen on
+ // Use unix socket to overcome the problem on any type of server
+ $conf .= "management {$g['varetc_path']}/openvpn/{$mode_id}.sock unix\n";
+ //$conf .= "management 127.0.0.1 {$settings['local_port']}\n";
+
+ if ($settings['maxclients']) {
+ $conf .= "max-clients {$settings['maxclients']}\n";
+ }
+
+ // Can we push routes
+ if ($settings['local_network']) {
+ $conf .= openvpn_gen_routes($settings['local_network'], "ipv4", true);
+ }
+ if ($settings['local_networkv6']) {
+ $conf .= openvpn_gen_routes($settings['local_networkv6'], "ipv6", true);
+ }
+
+ switch ($settings['mode']) {
+ case 'server_tls':
+ case 'server_user':
+ case 'server_tls_user':
+ // Configure client dhcp options
+ openvpn_add_dhcpopts($settings, $conf);
+ if ($settings['client2client']) {
+ $conf .= "client-to-client\n";
+ }
+ break;
+ }
+ if (isset($settings['duplicate_cn'])) {
+ $conf .= "duplicate-cn\n";
+ }
+ }
+
+ // client specific settings
+
+ if ($mode == 'client') {
+
+ // configure p2p mode
+ switch ($settings['mode']) {
+ case 'p2p_tls':
+ $conf .= "tls-client\n";
+ case 'shared_key':
+ $conf .= "client\n";
+ break;
+ }
+
+ // If there is no bind option at all (ip and/or port), add "nobind" directive
+ // Otherwise, use the local port if defined, failing that, use lport 0 to
+ // ensure a random source port.
+ if ((empty($iface_ip)) && (!$settings['local_port'])) {
+ $conf .= "nobind\n";
+ } elseif ($settings['local_port']) {
+ $conf .= "lport {$settings['local_port']}\n";
+ } else {
+ $conf .= "lport 0\n";
+ }
+
+ // Use unix socket to overcome the problem on any type of server
+ $conf .= "management {$g['varetc_path']}/openvpn/{$mode_id}.sock unix\n";
+
+ // The remote server
+ $conf .= "remote {$settings['server_addr']} {$settings['server_port']}\n";
+
+ if (!empty($settings['use_shaper'])) {
+ $conf .= "shaper {$settings['use_shaper']}\n";
+ }
+
+ if (!empty($settings['tunnel_network'])) {
+ list($ip, $mask) = explode('/', $settings['tunnel_network']);
+ $mask = gen_subnet_mask($mask);
+ list($ip1, $ip2) = openvpn_get_interface_ip($ip, $mask);
+ if ($settings['dev_mode'] == 'tun') {
+ $conf .= "ifconfig {$ip2} {$ip1}\n";
+ } else {
+ $conf .= "ifconfig {$ip2} {$mask}\n";
+ }
+ }
+
+ if (!empty($settings['tunnel_networkv6'])) {
+ list($ipv6, $prefix) = explode('/', $settings['tunnel_networkv6']);
+ list($ipv6_1, $ipv6_2) = openvpn_get_interface_ipv6($ipv6, $prefix);
+ if ($settings['dev_mode'] == 'tun') {
+ $conf .= "ifconfig-ipv6 {$ipv6_2} {$ipv6_1}\n";
+ } else {
+ $conf .= "ifconfig-ipv6 {$ipv6_2} {$prefix}\n";
+ }
+ }
+
+ if ($settings['auth_user'] || $settings['auth_pass']) {
+ $up_file = "{$g['varetc_path']}/openvpn/{$mode_id}.up";
+ $conf .= "auth-user-pass {$up_file}\n";
+ if ($settings['auth_user']) {
+ $userpass = "{$settings['auth_user']}\n";
+ } else {
+ $userpass = "";
+ }
+ if ($settings['auth_pass']) {
+ $userpass .= "{$settings['auth_pass']}\n";
+ }
+ // If only auth_pass is given, then it acts like a user name and we put a blank line where pass would normally go.
+ if (!($settings['auth_user'] && $settings['auth_pass'])) {
+ $userpass .= "\n";
+ }
+ file_put_contents($up_file, $userpass);
+ }
+
+ if ($settings['proxy_addr']) {
+ $conf .= "http-proxy {$settings['proxy_addr']} {$settings['proxy_port']}";
+ if ($settings['proxy_authtype'] != "none") {
+ $conf .= " {$g['varetc_path']}/openvpn/{$mode_id}.pas {$settings['proxy_authtype']}";
+ $proxypas = "{$settings['proxy_user']}\n";
+ $proxypas .= "{$settings['proxy_passwd']}\n";
+ file_put_contents("{$g['varetc_path']}/openvpn/{$mode_id}.pas", $proxypas);
+ }
+ $conf .= " \n";
+ }
+ }
+
+ // Add a remote network route if set, and only for p2p modes.
+ if ((substr($settings['mode'], 0, 3) == "p2p") && (openvpn_validate_cidr($settings['remote_network'], "", true, "ipv4") === FALSE)) {
+ $conf .= openvpn_gen_routes($settings['remote_network'], "ipv4", false);
+ }
+ // Add a remote network route if set, and only for p2p modes.
+ if ((substr($settings['mode'], 0, 3) == "p2p") && (openvpn_validate_cidr($settings['remote_networkv6'], "", true, "ipv6") === FALSE)) {
+ $conf .= openvpn_gen_routes($settings['remote_networkv6'], "ipv6", false);
+ }
+
+ // Write the settings for the keys
+ switch ($settings['mode']) {
+ case 'p2p_shared_key':
+ openvpn_add_keyfile($settings['shared_key'], $conf, $mode_id, "secret");
+ break;
+ case 'p2p_tls':
+ case 'server_tls':
+ case 'server_tls_user':
+ case 'server_user':
+ $ca = lookup_ca($settings['caref']);
+ openvpn_add_keyfile($ca['crt'], $conf, $mode_id, "ca");
+
+ if (!empty($settings['certref'])) {
+ $cert = lookup_cert($settings['certref']);
+ openvpn_add_keyfile($cert['crt'], $conf, $mode_id, "cert");
+ openvpn_add_keyfile($cert['prv'], $conf, $mode_id, "key");
+ }
+ if ($mode == 'server') {
+ $conf .= "dh {$g['etc_path']}/dh-parameters.{$settings['dh_length']}\n";
+ }
+ if (!empty($settings['crlref'])) {
+ $crl = lookup_crl($settings['crlref']);
+ crl_update($crl);
+ openvpn_add_keyfile($crl['text'], $conf, $mode_id, "crl-verify");
+ }
+ if ($settings['tls']) {
+ if ($mode == "server") {
+ $tlsopt = 0;
+ } else {
+ $tlsopt = 1;
+ }
+ openvpn_add_keyfile($settings['tls'], $conf, $mode_id, "tls-auth", $tlsopt);
+ }
+ break;
+ }
+
+ if (!empty($settings['compression'])) {
+ $conf .= "comp-lzo {$settings['compression']}\n";
+ }
+
+ if ($settings['passtos']) {
+ $conf .= "passtos\n";
+ }
+
+ if ($settings['resolve_retry']) {
+ $conf .= "resolv-retry infinite\n";
+ } else if ($mode == 'clie} nt') {
+ $conf .= "resolv-retry infinite\n";
+ }
+
+ if ($settings['dynamic_ip']) {
+ $conf .= "persist-remote-ip\n";
+ $conf .= "float\n";
+ }
+
+ if ($settings['topology_subnet']) {
+ $conf .= "topology subnet\n";
+ }
+
+ // New client features
+ if ($mode == "client") {
+ // Dont pull routes checkbox
+ if ($settings['route_no_pull']) {
+ $conf .= "route-nopull\n";
+ }
+
+ // Dont add/remove routes checkbox
+ if ($settings['route_no_exec']) {
+ $conf .= "route-noexec\n";
+ }
+ }
+
+ openvpn_add_custom($settings, $conf);
+
+ openvpn_create_dirs();
+ $fpath = "{$g['varetc_path']}/openvpn/{$mode_id}.conf";
+ file_put_contents($fpath, $conf);
+ unset($conf);
+ $fpath = "{$g['varetc_path']}/openvpn/{$mode_id}.interface";
+ file_put_contents($fpath, $interface);
+ //chown($fpath, 'nobody');
+ //chgrp($fpath, 'nobody');
+ @chmod("{$g['varetc_path']}/openvpn/{$mode_id}.conf", 0600);
+ @chmod("{$g['varetc_path']}/openvpn/{$mode_id}.interface", 0600);
+ @chmod("{$g['varetc_path']}/openvpn/{$mode_id}.key", 0600);
+ @chmod("{$g['varetc_path']}/openvpn/{$mode_id}.tls-auth", 0600);
+ @chmod("{$g['varetc_path']}/openvpn/{$mode_id}.conf", 0600);
+}
+
+function openvpn_restart($mode, $settings) {
+ global $g, $config;
+
+ $vpnid = $settings['vpnid'];
+ $mode_id = $mode.$vpnid;
+
+ /* kill the process if running */
+ $pfile = $g['varrun_path']."/openvpn_{$mode_id}.pid";
+ if (file_exists($pfile)) {
+
+ /* read the pid file */
+ $pid = rtrim(file_get_contents($pfile));
+ unlink($pfile);
+
+ /* send a term signal to the process */
+ posix_kill($pid, SIGTERM);
+
+ /* wait until the process exits, or timeout and kill it */
+ $i = 0;
+ while (posix_kill($pid, 0)) {
+ usleep(250000);
+ if ($i > 10) {
+ log_error("OpenVPN ID $mode_id PID $pid still running, killing.");
+ posix_kill($pid, SIGKILL);
+ usleep(500000);
+ }
+ $i++;
+ }
+ }
+
+ if (isset($settings['disable'])) {
+ return;
+ }
+
+ /* Do not start a client if we are a CARP backup on this vip! */
+ if (($mode == "client") && (strstr($settings['interface'], "_vip") && get_carp_interface_status($settings['interface']) != "MASTER")) {
+ return;
+ }
+
+ /* Check if client is bound to a gateway group */
+ $a_groups = return_gateway_groups_array();
+ if (is_array($a_groups[$settings['interface']])) {
+ /* the interface is a gateway group. If a vip is defined and its a CARP backup then do not start */
+ if (($a_groups[$settings['interface']][0]['vip'] <> "") && (get_carp_interface_status($a_groups[$settings['interface']][0]['vip']) != "MASTER")) {
+ return;
+ }
+ }
+
+ /* start the new process */
+ $fpath = $g['varetc_path']."/openvpn/{$mode_id}.conf";
+ openvpn_clear_route($mode, $settings);
+ mwexec_bg("/usr/local/sbin/openvpn --config " . escapeshellarg($fpath));
+
+ if (!platform_booting()) {
+ send_event("filter reload");
+ }
+}
+
+function openvpn_delete($mode, & $settings) {
+ global $g, $config;
+
+ $vpnid = $settings['vpnid'];
+ $mode_id = $mode.$vpnid;
+
+ if (isset($settings['dev_mode'])) {
+ $tunname = "{$settings['dev_mode']}{$vpnid}";
+ } else {
+ /* defaults to tun */
+ $tunname = "tun{$vpnid}";
+ }
+
+ if ($mode == "server") {
+ $devname = "ovpns{$vpnid}";
+ } else {
+ $devname = "ovpnc{$vpnid}";
+ }
+
+ /* kill the process if running */
+ $pfile = "{$g['varrun_path']}/openvpn_{$mode_id}.pid";
+ if (file_exists($pfile)) {
+
+ /* read the pid file */
+ $pid = trim(file_get_contents($pfile));
+ unlink($pfile);
+
+ /* send a term signal to the process */
+ posix_kill($pid, SIGTERM);
+ }
+
+ /* remove the device from the openvpn group */
+ mwexec("/sbin/ifconfig " . escapeshellarg($devname) . " -group openvpn");
+
+ /* restore the original adapter name */
+ mwexec("/sbin/ifconfig " . escapeshellarg($devname) . " name " . escapeshellarg($tunname));
+
+ /* remove the configuration files */
+ @array_map('unlink', glob("{$g['varetc_path']}/openvpn/{$mode_id}.*"));
+}
+
+function openvpn_cleanup_csc($common_name) {
+ global $g, $config;
+ if (empty($common_name)) {
+ return;
+ }
+ $fpath = "{$g['varetc_path']}/openvpn-csc/" . basename($common_name);
+ if (is_file($fpath)) {
+ unlink_if_exists($fpath);
+ }
+ return;
+}
+
+function openvpn_resync_csc(& $settings) {
+ global $g, $config;
+
+ $fpath = $g['varetc_path']."/openvpn-csc/".$settings['common_name'];
+
+ if (isset($settings['disable'])) {
+ unlink_if_exists($fpath);
+ return;
+ }
+ openvpn_create_dirs();
+
+ $conf = '';
+ if ($settings['block']) {
+ $conf .= "disable\n";
+ }
+
+ if ($settings['push_reset']) {
+ $conf .= "push-reset\n";
+ }
+
+ if (!empty($settings['tunnel_network'])) {
+ list($ip, $mask) = explode('/', $settings['tunnel_network']);
+ $baselong = ip2long32($ip) & gen_subnet_mask_long($mask);
+ $serverip = long2ip32($baselong + 1);
+ $clientip = long2ip32($baselong + 2);
+ /* Because this is being pushed, the order from the client's point of view. */
+ if ($settings['dev_mode'] != 'tap') {
+ $conf .= "ifconfig-push {$clientip} {$serverip}\n";
+ } else {
+ $conf .= "ifconfig-push {$clientip} {$mask}\n";
+ }
+ }
+
+ if ($settings['local_network']) {
+ $conf .= openvpn_gen_routes($settings['local_network'], "ipv4", true);
+ }
+ if ($settings['local_networkv6']) {
+ $conf .= openvpn_gen_routes($settings['local_networkv6'], "ipv6", true);
+ }
+
+ // Add a remote network iroute if set
+ if (openvpn_validate_cidr($settings['remote_network'], "", true, "ipv4") === FALSE) {
+ $conf .= openvpn_gen_routes($settings['remote_network'], "ipv4", false, true);
+ }
+ // Add a remote network iroute if set
+ if (openvpn_validate_cidr($settings['remote_networkv6'], "", true, "ipv6") === FALSE) {
+ $conf .= openvpn_gen_routes($settings['remote_networkv6'], "ipv6", false, true);
+ }
+
+ openvpn_add_dhcpopts($settings, $conf);
+
+ if ($settings['gwredir']) {
+ $conf .= "push \"redirect-gateway def1\"\n";
+ }
+
+ openvpn_add_custom($settings, $conf);
+
+ file_put_contents($fpath, $conf);
+ chown($fpath, 'nobody');
+ chgrp($fpath, 'nobody');
+}
+
+function openvpn_delete_csc(& $settings) {
+ global $g, $config;
+
+ $fpath = $g['varetc_path']."/openvpn-csc/".$settings['common_name'];
+ unlink_if_exists($fpath);
+}
+
+// Resync the configuration and restart the VPN
+function openvpn_resync($mode, $settings) {
+ openvpn_reconfigure($mode, $settings);
+ openvpn_restart($mode, $settings);
+}
+
+// Resync and restart all VPNs
+function openvpn_resync_all($interface = "") {
+ global $g, $config;
+
+ openvpn_create_dirs();
+
+ if (!is_array($config['openvpn'])) {
+ $config['openvpn'] = array();
+ }
+
+/*
+ if (!$config['openvpn']['dh-parameters']) {
+ echo "Configuring OpenVPN Parameters ...\n";
+ $dh_parameters = openvpn_create_dhparams(1024);
+ $dh_parameters = base64_encode($dh_parameters);
+ $config['openvpn']['dh-parameters'] = $dh_parameters;
+ write_config("OpenVPN DH parameters");
+ }
+
+ $path_ovdh = $g['varetc_path']."/openvpn/dh-parameters";
+ if (!file_exists($path_ovdh)) {
+ $dh_parameters = $config['openvpn']['dh-parameters'];
+ $dh_parameters = base64_decode($dh_parameters);
+ file_put_contents($path_ovdh, $dh_parameters);
+ }
+*/
+ if ($interface <> "") {
+ log_error("Resyncing OpenVPN instances for interface " . convert_friendly_interface_to_friendly_descr($interface) . ".");
+ } else {
+ log_error("Resyncing OpenVPN instances.");
+ }
+
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as & $settings) {
+ if ($interface <> "" && $interface != $settings['interface']) {
+ continue;
+ }
+ openvpn_resync('server', $settings);
+ }
+ }
+
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as & $settings) {
+ if ($interface <> "" && $interface != $settings['interface']) {
+ continue;
+ }
+ openvpn_resync('client', $settings);
+ }
+ }
+
+ if (is_array($config['openvpn']['openvpn-csc'])) {
+ foreach ($config['openvpn']['openvpn-csc'] as & $settings) {
+ openvpn_resync_csc($settings);
+ }
+ }
+
+}
+
+// Resync and restart all VPNs using a gateway group.
+function openvpn_resync_gwgroup($gwgroupname = "") {
+ global $g, $config;
+
+ if ($gwgroupname <> "") {
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as & $settings) {
+ if ($gwgroupname == $settings['interface']) {
+ log_error("Resyncing OpenVPN for gateway group " . $gwgroupname . " server " . $settings["description"] . ".");
+ openvpn_resync('server', $settings);
+ }
+ }
+ }
+
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as & $settings) {
+ if ($gwgroupname == $settings['interface']) {
+ log_error("Resyncing OpenVPN for gateway group " . $gwgroupname . " client " . $settings["description"] . ".");
+ openvpn_resync('client', $settings);
+ }
+ }
+ }
+
+ // Note: no need to resysnc Client Specific (csc) here, as changes to the OpenVPN real interface do not effect these.
+
+ } else {
+ log_error("openvpn_resync_gwgroup called with null gwgroup parameter.");
+ }
+}
+
+function openvpn_get_active_servers($type="multipoint") {
+ global $config, $g;
+
+ $servers = array();
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as & $settings) {
+ if (empty($settings) || isset($settings['disable'])) {
+ continue;
+ }
+
+ $prot = $settings['protocol'];
+ $port = $settings['local_port'];
+
+ $server = array();
+ $server['port'] = ($settings['local_port']) ? $settings['local_port'] : 1194;
+ $server['mode'] = $settings['mode'];
+ if ($settings['description']) {
+ $server['name'] = "{$settings['description']} {$prot}:{$port}";
+ } else {
+ $server['name'] = "Server {$prot}:{$port}";
+ }
+ $server['conns'] = array();
+ $server['vpnid'] = $settings['vpnid'];
+ $server['mgmt'] = "server{$server['vpnid']}";
+ $socket = "unix://{$g['varetc_path']}/openvpn/{$server['mgmt']}.sock";
+ list($tn, $sm) = explode('/', $settings['tunnel_network']);
+
+ if ((($server['mode'] == "p2p_shared_key") || ($sm >= 30)) && ($type == "p2p")) {
+ $servers[] = openvpn_get_client_status($server, $socket);
+ } elseif (($server['mode'] != "p2p_shared_key") && ($type == "multipoint") && ($sm < 30)) {
+ $servers[] = openvpn_get_server_status($server, $socket);
+ }
+ }
+ }
+ return $servers;
+}
+
+function openvpn_get_server_status($server, $socket) {
+ $errval;
+ $errstr;
+ $fp = @stream_socket_client($socket, $errval, $errstr, 1);
+ if ($fp) {
+ stream_set_timeout($fp, 1);
+
+ /* send our status request */
+ fputs($fp, "status 2\n");
+
+ /* recv all response lines */
+ while (!feof($fp)) {
+
+ /* read the next line */
+ $line = fgets($fp, 1024);
+
+ $info = stream_get_meta_data($fp);
+ if ($info['timed_out']) {
+ break;
+ }
+
+ /* parse header list line */
+ if (strstr($line, "HEADER")) {
+ continue;
+ }
+
+ /* parse end of output line */
+ if (strstr($line, "END") || strstr($line, "ERROR")) {
+ break;
+ }
+
+ /* parse client list line */
+ if (strstr($line, "CLIENT_LIST")) {
+ $list = explode(",", $line);
+ $conn = array();
+ $conn['common_name'] = $list[1];
+ $conn['remote_host'] = $list[2];
+ $conn['virtual_addr'] = $list[3];
+ $conn['bytes_recv'] = $list[4];
+ $conn['bytes_sent'] = $list[5];
+ $conn['connect_time'] = $list[6];
+ $server['conns'][] = $conn;
+ }
+ /* parse routing table lines */
+ if (strstr($line, "ROUTING_TABLE")) {
+ $list = explode(",", $line);
+ $conn = array();
+ $conn['virtual_addr'] = $list[1];
+ $conn['common_name'] = $list[2];
+ $conn['remote_host'] = $list[3];
+ $conn['last_time'] = $list[4];
+ $server['routes'][] = $conn;
+ }
+ }
+
+ /* cleanup */
+ fclose($fp);
+ } else {
+ $conn = array();
+ $conn['common_name'] = "[error]";
+ $conn['remote_host'] = "Unable to contact daemon";
+ $conn['virtual_addr'] = "Service not running?";
+ $conn['bytes_recv'] = 0;
+ $conn['bytes_sent'] = 0;
+ $conn['connect_time'] = 0;
+ $server['conns'][] = $conn;
+ }
+ return $server;
+}
+
+function openvpn_get_active_clients() {
+ global $config, $g;
+
+ $clients = array();
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as & $settings) {
+
+ if (empty($settings) || isset($settings['disable'])) {
+ continue;
+ }
+
+ $prot = $settings['protocol'];
+ $port = ($settings['local_port']) ? ":{$settings['local_port']}" : "";
+
+ $client = array();
+ $client['port'] = $settings['local_port'];
+ if ($settings['description']) {
+ $client['name'] = "{$settings['description']} {$prot}{$port}";
+ } else {
+ $client['name'] = "Client {$prot}{$port}";
+ }
+
+ $client['vpnid'] = $settings['vpnid'];
+ $client['mgmt'] = "client{$client['vpnid']}";
+ $socket = "unix://{$g['varetc_path']}/openvpn/{$client['mgmt']}.sock";
+ $client['status'] = "down";
+
+ $clients[] = openvpn_get_client_status($client, $socket);
+ }
+ }
+ return $clients;
+}
+
+function openvpn_get_client_status($client, $socket) {
+ $errval;
+ $errstr;
+ $fp = @stream_socket_client($socket, $errval, $errstr, 1);
+ if ($fp) {
+ stream_set_timeout($fp, 1);
+ /* send our status request */
+ fputs($fp, "state 1\n");
+
+ /* recv all response lines */
+ while (!feof($fp)) {
+ /* read the next line */
+ $line = fgets($fp, 1024);
+
+ $info = stream_get_meta_data($fp);
+ if ($info['timed_out']) {
+ break;
+ }
+
+ /* Get the client state */
+ if (strstr($line, "CONNECTED")) {
+ $client['status'] = "up";
+ $list = explode(",", $line);
+
+ $client['connect_time'] = date("D M j G:i:s Y", $list[0]);
+ $client['virtual_addr'] = $list[3];
+ $client['remote_host'] = $list[4];
+ }
+ if (strstr($line, "CONNECTING")) {
+ $client['status'] = "connecting";
+ }
+ if (strstr($line, "ASSIGN_IP")) {
+ $client['status'] = "waiting";
+ $list = explode(",", $line);
+
+ $client['connect_time'] = date("D M j G:i:s Y", $list[0]);
+ $client['virtual_addr'] = $list[3];
+ }
+ if (strstr($line, "RECONNECTING")) {
+ $client['status'] = "reconnecting";
+ $list = explode(",", $line);
+
+ $client['connect_time'] = date("D M j G:i:s Y", $list[0]);
+ $client['status'] .= "; " . $list[2];
+ }
+ /* parse end of output line */
+ if (strstr($line, "END") || strstr($line, "ERROR")) {
+ break;
+ }
+ }
+
+ /* If up, get read/write stats */
+ if (strcmp($client['status'], "up") == 0) {
+ fputs($fp, "status 2\n");
+ /* recv all response lines */
+ while (!feof($fp)) {
+ /* read the next line */
+ $line = fgets($fp, 1024);
+
+ $info = stream_get_meta_data($fp);
+ if ($info['timed_out']) {
+ break;
+ }
+
+ if (strstr($line, "TCP/UDP read bytes")) {
+ $list = explode(",", $line);
+ $client['bytes_recv'] = $list[1];
+ }
+
+ if (strstr($line, "TCP/UDP write bytes")) {
+ $list = explode(",", $line);
+ $client['bytes_sent'] = $list[1];
+ }
+
+ /* parse end of output line */
+ if (strstr($line, "END")) {
+ break;
+ }
+ }
+ }
+
+ fclose($fp);
+
+ } else {
+ $DisplayNote=true;
+ $client['remote_host'] = "Unable to contact daemon";
+ $client['virtual_addr'] = "Service not running?";
+ $client['bytes_recv'] = 0;
+ $client['bytes_sent'] = 0;
+ $client['connect_time'] = 0;
+ }
+ return $client;
+}
+
+function openvpn_refresh_crls() {
+ global $g, $config;
+
+ openvpn_create_dirs();
+
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $settings) {
+ if (empty($settings)) {
+ continue;
+ }
+ if (isset($settings['disable'])) {
+ continue;
+ }
+ // Write the settings for the keys
+ switch ($settings['mode']) {
+ case 'p2p_tls':
+ case 'server_tls':
+ case 'server_tls_user':
+ case 'server_user':
+ if (!empty($settings['crlref'])) {
+ $crl = lookup_crl($settings['crlref']);
+ crl_update($crl);
+ $fpath = $g['varetc_path']."/openvpn/server{$settings['vpnid']}.crl-verify";
+ file_put_contents($fpath, base64_decode($crl['text']));
+ @chmod($fpath, 0644);
+ }
+ break;
+ }
+ }
+ }
+}
+
+function openvpn_create_dirs() {
+ global $g;
+ if (!is_dir("{$g['varetc_path']}/openvpn")) {
+ safe_mkdir("{$g['varetc_path']}/openvpn", 0750);
+ }
+ if (!is_dir("{$g['varetc_path']}/openvpn-csc")) {
+ safe_mkdir("{$g['varetc_path']}/openvpn-csc", 0750);
+ }
+}
+
+function openvpn_get_interface_ip($ip, $mask) {
+ $baselong = ip2long32($ip) & ip2long($mask);
+ $ip1 = long2ip32($baselong + 1);
+ $ip2 = long2ip32($baselong + 2);
+ return array($ip1, $ip2);
+}
+
+function openvpn_get_interface_ipv6($ipv6, $prefix) {
+ $basev6 = gen_subnetv6($ipv6, $prefix);
+ // Is there a better way to do this math?
+ $ipv6_arr = explode(':', $basev6);
+ $last = hexdec(array_pop($ipv6_arr));
+ $ipv6_1 = Net_IPv6::compress(Net_IPv6::uncompress(implode(':', $ipv6_arr) . ':' . dechex($last + 1)));
+ $ipv6_2 = Net_IPv6::compress(Net_IPv6::uncompress(implode(':', $ipv6_arr) . ':' . dechex($last + 2)));
+ return array($ipv6_1, $ipv6_2);
+}
+
+function openvpn_clear_route($mode, $settings) {
+ if (empty($settings['tunnel_network'])) {
+ return;
+ }
+ list($ip, $cidr) = explode('/', $settings['tunnel_network']);
+ $mask = gen_subnet_mask($cidr);
+ $clear_route = false;
+
+ switch ($settings['mode']) {
+ case 'shared_key':
+ $clear_route = true;
+ break;
+ case 'p2p_tls':
+ case 'p2p_shared_key':
+ if ($cidr == 30) {
+ $clear_route = true;
+ }
+ break;
+ }
+
+ if ($clear_route && !empty($ip) && !empty($mask)) {
+ list($ip1, $ip2) = openvpn_get_interface_ip($ip, $mask);
+ $ip_to_clear = ($mode == "server") ? $ip1 : $ip2;
+ /* XXX: Family for route? */
+ mwexec("/sbin/route -q delete {$ip_to_clear}");
+ }
+}
+
+function openvpn_gen_routes($value, $ipproto = "ipv4", $push = false, $iroute = false) {
+ $routes = "";
+ if (empty($value)) {
+ return "";
+ }
+ $networks = explode(',', $value);
+
+ foreach ($networks as $network) {
+ if ($ipproto == "ipv4") {
+ $route = openvpn_gen_route_ipv4($network, $iroute);
+ } else {
+ $route = openvpn_gen_route_ipv6($network, $iroute);
+ }
+
+ if ($push) {
+ $routes .= "push \"{$route}\"\n";
+ } else {
+ $routes .= "{$route}\n";
+ }
+ }
+ return $routes;
+}
+
+function openvpn_gen_route_ipv4($network, $iroute = false) {
+ $i = ($iroute) ? "i" : "";
+ list($ip, $mask) = explode('/', trim($network));
+ $mask = gen_subnet_mask($mask);
+ return "{$i}route $ip $mask";
+}
+
+function openvpn_gen_route_ipv6($network, $iroute = false) {
+ $i = ($iroute) ? "i" : "";
+ list($ipv6, $prefix) = explode('/', trim($network));
+ if (empty($prefix)) {
+ $prefix = "128";
+ }
+ return "{$i}route-ipv6 ${ipv6}/${prefix}";
+}
+
+function openvpn_get_settings($mode, $vpnid) {
+ global $config;
+
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $settings) {
+ if (isset($settings['disable'])) {
+ continue;
+ }
+
+ if ($vpnid != 0 && $vpnid == $settings['vpnid']) {
+ return $settings;
+ }
+ }
+ }
+
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as $settings) {
+ if (isset($settings['disable'])) {
+ continue;
+ }
+
+ if ($vpnid != 0 && $vpnid == $settings['vpnid']) {
+ return $settings;
+ }
+ }
+ }
+
+ return array();
+}
+
+function openvpn_restart_by_vpnid($mode, $vpnid) {
+ $settings = openvpn_get_settings($mode, $vpnid);
+ openvpn_restart($mode, $settings);
+}
+
+?>
diff --git a/src/etc/inc/openvpn.tls-verify.php b/src/etc/inc/openvpn.tls-verify.php
new file mode 100644
index 0000000..9e21342
--- /dev/null
+++ b/src/etc/inc/openvpn.tls-verify.php
@@ -0,0 +1,97 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ openvpn.tls-verify.php
+
+ Copyright (C) 2011 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+/*
+ pfSense_BUILDER_BINARIES:
+ pfSense_MODULE: openvpn
+*/
+/*
+ * OpenVPN calls this script to validate a certificate
+ * This script is called ONCE per DEPTH of the certificate chain
+ * Normal operation would have two runs - one for the server certificate
+ * and one for the client certificate. Beyond that, you're dealing with
+ * intermediates.
+ */
+
+require_once("globals.inc");
+require_once("config.inc");
+require_once("interfaces.inc");
+
+openlog("openvpn", LOG_ODELAY, LOG_AUTH);
+
+/* read data from command line */
+if (isset($_GET['certdepth'])) {
+ $cert_depth = $_GET['certdepth'];
+ $cert_subject = urldecode($_GET['certsubject']);
+ $allowed_depth = $_GET['depth'];
+ $server_cn = $_GET['servercn'];
+} else {
+ $cert_depth = intval($argv[1]);
+ $cert_subject = $argv[2];
+}
+
+/* Reserved for future use in case we decide to verify CNs and such as well
+$subj = explode("/", $cert_subject);
+foreach ($subj at $s) {
+ list($n, $v) = explode("=", $s);
+ if ($n == "CN") {
+ $common_name = $v;
+ }
+}
+*/
+
+/* Replaced by sed with proper variables used below ( $server_cn and $allowed_depth ). */
+//<template>
+
+if (isset($allowed_depth) && ($cert_depth > $allowed_depth)) {
+ syslog(LOG_WARNING, "Certificate depth {$cert_depth} exceeded max allowed depth of {$allowed_depth}.\n");
+ if (isset($_GET['certdepth'])) {
+ echo "FAILED";
+ closelog();
+ return;
+ } else {
+ closelog();
+ exit(1);
+ }
+}
+
+// Debug
+//syslog(LOG_WARNING, "Found certificate {$argv[2]} with depth {$cert_depth}\n");
+
+closelog();
+if (isset($_GET['certdepth'])) {
+ echo "OK";
+} else {
+ exit(0);
+}
+
+?>
diff --git a/src/etc/inc/pfsense-utils.inc b/src/etc/inc/pfsense-utils.inc
new file mode 100644
index 0000000..91988c7
--- /dev/null
+++ b/src/etc/inc/pfsense-utils.inc
@@ -0,0 +1,3211 @@
+<?php
+/****h* pfSense/pfsense-utils
+ NAME
+ pfsense-utils.inc - Utilities specific to pfSense
+ DESCRIPTION
+ This include contains various pfSense specific functions.
+ HISTORY
+ $Id$
+
+ Copyright (C) 2004-2007 Scott Ullrich (sullrich@gmail.com)
+ All rights reserved.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig /sbin/pfctl /usr/local/bin/php-cgi /usr/bin/netstat
+ pfSense_BUILDER_BINARIES: /bin/df /usr/bin/grep /usr/bin/awk /bin/rm /usr/sbin/pwd_mkdb /usr/bin/host
+ pfSense_BUILDER_BINARIES: /sbin/kldload
+ pfSense_MODULE: utils
+*/
+
+/****f* pfsense-utils/have_natpfruleint_access
+ * NAME
+ * have_natpfruleint_access
+ * INPUTS
+ * none
+ * RESULT
+ * returns true if user has access to edit a specific firewall nat port forward interface
+ ******/
+function have_natpfruleint_access($if) {
+ $security_url = "firewall_nat_edit.php?if=". strtolower($if);
+ if (isAllowedPage($security_url, $allowed)) {
+ return true;
+ }
+ return false;
+}
+
+/****f* pfsense-utils/have_ruleint_access
+ * NAME
+ * have_ruleint_access
+ * INPUTS
+ * none
+ * RESULT
+ * returns true if user has access to edit a specific firewall interface
+ ******/
+function have_ruleint_access($if) {
+ $security_url = "firewall_rules.php?if=". strtolower($if);
+ if (isAllowedPage($security_url)) {
+ return true;
+ }
+ return false;
+}
+
+/****f* pfsense-utils/does_url_exist
+ * NAME
+ * does_url_exist
+ * INPUTS
+ * none
+ * RESULT
+ * returns true if a url is available
+ ******/
+function does_url_exist($url) {
+ $fd = fopen("$url", "r");
+ if ($fd) {
+ fclose($fd);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/****f* pfsense-utils/is_private_ip
+ * NAME
+ * is_private_ip
+ * INPUTS
+ * none
+ * RESULT
+ * returns true if an ip address is in a private range
+ ******/
+function is_private_ip($iptocheck) {
+ $isprivate = false;
+ $ip_private_list = array(
+ "10.0.0.0/8",
+ "100.64.0.0/10",
+ "172.16.0.0/12",
+ "192.168.0.0/16",
+ );
+ foreach ($ip_private_list as $private) {
+ if (ip_in_subnet($iptocheck, $private) == true) {
+ $isprivate = true;
+ }
+ }
+ return $isprivate;
+}
+
+/****f* pfsense-utils/get_tmp_file
+ * NAME
+ * get_tmp_file
+ * INPUTS
+ * none
+ * RESULT
+ * returns a temporary filename
+ ******/
+function get_tmp_file() {
+ global $g;
+ return "{$g['tmp_path']}/tmp-" . time();
+}
+
+/****f* pfsense-utils/get_dns_servers
+ * NAME
+ * get_dns_servers - get system dns servers
+ * INPUTS
+ * none
+ * RESULT
+ * $dns_servers - an array of the dns servers
+ ******/
+function get_dns_servers() {
+ $dns_servers = array();
+ if (file_exists("/etc/resolv.conf")) {
+ $dns_s = file("/etc/resolv.conf", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ }
+ if (is_array($dns_s)) {
+ foreach ($dns_s as $dns) {
+ $matches = "";
+ if (preg_match("/nameserver (.*)/", $dns, $matches)) {
+ $dns_servers[] = $matches[1];
+ }
+ }
+ }
+ return array_unique($dns_servers);
+}
+
+function hardware_offloading_applyflags($iface) {
+ global $config;
+
+ $flags_on = 0;
+ $flags_off = 0;
+ $options = pfSense_get_interface_addresses($iface);
+
+ if (isset($config['system']['disablechecksumoffloading'])) {
+ if (isset($options['encaps']['txcsum'])) {
+ $flags_off |= IFCAP_TXCSUM;
+ }
+ if (isset($options['encaps']['rxcsum'])) {
+ $flags_off |= IFCAP_RXCSUM;
+ }
+ } else {
+ if (isset($options['caps']['txcsum'])) {
+ $flags_on |= IFCAP_TXCSUM;
+ }
+ if (isset($options['caps']['rxcsum'])) {
+ $flags_on |= IFCAP_RXCSUM;
+ }
+ }
+
+ if (isset($config['system']['disablesegmentationoffloading'])) {
+ $flags_off |= IFCAP_TSO;
+ } else if (isset($options['caps']['tso']) || isset($options['caps']['tso4']) || isset($options['caps']['tso6'])) {
+ $flags_on |= IFCAP_TSO;
+ }
+
+ if (isset($config['system']['disablelargereceiveoffloading'])) {
+ $flags_off |= IFCAP_LRO;
+ } else if (isset($options['caps']['lro'])) {
+ $flags_on |= IFCAP_LRO;
+ }
+
+ /* if the NIC supports polling *AND* it is enabled in the GUI */
+ if (!isset($config['system']['polling'])) {
+ $flags_off |= IFCAP_POLLING;
+ } else if (isset($options['caps']['polling'])) {
+ $flags_on |= IFCAP_POLLING;
+ }
+
+ pfSense_interface_capabilities($iface, -$flags_off);
+ pfSense_interface_capabilities($iface, $flags_on);
+}
+
+/****f* pfsense-utils/enable_hardware_offloading
+ * NAME
+ * enable_hardware_offloading - Enable a NIC's supported hardware features.
+ * INPUTS
+ * $interface - string containing the physical interface to work on.
+ * RESULT
+ * null
+ * NOTES
+ * This function only supports the fxp driver's loadable microcode.
+ ******/
+function enable_hardware_offloading($interface) {
+ global $g, $config;
+
+ $int = get_real_interface($interface);
+ if (empty($int)) {
+ return;
+ }
+
+ if (!isset($config['system']['do_not_use_nic_microcode'])) {
+ /* translate wan, lan, opt -> real interface if needed */
+ $int_family = preg_split("/[0-9]+/", $int);
+ $supported_ints = array('fxp');
+ if (in_array($int_family, $supported_ints)) {
+ if (does_interface_exist($int)) {
+ pfSense_interface_flags($int, IFF_LINK0);
+ }
+ }
+ }
+
+ /* This is mostly for vlans and ppp types */
+ $realhwif = get_parent_interface($interface);
+ if ($realhwif[0] == $int) {
+ hardware_offloading_applyflags($int);
+ } else {
+ hardware_offloading_applyflags($realhwif[0]);
+ hardware_offloading_applyflags($int);
+ }
+}
+
+/****f* pfsense-utils/interface_supports_polling
+ * NAME
+ * checks to see if an interface supports polling according to man polling
+ * INPUTS
+ *
+ * RESULT
+ * true or false
+ * NOTES
+ *
+ ******/
+function interface_supports_polling($iface) {
+ $opts = pfSense_get_interface_addresses($iface);
+ if (is_array($opts) && isset($opts['caps']['polling'])) {
+ return true;
+ }
+
+ return false;
+}
+
+/****f* pfsense-utils/is_alias_inuse
+ * NAME
+ * checks to see if an alias is currently in use by a rule
+ * INPUTS
+ *
+ * RESULT
+ * true or false
+ * NOTES
+ *
+ ******/
+function is_alias_inuse($alias) {
+ global $g, $config;
+
+ if ($alias == "") {
+ return false;
+ }
+ /* loop through firewall rules looking for alias in use */
+ if (is_array($config['filter']['rule'])) {
+ foreach ($config['filter']['rule'] as $rule) {
+ if ($rule['source']['address']) {
+ if ($rule['source']['address'] == $alias) {
+ return true;
+ }
+ }
+ if ($rule['destination']['address']) {
+ if ($rule['destination']['address'] == $alias) {
+ return true;
+ }
+ }
+ }
+ }
+ /* loop through nat rules looking for alias in use */
+ if (is_array($config['nat']['rule'])) {
+ foreach ($config['nat']['rule'] as $rule) {
+ if ($rule['target'] && $rule['target'] == $alias) {
+ return true;
+ }
+ if ($rule['source']['address'] && $rule['source']['address'] == $alias) {
+ return true;
+ }
+ if ($rule['destination']['address'] && $rule['destination']['address'] == $alias) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/****f* pfsense-utils/is_schedule_inuse
+ * NAME
+ * checks to see if a schedule is currently in use by a rule
+ * INPUTS
+ *
+ * RESULT
+ * true or false
+ * NOTES
+ *
+ ******/
+function is_schedule_inuse($schedule) {
+ global $g, $config;
+
+ if ($schedule == "") {
+ return false;
+ }
+ /* loop through firewall rules looking for schedule in use */
+ if (is_array($config['filter']['rule'])) {
+ foreach ($config['filter']['rule'] as $rule) {
+ if ($rule['sched'] == $schedule) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/****f* pfsense-utils/setup_polling
+ * NAME
+ * sets up polling
+ * INPUTS
+ *
+ * RESULT
+ * null
+ * NOTES
+ *
+ ******/
+function setup_polling() {
+ global $g, $config;
+
+ if (isset($config['system']['polling'])) {
+ set_single_sysctl("kern.polling.idle_poll", "1");
+ } else {
+ set_single_sysctl("kern.polling.idle_poll", "0");
+ }
+
+ if ($config['system']['polling_each_burst']) {
+ set_single_sysctl("kern.polling.each_burst", $config['system']['polling_each_burst']);
+ }
+ if ($config['system']['polling_burst_max']) {
+ set_single_sysctl("kern.polling.burst_max", $config['system']['polling_burst_max']);
+ }
+ if ($config['system']['polling_user_frac']) {
+ set_single_sysctl("kern.polling.user_frac", $config['system']['polling_user_frac']);
+ }
+}
+
+/****f* pfsense-utils/setup_microcode
+ * NAME
+ * enumerates all interfaces and calls enable_hardware_offloading which
+ * enables a NIC's supported hardware features.
+ * INPUTS
+ *
+ * RESULT
+ * null
+ * NOTES
+ * This function only supports the fxp driver's loadable microcode.
+ ******/
+function setup_microcode() {
+
+ /* if list */
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if => $ifdescr) {
+ enable_hardware_offloading($if);
+ }
+ unset($iflist);
+}
+
+/****f* pfsense-utils/get_carp_status
+ * NAME
+ * get_carp_status - Return whether CARP is enabled or disabled.
+ * RESULT
+ * boolean - true if CARP is enabled, false if otherwise.
+ ******/
+function get_carp_status() {
+ /* grab the current status of carp */
+ $status = get_single_sysctl('net.inet.carp.allow');
+ return (intval($status) > 0);
+}
+
+/*
+ * convert_ip_to_network_format($ip, $subnet): converts an ip address to network form
+
+ */
+function convert_ip_to_network_format($ip, $subnet) {
+ $ipsplit = explode('.', $ip);
+ $string = $ipsplit[0] . "." . $ipsplit[1] . "." . $ipsplit[2] . ".0/" . $subnet;
+ return $string;
+}
+
+/*
+ * get_carp_interface_status($carpinterface): returns the status of a carp ip
+ */
+function get_carp_interface_status($carpinterface) {
+
+ $interface = get_real_interface($interface);
+ $carp_query = '';
+ $_gb = exec("/sbin/ifconfig $interface | /usr/bin/grep -v grep | /usr/bin/grep carp: | /usr/bin/head -n 1", $carp_query);
+ foreach ($carp_query as $int) {
+ if (stripos($int, "MASTER")) {
+ return "MASTER";
+ }
+ if (stripos($int, "BACKUP")) {
+ return "BACKUP";
+ }
+ if (stripos($int, "INIT")) {
+ return "INIT";
+ }
+ }
+ return;
+}
+
+/*
+ * get_pfsync_interface_status($pfsyncinterface): returns the status of a pfsync
+ */
+function get_pfsync_interface_status($pfsyncinterface) {
+ if (!does_interface_exist($pfsyncinterface)) {
+ return;
+ }
+
+ return exec_command("/sbin/ifconfig {$pfsyncinterface} | /usr/bin/awk '/pfsync:/ {print \$5}'");
+}
+
+/*
+ * add_rule_to_anchor($anchor, $rule): adds the specified rule to an anchor
+ */
+function add_rule_to_anchor($anchor, $rule, $label) {
+ mwexec("echo " . escapeshellarg($rule) . " | /sbin/pfctl -a " . escapeshellarg($anchor) . ":" . escapeshellarg($label) . " -f -");
+}
+
+/*
+ * remove_text_from_file
+ * remove $text from file $file
+ */
+function remove_text_from_file($file, $text) {
+ if (!file_exists($file) && !is_writable($file)) {
+ return;
+ }
+ $filecontents = file_get_contents($file);
+ $text = str_replace($text, "", $filecontents);
+ @file_put_contents($file, $text);
+}
+
+/*
+ * after_sync_bump_adv_skew(): create skew values by 1S
+ */
+function after_sync_bump_adv_skew() {
+ global $config, $g;
+ $processed_skew = 1;
+ $a_vip = &$config['virtualip']['vip'];
+ foreach ($a_vip as $vipent) {
+ if ($vipent['advskew'] <> "") {
+ $processed_skew = 1;
+ $vipent['advskew'] = $vipent['advskew']+1;
+ }
+ }
+ if ($processed_skew == 1) {
+ write_config(gettext("After synch increase advertising skew"));
+ }
+}
+
+/*
+ * get_filename_from_url($url): converts a url to its filename.
+ */
+function get_filename_from_url($url) {
+ return basename($url);
+}
+
+/*
+ * get_dir: return an array of $dir
+ */
+function get_dir($dir) {
+ $dir_array = array();
+ $d = dir($dir);
+ while (false !== ($entry = $d->read())) {
+ array_push($dir_array, $entry);
+ }
+ $d->close();
+ return $dir_array;
+}
+
+/****f* pfsense-utils/WakeOnLan
+ * NAME
+ * WakeOnLan - Wake a machine up using the wake on lan format/protocol
+ * RESULT
+ * true/false - true if the operation was successful
+ ******/
+function WakeOnLan($addr, $mac) {
+ $addr_byte = explode(':', $mac);
+ $hw_addr = '';
+
+ for ($a = 0; $a < 6; $a++) {
+ $hw_addr .= chr(hexdec($addr_byte[$a]));
+ }
+
+ $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
+
+ for ($a = 1; $a <= 16; $a++) {
+ $msg .= $hw_addr;
+ }
+
+ // send it to the broadcast address using UDP
+ $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
+ if ($s == false) {
+ log_error(gettext("Error creating socket!"));
+ log_error(sprintf(gettext("Error code is '%1\$s' - %2\$s"), socket_last_error($s), socket_strerror(socket_last_error($s))));
+ } else {
+ // setting a broadcast option to socket:
+ $opt_ret = socket_set_option($s, 1, 6, TRUE);
+ if ($opt_ret < 0) {
+ log_error(sprintf(gettext("setsockopt() failed, error: %s"), strerror($opt_ret)));
+ }
+ $e = socket_sendto($s, $msg, strlen($msg), 0, $addr, 2050);
+ socket_close($s);
+ log_error(sprintf(gettext('Magic Packet sent (%1$s) to {%2$s} MAC=%3$s'), $e, $addr, $mac));
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * reverse_strrchr($haystack, $needle): Return everything in $haystack up to the *last* instance of $needle.
+ * Useful for finding paths and stripping file extensions.
+ */
+function reverse_strrchr($haystack, $needle) {
+ if (!is_string($haystack)) {
+ return;
+ }
+ return strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) +1) : false;
+}
+
+/*
+ * backup_config_section($section): returns as an xml file string of
+ * the configuration section
+ */
+function backup_config_section($section_name) {
+ global $config;
+ $new_section = &$config[$section_name];
+ /* generate configuration XML */
+ $xmlconfig = dump_xml_config($new_section, $section_name);
+ $xmlconfig = str_replace("<?xml version=\"1.0\"?>", "", $xmlconfig);
+ return $xmlconfig;
+}
+
+/*
+ * restore_config_section($section_name, new_contents): restore a configuration section,
+ * and write the configuration out
+ * to disk/cf.
+ */
+function restore_config_section($section_name, $new_contents) {
+ global $config, $g;
+ conf_mount_rw();
+ $fout = fopen("{$g['tmp_path']}/tmpxml", "w");
+ fwrite($fout, $new_contents);
+ fclose($fout);
+
+ $xml = parse_xml_config($g['tmp_path'] . "/tmpxml", null);
+ if ($xml['pfsense']) {
+ $xml = $xml['pfsense'];
+ }
+ else if ($xml['m0n0wall']) {
+ $xml = $xml['m0n0wall'];
+ }
+ if ($xml[$section_name]) {
+ $section_xml = $xml[$section_name];
+ } else {
+ $section_xml = -1;
+ }
+
+ @unlink($g['tmp_path'] . "/tmpxml");
+ if ($section_xml === -1) {
+ return false;
+ }
+ $config[$section_name] = &$section_xml;
+ if (file_exists("{$g['tmp_path']}/config.cache")) {
+ unlink("{$g['tmp_path']}/config.cache");
+ }
+ write_config(sprintf(gettext("Restored %s of config file (maybe from CARP partner)"), $section_name));
+ disable_security_checks();
+ conf_mount_ro();
+ return true;
+}
+
+/*
+ * merge_config_section($section_name, new_contents): restore a configuration section,
+ * and write the configuration out
+ * to disk/cf. But preserve the prior
+ * structure if needed
+ */
+function merge_config_section($section_name, $new_contents) {
+ global $config;
+ conf_mount_rw();
+ $fname = get_tmp_filename();
+ $fout = fopen($fname, "w");
+ fwrite($fout, $new_contents);
+ fclose($fout);
+ $section_xml = parse_xml_config($fname, $section_name);
+ $config[$section_name] = $section_xml;
+ unlink($fname);
+ write_config(sprintf(gettext("Restored %s of config file (maybe from CARP partner)"), $section_name));
+ disable_security_checks();
+ conf_mount_ro();
+ return;
+}
+
+/*
+ * http_post($server, $port, $url, $vars): does an http post to a web server
+ * posting the vars array.
+ * written by nf@bigpond.net.au
+ */
+function http_post($server, $port, $url, $vars) {
+ $user_agent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)";
+ $urlencoded = "";
+ while (list($key, $value) = each($vars)) {
+ $urlencoded .= urlencode($key) . "=" . urlencode($value) . "&";
+ }
+ $urlencoded = substr($urlencoded, 0, -1);
+ $content_length = strlen($urlencoded);
+ $headers = "POST $url HTTP/1.1
+Accept: */*
+Accept-Language: en-au
+Content-Type: application/x-www-form-urlencoded
+User-Agent: $user_agent
+Host: $server
+Connection: Keep-Alive
+Cache-Control: no-cache
+Content-Length: $content_length
+
+";
+
+ $errno = "";
+ $errstr = "";
+ $fp = fsockopen($server, $port, $errno, $errstr);
+ if (!$fp) {
+ return false;
+ }
+
+ fputs($fp, $headers);
+ fputs($fp, $urlencoded);
+
+ $ret = "";
+ while (!feof($fp)) {
+ $ret .= fgets($fp, 1024);
+ }
+ fclose($fp);
+
+ return $ret;
+}
+
+/*
+ * php_check_syntax($code_tocheck, $errormessage): checks $code_to_check for errors
+ */
+if (!function_exists('php_check_syntax')) {
+ global $g;
+ function php_check_syntax($code_to_check, &$errormessage) {
+ return false;
+ $fout = fopen("{$g['tmp_path']}/codetocheck.php", "w");
+ $code = $_POST['content'];
+ $code = str_replace("<?php", "", $code);
+ $code = str_replace("?>", "", $code);
+ fwrite($fout, "<?php\n\n");
+ fwrite($fout, $code_to_check);
+ fwrite($fout, "\n\n?>\n");
+ fclose($fout);
+ $command = "/usr/local/bin/php-cgi -l {$g['tmp_path']}/codetocheck.php";
+ $output = exec_command($command);
+ if (stristr($output, "Errors parsing") == false) {
+ echo "false\n";
+ $errormessage = '';
+ return(false);
+ } else {
+ $errormessage = $output;
+ return(true);
+ }
+ }
+}
+
+/*
+ * php_check_filename_syntax($filename, $errormessage): checks the file $filename for errors
+ */
+if (!function_exists('php_check_syntax')) {
+ function php_check_syntax($code_to_check, &$errormessage) {
+ return false;
+ $command = "/usr/local/bin/php-cgi -l " . escapeshellarg($code_to_check);
+ $output = exec_command($command);
+ if (stristr($output, "Errors parsing") == false) {
+ echo "false\n";
+ $errormessage = '';
+ return(false);
+ } else {
+ $errormessage = $output;
+ return(true);
+ }
+ }
+}
+
+/*
+ * rmdir_recursive($path, $follow_links=false)
+ * Recursively remove a directory tree (rm -rf path)
+ * This is for directories _only_
+ */
+function rmdir_recursive($path, $follow_links=false) {
+ $to_do = glob($path);
+ if (!is_array($to_do)) {
+ $to_do = array($to_do);
+ }
+ foreach ($to_do as $workingdir) { // Handle wildcards by foreaching.
+ if (file_exists($workingdir)) {
+ if (is_dir($workingdir)) {
+ $dir = opendir($workingdir);
+ while ($entry = readdir($dir)) {
+ if (is_file("$workingdir/$entry") || ((!$follow_links) && is_link("$workingdir/$entry"))) {
+ unlink("$workingdir/$entry");
+ } elseif (is_dir("$workingdir/$entry") && $entry != '.' && $entry != '..') {
+ rmdir_recursive("$workingdir/$entry");
+ }
+ }
+ closedir($dir);
+ rmdir($workingdir);
+ } elseif (is_file($workingdir)) {
+ unlink($workingdir);
+ }
+ }
+ }
+ return;
+}
+
+/*
+ * call_pfsense_method(): Call a method exposed by the pfsense.org XMLRPC server.
+ */
+function call_pfsense_method($method, $params, $timeout = 0) {
+ global $g, $config;
+
+ $xmlrpc_base_url = get_active_xml_rpc_base_url();
+ $xmlrpc_path = $g['xmlrpcpath'];
+
+ $xmlrpcfqdn = preg_replace("(https?://)", "", $xmlrpc_base_url);
+ $ip = gethostbyname($xmlrpcfqdn);
+ if ($ip == $xmlrpcfqdn) {
+ return false;
+ }
+
+ $msg = new XML_RPC_Message($method, array(XML_RPC_Encode($params)));
+ $port = 0;
+ $proxyurl = "";
+ $proxyport = 0;
+ $proxyuser = "";
+ $proxypass = "";
+ if (!empty($config['system']['proxyurl'])) {
+ $proxyurl = $config['system']['proxyurl'];
+ }
+ if (!empty($config['system']['proxyport']) && is_numeric($config['system']['proxyport'])) {
+ $proxyport = $config['system']['proxyport'];
+ }
+ if (!empty($config['system']['proxyuser'])) {
+ $proxyuser = $config['system']['proxyuser'];
+ }
+ if (!empty($config['system']['proxypass'])) {
+ $proxypass = $config['system']['proxypass'];
+ }
+ $cli = new XML_RPC_Client($xmlrpc_path, $xmlrpc_base_url, $port, $proxyurl, $proxyport, $proxyuser, $proxypass);
+ // If the ALT PKG Repo has a username/password set, use it.
+ if ($config['system']['altpkgrepo']['username'] &&
+ $config['system']['altpkgrepo']['password']) {
+ $username = $config['system']['altpkgrepo']['username'];
+ $password = $config['system']['altpkgrepo']['password'];
+ $cli->setCredentials($username, $password);
+ }
+ $resp = $cli->send($msg, $timeout);
+ if (!is_object($resp)) {
+ log_error(sprintf(gettext("XMLRPC communication error: %s"), $cli->errstr));
+ return false;
+ } elseif ($resp->faultCode()) {
+ log_error(sprintf(gettext('XMLRPC request failed with error %1$s: %2$s'), $resp->faultCode(), $resp->faultString()));
+ return false;
+ } else {
+ return XML_RPC_Decode($resp->value());
+ }
+}
+
+/*
+ * check_firmware_version(): Check whether the current firmware installed is the most recently released.
+ */
+function check_firmware_version($tocheck = "all", $return_php = true) {
+ global $g, $config;
+
+ $xmlrpc_base_url = get_active_xml_rpc_base_url();
+ $xmlrpcfqdn = preg_replace("(https?://)", "", $xmlrpc_base_url);
+ $ip = gethostbyname($xmlrpcfqdn);
+ if ($ip == $xmlrpcfqdn) {
+ return false;
+ }
+ $version = php_uname('r');
+ $version = explode('-', $version);
+ $rawparams = array("firmware" => array("version" => $g['product_version']),
+ "kernel" => array("version" => $version[0]),
+ "base" => array("version" => $version[0]),
+ "platform" => trim(file_get_contents('/etc/platform')),
+ "config_version" => $config['version']
+ );
+ unset($version);
+
+ if ($tocheck == "all") {
+ $params = $rawparams;
+ } else {
+ foreach ($tocheck as $check) {
+ $params['check'] = $rawparams['check'];
+ $params['platform'] = $rawparams['platform'];
+ }
+ }
+ if ($config['system']['firmware']['branch']) {
+ $params['branch'] = $config['system']['firmware']['branch'];
+ }
+
+ /* XXX: What is this method? */
+ if (!($versions = call_pfsense_method('pfsense.get_firmware_version', $params))) {
+ return false;
+ } else {
+ $versions["current"] = $params;
+ }
+
+ return $versions;
+}
+
+/*
+ * host_firmware_version(): Return the versions used in this install
+ */
+function host_firmware_version($tocheck = "") {
+ global $g, $config;
+
+ $os_version = trim(substr(php_uname("r"), 0, strpos(php_uname("r"), '-')));
+
+ return array(
+ "firmware" => array("version" => $g['product_version']),
+ "kernel" => array("version" => $os_version),
+ "base" => array("version" => $os_version),
+ "platform" => trim(file_get_contents('/etc/platform', " \n")),
+ "config_version" => $config['version']
+ );
+}
+
+function get_disk_info() {
+ $diskout = "";
+ exec("/bin/df -h | /usr/bin/grep -w '/' | /usr/bin/awk '{ print $2, $3, $4, $5 }'", $diskout);
+ return explode(' ', $diskout[0]);
+}
+
+/****f* pfsense-utils/strncpy
+ * NAME
+ * strncpy - copy strings
+ * INPUTS
+ * &$dst, $src, $length
+ * RESULT
+ * none
+ ******/
+function strncpy(&$dst, $src, $length) {
+ if (strlen($src) > $length) {
+ $dst = substr($src, 0, $length);
+ } else {
+ $dst = $src;
+ }
+}
+
+/****f* pfsense-utils/reload_interfaces_sync
+ * NAME
+ * reload_interfaces - reload all interfaces
+ * INPUTS
+ * none
+ * RESULT
+ * none
+ ******/
+function reload_interfaces_sync() {
+ global $config, $g;
+
+ if ($g['debug']) {
+ log_error(gettext("reload_interfaces_sync() is starting."));
+ }
+
+ /* parse config.xml again */
+ $config = parse_config(true);
+
+ /* enable routing */
+ system_routing_enable();
+ if ($g['debug']) {
+ log_error(gettext("Enabling system routing"));
+ }
+
+ if ($g['debug']) {
+ log_error(gettext("Cleaning up Interfaces"));
+ }
+
+ /* set up interfaces */
+ interfaces_configure();
+}
+
+/****f* pfsense-utils/reload_all
+ * NAME
+ * reload_all - triggers a reload of all settings
+ * * INPUTS
+ * none
+ * RESULT
+ * none
+ ******/
+function reload_all() {
+ send_event("service reload all");
+}
+
+/****f* pfsense-utils/reload_interfaces
+ * NAME
+ * reload_interfaces - triggers a reload of all interfaces
+ * INPUTS
+ * none
+ * RESULT
+ * none
+ ******/
+function reload_interfaces() {
+ send_event("interface all reload");
+}
+
+/****f* pfsense-utils/reload_all_sync
+ * NAME
+ * reload_all - reload all settings
+ * * INPUTS
+ * none
+ * RESULT
+ * none
+ ******/
+function reload_all_sync() {
+ global $config, $g;
+
+ /* parse config.xml again */
+ $config = parse_config(true);
+
+ /* set up our timezone */
+ system_timezone_configure();
+
+ /* set up our hostname */
+ system_hostname_configure();
+
+ /* make hosts file */
+ system_hosts_generate();
+
+ /* generate resolv.conf */
+ system_resolvconf_generate();
+
+ /* enable routing */
+ system_routing_enable();
+
+ /* set up interfaces */
+ interfaces_configure();
+
+ /* start dyndns service */
+ services_dyndns_configure();
+
+ /* configure cron service */
+ configure_cron();
+
+ /* start the NTP client */
+ system_ntp_configure();
+
+ /* sync pw database */
+ conf_mount_rw();
+ unlink_if_exists("/etc/spwd.db.tmp");
+ mwexec("/usr/sbin/pwd_mkdb -d /etc/ /etc/master.passwd");
+ conf_mount_ro();
+
+ /* restart sshd */
+ send_event("service restart sshd");
+
+ /* restart webConfigurator if needed */
+ send_event("service restart webgui");
+}
+
+function setup_serial_port($when = "save", $path = "") {
+ global $g, $config;
+ conf_mount_rw();
+ $ttys_file = "{$path}/etc/ttys";
+ $boot_config_file = "{$path}/boot.config";
+ $loader_conf_file = "{$path}/boot/loader.conf";
+ /* serial console - write out /boot.config */
+ if (file_exists($boot_config_file)) {
+ $boot_config = file_get_contents($boot_config_file);
+ } else {
+ $boot_config = "";
+ }
+
+ $serialspeed = (is_numeric($config['system']['serialspeed'])) ? $config['system']['serialspeed'] : "115200";
+ if ($g['platform'] != "cdrom") {
+ $serial_only = false;
+
+ if (($g['platform'] == "nanobsd") && !file_exists("/etc/nano_use_vga.txt")) {
+ $serial_only = true;
+ } else {
+ $specific_platform = system_identify_specific_platform();
+ if ($specific_platform['name'] == 'RCC-VE' ||
+ $specific_platform['name'] == 'RCC-DFF') {
+ $serial_only = true;
+ }
+ }
+
+ $boot_config_split = explode("\n", $boot_config);
+ $fd = fopen($boot_config_file, "w");
+ if ($fd) {
+ foreach ($boot_config_split as $bcs) {
+ if (stristr($bcs, "-D") || stristr($bcs, "-h")) {
+ /* DONT WRITE OUT, WE'LL DO IT LATER */
+ } else {
+ if ($bcs <> "") {
+ fwrite($fd, "{$bcs}\n");
+ }
+ }
+ }
+ if ($serial_only === true) {
+ fwrite($fd, "-S{$serialspeed} -h");
+ } else if (is_serial_enabled()) {
+ fwrite($fd, "-S{$serialspeed} -D");
+ }
+ fclose($fd);
+ }
+
+ /* serial console - write out /boot/loader.conf */
+ if ($when == "upgrade") {
+ system("echo \"Reading {$loader_conf_file}...\" >> /conf/upgrade_log.txt");
+ }
+ $boot_config = file_get_contents($loader_conf_file);
+ $boot_config_split = explode("\n", $boot_config);
+ if (count($boot_config_split) > 0) {
+ $new_boot_config = array();
+ // Loop through and only add lines that are not empty, and which
+ // do not contain a console directive.
+ foreach ($boot_config_split as $bcs) {
+ if (!empty($bcs) &&
+ (stripos($bcs, "console") === false) &&
+ (stripos($bcs, "boot_multicons") === false) &&
+ (stripos($bcs, "boot_serial") === false) &&
+ (stripos($bcs, "hw.usb.no_pf") === false) &&
+ (stripos($bcs, "hint.uart.0.flags") === false) &&
+ (stripos($bcs, "hint.uart.1.flags") === false)) {
+ $new_boot_config[] = $bcs;
+ }
+ }
+
+ if ($serial_only === true) {
+ $new_boot_config[] = 'boot_serial="YES"';
+ $new_boot_config[] = 'console="comconsole"';
+ } else if (is_serial_enabled()) {
+ $new_boot_config[] = 'boot_multicons="YES"';
+ $new_boot_config[] = 'boot_serial="YES"';
+ $primaryconsole = isset($g['primaryconsole_force']) ? $g['primaryconsole_force'] : $config['system']['primaryconsole'];
+ switch ($primaryconsole) {
+ case "video":
+ $new_boot_config[] = 'console="vidconsole,comconsole"';
+ break;
+ case "serial":
+ default:
+ $new_boot_config[] = 'console="comconsole,vidconsole"';
+ }
+ }
+ $new_boot_config[] = 'comconsole_speed="' . $serialspeed . '"';
+
+ $specplatform = system_identify_specific_platform();
+ if ($specplatform['name'] == 'RCC-VE' ||
+ $specplatform['name'] == 'RCC-DFF') {
+ $new_boot_config[] = 'comconsole_port="0x2F8"';
+ $new_boot_config[] = 'hint.uart.0.flags="0x00"';
+ $new_boot_config[] = 'hint.uart.1.flags="0x10"';
+ }
+ $new_boot_config[] = 'hw.usb.no_pf="1"';
+
+ file_put_contents($loader_conf_file, implode("\n", $new_boot_config) . "\n");
+ }
+ }
+ $ttys = file_get_contents($ttys_file);
+ $ttys_split = explode("\n", $ttys);
+ $fd = fopen($ttys_file, "w");
+
+ $on_off = (is_serial_enabled() ? 'onifconsole' : 'off');
+
+ if (isset($config['system']['disableconsolemenu'])) {
+ $console_type = 'Pc';
+ $serial_type = 'std.' . $serialspeed;
+ } else {
+ $console_type = 'al.Pc';
+ $serial_type = 'al.' . $serialspeed;
+ }
+ foreach ($ttys_split as $tty) {
+ if (stristr($tty, "ttyv0")) {
+ fwrite($fd, "ttyv0 \"/usr/libexec/getty {$console_type}\" cons25 on secure\n");
+ } else if (stristr($tty, "ttyu")) {
+ $ttyn = substr($tty, 0, 5);
+ fwrite($fd, "{$ttyn} \"/usr/libexec/getty {$serial_type}\" cons25 {$on_off} secure\n");
+ } else {
+ fwrite($fd, $tty . "\n");
+ }
+ }
+ unset($on_off, $console_type, $serial_type);
+ fclose($fd);
+ if ($when != "upgrade") {
+ reload_ttys();
+ }
+
+ conf_mount_ro();
+ return;
+}
+
+function is_serial_enabled() {
+ global $g, $config;
+
+ if (!isset($g['enableserial_force']) &&
+ !isset($config['system']['enableserial']) &&
+ ($g['platform'] == "pfSense" || $g['platform'] == "cdrom" || file_exists("/etc/nano_use_vga.txt"))) {
+ return false;
+ }
+
+ return true;
+}
+
+function reload_ttys() {
+ // Send a HUP signal to init will make it reload /etc/ttys
+ posix_kill(1, SIGHUP);
+}
+
+function print_value_list($list, $count = 10, $separator = ",") {
+ $list = implode($separator, array_slice($list, 0, $count));
+ if (count($list) < $count) {
+ $list .= ".";
+ } else {
+ $list .= "...";
+ }
+ return $list;
+}
+
+/* DHCP enabled on any interfaces? */
+function is_dhcp_server_enabled() {
+ global $config;
+
+ if (!is_array($config['dhcpd'])) {
+ return false;
+ }
+
+ foreach ($config['dhcpd'] as $dhcpif => $dhcpifconf) {
+ if (isset($dhcpifconf['enable']) && !empty($config['interfaces'][$dhcpif])) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/* DHCP enabled on any interfaces? */
+function is_dhcpv6_server_enabled() {
+ global $config;
+
+ if (is_array($config['interfaces'])) {
+ foreach ($config['interfaces'] as $ifcfg) {
+ if (isset($ifcfg['enable']) && !empty($ifcfg['track6-interface'])) {
+ return true;
+ }
+ }
+ }
+
+ if (!is_array($config['dhcpdv6'])) {
+ return false;
+ }
+
+ foreach ($config['dhcpdv6'] as $dhcpv6if => $dhcpv6ifconf) {
+ if (isset($dhcpv6ifconf['enable']) && !empty($config['interfaces'][$dhcpv6if])) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/* radvd enabled on any interfaces? */
+function is_radvd_enabled() {
+ global $config;
+
+ if (!is_array($config['dhcpdv6'])) {
+ $config['dhcpdv6'] = array();
+ }
+
+ $dhcpdv6cfg = $config['dhcpdv6'];
+ $Iflist = get_configured_interface_list();
+
+ /* handle manually configured DHCP6 server settings first */
+ foreach ($dhcpdv6cfg as $dhcpv6if => $dhcpv6ifconf) {
+ if (!isset($config['interfaces'][$dhcpv6if]['enable'])) {
+ continue;
+ }
+
+ if (!isset($dhcpv6ifconf['ramode'])) {
+ $dhcpv6ifconf['ramode'] = $dhcpv6ifconf['mode'];
+ }
+
+ if ($dhcpv6ifconf['ramode'] == "disabled") {
+ continue;
+ }
+
+ $ifcfgipv6 = get_interface_ipv6($dhcpv6if);
+ if (!is_ipaddrv6($ifcfgipv6)) {
+ continue;
+ }
+
+ return true;
+ }
+
+ /* handle DHCP-PD prefixes and 6RD dynamic interfaces */
+ foreach ($Iflist as $if => $ifdescr) {
+ if (!isset($config['interfaces'][$if]['track6-interface'])) {
+ continue;
+ }
+ if (!isset($config['interfaces'][$if]['enable'])) {
+ continue;
+ }
+
+ $ifcfgipv6 = get_interface_ipv6($if);
+ if (!is_ipaddrv6($ifcfgipv6)) {
+ continue;
+ }
+
+ $ifcfgsnv6 = get_interface_subnetv6($if);
+ $subnetv6 = gen_subnetv6($ifcfgipv6, $ifcfgsnv6);
+
+ if (!is_ipaddrv6($subnetv6)) {
+ continue;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+/* Any PPPoE servers enabled? */
+function is_pppoe_server_enabled() {
+ global $config;
+
+ $pppoeenable = false;
+
+ if (!is_array($config['pppoes']) || !is_array($config['pppoes']['pppoe'])) {
+ return false;
+ }
+
+ foreach ($config['pppoes']['pppoe'] as $pppoes) {
+ if ($pppoes['mode'] == 'server') {
+ $pppoeenable = true;
+ }
+ }
+
+ return $pppoeenable;
+}
+
+function convert_seconds_to_hms($sec) {
+ $min = $hrs = 0;
+ if ($sec != 0) {
+ $min = floor($sec/60);
+ $sec %= 60;
+ }
+ if ($min != 0) {
+ $hrs = floor($min/60);
+ $min %= 60;
+ }
+ if ($sec < 10) {
+ $sec = "0".$sec;
+ }
+ if ($min < 10) {
+ $min = "0".$min;
+ }
+ if ($hrs < 10) {
+ $hrs = "0".$hrs;
+ }
+ $result = $hrs.":".$min.":".$sec;
+ return $result;
+}
+
+/* Compute the total uptime from the ppp uptime log file in the conf directory */
+
+function get_ppp_uptime($port) {
+ if (file_exists("/conf/{$port}.log")) {
+ $saved_time = file_get_contents("/conf/{$port}.log");
+ $uptime_data = explode("\n", $saved_time);
+ $sec = 0;
+ foreach ($uptime_data as $upt) {
+ $sec += substr($upt, 1 + strpos($upt, " "));
+ }
+ return convert_seconds_to_hms($sec);
+ } else {
+ $total_time = gettext("No history data found!");
+ return $total_time;
+ }
+}
+
+//returns interface information
+function get_interface_info($ifdescr) {
+ global $config, $g;
+
+ $ifinfo = array();
+ if (empty($config['interfaces'][$ifdescr])) {
+ return;
+ }
+ $ifinfo['hwif'] = $config['interfaces'][$ifdescr]['if'];
+ $ifinfo['if'] = get_real_interface($ifdescr);
+
+ $chkif = $ifinfo['if'];
+ $ifinfotmp = pfSense_get_interface_addresses($chkif);
+ $ifinfo['status'] = $ifinfotmp['status'];
+ if (empty($ifinfo['status'])) {
+ $ifinfo['status'] = "down";
+ }
+ $ifinfo['macaddr'] = $ifinfotmp['macaddr'];
+ $ifinfo['mtu'] = $ifinfotmp['mtu'];
+ $ifinfo['ipaddr'] = $ifinfotmp['ipaddr'];
+ $ifinfo['subnet'] = $ifinfotmp['subnet'];
+ $ifinfo['linklocal'] = get_interface_linklocal($ifdescr);
+ $ifinfo['ipaddrv6'] = get_interface_ipv6($ifdescr);
+ $ifinfo['subnetv6'] = get_interface_subnetv6($ifdescr);
+ if (isset($ifinfotmp['link0'])) {
+ $link0 = "down";
+ }
+ $ifinfotmp = pfSense_get_interface_stats($chkif);
+ // $ifinfo['inpkts'] = $ifinfotmp['inpkts'];
+ // $ifinfo['outpkts'] = $ifinfotmp['outpkts'];
+ $ifinfo['inerrs'] = $ifinfotmp['inerrs'];
+ $ifinfo['outerrs'] = $ifinfotmp['outerrs'];
+ $ifinfo['collisions'] = $ifinfotmp['collisions'];
+
+ /* Use pfctl for non wrapping 64 bit counters */
+ /* Pass */
+ exec("/sbin/pfctl -vvsI -i {$chkif}", $pfctlstats);
+ $pf_in4_pass = preg_split("/ +/ ", $pfctlstats[3]);
+ $pf_out4_pass = preg_split("/ +/", $pfctlstats[5]);
+ $pf_in6_pass = preg_split("/ +/ ", $pfctlstats[7]);
+ $pf_out6_pass = preg_split("/ +/", $pfctlstats[9]);
+ $in4_pass = $pf_in4_pass[5];
+ $out4_pass = $pf_out4_pass[5];
+ $in4_pass_packets = $pf_in4_pass[3];
+ $out4_pass_packets = $pf_out4_pass[3];
+ $in6_pass = $pf_in6_pass[5];
+ $out6_pass = $pf_out6_pass[5];
+ $in6_pass_packets = $pf_in6_pass[3];
+ $out6_pass_packets = $pf_out6_pass[3];
+ $ifinfo['inbytespass'] = $in4_pass + $in6_pass;
+ $ifinfo['outbytespass'] = $out4_pass + $out6_pass;
+ $ifinfo['inpktspass'] = $in4_pass_packets + $in6_pass_packets;
+ $ifinfo['outpktspass'] = $out4_pass_packets + $out6_pass_packets;
+
+ /* Block */
+ $pf_in4_block = preg_split("/ +/", $pfctlstats[4]);
+ $pf_out4_block = preg_split("/ +/", $pfctlstats[6]);
+ $pf_in6_block = preg_split("/ +/", $pfctlstats[8]);
+ $pf_out6_block = preg_split("/ +/", $pfctlstats[10]);
+ $in4_block = $pf_in4_block[5];
+ $out4_block = $pf_out4_block[5];
+ $in4_block_packets = $pf_in4_block[3];
+ $out4_block_packets = $pf_out4_block[3];
+ $in6_block = $pf_in6_block[5];
+ $out6_block = $pf_out6_block[5];
+ $in6_block_packets = $pf_in6_block[3];
+ $out6_block_packets = $pf_out6_block[3];
+ $ifinfo['inbytesblock'] = $in4_block + $in6_block;
+ $ifinfo['outbytesblock'] = $out4_block + $out6_block;
+ $ifinfo['inpktsblock'] = $in4_block_packets + $in6_block_packets;
+ $ifinfo['outpktsblock'] = $out4_block_packets + $out6_block_packets;
+
+ $ifinfo['inbytes'] = $in4_pass + $in6_pass;
+ $ifinfo['outbytes'] = $out4_pass + $out6_pass;
+ $ifinfo['inpkts'] = $in4_pass_packets + $in6_pass_packets;
+ $ifinfo['outpkts'] = $out4_pass_packets + $out6_pass_packets;
+
+ $ifconfiginfo = "";
+ $link_type = $config['interfaces'][$ifdescr]['ipaddr'];
+ switch ($link_type) {
+ /* DHCP? -> see if dhclient is up */
+ case "dhcp":
+ /* see if dhclient is up */
+ if (find_dhclient_process($ifinfo['if']) != 0) {
+ $ifinfo['dhcplink'] = "up";
+ } else {
+ $ifinfo['dhcplink'] = "down";
+ }
+
+ break;
+ /* PPPoE/PPTP/L2TP interface? -> get status from virtual interface */
+ case "pppoe":
+ case "pptp":
+ case "l2tp":
+ if ($ifinfo['status'] == "up" && !isset($link0)) {
+ /* get PPPoE link status for dial on demand */
+ $ifinfo["{$link_type}link"] = "up";
+ } else {
+ $ifinfo["{$link_type}link"] = "down";
+ }
+
+ break;
+ /* PPP interface? -> get uptime for this session and cumulative uptime from the persistent log file in conf */
+ case "ppp":
+ if ($ifinfo['status'] == "up") {
+ $ifinfo['ppplink'] = "up";
+ } else {
+ $ifinfo['ppplink'] = "down" ;
+ }
+
+ if (empty($ifinfo['status'])) {
+ $ifinfo['status'] = "down";
+ }
+
+ if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
+ if ($config['interfaces'][$ifdescr]['if'] == $ppp['if']) {
+ break;
+ }
+ }
+ }
+ $dev = $ppp['ports'];
+ if ($config['interfaces'][$ifdescr]['if'] != $ppp['if'] || empty($dev)) {
+ break;
+ }
+ if (!file_exists($dev)) {
+ $ifinfo['nodevice'] = 1;
+ $ifinfo['pppinfo'] = $dev . " " . gettext("device not present! Is the modem attached to the system?");
+ }
+
+ $usbmodemoutput = array();
+ exec("usbconfig", $usbmodemoutput);
+ $mondev = "{$g['tmp_path']}/3gstats.{$ifdescr}";
+ if (file_exists($mondev)) {
+ $cellstats = file($mondev);
+ /* skip header */
+ $a_cellstats = explode(",", $cellstats[1]);
+ if (preg_match("/huawei/i", implode("\n", $usbmodemoutput))) {
+ $ifinfo['cell_rssi'] = huawei_rssi_to_string($a_cellstats[1]);
+ $ifinfo['cell_mode'] = huawei_mode_to_string($a_cellstats[2], $a_cellstats[3]);
+ $ifinfo['cell_simstate'] = huawei_simstate_to_string($a_cellstats[10]);
+ $ifinfo['cell_service'] = huawei_service_to_string(trim($a_cellstats[11]));
+ }
+ if (preg_match("/zte/i", implode("\n", $usbmodemoutput))) {
+ $ifinfo['cell_rssi'] = zte_rssi_to_string($a_cellstats[1]);
+ $ifinfo['cell_mode'] = zte_mode_to_string($a_cellstats[2], $a_cellstats[3]);
+ $ifinfo['cell_simstate'] = zte_simstate_to_string($a_cellstats[10]);
+ $ifinfo['cell_service'] = zte_service_to_string(trim($a_cellstats[11]));
+ }
+ $ifinfo['cell_upstream'] = $a_cellstats[4];
+ $ifinfo['cell_downstream'] = trim($a_cellstats[5]);
+ $ifinfo['cell_sent'] = $a_cellstats[6];
+ $ifinfo['cell_received'] = trim($a_cellstats[7]);
+ $ifinfo['cell_bwupstream'] = $a_cellstats[8];
+ $ifinfo['cell_bwdownstream'] = trim($a_cellstats[9]);
+ }
+ // Calculate cumulative uptime for PPP link. Useful for connections that have per minute/hour contracts so you don't go over!
+ if (isset($ppp['uptime'])) {
+ $ifinfo['ppp_uptime_accumulated'] = "(".get_ppp_uptime($ifinfo['if']).")";
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (file_exists("{$g['varrun_path']}/{$link_type}_{$ifdescr}.pid")) {
+ $sec = trim(`/usr/local/sbin/ppp-uptime.sh {$ifinfo['if']}`);
+ $ifinfo['ppp_uptime'] = convert_seconds_to_hms($sec);
+ }
+
+ if ($ifinfo['status'] == "up") {
+ /* try to determine media with ifconfig */
+ unset($ifconfiginfo);
+ exec("/sbin/ifconfig " . $ifinfo['if'], $ifconfiginfo);
+ $wifconfiginfo = array();
+ if (is_interface_wireless($ifdescr)) {
+ exec("/sbin/ifconfig {$ifinfo['if']} list sta", $wifconfiginfo);
+ array_shift($wifconfiginfo);
+ }
+ $matches = "";
+ foreach ($ifconfiginfo as $ici) {
+
+ /* don't list media/speed for wireless cards, as it always
+ displays 2 Mbps even though clients can connect at 11 Mbps */
+ if (preg_match("/media: .*? \((.*?)\)/", $ici, $matches)) {
+ $ifinfo['media'] = $matches[1];
+ } else if (preg_match("/media: Ethernet (.*)/", $ici, $matches)) {
+ $ifinfo['media'] = $matches[1];
+ } else if (preg_match("/media: IEEE 802.11 Wireless Ethernet (.*)/", $ici, $matches)) {
+ $ifinfo['media'] = $matches[1];
+ }
+
+ if (preg_match("/status: (.*)$/", $ici, $matches)) {
+ if ($matches[1] != "active") {
+ $ifinfo['status'] = $matches[1];
+ }
+ if ($ifinfo['status'] == gettext("running")) {
+ $ifinfo['status'] = gettext("up");
+ }
+ }
+ if (preg_match("/channel (\S*)/", $ici, $matches)) {
+ $ifinfo['channel'] = $matches[1];
+ }
+ if (preg_match("/ssid (\".*?\"|\S*)/", $ici, $matches)) {
+ if ($matches[1][0] == '"') {
+ $ifinfo['ssid'] = substr($matches[1], 1, -1);
+ }
+ else {
+ $ifinfo['ssid'] = $matches[1];
+ }
+ }
+ if (preg_match("/laggproto (.*)$/", $ici, $matches)) {
+ $ifinfo['laggproto'] = $matches[1];
+ }
+ if (preg_match("/laggport: (.*)$/", $ici, $matches)) {
+ $ifinfo['laggport'][] = $matches[1];
+ }
+ }
+ foreach ($wifconfiginfo as $ici) {
+ $elements = preg_split("/[ ]+/i", $ici);
+ if ($elements[0] != "") {
+ $ifinfo['bssid'] = $elements[0];
+ }
+ if ($elements[3] != "") {
+ $ifinfo['rate'] = $elements[3];
+ }
+ if ($elements[4] != "") {
+ $ifinfo['rssi'] = $elements[4];
+ }
+ }
+ /* lookup the gateway */
+ if (interface_has_gateway($ifdescr)) {
+ $ifinfo['gateway'] = get_interface_gateway($ifdescr);
+ $ifinfo['gatewayv6'] = get_interface_gateway_v6($ifdescr);
+ }
+ }
+
+ $bridge = "";
+ $bridge = link_interface_to_bridge($ifdescr);
+ if ($bridge) {
+ $bridge_text = `/sbin/ifconfig {$bridge}`;
+ if (stristr($bridge_text, "blocking") <> false) {
+ $ifinfo['bridge'] = "<b><font color='red'>" . gettext("blocking") . "</font></b> - " . gettext("check for ethernet loops");
+ $ifinfo['bridgeint'] = $bridge;
+ } else if (stristr($bridge_text, "learning") <> false) {
+ $ifinfo['bridge'] = gettext("learning");
+ $ifinfo['bridgeint'] = $bridge;
+ } else if (stristr($bridge_text, "forwarding") <> false) {
+ $ifinfo['bridge'] = gettext("forwarding");
+ $ifinfo['bridgeint'] = $bridge;
+ }
+ }
+
+ return $ifinfo;
+}
+
+//returns cpu speed of processor. Good for determining capabilities of machine
+function get_cpu_speed() {
+ return get_single_sysctl("hw.clockrate");
+}
+
+function get_uptime_sec() {
+ $boottime = "";
+ $matches = "";
+ $boottime = get_single_sysctl("kern.boottime");
+ preg_match("/sec = (\d+)/", $boottime, $matches);
+ $boottime = $matches[1];
+ if (intval($boottime) == 0) {
+ return 0;
+ }
+
+ $uptime = time() - $boottime;
+ return $uptime;
+}
+
+function add_hostname_to_watch($hostname) {
+ if (!is_dir("/var/db/dnscache")) {
+ mkdir("/var/db/dnscache");
+ }
+ $result = array();
+ if ((is_fqdn($hostname)) && (!is_ipaddr($hostname))) {
+ $domrecords = array();
+ $domips = array();
+ exec("host -t A " . escapeshellarg($hostname), $domrecords, $rethost);
+ if ($rethost == 0) {
+ foreach ($domrecords as $domr) {
+ $doml = explode(" ", $domr);
+ $domip = $doml[3];
+ /* fill array with domain ip addresses */
+ if (is_ipaddr($domip)) {
+ $domips[] = $domip;
+ }
+ }
+ }
+ sort($domips);
+ $contents = "";
+ if (!empty($domips)) {
+ foreach ($domips as $ip) {
+ $contents .= "$ip\n";
+ }
+ }
+ file_put_contents("/var/db/dnscache/$hostname", $contents);
+ /* Remove empty elements */
+ $result = array_filter(explode("\n", $contents), 'strlen');
+ }
+ return $result;
+}
+
+function is_fqdn($fqdn) {
+ $hostname = false;
+ if (preg_match("/[-A-Z0-9\.]+\.[-A-Z0-9\.]+/i", $fqdn)) {
+ $hostname = true;
+ }
+ if (preg_match("/\.\./", $fqdn)) {
+ $hostname = false;
+ }
+ if (preg_match("/^\./i", $fqdn)) {
+ $hostname = false;
+ }
+ if (preg_match("/\//i", $fqdn)) {
+ $hostname = false;
+ }
+ return($hostname);
+}
+
+function pfsense_default_state_size() {
+ /* get system memory amount */
+ $memory = get_memory();
+ $physmem = $memory[0];
+ /* Be cautious and only allocate 10% of system memory to the state table */
+ $max_states = (int) ($physmem/10)*1000;
+ return $max_states;
+}
+
+function pfsense_default_tables_size() {
+ $current = `pfctl -sm | grep ^tables | awk '{print $4};'`;
+ return $current;
+}
+
+function pfsense_default_table_entries_size() {
+ $current = `pfctl -sm | grep table-entries | awk '{print $4};'`;
+ return $current;
+}
+
+/* Compare the current hostname DNS to the DNS cache we made
+ * if it has changed we return the old records
+ * if no change we return false */
+function compare_hostname_to_dnscache($hostname) {
+ if (!is_dir("/var/db/dnscache")) {
+ mkdir("/var/db/dnscache");
+ }
+ $hostname = trim($hostname);
+ if (is_readable("/var/db/dnscache/{$hostname}")) {
+ $oldcontents = file_get_contents("/var/db/dnscache/{$hostname}");
+ } else {
+ $oldcontents = "";
+ }
+ if ((is_fqdn($hostname)) && (!is_ipaddr($hostname))) {
+ $domrecords = array();
+ $domips = array();
+ exec("host -t A " . escapeshellarg($hostname), $domrecords, $rethost);
+ if ($rethost == 0) {
+ foreach ($domrecords as $domr) {
+ $doml = explode(" ", $domr);
+ $domip = $doml[3];
+ /* fill array with domain ip addresses */
+ if (is_ipaddr($domip)) {
+ $domips[] = $domip;
+ }
+ }
+ }
+ sort($domips);
+ $contents = "";
+ if (!empty($domips)) {
+ foreach ($domips as $ip) {
+ $contents .= "$ip\n";
+ }
+ }
+ }
+
+ if (trim($oldcontents) != trim($contents)) {
+ if ($g['debug']) {
+ log_error(sprintf(gettext('DNSCACHE: Found old IP %1$s and new IP %2$s'), $oldcontents, $contents));
+ }
+ return ($oldcontents);
+ } else {
+ return false;
+ }
+}
+
+/*
+ * load_crypto() - Load crypto modules if enabled in config.
+ */
+function load_crypto() {
+ global $config, $g;
+ $crypto_modules = array('glxsb', 'aesni');
+
+ if (!in_array($config['system']['crypto_hardware'], $crypto_modules)) {
+ return false;
+ }
+
+ if (!empty($config['system']['crypto_hardware']) && !is_module_loaded($config['system']['crypto_hardware'])) {
+ log_error("Loading {$config['system']['crypto_hardware']} cryptographic accelerator module.");
+ mwexec("/sbin/kldload {$config['system']['crypto_hardware']}");
+ }
+}
+
+/*
+ * load_thermal_hardware() - Load temperature monitor kernel module
+ */
+function load_thermal_hardware() {
+ global $config, $g;
+ $thermal_hardware_modules = array('coretemp', 'amdtemp');
+
+ if (!in_array($config['system']['thermal_hardware'], $thermal_hardware_modules)) {
+ return false;
+ }
+
+ if (!empty($config['system']['thermal_hardware']) && !is_module_loaded($config['system']['thermal_hardware'])) {
+ log_error("Loading {$config['system']['thermal_hardware']} thermal monitor module.");
+ mwexec("/sbin/kldload {$config['system']['thermal_hardware']}");
+ }
+}
+
+/****f* pfsense-utils/isvm
+ * NAME
+ * isvm
+ * INPUTS
+ * none
+ * RESULT
+ * returns true if machine is running under a virtual environment
+ ******/
+function isvm() {
+ $virtualenvs = array("vmware", "parallels", "qemu", "bochs", "plex86", "VirtualBox");
+ $_gb = exec('/bin/kenv smbios.system.product 2>/dev/null', $output, $rc);
+
+ if ($rc != 0 || !isset($output[0])) {
+ return false;
+ }
+
+ foreach ($virtualenvs as $virtualenv) {
+ if (stripos($output[0], $virtualenv) !== false) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function get_freebsd_version() {
+ $version = explode(".", php_uname("r"));
+ return $version[0];
+}
+
+function download_file($url, $destination, $verify_ssl = true, $connect_timeout = 5, $timeout = 0) {
+ global $config, $g;
+
+ $fp = fopen($destination, "wb");
+
+ if (!$fp) {
+ return false;
+ }
+
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $verify_ssl);
+ curl_setopt($ch, CURLOPT_FILE, $fp);
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $connect_timeout);
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($ch, CURLOPT_HEADER, false);
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+ if (!isset($config['system']['host_uuid'])) {
+ curl_setopt($ch, CURLOPT_USERAGENT, $g['product_name'] . '/' . $g['product_version'] . ' : ' . get_single_sysctl('kern.hostuuid'));
+ } else {
+ curl_setopt($ch, CURLOPT_USERAGENT, $g['product_name'] . '/' . $g['product_version']);
+ }
+
+ if (!empty($config['system']['proxyurl'])) {
+ curl_setopt($ch, CURLOPT_PROXY, $config['system']['proxyurl']);
+ if (!empty($config['system']['proxyport'])) {
+ curl_setopt($ch, CURLOPT_PROXYPORT, $config['system']['proxyport']);
+ }
+ if (!empty($config['system']['proxyuser']) && !empty($config['system']['proxypass'])) {
+ @curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_ANY | CURLAUTH_ANYSAFE);
+ curl_setopt($ch, CURLOPT_PROXYUSERPWD, "{$config['system']['proxyuser']}:{$config['system']['proxypass']}");
+ }
+ }
+
+ @curl_exec($ch);
+ $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ fclose($fp);
+ curl_close($ch);
+ return ($http_code == 200) ? true : $http_code;
+}
+
+function download_file_with_progress_bar($url_file, $destination_file, $readbody = 'read_body', $connect_timeout = 5, $timeout = 0) {
+ global $config, $g;
+ global $ch, $fout, $file_size, $downloaded, $config, $first_progress_update;
+ $file_size = 1;
+ $downloaded = 1;
+ $first_progress_update = TRUE;
+ /* open destination file */
+ $fout = fopen($destination_file, "wb");
+
+ /*
+ * Originally by Author: Keyvan Minoukadeh
+ * Modified by Scott Ullrich to return Content-Length size
+ */
+
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $url_file);
+ curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+ curl_setopt($ch, CURLOPT_WRITEFUNCTION, $readbody);
+ curl_setopt($ch, CURLOPT_NOPROGRESS, '1');
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $connect_timeout);
+ curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ if (!isset($config['system']['host_uuid'])) {
+ curl_setopt($ch, CURLOPT_USERAGENT, $g['product_name'] . '/' . $g['product_version'] . ' : ' . get_single_sysctl('kern.hostuuid'));
+ } else {
+ curl_setopt($ch, CURLOPT_USERAGENT, $g['product_name'] . '/' . $g['product_version']);
+ }
+
+ if (!empty($config['system']['proxyurl'])) {
+ curl_setopt($ch, CURLOPT_PROXY, $config['system']['proxyurl']);
+ if (!empty($config['system']['proxyport'])) {
+ curl_setopt($ch, CURLOPT_PROXYPORT, $config['system']['proxyport']);
+ }
+ if (!empty($config['system']['proxyuser']) && !empty($config['system']['proxypass'])) {
+ @curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_ANY | CURLAUTH_ANYSAFE);
+ curl_setopt($ch, CURLOPT_PROXYUSERPWD, "{$config['system']['proxyuser']}:{$config['system']['proxypass']}");
+ }
+ }
+
+ @curl_exec($ch);
+ $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ if ($fout) {
+ fclose($fout);
+ }
+ curl_close($ch);
+ return ($http_code == 200) ? true : $http_code;
+}
+
+function read_header($ch, $string) {
+ global $file_size, $fout;
+ $length = strlen($string);
+ $regs = "";
+ preg_match("/(Content-Length:) (.*)/", $string, $regs);
+ if ($regs[2] <> "") {
+ $file_size = intval($regs[2]);
+ }
+ ob_flush();
+ return $length;
+}
+
+function read_body($ch, $string) {
+ global $fout, $file_size, $downloaded, $sendto, $static_status, $static_output, $lastseen, $first_progress_update;
+ global $pkg_interface;
+ $length = strlen($string);
+ $downloaded += intval($length);
+ if ($file_size > 0) {
+ $downloadProgress = round(100 * (1 - $downloaded / $file_size), 0);
+ $downloadProgress = 100 - $downloadProgress;
+ } else {
+ $downloadProgress = 0;
+ }
+ if ($lastseen <> $downloadProgress and $downloadProgress < 101) {
+ if ($sendto == "status") {
+ if ($pkg_interface == "console") {
+ if (($downloadProgress % 10) == 0 || $downloadProgress < 10) {
+ $tostatus = $static_status . $downloadProgress . "%";
+ if ($downloadProgress == 100) {
+ $tostatus = $tostatus . "\r";
+ }
+ update_status($tostatus);
+ }
+ } else {
+ $tostatus = $static_status . $downloadProgress . "%";
+ update_status($tostatus);
+ }
+ } else {
+ if ($pkg_interface == "console") {
+ if (($downloadProgress % 10) == 0 || $downloadProgress < 10) {
+ $tooutput = $static_output . $downloadProgress . "%";
+ if ($downloadProgress == 100) {
+ $tooutput = $tooutput . "\r";
+ }
+ update_output_window($tooutput);
+ }
+ } else {
+ $tooutput = $static_output . $downloadProgress . "%";
+ update_output_window($tooutput);
+ }
+ }
+ if (($pkg_interface != "console") || (($downloadProgress % 10) == 0) || ($downloadProgress < 10)) {
+ update_progress_bar($downloadProgress, $first_progress_update);
+ $first_progress_update = FALSE;
+ }
+ $lastseen = $downloadProgress;
+ }
+ if ($fout) {
+ fwrite($fout, $string);
+ }
+ ob_flush();
+ return $length;
+}
+
+/*
+ * update_output_window: update bottom textarea dynamically.
+ */
+function update_output_window($text) {
+ global $pkg_interface;
+ $log = preg_replace("/\n/", "\\n", $text);
+ if ($pkg_interface != "console") {
+ echo "\n<script type=\"text/javascript\">";
+ echo "\n//<![CDATA[";
+ echo "\nthis.document.forms[0].output.value = \"" . $log . "\";";
+ echo "\nthis.document.forms[0].output.scrollTop = this.document.forms[0].output.scrollHeight;";
+ echo "\n//]]>";
+ echo "\n</script>";
+ }
+ /* ensure that contents are written out */
+ ob_flush();
+}
+
+/*
+ * update_status: update top textarea dynamically.
+ */
+function update_status($status) {
+ global $pkg_interface;
+ if ($pkg_interface == "console") {
+ echo "\r{$status}";
+ } else {
+ echo "\n<script type=\"text/javascript\">";
+ echo "\n//<![CDATA[";
+ echo "\nthis.document.forms[0].status.value=\"" . $status . "\";";
+ echo "\n//]]>";
+ echo "\n</script>";
+ }
+ /* ensure that contents are written out */
+ ob_flush();
+}
+
+/*
+ * update_progress_bar($percent, $first_time): updates the javascript driven progress bar.
+ */
+function update_progress_bar($percent, $first_time) {
+ global $pkg_interface;
+ if ($percent > 100) {
+ $percent = 1;
+ }
+ if ($pkg_interface <> "console") {
+ echo "\n<script type=\"text/javascript\">";
+ echo "\n//<![CDATA[";
+ echo "\ndocument.progressbar.style.width='" . $percent . "%';";
+ echo "\n//]]>";
+ echo "\n</script>";
+ } else {
+ if (!($first_time)) {
+ echo "\x08\x08\x08\x08\x08";
+ }
+ echo sprintf("%4d%%", $percent);
+ }
+}
+
+/* Split() is being DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged. */
+if (!function_exists("split")) {
+ function split($separator, $haystack, $limit = null) {
+ log_error("deprecated split() call with separator '{$separator}'");
+ return preg_split($separator, $haystack, $limit);
+ }
+}
+
+function update_alias_names_upon_change($section, $field, $new_alias_name, $origname) {
+ global $g, $config, $pconfig, $debug;
+ if (!$origname) {
+ return;
+ }
+
+ $sectionref = &$config;
+ foreach ($section as $sectionname) {
+ if (is_array($sectionref) && isset($sectionref[$sectionname])) {
+ $sectionref = &$sectionref[$sectionname];
+ } else {
+ return;
+ }
+ }
+
+ if ($debug) {
+ $fd = fopen("{$g['tmp_path']}/print_r", "a");
+ fwrite($fd, print_r($pconfig, true));
+ }
+
+ if (is_array($sectionref)) {
+ foreach ($sectionref as $itemkey => $item) {
+ if ($debug) {
+ fwrite($fd, "$itemkey\n");
+ }
+
+ $fieldfound = true;
+ $fieldref = &$sectionref[$itemkey];
+ foreach ($field as $fieldname) {
+ if (is_array($fieldref) && isset($fieldref[$fieldname])) {
+ $fieldref = &$fieldref[$fieldname];
+ } else {
+ $fieldfound = false;
+ break;
+ }
+ }
+ if ($fieldfound && $fieldref == $origname) {
+ if ($debug) {
+ fwrite($fd, "Setting old alias value $origname to $new_alias_name\n");
+ }
+ $fieldref = $new_alias_name;
+ }
+ }
+ }
+
+ if ($debug) {
+ fclose($fd);
+ }
+
+}
+
+function parse_aliases_file($filename, $type = "url", $max_items = -1) {
+ /*
+ * $filename = file to process for example blocklist like DROP: http://www.spamhaus.org/drop/drop.txt
+ * $type = if set to 'url' then subnets and ips will be returned,
+ * if set to 'url_ports' port-ranges and ports will be returned
+ * $max_items = sets the maximum amount of valid items to load, -1 the default defines there is no limit.
+ *
+ * RETURNS an array of ip subnets and ip's or ports and port-ranges, returns NULL upon a error conditions (file not found)
+ */
+
+ $fd = @fopen($filename, 'r');
+ if (!$fd) {
+ log_error(gettext("Could not process aliases from alias: {$alias_url}"));
+ return null;
+ }
+ $items = array();
+ /* NOTE: fgetss() is not a typo RTFM before being smart */
+ while (($fc = fgetss($fd)) !== FALSE) {
+ $tmp = trim($fc, " \t\n\r");
+ if (empty($tmp)) {
+ continue;
+ }
+ $tmp_str = strstr($tmp, '#', true);
+ if (!empty($tmp_str)) {
+ $tmp = $tmp_str;
+ }
+ $tmp_str = strstr($tmp, ' ', true);
+ if (!empty($tmp_str)) {
+ $tmp = $tmp_str;
+ }
+ $valid = ($type == "url" && (is_ipaddr($tmp) || is_subnet($tmp))) ||
+ ($type == "url_ports" && (is_port($tmp) || is_portrange($tmp)));
+ if ($valid) {
+ $items[] = $tmp;
+ if (count($items) == $max_items) {
+ break;
+ }
+ }
+ }
+ fclose($fd);
+ return $items;
+}
+
+function update_alias_url_data() {
+ global $config, $g;
+
+ $updated = false;
+
+ /* item is a url type */
+ $lockkey = lock('aliasurl');
+ if (is_array($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $x => $alias) {
+ if (empty($alias['aliasurl'])) {
+ continue;
+ }
+
+ $address = null;
+ foreach ($alias['aliasurl'] as $alias_url) {
+ /* fetch down and add in */
+ $temp_filename = tempnam("{$g['tmp_path']}/", "alias_import");
+ unlink($temp_filename);
+ $verify_ssl = isset($config['system']['checkaliasesurlcert']);
+ mkdir($temp_filename);
+ download_file($alias_url, $temp_filename . "/aliases", $verify_ssl);
+
+ /* if the item is tar gzipped then extract */
+ if (stripos($alias_url, '.tgz')) {
+ if (!process_alias_tgz($temp_filename)) {
+ continue;
+ }
+ } else if (stripos($alias_url, '.zip')) {
+ if (!process_alias_unzip($temp_filename)) {
+ continue;
+ }
+ }
+ if (file_exists("{$temp_filename}/aliases")) {
+ $address = parse_aliases_file("{$temp_filename}/aliases", $alias['type'], 3000);
+ mwexec("/bin/rm -rf {$temp_filename}");
+ }
+ }
+ if ($address != null) {
+ $config['aliases']['alias'][$x]['address'] = implode(" ", $address);
+ $updated = true;
+ }
+ }
+ }
+ unlock($lockkey);
+
+ /* Report status to callers as well */
+ return $updated;
+}
+
+function process_alias_unzip($temp_filename) {
+ if (!file_exists("/usr/local/bin/unzip")) {
+ log_error(gettext("Alias archive is a .zip file which cannot be decompressed because utility is missing!"));
+ return false;
+ }
+ rename("{$temp_filename}/aliases", "{$temp_filename}/aliases.zip");
+ mwexec("/usr/local/bin/unzip {$temp_filename}/aliases.tgz -d {$temp_filename}/aliases/");
+ unlink("{$temp_filename}/aliases.zip");
+ $files_to_process = return_dir_as_array("{$temp_filename}/");
+ /* foreach through all extracted files and build up aliases file */
+ $fd = @fopen("{$temp_filename}/aliases", "w");
+ if (!$fd) {
+ log_error(gettext("Could not open {$temp_filename}/aliases for writing!"));
+ return false;
+ }
+ foreach ($files_to_process as $f2p) {
+ $tmpfd = @fopen($f2p, 'r');
+ if (!$tmpfd) {
+ log_error(gettext("The following file could not be read {$f2p} from {$temp_filename}"));
+ continue;
+ }
+ while (($tmpbuf = fread($tmpfd, 65536)) !== FALSE) {
+ fwrite($fd, $tmpbuf);
+ }
+ fclose($tmpfd);
+ unlink($f2p);
+ }
+ fclose($fd);
+ unset($tmpbuf);
+
+ return true;
+}
+
+function process_alias_tgz($temp_filename) {
+ if (!file_exists('/usr/bin/tar')) {
+ log_error(gettext("Alias archive is a .tar/tgz file which cannot be decompressed because utility is missing!"));
+ return false;
+ }
+ rename("{$temp_filename}/aliases", "{$temp_filename}/aliases.tgz");
+ mwexec("/usr/bin/tar xzf {$temp_filename}/aliases.tgz -C {$temp_filename}/aliases/");
+ unlink("{$temp_filename}/aliases.tgz");
+ $files_to_process = return_dir_as_array("{$temp_filename}/");
+ /* foreach through all extracted files and build up aliases file */
+ $fd = @fopen("{$temp_filename}/aliases", "w");
+ if (!$fd) {
+ log_error(gettext("Could not open {$temp_filename}/aliases for writing!"));
+ return false;
+ }
+ foreach ($files_to_process as $f2p) {
+ $tmpfd = @fopen($f2p, 'r');
+ if (!$tmpfd) {
+ log_error(gettext("The following file could not be read {$f2p} from {$temp_filename}"));
+ continue;
+ }
+ while (($tmpbuf = fread($tmpfd, 65536)) !== FALSE) {
+ fwrite($fd, $tmpbuf);
+ }
+ fclose($tmpfd);
+ unlink($f2p);
+ }
+ fclose($fd);
+ unset($tmpbuf);
+
+ return true;
+}
+
+function version_compare_dates($a, $b) {
+ $a_time = strtotime($a);
+ $b_time = strtotime($b);
+
+ if ((!$a_time) || (!$b_time)) {
+ return FALSE;
+ } else {
+ if ($a_time < $b_time) {
+ return -1;
+ } elseif ($a_time == $b_time) {
+ return 0;
+ } else {
+ return 1;
+ }
+ }
+}
+function version_get_string_value($a) {
+ $strs = array(
+ 0 => "ALPHA-ALPHA",
+ 2 => "ALPHA",
+ 3 => "BETA",
+ 4 => "B",
+ 5 => "C",
+ 6 => "D",
+ 7 => "RC",
+ 8 => "RELEASE",
+ 9 => "*" // Matches all release levels
+ );
+ $major = 0;
+ $minor = 0;
+ foreach ($strs as $num => $str) {
+ if (substr($a, 0, strlen($str)) == $str) {
+ $major = $num;
+ $n = substr($a, strlen($str));
+ if (is_numeric($n)) {
+ $minor = $n;
+ }
+ break;
+ }
+ }
+ return "{$major}.{$minor}";
+}
+function version_compare_string($a, $b) {
+ // Only compare string parts if both versions give a specific release
+ // (If either version lacks a string part, assume intended to match all release levels)
+ if (isset($a) && isset($b)) {
+ return version_compare_numeric(version_get_string_value($a), version_get_string_value($b));
+ } else {
+ return 0;
+ }
+}
+function version_compare_numeric($a, $b) {
+ $a_arr = explode('.', rtrim($a, '.0'));
+ $b_arr = explode('.', rtrim($b, '.0'));
+
+ foreach ($a_arr as $n => $val) {
+ if (array_key_exists($n, $b_arr)) {
+ // So far so good, both have values at this minor version level. Compare.
+ if ($val > $b_arr[$n]) {
+ return 1;
+ } elseif ($val < $b_arr[$n]) {
+ return -1;
+ }
+ } else {
+ // a is greater, since b doesn't have any minor version here.
+ return 1;
+ }
+ }
+ if (count($b_arr) > count($a_arr)) {
+ // b is longer than a, so it must be greater.
+ return -1;
+ } else {
+ // Both a and b are of equal length and value.
+ return 0;
+ }
+}
+function pfs_version_compare($cur_time, $cur_text, $remote) {
+ // First try date compare
+ $v = version_compare_dates($cur_time, $remote);
+ if ($v === FALSE) {
+ // If that fails, try to compare by string
+ // Before anything else, simply test if the strings are equal
+ if (($cur_text == $remote) || ($cur_time == $remote)) {
+ return 0;
+ }
+ list($cur_num, $cur_str) = explode('-', $cur_text);
+ list($rem_num, $rem_str) = explode('-', $remote);
+
+ // First try to compare the numeric parts of the version string.
+ $v = version_compare_numeric($cur_num, $rem_num);
+
+ // If the numeric parts are the same, compare the string parts.
+ if ($v == 0) {
+ return version_compare_string($cur_str, $rem_str);
+ }
+ }
+ return $v;
+}
+function process_alias_urltable($name, $url, $freq, $forceupdate=false) {
+ global $config;
+
+ $urltable_prefix = "/var/db/aliastables/";
+ $urltable_filename = $urltable_prefix . $name . ".txt";
+
+ // Make the aliases directory if it doesn't exist
+ if (!file_exists($urltable_prefix)) {
+ mkdir($urltable_prefix);
+ } elseif (!is_dir($urltable_prefix)) {
+ unlink($urltable_prefix);
+ mkdir($urltable_prefix);
+ }
+
+ // If the file doesn't exist or is older than update_freq days, fetch a new copy.
+ if (!file_exists($urltable_filename) ||
+ ((time() - filemtime($urltable_filename)) > ($freq * 86400 - 90)) ||
+ $forceupdate) {
+
+ // Try to fetch the URL supplied
+ conf_mount_rw();
+ unlink_if_exists($urltable_filename . ".tmp");
+ $verify_ssl = isset($config['system']['checkaliasesurlcert']);
+ if (download_file($url, $urltable_filename . ".tmp", $verify_ssl)) {
+ mwexec("/usr/bin/sed -E 's/\;.*//g; /^[[:space:]]*($|#)/d' ". escapeshellarg($urltable_filename . ".tmp") . " > " . escapeshellarg($urltable_filename));
+ if (alias_get_type($name) == "urltable_ports") {
+ $ports = explode("\n", str_replace("\r", "", file_get_contents($urltable_filename)));
+ $ports = group_ports($ports);
+ file_put_contents($urltable_filename, implode("\n", $ports));
+ }
+ unlink_if_exists($urltable_filename . ".tmp");
+ } else {
+ touch($urltable_filename);
+ }
+ conf_mount_ro();
+ return true;
+ } else {
+ // File exists, and it doesn't need to be updated.
+ return -1;
+ }
+}
+function get_real_slice_from_glabel($label) {
+ $label = escapeshellarg($label);
+ return trim(`/sbin/glabel list | /usr/bin/grep -B2 ufs/{$label} | /usr/bin/head -n 1 | /usr/bin/cut -f3 -d' '`);
+}
+function nanobsd_get_boot_slice() {
+ return trim(`/sbin/mount | /usr/bin/grep pfsense | /usr/bin/cut -d'/' -f4 | /usr/bin/cut -d' ' -f1`);
+}
+function nanobsd_get_boot_drive() {
+ return trim(`/sbin/glabel list | /usr/bin/grep -B2 ufs/pfsense | /usr/bin/head -n 1 | /usr/bin/cut -f3 -d' ' | /usr/bin/cut -d's' -f1`);
+}
+function nanobsd_get_active_slice() {
+ $boot_drive = nanobsd_get_boot_drive();
+ $active = trim(`gpart show $boot_drive | grep '\[active\]' | awk '{print $3;}'`);
+
+ return "{$boot_drive}s{$active}";
+}
+function nanobsd_get_size() {
+ return strtoupper(file_get_contents("/etc/nanosize.txt"));
+}
+function nanobsd_switch_boot_slice() {
+ global $SLICE, $OLDSLICE, $TOFLASH, $COMPLETE_PATH, $COMPLETE_BOOT_PATH;
+ global $GLABEL_SLICE, $UFS_ID, $OLD_UFS_ID, $BOOTFLASH;
+ global $BOOT_DEVICE, $REAL_BOOT_DEVICE, $BOOT_DRIVE, $ACTIVE_SLICE;
+ nanobsd_detect_slice_info();
+
+ if ($BOOTFLASH == $ACTIVE_SLICE) {
+ $slice = $TOFLASH;
+ } else {
+ $slice = $BOOTFLASH;
+ }
+
+ for ($i = 0; $i < ob_get_level(); $i++) {
+ ob_end_flush();
+ }
+ ob_implicit_flush(1);
+ if (strstr($slice, "s2")) {
+ $ASLICE = "2";
+ $AOLDSLICE = "1";
+ $AGLABEL_SLICE = "pfsense1";
+ $AUFS_ID = "1";
+ $AOLD_UFS_ID = "0";
+ } else {
+ $ASLICE = "1";
+ $AOLDSLICE = "2";
+ $AGLABEL_SLICE = "pfsense0";
+ $AUFS_ID = "0";
+ $AOLD_UFS_ID = "1";
+ }
+ $ATOFLASH = "{$BOOT_DRIVE}s{$ASLICE}";
+ $ACOMPLETE_PATH = "{$BOOT_DRIVE}s{$ASLICE}a";
+ $ABOOTFLASH = "{$BOOT_DRIVE}s{$AOLDSLICE}";
+ conf_mount_rw();
+ set_single_sysctl("kern.geom.debugflags", "16");
+ exec("gpart set -a active -i {$ASLICE} {$BOOT_DRIVE}");
+ exec("/usr/sbin/boot0cfg -s {$ASLICE} -v /dev/{$BOOT_DRIVE}");
+ // We can't update these if they are mounted now.
+ if ($BOOTFLASH != $slice) {
+ exec("/sbin/tunefs -L ${AGLABEL_SLICE} /dev/$ACOMPLETE_PATH");
+ nanobsd_update_fstab($AGLABEL_SLICE, $ACOMPLETE_PATH, $AOLD_UFS_ID, $AUFS_ID);
+ }
+ set_single_sysctl("kern.geom.debugflags", "0");
+ conf_mount_ro();
+}
+function nanobsd_clone_slice() {
+ global $SLICE, $OLDSLICE, $TOFLASH, $COMPLETE_PATH, $COMPLETE_BOOT_PATH;
+ global $GLABEL_SLICE, $UFS_ID, $OLD_UFS_ID, $BOOTFLASH;
+ global $BOOT_DEVICE, $REAL_BOOT_DEVICE, $BOOT_DRIVE, $ACTIVE_SLICE;
+ nanobsd_detect_slice_info();
+
+ for ($i = 0; $i < ob_get_level(); $i++) {
+ ob_end_flush();
+ }
+ ob_implicit_flush(1);
+ set_single_sysctl("kern.geom.debugflags", "16");
+ exec("/bin/dd if=/dev/zero of=/dev/{$TOFLASH} bs=1m count=1");
+ exec("/bin/dd if=/dev/{$BOOTFLASH} of=/dev/{$TOFLASH} bs=64k");
+ exec("/sbin/tunefs -L {$GLABEL_SLICE} /dev/{$COMPLETE_PATH}");
+ $status = nanobsd_update_fstab($GLABEL_SLICE, $COMPLETE_PATH, $OLD_UFS_ID, $UFS_ID);
+ set_single_sysctl("kern.geom.debugflags", "0");
+ if ($status) {
+ return false;
+ } else {
+ return true;
+ }
+}
+function nanobsd_update_fstab($gslice, $complete_path, $oldufs, $newufs) {
+ $tmppath = "/tmp/{$gslice}";
+ $fstabpath = "/tmp/{$gslice}/etc/fstab";
+
+ mkdir($tmppath);
+ exec("/sbin/fsck_ufs -y /dev/{$complete_path}");
+ exec("/sbin/mount /dev/ufs/{$gslice} {$tmppath}");
+ copy("/etc/fstab", $fstabpath);
+
+ if (!file_exists($fstabpath)) {
+ $fstab = <<<EOF
+/dev/ufs/{$gslice} / ufs ro,noatime 1 1
+/dev/ufs/cf /cf ufs ro,noatime 1 1
+EOF;
+ if (file_put_contents($fstabpath, $fstab)) {
+ $status = true;
+ } else {
+ $status = false;
+ }
+ } else {
+ $status = exec("sed -i \"\" \"s/pfsense{$oldufs}/pfsense{$newufs}/g\" {$fstabpath}");
+ }
+ exec("/sbin/umount {$tmppath}");
+ rmdir($tmppath);
+
+ return $status;
+}
+function nanobsd_detect_slice_info() {
+ global $SLICE, $OLDSLICE, $TOFLASH, $COMPLETE_PATH, $COMPLETE_BOOT_PATH;
+ global $GLABEL_SLICE, $UFS_ID, $OLD_UFS_ID, $BOOTFLASH;
+ global $BOOT_DEVICE, $REAL_BOOT_DEVICE, $BOOT_DRIVE, $ACTIVE_SLICE;
+
+ $BOOT_DEVICE=nanobsd_get_boot_slice();
+ $REAL_BOOT_DEVICE=get_real_slice_from_glabel($BOOT_DEVICE);
+ $BOOT_DRIVE=nanobsd_get_boot_drive();
+ $ACTIVE_SLICE=nanobsd_get_active_slice();
+
+ // Detect which slice is active and set information.
+ if (strstr($REAL_BOOT_DEVICE, "s1")) {
+ $SLICE = "2";
+ $OLDSLICE = "1";
+ $GLABEL_SLICE = "pfsense1";
+ $UFS_ID = "1";
+ $OLD_UFS_ID = "0";
+
+ } else {
+ $SLICE = "1";
+ $OLDSLICE = "2";
+ $GLABEL_SLICE = "pfsense0";
+ $UFS_ID = "0";
+ $OLD_UFS_ID = "1";
+ }
+ $TOFLASH = "{$BOOT_DRIVE}s{$SLICE}";
+ $COMPLETE_PATH = "{$BOOT_DRIVE}s{$SLICE}a";
+ $COMPLETE_BOOT_PATH = "{$BOOT_DRIVE}s{$OLDSLICE}";
+ $BOOTFLASH = "{$BOOT_DRIVE}s{$OLDSLICE}";
+}
+
+function nanobsd_friendly_slice_name($slicename) {
+ global $g;
+ return strtolower(str_ireplace('pfsense', $g['product_name'], $slicename));
+}
+
+function get_include_contents($filename) {
+ if (is_file($filename)) {
+ ob_start();
+ include $filename;
+ $contents = ob_get_contents();
+ ob_end_clean();
+ return $contents;
+ }
+ return false;
+}
+
+/* This xml 2 array function is courtesy of the php.net comment section on xml_parse.
+ * it is roughly 4 times faster then our existing pfSense parser but due to the large
+ * size of the RRD xml dumps this is required.
+ * The reason we do not use it for pfSense is that it does not know about array fields
+ * which causes it to fail on array fields with single items. Possible Todo?
+ */
+function xml2array($contents, $get_attributes = 1, $priority = 'tag') {
+ if (!function_exists('xml_parser_create')) {
+ return array ();
+ }
+ $parser = xml_parser_create('');
+ xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
+ xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
+ xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
+ xml_parse_into_struct($parser, trim($contents), $xml_values);
+ xml_parser_free($parser);
+ if (!$xml_values) {
+ return; //Hmm...
+ }
+ $xml_array = array ();
+ $parents = array ();
+ $opened_tags = array ();
+ $arr = array ();
+ $current = & $xml_array;
+ $repeated_tag_index = array ();
+ foreach ($xml_values as $data) {
+ unset ($attributes, $value);
+ extract($data);
+ $result = array ();
+ $attributes_data = array ();
+ if (isset ($value)) {
+ if ($priority == 'tag') {
+ $result = $value;
+ } else {
+ $result['value'] = $value;
+ }
+ }
+ if (isset ($attributes) and $get_attributes) {
+ foreach ($attributes as $attr => $val) {
+ if ($priority == 'tag') {
+ $attributes_data[$attr] = $val;
+ } else {
+ $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
+ }
+ }
+ }
+ if ($type == "open") {
+ $parent[$level -1] = & $current;
+ if (!is_array($current) or (!in_array($tag, array_keys($current)))) {
+ $current[$tag] = $result;
+ if ($attributes_data) {
+ $current[$tag . '_attr'] = $attributes_data;
+ }
+ $repeated_tag_index[$tag . '_' . $level] = 1;
+ $current = & $current[$tag];
+ } else {
+ if (isset ($current[$tag][0])) {
+ $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
+ $repeated_tag_index[$tag . '_' . $level]++;
+ } else {
+ $current[$tag] = array (
+ $current[$tag],
+ $result
+ );
+ $repeated_tag_index[$tag . '_' . $level] = 2;
+ if (isset ($current[$tag . '_attr'])) {
+ $current[$tag]['0_attr'] = $current[$tag . '_attr'];
+ unset ($current[$tag . '_attr']);
+ }
+ }
+ $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
+ $current = & $current[$tag][$last_item_index];
+ }
+ } elseif ($type == "complete") {
+ if (!isset ($current[$tag])) {
+ $current[$tag] = $result;
+ $repeated_tag_index[$tag . '_' . $level] = 1;
+ if ($priority == 'tag' and $attributes_data) {
+ $current[$tag . '_attr'] = $attributes_data;
+ }
+ } else {
+ if (isset ($current[$tag][0]) and is_array($current[$tag])) {
+ $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
+ if ($priority == 'tag' and $get_attributes and $attributes_data) {
+ $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
+ }
+ $repeated_tag_index[$tag . '_' . $level]++;
+ } else {
+ $current[$tag] = array (
+ $current[$tag],
+ $result
+ );
+ $repeated_tag_index[$tag . '_' . $level] = 1;
+ if ($priority == 'tag' and $get_attributes) {
+ if (isset ($current[$tag . '_attr'])) {
+ $current[$tag]['0_attr'] = $current[$tag . '_attr'];
+ unset ($current[$tag . '_attr']);
+ }
+ if ($attributes_data) {
+ $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
+ }
+ }
+ $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
+ }
+ }
+ } elseif ($type == 'close') {
+ $current = & $parent[$level -1];
+ }
+ }
+ return ($xml_array);
+}
+
+function get_country_name($country_code) {
+ if ($country_code != "ALL" && strlen($country_code) != 2) {
+ return "";
+ }
+
+ $country_names_xml = "/usr/local/share/mobile-broadband-provider-info/iso_3166-1_list_en.xml";
+ $country_names_contents = file_get_contents($country_names_xml);
+ $country_names = xml2array($country_names_contents);
+
+ if ($country_code == "ALL") {
+ $country_list = array();
+ foreach ($country_names['ISO_3166-1_List_en']['ISO_3166-1_Entry'] as $country) {
+ $country_list[] = array(
+ "code" => $country['ISO_3166-1_Alpha-2_Code_element'],
+ "name" => ucwords(strtolower($country['ISO_3166-1_Country_name'])));
+ }
+ return $country_list;
+ }
+
+ foreach ($country_names['ISO_3166-1_List_en']['ISO_3166-1_Entry'] as $country) {
+ if ($country['ISO_3166-1_Alpha-2_Code_element'] == strtoupper($country_code)) {
+ return ucwords(strtolower($country['ISO_3166-1_Country_name']));
+ }
+ }
+ return "";
+}
+
+/* sort by interface only, retain the original order of rules that apply to
+ the same interface */
+function filter_rules_sort() {
+ global $config;
+
+ /* mark each rule with the sequence number (to retain the order while sorting) */
+ for ($i = 0; isset($config['filter']['rule'][$i]); $i++) {
+ $config['filter']['rule'][$i]['seq'] = $i;
+ }
+
+ usort($config['filter']['rule'], "filter_rules_compare");
+
+ /* strip the sequence numbers again */
+ for ($i = 0; isset($config['filter']['rule'][$i]); $i++) {
+ unset($config['filter']['rule'][$i]['seq']);
+ }
+}
+function filter_rules_compare($a, $b) {
+ if (isset($a['floating']) && isset($b['floating'])) {
+ return $a['seq'] - $b['seq'];
+ } else if (isset($a['floating'])) {
+ return -1;
+ } else if (isset($b['floating'])) {
+ return 1;
+ } else if ($a['interface'] == $b['interface']) {
+ return $a['seq'] - $b['seq'];
+ } else {
+ return compare_interface_friendly_names($a['interface'], $b['interface']);
+ }
+}
+
+function generate_ipv6_from_mac($mac) {
+ $elements = explode(":", $mac);
+ if (count($elements) <> 6) {
+ return false;
+ }
+
+ $i = 0;
+ $ipv6 = "fe80::";
+ foreach ($elements as $byte) {
+ if ($i == 0) {
+ $hexadecimal = substr($byte, 1, 2);
+ $bitmap = base_convert($hexadecimal, 16, 2);
+ $bitmap = str_pad($bitmap, 4, "0", STR_PAD_LEFT);
+ $bitmap = substr($bitmap, 0, 2) ."1". substr($bitmap, 3, 4);
+ $byte = substr($byte, 0, 1) . base_convert($bitmap, 2, 16);
+ }
+ $ipv6 .= $byte;
+ if ($i == 1) {
+ $ipv6 .= ":";
+ }
+ if ($i == 3) {
+ $ipv6 .= ":";
+ }
+ if ($i == 2) {
+ $ipv6 .= "ff:fe";
+ }
+
+ $i++;
+ }
+ return $ipv6;
+}
+
+/****f* pfsense-utils/load_mac_manufacturer_table
+ * NAME
+ * load_mac_manufacturer_table
+ * INPUTS
+ * none
+ * RESULT
+ * returns associative array with MAC-Manufacturer pairs
+ ******/
+function load_mac_manufacturer_table() {
+ /* load MAC-Manufacture data from the file */
+ $macs = false;
+ if (file_exists("/usr/local/share/nmap/nmap-mac-prefixes")) {
+ $macs=file("/usr/local/share/nmap/nmap-mac-prefixes");
+ }
+ if ($macs) {
+ foreach ($macs as $line) {
+ if (preg_match('/([0-9A-Fa-f]{6}) (.*)$/', $line, $matches)) {
+ /* store values like this $mac_man['000C29']='VMware' */
+ $mac_man["$matches[1]"] = $matches[2];
+ }
+ }
+ return $mac_man;
+ } else {
+ return -1;
+ }
+
+}
+
+/****f* pfsense-utils/is_ipaddr_configured
+ * NAME
+ * is_ipaddr_configured
+ * INPUTS
+ * IP Address to check.
+ * If ignore_if is a VIP (not carp), vip array index is passed after string _virtualip
+ * check_localip - if true then also check for matches with PPTP and LT2P addresses
+ * check_subnets - if true then check if the given ipaddr is contained anywhere in the subnet of any other configured IP address
+ * cidrprefix - the CIDR prefix (16, 20, 24, 64...) of ipaddr.
+ * If check_subnets is true and cidrprefix is specified,
+ * then check if the ipaddr/cidrprefix subnet overlaps the subnet of any other configured IP address
+ * RESULT
+ * returns true if the IP Address is configured and present on this device or overlaps a configured subnet.
+*/
+function is_ipaddr_configured($ipaddr, $ignore_if = "", $check_localip = false, $check_subnets = false, $cidrprefix = "") {
+ if (count(where_is_ipaddr_configured($ipaddr, $ignore_if, $check_localip, $check_subnets, $cidrprefix))) {
+ return true;
+ }
+ return false;
+}
+
+/****f* pfsense-utils/where_is_ipaddr_configured
+ * NAME
+ * where_is_ipaddr_configured
+ * INPUTS
+ * IP Address to check.
+ * If ignore_if is a VIP (not carp), vip array index is passed after string _virtualip
+ * check_localip - if true then also check for matches with PPTP and LT2P addresses
+ * check_subnets - if true then check if the given ipaddr is contained anywhere in the subnet of any other configured IP address
+ * cidrprefix - the CIDR prefix (16, 20, 24, 64...) of ipaddr.
+ * If check_subnets is true and cidrprefix is specified,
+ * then check if the ipaddr/cidrprefix subnet overlaps the subnet of any other configured IP address
+ * RESULT
+ * Returns an array of the interfaces 'if' plus IP address or subnet 'ip_or_subnet' that match or overlap the IP address to check.
+ * If there are no matches then an empty array is returned.
+*/
+function where_is_ipaddr_configured($ipaddr, $ignore_if = "", $check_localip = false, $check_subnets = false, $cidrprefix = "") {
+ global $config;
+
+ $where_configured = array();
+
+ $pos = strpos($ignore_if, '_virtualip');
+ if ($pos !== false) {
+ $ignore_vip_id = substr($ignore_if, $pos+10);
+ $ignore_vip_if = substr($ignore_if, 0, $pos);
+ } else {
+ $ignore_vip_id = -1;
+ $ignore_vip_if = $ignore_if;
+ }
+
+ $isipv6 = is_ipaddrv6($ipaddr);
+
+ if ($check_subnets) {
+ $cidrprefix = intval($cidrprefix);
+ if ($isipv6) {
+ if (($cidrprefix < 1) || ($cidrprefix > 128)) {
+ $cidrprefix = 128;
+ }
+ } else {
+ if (($cidrprefix < 1) || ($cidrprefix > 32)) {
+ $cidrprefix = 32;
+ }
+ }
+ $iflist = get_configured_interface_list();
+ foreach ($iflist as $if => $ifname) {
+ if ($ignore_if == $if) {
+ continue;
+ }
+
+ if ($isipv6) {
+ $if_ipv6 = get_interface_ipv6($if);
+ $if_snbitsv6 = get_interface_subnetv6($if);
+ if ($if_ipv6 && $if_snbitsv6 && check_subnetsv6_overlap($ipaddr, $cidrprefix, $if_ipv6, $if_snbitsv6)) {
+ $where_entry = array();
+ $where_entry['if'] = $if;
+ $where_entry['ip_or_subnet'] = get_interface_ipv6($if) . "/" . get_interface_subnetv6($if);
+ $where_configured[] = $where_entry;
+ }
+ } else {
+ $if_ipv4 = get_interface_ip($if);
+ $if_snbitsv4 = get_interface_subnet($if);
+ if ($if_ipv4 && $if_snbitsv4 && check_subnets_overlap($ipaddr, $cidrprefix, $if_ipv4, $if_snbitsv4)) {
+ $where_entry = array();
+ $where_entry['if'] = $if;
+ $where_entry['ip_or_subnet'] = get_interface_ip($if) . "/" . get_interface_subnet($if);
+ $where_configured[] = $where_entry;
+ }
+ }
+ }
+ } else {
+ if ($isipv6) {
+ $interface_list_ips = get_configured_ipv6_addresses();
+ } else {
+ $interface_list_ips = get_configured_ip_addresses();
+ }
+
+ foreach ($interface_list_ips as $if => $ilips) {
+ if ($ignore_if == $if) {
+ continue;
+ }
+ if (strcasecmp($ipaddr, $ilips) == 0) {
+ $where_entry = array();
+ $where_entry['if'] = $if;
+ $where_entry['ip_or_subnet'] = $ilips;
+ $where_configured[] = $where_entry;
+ }
+ }
+ }
+
+ $interface_list_vips = get_configured_vips_list(true);
+ foreach ($interface_list_vips as $id => $vip) {
+ /* Skip CARP interfaces here since they were already checked above */
+ if ($id == $ignore_vip_id || (substr($ignore_if, 0, 4) == '_vip') && substr($ignore_vip_if, 5) == $vip['uniqdid']) {
+ continue;
+ }
+ if (strcasecmp($ipaddr, $vip['ipaddr']) == 0) {
+ $where_entry = array();
+ $where_entry['if'] = $vip['if'];
+ $where_entry['ip_or_subnet'] = $vip['ipaddr'];
+ $where_configured[] = $where_entry;
+ }
+ }
+
+ if ($check_localip) {
+ if (is_array($config['pptpd']) && !empty($config['pptpd']['localip']) && (strcasecmp($ipaddr, $config['pptpd']['localip']) == 0)) {
+ $where_entry = array();
+ $where_entry['if'] = 'pptp';
+ $where_entry['ip_or_subnet'] = $config['pptpd']['localip'];
+ $where_configured[] = $where_entry;
+ }
+
+ if (!is_array($config['l2tp']) && !empty($config['l2tp']['localip']) && (strcasecmp($ipaddr, $config['l2tp']['localip']) == 0)) {
+ $where_entry = array();
+ $where_entry['if'] = 'l2tp';
+ $where_entry['ip_or_subnet'] = $config['l2tp']['localip'];
+ $where_configured[] = $where_entry;
+ }
+ }
+
+ return $where_configured;
+}
+
+/****f* pfsense-utils/pfSense_handle_custom_code
+ * NAME
+ * pfSense_handle_custom_code
+ * INPUTS
+ * directory name to process
+ * RESULT
+ * globs the directory and includes the files
+ */
+function pfSense_handle_custom_code($src_dir) {
+ // Allow extending of the nat edit page and include custom input validation
+ if (is_dir("$src_dir")) {
+ $cf = glob($src_dir . "/*.inc");
+ foreach ($cf as $nf) {
+ if ($nf == "." || $nf == "..") {
+ continue;
+ }
+ // Include the extra handler
+ include("$nf");
+ }
+ }
+}
+
+function set_language($lang = 'en_US', $encoding = "UTF-8") {
+ putenv("LANG={$lang}.{$encoding}");
+ setlocale(LC_ALL, "{$lang}.{$encoding}");
+ textdomain("pfSense");
+ bindtextdomain("pfSense", "/usr/local/share/locale");
+ bind_textdomain_codeset("pfSense", "{$lang}.{$encoding}");
+}
+
+function get_locale_list() {
+ $locales = array(
+ "en_US" => gettext("English"),
+ "pt_BR" => gettext("Portuguese (Brazil)"),
+ "tr" => gettext("Turkish"),
+ );
+ asort($locales);
+ return $locales;
+}
+
+function system_get_language_code() {
+ global $config, $g_languages;
+
+ // a language code, as per [RFC3066]
+ $language = $config['system']['language'];
+ //$code = $g_languages[$language]['code'];
+ $code = str_replace("_", "-", $language);
+
+ if (empty($code)) {
+ $code = "en-US"; // Set default code.
+ }
+
+ return $code;
+}
+
+function system_get_language_codeset() {
+ global $config, $g_languages;
+
+ $language = $config['system']['language'];
+ $codeset = $g_languages[$language]['codeset'];
+
+ if (empty($codeset)) {
+ $codeset = "UTF-8"; // Set default codeset.
+ }
+
+ return $codeset;
+}
+
+/* Available languages/locales */
+$g_languages = array (
+ "sq" => array("codeset" => "UTF-8", "desc" => gettext("Albanian")),
+ "bg" => array("codeset" => "UTF-8", "desc" => gettext("Bulgarian")),
+ "zh_CN" => array("codeset" => "UTF-8", "desc" => gettext("Chinese (Simplified)")),
+ "zh_TW" => array("codeset" => "UTF-8", "desc" => gettext("Chinese (Traditional)")),
+ "nl" => array("codeset" => "UTF-8", "desc" => gettext("Dutch")),
+ "da" => array("codeset" => "UTF-8", "desc" => gettext("Danish")),
+ "en_US" => array("codeset" => "UTF-8", "desc" => gettext("English")),
+ "fi" => array("codeset" => "UTF-8", "desc" => gettext("Finnish")),
+ "fr" => array("codeset" => "UTF-8", "desc" => gettext("French")),
+ "de" => array("codeset" => "UTF-8", "desc" => gettext("German")),
+ "el" => array("codeset" => "UTF-8", "desc" => gettext("Greek")),
+ "hu" => array("codeset" => "UTF-8", "desc" => gettext("Hungarian")),
+ "it" => array("codeset" => "UTF-8", "desc" => gettext("Italian")),
+ "ja" => array("codeset" => "UTF-8", "desc" => gettext("Japanese")),
+ "ko" => array("codeset" => "UTF-8", "desc" => gettext("Korean")),
+ "lv" => array("codeset" => "UTF-8", "desc" => gettext("Latvian")),
+ "nb" => array("codeset" => "UTF-8", "desc" => gettext("Norwegian (Bokmal)")),
+ "pl" => array("codeset" => "UTF-8", "desc" => gettext("Polish")),
+ "pt_BR" => array("codeset" => "UTF-8", "desc" => gettext("Portuguese (Brazil)")),
+ "pt" => array("codeset" => "UTF-8", "desc" => gettext("Portuguese (Portugal)")),
+ "ro" => array("codeset" => "UTF-8", "desc" => gettext("Romanian")),
+ "ru" => array("codeset" => "UTF-8", "desc" => gettext("Russian")),
+ "sl" => array("codeset" => "UTF-8", "desc" => gettext("Slovenian")),
+ "tr" => array("codeset" => "UTF-8", "desc" => gettext("Turkish")),
+ "es" => array("codeset" => "UTF-8", "desc" => gettext("Spanish")),
+ "sv" => array("codeset" => "UTF-8", "desc" => gettext("Swedish")),
+ "sk" => array("codeset" => "UTF-8", "desc" => gettext("Slovak")),
+ "cs" => array("codeset" => "UTF-8", "desc" => gettext("Czech"))
+);
+
+function return_hex_ipv4($ipv4) {
+ if (!is_ipaddrv4($ipv4)) {
+ return(false);
+ }
+
+ /* we need the hex form of the interface IPv4 address */
+ $ip4arr = explode(".", $ipv4);
+ return (sprintf("%02x%02x%02x%02x", $ip4arr[0], $ip4arr[1], $ip4arr[2], $ip4arr[3]));
+}
+
+function convert_ipv6_to_128bit($ipv6) {
+ if (!is_ipaddrv6($ipv6)) {
+ return(false);
+ }
+
+ $ip6arr = array();
+ $ip6prefix = Net_IPv6::uncompress($ipv6);
+ $ip6arr = explode(":", $ip6prefix);
+ /* binary presentation of the prefix for all 128 bits. */
+ $ip6prefixbin = "";
+ foreach ($ip6arr as $element) {
+ $ip6prefixbin .= sprintf("%016b", hexdec($element));
+ }
+ return($ip6prefixbin);
+}
+
+function convert_128bit_to_ipv6($ip6bin) {
+ if (strlen($ip6bin) <> 128) {
+ return(false);
+ }
+
+ $ip6arr = array();
+ $ip6binarr = array();
+ $ip6binarr = str_split($ip6bin, 16);
+ foreach ($ip6binarr as $binpart) {
+ $ip6arr[] = dechex(bindec($binpart));
+ }
+ $ip6addr = Net_IPv6::compress(implode(":", $ip6arr));
+
+ return($ip6addr);
+}
+
+
+/* Returns the calculated bit length of the prefix delegation from the WAN interface */
+/* DHCP-PD is variable, calculate from the prefix-len on the WAN interface */
+/* 6rd is variable, calculate from 64 - (v6 prefixlen - (32 - v4 prefixlen)) */
+/* 6to4 is 16 bits, e.g. 65535 */
+function calculate_ipv6_delegation_length($if) {
+ global $config;
+
+ if (!is_array($config['interfaces'][$if])) {
+ return false;
+ }
+
+ switch ($config['interfaces'][$if]['ipaddrv6']) {
+ case "6to4":
+ $pdlen = 16;
+ break;
+ case "6rd":
+ $rd6cfg = $config['interfaces'][$if];
+ $rd6plen = explode("/", $rd6cfg['prefix-6rd']);
+ $pdlen = (64 - ($rd6plen[1] + (32 - $rd6cfg['prefix-6rd-v4plen'])));
+ break;
+ case "dhcp6":
+ $dhcp6cfg = $config['interfaces'][$if];
+ $pdlen = $dhcp6cfg['dhcp6-ia-pd-len'];
+ break;
+ default:
+ $pdlen = 0;
+ break;
+ }
+ return($pdlen);
+}
+
+function huawei_rssi_to_string($rssi) {
+ $dbm = array();
+ $i = 0;
+ $dbstart = -113;
+ while ($i < 32) {
+ $dbm[$i] = $dbstart + ($i * 2);
+ $i++;
+ }
+ $percent = round(($rssi / 31) * 100);
+ $string = "rssi:{$rssi} level:{$dbm[$rssi]}dBm percent:{$percent}%";
+ return $string;
+}
+
+function huawei_mode_to_string($mode, $submode) {
+ $modes[0] = "None";
+ $modes[1] = "AMPS";
+ $modes[2] = "CDMA";
+ $modes[3] = "GSM/GPRS";
+ $modes[4] = "HDR";
+ $modes[5] = "WCDMA";
+ $modes[6] = "GPS";
+
+ $submodes[0] = "No Service";
+ $submodes[1] = "GSM";
+ $submodes[2] = "GPRS";
+ $submodes[3] = "EDGE";
+ $submodes[4] = "WCDMA";
+ $submodes[5] = "HSDPA";
+ $submodes[6] = "HSUPA";
+ $submodes[7] = "HSDPA+HSUPA";
+ $submodes[8] = "TD-SCDMA";
+ $submodes[9] = "HSPA+";
+ $string = "{$modes[$mode]}, {$submodes[$submode]} Mode";
+ return $string;
+}
+
+function huawei_service_to_string($state) {
+ $modes[0] = "No";
+ $modes[1] = "Restricted";
+ $modes[2] = "Valid";
+ $modes[3] = "Restricted Regional";
+ $modes[4] = "Powersaving";
+ $string = "{$modes[$state]} Service";
+ return $string;
+}
+
+function huawei_simstate_to_string($state) {
+ $modes[0] = "Invalid SIM/locked";
+ $modes[1] = "Valid SIM";
+ $modes[2] = "Invalid SIM CS";
+ $modes[3] = "Invalid SIM PS";
+ $modes[4] = "Invalid SIM CS/PS";
+ $modes[255] = "Missing SIM";
+ $string = "{$modes[$state]} State";
+ return $string;
+}
+
+function zte_rssi_to_string($rssi) {
+ return huawei_rssi_to_string($rssi);
+}
+
+function zte_mode_to_string($mode, $submode) {
+ $modes[0] = "No Service";
+ $modes[1] = "Limited Service";
+ $modes[2] = "GPRS";
+ $modes[3] = "GSM";
+ $modes[4] = "UMTS";
+ $modes[5] = "EDGE";
+ $modes[6] = "HSDPA";
+
+ $submodes[0] = "CS_ONLY";
+ $submodes[1] = "PS_ONLY";
+ $submodes[2] = "CS_PS";
+ $submodes[3] = "CAMPED";
+ $string = "{$modes[$mode]}, {$submodes[$submode]} Mode";
+ return $string;
+}
+
+function zte_service_to_string($state) {
+ $modes[0] = "Initializing";
+ $modes[1] = "Network Lock error";
+ $modes[2] = "Network Locked";
+ $modes[3] = "Unlocked or correct MCC/MNC";
+ $string = "{$modes[$state]} Service";
+ return $string;
+}
+
+function zte_simstate_to_string($state) {
+ $modes[0] = "No action";
+ $modes[1] = "Network lock";
+ $modes[2] = "(U)SIM card lock";
+ $modes[3] = "Network Lock and (U)SIM card Lock";
+ $string = "{$modes[$state]} State";
+ return $string;
+}
+
+function get_configured_pppoe_server_interfaces() {
+ global $config;
+ $iflist = array();
+ if (is_array($config['pppoes']['pppoe'])) {
+ foreach ($config['pppoes']['pppoe'] as $pppoe) {
+ if ($pppoe['mode'] == "server") {
+ $int = "poes". $pppoe['pppoeid'];
+ $iflist[$int] = strtoupper($int);
+ }
+ }
+ }
+ return $iflist;
+}
+
+function get_pppoes_child_interfaces($ifpattern) {
+ $if_arr = array();
+ if ($ifpattern == "") {
+ return;
+ }
+
+ exec("ifconfig", $out, $ret);
+ foreach ($out as $line) {
+ if (preg_match("/^({$ifpattern}[0-9]+):/i", $line, $match)) {
+ $if_arr[] = $match[1];
+ }
+ }
+ return $if_arr;
+
+}
+
+/****f* pfsense-utils/pkg_call_plugins
+ * NAME
+ * pkg_call_plugins
+ * INPUTS
+ * $plugin_type value used to search in package configuration if the plugin is used, also used to create the function name
+ * $plugin_params parameters to pass to the plugin function for passing multiple parameters a array can be used.
+ * RESULT
+ * returns associative array results from the plugin calls for each package
+ * NOTES
+ * This generic function can be used to notify or retrieve results from functions that are defined in packages.
+ ******/
+function pkg_call_plugins($plugin_type, $plugin_params) {
+ global $g, $config;
+ $results = array();
+ if (!is_array($config['installedpackages']['package'])) {
+ return $results;
+ }
+ foreach ($config['installedpackages']['package'] as $package) {
+ if (!file_exists("/usr/local/pkg/" . $package['configurationfile'])) {
+ continue;
+ }
+ $pkg_config = parse_xml_config_pkg("/usr/local/pkg/" . $package['configurationfile'], 'packagegui');
+ $pkgname = substr(reverse_strrchr($package['configurationfile'], "."), 0, -1);
+ if (is_array($pkg_config['plugins']['item'])) {
+ foreach ($pkg_config['plugins']['item'] as $plugin) {
+ if ($plugin['type'] == $plugin_type) {
+ if (file_exists($pkg_config['include_file'])) {
+ require_once($pkg_config['include_file']);
+ } else {
+ continue;
+ }
+ $plugin_function = $pkgname . '_'. $plugin_type;
+ $results[$pkgname] = call_user_func($plugin_function, $plugin_params);
+ }
+ }
+ }
+ }
+ return $results;
+}
+
+/* Function to find and return the active XML RPC base URL to avoid code duplication */
+function get_active_xml_rpc_base_url() {
+ global $config, $g;
+ /* If the user has activated the option to enable an alternate xmlrpcbaseurl, and it's not empty, then use it */
+ if (isset($config['system']['altpkgrepo']['enable']) && !empty($config['system']['altpkgrepo']['xmlrpcbaseurl'])) {
+ return $config['system']['altpkgrepo']['xmlrpcbaseurl'];
+ } else {
+ return $g['xmlrpcbaseurl'];
+ }
+}
+
+?>
diff --git a/src/etc/inc/pkg-utils.inc b/src/etc/inc/pkg-utils.inc
new file mode 100644
index 0000000..54c018d
--- /dev/null
+++ b/src/etc/inc/pkg-utils.inc
@@ -0,0 +1,953 @@
+<?php
+/****h* pfSense/pkg-utils
+ NAME
+ pkg-utils.inc - Package subsystem
+ DESCRIPTION
+ This file contains various functions used by the pfSense package system.
+ HISTORY
+ $Id$
+
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2005-2006 Colin Smith (ethethlay@gmail.com)
+ All rights reserved.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ */
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/cd /usr/bin/tar /usr/sbin/fifolog_create /bin/chmod
+ pfSense_BUILDER_BINARIES: /usr/sbin/pkg_add /usr/sbin/pkg_info /usr/sbin/pkg_delete /bin/rm
+ pfSense_MODULE: pkg
+*/
+
+require_once("globals.inc");
+require_once("service-utils.inc");
+
+if (file_exists("/cf/conf/use_xmlreader")) {
+ require_once("xmlreader.inc");
+} else {
+ require_once("xmlparse.inc");
+}
+
+require_once("pfsense-utils.inc");
+
+if (!function_exists("pkg_debug")) {
+ /* set up logging if needed */
+ function pkg_debug($msg) {
+ global $g, $debug, $fd_log;
+
+ if (!$debug) {
+ return;
+ }
+
+ if (!$fd_log) {
+ if (!$fd_log = fopen("{$g['tmp_path']}/pkg_mgr_debug.log", "w")) {
+ update_output_window("Warning, could not open log for writing.");
+ }
+ }
+ @fwrite($fd_log, $msg);
+ }
+}
+
+global $g;
+if (!isset($g['platform'])) {
+ $g['platform'] = trim(file_get_contents("/etc/platform"));
+}
+
+/* Remove pkg_prefix from package name if it's present */
+function pkg_remove_prefix(&$pkg_name) {
+ global $g;
+
+ if (substr($pkg_name, 0, strlen($g['pkg_prefix'])) == $g['pkg_prefix']) {
+ $pkg_name = substr($pkg_name, strlen($g['pkg_prefix']));
+ }
+}
+
+/* Execute a pkg call */
+function pkg_call($params, $mute = false) {
+ global $static_output, $g, $config;
+
+ if (empty($params)) {
+ return false;
+ }
+
+ $user_agent = $g['product_name'] . '/' . $g['product_version'];
+ if (!isset($config['system']['host_uuid'])) {
+ $user_agent .= ' : ' . get_single_sysctl('kern.hostuuid');
+ }
+
+ $env = array(
+ "HTTP_USER_AGENT" => $user_agent,
+ "ASSUME_ALWAYS_YES" => "true"
+ );
+
+ $debug_fifo = $g['tmp_path'] . "/pkg-debug.fifo";
+ if (!file_exists($debug_fifo)) {
+ posix_mkfifo($debug_fifo, 0600);
+ }
+
+ if (filetype($debug_fifo) == 'fifo') {
+ $env["EVENT_PIPE"] = $debug_fifo;
+ }
+
+ $descriptorspec = array(
+ 1 => array("pipe", "w"), /* stdout */
+ 2 => array("pipe", "w") /* stderr */
+ );
+
+ pkg_debug("pkg_call(): {$params}\n");
+ $process = proc_open("/usr/sbin/pkg {$params}", $descriptorspec, $pipes, '/', $env);
+
+ if (!is_resource($process)) {
+ return false;
+ }
+
+ stream_set_blocking($pipes[1], 0);
+ stream_set_blocking($pipes[2], 0);
+
+ /* XXX: should be a tunnable? */
+ $timeout = 300; // seconds
+ $error_log = '';
+
+ do {
+ $write = array();
+ $read = array($pipes[1], $pipes[2]);
+ $except = array();
+
+ $stream = stream_select($read, $write, $except, null, $timeout);
+ if ($stream !== FALSE && $stream > 0) {
+ foreach ($read as $pipe) {
+ $content = stream_get_contents($pipe);
+ if ($content == '') {
+ continue;
+ }
+ if ($pipe === $pipes[1]) {
+ if (!$mute) {
+ $static_output .= $content;
+ update_output_window($static_output);
+ }
+ flush();
+ } else if ($pipe === $pipes[2]) {
+ $error_log .= $content;
+ }
+ }
+ }
+ $status = proc_get_status($process);
+ } while ($status['running']);
+ fclose($pipes[1]);
+ fclose($pipes[2]);
+ proc_close($process);
+
+ $rc = $status['exitcode'];
+
+ pkg_debug("pkg_call(): rc = {$rc}\n");
+ if ($rc == 0) {
+ return true;
+ }
+
+ pkg_debug("pkg_call(): error_log\n{$error_log}\n");
+ if (!$mute) {
+ $static_output .= "\n\n" . sprintf(gettext("ERROR!!! An error occurred on pkg execution (rc = %d) with parameters '%s':"), $rc, $params) . "\n" . $error_log;
+ update_output_window($static_output);
+ }
+ return false;
+}
+
+/* Execute pkg with $params, fill stdout and stderr and return pkg rc */
+function pkg_exec($params, &$stdout, &$stderr) {
+ global $g, $config;
+
+ if (empty($params)) {
+ return -1;
+ }
+
+ $user_agent = $g['product_name'] . '/' . $g['product_version'];
+ if (!isset($config['system']['host_uuid'])) {
+ $user_agent .= ' : ' . get_single_sysctl('kern.hostuuid');
+ }
+
+ $env = array(
+ "HTTP_USER_AGENT" => $user_agent,
+ "ASSUME_ALWAYS_YES" => "true"
+ );
+
+ $debug_fifo = $g['tmp_path'] . "/pkg-debug.fifo";
+ if (!file_exists($debug_fifo)) {
+ posix_mkfifo($debug_fifo, 0600);
+ }
+
+ if (filetype($debug_fifo) == 'fifo') {
+ $env["EVENT_PIPE"] = $debug_fifo;
+ }
+
+ $descriptorspec = array(
+ 1 => array("pipe", "w"), /* stdout */
+ 2 => array("pipe", "w") /* stderr */
+ );
+
+ pkg_debug("pkg_exec(): {$params}\n");
+ $process = proc_open("/usr/sbin/pkg {$params}", $descriptorspec, $pipes, '/', $env);
+
+ if (!is_resource($process)) {
+ return -1;
+ }
+
+ $stdout = '';
+ while (($l = fgets($pipes[1])) !== FALSE) {
+ $stdout .= $l;
+ }
+ fclose($pipes[1]);
+
+ $stderr = '';
+ while (($l = fgets($pipes[2])) !== FALSE) {
+ $stderr .= $l;
+ }
+ fclose($pipes[2]);
+
+ return proc_close($process);
+}
+
+/* Check if package is installed */
+function is_pkg_installed($pkg_name) {
+ global $g;
+
+ pkg_remove_prefix($pkg_name);
+
+ return pkg_call("info -e " . $g['pkg_prefix'] . $pkg_name, true);
+}
+
+/* Install package, $pkg_name should not contain prefix */
+function pkg_install($pkg_name) {
+ global $g;
+ $result = false;
+
+ pkg_remove_prefix($pkg_name);
+
+ pkg_debug("Installing package {$pkg_name}\n");
+ if (!is_pkg_installed($pkg_name)) {
+ $result = pkg_call("install -y " . $g['pkg_prefix'] . $pkg_name);
+ /* Cleanup cacke to free disk space */
+ pkg_call("clean -y");
+ }
+
+ return $result;
+}
+
+/* Delete package from FreeBSD, $pkg_name should not contain prefix */
+function pkg_delete($pkg_name) {
+ global $g;
+
+ pkg_remove_prefix($pkg_name);
+
+ pkg_debug("Removing package {$pkg_name}\n");
+ if (is_pkg_installed($pkg_name)) {
+ pkg_call("delete -y " . $g['pkg_prefix'] . $pkg_name);
+ /* Cleanup unecessary dependencies */
+ pkg_call("autoremove -y");
+ }
+}
+
+/* Check if package is present in config.xml */
+function is_package_installed($package_name) {
+ return (get_package_id($package_name) != -1);
+}
+
+/* Find package array index */
+function get_package_id($package_name) {
+ global $config;
+
+ if (!is_array($config['installedpackages']['package'])) {
+ return -1;
+ }
+
+ foreach ($config['installedpackages']['package'] as $idx => $pkg) {
+ if ($pkg['name'] == $package_name) {
+ return $idx;
+ }
+ }
+
+ return -1;
+}
+
+/* Keep backward compatibility since snort/suricata use this function */
+function get_pkg_id($package_name) {
+ return get_package_id($package_name);
+}
+
+/* Return internal_name when it's defined, otherwise, returns name */
+function get_package_internal_name($package_data) {
+ if (isset($package_data['internal_name']) && ($package_data['internal_name'] != "")) {
+ /* e.g. name is Ipguard-dev, internal name is ipguard */
+ return $package_data['internal_name'];
+ } else {
+ return $package_data['name'];
+ }
+}
+
+/* Get information about packages */
+function get_pkg_info($pkgs = 'all', $info = 'all') {
+ global $g, $static_output;
+
+ $out = '';
+ $err = '';
+
+ if ($pkgs == 'all') {
+ $pkgs = $g['pkg_prefix'];
+ }
+
+ /* Make sure repo metadata is up2date */
+ $static_output .= "\n" . gettext("Updating package repository metadada...") . "\n";
+ update_status($static_output);
+ if (!pkg_call("update")) {
+ $static_output .= "\n" . gettext("ERROR: An error occurred when updating packages repository. Aborting...") . "\n";
+ update_status($static_output);
+ return array();
+ }
+
+ $rc = pkg_exec("search -U --raw-format json-compact " . $pkgs, $out, $err);
+
+ if ($rc != 0) {
+ $static_output .= "\n" . gettext("ERROR: Error trying to get packages list. Aborting...") . "\n";
+ $static_output .= $err;
+ update_status($static_output);
+ return array();
+ }
+
+ $result = array();
+ $pkgs_info = explode("\n", $out);
+ foreach ($pkgs_info as $pkg_info_json) {
+ $pkg_info = json_decode($pkg_info_json, true);
+ if (!isset($pkg_info['name'])) {
+ continue;
+ }
+
+ $result[] = $pkg_info;
+ unset($pkg_info);
+ }
+
+ return $result;
+}
+
+/*
+ * resync_all_package_configs() Force packages to setup their configuration and rc.d files.
+ * This function may also print output to the terminal indicating progress.
+ */
+function resync_all_package_configs($show_message = false) {
+ global $config, $pkg_interface, $g;
+
+ log_error(gettext("Resyncing configuration for all packages."));
+
+ if (!is_array($config['installedpackages']['package'])) {
+ return;
+ }
+
+ if ($show_message == true) {
+ echo "Syncing packages:";
+ }
+
+ conf_mount_rw();
+
+ foreach ($config['installedpackages']['package'] as $idx => $package) {
+ if (empty($package['name'])) {
+ continue;
+ }
+ if ($show_message == true) {
+ echo " " . $package['name'];
+ }
+ if (platform_booting() != true) {
+ stop_service(get_package_internal_name($package));
+ }
+ sync_package($package['name']);
+ if ($pkg_interface == "console") {
+ echo "\n" . gettext("Syncing packages:");
+ }
+ }
+
+ if ($show_message == true) {
+ echo " done.\n";
+ }
+
+ @unlink("/conf/needs_package_sync");
+ conf_mount_ro();
+}
+
+function uninstall_package($package_name) {
+ global $config, $static_output;
+
+ $internal_name = $package_name;
+ $id = get_package_id($package_name);
+ if ($id >= 0) {
+ $internal_name = get_package_internal_name($config['installedpackages']['package'][$id]);
+ stop_service($internal_name);
+ }
+
+ if (is_pkg_installed($internal_name)) {
+ $static_output .= "Removing package...\n";
+ update_output_window($static_output);
+ pkg_delete($internal_name);
+ } else {
+ delete_package_xml($package_name);
+ }
+
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+}
+
+/* Run <custom_php_resync_config_command> */
+function sync_package($package_name) {
+ global $config, $builder_package_install;
+
+ // If this code is being called by pfspkg_installer
+ // which the builder system uses then return (ignore).
+ if ($builder_package_install) {
+ return;
+ }
+
+ if (empty($config['installedpackages']['package'])) {
+ return;
+ }
+
+ if (($pkg_id = get_package_id($package_name)) == -1) {
+ return; // This package doesn't really exist - exit the function.
+ }
+
+ if (!is_array($config['installedpackages']['package'][$pkg_id])) {
+ return; // No package belongs to the pkg_id passed to this function.
+ }
+
+ $package =& $config['installedpackages']['package'][$pkg_id];
+ if (!file_exists("/usr/local/pkg/" . $package['configurationfile'])) {
+ log_error(sprintf(gettext("The %s package is missing its configuration file and must be reinstalled."), $package['name']));
+ delete_package_xml($package['name']);
+ return;
+ }
+
+ $pkg_config = parse_xml_config_pkg("/usr/local/pkg/" . $package['configurationfile'], "packagegui");
+ if (isset($pkg_config['nosync'])) {
+ return;
+ }
+
+ /* Bring in package include files */
+ if (!empty($pkg_config['include_file'])) {
+ $include_file = $pkg_config['include_file'];
+ if (file_exists($include_file)) {
+ require_once($include_file);
+ } else {
+ log_error("Reinstalling package {$package['name']} because its include file({$include_file}) is missing!");
+ uninstall_package($package['name']);
+ if (install_package($package['name']) != 0) {
+ log_error("Reinstalling package {$package['name']} failed. Take appropriate measures!!!");
+ return;
+ }
+ if (file_exists($include_file)) {
+ require_once($include_file);
+ } else {
+ return;
+ }
+ }
+ }
+
+ if (!empty($pkg_config['custom_php_global_functions'])) {
+ eval($pkg_config['custom_php_global_functions']);
+ }
+ if (!empty($pkg_config['custom_php_resync_config_command'])) {
+ eval($pkg_config['custom_php_resync_config_command']);
+ }
+}
+
+/* Read info.xml installed by package and return an array */
+function read_package_config($package_name) {
+ global $g;
+
+ $pkg_info_xml = '/usr/local/share/' . $g['pkg_prefix'] . $package_name . '/info.xml';
+
+ if (!file_exists($pkg_info_xml)) {
+ return false;
+ }
+
+ $pkg_info = parse_xml_config_pkg($pkg_info_xml, 'pfsensepkgs');
+
+ if (empty($pkg_info)) {
+ return false;
+ }
+
+ /* it always returns an array with 1 item */
+ return $pkg_info['package'][0];
+}
+
+function get_after_install_info($package_name) {
+ $pkg_config = read_package_config($package_name);
+
+ if (isset($pkg_config['after_install_info'])) {
+ return $pkg_config['after_install_info'];
+ }
+
+ return '';
+}
+
+function eval_once($toeval) {
+ global $evaled;
+ if (!$evaled) {
+ $evaled = array();
+ }
+ $evalmd5 = md5($toeval);
+ if (!in_array($evalmd5, $evaled)) {
+ @eval($toeval);
+ $evaled[] = $evalmd5;
+ }
+ return;
+}
+
+function install_package($package_name) {
+ global $g, $config, $static_output, $pkg_interface;
+
+ if ($pkg_interface == "console") {
+ echo "\n";
+ }
+
+ return pkg_install($package_name);
+}
+
+function install_package_xml($package_name) {
+ global $g, $config, $static_output, $pkg_interface;
+
+ if ($pkg_interface == "console") {
+ echo "\n";
+ }
+
+ if (($pkg_info = read_package_config($package_name)) == false) {
+ return false;
+ }
+
+ /* safe side. Write config below will send to ro again. */
+ conf_mount_rw();
+
+ pkg_debug(gettext("Beginning package installation.") . "\n");
+ log_error(sprintf(gettext('Beginning package installation for %s .'), $pkg_info['name']));
+ $static_output .= sprintf(gettext("Beginning package installation for %s .\n"), $pkg_info['name']);
+ update_status($static_output);
+
+ /* add package information to config.xml */
+ $pkgid = get_package_id($pkg_info['name']);
+ $static_output .= gettext("Saving updated package information...") . " ";
+ update_output_window($static_output);
+ if ($pkgid == -1) {
+ $config['installedpackages']['package'][] = $pkg_info;
+ $changedesc = sprintf(gettext("Installed %s package."), $pkg_info['name']);
+ $to_output = gettext("done.") . "\n";
+ } else {
+ $config['installedpackages']['package'][$pkgid] = $pkg_info;
+ $changedesc = sprintf(gettext("Overwrote previous installation of %s."), $pkg_info['name']);
+ $to_output = gettext("overwrite!") . "\n";
+ }
+ unlink_if_exists('/conf/needs_package_sync');
+ conf_mount_ro();
+ write_config("Intermediate config write during package install for {$pkg_info['name']}.");
+ $static_output .= $to_output;
+ update_output_window($static_output);
+
+ if (($pkgid = get_package_id($package_name)) == -1) {
+ $static_output .= sprintf(gettext("The %s package is not installed.%sInstallation aborted."), $package_name, "\n\n");
+ update_output_window($static_output);
+ if ($pkg_interface <> "console") {
+ echo "\n<script type=\"text/javascript\">document.progressbar.style.visibility='hidden';</script>";
+ echo "\n<script type=\"text/javascript\">document.progholder.style.visibility='hidden';</script>";
+ }
+
+ uninstall_package($package_name);
+ write_config($changedesc);
+ log_error(sprintf(gettext("Failed to install package: %s."), $pkg_info['name']));
+ $static_output .= gettext("Failed to install package.") . "\n";
+ update_output_window($static_output);
+ return false;
+ }
+
+ $configfile = substr(strrchr($pkg_info['config_file'], '/'), 1);
+ if (file_exists("/usr/local/pkg/" . $configfile)) {
+ $static_output .= gettext("Loading package configuration... ");
+ update_output_window($static_output);
+ $pkg_config = parse_xml_config_pkg("/usr/local/pkg/" . $configfile, "packagegui");
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ $static_output .= gettext("Configuring package components...\n");
+ if (!empty($pkg_config['filter_rules_needed'])) {
+ $config['installedpackages']['package'][$pkgid]['filter_rule_function'] = $pkg_config['filter_rules_needed'];
+ }
+ update_output_window($static_output);
+ /* modify system files */
+
+ /* if a require exists, include it. this will
+ * show us where an error exists in a package
+ * instead of making us blindly guess
+ */
+ $missing_include = false;
+ if ($pkg_config['include_file'] <> "") {
+ $static_output .= gettext("Loading package instructions...") . "\n";
+ update_output_window($static_output);
+ if (file_exists($pkg_config['include_file'])) {
+ pkg_debug("require_once('{$pkg_config['include_file']}')\n");
+ require_once($pkg_config['include_file']);
+ } else {
+ pkg_debug("Missing include {$pkg_config['include_file']}\n");
+ $missing_include = true;
+ $static_output .= "Include " . basename($pkg_config['include_file']) . " is missing!\n";
+ update_output_window($static_output);
+
+ uninstall_package($package_name);
+ write_config($changedesc);
+ log_error(sprintf(gettext("Failed to install package: %s."), $pkg_info['name']));
+ $static_output .= gettext("Failed to install package.") . "\n";
+ update_output_window($static_output);
+ return false;
+ }
+ }
+
+ /* custom commands */
+ $static_output .= gettext("Custom commands...") . "\n";
+ update_output_window($static_output);
+ if ($missing_include == false) {
+ if ($pkg_config['custom_php_global_functions'] <> "") {
+ $static_output .= gettext("Executing custom_php_global_functions()...");
+ update_output_window($static_output);
+ eval_once($pkg_config['custom_php_global_functions']);
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ }
+ if ($pkg_config['custom_php_install_command']) {
+ $static_output .= gettext("Executing custom_php_install_command()...");
+ update_output_window($static_output);
+ eval_once($pkg_config['custom_php_install_command']);
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ }
+ if ($pkg_config['custom_php_resync_config_command'] <> "") {
+ $static_output .= gettext("Executing custom_php_resync_config_command()...");
+ update_output_window($static_output);
+ eval_once($pkg_config['custom_php_resync_config_command']);
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ }
+ }
+ /* sidebar items */
+ if (is_array($pkg_config['menu'])) {
+ $static_output .= gettext("Menu items... ");
+ update_output_window($static_output);
+ foreach ($pkg_config['menu'] as $menu) {
+ if (is_array($config['installedpackages']['menu'])) {
+ foreach ($config['installedpackages']['menu'] as $amenu) {
+ if ($amenu['name'] == $menu['name']) {
+ continue 2;
+ }
+ }
+ } else {
+ $config['installedpackages']['menu'] = array();
+ }
+ $config['installedpackages']['menu'][] = $menu;
+ }
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ }
+ /* services */
+ if (is_array($pkg_config['service'])) {
+ $static_output .= gettext("Services... ");
+ update_output_window($static_output);
+ foreach ($pkg_config['service'] as $service) {
+ if (is_array($config['installedpackages']['service'])) {
+ foreach ($config['installedpackages']['service'] as $aservice) {
+ if ($aservice['name'] == $service['name']) {
+ continue 2;
+ }
+ }
+ } else {
+ $config['installedpackages']['service'] = array();
+ }
+ $config['installedpackages']['service'][] = $service;
+ }
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ }
+ } else {
+ pkg_debug("Unable to find config file\n");
+ $static_output .= gettext("Loading package configuration... failed!") . "\n\n" . gettext("Installation aborted.");
+ update_output_window($static_output);
+ pkg_debug(gettext("Unable to load package configuration. Installation aborted.") ."\n");
+ if ($pkg_interface <> "console") {
+ echo "\n<script type=\"text/javascript\">document.progressbar.style.visibility='hidden';</script>";
+ echo "\n<script type=\"text/javascript\">document.progholder.style.visibility='hidden';</script>";
+ }
+
+ uninstall_package($package_name);
+ write_config($changedesc);
+ log_error(sprintf(gettext("Failed to install package: %s."), $pkg_info['name']));
+ $static_output .= gettext("Failed to install package.") . "\n";
+ update_output_window($static_output);
+ return false;
+ }
+
+ /* set up package logging streams */
+ if ($pkg_info['logging']) {
+ system_syslogd_start();
+ }
+
+ $static_output .= gettext("Writing configuration... ");
+ update_output_window($static_output);
+ write_config($changedesc);
+ log_error(sprintf(gettext("Successfully installed package: %s."), $pkg_info['name']));
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ if ($pkg_info['after_install_info']) {
+ update_output_window($pkg_info['after_install_info']);
+ }
+
+ return true;
+}
+
+function delete_package($package_name) {
+ global $config, $g, $static_output;
+
+ if (!is_package_installed($package_name)) {
+ return;
+ }
+
+ $static_output .= sprintf(gettext("Starting package deletion for %s..."), $package_name);
+ update_output_window($static_output);
+
+ pkg_delete($package_name);
+ $static_output .= "done.\n";
+ update_output_window($static_output);
+
+ return;
+}
+
+function delete_package_xml($package_name, $when = "post-deinstall") {
+ global $g, $config, $static_output, $pkg_interface;
+
+ conf_mount_rw();
+
+ $pkgid = get_package_id($package_name);
+ if ($pkgid == -1) {
+ $static_output .= sprintf(gettext("The %s package is not installed.%sDeletion aborted."), $package_name, "\n\n");
+ update_output_window($static_output);
+ if ($pkg_interface <> "console") {
+ echo "\n<script type=\"text/javascript\">document.progressbar.style.visibility='hidden';</script>";
+ echo "\n<script type=\"text/javascript\">document.progholder.style.visibility='hidden';</script>";
+ }
+ ob_flush();
+ sleep(1);
+ conf_mount_ro();
+ return;
+ }
+ pkg_debug(sprintf(gettext("Removing %s package... "), $package_name));
+ $static_output .= sprintf(gettext("Removing %s components..."), $package_name) . "\n";
+ update_output_window($static_output);
+ /* parse package configuration */
+ $packages = &$config['installedpackages']['package'];
+ $menus =& $config['installedpackages']['menu'];
+ $services = &$config['installedpackages']['service'];
+ $pkg_info =& $packages[$pkgid];
+ if (file_exists("/usr/local/pkg/" . $pkg_info['configurationfile'])) {
+ $pkg_config = parse_xml_config_pkg("/usr/local/pkg/" . $packages[$pkgid]['configurationfile'], "packagegui");
+ /* remove menu items */
+ if (is_array($pkg_config['menu'])) {
+ $static_output .= gettext("Menu items... ");
+ update_output_window($static_output);
+ if (is_array($pkg_config['menu']) && is_array($menus)) {
+ foreach ($pkg_config['menu'] as $menu) {
+ foreach ($menus as $key => $instmenu) {
+ if ($instmenu['name'] == $menu['name']) {
+ unset($menus[$key]);
+ break;
+ }
+ }
+ }
+ }
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ }
+ /* remove services */
+ if (is_array($pkg_config['service'])) {
+ $static_output .= gettext("Services... ");
+ update_output_window($static_output);
+ if (is_array($pkg_config['service']) && is_array($services)) {
+ foreach ($pkg_config['service'] as $service) {
+ foreach ($services as $key => $instservice) {
+ if ($instservice['name'] == $service['name']) {
+ if (platform_booting() != true) {
+ stop_service($service['name']);
+ }
+ if ($service['rcfile']) {
+ $prefix = RCFILEPREFIX;
+ if (!empty($service['prefix'])) {
+ $prefix = $service['prefix'];
+ }
+ if (file_exists("{$prefix}{$service['rcfile']}")) {
+ @unlink("{$prefix}{$service['rcfile']}");
+ }
+ }
+ unset($services[$key]);
+ }
+ }
+ }
+ }
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ }
+ /*
+ * XXX: Otherwise inclusion of config.inc again invalidates actions taken.
+ * Same is done during installation.
+ */
+ write_config("Intermediate config write during package removal for {$package_name}.");
+
+ /*
+ * If a require exists, include it. this will
+ * show us where an error exists in a package
+ * instead of making us blindly guess
+ */
+ $missing_include = false;
+ if ($pkg_config['include_file'] <> "") {
+ $static_output .= gettext("Loading package instructions...") . "\n";
+ update_output_window($static_output);
+ if (file_exists($pkg_config['include_file'])) {
+ pkg_debug("require_once(\"{$pkg_config['include_file']}\")\n");
+ require_once($pkg_config['include_file']);
+ } else {
+ pkg_debug("Missing include {$pkg_config['include_file']}\n");
+ $missing_include = true;
+ update_output_window($static_output);
+ $static_output .= "Include file " . basename($pkg_config['include_file']) . " could not be found for inclusion.\n";
+ }
+ }
+ /* ermal
+ * NOTE: It is not possible to handle parse errors on eval.
+ * So we prevent it from being run at all to not interrupt all the other code.
+ */
+ if ($when == "deinstall" && $missing_include == false) {
+ /* evaluate this package's global functions and pre deinstall commands */
+ if ($pkg_config['custom_php_global_functions'] <> "") {
+ eval_once($pkg_config['custom_php_global_functions']);
+ }
+ if ($pkg_config['custom_php_pre_deinstall_command'] <> "") {
+ eval_once($pkg_config['custom_php_pre_deinstall_command']);
+ }
+ }
+ /* deinstall commands */
+ if ($when == "post-deinstall" && $pkg_config['custom_php_deinstall_command'] <> "") {
+ $static_output .= gettext("Deinstall commands... ");
+ update_output_window($static_output);
+ if ($missing_include == false) {
+ eval_once($pkg_config['custom_php_deinstall_command']);
+ $static_output .= gettext("done.") . "\n";
+ } else {
+ $static_output .= "\nNot executing custom deinstall hook because an include is missing.\n";
+ }
+ update_output_window($static_output);
+ }
+ }
+ /* syslog */
+ if (is_array($pkg_info['logging']) && $pkg_info['logging']['logfile_name'] <> "") {
+ $static_output .= "Syslog entries... ";
+ update_output_window($static_output);
+ remove_text_from_file("/etc/syslog.conf", $pkg_info['logging']['facilityname'] . "\t\t\t\t" . $pkg_info['logging']['logfilename']);
+ system_syslogd_start();
+ @unlink("{$g['varlog_path']}/{$pkg_info['logging']['logfilename']}");
+ $static_output .= "done.\n";
+ update_output_window($static_output);
+ }
+
+ conf_mount_ro();
+ /* remove config.xml entries */
+ $static_output .= gettext("Configuration... ");
+ update_output_window($static_output);
+ unset($config['installedpackages']['package'][$pkgid]);
+ $static_output .= gettext("done.") . "\n";
+ update_output_window($static_output);
+ write_config("Removed {$package_name} package.\n");
+}
+
+function pkg_reinstall_all() {
+ global $g, $config;
+
+ // XXX: implement
+ return;
+}
+
+function stop_packages() {
+ require_once("config.inc");
+ require_once("functions.inc");
+ require_once("filter.inc");
+ require_once("shaper.inc");
+ require_once("captiveportal.inc");
+ require_once("pkg-utils.inc");
+ require_once("pfsense-utils.inc");
+ require_once("service-utils.inc");
+
+ global $config, $g;
+
+ log_error("Stopping all packages.");
+
+ $rcfiles = glob(RCFILEPREFIX . "*.sh");
+ if (!$rcfiles) {
+ $rcfiles = array();
+ } else {
+ $rcfiles = array_flip($rcfiles);
+ if (!$rcfiles) {
+ $rcfiles = array();
+ }
+ }
+
+ if (is_array($config['installedpackages']['package'])) {
+ foreach ($config['installedpackages']['package'] as $package) {
+ echo " Stopping package {$package['name']}...";
+ $internal_name = get_package_internal_name($package);
+ stop_service($internal_name);
+ unset($rcfiles[RCFILEPREFIX . strtolower($internal_name) . ".sh"]);
+ echo "done.\n";
+ }
+ }
+
+ foreach ($rcfiles as $rcfile => $number) {
+ $shell = @popen("/bin/sh", "w");
+ if ($shell) {
+ echo " Stopping {$rcfile}...";
+ if (!@fwrite($shell, "{$rcfile} stop >>/tmp/bootup_messages 2>&1")) {
+ if ($shell) {
+ pclose($shell);
+ }
+ $shell = @popen("/bin/sh", "w");
+ }
+ echo "done.\n";
+ pclose($shell);
+ }
+ }
+}
+
+function verify_all_package_servers() {
+ // XXX: Remove it after GUI is ready
+ return true;
+}
+
+function check_package_server_ssl() {
+ // XXX: Remove it after GUI is ready
+ return true;
+}
+
+?>
diff --git a/src/etc/inc/plain_sasl_client.inc b/src/etc/inc/plain_sasl_client.inc
new file mode 100644
index 0000000..691580c
--- /dev/null
+++ b/src/etc/inc/plain_sasl_client.inc
@@ -0,0 +1,99 @@
+<?php
+/*
+ * plain_sasl_client.php
+ *
+ * @(#) $Id: plain_sasl_client.php,v 1.2 2004/11/17 08:00:37 mlemos Exp $
+ *
+ */
+
+define("SASL_PLAIN_STATE_START", 0);
+define("SASL_PLAIN_STATE_IDENTIFY", 1);
+define("SASL_PLAIN_STATE_DONE", 2);
+
+define("SASL_PLAIN_DEFAULT_MODE", 0);
+define("SASL_PLAIN_EXIM_MODE", 1);
+define("SASL_PLAIN_EXIM_DOCUMENTATION_MODE", 2);
+
+class plain_sasl_client_class
+{
+ var $credentials=array();
+ var $state=SASL_PLAIN_STATE_START;
+
+ Function Initialize(&$client)
+ {
+ return(1);
+ }
+
+ Function Start(&$client, &$message, &$interactions)
+ {
+ if ($this->state!=SASL_PLAIN_STATE_START)
+ {
+ $client->error="PLAIN authentication state is not at the start";
+ return(SASL_FAIL);
+ }
+ $this->credentials=array(
+ "user"=>"",
+ "password"=>"",
+ "realm"=>"",
+ "mode"=>""
+ );
+ $defaults=array(
+ "realm"=>"",
+ "mode"=>""
+ );
+ $status=$client->GetCredentials($this->credentials,$defaults,$interactions);
+ if ($status==SASL_CONTINUE)
+ {
+ switch ($this->credentials["mode"])
+ {
+ case SASL_PLAIN_EXIM_MODE:
+ $message=$this->credentials["user"]."\0".$this->credentials["password"]."\0";
+ break;
+ case SASL_PLAIN_EXIM_DOCUMENTATION_MODE:
+ $message="\0".$this->credentials["user"]."\0".$this->credentials["password"];
+ break;
+ default:
+ $message=$this->credentials["user"]."\0".$this->credentials["user"].(strlen($this->credentials["realm"]) ? "@".$this->credentials["realm"] : "")."\0".$this->credentials["password"];
+ break;
+ }
+ $this->state=SASL_PLAIN_STATE_DONE;
+ }
+ else
+ Unset($message);
+ return($status);
+ }
+
+ Function Step(&$client, $response, &$message, &$interactions)
+ {
+ switch ($this->state)
+ {
+/*
+ case SASL_PLAIN_STATE_IDENTIFY:
+ switch ($this->credentials["mode"])
+ {
+ case SASL_PLAIN_EXIM_MODE:
+ $message=$this->credentials["user"]."\0".$this->credentials["password"]."\0";
+ break;
+ case SASL_PLAIN_EXIM_DOCUMENTATION_MODE:
+ $message="\0".$this->credentials["user"]."\0".$this->credentials["password"];
+ break;
+ default:
+ $message=$this->credentials["user"]."\0".$this->credentials["user"].(strlen($this->credentials["realm"]) ? "@".$this->credentials["realm"] : "")."\0".$this->credentials["password"];
+ break;
+ }
+ var_dump($message);
+ $this->state=SASL_PLAIN_STATE_DONE;
+ break;
+*/
+ case SASL_PLAIN_STATE_DONE:
+ $client->error="PLAIN authentication was finished without success";
+ return(SASL_FAIL);
+ default:
+ $client->error="invalid PLAIN authentication step state";
+ return(SASL_FAIL);
+ }
+ return(SASL_CONTINUE);
+ }
+};
+
+?> \ No newline at end of file
diff --git a/src/etc/inc/priv.defs.inc b/src/etc/inc/priv.defs.inc
new file mode 100644
index 0000000..7d2154f
--- /dev/null
+++ b/src/etc/inc/priv.defs.inc
@@ -0,0 +1,1403 @@
+<?php
+/*
+ * priv.defs.inc - Generated privilege definitions
+ *
+ */
+
+$priv_list = array();
+
+$priv_list['page-all'] = array();
+$priv_list['page-all']['name'] = gettext("WebCfg - All pages");
+$priv_list['page-all']['descr'] = gettext("Allow access to all pages");
+$priv_list['page-all']['match'] = array();
+$priv_list['page-all']['match'][] = "*";
+
+$priv_list['page-status-carp'] = array();
+$priv_list['page-status-carp']['name'] = gettext("WebCfg - Status: CARP page");
+$priv_list['page-status-carp']['descr'] = gettext("Allow access to the 'Status: CARP' page.");
+$priv_list['page-status-carp']['match'] = array();
+$priv_list['page-status-carp']['match'][] = "carp_status.php*";
+
+$priv_list['page-diagnostics-crash-reporter'] = array();
+$priv_list['page-diagnostics-crash-reporter']['name'] = gettext("WebCfg - Crash reporter");
+$priv_list['page-diagnostics-crash-reporter']['descr'] = gettext("Uploads crash reports to pfSense and or deletes crash reports.");
+$priv_list['page-diagnostics-crash-reporter']['match'] = array();
+$priv_list['page-diagnostics-crash-reporter']['match'][] = "crash_reporter.php*";
+
+$priv_list['page-diagnostics-arptable'] = array();
+$priv_list['page-diagnostics-arptable']['name'] = gettext("WebCfg - Diagnostics: ARP Table page");
+$priv_list['page-diagnostics-arptable']['descr'] = gettext("Allow access to the 'Diagnostics: ARP Table' page.");
+$priv_list['page-diagnostics-arptable']['match'] = array();
+$priv_list['page-diagnostics-arptable']['match'][] = "diag_arp.php*";
+
+$priv_list['page-diagnostics-authentication'] = array();
+$priv_list['page-diagnostics-authentication']['name'] = gettext("WebCfg - Diagnostics: Authentication page");
+$priv_list['page-diagnostics-authentication']['descr'] = gettext("Allow access to the 'Diagnostics: Authentication' page.");
+$priv_list['page-diagnostics-authentication']['match'] = array();
+$priv_list['page-diagnostics-authentication']['match'][] = "diag_authentication.php*";
+
+$priv_list['page-diagnostics-backup/restore'] = array();
+$priv_list['page-diagnostics-backup/restore']['name'] = gettext("WebCfg - Diagnostics: Backup/restore page");
+$priv_list['page-diagnostics-backup/restore']['descr'] = gettext("Allow access to the 'Diagnostics: Backup/restore' page.");
+$priv_list['page-diagnostics-backup/restore']['match'] = array();
+$priv_list['page-diagnostics-backup/restore']['match'][] = "diag_backup.php*";
+
+$priv_list['page-diagnostics-configurationhistory'] = array();
+$priv_list['page-diagnostics-configurationhistory']['name'] = gettext("WebCfg - Diagnostics: Configuration History page");
+$priv_list['page-diagnostics-configurationhistory']['descr'] = gettext("Allow access to the 'Diagnostics: Configuration History' page.");
+$priv_list['page-diagnostics-configurationhistory']['match'] = array();
+$priv_list['page-diagnostics-configurationhistory']['match'][] = "diag_confbak.php*";
+
+$priv_list['page-diagnostics-factorydefaults'] = array();
+$priv_list['page-diagnostics-factorydefaults']['name'] = gettext("WebCfg - Diagnostics: Factory defaults page");
+$priv_list['page-diagnostics-factorydefaults']['descr'] = gettext("Allow access to the 'Diagnostics: Factory defaults' page.");
+$priv_list['page-diagnostics-factorydefaults']['match'] = array();
+$priv_list['page-diagnostics-factorydefaults']['match'][] = "diag_defaults.php*";
+
+$priv_list['page-diagnostics-ndptable'] = array();
+$priv_list['page-diagnostics-ndptable']['name'] = gettext("Webcfg - Diagnostics: NDP Table page");
+$priv_list['page-diagnostics-ndptable']['descr'] = gettext("Allow access to the 'Diagnostics: NDP Table' page.");
+$priv_list['page-diagnostics-ndptable']['match'] = array();
+$priv_list['page-diagnostics-ndptable']['match'][] = "diag_ndp.php*";
+
+$priv_list['page-diagnostics-restore-full-backup'] = array();
+$priv_list['page-diagnostics-restore-full-backup']['name'] = gettext("Webcfg - Diagnostics: Restore full backup");
+$priv_list['page-diagnostics-restore-full-backup']['descr'] = gettext("Allow access to the 'Diagnostics: Restore Full Backup' page.");
+$priv_list['page-diagnostics-restore-full-backup']['match'] = array();
+$priv_list['page-diagnostics-restore-full-backup']['match'][] = "system_firmware_restorefullbackup.php";
+
+$priv_list['page-diagnostics-showstates'] = array();
+$priv_list['page-diagnostics-showstates']['name'] = gettext("WebCfg - Diagnostics: Show States page");
+$priv_list['page-diagnostics-showstates']['descr'] = gettext("Allow access to the 'Diagnostics: Show States' page.");
+$priv_list['page-diagnostics-showstates']['match'] = array();
+$priv_list['page-diagnostics-showstates']['match'][] = "diag_dump_states.php*";
+
+$priv_list['page-diagnostics-sockets'] = array();
+$priv_list['page-diagnostics-sockets']['name'] = gettext("WebCfg - Diagnostics: Sockets page");
+$priv_list['page-diagnostics-sockets']['descr'] = gettext("Allow access to the 'Diagnostics: Sockets' page.");
+$priv_list['page-diagnostics-sockets']['match'] = array();
+$priv_list['page-diagnostics-sockets']['match'][] = "diag_sockets.php*";
+
+$priv_list['page-diagnostics-testport'] = array();
+$priv_list['page-diagnostics-testport']['name'] = gettext("Webcfg - Diagnostics: Test Port");
+$priv_list['page-diagnostics-testport']['descr'] = gettext("Allow access to the 'Diagnostics: Test Port' page.");
+$priv_list['page-diagnostics-testport']['match'] = array();
+$priv_list['page-diagnostics-testport']['match'][] = "diag_testport.php*";
+
+$priv_list['page-status-ipsec'] = array();
+$priv_list['page-status-ipsec']['name'] = gettext("WebCfg - Status: IPsec page");
+$priv_list['page-status-ipsec']['descr'] = gettext("Allow access to the 'Status: IPsec' page.");
+$priv_list['page-status-ipsec']['match'] = array();
+$priv_list['page-status-ipsec']['match'][] = "diag_ipsec.php*";
+
+$priv_list['page-status-ipsec-leases'] = array();
+$priv_list['page-status-ipsec-leases']['name'] = gettext("WebCfg - Status: IPsec: Leasespage");
+$priv_list['page-status-ipsec-leases']['descr'] = gettext("Allow access to the 'Status: IPsec: Leases' page.");
+$priv_list['page-status-ipsec-leases']['match'] = array();
+$priv_list['page-status-ipsec-leases']['match'][] = "diag_ipsec_leases.php*";
+
+$priv_list['page-status-ipsec-sad'] = array();
+$priv_list['page-status-ipsec-sad']['name'] = gettext("WebCfg - Status: IPsec: SAD page");
+$priv_list['page-status-ipsec-sad']['descr'] = gettext("Allow access to the 'Status: IPsec: SAD' page.");
+$priv_list['page-status-ipsec-sad']['match'] = array();
+$priv_list['page-status-ipsec-sad']['match'][] = "diag_ipsec_sad.php*";
+
+$priv_list['page-status-ipsec-spd'] = array();
+$priv_list['page-status-ipsec-spd']['name'] = gettext("WebCfg - Status: IPsec: SPD page");
+$priv_list['page-status-ipsec-spd']['descr'] = gettext("Allow access to the 'Status: IPsec: SPD' page.");
+$priv_list['page-status-ipsec-spd']['match'] = array();
+$priv_list['page-status-ipsec-spd']['match'][] = "diag_ipsec_spd.php*";
+
+$priv_list['page-status-ntp'] = array();
+$priv_list['page-status-ntp']['name'] = gettext("Webcfg - Status: NTP page");
+$priv_list['page-status-ntp']['descr'] = gettext("Allow access to the 'Status: NTP' page.");
+$priv_list['page-status-ntp']['match'] = array();
+$priv_list['page-status-ntp']['match'][] = "status_ntpd.php*";
+
+$priv_list['page-ipsecxml'] = array();
+$priv_list['page-ipsecxml']['name'] = gettext("WebCfg - Diag IPsec XML page");
+$priv_list['page-ipsecxml']['descr'] = gettext("Allow access to the 'Diag IPsec XML' page.");
+$priv_list['page-ipsecxml']['match'] = array();
+$priv_list['page-ipsecxml']['match'][] = "diag_ipsec_xml.php";
+
+$priv_list['page-diagnostics-logs-system'] = array();
+$priv_list['page-diagnostics-logs-system']['name'] = gettext("WebCfg - Diagnostics: Logs: System page");
+$priv_list['page-diagnostics-logs-system']['descr'] = gettext("Allow access to the 'Diagnostics: Logs: System' page.");
+$priv_list['page-diagnostics-logs-system']['match'] = array();
+$priv_list['page-diagnostics-logs-system']['match'][] = "diag_logs.php*";
+
+$priv_list['page-status-systemlogs-portalauth'] = array();
+$priv_list['page-status-systemlogs-portalauth']['name'] = gettext("WebCfg - Status: System logs: Portal Auth page");
+$priv_list['page-status-systemlogs-portalauth']['descr'] = gettext("Allow access to the 'Status: System logs: Portal Auth' page.");
+$priv_list['page-status-systemlogs-portalauth']['match'] = array();
+$priv_list['page-status-systemlogs-portalauth']['match'][] = "diag_logs_auth.php*";
+
+$priv_list['page-diagnostics-logs-dhcp'] = array();
+$priv_list['page-diagnostics-logs-dhcp']['name'] = gettext("WebCfg - Diagnostics: Logs: DHCP page");
+$priv_list['page-diagnostics-logs-dhcp']['descr'] = gettext("Allow access to the 'Diagnostics: Logs: DHCP' page.");
+$priv_list['page-diagnostics-logs-dhcp']['match'] = array();
+$priv_list['page-diagnostics-logs-dhcp']['match'][] = "diag_logs_dhcp.php*";
+
+$priv_list['page-diagnostics-logs-firewall'] = array();
+$priv_list['page-diagnostics-logs-firewall']['name'] = gettext("WebCfg - Diagnostics: Logs: Firewall page");
+$priv_list['page-diagnostics-logs-firewall']['descr'] = gettext("Allow access to the 'Diagnostics: Logs: Firewall' page.");
+$priv_list['page-diagnostics-logs-firewall']['match'] = array();
+$priv_list['page-diagnostics-logs-firewall']['match'][] = "diag_logs_filter.php*";
+
+$priv_list['page-diagnostics-logs-gateways'] = array();
+$priv_list['page-diagnostics-logs-gateways']['name'] = gettext("WebCfg - Diagnostics: Logs: Gateways page");
+$priv_list['page-diagnostics-logs-gateways']['descr'] = gettext("Allow access to the 'Diagnostics: Logs: System: Gateways' page.");
+$priv_list['page-diagnostics-logs-gateways']['match'] = array();
+$priv_list['page-diagnostics-logs-gateways']['match'][] = "diag_logs_gateways.php*";
+
+$priv_list['page-diagnostics-logs-resolver'] = array();
+$priv_list['page-diagnostics-logs-resolver']['name'] = gettext("WebCfg - Diagnostics: Logs: Resolver page");
+$priv_list['page-diagnostics-logs-resolver']['descr'] = gettext("Allow access to the 'Diagnostics: Logs: System: Resolver' page.");
+$priv_list['page-diagnostics-logs-resolver']['match'] = array();
+$priv_list['page-diagnostics-logs-resolver']['match'][] = "diag_logs_resolver.php*";
+
+$priv_list['page-hidden-nolongerincluded'] = array();
+$priv_list['page-hidden-nolongerincluded']['name'] = gettext("WebCfg - Hidden: No longer included page");
+$priv_list['page-hidden-nolongerincluded']['descr'] = gettext("Allow access to the 'Hidden: No longer included' page.");
+$priv_list['page-hidden-nolongerincluded']['match'] = array();
+$priv_list['page-hidden-nolongerincluded']['match'][] = "diag_logs_filter_dynamic.php*";
+
+$priv_list['page-status-systemlogs-ipsecvpn'] = array();
+$priv_list['page-status-systemlogs-ipsecvpn']['name'] = gettext("WebCfg - Status: System logs: IPsec VPN page");
+$priv_list['page-status-systemlogs-ipsecvpn']['descr'] = gettext("Allow access to the 'Status: System logs: IPsec VPN' page.");
+$priv_list['page-status-systemlogs-ipsecvpn']['match'] = array();
+$priv_list['page-status-systemlogs-ipsecvpn']['match'][] = "diag_logs_ipsec.php*";
+
+$priv_list['page-status-systemlogs-ntpd'] = array();
+$priv_list['page-status-systemlogs-ntpd']['name'] = gettext("WebCfg - Status: System logs: NTP page");
+$priv_list['page-status-systemlogs-ntpd']['descr'] = gettext("Allow access to the 'Status: System logs: NTP' page.");
+$priv_list['page-status-systemlogs-ntpd']['match'] = array();
+$priv_list['page-status-systemlogs-ntpd']['match'][] = "diag_logs_ntpd.php*";
+
+$priv_list['page-status-systemlogs-openvpn'] = array();
+$priv_list['page-status-systemlogs-openvpn']['name'] = gettext("WebCfg - Status: System logs: OpenVPN page");
+$priv_list['page-status-systemlogs-openvpn']['descr'] = gettext("Allow access to the 'Status: System logs: OpenVPN' page.");
+$priv_list['page-status-systemlogs-openvpn']['match'] = array();
+$priv_list['page-status-systemlogs-openvpn']['match'][] = "diag_logs_openvpn.php*";
+
+$priv_list['page-status-systemlogs-ppp'] = array();
+$priv_list['page-status-systemlogs-ppp']['name'] = gettext("WebCfg - Status: System logs: IPsec VPN page");
+$priv_list['page-status-systemlogs-ppp']['descr'] = gettext("Allow access to the 'Status: System logs: IPsec VPN' page.");
+$priv_list['page-status-systemlogs-ppp']['match'] = array();
+$priv_list['page-status-systemlogs-ppp']['match'][] = "diag_logs_ppp.php*";
+
+$priv_list['page-status-systemlogs-loadbalancer'] = array();
+$priv_list['page-status-systemlogs-loadbalancer']['name'] = gettext("WebCfg - Status: System logs: Load Balancer page");
+$priv_list['page-status-systemlogs-loadbalancer']['descr'] = gettext("Allow access to the 'Status: System logs: Load Balancer' page.");
+$priv_list['page-status-systemlogs-loadbalancer']['match'] = array();
+$priv_list['page-status-systemlogs-loadbalancer']['match'][] = "diag_logs_relayd.php*";
+
+$priv_list['page-status-systemlogs-routing'] = array();
+$priv_list['page-status-systemlogs-routing']['name'] = gettext("Webcfg - Status: System logs: Routing page");
+$priv_list['page-status-systemlogs-routing']['descr'] = gettext("Allow access to the 'Status: System logs: System: Routing' page.");
+$priv_list['page-status-systemlogs-routing']['match'] = array();
+$priv_list['page-status-systemlogs-routing']['match'][] = "diag_logs_routing.php*";
+
+$priv_list['page-status-systemlogs-wireless'] = array();
+$priv_list['page-status-systemlogs-wireless']['name'] = gettext("Webcfg - Status: System logs: Wireless page");
+$priv_list['page-status-systemlogs-wireless']['descr'] = gettext("Allow access to the 'Status: System logs: System: Wireless' page.");
+$priv_list['page-status-systemlogs-wireless']['match'] = array();
+$priv_list['page-status-systemlogs-wireless']['match'][] = "diag_logs_wireless.php*";
+
+$priv_list['page-diagnostics-logs-settings'] = array();
+$priv_list['page-diagnostics-logs-settings']['name'] = gettext("WebCfg - Diagnostics: Logs: Settings page");
+$priv_list['page-diagnostics-logs-settings']['descr'] = gettext("Allow access to the 'Diagnostics: Logs: Settings' page.");
+$priv_list['page-diagnostics-logs-settings']['match'] = array();
+$priv_list['page-diagnostics-logs-settings']['match'][] = "diag_logs_settings.php*";
+
+$priv_list['page-diagnostics-logs-pptpvpn'] = array();
+$priv_list['page-diagnostics-logs-pptpvpn']['name'] = gettext("WebCfg - Diagnostics: Logs: VPN page");
+$priv_list['page-diagnostics-logs-pptpvpn']['descr'] = gettext("Allow access to the 'Diagnostics: Logs: VPN' page.");
+$priv_list['page-diagnostics-logs-pptpvpn']['match'] = array();
+$priv_list['page-diagnostics-logs-pptpvpn']['match'][] = "diag_logs_vpn.php*";
+
+$priv_list['page-diagnostics-nanobsd'] = array();
+$priv_list['page-diagnostics-nanobsd']['name'] = gettext("WebCfg - Diagnostics: NanoBSD");
+$priv_list['page-diagnostics-nanobsd']['descr'] = gettext("Allow access to the 'Diagnostics: NanoBSD' page.");
+$priv_list['page-diagnostics-nanobsd']['match'] = array();
+$priv_list['page-diagnostics-nanobsd']['match'][] = "diag_nanobsd.php*";
+
+$priv_list['page-diagnostics-packetcapture'] = array();
+$priv_list['page-diagnostics-packetcapture']['name'] = gettext("WebCfg - Diagnostics: Packet Capture page");
+$priv_list['page-diagnostics-packetcapture']['descr'] = gettext("Allow access to the 'Diagnostics: Packet Capture' page.");
+$priv_list['page-diagnostics-packetcapture']['match'] = array();
+$priv_list['page-diagnostics-packetcapture']['match'][] = "diag_packet_capture.php*";
+
+$priv_list['page-diagnostics-patters'] = array();
+$priv_list['page-diagnostics-patters']['name'] = gettext("WebCfg - Diagnostics: Patterns page");
+$priv_list['page-diagnostics-patters']['descr'] = gettext("Allow access to the 'Diagnostics: Patterns' page.");
+$priv_list['page-diagnostics-patters']['match'] = array();
+$priv_list['page-diagnostics-patters']['match'][] = "patterns.php*";
+
+$priv_list['page-diagnostics-limiter-info'] = array();
+$priv_list['page-diagnostics-limiter-info']['name'] = gettext("Diagnostics: Limiter Info");
+$priv_list['page-diagnostics-limiter-info']['descr'] = gettext("Allows access to the 'Diagnostics: Limiter Info' page");
+$priv_list['page-diagnostics-limiter-info']['match'] = array();
+$priv_list['page-diagnostics-limiter-info']['match'][] = "diag_limiter_info.php*";
+
+$priv_list['page-diagnostics-pf-info'] = array();
+$priv_list['page-diagnostics-pf-info']['name'] = gettext("Diagnostics: pfInfo");
+$priv_list['page-diagnostics-pf-info']['descr'] = gettext("Allows access to the 'Diagnostics: pfInfo' page");
+$priv_list['page-diagnostics-pf-info']['match'] = array();
+$priv_list['page-diagnostics-pf-info']['match'][] = "diag_pf_info.php*";
+
+$priv_list['page-diagnostics-system-activity'] = array();
+$priv_list['page-diagnostics-system-activity']['name'] = gettext("WebCfg - Diagnostics: System Activity");
+$priv_list['page-diagnostics-system-activity']['descr'] = gettext("Allows access to the 'Diagnostics: System Activity' page");
+$priv_list['page-diagnostics-system-activity']['match'] = array();
+$priv_list['page-diagnostics-system-activity']['match'][] = "diag_system_activity.php*";
+
+$priv_list['page-diagnostics-system-pftop'] = array();
+$priv_list['page-diagnostics-system-pftop']['name'] = gettext("Diagnostics: pfTop");
+$priv_list['page-diagnostics-system-pftop']['descr'] = gettext("Allows access to the 'Diagnostics: pfTop' page");
+$priv_list['page-diagnostics-system-pftop']['match'] = array();
+$priv_list['page-diagnostics-system-pftop']['match'][] = "diag_system_pftop.php*";
+
+$priv_list['page-diagnostics-ping'] = array();
+$priv_list['page-diagnostics-ping']['name'] = gettext("WebCfg - Diagnostics: Ping page");
+$priv_list['page-diagnostics-ping']['descr'] = gettext("Allow access to the 'Diagnostics: Ping' page.");
+$priv_list['page-diagnostics-ping']['match'] = array();
+$priv_list['page-diagnostics-ping']['match'][] = "diag_ping.php*";
+
+$priv_list['page-status-packagelogs'] = array();
+$priv_list['page-status-packagelogs']['name'] = gettext("WebCfg - Status: Package logs page");
+$priv_list['page-status-packagelogs']['descr'] = gettext("Allow access to the 'Status: Package logs' page.");
+$priv_list['page-status-packagelogs']['match'] = array();
+$priv_list['page-status-packagelogs']['match'][] = "diag_pkglogs.php*";
+
+$priv_list['page-diagnostics-resetstate'] = array();
+$priv_list['page-diagnostics-resetstate']['name'] = gettext("WebCfg - Diagnostics: Reset state page");
+$priv_list['page-diagnostics-resetstate']['descr'] = gettext("Allow access to the 'Diagnostics: Reset state' page.");
+$priv_list['page-diagnostics-resetstate']['match'] = array();
+$priv_list['page-diagnostics-resetstate']['match'][] = "diag_resetstate.php*";
+
+$priv_list['page-diagnostics-routingtables'] = array();
+$priv_list['page-diagnostics-routingtables']['name'] = gettext("WebCfg - Diagnostics: Routing tables page");
+$priv_list['page-diagnostics-routingtables']['descr'] = gettext("Allow access to the 'Diagnostics: Routing tables' page.");
+$priv_list['page-diagnostics-routingtables']['match'] = array();
+$priv_list['page-diagnostics-routingtables']['match'][] = "diag_routes.php*";
+
+$priv_list['page-diagnostics-statessummary'] = array();
+$priv_list['page-diagnostics-statessummary']['name'] = gettext("WebCfg - Diagnostics: States Summary page");
+$priv_list['page-diagnostics-statessummary']['descr'] = gettext("Allow access to the 'Diagnostics: States Summary' page.");
+$priv_list['page-diagnostics-statessummary']['match'] = array();
+$priv_list['page-diagnostics-statessummary']['match'][] = "diag_states_summary.php*";
+
+$priv_list['page-diagnostics-tables'] = array();
+$priv_list['page-diagnostics-tables']['name'] = gettext("WebCfg - Diagnostics: PF Table IP addresses");
+$priv_list['page-diagnostics-tables']['descr'] = gettext("Allow access to the 'Diagnostics: Tables' page.");
+$priv_list['page-diagnostics-tables']['match'] = array();
+$priv_list['page-diagnostics-tables']['match'][] = "diag_tables.php*";
+
+$priv_list['page-diagnostics-traceroute'] = array();
+$priv_list['page-diagnostics-traceroute']['name'] = gettext("WebCfg - Diagnostics: Traceroute page");
+$priv_list['page-diagnostics-traceroute']['descr'] = gettext("Allow access to the 'Diagnostics: Traceroute' page.");
+$priv_list['page-diagnostics-traceroute']['match'] = array();
+$priv_list['page-diagnostics-traceroute']['match'][] = "diag_traceroute.php*";
+
+$priv_list['page-diagnostics-edit'] = array();
+$priv_list['page-diagnostics-edit']['name'] = gettext("WebCfg - Diagnostics: Edit FIle");
+$priv_list['page-diagnostics-edit']['descr'] = gettext("Allow access to the 'Diagnostics: Edit File' page.");
+$priv_list['page-diagnostics-edit']['match'] = array();
+$priv_list['page-diagnostics-edit']['match'][] = "edit.php*";
+$priv_list['page-diagnostics-edit']['match'][] = "browser.php*";
+$priv_list['page-diagnostics-edit']['match'][] = "filebrowser/browser.php*";
+
+$priv_list['page-diagnostics-command'] = array();
+$priv_list['page-diagnostics-command']['name'] = gettext("WebCfg - Diagnostics: Command page");
+$priv_list['page-diagnostics-command']['descr'] = gettext("Allow access to the 'Diagnostics: Command' page.");
+$priv_list['page-diagnostics-command']['match'] = array();
+$priv_list['page-diagnostics-command']['match'][] = "exec.php*";
+
+$priv_list['page-firewall-aliases'] = array();
+$priv_list['page-firewall-aliases']['name'] = gettext("WebCfg - Firewall: Aliases page");
+$priv_list['page-firewall-aliases']['descr'] = gettext("Allow access to the 'Firewall: Aliases' page.");
+$priv_list['page-firewall-aliases']['match'] = array();
+$priv_list['page-firewall-aliases']['match'][] = "firewall_aliases.php*";
+
+$priv_list['page-firewall-alias-edit'] = array();
+$priv_list['page-firewall-alias-edit']['name'] = gettext("WebCfg - Firewall: Alias: Edit page");
+$priv_list['page-firewall-alias-edit']['descr'] = gettext("Allow access to the 'Firewall: Alias: Edit' page.");
+$priv_list['page-firewall-alias-edit']['match'] = array();
+$priv_list['page-firewall-alias-edit']['match'][] = "firewall_aliases_edit.php*";
+
+$priv_list['page-firewall-alias-import'] = array();
+$priv_list['page-firewall-alias-import']['name'] = gettext("WebCfg - Firewall: Alias: Import page");
+$priv_list['page-firewall-alias-import']['descr'] = gettext("Allow access to the 'Firewall: Alias: Import' page.");
+$priv_list['page-firewall-alias-import']['match'] = array();
+$priv_list['page-firewall-alias-import']['match'][] = "firewall_aliases_import.php*";
+
+$priv_list['page-firewall-nat-npt'] = array();
+$priv_list['page-firewall-nat-npt']['name'] = gettext("Webcfg - Firewall: NAT: NPT page");
+$priv_list['page-firewall-nat-npt']['descr'] = gettext("Allow access to the 'Firewall: NAT: NPT' page.");
+$priv_list['page-firewall-nat-npt']['match'] = array();
+$priv_list['page-firewall-nat-npt']['match'][] = "firewall_nat_npt.php*";
+
+$priv_list['page-firewall-nat-npt-edit'] = array();
+$priv_list['page-firewall-nat-npt-edit']['name'] = gettext("Webcfg - Firewall: NAT: NPt: Edit page");
+$priv_list['page-firewall-nat-npt-edit']['descr'] = gettext("Allow access to the 'Firewall: NAT: NPt: Edit' page.");
+$priv_list['page-firewall-nat-npt-edit']['match'] = array();
+$priv_list['page-firewall-nat-npt-edit']['match'][] = "firewall_nat_npt_edit.php*";
+
+$priv_list['page-firewall-nat-portforward'] = array();
+$priv_list['page-firewall-nat-portforward']['name'] = gettext("WebCfg - Firewall: NAT: Port Forward page");
+$priv_list['page-firewall-nat-portforward']['descr'] = gettext("Allow access to the 'Firewall: NAT: Port Forward' page.");
+$priv_list['page-firewall-nat-portforward']['match'] = array();
+$priv_list['page-firewall-nat-portforward']['match'][] = "firewall_nat.php*";
+
+$priv_list['page-firewall-nat-1-1'] = array();
+$priv_list['page-firewall-nat-1-1']['name'] = gettext("WebCfg - Firewall: NAT: 1:1 page");
+$priv_list['page-firewall-nat-1-1']['descr'] = gettext("Allow access to the 'Firewall: NAT: 1:1' page.");
+$priv_list['page-firewall-nat-1-1']['match'] = array();
+$priv_list['page-firewall-nat-1-1']['match'][] = "firewall_nat_1to1.php*";
+
+$priv_list['page-firewall-nat-1-1-edit'] = array();
+$priv_list['page-firewall-nat-1-1-edit']['name'] = gettext("WebCfg - Firewall: NAT: 1:1: Edit page");
+$priv_list['page-firewall-nat-1-1-edit']['descr'] = gettext("Allow access to the 'Firewall: NAT: 1:1: Edit' page.");
+$priv_list['page-firewall-nat-1-1-edit']['match'] = array();
+$priv_list['page-firewall-nat-1-1-edit']['match'][] = "firewall_nat_1to1_edit.php*";
+
+$priv_list['page-firewall-nat-portforward-edit'] = array();
+$priv_list['page-firewall-nat-portforward-edit']['name'] = gettext("WebCfg - Firewall: NAT: Port Forward: Edit page");
+$priv_list['page-firewall-nat-portforward-edit']['descr'] = gettext("Allow access to the 'Firewall: NAT: Port Forward: Edit' page.");
+$priv_list['page-firewall-nat-portforward-edit']['match'] = array();
+$priv_list['page-firewall-nat-portforward-edit']['match'][] = "firewall_nat_edit.php*";
+
+$priv_list['page-firewall-nat-outbound'] = array();
+$priv_list['page-firewall-nat-outbound']['name'] = gettext("WebCfg - Firewall: NAT: Outbound page");
+$priv_list['page-firewall-nat-outbound']['descr'] = gettext("Allow access to the 'Firewall: NAT: Outbound' page.");
+$priv_list['page-firewall-nat-outbound']['match'] = array();
+$priv_list['page-firewall-nat-outbound']['match'][] = "firewall_nat_out.php*";
+
+$priv_list['page-firewall-nat-outbound-edit'] = array();
+$priv_list['page-firewall-nat-outbound-edit']['name'] = gettext("WebCfg - Firewall: NAT: Outbound: Edit page");
+$priv_list['page-firewall-nat-outbound-edit']['descr'] = gettext("Allow access to the 'Firewall: NAT: Outbound: Edit' page.");
+$priv_list['page-firewall-nat-outbound-edit']['match'] = array();
+$priv_list['page-firewall-nat-outbound-edit']['match'][] = "firewall_nat_out_edit.php*";
+
+$priv_list['page-firewall-rules'] = array();
+$priv_list['page-firewall-rules']['name'] = gettext("WebCfg - Firewall: Rules page");
+$priv_list['page-firewall-rules']['descr'] = gettext("Allow access to the 'Firewall: Rules' page.");
+$priv_list['page-firewall-rules']['match'] = array();
+$priv_list['page-firewall-rules']['match'][] = "firewall_rules.php*";
+
+$priv_list['page-firewall-rules-edit'] = array();
+$priv_list['page-firewall-rules-edit']['name'] = gettext("WebCfg - Firewall: Rules: Edit page");
+$priv_list['page-firewall-rules-edit']['descr'] = gettext("Allow access to the 'Firewall: Rules: Edit' page.");
+$priv_list['page-firewall-rules-edit']['match'] = array();
+$priv_list['page-firewall-rules-edit']['match'][] = "firewall_rules_edit.php*";
+
+$priv_list['page-firewall-schedules'] = array();
+$priv_list['page-firewall-schedules']['name'] = gettext("WebCfg - Firewall: Schedules page");
+$priv_list['page-firewall-schedules']['descr'] = gettext("Allow access to the 'Firewall: Schedules' page.");
+$priv_list['page-firewall-schedules']['match'] = array();
+$priv_list['page-firewall-schedules']['match'][] = "firewall_schedule.php*";
+
+$priv_list['page-firewall-schedules-edit'] = array();
+$priv_list['page-firewall-schedules-edit']['name'] = gettext("WebCfg - Firewall: Schedules: Edit page");
+$priv_list['page-firewall-schedules-edit']['descr'] = gettext("Allow access to the 'Firewall: Schedules: Edit' page.");
+$priv_list['page-firewall-schedules-edit']['match'] = array();
+$priv_list['page-firewall-schedules-edit']['match'][] = "firewall_schedule_edit.php*";
+
+$priv_list['page-firewall-trafficshaper'] = array();
+$priv_list['page-firewall-trafficshaper']['name'] = gettext("WebCfg - Firewall: Traffic Shaper page");
+$priv_list['page-firewall-trafficshaper']['descr'] = gettext("Allow access to the 'Firewall: Traffic Shaper' page.");
+$priv_list['page-firewall-trafficshaper']['match'] = array();
+$priv_list['page-firewall-trafficshaper']['match'][] = "firewall_shaper.php*";
+
+$priv_list['page-firewall-trafficshaper-layer7'] = array();
+$priv_list['page-firewall-trafficshaper-layer7']['name'] = gettext("WebCfg - Firewall: Traffic Shaper: Layer7 page");
+$priv_list['page-firewall-trafficshaper-layer7']['descr'] = gettext("Allow access to the 'Firewall: Traffic Shaper: Layer7' page.");
+$priv_list['page-firewall-trafficshaper-layer7']['match'] = array();
+$priv_list['page-firewall-trafficshaper-layer7']['match'][] = "firewall_shaper_layer7.php*";
+
+$priv_list['page-firewall-trafficshaper-queues'] = array();
+$priv_list['page-firewall-trafficshaper-queues']['name'] = gettext("WebCfg - Firewall: Traffic Shaper: Queues page");
+$priv_list['page-firewall-trafficshaper-queues']['descr'] = gettext("Allow access to the 'Firewall: Traffic Shaper: Queues' page.");
+$priv_list['page-firewall-trafficshaper-queues']['match'] = array();
+$priv_list['page-firewall-trafficshaper-queues']['match'][] = "firewall_shaper_queues.php*";
+
+$priv_list['page-firewall-trafficshaper-limiter'] = array();
+$priv_list['page-firewall-trafficshaper-limiter']['name'] = gettext("WebCfg - Firewall: Traffic Shaper: Limiter page");
+$priv_list['page-firewall-trafficshaper-limiter']['descr'] = gettext("Allow access to the 'Firewall: Traffic Shaper: Limiter' page.");
+$priv_list['page-firewall-trafficshaper-limiter']['match'] = array();
+$priv_list['page-firewall-trafficshaper-limiter']['match'][] = "firewall_shaper_vinterface.php*";
+
+$priv_list['page-firewall-trafficshaper-wizard'] = array();
+$priv_list['page-firewall-trafficshaper-wizard']['name'] = gettext("WebCfg - Firewall: Traffic Shaper: Wizard page");
+$priv_list['page-firewall-trafficshaper-wizard']['descr'] = gettext("Allow access to the 'Firewall: Traffic Shaper: Wizard' page.");
+$priv_list['page-firewall-trafficshaper-wizard']['match'] = array();
+$priv_list['page-firewall-trafficshaper-wizard']['match'][] = "firewall_shaper_wizards.php*";
+
+$priv_list['page-firewall-virtualipaddresses'] = array();
+$priv_list['page-firewall-virtualipaddresses']['name'] = gettext("WebCfg - Firewall: Virtual IP Addresses page");
+$priv_list['page-firewall-virtualipaddresses']['descr'] = gettext("Allow access to the 'Firewall: Virtual IP Addresses' page.");
+$priv_list['page-firewall-virtualipaddresses']['match'] = array();
+$priv_list['page-firewall-virtualipaddresses']['match'][] = "firewall_virtual_ip.php*";
+
+$priv_list['page-firewall-virtualipaddress-edit'] = array();
+$priv_list['page-firewall-virtualipaddress-edit']['name'] = gettext("WebCfg - Firewall: Virtual IP Address: Edit page");
+$priv_list['page-firewall-virtualipaddress-edit']['descr'] = gettext("Allow access to the 'Firewall: Virtual IP Address: Edit' page.");
+$priv_list['page-firewall-virtualipaddress-edit']['match'] = array();
+$priv_list['page-firewall-virtualipaddress-edit']['match'][] = "firewall_virtual_ip_edit.php*";
+
+$priv_list['page-getserviceproviders'] = array();
+$priv_list['page-getserviceproviders']['name'] = gettext("WebCfg - AJAX: Get Service Providers");
+$priv_list['page-getserviceproviders']['descr'] = gettext("Allow access to the 'AJAX: Service Providers' page.");
+$priv_list['page-getserviceproviders']['match'] = array();
+$priv_list['page-getserviceproviders']['match'][] = "getserviceproviders.php*";
+
+$priv_list['page-getstats'] = array();
+$priv_list['page-getstats']['name'] = gettext("WebCfg - AJAX: Get Stats");
+$priv_list['page-getstats']['descr'] = gettext("Allow access to the 'AJAX: Get Stats' page.");
+$priv_list['page-getstats']['match'] = array();
+$priv_list['page-getstats']['match'][] = "getstats.php*";
+
+$priv_list['page-diagnostics-interfacetraffic'] = array();
+$priv_list['page-diagnostics-interfacetraffic']['name'] = gettext("WebCfg - Diagnostics: Interface Traffic page");
+$priv_list['page-diagnostics-interfacetraffic']['descr'] = gettext("Allow access to the 'Diagnostics: Interface Traffic' page.");
+$priv_list['page-diagnostics-interfacetraffic']['match'] = array();
+$priv_list['page-diagnostics-interfacetraffic']['match'][] = "graph.php*";
+
+$priv_list['page-diagnostics-cpuutilization'] = array();
+$priv_list['page-diagnostics-cpuutilization']['name'] = gettext("WebCfg - Diagnostics: CPU Utilization page");
+$priv_list['page-diagnostics-cpuutilization']['descr'] = gettext("Allow access to the 'Diagnostics: CPU Utilization' page.");
+$priv_list['page-diagnostics-cpuutilization']['match'] = array();
+$priv_list['page-diagnostics-cpuutilization']['match'][] = "graph_cpu.php*";
+
+$priv_list['page-diagnostics-haltsystem'] = array();
+$priv_list['page-diagnostics-haltsystem']['name'] = gettext("WebCfg - Diagnostics: Halt system page");
+$priv_list['page-diagnostics-haltsystem']['descr'] = gettext("Allow access to the 'Diagnostics: Halt system' page.");
+$priv_list['page-diagnostics-haltsystem']['match'] = array();
+$priv_list['page-diagnostics-haltsystem']['match'][] = "halt.php*";
+
+$priv_list['page-requiredforjavascript'] = array();
+$priv_list['page-requiredforjavascript']['name'] = gettext("WebCfg - Required for javascript page");
+$priv_list['page-requiredforjavascript']['descr'] = gettext("Allow access to the 'Required for javascript' page.");
+$priv_list['page-requiredforjavascript']['match'] = array();
+$priv_list['page-requiredforjavascript']['match'][] = "headjs.php*";
+
+$priv_list['page-xmlrpcinterfacestats'] = array();
+$priv_list['page-xmlrpcinterfacestats']['name'] = gettext("WebCfg - XMLRPC Interface Stats page");
+$priv_list['page-xmlrpcinterfacestats']['descr'] = gettext("Allow access to the 'XMLRPC Interface Stats' page.");
+$priv_list['page-xmlrpcinterfacestats']['match'] = array();
+$priv_list['page-xmlrpcinterfacestats']['match'][] = "ifstats.php*";
+
+$priv_list['page-system-login/logout'] = array();
+$priv_list['page-system-login/logout']['name'] = gettext("WebCfg - System: Login / Logout page / Dashboard");
+$priv_list['page-system-login/logout']['descr'] = gettext("Allow access to the 'System: Login / Logout' page and Dashboard.");
+$priv_list['page-system-login/logout']['match'] = array();
+$priv_list['page-system-login/logout']['match'][] = "index.php*";
+
+$priv_list['page-interfaces'] = array();
+$priv_list['page-interfaces']['name'] = gettext("WebCfg - Interfaces: WAN page");
+$priv_list['page-interfaces']['descr'] = gettext("Allow access to the 'Interfaces' page.");
+$priv_list['page-interfaces']['match'] = array();
+$priv_list['page-interfaces']['match'][] = "interfaces.php*";
+
+$priv_list['page-interfaces-assignnetworkports'] = array();
+$priv_list['page-interfaces-assignnetworkports']['name'] = gettext("WebCfg - Interfaces: Assign network ports page");
+$priv_list['page-interfaces-assignnetworkports']['descr'] = gettext("Allow access to the 'Interfaces: Assign network ports' page.");
+$priv_list['page-interfaces-assignnetworkports']['match'] = array();
+$priv_list['page-interfaces-assignnetworkports']['match'][] = "interfaces_assign.php*";
+
+$priv_list['page-interfaces-bridge'] = array();
+$priv_list['page-interfaces-bridge']['name'] = gettext("WebCfg - Interfaces: Bridge page");
+$priv_list['page-interfaces-bridge']['descr'] = gettext("Allow access to the 'Interfaces: Bridge' page.");
+$priv_list['page-interfaces-bridge']['match'] = array();
+$priv_list['page-interfaces-bridge']['match'][] = "interfaces_bridge.php*";
+
+$priv_list['page-interfaces-bridge-edit'] = array();
+$priv_list['page-interfaces-bridge-edit']['name'] = gettext("WebCfg - Interfaces: Bridge edit page");
+$priv_list['page-interfaces-bridge-edit']['descr'] = gettext("Allow access to the 'Interfaces: Bridge : Edit' page.");
+$priv_list['page-interfaces-bridge-edit']['match'] = array();
+$priv_list['page-interfaces-bridge-edit']['match'][] = "interfaces_bridge_edit.php*";
+
+$priv_list['page-interfaces-gif'] = array();
+$priv_list['page-interfaces-gif']['name'] = gettext("WebCfg - Interfaces: GIF page");
+$priv_list['page-interfaces-gif']['descr'] = gettext("Allow access to the 'Interfaces: GIF' page.");
+$priv_list['page-interfaces-gif']['match'] = array();
+$priv_list['page-interfaces-gif']['match'][] = "interfaces_gif.php*";
+
+$priv_list['page-interfaces-gif-edit'] = array();
+$priv_list['page-interfaces-gif-edit']['name'] = gettext("WebCfg - Interfaces: GIF: Edit page");
+$priv_list['page-interfaces-gif-edit']['descr'] = gettext("Allow access to the 'Interfaces: GIF: Edit' page.");
+$priv_list['page-interfaces-gif-edit']['match'] = array();
+$priv_list['page-interfaces-gif-edit']['match'][] = "interfaces_gif_edit.php*";
+
+$priv_list['page-interfaces-gre'] = array();
+$priv_list['page-interfaces-gre']['name'] = gettext("WebCfg - Interfaces: GRE page");
+$priv_list['page-interfaces-gre']['descr'] = gettext("Allow access to the 'Interfaces: GRE' page.");
+$priv_list['page-interfaces-gre']['match'] = array();
+$priv_list['page-interfaces-gre']['match'][] = "interfaces_gre.php*";
+
+$priv_list['page-interfaces-gre-edit'] = array();
+$priv_list['page-interfaces-gre-edit']['name'] = gettext("WebCfg - Interfaces: GRE: Edit page");
+$priv_list['page-interfaces-gre-edit']['descr'] = gettext("Allow access to the 'Interfaces: GRE: Edit' page.");
+$priv_list['page-interfaces-gre-edit']['match'] = array();
+$priv_list['page-interfaces-gre-edit']['match'][] = "interfaces_gre_edit.php*";
+
+$priv_list['page-interfaces-groups'] = array();
+$priv_list['page-interfaces-groups']['name'] = gettext("WebCfg - Interfaces: Groups page");
+$priv_list['page-interfaces-groups']['descr'] = gettext("Create interface groups");
+$priv_list['page-interfaces-groups']['match'] = array();
+$priv_list['page-interfaces-groups']['match'][] = "interfaces_groups.php*";
+
+$priv_list['page-interfaces-groups-edit'] = array();
+$priv_list['page-interfaces-groups-edit']['name'] = gettext("Interfaces: Groups: Edit page");
+$priv_list['page-interfaces-groups-edit']['descr'] = gettext("Allow access to the 'Interfaces: Groups: Edit' page.");
+$priv_list['page-interfaces-groups-edit']['match'] = array();
+$priv_list['page-interfaces-groups-edit']['match'][] = "interfaces_groups_edit.php*";
+
+$priv_list['page-interfaces-lagg'] = array();
+$priv_list['page-interfaces-lagg']['name'] = gettext("WebCfg - Interfaces: LAGG: page");
+$priv_list['page-interfaces-lagg']['descr'] = gettext("Edit Interface LAGG");
+$priv_list['page-interfaces-lagg']['match'] = array();
+$priv_list['page-interfaces-lagg']['match'][] = "interfaces_lagg.php*";
+
+$priv_list['page-interfaces-lagg-edit'] = array();
+$priv_list['page-interfaces-lagg-edit']['name'] = gettext("Interfaces: LAGG: Edit page");
+$priv_list['page-interfaces-lagg-edit']['descr'] = gettext("Allow access to the 'Interfaces: LAGG: Edit' page.");
+$priv_list['page-interfaces-lagg-edit']['match'] = array();
+$priv_list['page-interfaces-lagg-edit']['match'][] = "interfaces_lagg_edit.php*";
+
+$priv_list['page-interfaces-ppps'] = array();
+$priv_list['page-interfaces-ppps']['name'] = gettext("WebCfg - Interfaces: ppps page");
+$priv_list['page-interfaces-ppps']['descr'] = gettext("Allow access to the 'Interfaces: ppps' page.");
+$priv_list['page-interfaces-ppps']['match'] = array();
+$priv_list['page-interfaces-ppps']['match'][] = "interfaces_ppps.php*";
+
+$priv_list['page-interfaces-ppps-edit'] = array();
+$priv_list['page-interfaces-ppps-edit']['name'] = gettext("WebCfg - Interfaces: PPPs: Edit page");
+$priv_list['page-interfaces-ppps-edit']['descr'] = gettext("Allow access to the 'Interfaces: PPPs: Edit' page.");
+$priv_list['page-interfaces-ppps-edit']['match'] = array();
+$priv_list['page-interfaces-ppps-edit']['match'][] = "interfaces_ppps_edit.php*";
+
+$priv_list['page-interfaces-qinq'] = array();
+$priv_list['page-interfaces-qinq']['name'] = gettext("WebCfg - Interfaces: QinQ page");
+$priv_list['page-interfaces-qinq']['descr'] = gettext("Allow access to the 'Interfaces: QinQ' page.");
+$priv_list['page-interfaces-qinq']['match'] = array();
+$priv_list['page-interfaces-qinq']['match'][] = "interfaces_qinq.php*";
+
+$priv_list['page-interfaces-qinq-edit'] = array();
+$priv_list['page-interfaces-qinq-edit']['name'] = gettext("Interfaces: QinQ: Edit page");
+$priv_list['page-interfaces-qinq-edit']['descr'] = gettext("Allow access to 'Interfaces: QinQ: Edit' page");
+$priv_list['page-interfaces-qinq-edit']['match'] = array();
+$priv_list['page-interfaces-qinq-edit']['match'][] = "interfaces_qinq_edit.php*";
+
+$priv_list['page-interfaces-vlan'] = array();
+$priv_list['page-interfaces-vlan']['name'] = gettext("WebCfg - Interfaces: VLAN page");
+$priv_list['page-interfaces-vlan']['descr'] = gettext("Allow access to the 'Interfaces: VLAN' page.");
+$priv_list['page-interfaces-vlan']['match'] = array();
+$priv_list['page-interfaces-vlan']['match'][] = "interfaces_vlan.php*";
+
+$priv_list['page-interfaces-vlan-edit'] = array();
+$priv_list['page-interfaces-vlan-edit']['name'] = gettext("WebCfg - Interfaces: VLAN: Edit page");
+$priv_list['page-interfaces-vlan-edit']['descr'] = gettext("Allow access to the 'Interfaces: VLAN: Edit' page.");
+$priv_list['page-interfaces-vlan-edit']['match'] = array();
+$priv_list['page-interfaces-vlan-edit']['match'][] = "interfaces_vlan_edit.php*";
+
+$priv_list['page-interfaces-wireless'] = array();
+$priv_list['page-interfaces-wireless']['name'] = gettext("WebCfg - Interfaces: Wireless page");
+$priv_list['page-interfaces-wireless']['descr'] = gettext("Allow access to the 'Interfaces: Wireless' page.");
+$priv_list['page-interfaces-wireless']['match'] = array();
+$priv_list['page-interfaces-wireless']['match'][] = "interfaces_wireless.php*";
+
+$priv_list['page-interfaces-wireless-edit'] = array();
+$priv_list['page-interfaces-wireless-edit']['name'] = gettext("WebCfg - Interfaces: Wireless edit page");
+$priv_list['page-interfaces-wireless-edit']['descr'] = gettext("Allow access to the 'Interfaces: Wireless : Edit' page.");
+$priv_list['page-interfaces-wireless-edit']['match'] = array();
+$priv_list['page-interfaces-wireless-edit']['match'][] = "interfaces_wireless_edit.php*";
+
+$priv_list['page-system-license'] = array();
+$priv_list['page-system-license']['name'] = gettext("WebCfg - System: License page");
+$priv_list['page-system-license']['descr'] = gettext("Allow access to the 'System: License' page.");
+$priv_list['page-system-license']['match'] = array();
+$priv_list['page-system-license']['match'][] = "license.php*";
+
+$priv_list['page-services-loadbalancer-monitor'] = array();
+$priv_list['page-services-loadbalancer-monitor']['name'] = gettext("WebCfg - Services: Load Balancer: Monitors page");
+$priv_list['page-services-loadbalancer-monitor']['descr'] = gettext("Allow access to the 'Services: Load Balancer: Monitors' page.");
+$priv_list['page-services-loadbalancer-monitor']['match'] = array();
+$priv_list['page-services-loadbalancer-monitor']['match'][] = "load_balancer_monitor.php*";
+
+$priv_list['page-services-loadbalancer-monitor-edit'] = array();
+$priv_list['page-services-loadbalancer-monitor-edit']['name'] = gettext("WebCfg - Services: Load Balancer: Monitor: Edit page");
+$priv_list['page-services-loadbalancer-monitor-edit']['descr'] = gettext("Allow access to the 'Services: Load Balancer: Monitor: Edit' page.");
+$priv_list['page-services-loadbalancer-monitor-edit']['match'] = array();
+$priv_list['page-services-loadbalancer-monitor-edit']['match'][] = "load_balancer_monitor_edit.php*";
+
+$priv_list['page-loadbalancer-pool'] = array();
+$priv_list['page-loadbalancer-pool']['name'] = gettext("WebCfg - Load Balancer: Pool page");
+$priv_list['page-loadbalancer-pool']['descr'] = gettext("Allow access to the 'Load Balancer: Pool' page.");
+$priv_list['page-loadbalancer-pool']['match'] = array();
+$priv_list['page-loadbalancer-pool']['match'][] = "load_balancer_pool.php*";
+
+$priv_list['page-loadbalancer-pool-edit'] = array();
+$priv_list['page-loadbalancer-pool-edit']['name'] = gettext("WebCfg - Load Balancer: Pool: Edit page");
+$priv_list['page-loadbalancer-pool-edit']['descr'] = gettext("Allow access to the 'Load Balancer: Pool: Edit' page.");
+$priv_list['page-loadbalancer-pool-edit']['match'] = array();
+$priv_list['page-loadbalancer-pool-edit']['match'][] = "load_balancer_pool_edit.php*";
+
+$priv_list['page-services-loadbalancer-setting'] = array();
+$priv_list['page-services-loadbalancer-setting']['name'] = gettext("Webcfg - Services: Load Balancer: setting page");
+$priv_list['page-services-loadbalancer-setting']['descr'] = gettext("Allow access to the 'Settings: Load Balancer: Settings' page.");
+$priv_list['page-services-loadbalancer-setting']['match'] = array();
+$priv_list['page-services-loadbalancer-setting']['match'][] = "load_balancer_setting.php*";
+
+$priv_list['page-services-loadbalancer-virtualservers'] = array();
+$priv_list['page-services-loadbalancer-virtualservers']['name'] = gettext("WebCfg - Services: Load Balancer: Virtual Servers page");
+$priv_list['page-services-loadbalancer-virtualservers']['descr'] = gettext("Allow access to the 'Services: Load Balancer: Virtual Servers' page.");
+$priv_list['page-services-loadbalancer-virtualservers']['match'] = array();
+$priv_list['page-services-loadbalancer-virtualservers']['match'][] = "load_balancer_virtual_server.php*";
+
+$priv_list['page-services-ntpd'] = array();
+$priv_list['page-services-ntpd']['name'] = gettext("Webcfg - Services: NTP");
+$priv_list['page-services-ntpd']['descr'] = gettext("Allow access to the 'Services: NTP' page.");
+$priv_list['page-services-ntpd']['match'] = array();
+$priv_list['page-services-ntpd']['match'][] = "services_ntpd.php*";
+
+$priv_list['page-services-ntp-gps'] = array();
+$priv_list['page-services-ntp-gps']['name'] = gettext("Webcfg - Status: NTP GPS page");
+$priv_list['page-services-ntp-gps']['descr'] = gettext("Allow access to the 'Status: NTP Serial GPS' page.");
+$priv_list['page-services-ntp-gps']['match'] = array();
+$priv_list['page-services-ntp-gps']['match'][] = "status_ntpd_gps.php*";
+
+$priv_list['page-services-ntp-pps'] = array();
+$priv_list['page-services-ntp-pps']['name'] = gettext("Webcfg - Status: NTP PPS page");
+$priv_list['page-services-ntp-pps']['descr'] = gettext("Allow access to the 'Status: NTP PPS' page.");
+$priv_list['page-services-ntp-pps']['match'] = array();
+$priv_list['page-services-ntp-pps']['match'][] = "status_ntpd_pps.php*";
+
+$priv_list['page-loadbalancer-virtualserver-edit'] = array();
+$priv_list['page-loadbalancer-virtualserver-edit']['name'] = gettext("WebCfg - Load Balancer: Virtual Server: Edit page");
+$priv_list['page-loadbalancer-virtualserver-edit']['descr'] = gettext("Allow access to the 'Load Balancer: Virtual Server: Edit' page.");
+$priv_list['page-loadbalancer-virtualserver-edit']['match'] = array();
+$priv_list['page-loadbalancer-virtualserver-edit']['match'][] = "load_balancer_virtual_server_edit.php*";
+
+$priv_list['page-package-settings'] = array();
+$priv_list['page-package-settings']['name'] = gettext("WebCfg - Package: Settings page");
+$priv_list['page-package-settings']['descr'] = gettext("Allow access to the 'Package: Settings' page.");
+$priv_list['page-package-settings']['match'] = array();
+$priv_list['page-package-settings']['match'][] = "pkg.php*";
+
+$priv_list['page-package-edit'] = array();
+$priv_list['page-package-edit']['name'] = gettext("WebCfg - Package: Edit page");
+$priv_list['page-package-edit']['descr'] = gettext("Allow access to the 'Package: Edit' page.");
+$priv_list['page-package-edit']['match'] = array();
+$priv_list['page-package-edit']['match'][] = "pkg_edit.php*";
+
+$priv_list['page-system-packagemanager'] = array();
+$priv_list['page-system-packagemanager']['name'] = gettext("WebCfg - System: Package Manager page");
+$priv_list['page-system-packagemanager']['descr'] = gettext("Allow access to the 'System: Package Manager' page.");
+$priv_list['page-system-packagemanager']['match'] = array();
+$priv_list['page-system-packagemanager']['match'][] = "pkg_mgr.php*";
+
+$priv_list['page-system-packagemanager-installpackage'] = array();
+$priv_list['page-system-packagemanager-installpackage']['name'] = gettext("WebCfg - System: Package Manager: Install Package page");
+$priv_list['page-system-packagemanager-installpackage']['descr'] = gettext("Allow access to the 'System: Package Manager: Install Package' page.");
+$priv_list['page-system-packagemanager-installpackage']['match'] = array();
+$priv_list['page-system-packagemanager-installpackage']['match'][] = "pkg_mgr_install.php*";
+
+$priv_list['page-system-packagemanager-installed'] = array();
+$priv_list['page-system-packagemanager-installed']['name'] = gettext("WebCfg - System: Package Manager: Installed page");
+$priv_list['page-system-packagemanager-installed']['descr'] = gettext("Allow access to the 'System: Package Manager: Installed' page.");
+$priv_list['page-system-packagemanager-installed']['match'] = array();
+$priv_list['page-system-packagemanager-installed']['match'][] = "pkg_mgr_installed.php*";
+
+$priv_list['page-pkg-mgr-settings'] = array();
+$priv_list['page-pkg-mgr-settings']['name'] = gettext("WebCfg - Packages: Settings page");
+$priv_list['page-pkg-mgr-settings']['descr'] = gettext("Allow access to the 'Packages: Settings' page.");
+$priv_list['page-pkg-mgr-settings']['match'] = array();
+$priv_list['page-pkg-mgr-settings']['match'][] = "pkg_mgr_settings.php*";
+
+$priv_list['page-diagnostics-rebootsystem'] = array();
+$priv_list['page-diagnostics-rebootsystem']['name'] = gettext("WebCfg - Diagnostics: Reboot System page");
+$priv_list['page-diagnostics-rebootsystem']['descr'] = gettext("Allow access to the 'Diagnostics: Reboot System' page.");
+$priv_list['page-diagnostics-rebootsystem']['match'] = array();
+$priv_list['page-diagnostics-rebootsystem']['match'][] = "reboot.php*";
+
+$priv_list['page-diagnostics-restart-httpd'] = array();
+$priv_list['page-diagnostics-restart-httpd']['name'] = gettext("WebCfg - Diagnostics: Restart HTTPD : System page");
+$priv_list['page-diagnostics-restart-httpd']['descr'] = gettext("Allow access to the 'Diagnostics: Restart HTTPD: System' page.");
+$priv_list['page-diagnostics-restart-httpd']['match'] = array();
+$priv_list['page-diagnostics-restart-httpd']['match'][] = "restart_httpd.php*";
+
+$priv_list['page-services-captiveportal'] = array();
+$priv_list['page-services-captiveportal']['name'] = gettext("WebCfg - Services: Captive portal page");
+$priv_list['page-services-captiveportal']['descr'] = gettext("Allow access to the 'Services: Captive portal' page.");
+$priv_list['page-services-captiveportal']['match'] = array();
+$priv_list['page-services-captiveportal']['match'][] = "services_captiveportal.php*";
+
+$priv_list['page-services-captiveportal-filemanager'] = array();
+$priv_list['page-services-captiveportal-filemanager']['name'] = gettext("WebCfg - Services: Captive portal: File Manager page");
+$priv_list['page-services-captiveportal-filemanager']['descr'] = gettext("Allow access to the 'Services: Captive portal: File Manager' page.");
+$priv_list['page-services-captiveportal-filemanager']['match'] = array();
+$priv_list['page-services-captiveportal-filemanager']['match'][] = "services_captiveportal_filemanager.php*";
+
+$priv_list['page-services-captiveportal-allowedips'] = array();
+$priv_list['page-services-captiveportal-allowedips']['name'] = gettext("WebCfg - Services: Captive portal: Allowed IPs page");
+$priv_list['page-services-captiveportal-allowedips']['descr'] = gettext("Allow access to the 'Services: Captive portal: Allowed IPs' page.");
+$priv_list['page-services-captiveportal-allowedips']['match'] = array();
+$priv_list['page-services-captiveportal-allowedips']['match'][] = "services_captiveportal_ip.php*";
+
+$priv_list['page-services-captiveportal-editallowedips'] = array();
+$priv_list['page-services-captiveportal-editallowedips']['name'] = gettext("WebCfg - Services: Captive portal: Edit Allowed IPs page");
+$priv_list['page-services-captiveportal-editallowedips']['descr'] = gettext("Allow access to the 'Services: Captive portal: Edit Allowed IPs' page.");
+$priv_list['page-services-captiveportal-editallowedips']['match'] = array();
+$priv_list['page-services-captiveportal-editallowedips']['match'][] = "services_captiveportal_ip_edit.php*";
+
+$priv_list['page-services-captiveportal-macaddresses'] = array();
+$priv_list['page-services-captiveportal-macaddresses']['name'] = gettext("WebCfg - Services: Captive portal: Mac Addresses page");
+$priv_list['page-services-captiveportal-macaddresses']['descr'] = gettext("Allow access to the 'Services: Captive portal: Mac Addresses' page.");
+$priv_list['page-services-captiveportal-macaddresses']['match'] = array();
+$priv_list['page-services-captiveportal-macaddresses']['match'][] = "services_captiveportal_mac.php*";
+
+$priv_list['page-services-captiveportal-editmacaddresses'] = array();
+$priv_list['page-services-captiveportal-editmacaddresses']['name'] = gettext("WebCfg - Services: Captive portal: Edit MAC Addresses page");
+$priv_list['page-services-captiveportal-editmacaddresses']['descr'] = gettext("Allow access to the 'Services: Captive portal: Edit MAC Addresses' page.");
+$priv_list['page-services-captiveportal-editmacaddresses']['match'] = array();
+$priv_list['page-services-captiveportal-editmacaddresses']['match'][] = "services_captiveportal_mac_edit.php*";
+
+$priv_list['page-services-captiveportal-allowedhostnames'] = array();
+$priv_list['page-services-captiveportal-allowedhostnames']['name'] = gettext("WebCfg - Services: Captive portal: Allowed Hostnames page");
+$priv_list['page-services-captiveportal-allowedhostnames']['descr'] = gettext("Allow access to the 'Services: Captive portal: Allowed Hostnames' page.");
+$priv_list['page-services-captiveportal-allowedhostnames']['match'] = array();
+$priv_list['page-services-captiveportal-allowedhostnames']['match'][] = "services_captiveportal_hostname.php*";
+
+$priv_list['page-services-captiveportal-editallowedhostnames'] = array();
+$priv_list['page-services-captiveportal-editallowedhostnames']['name'] = gettext("WebCfg - Services: Captive portal: Edit Allowed Hostnames page");
+$priv_list['page-services-captiveportal-editallowedhostnames']['descr'] = gettext("Allow access to the 'Services: Captive portal: Allowed Hostnames' page.");
+$priv_list['page-services-captiveportal-editallowedhostnames']['match'] = array();
+$priv_list['page-services-captiveportal-editallowedhostnames']['match'][] = "services_captiveportal_hostname_edit.php*";
+
+$priv_list['page-services-captiveportal-editzones'] = array();
+$priv_list['page-services-captiveportal-editzones']['name'] = gettext("Webcfg - Services: Captive portal: Edit Zones page");
+$priv_list['page-services-captiveportal-editzones']['descr'] = gettext("Allow access to the 'Services: Captive portal: Edit Zones' page.");
+$priv_list['page-services-captiveportal-editzones']['match'] = array();
+$priv_list['page-services-captiveportal-editzones']['match'][] = "services_captiveportal_zones_edit.php*";
+
+$priv_list['page-services-captiveportal-vouchers'] = array();
+$priv_list['page-services-captiveportal-vouchers']['name'] = gettext("WebCfg - Services: Captive portal Vouchers page");
+$priv_list['page-services-captiveportal-vouchers']['descr'] = gettext("Allow access to the 'Services: Captive portal Vouchers' page.");
+$priv_list['page-services-captiveportal-vouchers']['match'] = array();
+$priv_list['page-services-captiveportal-vouchers']['match'][] = "services_captiveportal_vouchers.php*";
+
+$priv_list['page-services-captiveportal-voucher-edit'] = array();
+$priv_list['page-services-captiveportal-voucher-edit']['name'] = "WebCfg - Services: Captive portal Voucher Rolls page";
+$priv_list['page-services-captiveportal-voucher-edit']['descr'] = "Allow access to the 'Services: Captive portal Edit Voucher Rolls' page.";
+$priv_list['page-services-captiveportal-voucher-edit']['match'] = array();
+$priv_list['page-services-captiveportal-voucher-edit']['match'][] = "services_captiveportal_vouchers_edit.php*";
+
+$priv_list['page-services-captiveportal-zones'] = array();
+$priv_list['page-services-captiveportal-zones']['name'] = gettext("WebCfg - Services: Captive portal Zones page");
+$priv_list['page-services-captiveportal-zones']['descr'] = gettext("Allow access to the 'Services: Captive portal Zones' page.");
+$priv_list['page-services-captiveportal-zones']['match'] = array();
+$priv_list['page-services-captiveportal-zones']['match'][] = "services_captiveportal_zones.php*";
+
+$priv_list['page-services-dhcpserver'] = array();
+$priv_list['page-services-dhcpserver']['name'] = gettext("WebCfg - Services: DHCP server page");
+$priv_list['page-services-dhcpserver']['descr'] = gettext("Allow access to the 'Services: DHCP server' page.");
+$priv_list['page-services-dhcpserver']['match'] = array();
+$priv_list['page-services-dhcpserver']['match'][] = "services_dhcp.php*";
+
+$priv_list['page-services-dhcpserver-editstaticmapping'] = array();
+$priv_list['page-services-dhcpserver-editstaticmapping']['name'] = gettext("WebCfg - Services: DHCP Server : Edit static mapping page");
+$priv_list['page-services-dhcpserver-editstaticmapping']['descr'] = gettext("Allow access to the 'Services: DHCP Server : Edit static mapping' page.");
+$priv_list['page-services-dhcpserver-editstaticmapping']['match'] = array();
+$priv_list['page-services-dhcpserver-editstaticmapping']['match'][] = "services_dhcp_edit.php*";
+
+$priv_list['page-services-dhcprelay'] = array();
+$priv_list['page-services-dhcprelay']['name'] = gettext("WebCfg - Services: DHCP Relay page");
+$priv_list['page-services-dhcprelay']['descr'] = gettext("Allow access to the 'Services: DHCP Relay' page.");
+$priv_list['page-services-dhcprelay']['match'] = array();
+$priv_list['page-services-dhcprelay']['match'][] = "services_dhcp_relay.php*";
+
+$priv_list['page-services-dhcpv6server'] = array();
+$priv_list['page-services-dhcpv6server']['name'] = gettext("Webcfg - Services: DHCPv6 server page");
+$priv_list['page-services-dhcpv6server']['descr'] = gettext("Allow access to the 'Services: DHCPv6 server' page.");
+$priv_list['page-services-dhcpv6server']['match'] = array();
+$priv_list['page-services-dhcpv6server']['match'][] = "services_dhcpv6.php*";
+
+$priv_list['page-services-dhcpserverv6-editstaticmapping'] = array();
+$priv_list['page-services-dhcpserverv6-editstaticmapping']['name'] = gettext("Webcfg - Services: DHCPv6 Server : Edit static mapping page");
+$priv_list['page-services-dhcpserverv6-editstaticmapping']['descr'] = gettext("Allow access to the 'Services: DHCPv6 Server : Edit static mapping' page.");
+$priv_list['page-services-dhcpserverv6-editstaticmapping']['match'] = array();
+$priv_list['page-services-dhcpserverv6-editstaticmapping']['match'][] = "services_dhcpv6_edit.php*";
+
+$priv_list['page-services-dhcpv6relay'] = array();
+$priv_list['page-services-dhcpv6relay']['name'] = gettext("Webcfg - Services: DHCPv6 Relay page");
+$priv_list['page-services-dhcpv6relay']['descr'] = gettext("Allow access to the 'Services: DHCPv6 Relay' page.");
+$priv_list['page-services-dhcpv6relay']['match'] = array();
+$priv_list['page-services-dhcpv6relay']['match'][] = "services_dhcpv6_relay.php*";
+
+$priv_list['page-services-dnsforwarder'] = array();
+$priv_list['page-services-dnsforwarder']['name'] = gettext("WebCfg - Services: DNS Forwarder page");
+$priv_list['page-services-dnsforwarder']['descr'] = gettext("Allow access to the 'Services: DNS Forwarder' page.");
+$priv_list['page-services-dnsforwarder']['match'] = array();
+$priv_list['page-services-dnsforwarder']['match'][] = "services_dnsmasq.php*";
+
+$priv_list['page-services-dnsforwarder-editdomainoverride'] = array();
+$priv_list['page-services-dnsforwarder-editdomainoverride']['name'] = gettext("WebCfg - Services: DNS Forwarder: Edit Domain Override page");
+$priv_list['page-services-dnsforwarder-editdomainoverride']['descr'] = gettext("Allow access to the 'Services: DNS Forwarder: Edit Domain Override' page.");
+$priv_list['page-services-dnsforwarder-editdomainoverride']['match'] = array();
+$priv_list['page-services-dnsforwarder-editdomainoverride']['match'][] = "services_dnsmasq_domainoverride_edit.php*";
+
+$priv_list['page-services-dnsforwarder-edithost'] = array();
+$priv_list['page-services-dnsforwarder-edithost']['name'] = gettext("WebCfg - Services: DNS Forwarder: Edit host page");
+$priv_list['page-services-dnsforwarder-edithost']['descr'] = gettext("Allow access to the 'Services: DNS Forwarder: Edit host' page.");
+$priv_list['page-services-dnsforwarder-edithost']['match'] = array();
+$priv_list['page-services-dnsforwarder-edithost']['match'][] = "services_dnsmasq_edit.php*";
+
+$priv_list['page-services-dnsresolver'] = array();
+$priv_list['page-services-dnsresolver']['name'] = gettext("WebCfg - Services: DNS Resolver page");
+$priv_list['page-services-dnsresolver']['descr'] = gettext("Allow access to the 'Services: DNS Resolver' page.");
+$priv_list['page-services-dnsresolver']['match'] = array();
+$priv_list['page-services-dnsresolver']['match'][] = "services_unbound.php*";
+
+$priv_list['page-services-dnsresolver-advanced'] = array();
+$priv_list['page-services-dnsresolver-advanced']['name'] = gettext("WebCfg - Services: DNS Resolver: Advanced page");
+$priv_list['page-services-dnsresolver-advanced']['descr'] = gettext("Allow access to the 'Services: DNS Resolver: Advanced' page.");
+$priv_list['page-services-dnsresolver-advanced']['match'] = array();
+$priv_list['page-services-dnsresolver-advanced']['match'][] = "services_unbound_advanced.php*";
+
+$priv_list['page-services-dnsresolver-acls'] = array();
+$priv_list['page-services-dnsresolver-acls']['name'] = gettext("WebCfg - Services: DNS Resolver: Access Lists page");
+$priv_list['page-services-dnsresolver-acls']['descr'] = gettext("Allow access to the 'Services: DNS Resolver: Access Lists' page.");
+$priv_list['page-services-dnsresolver-acls']['match'] = array();
+$priv_list['page-services-dnsresolver-acls']['match'][] = "services_unbound_acls.php*";
+
+$priv_list['page-services-dnsresolver-editacls'] = array();
+$priv_list['page-services-dnsresolver-editacls']['name'] = gettext("WebCfg - Services: DNS Resolver: Access Lists: Edit page");
+$priv_list['page-services-dnsresolver-editacls']['descr'] = gettext("Allow access to the 'Services: DNS Resolver: Access Lists: Edit' page.");
+$priv_list['page-services-dnsresolver-editacls']['match'] = array();
+$priv_list['page-services-dnsresolver-editacls']['match'][] = "services_unbound_acls_edit.php*";
+
+$priv_list['page-services-dnsresolver-editdomainoverride'] = array();
+$priv_list['page-services-dnsresolver-editdomainoverride']['name'] = gettext("WebCfg - Services: DNS Resolver: Edit Domain Override page");
+$priv_list['page-services-dnsresolver-editdomainoverride']['descr'] = gettext("Allow access to the 'Services: DNS Resolver: Edit Domain Override' page.");
+$priv_list['page-services-dnsresolver-editdomainoverride']['match'] = array();
+$priv_list['page-services-dnsresolver-editdomainoverride']['match'][] = "services_unbound_domainoverride_edit.php*";
+
+$priv_list['page-services-dnsresolver-edithost'] = array();
+$priv_list['page-services-dnsresolver-edithost']['name'] = gettext("WebCfg - Services: DNS Resolver: Edit host page");
+$priv_list['page-services-dnsresolver-edithost']['descr'] = gettext("Allow access to the 'Services: DNS Resolver: Edit host' page.");
+$priv_list['page-services-dnsresolver-edithost']['match'] = array();
+$priv_list['page-services-dnsresolver-edithost']['match'][] = "services_unbound_host_edit.php*";
+
+$priv_list['page-services-dynamicdnsclients'] = array();
+$priv_list['page-services-dynamicdnsclients']['name'] = gettext("WebCfg - Services: Dynamic DNS clients page");
+$priv_list['page-services-dynamicdnsclients']['descr'] = gettext("Allow access to the 'Services: Dynamic DNS clients' page.");
+$priv_list['page-services-dynamicdnsclients']['match'] = array();
+$priv_list['page-services-dynamicdnsclients']['match'][] = "services_dyndns.php*";
+
+$priv_list['page-services-dynamicdnsclient'] = array();
+$priv_list['page-services-dynamicdnsclient']['name'] = gettext("WebCfg - Services: Dynamic DNS client page");
+$priv_list['page-services-dynamicdnsclient']['descr'] = gettext("Allow access to the 'Services: Dynamic DNS client' page.");
+$priv_list['page-services-dynamicdnsclient']['match'] = array();
+$priv_list['page-services-dynamicdnsclient']['match'][] = "services_dyndns_edit.php*";
+
+$priv_list['page-services-igmpproxy'] = array();
+$priv_list['page-services-igmpproxy']['name'] = gettext("WebCfg - Services: Igmpproxy page");
+$priv_list['page-services-igmpproxy']['descr'] = gettext("Allow access to the 'Services: Igmpproxy' page.");
+$priv_list['page-services-igmpproxy']['match'] = array();
+$priv_list['page-services-igmpproxy']['match'][] = "services_igmpproxy.php*";
+
+$priv_list['page-services-igmpproxy-edit'] = array();
+$priv_list['page-services-igmpproxy-edit']['name'] = gettext("Firewall: Igmpproxy: Edit page");
+$priv_list['page-services-igmpproxy-edit']['descr'] = gettext("Allow access to the 'Services: Igmpproxy: Edit' page.");
+$priv_list['page-services-igmpproxy-edit']['match'] = array();
+$priv_list['page-services-igmpproxy-edit']['match'][] = "services_igmpproxy_edit.php*";
+
+$priv_list['page-services-rfc2136clients'] = array();
+$priv_list['page-services-rfc2136clients']['name'] = gettext("WebCfg - Services: RFC 2136 clients page");
+$priv_list['page-services-rfc2136clients']['descr'] = gettext("Allow access to the 'Services: RFC 2136 clients' page.");
+$priv_list['page-services-rfc2136clients']['match'] = array();
+$priv_list['page-services-rfc2136clients']['match'][] = "services_rfc2136.php*";
+
+$priv_list['page-services-router-advertisements'] = array();
+$priv_list['page-services-router-advertisements']['name'] = gettext("Webcfg - Services: Router Advertisements page");
+$priv_list['page-services-router-advertisements']['descr'] = gettext("Allow access to the 'Services: Router Advertisements' page.");
+$priv_list['page-services-router-advertisements']['match'] = array();
+$priv_list['page-services-router-advertisements']['match'][] = "services_router_advertisements.php*";
+
+$priv_list['page-services-snmp'] = array();
+$priv_list['page-services-snmp']['name'] = gettext("WebCfg - Services: SNMP page");
+$priv_list['page-services-snmp']['descr'] = gettext("Allow access to the 'Services: SNMP' page.");
+$priv_list['page-services-snmp']['match'] = array();
+$priv_list['page-services-snmp']['match'][] = "services_snmp.php*";
+
+$priv_list['page-services-wakeonlan'] = array();
+$priv_list['page-services-wakeonlan']['name'] = gettext("WebCfg - Services: Wake on LAN page");
+$priv_list['page-services-wakeonlan']['descr'] = gettext("Allow access to the 'Services: Wake on LAN' page.");
+$priv_list['page-services-wakeonlan']['match'] = array();
+$priv_list['page-services-wakeonlan']['match'][] = "services_wol.php*";
+
+$priv_list['page-services-wakeonlan-edit'] = array();
+$priv_list['page-services-wakeonlan-edit']['name'] = gettext("WebCfg - Services: Wake on LAN: Edit page");
+$priv_list['page-services-wakeonlan-edit']['descr'] = gettext("Allow access to the 'Services: Wake on LAN: Edit' page.");
+$priv_list['page-services-wakeonlan-edit']['match'] = array();
+$priv_list['page-services-wakeonlan-edit']['match'][] = "services_wol_edit.php*";
+
+$priv_list['page-diagnostics-cpuutilization'] = array();
+$priv_list['page-diagnostics-cpuutilization']['name'] = gettext("WebCfg - Diagnostics: CPU Utilization page");
+$priv_list['page-diagnostics-cpuutilization']['descr'] = gettext("Allow access to the 'Diagnostics: CPU Utilization' page.");
+$priv_list['page-diagnostics-cpuutilization']['match'] = array();
+$priv_list['page-diagnostics-cpuutilization']['match'][] = "stats.php*";
+
+$priv_list['page-hidden-detailedstatus'] = array();
+$priv_list['page-hidden-detailedstatus']['name'] = gettext("WebCfg - Hidden: Detailed Status page");
+$priv_list['page-hidden-detailedstatus']['descr'] = gettext("Allow access to the 'Hidden: Detailed Status' page.");
+$priv_list['page-hidden-detailedstatus']['match'] = array();
+$priv_list['page-hidden-detailedstatus']['match'][] = "status.php*";
+
+$priv_list['page-status-captiveportal'] = array();
+$priv_list['page-status-captiveportal']['name'] = gettext("WebCfg - Status: Captive portal page");
+$priv_list['page-status-captiveportal']['descr'] = gettext("Allow access to the 'Status: Captive portal' page.");
+$priv_list['page-status-captiveportal']['match'] = array();
+$priv_list['page-status-captiveportal']['match'][] = "status_captiveportal.php*";
+
+$priv_list['page-status-captiveportal-expire'] = array();
+$priv_list['page-status-captiveportal-expire']['name'] = gettext("Webcfg - Status: Captive portal Expire Vouchers page");
+$priv_list['page-status-captiveportal-expire']['descr'] = gettext("Allow access to the 'Status: Captive portal Expire Vouchers' page.");
+$priv_list['page-status-captiveportal-expire']['match'] = array();
+$priv_list['page-status-captiveportal-expire']['match'][] = "status_captiveportal_expire.php*";
+
+$priv_list['page-status-captiveportal-test'] = array();
+$priv_list['page-status-captiveportal-test']['name'] = gettext("WebCfg - Status: Captive portal Test Vouchers page");
+$priv_list['page-status-captiveportal-test']['descr'] = gettext("Allow access to the 'Status: Captive portal Test Vouchers' page.");
+$priv_list['page-status-captiveportal-test']['match'] = array();
+$priv_list['page-status-captiveportal-test']['match'][] = "status_captiveportal_test.php*";
+
+$priv_list['page-status-captiveportal-voucher-rolls'] = array();
+$priv_list['page-status-captiveportal-voucher-rolls']['name'] = gettext("WebCfg - Status: Captive portal Voucher Rolls page");
+$priv_list['page-status-captiveportal-voucher-rolls']['descr'] = gettext("Allow access to the 'Status: Captive portal Voucher Rolls' page.");
+$priv_list['page-status-captiveportal-voucher-rolls']['match'] = array();
+$priv_list['page-status-captiveportal-voucher-rolls']['match'][] = "status_captiveportal_voucher_rolls.php*";
+
+$priv_list['page-status-captiveportal-vouchers'] = array();
+$priv_list['page-status-captiveportal-vouchers']['name'] = gettext("WebCfg - Status: Captive portal Vouchers page");
+$priv_list['page-status-captiveportal-vouchers']['descr'] = gettext("Allow access to the 'Status: Captive portal Vouchers' page.");
+$priv_list['page-status-captiveportal-vouchers']['match'] = array();
+$priv_list['page-status-captiveportal-vouchers']['match'][] = "status_captiveportal_vouchers.php*";
+
+$priv_list['page-status-dhcpleases'] = array();
+$priv_list['page-status-dhcpleases']['name'] = gettext("WebCfg - Status: DHCP leases page");
+$priv_list['page-status-dhcpleases']['descr'] = gettext("Allow access to the 'Status: DHCP leases' page.");
+$priv_list['page-status-dhcpleases']['match'] = array();
+$priv_list['page-status-dhcpleases']['match'][] = "status_dhcp_leases.php*";
+
+$priv_list['page-status-dhcpv6leases'] = array();
+$priv_list['page-status-dhcpv6leases']['name'] = gettext("Webcfg - Status: DHCPv6 leases page");
+$priv_list['page-status-dhcpv6leases']['descr'] = gettext("Allow access to the 'Status: DHCPv6 leases' page.");
+$priv_list['page-status-dhcpv6leases']['match'] = array();
+$priv_list['page-status-dhcpv6leases']['match'][] = "status_dhcpv6_leases.php*";
+
+$priv_list['page-status-filterreloadstatus'] = array();
+$priv_list['page-status-filterreloadstatus']['name'] = gettext("WebCfg - Status: Filter Reload Status page");
+$priv_list['page-status-filterreloadstatus']['descr'] = gettext("Allow access to the 'Status: Filter Reload Status' page.");
+$priv_list['page-status-filterreloadstatus']['match'] = array();
+$priv_list['page-status-filterreloadstatus']['match'][] = "status_filter_reload.php*";
+
+$priv_list['page-status-gatewaygroups'] = array();
+$priv_list['page-status-gatewaygroups']['name'] = gettext("WebCfg - Status: Gateway Groups page");
+$priv_list['page-status-gatewaygroups']['descr'] = gettext("Allow access to the 'Status: Gateway Groups' page.");
+$priv_list['page-status-gatewaygroups']['match'] = array();
+$priv_list['page-status-gatewaygroups']['match'][] = "status_gateway_groups.php*";
+
+$priv_list['page-status-gateways'] = array();
+$priv_list['page-status-gateways']['name'] = gettext("WebCfg - Status: Gateways page");
+$priv_list['page-status-gateways']['descr'] = gettext("Allow access to the 'Status: Gateways' page.");
+$priv_list['page-status-gateways']['match'] = array();
+$priv_list['page-status-gateways']['match'][] = "status_gateways.php*";
+
+$priv_list['page-status-trafficgraph'] = array();
+$priv_list['page-status-trafficgraph']['name'] = gettext("WebCfg - Status: Traffic Graph page");
+$priv_list['page-status-trafficgraph']['descr'] = gettext("Allow access to the 'Status: Traffic Graph' page.");
+$priv_list['page-status-trafficgraph']['match'] = array();
+$priv_list['page-status-trafficgraph']['match'][] = "status_graph.php*";
+$priv_list['page-status-trafficgraph']['match'][] = "bandwidth_by_ip.php*";
+$priv_list['page-status-trafficgraph']['match'][] = "graph.php*";
+$priv_list['page-status-trafficgraph']['match'][] = "ifstats.php*";
+
+$priv_list['page-status-cpuload'] = array();
+$priv_list['page-status-cpuload']['name'] = gettext("WebCfg - Status: CPU load page");
+$priv_list['page-status-cpuload']['descr'] = gettext("Allow access to the 'Status: CPU load' page.");
+$priv_list['page-status-cpuload']['match'] = array();
+$priv_list['page-status-cpuload']['match'][] = "status_graph_cpu.php*";
+
+$priv_list['page-status-interfaces'] = array();
+$priv_list['page-status-interfaces']['name'] = gettext("WebCfg - Status: Interfaces page");
+$priv_list['page-status-interfaces']['descr'] = gettext("Allow access to the 'Status: Interfaces' page.");
+$priv_list['page-status-interfaces']['match'] = array();
+$priv_list['page-status-interfaces']['match'][] = "status_interfaces.php*";
+
+$priv_list['page-status-loadbalancer-pool'] = array();
+$priv_list['page-status-loadbalancer-pool']['name'] = gettext("WebCfg - Status: Load Balancer: Pool page");
+$priv_list['page-status-loadbalancer-pool']['descr'] = gettext("Allow access to the 'Status: Load Balancer: Pool' page.");
+$priv_list['page-status-loadbalancer-pool']['match'] = array();
+$priv_list['page-status-loadbalancer-pool']['match'][] = "status_lb_pool.php*";
+
+$priv_list['page-status-loadbalancer-virtualserver'] = array();
+$priv_list['page-status-loadbalancer-virtualserver']['name'] = gettext("WebCfg - Status: Load Balancer: Virtual Server page");
+$priv_list['page-status-loadbalancer-virtualserver']['descr'] = gettext("Allow access to the 'Status: Load Balancer: Virtual Server' page.");
+$priv_list['page-status-loadbalancer-virtualserver']['match'] = array();
+$priv_list['page-status-loadbalancer-virtualserver']['match'][] = "status_lb_vs.php*";
+
+$priv_list['page-status-openvpn'] = array();
+$priv_list['page-status-openvpn']['name'] = gettext("WebCfg - Status: OpenVPN page");
+$priv_list['page-status-openvpn']['descr'] = gettext("Allow access to the 'Status: OpenVPN' page.");
+$priv_list['page-status-openvpn']['match'] = array();
+$priv_list['page-status-openvpn']['match'][] = "status_openvpn.php*";
+
+$priv_list['page-status-trafficshaper-queues'] = array();
+$priv_list['page-status-trafficshaper-queues']['name'] = gettext("WebCfg - Status: Traffic shaper: Queues page");
+$priv_list['page-status-trafficshaper-queues']['descr'] = gettext("Allow access to the 'Status: Traffic shaper: Queues' page.");
+$priv_list['page-status-trafficshaper-queues']['match'] = array();
+$priv_list['page-status-trafficshaper-queues']['match'][] = "status_queues.php*";
+
+$priv_list['page-status-rrdgraphs'] = array();
+$priv_list['page-status-rrdgraphs']['name'] = gettext("WebCfg - Status: RRD Graphs page");
+$priv_list['page-status-rrdgraphs']['descr'] = gettext("Allow access to the 'Status: RRD Graphs' page.");
+$priv_list['page-status-rrdgraphs']['match'] = array();
+$priv_list['page-status-rrdgraphs']['match'][] = "status_rrd_graph.php*";
+$priv_list['page-status-rrdgraphs']['match'][] = "status_rrd_graph_img.php*";
+
+$priv_list['page-status-rrdgraph-settings'] = array();
+$priv_list['page-status-rrdgraph-settings']['name'] = gettext("WebCfg - Status: RRD Graphs settings page");
+$priv_list['page-status-rrdgraph-settings']['descr'] = gettext("Allow access to the 'Status: RRD Graphs: settings' page.");
+$priv_list['page-status-rrdgraph-settings']['match'] = array();
+$priv_list['page-status-rrdgraph-settings']['match'][] = "status_rrd_graph_settings.php*";
+
+$priv_list['page-status-services'] = array();
+$priv_list['page-status-services']['name'] = gettext("WebCfg - Status: Services page");
+$priv_list['page-status-services']['descr'] = gettext("Allow access to the 'Status: Services' page.");
+$priv_list['page-status-services']['match'] = array();
+$priv_list['page-status-services']['match'][] = "status_services.php*";
+
+$priv_list['page-status-upnpstatus'] = array();
+$priv_list['page-status-upnpstatus']['name'] = gettext("WebCfg - Status: UPnP Status page");
+$priv_list['page-status-upnpstatus']['descr'] = gettext("Allow access to the 'Status: UPnP Status' page.");
+$priv_list['page-status-upnpstatus']['match'] = array();
+$priv_list['page-status-upnpstatus']['match'][] = "status_upnp.php*";
+
+$priv_list['page-diagnostics-wirelessstatus'] = array();
+$priv_list['page-diagnostics-wirelessstatus']['name'] = gettext("WebCfg - Status: Wireless page");
+$priv_list['page-diagnostics-wirelessstatus']['descr'] = gettext("Allow access to the 'Status: Wireless' page.");
+$priv_list['page-diagnostics-wirelessstatus']['match'] = array();
+$priv_list['page-diagnostics-wirelessstatus']['match'][] = "status_wireless.php*";
+
+$priv_list['page-system-generalsetup'] = array();
+$priv_list['page-system-generalsetup']['name'] = gettext("WebCfg - System: General Setup page");
+$priv_list['page-system-generalsetup']['descr'] = gettext("Allow access to the 'System: General Setup' page.");
+$priv_list['page-system-generalsetup']['match'] = array();
+$priv_list['page-system-generalsetup']['match'][] = "system.php*";
+
+$priv_list['page-system-advanced-admin'] = array();
+$priv_list['page-system-advanced-admin']['name'] = gettext("WebCfg - System: Advanced: Admin Access Page");
+$priv_list['page-system-advanced-admin']['descr'] = gettext("Allow access to the 'System: Advanced: Admin Access' page.");
+$priv_list['page-system-advanced-admin']['match'] = array();
+$priv_list['page-system-advanced-admin']['match'][] = "system_advanced_admin.php*";
+
+$priv_list['page-system-advanced-firewall'] = array();
+$priv_list['page-system-advanced-firewall']['name'] = gettext("WebCfg - System: Advanced: Firewall and NAT page");
+$priv_list['page-system-advanced-firewall']['descr'] = gettext("Allow access to the 'System: Advanced: Firewall and NAT' page.");
+$priv_list['page-system-advanced-firewall']['match'] = array();
+$priv_list['page-system-advanced-firewall']['match'][] = "system_advanced_firewall.php*";
+
+$priv_list['page-system-advanced-misc'] = array();
+$priv_list['page-system-advanced-misc']['name'] = gettext("WebCfg - System: Advanced: Miscellaneous page");
+$priv_list['page-system-advanced-misc']['descr'] = gettext("Allow access to the 'System: Advanced: Miscellaneous' page.");
+$priv_list['page-system-advanced-misc']['match'] = array();
+$priv_list['page-system-advanced-misc']['match'][] = "system_advanced_misc.php*";
+
+$priv_list['page-system-advanced-network'] = array();
+$priv_list['page-system-advanced-network']['name'] = gettext("WebCfg - System: Advanced: Networking page");
+$priv_list['page-system-advanced-network']['descr'] = gettext("Allow access to the 'System: Advanced: Networking' page.");
+$priv_list['page-system-advanced-network']['match'] = array();
+$priv_list['page-system-advanced-network']['match'][] = "system_advanced_network.php*";
+
+$priv_list['page-system-advanced-notifications'] = array();
+$priv_list['page-system-advanced-notifications']['name'] = gettext("WebCfg - System: Advanced: Notifications page");
+$priv_list['page-system-advanced-notifications']['descr'] = gettext("Allow access to the 'System: Advanced: Notifications' page.");
+$priv_list['page-system-advanced-notifications']['match'] = array();
+$priv_list['page-system-advanced-notifications']['match'][] = "system_advanced_notifications.php*";
+
+$priv_list['page-system-advanced-sysctl'] = array();
+$priv_list['page-system-advanced-sysctl']['name'] = gettext("WebCfg - System: Advanced: Tunables page");
+$priv_list['page-system-advanced-sysctl']['descr'] = gettext("Allow access to the 'System: Advanced: Tunables' page.");
+$priv_list['page-system-advanced-sysctl']['match'] = array();
+$priv_list['page-system-advanced-sysctl']['match'][] = "system_advanced_sysctl.php*";
+
+$priv_list['page-system-authservers'] = array();
+$priv_list['page-system-authservers']['name'] = gettext("WebCfg - System: Authentication Servers");
+$priv_list['page-system-authservers']['descr'] = gettext("Allow access to the 'System: Authentication Servers' page.");
+$priv_list['page-system-authservers']['match'] = array();
+$priv_list['page-system-authservers']['match'][] = "system_authservers.php*";
+
+$priv_list['page-system-camanager'] = array();
+$priv_list['page-system-camanager']['name'] = gettext("WebCfg - System: CA Manager");
+$priv_list['page-system-camanager']['descr'] = gettext("Allow access to the 'System: CA Manager' page.");
+$priv_list['page-system-camanager']['match'] = array();
+$priv_list['page-system-camanager']['match'][] = "system_camanager.php*";
+
+$priv_list['page-system-certmanager'] = array();
+$priv_list['page-system-certmanager']['name'] = gettext("WebCfg - System: Certificate Manager");
+$priv_list['page-system-certmanager']['descr'] = gettext("Allow access to the 'System: Certificate Manager' page.");
+$priv_list['page-system-certmanager']['match'] = array();
+$priv_list['page-system-certmanager']['match'][] = "system_certmanager.php*";
+
+$priv_list['page-system-crlmanager'] = array();
+$priv_list['page-system-crlmanager']['name'] = gettext("WebCfg - System: CRL Manager");
+$priv_list['page-system-crlmanager']['descr'] = gettext("Allow access to the 'System: CRL Manager' page.");
+$priv_list['page-system-crlmanager']['match'] = array();
+$priv_list['page-system-crlmanager']['match'][] = "system_crlmanager.php*";
+
+$priv_list['page-system-firmware-manualupdate'] = array();
+$priv_list['page-system-firmware-manualupdate']['name'] = gettext("WebCfg - System: Firmware: Manual Update page");
+$priv_list['page-system-firmware-manualupdate']['descr'] = gettext("Allow access to the 'System: Firmware: Manual Update' page.");
+$priv_list['page-system-firmware-manualupdate']['match'] = array();
+$priv_list['page-system-firmware-manualupdate']['match'][] = "system_firmware.php*";
+
+$priv_list['page-system-firmware-checkforupdate'] = array();
+$priv_list['page-system-firmware-checkforupdate']['name'] = gettext("WebCfg - System: Firmware: Check For Update page");
+$priv_list['page-system-firmware-checkforupdate']['descr'] = gettext("Allow access to the 'System: Firmware: Check For Update' page.");
+$priv_list['page-system-firmware-checkforupdate']['match'] = array();
+$priv_list['page-system-firmware-checkforupdate']['match'][] = "system_firmware_auto.php*";
+
+$priv_list['page-system-firmware-autoupdate'] = array();
+$priv_list['page-system-firmware-autoupdate']['name'] = gettext("WebCfg - System: Firmware: Auto Update page");
+$priv_list['page-system-firmware-autoupdate']['descr'] = gettext("Allow access to the 'System: Firmware: Auto Update' page.");
+$priv_list['page-system-firmware-autoupdate']['match'] = array();
+$priv_list['page-system-firmware-autoupdate']['match'][] = "system_firmware_check.php*";
+
+$priv_list['page-system-firmware-settings'] = array();
+$priv_list['page-system-firmware-settings']['name'] = gettext("WebCfg - System: Firmware: Settings page");
+$priv_list['page-system-firmware-settings']['descr'] = gettext("Allow access to the 'System: Firmware: Settings' page.");
+$priv_list['page-system-firmware-settings']['match'] = array();
+$priv_list['page-system-firmware-settings']['match'][] = "system_firmware_settings.php*";
+
+$priv_list['page-system-gatewaygroups'] = array();
+$priv_list['page-system-gatewaygroups']['name'] = gettext("WebCfg - System: Gateway Groups page");
+$priv_list['page-system-gatewaygroups']['descr'] = gettext("Allow access to the 'System: Gateway Groups' page.");
+$priv_list['page-system-gatewaygroups']['match'] = array();
+$priv_list['page-system-gatewaygroups']['match'][] = "system_gateway_groups.php*";
+
+$priv_list['page-system-gateways-editgatewaygroups'] = array();
+$priv_list['page-system-gateways-editgatewaygroups']['name'] = gettext("WebCfg - System: Gateways: Edit Gateway Groups page");
+$priv_list['page-system-gateways-editgatewaygroups']['descr'] = gettext("Allow access to the 'System: Gateways: Edit Gateway Groups' page.");
+$priv_list['page-system-gateways-editgatewaygroups']['match'] = array();
+$priv_list['page-system-gateways-editgatewaygroups']['match'][] = "system_gateway_groups_edit.php*";
+
+$priv_list['page-system-gateways'] = array();
+$priv_list['page-system-gateways']['name'] = gettext("WebCfg - System: Gateways page");
+$priv_list['page-system-gateways']['descr'] = gettext("Allow access to the 'System: Gateways' page.");
+$priv_list['page-system-gateways']['match'] = array();
+$priv_list['page-system-gateways']['match'][] = "system_gateways.php*";
+
+$priv_list['page-system-gateways-editgateway'] = array();
+$priv_list['page-system-gateways-editgateway']['name'] = gettext("WebCfg - System: Gateways: Edit Gateway page");
+$priv_list['page-system-gateways-editgateway']['descr'] = gettext("Allow access to the 'System: Gateways: Edit Gateway' page.");
+$priv_list['page-system-gateways-editgateway']['match'] = array();
+$priv_list['page-system-gateways-editgateway']['match'][] = "system_gateways_edit.php*";
+
+$priv_list['page-system-groupmanager'] = array();
+$priv_list['page-system-groupmanager']['name'] = gettext("WebCfg - System: Group manager page");
+$priv_list['page-system-groupmanager']['descr'] = gettext("Allow access to the 'System: Group manager' page.");
+$priv_list['page-system-groupmanager']['match'] = array();
+$priv_list['page-system-groupmanager']['match'][] = "system_groupmanager.php*";
+
+$priv_list['page-system-groupmanager-addprivs'] = array();
+$priv_list['page-system-groupmanager-addprivs']['name'] = gettext("WebCfg - System: Group Manager: Add Privileges page");
+$priv_list['page-system-groupmanager-addprivs']['descr'] = gettext("Allow access to the 'System: Group Manager: Add Privileges' page.");
+$priv_list['page-system-groupmanager-addprivs']['match'] = array();
+$priv_list['page-system-groupmanager-addprivs']['match'][] = "system_groupmanager_addprivs.php*";
+
+$priv_list['page-system-hasync'] = array();
+$priv_list['page-system-hasync']['name'] = gettext("Webcfg - System: High Availability Sync");
+$priv_list['page-system-hasync']['descr'] = gettext("Allow access to the 'System: High Availability Sync' page.");
+$priv_list['page-system-hasync']['match'] = array();
+$priv_list['page-system-hasync']['match'][] = "system_hasync.php*";
+
+$priv_list['page-system-staticroutes'] = array();
+$priv_list['page-system-staticroutes']['name'] = gettext("WebCfg - System: Static Routes page");
+$priv_list['page-system-staticroutes']['descr'] = gettext("Allow access to the 'System: Static Routes' page.");
+$priv_list['page-system-staticroutes']['match'] = array();
+$priv_list['page-system-staticroutes']['match'][] = "system_routes.php*";
+
+$priv_list['page-system-staticroutes-editroute'] = array();
+$priv_list['page-system-staticroutes-editroute']['name'] = gettext("WebCfg - System: Static Routes: Edit route page");
+$priv_list['page-system-staticroutes-editroute']['descr'] = gettext("Allow access to the 'System: Static Routes: Edit route' page.");
+$priv_list['page-system-staticroutes-editroute']['match'] = array();
+$priv_list['page-system-staticroutes-editroute']['match'][] = "system_routes_edit.php*";
+
+$priv_list['page-system-usermanager'] = array();
+$priv_list['page-system-usermanager']['name'] = gettext("WebCfg - System: User Manager page");
+$priv_list['page-system-usermanager']['descr'] = gettext("Allow access to the 'System: User Manager' page.");
+$priv_list['page-system-usermanager']['match'] = array();
+$priv_list['page-system-usermanager']['match'][] = "system_usermanager.php*";
+
+$priv_list['page-system-usermanager-addprivs'] = array();
+$priv_list['page-system-usermanager-addprivs']['name'] = gettext("WebCfg - System: User Manager: Add Privileges page");
+$priv_list['page-system-usermanager-addprivs']['descr'] = gettext("Allow access to the 'System: User Manager: Add Privileges' page.");
+$priv_list['page-system-usermanager-addprivs']['match'] = array();
+$priv_list['page-system-usermanager-addprivs']['match'][] = "system_usermanager_addprivs.php*";
+
+$priv_list['page-system-usermanager-passwordmg'] = array();
+$priv_list['page-system-usermanager-passwordmg']['name'] = gettext("WebCfg - System: User Password Manager page");
+$priv_list['page-system-usermanager-passwordmg']['descr'] = gettext("Allow access to the 'System: User Password Manager' page.");
+$priv_list['page-system-usermanager-passwordmg']['match'] = array();
+$priv_list['page-system-usermanager-passwordmg']['match'][] = "system_usermanager_passwordmg.php*";
+
+$priv_list['page-system-usermanager-settings'] = array();
+$priv_list['page-system-usermanager-settings']['name'] = gettext("WebCfg - System: User Manager: settings page");
+$priv_list['page-system-usermanager-settings']['descr'] = gettext("Allow access to the 'System: User Manager: settings' page.");
+$priv_list['page-system-usermanager-settings']['match'] = array();
+$priv_list['page-system-usermanager-settings']['match'][] = "system_usermanager_settings.php*";
+
+$priv_list['page-system-usermanager-settings-testldap'] = array();
+$priv_list['page-system-usermanager-settings-testldap']['name'] = gettext("WebCfg - System: User Manager: Settings: Test LDAP page");
+$priv_list['page-system-usermanager-settings-testldap']['descr'] = gettext("Allow access to the 'System: User Manager: Settings: Test LDAP' page.");
+$priv_list['page-system-usermanager-settings-testldap']['match'] = array();
+$priv_list['page-system-usermanager-settings-testldap']['match'][] = "system_usermanager_settings_test.php*";
+
+$priv_list['page-upload_progress'] = array();
+$priv_list['page-upload_progress']['name'] = gettext("WebCfg - System: Firmware: Manual Update page (progress bar)");
+$priv_list['page-upload_progress']['descr'] = gettext("Allow access to the 'System: Firmware: Manual Update: Progress bar' page.");
+$priv_list['page-upload_progress']['match'] = array();
+$priv_list['page-upload_progress']['match'][] = "upload_progress*";
+
+$priv_list['page-hidden-uploadconfiguration'] = array();
+$priv_list['page-hidden-uploadconfiguration']['name'] = gettext("WebCfg - Hidden: Upload Configuration page");
+$priv_list['page-hidden-uploadconfiguration']['descr'] = gettext("Allow access to the 'Hidden: Upload Configuration' page.");
+$priv_list['page-hidden-uploadconfiguration']['match'] = array();
+$priv_list['page-hidden-uploadconfiguration']['match'][] = "uploadconfig.php*";
+
+$priv_list['page-vpn-ipsec'] = array();
+$priv_list['page-vpn-ipsec']['name'] = gettext("WebCfg - VPN: IPsec page");
+$priv_list['page-vpn-ipsec']['descr'] = gettext("Allow access to the 'VPN: IPsec' page.");
+$priv_list['page-vpn-ipsec']['match'] = array();
+$priv_list['page-vpn-ipsec']['match'][] = "vpn_ipsec.php*";
+
+$priv_list['page-vpn-ipsec-listkeys'] = array();
+$priv_list['page-vpn-ipsec-listkeys']['name'] = gettext("WebCfg - VPN: IPsec: Pre-Shared Keys List");
+$priv_list['page-vpn-ipsec-listkeys']['descr'] = gettext("Allow access to the 'VPN: IPsec: Pre-Shared Keys List' page.");
+$priv_list['page-vpn-ipsec-listkeys']['match'] = array();
+$priv_list['page-vpn-ipsec-listkeys']['match'][] = "vpn_ipsec_keys.php*";
+
+$priv_list['page-vpn-ipsec-editkeys'] = array();
+$priv_list['page-vpn-ipsec-editkeys']['name'] = gettext("WebCfg - VPN: IPsec: Edit Pre-Shared Keys");
+$priv_list['page-vpn-ipsec-editkeys']['descr'] = gettext("Allow access to the 'VPN: IPsec: Edit Pre-Shared Keys' page.");
+$priv_list['page-vpn-ipsec-editkeys']['match'] = array();
+$priv_list['page-vpn-ipsec-editkeys']['match'][] = "vpn_ipsec_keys_edit.php*";
+
+$priv_list['page-vpn-ipsec-mobile'] = array();
+$priv_list['page-vpn-ipsec-mobile']['name'] = gettext("WebCfg - VPN: IPsec: Mobile page");
+$priv_list['page-vpn-ipsec-mobile']['descr'] = gettext("Allow access to the 'VPN: IPsec: Mobile' page.");
+$priv_list['page-vpn-ipsec-mobile']['match'] = array();
+$priv_list['page-vpn-ipsec-mobile']['match'][] = "vpn_ipsec_mobile.php*";
+
+$priv_list['page-vpn-ipsec-editphase1'] = array();
+$priv_list['page-vpn-ipsec-editphase1']['name'] = gettext("WebCfg - VPN: IPsec: Edit Phase 1 page");
+$priv_list['page-vpn-ipsec-editphase1']['descr'] = gettext("Allow access to the 'VPN: IPsec: Edit Phase 1' page.");
+$priv_list['page-vpn-ipsec-editphase1']['match'] = array();
+$priv_list['page-vpn-ipsec-editphase1']['match'][] = "vpn_ipsec_phase1.php*";
+
+$priv_list['page-vpn-ipsec-editphase2'] = array();
+$priv_list['page-vpn-ipsec-editphase2']['name'] = gettext("WebCfg - VPN: IPsec: Edit Phase 2 page");
+$priv_list['page-vpn-ipsec-editphase2']['descr'] = gettext("Allow access to the 'VPN: IPsec: Edit Phase 2' page.");
+$priv_list['page-vpn-ipsec-editphase2']['match'] = array();
+$priv_list['page-vpn-ipsec-editphase2']['match'][] = "vpn_ipsec_phase2.php*";
+
+$priv_list['page-vpn-vpnl2tp'] = array();
+$priv_list['page-vpn-vpnl2tp']['name'] = gettext("WebCfg - VPN: VPN L2TP page");
+$priv_list['page-vpn-vpnl2tp']['descr'] = gettext("Allow access to the 'VPN: VPN L2TP' page.");
+$priv_list['page-vpn-vpnl2tp']['match'] = array();
+$priv_list['page-vpn-vpnl2tp']['match'][] = "vpn_l2tp.php*";
+
+$priv_list['page-vpn-vpnl2tp-users'] = array();
+$priv_list['page-vpn-vpnl2tp-users']['name'] = gettext("WebCfg - VPN: VPN L2TP : Users page");
+$priv_list['page-vpn-vpnl2tp-users']['descr'] = gettext("Allow access to the 'VPN: VPN L2TP : Users' page.");
+$priv_list['page-vpn-vpnl2tp-users']['match'] = array();
+$priv_list['page-vpn-vpnl2tp-users']['match'][] = "vpn_l2tp_users.php*";
+
+$priv_list['page-vpn-vpnl2tp-users-edit'] = array();
+$priv_list['page-vpn-vpnl2tp-users-edit']['name'] = gettext("WebCfg - VPN: VPN L2TP : Users : Edit page");
+$priv_list['page-vpn-vpnl2tp-users-edit']['descr'] = gettext("Allow access to the 'VPN: VPN L2TP : Users : Edit' page.");
+$priv_list['page-vpn-vpnl2tp-users-edit']['match'] = array();
+$priv_list['page-vpn-vpnl2tp-users-edit']['match'][] = "vpn_l2tp_users_edit.php*";
+
+$priv_list['page-openvpn-client'] = array();
+$priv_list['page-openvpn-client']['name'] = gettext("WebCfg - OpenVPN: Client page");
+$priv_list['page-openvpn-client']['descr'] = gettext("Allow access to the 'OpenVPN: Client' page.");
+$priv_list['page-openvpn-client']['match'] = array();
+$priv_list['page-openvpn-client']['match'][] = "vpn_openvpn_client.php*";
+
+$priv_list['page-openvpn-csc'] = array();
+$priv_list['page-openvpn-csc']['name'] = gettext("WebCfg - OpenVPN: Client Specific Override page");
+$priv_list['page-openvpn-csc']['descr'] = gettext("Allow access to the 'OpenVPN: Client Specific Override' page.");
+$priv_list['page-openvpn-csc']['match'] = array();
+$priv_list['page-openvpn-csc']['match'][] = "vpn_openvpn_csc.php*";
+
+$priv_list['page-openvpn-server'] = array();
+$priv_list['page-openvpn-server']['name'] = gettext("WebCfg - OpenVPN: Server page");
+$priv_list['page-openvpn-server']['descr'] = gettext("Allow access to the 'OpenVPN: Server' page.");
+$priv_list['page-openvpn-server']['match'] = array();
+$priv_list['page-openvpn-server']['match'][] = "vpn_openvpn_server.php*";
+
+$priv_list['page-services-pppoeserver'] = array();
+$priv_list['page-services-pppoeserver']['name'] = gettext("WebCfg - Services: PPPoE Server page");
+$priv_list['page-services-pppoeserver']['descr'] = gettext("Allow access to the 'Services: PPPoE Server' page.");
+$priv_list['page-services-pppoeserver']['match'] = array();
+$priv_list['page-services-pppoeserver']['match'][] = "vpn_pppoe.php*";
+
+$priv_list['page-services-pppoeserver-edit'] = array();
+$priv_list['page-services-pppoeserver-edit']['name'] = gettext("WebCfg - Services: PPPoE Server: Edit page");
+$priv_list['page-services-pppoeserver-edit']['descr'] = gettext("Allow access to the 'Services: PPPoE Server: Edit' page.");
+$priv_list['page-services-pppoeserver-edit']['match'] = array();
+$priv_list['page-services-pppoeserver-edit']['match'][] = "vpn_pppoe_edit.php*";
+
+$priv_list['page-vpn-vpnpptp'] = array();
+$priv_list['page-vpn-vpnpptp']['name'] = gettext("WebCfg - VPN: VPN PPTP page");
+$priv_list['page-vpn-vpnpptp']['descr'] = gettext("Allow access to the 'VPN: VPN PPTP' page.");
+$priv_list['page-vpn-vpnpptp']['match'] = array();
+$priv_list['page-vpn-vpnpptp']['match'][] = "vpn_pptp.php*";
+
+$priv_list['page-vpn-vpnpptp-users'] = array();
+$priv_list['page-vpn-vpnpptp-users']['name'] = gettext("WebCfg - VPN: VPN PPTP: Users page");
+$priv_list['page-vpn-vpnpptp-users']['descr'] = gettext("Allow access to the 'VPN: VPN PPTP: Users' page.");
+$priv_list['page-vpn-vpnpptp-users']['match'] = array();
+$priv_list['page-vpn-vpnpptp-users']['match'][] = "vpn_pptp_users.php*";
+
+$priv_list['page-vpn-vpnpptp-user-edit'] = array();
+$priv_list['page-vpn-vpnpptp-user-edit']['name'] = gettext("WebCfg - VPN: VPN PPTP: User: Edit page");
+$priv_list['page-vpn-vpnpptp-user-edit']['descr'] = gettext("Allow access to the 'VPN: VPN PPTP: User: Edit' page.");
+$priv_list['page-vpn-vpnpptp-user-edit']['match'] = array();
+$priv_list['page-vpn-vpnpptp-user-edit']['match'][] = "vpn_pptp_users_edit.php*";
+
+$priv_list['page-pfsensewizardsubsystem'] = array();
+$priv_list['page-pfsensewizardsubsystem']['name'] = gettext("WebCfg - pfSense wizard subsystem page");
+$priv_list['page-pfsensewizardsubsystem']['descr'] = gettext("Allow access to the 'pfSense wizard subsystem' page.");
+$priv_list['page-pfsensewizardsubsystem']['match'] = array();
+$priv_list['page-pfsensewizardsubsystem']['match'][] = "wizard.php*";
+
+$priv_list['page-xmlrpclibrary'] = array();
+$priv_list['page-xmlrpclibrary']['name'] = gettext("WebCfg - XMLRPC Library page");
+$priv_list['page-xmlrpclibrary']['descr'] = gettext("Allow access to the 'XMLRPC Library' page.");
+$priv_list['page-xmlrpclibrary']['match'] = array();
+$priv_list['page-xmlrpclibrary']['match'][] = "xmlrpc.php*";
+
+$priv_list['page-firewall-easyrule'] = array();
+$priv_list['page-firewall-easyrule']['name'] = gettext("WebCfg - Firewall: Easy Rule add/status page");
+$priv_list['page-firewall-easyrule']['descr'] = gettext("Allow access to the 'Firewall: Easy Rule' add/status page.");
+$priv_list['page-firewall-easyrule']['match'] = array();
+$priv_list['page-firewall-easyrule']['match'][] = "easyrule.php*";
+
+$priv_rmvd = array();
+
+?>
diff --git a/src/etc/inc/priv.inc b/src/etc/inc/priv.inc
new file mode 100644
index 0000000..851643b
--- /dev/null
+++ b/src/etc/inc/priv.inc
@@ -0,0 +1,337 @@
+<?php
+/* $Id$ */
+/*
+ priv.inc
+ Copyright (C) 2008 Shrew Soft Inc
+ All rights reserved.
+
+ Copyright (C) 2007, 2008 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Copyright (C) 2005-2006 Bill Marquette <bill.marquette@gmail.com>
+ All rights reserved.
+
+ Copyright (C) 2006 Paul Taylor <paultaylor@winn-dixie.com>.
+ All rights reserved.
+
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/*
+ pfSense_MODULE: auth
+*/
+
+require_once("priv.defs.inc");
+
+/* Load and process custom privs. */
+function get_priv_files($directory) {
+ $dir_array = array();
+ if (!is_dir($directory)) {
+ return;
+ }
+ if ($dh = opendir($directory)) {
+ while (($file = readdir($dh)) !== false) {
+ $canadd = 0;
+ if ($file == ".") {
+ $canadd = 1;
+ }
+ if ($file == "..") {
+ $canadd = 1;
+ }
+ if ($canadd == 0) {
+ array_push($dir_array, $file);
+ }
+ }
+ closedir($dh);
+ }
+ if (!is_array($dir_array)) {
+ return;
+ }
+ return $dir_array;
+}
+
+// Load and sort privs
+$dir_array = get_priv_files("/etc/inc/priv");
+foreach ($dir_array as $file) {
+ if (!is_dir("/etc/inc/priv/{$file}") && stristr($file, ".inc")) {
+ include("/etc/inc/priv/{$file}");
+ }
+}
+if (is_dir("/usr/local/pkg/priv")) {
+ $dir_array = get_priv_files("/usr/local/pkg/priv");
+ foreach ($dir_array as $file) {
+ if (!is_dir("/usr/local/pkg/priv/{$file}") && stristr($file, ".inc")) {
+ include("/usr/local/pkg/priv/{$file}");
+ }
+ }
+}
+
+if (is_array($priv_list)) {
+ sort_privs($priv_list);
+}
+
+function cmp_privkeys($a, $b) {
+ /* user privs at the top */
+ $auser = strncmp("user-", $a, 5);
+ $buser = strncmp("user-", $b, 5);
+ if ($auser != $buser) {
+ return $auser - $buser;
+ }
+
+ /* name compare others */
+ return strcasecmp($a, $b);
+}
+
+function sort_privs(& $privs) {
+ uksort($privs, "cmp_privkeys");
+}
+
+function cmp_page_matches($page, & $matches, $fullwc = true) {
+
+// $dbg_matches = implode(",", $matches);
+// log_error("debug: checking page {$page} match with {$dbg_matches}");
+
+ if (!is_array($matches)) {
+ return false;
+ }
+
+ /* skip any leading fwdslash */
+ $test = strpos($page, "/");
+ if ($test !== false && $test == 0) {
+ $page = substr($page, 1);
+ }
+
+ /* look for a match */
+ foreach ($matches as $match) {
+
+ /* possibly ignore full wildcard match */
+ if (!$fullwc && !strcmp($match , "*")) {
+ continue;
+ }
+
+ /* compare exact or wildcard match */
+ $match = str_replace(array(".", "*", "?"), array("\.", ".*", "\?"), $match);
+ $result = preg_match("@^/{$match}$@", "/{$page}");
+
+ if ($result) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function map_page_privname($page) {
+ global $priv_list;
+
+ foreach ($priv_list as $pname => $pdata) {
+ if (strncmp($pname, "page-", 5)) {
+ continue;
+ }
+ $fullwc = false;
+ if (!strcasecmp($page, "any")||!strcmp($page, "*")) {
+ $fullwc = true;
+ }
+ if (cmp_page_matches($page, $pdata['match'], $fullwc)) {
+ return $pname;
+ }
+ }
+
+ return false;
+}
+
+function get_user_privdesc(& $user) {
+ global $priv_list;
+
+ $privs = array();
+
+ $user_privs = $user['priv'];
+ if (!is_array($user_privs)) {
+ $user_privs = array();
+ }
+
+ $names = local_user_get_groups($user, true);
+
+ foreach ($names as $name) {
+ $group = getGroupEntry($name);
+ $group_privs = $group['priv'];
+ if (!is_array($group_privs)) {
+ continue;
+ }
+ foreach ($group_privs as $pname) {
+ if (in_array($pname, $user_privs)) {
+ continue;
+ }
+ if (!$priv_list[$pname]) {
+ continue;
+ }
+ $priv = $priv_list[$pname];
+ $priv['group'] = $group['name'];
+ $privs[] = $priv;
+ }
+ }
+
+ foreach ($user_privs as $pname) {
+ if ($priv_list[$pname]) {
+ $privs[] = $priv_list[$pname];
+ }
+ }
+
+ return $privs;
+}
+
+function isAllowed($username, $page) {
+ global $_SESSION;
+
+ if (!isset($username)) {
+ return false;
+ }
+
+ /* admin/root access check */
+ $user = getUserEntry($username);
+ if (isset($user)) {
+ if (isset($user['uid'])) {
+ if ($user['uid'] == 0) {
+ return true;
+ }
+ }
+ }
+
+ /* user privilege access check */
+ if (cmp_page_matches($page, $_SESSION['page-match'])) {
+ return true;
+ }
+
+ return false;
+}
+
+
+function isAllowedPage($page) {
+ global $_SESSION;
+
+
+ $username = $_SESSION['Username'];
+
+ if (!isset($username)) {
+ return false;
+ }
+
+ /* admin/root access check */
+ $user = getUserEntry($username);
+ if (isset($user)) {
+ if (isset($user['uid'])) {
+ if ($user['uid'] == 0) {
+ return true;
+ }
+ }
+ }
+
+ /* user privilege access check */
+ return cmp_page_matches($page, $_SESSION['page-match']);
+}
+
+function getPrivPages(& $entry, & $allowed_pages) {
+ global $priv_list;
+
+ if (!is_array($entry['priv'])) {
+ return;
+ }
+
+ foreach ($entry['priv'] as $pname) {
+ if (strncmp($pname, "page-", 5)) {
+ continue;
+ }
+ $priv = &$priv_list[$pname];
+ if (!is_array($priv)) {
+ continue;
+ }
+ $matches = &$priv['match'];
+ if (!is_array($matches)) {
+ continue;
+ }
+ foreach ($matches as $match) {
+ $allowed_pages[] = $match;
+ }
+ }
+}
+
+function getAllowedPages($username, &$attributes = array()) {
+ global $config, $_SESSION;
+
+ if (!function_exists("ldap_connect")) {
+ return;
+ }
+
+ $allowed_pages = array();
+ $allowed_groups = array();
+
+ $authcfg = auth_get_authserver($config['system']['webgui']['authmode']);
+ // obtain ldap groups if we are in ldap mode
+ if ($authcfg['type'] == "ldap") {
+ $allowed_groups = @ldap_get_groups($username, $authcfg);
+ } elseif ($authcfg['type'] == "radius") {
+ $allowed_groups = @radius_get_groups($attributes);
+ }
+ if (!$allowed_groups) {
+ // search for a local user by name
+ $local_user = getUserEntry($username);
+
+ // obtain local user pages and groups if we have a local user
+ if ($local_user) {
+ getPrivPages($local_user, $allowed_pages);
+ $allowed_groups = local_user_get_groups($local_user);
+ }
+ }
+
+ // build a list of allowed pages
+ if (is_array($config['system']['group']) && is_array($allowed_groups)) {
+ foreach ($config['system']['group'] as $group) {
+ if (in_array($group['name'], $allowed_groups)) {
+ getPrivPages($group, $allowed_pages);
+ }
+ }
+ }
+
+// $dbg_pages = implode(",", $allowed_pages);
+// $dbg_groups = implode(",", $allowed_groups);
+// log_error("debug: user {$username} groups = {$dbg_groups}");
+// log_error("debug: user {$username} pages = {$dbg_pages}");
+
+ $_SESSION['page-match'] = $allowed_pages;
+
+ return $allowed_pages;
+}
+
+function sort_user_privs($privs) {
+ // Privileges to place first, to redirect properly.
+ $priority_privs = array("page-dashboard-all", "page-system-login/logout");
+
+ $fprivs = array_intersect($privs, $priority_privs);
+ $sprivs = array_diff($privs, $priority_privs);
+
+ return array_merge($fprivs, $sprivs);
+}
+?>
diff --git a/src/etc/inc/priv/user.priv.inc b/src/etc/inc/priv/user.priv.inc
new file mode 100644
index 0000000..6414008
--- /dev/null
+++ b/src/etc/inc/priv/user.priv.inc
@@ -0,0 +1,74 @@
+<?php
+
+global $priv_list;
+
+$priv_list['user-services-captiveportal-login'] = array();
+$priv_list['user-services-captiveportal-login']['name'] = gettext("User - Services - Captive portal login");
+$priv_list['user-services-captiveportal-login']['descr'] = gettext("Indicates whether the user is able to login on the captive portal.");
+
+$priv_list['page-help-all'] = array();
+$priv_list['page-help-all']['name'] = "WebCfg - Help pages";
+$priv_list['page-help-all']['descr'] = "Show all items on help menu";
+$priv_list['page-help-all']['match'] = array();
+$priv_list['page-help-all']['match'][] = "*help.php";
+
+$priv_list['page-dashboard-all'] = array();
+$priv_list['page-dashboard-all']['name'] = "WebCfg - Dashboard (all)";
+$priv_list['page-dashboard-all']['descr'] = "Allow access to all pages required for the dashboard.";
+$priv_list['page-dashboard-all']['match'] = array();
+$priv_list['page-dashboard-all']['match'][] = "index.php*";
+$priv_list['page-dashboard-all']['match'][] = "*.widget.php*";
+$priv_list['page-dashboard-all']['match'][] = "graph.php*";
+$priv_list['page-dashboard-all']['match'][] = "graph_cpu.php*";
+$priv_list['page-dashboard-all']['match'][] = "getstats.php*";
+$priv_list['page-dashboard-all']['match'][] = "ifstats.php*";
+$priv_list['page-dashboard-all']['match'][] = "diag_logs_filter_dynamic.php*";
+
+$priv_list['page-dashboard-widgets'] = array();
+$priv_list['page-dashboard-widgets']['name'] = "WebCfg - Dashboard widgets (direct access).";
+$priv_list['page-dashboard-widgets']['descr'] = "Allow direct access to all Dashboard widget pages, required for some widgets using AJAX.";
+$priv_list['page-dashboard-widgets']['match'] = array();
+$priv_list['page-dashboard-widgets']['match'][] = "*.widget.php*";
+
+$priv_list['user-config-readonly'] = array();
+$priv_list['user-config-readonly']['name'] = "User - Config - Deny Config Write";
+$priv_list['user-config-readonly']['descr'] = "If present, ignores requests from this user to write config.xml.";
+
+$priv_list['user-shell-access'] = array();
+$priv_list['user-shell-access']['name'] = "User - System - Shell account access";
+$priv_list['user-shell-access']['descr'] = "Indicates whether the user is able to login for ".
+ "example via SSH.";
+
+$priv_list['user-copy-files'] = array();
+$priv_list['user-copy-files']['name'] = "User - System - Copy files";
+$priv_list['user-copy-files']['descr'] = "Indicates whether the user is allowed to copy files ".
+ "onto the {$g['product_name']} appliance via SCP/SFTP. ".
+ "If you are going to use this privilege, you must install ".
+ "scponly on the appliance (Hint: pkg_add -r scponly).";
+
+$priv_list['user-ssh-tunnel'] = array();
+$priv_list['user-ssh-tunnel']['name'] = "User - System - SSH tunneling";
+$priv_list['user-ssh-tunnel']['descr'] = "Indicates whether the user is able to login for ".
+ "tunneling via SSH when they have no shell access. ".
+ "Note: User - System - Copy files conflicts with ".
+ "this privilege.";
+
+$priv_list['user-ipsec-xauth-dialin'] = array();
+$priv_list['user-ipsec-xauth-dialin']['name'] = "User - VPN - IPsec xauth Dialin";
+$priv_list['user-ipsec-xauth-dialin']['descr'] = "Indicates whether the user is allowed to dial in via IPsec xauth ".
+ "(Note: Does not allow shell access, but may allow ".
+ "the user to create SSH tunnels)";
+
+$priv_list['user-l2tp-dialin'] = array();
+$priv_list['user-l2tp-dialin']['name'] = "User - VPN - L2TP Dialin";
+$priv_list['user-l2tp-dialin']['descr'] = "Indicates whether the user is allowed to dial in via L2TP";
+
+$priv_list['user-pptp-dialin'] = array();
+$priv_list['user-pptp-dialin']['name'] = "User - VPN - PPTP Dialin";
+$priv_list['user-pptp-dialin']['descr'] = "Indicates whether the user is allowed to dial in via PPTP";
+
+$priv_list['user-pppoe-dialin'] = array();
+$priv_list['user-pppoe-dialin']['name'] = "User - VPN - PPPOE Dialin";
+$priv_list['user-pppoe-dialin']['descr'] = "Indicates whether the user is allowed to dial in via PPPOE";
+
+?>
diff --git a/src/etc/inc/r53.class b/src/etc/inc/r53.class
new file mode 100644
index 0000000..89faa26
--- /dev/null
+++ b/src/etc/inc/r53.class
@@ -0,0 +1,754 @@
+<?php
+/**
+*
+* Copyright (c) 2011, Dan Myers.
+* Parts copyright (c) 2008, Donovan Schonknecht.
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistributions of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+* - Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*
+* This is a modified BSD license (the third clause has been removed).
+* The BSD license may be found here:
+* http://www.opensource.org/licenses/bsd-license.php
+*
+* Amazon Route 53 is a trademark of Amazon.com, Inc. or its affiliates.
+*
+* Route53 is based on Donovan Schonknecht's Amazon S3 PHP class, found here:
+* http://undesigned.org.za/2007/10/22/amazon-s3-php-class
+*
+*/
+
+/**
+* Amazon Route53 PHP class
+*
+* @link http://sourceforge.net/projects/php-r53/
+* version 0.9.0
+*
+*/
+class Route53
+{
+ const API_VERSION = '2010-10-01';
+
+ protected $__accessKey; // AWS Access key
+ protected $__secretKey; // AWS Secret key
+ protected $__host;
+
+ public function getAccessKey() { return $this->__accessKey; }
+ public function getSecretKey() { return $this->__secretKey; }
+ public function getHost() { return $this->__host; }
+
+ protected $__verifyHost = 1;
+ protected $__verifyPeer = 1;
+
+ // verifyHost and verifyPeer determine whether curl verifies ssl certificates.
+ // It may be necessary to disable these checks on certain systems.
+ // These only have an effect if SSL is enabled.
+ public function verifyHost() { return $this->__verifyHost; }
+ public function enableVerifyHost($enable = true) { $this->__verifyHost = $enable; }
+
+ public function verifyPeer() { return $this->__verifyPeer; }
+ public function enableVerifyPeer($enable = true) { $this->__verifyPeer = $enable; }
+
+ /**
+ * Constructor
+ *
+ * @param string $accessKey Access key
+ * @param string $secretKey Secret key
+ * @return void
+ */
+ public function __construct($accessKey = null, $secretKey = null, $host = 'route53.amazonaws.com') {
+ if ($accessKey !== null && $secretKey !== null) {
+ $this->setAuth($accessKey, $secretKey);
+ }
+ $this->__host = $host;
+ }
+
+ /**
+ * Set AWS access key and secret key
+ *
+ * @param string $accessKey Access key
+ * @param string $secretKey Secret key
+ * @return void
+ */
+ public function setAuth($accessKey, $secretKey) {
+ $this->__accessKey = $accessKey;
+ $this->__secretKey = $secretKey;
+ }
+
+ /**
+ * Lists the hosted zones on the account
+ *
+ * @param string marker A pagination marker returned by a previous truncated call
+ * @param int maxItems The maximum number of items per page. The service uses min($maxItems, 100).
+ * @return A list of hosted zones
+ */
+ public function listHostedZones($marker = null, $maxItems = 100) {
+ $rest = new Route53Request($this, 'hostedzone', 'GET');
+
+ if($marker !== null) {
+ $rest->setParameter('marker', $marker);
+ }
+ if($maxItems !== 100) {
+ $rest->setParameter('maxitems', $maxItems);
+ }
+
+ $rest = $rest->getResponse();
+ if($rest->error === false && $rest->code !== 200) {
+ $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
+ }
+ if($rest->error !== false) {
+ $this->__triggerError('listHostedZones', $rest->error);
+ return false;
+ }
+
+ $response = array();
+ if (!isset($rest->body))
+ {
+ return $response;
+ }
+
+ $zones = array();
+ foreach($rest->body->HostedZones->HostedZone as $z)
+ {
+ $zones[] = $this->parseHostedZone($z);
+ }
+ $response['HostedZone'] = $zones;
+
+ if(isset($rest->body->MaxItems)) {
+ $response['MaxItems'] = (string)$rest->body->MaxItems;
+ }
+
+ if(isset($rest->body->IsTruncated)) {
+ $response['IsTruncated'] = (string)$rest->body->IsTruncated;
+ if($response['IsTruncated'] == 'true') {
+ $response['NextMarker'] = (string)$rest->body->NextMarker;
+ }
+ }
+
+ return $response;
+ }
+
+ /**
+ * Retrieves information on a specified hosted zone
+ *
+ * @param string zoneId The id of the hosted zone, as returned by CreateHostedZoneResponse or ListHostedZoneResponse
+ * In other words, if ListHostedZoneResponse shows the zone's Id as '/hostedzone/Z1PA6795UKMFR9',
+ * then that full value should be passed here, including the '/hostedzone/' prefix.
+ * @return A data structure containing information about the specified zone
+ */
+ public function getHostedZone($zoneId) {
+ // we'll strip off the leading forward slash, so we can use it as the action directly.
+ $zoneId = trim($zoneId, '/');
+
+ $rest = new Route53Request($this, $zoneId, 'GET');
+
+ $rest = $rest->getResponse();
+ if($rest->error === false && $rest->code !== 200) {
+ $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
+ }
+ if($rest->error !== false) {
+ $this->__triggerError('getHostedZone', $rest->error);
+ return false;
+ }
+
+ $response = array();
+ if (!isset($rest->body))
+ {
+ return $response;
+ }
+
+ $response['HostedZone'] = $this->parseHostedZone($rest->body->HostedZone);
+ $response['NameServers'] = $this->parseDelegationSet($rest->body->DelegationSet);
+
+ return $response;
+ }
+
+ /**
+ * Creates a new hosted zone
+ *
+ * @param string name The name of the hosted zone (e.g. "example.com.")
+ * @param string reference A user-specified unique reference for this request
+ * @param string comment An optional user-specified comment to attach to the zone
+ * @return A data structure containing information about the newly created zone
+ */
+ public function createHostedZone($name, $reference, $comment = '') {
+ // hosted zone names must end with a period, but people will forget this a lot...
+ if(strrpos($name, '.') != (strlen($name) - 1)) {
+ $name .= '.';
+ }
+
+ $data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ $data .= '<CreateHostedZoneRequest xmlns="https://route53.amazonaws.com/doc/'.Route53::API_VERSION."/\">\n";
+ $data .= '<Name>'.$name."</Name>\n";
+ $data .= '<CallerReference>'.$reference."</CallerReference>\n";
+ if(strlen($comment) > 0) {
+ $data .= "<HostedZoneConfig>\n";
+ $data .= '<Comment>'.$comment."</Comment>\n";
+ $data .= "</HostedZoneConfig>\n";
+ }
+ $data .= "</CreateHostedZoneRequest>\n";
+
+ $rest = new Route53Request($this, 'hostedzone', 'POST', $data);
+
+ $rest = $rest->getResponse();
+
+ if($rest->error === false && !in_array($rest->code, array(200, 201, 202, 204)) ) {
+ $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
+ }
+ if($rest->error !== false) {
+ $this->__triggerError('createHostedZone', $rest->error);
+ return false;
+ }
+
+ $response = array();
+ if (!isset($rest->body))
+ {
+ return $response;
+ }
+
+ $response['HostedZone'] = $this->parseHostedZone($rest->body->HostedZone);
+ $response['ChangeInfo'] = $this->parseChangeInfo($rest->body->ChangeInfo);
+ $response['NameServers'] = $this->parseDelegationSet($rest->body->DelegationSet);
+
+ return $response;
+ }
+
+ /**
+ * Retrieves information on a specified hosted zone
+ *
+ * @param string zoneId The id of the hosted zone, as returned by CreateHostedZoneResponse or ListHostedZoneResponse
+ * In other words, if ListHostedZoneResponse shows the zone's Id as '/hostedzone/Z1PA6795UKMFR9',
+ * then that full value should be passed here, including the '/hostedzone/' prefix.
+ * @return The change request data corresponding to this delete
+ */
+ public function deleteHostedZone($zoneId) {
+ // we'll strip off the leading forward slash, so we can use it as the action directly.
+ $zoneId = trim($zoneId, '/');
+
+ $rest = new Route53Request($this, $zoneId, 'DELETE');
+
+ $rest = $rest->getResponse();
+ if($rest->error === false && $rest->code !== 200) {
+ $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
+ }
+ if($rest->error !== false) {
+ $this->__triggerError('deleteHostedZone', $rest->error);
+ return false;
+ }
+
+ if (!isset($rest->body))
+ {
+ return array();
+ }
+
+ return $this->parseChangeInfo($rest->body->ChangeInfo);
+ }
+
+ /**
+ * Retrieves a list of resource record sets for a given zone
+ *
+ * @param string zoneId The id of the hosted zone, as returned by CreateHostedZoneResponse or ListHostedZoneResponse
+ * In other words, if ListHostedZoneResponse shows the zone's Id as '/hostedzone/Z1PA6795UKMFR9',
+ * then that full value should be passed here, including the '/hostedzone/' prefix.
+ * @param string type The type of resource record set to begin listing from. If this is specified, $name must also be specified.
+ * Must be one of: A, AAAA, CNAME, MX, NS, PTR, SOA, SPF, SRV, TXT
+ * @param string name The name at which to begin listing resource records (in the lexographic order of records).
+ * @param int maxItems The maximum number of results to return. The service uses min($maxItems, 100).
+ * @return The list of matching resource record sets
+ */
+ public function listResourceRecordSets($zoneId, $type = '', $name = '', $maxItems = 100) {
+ // we'll strip off the leading forward slash, so we can use it as the action directly.
+ $zoneId = trim($zoneId, '/');
+
+ $rest = new Route53Request($this, $zoneId.'/rrset', 'GET');
+
+ if(strlen($type) > 0) {
+ $rest->setParameter('type', $type);
+ }
+ if(strlen($name) > 0) {
+ $rest->setParameter('name', $name);
+ }
+ if($maxItems != 100) {
+ $rest->setParameter('maxitems', $maxItems);
+ }
+
+ $rest = $rest->getResponse();
+ if($rest->error === false && $rest->code !== 200) {
+ $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
+ }
+ if($rest->error !== false) {
+ $this->__triggerError('listResourceRecordSets', $rest->error);
+ return false;
+ }
+
+ $response = array();
+ if (!isset($rest->body))
+ {
+ return $response;
+ }
+
+ $recordSets = array();
+ foreach($rest->body->ResourceRecordSets->ResourceRecordSet as $set) {
+ $recordSets[] = $this->parseResourceRecordSet($set);
+ }
+
+ $response['ResourceRecordSets'] = $recordSets;
+
+ if(isset($rest->body->MaxItems)) {
+ $response['MaxItems'] = (string)$rest->body->MaxItems;
+ }
+
+ if(isset($rest->body->IsTruncated)) {
+ $response['IsTruncated'] = (string)$rest->body->IsTruncated;
+ if($response['IsTruncated'] == 'true') {
+ $response['NextRecordName'] = (string)$rest->body->NextRecordName;
+ $response['NextRecordType'] = (string)$rest->body->NextRecordType;
+ }
+ }
+
+ return $response;
+ }
+
+ /**
+ * Makes the specified resource record set changes (create or delete).
+ *
+ * @param string zoneId The id of the hosted zone, as returned by CreateHostedZoneResponse or ListHostedZoneResponse
+ * In other words, if ListHostedZoneResponse shows the zone's Id as '/hostedzone/Z1PA6795UKMFR9',
+ * then that full value should be passed here, including the '/hostedzone/' prefix.
+ * @param array changes An array of change objects, as they are returned by the prepareChange utility method.
+ * You may also pass a single change object.
+ * @param string comment An optional comment to attach to the change request
+ * @return The status of the change request
+ */
+ public function changeResourceRecordSets($zoneId, $changes, $comment = '') {
+ // we'll strip off the leading forward slash, so we can use it as the action directly.
+ $zoneId = trim($zoneId, '/');
+
+ $data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ $data .= '<ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/'.Route53::API_VERSION."/\">\n";
+ $data .= "<ChangeBatch>\n";
+
+ if(strlen($comment) > 0) {
+ $data .= '<Comment>'.$comment."</Comment>\n";
+ }
+
+ if(!is_array($changes)) {
+ $changes = array($changes);
+ }
+
+ $data .= "<Changes>\n";
+ foreach($changes as $change) {
+ $data .= $change;
+ }
+ $data .= "</Changes>\n";
+
+ $data .= "</ChangeBatch>\n";
+ $data .= "</ChangeResourceRecordSetsRequest>\n";
+
+ $rest = new Route53Request($this, $zoneId.'/rrset', 'POST', $data);
+
+ $rest = $rest->getResponse();
+ if($rest->error === false && !in_array($rest->code, array(200, 201, 202, 204))) {
+ $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
+ }
+ if($rest->error !== false) {
+ $this->__triggerError('changeResourceRecordSets', $rest->error);
+ return false;
+ }
+
+ if (!isset($rest->body))
+ {
+ return array();
+ }
+
+ return $this->parseChangeInfo($rest->body->ChangeInfo);
+ }
+
+ /**
+ * Retrieves information on a specified change request
+ *
+ * @param string changeId The id of the change, as returned by CreateHostedZoneResponse or ChangeResourceRecordSets
+ * In other words, if CreateHostedZoneResponse showed the change's Id as '/change/C2682N5HXP0BZ4',
+ * then that full value should be passed here, including the '/change/' prefix.
+ * @return The status of the change request
+ */
+ public function getChange($changeId) {
+ // we'll strip off the leading forward slash, so we can use it as the action directly.
+ $zoneId = trim($changeId, '/');
+
+ $rest = new Route53Request($this, $changeId, 'GET');
+
+ $rest = $rest->getResponse();
+ if($rest->error === false && $rest->code !== 200) {
+ $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
+ }
+ if($rest->error !== false) {
+ $this->__triggerError('getChange', $rest->error);
+ return false;
+ }
+
+ if (!isset($rest->body))
+ {
+ return array();
+ }
+
+ return $this->parseChangeInfo($rest->body->ChangeInfo);
+ }
+
+
+
+ /**
+ * Utility function to parse a HostedZone tag structure
+ */
+ private function parseHostedZone($tag) {
+ $zone = array();
+ $zone['Id'] = (string)$tag->Id;
+ $zone['Name'] = (string)$tag->Name;
+ $zone['CallerReference'] = (string)$tag->CallerReference;
+
+ // these might always be set, but check just in case, since
+ // their values are option on CreateHostedZone requests
+ if(isset($tag->Config) && isset($tag->Config->Comment)) {
+ $zone['Config'] = array('Comment' => (string)$tag->Config->Comment);
+ }
+
+ return $zone;
+ }
+
+ /**
+ * Utility function to parse a ChangeInfo tag structure
+ */
+ private function parseChangeInfo($tag) {
+ $info = array();
+ $info['Id'] = (string)$tag->Id;
+ $info['Status'] = (string)$tag->Status;
+ $info['SubmittedAt'] = (string)$tag->SubmittedAt;
+ return $info;
+ }
+
+ /**
+ * Utility function to parse a DelegationSet tag structure
+ */
+ private function parseDelegationSet($tag) {
+ $servers = array();
+ foreach($tag->NameServers->NameServer as $ns) {
+ $servers[] = (string)$ns;
+ }
+ return $servers;
+ }
+
+ /**
+ * Utility function to parse a ResourceRecordSet tag structure
+ */
+ private function parseResourceRecordSet($tag) {
+ $rrs = array();
+ $rrs['Name'] = (string)$tag->Name;
+ $rrs['Type'] = (string)$tag->Type;
+ $rrs['TTL'] = (string)$tag->TTL;
+ $rrs['ResourceRecords'] = array();
+ foreach($tag->ResourceRecords->ResourceRecord as $rr) {
+ $rrs['ResourceRecords'][] = (string)$rr->Value;
+ }
+ return $rrs;
+ }
+
+ /**
+ * Utility function to prepare a Change object for ChangeResourceRecordSets requests.
+ * All fields are required.
+ *
+ * @param string action The action to perform. One of: CREATE, DELETE
+ * @param string name The name to perform the action on.
+ * If it does not end with '.', then AWS treats the name as relative to the zone root.
+ * @param string type The type of record being modified.
+ * Must be one of: A, AAAA, CNAME, MX, NS, PTR, SOA, SPF, SRV, TXT
+ * @param int ttl The time-to-live value for this record, in seconds.
+ * @param array records An array of resource records to attach to this change.
+ * Each member of this array can either be a string, or an array of strings.
+ * Passing an array of strings will attach multiple values to a single resource record.
+ * If a single string is passed as $records instead of an array,
+ * it will be treated as a single-member array.
+ * @return object An opaque object containing the change request.
+ * Do not write code that depends on the contents of this object, as it may change at any time.
+ */
+ public function prepareChange($action, $name, $type, $ttl, $records) {
+ $change = "<Change>\n";
+ $change .= '<Action>'.$action."</Action>\n";
+ $change .= "<ResourceRecordSet>\n";
+ $change .= '<Name>'.$name."</Name>\n";
+ $change .= '<Type>'.$type."</Type>\n";
+ $change .= '<TTL>'.$ttl."</TTL>\n";
+ $change .= "<ResourceRecords>\n";
+
+ if(!is_array($records)) {
+ $records = array($records);
+ }
+
+ foreach($records as $record) {
+ $change .= "<ResourceRecord>\n";
+ if(is_array($record)) {
+ foreach($record as $value) {
+ $change .= '<Value>'.$value."</Value>\n";
+ }
+ }
+ else {
+ $change .= '<Value>'.$record."</Value>\n";
+ }
+ $change .= "</ResourceRecord>\n";
+ }
+
+ $change .= "</ResourceRecords>\n";
+ $change .= "</ResourceRecordSet>\n";
+ $change .= "</Change>\n";
+
+ return $change;
+ }
+
+ /**
+ * Trigger an error message
+ *
+ * @internal Used by member functions to output errors
+ * @param array $error Array containing error information
+ * @return string
+ */
+ public function __triggerError($functionname, $error)
+ {
+ if($error == false) {
+ trigger_error(sprintf("Route53::%s(): Encountered an error, but no description given", $functionname), E_USER_WARNING);
+ }
+ else if(isset($error['curl']) && $error['curl'])
+ {
+ trigger_error(sprintf("Route53::%s(): %s %s", $functionname, $error['code'], $error['message']), E_USER_WARNING);
+ }
+ else if(isset($error['Error']))
+ {
+ $e = $error['Error'];
+ $message = sprintf("Route53::%s(): %s - %s: %s\nRequest Id: %s\n", $functionname, $e['Type'], $e['Code'], $e['Message'], $error['RequestId']);
+ trigger_error($message, E_USER_WARNING);
+ }
+ }
+
+ /**
+ * Callback handler for 503 retries.
+ *
+ * @internal Used by SimpleDBRequest to call the user-specified callback, if set
+ * @param $attempt The number of failed attempts so far
+ * @return The retry delay in microseconds, or 0 to stop retrying.
+ */
+ public function __executeServiceTemporarilyUnavailableRetryDelay($attempt)
+ {
+ if(is_callable($this->__serviceUnavailableRetryDelayCallback)) {
+ $callback = $this->__serviceUnavailableRetryDelayCallback;
+ return $callback($attempt);
+ }
+ return 0;
+ }
+}
+
+final class Route53Request
+{
+ private $r53, $action, $verb, $data, $parameters = array();
+ public $response;
+
+ /**
+ * Constructor
+ *
+ * @param string $r53 The Route53 object making this request
+ * @param string $action SimpleDB action
+ * @param string $verb HTTP verb
+ * @param string $data For POST requests, the data being posted (optional)
+ * @return mixed
+ */
+ function __construct($r53, $action, $verb, $data = '') {
+ $this->r53 = $r53;
+ $this->action = $action;
+ $this->verb = $verb;
+ $this->data = $data;
+ $this->response = new STDClass;
+ $this->response->error = false;
+ }
+
+ /**
+ * Set request parameter
+ *
+ * @param string $key Key
+ * @param string $value Value
+ * @param boolean $replace Whether to replace the key if it already exists (default true)
+ * @return void
+ */
+ public function setParameter($key, $value, $replace = true) {
+ if(!$replace && isset($this->parameters[$key]))
+ {
+ $temp = (array)($this->parameters[$key]);
+ $temp[] = $value;
+ $this->parameters[$key] = $temp;
+ }
+ else
+ {
+ $this->parameters[$key] = $value;
+ }
+ }
+
+ /**
+ * Get the response
+ *
+ * @return object | false
+ */
+ public function getResponse() {
+
+ $params = array();
+ foreach ($this->parameters as $var => $value)
+ {
+ if(is_array($value))
+ {
+ foreach($value as $v)
+ {
+ $params[] = $var.'='.$this->__customUrlEncode($v);
+ }
+ }
+ else
+ {
+ $params[] = $var.'='.$this->__customUrlEncode($value);
+ }
+ }
+
+ sort($params, SORT_STRING);
+
+ $query = implode('&', $params);
+
+ // must be in format 'Sun, 06 Nov 1994 08:49:37 GMT'
+ $date = gmdate('D, d M Y H:i:s e');
+
+ $headers = array();
+ $headers[] = 'Date: '.$date;
+ $headers[] = 'Host: '.$this->r53->getHost();
+
+ $auth = 'AWS3-HTTPS AWSAccessKeyId='.$this->r53->getAccessKey();
+ $auth .= ',Algorithm=HmacSHA256,Signature='.$this->__getSignature($date);
+ $headers[] = 'X-Amzn-Authorization: '.$auth;
+
+ $url = 'https://'.$this->r53->getHost().'/'.Route53::API_VERSION.'/'.$this->action.'?'.$query;
+
+ // Basic setup
+ $curl = curl_init();
+ curl_setopt($curl, CURLOPT_USERAGENT, 'Route53/php');
+
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, ($this->r53->verifyHost() ? 1 : 0));
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, ($this->r53->verifyPeer() ? 1 : 0));
+
+ curl_setopt($curl, CURLOPT_URL, $url);
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
+ curl_setopt($curl, CURLOPT_WRITEFUNCTION, array(&$this, '__responseWriteCallback'));
+ curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
+
+ // Request types
+ switch ($this->verb) {
+ case 'GET': break;
+ case 'POST':
+ curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->verb);
+ if(strlen($this->data) > 0) {
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $this->data);
+ $headers[] = 'Content-Type: text/plain';
+ $headers[] = 'Content-Length: '.strlen($this->data);
+ }
+ break;
+ case 'DELETE':
+ curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
+ break;
+ default: break;
+ }
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
+ curl_setopt($curl, CURLOPT_HEADER, false);
+
+ // Execute, grab errors
+ if (curl_exec($curl)) {
+ $this->response->code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+ } else {
+ $this->response->error = array(
+ 'curl' => true,
+ 'code' => curl_errno($curl),
+ 'message' => curl_error($curl),
+ 'resource' => $this->resource
+ );
+ }
+
+ @curl_close($curl);
+
+ // Parse body into XML
+ if ($this->response->error === false && isset($this->response->body)) {
+ $this->response->body = simplexml_load_string($this->response->body);
+
+ // Grab Route53 errors
+ if (!in_array($this->response->code, array(200, 201, 202, 204))
+ && isset($this->response->body->Error)) {
+ $error = $this->response->body->Error;
+ $output = array();
+ $output['curl'] = false;
+ $output['Error'] = array();
+ $output['Error']['Type'] = (string)$error->Type;
+ $output['Error']['Code'] = (string)$error->Code;
+ $output['Error']['Message'] = (string)$error->Message;
+ $output['RequestId'] = (string)$this->response->body->RequestId;
+
+ $this->response->error = $output;
+ unset($this->response->body);
+ }
+ }
+
+ return $this->response;
+ }
+
+ /**
+ * CURL write callback
+ *
+ * @param resource &$curl CURL resource
+ * @param string &$data Data
+ * @return integer
+ */
+ private function __responseWriteCallback(&$curl, &$data) {
+ $this->response->body .= $data;
+ return strlen($data);
+ }
+
+ /**
+ * Contributed by afx114
+ * URL encode the parameters as per http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?Query_QueryAuth.html
+ * PHP's rawurlencode() follows RFC 1738, not RFC 3986 as required by Amazon. The only difference is the tilde (~), so convert it back after rawurlencode
+ * See: http://www.morganney.com/blog/API/AWS-Product-Advertising-API-Requires-a-Signed-Request.php
+ *
+ * @param string $var String to encode
+ * @return string
+ */
+ private function __customUrlEncode($var) {
+ return str_replace('%7E', '~', rawurlencode($var));
+ }
+
+ /**
+ * Generate the auth string using Hmac-SHA256
+ *
+ * @internal Used by SimpleDBRequest::getResponse()
+ * @param string $string String to sign
+ * @return string
+ */
+ private function __getSignature($string) {
+ return base64_encode(hash_hmac('sha256', $string, $this->r53->getSecretKey(), true));
+ }
+}
diff --git a/src/etc/inc/radius.inc b/src/etc/inc/radius.inc
new file mode 100644
index 0000000..ac610bd
--- /dev/null
+++ b/src/etc/inc/radius.inc
@@ -0,0 +1,1208 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+/*
+ radius.inc
+
+ Copyright (c) 2003, Michael Bretterklieber <michael@bretterklieber.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This code cannot simply be copied and put under the GNU Public License or
+ any other GPL-like (LGPL, GPL2) License.
+
+ This version of RADIUS.php has been modified by
+ Jonathan De Graeve <m0n0wall@esstec.be> to integrate with M0n0wall <http://www.m0n0.ch/wall>
+
+ Changes made include:
+ * StandardAttributes for M0n0wall use
+ * Removed internal Session-Id creation
+ * Adding of ReplyMessage to getAttributes()
+ * Adding of listAttributes()
+ * Adding of VENDOR Bay Networks (Nortel)
+ * Adding of VENDOR Nomadix
+ * Adding of VENDOR WISPr (Wi-Fi Alliance)
+ * Adding of VENDOR ChilliSpot (bandwidth-attributes only)
+
+*/
+
+/*
+ pfSense_MODULE: auth
+*/
+
+require_once("PEAR.inc");
+require_once("radius_authentication.inc");
+require_once("radius_accounting.inc");
+
+/**
+* Client implementation of RADIUS. This are wrapper classes for
+* the RADIUS PECL
+* Provides RADIUS Authentication (RFC2865) and RADIUS Accounting (RFC2866).
+*
+* @package Auth_RADIUS
+* @author Michael Bretterklieber <michael@bretterklieber.com>
+* @access public
+* @version $Revision: 1.5 $
+*/
+
+PEAR::loadExtension('radius');
+
+/**
+ * class Auth_RADIUS
+ *
+ * Abstract base class for RADIUS
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS extends PEAR {
+
+ /**
+ * List of RADIUS servers.
+ * @var array
+ * @see addServer(), putServer()
+ */
+ var $_servers = array();
+
+ /**
+ * Path to the configuration-file.
+ * @var string
+ * @see setConfigFile()
+ */
+ var $_configfile = null;
+
+ /**
+ * Resource.
+ * @var resource
+ * @see open(), close()
+ */
+ var $res = null;
+
+ /**
+ * Username for authentication and accounting requests.
+ * @var string
+ */
+ var $username = null;
+
+ /**
+ * Password for plaintext-authentication (PAP).
+ * @var string
+ */
+ var $password = null;
+
+ /**
+ * List of known attributes.
+ * @var array
+ * @see dumpAttributes(), getAttributes()
+ */
+ var $attributes = array();
+
+ /**
+ * List of raw attributes.
+ * @var array
+ * @see dumpAttributes(), getAttributes()
+ */
+ var $rawAttributes = array();
+
+ /**
+ * List of raw vendor specific attributes.
+ * @var array
+ * @see dumpAttributes(), getAttributes()
+ */
+ var $rawVendorAttributes = array();
+
+ /**
+ * Constructor
+ *
+ * Loads the RADIUS PECL/extension
+ *
+ * @return void
+ */
+ function Auth_RADIUS()
+ {
+ $this->PEAR();
+ }
+
+ /**
+ * Adds a RADIUS server to the list of servers for requests.
+ *
+ * At most 10 servers may be specified. When multiple servers
+ * are given, they are tried in round-robin fashion until a
+ * valid response is received
+ *
+ * @access public
+ * @param string $servername Servername or IP-Address
+ * @param integer $port Portnumber
+ * @param string $sharedSecret Shared secret
+ * @param integer $timeout Timeout for each request
+ * @param integer $maxtries Max. retries for each request
+ * @return void
+ */
+ function addServer($servername = 'localhost', $port = 0, $sharedSecret = 'testing123', $timeout = 3, $maxtries = 2)
+ {
+ $this->_servers[] = array($servername, $port, $sharedSecret, $timeout, $maxtries);
+ }
+
+ /**
+ * Returns an error message, if an error occurred.
+ *
+ * @access public
+ * @return string
+ */
+ function getError()
+ {
+ return radius_strerror($this->res);
+ }
+
+ /**
+ * Sets the configuration-file.
+ *
+ * @access public
+ * @param string $file Path to the configuration file
+ * @return void
+ */
+ function setConfigfile($file)
+ {
+ $this->_configfile = $file;
+ }
+
+ /**
+ * Puts an attribute.
+ *
+ * @access public
+ * @param integer $attrib Attribute-number
+ * @param mixed $port Attribute-value
+ * @param type $type Attribute-type
+ * @return bool true on success, false on error
+ */
+ function putAttribute($attrib, $value, $type = null)
+ {
+ if ($type == null) {
+ $type = gettype($value);
+ }
+
+ switch ($type) {
+ case 'integer':
+ // Fix a conversion error so we should be able to handle 4GB values
+ return radius_put_int($this->res, $attrib, (float)$value);
+
+ case 'addr':
+ return radius_put_addr($this->res, $attrib, $value);
+
+ case 'string':
+ default:
+ return radius_put_attr($this->res, $attrib, $value);
+ }
+
+ }
+
+ /**
+ * Puts a vendor-specific attribute.
+ *
+ * @access public
+ * @param integer $vendor Vendor (MSoft, Cisco, ...)
+ * @param integer $attrib Attribute-number
+ * @param mixed $port Attribute-value
+ * @param type $type Attribute-type
+ * @return bool true on success, false on error
+ */
+ function putVendorAttribute($vendor, $attrib, $value, $type = null)
+ {
+
+ if ($type == null) {
+ $type = gettype($value);
+ }
+
+ switch ($type) {
+ case 'integer':
+ return radius_put_vendor_int($this->res, $vendor, $attrib, $value);
+
+ case 'addr':
+ return radius_put_vendor_addr($this->res, $vendor,$attrib, $value);
+
+ case 'string':
+ default:
+ return radius_put_vendor_attr($this->res, $vendor, $attrib, $value);
+ }
+
+ }
+
+ /**
+ * Prints known attributes received from the server.
+ *
+ * @access public
+ */
+ function dumpAttributes()
+ {
+ foreach ($this->attributes as $name => $data) {
+ echo "$name:$data<br />\n";
+ }
+ }
+
+ /**
+ * Return our know attributes array received from the server.
+ *
+ * @access public
+ */
+ function listAttributes()
+ {
+ return $this->attributes;
+ }
+
+ /**
+ * Overwrite this.
+ *
+ * @access public
+ */
+ function open()
+ {
+ }
+
+ /**
+ * Overwrite this.
+ *
+ * @access public
+ */
+ function createRequest()
+ {
+ }
+
+ /**
+ * Puts standard attributes.
+ *
+ * These attributes will always be present in a radius request
+ *
+ * @access public
+ */
+ function putStandardAttributes()
+ {
+ global $config, $cpzone;
+
+ if (!function_exists("getNasIp")) {
+ $ipaddr = "0.0.0.0";
+ } else {
+ $ipaddr = getNasIP();
+ }
+ // Add support for sending NAS-IP-Address, set this explicitly as an ip_addr
+ $this->putAttribute(RADIUS_NAS_IP_ADDRESS, $ipaddr, "addr");
+
+ // Add support for sending NAS-Identifier
+ if (empty($config["captiveportal"][$cpzone]["radiusnasid"])) {
+ $nasId = php_uname("n");
+ } else {
+ $nasId = $config["captiveportal"][$cpzone]["radiusnasid"];
+ }
+ $this->putAttribute(RADIUS_NAS_IDENTIFIER, $nasId);
+ }
+
+ /**
+ * Puts custom attributes.
+ *
+ * @access public
+ */
+ function putAuthAttributes()
+ {
+ if (isset($this->username)) {
+ $this->putAttribute(RADIUS_USER_NAME, $this->username);
+ }
+ }
+
+ /**
+ * Configures the radius library.
+ *
+ * @access public
+ * @param string $servername Servername or IP-Address
+ * @param integer $port Portnumber
+ * @param string $sharedSecret Shared secret
+ * @param integer $timeout Timeout for each request
+ * @param integer $maxtries Max. retries for each request
+ * @return bool true on success, false on error
+ * @see addServer()
+ */
+ function putServer($servername, $port = 0, $sharedsecret = 'testing123', $timeout = 3, $maxtries = 3)
+ {
+ if (!radius_add_server($this->res, $servername, $port, $sharedsecret, $timeout, $maxtries)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Configures the radius library via external configurationfile
+ *
+ * @access public
+ * @param string $servername Servername or IP-Address
+ * @return bool true on success, false on error
+ */
+ function putConfigfile($file)
+ {
+ if (!radius_config($this->res, $file)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Initiates a RADIUS request.
+ *
+ * @access public
+ * @return bool true on success, false on errors
+ */
+ function start()
+ {
+ if (!$this->open()) {
+ return false;
+ }
+
+ foreach ($this->_servers as $s) {
+ // Servername, port, sharedsecret, timeout, retries
+ if (!$this->putServer($s[0], $s[1], $s[2], $s[3], $s[4])) {
+ return false;
+ }
+ }
+
+ if (!empty($this->_configfile)) {
+ if (!$this->putConfigfile($this->_configfile)) {
+ return false;
+ }
+ }
+
+ $this->createRequest();
+ $this->putStandardAttributes();
+ $this->putAuthAttributes();
+ return true;
+ }
+
+ /**
+ * Sends a prepared RADIUS request and waits for a response
+ *
+ * @access public
+ * @return mixed true on success, false on reject, PEAR_Error on error
+ */
+ function send()
+ {
+ $req = radius_send_request($this->res);
+ if (!$req) {
+ return $this->raiseError(gettext('Error sending request:') . ' ' . $this->getError());
+ }
+
+ switch($req) {
+ case RADIUS_ACCESS_ACCEPT:
+ if (is_subclass_of($this, 'auth_radius_acct')) {
+ return $this->raiseError(gettext('RADIUS_ACCESS_ACCEPT is unexpected for accounting'));
+ }
+ return true;
+
+ case RADIUS_ACCESS_REJECT:
+ return false;
+
+ case RADIUS_ACCOUNTING_RESPONSE:
+ if (is_subclass_of($this, 'auth_radius_pap')) {
+ return $this->raiseError(gettext('RADIUS_ACCOUNTING_RESPONSE is unexpected for authentication'));
+ }
+ return true;
+
+ default:
+ return $this->raiseError(sprintf(gettext("Unexpected return value: %s"),$req));
+ }
+
+ }
+
+ /**
+ * Reads all received attributes after sending the request.
+ *
+ * This methos stores know attributes in the property attributes,
+ * all attributes (including known attibutes) are stored in rawAttributes
+ * or rawVendorAttributes.
+ * NOTE: call this functio also even if the request was rejected, because the
+ * Server returns usualy an errormessage
+ *
+ * @access public
+ * @return bool true on success, false on error
+ */
+ function getAttributes()
+ {
+
+ while ($attrib = radius_get_attr($this->res)) {
+
+ if (!is_array($attrib)) {
+ return false;
+ }
+
+ $attr = $attrib['attr'];
+ $data = $attrib['data'];
+
+ $this->rawAttributes[$attr] = $data;
+
+ switch ($attr) {
+ case RADIUS_FRAMED_IP_ADDRESS:
+ $this->attributes['framed_ip'] = radius_cvt_addr($data);
+ break;
+
+ case RADIUS_FRAMED_IP_NETMASK:
+ $this->attributes['framed_mask'] = radius_cvt_addr($data);
+ break;
+
+ case RADIUS_FRAMED_MTU:
+ $this->attributes['framed_mtu'] = radius_cvt_int($data);
+ break;
+
+ case RADIUS_FRAMED_COMPRESSION:
+ $this->attributes['framed_compression'] = radius_cvt_int($data);
+ break;
+
+ case RADIUS_SESSION_TIMEOUT:
+ $this->attributes['session_timeout'] = radius_cvt_int($data);
+ break;
+
+ case RADIUS_IDLE_TIMEOUT:
+ $this->attributes['idle_timeout'] = radius_cvt_int($data);
+ break;
+
+ case RADIUS_SERVICE_TYPE:
+ $this->attributes['service_type'] = radius_cvt_int($data);
+ break;
+
+ case RADIUS_CLASS:
+ $this->attributes['class'] = radius_cvt_string($data);
+ break;
+
+ case RADIUS_FRAMED_PROTOCOL:
+ $this->attributes['framed_protocol'] = radius_cvt_int($data);
+ break;
+
+ case RADIUS_FRAMED_ROUTING:
+ $this->attributes['framed_routing'] = radius_cvt_int($data);
+ break;
+
+ case RADIUS_FILTER_ID:
+ $this->attributes['filter_id'] = radius_cvt_string($data);
+ break;
+
+ case RADIUS_REPLY_MESSAGE:
+ $this->attributes['reply_message'] = radius_cvt_string($data);
+ break;
+
+ case RADIUS_VENDOR_SPECIFIC:
+ $attribv = radius_get_vendor_attr($data);
+ if (!is_array($attribv)) {
+ return false;
+ }
+
+ $vendor = $attribv['vendor'];
+ $attrv = $attribv['attr'];
+ $datav = $attribv['data'];
+
+ $this->rawVendorAttributes[$vendor][$attrv] = $datav;
+
+ if ($vendor == RADIUS_VENDOR_MICROSOFT) {
+
+ switch ($attrv) {
+ case RADIUS_MICROSOFT_MS_CHAP2_SUCCESS:
+ $this->attributes['ms_chap2_success'] = radius_cvt_string($datav);
+ break;
+
+ case RADIUS_MICROSOFT_MS_CHAP_ERROR:
+ $this->attributes['ms_chap_error'] = radius_cvt_string(substr($datav,1));
+ break;
+
+ case RADIUS_MICROSOFT_MS_CHAP_DOMAIN:
+ $this->attributes['ms_chap_domain'] = radius_cvt_string($datav);
+ break;
+
+ case RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICY:
+ $this->attributes['ms_mppe_encryption_policy'] = radius_cvt_int($datav);
+ break;
+
+ case RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES:
+ $this->attributes['ms_mppe_encryption_types'] = radius_cvt_int($datav);
+ break;
+
+ case RADIUS_MICROSOFT_MS_CHAP_MPPE_KEYS:
+ $demangled = radius_demangle($this->res, $datav);
+ $this->attributes['ms_chap_mppe_lm_key'] = substr($demangled, 0, 8);
+ $this->attributes['ms_chap_mppe_nt_key'] = substr($demangled, 8, RADIUS_MPPE_KEY_LEN);
+ break;
+
+ case RADIUS_MICROSOFT_MS_MPPE_SEND_KEY:
+ $this->attributes['ms_chap_mppe_send_key'] = radius_demangle_mppe_key($this->res, $datav);
+ break;
+
+ case RADIUS_MICROSOFT_MS_MPPE_RECV_KEY:
+ $this->attributes['ms_chap_mppe_recv_key'] = radius_demangle_mppe_key($this->res, $datav);
+ break;
+
+ case RADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVER:
+ $this->attributes['ms_primary_dns_server'] = radius_cvt_string($datav);
+ break;
+ }
+ }
+
+ elseif ($vendor == 1584) {
+
+ switch ($attrv) {
+ case 102:
+ $this->attributes['ces_group'] = radius_cvt_string($datav);
+ break;
+ }
+ }
+
+ elseif ($vendor == 3309) { /* RADIUS_VENDOR_NOMADIX */
+
+ switch ($attrv) {
+ case 1: /* RADIUS_NOMADIX_BW_UP */
+ $this->attributes['bw_up'] = radius_cvt_int($datav);
+ break;
+ case 2: /* RADIUS_NOMADIX_BW_DOWN */
+ $this->attributes['bw_down'] = radius_cvt_int($datav);
+ break;
+ case 3: /* RADIUS_NOMADIX_URL_REDIRECTION */
+ $this->attributes['url_redirection'] = radius_cvt_string($datav);
+ break;
+ case 5: /* RADIUS_NOMADIX_EXPIRATION */
+ $this->attributes['expiration'] = radius_cvt_string($datav);
+ break;
+ case 7: /* RADIUS_NOMADIX_MAXBYTESUP */
+ $this->attributes['maxbytesup'] = radius_cvt_int($datav);
+ break;
+ case 8: /* RADIUS_NOMADIX_MAXBYTESDOWN */
+ $this->attributes['maxbytesdown'] = radius_cvt_int($datav);
+ break;
+ case 10: /* RADIUS_NOMADIX_LOGOFF_URL */
+ $this->attributes['url_logoff'] = radius_cvt_string($datav);
+ break;
+ }
+ }
+
+ elseif ($vendor == 14122) { /* RADIUS_VENDOR_WISPr Wi-Fi Alliance */
+
+ switch ($attrv) {
+ case 1: /* WISPr-Location-ID */
+ $this->attributes['location_id'] = radius_cvt_string($datav);
+ break;
+ case 2: /* WISPr-Location-Name */
+ $this->attributes['location_name'] = radius_cvt_string($datav);
+ break;
+ case 3: /* WISPr-Logoff-URL */
+ $this->attributes['url_logoff'] = radius_cvt_string($datav);
+ break;
+ case 4: /* WISPr-Redirection-URL */
+ $this->attributes['url_redirection'] = radius_cvt_string($datav);
+ break;
+ case 5: /* WISPr-Bandwidth-Min-Up */
+ $this->attributes['bw_up_min'] = radius_cvt_int($datav);
+ break;
+ case 6: /* WISPr-Bandwidth-Min-Down */
+ $this->attributes['bw_down_min'] = radius_cvt_int($datav);
+ break;
+ case 7: /* WISPr-Bandwidth-Max-Up */
+ $this->attributes['bw_up'] = radius_cvt_int($datav);
+ break;
+ case 8: /* WISPr-Bandwidth-Max-Down */
+ $this->attributes['bw_down'] = radius_cvt_int($datav);
+ break;
+ case 9: /* WISPr-Session-Terminate-Time */
+ $this->attributes['session_terminate_time'] = radius_cvt_string($datav);
+ break;
+ case 10: /* WISPr-Session-Terminate-End-Of-Day */
+ $this->attributes['session_terminate_endofday'] = radius_cvt_int($datav);
+ break;
+ case 11: /* WISPr-Billing-Class-Of-Service */
+ $this->attributes['billing_class_of_service'] = radius_cvt_string($datav);
+ break;
+ }
+ }
+
+ elseif ($vendor == 14559) { /* RADIUS_VENDOR_ChilliSpot */
+ switch ($attrv) {
+ case 4: /* ChilliSpot-Bandwidth-Max-Up */
+ $this->attributes['bw_up'] = radius_cvt_int($datav);
+ break;
+ case 5: /* ChilliSpot-Bandwidth-Max-Down */
+ $this->attributes['bw_down'] = radius_cvt_int($datav);
+ break;
+ }
+ }
+
+ elseif ($vendor == 9) { /* RADIUS_VENDOR_CISCO */
+ switch ($attrv) {
+ case 1: /* Cisco-AVPair */
+ if (!is_array($this->attributes['ciscoavpair']))
+ $this->attributes['ciscoavpair'] = array();
+ $this->attributes['ciscoavpair'][] = radius_cvt_string($datav);
+ break;
+ }
+ }
+
+ elseif ($vendor == 8744) { /* Colubris / HP MSM wireless */
+ //documented at http://bizsupport1.austin.hp.com/bc/docs/support/SupportManual/c02704528/c02704528.pdf pg 15-67
+ if ($attrv == 0) { /* Colubris AV-Pair */
+ $datav = explode('=', $datav);
+ switch ($datav[0]) {
+ case 'max-input-rate':
+ // "Controls the data rate [kbps] at which traffic can be transferred from the user to the [router]."
+ $this->attributes['bw_up'] = radius_cvt_int($datav[1]);
+ break;
+ case 'max-output-rate':
+ //"Controls the data rate [kbps] at which traffic can be transferred from the [router] to the user."
+ $this->attributes['bw_down'] = radius_cvt_int($datav[1]);
+ break;
+ case 'max-input-octets':
+ $this->attributes['maxbytesup'] = radius_cvt_int($datav[1]);
+ break;
+ case 'max-output-octets':
+ $this->attributes['maxbytesdown'] = radius_cvt_int($datav[1]);
+ break;
+ case 'welcome-url':
+ $this->attributes['url_redirection'] = radius_cvt_string($datav[1]);
+ break;
+ case 'goodbye-url':
+ $this->attributes['url_logoff'] = radius_cvt_string($datav[1]);
+ break;
+ }
+ }
+ }
+
+ break;
+
+ case 85: /* Acct-Interim-Interval: RFC 2869 */
+ $this->attributes['interim_interval'] = radius_cvt_int($data);
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Frees resources.
+ *
+ * Calling this method is always a good idea, because all security relevant
+ * attributes are filled with Nullbytes to leave nothing in the mem.
+ *
+ * @access public
+ */
+ function close()
+ {
+ if ($this->res != null) {
+ radius_close($this->res);
+ $this->res = null;
+ }
+ $this->username = str_repeat("\0", strlen($this->username));
+ $this->password = str_repeat("\0", strlen($this->password));
+ }
+
+}
+
+/**
+ * class Auth_RADIUS_PAP
+ *
+ * Class for authenticating using PAP (Plaintext)
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_PAP extends Auth_RADIUS
+{
+
+ /**
+ * Constructor
+ *
+ * @param string $username Username
+ * @param string $password Password
+ * @return void
+ */
+ function Auth_RADIUS_PAP($username = null, $password = null)
+ {
+ $this->Auth_RADIUS();
+ $this->username = $username;
+ $this->password = $password;
+ }
+
+ /**
+ * Creates a RADIUS resource
+ *
+ * Creates a RADIUS resource for authentication. This should be the first
+ * call before you make any other things with the library.
+ *
+ * @return bool true on success, false on error
+ */
+ function open()
+ {
+ $this->res = radius_auth_open();
+ if (!$this->res) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Creates an authentication request
+ *
+ * Creates an authentication request.
+ * You MUST call this method before you can put any attribute
+ *
+ * @return bool true on success, false on error
+ */
+ function createRequest()
+ {
+ if (!radius_create_request($this->res, RADIUS_ACCESS_REQUEST)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Put authentication specific attributes
+ *
+ * @return void
+ */
+ function putAuthAttributes()
+ {
+ if (isset($this->username)) {
+ $this->putAttribute(RADIUS_USER_NAME, $this->username);
+ }
+ if (isset($this->password)) {
+ $this->putAttribute(RADIUS_USER_PASSWORD, $this->password);
+ }
+ }
+
+}
+
+/**
+ * class Auth_RADIUS_CHAP_MD5
+ *
+ * Class for authenticating using CHAP-MD5 see RFC1994.
+ * Instead og the plaintext password the challenge and
+ * the response are needed.
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_CHAP_MD5 extends Auth_RADIUS_PAP
+{
+ /**
+ * 8 Bytes binary challenge
+ * @var string
+ */
+ var $challenge = null;
+
+ /**
+ * 16 Bytes MD5 response binary
+ * @var string
+ */
+ var $response = null;
+
+ /**
+ * Id of the authentication request. Should incremented after every request.
+ * @var integer
+ */
+ var $chapid = 1;
+
+ /**
+ * Constructor
+ *
+ * @param string $username Username
+ * @param string $challenge 8 Bytes Challenge (binary)
+ * @param integer $chapid Requestnumber
+ * @return void
+ */
+ function Auth_RADIUS_CHAP_MD5($username = null, $challenge = null, $chapid = 1)
+ {
+ $this->Auth_RADIUS_PAP();
+ $this->username = $username;
+ $this->challenge = $challenge;
+ $this->chapid = $chapid;
+ }
+
+ /**
+ * Put CHAP-MD5 specific attributes
+ *
+ * For authenticating using CHAP-MD5 via RADIUS you have to put the challenge
+ * and the response. The chapid is inserted in the first byte of the response.
+ *
+ * @return void
+ */
+ function putAuthAttributes()
+ {
+ if (isset($this->username)) {
+ $this->putAttribute(RADIUS_USER_NAME, $this->username);
+ }
+ if (isset($this->response)) {
+ $response = pack('C', $this->chapid) . $this->response;
+ $this->putAttribute(RADIUS_CHAP_PASSWORD, $response);
+ }
+ if (isset($this->challenge)) {
+ $this->putAttribute(RADIUS_CHAP_CHALLENGE, $this->challenge);
+ }
+ }
+
+ /**
+ * Frees resources.
+ *
+ * Calling this method is always a good idea, because all security relevant
+ * attributes are filled with Nullbytes to leave nothing in the mem.
+ *
+ * @access public
+ */
+ function close()
+ {
+ Auth_RADIUS_PAP::close();
+ $this->challenge = str_repeat("\0", strlen($this->challenge));
+ $this->response = str_repeat("\0", strlen($this->response));
+ }
+
+}
+
+/**
+ * class Auth_RADIUS_MSCHAPv1
+ *
+ * Class for authenticating using MS-CHAPv1 see RFC2433
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_MSCHAPv1 extends Auth_RADIUS_CHAP_MD5
+{
+ /**
+ * LAN-Manager-Response
+ * @var string
+ */
+ var $lmResponse = null;
+
+ /**
+ * Wether using deprecated LM-Responses or not.
+ * 0 = use LM-Response, 1 = use NT-Response
+ * @var bool
+ */
+ var $flags = 1;
+
+ /**
+ * Put MS-CHAPv1 specific attributes
+ *
+ * For authenticating using MS-CHAPv1 via RADIUS you have to put the challenge
+ * and the response. The response has this structure:
+ * struct rad_mschapvalue {
+ * u_char ident;
+ * u_char flags;
+ * u_char lm_response[24];
+ * u_char response[24];
+ * };
+ *
+ * @return void
+ */
+ function putAuthAttributes()
+ {
+ if (isset($this->username)) {
+ $this->putAttribute(RADIUS_USER_NAME, $this->username);
+ }
+ if (isset($this->response) || isset($this->lmResponse)) {
+ $lmResp = isset($this->lmResponse) ? $this->lmResponse : str_repeat ("\0", 24);
+ $ntResp = isset($this->response) ? $this->response : str_repeat ("\0", 24);
+ $resp = pack('CC', $this->chapid, $this->flags) . $lmResp . $ntResp;
+ $this->putVendorAttribute(RADIUS_VENDOR_MICROSOFT, RADIUS_MICROSOFT_MS_CHAP_RESPONSE, $resp);
+ }
+ if (isset($this->challenge)) {
+ $this->putVendorAttribute(RADIUS_VENDOR_MICROSOFT, RADIUS_MICROSOFT_MS_CHAP_CHALLENGE, $this->challenge);
+ }
+ }
+}
+
+/**
+ * class Auth_RADIUS_MSCHAPv2
+ *
+ * Class for authenticating using MS-CHAPv2 see RFC2759
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_MSCHAPv2 extends Auth_RADIUS_MSCHAPv1
+{
+ /**
+ * 16 Bytes binary challenge
+ * @var string
+ */
+ var $challenge = null;
+
+ /**
+ * 16 Bytes binary Peer Challenge
+ * @var string
+ */
+ var $peerChallenge = null;
+
+ /**
+ * Put MS-CHAPv2 specific attributes
+ *
+ * For authenticating using MS-CHAPv1 via RADIUS you have to put the challenge
+ * and the response. The response has this structure:
+ * struct rad_mschapv2value {
+ * u_char ident;
+ * u_char flags;
+ * u_char pchallenge[16];
+ * u_char reserved[8];
+ * u_char response[24];
+ * };
+ * where pchallenge is the peer challenge. Like for MS-CHAPv1 we set the flags field to 1.
+ * @return void
+ */
+ function putAuthAttributes()
+ {
+ if (isset($this->username)) {
+ $this->putAttribute(RADIUS_USER_NAME, $this->username);
+ }
+ if (isset($this->response) && isset($this->peerChallenge)) {
+ // Response: chapid, flags (1 = use NT Response), Peer challenge, reserved, Response
+ $resp = pack('CCa16a8a24',$this->chapid , 1, $this->peerChallenge, str_repeat("\0", 8), $this->response);
+ $this->putVendorAttribute(RADIUS_VENDOR_MICROSOFT, RADIUS_MICROSOFT_MS_CHAP2_RESPONSE, $resp);
+ }
+ if (isset($this->challenge)) {
+ $this->putVendorAttribute(RADIUS_VENDOR_MICROSOFT, RADIUS_MICROSOFT_MS_CHAP_CHALLENGE, $this->challenge);
+ }
+ }
+
+ /**
+ * Frees resources.
+ *
+ * Calling this method is always a good idea, because all security relevant
+ * attributes are filled with Nullbytes to leave nothing in the mem.
+ *
+ * @access public
+ */
+ function close()
+ {
+ Auth_RADIUS_MSCHAPv1::close();
+ $this->peerChallenge = str_repeat("\0", strlen($this->peerChallenge));
+ }
+}
+
+/**
+ * class Auth_RADIUS_Acct
+ *
+ * Class for RADIUS accounting
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_Acct extends Auth_RADIUS
+{
+ /**
+ * Defines where the Authentication was made, possible values are:
+ * RADIUS_AUTH_RADIUS, RADIUS_AUTH_LOCAL, RADIUS_AUTH_REMOTE
+ * @var integer
+ */
+ var $authentic = null;
+
+ /**
+ * Defines the type of the accounting request, on of:
+ * RADIUS_START, RADIUS_STOP, RADIUS_ACCOUNTING_ON, RADIUS_ACCOUNTING_OFF
+ * @var integer
+ */
+ var $status_type = null;
+
+ /**
+ * The time the user was logged in in seconds
+ * @var integer
+ */
+ var $session_time = null;
+
+ /**
+ * A uniq identifier for the session of the user, maybe the PHP-Session-Id
+ * @var string
+ */
+ var $session_id = null;
+
+ /**
+ * Constructor
+ *
+ * This function is disabled for M0n0wall since we use our own session_id
+ *
+ * Generates a predefined session_id. We use the Remote-Address, the PID, and the Current user.
+ * @return void
+ *
+ function Auth_RADIUS_Acct()
+ {
+ $this->Auth_RADIUS();
+
+ if (isset($_SERVER)) {
+ $var = &$_SERVER;
+ } else {
+ $var = &$GLOBALS['HTTP_SERVER_VARS'];
+ }
+
+ $this->session_id = sprintf("%s:%d-%s", isset($var['REMOTE_ADDR']) ? $var['REMOTE_ADDR'] : '127.0.0.1' , getmypid(), get_current_user());
+ }
+ */
+
+ /**
+ * Constructor
+ *
+ */
+
+ function Auth_RADIUS_Acct()
+ {
+ $this->Auth_RADIUS();
+ }
+
+ /**
+ * Creates a RADIUS resource
+ *
+ * Creates a RADIUS resource for accounting. This should be the first
+ * call before you make any other things with the library.
+ *
+ * @return bool true on success, false on error
+ */
+ function open()
+ {
+ $this->res = radius_acct_open();
+ if (!$this->res) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Creates an accounting request
+ *
+ * Creates an accounting request.
+ * You MUST call this method before you can put any attribute.
+ *
+ * @return bool true on success, false on error
+ */
+ function createRequest()
+ {
+ if (!radius_create_request($this->res, RADIUS_ACCOUNTING_REQUEST)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Put attributes for accounting.
+ *
+ * Here we put some accounting values. There many more attributes for accounting,
+ * but for web-applications only certain attributes make sense.
+ * @return void
+ */
+ function putAuthAttributes()
+ {
+ if (isset($this->username)) {
+ $this->putAttribute(RADIUS_USER_NAME, $this->username);
+ }
+ $this->putAttribute(RADIUS_ACCT_STATUS_TYPE, $this->status_type);
+ //if (isset($this->session_time) && $this->status_type == RADIUS_STOP) {
+ if (isset($this->session_time)) {
+ $this->putAttribute(RADIUS_ACCT_SESSION_TIME, $this->session_time);
+ }
+ if (isset($this->authentic)) {
+ $this->putAttribute(RADIUS_ACCT_AUTHENTIC, $this->authentic);
+ }
+
+ $this->putStandardAttributes();
+ }
+
+}
+
+/**
+ * class Auth_RADIUS_Acct_Start
+ *
+ * Class for RADIUS accounting. Its usualy used, after the user has logged in.
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_Acct_Start extends Auth_RADIUS_Acct
+{
+ /**
+ * Defines the type of the accounting request.
+ * It is set to RADIUS_START by default in this class.
+ * @var integer
+ */
+ var $status_type = RADIUS_START;
+}
+
+/**
+ * class Auth_RADIUS_Acct_Start
+ *
+ * Class for RADIUS accounting. Its usualy used, after the user has logged out.
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_Acct_Stop extends Auth_RADIUS_Acct
+{
+ /**
+ * Defines the type of the accounting request.
+ * It is set to RADIUS_STOP by default in this class.
+ * @var integer
+ */
+ var $status_type = RADIUS_STOP;
+}
+
+if (!defined('RADIUS_UPDATE'))
+ define('RADIUS_UPDATE', 3);
+
+/**
+ * class Auth_RADIUS_Acct_Update
+ *
+ * Class for interim RADIUS accounting updates.
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_Acct_Update extends Auth_RADIUS_Acct
+{
+ /**
+ * Defines the type of the accounting request.
+ * It is set to RADIUS_UPDATE by default in this class.
+ * @var integer
+ */
+ var $status_type = RADIUS_UPDATE;
+}
+
+/**
+ * class Auth_RADIUS_Acct_On
+ *
+ * Class for sending Accounting-On updates
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_Acct_On extends Auth_RADIUS_Acct
+{
+ /**
+ * Defines the type of the accounting request.
+ * It is set to RADIUS_ACCOUNTING_ON by default in this class.
+ * @var integer
+ */
+ var $status_type = RADIUS_ACCOUNTING_ON;
+}
+
+/**
+ * class Auth_RADIUS_Acct_Off
+ *
+ * Class for sending Accounting-Off updates
+ *
+ * @package Auth_RADIUS
+ */
+class Auth_RADIUS_Acct_Off extends Auth_RADIUS_Acct
+{
+ /**
+ * Defines the type of the accounting request.
+ * It is set to RADIUS_ACCOUNTING_OFF by default in this class.
+ * @var integer
+ */
+ var $status_type = RADIUS_ACCOUNTING_OFF;
+}
+
+?>
diff --git a/src/etc/inc/rrd.inc b/src/etc/inc/rrd.inc
new file mode 100644
index 0000000..86148d6
--- /dev/null
+++ b/src/etc/inc/rrd.inc
@@ -0,0 +1,989 @@
+<?php
+/* $Id$ */
+/*
+ rrd.inc
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ */
+
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm /usr/bin/nice /usr/local/bin/rrdtool /bin/cd
+ pfSense_MODULE: rrd
+*/
+
+/* include all configuration functions */
+
+function dump_rrd_to_xml($rrddatabase, $xmldumpfile) {
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+ unlink_if_exists($xmldumpfile);
+
+ exec("$rrdtool dump " . escapeshellarg($rrddatabase) . " {$xmldumpfile} 2>&1", $dumpout, $dumpret);
+ if ($dumpret <> 0) {
+ $dumpout = implode(" ", $dumpout);
+ log_error(sprintf(gettext('RRD dump failed exited with %1$s, the error is: %2$s'), $dumpret, $dumpout));
+ }
+ return($dumpret);
+}
+
+function restore_rrd() {
+ global $g, $config;
+
+ $rrddbpath = "/var/db/rrd/";
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+
+ $rrdrestore = "";
+ $rrdreturn = "";
+ if (file_exists("{$g['cf_conf_path']}/rrd.tgz") && (isset($config['system']['use_mfs_tmpvar']) || $g['platform'] != "pfSense")) {
+ foreach (glob("{$rrddbpath}/*.xml") as $xml_file) {
+ @unlink($xml_file);
+ }
+ unset($rrdrestore);
+ $_gb = exec("cd /;LANG=C /usr/bin/tar -tf {$g['cf_conf_path']}/rrd.tgz", $rrdrestore, $rrdreturn);
+ if ($rrdreturn != 0) {
+ log_error("RRD restore failed exited with $rrdreturn, the error is: $rrdrestore\n");
+ return;
+ }
+ foreach ($rrdrestore as $xml_file) {
+ $rrd_file = '/' . substr($xml_file, 0, -4) . '.rrd';
+ if (file_exists("{$rrd_file}")) {
+ @unlink($rrd_file);
+ }
+ file_put_contents("{$g['tmp_path']}/rrd_restore", $xml_file);
+ $_gb = exec("cd /;LANG=C /usr/bin/tar -xf {$g['cf_conf_path']}/rrd.tgz -T {$g['tmp_path']}/rrd_restore");
+ if (!file_exists("/{$xml_file}")) {
+ log_error("Could not extract {$xml_file} RRD xml file from archive!");
+ continue;
+ }
+ $_gb = exec("$rrdtool restore -f '/{$xml_file}' '{$rrd_file}'", $output, $status);
+ if ($status) {
+ log_error("rrdtool restore -f '{$xml_file}' '{$rrd_file}' failed returning {$status}.");
+ continue;
+ }
+ unset($output);
+ @unlink("/{$xml_file}");
+ }
+ unset($rrdrestore);
+ @unlink("{$g['tmp_path']}/rrd_restore");
+ /* If this backup is still there on a full install, but we aren't going to use ram disks, remove the archive since this is a transition. */
+ if (($g['platform'] == "pfSense") && !isset($config['system']['use_mfs_tmpvar'])) {
+ unlink_if_exists("{$g['cf_conf_path']}/rrd.tgz");
+ }
+ return true;
+ }
+ return false;
+}
+
+function create_new_rrd($rrdcreatecmd) {
+ $rrdcreateoutput = array();
+ $rrdcreatereturn = 0;
+ $_gb = exec("$rrdcreatecmd 2>&1", $rrdcreateoutput, $rrdcreatereturn);
+ if ($rrdcreatereturn <> 0) {
+ $rrdcreateoutput = implode(" ", $rrdcreateoutput);
+ log_error(sprintf(gettext('RRD create failed exited with %1$s, the error is: %2$s'), $rrdcreatereturn, $rrdcreateoutput));
+ }
+ unset($rrdcreateoutput);
+ return $rrdcreatereturn;
+}
+
+function migrate_rrd_format($rrdoldxml, $rrdnewxml) {
+ if (!file_exists("/tmp/rrd_notice_sent.txt")) {
+ $_gb = exec("echo 'Converting RRD configuration to new format. This might take a bit...' | wall");
+ @touch("/tmp/rrd_notice_sent.txt");
+ }
+ $numrraold = count($rrdoldxml['rra']);
+ $numrranew = count($rrdnewxml['rra']);
+ $numdsold = count($rrdoldxml['ds']);
+ $numdsnew = count($rrdnewxml['ds']);
+ log_error(sprintf(gettext('Import RRD has %1$s DS values and %2$s RRA databases, new format RRD has %3$s DS values and %4$s RRA databases'), $numdsold, $numrraold, $numdsnew , $numrranew));
+
+ /* add data sources not found in the old array from the new array */
+ $i = 0;
+ foreach ($rrdnewxml['ds'] as $ds) {
+ if (!is_array($rrdoldxml['ds'][$i])) {
+ $rrdoldxml['ds'][$i] = $rrdnewxml['ds'][$i];
+ /* set unknown values to 0 */
+ $rrdoldxml['ds'][$i]['last_ds'] = " 0.0000000000e+00 ";
+ $rrdoldxml['ds'][$i]['value'] = " 0.0000000000e+00 ";
+ $rrdoldxml['ds'][$i]['unknown_sec'] = "0";
+ }
+ $i++;
+ }
+
+ $i = 0;
+ $rracountold = count($rrdoldxml['rra']);
+ $rracountnew = count($rrdnewxml['rra']);
+ /* process each RRA, which contain a database */
+ foreach ($rrdnewxml['rra'] as $rra) {
+ if (!is_array($rrdoldxml['rra'][$i])) {
+ $rrdoldxml['rra'][$i] = $rrdnewxml['rra'][$i];
+ }
+
+ $d = 0;
+ /* process cdp_prep */
+ $cdp_prep = $rra['cdp_prep'];
+ foreach ($cdp_prep['ds'] as $ds) {
+ if (!is_array($rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d])) {
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d] = $rrdnewxml['rra'][$i]['cdp_prep']['ds'][$d];
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d]['primary_value'] = " 0.0000000000e+00 ";
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d]['secondary_value'] = " 0.0000000000e+00 ";
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d]['value'] = " 0.0000000000e+00 ";
+ $rrdoldxml['rra'][$i]['cdp_prep']['ds'][$d]['unknown_datapoints'] = "0";
+ }
+ $d++;
+ }
+
+ /* process database */
+ $rows = $rra['database'];
+ $k = 0;
+ $rowcountold = count($rrdoldxml['rra'][$i]['database']['row']);
+ $rowcountnew = count($rrdnewxml['rra'][$i]['database']['row']);
+ $rowcountdiff = $rowcountnew - $rowcountold;
+ /* save old rows for a bit before we put the required empty rows before it */
+ $rowsdata = $rows;
+ $rowsempty = array();
+ $r = 0;
+ while ($r < $rowcountdiff) {
+ $rowsempty[] = $rrdnewxml['rra'][$i]['database']['row'][$r];
+ $r++;
+ }
+ $rows = $rowsempty + $rowsdata;
+ /* now foreach the rows in the database */
+ foreach ($rows['row'] as $row) {
+ if (!is_array($rrdoldxml['rra'][$i]['database']['row'][$k])) {
+ $rrdoldxml['rra'][$i]['database']['row'][$k] = $rrdnewxml['rra'][$i]['database']['row'][$k];
+ }
+ $m = 0;
+ $vcountold = count($rrdoldxml['rra'][$i]['database']['row'][$k]['v']);
+ $vcountnew = count($rrdnewxml['rra'][$i]['database']['row'][$k]['v']);
+ foreach ($row['v'] as $value) {
+ if (empty($rrdoldxml['rra'][$i]['database']['row'][$k]['v'][$m])) {
+ if (isset($valid)) {
+ $rrdoldxml['rra'][$i]['database']['row'][$k]['v'][$m] = "0.0000000000e+00 ";
+ } else {
+ $rrdoldxml['rra'][$i]['database']['row'][$k]['v'][$m] = $rrdnewxml['rra'][$i]['database']['row'][$k]['v'][$m];
+ }
+ } else {
+ if ($value <> " NaN ") {
+ $valid = true;
+ } else {
+ $valid = false;
+ }
+ }
+ $m++;
+ }
+ $k++;
+ }
+ $i++;
+ }
+
+ $numrranew = count($rrdoldxml['rra']);
+ $numdsnew = count($rrdoldxml['ds']);
+ log_error(sprintf(gettext('The new RRD now has %1$s DS values and %2$s RRA databases'), $numdsnew, $numrranew));
+ return $rrdoldxml;
+}
+
+function enable_rrd_graphing() {
+ global $config, $g, $altq_list_queues;
+
+ if (platform_booting()) {
+ echo gettext("Generating RRD graphs...");
+ }
+
+ $rrddbpath = "/var/db/rrd/";
+ $rrdgraphpath = "/usr/local/www/rrd";
+
+ $traffic = "-traffic.rrd";
+ $packets = "-packets.rrd";
+ $states = "-states.rrd";
+ $wireless = "-wireless.rrd";
+ $queues = "-queues.rrd";
+ $queuesdrop = "-queuedrops.rrd";
+ $spamd = "-spamd.rrd";
+ $proc = "-processor.rrd";
+ $mem = "-memory.rrd";
+ $mbuf = "-mbuf.rrd";
+ $cellular = "-cellular.rrd";
+ $vpnusers = "-vpnusers.rrd";
+ $captiveportalconcurrent = "-concurrent.rrd";
+ $captiveportalloggedin = "-loggedin.rrd";
+ $ntpd = "ntpd.rrd";
+
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+ $netstat = "/usr/bin/netstat";
+ $awk = "/usr/bin/awk";
+ $tar = "/usr/bin/tar";
+ $pfctl = "/sbin/pfctl";
+ $sysctl = "/sbin/sysctl";
+ $php = "/usr/local/bin/php-cgi";
+ $cpustats = "/usr/local/sbin/cpustats";
+ $spamd_gather = "/usr/local/bin/spamd_gather_stats.php";
+ $ifconfig = "/sbin/ifconfig";
+ $captiveportal_gather = "/usr/local/bin/captiveportal_gather_stats.php";
+ $ntpq = "/usr/local/sbin/ntpq";
+
+ $rrdtrafficinterval = 60;
+ $rrdwirelessinterval = 60;
+ $rrdqueuesinterval = 60;
+ $rrdqueuesdropinterval = 60;
+ $rrdpacketsinterval = 60;
+ $rrdstatesinterval = 60;
+ $rrdspamdinterval = 60;
+ $rrdlbpoolinterval = 60;
+ $rrdprocinterval = 60;
+ $rrdmeminterval = 60;
+ $rrdmbufinterval = 60;
+ $rrdcellularinterval = 60;
+ $rrdvpninterval = 60;
+ $rrdcaptiveportalinterval = 60;
+ $rrdntpdinterval = 60;
+
+ $trafficvalid = $rrdtrafficinterval * 2;
+ $wirelessvalid = $rrdwirelessinterval * 2;
+ $queuesvalid = $rrdqueuesinterval * 2;
+ $queuesdropvalid = $rrdqueuesdropinterval * 2;
+ $packetsvalid = $rrdpacketsinterval * 2;
+ $statesvalid = $rrdstatesinterval*2;
+ $spamdvalid = $rrdspamdinterval * 2;
+ $lbpoolvalid = $rrdlbpoolinterval * 2;
+ $procvalid = $rrdlbpoolinterval * 2;
+ $memvalid = $rrdmeminterval * 2;
+ $mbufvalid = $rrdmbufinterval * 2;
+ $cellularvalid = $rrdcellularinterval * 2;
+ $vpnvalid = $rrdvpninterval * 2;
+ $captiveportalvalid = $rrdcaptiveportalinterval * 2;
+ $ntpdvalid = $rrdntpdinterval * 2;
+
+ /* Assume 2*10GigE for now */
+ $downstream = 2500000000;
+ $upstream = 2500000000;
+
+ /* read the shaper config */
+ read_altq_config();
+
+ if (isset ($config['rrd']['enable'])) {
+
+ /* create directory if needed */
+ if (!is_dir($rrddbpath)) {
+ mkdir($rrddbpath, 0775);
+ }
+ chown($rrddbpath, "nobody");
+
+ if (platform_booting()) {
+ restore_rrd();
+ }
+
+ /* db update script */
+ $rrdupdatesh = "#!/bin/sh\n";
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "export TERM=dumb\n";
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= 'echo $$ > ' . $g['varrun_path'] . '/updaterrd.sh.pid';
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "counter=1\n";
+ $rrdupdatesh .= "while [ \"\$counter\" -ne 0 ]\n";
+ $rrdupdatesh .= "do\n";
+ $rrdupdatesh .= "";
+
+ $i = 0;
+ $ifdescrs = get_configured_interface_with_descr();
+ /* IPsec counters */
+ $ifdescrs['ipsec'] = "IPsec";
+ /* OpenVPN server counters */
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $server) {
+ $serverid = "ovpns" . $server['vpnid'];
+ $ifdescrs[$serverid] = "{$server['description']}";
+ }
+ }
+
+ if (platform_booting()) {
+ if (!is_dir("{$g['vardb_path']}/rrd")) {
+ mkdir("{$g['vardb_path']}/rrd", 0775);
+ }
+
+ @chown("{$g['vardb_path']}/rrd", "nobody");
+ }
+
+ /* process all real and pseudo interfaces */
+ foreach ($ifdescrs as $ifname => $ifdescr) {
+ $temp = get_real_interface($ifname);
+ if ($temp <> "") {
+ $realif = $temp;
+ }
+
+ /* TRAFFIC, set up the rrd file */
+ if (!file_exists("$rrddbpath$ifname$traffic")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$traffic --step $rrdtrafficinterval ";
+ $rrdcreate .= "DS:inpass:COUNTER:$trafficvalid:0:$downstream ";
+ $rrdcreate .= "DS:outpass:COUNTER:$trafficvalid:0:$upstream ";
+ $rrdcreate .= "DS:inblock:COUNTER:$trafficvalid:0:$downstream ";
+ $rrdcreate .= "DS:outblock:COUNTER:$trafficvalid:0:$upstream ";
+ $rrdcreate .= "DS:inpass6:COUNTER:$trafficvalid:0:$downstream ";
+ $rrdcreate .= "DS:outpass6:COUNTER:$trafficvalid:0:$upstream ";
+ $rrdcreate .= "DS:inblock6:COUNTER:$trafficvalid:0:$downstream ";
+ $rrdcreate .= "DS:outblock6:COUNTER:$trafficvalid:0:$upstream ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$traffic N:U:U:U:U:U:U:U:U");
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling traffic for interface $ifname $realif IPv4/IPv6 counters \n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$traffic N:";
+ $rrdupdatesh .= "`$pfctl -vvsI -i {$realif} | awk '\\\n";
+ $rrdupdatesh .= "/In4\/Pass/ { b4pi = \$6 };/Out4\/Pass/ { b4po = \$6 };/In4\/Block/ { b4bi = \$6 };/Out4\/Block/ { b4bo = \$6 };\\\n";
+ $rrdupdatesh .= "/In6\/Pass/ { b6pi = \$6 };/Out6\/Pass/ { b6po = \$6 };/In6\/Block/ { b6bi = \$6 };/Out6\/Block/ { b6bo = \$6 };\\\n";
+ $rrdupdatesh .= "END {print b4pi \":\" b4po \":\" b4bi \":\" b4bo \":\" b6pi \":\" b6po \":\" b6bi \":\" b6bo};'`\n";
+
+ /* PACKETS, set up the rrd file */
+ if (!file_exists("$rrddbpath$ifname$packets")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$packets --step $rrdpacketsinterval ";
+ $rrdcreate .= "DS:inpass:COUNTER:$packetsvalid:0:$downstream ";
+ $rrdcreate .= "DS:outpass:COUNTER:$packetsvalid:0:$upstream ";
+ $rrdcreate .= "DS:inblock:COUNTER:$packetsvalid:0:$downstream ";
+ $rrdcreate .= "DS:outblock:COUNTER:$packetsvalid:0:$upstream ";
+ $rrdcreate .= "DS:inpass6:COUNTER:$packetsvalid:0:$downstream ";
+ $rrdcreate .= "DS:outpass6:COUNTER:$packetsvalid:0:$upstream ";
+ $rrdcreate .= "DS:inblock6:COUNTER:$packetsvalid:0:$downstream ";
+ $rrdcreate .= "DS:outblock6:COUNTER:$packetsvalid:0:$upstream ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$packets N:U:U:U:U:U:U:U:U");
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling packets for interface $ifname $realif \n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$packets N:";
+ $rrdupdatesh .= "`$pfctl -vvsI -i {$realif} | awk '\\\n";
+ $rrdupdatesh .= "/In4\/Pass/ { b4pi = \$4 };/Out4\/Pass/ { b4po = \$4 };/In4\/Block/ { b4bi = \$4 };/Out4\/Block/ { b4bo = \$4 };\\\n";
+ $rrdupdatesh .= "/In6\/Pass/ { b6pi = \$4 };/Out6\/Pass/ { b6po = \$4 };/In6\/Block/ { b6bi = \$4 };/Out6\/Block/ { b6bo = \$4 };\\\n";
+ $rrdupdatesh .= "END {print b4pi \":\" b4po \":\" b4bi \":\" b4bo \":\" b6pi \":\" b6po \":\" b6bi \":\" b6bo};'`\n";
+
+ /* WIRELESS, set up the rrd file */
+ if ($config['interfaces'][$ifname]['wireless']['mode'] == "bss") {
+ if (!file_exists("$rrddbpath$ifname$wireless")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$wireless --step $rrdwirelessinterval ";
+ $rrdcreate .= "DS:snr:GAUGE:$wirelessvalid:0:1000 ";
+ $rrdcreate .= "DS:rate:GAUGE:$wirelessvalid:0:1000 ";
+ $rrdcreate .= "DS:channel:GAUGE:$wirelessvalid:0:1000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$wireless N:U:U:U");
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling wireless for interface $ifname $realif \n";
+ $rrdupdatesh .= "WIFI=`$ifconfig {$realif} list sta| $awk 'gsub(\"M\", \"\") {getline 2;print substr(\$5, 0, length(\$5)-2) \":\" $4 \":\" $3}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$wireless N:\${WIFI}\n";
+ }
+
+ /* OpenVPN, set up the rrd file */
+ if (stristr($ifname, "ovpns")) {
+ if (!file_exists("$rrddbpath$ifname$vpnusers")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$vpnusers --step $rrdvpninterval ";
+ $rrdcreate .= "DS:users:GAUGE:$vpnvalid:0:10000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$vpnusers N:U");
+ }
+
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $server) {
+ if ("ovpns{$server['vpnid']}" == $ifname) {
+ $port = $server['local_port'];
+ $vpnid = $server['vpnid'];
+ }
+ }
+ }
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling vpn users for interface $ifname $realif port $port\n";
+ $rrdupdatesh .= "list_current_users() {\n";
+ $rrdupdatesh .= " sleep 0.2\n";
+ $rrdupdatesh .= " echo \"status 2\"\n";
+ $rrdupdatesh .= " sleep 0.2\n";
+ $rrdupdatesh .= " echo \"quit\"\n";
+ $rrdupdatesh .= "}\n";
+ $rrdupdatesh .= "OVPN=`list_current_users | nc -U {$g['varetc_path']}/openvpn/server{$vpnid}.sock | awk -F\",\" '/^CLIENT_LIST/ {print \$2}' | wc -l | awk '{print $1}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$vpnusers N:\${OVPN}\n";
+ }
+
+ /* QUEUES, set up the queues databases */
+ if ($altq_list_queues[$ifname]) {
+ $altq =& $altq_list_queues[$ifname];
+ /* NOTE: Is it worth as its own function?! */
+ switch ($altq->GetBwscale()) {
+ case "Gb":
+ $factor = 1024 * 1024 * 1024;
+ break;
+ case "Mb":
+ $factor = 1024 * 1024;
+ break;
+ case "Kb":
+ $factor = 1024;
+ break;
+ case "b":
+ default:
+ $factor = 1;
+ break;
+ }
+ $qbandwidth = $altq->GetBandwidth() * $factor;
+ if ($qbandwidth <= 0) {
+ $qbandwidth = 100 * 1000 * 1000; /* 100Mbit */
+ }
+ $qlist =& $altq->get_queue_list($notused);
+ if (!file_exists("$rrddbpath$ifname$queues")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$queues --step $rrdqueuesinterval ";
+ /* loop list of shaper queues */
+ $q = 0;
+ foreach ($qlist as $qname => $q) {
+ $rrdcreate .= "DS:$qname:COUNTER:$queuesvalid:0:$qbandwidth ";
+ }
+
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ if (!file_exists("$rrddbpath$ifname$queuesdrop")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$queuesdrop --step $rrdqueuesdropinterval ";
+ /* loop list of shaper queues */
+ $q = 0;
+ foreach ($qlist as $qname => $q) {
+ $rrdcreate .= "DS:$qname:COUNTER:$queuesdropvalid:0:$qbandwidth ";
+ }
+
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ if (platform_booting()) {
+ $rrdqcommand = "-t ";
+ $rrducommand = "N";
+ $qi = 0;
+ foreach ($qlist as $qname => $q) {
+ if ($qi == 0) {
+ $rrdqcommand .= "{$qname}";
+ } else {
+ $rrdqcommand .= ":{$qname}";
+ }
+ $qi++;
+ $rrducommand .= ":U";
+ }
+ mwexec("$rrdtool update $rrddbpath$ifname$queues $rrdqcommand $rrducommand");
+ mwexec("$rrdtool update $rrddbpath$ifname$queuesdrop $rrdqcommand $rrducommand");
+ }
+
+ /* awk function to gather shaper data */
+ /* yes, it's special */
+ $rrdupdatesh .= "` pfctl -vsq -i {$realif} | awk 'BEGIN {printf \"$rrdtool update $rrddbpath$ifname$queues \" } ";
+ $rrdupdatesh .= "{ ";
+ $rrdupdatesh .= "if ((\$1 == \"queue\") && ( \$2 ~ /^q/ )) { ";
+ $rrdupdatesh .= " dsname = dsname \":\" \$2 ; ";
+ $rrdupdatesh .= " q=1; ";
+ $rrdupdatesh .= "} ";
+ $rrdupdatesh .= " else if ((\$4 == \"bytes:\") && ( q == 1 ) ) { ";
+ $rrdupdatesh .= " dsdata = dsdata \":\" \$5 ; ";
+ $rrdupdatesh .= " q=0; ";
+ $rrdupdatesh .= "} ";
+ $rrdupdatesh .= "} END { ";
+ $rrdupdatesh .= " dsname = substr(dsname,2); ";
+ $rrdupdatesh .= " dsdata = substr(dsdata,2); ";
+ $rrdupdatesh .= " printf \"-t \" dsname \" N:\" dsdata }' ";
+ $rrdupdatesh .= " dsname=\"\" dsdata=\"\"`\n\n";
+
+ $rrdupdatesh .= "` pfctl -vsq -i {$realif} | awk 'BEGIN {printf \"$rrdtool update $rrddbpath$ifname$queuesdrop \" } ";
+ $rrdupdatesh .= "{ ";
+ $rrdupdatesh .= "if ((\$1 == \"queue\") && ( \$2 ~ /^q/ )) { ";
+ $rrdupdatesh .= " dsname = dsname \":\" \$2 ; ";
+ $rrdupdatesh .= " q=1; ";
+ $rrdupdatesh .= "} ";
+ $rrdupdatesh .= " else if ((\$4 == \"bytes:\") && ( q == 1 ) ) { ";
+ $rrdupdatesh .= " dsdata = dsdata \":\" \$8 ; ";
+ $rrdupdatesh .= " q=0; ";
+ $rrdupdatesh .= "} ";
+ $rrdupdatesh .= "} END { ";
+ $rrdupdatesh .= " dsname = substr(dsname,2); ";
+ $rrdupdatesh .= " dsdata = substr(dsdata,2); ";
+ $rrdupdatesh .= " printf \"-t \" dsname \" N:\" dsdata }' ";
+ $rrdupdatesh .= " dsname=\"\" dsdata=\"\"`\n\n";
+ }
+
+ /* 3G interfaces */
+ if (preg_match("/ppp[0-9]+/i", $realif)) {
+ if (!file_exists("$rrddbpath$ifname$cellular")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$cellular --step $rrdcellularinterval ";
+ $rrdcreate .= "DS:rssi:GAUGE:$cellularvalid:0:100 ";
+ $rrdcreate .= "DS:upstream:GAUGE:$cellularvalid:0:100000000 ";
+ $rrdcreate .= "DS:downstream:GAUGE:$cellularvalid:0:100000000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$cellular N:U:U:U");
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling 3G\n";
+ $rrdupdatesh .= "GSTATS=`awk -F, 'getline 2 {print \$2 \":\" \$8 \":\" \$9}' < /tmp/3gstats.$ifname`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$cellular N:\"\$GSTATS\"";
+ }
+
+ }
+ $i++;
+
+ /* System only statistics */
+ $ifname = "system";
+
+ /* STATES, create pf states database */
+ if (!file_exists("$rrddbpath$ifname$states")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$states --step $rrdstatesinterval ";
+ $rrdcreate .= "DS:pfrate:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "DS:pfstates:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "DS:pfnat:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "DS:srcip:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "DS:dstip:GAUGE:$statesvalid:0:10000000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$states N:U:U:U:U:U");
+ }
+
+ /* the pf states gathering function. */
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "pfctl_si_out=\"` $pfctl -si > /tmp/pfctl_si_out `\"\n";
+ $rrdupdatesh .= "pfctl_ss_out=\"` $pfctl -ss > /tmp/pfctl_ss_out`\"\n";
+ $rrdupdatesh .= "pfrate=\"` cat /tmp/pfctl_si_out | egrep \"inserts|removals\" | awk '{ pfrate = \$3 + pfrate } {print pfrate}'|tail -1 `\"\n";
+ $rrdupdatesh .= "pfstates=\"` cat /tmp/pfctl_ss_out | egrep -v \"<\\-.*?<\\-|\\->.*?\\->\" | wc -l|sed 's/ //g'`\"\n";
+ $rrdupdatesh .= "pfnat=\"` cat /tmp/pfctl_ss_out | egrep '<\\-.*?<\\-|\\->.*?\\->' | wc -l|sed 's/ //g' `\"\n";
+ $rrdupdatesh .= "srcip=\"` cat /tmp/pfctl_ss_out | egrep -v '<\\-.*?<\\-|\\->.*?\\->' | grep '\\->' | awk '{print \$3}' | awk -F: '{print \$1}' | sort -u|wc -l|sed 's/ //g' `\"\n";
+ $rrdupdatesh .= "dstip=\"` cat /tmp/pfctl_ss_out | egrep -v '<\\-.*?<\\-|\\->.*?\\->' | grep '<\\-' | awk '{print \$3}' | awk -F: '{print \$1}' | sort -u|wc -l|sed 's/ //g' `\"\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$states N:\$pfrate:\$pfstates:\$pfnat:\$srcip:\$dstip\n\n";
+
+ /* End pf states statistics */
+
+ /* CPU, create CPU statistics database */
+ if (!file_exists("$rrddbpath$ifname$proc")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$proc --step $rrdprocinterval ";
+ $rrdcreate .= "DS:user:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "DS:nice:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "DS:system:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "DS:interrupt:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "DS:processes:GAUGE:$procvalid:0:10000000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$proc N:U:U:U:U:U");
+ }
+
+ /* the CPU stats gathering function. */
+ $rrdupdatesh .= "CPU=`$cpustats | cut -f1-4 -d':'`\n";
+ /* Using ps uxaH will count all processes including system threads. Top was undercounting. */
+ $rrdupdatesh .= "PROCS=`ps uxaH | wc -l | awk '{print \$1;}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$proc N:\${CPU}:\${PROCS}\n";
+
+ /* End CPU statistics */
+
+ /* Memory, create Memory statistics database */
+ if (!file_exists("$rrddbpath$ifname$mem")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$mem --step $rrdmeminterval ";
+ $rrdcreate .= "DS:active:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "DS:inactive:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "DS:free:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "DS:cache:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "DS:wire:GAUGE:$memvalid:0:10000000 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$mem N:U:U:U:U:U");
+ }
+
+ /* the Memory stats gathering function. */
+ $rrdupdatesh .= "MEM=`$sysctl -n vm.stats.vm.v_page_count vm.stats.vm.v_active_count vm.stats.vm.v_inactive_count vm.stats.vm.v_free_count vm.stats.vm.v_cache_count vm.stats.vm.v_wire_count | ";
+ $rrdupdatesh .= " $awk '{getline active;getline inactive;getline free;getline cache;getline wire;printf ";
+ $rrdupdatesh .= "((active/$0) * 100)\":\"((inactive/$0) * 100)\":\"((free/$0) * 100)\":\"((cache/$0) * 100)\":\"(wire/$0 * 100)}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$mem N:\${MEM}\n";
+
+ /* End Memory statistics */
+
+ /* mbuf, create mbuf statistics database */
+ if (!file_exists("$rrddbpath$ifname$mbuf")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$mbuf --step $rrdmbufinterval ";
+ $rrdcreate .= "DS:current:GAUGE:$mbufvalid:0:10000000 ";
+ $rrdcreate .= "DS:cache:GAUGE:$mbufvalid:0:10000000 ";
+ $rrdcreate .= "DS:total:GAUGE:$mbufvalid:0:10000000 ";
+ $rrdcreate .= "DS:max:GAUGE:$mbufvalid:0:10000000 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ifname$mbuf N:U:U:U:U");
+ }
+
+ /* the mbuf stats gathering function. */
+ $rrdupdatesh .= "MBUF=`$netstat -m | ";
+ $rrdupdatesh .= " $awk '/mbuf clusters in use/ { gsub(/\//, \":\", $1); print $1; }'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$mbuf N:\${MBUF}\n";
+
+ /* End mbuf statistics */
+
+ /* SPAMD, set up the spamd rrd file */
+ if (isset($config['installedpackages']['spamdsettings']) &&
+ $config['installedpackages']['spamdsettings']['config'][0]['enablerrd']) {
+ /* set up the spamd rrd file */
+ if (!file_exists("$rrddbpath$ifname$spamd")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ifname$spamd --step $rrdspamdinterval ";
+ $rrdcreate .= "DS:conn:GAUGE:$spamdvalid:0:10000 ";
+ $rrdcreate .= "DS:time:GAUGE:$spamdvalid:0:86400 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling spamd for connections and tarpitness \n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$spamd \\\n";
+ $rrdupdatesh .= "`$php -q $spamd_gather`\n";
+
+ }
+ /* End System statistics */
+
+ /* Captive Portal statistics, set up the rrd file */
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cpkey => $cp) {
+ if (!isset($cp['enable'])) {
+ continue;
+ }
+
+ $ifname= "captiveportal";
+ $concurrent_filename = $rrddbpath . $ifname . '-' . $cpkey . $captiveportalconcurrent;
+ if (!file_exists("$concurrent_filename")) {
+ $rrdcreate = "$rrdtool create $concurrent_filename --step $rrdcaptiveportalinterval ";
+ $rrdcreate .= "DS:concurrentusers:GAUGE:$captiveportalvalid:0:10000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:LAST:0.5:1:1200 ";
+ $rrdcreate .= "RRA:LAST:0.5:5:720 ";
+ $rrdcreate .= "RRA:LAST:0.5:60:1860 ";
+ $rrdcreate .= "RRA:LAST:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $concurrent_filename N:U");
+ }
+
+ /* the Captive Portal stats gathering function. */
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling Captive Portal for number of concurrent users\n";
+ $rrdupdatesh .= "CP=`${php} -q ${captiveportal_gather} '${cpkey}' 'concurrent'`\n";
+ $rrdupdatesh .= "$rrdtool update $concurrent_filename \${CP}\n";
+
+ $loggedin_filename = $rrddbpath . $ifname . '-' . $cpkey . $captiveportalloggedin;
+ if (!file_exists("$loggedin_filename")) {
+ $rrdcreate = "$rrdtool create $loggedin_filename --step $rrdcaptiveportalinterval ";
+ $rrdcreate .= "DS:loggedinusers:GAUGE:$captiveportalvalid:0:10000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:LAST:0.5:1:1200 ";
+ $rrdcreate .= "RRA:LAST:0.5:5:720 ";
+ $rrdcreate .= "RRA:LAST:0.5:60:1860 ";
+ $rrdcreate .= "RRA:LAST:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $loggedin_filename N:U");
+ }
+
+ /* the Captive Portal stats gathering function. */
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "# polling Captive Portal for number of logged in users\n";
+ $rrdupdatesh .= "CP=`${php} -q ${captiveportal_gather} '${cpkey}' 'loggedin'`\n";
+ $rrdupdatesh .= "$rrdtool update $loggedin_filename \${CP}\n";
+
+ }
+ }
+ /* End Captive Portal statistics */
+
+ /* NTP, set up the ntpd rrd file */
+ if (isset($config['ntpd']['statsgraph'])) {
+ /* set up the ntpd rrd file */
+ if (!file_exists("$rrddbpath$ntpd")) {
+ $rrdcreate = "$rrdtool create $rrddbpath$ntpd --step $rrdntpdinterval ";
+ $rrdcreate .= "DS:offset:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:sjit:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:cjit:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:wander:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:freq:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "DS:disp:GAUGE:$ntpdvalid:0:1000 ";
+ $rrdcreate .= "RRA:MIN:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MIN:0.5:5:720 ";
+ $rrdcreate .= "RRA:MIN:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MIN:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+ $rrdcreate .= "RRA:MAX:0.5:1:1200 ";
+ $rrdcreate .= "RRA:MAX:0.5:5:720 ";
+ $rrdcreate .= "RRA:MAX:0.5:60:1860 ";
+ $rrdcreate .= "RRA:MAX:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ mwexec("$rrdtool update $rrddbpath$ntpd N:U:U:U:U:U:U");
+ }
+
+ /* the ntp stats gathering function. */
+ $rrdupdatesh .= "\n";
+ $rrdupdatesh .= "$ntpq -c rv | $awk 'BEGIN{ RS=\",\"}{ print }' >> /tmp/ntp-rrdstats.$$\n";
+ $rrdupdatesh .= "NOFFSET=`grep offset /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NFREQ=`grep frequency /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NSJIT=`grep sys_jitter /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NCJIT=`grep clk_jitter /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NWANDER=`grep clk_wander /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "NDISPER=`grep rootdisp /tmp/ntp-rrdstats.$$ | awk 'BEGIN{FS=\"=\"}{print $2}'`\n";
+ $rrdupdatesh .= "$rrdtool update $rrddbpath$ntpd \N:\${NOFFSET}:\${NSJIT}:\${NCJIT}:\${NWANDER}:\${NFREQ}:\${NDISPER}\n";
+ $rrdupdatesh .= "rm /tmp/ntp-rrdstats.$$\n";
+ $rrdupdatesh .= "\n";
+
+ }
+ /* End NTP statistics */
+
+ $rrdupdatesh .= "sleep 60\n";
+ $rrdupdatesh .= "done\n";
+ log_error(gettext("Creating rrd update script"));
+ /* write the rrd update script */
+ $updaterrdscript = "{$g['vardb_path']}/rrd/updaterrd.sh";
+ $fd = fopen("$updaterrdscript", "w");
+ fwrite($fd, "$rrdupdatesh");
+ fclose($fd);
+
+ unset($rrdupdatesh);
+
+ /* kill off traffic collectors */
+ kill_traffic_collector();
+
+ /* start traffic collector */
+ mwexec_bg("/usr/bin/nice -n20 /bin/sh $updaterrdscript");
+
+ } else {
+ /* kill off traffic collectors */
+ kill_traffic_collector();
+ }
+
+ $databases = glob("{$rrddbpath}/*.rrd");
+ foreach ($databases as $database) {
+ chown($database, "nobody");
+ }
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+
+}
+
+# Create gateway quality RRD with settings suitable for pfSense graph set.
+function create_gateway_quality_rrd($rrd_file) {
+ global $g;
+
+ $rrdinterval = 60;
+ $valid = $rrdinterval * 2;
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+
+ /* GATEWAY QUALITY, set up the rrd file */
+ if (!file_exists("$rrd_file")) {
+ $rrdcreate = "$rrdtool create $rrd_file --step $rrdinterval ";
+ $rrdcreate .= "DS:loss:GAUGE:$valid:0:100 ";
+ $rrdcreate .= "DS:delay:GAUGE:$valid:0:100000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1200 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:720 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1860 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1440:2284 ";
+
+ create_new_rrd($rrdcreate);
+ unset($rrdcreate);
+ }
+
+ /* enter UNKNOWN values in the RRD so it knows we rebooted. */
+ if (platform_booting()) {
+ if (!is_dir("{$g['vardb_path']}/rrd")) {
+ mkdir("{$g['vardb_path']}/rrd", 0775);
+ }
+
+ @chown("{$g['vardb_path']}/rrd", "nobody");
+
+ mwexec("$rrdtool update $rrd_file N:U:U");
+ }
+ unset($rrdtool, $rrdinterval, $valid, $rrd_file);
+}
+
+function kill_traffic_collector() {
+ global $g;
+
+ killbypid("{$g['varrun_path']}/updaterrd.sh.pid");
+}
+
+?>
diff --git a/src/etc/inc/sasl.inc b/src/etc/inc/sasl.inc
new file mode 100644
index 0000000..a9582da
--- /dev/null
+++ b/src/etc/inc/sasl.inc
@@ -0,0 +1,422 @@
+<?php
+/*
+ * sasl.php
+ *
+ * @(#) $Id: sasl.php,v 1.11 2005/10/31 18:43:27 mlemos Exp $
+ *
+ */
+
+define("SASL_INTERACT", 2);
+define("SASL_CONTINUE", 1);
+define("SASL_OK", 0);
+define("SASL_FAIL", -1);
+define("SASL_NOMECH", -4);
+
+class sasl_interact_class
+{
+ var $id;
+ var $challenge;
+ var $prompt;
+ var $default_result;
+ var $result;
+};
+
+/*
+{metadocument}<?xml version="1.0" encoding="ISO-8859-1" ?>
+<class>
+
+ <package>net.manuellemos.sasl</package>
+
+ <version>@(#) $Id: sasl.php,v 1.11 2005/10/31 18:43:27 mlemos Exp $</version>
+ <copyright>Copyright © (C) Manuel Lemos 2004</copyright>
+ <title>Simple Authentication and Security Layer client</title>
+ <author>Manuel Lemos</author>
+ <authoraddress>mlemos-at-acm.org</authoraddress>
+
+ <documentation>
+ <idiom>en</idiom>
+ <purpose>Provide a common interface to plug-in driver classes that
+ implement different mechanisms for authentication used by clients of
+ standard protocols like SMTP, POP3, IMAP, HTTP, etc.. Currently the
+ supported authentication mechanisms are: <tt>PLAIN</tt>,
+ <tt>LOGIN</tt>, <tt>CRAM-MD5</tt>, <tt>Digest</tt> and <tt>NTML</tt>
+ (Windows or Samba).</purpose>
+ <usage>.</usage>
+ </documentation>
+
+{/metadocument}
+*/
+
+class sasl_client_class
+{
+ /* Public variables */
+
+/*
+{metadocument}
+ <variable>
+ <name>error</name>
+ <type>STRING</type>
+ <value></value>
+ <documentation>
+ <purpose>Store the message that is returned when an error
+ occurs.</purpose>
+ <usage>Check this variable to understand what happened when a call to
+ any of the class functions has failed.<paragraphbreak />
+ This class uses cumulative error handling. This means that if one
+ class functions that may fail is called and this variable was
+ already set to an error message due to a failure in a previous call
+ to the same or other function, the function will also fail and does
+ not do anything.<paragraphbreak />
+ This allows programs using this class to safely call several
+ functions that may fail and only check the failure condition after
+ the last function call.<paragraphbreak />
+ Just set this variable to an empty string to clear the error
+ condition.</usage>
+ </documentation>
+ </variable>
+{/metadocument}
+*/
+ var $error='';
+
+/*
+{metadocument}
+ <variable>
+ <name>mechanism</name>
+ <type>STRING</type>
+ <value></value>
+ <documentation>
+ <purpose>Store the name of the mechanism that was selected during the
+ call to the <functionlink>Start</functionlink> function.</purpose>
+ <usage>You can access this variable but do not change it.</usage>
+ </documentation>
+ </variable>
+{/metadocument}
+*/
+ var $mechanism='';
+
+/*
+{metadocument}
+ <variable>
+ <name>encode_response</name>
+ <type>BOOLEAN</type>
+ <value>1</value>
+ <documentation>
+ <purpose>Let the drivers inform the applications whether responses
+ need to be encoded.</purpose>
+ <usage>Applications should check this variable before sending
+ authentication responses to the server to determine if the
+ responses need to be encoded, eventually with base64 algorithm.</usage>
+ </documentation>
+ </variable>
+{/metadocument}
+*/
+ var $encode_response=1;
+
+ /* Private variables */
+
+ var $driver;
+ var $drivers=array(
+ "Digest" => array("digest_sasl_client_class", "digest_sasl_client.inc" ),
+ "CRAM-MD5" => array("cram_md5_sasl_client_class", "cram_md5_sasl_client.inc" ),
+ "LOGIN" => array("login_sasl_client_class", "login_sasl_client.inc" ),
+ "NTLM" => array("ntlm_sasl_client_class", "ntlm_sasl_client.inc" ),
+ "PLAIN" => array("plain_sasl_client_class", "plain_sasl_client.inc" ),
+ "Basic" => array("basic_sasl_client_class", "basic_sasl_client.inc" )
+ );
+ var $credentials=array();
+
+ /* Public functions */
+
+/*
+{metadocument}
+ <function>
+ <name>SetCredential</name>
+ <type>VOID</type>
+ <documentation>
+ <purpose>Store the value of a credential that may be used by any of
+ the supported mechanisms to process the authentication messages and
+ responses.</purpose>
+ <usage>Call this function before starting the authentication dialog
+ to pass all the credential values that be needed to use the type
+ of authentication that the applications may need.</usage>
+ <returnvalue>.</returnvalue>
+ </documentation>
+ <argument>
+ <name>key</name>
+ <type>STRING</type>
+ <documentation>
+ <purpose>Specify the name of the credential key.</purpose>
+ </documentation>
+ </argument>
+ <argument>
+ <name>value</name>
+ <type>STRING</type>
+ <documentation>
+ <purpose>Specify the value for the credential.</purpose>
+ </documentation>
+ </argument>
+ <do>
+{/metadocument}
+*/
+ Function SetCredential($key,$value)
+ {
+ $this->credentials[$key]=$value;
+ }
+/*
+{metadocument}
+ </do>
+ </function>
+{/metadocument}
+*/
+
+/*
+{metadocument}
+ <function>
+ <name>GetCredentials</name>
+ <type>INTEGER</type>
+ <documentation>
+ <purpose>Retrieve the values of one or more credentials to be used by
+ the authentication mechanism classes.</purpose>
+ <usage>This is meant to be used by authentication mechanism driver
+ classes to retrieve the credentials that may be needed.</usage>
+ <returnvalue>The function may return <tt>SASL_CONTINUE</tt> if it
+ succeeded, or <tt>SASL_NOMECH</tt> if it was not possible to
+ retrieve one of the requested credentials.</returnvalue>
+ </documentation>
+ <argument>
+ <name>credentials</name>
+ <type>HASH</type>
+ <documentation>
+ <purpose>Reference to an associative array variable with all the
+ credentials that are being requested. The function initializes
+ this associative array values.</purpose>
+ </documentation>
+ </argument>
+ <argument>
+ <name>defaults</name>
+ <type>HASH</type>
+ <documentation>
+ <purpose>Associative arrays with default values for credentials
+ that may have not been defined.</purpose>
+ </documentation>
+ </argument>
+ <argument>
+ <name>interactions</name>
+ <type>ARRAY</type>
+ <documentation>
+ <purpose>Not yet in use. It is meant to provide context
+ information to retrieve credentials that may be obtained
+ interacting with the user.</purpose>
+ </documentation>
+ </argument>
+ <do>
+{/metadocument}
+*/
+ Function GetCredentials(&$credentials,$defaults,&$interactions)
+ {
+ Reset($credentials);
+ $end=(GetType($key=Key($credentials))!="string");
+ for(;!$end;)
+ {
+ if(!IsSet($this->credentials[$key]))
+ {
+ if(IsSet($defaults[$key]))
+ $credentials[$key]=$defaults[$key];
+ else
+ {
+ $this->error="the requested credential ".$key." is not defined";
+ return(SASL_NOMECH);
+ }
+ }
+ else
+ $credentials[$key]=$this->credentials[$key];
+ Next($credentials);
+ $end=(GetType($key=Key($credentials))!="string");
+ }
+ return(SASL_CONTINUE);
+ }
+/*
+{metadocument}
+ </do>
+ </function>
+{/metadocument}
+*/
+
+/*
+{metadocument}
+ <function>
+ <name>Start</name>
+ <type>INTEGER</type>
+ <documentation>
+ <purpose>Process the initial authentication step initializing the
+ driver class that implements the first of the list of requested
+ mechanisms that is supported by this SASL client library
+ implementation.</purpose>
+ <usage>Call this function specifying a list of mechanisms that the
+ server supports. If the <argumentlink>
+ <argument>message</argument>
+ <function>Start</function>
+ </argumentlink> argument returns a string, it should be sent to
+ the server as initial message. Check the
+ <variablelink>encode_response</variablelink> variable to determine
+ whether the initial message needs to be encoded, eventually with
+ base64 algorithm, before it is sent to the server.</usage>
+ <returnvalue>The function may return <tt>SASL_CONTINUE</tt> if it
+ could start one of the requested authentication mechanisms. It
+ may return <tt>SASL_NOMECH</tt> if it was not possible to start
+ any of the requested mechanisms. It returns <tt>SASL_FAIL</tt> or
+ other value in case of error.</returnvalue>
+ </documentation>
+ <argument>
+ <name>mechanisms</name>
+ <type>ARRAY</type>
+ <inout />
+ <documentation>
+ <purpose>Define the list of names of authentication mechanisms
+ supported by the that should be tried.</purpose>
+ </documentation>
+ </argument>
+ <argument>
+ <name>message</name>
+ <type>STRING</type>
+ <out />
+ <documentation>
+ <purpose>Return the initial message that should be sent to the
+ server to start the authentication dialog. If this value is
+ undefined, no message should be sent to the server.</purpose>
+ </documentation>
+ </argument>
+ <argument>
+ <name>interactions</name>
+ <type>ARRAY</type>
+ <documentation>
+ <purpose>Not yet in use. It is meant to provide context
+ information to interact with the end user.</purpose>
+ </documentation>
+ </argument>
+ <do>
+{/metadocument}
+*/
+ Function Start($mechanisms, &$message, &$interactions)
+ {
+ if(strlen($this->error))
+ return(SASL_FAIL);
+ if(IsSet($this->driver))
+ return($this->driver->Start($this,$message,$interactions));
+ $no_mechanism_error="";
+ for($m=0;$m<count($mechanisms);$m++)
+ {
+ $mechanism=$mechanisms[$m];
+ if(IsSet($this->drivers[$mechanism]))
+ {
+ if(!class_exists($this->drivers[$mechanism][0]))
+ require(dirname(__FILE__)."/".$this->drivers[$mechanism][1]);
+ $this->driver=new $this->drivers[$mechanism][0];
+ if($this->driver->Initialize($this))
+ {
+ $this->encode_response=1;
+ $status=$this->driver->Start($this,$message,$interactions);
+ switch($status)
+ {
+ case SASL_NOMECH:
+ Unset($this->driver);
+ if(strlen($no_mechanism_error)==0)
+ $no_mechanism_error=$this->error;
+ $this->error="";
+ break;
+ case SASL_CONTINUE:
+ $this->mechanism=$mechanism;
+ return($status);
+ default:
+ Unset($this->driver);
+ $this->error="";
+ return($status);
+ }
+ }
+ else
+ {
+ Unset($this->driver);
+ if(strlen($no_mechanism_error)==0)
+ $no_mechanism_error=$this->error;
+ $this->error="";
+ }
+ }
+ }
+ $this->error=(strlen($no_mechanism_error) ? $no_mechanism_error : "it was not requested any of the authentication mechanisms that are supported");
+ return(SASL_NOMECH);
+ }
+/*
+{metadocument}
+ </do>
+ </function>
+{/metadocument}
+*/
+
+/*
+{metadocument}
+ <function>
+ <name>Step</name>
+ <type>INTEGER</type>
+ <documentation>
+ <purpose>Process the authentication steps after the initial step,
+ until the authentication iteration dialog is complete.</purpose>
+ <usage>Call this function iteratively after a successful initial
+ step calling the <functionlink>Start</functionlink> function.</usage>
+ <returnvalue>The function returns <tt>SASL_CONTINUE</tt> if step was
+ processed successfully, or returns <tt>SASL_FAIL</tt> in case of
+ error.</returnvalue>
+ </documentation>
+ <argument>
+ <name>response</name>
+ <type>STRING</type>
+ <in />
+ <documentation>
+ <purpose>Pass the response returned by the server to the previous
+ step.</purpose>
+ </documentation>
+ </argument>
+ <argument>
+ <name>message</name>
+ <type>STRING</type>
+ <out />
+ <documentation>
+ <purpose>Return the message that should be sent to the server to
+ continue the authentication dialog. If this value is undefined,
+ no message should be sent to the server.</purpose>
+ </documentation>
+ </argument>
+ <argument>
+ <name>interactions</name>
+ <type>ARRAY</type>
+ <documentation>
+ <purpose>Not yet in use. It is meant to provide context
+ information to interact with the end user.</purpose>
+ </documentation>
+ </argument>
+ <do>
+{/metadocument}
+*/
+ Function Step($response, &$message, &$interactions)
+ {
+ if(strlen($this->error))
+ return(SASL_FAIL);
+ return($this->driver->Step($this,$response,$message,$interactions));
+ }
+/*
+{metadocument}
+ </do>
+ </function>
+{/metadocument}
+*/
+
+};
+
+/*
+
+{metadocument}
+</class>
+{/metadocument}
+
+*/
+
+?>
diff --git a/src/etc/inc/service-utils.inc b/src/etc/inc/service-utils.inc
new file mode 100644
index 0000000..77a7914
--- /dev/null
+++ b/src/etc/inc/service-utils.inc
@@ -0,0 +1,749 @@
+<?php
+/****h* pfSense/service-utils
+ NAME
+ service-utils.inc - Service facility
+ DESCRIPTION
+ This file contains various functions used by the pfSense service facility.
+ HISTORY
+ $Id$
+
+ Copyright (C) 2005-2006 Colin Smith (ethethlay@gmail.com)
+ All rights reserved.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ RISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ */
+
+/*
+ pfSense_BUILDER_BINARIES: /bin/pgrep /bin/sh /usr/bin/killall
+ pfSense_MODULE: utils
+*/
+require_once("globals.inc");
+require_once("captiveportal.inc");
+require_once("openvpn.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+require_once("vslb.inc");
+require_once("gwlb.inc");
+
+define("RCFILEPREFIX", "/usr/local/etc/rc.d/");
+function write_rcfile($params) {
+ global $g;
+
+ safe_mkdir(RCFILEPREFIX);
+ $rcfile_fullname = RCFILEPREFIX . $params['file'];
+ if (!file_exists($rcfile_fullname) && !is_link($rcfile_fullname) && !touch($rcfile_fullname)) {
+ return false;
+ }
+
+ if (!is_writable($rcfile_fullname) || empty($params['start'])) {
+ return false;
+ }
+
+ $towrite = "#!/bin/sh\n";
+ $towrite .= "# This file was automatically generated\n# by the {$g['product_name']} service handler.\n\n";
+
+ /* write our rc functions */
+ $towrite .= "rc_start() {\n";
+ $towrite .= "\t{$params['start']}\n";
+ $towrite .= "}\n\n";
+ if (!empty($params['stop'])) {
+ $tokill =& $params['stop'];
+ } else if (!empty($params['executable'])) {
+ /* just nuke the executable */
+ $tokill = "/usr/bin/killall " . escapeshellarg($params['executable']);
+ } else {
+ /* make an educated guess (bad) */
+ $tokill = array_pop(explode('/', array_shift(explode(' ', $params['start']))));
+ }
+ $towrite .= "rc_stop() {\n";
+ $towrite .= "\t{$tokill}\n";
+ $towrite .= "}\n\n";
+
+ /* begin rcfile logic */
+ $towrite .= "case \$1 in\n\tstart)\n\t\trc_start\n\t\t;;\n\tstop)\n\t\trc_stop\n\t\t;;\n\trestart)\n\t\trc_stop\n\t\trc_start\n\t\t;;\nesac\n\n";
+
+ @file_put_contents($rcfile_fullname, $towrite);
+ unset($towrite);
+ @chmod("{$rcfile_fullname}", 0755);
+
+ return;
+}
+
+function start_service($name) {
+ global $config;
+
+ if (empty($name)) {
+ return;
+ }
+
+ if (is_array($config['installedpackages']) && is_array($config['installedpackages']['service'])) {
+ foreach ($config['installedpackages']['service'] as $service) {
+ if (strtolower($service['name']) == strtolower($name)) {
+ if ($service['rcfile']) {
+ $prefix = RCFILEPREFIX;
+ if (!empty($service['prefix'])) {
+ $prefix =& $service['prefix'];
+ }
+ if (file_exists("{$prefix}{$service['rcfile']}") || is_link("{$prefix}{$service['rcfile']}")) {
+ mwexec_bg("{$prefix}{$service['rcfile']} start");
+ }
+ }
+ if (!empty($service['startcmd'])) {
+ eval($service['startcmd']);
+ }
+ break;
+ }
+ }
+ }
+}
+
+function stop_service($name) {
+ global $config;
+
+ if (empty($name)) {
+ return;
+ }
+
+ if (is_array($config['installedpackages']) && is_array($config['installedpackages']['service'])) {
+ foreach ($config['installedpackages']['service'] as $service) {
+ if (strtolower($service['name']) == strtolower($name)) {
+ if ($service['rcfile']) {
+ $prefix = RCFILEPREFIX;
+ if (!empty($service['prefix'])) {
+ $prefix =& $service['prefix'];
+ }
+ if (file_exists("{$prefix}{$service['rcfile']}") || is_link("{$prefix}{$service['rcfile']}")) {
+ mwexec("{$prefix}{$service['rcfile']} stop");
+ }
+ return;
+ }
+ if (!empty($service['stopcmd'])) {
+ eval($service['stopcmd']);
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+function restart_service($name) {
+ global $config;
+
+ if (empty($name)) {
+ return;
+ }
+
+ stop_service($name);
+ start_service($name);
+
+ if (is_array($config['installedpackages']) && is_array($config['installedpackages']['service'])) {
+ foreach ($config['installedpackages']['service'] as $service) {
+ if (strtolower($service['name']) == strtolower($name)) {
+ if ($service['restartcmd']) {
+ eval($service['restartcmd']);
+ }
+ break;
+ }
+ }
+ }
+}
+
+function is_pid_running($pidfile) {
+ if (!file_exists($pidfile)) {
+ return false;
+ }
+
+ return (isvalidpid($pidfile));
+}
+
+function is_dhcp_running($interface) {
+ $status = find_dhclient_process($interface);
+ if ($status != 0) {
+ return true;
+ }
+ return false;
+}
+
+function restart_service_if_running($service) {
+ global $config;
+ if (is_service_running($service)) {
+ restart_service($service);
+ }
+ return;
+}
+
+function is_service_enabled($service_name) {
+ global $config;
+ if ($service_name == "") {
+ return false;
+ }
+ if (is_array($config['installedpackages'])) {
+ if (isset($config['installedpackages'][$service_name]['config'][0]['enable']) &&
+ ((empty($config['installedpackages'][$service_name]['config'][0]['enable'])) ||
+ ($config['installedpackages'][$service_name]['config'][0]['enable'] === 'off'))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function is_service_running($service, $ps = "") {
+ global $config;
+
+ if (is_array($config['installedpackages']['service'])) {
+ foreach ($config['installedpackages']['service'] as $aservice) {
+ if (strtolower($service) == strtolower($aservice['name'])) {
+ if ($aservice['custom_php_service_status_command'] <> "") {
+ eval("\$rc={$aservice['custom_php_service_status_command']};");
+ return $rc;
+ }
+ if (empty($aservice['executable'])) {
+ return false;
+ }
+ if (is_process_running($aservice['executable'])) {
+ return true;
+ }
+
+ return false;
+ }
+ }
+ }
+
+ if (is_process_running($service)) {
+ return true;
+ }
+
+ return false;
+}
+
+function get_services() {
+ global $config;
+ if (is_array($config['installedpackages']['service'])) {
+ $services = $config['installedpackages']['service'];
+ } else {
+ $services = array();
+ }
+
+ /*
+ * Add services that are in the base.
+ */
+ if (is_radvd_enabled()) {
+ $pconfig = array();
+ $pconfig['name'] = "radvd";
+ $pconfig['description'] = gettext("Router Advertisement Daemon");
+ $services[] = $pconfig;
+ }
+
+ if (isset($config['dnsmasq']['enable'])) {
+ $pconfig = array();
+ $pconfig['name'] = "dnsmasq";
+ $pconfig['description'] = gettext("DNS Forwarder");
+ $services[] = $pconfig;
+ }
+
+ if (isset($config['unbound']['enable'])) {
+ $pconfig = array();
+ $pconfig['name'] = "unbound";
+ $pconfig['description'] = gettext("DNS Resolver");
+ $services[] = $pconfig;
+ }
+
+ $pconfig = array();
+ $pconfig['name'] = "ntpd";
+ $pconfig['description'] = gettext("NTP clock sync");
+ $services[] = $pconfig;
+
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $zone => $setting) {
+ if (isset($setting['enable'])) {
+ $pconfig = array();
+ $pconfig['name'] = "captiveportal";
+ $pconfig['zone'] = $zone;
+ $pconfig['description'] = gettext("Captive Portal") . ": ".htmlspecialchars($setting['zone']);
+ $services[] = $pconfig;
+ }
+ }
+ }
+
+ $iflist = array();
+ $ifdescrs = get_configured_interface_list();
+ foreach ($ifdescrs as $if) {
+ $oc = $config['interfaces'][$if];
+ if ($oc['if'] && (!link_interface_to_bridge($if))) {
+ $iflist[$if] = $if;
+ }
+ }
+
+ if (isset($config['dhcrelay']['enable'])) {
+ $pconfig = array();
+ $pconfig['name'] = "dhcrelay";
+ $pconfig['description'] = gettext("DHCP Relay");
+ $services[] = $pconfig;
+ }
+
+ if (isset($config['dhcrelay6']['enable'])) {
+ $pconfig = array();
+ $pconfig['name'] = "dhcrelay6";
+ $pconfig['description'] = gettext("DHCPv6 Relay");
+ $services[] = $pconfig;
+ }
+
+ if (is_dhcp_server_enabled()) {
+ $pconfig = array();
+ $pconfig['name'] = "dhcpd";
+ $pconfig['description'] = gettext("DHCP Service");
+ $services[] = $pconfig;
+ }
+
+ $gateways_arr = return_gateways_array();
+ if (is_array($gateways_arr)) {
+ $pconfig = array();
+ $pconfig['name'] = "apinger";
+ $pconfig['description'] = gettext("Gateway Monitoring Daemon");
+ $services[] = $pconfig;
+ }
+
+ if (isset($config['snmpd']['enable'])) {
+ $pconfig = array();
+ $pconfig['name'] = "bsnmpd";
+ $pconfig['description'] = gettext("SNMP Service");
+ $services[] = $pconfig;
+ }
+
+ if (is_array($config['igmpproxy']['igmpentry']) && (count($config['igmpproxy']['igmpentry']) > 0)) {
+ $pconfig = array();
+ $pconfig['name'] = "igmpproxy";
+ $pconfig['description'] = gettext("IGMP proxy");
+ $services[] = $pconfig;
+ }
+
+ if (isset($config['installedpackages']['miniupnpd']) && $config['installedpackages']['miniupnpd']['config'][0]['enable']) {
+ $pconfig = array();
+ $pconfig['name'] = "miniupnpd";
+ $pconfig['description'] = gettext("UPnP Service");
+ $services[] = $pconfig;
+ }
+
+ if (isset($config['installedpackages']['routed']) && $config['installedpackages']['routed']['config'][0]['enable']) {
+ $pconfig = array();
+ $pconfig['name'] = "routed";
+ $pconfig['description'] = gettext("RIP Daemon");
+ $services[] = $pconfig;
+ }
+
+ if (isset($config['ipsec']['enable'])) {
+ $pconfig = array();
+ $pconfig['name'] = "ipsec";
+ $pconfig['description'] = gettext("IPsec VPN");
+ $services[] = $pconfig;
+ }
+
+ if (isset($config['system']['enablesshd'])) {
+ $pconfig = array();
+ $pconfig['name'] = "sshd";
+ $pconfig['description'] = gettext("Secure Shell Daemon");
+ $services[] = $pconfig;
+ }
+
+ foreach (array('server', 'client') as $mode) {
+ if (is_array($config['openvpn']["openvpn-{$mode}"])) {
+ foreach ($config['openvpn']["openvpn-{$mode}"] as $id => $setting) {
+ if (!isset($setting['disable'])) {
+ $pconfig = array();
+ $pconfig['name'] = "openvpn";
+ $pconfig['mode'] = $mode;
+ $pconfig['id'] = $id;
+ $pconfig['vpnid'] = $setting['vpnid'];
+ $pconfig['description'] = gettext("OpenVPN") . " ".$mode.": ".htmlspecialchars($setting['description']);
+ $services[] = $pconfig;
+ }
+ }
+ }
+ }
+
+ if (count($config['load_balancer']['virtual_server']) && count($config['load_balancer']['lbpool'])) {
+ $pconfig = array();
+ $pconfig['name'] = "relayd";
+ $pconfig['description'] = gettext("Server load balancing daemon");
+ $services[] = $pconfig;
+ }
+ return $services;
+}
+
+function find_service_by_name($name) {
+ $services = get_services();
+ foreach ($services as $service) {
+ if ($service["name"] == $name) {
+ return $service;
+ }
+ }
+ return array();
+}
+
+function find_service_by_openvpn_vpnid($vpnid) {
+ $services = get_services();
+ foreach ($services as $service) {
+ if (($service["name"] == "openvpn") && isset($service["vpnid"]) && ($service["vpnid"] == $vpnid)) {
+ return $service;
+ }
+ }
+ return array();
+}
+
+function find_service_by_cp_zone($zone) {
+ $services = get_services();
+ foreach ($services as $service) {
+ if (($service["name"] == "captiveportal") && isset($service["zone"]) && ($service["zone"] == $zone)) {
+ return $service;
+ }
+ }
+ return array();
+}
+
+function service_name_compare($a, $b) {
+ if (strtolower($a['name']) == strtolower($b['name'])) {
+ return 0;
+ }
+ return (strtolower($a['name']) < strtolower($b['name'])) ? -1 : 1;
+}
+
+function get_pkg_descr($package_name) {
+ global $config;
+ if (is_array($config['installedpackages']['package'])) {
+ foreach ($config['installedpackages']['package'] as $pkg) {
+ if ($pkg['name'] == $package_name) {
+ return $pkg['descr'];
+ }
+ }
+ }
+ return gettext("Not available.");
+}
+
+function get_service_status($service) {
+ global $g;
+ switch ($service['name']) {
+ case "openvpn":
+ $running = is_pid_running("{$g['varrun_path']}/openvpn_{$service['mode']}{$service['vpnid']}.pid");
+ break;
+ case "captiveportal":
+ $running = is_pid_running("{$g['varrun_path']}/lighty-{$service['zone']}-CaptivePortal.pid");
+ if (isset($config['captiveportal'][$service['zone']]['httpslogin'])) {
+ $running = $running && is_pid_running("{$g['varrun_path']}/lighty-{$service['zone']}-CaptivePortal-SSL.pid");
+ }
+ break;
+ case "vhosts-http":
+ $running = is_pid_running("{$g['varrun_path']}/vhosts-http.pid");
+ break;
+ case "dhcrelay6":
+ $running = is_pid_running("{$g['varrun_path']}/dhcrelay6.pid");
+ break;
+ case 'ipsec':
+ $running = is_pid_running("{$g['varrun_path']}/charon.pid");
+ break;
+ default:
+ $running = is_service_running($service['name']);
+ }
+ return $running;
+}
+
+function get_service_status_icon($service, $withtext = true, $smallicon = false) {
+ global $g;
+ $output = "";
+ if (get_service_status($service)) {
+ $statustext = gettext("Running");
+ $output .= "<img style=\"vertical-align:middle\" title=\"" . sprintf(gettext("%s Service is"), $service["name"]) . " {$statustext}\" src=\"/themes/" . $g["theme"] . "/images/icons/";
+ $output .= ($smallicon) ? "icon_pass.gif" : "icon_service_running.gif";
+ $output .= "\" alt=\"status\" />&nbsp;";
+ if ($withtext) {
+ $output .= "&nbsp;" . $statustext;
+ }
+ } else {
+ $service_enabled = is_service_enabled($service['name']);
+ $statustext = ($service_enabled) ? gettext("Stopped") : gettext("Disabled");
+ $output .= "<img style=\"vertical-align:middle\" title=\"" . sprintf(gettext("%s Service is"), $service["name"]) . " {$statustext}\" src=\"/themes/" . $g["theme"] . "/images/icons/";
+ $output .= ($smallicon) ? "icon_block.gif" : "icon_service_stopped.gif";
+ $output .= "\" alt=\"status\" />&nbsp;";
+ if ($withtext) {
+ $output .= "&nbsp;<font color=\"white\">{$statustext}</font>";
+ }
+ }
+ return $output;
+}
+
+function get_service_control_links($service, $addname = false) {
+ global $g;
+ $output = "";
+ $stitle = ($addname) ? $service['name'] . " " : "";
+ if (get_service_status($service)) {
+ switch ($service['name']) {
+ case "openvpn":
+ $output .= "<a href='status_services.php?mode=restartservice&amp;service={$service['name']}&amp;vpnmode={$service['mode']}&amp;id={$service['vpnid']}'>";
+ break;
+ case "captiveportal":
+ $output .= "<a href='status_services.php?mode=restartservice&amp;service={$service['name']}&amp;zone={$service['zone']}'>";
+ break;
+ default:
+ $output .= "<a href='status_services.php?mode=restartservice&amp;service={$service['name']}'>";
+ }
+ $output .= "<img style=\"vertical-align:middle\" title='" . sprintf(gettext("Restart %sService"), $stitle) . "' border='0' src='/themes/".$g['theme']."/images/icons/icon_service_restart.gif' alt='restart' /></a>\n";
+ switch ($service['name']) {
+ case "openvpn":
+ $output .= "<a href='status_services.php?mode=stopservice&amp;service={$service['name']}&amp;vpnmode={$service['mode']}&amp;id={$service['vpnid']}'>";
+ break;
+ case "captiveportal":
+ $output .= "<a href='status_services.php?mode=stopservice&amp;service={$service['name']}&amp;zone={$service['zone']}'>";
+ break;
+ default:
+ $output .= "<a href='status_services.php?mode=stopservice&amp;service={$service['name']}'>";
+ }
+ $output .= "<img style=\"vertical-align:middle\" title='" . sprintf(gettext("Stop %sService"), $stitle) . "' border='0' src='/themes/".$g['theme']."/images/icons/icon_service_stop.gif' alt='stop' />";
+ $output .= "</a>";
+ } else {
+ $service_enabled = is_service_enabled($service['name']);
+ switch ($service['name']) {
+ case "openvpn":
+ $output .= "<a href='status_services.php?mode=startservice&amp;service={$service['name']}&amp;vpnmode={$service['mode']}&amp;id={$service['vpnid']}'>";
+ break;
+ case "captiveportal":
+ $output .= "<a href='status_services.php?mode=startservice&amp;service={$service['name']}&amp;zone={$service['zone']}'>";
+ break;
+ default:
+ if ($service_enabled) {
+ $output .= "<a href='status_services.php?mode=startservice&amp;service={$service['name']}'>";
+ }
+ }
+ if ($service_enabled) {
+ $output .= "<img style=\"vertical-align:middle\" title='" . sprintf(gettext("Start %sService"), $stitle) . "' border='0' src='/themes/".$g['theme']."/images/icons/icon_service_start.gif' alt='start' /></a>\n";
+ }
+ }
+ return $output;
+}
+
+function service_control_start($name, $extras) {
+ global $g;
+ switch ($name) {
+ case 'radvd':
+ services_radvd_configure();
+ break;
+ case 'captiveportal':
+ $zone = htmlspecialchars($extras['zone']);
+ captiveportal_init_webgui_zonename($zone);
+ break;
+ case 'ntpd':
+ case 'openntpd':
+ system_ntp_configure();
+ break;
+ case 'apinger':
+ setup_gateways_monitor();
+ break;
+ case 'bsnmpd':
+ services_snmpd_configure();
+ break;
+ case 'dhcrelay':
+ services_dhcrelay_configure();
+ break;
+ case 'dhcrelay6':
+ services_dhcrelay6_configure();
+ break;
+ case 'dnsmasq':
+ services_dnsmasq_configure();
+ break;
+ case 'unbound':
+ services_unbound_configure();
+ break;
+ case 'dhcpd':
+ services_dhcpd_configure();
+ break;
+ case 'igmpproxy':
+ services_igmpproxy_configure();
+ break;
+ case 'miniupnpd':
+ upnp_action('start');
+ break;
+ case 'ipsec':
+ vpn_ipsec_force_reload();
+ break;
+ case 'sshd':
+ send_event("service restart sshd");
+ break;
+ case 'openvpn':
+ $vpnmode = isset($extras['vpnmode']) ? htmlspecialchars($extras['vpnmode']) : htmlspecialchars($extras['mode']);
+ if (($vpnmode == "server") || ($vpnmode == "client")) {
+ $id = isset($extras['vpnid']) ? htmlspecialchars($extras['vpnid']) : htmlspecialchars($extras['id']);
+ $configfile = "{$g['varetc_path']}/openvpn/{$vpnmode}{$id}.conf";
+ if (file_exists($configfile)) {
+ openvpn_restart_by_vpnid($vpnmode, $id);
+ }
+ }
+ break;
+ case 'relayd':
+ relayd_configure();
+ break;
+ default:
+ start_service($name);
+ break;
+ }
+ return sprintf(gettext("%s has been started."), htmlspecialchars($name));
+}
+function service_control_stop($name, $extras) {
+ global $g;
+ switch ($name) {
+ case 'radvd':
+ killbypid("{$g['varrun_path']}/radvd.pid");
+ break;
+ case 'captiveportal':
+ $zone = htmlspecialchars($extras['zone']);
+ killbypid("{$g['varrun_path']}/lighty-{$zone}-CaptivePortal.pid");
+ killbypid("{$g['varrun_path']}/lighty-{$zone}-CaptivePortal-SSL.pid");
+ break;
+ case 'ntpd':
+ killbyname("ntpd");
+ break;
+ case 'openntpd':
+ killbyname("openntpd");
+ break;
+ case 'apinger':
+ killbypid("{$g['varrun_path']}/apinger.pid");
+ break;
+ case 'bsnmpd':
+ killbypid("{$g['varrun_path']}/snmpd.pid");
+ break;
+ case 'choparp':
+ killbyname("choparp");
+ break;
+ case 'dhcpd':
+ killbyname("dhcpd");
+ break;
+ case 'dhcrelay':
+ killbypid("{$g['varrun_path']}/dhcrelay.pid");
+ break;
+ case 'dhcrelay6':
+ killbypid("{$g['varrun_path']}/dhcrelay6.pid");
+ break;
+ case 'dnsmasq':
+ killbypid("{$g['varrun_path']}/dnsmasq.pid");
+ break;
+ case 'unbound':
+ killbypid("{$g['varrun_path']}/unbound.pid");
+ break;
+ case 'igmpproxy':
+ killbyname("igmpproxy");
+ break;
+ case 'miniupnpd':
+ upnp_action('stop');
+ break;
+ case 'sshd':
+ killbyname("sshd");
+ break;
+ case 'ipsec':
+ exec("/usr/local/sbin/ipsec stop");
+ break;
+ case 'openvpn':
+ $vpnmode = htmlspecialchars($extras['vpnmode']);
+ if (($vpnmode == "server") or ($vpnmode == "client")) {
+ $id = htmlspecialchars($extras['id']);
+ $pidfile = "{$g['varrun_path']}/openvpn_{$vpnmode}{$id}.pid";
+ killbypid($pidfile);
+ }
+ break;
+ case 'relayd':
+ mwexec('pkill relayd');
+ break;
+ default:
+ stop_service($name);
+ break;
+ }
+ return sprintf(gettext("%s has been stopped."), htmlspecialchars($name));
+}
+
+function service_control_restart($name, $extras) {
+ global $g;
+ switch ($name) {
+ case 'radvd':
+ services_radvd_configure();
+ break;
+ case 'captiveportal':
+ $zone = htmlspecialchars($extras['zone']);
+ killbypid("{$g['varrun_path']}/lighty-{$zone}-CaptivePortal.pid");
+ killbypid("{$g['varrun_path']}/lighty-{$zone}-CaptivePortal-SSL.pid");
+ captiveportal_init_webgui_zonename($zone);
+ break;
+ case 'ntpd':
+ case 'openntpd':
+ system_ntp_configure();
+ break;
+ case 'apinger':
+ killbypid("{$g['varrun_path']}/apinger.pid");
+ setup_gateways_monitor();
+ break;
+ case 'bsnmpd':
+ services_snmpd_configure();
+ break;
+ case 'dhcrelay':
+ services_dhcrelay_configure();
+ break;
+ case 'dhcrelay6':
+ services_dhcrelay6_configure();
+ break;
+ case 'dnsmasq':
+ services_dnsmasq_configure();
+ break;
+ case 'unbound':
+ services_unbound_configure();
+ break;
+ case 'dhcpd':
+ services_dhcpd_configure();
+ break;
+ case 'igmpproxy':
+ services_igmpproxy_configure();
+ break;
+ case 'miniupnpd':
+ upnp_action('restart');
+ break;
+ case 'ipsec':
+ vpn_ipsec_force_reload();
+ break;
+ case 'sshd':
+ send_event("service restart sshd");
+ break;
+ case 'openvpn':
+ $vpnmode = htmlspecialchars($extras['vpnmode']);
+ if ($vpnmode == "server" || $vpnmode == "client") {
+ $id = htmlspecialchars($extras['id']);
+ $configfile = "{$g['varetc_path']}/openvpn/{$vpnmode}{$id}.conf";
+ if (file_exists($configfile)) {
+ openvpn_restart_by_vpnid($vpnmode, $id);
+ }
+ }
+ break;
+ case 'relayd':
+ relayd_configure(true);
+ break;
+ default:
+ restart_service($name);
+ break;
+ }
+ return sprintf(gettext("%s has been restarted."), htmlspecialchars($name));
+}
+
+?>
diff --git a/src/etc/inc/services.inc b/src/etc/inc/services.inc
new file mode 100644
index 0000000..c254c35
--- /dev/null
+++ b/src/etc/inc/services.inc
@@ -0,0 +1,2541 @@
+<?php
+/*
+ services.inc
+ part of the pfSense project (https://www.pfsense.org)
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2010 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/killall /bin/pgrep /bin/sh /usr/local/sbin/dhcpd /usr/local/sbin/igmpproxy
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig /usr/local/sbin/dnsmasq
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/miniupnpd /usr/sbin/radvd
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/dhcleases6 /usr/sbin/bsnmpd
+ pfSense_MODULE: utils
+*/
+
+define('DYNDNS_PROVIDER_VALUES', 'citynetwork cloudflare custom custom-v6 dhs dnsexit dnsimple dnsmadeeasy dnsomatic dyndns dyndns-custom dyndns-static dyns easydns eurodns freedns glesys googledomains gratisdns he-net he-net-v6 he-net-tunnelbroker loopia namecheap noip noip-free ods opendns ovh-dynhost route53 selfhost zoneedit');
+define('DYNDNS_PROVIDER_DESCRIPTIONS', 'City Network,CloudFlare,Custom,Custom (v6),DHS,DNSexit,DNSimple,DNS Made Easy,DNS-O-Matic,DynDNS (dynamic),DynDNS (custom),DynDNS (static),DyNS,easyDNS,Euro Dns,freeDNS,GleSYS,Google Domains,GratisDNS,HE.net,HE.net (v6),HE.net Tunnelbroker,Loopia,Namecheap,No-IP,No-IP (free),ODS.org,OpenDNS,OVH DynHOST,Route 53,SelfHost,ZoneEdit');
+
+/* implement ipv6 route advertising daemon */
+function services_radvd_configure($blacklist = array()) {
+ global $config, $g;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_radvd_configure() being called $mt\n";
+ }
+
+ if (!is_array($config['dhcpdv6'])) {
+ $config['dhcpdv6'] = array();
+ }
+
+ $Iflist = get_configured_interface_list();
+ $Iflist = array_merge($Iflist, get_configured_pppoe_server_interfaces());
+ $carplist = get_configured_carp_interface_list();
+
+ $radvdconf = "# Automatically Generated, do not edit\n";
+
+ /* Process all links which need the router advertise daemon */
+ $radvdifs = array();
+
+ /* handle manually configured DHCP6 server settings first */
+ foreach ($config['dhcpdv6'] as $dhcpv6if => $dhcpv6ifconf) {
+ if (!is_array($config['interfaces'][$dhcpv6if])) {
+ continue;
+ }
+ if (!isset($config['interfaces'][$dhcpv6if]['enable'])) {
+ continue;
+ }
+
+ /* Do not put in the config an interface which is down */
+ if (isset($blacklist[$dhcpv6if])) {
+ continue;
+ }
+ if (!isset($dhcpv6ifconf['ramode'])) {
+ $dhcpv6ifconf['ramode'] = $dhcpv6ifconf['mode'];
+ }
+
+ /* are router advertisements enabled? */
+ if ($dhcpv6ifconf['ramode'] == "disabled") {
+ continue;
+ }
+
+ if (!isset($dhcpv6ifconf['rapriority'])) {
+ $dhcpv6ifconf['rapriority'] = "medium";
+ }
+
+ /* always start with the real parent, we override with the carp if later */
+ $carpif = false;
+ /* check if we need to listen on a CARP interface */
+ if (!empty($dhcpv6ifconf['rainterface'])) {
+ if (!empty($carplist[$dhcpv6ifconf['rainterface']])) {
+ $dhcpv6if = $dhcpv6ifconf['rainterface'];
+ $carpif = true;
+ }
+ }
+
+ if (strstr($dhcpv6if, "_vip")) {
+ // CARP IP, check if it's enabled and find parent
+ if (!get_carp_status() || get_carp_interface_status($dhcpv6if) != "MASTER") {
+ continue;
+ }
+ $ifparent = link_carp_interface_to_parent($dhcpv6if);
+ $realif = convert_friendly_interface_to_real_interface_name($ifparent);
+ } else {
+ $realif = get_real_interface($dhcpv6if, "inet6");
+ }
+
+ if (isset($radvdifs[$realif])) {
+ continue;
+ }
+
+ $ifcfgipv6 = get_interface_ipv6($dhcpv6if);
+ if (!is_ipaddrv6($ifcfgipv6)) {
+ continue;
+ }
+
+ $ifcfgsnv6 = get_interface_subnetv6($dhcpv6if);
+ $subnetv6 = gen_subnetv6($ifcfgipv6, $ifcfgsnv6);
+ $radvdifs[$realif] = $realif;
+
+ $radvdconf .= "# Generated for DHCPv6 Server $dhcpv6if\n";
+ $radvdconf .= "interface {$realif} {\n";
+ if (strstr($realif, "ovpn")) {
+ $radvdconf .= "\tUnicastOnly on;\n";
+ }
+ $radvdconf .= "\tAdvSendAdvert on;\n";
+ $radvdconf .= "\tMinRtrAdvInterval 5;\n";
+ $radvdconf .= "\tMaxRtrAdvInterval 20;\n";
+ $mtu = get_interface_mtu($realif);
+ if (is_numeric($mtu)) {
+ $radvdconf .= "\tAdvLinkMTU {$mtu};\n";
+ } else {
+ $radvdconf .= "\tAdvLinkMTU 1280;\n";
+ }
+ // $radvdconf .= "\tDeprecatePrefix on;\n";
+ switch ($dhcpv6ifconf['rapriority']) {
+ case "low":
+ $radvdconf .= "\tAdvDefaultPreference low;\n";
+ break;
+ case "high":
+ $radvdconf .= "\tAdvDefaultPreference high;\n";
+ break;
+ default:
+ $radvdconf .= "\tAdvDefaultPreference medium;\n";
+ break;
+ }
+ switch ($dhcpv6ifconf['ramode']) {
+ case "managed":
+ case "assist":
+ $radvdconf .= "\tAdvManagedFlag on;\n";
+ $radvdconf .= "\tAdvOtherConfigFlag on;\n";
+ break;
+ case "stateless_dhcp":
+ $radvdconf .= "\tAdvManagedFlag off;\n";
+ $radvdconf .= "\tAdvOtherConfigFlag on;\n";
+ break;
+ }
+ $radvdconf .= "\tprefix {$subnetv6}/{$ifcfgsnv6} {\n";
+ if ($carpif == true) {
+ $radvdconf .= "\t\tDeprecatePrefix off;\n";
+ } else {
+ $radvdconf .= "\t\tDeprecatePrefix on;\n";
+ }
+ switch ($dhcpv6ifconf['ramode']) {
+ case "managed":
+ $radvdconf .= "\t\tAdvOnLink on;\n";
+ $radvdconf .= "\t\tAdvAutonomous off;\n";
+ $radvdconf .= "\t\tAdvRouterAddr on;\n";
+ break;
+ case "router":
+ $radvdconf .= "\t\tAdvOnLink off;\n";
+ $radvdconf .= "\t\tAdvAutonomous off;\n";
+ $radvdconf .= "\t\tAdvRouterAddr on;\n";
+ break;
+ case "stateless_dhcp":
+ case "assist":
+ $radvdconf .= "\t\tAdvOnLink on;\n";
+ $radvdconf .= "\t\tAdvAutonomous on;\n";
+ $radvdconf .= "\t\tAdvRouterAddr on;\n";
+ break;
+ case "unmanaged":
+ $radvdconf .= "\t\tAdvOnLink on;\n";
+ $radvdconf .= "\t\tAdvAutonomous on;\n";
+ $radvdconf .= "\t\tAdvRouterAddr on;\n";
+ break;
+ }
+ $radvdconf .= "\t};\n";
+
+ if (is_array($dhcpv6ifconf['subnets']['item'])) {
+ foreach ($dhcpv6ifconf['subnets']['item'] as $subnet) {
+ if (is_subnetv6($subnet)) {
+ $radvdconf .= "\tprefix {$subnet} {\n";
+ if ($carpif == true) {
+ $radvdconf .= "\t\tDeprecatePrefix off;\n";
+ } else {
+ $radvdconf .= "\t\tDeprecatePrefix on;\n";
+ }
+ switch ($dhcpv6ifconf['ramode']) {
+ case "managed":
+ $radvdconf .= "\t\tAdvOnLink on;\n";
+ $radvdconf .= "\t\tAdvAutonomous off;\n";
+ $radvdconf .= "\t\tAdvRouterAddr on;\n";
+ break;
+ case "router":
+ $radvdconf .= "\t\tAdvOnLink off;\n";
+ $radvdconf .= "\t\tAdvAutonomous off;\n";
+ $radvdconf .= "\t\tAdvRouterAddr on;\n";
+ break;
+ case "assist":
+ $radvdconf .= "\t\tAdvOnLink on;\n";
+ $radvdconf .= "\t\tAdvAutonomous on;\n";
+ $radvdconf .= "\t\tAdvRouterAddr on;\n";
+ break;
+ case "unmanaged":
+ $radvdconf .= "\t\tAdvOnLink on;\n";
+ $radvdconf .= "\t\tAdvAutonomous on;\n";
+ $radvdconf .= "\t\tAdvRouterAddr on;\n";
+ break;
+ }
+ $radvdconf .= "\t};\n";
+ }
+ }
+ }
+ if ($carpif === true) {
+ $radvdconf .= "\troute ::/0 {\n";
+ $radvdconf .= "\t\tRemoveRoute off;\n";
+ $radvdconf .= "\t};\n";
+ } else {
+ $radvdconf .= "\troute ::/0 {\n";
+ $radvdconf .= "\t\tRemoveRoute on;\n";
+ $radvdconf .= "\t};\n";
+ }
+
+ /* add DNS servers */
+ $dnslist = array();
+ if (isset($dhcpv6ifconf['rasamednsasdhcp6']) && is_array($dhcpv6ifconf['dnsserver']) && !empty($dhcpv6ifconf['dnsserver'])) {
+ foreach ($dhcpv6ifconf['dnsserver'] as $server) {
+ if (is_ipaddrv6($server)) {
+ $dnslist[] = $server;
+ }
+ }
+ } elseif (!isset($dhcpv6ifconf['rasamednsasdhcp6']) && isset($dhcpv6ifconf['radnsserver']) && is_array($dhcpv6ifconf['radnsserver'])) {
+ foreach ($dhcpv6ifconf['radnsserver'] as $server) {
+ if (is_ipaddrv6($server)) {
+ $dnslist[] = $server;
+ }
+ }
+ } elseif (isset($config['dnsmasq']['enable']) || isset($config['unbound']['enable'])) {
+ $dnslist[] = get_interface_ipv6($realif);
+ } elseif (is_array($config['system']['dnsserver']) && !empty($config['system']['dnsserver'])) {
+ foreach ($config['system']['dnsserver'] as $server) {
+ if (is_ipaddrv6($server)) {
+ $dnslist[] = $server;
+ }
+ }
+ }
+ if (count($dnslist) > 0) {
+ $dnsstring = implode(" ", $dnslist);
+ if ($dnsstring <> "") {
+ $radvdconf .= "\tRDNSS {$dnsstring} { };\n";
+ }
+ }
+ if (!empty($dhcpv6ifconf['domain'])) {
+ $radvdconf .= "\tDNSSL {$dhcpv6ifconf['domain']} { };\n";
+ } elseif (!empty($config['system']['domain'])) {
+ $radvdconf .= "\tDNSSL {$config['system']['domain']} { };\n";
+ }
+ $radvdconf .= "};\n";
+ }
+
+ /* handle DHCP-PD prefixes and 6RD dynamic interfaces */
+ foreach ($Iflist as $if => $ifdescr) {
+ if (!isset($config['interfaces'][$if]['track6-interface'])) {
+ continue;
+ }
+ if (!isset($config['interfaces'][$if]['enable'])) {
+ continue;
+ }
+ /* Do not put in the config an interface which is down */
+ if (isset($blacklist[$if])) {
+ continue;
+ }
+ $trackif = $config['interfaces'][$if]['track6-interface'];
+ if (empty($config['interfaces'][$trackif])) {
+ continue;
+ }
+
+ if (strstr($if, "_vip")) {
+ // CARP IP, find parent
+ $ifparent = link_carp_interface_to_parent($if);
+ $realif = convert_friendly_interface_to_real_interface_name($ifparent);
+ } else {
+ $realif = get_real_interface($if, "inet6");
+ }
+
+ /* prevent duplicate entries, manual overrides */
+ if (isset($radvdifs[$realif])) {
+ continue;
+ }
+
+ $ifcfgipv6 = get_interface_ipv6($if);
+ if (!is_ipaddrv6($ifcfgipv6)) {
+ $subnetv6 = "::";
+ $ifcfgsnv6 = "64";
+ } else {
+ $ifcfgsnv6 = get_interface_subnetv6($if);
+ $subnetv6 = gen_subnetv6($ifcfgipv6, $ifcfgsnv6);
+ }
+ $radvdifs[$realif] = $realif;
+
+ $autotype = $config['interfaces'][$trackif]['ipaddrv6'];
+
+ if ($g['debug']) {
+ log_error("configuring RA on {$if} for type {$autotype} radvd subnet {$subnetv6}/{$ifcfgsnv6}");
+ }
+
+ $radvdconf .= "# Generated config for {$autotype} delegation from {$trackif} on {$if}\n";
+ $radvdconf .= "interface {$realif} {\n";
+ $radvdconf .= "\tAdvSendAdvert on;\n";
+ $radvdconf .= "\tMinRtrAdvInterval 3;\n";
+ $radvdconf .= "\tMaxRtrAdvInterval 10;\n";
+ $mtu = get_interface_mtu($realif);
+ if (is_numeric($mtu)) {
+ $radvdconf .= "\tAdvLinkMTU {$mtu};\n";
+ } else {
+ $radvdconf .= "\tAdvLinkMTU 1280;\n";
+ }
+ $radvdconf .= "\tAdvOtherConfigFlag on;\n";
+ $radvdconf .= "\t\tprefix {$subnetv6}/{$ifcfgsnv6} {\n";
+ $radvdconf .= "\t\tAdvOnLink on;\n";
+ $radvdconf .= "\t\tAdvAutonomous on;\n";
+ $radvdconf .= "\t\tAdvRouterAddr on;\n";
+ $radvdconf .= "\t};\n";
+
+ /* add DNS servers */
+ $dnslist = array();
+ if (isset($config['dnsmasq']['enable']) || isset($config['unbound']['enable'])) {
+ $dnslist[] = $ifcfgipv6;
+ } elseif (is_array($config['system']['dnsserver']) && !empty($config['system']['dnsserver'])) {
+ foreach ($config['system']['dnsserver'] as $server) {
+ if (is_ipaddrv6($server)) {
+ $dnslist[] = $server;
+ }
+ }
+ }
+ if (count($dnslist) > 0) {
+ $dnsstring = implode(" ", $dnslist);
+ if (!empty($dnsstring)) {
+ $radvdconf .= "\tRDNSS {$dnsstring} { };\n";
+ }
+ }
+ if (!empty($config['system']['domain'])) {
+ $radvdconf .= "\tDNSSL {$config['system']['domain']} { };\n";
+ }
+ $radvdconf .= "};\n";
+ }
+
+ /* write radvd.conf */
+ if (!@file_put_contents("{$g['varetc_path']}/radvd.conf", $radvdconf)) {
+ log_error("Error: cannot open radvd.conf in services_radvd_configure().\n");
+ if (platform_booting()) {
+ printf("Error: cannot open radvd.conf in services_radvd_configure().\n");
+ }
+ }
+ unset($radvdconf);
+
+ if (count($radvdifs) > 0) {
+ if (isvalidpid("{$g['varrun_path']}/radvd.pid")) {
+ sigkillbypid("{$g['varrun_path']}/radvd.pid", "HUP");
+ } else {
+ mwexec("/usr/local/sbin/radvd -p {$g['varrun_path']}/radvd.pid -C {$g['varetc_path']}/radvd.conf -m syslog");
+ }
+ } else {
+ /* we need to shut down the radvd cleanly, it will send out the prefix
+ * information with a lifetime of 0 to notify clients of a (possible) new prefix */
+ if (isvalidpid("{$g['varrun_path']}/radvd.pid")) {
+ log_error("Shutting down Router Advertisment daemon cleanly");
+ killbypid("{$g['varrun_path']}/radvd.pid");
+ @unlink("{$g['varrun_path']}/radvd.pid");
+ }
+ }
+ return 0;
+}
+
+function services_dhcpd_configure($family = "all", $blacklist = array()) {
+ global $config, $g;
+
+ /* configure DHCPD chroot once */
+ $fd = fopen("{$g['tmp_path']}/dhcpd.sh", "w");
+ fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}\n");
+ fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/dev\n");
+ fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/etc\n");
+ fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/usr/local/sbin\n");
+ fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/var/db\n");
+ fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/var/run\n");
+ fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/usr\n");
+ fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/lib\n");
+ fwrite($fd, "/bin/mkdir -p {$g['dhcpd_chroot_path']}/run\n");
+ fwrite($fd, "/usr/sbin/chown -R dhcpd:_dhcp {$g['dhcpd_chroot_path']}/*\n");
+ fwrite($fd, "/bin/cp -n /lib/libc.so.* {$g['dhcpd_chroot_path']}/lib/\n");
+ fwrite($fd, "/bin/cp -n /usr/local/sbin/dhcpd {$g['dhcpd_chroot_path']}/usr/local/sbin/\n");
+ fwrite($fd, "/bin/chmod a+rx {$g['dhcpd_chroot_path']}/usr/local/sbin/dhcpd\n");
+
+ $status = `/sbin/mount | /usr/bin/grep -v grep | /usr/bin/grep "{$g['dhcpd_chroot_path']}/dev"`;
+ if (!trim($status)) {
+ fwrite($fd, "/sbin/mount -t devfs devfs {$g['dhcpd_chroot_path']}/dev\n");
+ }
+ fclose($fd);
+ mwexec("/bin/sh {$g['tmp_path']}/dhcpd.sh");
+
+ if ($family == "all" || $family == "inet") {
+ services_dhcpdv4_configure();
+ }
+ if ($family == "all" || $family == "inet6") {
+ services_dhcpdv6_configure($blacklist);
+ services_radvd_configure($blacklist);
+ }
+}
+
+function services_dhcpdv4_configure() {
+ global $config, $g;
+ $need_ddns_updates = false;
+ $ddns_zones = array();
+
+ if ($g['services_dhcp_server_enable'] == false) {
+ return;
+ }
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_dhcpdv4_configure($if) being called $mt\n";
+ }
+
+ /* kill any running dhcpd */
+ if (isvalidpid("{$g['dhcpd_chroot_path']}{$g['varrun_path']}/dhcpd.pid")) {
+ killbypid("{$g['dhcpd_chroot_path']}{$g['varrun_path']}/dhcpd.pid");
+ }
+
+ /* DHCP enabled on any interfaces? */
+ if (!is_dhcp_server_enabled()) {
+ return 0;
+ }
+
+ /* if OLSRD is enabled, allow WAN to house DHCP. */
+ if (!function_exists('is_package_installed')) {
+ require_once('pkg-utils.inc');
+ }
+ if (is_package_installed('olsrd') && isset($config['installedpackages']['olsrd'])) {
+ foreach ($config['installedpackages']['olsrd']['config'] as $olsrd) {
+ if (isset($olsrd['enable']) && $olsrd['enable'] == "on") {
+ $is_olsr_enabled = true;
+ break;
+ }
+ }
+ }
+
+ if (platform_booting()) {
+ /* restore the leases, if we have them */
+ if (file_exists("{$g['cf_conf_path']}/dhcpleases.tgz")) {
+ $dhcprestore = "";
+ $dhcpreturn = "";
+ exec("cd /;LANG=C /usr/bin/tar -xzf {$g['cf_conf_path']}/dhcpleases.tgz 2>&1", $dhcprestore, $dhcpreturn);
+ $dhcprestore = implode(" ", $dhcprestore);
+ if ($dhcpreturn <> 0) {
+ log_error(sprintf(gettext('DHCP leases restore failed exited with %1$s, the error is: %2$s%3$s'), $dhcpreturn, $dhcprestore, "\n"));
+ }
+ }
+ /* If this backup is still there on a full install, but we aren't going to use ram disks, remove the archive since this is a transition. */
+ if (($g['platform'] == "pfSense") && !isset($config['system']['use_mfs_tmpvar'])) {
+ unlink_if_exists("{$g['cf_conf_path']}/dhcpleases.tgz");
+ }
+ }
+
+ $syscfg = $config['system'];
+ if (!is_array($config['dhcpd'])) {
+ $config['dhcpd'] = array();
+ }
+ $dhcpdcfg = $config['dhcpd'];
+ $Iflist = get_configured_interface_list();
+
+ /* Only consider DNS servers with IPv4 addresses for the IPv4 DHCP server. */
+ $dns_arrv4 = array();
+ if (is_array($syscfg['dnsserver'])) {
+ foreach ($syscfg['dnsserver'] as $dnsserver) {
+ if (is_ipaddrv4($dnsserver)) {
+ $dns_arrv4[] = $dnsserver;
+ }
+ }
+ }
+
+ if (platform_booting()) {
+ echo gettext("Starting DHCP service...");
+ } else {
+ sleep(1);
+ }
+
+ $custoptions = "";
+ foreach ($dhcpdcfg as $dhcpif => $dhcpifconf) {
+ if (is_array($dhcpifconf['numberoptions']) && is_array($dhcpifconf['numberoptions']['item'])) {
+ foreach ($dhcpifconf['numberoptions']['item'] as $itemidx => $item) {
+ if (!empty($item['type'])) {
+ $itemtype = $item['type'];
+ } else {
+ $itemtype = "text";
+ }
+ $custoptions .= "option custom-{$dhcpif}-{$itemidx} code {$item['number']} = {$itemtype};\n";
+ }
+ }
+ }
+
+ $dhcpdconf = <<<EOD
+
+option domain-name "{$syscfg['domain']}";
+option ldap-server code 95 = text;
+option domain-search-list code 119 = text;
+option arch code 93 = unsigned integer 16; # RFC4578
+{$custoptions}
+default-lease-time 7200;
+max-lease-time 86400;
+log-facility local7;
+one-lease-per-client true;
+deny duplicates;
+ping-check true;
+update-conflict-detection false;
+
+EOD;
+
+ if (!isset($dhcpifconf['disableauthoritative'])) {
+ $dhcpdconf .= "authoritative;\n";
+ }
+
+ if (isset($dhcpifconf['alwaysbroadcast'])) {
+ $dhcpdconf .= "always-broadcast on\n";
+ }
+
+ $dhcpdifs = array();
+ $enable_add_routers = false;
+ $gateways_arr = return_gateways_array();
+ /* only add a routers line if the system has any IPv4 gateway at all */
+ /* a static route has a gateway, manually overriding this field always works */
+ foreach ($gateways_arr as $gwitem) {
+ if ($gwitem['ipprotocol'] == "inet") {
+ $enable_add_routers = true;
+ break;
+ }
+ }
+
+ /* loop through and determine if we need to setup
+ * failover peer "bleh" entries
+ */
+ foreach ($dhcpdcfg as $dhcpif => $dhcpifconf) {
+
+ if (!isset($config['interfaces'][$dhcpif]['enable'])) {
+ continue;
+ }
+
+ interfaces_staticarp_configure($dhcpif);
+
+ if (!isset($dhcpifconf['enable'])) {
+ continue;
+ }
+
+ if ($dhcpifconf['failover_peerip'] <> "") {
+ $intip = get_interface_ip($dhcpif);
+ /*
+ * yep, failover peer is defined.
+ * does it match up to a defined vip?
+ */
+ $skew = 110;
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $vipent) {
+ if ($vipent['interface'] == $dhcpif) {
+ $carp_nw = gen_subnet($vipent['subnet'], $vipent['subnet_bits']);
+ if (ip_in_subnet($dhcpifconf['failover_peerip'], "{$carp_nw}/{$vipent['subnet_bits']}")) {
+ /* this is the interface! */
+ if (is_numeric($vipent['advskew']) && (intval($vipent['advskew']) < 20)) {
+ $skew = 0;
+ break;
+ }
+ }
+ }
+ }
+ } else {
+ log_error(gettext("Warning! DHCP Failover setup and no CARP virtual IPs defined!"));
+ }
+ if ($skew > 10) {
+ $type = "secondary";
+ $my_port = "520";
+ $peer_port = "519";
+ } else {
+ $my_port = "519";
+ $peer_port = "520";
+ $type = "primary";
+ $dhcpdconf_pri = "split 128;\n";
+ $dhcpdconf_pri .= " mclt 600;\n";
+ }
+
+ if (is_ipaddrv4($intip)) {
+ $dhcpdconf .= <<<EOPP
+failover peer "dhcp_{$dhcpif}" {
+ {$type};
+ address {$intip};
+ port {$my_port};
+ peer address {$dhcpifconf['failover_peerip']};
+ peer port {$peer_port};
+ max-response-delay 10;
+ max-unacked-updates 10;
+ {$dhcpdconf_pri}
+ load balance max seconds 3;
+}
+\n
+EOPP;
+ }
+ }
+ }
+
+ foreach ($dhcpdcfg as $dhcpif => $dhcpifconf) {
+
+ $newzone = array();
+ $ifcfg = $config['interfaces'][$dhcpif];
+
+ if (!isset($dhcpifconf['enable']) || !isset($Iflist[$dhcpif])) {
+ continue;
+ }
+ $ifcfgip = get_interface_ip($dhcpif);
+ $ifcfgsn = get_interface_subnet($dhcpif);
+ $subnet = gen_subnet($ifcfgip, $ifcfgsn);
+ $subnetmask = gen_subnet_mask($ifcfgsn);
+
+ if (!is_ipaddr($subnet)) {
+ continue;
+ }
+
+ if ($is_olsr_enabled == true) {
+ if ($dhcpifconf['netmask']) {
+ $subnetmask = gen_subnet_mask($dhcpifconf['netmask']);
+ }
+ }
+
+ $all_pools = array();
+ $all_pools[] = $dhcpifconf;
+ if (is_array($dhcpifconf['pool'])) {
+ $all_pools = array_merge($all_pools, $dhcpifconf['pool']);
+ }
+
+ $dnscfg = "";
+
+ if ($dhcpifconf['domain']) {
+ $dnscfg .= " option domain-name \"{$dhcpifconf['domain']}\";\n";
+ }
+
+ if ($dhcpifconf['domainsearchlist'] <> "") {
+ $dnscfg .= " option domain-search \"" . join("\",\"", preg_split("/[ ;]+/", $dhcpifconf['domainsearchlist'])) . "\";\n";
+ }
+
+ if (isset($dhcpifconf['ddnsupdate'])) {
+ $need_ddns_updates = true;
+ $newzone = array();
+ if ($dhcpifconf['ddnsdomain'] <> "") {
+ $newzone['domain-name'] = $dhcpifconf['ddnsdomain'];
+ $dnscfg .= " ddns-domainname \"{$dhcpifconf['ddnsdomain']}\";\n";
+ } else {
+ $newzone['domain-name'] = $config['system']['domain'];
+ }
+ $revsubnet = explode(".", $subnet);
+ $revsubnet = array_reverse($revsubnet);
+ foreach ($revsubnet as $octet) {
+ if ($octet != "0") {
+ break;
+ }
+ array_shift($revsubnet);
+ }
+ $newzone['ptr-domain'] = implode(".", $revsubnet) . ".in-addr.arpa";
+ }
+
+ if (is_array($dhcpifconf['dnsserver']) && ($dhcpifconf['dnsserver'][0])) {
+ $dnscfg .= " option domain-name-servers " . join(",", $dhcpifconf['dnsserver']) . ";";
+ if ($newzone['domain-name']) {
+ $newzone['dns-servers'] = $dhcpifconf['dnsserver'];
+ }
+ } else if (isset($config['dnsmasq']['enable'])) {
+ $dnscfg .= " option domain-name-servers {$ifcfgip};";
+ if ($newzone['domain-name'] && is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
+ $newzone['dns-servers'] = $syscfg['dnsserver'];
+ }
+ } else if (isset($config['unbound']['enable'])) {
+ $dnscfg .= " option domain-name-servers {$ifcfgip};";
+ } else if (!empty($dns_arrv4)) {
+ $dnscfg .= " option domain-name-servers " . join(",", $dns_arrv4) . ";";
+ if ($newzone['domain-name']) {
+ $newzone['dns-servers'] = $dns_arrv4;
+ }
+ }
+
+ /* Create classes - These all contain comma separated lists. Join them into one
+ big comma separated string then split them all up. */
+ $all_mac_strings = array();
+ if (is_array($dhcpifconf['pool'])) {
+ foreach ($all_pools as $poolconf) {
+ $all_mac_strings[] = $poolconf['mac_allow'];
+ $all_mac_strings[] = $poolconf['mac_deny'];
+ }
+ }
+ $all_mac_strings[] = $dhcpifconf['mac_allow'];
+ $all_mac_strings[] = $dhcpifconf['mac_deny'];
+ if (!empty($all_mac_strings)) {
+ $all_mac_list = array_unique(explode(',', implode(',', $all_mac_strings)));
+ foreach ($all_mac_list as $mac) {
+ if (empty($mac)) {
+ continue;
+ }
+ $dhcpdconf .= 'class "' . str_replace(':', '', $mac) . '" {' . "\n";
+ // Skip the first octet of the MAC address - for media type, typically Ethernet ("01") and match the rest.
+ $dhcpdconf .= ' match if substring (hardware, 1, ' . (substr_count($mac, ':') + 1) . ') = ' . $mac . ';' . "\n";
+ $dhcpdconf .= '}' . "\n";
+ }
+ }
+
+ $dhcpdconf .= "subnet {$subnet} netmask {$subnetmask} {\n";
+
+ // Setup pool options
+ foreach ($all_pools as $poolconf) {
+ $dhcpdconf .= " pool {\n";
+ /* is failover dns setup? */
+ if (is_array($poolconf['dnsserver']) && $poolconf['dnsserver'][0] <> "") {
+ $dhcpdconf .= " option domain-name-servers {$poolconf['dnsserver'][0]}";
+ if ($poolconf['dnsserver'][1] <> "") {
+ $dhcpdconf .= ",{$poolconf['dnsserver'][1]}";
+ }
+ if ($poolconf['dnsserver'][2] <> "") {
+ $dhcpdconf .= ",{$poolconf['dnsserver'][2]}";
+ }
+ if ($poolconf['dnsserver'][3] <> "") {
+ $dhcpdconf .= ",{$poolconf['dnsserver'][3]}";
+ }
+ $dhcpdconf .= ";\n";
+ }
+
+ /* allow/deny MACs */
+ $mac_allow_list = array_unique(explode(',', $poolconf['mac_allow']));
+ foreach ($mac_allow_list as $mac) {
+ if (empty($mac)) {
+ continue;
+ }
+ $dhcpdconf .= " allow members of \"" . str_replace(':', '', $mac) . "\";\n";
+ }
+ $mac_deny_list = array_unique(explode(',', $poolconf['mac_deny']));
+ foreach ($mac_deny_list as $mac) {
+ if (empty($mac)) {
+ continue;
+ }
+ $dhcpdconf .= " deny members of \"" . str_replace(':', '', $mac) . "\";\n";
+ }
+
+ if ($poolconf['failover_peerip'] <> "") {
+ $dhcpdconf .= " deny dynamic bootp clients;\n";
+ }
+
+ if (isset($poolconf['denyunknown'])) {
+ $dhcpdconf .= " deny unknown-clients;\n";
+ }
+
+ if ($poolconf['gateway'] && $poolconf['gateway'] != "none" && ($poolconf['gateway'] != $dhcpifconf['gateway'])) {
+ $dhcpdconf .= " option routers {$poolconf['gateway']};\n";
+ }
+
+ if ($dhcpifconf['failover_peerip'] <> "") {
+ $dhcpdconf .= " failover peer \"dhcp_{$dhcpif}\";\n";
+ }
+
+ $pdnscfg = "";
+
+ if ($poolconf['domain'] && ($poolconf['domain'] != $dhcpifconf['domain'])) {
+ $pdnscfg .= " option domain-name \"{$poolconf['domain']}\";\n";
+ }
+
+ if (!empty($poolconf['domainsearchlist']) && ($poolconf['domainsearchlist'] != $dhcpifconf['domainsearchlist'])) {
+ $pdnscfg .= " option domain-search \"" . join("\",\"", preg_split("/[ ;]+/", $poolconf['domainsearchlist'])) . "\";\n";
+ }
+
+ if (isset($poolconf['ddnsupdate'])) {
+ if (($poolconf['ddnsdomain'] <> "") && ($poolconf['ddnsdomain'] != $dhcpifconf['ddnsdomain'])) {
+ $pdnscfg .= " ddns-domainname \"{$poolconf['ddnsdomain']}\";\n";
+ }
+ $pdnscfg .= " ddns-update-style interim;\n";
+ }
+
+ if (is_array($poolconf['dnsserver']) && ($poolconf['dnsserver'][0]) && ($poolconf['dnsserver'][0] != $dhcpifconf['dnsserver'][0])) {
+ $pdnscfg .= " option domain-name-servers " . join(",", $poolconf['dnsserver']) . ";\n";
+ }
+ $dhcpdconf .= "{$pdnscfg}";
+
+ // default-lease-time
+ if ($poolconf['defaultleasetime'] && ($poolconf['defaultleasetime'] != $dhcpifconf['defaultleasetime'])) {
+ $dhcpdconf .= " default-lease-time {$poolconf['defaultleasetime']};\n";
+ }
+
+ // max-lease-time
+ if ($poolconf['maxleasetime'] && ($poolconf['maxleasetime'] != $dhcpifconf['maxleasetime'])) {
+ $dhcpdconf .= " max-lease-time {$poolconf['maxleasetime']};\n";
+ }
+
+ // netbios-name*
+ if (is_array($poolconf['winsserver']) && $poolconf['winsserver'][0] && ($poolconf['winsserver'][0] != $dhcpifconf['winsserver'][0])) {
+ $dhcpdconf .= " option netbios-name-servers " . join(",", $poolconf['winsserver']) . ";\n";
+ $dhcpdconf .= " option netbios-node-type 8;\n";
+ }
+
+ // ntp-servers
+ if (is_array($poolconf['ntpserver']) && $poolconf['ntpserver'][0] && ($poolconf['ntpserver'][0] != $dhcpifconf['ntpserver'][0])) {
+ $dhcpdconf .= " option ntp-servers " . join(",", $poolconf['ntpserver']) . ";\n";
+ }
+
+ // tftp-server-name
+ if (!empty($poolconf['tftp']) && ($poolconf['tftp'] != $dhcpifconf['tftp'])) {
+ $dhcpdconf .= " option tftp-server-name \"{$poolconf['tftp']}\";\n";
+ }
+
+ // ldap-server
+ if (!empty($poolconf['ldap']) && ($poolconf['ldap'] != $dhcpifconf['ldap'])) {
+ $dhcpdconf .= " option ldap-server \"{$poolconf['ldap']}\";\n";
+ }
+
+ // net boot information
+ if (isset($poolconf['netboot'])) {
+ if (!empty($poolconf['nextserver']) && ($poolconf['nextserver'] != $dhcpifconf['nextserver'])) {
+ $dhcpdconf .= " next-server {$poolconf['nextserver']};\n";
+ }
+ if (!empty($poolconf['filename']) && ($poolconf['filename'] != $dhcpifconf['filename'])) {
+ $dhcpdconf .= " filename \"{$poolconf['filename']}\";\n";
+ }
+ if (!empty($poolconf['rootpath']) && ($poolconf['rootpath'] != $dhcpifconf['rootpath'])) {
+ $dhcpdconf .= " option root-path \"{$poolconf['rootpath']}\";\n";
+ }
+ }
+ $dhcpdconf .= " range {$poolconf['range']['from']} {$poolconf['range']['to']};\n";
+ $dhcpdconf .= " }\n\n";
+ }
+// End of settings inside pools
+
+ if ($dhcpifconf['gateway'] && $dhcpifconf['gateway'] != "none") {
+ $routers = $dhcpifconf['gateway'];
+ $add_routers = true;
+ } elseif ($dhcpifconf['gateway'] == "none") {
+ $add_routers = false;
+ } else {
+ $add_routers = $enable_add_routers;
+ $routers = $ifcfgip;
+ }
+ if ($add_routers) {
+ $dhcpdconf .= " option routers {$routers};\n";
+ }
+
+ $dhcpdconf .= <<<EOD
+$dnscfg
+
+EOD;
+ // default-lease-time
+ if ($dhcpifconf['defaultleasetime']) {
+ $dhcpdconf .= " default-lease-time {$dhcpifconf['defaultleasetime']};\n";
+ }
+
+ // max-lease-time
+ if ($dhcpifconf['maxleasetime']) {
+ $dhcpdconf .= " max-lease-time {$dhcpifconf['maxleasetime']};\n";
+ }
+
+ // netbios-name*
+ if (is_array($dhcpifconf['winsserver']) && $dhcpifconf['winsserver'][0]) {
+ $dhcpdconf .= " option netbios-name-servers " . join(",", $dhcpifconf['winsserver']) . ";\n";
+ $dhcpdconf .= " option netbios-node-type 8;\n";
+ }
+
+ // ntp-servers
+ if (is_array($dhcpifconf['ntpserver']) && $dhcpifconf['ntpserver'][0]) {
+ $dhcpdconf .= " option ntp-servers " . join(",", $dhcpifconf['ntpserver']) . ";\n";
+ }
+
+ // tftp-server-name
+ if ($dhcpifconf['tftp'] <> "") {
+ $dhcpdconf .= " option tftp-server-name \"{$dhcpifconf['tftp']}\";\n";
+ }
+
+ // Handle option, number rowhelper values
+ $dhcpdconf .= "\n";
+ if ($dhcpifconf['numberoptions']['item']) {
+ foreach ($dhcpifconf['numberoptions']['item'] as $itemidx => $item) {
+ if (empty($item['type']) || $item['type'] == "text") {
+ $dhcpdconf .= " option custom-{$dhcpif}-{$itemidx} \"{$item['value']}\";\n";
+ } else {
+ $dhcpdconf .= " option custom-{$dhcpif}-{$itemidx} {$item['value']};\n";
+ }
+ }
+ }
+
+ // ldap-server
+ if ($dhcpifconf['ldap'] <> "") {
+ $dhcpdconf .= " option ldap-server \"{$dhcpifconf['ldap']}\";\n";
+ }
+
+ // net boot information
+ if (isset($dhcpifconf['netboot'])) {
+ if ($dhcpifconf['nextserver'] <> "") {
+ $dhcpdconf .= " next-server {$dhcpifconf['nextserver']};\n";
+ }
+ if (!empty($dhcpifconf['filename']) && !empty($dhcpifconf['filename32']) && !empty($dhcpifconf['filename64'])) {
+ $dhcpdconf .= " if option arch = 00:06 {\n";
+ $dhcpdconf .= " filename \"{$dhcpifconf['filename32']}\";\n";
+ $dhcpdconf .= " } else if option arch = 00:07 {\n";
+ $dhcpdconf .= " filename \"{$dhcpifconf['filename64']}\";\n";
+ $dhcpdconf .= " } else {\n";
+ $dhcpdconf .= " filename \"{$dhcpifconf['filename']}\";\n";
+ $dhcpdconf .= " }\n\n";
+ } elseif (!empty($dhcpifconf['filename'])) {
+ $dhcpdconf .= " filename \"{$dhcpifconf['filename']}\";\n";
+ }
+ if (!empty($dhcpifconf['rootpath'])) {
+ $dhcpdconf .= " option root-path \"{$dhcpifconf['rootpath']}\";\n";
+ }
+ }
+
+ $dhcpdconf .= <<<EOD
+}
+
+EOD;
+
+ /* add static mappings */
+ if (is_array($dhcpifconf['staticmap'])) {
+
+ $i = 0;
+ foreach ($dhcpifconf['staticmap'] as $sm) {
+ $dhcpdconf .= "host s_{$dhcpif}_{$i} {\n";
+
+ if ($sm['mac']) {
+ $dhcpdconf .= " hardware ethernet {$sm['mac']};\n";
+ }
+
+ if ($sm['cid']) {
+ $dhcpdconf .= " option dhcp-client-identifier \"{$sm['cid']}\";\n";
+ }
+
+ if ($sm['ipaddr']) {
+ $dhcpdconf .= " fixed-address {$sm['ipaddr']};\n";
+ }
+
+ if ($sm['hostname']) {
+ $dhhostname = str_replace(" ", "_", $sm['hostname']);
+ $dhhostname = str_replace(".", "_", $dhhostname);
+ $dhcpdconf .= " option host-name \"{$dhhostname}\";\n";
+ }
+ if ($sm['filename']) {
+ $dhcpdconf .= " filename \"{$sm['filename']}\";\n";
+ }
+
+ if ($sm['rootpath']) {
+ $dhcpdconf .= " option root-path \"{$sm['rootpath']}\";\n";
+ }
+
+ if ($sm['gateway'] && ($sm['gateway'] != $dhcpifconf['gateway'])) {
+ $dhcpdconf .= " option routers {$sm['gateway']};\n";
+ }
+
+ $smdnscfg = "";
+
+ if ($sm['domain'] && ($sm['domain'] != $dhcpifconf['domain'])) {
+ $smdnscfg .= " option domain-name \"{$sm['domain']}\";\n";
+ }
+
+ if (!empty($sm['domainsearchlist']) && ($sm['domainsearchlist'] != $dhcpifconf['domainsearchlist'])) {
+ $smdnscfg .= " option domain-search \"" . join("\",\"", preg_split("/[ ;]+/", $sm['domainsearchlist'])) . "\";\n";
+ }
+
+ if (isset($sm['ddnsupdate'])) {
+ if (($sm['ddnsdomain'] <> "") && ($sm['ddnsdomain'] != $dhcpifconf['ddnsdomain'])) {
+ $pdnscfg .= " ddns-domainname \"{$sm['ddnsdomain']}\";\n";
+ }
+ $pdnscfg .= " ddns-update-style interim;\n";
+ }
+
+ if (is_array($sm['dnsserver']) && ($sm['dnsserver'][0]) && ($sm['dnsserver'][0] != $dhcpifconf['dnsserver'][0])) {
+ $smdnscfg .= " option domain-name-servers " . join(",", $sm['dnsserver']) . ";\n";
+ }
+ $dhcpdconf .= "{$smdnscfg}";
+
+ // default-lease-time
+ if ($sm['defaultleasetime'] && ($sm['defaultleasetime'] != $dhcpifconf['defaultleasetime'])) {
+ $dhcpdconf .= " default-lease-time {$sm['defaultleasetime']};\n";
+ }
+
+ // max-lease-time
+ if ($sm['maxleasetime'] && ($sm['maxleasetime'] != $dhcpifconf['maxleasetime'])) {
+ $dhcpdconf .= " max-lease-time {$sm['maxleasetime']};\n";
+ }
+
+ // netbios-name*
+ if (is_array($sm['winsserver']) && $sm['winsserver'][0] && ($sm['winsserver'][0] != $dhcpifconf['winsserver'][0])) {
+ $dhcpdconf .= " option netbios-name-servers " . join(",", $sm['winsserver']) . ";\n";
+ $dhcpdconf .= " option netbios-node-type 8;\n";
+ }
+
+ // ntp-servers
+ if (is_array($sm['ntpserver']) && $sm['ntpserver'][0] && ($sm['ntpserver'][0] != $dhcpifconf['ntpserver'][0])) {
+ $dhcpdconf .= " option ntp-servers " . join(",", $sm['ntpserver']) . ";\n";
+ }
+
+ // tftp-server-name
+ if (!empty($sm['tftp']) && ($sm['tftp'] != $dhcpifconf['tftp'])) {
+ $dhcpdconf .= " option tftp-server-name \"{$sm['tftp']}\";\n";
+ }
+
+ $dhcpdconf .= "}\n";
+ $i++;
+ }
+ }
+
+ $dhcpdifs[] = get_real_interface($dhcpif);
+ if ($newzone['domain-name']) {
+ if ($need_ddns_updates) {
+ $newzone['dns-servers'] = array($dhcpifconf['ddnsdomainprimary']);
+ }
+ $ddns_zones[] = $newzone;
+ }
+ }
+
+ if ($need_ddns_updates) {
+ $dhcpdconf .= "ddns-update-style interim;\n";
+ $dhcpdconf .= "update-static-leases on;\n";
+
+ $dhcpdconf .= dhcpdkey($dhcpifconf);
+ $dhcpdconf .= dhcpdzones($ddns_zones, $dhcpifconf);
+ }
+
+ /* write dhcpd.conf */
+ if (!@file_put_contents("{$g['dhcpd_chroot_path']}/etc/dhcpd.conf", $dhcpdconf)) {
+ printf(gettext("Error: cannot open dhcpd.conf in services_dhcpdv4_configure().%s"), "\n");
+ unset($dhcpdconf);
+ return 1;
+ }
+ unset($dhcpdconf);
+
+ /* create an empty leases database */
+ if (!file_exists("{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases")) {
+ @touch("{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases");
+ }
+
+ /* make sure there isn't a stale dhcpd.pid file, which can make dhcpd fail to start. */
+ /* if we get here, dhcpd has been killed and is not started yet */
+ unlink_if_exists("{$g['dhcpd_chroot_path']}{$g['varrun_path']}/dhcpd.pid");
+
+ /* fire up dhcpd in a chroot */
+ if (count($dhcpdifs) > 0) {
+ mwexec("/usr/local/sbin/dhcpd -user dhcpd -group _dhcp -chroot {$g['dhcpd_chroot_path']} -cf /etc/dhcpd.conf -pf {$g['varrun_path']}/dhcpd.pid " .
+ join(" ", $dhcpdifs));
+ }
+
+ if (platform_booting()) {
+ print "done.\n";
+ }
+
+ return 0;
+}
+
+function dhcpdkey($dhcpifconf) {
+ $dhcpdconf = "";
+ if ($dhcpifconf['ddnsdomainkeyname'] <> "" && $dhcpifconf['ddnsdomainkey'] <> "") {
+ $dhcpdconf .= "key {$dhcpifconf['ddnsdomainkeyname']} {\n";
+ $dhcpdconf .= " algorithm hmac-md5;\n";
+ $dhcpdconf .= " secret {$dhcpifconf['ddnsdomainkey']};\n";
+ $dhcpdconf .= "}\n";
+ }
+
+ return $dhcpdconf;
+}
+
+function dhcpdzones($ddns_zones, $dhcpifconf) {
+ $dhcpdconf = "";
+
+ if (is_array($ddns_zones)) {
+ $added_zones = array();
+ foreach ($ddns_zones as $zone) {
+ if (!is_array($zone) || empty($zone) || !is_array($zone['dns-servers'])) {
+ continue;
+ }
+ $primary = $zone['dns-servers'][0];
+ $secondary = empty($zone['dns-servers'][1]) ? "" : $zone['dns-servers'][1];
+
+ // Make sure we aren't using any invalid or IPv6 DNS servers.
+ if (!is_ipaddrv4($primary)) {
+ if (is_ipaddrv4($secondary)) {
+ $primary = $secondary;
+ $secondary = "";
+ } else {
+ continue;
+ }
+ }
+
+ // We don't need to add zones multiple times.
+ if ($zone['domain-name'] && !in_array($zone['domain-name'], $added_zones)) {
+ $dhcpdconf .= "zone {$zone['domain-name']}. {\n";
+ $dhcpdconf .= " primary {$primary};\n";
+ if (is_ipaddrv4($secondary)) {
+ $dhcpdconf .= " secondary {$secondary};\n";
+ }
+ if ($dhcpifconf['ddnsdomainkeyname'] <> "" && $dhcpifconf['ddnsdomainkey'] <> "") {
+ $dhcpdconf .= " key {$dhcpifconf['ddnsdomainkeyname']};\n";
+ }
+ $dhcpdconf .= "}\n";
+ $added_zones[] = $zone['domain-name'];
+ }
+ if ($zone['ptr-domain'] && !in_array($zone['ptr-domain'], $added_zones)) {
+ $dhcpdconf .= "zone {$zone['ptr-domain']} {\n";
+ $dhcpdconf .= " primary {$primary};\n";
+ if (is_ipaddrv4($secondary)) {
+ $dhcpdconf .= " secondary {$secondary};\n";
+ }
+ if ($dhcpifconf['ddnsdomainkeyname'] <> "" && $dhcpifconf['ddnsdomainkey'] <> "") {
+ $dhcpdconf .= " key {$dhcpifconf['ddnsdomainkeyname']};\n";
+ }
+ $dhcpdconf .= "}\n";
+ $added_zones[] = $zone['ptr-domain'];
+ }
+ }
+ }
+
+ return $dhcpdconf;
+}
+
+function services_dhcpdv6_configure($blacklist = array()) {
+ global $config, $g;
+
+ if ($g['services_dhcp_server_enable'] == false) {
+ return;
+ }
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_dhcpd_configure($if) being called $mt\n";
+ }
+
+ /* kill any running dhcpd */
+ if (isvalidpid("{$g['dhcpd_chroot_path']}{$g['varrun_path']}/dhcpdv6.pid")) {
+ killbypid("{$g['dhcpd_chroot_path']}{$g['varrun_path']}/dhcpdv6.pid");
+ }
+ if (isvalidpid("{$g['varrun_path']}/dhcpleases6.pid")) {
+ killbypid("{$g['varrun_path']}/dhcpleases6.pid");
+ }
+
+ /* DHCP enabled on any interfaces? */
+ if (!is_dhcpv6_server_enabled()) {
+ return 0;
+ }
+
+ if (platform_booting()) {
+ if ($g['platform'] != "pfSense") {
+ /* restore the leases, if we have them */
+ if (file_exists("{$g['cf_conf_path']}/dhcp6leases.tgz")) {
+ $dhcprestore = "";
+ $dhcpreturn = "";
+ exec("cd /;LANG=C /usr/bin/tar -xzf {$g['cf_conf_path']}/dhcp6leases.tgz 2>&1", $dhcprestore, $dhcpreturn);
+ $dhcprestore = implode(" ", $dhcprestore);
+ if ($dhcpreturn <> 0) {
+ log_error("DHCP leases v6 restore failed exited with $dhcpreturn, the error is: $dhcprestore\n");
+ }
+ }
+ }
+ }
+
+ $syscfg = $config['system'];
+ if (!is_array($config['dhcpdv6'])) {
+ $config['dhcpdv6'] = array();
+ }
+ $dhcpdv6cfg = $config['dhcpdv6'];
+ $Iflist = get_configured_interface_list();
+ $Iflist = array_merge($Iflist, get_configured_pppoe_server_interfaces());
+
+
+ if (platform_booting()) {
+ echo "Starting DHCPv6 service...";
+ } else {
+ sleep(1);
+ }
+
+ /* we add a fake entry for interfaces that are set to track6 another WAN */
+ foreach ($Iflist as $ifname) {
+ /* Do not put in the config an interface which is down */
+ if (isset($blacklist[$ifname])) {
+ continue;
+ }
+ if (!empty($config['interfaces'][$ifname]['track6-interface'])) {
+ $realif = get_real_interface($ifname, "inet6");
+ $ifcfgipv6 = get_interface_ipv6($ifname);
+ if (!is_ipaddrv6($ifcfgipv6)) {
+ continue;
+ }
+ $ifcfgipv6 = Net_IPv6::getNetmask($ifcfgipv6, 64);
+ $trackifname = $config['interfaces'][$ifname]['track6-interface'];
+ $trackcfg = $config['interfaces'][$trackifname];
+ $pdlen = calculate_ipv6_delegation_length($trackifname);
+ $ifcfgipv6arr =explode(":", $ifcfgipv6);
+ $dhcpdv6cfg[$ifname] = array();
+ $dhcpdv6cfg[$ifname]['enable'] = true;
+ /* range */
+ $ifcfgipv6arr[7] = "1000";
+ $dhcpdv6cfg[$ifname]['range'] = array();
+ $dhcpdv6cfg[$ifname]['range']['from'] = Net_IPv6::compress(implode(":", $ifcfgipv6arr));
+ $ifcfgipv6arr[7] = "2000";
+ $dhcpdv6cfg[$ifname]['range']['to'] = Net_IPv6::compress(implode(":", $ifcfgipv6arr));
+ /* prefix length > 0? We can add dhcp6 prefix delegation server */
+ if ($pdlen > 2) {
+ $pdlenmax = $pdlen;
+ $pdlenhalf = $pdlenmax -1;
+ $pdlenmin = (64 - ceil($pdlenhalf / 4));
+ $dhcpdv6cfg[$ifname]['prefixrange'] = array();
+ $dhcpdv6cfg[$ifname]['prefixrange']['prefixlength'] = $pdlenmin;
+
+ /* set the delegation start to half the current address block */
+ $range = Net_IPv6::parseAddress($ifcfgipv6, (64 - $pdlenmax));
+ $range['start'] = Net_IPv6::getNetmask($range['end'], (64 - $pdlenhalf));
+
+ /* set the end range to a multiple of the prefix delegation size, required by dhcpd */
+ $range = Net_IPv6::parseAddress($range['end'], (64 - $pdlenhalf));
+ $range['end'] = Net_IPv6::getNetmask($range['end'], (64 - round($pdlen / 2)));
+
+ $dhcpdv6cfg[$ifname]['prefixrange']['from'] = Net_IPv6::compress($range['start']);
+ $dhcpdv6cfg[$ifname]['prefixrange']['to'] = Net_IPv6::compress($range['end']);
+ }
+ $dhcpdv6cfg[$ifname]['dns6ip'] = get_interface_ipv6($ifname);
+ }
+ }
+
+ $custoptionsv6 = "";
+ foreach ($dhcpdv6cfg as $dhcpv6if => $dhcpv6ifconf) {
+ if (is_array($dhcpv6ifconf['numberoptions']) && is_array($dhcpv6ifconf['numberoptions']['item'])) {
+ foreach ($dhcpv6ifconf['numberoptions']['item'] as $itemv6idx => $itemv6) {
+ $custoptionsv6 .= "option custom-{$dhcpv6if}-{$itemv6idx} code {$itemv6['number']} = text;\n";
+ }
+ }
+ }
+
+ if (isset($dhcpv6ifconf['netboot']) && !empty($dhcpv6ifconf['bootfile_url'])) {
+ $custoptionsv6 .= "option dhcp6.bootfile-url code 59 = string;\n";
+ }
+
+ $dhcpdv6conf = <<<EOD
+
+option domain-name "{$syscfg['domain']}";
+option ldap-server code 95 = text;
+option domain-search-list code 119 = text;
+{$custoptionsv6}
+default-lease-time 7200;
+max-lease-time 86400;
+log-facility local7;
+one-lease-per-client true;
+deny duplicates;
+ping-check true;
+update-conflict-detection false;
+
+EOD;
+
+ if (!isset($dhcpv6ifconf['disableauthoritative'])) {
+ $dhcpdv6conf .= "authoritative;\n";
+ }
+
+ if (isset($dhcpv6ifconf['alwaysbroadcast'])) {
+ $dhcpdv6conf .= "always-broadcast on\n";
+ }
+
+ $dhcpdv6ifs = array();
+
+ $dhcpv6num = 0;
+ $nsupdate = false;
+
+ foreach ($dhcpdv6cfg as $dhcpv6if => $dhcpv6ifconf) {
+
+ $ddns_zones = array();
+
+ $ifcfgv6 = $config['interfaces'][$dhcpv6if];
+
+ if (!isset($dhcpv6ifconf['enable']) || !isset($Iflist[$dhcpv6if]) || !isset($ifcfgv6['enable'])) {
+ continue;
+ }
+ $ifcfgipv6 = get_interface_ipv6($dhcpv6if);
+ $ifcfgsnv6 = get_interface_subnetv6($dhcpv6if);
+ $subnetv6 = gen_subnetv6($ifcfgipv6, $ifcfgsnv6);
+
+ if ($is_olsr_enabled == true) {
+ if ($dhcpv6ifconf['netmask']) {
+ $subnetmask = gen_subnet_maskv6($dhcpv6ifconf['netmask']);
+ }
+ }
+
+ $dnscfgv6 = "";
+
+ if ($dhcpv6ifconf['domain']) {
+ $dnscfgv6 .= " option domain-name \"{$dhcpv6ifconf['domain']}\";\n";
+ }
+
+ if ($dhcpv6ifconf['domainsearchlist'] <> "") {
+ $dnscfgv6 .= " option domain-search \"" . join("\",\"", preg_split("/[ ;]+/", $dhcpv6ifconf['domainsearchlist'])) . "\";\n";
+ }
+
+ if (isset($dhcpv6ifconf['ddnsupdate'])) {
+ if ($dhcpv6ifconf['ddnsdomain'] <> "") {
+ $dnscfgv6 .= " ddns-domainname \"{$dhcpv6ifconf['ddnsdomain']}\";\n";
+ }
+ $dnscfgv6 .= " ddns-update-style interim;\n";
+ $nsupdate = true;
+ }
+
+ if (is_array($dhcpv6ifconf['dnsserver']) && ($dhcpv6ifconf['dnsserver'][0])) {
+ $dnscfgv6 .= " option dhcp6.name-servers " . join(",", $dhcpv6ifconf['dnsserver']) . ";";
+ } else if (((isset($config['dnsmasq']['enable'])) || isset($config['unbound']['enable'])) && (is_ipaddrv6($ifcfgipv6))) {
+ $dnscfgv6 .= " option dhcp6.name-servers {$ifcfgipv6};";
+ } else if (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
+ $dns_arrv6 = array();
+ foreach ($syscfg['dnsserver'] as $dnsserver) {
+ if (is_ipaddrv6($dnsserver)) {
+ $dns_arrv6[] = $dnsserver;
+ }
+ }
+ if (!empty($dns_arrv6)) {
+ $dnscfgv6 .= " option dhcp6.name-servers " . join(",", $dns_arrv6) . ";";
+ }
+ }
+
+ if ($dhcpv6ifconf['domain']) {
+ $newzone = array();
+ $newzone['domain-name'] = $dhcpv6ifconf['domain'];
+ $newzone['dns-servers'][] = $dhcpv6ifconf['ddnsdomainprimary'];
+ $ddns_zones[] = $newzone;
+ }
+
+ if (is_ipaddrv6($ifcfgipv6)) {
+ $dhcpdv6conf .= "subnet6 {$subnetv6}/{$ifcfgsnv6}";
+ } else {
+ $subnet6 = gen_subnetv6($dhcpv6ifconf['range']['from'], "64");
+ $dhcpdv6conf .= "subnet6 {$subnet6}/64";
+ }
+ $dhcpdv6conf .= " {\n";
+
+ $dhcpdv6conf .= <<<EOD
+ range6 {$dhcpv6ifconf['range']['from']} {$dhcpv6ifconf['range']['to']};
+$dnscfgv6
+
+EOD;
+
+ if (is_ipaddrv6($dhcpv6ifconf['prefixrange']['from']) && is_ipaddrv6($dhcpv6ifconf['prefixrange']['to'])) {
+ $dhcpdv6conf .= " prefix6 {$dhcpv6ifconf['prefixrange']['from']} {$dhcpv6ifconf['prefixrange']['to']} /{$dhcpv6ifconf['prefixrange']['prefixlength']};\n";
+ }
+ if (is_ipaddrv6($dhcpv6ifconf['dns6ip'])) {
+ $dhcpdv6conf .= " option dhcp6.name-servers {$dhcpv6ifconf['dns6ip']};\n";
+ }
+ // default-lease-time
+ if ($dhcpv6ifconf['defaultleasetime']) {
+ $dhcpdv6conf .= " default-lease-time {$dhcpv6ifconf['defaultleasetime']};\n";
+ }
+
+ // max-lease-time
+ if ($dhcpv6ifconf['maxleasetime']) {
+ $dhcpdv6conf .= " max-lease-time {$dhcpv6ifconf['maxleasetime']};\n";
+ }
+
+ // ntp-servers
+ if (is_array($dhcpv6ifconf['ntpserver']) && $dhcpv6ifconf['ntpserver'][0]) {
+ $ntpservers = array();
+ foreach ($dhcpv6ifconf['ntpserver'] as $ntpserver) {
+ if (is_ipaddrv6($ntpserver)) {
+ $ntpservers[] = $ntpserver;
+ }
+ }
+ if (count($ntpservers) > 0) {
+ $dhcpdv6conf .= " option dhcp6.sntp-servers " . join(",", $dhcpv6ifconf['ntpserver']) . ";\n";
+ }
+ }
+ // tftp-server-name
+ /* Needs ISC DHCPD support
+ if ($dhcpv6ifconf['tftp'] <> "") {
+ $dhcpdv6conf .= " option tftp-server-name \"{$dhcpv6ifconf['tftp']}\";\n";
+ }
+ */
+
+ // Handle option, number rowhelper values
+ $dhcpdv6conf .= "\n";
+ if ($dhcpv6ifconf['numberoptions']['item']) {
+ foreach ($dhcpv6ifconf['numberoptions']['item'] as $itemv6idx => $itemv6) {
+ $dhcpdv6conf .= " option custom-{$dhcpv6if}-{$itemv6idx} \"{$itemv6['value']}\";\n";
+ }
+ }
+
+ // ldap-server
+ if ($dhcpv6ifconf['ldap'] <> "") {
+ $dhcpdv6conf .= " option ldap-server \"{$dhcpv6ifconf['ldap']}\";\n";
+ }
+
+ // net boot information
+ if (isset($dhcpv6ifconf['netboot'])) {
+ if (!empty($dhcpv6ifconf['bootfile_url'])) {
+ $dhcpdv6conf .= " option dhcp6.bootfile-url \"{$dhcpv6ifconf['bootfile_url']}\";\n";
+ }
+ }
+
+ $dhcpdv6conf .= "}\n";
+
+ /* add static mappings */
+ /* Needs to use DUID */
+ if (is_array($dhcpv6ifconf['staticmap'])) {
+ $i = 0;
+ foreach ($dhcpv6ifconf['staticmap'] as $sm) {
+ $dhcpdv6conf .= <<<EOD
+host s_{$dhcpv6if}_{$i} {
+ host-identifier option dhcp6.client-id {$sm['duid']};
+
+EOD;
+ if ($sm['ipaddrv6']) {
+ $dhcpdv6conf .= " fixed-address6 {$sm['ipaddrv6']};\n";
+ }
+
+ if ($sm['hostname']) {
+ $dhhostname = str_replace(" ", "_", $sm['hostname']);
+ $dhhostname = str_replace(".", "_", $dhhostname);
+ $dhcpdv6conf .= " option host-name {$dhhostname};\n";
+ }
+ if ($sm['filename']) {
+ $dhcpdv6conf .= " filename \"{$sm['filename']}\";\n";
+ }
+
+ if ($sm['rootpath']) {
+ $dhcpdv6conf .= " option root-path \"{$sm['rootpath']}\";\n";
+ }
+
+ $dhcpdv6conf .= "}\n";
+ $i++;
+ }
+ }
+
+ if ($dhcpv6ifconf['domain']) {
+ $dhcpdv6conf .= dhcpdkey($dhcpv6ifconf);
+ $dhcpdv6conf .= dhcpdzones($ddns_zones, $dhcpv6ifconf);
+ }
+
+ if ($config['dhcpdv6'][$dhcpv6if]['ramode'] <> "unmanaged" && isset($config['interfaces'][$dhcpv6if]['enable'])) {
+ if (preg_match("/poes/si", $dhcpv6if)) {
+ /* magic here */
+ $dhcpdv6ifs = array_merge($dhcpdv6ifs, get_pppoes_child_interfaces($dhcpv6if));
+ } else {
+ $realif = get_real_interface($dhcpv6if, "inet6");
+ if (stristr("$realif", "bridge")) {
+ $mac = get_interface_mac($realif);
+ $v6address = generate_ipv6_from_mac($mac);
+ /* Create link local address for bridges */
+ mwexec("/sbin/ifconfig {$realif} inet6 {$v6address}");
+ }
+ $realif = escapeshellcmd($realif);
+ $dhcpdv6ifs[] = $realif;
+ }
+ }
+ }
+
+ if ($nsupdate) {
+ $dhcpdv6conf .= "ddns-update-style interim;\n";
+ } else {
+ $dhcpdv6conf .= "ddns-update-style none;\n";
+ }
+
+ /* write dhcpdv6.conf */
+ if (!@file_put_contents("{$g['dhcpd_chroot_path']}/etc/dhcpdv6.conf", $dhcpdv6conf)) {
+ log_error("Error: cannot open {$g['dhcpd_chroot_path']}/etc/dhcpdv6.conf in services_dhcpdv6_configure().\n");
+ if (platform_booting()) {
+ printf("Error: cannot open {$g['dhcpd_chroot_path']}/etc/dhcpdv6.conf in services_dhcpdv6_configure().\n");
+ }
+ unset($dhcpdv6conf);
+ return 1;
+ }
+ unset($dhcpdv6conf);
+
+ /* create an empty leases v6 database */
+ if (!file_exists("{$g['dhcpd_chroot_path']}/var/db/dhcpd6.leases")) {
+ @touch("{$g['dhcpd_chroot_path']}/var/db/dhcpd6.leases");
+ }
+
+ /* make sure there isn't a stale dhcpdv6.pid file, which may make dhcpdv6 fail to start. */
+ /* if we get here, dhcpdv6 has been killed and is not started yet */
+ unlink_if_exists("{$g['dhcpd_chroot_path']}{$g['varrun_path']}/dhcpdv6.pid");
+
+ /* fire up dhcpd in a chroot */
+ if (count($dhcpdv6ifs) > 0) {
+ mwexec("/usr/local/sbin/dhcpd -6 -user dhcpd -group _dhcp -chroot {$g['dhcpd_chroot_path']} -cf /etc/dhcpdv6.conf -pf {$g['varrun_path']}/dhcpdv6.pid " .
+ join(" ", $dhcpdv6ifs));
+ mwexec("/usr/local/sbin/dhcpleases6 -c \"/usr/local/bin/php-cgi -f /usr/local/sbin/prefixes.php|/bin/sh\" -l {$g['dhcpd_chroot_path']}/var/db/dhcpd6.leases");
+ }
+ if (platform_booting()) {
+ print gettext("done.") . "\n";
+ }
+
+ return 0;
+}
+
+function services_igmpproxy_configure() {
+ global $config, $g;
+
+ /* kill any running igmpproxy */
+ killbyname("igmpproxy");
+
+ if (!is_array($config['igmpproxy']['igmpentry']) || (count($config['igmpproxy']['igmpentry']) == 0)) {
+ return 1;
+ }
+
+ $iflist = get_configured_interface_list();
+
+ $igmpconf = <<<EOD
+
+##------------------------------------------------------
+## Enable Quickleave mode (Sends Leave instantly)
+##------------------------------------------------------
+quickleave
+
+EOD;
+
+ foreach ($config['igmpproxy']['igmpentry'] as $igmpcf) {
+ unset($iflist[$igmpcf['ifname']]);
+ $realif = get_real_interface($igmpcf['ifname']);
+ if (empty($igmpcf['threshold'])) {
+ $threshld = 1;
+ } else {
+ $threshld = $igmpcf['threshold'];
+ }
+ $igmpconf .= "phyint {$realif} {$igmpcf['type']} ratelimit 0 threshold {$threshld}\n";
+
+ if ($igmpcf['address'] <> "") {
+ $item = explode(" ", $igmpcf['address']);
+ foreach ($item as $iww) {
+ $igmpconf .= "altnet {$iww}\n";
+ }
+ }
+ $igmpconf .= "\n";
+ }
+ foreach ($iflist as $ifn) {
+ $realif = get_real_interface($ifn);
+ $igmpconf .= "phyint {$realif} disabled\n";
+ }
+ $igmpconf .= "\n";
+
+ $igmpfl = fopen($g['tmp_path'] . "/igmpproxy.conf", "w");
+ if (!$igmpfl) {
+ log_error(gettext("Could not write Igmpproxy configuration file!"));
+ return;
+ }
+ fwrite($igmpfl, $igmpconf);
+ fclose($igmpfl);
+ unset($igmpconf);
+
+ /* NOTE: -d4 means everything LOG_WARNING and smaller */
+ mwexec("/usr/local/sbin/igmpproxy -d4 -c {$g['tmp_path']}/igmpproxy.conf");
+ log_error(gettext("Started IGMP proxy service."));
+
+ return 0;
+}
+
+function services_dhcrelay_configure() {
+ global $config, $g;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_dhcrelay_configure() being called $mt\n";
+ }
+
+ /* kill any running dhcrelay */
+ killbypid("{$g['varrun_path']}/dhcrelay.pid");
+
+ $dhcrelaycfg =& $config['dhcrelay'];
+
+ /* DHCPRelay enabled on any interfaces? */
+ if (!isset($dhcrelaycfg['enable'])) {
+ return 0;
+ }
+
+ if (platform_booting()) {
+ echo gettext("Starting DHCP relay service...");
+ } else {
+ sleep(1);
+ }
+
+ $iflist = get_configured_interface_list();
+
+ $dhcifaces = explode(",", $dhcrelaycfg['interface']);
+ foreach ($dhcifaces as $dhcrelayif) {
+ if (!isset($iflist[$dhcrelayif]) ||
+ link_interface_to_bridge($dhcrelayif)) {
+ continue;
+ }
+
+ if (is_ipaddr(get_interface_ip($dhcrelayif))) {
+ $dhcrelayifs[] = get_real_interface($dhcrelayif);
+ }
+ }
+
+ $srvips = explode(",", $dhcrelaycfg['server']);
+ if (!is_array($srvips)) {
+ log_error("No destination IP has been configured!");
+ return;
+ }
+
+ $dhcrelayifs = array_unique($dhcrelayifs);
+
+ /* fire up dhcrelay */
+ if (empty($dhcrelayifs)) {
+ log_error("No suitable interface found for running dhcrelay!");
+ return; /* XXX */
+ }
+
+ $cmd = "/usr/local/sbin/dhcrelay -i " . implode(" -i ", $dhcrelayifs);
+
+ if (isset($dhcrelaycfg['agentoption'])) {
+ $cmd .= " -a -m replace";
+ }
+
+ $cmd .= " " . implode(" ", $srvips);
+ mwexec($cmd);
+ unset($cmd);
+
+ return 0;
+}
+
+function services_dhcrelay6_configure() {
+ global $config, $g;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_dhcrelay6_configure() being called $mt\n";
+ }
+
+ /* kill any running dhcrelay */
+ killbypid("{$g['varrun_path']}/dhcrelay6.pid");
+
+ $dhcrelaycfg =& $config['dhcrelay6'];
+
+ /* DHCPv6 Relay enabled on any interfaces? */
+ if (!isset($dhcrelaycfg['enable'])) {
+ return 0;
+ }
+
+ if (platform_booting()) {
+ echo gettext("Starting DHCPv6 relay service...");
+ } else {
+ sleep(1);
+ }
+
+ $iflist = get_configured_interface_list();
+
+ $dhcifaces = explode(",", $dhcrelaycfg['interface']);
+ foreach ($dhcifaces as $dhcrelayif) {
+ if (!isset($iflist[$dhcrelayif]) ||
+ link_interface_to_bridge($dhcrelayif)) {
+ continue;
+ }
+
+ if (is_ipaddrv6(get_interface_ipv6($dhcrelayif))) {
+ $dhcrelayifs[] = get_real_interface($dhcrelayif);
+ }
+ }
+ $dhcrelayifs = array_unique($dhcrelayifs);
+
+ $srvips = explode(",", $dhcrelaycfg['server']);
+ if (!is_array($srvips)) {
+ log_error("No destination IP has been configured!");
+ return;
+ }
+
+ /* fire up dhcrelay */
+ if (empty($dhcrelayifs) || empty($srvifaces)) {
+ log_error("No suitable interface found for running dhcrelay -6!");
+ return; /* XXX */
+ }
+
+ $cmd = "/usr/local/sbin/dhcrelay -6 -pf \"{$g['varrun_path']}/dhcrelay6.pid\"";
+ foreach ($dhcrelayifs as $dhcrelayif) {
+ $cmd .= " -l {$dhcrelayif}";
+ }
+ foreach ($srvifaces as $srviface) {
+ $cmd .= " -u \"{$srviface}\"";
+ }
+ mwexec($cmd);
+ unset($cmd);
+
+ return 0;
+}
+
+function services_dyndns_configure_client($conf) {
+
+ if (!isset($conf['enable'])) {
+ return;
+ }
+
+ /* load up the dyndns.class */
+ require_once("dyndns.class");
+
+ $dns = new updatedns($dnsService = $conf['type'],
+ $dnsHost = $conf['host'],
+ $dnsUser = $conf['username'],
+ $dnsPass = $conf['password'],
+ $dnsWildcard = $conf['wildcard'],
+ $dnsMX = $conf['mx'],
+ $dnsIf = "{$conf['interface']}",
+ $dnsBackMX = NULL,
+ $dnsServer = NULL,
+ $dnsPort = NULL,
+ $dnsUpdateURL = "{$conf['updateurl']}",
+ $forceUpdate = $conf['force'],
+ $dnsZoneID = $conf['zoneid'],
+ $dnsTTL = $conf['ttl'],
+ $dnsResultMatch = "{$conf['resultmatch']}",
+ $dnsRequestIf = "{$conf['requestif']}",
+ $dnsID = "{$conf['id']}",
+ $dnsVerboseLog = $conf['verboselog'],
+ $curlIpresolveV4 = $conf['curl_ipresolve_v4'],
+ $curlSslVerifypeer = $conf['curl_ssl_verifypeer']);
+}
+
+function services_dyndns_configure($int = "") {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_dyndns_configure() being called $mt\n";
+ }
+
+ $dyndnscfg = $config['dyndnses']['dyndns'];
+ $gwgroups = return_gateway_groups_array();
+ if (is_array($dyndnscfg)) {
+ if (platform_booting()) {
+ echo gettext("Starting DynDNS clients...");
+ }
+
+ foreach ($dyndnscfg as $dyndns) {
+ if ((empty($int)) || ($int == $dyndns['interface']) || (is_array($gwgroups[$dyndns['interface']]))) {
+ $dyndns['verboselog'] = isset($dyndns['verboselog']);
+ $dyndns['curl_ipresolve_v4'] = isset($dyndns['curl_ipresolve_v4']);
+ $dyndns['curl_ssl_verifypeer'] = isset($dyndns['curl_ssl_verifypeer']);
+ services_dyndns_configure_client($dyndns);
+ sleep(1);
+ }
+ }
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+ }
+
+ return 0;
+}
+
+function dyndnsCheckIP($int) {
+ global $config;
+ $ip_address = get_interface_ip($int);
+ if (is_private_ip($ip_address)) {
+ $gateways_status = return_gateways_status(true);
+ // If the gateway for this interface is down, then the external check cannot work.
+ // Avoid the long wait for the external check to timeout.
+ if (stristr($gateways_status[$config['interfaces'][$int]['gateway']]['status'], "down")) {
+ return "down";
+ }
+ $hosttocheck = "http://checkip.dyndns.org";
+ $ip_ch = curl_init($hosttocheck);
+ curl_setopt($ip_ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ip_ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+ curl_setopt($ip_ch, CURLOPT_INTERFACE, 'host!' . $ip_address);
+ curl_setopt($ip_ch, CURLOPT_CONNECTTIMEOUT, '30');
+ curl_setopt($ip_ch, CURLOPT_TIMEOUT, 120);
+ curl_setopt($ip_ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
+ $ip_result_page = curl_exec($ip_ch);
+ curl_close($ip_ch);
+ $ip_result_decoded = urldecode($ip_result_page);
+ preg_match('=Current IP Address: (.*)</body>=siU', $ip_result_decoded, $matches);
+ $ip_address = trim($matches[1]);
+ }
+ return $ip_address;
+}
+
+function services_dnsmasq_configure() {
+ global $config, $g;
+ $return = 0;
+
+ // hard coded args: will be removed to avoid duplication if specified in custom_options
+ $standard_args = array(
+ "dns-forward-max" => "--dns-forward-max=5000",
+ "cache-size" => "--cache-size=10000",
+ "local-ttl" => "--local-ttl=1"
+ );
+
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_dnsmasq_configure() being called $mt\n";
+ }
+
+ /* kill any running dnsmasq */
+ if (file_exists("{$g['varrun_path']}/dnsmasq.pid")) {
+ sigkillbypid("{$g['varrun_path']}/dnsmasq.pid", "TERM");
+ }
+
+ if (isset($config['dnsmasq']['enable'])) {
+
+ if (platform_booting()) {
+ echo gettext("Starting DNS forwarder...");
+ } else {
+ sleep(1);
+ }
+
+ /* generate hosts file */
+ if (system_hosts_generate() != 0) {
+ $return = 1;
+ }
+
+ $args = "";
+
+ if (isset($config['dnsmasq']['regdhcp'])) {
+ $args .= " --dhcp-hostsfile={$g['varetc_path']}/hosts ";
+ }
+
+ /* Setup listen port, if non-default */
+ if (is_port($config['dnsmasq']['port'])) {
+ $args .= " --port={$config['dnsmasq']['port']} ";
+ }
+
+ $listen_addresses = "";
+ if (isset($config['dnsmasq']['interface'])) {
+ $interfaces = explode(",", $config['dnsmasq']['interface']);
+ foreach ($interfaces as $interface) {
+ if (is_ipaddrv4($interface)) {
+ $listen_addresses .= " --listen-address={$interface} ";
+ } else if (is_ipaddrv6($interface)) {
+ /*
+ * XXX: Since dnsmasq does not support link-local address
+ * with scope specified. These checks are being done.
+ */
+ if (is_linklocal($interface) && strstr($interface, "%")) {
+ $tmpaddrll6 = explode("%", $interface);
+ $listen_addresses .= " --listen-address={$tmpaddrll6[0]} ";
+ } else {
+ $listen_addresses .= " --listen-address={$interface} ";
+ }
+ } else if (strstr($interface, "_vip")) {
+ $laddr = get_configured_carp_interface_list($interface);
+ if (is_ipaddr($laddr)) {
+ $listen_addresses .= " --listen-address={$laddr} ";
+ }
+ } else {
+ $if = get_real_interface($interface);
+ if (does_interface_exist($if)) {
+ $laddr = get_interface_ip($interface);
+ if (is_ipaddrv4($laddr)) {
+ $listen_addresses .= " --listen-address={$laddr} ";
+ }
+ $laddr6 = get_interface_ipv6($interface);
+ if (is_ipaddrv6($laddr6) && !isset($config['dnsmasq']['strictbind'])) {
+ /*
+ * XXX: Since dnsmasq does not support link-local address
+ * with scope specified. These checks are being done.
+ */
+ if (is_linklocal($laddr6) && strstr($laddr6, "%")) {
+ $tmpaddrll6 = explode("%", $laddr6);
+ $listen_addresses .= " --listen-address={$tmpaddrll6[0]} ";
+ } else {
+ $listen_addresses .= " --listen-address={$laddr6} ";
+ }
+ }
+ }
+ }
+ }
+ if (!empty($listen_addresses)) {
+ $args .= " {$listen_addresses} ";
+ if (isset($config['dnsmasq']['strictbind'])) {
+ $args .= " --bind-interfaces ";
+ }
+ }
+ }
+
+ /* If selected, then first forward reverse lookups for private IPv4 addresses to nowhere. */
+ /* Only make entries for reverse domains that do not have a matching domain override. */
+ if (isset($config['dnsmasq']['no_private_reverse'])) {
+ /* Note: Carrier Grade NAT (CGN) addresses 100.64.0.0/10 are intentionally not here. */
+ /* End-users should not be aware of CGN addresses, so reverse lookups for these should not happen. */
+ /* Just the pfSense WAN might get a CGN address from an ISP. */
+
+ // Build an array of domain overrides to help in checking for matches.
+ $override_a = array();
+ if (isset($config['dnsmasq']['domainoverrides']) && is_array($config['dnsmasq']['domainoverrides'])) {
+ foreach ($config['dnsmasq']['domainoverrides'] as $override) {
+ $override_a[$override['domain']] = "y";
+ }
+ }
+
+ // Build an array of the private reverse lookup domain names
+ $reverse_domain_a = array("10.in-addr.arpa", "168.192.in-addr.arpa");
+ // Unfortunately the 172.16.0.0/12 range does not map nicely to the in-addr.arpa scheme.
+ for ($subnet_num = 16; $subnet_num < 32; $subnet_num++) {
+ $reverse_domain_a[] = "$subnet_num.172.in-addr.arpa";
+ }
+
+ // Set the --server parameter to nowhere for each reverse domain name that was not specifically specified in a domain override.
+ foreach ($reverse_domain_a as $reverse_domain) {
+ if (!isset($override_a[$reverse_domain])) {
+ $args .= " --server=/$reverse_domain/ ";
+ }
+ }
+ unset($override_a);
+ unset($reverse_domain_a);
+ }
+
+ /* Setup forwarded domains */
+ if (isset($config['dnsmasq']['domainoverrides']) && is_array($config['dnsmasq']['domainoverrides'])) {
+ foreach ($config['dnsmasq']['domainoverrides'] as $override) {
+ if ($override['ip'] == "!") {
+ $override[ip] = "";
+ }
+ $args .= ' --server=/' . $override['domain'] . '/' . $override['ip'];
+ }
+ }
+
+ /* Allow DNS Rebind for forwarded domains */
+ if (isset($config['dnsmasq']['domainoverrides']) && is_array($config['dnsmasq']['domainoverrides'])) {
+ if (!isset($config['system']['webgui']['nodnsrebindcheck'])) {
+ foreach ($config['dnsmasq']['domainoverrides'] as $override) {
+ $args .= ' --rebind-domain-ok=/' . $override['domain'] . '/ ';
+ }
+ }
+ }
+
+ if (!isset($config['system']['webgui']['nodnsrebindcheck'])) {
+ $dns_rebind = "--rebind-localhost-ok --stop-dns-rebind";
+ }
+
+ if (isset($config['dnsmasq']['strict_order'])) {
+ $args .= " --strict-order ";
+ }
+
+ if (isset($config['dnsmasq']['domain_needed'])) {
+ $args .= " --domain-needed ";
+ }
+
+ if ($config['dnsmasq']['custom_options']) {
+ foreach (preg_split('/\s+/', $config['dnsmasq']['custom_options']) as $c) {
+ $args .= " " . escapeshellarg("--{$c}");
+ $p = explode('=', $c);
+ if (array_key_exists($p[0], $standard_args)) {
+ unset($standard_args[$p[0]]);
+ }
+ }
+ }
+ $args .= ' ' . implode(' ', array_values($standard_args));
+
+ /* run dnsmasq */
+ $cmd = "/usr/local/sbin/dnsmasq --all-servers {$dns_rebind} {$args}";
+ //log_error("dnsmasq command: {$cmd}");
+ mwexec_bg($cmd);
+ unset($args);
+
+ system_dhcpleases_configure();
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+ }
+
+ if (!platform_booting()) {
+ if (services_dhcpd_configure() != 0) {
+ $return = 1;
+ }
+ }
+
+ return $return;
+}
+
+function services_unbound_configure() {
+ global $config, $g;
+ $return = 0;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_unbound_configure() being called $mt\n";
+ }
+
+ // kill any running Unbound instance
+ if (file_exists("{$g['varrun_path']}/unbound.pid")) {
+ sigkillbypid("{$g['varrun_path']}/unbound.pid", "TERM");
+ }
+
+ if (isset($config['unbound']['enable'])) {
+ if (platform_booting()) {
+ echo gettext("Starting DNS Resolver...");
+ } else {
+ sleep(1);
+ }
+
+ /* generate hosts file */
+ if (system_hosts_generate() != 0) {
+ $return = 1;
+ }
+
+ require_once('/etc/inc/unbound.inc');
+ sync_unbound_service();
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+
+ system_dhcpleases_configure();
+ }
+
+ if (!platform_booting()) {
+ if (services_dhcpd_configure() != 0) {
+ $return = 1;
+ }
+ }
+
+ return $return;
+}
+
+function services_snmpd_configure() {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_snmpd_configure() being called $mt\n";
+ }
+
+ /* kill any running snmpd */
+ sigkillbypid("{$g['varrun_path']}/snmpd.pid", "TERM");
+ sleep(2);
+ if (is_process_running("bsnmpd")) {
+ mwexec("/usr/bin/killall bsnmpd", true);
+ }
+
+ if (isset($config['snmpd']['enable'])) {
+
+ if (platform_booting()) {
+ echo gettext("Starting SNMP daemon... ");
+ }
+
+ /* generate snmpd.conf */
+ $fd = fopen("{$g['varetc_path']}/snmpd.conf", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open snmpd.conf in services_snmpd_configure().%s"), "\n");
+ return 1;
+ }
+
+
+ $snmpdconf = <<<EOD
+location := "{$config['snmpd']['syslocation']}"
+contact := "{$config['snmpd']['syscontact']}"
+read := "{$config['snmpd']['rocommunity']}"
+
+EOD;
+
+/* No docs on what write strings do there for disable for now.
+ if (isset($config['snmpd']['rwenable']) && preg_match('/^\S+$/', $config['snmpd']['rwcommunity'])) {
+ $snmpdconf .= <<<EOD
+# write string
+write := "{$config['snmpd']['rwcommunity']}"
+
+EOD;
+ }
+*/
+
+
+ if (isset($config['snmpd']['trapenable']) && preg_match('/^\S+$/', $config['snmpd']['trapserver'])) {
+ $snmpdconf .= <<<EOD
+# SNMP Trap support.
+traphost := {$config['snmpd']['trapserver']}
+trapport := {$config['snmpd']['trapserverport']}
+trap := "{$config['snmpd']['trapstring']}"
+
+
+EOD;
+ }
+
+ $platform = trim(file_get_contents('/etc/platform'));
+ if (($platform == "pfSense") && ($g['product_name'] != "pfSense")) {
+ $platform = $g['product_name'];
+ }
+ $sysDescr = "{$g['product_name']} " . php_uname("n") .
+ " {$g['product_version']} {$platform} " . php_uname("s") .
+ " " . php_uname("r") . " " . php_uname("m");
+
+ $snmpdconf .= <<<EOD
+system := 1 # pfSense
+%snmpd
+sysDescr = "{$sysDescr}"
+begemotSnmpdDebugDumpPdus = 2
+begemotSnmpdDebugSyslogPri = 7
+begemotSnmpdCommunityString.0.1 = $(read)
+
+EOD;
+
+/* No docs on what write strings do there for disable for now.
+ if (isset($config['snmpd']['rwcommunity']) && preg_match('/^\S+$/', $config['snmpd']['rwcommunity'])) {
+ $snmpdconf .= <<<EOD
+begemotSnmpdCommunityString.0.2 = $(write)
+
+EOD;
+ }
+*/
+
+
+ if (isset($config['snmpd']['trapenable']) && preg_match('/^\S+$/', $config['snmpd']['trapserver'])) {
+ $snmpdconf .= <<<EOD
+begemotTrapSinkStatus.[$(traphost)].$(trapport) = 4
+begemotTrapSinkVersion.[$(traphost)].$(trapport) = 2
+begemotTrapSinkComm.[$(traphost)].$(trapport) = $(trap)
+
+EOD;
+ }
+
+
+ $snmpdconf .= <<<EOD
+begemotSnmpdCommunityDisable = 1
+
+EOD;
+
+ if (isset($config['snmpd']['bindlan'])) {
+ $config['snmpd']['bindip'] = 'lan';
+ unset($config['snmpd']['bindlan']);
+ }
+ $bind_to_ip = "0.0.0.0";
+ if (isset($config['snmpd']['bindip'])) {
+ if (is_ipaddr($config['snmpd']['bindip'])) {
+ $bind_to_ip = $config['snmpd']['bindip'];
+ } else {
+ $if = get_real_interface($config['snmpd']['bindip']);
+ if (does_interface_exist($if)) {
+ $bind_to_ip = get_interface_ip($config['snmpd']['bindip']);
+ }
+ }
+ }
+
+ if (is_port($config['snmpd']['pollport'])) {
+ $snmpdconf .= <<<EOD
+begemotSnmpdPortStatus.{$bind_to_ip}.{$config['snmpd']['pollport']} = 1
+
+EOD;
+
+ }
+
+ $snmpdconf .= <<<EOD
+begemotSnmpdLocalPortStatus."/var/run/snmpd.sock" = 1
+begemotSnmpdLocalPortType."/var/run/snmpd.sock" = 4
+
+# These are bsnmp macros not php vars.
+sysContact = $(contact)
+sysLocation = $(location)
+sysObjectId = 1.3.6.1.4.1.12325.1.1.2.1.$(system)
+
+snmpEnableAuthenTraps = 2
+
+EOD;
+
+ if (is_array($config['snmpd']['modules'])) {
+ if (isset($config['snmpd']['modules']['mibii'])) {
+ $snmpdconf .= <<<EOD
+begemotSnmpdModulePath."mibII" = "/usr/lib/snmp_mibII.so"
+
+EOD;
+ }
+
+ if (isset($config['snmpd']['modules']['netgraph'])) {
+ $snmpdconf .= <<<EOD
+begemotSnmpdModulePath."netgraph" = "/usr/lib/snmp_netgraph.so"
+%netgraph
+begemotNgControlNodeName = "snmpd"
+
+EOD;
+ }
+
+ if (isset($config['snmpd']['modules']['pf'])) {
+ $snmpdconf .= <<<EOD
+begemotSnmpdModulePath."pf" = "/usr/lib/snmp_pf.so"
+
+EOD;
+ }
+
+ if (isset($config['snmpd']['modules']['hostres'])) {
+ /* XXX: hostres module crashes APU - ticket #4403 */
+ $specplatform = system_identify_specific_platform();
+ if ($specplatform['name'] == 'APU') {
+ log_error("'Host Resources' SNMP module was ignored because it can potentially crash system on APU boards");
+ } else {
+ $snmpdconf .= <<<EOD
+begemotSnmpdModulePath."hostres" = "/usr/lib/snmp_hostres.so"
+
+EOD;
+ }
+ unset($specplatform);
+ }
+
+ if (isset($config['snmpd']['modules']['bridge'])) {
+ $snmpdconf .= <<<EOD
+begemotSnmpdModulePath."bridge" = "/usr/lib/snmp_bridge.so"
+# config must end with blank line
+
+EOD;
+ }
+ if (isset($config['snmpd']['modules']['ucd'])) {
+ $snmpdconf .= <<<EOD
+begemotSnmpdModulePath."ucd" = "/usr/local/lib/snmp_ucd.so"
+
+EOD;
+ }
+ if (isset($config['snmpd']['modules']['regex'])) {
+ $snmpdconf .= <<<EOD
+begemotSnmpdModulePath."regex" = "/usr/local/lib/snmp_regex.so"
+
+EOD;
+ }
+ }
+
+ fwrite($fd, $snmpdconf);
+ fclose($fd);
+ unset($snmpdconf);
+
+ if (isset($config['snmpd']['bindlan'])) {
+ $bindlan = "";
+ }
+
+ /* run bsnmpd */
+ mwexec("/usr/sbin/bsnmpd -c {$g['varetc_path']}/snmpd.conf" .
+ "{$bindlan} -p {$g['varrun_path']}/snmpd.pid");
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+ }
+
+ return 0;
+}
+
+function services_dnsupdate_process($int = "", $updatehost = "", $forced = false) {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "services_dnsupdate_process() being called $mt\n";
+ }
+
+ /* Dynamic DNS updating active? */
+ if (is_array($config['dnsupdates']['dnsupdate'])) {
+ $notify_text = "";
+ foreach ($config['dnsupdates']['dnsupdate'] as $i => $dnsupdate) {
+ if (!isset($dnsupdate['enable'])) {
+ continue;
+ }
+ if (!empty($int) && $int != $dnsupdate['interface']) {
+ continue;
+ }
+ if (!empty($updatehost) && ($updatehost != $dnsupdate['host'])) {
+ continue;
+ }
+
+ /* determine interface name */
+ $if = get_real_interface($dnsupdate['interface']);
+
+ if (isset($dnsupdate['usepublicip'])) {
+ $wanip = dyndnsCheckIP($dnsupdate['interface']);
+ } else {
+ $wanip = get_interface_ip($dnsupdate['interface']);
+ }
+
+ $wanipv6 = get_interface_ipv6($dnsupdate['interface']);
+ $cacheFile = "{$g['conf_path']}/dyndns_{$dnsupdate['interface']}_rfc2136_" . escapeshellarg($dnsupdate['host']) . "_{$dnsupdate['server']}.cache";
+ $currentTime = time();
+
+ if ($wanip || $wanipv6) {
+ $keyname = $dnsupdate['keyname'];
+ /* trailing dot */
+ if (substr($keyname, -1) != ".") {
+ $keyname .= ".";
+ }
+
+ $hostname = $dnsupdate['host'];
+ /* trailing dot */
+ if (substr($hostname, -1) != ".") {
+ $hostname .= ".";
+ }
+
+ /* write private key file
+ this is dumb - public and private keys are the same for HMAC-MD5,
+ but nsupdate insists on having both */
+ $fd = fopen("{$g['varetc_path']}/K{$i}{$keyname}+157+00000.private", "w");
+ $privkey = <<<EOD
+Private-key-format: v1.2
+Algorithm: 157 (HMAC)
+Key: {$dnsupdate['keydata']}
+
+EOD;
+ fwrite($fd, $privkey);
+ fclose($fd);
+
+ /* write public key file */
+ if ($dnsupdate['keytype'] == "zone") {
+ $flags = 257;
+ $proto = 3;
+ } else if ($dnsupdate['keytype'] == "host") {
+ $flags = 513;
+ $proto = 3;
+ } else if ($dnsupdate['keytype'] == "user") {
+ $flags = 0;
+ $proto = 2;
+ }
+
+ $fd = fopen("{$g['varetc_path']}/K{$i}{$keyname}+157+00000.key", "w");
+ fwrite($fd, "{$keyname} IN KEY {$flags} {$proto} 157 {$dnsupdate['keydata']}\n");
+ fclose($fd);
+
+ /* generate update instructions */
+ $upinst = "";
+ if (!empty($dnsupdate['server'])) {
+ $upinst .= "server {$dnsupdate['server']}\n";
+ }
+
+ if (file_exists($cacheFile)) {
+ list($cachedipv4, $cacheTimev4) = explode("|", file_get_contents($cacheFile));
+ }
+ if (file_exists("{$cacheFile}.ipv6")) {
+ list($cachedipv6, $cacheTimev6) = explode("|", file_get_contents("{$cacheFile}.ipv6"));
+ }
+
+ // 25 Days
+ $maxCacheAgeSecs = 25 * 24 * 60 * 60;
+ $need_update = false;
+
+ conf_mount_rw();
+ /* Update IPv4 if we have it. */
+ if (is_ipaddrv4($wanip) && $dnsupdate['recordtype'] != "AAAA") {
+ if (($wanip != $cachedipv4) || (($currentTime - $cacheTimev4) > $maxCacheAgeSecs) || $forced) {
+ $upinst .= "update delete {$dnsupdate['host']}. A\n";
+ $upinst .= "update add {$dnsupdate['host']}. {$dnsupdate['ttl']} A {$wanip}\n";
+ $notify_text .= sprintf(gettext("DynDNS updated IP Address (A) for {$dnsupdate['host']} on %s (%s) to %s"), convert_real_interface_to_friendly_descr($if), $if, $wanip) . "\n";
+ @file_put_contents($cacheFile, "{$wanip}|{$currentTime}");
+ log_error("phpDynDNS: updating cache file {$cacheFile}: {$wanip}");
+ $need_update = true;
+ } else {
+ log_error("phpDynDNS: Not updating {$dnsupdate['host']} A record because the IP address has not changed.");
+ }
+ } else {
+ @unlink($cacheFile);
+ }
+
+ /* Update IPv6 if we have it. */
+ if (is_ipaddrv6($wanipv6) && $dnsupdate['recordtype'] != "A") {
+ if (($wanipv6 != $cachedipv6) || (($currentTime - $cacheTimev6) > $maxCacheAgeSecs) || $forced) {
+ $upinst .= "update delete {$dnsupdate['host']}. AAAA\n";
+ $upinst .= "update add {$dnsupdate['host']}. {$dnsupdate['ttl']} AAAA {$wanipv6}\n";
+ $notify_text .= sprintf(gettext("DynDNS updated IPv6 Address (AAAA) for {$dnsupdate['host']} on %s (%s) to %s"), convert_real_interface_to_friendly_descr($if), $if, $wanipv6) . "\n";
+ @file_put_contents("{$cacheFile}.ipv6", "{$wanipv6}|{$currentTime}");
+ log_error("phpDynDNS: updating cache file {$cacheFile}.ipv6: {$wanipv6}");
+ $need_update = true;
+ } else {
+ log_error("phpDynDNS: Not updating {$dnsupdate['host']} AAAA record because the IPv6 address has not changed.");
+ }
+ } else {
+ @unlink("{$cacheFile}.ipv6");
+ }
+ conf_mount_ro();
+
+ $upinst .= "\n"; /* mind that trailing newline! */
+
+ if ($need_update) {
+ @file_put_contents("{$g['varetc_path']}/nsupdatecmds{$i}", $upinst);
+ unset($upinst);
+ /* invoke nsupdate */
+ $cmd = "/usr/local/bin/nsupdate -k {$g['varetc_path']}/K{$i}{$keyname}+157+00000.key";
+ if (isset($dnsupdate['usetcp'])) {
+ $cmd .= " -v";
+ }
+ $cmd .= " {$g['varetc_path']}/nsupdatecmds{$i}";
+ mwexec_bg($cmd);
+ unset($cmd);
+ }
+ }
+ }
+ if (!empty($notify_text)) {
+ notify_all_remote($notify_text);
+ }
+ }
+
+ return 0;
+}
+
+/* configure cron service */
+function configure_cron() {
+ global $g, $config;
+
+ conf_mount_rw();
+ /* preserve existing crontab entries */
+ $crontab_contents = file("/etc/crontab", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+
+ for ($i = 0; $i < count($crontab_contents); $i++) {
+ $cron_item =& $crontab_contents[$i];
+ if (strpos($cron_item, "# pfSense specific crontab entries") !== false) {
+ array_splice($crontab_contents, $i - 1);
+ break;
+ }
+ }
+ $crontab_contents = implode("\n", $crontab_contents) . "\n";
+
+
+ if (is_array($config['cron']['item'])) {
+ $crontab_contents .= "#\n";
+ $crontab_contents .= "# " . gettext("pfSense specific crontab entries") . "\n";
+ $crontab_contents .= "# " .gettext("Created:") . " " . date("F j, Y, g:i a") . "\n";
+ $crontab_contents .= "#\n";
+
+ if (isset($config['system']['proxyurl']) && !empty($config['system']['proxyurl'])) {
+ $http_proxy = $config['system']['proxyurl'];
+ if (isset($config['system']['proxyport']) && !empty($config['system']['proxyport'])) {
+ $http_proxy .= ':' . $config['system']['proxyport'];
+ }
+ $crontab_contents .= "HTTP_PROXY={$http_proxy}";
+ }
+
+ foreach ($config['cron']['item'] as $item) {
+ $crontab_contents .= "\n{$item['minute']}\t";
+ $crontab_contents .= "{$item['hour']}\t";
+ $crontab_contents .= "{$item['mday']}\t";
+ $crontab_contents .= "{$item['month']}\t";
+ $crontab_contents .= "{$item['wday']}\t";
+ $crontab_contents .= "{$item['who']}\t";
+ $crontab_contents .= "{$item['command']}";
+ }
+
+ $crontab_contents .= "\n#\n";
+ $crontab_contents .= "# " . gettext("If possible do not add items to this file manually.") . "\n";
+ $crontab_contents .= "# " . gettext("If you do so, this file must be terminated with a blank line (e.g. new line)") . "\n";
+ $crontab_contents .= "#\n\n";
+ }
+
+ /* please maintain the newline at the end of file */
+ file_put_contents("/etc/crontab", $crontab_contents);
+ unset($crontab_contents);
+
+ /* do a HUP kill to force sync changes */
+ sigkillbypid("{$g['varrun_path']}/cron.pid", "HUP");
+
+ conf_mount_ro();
+}
+
+function upnp_action ($action) {
+ global $g, $config;
+ switch ($action) {
+ case "start":
+ if (file_exists('/var/etc/miniupnpd.conf')) {
+ @unlink("{$g['varrun_path']}/miniupnpd.pid");
+ mwexec_bg("/usr/local/sbin/miniupnpd -f /var/etc/miniupnpd.conf -P {$g['varrun_path']}/miniupnpd.pid");
+ }
+ break;
+ case "stop":
+ killbypid("{$g['varrun_path']}/miniupnpd.pid");
+ while ((int)exec("/bin/pgrep -a miniupnpd | wc -l") > 0) {
+ mwexec('killall miniupnpd 2>/dev/null', true);
+ }
+ mwexec('/sbin/pfctl -aminiupnpd -Fr 2>&1 >/dev/null');
+ mwexec('/sbin/pfctl -aminiupnpd -Fn 2>&1 >/dev/null');
+ break;
+ case "restart":
+ upnp_action('stop');
+ upnp_action('start');
+ break;
+ }
+}
+
+function upnp_start() {
+ global $config;
+
+ if (!isset($config['installedpackages']['miniupnpd']['config'])) {
+ return;
+ }
+
+ if ($config['installedpackages']['miniupnpd']['config'][0]['enable']) {
+ echo gettext("Starting UPnP service... ");
+ require_once('/usr/local/pkg/miniupnpd.inc');
+ sync_package_miniupnpd();
+ echo "done.\n";
+ }
+}
+
+function install_cron_job($command, $active = false, $minute = "0", $hour = "*", $monthday = "*", $month = "*", $weekday = "*", $who = "root") {
+ global $config, $g;
+
+ $is_installed = false;
+ $cron_changed = true;
+
+ if (!is_array($config['cron'])) {
+ $config['cron'] = array();
+ }
+ if (!is_array($config['cron']['item'])) {
+ $config['cron']['item'] = array();
+ }
+
+ $x = 0;
+ foreach ($config['cron']['item'] as $item) {
+ if (strstr($item['command'], $command)) {
+ $is_installed = true;
+ break;
+ }
+ $x++;
+ }
+
+ if ($active) {
+ $cron_item = array();
+ $cron_item['minute'] = $minute;
+ $cron_item['hour'] = $hour;
+ $cron_item['mday'] = $monthday;
+ $cron_item['month'] = $month;
+ $cron_item['wday'] = $weekday;
+ $cron_item['who'] = $who;
+ $cron_item['command'] = $command;
+ if (!$is_installed) {
+ $config['cron']['item'][] = $cron_item;
+ write_config(sprintf(gettext("Installed cron job for %s"), $command));
+ } else {
+ if ($config['cron']['item'][$x] == $cron_item) {
+ $cron_changed = false;
+ log_error(sprintf(gettext("Checked cron job for %s, no change needed"), $command));
+ } else {
+ $config['cron']['item'][$x] = $cron_item;
+ write_config(sprintf(gettext("Updated cron job for %s"), $command));
+ }
+ }
+ } else {
+ if ($is_installed == true) {
+ unset($config['cron']['item'][$x]);
+ write_config(sprintf(gettext("Removed cron job for %s"), $command));
+ }
+ }
+
+ if ($cron_changed) {
+ configure_cron();
+ }
+}
+
+?>
diff --git a/src/etc/inc/shaper.inc b/src/etc/inc/shaper.inc
new file mode 100644
index 0000000..29ae7e9
--- /dev/null
+++ b/src/etc/inc/shaper.inc
@@ -0,0 +1,4969 @@
+<?php
+/*
+ shaper.inc
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_BUILDER_BINARIES: /bin/kill /sbin/kldload /bin/rm /bin/ps
+ pfSense_MODULE: shaper
+*/
+
+/* XXX: needs some reducing on include. */
+/* include all configuration functions. */
+require_once("globals.inc");
+require_once("functions.inc");
+require_once("util.inc");
+require_once("notices.inc");
+
+/*
+ * I admit :) this is derived from xmlparse.inc StartElement()
+ */
+function &get_reference_to_me_in_config(&$mypath) {
+ global $config;
+
+ $ptr =& $config['shaper'];
+ foreach ($mypath as $indeks) {
+ $ptr =& $ptr['queue'][$indeks];
+ }
+
+ return $ptr;
+}
+
+function unset_object_by_reference(&$mypath) {
+ global $config;
+
+ $ptr =& $config['shaper'];
+ for ($i = 0; $i < count($mypath) - 1; $i++) {
+ $ptr =& $ptr['queue'][$mypath[$i]];
+ }
+ unset($ptr['queue'][$mypath[$i]]);
+}
+
+function &get_dn_reference_to_me_in_config(&$mypath) {
+ global $config;
+
+ $ptr =& $config['dnshaper'];
+ foreach ($mypath as $indeks) {
+ $ptr =& $ptr['queue'][$indeks];
+ }
+
+ return $ptr;
+}
+
+function unset_dn_object_by_reference(&$mypath) {
+ global $config;
+
+ $ptr =& $config['dnshaper'];
+ for ($i = 0; $i < count($mypath) - 1; $i++) {
+ $ptr =& $ptr['queue'][$mypath[$i]];
+ }
+ unset($ptr['queue'][$mypath[$i]]);
+}
+
+function clean_child_queues($type, $mypath) {
+ $ref = &get_reference_to_me_in_config($mypath);
+
+ switch ($type) {
+ case 'HFSC':
+ if (isset($ref['borrow'])) {
+ unset($ref['borrow']);
+ }
+ if (isset($ref['hogs'])) {
+ unset($ref['hogs']);
+ }
+ if (isset($ref['buckets'])) {
+ unset($ref['buckets']);
+ }
+ break;
+ case 'PRIQ':
+ if (isset($ref['borrow'])) {
+ unset($ref['borrow']);
+ }
+ if (isset($ref['bandwidth'])) {
+ unset($ref['bandwidth']);
+ }
+ if (isset($ref['bandwidthtype'])) {
+ unset($ref['bandwidthtype']);
+ }
+ /* fall through */
+ case 'FAIRQ':
+ if (isset($ref['borrow'])) {
+ unset($ref['borrow']);
+ }
+ /* fall through */
+ case 'CBQ':
+ if (isset($ref['realtime'])) {
+ unset($ref['realtime']);
+ }
+ if (isset($ref['realtime1'])) {
+ unset($ref['realtime1']);
+ }
+ if (isset($ref['realtime2'])) {
+ unset($ref['realtime2']);
+ }
+ if (isset($ref['realtime3'])) {
+ unset($ref['realtime3']);
+ }
+ if (isset($ref['upperlimit'])) {
+ unset($ref['upperlimit']);
+ }
+ if (isset($ref['upperlimit1'])) {
+ unset($ref['upperlimit1']);
+ }
+ if (isset($ref['upperlimit2'])) {
+ unset($ref['upperlimit2']);
+ }
+ if (isset($ref['upperlimit3'])) {
+ unset($ref['upperlimit3']);
+ }
+ if (isset($ref['linkshare'])) {
+ unset($ref['linkshare']);
+ }
+ if (isset($ref['linkshare1'])) {
+ unset($ref['linkshare1']);
+ }
+ if (isset($ref['linkshare2'])) {
+ unset($ref['linkshare2']);
+ }
+ if (isset($ref['linkshare3'])) {
+ unset($ref['linkshare3']);
+ }
+ if (isset($ref['hogs'])) {
+ unset($ref['hogs']);
+ }
+ if (isset($ref['buckets'])) {
+ unset($ref['buckets']);
+ }
+ break;
+ }
+}
+
+function get_bandwidthtype_scale($type) {
+ switch ($type) {
+ case "Gb":
+ $factor = 1024 * 1024 * 1024;
+ break;
+ case "Mb":
+ $factor = 1024 * 1024;
+ break;
+ case "Kb":
+ $factor = 1024;
+ break;
+ case "b":
+ default:
+ $factor = 1;
+ break;
+ }
+ return intval($factor);
+}
+
+function get_hfsc_bandwidth($object, $bw) {
+ $pattern= "/[0-9]+/";
+ if (preg_match($pattern, $bw, $match)) {
+ $bw_1 = $match[1];
+ } else {
+ return 0;
+ }
+ $pattern= "/(b|Kb|Mb|Gb|%)/";
+ if (preg_match($pattern, $bw, $match)) {
+ switch ($match[1]) {
+ case '%':
+ $bw_1 = $bw_1 / 100 * get_interface_bandwidth($object);
+ break;
+ default:
+ $bw_1 = $bw_1 * get_bandwidthtype_scale($match[0]);
+ break;
+ }
+ return floatval($bw_1);
+ } else {
+ return 0;
+ }
+}
+
+function get_interface_bandwidth($object) {
+ global $altq_list_queues;
+
+ $int = $object->GetInterface();
+ $altq =& $altq_list_queues[$int];
+ if ($altq) {
+ $bw_3 = $altq->GetBandwidth();
+ $bw_3 = $bw_3 * get_bandwidthtype_scale($altq->GetBwscale());
+ return floatval($bw_3);
+ } else {
+ return 0;
+ }
+}
+
+/*
+ * This is duplicated here since we cannot include guiconfig.inc.
+ * Including it makes all stuff break.
+ */
+function shaper_do_input_validation($postdata, $reqdfields, $reqdfieldsn, $input_errors) {
+
+ /* check for bad control characters */
+ foreach ($postdata as $pn => $pd) {
+ if (is_string($pd) && preg_match("/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/", $pd)) {
+ $input_errors[] = sprintf(gettext("The field '%s' contains invalid characters."), $pn);
+ }
+ }
+
+ for ($i = 0; $i < count($reqdfields); $i++) {
+ if ($postdata[$reqdfields[$i]] == "") {
+ $input_errors[] = sprintf(gettext("The field '%s' is required."), $reqdfieldsn[$i]);
+ }
+ }
+}
+
+function cleanup_queue_from_rules($queue) {
+ global $config;
+
+ foreach ($config['filter']['rule'] as $rule) {
+ if ($rule['defaultqueue'] == $queue) {
+ unset($rule['defaultqueue']);
+ }
+ if ($rule['ackqueue'] == $queue) {
+ unset($rule['ackqueue']);
+ }
+ }
+}
+
+function cleanup_dnqueue_from_rules($queue) {
+ global $config;
+
+ foreach ($config['filter']['rule'] as $rule) {
+ if ($rule['dnpipe'] == $queue) {
+ unset($rule['dnpipe']);
+ }
+ if ($rule['pdnpipe'] == $queue) {
+ unset($rule['pdnpipe']);
+ }
+ }
+}
+
+class altq_root_queue {
+ var $interface;
+ var $tbrconfig ;
+ var $bandwidth;
+ var $bandwidthtype; /* b, Kb, Mb */
+ var $scheduler;
+ var $qlimit;
+ var $queues = array();
+ var $qenabled = false;
+ var $link;
+ var $available_bw; /* in b/s */
+
+ /* Accessor functions */
+ function GetAvailableBandwidth() {
+ return $this->available_bw;
+ }
+ function SetAvailableBandwidth($bw) {
+ $this->available_bw = $bw;
+ }
+ function GetDefaultQueuePresent() {
+ if (!empty($this->queues)) {
+ foreach ($this->queues as $q) {
+ if ($q->GetDefault()) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+ function SetLink($link) {
+ $this->link = $link;
+ }
+ function GetLink() {
+ return $this->link;
+ }
+ function GetEnabled() {
+ return $this->qenabled;
+ }
+ function SetEnabled($value) {
+ $this->qenabled = $value;
+ }
+ function CanHaveChildren() {
+ if ($this->GetScheduler() == "CODELQ") {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ function CanBeDeleted() {
+ return false;
+ }
+ function GetQname() {
+ return $this->interface;
+ }
+ function SetQname($name) {
+ $this->interface = trim($name);
+ }
+ function GetInterface() {
+ return $this->interface;
+ }
+ function SetInterface($name) {
+ $this->interface = trim($name);
+ }
+ function GetTbrConfig() {
+ return $this->tbrconfig;
+ }
+ function SetTbrConfig($tbrconfig) {
+ $this->tbrconfig = $tbrconfig;
+ }
+ function GetBandwidth() {
+ return $this->bandwidth;
+ }
+ function SetBandwidth($bw) {
+ $this->bandwidth = $bw;
+ }
+ function GetBwscale() {
+ return $this->bandwidthtype;
+ }
+ function SetBwscale($bwscale) {
+ $this->bandwidthtype = $bwscale;
+ }
+ function GetScheduler() {
+ return $this->scheduler;
+ }
+ function SetScheduler($scheduler) {
+ $this->scheduler = trim($scheduler);
+ }
+ function GetQlimit() {
+ return $this->qlimit;
+ }
+ function SetQlimit($limit) {
+ $this->qlimit = $limit;
+ }
+
+ function validate_input($data, &$input_errors) {
+
+ $reqdfields[] = "bandwidth";
+ $reqdfieldsn[] = gettext("Bandwidth");
+ $reqdfields[] = "bandwidthtype";
+ $reqdfieldsn[] = gettext("Bandwidthtype");
+
+ shaper_do_input_validation($data, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($data['bandwidth'] && (!is_numeric($data['bandwidth']))) {
+ $input_errors[] = gettext("Bandwidth must be an integer.");
+ }
+ if ($data['bandwidth'] < 0) {
+ $input_errors[] = gettext("Bandwidth cannot be negative.");
+ }
+ if ($data['qlimit'] && (!is_numeric($data['qlimit']))) {
+ $input_errors[] = gettext("Qlimit must be an integer.");
+ }
+ if ($data['qlimit'] < 0) {
+ $input_errors[] = gettext("Qlimit must be positive.");
+ }
+ if ($data['tbrconfig'] && (!is_numeric($data['tbrconfig']))) {
+ $input_errors[] = gettext("Tbrsize must be an integer.");
+ }
+ if ($data['tbrconfig'] < 0) {
+ $input_errors[] = gettext("Tbrsize must be positive.");
+ }
+ }
+
+ /* Implement this to shorten some code on the frontend page */
+ function ReadConfig(&$conf) {
+ if (isset($conf['tbrconfig'])) {
+ $this->SetTbrConfig($conf['tbrconfig']);
+ } else {
+ $this->SetTbrConfig($conf['tbrconfig']);
+ }
+ $this->SetBandwidth($conf['bandwidth']);
+ if ($conf['bandwidthtype'] <> "") {
+ $this->SetBwscale($conf['bandwidthtype']);
+ }
+ if (isset($conf['scheduler'])) {
+ if ($this->GetScheduler() != $conf['scheduler']) {
+ foreach ($this->queues as $q) {
+ clean_child_queues($conf['scheduler'], $this->GetLink());
+ $q->clean_queue($conf['scheduler']);
+ }
+ }
+ $this->SetScheduler($conf['scheduler']);
+ }
+ if (isset($conf['qlimit']) && $conf['qlimit'] <> "") {
+ $this->SetQlimit($conf['qlimit']);
+ } else {
+ $this->SetQlimit("");
+ }
+ if (isset($conf['name'])) {
+ $this->SetQname($conf['name']);
+ }
+ if (!empty($conf['enabled'])) {
+ $this->SetEnabled($conf['enabled']);
+ } else {
+ $this->SetEnabled("");
+ }
+ }
+
+ function copy_queue($interface, &$cflink) {
+ $cflink['interface'] = $interface;
+ $cflink['name'] = $interface;
+ $cflink['scheduler'] = $this->GetScheduler();
+ $cflink['bandwidth'] = $this->GetBandwidth();
+ $cflink['bandwidthtype'] = $this->GetBwscale();
+ $cflink['qlimit'] = $this->GetQlimit();
+ $cflink['tbrconfig'] = $this->GetTbrConfig();
+ $cflink['enabled'] = $this->GetEnabled();
+ if (is_array($this->queues)) {
+ $cflink['queue'] = array();
+ foreach ($this->queues as $q) {
+ $cflink['queue'][$q->GetQname()] = array();
+ $q->copy_queue($interface, $cflink['queue'][$q->GetQname()]);
+ }
+ }
+ }
+
+ function &get_queue_list(&$q = null) {
+ $qlist = array();
+
+ //$qlist[$this->GetQname()] = & $this;
+ if (is_array($this->queues)) {
+ foreach ($this->queues as $queue) {
+ $queue->get_queue_list($qlist);
+ }
+ }
+ return $qlist;
+ }
+
+ function &add_queue($interface, &$queue, &$path, &$input_errors) {
+
+ if (!is_array($this->queues)) {
+ $this->queues = array();
+ }
+
+ switch ($this->GetScheduler()) {
+ case "PRIQ":
+ $q =& new priq_queue();
+ break;
+ case "HFSC":
+ $q =& new hfsc_queue();
+ break;
+ case "CBQ":
+ $q =& new cbq_queue();
+ break;
+ case "FAIRQ":
+ $q =& new fairq_queue();
+ break;
+ default:
+ /* XXX: but should not happen anyway */
+ return;
+ break;
+ }
+ $q->SetLink($path);
+ $q->SetInterface($this->GetInterface());
+ $q->SetEnabled("on");
+ $q->SetParent($this);
+ $q->ReadConfig($queue);
+ $q->validate_input($queue, $input_errors);
+ if (count($input_errors)) {
+ log_error("SHAPER: could not create queue " . $q->GetQname() . " on interface {$interface} because: " . print_r($input_errors, true));
+ return $q;
+ }
+
+ if (isset($queue['bandwidth'])) {
+ switch ($queue['bandwidthtype']) {
+ case "%":
+ $myBw = $this->GetAvailableBandwidth() * $queue['bandwidth'] / 100;
+ break;
+ default:
+ $myBw = $queue['bandwidth'] * get_bandwidthtype_scale($queue['bandwidthtype']);
+ break;
+ }
+ }
+ $q->SetAvailableBandwidth($myBw);
+ $this->SetAvailableBandwidth($this->GetAvailableBandwidth() - $myBw);
+ $this->queues[$q->GetQname()] = &$q;
+ ref_on_altq_queue_list($this->GetQname(), $q->GetQname());
+ if (is_array($queue['queue'])) {
+ foreach ($queue['queue'] as $key1 => $que) {
+ array_push($path, $key1);
+ $q->add_queue($q->GetInterface(), $que, $path, $input_errors);
+ array_pop($path);
+ }
+ }
+
+ return $q;
+ }
+
+ /* interface here might be optional */
+ function &find_queue($interface, $qname) {
+ if ($qname == $this->GetQname()) {
+ return $this;
+ }
+ foreach ($this->queues as $q) {
+ $result =& $q->find_queue("", $qname);
+ if ($result) {
+ return $result;
+ }
+ }
+ }
+
+ function &find_parentqueue($interface, $qname) {
+ if ($qname == $interface) {
+ $result = NULL;
+ } else if ($this->queues[$qname]) {
+ $result = $this;
+ } else if ($this->GetScheduler() <> "PRIQ") {
+ foreach ($this->queues as $q) {
+ $result = $q->find_parentqueue("", $qname);
+ if ($result) {
+ return $result;
+ }
+ }
+ }
+ }
+
+ function build_tree() {
+ global $shaperIFlist;
+
+ $tree = " <li><a href=\"firewall_shaper.php?interface=".$this->GetInterface()."&amp;queue=". $this->GetInterface()."&amp;action=show";
+ $tree .= "\">" . $shaperIFlist[$this->GetInterface()] . "</a>";
+ if (is_array($this->queues)) {
+ $tree .= "<ul>";
+ foreach ($this->queues as $q) {
+ $tree .= $q->build_tree();
+ }
+ $tree .= "</ul>";
+ }
+ $tree .= "</li>";
+ return $tree;
+ }
+
+ function delete_queue() {
+ foreach ($this->queues as $q) {
+ $this->SetAvailableBandwidth($this->GetAvailableBandwidth() + $q->GetAvailableBandwidth());
+ $q->delete_queue();
+ }
+ unset_object_by_reference($this->GetLink());
+ }
+
+ function delete_all() {
+ if (count($this->queues)) {
+ foreach ($this->queues as $q) {
+ $q->delete_all();
+ unset_object_by_reference($q->GetLink());
+ unset($q);
+ }
+ unset($this->queues);
+ }
+ }
+
+ /*
+ * First it spits:
+ * altq on $interface ..............
+ * then it goes like
+ * foreach ($queues as $qkey => $queue) {
+ * this->queues[$qkey]->build_rule();
+ * }
+ */
+ function build_rules(&$default = false) {
+ if (count($this->queues) > 0 && $this->GetEnabled() == "on") {
+ $default = false;
+ $rules = " altq on " . get_real_interface($this->GetInterface());
+ if ($this->GetScheduler()) {
+ $rules .= " ".strtolower($this->GetScheduler());
+ }
+ if ($this->GetQlimit() > 0) {
+ $rules .= " qlimit " . $this->GetQlimit() . " ";
+ }
+ if ($this->GetBandwidth()) {
+ $rules .= " bandwidth ".trim($this->GetBandwidth());
+ if ($this->GetBwscale()) {
+ $rules .= $this->GetBwscale();
+ }
+ }
+ if ($this->GetTbrConfig()) {
+ $rules .= " tbrsize ".$this->GetTbrConfig();
+ }
+ if (count($this->queues)) {
+ $i = count($this->queues);
+ $rules .= " queue { ";
+ foreach ($this->queues as $qkey => $qnone) {
+ if ($i > 1) {
+ $i--;
+ $rules .= " {$qkey}, ";
+ } else {
+ $rules .= " {$qkey} ";
+ }
+ }
+ $rules .= " } \n";
+ foreach ($this->queues as $q) {
+ $rules .= $q->build_rules($default);
+ }
+ }
+
+ if ($default == false) {
+ $error = "SHAPER: no default queue specified for interface ". $this->GetInterface() . ". The interface queue will be enforced as default.";
+ file_notice("Shaper", $error, "Error occurred", "");
+ unset($error);
+ return "\n";
+ }
+ $frule .= $rules;
+ } else if ($this->GetEnabled() == "on" && $this->GetScheduler() == "CODELQ") {
+ $rules = " altq on " . get_real_interface($this->GetInterface());
+ if ($this->GetScheduler()) {
+ $rules .= " ".strtolower($this->GetScheduler());
+ }
+ if ($this->GetQlimit() > 0) {
+ $rules .= " ( qlimit " . $this->GetQlimit() . " ) ";
+ }
+ if ($this->GetBandwidth()) {
+ $rules .= " bandwidth ".trim($this->GetBandwidth());
+ if ($this->GetBwscale()) {
+ $rules .= $this->GetBwscale();
+ }
+ }
+ if ($this->GetTbrConfig()) {
+ $rules .= " tbrsize ".$this->GetTbrConfig();
+ }
+
+ $rules .= " queue";
+ }
+
+ $rules .= " \n";
+ return $rules;
+ }
+
+ function build_javascript() {
+ $javascript = "<script type=\"text/javascript\">";
+ $javascript .= "//<![CDATA[\n";
+ $javascript .= "function mySuspend() {";
+ $javascript .= "if (document.layers && document.layers['shaperarea'] != null) ";
+ $javascript .= "document.layers['shaperarea'].visibility = 'hidden'; ";
+ $javascript .= "else if (document.all)";
+ $javascript .= "document.all['shaperarea'].style.visibility = 'hidden';";
+ $javascript .= "}";
+
+ $javascript .= "function myResume() {";
+ $javascript .= "if (document.layers && document.layers['shaperarea'] != null) ";
+ $javascript .= "document.layers['shaperarea'].visibility = 'visible';";
+ $javascript .= "else if (document.all) ";
+ $javascript .= "document.all['shaperarea'].style.visibility = 'visible';";
+ $javascript .= "}";
+ $javascript .= "//]]>";
+ $javascript .= "</script>";
+
+ return $javascript;
+ }
+
+ function build_shortform() {
+ global $g;
+
+ $altq =& $this;
+ if ($altq) {
+ $scheduler = ": " . $altq->GetScheduler();
+ }
+ $form = "<tr><td width=\"20%\" class=\"vtable\">";
+ $form .= "<a href=\"firewall_shaper.php?interface=" . $this->GetInterface() . "&amp;queue=". $this->GetInterface()."&amp;action=show\">". $shaperIFlist[$this->GetInterface()] .": ".$scheduler."</a>";
+ $form .= "</td></tr>";
+ $form .= "<tr>";
+ $form .= "<td width=\"50%\" class=\"vncellreq\">";
+ $form .= "Bandwidth: " . $this->GetBandwidth().$this->GetBwscale();
+ $form .= "</td><td width=\"50%\"></td></tr>";
+ $form .= "<tr><td width=\"20%\" class=\"vncellreq\">";
+ $form .= "<a href=\"firewall_shaper_queues.php?interface=";
+ $form .= $this->GetInterface() . "&amp;queue=";
+ $form .= $this->GetQname() . "&amp;action=delete\">";
+ $form .= "<img src=\"";
+ $form .= "./themes/".$g['theme']."/images/icons/icon_x.gif\"";
+ $form .= " width=\"17\" height=\"17\" border=\"0\" title=\"Disable shaper on interface\" alt=\"disable\" />";
+ $form .= "<span>Disable shaper on interface</span></a></td></tr>";
+
+ return $form;
+
+ }
+ /*
+ * For requesting the parameters of the root queues
+ * to the user like the traffic wizard does.
+ */
+ function build_form() {
+ $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
+ $form .= gettext("Enable/Disable");
+ $form .= "<br /></td><td class=\"vncellreq\">";
+ $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\"";
+ if ($this->GetEnabled() == "on") {
+ $form .= " checked=\"checked\"";
+ }
+ $form .= " /><span class=\"vexpl\"> " . gettext("Enable/disable discipline and its children") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\"><br /><span class=\"vexpl\">" . gettext("Name") . "</span></td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<strong>".$this->GetQname()."</strong>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Scheduler Type ");
+ $form .= "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<select id=\"scheduler\" name=\"scheduler\" class=\"formselect\">";
+ $form .= "<option value=\"HFSC\"";
+ if ($this->GetScheduler() == "HFSC") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">HFSC</option>";
+ $form .= "<option value=\"CBQ\"";
+ if ($this->GetScheduler() == "CBQ") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">CBQ</option>";
+ $form .= "<option value=\"FAIRQ\"";
+ if ($this->GetScheduler() == "FAIRQ") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">FAIRQ</option>";
+ $form .= "<option value=\"CODELQ\"";
+ if ($this->GetScheduler() == "CODELQ") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">CODELQ</option>";
+ $form .= "<option value=\"PRIQ\"";
+ if ($this->GetScheduler() == "PRIQ") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">PRIQ</option>";
+ $form .= "</select>";
+ $form .= "<br /> <span class=\"vexpl\">";
+ $form .= gettext("NOTE: Changing this changes all child queues!");
+ $form .= gettext(" Beware you can lose information.");
+ $form .= "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth");
+ $form .= "</td><td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"bandwidth\" name=\"bandwidth\" value=\"";
+ $form .= $this->GetBandwidth() . "\" />";
+ $form .= "<select id=\"bandwidthtype\" name=\"bandwidthtype\" class=\"formselect\">";
+ $form .= "<option value=\"Kb\"";
+ if ($this->GetBwscale() == "Kb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">Kbit/s</option>";
+ $form .= "<option value=\"Mb\"";
+ if ($this->GetBwscale() == "Mb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">Mbit/s</option>";
+ $form .= "<option value=\"Gb\"";
+ if ($this->GetBwscale() == "Gb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">Gbit/s</option>";
+ $form .= "<option value=\"b\"";
+ if ($this->GetBwscale() == "b") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">Bit/s</option>";
+ $form .= "</select>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">Queue Limit</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"qlimit\" name=\"qlimit\" value=\"";
+ $form .= $this->GetQlimit();
+ $form .= "\" />";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">TBR Size</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<br /><input type=\"text\" id=\"tbrconfig\" name=\"tbrconfig\" value=\"";
+ $form .= $this->GetTbrConfig();
+ $form .= "\" />";
+ $form .= "<br /> <span class=\"vexpl\">";
+ $form .= gettext("Adjusts the size, in bytes, of the token bucket regulator. "
+ . "If not specified, heuristics based on the interface "
+ . "bandwidth are used to determine the size.");
+ $form .= "</span></td></tr>";
+ $form .= "<input type=\"hidden\" id=\"interface\" name=\"interface\"";
+ $form .= " value=\"" . $this->GetInterface() . "\" />";
+ $form .= "<input type=\"hidden\" id=\"name\" name=\"name\" value=\"".$this->GetQname()."\" />";
+
+ return $form;
+ }
+
+ function update_altq_queue_data(&$data) {
+ $this->ReadConfig($data);
+ }
+
+ /*
+ * Should call on each of it queues and subqueues
+ * the same function much like build_rules();
+ */
+ function wconfig() {
+ $cflink = &get_reference_to_me_in_config($this->GetLink());
+ if (!is_array($cflink)) {
+ $cflink = array();
+ }
+ $cflink['interface'] = $this->GetInterface();
+ $cflink['name'] = $this->GetQname();
+ $cflink['scheduler'] = $this->GetScheduler();
+ $cflink['bandwidth'] = $this->GetBandwidth();
+ $cflink['bandwidthtype'] = $this->GetBwscale();
+ $cflink['qlimit'] = trim($this->GetQlimit());
+ if (empty($cflink['qlimit'])) {
+ unset($cflink['qlimit']);
+ }
+ $cflink['tbrconfig'] = trim($this->GetTbrConfig());
+ if (empty($cflink['tbrconfig'])) {
+ unset($cflink['tbrconfig']);
+ }
+ $cflink['enabled'] = $this->GetEnabled();
+ if (empty($cflink['enabled'])) {
+ unset($cflink['enabled']);
+ }
+ }
+
+}
+
+class priq_queue {
+ var $qname;
+ var $qinterface;
+ var $qlimit;
+ var $qpriority;
+ var $description;
+ var $isparent;
+ var $qbandwidth;
+ var $qbandwidthtype;
+ var $qdefault = "";
+ var $qrio = "";
+ var $qred = "";
+ var $qcodel = "";
+ var $qecn = "";
+ var $qack;
+ var $qenabled = "";
+ var $qparent;
+ var $link;
+ var $available_bw; /* in b/s */
+
+ /* This is here to help with form building and building rules/lists */
+ var $subqueues = array();
+
+ /* Accessor functions */
+ function GetAvailableBandwidth() {
+ return $this->available_bw;
+ }
+ function SetAvailableBandwidth($bw) {
+ $this->available_bw = $bw;
+ }
+ function SetLink($link) {
+ $this->link = $link;
+ }
+ function GetLink() {
+ return $this->link;
+ }
+ function &GetParent() {
+ return $this->qparent;
+ }
+ function SetParent(&$parent) {
+ $this->qparent = &$parent;
+ }
+ function GetEnabled() {
+ return $this->qenabled;
+ }
+ function SetEnabled($value) {
+ $this->qenabled = $value;
+ }
+ function CanHaveChildren() {
+ return false;
+ }
+ function CanBeDeleted() {
+ return true;
+ }
+ function GetQname() {
+ return $this->qname;
+ }
+ function SetQname($name) {
+ $this->qname = trim($name);
+ }
+ function GetBandwidth() {
+ return $this->qbandwidth;
+ }
+ function SetBandwidth($bandwidth) {
+ $this->qbandwidth = $bandwidth;
+ }
+ function GetInterface() {
+ return $this->qinterface;
+ }
+ function SetInterface($name) {
+ $this->qinterface = trim($name);
+ }
+ function GetQlimit() {
+ return $this->qlimit;
+ }
+ function SetQlimit($limit) {
+ $this->qlimit = $limit;
+ }
+ function GetQpriority() {
+ return $this->qpriority;
+ }
+ function SetQpriority($priority) {
+ $this->qpriority = $priority;
+ }
+ function GetDescription() {
+ return $this->description;
+ }
+ function SetDescription($str) {
+ $this->description = trim($str);
+ }
+ function GetFirstime() {
+ return $this->firsttime;
+ }
+ function SetFirsttime($number) {
+ $this->firsttime = $number;
+ }
+ function GetBwscale() {
+ return $this->qbandwidthtype;
+ }
+ function SetBwscale($scale) {
+ $this->qbandwidthtype = $scale;
+ }
+ function GetDefaultQueuePresent() {
+ if ($this->GetDefault()) {
+ return true;
+ }
+ if (!empty($this->subqueues)) {
+ foreach ($this->subqueues as $q) {
+ if ($q->GetDefault()) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+ function GetDefault() {
+ return $this->qdefault;
+ }
+ function SetDefault($value = false) {
+ $this->qdefault = $value;
+ }
+ function GetCodel() {
+ return $this->codel;
+ }
+ function SetCodel($codel = false) {
+ $this->codel = $codel;
+ }
+ function GetRed() {
+ return $this->qred;
+ }
+ function SetRed($red = false) {
+ $this->qred = $red;
+ }
+ function GetRio() {
+ return $this->qrio;
+ }
+ function SetRio($rio = false) {
+ $this->qrio = $rio;
+ }
+ function GetEcn() {
+ return $this->qecn;
+ }
+ function SetEcn($ecn = false) {
+ $this->qecn = $ecn;
+ }
+ function GetAck() {
+ return $this->qack;
+ }
+ function SetAck($ack = false) {
+ $this->qack = $ack;
+ }
+
+ function build_javascript() {
+ $javascript = "<script type=\"text/javascript\">";
+ $javascript .= "//<![CDATA[\n";
+ $javascript .= "function mySuspend() { \n";
+ $javascript .= "if (document.layers && document.layers['shaperarea'] != null)\n";
+ $javascript .= "document.layers['shaperarea'].visibility = 'hidden';\n";
+ $javascript .= "else if (document.all)\n";
+ $javascript .= "document.all['shaperarea'].style.visibility = 'hidden';\n";
+ $javascript .= "}\n";
+
+ $javascript .= "function myResume() {\n";
+ $javascript .= "if (document.layers && document.layers['shaperarea'] != null)\n";
+ $javascript .= "document.layers['shaperarea'].visibility = 'visible';\n";
+ $javascript .= "else if (document.all)\n";
+ $javascript .= "document.all['shaperarea'].style.visibility = 'visible';\n";
+ $javascript .= "}\n";
+ $javascript .= "//]]>";
+ $javascript .= "</script>";
+
+ return $javascript;
+ }
+
+ function &add_queue($interface, &$qname, &$path, &$input_errors) { return; }
+
+ /*
+ * Currently this will not be called unless we decide to clone a whole
+ * queue tree on the 'By Queues' view or support drag&drop on the tree/list
+ */
+ function copy_queue($interface, &$cflink) {
+
+ $cflink['name'] = $this->GetQname();
+ $cflink['interface'] = $interface;
+ $cflink['qlimit'] = $this->GetQlimit();
+ $cflink['priority'] = $this->GetQpriority();
+ $cflink['description'] = $this->GetDescription();
+ $cflink['enabled'] = $this->GetEnabled();
+ $cflink['default'] = $this->GetDefault();
+ $cflink['red'] = $this->GetRed();
+ $cflink['codel'] = $this->GetCodel();
+ $cflink['rio'] = $this->GetRio();
+ $cflink['ecn'] = $this->GetEcn();
+
+ if (is_array($this->subqueues)) {
+ $cflinkp['queue'] = array();
+ foreach ($this->subqueues as $q) {
+ $cflink['queue'][$q->GetQname()] = array();
+ $q->copy_queue($interface, $cflink['queue'][$q->GetQname()]);
+ }
+ }
+ }
+
+ function clean_queue($sched) {
+ clean_child_queues($sched, $this->GetLink());
+ if (is_array($this->subqueues)) {
+ foreach ($this->subqueues as $q) {
+ $q->clean_queue($sched);
+ }
+ }
+ }
+
+ function &get_queue_list(&$qlist) {
+
+ $qlist[$this->GetQname()] = & $this;
+ if (is_array($this->subqueues)) {
+ foreach ($this->subqueues as $queue) {
+ $queue->get_queue_list($qlist);
+ }
+ }
+ }
+
+ function delete_queue() {
+ unref_on_altq_queue_list($this->GetQname());
+ cleanup_queue_from_rules($this->GetQname());
+ unset_object_by_reference($this->GetLink());
+ }
+
+ function delete_all() {
+ if (count($this->subqueues)) {
+ foreach ($this->subqueues as $q) {
+ $q->delete_all();
+ unset_object_by_reference($q->GetLink());
+ unset($q);
+ }
+ unset($this->subqueues);
+ }
+ }
+
+ function &find_queue($interface, $qname) {
+ if ($qname == $this->GetQname()) {
+ return $this;
+ }
+ }
+
+ function find_parentqueue($interface, $qname) { return; }
+
+ function validate_input($data, &$input_errors) {
+
+ $reqdfields[] = "name";
+ $reqdfieldsn[] = gettext("Name");
+ shaper_do_input_validation($data, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($data['bandwidth'] && (!is_numeric($data['bandwidth']))) {
+ $input_errors[] = "Bandwidth must be an integer.";
+ }
+ if ($data['bandwidth'] < 0) {
+ $input_errors[] = "Bandwidth cannot be negative.";
+ }
+ if ($data['priority'] && (!is_numeric($data['priority']) ||
+ ($data['priority'] < 1) || ($data['priority'] > 15))) {
+ $input_errors[] = gettext("The priority must be an integer between 1 and 15.");
+ }
+ if ($data['qlimit'] && (!is_numeric($data['qlimit']))) {
+ $input_errors[] = gettext("Queue limit must be an integer");
+ }
+ if ($data['qlimit'] < 0) {
+ $input_errors[] = gettext("Queue limit must be positive");
+ }
+ if (!empty($data['newname']) && !preg_match("/^[a-zA-Z0-9_-]*$/", $data['newname'])) {
+ $input_errors[] = gettext("Queue names must be alphanumeric and _ or - only.");
+ }
+ if (!empty($data['name']) && !preg_match("/^[a-zA-Z0-9_-]*$/", $data['name'])) {
+ $input_errors[] = gettext("Queue names must be alphanumeric and _ or - only.");
+ }
+ $default = $this->GetDefault();
+ if (!empty($data['default']) && altq_get_default_queue($data['interface']) && empty($default)) {
+ $input_errors[] = gettext("Only one default queue per interface is allowed.");
+ }
+ }
+
+ function ReadConfig(&$q) {
+ if (!empty($q['name']) && !empty($q['newname']) && $q['name'] != $q['newname']) {
+ $this->SetQname($q['newname']);
+ } else if (!empty($q['newname'])) {
+ $this->SetQname($q['newname']);
+ } else if (isset($q['name'])) {
+ $this->SetQname($q['name']);
+ }
+ if (isset($q['interface'])) {
+ $this->SetInterface($q['interface']);
+ }
+ $this->SetBandwidth($q['bandwidth']);
+ if ($q['bandwidthtype'] <> "") {
+ $this->SetBwscale($q['bandwidthtype']);
+ }
+ if (!empty($q['qlimit'])) {
+ $this->SetQlimit($q['qlimit']);
+ } else {
+ $this->SetQlimit(""); // Default
+ }
+ if (!empty($q['priority'])) {
+ $this->SetQPriority($q['priority']);
+ } else {
+ $this->SetQpriority("");
+ }
+ if (!empty($q['description'])) {
+ $this->SetDescription($q['description']);
+ } else {
+ $this->SetDescription("");
+ }
+ if (!empty($q['red'])) {
+ $this->SetRed($q['red']);
+ } else {
+ $this->SetRed();
+ }
+ if (!empty($q['codel'])) {
+ $this->SetCodel($q['codel']);
+ } else {
+ $this->SetCodel();
+ }
+ if (!empty($q['rio'])) {
+ $this->SetRio($q['rio']);
+ } else {
+ $this->SetRio();
+ }
+ if (!empty($q['ecn'])) {
+ $this->SetEcn($q['ecn']);
+ } else {
+ $this->SetEcn();
+ }
+ if (!empty($q['default'])) {
+ $this->SetDefault($q['default']);
+ } else {
+ $this->SetDefault();
+ }
+ if (!empty($q['enabled'])) {
+ $this->SetEnabled($q['enabled']);
+ } else {
+ $this->SetEnabled("");
+ }
+ }
+
+ function build_tree() {
+ $tree = " <li><a href=\"firewall_shaper.php?interface=". $this->GetInterface()."&amp;queue=". $this->GetQname()."&amp;action=show";
+ $tree .= "\" ";
+ $tmpvalue = $this->GetDefault();
+ if (!empty($tmpvalue)) {
+ $tree .= " class=\"navlnk\"";
+ }
+ $tree .= " >" . $this->GetQname() . "</a>";
+ /*
+ * Not needed here!
+ * if (is_array($queues) {
+ * $tree .= "<ul>";
+ * foreach ($q as $queues)
+ * $tree .= $queues['$q->GetName()']->build_tree();
+ * endforeach
+ * $tree .= "</ul>";
+ * }
+ */
+
+ $tree .= "</li>";
+
+ return $tree;
+ }
+
+ /* Should return something like:
+ * queue $qname on $qinterface bandwidth ....
+ */
+ function build_rules(&$default = false) {
+ $pfq_rule = " queue ". $this->qname;
+ if ($this->GetInterface()) {
+ $pfq_rule .= " on ".get_real_interface($this->GetInterface());
+ }
+ $tmpvalue = $this->GetQpriority();
+ if (!empty($tmpvalue)) {
+ $pfq_rule .= " priority ".$this->GetQpriority();
+ }
+ $tmpvalue = $this->GetQlimit();
+ if (!empty($tmpvalue)) {
+ $pfq_rule .= " qlimit " . $this->GetQlimit();
+ }
+ if ($this->GetRed() || $this->GetRio() || $this->GetEcn() || $this->GetDefault() || $this->GetCodel()) {
+ $pfq_rule .= " priq ( ";
+ $tmpvalue = $this->GetRed();
+ if (!empty($tmpvalue)) {
+ $comma = 1;
+ $pfq_rule .= " red ";
+ }
+ $tmpvalue = $this->GetRio();
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " rio ";
+ }
+ $tmpvalue = $this->GetEcn();
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " ecn ";
+ }
+ $tmpvalue = $this->GetCodel();
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " codel ";
+ }
+ $tmpvalue = $this->GetDefault();
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $pfq_rule .= " default ";
+ $default = true;
+ }
+ $pfq_rule .= " ) ";
+ }
+
+ $pfq_rule .= " \n";
+
+ return $pfq_rule;
+ }
+
+ /*
+ * To return the html form to show to user
+ * for getting the parameters.
+ * Should do even for first time when the
+ * object is created and later when we may
+ * need to update it.
+ */
+ function build_form() {
+ $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
+ $form .= gettext("Enable/Disable");
+ $form .= "<br /></td><td class=\"vncellreq\">";
+ $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\"";
+ if ($this->GetEnabled() == "on") {
+ $form .= " checked=\"checked\"";
+ }
+ $form .= " /><span class=\"vexpl\"> " . gettext("Enable/Disable queue and its children") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr>";
+ $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncellreq\">";
+ $form .= gettext("Queue Name") . "</td><td width=\"78%\" class=\"vtable\">";
+ $form .= "<input name=\"newname\" type=\"text\" id=\"newname\" class=\"formfld unknown\" size=\"15\" maxlength=\"15\" value=\"";
+ $form .= htmlspecialchars($this->GetQname());
+ $form .= "\" />";
+ $form .= "<input name=\"name\" type=\"hidden\" id=\"name\" class=\"formfld unknown\" size=\"15\" maxlength=\"15\" value=\"";
+ $form .= htmlspecialchars($this->GetQname());
+ $form .= "\" />";
+ $form .= "<br /> <span class=\"vexpl\">" . gettext("Enter the name of the queue here. Do not use spaces and limit the size to 15 characters.");
+ $form .= "</span><br /></td>";
+ $form .= "</tr><tr>";
+ $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncellreq\">" . gettext("Priority") . "</td>";
+ $form .= "<td width=\"78%\" class=\"vtable\"> <input name=\"priority\" type=\"text\" id=\"priority\" size=\"5\" value=\"";
+ $form .= htmlspecialchars($this->GetQpriority());
+ $form .= "\" />";
+ $form .= "<br /> <span class=\"vexpl\">" . gettext("For hfsc, the range is 0 to 7. The default is 1. Hfsc queues with a higher priority are preferred in the case of overload.") . "</span></td>";
+ $form .= "</tr>";
+ $form .= "<tr>";
+ $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncellreq\">" . gettext("Queue limit") . "</td>";
+ $form .= "<td width=\"78%\" class=\"vtable\"> <input name=\"qlimit\" type=\"text\" id=\"qlimit\" size=\"8\" value=\"";
+ $form .= htmlspecialchars($this->GetQlimit());
+ $form .= "\" />";
+ $form .= "<br /> <span class=\"vexpl\">" . gettext("Queue limit in packets.");
+ $form .= "</span></td></tr>";
+ $form .= "<tr>";
+ $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncell\">" . gettext("Scheduler options") . "</td>";
+ $form .= "<td width=\"78%\" class=\"vtable\">";
+ if (empty($this->subqueues)) {
+ if ($this->GetDefault()) {
+ $form .= "<input type=\"checkbox\" id=\"default\" checked=\"checked\" name=\"default\" value=\"default\"";
+ $form .= " /> " . gettext("Default queue") . "<br />";
+ } else {
+ $form .= "<input type=\"checkbox\" id=\"default\" name=\"default\" value=\"default\"";
+ $form .= " /> " . gettext("Default queue") . "<br />";
+ }
+ }
+ $form .= "<input type=\"checkbox\" id=\"red\" name=\"red\" value=\"red\" ";
+ $tmpvalue = $this->GetRed();
+ if (!empty($tmpvalue)) {
+ $form .= " checked=\"checked\"";
+ }
+ $form .= " /> <a target=\"_new\" href=\"http://www.openbsd.org/faq/pf/queueing.html#red\">" . gettext("Random Early Detection") . "</a><br />";
+ $form .= "<input type=\"checkbox\" id=\"rio\" name=\"rio\" value=\"rio\"";
+ $tmpvalue = $this->GetRio();
+ if (!empty($tmpvalue)) {
+ $form .= " checked=\"checked\"";
+ }
+ $form .= " /> <a target=\"_new\" href=\"http://www.openbsd.org/faq/pf/queueing.html#rio\">" . gettext("Random Early Detection In and Out") . "</a><br />";
+ $form .= "<input type=\"checkbox\" id=\"ecn\" name=\"ecn\" value=\"ecn\"";
+ $tmpvalue = $this->GetEcn();
+ if (!empty($tmpvalue)) {
+ $form .= " checked=\"checked\"";
+ }
+ $form .= " /> <a target=\"_new\" href=\"http://www.openbsd.org/faq/pf/queueing.html#ecn\">" . gettext("Explicit Congestion Notification") . "</a><br />";
+ $form .= "<input type=\"checkbox\" id=\"codel\" name=\"codel\" value=\"codel\"";
+ $tmpvalue = $this->GetCodel();
+ if (!empty($tmpvalue)) {
+ $form .= " checked=\"checked\"";
+ }
+ $form .= " /> <a target=\"_new\" href=\"http://www.bufferbloat.net/projects/codel/wiki\">" . gettext("Codel Active Queue") . "</a><br />";
+ $form .= "<span class=\"vexpl\"><br />" . gettext("Select options for this queue");
+ $form .= "</span></td></tr><tr>";
+ $form .= "<td width=\"22%\" class=\"vncellreq\">" . gettext("Description") . "</td>";
+ $form .= "<td width=\"78%\" class=\"vtable\">";
+ $form .= "<input type=\"text\" name=\"description\" size=\"40\" class=\"formfld unknown\" value=\"" . htmlspecialchars($this->GetDescription()) . "\" />";
+ $form .= "</td></tr>";
+ $form .= "<input type=\"hidden\" name=\"interface\" id=\"interface\"";
+ $form .= " value=\"".$this->GetInterface()."\" />";
+
+ return $form;
+ }
+
+ function build_shortform() {
+ /* XXX: Hacks in sight. Mostly layer violations! */
+ global $g, $altq_list_queues;
+ global $shaperIFlist;
+
+ $altq =& $altq_list_queues[$this->GetInterface()];
+ if ($altq) {
+ $scheduler = ": " . $altq->GetScheduler();
+ }
+ $form = "<tr><td width=\"20%\" class=\"vtable\">";
+ $form .= "<a href=\"firewall_shaper.php?interface=" . $this->GetInterface() . "&amp;queue=" . $this->GetQname()."&amp;action=show\">". $shaperIFlist[$this->GetInterface()] .$scheduler."</a>";
+ $form .= "</td></tr>";
+ /*
+ * XXX: Hack in sight maybe fix with a class that wraps all
+ * of this layer violations
+ */
+ $form .= "<tr>";
+ $form .= "<td width=\"50%\" class=\"vncellreq\">";
+ $form .= gettext("Bandwidth:") . " " . $this->GetBandwidth().$this->GetBwscale();
+ $form .= "</td><td width=\"50%\"></td></tr>";
+ $tmpvalue = $this->GetQpriority();
+ if (!empty($tmpvalue)) {
+ $form .= "<tr><td width=\"20%\" class=\"vncellreq\">" .gettext("Priority: on") . " </td></tr>";
+ }
+ $tmpvalue = $this->GetDefault();
+ if (!empty($tmpvalue)) {
+ $form .= "<tr><td class=\"vncellreq\">" . gettext("Default: on") . " </td></tr>";
+ }
+ $form .= "<tr><td width=\"20%\" class=\"vncellreq\">";
+ $form .= "<a href=\"firewall_shaper_queues.php?interface=";
+ $form .= $this->GetInterface() . "&amp;queue=";
+ $form .= $this->GetQname() . "&amp;action=delete\">";
+ $form .= "<img src=\"";
+ $form .= "./themes/".$g['theme']."/images/icons/icon_x.gif\"";
+ $form .= " width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("Delete queue from interface") . "\" alt=\"delete\" />";
+ $form .= "<span>" . gettext("Delete queue from interface") . "</span></a></td></tr>";
+
+ return $form;
+
+ }
+
+ function update_altq_queue_data(&$q) {
+ $this->ReadConfig($q);
+ }
+
+ function wconfig() {
+ $cflink =& get_reference_to_me_in_config($this->GetLink());
+ if (!is_array($cflink)) {
+ $cflink = array();
+ }
+ $cflink['name'] = $this->GetQname();
+ $cflink['interface'] = $this->GetInterface();
+ $cflink['qlimit'] = trim($this->GetQlimit());
+ if (empty($cflink['qlimit'])) {
+ unset($cflink['qlimit']);
+ }
+ $cflink['priority'] = trim($this->GetQpriority());
+ if (empty($cflink['priority'])) {
+ unset($cflink['priority']);
+ }
+ $cflink['description'] = trim($this->GetDescription());
+ if (empty($cflink['description'])) {
+ unset($cflink['description']);
+ }
+ $cflink['enabled'] = trim($this->GetEnabled());
+ if (empty($cflink['enabled'])) {
+ unset($cflink['enabled']);
+ }
+ $cflink['default'] = trim($this->GetDefault());
+ if (empty($cflink['default'])) {
+ unset($cflink['default']);
+ }
+ $cflink['red'] = trim($this->GetRed());
+ if (empty($cflink['red'])) {
+ unset($cflink['red']);
+ }
+ $cflink['codel'] = trim($this->GetCodel());
+ if (empty($cflink['codel'])) {
+ unset($cflink['codel']);
+ }
+ $cflink['rio'] = trim($this->GetRio());
+ if (empty($cflink['rio'])) {
+ unset($cflink['rio']);
+ }
+ $cflink['ecn'] = trim($this->GetEcn());
+ if (empty($cflink['ecn'])) {
+ unset($cflink['ecn']);
+ }
+ }
+}
+
+class hfsc_queue extends priq_queue {
+ /* realtime */
+ var $realtime;
+ var $r_m1;
+ var $r_d;
+ var $r_m2;
+ /* linkshare */
+ var $linkshare;
+ var $l_m1;
+ var $l_d;
+ var $l_m2;
+ /* upperlimit */
+ var $upperlimit;
+ var $u_m1;
+ var $u_d;
+ var $u_m2;
+
+ /*
+ * HFSC can have nested queues.
+ */
+ function CanHaveChildren() {
+ return true;
+ }
+ function GetRealtime() {
+ return $this->realtime;
+ }
+ function GetR_m1() {
+ return $this->r_m1;
+ }
+ function GetR_d() {
+ return $this->r_d;
+ }
+ function GetR_m2() {
+ return $this->r_m2;
+ }
+ function SetRealtime() {
+ $this->realtime = "on";
+ }
+ function DisableRealtime() {
+ $this->realtime = "";
+ }
+ function SetR_m1($value) {
+ $this->r_m1 = $value;
+ }
+ function SetR_d($value) {
+ $this->r_d = $value;
+ }
+ function SetR_m2($value) {
+ $this->r_m2 = $value;
+ }
+ function GetLinkshare() {
+ return $this->linkshare;
+ }
+ function DisableLinkshare() {
+ $this->linkshare = "";
+ }
+ function GetL_m1() {
+ return $this->l_m1;
+ }
+ function GetL_d() {
+ return $this->l_d;
+ }
+ function GetL_m2() {
+ return $this->l_m2;
+ }
+ function SetLinkshare() {
+ $this->linkshare = "on";
+ }
+ function SetL_m1($value) {
+ $this->l_m1 = $value;
+ }
+ function SetL_d($value) {
+ $this->l_d = $value;
+ }
+ function SetL_m2($value) {
+ $this->l_m2 = $value;
+ }
+ function GetUpperlimit() {
+ return $this->upperlimit;
+ }
+ function GetU_m1() {
+ return $this->u_m1;
+ }
+ function GetU_d() {
+ return $this->u_d;
+ }
+ function GetU_m2() {
+ return $this->u_m2;
+ }
+ function SetUpperlimit() {
+ $this->upperlimit = "on";
+ }
+ function DisableUpperlimit() {
+ $this->upperlimit = "";
+ }
+ function SetU_m1($value) {
+ $this->u_m1 = $value;
+ }
+ function SetU_d($value) {
+ $this->u_d = $value;
+ }
+ function SetU_m2($value) {
+ $this->u_m2 = $value;
+ }
+
+ function &add_queue($interface, &$qname, &$path, &$input_errors) {
+
+ if (!is_array($this->subqueues)) {
+ $this->subqueues = array();
+ }
+ $q =& new hfsc_queue();
+ $q->SetInterface($this->GetInterface());
+ $q->SetParent($this);
+ $q->ReadConfig($qname);
+ $q->validate_input($qname, $input_errors);
+ if (count($input_errors)) {
+ log_error("SHAPER: could not create queue " . $q->GetQname() . " on interface {$interface} because: " . print_r($input_errors, true));
+ return $q;
+ }
+
+ $q->SetEnabled("on");
+ $q->SetLink($path);
+ switch ($q->GetBwscale()) {
+ case "%":
+ $myBw = $this->GetAvailableBandwidth() * $qname['bandwidth'] / 100;
+ break;
+ default:
+ $myBw = $qname['bandwidth'] * get_bandwidthtype_scale($q->GetBwscale());
+ break;
+ }
+ $q->SetAvailableBandwidth($myBw);
+ $this->SetAvailableBandwidth($this->GetAvailableBandwidth() - $myBw);
+
+ $this->subqueues[$q->GetQname()] =& $q; //new hfsc_queue()
+ ref_on_altq_queue_list($this->GetQname(), $q->GetQname());
+ if (is_array($qname['queue'])) {
+ foreach ($qname['queue'] as $key1 => $que) {
+ array_push($path, $key1);
+ $q->add_queue($q->GetInterface(), $que, $path, $input_errors);
+ array_pop($path);
+ }
+ }
+
+ return $q;
+ }
+
+ function copy_queue($interface, &$cflink) {
+
+ $cflink['name'] = $this->GetQname();
+ $cflink['interface'] = $interface;
+ $cflink['qlimit'] = trim($this->GetQlimit());
+ if (empty($cflink['qlimit'])) {
+ unset($cflink['qlimit']);
+ }
+ $cflink['priority'] = trim($this->GetQpriority());
+ if (empty($cflink['priority'])) {
+ unset($cflink['priority']);
+ }
+ $cflink['description'] = trim($this->GetDescription());
+ if (empty($cflink['description'])) {
+ unset($cflink['description']);
+ }
+ $cflink['bandwidth'] = $this->GetBandwidth();
+ $cflink['bandwidthtype'] = $this->GetBwscale();
+ $cflink['enabled'] = trim($this->GetEnabled());
+ if (empty($cflink['enabled'])) {
+ unset($cflink['enabled']);
+ }
+ $cflink['default'] = trim($this->GetDefault());
+ if (empty($cflink['default'])) {
+ unset($cflink['default']);
+ }
+ $cflink['red'] = trim($this->GetRed());
+ if (empty($cflink['red'])) {
+ unset($cflink['red']);
+ }
+ $cflink['rio'] = trim($this->GetRio());
+ if (empty($cflink['rio'])) {
+ unset($cflink['rio']);
+ }
+ $cflink['ecn'] = trim($this->GetEcn());
+ if (empty($cflink['ecn'])) {
+ unset($cflink['ecn']);
+ }
+ if ($this->GetLinkshare() <> "") {
+ if ($this->GetL_m1() <> "") {
+ $cflink['linkshare1'] = $this->GetL_m1();
+ $cflink['linkshare2'] = $this->GetL_d();
+ $cflink['linkshare'] = "on";
+ } else {
+ unset($cflink['linkshare1']);
+ unset($cflink['linkshare2']);
+ unset($cflink['linkshare']);
+ }
+ if ($this->GetL_m2() <> "") {
+ $cflink['linkshare3'] = $this->GetL_m2();
+ $cflink['linkshare'] = "on";
+ } else {
+ unset($cflink['linkshare3']);
+ unset($cflink['linkshare']);
+ }
+ }
+ if ($this->GetRealtime() <> "") {
+ if ($this->GetR_m1() <> "") {
+ $cflink['realtime1'] = $this->GetR_m1();
+ $cflink['realtime2'] = $this->GetR_d();
+ $cflink['realtime'] = "on";
+ } else {
+ unset($cflink['realtime1']);
+ unset($cflink['realtime2']);
+ unset($cflink['realtime']);
+ }
+ if ($this->GetR_m2() <> "") {
+ $cflink['realtime3'] = $this->GetR_m2();
+ $cflink['realtime'] = "on";
+ } else {
+ unset($cflink['realtime3']);
+ unset($cflink['realtime']);
+ }
+ }
+ if ($this->GetUpperlimit() <> "") {
+ if ($this->GetU_m1() <> "") {
+ $cflink['upperlimit1'] = $this->GetU_m1();
+ $cflink['upperlimit2'] = $this->GetU_d();
+ $cflink['upperlimit'] = "on";
+ } else {
+ unset($cflink['upperlimit']);
+ unset($cflink['upperlimit1']);
+ unset($cflink['upperlimit2']);
+ }
+ if ($this->GetU_m2() <> "") {
+ $cflink['upperlimit3'] = $this->GetU_m2();
+ $cflink['upperlimit'] = "on";
+ } else {
+ unset($cflink['upperlimit3']);
+ unset($cflink['upperlimit']);
+ }
+ }
+
+ if (is_array($this->subqueues)) {
+ $cflinkp['queue'] = array();
+ foreach ($this->subqueues as $q) {
+ $cflink['queue'][$q->GetQname()] = array();
+ $q->copy_queue($interface, $cflink['queue'][$q->GetQname()]);
+ }
+ }
+ }
+
+ function delete_queue() {
+ unref_on_altq_queue_list($this->GetQname());
+ cleanup_queue_from_rules($this->GetQname());
+ $parent =& $this->GetParent();
+ foreach ($this->subqueues as $q) {
+ $this->SetAvailableBandwidth($this->GetAvailableBandwidth() + $q->GetAvailableBandwidth());
+ $q->delete_queue();
+ }
+ unset_object_by_reference($this->GetLink());
+ }
+
+ /*
+ * Should search even its children
+ */
+ function &find_queue($interface, $qname) {
+ if ($qname == $this->GetQname()) {
+ return $this;
+ }
+
+ foreach ($this->subqueues as $q) {
+ $result =& $q->find_queue("", $qname);
+ if ($result) {
+ return $result;
+ }
+ }
+ }
+
+ function &find_parentqueue($interface, $qname) {
+ if ($this->subqueues[$qname]) {
+ return $this;
+ }
+ foreach ($this->subqueues as $q) {
+ $result = $q->find_parentqueue("", $qname);
+ if ($result) {
+ return $result;
+ }
+ }
+ }
+
+ function validate_input($data, &$input_errors) {
+ parent::validate_input($data, $input_errors);
+
+ $reqdfields[] = "bandwidth";
+ $reqdfieldsn[] = gettext("Bandwidth");
+ $reqdfields[] = "bandwidthtype";
+ $reqdfieldsn[] = gettext("Bandwidthtype");
+
+ shaper_do_input_validation($data, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (isset($data['linkshare3']) && $data['linkshare3'] <> "") {
+ if ($data['bandwidth'] && (!is_numeric($data['bandwidth']))) {
+ $input_errors[] = gettext("Bandwidth must be an integer.");
+ }
+
+ if ($data['bandwidth'] < 0) {
+ $input_errors[] = gettext("Bandwidth cannot be negative.");
+ }
+
+ if ($data['bandwidthtype'] == "%") {
+ if ($data['bandwidth'] > 100 || $data['bandwidth'] < 0) {
+ $input_errors[] = gettext("Bandwidth in percentage should be between 1 and 100 bounds.");
+ }
+ }
+ /*
+ $parent =& $this->GetParent();
+ switch ($data['bandwidthtype']) {
+ case "%":
+ $myBw = $parent->GetAvailableBandwidth() * floatval($data['bandwidth']) / 100;
+ default:
+ $mybw = floatval($data['bandwidth']) * get_bandwidthtype_scale($data['bandwidthtype']);
+ break;
+ }
+ if ($parent->GetAvailableBandwidth() < $myBw) {
+ $input_errors[] = "The sum of children bandwidth exceeds that of the parent.";
+ }
+ */
+ }
+
+ if ($data['upperlimit1'] <> "" && $data['upperlimit2'] == "") {
+ $input_errors[] = gettext("upperlimit service curve defined but missing (d) value");
+ }
+ if ($data['upperlimit2'] <> "" && $data['upperlimit1'] == "") {
+ $input_errors[] = gettext("upperlimit service curve defined but missing initial bandwidth (m1) value");
+ }
+ if ($data['upperlimit1'] <> "" && !is_valid_shaperbw($data['upperlimit1'])) {
+ $input_errors[] = gettext("upperlimit m1 value needs to be Kb, Mb, Gb, or %");
+ }
+ if ($data['upperlimit2'] <> "" && !is_numeric($data['upperlimit2'])) {
+ $input_errors[] = gettext("upperlimit d value needs to be numeric");
+ }
+ if ($data['upperlimit3'] <> "" && !is_valid_shaperbw($data['upperlimit3'])) {
+ $input_errors[] = gettext("upperlimit m2 value needs to be Kb, Mb, Gb, or %");
+ }
+
+ /*
+ if (isset($data['upperlimit']) && $data['upperlimit3'] <> "" && $data['upperlimit1'] <> "") {
+ $bw_1 = get_hfsc_bandwidth($this, $data['upperlimit1']);
+ $bw_2 = get_hfsc_bandwidth($this, $data['upperlimit3']);
+ if (floatval($bw_1) < floatval($bw_2)) {
+ $input_errors[] = ("upperlimit m1 cannot be smaller than m2");
+ }
+
+ if (get_interface_bandwidth($this) < (0.8 * (floatval($bw_1) + floatval($bw_2)))) {
+ $input_errors[] = ("upperlimit specification exceeds 80% of allowable allocation.");
+ }
+ }
+ */
+ if ($data['linkshare1'] <> "" && $data['linkshare2'] == "") {
+ $input_errors[] = gettext("linkshare service curve defined but missing (d) value");
+ }
+ if ($data['linkshare2'] <> "" && $data['linkshare1'] == "") {
+ $input_errors[] = gettext("linkshare service curve defined but missing initial bandwidth (m1) value");
+ }
+ if ($data['linkshare1'] <> "" && !is_valid_shaperbw($data['linkshare1'])) {
+ $input_errors[] = gettext("linkshare m1 value needs to be Kb, Mb, Gb, or %");
+ }
+ if ($data['linkshare2'] <> "" && !is_numeric($data['linkshare2'])) {
+ $input_errors[] = gettext("linkshare d value needs to be numeric");
+ }
+ if ($data['linkshare3'] <> "" && !is_valid_shaperbw($data['linkshare3'])) {
+ $input_errors[] = gettext("linkshare m2 value needs to be Kb, Mb, Gb, or %");
+ }
+ if ($data['realtime1'] <> "" && $data['realtime2'] == "") {
+ $input_errors[] = gettext("realtime service curve defined but missing (d) value");
+ }
+ if ($data['realtime2'] <> "" && $data['realtime1'] == "") {
+ $input_errors[] = gettext("realtime service curve defined but missing initial bandwidth (m1) value");
+ }
+
+ /*
+ if (isset($data['linkshare']) && $data['linkshare3'] <> "" && $data['linkshare1'] <> "" && 0) {
+ $bw_1 = get_hfsc_bandwidth($this, $data['linkshare1']);
+ $bw_2 = get_hfsc_bandwidth($this, $data['linkshare3']);
+ if (floatval($bw_1) < floatval($bw_2)) {
+ $input_errors[] = ("linkshare m1 cannot be smaller than m2");
+ }
+
+ if (get_interface_bandwidth($this) < (0.8 * (floatval($bw_1) + floatval($bw_2)))) {
+ $input_errors[] = ("linkshare specification exceeds 80% of allowable allocation.");
+ }
+ }
+ */
+
+ if ($data['realtime1'] <> "" && !is_valid_shaperbw($data['realtime1'])) {
+ $input_errors[] = gettext("realtime m1 value needs to be Kb, Mb, Gb, or %");
+ }
+ if ($data['realtime2'] <> "" && !is_numeric($data['realtime2'])) {
+ $input_errors[] = gettext("realtime d value needs to be numeric");
+ }
+ if ($data['realtime3'] <> "" && !is_valid_shaperbw($data['realtime3'])) {
+ $input_errors[] = gettext("realtime m2 value needs to be Kb, Mb, Gb, or %");
+ }
+
+ /*
+ if (isset($data['realtime']) && $data['realtime3'] <> "" && $data['realtime1'] <> "" && 0) {
+ $bw_1 = get_hfsc_bandwidth($this, $data['realtime1']);
+ $bw_2 = get_hfsc_bandwidth($this, $data['realtime3']);
+ if (floatval($bw_1) < floatval($bw_2)) {
+ $input_errors[] = ("realtime m1 cannot be smaller than m2");
+ }
+
+ if (get_interface_bandwidth($this) < (0.8 * (floatval($bw_1) + floatval($bw_2)))) {
+ $input_errors[] = ("realtime specification exceeds 80% of allowable allocation.");
+ }
+ }
+ */
+ }
+
+ function ReadConfig(&$cflink) {
+ if (!empty($cflink['linkshare'])) {
+ if (!empty($cflink['linkshare1'])) {
+ $this->SetL_m1($cflink['linkshare1']);
+ $this->SetL_d($cflink['linkshare2']);
+ $this->SetLinkshare();
+ } else {
+ $this->SetL_m1("");
+ $this->SetL_d("");
+ $this->DisableLinkshare();
+ }
+ if (!empty($cflink['linkshare3'])) {
+ $this->SetL_m2($cflink['linkshare3']);
+ $this->SetLinkshare();
+ }
+ } else {
+ $this->DisableLinkshare();
+ }
+ if (!empty($cflink['realtime'])) {
+ if (!empty($cflink['realtime1'])) {
+ $this->SetR_m1($cflink['realtime1']);
+ $this->SetR_d($cflink['realtime2']);
+ $this->SetRealtime();
+ } else {
+ $this->SetR_m1("");
+ $this->SetR_d("");
+ $this->DisableRealtime();
+ }
+ if (!empty($cflink['realtime3'])) {
+ $this->SetR_m2($cflink['realtime3']);
+ $this->SetRealtime();
+ }
+ } else {
+ $this->DisableRealtime();
+ }
+ if (!empty($cflink['upperlimit'])) {
+ if (!empty($cflink['upperlimit1'])) {
+ $this->SetU_m1($cflink['upperlimit1']);
+ $this->SetU_d($cflink['upperlimit2']);
+ $this->SetUpperlimit();
+ } else {
+ $this->SetU_m1("");
+ $this->SetU_d("");
+ $this->DisableUpperlimit();
+ }
+ if (!empty($cflink['upperlimit3'])) {
+ $this->SetU_m2($cflink['upperlimit3']);
+ $this->SetUpperlimit();
+ }
+ } else {
+ $this->DisableUpperlimit();
+ }
+ parent::ReadConfig($cflink);
+ }
+
+ function build_tree() {
+ $tree = " <li><a href=\"firewall_shaper.php?interface=" . $this->GetInterface() ."&amp;queue=" . $this->GetQname()."&amp;action=show";
+ $tree .= "\" ";
+ $tmpvalue = $this->GetDefault();
+ if (!empty($tmpvalue)) {
+ $tree .= " class=\"navlnk\"";
+ }
+ $tree .= " >" . $this->GetQname() . "</a>";
+ if (is_array($this->subqueues)) {
+ $tree .= "<ul>";
+ foreach ($this->subqueues as $q) {
+ $tree .= $q->build_tree();
+ }
+ $tree .= "</ul>";
+ }
+ $tree .= "</li>";
+ return $tree;
+ }
+
+ /* Even this should take children into consideration */
+ function build_rules(&$default = false) {
+
+ $pfq_rule = " queue ". $this->qname;
+ if ($this->GetInterface()) {
+ $pfq_rule .= " on ".get_real_interface($this->GetInterface());
+ }
+ if ($this->GetBandwidth() && $this->GetBwscale()) {
+ $pfq_rule .= " bandwidth ".trim($this->GetBandwidth()).$this->GetBwscale();
+ }
+
+ $tmpvalue = $this->GetQlimit();
+ if (!empty($tmpvalue)) {
+ $pfq_rule .= " qlimit " . $this->GetQlimit();
+ }
+ if ($this->GetDefault() || $this->GetRed() || $this->GetRio() || $this->GetEcn() || $this->GetCodel() || $this->GetRealtime() <> "" || $this->GetLinkshare() <> "" || $this->GetUpperlimit() <> "") {
+ $pfq_rule .= " hfsc ( ";
+ $tmpvalue = $this->GetRed();
+ if (!empty($tmpvalue)) {
+ $comma = 1;
+ $pfq_rule .= " red ";
+ }
+
+ $tmpvalue = $this->GetRio();
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " rio ";
+ }
+ $tmpvalue = $this->GetEcn();
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " ecn ";
+ }
+ $tmpvalue = $this->GetCodel();
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " codel ";
+ }
+ $tmpvalue = $this->GetDefault();
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " default ";
+ $default = true;
+ }
+
+ if ($this->GetRealtime() <> "") {
+ if ($comma) {
+ $pfq_rule .= " , ";
+ }
+ if ($this->GetR_m1() <> "" && $this->GetR_d() <> "" && $this->GetR_m2() <> "") {
+ $pfq_rule .= " realtime (".$this->GetR_m1() . ", " . $this->GetR_d().", ". $this->GetR_m2() .") ";
+ } else if ($this->GetR_m2() <> "") {
+ $pfq_rule .= " realtime " . $this->GetR_m2();
+ }
+ $comma = 1;
+ }
+ if ($this->GetLinkshare() <> "") {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ if ($this->GetL_m1() <> "" && $this->GetL_d() <> "" && $this->GetL_m2() <> "") {
+ $pfq_rule .= " linkshare (".$this->GetL_m1(). ", ". $this->GetL_d(). ", ". $this->GetL_m2(). ") ";
+ } else if ($this->GetL_m2() <> "") {
+ $pfq_rule .= " linkshare " . $this->GetL_m2() . " ";
+ }
+ $comma = 1;
+ }
+ if ($this->GetUpperlimit() <> "") {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ if ($this->GetU_m1() <> "" && $this->GetU_d() <> "" && $this->GetU_m2() <> "") {
+ $pfq_rule .= " upperlimit (".$this->GetU_m1().", ". $this->GetU_d().", ". $this->GetU_m2(). ") ";
+ } else if ($this->GetU_m2() <> "") {
+ $pfq_rule .= " upperlimit " . $this->GetU_m2() . " ";
+ }
+ }
+ $pfq_rule .= " ) ";
+ }
+ if (count($this->subqueues)) {
+ $i = count($this->subqueues);
+ $pfq_rule .= " { ";
+ foreach ($this->subqueues as $qkey => $qnone) {
+ if ($i > 1) {
+ $i--;
+ $pfq_rule .= " {$qkey}, ";
+ } else {
+ $pfq_rule .= " {$qkey} ";
+ }
+ }
+ $pfq_rule .= " } \n";
+ foreach ($this->subqueues as $q) {
+ $pfq_rule .= $q->build_rules($default);
+ }
+ }
+
+ $pfq_rule .= " \n";
+
+ return $pfq_rule;
+ }
+
+ function build_javascript() {
+ $javascript = parent::build_javascript();
+ $javascript .= "<script type=\"text/javascript\">";
+ $javascript .= "//<![CDATA[\n";
+ $javascript .= "function enable_realtime(enable_over) { \n";
+ $javascript .= "if (document.iform.realtime.checked || enable_over) { \n";
+ $javascript .= "document.iform.realtime1.disabled = 0;\n";
+ $javascript .= "document.iform.realtime2.disabled = 0;\n";
+ $javascript .= "document.iform.realtime3.disabled = 0;\n";
+ $javascript .= " } else { \n";
+ $javascript .= "document.iform.realtime1.disabled = 1;\n";
+ $javascript .= "document.iform.realtime2.disabled = 1;\n";
+ $javascript .= "document.iform.realtime3.disabled = 1;\n";
+ $javascript .= " } \n";
+ $javascript .= " } \n";
+ $javascript .= "function enable_linkshare(enable_over) { \n";
+ $javascript .= "if (document.iform.linkshare.checked || enable_over) { \n";
+ $javascript .= "document.iform.linkshare1.disabled = 0;\n";
+ $javascript .= "document.iform.linkshare2.disabled = 0;\n";
+ $javascript .= "document.iform.linkshare3.disabled = 0;\n";
+ $javascript .= " } else { \n";
+ $javascript .= "document.iform.linkshare1.disabled = 1;\n";
+ $javascript .= "document.iform.linkshare2.disabled = 1;\n";
+ $javascript .= "document.iform.linkshare3.disabled = 1;\n";
+ $javascript .= " } \n";
+ $javascript .= " } \n";
+ $javascript .= "function enable_upperlimit(enable_over) { \n";
+ $javascript .= "if (document.iform.upperlimit.checked || enable_over) { \n";
+ $javascript .= "document.iform.upperlimit1.disabled = 0;\n";
+ $javascript .= "document.iform.upperlimit2.disabled = 0;\n";
+ $javascript .= "document.iform.upperlimit3.disabled = 0;\n";
+ $javascript .= " } else { \n";
+ $javascript .= "document.iform.upperlimit1.disabled = 1;\n";
+ $javascript .= "document.iform.upperlimit2.disabled = 1;\n";
+ $javascript .= "document.iform.upperlimit3.disabled = 1;\n";
+ $javascript .= " } \n";
+
+ $javascript .= "} \n";
+ $javascript .= "//]]>";
+ $javascript .= "</script>";
+
+ return $javascript;
+ }
+
+ function build_form() {
+ $form = parent::build_form();
+ $form .= "<tr>";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth") . "</td>";
+ $form .= "<td class=\"vtable\"> <input name=\"bandwidth\" id=\"bandwidth\" class=\"formfld unknown\" value=\"";
+ $form .= htmlspecialchars($this->GetBandwidth());
+ $form .= "\" />";
+ $form .= "<select name=\"bandwidthtype\" id=\"bandwidthtype\" class=\"formselect\">";
+ $form .= "<option value=\"Gb\"";
+ if ($this->GetBwscale() == "Gb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Gbit/s") . "</option>";
+ $form .= "<option value=\"Mb\"";
+ if ($this->GetBwscale() == "Mb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Mbit/s") . "</option>";
+ $form .= "<option value=\"Kb\"";
+ if ($this->GetBwscale() == "Kb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Kbit/s") . "</option>";
+ $form .= "<option value=\"b\"";
+ if ($this->GetBwscale() == "b") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Bit/s") . "</option>";
+ $form .= "<option value=\"%\"";
+ if ($this->GetBwscale() == "%") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">%</option>";
+ $form .= "</select> <br />";
+ $form .= "<span class=\"vexpl\">" . gettext("Choose the amount of bandwidth for this queue");
+ $form .= "</span></td></tr>";
+ $form .= "<tr>";
+ $form .= "<td width=\"22%\" valign=\"middle\" class=\"vncellreq\">" . gettext("Service Curve (sc)") . "</td>";
+ $form .= "<td width=\"78%\" class=\"vtable\">";
+ $form .= "<table>";
+ $form .= "<tr><td>&nbsp;</td><td><center>m1</center></td><td><center>d</center></td><td><center><b>m2</b></center></td></tr>";
+ $form .= "<tr><td><input type=\"checkbox\" id=\"upperlimit\" name=\"upperlimit\"";
+ if ($this->GetUpperlimit()<> "") {
+ $form .= " checked=\"checked\" ";
+ }
+ $form .= "onchange=\"enable_upperlimit()\" /> " . gettext("Upperlimit:") . "</td><td><input size=\"6\" value=\"";
+ $form .= htmlspecialchars($this->GetU_m1());
+ $form .= "\" id=\"upperlimit1\" name=\"upperlimit1\" ";
+ if ($this->GetUpperlimit() == "") {
+ $form .= " disabled=\"disabled\"";
+ }
+ $form .= " /></td><td><input size=\"6\" value=\"";
+ $form .= htmlspecialchars($this->GetU_d());
+ $form .= "\" id=\"upperlimi2\" name=\"upperlimit2\" ";
+ if ($this->GetUpperlimit() == "") {
+ $form .= " disabled=\"disabled\"";
+ }
+ $form .= " /></td><td><input size=\"6\" value=\"";
+ $form .= htmlspecialchars($this->GetU_m2());
+ $form .= "\" id=\"upperlimit3\" name=\"upperlimit3\" ";
+ if ($this->GetUpperlimit() == "") {
+ $form .= " disabled=\"disabled\"";
+ }
+ $form .= " /></td><td>" . gettext("The maximum allowed bandwidth for the queue.") . "</td></tr>";
+ $form .= "<tr><td><input type=\"checkbox\" id=\"realtime\" name=\"realtime\"";
+ if ($this->GetRealtime() <> "") {
+ $form .= " checked=\"checked\" ";
+ }
+ $form .= "onchange=\"enable_realtime()\" /> " . gettext("Real time:") . "</td><td><input size=\"6\" value=\"";
+ $form .= htmlspecialchars($this->GetR_m1());
+ $form .= "\" id=\"realtime1\" name=\"realtime1\" ";
+ if ($this->GetRealtime() == "") {
+ $form .= " disabled=\"disabled\"";
+ }
+ $form .= " /></td><td><input size=\"6\" value=\"";
+ $form .= htmlspecialchars($this->GetR_d());
+ $form .= "\" id=\"realtime2\" name=\"realtime2\" ";
+ if ($this->GetRealtime() == "") {
+ $form .= " disabled=\"disabled\"";
+ }
+ $form .= " /></td><td><input size=\"6\" value=\"";
+ $form .= htmlspecialchars($this->GetR_m2());
+ $form .= "\" id=\"realtime3\" name=\"realtime3\" ";
+ if ($this->GetRealtime() == "") {
+ $form .= " disabled=\"disabled\"";
+ }
+ $form .= " /></td><td>" . gettext("The minimum required bandwidth for the queue.") . "</td></tr>";
+ $form .= "<tr><td><input type=\"checkbox\" id=\"linkshare\" name=\"linkshare\"";
+ if ($this->GetLinkshare() <> "") {
+ $form .= " checked=\"checked\" ";
+ }
+ $form .= "onchange=\"enable_linkshare()\" /> " . gettext("Link share:") . "</td><td><input size=\"6\" value=\"";
+ $form .= htmlspecialchars($this->GetL_m1());
+ $form .= "\" id=\"linkshare1\" name=\"linkshare1\" ";
+ if ($this->GetLinkshare() == "") {
+ $form .= " disabled=\"disabled\"";
+ }
+ $form .= " /></td><td><input size=\"6\" value=\"";
+ $form .= htmlspecialchars($this->GetL_d());
+ $form .= "\" id=\"linkshare2\" name=\"linkshare2\" ";
+ if ($this->GetLinkshare() == "") {
+ $form .= " disabled=\"disabled\"";
+ }
+ $form .= " /></td><td><input size=\"6\" value=\"";
+ $form .= htmlspecialchars($this->GetL_m2());
+ $form .= "\" id=\"linkshare3\" name=\"linkshare3\" ";
+ if ($this->GetLinkshare() == "") {
+ $form .= " disabled=\"disabled\"";
+ }
+ $form .= " /></td><td>" . gettext("The bandwidth share of a backlogged queue - this overrides priority.") . "</td></tr>";
+ $form .= "</table><br />";
+ $form .= gettext("The format for service curve specifications is (m1, d, m2). m2 controls "
+ . "the bandwidth assigned to the queue. m1 and d are optional and can be "
+ . "used to control the initial bandwidth assignment. For the first d milliseconds the queue gets the bandwidth given as m1, afterwards the value "
+ . "given in m2.");
+ $form .= "</td>";
+ $form .= "</tr>";
+
+ return $form;
+ }
+
+ function update_altq_queue_data(&$data) {
+ $this->ReadConfig($data);
+ }
+
+ function wconfig() {
+ $cflink =& get_reference_to_me_in_config($this->GetLink());
+ if (!is_array($cflink)) {
+ $cflink = array();
+ }
+ $cflink['name'] = $this->GetQname();
+ $cflink['interface'] = $this->GetInterface();
+ $cflink['qlimit'] = trim($this->GetQlimit());
+ if (empty($cflink['qlimit'])) {
+ unset($cflink['qlimit']);
+ }
+ $cflink['priority'] = $this->GetQpriority();
+ if (empty($cflink['priority'])) {
+ unset($cflink['priority']);
+ }
+ $cflink['description'] = $this->GetDescription();
+ if (empty($cflink['description'])) {
+ unset($cflink['description']);
+ }
+ $cflink['bandwidth'] = $this->GetBandwidth();
+ $cflink['bandwidthtype'] = $this->GetBwscale();
+ $cflink['enabled'] = $this->GetEnabled();
+ if (empty($cflink['enabled'])) {
+ unset($cflink['enabled']);
+ }
+ $cflink['default'] = $this->GetDefault();
+ if (empty($cflink['default'])) {
+ unset($cflink['default']);
+ }
+ $cflink['red'] = trim($this->GetRed());
+ if (empty($cflink['red'])) {
+ unset($cflink['red']);
+ }
+ $cflink['rio'] = $this->GetRio();
+ if (empty($cflink['rio'])) {
+ unset($cflink['rio']);
+ }
+ $cflink['ecn'] = trim($this->GetEcn());
+ if (empty($cflink['ecn'])) {
+ unset($cflink['ecn']);
+ }
+ $cflink['codel'] = trim($this->GetCodel());
+ if (empty($cflink['codel'])) {
+ unset($cflink['codel']);
+ }
+ if ($this->GetLinkshare() <> "") {
+ if ($this->GetL_m1() <> "") {
+ $cflink['linkshare1'] = $this->GetL_m1();
+ $cflink['linkshare2'] = $this->GetL_d();
+ $cflink['linkshare'] = "on";
+ } else {
+ unset($cflink['linkshare']);
+ unset($cflink['linkshare1']);
+ unset($cflink['linkshare2']);
+ }
+ if ($this->GetL_m2() <> "") {
+ $cflink['linkshare3'] = $this->GetL_m2();
+ $cflink['linkshare'] = "on";
+ } else {
+ unset($cflink['linkshare']);
+ unset($cflink['linkshare3']);
+ }
+ } else {
+ unset($cflink['linkshare']);
+ unset($cflink['linkshare1']);
+ unset($cflink['linkshare2']);
+ unset($cflink['linkshare3']);
+ }
+ if ($this->GetRealtime() <> "") {
+ if ($this->GetR_m1() <> "") {
+ $cflink['realtime1'] = $this->GetR_m1();
+ $cflink['realtime2'] = $this->GetR_d();
+ $cflink['realtime'] = "on";
+ } else {
+ unset($cflink['realtime']);
+ unset($cflink['realtime1']);
+ unset($cflink['realtime2']);
+ }
+ if ($this->GetR_m2() <> "") {
+ $cflink['realtime3'] = $this->GetR_m2();
+ $cflink['realtime'] = "on";
+ } else {
+ unset($cflink['realtime']);
+ unset($cflink['realtime3']);
+ }
+ } else {
+ unset($cflink['realtime']);
+ unset($cflink['realtime1']);
+ unset($cflink['realtime2']);
+ unset($cflink['realtime3']);
+ }
+ if ($this->GetUpperlimit() <> "") {
+ if ($this->GetU_m1() <> "") {
+ $cflink['upperlimit1'] = $this->GetU_m1();
+ $cflink['upperlimit2'] = $this->GetU_d();
+ $cflink['upperlimit'] = "on";
+ } else {
+ unset($cflink['upperlimit']);
+ unset($cflink['upperlimit1']);
+ unset($cflink['upperlimit2']);
+ }
+ if ($this->GetU_m2() <> "") {
+ $cflink['upperlimit3'] = $this->GetU_m2();
+ $cflink['upperlimit'] = "on";
+ } else {
+ unset($cflink['upperlimit']);
+ unset($cflink['upperlimit3']);
+ }
+ } else {
+ unset($cflink['upperlimit']);
+ unset($cflink['upperlimit1']);
+ unset($cflink['upperlimit2']);
+ unset($cflink['upperlimit3']);
+ }
+ }
+}
+
+class cbq_queue extends priq_queue {
+ var $qborrow = "";
+
+ function GetBorrow() {
+ return $this->qborrow;
+ }
+ function SetBorrow($borrow) {
+ $this->qborrow = $borrow;
+ }
+ function CanHaveChildren() {
+ return true;
+ }
+
+ function &add_queue($interface, &$qname, &$path, &$input_errors) {
+
+ if (!is_array($this->subqueues)) {
+ $this->subqueues = array();
+ }
+ $q =& new cbq_queue();
+ $q->SetInterface($this->GetInterface());
+ $q->SetParent($this);
+ $q->ReadConfig($qname);
+ $q->validate_input($qname, $input_errors);
+ if (count($input_errors)) {
+ log_error("SHAPER: could not create queue " . $q->GetQname() . " on interface {$interface} because: " . print_r($input_errors, true));
+ return $q;
+ }
+ switch ($q->GetBwscale()) {
+ case "%":
+ $myBw = $this->GetAvailableBandwidth() * $qname['bandwidth'] / 100;
+ break;
+ default:
+ $myBw = $qname['bandwidth'] * get_bandwidthtype_scale($q->GetBwscale());
+ break;
+ }
+ $q->SetAvailableBandwidth($myBw);
+ $this->SetAvailableBandwidth($this->GetAvailableBandwidth() - $myBw);
+
+ $q->SetEnabled("on");
+ $q->SetLink($path);
+ $this->subqueues[$q->GetQName()] = &$q;
+ ref_on_altq_queue_list($this->GetQname(), $q->GetQname());
+ if (is_array($qname['queue'])) {
+ foreach ($qname['queue'] as $key1 => $que) {
+ array_push($path, $key1);
+ $q->add_queue($q->GetInterface(), $que, $path, $input_errors);
+ array_pop($path);
+ }
+ }
+
+ return $q;
+ }
+
+ function copy_queue($interface, &$cflink) {
+
+ $cflink['interface'] = $interface;
+ $cflink['qlimit'] = trim($this->GetQlimit());
+ if (empty($clink['qlimit'])) {
+ unset($cflink['qlimit']);
+ }
+ $cflink['priority'] = trim($this->GetQpriority());
+ if (empty($cflink['priority'])) {
+ unset($cflink['priority']);
+ }
+ $cflink['name'] = $this->GetQname();
+ $cflink['description'] = trim($this->GetDescription());
+ if (empty($cflink['description'])) {
+ unset($cflink['description']);
+ }
+ $cflink['bandwidth'] = $this->GetBandwidth();
+ $cflink['bandwidthtype'] = $this->GetBwscale();
+ $cflink['enabled'] = trim($this->GetEnabled());
+ if (empty($cflink['enabled'])) {
+ unset($cflink['enabled']);
+ }
+ $cflink['default'] = trim($this->GetDefault());
+ if (empty($cflink['default'])) {
+ unset($cflink['default']);
+ }
+ $cflink['red'] = trim($this->GetRed());
+ if (empty($cflink['red'])) {
+ unset($cflink['red']);
+ }
+ $cflink['rio'] = trim($this->GetRio());
+ if (empty($cflink['rio'])) {
+ unset($cflink['rio']);
+ }
+ $cflink['ecn'] = trim($this->GetEcn());
+ if (empty($cflink['ecn'])) {
+ unset($cflink['ecn']);
+ }
+ $cflink['borrow'] = trim($this->GetBorrow());
+ if (empty($cflink['borrow'])) {
+ unset($cflink['borrow']);
+ }
+ if (is_array($this->queues)) {
+ $cflinkp['queue'] = array();
+ foreach ($this->subqueues as $q) {
+ $cflink['queue'][$q->GetQname()] = array();
+ $q->copy_queue($interface, $cflink['queue'][$q->GetQname()]);
+ }
+ }
+ }
+
+ /*
+ * Should search even its children
+ */
+ function &find_queue($interface, $qname) {
+ if ($qname == $this->GetQname()) {
+ return $this;
+ }
+ foreach ($this->subqueues as $q) {
+ $result =& $q->find_queue("", $qname);
+ if ($result) {
+ return $result;
+ }
+ }
+ }
+
+ function &find_parentqueue($interface, $qname) {
+ if ($this->subqueues[$qname]) {
+ return $this;
+ }
+ foreach ($this->subqueues as $q) {
+ $result = $q->find_parentqueue("", $qname);
+ if ($result) {
+ return $result;
+ }
+ }
+ }
+
+ function delete_queue() {
+ unref_on_altq_queue_list($this->GetQname());
+ cleanup_queue_from_rules($this->GetQname());
+ foreach ($this->subqueues as $q) {
+ $this->SetAvailableBandwidth($this->GetAvailableBandwidth() + $q->GetAvailableBandwidth());
+ $q->delete_queue();
+ }
+ unset_object_by_reference($this->GetLink());
+ }
+
+ function validate_input($data, &$input_errors) {
+ parent::validate_input($data, $input_errors);
+
+ if ($data['priority'] > 7) {
+ $input_errors[] = gettext("Priority must be an integer between 1 and 7.");
+ }
+ $reqdfields[] = "bandwidth";
+ $reqdfieldsn[] = gettext("Bandwidth");
+ $reqdfields[] = "bandwidthtype";
+ $reqdfieldsn[] = gettext("Bandwidthtype");
+
+ shaper_do_input_validation($data, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($data['bandwidth'] && !is_numeric($data['bandwidth'])) {
+ $input_errors[] = gettext("Bandwidth must be an integer.");
+ }
+
+
+ if ($data['bandwidth'] < 0) {
+ $input_errors[] = gettext("Bandwidth cannot be negative.");
+ }
+
+ if ($data['bandwidthtype'] == "%") {
+ if ($data['bandwidth'] > 100 || $data['bandwidth'] < 0) {
+ $input_errors[] = gettext("Bandwidth in percentage should be between 1 and 100 bounds.");
+ }
+ }
+
+/*
+ $parent =& $this->GetParent();
+ switch ($data['bandwidthtype']) {
+ case "%":
+ $myBw = $parent->GetAvailableBandwidth() * floatval($data['bandwidth']) / 100;
+ break;
+ default:
+ $mybw = floatval($data['bandwidth']) * get_bandwidthtype_scale($data['bandwidthtype']);
+ break;
+ }
+ if ($parent->GetAvailableBandwidth() < floatval($myBw)) {
+ $input_errors[] = "The sum of the children bandwidth exceeds that of the parent.";
+ }
+ */
+ }
+
+ function ReadConfig(&$q) {
+ parent::ReadConfig($q);
+ if (!empty($q['borrow'])) {
+ $this->SetBorrow("on");
+ } else {
+ $this->SetBorrow("");
+ }
+ }
+
+ function build_javascript() {
+ return parent::build_javascript();
+ }
+
+ function build_tree() {
+ $tree = " <li><a href=\"firewall_shaper.php?interface=" . $this->GetInterface()."&amp;queue=" . $this->GetQname()."&amp;action=show";
+ $tree .= "\" ";
+ $tmpvalue = trim($this->GetDefault());
+ if (!empty($tmpvalue)) {
+ $tree .= " class=\"navlnk\"";
+ }
+ $tree .= " >" . $this->GetQname() . "</a>";
+ if (is_array($this->subqueues)) {
+ $tree .= "<ul>";
+ foreach ($this->subqueues as $q) {
+ $tree .= $q->build_tree();
+ }
+ $tree .= "</ul>";
+ }
+ $tree .= "</li>";
+ return $tree;
+ }
+
+ /* Even this should take children into consideration */
+ function build_rules(&$default = false) {
+ $pfq_rule = "queue ". $this->qname;
+ if ($this->GetInterface()) {
+ $pfq_rule .= " on ".get_real_interface($this->GetInterface());
+ }
+ if ($this->GetBandwidth() && $this->GetBwscale()) {
+ $pfq_rule .= " bandwidth ".trim($this->GetBandwidth()).$this->GetBwscale();
+ }
+ $tmpvalue = $this->GetQpriority();
+ if (!empty($tmpvalue)) {
+ $pfq_rule .= " priority " . $this->GetQpriority();
+ }
+ $tmpvalue = trim($this->GetQlimit());
+ if (!empty($tmpvalue)) {
+ $pfq_rule .= " qlimit " . $this->GetQlimit();
+ }
+ if ($this->GetDefault() || $this->GetRed() || $this->GetRio() || $this->GetEcn() || $this->GetBorrow() || $this->GetCodel()) {
+ $pfq_rule .= " cbq ( ";
+ $tmpvalue = trim($this->GetRed());
+ if (!empty($tmpvalue)) {
+ $comma = 1;
+ $pfq_rule .= " red ";
+ }
+ $tmpvalue = trim($this->GetCodel());
+ if (!empty($tmpvalue)) {
+ $comma = 1;
+ $pfq_rule .= " codel ";
+ }
+ $tmpvalue = trim($this->GetRio());
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " rio ";
+ }
+ $tmpvalue = trim($this->GetEcn());
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " ecn ";
+ }
+ $tmpvalue = trim($this->GetDefault());
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " default ";
+ $default = true;
+ }
+ $tmpvalue = trim($this->GetBorrow());
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= ", ";
+ }
+ $pfq_rule .= " borrow ";
+ }
+ $pfq_rule .= " ) ";
+ }
+ if (count($this->subqueues)) {
+ $i = count($this->subqueues);
+ $pfq_rule .= " { ";
+ foreach ($this->subqueues as $qkey => $qnone) {
+ if ($i > 1) {
+ $i--;
+ $pfq_rule .= " {$qkey}, ";
+ } else {
+ $pfq_rule .= " {$qkey} ";
+ }
+ }
+ $pfq_rule .= " } \n";
+ foreach ($this->subqueues as $q) {
+ $pfq_rule .= $q->build_rules($default);
+ }
+ }
+
+ $pfq_rule .= " \n";
+ return $pfq_rule;
+ }
+
+ function build_form() {
+ $form = parent::build_form();
+ $form .= "<tr>";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth") . "</td>";
+ $form .= "<td class=\"vtable\"> <input name=\"bandwidth\" id=\"bandwidth\" class=\"formfld unknown\" value=\"";
+ if ($this->GetBandwidth() > 0) {
+ $form .= htmlspecialchars($this->GetBandwidth());
+ }
+ $form .= "\" />";
+ $form .= "<select name=\"bandwidthtype\" id=\"bandwidthtype\" class=\"formselect\">";
+ $form .= "<option value=\"Gb\"";
+ if ($this->GetBwscale() == "Gb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Gbit/s") . "</option>";
+ $form .= "<option value=\"Mb\"";
+ if ($this->GetBwscale() == "Mb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Mbit/s") . "</option>";
+ $form .= "<option value=\"Kb\"";
+ if ($this->GetBwscale() == "Kb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Kbit/s") . "</option>";
+ $form .= "<option value=\"b\"";
+ if ($this->GetBwscale() == "b") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Bit/s") . "</option>";
+ $form .= "<option value=\"%\"";
+ if ($this->GetBwscale() == "%") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">%</option>";
+ $form .= "</select> <br />";
+ $form .= "<span class=\"vexpl\">" . gettext("Choose the amount of bandwidth for this queue");
+ $form .= "</span></td></tr>";
+ $form .= "<tr><td class=\"vncellreq\">" . gettext("Scheduler specific options") . "</td>";
+ $form .= "<td class=\"vtable\"><input type=\"checkbox\" id=\"borrow\" name=\"borrow\"";
+ if ($this->GetBorrow() == "on") {
+ $form .= " checked=\"checked\" ";
+ }
+ $form .= " /> " . gettext("Borrow from other queues when available") . "<br /></td></tr>";
+
+ return $form;
+ }
+
+ function update_altq_queue_data(&$data) {
+ $this->ReadConfig($data);
+ }
+
+ function wconfig() {
+ $cflink =& get_reference_to_me_in_config($this->GetLink());
+ if (!is_array($cflink)) {
+ $cflink = array();
+ }
+ $cflink['interface'] = $this->GetInterface();
+ $cflink['qlimit'] = trim($this->GetQlimit());
+ if (empty($cflink['qlimit'])) {
+ unset($cflink['qlimit']);
+ }
+ $cflink['priority'] = $this->GetQpriority();
+ if (empty($cflink['priority'])) {
+ unset($cflink['priority']);
+ }
+ $cflink['name'] = $this->GetQname();
+ $cflink['description'] = $this->GetDescription();
+ if (empty($cflink['description'])) {
+ unset($cflink['description']);
+ }
+ $cflink['bandwidth'] = $this->GetBandwidth();
+ $cflink['bandwidthtype'] = $this->GetBwscale();
+ $cflink['enabled'] = trim($this->GetEnabled());
+ if (empty($cflink['enabled'])) {
+ unset($cflink['enabled']);
+ }
+ $cflink['default'] = trim($this->GetDefault());
+ if (empty($cflink['default'])) {
+ unset($cflink['default']);
+ }
+ $cflink['red'] = trim($this->GetRed());
+ if (empty($cflink['red'])) {
+ unset($cflink['red']);
+ }
+ $cflink['rio'] = trim($this->GetRio());
+ if (empty($cflink['rio'])) {
+ unset($cflink['rio']);
+ }
+ $cflink['ecn'] = trim($this->GetEcn());
+ if (empty($cflink['ecn'])) {
+ unset($cflink['ecn']);
+ }
+ $cflink['codel'] = trim($this->GetCodel());
+ if (empty($cflink['codel'])) {
+ unset($cflink['codel']);
+ }
+ $cflink['borrow'] = trim($this->GetBorrow());
+ if (empty($cflink['borrow'])) {
+ unset($cflink['borrow']);
+ }
+ }
+}
+
+class fairq_queue extends priq_queue {
+ var $hogs;
+ var $buckets;
+
+ function GetBuckets() {
+ return $this->buckets;
+ }
+ function SetBuckets($buckets) {
+ $this->buckets = $buckets;
+ }
+ function GetHogs() {
+ return $this->hogs;
+ }
+ function SetHogs($hogs) {
+ $this->hogs = $hogs;
+ }
+ function CanHaveChildren() {
+ return false;
+ }
+
+
+ function copy_queue($interface, &$cflink) {
+ $cflink['interface'] = $interface;
+ $cflink['qlimit'] = $this->GetQlimit();
+ $cflink['priority'] = $this->GetQpriority();
+ $cflink['name'] = $this->GetQname();
+ $cflink['description'] = $this->GetDescription();
+ $cflink['bandwidth'] = $this->GetBandwidth();
+ $cflink['bandwidthtype'] = $this->GetBwscale();
+ $cflink['enabled'] = $this->GetEnabled();
+ $cflink['default'] = $this->GetDefault();
+ $cflink['red'] = $this->GetRed();
+ $cflink['rio'] = $this->GetRio();
+ $cflink['ecn'] = $this->GetEcn();
+ $cflink['buckets'] = $this->GetBuckets();
+ $cflink['hogs'] = $this->GetHogs();
+ }
+
+ /*
+ * Should search even its children
+ */
+ function &find_queue($interface, $qname) {
+ if ($qname == $this->GetQname()) {
+ return $this;
+ }
+ }
+
+ function find_parentqueue($interface, $qname) { return; }
+
+ function delete_queue() {
+ unref_on_altq_queue_list($this->GetQname());
+ cleanup_queue_from_rules($this->GetQname());
+ unset_object_by_reference($this->GetLink());
+ }
+
+ function validate_input($data, &$input_errors) {
+ parent::validate_input($data, $input_errors);
+
+ if ($data['priority'] > 255) {
+ $input_errors[] = gettext("Priority must be an integer between 1 and 255.");
+ }
+ $reqdfields[] = "bandwidth";
+ $reqdfieldsn[] = gettext("Bandwidth");
+ $reqdfields[] = "bandwidthtype";
+ $reqdfieldsn[] = gettext("Bandwidthtype");
+
+ shaper_do_input_validation($data, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($data['bandwidth'] && !is_numeric($data['bandwidth'])) {
+ $input_errors[] = gettext("Bandwidth must be an integer.");
+ }
+
+
+ if ($data['bandwidth'] < 0) {
+ $input_errors[] = gettext("Bandwidth cannot be negative.");
+ }
+
+
+ if ($data['bandwidthtype'] == "%") {
+ if ($data['bandwidth'] > 100 || $data['bandwidth'] < 0) {
+ $input_errors[] = gettext("Bandwidth in percentage should be between 1 and 100 bounds.");
+ }
+ }
+
+/*
+ $parent =& $this->GetParent();
+ switch ($data['bandwidthtype']) {
+ case "%":
+ $myBw = $parent->GetAvailableBandwidth() * floatval($data['bandwidth']) / 100;
+ default:
+ $mybw = floatval($data['bandwidth']) * get_bandwidthtype_scale($data['bandwidthtype']);
+ break;
+ }
+ if ($parent->GetAvailableBandwidth() < floatval($myBw)) {
+ $input_errors[] = "The sum of children bandwidth exceeds that of the parent.";
+ }
+*/
+ }
+
+ function ReadConfig(&$q) {
+ parent::ReadConfig($q);
+ if (!empty($q['buckets'])) {
+ $this->SetBuckets($q['buckets']);
+ } else {
+ $this->SetBuckets("");
+ }
+ if (!empty($q['hogs']) && is_valid_shaperbw($q['hogs'])) {
+ $this->SetHogs($q['hogs']);
+ } else {
+ $this->SetHogs("");
+ }
+ }
+
+ function build_javascript() {
+ return parent::build_javascript();
+ }
+
+ function build_tree() {
+ $tree = " <li><a href=\"firewall_shaper.php?interface=" .
+ $this->GetInterface()."&amp;queue=" . $this->GetQname()."&amp;action=show";
+ $tree .= "\" ";
+ $tmpvalue = trim($this->GetDefault());
+ if (!empty($tmpvalue)) {
+ $tree .= " class=\"navlnk\"";
+ }
+ $tree .= " >" . $this->GetQname() . "</a>";
+ $tree .= "</li>";
+ return $tree;
+ }
+
+ /* Even this should take children into consideration */
+ function build_rules(&$default = false) {
+ $pfq_rule = "queue ". $this->qname;
+ if ($this->GetInterface()) {
+ $pfq_rule .= " on ".get_real_interface($this->GetInterface());
+ }
+ if ($this->GetBandwidth() && $this->GetBwscale()) {
+ $pfq_rule .= " bandwidth ".trim($this->GetBandwidth()).$this->GetBwscale();
+ }
+ $tmpvalue = trim($this->GetQpriority());
+ if (!empty($tmpvalue)) {
+ $pfq_rule .= " priority " . $this->GetQpriority();
+ }
+ $tmpvalue = trim($this->GetQlimit());
+ if (!empty($tmpvalue)) {
+ $pfq_rule .= " qlimit " . $this->GetQlimit();
+ }
+ if ($this->GetDefault() || $this->GetRed() || $this->GetRio() ||
+ $this->GetEcn() || $this->GetBuckets() || $this->GetHogs() || $this->GetCodel()) {
+ $pfq_rule .= " fairq ( ";
+ $tmpvalue = trim($this->GetRed());
+ if (!empty($tmpvalue)) {
+ $comma = 1;
+ $pfq_rule .= " red ";
+ }
+ $tmpvalue = trim($this->GetCodel());
+ if (!empty($tmpvalue)) {
+ $comma = 1;
+ $pfq_rule .= " codel ";
+ }
+ $tmpvalue = trim($this->GetRio());
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " rio ";
+ }
+ $tmpvalue = trim($this->GetEcn());
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " ecn ";
+ }
+ $tmpvalue = trim($this->GetDefault());
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= " ,";
+ }
+ $comma = 1;
+ $pfq_rule .= " default ";
+ $default = true;
+ }
+ $tmpvalue = trim($this->GetBuckets());
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= ", ";
+ }
+ $pfq_rule .= " buckets " . $this->GetBuckets() . " ";
+ }
+ $tmpvalue = trim($this->GetHogs());
+ if (!empty($tmpvalue)) {
+ if ($comma) {
+ $pfq_rule .= ", ";
+ }
+ $pfq_rule .= " hogs " . $this->GetHogs() . " ";
+ }
+ $pfq_rule .= " ) ";
+ }
+
+ $pfq_rule .= " \n";
+ return $pfq_rule;
+ }
+
+ function build_form() {
+ $form = parent::build_form();
+ $form .= "<tr>";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth") . "</td>";
+ $form .= "<td class=\"vtable\"> <input name=\"bandwidth\" id=\"bandwidth\" class=\"formfld unknown\" value=\"";
+ if ($this->GetBandwidth() > 0) {
+ $form .= htmlspecialchars($this->GetBandwidth());
+ }
+ $form .= "\" />";
+ $form .= "<select name=\"bandwidthtype\" id=\"bandwidthtype\" class=\"formselect\">";
+ $form .= "<option value=\"Gb\"";
+ if ($this->GetBwscale() == "Gb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Gbit/s") . "</option>";
+ $form .= "<option value=\"Mb\"";
+ if ($this->GetBwscale() == "Mb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Mbit/s") . "</option>";
+ $form .= "<option value=\"Kb\"";
+ if ($this->GetBwscale() == "Kb") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Kbit/s") . "</option>";
+ $form .= "<option value=\"b\"";
+ if ($this->GetBwscale() == "b") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Bit/s") . "</option>";
+ $form .= "<option value=\"%\"";
+ if ($this->GetBwscale() == "%") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">%</option>";
+ $form .= "</select> <br />";
+ $form .= "<span class=\"vexpl\">" . gettext("Choose the amount of bandwidth for this queue");
+ $form .= "</span></td></tr>";
+ $form .= "<tr><td class=\"vncellreq\">" . gettext("Scheduler specific options") . "</td>";
+ $form .= "<td class=\"vtable\"><table><tr><td>";
+ $form .= "<input id=\"buckets\" name=\"buckets\" value=\"";
+ $tmpvalue = trim($this->GetBuckets());
+ if (!empty($tmpvalue)) {
+ $form .= $this->GetBuckets();
+ }
+ $form .= "\" /> " . gettext("Number of buckets available.") . "<br /></td></tr>";
+ $form .= "<tr><td class=\"vtable\"><input id=\"hogs\" name=\"hogs\" value=\"";
+ $tmpvalue = trim($this->GetHogs());
+ if (!empty($tmpvalue)) {
+ $form .= $this->GetHogs();
+ }
+ $form .= "\" /> " . gettext("Bandwidth limit for hosts to not saturate link.") . "<br /></td></tr>";
+ $form .= "</table></td></tr>";
+ return $form;
+ }
+
+ function update_altq_queue_data(&$data) {
+ $this->ReadConfig($data);
+ }
+
+ function wconfig() {
+ $cflink =& get_reference_to_me_in_config($this->GetLink());
+ if (!is_array($cflink)) {
+ $cflink = array();
+ }
+ $cflink['interface'] = $this->GetInterface();
+ $cflink['qlimit'] = trim($this->GetQlimit());
+ if (empty($cflink['qlimit'])) {
+ unset($cflink['qlimit']);
+ }
+ $cflink['priority'] = trim($this->GetQpriority());
+ if (empty($cflink['priority'])) {
+ unset($cflink['priority']);
+ }
+ $cflink['name'] = $this->GetQname();
+ $cflink['description'] = trim($this->GetDescription());
+ if (empty($cflink['description'])) {
+ unset($cflink['description']);
+ }
+ $cflink['bandwidth'] = $this->GetBandwidth();
+ $cflink['bandwidthtype'] = $this->GetBwscale();
+ $cflink['enabled'] = $this->GetEnabled();
+ if (empty($cflink['enabled'])) {
+ unset($cflink['enabled']);
+ }
+ $cflink['default'] = trim($this->GetDefault());
+ if (empty($cflink['default'])) {
+ unset($cflink['default']);
+ }
+ $cflink['red'] = trim($this->GetRed());
+ if (empty($cflink['red'])) {
+ unset($cflink['red']);
+ }
+ $cflink['rio'] = trim($this->GetRio());
+ if (empty($cflink['rio'])) {
+ unset($cflink['rio']);
+ }
+ $cflink['ecn'] = trim($this->GetEcn());
+ if (empty($cflink['ecn'])) {
+ unset($cflink['ecn']);
+ }
+ $cflink['codel'] = trim($this->GetCodel());
+ if (empty($cflink['codel'])) {
+ unset($cflink['codel']);
+ }
+ $cflink['buckets'] = trim($this->GetBuckets());
+ if (empty($cflink['buckets'])) {
+ unset($cflink['buckets']);
+ }
+ $cflink['hogs'] = trim($this->GetHogs());
+ if (empty($cflink['hogs'])) {
+ unset($cflink['hogs']);
+ }
+ }
+}
+
+
+/*
+ * dummynet(4) wrappers.
+ */
+
+
+/*
+ * List of respective objects!
+ */
+$dummynet_pipe_list = array();
+
+class dummynet_class {
+ var $qname;
+ var $qnumber; /* dummynet(4) uses numbers instead of names; maybe integrate with pf the same as altq does?! */
+ var $qlimit;
+ var $description;
+ var $qenabled;
+ var $link;
+ var $qparent; /* link to upper class so we do things easily on WF2Q+ rule creation */
+ var $plr;
+
+ var $buckets;
+ /* mask parameters */
+ var $mask;
+ var $noerror;
+
+ /* Accessor functions */
+ function SetLink($link) {
+ $this->link = $link;
+ }
+ function GetLink() {
+ return $this->link;
+ }
+ function GetMask() {
+ if (!isset($this->mask["type"])) {
+ $this->mask["type"] = "none";
+ }
+ return $this->mask;
+ }
+ function SetMask($mask) {
+ $this->mask = $mask;
+ }
+ function &GetParent() {
+ return $this->qparent;
+ }
+ function SetParent(&$parent) {
+ $this->qparent = &$parent;
+ }
+ function GetEnabled() {
+ return $this->qenabled;
+ }
+ function SetEnabled($value) {
+ $this->qenabled = $value;
+ }
+ function CanHaveChildren() {
+ return false;
+ }
+ function CanBeDeleted() {
+ return true;
+ }
+ function GetQname() {
+ return $this->qname;
+ }
+ function SetQname($name) {
+ $this->qname = trim($name);
+ }
+ function GetQlimit() {
+ return $this->qlimit;
+ }
+ function SetQlimit($limit) {
+ $this->qlimit = $limit;
+ }
+ function GetDescription() {
+ return $this->description;
+ }
+ function SetDescription($str) {
+ $this->description = trim($str);
+ }
+ function GetFirstime() {
+ return $this->firsttime;
+ }
+ function SetFirsttime($number) {
+ $this->firsttime = $number;
+ }
+ function GetBuckets() {
+ return $this->buckets;
+ }
+ function SetBuckets($buckets) {
+ $this->buckets = $buckets;
+ }
+ function SetNumber($number) {
+ $this->qnumber = $number;
+ }
+ function GetNumber() {
+ return $this->qnumber;
+ }
+ function GetPlr() {
+ return $this->plr;
+ }
+ function SetPlr($plr) {
+ $this->plr = $plr;
+ }
+
+ function build_javascript() {
+ $javascript .= "<script type=\"text/javascript\">\n";
+ $javascript .= "//<![CDATA[\n";
+ $javascript .= "function enable_maskbits(enable_over) {\n";
+ $javascript .= "var e = document.getElementById(\"mask\");\n";
+ $javascript .= "if ((e.options[e.selectedIndex].text == \"none\") || enable_over) {\n";
+ $javascript .= "document.iform.maskbits.disabled = 1;\n";
+ $javascript .= "document.iform.maskbits.value = \"\";\n";
+ $javascript .= "document.iform.maskbitsv6.disabled = 1;\n";
+ $javascript .= "document.iform.maskbitsv6.value = \"\";\n";
+ $javascript .= "} else {\n";
+ $javascript .= "document.iform.maskbits.disabled = 0;\n";
+ $javascript .= "document.iform.maskbitsv6.disabled = 0;\n";
+ $javascript .= "}}\n";
+ $javascript .= "//]]>\n";
+ $javascript .= "</script>\n";
+ return $javascript;
+ }
+
+ function validate_input($data, &$input_errors) {
+ $reqdfields[] = "bandwidth";
+ $reqdfieldsn[] = gettext("Bandwidth");
+ /*$reqdfields[] = "burst";
+ $reqdfieldsn[] = gettext("Burst"); */
+ $reqdfields[] = "bandwidthtype";
+ $reqdfieldsn[] = gettext("Bandwidthtype");
+ $reqdfields[] = "newname";
+ $reqdfieldsn[] = gettext("Name");
+
+ shaper_do_input_validation($data, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($data['plr'] && (!is_numeric($data['plr']) ||
+ ($data['plr'] < 0) || ($data['plr'] > 1))) {
+ $input_errors[] = gettext("Plr must be a value between 0 and 1.");
+ }
+ if ($data['buckets'] && (!is_numeric($data['buckets']) ||
+ ($data['buckets'] < 16) || ($data['buckets'] > 65535))) {
+ $input_errors[] = gettext("Buckets must be an integer between 16 and 65535.");
+ }
+ if ($data['qlimit'] && (!is_numeric($data['qlimit']))) {
+ $input_errors[] = gettext("Queue limit must be an integer");
+ }
+ if (!empty($data['newname']) && !preg_match("/^[a-zA-Z0-9_-]+$/", $data['newname'])) {
+ $input_errors[] = gettext("Queue names must be alphanumeric and _ or - only.");
+ }
+ if (!empty($data['name']) && !preg_match("/^[a-zA-Z0-9_-]+$/", $data['name'])) {
+ $input_errors[] = gettext("Queue names must be alphanumeric and _ or - only.");
+ }
+ if (isset($data['maskbits']) && ($data['maskbits'] <> "")) {
+ if ((!is_numeric($data['maskbits'])) || ($data['maskbits'] <= 0) || ($data['maskbits'] > 32)) {
+ $input_errors[] = gettext("IPV4 bit mask must be blank or numeric value between 1 and 32.");
+ }
+ }
+ if (isset($data['maskbitsv6']) && ($data['maskbitsv6'] <> "")) {
+ if ((!is_numeric($data['maskbitsv6'])) || ($data['maskbitsv6'] <= 0) || ($data['maskbitsv6'] > 128)) {
+ $input_errors[] = gettext("IPV6 bit mask must be blank or numeric value between 1 and 128.");
+ }
+ }
+ }
+
+ function build_mask_rules(&$pfq_rule) {
+ $mask = $this->GetMask();
+ if (!empty($mask['type'])) {
+ if ($mask['type'] <> 'none') {
+ $pfq_rule .= " mask";
+ }
+ switch ($mask['type']) {
+ case 'srcaddress':
+ if (!empty($mask['bitsv6']) && ($mask['bitsv6'] <> "")) {
+ $pfq_rule .= " src-ip6 /" . $mask['bitsv6'];
+ } else {
+ $pfq_rule .= " src-ip6 /128";
+ }
+ if (!empty($mask['bits']) && ($mask['bits'] <> "")) {
+ $pfq_rule .= sprintf(" src-ip 0x%x", gen_subnet_mask_long($mask['bits']));
+ } else {
+ $pfq_rule .= " src-ip 0xffffffff";
+ }
+ break;
+ case 'dstaddress':
+ if (!empty($mask['bitsv6']) && ($mask['bitsv6'] <> "")) {
+ $pfq_rule .= " dst-ip6 /" . $mask['bitsv6'];
+ } else {
+ $pfq_rule .= " dst-ip6 /128";
+ }
+ if (!empty($mask['bits']) && ($mask['bits'] <> "")) {
+ $pfq_rule .= sprintf(" dst-ip 0x%x", gen_subnet_mask_long($mask['bits']));
+ } else {
+ $pfq_rule .= " dst-ip 0xffffffff";
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+}
+
+class dnpipe_class extends dummynet_class {
+ var $delay;
+ var $qbandwidth = array();
+ var $qbandwidthtype;
+
+ /* This is here to help on form building and building rules/lists */
+ var $subqueues = array();
+
+ function CanHaveChildren() {
+ return true;
+ }
+ function SetDelay($delay) {
+ $this->delay = $delay;
+ }
+ function GetDelay() {
+ return $this->delay;
+ }
+ function delete_queue() {
+ cleanup_dnqueue_from_rules($this->GetQname());
+ foreach ($this->subqueues as $q) {
+ $q->delete_queue();
+ }
+ unset_dn_object_by_reference($this->GetLink());
+ @pfSense_pipe_action("pipe delete " . $this->GetNumber());
+ }
+ function GetBandwidth() {
+ return $this->qbandwidth;
+ }
+ function SetBandwidth($bandwidth) {
+ $this->qbandwidth = $bandwidth;
+ }
+ function GetBurst() {
+ return $this->qburst;
+ }
+ function SetBurst($burst) {
+ $this->qburst = $burst;
+ }
+
+ function &add_queue($interface, &$queue, &$path, &$input_errors) {
+
+ if (!is_array($this->subqueues)) {
+ $this->subqueues = array();
+ }
+
+ $q =& new dnqueue_class();
+ $q->SetLink($path);
+ $q->SetEnabled("on");
+ $q->SetPipe($this->GetQname());
+ $q->SetParent($this);
+ $q->ReadConfig($queue);
+ $q->validate_input($queue, $input_errors);
+ if (count($input_errors)) {
+ log_error("SHAPER: could not create queue " . $q->GetQname() . " on interface {$interface} because: " . print_r($input_errors, true));
+ return $q;
+ }
+ $number = dnqueue_find_nextnumber();
+ $q->SetNumber($number);
+ $this->subqueues[$q->GetQname()] = &$q;
+
+ return $q;
+ }
+
+ function &get_queue_list(&$q = null) {
+ $qlist = array();
+
+ $qlist[$this->GetQname()] = $this->GetNumber();
+ if (is_array($this->subqueues)) {
+ foreach ($this->subqueues as $queue) {
+ $queue->get_queue_list($qlist);
+ }
+ }
+ return $qlist;
+ }
+
+ /*
+ * Should search even its children
+ */
+ function &find_queue($pipe, $qname) {
+ if ($qname == $this->GetQname()) {
+ return $this;
+ }
+ foreach ($this->subqueues as $q) {
+ $result =& $q->find_queue("", $qname);
+ if ($result) {
+ return $result;
+ }
+ }
+ }
+
+ function &find_parentqueue($pipe, $qname) {
+ return NULL;
+ }
+
+ function validate_input($data, &$input_errors) {
+ parent::validate_input($data, $input_errors);
+
+ $schedule = 0;
+ $schedulenone = 0;
+ $entries = 0;
+ /* XXX: Really no better way? */
+ for ($i = 0; $i < 2900; $i++) {
+ if (!empty($data["bwsched{$i}"])) {
+ if ($data["bwsched{$i}"] != "none") {
+ $schedule++;
+ } else {
+ $schedulenone++;
+ }
+ }
+ if (!empty($data["bandwidth{$i}"])) {
+ if (!is_numeric($data["bandwidth{$i}"])) {
+ $input_errors[] = sprintf(gettext("Bandwidth for schedule %s must be an integer."), $data["bwsched{$i}"]);
+ } else if (($data["burst{$i}"] != "") && (!is_numeric($data["burst{$i}"]))) {
+ $input_errors[] = sprintf(gettext("Burst for schedule %s must be an integer."), $data["bwsched{$i}"]);
+ } else {
+ $entries++;
+ }
+ }
+ }
+ if ($schedule == 0 && $entries > 1) {
+ $input_errors[] = gettext("You need to specify a schedule for every additional entry");
+ }
+ if ($schedulenone > 0 && $entries > 1) {
+ $input_errors[] = gettext("If more than one bandwidth configured all schedules need to be selected");
+ }
+ if ($entries == 0) {
+ $input_errors[] = gettext("At least one bw specification is necessary");
+ }
+ if ($data['delay'] && (!is_numeric($data['delay']))) {
+ $input_errors[] = gettext("Delay must be an integer.");
+ }
+ }
+
+ function ReadConfig(&$q) {
+ if (!empty($q['name']) && !empty($q['newname']) && $q['name'] != $q['newname']) {
+ $this->SetQname($q['newname']);
+ } else if (!empty($q['newname'])) {
+ $this->SetQname($q['newname']);
+ } else {
+ $this->SetQname($q['name']);
+ }
+ $this->SetNumber($q['number']);
+
+ if (!empty($_POST)) {
+ $bandwidth = array();
+ /* XXX: Really no better way? */
+ for ($i = 0; $i < 2900; $i++) {
+ if (isset($q["bandwidth{$i}"]) && $q["bandwidth{$i}"] <> "") {
+ $bw = array();
+ $bw['bw'] = $q["bandwidth{$i}"];
+ $bw['burst'] = $q["burst{$i}"];
+ if (isset($q["bwtype{$i}"]) && $q["bwtype{$i}"]) {
+ $bw['bwscale'] = $q["bwtype{$i}"];
+ }
+ if (isset($q["bwsched{$i}"]) && $q["bwsched{$i}"]) {
+ $bw['bwsched'] = $q["bwsched{$i}"];
+ }
+ $bandwidth[] = $bw;
+ }
+ }
+ $this->SetBandwidth($bandwidth);
+ }
+
+ if (is_array($q['bandwidth']) && is_array($q['bandwidth']['item'])) {
+ $this->SetBandwidth($q['bandwidth']['item']);
+ $this->SetBurst($q['burst']['item']);
+ }
+
+ if (isset($q['qlimit']) && $q['qlimit'] <> "") {
+ $this->SetQlimit($q['qlimit']);
+ } else {
+ $this->SetQlimit("");
+ }
+ if (isset($q['mask']) && $q['mask'] <> "") {
+ $masktype = $q['mask'];
+ } else {
+ $masktype = "";
+ }
+ if (isset($q['maskbits']) && $q['maskbits'] <> "") {
+ $maskbits = $q['maskbits'];
+ } else {
+ $maskbits = "";
+ }
+ if (isset($q['maskbitsv6']) && $q['maskbitsv6'] <> "") {
+ $maskbitsv6 = $q['maskbitsv6'];
+ } else {
+ $maskbitsv6 = "";
+ }
+ $this->SetMask(array("type" => $masktype, "bits" => $maskbits, "bitsv6" => $maskbitsv6));
+ if (isset($q['buckets']) && $q['buckets'] <> "") {
+ $this->SetBuckets($q['buckets']);
+ } else {
+ $this->SetBuckets("");
+ }
+ if (isset($q['plr']) && $q['plr'] <> "") {
+ $this->SetPlr($q['plr']);
+ } else {
+ $this->SetPlr("");
+ }
+ if (isset($q['delay']) && $q['delay'] <> "") {
+ $this->SetDelay($q['delay']);
+ } else {
+ $this->SetDelay(0);
+ }
+ if (isset($q['description']) && $q['description'] <> "") {
+ $this->SetDescription($q['description']);
+ } else {
+ $this->SetDescription("");
+ }
+ $this->SetEnabled($q['enabled']);
+
+ }
+
+ function build_tree() {
+ $tree = " <li><a href=\"firewall_shaper_vinterface.php?pipe=" . $this->GetQname() ."&amp;queue=".$this->GetQname() ."&amp;action=show\">";
+ $tree .= $this->GetQname() . "</a>";
+ if (is_array($this->subqueues)) {
+ $tree .= "<ul>";
+ foreach ($this->subqueues as $q) {
+ $tree .= $q->build_tree();
+ }
+ $tree .= "</ul>";
+ }
+ $tree .= "</li>";
+
+ return $tree;
+ }
+
+ function build_rules() {
+ global $config, $time_based_rules;
+
+ if ($this->GetEnabled() == "") {
+ return;
+ }
+
+ $pfq_rule = "\npipe ". $this->GetNumber() . " config ";
+ $found = false;
+ $bandwidth = $this->GetBandwidth();
+ if (is_array($bandwidth)) {
+ foreach ($bandwidth as $bw) {
+ if ($bw['bwsched'] != "none") {
+ $time_based_rules = true;
+ if (is_array($config['schedules']) && is_array($config['schedules']['schedule'])) {
+ foreach ($config['schedules']['schedule'] as $schedule) {
+ if ($bw['bwsched'] == $schedule['name']) {
+ if (filter_get_time_based_rule_status($schedule)) {
+ $pfq_rule .= " bw ".trim($bw['bw']).$bw['bwscale'];
+ if (is_numeric($bw['burst']) && ($bw['burst'] > 0)) {
+ $pfq_rule .= " burst ".trim($bw['burst']);
+ }
+ $found = true;
+ break;
+ }
+ }
+ }
+ } else {
+ $pfq_rule .= " bw 0";
+ $found = true;
+ break;
+ }
+ } else {
+ $pfq_rule .= " bw ".trim($bw['bw']).$bw['bwscale'];
+ if (is_numeric($bw['burst']) && ($bw['burst'] > 0)) {
+ $pfq_rule .= " burst ".trim($bw['burst']);
+ }
+ $found = true;
+ break;
+ }
+ }
+ if ($found == false) {
+ $pfq_rule .= " bw 0";
+ }
+ } else {
+ $pfq_rule .= " bw 0";
+ }
+
+ if ($this->GetQlimit()) {
+ $pfq_rule .= " queue " . $this->GetQlimit();
+ }
+ if ($this->GetPlr()) {
+ $pfq_rule .= " plr " . $this->GetPlr();
+ }
+ if ($this->GetBuckets()) {
+ $pfq_rule .= " buckets " . $this->GetBuckets();
+ }
+ if ($this->GetDelay()) {
+ $pfq_rule .= " delay " . $this->GetDelay();
+ }
+ $this->build_mask_rules($pfq_rule);
+
+ $pfq_rule .= "\n";
+
+ if (!empty($this->subqueues) && count($this->subqueues) > 0) {
+ foreach ($this->subqueues as $q) {
+ $pfq_rule .= $q->build_rules();
+ }
+ }
+ $pfq_rule .= " \n";
+
+ return $pfq_rule;
+ }
+
+ function update_dn_data(&$data) {
+ $this->ReadConfig($data);
+ }
+
+ function build_javascript() {
+ global $g, $config;
+
+ $javasr = parent::build_javascript();
+
+ //build list of schedules
+ $schedules = "<option value='none'>none</option>";
+ if (is_array($config['schedules']) && is_array($config['schedules']['schedule'])) {
+ foreach ($config['schedules']['schedule'] as $schedule) {
+ if ($schedule['name'] <> "") {
+ $schedules .= "<option value='{$schedule['name']}'>{$schedule['name']}</option>";
+ }
+ }
+ }
+ $bwopt = "";
+ foreach (array("Kb" => "Kbit/s", "Mb" => "Mbit/s", "Gb" => "Gbit/s", "b" => "Bit/s") as $bwidx => $bw) {
+ $bwopt .= "<option value='{$bwidx}'>{$bw}</option>";
+ }
+
+ $javasr .= <<<EOD
+<script type='text/javascript'>
+//<![CDATA[
+var addBwRowTo = (function() {
+ return (function (tableId) {
+ var d, tbody, tr, td;
+ d = document;
+ tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
+ tr = d.createElement("tr");
+ td = d.createElement("td");
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='bandwidth_row-" + totalrows + "' /><input size='10' type='text' class='formfld unknown' name='bandwidth" + totalrows + "' id='bandwidth" + totalrows + "' />";
+ tr.appendChild(td);
+ //td = d.createElement("td");
+ //td.innerHTML="<input type='hidden' value='" + totalrows +"' name='burst_row-" + totalrows + "' /><input size='10' type='text' class='formfld unknown' name='burst" + totalrows + "' id='burst" + totalrows + "' />";
+ //tr.appendChild(td);
+ td = d.createElement("td");
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='bwtype_row-" + totalrows + "' /><select class='formselect' name='bwtype" + totalrows + "'>{$bwopt}</select>";
+ tr.appendChild(td);
+ td = d.createElement("td");
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='bwsched_row-" + totalrows + "' /><select class='formselect' name='bwsched" + totalrows + "'>{$schedules}</select>";
+ tr.appendChild(td);
+ td = d.createElement("td");
+ td.rowSpan = "1";
+ td.innerHTML = '<a onclick="removeBwRow(this); return false;" href="#"><img border="0" src="/themes/{$g['theme']}/images/icons/icon_x.gif" alt="remove" /></a>';
+ tr.appendChild(td);
+ tbody.appendChild(tr);
+ totalrows++;
+ });
+})();
+
+function removeBwRow(el) {
+ var cel;
+ while (el && el.nodeName.toLowerCase() != "tr") {
+ el = el.parentNode;
+ if (el && el.parentNode) {
+ cel = el.getElementsByTagName("td").item(0);
+ el.parentNode.removeChild(el);
+ }
+ }
+}
+//]]>
+</script>
+
+EOD;
+
+ return $javasr;
+ }
+
+ function build_form() {
+ global $g, $config;
+
+ //build list of schedules
+ $schedules = array();
+ $schedules[] = "none";//leave none to leave rule enabled all the time
+ if (is_array($config['schedules']) && is_array($config['schedules']['schedule'])) {
+ foreach ($config['schedules']['schedule'] as $schedule) {
+ if ($schedule['name'] <> "") {
+ $schedules[] = $schedule['name'];
+ }
+ }
+ }
+
+ $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
+ $form .= gettext("Enable");
+ $form .= "</td><td class=\"vncellreq\">";
+ $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\"";
+ if ($this->GetEnabled() == "on") {
+ $form .= " checked=\"checked\"";
+ }
+ $form .= " /><span class=\"vexpl\"> " . gettext("Enable limiter and its children") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\"><br /><span class=\"vexpl\">" . gettext("Name") . "</span></td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"newname\" name=\"newname\" value=\"";
+ $form .= $this->GetQname()."\" />";
+ $form .= "<input type=\"hidden\" id=\"name\" name=\"name\" value=\"";
+ $form .= $this->GetQname()."\" />";
+ if ($this->GetNumber() > 0) {
+ $form .= "<input type=\"hidden\" id=\"number\" name=\"number\" value=\"";
+ $form .= $this->GetNumber()."\" />";
+ }
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Bandwidth");
+ $bandwidth = $this->GetBandwidth();
+ $form .= "</td><td class=\"vncellreq\">";
+ $form .= "<table id='maintable'>";
+ $form .= "<tbody><tr>";
+ $form .= "<td width='35%'><div id='onecolumn'>Bandwidth</div></td>";
+ //$form .= "<td width='35%'><div id='fifthcolumn'>Burst</div></td>";
+ $form .= "<td width='20%'><div id='twocolumn'>Bw type</div></td>";
+ $form .= "<td width='35%' ><div id='thirdcolumn'>Schedule</div></td>";
+ $form .= "<td width='5%'><div id='fourthcolumn'></div></td>";
+ $form .= "</tr>";
+ if (is_array($bandwidth)) {
+ foreach ($bandwidth as $bwidx => $bw) {
+ $form .= "\n<tr><td width='40%'>";
+ $form .= "<input class='formfld unknown' size='10' type=\"text\" id=\"bandwidth{$bwidx}\" name=\"bandwidth{$bwidx}\" value=\"{$bw['bw']}\" />";
+ //$form .= "</td><td width='20%'>";
+ //$form .= "<input class='formfld unknown' size='10' type=\"text\" id=\"burst{$bwidx}\" name=\"burst{$bwidx}\" value=\"{$bw['burst']}\" />";
+ $form .= "</td><td width='20%'>";
+ $form .= "<select id=\"bwtype{$bwidx}\" name=\"bwtype{$bwidx}\" class=\"formselect\">";
+ foreach (array("Kb" => "Kbit/s", "Mb" => "Mbit/s", "Gb" => "Gbit/s", "b" => "Bit/s") as $bwsidx => $bwscale) {
+ $form .= "<option value=\"{$bwsidx}\"";
+ if ($bw['bwscale'] == $bwsidx) {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">{$bwscale}</option>";
+ }
+ $form .= "</select>";
+ $form .= "</td><td width='35%' >";
+ $form .= "<select id=\"bwsched{$bwidx}\" name=\"bwsched{$bwidx}\" class=\"formselect\">";
+ foreach ($schedules as $schd) {
+ $selected = "";
+ if ($bw['bwsched'] == $schd) {
+ $selected = "selected=\"selected\"";
+ }
+ $form .= "<option value='{$schd}' {$selected}>{$schd}</option>";
+ }
+ $form .= "</select>";
+ $form .= "</td><td width='5%' >";
+ $form .= "<a onclick=\"removeBwRow(this); return false;\" href='#'><img border='0' src='/themes/{$g['theme']}/images/icons/icon_x.gif' alt='remove' /></a>";
+ $form .= "</td></tr>";
+ }
+ }
+ $form .= "</tbody></table>";
+ $form .= "<a onclick=\"javascript:addBwRowTo('maintable'); return false;\" href='#'>";
+ $form .= "<img border='0' src='/themes/{$g['theme']}/images/icons/icon_plus.gif' alt='add' title='" . gettext("add another schedule") . "' /></a>";
+ //$form .= "<br /><span class=\"vexpl\">" . gettext("Bandwidth is a rate (e.g. Mbit/s), burst is a total amount of data that will be transferred at full speed after an idle period.") . "</span><br />";
+ $form .= "<br /><span class=\"vexpl\">" . gettext("Bandwidth is the rate (e.g. Mbit/s) to which traffic in this limiter will be restricted.") . "</span><br />";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Mask") . "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<select name=\"mask\" id=\"mask\" class=\"formselect\" onchange=\"enable_maskbits();\" >";
+ $form .= "<option value=\"none\"";
+ $mask = $this->GetMask();
+ if ($mask['type'] == "none") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">none</option>";
+ $form .= "<option value=\"srcaddress\"";
+ if ($mask['type'] == "srcaddress") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Source addresses") . "</option>";
+ $form .= "<option value=\"dstaddress\"";
+ if ($mask['type'] == "dstaddress") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Destination addresses") . "</option>";
+ $form .= "</select>";
+ $form .= "&nbsp;<br />";
+ $form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n"
+ . "a dynamic pipe with the bandwidth, delay, packet loss and queue size given above will \n"
+ . "be created for each source/destination IP address encountered, \n"
+ . "respectively. This makes it possible to easily specify bandwidth \n"
+ . "limits per host.") . "</span><br />";
+ $form .= "255.255.255.255/&nbsp;<input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbits\" name=\"maskbits\" value=\"";
+ if ($mask['type'] <> "none") {
+ $form .= $mask['bits'];
+ }
+ $form .= "\"";
+ if ($mask['type'] == "none") {
+ $form .= " disabled";
+ }
+ $form .= " />";
+ $form .= "&nbsp; IPV4 mask bits (1-32)<br />";
+ $form .= "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/&nbsp;<input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbitsv6\" name=\"maskbitsv6\" value=\"";
+ if ($mask['type'] <> "none") {
+ $form .= $mask['bitsv6'];
+ }
+ $form .= "\"";
+ if ($mask['type'] == "none") {
+ $form .= " disabled";
+ }
+ $form .= " />";
+ $form .= "&nbsp; IPV6 mask bits (1-128)<br />";
+ $form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n"
+ . "leaving the mask bits blank will create one pipe per host. Otherwise specify \n"
+ . "the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+ . "per pipe.") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Description") . "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" class=\"formfld unknown\" size=\"40\" id=\"description\" name=\"description\" value=\"";
+ $form .= htmlspecialchars($this->GetDescription());
+ $form .= "\" />";
+ $form .= "<br /> <span class=\"vexpl\">";
+ $form .= gettext("You may enter a description here for your reference (not parsed).") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr id=\"sprtable4\">";
+ $form .= "<td></td>";
+ $form .= "<td><div id=\"showadvancedboxspr\">";
+ $form .= "<p><input type=\"button\" onclick=\"show_source_port_range()\"";
+ $form .= " value=\"" . gettext("Show advanced options") . "\" />";
+ $form .= "</p></div></td></tr>";
+ $form .= "<tr style=\"display:none\" id=\"sprtable\">";
+
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Delay") . "</td>";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">";
+ $form .= "<input name=\"delay\" type=\"text\" id=\"delay\" size=\"5\" value=\"";
+ $form .= $this->GetDelay() . "\" />";
+ $form .= "&nbsp;ms<br /> <span class=\"vexpl\">" . gettext("Hint: in most cases, you "
+ . "should specify 0 here (or leave the field empty)") . "</span><br />";
+ $form .= "</td></tr>";
+ $form .= "<tr style=\"display:none\" id=\"sprtable1\">";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Packet loss rate") . "</td>";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">";
+ $form .= "<input name=\"plr\" type=\"text\" id=\"plr\" size=\"5\" value=\"";
+ $form .= $this->GetPlr() . "\" />";
+ $form .= "&nbsp;<br /> <span class=\"vexpl\">" . gettext("Hint: in most cases, you "
+ . "should specify 0 here (or leave the field empty). "
+ . "A value of 0.001 means one packet in 1000 gets dropped") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr style=\"display:none\" id=\"sprtable2\">";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Queue Size") . "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"qlimit\" name=\"qlimit\" value=\"";
+ $form .= $this->GetQlimit() . "\" />";
+ $form .= "&nbsp;slots<br />";
+ $form .= "<span class=\"vexpl\">" . gettext("Hint: in most cases, you "
+ . "should leave the field empty. All packets in this pipe are placed into a fixed-size queue first, "
+ . "then they are delayed by value specified in the Delay field, and then they "
+ . "are delivered to their destination.") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr style=\"display:none\" id=\"sprtable5\">";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bucket Size") . "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"buckets\" name=\"buckets\" value=\"";
+ $form .= $this->GetBuckets() . "\" />";
+ $form .= "&nbsp;slots<br />";
+ $form .= "<span class=\"vexpl\">" . gettext("Hint: in most cases, you "
+ . "should leave the field empty. It increases the hash size set.");
+ $form .= "</span></td></tr>";
+
+ return $form;
+
+ }
+
+ function wconfig() {
+ $cflink =& get_dn_reference_to_me_in_config($this->GetLink());
+ if (!is_array($cflink)) {
+ $cflink = array();
+ }
+ $cflink['name'] = $this->GetQname();
+ $cflink['number'] = $this->GetNumber();
+ $cflink['qlimit'] = $this->GetQlimit();
+ $cflink['plr'] = $this->GetPlr();
+ $cflink['description'] = $this->GetDescription();
+
+ $bandwidth = $this->GetBandwidth();
+ if (is_array($bandwidth)) {
+ $cflink['bandwidth'] = array();
+ $cflink['bandwidth']['item'] = array();
+ foreach ($bandwidth as $bwidx => $bw) {
+ $cflink['bandwidth']['item'][] = $bw;
+ }
+ }
+
+ $cflink['enabled'] = $this->GetEnabled();
+ $cflink['buckets'] = $this->GetBuckets();
+ $mask = $this->GetMask();
+ $cflink['mask'] = $mask['type'];
+ $cflink['maskbits'] = $mask['bits'];
+ $cflink['maskbitsv6'] = $mask['bitsv6'];
+ $cflink['delay'] = $this->GetDelay();
+ }
+
+}
+
+class dnqueue_class extends dummynet_class {
+ var $pipeparent;
+ var $weight;
+
+ function GetWeight() {
+ return $this->weight;
+ }
+ function SetWeight($weight) {
+ $this->weight = $weight;
+ }
+ function GetPipe() {
+ return $this->pipeparent;
+ }
+ function SetPipe($pipe) {
+ $this->pipeparent = $pipe;
+ }
+
+ /* Just a stub in case we ever try to call this from the frontend. */
+ function &add_queue($interface, &$queue, &$path, &$input_errors) {
+ return;
+ }
+
+ function delete_queue() {
+ cleanup_dnqueue_from_rules($this->GetQname());
+ unset_dn_object_by_reference($this->GetLink());
+ @pfSense_pipe_action("queue delete " . $this->GetNumber());
+ }
+
+ function validate_input($data, &$input_errors) {
+ parent::validate_input($data, $input_errors);
+
+ if ($data['weight'] && ((!is_numeric($data['weight'])) ||
+ ($data['weight'] < 1 && $data['weight'] > 100))) {
+ $input_errors[] = gettext("Weight must be an integer between 1 and 100.");
+ }
+ }
+
+ /*
+ * Should search even its children
+ */
+ function &find_queue($pipe, $qname) {
+ if ($qname == $this->GetQname()) {
+ return $this;
+ } else {
+ return NULL;
+ }
+ }
+
+ function &find_parentqueue($pipe, $qname) {
+ return $this->qparent;
+ }
+
+ function &get_queue_list(&$qlist) {
+ if ($this->GetEnabled() == "") {
+ return;
+ }
+ $qlist[$this->GetQname()] = "?" .$this->GetNumber();
+ }
+
+ function ReadConfig(&$q) {
+ if (!empty($q['name']) && !empty($q['newname']) && $q['name'] != $q['newname']) {
+ $this->SetQname($q['newname']);
+ } else if (!empty($q['newname'])) {
+ $this->SetQname($q['newname']);
+ } else {
+ $this->SetQname($q['name']);
+ }
+ $this->SetNumber($q['number']);
+ if (isset($q['qlimit']) && $q['qlimit'] <> "") {
+ $this->SetQlimit($q['qlimit']);
+ } else {
+ $this->SetQlimit("");
+ }
+ if (isset($q['mask']) && $q['mask'] <> "") {
+ $masktype = $q['mask'];
+ } else {
+ $masktype = "";
+ }
+ if (isset($q['maskbits']) && $q['maskbits'] <> "") {
+ $maskbits = $q['maskbits'];
+ } else {
+ $maskbits = "";
+ }
+ if (isset($q['maskbitsv6']) && $q['maskbitsv6'] <> "") {
+ $maskbitsv6 = $q['maskbitsv6'];
+ } else {
+ $maskbitsv6 = "";
+ }
+ $this->SetMask(array("type" => $masktype, "bits" => $maskbits, "bitsv6" => $maskbitsv6));
+ if (isset($q['buckets']) && $q['buckets'] <> "") {
+ $this->SetBuckets($q['buckets']);
+ } else {
+ $this->SetBuckets("");
+ }
+ if (isset($q['plr']) && $q['plr'] <> "") {
+ $this->SetPlr($q['plr']);
+ } else {
+ $this->SetPlr("");
+ }
+ if (isset($q['weight']) && $q['weight'] <> "") {
+ $this->SetWeight($q['weight']);
+ } else {
+ $this->SetWeight("");
+ }
+ if (isset($q['description']) && $q['description'] <> "") {
+ $this->SetDescription($q['description']);
+ } else {
+ $this->SetDescription("");
+ }
+ $this->SetEnabled($q['enabled']);
+ }
+
+ function build_tree() {
+ $parent =& $this->GetParent();
+ $tree = " <li><a href=\"firewall_shaper_vinterface.php?pipe=" . $parent->GetQname() ."&amp;queue=" . $this->GetQname() ."&amp;action=show\">";
+ $tree .= $this->GetQname() . "</a>";
+ $tree .= "</li>";
+
+ return $tree;
+ }
+
+ function build_rules() {
+ if ($this->GetEnabled() == "") {
+ return;
+ }
+
+ $parent =& $this->GetParent();
+ $pfq_rule = "queue ". $this->GetNumber() . " config pipe " . $parent->GetNumber();
+ if ($this->GetQlimit()) {
+ $pfq_rule .= " queue " . $this->GetQlimit();
+ }
+ if ($this->GetWeight()) {
+ $pfq_rule .= " weight " . $this->GetWeight();
+ }
+ if ($this->GetBuckets()) {
+ $pfq_rule .= " buckets " . $this->GetBuckets();
+ }
+ $this->build_mask_rules($pfq_rule);
+ $pfq_rule .= "\n";
+
+ return $pfq_rule;
+ }
+
+ function build_javascript() {
+ return parent::build_javascript();
+ }
+
+
+ function build_form() {
+ $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
+ $form .= gettext("Enable/Disable");
+ $form .= "</td><td class=\"vncellreq\">";
+ $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\"";
+ if ($this->GetEnabled() == "on") {
+ $form .= " checked=\"checked\"";
+ }
+ $form .= " /><span class=\"vexpl\"> " . gettext("Enable/Disable queue") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\"><br /><span class=\"vexpl\">" . gettext("Name") . "</span></td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"newname\" name=\"newname\" value=\"";
+ $form .= $this->GetQname()."\" />";
+ $form .= "<input type=\"hidden\" id=\"name\" name=\"name\" value=\"";
+ $form .= $this->GetQname()."\" />";
+ if ($this->GetNumber() > 0) {
+ $form .= "<input type=\"hidden\" id=\"number\" name=\"number\" value=\"";
+ $form .= $this->GetNumber()."\" />";
+ }
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Mask") . "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<select name=\"mask\" id=\"mask\" class=\"formselect\" onchange=\"enable_maskbits();\" >";
+ $form .= "<option value=\"none\"";
+ $mask = $this->GetMask();
+ if ($mask['type'] == "none") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("none") . "</option>";
+ $form .= "<option value=\"srcaddress\"";
+ if ($mask['type'] == "srcaddress") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Source addresses") . "</option>";
+ $form .= "<option value=\"dstaddress\"";
+ if ($mask['type'] == "dstaddress") {
+ $form .= " selected=\"selected\"";
+ }
+ $form .= ">" . gettext("Destination addresses") . "</option>";
+ $form .= "</select>";
+ $form .= "&nbsp;slots<br />";
+ $form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n"
+ . "a dynamic pipe with the bandwidth, delay, packet loss and queue size given above will \n"
+ . "be created for each source/destination IP address encountered, \n"
+ . "respectively. This makes it possible to easily specify bandwidth \n"
+ . "limits per host.") . "</span><br />";
+ $form .= "255.255.255.255/&nbsp;<input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbits\" name=\"maskbits\" value=\"";
+ if ($mask['type'] <> "none") {
+ $form .= $mask['bits'];
+ }
+ $form .= "\"";
+ if ($mask['type'] == "none") {
+ $form .= " disabled";
+ }
+ $form .= " />";
+ $form .= "&nbsp; IPV4 mask bits (1-32)<br />";
+ $form .= "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/&nbsp;<input type=\"text\" class=\"formfld unknown\" size=\"2\" id=\"maskbitsv6\" name=\"maskbitsv6\" value=\"";
+ if ($mask['type'] <> "none") {
+ $form .= $mask['bitsv6'];
+ }
+ $form .= "\"";
+ if ($mask['type'] == "none") {
+ $form .= " disabled";
+ }
+ $form .= " />";
+ $form .= "&nbsp; IPV6 mask bits (1-128)<br />";
+ $form .= "<span class=\"vexpl\">" . gettext("If 'source' or 'destination' slots is chosen, \n"
+ . "leaving the mask bits blank will create one pipe per host. Otherwise specify \n"
+ . "the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+ . "per queue.") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Description") . "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"description\" class=\"formfld unknown\" size=\"40\" name=\"description\" value=\"";
+ $form .= htmlspecialchars($this->GetDescription());
+ $form .= "\" />";
+ $form .= "<br /> <span class=\"vexpl\">";
+ $form .= gettext("You may enter a description here for your reference (not parsed).") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr id=\"sprtable4\">";
+ $form .= "<td></td>";
+ $form .= "<td><div id=\"showadvancedboxspr\">";
+ $form .= "<p><input type=\"button\" onclick=\"show_source_port_range()\"";
+ $form .= " value=\"" . gettext("Show advanced options") . "\" />";
+ $form .= "</p></div></td></tr>";
+ $form .= "<tr style=\"display:none\" id=\"sprtable\">";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Weight") . "</td>";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">";
+ $form .= "<input name=\"weight\" type=\"text\" id=\"weight\" size=\"5\" value=\"";
+ $form .= $this->GetWeight() . "\" />";
+ $form .= "&nbsp;<br /> <span class=\"vexpl\">" . gettext("Hint: For queues under the same parent "
+ . "this specifies the share that a queue gets(values range from 1 to 100, you can leave it blank otherwise)") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr style=\"display:none\" id=\"sprtable1\">";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Packet loss rate") . "</td>";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">";
+ $form .= "<input name=\"plr\" type=\"text\" id=\"plr\" size=\"5\" value=\"";
+ $form .= $this->GetPlr() . "\" />";
+ $form .= "&nbsp;<br /> <span class=\"vexpl\">" . gettext("Hint: in most cases, you "
+ . "should specify 0 here (or leave the field empty). "
+ . "A value of 0.001 means one packet in 1000 gets dropped") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr style=\"display:none\" id=\"sprtable2\">";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Queue Size") . "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"qlimit\" name=\"qlimit\" value=\"";
+ $form .= $this->GetQlimit() . "\" />";
+ $form .= "&nbsp;slots<br />";
+ $form .= "<span class=\"vexpl\">" . gettext("Hint: in most cases, you "
+ . "should leave the field empty. All packets in this pipe are placed into a fixed-size queue first, "
+ . "then they are delayed by value specified in the Delay field, and then they "
+ . "are delivered to their destination.") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr style=\"display:none\" id=\"sprtable5\">";
+ $form .= "<td valign=\"middle\" class=\"vncellreq\">" . gettext("Bucket Size") . "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"buckets\" name=\"buckets\" value=\"";
+ $form .= $this->GetBuckets() . "\" />";
+ $form .= "&nbsp;" . gettext("slots") . "<br />";
+ $form .= "<span class=\"vexpl\">" . gettext("Hint: in most cases, you "
+ . "should leave the field empty. It increases the hash size set.");
+ $form .= "</span></td></tr>";
+
+ $form .= "<input type=\"hidden\" id=\"pipe\" name=\"pipe\"";
+ $form .= " value=\"" . $this->GetPipe() . "\" />";
+
+ return $form;
+
+ }
+
+ function update_dn_data(&$data) {
+ $this->ReadConfig($data);
+ }
+
+ function wconfig() {
+ $cflink =& get_dn_reference_to_me_in_config($this->GetLink());
+ if (!is_array($cflink)) {
+ $cflink = array();
+ }
+ $cflink['name'] = $this->GetQname();
+ $cflink['number'] = $this->GetNumber();
+ $cflink['qlimit'] = $this->GetQlimit();
+ $cflink['description'] = $this->GetDescription();
+ $cflink['weight'] = $this->GetWeight();
+ $cflink['enabled'] = $this->GetEnabled();
+ $cflink['buckets'] = $this->GetBuckets();
+ $mask = $this->GetMask();
+ $cflink['mask'] = $mask['type'];
+ $cflink['maskbits'] = $mask['bits'];
+ $cflink['maskbitsv6'] = $mask['bitsv6'];
+ }
+}
+
+// List of layer7 objects
+$layer7_rules_list = array();
+
+class layer7 {
+
+ var $rname; //alias
+ var $rdescription; //alias description
+ var $rport; //divert port
+ var $renabled; //rule enabled
+ var $rsets = array(); //array of l7 associations
+
+ // Auxiliary functions
+
+ function GetRName() {
+ return $this->rname;
+ }
+ function SetRName($rname) {
+ $this->rname = $rname;
+ }
+ function GetRDescription() {
+ return $this->rdescription;
+ }
+ function SetRDescription($rdescription) {
+ $this->rdescription = $rdescription;
+ }
+ function GetRPort() {
+ return $this->rport;
+ }
+ function SetRPort($rport) {
+ $this->rport = $rport;
+ }
+ function GetREnabled() {
+ return $this->renabled;
+ }
+ function SetREnabled($value) {
+ $this->renabled = $value;
+ }
+ function GetRl7() {
+ return $this->rsets;
+ }
+ function SetRl7($rsets) {
+ $this->rsets = $rsets;
+ }
+
+ //Add a tuple (rule,structure,element) to the $rsets
+
+ function add_rule($l7set) {
+ $this->rsets[] = $l7set;
+ }
+
+ // Build the layer7 rules
+ function build_l7_rules() {
+ if ($this->GetREnabled() == "") {
+ return;
+ }
+ //$l7rules = "#" . $this->rdescription . "\n";
+ foreach ($this->rsets as $rl7) {
+ $l7rules .= $rl7->build_rules();
+ }
+ return $l7rules;
+ }
+
+ // Read the config from array
+ function ReadConfig(&$qname, &$q) {
+ $this->SetRName($qname);
+ $this->SetREnabled($q['enabled']);
+ $this->SetRPort($q['divert_port']);
+ if (isset($q['description']) && $q['description'] <> "") {
+ $this->SetRDescription($q['description']);
+ }
+ $rsets = $q['l7rules'];
+ //Put individual rules in the array
+ if (is_array($rsets)) {
+ $this->rsets = array(); // XXX: ugly hack
+ foreach ($rsets as $l7r) {
+ $l7obj = new l7rule();
+ $l7obj->SetRProtocol($l7r['protocol']);
+ $l7obj->SetRStructure($l7r['structure']);
+ $l7obj->SetRBehaviour($l7r['behaviour']);
+ $this->add_rule($l7obj);
+ }
+ }
+ }
+
+ //Generate a random port for the divert socket
+ function gen_divert_port() {
+ $dports = get_divert_ports(); //array of used ports
+ $divert_port = 1; // Initialize
+ while (($divert_port % 2) != 0 || in_array($divert_port, $dports)) {
+ $divert_port = rand(40000, 60000);
+ }
+ return $divert_port;
+ }
+
+ //Helps building the left tree
+ function build_tree() {
+ $tree = " <li><a href=\"firewall_shaper_layer7.php?container=" . $this->GetRName() ."&amp;action=show\">";
+ $tree .= $this->GetRName() . "</a>";
+ $tree .= "</li>";
+
+ return $tree;
+ }
+
+ function build_form() {
+ $form = "<tr><td valign=\"middle\" class=\"vncellreq\"><br />";
+ $form .= gettext("Enable/Disable");
+ $form .= "</td><td class=\"vncellreq\">";
+ $form .= " <input type=\"checkbox\" id=\"enabled\" name=\"enabled\" value=\"on\" ";
+ if ($this->GetREnabled() == "on") {
+ $form .= "checked=\"checked\"";
+ }
+ $form .= " /><span class=\"vexpl\"> " . gettext("Enable/Disable layer7 Container") . "</span>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\"><br /><span class=\"vexpl\">" . gettext("Name") . "</span></td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" id=\"container\" name=\"container\" value=\"";
+ $form .= $this->GetRName()."\" />";
+ $form .= "</td></tr>";
+ $form .= "<tr><td valign=\"middle\" class=\"vncellreq\">" . gettext("Description") . "</td>";
+ $form .= "<td class=\"vncellreq\">";
+ $form .= "<input type=\"text\" class=\"formfld unknown\" size=\"40\" id=\"description\" name=\"description\" value=\"";
+ $form .= htmlspecialchars($this->GetRDescription());
+ $form .= "\" />";
+ $form .= "<br /> <span class=\"vexpl\">";
+ $form .= gettext("You may enter a description here for your reference (not parsed).") . "</span>";
+ $form .= "</td></tr>";
+
+ return $form;
+ }
+
+ //Write the setting to the $config array
+ function wconfig() {
+ global $config;
+
+ if (!is_array($config['l7shaper']['container'])) {
+ $config['l7shaper']['container'] = array();
+ }
+ //
+ $cflink =& get_l7c_reference_to_me_in_config($this->GetRName());
+ // Test if this rule exists already
+ if (!$cflink) {
+ $cflink =& $config['l7shaper']['container'][];
+ }
+ $cflink['name'] = $this->GetRName();
+ $cflink['enabled'] = $this->GetREnabled();
+ $cflink['description'] = $this->GetRDescription();
+ $cflink['divert_port'] = $this->GetRPort();
+
+ // Destroy previously existent rules
+ if (is_array($cflink['rules'])) {
+ unset($cflink['l7rules']);
+ }
+
+ $cflink['l7rules'] = array();
+
+ $i = 0;
+ foreach ($this->rsets as $rulel7) {
+ $cflink['l7rules'][$i]['protocol'] = $rulel7->GetRProtocol();
+ $cflink['l7rules'][$i]['structure'] = $rulel7->GetRStructure();
+ $cflink['l7rules'][$i]['behaviour'] = $rulel7->GetRBehaviour();
+ $i++;
+ }
+ }
+
+ //This function is necessary to help producing the overload options for keep state
+ function get_unique_structures() {
+
+ $unique_structures = array("action" => false, "dummynet" => false, "altq" => false);
+ foreach ($this->rsets as $l7rule) {
+ if ($l7rule->GetRStructure() == "action") {
+ $unique_structures['action'] = true;
+ } else if ($l7rule->GetRStructure() == "limiter") {
+ $unique_structures['dummynet'] = true;
+ } else {
+ $unique_structures['altq'] = true;
+ }
+ }
+ //Delete non used structures so we don't have to check this in filter.inc
+ foreach ($unique_structures as $key => $value) {
+ if (!$value) {
+ unset($unique_structures[$key]);
+ }
+ }
+ return $unique_structures;
+ }
+
+ function validate_input($data, &$input_errors) {
+ $reqdfields[] = "container";
+ $reqdfieldsn[] = gettext("Name");
+
+ shaper_do_input_validation($data, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!preg_match("/^[a-zA-Z0-9_-]+$/", $data['container'])) {
+ $input_errors[] = gettext("Queue names must be alphanumeric and _ or - only.");
+ }
+ }
+
+ function delete_l7c() {
+ mwexec("/bin/pkill -f 'ipfw-classifyd .* -p ". $this->GetRPort() . "'", true);
+ unset_l7_object_by_reference($this->GetRName());
+ cleanup_l7_from_rules($this->GetRName());
+ }
+}
+
+class l7rule {
+
+ var $rprotocol; //protocol
+ var $rstructure; //action, limiter, queue
+ var $rbehaviour; //allow, block, queue_name, pipe_number ...
+
+ //Auxiliary Functions
+
+ function GetRProtocol() {
+ return $this->rprotocol;
+ }
+ function SetRProtocol($rprotocol) {
+ $this->rprotocol = $rprotocol;
+ }
+ function GetRStructure() {
+ return $this->rstructure;
+ }
+ function SetRStructure($rstructure) {
+ $this->rstructure = $rstructure;
+ }
+ function GetRBehaviour() {
+ return $this->rbehaviour;
+ }
+ function SetRBehaviour($rbehaviour) {
+ $this->rbehaviour = $rbehaviour;
+ }
+
+ //XXX Do we need to test any particularity for AltQ queues?
+ function build_rules() {
+ global $dummynet_pipe_list;
+ switch ($this->GetRStructure()) {
+ case "limiter":
+ read_dummynet_config();
+ $dn_list =& get_unique_dnqueue_list();
+ $found = false;
+ if (is_array($dn_list)) {
+ foreach ($dn_list as $key => $value) {
+ if ($key == $this->GetRBehaviour()) {
+ if ($value[0] == "?") {
+ $l7rule = $this->GetRProtocol() . " = dnqueue " . substr($value, 1) . "\n";
+ } else {
+ $l7rule = $this->GetRProtocol() . " = dnpipe " . $value . "\n";
+ }
+ $found = true;
+ }
+ if ($found) {
+ break;
+ }
+ }
+ }
+ break;
+ default: //This is for action and for altq
+ $l7rule = $this->GetRProtocol() . " = " . $this->GetRStructure() . " " . $this->GetRBehaviour() . "\n";
+ break;
+ }
+ return $l7rule;
+ }
+}
+
+/*
+ * This function allows to return an array with all the used divert socket ports
+ */
+function get_divert_ports() {
+ global $layer7_rules_list;
+ $dports = array();
+
+ foreach ($layer7_rules_list as $l7r) {
+ $dports[] = $l7r->GetRPort();
+ }
+
+ return $dports;
+}
+
+function &get_l7c_reference_to_me_in_config(&$name) {
+ global $config;
+
+ $ptr = NULL;
+
+ if (is_array($config['l7shaper']['container'])) {
+ foreach ($config['l7shaper']['container'] as $key => $value) {
+ if ($value['name'] == $name) {
+ $ptr =& $config['l7shaper']['container'][$key];
+ }
+ }
+ }
+ return $ptr;
+ // $ptr can be null. has to be checked later
+}
+
+function unset_l7_object_by_reference(&$name) {
+ global $config;
+
+ if (is_array($config['l7shaper']['container'])) {
+ foreach ($config['l7shaper']['container'] as $key => $value) {
+ if ($value['name'] == $name) {
+ unset($config['l7shaper']['container'][$key]['l7rules']);
+ unset($config['l7shaper']['container'][$key]);
+ break;
+ }
+ }
+ }
+}
+
+function read_layer7_config() {
+ global $layer7_rules_list, $config;
+
+ if (!is_array($config['l7shaper']['container']) || !count($config['l7shaper']['container'])) {
+ $layer7_rules_list = array();
+ return;
+ }
+
+ $l7cs = &$config['l7shaper']['container'];
+
+ $layer7_rules_list = array();
+
+ foreach ($l7cs as $conf) {
+ if (empty($conf['name'])) {
+ continue; /* XXX: grrrrrr at php */
+ }
+ $root =& new layer7();
+ $root->ReadConfig($conf['name'], $conf);
+ $layer7_rules_list[$root->GetRName()] = &$root;
+ }
+}
+
+function update_layer7_custom_patterns() {
+ global $config;
+
+ if (!is_array($config['l7shaper']['custom_pat'])) {
+ return;
+ }
+
+ foreach ($config['l7shaper']['custom_pat'] as $filename => $filecontent) {
+ if (!file_exists("/usr/local/share/protocols/" . $filename)) {
+ @file_put_contents("/usr/local/share/protocols/" . $filename, base64_decode($filecontent));
+ }
+ }
+}
+
+function generate_layer7_files() {
+ global $layer7_rules_list, $g;
+
+ read_layer7_config();
+
+ if (!empty($layer7_rules_list)) {
+ if (!is_module_loaded("ipdivert.ko")) {
+ mwexec("/sbin/kldload ipdivert.ko");
+ }
+
+ array_map('unlink', glob("{$g['tmp_path']}/*.l7"));
+ }
+
+ update_layer7_custom_patterns();
+
+ foreach ($layer7_rules_list as $l7rules) {
+ if ($l7rules->GetREnabled()) {
+ $filename = $l7rules->GetRName() . ".l7";
+ $path = "{$g['tmp_path']}/" . $filename;
+
+ $rules = $l7rules->build_l7_rules();
+
+ $fp = fopen($path, 'w');
+ fwrite($fp, $rules);
+ fclose($fp);
+ }
+ }
+}
+
+function layer7_start_l7daemon() {
+ global $layer7_rules_list, $g;
+
+ /*
+ * XXX: ermal - Needed ?!
+ * read_layer7_config();
+ */
+
+ foreach ($layer7_rules_list as $l7rules) {
+ if ($l7rules->GetREnabled()) {
+ $filename = $l7rules->GetRName() . ".l7";
+ $path = "{$g['tmp_path']}/" . $filename;
+
+ unset($l7pid);
+ /* Only reread the configuration rather than restart to avoid losing information. */
+ exec("/bin/pgrep -f 'ipfw-classifyd .* -p ". $l7rules->GetRPort() . "'", $l7pid);
+ if (count($l7pid) > 0) {
+ log_error(sprintf(gettext("Sending HUP signal to %s"), $l7pid[0]));
+ mwexec("/bin/kill -HUP {$l7pid[0]}");
+ } else {
+ // XXX: Hardcoded number of packets to garbage collect and queue length.
+ $ipfw_classifyd_init = "/usr/local/sbin/ipfw-classifyd -n 8 -q 700 -c {$path} -p " . $l7rules->GetRPort() . " -P /usr/local/share/protocols";
+ mwexec_bg($ipfw_classifyd_init);
+ }
+ }
+ }
+}
+
+// This function uses /usr/local/share/protocols as a default directory for searching .pat files
+function generate_protocols_array() {
+
+ update_layer7_custom_patterns();
+
+ $protocols = return_dir_as_array("/usr/local/share/protocols");
+ $protocols_new = array();
+ if (is_array($protocols)) {
+ foreach ($protocols as $key => $proto) {
+ if (strstr($proto, ".pat")) {
+ $protocols_new[$key] =& str_replace(".pat", "", $proto);
+ }
+ }
+ sort($protocols_new);
+ }
+ return $protocols_new;
+}
+
+function get_l7_unique_list() {
+ global $layer7_rules_list;
+
+ $l7list = array();
+ if (is_array($layer7_rules_list)) {
+ foreach ($layer7_rules_list as $l7c) {
+ if ($l7c->GetREnabled()) {
+ $l7list[] = $l7c->GetRName();
+ }
+ }
+ }
+
+ return $l7list;
+}
+
+// Disable a removed l7 container from the filter
+function cleanup_l7_from_rules(&$name) {
+ global $config;
+
+ if (is_array($config['filter']['rule'])) {
+ foreach ($config['filter']['rule'] as $key => $rule) {
+ if ($rule['l7container'] == $name) {
+ unset($config['filter']['rule'][$key]['l7container']);
+ }
+ }
+ }
+}
+
+function get_dummynet_name_list() {
+
+ $dn_name_list =& get_unique_dnqueue_list();
+ $dn_name = array();
+ if (is_array($dn_name_list)) {
+ foreach ($dn_name_list as $key => $value) {
+ $dn_name[] = $key;
+ }
+ }
+
+ return $dn_name;
+
+}
+
+function get_altq_name_list() {
+ $altq_name_list =& get_unique_queue_list();
+ $altq_name = array();
+ if (is_array($altq_name_list)) {
+ foreach ($altq_name_list as $key => $aqobj) {
+ $altq_name[] = $key;
+ }
+ }
+
+ return $altq_name;
+}
+
+/*
+ * XXX: TODO Make a class shaper to hide all these functions
+ * from the global namespace.
+ */
+
+/*
+ * This is a layer violation but for now there is no way
+ * I can find to properly do this with PHP.
+ */
+function altq_get_default_queue($interface) {
+ global $altq_list_queues;
+
+ $altq_tmp = $altq_list_queues[$interface];
+ if ($altq_tmp) {
+ return $altq_tmp->GetDefaultQueuePresent();
+ } else {
+ return false;
+ }
+}
+
+function altq_check_default_queues() {
+ global $altq_list_queues;
+
+ $count = 0;
+ if (is_array($altq_list_queues)) {
+ foreach ($altq_list_queues as $altq) {
+ if ($altq->GetDefaultQueuePresent()) {
+ $count++;
+ }
+ }
+ }
+ else {
+ $count++;
+ }
+
+ return 0;
+}
+
+function &get_unique_queue_list() {
+ global $altq_list_queues;
+
+ $qlist = array();
+ if (is_array($altq_list_queues)) {
+ foreach ($altq_list_queues as $altq) {
+ if ($altq->GetEnabled() == "") {
+ continue;
+ }
+ $tmplist =& $altq->get_queue_list();
+ foreach ($tmplist as $qname => $link) {
+ if ($link->GetEnabled() <> "") {
+ $qlist[$qname] = $link;
+ }
+ }
+ }
+ }
+ return $qlist;
+}
+
+function &get_unique_dnqueue_list() {
+ global $dummynet_pipe_list;
+
+ $qlist = array();
+ if (is_array($dummynet_pipe_list)) {
+ foreach ($dummynet_pipe_list as $dn) {
+ if ($dn->GetEnabled() == "") {
+ continue;
+ }
+ $tmplist =& $dn->get_queue_list();
+ foreach ($tmplist as $qname => $link) {
+ $qlist[$qname] = $link;
+ }
+ }
+ }
+ return $qlist;
+}
+
+function ref_on_altq_queue_list($parent, $qname) {
+ if (isset($GLOBALS['queue_list'][$qname])) {
+ $GLOBALS['queue_list'][$qname]++;
+ } else {
+ $GLOBALS['queue_list'][$qname] = 1;
+ }
+
+ unref_on_altq_queue_list($parent);
+}
+
+function unref_on_altq_queue_list($qname) {
+ $GLOBALS['queue_list'][$qname]--;
+ if ($GLOBALS['queue_list'][$qname] <= 1) {
+ unset($GLOBALS['queue_list'][$qname]);
+ }
+}
+
+function read_altq_config() {
+ global $altq_list_queues, $config;
+ $path = array();
+
+ if (!is_array($config['shaper'])) {
+ $config['shaper'] = array();
+ }
+ if (!is_array($config['shaper']['queue'])) {
+ $config['shaper']['queue'] = array();
+ }
+ $a_int = &$config['shaper']['queue'];
+
+ $altq_list_queues = array();
+
+ if (!is_array($config['shaper']['queue'])) {
+ return;
+ }
+
+ foreach ($a_int as $key => $conf) {
+ $int = $conf['interface'];
+ $root =& new altq_root_queue();
+ $root->SetInterface($int);
+ $altq_list_queues[$root->GetInterface()] = &$root;
+ $root->ReadConfig($conf);
+ array_push($path, $key);
+ $root->SetLink($path);
+ if (is_array($conf['queue'])) {
+ foreach ($conf['queue'] as $key1 => $q) {
+ array_push($path, $key1);
+ /*
+ * XXX: we completely ignore errors here but anyway we must have
+ * checked them before so no harm should be come from this.
+ */
+ $root->add_queue($root->GetInterface(), $q, $path, $input_errors);
+ array_pop($path);
+ }
+ }
+ array_pop($path);
+ }
+}
+
+function read_dummynet_config() {
+ global $dummynet_pipe_list, $config;
+ $path = array();
+
+ if (!is_array($config['dnshaper'])) {
+ $config['dnshaper'] = array();
+ }
+ if (!is_array($config['dnshaper']['queue'])) {
+ $config['dnshaper']['queue'] = array();
+ }
+ $a_int = &$config['dnshaper']['queue'];
+
+ $dummynet_pipe_list = array();
+
+ if (!is_array($config['dnshaper']['queue']) ||
+ !count($config['dnshaper']['queue'])) {
+ return;
+ }
+
+ foreach ($a_int as $key => $conf) {
+ if (empty($conf['name'])) {
+ continue; /* XXX: grrrrrr at php */
+ }
+ $root =& new dnpipe_class();
+ $root->ReadConfig($conf);
+ $dummynet_pipe_list[$root->GetQname()] = &$root;
+ array_push($path, $key);
+ $root->SetLink($path);
+ if (is_array($conf['queue'])) {
+ foreach ($conf['queue'] as $key1 => $q) {
+ array_push($path, $key1);
+ /*
+ * XXX: we completely ignore errors here but anyway we must have
+ * checked them before so no harm should be come from this.
+ */
+ $root->add_queue($root->GetQname(), $q, $path, $input_errors);
+ array_pop($path);
+ }
+ }
+ array_pop($path);
+ }
+}
+
+function get_interface_list_to_show() {
+ global $altq_list_queues, $config;
+ global $shaperIFlist;
+
+ $tree = "";
+ foreach ($shaperIFlist as $shif => $shDescr) {
+ if ($altq_list_queues[$shif]) {
+ continue;
+ } else {
+ if (!is_altq_capable(get_real_interface($shif))) {
+ continue;
+ }
+ $tree .= " <li><a href=\"firewall_shaper.php?interface=".$shif."&amp;action=add\">".$shDescr."</a></li>";
+ }
+ }
+
+ return $tree;
+}
+
+function filter_generate_altq_queues() {
+ global $altq_list_queues;
+
+ read_altq_config();
+
+ $altq_rules = "";
+ foreach ($altq_list_queues as $altq) {
+ $altq_rules .= $altq->build_rules();
+ }
+
+ return $altq_rules;
+}
+
+function dnqueue_find_nextnumber() {
+ global $dummynet_pipe_list;
+
+ $dnused = array();
+ if (is_array($dummynet_pipe_list)) {
+ foreach ($dummynet_pipe_list as $dn) {
+ $tmplist =& $dn->get_queue_list();
+ foreach ($tmplist as $qname => $link) {
+ if ($link[0] == "?") {
+ $dnused[$qname] = substr($link, 1);
+ }
+ }
+ }
+ }
+
+ sort($dnused, SORT_NUMERIC);
+ $dnnumber = 0;
+ $found = false;
+ foreach ($dnused as $dnnum) {
+ if (($dnnum - $dnnumber) > 1) {
+ $dnnumber = $dnnum - 1;
+ $found = true;
+ break;
+ } else {
+ $dnnumber = $dnnum;
+ }
+ }
+
+ if ($found == false) {
+ $dnnumber++;
+ }
+
+ unset($dnused, $dnnum, $found);
+ return $dnnumber;
+}
+
+function dnpipe_find_nextnumber() {
+ global $dummynet_pipe_list;
+
+ $dnused = array();
+ foreach ($dummynet_pipe_list as $dn) {
+ $dnused[] = $dn->GetNumber();
+ }
+
+ sort($dnused, SORT_NUMERIC);
+ $dnnumber = 0;
+ $found = false;
+ foreach ($dnused as $dnnum) {
+ if (($dnnum - $dnnumber) > 1) {
+ $dnnumber = $dnnum - 1;
+ $found = true;
+ break;
+ } else {
+ $dnnumber = $dnnum;
+ }
+ }
+
+ if ($found == false) {
+ $dnnumber++;
+ }
+
+ unset($dnused, $dnnum, $found);
+ return $dnnumber;
+}
+
+function filter_generate_dummynet_rules() {
+ global $g, $dummynet_pipe_list;
+
+ read_dummynet_config();
+
+ $dn_rules = "";
+ foreach ($dummynet_pipe_list as $dn) {
+ $dn_rules .= $dn->build_rules();
+ }
+
+ if (!empty($dn_rules)) {
+ if (!is_module_loaded("dummynet.ko")) {
+ mwexec("/sbin/kldload dummynet");
+ set_sysctl(array(
+ "net.inet.ip.dummynet.io_fast" => "1",
+ "net.inet.ip.dummynet.hash_size" => "256"
+ ));
+ }
+ file_put_contents("{$g['tmp_path']}/rules.limiter", $dn_rules);
+ mwexec("/sbin/ipfw {$g['tmp_path']}/rules.limiter");
+ }
+}
+
+function build_iface_without_this_queue($iface, $qname) {
+ global $g, $altq_list_queues;
+ global $shaperIFlist;
+
+ $altq =& $altq_list_queues[$iface];
+ if ($altq) {
+ $scheduler = ": " . $altq->GetScheduler();
+ }
+ $form = "<tr><td width=\"20%\" >";
+ $form .= "<a href=\"firewall_shaper.php?interface=" . $iface . "&amp;queue=" . $iface."&amp;action=show\">". $shaperIFlist[$iface] . $scheduler."</a>";
+ $form .= "</td></tr>";
+ $form .= "<tr><td width=\"100%\" class=\"vncellreq\">";
+ $form .= "<a href=\"firewall_shaper_queues.php?interface=";
+ $form .= $iface . "&amp;queue=". $qname . "&amp;action=add\">";
+ $form .= "<img src=\"";
+ $form .= "./themes/".$g['theme']."/images/icons/icon_plus.gif\"";
+ $form .= " width=\"17\" height=\"17\" border=\"0\" title=\"Clone shaper/queue on this interface\" alt=\"clone\" />";
+ $form .= gettext(" Clone shaper/queue on this interface") . "</a></td></tr>";
+
+ return $form;
+
+}
+
+
+$default_shaper_msg = "<tr><td align=\"center\" width=\"80%\">";
+$default_shaper_msg .= "<span class=\"vexpl\"><strong><b>" . sprintf(gettext("Welcome to the %s Traffic Shaper."), $g['product_name']) . "</b><br />";
+$default_shaper_msg .= gettext("The tree on the left helps you navigate through the queues <br />"
+ . "buttons at the bottom represent queue actions and are activated accordingly.");
+$default_shaper_msg .= "</strong></span>";
+$default_shaper_msg .= "</td></tr>";
+
+$dn_default_shaper_msg = "<tr><td align=\"center\" width=\"80%\">";
+$dn_default_shaper_msg .= "<span class=\"vexpl\"><strong><b>" . sprintf(gettext("Welcome to the %s Traffic Shaper."), $g['product_name']) . "</b><br />";
+$dn_default_shaper_msg .= gettext("The tree on the left helps you navigate through the queues <br />"
+ . "buttons at the bottom represent queue actions and are activated accordingly.");
+$dn_default_shaper_msg .= "</strong></span>";
+$dn_default_shaper_msg .= "</td></tr>";
+
+?>
diff --git a/src/etc/inc/simplepie/LICENSE.txt b/src/etc/inc/simplepie/LICENSE.txt
new file mode 100644
index 0000000..a822a4b
--- /dev/null
+++ b/src/etc/inc/simplepie/LICENSE.txt
@@ -0,0 +1,26 @@
+Copyright (c) 2004-2007, Ryan Parman and Geoffrey Sneddon.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are
+permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of
+ conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ of conditions and the following disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific prior
+ written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file
diff --git a/src/etc/inc/simplepie/simplepie.inc b/src/etc/inc/simplepie/simplepie.inc
new file mode 100644
index 0000000..7052eb4
--- /dev/null
+++ b/src/etc/inc/simplepie/simplepie.inc
@@ -0,0 +1,13672 @@
+<?php
+/**
+ * SimplePie
+ *
+ * A PHP-Based RSS and Atom Feed Framework.
+ * Takes the hard work out of managing a complete RSS/Atom solution.
+ *
+ * Copyright (c) 2004-2008, Ryan Parman and Geoffrey Sneddon
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the SimplePie Team nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
+ * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package SimplePie
+ * @version 1.1.3
+ * @copyright 2004-2008 Ryan Parman, Geoffrey Sneddon
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @link http://simplepie.org/ SimplePie
+ * @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @todo phpDoc comments
+ */
+
+/**
+ * SimplePie Name
+ */
+define('SIMPLEPIE_NAME', 'SimplePie');
+
+/**
+ * SimplePie Version
+ */
+define('SIMPLEPIE_VERSION', '1.1.3');
+
+/**
+ * SimplePie Build
+ */
+define('SIMPLEPIE_BUILD', 20081219);
+
+/**
+ * SimplePie Website URL
+ */
+define('SIMPLEPIE_URL', 'http://simplepie.org');
+
+/**
+ * SimplePie Useragent
+ * @see SimplePie::set_useragent()
+ */
+define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD);
+
+/**
+ * SimplePie Linkback
+ */
+define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>');
+
+/**
+ * No Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_NONE', 0);
+
+/**
+ * Feed Link Element Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1);
+
+/**
+ * Local Feed Extension Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2);
+
+/**
+ * Local Feed Body Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4);
+
+/**
+ * Remote Feed Extension Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8);
+
+/**
+ * Remote Feed Body Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16);
+
+/**
+ * All Feed Autodiscovery
+ * @see SimplePie::set_autodiscovery_level()
+ */
+define('SIMPLEPIE_LOCATOR_ALL', 31);
+
+/**
+ * No known feed type
+ */
+define('SIMPLEPIE_TYPE_NONE', 0);
+
+/**
+ * RSS 0.90
+ */
+define('SIMPLEPIE_TYPE_RSS_090', 1);
+
+/**
+ * RSS 0.91 (Netscape)
+ */
+define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2);
+
+/**
+ * RSS 0.91 (Userland)
+ */
+define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4);
+
+/**
+ * RSS 0.91 (both Netscape and Userland)
+ */
+define('SIMPLEPIE_TYPE_RSS_091', 6);
+
+/**
+ * RSS 0.92
+ */
+define('SIMPLEPIE_TYPE_RSS_092', 8);
+
+/**
+ * RSS 0.93
+ */
+define('SIMPLEPIE_TYPE_RSS_093', 16);
+
+/**
+ * RSS 0.94
+ */
+define('SIMPLEPIE_TYPE_RSS_094', 32);
+
+/**
+ * RSS 1.0
+ */
+define('SIMPLEPIE_TYPE_RSS_10', 64);
+
+/**
+ * RSS 2.0
+ */
+define('SIMPLEPIE_TYPE_RSS_20', 128);
+
+/**
+ * RDF-based RSS
+ */
+define('SIMPLEPIE_TYPE_RSS_RDF', 65);
+
+/**
+ * Non-RDF-based RSS (truly intended as syndication format)
+ */
+define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190);
+
+/**
+ * All RSS
+ */
+define('SIMPLEPIE_TYPE_RSS_ALL', 255);
+
+/**
+ * Atom 0.3
+ */
+define('SIMPLEPIE_TYPE_ATOM_03', 256);
+
+/**
+ * Atom 1.0
+ */
+define('SIMPLEPIE_TYPE_ATOM_10', 512);
+
+/**
+ * All Atom
+ */
+define('SIMPLEPIE_TYPE_ATOM_ALL', 768);
+
+/**
+ * All feed types
+ */
+define('SIMPLEPIE_TYPE_ALL', 1023);
+
+/**
+ * No construct
+ */
+define('SIMPLEPIE_CONSTRUCT_NONE', 0);
+
+/**
+ * Text construct
+ */
+define('SIMPLEPIE_CONSTRUCT_TEXT', 1);
+
+/**
+ * HTML construct
+ */
+define('SIMPLEPIE_CONSTRUCT_HTML', 2);
+
+/**
+ * XHTML construct
+ */
+define('SIMPLEPIE_CONSTRUCT_XHTML', 4);
+
+/**
+ * base64-encoded construct
+ */
+define('SIMPLEPIE_CONSTRUCT_BASE64', 8);
+
+/**
+ * IRI construct
+ */
+define('SIMPLEPIE_CONSTRUCT_IRI', 16);
+
+/**
+ * A construct that might be HTML
+ */
+define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32);
+
+/**
+ * All constructs
+ */
+define('SIMPLEPIE_CONSTRUCT_ALL', 63);
+
+/**
+ * PCRE for HTML attributes
+ */
+define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*');
+
+/**
+ * PCRE for XML attributes
+ */
+define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*');
+
+/**
+ * XML Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace');
+
+/**
+ * Atom 1.0 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom');
+
+/**
+ * Atom 0.3 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#');
+
+/**
+ * RDF Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
+
+/**
+ * RSS 0.90 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/');
+
+/**
+ * RSS 1.0 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/');
+
+/**
+ * RSS 1.0 Content Module Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/');
+
+/**
+ * RSS 2.0 Namespace
+ * (Stupid, I know, but I'm certain it will confuse people less with support.)
+ */
+define('SIMPLEPIE_NAMESPACE_RSS_20', '');
+
+/**
+ * DC 1.0 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/');
+
+/**
+ * DC 1.1 Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/');
+
+/**
+ * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#');
+
+/**
+ * GeoRSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss');
+
+/**
+ * Media RSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/');
+
+/**
+ * Wrong Media RSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss');
+
+/**
+ * iTunes RSS Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');
+
+/**
+ * XHTML Namespace
+ */
+define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml');
+
+/**
+ * IANA Link Relations Registry
+ */
+define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/');
+
+/**
+ * Whether we're running on PHP5
+ */
+define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>='));
+
+/**
+ * No file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_NONE', 0);
+
+/**
+ * Remote file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1);
+
+/**
+ * Local file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2);
+
+/**
+ * fsockopen() file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4);
+
+/**
+ * cURL file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_CURL', 8);
+
+/**
+ * file_get_contents() file source
+ */
+define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16);
+
+/**
+ * SimplePie
+ *
+ * @package SimplePie
+ * @version "Razzleberry"
+ * @copyright 2004-2007 Ryan Parman, Geoffrey Sneddon
+ * @author Ryan Parman
+ * @author Geoffrey Sneddon
+ * @todo Option for type of fetching (cache, not modified header, fetch, etc.)
+ */
+class SimplePie
+{
+ /**
+ * @var array Raw data
+ * @access private
+ */
+ var $data = array();
+
+ /**
+ * @var mixed Error string
+ * @access private
+ */
+ var $error;
+
+ /**
+ * @var object Instance of SimplePie_Sanitize (or other class)
+ * @see SimplePie::set_sanitize_class()
+ * @access private
+ */
+ var $sanitize;
+
+ /**
+ * @var string SimplePie Useragent
+ * @see SimplePie::set_useragent()
+ * @access private
+ */
+ var $useragent = SIMPLEPIE_USERAGENT;
+
+ /**
+ * @var string Feed URL
+ * @see SimplePie::set_feed_url()
+ * @access private
+ */
+ var $feed_url;
+
+ /**
+ * @var object Instance of SimplePie_File to use as a feed
+ * @see SimplePie::set_file()
+ * @access private
+ */
+ var $file;
+
+ /**
+ * @var string Raw feed data
+ * @see SimplePie::set_raw_data()
+ * @access private
+ */
+ var $raw_data;
+
+ /**
+ * @var int Timeout for fetching remote files
+ * @see SimplePie::set_timeout()
+ * @access private
+ */
+ var $timeout = 10;
+
+ /**
+ * @var bool Forces fsockopen() to be used for remote files instead
+ * of cURL, even if a new enough version is installed
+ * @see SimplePie::force_fsockopen()
+ * @access private
+ */
+ var $force_fsockopen = false;
+
+ /**
+ * @var bool Force the given data/URL to be treated as a feed no matter what
+ * it appears like
+ * @see SimplePie::force_feed()
+ * @access private
+ */
+ var $force_feed = false;
+
+ /**
+ * @var bool Enable/Disable XML dump
+ * @see SimplePie::enable_xml_dump()
+ * @access private
+ */
+ var $xml_dump = false;
+
+ /**
+ * @var bool Enable/Disable Caching
+ * @see SimplePie::enable_cache()
+ * @access private
+ */
+ var $cache = true;
+
+ /**
+ * @var int Cache duration (in seconds)
+ * @see SimplePie::set_cache_duration()
+ * @access private
+ */
+ var $cache_duration = 3600;
+
+ /**
+ * @var int Auto-discovery cache duration (in seconds)
+ * @see SimplePie::set_autodiscovery_cache_duration()
+ * @access private
+ */
+ var $autodiscovery_cache_duration = 604800; // 7 Days.
+
+ /**
+ * @var string Cache location (relative to executing script)
+ * @see SimplePie::set_cache_location()
+ * @access private
+ */
+ var $cache_location = './cache';
+
+ /**
+ * @var string Function that creates the cache filename
+ * @see SimplePie::set_cache_name_function()
+ * @access private
+ */
+ var $cache_name_function = 'md5';
+
+ /**
+ * @var bool Reorder feed by date descending
+ * @see SimplePie::enable_order_by_date()
+ * @access private
+ */
+ var $order_by_date = true;
+
+ /**
+ * @var mixed Force input encoding to be set to the follow value
+ * (false, or anything type-cast to false, disables this feature)
+ * @see SimplePie::set_input_encoding()
+ * @access private
+ */
+ var $input_encoding = false;
+
+ /**
+ * @var int Feed Autodiscovery Level
+ * @see SimplePie::set_autodiscovery_level()
+ * @access private
+ */
+ var $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
+
+ /**
+ * @var string Class used for caching feeds
+ * @see SimplePie::set_cache_class()
+ * @access private
+ */
+ var $cache_class = 'SimplePie_Cache';
+
+ /**
+ * @var string Class used for locating feeds
+ * @see SimplePie::set_locator_class()
+ * @access private
+ */
+ var $locator_class = 'SimplePie_Locator';
+
+ /**
+ * @var string Class used for parsing feeds
+ * @see SimplePie::set_parser_class()
+ * @access private
+ */
+ var $parser_class = 'SimplePie_Parser';
+
+ /**
+ * @var string Class used for fetching feeds
+ * @see SimplePie::set_file_class()
+ * @access private
+ */
+ var $file_class = 'SimplePie_File';
+
+ /**
+ * @var string Class used for items
+ * @see SimplePie::set_item_class()
+ * @access private
+ */
+ var $item_class = 'SimplePie_Item';
+
+ /**
+ * @var string Class used for authors
+ * @see SimplePie::set_author_class()
+ * @access private
+ */
+ var $author_class = 'SimplePie_Author';
+
+ /**
+ * @var string Class used for categories
+ * @see SimplePie::set_category_class()
+ * @access private
+ */
+ var $category_class = 'SimplePie_Category';
+
+ /**
+ * @var string Class used for enclosures
+ * @see SimplePie::set_enclosures_class()
+ * @access private
+ */
+ var $enclosure_class = 'SimplePie_Enclosure';
+
+ /**
+ * @var string Class used for Media RSS <media:text> captions
+ * @see SimplePie::set_caption_class()
+ * @access private
+ */
+ var $caption_class = 'SimplePie_Caption';
+
+ /**
+ * @var string Class used for Media RSS <media:copyright>
+ * @see SimplePie::set_copyright_class()
+ * @access private
+ */
+ var $copyright_class = 'SimplePie_Copyright';
+
+ /**
+ * @var string Class used for Media RSS <media:credit>
+ * @see SimplePie::set_credit_class()
+ * @access private
+ */
+ var $credit_class = 'SimplePie_Credit';
+
+ /**
+ * @var string Class used for Media RSS <media:rating>
+ * @see SimplePie::set_rating_class()
+ * @access private
+ */
+ var $rating_class = 'SimplePie_Rating';
+
+ /**
+ * @var string Class used for Media RSS <media:restriction>
+ * @see SimplePie::set_restriction_class()
+ * @access private
+ */
+ var $restriction_class = 'SimplePie_Restriction';
+
+ /**
+ * @var string Class used for content-type sniffing
+ * @see SimplePie::set_content_type_sniffer_class()
+ * @access private
+ */
+ var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer';
+
+ /**
+ * @var string Class used for item sources.
+ * @see SimplePie::set_source_class()
+ * @access private
+ */
+ var $source_class = 'SimplePie_Source';
+
+ /**
+ * @var mixed Set javascript query string parameter (false, or
+ * anything type-cast to false, disables this feature)
+ * @see SimplePie::set_javascript()
+ * @access private
+ */
+ var $javascript = 'js';
+
+ /**
+ * @var int Maximum number of feeds to check with autodiscovery
+ * @see SimplePie::set_max_checked_feeds()
+ * @access private
+ */
+ var $max_checked_feeds = 10;
+
+ /**
+ * @var string Web-accessible path to the handler_favicon.php file.
+ * @see SimplePie::set_favicon_handler()
+ * @access private
+ */
+ var $favicon_handler = '';
+
+ /**
+ * @var string Web-accessible path to the handler_image.php file.
+ * @see SimplePie::set_image_handler()
+ * @access private
+ */
+ var $image_handler = '';
+
+ /**
+ * @var array Stores the URLs when multiple feeds are being initialized.
+ * @see SimplePie::set_feed_url()
+ * @access private
+ */
+ var $multifeed_url = array();
+
+ /**
+ * @var array Stores SimplePie objects when multiple feeds initialized.
+ * @access private
+ */
+ var $multifeed_objects = array();
+
+ /**
+ * @var array Stores the get_object_vars() array for use with multifeeds.
+ * @see SimplePie::set_feed_url()
+ * @access private
+ */
+ var $config_settings = null;
+
+ /**
+ * @var integer Stores the number of items to return per-feed with multifeeds.
+ * @see SimplePie::set_item_limit()
+ * @access private
+ */
+ var $item_limit = 0;
+
+ /**
+ * @var array Stores the default attributes to be stripped by strip_attributes().
+ * @see SimplePie::strip_attributes()
+ * @access private
+ */
+ var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
+
+ /**
+ * @var array Stores the default tags to be stripped by strip_htmltags().
+ * @see SimplePie::strip_htmltags()
+ * @access private
+ */
+ var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
+
+ /**
+ * The SimplePie class contains feed level data and options
+ *
+ * There are two ways that you can create a new SimplePie object. The first
+ * is by passing a feed URL as a parameter to the SimplePie constructor
+ * (as well as optionally setting the cache location and cache expiry). This
+ * will initialise the whole feed with all of the default settings, and you
+ * can begin accessing methods and properties immediately.
+ *
+ * The second way is to create the SimplePie object with no parameters
+ * at all. This will enable you to set configuration options. After setting
+ * them, you must initialise the feed using $feed->init(). At that point the
+ * object's methods and properties will be available to you. This format is
+ * what is used throughout this documentation.
+ *
+ * @access public
+ * @since 1.0 Preview Release
+ * @param string $feed_url This is the URL you want to parse.
+ * @param string $cache_location This is where you want the cache to be stored.
+ * @param int $cache_duration This is the number of seconds that you want to store the cache file for.
+ */
+ function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null)
+ {
+ // Other objects, instances created here so we can set options on them
+ $this->sanitize =& new SimplePie_Sanitize;
+
+ // Set options if they're passed to the constructor
+ if ($cache_location !== null)
+ {
+ $this->set_cache_location($cache_location);
+ }
+
+ if ($cache_duration !== null)
+ {
+ $this->set_cache_duration($cache_duration);
+ }
+
+ // Only init the script if we're passed a feed URL
+ if ($feed_url !== null)
+ {
+ $this->set_feed_url($feed_url);
+ $this->init();
+ }
+ }
+
+ /**
+ * Used for converting object to a string
+ */
+ function __toString()
+ {
+ return md5(serialize($this->data));
+ }
+
+ /**
+ * Remove items that link back to this before destroying this object
+ */
+ function __destruct()
+ {
+ if (!empty($this->data['items']))
+ {
+ foreach ($this->data['items'] as $item)
+ {
+ $item->__destruct();
+ }
+ unset($this->data['items']);
+ }
+ if (!empty($this->data['ordered_items']))
+ {
+ foreach ($this->data['ordered_items'] as $item)
+ {
+ $item->__destruct();
+ }
+ unset($this->data['ordered_items']);
+ }
+ }
+
+ /**
+ * Force the given data/URL to be treated as a feed no matter what it
+ * appears like
+ *
+ * @access public
+ * @since 1.1
+ * @param bool $enable Force the given data/URL to be treated as a feed
+ */
+ function force_feed($enable = false)
+ {
+ $this->force_feed = (bool) $enable;
+ }
+
+ /**
+ * This is the URL of the feed you want to parse.
+ *
+ * This allows you to enter the URL of the feed you want to parse, or the
+ * website you want to try to use auto-discovery on. This takes priority
+ * over any set raw data.
+ *
+ * You can set multiple feeds to mash together by passing an array instead
+ * of a string for the $url. Remember that with each additional feed comes
+ * additional processing and resources.
+ *
+ * @access public
+ * @since 1.0 Preview Release
+ * @param mixed $url This is the URL (or array of URLs) that you want to parse.
+ * @see SimplePie::set_raw_data()
+ */
+ function set_feed_url($url)
+ {
+ if (is_array($url))
+ {
+ $this->multifeed_url = array();
+ foreach ($url as $value)
+ {
+ $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1);
+ }
+ }
+ else
+ {
+ $this->feed_url = SimplePie_Misc::fix_protocol($url, 1);
+ }
+ }
+
+ /**
+ * Provides an instance of SimplePie_File to use as a feed
+ *
+ * @access public
+ * @param object &$file Instance of SimplePie_File (or subclass)
+ * @return bool True on success, false on failure
+ */
+ function set_file(&$file)
+ {
+ if (is_a($file, 'SimplePie_File'))
+ {
+ $this->feed_url = $file->url;
+ $this->file =& $file;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to use a string of RSS/Atom data instead of a remote feed.
+ *
+ * If you have a feed available as a string in PHP, you can tell SimplePie
+ * to parse that data string instead of a remote feed. Any set feed URL
+ * takes precedence.
+ *
+ * @access public
+ * @since 1.0 Beta 3
+ * @param string $data RSS or Atom data as a string.
+ * @see SimplePie::set_feed_url()
+ */
+ function set_raw_data($data)
+ {
+ $this->raw_data = $data;
+ }
+
+ /**
+ * Allows you to override the default timeout for fetching remote feeds.
+ *
+ * This allows you to change the maximum time the feed's server to respond
+ * and send the feed back.
+ *
+ * @access public
+ * @since 1.0 Beta 3
+ * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed.
+ */
+ function set_timeout($timeout = 10)
+ {
+ $this->timeout = (int) $timeout;
+ }
+
+ /**
+ * Forces SimplePie to use fsockopen() instead of the preferred cURL
+ * functions.
+ *
+ * @access public
+ * @since 1.0 Beta 3
+ * @param bool $enable Force fsockopen() to be used
+ */
+ function force_fsockopen($enable = false)
+ {
+ $this->force_fsockopen = (bool) $enable;
+ }
+
+ /**
+ * Outputs the raw XML content of the feed, after it has gone through
+ * SimplePie's filters.
+ *
+ * Used only for debugging, this function will output the XML content as
+ * text/xml. When SimplePie reads in a feed, it does a bit of cleaning up
+ * before trying to parse it. Many parts of the feed are re-written in
+ * memory, and in the end, you have a parsable feed. XML dump shows you the
+ * actual XML that SimplePie tries to parse, which may or may not be very
+ * different from the original feed.
+ *
+ * @access public
+ * @since 1.0 Preview Release
+ * @param bool $enable Enable XML dump
+ */
+ function enable_xml_dump($enable = false)
+ {
+ $this->xml_dump = (bool) $enable;
+ }
+
+ /**
+ * Enables/disables caching in SimplePie.
+ *
+ * This option allows you to disable caching all-together in SimplePie.
+ * However, disabling the cache can lead to longer load times.
+ *
+ * @access public
+ * @since 1.0 Preview Release
+ * @param bool $enable Enable caching
+ */
+ function enable_cache($enable = true)
+ {
+ $this->cache = (bool) $enable;
+ }
+
+ /**
+ * Set the length of time (in seconds) that the contents of a feed
+ * will be cached.
+ *
+ * @access public
+ * @param int $seconds The feed content cache duration.
+ */
+ function set_cache_duration($seconds = 3600)
+ {
+ $this->cache_duration = (int) $seconds;
+ }
+
+ /**
+ * Set the length of time (in seconds) that the autodiscovered feed
+ * URL will be cached.
+ *
+ * @access public
+ * @param int $seconds The autodiscovered feed URL cache duration.
+ */
+ function set_autodiscovery_cache_duration($seconds = 604800)
+ {
+ $this->autodiscovery_cache_duration = (int) $seconds;
+ }
+
+ /**
+ * Set the file system location where the cached files should be stored.
+ *
+ * @access public
+ * @param string $location The file system location.
+ */
+ function set_cache_location($location = './cache')
+ {
+ $this->cache_location = (string) $location;
+ }
+
+ /**
+ * Determines whether feed items should be sorted into reverse chronological order.
+ *
+ * @access public
+ * @param bool $enable Sort as reverse chronological order.
+ */
+ function enable_order_by_date($enable = true)
+ {
+ $this->order_by_date = (bool) $enable;
+ }
+
+ /**
+ * Allows you to override the character encoding reported by the feed.
+ *
+ * @access public
+ * @param string $encoding Character encoding.
+ */
+ function set_input_encoding($encoding = false)
+ {
+ if ($encoding)
+ {
+ $this->input_encoding = (string) $encoding;
+ }
+ else
+ {
+ $this->input_encoding = false;
+ }
+ }
+
+ /**
+ * Set how much feed autodiscovery to do
+ *
+ * @access public
+ * @see SIMPLEPIE_LOCATOR_NONE
+ * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY
+ * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION
+ * @see SIMPLEPIE_LOCATOR_LOCAL_BODY
+ * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION
+ * @see SIMPLEPIE_LOCATOR_REMOTE_BODY
+ * @see SIMPLEPIE_LOCATOR_ALL
+ * @param int $level Feed Autodiscovery Level (level can be a
+ * combination of the above constants, see bitwise OR operator)
+ */
+ function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
+ {
+ $this->autodiscovery = (int) $level;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for caching.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_cache_class($class = 'SimplePie_Cache')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Cache'))
+ {
+ $this->cache_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for auto-discovery.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_locator_class($class = 'SimplePie_Locator')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Locator'))
+ {
+ $this->locator_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for XML parsing.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_parser_class($class = 'SimplePie_Parser')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Parser'))
+ {
+ $this->parser_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for remote file fetching.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_file_class($class = 'SimplePie_File')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_File'))
+ {
+ $this->file_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for data sanitization.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_sanitize_class($class = 'SimplePie_Sanitize')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Sanitize'))
+ {
+ $this->sanitize =& new $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for handling feed items.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_item_class($class = 'SimplePie_Item')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Item'))
+ {
+ $this->item_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for handling author data.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_author_class($class = 'SimplePie_Author')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Author'))
+ {
+ $this->author_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for handling category data.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_category_class($class = 'SimplePie_Category')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Category'))
+ {
+ $this->category_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for feed enclosures.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_enclosure_class($class = 'SimplePie_Enclosure')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Enclosure'))
+ {
+ $this->enclosure_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for <media:text> captions
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_caption_class($class = 'SimplePie_Caption')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Caption'))
+ {
+ $this->caption_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for <media:copyright>
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_copyright_class($class = 'SimplePie_Copyright')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Copyright'))
+ {
+ $this->copyright_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for <media:credit>
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_credit_class($class = 'SimplePie_Credit')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Credit'))
+ {
+ $this->credit_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for <media:rating>
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_rating_class($class = 'SimplePie_Rating')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Rating'))
+ {
+ $this->rating_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for <media:restriction>
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_restriction_class($class = 'SimplePie_Restriction')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Restriction'))
+ {
+ $this->restriction_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses for content-type sniffing.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer'))
+ {
+ $this->content_type_sniffer_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to change which class SimplePie uses item sources.
+ * Useful when you are overloading or extending SimplePie's default classes.
+ *
+ * @access public
+ * @param string $class Name of custom class.
+ * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+ * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+ */
+ function set_source_class($class = 'SimplePie_Source')
+ {
+ if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source'))
+ {
+ $this->source_class = $class;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Allows you to override the default user agent string.
+ *
+ * @access public
+ * @param string $ua New user agent string.
+ */
+ function set_useragent($ua = SIMPLEPIE_USERAGENT)
+ {
+ $this->useragent = (string) $ua;
+ }
+
+ /**
+ * Set callback function to create cache filename with
+ *
+ * @access public
+ * @param mixed $function Callback function
+ */
+ function set_cache_name_function($function = 'md5')
+ {
+ if (is_callable($function))
+ {
+ $this->cache_name_function = $function;
+ }
+ }
+
+ /**
+ * Set javascript query string parameter
+ *
+ * @access public
+ * @param mixed $get Javascript query string parameter
+ */
+ function set_javascript($get = 'js')
+ {
+ if ($get)
+ {
+ $this->javascript = (string) $get;
+ }
+ else
+ {
+ $this->javascript = false;
+ }
+ }
+
+ /**
+ * Set options to make SP as fast as possible. Forgoes a
+ * substantial amount of data sanitization in favor of speed.
+ *
+ * @access public
+ * @param bool $set Whether to set them or not
+ */
+ function set_stupidly_fast($set = false)
+ {
+ if ($set)
+ {
+ $this->enable_order_by_date(false);
+ $this->remove_div(false);
+ $this->strip_comments(false);
+ $this->strip_htmltags(false);
+ $this->strip_attributes(false);
+ $this->set_image_handler(false);
+ }
+ }
+
+ /**
+ * Set maximum number of feeds to check with autodiscovery
+ *
+ * @access public
+ * @param int $max Maximum number of feeds to check
+ */
+ function set_max_checked_feeds($max = 10)
+ {
+ $this->max_checked_feeds = (int) $max;
+ }
+
+ function remove_div($enable = true)
+ {
+ $this->sanitize->remove_div($enable);
+ }
+
+ function strip_htmltags($tags = '', $encode = null)
+ {
+ if ($tags === '')
+ {
+ $tags = $this->strip_htmltags;
+ }
+ $this->sanitize->strip_htmltags($tags);
+ if ($encode !== null)
+ {
+ $this->sanitize->encode_instead_of_strip($tags);
+ }
+ }
+
+ function encode_instead_of_strip($enable = true)
+ {
+ $this->sanitize->encode_instead_of_strip($enable);
+ }
+
+ function strip_attributes($attribs = '')
+ {
+ if ($attribs === '')
+ {
+ $attribs = $this->strip_attributes;
+ }
+ $this->sanitize->strip_attributes($attribs);
+ }
+
+ function set_output_encoding($encoding = 'UTF-8')
+ {
+ $this->sanitize->set_output_encoding($encoding);
+ }
+
+ function strip_comments($strip = false)
+ {
+ $this->sanitize->strip_comments($strip);
+ }
+
+ /**
+ * Set element/attribute key/value pairs of HTML attributes
+ * containing URLs that need to be resolved relative to the feed
+ *
+ * @access public
+ * @since 1.0
+ * @param array $element_attribute Element/attribute key/value pairs
+ */
+ function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite'))
+ {
+ $this->sanitize->set_url_replacements($element_attribute);
+ }
+
+ /**
+ * Set the handler to enable the display of cached favicons.
+ *
+ * @access public
+ * @param str $page Web-accessible path to the handler_favicon.php file.
+ * @param str $qs The query string that the value should be passed to.
+ */
+ function set_favicon_handler($page = false, $qs = 'i')
+ {
+ if ($page != false)
+ {
+ $this->favicon_handler = $page . '?' . $qs . '=';
+ }
+ else
+ {
+ $this->favicon_handler = '';
+ }
+ }
+
+ /**
+ * Set the handler to enable the display of cached images.
+ *
+ * @access public
+ * @param str $page Web-accessible path to the handler_image.php file.
+ * @param str $qs The query string that the value should be passed to.
+ */
+ function set_image_handler($page = false, $qs = 'i')
+ {
+ if ($page != false)
+ {
+ $this->sanitize->set_image_handler($page . '?' . $qs . '=');
+ }
+ else
+ {
+ $this->image_handler = '';
+ }
+ }
+
+ /**
+ * Set the limit for items returned per-feed with multifeeds.
+ *
+ * @access public
+ * @param integer $limit The maximum number of items to return.
+ */
+ function set_item_limit($limit = 0)
+ {
+ $this->item_limit = (int) $limit;
+ }
+
+ function init()
+ {
+ if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.3.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre'))
+ {
+ return false;
+ }
+ if (isset($_GET[$this->javascript]))
+ {
+ if (function_exists('ob_gzhandler'))
+ {
+ ob_start('ob_gzhandler');
+ }
+ header('Content-type: text/javascript; charset: UTF-8');
+ header('Cache-Control: must-revalidate');
+ header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
+ ?>
+function embed_odeo(link) {
+ document.writeln('<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url='+link+'"></embed>');
+}
+
+function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
+ if (placeholder != '') {
+ document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
+ }
+ else {
+ document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
+ }
+}
+
+function embed_flash(bgcolor, width, height, link, loop, type) {
+ document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>');
+}
+
+function embed_flv(width, height, link, placeholder, loop, player) {
+ document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>');
+}
+
+function embed_wmedia(width, height, link) {
+ document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>');
+}
+ <?php
+ exit;
+ }
+
+ // Pass whatever was set with config options over to the sanitizer.
+ $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->cache_class);
+ $this->sanitize->pass_file_data($this->file_class, $this->timeout, $this->useragent, $this->force_fsockopen);
+
+ if ($this->feed_url !== null || $this->raw_data !== null)
+ {
+ $this->data = array();
+ $this->multifeed_objects = array();
+ $cache = false;
+
+ if ($this->feed_url !== null)
+ {
+ $parsed_feed_url = SimplePie_Misc::parse_url($this->feed_url);
+ // Decide whether to enable caching
+ if ($this->cache && $parsed_feed_url['scheme'] !== '')
+ {
+ $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc');
+ }
+ // If it's enabled and we don't want an XML dump, use the cache
+ if ($cache && !$this->xml_dump)
+ {
+ // Load the Cache
+ $this->data = $cache->load();
+ if (!empty($this->data))
+ {
+ // If the cache is for an outdated build of SimplePie
+ if (!isset($this->data['build']) || $this->data['build'] != SIMPLEPIE_BUILD)
+ {
+ $cache->unlink();
+ $this->data = array();
+ }
+ // If we've hit a collision just rerun it with caching disabled
+ elseif (isset($this->data['url']) && $this->data['url'] != $this->feed_url)
+ {
+ $cache = false;
+ $this->data = array();
+ }
+ // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL.
+ elseif (isset($this->data['feed_url']))
+ {
+ // If the autodiscovery cache is still valid use it.
+ if ($cache->mtime() + $this->autodiscovery_cache_duration > time())
+ {
+ // Do not need to do feed autodiscovery yet.
+ if ($this->data['feed_url'] == $this->data['url'])
+ {
+ $cache->unlink();
+ $this->data = array();
+ }
+ else
+ {
+ $this->set_feed_url($this->data['feed_url']);
+ return $this->init();
+ }
+ }
+ }
+ // Check if the cache has been updated
+ elseif ($cache->mtime() + $this->cache_duration < time())
+ {
+ // If we have last-modified and/or etag set
+ if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))
+ {
+ $headers = array();
+ if (isset($this->data['headers']['last-modified']))
+ {
+ $headers['if-modified-since'] = $this->data['headers']['last-modified'];
+ }
+ if (isset($this->data['headers']['etag']))
+ {
+ $headers['if-none-match'] = '"' . $this->data['headers']['etag'] . '"';
+ }
+ $file =& new $this->file_class($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen);
+ if ($file->success)
+ {
+ if ($file->status_code == 304)
+ {
+ $cache->touch();
+ return true;
+ }
+ else
+ {
+ $headers = $file->headers;
+ }
+ }
+ else
+ {
+ unset($file);
+ }
+ }
+ }
+ // If the cache is still valid, just return true
+ else
+ {
+ return true;
+ }
+ }
+ // If the cache is empty, delete it
+ else
+ {
+ $cache->unlink();
+ $this->data = array();
+ }
+ }
+ // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it.
+ if (!isset($file))
+ {
+ if (is_a($this->file, 'SimplePie_File') && $this->file->url == $this->feed_url)
+ {
+ $file =& $this->file;
+ }
+ else
+ {
+ $file =& new $this->file_class($this->feed_url, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen);
+ }
+ }
+ // If the file connection has an error, set SimplePie::error to that and quit
+ if (!$file->success)
+ {
+ $this->error = $file->error;
+ if (!empty($this->data))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ if (!$this->force_feed)
+ {
+ // Check if the supplied URL is a feed, if it isn't, look for it.
+ $locate =& new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class);
+ if (!$locate->is_feed($file))
+ {
+ // We need to unset this so that if SimplePie::set_file() has been called that object is untouched
+ unset($file);
+ if ($file = $locate->find($this->autodiscovery))
+ {
+ if ($cache)
+ {
+ $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
+ if (!$cache->save($this))
+ {
+ trigger_error("$cache->name is not writeable", E_USER_WARNING);
+ }
+ $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc');
+ }
+ $this->feed_url = $file->url;
+ }
+ else
+ {
+ $this->error = "A feed could not be found at $this->feed_url";
+ SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
+ return false;
+ }
+ }
+ $locate = null;
+ }
+
+ $headers = $file->headers;
+ $data = $file->body;
+ $sniffer = new $this->content_type_sniffer_class($file);
+ $sniffed = $sniffer->get_type();
+ }
+ else
+ {
+ $data = $this->raw_data;
+ }
+
+ // Set up array of possible encodings
+ $encodings = array();
+
+ // First check to see if input has been overridden.
+ if ($this->input_encoding !== false)
+ {
+ $encodings[] = $this->input_encoding;
+ }
+
+ $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity');
+ $text_types = array('text/xml', 'text/xml-external-parsed-entity');
+
+ // RFC 3023 (only applies to sniffed content)
+ if (isset($sniffed))
+ {
+ if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml')
+ {
+ if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+ {
+ $encodings[] = strtoupper($charset[1]);
+ }
+ $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
+ $encodings[] = 'UTF-8';
+ }
+ elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml')
+ {
+ if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+ {
+ $encodings[] = $charset[1];
+ }
+ $encodings[] = 'US-ASCII';
+ }
+ // Text MIME-type default
+ elseif (substr($sniffed, 0, 5) === 'text/')
+ {
+ $encodings[] = 'US-ASCII';
+ }
+ }
+
+ // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1
+ $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
+ $encodings[] = 'UTF-8';
+ $encodings[] = 'ISO-8859-1';
+
+ // There's no point in trying an encoding twice
+ $encodings = array_unique($encodings);
+
+ // If we want the XML, just output that with the most likely encoding and quit
+ if ($this->xml_dump)
+ {
+ header('Content-type: text/xml; charset=' . $encodings[0]);
+ echo $data;
+ exit;
+ }
+
+ // Loop through each possible encoding, till we return something, or run out of possibilities
+ foreach ($encodings as $encoding)
+ {
+ // Change the encoding to UTF-8 (as we always use UTF-8 internally)
+ if ($utf8_data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8'))
+ {
+ // Create new parser
+ $parser =& new $this->parser_class();
+
+ // If it's parsed fine
+ if ($parser->parse($utf8_data, 'UTF-8'))
+ {
+ $this->data = $parser->get_data();
+ if ($this->get_type() & ~SIMPLEPIE_TYPE_NONE)
+ {
+ if (isset($headers))
+ {
+ $this->data['headers'] = $headers;
+ }
+ $this->data['build'] = SIMPLEPIE_BUILD;
+
+ // Cache the file if caching is enabled
+ if ($cache && !$cache->save($this))
+ {
+ trigger_error("$cache->name is not writeable", E_USER_WARNING);
+ }
+ return true;
+ }
+ else
+ {
+ $this->error = "A feed could not be found at $this->feed_url";
+ SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
+ return false;
+ }
+ }
+ }
+ }
+ // We have an error, just set SimplePie::error to it and quit
+ $this->error = sprintf('XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
+ SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
+ return false;
+ }
+ elseif (!empty($this->multifeed_url))
+ {
+ $i = 0;
+ $success = 0;
+ $this->multifeed_objects = array();
+ foreach ($this->multifeed_url as $url)
+ {
+ if (SIMPLEPIE_PHP5)
+ {
+ // This keyword needs to defy coding standards for PHP4 compatibility
+ $this->multifeed_objects[$i] = clone($this);
+ }
+ else
+ {
+ $this->multifeed_objects[$i] = $this;
+ }
+ $this->multifeed_objects[$i]->set_feed_url($url);
+ $success |= $this->multifeed_objects[$i]->init();
+ $i++;
+ }
+ return (bool) $success;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Return the error message for the occurred error
+ *
+ * @access public
+ * @return string Error message
+ */
+ function error()
+ {
+ return $this->error;
+ }
+
+ function get_encoding()
+ {
+ return $this->sanitize->output_encoding;
+ }
+
+ function handle_content_type($mime = 'text/html')
+ {
+ if (!headers_sent())
+ {
+ $header = "Content-type: $mime;";
+ if ($this->get_encoding())
+ {
+ $header .= ' charset=' . $this->get_encoding();
+ }
+ else
+ {
+ $header .= ' charset=UTF-8';
+ }
+ header($header);
+ }
+ }
+
+ function get_type()
+ {
+ if (!isset($this->data['type']))
+ {
+ $this->data['type'] = SIMPLEPIE_TYPE_ALL;
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10;
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03;
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF']))
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10;
+ }
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])
+ || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090;
+ }
+ }
+ elseif (isset($this->data['child']['']['rss']))
+ {
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL;
+ if (isset($this->data['child']['']['rss'][0]['attribs']['']['version']))
+ {
+ switch (trim($this->data['child']['']['rss'][0]['attribs']['']['version']))
+ {
+ case '0.91':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091;
+ if (isset($this->data['child']['']['rss'][0]['child']['']['skiphours']['hour'][0]['data']))
+ {
+ switch (trim($this->data['child']['']['rss'][0]['child']['']['skiphours']['hour'][0]['data']))
+ {
+ case '0':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE;
+ break;
+
+ case '24':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND;
+ break;
+ }
+ }
+ break;
+
+ case '0.92':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092;
+ break;
+
+ case '0.93':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093;
+ break;
+
+ case '0.94':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094;
+ break;
+
+ case '2.0':
+ $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20;
+ break;
+ }
+ }
+ }
+ else
+ {
+ $this->data['type'] = SIMPLEPIE_TYPE_NONE;
+ }
+ }
+ return $this->data['type'];
+ }
+
+ /**
+ * Returns the URL for the favicon of the feed's website.
+ *
+ * @todo Cache atom:icon
+ * @access public
+ * @since 1.0
+ */
+ function get_favicon()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif (($url = $this->get_link()) !== null && preg_match('/^http(s)?:\/\//i', $url))
+ {
+ $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $url);
+
+ if ($this->cache && $this->favicon_handler)
+ {
+ $favicon_filename = call_user_func($this->cache_name_function, $favicon);
+ $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $favicon_filename, 'spi');
+
+ if ($cache->load())
+ {
+ return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ $file =& new $this->file_class($favicon, $this->timeout / 10, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen);
+
+ if ($file->success && ($file->status_code == 200 || ($file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0)
+ {
+ $sniffer = new $this->content_type_sniffer_class($file);
+ if (substr($sniffer->get_type(), 0, 6) === 'image/')
+ {
+ if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
+ {
+ return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ trigger_error("$cache->name is not writeable", E_USER_WARNING);
+ return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @todo If we have a perm redirect we should return the new URL
+ * @todo When we make the above change, let's support <itunes:new-feed-url> as well
+ * @todo Also, |atom:link|@rel=self
+ */
+ function subscribe_url()
+ {
+ if ($this->feed_url !== null)
+ {
+ return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_feed()
+ {
+ if ($this->feed_url !== null)
+ {
+ return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_outlook()
+ {
+ if ($this->feed_url !== null)
+ {
+ return 'outlook' . $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_podcast()
+ {
+ if ($this->feed_url !== null)
+ {
+ return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 3), SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_itunes()
+ {
+ if ($this->feed_url !== null)
+ {
+ return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 4), SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Creates the subscribe_* methods' return data
+ *
+ * @access private
+ * @param string $feed_url String to prefix to the feed URL
+ * @param string $site_url String to prefix to the site URL (and
+ * suffix to the feed URL)
+ * @return mixed URL if feed exists, false otherwise
+ */
+ function subscribe_service($feed_url, $site_url = null)
+ {
+ if ($this->subscribe_url())
+ {
+ $return = $this->sanitize($feed_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->feed_url);
+ if ($site_url !== null && $this->get_link() !== null)
+ {
+ $return .= $this->sanitize($site_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_link());
+ }
+ return $return;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function subscribe_aol()
+ {
+ return $this->subscribe_service('http://feeds.my.aol.com/add.jsp?url=');
+ }
+
+ function subscribe_bloglines()
+ {
+ return urldecode($this->subscribe_service('http://www.bloglines.com/sub/'));
+ }
+
+ function subscribe_eskobo()
+ {
+ return $this->subscribe_service('http://www.eskobo.com/?AddToMyPage=');
+ }
+
+ function subscribe_feedfeeds()
+ {
+ return $this->subscribe_service('http://www.feedfeeds.com/add?feed=');
+ }
+
+ function subscribe_feedster()
+ {
+ return $this->subscribe_service('http://www.feedster.com/myfeedster.php?action=addrss&confirm=no&rssurl=');
+ }
+
+ function subscribe_google()
+ {
+ return $this->subscribe_service('http://fusion.google.com/add?feedurl=');
+ }
+
+ function subscribe_gritwire()
+ {
+ return $this->subscribe_service('http://my.gritwire.com/feeds/addExternalFeed.aspx?FeedUrl=');
+ }
+
+ function subscribe_msn()
+ {
+ return $this->subscribe_service('http://my.msn.com/addtomymsn.armx?id=rss&ut=', '&ru=');
+ }
+
+ function subscribe_netvibes()
+ {
+ return $this->subscribe_service('http://www.netvibes.com/subscribe.php?url=');
+ }
+
+ function subscribe_newsburst()
+ {
+ return $this->subscribe_service('http://www.newsburst.com/Source/?add=');
+ }
+
+ function subscribe_newsgator()
+ {
+ return $this->subscribe_service('http://www.newsgator.com/ngs/subscriber/subext.aspx?url=');
+ }
+
+ function subscribe_odeo()
+ {
+ return $this->subscribe_service('http://www.odeo.com/listen/subscribe?feed=');
+ }
+
+ function subscribe_podnova()
+ {
+ return $this->subscribe_service('http://www.podnova.com/index_your_podcasts.srf?action=add&url=');
+ }
+
+ function subscribe_rojo()
+ {
+ return $this->subscribe_service('http://www.rojo.com/add-subscription?resource=');
+ }
+
+ function subscribe_yahoo()
+ {
+ return $this->subscribe_service('http://add.my.yahoo.com/rss?url=');
+ }
+
+ function get_feed_tags($namespace, $tag)
+ {
+ $type = $this->get_type();
+ if ($type & SIMPLEPIE_TYPE_ATOM_10)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag];
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_ATOM_03)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag];
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_RDF)
+ {
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag];
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
+ {
+ if (isset($this->data['child']['']['rss'][0]['child'][$namespace][$tag]))
+ {
+ return $this->data['child']['']['rss'][0]['child'][$namespace][$tag];
+ }
+ }
+ return null;
+ }
+
+ function get_channel_tags($namespace, $tag)
+ {
+ $type = $this->get_type();
+ if ($type & SIMPLEPIE_TYPE_ATOM_ALL)
+ {
+ if ($return = $this->get_feed_tags($namespace, $tag))
+ {
+ return $return;
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_10)
+ {
+ if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel'))
+ {
+ if (isset($channel[0]['child'][$namespace][$tag]))
+ {
+ return $channel[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_090)
+ {
+ if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel'))
+ {
+ if (isset($channel[0]['child'][$namespace][$tag]))
+ {
+ return $channel[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
+ {
+ if ($channel = $this->get_feed_tags('', 'channel'))
+ {
+ if (isset($channel[0]['child'][$namespace][$tag]))
+ {
+ return $channel[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ return null;
+ }
+
+ function get_image_tags($namespace, $tag)
+ {
+ $type = $this->get_type();
+ if ($type & SIMPLEPIE_TYPE_RSS_10)
+ {
+ if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image'))
+ {
+ if (isset($image[0]['child'][$namespace][$tag]))
+ {
+ return $image[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_090)
+ {
+ if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image'))
+ {
+ if (isset($image[0]['child'][$namespace][$tag]))
+ {
+ return $image[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
+ {
+ if ($image = $this->get_channel_tags('', 'image'))
+ {
+ if (isset($image[0]['child'][$namespace][$tag]))
+ {
+ return $image[0]['child'][$namespace][$tag];
+ }
+ }
+ }
+ return null;
+ }
+
+ function get_base($element = array())
+ {
+ if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base']))
+ {
+ return $element['xml_base'];
+ }
+ elseif ($this->get_link() !== null)
+ {
+ return $this->get_link();
+ }
+ else
+ {
+ return $this->subscribe_url();
+ }
+ }
+
+ function sanitize($data, $type, $base = '')
+ {
+ return $this->sanitize->sanitize($data, $type, $base);
+ }
+
+ function get_title()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags('', 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_categories()
+ {
+ $categories = array();
+
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['attribs']['']['term']))
+ {
+ $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $this->get_channel_tags('', 'category') as $category)
+ {
+ $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
+ {
+ $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
+ {
+ $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($categories))
+ {
+ return SimplePie_Misc::array_unique($categories);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (isset($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_authors()
+ {
+ $authors = array();
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $authors[] =& new $this->author_class($name, $uri, $email);
+ }
+ }
+ if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $authors[] =& new $this->author_class($name, $url, $email);
+ }
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
+ {
+ $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
+ {
+ $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
+ {
+ $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($authors))
+ {
+ return SimplePie_Misc::array_unique($authors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributor($key = 0)
+ {
+ $contributors = $this->get_contributors();
+ if (isset($contributors[$key]))
+ {
+ return $contributors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributors()
+ {
+ $contributors = array();
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $contributors[] =& new $this->author_class($name, $uri, $email);
+ }
+ }
+ foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $contributors[] =& new $this->author_class($name, $url, $email);
+ }
+ }
+
+ if (!empty($contributors))
+ {
+ return SimplePie_Misc::array_unique($contributors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if (isset($links[$key]))
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Added for parity between the parent-level and the item/entry-level.
+ */
+ function get_permalink()
+ {
+ return $this->get_link(0);
+ }
+
+ function get_links($rel = 'alternate')
+ {
+ if (!isset($this->data['links']))
+ {
+ $this->data['links'] = array();
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ }
+ }
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+
+ }
+ }
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_channel_tags('', 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+
+ $keys = array_keys($this->data['links']);
+ foreach ($keys as $key)
+ {
+ if (SimplePie_Misc::is_isegment_nz_nc($key))
+ {
+ if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
+ $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
+ }
+ else
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
+ }
+ }
+ elseif (substr($key, 0, 41) == SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
+ {
+ $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
+ }
+ $this->data['links'][$key] = array_unique($this->data['links'][$key]);
+ }
+ }
+
+ if (isset($this->data['links'][$rel]))
+ {
+ return $this->data['links'][$rel];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_description()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags('', 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_copyright()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags('', 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_language()
+ {
+ if ($return = $this->get_channel_tags('', 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang']))
+ {
+ return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang']))
+ {
+ return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang']))
+ {
+ return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['headers']['content-language']))
+ {
+ return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_latitude()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[1];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_longitude()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[2];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_title()
+ {
+ if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags('', 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_url()
+ {
+ if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
+ {
+ return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags('', 'url'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_link()
+ {
+ if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_image_tags('', 'link'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_width()
+ {
+ if ($return = $this->get_image_tags('', 'width'))
+ {
+ return round($return[0]['data']);
+ }
+ elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags('', 'url'))
+ {
+ return 88.0;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_height()
+ {
+ if ($return = $this->get_image_tags('', 'height'))
+ {
+ return round($return[0]['data']);
+ }
+ elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags('', 'url'))
+ {
+ return 31.0;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_item_quantity($max = 0)
+ {
+ $qty = count($this->get_items());
+ if ($max == 0)
+ {
+ return $qty;
+ }
+ else
+ {
+ return ($qty > $max) ? $max : $qty;
+ }
+ }
+
+ function get_item($key = 0)
+ {
+ $items = $this->get_items();
+ if (isset($items[$key]))
+ {
+ return $items[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_items($start = 0, $end = 0)
+ {
+ if (!empty($this->multifeed_objects))
+ {
+ return SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);
+ }
+ elseif (!isset($this->data['items']))
+ {
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ if ($items = $this->get_channel_tags('', 'item'))
+ {
+ $keys = array_keys($items);
+ foreach ($keys as $key)
+ {
+ $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+ }
+ }
+ }
+
+ if (!empty($this->data['items']))
+ {
+ // If we want to order it by date, check if all items have a date, and then sort it
+ if ($this->order_by_date)
+ {
+ if (!isset($this->data['ordered_items']))
+ {
+ $do_sort = true;
+ foreach ($this->data['items'] as $item)
+ {
+ if (!$item->get_date('U'))
+ {
+ $do_sort = false;
+ break;
+ }
+ }
+ $item = null;
+ $this->data['ordered_items'] = $this->data['items'];
+ if ($do_sort)
+ {
+ usort($this->data['ordered_items'], array(&$this, 'sort_items'));
+ }
+ }
+ $items = $this->data['ordered_items'];
+ }
+ else
+ {
+ $items = $this->data['items'];
+ }
+
+ // Slice the data as desired
+ if ($end == 0)
+ {
+ return array_slice($items, $start);
+ }
+ else
+ {
+ return array_slice($items, $start, $end);
+ }
+ }
+ else
+ {
+ return array();
+ }
+ }
+
+ function sort_items($a, $b)
+ {
+ return $a->get_date('U') <= $b->get_date('U');
+ }
+
+ function merge_items($urls, $start = 0, $end = 0, $limit = 0)
+ {
+ if (is_array($urls) && sizeof($urls) > 0)
+ {
+ $items = array();
+ foreach ($urls as $arg)
+ {
+ if (is_a($arg, 'SimplePie'))
+ {
+ $items = array_merge($items, $arg->get_items(0, $limit));
+ }
+ else
+ {
+ trigger_error('Arguments must be SimplePie objects', E_USER_WARNING);
+ }
+ }
+
+ $do_sort = true;
+ foreach ($items as $item)
+ {
+ if (!$item->get_date('U'))
+ {
+ $do_sort = false;
+ break;
+ }
+ }
+ $item = null;
+ if ($do_sort)
+ {
+ usort($items, array('SimplePie', 'sort_items'));
+ }
+
+ if ($end == 0)
+ {
+ return array_slice($items, $start);
+ }
+ else
+ {
+ return array_slice($items, $start, $end);
+ }
+ }
+ else
+ {
+ trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);
+ return array();
+ }
+ }
+}
+
+class SimplePie_Item
+{
+ var $feed;
+ var $data = array();
+
+ function SimplePie_Item($feed, $data)
+ {
+ $this->feed = $feed;
+ $this->data = $data;
+ }
+
+ function __toString()
+ {
+ return md5(serialize($this->data));
+ }
+
+ /**
+ * Remove items that link back to this before destroying this object
+ */
+ function __destruct()
+ {
+ unset($this->feed);
+ }
+
+ function get_item_tags($namespace, $tag)
+ {
+ if (isset($this->data['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][$namespace][$tag];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_base($element = array())
+ {
+ return $this->feed->get_base($element);
+ }
+
+ function sanitize($data, $type, $base = '')
+ {
+ return $this->feed->sanitize($data, $type, $base);
+ }
+
+ function get_feed()
+ {
+ return $this->feed;
+ }
+
+ function get_id($hash = false)
+ {
+ if (!$hash)
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags('', 'guid'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (($return = $this->get_permalink()) !== null)
+ {
+ return $return;
+ }
+ elseif (($return = $this->get_title()) !== null)
+ {
+ return $return;
+ }
+ }
+ if ($this->get_permalink() !== null || $this->get_title() !== null)
+ {
+ return md5($this->get_permalink() . $this->get_title());
+ }
+ else
+ {
+ return md5(serialize($this->data));
+ }
+ }
+
+ function get_title()
+ {
+ if (!isset($this->data['title']))
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags('', 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $this->data['title'] = null;
+ }
+ }
+ return $this->data['title'];
+ }
+
+ function get_description($description_only = false)
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags('', 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (!$description_only)
+ {
+ return $this->get_content(true);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_content($content_only = false)
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_content_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif (!$content_only)
+ {
+ return $this->get_description(true);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_categories()
+ {
+ $categories = array();
+
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['attribs']['']['term']))
+ {
+ $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $this->get_item_tags('', 'category') as $category)
+ {
+ $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
+ {
+ $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
+ {
+ $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($categories))
+ {
+ return SimplePie_Misc::array_unique($categories);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (isset($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributor($key = 0)
+ {
+ $contributors = $this->get_contributors();
+ if (isset($contributors[$key]))
+ {
+ return $contributors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributors()
+ {
+ $contributors = array();
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $contributors[] =& new $this->feed->author_class($name, $uri, $email);
+ }
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $contributors[] =& new $this->feed->author_class($name, $url, $email);
+ }
+ }
+
+ if (!empty($contributors))
+ {
+ return SimplePie_Misc::array_unique($contributors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @todo Atom inheritance (item author, source author, feed author)
+ */
+ function get_authors()
+ {
+ $authors = array();
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $authors[] =& new $this->feed->author_class($name, $uri, $email);
+ }
+ }
+ if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $authors[] =& new $this->feed->author_class($name, $url, $email);
+ }
+ }
+ if ($author = $this->get_item_tags('', 'author'))
+ {
+ $authors[] =& new $this->feed->author_class(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
+ {
+ $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
+ {
+ $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
+ {
+ $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($authors))
+ {
+ return SimplePie_Misc::array_unique($authors);
+ }
+ elseif (($source = $this->get_source()) && ($authors = $source->get_authors()))
+ {
+ return $authors;
+ }
+ elseif ($authors = $this->feed->get_authors())
+ {
+ return $authors;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_copyright()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_date($date_format = 'j F Y, g:i a')
+ {
+ if (!isset($this->data['date']))
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags('', 'pubDate'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
+ {
+ $this->data['date']['raw'] = $return[0]['data'];
+ }
+
+ if (!empty($this->data['date']['raw']))
+ {
+ $parser = SimplePie_Parse_Date::get();
+ $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);
+ }
+ else
+ {
+ $this->data['date'] = null;
+ }
+ }
+ if ($this->data['date'])
+ {
+ $date_format = (string) $date_format;
+ switch ($date_format)
+ {
+ case '':
+ return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
+
+ case 'U':
+ return $this->data['date']['parsed'];
+
+ default:
+ return date($date_format, $this->data['date']['parsed']);
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_local_date($date_format = '%c')
+ {
+ if (!$date_format)
+ {
+ return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (($date = $this->get_date('U')) !== null)
+ {
+ return strftime($date_format, $date);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_permalink()
+ {
+ $link = $this->get_link();
+ $enclosure = $this->get_enclosure(0);
+ if ($link !== null)
+ {
+ return $link;
+ }
+ elseif ($enclosure !== null)
+ {
+ return $enclosure->get_link();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if ($links[$key] !== null)
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_links($rel = 'alternate')
+ {
+ if (!isset($this->data['links']))
+ {
+ $this->data['links'] = array();
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+
+ }
+ }
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ }
+ }
+ if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_item_tags('', 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_item_tags('', 'guid'))
+ {
+ if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) == 'true')
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ }
+
+ $keys = array_keys($this->data['links']);
+ foreach ($keys as $key)
+ {
+ if (SimplePie_Misc::is_isegment_nz_nc($key))
+ {
+ if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
+ $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
+ }
+ else
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
+ }
+ }
+ elseif (substr($key, 0, 41) == SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
+ {
+ $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
+ }
+ $this->data['links'][$key] = array_unique($this->data['links'][$key]);
+ }
+ }
+ if (isset($this->data['links'][$rel]))
+ {
+ return $this->data['links'][$rel];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @todo Add ability to prefer one type of content over another (in a media group).
+ */
+ function get_enclosure($key = 0, $prefer = null)
+ {
+ $enclosures = $this->get_enclosures();
+ if (isset($enclosures[$key]))
+ {
+ return $enclosures[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Grabs all available enclosures (podcasts, etc.)
+ *
+ * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
+ *
+ * At this point, we're pretty much assuming that all enclosures for an item are the same content. Anything else is too complicated to properly support.
+ *
+ * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
+ * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists).
+ */
+ function get_enclosures()
+ {
+ if (!isset($this->data['enclosures']))
+ {
+ $this->data['enclosures'] = array();
+
+ // Elements
+ $captions_parent = null;
+ $categories_parent = null;
+ $copyrights_parent = null;
+ $credits_parent = null;
+ $description_parent = null;
+ $duration_parent = null;
+ $hashes_parent = null;
+ $keywords_parent = null;
+ $player_parent = null;
+ $ratings_parent = null;
+ $restrictions_parent = null;
+ $thumbnails_parent = null;
+ $title_parent = null;
+
+ // Let's do the channel and item-level ones first, and just re-use them if we need to.
+ $parent = $this->get_feed();
+
+ // CAPTIONS
+ if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
+ {
+ foreach ($captions as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ }
+ elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
+ {
+ foreach ($captions as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ }
+ if (is_array($captions_parent))
+ {
+ $captions_parent = array_values(SimplePie_Misc::array_unique($captions_parent));
+ }
+
+ // CATEGORIES
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)
+ {
+ $term = null;
+ $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
+ $label = null;
+ if (isset($category['attribs']['']['text']))
+ {
+ $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
+
+ if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))
+ {
+ foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)
+ {
+ if (isset($subcategory['attribs']['']['text']))
+ {
+ $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ }
+ }
+ if (is_array($categories_parent))
+ {
+ $categories_parent = array_values(SimplePie_Misc::array_unique($categories_parent));
+ }
+
+ // COPYRIGHT
+ if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($copyright[0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($copyright[0]['data']))
+ {
+ $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+ elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($copyright[0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($copyright[0]['data']))
+ {
+ $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+
+ // CREDITS
+ if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
+ {
+ foreach ($credits as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ }
+ elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
+ {
+ foreach ($credits as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ }
+ if (is_array($credits_parent))
+ {
+ $credits_parent = array_values(SimplePie_Misc::array_unique($credits_parent));
+ }
+
+ // DESCRIPTION
+ if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
+ {
+ if (isset($description_parent[0]['data']))
+ {
+ $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+ elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
+ {
+ if (isset($description_parent[0]['data']))
+ {
+ $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+
+ // DURATION
+ if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))
+ {
+ $seconds = null;
+ $minutes = null;
+ $hours = null;
+ if (isset($duration_parent[0]['data']))
+ {
+ $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ if (sizeof($temp) > 0)
+ {
+ (int) $seconds = array_pop($temp);
+ }
+ if (sizeof($temp) > 0)
+ {
+ (int) $minutes = array_pop($temp);
+ $seconds += $minutes * 60;
+ }
+ if (sizeof($temp) > 0)
+ {
+ (int) $hours = array_pop($temp);
+ $seconds += $hours * 3600;
+ }
+ unset($temp);
+ $duration_parent = $seconds;
+ }
+ }
+
+ // HASHES
+ if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
+ {
+ foreach ($hashes_iterator as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes_parent[] = $algo.':'.$value;
+ }
+ }
+ elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
+ {
+ foreach ($hashes_iterator as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes_parent[] = $algo.':'.$value;
+ }
+ }
+ if (is_array($hashes_parent))
+ {
+ $hashes_parent = array_values(SimplePie_Misc::array_unique($hashes_parent));
+ }
+
+ // KEYWORDS
+ if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
+ {
+ if (isset($keywords[0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords_parent[] = trim($word);
+ }
+ }
+ unset($temp);
+ }
+ if (is_array($keywords_parent))
+ {
+ $keywords_parent = array_values(SimplePie_Misc::array_unique($keywords_parent));
+ }
+
+ // PLAYER
+ if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
+ {
+ if (isset($player_parent[0]['attribs']['']['url']))
+ {
+ $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
+ {
+ if (isset($player_parent[0]['attribs']['']['url']))
+ {
+ $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+
+ // RATINGS
+ if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ }
+ elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = 'urn:itunes';
+ $rating_value = null;
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ }
+ elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ }
+ elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
+ {
+ foreach ($ratings as $rating)
+ {
+ $rating_scheme = 'urn:itunes';
+ $rating_value = null;
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ }
+ if (is_array($ratings_parent))
+ {
+ $ratings_parent = array_values(SimplePie_Misc::array_unique($ratings_parent));
+ }
+
+ // RESTRICTIONS
+ if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ }
+ elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = 'allow';
+ $restriction_type = null;
+ $restriction_value = 'itunes';
+ if (isset($restriction['data']) && strtolower($restriction['data']) == 'yes')
+ {
+ $restriction_relationship = 'deny';
+ }
+ $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ }
+ elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ }
+ elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
+ {
+ foreach ($restrictions as $restriction)
+ {
+ $restriction_relationship = 'allow';
+ $restriction_type = null;
+ $restriction_value = 'itunes';
+ if (isset($restriction['data']) && strtolower($restriction['data']) == 'yes')
+ {
+ $restriction_relationship = 'deny';
+ }
+ $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ }
+ if (is_array($restrictions_parent))
+ {
+ $restrictions_parent = array_values(SimplePie_Misc::array_unique($restrictions_parent));
+ }
+
+ // THUMBNAILS
+ if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
+ {
+ foreach ($thumbnails as $thumbnail)
+ {
+ if (isset($thumbnail['attribs']['']['url']))
+ {
+ $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ }
+ elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
+ {
+ foreach ($thumbnails as $thumbnail)
+ {
+ if (isset($thumbnail['attribs']['']['url']))
+ {
+ $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ }
+ }
+
+ // TITLES
+ if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
+ {
+ if (isset($title_parent[0]['data']))
+ {
+ $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+ elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
+ {
+ if (isset($title_parent[0]['data']))
+ {
+ $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ }
+
+ // Clear the memory
+ unset($parent);
+
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ // Elements
+ $captions = null;
+ $categories = null;
+ $copyrights = null;
+ $credits = null;
+ $description = null;
+ $hashes = null;
+ $keywords = null;
+ $player = null;
+ $ratings = null;
+ $restrictions = null;
+ $thumbnails = null;
+ $title = null;
+
+ // If we have media:group tags, loop through them.
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
+ {
+ // If we have media:content tags, loop through them.
+ foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
+ {
+ if (isset($content['attribs']['']['url']))
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ // Elements
+ $captions = null;
+ $categories = null;
+ $copyrights = null;
+ $credits = null;
+ $description = null;
+ $hashes = null;
+ $keywords = null;
+ $player = null;
+ $ratings = null;
+ $restrictions = null;
+ $thumbnails = null;
+ $title = null;
+
+ // Start checking the attributes of media:content
+ if (isset($content['attribs']['']['bitrate']))
+ {
+ $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['channels']))
+ {
+ $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['duration']))
+ {
+ $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $duration = $duration_parent;
+ }
+ if (isset($content['attribs']['']['expression']))
+ {
+ $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['framerate']))
+ {
+ $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['height']))
+ {
+ $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['lang']))
+ {
+ $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['fileSize']))
+ {
+ $length = ceil($content['attribs']['']['fileSize']);
+ }
+ if (isset($content['attribs']['']['medium']))
+ {
+ $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['samplingrate']))
+ {
+ $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['type']))
+ {
+ $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['width']))
+ {
+ $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+
+ // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
+
+ // CAPTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ if (is_array($captions))
+ {
+ $captions = array_values(SimplePie_Misc::array_unique($captions));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ if (is_array($captions))
+ {
+ $captions = array_values(SimplePie_Misc::array_unique($captions));
+ }
+ }
+ else
+ {
+ $captions = $captions_parent;
+ }
+
+ // CATEGORIES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+ {
+ foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ }
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+ {
+ foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ }
+ if (is_array($categories) && is_array($categories_parent))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
+ }
+ elseif (is_array($categories))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique($categories));
+ }
+ elseif (is_array($categories_parent))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
+ }
+
+ // COPYRIGHTS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+ {
+ $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+ {
+ $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+ else
+ {
+ $copyrights = $copyrights_parent;
+ }
+
+ // CREDITS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ if (is_array($credits))
+ {
+ $credits = array_values(SimplePie_Misc::array_unique($credits));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ if (is_array($credits))
+ {
+ $credits = array_values(SimplePie_Misc::array_unique($credits));
+ }
+ }
+ else
+ {
+ $credits = $credits_parent;
+ }
+
+ // DESCRIPTION
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
+ {
+ $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
+ {
+ $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $description = $description_parent;
+ }
+
+ // HASHES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes[] = $algo.':'.$value;
+ }
+ if (is_array($hashes))
+ {
+ $hashes = array_values(SimplePie_Misc::array_unique($hashes));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes[] = $algo.':'.$value;
+ }
+ if (is_array($hashes))
+ {
+ $hashes = array_values(SimplePie_Misc::array_unique($hashes));
+ }
+ }
+ else
+ {
+ $hashes = $hashes_parent;
+ }
+
+ // KEYWORDS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+ {
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords[] = trim($word);
+ }
+ unset($temp);
+ }
+ if (is_array($keywords))
+ {
+ $keywords = array_values(SimplePie_Misc::array_unique($keywords));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+ {
+ if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords[] = trim($word);
+ }
+ unset($temp);
+ }
+ if (is_array($keywords))
+ {
+ $keywords = array_values(SimplePie_Misc::array_unique($keywords));
+ }
+ }
+ else
+ {
+ $keywords = $keywords_parent;
+ }
+
+ // PLAYER
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ $player = $player_parent;
+ }
+
+ // RATINGS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ if (is_array($ratings))
+ {
+ $ratings = array_values(SimplePie_Misc::array_unique($ratings));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ if (is_array($ratings))
+ {
+ $ratings = array_values(SimplePie_Misc::array_unique($ratings));
+ }
+ }
+ else
+ {
+ $ratings = $ratings_parent;
+ }
+
+ // RESTRICTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ if (is_array($restrictions))
+ {
+ $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ if (is_array($restrictions))
+ {
+ $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
+ }
+ }
+ else
+ {
+ $restrictions = $restrictions_parent;
+ }
+
+ // THUMBNAILS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+ {
+ $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ if (is_array($thumbnails))
+ {
+ $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
+ }
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+ {
+ foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+ {
+ $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ if (is_array($thumbnails))
+ {
+ $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
+ }
+ }
+ else
+ {
+ $thumbnails = $thumbnails_parent;
+ }
+
+ // TITLES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
+ {
+ $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
+ {
+ $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $title = $title_parent;
+ }
+
+ $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
+ }
+ }
+ }
+
+ // If we have standalone media:content tags, loop through them.
+ if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
+ {
+ foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
+ {
+ if (isset($content['attribs']['']['url']))
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ // Elements
+ $captions = null;
+ $categories = null;
+ $copyrights = null;
+ $credits = null;
+ $description = null;
+ $hashes = null;
+ $keywords = null;
+ $player = null;
+ $ratings = null;
+ $restrictions = null;
+ $thumbnails = null;
+ $title = null;
+
+ // Start checking the attributes of media:content
+ if (isset($content['attribs']['']['bitrate']))
+ {
+ $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['channels']))
+ {
+ $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['duration']))
+ {
+ $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $duration = $duration_parent;
+ }
+ if (isset($content['attribs']['']['expression']))
+ {
+ $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['framerate']))
+ {
+ $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['height']))
+ {
+ $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['lang']))
+ {
+ $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['fileSize']))
+ {
+ $length = ceil($content['attribs']['']['fileSize']);
+ }
+ if (isset($content['attribs']['']['medium']))
+ {
+ $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['samplingrate']))
+ {
+ $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['type']))
+ {
+ $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['attribs']['']['width']))
+ {
+ $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+
+ // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
+
+ // CAPTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+ {
+ $caption_type = null;
+ $caption_lang = null;
+ $caption_startTime = null;
+ $caption_endTime = null;
+ $caption_text = null;
+ if (isset($caption['attribs']['']['type']))
+ {
+ $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['lang']))
+ {
+ $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['start']))
+ {
+ $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['attribs']['']['end']))
+ {
+ $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($caption['data']))
+ {
+ $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
+ }
+ if (is_array($captions))
+ {
+ $captions = array_values(SimplePie_Misc::array_unique($captions));
+ }
+ }
+ else
+ {
+ $captions = $captions_parent;
+ }
+
+ // CATEGORIES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+ {
+ foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['data']))
+ {
+ $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $scheme = 'http://search.yahoo.com/mrss/category_schema';
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->feed->category_class($term, $scheme, $label);
+ }
+ }
+ if (is_array($categories) && is_array($categories_parent))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
+ }
+ elseif (is_array($categories))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique($categories));
+ }
+ elseif (is_array($categories_parent))
+ {
+ $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
+ }
+ else
+ {
+ $categories = null;
+ }
+
+ // COPYRIGHTS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
+ {
+ $copyright_url = null;
+ $copyright_label = null;
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
+ {
+ $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+ {
+ $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
+ }
+ else
+ {
+ $copyrights = $copyrights_parent;
+ }
+
+ // CREDITS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+ {
+ $credit_role = null;
+ $credit_scheme = null;
+ $credit_name = null;
+ if (isset($credit['attribs']['']['role']))
+ {
+ $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($credit['attribs']['']['scheme']))
+ {
+ $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $credit_scheme = 'urn:ebu';
+ }
+ if (isset($credit['data']))
+ {
+ $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
+ }
+ if (is_array($credits))
+ {
+ $credits = array_values(SimplePie_Misc::array_unique($credits));
+ }
+ }
+ else
+ {
+ $credits = $credits_parent;
+ }
+
+ // DESCRIPTION
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
+ {
+ $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $description = $description_parent;
+ }
+
+ // HASHES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+ {
+ $value = null;
+ $algo = null;
+ if (isset($hash['data']))
+ {
+ $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($hash['attribs']['']['algo']))
+ {
+ $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $algo = 'md5';
+ }
+ $hashes[] = $algo.':'.$value;
+ }
+ if (is_array($hashes))
+ {
+ $hashes = array_values(SimplePie_Misc::array_unique($hashes));
+ }
+ }
+ else
+ {
+ $hashes = $hashes_parent;
+ }
+
+ // KEYWORDS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+ {
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+ {
+ $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+ foreach ($temp as $word)
+ {
+ $keywords[] = trim($word);
+ }
+ unset($temp);
+ }
+ if (is_array($keywords))
+ {
+ $keywords = array_values(SimplePie_Misc::array_unique($keywords));
+ }
+ }
+ else
+ {
+ $keywords = $keywords_parent;
+ }
+
+ // PLAYER
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
+ {
+ $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ else
+ {
+ $player = $player_parent;
+ }
+
+ // RATINGS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+ {
+ $rating_scheme = null;
+ $rating_value = null;
+ if (isset($rating['attribs']['']['scheme']))
+ {
+ $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $rating_scheme = 'urn:simple';
+ }
+ if (isset($rating['data']))
+ {
+ $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
+ }
+ if (is_array($ratings))
+ {
+ $ratings = array_values(SimplePie_Misc::array_unique($ratings));
+ }
+ }
+ else
+ {
+ $ratings = $ratings_parent;
+ }
+
+ // RESTRICTIONS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+ {
+ $restriction_relationship = null;
+ $restriction_type = null;
+ $restriction_value = null;
+ if (isset($restriction['attribs']['']['relationship']))
+ {
+ $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['attribs']['']['type']))
+ {
+ $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($restriction['data']))
+ {
+ $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
+ }
+ if (is_array($restrictions))
+ {
+ $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
+ }
+ }
+ else
+ {
+ $restrictions = $restrictions_parent;
+ }
+
+ // THUMBNAILS
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+ {
+ foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+ {
+ $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ if (is_array($thumbnails))
+ {
+ $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
+ }
+ }
+ else
+ {
+ $thumbnails = $thumbnails_parent;
+ }
+
+ // TITLES
+ if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
+ {
+ $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ $title = $title_parent;
+ }
+
+ $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
+ }
+ }
+ }
+
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] == 'enclosure')
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ if (isset($link['attribs']['']['type']))
+ {
+ $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($link['attribs']['']['length']))
+ {
+ $length = ceil($link['attribs']['']['length']);
+ }
+
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
+ }
+ }
+
+ foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
+ {
+ if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] == 'enclosure')
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ if (isset($link['attribs']['']['type']))
+ {
+ $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($link['attribs']['']['length']))
+ {
+ $length = ceil($link['attribs']['']['length']);
+ }
+
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
+ }
+ }
+
+ if ($enclosure = $this->get_item_tags('', 'enclosure'))
+ {
+ if (isset($enclosure[0]['attribs']['']['url']))
+ {
+ // Attributes
+ $bitrate = null;
+ $channels = null;
+ $duration = null;
+ $expression = null;
+ $framerate = null;
+ $height = null;
+ $javascript = null;
+ $lang = null;
+ $length = null;
+ $medium = null;
+ $samplingrate = null;
+ $type = null;
+ $url = null;
+ $width = null;
+
+ $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
+ if (isset($enclosure[0]['attribs']['']['type']))
+ {
+ $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($enclosure[0]['attribs']['']['length']))
+ {
+ $length = ceil($enclosure[0]['attribs']['']['length']);
+ }
+
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
+ }
+ }
+
+ if (sizeof($this->data['enclosures']) == 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width))
+ {
+ // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
+ $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
+ }
+
+ $this->data['enclosures'] = array_values(SimplePie_Misc::array_unique($this->data['enclosures']));
+ }
+ if (!empty($this->data['enclosures']))
+ {
+ return $this->data['enclosures'];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_latitude()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[1];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_longitude()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[2];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_source()
+ {
+ if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source'))
+ {
+ return new $this->feed->source_class($this, $return[0]);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Creates the add_to_* methods' return data
+ *
+ * @access private
+ * @param string $item_url String to prefix to the item permalink
+ * @param string $title_url String to prefix to the item title
+ * (and suffix to the item permalink)
+ * @return mixed URL if feed exists, false otherwise
+ */
+ function add_to_service($item_url, $title_url = null, $summary_url = null)
+ {
+ if ($this->get_permalink() !== null)
+ {
+ $return = $this->sanitize($item_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_permalink());
+ if ($title_url !== null && $this->get_title() !== null)
+ {
+ $return .= $this->sanitize($title_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_title());
+ }
+ if ($summary_url !== null && $this->get_description() !== null)
+ {
+ $return .= $this->sanitize($summary_url, SIMPLEPIE_CONSTRUCT_IRI) . rawurlencode($this->get_description());
+ }
+ return $return;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function add_to_blinklist()
+ {
+ return $this->add_to_service('http://www.blinklist.com/index.php?Action=Blink/addblink.php&Description=&Url=', '&Title=');
+ }
+
+ function add_to_blogmarks()
+ {
+ return $this->add_to_service('http://blogmarks.net/my/new.php?mini=1&simple=1&url=', '&title=');
+ }
+
+ function add_to_delicious()
+ {
+ return $this->add_to_service('http://del.icio.us/post/?v=4&url=', '&title=');
+ }
+
+ function add_to_digg()
+ {
+ return $this->add_to_service('http://digg.com/submit?url=', '&title=', '&bodytext=');
+ }
+
+ function add_to_furl()
+ {
+ return $this->add_to_service('http://www.furl.net/storeIt.jsp?u=', '&t=');
+ }
+
+ function add_to_magnolia()
+ {
+ return $this->add_to_service('http://ma.gnolia.com/bookmarklet/add?url=', '&title=');
+ }
+
+ function add_to_myweb20()
+ {
+ return $this->add_to_service('http://myweb2.search.yahoo.com/myresults/bookmarklet?u=', '&t=');
+ }
+
+ function add_to_newsvine()
+ {
+ return $this->add_to_service('http://www.newsvine.com/_wine/save?u=', '&h=');
+ }
+
+ function add_to_reddit()
+ {
+ return $this->add_to_service('http://reddit.com/submit?url=', '&title=');
+ }
+
+ function add_to_segnalo()
+ {
+ return $this->add_to_service('http://segnalo.com/post.html.php?url=', '&title=');
+ }
+
+ function add_to_simpy()
+ {
+ return $this->add_to_service('http://www.simpy.com/simpy/LinkAdd.do?href=', '&title=');
+ }
+
+ function add_to_spurl()
+ {
+ return $this->add_to_service('http://www.spurl.net/spurl.php?v=3&url=', '&title=');
+ }
+
+ function add_to_wists()
+ {
+ return $this->add_to_service('http://wists.com/r.php?c=&r=', '&title=');
+ }
+
+ function search_technorati()
+ {
+ return $this->add_to_service('http://www.technorati.com/search/');
+ }
+}
+
+class SimplePie_Source
+{
+ var $item;
+ var $data = array();
+
+ function SimplePie_Source($item, $data)
+ {
+ $this->item = $item;
+ $this->data = $data;
+ }
+
+ function __toString()
+ {
+ return md5(serialize($this->data));
+ }
+
+ /**
+ * Remove items that link back to this before destroying this object
+ */
+ function __destruct()
+ {
+ unset($this->item);
+ }
+
+ function get_source_tags($namespace, $tag)
+ {
+ if (isset($this->data['child'][$namespace][$tag]))
+ {
+ return $this->data['child'][$namespace][$tag];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_base($element = array())
+ {
+ return $this->item->get_base($element);
+ }
+
+ function sanitize($data, $type, $base = '')
+ {
+ return $this->item->sanitize($data, $type, $base);
+ }
+
+ function get_item()
+ {
+ return $this->item;
+ }
+
+ function get_title()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags('', 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_categories()
+ {
+ $categories = array();
+
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
+ {
+ $term = null;
+ $scheme = null;
+ $label = null;
+ if (isset($category['attribs']['']['term']))
+ {
+ $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['scheme']))
+ {
+ $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($category['attribs']['']['label']))
+ {
+ $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ $categories[] =& new $this->item->feed->category_class($term, $scheme, $label);
+ }
+ foreach ((array) $this->get_source_tags('', 'category') as $category)
+ {
+ $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
+ {
+ $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
+ {
+ $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($categories))
+ {
+ return SimplePie_Misc::array_unique($categories);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_author($key = 0)
+ {
+ $authors = $this->get_authors();
+ if (isset($authors[$key]))
+ {
+ return $authors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_authors()
+ {
+ $authors = array();
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $authors[] =& new $this->item->feed->author_class($name, $uri, $email);
+ }
+ }
+ if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $authors[] =& new $this->item->feed->author_class($name, $url, $email);
+ }
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
+ {
+ $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
+ {
+ $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
+ {
+ $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+ }
+
+ if (!empty($authors))
+ {
+ return SimplePie_Misc::array_unique($authors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributor($key = 0)
+ {
+ $contributors = $this->get_contributors();
+ if (isset($contributors[$key]))
+ {
+ return $contributors[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_contributors()
+ {
+ $contributors = array();
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
+ {
+ $name = null;
+ $uri = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
+ {
+ $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $uri !== null)
+ {
+ $contributors[] =& new $this->item->feed->author_class($name, $uri, $email);
+ }
+ }
+ foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
+ {
+ $name = null;
+ $url = null;
+ $email = null;
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
+ {
+ $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
+ {
+ $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
+ }
+ if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
+ {
+ $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ if ($name !== null || $email !== null || $url !== null)
+ {
+ $contributors[] =& new $this->item->feed->author_class($name, $url, $email);
+ }
+ }
+
+ if (!empty($contributors))
+ {
+ return SimplePie_Misc::array_unique($contributors);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link($key = 0, $rel = 'alternate')
+ {
+ $links = $this->get_links($rel);
+ if (isset($links[$key]))
+ {
+ return $links[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Added for parity between the parent-level and the item/entry-level.
+ */
+ function get_permalink()
+ {
+ return $this->get_link(0);
+ }
+
+ function get_links($rel = 'alternate')
+ {
+ if (!isset($this->data['links']))
+ {
+ $this->data['links'] = array();
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+ }
+ }
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
+ {
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['']['href']))
+ {
+ $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
+ $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
+
+ }
+ }
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+ if ($links = $this->get_source_tags('', 'link'))
+ {
+ $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
+ }
+
+ $keys = array_keys($this->data['links']);
+ foreach ($keys as $key)
+ {
+ if (SimplePie_Misc::is_isegment_nz_nc($key))
+ {
+ if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
+ $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
+ }
+ else
+ {
+ $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
+ }
+ }
+ elseif (substr($key, 0, 41) == SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
+ {
+ $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
+ }
+ $this->data['links'][$key] = array_unique($this->data['links'][$key]);
+ }
+ }
+
+ if (isset($this->data['links'][$rel]))
+ {
+ return $this->data['links'][$rel];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_description()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags('', 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_copyright()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags('', 'copyright'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_language()
+ {
+ if ($return = $this->get_source_tags('', 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ elseif (isset($this->data['xml_lang']))
+ {
+ return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_latitude()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[1];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_longitude()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
+ {
+ return (float) $return[0]['data'];
+ }
+ elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+ {
+ return (float) $match[2];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_image_url()
+ {
+ if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
+ {
+ return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
+ {
+ return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Author
+{
+ var $name;
+ var $link;
+ var $email;
+
+ // Constructor, used to input the data
+ function SimplePie_Author($name = null, $link = null, $email = null)
+ {
+ $this->name = $name;
+ $this->link = $link;
+ $this->email = $email;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_name()
+ {
+ if ($this->name !== null)
+ {
+ return $this->name;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link()
+ {
+ if ($this->link !== null)
+ {
+ return $this->link;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_email()
+ {
+ if ($this->email !== null)
+ {
+ return $this->email;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Category
+{
+ var $term;
+ var $scheme;
+ var $label;
+
+ // Constructor, used to input the data
+ function SimplePie_Category($term = null, $scheme = null, $label = null)
+ {
+ $this->term = $term;
+ $this->scheme = $scheme;
+ $this->label = $label;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_term()
+ {
+ if ($this->term !== null)
+ {
+ return $this->term;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_label()
+ {
+ if ($this->label !== null)
+ {
+ return $this->label;
+ }
+ else
+ {
+ return $this->get_term();
+ }
+ }
+}
+
+class SimplePie_Enclosure
+{
+ var $bitrate;
+ var $captions;
+ var $categories;
+ var $channels;
+ var $copyright;
+ var $credits;
+ var $description;
+ var $duration;
+ var $expression;
+ var $framerate;
+ var $handler;
+ var $hashes;
+ var $height;
+ var $javascript;
+ var $keywords;
+ var $lang;
+ var $length;
+ var $link;
+ var $medium;
+ var $player;
+ var $ratings;
+ var $restrictions;
+ var $samplingrate;
+ var $thumbnails;
+ var $title;
+ var $type;
+ var $width;
+
+ // Constructor, used to input the data
+ function SimplePie_Enclosure($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null)
+ {
+ $this->bitrate = $bitrate;
+ $this->captions = $captions;
+ $this->categories = $categories;
+ $this->channels = $channels;
+ $this->copyright = $copyright;
+ $this->credits = $credits;
+ $this->description = $description;
+ $this->duration = $duration;
+ $this->expression = $expression;
+ $this->framerate = $framerate;
+ $this->hashes = $hashes;
+ $this->height = $height;
+ $this->javascript = $javascript;
+ $this->keywords = $keywords;
+ $this->lang = $lang;
+ $this->length = $length;
+ $this->link = $link;
+ $this->medium = $medium;
+ $this->player = $player;
+ $this->ratings = $ratings;
+ $this->restrictions = $restrictions;
+ $this->samplingrate = $samplingrate;
+ $this->thumbnails = $thumbnails;
+ $this->title = $title;
+ $this->type = $type;
+ $this->width = $width;
+ if (class_exists('idna_convert'))
+ {
+ $idn =& new idna_convert;
+ $parsed = SimplePie_Misc::parse_url($link);
+ $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
+ }
+ $this->handler = $this->get_handler(); // Needs to load last
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_bitrate()
+ {
+ if ($this->bitrate !== null)
+ {
+ return $this->bitrate;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_caption($key = 0)
+ {
+ $captions = $this->get_captions();
+ if (isset($captions[$key]))
+ {
+ return $captions[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_captions()
+ {
+ if ($this->captions !== null)
+ {
+ return $this->captions;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_category($key = 0)
+ {
+ $categories = $this->get_categories();
+ if (isset($categories[$key]))
+ {
+ return $categories[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_categories()
+ {
+ if ($this->categories !== null)
+ {
+ return $this->categories;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_channels()
+ {
+ if ($this->channels !== null)
+ {
+ return $this->channels;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_copyright()
+ {
+ if ($this->copyright !== null)
+ {
+ return $this->copyright;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_credit($key = 0)
+ {
+ $credits = $this->get_credits();
+ if (isset($credits[$key]))
+ {
+ return $credits[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_credits()
+ {
+ if ($this->credits !== null)
+ {
+ return $this->credits;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_description()
+ {
+ if ($this->description !== null)
+ {
+ return $this->description;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_duration($convert = false)
+ {
+ if ($this->duration !== null)
+ {
+ if ($convert)
+ {
+ $time = SimplePie_Misc::time_hms($this->duration);
+ return $time;
+ }
+ else
+ {
+ return $this->duration;
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_expression()
+ {
+ if ($this->expression !== null)
+ {
+ return $this->expression;
+ }
+ else
+ {
+ return 'full';
+ }
+ }
+
+ function get_extension()
+ {
+ if ($this->link !== null)
+ {
+ $url = SimplePie_Misc::parse_url($this->link);
+ if ($url['path'] !== '')
+ {
+ return pathinfo($url['path'], PATHINFO_EXTENSION);
+ }
+ }
+ return null;
+ }
+
+ function get_framerate()
+ {
+ if ($this->framerate !== null)
+ {
+ return $this->framerate;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_handler()
+ {
+ return $this->get_real_type(true);
+ }
+
+ function get_hash($key = 0)
+ {
+ $hashes = $this->get_hashes();
+ if (isset($hashes[$key]))
+ {
+ return $hashes[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_hashes()
+ {
+ if ($this->hashes !== null)
+ {
+ return $this->hashes;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_height()
+ {
+ if ($this->height !== null)
+ {
+ return $this->height;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_language()
+ {
+ if ($this->lang !== null)
+ {
+ return $this->lang;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_keyword($key = 0)
+ {
+ $keywords = $this->get_keywords();
+ if (isset($keywords[$key]))
+ {
+ return $keywords[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_keywords()
+ {
+ if ($this->keywords !== null)
+ {
+ return $this->keywords;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_length()
+ {
+ if ($this->length !== null)
+ {
+ return $this->length;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_link()
+ {
+ if ($this->link !== null)
+ {
+ return urldecode($this->link);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_medium()
+ {
+ if ($this->medium !== null)
+ {
+ return $this->medium;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_player()
+ {
+ if ($this->player !== null)
+ {
+ return $this->player;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_rating($key = 0)
+ {
+ $ratings = $this->get_ratings();
+ if (isset($ratings[$key]))
+ {
+ return $ratings[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_ratings()
+ {
+ if ($this->ratings !== null)
+ {
+ return $this->ratings;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_restriction($key = 0)
+ {
+ $restrictions = $this->get_restrictions();
+ if (isset($restrictions[$key]))
+ {
+ return $restrictions[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_restrictions()
+ {
+ if ($this->restrictions !== null)
+ {
+ return $this->restrictions;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_sampling_rate()
+ {
+ if ($this->samplingrate !== null)
+ {
+ return $this->samplingrate;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_size()
+ {
+ $length = $this->get_length();
+ if ($length !== null)
+ {
+ return round($length/1048576, 2);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_thumbnail($key = 0)
+ {
+ $thumbnails = $this->get_thumbnails();
+ if (isset($thumbnails[$key]))
+ {
+ return $thumbnails[$key];
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_thumbnails()
+ {
+ if ($this->thumbnails !== null)
+ {
+ return $this->thumbnails;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_title()
+ {
+ if ($this->title !== null)
+ {
+ return $this->title;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_width()
+ {
+ if ($this->width !== null)
+ {
+ return $this->width;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function native_embed($options='')
+ {
+ return $this->embed($options, true);
+ }
+
+ /**
+ * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'.
+ */
+ function embed($options = '', $native = false)
+ {
+ // Set up defaults
+ $audio = '';
+ $video = '';
+ $alt = '';
+ $altclass = '';
+ $loop = 'false';
+ $width = 'auto';
+ $height = 'auto';
+ $bgcolor = '#ffffff';
+ $mediaplayer = '';
+ $widescreen = false;
+ $handler = $this->get_handler();
+ $type = $this->get_real_type();
+
+ // Process options and reassign values as necessary
+ if (is_array($options))
+ {
+ extract($options);
+ }
+ else
+ {
+ $options = explode(',', $options);
+ foreach($options as $option)
+ {
+ $opt = explode(':', $option, 2);
+ if (isset($opt[0], $opt[1]))
+ {
+ $opt[0] = trim($opt[0]);
+ $opt[1] = trim($opt[1]);
+ switch ($opt[0])
+ {
+ case 'audio':
+ $audio = $opt[1];
+ break;
+
+ case 'video':
+ $video = $opt[1];
+ break;
+
+ case 'alt':
+ $alt = $opt[1];
+ break;
+
+ case 'altclass':
+ $altclass = $opt[1];
+ break;
+
+ case 'loop':
+ $loop = $opt[1];
+ break;
+
+ case 'width':
+ $width = $opt[1];
+ break;
+
+ case 'height':
+ $height = $opt[1];
+ break;
+
+ case 'bgcolor':
+ $bgcolor = $opt[1];
+ break;
+
+ case 'mediaplayer':
+ $mediaplayer = $opt[1];
+ break;
+
+ case 'widescreen':
+ $widescreen = $opt[1];
+ break;
+ }
+ }
+ }
+ }
+
+ $mime = explode('/', $type, 2);
+ $mime = $mime[0];
+
+ // Process values for 'auto'
+ if ($width == 'auto')
+ {
+ if ($mime == 'video')
+ {
+ if ($height == 'auto')
+ {
+ $width = 480;
+ }
+ elseif ($widescreen)
+ {
+ $width = round((intval($height)/9)*16);
+ }
+ else
+ {
+ $width = round((intval($height)/3)*4);
+ }
+ }
+ else
+ {
+ $width = '100%';
+ }
+ }
+
+ if ($height == 'auto')
+ {
+ if ($mime == 'audio')
+ {
+ $height = 0;
+ }
+ elseif ($mime == 'video')
+ {
+ if ($width == 'auto')
+ {
+ if ($widescreen)
+ {
+ $height = 270;
+ }
+ else
+ {
+ $height = 360;
+ }
+ }
+ elseif ($widescreen)
+ {
+ $height = round((intval($width)/16)*9);
+ }
+ else
+ {
+ $height = round((intval($width)/4)*3);
+ }
+ }
+ else
+ {
+ $height = 376;
+ }
+ }
+ elseif ($mime == 'audio')
+ {
+ $height = 0;
+ }
+
+ // Set proper placeholder value
+ if ($mime == 'audio')
+ {
+ $placeholder = $audio;
+ }
+ elseif ($mime == 'video')
+ {
+ $placeholder = $video;
+ }
+
+ $embed = '';
+
+ // Make sure the JS library is included
+ if (!$native)
+ {
+ static $javascript_outputted = null;
+ if (!$javascript_outputted && $this->javascript)
+ {
+ $embed .= '<script type="text/javascript" src="?' . htmlspecialchars($this->javascript) . '"></script>';
+ $javascript_outputted = true;
+ }
+ }
+
+ // Odeo Feed MP3's
+ if ($handler == 'odeo')
+ {
+ if ($native)
+ {
+ $embed .= '<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://adobe.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url=' . $this->get_link() . '"></embed>';
+ }
+ else
+ {
+ $embed .= '<script type="text/javascript">embed_odeo("' . $this->get_link() . '");</script>';
+ }
+ }
+
+ // Flash
+ elseif ($handler == 'flash')
+ {
+ if ($native)
+ {
+ $embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>";
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>";
+ }
+ }
+
+ // Flash Media Player file types.
+ // Preferred handler for MP3 file types.
+ elseif ($handler == 'fmedia' || ($handler == 'mp3' && $mediaplayer != ''))
+ {
+ $height += 20;
+ if ($native)
+ {
+ $embed .= "<embed src=\"$mediaplayer\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"$width\" height=\"$height\" wmode=\"transparent\" flashvars=\"file=" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\"></embed>";
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>";
+ }
+ }
+
+ // QuickTime 7 file types. Need to test with QuickTime 6.
+ // Only handle MP3's if the Flash Media Player is not present.
+ elseif ($handler == 'quicktime' || ($handler == 'mp3' && $mediaplayer == ''))
+ {
+ $height += 16;
+ if ($native)
+ {
+ if ($placeholder != ""){
+ $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
+ }
+ else {
+ $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
+ }
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>";
+ }
+ }
+
+ // Windows Media
+ elseif ($handler == 'wmedia')
+ {
+ $height += 45;
+ if ($native)
+ {
+ $embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>";
+ }
+ else
+ {
+ $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>";
+ }
+ }
+
+ // Everything else
+ else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>';
+
+ return $embed;
+ }
+
+ function get_real_type($find_handler = false)
+ {
+ // If it's Odeo, let's get it out of the way.
+ if (substr(strtolower($this->get_link()), 0, 15) == 'http://odeo.com')
+ {
+ return 'odeo';
+ }
+
+ // Mime-types by handler.
+ $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash
+ $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player
+ $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime
+ $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media
+ $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3
+
+ if ($this->get_type() !== null)
+ {
+ $type = strtolower($this->type);
+ }
+ else
+ {
+ $type = null;
+ }
+
+ // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
+ if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
+ {
+ switch (strtolower($this->get_extension()))
+ {
+ // Audio mime-types
+ case 'aac':
+ case 'adts':
+ $type = 'audio/acc';
+ break;
+
+ case 'aif':
+ case 'aifc':
+ case 'aiff':
+ case 'cdda':
+ $type = 'audio/aiff';
+ break;
+
+ case 'bwf':
+ $type = 'audio/wav';
+ break;
+
+ case 'kar':
+ case 'mid':
+ case 'midi':
+ case 'smf':
+ $type = 'audio/midi';
+ break;
+
+ case 'm4a':
+ $type = 'audio/x-m4a';
+ break;
+
+ case 'mp3':
+ case 'swa':
+ $type = 'audio/mp3';
+ break;
+
+ case 'wav':
+ $type = 'audio/wav';
+ break;
+
+ case 'wax':
+ $type = 'audio/x-ms-wax';
+ break;
+
+ case 'wma':
+ $type = 'audio/x-ms-wma';
+ break;
+
+ // Video mime-types
+ case '3gp':
+ case '3gpp':
+ $type = 'video/3gpp';
+ break;
+
+ case '3g2':
+ case '3gp2':
+ $type = 'video/3gpp2';
+ break;
+
+ case 'asf':
+ $type = 'video/x-ms-asf';
+ break;
+
+ case 'flv':
+ $type = 'video/x-flv';
+ break;
+
+ case 'm1a':
+ case 'm1s':
+ case 'm1v':
+ case 'm15':
+ case 'm75':
+ case 'mp2':
+ case 'mpa':
+ case 'mpeg':
+ case 'mpg':
+ case 'mpm':
+ case 'mpv':
+ $type = 'video/mpeg';
+ break;
+
+ case 'm4v':
+ $type = 'video/x-m4v';
+ break;
+
+ case 'mov':
+ case 'qt':
+ $type = 'video/quicktime';
+ break;
+
+ case 'mp4':
+ case 'mpg4':
+ $type = 'video/mp4';
+ break;
+
+ case 'sdv':
+ $type = 'video/sd-video';
+ break;
+
+ case 'wm':
+ $type = 'video/x-ms-wm';
+ break;
+
+ case 'wmv':
+ $type = 'video/x-ms-wmv';
+ break;
+
+ case 'wvx':
+ $type = 'video/x-ms-wvx';
+ break;
+
+ // Flash mime-types
+ case 'spl':
+ $type = 'application/futuresplash';
+ break;
+
+ case 'swf':
+ $type = 'application/x-shockwave-flash';
+ break;
+ }
+ }
+
+ if ($find_handler)
+ {
+ if (in_array($type, $types_flash))
+ {
+ return 'flash';
+ }
+ elseif (in_array($type, $types_fmedia))
+ {
+ return 'fmedia';
+ }
+ elseif (in_array($type, $types_quicktime))
+ {
+ return 'quicktime';
+ }
+ elseif (in_array($type, $types_wmedia))
+ {
+ return 'wmedia';
+ }
+ elseif (in_array($type, $types_mp3))
+ {
+ return 'mp3';
+ }
+ else
+ {
+ return null;
+ }
+ }
+ else
+ {
+ return $type;
+ }
+ }
+}
+
+class SimplePie_Caption
+{
+ var $type;
+ var $lang;
+ var $startTime;
+ var $endTime;
+ var $text;
+
+ // Constructor, used to input the data
+ function SimplePie_Caption($type = null, $lang = null, $startTime = null, $endTime = null, $text = null)
+ {
+ $this->type = $type;
+ $this->lang = $lang;
+ $this->startTime = $startTime;
+ $this->endTime = $endTime;
+ $this->text = $text;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_endtime()
+ {
+ if ($this->endTime !== null)
+ {
+ return $this->endTime;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_language()
+ {
+ if ($this->lang !== null)
+ {
+ return $this->lang;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_starttime()
+ {
+ if ($this->startTime !== null)
+ {
+ return $this->startTime;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_text()
+ {
+ if ($this->text !== null)
+ {
+ return $this->text;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Credit
+{
+ var $role;
+ var $scheme;
+ var $name;
+
+ // Constructor, used to input the data
+ function SimplePie_Credit($role = null, $scheme = null, $name = null)
+ {
+ $this->role = $role;
+ $this->scheme = $scheme;
+ $this->name = $name;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_role()
+ {
+ if ($this->role !== null)
+ {
+ return $this->role;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_name()
+ {
+ if ($this->name !== null)
+ {
+ return $this->name;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Copyright
+{
+ var $url;
+ var $label;
+
+ // Constructor, used to input the data
+ function SimplePie_Copyright($url = null, $label = null)
+ {
+ $this->url = $url;
+ $this->label = $label;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_url()
+ {
+ if ($this->url !== null)
+ {
+ return $this->url;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_attribution()
+ {
+ if ($this->label !== null)
+ {
+ return $this->label;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Rating
+{
+ var $scheme;
+ var $value;
+
+ // Constructor, used to input the data
+ function SimplePie_Rating($scheme = null, $value = null)
+ {
+ $this->scheme = $scheme;
+ $this->value = $value;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_scheme()
+ {
+ if ($this->scheme !== null)
+ {
+ return $this->scheme;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_value()
+ {
+ if ($this->value !== null)
+ {
+ return $this->value;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+class SimplePie_Restriction
+{
+ var $relationship;
+ var $type;
+ var $value;
+
+ // Constructor, used to input the data
+ function SimplePie_Restriction($relationship = null, $type = null, $value = null)
+ {
+ $this->relationship = $relationship;
+ $this->type = $type;
+ $this->value = $value;
+ }
+
+ function __toString()
+ {
+ // There is no $this->data here
+ return md5(serialize($this));
+ }
+
+ function get_relationship()
+ {
+ if ($this->relationship !== null)
+ {
+ return $this->relationship;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_type()
+ {
+ if ($this->type !== null)
+ {
+ return $this->type;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ function get_value()
+ {
+ if ($this->value !== null)
+ {
+ return $this->value;
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
+
+/**
+ * @todo Move to properly supporting RFC2616 (HTTP/1.1)
+ */
+class SimplePie_File
+{
+ var $url;
+ var $useragent;
+ var $success = true;
+ var $headers = array();
+ var $body;
+ var $status_code;
+ var $redirects = 0;
+ var $error;
+ var $method = SIMPLEPIE_FILE_SOURCE_NONE;
+
+ function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
+ {
+ if (class_exists('idna_convert'))
+ {
+ $idn =& new idna_convert;
+ $parsed = SimplePie_Misc::parse_url($url);
+ $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
+ }
+ $this->url = $url;
+ $this->useragent = $useragent;
+ if (preg_match('/^http(s)?:\/\//i', $url))
+ {
+ if ($useragent === null)
+ {
+ $useragent = ini_get('user_agent');
+ $this->useragent = $useragent;
+ }
+ if (!is_array($headers))
+ {
+ $headers = array();
+ }
+ if (!$force_fsockopen && function_exists('curl_exec'))
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
+ $fp = curl_init();
+ $headers2 = array();
+ foreach ($headers as $key => $value)
+ {
+ $headers2[] = "$key: $value";
+ }
+ if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))
+ {
+ curl_setopt($fp, CURLOPT_ENCODING, '');
+ }
+ curl_setopt($fp, CURLOPT_URL, $url);
+ curl_setopt($fp, CURLOPT_HEADER, 1);
+ curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
+ curl_setopt($fp, CURLOPT_REFERER, $url);
+ curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
+ curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
+ if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
+ {
+ curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
+ curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
+ }
+
+ $this->headers = curl_exec($fp);
+ if (curl_errno($fp) == 23 || curl_errno($fp) == 61)
+ {
+ curl_setopt($fp, CURLOPT_ENCODING, 'none');
+ $this->headers = curl_exec($fp);
+ }
+ if (curl_errno($fp))
+ {
+ $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
+ $this->success = false;
+ }
+ else
+ {
+ $info = curl_getinfo($fp);
+ curl_close($fp);
+ $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
+ $this->headers = array_pop($this->headers);
+ $parser =& new SimplePie_HTTP_Parser($this->headers);
+ if ($parser->parse())
+ {
+ $this->headers = $parser->headers;
+ $this->body = $parser->body;
+ $this->status_code = $parser->status_code;
+ if (($this->status_code == 300 || $this->status_code == 301 || $this->status_code == 302 || $this->status_code == 303 || $this->status_code == 307 || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
+ return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
+ }
+ }
+ }
+ }
+ else
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
+ $url_parts = parse_url($url);
+ if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) == 'https')
+ {
+ $url_parts['host'] = "ssl://$url_parts[host]";
+ $url_parts['port'] = 443;
+ }
+ if (!isset($url_parts['port']))
+ {
+ $url_parts['port'] = 80;
+ }
+ $fp = @fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout);
+ if (!$fp)
+ {
+ $this->error = 'fsockopen error: ' . $errstr;
+ $this->success = false;
+ }
+ else
+ {
+ stream_set_timeout($fp, $timeout);
+ if (isset($url_parts['path']))
+ {
+ if (isset($url_parts['query']))
+ {
+ $get = "$url_parts[path]?$url_parts[query]";
+ }
+ else
+ {
+ $get = $url_parts['path'];
+ }
+ }
+ else
+ {
+ $get = '/';
+ }
+ $out = "GET $get HTTP/1.0\r\n";
+ $out .= "Host: $url_parts[host]\r\n";
+ $out .= "User-Agent: $useragent\r\n";
+ if (extension_loaded('zlib'))
+ {
+ $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n";
+ }
+
+ if (isset($url_parts['user']) && isset($url_parts['pass']))
+ {
+ $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
+ }
+ foreach ($headers as $key => $value)
+ {
+ $out .= "$key: $value\r\n";
+ }
+ $out .= "Connection: Close\r\n\r\n";
+ fwrite($fp, $out);
+
+ $info = stream_get_meta_data($fp);
+
+ $this->headers = '';
+ while (!$info['eof'] && !$info['timed_out'])
+ {
+ $this->headers .= fread($fp, 1160);
+ $info = stream_get_meta_data($fp);
+ }
+ if (!$info['timed_out'])
+ {
+ $parser =& new SimplePie_HTTP_Parser($this->headers);
+ if ($parser->parse())
+ {
+ $this->headers = $parser->headers;
+ $this->body = $parser->body;
+ $this->status_code = $parser->status_code;
+ if (($this->status_code == 300 || $this->status_code == 301 || $this->status_code == 302 || $this->status_code == 303 || $this->status_code == 307 || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
+ {
+ $this->redirects++;
+ $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
+ return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
+ }
+ if (isset($this->headers['content-encoding']))
+ {
+ // Hey, we act dumb elsewhere, so let's do that here too
+ switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20")))
+ {
+ case 'gzip':
+ case 'x-gzip':
+ $decoder = new SimplePie_gzdecode($this->body);
+ if (!$decoder->parse())
+ {
+ $this->error = 'Unable to decode HTTP "gzip" stream';
+ $this->success = false;
+ }
+ else
+ {
+ $this->body = $decoder->data;
+ }
+ break;
+
+ case 'deflate':
+ if (($body = gzuncompress($this->body)) === false)
+ {
+ if (($body = gzinflate($this->body)) === false)
+ {
+ $this->error = 'Unable to decode HTTP "deflate" stream';
+ $this->success = false;
+ }
+ }
+ $this->body = $body;
+ break;
+
+ default:
+ $this->error = 'Unknown content coding';
+ $this->success = false;
+ }
+ }
+ }
+ }
+ else
+ {
+ $this->error = 'fsocket timed out';
+ $this->success = false;
+ }
+ fclose($fp);
+ }
+ }
+ }
+ else
+ {
+ $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
+ if (!$this->body = file_get_contents($url))
+ {
+ $this->error = 'file_get_contents could not read the file';
+ $this->success = false;
+ }
+ }
+ }
+}
+
+/**
+ * HTTP Response Parser
+ *
+ * @package SimplePie
+ */
+class SimplePie_HTTP_Parser
+{
+ /**
+ * HTTP Version
+ *
+ * @access public
+ * @var float
+ */
+ var $http_version = 0.0;
+
+ /**
+ * Status code
+ *
+ * @access public
+ * @var int
+ */
+ var $status_code = 0;
+
+ /**
+ * Reason phrase
+ *
+ * @access public
+ * @var string
+ */
+ var $reason = '';
+
+ /**
+ * Key/value pairs of the headers
+ *
+ * @access public
+ * @var array
+ */
+ var $headers = array();
+
+ /**
+ * Body of the response
+ *
+ * @access public
+ * @var string
+ */
+ var $body = '';
+
+ /**
+ * Current state of the state machine
+ *
+ * @access private
+ * @var string
+ */
+ var $state = 'http_version';
+
+ /**
+ * Input data
+ *
+ * @access private
+ * @var string
+ */
+ var $data = '';
+
+ /**
+ * Input data length (to avoid calling strlen() everytime this is needed)
+ *
+ * @access private
+ * @var int
+ */
+ var $data_length = 0;
+
+ /**
+ * Current position of the pointer
+ *
+ * @var int
+ * @access private
+ */
+ var $position = 0;
+
+ /**
+ * Name of the hedaer currently being parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $name = '';
+
+ /**
+ * Value of the hedaer currently being parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $value = '';
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @access public
+ * @param string $data Input data
+ */
+ function SimplePie_HTTP_Parser($data)
+ {
+ $this->data = $data;
+ $this->data_length = strlen($this->data);
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @access public
+ * @return bool true on success, false on failure
+ */
+ function parse()
+ {
+ while ($this->state && $this->state !== 'emit' && $this->has_data())
+ {
+ $state = $this->state;
+ $this->$state();
+ }
+ $this->data = '';
+ if ($this->state === 'emit' || $this->state === 'body')
+ {
+ return true;
+ }
+ else
+ {
+ $this->http_version = '';
+ $this->status_code = '';
+ $this->reason = '';
+ $this->headers = array();
+ $this->body = '';
+ return false;
+ }
+ }
+
+ /**
+ * Check whether there is data beyond the pointer
+ *
+ * @access private
+ * @return bool true if there is further data, false if not
+ */
+ function has_data()
+ {
+ return (bool) ($this->position < $this->data_length);
+ }
+
+ /**
+ * See if the next character is LWS
+ *
+ * @access private
+ * @return bool true if the next character is LWS, false if not
+ */
+ function is_linear_whitespace()
+ {
+ return (bool) ($this->data[$this->position] === "\x09"
+ || $this->data[$this->position] === "\x20"
+ || ($this->data[$this->position] === "\x0A"
+ && isset($this->data[$this->position + 1])
+ && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20")));
+ }
+
+ /**
+ * Parse the HTTP version
+ *
+ * @access private
+ */
+ function http_version()
+ {
+ if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/')
+ {
+ $len = strspn($this->data, '0123456789.', 5);
+ $this->http_version = substr($this->data, 5, $len);
+ $this->position += 5 + $len;
+ if (substr_count($this->http_version, '.') <= 1)
+ {
+ $this->http_version = (float) $this->http_version;
+ $this->position += strspn($this->data, "\x09\x20", $this->position);
+ $this->state = 'status';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse the status code
+ *
+ * @access private
+ */
+ function status()
+ {
+ if ($len = strspn($this->data, '0123456789', $this->position))
+ {
+ $this->status_code = (int) substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'reason';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse the reason phrase
+ *
+ * @access private
+ */
+ function reason()
+ {
+ $len = strcspn($this->data, "\x0A", $this->position);
+ $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20");
+ $this->position += $len + 1;
+ $this->state = 'new_line';
+ }
+
+ /**
+ * Deal with a new line, shifting data around as needed
+ *
+ * @access private
+ */
+ function new_line()
+ {
+ $this->value = trim($this->value, "\x0D\x20");
+ if ($this->name !== '' && $this->value !== '')
+ {
+ $this->name = strtolower($this->name);
+ if (isset($this->headers[$this->name]))
+ {
+ $this->headers[$this->name] .= ', ' . $this->value;
+ }
+ else
+ {
+ $this->headers[$this->name] = $this->value;
+ }
+ }
+ $this->name = '';
+ $this->value = '';
+ if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A")
+ {
+ $this->position += 2;
+ $this->state = 'body';
+ }
+ elseif ($this->data[$this->position] === "\x0A")
+ {
+ $this->position++;
+ $this->state = 'body';
+ }
+ else
+ {
+ $this->state = 'name';
+ }
+ }
+
+ /**
+ * Parse a header name
+ *
+ * @access private
+ */
+ function name()
+ {
+ $len = strcspn($this->data, "\x0A:", $this->position);
+ if (isset($this->data[$this->position + $len]))
+ {
+ if ($this->data[$this->position + $len] === "\x0A")
+ {
+ $this->position += $len;
+ $this->state = 'new_line';
+ }
+ else
+ {
+ $this->name = substr($this->data, $this->position, $len);
+ $this->position += $len + 1;
+ $this->state = 'value';
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ /**
+ * Parse LWS, replacing consecutive LWS characters with a single space
+ *
+ * @access private
+ */
+ function linear_whitespace()
+ {
+ do
+ {
+ if (substr($this->data, $this->position, 2) === "\x0D\x0A")
+ {
+ $this->position += 2;
+ }
+ elseif ($this->data[$this->position] === "\x0A")
+ {
+ $this->position++;
+ }
+ $this->position += strspn($this->data, "\x09\x20", $this->position);
+ } while ($this->has_data() && $this->is_linear_whitespace());
+ $this->value .= "\x20";
+ }
+
+ /**
+ * See what state to move to while within non-quoted header values
+ *
+ * @access private
+ */
+ function value()
+ {
+ if ($this->is_linear_whitespace())
+ {
+ $this->linear_whitespace();
+ }
+ else
+ {
+ switch ($this->data[$this->position])
+ {
+ case '"':
+ $this->position++;
+ $this->state = 'quote';
+ break;
+
+ case "\x0A":
+ $this->position++;
+ $this->state = 'new_line';
+ break;
+
+ default:
+ $this->state = 'value_char';
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parse a header value while outside quotes
+ *
+ * @access private
+ */
+ function value_char()
+ {
+ $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position);
+ $this->value .= substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'value';
+ }
+
+ /**
+ * See what state to move to while within quoted header values
+ *
+ * @access private
+ */
+ function quote()
+ {
+ if ($this->is_linear_whitespace())
+ {
+ $this->linear_whitespace();
+ }
+ else
+ {
+ switch ($this->data[$this->position])
+ {
+ case '"':
+ $this->position++;
+ $this->state = 'value';
+ break;
+
+ case "\x0A":
+ $this->position++;
+ $this->state = 'new_line';
+ break;
+
+ case '\\':
+ $this->position++;
+ $this->state = 'quote_escaped';
+ break;
+
+ default:
+ $this->state = 'quote_char';
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parse a header value while within quotes
+ *
+ * @access private
+ */
+ function quote_char()
+ {
+ $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position);
+ $this->value .= substr($this->data, $this->position, $len);
+ $this->position += $len;
+ $this->state = 'value';
+ }
+
+ /**
+ * Parse an escaped character within quotes
+ *
+ * @access private
+ */
+ function quote_escaped()
+ {
+ $this->value .= $this->data[$this->position];
+ $this->position++;
+ $this->state = 'quote';
+ }
+
+ /**
+ * Parse the body
+ *
+ * @access private
+ */
+ function body()
+ {
+ $this->body = substr($this->data, $this->position);
+ $this->state = 'emit';
+ }
+}
+
+/**
+ * gzdecode
+ *
+ * @package SimplePie
+ */
+class SimplePie_gzdecode
+{
+ /**
+ * Compressed data
+ *
+ * @access private
+ * @see gzdecode::$data
+ */
+ var $compressed_data;
+
+ /**
+ * Size of compressed data
+ *
+ * @access private
+ */
+ var $compressed_size;
+
+ /**
+ * Minimum size of a valid gzip string
+ *
+ * @access private
+ */
+ var $min_compressed_size = 18;
+
+ /**
+ * Current position of pointer
+ *
+ * @access private
+ */
+ var $position = 0;
+
+ /**
+ * Flags (FLG)
+ *
+ * @access private
+ */
+ var $flags;
+
+ /**
+ * Uncompressed data
+ *
+ * @access public
+ * @see gzdecode::$compressed_data
+ */
+ var $data;
+
+ /**
+ * Modified time
+ *
+ * @access public
+ */
+ var $MTIME;
+
+ /**
+ * Extra Flags
+ *
+ * @access public
+ */
+ var $XFL;
+
+ /**
+ * Operating System
+ *
+ * @access public
+ */
+ var $OS;
+
+ /**
+ * Subfield ID 1
+ *
+ * @access public
+ * @see gzdecode::$extra_field
+ * @see gzdecode::$SI2
+ */
+ var $SI1;
+
+ /**
+ * Subfield ID 2
+ *
+ * @access public
+ * @see gzdecode::$extra_field
+ * @see gzdecode::$SI1
+ */
+ var $SI2;
+
+ /**
+ * Extra field content
+ *
+ * @access public
+ * @see gzdecode::$SI1
+ * @see gzdecode::$SI2
+ */
+ var $extra_field;
+
+ /**
+ * Original filename
+ *
+ * @access public
+ */
+ var $filename;
+
+ /**
+ * Human readable comment
+ *
+ * @access public
+ */
+ var $comment;
+
+ /**
+ * Don't allow anything to be set
+ *
+ * @access public
+ */
+ function __set($name, $value)
+ {
+ trigger_error("Cannot write property $name", E_USER_ERROR);
+ }
+
+ /**
+ * Set the compressed string and related properties
+ *
+ * @access public
+ */
+ function SimplePie_gzdecode($data)
+ {
+ $this->compressed_data = $data;
+ $this->compressed_size = strlen($data);
+ }
+
+ /**
+ * Decode the GZIP stream
+ *
+ * @access public
+ */
+ function parse()
+ {
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Check ID1, ID2, and CM
+ if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08")
+ {
+ return false;
+ }
+
+ // Get the FLG (FLaGs)
+ $this->flags = ord($this->compressed_data[3]);
+
+ // FLG bits above (1 << 4) are reserved
+ if ($this->flags > 0x1F)
+ {
+ return false;
+ }
+
+ // Advance the pointer after the above
+ $this->position += 4;
+
+ // MTIME
+ $mtime = substr($this->compressed_data, $this->position, 4);
+ // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness
+ if (current(unpack('S', "\x00\x01")) === 1)
+ {
+ $mtime = strrev($mtime);
+ }
+ $this->MTIME = current(unpack('l', $mtime));
+ $this->position += 4;
+
+ // Get the XFL (eXtra FLags)
+ $this->XFL = ord($this->compressed_data[$this->position++]);
+
+ // Get the OS (Operating System)
+ $this->OS = ord($this->compressed_data[$this->position++]);
+
+ // Parse the FEXTRA
+ if ($this->flags & 4)
+ {
+ // Read subfield IDs
+ $this->SI1 = $this->compressed_data[$this->position++];
+ $this->SI2 = $this->compressed_data[$this->position++];
+
+ // SI2 set to zero is reserved for future use
+ if ($this->SI2 === "\x00")
+ {
+ return false;
+ }
+
+ // Get the length of the extra field
+ $len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
+ $position += 2;
+
+ // Check the length of the string is still valid
+ $this->min_compressed_size += $len + 4;
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Set the extra field to the given data
+ $this->extra_field = substr($this->compressed_data, $this->position, $len);
+ $this->position += $len;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Parse the FNAME
+ if ($this->flags & 8)
+ {
+ // Get the length of the filename
+ $len = strspn($this->compressed_data, "\x00", $this->position);
+
+ // Check the length of the string is still valid
+ $this->min_compressed_size += $len + 1;
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Set the original filename to the given string
+ $this->filename = substr($this->compressed_data, $this->position, $len);
+ $this->position += $len + 1;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Parse the FCOMMENT
+ if ($this->flags & 16)
+ {
+ // Get the length of the comment
+ $len = strspn($this->compressed_data, "\x00", $this->position);
+
+ // Check the length of the string is still valid
+ $this->min_compressed_size += $len + 1;
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Set the original comment to the given string
+ $this->comment = substr($this->compressed_data, $this->position, $len);
+ $this->position += $len + 1;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Parse the FHCRC
+ if ($this->flags & 2)
+ {
+ // Check the length of the string is still valid
+ $this->min_compressed_size += $len + 2;
+ if ($this->compressed_size >= $this->min_compressed_size)
+ {
+ // Read the CRC
+ $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
+
+ // Check the CRC matches
+ if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc)
+ {
+ $this->position += 2;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // Decompress the actual data
+ if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false)
+ {
+ return false;
+ }
+ else
+ {
+ $this->position = $this->compressed_size - 8;
+ }
+
+ // Check CRC of data
+ $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
+ $this->position += 4;
+ /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc))
+ {
+ return false;
+ }*/
+
+ // Check ISIZE of data
+ $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
+ $this->position += 4;
+ if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize))
+ {
+ return false;
+ }
+
+ // Wow, against all odds, we've actually got a valid gzip string
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
+
+class SimplePie_Cache
+{
+ /**
+ * Don't call the constructor. Please.
+ *
+ * @access private
+ */
+ function SimplePie_Cache()
+ {
+ trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR);
+ }
+
+ /**
+ * Create a new SimplePie_Cache object
+ *
+ * @static
+ * @access public
+ */
+ function create($location, $filename, $extension)
+ {
+ return new SimplePie_Cache_File($location, $filename, $extension);
+ }
+}
+
+class SimplePie_Cache_File
+{
+ var $location;
+ var $filename;
+ var $extension;
+ var $name;
+
+ function SimplePie_Cache_File($location, $filename, $extension)
+ {
+ $this->location = $location;
+ $this->filename = rawurlencode($filename);
+ $this->extension = rawurlencode($extension);
+ $this->name = "$location/$this->filename.$this->extension";
+ }
+
+ function save($data)
+ {
+ if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
+ {
+ if (is_a($data, 'SimplePie'))
+ {
+ $data = $data->data;
+ }
+
+ $data = serialize($data);
+
+ if (function_exists('file_put_contents'))
+ {
+ return (bool) file_put_contents($this->name, $data);
+ }
+ else
+ {
+ $fp = fopen($this->name, 'wb');
+ if ($fp)
+ {
+ fwrite($fp, $data);
+ fclose($fp);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ function load()
+ {
+ if (file_exists($this->name) && is_readable($this->name))
+ {
+ return unserialize(file_get_contents($this->name));
+ }
+ return false;
+ }
+
+ function mtime()
+ {
+ if (file_exists($this->name))
+ {
+ return filemtime($this->name);
+ }
+ return false;
+ }
+
+ function touch()
+ {
+ if (file_exists($this->name))
+ {
+ return touch($this->name);
+ }
+ return false;
+ }
+
+ function unlink()
+ {
+ if (file_exists($this->name))
+ {
+ return unlink($this->name);
+ }
+ return false;
+ }
+}
+
+class SimplePie_Misc
+{
+ function time_hms($seconds)
+ {
+ $time = '';
+
+ $hours = floor($seconds / 3600);
+ $remainder = $seconds % 3600;
+ if ($hours > 0)
+ {
+ $time .= $hours.':';
+ }
+
+ $minutes = floor($remainder / 60);
+ $seconds = $remainder % 60;
+ if ($minutes < 10 && $hours > 0)
+ {
+ $minutes = '0' . $minutes;
+ }
+ if ($seconds < 10)
+ {
+ $seconds = '0' . $seconds;
+ }
+
+ $time .= $minutes.':';
+ $time .= $seconds;
+
+ return $time;
+ }
+
+ function absolutize_url($relative, $base)
+ {
+ if ($relative !== '')
+ {
+ $relative = SimplePie_Misc::parse_url($relative);
+ if ($relative['scheme'] !== '')
+ {
+ $target = $relative;
+ }
+ elseif ($base !== '')
+ {
+ $base = SimplePie_Misc::parse_url($base);
+ $target = SimplePie_Misc::parse_url('');
+ if ($relative['authority'] !== '')
+ {
+ $target = $relative;
+ $target['scheme'] = $base['scheme'];
+ }
+ else
+ {
+ $target['scheme'] = $base['scheme'];
+ $target['authority'] = $base['authority'];
+ if ($relative['path'] !== '')
+ {
+ if (strpos($relative['path'], '/') === 0)
+ {
+ $target['path'] = $relative['path'];
+ }
+ elseif ($base['authority'] !== '' && $base['path'] === '')
+ {
+ $target['path'] = '/' . $relative['path'];
+ }
+ elseif (($last_segment = strrpos($base['path'], '/')) !== false)
+ {
+ $target['path'] = substr($base['path'], 0, $last_segment + 1) . $relative['path'];
+ }
+ else
+ {
+ $target['path'] = $relative['path'];
+ }
+ $target['query'] = $relative['query'];
+ }
+ else
+ {
+ $target['path'] = $base['path'];
+ if ($relative['query'] !== '')
+ {
+ $target['query'] = $relative['query'];
+ }
+ elseif ($base['query'] !== '')
+ {
+ $target['query'] = $base['query'];
+ }
+ }
+ }
+ $target['fragment'] = $relative['fragment'];
+ }
+ else
+ {
+ // No base URL, just return the relative URL
+ $target = $relative;
+ }
+ $return = SimplePie_Misc::compress_parse_url($target['scheme'], $target['authority'], $target['path'], $target['query'], $target['fragment']);
+ }
+ else
+ {
+ $return = $base;
+ }
+ $return = SimplePie_Misc::normalize_url($return);
+ return $return;
+ }
+
+ function remove_dot_segments($input)
+ {
+ $output = '';
+ while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input == '.' || $input == '..')
+ {
+ // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
+ if (strpos($input, '../') === 0)
+ {
+ $input = substr($input, 3);
+ }
+ elseif (strpos($input, './') === 0)
+ {
+ $input = substr($input, 2);
+ }
+ // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise,
+ elseif (strpos($input, '/./') === 0)
+ {
+ $input = substr_replace($input, '/', 0, 3);
+ }
+ elseif ($input == '/.')
+ {
+ $input = '/';
+ }
+ // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise,
+ elseif (strpos($input, '/../') === 0)
+ {
+ $input = substr_replace($input, '/', 0, 4);
+ $output = substr_replace($output, '', strrpos($output, '/'));
+ }
+ elseif ($input == '/..')
+ {
+ $input = '/';
+ $output = substr_replace($output, '', strrpos($output, '/'));
+ }
+ // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
+ elseif ($input == '.' || $input == '..')
+ {
+ $input = '';
+ }
+ // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer
+ elseif (($pos = strpos($input, '/', 1)) !== false)
+ {
+ $output .= substr($input, 0, $pos);
+ $input = substr_replace($input, '', 0, $pos);
+ }
+ else
+ {
+ $output .= $input;
+ $input = '';
+ }
+ }
+ return $output . $input;
+ }
+
+ function get_element($realname, $string)
+ {
+ $return = array();
+ $name = preg_quote($realname, '/');
+ if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
+ {
+ for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
+ {
+ $return[$i]['tag'] = $realname;
+ $return[$i]['full'] = $matches[$i][0][0];
+ $return[$i]['offset'] = $matches[$i][0][1];
+ if (strlen($matches[$i][3][0]) <= 2)
+ {
+ $return[$i]['self_closing'] = true;
+ }
+ else
+ {
+ $return[$i]['self_closing'] = false;
+ $return[$i]['content'] = $matches[$i][4][0];
+ }
+ $return[$i]['attribs'] = array();
+ if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER))
+ {
+ for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
+ {
+ if (count($attribs[$j]) == 2)
+ {
+ $attribs[$j][2] = $attribs[$j][1];
+ }
+ $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]), 'UTF-8');
+ }
+ }
+ }
+ }
+ return $return;
+ }
+
+ function element_implode($element)
+ {
+ $full = "<$element[tag]";
+ foreach ($element['attribs'] as $key => $value)
+ {
+ $key = strtolower($key);
+ $full .= " $key=\"" . htmlspecialchars($value['data']) . '"';
+ }
+ if ($element['self_closing'])
+ {
+ $full .= ' />';
+ }
+ else
+ {
+ $full .= ">$element[content]</$element[tag]>";
+ }
+ return $full;
+ }
+
+ function error($message, $level, $file, $line)
+ {
+ switch ($level)
+ {
+ case E_USER_ERROR:
+ $note = 'PHP Error';
+ break;
+ case E_USER_WARNING:
+ $note = 'PHP Warning';
+ break;
+ case E_USER_NOTICE:
+ $note = 'PHP Notice';
+ break;
+ default:
+ $note = 'Unknown Error';
+ break;
+ }
+ error_log("$note: $message in $file on line $line", 0);
+ return $message;
+ }
+
+ /**
+ * If a file has been cached, retrieve and display it.
+ *
+ * This is most useful for caching images (get_favicon(), etc.),
+ * however it works for all cached files. This WILL NOT display ANY
+ * file/image/page/whatever, but rather only display what has already
+ * been cached by SimplePie.
+ *
+ * @access public
+ * @see SimplePie::get_favicon()
+ * @param str $identifier_url URL that is used to identify the content.
+ * This may or may not be the actual URL of the live content.
+ * @param str $cache_location Location of SimplePie's cache. Defaults
+ * to './cache'.
+ * @param str $cache_extension The file extension that the file was
+ * cached with. Defaults to 'spc'.
+ * @param str $cache_class Name of the cache-handling class being used
+ * in SimplePie. Defaults to 'SimplePie_Cache', and should be left
+ * as-is unless you've overloaded the class.
+ * @param str $cache_name_function Obsolete. Exists for backwards
+ * compatibility reasons only.
+ */
+ function display_cached_file($identifier_url, $cache_location = './cache', $cache_extension = 'spc', $cache_class = 'SimplePie_Cache', $cache_name_function = 'md5')
+ {
+ $cache = call_user_func(array($cache_class, 'create'), $cache_location, $identifier_url, $cache_extension);
+
+ if ($file = $cache->load())
+ {
+ if (isset($file['headers']['content-type']))
+ {
+ header('Content-type:' . $file['headers']['content-type']);
+ }
+ else
+ {
+ header('Content-type: application/octet-stream');
+ }
+ header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
+ echo $file['body'];
+ exit;
+ }
+
+ die('Cached file for ' . $identifier_url . ' cannot be found.');
+ }
+
+ function fix_protocol($url, $http = 1)
+ {
+ $url = SimplePie_Misc::normalize_url($url);
+ $parsed = SimplePie_Misc::parse_url($url);
+ if ($parsed['scheme'] !== '' && $parsed['scheme'] != 'http' && $parsed['scheme'] != 'https')
+ {
+ return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
+ }
+
+ if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
+ {
+ return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
+ }
+
+ if ($http == 2 && $parsed['scheme'] !== '')
+ {
+ return "feed:$url";
+ }
+ elseif ($http == 3 && strtolower($parsed['scheme']) == 'http')
+ {
+ return substr_replace($url, 'podcast', 0, 4);
+ }
+ elseif ($http == 4 && strtolower($parsed['scheme']) == 'http')
+ {
+ return substr_replace($url, 'itpc', 0, 4);
+ }
+ else
+ {
+ return $url;
+ }
+ }
+
+ function parse_url($url)
+ {
+ static $cache = array();
+ if (isset($cache[$url]))
+ {
+ return $cache[$url];
+ }
+ elseif (preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/', $url, $match))
+ {
+ for ($i = count($match); $i <= 9; $i++)
+ {
+ $match[$i] = '';
+ }
+ return $cache[$url] = array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]);
+ }
+ else
+ {
+ return $cache[$url] = array('scheme' => '', 'authority' => '', 'path' => '', 'query' => '', 'fragment' => '');
+ }
+ }
+
+ function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
+ {
+ $return = '';
+ if ($scheme !== '')
+ {
+ $return .= "$scheme:";
+ }
+ if ($authority !== '')
+ {
+ $return .= "//$authority";
+ }
+ if ($path !== '')
+ {
+ $return .= $path;
+ }
+ if ($query !== '')
+ {
+ $return .= "?$query";
+ }
+ if ($fragment !== '')
+ {
+ $return .= "#$fragment";
+ }
+ return $return;
+ }
+
+ function normalize_url($url)
+ {
+ $url = preg_replace_callback('/%([0-9A-Fa-f]{2})/', array('SimplePie_Misc', 'percent_encoding_normalization'), $url);
+ $url = SimplePie_Misc::parse_url($url);
+ $url['scheme'] = strtolower($url['scheme']);
+ if ($url['authority'] !== '')
+ {
+ $url['authority'] = strtolower($url['authority']);
+ $url['path'] = SimplePie_Misc::remove_dot_segments($url['path']);
+ }
+ return SimplePie_Misc::compress_parse_url($url['scheme'], $url['authority'], $url['path'], $url['query'], $url['fragment']);
+ }
+
+ function percent_encoding_normalization($match)
+ {
+ $integer = hexdec($match[1]);
+ if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer == 0x2D || $integer == 0x2E || $integer == 0x5F || $integer == 0x7E)
+ {
+ return chr($integer);
+ }
+ else
+ {
+ return strtoupper($match[0]);
+ }
+ }
+
+ /**
+ * Remove bad UTF-8 bytes
+ *
+ * PCRE Pattern to locate bad bytes in a UTF-8 string comes from W3C
+ * FAQ: Multilingual Forms (modified to include full ASCII range)
+ *
+ * @author Geoffrey Sneddon
+ * @see http://www.w3.org/International/questions/qa-forms-utf-8
+ * @param string $str String to remove bad UTF-8 bytes from
+ * @return string UTF-8 string
+ */
+ function utf8_bad_replace($str)
+ {
+ if (function_exists('iconv') && ($return = @iconv('UTF-8', 'UTF-8//IGNORE', $str)))
+ {
+ return $return;
+ }
+ elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($str, 'UTF-8', 'UTF-8')))
+ {
+ return $return;
+ }
+ elseif (preg_match_all('/(?:[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})+/', $str, $matches))
+ {
+ return implode("\xEF\xBF\xBD", $matches[0]);
+ }
+ elseif ($str !== '')
+ {
+ return "\xEF\xBF\xBD";
+ }
+ else
+ {
+ return '';
+ }
+ }
+
+ /**
+ * Converts a Windows-1252 encoded string to a UTF-8 encoded string
+ *
+ * @static
+ * @access public
+ * @param string $string Windows-1252 encoded string
+ * @return string UTF-8 encoded string
+ */
+ function windows_1252_to_utf8($string)
+ {
+ static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF");
+
+ return strtr($string, $convert_table);
+ }
+
+ function change_encoding($data, $input, $output)
+ {
+ $input = SimplePie_Misc::encoding($input);
+ $output = SimplePie_Misc::encoding($output);
+
+ // We fail to fail on non US-ASCII bytes
+ if ($input === 'US-ASCII')
+ {
+ static $non_ascii_octects = '';
+ if (!$non_ascii_octects)
+ {
+ for ($i = 0x80; $i <= 0xFF; $i++)
+ {
+ $non_ascii_octects .= chr($i);
+ }
+ }
+ $data = substr($data, 0, strcspn($data, $non_ascii_octects));
+ }
+
+ // This is first, as behaviour of this is completely predictable
+ if ($input === 'Windows-1252' && $output === 'UTF-8')
+ {
+ return SimplePie_Misc::windows_1252_to_utf8($data);
+ }
+ // This is second, as behaviour of this varies only with PHP version
+ elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($data, $output, $input)))
+ {
+ return $return;
+ }
+ // This is last, as behaviour of this varies with OS userland and PHP version
+ elseif (function_exists('iconv') && ($return = @iconv($input, $output, $data)))
+ {
+ return $return;
+ }
+ // If we can't do anything, just fail
+ else
+ {
+ return false;
+ }
+ }
+
+ function encoding($charset)
+ {
+ /* Character sets are case-insensitive, and also need some further
+ normalization in the real world (though we'll return them in the form given
+ in their registration). */
+ switch (strtolower(preg_replace('/[\x09-\x0D\x20-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]/', '', $charset)))
+ {
+ case 'adobestandardencoding':
+ case 'csadobestandardencoding':
+ return 'Adobe-Standard-Encoding';
+
+ case 'adobesymbolencoding':
+ case 'cshppsmath':
+ return 'Adobe-Symbol-Encoding';
+
+ case 'ami1251':
+ case 'ami1251':
+ case 'amiga1251':
+ case 'amiga1251':
+ return 'Amiga-1251';
+
+ case 'ansix31101983':
+ case 'csat5001983':
+ case 'csiso99naplps':
+ case 'isoir99':
+ case 'naplps':
+ return 'ANSI_X3.110-1983';
+
+ case 'arabic7':
+ case 'asmo449':
+ case 'csiso89asmo449':
+ case 'isoir89':
+ case 'iso9036':
+ return 'ASMO_449';
+
+ case 'big5':
+ case 'csbig5':
+ case 'xxbig5':
+ return 'Big5';
+
+ case 'big5hkscs':
+ return 'Big5-HKSCS';
+
+ case 'bocu1':
+ case 'csbocu1':
+ return 'BOCU-1';
+
+ case 'brf':
+ case 'csbrf':
+ return 'BRF';
+
+ case 'bs4730':
+ case 'csiso4unitedkingdom':
+ case 'gb':
+ case 'isoir4':
+ case 'iso646gb':
+ case 'uk':
+ return 'BS_4730';
+
+ case 'bsviewdata':
+ case 'csiso47bsviewdata':
+ case 'isoir47':
+ return 'BS_viewdata';
+
+ case 'cesu8':
+ case 'cscesu8':
+ return 'CESU-8';
+
+ case 'ca':
+ case 'csa71':
+ case 'csaz243419851':
+ case 'csiso121canadian1':
+ case 'isoir121':
+ case 'iso646ca':
+ return 'CSA_Z243.4-1985-1';
+
+ case 'csa72':
+ case 'csaz243419852':
+ case 'csiso122canadian2':
+ case 'isoir122':
+ case 'iso646ca2':
+ return 'CSA_Z243.4-1985-2';
+
+ case 'csaz24341985gr':
+ case 'csiso123csaz24341985gr':
+ case 'isoir123':
+ return 'CSA_Z243.4-1985-gr';
+
+ case 'csiso139csn369103':
+ case 'csn369103':
+ case 'isoir139':
+ return 'CSN_369103';
+
+ case 'csdecmcs':
+ case 'dec':
+ case 'decmcs':
+ return 'DEC-MCS';
+
+ case 'csiso21german':
+ case 'de':
+ case 'din66003':
+ case 'isoir21':
+ case 'iso646de':
+ return 'DIN_66003';
+
+ case 'csdkus':
+ case 'dkus':
+ return 'dk-us';
+
+ case 'csiso646danish':
+ case 'dk':
+ case 'ds2089':
+ case 'ds2089':
+ case 'iso646dk':
+ return 'DS_2089';
+
+ case 'csibmebcdicatde':
+ case 'ebcdicatde':
+ return 'EBCDIC-AT-DE';
+
+ case 'csebcdicatdea':
+ case 'ebcdicatdea':
+ return 'EBCDIC-AT-DE-A';
+
+ case 'csebcdiccafr':
+ case 'ebcdiccafr':
+ return 'EBCDIC-CA-FR';
+
+ case 'csebcdicdkno':
+ case 'ebcdicdkno':
+ return 'EBCDIC-DK-NO';
+
+ case 'csebcdicdknoa':
+ case 'ebcdicdknoa':
+ return 'EBCDIC-DK-NO-A';
+
+ case 'csebcdices':
+ case 'ebcdices':
+ return 'EBCDIC-ES';
+
+ case 'csebcdicesa':
+ case 'ebcdicesa':
+ return 'EBCDIC-ES-A';
+
+ case 'csebcdicess':
+ case 'ebcdicess':
+ return 'EBCDIC-ES-S';
+
+ case 'csebcdicfise':
+ case 'ebcdicfise':
+ return 'EBCDIC-FI-SE';
+
+ case 'csebcdicfisea':
+ case 'ebcdicfisea':
+ return 'EBCDIC-FI-SE-A';
+
+ case 'csebcdicfr':
+ case 'ebcdicfr':
+ return 'EBCDIC-FR';
+
+ case 'csebcdicit':
+ case 'ebcdicit':
+ return 'EBCDIC-IT';
+
+ case 'csebcdicpt':
+ case 'ebcdicpt':
+ return 'EBCDIC-PT';
+
+ case 'csebcdicuk':
+ case 'ebcdicuk':
+ return 'EBCDIC-UK';
+
+ case 'csebcdicus':
+ case 'ebcdicus':
+ return 'EBCDIC-US';
+
+ case 'csiso111ecmacyrillic':
+ case 'ecmacyrillic':
+ case 'isoir111':
+ case 'koi8e':
+ return 'ECMA-cyrillic';
+
+ case 'csiso17spanish':
+ case 'es':
+ case 'isoir17':
+ case 'iso646es':
+ return 'ES';
+
+ case 'csiso85spanish2':
+ case 'es2':
+ case 'isoir85':
+ case 'iso646es2':
+ return 'ES2';
+
+ case 'cseucfixwidjapanese':
+ case 'extendedunixcodefixedwidthforjapanese':
+ return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
+
+ case 'cseucpkdfmtjapanese':
+ case 'eucjp':
+ case 'extendedunixcodepackedformatforjapanese':
+ return 'Extended_UNIX_Code_Packed_Format_for_Japanese';
+
+ case 'gb18030':
+ return 'GB18030';
+
+ case 'cp936':
+ case 'gbk':
+ case 'ms936':
+ case 'windows936':
+ case 'csgb2312':
+ case 'gb2312':
+ case 'chinese':
+ case 'csiso58gb231280':
+ case 'gb231280':
+ case 'isoir58':
+ return 'GBK';
+
+ case 'cn':
+ case 'csiso57gb1988':
+ case 'gb198880':
+ case 'isoir57':
+ case 'iso646cn':
+ return 'GB_1988-80';
+
+ case 'csiso153gost1976874':
+ case 'gost1976874':
+ case 'isoir153':
+ case 'stsev35888':
+ return 'GOST_19768-74';
+
+ case 'csiso150':
+ case 'csiso150greekccitt':
+ case 'greekccitt':
+ case 'isoir150':
+ return 'greek-ccitt';
+
+ case 'csiso88greek7':
+ case 'greek7':
+ case 'isoir88':
+ return 'greek7';
+
+ case 'csiso18greek7old':
+ case 'greek7old':
+ case 'isoir18':
+ return 'greek7-old';
+
+ case 'cshpdesktop':
+ case 'hpdesktop':
+ return 'HP-DeskTop';
+
+ case 'cshplegal':
+ case 'hplegal':
+ return 'HP-Legal';
+
+ case 'cshpmath8':
+ case 'hpmath8':
+ return 'HP-Math8';
+
+ case 'cshppifont':
+ case 'hppifont':
+ return 'HP-Pi-font';
+
+ case 'cshproman8':
+ case 'hproman8':
+ case 'r8':
+ case 'roman8':
+ return 'hp-roman8';
+
+ case 'hzgb2312':
+ return 'HZ-GB-2312';
+
+ case 'csibmsymbols':
+ case 'ibmsymbols':
+ return 'IBM-Symbols';
+
+ case 'csibmthai':
+ case 'ibmthai':
+ return 'IBM-Thai';
+
+ case 'ccsid00858':
+ case 'cp00858':
+ case 'ibm00858':
+ case 'pcmultilingual850euro':
+ return 'IBM00858';
+
+ case 'ccsid00924':
+ case 'cp00924':
+ case 'ebcdiclatin9euro':
+ case 'ibm00924':
+ return 'IBM00924';
+
+ case 'ccsid01140':
+ case 'cp01140':
+ case 'ebcdicus37euro':
+ case 'ibm01140':
+ return 'IBM01140';
+
+ case 'ccsid01141':
+ case 'cp01141':
+ case 'ebcdicde273euro':
+ case 'ibm01141':
+ return 'IBM01141';
+
+ case 'ccsid01142':
+ case 'cp01142':
+ case 'ebcdicdk277euro':
+ case 'ebcdicno277euro':
+ case 'ibm01142':
+ return 'IBM01142';
+
+ case 'ccsid01143':
+ case 'cp01143':
+ case 'ebcdicfi278euro':
+ case 'ebcdicse278euro':
+ case 'ibm01143':
+ return 'IBM01143';
+
+ case 'ccsid01144':
+ case 'cp01144':
+ case 'ebcdicit280euro':
+ case 'ibm01144':
+ return 'IBM01144';
+
+ case 'ccsid01145':
+ case 'cp01145':
+ case 'ebcdices284euro':
+ case 'ibm01145':
+ return 'IBM01145';
+
+ case 'ccsid01146':
+ case 'cp01146':
+ case 'ebcdicgb285euro':
+ case 'ibm01146':
+ return 'IBM01146';
+
+ case 'ccsid01147':
+ case 'cp01147':
+ case 'ebcdicfr297euro':
+ case 'ibm01147':
+ return 'IBM01147';
+
+ case 'ccsid01148':
+ case 'cp01148':
+ case 'ebcdicinternational500euro':
+ case 'ibm01148':
+ return 'IBM01148';
+
+ case 'ccsid01149':
+ case 'cp01149':
+ case 'ebcdicis871euro':
+ case 'ibm01149':
+ return 'IBM01149';
+
+ case 'cp037':
+ case 'csibm037':
+ case 'ebcdiccpca':
+ case 'ebcdiccpnl':
+ case 'ebcdiccpus':
+ case 'ebcdiccpwt':
+ case 'ibm037':
+ return 'IBM037';
+
+ case 'cp038':
+ case 'csibm038':
+ case 'ebcdicint':
+ case 'ibm038':
+ return 'IBM038';
+
+ case 'cp273':
+ case 'csibm273':
+ case 'ibm273':
+ return 'IBM273';
+
+ case 'cp274':
+ case 'csibm274':
+ case 'ebcdicbe':
+ case 'ibm274':
+ return 'IBM274';
+
+ case 'cp275':
+ case 'csibm275':
+ case 'ebcdicbr':
+ case 'ibm275':
+ return 'IBM275';
+
+ case 'csibm277':
+ case 'ebcdiccpdk':
+ case 'ebcdiccpno':
+ case 'ibm277':
+ return 'IBM277';
+
+ case 'cp278':
+ case 'csibm278':
+ case 'ebcdiccpfi':
+ case 'ebcdiccpse':
+ case 'ibm278':
+ return 'IBM278';
+
+ case 'cp280':
+ case 'csibm280':
+ case 'ebcdiccpit':
+ case 'ibm280':
+ return 'IBM280';
+
+ case 'cp281':
+ case 'csibm281':
+ case 'ebcdicjpe':
+ case 'ibm281':
+ return 'IBM281';
+
+ case 'cp284':
+ case 'csibm284':
+ case 'ebcdiccpes':
+ case 'ibm284':
+ return 'IBM284';
+
+ case 'cp285':
+ case 'csibm285':
+ case 'ebcdiccpgb':
+ case 'ibm285':
+ return 'IBM285';
+
+ case 'cp290':
+ case 'csibm290':
+ case 'ebcdicjpkana':
+ case 'ibm290':
+ return 'IBM290';
+
+ case 'cp297':
+ case 'csibm297':
+ case 'ebcdiccpfr':
+ case 'ibm297':
+ return 'IBM297';
+
+ case 'cp420':
+ case 'csibm420':
+ case 'ebcdiccpar1':
+ case 'ibm420':
+ return 'IBM420';
+
+ case 'cp423':
+ case 'csibm423':
+ case 'ebcdiccpgr':
+ case 'ibm423':
+ return 'IBM423';
+
+ case 'cp424':
+ case 'csibm424':
+ case 'ebcdiccphe':
+ case 'ibm424':
+ return 'IBM424';
+
+ case '437':
+ case 'cp437':
+ case 'cspc8codepage437':
+ case 'ibm437':
+ return 'IBM437';
+
+ case 'cp500':
+ case 'csibm500':
+ case 'ebcdiccpbe':
+ case 'ebcdiccpch':
+ case 'ibm500':
+ return 'IBM500';
+
+ case 'cp775':
+ case 'cspc775baltic':
+ case 'ibm775':
+ return 'IBM775';
+
+ case '850':
+ case 'cp850':
+ case 'cspc850multilingual':
+ case 'ibm850':
+ return 'IBM850';
+
+ case '851':
+ case 'cp851':
+ case 'csibm851':
+ case 'ibm851':
+ return 'IBM851';
+
+ case '852':
+ case 'cp852':
+ case 'cspcp852':
+ case 'ibm852':
+ return 'IBM852';
+
+ case '855':
+ case 'cp855':
+ case 'csibm855':
+ case 'ibm855':
+ return 'IBM855';
+
+ case '857':
+ case 'cp857':
+ case 'csibm857':
+ case 'ibm857':
+ return 'IBM857';
+
+ case '860':
+ case 'cp860':
+ case 'csibm860':
+ case 'ibm860':
+ return 'IBM860';
+
+ case '861':
+ case 'cpis':
+ case 'cp861':
+ case 'csibm861':
+ case 'ibm861':
+ return 'IBM861';
+
+ case '862':
+ case 'cp862':
+ case 'cspc862latinhebrew':
+ case 'ibm862':
+ return 'IBM862';
+
+ case '863':
+ case 'cp863':
+ case 'csibm863':
+ case 'ibm863':
+ return 'IBM863';
+
+ case 'cp864':
+ case 'csibm864':
+ case 'ibm864':
+ return 'IBM864';
+
+ case '865':
+ case 'cp865':
+ case 'csibm865':
+ case 'ibm865':
+ return 'IBM865';
+
+ case '866':
+ case 'cp866':
+ case 'csibm866':
+ case 'ibm866':
+ return 'IBM866';
+
+ case 'cpar':
+ case 'cp868':
+ case 'csibm868':
+ case 'ibm868':
+ return 'IBM868';
+
+ case '869':
+ case 'cpgr':
+ case 'cp869':
+ case 'csibm869':
+ case 'ibm869':
+ return 'IBM869';
+
+ case 'cp870':
+ case 'csibm870':
+ case 'ebcdiccproece':
+ case 'ebcdiccpyu':
+ case 'ibm870':
+ return 'IBM870';
+
+ case 'cp871':
+ case 'csibm871':
+ case 'ebcdiccpis':
+ case 'ibm871':
+ return 'IBM871';
+
+ case 'cp880':
+ case 'csibm880':
+ case 'ebcdiccyrillic':
+ case 'ibm880':
+ return 'IBM880';
+
+ case 'cp891':
+ case 'csibm891':
+ case 'ibm891':
+ return 'IBM891';
+
+ case 'cp903':
+ case 'csibm903':
+ case 'ibm903':
+ return 'IBM903';
+
+ case '904':
+ case 'cp904':
+ case 'csibbm904':
+ case 'ibm904':
+ return 'IBM904';
+
+ case 'cp905':
+ case 'csibm905':
+ case 'ebcdiccptr':
+ case 'ibm905':
+ return 'IBM905';
+
+ case 'cp918':
+ case 'csibm918':
+ case 'ebcdiccpar2':
+ case 'ibm918':
+ return 'IBM918';
+
+ case 'cp1026':
+ case 'csibm1026':
+ case 'ibm1026':
+ return 'IBM1026';
+
+ case 'ibm1047':
+ case 'ibm1047':
+ return 'IBM1047';
+
+ case 'csiso143iecp271':
+ case 'iecp271':
+ case 'isoir143':
+ return 'IEC_P27-1';
+
+ case 'csiso49inis':
+ case 'inis':
+ case 'isoir49':
+ return 'INIS';
+
+ case 'csiso50inis8':
+ case 'inis8':
+ case 'isoir50':
+ return 'INIS-8';
+
+ case 'csiso51iniscyrillic':
+ case 'iniscyrillic':
+ case 'isoir51':
+ return 'INIS-cyrillic';
+
+ case 'csinvariant':
+ case 'invariant':
+ return 'INVARIANT';
+
+ case 'iso2022cn':
+ return 'ISO-2022-CN';
+
+ case 'iso2022cnext':
+ return 'ISO-2022-CN-EXT';
+
+ case 'csiso2022jp':
+ case 'iso2022jp':
+ return 'ISO-2022-JP';
+
+ case 'csiso2022jp2':
+ case 'iso2022jp2':
+ return 'ISO-2022-JP-2';
+
+ case 'csiso2022kr':
+ case 'iso2022kr':
+ return 'ISO-2022-KR';
+
+ case 'cswindows30latin1':
+ case 'iso88591windows30latin1':
+ return 'ISO-8859-1-Windows-3.0-Latin-1';
+
+ case 'cswindows31latin1':
+ case 'iso88591windows31latin1':
+ return 'ISO-8859-1-Windows-3.1-Latin-1';
+
+ case 'csisolatin2':
+ case 'iso88592':
+ case 'isoir101':
+ case 'iso88592':
+ case 'iso885921987':
+ case 'l2':
+ case 'latin2':
+ return 'ISO-8859-2';
+
+ case 'cswindows31latin2':
+ case 'iso88592windowslatin2':
+ return 'ISO-8859-2-Windows-Latin-2';
+
+ case 'csisolatin3':
+ case 'iso88593':
+ case 'isoir109':
+ case 'iso88593':
+ case 'iso885931988':
+ case 'l3':
+ case 'latin3':
+ return 'ISO-8859-3';
+
+ case 'csisolatin4':
+ case 'iso88594':
+ case 'isoir110':
+ case 'iso88594':
+ case 'iso885941988':
+ case 'l4':
+ case 'latin4':
+ return 'ISO-8859-4';
+
+ case 'csisolatincyrillic':
+ case 'cyrillic':
+ case 'iso88595':
+ case 'isoir144':
+ case 'iso88595':
+ case 'iso885951988':
+ return 'ISO-8859-5';
+
+ case 'arabic':
+ case 'asmo708':
+ case 'csisolatinarabic':
+ case 'ecma114':
+ case 'iso88596':
+ case 'isoir127':
+ case 'iso88596':
+ case 'iso885961987':
+ return 'ISO-8859-6';
+
+ case 'csiso88596e':
+ case 'iso88596e':
+ case 'iso88596e':
+ return 'ISO-8859-6-E';
+
+ case 'csiso88596i':
+ case 'iso88596i':
+ case 'iso88596i':
+ return 'ISO-8859-6-I';
+
+ case 'csisolatingreek':
+ case 'ecma118':
+ case 'elot928':
+ case 'greek':
+ case 'greek8':
+ case 'iso88597':
+ case 'isoir126':
+ case 'iso88597':
+ case 'iso885971987':
+ return 'ISO-8859-7';
+
+ case 'csisolatinhebrew':
+ case 'hebrew':
+ case 'iso88598':
+ case 'isoir138':
+ case 'iso88598':
+ case 'iso885981988':
+ return 'ISO-8859-8';
+
+ case 'csiso88598e':
+ case 'iso88598e':
+ case 'iso88598e':
+ return 'ISO-8859-8-E';
+
+ case 'csiso88598i':
+ case 'iso88598i':
+ case 'iso88598i':
+ return 'ISO-8859-8-I';
+
+ case 'cswindows31latin5':
+ case 'iso88599windowslatin5':
+ return 'ISO-8859-9-Windows-Latin-5';
+
+ case 'csisolatin6':
+ case 'iso885910':
+ case 'isoir157':
+ case 'iso8859101992':
+ case 'l6':
+ case 'latin6':
+ return 'ISO-8859-10';
+
+ case 'iso885913':
+ return 'ISO-8859-13';
+
+ case 'iso885914':
+ case 'isoceltic':
+ case 'isoir199':
+ case 'iso885914':
+ case 'iso8859141998':
+ case 'l8':
+ case 'latin8':
+ return 'ISO-8859-14';
+
+ case 'iso885915':
+ case 'iso885915':
+ case 'latin9':
+ return 'ISO-8859-15';
+
+ case 'iso885916':
+ case 'isoir226':
+ case 'iso885916':
+ case 'iso8859162001':
+ case 'l10':
+ case 'latin10':
+ return 'ISO-8859-16';
+
+ case 'iso10646j1':
+ return 'ISO-10646-J-1';
+
+ case 'csunicode':
+ case 'iso10646ucs2':
+ return 'ISO-10646-UCS-2';
+
+ case 'csucs4':
+ case 'iso10646ucs4':
+ return 'ISO-10646-UCS-4';
+
+ case 'csunicodeascii':
+ case 'iso10646ucsbasic':
+ return 'ISO-10646-UCS-Basic';
+
+ case 'csunicodelatin1':
+ case 'iso10646':
+ case 'iso10646unicodelatin1':
+ return 'ISO-10646-Unicode-Latin1';
+
+ case 'csiso10646utf1':
+ case 'iso10646utf1':
+ return 'ISO-10646-UTF-1';
+
+ case 'csiso115481':
+ case 'iso115481':
+ case 'iso115481':
+ case 'isotr115481':
+ return 'ISO-11548-1';
+
+ case 'csiso90':
+ case 'isoir90':
+ return 'iso-ir-90';
+
+ case 'csunicodeibm1261':
+ case 'isounicodeibm1261':
+ return 'ISO-Unicode-IBM-1261';
+
+ case 'csunicodeibm1264':
+ case 'isounicodeibm1264':
+ return 'ISO-Unicode-IBM-1264';
+
+ case 'csunicodeibm1265':
+ case 'isounicodeibm1265':
+ return 'ISO-Unicode-IBM-1265';
+
+ case 'csunicodeibm1268':
+ case 'isounicodeibm1268':
+ return 'ISO-Unicode-IBM-1268';
+
+ case 'csunicodeibm1276':
+ case 'isounicodeibm1276':
+ return 'ISO-Unicode-IBM-1276';
+
+ case 'csiso646basic1983':
+ case 'iso646basic1983':
+ case 'ref':
+ return 'ISO_646.basic:1983';
+
+ case 'csiso2intlrefversion':
+ case 'irv':
+ case 'isoir2':
+ case 'iso646irv1983':
+ return 'ISO_646.irv:1983';
+
+ case 'csiso2033':
+ case 'e13b':
+ case 'isoir98':
+ case 'iso20331983':
+ return 'ISO_2033-1983';
+
+ case 'csiso5427cyrillic':
+ case 'isoir37':
+ case 'iso5427':
+ return 'ISO_5427';
+
+ case 'isoir54':
+ case 'iso5427cyrillic1981':
+ case 'iso54271981':
+ return 'ISO_5427:1981';
+
+ case 'csiso5428greek':
+ case 'isoir55':
+ case 'iso54281980':
+ return 'ISO_5428:1980';
+
+ case 'csiso6937add':
+ case 'isoir152':
+ case 'iso6937225':
+ return 'ISO_6937-2-25';
+
+ case 'csisotextcomm':
+ case 'isoir142':
+ case 'iso69372add':
+ return 'ISO_6937-2-add';
+
+ case 'csiso8859supp':
+ case 'isoir154':
+ case 'iso8859supp':
+ case 'latin125':
+ return 'ISO_8859-supp';
+
+ case 'csiso10367box':
+ case 'isoir155':
+ case 'iso10367box':
+ return 'ISO_10367-box';
+
+ case 'csiso15italian':
+ case 'isoir15':
+ case 'iso646it':
+ case 'it':
+ return 'IT';
+
+ case 'csiso13jisc6220jp':
+ case 'isoir13':
+ case 'jisc62201969':
+ case 'jisc62201969jp':
+ case 'katakana':
+ case 'x02017':
+ return 'JIS_C6220-1969-jp';
+
+ case 'csiso14jisc6220ro':
+ case 'isoir14':
+ case 'iso646jp':
+ case 'jisc62201969ro':
+ case 'jp':
+ return 'JIS_C6220-1969-ro';
+
+ case 'csiso42jisc62261978':
+ case 'isoir42':
+ case 'jisc62261978':
+ return 'JIS_C6226-1978';
+
+ case 'csiso87jisx0208':
+ case 'isoir87':
+ case 'jisc62261983':
+ case 'jisx02081983':
+ case 'x0208':
+ return 'JIS_C6226-1983';
+
+ case 'csiso91jisc62291984a':
+ case 'isoir91':
+ case 'jisc62291984a':
+ case 'jpocra':
+ return 'JIS_C6229-1984-a';
+
+ case 'csiso92jisc62991984b':
+ case 'isoir92':
+ case 'iso646jpocrb':
+ case 'jisc62291984b':
+ case 'jpocrb':
+ return 'JIS_C6229-1984-b';
+
+ case 'csiso93jis62291984badd':
+ case 'isoir93':
+ case 'jisc62291984badd':
+ case 'jpocrbadd':
+ return 'JIS_C6229-1984-b-add';
+
+ case 'csiso94jis62291984hand':
+ case 'isoir94':
+ case 'jisc62291984hand':
+ case 'jpocrhand':
+ return 'JIS_C6229-1984-hand';
+
+ case 'csiso95jis62291984handadd':
+ case 'isoir95':
+ case 'jisc62291984handadd':
+ case 'jpocrhandadd':
+ return 'JIS_C6229-1984-hand-add';
+
+ case 'csiso96jisc62291984kana':
+ case 'isoir96':
+ case 'jisc62291984kana':
+ return 'JIS_C6229-1984-kana';
+
+ case 'csjisencoding':
+ case 'jisencoding':
+ return 'JIS_Encoding';
+
+ case 'cshalfwidthkatakana':
+ case 'jisx0201':
+ case 'x0201':
+ return 'JIS_X0201';
+
+ case 'csiso159jisx02121990':
+ case 'isoir159':
+ case 'jisx02121990':
+ case 'x0212':
+ return 'JIS_X0212-1990';
+
+ case 'csiso141jusib1002':
+ case 'isoir141':
+ case 'iso646yu':
+ case 'js':
+ case 'jusib1002':
+ case 'yu':
+ return 'JUS_I.B1.002';
+
+ case 'csiso147macedonian':
+ case 'isoir147':
+ case 'jusib1003mac':
+ case 'macedonian':
+ return 'JUS_I.B1.003-mac';
+
+ case 'csiso146serbian':
+ case 'isoir146':
+ case 'jusib1003serb':
+ case 'serbian':
+ return 'JUS_I.B1.003-serb';
+
+ case 'koi7switched':
+ return 'KOI7-switched';
+
+ case 'cskoi8r':
+ case 'koi8r':
+ return 'KOI8-R';
+
+ case 'koi8u':
+ return 'KOI8-U';
+
+ case 'csksc5636':
+ case 'iso646kr':
+ case 'ksc5636':
+ return 'KSC5636';
+
+ case 'cskz1048':
+ case 'kz1048':
+ case 'rk1048':
+ case 'strk10482002':
+ return 'KZ-1048';
+
+ case 'csiso19latingreek':
+ case 'isoir19':
+ case 'latingreek':
+ return 'latin-greek';
+
+ case 'csiso27latingreek1':
+ case 'isoir27':
+ case 'latingreek1':
+ return 'Latin-greek-1';
+
+ case 'csiso158lap':
+ case 'isoir158':
+ case 'lap':
+ case 'latinlap':
+ return 'latin-lap';
+
+ case 'csmacintosh':
+ case 'mac':
+ case 'macintosh':
+ return 'macintosh';
+
+ case 'csmicrosoftpublishing':
+ case 'microsoftpublishing':
+ return 'Microsoft-Publishing';
+
+ case 'csmnem':
+ case 'mnem':
+ return 'MNEM';
+
+ case 'csmnemonic':
+ case 'mnemonic':
+ return 'MNEMONIC';
+
+ case 'csiso86hungarian':
+ case 'hu':
+ case 'isoir86':
+ case 'iso646hu':
+ case 'msz77953':
+ return 'MSZ_7795.3';
+
+ case 'csnatsdano':
+ case 'isoir91':
+ case 'natsdano':
+ return 'NATS-DANO';
+
+ case 'csnatsdanoadd':
+ case 'isoir92':
+ case 'natsdanoadd':
+ return 'NATS-DANO-ADD';
+
+ case 'csnatssefi':
+ case 'isoir81':
+ case 'natssefi':
+ return 'NATS-SEFI';
+
+ case 'csnatssefiadd':
+ case 'isoir82':
+ case 'natssefiadd':
+ return 'NATS-SEFI-ADD';
+
+ case 'csiso151cuba':
+ case 'cuba':
+ case 'isoir151':
+ case 'iso646cu':
+ case 'ncnc001081':
+ return 'NC_NC00-10:81';
+
+ case 'csiso69french':
+ case 'fr':
+ case 'isoir69':
+ case 'iso646fr':
+ case 'nfz62010':
+ return 'NF_Z_62-010';
+
+ case 'csiso25french':
+ case 'isoir25':
+ case 'iso646fr1':
+ case 'nfz620101973':
+ return 'NF_Z_62-010_(1973)';
+
+ case 'csiso60danishnorwegian':
+ case 'csiso60norwegian1':
+ case 'isoir60':
+ case 'iso646no':
+ case 'no':
+ case 'ns45511':
+ return 'NS_4551-1';
+
+ case 'csiso61norwegian2':
+ case 'isoir61':
+ case 'iso646no2':
+ case 'no2':
+ case 'ns45512':
+ return 'NS_4551-2';
+
+ case 'osdebcdicdf03irv':
+ return 'OSD_EBCDIC_DF03_IRV';
+
+ case 'osdebcdicdf041':
+ return 'OSD_EBCDIC_DF04_1';
+
+ case 'osdebcdicdf0415':
+ return 'OSD_EBCDIC_DF04_15';
+
+ case 'cspc8danishnorwegian':
+ case 'pc8danishnorwegian':
+ return 'PC8-Danish-Norwegian';
+
+ case 'cspc8turkish':
+ case 'pc8turkish':
+ return 'PC8-Turkish';
+
+ case 'csiso16portuguese':
+ case 'isoir16':
+ case 'iso646pt':
+ case 'pt':
+ return 'PT';
+
+ case 'csiso84portuguese2':
+ case 'isoir84':
+ case 'iso646pt2':
+ case 'pt2':
+ return 'PT2';
+
+ case 'cp154':
+ case 'csptcp154':
+ case 'cyrillicasian':
+ case 'pt154':
+ case 'ptcp154':
+ return 'PTCP154';
+
+ case 'scsu':
+ return 'SCSU';
+
+ case 'csiso10swedish':
+ case 'fi':
+ case 'isoir10':
+ case 'iso646fi':
+ case 'iso646se':
+ case 'se':
+ case 'sen850200b':
+ return 'SEN_850200_B';
+
+ case 'csiso11swedishfornames':
+ case 'isoir11':
+ case 'iso646se2':
+ case 'se2':
+ case 'sen850200c':
+ return 'SEN_850200_C';
+
+ case 'csshiftjis':
+ case 'mskanji':
+ case 'shiftjis':
+ return 'Shift_JIS';
+
+ case 'csiso102t617bit':
+ case 'isoir102':
+ case 't617bit':
+ return 'T.61-7bit';
+
+ case 'csiso103t618bit':
+ case 'isoir103':
+ case 't61':
+ case 't618bit':
+ return 'T.61-8bit';
+
+ case 'csiso128t101g2':
+ case 'isoir128':
+ case 't101g2':
+ return 'T.101-G2';
+
+ case 'cstscii':
+ case 'tscii':
+ return 'TSCII';
+
+ case 'csunicode11':
+ case 'unicode11':
+ return 'UNICODE-1-1';
+
+ case 'csunicode11utf7':
+ case 'unicode11utf7':
+ return 'UNICODE-1-1-UTF-7';
+
+ case 'csunknown8bit':
+ case 'unknown8bit':
+ return 'UNKNOWN-8BIT';
+
+ case 'ansix341968':
+ case 'ansix341986':
+ case 'ascii':
+ case 'cp367':
+ case 'csascii':
+ case 'ibm367':
+ case 'isoir6':
+ case 'iso646us':
+ case 'iso646irv1991':
+ case 'us':
+ case 'usascii':
+ return 'US-ASCII';
+
+ case 'csusdk':
+ case 'usdk':
+ return 'us-dk';
+
+ case 'utf7':
+ return 'UTF-7';
+
+ case 'utf8':
+ return 'UTF-8';
+
+ case 'utf16':
+ return 'UTF-16';
+
+ case 'utf16be':
+ return 'UTF-16BE';
+
+ case 'utf16le':
+ return 'UTF-16LE';
+
+ case 'utf32':
+ return 'UTF-32';
+
+ case 'utf32be':
+ return 'UTF-32BE';
+
+ case 'utf32le':
+ return 'UTF-32LE';
+
+ case 'csventurainternational':
+ case 'venturainternational':
+ return 'Ventura-International';
+
+ case 'csventuramath':
+ case 'venturamath':
+ return 'Ventura-Math';
+
+ case 'csventuraus':
+ case 'venturaus':
+ return 'Ventura-US';
+
+ case 'csiso70videotexsupp1':
+ case 'isoir70':
+ case 'videotexsuppl':
+ return 'videotex-suppl';
+
+ case 'csviqr':
+ case 'viqr':
+ return 'VIQR';
+
+ case 'csviscii':
+ case 'viscii':
+ return 'VISCII';
+
+ case 'cswindows31j':
+ case 'windows31j':
+ return 'Windows-31J';
+
+ case 'iso885911':
+ case 'tis620':
+ return 'Windows-874';
+
+ case 'cseuckr':
+ case 'euckr':
+ case 'windows949':
+ case 'csksc56011987':
+ case 'isoir149':
+ case 'korean':
+ case 'ksc5601':
+ case 'ksc56011987':
+ case 'ksc56011989':
+ return 'Windows-949';
+
+ case 'windows1250':
+ return 'windows-1250';
+
+ case 'windows1251':
+ return 'windows-1251';
+
+ case 'cp819':
+ case 'csisolatin1':
+ case 'ibm819':
+ case 'iso88591':
+ case 'isoir100':
+ case 'iso885911987':
+ case 'l1':
+ case 'latin1':
+ case 'windows1252':
+ return 'Windows-1252';
+
+ case 'windows1252':
+ return 'windows-1252';
+
+ case 'windows1253':
+ return 'windows-1253';
+
+ case 'csisolatin5':
+ case 'iso88599':
+ case 'isoir148':
+ case 'iso885991989':
+ case 'l5':
+ case 'latin5':
+ case 'windows1254':
+ return 'Windows-1254';
+
+ case 'windows1254':
+ return 'windows-1254';
+
+ case 'windows1255':
+ return 'windows-1255';
+
+ case 'windows1256':
+ return 'windows-1256';
+
+ case 'windows1257':
+ return 'windows-1257';
+
+ case 'windows1258':
+ return 'windows-1258';
+
+ default:
+ return $charset;
+ }
+ }
+
+ function get_curl_version()
+ {
+ if (is_array($curl = curl_version()))
+ {
+ $curl = $curl['version'];
+ }
+ elseif (substr($curl, 0, 5) == 'curl/')
+ {
+ $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
+ }
+ elseif (substr($curl, 0, 8) == 'libcurl/')
+ {
+ $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
+ }
+ else
+ {
+ $curl = 0;
+ }
+ return $curl;
+ }
+
+ function is_subclass_of($class1, $class2)
+ {
+ if (func_num_args() != 2)
+ {
+ trigger_error('Wrong parameter count for SimplePie_Misc::is_subclass_of()', E_USER_WARNING);
+ }
+ elseif (version_compare(PHP_VERSION, '5.0.3', '>=') || is_object($class1))
+ {
+ return is_subclass_of($class1, $class2);
+ }
+ elseif (is_string($class1) && is_string($class2))
+ {
+ if (class_exists($class1))
+ {
+ if (class_exists($class2))
+ {
+ $class2 = strtolower($class2);
+ while ($class1 = strtolower(get_parent_class($class1)))
+ {
+ if ($class1 == $class2)
+ {
+ return true;
+ }
+ }
+ }
+ }
+ else
+ {
+ trigger_error('Unknown class passed as parameter', E_USER_WARNNG);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Strip HTML comments
+ *
+ * @access public
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ function strip_comments($data)
+ {
+ $output = '';
+ while (($start = strpos($data, '<!--')) !== false)
+ {
+ $output .= substr($data, 0, $start);
+ if (($end = strpos($data, '-->', $start)) !== false)
+ {
+ $data = substr_replace($data, '', 0, $end + 3);
+ }
+ else
+ {
+ $data = '';
+ }
+ }
+ return $output . $data;
+ }
+
+ function parse_date($dt)
+ {
+ $parser = SimplePie_Parse_Date::get();
+ return $parser->parse($dt);
+ }
+
+ /**
+ * Decode HTML entities
+ *
+ * @static
+ * @access public
+ * @param string $data Input data
+ * @return string Output data
+ */
+ function entities_decode($data)
+ {
+ $decoder = new SimplePie_Decode_HTML_Entities($data);
+ return $decoder->parse();
+ }
+
+ /**
+ * Remove RFC822 comments
+ *
+ * @access public
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ function uncomment_rfc822($string)
+ {
+ $string = (string) $string;
+ $position = 0;
+ $length = strlen($string);
+ $depth = 0;
+
+ $output = '';
+
+ while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
+ {
+ $output .= substr($string, $position, $pos - $position);
+ $position = $pos + 1;
+ if ($string[$pos - 1] !== '\\')
+ {
+ $depth++;
+ while ($depth && $position < $length)
+ {
+ $position += strcspn($string, '()', $position);
+ if ($string[$position - 1] === '\\')
+ {
+ $position++;
+ continue;
+ }
+ elseif (isset($string[$position]))
+ {
+ switch ($string[$position])
+ {
+ case '(':
+ $depth++;
+ break;
+
+ case ')':
+ $depth--;
+ break;
+ }
+ $position++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ $output .= '(';
+ }
+ }
+ $output .= substr($string, $position);
+
+ return $output;
+ }
+
+ function parse_mime($mime)
+ {
+ if (($pos = strpos($mime, ';')) === false)
+ {
+ return trim($mime);
+ }
+ else
+ {
+ return trim(substr($mime, 0, $pos));
+ }
+ }
+
+ function htmlspecialchars_decode($string, $quote_style)
+ {
+ if (function_exists('htmlspecialchars_decode'))
+ {
+ return htmlspecialchars_decode($string, $quote_style);
+ }
+ else
+ {
+ return strtr($string, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style)));
+ }
+ }
+
+ function atom_03_construct_type($attribs)
+ {
+ if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) == 'base64'))
+ {
+ $mode = SIMPLEPIE_CONSTRUCT_BASE64;
+ }
+ else
+ {
+ $mode = SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ if (isset($attribs['']['type']))
+ {
+ switch (strtolower(trim($attribs['']['type'])))
+ {
+ case 'text':
+ case 'text/plain':
+ return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
+
+ case 'html':
+ case 'text/html':
+ return SIMPLEPIE_CONSTRUCT_HTML | $mode;
+
+ case 'xhtml':
+ case 'application/xhtml+xml':
+ return SIMPLEPIE_CONSTRUCT_XHTML | $mode;
+
+ default:
+ return SIMPLEPIE_CONSTRUCT_NONE | $mode;
+ }
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
+ }
+ }
+
+ function atom_10_construct_type($attribs)
+ {
+ if (isset($attribs['']['type']))
+ {
+ switch (strtolower(trim($attribs['']['type'])))
+ {
+ case 'text':
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+
+ case 'html':
+ return SIMPLEPIE_CONSTRUCT_HTML;
+
+ case 'xhtml':
+ return SIMPLEPIE_CONSTRUCT_XHTML;
+
+ default:
+ return SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ }
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+
+ function atom_10_content_construct_type($attribs)
+ {
+ if (isset($attribs['']['type']))
+ {
+ $type = strtolower(trim($attribs['']['type']));
+ switch ($type)
+ {
+ case 'text':
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+
+ case 'html':
+ return SIMPLEPIE_CONSTRUCT_HTML;
+
+ case 'xhtml':
+ return SIMPLEPIE_CONSTRUCT_XHTML;
+ }
+ if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) == 'text/')
+ {
+ return SIMPLEPIE_CONSTRUCT_NONE;
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_BASE64;
+ }
+ }
+ else
+ {
+ return SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+ }
+
+ function is_isegment_nz_nc($string)
+ {
+ return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);
+ }
+
+ function space_separated_tokens($string)
+ {
+ $space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
+ $string_length = strlen($string);
+
+ $position = strspn($string, $space_characters);
+ $tokens = array();
+
+ while ($position < $string_length)
+ {
+ $len = strcspn($string, $space_characters, $position);
+ $tokens[] = substr($string, $position, $len);
+ $position += $len;
+ $position += strspn($string, $space_characters, $position);
+ }
+
+ return $tokens;
+ }
+
+ function array_unique($array)
+ {
+ if (version_compare(PHP_VERSION, '5.2', '>='))
+ {
+ return array_unique($array);
+ }
+ else
+ {
+ $array = (array) $array;
+ $new_array = array();
+ $new_array_strings = array();
+ foreach ($array as $key => $value)
+ {
+ if (is_object($value))
+ {
+ if (method_exists($value, '__toString'))
+ {
+ $cmp = $value->__toString();
+ }
+ else
+ {
+ trigger_error('Object of class ' . get_class($value) . ' could not be converted to string', E_USER_ERROR);
+ }
+ }
+ elseif (is_array($value))
+ {
+ $cmp = (string) reset($value);
+ }
+ else
+ {
+ $cmp = (string) $value;
+ }
+ if (!in_array($cmp, $new_array_strings))
+ {
+ $new_array[$key] = $value;
+ $new_array_strings[] = $cmp;
+ }
+ }
+ return $new_array;
+ }
+ }
+
+ /**
+ * Converts a unicode codepoint to a UTF-8 character
+ *
+ * @static
+ * @access public
+ * @param int $codepoint Unicode codepoint
+ * @return string UTF-8 character
+ */
+ function codepoint_to_utf8($codepoint)
+ {
+ static $cache = array();
+ $codepoint = (int) $codepoint;
+ if (isset($cache[$codepoint]))
+ {
+ return $cache[$codepoint];
+ }
+ elseif ($codepoint < 0)
+ {
+ return $cache[$codepoint] = false;
+ }
+ else if ($codepoint <= 0x7f)
+ {
+ return $cache[$codepoint] = chr($codepoint);
+ }
+ else if ($codepoint <= 0x7ff)
+ {
+ return $cache[$codepoint] = chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else if ($codepoint <= 0xffff)
+ {
+ return $cache[$codepoint] = chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else if ($codepoint <= 0x10ffff)
+ {
+ return $cache[$codepoint] = chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
+ }
+ else
+ {
+ // U+FFFD REPLACEMENT CHARACTER
+ return $cache[$codepoint] = "\xEF\xBF\xBD";
+ }
+ }
+
+ /**
+ * Re-implementation of PHP 5's stripos()
+ *
+ * Returns the numeric position of the first occurrence of needle in the
+ * haystack string.
+ *
+ * @static
+ * @access string
+ * @param object $haystack
+ * @param string $needle Note that the needle may be a string of one or more
+ * characters. If needle is not a string, it is converted to an integer
+ * and applied as the ordinal value of a character.
+ * @param int $offset The optional offset parameter allows you to specify which
+ * character in haystack to start searching. The position returned is still
+ * relative to the beginning of haystack.
+ * @return bool If needle is not found, stripos() will return boolean false.
+ */
+ function stripos($haystack, $needle, $offset = 0)
+ {
+ if (function_exists('stripos'))
+ {
+ return stripos($haystack, $needle, $offset);
+ }
+ else
+ {
+ if (is_string($needle))
+ {
+ $needle = strtolower($needle);
+ }
+ elseif (is_int($needle) || is_bool($needle) || is_double($needle))
+ {
+ $needle = strtolower(chr($needle));
+ }
+ else
+ {
+ trigger_error('needle is not a string or an integer', E_USER_WARNING);
+ return false;
+ }
+
+ return strpos(strtolower($haystack), $needle, $offset);
+ }
+ }
+
+ /**
+ * Similar to parse_str()
+ *
+ * Returns an associative array of name/value pairs, where the value is an
+ * array of values that have used the same name
+ *
+ * @static
+ * @access string
+ * @param string $str The input string.
+ * @return array
+ */
+ function parse_str($str)
+ {
+ $return = array();
+ $str = explode('&', $str);
+
+ foreach ($str as $section)
+ {
+ if (strpos($section, '=') !== false)
+ {
+ list($name, $value) = explode('=', $section, 2);
+ $return[urldecode($name)][] = urldecode($value);
+ }
+ else
+ {
+ $return[urldecode($section)][] = null;
+ }
+ }
+
+ return $return;
+ }
+
+ /**
+ * Detect XML encoding, as per XML 1.0 Appendix F.1
+ *
+ * @todo Add support for EBCDIC
+ * @param string $data XML data
+ * @return array Possible encodings
+ */
+ function xml_encoding($data)
+ {
+ // UTF-32 Big Endian BOM
+ if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
+ {
+ $encoding[] = 'UTF-32BE';
+ }
+ // UTF-32 Little Endian BOM
+ elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
+ {
+ $encoding[] = 'UTF-32LE';
+ }
+ // UTF-16 Big Endian BOM
+ elseif (substr($data, 0, 2) === "\xFE\xFF")
+ {
+ $encoding[] = 'UTF-16BE';
+ }
+ // UTF-16 Little Endian BOM
+ elseif (substr($data, 0, 2) === "\xFF\xFE")
+ {
+ $encoding[] = 'UTF-16LE';
+ }
+ // UTF-8 BOM
+ elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
+ {
+ $encoding[] = 'UTF-8';
+ }
+ // UTF-32 Big Endian Without BOM
+ elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C")
+ {
+ if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-32BE';
+ }
+ // UTF-32 Little Endian Without BOM
+ elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00")
+ {
+ if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-32LE';
+ }
+ // UTF-16 Big Endian Without BOM
+ elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
+ {
+ if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-16BE';
+ }
+ // UTF-16 Little Endian Without BOM
+ elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
+ {
+ if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8'));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-16LE';
+ }
+ // US-ASCII (or superset)
+ elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
+ {
+ if ($pos = strpos($data, "\x3F\x3E"))
+ {
+ $parser = new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5));
+ if ($parser->parse())
+ {
+ $encoding[] = $parser->encoding;
+ }
+ }
+ $encoding[] = 'UTF-8';
+ }
+ // Fallback to UTF-8
+ else
+ {
+ $encoding[] = 'UTF-8';
+ }
+ return $encoding;
+ }
+}
+
+/**
+ * Decode HTML Entities
+ *
+ * This implements HTML5 as of revision 967 (2007-06-28)
+ *
+ * @package SimplePie
+ */
+class SimplePie_Decode_HTML_Entities
+{
+ /**
+ * Data to be parsed
+ *
+ * @access private
+ * @var string
+ */
+ var $data = '';
+
+ /**
+ * Currently consumed bytes
+ *
+ * @access private
+ * @var string
+ */
+ var $consumed = '';
+
+ /**
+ * Position of the current byte being parsed
+ *
+ * @access private
+ * @var int
+ */
+ var $position = 0;
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @access public
+ * @param string $data Input data
+ */
+ function SimplePie_Decode_HTML_Entities($data)
+ {
+ $this->data = $data;
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @access public
+ * @return string Output data
+ */
+ function parse()
+ {
+ while (($this->position = strpos($this->data, '&', $this->position)) !== false)
+ {
+ $this->consume();
+ $this->entity();
+ $this->consumed = '';
+ }
+ return $this->data;
+ }
+
+ /**
+ * Consume the next byte
+ *
+ * @access private
+ * @return mixed The next byte, or false, if there is no more data
+ */
+ function consume()
+ {
+ if (isset($this->data[$this->position]))
+ {
+ $this->consumed .= $this->data[$this->position];
+ return $this->data[$this->position++];
+ }
+ else
+ {
+ $this->consumed = false;
+ return false;
+ }
+ }
+
+ /**
+ * Consume a range of characters
+ *
+ * @access private
+ * @param string $chars Characters to consume
+ * @return mixed A series of characters that match the range, or false
+ */
+ function consume_range($chars)
+ {
+ if ($len = strspn($this->data, $chars, $this->position))
+ {
+ $data = substr($this->data, $this->position, $len);
+ $this->consumed .= $data;
+ $this->position += $len;
+ return $data;
+ }
+ else
+ {
+ $this->consumed = false;
+ return false;
+ }
+ }
+
+ /**
+ * Unconsume one byte
+ *
+ * @access private
+ */
+ function unconsume()
+ {
+ $this->consumed = substr($this->consumed, 0, -1);
+ $this->position--;
+ }
+
+ /**
+ * Decode an entity
+ *
+ * @access private
+ */
+ function entity()
+ {
+ switch ($this->consume())
+ {
+ case "\x09":
+ case "\x0A":
+ case "\x0B":
+ case "\x0B":
+ case "\x0C":
+ case "\x20":
+ case "\x3C":
+ case "\x26":
+ case false:
+ break;
+
+ case "\x23":
+ switch ($this->consume())
+ {
+ case "\x78":
+ case "\x58":
+ $range = '0123456789ABCDEFabcdef';
+ $hex = true;
+ break;
+
+ default:
+ $range = '0123456789';
+ $hex = false;
+ $this->unconsume();
+ break;
+ }
+
+ if ($codepoint = $this->consume_range($range))
+ {
+ static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8");
+
+ if ($hex)
+ {
+ $codepoint = hexdec($codepoint);
+ }
+ else
+ {
+ $codepoint = intval($codepoint);
+ }
+
+ if (isset($windows_1252_specials[$codepoint]))
+ {
+ $replacement = $windows_1252_specials[$codepoint];
+ }
+ else
+ {
+ $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
+ }
+
+ if ($this->consume() != ';')
+ {
+ $this->unconsume();
+ }
+
+ $consumed_length = strlen($this->consumed);
+ $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
+ $this->position += strlen($replacement) - $consumed_length;
+ }
+ break;
+
+ default:
+ static $entities = array('Aacute' => "\xC3\x81", 'aacute' => "\xC3\xA1", 'Aacute;' => "\xC3\x81", 'aacute;' => "\xC3\xA1", 'Acirc' => "\xC3\x82", 'acirc' => "\xC3\xA2", 'Acirc;' => "\xC3\x82", 'acirc;' => "\xC3\xA2", 'acute' => "\xC2\xB4", 'acute;' => "\xC2\xB4", 'AElig' => "\xC3\x86", 'aelig' => "\xC3\xA6", 'AElig;' => "\xC3\x86", 'aelig;' => "\xC3\xA6", 'Agrave' => "\xC3\x80", 'agrave' => "\xC3\xA0", 'Agrave;' => "\xC3\x80", 'agrave;' => "\xC3\xA0", 'alefsym;' => "\xE2\x84\xB5", 'Alpha;' => "\xCE\x91", 'alpha;' => "\xCE\xB1", 'AMP' => "\x26", 'amp' => "\x26", 'AMP;' => "\x26", 'amp;' => "\x26", 'and;' => "\xE2\x88\xA7", 'ang;' => "\xE2\x88\xA0", 'apos;' => "\x27", 'Aring' => "\xC3\x85", 'aring' => "\xC3\xA5", 'Aring;' => "\xC3\x85", 'aring;' => "\xC3\xA5", 'asymp;' => "\xE2\x89\x88", 'Atilde' => "\xC3\x83", 'atilde' => "\xC3\xA3", 'Atilde;' => "\xC3\x83", 'atilde;' => "\xC3\xA3", 'Auml' => "\xC3\x84", 'auml' => "\xC3\xA4", 'Auml;' => "\xC3\x84", 'auml;' => "\xC3\xA4", 'bdquo;' => "\xE2\x80\x9E", 'Beta;' => "\xCE\x92", 'beta;' => "\xCE\xB2", 'brvbar' => "\xC2\xA6", 'brvbar;' => "\xC2\xA6", 'bull;' => "\xE2\x80\xA2", 'cap;' => "\xE2\x88\xA9", 'Ccedil' => "\xC3\x87", 'ccedil' => "\xC3\xA7", 'Ccedil;' => "\xC3\x87", 'ccedil;' => "\xC3\xA7", 'cedil' => "\xC2\xB8", 'cedil;' => "\xC2\xB8", 'cent' => "\xC2\xA2", 'cent;' => "\xC2\xA2", 'Chi;' => "\xCE\xA7", 'chi;' => "\xCF\x87", 'circ;' => "\xCB\x86", 'clubs;' => "\xE2\x99\xA3", 'cong;' => "\xE2\x89\x85", 'COPY' => "\xC2\xA9", 'copy' => "\xC2\xA9", 'COPY;' => "\xC2\xA9", 'copy;' => "\xC2\xA9", 'crarr;' => "\xE2\x86\xB5", 'cup;' => "\xE2\x88\xAA", 'curren' => "\xC2\xA4", 'curren;' => "\xC2\xA4", 'Dagger;' => "\xE2\x80\xA1", 'dagger;' => "\xE2\x80\xA0", 'dArr;' => "\xE2\x87\x93", 'darr;' => "\xE2\x86\x93", 'deg' => "\xC2\xB0", 'deg;' => "\xC2\xB0", 'Delta;' => "\xCE\x94", 'delta;' => "\xCE\xB4", 'diams;' => "\xE2\x99\xA6", 'divide' => "\xC3\xB7", 'divide;' => "\xC3\xB7", 'Eacute' => "\xC3\x89", 'eacute' => "\xC3\xA9", 'Eacute;' => "\xC3\x89", 'eacute;' => "\xC3\xA9", 'Ecirc' => "\xC3\x8A", 'ecirc' => "\xC3\xAA", 'Ecirc;' => "\xC3\x8A", 'ecirc;' => "\xC3\xAA", 'Egrave' => "\xC3\x88", 'egrave' => "\xC3\xA8", 'Egrave;' => "\xC3\x88", 'egrave;' => "\xC3\xA8", 'empty;' => "\xE2\x88\x85", 'emsp;' => "\xE2\x80\x83", 'ensp;' => "\xE2\x80\x82", 'Epsilon;' => "\xCE\x95", 'epsilon;' => "\xCE\xB5", 'equiv;' => "\xE2\x89\xA1", 'Eta;' => "\xCE\x97", 'eta;' => "\xCE\xB7", 'ETH' => "\xC3\x90", 'eth' => "\xC3\xB0", 'ETH;' => "\xC3\x90", 'eth;' => "\xC3\xB0", 'Euml' => "\xC3\x8B", 'euml' => "\xC3\xAB", 'Euml;' => "\xC3\x8B", 'euml;' => "\xC3\xAB", 'euro;' => "\xE2\x82\xAC", 'exist;' => "\xE2\x88\x83", 'fnof;' => "\xC6\x92", 'forall;' => "\xE2\x88\x80", 'frac12' => "\xC2\xBD", 'frac12;' => "\xC2\xBD", 'frac14' => "\xC2\xBC", 'frac14;' => "\xC2\xBC", 'frac34' => "\xC2\xBE", 'frac34;' => "\xC2\xBE", 'frasl;' => "\xE2\x81\x84", 'Gamma;' => "\xCE\x93", 'gamma;' => "\xCE\xB3", 'ge;' => "\xE2\x89\xA5", 'GT' => "\x3E", 'gt' => "\x3E", 'GT;' => "\x3E", 'gt;' => "\x3E", 'hArr;' => "\xE2\x87\x94", 'harr;' => "\xE2\x86\x94", 'hearts;' => "\xE2\x99\xA5", 'hellip;' => "\xE2\x80\xA6", 'Iacute' => "\xC3\x8D", 'iacute' => "\xC3\xAD", 'Iacute;' => "\xC3\x8D", 'iacute;' => "\xC3\xAD", 'Icirc' => "\xC3\x8E", 'icirc' => "\xC3\xAE", 'Icirc;' => "\xC3\x8E", 'icirc;' => "\xC3\xAE", 'iexcl' => "\xC2\xA1", 'iexcl;' => "\xC2\xA1", 'Igrave' => "\xC3\x8C", 'igrave' => "\xC3\xAC", 'Igrave;' => "\xC3\x8C", 'igrave;' => "\xC3\xAC", 'image;' => "\xE2\x84\x91", 'infin;' => "\xE2\x88\x9E", 'int;' => "\xE2\x88\xAB", 'Iota;' => "\xCE\x99", 'iota;' => "\xCE\xB9", 'iquest' => "\xC2\xBF", 'iquest;' => "\xC2\xBF", 'isin;' => "\xE2\x88\x88", 'Iuml' => "\xC3\x8F", 'iuml' => "\xC3\xAF", 'Iuml;' => "\xC3\x8F", 'iuml;' => "\xC3\xAF", 'Kappa;' => "\xCE\x9A", 'kappa;' => "\xCE\xBA", 'Lambda;' => "\xCE\x9B", 'lambda;' => "\xCE\xBB", 'lang;' => "\xE3\x80\x88", 'laquo' => "\xC2\xAB", 'laquo;' => "\xC2\xAB", 'lArr;' => "\xE2\x87\x90", 'larr;' => "\xE2\x86\x90", 'lceil;' => "\xE2\x8C\x88", 'ldquo;' => "\xE2\x80\x9C", 'le;' => "\xE2\x89\xA4", 'lfloor;' => "\xE2\x8C\x8A", 'lowast;' => "\xE2\x88\x97", 'loz;' => "\xE2\x97\x8A", 'lrm;' => "\xE2\x80\x8E", 'lsaquo;' => "\xE2\x80\xB9", 'lsquo;' => "\xE2\x80\x98", 'LT' => "\x3C", 'lt' => "\x3C", 'LT;' => "\x3C", 'lt;' => "\x3C", 'macr' => "\xC2\xAF", 'macr;' => "\xC2\xAF", 'mdash;' => "\xE2\x80\x94", 'micro' => "\xC2\xB5", 'micro;' => "\xC2\xB5", 'middot' => "\xC2\xB7", 'middot;' => "\xC2\xB7", 'minus;' => "\xE2\x88\x92", 'Mu;' => "\xCE\x9C", 'mu;' => "\xCE\xBC", 'nabla;' => "\xE2\x88\x87", 'nbsp' => "\xC2\xA0", 'nbsp;' => "\xC2\xA0", 'ndash;' => "\xE2\x80\x93", 'ne;' => "\xE2\x89\xA0", 'ni;' => "\xE2\x88\x8B", 'not' => "\xC2\xAC", 'not;' => "\xC2\xAC", 'notin;' => "\xE2\x88\x89", 'nsub;' => "\xE2\x8A\x84", 'Ntilde' => "\xC3\x91", 'ntilde' => "\xC3\xB1", 'Ntilde;' => "\xC3\x91", 'ntilde;' => "\xC3\xB1", 'Nu;' => "\xCE\x9D", 'nu;' => "\xCE\xBD", 'Oacute' => "\xC3\x93", 'oacute' => "\xC3\xB3", 'Oacute;' => "\xC3\x93", 'oacute;' => "\xC3\xB3", 'Ocirc' => "\xC3\x94", 'ocirc' => "\xC3\xB4", 'Ocirc;' => "\xC3\x94", 'ocirc;' => "\xC3\xB4", 'OElig;' => "\xC5\x92", 'oelig;' => "\xC5\x93", 'Ograve' => "\xC3\x92", 'ograve' => "\xC3\xB2", 'Ograve;' => "\xC3\x92", 'ograve;' => "\xC3\xB2", 'oline;' => "\xE2\x80\xBE", 'Omega;' => "\xCE\xA9", 'omega;' => "\xCF\x89", 'Omicron;' => "\xCE\x9F", 'omicron;' => "\xCE\xBF", 'oplus;' => "\xE2\x8A\x95", 'or;' => "\xE2\x88\xA8", 'ordf' => "\xC2\xAA", 'ordf;' => "\xC2\xAA", 'ordm' => "\xC2\xBA", 'ordm;' => "\xC2\xBA", 'Oslash' => "\xC3\x98", 'oslash' => "\xC3\xB8", 'Oslash;' => "\xC3\x98", 'oslash;' => "\xC3\xB8", 'Otilde' => "\xC3\x95", 'otilde' => "\xC3\xB5", 'Otilde;' => "\xC3\x95", 'otilde;' => "\xC3\xB5", 'otimes;' => "\xE2\x8A\x97", 'Ouml' => "\xC3\x96", 'ouml' => "\xC3\xB6", 'Ouml;' => "\xC3\x96", 'ouml;' => "\xC3\xB6", 'para' => "\xC2\xB6", 'para;' => "\xC2\xB6", 'part;' => "\xE2\x88\x82", 'permil;' => "\xE2\x80\xB0", 'perp;' => "\xE2\x8A\xA5", 'Phi;' => "\xCE\xA6", 'phi;' => "\xCF\x86", 'Pi;' => "\xCE\xA0", 'pi;' => "\xCF\x80", 'piv;' => "\xCF\x96", 'plusmn' => "\xC2\xB1", 'plusmn;' => "\xC2\xB1", 'pound' => "\xC2\xA3", 'pound;' => "\xC2\xA3", 'Prime;' => "\xE2\x80\xB3", 'prime;' => "\xE2\x80\xB2", 'prod;' => "\xE2\x88\x8F", 'prop;' => "\xE2\x88\x9D", 'Psi;' => "\xCE\xA8", 'psi;' => "\xCF\x88", 'QUOT' => "\x22", 'quot' => "\x22", 'QUOT;' => "\x22", 'quot;' => "\x22", 'radic;' => "\xE2\x88\x9A", 'rang;' => "\xE3\x80\x89", 'raquo' => "\xC2\xBB", 'raquo;' => "\xC2\xBB", 'rArr;' => "\xE2\x87\x92", 'rarr;' => "\xE2\x86\x92", 'rceil;' => "\xE2\x8C\x89", 'rdquo;' => "\xE2\x80\x9D", 'real;' => "\xE2\x84\x9C", 'REG' => "\xC2\xAE", 'reg' => "\xC2\xAE", 'REG;' => "\xC2\xAE", 'reg;' => "\xC2\xAE", 'rfloor;' => "\xE2\x8C\x8B", 'Rho;' => "\xCE\xA1", 'rho;' => "\xCF\x81", 'rlm;' => "\xE2\x80\x8F", 'rsaquo;' => "\xE2\x80\xBA", 'rsquo;' => "\xE2\x80\x99", 'sbquo;' => "\xE2\x80\x9A", 'Scaron;' => "\xC5\xA0", 'scaron;' => "\xC5\xA1", 'sdot;' => "\xE2\x8B\x85", 'sect' => "\xC2\xA7", 'sect;' => "\xC2\xA7", 'shy' => "\xC2\xAD", 'shy;' => "\xC2\xAD", 'Sigma;' => "\xCE\xA3", 'sigma;' => "\xCF\x83", 'sigmaf;' => "\xCF\x82", 'sim;' => "\xE2\x88\xBC", 'spades;' => "\xE2\x99\xA0", 'sub;' => "\xE2\x8A\x82", 'sube;' => "\xE2\x8A\x86", 'sum;' => "\xE2\x88\x91", 'sup;' => "\xE2\x8A\x83", 'sup1' => "\xC2\xB9", 'sup1;' => "\xC2\xB9", 'sup2' => "\xC2\xB2", 'sup2;' => "\xC2\xB2", 'sup3' => "\xC2\xB3", 'sup3;' => "\xC2\xB3", 'supe;' => "\xE2\x8A\x87", 'szlig' => "\xC3\x9F", 'szlig;' => "\xC3\x9F", 'Tau;' => "\xCE\xA4", 'tau;' => "\xCF\x84", 'there4;' => "\xE2\x88\xB4", 'Theta;' => "\xCE\x98", 'theta;' => "\xCE\xB8", 'thetasym;' => "\xCF\x91", 'thinsp;' => "\xE2\x80\x89", 'THORN' => "\xC3\x9E", 'thorn' => "\xC3\xBE", 'THORN;' => "\xC3\x9E", 'thorn;' => "\xC3\xBE", 'tilde;' => "\xCB\x9C", 'times' => "\xC3\x97", 'times;' => "\xC3\x97", 'TRADE;' => "\xE2\x84\xA2", 'trade;' => "\xE2\x84\xA2", 'Uacute' => "\xC3\x9A", 'uacute' => "\xC3\xBA", 'Uacute;' => "\xC3\x9A", 'uacute;' => "\xC3\xBA", 'uArr;' => "\xE2\x87\x91", 'uarr;' => "\xE2\x86\x91", 'Ucirc' => "\xC3\x9B", 'ucirc' => "\xC3\xBB", 'Ucirc;' => "\xC3\x9B", 'ucirc;' => "\xC3\xBB", 'Ugrave' => "\xC3\x99", 'ugrave' => "\xC3\xB9", 'Ugrave;' => "\xC3\x99", 'ugrave;' => "\xC3\xB9", 'uml' => "\xC2\xA8", 'uml;' => "\xC2\xA8", 'upsih;' => "\xCF\x92", 'Upsilon;' => "\xCE\xA5", 'upsilon;' => "\xCF\x85", 'Uuml' => "\xC3\x9C", 'uuml' => "\xC3\xBC", 'Uuml;' => "\xC3\x9C", 'uuml;' => "\xC3\xBC", 'weierp;' => "\xE2\x84\x98", 'Xi;' => "\xCE\x9E", 'xi;' => "\xCE\xBE", 'Yacute' => "\xC3\x9D", 'yacute' => "\xC3\xBD", 'Yacute;' => "\xC3\x9D", 'yacute;' => "\xC3\xBD", 'yen' => "\xC2\xA5", 'yen;' => "\xC2\xA5", 'yuml' => "\xC3\xBF", 'Yuml;' => "\xC5\xB8", 'yuml;' => "\xC3\xBF", 'Zeta;' => "\xCE\x96", 'zeta;' => "\xCE\xB6", 'zwj;' => "\xE2\x80\x8D", 'zwnj;' => "\xE2\x80\x8C");
+
+ for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)
+ {
+ $consumed = substr($this->consumed, 1);
+ if (isset($entities[$consumed]))
+ {
+ $match = $consumed;
+ }
+ }
+
+ if ($match !== null)
+ {
+ $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
+ $this->position += strlen($entities[$match]) - strlen($consumed) - 1;
+ }
+ break;
+ }
+ }
+}
+
+/**
+ * Date Parser
+ *
+ * @package SimplePie
+ */
+class SimplePie_Parse_Date
+{
+ /**
+ * Input data
+ *
+ * @access protected
+ * @var string
+ */
+ var $date;
+
+ /**
+ * List of days, calendar day name => ordinal day number in the week
+ *
+ * @access protected
+ * @var array
+ */
+ var $day = array(
+ // English
+ 'mon' => 1,
+ 'monday' => 1,
+ 'tue' => 2,
+ 'tuesday' => 2,
+ 'wed' => 3,
+ 'wednesday' => 3,
+ 'thu' => 4,
+ 'thursday' => 4,
+ 'fri' => 5,
+ 'friday' => 5,
+ 'sat' => 6,
+ 'saturday' => 6,
+ 'sun' => 7,
+ 'sunday' => 7,
+ // Dutch
+ 'maandag' => 1,
+ 'dinsdag' => 2,
+ 'woensdag' => 3,
+ 'donderdag' => 4,
+ 'vrijdag' => 5,
+ 'zaterdag' => 6,
+ 'zondag' => 7,
+ // French
+ 'lundi' => 1,
+ 'mardi' => 2,
+ 'mercredi' => 3,
+ 'jeudi' => 4,
+ 'vendredi' => 5,
+ 'samedi' => 6,
+ 'dimanche' => 7,
+ // German
+ 'montag' => 1,
+ 'dienstag' => 2,
+ 'mittwoch' => 3,
+ 'donnerstag' => 4,
+ 'freitag' => 5,
+ 'samstag' => 6,
+ 'sonnabend' => 6,
+ 'sonntag' => 7,
+ // Italian
+ 'lunedì' => 1,
+ 'martedì' => 2,
+ 'mercoledì' => 3,
+ 'giovedì' => 4,
+ 'venerdì' => 5,
+ 'sabato' => 6,
+ 'domenica' => 7,
+ // Spanish
+ 'lunes' => 1,
+ 'martes' => 2,
+ 'miércoles' => 3,
+ 'jueves' => 4,
+ 'viernes' => 5,
+ 'sábado' => 6,
+ 'domingo' => 7,
+ // Finnish
+ 'maanantai' => 1,
+ 'tiistai' => 2,
+ 'keskiviikko' => 3,
+ 'torstai' => 4,
+ 'perjantai' => 5,
+ 'lauantai' => 6,
+ 'sunnuntai' => 7,
+ // Hungarian
+ 'hétfő' => 1,
+ 'kedd' => 2,
+ 'szerda' => 3,
+ 'csütörtok' => 4,
+ 'péntek' => 5,
+ 'szombat' => 6,
+ 'vasárnap' => 7,
+ // Greek
+ 'Δευ' => 1,
+ 'Τρι' => 2,
+ 'Τετ' => 3,
+ 'Πεμ' => 4,
+ 'Παρ' => 5,
+ 'Σαβ' => 6,
+ 'Κυρ' => 7,
+ );
+
+ /**
+ * List of months, calendar month name => calendar month number
+ *
+ * @access protected
+ * @var array
+ */
+ var $month = array(
+ // English
+ 'jan' => 1,
+ 'january' => 1,
+ 'feb' => 2,
+ 'february' => 2,
+ 'mar' => 3,
+ 'march' => 3,
+ 'apr' => 4,
+ 'april' => 4,
+ 'may' => 5,
+ // No long form of May
+ 'jun' => 6,
+ 'june' => 6,
+ 'jul' => 7,
+ 'july' => 7,
+ 'aug' => 8,
+ 'august' => 8,
+ 'sep' => 9,
+ 'september' => 8,
+ 'oct' => 10,
+ 'october' => 10,
+ 'nov' => 11,
+ 'november' => 11,
+ 'dec' => 12,
+ 'december' => 12,
+ // Dutch
+ 'januari' => 1,
+ 'februari' => 2,
+ 'maart' => 3,
+ 'april' => 4,
+ 'mei' => 5,
+ 'juni' => 6,
+ 'juli' => 7,
+ 'augustus' => 8,
+ 'september' => 9,
+ 'oktober' => 10,
+ 'november' => 11,
+ 'december' => 12,
+ // French
+ 'janvier' => 1,
+ 'février' => 2,
+ 'mars' => 3,
+ 'avril' => 4,
+ 'mai' => 5,
+ 'juin' => 6,
+ 'juillet' => 7,
+ 'août' => 8,
+ 'septembre' => 9,
+ 'octobre' => 10,
+ 'novembre' => 11,
+ 'décembre' => 12,
+ // German
+ 'januar' => 1,
+ 'februar' => 2,
+ 'märz' => 3,
+ 'april' => 4,
+ 'mai' => 5,
+ 'juni' => 6,
+ 'juli' => 7,
+ 'august' => 8,
+ 'september' => 9,
+ 'oktober' => 10,
+ 'november' => 11,
+ 'dezember' => 12,
+ // Italian
+ 'gennaio' => 1,
+ 'febbraio' => 2,
+ 'marzo' => 3,
+ 'aprile' => 4,
+ 'maggio' => 5,
+ 'giugno' => 6,
+ 'luglio' => 7,
+ 'agosto' => 8,
+ 'settembre' => 9,
+ 'ottobre' => 10,
+ 'novembre' => 11,
+ 'dicembre' => 12,
+ // Spanish
+ 'enero' => 1,
+ 'febrero' => 2,
+ 'marzo' => 3,
+ 'abril' => 4,
+ 'mayo' => 5,
+ 'junio' => 6,
+ 'julio' => 7,
+ 'agosto' => 8,
+ 'septiembre' => 9,
+ 'setiembre' => 9,
+ 'octubre' => 10,
+ 'noviembre' => 11,
+ 'diciembre' => 12,
+ // Finnish
+ 'tammikuu' => 1,
+ 'helmikuu' => 2,
+ 'maaliskuu' => 3,
+ 'huhtikuu' => 4,
+ 'toukokuu' => 5,
+ 'kesäkuu' => 6,
+ 'heinäkuu' => 7,
+ 'elokuu' => 8,
+ 'suuskuu' => 9,
+ 'lokakuu' => 10,
+ 'marras' => 11,
+ 'joulukuu' => 12,
+ // Hungarian
+ 'január' => 1,
+ 'február' => 2,
+ 'március' => 3,
+ 'április' => 4,
+ 'május' => 5,
+ 'június' => 6,
+ 'július' => 7,
+ 'augusztus' => 8,
+ 'szeptember' => 9,
+ 'október' => 10,
+ 'november' => 11,
+ 'december' => 12,
+ // Greek
+ 'Ιαν' => 1,
+ 'Φεβ' => 2,
+ 'Μάώ' => 3,
+ 'Μαώ' => 3,
+ 'Απρ' => 4,
+ 'Μάι' => 5,
+ 'Μαϊ' => 5,
+ 'Μαι' => 5,
+ 'Ιούν' => 6,
+ 'Ιον' => 6,
+ 'Ιούλ' => 7,
+ 'Ιολ' => 7,
+ 'Αύγ' => 8,
+ 'Αυγ' => 8,
+ 'Σεπ' => 9,
+ 'Οκτ' => 10,
+ 'Νοέ' => 11,
+ 'Δεκ' => 12,
+ );
+
+ /**
+ * List of timezones, abbreviation => offset from UTC
+ *
+ * @access protected
+ * @var array
+ */
+ var $timezone = array(
+ 'ACDT' => 37800,
+ 'ACIT' => 28800,
+ 'ACST' => 34200,
+ 'ACT' => -18000,
+ 'ACWDT' => 35100,
+ 'ACWST' => 31500,
+ 'AEDT' => 39600,
+ 'AEST' => 36000,
+ 'AFT' => 16200,
+ 'AKDT' => -28800,
+ 'AKST' => -32400,
+ 'AMDT' => 18000,
+ 'AMT' => -14400,
+ 'ANAST' => 46800,
+ 'ANAT' => 43200,
+ 'ART' => -10800,
+ 'AZOST' => -3600,
+ 'AZST' => 18000,
+ 'AZT' => 14400,
+ 'BIOT' => 21600,
+ 'BIT' => -43200,
+ 'BOT' => -14400,
+ 'BRST' => -7200,
+ 'BRT' => -10800,
+ 'BST' => 3600,
+ 'BTT' => 21600,
+ 'CAST' => 18000,
+ 'CAT' => 7200,
+ 'CCT' => 23400,
+ 'CDT' => -18000,
+ 'CEDT' => 7200,
+ 'CET' => 3600,
+ 'CGST' => -7200,
+ 'CGT' => -10800,
+ 'CHADT' => 49500,
+ 'CHAST' => 45900,
+ 'CIST' => -28800,
+ 'CKT' => -36000,
+ 'CLDT' => -10800,
+ 'CLST' => -14400,
+ 'COT' => -18000,
+ 'CST' => -21600,
+ 'CVT' => -3600,
+ 'CXT' => 25200,
+ 'DAVT' => 25200,
+ 'DTAT' => 36000,
+ 'EADT' => -18000,
+ 'EAST' => -21600,
+ 'EAT' => 10800,
+ 'ECT' => -18000,
+ 'EDT' => -14400,
+ 'EEST' => 10800,
+ 'EET' => 7200,
+ 'EGT' => -3600,
+ 'EKST' => 21600,
+ 'EST' => -18000,
+ 'FJT' => 43200,
+ 'FKDT' => -10800,
+ 'FKST' => -14400,
+ 'FNT' => -7200,
+ 'GALT' => -21600,
+ 'GEDT' => 14400,
+ 'GEST' => 10800,
+ 'GFT' => -10800,
+ 'GILT' => 43200,
+ 'GIT' => -32400,
+ 'GST' => 14400,
+ 'GST' => -7200,
+ 'GYT' => -14400,
+ 'HAA' => -10800,
+ 'HAC' => -18000,
+ 'HADT' => -32400,
+ 'HAE' => -14400,
+ 'HAP' => -25200,
+ 'HAR' => -21600,
+ 'HAST' => -36000,
+ 'HAT' => -9000,
+ 'HAY' => -28800,
+ 'HKST' => 28800,
+ 'HMT' => 18000,
+ 'HNA' => -14400,
+ 'HNC' => -21600,
+ 'HNE' => -18000,
+ 'HNP' => -28800,
+ 'HNR' => -25200,
+ 'HNT' => -12600,
+ 'HNY' => -32400,
+ 'IRDT' => 16200,
+ 'IRKST' => 32400,
+ 'IRKT' => 28800,
+ 'IRST' => 12600,
+ 'JFDT' => -10800,
+ 'JFST' => -14400,
+ 'JST' => 32400,
+ 'KGST' => 21600,
+ 'KGT' => 18000,
+ 'KOST' => 39600,
+ 'KOVST' => 28800,
+ 'KOVT' => 25200,
+ 'KRAST' => 28800,
+ 'KRAT' => 25200,
+ 'KST' => 32400,
+ 'LHDT' => 39600,
+ 'LHST' => 37800,
+ 'LINT' => 50400,
+ 'LKT' => 21600,
+ 'MAGST' => 43200,
+ 'MAGT' => 39600,
+ 'MAWT' => 21600,
+ 'MDT' => -21600,
+ 'MESZ' => 7200,
+ 'MEZ' => 3600,
+ 'MHT' => 43200,
+ 'MIT' => -34200,
+ 'MNST' => 32400,
+ 'MSDT' => 14400,
+ 'MSST' => 10800,
+ 'MST' => -25200,
+ 'MUT' => 14400,
+ 'MVT' => 18000,
+ 'MYT' => 28800,
+ 'NCT' => 39600,
+ 'NDT' => -9000,
+ 'NFT' => 41400,
+ 'NMIT' => 36000,
+ 'NOVST' => 25200,
+ 'NOVT' => 21600,
+ 'NPT' => 20700,
+ 'NRT' => 43200,
+ 'NST' => -12600,
+ 'NUT' => -39600,
+ 'NZDT' => 46800,
+ 'NZST' => 43200,
+ 'OMSST' => 25200,
+ 'OMST' => 21600,
+ 'PDT' => -25200,
+ 'PET' => -18000,
+ 'PETST' => 46800,
+ 'PETT' => 43200,
+ 'PGT' => 36000,
+ 'PHOT' => 46800,
+ 'PHT' => 28800,
+ 'PKT' => 18000,
+ 'PMDT' => -7200,
+ 'PMST' => -10800,
+ 'PONT' => 39600,
+ 'PST' => -28800,
+ 'PWT' => 32400,
+ 'PYST' => -10800,
+ 'PYT' => -14400,
+ 'RET' => 14400,
+ 'ROTT' => -10800,
+ 'SAMST' => 18000,
+ 'SAMT' => 14400,
+ 'SAST' => 7200,
+ 'SBT' => 39600,
+ 'SCDT' => 46800,
+ 'SCST' => 43200,
+ 'SCT' => 14400,
+ 'SEST' => 3600,
+ 'SGT' => 28800,
+ 'SIT' => 28800,
+ 'SRT' => -10800,
+ 'SST' => -39600,
+ 'SYST' => 10800,
+ 'SYT' => 7200,
+ 'TFT' => 18000,
+ 'THAT' => -36000,
+ 'TJT' => 18000,
+ 'TKT' => -36000,
+ 'TMT' => 18000,
+ 'TOT' => 46800,
+ 'TPT' => 32400,
+ 'TRUT' => 36000,
+ 'TVT' => 43200,
+ 'TWT' => 28800,
+ 'UYST' => -7200,
+ 'UYT' => -10800,
+ 'UZT' => 18000,
+ 'VET' => -14400,
+ 'VLAST' => 39600,
+ 'VLAT' => 36000,
+ 'VOST' => 21600,
+ 'VUT' => 39600,
+ 'WAST' => 7200,
+ 'WAT' => 3600,
+ 'WDT' => 32400,
+ 'WEST' => 3600,
+ 'WFT' => 43200,
+ 'WIB' => 25200,
+ 'WIT' => 32400,
+ 'WITA' => 28800,
+ 'WKST' => 18000,
+ 'WST' => 28800,
+ 'YAKST' => 36000,
+ 'YAKT' => 32400,
+ 'YAPT' => 36000,
+ 'YEKST' => 21600,
+ 'YEKT' => 18000,
+ );
+
+ /**
+ * Cached PCRE for SimplePie_Parse_Date::$day
+ *
+ * @access protected
+ * @var string
+ */
+ var $day_pcre;
+
+ /**
+ * Cached PCRE for SimplePie_Parse_Date::$month
+ *
+ * @access protected
+ * @var string
+ */
+ var $month_pcre;
+
+ /**
+ * Array of user-added callback methods
+ *
+ * @access private
+ * @var array
+ */
+ var $built_in = array();
+
+ /**
+ * Array of user-added callback methods
+ *
+ * @access private
+ * @var array
+ */
+ var $user = array();
+
+ /**
+ * Create new SimplePie_Parse_Date object, and set self::day_pcre,
+ * self::month_pcre, and self::built_in
+ *
+ * @access private
+ */
+ function SimplePie_Parse_Date()
+ {
+ $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
+ $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
+
+ static $cache;
+ if (!isset($cache[get_class($this)]))
+ {
+ if (extension_loaded('Reflection'))
+ {
+ $class = new ReflectionClass(get_class($this));
+ $methods = $class->getMethods();
+ $all_methods = array();
+ foreach ($methods as $method)
+ {
+ $all_methods[] = $method->getName();
+ }
+ }
+ else
+ {
+ $all_methods = get_class_methods($this);
+ }
+
+ foreach ($all_methods as $method)
+ {
+ if (strtolower(substr($method, 0, 5)) === 'date_')
+ {
+ $cache[get_class($this)][] = $method;
+ }
+ }
+ }
+
+ foreach ($cache[get_class($this)] as $method)
+ {
+ $this->built_in[] = $method;
+ }
+ }
+
+ /**
+ * Get the object
+ *
+ * @access public
+ */
+ function get()
+ {
+ static $object;
+ if (!$object)
+ {
+ $object = new SimplePie_Parse_Date;
+ }
+ return $object;
+ }
+
+ /**
+ * Parse a date
+ *
+ * @final
+ * @access public
+ * @param string $date Date to parse
+ * @return int Timestamp corresponding to date string, or false on failure
+ */
+ function parse($date)
+ {
+ foreach ($this->user as $method)
+ {
+ if (($returned = call_user_func($method, $date)) !== false)
+ {
+ return $returned;
+ }
+ }
+
+ foreach ($this->built_in as $method)
+ {
+ if (($returned = call_user_func(array(&$this, $method), $date)) !== false)
+ {
+ return $returned;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Add a callback method to parse a date
+ *
+ * @final
+ * @access public
+ * @param callback $callback
+ */
+ function add_callback($callback)
+ {
+ if (is_callable($callback))
+ {
+ $this->user[] = $callback;
+ }
+ else
+ {
+ trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
+ }
+ }
+
+ /**
+ * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as
+ * well as allowing any of upper or lower case "T", horizontal tabs, or
+ * spaces to be used as the time separator (including more than one))
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_w3cdtf($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $year = '([0-9]{4})';
+ $month = $day = $hour = $minute = $second = '([0-9]{2})';
+ $decimal = '([0-9]*)';
+ $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
+ $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Year
+ 2: Month
+ 3: Day
+ 4: Hour
+ 5: Minute
+ 6: Second
+ 7: Decimal fraction of a second
+ 8: Zulu
+ 9: Timezone ±
+ 10: Timezone hours
+ 11: Timezone minutes
+ */
+
+ // Fill in empty matches
+ for ($i = count($match); $i <= 3; $i++)
+ {
+ $match[$i] = '1';
+ }
+
+ for ($i = count($match); $i <= 7; $i++)
+ {
+ $match[$i] = '0';
+ }
+
+ // Numeric timezone
+ if (isset($match[9]) && $match[9] !== '')
+ {
+ $timezone = $match[10] * 3600;
+ $timezone += $match[11] * 60;
+ if ($match[9] === '-')
+ {
+ $timezone = 0 - $timezone;
+ }
+ }
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Convert the number of seconds to an integer, taking decimals into account
+ $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
+
+ return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Remove RFC822 comments
+ *
+ * @access protected
+ * @param string $data Data to strip comments from
+ * @return string Comment stripped string
+ */
+ function remove_rfc2822_comments($string)
+ {
+ $string = (string) $string;
+ $position = 0;
+ $length = strlen($string);
+ $depth = 0;
+
+ $output = '';
+
+ while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
+ {
+ $output .= substr($string, $position, $pos - $position);
+ $position = $pos + 1;
+ if ($string[$pos - 1] !== '\\')
+ {
+ $depth++;
+ while ($depth && $position < $length)
+ {
+ $position += strcspn($string, '()', $position);
+ if ($string[$position - 1] === '\\')
+ {
+ $position++;
+ continue;
+ }
+ elseif (isset($string[$position]))
+ {
+ switch ($string[$position])
+ {
+ case '(':
+ $depth++;
+ break;
+
+ case ')':
+ $depth--;
+ break;
+ }
+ $position++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ $output .= '(';
+ }
+ }
+ $output .= substr($string, $position);
+
+ return $output;
+ }
+
+ /**
+ * Parse RFC2822's date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_rfc2822($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $wsp = '[\x09\x20]';
+ $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
+ $optional_fws = $fws . '?';
+ $day_name = $this->day_pcre;
+ $month = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $hour = $minute = $second = '([0-9]{2})';
+ $year = '([0-9]{2,4})';
+ $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
+ $character_zone = '([A-Z]{1,5})';
+ $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
+ $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';
+ }
+ if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Day
+ 3: Month
+ 4: Year
+ 5: Hour
+ 6: Minute
+ 7: Second
+ 8: Timezone ±
+ 9: Timezone hours
+ 10: Timezone minutes
+ 11: Alphabetic timezone
+ */
+
+ // Find the month number
+ $month = $this->month[strtolower($match[3])];
+
+ // Numeric timezone
+ if ($match[8] !== '')
+ {
+ $timezone = $match[9] * 3600;
+ $timezone += $match[10] * 60;
+ if ($match[8] === '-')
+ {
+ $timezone = 0 - $timezone;
+ }
+ }
+ // Character timezone
+ elseif (isset($this->timezone[strtoupper($match[11])]))
+ {
+ $timezone = $this->timezone[strtoupper($match[11])];
+ }
+ // Assume everything else to be -0000
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Deal with 2/3 digit years
+ if ($match[4] < 50)
+ {
+ $match[4] += 2000;
+ }
+ elseif ($match[4] < 1000)
+ {
+ $match[4] += 1900;
+ }
+
+ // Second is optional, if it is empty set it to zero
+ if ($match[7] !== '')
+ {
+ $second = $match[7];
+ }
+ else
+ {
+ $second = 0;
+ }
+
+ return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse RFC850's date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_rfc850($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $space = '[\x09\x20]+';
+ $day_name = $this->day_pcre;
+ $month = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $year = $hour = $minute = $second = '([0-9]{2})';
+ $zone = '([A-Z]{1,5})';
+ $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Day
+ 3: Month
+ 4: Year
+ 5: Hour
+ 6: Minute
+ 7: Second
+ 8: Timezone
+ */
+
+ // Month
+ $month = $this->month[strtolower($match[3])];
+
+ // Character timezone
+ if (isset($this->timezone[strtoupper($match[8])]))
+ {
+ $timezone = $this->timezone[strtoupper($match[8])];
+ }
+ // Assume everything else to be -0000
+ else
+ {
+ $timezone = 0;
+ }
+
+ // Deal with 2 digit year
+ if ($match[4] < 50)
+ {
+ $match[4] += 2000;
+ }
+ else
+ {
+ $match[4] += 1900;
+ }
+
+ return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse C99's asctime()'s date format
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_asctime($date)
+ {
+ static $pcre;
+ if (!$pcre)
+ {
+ $space = '[\x09\x20]+';
+ $wday_name = $this->day_pcre;
+ $mon_name = $this->month_pcre;
+ $day = '([0-9]{1,2})';
+ $hour = $sec = $min = '([0-9]{2})';
+ $year = '([0-9]{4})';
+ $terminator = '\x0A?\x00?';
+ $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
+ }
+ if (preg_match($pcre, $date, $match))
+ {
+ /*
+ Capturing subpatterns:
+ 1: Day name
+ 2: Month
+ 3: Day
+ 4: Hour
+ 5: Minute
+ 6: Second
+ 7: Year
+ */
+
+ $month = $this->month[strtolower($match[2])];
+ return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Parse dates using strtotime()
+ *
+ * @access protected
+ * @return int Timestamp
+ */
+ function date_strtotime($date)
+ {
+ $strtotime = strtotime($date);
+ if ($strtotime === -1 || $strtotime === false)
+ {
+ return false;
+ }
+ else
+ {
+ return $strtotime;
+ }
+ }
+}
+
+/**
+ * Content-type sniffing
+ *
+ * @package SimplePie
+ */
+class SimplePie_Content_Type_Sniffer
+{
+ /**
+ * File object
+ *
+ * @var SimplePie_File
+ * @access private
+ */
+ var $file;
+
+ /**
+ * Create an instance of the class with the input file
+ *
+ * @access public
+ * @param SimplePie_Content_Type_Sniffer $file Input file
+ */
+ function SimplePie_Content_Type_Sniffer($file)
+ {
+ $this->file = $file;
+ }
+
+ /**
+ * Get the Content-Type of the specified file
+ *
+ * @access public
+ * @return string Actual Content-Type
+ */
+ function get_type()
+ {
+ if (isset($this->file->headers['content-type']))
+ {
+ if (!isset($this->file->headers['content-encoding'])
+ && ($this->file->headers['content-type'] === 'text/plain'
+ || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1'
+ || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1'))
+ {
+ return $this->text_or_binary();
+ }
+
+ if (($pos = strpos($this->file->headers['content-type'], ';')) !== false)
+ {
+ $official = substr($this->file->headers['content-type'], 0, $pos);
+ }
+ else
+ {
+ $official = $this->file->headers['content-type'];
+ }
+ $official = strtolower($official);
+
+ if ($official === 'unknown/unknown'
+ || $official === 'application/unknown')
+ {
+ return $this->unknown();
+ }
+ elseif (substr($official, -4) === '+xml'
+ || $official === 'text/xml'
+ || $official === 'application/xml')
+ {
+ return $official;
+ }
+ elseif (substr($official, 0, 6) === 'image/')
+ {
+ if ($return = $this->image())
+ {
+ return $return;
+ }
+ else
+ {
+ return $official;
+ }
+ }
+ elseif ($official === 'text/html')
+ {
+ return $this->feed_or_html();
+ }
+ else
+ {
+ return $official;
+ }
+ }
+ else
+ {
+ return $this->unknown();
+ }
+ }
+
+ /**
+ * Sniff text or binary
+ *
+ * @access private
+ * @return string Actual Content-Type
+ */
+ function text_or_binary()
+ {
+ if (substr($this->file->body, 0, 2) === "\xFE\xFF"
+ || substr($this->file->body, 0, 2) === "\xFF\xFE"
+ || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF"
+ || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF")
+ {
+ return 'text/plain';
+ }
+ elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body))
+ {
+ return 'application/octect-stream';
+ }
+ else
+ {
+ return 'text/plain';
+ }
+ }
+
+ /**
+ * Sniff unknown
+ *
+ * @access private
+ * @return string Actual Content-Type
+ */
+ function unknown()
+ {
+ $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20");
+ if (strtolower(substr($this->file->body, $ws, 14)) === '<!doctype html'
+ || strtolower(substr($this->file->body, $ws, 5)) === '<html'
+ || strtolower(substr($this->file->body, $ws, 7)) === '<script')
+ {
+ return 'text/html';
+ }
+ elseif (substr($this->file->body, 0, 5) === '%PDF-')
+ {
+ return 'application/pdf';
+ }
+ elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-')
+ {
+ return 'application/postscript';
+ }
+ elseif (substr($this->file->body, 0, 6) === 'GIF87a'
+ || substr($this->file->body, 0, 6) === 'GIF89a')
+ {
+ return 'image/gif';
+ }
+ elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
+ {
+ return 'image/png';
+ }
+ elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
+ {
+ return 'image/jpeg';
+ }
+ elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
+ {
+ return 'image/bmp';
+ }
+ else
+ {
+ return $this->text_or_binary();
+ }
+ }
+
+ /**
+ * Sniff images
+ *
+ * @access private
+ * @return string Actual Content-Type
+ */
+ function image()
+ {
+ if (substr($this->file->body, 0, 6) === 'GIF87a'
+ || substr($this->file->body, 0, 6) === 'GIF89a')
+ {
+ return 'image/gif';
+ }
+ elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
+ {
+ return 'image/png';
+ }
+ elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
+ {
+ return 'image/jpeg';
+ }
+ elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
+ {
+ return 'image/bmp';
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Sniff HTML
+ *
+ * @access private
+ * @return string Actual Content-Type
+ */
+ function feed_or_html()
+ {
+ $len = strlen($this->file->body);
+ $pos = strspn($this->file->body, "\x09\x0A\x0D\x20");
+
+ while ($pos < $len)
+ {
+ switch ($this->file->body[$pos])
+ {
+ case "\x09":
+ case "\x0A":
+ case "\x0D":
+ case "\x20":
+ $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos);
+ continue 2;
+
+ case '<':
+ $pos++;
+ break;
+
+ default:
+ return 'text/html';
+ }
+
+ if (substr($this->file->body, $pos, 3) === '!--')
+ {
+ $pos += 3;
+ if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false)
+ {
+ $pos += 3;
+ }
+ else
+ {
+ return 'text/html';
+ }
+ }
+ elseif (substr($this->file->body, $pos, 1) === '!')
+ {
+ if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false)
+ {
+ $pos++;
+ }
+ else
+ {
+ return 'text/html';
+ }
+ }
+ elseif (substr($this->file->body, $pos, 1) === '?')
+ {
+ if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false)
+ {
+ $pos += 2;
+ }
+ else
+ {
+ return 'text/html';
+ }
+ }
+ elseif (substr($this->file->body, $pos, 3) === 'rss'
+ || substr($this->file->body, $pos, 7) === 'rdf:RDF')
+ {
+ return 'application/rss+xml';
+ }
+ elseif (substr($this->file->body, $pos, 4) === 'feed')
+ {
+ return 'application/atom+xml';
+ }
+ else
+ {
+ return 'text/html';
+ }
+ }
+
+ return 'text/html';
+ }
+}
+
+/**
+ * Parses the XML Declaration
+ *
+ * @package SimplePie
+ */
+class SimplePie_XML_Declaration_Parser
+{
+ /**
+ * XML Version
+ *
+ * @access public
+ * @var string
+ */
+ var $version = '1.0';
+
+ /**
+ * Encoding
+ *
+ * @access public
+ * @var string
+ */
+ var $encoding = 'UTF-8';
+
+ /**
+ * Standalone
+ *
+ * @access public
+ * @var bool
+ */
+ var $standalone = false;
+
+ /**
+ * Current state of the state machine
+ *
+ * @access private
+ * @var string
+ */
+ var $state = 'before_version_name';
+
+ /**
+ * Input data
+ *
+ * @access private
+ * @var string
+ */
+ var $data = '';
+
+ /**
+ * Input data length (to avoid calling strlen() everytime this is needed)
+ *
+ * @access private
+ * @var int
+ */
+ var $data_length = 0;
+
+ /**
+ * Current position of the pointer
+ *
+ * @var int
+ * @access private
+ */
+ var $position = 0;
+
+ /**
+ * Create an instance of the class with the input data
+ *
+ * @access public
+ * @param string $data Input data
+ */
+ function SimplePie_XML_Declaration_Parser($data)
+ {
+ $this->data = $data;
+ $this->data_length = strlen($this->data);
+ }
+
+ /**
+ * Parse the input data
+ *
+ * @access public
+ * @return bool true on success, false on failure
+ */
+ function parse()
+ {
+ while ($this->state && $this->state !== 'emit' && $this->has_data())
+ {
+ $state = $this->state;
+ $this->$state();
+ }
+ $this->data = '';
+ if ($this->state === 'emit')
+ {
+ return true;
+ }
+ else
+ {
+ $this->version = '';
+ $this->encoding = '';
+ $this->standalone = '';
+ return false;
+ }
+ }
+
+ /**
+ * Check whether there is data beyond the pointer
+ *
+ * @access private
+ * @return bool true if there is further data, false if not
+ */
+ function has_data()
+ {
+ return (bool) ($this->position < $this->data_length);
+ }
+
+ /**
+ * Advance past any whitespace
+ *
+ * @return int Number of whitespace characters passed
+ */
+ function skip_whitespace()
+ {
+ $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position);
+ $this->position += $whitespace;
+ return $whitespace;
+ }
+
+ /**
+ * Read value
+ */
+ function get_value()
+ {
+ $quote = substr($this->data, $this->position, 1);
+ if ($quote === '"' || $quote === "'")
+ {
+ $this->position++;
+ $len = strcspn($this->data, $quote, $this->position);
+ if ($this->has_data())
+ {
+ $value = substr($this->data, $this->position, $len);
+ $this->position += $len + 1;
+ return $value;
+ }
+ }
+ return false;
+ }
+
+ function before_version_name()
+ {
+ if ($this->skip_whitespace())
+ {
+ $this->state = 'version_name';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ function version_name()
+ {
+ if (substr($this->data, $this->position, 7) === 'version')
+ {
+ $this->position += 7;
+ $this->skip_whitespace();
+ $this->state = 'version_equals';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ function version_equals()
+ {
+ if (substr($this->data, $this->position, 1) === '=')
+ {
+ $this->position++;
+ $this->skip_whitespace();
+ $this->state = 'version_value';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ function version_value()
+ {
+ if ($this->version = $this->get_value())
+ {
+ $this->skip_whitespace();
+ if ($this->has_data())
+ {
+ $this->state = 'encoding_name';
+ }
+ else
+ {
+ $this->state = 'emit';
+ }
+ }
+ else
+ {
+ $this->state = 'standalone_name';
+ }
+ }
+
+ function encoding_name()
+ {
+ if (substr($this->data, $this->position, 8) === 'encoding')
+ {
+ $this->position += 8;
+ $this->skip_whitespace();
+ $this->state = 'encoding_equals';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ function encoding_equals()
+ {
+ if (substr($this->data, $this->position, 1) === '=')
+ {
+ $this->position++;
+ $this->skip_whitespace();
+ $this->state = 'encoding_value';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ function encoding_value()
+ {
+ if ($this->encoding = $this->get_value())
+ {
+ $this->skip_whitespace();
+ if ($this->has_data())
+ {
+ $this->state = 'standalone_name';
+ }
+ else
+ {
+ $this->state = 'emit';
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ function standalone_name()
+ {
+ if (substr($this->data, $this->position, 10) === 'standalone')
+ {
+ $this->position += 10;
+ $this->skip_whitespace();
+ $this->state = 'standalone_equals';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ function standalone_equals()
+ {
+ if (substr($this->data, $this->position, 1) === '=')
+ {
+ $this->position++;
+ $this->skip_whitespace();
+ $this->state = 'standalone_value';
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+
+ function standalone_value()
+ {
+ if ($standalone = $this->get_value())
+ {
+ switch ($standalone)
+ {
+ case 'yes':
+ $this->standalone = true;
+ break;
+
+ case 'no':
+ $this->standalone = false;
+ break;
+
+ default:
+ $this->state = false;
+ return;
+ }
+
+ $this->skip_whitespace();
+ if ($this->has_data())
+ {
+ $this->state = false;
+ }
+ else
+ {
+ $this->state = 'emit';
+ }
+ }
+ else
+ {
+ $this->state = false;
+ }
+ }
+}
+
+class SimplePie_Locator
+{
+ var $useragent;
+ var $timeout;
+ var $file;
+ var $local = array();
+ var $elsewhere = array();
+ var $file_class = 'SimplePie_File';
+ var $cached_entities = array();
+ var $http_base;
+ var $base;
+ var $base_location = 0;
+ var $checked_feeds = 0;
+ var $max_checked_feeds = 10;
+ var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer';
+
+ function SimplePie_Locator(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer')
+ {
+ $this->file =& $file;
+ $this->file_class = $file_class;
+ $this->useragent = $useragent;
+ $this->timeout = $timeout;
+ $this->max_checked_feeds = $max_checked_feeds;
+ $this->content_type_sniffer_class = $content_type_sniffer_class;
+ }
+
+ function find($type = SIMPLEPIE_LOCATOR_ALL)
+ {
+ if ($this->is_feed($this->file))
+ {
+ return $this->file;
+ }
+
+ if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
+ {
+ $sniffer = new $this->content_type_sniffer_class($this->file);
+ if ($sniffer->get_type() !== 'text/html')
+ {
+ return null;
+ }
+ }
+
+ if ($type & ~SIMPLEPIE_LOCATOR_NONE)
+ {
+ $this->get_base();
+ }
+
+ if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery())
+ {
+ return $working;
+ }
+
+ if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links())
+ {
+ if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local))
+ {
+ return $working;
+ }
+
+ if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local))
+ {
+ return $working;
+ }
+
+ if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere))
+ {
+ return $working;
+ }
+
+ if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere))
+ {
+ return $working;
+ }
+ }
+ return null;
+ }
+
+ function is_feed(&$file)
+ {
+ if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
+ {
+ $sniffer = new $this->content_type_sniffer_class($file);
+ $sniffed = $sniffer->get_type();
+ if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml')))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ function get_base()
+ {
+ $this->http_base = $this->file->url;
+ $this->base = $this->http_base;
+ $elements = SimplePie_Misc::get_element('base', $this->file->body);
+ foreach ($elements as $element)
+ {
+ if ($element['attribs']['href']['data'] !== '')
+ {
+ $this->base = SimplePie_Misc::absolutize_url(trim($element['attribs']['href']['data']), $this->http_base);
+ $this->base_location = $element['offset'];
+ break;
+ }
+ }
+ }
+
+ function autodiscovery()
+ {
+ $links = array_merge(SimplePie_Misc::get_element('link', $this->file->body), SimplePie_Misc::get_element('a', $this->file->body), SimplePie_Misc::get_element('area', $this->file->body));
+ $done = array();
+ foreach ($links as $link)
+ {
+ if ($this->checked_feeds == $this->max_checked_feeds)
+ {
+ break;
+ }
+ if (isset($link['attribs']['href']['data']) && isset($link['attribs']['rel']['data']))
+ {
+ $rel = array_unique(SimplePie_Misc::space_separated_tokens(strtolower($link['attribs']['rel']['data'])));
+
+ if ($this->base_location < $link['offset'])
+ {
+ $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base);
+ }
+ else
+ {
+ $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base);
+ }
+
+ if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !empty($link['attribs']['type']['data']) && in_array(strtolower(SimplePie_Misc::parse_mime($link['attribs']['type']['data'])), array('application/rss+xml', 'application/atom+xml'))))
+ {
+ $this->checked_feeds++;
+ $feed =& new $this->file_class($href, $this->timeout, 5, null, $this->useragent);
+ if ($this->is_feed($feed))
+ {
+ return $feed;
+ }
+ }
+ $done[] = $href;
+ }
+ }
+ return null;
+ }
+
+ function get_links()
+ {
+ $links = SimplePie_Misc::get_element('a', $this->file->body);
+ foreach ($links as $link)
+ {
+ if (isset($link['attribs']['href']['data']))
+ {
+ $href = trim($link['attribs']['href']['data']);
+ $parsed = SimplePie_Misc::parse_url($href);
+ if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme']))
+ {
+ if ($this->base_location < $link['offset'])
+ {
+ $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base);
+ }
+ else
+ {
+ $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base);
+ }
+
+ $current = SimplePie_Misc::parse_url($this->file->url);
+
+ if ($parsed['authority'] === '' || $parsed['authority'] == $current['authority'])
+ {
+ $this->local[] = $href;
+ }
+ else
+ {
+ $this->elsewhere[] = $href;
+ }
+ }
+ }
+ }
+ $this->local = array_unique($this->local);
+ $this->elsewhere = array_unique($this->elsewhere);
+ if (!empty($this->local) || !empty($this->elsewhere))
+ {
+ return true;
+ }
+ return null;
+ }
+
+ function extension(&$array)
+ {
+ foreach ($array as $key => $value)
+ {
+ if ($this->checked_feeds == $this->max_checked_feeds)
+ {
+ break;
+ }
+ if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml')))
+ {
+ $this->checked_feeds++;
+ $feed =& new $this->file_class($value, $this->timeout, 5, null, $this->useragent);
+ if ($this->is_feed($feed))
+ {
+ return $feed;
+ }
+ else
+ {
+ unset($array[$key]);
+ }
+ }
+ }
+ return null;
+ }
+
+ function body(&$array)
+ {
+ foreach ($array as $key => $value)
+ {
+ if ($this->checked_feeds == $this->max_checked_feeds)
+ {
+ break;
+ }
+ if (preg_match('/(rss|rdf|atom|xml)/i', $value))
+ {
+ $this->checked_feeds++;
+ $feed =& new $this->file_class($value, $this->timeout, 5, null, $this->useragent);
+ if ($this->is_feed($feed))
+ {
+ return $feed;
+ }
+ else
+ {
+ unset($array[$key]);
+ }
+ }
+ }
+ return null;
+ }
+}
+
+class SimplePie_Parser
+{
+ var $error_code;
+ var $error_string;
+ var $current_line;
+ var $current_column;
+ var $current_byte;
+ var $separator = ' ';
+ var $feed = false;
+ var $namespace = array('');
+ var $element = array('');
+ var $xml_base = array('');
+ var $xml_base_explicit = array(false);
+ var $xml_lang = array('');
+ var $data = array();
+ var $datas = array(array());
+ var $current_xhtml_construct = -1;
+ var $encoding;
+
+ function parse(&$data, $encoding)
+ {
+ // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
+ if (strtoupper($encoding) == 'US-ASCII')
+ {
+ $this->encoding = 'UTF-8';
+ }
+ else
+ {
+ $this->encoding = $encoding;
+ }
+
+ // Strip BOM:
+ // UTF-32 Big Endian BOM
+ if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
+ {
+ $data = substr($data, 4);
+ }
+ // UTF-32 Little Endian BOM
+ elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
+ {
+ $data = substr($data, 4);
+ }
+ // UTF-16 Big Endian BOM
+ elseif (substr($data, 0, 2) === "\xFE\xFF")
+ {
+ $data = substr($data, 2);
+ }
+ // UTF-16 Little Endian BOM
+ elseif (substr($data, 0, 2) === "\xFF\xFE")
+ {
+ $data = substr($data, 2);
+ }
+ // UTF-8 BOM
+ elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
+ {
+ $data = substr($data, 3);
+ }
+
+ if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false)
+ {
+ $declaration = new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5));
+ if ($declaration->parse())
+ {
+ $data = substr($data, $pos + 2);
+ $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data;
+ }
+ else
+ {
+ $this->error_string = 'SimplePie bug! Please report this!';
+ return false;
+ }
+ }
+
+ // Work around libxml bug
+ $data = str_replace('&lt;', '&#60;', $data);
+ $data = str_replace('&gt;', '&#62;', $data);
+ $data = str_replace('&amp;', '&#38;', $data);
+ $data = str_replace('&apos;', '&#39;', $data);
+ $data = str_replace('&quot;', '&#34;', $data);
+
+ $return = true;
+
+ // Create the parser
+ $xml = xml_parser_create_ns($this->encoding, $this->separator);
+ xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1);
+ xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0);
+ xml_set_object($xml, $this);
+ xml_set_character_data_handler($xml, 'cdata');
+ xml_set_element_handler($xml, 'tag_open', 'tag_close');
+
+ // Parse!
+ if (!xml_parse($xml, $data, true))
+ {
+ $this->error_code = xml_get_error_code($xml);
+ $this->error_string = xml_error_string($this->error_code);
+ $return = false;
+ }
+ $this->current_line = xml_get_current_line_number($xml);
+ $this->current_column = xml_get_current_column_number($xml);
+ $this->current_byte = xml_get_current_byte_index($xml);
+ xml_parser_free($xml);
+ return $return;
+ }
+
+ function get_error_code()
+ {
+ return $this->error_code;
+ }
+
+ function get_error_string()
+ {
+ return $this->error_string;
+ }
+
+ function get_current_line()
+ {
+ return $this->current_line;
+ }
+
+ function get_current_column()
+ {
+ return $this->current_column;
+ }
+
+ function get_current_byte()
+ {
+ return $this->current_byte;
+ }
+
+ function get_data()
+ {
+ return $this->data;
+ }
+
+ function tag_open($parser, $tag, $attributes)
+ {
+ if ($this->feed === 0)
+ {
+ return;
+ }
+ elseif ($this->feed == false)
+ {
+ if (in_array($tag, array(
+ SIMPLEPIE_NAMESPACE_ATOM_10 . $this->separator . 'feed',
+ SIMPLEPIE_NAMESPACE_ATOM_03 . $this->separator . 'feed',
+ 'rss',
+ SIMPLEPIE_NAMESPACE_RDF . $this->separator . 'RDF'
+ )))
+ {
+ $this->feed = 1;
+ }
+ }
+ else
+ {
+ $this->feed++;
+ }
+
+ list($this->namespace[], $this->element[]) = $this->split_ns($tag);
+
+ $attribs = array();
+ foreach ($attributes as $name => $value)
+ {
+ list($attrib_namespace, $attribute) = $this->split_ns($name);
+ $attribs[$attrib_namespace][$attribute] = $value;
+ }
+
+ if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base']))
+ {
+ $this->xml_base[] = SimplePie_Misc::absolutize_url($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base));
+ $this->xml_base_explicit[] = true;
+ }
+ else
+ {
+ $this->xml_base[] = end($this->xml_base);
+ $this->xml_base_explicit[] = end($this->xml_base_explicit);
+ }
+
+ if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang']))
+ {
+ $this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang'];
+ }
+ else
+ {
+ $this->xml_lang[] = end($this->xml_lang);
+ }
+
+ if ($this->current_xhtml_construct >= 0)
+ {
+ $this->current_xhtml_construct++;
+ if (end($this->namespace) == SIMPLEPIE_NAMESPACE_XHTML)
+ {
+ $this->data['data'] .= '<' . end($this->element);
+ if (isset($attribs['']))
+ {
+ foreach ($attribs[''] as $name => $value)
+ {
+ $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"';
+ }
+ }
+ $this->data['data'] .= '>';
+ }
+ }
+ else
+ {
+ $this->datas[] =& $this->data;
+ $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][];
+ $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang));
+ if ((end($this->namespace) == SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] == 'xml')
+ || (end($this->namespace) == SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] == 'xhtml'))
+ {
+ $this->current_xhtml_construct = 0;
+ }
+ }
+ }
+
+ function cdata($parser, $cdata)
+ {
+ if ($this->current_xhtml_construct >= 0)
+ {
+ $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding);
+ }
+ elseif ($this->feed > 1)
+ {
+ $this->data['data'] .= $cdata;
+ }
+ }
+
+ function tag_close($parser, $tag)
+ {
+ if (!$this->feed)
+ {
+ return;
+ }
+
+ if ($this->current_xhtml_construct >= 0)
+ {
+ $this->current_xhtml_construct--;
+ if (end($this->namespace) == SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param')))
+ {
+ $this->data['data'] .= '</' . end($this->element) . '>';
+ }
+ }
+ if ($this->current_xhtml_construct == -1)
+ {
+ $this->data =& $this->datas[$this->feed];
+ array_pop($this->datas);
+ }
+
+ array_pop($this->element);
+ array_pop($this->namespace);
+ array_pop($this->xml_base);
+ array_pop($this->xml_base_explicit);
+ array_pop($this->xml_lang);
+ $this->feed--;
+ }
+
+ function split_ns($string)
+ {
+ static $cache = array();
+ if (!isset($cache[$string]))
+ {
+ if ($pos = strpos($string, $this->separator))
+ {
+ static $separator_length;
+ if (!$separator_length)
+ {
+ $separator_length = strlen($this->separator);
+ }
+ $namespace = substr($string, 0, $pos);
+ $local_name = substr($string, $pos + $separator_length);
+ if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES)
+ {
+ $namespace = SIMPLEPIE_NAMESPACE_ITUNES;
+ }
+
+ // Normalize the Media RSS namespaces
+ if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG)
+ {
+ $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS;
+ }
+ $cache[$string] = array($namespace, $local_name);
+ }
+ else
+ {
+ $cache[$string] = array('', $string);
+ }
+ }
+ return $cache[$string];
+ }
+}
+
+/**
+ * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags
+ */
+class SimplePie_Sanitize
+{
+ // Private vars
+ var $base;
+
+ // Options
+ var $remove_div = true;
+ var $image_handler = '';
+ var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
+ var $encode_instead_of_strip = false;
+ var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
+ var $strip_comments = false;
+ var $output_encoding = 'UTF-8';
+ var $enable_cache = true;
+ var $cache_location = './cache';
+ var $cache_name_function = 'md5';
+ var $cache_class = 'SimplePie_Cache';
+ var $file_class = 'SimplePie_File';
+ var $timeout = 10;
+ var $useragent = '';
+ var $force_fsockopen = false;
+
+ var $replace_url_attributes = array(
+ 'a' => 'href',
+ 'area' => 'href',
+ 'blockquote' => 'cite',
+ 'del' => 'cite',
+ 'form' => 'action',
+ 'img' => array('longdesc', 'src'),
+ 'input' => 'src',
+ 'ins' => 'cite',
+ 'q' => 'cite'
+ );
+
+ function remove_div($enable = true)
+ {
+ $this->remove_div = (bool) $enable;
+ }
+
+ function set_image_handler($page = false)
+ {
+ if ($page)
+ {
+ $this->image_handler = (string) $page;
+ }
+ else
+ {
+ $this->image_handler = false;
+ }
+ }
+
+ function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache')
+ {
+ if (isset($enable_cache))
+ {
+ $this->enable_cache = (bool) $enable_cache;
+ }
+
+ if ($cache_location)
+ {
+ $this->cache_location = (string) $cache_location;
+ }
+
+ if ($cache_name_function)
+ {
+ $this->cache_name_function = (string) $cache_name_function;
+ }
+
+ if ($cache_class)
+ {
+ $this->cache_class = (string) $cache_class;
+ }
+ }
+
+ function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false)
+ {
+ if ($file_class)
+ {
+ $this->file_class = (string) $file_class;
+ }
+
+ if ($timeout)
+ {
+ $this->timeout = (string) $timeout;
+ }
+
+ if ($useragent)
+ {
+ $this->useragent = (string) $useragent;
+ }
+
+ if ($force_fsockopen)
+ {
+ $this->force_fsockopen = (string) $force_fsockopen;
+ }
+ }
+
+ function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))
+ {
+ if ($tags)
+ {
+ if (is_array($tags))
+ {
+ $this->strip_htmltags = $tags;
+ }
+ else
+ {
+ $this->strip_htmltags = explode(',', $tags);
+ }
+ }
+ else
+ {
+ $this->strip_htmltags = false;
+ }
+ }
+
+ function encode_instead_of_strip($encode = false)
+ {
+ $this->encode_instead_of_strip = (bool) $encode;
+ }
+
+ function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'))
+ {
+ if ($attribs)
+ {
+ if (is_array($attribs))
+ {
+ $this->strip_attributes = $attribs;
+ }
+ else
+ {
+ $this->strip_attributes = explode(',', $attribs);
+ }
+ }
+ else
+ {
+ $this->strip_attributes = false;
+ }
+ }
+
+ function strip_comments($strip = false)
+ {
+ $this->strip_comments = (bool) $strip;
+ }
+
+ function set_output_encoding($encoding = 'UTF-8')
+ {
+ $this->output_encoding = (string) $encoding;
+ }
+
+ /**
+ * Set element/attribute key/value pairs of HTML attributes
+ * containing URLs that need to be resolved relative to the feed
+ *
+ * @access public
+ * @since 1.0
+ * @param array $element_attribute Element/attribute key/value pairs
+ */
+ function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite'))
+ {
+ $this->replace_url_attributes = (array) $element_attribute;
+ }
+
+ function sanitize($data, $type, $base = '')
+ {
+ $data = trim($data);
+ if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI)
+ {
+ if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML)
+ {
+ if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data))
+ {
+ $type |= SIMPLEPIE_CONSTRUCT_HTML;
+ }
+ else
+ {
+ $type |= SIMPLEPIE_CONSTRUCT_TEXT;
+ }
+ }
+
+ if ($type & SIMPLEPIE_CONSTRUCT_BASE64)
+ {
+ $data = base64_decode($data);
+ }
+
+ if ($type & SIMPLEPIE_CONSTRUCT_XHTML)
+ {
+ if ($this->remove_div)
+ {
+ $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data);
+ $data = preg_replace('/<\/div>$/', '', $data);
+ }
+ else
+ {
+ $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data);
+ }
+ }
+
+ if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML))
+ {
+ // Strip comments
+ if ($this->strip_comments)
+ {
+ $data = SimplePie_Misc::strip_comments($data);
+ }
+
+ // Strip out HTML tags and attributes that might cause various security problems.
+ // Based on recommendations by Mark Pilgrim at:
+ // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely
+ if ($this->strip_htmltags)
+ {
+ foreach ($this->strip_htmltags as $tag)
+ {
+ $pcre = "/<($tag)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$tag" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>|(\/)?>)/siU';
+ while (preg_match($pcre, $data))
+ {
+ $data = preg_replace_callback($pcre, array(&$this, 'do_strip_htmltags'), $data);
+ }
+ }
+ }
+
+ if ($this->strip_attributes)
+ {
+ foreach ($this->strip_attributes as $attrib)
+ {
+ $data = preg_replace('/(<[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*)' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . trim($attrib) . '(?:\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>/', '\1\2\3>', $data);
+ }
+ }
+
+ // Replace relative URLs
+ $this->base = $base;
+ foreach ($this->replace_url_attributes as $element => $attributes)
+ {
+ $data = $this->replace_urls($data, $element, $attributes);
+ }
+
+ // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags.
+ if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache)
+ {
+ $images = SimplePie_Misc::get_element('img', $data);
+ foreach ($images as $img)
+ {
+ if (isset($img['attribs']['src']['data']))
+ {
+ $image_url = call_user_func($this->cache_name_function, $img['attribs']['src']['data']);
+ $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $image_url, 'spi');
+
+ if ($cache->load())
+ {
+ $img['attribs']['src']['data'] = $this->image_handler . $image_url;
+ $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data);
+ }
+ else
+ {
+ $file =& new $this->file_class($img['attribs']['src']['data'], $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen);
+ $headers = $file->headers;
+
+ if ($file->success && ($file->status_code == 200 || ($file->status_code > 206 && $file->status_code < 300)))
+ {
+ if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
+ {
+ $img['attribs']['src']['data'] = $this->image_handler . $image_url;
+ $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data);
+ }
+ else
+ {
+ trigger_error("$cache->name is not writeable", E_USER_WARNING);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Having (possibly) taken stuff out, there may now be whitespace at the beginning/end of the data
+ $data = trim($data);
+ }
+
+ if ($type & SIMPLEPIE_CONSTRUCT_IRI)
+ {
+ $data = SimplePie_Misc::absolutize_url($data, $base);
+ }
+
+ if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI))
+ {
+ $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8');
+ }
+
+ if ($this->output_encoding != 'UTF-8')
+ {
+ $data = SimplePie_Misc::change_encoding($data, 'UTF-8', $this->output_encoding);
+ }
+ }
+ return $data;
+ }
+
+ function replace_urls($data, $tag, $attributes)
+ {
+ if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags))
+ {
+ $elements = SimplePie_Misc::get_element($tag, $data);
+ foreach ($elements as $element)
+ {
+ if (is_array($attributes))
+ {
+ foreach ($attributes as $attribute)
+ {
+ if (isset($element['attribs'][$attribute]['data']))
+ {
+ $element['attribs'][$attribute]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attribute]['data'], $this->base);
+ $new_element = SimplePie_Misc::element_implode($element);
+ $data = str_replace($element['full'], $new_element, $data);
+ $element['full'] = $new_element;
+ }
+ }
+ }
+ elseif (isset($element['attribs'][$attributes]['data']))
+ {
+ $element['attribs'][$attributes]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attributes]['data'], $this->base);
+ $data = str_replace($element['full'], SimplePie_Misc::element_implode($element), $data);
+ }
+ }
+ }
+ return $data;
+ }
+
+ function do_strip_htmltags($match)
+ {
+ if ($this->encode_instead_of_strip)
+ {
+ if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
+ {
+ $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8');
+ $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8');
+ return "&lt;$match[1]$match[2]&gt;$match[3]&lt;/$match[1]&gt;";
+ }
+ else
+ {
+ return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8');
+ }
+ }
+ elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
+ {
+ return $match[4];
+ }
+ else
+ {
+ return '';
+ }
+ }
+}
+
+?>
diff --git a/src/etc/inc/smtp.inc b/src/etc/inc/smtp.inc
new file mode 100644
index 0000000..035a30a
--- /dev/null
+++ b/src/etc/inc/smtp.inc
@@ -0,0 +1,862 @@
+<?php
+/*
+ * smtp.php
+ *
+ * @(#) $Header$
+ *
+ */
+
+/*
+ pfSense_MODULE: notifications
+*/
+
+class smtp_class
+{
+ var $user="";
+ var $realm="";
+ var $password="";
+ var $workstation="";
+ var $authentication_mechanism="";
+ var $host_name="";
+ var $host_port=25;
+ var $ssl=0;
+ var $tls=0;
+ var $localhost="";
+ var $timeout=0;
+ var $data_timeout=0;
+ var $direct_delivery=0;
+ var $error="";
+ var $debug=0;
+ var $html_debug=0;
+ var $esmtp=1;
+ var $esmtp_host="";
+ var $esmtp_extensions=array();
+ var $maximum_piped_recipients=100;
+ var $exclude_address="";
+ var $getmxrr="GetMXRR";
+ var $pop3_auth_host="";
+ var $pop3_auth_port=110;
+
+ /* private variables - DO NOT ACCESS */
+
+ var $state="Disconnected";
+ var $connection=0;
+ var $pending_recipients=0;
+ var $next_token="";
+ var $direct_sender="";
+ var $connected_domain="";
+ var $result_code;
+ var $disconnected_error=0;
+
+ /* Private methods - DO NOT CALL */
+
+ Function Tokenize($string,$separator="")
+ {
+ if(!strcmp($separator,""))
+ {
+ $separator=$string;
+ $string=$this->next_token;
+ }
+ for($character=0;$character<strlen($separator);$character++)
+ {
+ if(GetType($position=strpos($string,$separator[$character]))=="integer")
+ $found=(IsSet($found) ? min($found,$position) : $position);
+ }
+ if(IsSet($found))
+ {
+ $this->next_token=substr($string,$found+1);
+ return(substr($string,0,$found));
+ }
+ else
+ {
+ $this->next_token="";
+ return($string);
+ }
+ }
+
+ Function OutputDebug($message)
+ {
+ $message.="\n";
+ if($this->html_debug)
+ $message=str_replace("\n","<br />\n",HtmlEntities($message));
+ echo $message;
+ flush();
+ }
+
+ Function SetDataAccessError($error)
+ {
+ $this->error=$error;
+ if(function_exists("socket_get_status"))
+ {
+ $status=socket_get_status($this->connection);
+ if($status["timed_out"])
+ $this->error.=gettext(": data access time out");
+ elseif($status["eof"])
+ {
+ $this->error.=gettext(": the server disconnected");
+ $this->disconnected_error=1;
+ }
+ }
+ }
+
+ Function GetLine()
+ {
+ for($line="";;)
+ {
+ if(feof($this->connection))
+ {
+ $this->error=gettext("reached the end of data while reading from the SMTP server connection");
+ return("");
+ }
+ if(GetType($data=@fgets($this->connection,100))!="string"
+ || strlen($data)==0)
+ {
+ $this->SetDataAccessError(gettext("it was not possible to read line from the SMTP server"));
+ return("");
+ }
+ $line.=$data;
+ $length=strlen($line);
+ if($length>=2
+ && substr($line,$length-2,2)=="\r\n")
+ {
+ $line=substr($line,0,$length-2);
+ if($this->debug)
+ $this->OutputDebug("S $line");
+ return($line);
+ }
+ }
+ }
+
+ Function PutLine($line)
+ {
+ if($this->debug)
+ $this->OutputDebug("C $line");
+ if(!@fputs($this->connection,"$line\r\n"))
+ {
+ $this->SetDataAccessError(gettext("it was not possible to send a line to the SMTP server"));
+ return(0);
+ }
+ return(1);
+ }
+
+ Function PutData(&$data)
+ {
+ if(strlen($data))
+ {
+ if($this->debug)
+ $this->OutputDebug("C $data");
+ if(!@fputs($this->connection,$data))
+ {
+ $this->SetDataAccessError(gettext("it was not possible to send data to the SMTP server"));
+ return(0);
+ }
+ }
+ return(1);
+ }
+
+ Function VerifyResultLines($code,&$responses)
+ {
+ $responses=array();
+ Unset($this->result_code);
+ while(strlen($line=$this->GetLine($this->connection)))
+ {
+ if(IsSet($this->result_code))
+ {
+ if(strcmp($this->Tokenize($line," -"),$this->result_code))
+ {
+ $this->error=$line;
+ return(0);
+ }
+ }
+ else
+ {
+ $this->result_code=$this->Tokenize($line," -");
+ if(GetType($code)=="array")
+ {
+ for($codes=0;$codes<count($code) && strcmp($this->result_code,$code[$codes]);$codes++);
+ if($codes>=count($code))
+ {
+ $this->error=$line;
+ return(0);
+ }
+ }
+ else
+ {
+ if(strcmp($this->result_code,$code))
+ {
+ $this->error=$line;
+ return(0);
+ }
+ }
+ }
+ $responses[]=$this->Tokenize("");
+ if(!strcmp($this->result_code,$this->Tokenize($line," ")))
+ return(1);
+ }
+ return(-1);
+ }
+
+ Function FlushRecipients()
+ {
+ if($this->pending_sender)
+ {
+ if($this->VerifyResultLines("250",$responses)<=0)
+ return(0);
+ $this->pending_sender=0;
+ }
+ for(;$this->pending_recipients;$this->pending_recipients--)
+ {
+ if($this->VerifyResultLines(array("250","251"),$responses)<=0)
+ return(0);
+ }
+ return(1);
+ }
+
+ Function ConnectToHost($domain, $port, $resolve_message)
+ {
+ if($this->ssl || $this->tls)
+ {
+ $version=explode(".",function_exists("phpversion") ? phpversion() : "3.0.7");
+ $php_version=intval($version[0])*1000000+intval($version[1])*1000+intval($version[2]);
+ if($php_version<4003000)
+ return(gettext("establishing SSL connections requires at least PHP version 4.3.0"));
+ if(!function_exists("extension_loaded")
+ || !extension_loaded("openssl"))
+ return(gettext("establishing SSL connections requires the OpenSSL extension enabled"));
+ }
+ if(preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$domain))
+ $ip=$domain;
+ else
+ {
+ if($this->debug)
+ $this->OutputDebug($resolve_message);
+ if(!strcmp($ip=@gethostbyname($domain),$domain))
+ return(sprintf(gettext("could not resolve host \"%s\""), $domain));
+ }
+ if(strlen($this->exclude_address)
+ && !strcmp(@gethostbyname($this->exclude_address),$ip))
+ return(sprintf(gettext("domain \"%s\" resolved to an address excluded to be valid"), $domain));
+ if($this->debug)
+ $this->OutputDebug(sprintf(gettext('Connecting to host address "%1$s" port %2$s...'), $ip, $port));
+ if(($this->connection=($this->timeout ? @fsockopen(($this->ssl ? "ssl://" : "").$ip,$port,$errno,$error,$this->timeout) : @fsockopen(($this->ssl ? "ssl://" : "").$ip,$port))))
+ return("");
+ $error=($this->timeout ? strval($error) : "??");
+ switch($error)
+ {
+ case "-3":
+ return(gettext("-3 socket could not be created"));
+ case "-4":
+ return(sprintf(gettext("-4 dns lookup on hostname \"%s\" failed"), $domain));
+ case "-5":
+ return(gettext("-5 connection refused or timed out"));
+ case "-6":
+ return(gettext("-6 fdopen() call failed"));
+ case "-7":
+ return(gettext("-7 setvbuf() call failed"));
+ }
+ return(sprintf(gettext('could not connect to the host "%1$s": %2$s'), $domain, $error));
+ }
+
+ Function SASLAuthenticate($mechanisms, $credentials, &$authenticated, &$mechanism)
+ {
+ $authenticated=0;
+ if(!function_exists("class_exists")
+ || !class_exists("sasl_client_class"))
+ {
+ $this->error=gettext("it is not possible to authenticate using the specified mechanism because the SASL library class is not loaded");
+ return(0);
+ }
+ $sasl=new sasl_client_class;
+ $sasl->SetCredential("user",$credentials["user"]);
+ $sasl->SetCredential("password",$credentials["password"]);
+ if(IsSet($credentials["realm"]))
+ $sasl->SetCredential("realm",$credentials["realm"]);
+ if(IsSet($credentials["workstation"]))
+ $sasl->SetCredential("workstation",$credentials["workstation"]);
+ if(IsSet($credentials["mode"]))
+ $sasl->SetCredential("mode",$credentials["mode"]);
+ do
+ {
+ $status=$sasl->Start($mechanisms,$message,$interactions);
+ }
+ while($status==SASL_INTERACT);
+ switch($status)
+ {
+ case SASL_CONTINUE:
+ break;
+ case SASL_NOMECH:
+ if(strlen($this->authentication_mechanism))
+ {
+ $this->error=printf(gettext('authenticated mechanism %1$s may not be used: %2$s'), $this->authentication_mechanism, $sasl->error);
+ return(0);
+ }
+ break;
+ default:
+ $this->error=gettext("Could not start the SASL authentication client:") . " ".$sasl->error;
+ return(0);
+ }
+ if(strlen($mechanism=$sasl->mechanism))
+ {
+ if($this->PutLine("AUTH ".$sasl->mechanism.(IsSet($message) ? " ".base64_encode($message) : ""))==0)
+ {
+ $this->error=gettext("Could not send the AUTH command");
+ return(0);
+ }
+ if(!$this->VerifyResultLines(array("235","334"),$responses))
+ return(0);
+ switch($this->result_code)
+ {
+ case "235":
+ $response="";
+ $authenticated=1;
+ break;
+ case "334":
+ $response=base64_decode($responses[0]);
+ break;
+ default:
+ $this->error=gettext("Authentication error:") . " ".$responses[0];
+ return(0);
+ }
+ for(;!$authenticated;)
+ {
+ do
+ {
+ $status=$sasl->Step($response,$message,$interactions);
+ }
+ while($status==SASL_INTERACT);
+ switch($status)
+ {
+ case SASL_CONTINUE:
+ if($this->PutLine(base64_encode($message))==0)
+ {
+ $this->error=gettext("Could not send the authentication step message");
+ return(0);
+ }
+ if(!$this->VerifyResultLines(array("235","334"),$responses))
+ return(0);
+ switch($this->result_code)
+ {
+ case "235":
+ $response="";
+ $authenticated=1;
+ break;
+ case "334":
+ $response=base64_decode($responses[0]);
+ break;
+ default:
+ $this->error=gettext("Authentication error:") . " ".$responses[0];
+ return(0);
+ }
+ break;
+ default:
+ $this->error=gettext("Could not process the SASL authentication step:") . " ".$sasl->error;
+ return(0);
+ }
+ }
+ }
+ return(1);
+ }
+
+ /* Public methods */
+
+ Function Connect($domain="")
+ {
+ if(strcmp($this->state,"Disconnected"))
+ {
+ $this->error=gettext("connection is already established");
+ return(0);
+ }
+ $this->disconnected_error=0;
+ $this->error=$error="";
+ $this->esmtp_host="";
+ $this->esmtp_extensions=array();
+ $hosts=array();
+ if($this->direct_delivery)
+ {
+ if(strlen($domain)==0)
+ return(1);
+ $hosts=$weights=$mxhosts=array();
+ $getmxrr=$this->getmxrr;
+ if(function_exists($getmxrr)
+ && $getmxrr($domain,$hosts,$weights))
+ {
+ for($host=0;$host<count($hosts);$host++)
+ $mxhosts[$weights[$host]]=$hosts[$host];
+ KSort($mxhosts);
+ for(Reset($mxhosts),$host=0;$host<count($mxhosts);Next($mxhosts),$host++)
+ $hosts[$host]=$mxhosts[Key($mxhosts)];
+ }
+ else
+ {
+ if(strcmp(@gethostbyname($domain),$domain)!=0)
+ $hosts[]=$domain;
+ }
+ }
+ else
+ {
+ if(strlen($this->host_name))
+ $hosts[]=$this->host_name;
+ if(strlen($this->pop3_auth_host))
+ {
+ $user=$this->user;
+ if(strlen($user)==0)
+ {
+ $this->error=gettext("it was not specified the POP3 authentication user");
+ return(0);
+ }
+ $password=$this->password;
+ if(strlen($password)==0)
+ {
+ $this->error=gettext("it was not specified the POP3 authentication password");
+ return(0);
+ }
+ $domain=$this->pop3_auth_host;
+ $this->error=$this->ConnectToHost($domain, $this->pop3_auth_port, sprintf(gettext("Resolving POP3 authentication host \"%s\"..."), $domain));
+ if(strlen($this->error))
+ return(0);
+ if(strlen($response=$this->GetLine())==0)
+ return(0);
+ if(strcmp($this->Tokenize($response," "),"+OK"))
+ {
+ $this->error=gettext("POP3 authentication server greeting was not found");
+ return(0);
+ }
+ if(!$this->PutLine("USER ".$this->user)
+ || strlen($response=$this->GetLine())==0)
+ return(0);
+ if(strcmp($this->Tokenize($response," "),"+OK"))
+ {
+ $this->error=gettext("POP3 authentication user was not accepted:") . " ".$this->Tokenize("\r\n");
+ return(0);
+ }
+ if(!$this->PutLine("PASS ".$password)
+ || strlen($response=$this->GetLine())==0)
+ return(0);
+ if(strcmp($this->Tokenize($response," "),"+OK"))
+ {
+ $this->error=gettext("POP3 authentication password was not accepted:") . " ".$this->Tokenize("\r\n");
+ return(0);
+ }
+ fclose($this->connection);
+ $this->connection=0;
+ }
+ }
+ if(count($hosts)==0)
+ {
+ $this->error=gettext("could not determine the SMTP to connect");
+ return(0);
+ }
+ for($host=0, $error="not connected";strlen($error) && $host<count($hosts);$host++)
+ {
+ $domain=$hosts[$host];
+ $error=$this->ConnectToHost($domain, $this->host_port, sprintf(gettext("Resolving SMTP server domain \"%s\"..."), $domain));
+ }
+ if(strlen($error))
+ {
+ $this->error=$error;
+ return(0);
+ }
+ $timeout=($this->data_timeout ? $this->data_timeout : $this->timeout);
+ if($timeout
+ && function_exists("socket_set_timeout"))
+ socket_set_timeout($this->connection,$timeout,0);
+ if($this->debug)
+ $this->OutputDebug(sprintf(gettext("Connected to SMTP server \"%s\"."), $domain));
+ if($this->VerifyResultLines("220",$responses)>0)
+ {
+ // Send our HELLO
+ $success = $this->hello($this->hostname());
+ if ($this->tls)
+ $success = $this->startTLS();
+
+ if($success
+ && strlen($this->user)
+ && strlen($this->pop3_auth_host)==0)
+ {
+ if(!IsSet($this->esmtp_extensions["AUTH"]))
+ {
+ $this->error = gettext("server does not require authentication");
+ $success=0;
+ }
+ else
+ {
+ if(strlen($this->authentication_mechanism))
+ $mechanisms=array($this->authentication_mechanism);
+ else
+ {
+ $mechanisms=array();
+ for($authentication=$this->Tokenize($this->esmtp_extensions["AUTH"]," ");strlen($authentication);$authentication=$this->Tokenize(" "))
+ $mechanisms[]=$authentication;
+ }
+ $credentials=array(
+ "user"=>$this->user,
+ "password"=>$this->password
+ );
+ if(strlen($this->realm))
+ $credentials["realm"]=$this->realm;
+ if(strlen($this->workstation))
+ $credentials["workstation"]=$this->workstation;
+ $success=$this->SASLAuthenticate($mechanisms,$credentials,$authenticated,$mechanism);
+ if(!$success
+ && !strcmp($mechanism,"PLAIN"))
+ {
+ /*
+ * Author: Russell Robinson, 25 May 2003, http://www.tectite.com/
+ * Purpose: Try various AUTH PLAIN authentication methods.
+ */
+ $mechanisms=array("PLAIN");
+ $credentials=array(
+ "user"=>$this->user,
+ "password"=>$this->password
+ );
+ if(strlen($this->realm))
+ {
+ /*
+ * According to: http://www.sendmail.org/~ca/email/authrealms.html#authpwcheck_method
+ * some sendmails won't accept the realm, so try again without it
+ */
+ $success=$this->SASLAuthenticate($mechanisms,$credentials,$authenticated,$mechanism);
+ }
+ if(!$success)
+ {
+ /*
+ * It was seen an EXIM configuration like this:
+ * user^password^unused
+ */
+ $credentials["mode"]=SASL_PLAIN_EXIM_DOCUMENTATION_MODE;
+ $success=$this->SASLAuthenticate($mechanisms,$credentials,$authenticated,$mechanism);
+ }
+ if(!$success)
+ {
+ /*
+ * ... though: http://exim.work.de/exim-html-3.20/doc/html/spec_36.html
+ * specifies: ^user^password
+ */
+ $credentials["mode"]=SASL_PLAIN_EXIM_MODE;
+ $success=$this->SASLAuthenticate($mechanisms,$credentials,$authenticated,$mechanism);
+ }
+ }
+ if($success
+ && strlen($mechanism)==0)
+ {
+ $this->error=gettext("it is not supported any of the authentication mechanisms required by the server");
+ $success=0;
+ }
+ }
+ }
+ }
+ if($success)
+ {
+ $this->state="Connected";
+ $this->connected_domain=$domain;
+ }
+ else
+ {
+ fclose($this->connection);
+ $this->connection=0;
+ }
+ return($success);
+ }
+
+ Function hostname() {
+ if(!strcmp($localhost=$this->localhost,"")
+ && !strcmp($localhost=getenv("SERVER_NAME"),"")
+ && !strcmp($localhost=getenv("HOST"),"")
+ && !strcmp($localhost=getenv("HOSTNAME"),"")
+ && !strcmp($localhost=gethostname(),""))
+ $localhost="localhost";
+
+ return $localhost;
+ }
+
+ Function hello()
+ {
+ $success = 0;
+ $fallback = 1;
+ if ($this->esmtp || strlen($this->user)) {
+ if ($this->PutLine("EHLO ".$this->hostname())) {
+ if (($success_code = $this->VerifyResultLines("250",$responses)) > 0) {
+ $this->esmtp_host = $this->Tokenize($responses[0]," ");
+ for($response=1;$response<count($responses);$response++) {
+ $extension = strtoupper($this->Tokenize($responses[$response]," "));
+ $this->esmtp_extensions[$extension]=$this->Tokenize("");
+ }
+ $success = 1;
+ $fallback = 0;
+ } else {
+ if ($success_code == 0) {
+ $code = $this->Tokenize($this->error," -");
+ switch($code) {
+ case "421":
+ $fallback=0;
+ break;
+ }
+ }
+ }
+ } else
+ $fallback=0;
+ }
+
+ if ($fallback) {
+ if ($this->PutLine("HELO $localhost") && $this->VerifyResultLines("250",$responses)>0)
+ $success=1;
+ }
+ return $success;
+ }
+
+ Function startTLS() {
+ if ($this->PutLine("STARTTLS") && $this->VerifyResultLines("220",$responses)>0) {
+ if (!stream_socket_enable_crypto($this->connection,true,STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
+ return false;
+ } else {
+ // Resend HELO since session has been reset
+ return $this->hello($this->hostname);
+ }
+ } else
+ return false;
+ }
+
+ Function MailFrom($sender)
+ {
+ if($this->direct_delivery)
+ {
+ switch($this->state)
+ {
+ case "Disconnected":
+ $this->direct_sender=$sender;
+ return(1);
+ case "Connected":
+ $sender=$this->direct_sender;
+ break;
+ default:
+ $this->error=gettext("direct delivery connection is already established and sender is already set");
+ return(0);
+ }
+ }
+ else
+ {
+ if(strcmp($this->state,"Connected"))
+ {
+ $this->error=gettext("connection is not in the initial state");
+ return(0);
+ }
+ }
+ $this->error="";
+ if(!$this->PutLine("MAIL FROM:<$sender>"))
+ return(0);
+ if(!IsSet($this->esmtp_extensions["PIPELINING"])
+ && $this->VerifyResultLines("250",$responses)<=0)
+ return(0);
+ $this->state="SenderSet";
+ if(IsSet($this->esmtp_extensions["PIPELINING"]))
+ $this->pending_sender=1;
+ $this->pending_recipients=0;
+ return(1);
+ }
+
+ Function SetRecipient($recipient)
+ {
+ if($this->direct_delivery)
+ {
+ if(GetType($at=strrpos($recipient,"@"))!="integer")
+ return(gettext("it was not specified a valid direct recipient"));
+ $domain=substr($recipient,$at+1);
+ switch($this->state)
+ {
+ case "Disconnected":
+ if(!$this->Connect($domain))
+ return(0);
+ if(!$this->MailFrom(""))
+ {
+ $error=$this->error;
+ $this->Disconnect();
+ $this->error=$error;
+ return(0);
+ }
+ break;
+ case "SenderSet":
+ case "RecipientSet":
+ if(strcmp($this->connected_domain,$domain))
+ {
+ $this->error=gettext("it is not possible to deliver directly to recipients of different domains");
+ return(0);
+ }
+ break;
+ default:
+ $this->error=gettext("connection is already established and the recipient is already set");
+ return(0);
+ }
+ }
+ else
+ {
+ switch($this->state)
+ {
+ case "SenderSet":
+ case "RecipientSet":
+ break;
+ default:
+ $this->error=gettext("connection is not in the recipient setting state");
+ return(0);
+ }
+ }
+ $this->error="";
+ if(!$this->PutLine("RCPT TO:<$recipient>"))
+ return(0);
+ if(IsSet($this->esmtp_extensions["PIPELINING"]))
+ {
+ $this->pending_recipients++;
+ if($this->pending_recipients>=$this->maximum_piped_recipients)
+ {
+ if(!$this->FlushRecipients())
+ return(0);
+ }
+ }
+ else
+ {
+ if($this->VerifyResultLines(array("250","251"),$responses)<=0)
+ return(0);
+ }
+ $this->state="RecipientSet";
+ return(1);
+ }
+
+ Function StartData()
+ {
+ if(strcmp($this->state,"RecipientSet"))
+ {
+ $this->error=gettext("connection is not in the start sending data state");
+ return(0);
+ }
+ $this->error="";
+ if(!$this->PutLine("DATA"))
+ return(0);
+ if($this->pending_recipients)
+ {
+ if(!$this->FlushRecipients())
+ return(0);
+ }
+ if($this->VerifyResultLines("354",$responses)<=0)
+ return(0);
+ $this->state="SendingData";
+ return(1);
+ }
+
+ Function PrepareData(&$data,&$output,$preg=1)
+ {
+ if($preg
+ && function_exists("preg_replace"))
+ $output=preg_replace(array("/\n\n|\r\r/","/(^|[^\r])\n/","/\r([^\n]|\$)/D","/(^|\n)\\./"),array("\r\n\r\n","\\1\r\n","\r\n\\1","\\1.."),$data);
+ else
+ $output=ereg_replace("(^|\n)\\.","\\1..",ereg_replace("\r([^\n]|\$)","\r\n\\1",ereg_replace("(^|[^\r])\n","\\1\r\n",ereg_replace("\n\n|\r\r","\r\n\r\n",$data))));
+ }
+
+ Function SendData($data)
+ {
+ if(strcmp($this->state,"SendingData"))
+ {
+ $this->error=gettext("connection is not in the sending data state");
+ return(0);
+ }
+ $this->error="";
+ return($this->PutData($data));
+ }
+
+ Function EndSendingData()
+ {
+ if(strcmp($this->state,"SendingData"))
+ {
+ $this->error=gettext("connection is not in the sending data state");
+ return(0);
+ }
+ $this->error="";
+ if(!$this->PutLine("\r\n.")
+ || $this->VerifyResultLines("250",$responses)<=0)
+ return(0);
+ $this->state="Connected";
+ return(1);
+ }
+
+ Function ResetConnection()
+ {
+ switch($this->state)
+ {
+ case "Connected":
+ return(1);
+ case "SendingData":
+ $this->error="can not reset the connection while sending data";
+ return(0);
+ case "Disconnected":
+ $this->error="can not reset the connection before it is established";
+ return(0);
+ }
+ $this->error="";
+ if(!$this->PutLine("RSET")
+ || $this->VerifyResultLines("250",$responses)<=0)
+ return(0);
+ $this->state="Connected";
+ return(1);
+ }
+
+ Function Disconnect($quit=1)
+ {
+ if(!strcmp($this->state,"Disconnected"))
+ {
+ $this->error=gettext("it was not previously established a SMTP connection");
+ return(0);
+ }
+ $this->error="";
+ if(!strcmp($this->state,"Connected")
+ && $quit
+ && (!$this->PutLine("QUIT")
+ || ($this->VerifyResultLines("221",$responses)<=0
+ && !$this->disconnected_error)))
+ return(0);
+ if($this->disconnected_error)
+ $this->disconnected_error=0;
+ else
+ fclose($this->connection);
+ $this->connection=0;
+ $this->state="Disconnected";
+ if($this->debug)
+ $this->OutputDebug("Disconnected.");
+ return(1);
+ }
+
+ Function SendMessage($sender,$recipients,$headers,$body)
+ {
+ if(($success=$this->Connect()))
+ {
+ if(($success=$this->MailFrom($sender)))
+ {
+ for($recipient=0;$recipient<count($recipients);$recipient++)
+ {
+ if(!($success=$this->SetRecipient($recipients[$recipient])))
+ break;
+ }
+ if($success
+ && ($success=$this->StartData()))
+ {
+ for($header_data="",$header=0;$header<count($headers);$header++)
+ $header_data.=$headers[$header]."\r\n";
+ if(($success=$this->SendData($header_data."\r\n")))
+ {
+ $this->PrepareData($body,$body_data);
+ $success=$this->SendData($body_data);
+ }
+ if($success)
+ $success=$this->EndSendingData();
+ }
+ }
+ $error=$this->error;
+ $disconnect_success=$this->Disconnect($success);
+ if($success)
+ $success=$disconnect_success;
+ else
+ $this->error=$error;
+ }
+ return($success);
+ }
+
+};
+
+?>
diff --git a/src/etc/inc/system.inc b/src/etc/inc/system.inc
new file mode 100644
index 0000000..41e798e
--- /dev/null
+++ b/src/etc/inc/system.inc
@@ -0,0 +1,2258 @@
+<?php
+/* $Id$ */
+/*
+ system.inc
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/sbin/powerd /usr/bin/killall /sbin/route
+ pfSense_BUILDER_BINARIES: /bin/hostname /bin/ls /usr/sbin/syslogd
+ pfSense_BUILDER_BINARIES: /usr/sbin/pccardd /usr/local/sbin/lighttpd /bin/chmod /bin/mkdir
+ pfSense_BUILDER_BINARIES: /usr/bin/tar /usr/local/sbin/ntpd /usr/local/sbin/ntpdate
+ pfSense_BUILDER_BINARIES: /usr/bin/nohup /sbin/dmesg /usr/local/sbin/atareinit /sbin/kldload
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/filterdns
+ pfSense_MODULE: utils
+*/
+
+function activate_powerd() {
+ global $config, $g;
+
+ if (is_process_running("powerd")) {
+ exec("/usr/bin/killall powerd");
+ }
+ if (isset($config['system']['powerd_enable'])) {
+ if ($g["platform"] == "nanobsd") {
+ exec("/sbin/kldload cpufreq");
+ }
+
+ $ac_mode = "hadp";
+ if (!empty($config['system']['powerd_ac_mode'])) {
+ $ac_mode = $config['system']['powerd_ac_mode'];
+ }
+
+ $battery_mode = "hadp";
+ if (!empty($config['system']['powerd_battery_mode'])) {
+ $battery_mode = $config['system']['powerd_battery_mode'];
+ }
+
+ $normal_mode = "hadp";
+ if (!empty($config['system']['powerd_normal_mode'])) {
+ $normal_mode = $config['system']['powerd_normal_mode'];
+ }
+
+ mwexec("/usr/sbin/powerd -b $battery_mode -a $ac_mode -n $normal_mode");
+ }
+}
+
+function get_default_sysctl_value($id) {
+ global $sysctls;
+
+ if (isset($sysctls[$id])) {
+ return $sysctls[$id];
+ }
+}
+
+function get_sysctl_descr($sysctl) {
+ unset($output);
+ $_gb = exec("/sbin/sysctl -nd {$sysctl}", $output);
+
+ return $output[0];
+}
+
+function system_get_sysctls() {
+ global $config, $sysctls;
+
+ $disp_sysctl = array();
+ $disp_cache = array();
+ if (is_array($config['sysctl']) && is_array($config['sysctl']['item'])) {
+ foreach ($config['sysctl']['item'] as $id => $tunable) {
+ if ($tunable['value'] == "default") {
+ $value = get_default_sysctl_value($tunable['tunable']);
+ } else {
+ $value = $tunable['value'];
+ }
+
+ $disp_sysctl[$id] = $tunable;
+ $disp_sysctl[$id]['modified'] = true;
+ $disp_cache[$tunable['tunable']] = 'set';
+ }
+ }
+
+ foreach ($sysctls as $sysctl => $value) {
+ if (isset($disp_cache[$sysctl])) {
+ continue;
+ }
+
+ $disp_sysctl[$sysctl] = array('tunable' => $sysctl, 'value' => $value, 'descr' => get_sysctl_descr($sysctl));
+ }
+ unset($disp_cache);
+ return $disp_sysctl;
+}
+
+function activate_sysctls() {
+ global $config, $g, $sysctls;
+
+ if (is_array($config['sysctl']) && is_array($config['sysctl']['item'])) {
+ foreach ($config['sysctl']['item'] as $tunable) {
+ if ($tunable['value'] == "default") {
+ $value = get_default_sysctl_value($tunable['tunable']);
+ } else {
+ $value = $tunable['value'];
+ }
+
+ $sysctls[$tunable['tunable']] = $value;
+ }
+ }
+
+ set_sysctl($sysctls);
+}
+
+function system_resolvconf_generate($dynupdate = false) {
+ global $config, $g;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_resolvconf_generate() being called $mt\n";
+ }
+
+ $syscfg = $config['system'];
+
+ if ((((isset($config['dnsmasq']['enable'])) &&
+ (!isset($config['dnsmasq']['port']) || $config['dnsmasq']['port'] == "53") &&
+ (empty($config['dnsmasq']['interface']) ||
+ in_array("lo0", explode(",", $config['dnsmasq']['interface'])))) ||
+ ((isset($config['unbound']['enable'])) &&
+ (!isset($config['unbound']['port']) || $config['unbound']['port'] == "53") &&
+ (empty($config['unbound']['active_interface']) ||
+ in_array("lo0", explode(",", $config['unbound']['active_interface'])) ||
+ in_array("all", explode(",", $config['unbound']['active_interface']), true)))) &&
+ (!isset($config['system']['dnslocalhost']))) {
+ $resolvconf .= "nameserver 127.0.0.1\n";
+ }
+
+ if (isset($syscfg['dnsallowoverride'])) {
+ /* get dynamically assigned DNS servers (if any) */
+ $ns = array_unique(get_searchdomains());
+ foreach ($ns as $searchserver) {
+ if ($searchserver) {
+ $resolvconf .= "search {$searchserver}\n";
+ }
+ }
+ $ns = array_unique(get_nameservers());
+ foreach ($ns as $nameserver) {
+ if ($nameserver) {
+ $resolvconf .= "nameserver $nameserver\n";
+ }
+ }
+ } else {
+ $ns = array();
+ // Do not create blank search/domain lines, it can break tools like dig.
+ if ($syscfg['domain']) {
+ $resolvconf .= "search {$syscfg['domain']}\n";
+ }
+ }
+ if (is_array($syscfg['dnsserver'])) {
+ foreach ($syscfg['dnsserver'] as $sys_dnsserver) {
+ if ($sys_dnsserver && (!in_array($sys_dnsserver, $ns))) {
+ $resolvconf .= "nameserver $sys_dnsserver\n";
+ }
+ }
+ }
+
+ // Add EDNS support
+ if (isset($config['unbound']['enable']) && isset($config['unbound']['edns'])) {
+ $resolvconf .= "options edns0\n";
+ }
+
+ $dnslock = lock('resolvconf', LOCK_EX);
+
+ $fd = fopen("{$g['varetc_path']}/resolv.conf", "w");
+ if (!$fd) {
+ printf("Error: cannot open resolv.conf in system_resolvconf_generate().\n");
+ unlock($dnslock);
+ return 1;
+ }
+
+ fwrite($fd, $resolvconf);
+ fclose($fd);
+
+ // Prevent resolvconf(8) from rewriting our resolv.conf
+ $fd = fopen("{$g['varetc_path']}/resolvconf.conf", "w");
+ if (!$fd) {
+ printf("Error: cannot open resolvconf.conf in system_resolvconf_generate().\n");
+ return 1;
+ }
+ fwrite($fd, "resolv_conf=\"/dev/null\"\n");
+ fclose($fd);
+
+ if (!platform_booting()) {
+ /* restart dhcpd (nameservers may have changed) */
+ if (!$dynupdate) {
+ services_dhcpd_configure();
+ }
+ }
+
+ /* setup static routes for DNS servers. */
+ for ($dnscounter=1; $dnscounter<5; $dnscounter++) {
+ /* setup static routes for dns servers */
+ $dnsgw = "dns{$dnscounter}gw";
+ if (isset($config['system'][$dnsgw])) {
+ $gwname = $config['system'][$dnsgw];
+ if (($gwname <> "") && ($gwname <> "none")) {
+ $gatewayip = lookup_gateway_ip_by_name($gwname);
+ if (is_ipaddrv4($gatewayip)) {
+ /* dns server array starts at 0 */
+ $dnscountermo = $dnscounter - 1;
+ mwexec("/sbin/route change -host " . $syscfg['dnsserver'][$dnscountermo] . " {$gatewayip}");
+ if (isset($config['system']['route-debug'])) {
+ $mt = microtime();
+ log_error("ROUTING debug: $mt - route change -host {$syscfg['dnsserver'][$dnscountermo]} $gatewayip ");
+ }
+ }
+ if (is_ipaddrv6($gatewayip)) {
+ /* dns server array starts at 0 */
+ $dnscountermo = $dnscounter - 1;
+ mwexec("/sbin/route change -host -inet6 " . $syscfg['dnsserver'][$dnscountermo] . " {$gatewayip}");
+ if (isset($config['system']['route-debug'])) {
+ $mt = microtime();
+ log_error("ROUTING debug: $mt - route change -host -inet6 {$syscfg['dnsserver'][$dnscountermo]} $gatewayip ");
+ }
+ }
+ }
+ }
+ }
+
+ unlock($dnslock);
+
+ return 0;
+}
+
+function get_searchdomains() {
+ global $config, $g;
+
+ $master_list = array();
+
+ // Read in dhclient nameservers
+ $search_list = glob("/var/etc/searchdomain_*");
+ if (is_array($search_list)) {
+ foreach ($search_list as $fdns) {
+ $contents = file($fdns, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if (!is_array($contents)) {
+ continue;
+ }
+ foreach ($contents as $dns) {
+ if (is_hostname($dns)) {
+ $master_list[] = $dns;
+ }
+ }
+ }
+ }
+
+ return $master_list;
+}
+
+function get_nameservers() {
+ global $config, $g;
+ $master_list = array();
+
+ // Read in dhclient nameservers
+ $dns_lists = glob("/var/etc/nameserver_*");
+ if (is_array($dns_lists)) {
+ foreach ($dns_lists as $fdns) {
+ $contents = file($fdns, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if (!is_array($contents)) {
+ continue;
+ }
+ foreach ($contents as $dns) {
+ if (is_ipaddr($dns)) {
+ $master_list[] = $dns;
+ }
+ }
+ }
+ }
+
+ // Read in any extra nameservers
+ if (file_exists("/var/etc/nameservers.conf")) {
+ $dns_s = file("/var/etc/nameservers.conf", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if (is_array($dns_s)) {
+ foreach ($dns_s as $dns) {
+ if (is_ipaddr($dns)) {
+ $master_list[] = $dns;
+ }
+ }
+ }
+ }
+
+ return $master_list;
+}
+
+function system_hosts_generate() {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_hosts_generate() being called $mt\n";
+ }
+
+ $syscfg = $config['system'];
+ if (isset($config['unbound']) && isset($config['unbound']['enable'])) {
+ $dnsmasqcfg = $config['unbound'];
+ } else {
+ $dnsmasqcfg = $config['dnsmasq'];
+ }
+
+ $hosts = "127.0.0.1 localhost localhost.{$syscfg['domain']}\n";
+ $hosts .= "::1 localhost localhost.{$syscfg['domain']}\n";
+ $lhosts = "";
+ $dhosts = "";
+
+ if ($config['interfaces']['lan']) {
+ $cfgip = get_interface_ip("lan");
+ if (is_ipaddr($cfgip)) {
+ $hosts .= "{$cfgip} {$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
+ }
+ $cfgipv6 = get_interface_ipv6("lan");
+ if (is_ipaddrv6($cfgipv6)) {
+ $hosts .= "{$cfgipv6} {$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
+ }
+ } else {
+ $sysiflist = get_configured_interface_list();
+ $hosts_if_found = false;
+ foreach ($sysiflist as $sysif) {
+ if (!interface_has_gateway($sysif)) {
+ $cfgip = get_interface_ip($sysif);
+ if (is_ipaddr($cfgip)) {
+ $hosts .= "{$cfgip} {$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
+ $hosts_if_found = true;
+ }
+ $cfgipv6 = get_interface_ipv6($sysif);
+ if (is_ipaddrv6($cfgipv6)) {
+ $hosts .= "{$cfgipv6} {$syscfg['hostname']}.{$syscfg['domain']} {$syscfg['hostname']}\n";
+ $hosts_if_found = true;
+ }
+ if ($hosts_if_found == true) {
+ break;
+ }
+ }
+ }
+ }
+
+ if (isset($dnsmasqcfg['enable'])) {
+ if (!is_array($dnsmasqcfg['hosts'])) {
+ $dnsmasqcfg['hosts'] = array();
+ }
+
+ foreach ($dnsmasqcfg['hosts'] as $host) {
+ if ($host['host'] || $host['host'] == "0") {
+ $lhosts .= "{$host['ip']} {$host['host']}.{$host['domain']} {$host['host']}\n";
+ } else {
+ $lhosts .= "{$host['ip']} {$host['domain']}\n";
+ }
+ if (!is_array($host['aliases']) || !is_array($host['aliases']['item'])) {
+ continue;
+ }
+ foreach ($host['aliases']['item'] as $alias) {
+ if ($alias['host'] || $alias['host'] == "0") {
+ $lhosts .= "{$host['ip']} {$alias['host']}.{$alias['domain']} {$alias['host']}\n";
+ } else {
+ $lhosts .= "{$host['ip']} {$alias['domain']}\n";
+ }
+ }
+ }
+ if (isset($dnsmasqcfg['regdhcpstatic']) && is_array($config['dhcpd'])) {
+ foreach ($config['dhcpd'] as $dhcpif => $dhcpifconf) {
+ if (is_array($dhcpifconf['staticmap']) && isset($dhcpifconf['enable'])) {
+ foreach ($dhcpifconf['staticmap'] as $host) {
+ if ($host['ipaddr'] && $host['hostname'] && $host['domain']) {
+ $dhosts .= "{$host['ipaddr']} {$host['hostname']}.{$host['domain']} {$host['hostname']}\n";
+ } else if ($host['ipaddr'] && $host['hostname'] && $dhcpifconf['domain']) {
+ $dhosts .= "{$host['ipaddr']} {$host['hostname']}.{$dhcpifconf['domain']} {$host['hostname']}\n";
+ } else if ($host['ipaddr'] && $host['hostname']) {
+ $dhosts .= "{$host['ipaddr']} {$host['hostname']}.{$syscfg['domain']} {$host['hostname']}\n";
+ }
+ }
+ }
+ }
+ }
+ if (isset($dnsmasqcfg['regdhcpstatic']) && is_array($config['dhcpdv6'])) {
+ foreach ($config['dhcpdv6'] as $dhcpif => $dhcpifconf) {
+ if (is_array($dhcpifconf['staticmap']) && isset($dhcpifconf['enable'])) {
+ foreach ($dhcpifconf['staticmap'] as $host) {
+ if ($host['ipaddrv6'] && $host['hostname'] && $host['domain']) {
+ $dhosts .= "{$host['ipaddrv6']} {$host['hostname']}.{$host['domain']} {$host['hostname']}\n";
+ } else if ($host['ipaddrv6'] && $host['hostname'] && $dhcpifconf['domain']) {
+ $dhosts .= "{$host['ipaddrv6']} {$host['hostname']}.{$dhcpifconf['domain']} {$host['hostname']}\n";
+ } else if ($host['ipaddrv6'] && $host['hostname']) {
+ $dhosts .= "{$host['ipaddrv6']} {$host['hostname']}.{$syscfg['domain']} {$host['hostname']}\n";
+ }
+ }
+ }
+ }
+ }
+
+ if (isset($dnsmasqcfg['dhcpfirst'])) {
+ $hosts .= $dhosts . $lhosts;
+ } else {
+ $hosts .= $lhosts . $dhosts;
+ }
+ }
+
+ /*
+ * Do not remove this because dhcpleases monitors with kqueue it needs to be
+ * killed before writing to hosts files.
+ */
+ if (file_exists("{$g['varrun_path']}/dhcpleases.pid")) {
+ sigkillbypid("{$g['varrun_path']}/dhcpleases.pid", "TERM");
+ @unlink("{$g['varrun_path']}/dhcpleases.pid");
+ }
+ $fd = fopen("{$g['varetc_path']}/hosts", "w");
+ if (!$fd) {
+ log_error("Error: cannot open hosts file in system_hosts_generate().\n");
+ return 1;
+ }
+ fwrite($fd, $hosts);
+ fclose($fd);
+
+ if (isset($config['unbound']['enable'])) {
+ require_once("unbound.inc");
+ unbound_hosts_generate();
+ }
+
+ return 0;
+}
+
+function system_dhcpleases_configure() {
+ global $config, $g;
+
+ /* Start the monitoring process for dynamic dhcpclients. */
+ if ((isset($config['dnsmasq']['enable']) && isset($config['dnsmasq']['regdhcp'])) ||
+ (isset($config['unbound']['enable']) && isset($config['unbound']['regdhcp']))) {
+ /* Make sure we do not error out */
+ mwexec("/bin/mkdir -p {$g['dhcpd_chroot_path']}/var/db");
+ if (!file_exists("{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases")) {
+ @touch("{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases");
+ }
+
+ if (isset($config['unbound']['enable'])) {
+ $dns_pid = "unbound.pid";
+ $unbound_conf = "-u {$g['unbound_chroot_path']}/dhcpleases_entries.conf";
+ } else {
+ $dns_pid = "dnsmasq.pid";
+ $unbound_conf = "";
+ }
+
+ $pidfile = "{$g['varrun_path']}/dhcpleases.pid";
+ if (isvalidpid($pidfile)) {
+ /* Make sure dhcpleases is using correct unbound or dnsmasq */
+ $_gb = exec("/bin/pgrep -F {$pidfile} -f {$dns_pid}", $output, $retval);
+ if (intval($retval) == 0) {
+ sigkillbypid($pidfile, "HUP");
+ return;
+ } else {
+ sigkillbypid($pidfile, "TERM");
+ }
+ }
+
+ /* To ensure we do not start multiple instances of dhcpleases, perform some clean-up first. */
+ if (is_process_running("dhcpleases")) {
+ sigkillbyname('dhcpleases', "TERM");
+ }
+ @unlink($pidfile);
+ mwexec("/usr/local/sbin/dhcpleases -l {$g['dhcpd_chroot_path']}/var/db/dhcpd.leases -d {$config['system']['domain']} -p {$g['varrun_path']}/{$dns_pid} {$unbound_conf} -h {$g['varetc_path']}/hosts");
+ } else {
+ sigkillbypid($pidfile, "TERM");
+ @unlink($pidfile);
+ }
+}
+
+function system_hostname_configure() {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_hostname_configure() being called $mt\n";
+ }
+
+ $syscfg = $config['system'];
+
+ /* set hostname */
+ $status = mwexec("/bin/hostname " .
+ escapeshellarg("{$syscfg['hostname']}.{$syscfg['domain']}"));
+
+ /* Setup host GUID ID. This is used by ZFS. */
+ mwexec("/etc/rc.d/hostid start");
+
+ return $status;
+}
+
+function system_routing_configure($interface = "") {
+ global $config, $g;
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_routing_configure() being called $mt\n";
+ }
+
+ $gatewayip = "";
+ $interfacegw = "";
+ $gatewayipv6 = "";
+ $interfacegwv6 = "";
+ $foundgw = false;
+ $foundgwv6 = false;
+ /* tack on all the hard defined gateways as well */
+ if (is_array($config['gateways']['gateway_item'])) {
+ array_map('unlink', glob("{$g['tmp_path']}/*_defaultgw{,v6}", GLOB_BRACE));
+ foreach ($config['gateways']['gateway_item'] as $gateway) {
+ if (isset($gateway['defaultgw'])) {
+ if ($foundgw == false && ($gateway['ipprotocol'] != "inet6" && (is_ipaddrv4($gateway['gateway']) || $gateway['gateway'] == "dynamic"))) {
+ if (strpos($gateway['gateway'], ":")) {
+ continue;
+ }
+ if ($gateway['gateway'] == "dynamic") {
+ $gateway['gateway'] = get_interface_gateway($gateway['interface']);
+ }
+ $gatewayip = $gateway['gateway'];
+ $interfacegw = $gateway['interface'];
+ if (!empty($gateway['interface'])) {
+ $defaultif = get_real_interface($gateway['interface']);
+ if ($defaultif) {
+ @file_put_contents("{$g['tmp_path']}/{$defaultif}_defaultgw", $gateway['gateway']);
+ }
+ }
+ $foundgw = true;
+ } else if ($foundgwv6 == false && ($gateway['ipprotocol'] == "inet6" && (is_ipaddrv6($gateway['gateway']) || $gateway['gateway'] == "dynamic"))) {
+ if ($gateway['gateway'] == "dynamic") {
+ $gateway['gateway'] = get_interface_gateway_v6($gateway['interface']);
+ }
+ $gatewayipv6 = $gateway['gateway'];
+ $interfacegwv6 = $gateway['interface'];
+ if (!empty($gateway['interface'])) {
+ $defaultifv6 = get_real_interface($gateway['interface']);
+ if ($defaultifv6) {
+ @file_put_contents("{$g['tmp_path']}/{$defaultifv6}_defaultgwv6", $gateway['gateway']);
+ }
+ }
+ $foundgwv6 = true;
+ }
+ }
+ if ($foundgw === true && $foundgwv6 === true) {
+ break;
+ }
+ }
+ }
+ if ($foundgw == false) {
+ $defaultif = get_real_interface("wan");
+ $interfacegw = "wan";
+ $gatewayip = get_interface_gateway("wan");
+ @file_put_contents("{$g['tmp_path']}/{$defaultif}_defaultgw", $gatewayip);
+ }
+ if ($foundgwv6 == false) {
+ $defaultifv6 = get_real_interface("wan");
+ $interfacegwv6 = "wan";
+ $gatewayipv6 = get_interface_gateway_v6("wan");
+ @file_put_contents("{$g['tmp_path']}/{$defaultifv6}_defaultgwv6", $gatewayipv6);
+ }
+ $dont_add_route = false;
+ /* if OLSRD is enabled, allow WAN to house DHCP. */
+ if (is_array($config['installedpackages']['olsrd'])) {
+ foreach ($config['installedpackages']['olsrd']['config'] as $olsrd) {
+ if (($olsrd['enabledyngw'] == "on") && ($olsrd['enable'] == "on")) {
+ $dont_add_route = true;
+ log_error(sprintf(gettext("Not adding default route because OLSR dynamic gateway is enabled.")));
+ break;
+ }
+ }
+ }
+
+ if ($dont_add_route == false) {
+ if (!empty($interface) && $interface != $interfacegw) {
+ ;
+ } else if (is_ipaddrv4($gatewayip)) {
+ log_error("ROUTING: setting default route to $gatewayip");
+ mwexec("/sbin/route change -inet default " . escapeshellarg($gatewayip));
+ }
+
+ if (!empty($interface) && $interface != $interfacegwv6) {
+ ;
+ } else if (is_ipaddrv6($gatewayipv6)) {
+ $ifscope = "";
+ if (is_linklocal($gatewayipv6) && !strpos($gatewayipv6, '%')) {
+ $ifscope = "%{$defaultifv6}";
+ }
+ log_error("ROUTING: setting IPv6 default route to {$gatewayipv6}{$ifscope}");
+ mwexec("/sbin/route change -inet6 default " . escapeshellarg("{$gatewayipv6}{$ifscope}"));
+ }
+ }
+
+ system_staticroutes_configure($interface, false);
+
+ return 0;
+}
+
+function system_staticroutes_configure($interface = "", $update_dns = false) {
+ global $config, $g, $aliastable;
+
+ $filterdns_list = array();
+
+ $static_routes = get_staticroutes(false, true);
+ if (count($static_routes)) {
+ $gateways_arr = return_gateways_array(false, true);
+
+ foreach ($static_routes as $rtent) {
+ if (empty($gateways_arr[$rtent['gateway']])) {
+ log_error(sprintf(gettext("Static Routes: Gateway IP could not be found for %s"), $rtent['network']));
+ continue;
+ }
+ $gateway = $gateways_arr[$rtent['gateway']];
+ if (!empty($interface) && $interface != $gateway['friendlyiface']) {
+ continue;
+ }
+
+ $gatewayip = $gateway['gateway'];
+ $interfacegw = $gateway['interface'];
+
+ $blackhole = "";
+ if (!strcasecmp("Null", substr($rtent['gateway'], 0, 3))) {
+ $blackhole = "-blackhole";
+ }
+
+ if (!is_fqdn($rtent['network']) && !is_subnet($rtent['network'])) {
+ continue;
+ }
+
+ $dnscache = array();
+ if ($update_dns === true) {
+ if (is_subnet($rtent['network'])) {
+ continue;
+ }
+ $dnscache = explode("\n", trim(compare_hostname_to_dnscache($rtent['network'])));
+ if (empty($dnscache)) {
+ continue;
+ }
+ }
+
+ if (is_subnet($rtent['network'])) {
+ $ips = array($rtent['network']);
+ } else {
+ if (!isset($rtent['disabled'])) {
+ $filterdns_list[] = $rtent['network'];
+ }
+ $ips = add_hostname_to_watch($rtent['network']);
+ }
+
+ foreach ($dnscache as $ip) {
+ if (in_array($ip, $ips)) {
+ continue;
+ }
+ mwexec("/sbin/route delete " . escapeshellarg($ip), true);
+ if (isset($config['system']['route-debug'])) {
+ $mt = microtime();
+ log_error("ROUTING debug: $mt - route delete $ip ");
+ }
+ }
+
+ if (isset($rtent['disabled'])) {
+ /* XXX: This can break things by deleting routes that shouldn't be deleted - OpenVPN, dynamic routing scenarios, etc. redmine #3709 */
+ foreach ($ips as $ip) {
+ mwexec("/sbin/route delete " . escapeshellarg($ip), true);
+ if (isset($config['system']['route-debug'])) {
+ $mt = microtime();
+ log_error("ROUTING debug: $mt - route delete $ip ");
+ }
+ }
+ continue;
+ }
+
+ foreach ($ips as $ip) {
+ if (is_ipaddrv4($ip)) {
+ $ip .= "/32";
+ }
+ // do NOT do the same check here on v6, is_ipaddrv6 returns true when including the CIDR mask. doing so breaks v6 routes
+
+ $inet = (is_subnetv6($ip) ? "-inet6" : "-inet");
+
+ $cmd = "/sbin/route change {$inet} {$blackhole} " . escapeshellarg($ip) . " ";
+
+ if (is_subnet($ip)) {
+ if (is_ipaddr($gatewayip)) {
+ mwexec($cmd . escapeshellarg($gatewayip));
+ if (isset($config['system']['route-debug'])) {
+ $mt = microtime();
+ log_error("ROUTING debug: $mt - $cmd $gatewayip");
+ }
+ } else if (!empty($interfacegw)) {
+ mwexec($cmd . "-iface " . escapeshellarg($interfacegw));
+ if (isset($config['system']['route-debug'])) {
+ $mt = microtime();
+ log_error("ROUTING debug: $mt - $cmd -iface $interfacegw ");
+ }
+ }
+ }
+ }
+ }
+ unset($gateways_arr);
+ }
+ unset($static_routes);
+
+ if ($update_dns === false) {
+ if (count($filterdns_list)) {
+ $interval = 60;
+ $hostnames = "";
+ array_unique($filterdns_list);
+ foreach ($filterdns_list as $hostname) {
+ $hostnames .= "cmd {$hostname} '/usr/local/sbin/pfSctl -c \"service reload routedns\"'\n";
+ }
+ file_put_contents("{$g['varetc_path']}/filterdns-route.hosts", $hostnames);
+ unset($hostnames);
+
+ if (isvalidpid("{$g['varrun_path']}/filterdns-route.pid")) {
+ sigkillbypid("{$g['varrun_path']}/filterdns-route.pid", "HUP");
+ } else {
+ mwexec("/usr/local/sbin/filterdns -p {$g['varrun_path']}/filterdns-route.pid -i {$interval} -c {$g['varetc_path']}/filterdns-route.hosts -d 1");
+ }
+ } else {
+ killbypid("{$g['varrun_path']}/filterdns-route.pid");
+ @unlink("{$g['varrun_path']}/filterdns-route.pid");
+ }
+ }
+ unset($filterdns_list);
+
+ return 0;
+}
+
+function system_routing_enable() {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_routing_enable() being called $mt\n";
+ }
+
+ set_sysctl(array(
+ "net.inet.ip.forwarding" => "1",
+ "net.inet6.ip6.forwarding" => "1"
+ ));
+
+ return;
+}
+
+function system_syslogd_fixup_server($server) {
+ /* If it's an IPv6 IP alone, encase it in brackets */
+ if (is_ipaddrv6($server)) {
+ return "[$server]";
+ } else {
+ return $server;
+ }
+}
+
+function system_syslogd_get_remote_servers($syslogcfg, $facility = "*.*") {
+ // Rather than repeatedly use the same code, use this function to build a list of remote servers.
+ $facility .= " ".
+ $remote_servers = "";
+ $pad_to = 56;
+ $padding = ceil(($pad_to - strlen($facility))/8)+1;
+ if ($syslogcfg['remoteserver']) {
+ $remote_servers .= "{$facility}" . str_repeat("\t", $padding) . "@" . system_syslogd_fixup_server($syslogcfg['remoteserver']) . "\n";
+ }
+ if ($syslogcfg['remoteserver2']) {
+ $remote_servers .= "{$facility}" . str_repeat("\t", $padding) . "@" . system_syslogd_fixup_server($syslogcfg['remoteserver2']) . "\n";
+ }
+ if ($syslogcfg['remoteserver3']) {
+ $remote_servers .= "{$facility}" . str_repeat("\t", $padding) . "@" . system_syslogd_fixup_server($syslogcfg['remoteserver3']) . "\n";
+ }
+ return $remote_servers;
+}
+
+function system_syslogd_start() {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_syslogd_start() being called $mt\n";
+ }
+
+ mwexec("/etc/rc.d/hostid start");
+
+ $syslogcfg = $config['syslog'];
+
+ if (platform_booting()) {
+ echo gettext("Starting syslog...");
+ }
+
+ if (is_process_running("fifolog_writer")) {
+ mwexec('/bin/pkill fifolog_writer');
+ }
+
+ // Which logging type are we using this week??
+ if (isset($config['system']['disablesyslogclog'])) {
+ $log_directive = "";
+ $log_create_directive = "/usr/bin/touch ";
+ $log_size = "";
+ } else if (isset($config['system']['usefifolog'])) {
+ $log_directive = "|/usr/sbin/fifolog_writer ";
+ $log_size = isset($config['syslog']['logfilesize']) ? $config['syslog']['logfilesize'] : "10240";
+ $log_create_directive = "/usr/sbin/fifolog_create -s ";
+ } else { // Defaults to CLOG
+ $log_directive = "%";
+ $log_size = isset($config['syslog']['logfilesize']) ? $config['syslog']['logfilesize'] : "10240";
+ $log_create_directive = "/usr/local/sbin/clog -i -s ";
+ }
+
+ $syslogd_extra = "";
+ if (isset($syslogcfg)) {
+ $separatelogfacilities = array('ntp', 'ntpd', 'ntpdate', 'charon', 'ipsec_starter', 'openvpn', 'pptps', 'poes', 'l2tps', 'relayd', 'hostapd', 'dnsmasq', 'filterdns', 'unbound', 'dhcpd', 'dhcrelay', 'dhclient', 'dhcp6c', 'apinger', 'radvd', 'routed', 'olsrd', 'zebra', 'ospfd', 'bgpd', 'miniupnpd', 'filterlog');
+ $syslogconf = "";
+ if ($config['installedpackages']['package']) {
+ foreach ($config['installedpackages']['package'] as $package) {
+ if ($package['logging']) {
+ array_push($separatelogfacilities, $package['logging']['facilityname']);
+ if (!is_file($g['varlog_path'].'/'.$package['logging']['logfilename'])) {
+ mwexec("{$log_create_directive} {$log_size} {$g['varlog_path']}/{$package['logging']['logfilename']}");
+ }
+ $syslogconf .= "!{$package['logging']['facilityname']}\n*.*\t\t\t\t\t\t {$log_directive}{$g['varlog_path']}/{$package['logging']['logfilename']}\n";
+ }
+ }
+ }
+ $facilitylist = implode(',', array_unique($separatelogfacilities));
+ $syslogconf .= "!radvd,routed,olsrd,zebra,ospfd,bgpd,miniupnpd\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/routing.log\n";
+ }
+
+ $syslogconf .= "!ntp,ntpd,ntpdate\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/ntpd.log\n";
+ }
+
+ $syslogconf .= "!ppp\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/ppp.log\n";
+ }
+
+ $syslogconf .= "!pptps\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/pptps.log\n";
+ }
+
+ $syslogconf .= "!poes\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/poes.log\n";
+ }
+
+ $syslogconf .= "!l2tps\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/l2tps.log\n";
+ }
+
+ $syslogconf .= "!charon,ipsec_starter\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/ipsec.log\n";
+ }
+ if (isset($syslogcfg['vpn'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
+ }
+
+ $syslogconf .= "!openvpn\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/openvpn.log\n";
+ }
+ if (isset($syslogcfg['vpn'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
+ }
+
+ $syslogconf .= "!apinger\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/gateways.log\n";
+ }
+ if (isset($syslogcfg['apinger'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
+ }
+
+ $syslogconf .= "!dnsmasq,filterdns,unbound\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/resolver.log\n";
+ }
+
+ $syslogconf .= "!dhcpd,dhcrelay,dhclient,dhcp6c\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/dhcpd.log\n";
+ }
+ if (isset($syslogcfg['dhcp'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
+ }
+
+ $syslogconf .= "!relayd\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/relayd.log\n";
+ }
+ if (isset($syslogcfg['relayd'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
+ }
+
+ $syslogconf .= "!hostapd\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/wireless.log\n";
+ }
+ if (isset($syslogcfg['hostapd'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
+ }
+
+ $syslogconf .= "!filterlog\n";
+ $syslogconf .= "*.* {$log_directive}{$g['varlog_path']}/filter.log\n";
+ if (isset($syslogcfg['filter'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
+ }
+
+ $syslogconf .= "!-{$facilitylist}\n";
+ if (!isset($syslogcfg['disablelocallogging'])) {
+ $syslogconf .= <<<EOD
+local3.* {$log_directive}{$g['varlog_path']}/vpn.log
+local4.* {$log_directive}{$g['varlog_path']}/portalauth.log
+local7.* {$log_directive}{$g['varlog_path']}/dhcpd.log
+*.notice;kern.debug;lpr.info;mail.crit;daemon.none; {$log_directive}{$g['varlog_path']}/system.log
+news.err;local0.none;local3.none;local4.none; {$log_directive}{$g['varlog_path']}/system.log
+local7.none {$log_directive}{$g['varlog_path']}/system.log
+security.* {$log_directive}{$g['varlog_path']}/system.log
+auth.info;authpriv.info;daemon.info {$log_directive}{$g['varlog_path']}/system.log
+auth.info;authpriv.info |exec /usr/local/sbin/sshlockout_pf 15
+*.emerg *
+
+EOD;
+ }
+ if (isset($syslogcfg['vpn'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "local3.*");
+ }
+ if (isset($syslogcfg['portalauth'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "local4.*");
+ }
+ if (isset($syslogcfg['dhcp'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "local7.*");
+ }
+ if (isset($syslogcfg['system'])) {
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.notice;kern.debug;lpr.info;mail.crit;");
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "news.err;local0.none;local3.none;local7.none");
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "security.*");
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "auth.info;authpriv.info;daemon.info");
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.emerg");
+ }
+ if (isset($syslogcfg['logall'])) {
+ // Make everything mean everything, including facilities excluded above.
+ $syslogconf .= "!*\n";
+ $syslogconf .= system_syslogd_get_remote_servers($syslogcfg, "*.*");
+ }
+
+ if (isset($syslogcfg['zmqserver'])) {
+ $syslogconf .= <<<EOD
+*.* ^{$syslogcfg['zmqserver']}
+
+EOD;
+ }
+ /* write syslog.conf */
+ if (!@file_put_contents("{$g['varetc_path']}/syslog.conf", $syslogconf)) {
+ printf(gettext("Error: cannot open syslog.conf in system_syslogd_start().%s"), "\n");
+ unset($syslogconf);
+ return 1;
+ }
+ unset($syslogconf);
+
+ // Ensure that the log directory exists
+ if (!is_dir("{$g['dhcpd_chroot_path']}/var/run")) {
+ exec("/bin/mkdir -p {$g['dhcpd_chroot_path']}/var/run");
+ }
+
+ $sourceip = "";
+ if (!empty($syslogcfg['sourceip'])) {
+ if ($syslogcfg['ipproto'] == "ipv6") {
+ $ifaddr = is_ipaddr($syslogcfg['sourceip']) ? $syslogcfg['sourceip'] : get_interface_ipv6($syslogcfg['sourceip']);
+ if (!is_ipaddr($ifaddr)) {
+ $ifaddr = get_interface_ip($syslogcfg['sourceip']);
+ }
+ } else {
+ $ifaddr = is_ipaddr($syslogcfg['sourceip']) ? $syslogcfg['sourceip'] : get_interface_ip($syslogcfg['sourceip']);
+ if (!is_ipaddr($ifaddr)) {
+ $ifaddr = get_interface_ipv6($syslogcfg['sourceip']);
+ }
+ }
+ if (is_ipaddr($ifaddr)) {
+ $sourceip = "-b {$ifaddr}";
+ }
+ }
+
+ $syslogd_extra = "-f {$g['varetc_path']}/syslog.conf {$sourceip}";
+ }
+
+ if (isvalidpid("{$g['varrun_path']}/syslog.pid")) {
+ sigkillbypid("{$g['varrun_path']}/syslog.pid", "TERM");
+ usleep(100000); // syslogd often doesn't respond to a TERM quickly enough for the starting of syslogd below to be successful
+ }
+
+ if (isvalidpid("{$g['varrun_path']}/syslog.pid")) {
+ // if it still hasn't responded to the TERM, KILL it.
+ sigkillbypid("{$g['varrun_path']}/syslog.pid", "KILL");
+ usleep(100000);
+ }
+
+
+ $retval = mwexec_bg("/usr/sbin/syslogd -s -c -c -l {$g['dhcpd_chroot_path']}/var/run/log -P {$g['varrun_path']}/syslog.pid {$syslogd_extra}");
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+
+ return $retval;
+}
+
+function system_webgui_create_certificate() {
+ global $config, $g;
+
+ if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+ }
+ $a_ca =& $config['ca'];
+ if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+ }
+ $a_cert =& $config['cert'];
+ log_error("Creating SSL Certificate for this host");
+
+ $cert = array();
+ $cert['refid'] = uniqid();
+ $cert['descr'] = gettext("webConfigurator default ({$cert['refid']})");
+
+ $dn = array(
+ 'countryName' => "US",
+ 'stateOrProvinceName' => "State",
+ 'localityName' => "Locality",
+ 'organizationName' => "{$g['product_name']} webConfigurator Self-Signed Certificate",
+ 'emailAddress' => "admin@{$config['system']['hostname']}.{$config['system']['domain']}",
+ 'commonName' => "{$config['system']['hostname']}-{$cert['refid']}");
+ $old_err_level = error_reporting(0); /* otherwise openssl_ functions throw warnings directly to a page screwing menu tab */
+ if (!cert_create($cert, null, 2048, 2000, $dn, "self-signed", "sha256")) {
+ while ($ssl_err = openssl_error_string()) {
+ log_error("Error creating WebGUI Certificate: openssl library returns: " . $ssl_err);
+ }
+ error_reporting($old_err_level);
+ return null;
+ }
+ error_reporting($old_err_level);
+
+ $a_cert[] = $cert;
+ $config['system']['webgui']['ssl-certref'] = $cert['refid'];
+ write_config(gettext("Generated new self-signed HTTPS certificate ({$cert['refid']})"));
+ return $cert;
+}
+
+function system_webgui_start() {
+ global $config, $g;
+
+ if (platform_booting()) {
+ echo gettext("Starting webConfigurator...");
+ }
+
+ chdir($g['www_path']);
+
+ /* defaults */
+ $portarg = "80";
+ $crt = "";
+ $key = "";
+ $ca = "";
+
+ /* non-standard port? */
+ if (isset($config['system']['webgui']['port']) && $config['system']['webgui']['port'] <> "") {
+ $portarg = "{$config['system']['webgui']['port']}";
+ }
+
+ if ($config['system']['webgui']['protocol'] == "https") {
+ // Ensure that we have a webConfigurator CERT
+ $cert =& lookup_cert($config['system']['webgui']['ssl-certref']);
+ if (!is_array($cert) || !$cert['crt'] || !$cert['prv']) {
+ $cert = system_webgui_create_certificate();
+ }
+ $crt = base64_decode($cert['crt']);
+ $key = base64_decode($cert['prv']);
+
+ if (!$config['system']['webgui']['port']) {
+ $portarg = "443";
+ }
+ $ca = ca_chain($cert);
+ }
+
+ /* generate lighttpd configuration */
+ system_generate_lighty_config("{$g['varetc_path']}/lighty-webConfigurator.conf",
+ $crt, $key, $ca, "lighty-webConfigurator.pid", $portarg, "/usr/local/www/",
+ "cert.pem", "ca.pem");
+
+ /* kill any running lighttpd */
+ killbypid("{$g['varrun_path']}/lighty-webConfigurator.pid");
+
+ sleep(1);
+
+ @unlink("{$g['varrun_path']}/lighty-webConfigurator.pid");
+
+ /* attempt to start lighthttpd */
+ $res = mwexec("/usr/local/sbin/lighttpd -f {$g['varetc_path']}/lighty-webConfigurator.conf");
+
+ if (platform_booting()) {
+ if ($res == 0) {
+ echo gettext("done.") . "\n";
+ } else {
+ echo gettext("failed!") . "\n";
+ }
+ }
+
+ return $res;
+}
+
+function system_generate_lighty_config($filename,
+ $cert,
+ $key,
+ $ca,
+ $pid_file,
+ $port = 80,
+ $document_root = "/usr/local/www/",
+ $cert_location = "cert.pem",
+ $ca_location = "ca.pem",
+ $captive_portal = false) {
+
+ global $config, $g;
+
+ if (!is_dir("{$g['tmp_path']}/lighttpdcompress")) {
+ mkdir("{$g['tmp_path']}/lighttpdcompress");
+ }
+
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_generate_lighty_config() being called $mt\n";
+ }
+
+ if ($captive_portal !== false) {
+ $captiveportal = ",\"mod_rewrite\",\"mod_evasive\"";
+ $captive_portal_rewrite = "url.rewrite-once = ( \"(.*captiveportal.*)\" => \"$1\", \"(.*)\" => \"/index.php?zone={$captive_portal}&redirurl=$1\" )\n";
+
+ $maxprocperip = $config['captiveportal'][$captive_portal]['maxprocperip'];
+ if (empty($maxprocperip)) {
+ $maxprocperip = 10;
+ }
+ $captive_portal_mod_evasive = "evasive.max-conns-per-ip = {$maxprocperip}";
+
+ $server_upload_dirs = "server.upload-dirs = ( \"{$g['tmp_path']}/captiveportal/\" )\n";
+ if (!is_dir("{$g['tmp_path']}/captiveportal")) {
+ @mkdir("{$g['tmp_path']}/captiveportal", 0555);
+ }
+ $server_max_request_size = "server.max-request-size = 384";
+ $cgi_config = "";
+ } else {
+ $captiveportal = ",\"mod_cgi\"";
+ $captive_portal_rewrite = "";
+ $captive_portal_mod_evasive = "";
+ $server_upload_dirs = "server.upload-dirs = ( \"{$g['upload_path']}/\", \"{$g['tmp_path']}/\", \"/var/\" )\n";
+ $server_max_request_size = "server.max-request-size = 2097152";
+ $cgi_config = "cgi.assign = ( \".cgi\" => \"\" )";
+ }
+
+ if (empty($port)) {
+ $lighty_port = "80";
+ } else {
+ $lighty_port = $port;
+ }
+
+ $memory = get_memory();
+ $realmem = $memory[1];
+
+ // Determine web GUI process settings and take into account low memory systems
+ if ($realmem < 255) {
+ $max_procs = 1;
+ } else {
+ $max_procs = ($config['system']['webgui']['max_procs']) ? $config['system']['webgui']['max_procs'] : 2;
+ }
+
+ // Ramp up captive portal max procs, assuming each PHP process can consume up to 64MB RAM
+ if ($captive_portal !== false) {
+ if ($realmem > 135 and $realmem < 256) {
+ $max_procs += 1; // 2 worker processes
+ } else if ($realmem > 255 and $realmem < 513) {
+ $max_procs += 2; // 3 worker processes
+ } else if ($realmem > 512) {
+ $max_procs += 4; // 6 worker processes
+ }
+ if ($max_procs > 1) {
+ $max_php_children = intval($max_procs/2);
+ } else {
+ $max_php_children = 1;
+ }
+
+ } else {
+ if ($realmem < 78) {
+ $max_php_children = 0;
+ } else {
+ $max_php_children = 1;
+ }
+ }
+
+ if (!isset($config['syslog']['nologlighttpd'])) {
+ $lighty_use_syslog = <<<EOD
+## where to send error-messages to
+server.errorlog-use-syslog="enable"
+EOD;
+ }
+
+
+ if ($captive_portal !== false) {
+ $fast_cgi_path = "{$g['tmp_path']}/php-fastcgi-{$captive_portal}.socket";
+ $fastcgi_config = <<<EOD
+#### fastcgi module
+## read fastcgi.txt for more info
+fastcgi.server = ( ".php" =>
+ ( "localhost" =>
+ (
+ "socket" => "{$fast_cgi_path}",
+ "max-procs" => {$max_procs},
+ "bin-environment" => (
+ "PHP_FCGI_CHILDREN" => "{$max_php_children}",
+ "PHP_FCGI_MAX_REQUESTS" => "500"
+ ),
+ "bin-path" => "/usr/local/bin/php-cgi"
+ )
+ )
+)
+
+EOD;
+ } else {
+ $fast_cgi_path = "{$g['varrun_path']}/php-fpm.socket";
+ $fastcgi_config = <<<EOD
+#### fastcgi module
+## read fastcgi.txt for more info
+fastcgi.server = ( ".php" =>
+ ( "localhost" =>
+ (
+ "socket" => "{$fast_cgi_path}",
+ "broken-scriptfilename" => "enable"
+ )
+ )
+)
+
+EOD;
+ }
+
+
+ $lighty_config = <<<EOD
+#
+# lighttpd configuration file
+#
+# use a it as base for lighttpd 1.0.0 and above
+#
+############ Options you really have to take care of ####################
+
+## FreeBSD!
+server.event-handler = "freebsd-kqueue"
+server.network-backend = "writev"
+#server.use-ipv6 = "enable"
+
+## modules to load
+server.modules = ( "mod_access", "mod_expire", "mod_compress", "mod_redirect",
+ {$captiveportal}, "mod_fastcgi"
+)
+
+server.max-keep-alive-requests = 15
+server.max-keep-alive-idle = 30
+
+## a static document-root, for virtual-hosting take look at the
+## server.virtual-* options
+server.document-root = "{$document_root}"
+{$captive_portal_rewrite}
+
+# Maximum idle time with nothing being written (php downloading)
+server.max-write-idle = 999
+
+{$lighty_use_syslog}
+
+# files to check for if .../ is requested
+server.indexfiles = ( "index.php", "index.html",
+ "index.htm", "default.htm" )
+
+# mimetype mapping
+mimetype.assign = (
+ ".pdf" => "application/pdf",
+ ".sig" => "application/pgp-signature",
+ ".spl" => "application/futuresplash",
+ ".class" => "application/octet-stream",
+ ".ps" => "application/postscript",
+ ".torrent" => "application/x-bittorrent",
+ ".dvi" => "application/x-dvi",
+ ".gz" => "application/x-gzip",
+ ".pac" => "application/x-ns-proxy-autoconfig",
+ ".swf" => "application/x-shockwave-flash",
+ ".tar.gz" => "application/x-tgz",
+ ".tgz" => "application/x-tgz",
+ ".tar" => "application/x-tar",
+ ".zip" => "application/zip",
+ ".mp3" => "audio/mpeg",
+ ".m3u" => "audio/x-mpegurl",
+ ".wma" => "audio/x-ms-wma",
+ ".wax" => "audio/x-ms-wax",
+ ".ogg" => "audio/x-wav",
+ ".wav" => "audio/x-wav",
+ ".gif" => "image/gif",
+ ".jpg" => "image/jpeg",
+ ".jpeg" => "image/jpeg",
+ ".png" => "image/png",
+ ".xbm" => "image/x-xbitmap",
+ ".xpm" => "image/x-xpixmap",
+ ".xwd" => "image/x-xwindowdump",
+ ".css" => "text/css",
+ ".html" => "text/html",
+ ".htm" => "text/html",
+ ".js" => "text/javascript",
+ ".asc" => "text/plain",
+ ".c" => "text/plain",
+ ".conf" => "text/plain",
+ ".text" => "text/plain",
+ ".txt" => "text/plain",
+ ".dtd" => "text/xml",
+ ".xml" => "text/xml",
+ ".mpeg" => "video/mpeg",
+ ".mpg" => "video/mpeg",
+ ".mov" => "video/quicktime",
+ ".qt" => "video/quicktime",
+ ".avi" => "video/x-msvideo",
+ ".asf" => "video/x-ms-asf",
+ ".asx" => "video/x-ms-asf",
+ ".wmv" => "video/x-ms-wmv",
+ ".bz2" => "application/x-bzip",
+ ".tbz" => "application/x-bzip-compressed-tar",
+ ".tar.bz2" => "application/x-bzip-compressed-tar"
+ )
+
+# Use the "Content-Type" extended attribute to obtain mime type if possible
+#mimetypes.use-xattr = "enable"
+
+## deny access the file-extensions
+#
+# ~ is for backupfiles from vi, emacs, joe, ...
+# .inc is often used for code includes which should in general not be part
+# of the document-root
+url.access-deny = ( "~", ".inc" )
+
+
+######### Options that are good to be but not necessary to be changed #######
+
+## disable server header
+server.tag = ""
+
+## bind to port (default: 80)
+
+EOD;
+
+ $lighty_config .= "server.bind = \"0.0.0.0\"\n";
+ $lighty_config .= "server.port = {$lighty_port}\n";
+ $lighty_config .= "\$SERVER[\"socket\"] == \"0.0.0.0:{$lighty_port}\" { }\n";
+ $lighty_config .= "\$SERVER[\"socket\"] == \"[::]:{$lighty_port}\" { \n";
+ if ($cert <> "" and $key <> "") {
+ $lighty_config .= "\n";
+ $lighty_config .= "## ssl configuration\n";
+ $lighty_config .= "ssl.engine = \"enable\"\n";
+ $lighty_config .= "ssl.pemfile = \"{$g['varetc_path']}/{$cert_location}\"\n\n";
+ if ($ca <> "") {
+ $lighty_config .= "ssl.ca-file = \"{$g['varetc_path']}/{$ca_location}\"\n\n";
+ }
+ }
+ $lighty_config .= " }\n";
+
+
+ $lighty_config .= <<<EOD
+
+## error-handler for status 404
+#server.error-handler-404 = "/error-handler.html"
+#server.error-handler-404 = "/error-handler.php"
+
+## to help the rc.scripts
+server.pid-file = "{$g['varrun_path']}/{$pid_file}"
+
+## virtual directory listings
+server.dir-listing = "disable"
+
+## enable debugging
+debug.log-request-header = "disable"
+debug.log-response-header = "disable"
+debug.log-request-handling = "disable"
+debug.log-file-not-found = "disable"
+
+# gzip compression
+compress.cache-dir = "{$g['tmp_path']}/lighttpdcompress/"
+compress.filetype = ("text/plain","text/css", "text/xml", "text/javascript" )
+
+{$server_upload_dirs}
+
+{$server_max_request_size}
+
+{$fastcgi_config}
+
+{$cgi_config}
+
+{$captive_portal_mod_evasive}
+
+expire.url = (
+ "" => "access 50 hours",
+ )
+
+EOD;
+
+ $cert = str_replace("\r", "", $cert);
+ $key = str_replace("\r", "", $key);
+ $ca = str_replace("\r", "", $ca);
+
+ $cert = str_replace("\n\n", "\n", $cert);
+ $key = str_replace("\n\n", "\n", $key);
+ $ca = str_replace("\n\n", "\n", $ca);
+
+ if ($cert <> "" and $key <> "") {
+ $fd = fopen("{$g['varetc_path']}/{$cert_location}", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open cert.pem in system_webgui_start().%s"), "\n");
+ return 1;
+ }
+ chmod("{$g['varetc_path']}/{$cert_location}", 0600);
+ fwrite($fd, $cert);
+ fwrite($fd, "\n");
+ fwrite($fd, $key);
+ fclose($fd);
+ if (!(empty($ca) || (strlen(trim($ca)) == 0))) {
+ $fd = fopen("{$g['varetc_path']}/{$ca_location}", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open ca.pem in system_webgui_start().%s"), "\n");
+ return 1;
+ }
+ chmod("{$g['varetc_path']}/{$ca_location}", 0600);
+ fwrite($fd, $ca);
+ fclose($fd);
+ }
+ $lighty_config .= "\n";
+ $lighty_config .= "## " . gettext("ssl configuration") . "\n";
+ $lighty_config .= "ssl.engine = \"enable\"\n";
+ $lighty_config .= "ssl.pemfile = \"{$g['varetc_path']}/{$cert_location}\"\n\n";
+
+ // SSLv2/3 is deprecated, force use of TLS
+ $lighty_config .= "ssl.use-sslv2 = \"disable\"\n";
+ $lighty_config .= "ssl.use-sslv3 = \"disable\"\n";
+
+ // where ssl.cipher-list is set, this is automatically enabled, but set it explicitly anyway.
+ $lighty_config .= "ssl.honor-cipher-order = \"enable\"\n";
+
+ $lighty_config .= "ssl.cipher-list = \"AES128+EECDH:AES256+EECDH:AES128+EDH:AES256+EDH:AES128-SHA:AES256-SHA:!aNULL:!eNULL:!DSS\"\n";
+
+ if (!(empty($ca) || (strlen(trim($ca)) == 0))) {
+ $lighty_config .= "ssl.ca-file = \"{$g['varetc_path']}/{$ca_location}\"\n\n";
+ }
+ }
+
+ // Add HTTP to HTTPS redirect
+ if ($captive_portal === false && $config['system']['webgui']['protocol'] == "https" && !isset($config['system']['webgui']['disablehttpredirect'])) {
+ if ($lighty_port != "443") {
+ $redirectport = ":{$lighty_port}";
+ }
+ $lighty_config .= <<<EOD
+\$SERVER["socket"] == ":80" {
+ \$HTTP["host"] =~ "(.*)" {
+ url.redirect = ( "^/(.*)" => "https://%1{$redirectport}/$1" )
+ }
+}
+\$SERVER["socket"] == "[::]:80" {
+ \$HTTP["host"] =~ "(.*)" {
+ url.redirect = ( "^/(.*)" => "https://%1{$redirectport}/$1" )
+ }
+}
+EOD;
+ }
+
+ $fd = fopen("{$filename}", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open %s in system_generate_lighty_config().%s"), $filename, "\n");
+ return 1;
+ }
+ fwrite($fd, $lighty_config);
+ fclose($fd);
+
+ return 0;
+
+}
+
+function system_timezone_configure() {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_timezone_configure() being called $mt\n";
+ }
+
+ $syscfg = $config['system'];
+
+ if (platform_booting()) {
+ echo gettext("Setting timezone...");
+ }
+
+ /* extract appropriate timezone file */
+ $timezone = $syscfg['timezone'];
+ if ($timezone) {
+ exec('/usr/bin/tar -tvzf /usr/share/zoneinfo.tgz', $tzs);
+ foreach ($tzs as $tz) {
+ if (preg_match(",{$timezone}$,", $tz)) {
+ break;
+ }
+ if (preg_match(",{$timezone} link to *(.*)$,", $tz, $matches)) {
+ $timezone = $matches[1];
+ break;
+ }
+ }
+ } else {
+ $timezone = "Etc/UTC";
+ }
+
+ conf_mount_rw();
+
+ exec("LANG=C /usr/bin/tar xzfO /usr/share/zoneinfo.tgz " .
+ escapeshellarg($timezone) . " > /etc/localtime");
+
+ mwexec("sync");
+ conf_mount_ro();
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+}
+
+function system_ntp_setup_gps($serialport) {
+ global $config, $g;
+ $gps_device = '/dev/gps0';
+ $serialport = '/dev/'.$serialport;
+
+ if (!file_exists($serialport)) {
+ return false;
+ }
+
+ conf_mount_rw();
+ // Create symlink that ntpd requires
+ unlink_if_exists($gps_device);
+ @symlink($serialport, $gps_device);
+
+ $gpsbaud = '4800';
+ if (is_array($config['ntpd']) && is_array($config['ntpd']['gps']) && !empty($config['ntpd']['gps']['speed'])) {
+ switch ($config['ntpd']['gps']['speed']) {
+ case '16':
+ $gpsbaud = '9600';
+ break;
+ case '32':
+ $gpsbaud = '19200';
+ break;
+ case '48':
+ $gpsbaud = '38400';
+ break;
+ case '64':
+ $gpsbaud = '57600';
+ break;
+ case '80':
+ $gpsbaud = '115200';
+ break;
+ }
+ }
+
+ /* Configure the serial port for raw IO and set the speed */
+ mwexec("stty -f {$serialport}.init raw speed {$gpsbaud}");
+
+ /* Send the following to the GPS port to initialize the GPS */
+ if (is_array($config['ntpd']) && is_array($config['ntpd']['gps']) && !empty($config['ntpd']['gps']['type'])) {
+ $gps_init = base64_decode($config['ntpd']['gps']['initcmd']);
+ } else {
+ $gps_init = base64_decode('JFBVQlgsNDAsR1NWLDAsMCwwLDAqNTkNCiRQVUJYLDQwLEdMTCwwLDAsMCwwKjVDDQokUFVCWCw0MCxaREEsMCwwLDAsMCo0NA0KJFBVQlgsNDAsVlRHLDAsMCwwLDAqNUUNCiRQVUJYLDQwLEdTViwwLDAsMCwwKjU5DQokUFVCWCw0MCxHU0EsMCwwLDAsMCo0RQ0KJFBVQlgsNDAsR0dBLDAsMCwwLDANCiRQVUJYLDQwLFRYVCwwLDAsMCwwDQokUFVCWCw0MCxSTUMsMCwwLDAsMCo0Ng0KJFBVQlgsNDEsMSwwMDA3LDAwMDMsNDgwMCwwDQokUFVCWCw0MCxaREEsMSwxLDEsMQ==');
+ }
+
+ /* XXX: Why not file_put_contents to the device */
+ @file_put_contents('/tmp/gps.init', $gps_init);
+ mwexec("cat /tmp/gps.init > {$serialport}");
+
+ /* Add /etc/remote entry in case we need to read from the GPS with tip */
+ if (intval(`grep -c '^gps0' /etc/remote`) == 0) {
+ @file_put_contents("/etc/remote", "gps0:dv={$serialport}:br#{$gpsbaud}:pa=none:", FILE_APPEND);
+ }
+
+ conf_mount_ro();
+
+ return true;
+}
+
+function system_ntp_setup_pps($serialport) {
+ global $config, $g;
+
+ $pps_device = '/dev/pps0';
+ $serialport = '/dev/'.$serialport;
+
+ if (!file_exists($serialport)) {
+ return false;
+ }
+
+ conf_mount_rw();
+ // Create symlink that ntpd requires
+ unlink_if_exists($pps_device);
+ @symlink($serialport, $pps_device);
+
+ conf_mount_ro();
+
+ return true;
+}
+
+
+function system_ntp_configure($start_ntpd=true) {
+ global $config, $g;
+
+ $driftfile = "/var/db/ntpd.drift";
+ $statsdir = "/var/log/ntp";
+ $gps_device = '/dev/gps0';
+
+ safe_mkdir($statsdir);
+
+ if (!is_array($config['ntpd'])) {
+ $config['ntpd'] = array();
+ }
+
+ $ntpcfg = "# \n";
+ $ntpcfg .= "# pfSense ntp configuration file \n";
+ $ntpcfg .= "# \n\n";
+ $ntpcfg .= "tinker panic 0 \n";
+
+ /* Add Orphan mode */
+ $ntpcfg .= "# Orphan mode stratum\n";
+ $ntpcfg .= 'tos orphan ';
+ if (!empty($config['ntpd']['orphan'])) {
+ $ntpcfg .= $config['ntpd']['orphan'];
+ } else {
+ $ntpcfg .= '12';
+ }
+ $ntpcfg .= "\n";
+
+ /* Add PPS configuration */
+ if (is_array($config['ntpd']['pps']) && !empty($config['ntpd']['pps']['port']) &&
+ file_exists('/dev/'.$config['ntpd']['pps']['port']) &&
+ system_ntp_setup_pps($config['ntpd']['pps']['port'])) {
+ $ntpcfg .= "\n";
+ $ntpcfg .= "# PPS Setup\n";
+ $ntpcfg .= 'server 127.127.22.0';
+ $ntpcfg .= ' minpoll 4 maxpoll 4';
+ if (empty($config['ntpd']['pps']['prefer'])) { /*note: this one works backwards */
+ $ntpcfg .= ' prefer';
+ }
+ if (!empty($config['ntpd']['pps']['noselect'])) {
+ $ntpcfg .= ' noselect ';
+ }
+ $ntpcfg .= "\n";
+ $ntpcfg .= 'fudge 127.127.22.0';
+ if (!empty($config['ntpd']['pps']['fudge1'])) {
+ $ntpcfg .= ' time1 ';
+ $ntpcfg .= $config['ntpd']['pps']['fudge1'];
+ }
+ if (!empty($config['ntpd']['pps']['flag2'])) {
+ $ntpcfg .= ' flag2 1';
+ }
+ if (!empty($config['ntpd']['pps']['flag3'])) {
+ $ntpcfg .= ' flag3 1';
+ } else {
+ $ntpcfg .= ' flag3 0';
+ }
+ if (!empty($config['ntpd']['pps']['flag4'])) {
+ $ntpcfg .= ' flag4 1';
+ }
+ if (!empty($config['ntpd']['pps']['refid'])) {
+ $ntpcfg .= ' refid ';
+ $ntpcfg .= $config['ntpd']['pps']['refid'];
+ }
+ $ntpcfg .= "\n";
+ }
+ /* End PPS configuration */
+
+ /* Add GPS configuration */
+ if (is_array($config['ntpd']['gps']) && !empty($config['ntpd']['gps']['port']) &&
+ file_exists('/dev/'.$config['ntpd']['gps']['port']) &&
+ system_ntp_setup_gps($config['ntpd']['gps']['port'])) {
+ $ntpcfg .= "\n";
+ $ntpcfg .= "# GPS Setup\n";
+ $ntpcfg .= 'server 127.127.20.0 mode ';
+ if (!empty($config['ntpd']['gps']['nmea']) || !empty($config['ntpd']['gps']['speed']) || !empty($config['ntpd']['gps']['subsec'])) {
+ if (!empty($config['ntpd']['gps']['nmea'])) {
+ $ntpmode = (int) $config['ntpd']['gps']['nmea'];
+ }
+ if (!empty($config['ntpd']['gps']['speed'])) {
+ $ntpmode += (int) $config['ntpd']['gps']['speed'];
+ }
+ if (!empty($config['ntpd']['gps']['subsec'])) {
+ $ntpmode += 128;
+ }
+ $ntpcfg .= (string) $ntpmode;
+ } else {
+ $ntpcfg .= '0';
+ }
+ $ntpcfg .= ' minpoll 4 maxpoll 4';
+ if (empty($config['ntpd']['gps']['prefer'])) { /*note: this one works backwards */
+ $ntpcfg .= ' prefer';
+ }
+ if (!empty($config['ntpd']['gps']['noselect'])) {
+ $ntpcfg .= ' noselect ';
+ }
+ $ntpcfg .= "\n";
+ $ntpcfg .= 'fudge 127.127.20.0';
+ if (!empty($config['ntpd']['gps']['fudge1'])) {
+ $ntpcfg .= ' time1 ';
+ $ntpcfg .= $config['ntpd']['gps']['fudge1'];
+ }
+ if (!empty($config['ntpd']['gps']['fudge2'])) {
+ $ntpcfg .= ' time2 ';
+ $ntpcfg .= $config['ntpd']['gps']['fudge2'];
+ }
+ if (!empty($config['ntpd']['gps']['flag1'])) {
+ $ntpcfg .= ' flag1 1';
+ } else {
+ $ntpcfg .= ' flag1 0';
+ }
+ if (!empty($config['ntpd']['gps']['flag2'])) {
+ $ntpcfg .= ' flag2 1';
+ }
+ if (!empty($config['ntpd']['gps']['flag3'])) {
+ $ntpcfg .= ' flag3 1';
+ } else {
+ $ntpcfg .= ' flag3 0';
+ }
+ if (!empty($config['ntpd']['gps']['flag4'])) {
+ $ntpcfg .= ' flag4 1';
+ }
+ if (!empty($config['ntpd']['gps']['refid'])) {
+ $ntpcfg .= ' refid ';
+ $ntpcfg .= $config['ntpd']['gps']['refid'];
+ }
+ $ntpcfg .= "\n";
+ } elseif (is_array($config['ntpd']) && !empty($config['ntpd']['gpsport']) &&
+ file_exists('/dev/'.$config['ntpd']['gpsport']) &&
+ system_ntp_setup_gps($config['ntpd']['gpsport'])) {
+ /* This handles a 2.1 and earlier config */
+ $ntpcfg .= "# GPS Setup\n";
+ $ntpcfg .= "server 127.127.20.0 mode 0 minpoll 4 maxpoll 4 prefer\n";
+ $ntpcfg .= "fudge 127.127.20.0 time1 0.155 time2 0.000 flag1 1 flag2 0 flag3 1\n";
+ // Fall back to local clock if GPS is out of sync?
+ $ntpcfg .= "server 127.127.1.0\n";
+ $ntpcfg .= "fudge 127.127.1.0 stratum 12\n";
+ }
+ /* End GPS configuration */
+
+ $ntpcfg .= "\n\n# Upstream Servers\n";
+ /* foreach through ntp servers and write out to ntpd.conf */
+ foreach (explode(' ', $config['system']['timeservers']) as $ts) {
+ $ntpcfg .= "server {$ts} iburst maxpoll 9";
+ if (substr_count($config['ntpd']['prefer'], $ts)) {
+ $ntpcfg .= ' prefer';
+ }
+ if (substr_count($config['ntpd']['noselect'], $ts)) {
+ $ntpcfg .= ' noselect';
+ }
+ $ntpcfg .= "\n";
+ }
+ unset($ts);
+
+ $ntpcfg .= "\n\n";
+ $ntpcfg .= "disable monitor\n"; //prevent NTP reflection attack, see https://forum.pfsense.org/index.php/topic,67189.msg389132.html#msg389132
+ if (!empty($config['ntpd']['clockstats']) || !empty($config['ntpd']['loopstats']) || !empty($config['ntpd']['peerstats'])) {
+ $ntpcfg .= "enable stats\n";
+ $ntpcfg .= 'statistics';
+ if (!empty($config['ntpd']['clockstats'])) {
+ $ntpcfg .= ' clockstats';
+ }
+ if (!empty($config['ntpd']['loopstats'])) {
+ $ntpcfg .= ' loopstats';
+ }
+ if (!empty($config['ntpd']['peerstats'])) {
+ $ntpcfg .= ' peerstats';
+ }
+ $ntpcfg .= "\n";
+ }
+ $ntpcfg .= "statsdir {$statsdir}\n";
+ $ntpcfg .= 'logconfig =syncall +clockall';
+ if (!empty($config['ntpd']['logpeer'])) {
+ $ntpcfg .= ' +peerall';
+ }
+ if (!empty($config['ntpd']['logsys'])) {
+ $ntpcfg .= ' +sysall';
+ }
+ $ntpcfg .= "\n";
+ $ntpcfg .= "driftfile {$driftfile}\n";
+ /* Access restrictions */
+ $ntpcfg .= 'restrict default';
+ if (empty($config['ntpd']['kod'])) { /*note: this one works backwards */
+ $ntpcfg .= ' kod limited';
+ }
+ if (empty($config['ntpd']['nomodify'])) { /*note: this one works backwards */
+ $ntpcfg .= ' nomodify';
+ }
+ if (!empty($config['ntpd']['noquery'])) {
+ $ntpcfg .= ' noquery';
+ }
+ if (empty($config['ntpd']['nopeer'])) { /*note: this one works backwards */
+ $ntpcfg .= ' nopeer';
+ }
+ if (empty($config['ntpd']['notrap'])) { /*note: this one works backwards */
+ $ntpcfg .= ' notrap';
+ }
+ if (!empty($config['ntpd']['noserve'])) {
+ $ntpcfg .= ' noserve';
+ }
+ $ntpcfg .= "\nrestrict -6 default";
+ if (empty($config['ntpd']['kod'])) { /*note: this one works backwards */
+ $ntpcfg .= ' kod limited';
+ }
+ if (empty($config['ntpd']['nomodify'])) { /*note: this one works backwards */
+ $ntpcfg .= ' nomodify';
+ }
+ if (!empty($config['ntpd']['noquery'])) {
+ $ntpcfg .= ' noquery';
+ }
+ if (empty($config['ntpd']['nopeer'])) { /*note: this one works backwards */
+ $ntpcfg .= ' nopeer';
+ }
+ if (!empty($config['ntpd']['noserve'])) {
+ $ntpcfg .= ' noserve';
+ }
+ if (empty($config['ntpd']['notrap'])) { /*note: this one works backwards */
+ $ntpcfg .= ' notrap';
+ }
+ $ntpcfg .= "\n";
+
+ /* A leapseconds file is really only useful if this clock is stratum 1 */
+ $ntpcfg .= "\n";
+ if (!empty($config['ntpd']['leapsec'])) {
+ $leapsec .= base64_decode($config['ntpd']['leapsec']);
+ file_put_contents('/var/db/leap-seconds', $leapsec);
+ $ntpcfg .= "leapfile /var/db/leap-seconds\n";
+ }
+
+
+ if (empty($config['ntpd']['interface'])) {
+ if (is_array($config['installedpackages']['openntpd']) && !empty($config['installedpackages']['openntpd']['config'][0]['interface'])) {
+ $interfaces = explode(",", $config['installedpackages']['openntpd']['config'][0]['interface']);
+ } else {
+ $interfaces = array();
+ }
+ } else {
+ $interfaces = explode(",", $config['ntpd']['interface']);
+ }
+
+ if (is_array($interfaces) && count($interfaces)) {
+ $ntpcfg .= "interface ignore all\n";
+ foreach ($interfaces as $interface) {
+ if (strstr($interface, "_vip")) {
+ $interface = get_configured_carp_interface_list($interface);
+ }
+ if (!is_ipaddr($interface)) {
+ $interface = get_real_interface($interface);
+ }
+ if (!empty($interface)) {
+ $ntpcfg .= "interface listen {$interface}\n";
+ }
+ }
+ }
+
+ /* open configuration for writing or bail */
+ if (!@file_put_contents("{$g['varetc_path']}/ntpd.conf", $ntpcfg)) {
+ log_error("Could not open {$g['varetc_path']}/ntpd.conf for writing");
+ return;
+ }
+
+ /* At bootup we just want to write out the config. */
+ if (!$start_ntpd) {
+ return;
+ }
+
+ /* if ntpd is running, kill it */
+ while (isvalidpid("{$g['varrun_path']}/ntpd.pid")) {
+ killbypid("{$g['varrun_path']}/ntpd.pid");
+ }
+ @unlink("{$g['varrun_path']}/ntpd.pid");
+
+ /* if /var/empty does not exist, create it */
+ if (!is_dir("/var/empty")) {
+ mkdir("/var/empty", 0775, true);
+ }
+
+ /* start opentpd, set time now and use /var/etc/ntpd.conf */
+ mwexec("/usr/local/sbin/ntpd -g -c {$g['varetc_path']}/ntpd.conf -p {$g['varrun_path']}/ntpd.pid", false, true);
+
+ // Note that we are starting up
+ log_error("NTPD is starting up.");
+ return;
+}
+
+function sync_system_time() {
+ global $config, $g;
+
+ if (platform_booting()) {
+ echo gettext("Syncing system time before startup...");
+ }
+
+ /* foreach through servers and write out to ntpd.conf */
+ foreach (explode(' ', $config['system']['timeservers']) as $ts) {
+ mwexec("/usr/local/sbin/ntpdate -s $ts");
+ }
+
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+
+}
+
+function system_halt() {
+ global $g;
+
+ system_reboot_cleanup();
+
+ mwexec("/usr/bin/nohup /etc/rc.halt > /dev/null 2>&1 &");
+}
+
+function system_reboot() {
+ global $g;
+
+ system_reboot_cleanup();
+
+ mwexec("nohup /etc/rc.reboot > /dev/null 2>&1 &");
+}
+
+function system_reboot_sync() {
+ global $g;
+
+ system_reboot_cleanup();
+
+ mwexec("/etc/rc.reboot > /dev/null 2>&1");
+}
+
+function system_reboot_cleanup() {
+ global $config, $cpzone;
+
+ mwexec("/usr/local/bin/beep.sh stop");
+ require_once("captiveportal.inc");
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cpzone=>$cp) {
+ captiveportal_radius_stop_all();
+ captiveportal_send_server_accounting(true);
+ }
+ }
+ require_once("voucher.inc");
+ voucher_save_db_to_config();
+ require_once("pkg-utils.inc");
+ stop_packages();
+}
+
+function system_do_shell_commands($early = 0) {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_do_shell_commands() being called $mt\n";
+ }
+
+ if ($early) {
+ $cmdn = "earlyshellcmd";
+ } else {
+ $cmdn = "shellcmd";
+ }
+
+ if (is_array($config['system'][$cmdn])) {
+
+ /* *cmd is an array, loop through */
+ foreach ($config['system'][$cmdn] as $cmd) {
+ exec($cmd);
+ }
+
+ } elseif ($config['system'][$cmdn] <> "") {
+
+ /* execute single item */
+ exec($config['system'][$cmdn]);
+
+ }
+}
+
+function system_console_configure() {
+ global $config, $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_console_configure() being called $mt\n";
+ }
+
+ if (isset($config['system']['disableconsolemenu'])) {
+ touch("{$g['varetc_path']}/disableconsole");
+ } else {
+ unlink_if_exists("{$g['varetc_path']}/disableconsole");
+ }
+}
+
+function system_dmesg_save() {
+ global $g;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_dmesg_save() being called $mt\n";
+ }
+
+ $dmesg = "";
+ $_gb = exec("/sbin/dmesg", $dmesg);
+
+ /* find last copyright line (output from previous boots may be present) */
+ $lastcpline = 0;
+
+ for ($i = 0; $i < count($dmesg); $i++) {
+ if (strstr($dmesg[$i], "Copyright (c) 1992-")) {
+ $lastcpline = $i;
+ }
+ }
+
+ $fd = fopen("{$g['varlog_path']}/dmesg.boot", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open dmesg.boot in system_dmesg_save().%s"), "\n");
+ return 1;
+ }
+
+ for ($i = $lastcpline; $i < count($dmesg); $i++) {
+ fwrite($fd, $dmesg[$i] . "\n");
+ }
+
+ fclose($fd);
+ unset($dmesg);
+
+ return 0;
+}
+
+function system_set_harddisk_standby() {
+ global $g, $config;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_set_harddisk_standby() being called $mt\n";
+ }
+
+ if (isset($config['system']['harddiskstandby'])) {
+ if (platform_booting()) {
+ echo gettext('Setting hard disk standby... ');
+ }
+
+ $standby = $config['system']['harddiskstandby'];
+ // Check for a numeric value
+ if (is_numeric($standby)) {
+ // Sync the disk(s)
+ pfSense_sync();
+ if (set_single_sysctl('hw.ata.standby', (int)$standby)) {
+ // Reinitialize ATA-drives
+ mwexec('/usr/local/sbin/atareinit');
+ if (platform_booting()) {
+ echo gettext("done.") . "\n";
+ }
+ } else if (platform_booting()) {
+ echo gettext("failed!") . "\n";
+ }
+ } else if (platform_booting()) {
+ echo gettext("failed!") . "\n";
+ }
+ }
+}
+
+function system_setup_sysctl() {
+ global $config;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_setup_sysctl() being called $mt\n";
+ }
+
+ activate_sysctls();
+
+ if (isset($config['system']['sharednet'])) {
+ system_disable_arp_wrong_if();
+ }
+}
+
+function system_disable_arp_wrong_if() {
+ global $config;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_disable_arp_wrong_if() being called $mt\n";
+ }
+ set_sysctl(array(
+ "net.link.ether.inet.log_arp_wrong_iface" => "0",
+ "net.link.ether.inet.log_arp_movements" => "0"
+ ));
+}
+
+function system_enable_arp_wrong_if() {
+ global $config;
+ if (isset($config['system']['developerspew'])) {
+ $mt = microtime();
+ echo "system_enable_arp_wrong_if() being called $mt\n";
+ }
+ set_sysctl(array(
+ "net.link.ether.inet.log_arp_wrong_iface" => "1",
+ "net.link.ether.inet.log_arp_movements" => "1"
+ ));
+}
+
+function enable_watchdog() {
+ global $config;
+ return;
+ $install_watchdog = false;
+ $supported_watchdogs = array("Geode");
+ $file = file_get_contents("/var/log/dmesg.boot");
+ foreach ($supported_watchdogs as $sd) {
+ if (stristr($file, "Geode")) {
+ $install_watchdog = true;
+ }
+ }
+ if ($install_watchdog == true) {
+ if (is_process_running("watchdogd")) {
+ mwexec("/usr/bin/killall watchdogd", true);
+ }
+ exec("/usr/sbin/watchdogd");
+ }
+}
+
+function system_check_reset_button() {
+ global $g;
+
+ $specplatform = system_identify_specific_platform();
+
+ switch ($specplatform['name']) {
+ case 'alix':
+ case 'wrap':
+ case 'FW7541':
+ case 'APU':
+ case 'RCC-VE':
+ case 'RCC-DFF':
+ break;
+ default:
+ return 0;
+ }
+
+ $retval = mwexec("/usr/local/sbin/" . $specplatform['name'] . "resetbtn");
+
+ if ($retval == 99) {
+ /* user has pressed reset button for 2 seconds -
+ reset to factory defaults */
+ echo <<<EOD
+
+***********************************************************************
+* Reset button pressed - resetting configuration to factory defaults. *
+* The system will reboot after this completes. *
+***********************************************************************
+
+
+EOD;
+
+ reset_factory_defaults();
+ system_reboot_sync();
+ exit(0);
+ }
+
+ return 0;
+}
+
+/* attempt to identify the specific platform (for embedded systems)
+ Returns an array with two elements:
+ name => platform string (e.g. 'wrap', 'alix' etc.)
+ descr => human-readable description (e.g. "PC Engines WRAP")
+*/
+function system_identify_specific_platform() {
+ global $g;
+
+ if ($g['platform'] == 'generic-pc') {
+ return array('name' => 'generic-pc', 'descr' => gettext("Generic PC"));
+ }
+
+ if ($g['platform'] == 'generic-pc-cdrom') {
+ return array('name' => 'generic-pc-cdrom', 'descr' => gettext("Generic PC (CD-ROM)"));
+ }
+
+ /* Try to guess from smbios strings */
+ unset($output);
+ $_gb = exec('/bin/kenv smbios.system.product 2>/dev/null', $output);
+ switch ($output[0]) {
+ case 'FW7541':
+ return (array('name' => 'FW7541', 'descr' => 'Netgate FW7541'));
+ break;
+ case 'APU':
+ return (array('name' => 'APU', 'descr' => 'Netgate APU'));
+ break;
+ case 'RCC-VE':
+ return (array('name' => 'RCC-VE', 'descr' => 'Netgate RCC-VE'));
+ break;
+ case 'DFFv2':
+ return (array('name' => 'RCC-DFF', 'descr' => 'Netgate RCC-DFF'));
+ break;
+ case 'SYS-5018A-FTN4':
+ case 'A1SAi':
+ return (array('name' => 'C2758', 'descr' => 'Super Micro C2758'));
+ break;
+ case 'SYS-5018D-FN4T':
+ return (array('name' => 'D1540-XG', 'descr' => 'Super Micro D1540-XG'));
+ break;
+ }
+
+ /* the rest of the code only deals with 'embedded' platforms */
+ if ($g['platform'] != 'nanobsd') {
+ return array('name' => $g['platform'], 'descr' => $g['platform']);
+ }
+
+ $dmesg = get_single_sysctl('hw.model');
+
+ if (strpos($dmesg, "PC Engines WRAP") !== false) {
+ return array('name' => 'wrap', 'descr' => gettext('PC Engines WRAP'));
+ }
+
+ if (strpos($dmesg, "PC Engines ALIX") !== false) {
+ return array('name' => 'alix', 'descr' => gettext('PC Engines ALIX'));
+ }
+
+ if (preg_match("/Soekris net45../", $dmesg, $matches)) {
+ return array('name' => 'net45xx', 'descr' => $matches[0]);
+ }
+
+ if (preg_match("/Soekris net48../", $dmesg, $matches)) {
+ return array('name' => 'net48xx', 'descr' => $matches[0]);
+ }
+
+ if (preg_match("/Soekris net55../", $dmesg, $matches)) {
+ return array('name' => 'net55xx', 'descr' => $matches[0]);
+ }
+
+ unset($dmesg);
+
+ $dmesg_boot = system_get_dmesg_boot();
+ if (strpos($dmesg_boot, "PC Engines ALIX") !== false) {
+ return array('name' => 'alix', 'descr' => gettext('PC Engines ALIX'));
+ }
+ unset($dmesg_boot);
+
+ /* unknown embedded platform */
+ return array('name' => 'embedded', 'descr' => gettext('embedded (unknown)'));
+}
+
+function system_get_dmesg_boot() {
+ global $g;
+
+ return file_get_contents("{$g['varlog_path']}/dmesg.boot");
+}
+
+?>
diff --git a/src/etc/inc/unbound.inc b/src/etc/inc/unbound.inc
new file mode 100644
index 0000000..043ced2
--- /dev/null
+++ b/src/etc/inc/unbound.inc
@@ -0,0 +1,717 @@
+<?php
+/*
+ unbound.inc
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright (C) 2015 Warren Baker <warren@percol8.co.za>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/unbound /usr/local/sbin/unbound-anchor /usr/local/sbin/unbound-checkconf
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/unbound-control /usr/local/sbin/unbound-control-setup
+ pfSense_MODULE: unbound
+*/
+
+/* include all configuration functions */
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+function create_unbound_chroot_path() {
+ global $config, $g;
+
+ // Configure chroot
+ if (!is_dir($g['unbound_chroot_path'])) {
+ mkdir($g['unbound_chroot_path']);
+ chown($g['unbound_chroot_path'], "unbound");
+ chgrp($g['unbound_chroot_path'], "unbound");
+ }
+
+}
+
+/* Optimize Unbound for environment */
+function unbound_optimization() {
+ global $config;
+
+ $optimization_settings = array();
+
+ /*
+ * Set the number of threads equal to number of CPUs.
+ * Use 1 to disable threading, if for some reason this sysctl fails.
+ */
+ $numprocs = intval(get_single_sysctl('kern.smp.cpus'));
+ if ($numprocs > 1) {
+ $optimization['number_threads'] = "num-threads: {$numprocs}";
+ $optimize_num = pow(2, floor(log($numprocs, 2)));
+ } else {
+ $optimization['number_threads'] = "num-threads: 1";
+ $optimize_num = 4;
+ }
+
+ // Slabs to help reduce lock contention.
+ $optimization['msg_cache_slabs'] = "msg-cache-slabs: {$optimize_num}";
+ $optimization['rrset_cache_slabs'] = "rrset-cache-slabs: {$optimize_num}";
+ $optimization['infra_cache_slabs'] = "infra-cache-slabs: {$optimize_num}";
+ $optimization['key_cache_slabs'] = "key-cache-slabs: {$optimize_num}";
+
+ /*
+ * Larger socket buffer for busy servers
+ * Check that it is set to 4MB (by default the OS has it configured to 4MB)
+ */
+ if (is_array($config['sysctl']) && is_array($config['sysctl']['item'])) {
+ foreach ($config['sysctl']['item'] as $tunable) {
+ if ($tunable['tunable'] == 'kern.ipc.maxsockbuf') {
+ $so = floor(($tunable['value']/1024/1024)-4);
+ // Check to ensure that the number is not a negative
+ if ($so >= 4) {
+ // Limit to 32MB, users might set maxsockbuf very high for other reasons.
+ // We do not want unbound to fail because of that.
+ $so = min($so, 32);
+ $optimization['so_rcvbuf'] = "so-rcvbuf: {$so}m";
+ } else {
+ unset($optimization['so_rcvbuf']);
+ }
+ }
+ }
+ }
+ // Safety check in case kern.ipc.maxsockbuf is not available.
+ if (!isset($optimization['so_rcvbuf'])) {
+ $optimization['so_rcvbuf'] = "#so-rcvbuf: 4m";
+ }
+
+ return $optimization;
+
+}
+
+function unbound_generate_config() {
+ global $config, $g;
+
+ // Setup optimization
+ $optimization = unbound_optimization();
+
+ // Setup DNSSEC support
+ if (isset($config['unbound']['dnssec'])) {
+ $module_config = "validator iterator";
+ $anchor_file = "auto-trust-anchor-file: {$g['unbound_chroot_path']}/root.key";
+ } else {
+ $module_config = "iterator";
+ }
+
+ // Setup DNS Rebinding
+ if (!isset($config['system']['webgui']['nodnsrebindcheck'])) {
+ // Private-addresses for DNS Rebinding
+ $private_addr = <<<EOF
+# For DNS Rebinding prevention
+private-address: 10.0.0.0/8
+private-address: 172.16.0.0/12
+private-address: 169.254.0.0/16
+private-address: 192.168.0.0/16
+private-address: fd00::/8
+private-address: fe80::/10
+EOF;
+ }
+
+ // Determine interfaces to run on
+ $bindints = "";
+ if (!empty($config['unbound']['active_interface'])) {
+ $active_interfaces = explode(",", $config['unbound']['active_interface']);
+ if (in_array("all", $active_interfaces, true)) {
+ $bindints .= "interface: 0.0.0.0\n";
+ $bindints .= "interface: ::0\n";
+ $bindints .= "interface-automatic: yes\n";
+ } else {
+ foreach ($active_interfaces as $ubif) {
+ if (is_ipaddr($ubif)) {
+ //$bindints .= "interface: $ubif\n"; -- until redmine #4062 is fixed, then uncomment this.
+ } else {
+ $intip = get_interface_ip($ubif);
+ if (is_ipaddrv4($intip)) {
+ $bindints .= "interface: $intip\n";
+ }
+ $intip = get_interface_ipv6($ubif);
+ if (is_ipaddrv6($intip)) {
+ if (!is_linklocal($intip)) { // skipping link local for the moment to not break people's configs: https://redmine.pfsense.org/issues/4062
+ $bindints .= "interface: $intip\n";
+ }
+ }
+ }
+ }
+ }
+ } else {
+ $bindints .= "interface: 0.0.0.0\n";
+ $bindints .= "interface: ::0\n";
+ /* If the active interface array is empty, treat it the same as "All" as is done above. Otherwise it breaks CARP with a default config. */
+ $bindints .= "interface-automatic: yes\n";
+ }
+
+ // Determine interfaces to run on
+ $outgoingints = "";
+ if (!empty($config['unbound']['outgoing_interface'])) {
+ $outgoingints = "# Outgoing interfaces to be used\n";
+ $outgoing_interfaces = explode(",", $config['unbound']['outgoing_interface']);
+ foreach ($outgoing_interfaces as $outif) {
+ $outip = get_interface_ip($outif);
+ if (is_ipaddr($outip)) {
+ $outgoingints .= "outgoing-interface: $outip\n";
+ }
+ $outip = get_interface_ipv6($outif);
+ if (is_ipaddrv6($outip)) {
+ $outgoingints .= "outgoing-interface: $outip\n";
+ }
+ }
+ }
+
+ // Allow DNS Rebind for forwarded domains
+ if (isset($config['unbound']['domainoverrides']) && is_array($config['unbound']['domainoverrides'])) {
+ if (!isset($config['system']['webgui']['nodnsrebindcheck'])) {
+ $private_domains = "# Set private domains in case authoritative name server returns a Private IP address\n";
+ $private_domains .= unbound_add_domain_overrides("private");
+ }
+ $reverse_zones .= unbound_add_domain_overrides("reverse");
+ }
+
+ // Configure static Host entries
+ unbound_add_host_entries();
+
+ // Configure Domain Overrides
+ unbound_add_domain_overrides();
+
+ // Configure Unbound statistics
+ $statistics = unbound_statistics();
+
+ // Configure Unbound access-lists
+ unbound_acls_config();
+
+ // Add custom Unbound options
+ if ($config['unbound']['custom_options']) {
+ $custom_options_source = explode("\n", base64_decode($config['unbound']['custom_options']));
+ $custom_options = "# Unbound custom options\n";
+ foreach ($custom_options_source as $ent) {
+ $custom_options .= $ent."\n";
+ }
+ }
+
+ // Server configuration variables
+ $port = (is_port($config['unbound']['port'])) ? $config['unbound']['port'] : "53";
+ $hide_identity = isset($config['unbound']['hideidentity']) ? "yes" : "no";
+ $hide_version = isset($config['unbound']['hideversion']) ? "yes" : "no";
+ $harden_dnssec_stripped = isset($config['unbound']['dnssecstripped']) ? "yes" : "no";
+ $prefetch = isset($config['unbound']['prefetch']) ? "yes" : "no";
+ $prefetch_key = isset($config['unbound']['prefetchkey']) ? "yes" : "no";
+ $outgoing_num_tcp = (!empty($config['unbound']['outgoing_num_tcp'])) ? $config['unbound']['outgoing_num_tcp'] : "10";
+ $incoming_num_tcp = (!empty($config['unbound']['incoming_num_tcp'])) ? $config['unbound']['incoming_num_tcp'] : "10";
+ $edns_buffer_size = (!empty($config['unbound']['edns_buffer_size'])) ? $config['unbound']['edns_buffer_size'] : "4096";
+ $num_queries_per_thread = (!empty($config['unbound']['num_queries_per_thread'])) ? $config['unbound']['num_queries_per_thread'] : "4096";
+ $jostle_timeout = (!empty($config['unbound']['jostle_timeout'])) ? $config['unbound']['jostle_timeout'] : "200";
+ $cache_max_ttl = (!empty($config['unbound']['cache_max_ttl'])) ? $config['unbound']['cache_max_ttl'] : "86400";
+ $cache_min_ttl = (!empty($config['unbound']['cache_min_ttl'])) ? $config['unbound']['cache_min_ttl'] : "0";
+ $infra_host_ttl = (!empty($config['unbound']['infra_host_ttl'])) ? $config['unbound']['infra_host_ttl'] : "900";
+ $infra_cache_numhosts = (!empty($config['unbound']['infra_cache_numhosts'])) ? $config['unbound']['infra_cache_numhosts'] : "10000";
+ $unwanted_reply_threshold = (!empty($config['unbound']['unwanted_reply_threshold'])) ? $config['unbound']['unwanted_reply_threshold'] : "0";
+ if ($unwanted_reply_threshold == "disabled") {
+ $unwanted_reply_threshold = "0";
+ }
+ $msg_cache_size = (!empty($config['unbound']['msgcachesize'])) ? $config['unbound']['msgcachesize'] : "4";
+ $verbosity = isset($config['unbound']['log_verbosity']) ? $config['unbound']['log_verbosity'] : 1;
+ $use_caps = isset($config['unbound']['use_caps']) ? "yes" : "no";
+
+ // Set up forwarding if it is configured
+ if (isset($config['unbound']['forwarding'])) {
+ $dnsservers = array();
+ if (isset($config['system']['dnsallowoverride'])) {
+ $ns = array_unique(get_nameservers());
+ foreach ($ns as $nameserver) {
+ if ($nameserver) {
+ $dnsservers[] = $nameserver;
+ }
+ }
+ } else {
+ $ns = array();
+ }
+ $sys_dnsservers = array_unique(get_dns_servers());
+ foreach ($sys_dnsservers as $sys_dnsserver) {
+ if ($sys_dnsserver && (!in_array($sys_dnsserver, $ns))) {
+ $dnsservers[] = $sys_dnsserver;
+ }
+ }
+
+ if (!empty($dnsservers)) {
+ $forward_conf .=<<<EOD
+# Forwarding
+forward-zone:
+ name: "."
+
+EOD;
+ foreach ($dnsservers as $dnsserver) {
+ $forward_conf .= "\tforward-addr: $dnsserver\n";
+ }
+ }
+ } else {
+ $forward_conf = "";
+ }
+
+ // Size of the RRset cache == 2 * msg-cache-size per Unbound's recommendations
+ $rrset_cache_size = $msg_cache_size * 2;
+
+ $unboundconf = <<<EOD
+##########################
+# Unbound Configuration
+##########################
+
+##
+# Server configuration
+##
+server:
+{$reverse_zones}
+chroot: {$g['unbound_chroot_path']}
+username: "unbound"
+directory: "{$g['unbound_chroot_path']}"
+pidfile: "/var/run/unbound.pid"
+use-syslog: yes
+port: {$port}
+verbosity: {$verbosity}
+hide-identity: {$hide_identity}
+hide-version: {$hide_version}
+harden-glue: yes
+do-ip4: yes
+do-ip6: yes
+do-udp: yes
+do-tcp: yes
+do-daemonize: yes
+module-config: "{$module_config}"
+unwanted-reply-threshold: {$unwanted_reply_threshold}
+num-queries-per-thread: {$num_queries_per_thread}
+jostle-timeout: {$jostle_timeout}
+infra-host-ttl: {$infra_host_ttl}
+infra-cache-numhosts: {$infra_cache_numhosts}
+outgoing-num-tcp: {$outgoing_num_tcp}
+incoming-num-tcp: {$incoming_num_tcp}
+edns-buffer-size: {$edns_buffer_size}
+cache-max-ttl: {$cache_max_ttl}
+cache-min-ttl: {$cache_min_ttl}
+harden-dnssec-stripped: {$harden_dnssec_stripped}
+msg-cache-size: {$msg_cache_size}m
+rrset-cache-size: {$rrset_cache_size}m
+
+{$optimization['number_threads']}
+{$optimization['msg_cache_slabs']}
+{$optimization['rrset_cache_slabs']}
+{$optimization['infra_cache_slabs']}
+{$optimization['key_cache_slabs']}
+outgoing-range: 4096
+{$optimization['so_rcvbuf']}
+{$anchor_file}
+prefetch: {$prefetch}
+prefetch-key: {$prefetch_key}
+use-caps-for-id: {$use_caps}
+# Statistics
+{$statistics}
+# Interface IP(s) to bind to
+{$bindints}
+{$outgoingints}
+
+# DNS Rebinding
+{$private_addr}
+{$private_domains}
+
+# Access lists
+include: {$g['unbound_chroot_path']}/access_lists.conf
+
+# Static host entries
+include: {$g['unbound_chroot_path']}/host_entries.conf
+
+# dhcp lease entries
+include: {$g['unbound_chroot_path']}/dhcpleases_entries.conf
+
+# Domain overrides
+include: {$g['unbound_chroot_path']}/domainoverrides.conf
+{$forward_conf}
+
+{$custom_options}
+
+###
+# Remote Control Config
+###
+include: {$g['unbound_chroot_path']}/remotecontrol.conf
+
+EOD;
+
+ create_unbound_chroot_path();
+ file_put_contents("{$g['unbound_chroot_path']}/unbound.conf", $unboundconf);
+
+ return 0;
+}
+
+function unbound_remote_control_setup() {
+ global $g;
+
+ if (!file_exists("{$g['unbound_chroot_path']}/remotecontrol.conf") || !file_exists("{$g['unbound_chroot_path']}/unbound_control.key")) {
+ $remotcfg = <<<EOF
+remote-control:
+ control-enable: yes
+ control-interface: 127.0.0.1
+ control-port: 953
+ server-key-file: "{$g['unbound_chroot_path']}/unbound_server.key"
+ server-cert-file: "{$g['unbound_chroot_path']}/unbound_server.pem"
+ control-key-file: "{$g['unbound_chroot_path']}/unbound_control.key"
+ control-cert-file: "{$g['unbound_chroot_path']}/unbound_control.pem"
+
+EOF;
+
+ create_unbound_chroot_path();
+ file_put_contents("{$g['unbound_chroot_path']}/remotecontrol.conf", $remotcfg);
+
+ // Generate our keys
+ do_as_unbound_user("unbound-control-setup");
+
+ }
+}
+
+// Read /etc/hosts
+function read_hosts() {
+
+ /* Open /etc/hosts and extract the only dhcpleases info
+ * XXX - to convert to an unbound C library which reads /etc/hosts automatically
+ */
+ $etc_hosts = array();
+ foreach (file('/etc/hosts') as $line) {
+ if (strpos($line, "dhcpleases automatically entered")) {
+ break;
+ }
+ $d = preg_split('/\s+/', $line, -1, PREG_SPLIT_NO_EMPTY);
+ if (empty($d) || substr(reset($d), 0, 1) == "#") {
+ continue;
+ }
+ $ip = array_shift($d);
+ $fqdn = array_shift($d);
+ $name = array_shift($d);
+ if (!empty($fqdn) && $fqdn != "empty") {
+ if (!empty($name) && $name != "empty") {
+ array_push($etc_hosts, array(ipaddr => "$ip", fqdn => "$fqdn", name => "$name"));
+ } else {
+ array_push($etc_hosts, array(ipaddr => "$ip", fqdn => "$fqdn"));
+ }
+ }
+ }
+ return $etc_hosts;
+}
+
+function sync_unbound_service() {
+ global $config, $g;
+
+ create_unbound_chroot_path();
+
+ // Configure our Unbound service
+ do_as_unbound_user("unbound-anchor");
+ unbound_remote_control_setup();
+ unbound_generate_config();
+ do_as_unbound_user("start");
+ require_once("service-utils.inc");
+ if (is_service_running("unbound")) {
+ do_as_unbound_user("restore_cache");
+ }
+
+}
+
+function unbound_acl_id_used($id) {
+ global $config;
+
+ if (is_array($config['unbound']['acls'])) {
+ foreach ($config['unbound']['acls'] as & $acls) {
+ if ($id == $acls['aclid']) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+function unbound_get_next_id() {
+ $aclid = 0;
+ while (unbound_acl_id_used($aclid)) {
+ $aclid++;
+ }
+ return $aclid;
+}
+
+// Execute commands as the user unbound
+function do_as_unbound_user($cmd) {
+ global $g;
+
+ switch ($cmd) {
+ case "start":
+ mwexec("/usr/local/sbin/unbound -c {$g['unbound_chroot_path']}/unbound.conf");
+ break;
+ case "stop":
+ mwexec("echo '/usr/local/sbin/unbound-control stop' | /usr/bin/su -m unbound", true);
+ break;
+ case "reload":
+ mwexec("echo '/usr/local/sbin/unbound-control reload' | /usr/bin/su -m unbound", true);
+ break;
+ case "unbound-anchor":
+ mwexec("echo '/usr/local/sbin/unbound-anchor -a {$g['unbound_chroot_path']}/root.key' | /usr/bin/su -m unbound", true);
+ break;
+ case "unbound-control-setup":
+ mwexec("echo '/usr/local/sbin/unbound-control-setup -d {$g['unbound_chroot_path']}' | /usr/bin/su -m unbound", true);
+ break;
+ default:
+ break;
+ }
+}
+
+function unbound_add_domain_overrides($pvt_rev="") {
+ global $config, $g;
+
+ $domains = $config['unbound']['domainoverrides'];
+
+ $sorted_domains = msort($domains, "domain");
+ $result = array();
+ foreach ($sorted_domains as $domain) {
+ $domain_key = current($domain);
+ if (!isset($result[$domain_key])) {
+ $result[$domain_key] = array();
+ }
+ $result[$domain_key][] = $domain['ip'];
+ }
+
+ // Domain overrides that have multiple entries need multiple stub-addr: added
+ $domain_entries = "";
+ foreach ($result as $domain=>$ips) {
+ if ($pvt_rev == "private") {
+ $domain_entries .= "private-domain: \"$domain\"\n";
+ $domain_entries .= "domain-insecure: \"$domain\"\n";
+ } else if ($pvt_rev == "reverse") {
+ if ((substr($domain, -14) == ".in-addr.arpa.") || (substr($domain, -13) == ".in-addr.arpa")) {
+ $domain_entries .= "local-zone: \"$domain\" typetransparent\n";
+ }
+ } else {
+ $domain_entries .= "stub-zone:\n";
+ $domain_entries .= "\tname: \"$domain\"\n";
+ foreach ($ips as $ip) {
+ $domain_entries .= "\tstub-addr: $ip\n";
+ }
+ $domain_entries .= "\tstub-prime: no\n";
+ }
+ }
+
+ if ($pvt_rev != "") {
+ return $domain_entries;
+ } else {
+ create_unbound_chroot_path();
+ file_put_contents("{$g['unbound_chroot_path']}/domainoverrides.conf", $domain_entries);
+ }
+}
+
+function unbound_add_host_entries() {
+ global $config, $g;
+
+ $unbound_entries = "local-zone: \"{$config['system']['domain']}\" transparent\n";
+
+ $hosts = read_hosts();
+ $added_ptr = array();
+ foreach ($hosts as $host) {
+ if (is_ipaddrv4($host['ipaddr'])) {
+ $type = 'A';
+ } else if (is_ipaddrv6($host['ipaddr'])) {
+ $type = 'AAAA';
+ } else {
+ continue;
+ }
+
+ if (!$added_ptr[$host['ipaddr']]) {
+ $unbound_entries .= "local-data-ptr: \"{$host['ipaddr']} {$host['fqdn']}\"\n";
+ $added_ptr[$host['ipaddr']] = true;
+ }
+ $unbound_entries .= "local-data: \"{$host['fqdn']} {$type} {$host['ipaddr']}\"\n";
+ if (isset($host['name'])) {
+ $unbound_entries .= "local-data: \"{$host['name']} {$type} {$host['ipaddr']}\"\n";
+ }
+ }
+
+ // Write out entries
+ create_unbound_chroot_path();
+ file_put_contents("{$g['unbound_chroot_path']}/host_entries.conf", $unbound_entries);
+
+ /* dhcpleases will write to this config file, make sure it exists */
+ @touch("{$g['unbound_chroot_path']}/dhcpleases_entries.conf");
+}
+
+function unbound_control($action) {
+ global $config, $g;
+
+ $cache_dumpfile = "/var/tmp/unbound_cache";
+
+ switch ($action) {
+ case "start":
+ // Start Unbound
+ if ($config['unbound']['enable'] == "on") {
+ if (!is_service_running("unbound")) {
+ do_as_unbound_user("start");
+ }
+ }
+ break;
+ case "stop":
+ if ($config['unbound']['enable'] == "on") {
+ do_as_unbound_user("stop");
+ }
+ break;
+ case "reload":
+ if ($config['unbound']['enable'] == "on") {
+ do_as_unbound_user("reload");
+ }
+ break;
+ case "dump_cache":
+ // Dump Unbound's Cache
+ if ($config['unbound']['dumpcache'] == "on") {
+ do_as_unbound_user("dump_cache");
+ }
+ break;
+ case "restore_cache":
+ // Restore Unbound's Cache
+ if ((is_service_running("unbound")) && ($config['unbound']['dumpcache'] == "on")) {
+ if (file_exists($cache_dumpfile) && filesize($cache_dumpfile) > 0) {
+ do_as_unbound_user("load_cache < /var/tmp/unbound_cache");
+ }
+ }
+ break;
+ default:
+ break;
+
+ }
+}
+
+// Generation of Unbound statistics
+function unbound_statistics() {
+ global $config;
+
+ if ($config['stats'] == "on") {
+ $stats_interval = $config['unbound']['stats_interval'];
+ $cumulative_stats = $config['cumulative_stats'];
+ if ($config['extended_stats'] == "on") {
+ $extended_stats = "yes";
+ } else {
+ $extended_stats = "no";
+ }
+ } else {
+ $stats_interval = "0";
+ $cumulative_stats = "no";
+ $extended_stats = "no";
+ }
+ /* XXX To do - add RRD graphs */
+ $stats = <<<EOF
+# Unbound Statistics
+statistics-interval: {$stats_interval}
+extended-statistics: yes
+statistics-cumulative: yes
+
+EOF;
+
+ return $stats;
+}
+
+// Unbound Access lists
+function unbound_acls_config() {
+ global $g, $config;
+
+ if (!isset($config['unbound']['disable_auto_added_access_control'])) {
+ $aclcfg = "access-control: 127.0.0.1/32 allow\n";
+ $aclcfg .= "access-control: ::1 allow\n";
+ // Add our networks for active interfaces including localhost
+ if (!empty($config['unbound']['active_interface'])) {
+ $active_interfaces = array_flip(explode(",", $config['unbound']['active_interface']));
+ if (in_array("all", $active_interfaces)) {
+ $active_interfaces = get_configured_interface_with_descr();
+ }
+ } else {
+ $active_interfaces = get_configured_interface_with_descr();
+ }
+
+ $bindints = "";
+ foreach ($active_interfaces as $ubif => $ifdesc) {
+ $ifip = get_interface_ip($ubif);
+ if (is_ipaddrv4($ifip)) {
+ // IPv4 is handled via NAT networks below
+ }
+ $ifip = get_interface_ipv6($ubif);
+ if (is_ipaddrv6($ifip)) {
+ if (!is_linklocal($ifip)) {
+ $subnet_bits = get_interface_subnetv6($ubif);
+ $subnet_ip = gen_subnetv6($ifip, $subnet_bits);
+ // only add LAN-type interfaces
+ if (!interface_has_gateway($ubif)) {
+ $aclcfg .= "access-control: {$subnet_ip}/{$subnet_bits} allow\n";
+ }
+ }
+ // add for IPv6 static routes to local networks
+ // for safety, we include only routes reachable on an interface with no
+ // gateway specified - read: not an Internet connection.
+ $static_routes = get_staticroutes();
+ foreach ($static_routes as $route) {
+ if ((lookup_gateway_interface_by_name($route['gateway']) == $ubif) && !interface_has_gateway($ubif)) {
+ // route is on this interface, interface doesn't have gateway, add it
+ $aclcfg .= "access-control: {$route['network']} allow\n";
+ }
+ }
+ }
+ }
+
+ // Generate IPv4 access-control entries using the same logic as automatic outbound NAT
+ if (empty($FilterIflist)) {
+ filter_generate_optcfg_array();
+ }
+ $natnetworks_array = array();
+ $natnetworks_array = filter_nat_rules_automatic_tonathosts();
+ foreach ($natnetworks_array as $allowednet) {
+ $aclcfg .= "access-control: $allowednet allow \n";
+ }
+ }
+
+ // Configure the custom ACLs
+ if (is_array($config['unbound']['acls'])) {
+ foreach ($config['unbound']['acls'] as $unbound_acl) {
+ $aclcfg .= "#{$unbound_acl['aclname']}\n";
+ foreach ($unbound_acl['row'] as $network) {
+ if ($unbound_acl['aclaction'] == "allow snoop") {
+ $unbound_acl['aclaction'] = "allow_snoop";
+ }
+ $aclcfg .= "access-control: {$network['acl_network']}/{$network['mask']} {$unbound_acl['aclaction']}\n";
+ }
+ }
+ }
+ // Write out Access list
+ create_unbound_chroot_path();
+ file_put_contents("{$g['unbound_chroot_path']}/access_lists.conf", $aclcfg);
+
+}
+
+// Generate hosts and reload services
+function unbound_hosts_generate() {
+ // Generate our hosts file
+ unbound_add_host_entries();
+
+ // Reload our service to read the updates
+ unbound_control("reload");
+}
+
+?>
diff --git a/src/etc/inc/upgrade_config.inc b/src/etc/inc/upgrade_config.inc
new file mode 100644
index 0000000..3f14248
--- /dev/null
+++ b/src/etc/inc/upgrade_config.inc
@@ -0,0 +1,3825 @@
+<?php
+/*
+ upgrade_config.inc
+ Copyright (C) 2004-2009 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/find /bin/cd /usr/local/bin/rrdtool /usr/bin/nice
+ pfSense_MODULE: config
+*/
+
+if (!function_exists("dump_rrd_to_xml")) {
+ require("rrd.inc");
+}
+
+/* Upgrade functions must be named:
+* upgrade_XXX_to_YYY
+ * where XXX == previous version, zero padded, and YYY == next version, zero padded
+ */
+function upgrade_010_to_011() {
+ global $config;
+ $opti = 1;
+ $ifmap = array('lan' => 'lan', 'wan' => 'wan', 'pptp' => 'pptp');
+
+ /* convert DMZ to optional, if necessary */
+ if (isset($config['interfaces']['dmz'])) {
+
+ $dmzcfg = &$config['interfaces']['dmz'];
+
+ if ($dmzcfg['if']) {
+ $config['interfaces']['opt' . $opti] = array();
+ $optcfg = &$config['interfaces']['opt' . $opti];
+
+ $optcfg['enable'] = $dmzcfg['enable'];
+ $optcfg['descr'] = "DMZ";
+ $optcfg['if'] = $dmzcfg['if'];
+ $optcfg['ipaddr'] = $dmzcfg['ipaddr'];
+ $optcfg['subnet'] = $dmzcfg['subnet'];
+
+ $ifmap['dmz'] = "opt" . $opti;
+ $opti++;
+ }
+
+ unset($config['interfaces']['dmz']);
+ }
+
+ /* convert WLAN1/2 to optional, if necessary */
+ for ($i = 1; isset($config['interfaces']['wlan' . $i]); $i++) {
+
+ if (!$config['interfaces']['wlan' . $i]['if']) {
+ unset($config['interfaces']['wlan' . $i]);
+ continue;
+ }
+
+ $wlancfg = &$config['interfaces']['wlan' . $i];
+ $config['interfaces']['opt' . $opti] = array();
+ $optcfg = &$config['interfaces']['opt' . $opti];
+
+ $optcfg['enable'] = $wlancfg['enable'];
+ $optcfg['descr'] = "WLAN" . $i;
+ $optcfg['if'] = $wlancfg['if'];
+ $optcfg['ipaddr'] = $wlancfg['ipaddr'];
+ $optcfg['subnet'] = $wlancfg['subnet'];
+ $optcfg['bridge'] = $wlancfg['bridge'];
+
+ $optcfg['wireless'] = array();
+ $optcfg['wireless']['mode'] = $wlancfg['mode'];
+ $optcfg['wireless']['ssid'] = $wlancfg['ssid'];
+ $optcfg['wireless']['channel'] = $wlancfg['channel'];
+ $optcfg['wireless']['wep'] = $wlancfg['wep'];
+
+ $ifmap['wlan' . $i] = "opt" . $opti;
+
+ unset($config['interfaces']['wlan' . $i]);
+ $opti++;
+ }
+
+ /* convert filter rules */
+ $n = count($config['filter']['rule']);
+ for ($i = 0; $i < $n; $i++) {
+
+ $fr = &$config['filter']['rule'][$i];
+
+ /* remap interface */
+ if (array_key_exists($fr['interface'], $ifmap)) {
+ $fr['interface'] = $ifmap[$fr['interface']];
+ } else {
+ /* remove the rule */
+ printf(gettext("%sWarning: filter rule removed " .
+ "(interface '%s' does not exist anymore)."), "\n", $fr['interface']);
+ unset($config['filter']['rule'][$i]);
+ continue;
+ }
+
+ /* remap source network */
+ if (isset($fr['source']['network'])) {
+ if (array_key_exists($fr['source']['network'], $ifmap)) {
+ $fr['source']['network'] = $ifmap[$fr['source']['network']];
+ } else {
+ /* remove the rule */
+ printf(gettext("%sWarning: filter rule removed " .
+ "(source network '%s' does not exist anymore)."), "\n", $fr['source']['network']);
+ unset($config['filter']['rule'][$i]);
+ continue;
+ }
+ }
+
+ /* remap destination network */
+ if (isset($fr['destination']['network'])) {
+ if (array_key_exists($fr['destination']['network'], $ifmap)) {
+ $fr['destination']['network'] = $ifmap[$fr['destination']['network']];
+ } else {
+ /* remove the rule */
+ printf(gettext("%sWarning: filter rule removed " .
+ "(destination network '%s' does not exist anymore)."), "\n", $fr['destination']['network']);
+ unset($config['filter']['rule'][$i]);
+ continue;
+ }
+ }
+ }
+
+ /* convert shaper rules */
+ $n = count($config['pfqueueing']['rule']);
+ if (is_array($config['pfqueueing']['rule'])) {
+ for ($i = 0; $i < $n; $i++) {
+
+ $fr = &$config['pfqueueing']['rule'][$i];
+
+ /* remap interface */
+ if (array_key_exists($fr['interface'], $ifmap)) {
+ $fr['interface'] = $ifmap[$fr['interface']];
+ } else {
+ /* remove the rule */
+ printf(gettext("%sWarning: traffic shaper rule removed " .
+ "(interface '%s' does not exist anymore)."), "\n", $fr['interface']);
+ unset($config['pfqueueing']['rule'][$i]);
+ continue;
+ }
+
+ /* remap source network */
+ if (isset($fr['source']['network'])) {
+ if (array_key_exists($fr['source']['network'], $ifmap)) {
+ $fr['source']['network'] = $ifmap[$fr['source']['network']];
+ } else {
+ /* remove the rule */
+ printf(gettext("%sWarning: traffic shaper rule removed " .
+ "(source network '%s' does not exist anymore)."), "\n", $fr['source']['network']);
+ unset($config['pfqueueing']['rule'][$i]);
+ continue;
+ }
+ }
+
+ /* remap destination network */
+ if (isset($fr['destination']['network'])) {
+ if (array_key_exists($fr['destination']['network'], $ifmap)) {
+ $fr['destination']['network'] = $ifmap[$fr['destination']['network']];
+ } else {
+ /* remove the rule */
+ printf(gettext("%sWarning: traffic shaper rule removed " .
+ "(destination network '%s' does not exist anymore)."), "\n", $fr['destination']['network']);
+ unset($config['pfqueueing']['rule'][$i]);
+ continue;
+ }
+ }
+ }
+ }
+}
+
+
+function upgrade_011_to_012() {
+ global $config;
+ /* move LAN DHCP server config */
+ $tmp = $config['dhcpd'];
+ $config['dhcpd'] = array();
+ $config['dhcpd']['lan'] = $tmp;
+
+ /* encrypt password */
+ $config['system']['password'] = crypt($config['system']['password']);
+}
+
+
+function upgrade_012_to_013() {
+ global $config;
+ /* convert advanced outbound NAT config */
+ for ($i = 0; isset($config['nat']['advancedoutbound']['rule'][$i]); $i++) {
+ $curent = &$config['nat']['advancedoutbound']['rule'][$i];
+ $src = $curent['source'];
+ $curent['source'] = array();
+ $curent['source']['network'] = $src;
+ $curent['destination'] = array();
+ $curent['destination']['any'] = true;
+ }
+
+ /* add an explicit type="pass" to all filter rules to make things consistent */
+ for ($i = 0; isset($config['filter']['rule'][$i]); $i++) {
+ $config['filter']['rule'][$i]['type'] = "pass";
+ }
+}
+
+
+function upgrade_013_to_014() {
+ global $config;
+ /* convert shaper rules (make pipes) */
+ if (is_array($config['pfqueueing']['rule'])) {
+ $config['pfqueueing']['pipe'] = array();
+
+ for ($i = 0; isset($config['pfqueueing']['rule'][$i]); $i++) {
+ $curent = &$config['pfqueueing']['rule'][$i];
+
+ /* make new pipe and associate with this rule */
+ $newpipe = array();
+ $newpipe['descr'] = $curent['descr'];
+ $newpipe['bandwidth'] = $curent['bandwidth'];
+ $newpipe['delay'] = $curent['delay'];
+ $newpipe['mask'] = $curent['mask'];
+ $config['pfqueueing']['pipe'][$i] = $newpipe;
+
+ $curent['targetpipe'] = $i;
+
+ unset($curent['bandwidth']);
+ unset($curent['delay']);
+ unset($curent['mask']);
+ }
+ }
+}
+
+
+function upgrade_014_to_015() {
+ global $config;
+ /* Default route moved */
+ if (isset($config['interfaces']['wan']['gateway'])) {
+ if ($config['interfaces']['wan']['gateway'] <> "") {
+ $config['system']['gateway'] = $config['interfaces']['wan']['gateway'];
+ }
+ }
+ unset($config['interfaces']['wan']['gateway']);
+
+ /* Queues are no longer interface specific */
+ if (isset($config['interfaces']['lan']['schedulertype'])) {
+ unset($config['interfaces']['lan']['schedulertype']);
+ }
+ if (isset($config['interfaces']['wan']['schedulertype'])) {
+ unset($config['interfaces']['wan']['schedulertype']);
+ }
+
+ for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) {
+ if (isset($config['interfaces']['opt' . $i]['schedulertype'])) {
+ unset($config['interfaces']['opt' . $i]['schedulertype']);
+ }
+ }
+}
+
+
+function upgrade_015_to_016() {
+ global $config;
+ /* Alternate firmware URL moved */
+ if (isset($config['system']['firmwareurl']) && isset($config['system']['firmwarename'])) { // Only convert if *both* are defined.
+ $config['system']['alt_firmware_url'] = array();
+ $config['system']['alt_firmware_url']['enabled'] = "";
+ $config['system']['alt_firmware_url']['firmware_base_url'] = $config['system']['firmwareurl'];
+ $config['system']['alt_firmware_url']['firmware_filename'] = $config['system']['firmwarename'];
+ unset($config['system']['firmwareurl'], $config['system']['firmwarename']);
+ } else {
+ unset($config['system']['firmwareurl'], $config['system']['firmwarename']);
+ }
+}
+
+
+function upgrade_016_to_017() {
+ global $config;
+ /* wipe previous shaper configuration */
+ unset($config['shaper']['queue']);
+ unset($config['shaper']['rule']);
+ unset($config['interfaces']['wan']['bandwidth']);
+ unset($config['interfaces']['wan']['bandwidthtype']);
+ unset($config['interfaces']['lan']['bandwidth']);
+ unset($config['interfaces']['lan']['bandwidthtype']);
+ $config['shaper']['enable'] = FALSE;
+}
+
+
+function upgrade_017_to_018() {
+ global $config;
+ if (isset($config['proxyarp']) && is_array($config['proxyarp']['proxyarpnet'])) {
+ $proxyarp = &$config['proxyarp']['proxyarpnet'];
+ foreach ($proxyarp as $arpent) {
+ $vip = array();
+ $vip['mode'] = "proxyarp";
+ $vip['interface'] = $arpent['interface'];
+ $vip['descr'] = $arpent['descr'];
+ if (isset($arpent['range'])) {
+ $vip['range'] = $arpent['range'];
+ $vip['type'] = "range";
+ } else {
+ $subnet = explode('/', $arpent['network']);
+ $vip['subnet'] = $subnet[0];
+ if (isset($subnet[1])) {
+ $vip['subnet_bits'] = $subnet[1];
+ $vip['type'] = "network";
+ } else {
+ $vip['subnet_bits'] = "32";
+ $vip['type'] = "single";
+ }
+ }
+ $config['virtualip']['vip'][] = $vip;
+ }
+ unset($config['proxyarp']);
+ }
+ if (isset($config['installedpackages']) && isset($config['installedpackages']['carp']) && is_array($config['installedpackages']['carp']['config'])) {
+ $carp = &$config['installedpackages']['carp']['config'];
+ foreach ($carp as $carpent) {
+ $vip = array();
+ $vip['mode'] = "carp";
+ $vip['interface'] = "AUTO";
+ $vip['descr'] = sprintf(gettext("CARP vhid %s"), $carpent['vhid']);
+ $vip['type'] = "single";
+ $vip['vhid'] = $carpent['vhid'];
+ $vip['advskew'] = $carpent['advskew'];
+ $vip['password'] = $carpent['password'];
+ $vip['subnet'] = $carpent['ipaddress'];
+ $vip['subnet_bits'] = $carpent['netmask'];
+ $config['virtualip']['vip'][] = $vip;
+ }
+ unset($config['installedpackages']['carp']);
+ }
+ /* Server NAT is no longer needed */
+ unset($config['nat']['servernat']);
+
+ /* enable SSH */
+ if ($config['version'] == "1.8") {
+ $config['system']['sshenabled'] = true;
+ }
+}
+
+
+function upgrade_018_to_019() {
+ global $config;
+ $config['theme']="metallic";
+}
+
+
+function upgrade_019_to_020() {
+ global $config;
+ if (is_array($config['ipsec']['tunnel'])) {
+ reset($config['ipsec']['tunnel']);
+ while (list($index, $tunnel) = each($config['ipsec']['tunnel'])) {
+ /* Sanity check on required variables */
+ /* This fixes bogus <tunnel> entries - remnant of bug #393 */
+ if (!isset($tunnel['local-subnet']) && !isset($tunnel['remote-subnet'])) {
+ unset($config['ipsec']['tunnel'][$tunnel]);
+ }
+ }
+ }
+}
+
+function upgrade_020_to_021() {
+ global $config;
+ /* shaper scheduler moved */
+ if (isset($config['system']['schedulertype'])) {
+ $config['shaper']['schedulertype'] = $config['system']['schedulertype'];
+ unset($config['system']['schedulertype']);
+ }
+}
+
+
+function upgrade_021_to_022() {
+ global $config;
+ /* move gateway to wan interface */
+ $config['interfaces']['wan']['gateway'] = $config['system']['gateway'];
+}
+
+function upgrade_022_to_023() {
+ global $config;
+ if (isset($config['shaper'])) {
+ /* wipe previous shaper configuration */
+ unset($config['shaper']);
+ }
+}
+
+
+function upgrade_023_to_024() {
+ global $config;
+}
+
+
+function upgrade_024_to_025() {
+ global $config;
+ $config['interfaces']['wan']['use_rrd_gateway'] = $config['system']['use_rrd_gateway'];
+ unset($config['system']['use_rrd_gateway']);
+}
+
+
+function upgrade_025_to_026() {
+ global $config;
+ $cron_item = array();
+ $cron_item['minute'] = "0";
+ $cron_item['hour'] = "*";
+ $cron_item['mday'] = "*";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/usr/bin/nice -n20 newsyslog";
+
+ $config['cron']['item'][] = $cron_item;
+
+ $cron_item = array();
+ $cron_item['minute'] = "1,31";
+ $cron_item['hour'] = "0-5";
+ $cron_item['mday'] = "*";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/usr/bin/nice -n20 adjkerntz -a";
+
+ $config['cron']['item'][] = $cron_item;
+
+ $cron_item = array();
+ $cron_item['minute'] = "1";
+ $cron_item['hour'] = "*";
+ $cron_item['mday'] = "1";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/usr/bin/nice -n20 /etc/rc.update_bogons.sh";
+
+ $config['cron']['item'][] = $cron_item;
+
+ $cron_item = array();
+ $cron_item['minute'] = "*/60";
+ $cron_item['hour'] = "*";
+ $cron_item['mday'] = "*";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/usr/bin/nice -n20 /usr/local/sbin/expiretable -v -t 3600 sshlockout";
+
+ $config['cron']['item'][] = $cron_item;
+
+ $cron_item = array();
+ $cron_item['minute'] = "1";
+ $cron_item['hour'] = "1";
+ $cron_item['mday'] = "*";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/usr/bin/nice -n20 /etc/rc.dyndns.update";
+
+ $config['cron']['item'][] = $cron_item;
+
+ $cron_item = array();
+ $cron_item['minute'] = "*/60";
+ $cron_item['hour'] = "*";
+ $cron_item['mday'] = "*";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/usr/bin/nice -n20 /usr/local/sbin/expiretable -v -t 3600 virusprot";
+
+ $config['cron']['item'][] = $cron_item;
+
+ $cron_item = array();
+ $cron_item['minute'] = "*/60";
+ $cron_item['hour'] = "*";
+ $cron_item['mday'] = "*";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/usr/bin/nice -n20 /usr/local/sbin/expiretable -t 1800 snort2c";
+
+ $config['cron']['item'][] = $cron_item;
+}
+
+
+function upgrade_026_to_027() {
+ global $config;
+}
+
+
+function upgrade_027_to_028() {
+ global $config;
+}
+
+
+function upgrade_028_to_029() {
+ global $config;
+ $rule_item = array();
+ $a_filter = &$config['filter']['rule'];
+ $rule_item['interface'] = "enc0";
+ $rule_item['type'] = "pass";
+ $rule_item['source']['any'] = true;
+ $rule_item['destination']['any'] = true;
+ $rule_item['descr'] = gettext("Permit IPsec traffic.");
+ $rule_item['statetype'] = "keep state";
+ $a_filter[] = $rule_item;
+}
+
+
+function upgrade_029_to_030() {
+ global $config;
+ /* enable the rrd config setting by default */
+ $config['rrd']['enable'] = true;
+}
+
+
+function upgrade_030_to_031() {
+ global $config;
+ /* Insert upgrade code here */
+}
+
+
+function upgrade_031_to_032() {
+ global $config;
+ /* Insert upgrade code here */
+}
+
+
+function upgrade_032_to_033() {
+ global $config;
+ /* Insert upgrade code here */
+}
+
+
+function upgrade_033_to_034() {
+ global $config;
+ /* Insert upgrade code here */
+}
+
+
+function upgrade_034_to_035() {
+ global $config;
+ /* Insert upgrade code here */
+}
+
+
+function upgrade_035_to_036() {
+ global $config;
+ /* Insert upgrade code here */
+}
+
+
+function upgrade_036_to_037() {
+ global $config;
+ /* Insert upgrade code here */
+}
+
+
+function upgrade_037_to_038() {
+ global $config;
+ /* Insert upgrade code here */
+}
+
+
+function upgrade_038_to_039() {
+ global $config;
+ /* Insert upgrade code here */
+}
+
+
+function upgrade_039_to_040() {
+ global $config, $g;
+ $config['system']['webgui']['auth_method'] = "session";
+ $config['system']['webgui']['backing_method'] = "htpasswd";
+
+ if (isset ($config['system']['username'])) {
+ $config['system']['group'] = array();
+ $config['system']['group'][0]['name'] = "admins";
+ $config['system']['group'][0]['description'] = gettext("System Administrators");
+ $config['system']['group'][0]['scope'] = "system";
+ $config['system']['group'][0]['priv'] = "page-all";
+ $config['system']['group'][0]['home'] = "index.php";
+ $config['system']['group'][0]['gid'] = "110";
+
+ $config['system']['user'] = array();
+ $config['system']['user'][0]['name'] = "{$config['system']['username']}";
+ $config['system']['user'][0]['descr'] = "System Administrator";
+ $config['system']['user'][0]['scope'] = "system";
+ $config['system']['user'][0]['groupname'] = "admins";
+ $config['system']['user'][0]['password'] = "{$config['system']['password']}";
+ $config['system']['user'][0]['uid'] = "0";
+ /* Ensure that we follow what this new "admin" username should be in the session. */
+ $_SESSION["Username"] = "{$config['system']['username']}";
+
+ $config['system']['user'][0]['priv'] = array();
+ $config['system']['user'][0]['priv'][0]['id'] = "lockwc";
+ $config['system']['user'][0]['priv'][0]['name'] = "Lock webConfigurator";
+ $config['system']['user'][0]['priv'][0]['descr'] = gettext("Indicates whether this user will lock access to the webConfigurator for other users.");
+ $config['system']['user'][0]['priv'][1]['id'] = "lock-ipages";
+ $config['system']['user'][0]['priv'][1]['name'] = "Lock individual pages";
+ $config['system']['user'][0]['priv'][1]['descr'] = gettext("Indicates whether this user will lock individual HTML pages after having accessed a particular page (the lock will be freed if the user leaves or saves the page form).");
+ $config['system']['user'][0]['priv'][2]['id'] = "hasshell";
+ $config['system']['user'][0]['priv'][2]['name'] = "Has shell access";
+ $config['system']['user'][0]['priv'][2]['descr'] = gettext("Indicates whether this user is able to login for example via SSH.");
+ $config['system']['user'][0]['priv'][3]['id'] = "copyfiles";
+ $config['system']['user'][0]['priv'][3]['name'] = "Is allowed to copy files";
+ $config['system']['user'][0]['priv'][3]['descr'] = sprintf(gettext("Indicates whether this user is allowed to copy files onto the %s appliance via SCP/SFTP. If you are going to use this privilege, you must install scponly on the appliance (Hint: pkg_add -r scponly)."), $g['product_name']);
+ $config['system']['user'][0]['priv'][4]['id'] = "isroot";
+ $config['system']['user'][0]['priv'][4]['name'] = "Is root user";
+ $config['system']['user'][0]['priv'][4]['descr'] = gettext("This user is associated with the UNIX root user (you should associate this privilege only with one single user).");
+
+ $config['system']['nextuid'] = "111";
+ $config['system']['nextgid'] = "111";
+
+ /* wipe previous auth configuration */
+ unset ($config['system']['username']);
+ unset ($config['system']['password']);
+ }
+}
+
+function upgrade_040_to_041() {
+ global $config;
+ if (!$config['sysctl']) {
+ $config['sysctl']['item'] = array();
+
+ $config['sysctl']['item'][0]['tunable'] = "net.inet.tcp.blackhole";
+ $config['sysctl']['item'][0]['descr'] = gettext("Drop packets to closed TCP ports without returning a RST");
+ $config['sysctl']['item'][0]['value'] = "default";
+
+ $config['sysctl']['item'][1]['tunable'] = "net.inet.udp.blackhole";
+ $config['sysctl']['item'][1]['descr'] = gettext("Do not send ICMP port unreachable messages for closed UDP ports");
+ $config['sysctl']['item'][1]['value'] = "default";
+
+ $config['sysctl']['item'][2]['tunable'] = "net.inet.ip.random_id";
+ $config['sysctl']['item'][2]['descr'] = gettext("Randomize the ID field in IP packets (default is 0: sequential IP IDs)");
+ $config['sysctl']['item'][2]['value'] = "default";
+
+ $config['sysctl']['item'][3]['tunable'] = "net.inet.tcp.drop_synfin";
+ $config['sysctl']['item'][3]['descr'] = gettext("Drop SYN-FIN packets (breaks RFC1379, but nobody uses it anyway)");
+ $config['sysctl']['item'][3]['value'] = "default";
+
+ $config['sysctl']['item'][4]['tunable'] = "net.inet.ip.redirect";
+ $config['sysctl']['item'][4]['descr'] = gettext("Sending of IPv4 ICMP redirects");
+ $config['sysctl']['item'][4]['value'] = "default";
+
+ $config['sysctl']['item'][5]['tunable'] = "net.inet6.ip6.redirect";
+ $config['sysctl']['item'][5]['descr'] = gettext("Sending of IPv6 ICMP redirects");
+ $config['sysctl']['item'][5]['value'] = "default";
+
+ $config['sysctl']['item'][6]['tunable'] = "net.inet.tcp.syncookies";
+ $config['sysctl']['item'][6]['descr'] = gettext("Generate SYN cookies for outbound SYN-ACK packets");
+ $config['sysctl']['item'][6]['value'] = "default";
+
+ $config['sysctl']['item'][7]['tunable'] = "net.inet.tcp.recvspace";
+ $config['sysctl']['item'][7]['descr'] = gettext("Maximum incoming TCP datagram size");
+ $config['sysctl']['item'][7]['value'] = "default";
+
+ $config['sysctl']['item'][8]['tunable'] = "net.inet.tcp.sendspace";
+ $config['sysctl']['item'][8]['descr'] = gettext("Maximum outgoing TCP datagram size");
+ $config['sysctl']['item'][8]['value'] = "default";
+
+ $config['sysctl']['item'][9]['tunable'] = "net.inet.ip.fastforwarding";
+ $config['sysctl']['item'][9]['descr'] = gettext("Fastforwarding (see http://lists.freebsd.org/pipermail/freebsd-net/2004-January/002534.html)");
+ $config['sysctl']['item'][9]['value'] = "default";
+
+ $config['sysctl']['item'][10]['tunable'] = "net.inet.tcp.delayed_ack";
+ $config['sysctl']['item'][10]['descr'] = gettext("Do not delay ACK to try and piggyback it onto a data packet");
+ $config['sysctl']['item'][10]['value'] = "default";
+
+ $config['sysctl']['item'][11]['tunable'] = "net.inet.udp.maxdgram";
+ $config['sysctl']['item'][11]['descr'] = gettext("Maximum outgoing UDP datagram size");
+ $config['sysctl']['item'][11]['value'] = "default";
+
+ $config['sysctl']['item'][12]['tunable'] = "net.link.bridge.pfil_onlyip";
+ $config['sysctl']['item'][12]['descr'] = gettext("Handling of non-IP packets which are not passed to pfil (see if_bridge(4))");
+ $config['sysctl']['item'][12]['value'] = "default";
+
+ $config['sysctl']['item'][13]['tunable'] = "net.link.tap.user_open";
+ $config['sysctl']['item'][13]['descr'] = gettext("Allow unprivileged access to tap(4) device nodes");
+ $config['sysctl']['item'][13]['value'] = "default";
+
+ $config['sysctl']['item'][15]['tunable'] = "kern.randompid";
+ $config['sysctl']['item'][15]['descr'] = gettext("Randomize PID's (see src/sys/kern/kern_fork.c: sysctl_kern_randompid())");
+ $config['sysctl']['item'][15]['value'] = "default";
+
+ $config['sysctl']['item'][16]['tunable'] = "net.inet.tcp.inflight.enable";
+ $config['sysctl']['item'][16]['descr'] = gettext("The system will attempt to calculate the bandwidth delay product for each connection and limit the amount of data queued to the network to just the amount required to maintain optimum throughput. ");
+ $config['sysctl']['item'][16]['value'] = "default";
+
+ $config['sysctl']['item'][17]['tunable'] = "net.inet.icmp.icmplim";
+ $config['sysctl']['item'][17]['descr'] = gettext("Set ICMP Limits");
+ $config['sysctl']['item'][17]['value'] = "default";
+
+ $config['sysctl']['item'][18]['tunable'] = "net.inet.tcp.tso";
+ $config['sysctl']['item'][18]['descr'] = gettext("TCP Offload engine");
+ $config['sysctl']['item'][18]['value'] = "default";
+
+ $config['sysctl']['item'][19]['tunable'] = "net.inet.ip.portrange.first";
+ $config['sysctl']['item'][19]['descr'] = "Set the ephemeral port range starting port";
+ $config['sysctl']['item'][19]['value'] = "default";
+
+ $config['sysctl']['item'][20]['tunable'] = "hw.syscons.kbd_reboot";
+ $config['sysctl']['item'][20]['descr'] = "Enables ctrl+alt+delete";
+ $config['sysctl']['item'][20]['value'] = "default";
+
+ $config['sysctl']['item'][21]['tunable'] = "kern.ipc.maxsockbuf";
+ $config['sysctl']['item'][21]['descr'] = "Maximum socket buffer size";
+ $config['sysctl']['item'][21]['value'] = "default";
+
+ }
+}
+
+
+function upgrade_041_to_042() {
+ global $config;
+ if (isset($config['shaper'])) {
+ unset($config['shaper']);
+ }
+ if (isset($config['ezshaper'])) {
+ unset($config['ezshaper']);
+ }
+}
+
+
+function upgrade_042_to_043() {
+ global $config;
+ /* migrate old interface gateway to the new gateways config */
+ $iflist = get_configured_interface_list(false, true);
+ $gateways = array();
+ $i = 0;
+ foreach ($iflist as $ifname => $interface) {
+ if (!interface_has_gateway($ifname)) {
+ continue;
+ }
+ $config['gateways']['gateway_item'][$i] = array();
+ if (is_ipaddr($config['interfaces'][$ifname]['gateway'])) {
+ $config['gateways']['gateway_item'][$i]['gateway'] = $config['interfaces'][$ifname]['gateway'];
+ $config['gateways']['gateway_item'][$i]['descr'] = sprintf(gettext("Interface %s Static Gateway"), $ifname);
+ } else {
+ $config['gateways']['gateway_item'][$i]['gateway'] = "dynamic";
+ $config['gateways']['gateway_item'][$i]['descr'] = sprintf(gettext("Interface %s Dynamic Gateway"), $ifname);
+ }
+ $config['gateways']['gateway_item'][$i]['interface'] = $ifname;
+ $config['gateways']['gateway_item'][$i]['name'] = "GW_" . strtoupper($ifname);
+ /* add default gateway bit for wan on upgrade */
+ if ($ifname == "wan") {
+ $config['gateways']['gateway_item'][$i]['defaultgw'] = true;
+ }
+ if (is_ipaddr($config['interfaces'][$ifname]['use_rrd_gateway'])) {
+ $config['gateways']['gateway_item'][$i]['monitor'] = $config['interfaces'][$ifname]['use_rrd_gateway'];
+ unset($config['interfaces'][$ifname]['use_rrd_gateway']);
+ }
+ $config['interfaces'][$ifname]['gateway'] = $config['gateways']['gateway_item'][$i]['name'];
+
+ /* Update all filter rules which might reference this gateway */
+ $j = 0;
+ foreach ($config['filter']['rule'] as $rule) {
+ if (is_ipaddr($rule['gateway'])) {
+ if ($rule['gateway'] == $config['gateways']['gateway_item'][$i]['gateway']) {
+ $config['filter']['rule'][$j]['gateway'] = $config['gateways']['gateway_item'][$i]['name'];
+ } else if ($rule['gateway'] == $ifname) {
+ $config['filter']['rule'][$j]['gateway'] = $config['gateways']['gateway_item'][$i]['name'];
+ }
+ }
+ $j++;
+ }
+
+ /* rename old Quality RRD files in the process */
+ $rrddbpath = "/var/db/rrd";
+ $gwname = "GW_" . strtoupper($ifname);
+ if (is_readable("{$rrddbpath}/{$ifname}-quality.rrd")) {
+ rename("{$rrddbpath}/{$ifname}-quality.rrd", "{$rrddbpath}/{$gwname}-quality.rrd");
+ }
+ $i++;
+ }
+}
+
+
+function upgrade_043_to_044() {
+ global $config;
+
+ /* migrate static routes to the new gateways config */
+ $gateways = return_gateways_array(true);
+ $i = 0;
+ if (is_array($config['staticroutes']['route'])) {
+ $gwmap = array();
+ foreach ($config['staticroutes']['route'] as $idx => $sroute) {
+ $found = false;
+ foreach ($gateways as $gwname => $gw) {
+ if ($gw['gateway'] == $sroute['gateway']) {
+ $config['staticroutes']['route'][$idx]['gateway'] = $gwname;
+ $found = true;
+ break;
+ }
+ }
+ if ($gwmap[$sroute['gateway']]) {
+ /* We already added a gateway name for this IP */
+ $config['staticroutes']['route'][$idx]['gateway'] = "{$gwmap[$sroute['gateway']]}";
+ $found = true;
+ }
+
+ if ($found == false) {
+ $gateway = array();
+ $gateway['name'] = "SROUTE{$i}";
+ $gwmap[$sroute['gateway']] = $gateway['name'];
+ $gateway['gateway'] = $sroute['gateway'];
+ $gateway['interface'] = $sroute['interface'];
+ $gateway['descr'] = sprintf(gettext("Upgraded static route for %s"), $sroute['network']);
+ if (!is_array($config['gateways']['gateway_item'])) {
+ $config['gateways']['gateway_item'] = array();
+ }
+ $config['gateways']['gateway_item'][] = $gateway;
+ $config['staticroutes']['route'][$idx]['gateway'] = $gateway['name'];
+ $i++;
+ }
+ }
+ }
+}
+
+
+function upgrade_044_to_045() {
+ global $config;
+ $iflist = get_configured_interface_list(false, true);
+ if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
+ $i = 0;
+ foreach ($config['vlans']['vlan'] as $id => $vlan) {
+ /* Make sure to update the interfaces section with the right name */
+ $vlan_name = "{$vlan['if']}_vlan{$vlan['tag']}";
+ foreach ($iflist as $ifname) {
+ if ($config['interfaces'][$ifname]['if'] == "vlan{$i}") {
+ $config['interfaces'][$ifname]['if'] = $vlan_name;
+ continue;
+ }
+ }
+ $config['vlans']['vlan'][$i]['vlanif'] = "{$vlan_name}";
+ $i++;
+ }
+ }
+}
+
+
+function upgrade_045_to_046() {
+ global $config;
+ /* Load up monitors that are in the default config for 2.0 but not in 1.2.3
+ thus wouldn't be in an upgraded config. */
+ $config['load_balancer']['monitor_type'] = array (
+ array ('name' => 'ICMP',
+ 'type' => 'icmp',
+ 'descr' => 'ICMP',
+ 'options' => '',
+ ),
+ array ('name' => 'TCP',
+ 'type' => 'tcp',
+ 'descr' => 'Generic TCP',
+ 'options' => '',
+ ),
+ array ('name' => 'HTTP',
+ 'type' => 'http',
+ 'descr' => 'Generic HTTP',
+ 'options' =>
+ array ('path' => '/',
+ 'host' => '',
+ 'code' => '200',
+ ),
+ ),
+ array ('name' => 'HTTPS',
+ 'type' => 'https',
+ 'descr' => 'Generic HTTPS',
+ 'options' =>
+ array ('path' => '/',
+ 'host' => '',
+ 'code' => '200',
+ ),
+ ),
+ array ('name' => 'SMTP',
+ 'type' => 'send',
+ 'descr' => 'Generic SMTP',
+ 'options' =>
+ array ('send' => '',
+ 'expect' => '220 *',
+ ),
+ ),
+ );
+ /* Upgrade load balancer from slb to relayd */
+ if (is_array($config['load_balancer']['virtual_server']) && count($config['load_balancer']['virtual_server'])) {
+ $vs_a = &$config['load_balancer']['virtual_server'];
+ $pool_a = &$config['load_balancer']['lbpool'];
+ $pools = array();
+ /* Index pools by name */
+ if (is_array($pool_a)) {
+ for ($i = 0; isset($pool_a[$i]); $i++) {
+ if ($pool_a[$i]['type'] == "server") {
+ $pools[$pool_a[$i]['name']] = $pool_a[$i];
+ }
+ }
+ }
+ /* Convert sitedown entries to pools and re-attach */
+ for ($i = 0; isset($vs_a[$i]); $i++) {
+ /* Set mode while we're here. */
+ $vs_a[$i]['mode'] = "redirect_mode";
+ if (isset($vs_a[$i]['sitedown'])) {
+ $pool = array();
+ $pool['type'] = 'server';
+ $pool['behaviour'] = 'balance';
+ $pool['name'] = "{$vs_a[$i]['name']}-sitedown";
+ $pool['descr'] = sprintf(gettext("Sitedown pool for VS: %s"), $vs_a[$i]['name']);
+ if (is_array($vs_a[$i]['pool'])) {
+ $vs_a[$i]['pool'] = $vs_a[$i]['pool'][0];
+ }
+ $pool['port'] = $pools[$vs_a[$i]['pool']]['port'];
+ $pool['servers'] = array();
+ $pool['servers'][] = $vs_a[$i]['sitedown'];
+ $pool['monitor'] = $pools[$vs_a[$i]['pool']]['monitor'];
+ $pool_a[] = $pool;
+ $vs_a[$i]['sitedown'] = $pool['name'];
+ }
+ }
+ }
+ if (count($config['load_balancer']) == 0) {
+ unset($config['load_balancer']);
+ }
+ mwexec('/usr/sbin/pw groupadd -n _relayd -g 913');
+ mwexec('/usr/sbin/pw useradd -n _relayd -c "Relay Daemon" -d /var/empty -s /usr/sbin/nologin -u 913 -g 913');
+}
+
+
+function upgrade_046_to_047() {
+ global $config;
+ /* Upgrade IPsec from tunnel to phase1/phase2 */
+
+ if (is_array($config['ipsec']['tunnel'])) {
+
+ $a_phase1 = array();
+ $a_phase2 = array();
+ $ikeid = 0;
+
+ foreach ($config['ipsec']['tunnel'] as $tunnel) {
+
+ unset($ph1ent);
+ unset($ph2ent);
+
+ /*
+ * attempt to locate an enabled phase1
+ * entry that matches the peer gateway
+ */
+
+ if (!isset($tunnel['disabled'])) {
+
+ $remote_gateway = $tunnel['remote-gateway'];
+
+ foreach ($a_phase1 as $ph1tmp) {
+ if ($ph1tmp['remote-gateway'] == $remote_gateway) {
+ $ph1ent = $ph1tmp;
+ break;
+ }
+ }
+ }
+
+ /* none found, create a new one */
+
+ if (!isset($ph1ent)) {
+
+ /* build new phase1 entry */
+
+ $ph1ent = array();
+
+ $ph1ent['ikeid'] = ++$ikeid;
+
+ if (isset($tunnel['disabled'])) {
+ $ph1ent['disabled'] = $tunnel['disabled'];
+ }
+
+ /* convert to the new vip[$vhid] name */
+ if (preg_match("/^carp/", $tunnel['interface'])) {
+ $carpid = str_replace("carp", "", $tunnel['interface']);
+ $tunnel['interface'] = "vip" . $config['virtualip']['vip'][$carpid]['vhid'];
+ }
+ $ph1ent['interface'] = $tunnel['interface'];
+ $ph1ent['remote-gateway'] = $tunnel['remote-gateway'];
+ $ph1ent['descr'] = $tunnel['descr'];
+
+ $ph1ent['mode'] = $tunnel['p1']['mode'];
+
+ if (isset($tunnel['p1']['myident']['myaddress'])) {
+ $ph1ent['myid_type'] = "myaddress";
+ }
+ if (isset($tunnel['p1']['myident']['address'])) {
+ $ph1ent['myid_type'] = "address";
+ $ph1ent['myid_data'] = $tunnel['p1']['myident']['address'];
+ }
+ if (isset($tunnel['p1']['myident']['fqdn'])) {
+ $ph1ent['myid_type'] = "fqdn";
+ $ph1ent['myid_data'] = $tunnel['p1']['myident']['fqdn'];
+ }
+ if (isset($tunnel['p1']['myident']['ufqdn'])) {
+ $ph1ent['myid_type'] = "user_fqdn";
+ $ph1ent['myid_data'] = $tunnel['p1']['myident']['ufqdn'];
+ }
+ if (isset($tunnel['p1']['myident']['asn1dn'])) {
+ $ph1ent['myid_type'] = "asn1dn";
+ $ph1ent['myid_data'] = $tunnel['p1']['myident']['asn1dn'];
+ }
+ if (isset($tunnel['p1']['myident']['dyn_dns'])) {
+ $ph1ent['myid_type'] = "dyn_dns";
+ $ph1ent['myid_data'] = $tunnel['p1']['myident']['dyn_dns'];
+ }
+
+ $ph1ent['peerid_type'] = "peeraddress";
+
+ switch ($tunnel['p1']['encryption-algorithm']) {
+ case "des":
+ $ph1alg = array('name' => 'des');
+ break;
+ case "3des":
+ $ph1alg = array('name' => '3des');
+ break;
+ case "blowfish":
+ $ph1alg = array('name' => 'blowfish', 'keylen' => '128');
+ break;
+ case "cast128":
+ $ph1alg = array('name' => 'cast128');
+ break;
+ case "rijndael":
+ $ph1alg = array('name' => 'aes', 'keylen' => '128');
+ break;
+ case "rijndael 256":
+ case "aes 256":
+ $ph1alg = array('name' => 'aes', 'keylen' => '256');
+ break;
+ }
+
+ $ph1ent['encryption-algorithm'] = $ph1alg;
+ $ph1ent['hash-algorithm'] = $tunnel['p1']['hash-algorithm'];
+ $ph1ent['dhgroup'] = $tunnel['p1']['dhgroup'];
+ $ph1ent['lifetime'] = $tunnel['p1']['lifetime'];
+ $ph1ent['authentication_method'] = $tunnel['p1']['authentication_method'];
+
+ if (isset($tunnel['p1']['pre-shared-key'])) {
+ $ph1ent['pre-shared-key'] = $tunnel['p1']['pre-shared-key'];
+ }
+ if (isset($tunnel['p1']['cert'])) {
+ $ph1ent['cert'] = $tunnel['p1']['cert'];
+ }
+ if (isset($tunnel['p1']['peercert'])) {
+ $ph1ent['peercert'] = $tunnel['p1']['peercert'];
+ }
+ if (isset($tunnel['p1']['private-key'])) {
+ $ph1ent['private-key'] = $tunnel['p1']['private-key'];
+ }
+
+ $ph1ent['nat_traversal'] = "on";
+ $ph1ent['dpd_enable'] = 1;
+ $ph1ent['dpd_delay'] = 10;
+ $ph1ent['dpd_maxfail'] = 5;
+
+ $a_phase1[] = $ph1ent;
+ }
+
+ /* build new phase2 entry */
+
+ $ph2ent = array();
+
+ $ph2ent['ikeid'] = $ph1ent['ikeid'];
+
+ if (isset($tunnel['disabled'])) {
+ $ph1ent['disabled'] = $tunnel['disabled'];
+ }
+
+ $ph2ent['descr'] = sprintf(gettext("phase2 for %s"), $tunnel['descr']);
+
+ $type = "lan";
+ if ($tunnel['local-subnet']['network']) {
+ $type = $tunnel['local-subnet']['network'];
+ }
+ if ($tunnel['local-subnet']['address']) {
+ list($address, $netbits) = explode("/", $tunnel['local-subnet']['address']);
+ if (is_null($netbits)) {
+ $type = "address";
+ } else {
+ $type = "network";
+ }
+ }
+
+ switch ($type) {
+ case "address":
+ $ph2ent['localid'] = array('type' => $type, 'address' => $address);
+ break;
+ case "network":
+ $ph2ent['localid'] = array('type' => $type, 'address' => $address, 'netbits' => $netbits);
+ break;
+ default:
+ $ph2ent['localid'] = array('type' => $type);
+ break;
+ }
+
+ list($address, $netbits) = explode("/", $tunnel['remote-subnet']);
+ $ph2ent['remoteid'] = array('type' => 'network', 'address' => $address, 'netbits' => $netbits);
+
+ $ph2ent['protocol'] = $tunnel['p2']['protocol'];
+
+ $aes_count = 0;
+ foreach ($tunnel['p2']['encryption-algorithm-option'] as $tunalg) {
+ $aes_found = false;
+ switch ($tunalg) {
+ case "des":
+ $ph2alg = array('name' => 'des');
+ break;
+ case "3des":
+ $ph2alg = array('name' => '3des');
+ break;
+ case "blowfish":
+ $ph2alg = array('name' => 'blowfish', 'keylen' => 'auto');
+ break;
+ case "cast128":
+ $ph2alg = array('name' => 'cast128');
+ break;
+ case "rijndael":
+ case "rijndael 256":
+ case "aes 256":
+ $ph2alg = array('name' => 'aes', 'keylen' => 'auto');
+ $aes_found = true;
+ $aes_count++;
+ break;
+ }
+
+ if (!$aes_found || ($aes_count < 2)) {
+ $ph2ent['encryption-algorithm-option'][] = $ph2alg;
+ }
+ }
+
+ $ph2ent['hash-algorithm-option'] = $tunnel['p2']['hash-algorithm-option'];
+ $ph2ent['pfsgroup'] = $tunnel['p2']['pfsgroup'];
+ $ph2ent['lifetime'] = $tunnel['p2']['lifetime'];
+
+ if (isset($tunnel['pinghost']['pinghost'])) {
+ $ph2ent['pinghost'] = $tunnel['pinghost'];
+ }
+
+ $a_phase2[] = $ph2ent;
+ }
+
+ unset($config['ipsec']['tunnel']);
+ $config['ipsec']['phase1'] = $a_phase1;
+ $config['ipsec']['phase2'] = $a_phase2;
+ }
+
+ /* Upgrade Mobile IPsec */
+ if (isset($config['ipsec']['mobileclients']) &&
+ is_array($config['ipsec']['mobileclients']) &&
+ is_array($config['ipsec']['mobileclients']['p1']) &&
+ is_array($config['ipsec']['mobileclients']['p2'])) {
+
+ if (isset($config['ipsec']['mobileclients']['enable'])) {
+ $config['ipsec']['client']['enable'] = true;
+ $config['ipsec']['client']['user_source'] = 'system';
+ $config['ipsec']['client']['group_source'] = 'system';
+ }
+
+ $mobilecfg = $config['ipsec']['mobileclients'];
+
+ $ph1ent = array();
+ $ph1ent['ikeid'] = ++$ikeid;
+
+ if (!isset($mobilecfg['enable'])) {
+ $ph1ent['disabled'] = true;
+ }
+
+ /* Assume WAN since mobile tunnels couldn't be on a separate interface on 1.2.x */
+ $ph1ent['interface'] = 'wan';
+ $ph1ent['descr'] = "Mobile Clients (upgraded)";
+ $ph1ent['mode'] = $mobilecfg['p1']['mode'];
+
+ if (isset($mobilecfg['p1']['myident']['myaddress'])) {
+ $ph1ent['myid_type'] = "myaddress";
+ }
+ if (isset($mobilecfg['p1']['myident']['address'])) {
+ $ph1ent['myid_type'] = "address";
+ $ph1ent['myid_data'] = $mobilecfg['p1']['myident']['address'];
+ }
+ if (isset($mobilecfg['p1']['myident']['fqdn'])) {
+ $ph1ent['myid_type'] = "fqdn";
+ $ph1ent['myid_data'] = $mobilecfg['p1']['myident']['fqdn'];
+ }
+ if (isset($mobilecfg['p1']['myident']['ufqdn'])) {
+ $ph1ent['myid_type'] = "user_fqdn";
+ $ph1ent['myid_data'] = $mobilecfg['p1']['myident']['ufqdn'];
+ }
+ if (isset($mobilecfg['p1']['myident']['asn1dn'])) {
+ $ph1ent['myid_type'] = "asn1dn";
+ $ph1ent['myid_data'] = $mobilecfg['p1']['myident']['asn1dn'];
+ }
+ if (isset($mobilecfg['p1']['myident']['dyn_dns'])) {
+ $ph1ent['myid_type'] = "dyn_dns";
+ $ph1ent['myid_data'] = $mobilecfg['p1']['myident']['dyn_dns'];
+ }
+ $ph1ent['peerid_type'] = "fqdn";
+ $ph1ent['peerid_data'] = "";
+
+ switch ($mobilecfg['p1']['encryption-algorithm']) {
+ case "des":
+ $ph1alg = array('name' => 'des');
+ break;
+ case "3des":
+ $ph1alg = array('name' => '3des');
+ break;
+ case "blowfish":
+ $ph1alg = array('name' => 'blowfish', 'keylen' => '128');
+ break;
+ case "cast128":
+ $ph1alg = array('name' => 'cast128');
+ break;
+ case "rijndael":
+ $ph1alg = array('name' => 'aes', 'keylen' => '128');
+ break;
+ case "rijndael 256":
+ case "aes 256":
+ $ph1alg = array('name' => 'aes', 'keylen' => '256');
+ break;
+ }
+
+ $ph1ent['encryption-algorithm'] = $ph1alg;
+ $ph1ent['hash-algorithm'] = $mobilecfg['p1']['hash-algorithm'];
+ $ph1ent['dhgroup'] = $mobilecfg['p1']['dhgroup'];
+ $ph1ent['lifetime'] = $mobilecfg['p1']['lifetime'];
+ $ph1ent['authentication_method'] = $mobilecfg['p1']['authentication_method'];
+
+ if (isset($mobilecfg['p1']['cert'])) {
+ $ph1ent['cert'] = $mobilecfg['p1']['cert'];
+ }
+ if (isset($mobilecfg['p1']['peercert'])) {
+ $ph1ent['peercert'] = $mobilecfg['p1']['peercert'];
+ }
+ if (isset($mobilecfg['p1']['private-key'])) {
+ $ph1ent['private-key'] = $mobilecfg['p1']['private-key'];
+ }
+
+ $ph1ent['nat_traversal'] = "on";
+ $ph1ent['dpd_enable'] = 1;
+ $ph1ent['dpd_delay'] = 10;
+ $ph1ent['dpd_maxfail'] = 5;
+ $ph1ent['mobile'] = true;
+
+ $ph2ent = array();
+ $ph2ent['ikeid'] = $ph1ent['ikeid'];
+ $ph2ent['descr'] = "phase2 for ".$mobilecfg['descr'];
+ $ph2ent['localid'] = array('type' => 'none');
+ $ph2ent['remoteid'] = array('type' => 'mobile');
+ $ph2ent['protocol'] = $mobilecfg['p2']['protocol'];
+
+ $aes_count = 0;
+ foreach ($mobilecfg['p2']['encryption-algorithm-option'] as $tunalg) {
+ $aes_found = false;
+ switch ($tunalg) {
+ case "des":
+ $ph2alg = array('name' => 'des');
+ break;
+ case "3des":
+ $ph2alg = array('name' => '3des');
+ break;
+ case "blowfish":
+ $ph2alg = array('name' => 'blowfish', 'keylen' => 'auto');
+ break;
+ case "cast128":
+ $ph2alg = array('name' => 'cast128');
+ break;
+ case "rijndael":
+ case "rijndael 256":
+ case "aes 256":
+ $ph2alg = array('name' => 'aes', 'keylen' => 'auto');
+ $aes_found = true;
+ $aes_count++;
+ break;
+ }
+
+ if (!$aes_found || ($aes_count < 2)) {
+ $ph2ent['encryption-algorithm-option'][] = $ph2alg;
+ }
+ }
+ $ph2ent['hash-algorithm-option'] = $mobilecfg['p2']['hash-algorithm-option'];
+ $ph2ent['pfsgroup'] = $mobilecfg['p2']['pfsgroup'];
+ $ph2ent['lifetime'] = $mobilecfg['p2']['lifetime'];
+ $ph2ent['mobile'] = true;
+
+ $config['ipsec']['phase1'][] = $ph1ent;
+ $config['ipsec']['phase2'][] = $ph2ent;
+ unset($config['ipsec']['mobileclients']);
+ }
+}
+
+
+function upgrade_047_to_048() {
+ global $config;
+ if (!empty($config['dyndns'])) {
+ $config['dyndnses'] = array();
+ $config['dyndnses']['dyndns'] = array();
+ if (isset($config['dyndns'][0]['host'])) {
+ $tempdyn = array();
+ $tempdyn['enable'] = isset($config['dyndns'][0]['enable']);
+ $tempdyn['type'] = $config['dyndns'][0]['type'];
+ $tempdyn['wildcard'] = isset($config['dyndns'][0]['wildcard']);
+ $tempdyn['username'] = $config['dyndns'][0]['username'];
+ $tempdyn['password'] = $config['dyndns'][0]['password'];
+ $tempdyn['host'] = $config['dyndns'][0]['host'];
+ $tempdyn['mx'] = $config['dyndns'][0]['mx'];
+ $tempdyn['interface'] = "wan";
+ $tempdyn['descr'] = sprintf(gettext("Upgraded Dyndns %s"), $tempdyn['type']);
+ $config['dyndnses']['dyndns'][] = $tempdyn;
+ }
+ unset($config['dyndns']);
+ }
+ if (!empty($config['dnsupdate'])) {
+ $pconfig = $config['dnsupdate'][0];
+ if (!$pconfig['ttl']) {
+ $pconfig['ttl'] = 60;
+ }
+ if (!$pconfig['keytype']) {
+ $pconfig['keytype'] = "zone";
+ }
+ $pconfig['interface'] = "wan";
+ $config['dnsupdates']['dnsupdate'][] = $pconfig;
+ unset($config['dnsupdate']);
+ }
+
+ if (is_array($config['pppoe']) && is_array($config['pppoe'][0])) {
+ $pconfig = array();
+ $pconfig['username'] = $config['pppoe'][0]['username'];
+ $pconfig['password'] = $config['pppoe'][0]['password'];
+ $pconfig['provider'] = $config['pppoe'][0]['provider'];
+ $pconfig['ondemand'] = isset($config['pppoe'][0]['ondemand']);
+ $pconfig['timeout'] = $config['pppoe'][0]['timeout'];
+ unset($config['pppoe']);
+ $config['interfaces']['wan']['pppoe_username'] = $pconfig['username'];
+ $config['interfaces']['wan']['pppoe_password'] = $pconfig['password'];
+ $config['interfaces']['wan']['provider'] = $pconfig['provider'];
+ $config['interfaces']['wan']['ondemand'] = isset($pconfig['ondemand']);
+ $config['interfaces']['wan']['timeout'] = $pconfig['timeout'];
+ }
+ if (is_array($config['pptp'])) {
+ $pconfig = array();
+ $pconfig['username'] = $config['pptp']['username'];
+ $pconfig['password'] = $config['pptp']['password'];
+ $pconfig['provider'] = $config['pptp']['provider'];
+ $pconfig['ondemand'] = isset($config['pptp']['ondemand']);
+ $pconfig['timeout'] = $config['pptp']['timeout'];
+ unset($config['pptp']);
+ $config['interfaces']['wan']['pptp_username'] = $pconfig['username'];
+ $config['interfaces']['wan']['pptp_password'] = $pconfig['password'];
+ $config['interfaces']['wan']['provider'] = $pconfig['provider'];
+ $config['interfaces']['wan']['ondemand'] = isset($pconfig['ondemand']);
+ $config['interfaces']['wan']['timeout'] = $pconfig['timeout'];
+ }
+}
+
+
+function upgrade_048_to_049() {
+ global $config;
+ /* setup new all users group */
+ $all = array();
+ $all['name'] = "all";
+ $all['description'] = gettext("All Users");
+ $all['scope'] = "system";
+ $all['gid'] = 1998;
+ $all['member'] = array();
+
+ if (!is_array($config['system']['user'])) {
+ $config['system']['user'] = array();
+ }
+ if (!is_array($config['system']['group'])) {
+ $config['system']['group'] = array();
+ }
+
+ /* work around broken uid assignments */
+ $config['system']['nextuid'] = 2000;
+ foreach ($config['system']['user'] as & $user) {
+ if (isset($user['uid']) && !$user['uid']) {
+ continue;
+ }
+ $user['uid'] = $config['system']['nextuid']++;
+ }
+
+ /* work around broken gid assignments */
+ $config['system']['nextgid'] = 2000;
+ foreach ($config['system']['group'] as & $group) {
+ if ($group['name'] == $g['admin_group']) {
+ $group['gid'] = 1999;
+ } else {
+ $group['gid'] = $config['system']['nextgid']++;
+ }
+ }
+
+ /* build group membership information */
+ foreach ($config['system']['group'] as & $group) {
+ $group['member'] = array();
+ foreach ($config['system']['user'] as & $user) {
+ $groupnames = explode(",", $user['groupname']);
+ if (in_array($group['name'], $groupnames)) {
+ $group['member'][] = $user['uid'];
+ }
+ }
+ }
+
+ /* reset user group information */
+ foreach ($config['system']['user'] as & $user) {
+ unset($user['groupname']);
+ $all['member'][] = $user['uid'];
+ }
+
+ /* reset group scope information */
+ foreach ($config['system']['group'] as & $group) {
+ if ($group['name'] != $g['admin_group']) {
+ $group['scope'] = "user";
+ }
+ }
+
+ /* insert new all group */
+ $groups = Array();
+ $groups[] = $all;
+ $groups = array_merge($config['system']['group'], $groups);
+ $config['system']['group'] = $groups;
+}
+
+
+function upgrade_049_to_050() {
+ global $config;
+
+ if (!is_array($config['system']['user'])) {
+ $config['system']['user'] = array();
+ }
+ /* update user privileges */
+ foreach ($config['system']['user'] as & $user) {
+ $privs = array();
+ if (!is_array($user['priv'])) {
+ unset($user['priv']);
+ continue;
+ }
+ foreach ($user['priv'] as $priv) {
+ switch ($priv['id']) {
+ case "hasshell":
+ $privs[] = "user-shell-access";
+ break;
+ case "copyfiles":
+ $privs[] = "user-copy-files";
+ break;
+ }
+ }
+ $user['priv'] = $privs;
+ }
+
+ /* update group privileges */
+ foreach ($config['system']['group'] as & $group) {
+ $privs = array();
+ if (!is_array($group['pages'])) {
+ unset($group['pages']);
+ continue;
+ }
+ foreach ($group['pages'] as $page) {
+ $priv = map_page_privname($page);
+ if ($priv) {
+ $privs[] = $priv;
+ }
+ }
+ unset($group['pages']);
+ $group['priv'] = $privs;
+ }
+
+ /* sync all local account information */
+ local_sync_accounts();
+}
+
+
+function upgrade_050_to_051() {
+ global $config;
+ $pconfig = array();
+ $pconfig['descr'] = "Set to 0 to disable filtering on the incoming and outgoing member interfaces.";
+ $pconfig['tunable'] = "net.link.bridge.pfil_member";
+ $pconfig['value'] = "1";
+ $config['sysctl']['item'][] = $pconfig;
+ $pconfig = array();
+ $pconfig['descr'] = "Set to 1 to enable filtering on the bridge interface";
+ $pconfig['tunable'] = "net.link.bridge.pfil_bridge";
+ $pconfig['value'] = "0";
+ $config['sysctl']['item'][] = $pconfig;
+
+ unset($config['bridge']);
+
+ $convert_bridges = false;
+ foreach ($config['interfaces'] as $intf) {
+ if (isset($intf['bridge']) && $intf['bridge'] <> "") {
+ $config['bridges'] = array();
+ $config['bridges']['bridged'] = array();
+ $convert_bridges = true;
+ break;
+ }
+ }
+ if ($convert_bridges == true) {
+ $i = 0;
+ foreach ($config['interfaces'] as $ifr => &$intf) {
+ if (isset($intf['bridge']) && $intf['bridge'] <> "") {
+ $nbridge = array();
+ $nbridge['members'] = "{$ifr},{$intf['bridge']}";
+ $nbridge['descr'] = sprintf(gettext("Converted bridged %s"), $ifr);
+ $nbridge['bridgeif'] = "bridge{$i}";
+ $config['bridges']['bridged'][] = $nbridge;
+ unset($intf['bridge']);
+ $i++;
+ }
+ }
+ }
+}
+
+
+function upgrade_051_to_052() {
+ global $config;
+ $config['openvpn'] = array();
+ if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+ }
+ if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+ }
+
+ $vpnid = 1;
+
+ /* openvpn server configurations */
+ if (is_array($config['installedpackages']['openvpnserver'])) {
+ $config['openvpn']['openvpn-server'] = array();
+
+ $index = 1;
+ foreach ($config['installedpackages']['openvpnserver']['config'] as $server) {
+
+ if (!is_array($server)) {
+ continue;
+ }
+
+ if ($server['auth_method'] == "pki") {
+
+ /* create ca entry */
+ $ca = array();
+ $ca['refid'] = uniqid();
+ $ca['descr'] = "OpenVPN Server CA #{$index}";
+ $ca['crt'] = $server['ca_cert'];
+ $config['ca'][] = $ca;
+
+ /* create ca reference */
+ unset($server['ca_cert']);
+ $server['caref'] = $ca['refid'];
+
+ /* create a crl entry if needed */
+ if (!empty($server['crl'][0])) {
+ $crl = array();
+ $crl['refid'] = uniqid();
+ $crl['descr'] = "Imported OpenVPN CRL #{$index}";
+ $crl['caref'] = $ca['refid'];
+ $crl['text'] = $server['crl'][0];
+ if (!is_array($config['crl'])) {
+ $config['crl'] = array();
+ }
+ $config['crl'][] = $crl;
+ $server['crlref'] = $crl['refid'];
+ }
+ unset($server['crl']);
+
+ /* create cert entry */
+ $cert = array();
+ $cert['refid'] = uniqid();
+ $cert['descr'] = "OpenVPN Server Certificate #{$index}";
+ $cert['crt'] = $server['server_cert'];
+ $cert['prv'] = $server['server_key'];
+ $config['cert'][] = $cert;
+
+ /* create cert reference */
+ unset($server['server_cert']);
+ unset($server['server_key']);
+ $server['certref'] = $cert['refid'];
+
+ $index++;
+ }
+
+ /* determine operational mode */
+ if ($server['auth_method'] == 'pki') {
+ if ($server['nopool']) {
+ $server['mode'] = "p2p_tls";
+ } else {
+ $server['mode'] = "server_tls";
+ }
+ } else {
+ $server['mode'] = "p2p_shared_key";
+ }
+ unset($server['auth_method']);
+
+ /* modify configuration values */
+ $server['dh_length'] = 1024;
+ unset($server['dh_params']);
+ if (!$server['interface']) {
+ $server['interface'] = 'any';
+ }
+ $server['tunnel_network'] = $server['addresspool'];
+ unset($server['addresspool']);
+ if (isset($server['use_lzo']) && ($server['use_lzo'] == "on")) {
+ $server['compression'] = "on";
+ unset($server['use_lzo']);
+ }
+ if ($server['nopool']) {
+ $server['pool_enable'] = false;
+ } else {
+ $server['pool_enable'] = "yes";
+ }
+ unset($server['nopool']);
+ $server['dns_domain'] = $server['dhcp_domainname'];
+ unset($server['dhcp_domainname']);
+
+ $tmparr = explode(";", $server['dhcp_dns'], 4);
+ $d=1;
+ foreach ($tmparr as $tmpa) {
+ $server["dns_server{$d}"] = $tmpa;
+ $d++;
+ }
+ unset($server['dhcp_dns']);
+
+ $tmparr = explode(";", $server['dhcp_ntp'], 2);
+ $d=1;
+ foreach ($tmparr as $tmpa) {
+ $server["ntp_server{$d}"] = $tmpa;
+ $d++;
+ }
+ unset($server['dhcp_ntp']);
+
+ if ($server['dhcp_nbtdisable']) {
+ $server['netbios_enable'] = false;
+ } else {
+ $server['netbios_enable'] = "yes";
+ }
+ unset($server['dhcp_nbtdisable']);
+ $server['netbios_ntype'] = $server['dhcp_nbttype'];
+ unset($server['dhcp_nbttype']);
+ $server['netbios_scope'] = $server['dhcp_nbtscope'];
+ unset($server['dhcp_nbtscope']);
+
+ $tmparr = explode(";", $server['dhcp_nbdd'], 2);
+ $d=1;
+ foreach ($tmparr as $tmpa) {
+ $server["nbdd_server{$d}"] = $tmpa;
+ $d++;
+ }
+ unset($server['dhcp_nbdd']);
+
+ $tmparr = explode(";", $server['dhcp_wins'], 2);
+ $d=1;
+ foreach ($tmparr as $tmpa) {
+ $server["wins_server{$d}"] = $tmpa;
+ $d++;
+ }
+ unset($server['dhcp_wins']);
+
+ if (!empty($server['disable'])) {
+ $server['disable'] = true;
+ } else {
+ unset($server['disable']);
+ }
+
+ /* allocate vpnid */
+ $server['vpnid'] = $vpnid++;
+
+ if (!empty($server['custom_options'])) {
+ $cstmopts = array();
+ $tmpcstmopts = explode(";", $server['custom_options']);
+ $assigned_if = "";
+ $tmpstr = "";
+ foreach ($tmpcstmopts as $tmpcstmopt) {
+ $tmpstr = str_replace(" ", "", $tmpcstmopt);
+ if (substr($tmpstr, 0, 6) == "devtun") {
+ $assigned_if = substr($tmpstr, 3);
+ continue;
+ } else if (substr($tmpstr, 0, 5) == "local") {
+ $localip = substr($tmpstr, 5);
+ $server['ipaddr'] = str_replace("\n", "", $localip);
+ } else {
+ $cstmopts[] = $tmpcstmopt;
+ }
+ }
+ $server['custom_options'] = implode(";", $cstmopts);
+ if (!empty($assigned_if)) {
+ foreach ($config['interfaces'] as $iface => $cfgif) {
+ if ($cfgif['if'] == $assigned_if) {
+ $config['interfaces'][$iface]['if'] = "ovpns{$server['vpnid']}";
+ break;
+ }
+ }
+ }
+ }
+
+ $config['openvpn']['openvpn-server'][] = $server;
+ }
+ unset($config['installedpackages']['openvpnserver']);
+ }
+
+ /* openvpn client configurations */
+ if (is_array($config['installedpackages']['openvpnclient'])) {
+ $config['openvpn']['openvpn-client'] = array();
+
+ $index = 1;
+ foreach ($config['installedpackages']['openvpnclient']['config'] as $client) {
+
+ if (!is_array($client)) {
+ continue;
+ }
+
+ if ($client['auth_method'] == "pki") {
+
+ /* create ca entry */
+ $ca = array();
+ $ca['refid'] = uniqid();
+ $ca['descr'] = "OpenVPN Client CA #{$index}";
+ $ca['crt'] = $client['ca_cert'];
+ $ca['crl'] = $client['crl'];
+ $config['ca'][] = $ca;
+
+ /* create ca reference */
+ unset($client['ca_cert']);
+ unset($client['crl']);
+ $client['caref'] = $ca['refid'];
+
+ /* create cert entry */
+ $cert = array();
+ $cert['refid'] = uniqid();
+ $cert['descr'] = "OpenVPN Client Certificate #{$index}";
+ $cert['crt'] = $client['client_cert'];
+ $cert['prv'] = $client['client_key'];
+ $config['cert'][] = $cert;
+
+ /* create cert reference */
+ unset($client['client_cert']);
+ unset($client['client_key']);
+ $client['certref'] = $cert['refid'];
+
+ $index++;
+ }
+
+ /* determine operational mode */
+ if ($client['auth_method'] == 'pki') {
+ $client['mode'] = "p2p_tls";
+ } else {
+ $client['mode'] = "p2p_shared_key";
+ }
+ unset($client['auth_method']);
+
+ /* modify configuration values */
+ if (!$client['interface']) {
+ $client['interface'] = 'wan';
+ }
+ $client['tunnel_network'] = $client['interface_ip'];
+ unset($client['interface_ip']);
+ $client['server_addr'] = $client['serveraddr'];
+ unset($client['serveraddr']);
+ $client['server_port'] = $client['serverport'];
+ unset($client['serverport']);
+ $client['proxy_addr'] = $client['poxy_hostname'];
+ unset($client['proxy_addr']);
+ if (isset($client['use_lzo']) && ($client['use_lzo'] == "on")) {
+ $client['compression'] = "on";
+ unset($client['use_lzo']);
+ }
+ $client['resolve_retry'] = $client['infiniteresolvretry'];
+ unset($client['infiniteresolvretry']);
+
+ /* allocate vpnid */
+ $client['vpnid'] = $vpnid++;
+
+ if (!empty($client['custom_options'])) {
+ $cstmopts = array();
+ $tmpcstmopts = explode(";", $client['custom_options']);
+ $assigned_if = "";
+ $tmpstr = "";
+ foreach ($tmpcstmopts as $tmpcstmopt) {
+ $tmpstr = str_replace(" ", "", $tmpcstmopt);
+ if (substr($tmpstr, 0, 6) == "devtun") {
+ $assigned_if = substr($tmpstr, 3);
+ continue;
+ } else if (substr($tmpstr, 0, 5) == "local") {
+ $localip = substr($tmpstr, 5);
+ $client['ipaddr'] = str_replace("\n", "", $localip);
+ } else {
+ $cstmopts[] = $tmpcstmopt;
+ }
+ }
+ $client['custom_options'] = implode(";", $cstmopts);
+ if (!empty($assigned_if)) {
+ foreach ($config['interfaces'] as $iface => $cfgif) {
+ if ($cfgif['if'] == $assigned_if) {
+ $config['interfaces'][$iface]['if'] = "ovpnc{$client['vpnid']}";
+ break;
+ }
+ }
+ }
+ }
+
+ if (!empty($client['disable'])) {
+ $client['disable'] = true;
+ } else {
+ unset($client['disable']);
+ }
+
+ $config['openvpn']['openvpn-client'][] = $client;
+ }
+
+ unset($config['installedpackages']['openvpnclient']);
+ }
+
+ /* openvpn client specific configurations */
+ if (is_array($config['installedpackages']['openvpncsc'])) {
+ $config['openvpn']['openvpn-csc'] = array();
+
+ foreach ($config['installedpackages']['openvpncsc']['config'] as $csc) {
+
+ if (!is_array($csc)) {
+ continue;
+ }
+
+ /* modify configuration values */
+ $csc['common_name'] = $csc['commonname'];
+ unset($csc['commonname']);
+ $csc['tunnel_network'] = $csc['ifconfig_push'];
+ unset($csc['ifconfig_push']);
+ $csc['dns_domain'] = $csc['dhcp_domainname'];
+ unset($csc['dhcp_domainname']);
+
+ $tmparr = explode(";", $csc['dhcp_dns'], 4);
+ $d=1;
+ foreach ($tmparr as $tmpa) {
+ $csc["dns_server{$d}"] = $tmpa;
+ $d++;
+ }
+ unset($csc['dhcp_dns']);
+
+ $tmparr = explode(";", $csc['dhcp_ntp'], 2);
+ $d=1;
+ foreach ($tmparr as $tmpa) {
+ $csc["ntp_server{$d}"] = $tmpa;
+ $d++;
+ }
+ unset($csc['dhcp_ntp']);
+
+ if ($csc['dhcp_nbtdisable']) {
+ $csc['netbios_enable'] = false;
+ } else {
+ $csc['netbios_enable'] = "yes";
+ }
+ unset($csc['dhcp_nbtdisable']);
+ $csc['netbios_ntype'] = $csc['dhcp_nbttype'];
+ unset($csc['dhcp_nbttype']);
+ $csc['netbios_scope'] = $csc['dhcp_nbtscope'];
+ unset($csc['dhcp_nbtscope']);
+
+ $tmparr = explode(";", $csc['dhcp_nbdd'], 2);
+ $d=1;
+ foreach ($tmparr as $tmpa) {
+ $csc["nbdd_server{$d}"] = $tmpa;
+ $d++;
+ }
+ unset($csc['dhcp_nbdd']);
+
+ $tmparr = explode(";", $csc['dhcp_wins'], 2);
+ $d=1;
+ foreach ($tmparr as $tmpa) {
+ $csc["wins_server{$d}"] = $tmpa;
+ $d++;
+ }
+ unset($csc['dhcp_wins']);
+
+ if (!empty($csc['disable'])) {
+ $csc['disable'] = true;
+ } else {
+ unset($csc['disable']);
+ }
+
+ $config['openvpn']['openvpn-csc'][] = $csc;
+ }
+
+ unset($config['installedpackages']['openvpncsc']);
+ }
+
+ if (count($config['openvpn']['openvpn-server']) > 0 ||
+ count($config['openvpn']['openvpn-client']) > 0) {
+ $ovpnrule = array();
+ $ovpnrule['type'] = "pass";
+ $ovpnrule['interface'] = "openvpn";
+ $ovpnrule['statetype'] = "keep state";
+ $ovpnrule['source'] = array();
+ $ovpnrule['destination'] = array();
+ $ovpnrule['source']['any'] = true;
+ $ovpnrule['destination']['any'] = true;
+ $ovpnrule['descr'] = gettext("Auto added OpenVPN rule from config upgrade.");
+ $config['filter']['rule'][] = $ovpnrule;
+ }
+
+ /*
+ * FIXME: hack to keep things working with no installedpackages
+ * or carp array in the configuration data.
+ */
+ if (!is_array($config['installedpackages'])) {
+ $config['installedpackages'] = array();
+ }
+ if (!is_array($config['installedpackages']['carp'])) {
+ $config['installedpackages']['carp'] = array();
+ }
+
+}
+
+
+function upgrade_052_to_053() {
+ global $config;
+ if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+ }
+ if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+ }
+
+ /* migrate advanced admin page webui ssl to certificate manager */
+ if ($config['system']['webgui']['certificate'] &&
+ $config['system']['webgui']['private-key']) {
+
+ /* create cert entry */
+ $cert = array();
+ $cert['refid'] = uniqid();
+ $cert['descr'] = "webConfigurator SSL Certificate";
+ $cert['crt'] = $config['system']['webgui']['certificate'];
+ $cert['prv'] = $config['system']['webgui']['private-key'];
+ $config['cert'][] = $cert;
+
+ /* create cert reference */
+ unset($config['system']['webgui']['certificate']);
+ unset($config['system']['webgui']['private-key']);
+ $config['system']['webgui']['ssl-certref'] = $cert['refid'];
+ }
+
+ /* migrate advanced admin page ssh keys to user manager */
+ if ($config['system']['ssh']['authorizedkeys']) {
+ $admin_user =& getUserEntryByUID(0);
+ $admin_user['authorizedkeys'] = $config['system']['ssh']['authorizedkeys'];
+ unset($config['system']['ssh']['authorizedkeys']);
+ }
+}
+
+
+function upgrade_053_to_054() {
+ global $config;
+ if (is_array($config['load_balancer']['lbpool'])) {
+ $lbpool_arr = $config['load_balancer']['lbpool'];
+ $lbpool_srv_arr = array();
+ $gateway_group_arr = array();
+ $gateways = return_gateways_array();
+ $group_name_changes = array();
+ if (!is_array($config['gateways']['gateway_item'])) {
+ $config['gateways']['gateway_item'] = array();
+ }
+
+ $a_gateways =& $config['gateways']['gateway_item'];
+ foreach ($lbpool_arr as $lbpool) {
+ if ($lbpool['type'] == "gateway") {
+ // Gateway Groups have to have valid names in pf, old lb pools did not. Clean them up.
+ $group_name = preg_replace("/[^A-Za-z0-9]/", "", $lbpool['name']);
+ // If we made and changes, check for collisions and note the change.
+ if ($group_name != $lbpool['name']) {
+ // Make sure the name isn't already in use.
+ foreach ($gateway_group_arr as $gwg) {
+ // If the name is in use, add some random bits to avoid collision.
+ if ($gwg['name'] == $group_name) {
+ $group_name .= uniqid();
+ }
+ }
+ $group_name_changes[$lbpool['name']] = $group_name;
+ }
+ $gateway_group['name'] = $group_name;
+ $gateway_group['descr'] = $lbpool['descr'];
+ $gateway_group['trigger'] = "down";
+ $gateway_group['item'] = array();
+ $i = 0;
+ foreach ($lbpool['servers'] as $member) {
+ $split = explode("|", $member);
+ $interface = $split[0];
+ $monitor = $split[1];
+ /* on static upgraded configuration we automatically prepend GW_ */
+ $static_name = "GW_" . strtoupper($interface);
+ if (is_ipaddr($monitor)) {
+ foreach ($a_gateways as & $gw) {
+ if ($gw['name'] == $static_name) {
+ $gw['monitor'] = $monitor;
+ }
+ }
+ }
+
+ /* on failover increment tier. Else always assign 1 */
+ if ($lbpool['behaviour'] == "failover") {
+ $i++;
+ } else {
+ $i = 1;
+ }
+ $gateway_group['item'][] = "$static_name|$i";
+ }
+ $gateway_group_arr[] = $gateway_group;
+ } else {
+ $lbpool_srv_arr[] = $lbpool;
+ }
+ }
+ $config['load_balancer']['lbpool'] = $lbpool_srv_arr;
+ $config['gateways']['gateway_group'] = $gateway_group_arr;
+ }
+ // Unset lbpool if we no longer have any server pools
+ if (count($lbpool_srv_arr) == 0) {
+ if (empty($config['load_balancer'])) {
+ unset($config['load_balancer']);
+ } else {
+ unset($config['load_balancer']['lbpool']);
+ }
+ } else {
+ $config['load_balancer']['lbpool'] = $lbpool_srv_arr;
+ }
+ // Only set the gateway group array if we converted any
+ if (count($gateway_group_arr) != 0) {
+ $config['gateways']['gateway_group'] = $gateway_group_arr;
+ // Update any rules that had a gateway change, if any.
+ if (count($group_name_changes) > 0) {
+ foreach ($config['filter']['rule'] as & $rule) {
+ if (!empty($rule["gateway"]) && array_key_exists($rule["gateway"], $group_name_changes)) {
+ $rule["gateway"] = $group_name_changes[$rule["gateway"]];
+ }
+ }
+ }
+ }
+}
+
+
+function upgrade_054_to_055() {
+ global $config;
+ global $g;
+
+ /* RRD files changed for quality, traffic and packets graphs */
+ //ini_set("max_execution_time", "1800");
+ /* convert traffic RRD file */
+ global $parsedcfg, $listtags;
+ $listtags = array("ds", "v", "rra", "row");
+
+ $rrddbpath = "/var/db/rrd/";
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+ if ($g['platform'] != "pfSense") {
+ /* restore the databases, if we have one */
+ if (restore_rrd()) {
+ /* Make sure to move the rrd backup out of the way. We will make a new one after converting. */
+ @rename("{$g['cf_conf_path']}/rrd.tgz", "{$g['cf_conf_path']}/backup/rrd.tgz");
+ }
+ }
+
+ $rrdinterval = 60;
+ $valid = $rrdinterval * 2;
+
+ /* Asume GigE for now */
+ $downstream = 125000000;
+ $upstream = 125000000;
+
+ /* build a list of quality databases */
+ /* roundtrip has become delay */
+ function divide_delay($delayval) {
+ $delayval = floatval($delayval);
+ $delayval = ($delayval / 1000);
+ $delayval = " ". sprintf("%1.10e", $delayval) ." ";
+ return $delayval;
+ }
+ /* the roundtrip times need to be divided by 1000 to get seconds, really */
+ $databases = array();
+ if (!file_exists($rrddbpath)) {
+ @mkdir($rrddbpath);
+ }
+ chdir($rrddbpath);
+ $databases = glob("*-quality.rrd");
+ rsort($databases);
+ foreach ($databases as $database) {
+ $xmldump = "{$database}.old.xml";
+ $xmldumpnew = "{$database}.new.xml";
+
+ if (platform_booting()) {
+ echo "Migrate RRD database {$database} to new format for IPv6 \n";
+ }
+ mwexec("$rrdtool tune {$rrddbpath}{$database} -r roundtrip:delay 2>&1");
+
+ dump_rrd_to_xml("{$rrddbpath}/{$database}", "{$g['tmp_path']}/{$xmldump}");
+ $rrdold = xml2array(file_get_contents("{$g['tmp_path']}/{$xmldump}"), 1, "tag");
+ $rrdold = $rrdold['rrd'];
+
+ $i = 0;
+ foreach ($rrdold['rra'] as $rra) {
+ $l = 0;
+ foreach ($rra['database']['row'] as $row) {
+ $vnew = divide_delay($row['v'][1]);
+ $rrdold['rra'][$i]['database']['row'][$l]['v'][1] = $vnew;
+ $l++;
+ }
+ $i++;
+ }
+
+ file_put_contents("{$g['tmp_path']}/{$xmldumpnew}", dump_xml_config_raw($rrdold, "rrd"));
+ mwexec("$rrdtool restore -f {$g['tmp_path']}/{$xmldumpnew} {$rrddbpath}/{$database} 2>&1");
+
+ unset($rrdold);
+ @unlink("{$g['tmp_path']}/{$xmldump}");
+ @unlink("{$g['tmp_path']}/{$xmldumpnew}");
+ }
+ /* let apinger recreate required files */
+ if (!platform_booting()) {
+ setup_gateways_monitor();
+ }
+
+ /* build a list of traffic and packets databases */
+ $databases = return_dir_as_array($rrddbpath, '/-(traffic|packets)\.rrd$/');
+ rsort($databases);
+ foreach ($databases as $database) {
+ $databasetmp = "{$database}.tmp";
+ $xmldump = "{$database}.old.xml";
+ $xmldumptmp = "{$database}.tmp.xml";
+ $xmldumpnew = "{$database}.new.xml";
+
+ if (platform_booting()) {
+ echo "Migrate RRD database {$database} to new format \n";
+ }
+ /* rename DS source */
+ mwexec("$rrdtool tune {$rrddbpath}/{$database} -r in:inpass 2>&1");
+ mwexec("$rrdtool tune {$rrddbpath}/{$database} -r out:outpass 2>71");
+
+ /* dump contents to xml and move database out of the way */
+ dump_rrd_to_xml("{$rrddbpath}/{$database}", "{$g['tmp_path']}/{$xmldump}");
+
+ /* create new rrd database file */
+ $rrdcreate = "$rrdtool create {$g['tmp_path']}/{$databasetmp} --step $rrdinterval ";
+ $rrdcreate .= "DS:inpass:COUNTER:$valid:0:$downstream ";
+ $rrdcreate .= "DS:outpass:COUNTER:$valid:0:$upstream ";
+ $rrdcreate .= "DS:inblock:COUNTER:$valid:0:$downstream ";
+ $rrdcreate .= "DS:outblock:COUNTER:$valid:0:$upstream ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:1:1000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:5:1000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:60:1000 ";
+ $rrdcreate .= "RRA:AVERAGE:0.5:720:1000 ";
+
+ create_new_rrd("$rrdcreate");
+ /* create temporary xml from new RRD */
+ dump_rrd_to_xml("{$g['tmp_path']}/{$databasetmp}", "{$g['tmp_path']}/{$xmldumptmp}");
+
+ $rrdold = xml2array(file_get_contents("{$g['tmp_path']}/{$xmldump}"), 1, "tag");
+ $rrdold = $rrdold['rrd'];
+
+ $rrdnew = xml2array(file_get_contents("{$g['tmp_path']}/{$xmldumptmp}"), 1, "tag");
+ $rrdnew = $rrdnew['rrd'];
+
+ /* remove any MAX RRA's. Not needed for traffic. */
+ $i = 0;
+ foreach ($rrdold['rra'] as $rra) {
+ if (trim($rra['cf']) == "MAX") {
+ unset($rrdold['rra'][$i]);
+ }
+ $i++;
+ }
+
+ file_put_contents("{$g['tmp_path']}/{$xmldumpnew}", dump_xml_config_raw(migrate_rrd_format($rrdold, $rrdnew), "rrd"));
+ mwexec("$rrdtool restore -f {$g['tmp_path']}/{$xmldumpnew} {$rrddbpath}/{$database} 2>&1");
+ /* we now have the rrd with the new fields, adjust the size now. */
+ /* RRA 2 is 60 minutes, RRA 3 is 720 minutes */
+ mwexec("/bin/sync");
+ mwexec("$rrdtool resize {$rrddbpath}/{$database} 2 GROW 2000;/bin/mv resize.rrd {$rrddbpath}/{$database} 2>&1");
+ mwexec("/bin/sync");
+ mwexec("$rrdtool resize {$rrddbpath}/{$database} 3 GROW 2000;/bin/mv resize.rrd {$rrddbpath}/{$database} 2>&1");
+ unset($rrdxmlarray);
+ @unlink("{$g['tmp_path']}/{$xmldump}");
+ @unlink("{$g['tmp_path']}/{$xmldumpnew}");
+ }
+ if (!platform_booting()) {
+ enable_rrd_graphing();
+ }
+ /* Let's save the RRD graphs after we run enable RRD graphing */
+ /* The function will restore the rrd.tgz so we will save it after */
+ exec("cd /; LANG=C NO_REMOUNT=1 RRDDBPATH='{$rrddbpath}' CF_CONF_PATH='{$g['cf_conf_path']}' /etc/rc.backup_rrd.sh");
+ unlink_if_exists("{$g['vardb_path']}/rrd/*.xml");
+ if (platform_booting()) {
+ echo "Updating configuration...";
+ }
+}
+
+
+function upgrade_055_to_056() {
+ global $config;
+
+ if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+ }
+ if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+ }
+
+ /* migrate ipsec ca's to cert manager */
+ if (is_array($config['ipsec']['cacert'])) {
+ foreach ($config['ipsec']['cacert'] as & $cacert) {
+ $ca = array();
+ $ca['refid'] = uniqid();
+ if (is_array($cacert['cert'])) {
+ $ca['crt'] = $cacert['cert'][0];
+ } else {
+ $ca['crt'] = $cacert['cert'];
+ }
+ $ca['descr'] = $cacert['ident'];
+ $config['ca'][] = $ca;
+ }
+ unset($config['ipsec']['cacert']);
+ }
+
+ /* migrate phase1 certificates to cert manager */
+ if (is_array($config['ipsec']['phase1'])) {
+ foreach ($config['ipsec']['phase1'] as & $ph1ent) {
+ $cert = array();
+ $cert['refid'] = uniqid();
+ $cert['descr'] = "IPsec Peer {$ph1ent['remote-gateway']} Certificate";
+ if (is_array($ph1ent['cert'])) {
+ $cert['crt'] = $ph1ent['cert'][0];
+ } else {
+ $cert['crt'] = $ph1ent['cert'];
+ }
+ $cert['prv'] = $ph1ent['private-key'];
+ $config['cert'][] = $cert;
+ $ph1ent['certref'] = $cert['refid'];
+ if ($ph1ent['cert']) {
+ unset($ph1ent['cert']);
+ }
+ if ($ph1ent['private-key']) {
+ unset($ph1ent['private-key']);
+ }
+ if ($ph1ent['peercert']) {
+ unset($ph1ent['peercert']);
+ }
+ }
+ }
+}
+
+
+function upgrade_056_to_057() {
+ global $config;
+
+ if (!is_array($config['system']['user'])) {
+ $config['system']['user'] = array();
+ }
+ /* migrate captivate portal to user manager */
+ if (is_array($config['captiveportal']['user'])) {
+ foreach ($config['captiveportal']['user'] as $user) {
+ // avoid user conflicts
+ $found = false;
+ foreach ($config['system']['user'] as $userent) {
+ if ($userent['name'] == $user['name']) {
+ $found = true;
+ break;
+ }
+ }
+ if ($found) {
+ continue;
+ }
+ $user['scope'] = "user";
+ if (isset($user['expirationdate'])) {
+ $user['expires'] = $user['expirationdate'];
+ unset($user['expirationdate']);
+ }
+ if (isset($user['password'])) {
+ $user['md5-hash'] = $user['password'];
+ unset($user['password']);
+ }
+ $user['uid'] = $config['system']['nextuid']++;
+ $config['system']['user'][] = $user;
+ }
+ unset($config['captiveportal']['user']);
+ }
+}
+
+function upgrade_057_to_058() {
+ global $config;
+ /* set all phase2 entries to tunnel mode */
+ if (is_array($config['ipsec']['phase2'])) {
+ foreach ($config['ipsec']['phase2'] as & $ph2ent) {
+ $ph2ent['mode'] = 'tunnel';
+ }
+ }
+}
+
+function upgrade_058_to_059() {
+ global $config;
+
+ if (is_array($config['schedules']['schedule'])) {
+ foreach ($config['schedules']['schedule'] as & $schedl) {
+ $schedl['schedlabel'] = uniqid();
+ }
+ }
+}
+
+function upgrade_059_to_060() {
+ global $config;
+ require_once("/etc/inc/certs.inc");
+ if (is_array($config['ca'])) {
+ /* Locate issuer for all CAs */
+ foreach ($config['ca'] as & $ca) {
+ $subject = cert_get_subject($ca['crt']);
+ $issuer = cert_get_issuer($ca['crt']);
+ if ($issuer <> $subject) {
+ $issuer_crt =& lookup_ca_by_subject($issuer);
+ if ($issuer_crt) {
+ $ca['caref'] = $issuer_crt['refid'];
+ }
+ }
+ }
+
+ /* Locate issuer for all certificates */
+ if (is_array($config['cert'])) {
+ foreach ($config['cert'] as & $cert) {
+ $subject = cert_get_subject($cert['crt']);
+ $issuer = cert_get_issuer($cert['crt']);
+ if ($issuer <> $subject) {
+ $issuer_crt =& lookup_ca_by_subject($issuer);
+ if ($issuer_crt) {
+ $cert['caref'] = $issuer_crt['refid'];
+ }
+ }
+ }
+ }
+ }
+}
+
+function upgrade_060_to_061() {
+ global $config;
+
+ if (is_array($config['interfaces']['wan'])) {
+ $config['interfaces']['wan']['enable'] = true;
+ }
+ if (is_array($config['interfaces']['lan'])) {
+ $config['interfaces']['lan']['enable'] = true;
+ }
+
+ /* On 1.2.3 the "mtu" field adjusted MSS.
+ On 2.x the "mtu" field is actually the MTU. Rename accordingly.
+ See redmine ticket #1886
+ */
+ foreach ($config['interfaces'] as $ifr => &$intf) {
+ if (isset($intf['mtu']) && is_numeric($intf['mtu'])) {
+ $intf['mss'] = $intf['mtu'];
+ unset($intf['mtu']);
+ }
+ }
+}
+
+function upgrade_061_to_062() {
+ global $config;
+
+ /* Convert NAT port forwarding rules */
+ if (is_array($config['nat']['rule'])) {
+ $a_nat = &$config['nat']['rule'];
+
+ foreach ($a_nat as &$natent) {
+ $natent['disabled'] = false;
+ $natent['nordr'] = false;
+
+ $natent['source'] = array(
+ "not" => false,
+ "any" => true,
+ "port" => ""
+ );
+
+ $natent['destination'] = array(
+ "not" => false,
+ "address" => $natent['external-address'],
+ "port" => $natent['external-port']
+ );
+
+ if (empty($natent['destination']['address'])) {
+ unset($natent['destination']['address']);
+ $natent['destination']['network'] = $natent['interface'] . 'ip';
+ } else if ($natent['destination']['address'] == 'any') {
+ unset($natent['destination']['address']);
+ $natent['destination']['any'] = true;
+ }
+
+ unset($natent['external-address']);
+ unset($natent['external-port']);
+ }
+
+ unset($natent);
+ }
+}
+
+function upgrade_062_to_063() {
+ /* Upgrade legacy Themes to the new pfsense_ng */
+ global $config;
+
+ switch ($config['theme']) {
+ case "nervecenter":
+ $config['theme'] = "pfsense_ng";
+ break;
+ }
+
+}
+
+function upgrade_063_to_064() {
+ global $config;
+ $j = 0;
+ $ifcfg = &$config['interfaces'];
+
+ if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
+ $config['ppps']['ppp'][$pppid]['if'] = "ppp".$j;
+ $config['ppps']['ppp'][$pppid]['ptpid'] = $j;
+ $j++;
+ if (isset($ppp['port'])) {
+ $config['ppps']['ppp'][$pppid]['ports'] = $ppp['port'];
+ unset($config['ppps']['ppp'][$pppid]['port']);
+ }
+ if (!isset($ppp['type'])) {
+ $config['ppps']['ppp'][$pppid]['type'] = "ppp";
+ }
+ if (isset($ppp['defaultgw'])) {
+ unset($config['ppps']['ppp'][$pppid]['defaultgw']);
+ }
+ }
+ }
+
+ if (!is_array($config['ppps']['ppp'])) {
+ $config['ppps']['ppp'] = array();
+ }
+ $a_ppps = &$config['ppps']['ppp'];
+
+ foreach ($ifcfg as $ifname => $ifinfo) {
+ $ppp = array();
+ // For pppoe conversion
+ if ($ifinfo['ipaddr'] == "pppoe" || $ifinfo['ipaddr'] == "pptp") {
+ if (isset($ifinfo['ptpid'])) {
+ continue;
+ }
+ $ppp['ptpid'] = $j;
+ $ppp['type'] = $ifinfo['ipaddr'];
+ $ppp['if'] = $ifinfo['ipaddr'].$j;
+ $ppp['ports'] = $ifinfo['if'];
+ if ($ifinfo['ipaddr'] == "pppoe") {
+ $ppp['username'] = $ifinfo['pppoe_username'];
+ $ppp['password'] = base64_encode($ifinfo['pppoe_password']);
+ }
+ if ($ifinfo['ipaddr'] == "pptp") {
+ $ppp['username'] = $ifinfo['pptp_username'];
+ $ppp['password'] = base64_encode($ifinfo['pptp_password']);
+ }
+
+ if (isset($ifinfo['provider'])) {
+ $ppp['provider'] = $ifinfo['provider'];
+ }
+ if (isset($ifinfo['ondemand'])) {
+ $ppp['ondemand'] = true;
+ }
+ if (isset($ifinfo['timeout'])) {
+ $ppp['idletimeout'] = $ifinfo['timeout'];
+ }
+ if (isset($ifinfo['pppoe']['pppoe-reset-type'])) {
+ $ppp['pppoe-reset-type'] = $ifinfo['pppoe']['pppoe-reset-type'];
+ if (is_array($config['cron']['item'])) {
+ for ($i = 0; $i < count($config['cron']['item']); $i++) {
+ $item = $config['cron']['item'][$i];
+ if (strpos($item['command'], "/conf/pppoe{$ifname}restart") !== false) {
+ $config['cron']['item'][$i]['command'] = "/var/etc/pppoe_restart_" . $ppp['if'];
+ }
+ }
+ }
+ }
+ if (isset($ifinfo['local'])) {
+ $ppp['localip'] = $ifinfo['local'];
+ }
+ if (isset($ifinfo['subnet'])) {
+ $ppp['subnet'] = $ifinfo['subnet'];
+ }
+ if (isset($ifinfo['remote'])) {
+ $ppp['gateway'] = $ifinfo['remote'];
+ }
+
+ $ifcfg[$ifname]['if'] = $ifinfo['ipaddr'].$j;
+ $j++;
+
+ unset($ifcfg[$ifname]['pppoe_username']);
+ unset($ifcfg[$ifname]['pppoe_password']);
+ unset($ifcfg[$ifname]['provider']);
+ unset($ifcfg[$ifname]['ondemand']);
+ unset($ifcfg[$ifname]['timeout']);
+ unset($ifcfg[$ifname]['pppoe_reset']);
+ unset($ifcfg[$ifname]['pppoe_preset']);
+ unset($ifcfg[$ifname]['pppoe']);
+ unset($ifcfg[$ifname]['pptp_username']);
+ unset($ifcfg[$ifname]['pptp_password']);
+ unset($ifcfg[$ifname]['local']);
+ unset($ifcfg[$ifname]['subnet']);
+ unset($ifcfg[$ifname]['remote']);
+
+ $a_ppps[] = $ppp;
+
+ }
+ }
+}
+
+function upgrade_064_to_065() {
+ /* Disable TSO and LRO in upgraded configs */
+ global $config;
+ $config['system']['disablesegmentationoffloading'] = true;
+ $config['system']['disablelargereceiveoffloading'] = true;
+}
+
+function upgrade_065_to_066() {
+ global $config;
+
+ $dhcrelaycfg =& $config['dhcrelay'];
+
+ if (is_array($dhcrelaycfg)) {
+ $dhcrelayifs = array();
+ $foundifs = false;
+ /* DHCPRelay enabled on any interfaces? */
+ foreach ($dhcrelaycfg as $dhcrelayif => $dhcrelayifconf) {
+ if (isset($dhcrelayifconf['enable'])) {
+ $dhcrelayifs[] = $dhcrelayif;
+ unset($dhcrelaycfg['dhcrelayif']);
+ $foundifs = true;
+ }
+ }
+ if ($foundifs == true) {
+ $dhcrelaycfg['interface'] = implode(",", $dhcrelayifs);
+ }
+ }
+}
+
+function upgrade_066_to_067() {
+ global $config;
+ if (isset($config['system']['ca'])) {
+ $config['ca'] = $config['system']['ca'];
+ unset($config['system']['ca']);
+ }
+ if (isset($config['system']['cert'])) {
+ $config['cert'] = $config['system']['cert'];
+ unset($config['system']['cert']);
+ }
+}
+
+function upgrade_067_to_068() {
+ global $config;
+
+ if (!empty($config['pppoe'])) {
+ $config['pppoes'] = array();
+ $config['pppoes']['pppoe'] = array();
+ $config['pppoes']['pppoe'][] = $config['pppoe'][0];
+
+ if (is_array($config['pppoe']['user'])) {
+ $username = array();
+ foreach ($config['pppoe']['user'] as $user) {
+ $usr = $user['name'] . ":" . base64_encode($user['password']);
+ if ($user['ip']) {
+ $usr .= ":{$user['ip']}";
+ }
+ $username[] = $usr;
+ }
+ $config['pppoes']['pppoe'][0]['username'] = implode(" ", $username);
+ }
+ unset($config['pppoe']);
+ }
+}
+
+function upgrade_068_to_069() {
+ global $config;
+ if (!is_array($config['system']['user'])) {
+ return;
+ }
+ foreach ($config['system']['user'] as & $user) {
+ if (!is_array($user['cert'])) {
+ continue;
+ }
+ $rids = array();
+ foreach ($user['cert'] as $id => $cert) {
+ if (!isset($cert['descr'])) {
+ continue;
+ }
+ $tcert = $cert;
+ // Make sure each cert gets a refid
+ if (!isset($tcert['refid'])) {
+ $tcert['refid'] = uniqid();
+ }
+ // Keep the cert references for this user
+ $rids[] = $tcert['refid'];
+ $config['cert'][] = $tcert;
+ }
+ // Replace user certs with cert references instead.
+ if (count($rids) > 0) {
+ $user['cert'] = $rids;
+ }
+ }
+}
+
+function upgrade_069_to_070() {
+ global $config;
+
+ /* Convert NAT 1:1 rules */
+ if (is_array($config['nat']['onetoone'])) {
+ foreach ($config['nat']['onetoone'] as $nidx => $natent) {
+ if ($natent['subnet'] == 32) {
+ $config['nat']['onetoone'][$nidx]['source'] = array("address" => $natent['internal']);
+ } else {
+ $config['nat']['onetoone'][$nidx]['source'] = array("address" => $natent['internal'] . "/" . $natent['subnet']);
+ }
+
+ $config['nat']['onetoone'][$nidx]['destination'] = array("any" => true);
+
+ unset($config['nat']['onetoone'][$nidx]['internal']);
+ unset($config['nat']['onetoone'][$nidx]['subnet']);
+ }
+
+ unset($natent);
+ }
+}
+
+function upgrade_070_to_071() {
+ global $config;
+
+ if (is_array($config['cron']['item'])) {
+ foreach ($config['cron']['item'] as $idx => $cronitem) {
+ if (stristr($cronitem['command'], "checkreload.sh")) {
+ unset($config['cron']['item'][$idx]);
+ break;
+ }
+ }
+ }
+}
+
+function rename_field(& $section, $oldname, $newname) {
+ if (is_array($section)) {
+ foreach ($section as & $item) {
+ if (is_array($item) && !empty($item[$oldname])) {
+ $item[$newname] = $item[$oldname];
+ }
+ if (is_array($item) && isset($item[$oldname])) {
+ unset($item[$oldname]);
+ }
+ }
+ }
+}
+
+function upgrade_071_to_072() {
+ global $config;
+ if (is_array($config['sysctl']) && is_array($config['sysctl']['item'])) {
+ rename_field($config['sysctl']['item'], 'desc', 'descr');
+ }
+}
+
+function upgrade_072_to_073() {
+ global $config;
+ if (!is_array($config['load_balancer'])) {
+ return;
+ }
+ if (is_array($config['load_balancer']['monitor_type'])) {
+ rename_field($config['load_balancer']['monitor_type'], 'desc', 'descr');
+ }
+ if (is_array($config['load_balancer']['lbpool'])) {
+ rename_field($config['load_balancer']['lbpool'], 'desc', 'descr');
+ }
+ if (is_array($config['load_balancer']['lbaction'])) {
+ rename_field($config['load_balancer']['lbaction'], 'desc', 'descr');
+ }
+ if (is_array($config['load_balancer']['lbprotocol'])) {
+ rename_field($config['load_balancer']['lbprotocol'], 'desc', 'descr');
+ }
+ if (is_array($config['load_balancer']['virtual_server'])) {
+ rename_field($config['load_balancer']['virtual_server'], 'desc', 'descr');
+ }
+}
+
+function upgrade_073_to_074() {
+ global $config;
+ rename_field($config['system']['user'], 'fullname', 'descr');
+}
+
+function upgrade_074_to_075() {
+ global $config;
+ if (is_array($config['ca'])) {
+ rename_field($config['ca'], 'name', 'descr');
+ }
+ if (is_array($config['cert'])) {
+ rename_field($config['cert'], 'name', 'descr');
+ }
+ if (is_array($config['crl'])) {
+ rename_field($config['crl'], 'name', 'descr');
+ }
+}
+
+function upgrade_075_to_076() {
+ global $config;
+ $cron_item = array();
+ $cron_item['minute'] = "30";
+ $cron_item['hour'] = "12";
+ $cron_item['mday'] = "*";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/usr/bin/nice -n20 /etc/rc.update_urltables";
+ $config['cron']['item'][] = $cron_item;
+}
+
+function upgrade_076_to_077() {
+ global $config;
+ foreach ($config['filter']['rule'] as & $rule) {
+ if (isset($rule['protocol']) && !empty($rule['protocol'])) {
+ $rule['protocol'] = strtolower($rule['protocol']);
+ }
+ }
+}
+
+function upgrade_077_to_078() {
+ global $config;
+ if (is_array($config['pptpd']) && is_array($config['pptpd']['radius']) &&
+ !is_array($config['pptpd']['radius']['server'])) {
+ $radarr = array();
+ $radsvr = array();
+ $radsvr['ip'] = $config['pptpd']['radius']['server'];
+ $radsvr['secret'] = $config['pptpd']['radius']['secret'];
+ $radsvr['port'] = 1812;
+ $radsvr['acctport'] = 1813;
+ $radsvr['enable'] = isset($config['pptpd']['radius']['enable']);
+ $radarr['accounting'] = isset($config['pptpd']['radius']['accounting']);
+ if ($radarr['accounting']) {
+ $radarr['acct_update'] = $radsvr['ip'];
+ }
+ $radarr['server'] = $radsvr;
+ $config['pptpd']['radius'] = $radarr;
+ }
+ if (is_array($config['pptpd'])) {
+ $config['pptpd']['n_pptp_units'] = empty($config['pptpd']['n_pptp_units']) ? 16 : $config['pptpd']['n_pptp_units'];
+ }
+}
+function upgrade_078_to_079() {
+ global $g;
+ /* Delete old and unused RRD file */
+ unlink_if_exists("{$g['vardb_path']}/rrd/captiveportal-totalusers.rrd");
+}
+
+function upgrade_079_to_080() {
+ global $config;
+
+ /* Upgrade config in 1.2.3 specifying a username other than admin for syncing. */
+ if (!empty($config['system']['username']) && is_array($config['installedpackages']['carpsettings']) &&
+ is_array($config['installedpackages']['carpsettings']['config'])) {
+ $config['installedpackages']['carpsettings']['config'][0]['username'] = $config['system']['username'];
+ unset($config['system']['username']);
+ }
+}
+
+function upgrade_080_to_081() {
+ global $config;
+ global $g;
+ /* Welcome to the 2.1 migration path */
+
+ /* tag all the existing gateways as being IPv4 */
+ $i = 0;
+ if (is_array($config['gateways']['gateway_item'])) {
+ foreach ($config['gateways']['gateway_item'] as $gw) {
+ $config['gateways']['gateway_item'][$i]['ipprotocol'] = "inet";
+ $i++;
+ }
+ }
+
+ /* RRD files changed for quality, traffic and packets graphs */
+ /* convert traffic RRD file */
+ global $parsedcfg, $listtags;
+ $listtags = array("ds", "v", "rra", "row");
+
+ $rrddbpath = "/var/db/rrd/";
+ $rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+
+ if ($g['platform'] != "pfSense") {
+ /* restore the databases, if we have one */
+ if (restore_rrd()) {
+ /* Make sure to move the rrd backup out of the way. We will make a new one after converting. */
+ @rename("{$g['cf_conf_path']}/rrd.tgz", "{$g['cf_conf_path']}/backup/rrd.tgz");
+ }
+ }
+
+ $rrdinterval = 60;
+ $valid = $rrdinterval * 2;
+
+ /* Asume GigE for now */
+ $downstream = 125000000;
+ $upstream = 125000000;
+
+ /* build a list of traffic and packets databases */
+ $databases = return_dir_as_array($rrddbpath, '/-(traffic|packets)\.rrd$/');
+ rsort($databases);
+ foreach ($databases as $database) {
+ $xmldump = "{$database}.old.xml";
+ $xmldumpnew = "{$database}.new.xml";
+
+ if (platform_booting()) {
+ echo "Migrate RRD database {$database} to new format for IPv6.\n";
+ }
+
+ /* dump contents to xml and move database out of the way */
+ dump_rrd_to_xml("{$rrddbpath}/{$database}", "{$g['tmp_path']}/{$xmldump}");
+
+ /* search and replace tags to add data sources */
+ $ds_search = "<!-- Round Robin Archives -->";
+ $ds_arr = array();
+ $ds_arr[] = " <ds>
+ <name> inpass6 </name>
+ <type> COUNTER </type>
+ <minimal_heartbeat> {$valid} </minimal_heartbeat>
+ <min> 0.0000000000e+00 </min>
+ <max> 1.2500000000e+08 </max>
+
+ <!-- PDP Status -->
+ <last_ds> 0 </last_ds>
+ <value> NaN </value>
+ <unknown_sec> 3 </unknown_sec>
+ </ds>
+ ";
+ $ds_arr[] = " <ds>
+ <name> outpass6 </name>
+ <type> COUNTER </type>
+ <minimal_heartbeat> {$valid} </minimal_heartbeat>
+ <min> 0.0000000000e+00 </min>
+ <max> 1.2500000000e+08 </max>
+
+ <!-- PDP Status -->
+ <last_ds> 0 </last_ds>
+ <value> NaN </value>
+ <unknown_sec> 3 </unknown_sec>
+ </ds>
+ ";
+ $ds_arr[] = " <ds>
+ <name> inblock6 </name>
+ <type> COUNTER </type>
+ <minimal_heartbeat> {$valid} </minimal_heartbeat>
+ <min> 0.0000000000e+00 </min>
+ <max> 1.2500000000e+08 </max>
+
+ <!-- PDP Status -->
+ <last_ds> 0 </last_ds>
+ <value> NaN </value>
+ <unknown_sec> 3 </unknown_sec>
+ </ds>
+ ";
+ $ds_arr[] = " <ds>
+ <name> outblock6 </name>
+ <type> COUNTER </type>
+ <minimal_heartbeat> {$valid} </minimal_heartbeat>
+ <min> 0.0000000000e+00 </min>
+ <max> 1.2500000000e+08 </max>
+
+ <!-- PDP Status -->
+ <last_ds> 0 </last_ds>
+ <value> NaN </value>
+ <unknown_sec> 3 </unknown_sec>
+ </ds>
+ ";
+
+ $cdp_search = "<\/cdp_prep>";
+ $cdp_replace = "</cdp_prep>";
+ $cdp_arr = array();
+ $cdp_arr[] = " <ds>
+ <primary_value> NaN </primary_value>
+ <secondary_value> 0.0000000000e+00 </secondary_value>
+ <value> NaN </value>
+ <unknown_datapoints> 0 </unknown_datapoints>
+ </ds>
+ ";
+ $cdp_arr[] = " <ds>
+ <primary_value> NaN </primary_value>
+ <secondary_value> 0.0000000000e+00 </secondary_value>
+ <value> NaN </value>
+ <unknown_datapoints> 0 </unknown_datapoints>
+ </ds>
+ ";
+ $cdp_arr[] = " <ds>
+ <primary_value> NaN </primary_value>
+ <secondary_value> 0.0000000000e+00 </secondary_value>
+ <value> NaN </value>
+ <unknown_datapoints> 0 </unknown_datapoints>
+ </ds>
+ ";
+ $cdp_arr[] = " <ds>
+ <primary_value> NaN </primary_value>
+ <secondary_value> 0.0000000000e+00 </secondary_value>
+ <value> NaN </value>
+ <unknown_datapoints> 0 </unknown_datapoints>
+ </ds>
+ ";
+
+ $value_search = "<\/row>";
+ $value_replace = "</row>";
+ $value = "<v> NaN </v>";
+
+ $xml = file_get_contents("{$g['tmp_path']}/{$xmldump}");
+ foreach ($ds_arr as $ds) {
+ $xml = preg_replace("/$ds_search/s", "$ds{$ds_search}", $xml);
+ }
+ foreach ($cdp_arr as $cdp) {
+ $xml = preg_replace("/$cdp_search/s", "$cdp{$cdp_replace}", $xml);
+ }
+ foreach ($ds_arr as $ds) {
+ $xml = preg_replace("/$value_search/s", "$value{$value_replace}", $xml);
+ }
+
+ file_put_contents("{$g['tmp_path']}/{$xmldumpnew}", $xml);
+ mwexec("$rrdtool restore -f {$g['tmp_path']}/{$xmldumpnew} {$rrddbpath}/{$database} 2>&1");
+ unset($xml);
+ # Default /tmp tmpfs is ~40mb, do not leave temp files around
+ unlink_if_exists("{$g['tmp_path']}/{$xmldump}");
+ unlink_if_exists("{$g['tmp_path']}/{$xmldumpnew}");
+ }
+ if (!platform_booting()) {
+ enable_rrd_graphing();
+ }
+ /* Let's save the RRD graphs after we run enable RRD graphing */
+ /* The function will restore the rrd.tgz so we will save it after */
+ exec("cd /; LANG=C NO_REMOUNT=1 RRDDBPATH='{$rrddbpath}' CF_CONF_PATH='{$g['cf_conf_path']}' /etc/rc.backup_rrd.sh");
+ if (platform_booting()) {
+ echo "Updating configuration...";
+ }
+ foreach ($config['filter']['rule'] as & $rule) {
+ if (isset($rule['protocol']) && !empty($rule['protocol'])) {
+ $rule['protocol'] = strtolower($rule['protocol']);
+ }
+ }
+ unset($rule);
+}
+
+function upgrade_081_to_082() {
+ /* don't enable the allow IPv6 toggle */
+}
+
+function upgrade_082_to_083() {
+ global $config;
+
+ /* Upgrade captiveportal config */
+ if (!empty($config['captiveportal'])) {
+ $tmpcp = $config['captiveportal'];
+ $config['captiveportal'] = array();
+ $config['captiveportal']['cpzone'] = array();
+ $config['captiveportal']['cpzone'] = $tmpcp;
+ $config['captiveportal']['cpzone']['zoneid'] = 8000;
+ $config['captiveportal']['cpzone']['zone'] = "cpzone";
+ if ($config['captiveportal']['cpzone']['auth_method'] == "radius") {
+ $config['captiveportal']['cpzone']['radius_protocol'] = "PAP";
+ }
+ }
+ if (!empty($config['voucher'])) {
+ $tmpcp = $config['voucher'];
+ $config['voucher'] = array();
+ $config['voucher']['cpzone'] = array();
+ $config['voucher']['cpzone'] = $tmpcp;
+ }
+}
+
+function upgrade_083_to_084() {
+ global $config;
+ if (!isset($config['hasync'])) {
+ if (!empty($config['installedpackages']) &&
+ !empty($config['installedpackages']['carpsettings']) &&
+ !empty($config['installedpackages']['carpsettings']['config'])) {
+ $config['hasync'] = $config['installedpackages']['carpsettings']['config'][0];
+ unset($config['installedpackages']['carpsettings']);
+ }
+ if (empty($config['installedpackages']['carpsettings'])) {
+ unset($config['installedpackages']['carpsettings']);
+ }
+ if (empty($config['installedpackages'])) {
+ unset($config['installedpackages']);
+ }
+ }
+}
+
+function upgrade_084_to_085() {
+ global $config;
+
+ $gateway_group_arr = array();
+ $gateways = return_gateways_array();
+ $oldnames = array();
+ /* setup translation array */
+ foreach ($gateways as $name => $gw) {
+ if (isset($gw['dynamic'])) {
+ $oldname = strtoupper($config['interfaces'][$gw['friendlyiface']]['descr']);
+ $oldnames[$oldname] = $name;
+ } else {
+ $oldnames[$name] = $name;
+ }
+ }
+
+ /* process the old array */
+ if (is_array($config['gateways']['gateway_group'])) {
+ $group_array_new = array();
+ foreach ($config['gateways']['gateway_group'] as $name => $group) {
+ if (is_array($group['item'])) {
+ $newlist = array();
+ foreach ($group['item'] as $entry) {
+ $elements = explode("|", $entry);
+ if ($oldnames[$elements[0]] <> "") {
+ $newlist[] = "{$oldnames[$elements[0]]}|{$elements[1]}";
+ } else {
+ $newlist[] = "{$elements[0]}|{$elements[1]}";
+ }
+ }
+ $group['item'] = $newlist;
+ $group_array_new[$name] = $group;
+ }
+ }
+ $config['gateways']['gateway_group'] = $group_array_new;
+ }
+ /* rename old Quality RRD files in the process */
+ $rrddbpath = "/var/db/rrd";
+ foreach ($oldnames as $old => $new) {
+ if (is_readable("{$rrddbpath}/{$old}-quality.rrd")) {
+ @rename("{$rrddbpath}/{$old}-quality.rrd", "{$rrddbpath}/{$new}-quality.rrd");
+ }
+ }
+ unset($gateways, $oldnames, $gateway_group_arr);
+}
+
+function upgrade_085_to_086() {
+ global $config, $g;
+
+ /* XXX: Gross hacks in sight */
+ if (is_array($config['virtualip']['vip'])) {
+ $vipchg = array();
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['mode'] != "carp") {
+ continue;
+ }
+ $config = array_replace_values_recursive(
+ $config,
+ '^vip' . $vip['vhid'] . '$',
+ "{$vip['interface']}_vip{$vip['vhid']}"
+ );
+ }
+ }
+}
+
+function upgrade_086_to_087() {
+ global $config, $dummynet_pipe_list;
+
+ if (!is_array($config['dnshaper']) || !is_array($config['dnshaper']['queue'])) {
+ return;
+ }
+
+ $dnqueue_number = 1;
+ $dnpipe_number = 1;
+
+ foreach ($config['dnshaper']['queue'] as $idx => $dnpipe) {
+ $config['dnshaper']['queue'][$idx]['number'] = $dnpipe_number;
+ $dnpipe_number++;
+ if (is_array($dnpipe['queue'])) {
+ foreach ($dnpipe['queue'] as $qidx => $dnqueue) {
+ $config['dnshaper']['queue'][$idx]['queue'][$qidx]['number'] = $dnqueue_number;
+ $dnqueue_number++;
+ }
+ }
+ }
+
+ unset($dnqueue_number, $dnpipe_number, $qidx, $idx, $dnpipe, $dnqueue);
+
+ if (!is_array($config['filter']) || !is_array($config['filter']['rule'])) {
+ return;
+ }
+
+ require_once("shaper.inc");
+ read_dummynet_config();
+
+ $dn_list = array();
+ if (is_array($dummynet_pipe_list)) {
+ foreach ($dummynet_pipe_list as $dn) {
+ $tmplist =& $dn->get_queue_list();
+ foreach ($tmplist as $qname => $link) {
+ $dn_list[$link] = $qname;
+ }
+ }
+ unset($dummynet_pipe_list);
+ }
+
+ foreach ($config['filter']['rule'] as $idx => $rule) {
+ if (!empty($rule['dnpipe'])) {
+ if (!empty($dn_list[$rule['dnpipe']])) {
+ $config['filter']['rule'][$idx]['dnpipe'] = $dn_list[$rule['dnpipe']];
+ }
+ }
+ if (!empty($rule['pdnpipe'])) {
+ if (!empty($dn_list[$rule['pdnpipe']])) {
+ $config['filter']['rule'][$idx]['pdnpipe'] = $dn_list[$rule['pdnpipe']];
+ }
+ }
+ }
+}
+function upgrade_087_to_088() {
+ global $config;
+ if (isset($config['system']['glxsb_enable'])) {
+ unset($config['system']['glxsb_enable']);
+ $config['system']['crypto_hardware'] = "glxsb";
+ }
+}
+
+function upgrade_088_to_089() {
+ global $config;
+ if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+ }
+ if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+ }
+
+ /* migrate captive portal ssl to certificate manager */
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $id => &$setting) {
+ if (isset($setting['httpslogin'])) {
+ /* create cert entry */
+ $cert = array();
+ $cert['refid'] = uniqid();
+ $cert['descr'] = "Captive Portal Cert - {$setting['zone']}";
+ $cert['crt'] = $setting['certificate'];
+ $cert['prv'] = $setting['private-key'];
+
+ if (!empty($setting['cacertificate'])) {
+ /* create ca entry */
+ $ca = array();
+ $ca['refid'] = uniqid();
+ $ca['descr'] = "Captive Portal CA - {$setting['zone']}";
+ $ca['crt'] = $setting['cacertificate'];
+ $config['ca'][] = $ca;
+
+ /* add ca reference to certificate */
+ $cert['caref'] = $ca['refid'];
+ }
+
+ $config['cert'][] = $cert;
+
+ /* create cert reference */
+ $setting['certref'] = $cert['refid'];
+
+ unset($setting['certificate']);
+ unset($setting['private-key']);
+ unset($setting['cacertificate']);
+
+ }
+ }
+ }
+}
+
+function upgrade_089_to_090() {
+ global $config;
+ if (is_array($config['load_balancer']['virtual_server']) && count($config['load_balancer']['virtual_server'])) {
+ $vs_a = &$config['load_balancer']['virtual_server'];
+ for ($i = 0; isset($vs_a[$i]); $i++) {
+ if (is_array($vs_a[$i]['pool'])) {
+ $vs_a[$i]['poolname'] = $vs_a[$i]['pool'][0];
+ unset($vs_a[$i]['pool']);
+ } elseif (!empty($vs_a[$i]['pool'])) {
+ $vs_a[$i]['poolname'] = $vs_a[$i]['pool'];
+ unset($vs_a[$i]['pool']);
+ }
+ }
+ }
+}
+
+function upgrade_090_to_091() {
+ global $config;
+
+ if (is_array($config['dnshaper']) && is_array($config['dnshaper']['queue'])) {
+ foreach ($config['dnshaper']['queue'] as $idx => $dnqueue) {
+ if (!empty($dnqueue['bandwidth'])) {
+ $bw = array();
+ $bw['bw'] = $dnqueue['bandwidth'];
+ $bw['bwscale'] = $dnqueue['bandwidthtype'];
+ $bw['bwsched'] = "none";
+ $config['dnshaper']['queue'][$idx]['bandwidth'] = array();
+ $config['dnshaper']['queue'][$idx]['bandwidth']['item'] = array();
+ $config['dnshaper']['queue'][$idx]['bandwidth']['item'][] = $bw;
+ }
+ }
+ }
+}
+
+function upgrade_091_to_092() {
+ global $config;
+
+ if (is_array($config['nat']['advancedoutbound']) && is_array($config['nat']['advancedoutbound']['rule'])) {
+ $nat_rules = &$config['nat']['advancedoutbound']['rule'];
+ for ($i = 0; isset($nat_rules[$i]); $i++) {
+ if (empty($nat_rules[$i]['interface'])) {
+ $nat_rules[$i]['interface'] = 'wan';
+ }
+ }
+ }
+}
+
+function upgrade_092_to_093() {
+ global $g;
+
+ $suffixes = array("concurrent", "loggedin");
+
+ foreach ($suffixes as $suffix) {
+ if (file_exists("{$g['vardb_path']}/rrd/captiveportal-{$suffix}.rrd")) {
+ rename("{$g['vardb_path']}/rrd/captiveportal-{$suffix}.rrd",
+ "{$g['vardb_path']}/rrd/captiveportal-cpZone-{$suffix}.rrd");
+ }
+ }
+
+ if (!platform_booting()) {
+ enable_rrd_graphing();
+ }
+}
+
+function upgrade_093_to_094() {
+ global $config;
+
+ if (isset($config['system']['powerd_mode'])) {
+ $config['system']['powerd_ac_mode'] = $config['system']['powerd_mode'];
+ $config['system']['powerd_battery_mode'] = $config['system']['powerd_mode'];
+ unset($config['system']['powerd_mode']);
+ }
+}
+
+function upgrade_094_to_095() {
+ global $config;
+
+ if (!isset($config['interfaces']) || !is_array($config['interfaces'])) {
+ return;
+ }
+
+ foreach ($config['interfaces'] as $iface => $cfg) {
+ if (isset($cfg['ipaddrv6']) && ($cfg['ipaddrv6'] == "track6")) {
+ if (!isset($cfg['track6-prefix-id']) || ($cfg['track6-prefix-id'] == "")) {
+ $config['interfaces'][$iface]['track6-prefix-id'] = 0;
+ }
+ }
+ }
+}
+
+function upgrade_095_to_096() {
+ global $config, $g;
+
+ $names = array("inpass", "outpass", "inblock", "outblock",
+ "inpass6", "outpass6", "inblock6", "outblock6");
+ $rrddbpath = "/var/db/rrd";
+ $rrdtool = "/usr/local/bin/rrdtool";
+
+ if ($g['platform'] != "pfSense") {
+ /* restore the databases, if we have one */
+ if (restore_rrd()) {
+ /* Make sure to move the rrd backup out of the way. We will make a new one after converting. */
+ @rename("{$g['cf_conf_path']}/rrd.tgz", "{$g['cf_conf_path']}/backup/rrd.tgz");
+ }
+ }
+
+ /* Assume 2*10GigE for now */
+ $stream = 2500000000;
+
+ /* build a list of traffic and packets databases */
+ $databases = return_dir_as_array($rrddbpath, '/-(traffic|packets)\.rrd$/');
+ rsort($databases);
+ foreach ($databases as $database) {
+ if (platform_booting()) {
+ echo "Update RRD database {$database}.\n";
+ }
+
+ $cmd = "{$rrdtool} tune {$rrddbpath}/{$database}";
+ foreach ($names as $name) {
+ $cmd .= " -a {$name}:{$stream}";
+ }
+ mwexec("{$cmd} 2>&1");
+
+ }
+ if (!platform_booting()) {
+ enable_rrd_graphing();
+ }
+ /* Let's save the RRD graphs after we run enable RRD graphing */
+ /* The function will restore the rrd.tgz so we will save it after */
+ exec("cd /; LANG=C NO_REMOUNT=1 RRDDBPATH='{$rrddbpath}' CF_CONF_PATH='{$g['cf_conf_path']}' /etc/rc.backup_rrd.sh");
+}
+
+function upgrade_096_to_097() {
+ global $config, $g;
+ /* If the user had disabled default block rule logging before, then bogon/private network logging was already off, so respect their choice. */
+ if (isset($config['syslog']['nologdefaultblock'])) {
+ $config['syslog']['nologbogons'] = true;
+ $config['syslog']['nologprivatenets'] = true;
+ }
+}
+
+function upgrade_097_to_098() {
+ global $config, $g;
+ /* Disable kill_states by default */
+ $config['system']['kill_states'] = true;
+}
+
+function upgrade_098_to_099() {
+ global $config;
+
+ if (empty($config['dhcpd']) || !is_array($config['dhcpd'])) {
+ return;
+ }
+
+ foreach ($config['dhcpd'] as & $dhcpifconf) {
+ if (isset($dhcpifconf['next-server'])) {
+ $dhcpifconf['nextserver'] = $dhcpifconf['next-server'];
+ unset($dhcpifconf['next-server']);
+ }
+ }
+}
+
+function upgrade_099_to_100() {
+ require_once("/etc/inc/services.inc");
+ install_cron_job("/usr/bin/nice -n20 newsyslog", false);
+}
+
+function upgrade_100_to_101() {
+ global $config, $g;
+
+ if (!is_array($config['voucher'])) {
+ return;
+ }
+
+ foreach ($config['voucher'] as $cpzone => $cp) {
+ if (!is_array($cp['roll'])) {
+ continue;
+ }
+ foreach ($cp['roll'] as $ridx => $rcfg) {
+ if (!empty($rcfg['comment'])) {
+ $config['voucher'][$cpzone]['roll'][$ridx]['descr'] = $rcfg['comment'];
+ }
+ }
+ }
+}
+
+function upgrade_101_to_102() {
+ global $config, $g;
+
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cpzone => $cp) {
+ if (!is_array($cp['passthrumac'])) {
+ continue;
+ }
+
+ foreach ($cp['passthrumac'] as $idx => $passthrumac) {
+ $config['captiveportal'][$cpzone]['passthrumac'][$idx]['action'] = 'pass';
+ }
+ }
+ }
+
+ /* Convert OpenVPN Compression option to the new style */
+ // Nothing to do if there is no OpenVPN tag
+ if (isset($config['openvpn']) && is_array($config['openvpn'])) {
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as &$vpn) {
+ if (!empty($vpn['compression'])) {
+ $vpn['compression'] = "adaptive";
+ }
+ }
+ }
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as &$vpn) {
+ if (!empty($vpn['compression'])) {
+ $vpn['compression'] = "adaptive";
+ }
+ }
+ }
+ }
+}
+
+function upgrade_102_to_103() {
+ global $config;
+
+ if (isset($config['nat']['advancedoutbound']['enable'])) {
+ $config['nat']['advancedoutbound']['mode'] = "advanced";
+ unset($config['nat']['advancedoutbound']['enable']);
+ } else {
+ $config['nat']['advancedoutbound']['mode'] = "automatic";
+ }
+
+ $config['nat']['outbound'] = $config['nat']['advancedoutbound'];
+
+ unset($config['nat']['ipsecpassthru']);
+ unset($config['nat']['advancedoutbound']);
+}
+
+function upgrade_103_to_104() {
+ global $config;
+
+ $changed_privs = array(
+ "page-diag-system-activity" => "page-diagnostics-system-activity",
+ "page-interfacess-groups" => "page-interfaces-groups",
+ "page-interfacess-lagg" => "page-interfaces-lagg",
+ "page-interfacess-qinq" => "page-interfaces-qinq"
+ );
+
+ /* update user privileges */
+ foreach ($config['system']['user'] as & $user) {
+ if (!is_array($user['priv'])) {
+ continue;
+ }
+ foreach ($user['priv'] as & $priv) {
+ if (array_key_exists($priv, $changed_privs)) {
+ $priv = $changed_privs[$priv];
+ }
+ }
+ }
+
+ /* update group privileges */
+ foreach ($config['system']['group'] as & $group) {
+ if (!is_array($group['priv'])) {
+ continue;
+ }
+ foreach ($group['priv'] as & $priv) {
+ if (array_key_exists($priv, $changed_privs)) {
+ $priv = $changed_privs[$priv];
+ }
+ }
+ }
+
+ /* sync all local account information */
+ local_sync_accounts();
+}
+
+function upgrade_104_to_105() {
+ global $config;
+
+ if (is_array($config['captiveportal'])) {
+ $zoneid = 2;
+ foreach ($config['captiveportal'] as $cpzone => $cpcfg) {
+ if (empty($cpcfg['zoneid'])) {
+ $config['captiveportal'][$cpzone]['zoneid'] = $zoneid;
+ $zoneid += 2;
+ } else if ($cpcfg['zoneid'] > 4000) {
+ $config['captiveportal'][$cpzone]['zoneid'] = $zoneid;
+ $zoneid += 2;
+ }
+ }
+ }
+}
+
+function upgrade_105_to_106() {
+
+ /* NOTE: This entry can be reused for something else since the upgrade code was reverted */
+}
+
+function upgrade_106_to_107() {
+ global $config;
+
+ if (is_array($config['filter']) && is_array($config['filter']['rule'])) {
+ $tracker = (int)microtime(true);
+ foreach ($config['filter']['rule'] as $ridx => $rule) {
+ if (empty($rule['tracker'])) {
+ $config['filter']['rule'][$ridx]['tracker'] = $tracker;
+ $tracker++;
+ }
+ }
+ unset($tracker, $ridx);
+ }
+ if (is_array($config['nat']) && is_array($config['nat']['rule'])) {
+ $tracker = (int)microtime(true);
+ foreach ($config['nat']['rule'] as $ridx => $rule) {
+ if (empty($rule['tracker'])) {
+ $config['nat']['rule'][$ridx]['tracker'] = $tracker;
+ $tracker++;
+ }
+ }
+ unset($tracker, $ridx);
+ }
+}
+
+function upgrade_107_to_108() {
+ global $config;
+
+ if (isset($config['system']['webgui']['noautocomplete'])) {
+ unset($config['system']['webgui']['noautocomplete']);
+ } else {
+ $config['system']['webgui']['loginautocomplete'] = true;
+ }
+}
+
+function upgrade_108_to_109() {
+ global $config;
+
+ if (!isset($config['filter']['rule']) || !is_array($config['filter']['rule'])) {
+ return;
+ }
+
+ foreach ($config['filter']['rule'] as &$rule) {
+ if (!isset($rule['dscp']) || empty($rule['dscp'])) {
+ continue;
+ }
+
+ $pos = strpos($rule['dscp'], ' ');
+ if ($pos !== false) {
+ $rule['dscp'] = substr($rule['dscp'], 0, $pos);
+ }
+ unset($pos);
+ }
+}
+
+function upgrade_109_to_110() {
+ global $config;
+
+ if (!is_array($config['ipsec']) || !is_array($config['ipsec']['phase2'])) {
+ return;
+ }
+
+ foreach ($config['ipsec']['phase2'] as &$rule) {
+ if (!empty($rule['uniqid'])) {
+ continue;
+ }
+
+ $rule['uniqid'] = uniqid();
+ }
+}
+
+function upgrade_110_to_111() {
+ global $config;
+
+ /* Make sure unbound user exist */
+ mwexec('/usr/sbin/pw groupadd -n unbound -g 59', true);
+ mwexec('/usr/sbin/pw useradd -n unbound -c "Unbound DNS Resolver" -d /var/unbound -s /usr/sbin/nologin -u 59 -g 59', true);
+
+ /* cleanup old unbound package stuffs */
+ unlink_if_exists("/usr/local/pkg/unbound.xml");
+ unlink_if_exists("/usr/local/pkg/unbound.inc");
+ unlink_if_exists("/usr/local/pkg/unbound_advanced.xml");
+ unlink_if_exists("/usr/local/www/unbound_status.php");
+ unlink_if_exists("/usr/local/www/unbound_acls.php");
+ unlink_if_exists("/usr/local/bin/unbound_monitor.sh");
+ unlink_if_exists("/usr/local/etc/rc.d/unbound.sh");
+
+ /* Remove old menu and service entries */
+ if (isset($config['installedpackages']['menu']) && is_array($config['installedpackages']['menu'])) {
+ foreach ($config['installedpackages']['menu'] as $idx => $menu) {
+ if ($menu['name'] != 'Unbound DNS') {
+ continue;
+ }
+
+ unset($config['installedpackages']['menu'][$idx]);
+ break;
+ }
+ }
+
+ if (isset($config['installedpackages']['service']) && is_array($config['installedpackages']['service'])) {
+ foreach ($config['installedpackages']['service'] as $idx => $service) {
+ if ($service['name'] != 'unbound') {
+ continue;
+ }
+ unset($config['installedpackages']['service'][$idx]);
+ break;
+ }
+ }
+
+ if (!isset($config['installedpackages']['unbound']['config'][0])) {
+ return;
+ }
+
+ $pkg = $config['installedpackages']['unbound']['config'][0];
+
+ if (isset($config['installedpackages']['unboundadvanced']['config'][0])) {
+ $pkg = array_merge($pkg, $config['installedpackages']['unboundadvanced']['config'][0]);
+ }
+
+ $new = array();
+
+ /* deal first with boolean fields */
+ $fields = array(
+ "enable" => "enable",
+ "dnssec_status" => "dnssec",
+ "forwarding_mode" => "forwarding",
+ "regdhcp" => "regdhcp",
+ "regdhcpstatic" => "regdhcpstatic",
+ "txtsupport" => "txtsupport",
+ "hide_id" => "hideidentity",
+ "hide_version" => "hideversion",
+ "prefetch" => "prefetch",
+ "prefetch_key" => "prefetchkey",
+ "harden_glue" => "hardenglue",
+ "harden_dnssec_stripped" => "dnssec_stripped");
+
+ foreach ($fields as $oldk => $newk) {
+ if (isset($pkg[$oldk])) {
+ if ($pkg[$oldk] == 'on') {
+ $new[$newk] = true;
+ }
+ unset($pkg[$oldk]);
+ }
+ }
+
+ $fields = array(
+ "active_interface" => "network_interface",
+ "query_interface" => "outgoing_interface",
+ "unbound_verbosity" => "log_verbosity",
+ "unbound_verbosity" => "log_verbosity",
+ "msg_cache_size" => "msgcachesize",
+ "outgoing_num_tcp" => "outgoing_num_tcp",
+ "incoming_num_tcp" => "incoming_num_tcp",
+ "edns_buffer_size" => "edns_buffer_size",
+ "num_queries_per_thread" => "num_queries_per_thread",
+ "jostle_timeout" => "jostle_timeout",
+ "cache_max_ttl" => "cache_max_ttl",
+ "cache_min_ttl" => "cache_min_ttl",
+ "infra_host_ttl" => "infra_host_ttl",
+ "infra_cache_numhosts" => "infra_cache_numhosts",
+ "unwanted_reply_threshold" => "unwanted_reply_threshold",
+ "custom_options" => "custom_options");
+
+ foreach ($fields as $oldk => $newk) {
+ if (isset($pkg[$oldk])) {
+ $new[$newk] = $pkg[$oldk];
+ unset($pkg[$oldk]);
+ }
+ }
+
+ if (isset($new['custom_options']) && !empty($new['custom_options'])) {
+ $new['custom_options'] = str_replace("\r\n", "\n", $new['custom_options']);
+ }
+
+ /* Following options were removed, bring them as custom_options */
+ if (isset($pkg['stats']) && $pkg['stats'] == "on") {
+ if (isset($pkg['stats_interval'])) {
+ $new['custom_options'] .= (empty($new['custom_options']) ? "" : "\n") . "statistics-interval: {$pkg['stats_interval']}";
+ }
+ if (isset($pkg['cumulative_stats'])) {
+ $new['custom_options'] .= (empty($new['custom_options']) ? "" : "\n") . "statistics-cumulative: {$pkg['cumulative_stats']}";
+ }
+ if (isset($pkg['extended_stats']) && $pkg['extended_stats'] == "on") {
+ $new['custom_options'] .= (empty($new['custom_options']) ? "" : "\n") . "extended-statistics: yes";
+ } else {
+ $new['custom_options'] .= (empty($new['custom_options']) ? "" : "\n") . "extended-statistics: no";
+ }
+ }
+
+ $new['acls'] = array();
+ if (isset($config['installedpackages']['unboundacls']['config']) &&
+ is_array($config['installedpackages']['unboundacls']['config'])) {
+ foreach ($config['installedpackages']['unboundacls']['config'] as $acl) {
+ $new['acls'][] = $acl;
+ }
+ }
+
+ $config['unbound'] = $new;
+
+ if (isset($config['installedpackages']['unbound'])) {
+ unset($config['installedpackages']['unbound']);
+ }
+ if (isset($config['installedpackages']['unboundadvanced'])) {
+ unset($config['installedpackages']['unboundadvanced']);
+ }
+ if (isset($config['installedpackages']['unboundacls'])) {
+ unset($config['installedpackages']['unboundacls']);
+ }
+
+ unset($pkg, $new);
+}
+
+function upgrade_111_to_112() {
+ global $config;
+
+ $config['cron']['item'][] = array(
+ 'minute' => '*/60',
+ 'hour' => '*',
+ 'mday' => '*',
+ 'month' => '*',
+ 'wday' => '*',
+ 'who' => 'root',
+ 'command' => '/usr/bin/nice -n20 /usr/local/sbin/expiretable -v -t 3600 webConfiguratorlockout'
+ );
+}
+
+function upgrade_112_to_113() {
+ global $config;
+
+ if (isset($config['notifications']['smtp']['ssl']) &&
+ $config['notifications']['smtp']['ssl'] == "checked") {
+ $config['notifications']['smtp']['ssl'] = true;
+ } else {
+ unset($config['notifications']['smtp']['ssl']);
+ }
+
+ if (isset($config['notifications']['smtp']['tls']) &&
+ $config['notifications']['smtp']['tls'] == "checked") {
+ $config['notifications']['smtp']['tls'] = true;
+ } else {
+ unset($config['notifications']['smtp']['tls']);
+ }
+}
+
+function upgrade_113_to_114() {
+ global $config;
+
+ if (!isset($config['ipsec']['phase1']) ||
+ !is_array($config['ipsec']['phase1'])) {
+ return;
+ }
+
+ foreach ($config['ipsec']['phase1'] as &$ph1ent) {
+ if (!isset($ph1ent['iketype'])) {
+ $ph1ent['iketype'] = 'ikev1';
+ }
+ }
+}
+
+function upgrade_114_to_115() {
+ global $config;
+
+ if (isset($config['unbound']['custom_options'])) {
+ $config['unbound']['custom_options'] = base64_encode($config['unbound']['custom_options']);
+ }
+}
+
+function upgrade_115_to_116() {
+ global $config;
+
+ if (!is_array($config['ipsec']) || !is_array($config['ipsec']['phase2'])) {
+ return;
+ }
+
+ $keyid = 1;
+ foreach ($config['ipsec']['phase2'] as $idx => $ph2) {
+ $config['ipsec']['phase2'][$idx]['reqid'] = $keyid;
+ $keyid++;
+ }
+}
+
+function upgrade_116_to_117() {
+ global $config;
+
+ if (!isset($config['ipsec']['client']) ||
+ !isset($config['ipsec']['client']['dns_split']) ||
+ empty($config['ipsec']['client']['dns_split'])) {
+ return;
+ }
+
+ $config['ipsec']['client']['dns_split'] =
+ preg_replace('/\s*,\s*/', ' ', trim($config['ipsec']['client']['dns_split']));
+
+}
+
+function upgrade_117_to_118() {
+ global $config;
+
+ // Unset any old CA and Cert in the system section that might still be there from when upgrade_066_to_067 did not unset them.
+ if (isset($config['system']['ca'])) {
+ unset($config['system']['ca']);
+ }
+ if (isset($config['system']['cert'])) {
+ unset($config['system']['cert']);
+ }
+
+ if (!isset($config['ipsec']['phase1'])) {
+ return;
+ }
+
+ $a_phase1 =& $config['ipsec']['phase1'];
+
+ foreach ($a_phase1 as &$ph1_entry) {
+ // update asn1dn strings from racoon's format to strongswan's
+ if (isset($ph1_entry['myid_type']) && $ph1_entry['myid_type'] == 'asn1dn') {
+ $ph1_entry['myid_data'] =
+ preg_replace('/\/\s*emailAddress\s*=\s*/', ', E=', $ph1_entry['myid_data']);
+ }
+ if (isset($ph1_entry['peerid_type']) && $ph1_entry['peerid_type'] == 'asn1dn') {
+ $ph1_entry['peerid_data'] =
+ preg_replace('/\/\s*emailAddress\s*=\s*/', ', E=', $ph1_entry['peerid_data']);
+ }
+ // iketype 'auto' was removed and is really v2, update accordingly
+ if ($ph1_entry['iketype'] == "auto") {
+ $ph1_entry['iketype'] = "ikev2";
+ }
+ }
+}
+
+function upgrade_118_to_119() {
+ global $config;
+
+ if (!isset($config['ipsec']['phase1'])) {
+ return;
+ }
+
+ // change peerid_type to 'any' for EAP types to retain previous behavior of omitting rightid
+ $a_phase1 =& $config['ipsec']['phase1'];
+
+ foreach ($a_phase1 as &$ph1_entry) {
+ if (strstr($ph1_entry['authentication_method'], 'eap')) {
+ $ph1_entry['peerid_type'] = "any";
+ }
+ }
+}
+
+function upgrade_119_to_120() {
+ global $config;
+
+ if (!isset($config['installedpackages']['miniupnpd']['config'][0])) {
+ return;
+ }
+
+ $miniupnpd =& $config['installedpackages']['miniupnpd']['config'][0];
+
+ $miniupnpd['row'] = array();
+
+ for ($i = 1; $i <= 4; $i++) {
+ if (isset($miniupnpd["permuser{$i}"]) && !empty($miniupnpd["permuser{$i}"])) {
+ $miniupnpd['row'][] = array('permuser' => $miniupnpd["permuser{$i}"]);
+ }
+ unset($miniupnpd["permuser{$i}"]);
+ }
+}
+
+?>
diff --git a/src/etc/inc/util.inc b/src/etc/inc/util.inc
new file mode 100644
index 0000000..b2c797b
--- /dev/null
+++ b/src/etc/inc/util.inc
@@ -0,0 +1,2259 @@
+<?php
+/*
+ util.inc
+ part of the pfSense project (https://www.pfsense.org)
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /bin/ps /bin/kill /usr/bin/killall /sbin/ifconfig /usr/bin/netstat
+ pfSense_BUILDER_BINARIES: /usr/bin/awk /sbin/dmesg /sbin/ping /usr/local/sbin/gzsig /usr/sbin/arp
+ pfSense_BUILDER_BINARIES: /sbin/conscontrol /sbin/devd /bin/ps
+ pfSense_MODULE: utils
+*/
+
+/* kill a process by pid file */
+function killbypid($pidfile) {
+ return sigkillbypid($pidfile, "TERM");
+}
+
+function isvalidpid($pidfile) {
+ $output = "";
+ if (file_exists($pidfile)) {
+ exec("/bin/pgrep -nF {$pidfile}", $output, $retval);
+ return (intval($retval) == 0);
+ }
+ return false;
+}
+
+function is_process_running($process) {
+ $output = "";
+ exec("/bin/pgrep -anx " . escapeshellarg($process), $output, $retval);
+
+ return (intval($retval) == 0);
+}
+
+function isvalidproc($proc) {
+ return is_process_running($proc);
+}
+
+/* sigkill a process by pid file */
+/* return 1 for success and 0 for a failure */
+function sigkillbypid($pidfile, $sig) {
+ if (file_exists($pidfile)) {
+ return mwexec("/bin/pkill " . escapeshellarg("-{$sig}") . " -F {$pidfile}", true);
+ }
+
+ return 0;
+}
+
+/* kill a process by name */
+function sigkillbyname($procname, $sig) {
+ if (isvalidproc($procname)) {
+ return mwexec("/usr/bin/killall " . escapeshellarg("-{$sig}") . " " . escapeshellarg($procname), true);
+ }
+}
+
+/* kill a process by name */
+function killbyname($procname) {
+ if (isvalidproc($procname)) {
+ mwexec("/usr/bin/killall " . escapeshellarg($procname));
+ }
+}
+
+function is_subsystem_dirty($subsystem = "") {
+ global $g;
+
+ if ($subsystem == "") {
+ return false;
+ }
+
+ if (file_exists("{$g['varrun_path']}/{$subsystem}.dirty")) {
+ return true;
+ }
+
+ return false;
+}
+
+function mark_subsystem_dirty($subsystem = "") {
+ global $g;
+
+ if (!file_put_contents("{$g['varrun_path']}/{$subsystem}.dirty", "DIRTY")) {
+ log_error(sprintf(gettext("WARNING: Could not mark subsystem: %s dirty"), $subsystem));
+ }
+}
+
+function clear_subsystem_dirty($subsystem = "") {
+ global $g;
+
+ @unlink("{$g['varrun_path']}/{$subsystem}.dirty");
+}
+
+function config_lock() {
+ return;
+}
+function config_unlock() {
+ return;
+}
+
+/* lock configuration file */
+function lock($lock, $op = LOCK_SH) {
+ global $g, $cfglckkeyconsumers;
+ if (!$lock) {
+ die(gettext("WARNING: You must give a name as parameter to lock() function."));
+ }
+ if (!file_exists("{$g['tmp_path']}/{$lock}.lock")) {
+ @touch("{$g['tmp_path']}/{$lock}.lock");
+ @chmod("{$g['tmp_path']}/{$lock}.lock", 0666);
+ }
+ $cfglckkeyconsumers++;
+ if ($fp = fopen("{$g['tmp_path']}/{$lock}.lock", "w")) {
+ if (flock($fp, $op)) {
+ return $fp;
+ } else {
+ fclose($fp);
+ }
+ }
+}
+
+function try_lock($lock, $timeout = 5) {
+ global $g, $cfglckkeyconsumers;
+ if (!$lock) {
+ die(gettext("WARNING: You must give a name as parameter to try_lock() function."));
+ }
+ if (!file_exists("{$g['tmp_path']}/{$lock}.lock")) {
+ @touch("{$g['tmp_path']}/{$lock}.lock");
+ @chmod("{$g['tmp_path']}/{$lock}.lock", 0666);
+ }
+ $cfglckkeyconsumers++;
+ if ($fp = fopen("{$g['tmp_path']}/{$lock}.lock", "w")) {
+ $trycounter = 0;
+ while (!flock($fp, LOCK_EX | LOCK_NB)) {
+ if ($trycounter >= $timeout) {
+ fclose($fp);
+ return NULL;
+ }
+ sleep(1);
+ $trycounter++;
+ }
+
+ return $fp;
+ }
+
+ return NULL;
+}
+
+/* unlock configuration file */
+function unlock($cfglckkey = 0) {
+ global $g, $cfglckkeyconsumers;
+ flock($cfglckkey, LOCK_UN);
+ fclose($cfglckkey);
+ return;
+}
+
+/* unlock forcefully configuration file */
+function unlock_force($lock) {
+ global $g;
+
+ @unlink("{$g['tmp_path']}/{$lock}.lock");
+}
+
+function send_event($cmd) {
+ global $g;
+
+ if (!isset($g['event_address'])) {
+ $g['event_address'] = "unix:///var/run/check_reload_status";
+ }
+
+ $try = 0;
+ while ($try < 3) {
+ $fd = @fsockopen($g['event_address']);
+ if ($fd) {
+ fwrite($fd, $cmd);
+ $resp = fread($fd, 4096);
+ if ($resp != "OK\n") {
+ log_error("send_event: sent {$cmd} got {$resp}");
+ }
+ fclose($fd);
+ $try = 3;
+ } else if (!is_process_running("check_reload_status")) {
+ mwexec_bg("/usr/bin/nice -n20 /usr/local/sbin/check_reload_status");
+ }
+ $try++;
+ }
+}
+
+function send_multiple_events($cmds) {
+ global $g;
+
+ if (!isset($g['event_address'])) {
+ $g['event_address'] = "unix:///var/run/check_reload_status";
+ }
+
+ if (!is_array($cmds)) {
+ return;
+ }
+
+ while ($try < 3) {
+ $fd = @fsockopen($g['event_address']);
+ if ($fd) {
+ foreach ($cmds as $cmd) {
+ fwrite($fd, $cmd);
+ $resp = fread($fd, 4096);
+ if ($resp != "OK\n") {
+ log_error("send_event: sent {$cmd} got {$resp}");
+ }
+ }
+ fclose($fd);
+ $try = 3;
+ } else if (!is_process_running("check_reload_status")) {
+ mwexec_bg("/usr/bin/nice -n20 /usr/local/sbin/check_reload_status");
+ }
+ $try++;
+ }
+}
+
+function refcount_init($reference) {
+ $shmid = @shmop_open($reference, "c", 0644, 10);
+ @shmop_write($shmid, str_pad("0", 10, "\x0", STR_PAD_RIGHT), 0);
+ @shmop_close($shmid);
+}
+
+function refcount_reference($reference) {
+ /* Take out a lock across the shared memory read, increment, write sequence to make it atomic. */
+ $shm_lck = lock("shm{$reference}", LOCK_EX);
+ try {
+ /* NOTE: A warning is generated when shared memory does not exist */
+ $shmid = @shmop_open($reference, "w", 0, 0);
+ if (!$shmid) {
+ refcount_init($reference);
+ $shmid = @shmop_open($reference, "w", 0, 0);
+ if (!$shmid) {
+ log_error(gettext("Could not open shared memory {$reference}"));
+ unlock($shm_lck);
+ return;
+ }
+ }
+ $shm_data = @shmop_read($shmid, 0, 10);
+ $shm_data = intval($shm_data) + 1;
+ @shmop_write($shmid, str_pad($shm_data, 10, "\x0", STR_PAD_RIGHT), 0);
+ @shmop_close($shmid);
+ unlock($shm_lck);
+ } catch (Exception $e) {
+ log_error($e->getMessage());
+ unlock($shm_lck);
+ }
+
+ return $shm_data;
+}
+
+function refcount_unreference($reference) {
+ /* Take out a lock across the shared memory read, decrement, write sequence to make it atomic. */
+ $shm_lck = lock("shm{$reference}", LOCK_EX);
+ try {
+ $shmid = @shmop_open($reference, "w", 0, 0);
+ if (!$shmid) {
+ refcount_init($reference);
+ log_error(gettext("Could not open shared memory {$reference}"));
+ unlock($shm_lck);
+ return;
+ }
+ $shm_data = @shmop_read($shmid, 0, 10);
+ $shm_data = intval($shm_data) - 1;
+ if ($shm_data < 0) {
+ //debug_backtrace();
+ log_error(sprintf(gettext("Reference %s is going negative, not doing unreference."), $reference));
+ } else {
+ @shmop_write($shmid, str_pad($shm_data, 10, "\x0", STR_PAD_RIGHT), 0);
+ }
+ @shmop_close($shmid);
+ unlock($shm_lck);
+ } catch (Exception $e) {
+ log_error($e->getMessage());
+ unlock($shm_lck);
+ }
+
+ return $shm_data;
+}
+
+function refcount_read($reference) {
+ /* This function just reads the current value of the refcount for information. */
+ /* There is no need for locking. */
+ $shmid = @shmop_open($reference, "a", 0, 0);
+ if (!$shmid) {
+ log_error(gettext("Could not open shared memory for read {$reference}"));
+ return -1;
+ }
+ $shm_data = @shmop_read($shmid, 0, 10);
+ @shmop_close($shmid);
+ return $shm_data;
+}
+
+function is_module_loaded($module_name) {
+ $module_name = str_replace(".ko", "", $module_name);
+ $running = 0;
+ $_gb = exec("/sbin/kldstat -qn {$module_name} 2>&1", $_gb, $running);
+ if (intval($running) == 0) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/* validate non-negative numeric string, or equivalent numeric variable */
+function is_numericint($arg) {
+ return (((is_int($arg) && $arg >= 0) || (is_string($arg) && strlen($arg) > 0 && ctype_digit($arg))) ? true : false);
+}
+
+/* Generate the (human readable) ipv4 or ipv6 subnet address (i.e., netmask, or subnet start IP)
+ given an (human readable) ipv4 or ipv6 host address and subnet bit count */
+function gen_subnet($ipaddr, $bits) {
+ if (($sn = gen_subnetv6($ipaddr, $bits)) == '') {
+ $sn = gen_subnetv4($ipaddr, $bits); // try to avoid rechecking IPv4/v6
+ }
+ return $sn;
+}
+
+/* same as gen_subnet() but accepts IPv4 only */
+function gen_subnetv4($ipaddr, $bits) {
+ if (is_ipaddrv4($ipaddr) && is_numericint($bits) && $bits <= 32) {
+ if ($bits == 0) {
+ return '0.0.0.0'; // avoids <<32
+ }
+ return long2ip(ip2long($ipaddr) & ((0xFFFFFFFF << (32 - $bits)) & 0xFFFFFFFF));
+ }
+ return "";
+}
+
+/* same as gen_subnet() but accepts IPv6 only */
+function gen_subnetv6($ipaddr, $bits) {
+ if (is_ipaddrv6($ipaddr) && is_numericint($bits) && $bits <= 128) {
+ return Net_IPv6::compress(Net_IPv6::getNetmask($ipaddr, $bits));
+ }
+ return "";
+}
+
+/* Generate the (human readable) ipv4 or ipv6 subnet end address (i.e., highest address, end IP, or IPv4 broadcast address)
+ given an (human readable) ipv4 or ipv6 host address and subnet bit count. */
+function gen_subnet_max($ipaddr, $bits) {
+ if (($sn = gen_subnetv6_max($ipaddr, $bits)) == '') {
+ $sn = gen_subnetv4_max($ipaddr, $bits); // try to avoid rechecking IPv4/v6
+ }
+ return $sn;
+}
+
+/* same as gen_subnet_max() but validates IPv4 only */
+function gen_subnetv4_max($ipaddr, $bits) {
+ if (is_ipaddrv4($ipaddr) && is_numericint($bits) && $bits <= 32) {
+ if ($bits == 32) {
+ return $ipaddr;
+ }
+ return long2ip32(ip2long($ipaddr) | ~gen_subnet_mask_long($bits));
+ }
+ return "";
+}
+
+/* same as gen_subnet_max() but validates IPv6 only */
+function gen_subnetv6_max($ipaddr, $bits) {
+ if (is_ipaddrv6($ipaddr) && is_numericint($bits) && $bits <= 128) {
+ $endip_bin = substr(Net_IPv6::_ip2Bin($ipaddr), 0, $bits) . str_repeat('1', 128 - $bits);
+ return Net_IPv6::compress(Net_IPv6::_bin2Ip($endip_bin));
+ }
+ return "";
+}
+
+/* returns a subnet mask (long given a bit count) */
+function gen_subnet_mask_long($bits) {
+ $sm = 0;
+ for ($i = 0; $i < $bits; $i++) {
+ $sm >>= 1;
+ $sm |= 0x80000000;
+ }
+ return $sm;
+}
+
+/* same as above but returns a string */
+function gen_subnet_mask($bits) {
+ return long2ip(gen_subnet_mask_long($bits));
+}
+
+/* Convert long int to IP address, truncating to 32-bits. */
+function long2ip32($ip) {
+ return long2ip($ip & 0xFFFFFFFF);
+}
+
+/* Convert IP address to long int, truncated to 32-bits to avoid sign extension on 64-bit platforms. */
+function ip2long32($ip) {
+ return (ip2long($ip) & 0xFFFFFFFF);
+}
+
+/* Convert IP address to unsigned long int. */
+function ip2ulong($ip) {
+ return sprintf("%u", ip2long32($ip));
+}
+
+/* Find out how many IPs are contained within a given IP range
+ * e.g. 192.168.0.0 to 192.168.0.255 returns 256
+ */
+function ip_range_size_v4($startip, $endip) {
+ if (is_ipaddrv4($startip) && is_ipaddrv4($endip)) {
+ // Operate as unsigned long because otherwise it wouldn't work
+ // when crossing over from 127.255.255.255 / 128.0.0.0 barrier
+ return abs(ip2ulong($startip) - ip2ulong($endip)) + 1;
+ }
+ return -1;
+}
+
+/* Find the smallest possible subnet mask which can contain a given number of IPs
+ * e.g. 512 IPs can fit in a /23, but 513 IPs need a /22
+ */
+function find_smallest_cidr_v4($number) {
+ $smallest = 1;
+ for ($b=32; $b > 0; $b--) {
+ $smallest = ($number <= pow(2, $b)) ? $b : $smallest;
+ }
+ return (32-$smallest);
+}
+
+/* Return the previous IP address before the given address */
+function ip_before($ip, $offset = 1) {
+ return long2ip32(ip2long($ip) - $offset);
+}
+
+/* Return the next IP address after the given address */
+function ip_after($ip, $offset = 1) {
+ return long2ip32(ip2long($ip) + $offset);
+}
+
+/* Return true if the first IP is 'before' the second */
+function ip_less_than($ip1, $ip2) {
+ // Compare as unsigned long because otherwise it wouldn't work when
+ // crossing over from 127.255.255.255 / 128.0.0.0 barrier
+ return ip2ulong($ip1) < ip2ulong($ip2);
+}
+
+/* Return true if the first IP is 'after' the second */
+function ip_greater_than($ip1, $ip2) {
+ // Compare as unsigned long because otherwise it wouldn't work
+ // when crossing over from 127.255.255.255 / 128.0.0.0 barrier
+ return ip2ulong($ip1) > ip2ulong($ip2);
+}
+
+/* compare two IP addresses */
+function ipcmp($a, $b) {
+ if (ip_less_than($a, $b)) {
+ return -1;
+ } else if (ip_greater_than($a, $b)) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+/* Convert a range of IPv4 addresses to an array of individual addresses. */
+/* Note: IPv6 ranges are not yet supported here. */
+function ip_range_to_address_array($startip, $endip, $max_size = 5000) {
+ if (!is_ipaddrv4($startip) || !is_ipaddrv4($endip)) {
+ return false;
+ }
+
+ if (ip_greater_than($startip, $endip)) {
+ // Swap start and end so we can process sensibly.
+ $temp = $startip;
+ $startip = $endip;
+ $endip = $temp;
+ }
+
+ if (ip_range_size_v4($startip, $endip) > $max_size) {
+ return false;
+ }
+
+ // Container for IP addresses within this range.
+ $rangeaddresses = array();
+ $end_int = ip2ulong($endip);
+ for ($ip_int = ip2ulong($startip); $ip_int <= $end_int; $ip_int++) {
+ $rangeaddresses[] = long2ip($ip_int);
+ }
+
+ return $rangeaddresses;
+}
+
+/* Convert a range of IPv4 addresses to an array of subnets which can contain the range. */
+/* Note: IPv6 ranges are not yet supported here. */
+function ip_range_to_subnet_array($startip, $endip) {
+ if (!is_ipaddrv4($startip) || !is_ipaddrv4($endip)) {
+ return array();
+ }
+
+ if (ip_greater_than($startip, $endip)) {
+ // Swap start and end so we can process sensibly.
+ $temp = $startip;
+ $startip = $endip;
+ $endip = $temp;
+ }
+
+ // Container for subnets within this range.
+ $rangesubnets = array();
+
+ // Figure out what the smallest subnet is that holds the number of IPs in the given range.
+ $cidr = find_smallest_cidr_v4(ip_range_size_v4($startip, $endip));
+
+ // Loop here to reduce subnet size and retest as needed. We need to make sure
+ // that the target subnet is wholly contained between $startip and $endip.
+ for ($cidr; $cidr <= 32; $cidr++) {
+ // Find the network and broadcast addresses for the subnet being tested.
+ $targetsub_min = gen_subnet($startip, $cidr);
+ $targetsub_max = gen_subnet_max($startip, $cidr);
+
+ // Check best case where the range is exactly one subnet.
+ if (($targetsub_min == $startip) && ($targetsub_max == $endip)) {
+ // Hooray, the range is exactly this subnet!
+ return array("{$startip}/{$cidr}");
+ }
+
+ // These remaining scenarios will find a subnet that uses the largest
+ // chunk possible of the range being tested, and leave the rest to be
+ // tested recursively after the loop.
+
+ // Check if the subnet begins with $startip and ends before $endip
+ if (($targetsub_min == $startip) && ip_less_than($targetsub_max, $endip)) {
+ break;
+ }
+
+ // Check if the subnet ends at $endip and starts after $startip
+ if (ip_greater_than($targetsub_min, $startip) && ($targetsub_max == $endip)) {
+ break;
+ }
+
+ // Check if the subnet is between $startip and $endip
+ if (ip_greater_than($targetsub_min, $startip) && ip_less_than($targetsub_max, $endip)) {
+ break;
+ }
+ }
+
+ // Some logic that will recursively search from $startip to the first IP before the start of the subnet we just found.
+ // NOTE: This may never be hit, the way the above algo turned out, but is left for completeness.
+ if ($startip != $targetsub_min) {
+ $rangesubnets = array_merge($rangesubnets, ip_range_to_subnet_array($startip, ip_before($targetsub_min)));
+ }
+
+ // Add in the subnet we found before, to preserve ordering
+ $rangesubnets[] = "{$targetsub_min}/{$cidr}";
+
+ // And some more logic that will search after the subnet we found to fill in to the end of the range.
+ if ($endip != $targetsub_max) {
+ $rangesubnets = array_merge($rangesubnets, ip_range_to_subnet_array(ip_after($targetsub_max), $endip));
+ }
+ return $rangesubnets;
+}
+
+/* returns true if $range is a valid pair of IPv4 or IPv6 addresses separated by a "-"
+ false - if not a valid pair
+ true (numeric 4 or 6) - if valid, gives type of addresses */
+function is_iprange($range) {
+ if (substr_count($range, '-') != 1) {
+ return false;
+ }
+ list($ip1, $ip2) = explode ('-', $range);
+ if (is_ipaddrv4($ip1) && is_ipaddrv4($ip2)) {
+ return 4;
+ }
+ if (is_ipaddrv6($ip1) && is_ipaddrv6($ip2)) {
+ return 6;
+ }
+ return false;
+}
+
+/* returns true if $ipaddr is a valid dotted IPv4 address or a IPv6
+ false - not valid
+ true (numeric 4 or 6) - if valid, gives type of address */
+function is_ipaddr($ipaddr) {
+ if (is_ipaddrv4($ipaddr)) {
+ return 4;
+ }
+ if (is_ipaddrv6($ipaddr)) {
+ return 6;
+ }
+ return false;
+}
+
+/* returns true if $ipaddr is a valid IPv6 address */
+function is_ipaddrv6($ipaddr) {
+ if (!is_string($ipaddr) || empty($ipaddr)) {
+ return false;
+ }
+ if (strstr($ipaddr, "%") && is_linklocal($ipaddr)) {
+ $tmpip = explode("%", $ipaddr);
+ $ipaddr = $tmpip[0];
+ }
+ return Net_IPv6::checkIPv6($ipaddr);
+}
+
+/* returns true if $ipaddr is a valid dotted IPv4 address */
+function is_ipaddrv4($ipaddr) {
+ if (!is_string($ipaddr) || empty($ipaddr) || ip2long($ipaddr) === FALSE) {
+ return false;
+ }
+ return true;
+}
+
+/* returns true if $ipaddr is a valid IPv6 linklocal address */
+function is_linklocal($ipaddr) {
+ return (strtolower(substr($ipaddr, 0, 5)) == "fe80:");
+}
+
+/* returns scope of a linklocal address */
+function get_ll_scope($addr) {
+ if (!is_linklocal($addr) || !strstr($addr, "%")) {
+ return "";
+ }
+ list ($ll, $scope) = explode("%", $addr);
+ return $scope;
+}
+
+/* returns true if $ipaddr is a valid literal IPv6 address */
+function is_literalipaddrv6($ipaddr) {
+ if (preg_match("/\[([0-9a-f:]+)\]/i", $ipaddr, $match)) {
+ $ipaddr = $match[1];
+ } else {
+ return false;
+ }
+
+ return is_ipaddrv6($ipaddr);
+}
+
+/* returns true if $iport is a valid IPv4/IPv6 address + port
+ false - not valid
+ true (numeric 4 or 6) - if valid, gives type of address */
+function is_ipaddrwithport($ipport) {
+ $c = strrpos($ipport, ":");
+ if ($c === false) {
+ return false; // can't split at final colon if no colon exists
+ }
+
+ if (!is_port(substr($ipport, $c + 1))) {
+ return false; // no valid port after last colon
+ }
+
+ $ip = substr($ipport, 0, $c); // else is text before last colon a valid IP
+ if (is_literalipaddrv6($ip)) {
+ return 6;
+ } elseif (is_ipaddrv4($ip)) {
+ return 4;
+ } else {
+ return false;
+ }
+}
+
+function is_hostnamewithport($hostport) {
+ $parts = explode(":", $hostport);
+ $port = array_pop($parts);
+ if (count($parts) == 1) {
+ return is_hostname($parts[0]) && is_port($port);
+ } else {
+ return false;
+ }
+}
+
+/* returns true if $ipaddr is a valid dotted IPv4 address or an alias thereof */
+function is_ipaddroralias($ipaddr) {
+ global $config;
+
+ if (is_alias($ipaddr)) {
+ if (is_array($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $alias) {
+ if ($alias['name'] == $ipaddr && !preg_match("/port/i", $alias['type'])) {
+ return true;
+ }
+ }
+ }
+ return false;
+ } else {
+ return is_ipaddr($ipaddr);
+ }
+
+}
+
+/* returns true if $subnet is a valid IPv4 or IPv6 subnet in CIDR format
+ false - if not a valid subnet
+ true (numeric 4 or 6) - if valid, gives type of subnet */
+function is_subnet($subnet) {
+ if (is_string($subnet) && preg_match('/^(?:([0-9.]{7,15})|([0-9a-f:]{2,39}))\/(\d{1,3})$/i', $subnet, $parts)) {
+ if (is_ipaddrv4($parts[1]) && $parts[3] <= 32) {
+ return 4;
+ }
+ if (is_ipaddrv6($parts[2]) && $parts[3] <= 128) {
+ return 6;
+ }
+ }
+ return false;
+}
+
+/* same as is_subnet() but accepts IPv4 only */
+function is_subnetv4($subnet) {
+ return (is_subnet($subnet) == 4);
+}
+
+/* same as is_subnet() but accepts IPv6 only */
+function is_subnetv6($subnet) {
+ return (is_subnet($subnet) == 6);
+}
+
+/* returns true if $subnet is a valid subnet in CIDR format or an alias thereof */
+function is_subnetoralias($subnet) {
+ global $aliastable;
+
+ if (isset($aliastable[$subnet]) && is_subnet($aliastable[$subnet])) {
+ return true;
+ } else {
+ return is_subnet($subnet);
+ }
+}
+
+function subnet_size($subnet) {
+ if (is_subnetv4($subnet)) {
+ list ($ip, $bits) = explode("/", $subnet);
+ return round(exp(log(2) * (32 - $bits)));
+ }
+ else if (is_subnetv6($subnet)) {
+ list ($ip, $bits) = explode("/", $subnet);
+ return round(exp(log(2) * (128 - $bits)));
+ }
+ else {
+ return 0;
+ }
+}
+
+
+function subnet_expand($subnet) {
+ if (is_subnetv4($subnet)) {
+ return subnetv4_expand($subnet);
+ } else if (is_subnetv6($subnet)) {
+ return subnetv6_expand($subnet);
+ } else {
+ return $subnet;
+ }
+}
+
+function subnetv4_expand($subnet) {
+ $result = array();
+ list ($ip, $bits) = explode("/", $subnet);
+ $net = ip2long($ip);
+ $mask = (0xffffffff << (32 - $bits));
+ $net &= $mask;
+ $size = round(exp(log(2) * (32 - $bits)));
+ for ($i = 0; $i < $size; $i += 1) {
+ $result[] = long2ip($net | $i);
+ }
+ return $result;
+}
+
+/* find out whether two subnets overlap */
+function check_subnets_overlap($subnet1, $bits1, $subnet2, $bits2) {
+
+ if (!is_numeric($bits1)) {
+ $bits1 = 32;
+ }
+ if (!is_numeric($bits2)) {
+ $bits2 = 32;
+ }
+
+ if ($bits1 < $bits2) {
+ $relbits = $bits1;
+ } else {
+ $relbits = $bits2;
+ }
+
+ $sn1 = gen_subnet_mask_long($relbits) & ip2long($subnet1);
+ $sn2 = gen_subnet_mask_long($relbits) & ip2long($subnet2);
+
+ return ($sn1 == $sn2);
+}
+
+/* find out whether two IPv6 subnets overlap */
+function check_subnetsv6_overlap($subnet1, $bits1, $subnet2, $bits2) {
+ $sub1_min = gen_subnetv6($subnet1, $bits1);
+ $sub1_max = gen_subnetv6_max($subnet1, $bits1);
+ $sub2_min = gen_subnetv6($subnet2, $bits2);
+ $sub2_max = gen_subnetv6_max($subnet2, $bits2);
+
+ return (is_inrange_v6($sub1_min, $sub2_min, $sub2_max) || is_inrange_v6($sub1_max, $sub2_min, $sub2_max) || is_inrange_v6($sub2_min, $sub1_min, $sub1_max));
+}
+
+/* return true if $addr is in $subnet, false if not */
+function ip_in_subnet($addr, $subnet) {
+ if (is_ipaddrv6($addr) && is_subnetv6($subnet)) {
+ return (Net_IPv6::isInNetmask($addr, $subnet));
+ } else if (is_ipaddrv4($addr) && is_subnetv4($subnet)) {
+ list($ip, $mask) = explode('/', $subnet);
+ $mask = (0xffffffff << (32 - $mask)) & 0xffffffff;
+ return ((ip2long($addr) & $mask) == (ip2long($ip) & $mask));
+ }
+ return false;
+}
+
+/* returns true if $hostname is just a valid hostname (top part without any of the domain part) */
+function is_unqualified_hostname($hostname) {
+ if (!is_string($hostname)) {
+ return false;
+ }
+
+ if (preg_match('/^(?:[a-z0-9_]|[a-z0-9_][a-z0-9_\-]*[a-z0-9_])$/i', $hostname)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/* returns true if $hostname is a valid hostname, with or without being a fully-qualified domain name. */
+function is_hostname($hostname) {
+ if (!is_string($hostname)) {
+ return false;
+ }
+
+ if (is_domain($hostname)) {
+ if ((substr_count($hostname, ".") == 1) && ($hostname[strlen($hostname)-1] == ".")) {
+ /* Only a single dot at the end like "test." - hosts cannot be directly in the root domain. */
+ return false;
+ } else {
+ return true;
+ }
+ } else {
+ return false;
+ }
+}
+
+/* returns true if $domain is a valid domain name */
+function is_domain($domain) {
+ if (!is_string($domain)) {
+ return false;
+ }
+
+ if (preg_match('/^(?:(?:[a-z_0-9]|[a-z_0-9][a-z_0-9\-]*[a-z_0-9])\.)*(?:[a-z_0-9]|[a-z_0-9][a-z_0-9\-]*[a-z_0-9\.])$/i', $domain)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/* returns true if $macaddr is a valid MAC address */
+function is_macaddr($macaddr, $partial=false) {
+ $repeat = ($partial) ? '1,5' : '5';
+ return preg_match('/^[0-9A-F]{2}(?:[:][0-9A-F]{2}){'.$repeat.'}$/i', $macaddr) == 1 ? true : false;
+}
+
+/* returns true if $name is a valid name for an alias
+ returns NULL if a reserved word is used
+ returns FALSE for bad chars in the name - this allows calling code to determine what the problem was.
+ aliases cannot be:
+ bad chars: anything except a-z 0-9 and underscore
+ bad names: empty string, pure numeric, pure underscore
+ reserved words: pre-defined service/protocol/port names which should not be ambiguous, and the words "port" and "pass" */
+
+function is_validaliasname($name) {
+ /* Array of reserved words */
+ $reserved = array("port", "pass");
+
+ if (!is_string($name) || strlen($name) >= 32 || preg_match('/(^_*$|^\d*$|[^a-z0-9_])/i', $name)) {
+ return false;
+ }
+ if (in_array($name, $reserved, true) || getservbyname($name, "tcp") || getservbyname($name, "udp") || getprotobyname($name)) {
+ return; /* return NULL */
+ }
+ return true;
+}
+
+/* returns true if $port is a valid TCP/UDP port */
+function is_port($port) {
+ if (ctype_digit($port) && ((intval($port) >= 1) && (intval($port) <= 65535))) {
+ return true;
+ }
+ if (getservbyname($port, "tcp") || getservbyname($port, "udp")) {
+ return true;
+ }
+ return false;
+}
+
+/* returns true if $portrange is a valid TCP/UDP portrange ("<port>:<port>") */
+function is_portrange($portrange) {
+ $ports = explode(":", $portrange);
+
+ return (count($ports) == 2 && is_port($ports[0]) && is_port($ports[1]));
+}
+
+/* returns true if $port is a valid port number or an alias thereof */
+function is_portoralias($port) {
+ global $config;
+
+ if (is_alias($port)) {
+ if (is_array($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $alias) {
+ if ($alias['name'] == $port && preg_match("/port/i", $alias['type'])) {
+ return true;
+ }
+ }
+ }
+ return false;
+ } else {
+ return is_port($port);
+ }
+}
+
+/* create ranges of sequential port numbers (200:215) and remove duplicates */
+function group_ports($ports) {
+ if (!is_array($ports) || empty($ports)) {
+ return;
+ }
+
+ $uniq = array();
+ foreach ($ports as $port) {
+ if (is_portrange($port)) {
+ list($begin, $end) = explode(":", $port);
+ if ($begin > $end) {
+ $aux = $begin;
+ $begin = $end;
+ $end = $aux;
+ }
+ for ($i = $begin; $i <= $end; $i++) {
+ if (!in_array($i, $uniq)) {
+ $uniq[] = $i;
+ }
+ }
+ } else if (is_port($port)) {
+ if (!in_array($port, $uniq)) {
+ $uniq[] = $port;
+ }
+ }
+ }
+ sort($uniq, SORT_NUMERIC);
+
+ $result = array();
+ foreach ($uniq as $idx => $port) {
+ if ($idx == 0) {
+ $result[] = $port;
+ continue;
+ }
+
+ $last = end($result);
+ if (is_portrange($last)) {
+ list($begin, $end) = explode(":", $last);
+ } else {
+ $begin = $end = $last;
+ }
+
+ if ($port == ($end+1)) {
+ $end++;
+ $result[count($result)-1] = "{$begin}:{$end}";
+ } else {
+ $result[] = $port;
+ }
+ }
+
+ return $result;
+}
+
+/* returns true if $val is a valid shaper bandwidth value */
+function is_valid_shaperbw($val) {
+ return (preg_match("/^(\d+(?:\.\d+)?)([MKG]?b|%)$/", $val));
+}
+
+/* returns true if $test is in the range between $start and $end */
+function is_inrange_v4($test, $start, $end) {
+ if ((ip2ulong($test) <= ip2ulong($end)) && (ip2ulong($test) >= ip2ulong($start))) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/* returns true if $test is in the range between $start and $end */
+function is_inrange_v6($test, $start, $end) {
+ if ((inet_pton($test) <= inet_pton($end)) && (inet_pton($test) >= inet_pton($start))) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/* returns true if $test is in the range between $start and $end */
+function is_inrange($test, $start, $end) {
+ return is_ipaddrv6($test) ? is_inrange_v6($test, $start, $end) : is_inrange_v4($test, $start, $end);
+}
+
+/* XXX: return the configured carp interface list */
+function get_configured_carp_interface_list($carpinterface = '', $family = 'inet', $what = 'ip') {
+ global $config;
+
+ $iflist = array();
+
+ if (is_array($config['virtualip']['vip'])) {
+ $viparr = &$config['virtualip']['vip'];
+ foreach ($viparr as $vip) {
+ switch ($vip['mode']) {
+ case "carp":
+ if (!empty($carpinterface)) {
+ if ($carpinterface == "_vip{$vip['uniqid']}") {
+ switch ($what) {
+ case 'subnet':
+ if ($family == 'inet' && is_ipaddrv4($vip['subnet'])) {
+ return $vip['subnet_bits'];
+ } else if ($family == 'inet6' && is_ipaddrv6($vip['subnet'])) {
+ return $vip['subnet_bits'];
+ }
+ break;
+ case 'iface':
+ if ($family == 'inet' && is_ipaddrv4($vip['subnet'])) {
+ return $vip['interface'];
+ } else if ($family == 'inet6' && is_ipaddrv6($vip['subnet'])) {
+ return $vip['interface'];
+ }
+ break;
+ case 'vip':
+ if ($family == 'inet' && is_ipaddrv4($vip['subnet'])) {
+ return $vip;
+ } else if ($family == 'inet6' && is_ipaddrv6($vip['subnet'])) {
+ return $vip;
+ }
+ break;
+ case 'ip':
+ default:
+ if ($family == 'inet' && is_ipaddrv4($vip['subnet'])) {
+ return $vip['subnet'];
+ } else if ($family == 'inet6' && is_ipaddrv6($vip['subnet'])) {
+ return $vip['subnet'];
+ }
+ break;
+ }
+ }
+ } else {
+ $iflist["_vip{$vip['uniqid']}"] = $vip['subnet'];
+ }
+ break;
+ }
+ }
+ }
+
+ return $iflist;
+}
+
+/* return the configured IP aliases list */
+function get_configured_ip_aliases_list($returnfullentry = false) {
+ global $config;
+
+ $alias_list = array();
+
+ if (is_array($config['virtualip']['vip'])) {
+ $viparr = &$config['virtualip']['vip'];
+ foreach ($viparr as $vip) {
+ if ($vip['mode'] == "ipalias") {
+ if ($returnfullentry) {
+ $alias_list[$vip['subnet']] = $vip;
+ } else {
+ $alias_list[$vip['subnet']] = $vip['interface'];
+ }
+ }
+ }
+ }
+
+ return $alias_list;
+}
+
+/* return all configured aliases list (IP, carp, proxyarp and other) */
+function get_configured_vips_list() {
+ global $config;
+
+ $alias_list = array();
+
+ if (is_array($config['virtualip']['vip'])) {
+ $viparr = &$config['virtualip']['vip'];
+ foreach ($viparr as $vip) {
+ if ($vip['mode'] == "carp") {
+ $alias_list[] = array("ipaddr" => $vip['subnet'], "if" => "{$vip['interface']}_vip{$vip['vhid']}");
+ } else {
+ $alias_list[] = array("ipaddr" => $vip['subnet'], "if" => $vip['interface']);
+ }
+ }
+ }
+
+ return $alias_list;
+}
+
+/* comparison function for sorting by the order in which interfaces are normally created */
+function compare_interface_friendly_names($a, $b) {
+ if ($a == $b) {
+ return 0;
+ } else if ($a == 'wan') {
+ return -1;
+ } else if ($b == 'wan') {
+ return 1;
+ } else if ($a == 'lan') {
+ return -1;
+ } else if ($b == 'lan') {
+ return 1;
+ }
+
+ return strnatcmp($a, $b);
+}
+
+/* return the configured interfaces list. */
+function get_configured_interface_list($only_opt = false, $withdisabled = false) {
+ global $config;
+
+ $iflist = array();
+
+ /* if list */
+ foreach ($config['interfaces'] as $if => $ifdetail) {
+ if ($only_opt && ($if == "wan" || $if == "lan")) {
+ continue;
+ }
+ if (isset($ifdetail['enable']) || $withdisabled == true) {
+ $iflist[$if] = $if;
+ }
+ }
+
+ return $iflist;
+}
+
+/* return the configured interfaces list. */
+function get_configured_interface_list_by_realif($only_opt = false, $withdisabled = false) {
+ global $config;
+
+ $iflist = array();
+
+ /* if list */
+ foreach ($config['interfaces'] as $if => $ifdetail) {
+ if ($only_opt && ($if == "wan" || $if == "lan")) {
+ continue;
+ }
+ if (isset($ifdetail['enable']) || $withdisabled == true) {
+ $tmpif = get_real_interface($if);
+ if (!empty($tmpif)) {
+ $iflist[$tmpif] = $if;
+ }
+ }
+ }
+
+ return $iflist;
+}
+
+/* return the configured interfaces list with their description. */
+function get_configured_interface_with_descr($only_opt = false, $withdisabled = false) {
+ global $config;
+
+ $iflist = array();
+
+ /* if list */
+ foreach ($config['interfaces'] as $if => $ifdetail) {
+ if ($only_opt && ($if == "wan" || $if == "lan")) {
+ continue;
+ }
+ if (isset($ifdetail['enable']) || $withdisabled == true) {
+ if (empty($ifdetail['descr'])) {
+ $iflist[$if] = strtoupper($if);
+ } else {
+ $iflist[$if] = strtoupper($ifdetail['descr']);
+ }
+ }
+ }
+
+ return $iflist;
+}
+
+/*
+ * get_configured_ip_addresses() - Return a list of all configured
+ * interfaces IP Addresses
+ *
+ */
+function get_configured_ip_addresses() {
+ global $config;
+
+ if (!function_exists('get_interface_ip')) {
+ require_once("interfaces.inc");
+ }
+ $ip_array = array();
+ $interfaces = get_configured_interface_list();
+ if (is_array($interfaces)) {
+ foreach ($interfaces as $int) {
+ $ipaddr = get_interface_ip($int);
+ $ip_array[$int] = $ipaddr;
+ }
+ }
+ $interfaces = get_configured_carp_interface_list();
+ if (is_array($interfaces)) {
+ foreach ($interfaces as $int => $ipaddr) {
+ $ip_array[$int] = $ipaddr;
+ }
+ }
+
+ /* pppoe server */
+ if (is_array($config['pppoes']) && is_array($config['pppoes']['pppoe'])) {
+ foreach ($config['pppoes']['pppoe'] as $pppoe) {
+ if ($pppoe['mode'] == "server") {
+ if (is_ipaddr($pppoe['localip'])) {
+ $int = "pppoes". $pppoe['pppoeid'];
+ $ip_array[$int] = $pppoe['localip'];
+ }
+ }
+ }
+ }
+
+ return $ip_array;
+}
+
+/*
+ * get_configured_ipv6_addresses() - Return a list of all configured
+ * interfaces IPv6 Addresses
+ *
+ */
+function get_configured_ipv6_addresses() {
+ require_once("interfaces.inc");
+ $ipv6_array = array();
+ $interfaces = get_configured_interface_list();
+ if (is_array($interfaces)) {
+ foreach ($interfaces as $int) {
+ $ipaddrv6 = get_interface_ipv6($int);
+ $ipv6_array[$int] = $ipaddrv6;
+ }
+ }
+ $interfaces = get_configured_carp_interface_list();
+ if (is_array($interfaces)) {
+ foreach ($interfaces as $int => $ipaddrv6) {
+ $ipv6_array[$int] = $ipaddrv6;
+ }
+ }
+ return $ipv6_array;
+}
+
+/*
+ * get_interface_list() - Return a list of all physical interfaces
+ * along with MAC and status.
+ *
+ * $mode = "active" - use ifconfig -lu
+ * "media" - use ifconfig to check physical connection
+ * status (much slower)
+ */
+function get_interface_list($mode = "active", $keyby = "physical", $vfaces = "") {
+ global $config;
+ $upints = array();
+ /* get a list of virtual interface types */
+ if (!$vfaces) {
+ $vfaces = array(
+ 'bridge',
+ 'ppp',
+ 'pppoe',
+ 'pptp',
+ 'l2tp',
+ 'sl',
+ 'gif',
+ 'gre',
+ 'faith',
+ 'lo',
+ 'ng',
+ '_vlan',
+ '_wlan',
+ 'pflog',
+ 'plip',
+ 'pfsync',
+ 'enc',
+ 'tun',
+ 'carp',
+ 'lagg',
+ 'vip',
+ 'ipfw'
+ );
+ }
+ switch ($mode) {
+ case "active":
+ $upints = pfSense_interface_listget(IFF_UP);
+ break;
+ case "media":
+ $intlist = pfSense_interface_listget();
+ $ifconfig = "";
+ exec("/sbin/ifconfig -a", $ifconfig);
+ $regexp = '/(' . implode('|', $intlist) . '):\s/';
+ $ifstatus = preg_grep('/status:/', $ifconfig);
+ foreach ($ifstatus as $status) {
+ $int = array_shift($intlist);
+ if (stristr($status, "active")) {
+ $upints[] = $int;
+ }
+ }
+ break;
+ default:
+ $upints = pfSense_interface_listget();
+ break;
+ }
+ /* build interface list with netstat */
+ $linkinfo = "";
+ exec("/usr/bin/netstat -inW -f link | awk '{ print $1, $4 }'", $linkinfo);
+ array_shift($linkinfo);
+ /* build ip address list with netstat */
+ $ipinfo = "";
+ exec("/usr/bin/netstat -inW -f inet | awk '{ print $1, $4 }'", $ipinfo);
+ array_shift($ipinfo);
+ foreach ($linkinfo as $link) {
+ $friendly = "";
+ $alink = explode(" ", $link);
+ $ifname = rtrim(trim($alink[0]), '*');
+ /* trim out all numbers before checking for vfaces */
+ if (!in_array(array_shift(preg_split('/\d/', $ifname)), $vfaces) &&
+ !stristr($ifname, "_vlan") && !stristr($ifname, "_wlan")) {
+ $toput = array(
+ "mac" => trim($alink[1]),
+ "up" => in_array($ifname, $upints)
+ );
+ foreach ($ipinfo as $ip) {
+ $aip = explode(" ", $ip);
+ if ($aip[0] == $ifname) {
+ $toput['ipaddr'] = $aip[1];
+ }
+ }
+ if (is_array($config['interfaces'])) {
+ foreach ($config['interfaces'] as $name => $int) {
+ if ($int['if'] == $ifname) {
+ $friendly = $name;
+ }
+ }
+ }
+ switch ($keyby) {
+ case "physical":
+ if ($friendly != "") {
+ $toput['friendly'] = $friendly;
+ }
+ $dmesg_arr = array();
+ exec("/sbin/dmesg |grep $ifname | head -n1", $dmesg_arr);
+ preg_match_all("/<(.*?)>/i", $dmesg_arr[0], $dmesg);
+ $toput['dmesg'] = $dmesg[1][0];
+ $iflist[$ifname] = $toput;
+ break;
+ case "ppp":
+
+ case "friendly":
+ if ($friendly != "") {
+ $toput['if'] = $ifname;
+ $iflist[$friendly] = $toput;
+ }
+ break;
+ }
+ }
+ }
+ return $iflist;
+}
+
+/****f* util/log_error
+* NAME
+* log_error - Sends a string to syslog.
+* INPUTS
+* $error - string containing the syslog message.
+* RESULT
+* null
+******/
+function log_error($error) {
+ global $g;
+ $page = $_SERVER['SCRIPT_NAME'];
+ if (empty($page)) {
+ $files = get_included_files();
+ $page = basename($files[0]);
+ }
+ syslog(LOG_ERR, "$page: $error");
+ if ($g['debug']) {
+ syslog(LOG_WARNING, var_dump(debug_backtrace()));
+ }
+ return;
+}
+
+/****f* util/log_auth
+* NAME
+* log_auth - Sends a string to syslog as LOG_AUTH facility
+* INPUTS
+* $error - string containing the syslog message.
+* RESULT
+* null
+******/
+function log_auth($error) {
+ global $g;
+ $page = $_SERVER['SCRIPT_NAME'];
+ syslog(LOG_AUTH, "$page: $error");
+ if ($g['debug']) {
+ syslog(LOG_WARNING, var_dump(debug_backtrace()));
+ }
+ return;
+}
+
+/****f* util/exec_command
+ * NAME
+ * exec_command - Execute a command and return a string of the result.
+ * INPUTS
+ * $command - String of the command to be executed.
+ * RESULT
+ * String containing the command's result.
+ * NOTES
+ * This function returns the command's stdout and stderr.
+ ******/
+function exec_command($command) {
+ $output = array();
+ exec($command . ' 2>&1', $output);
+ return(implode("\n", $output));
+}
+
+/* wrapper for exec() */
+function mwexec($command, $mute = false, $clearsigmask = false) {
+ global $g;
+
+ if ($g['debug']) {
+ if (!$_SERVER['REMOTE_ADDR']) {
+ echo "mwexec(): $command\n";
+ }
+ }
+ $oarr = array();
+ $retval = 0;
+
+ if ($clearsigmask) {
+ $oldset = array();
+ pcntl_sigprocmask(SIG_SETMASK, array(), $oldset);
+ }
+ $garbage = exec("$command 2>&1", $oarr, $retval);
+ if ($clearsigmask) {
+ pcntl_sigprocmask(SIG_SETMASK, $oldset);
+ }
+
+ if (isset($config['system']['developerspew'])) {
+ $mute = false;
+ }
+ if (($retval <> 0) && ($mute === false)) {
+ $output = implode(" ", $oarr);
+ log_error(sprintf(gettext("The command '%1\$s' returned exit code '%2\$d', the output was '%3\$s' "), $command, $retval, $output));
+ unset($output);
+ }
+ unset($oarr);
+ return $retval;
+}
+
+/* wrapper for exec() in background */
+function mwexec_bg($command, $clearsigmask = false) {
+ global $g;
+
+ if ($g['debug']) {
+ if (!$_SERVER['REMOTE_ADDR']) {
+ echo "mwexec(): $command\n";
+ }
+ }
+
+ if ($clearsigmask) {
+ $oldset = array();
+ pcntl_sigprocmask(SIG_SETMASK, array(), $oldset);
+ }
+ $_gb = exec("/usr/bin/nohup $command > /dev/null 2>&1 &");
+ if ($clearsigmask) {
+ pcntl_sigprocmask(SIG_SETMASK, $oldset);
+ }
+ unset($_gb);
+}
+
+/* unlink a file, if it exists */
+function unlink_if_exists($fn) {
+ $to_do = glob($fn);
+ if (is_array($to_do)) {
+ foreach ($to_do as $filename) {
+ @unlink($filename);
+ }
+ } else {
+ @unlink($fn);
+ }
+}
+/* make a global alias table (for faster lookups) */
+function alias_make_table($config) {
+ global $aliastable;
+
+ $aliastable = array();
+
+ if (is_array($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $alias) {
+ if ($alias['name']) {
+ $aliastable[$alias['name']] = $alias['address'];
+ }
+ }
+ }
+}
+
+/* check if an alias exists */
+function is_alias($name) {
+ global $aliastable;
+
+ return isset($aliastable[$name]);
+}
+
+function alias_get_type($name) {
+ global $config;
+
+ if (is_array($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $alias) {
+ if ($name == $alias['name']) {
+ return $alias['type'];
+ }
+ }
+ }
+
+ return "";
+}
+
+/* expand a host or network alias, if necessary */
+function alias_expand($name) {
+ global $aliastable;
+
+ if (isset($aliastable[$name])) {
+ // alias names cannot be strictly numeric. redmine #4289
+ if (is_numericint($name)) {
+ return null;
+ }
+ return "\${$name}";
+ } else if (is_ipaddr($name) || is_subnet($name) || is_port($name) || is_portrange($name)) {
+ return "{$name}";
+ } else {
+ return null;
+ }
+}
+
+function alias_expand_urltable($name) {
+ global $config;
+ $urltable_prefix = "/var/db/aliastables/";
+ $urltable_filename = $urltable_prefix . $name . ".txt";
+
+ if (is_array($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $alias) {
+ if (preg_match("/urltable/i", $alias['type']) && ($alias['name'] == $name)) {
+ if (is_URL($alias["url"]) && file_exists($urltable_filename) && filesize($urltable_filename)) {
+ return $urltable_filename;
+ } else {
+ send_event("service sync alias {$name}");
+ break;
+ }
+ }
+ }
+ }
+ return null;
+}
+
+/* verify (and remove) the digital signature on a file - returns 0 if OK */
+function verify_digital_signature($fname) {
+ global $g;
+
+ if (!file_exists("/usr/local/sbin/gzsig")) {
+ return 4;
+ }
+
+ return mwexec("/usr/local/sbin/gzsig verify {$g['etc_path']}/pubkey.pem < " . escapeshellarg($fname));
+}
+
+/* obtain MAC address given an IP address by looking at the ARP table */
+function arp_get_mac_by_ip($ip) {
+ mwexec("/sbin/ping -c 1 -t 1 " . escapeshellarg($ip), true);
+ $arpoutput = "";
+ exec("/usr/sbin/arp -n " . escapeshellarg($ip), $arpoutput);
+
+ if ($arpoutput[0]) {
+ $arpi = explode(" ", $arpoutput[0]);
+ $macaddr = $arpi[3];
+ if (is_macaddr($macaddr)) {
+ return $macaddr;
+ } else {
+ return false;
+ }
+ }
+
+ return false;
+}
+
+/* return a fieldname that is safe for xml usage */
+function xml_safe_fieldname($fieldname) {
+ $replace = array('/', '-', ' ', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
+ '_', '+', '=', '{', '}', '[', ']', '|', '/', '<', '>', '?',
+ ':', ',', '.', '\'', '\\'
+ );
+ return strtolower(str_replace($replace, "", $fieldname));
+}
+
+function mac_format($clientmac) {
+ global $config, $cpzone;
+
+ $mac = explode(":", $clientmac);
+ $mac_format = $cpzone ? $config['captiveportal'][$cpzone]['radmac_format'] : false;
+
+ switch ($mac_format) {
+ case 'singledash':
+ return "$mac[0]$mac[1]$mac[2]-$mac[3]$mac[4]$mac[5]";
+
+ case 'ietf':
+ return "$mac[0]-$mac[1]-$mac[2]-$mac[3]-$mac[4]-$mac[5]";
+
+ case 'cisco':
+ return "$mac[0]$mac[1].$mac[2]$mac[3].$mac[4]$mac[5]";
+
+ case 'unformatted':
+ return "$mac[0]$mac[1]$mac[2]$mac[3]$mac[4]$mac[5]";
+
+ default:
+ return $clientmac;
+ }
+}
+
+function resolve_retry($hostname, $retries = 5) {
+
+ if (is_ipaddr($hostname)) {
+ return $hostname;
+ }
+
+ for ($i = 0; $i < $retries; $i++) {
+ // FIXME: gethostbyname does not work for AAAA hostnames, boo, hiss
+ $ip = gethostbyname($hostname);
+
+ if ($ip && $ip != $hostname) {
+ /* success */
+ return $ip;
+ }
+
+ sleep(1);
+ }
+
+ return false;
+}
+
+function format_bytes($bytes) {
+ if ($bytes >= 1073741824) {
+ return sprintf("%.2f GB", $bytes/1073741824);
+ } else if ($bytes >= 1048576) {
+ return sprintf("%.2f MB", $bytes/1048576);
+ } else if ($bytes >= 1024) {
+ return sprintf("%.0f KB", $bytes/1024);
+ } else {
+ return sprintf("%d bytes", $bytes);
+ }
+}
+
+function update_filter_reload_status($text) {
+ global $g;
+
+ file_put_contents("{$g['varrun_path']}/filter_reload_status", $text);
+}
+
+/****** util/return_dir_as_array
+ * NAME
+ * return_dir_as_array - Return a directory's contents as an array.
+ * INPUTS
+ * $dir - string containing the path to the desired directory.
+ * $filter_regex - string containing a regular expression to filter file names. Default empty.
+ * RESULT
+ * $dir_array - array containing the directory's contents. This array will be empty if the path specified is invalid.
+ ******/
+function return_dir_as_array($dir, $filter_regex = '') {
+ $dir_array = array();
+ if (is_dir($dir)) {
+ if ($dh = opendir($dir)) {
+ while (($file = readdir($dh)) !== false) {
+ if (($file == ".") || ($file == "..")) {
+ continue;
+ }
+
+ if (empty($filter_regex) || preg_match($filter_regex, $file)) {
+ array_push($dir_array, $file);
+ }
+ }
+ closedir($dh);
+ }
+ }
+ return $dir_array;
+}
+
+function run_plugins($directory) {
+ global $config, $g;
+
+ /* process packager manager custom rules */
+ $files = return_dir_as_array($directory);
+ if (is_array($files)) {
+ foreach ($files as $file) {
+ if (stristr($file, ".sh") == true) {
+ mwexec($directory . $file . " start");
+ } else if (!is_dir($directory . "/" . $file) && stristr($file, ".inc")) {
+ require_once($directory . "/" . $file);
+ }
+ }
+ }
+}
+
+/*
+ * safe_mkdir($path, $mode = 0755)
+ * create directory if it doesn't already exist and isn't a file!
+ */
+function safe_mkdir($path, $mode = 0755) {
+ global $g;
+
+ if (!is_file($path) && !is_dir($path)) {
+ return @mkdir($path, $mode, true);
+ } else {
+ return false;
+ }
+}
+
+/*
+ * get_sysctl($names)
+ * Get values of sysctl OID's listed in $names (accepts an array or a single
+ * name) and return an array of key/value pairs set for those that exist
+ */
+function get_sysctl($names) {
+ if (empty($names)) {
+ return array();
+ }
+
+ if (is_array($names)) {
+ $name_list = array();
+ foreach ($names as $name) {
+ $name_list[] = escapeshellarg($name);
+ }
+ } else {
+ $name_list = array(escapeshellarg($names));
+ }
+
+ exec("/sbin/sysctl -i " . implode(" ", $name_list), $output);
+ $values = array();
+ foreach ($output as $line) {
+ $line = explode(": ", $line, 2);
+ if (count($line) == 2) {
+ $values[$line[0]] = $line[1];
+ }
+ }
+
+ return $values;
+}
+
+/*
+ * get_single_sysctl($name)
+ * Wrapper for get_sysctl() to simplify read of a single sysctl value
+ * return the value for sysctl $name or empty string if it doesn't exist
+ */
+function get_single_sysctl($name) {
+ if (empty($name)) {
+ return "";
+ }
+
+ $value = get_sysctl($name);
+ if (empty($value) || !isset($value[$name])) {
+ return "";
+ }
+
+ return $value[$name];
+}
+
+/*
+ * set_sysctl($value_list)
+ * Set sysctl OID's listed as key/value pairs and return
+ * an array with keys set for those that succeeded
+ */
+function set_sysctl($values) {
+ if (empty($values)) {
+ return array();
+ }
+
+ $value_list = array();
+ foreach ($values as $key => $value) {
+ $value_list[] = escapeshellarg($key) . "=" . escapeshellarg($value);
+ }
+
+ exec("/sbin/sysctl -i " . implode(" ", $value_list), $output, $success);
+
+ /* Retry individually if failed (one or more read-only) */
+ if ($success <> 0 && count($value_list) > 1) {
+ foreach ($value_list as $value) {
+ exec("/sbin/sysctl -i " . $value, $output);
+ }
+ }
+
+ $ret = array();
+ foreach ($output as $line) {
+ $line = explode(": ", $line, 2);
+ if (count($line) == 2) {
+ $ret[$line[0]] = true;
+ }
+ }
+
+ return $ret;
+}
+
+/*
+ * set_single_sysctl($name, $value)
+ * Wrapper to set_sysctl() to make it simple to set only one sysctl
+ * returns boolean meaning if it succeeded
+ */
+function set_single_sysctl($name, $value) {
+ if (empty($name)) {
+ return false;
+ }
+
+ $result = set_sysctl(array($name => $value));
+
+ if (!isset($result[$name]) || $result[$name] != $value) {
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * get_memory()
+ * returns an array listing the amount of
+ * memory installed in the hardware
+ * [0] net memory available for the OS (FreeBSD) after some is taken by BIOS, video or whatever - e.g. 235 MBytes
+ * [1] real (actual) memory of the system, should be the size of the RAM card/s - e.g. 256 MBytes
+ */
+function get_memory() {
+ $physmem = get_single_sysctl("hw.physmem");
+ $realmem = get_single_sysctl("hw.realmem");
+ /* convert from bytes to megabytes */
+ return array(($physmem/1048576), ($realmem/1048576));
+}
+
+function mute_kernel_msgs() {
+ global $g, $config;
+ // Do not mute serial console. The kernel gets very very cranky
+ // and will start dishing you cannot control tty errors.
+ if ($g['platform'] == 'nanobsd') {
+ return;
+ }
+ if ($config['system']['enableserial']) {
+ return;
+ }
+ exec("/sbin/conscontrol mute on");
+}
+
+function unmute_kernel_msgs() {
+ global $g;
+ // Do not mute serial console. The kernel gets very very cranky
+ // and will start dishing you cannot control tty errors.
+ if ($g['platform'] == 'nanobsd') {
+ return;
+ }
+ exec("/sbin/conscontrol mute off");
+}
+
+function start_devd() {
+ /* Use the undocumented -q options of devd to quiet its log spamming */
+ $_gb = exec("/sbin/devd -q");
+ sleep(1);
+ unset($_gb);
+}
+
+function is_interface_vlan_mismatch() {
+ global $config, $g;
+
+ if (is_array($config['vlans']['vlan'])) {
+ foreach ($config['vlans']['vlan'] as $vlan) {
+ if (does_interface_exist($vlan['if']) == false) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+function is_interface_mismatch() {
+ global $config, $g;
+
+ $do_assign = false;
+ $i = 0;
+ $missing_interfaces = array();
+ if (is_array($config['interfaces'])) {
+ foreach ($config['interfaces'] as $ifname => $ifcfg) {
+ if (preg_match("/^enc|^cua|^tun|^tap|^l2tp|^pptp|^ppp|^ovpn|^gif|^gre|^lagg|^bridge|vlan|_wlan/i", $ifcfg['if'])) {
+ // Do not check these interfaces.
+ $i++;
+ continue;
+ } else if (does_interface_exist($ifcfg['if']) == false) {
+ $missing_interfaces[] = $ifcfg['if'];
+ $do_assign = true;
+ } else {
+ $i++;
+ }
+ }
+ }
+
+ if (file_exists("{$g['tmp_path']}/assign_complete")) {
+ $do_assign = false;
+ }
+
+ if (!empty($missing_interfaces) && $do_assign) {
+ file_put_contents("{$g['tmp_path']}/missing_interfaces", implode(' ', $missing_interfaces));
+ } else {
+ @unlink("{$g['tmp_path']}/missing_interfaces");
+ }
+
+ return $do_assign;
+}
+
+/* sync carp entries to other firewalls */
+function carp_sync_client() {
+ global $g;
+ send_event("filter sync");
+}
+
+/****f* util/isAjax
+ * NAME
+ * isAjax - reports if the request is driven from prototype
+ * INPUTS
+ * none
+ * RESULT
+ * true/false
+ ******/
+function isAjax() {
+ return isset ($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
+}
+
+/****f* util/timeout
+ * NAME
+ * timeout - console input with timeout countdown. Note: erases 2 char of screen for timer. Leave space.
+ * INPUTS
+ * optional, seconds to wait before timeout. Default 9 seconds.
+ * RESULT
+ * returns 1 char of user input or null if no input.
+ ******/
+function timeout($timer = 9) {
+ while (!isset($key)) {
+ if ($timer >= 9) {
+ echo chr(8) . chr(8) . ($timer == 9 ? chr(32) : null) . "{$timer}";
+ } else {
+ echo chr(8). "{$timer}";
+ }
+ `/bin/stty -icanon min 0 time 25`;
+ $key = trim(`KEY=\`dd count=1 2>/dev/null\`; echo \$KEY`);
+ `/bin/stty icanon`;
+ if ($key == '') {
+ unset($key);
+ }
+ $timer--;
+ if ($timer == 0) {
+ break;
+ }
+ }
+ return $key;
+}
+
+/****f* util/msort
+ * NAME
+ * msort - sort array
+ * INPUTS
+ * $array to be sorted, field to sort by, direction of sort
+ * RESULT
+ * returns newly sorted array
+ ******/
+function msort($array, $id = "id", $sort_ascending = true) {
+ $temp_array = array();
+ while (count($array)>0) {
+ $lowest_id = 0;
+ $index = 0;
+ foreach ($array as $item) {
+ if (isset($item[$id])) {
+ if ($array[$lowest_id][$id]) {
+ if (strtolower($item[$id]) < strtolower($array[$lowest_id][$id])) {
+ $lowest_id = $index;
+ }
+ }
+ }
+ $index++;
+ }
+ $temp_array[] = $array[$lowest_id];
+ $array = array_merge(array_slice($array, 0, $lowest_id), array_slice($array, $lowest_id + 1));
+ }
+ if ($sort_ascending) {
+ return $temp_array;
+ } else {
+ return array_reverse($temp_array);
+ }
+}
+
+/****f* util/is_URL
+ * NAME
+ * is_URL
+ * INPUTS
+ * string to check
+ * RESULT
+ * Returns true if item is a URL
+ ******/
+function is_URL($url) {
+ $match = preg_match("'\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))'", $url);
+ if ($match) {
+ return true;
+ }
+ return false;
+}
+
+function is_file_included($file = "") {
+ $files = get_included_files();
+ if (in_array($file, $files)) {
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Replace a value on a deep associative array using regex
+ */
+function array_replace_values_recursive($data, $match, $replace) {
+ if (empty($data)) {
+ return $data;
+ }
+
+ if (is_string($data)) {
+ $data = preg_replace("/{$match}/", $replace, $data);
+ } else if (is_array($data)) {
+ foreach ($data as $k => $v) {
+ $data[$k] = array_replace_values_recursive($v, $match, $replace);
+ }
+ }
+
+ return $data;
+}
+
+/*
+ This function was borrowed from a comment on PHP.net at the following URL:
+ http://www.php.net/manual/en/function.array-merge-recursive.php#73843
+ */
+function array_merge_recursive_unique($array0, $array1) {
+
+ $arrays = func_get_args();
+ $remains = $arrays;
+
+ // We walk through each arrays and put value in the results (without
+ // considering previous value).
+ $result = array();
+
+ // loop available array
+ foreach ($arrays as $array) {
+
+ // The first remaining array is $array. We are processing it. So
+ // we remove it from remaining arrays.
+ array_shift($remains);
+
+ // We don't care non array param, like array_merge since PHP 5.0.
+ if (is_array($array)) {
+ // Loop values
+ foreach ($array as $key => $value) {
+ if (is_array($value)) {
+ // we gather all remaining arrays that have such key available
+ $args = array();
+ foreach ($remains as $remain) {
+ if (array_key_exists($key, $remain)) {
+ array_push($args, $remain[$key]);
+ }
+ }
+
+ if (count($args) > 2) {
+ // put the recursion
+ $result[$key] = call_user_func_array(__FUNCTION__, $args);
+ } else {
+ foreach ($value as $vkey => $vval) {
+ $result[$key][$vkey] = $vval;
+ }
+ }
+ } else {
+ // simply put the value
+ $result[$key] = $value;
+ }
+ }
+ }
+ }
+ return $result;
+}
+
+
+/*
+ * converts a string like "a,b,c,d"
+ * into an array like array("a" => "b", "c" => "d")
+ */
+function explode_assoc($delimiter, $string) {
+ $array = explode($delimiter, $string);
+ $result = array();
+ $numkeys = floor(count($array) / 2);
+ for ($i = 0; $i < $numkeys; $i += 1) {
+ $result[$array[$i * 2]] = $array[$i * 2 + 1];
+ }
+ return $result;
+}
+
+function get_staticroutes($returnsubnetsonly = false, $returnhostnames = false) {
+ global $config, $aliastable;
+
+ /* Bail if there are no routes, but return an array always so callers don't have to check. */
+ if (!is_array($config['staticroutes']['route'])) {
+ return array();
+ }
+
+ $allstaticroutes = array();
+ $allsubnets = array();
+ /* Loop through routes and expand aliases as we find them. */
+ foreach ($config['staticroutes']['route'] as $route) {
+ if (is_alias($route['network'])) {
+ if (!isset($aliastable[$route['network']])) {
+ continue;
+ }
+
+ $subnets = preg_split('/\s+/', $aliastable[$route['network']]);
+ foreach ($subnets as $net) {
+ if (!is_subnet($net)) {
+ if (is_ipaddrv4($net)) {
+ $net .= "/32";
+ } else if (is_ipaddrv6($net)) {
+ $net .= "/128";
+ } else if ($returnhostnames === false || !is_fqdn($net)) {
+ continue;
+ }
+ }
+ $temproute = $route;
+ $temproute['network'] = $net;
+ $allstaticroutes[] = $temproute;
+ $allsubnets[] = $net;
+ }
+ } elseif (is_subnet($route['network'])) {
+ $allstaticroutes[] = $route;
+ $allsubnets[] = $route['network'];
+ }
+ }
+ if ($returnsubnetsonly) {
+ return $allsubnets;
+ } else {
+ return $allstaticroutes;
+ }
+}
+
+/****f* util/get_alias_list
+ * NAME
+ * get_alias_list - Provide a list of aliases.
+ * INPUTS
+ * $type - Optional, can be a string or array specifying what type(s) of aliases you need.
+ * RESULT
+ * Array containing list of aliases.
+ * If $type is unspecified, all aliases are returned.
+ * If $type is a string, all aliases of the type specified in $type are returned.
+ * If $type is an array, all aliases of any type specified in any element of $type are returned.
+ */
+function get_alias_list($type = null) {
+ global $config;
+ $result = array();
+ if ($config['aliases']['alias'] <> "" && is_array($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $alias) {
+ if ($type === null) {
+ $result[] = $alias['name'];
+ } else if (is_array($type)) {
+ if (in_array($alias['type'], $type)) {
+ $result[] = $alias['name'];
+ }
+ } else if ($type === $alias['type']) {
+ $result[] = $alias['name'];
+ }
+ }
+ }
+ return $result;
+}
+
+/* returns an array consisting of every element of $haystack that is not equal to $needle. */
+function array_exclude($needle, $haystack) {
+ $result = array();
+ if (is_array($haystack)) {
+ foreach ($haystack as $thing) {
+ if ($needle !== $thing) {
+ $result[] = $thing;
+ }
+ }
+ }
+ return $result;
+}
+
+function get_current_theme() {
+ global $config, $g;
+ /*
+ * if user has selected a custom template, use it.
+ * otherwise default to pfsense template
+ */
+ if (($g["disablethemeselection"] === true) && !empty($g["default_theme"]) && (is_dir($g["www_path"].'/themes/'.$g["default_theme"]))) {
+ $theme = $g["default_theme"];
+ } elseif ($config['theme'] <> "" && (is_dir($g["www_path"].'/themes/'.$config['theme']))) {
+ $theme = $config['theme'];
+ } else {
+ $theme = "pfsense";
+ }
+ /*
+ * If this device is an apple ipod/iphone
+ * switch the theme to one that works with it.
+ */
+ $lowres_ua = array("iPhone", "iPod", "iPad", "Android", "BlackBerry", "Opera Mini", "Opera Mobi", "PlayBook", "IEMobile");
+ foreach ($lowres_ua as $useragent) {
+ if (strstr($_SERVER['HTTP_USER_AGENT'], $useragent)) {
+ $theme = (empty($g['theme_lowres']) && (is_dir($g["www_path"].'/themes/'.$g['theme_lowres']))) ? "pfsense" : $g['theme_lowres'];
+ }
+ }
+ return $theme;
+}
+
+/* Define what is preferred, IPv4 or IPv6 */
+function prefer_ipv4_or_ipv6() {
+ global $config;
+
+ if (isset($config['system']['prefer_ipv4'])) {
+ mwexec("/etc/rc.d/ip6addrctl prefer_ipv4");
+ } else {
+ mwexec("/etc/rc.d/ip6addrctl prefer_ipv6");
+ }
+}
+
+/* Redirect to page passing parameters via POST */
+function post_redirect($page, $params) {
+ if (!is_array($params)) {
+ return;
+ }
+
+ print "<html><body><form action=\"{$page}\" name=\"formredir\" method=\"post\">\n";
+ foreach ($params as $key => $value) {
+ print "<input type=\"hidden\" name=\"{$key}\" value=\"{$value}\" />\n";
+ }
+ print "</form><script type=\"text/javascript\">document.formredir.submit();</script>\n";
+ print "</body></html>\n";
+}
+
+/* Locate disks that can be queried for S.M.A.R.T. data. */
+function get_smart_drive_list() {
+ $disk_list = explode(" ", get_single_sysctl("kern.disks"));
+ foreach ($disk_list as $id => $disk) {
+ // We only want certain kinds of disks for S.M.A.R.T.
+ // 1 is a match, 0 is no match, False is any problem processing the regex
+ if (preg_match("/^(ad|da|ada).*[0-9]{1,2}$/", $disk) !== 1) {
+ unset($disk_list[$id]);
+ }
+ }
+ sort($disk_list);
+ return $disk_list;
+}
+
+?>
diff --git a/src/etc/inc/uuid.php b/src/etc/inc/uuid.php
new file mode 100644
index 0000000..700f392
--- /dev/null
+++ b/src/etc/inc/uuid.php
@@ -0,0 +1,327 @@
+<?php
+/*-
+ * Copyright (c) 2008 Fredrik Lindberg - http://www.shapeshifter.se
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/*
+ * UUID (RFC4122) Generator
+ * http://tools.ietf.org/html/rfc4122
+ *
+ * Implements version 1, 3, 4 and 5
+ */
+class UUID {
+ /* UUID versions */
+ const UUID_TIME = 1; /* Time based UUID */
+ const UUID_NAME_MD5 = 3; /* Name based (MD5) UUID */
+ const UUID_RANDOM = 4; /* Random UUID */
+ const UUID_NAME_SHA1 = 5; /* Name based (SHA1) UUID */
+
+ /* UUID formats */
+ const FMT_FIELD = 100;
+ const FMT_STRING = 101;
+ const FMT_BINARY = 102;
+ const FMT_QWORD = 1; /* Quad-word, 128-bit (not impl.) */
+ const FMT_DWORD = 2; /* Double-word, 64-bit (not impl.) */
+ const FMT_WORD = 4; /* Word, 32-bit (not impl.) */
+ const FMT_SHORT = 8; /* Short (not impl.) */
+ const FMT_BYTE = 16; /* Byte */
+ const FMT_DEFAULT = 16;
+
+ /* Field UUID representation */
+ static private $m_uuid_field = array(
+ 'time_low' => 0, /* 32-bit */
+ 'time_mid' => 0, /* 16-bit */
+ 'time_hi' => 0, /* 16-bit */
+ 'clock_seq_hi' => 0, /* 8-bit */
+ 'clock_seq_low' => 0, /* 8-bit */
+ 'node' => array() /* 48-bit */
+ );
+
+ static private $m_generate = array(
+ self::UUID_TIME => "generateTime",
+ self::UUID_RANDOM => "generateRandom",
+ self::UUID_NAME_MD5 => "generateNameMD5",
+ self::UUID_NAME_SHA1 => "generateNameSHA1"
+ );
+
+ static private $m_convert = array(
+ self::FMT_FIELD => array(
+ self::FMT_BYTE => "conv_field2byte",
+ self::FMT_STRING => "conv_field2string",
+ self::FMT_BINARY => "conv_field2binary"
+ ),
+ self::FMT_BYTE => array(
+ self::FMT_FIELD => "conv_byte2field",
+ self::FMT_STRING => "conv_byte2string",
+ self::FMT_BINARY => "conv_byte2binary"
+ ),
+ self::FMT_STRING => array(
+ self::FMT_BYTE => "conv_string2byte",
+ self::FMT_FIELD => "conv_string2field",
+ self::FMT_BINARY => "conv_string2binary"
+ ),
+ );
+
+ /* Swap byte order of a 32-bit number */
+ static private function swap32($x) {
+ return (($x & 0x000000ff) << 24) | (($x & 0x0000ff00) << 8) |
+ (($x & 0x00ff0000) >> 8) | (($x & 0xff000000) >> 24);
+ }
+
+ /* Swap byte order of a 16-bit number */
+ static private function swap16($x) {
+ return (($x & 0x00ff) << 8) | (($x & 0xff00) >> 8);
+ }
+
+ /* Auto-detect UUID format */
+ static private function detectFormat($src) {
+ if (is_string($src))
+ return self::FMT_STRING;
+ else if (is_array($src)) {
+ $len = count($src);
+ if ($len == 1 || ($len % 2) == 0)
+ return $len;
+ else
+ return (-1);
+ }
+ else
+ return self::FMT_BINARY;
+ }
+
+ /*
+ * Public API, generate a UUID of 'type' in format 'fmt' for
+ * the given namespace 'ns' and node 'node'
+ */
+ static public function generate($type, $fmt = self::FMT_BYTE,
+ $node = "", $ns = "") {
+ $func = self::$m_generate[$type];
+ if (!isset($func))
+ return null;
+ $conv = self::$m_convert[self::FMT_FIELD][$fmt];
+
+ $uuid = self::$func($ns, $node);
+ return self::$conv($uuid);
+ }
+
+ /*
+ * Public API, convert a UUID from one format to another
+ */
+ static public function convert($uuid, $from, $to) {
+ $conv = self::$m_convert[$from][$to];
+ if (!isset($conv))
+ return ($uuid);
+
+ return (self::$conv($uuid));
+ }
+
+ /*
+ * Generate an UUID version 4 (pseudo random)
+ */
+ static private function generateRandom($ns, $node) {
+ $uuid = self::$m_uuid_field;
+
+ $uuid['time_hi'] = (4 << 12) | (mt_rand(0, 0x1000));
+ $uuid['clock_seq_hi'] = (1 << 7) | mt_rand(0, 128);
+ $uuid['time_low'] = mt_rand(0, 0xffffffff);
+ $uuid['time_mid'] = mt_rand(0, 0x0000ffff);
+ $uuid['clock_seq_low'] = mt_rand(0, 255);
+ for ($i = 0; $i < 6; $i++)
+ $uuid['node'][$i] = mt_rand(0, 255);
+ return ($uuid);
+ }
+
+ /*
+ * Generate UUID version 3 and 5 (name based)
+ */
+ static private function generateName($ns, $node, $hash, $version) {
+ $ns_fmt = self::detectFormat($ns);
+ $field = self::convert($ns, $ns_fmt, self::FMT_FIELD);
+
+ /* Swap byte order to keep it in big endian on all platforms */
+ $field['time_low'] = self::swap32($field['time_low']);
+ $field['time_mid'] = self::swap16($field['time_mid']);
+ $field['time_hi'] = self::swap16($field['time_hi']);
+
+ /* Convert the namespace to binary and concatenate node */
+ $raw = self::convert($field, self::FMT_FIELD, self::FMT_BINARY);
+ $raw .= $node;
+
+ /* Hash the namespace and node and convert to a byte array */
+ $val = $hash($raw, true);
+ $tmp = unpack('C16', $val);
+ foreach (array_keys($tmp) as $key)
+ $byte[$key - 1] = $tmp[$key];
+
+ /* Convert byte array to a field array */
+ $field = self::conv_byte2field($byte);
+
+ $field['time_low'] = self::swap32($field['time_low']);
+ $field['time_mid'] = self::swap16($field['time_mid']);
+ $field['time_hi'] = self::swap16($field['time_hi']);
+
+ /* Apply version and constants */
+ $field['clock_seq_hi'] &= 0x3f;
+ $field['clock_seq_hi'] |= (1 << 7);
+ $field['time_hi'] &= 0x0fff;
+ $field['time_hi'] |= ($version << 12);
+
+ return ($field);
+ }
+ static private function generateNameMD5($ns, $node) {
+ return self::generateName($ns, $node, "md5",
+ self::UUID_NAME_MD5);
+ }
+ static private function generateNameSHA1($ns, $node) {
+ return self::generateName($ns, $node, "sha1",
+ self::UUID_NAME_SHA1);
+ }
+
+ /*
+ * Generate UUID version 1 (time based)
+ */
+ static private function generateTime($ns, $node) {
+ $uuid = self::$m_uuid_field;
+
+ /*
+ * Get current time in 100 ns intervals. The magic value
+ * is the offset between UNIX epoch and the UUID UTC
+ * time base October 15, 1582.
+ */
+ $tp = gettimeofday();
+ $time = ($tp['sec'] * 10000000) + ($tp['usec'] * 10) +
+ 0x01B21DD213814000;
+
+ /* Work around PHP 32-bit bit-operation limits */
+ $q = intval($time / 0xffffffff);
+ $low = $time - ($q * (0xffffffff + 1));
+ $high = intval(($time - $low) / 0xffffffff);
+
+ $uuid['time_low'] = $low;
+ $uuid['time_mid'] = $high & 0x0000ffff;
+ $uuid['time_hi'] = ($high & 0x0fff) | (self::UUID_TIME << 12);
+
+ /*
+ * We don't support saved state information and generate
+ * a random clock sequence each time.
+ */
+ $uuid['clock_seq_hi'] = (1 << 7) | mt_rand(0, 128);
+ $uuid['clock_seq_low'] = mt_rand(0, 255);
+
+ /*
+ * Node should be set to the 48-bit IEEE node identifier, but
+ * we leave it for the user to supply the node.
+ */
+ for ($i = 0; $i < 6; $i++)
+ $uuid['node'][$i] = ord(substr($node, $i, 1));
+
+ return ($uuid);
+ }
+
+ /* Assumes correct byte order */
+ static private function conv_field2byte($src) {
+ $uuid[0] = ($src['time_low'] & 0xff000000) >> 24;
+ $uuid[1] = ($src['time_low'] & 0x00ff0000) >> 16;
+ $uuid[2] = ($src['time_low'] & 0x0000ff00) >> 8;
+ $uuid[3] = ($src['time_low'] & 0x000000ff);
+ $uuid[4] = ($src['time_mid'] & 0xff00) >> 8;
+ $uuid[5] = ($src['time_mid'] & 0x00ff);
+ $uuid[6] = ($src['time_hi'] & 0xff00) >> 8;
+ $uuid[7] = ($src['time_hi'] & 0x00ff);
+ $uuid[8] = $src['clock_seq_hi'];
+ $uuid[9] = $src['clock_seq_low'];
+
+ for ($i = 0; $i < 6; $i++)
+ $uuid[10+$i] = $src['node'][$i];
+
+ return ($uuid);
+ }
+
+ static private function conv_field2string($src) {
+ $str = sprintf(
+ '%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x',
+ ($src['time_low']), ($src['time_mid']), ($src['time_hi']),
+ $src['clock_seq_hi'], $src['clock_seq_low'],
+ $src['node'][0], $src['node'][1], $src['node'][2],
+ $src['node'][3], $src['node'][4], $src['node'][5]);
+ return ($str);
+ }
+
+ static private function conv_field2binary($src) {
+ $byte = self::conv_field2byte($src);
+ return self::conv_byte2binary($byte);
+ }
+
+ static private function conv_byte2field($uuid) {
+ $field = self::$m_uuid_field;
+ $field['time_low'] = ($uuid[0] << 24) | ($uuid[1] << 16) |
+ ($uuid[2] << 8) | $uuid[3];
+ $field['time_mid'] = ($uuid[4] << 8) | $uuid[5];
+ $field['time_hi'] = ($uuid[6] << 8) | $uuid[7];
+ $field['clock_seq_hi'] = $uuid[8];
+ $field['clock_seq_low'] = $uuid[9];
+
+ for ($i = 0; $i < 6; $i++)
+ $field['node'][$i] = $uuid[10+$i];
+ return ($field);
+ }
+
+ static public function conv_byte2string($src) {
+ $field = self::conv_byte2field($src);
+ return self::conv_field2string($field);
+ }
+
+ static private function conv_byte2binary($src) {
+ $raw = pack('C16', $src[0], $src[1], $src[2], $src[3],
+ $src[4], $src[5], $src[6], $src[7], $src[8], $src[9],
+ $src[10], $src[11], $src[12], $src[13], $src[14], $src[15]);
+ return ($raw);
+ }
+
+ static private function conv_string2field($src) {
+ $parts = sscanf($src, '%x-%x-%x-%x-%02x%02x%02x%02x%02x%02x');
+ $field = self::$m_uuid_field;
+ $field['time_low'] = ($parts[0]);
+ $field['time_mid'] = ($parts[1]);
+ $field['time_hi'] = ($parts[2]);
+ $field['clock_seq_hi'] = ($parts[3] & 0xff00) >> 8;
+ $field['clock_seq_low'] = $parts[3] & 0x00ff;
+ for ($i = 0; $i < 6; $i++)
+ $field['node'][$i] = $parts[4+$i];
+
+ return ($field);
+ }
+
+ static private function conv_string2byte($src) {
+ $field = self::conv_string2field($src);
+ return self::conv_field2byte($field);
+ }
+
+ static private function conv_string2binary($src) {
+ $byte = self::conv_string2byte($src);
+ return self::conv_byte2binary($byte);
+ }
+}
+
+?> \ No newline at end of file
diff --git a/src/etc/inc/voucher.inc b/src/etc/inc/voucher.inc
new file mode 100644
index 0000000..7075fa6
--- /dev/null
+++ b/src/etc/inc/voucher.inc
@@ -0,0 +1,785 @@
+<?php
+/*
+ voucher.inc
+ Copyright (C) 2010-2012 Ermal Luçi <eri@pfsense.org>
+ Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2007 Marcel Wiget <mwiget@mac.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/local/bin/voucher
+ pfSense_MODULE: captiveportal
+*/
+
+/* include all configuration functions */
+if (!function_exists('captiveportal_syslog')) {
+ require_once("captiveportal.inc");
+}
+
+function xmlrpc_sync_voucher_expire($vouchers, $syncip, $port, $password, $username) {
+ global $g, $config, $cpzone;
+ require_once("xmlrpc.inc");
+
+ $protocol = "http";
+ if (is_array($config['system']) && is_array($config['system']['webgui']) && !empty($config['system']['webgui']['protocol']) &&
+ $config['system']['webgui']['protocol'] == "https") {
+ $protocol = "https";
+ }
+ if ($protocol == "https" || $port == "443") {
+ $url = "https://{$syncip}";
+ } else {
+ $url = "http://{$syncip}";
+ }
+
+ /* Construct code that is run on remote machine */
+ $method = 'pfsense.exec_php';
+ $execcmd = <<<EOF
+ global \$cpzone;
+ require_once('/etc/inc/captiveportal.inc');
+ require_once('/etc/inc/voucher.inc');
+ \$cpzone = "$cpzone";
+ voucher_expire("$vouchers");
+
+EOF;
+
+ /* assemble xmlrpc payload */
+ $params = array(
+ XML_RPC_encode($password),
+ XML_RPC_encode($execcmd)
+ );
+
+ log_error("Captive Portal Voucher XMLRPC sync data {$url}:{$port}.");
+ $msg = new XML_RPC_Message($method, $params);
+ $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port);
+ $cli->setCredentials($username, $password);
+ $resp = $cli->send($msg, "250");
+ if (!is_object($resp)) {
+ $error = "A communications error occurred while attempting CaptivePortalVoucherSync XMLRPC sync with {$url}:{$port} (pfsense.exec_php).";
+ log_error($error);
+ file_notice("CaptivePortalVoucherSync", $error, "Communications error occurred", "");
+ return false;
+ } elseif ($resp->faultCode()) {
+ $error = "An error code was received while attempting CaptivePortalVoucherSync XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
+ log_error($error);
+ file_notice("CaptivePortalVoucherSync", $error, "Error code received", "");
+ return false;
+ } else {
+ log_error("CaptivePortalVoucherSync XMLRPC reload data success with {$url}:{$port} (pfsense.exec_php).");
+ }
+
+ $toreturn = XML_RPC_Decode($resp->value());
+
+ return $toreturn;
+}
+
+function xmlrpc_sync_voucher_disconnect($dbent, $syncip, $port, $password, $username, $term_cause = 1, $stop_time = null) {
+ global $g, $config, $cpzone;
+ require_once("xmlrpc.inc");
+
+ $protocol = "http";
+ if (is_array($config['system']) && is_array($config['system']['webgui']) && !empty($config['system']['webgui']['protocol']) &&
+ $config['system']['webgui']['protocol'] == "https") {
+ $protocol = "https";
+ }
+ if ($protocol == "https" || $port == "443") {
+ $url = "https://{$syncip}";
+ } else {
+ $url = "http://{$syncip}";
+ }
+
+ /* Construct code that is run on remote machine */
+ $dbent_str = serialize($dbent);
+ $tmp_stop_time = (isset($stop_time)) ? $stop_time : "null";
+ $method = 'pfsense.exec_php';
+ $execcmd = <<<EOF
+ global \$cpzone;
+ require_once('/etc/inc/captiveportal.inc');
+ require_once('/etc/inc/voucher.inc');
+ \$cpzone = "$cpzone";
+ \$radiusservers = captiveportal_get_radius_servers();
+ \$dbent = unserialize("$dbent_str");
+ captiveportal_disconnect(\$dbent, \$radiusservers, $term_cause, $tmp_stop_time);
+
+EOF;
+
+ /* assemble xmlrpc payload */
+ $params = array(
+ XML_RPC_encode($password),
+ XML_RPC_encode($execcmd)
+ );
+
+ log_error("Captive Portal Voucher XMLRPC sync data {$url}:{$port}.");
+ $msg = new XML_RPC_Message($method, $params);
+ $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port);
+ $cli->setCredentials($username, $password);
+ $resp = $cli->send($msg, "250");
+ if (!is_object($resp)) {
+ $error = "A communications error occurred while attempting CaptivePortalVoucherSync XMLRPC sync with {$url}:{$port} (pfsense.exec_php).";
+ log_error($error);
+ file_notice("CaptivePortalVoucherSync", $error, "Communications error occurred", "");
+ return false;
+ } elseif ($resp->faultCode()) {
+ $error = "An error code was received while attempting CaptivePortalVoucherSync XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
+ log_error($error);
+ file_notice("CaptivePortalVoucherSync", $error, "Error code received", "");
+ return false;
+ } else {
+ log_error("CaptivePortalVoucherSync XMLRPC reload data success with {$url}:{$port} (pfsense.exec_php).");
+ }
+
+ $toreturn = XML_RPC_Decode($resp->value());
+
+ return $toreturn;
+}
+
+function xmlrpc_sync_used_voucher($voucher_received, $syncip, $port, $password, $username) {
+ global $g, $config, $cpzone;
+ require_once("xmlrpc.inc");
+
+ $protocol = "http";
+ if (is_array($config['system']) && is_array($config['system']['webgui']) && !empty($config['system']['webgui']['protocol']) &&
+ $config['system']['webgui']['protocol'] == "https") {
+ $protocol = "https";
+ }
+ if ($protocol == "https" || $port == "443") {
+ $url = "https://{$syncip}";
+ } else {
+ $url = "http://{$syncip}";
+ }
+
+ /* Construct code that is run on remote machine */
+ $method = 'pfsense.exec_php';
+ $execcmd = <<<EOF
+ global \$cpzone;
+ require_once('/etc/inc/voucher.inc');
+ \$cpzone = "$cpzone";
+ \$timeleft = voucher_auth("$voucher_received");
+ \$toreturn = array();
+ \$toreturn['timeleft'] = \$timeleft;
+ \$toreturn['voucher'] = array();
+ \$toreturn['voucher']['roll'] = \$config['voucher'][\$cpzone]['roll'];
+
+EOF;
+
+ /* assemble xmlrpc payload */
+ $params = array(
+ XML_RPC_encode($password),
+ XML_RPC_encode($execcmd)
+ );
+
+ log_error("Captive Portal Voucher XMLRPC sync data {$url}:{$port}.");
+ $msg = new XML_RPC_Message($method, $params);
+ $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port);
+ $cli->setCredentials($username, $password);
+ $resp = $cli->send($msg, "250");
+ if (!is_object($resp)) {
+ $error = "A communications error occurred while attempting CaptivePortalVoucherSync XMLRPC sync with {$url}:{$port} (pfsense.exec_php).";
+ log_error($error);
+ file_notice("CaptivePortalVoucherSync", $error, "Communications error occurred", "");
+ return null; // $timeleft
+ } elseif ($resp->faultCode()) {
+ $error = "An error code was received while attempting CaptivePortalVoucherSync XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
+ log_error($error);
+ file_notice("CaptivePortalVoucherSync", $error, "Error code received", "");
+ return null; // $timeleft
+ } else {
+ log_error("CaptivePortalVoucherSync XMLRPC reload data success with {$url}:{$port} (pfsense.exec_php).");
+ }
+ $toreturn = XML_RPC_Decode($resp->value());
+ if (!is_array($config['voucher'])) {
+ $config['voucher'] = array();
+ }
+
+ if (is_array($toreturn['voucher']) && is_array($toreturn['voucher']['roll'])) {
+ $config['voucher'][$cpzone]['roll'] = $toreturn['voucher']['roll'];
+ write_config("Captive Portal Voucher database synchronized with {$url}");
+ voucher_configure_zone(true);
+ unset($toreturn['voucher']);
+ } else if (!isset($toreturn['timeleft'])) {
+ return null;
+ }
+
+ return $toreturn['timeleft'];
+}
+
+function voucher_expire($voucher_received) {
+ global $g, $config, $cpzone, $cpzoneid;
+
+ // XMLRPC Call over to the master Voucher node
+ if (!empty($config['voucher'][$cpzone]['vouchersyncdbip'])) {
+ $syncip = $config['voucher'][$cpzone]['vouchersyncdbip'];
+ $syncport = $config['voucher'][$cpzone]['vouchersyncport'];
+ $syncpass = $config['voucher'][$cpzone]['vouchersyncpass'];
+ $vouchersyncusername = $config['voucher'][$cpzone]['vouchersyncusername'];
+ xmlrpc_sync_voucher_expire($voucher_received, $syncip, $syncport, $syncpass, $vouchersyncusername);
+ }
+
+ $voucherlck = lock("voucher{$cpzone}", LOCK_EX);
+
+ // read rolls into assoc array with rollid as key and minutes as value
+ $tickets_per_roll = array();
+ $minutes_per_roll = array();
+ if (is_array($config['voucher'][$cpzone]['roll'])) {
+ foreach ($config['voucher'][$cpzone]['roll'] as $rollent) {
+ $tickets_per_roll[$rollent['number']] = $rollent['count'];
+ $minutes_per_roll[$rollent['number']] = $rollent['minutes'];
+ }
+ }
+
+ // split into an array. Useful for multiple vouchers given
+ $a_vouchers_received = preg_split("/[\t\n\r ]+/s", $voucher_received);
+ $active_dirty = false;
+ $unsetindexes = array();
+
+ // go through all received vouchers, check their valid and extract
+ // Roll# and Ticket# using the external readvoucher binary
+ foreach ($a_vouchers_received as $voucher) {
+ $v = escapeshellarg($voucher);
+ if (strlen($voucher) < 3) {
+ continue; // seems too short to be a voucher!
+ }
+
+ unset($output);
+ $_gb = exec("/usr/local/bin/voucher -c {$g['varetc_path']}/voucher_{$cpzone}.cfg -k {$g['varetc_path']}/voucher_{$cpzone}.public -- $v", $output);
+ list($status, $roll, $nr) = explode(" ", $output[0]);
+ if ($status == "OK") {
+ // check if we have this ticket on a registered roll for this ticket
+ if ($tickets_per_roll[$roll] && ($nr <= $tickets_per_roll[$roll])) {
+ // voucher is from a registered roll.
+ if (!isset($active_vouchers[$roll])) {
+ $active_vouchers[$roll] = voucher_read_active_db($roll);
+ }
+ // valid voucher. Store roll# and ticket#
+ if (!empty($active_vouchers[$roll][$voucher])) {
+ $active_dirty = true;
+ unset($active_vouchers[$roll][$voucher]);
+ }
+ // check if voucher already marked as used
+ if (!isset($bitstring[$roll])) {
+ $bitstring[$roll] = voucher_read_used_db($roll);
+ }
+ $pos = $nr >> 3; // divide by 8 -> octet
+ $mask = 1 << ($nr % 8);
+ // mark bit for this voucher as used
+ if (!(ord($bitstring[$roll][$pos]) & $mask)) {
+ $bitstring[$roll][$pos] = chr(ord($bitstring[$roll][$pos]) | $mask);
+ }
+ captiveportal_syslog("{$voucher} ({$roll}/{$nr}) forced to expire");
+
+ /* Check if this voucher has any active sessions */
+ $cpentry = captiveportal_read_db("WHERE username = '{$voucher}'");
+ if (!empty($cpentry) && !empty($cpentry[0])) {
+ if (empty($cpzoneid) && !empty($config['captiveportal'][$cpzone])) {
+ $cpzoneid = $config['captiveportal'][$cpzone]['zoneid'];
+ }
+ $cpentry = $cpentry[0];
+ captiveportal_disconnect($cpentry, null, 13);
+ captiveportal_logportalauth($cpentry[4], $cpentry[3], $cpentry[2], "FORCLY TERMINATING VOUCHER {$voucher} SESSION");
+ $unsetindexes[] = $cpentry[5];
+ }
+ } else {
+ captiveportal_syslog("$voucher ($roll/$nr): not found on any registered Roll");
+ }
+ } else {
+ // hmm, thats weird ... not what I expected
+ captiveportal_syslog("$voucher invalid: {$output[0]}!!");
+ }
+ }
+
+ // Refresh active DBs
+ if ($active_dirty == true) {
+ foreach ($active_vouchers as $roll => $active) {
+ voucher_write_active_db($roll, $active);
+ }
+ unset($active_vouchers);
+
+ /* Trigger a sync of the vouchers on config */
+ send_event("service sync vouchers");
+ }
+
+ // Write back the used DB's
+ if (is_array($bitstring)) {
+ foreach ($bitstring as $roll => $used) {
+ if (is_array($used)) {
+ foreach ($used as $u) {
+ voucher_write_used_db($roll, base64_encode($u));
+ }
+ } else {
+ voucher_write_used_db($roll, base64_encode($used));
+ }
+ }
+ unset($bitstring);
+ }
+
+ unlock($voucherlck);
+
+ /* Write database */
+ if (!empty($unsetindexes)) {
+ captiveportal_remove_entries($unsetindexes);
+ }
+
+ return true;
+}
+
+/*
+ * Authenticate a voucher and return the remaining time credit in minutes
+ * if $test is set, don't mark the voucher as used nor add it to the list
+ * of active vouchers
+ * If $test is set, simply test the voucher. Don't change anything
+ * but return a more verbose error and result message back
+ */
+function voucher_auth($voucher_received, $test = 0) {
+ global $g, $config, $cpzone, $dbc;
+
+ if (!isset($config['voucher'][$cpzone]['enable'])) {
+ return 0;
+ }
+
+ // XMLRPC Call over to the master Voucher node
+ if (!empty($config['voucher'][$cpzone]['vouchersyncdbip'])) {
+ $syncip = $config['voucher'][$cpzone]['vouchersyncdbip'];
+ $syncport = $config['voucher'][$cpzone]['vouchersyncport'];
+ $syncpass = $config['voucher'][$cpzone]['vouchersyncpass'];
+ $vouchersyncusername = $config['voucher'][$cpzone]['vouchersyncusername'];
+ $remote_time_used = xmlrpc_sync_used_voucher($voucher_received, $syncip, $syncport, $syncpass, $vouchersyncusername);
+ }
+
+ $voucherlck = lock("voucher{$cpzone}", LOCK_EX);
+
+ // read rolls into assoc array with rollid as key and minutes as value
+ $tickets_per_roll = array();
+ $minutes_per_roll = array();
+ if (is_array($config['voucher'][$cpzone]['roll'])) {
+ foreach ($config['voucher'][$cpzone]['roll'] as $rollent) {
+ $tickets_per_roll[$rollent['number']] = $rollent['count'];
+ $minutes_per_roll[$rollent['number']] = $rollent['minutes'];
+ }
+ }
+
+ // split into an array. Useful for multiple vouchers given
+ $a_vouchers_received = preg_split("/[\t\n\r ]+/s", $voucher_received);
+ $error = 0;
+ $test_result = array(); // used to display for voucher test option in GUI
+ $total_minutes = 0;
+ $first_voucher = "";
+ $first_voucher_roll = 0;
+
+ // go through all received vouchers, check their valid and extract
+ // Roll# and Ticket# using the external readvoucher binary
+ foreach ($a_vouchers_received as $voucher) {
+ $v = escapeshellarg($voucher);
+ if (strlen($voucher) < 3) {
+ $test_result[] = "{$voucher} invalid: Too short!";
+ captiveportal_syslog("{$voucher} invalid: Too short!");
+ $error++;
+ continue; // seems too short to be a voucher!
+ }
+
+ $result = exec("/usr/local/bin/voucher -c {$g['varetc_path']}/voucher_{$cpzone}.cfg -k {$g['varetc_path']}/voucher_{$cpzone}.public -- $v");
+ list($status, $roll, $nr) = explode(" ", $result);
+ if ($status == "OK") {
+ if (!$first_voucher) {
+ // store first voucher. Thats the one we give the timecredit
+ $first_voucher = $voucher;
+ $first_voucher_roll = $roll;
+ }
+ // check if we have this ticket on a registered roll for this ticket
+ if ($tickets_per_roll[$roll] && ($nr <= $tickets_per_roll[$roll])) {
+ // voucher is from a registered roll.
+ if (!isset($active_vouchers[$roll])) {
+ $active_vouchers[$roll] = voucher_read_active_db($roll);
+ }
+ // valid voucher. Store roll# and ticket#
+ if (!empty($active_vouchers[$roll][$voucher])) {
+ list($timestamp, $minutes) = explode(",", $active_vouchers[$roll][$voucher]);
+ // we have an already active voucher here.
+ $remaining = intval((($timestamp + (60*$minutes)) - time())/60);
+ $test_result[] = sprintf(gettext('%1$s (%2$s/%3$s) active and good for %4$d Minutes'), $voucher, $roll, $nr, $remaining);
+ $total_minutes += $remaining;
+ } else {
+ // voucher not used. Check if ticket Id is on the roll (not too high)
+ // and if the ticket is marked used.
+ // check if voucher already marked as used
+ if (!isset($bitstring[$roll])) {
+ $bitstring[$roll] = voucher_read_used_db($roll);
+ }
+ $pos = $nr >> 3; // divide by 8 -> octet
+ $mask = 1 << ($nr % 8);
+ if (ord($bitstring[$roll][$pos]) & $mask) {
+ $test_result[] = "$voucher ($roll/$nr) already used and expired";
+ captiveportal_syslog("$voucher ($roll/$nr) already used and expired");
+ $total_minutes = -1; // voucher expired
+ $error++;
+ } else {
+ // mark bit for this voucher as used
+ $bitstring[$roll][$pos] = chr(ord($bitstring[$roll][$pos]) | $mask);
+ $test_result[] = "$voucher ($roll/$nr) good for {$minutes_per_roll[$roll]} Minutes";
+ $total_minutes += $minutes_per_roll[$roll];
+ }
+ }
+ } else {
+ $test_result[] = "$voucher ($roll/$nr): not found on any registered Roll";
+ captiveportal_syslog("$voucher ($roll/$nr): not found on any registered Roll");
+ }
+ } else {
+ // hmm, thats weird ... not what I expected
+ $test_result[] = "$voucher invalid: $result !!";
+ captiveportal_syslog("$voucher invalid: $result !!");
+ $error++;
+ }
+ }
+
+ // if this was a test call, we're done. Return the result.
+ if ($test) {
+ if ($error) {
+ $test_result[] = gettext("Access denied!");
+ } else {
+ $test_result[] = sprintf(gettext("Access granted for %d Minutes in total."), $total_minutes);
+ }
+ unlock($voucherlck);
+
+ return $test_result;
+ }
+
+ // if we had an error (one of the vouchers is invalid), return 0.
+ // Discussion: we could return the time remaining for good vouchers, but then
+ // the user wouldn't know that he used at least one invalid voucher.
+ if ($error) {
+ unlock($voucherlck);
+ if ($total_minutes > 0) { // probably not needed, but want to make sure
+ $total_minutes = 0; // we only report -1 (expired) or 0 (no access)
+ }
+ return $total_minutes; // well, at least one voucher had errors. Say NO ACCESS
+ }
+
+ // If we did a XMLRPC sync earlier check the timeleft
+ if (!empty($config['voucher'][$cpzone]['vouchersyncdbip'])) {
+ if (!is_null($remote_time_used)) {
+ $total_minutes = $remote_time_used;
+ } else if ($remote_time_used < $total_minutes) {
+ $total_minutes -= $remote_time_used;
+ }
+ }
+
+ // All given vouchers were valid and this isn't simply a test.
+ // Write back the used DB's
+ if (is_array($bitstring)) {
+ foreach ($bitstring as $roll => $used) {
+ if (is_array($used)) {
+ foreach ($used as $u) {
+ voucher_write_used_db($roll, base64_encode($u));
+ }
+ } else {
+ voucher_write_used_db($roll, base64_encode($used));
+ }
+ }
+ }
+
+ // Active DB: we only add the first voucher if multiple given
+ // and give that one all the time credit. This allows the user to logout and
+ // log in later using just the first voucher. It also keeps username limited
+ // to one voucher and that voucher shows the correct time credit in 'active vouchers'
+ if (!empty($active_vouchers[$first_voucher_roll][$first_voucher])) {
+ list($timestamp, $minutes) = explode(",", $active_vouchers[$first_voucher_roll][$first_voucher]);
+ } else {
+ $timestamp = time(); // new voucher
+ $minutes = $total_minutes;
+ }
+
+ $active_vouchers[$first_voucher_roll][$first_voucher] = "$timestamp,$minutes";
+ voucher_write_active_db($first_voucher_roll, $active_vouchers[$first_voucher_roll]);
+
+ /* Trigger a sync of the vouchers on config */
+ send_event("service sync vouchers");
+
+ unlock($voucherlck);
+
+ return $total_minutes;
+}
+
+function voucher_configure($sync = false) {
+ global $config, $g, $cpzone;
+
+ if (is_array($config['voucher'])) {
+ foreach ($config['voucher'] as $voucherzone => $vcfg) {
+ if (platform_booting()) {
+ echo gettext("Enabling voucher support... ");
+ }
+ $cpzone = $voucherzone;
+ $error = voucher_configure_zone($sync);
+ if (platform_booting()) {
+ if ($error) {
+ echo "error\n";
+ } else {
+ echo "done\n";
+ }
+ }
+ }
+ }
+}
+
+function voucher_configure_zone($sync = false) {
+ global $config, $g, $cpzone;
+
+ if (!isset($config['voucher'][$cpzone]['enable'])) {
+ return 0;
+ }
+
+ if ($sync == true) {
+ captiveportal_syslog("Writing voucher db from sync data...");
+ }
+
+ $voucherlck = lock("voucher{$cpzone}", LOCK_EX);
+
+ /* write public key used to verify vouchers */
+ $pubkey = base64_decode($config['voucher'][$cpzone]['publickey']);
+ $fd = fopen("{$g['varetc_path']}/voucher_{$cpzone}.public", "w");
+ if (!$fd) {
+ captiveportal_syslog("Voucher error: cannot write voucher.public\n");
+ unlock($voucherlck);
+ return 1;
+ }
+ fwrite($fd, $pubkey);
+ fclose($fd);
+ @chmod("{$g['varetc_path']}/voucher_{$cpzone}.public", 0600);
+
+ /* write config file used by voucher binary to decode vouchers */
+ $fd = fopen("{$g['varetc_path']}/voucher_{$cpzone}.cfg", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot write voucher.cfg") . "\n");
+ unlock($voucherlck);
+ return 1;
+ }
+ fwrite($fd, "{$config['voucher'][$cpzone]['rollbits']},{$config['voucher'][$cpzone]['ticketbits']},{$config['voucher'][$cpzone]['checksumbits']},{$config['voucher'][$cpzone]['magic']},{$config['voucher'][$cpzone]['charset']}\n");
+ fclose($fd);
+ @chmod("{$g['varetc_path']}/voucher_{$cpzone}.cfg", 0600);
+ unlock($voucherlck);
+
+ if ((platform_booting() || $sync == true) && is_array($config['voucher'][$cpzone]['roll'])) {
+
+ $voucherlck = lock("voucher{$cpzone}", LOCK_EX);
+
+ // create active and used DB per roll on ramdisk from config
+ foreach ($config['voucher'][$cpzone]['roll'] as $rollent) {
+
+ $roll = $rollent['number'];
+ voucher_write_used_db($roll, $rollent['used']);
+ $minutes = $rollent['minutes'];
+ $active_vouchers = array();
+ $a_active = &$rollent['active'];
+ if (is_array($a_active)) {
+ foreach ($a_active as $activent) {
+ $voucher = $activent['voucher'];
+ $timestamp = $activent['timestamp'];
+ $minutes = $activent['minutes'];
+ // its tempting to check for expired timestamps, but during
+ // bootup, we most likely don't have the correct time.
+ $active_vouchers[$voucher] = "$timestamp,$minutes";
+ }
+ }
+ voucher_write_active_db($roll, $active_vouchers);
+ }
+
+ unlock($voucherlck);
+ }
+
+ return 0;
+}
+
+/* write bitstring of used vouchers to ramdisk.
+ * Bitstring must already be base64_encoded!
+ */
+function voucher_write_used_db($roll, $vdb) {
+ global $g, $cpzone;
+
+ $fd = fopen("{$g['vardb_path']}/voucher_{$cpzone}_used_$roll.db", "w");
+ if ($fd) {
+ fwrite($fd, $vdb . "\n");
+ fclose($fd);
+ } else {
+ voucher_log(LOG_ERR, sprintf(gettext('cant write %1$s/voucher_%s_used_%2$s.db'), $g['vardb_path'], $cpzone, $roll));
+ }
+}
+
+/* return assoc array of active vouchers with activation timestamp
+ * voucher is index.
+ */
+function voucher_read_active_db($roll) {
+ global $g, $cpzone;
+
+ $active = array();
+ $dirty = 0;
+ $file = "{$g['vardb_path']}/voucher_{$cpzone}_active_$roll.db";
+ if (file_exists($file)) {
+ $fd = fopen($file, "r");
+ if ($fd) {
+ while (!feof($fd)) {
+ $line = trim(fgets($fd));
+ if ($line) {
+ list($voucher, $timestamp, $minutes) = explode(",", $line); // voucher,timestamp
+ if ((($timestamp + (60*$minutes)) - time()) > 0) {
+ $active[$voucher] = "$timestamp,$minutes";
+ } else {
+ $dirty=1;
+ }
+ }
+ }
+ fclose($fd);
+ if ($dirty) { // if we found expired entries, lets save our snapshot
+ voucher_write_active_db($roll, $active);
+
+ /* Trigger a sync of the vouchers on config */
+ send_event("service sync vouchers");
+ }
+ }
+ }
+ return $active;
+}
+
+/* store array of active vouchers back to DB */
+function voucher_write_active_db($roll, $active) {
+ global $g, $cpzone;
+
+ if (!is_array($active)) {
+ return;
+ }
+ $fd = fopen("{$g['vardb_path']}/voucher_{$cpzone}_active_$roll.db", "w");
+ if ($fd) {
+ foreach ($active as $voucher => $value) {
+ fwrite($fd, "$voucher,$value\n");
+ }
+ fclose($fd);
+ }
+}
+
+/* return how many vouchers are marked used on a roll */
+function voucher_used_count($roll) {
+ global $g, $cpzone;
+
+ $bitstring = voucher_read_used_db($roll);
+ $max = strlen($bitstring) * 8;
+ $used = 0;
+ for ($i = 1; $i <= $max; $i++) {
+ // check if ticket already used or not.
+ $pos = $i >> 3; // divide by 8 -> octet
+ $mask = 1 << ($i % 8); // mask to test bit in octet
+ if (ord($bitstring[$pos]) & $mask) {
+ $used++;
+ }
+ }
+ unset($bitstring);
+
+ return $used;
+}
+
+function voucher_read_used_db($roll) {
+ global $g, $cpzone;
+
+ $vdb = "";
+ $file = "{$g['vardb_path']}/voucher_{$cpzone}_used_$roll.db";
+ if (file_exists($file)) {
+ $fd = fopen($file, "r");
+ if ($fd) {
+ $vdb = trim(fgets($fd));
+ fclose($fd);
+ } else {
+ voucher_log(LOG_ERR, sprintf(gettext('cant read %1$s/voucher_%s_used_%2$s.db'), $g['vardb_path'], $cpzone, $roll));
+ }
+ }
+ return base64_decode($vdb);
+}
+
+function voucher_unlink_db($roll) {
+ global $g, $cpzone;
+ @unlink("{$g['vardb_path']}/voucher_{$cpzone}_used_$roll.db");
+ @unlink("{$g['vardb_path']}/voucher_{$cpzone}_active_$roll.db");
+}
+
+/* we share the log with captiveportal for now */
+function voucher_log($priority, $message) {
+
+ $message = trim($message);
+ openlog("logportalauth", LOG_PID, LOG_LOCAL4);
+ syslog($priority, sprintf(gettext("Voucher: %s"), $message));
+ closelog();
+}
+
+/* Save active and used voucher DB into XML config and write it to flash
+ * Called during reboot -> system_reboot_cleanup() and every active voucher change
+ */
+function voucher_save_db_to_config() {
+ global $config, $g, $cpzone;
+
+ if (is_array($config['voucher'])) {
+ foreach ($config['voucher'] as $voucherzone => $vcfg) {
+ $cpzone = $voucherzone;
+ voucher_save_db_to_config_zone();
+ }
+ }
+}
+
+function voucher_save_db_to_config_zone() {
+ global $config, $g, $cpzone;
+
+ if (!isset($config['voucher'][$cpzone]['enable'])) {
+ return; // no vouchers or don't want to save DB's
+ }
+
+ if (!is_array($config['voucher'][$cpzone]['roll'])) {
+ return;
+ }
+
+ $voucherlck = lock("voucher{$cpzone}", LOCK_EX);
+
+ // walk all active rolls and save runtime DB's to flash
+ $a_roll = &$config['voucher'][$cpzone]['roll'];
+ while (list($key, $value) = each($a_roll)) {
+ $rollent = &$a_roll[$key];
+ $roll = $rollent['number'];
+ $bitmask = voucher_read_used_db($roll);
+ $rollent['used'] = base64_encode($bitmask);
+ $active_vouchers = voucher_read_active_db($roll);
+ $db = array();
+ $dbi = 1;
+ foreach ($active_vouchers as $voucher => $line) {
+ list($timestamp, $minutes) = explode(",", $line);
+ $activent['voucher'] = $voucher;
+ $activent['timestamp'] = $timestamp;
+ $activent['minutes'] = $minutes;
+ $db["v{$dbi}"] = $activent;
+ $dbi++;
+ }
+ $rollent['active'] = $db;
+ unset($active_vouchers);
+ }
+
+ unlock($voucherlck);
+
+ write_config("Syncing vouchers");
+ return;
+}
+
+?>
diff --git a/src/etc/inc/vpn.inc b/src/etc/inc/vpn.inc
new file mode 100644
index 0000000..2820822
--- /dev/null
+++ b/src/etc/inc/vpn.inc
@@ -0,0 +1,2056 @@
+<?php
+
+/*
+ vpn.inc
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/ipsec /usr/local/libexec/ipsec/charon /usr/local/libexec/ipsec/starter
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/filterdns /usr/local/sbin/mpd4
+ pfSense_MODULE: vpn
+*/
+
+require_once("ipsec.inc");
+require_once("filter.inc");
+
+function vpn_ipsec_configure_loglevels($forconfig = false) {
+ global $config, $ipsec_loglevels;
+
+ $cfgtext = array();
+ foreach ($ipsec_loglevels as $lkey => $ldescr) {
+ if (!isset($config['ipsec']["ipsec_{$lkey}"]) && !$forconfig) {
+ mwexec("/usr/local/sbin/ipsec stroke loglevel {$lkey} -- -1", false);
+ } else if (is_numeric($config['ipsec']["ipsec_{$lkey}"]) &&
+ intval($config['ipsec']["ipsec_{$lkey}"]) >= 0 && intval($config['ipsec']["ipsec_{$lkey}"]) <= 5) {
+ $forconfig ? $cfgtext[] = "${lkey} " . (intval($config['ipsec']["ipsec_{$lkey}"]) - 1) :
+ mwexec("/usr/local/sbin/ipsec stroke loglevel {$lkey} " . (intval($config['ipsec']["ipsec_{$lkey}"]) - 1) , false);
+ }
+ }
+ if ($forconfig) {
+ return implode(',', $cfgtext);
+ }
+}
+
+/* include all configuration functions */
+function vpn_ipsec_convert_to_modp($index) {
+
+ $convertion = "";
+ switch ($index) {
+ case '1':
+ $convertion = "modp768";
+ break;
+ case '2':
+ $convertion = "modp1024";
+ break;
+ case '5':
+ $convertion = "modp1536";
+ break;
+ case '14':
+ $convertion = "modp2048";
+ break;
+ case '15':
+ $convertion = "modp3072";
+ break;
+ case '16':
+ $convertion = "modp4096";
+ break;
+ case '17':
+ $convertion = "modp6144";
+ break;
+ case '18':
+ $convertion = "modp8192";
+ break;
+ case '19':
+ $convertion = "ecp256";
+ break;
+ case '20':
+ $convertion = "ecp384";
+ break;
+ case '21':
+ $convertion = "ecp521";
+ break;
+ case '28':
+ $convertion = "ecp256bp";
+ break;
+ case '29':
+ $convertion = "ecp384bp";
+ break;
+ case '30':
+ $convertion = "ecp512bp";
+ break;
+ }
+
+ return $convertion;
+}
+
+function vpn_ipsec_configure($restart = false) {
+ global $config, $g, $sa, $sn, $p1_ealgos, $p2_ealgos, $ipsec_idhandling;
+
+ /* get the automatic ping_hosts.sh ready */
+ unlink_if_exists("{$g['vardb_path']}/ipsecpinghosts");
+ touch("{$g['vardb_path']}/ipsecpinghosts");
+
+ /* service may have been enabled, disabled, or otherwise changed in a way requiring rule updates */
+ filter_configure();
+
+ $syscfg = $config['system'];
+ $ipseccfg = $config['ipsec'];
+ if (!isset($ipseccfg['enable'])) {
+ /* try to stop charon */
+ mwexec("/usr/local/sbin/ipsec stop");
+ /* Stop dynamic monitoring */
+ killbypid("{$g['varrun_path']}/filterdns-ipsec.pid");
+
+ /* wait for process to die */
+ sleep(2);
+
+ /* disallow IPSEC, it is off */
+ mwexec("/sbin/ifconfig enc0 down");
+ set_single_sysctl("net.inet.ip.ipsec_in_use", "0");
+
+ return 0;
+ }
+
+ $a_phase1 = $config['ipsec']['phase1'];
+ $a_phase2 = $config['ipsec']['phase2'];
+ $a_client = $config['ipsec']['client'];
+
+ $certpath = "{$g['varetc_path']}/ipsec/ipsec.d/certs";
+ $capath = "{$g['varetc_path']}/ipsec/ipsec.d/cacerts";
+ $keypath = "{$g['varetc_path']}/ipsec/ipsec.d/private";
+ $crlpath = "{$g['varetc_path']}/ipsec/ipsec.d/crls";
+
+ mwexec("/sbin/ifconfig enc0 up");
+ set_single_sysctl("net.inet.ip.ipsec_in_use", "1");
+ if (php_uname('m') != "amd64") {
+ set_single_sysctl("net.inet.ipsec.directdispatch", "0");
+ }
+
+ /* needed for config files */
+ if (!is_dir("{$g['varetc_path']}/ipsec")) {
+ mkdir("{$g['varetc_path']}/ipsec");
+ }
+ if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d")) {
+ mkdir("{$g['varetc_path']}/ipsec/ipsec.d");
+ }
+ if (!is_dir($capath)) {
+ mkdir($capath);
+ }
+ if (!is_dir($keypath)) {
+ mkdir($keypath);
+ }
+ if (!is_dir($crlpath)) {
+ mkdir($crlpath);
+ }
+ if (!is_dir($certpath)) {
+ mkdir($certpath);
+ }
+ if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d/aacerts")) {
+ mkdir("{$g['varetc_path']}/ipsec/ipsec.d/aacerts");
+ }
+ if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d/acerts")) {
+ mkdir("{$g['varetc_path']}/ipsec/ipsec.d/acerts");
+ }
+ if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d/ocspcerts")) {
+ mkdir("{$g['varetc_path']}/ipsec/ipsec.d/ocspcerts");
+ }
+ if (!is_dir("{$g['varetc_path']}/ipsec/ipsec.d/reqs")) {
+ mkdir("{$g['varetc_path']}/ipsec/ipsec.d/reqs");
+ }
+
+
+ if (platform_booting()) {
+ echo gettext("Configuring IPsec VPN... ");
+ }
+
+ /* fastforwarding is not compatible with ipsec tunnels */
+ set_single_sysctl("net.inet.ip.fastforwarding", "0");
+
+ /* resolve all local, peer addresses and setup pings */
+ $ipmap = array();
+ $rgmap = array();
+ $filterdns_list = array();
+ $listeniflist = array();
+ $aggressive_mode_psk = false;
+ unset($iflist);
+ $ifacesuse = array();
+ if (is_array($a_phase1) && count($a_phase1)) {
+
+ $ipsecpinghosts = "";
+ /* step through each phase1 entry */
+ foreach ($a_phase1 as $ph1ent) {
+ if (isset($ph1ent['disabled'])) {
+ continue;
+ }
+
+ if (strpos($ph1ent['interface'], '_vip')) {
+ $vpninterface = explode('_vip', $ph1ent['interface']);
+ $ifacesuse[] = get_real_interface($vpninterface[0]);
+ } else {
+ $vpninterface = get_failover_interface($ph1ent['interface']);
+ if (strpos($vpninterface, '_vip')) {
+ $vpninterface = explode('_vip', $vpninterface);
+ $ifacesuse[] = get_real_interface($vpninterface[0]);
+ } elseif (!empty($vpninterface)) {
+ $ifacesuse[] = $vpninterface;
+ }
+ }
+
+ if ($ph1ent['mode'] == "aggressive" && ($ph1ent['authentication_method'] == "pre_shared_key" || $ph1ent['authentication_method'] == "xauth_psk_server")) {
+ $aggressive_mode_psk = true;
+ }
+
+ $ikeid = $ph1ent['ikeid'];
+ $listeniflist = get_real_interface($a_phase1['interface']);
+
+ $ep = ipsec_get_phase1_src($ph1ent);
+ if (!is_ipaddr($ep)) {
+ log_error("IPsec ERROR: Could not find phase 1 source for connection {$ph1ent['descr']}. Omitting from configuration file.");
+ continue;
+ }
+
+ if (!in_array($ep, $ipmap)) {
+ $ipmap[] = $ep;
+ }
+
+ /* see if this tunnel has a hostname for the remote-gateway. If so,
+ try to resolve it now and add it to the list for filterdns */
+
+ if (isset ($ph1ent['mobile'])) {
+ continue;
+ }
+
+ $rg = $ph1ent['remote-gateway'];
+
+ if (!is_ipaddr($rg)) {
+ $filterdns_list[] = "{$rg}";
+ add_hostname_to_watch($rg);
+ if (!platform_booting()) {
+ $rg = resolve_retry($rg);
+ }
+ if (!is_ipaddr($rg)) {
+ continue;
+ }
+ }
+ if (array_search($rg, $rgmap)) {
+ log_error("The remote gateway {$rg} already exists on another phase 1 entry");
+ continue;
+ }
+ $rgmap[$ph1ent['remote-gateway']] = $rg;
+
+ if (is_array($a_phase2)) {
+ /* step through each phase2 entry */
+ foreach ($a_phase2 as $ph2ent) {
+ if (isset($ph2ent['disabled'])) {
+ continue;
+ }
+
+ if ($ikeid != $ph2ent['ikeid']) {
+ continue;
+ }
+
+ /* add an ipsec pinghosts entry */
+ if ($ph2ent['pinghost']) {
+ if (!is_array($iflist)) {
+ $iflist = get_configured_interface_list();
+ }
+ $srcip = null;
+ $local_subnet = ipsec_idinfo_to_cidr($ph2ent['localid'], true, $ph2ent['mode']);
+ if (is_ipaddrv6($ph2ent['pinghost'])) {
+ foreach ($iflist as $ifent => $ifname) {
+ $interface_ip = get_interface_ipv6($ifent);
+ if (!is_ipaddrv6($interface_ip)) {
+ continue;
+ }
+ if (ip_in_subnet($interface_ip, $local_subnet)) {
+ $srcip = $interface_ip;
+ break;
+ }
+ }
+ } else {
+ foreach ($iflist as $ifent => $ifname) {
+ $interface_ip = get_interface_ip($ifent);
+ if (!is_ipaddrv4($interface_ip)) {
+ continue;
+ }
+ if ($local_subnet == "0.0.0.0/0" || ip_in_subnet($interface_ip, $local_subnet)) {
+ $srcip = $interface_ip;
+ break;
+ }
+ }
+ }
+ /* if no valid src IP was found in configured interfaces, try the vips */
+ if (is_null($srcip)) {
+ $viplist = get_configured_vips_list();
+ foreach ($viplist as $vip) {
+ if (ip_in_subnet($vip['ipaddr'], $local_subnet)) {
+ $srcip = $vip['ipaddr'];
+ break;
+ }
+ }
+ }
+ $dstip = $ph2ent['pinghost'];
+ if (is_ipaddrv6($dstip)) {
+ $family = "inet6";
+ } else {
+ $family = "inet";
+ }
+ if (is_ipaddr($srcip)) {
+ $ipsecpinghosts[] = "{$srcip}|{$dstip}|3|||||{$family}|\n";
+ }
+ }
+ }
+ }
+ }
+ @file_put_contents("{$g['vardb_path']}/ipsecpinghosts", $ipsecpinghosts);
+ unset($ipsecpinghosts);
+ }
+ unset($iflist);
+
+ $accept_unencrypted = "";
+ if (isset($config['ipsec']['acceptunencryptedmainmode'])) {
+ $accept_unencrypted = "accept_unencrypted_mainmode_messages = yes";
+ }
+
+ $stronconf = '';
+ if (file_exists("{$g['varetc_path']}/ipsec/strongswan.conf")) {
+ $stronconf = file_get_contents("{$g['varetc_path']}/ipsec/strongswan.conf");
+ }
+
+ $i_dont_care_about_security_and_use_aggressive_mode_psk = "";
+ if ($aggressive_mode_psk) {
+ log_error("WARNING: Setting i_dont_care_about_security_and_use_aggressive_mode_psk option because a phase 1 is configured using aggressive mode with pre-shared keys. This is not a secure configuration.");
+ if (!empty($stronconf) && strpos($stronconf, 'i_dont_care_about_security_and_use_aggressive_mode_psk') === FALSE) {
+ $restart = true;
+ }
+ $i_dont_care_about_security_and_use_aggressive_mode_psk = "i_dont_care_about_security_and_use_aggressive_mode_psk=yes";
+ }
+
+ $unity_enabled = 'yes';
+ if (isset($config['ipsec']['unityplugin'])) {
+ $unity_enabled = 'no';
+ if (file_exists("/usr/local/lib/ipsec/plugins/libstrongswan-unity.so")) {
+ conf_mount_rw();
+ mwexec("mv /usr/local/lib/ipsec/plugins/libstrongswan-unity.so /usr/local/lib/ipsec/plugins/libstrongswan-unity.MOVED");
+ conf_mount_ro();
+ }
+ } else if (file_exists("/usr/local/lib/ipsec/plugins/libstrongswan-unity.MOVED")) {
+ conf_mount_rw();
+ mwexec("mv /usr/local/lib/ipsec/plugins/libstrongswan-unity.MOVED /usr/local/lib/ipsec/plugins/libstrongswan-unity.so");
+ conf_mount_ro();
+ }
+
+ $makebeforebreak = '';
+ if (isset($config['ipsec']['makebeforebreak'])) {
+ $makebeforebreak = 'make_before_break = yes';
+ }
+
+ if (isset($config['ipsec']['enableinterfacesuse'])) {
+ if (!empty($ifacesuse)) {
+ $ifacesuse = 'interfaces_use = ' . implode(',', array_unique($ifacesuse));
+ } else {
+ $ifacesuse = '';
+ }
+ } else {
+ $ifacesuse = '';
+ }
+
+ unset($stronconf);
+
+ $strongswan = <<<EOD
+
+# Automatically generated config file - DO NOT MODIFY. Changes will be overwritten.
+starter {
+load_warning = no
+}
+
+charon {
+# number of worker threads in charon
+threads = 16
+ikesa_table_size = 32
+ikesa_table_segments = 4
+init_limit_half_open = 1000
+install_routes = no
+{$i_dont_care_about_security_and_use_aggressive_mode_psk}
+{$accept_unencrypted}
+cisco_unity = {$unity_enabled}
+{$ifacesuse}
+{$makebeforebreak}
+
+# And two loggers using syslog. The subsections define the facility to log
+# to, currently one of: daemon, auth.
+syslog {
+ identifier = charon
+ # default level to the LOG_DAEMON facility
+ daemon {
+ ike_name = yes
+ }
+ # very minimalistic IKE auditing logs to LOG_AUTHPRIV
+ auth {
+ default = -1
+ ike = 1
+ ike_name = yes
+ }
+}
+
+EOD;
+
+ $strongswan .= "\tplugins {\n";
+
+ $a_servers = auth_get_authserver_list();
+ foreach ($a_servers as $id => $pconfig) {
+ if ($id == $config['ipsec']['client']['user_source'] && $pconfig['type'] == "radius") {
+ $strongswan .= <<<EOD
+ eap-radius {
+ class_group = yes
+ eap_start = no
+ servers {
+ primary {
+ address = {$pconfig['host']}
+ secret = {$pconfig['radius_secret']}
+ auth_port = {$pconfig['radius_auth_port']}
+ acct_port = {$pconfig['radius_acct_port']}
+ }
+ }
+ }
+
+EOD;
+ break;
+ }
+ }
+
+ if (is_array($a_client) && isset($a_client['enable'])) {
+ $strongswan .= "\t\tattr {\n";
+ if ($a_client['pool_address'] && $a_client['pool_netbits']) {
+ $strongswan .= "\t\t\tsubnet = {$a_client['pool_address']}/{$a_client['pool_netbits']}\n";
+ }
+
+ $cfgservers = array();
+ if (!empty($a_client['dns_server1'])) {
+ $cfgservers[] = $a_client['dns_server1'];
+ }
+ if (!empty($a_client['dns_server2'])) {
+ $cfgservers[] = $a_client['dns_server2'];
+ }
+ if (!empty($a_client['dns_server3'])) {
+ $cfgservers[] = $a_client['dns_server3'];
+ }
+ if (!empty($a_client['dns_server4'])) {
+ $cfgservers[] = $a_client['dns_server4'];
+ }
+
+ if (!empty($cfgservers)) {
+ $strongswan .= "\t\t\tdns = " . implode(",", $cfgservers) . "\n";
+ }
+ unset($cfgservers);
+ $cfgservers = array();
+ if (!empty($a_client['wins_server1'])) {
+ $cfgservers[] = $a_client['wins_server1'];
+ }
+ if (!empty($a_client['wins_server2'])) {
+ $cfgservers[] = $a_client['wins_server2'];
+ }
+ if (!empty($cfgservers)) {
+ $strongswan .= "\t\t\tnbns = " . implode(",", $cfgservers) . "\n";
+ }
+ unset($cfgservers);
+
+ if (isset($a_client['net_list']) && is_array($a_phase2)) {
+ $net_list = '';
+ foreach ($a_phase2 as $ph2ent) {
+ if (isset($ph2ent['disabled'])) {
+ continue;
+ }
+
+ if (!isset($ph2ent['mobile'])) {
+ continue;
+ }
+
+ $localid = ipsec_idinfo_to_cidr($ph2ent['localid'], true, $ph2ent['mode']);
+
+ if (!empty($net_list)) {
+ $net_list .= ",";
+ }
+ $net_list .= $localid;
+ }
+
+ if (!empty($net_list)) {
+ $strongswan .= "\t\t\tsplit-include = {$net_list}\n";
+ unset($net_list);
+ }
+ }
+
+ if (!empty($a_client['dns_domain'])) {
+ $strongswan .= "\t\t\t# Search domain and default domain\n";
+ $strongswan .= "\t\t\t28674 = \"{$a_client['dns_domain']}\"\n";
+ if (empty($a_client['dns_split'])) {
+ $strongswan .= "\t\t\t28675 = \"{$a_client['dns_domain']}\"";
+ }
+ $strongswan .= "\n";
+ }
+
+ if (!empty($a_client['dns_split'])) {
+ $strongswan .= "\t\t\t28675 = {$a_client['dns_split']}\n";
+ }
+
+ if (!empty($a_client['login_banner'])) {
+ $strongswan .= "\t\t\t28672 = \"{$a_client['login_banner']}\"\n";
+ }
+
+ if (isset($a_client['save_passwd'])) {
+ $strongswan .= "\t\t\t28673 = 1\n";
+ }
+
+ if ($a_client['pfs_group']) {
+ $strongswan .= "\t\t\t28679 = \"{$a_client['pfs_group']}\"\n";
+ }
+ $strongswan .= "\t\t}\n";
+
+ if ($a_client['user_source'] != "none") {
+ $strongswan .= "\t\txauth-generic {\n";
+ $strongswan .= "\t\t\tscript = /etc/inc/ipsec.auth-user.php\n";
+ $strongswan .= "\t\t\tauthcfg = ";
+ $firstsed = 0;
+ $authcfgs = explode(",", $a_client['user_source']);
+ foreach ($authcfgs as $authcfg) {
+ if ($firstsed > 0) {
+ $strongswan .= ",";
+ }
+ if ($authcfg == "system") {
+ $authcfg = "Local Database";
+ }
+ $strongswan .= $authcfg;
+ $firstsed = 1;
+ }
+ $strongswan .= "\n";
+ $strongswan .= "\t\t}\n";
+ }
+ }
+
+ $strongswan .= "\t}\n}\n";
+ @file_put_contents("{$g['varetc_path']}/ipsec/strongswan.conf", $strongswan);
+ unset($strongswan);
+
+ /* generate CA certificates files */
+ if (is_array($config['ca']) && count($config['ca'])) {
+ foreach ($config['ca'] as $ca) {
+ if (!isset($ca['crt'])) {
+ log_error(sprintf(gettext("Error: Invalid certificate info for %s"), $ca['descr']));
+ continue;
+ }
+ $cert = base64_decode($ca['crt']);
+ $x509cert = openssl_x509_parse(openssl_x509_read($cert));
+ if (!is_array($x509cert) || !isset($x509cert['hash'])) {
+ log_error(sprintf(gettext("Error: Invalid certificate hash info for %s"), $ca['descr']));
+ continue;
+ }
+ $fname = "{$capath}/{$x509cert['hash']}.0.crt";
+ if (!@file_put_contents($fname, $cert)) {
+ log_error(sprintf(gettext("Error: Cannot write IPsec CA file for %s"), $ca['descr']));
+ continue;
+ }
+ unset($cert);
+ }
+ }
+
+ /* write out CRL files */
+ if (is_array($config['crl']) && count($config['crl'])) {
+ foreach ($config['crl'] as $crl) {
+ if (!isset($crl['text'])) {
+ log_error(sprintf(gettext("Warning: Missing CRL data for %s"), $crl['descr']));
+ continue;
+ }
+ $fpath = "{$crlpath}/{$crl['refid']}.crl";
+ if (!@file_put_contents($fpath, base64_decode($crl['text']))) {
+ log_error(sprintf(gettext("Error: Cannot write IPsec CRL file for %s"), $crl['descr']));
+ continue;
+ }
+ }
+ }
+
+ $pskconf = "";
+
+ if (is_array($a_phase1) && count($a_phase1)) {
+ foreach ($a_phase1 as $ph1ent) {
+
+ if (isset($ph1ent['disabled'])) {
+ continue;
+ }
+
+ if (strstr($ph1ent['authentication_method'], 'rsa') ||
+ in_array($ph1ent['authentication_method'], array('eap-mschapv2', 'eap-tls', 'eap-radius'))) {
+ $certline = '';
+
+ $ikeid = $ph1ent['ikeid'];
+ $cert = lookup_cert($ph1ent['certref']);
+
+ if (!$cert) {
+ log_error(sprintf(gettext("Error: Invalid phase1 certificate reference for %s"), $ph1ent['name']));
+ continue;
+ }
+
+ @chmod($certpath, 0600);
+
+ $ph1keyfile = "{$keypath}/cert-{$ikeid}.key";
+ if (!file_put_contents($ph1keyfile, base64_decode($cert['prv']))) {
+ log_error(sprintf(gettext("Error: Cannot write phase1 key file for %s"), $ph1ent['name']));
+ continue;
+ }
+ @chmod($ph1keyfile, 0600);
+
+ $ph1certfile = "{$certpath}/cert-{$ikeid}.crt";
+ if (!file_put_contents($ph1certfile, base64_decode($cert['crt']))) {
+ log_error(sprintf(gettext("Error: Cannot write phase1 certificate file for %s"), $ph1ent['name']));
+ @unlink($ph1keyfile);
+ continue;
+ }
+ @chmod($ph1certfile, 0600);
+
+ /* XXX" Traffic selectors? */
+ $pskconf .= " : RSA {$ph1keyfile}\n";
+ } else {
+ list ($myid_type, $myid_data) = ipsec_find_id($ph1ent, 'local');
+ list ($peerid_type, $peerid_data) = ipsec_find_id($ph1ent, 'peer', $rgmap);
+
+ $myid = trim($myid_data);
+
+ if (empty($peerid_data)) {
+ continue;
+ }
+
+ if ($myid_type == 'fqdn' && !empty($myid)) {
+ $myid = "@{$myid}";
+ }
+
+ $myid = isset($ph1ent['mobile']) ? trim($myid_data) : "%any";
+
+ $peerid = ($peerid_data != 'allusers') ? trim($peerid_data) : '';
+
+ if ($peerid_type == 'fqdn' && !empty($peerid)) {
+ $peerid = "@{$peerid}";
+ }
+
+ if (!empty($ph1ent['pre-shared-key'])) {
+ $pskconf .= "{$myid} {$peerid} : PSK 0s" . base64_encode(trim($ph1ent['pre-shared-key'])) . "\n";
+ }
+ }
+ }
+ }
+
+ /* Add user PSKs */
+ if (is_array($config['system']) && is_array($config['system']['user'])) {
+ foreach ($config['system']['user'] as $user) {
+ if (!empty($user['ipsecpsk'])) {
+ $pskconf .= "{$myid} {$user['name']} : PSK 0s" . base64_encode($user['ipsecpsk']) . "\n";
+ }
+ }
+ unset($user);
+ }
+
+ /* add PSKs for mobile clients */
+ if (is_array($ipseccfg['mobilekey'])) {
+ foreach ($ipseccfg['mobilekey'] as $key) {
+ if ($key['ident'] == "allusers") {
+ $key['ident'] = '%any';
+ }
+ if (empty($key['type'])) {
+ $key['type'] = 'PSK';
+ }
+ $pskconf .= "{$myid} {$key['ident']} : {$key['type']} 0s" . base64_encode($key['pre-shared-key']) . "\n";
+ }
+ unset($key);
+ }
+
+ @file_put_contents("{$g['varetc_path']}/ipsec/ipsec.secrets", $pskconf);
+ chmod("{$g['varetc_path']}/ipsec/ipsec.secrets", 0600);
+ unset($pskconf);
+
+ $uniqueids = 'yes';
+ if (!empty($config['ipsec']['uniqueids'])) {
+ if (array_key_exists($config['ipsec']['uniqueids'], $ipsec_idhandling)) {
+ $uniqueids = $config['ipsec']['uniqueids'];
+ }
+ }
+ $natfilterrules = false;
+ /* begin ipsec.conf */
+ $ipsecconf = "";
+ $enablecompression = false;
+ if (is_array($a_phase1) && count($a_phase1)) {
+
+ $ipsecconf .= "# This file is automatically generated. Do not edit\n";
+ $ipsecconf .= "config setup\n\tuniqueids = {$uniqueids}\n";
+ $ipsecconf .= "\tcharondebug=\"" . vpn_ipsec_configure_loglevels(true) . "\"\n";
+
+ if (isset($config['ipsec']['strictcrlpolicy'])) {
+ $ipsecconf .= "\tstrictcrlpolicy = yes \n";
+ }
+
+ if (!isset($config['ipsec']['noshuntlaninterfaces'])) {
+ if ($config['interfaces']['lan']) {
+ $lanip = get_interface_ip("lan");
+ if (!empty($lanip) && is_ipaddrv4($lanip)) {
+ $lansn = get_interface_subnet("lan");
+ $lansa = gen_subnet($lanip, $lansn);
+ $ipsecconf .= <<<EOD
+
+conn bypasslan
+ leftsubnet = {$lansa}/{$lansn}
+ rightsubnet = {$lansa}/{$lansn}
+ authby = never
+ type = passthrough
+ auto = route
+
+EOD;
+ }
+ }
+ }
+
+ foreach ($a_phase1 as $ph1ent) {
+ if (isset($ph1ent['disabled'])) {
+ continue;
+ }
+
+ if ($ph1ent['mode'] == "aggressive") {
+ $aggressive = "yes";
+ } else {
+ $aggressive = "no";
+ }
+
+ $ep = ipsec_get_phase1_src($ph1ent);
+ if (!$ep) {
+ continue;
+ }
+
+ $ikeid = $ph1ent['ikeid'];
+ $keyexchange = "ikev1";
+ $passive = "route";
+ if (!empty($ph1ent['iketype'])) {
+ if ($ph1ent['iketype'] == "ikev2") {
+ $keyexchange = "ikev2";
+ //$passive = "start";
+ }
+ }
+
+ if (isset($ph1ent['mobile'])) {
+ $right_spec = "%any";
+ $passive = 'add';
+ } else {
+ if (isset($ph1ent['responderonly'])) {
+ $passive = 'add';
+ }
+
+ $right_spec = $ph1ent['remote-gateway'];
+ if (is_ipaddr($right_spec)) {
+ $sourcehost = $right_spec;
+ } else {
+ $sourcehost = $rgmap['remote-gateway'];
+ }
+
+ if ($ph1ent['protocol'] == 'inet') {
+ if (strpos($ph1ent['interface'], '_vip')) {
+ $vpninterface = explode('_vip', $ph1ent['interface']);
+ $ifacesuse = get_real_interface($vpninterface[0]);
+ $vpninterface = $vpninterface[0];
+ } else {
+ $ifacesuse = get_failover_interface($ph1ent['interface']);
+ if (strpos($ifacesuse, '_vip')) {
+ $vpninterface = explode('_vip', $ifacesuse);
+ $ifacesuse = get_real_interface($vpninterface[0]);
+ $vpninterface = $vpninterface[0];
+ } else {
+ $vpninterface = convert_real_interface_to_friendly_interface_name($ifacesuse);
+ }
+ }
+
+ if (!empty($ifacesuse) && interface_has_gateway($vpninterface)) {
+ $gatewayip = get_interface_gateway($vpninterface);
+ $interfaceip = get_interface_ip($vpninterface);
+ $subnet_bits = get_interface_subnet($vpninterface);
+ $subnet_ip = gen_subnetv4($interfaceip, $subnet_bits);
+ /* if the remote gateway is in the local subnet, then don't add a route */
+ if (!ip_in_subnet($sourcehost, "{$subnet_ip}/{$subnet_bits}")) {
+ if (is_ipaddrv4($gatewayip)) {
+ // log_error("IPSEC interface is not WAN but {$ifacesuse}, adding static route for VPN endpoint {$rgip} via {$gatewayip}");
+ mwexec("/sbin/route change -host {$sourcehost} {$gatewayip}", true);
+ }
+ }
+ }
+ } else if ($ph1ent['protocol'] == 'inet6') {
+ if (strpos($ph1ent['interface'], '_vip')) {
+ $vpninterface = explode('_vip', $ph1ent['interface']);
+ $ifacesuse = get_real_interface($vpninterface[0]);
+ $vpninterface = $vpninterface[0];
+ } else {
+ $ifacesuse = get_failover_interface($ph1ent['interface']);
+ if (strpos($ifacesuse, '_vip')) {
+ $vpninterface = explode('_vip', $ifacesuse);
+ $ifacesuse = get_real_interface($vpninterface[0]);
+ $vpninterface = $vpninterface[0];
+ } else {
+ $vpninterface = convert_real_interface_to_friendly_interface_name($ifacesuse);
+ }
+ }
+
+ if (!empty($ifacesuse) && interface_has_gateway($vpninterface)) {
+ $gatewayip = get_interface_gateway_v6($vpninterface);
+ $interfaceip = get_interface_ipv6($vpninterface);
+ $subnet_bits = get_interface_subnetv6($vpninterface);
+ $subnet_ip = gen_subnetv6($interfaceip, $subnet_bits);
+ /* if the remote gateway is in the local subnet, then don't add a route */
+ if (!ip_in_subnet($sourcehost, "{$subnet_ip}/{$subnet_bits}")) {
+ if (is_ipaddrv6($gatewayip)) {
+ // log_error("IPSEC interface is not WAN but {$ifacesuse}, adding static route for VPN endpoint {$rgip} via {$gatewayip}");
+ mwexec("/sbin/route change -inet6 -host {$sourcehost} {$gatewayip}", true);
+ }
+ }
+ }
+ }
+ }
+
+ list ($myid_type, $myid_data) = ipsec_find_id($ph1ent, 'local');
+ if ($myid_type != 'address' && $myid_type != 'keyid' && $myid_type != 'asn1dn') {
+ $myid_data = "{$myid_type}:{$myid_data}";
+ } elseif ($myid_type == "asn1dn" && !empty($myid_data)) {
+ if ($myid_data[0] == '#') {
+ /* asn1dn needs double quotes */
+ $myid_data = "\"{$myid_type}:{$myid_data}\"";
+ } else {
+ $myid_data = "\"{$myid_data}\"";
+ }
+ }
+ $leftid = '';
+ if (!empty($myid_data)) {
+ $leftid = "leftid = {$myid_data}";
+ }
+
+ $peerid_spec = '';
+ if (isset($ph1ent['mobile']) && ($ph1ent['authentication_method'] == "pre_shared_key" || $ph1ent['authentication_method'] == "xauth_psk_server")) {
+ // Only specify peer ID if we are not dealing with mobile PSK
+ } else {
+ list ($peerid_type, $peerid_data) = ipsec_find_id($ph1ent, 'peer', $rgmap);
+ if ($peerid_type == 'any') {
+ $peerid_spec = '';
+ } elseif ($peerid_type != 'address' && $peerid_type != 'keyid' && $peerid_type != 'asn1dn') {
+ $peerid_spec = "{$peerid_type}:{$peerid_data}";
+ } elseif ($peerid_type == "asn1dn") {
+ /* asn1dn needs double quotes */
+ if ($peerid_data[0] == '#') {
+ $peerid_spec = "\"{$peerid_type}:{$peerid_data}\"";
+ } elseif (!empty($peerid_data)) {
+ $peerid_spec = "\"{$peerid_data}\"";
+ }
+ } else {
+ $peerid_spec = $peerid_data;
+ }
+ }
+
+ if (is_array($ph1ent['encryption-algorithm']) && !empty($ph1ent['encryption-algorithm']['name']) && !empty($ph1ent['hash-algorithm'])) {
+ $ealgosp1 = '';
+ $ealg_id = $ph1ent['encryption-algorithm']['name'];
+ $ealg_kl = $ph1ent['encryption-algorithm']['keylen'];
+ if ($ealg_kl) {
+ $ealgosp1 = "ike = {$ealg_id}{$ealg_kl}-{$ph1ent['hash-algorithm']}";
+ } else {
+ $ealgosp1 = "ike = {$ealg_id}-{$ph1ent['hash-algorithm']}";
+ }
+
+ $modp = vpn_ipsec_convert_to_modp($ph1ent['dhgroup']);
+ if (!empty($modp)) {
+ $ealgosp1 .= "-{$modp}";
+ }
+
+ $ealgosp1 .= "!";
+ }
+
+ if ($ph1ent['dpd_delay'] && $ph1ent['dpd_maxfail']) {
+ if ($passive == "route") {
+ $dpdline = "dpdaction = restart";
+ } else {
+ $dpdline = "dpdaction = clear";
+ }
+ $dpdline .= "\n\tdpddelay = {$ph1ent['dpd_delay']}s";
+ $dpdtimeout = $ph1ent['dpd_delay'] * ($ph1ent['dpd_maxfail'] + 1);
+ $dpdline .= "\n\tdpdtimeout = {$dpdtimeout}s";
+ } else {
+ $dpdline = "dpdaction = none";
+ }
+
+ $ikelifeline = '';
+ if ($ph1ent['lifetime']) {
+ $ikelifeline = "ikelifetime = {$ph1ent['lifetime']}s";
+ }
+
+ $rightsourceip = NULL;
+ if (isset($ph1ent['mobile']) && !empty($a_client['pool_address'])) {
+ $rightsourceip = "\trightsourceip = {$a_client['pool_address']}/{$a_client['pool_netbits']}\n";
+ }
+
+ $authentication = "";
+ switch ($ph1ent['authentication_method']) {
+ case 'eap-mschapv2':
+ if (isset($ph1ent['mobile'])) {
+ $authentication = "eap_identity=%any\n\t";
+ $authentication .= "leftauth=pubkey\n\trightauth=eap-mschapv2";
+ if (!empty($ph1ent['certref'])) {
+ $authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
+ }
+ }
+ break;
+ case 'eap-tls':
+ if (isset($ph1ent['mobile'])) {
+ $authentication = "eap_identity=%identity\n\t";
+ $authentication .= "leftauth=pubkey\n\trightauth=eap-tls";
+ if (!empty($ph1ent['certref'])) {
+ $authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
+ }
+ } else {
+ $authentication = "leftauth=eap-tls\n\trightauth=eap-tls";
+ if (!empty($ph1ent['certref'])) {
+ $authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
+ }
+ }
+ break;
+ case 'eap-radius':
+ if (isset($ph1ent['mobile'])) {
+ $authentication = "eap_identity=%identity\n\t";
+ $authentication .= "leftauth=pubkey\n\trightauth=eap-radius";
+ if (!empty($ph1ent['certref'])) {
+ $authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
+ }
+ } else {
+ $authentication = "leftauth=eap-radius\n\trightauth=eap-radius";
+ if (!empty($ph1ent['certref'])) {
+ $authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
+ }
+ }
+ break;
+ case 'xauth_rsa_server':
+ $authentication = "leftauth = pubkey\n\trightauth = pubkey";
+ $authentication .= "\n\trightauth2 = xauth-generic";
+ if (!empty($ph1ent['certref'])) {
+ $authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
+ }
+ break;
+ case 'xauth_psk_server':
+ $authentication = "leftauth = psk\n\trightauth = psk";
+ $authentication .= "\n\trightauth2 = xauth-generic";
+ break;
+ case 'pre_shared_key':
+ $authentication = "leftauth = psk\n\trightauth = psk";
+ break;
+ case 'rsasig':
+ $authentication = "leftauth = pubkey\n\trightauth = pubkey";
+ if (!empty($ph1ent['certref'])) {
+ $authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
+ }
+ break;
+ case 'hybrid_rsa_server':
+ $authentication = "leftauth = xauth-generic\n\trightauth = pubkey";
+ $authentication .= "\n\trightauth2 = xauth";
+ if (!empty($ph1ent['certref'])) {
+ $authentication .= "\n\tleftcert={$certpath}/cert-{$ph1ent['ikeid']}.crt";
+ }
+ break;
+ }
+
+ $left_spec = $ep;
+
+ if (isset($ph1ent['reauth_enable'])) {
+ $reauth = "reauth = no";
+ } else {
+ $reauth = "reauth = yes";
+ }
+ if (isset($ph1ent['rekey_enable'])) {
+ $rekey = "rekey = no";
+ } else {
+ $rekey = "rekey = yes";
+ }
+
+ if ($ph1ent['nat_traversal'] == 'off') {
+ $forceencaps = 'forceencaps = no';
+ } else if ($ph1ent['nat_traversal'] == 'force') {
+ $forceencaps = 'forceencaps = yes';
+ } else {
+ $forceencaps = 'forceencaps = no';
+ }
+
+ if ($ph1ent['mobike'] == 'on') {
+ $mobike = 'mobike = yes';
+ } else {
+ $mobike = 'mobike = no';
+ }
+
+ $ipseclifetime = 0;
+ $rightsubnet_spec = array();
+ $leftsubnet_spec = array();
+ $reqids = array();
+ $ealgoAHsp2arr = array();
+ $ealgoESPsp2arr = array();
+ if (is_array($a_phase2) && count($a_phase2)) {
+ foreach ($a_phase2 as $ph2ent) {
+ if ($ikeid != $ph2ent['ikeid']) {
+ continue;
+ }
+
+ if (isset($ph2ent['disabled'])) {
+ continue;
+ }
+
+ if (isset($ph2ent['mobile']) && !isset($a_client['enable'])) {
+ continue;
+ }
+
+ if (($ph2ent['mode'] == 'tunnel') or ($ph2ent['mode'] == 'tunnel6')) {
+ $tunneltype = "type = tunnel";
+
+ $localid_type = $ph2ent['localid']['type'];
+ $leftsubnet_data = ipsec_idinfo_to_cidr($ph2ent['localid'], false, $ph2ent['mode']);
+
+ /* Do not print localid in some cases, such as a pure-psk or psk/xauth single phase2 mobile tunnel */
+ if (($localid_type == "none" || $localid_type == "mobile") &&
+ isset($ph1ent['mobile']) && (ipsec_get_number_of_phase2($ikeid) == 1)) {
+ $left_spec = '%any';
+ } else {
+ if ($localid_type != "address") {
+ $localid_type = "subnet";
+ }
+ // Don't let an empty subnet into config, it can cause parse errors. Ticket #2201.
+ if (!is_ipaddr($leftsubnet_data) && !is_subnet($leftsubnet_data) && ($leftsubnet_data != "0.0.0.0/0")) {
+ log_error("Invalid IPsec Phase 2 \"{$ph2ent['descr']}\" - {$ph2ent['localid']['type']} has no subnet.");
+ continue;
+ }
+ if (!empty($ph2ent['natlocalid'])) {
+ $natleftsubnet_data = ipsec_idinfo_to_cidr($ph2ent['natlocalid'], false, $ph2ent['mode']);
+ if ($ph2ent['natlocalid']['type'] != "address") {
+ if (is_subnet($natleftsubnet_data)) {
+ $leftsubnet_data = "{$natleftsubnet_data}|{$leftsubnet_data}";
+ }
+ } else {
+ if (is_ipaddr($natleftsubnet_data)) {
+ $leftsubnet_data = "{$natleftsubnet_data}|{$leftsubnet_data}";
+ }
+ }
+ $natfilterrules = true;
+ }
+ }
+
+ $leftsubnet_spec[] = $leftsubnet_data;
+
+ if (!isset($ph2ent['mobile'])) {
+ $tmpsubnet = ipsec_idinfo_to_cidr($ph2ent['remoteid'], false, $ph2ent['mode']);
+ $rightsubnet_spec[] = $tmpsubnet;
+ } else if (!empty($a_client['pool_address'])) {
+ $rightsubnet_spec[] = "{$a_client['pool_address']}/{$a_client['pool_netbits']}";
+ }
+ } else {
+ $tunneltype = "type = transport";
+
+ if ((($ph1ent['authentication_method'] == "xauth_psk_server") ||
+ ($ph1ent['authentication_method'] == "pre_shared_key")) && isset($ph1ent['mobile'])) {
+ $left_spec = "%any";
+ } else {
+ $tmpsubnet = ipsec_get_phase1_src($ph1ent);
+ $leftsubnet_spec[] = $tmpsubnet;
+ }
+
+ if (!isset($ph2ent['mobile'])) {
+ $rightsubnet_spec[] = $right_spec;
+ }
+ }
+
+ if (isset($a_client['pfs_group']) && isset($ph2ent['mobile'])) {
+ $ph2ent['pfsgroup'] = $a_client['pfs_group'];
+ }
+
+ if ($ph2ent['protocol'] == 'esp') {
+ if (is_array($ph2ent['encryption-algorithm-option'])) {
+ foreach ($ph2ent['encryption-algorithm-option'] as $ealg) {
+ $ealg_id = $ealg['name'];
+ $ealg_kl = $ealg['keylen'];
+
+ if (!empty($ealg_kl) && $ealg_kl == "auto") {
+ if (empty($p2_ealgos) || !is_array($p2_ealgos)) {
+ require("ipsec.inc");
+ }
+ $key_hi = $p2_ealgos[$ealg_id]['keysel']['hi'];
+ $key_lo = $p2_ealgos[$ealg_id]['keysel']['lo'];
+ $key_step = $p2_ealgos[$ealg_id]['keysel']['step'];
+ /* XXX: in some cases where include ordering is suspect these variables
+ * are somehow 0 and we enter this loop forever and timeout after 900
+ * seconds wrecking bootup */
+ if ($key_hi != 0 and $key_lo != 0 and $key_step != 0) {
+ for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step) {
+ if (!empty($ph2ent['hash-algorithm-option']) && is_array($ph2ent['hash-algorithm-option'])) {
+ foreach ($ph2ent['hash-algorithm-option'] as $halgo) {
+ $halgo = str_replace('hmac_', '', $halgo);
+ $tmpealgo = "{$ealg_id}{$keylen}-{$halgo}";
+ $modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
+ if (!empty($modp)) {
+ $tmpealgo .= "-{$modp}";
+ }
+ $ealgoESPsp2arr[] = $tmpealgo;
+ }
+ } else {
+ $tmpealgo = "{$ealg_id}{$keylen}";
+ $modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
+ if (!empty($modp)) {
+ $tmpealgo .= "-{$modp}";
+ }
+ $ealgoESPsp2arr[] = $tmpealgo;
+ }
+ }
+ }
+ } else {
+ if (!empty($ph2ent['hash-algorithm-option']) && is_array($ph2ent['hash-algorithm-option'])) {
+ foreach ($ph2ent['hash-algorithm-option'] as $halgo) {
+ $halgo = str_replace('hmac_', '', $halgo);
+ $tmpealgo = "{$ealg_id}{$ealg_kl}-{$halgo}";
+ $modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
+ if (!empty($modp)) {
+ $tmpealgo .= "-{$modp}";
+ }
+ $ealgoESPsp2arr[] = $tmpealgo;
+ }
+ } else {
+ $tmpealgo = "{$ealg_id}{$ealg_kl}";
+ $modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
+ if (!empty($modp)) {
+ $tmpealgo .= "-{$modp}";
+ }
+ $ealgoESPsp2arr[] = $tmpealgo;
+ }
+ }
+ }
+ }
+ } else if ($ph2ent['protocol'] == 'ah') {
+ if (!empty($ph2ent['hash-algorithm-option']) && is_array($ph2ent['hash-algorithm-option'])) {
+ $modp = vpn_ipsec_convert_to_modp($ph2ent['pfsgroup']);
+ foreach ($ph2ent['hash-algorithm-option'] as $tmpAHalgo) {
+ $tmpAHalgo = str_replace('hmac_', '', $tmpAHalgo);
+ if (!empty($modp)) {
+ $tmpAHalgo = "-{$modp}";
+ }
+ $ealgoAHsp2arr[] = $tmpAHalgo;
+ }
+ }
+ }
+
+ $reqids[] = $ph2ent['reqid'];
+
+ if (!empty($ph2ent['lifetime'])) {
+ if ($ipseclifetime == 0 || intval($ipseclifetime) > intval($ph2ent['lifetime'])) {
+ $ipseclifetime = intval($ph2ent['lifetime']);
+ }
+ }
+
+ }
+ }
+
+ $ipsecconnect =<<<EOD
+ fragmentation = yes
+ keyexchange = {$keyexchange}
+ {$reauth}
+ {$forceencaps}
+ {$mobike}
+ {$rekey}
+ installpolicy = yes
+ {$tunneltype}
+ {$dpdline}
+ auto = {$passive}
+ left = {$left_spec}
+ right = {$right_spec}
+ {$leftid}
+
+EOD;
+
+ if (isset($config['ipsec']['compression'])) {
+ $ipsecconnect .= "\tcompress = yes\n";
+ $enablecompression = true;
+ }
+ if (!empty($ikelifeline)) {
+ $ipsecconnect .= "\t{$ikelifeline}\n";
+ }
+ if ($ipseclifetime > 0) {
+ $ipsecconnect .= "\tlifetime = {$ipseclifetime}s\n";
+ }
+ if (!empty($rightsourceip)) {
+ $ipsecconnect .= "{$rightsourceip}";
+ }
+ if (!empty($ealgosp1)) {
+ $ipsecconnect .= "\t{$ealgosp1}\n";
+ }
+ if (!empty($ealgoAHsp2arr)) {
+ $ipsecconnect .= "\tah = " . join(',', $ealgoAHsp2arr) . "!\n";
+ }
+ if (!empty($ealgoESPsp2arr)) {
+ $ipsecconnect .= "\tesp = " . join(',', $ealgoESPsp2arr) . "!\n";
+ }
+ if (!empty($authentication)) {
+ $ipsecconnect .= "\t{$authentication}\n";
+ }
+ if (!empty($peerid_spec)) {
+ $ipsecconnect .= "\trightid = {$peerid_spec}\n";
+ }
+ if ($keyexchange == 'ikev1') {
+ $ipsecconnect .= "\taggressive = {$aggressive}\n";
+ }
+
+ if (!isset($ph1ent['mobile']) && $keyexchange == 'ikev1') {
+ if (!empty($rightsubnet_spec)) {
+ $ipsecfin = '';
+ foreach ($rightsubnet_spec as $idx => $rsubnet) {
+ $ipsecfin .= "\nconn con{$ph1ent['ikeid']}00{$idx}\n";
+ //if (!empty($reqids[$idx])) {
+ // $ipsecfin .= "\treqid = " . $reqids[$idx] . "\n";
+ //}
+ $ipsecfin .= $ipsecconnect;
+ $ipsecfin .= "\trightsubnet = {$rsubnet}\n";
+ $ipsecfin .= "\tleftsubnet = " . $leftsubnet_spec[$idx] . "\n";
+ }
+ } else {
+ log_error("No phase2 specifications for tunnel with REQID = {$ikeid}");
+ }
+ } else {
+ $ipsecfin = "\nconn con{$ph1ent['ikeid']}\n";
+ //if (!empty($reqids[$idx])) {
+ // $ipsecfin .= "\treqid = " . $reqids[0] . "\n";
+ //}
+ $ipsecfin .= $ipsecconnect;
+ if (!isset($ph1ent['mobile']) && !empty($rightsubnet_spec)) {
+ $tempsubnets = array();
+ foreach ($rightsubnet_spec as $rightsubnet) {
+ $tempsubnets[$rightsubnet] = $rightsubnet;
+ }
+ $ipsecfin .= "\trightsubnet = " . join(",", $tempsubnets) . "\n";
+ unset($tempsubnets, $rightsubnet);
+ }
+ if (!empty($leftsubnet_spec)) {
+ $tempsubnets = array();
+ foreach ($leftsubnet_spec as $leftsubnet) {
+ $tempsubnets[$leftsubnet] = $leftsubnet;
+ }
+ $ipsecfin .= "\tleftsubnet = " . join(",", $tempsubnets) . "\n";
+ unset($tempsubnets, $leftsubnet);
+ }
+ }
+ $ipsecconf .= $ipsecfin;
+ unset($ipsecfin);
+ }
+ }
+
+ @file_put_contents("{$g['varetc_path']}/ipsec/ipsec.conf", $ipsecconf);
+ unset($ipsecconf);
+ /* end ipsec.conf */
+
+ if ($enablecompression === true) {
+ set_single_sysctl('net.inet.ipcomp.ipcomp_enable', 1);
+ } else {
+ set_single_sysctl('net.inet.ipcomp.ipcomp_enable', 0);
+ }
+
+ /* manage process */
+ if ($restart === true) {
+ mwexec("/usr/local/sbin/ipsec restart", false);
+ } else {
+ if (isvalidpid("{$g['varrun_path']}/starter.charon.pid")) {
+ /* Update configuration changes */
+ /* Read secrets */
+ mwexec("/usr/local/sbin/ipsec rereadall", false);
+ mwexec("/usr/local/sbin/ipsec reload", false);
+ } else {
+ mwexec("/usr/local/sbin/ipsec start", false);
+ }
+ }
+
+ if ($natfilterrules == true) {
+ filter_configure();
+ }
+ /* start filterdns, if necessary */
+ if (count($filterdns_list) > 0) {
+ $interval = 60;
+ if (!empty($ipseccfg['dns-interval']) && is_numeric($ipseccfg['dns-interval'])) {
+ $interval = $ipseccfg['dns-interval'];
+ }
+
+ $hostnames = "";
+ array_unique($filterdns_list);
+ foreach ($filterdns_list as $hostname) {
+ $hostnames .= "cmd {$hostname} '/usr/local/sbin/pfSctl -c \"service reload ipsecdns\"'\n";
+ }
+ file_put_contents("{$g['varetc_path']}/ipsec/filterdns-ipsec.hosts", $hostnames);
+ unset($hostnames);
+
+ if (isvalidpid("{$g['varrun_path']}/filterdns-ipsec.pid")) {
+ sigkillbypid("{$g['varrun_path']}/filterdns-ipsec.pid", "HUP");
+ } else {
+ mwexec("/usr/local/sbin/filterdns -p {$g['varrun_path']}/filterdns-ipsec.pid -i {$interval} -c {$g['varetc_path']}/ipsec/filterdns-ipsec.hosts -d 1");
+ }
+ } else {
+ killbypid("{$g['varrun_path']}/filterdns-ipsec.pid");
+ @unlink("{$g['varrun_path']}/filterdns-ipsec.pid");
+ }
+
+ if (platform_booting()) {
+ echo "done\n";
+ }
+
+ return count($filterdns_list);
+}
+
+/*
+ * Forcefully restart IPsec
+ * This is required for when dynamic interfaces reload
+ * For all other occasions the normal vpn_ipsec_configure()
+ * will gracefully reload the settings without restarting
+ */
+function vpn_ipsec_force_reload($interface = "") {
+ global $g, $config;
+
+ $ipseccfg = $config['ipsec'];
+
+ if (!empty($interface) && is_array($ipseccfg['phase1'])) {
+ $found = false;
+ foreach ($ipseccfg['phase1'] as $ipsec) {
+ if (!isset($ipsec['disabled']) && ($ipsec['interface'] == $interface)) {
+ $found = true;
+ break;
+ }
+ }
+ if (!$found) {
+ log_error(sprintf(gettext("Ignoring IPsec reload since there are no tunnels on interface %s"), $interface));
+ return;
+ }
+ }
+
+ /* if ipsec is enabled, start up again */
+ if (isset($ipseccfg['enable'])) {
+ log_error(gettext("Forcefully reloading IPsec"));
+ vpn_ipsec_configure();
+ }
+}
+
+/* master setup for vpn (mpd) */
+function vpn_setup() {
+ /* start pptpd */
+ vpn_pptpd_configure();
+
+ /* start pppoe server */
+ vpn_pppoes_configure();
+
+ /* setup l2tp */
+ vpn_l2tp_configure();
+}
+
+function vpn_netgraph_support() {
+ $iflist = get_configured_interface_list();
+ foreach ($iflist as $iface) {
+ $realif = get_real_interface($iface);
+ /* Get support for netgraph(4) from the nic */
+ $ifinfo = pfSense_get_interface_addresses($realif);
+ if (!empty($ifinfo) && in_array($ifinfo['iftype'], array("ether", "vlan", "bridge"))) {
+ pfSense_ngctl_attach(".", $realif);
+ }
+ }
+}
+
+function vpn_pptpd_configure() {
+ global $config, $g;
+
+ $syscfg = $config['system'];
+ $pptpdcfg = $config['pptpd'];
+
+ if (platform_booting()) {
+ if (!$pptpdcfg['mode'] || ($pptpdcfg['mode'] == "off")) {
+ return 0;
+ }
+
+ if (platform_booting(true)) {
+ echo gettext("Configuring PPTP VPN service... ");
+ }
+ } else {
+ /* kill mpd */
+ killbypid("{$g['varrun_path']}/pptp-vpn.pid");
+
+ /* wait for process to die */
+ sleep(3);
+
+ if (is_process_running("mpd -b")) {
+ killbypid("{$g['varrun_path']}/pptp-vpn.pid");
+ log_error(gettext("Could not kill mpd within 3 seconds. Trying again."));
+ }
+
+ /* remove mpd.conf, if it exists */
+ unlink_if_exists("{$g['varetc_path']}/pptp-vpn/mpd.conf");
+ unlink_if_exists("{$g['varetc_path']}/pptp-vpn/mpd.links");
+ unlink_if_exists("{$g['varetc_path']}/pptp-vpn/mpd.secret");
+ }
+
+ if (empty($pptpdcfg['n_pptp_units'])) {
+ log_error("Something wrong in the PPTPd configuration. Preventing starting the daemon because issues would arise.");
+ return;
+ }
+
+ /* make sure pptp-vpn directory exists */
+ if (!file_exists("{$g['varetc_path']}/pptp-vpn")) {
+ mkdir("{$g['varetc_path']}/pptp-vpn");
+ }
+
+ switch ($pptpdcfg['mode']) {
+ case 'server':
+ /* write mpd.conf */
+ $fd = fopen("{$g['varetc_path']}/pptp-vpn/mpd.conf", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open mpd.conf in vpn_pptpd_configure().") . "\n");
+ return 1;
+ }
+
+ $mpdconf = <<<EOD
+pptps:
+
+EOD;
+
+ for ($i = 0; $i < $pptpdcfg['n_pptp_units']; $i++) {
+ $mpdconf .= " load pt{$i}\n";
+ }
+
+ for ($i = 0; $i < $pptpdcfg['n_pptp_units']; $i++) {
+
+ $clientip = long2ip32(ip2long($pptpdcfg['remoteip']) + $i);
+
+ $mpdconf .= <<<EOD
+
+pt{$i}:
+ new -i pptpd{$i} pt{$i} pt{$i}
+ set ipcp ranges {$pptpdcfg['localip']}/32 {$clientip}/32
+ load pts
+
+EOD;
+ }
+
+ $mpdconf .=<<<EOD
+
+pts:
+ set iface disable on-demand
+ set iface enable proxy-arp
+ set iface enable tcpmssfix
+ set iface idle 1800
+ set iface up-script /usr/local/sbin/vpn-linkup
+ set iface down-script /usr/local/sbin/vpn-linkdown
+ set bundle enable multilink
+ set bundle enable crypt-reqd
+ set link yes acfcomp protocomp
+ set link no pap chap
+ set link enable chap-msv2
+ set link mtu 1460
+ set link keep-alive 10 60
+ set ipcp yes vjcomp
+ set bundle enable compression
+ set ccp yes mppc
+ set ccp yes mpp-e128
+ set ccp yes mpp-stateless
+
+EOD;
+
+ if (!isset ($pptpdcfg['req128'])) {
+ $mpdconf .=<<<EOD
+ set ccp yes mpp-e40
+ set ccp yes mpp-e56
+
+EOD;
+ }
+
+ if (isset($pptpdcfg["wins"]) && $pptpdcfg['wins'] != "") {
+ $mpdconf .= " set ipcp nbns {$pptpdcfg['wins']}\n";
+ }
+
+ if (!empty($pptpdcfg['dns1'])) {
+ $mpdconf .= " set ipcp dns " . $pptpdcfg['dns1'];
+ if (!empty($pptpdcfg['dns2'])) {
+ $mpdconf .= " " . $pptpdcfg['dns2'];
+ }
+ $mpdconf .= "\n";
+ } elseif (isset ($config['dnsmasq']['enable'])) {
+ $mpdconf .= " set ipcp dns " . get_interface_ip("lan");
+ if ($syscfg['dnsserver'][0]) {
+ $mpdconf .= " " . $syscfg['dnsserver'][0];
+ }
+ $mpdconf .= "\n";
+ } elseif (isset($config['unbound']['enable'])) {
+ $mpdconf .= " set ipcp dns " . get_interface_ip("lan");
+ if ($syscfg['dnsserver'][0]) {
+ $mpdconf .= " " . $syscfg['dnsserver'][0];
+ }
+ $mpdconf .= "\n";
+ } elseif (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
+ $mpdconf .= " set ipcp dns " . join(" ", $syscfg['dnsserver']) . "\n";
+ }
+
+ if (isset ($pptpdcfg['radius']['server']['enable'])) {
+ $authport = (isset($pptpdcfg['radius']['server']['port']) && strlen($pptpdcfg['radius']['server']['port']) > 1) ? $pptpdcfg['radius']['server']['port'] : 1812;
+ $acctport = $authport + 1;
+ $mpdconf .=<<<EOD
+ set radius server {$pptpdcfg['radius']['server']['ip']} "{$pptpdcfg['radius']['server']['secret']}" {$authport} {$acctport}
+
+EOD;
+ if (isset ($pptpdcfg['radius']['server2']['enable'])) {
+ $authport = (isset($pptpdcfg['radius']['server2']['port']) && strlen($pptpdcfg['radius']['server2']['port']) > 1) ? $pptpdcfg['radius']['server2']['port'] : 1812;
+ $acctport = $authport + 1;
+ $mpdconf .=<<<EOD
+ set radius server {$pptpdcfg['radius']['server2']['ip']} "{$pptpdcfg['radius']['server2']['secret2']}" {$authport} {$acctport}
+
+EOD;
+ }
+ $mpdconf .=<<<EOD
+ set radius retries 3
+ set radius timeout 10
+ set auth enable radius-auth
+
+EOD;
+
+ if (isset ($pptpdcfg['radius']['accounting'])) {
+ $mpdconf .=<<<EOD
+ set auth enable radius-acct
+ set radius acct-update 300
+
+EOD;
+ }
+ }
+
+ fwrite($fd, $mpdconf);
+ fclose($fd);
+ unset($mpdconf);
+
+ /* write mpd.links */
+ $fd = fopen("{$g['varetc_path']}/pptp-vpn/mpd.links", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open mpd.links in vpn_pptpd_configure().") . "\n");
+ return 1;
+ }
+
+ $mpdlinks = "";
+
+ for ($i = 0; $i < $pptpdcfg['n_pptp_units']; $i++) {
+ $mpdlinks .=<<<EOD
+
+pt{$i}:
+ set link type pptp
+ set pptp enable incoming
+ set pptp disable originate
+ set pptp disable windowing
+
+EOD;
+ }
+
+ fwrite($fd, $mpdlinks);
+ fclose($fd);
+ unset($mpdlinks);
+
+ /* write mpd.secret */
+ $fd = fopen("{$g['varetc_path']}/pptp-vpn/mpd.secret", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open mpd.secret in vpn_pptpd_configure().") . "\n");
+ return 1;
+ }
+
+ $mpdsecret = "";
+
+ if (is_array($pptpdcfg['user'])) {
+ foreach ($pptpdcfg['user'] as $user) {
+ $pass = str_replace('\\', '\\\\', $user['password']);
+ $pass = str_replace('"', '\"', $pass);
+ $mpdsecret .= "{$user['name']} \"{$pass}\" {$user['ip']}\n";
+ }
+ }
+
+ fwrite($fd, $mpdsecret);
+ fclose($fd);
+ unset($mpdsecret);
+ chmod("{$g['varetc_path']}/pptp-vpn/mpd.secret", 0600);
+
+ vpn_netgraph_support();
+
+ /* fire up mpd */
+ mwexec("/usr/local/sbin/mpd4 -b -d {$g['varetc_path']}/pptp-vpn -p {$g['varrun_path']}/pptp-vpn.pid -s pptps pptps");
+
+ break;
+
+ case 'redir':
+ break;
+ }
+
+ if (platform_booting()) {
+ echo "done\n";
+ }
+
+ return 0;
+}
+
+function vpn_pppoes_configure() {
+ global $config;
+
+ if (is_array($config['pppoes']['pppoe'])) {
+ foreach ($config['pppoes']['pppoe'] as $pppoe) {
+ vpn_pppoe_configure($pppoe);
+ }
+ }
+}
+
+function vpn_pppoe_configure(&$pppoecfg) {
+ global $config, $g;
+
+ $syscfg = $config['system'];
+
+ /* create directory if it does not exist */
+ if (!is_dir("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn")) {
+ mkdir("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn");
+ }
+
+ if (platform_booting()) {
+ if (!$pppoecfg['mode'] || ($pppoecfg['mode'] == "off")) {
+ return 0;
+ }
+
+ echo gettext("Configuring PPPoE Server service... ");
+ } else {
+ /* kill mpd */
+ killbypid("{$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid");
+
+ /* wait for process to die */
+ sleep(2);
+
+ }
+
+ switch ($pppoecfg['mode']) {
+
+ case 'server':
+
+ $pppoe_interface = get_real_interface($pppoecfg['interface']);
+
+ if ($pppoecfg['paporchap'] == "chap") {
+ $paporchap = "set link enable chap";
+ } else {
+ $paporchap = "set link enable pap";
+ }
+
+ /* write mpd.conf */
+ $fd = fopen("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.conf", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open mpd.conf in vpn_pppoe_configure().") . "\n");
+ return 1;
+ }
+ $mpdconf = "\n\n";
+ $mpdconf .= "poes:\n";
+
+ for ($i = 0; $i < $pppoecfg['n_pppoe_units']; $i++) {
+ $mpdconf .= " load poes{$pppoecfg['pppoeid']}{$i}\n";
+ }
+
+ for ($i = 0; $i < $pppoecfg['n_pppoe_units']; $i++) {
+
+ $clientip = long2ip32(ip2long($pppoecfg['remoteip']) + $i);
+
+ if (isset($pppoecfg['radius']['radiusissueips']) && isset($pppoecfg['radius']['server']['enable'])) {
+ $issue_ip_type = "set ipcp ranges {$pppoecfg['localip']}/32 0.0.0.0/0";
+ } else {
+ $issue_ip_type = "set ipcp ranges {$pppoecfg['localip']}/32 {$clientip}/32";
+ }
+
+ $mpdconf .=<<<EOD
+
+poes{$pppoecfg['pppoeid']}{$i}:
+ new -i poes{$pppoecfg['pppoeid']}{$i} poes{$pppoecfg['pppoeid']}{$i} poes{$pppoecfg['pppoeid']}{$i}
+ {$issue_ip_type}
+ load pppoe_standard
+
+EOD;
+ }
+
+ $mpdconf .=<<<EOD
+
+pppoe_standard:
+ set bundle no multilink
+ set bundle enable compression
+ set auth max-logins 1
+ set iface up-script /usr/local/sbin/vpn-linkup
+ set iface down-script /usr/local/sbin/vpn-linkdown
+ set iface idle 0
+ set iface disable on-demand
+ set iface disable proxy-arp
+ set iface enable tcpmssfix
+ set iface mtu 1500
+ set link no pap chap
+ {$paporchap}
+ set link keep-alive 60 180
+ set ipcp yes vjcomp
+ set ipcp no vjcomp
+ set link max-redial -1
+ set link mtu 1492
+ set link mru 1492
+ set ccp yes mpp-e40
+ set ccp yes mpp-e128
+ set ccp yes mpp-stateless
+ set link latency 1
+ #set ipcp dns 10.10.1.3
+ #set bundle accept encryption
+
+EOD;
+
+ if (!empty($pppoecfg['dns1'])) {
+ $mpdconf .= " set ipcp dns " . $pppoecfg['dns1'];
+ if (!empty($pppoecfg['dns2'])) {
+ $mpdconf .= " " . $pppoecfg['dns2'];
+ }
+ $mpdconf .= "\n";
+ } elseif (isset ($config['dnsmasq']['enable'])) {
+ $mpdconf .= " set ipcp dns " . get_interface_ip("lan");
+ if ($syscfg['dnsserver'][0]) {
+ $mpdconf .= " " . $syscfg['dnsserver'][0];
+ }
+ $mpdconf .= "\n";
+ } elseif (isset ($config['unbound']['enable'])) {
+ $mpdconf .= " set ipcp dns " . get_interface_ip("lan");
+ if ($syscfg['dnsserver'][0]) {
+ $mpdconf .= " " . $syscfg['dnsserver'][0];
+ }
+ $mpdconf .= "\n";
+ } elseif (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
+ $mpdconf .= " set ipcp dns " . join(" ", $syscfg['dnsserver']) . "\n";
+ }
+
+ if (isset ($pppoecfg['radius']['server']['enable'])) {
+ $radiusport = "";
+ $radiusacctport = "";
+ if (isset($pppoecfg['radius']['server']['port'])) {
+ $radiusport = $pppoecfg['radius']['server']['port'];
+ }
+ if (isset($pppoecfg['radius']['server']['acctport'])) {
+ $radiusacctport = $pppoecfg['radius']['server']['acctport'];
+ }
+ $mpdconf .=<<<EOD
+ set radius server {$pppoecfg['radius']['server']['ip']} "{$pppoecfg['radius']['server']['secret']}" {$radiusport} {$radiusacctport}
+ set radius retries 3
+ set radius timeout 10
+ set auth enable radius-auth
+
+EOD;
+
+ if (isset ($pppoecfg['radius']['accounting'])) {
+ $mpdconf .=<<<EOD
+ set auth enable radius-acct
+
+EOD;
+ }
+ }
+
+ fwrite($fd, $mpdconf);
+ fclose($fd);
+ unset($mpdconf);
+
+ /* write mpd.links */
+ $fd = fopen("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.links", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open mpd.links in vpn_pppoe_configure().") . "\n");
+ return 1;
+ }
+
+ $mpdlinks = "";
+
+ for ($i = 0; $i < $pppoecfg['n_pppoe_units']; $i++) {
+ $mpdlinks .=<<<EOD
+
+poes{$pppoecfg['pppoeid']}{$i}:
+ set phys type pppoe
+ set pppoe iface {$pppoe_interface}
+ set pppoe service "*"
+ set pppoe disable originate
+ set pppoe enable incoming
+
+EOD;
+ }
+
+ fwrite($fd, $mpdlinks);
+ fclose($fd);
+ unset($mpdlinks);
+
+ if ($pppoecfg['username']) {
+ /* write mpd.secret */
+ $fd = fopen("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.secret", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open mpd.secret in vpn_pppoe_configure().") . "\n");
+ return 1;
+ }
+
+ $mpdsecret = "\n\n";
+
+ if (!empty($pppoecfg['username'])) {
+ $item = explode(" ", $pppoecfg['username']);
+ foreach ($item as $userdata) {
+ $data = explode(":", $userdata);
+ $mpdsecret .= "{$data[0]} \"" . base64_decode($data[1]) . "\" {$data[2]}\n";
+ }
+ }
+
+ fwrite($fd, $mpdsecret);
+ fclose($fd);
+ unset($mpdsecret);
+ chmod("{$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn/mpd.secret", 0600);
+ }
+
+ /* Check if previous instance is still up */
+ while (file_exists("{$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid") && isvalidpid("{$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid")) {
+ killbypid("{$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid");
+ }
+
+ /* Get support for netgraph(4) from the nic */
+ pfSense_ngctl_attach(".", $pppoe_interface);
+ /* fire up mpd */
+ mwexec("/usr/local/sbin/mpd4 -b -d {$g['varetc_path']}/pppoe{$pppoecfg['pppoeid']}-vpn -p {$g['varrun_path']}/pppoe{$pppoecfg['pppoeid']}-vpn.pid -s poes poes");
+
+ break;
+ }
+
+ if (platform_booting()) {
+ echo gettext("done") . "\n";
+ }
+
+ return 0;
+}
+
+function vpn_l2tp_configure() {
+ global $config, $g;
+
+ $syscfg = $config['system'];
+ $l2tpcfg = $config['l2tp'];
+
+ /* create directory if it does not exist */
+ if (!is_dir("{$g['varetc_path']}/l2tp-vpn")) {
+ mkdir("{$g['varetc_path']}/l2tp-vpn");
+ }
+
+ if (platform_booting()) {
+ if (!$l2tpcfg['mode'] || ($l2tpcfg['mode'] == "off")) {
+ return 0;
+ }
+
+ echo gettext("Configuring l2tp VPN service... ");
+ } else {
+ /* kill mpd */
+ killbypid("{$g['varrun_path']}/l2tp-vpn.pid");
+
+ /* wait for process to die */
+ sleep(8);
+
+ }
+
+ /* make sure l2tp-vpn directory exists */
+ if (!file_exists("{$g['varetc_path']}/l2tp-vpn")) {
+ mkdir("{$g['varetc_path']}/l2tp-vpn");
+ }
+
+ switch ($l2tpcfg['mode']) {
+
+ case 'server':
+ if ($l2tpcfg['paporchap'] == "chap") {
+ $paporchap = "set link enable chap";
+ } else {
+ $paporchap = "set link enable pap";
+ }
+
+ /* write mpd.conf */
+ $fd = fopen("{$g['varetc_path']}/l2tp-vpn/mpd.conf", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open mpd.conf in vpn_l2tp_configure().") . "\n");
+ return 1;
+ }
+ $mpdconf = "\n\n";
+ $mpdconf .=<<<EOD
+l2tps:
+
+EOD;
+
+ for ($i = 0; $i < $l2tpcfg['n_l2tp_units']; $i++) {
+ $mpdconf .= " load l2tp{$i}\n";
+ }
+
+ for ($i = 0; $i < $l2tpcfg['n_l2tp_units']; $i++) {
+
+ $clientip = long2ip32(ip2long($l2tpcfg['remoteip']) + $i);
+
+ if (isset ($l2tpcfg['radius']['radiusissueips']) && isset ($l2tpcfg['radius']['enable'])) {
+ $issue_ip_type = "set ipcp ranges {$l2tpcfg['localip']}/32 0.0.0.0/0";
+ } else {
+ $issue_ip_type = "set ipcp ranges {$l2tpcfg['localip']}/32 {$clientip}/32";
+ }
+
+ $mpdconf .=<<<EOD
+
+l2tp{$i}:
+ new -i l2tp{$i} l2tp{$i} l2tp{$i}
+ {$issue_ip_type}
+ load l2tp_standard
+
+EOD;
+ }
+
+ $mpdconf .=<<<EOD
+
+l2tp_standard:
+ set bundle disable multilink
+ set bundle enable compression
+ set bundle yes crypt-reqd
+ set ipcp yes vjcomp
+ # set ipcp ranges 131.188.69.161/32 131.188.69.170/28
+ set ccp yes mppc
+ set iface disable on-demand
+ set iface enable proxy-arp
+ set iface up-script /usr/local/sbin/vpn-linkup
+ set iface down-script /usr/local/sbin/vpn-linkdown
+ set link yes acfcomp protocomp
+ set link no pap chap
+ {$paporchap}
+ set link keep-alive 10 180
+
+EOD;
+
+ if (is_ipaddr($l2tpcfg['wins'])) {
+ $mpdconf .= " set ipcp nbns {$l2tpcfg['wins']}\n";
+ }
+ if (is_ipaddr($l2tpcfg['dns1'])) {
+ $mpdconf .= " set ipcp dns " . $l2tpcfg['dns1'];
+ if (is_ipaddr($l2tpcfg['dns2'])) {
+ $mpdconf .= " " . $l2tpcfg['dns2'];
+ }
+ $mpdconf .= "\n";
+ } elseif (isset ($config['dnsmasq']['enable'])) {
+ $mpdconf .= " set ipcp dns " . get_interface_ip("lan");
+ if ($syscfg['dnsserver'][0]) {
+ $mpdconf .= " " . $syscfg['dnsserver'][0];
+ }
+ $mpdconf .= "\n";
+ } elseif (isset ($config['unbound']['enable'])) {
+ $mpdconf .= " set ipcp dns " . get_interface_ip("lan");
+ if ($syscfg['dnsserver'][0]) {
+ $mpdconf .= " " . $syscfg['dnsserver'][0];
+ }
+ $mpdconf .= "\n";
+ } elseif (is_array($syscfg['dnsserver']) && ($syscfg['dnsserver'][0])) {
+ $mpdconf .= " set ipcp dns " . join(" ", $syscfg['dnsserver']) . "\n";
+ }
+
+ if (isset ($l2tpcfg['radius']['enable'])) {
+ $mpdconf .=<<<EOD
+ set radius server {$l2tpcfg['radius']['server']} "{$l2tpcfg['radius']['secret']}"
+ set radius retries 3
+ set radius timeout 10
+ set auth enable radius-auth
+
+EOD;
+
+ if (isset ($l2tpcfg['radius']['accounting'])) {
+ $mpdconf .=<<<EOD
+ set auth enable radius-acct
+
+EOD;
+ }
+ }
+
+ fwrite($fd, $mpdconf);
+ fclose($fd);
+ unset($mpdconf);
+
+ /* write mpd.links */
+ $fd = fopen("{$g['varetc_path']}/l2tp-vpn/mpd.links", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open mpd.links in vpn_l2tp_configure().") . "\n");
+ return 1;
+ }
+
+ $mpdlinks = "";
+
+ for ($i = 0; $i < $l2tpcfg['n_l2tp_units']; $i++) {
+ $mpdlinks .=<<<EOD
+
+l2tp{$i}:
+ set link type l2tp
+ set l2tp enable incoming
+ set l2tp disable originate
+
+EOD;
+ if (!empty($l2tpcfg['secret'])) {
+ $mpdlinks .= "set l2tp secret {$l2tpcfg['secret']}\n";
+ }
+ }
+
+ fwrite($fd, $mpdlinks);
+ fclose($fd);
+ unset($mpdlinks);
+
+ /* write mpd.secret */
+ $fd = fopen("{$g['varetc_path']}/l2tp-vpn/mpd.secret", "w");
+ if (!$fd) {
+ printf(gettext("Error: cannot open mpd.secret in vpn_l2tp_configure().") . "\n");
+ return 1;
+ }
+
+ $mpdsecret = "\n\n";
+
+ if (is_array($l2tpcfg['user'])) {
+ foreach ($l2tpcfg['user'] as $user) {
+ $mpdsecret .= "{$user['name']} \"{$user['password']}\" {$user['ip']}\n";
+ }
+ }
+
+ fwrite($fd, $mpdsecret);
+ fclose($fd);
+ unset($mpdsecret);
+ chmod("{$g['varetc_path']}/l2tp-vpn/mpd.secret", 0600);
+
+ vpn_netgraph_support();
+
+ /* fire up mpd */
+ mwexec("/usr/local/sbin/mpd4 -b -d {$g['varetc_path']}/l2tp-vpn -p {$g['varrun_path']}/l2tp-vpn.pid -s l2tps l2tps");
+
+ break;
+
+ case 'redir':
+ break;
+ }
+
+ if (platform_booting()) {
+ echo "done\n";
+ }
+
+ return 0;
+}
+
+?>
diff --git a/src/etc/inc/vslb.inc b/src/etc/inc/vslb.inc
new file mode 100644
index 0000000..05bef31
--- /dev/null
+++ b/src/etc/inc/vslb.inc
@@ -0,0 +1,564 @@
+<?php
+/* $Id$ */
+/*
+ vslb.inc
+ Copyright (C) 2005-2008 Bill Marquette
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ */
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/relayd
+ pfSense_MODULE: routing
+*/
+
+
+/* include all configuration functions */
+
+class Monitor {
+ private $conf = array();
+ function __construct($config) {
+ $this->conf = $config;
+ }
+
+ public function p() {
+ return "check {$this->get('proto')}";
+ }
+ private function get($var) {
+ return isset($this->$var) ? $this->$var : "";
+ }
+ protected function config($element) {
+ return isset($this->conf[$element]) ? $this->conf[$element] : "";
+ }
+}
+
+class TCPMonitor extends Monitor {
+ protected $proto = 'tcp';
+}
+
+class SSLMonitor extends Monitor {
+ protected $proto = 'ssl';
+}
+
+class ICMPMonitor extends Monitor {
+ protected $proto = 'icmp';
+}
+
+class HTTPMonitor extends Monitor {
+ protected $proto = 'http';
+ function __construct($config) {
+ parent::__construct($config);
+ }
+ public function p() {
+ $method = ($this->code() != "") ? $this->code() : $this->digest();
+ return "check {$this->proto} {$this->path()} {$this->host()} {$method}";
+ }
+
+ private function path() {
+ return $this->config('path') != "" ? "'{$this->config('path')}'" : "";
+ }
+
+ private function host() {
+ return $this->config('host') != "" ? "host {$this->config('host')}" : "";
+ }
+
+ private function code() {
+ return $this->config('code') != "" ? "code {$this->config('code')}" : "";
+ }
+
+ private function digest() {
+ return $this->config('digest') != "" ? "digest {$this->config('digest')}" : "";
+ }
+}
+
+class HTTPSMonitor extends HTTPMonitor {
+ protected $proto = 'https';
+}
+
+class SendMonitor extends Monitor {
+ private $proto = 'send';
+ function __construct($config) {
+ parent::__construct($config);
+ }
+ public function p() {
+ return "check {$this->proto} {$this->data()} expect {$this->pattern()} {$this->ssl()}";
+ }
+
+
+ private function data() {
+ return $this->config('send') != "" ? "\"{$this->config('send')}\"" : "\"\"";
+ }
+
+ private function pattern() {
+ return $this->config('expect') != "" ? "\"{$this->config('expect')}\"" : "\"\"";
+ }
+
+ private function ssl() {
+ return $this->config('ssl') == true ? "ssl" : "";
+ }
+}
+
+function echo_lbaction($action) {
+ global $config;
+
+ // Index actions by name
+ $actions_a = array();
+ for ($i = 0; isset($config['load_balancer']['lbaction'][$i]); $i++) {
+ $actions_a[$config['load_balancer']['lbaction'][$i]['name']] = $config['load_balancer']['lbaction'][$i];
+ }
+
+ $ret = "";
+ $ret .= "{$actions_a[$action]['direction']} {$actions_a[$action]['type']} {$actions_a[$action]['action']}";
+ switch ($actions_a[$action]['action']) {
+ case 'append':
+ $ret .= " \"{$actions_a[$action]['options']['value']}\" to \"{$actions_a[$action]['options']['akey']}\"";
+ break;
+ case 'change':
+ $ret .= " \"{$actions_a[$action]['options']['akey']}\" to \"{$actions_a[$action]['options']['value']}\"";
+ break;
+ case 'expect':
+ $ret .= " \"{$actions_a[$action]['options']['value']}\" from \"{$actions_a[$action]['options']['akey']}\"";
+ break;
+ case 'filter':
+ $ret .= " \"{$actions_a[$action]['options']['value']}\" from \"{$actions_a[$action]['options']['akey']}\"";
+ break;
+ case 'hash':
+ $ret .= " \"{$actions_a[$action]['options']['akey']}\"";
+ break;
+ case 'log':
+ $ret .= " \"{$actions_a[$action]['options']['akey']}\"";
+ break;
+ }
+ return $ret;
+}
+
+function relayd_configure($kill_first=false) {
+ global $config, $g;
+
+ // have to do this until every call to filter.inc is
+ // require_once() instead of require().
+ if (!function_exists('filter_expand_alias_array')) {
+ require_once("filter.inc");
+ }
+
+ $vs_a = $config['load_balancer']['virtual_server'];
+ $pool_a = $config['load_balancer']['lbpool'];
+ $protocol_a = $config['load_balancer']['lbprotocol'];
+ $setting = $config['load_balancer']['setting'];
+
+ $check_a = array();
+
+ foreach ((array)$config['load_balancer']['monitor_type'] as $type) {
+ switch ($type['type']) {
+ case 'icmp':
+ $mon = new ICMPMonitor($type['options']);
+ break;
+ case 'tcp':
+ $mon = new TCPMonitor($type['options']);
+ break;
+ case 'http':
+ $mon = new HTTPMonitor($type['options']);
+ break;
+ case 'https':
+ $mon = new HTTPSMonitor($type['options']);
+ break;
+ case 'send':
+ $mon = new SendMonitor($type['options']);
+ break;
+ }
+ if ($mon) {
+ $check_a[$type['name']] = $mon->p();
+ }
+ }
+
+
+ $fd = fopen("{$g['varetc_path']}/relayd.conf", "w");
+ $conf .= "log updates \n";
+
+ /* Global timeout, interval and prefork settings
+ if not specified by the user:
+ - use a 1000 ms timeout value as in pfsense 2.0.1 and above
+ - leave interval and prefork empty, relayd will use its default values */
+
+ if (isset($setting['timeout']) && !empty($setting['timeout'])) {
+ $conf .= "timeout ".$setting['timeout']." \n";
+ } else {
+ $conf .= "timeout 1000 \n";
+ }
+
+ if (isset($setting['interval']) && !empty($setting['interval'])) {
+ $conf .= "interval ".$setting['interval']." \n";
+ }
+
+ if (isset($setting['prefork']) && !empty($setting['prefork'])) {
+ $conf .= "prefork ".$setting['prefork']." \n";
+ }
+
+ /* reindex pools by name as we loop through the pools array */
+ $pools = array();
+ /* Virtual server pools */
+ if (is_array($pool_a)) {
+ for ($i = 0; isset($pool_a[$i]); $i++) {
+ if (is_array($pool_a[$i]['servers'])) {
+ if (!empty($pool_a[$i]['retry'])) {
+ $retrytext = " retry {$pool_a[$i]['retry']}";
+ } else {
+ $retrytext = "";
+ }
+ $conf .= "table <{$pool_a[$i]['name']}> {\n";
+ foreach ($pool_a[$i]['servers'] as $server) {
+ if (is_subnetv4($server)) {
+ foreach (subnetv4_expand($server) as $ip) {
+ $conf .= "\t{$ip}{$retrytext}\n";
+ }
+ } else {
+ $conf .= "\t{$server}{$retrytext}\n";
+ }
+ }
+ $conf .= "}\n";
+ /* Index by name for easier fetching when we loop through the virtual servers */
+ $pools[$pool_a[$i]['name']] = $pool_a[$i];
+ }
+ }
+ }
+// if (is_array($protocol_a)) {
+// for ($i = 0; isset($protocol_a[$i]); $i++) {
+// $proto = "{$protocol_a[$i]['type']} protocol \"{$protocol_a[$i]['name']}\" {\n";
+// if (is_array($protocol_a[$i]['lbaction'])) {
+// if ($protocol_a[$i]['lbaction'][0] == "") {
+// continue;
+// }
+// for ($a = 0; isset($protocol_a[$i]['lbaction'][$a]); $a++) {
+// $proto .= " " . echo_lbaction($protocol_a[$i]['lbaction'][$a]) . "\n";
+// }
+// }
+// $proto .= "}\n";
+// $conf .= $proto;
+// }
+// }
+
+ $conf .= "dns protocol \"dnsproto\" {\n";
+ $conf .= "\t" . "tcp { nodelay, sack, socket buffer 1024, backlog 1000 }\n";
+ $conf .= "}\n";
+
+ if (is_array($vs_a)) {
+ for ($i = 0; isset($vs_a[$i]); $i++) {
+
+ $append_port_to_name = false;
+ if (is_alias($pools[$vs_a[$i]['poolname']]['port'])) {
+ $dest_port_array = filter_expand_alias_array($pools[$vs_a[$i]['poolname']]['port']);
+ $append_port_to_name = true;
+ } else {
+ $dest_port_array = array($pools[$vs_a[$i]['poolname']]['port']);
+ }
+ if (is_alias($vs_a[$i]['port'])) {
+ $src_port_array = filter_expand_alias_array($vs_a[$i]['port']);
+ $append_port_to_name = true;
+ } else if ($vs_a[$i]['port']) {
+ $src_port_array = array($vs_a[$i]['port']);
+ } else {
+ $src_port_array = $dest_port_array;
+ }
+
+ $append_ip_to_name = false;
+ if (is_alias($vs_a[$i]['ipaddr'])) {
+ $ip_list = array();
+ foreach (filter_expand_alias_array($vs_a[$i]['ipaddr']) as $item) {
+ log_error("item is $item");
+ if (is_subnetv4($item)) {
+ $ip_list = array_merge($ip_list, subnetv4_expand($item));
+ } else {
+ $ip_list[] = $item;
+ }
+ }
+ $append_ip_to_name = true;
+ } else if (is_subnetv4($vs_a[$i]['ipaddr'])) {
+ $ip_list = subnetv4_expand($vs_a[$i]['ipaddr']);
+ $append_ip_to_name = true;
+ } else {
+ $ip_list = array($vs_a[$i]['ipaddr']);
+ }
+
+ for ($j = 0; $j < count($ip_list); $j += 1) {
+ $ip = $ip_list[$j];
+ for ($k = 0; $k < count($src_port_array) && $k < count($dest_port_array); $k += 1) {
+ $src_port = $src_port_array[$k];
+ $dest_port = $dest_port_array[$k];
+ if (is_portrange($dest_port)) {
+ $dest_ports = explode(':', $dest_port);
+ $dest_port = $dest_ports[0];
+ }
+
+ $name = $vs_a[$i]['name'];
+ if ($append_ip_to_name) {
+ $name .= "_" . $j;
+ }
+ if ($append_port_to_name) {
+ $name .= "_" . str_replace(":", "_", $src_port);
+ }
+
+ if (($vs_a[$i]['mode'] == 'relay') || ($vs_a[$i]['relay_protocol'] == 'dns')) {
+ $conf .= "relay \"{$name}\" {\n";
+ $conf .= " listen on {$ip} port {$src_port}\n";
+
+ if ($vs_a[$i]['relay_protocol'] == "dns") {
+ $conf .= " protocol \"dnsproto\"\n";
+ } else {
+ $conf .= " protocol \"{$vs_a[$i]['relay_protocol']}\"\n";
+ }
+ $lbmode = "";
+ if ($pools[$vs_a[$i]['poolname']]['mode'] == "loadbalance") {
+ $lbmode = "mode loadbalance";
+ }
+
+ $conf .= " forward to <{$vs_a[$i]['poolname']}> port {$dest_port} {$lbmode} {$check_a[$pools[$vs_a[$i]['poolname']]['monitor']]} \n";
+
+ if (isset($vs_a[$i]['sitedown']) && strlen($vs_a[$i]['sitedown']) > 0 && ($vs_a[$i]['relay_protocol'] != 'dns')) {
+ $conf .= " forward to <{$vs_a[$i]['sitedown']}> port {$dest_port} {$lbmode} {$check_a[$pools[$vs_a[$i]['poolname']]['monitor']]} \n";
+ }
+ $conf .= "}\n";
+ } else {
+ $conf .= "redirect \"{$name}\" {\n";
+ $conf .= " listen on {$ip} port {$src_port}\n";
+ $conf .= " forward to <{$vs_a[$i]['poolname']}> port {$dest_port} {$check_a[$pools[$vs_a[$i]['poolname']]['monitor']]} \n";
+
+ if (isset($config['system']['lb_use_sticky'])) {
+ $conf .= " sticky-address\n";
+ }
+
+ /* sitedown MUST use the same port as the primary pool - sucks, but it's a relayd thing */
+ if (isset($vs_a[$i]['sitedown']) && strlen($vs_a[$i]['sitedown']) > 0 && ($vs_a[$i]['relay_protocol'] != 'dns')) {
+ $conf .= " forward to <{$vs_a[$i]['sitedown']}> port {$dest_port} {$check_a[$pools[$vs_a[$i]['sitedown']]['monitor']]} \n";
+ }
+
+ $conf .= "}\n";
+ }
+ }
+ }
+ }
+ }
+ fwrite($fd, $conf);
+ fclose($fd);
+
+ if (is_process_running('relayd')) {
+ if (!empty($vs_a)) {
+ if ($kill_first) {
+ mwexec('pkill relayd');
+ /* Remove all active relayd anchors now that relayd is no longer running. */
+ cleanup_lb_anchor("*");
+ mwexec("/usr/local/sbin/relayd -f {$g['varetc_path']}/relayd.conf");
+ } else {
+ // it's running and there is a config, just reload
+ mwexec("/usr/local/sbin/relayctl reload");
+ }
+ } else {
+ /*
+ * XXX: Something breaks our control connection with relayd
+ * and makes 'relayctl stop' not work
+ * rule reloads are the current suspect
+ * mwexec('/usr/local/sbin/relayctl stop');
+ * returns "command failed"
+ */
+ mwexec('pkill relayd');
+ /* Remove all active relayd anchors now that relayd is no longer running. */
+ cleanup_lb_anchor("*");
+ }
+ } else {
+ if (!empty($vs_a)) {
+ // not running and there is a config, start it
+ /* Remove all active relayd anchors so it can start fresh. */
+ cleanup_lb_anchor("*");
+ mwexec("/usr/local/sbin/relayd -f {$g['varetc_path']}/relayd.conf");
+ }
+ }
+}
+
+function get_lb_redirects() {
+/*
+# relayctl show summary
+Id Type Name Avlblty Status
+1 redirect testvs2 active
+5 table test2:80 active (3 hosts up)
+11 host 192.168.1.2 91.55% up
+10 host 192.168.1.3 100.00% up
+9 host 192.168.1.4 88.73% up
+3 table test:80 active (1 hosts up)
+7 host 192.168.1.2 66.20% down
+6 host 192.168.1.3 97.18% up
+0 redirect testvs active
+3 table test:80 active (1 hosts up)
+7 host 192.168.1.2 66.20% down
+6 host 192.168.1.3 97.18% up
+4 table testvs-sitedown:80 active (1 hosts up)
+8 host 192.168.1.4 84.51% up
+# relayctl show redirects
+Id Type Name Avlblty Status
+1 redirect testvs2 active
+0 redirect testvs active
+# relayctl show redirects
+Id Type Name Avlblty Status
+1 redirect testvs2 active
+ total: 2 sessions
+ last: 2/60s 2/h 2/d sessions
+ average: 1/60s 0/h 0/d sessions
+0 redirect testvs active
+*/
+ $rdr_a = array();
+ exec('/usr/local/sbin/relayctl show redirects 2>&1', $rdr_a);
+ $relay_a = array();
+ exec('/usr/local/sbin/relayctl show relays 2>&1', $relay_a);
+ $vs = array();
+ $cur_entry = "";
+ for ($i = 0; isset($rdr_a[$i]); $i++) {
+ $line = $rdr_a[$i];
+ if (preg_match("/^[0-9]+/", $line)) {
+ $regs = array();
+ if ($x = preg_match("/^[0-9]+\s+redirect\s+([^\s]+)\s+([^\s]+)/", $line, $regs)) {
+ $cur_entry = trim($regs[1]);
+ $vs[trim($regs[1])] = array();
+ $vs[trim($regs[1])]['status'] = trim($regs[2]);
+ }
+ } elseif (($x = preg_match("/^\s+total:\s(.*)\ssessions/", $line, $regs)) && !empty($cur_entry)) {
+ $vs[$cur_entry]['total'] = trim($regs[1]);
+ } elseif (($x = preg_match("/^\s+last:\s(.*)\ssessions/", $line, $regs)) && !empty($cur_entry)) {
+ $vs[$cur_entry]['last'] = trim($regs[1]);
+ } elseif (($x = preg_match("/^\s+average:(.*)\ssessions/", $line, $regs)) && !empty($cur_entry)) {
+ $vs[$cur_entry]['average'] = trim($regs[1]);
+ }
+ }
+ $cur_entry = "";
+ for ($i = 0; isset($relay_a[$i]); $i++) {
+ $line = $relay_a[$i];
+ if (preg_match("/^[0-9]+/", $line)) {
+ $regs = array();
+ if ($x = preg_match("/^[0-9]+\s+relay\s+([^\s]+)\s+([^\s]+)/", $line, $regs)) {
+ $cur_entry = trim($regs[1]);
+ $vs[trim($regs[1])] = array();
+ $vs[trim($regs[1])]['status'] = trim($regs[2]);
+ }
+ } elseif (($x = preg_match("/^\s+total:\s(.*)\ssessions/", $line, $regs)) && !empty($cur_entry)) {
+ $vs[$cur_entry]['total'] = trim($regs[1]);
+ } elseif (($x = preg_match("/^\s+last:\s(.*)\ssessions/", $line, $regs)) && !empty($cur_entry)) {
+ $vs[$cur_entry]['last'] = trim($regs[1]);
+ } elseif (($x = preg_match("/^\s+average:(.*)\ssessions/", $line, $regs)) && !empty($cur_entry)) {
+ $vs[$cur_entry]['average'] = trim($regs[1]);
+ }
+ }
+ return $vs;
+}
+
+function get_lb_summary() {
+ $relayctl = array();
+ exec('/usr/local/sbin/relayctl show summary 2>&1', $relayctl);
+ $relay_hosts=Array();
+ foreach ((array) $relayctl as $line) {
+ $t = explode("\t", $line);
+ switch (trim($t[1])) {
+ case "table":
+ $curpool=trim($t[2]);
+ break;
+ case "host":
+ $curhost=trim($t[2]);
+ $relay_hosts[$curpool][$curhost]['avail']=trim($t[3]);
+ $relay_hosts[$curpool][$curhost]['state']=trim($t[4]);
+ break;
+ }
+ }
+ return $relay_hosts;
+}
+
+/* Get a list of all relayd virtual server anchors */
+function get_lb_anchors() {
+ /* NOTE: These names come back prepended with "relayd/" e.g. "relayd/MyVSName" */
+ return explode("\n", trim(`/sbin/pfctl -sA -a relayd | /usr/bin/awk '{print $1;}'`));
+}
+
+/* Remove NAT rules from a relayd anchor that is no longer in use.
+ $anchorname can either be * to clear all anchors or a specific anchor name.*/
+function cleanup_lb_anchor($anchorname = "*") {
+ $lbanchors = get_lb_anchors();
+ foreach ($lbanchors as $lba) {
+ if (($anchorname == "*") || ($lba == "relayd/{$anchorname}")) {
+ /* Flush both the NAT and the Table for the anchor, so it will be completely removed by pf. */
+ mwexec("/sbin/pfctl -a " . escapeshellarg($lba) . " -F nat");
+ mwexec("/sbin/pfctl -a " . escapeshellarg($lba) . " -F Tables");
+ }
+ }
+}
+
+/* Mark an anchor for later cleanup. This will allow us to remove an old VS name */
+function cleanup_lb_mark_anchor($name) {
+ global $g;
+ /* Nothing to do! */
+ if (empty($name)) {
+ return;
+ }
+ $filename = "{$g['tmp_path']}/relayd_anchors_remove";
+ $cleanup_anchors = array();
+ /* Read in any currently unapplied name changes */
+ if (file_exists($filename)) {
+ $cleanup_anchors = explode("\n", file_get_contents($filename));
+ }
+ /* Only add the anchor to the list if it's not already there. */
+ if (!in_array($name, $cleanup_anchors)) {
+ $cleanup_anchors[] = $name;
+ }
+ file_put_contents($filename, implode("\n", $cleanup_anchors));
+}
+
+/* Cleanup relayd anchors that have been marked for cleanup. */
+function cleanup_lb_marked() {
+ global $g, $config;
+ $filename = "{$g['tmp_path']}/relayd_anchors_remove";
+ $cleanup_anchors = array();
+ /* Nothing to do! */
+ if (!file_exists($filename)) {
+ return;
+ } else {
+ $cleanup_anchors = explode("\n", file_get_contents($filename));
+ /* Nothing to do! */
+ if (empty($cleanup_anchors)) {
+ return;
+ }
+ }
+
+ /* Load current names so we can make sure we don't remove an anchor that is still in use. */
+ $vs_a = $config['load_balancer']['virtual_server'];
+ $active_vsnames = array();
+ if (is_array($vs_a)) {
+ foreach ($vs_a as $vs) {
+ $active_vsnames[] = $vs['name'];
+ }
+ }
+
+ foreach ($cleanup_anchors as $anchor) {
+ /* Only cleanup an anchor if it is not still active. */
+ if (!in_array($anchor, $active_vsnames)) {
+ cleanup_lb_anchor($anchor);
+ }
+ }
+ unlink_if_exists($filename);
+}
+
+?>
diff --git a/src/etc/inc/wizardapp.inc b/src/etc/inc/wizardapp.inc
new file mode 100644
index 0000000..bf9f699
--- /dev/null
+++ b/src/etc/inc/wizardapp.inc
@@ -0,0 +1,668 @@
+<?php
+/*
+ wizardapp.inc
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2006 Bill Marquette - bill.marquette@gmail.com.
+ Copyright (C) 2006 Scott Ullrich - sullrich@pfsense.com.
+ Copyright (C) 2008-2010 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$gamesplist = array();
+
+/* Game Consoles and Game Clients */
+
+$gamesplist['playstationconsoles'] = array();
+ /* Playstation 3, Playstation 4 and PS Vita */
+ $gamesplist['playstationconsoles'][] = array('PS-Network-TCP', 'tcp', '10040', '10060', 'both');
+ $gamesplist['playstationconsoles'][] = array('PS-Network-UDP', 'udp', '50000', '60000', 'both');
+ $gamesplist['playstationconsoles'][] = array('PS-Home-TCP-1', 'tcp', '3478', '3480', 'both');
+ $gamesplist['playstationconsoles'][] = array('PS-Home-TCP-2', 'tcp', '8080', '8080', 'both');
+ $gamesplist['playstationconsoles'][] = array('PS-TCP-1', 'tcp', '5223', '5223', 'both');
+ $gamesplist['playstationconsoles'][] = array('PS-TCP-2', 'tcp', '10070', '10080', 'both');
+ $gamesplist['playstationconsoles'][] = array('PS-UDP-1', 'udp', '3478', '3479', 'both');
+ $gamesplist['playstationconsoles'][] = array('PS-UDP-2', 'udp', '3658', '3658', 'both');
+ $gamesplist['playstationconsoles'][] = array('PS-UDP-3', 'udp', '10070', '10070', 'both');
+ $gamesplist['playstationconsoles'][] = array('PS-RemotePlay', 'tcp', '9293', '9293', 'both');
+
+$gamesplist['wiiconsoles'] = array();
+ /* XBox Consoles */
+ $gamesplist['wiiconsoles'][] = array('Wii-Consoles-TCP-1', 'tcp', '6667', '6667', 'both');
+ $gamesplist['wiiconsoles'][] = array('Wii-Consoles-TCP-2', 'tcp', '12400', '12400', 'both');
+ $gamesplist['wiiconsoles'][] = array('Wii-Consoles-TCP-3', 'tcp', '28910', '28910', 'both');
+ $gamesplist['wiiconsoles'][] = array('Wii-Consoles-TCP-4', 'tcp', '29900', '29901', 'both');
+ $gamesplist['wiiconsoles'][] = array('Wii-Consoles-TCP-5', 'tcp', '29920', '29920', 'both');
+
+$gamesplist['xboxconsoles'] = array();
+ /* XBox Consoles */
+ $gamesplist['xboxconsoles'][] = array('xbox-Consoles-UDP-1', 'udp', '88', '88', 'both');
+ $gamesplist['xboxconsoles'][] = array('xbox-Consoles-UDP-2', 'udp', '3074', '3074', 'both');
+ $gamesplist['xboxconsoles'][] = array('xbox-Consoles-TCP-1', 'tcp', '3074', '3074', 'both');
+ $gamesplist['xboxconsoles'][] = array('xbox-Consoles-TCP-2', 'tcp', '3659', '3659', 'both');
+ $gamesplist['xboxconsoles'][] = array('xbox-Consoles-TCP-3', 'tcp', '500', '500', 'both');
+ $gamesplist['xboxconsoles'][] = array('xbox-Consoles-TCP-4', 'tcp', '3544', '3544', 'both');
+ $gamesplist['xboxconsoles'][] = array('xbox-Consoles-TCP-5', 'tcp', '4500', '4500', 'both');
+
+$gamesplist['battlenet'] = array();
+ /* Blizzard Publishing games */
+ $gamesplist['battlenet'][] = array('Battle.NET-game1-tcp', 'tcp', '6112', '6119', 'both'); //diablo, diablo2, starcraft, warcraft 2, warcraft 3
+ $gamesplist['battlenet'][] = array('Battle.NET-game1-udp', 'udp', '6112', '6119', 'both'); //diablo, diablo2, starcraft, warcraft 2
+ $gamesplist['battlenet'][] = array('Battle.NET-diablo2', 'tcp', '4000', '4000', 'both'); //diablo2
+ $gamesplist['battlenet'][] = array('Battle.NET-game2', 'tcp', '1119', '1119', 'both'); //diablo3, starcraft 2
+ $gamesplist['battlenet'][] = array('Battle.NET-game3', 'tcp', '3724', '3724', 'both'); //starcraft2
+
+$gamesplist['eaorigin'] = array();
+ /* EA Origin Client */
+ $gamesplist['eaorigin'][] = array('EA-Origin-TCP-1', 'tcp', '1024', '1124', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-TCP-2', 'tcp', '9960', '9969', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-TCP-3', 'tcp', '18000', '18000', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-TCP-4', 'tcp', '18120', '18120', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-TCP-5', 'tcp', '18060', '18060', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-TCP-6', 'tcp', '27900', '27900', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-TCP-7', 'tcp', '28910', '28910', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-TCP-8', 'tcp', '29900', '29900', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-UDP-1', 'udp', '1024', '1124', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-UDP-2', 'udp', '18000', '18000', 'both');
+ $gamesplist['eaorigin'][] = array('EA-Origin-UDP-3', 'udp', '29900', '29900', 'both');
+
+$gamesplist['steam'] = array();
+ /* Steam Games */
+ $gamesplist['steam'][] = array('Steam-game-udp', 'udp', '27000', '27030', 'both'); //america's army 3, cs:s, cs:go, HL2, COD: Black Ops, COD: Black Ops 2, Natural Selection 2
+ $gamesplist['steam'][] = array('Steam-game-tcp', 'tcp', '27000', '27030', 'both'); //america's army 3, cs:s, cs:go, HL2, COD: Black Ops, COD: Black Ops 2, Natural Selection 2
+ $gamesplist['steam'][] = array('Steam-hltv', 'udp', '27015', '27030', 'both');
+ $gamesplist['steam'][] = array('Steam-1', 'udp', '4380', '4380', 'both');
+ $gamesplist['steam'][] = array('Steam-2', 'udp', '1200', '1200', 'both');
+ $gamesplist['steam'][] = array('Steam-voice', 'udp', '3478', '3480', 'both');
+
+$gamesplist['gamesforwindowslive'] = array();
+ /* Games for Windows Live */
+ $gamesplist['gamesforwindowslive'][] = array('Games4WinLive-1', 'udp', '88', '88', 'both');
+ $gamesplist['gamesforwindowslive'][] = array('Games4WinLive-2', 'udp', '3074', '3074', 'both');
+ $gamesplist['gamesforwindowslive'][] = array('Games4WinLive-3', 'tcp', '3074', '3074', 'both');
+
+/* Games */
+
+$gamesplist['arma2'] = array();
+ /* ARMA 2 */
+ $gamesplist['arma2'][] = array('arma2', 'udp', '2302', '2310', 'both');
+
+$gamesplist['arma3'] = array();
+ /* ARMA 3 */
+ $gamesplist['arma3'][] = array('arma3-game-traffic', 'udp', '2302', '2302', 'both');
+ $gamesplist['arma3'][] = array('arma3-steam-query', 'udp', '2303', '2303', 'both');
+ $gamesplist['arma3'][] = array('arma3-steam-port', 'udp', '2304', '2304', 'both');
+ $gamesplist['arma3'][] = array('arma3-BattleEye-1', 'tcp', '2345', '2345', 'both');
+ $gamesplist['arma3'][] = array('arma3-BattleEye-2', 'tcp', '2344', '2344', 'both');
+ $gamesplist['arma3'][] = array('arma3-BattleEye-2', 'udp', '2344', '2344', 'both');
+
+$gamesplist['battlefield2'] = array();
+ /* Battlefield 2 */
+ $gamesplist['battlefield2'][] = array('BF2-1500-4999', 'udp', '1500', '4999', 'both');
+ $gamesplist['battlefield2'][] = array('BF2-4711', 'tcp', '4711', '4711', 'both');
+ $gamesplist['battlefield2'][] = array('BF2-16567', 'udp', '16567', '16567', 'both');
+ $gamesplist['battlefield2'][] = array('BF2-27900', 'udp', '27900', '27900', 'both');
+ $gamesplist['battlefield2'][] = array('BF2-28910', 'tcp', '28910', '28910', 'both');
+ $gamesplist['battlefield2'][] = array('BF2-29900-29901-UDP', 'udp', '29900', '29901', 'both');
+ $gamesplist['battlefield2'][] = array('BF2-29900-29901-TCP', 'tcp', '29900', '29901', 'both');
+ $gamesplist['battlefield2'][] = array('BF2-27900', 'udp', '27900', '27900', 'both');
+ $gamesplist['battlefield2'][] = array('BF2-55123-55125', 'udp', '55123', '55125', 'both');
+
+$gamesplist['battlefield3'] = array();
+ /* Battlefield 3 and Battlefield 4 */
+ $gamesplist['battlefield3'][] = array('BF3-1', 'tcp', '9988', '9988', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-2', 'tcp', '20000', '20100', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-3', 'tcp', '22990', '22990', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-4', 'tcp', '17502', '17502', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-5', 'tcp', '42127', '42127', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-6', 'udp', '3659', '3659', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-7', 'udp', '14000', '14016', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-8', 'udp', '22990', '23006', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-9', 'udp', '25200', '25300', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-PS-1', 'tcp', '10000', '10100', 'both');
+ $gamesplist['battlefield3'][] = array('BF3-PS-2', 'tcp', '1935', '1935', 'both');
+
+
+$gamesplist['battlefieldbc2'] = array();
+ /* Battlefield Bad Company 2 */
+ $gamesplist['battlefieldbc2'][] = array('BFBC2-1', 'tcp', '18390', '18390', 'both');
+ $gamesplist['battlefieldbc2'][] = array('BFBC2-2', 'tcp', '18395', '18395', 'both');
+ $gamesplist['battlefieldbc2'][] = array('BFBC2-3', 'udp', '18395', '18395', 'both');
+ $gamesplist['battlefieldbc2'][] = array('BFBC2-4', 'tcp', '13505', '13505', 'both');
+
+$gamesplist['borderlands'] = array();
+ /* Borderlands */
+ $gamesplist['borderlands'][] = array('Borderlands-udp', 'udp', '7777', '7777', 'both');
+ $gamesplist['borderlands'][] = array('Borderlands-tcp', 'tcp', '7777', '7777', 'both');
+
+$gamesplist['callofduty'] = array();
+ /* Call Of Duty */
+ $gamesplist['callofduty'][] = array('CallOfDuty1', 'tcp', '28960', '28960', 'both');
+ $gamesplist['callofduty'][] = array('CallOfDuty2', 'udp', '28960', '28960', 'both');
+
+$gamesplist['counterstrike'] = array();
+ /* counter strike */
+ $gamesplist['counterstrike'][] = array('CS-Titan', 'udp', '6003', '6003', 'both');
+ $gamesplist['counterstrike'][] = array('CS-Authentication', 'udp', '7002', '7002', 'both');
+ $gamesplist['counterstrike'][] = array('CS-Client', 'udp', '6003', '6003', 'both');
+ $gamesplist['counterstrike'][] = array('CS-Masterserver', 'udp', '27010', '27010', 'both');
+ $gamesplist['counterstrike'][] = array('CS-Mod-Server', 'udp', '27011', '27011', 'both');
+ $gamesplist['counterstrike'][] = array('CS-Chat', 'udp', '27012', '27012', 'both');
+ $gamesplist['counterstrike'][] = array('CS-HL-Serverport1', 'udp', '27013', '27013', 'both');
+ $gamesplist['counterstrike'][] = array('CS-HL-Serverport2', 'udp', '27014', '27014', 'both');
+ $gamesplist['counterstrike'][] = array('CS-HL-Serverport', 'udp', '27015', '27015', 'both');
+
+$gamesplist['crysis2'] = array();
+ /* Crysis 2 */
+ $gamesplist['crysis2'][] = array('Crysis2', 'udp', '64100', '64100', 'both');
+
+$gamesplist['crysis3'] = array();
+ /* Crysis 3 */
+ $gamesplist['crysis3'][] = array('Crysis3-TCP-1', 'tcp', '9988', '9988', 'both');
+ $gamesplist['crysis3'][] = array('Crysis3-TCP-2', 'tcp', '17502', '17502', 'both');
+ $gamesplist['crysis3'][] = array('Crysis3-TCP-3', 'tcp', '25650', '25780', 'both');
+ $gamesplist['crysis3'][] = array('Crysis3-TCP-4', 'tcp', '42127', '42127', 'both');
+ $gamesplist['crysis3'][] = array('Crysis3-TCP-5', 'tcp', '64100', '64110', 'both');
+ $gamesplist['crysis3'][] = array('Crysis3-UDP-1', 'udp', '3659', '3659', 'both');
+ $gamesplist['crysis3'][] = array('Crysis3-UDP-2', 'udp', '10000', '10100', 'both');
+ $gamesplist['crysis3'][] = array('Crysis3-UDP-3', 'udp', '25650', '25780', 'both');
+ $gamesplist['crysis3'][] = array('Crysis3-UDP-4', 'udp', '64100', '64110', 'both');
+
+$gamesplist['deadspace2'] = array();
+ /* Dead Space 2 */
+ $gamesplist['deadspace2'][] = array('DeadSpace2-TCP-1', 'tcp', '28910', '28910', 'both');
+ $gamesplist['deadspace2'][] = array('DeadSpace2-TCP-2', 'tcp', '29900', '29901', 'both');
+ $gamesplist['deadspace2'][] = array('DeadSpace2-UDP-1', 'udp', '8088', '28088', 'both');
+
+$gamesplist['deadspace3'] = array();
+ /* Dead Space 3 */
+ $gamesplist['deadspace3'][] = array('DeadSpace3-TCP-1', 'tcp', '1024', '1124', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-TCP-2', 'tcp', '9960', '9969', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-TCP-3', 'tcp', '18000', '18000', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-TCP-4', 'tcp', '18120', '18120', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-TCP-5', 'tcp', '18060', '18060', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-TCP-6', 'tcp', '27900', '27900', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-TCP-7', 'tcp', '28910', '28910', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-TCP-8', 'tcp', '29900', '29900', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-UDP-1', 'udp', '1024', '1124', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-UDP-2', 'udp', '18000', '18000', 'both');
+ $gamesplist['deadspace3'][] = array('DeadSpace3-UDP-3', 'udp', '29900', '29900', 'both');
+
+$gamesplist['deltaforce'] = array();
+ /* delta force */
+ $gamesplist['deltaforce'][] = array('Delta1', 'udp', '17478', '17488', 'both');
+
+$gamesplist['dirt3'] = array();
+ /* ARMA 2 */
+ $gamesplist['dirt3'][] = array('Dirt3-1', 'tcp', '2300', '2400', 'both');
+ $gamesplist['dirt3'][] = array('Dirt3-2', 'udp', '2300', '2400', 'both');
+ $gamesplist['dirt3'][] = array('Dirt3-3', 'udp', '6073', '6073', 'both');
+ $gamesplist['dirt3'][] = array('Dirt3-4', 'tcp', '47624', '47624', 'both');
+
+$gamesplist['doom3'] = array();
+ /* doom3 */
+ $gamesplist['doom3'][] = array('DOOM3-1', 'udp', '27650', '27650', 'both');
+ $gamesplist['doom3'][] = array('DOOM3-2', 'udp', '27666', '27666', 'both');
+
+$gamesplist['dragonage2'] = array();
+ /* Dragon Age 2 */
+ $gamesplist['dragonage2'][] = array('DragonAge2-TCP-1', 'tcp', '8000', '8000', 'both');
+ $gamesplist['dragonage2'][] = array('DragonAge2-TCP-2', 'tcp', '12025', '12025', 'both');
+ $gamesplist['dragonage2'][] = array('DragonAge2-TCP-3', 'tcp', '15101', '15325', 'both');
+ $gamesplist['dragonage2'][] = array('DragonAge2-TCP-4', 'tcp', '18081', '18081', 'both');
+ $gamesplist['dragonage2'][] = array('DragonAge2-TCP-5', 'tcp', '42127', '42127', 'both');
+ $gamesplist['dragonage2'][] = array('DragonAge2-UDP-1', 'udp', '1900', '1900', 'both');
+ $gamesplist['dragonage2'][] = array('DragonAge2-UDP-2', 'udp', '5355', '5355', 'both');
+ $gamesplist['dragonage2'][] = array('DragonAge2-UDP-3', 'udp', '8001', '8001', 'both');
+
+$gamesplist['empireearth'] = array();
+ /* empire earth */
+ $gamesplist['empireearth'][] = array('EmpireEarth-1', 'tcp', '33335', '33336', 'both');
+ $gamesplist['empireearth'][] = array('EmpireEarth-2', 'udp', '33334', '33334', 'both');
+
+$gamesplist['eveonline'] = array();
+ /* EVE Online */
+ $gamesplist['eveonline'][] = array('EVEOnline-tcp', 'tcp', '26000', '26000', 'both');
+ $gamesplist['eveonline'][] = array('EVEOnline-udp', 'udp', '26000', '26000', 'both');
+ $gamesplist['eveonline'][] = array('EVEOnline-alternate-tcp', 'tcp', '3724', '3724', 'both');
+ $gamesplist['eveonline'][] = array('EVEOnline-alternate-udp', 'udp', '3724', '3724', 'both');
+
+$gamesplist['everquest'] = array();
+ /* everquest */
+ $gamesplist['everquest'][] = array('Everquest-1', 'tcp', '1024', '6000', 'both');
+ $gamesplist['everquest'][] = array('Everquest-2', 'tcp', '7000', '7000', 'both');
+ $gamesplist['everquest'][] = array('Everquest-3', 'udp', '1024', '6000', 'both');
+ $gamesplist['everquest'][] = array('Everquest-4', 'udp', '7000', '7000', 'both');
+
+$gamesplist['everquest2'] = array();
+ /* everquest2 */
+ $gamesplist['everquest2'][] = array('Everquest2-1', 'tcp', '7000', '7000', 'both');
+ $gamesplist['everquest2'][] = array('Everquest2-2', 'udp', '3016', '3021', 'both');
+ $gamesplist['everquest2'][] = array('Everquest2-3', 'udp', '9100', '9100', 'both');
+ $gamesplist['everquest2'][] = array('Everquest2-4', 'udp', '9700', '9703', 'both');
+ $gamesplist['everquest2'][] = array('Everquest2-5', 'udp', '32800', '33000', 'both');
+
+$gamesplist['farcry'] = array();
+ /* far cry */
+ $gamesplist['farcry'][] = array('FarCry-1', 'tcp', '49001', '49002', 'both');
+ $gamesplist['farcry'][] = array('FarCry-2', 'udp', '49001', '49002', 'both');
+
+$gamesplist['farcry2'] = array();
+ /* FarCry 2*/
+ $gamesplist['farcry2'][] = array('FarCry2-tcp', 'tcp', '9000', '9004', 'both');
+ $gamesplist['farcry2'][] = array('FarCry2-udp', 'udp', '9000', '9004', 'both');
+
+$gamesplist['farcry3'] = array();
+ /* FarCry 3*/
+ $gamesplist['farcry3'][] = array('FarCry3-game', 'udp', '9000', '9000', 'both');
+ $gamesplist['farcry3'][] = array('FarCry3-punkbuster', 'udp', '10009', '10009', 'both');
+
+$gamesplist['gunzonline'] = array();
+ /* GunZ Online */
+ $gamesplist['gunzonline'][] = array('GunZOnline', 'udp', '7700', '7700', 'both');
+
+$gamesplist['halflife'] = array();
+ /* halflife */
+ $gamesplist['halflife'][] = array('HL-1', 'tcp', '27015', '27015', 'both');
+ $gamesplist['halflife'][] = array('HL-2', 'udp', '27650', '27650', 'both');
+ $gamesplist['halflife'][] = array('HL-3', 'udp', '27666', '27666', 'both');
+
+$gamesplist['leagueoflegends'] = array();
+ /* League of Legends */
+ $gamesplist['leagueoflegends'][] = array('LeagueofLegends-1', 'udp', '5000', '5500', 'both');
+ $gamesplist['leagueoflegends'][] = array('LeagueofLegends-2', 'tcp', '2099', '2099', 'both');
+ $gamesplist['leagueoflegends'][] = array('LeagueofLegends-3', 'tcp', '5222', '5223', 'both');
+
+$gamesplist['lineage2'] = array();
+ /* Lineage II */
+ $gamesplist['lineage2'][] = array('Lineage2-2009', 'tcp', '2009', '2009', 'both');
+ $gamesplist['lineage2'][] = array('Lineage2-2106', 'tcp', '2106', '2106', 'both');
+ $gamesplist['lineage2'][] = array('Lineage2-7777', 'tcp', '7777', '7777', 'both');
+
+$gamesplist['masseffect3'] = array();
+ /* MassEffect 3 */
+ $gamesplist['masseffect3'][] = array('MassEffect3-UDP-1', 'udp', '5659', '5659', 'both');
+ $gamesplist['masseffect3'][] = array('MassEffect3-UDP-1', 'udp', '6000', '6000', 'both');
+
+$gamesplist['mechwarrioronline'] = array();
+ /* MechWarrior: Online */
+ $gamesplist['mechwarrioronline'][] = array('MechWarriorOnline-tcp1', 'tcp', '45461', '45461', 'both');
+ $gamesplist['mechwarrioronline'][] = array('MechWarriorOnline-tcp2', 'tcp', '45464', '45464', 'both');
+ $gamesplist['mechwarrioronline'][] = array('MechWarriorOnline-game', 'udp', '21000', '30000', 'both'); // 9000 ports
+
+$gamesplist['minecraft'] = array();
+ /* Minecraft */
+ $gamesplist['minecraft'][] = array('Minecraft-tcp', 'tcp', '25565', '25565', 'both');
+ $gamesplist['minecraft'][] = array('Minecraft-udp', 'udp', '25565', '25565', 'both');
+
+$gamesplist['operationflashpoint-dr'] = array();
+ /* Operation Flashpoint: Dragon Rising */
+ $gamesplist['operationflashpoint-dr'][] = array('OperationFlashpoint-DR', 'udp', '9105', '9105', 'both');
+
+$gamesplist['planetside'] = array();
+ /* PlanetSide */
+ $gamesplist['planetside'][] = array('PlanetSide', 'tcp', '7000', '7000', 'both');
+ $gamesplist['planetside'][] = array('PlanetSide', 'tcp', '7080', '7080', 'both');
+ $gamesplist['planetside'][] = array('PlanetSide2', 'udp', '3016', '3021', 'both');
+ $gamesplist['planetside'][] = array('PlanetSide2', 'udp', '45000', '45010', 'both');
+ $gamesplist['planetside'][] = array('PlanetSide2', 'udp', '30000', '30500', 'both');
+
+$gamesplist['planetside2'] = array();
+ /* PlanetSide 2 */
+ $gamesplist['planetside2'][] = array('PlanetSide2-game', 'udp', '20040', '20199', 'both');
+ $gamesplist['planetside2'][] = array('PlanetSide2-voice', 'udp', '5062', '5062', 'both');
+
+
+$gamesplist['quakeiii'] = array();
+ /* quake3 */
+ $gamesplist['quakeiii'][] = array('Quake3', 'udp', '27910', '27919', 'both');
+
+$gamesplist['quakeiv'] = array();
+ /* quake4 */
+ $gamesplist['quakeiv'][] = array('QuakeIV-server-udp', 'udp', '27650', '27650', 'both');
+ $gamesplist['quakeiv'][] = array('QuakeIV-server-tcp', 'tcp', '27650', '27650', 'both');
+ $gamesplist['quakeiv'][] = array('QuakeIV-client-udp', 'udp', '28004', '28004', 'both');
+ $gamesplist['quakeiv'][] = array('QuakeIV-client-tcp', 'tcp', '28004', '28004', 'both');
+
+$gamesplist['starwarstor'] = array();
+ /* quake3 */
+ $gamesplist['starwarstor'][] = array('StarWarsTOR-1', 'tcp', '8995', '8995', 'both');
+ $gamesplist['starwarstor'][] = array('StarWarsTOR-2', 'tcp', '12000', '12999', 'both');
+ $gamesplist['starwarstor'][] = array('StarWarsTOR-2', 'tcp', '20000', '30000', 'both');
+
+$gamesplist['tigerwoods2004ps2'] = array();
+ /* tiger woods 2004 ps2 */
+ $gamesplist['tigerwoods2004ps2'][] = array('TigerWoods2004-Player', 'udp', '3658', '3658', 'both');
+ $gamesplist['tigerwoods2004ps2'][] = array('TigerWoods2004-Player2', 'udp', '6000', '6000', 'both');
+ $gamesplist['tigerwoods2004ps2'][] = array('TigerWoods2004-EA', 'tcp', '10300', '10301', 'both');
+
+$gamesplist['tribesascend'] = array();
+ /* Tribes Ascend */
+ $gamesplist['tribesascend'][] = array('TribesAscend-tcp', 'tcp', '9000', '9001', 'both');
+ $gamesplist['tribesascend'][] = array('TribesAscend-udp', 'udp', '9002', '9999', 'both');
+
+$gamesplist['unrealtournament'] = array();
+ /* Unreal Tournament */
+ $gamesplist['unrealtournament'][] = array('UT-game-udp', 'udp', '7777', '7787', 'both');
+ $gamesplist['unrealtournament'][] = array('UT-game-tcp', 'tcp', '7777', '7787', 'both');
+ $gamesplist['unrealtournament'][] = array('UT-voice', 'udp', '3783', '3783', 'both');
+
+$gamesplist['wolfet'] = array();
+ /* wolfenstein enemy territory */
+ $gamesplist['wolfet'][] = array('WolfET-1', 'tcp', '27960', '27960', 'both');
+
+$gamesplist['wow'] = array();
+ /* World of Warcraft */
+ $gamesplist['wow'][] = array('WoW', 'tcp', '3724', '3724', 'both');
+ $gamesplist['wow'][] = array('WoW-voice', 'udp', '1119', '1119', 'both');
+ $gamesplist['wow'][] = array('WoW-voice', 'udp', '3724', '3724', 'both');
+
+$voiplist = array();
+
+ /* asterisk server / same as vonage */
+$voiplist['Asterisk'] = array();
+ $voiplist['Asterisk'][] = array('Asterisk', 'udp', '5060', '5069', 'both');
+ $voiplist['Asterisk'][] = array('Asterisk', 'udp', '10000', '20000', 'both');
+
+ /* VoicePulse server */
+$voiplist['VoicePulse'] = array();
+ $voiplist['VoicePulse'][] = array('VoicePulse', 'udp', '16384', '16482', 'both');
+ $voiplist['VoicePulse'][] = array('VoicePulse', 'udp', '4569', '4569', 'both');
+
+ /* Panasonic Hybrid PBX */
+$voiplist['Panasonic'] = array();
+ $voiplist['Panasonic'][] = array('Panasonic1', 'udp', '8000', '8063', 'both');
+ $voiplist['Panasonic'][] = array('Panasonic2', 'udp', '9300', '9301', 'both');
+ $voiplist['Panasonic'][] = array('Panasonic3', 'udp', '2747', '2747', 'both');
+
+
+$p2plist = array();
+ /* To add p2p clients, push Descr,Protocol,Start,End,src/dest/both onto p2plist */
+ $p2plist['aimster'] = array();
+ $p2plist['aimster'][] = array('Aimster', 'tcp', '7668', '7668', 'both');
+ $p2plist['bittorrent'] = array();
+ $p2plist['bittorrent'][] = array('BitTorrent', 'tcp', '6881', '6999', 'both');
+ $p2plist['bittorrent'][] = array('BitTorrent', 'udp', '6881', '6999', 'both');
+ $p2plist['buddyshare'] = array();
+ $p2plist['buddyshare'][] = array('BuddyShare', 'tcp', '7788', '7788', 'both');
+ $p2plist['cutemx'] = array();
+ $p2plist['cutemx'][] = array('CuteMX', 'tcp', '2340', '2340', 'both');
+ $p2plist['dc++'] = array();
+ $p2plist['dc++'][] = array('DC++', 'tcp', '1412', '1412', 'both');
+ $p2plist['dcc'] = array();
+ $p2plist['dcc'][] = array('dcc', 'tcp', '6666', '6668', 'both');
+ $p2plist['directconnect'] = array();
+ $p2plist['directconnect'][] = array('DirectConnect', 'tcp', '412', '412', 'both');
+ $p2plist['directfileexpress'] = array();
+ $p2plist['directfileexpress'][] = array('DirectFileExpress', 'tcp', '1044', '1045', 'both');
+ $p2plist['edonkey2000'] = array();
+ $p2plist['edonkey2000'][] = array('EDonkey2000', 'tcp', '4661', '4665', 'both');
+ $p2plist['fastTrack'] = array();
+ $p2plist['fastTrack'][] = array('FastTrack', 'tcp', '1214', '1214', 'both');
+ $p2plist['gnutella'] = array();
+ $p2plist['gnutella'][] = array('Gnutella-TCP', 'tcp', '6346', '6346', 'both');
+ $p2plist['gnutella'][] = array('Gnutella-UDP', 'udp', '6346', '6346', 'both');
+ $p2plist['grouper'] = array();
+ $p2plist['grouper'][] = array('grouper', 'tcp', '8038', '8039', 'both');
+ $p2plist['hotcomm'] = array();
+ $p2plist['hotcomm'][] = array('hotComm', 'tcp', '28864', '28865', 'both');
+ $p2plist['hotlineconnect'] = array();
+ $p2plist['hotlineconnect'][] = array('HotlineConnect', 'tcp', '5500', '5503', 'both');
+ $p2plist['imesh'] = array();
+ $p2plist['imesh'][] = array('iMesh', 'tcp', '4329', '4329', 'both');
+ $p2plist['napster'] = array();
+ $p2plist['napster'][] = array('Napster', 'tcp', '6699', '6701', 'both');
+ $p2plist['opennap'] = array();
+ $p2plist['opennap'][] = array('OpenNap', 'tcp', '8888', '8889', 'both');
+ $p2plist['scour'] = array();
+ $p2plist['scour'][] = array('Scour', 'tcp', '8311', '8311', 'both');
+ $p2plist['shareaza'] = array();
+ $p2plist['shareaza'][] = array('Shareaza', 'tcp', '6346', '6346', 'both');
+ $p2plist['songspy'] = array();
+ $p2plist['songspy'][] = array('SongSpy', 'tcp', '5190', '5190', 'both');
+ $p2plist['winmx'] = array();
+ $p2plist['winmx'][] = array('WinMX', 'tcp', '6699', '6699', 'both');
+
+
+
+$othersplist = array();
+ /* Unlike other areas we are posting the queue H or L or BLANK */
+
+ /* Remote Service / Terminal emulation */
+
+ $othersplist['appleremotedesktop'] = array();
+ /* apple remote desktop */
+ $othersplist['appleremotedesktop'][] = array('AppleRemoteDesktop1', 'tcp', '3283', '3283', 'both');
+ $othersplist['appleremotedesktop'][] = array('AppleRemoteDesktop2', 'tcp', '5900', '5900', 'both');
+ $othersplist['appleremotedesktop'][] = array('AppleRemoteDesktop3', 'udp', '3283', '3283', 'both');
+ $othersplist['appleremotedesktop'][] = array('AppleRemoteDesktop4', 'udp', '5900', '5900', 'both');
+
+ $othersplist['msrdp'] = array();
+ /* MSRDP */
+ $othersplist['msrdp'][] = array('MSRDP', 'tcp', '3389', '3389', 'both');
+
+ $othersplist['pcanywhere'] = array();
+ /* symantec pc anywhere */
+ $othersplist['pcanywhere'][] = array('PCAnywhere-1', 'tcp', '5631', '5631', 'both');
+ $othersplist['pcanywhere'][] = array('PCAnywhere-2', 'udp', '5632', '5632', 'both');
+
+ $othersplist['vnc'] = array();
+ /* virtual network control */
+ $othersplist['vnc'][] = array('VNC', 'tcp', '5900', '5930', 'both');
+
+ /* Messanger Clients */
+
+ $othersplist['aolinstantmessenger'] = array();
+ /* AIM */
+ $othersplist['aolinstantmessenger'][] = array('AIM', 'tcp', '5190', '5190', 'both');
+
+ $othersplist['facetime'] = array();
+ /* Facetime */
+ $othersplist['facetime'][] = array('Facetime-UDP-1', 'udp', '3478', '3479', 'both');
+ $othersplist['facetime'][] = array('Facetime-TCP-1', 'tcp', '16384', '16387', 'both');
+ $othersplist['facetime'][] = array('Facetime-TCP-2', 'tcp', '16393', '16402', 'both');
+
+ $othersplist['googlehangouts'] = array();
+ /* Google Hangouts */
+ $othersplist['googlehangouts'][] = array('GoogleHangouts-UDP', 'udp', '19302', '19309', 'both');
+ $othersplist['googlehangouts'][] = array('GoogleHangouts-TCP', 'tcp', '19305', '19309', 'both');
+
+ $othersplist['icq'] = array();
+ /* icq */
+ $othersplist['icq'][] = array('ICQ1', 'tcp', '5190', '5190', 'both');
+ $othersplist['icq'][] = array('ICQ2', 'udp', '5190', '5190', 'both');
+
+ $othersplist['irc'] = array();
+ /* internet relay chat */
+ $othersplist['irc'][] = array('IRC', 'tcp', '6667', '6670', 'both');
+
+ $othersplist['jabber'] = array();
+ /* jabber */
+ $othersplist['jabber'][] = array('IRC', 'tcp', '5222', '5222', 'both');
+ $othersplist['jabber'][] = array('IRC', 'tcp', '5223', '5223', 'both');
+ $othersplist['jabber'][] = array('IRC', 'tcp', '5269', '5269', 'both');
+
+ $othersplist['msnmessenger'] = array();
+ /* msn messenger */
+ $othersplist['msnmessenger'][] = array('MSN1', 'tcp', '1863', '1863', 'both');
+ $othersplist['msnmessenger'][] = array('MSN2', 'tcp', '6891', '6900', 'both');
+ $othersplist['msnmessenger'][] = array('MSN3', 'tcp', '6901', '6901', 'both');
+ $othersplist['msnmessenger'][] = array('MSN4', 'udp', '6901', '6901', 'both');
+
+ $othersplist['teamspeak'] = array();
+ /* teamspeak */
+ $othersplist['teamspeak'][] = array('TeamSpeak-1', 'tcp', '14534', '14534', 'both');
+ $othersplist['teamspeak'][] = array('TeamSpeak-2', 'tcp', '51234', '51234', 'both');
+ $othersplist['teamspeak'][] = array('TeamSpeak-3', 'udp', '8767', '8768', 'both');
+
+ $othersplist['teamspeak3'] = array();
+ /* teamspeak 3 */
+ $othersplist['teamspeak3'][] = array('TeamSpeak3-FileTransfer', 'tcp', '30033', '30033', 'both');
+ $othersplist['teamspeak3'][] = array('TeamSpeak3-ServerQuery', 'tcp', '10011', '10011', 'both');
+ $othersplist['teamspeak3'][] = array('TeamSpeak3-Voice', 'udp', '9987', '9987', 'both');
+ $othersplist['teamspeak3'][] = array('TeamSpeak3-TSDNS', 'tcp', '41144', '41144', 'both');
+
+ $othersplist['ventrilo'] = array();
+ /* ventrilo */
+ $othersplist['ventrilo'][] = array('Ventrilo-TCP', 'tcp', '3784', '3784', 'both');
+ $othersplist['ventrilo'][] = array('Ventrilo-UDP', 'udp', '3784', '3784', 'both');
+ $othersplist['ventrilo'][] = array('Ventrilo-Voice', 'udp', '6100', '6100', 'both');
+
+ /* VPN */
+
+ $othersplist['pptp'] = array();
+ /* PPTP */
+ $othersplist['pptp'][] = array('PPTP', 'tcp', '1723', '1723', 'both');
+ $othersplist['pptp'][] = array('PPTPGRE', 'gre', '', '', 'both');
+
+ $othersplist['ipsec'] = array();
+ /* IPSEC */
+ $othersplist['ipsec'][] = array('IPSEC', 'udp', '500', '500', 'both');
+ $othersplist['ipsec'][] = array('IPSEC', 'ah', '', '', 'both');
+ $othersplist['ipsec'][] = array('IPSEC', 'esp', '', '', 'both');
+
+ /* Multimedia/Streaming */
+
+ $othersplist['itunesradio'] = array();
+ /* Apple iTunes Radio Stream */
+ $othersplist['itunesradio'][] = array('iTunesRadio', 'tcp', '42000', '42999', 'both');
+
+ $othersplist['streamingmp3'] = array();
+ /* streaming mp3 media aka shoutcast */
+ $othersplist['streamingmp3'][] = array('STREAMINGMP3', 'tcp', '8000', '8100', 'both');
+
+ $othersplist['rtsp'] = array();
+ /* realtime streaming protocol */
+ $othersplist['rtsp'][] = array('RTSP1', 'tcp', '554', '554', 'both');
+
+ $othersplist['rtmp'] = array();
+ /* Real-Time Messaging Protocol */
+ $othersplist['rtmp'][] = array('RTMP', 'tcp', '1935', '1935', 'both');
+
+ /* Web */
+
+ $othersplist['http'] = array();
+ /* HTTP aka Web Traffic */
+ $othersplist['http'][] = array('HTTP', 'tcp', '80', '80', 'both');
+ $othersplist['http'][] = array('HTTPS', 'tcp', '443', '443', 'both');
+
+ /* Mail */
+
+ $othersplist['imap'] = array();
+ /* IMAP */
+ $othersplist['imap'][] = array('IMAP', 'tcp', '143', '143', 'both');
+ $othersplist['imap'][] = array('IMAP-Secure', 'tcp', '993', '993', 'both');
+
+ $othersplist['lotusnotes'] = array();
+ /* lotus notes */
+ $othersplist['lotusnotes'][] = array('LotusNotes1', 'tcp', '1352', '1352', 'both');
+ $othersplist['lotusnotes'][] = array('LotusNotes2', 'udp', '1352', '1352', 'both');
+
+ $othersplist['pop3'] = array();
+ /* Post Office Protocol - POP3 */
+ $othersplist['pop3'][] = array('POP3', 'tcp', '110', '110', 'both');
+ $othersplist['pop3'][] = array('POP3-Secure', 'tcp', '995', '995', 'both');
+
+ $othersplist['smtp'] = array();
+ /* SMTP */
+ $othersplist['smtp'][] = array('SMTP', 'tcp', '25', '25', 'both');
+ $othersplist['smtp'][] = array('SMTP-Secure-1', 'tcp', '465', '465', 'both');
+ $othersplist['smtp'][] = array('SMTP-Secure-2', 'tcp', '587', '587', 'both');
+
+ /* Game Downloader */
+
+ //NOTE: Battle.net-Downloader runs on this port range. Don't want that up with the game que.
+ $othersplist['battlenetdownloader'] = array();
+ $othersplist['battlenetdownloader'][] = array('Battle.NET-Downloader', 'tcp', '6881', '6999', 'both');
+
+ //NOTE: steam downloads, probably don't want this in the game que
+ $othersplist['steamdownloader'] = array();
+ $othersplist['steamdownloader'][] = array('Steam-Downloader', 'tcp', '27014', '27050', 'both');
+
+ /* Miscellaneous */
+
+ $othersplist['apns'] = array();
+ /* Apple Push Notification Service */
+ $othersplist['apns'][] = array('APNS', 'tcp', '5223', '5223', 'both');
+ $othersplist['apns'][] = array('APNS', 'tcp', '2195', '2196', 'both');
+
+ $othersplist['applemobilesync'] = array();
+ /* Apple Mobile Sync */
+ $othersplist['applemobilesync'][] = array('AppleMobileSync', 'tcp', '2336', '2336', 'both');
+
+ $othersplist['crashplan'] = array();
+ /* crashplan */
+ $othersplist['crashplan'][] = array('CrashPlan-1', 'tcp', '4282', '4282', 'both');
+ $othersplist['crashplan'][] = array('CrashPlan-2', 'tcp', '4285', '4285', 'both');
+
+ $othersplist['cvsup'] = array();
+ /* cvs */
+ $othersplist['cvsup'][] = array('cvsup', 'tcp', '5999', '5999', 'both');
+
+ $othersplist['dns'] = array();
+ /* domain name system */
+ $othersplist['dns'][] = array('DNS1', 'tcp', '53', '53', 'both');
+ $othersplist['dns'][] = array('DNS2', 'udp', '53', '53', 'both');
+
+ $othersplist['git'] = array();
+ /* GIT */
+ $othersplist['git'][] = array('git', 'tcp', '9418', '9418', 'both');
+
+ $othersplist['hbci'] = array();
+ /* HBCI */
+ $othersplist['hbci'][] = array('HBCI', 'tcp', '3000', '3000', 'both');
+
+ $othersplist['icmp'] = array();
+ /* ICMP */
+ $othersplist['icmp'][] = array('ICMP', 'icmp', '', '', 'both');
+
+ $othersplist['mysqlserver'] = array();
+ /* mysql server */
+ $othersplist['mysqlserver'][] = array('MySQL1', 'tcp', '3306', '3306', 'both');
+
+ $othersplist['nntp'] = array();
+ /* nntp */
+ $othersplist['nntp'][] = array('NNTP1', 'tcp', '119', '119', 'both');
+ $othersplist['nntp'][] = array('NNTP2', 'udp', '119', '119', 'both');
+
+ $othersplist['slingbox'] = array();
+ /* slingbox */
+ $othersplist['slingbox'][] = array('Slingbox1', 'tcp', '5001', '5001', 'both');
+ $othersplist['slingbox'][] = array('Slingbox2', 'udp', '5001', '5001', 'both');
+
+ $othersplist['smb'] = array();
+ /* Microsoft SMB and friends */
+ $othersplist['smb'][] = array('SMB1', 'tcp', '445', '445', 'both');
+ $othersplist['smb'][] = array('SMB2', 'tcp', '137-139', '137-139', 'both');
+
+ $othersplist['snmp'] = array();
+ /* Simple network management protocol */
+ $othersplist['snmp'][] = array('SNMP', 'tcp', '161', '161', 'both');
+ $othersplist['snmp'][] = array('SNMP2', 'udp', '161', '161', 'both');
+
+ $othersplist['subversion'] = array();
+ /* subversion */
+ $othersplist['subversion'][] = array('subversion', 'tcp', '3690', '3690', 'both');
+
+?>
diff --git a/src/etc/inc/xmlparse.inc b/src/etc/inc/xmlparse.inc
new file mode 100644
index 0000000..08d9b19
--- /dev/null
+++ b/src/etc/inc/xmlparse.inc
@@ -0,0 +1,334 @@
+<?php
+/* $Id$ */
+/*
+ xmlparse.inc
+ functions to parse/dump configuration files in XML format
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* The following items will be treated as arrays in config.xml */
+function listtags() {
+ /*
+ * Please keep this list alpha sorted and no longer than 80 characters
+ * I know it's a pain, but it's a pain to find stuff too if it's not
+ */
+ $ret = array(
+ 'acls', 'alias', 'aliasurl', 'allowedip', 'allowedhostname', 'authserver',
+ 'bridged', 'build_port_path',
+ 'ca', 'cacert', 'cert', 'crl', 'clone', 'config', 'container', 'columnitem',
+ 'depends_on_package', 'disk', 'dnsserver', 'dnsupdate', 'domainoverrides', 'dyndns',
+ 'earlyshellcmd', 'element', 'encryption-algorithm-option',
+ 'field', 'fieldname',
+ 'gateway_item', 'gateway_group', 'gif', 'gre', 'group',
+ 'hash-algorithm-option', 'hosts', 'member', 'ifgroupentry', 'igmpentry', 'interface_array', 'item', 'key',
+ 'lagg', 'lbaction', 'lbpool', 'l7rules', 'lbprotocol',
+ 'member', 'menu', 'tab', 'mobilekey', 'monitor_type', 'mount',
+ 'npt', 'ntpserver',
+ 'onetoone', 'openvpn-server', 'openvpn-client', 'openvpn-csc', 'option',
+ 'package', 'passthrumac', 'phase1', 'phase2', 'ppp', 'pppoe', 'priv', 'proxyarpnet', 'pool',
+ 'qinqentry', 'queue',
+ 'pages', 'pipe', 'radnsserver', 'roll', 'route', 'row', 'rrddatafile', 'rule',
+ 'schedule', 'service', 'servernat', 'servers',
+ 'serversdisabled', 'shellcmd', 'staticmap', 'subqueue',
+ 'timerange', 'tunnel', 'user', 'vip', 'virtual_server', 'vlan',
+ 'winsserver', 'wolentry', 'widget'
+ );
+ return array_flip($ret);
+}
+
+/* Package XML tags that should be treated as a list not as a traditional array */
+function listtags_pkg() {
+ $ret = array('build_port_path', 'depends_on_package', 'onetoone', 'queue', 'rule', 'servernat', 'alias', 'additional_files_needed', 'tab', 'template', 'menu', 'rowhelperfield', 'service', 'step', 'package', 'columnitem', 'option', 'item', 'field', 'package', 'file');
+
+ return array_flip($ret);
+}
+
+function startElement($parser, $name, $attrs) {
+ global $parsedcfg, $depth, $curpath, $havedata, $listtags;
+
+ array_push($curpath, strtolower($name));
+
+ $ptr =& $parsedcfg;
+ foreach ($curpath as $path) {
+ $ptr =& $ptr[$path];
+ }
+
+ /* is it an element that belongs to a list? */
+ if (isset($listtags[strtolower($name)])) {
+
+ /* is there an array already? */
+ if (!is_array($ptr)) {
+ /* make an array */
+ $ptr = array();
+ }
+
+ array_push($curpath, count($ptr));
+
+ } else if (isset($ptr)) {
+ /* multiple entries not allowed for this element, bail out */
+ die(sprintf(gettext('XML error: %1$s at line %2$d cannot occur more than once') . "\n",
+ $name,
+ xml_get_current_line_number($parser)));
+ }
+
+ $depth++;
+ $havedata = $depth;
+}
+
+function endElement($parser, $name) {
+ global $depth, $curpath, $parsedcfg, $havedata, $listtags;
+
+ if ($havedata == $depth) {
+ $ptr =& $parsedcfg;
+ foreach ($curpath as $path) {
+ $ptr =& $ptr[$path];
+ }
+ $ptr = "";
+ }
+
+ array_pop($curpath);
+
+ if (isset($listtags[strtolower($name)])) {
+ array_pop($curpath);
+ }
+
+ $depth--;
+}
+
+function cData($parser, $data) {
+ global $depth, $curpath, $parsedcfg, $havedata;
+
+ $data = trim($data, "\t\n\r");
+
+ if ($data != "") {
+ $ptr =& $parsedcfg;
+ foreach ($curpath as $path) {
+ $ptr =& $ptr[$path];
+ }
+
+ if (is_string($ptr)) {
+ $ptr .= html_entity_decode($data);
+ } else {
+ if (trim($data, " ") != "") {
+ $ptr = html_entity_decode($data);
+ $havedata++;
+ }
+ }
+ }
+}
+
+function parse_xml_config($cffile, $rootobj, $isstring = "false") {
+ global $listtags;
+ $listtags = listtags();
+ if (isset($GLOBALS['custom_listtags'])) {
+ foreach ($GLOBALS['custom_listtags'] as $tag) {
+ $listtags[$tag] = $tag;
+ }
+ }
+ return parse_xml_config_raw($cffile, $rootobj, $isstring);
+}
+
+function parse_xml_config_pkg($cffile, $rootobj, $isstring = "false") {
+ global $listtags;
+ $listtags = listtags_pkg();
+ if (isset($GLOBALS['custom_listtags_pkg'])) {
+ foreach ($GLOBALS['custom_listtags_pkg'] as $tag) {
+ $listtags[$tag] = $tag;
+ }
+ }
+ $cfg =parse_xml_config_raw($cffile, $rootobj, $isstring);
+ if ($cfg == -1) {
+ return array();
+ }
+
+ return $cfg;
+}
+
+function parse_xml_config_raw($cffile, $rootobj, $isstring = "false") {
+
+ global $depth, $curpath, $parsedcfg, $havedata, $listtags;
+ $parsedcfg = array();
+ $curpath = array();
+ $depth = 0;
+ $havedata = 0;
+
+ $xml_parser = xml_parser_create();
+
+ xml_set_element_handler($xml_parser, "startElement", "endElement");
+ xml_set_character_data_handler($xml_parser, "cdata");
+ xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);
+
+ if (!($fp = fopen($cffile, "r"))) {
+ log_error(gettext("Error: could not open XML input") . "\n");
+ return -1;
+ }
+
+ while ($data = fread($fp, 4096)) {
+ if (!xml_parse($xml_parser, $data, feof($fp))) {
+ log_error(sprintf(gettext('XML error: %1$s at line %2$d in %3$s') . "\n",
+ xml_error_string(xml_get_error_code($xml_parser)),
+ xml_get_current_line_number($xml_parser),
+ $cffile));
+ return -1;
+ }
+ }
+ xml_parser_free($xml_parser);
+
+ if ($rootobj) {
+ if (!is_array($rootobj)) {
+ $rootobj = array($rootobj);
+ }
+ foreach ($rootobj as $rootobj_name) {
+ if ($parsedcfg[$rootobj_name]) {
+ break;
+ }
+ }
+
+ if (!$parsedcfg[$rootobj_name]) {
+ log_error(sprintf(gettext("XML error: no %s object found!") . "\n", implode(" or ", $rootobj)));
+ return -1;
+ }
+ return $parsedcfg[$rootobj_name];
+ } else {
+ return $parsedcfg;
+ }
+}
+
+function dump_xml_config_sub($arr, $indent) {
+
+ global $listtags;
+
+ $xmlconfig = "";
+
+ foreach ($arr as $ent => $val) {
+ if (is_array($val)) {
+ /* is it just a list of multiple values? */
+ if (isset($listtags[strtolower($ent)])) {
+ foreach ($val as $cval) {
+ if (is_array($cval)) {
+ if (empty($cval)) {
+ $xmlconfig .= str_repeat("\t", $indent);
+ $xmlconfig .= "<$ent/>\n";
+ } else {
+ $xmlconfig .= str_repeat("\t", $indent);
+ $xmlconfig .= "<$ent>\n";
+ $xmlconfig .= dump_xml_config_sub($cval, $indent + 1);
+ $xmlconfig .= str_repeat("\t", $indent);
+ $xmlconfig .= "</$ent>\n";
+ }
+ } else {
+ if ($cval === false) {
+ continue;
+ }
+ $xmlconfig .= str_repeat("\t", $indent);
+ if ((is_bool($cval) && $cval == true) || ($cval === "")) {
+ $xmlconfig .= "<$ent/>\n";
+ } else if ((substr($ent, 0, 5) == "descr") ||
+ (substr($ent, 0, 6) == "detail") ||
+ (substr($ent, 0, 12) == "login_banner") ||
+ (substr($ent, 0, 9) == "ldap_attr") ||
+ (substr($ent, 0, 9) == "ldap_bind") ||
+ (substr($ent, 0, 11) == "ldap_basedn") ||
+ (substr($ent, 0, 18) == "ldap_authcn") ||
+ (substr($ent, 0, 19) == "ldap_extended_query")) {
+ $xmlconfig .= "<$ent><![CDATA[" . htmlentities($cval) . "]]></$ent>\n";
+ } else {
+ $xmlconfig .= "<$ent>" . htmlentities($cval) . "</$ent>\n";
+ }
+ }
+ }
+ } else if (empty($val)) {
+ $xmlconfig .= str_repeat("\t", $indent);
+ $xmlconfig .= "<$ent/>\n";
+ } else {
+ /* it's an array */
+ $xmlconfig .= str_repeat("\t", $indent);
+ $xmlconfig .= "<$ent>\n";
+ $xmlconfig .= dump_xml_config_sub($val, $indent + 1);
+ $xmlconfig .= str_repeat("\t", $indent);
+ $xmlconfig .= "</$ent>\n";
+ }
+ } else {
+ if ((is_bool($val) && ($val == true)) || ($val === "")) {
+ $xmlconfig .= str_repeat("\t", $indent);
+ $xmlconfig .= "<$ent/>\n";
+ } else if (!is_bool($val)) {
+ $xmlconfig .= str_repeat("\t", $indent);
+ if ((substr($ent, 0, 5) == "descr") ||
+ (substr($ent, 0, 6) == "detail") ||
+ (substr($ent, 0, 12) == "login_banner") ||
+ (substr($ent, 0, 9) == "ldap_attr") ||
+ (substr($ent, 0, 9) == "ldap_bind") ||
+ (substr($ent, 0, 11) == "ldap_basedn") ||
+ (substr($ent, 0, 18) == "ldap_authcn") ||
+ (substr($ent, 0, 19) == "ldap_extended_query")) {
+ $xmlconfig .= "<$ent><![CDATA[" . htmlentities($val) . "]]></$ent>\n";
+ } else {
+ $xmlconfig .= "<$ent>" . htmlentities($val) . "</$ent>\n";
+ }
+ }
+ }
+ }
+
+ return $xmlconfig;
+}
+
+function dump_xml_config($arr, $rootobj) {
+ global $listtags;
+ $listtags = listtags();
+ if (isset($GLOBALS['custom_listtags'])) {
+ foreach ($GLOBALS['custom_listtags'] as $tag) {
+ $listtags[$tag] = $tag;
+ }
+ }
+ return dump_xml_config_raw($arr, $rootobj);
+}
+
+function dump_xml_config_pkg($arr, $rootobj) {
+ global $listtags;
+ $listtags = listtags_pkg();
+ if (isset($GLOBALS['custom_listtags_pkg'])) {
+ foreach ($GLOBALS['custom_listtags_pkg'] as $tag) {
+ $listtags[$tag] = $tag;
+ }
+ }
+ return dump_xml_config_raw($arr, $rootobj);
+}
+
+function dump_xml_config_raw($arr, $rootobj) {
+
+ $xmlconfig = "<?xml version=\"1.0\"?" . ">\n";
+ $xmlconfig .= "<$rootobj>\n";
+
+ $xmlconfig .= dump_xml_config_sub($arr, 1);
+
+ $xmlconfig .= "</$rootobj>\n";
+
+ return $xmlconfig;
+}
+
+?>
diff --git a/src/etc/inc/xmlparse_attr.inc b/src/etc/inc/xmlparse_attr.inc
new file mode 100644
index 0000000..ab90e98
--- /dev/null
+++ b/src/etc/inc/xmlparse_attr.inc
@@ -0,0 +1,237 @@
+<?php
+/* $Id$ */
+/*
+ xmlparse_attr.inc
+ functions to parse configuration files in XML format with attributes
+ Copyright (C) 2010 Erik Fonnesbeck
+ All rights reserved.
+
+ Based on xmlparse.inc, originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* The following items will be treated as arrays in regdomain.xml */
+function listtags_rd() {
+ $ret = explode(" ",
+ "band country flags freqband netband rd"
+ );
+ return $ret;
+}
+
+function startElement_attr($parser, $name, $attrs) {
+ global $parsedcfg, $depth, $curpath, $havedata, $listtags, $parsedattrs;
+
+ array_push($curpath, strtolower($name));
+
+ $ptr =& $parsedcfg;
+ if (!empty($attrs)) {
+ $attrptr =& $parsedattrs;
+ $writeattrs = true;
+ }
+ foreach ($curpath as $path) {
+ $ptr =& $ptr[$path];
+ if (isset($writeattrs)) {
+ $attrptr =& $attrptr[$path];
+ }
+ }
+
+ /* is it an element that belongs to a list? */
+ if (in_array(strtolower($name), $listtags)) {
+
+ /* is there an array already? */
+ if (!is_array($ptr)) {
+ /* make an array */
+ $ptr = array();
+ }
+
+ array_push($curpath, count($ptr));
+
+ if (isset($writeattrs)) {
+ if (!is_array($attrptr)) {
+ $attrptr = array();
+ }
+ $attrptr[count($ptr)] = $attrs;
+ }
+
+ } else if (isset($ptr)) {
+ /* multiple entries not allowed for this element, bail out */
+ die(sprintf(gettext('XML error: %1$s at line %2$d cannot occur more than once') . "\n",
+ $name,
+ xml_get_current_line_number($parser)));
+ } else if (isset($writeattrs)) {
+ $attrptr = $attrs;
+ }
+
+ $depth++;
+ $havedata = $depth;
+}
+
+function endElement_attr($parser, $name) {
+ global $depth, $curpath, $parsedcfg, $havedata, $listtags;
+
+ if ($havedata == $depth) {
+ $ptr =& $parsedcfg;
+ foreach ($curpath as $path) {
+ $ptr =& $ptr[$path];
+ }
+ $ptr = "";
+ }
+
+ array_pop($curpath);
+
+ if (in_array(strtolower($name), $listtags)) {
+ array_pop($curpath);
+ }
+
+ $depth--;
+}
+
+function cData_attr($parser, $data) {
+ global $depth, $curpath, $parsedcfg, $havedata;
+
+ $data = trim($data, "\t\n\r");
+
+ if ($data != "") {
+ $ptr =& $parsedcfg;
+ foreach ($curpath as $path) {
+ $ptr =& $ptr[$path];
+ }
+
+ if (is_string($ptr)) {
+ $ptr .= html_entity_decode($data);
+ } else {
+ if (trim($data, " ") != "") {
+ $ptr = html_entity_decode($data);
+ $havedata++;
+ }
+ }
+ }
+}
+
+function parse_xml_regdomain(&$rdattributes, $rdfile = '', $rootobj = 'regulatory-data') {
+ global $g, $listtags;
+
+ if (empty($rdfile)) {
+ $rdfile = $g['etc_path'] . '/regdomain.xml';
+ }
+ $listtags = listtags_rd();
+ $parsed_xml = array();
+
+ if (file_exists($g['tmp_path'] . '/regdomain.cache')) {
+ $parsed_xml = unserialize(file_get_contents($g['tmp_path'] . '/regdomain.cache'));
+ if (!empty($parsed_xml)) {
+ $rdmain = $parsed_xml['main'];
+ $rdattributes = $parsed_xml['attributes'];
+ }
+ }
+ if (empty($parsed_xml) && file_exists($g['etc_path'] . '/regdomain.xml')) {
+ $rdmain = parse_xml_config_raw_attr($rdfile, $rootobj, $rdattributes);
+
+ // unset parts that aren't used before making cache
+ foreach ($rdmain['regulatory-domains']['rd'] as $rdkey => $rdentry) {
+ if (isset($rdmain['regulatory-domains']['rd'][$rdkey]['netband'])) {
+ unset($rdmain['regulatory-domains']['rd'][$rdkey]['netband']);
+ }
+ if (isset($rdattributes['regulatory-domains']['rd'][$rdkey]['netband'])) {
+ unset($rdattributes['regulatory-domains']['rd'][$rdkey]['netband']);
+ }
+ }
+ if (isset($rdmain['shared-frequency-bands'])) {
+ unset($rdmain['shared-frequency-bands']);
+ }
+ if (isset($rdattributes['shared-frequency-bands'])) {
+ unset($rdattributes['shared-frequency-bands']);
+ }
+
+ $parsed_xml = array('main' => $rdmain, 'attributes' => $rdattributes);
+ $rdcache = fopen($g['tmp_path'] . '/regdomain.cache', "w");
+ fwrite($rdcache, serialize($parsed_xml));
+ fclose($rdcache);
+ }
+
+ return $rdmain;
+}
+
+function parse_xml_config_raw_attr($cffile, $rootobj, &$parsed_attributes, $isstring = "false") {
+
+ global $depth, $curpath, $parsedcfg, $havedata, $listtags, $parsedattrs;
+ $parsedcfg = array();
+ $curpath = array();
+ $depth = 0;
+ $havedata = 0;
+
+ if (isset($parsed_attributes)) {
+ $parsedattrs = array();
+ }
+
+ $xml_parser = xml_parser_create();
+
+ xml_set_element_handler($xml_parser, "startElement_attr", "endElement_attr");
+ xml_set_character_data_handler($xml_parser, "cData_attr");
+ xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);
+
+ if (!($fp = fopen($cffile, "r"))) {
+ log_error(gettext("Error: could not open XML input") . "\n");
+ if (isset($parsed_attributes)) {
+ $parsed_attributes = array();
+ unset($parsedattrs);
+ }
+ return -1;
+ }
+
+ while ($data = fread($fp, 4096)) {
+ if (!xml_parse($xml_parser, $data, feof($fp))) {
+ log_error(sprintf(gettext('XML error: %1$s at line %2$d') . "\n",
+ xml_error_string(xml_get_error_code($xml_parser)),
+ xml_get_current_line_number($xml_parser)));
+ if (isset($parsed_attributes)) {
+ $parsed_attributes = array();
+ unset($parsedattrs);
+ }
+ return -1;
+ }
+ }
+ xml_parser_free($xml_parser);
+
+ if (!$parsedcfg[$rootobj]) {
+ log_error(sprintf(gettext("XML error: no %s object found!") . "\n", $rootobj));
+ if (isset($parsed_attributes)) {
+ $parsed_attributes = array();
+ unset($parsedattrs);
+ }
+ return -1;
+ }
+
+ if (isset($parsed_attributes)) {
+ if ($parsedattrs[$rootobj]) {
+ $parsed_attributes = $parsedattrs[$rootobj];
+ }
+ unset($parsedattrs);
+ }
+
+ return $parsedcfg[$rootobj];
+}
+
+?>
diff --git a/src/etc/inc/xmlreader.inc b/src/etc/inc/xmlreader.inc
new file mode 100644
index 0000000..960acb1
--- /dev/null
+++ b/src/etc/inc/xmlreader.inc
@@ -0,0 +1,277 @@
+<?php
+/* $Id$ */
+/*
+ xmlreader.inc
+ functions to parse/dump configuration files in XML format
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: utils
+*/
+
+/* The following items will be treated as arrays in config.xml */
+function listtags() {
+ /*
+ * Please keep this list alpha sorted and no longer than 80 characters
+ * I know it's a pain, but it's a pain to find stuff too if it's not
+ */
+ $ret = array(
+ 'acls', 'alias', 'aliasurl', 'allowedip', 'allowedhostname', 'authserver',
+ 'bridged', 'build_port_path',
+ 'ca', 'cacert', 'cert', 'crl', 'clone', 'config', 'container', 'columnitem',
+ 'depends_on_package', 'disk', 'dnsserver', 'dnsupdate', 'domainoverrides', 'dyndns',
+ 'earlyshellcmd', 'element', 'encryption-algorithm-option',
+ 'field', 'fieldname',
+ 'gateway_item', 'gateway_group', 'gif', 'gre', 'group',
+ 'hash-algorithm-option', 'hosts', 'member', 'ifgroupentry', 'igmpentry', 'interface_array', 'item', 'key',
+ 'lagg', 'lbaction', 'lbpool', 'l7rules', 'lbprotocol',
+ 'member', 'menu', 'tab', 'mobilekey', 'monitor_type', 'mount',
+ 'npt', 'ntpserver',
+ 'onetoone', 'openvpn-server', 'openvpn-client', 'openvpn-csc', 'option',
+ 'package', 'passthrumac', 'phase1', 'phase2', 'ppp', 'pppoe', 'priv', 'proxyarpnet', 'pool',
+ 'qinqentry', 'queue',
+ 'pages', 'pipe', 'radnsserver', 'roll', 'route', 'row', 'rrddatafile', 'rule',
+ 'schedule', 'service', 'servernat', 'servers',
+ 'serversdisabled', 'shellcmd', 'staticmap', 'subqueue',
+ 'timerange', 'tunnel', 'user', 'vip', 'virtual_server', 'vlan',
+ 'winsserver', 'wolentry', 'widget'
+ );
+ return array_flip($ret);
+}
+
+/* Package XML tags that should be treat as a list not as a traditional array */
+function listtags_pkg() {
+ $ret = array('depends_on_package', 'onetoone', 'queue', 'rule', 'servernat', 'alias', 'additional_files_needed', 'tab', 'template', 'menu', 'rowhelperfield', 'service', 'step', 'package', 'columnitem', 'option', 'item', 'field', 'package', 'file');
+
+ return array_flip($ret);
+}
+
+function add_elements(&$cfgarray, &$parser) {
+ global $listtags;
+
+ while ($parser->read()) {
+ switch ($parser->nodeType) {
+ case XMLReader::WHITESPACE:
+ case XMLReader::SIGNIFICANT_WHITESPACE:
+ break;
+ case XMLReader::ELEMENT:
+ if (isset($listtags[strtolower($parser->name)])) {
+ $cfgref =& $cfgarray[$parser->name][count($cfgarray[$parser->name])];
+ if (!$parser->isEmptyElement) {
+ add_elements($cfgref, $parser);
+ } else {
+ $cfgref = array();
+ }
+ } else {
+ if (isset($cfgarray[$parser->name]) && (!is_array($cfgarray[$parser->name]) || !isset($cfgarray[$parser->name][0]))) {
+ $nodebkp = $cfgarray[$parser->name];
+ $cfgarray[$parser->name] = array();
+ $cfgarray[$parser->name][] = $nodebkp;
+ $cfgref =& $cfgarray[$parser->name][0];
+ unset($nodebkp);
+ } else {
+ $cfgref =& $cfgarray[$parser->name];
+ }
+
+ if ($parser->isEmptyElement) {
+ if (is_array($cfgref)) {
+ $cfgref[] = array();
+ } else {
+ $cfgref = "";
+ }
+ } else {
+ if (is_array($cfgref)) {
+ $cfgref =& $cfgarray[$parser->name][count($cfgarray[$parser->name])];
+ add_elements($cfgref, $parser);
+ } else {
+ add_elements($cfgref, $parser);
+ }
+ }
+ }
+
+ $i = 0;
+ while ($parser->moveToAttributeNo($i)) {
+ $cfgref[$parser->name] = $parser->value;
+ $i++;
+ }
+ break;
+ case XMLReader::TEXT:
+ case XMLReader::CDATA:
+ $cfgarray = $parser->value;
+ break;
+ case XMLReader::END_ELEMENT:
+ return;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+function parse_xml_config($cffile, $rootobj, $isstring = "false") {
+ global $listtags;
+
+ $listtags = listtags();
+ if (isset($GLOBALS['custom_listtags'])) {
+ foreach ($GLOBALS['custom_listtags'] as $tag) {
+ $listtags[$tag] = $tag;
+ }
+ }
+
+ return parse_xml_config_raw($cffile, $rootobj);
+}
+
+function parse_xml_config_pkg($cffile, $rootobj, $isstring = "false") {
+ global $listtags;
+
+ $listtags = listtags_pkg();
+ if (isset($GLOBALS['custom_listtags_pkg'])) {
+ foreach ($GLOBALS['custom_listtags_pkg'] as $tag) {
+ $listtags[$tag] = $tag;
+ }
+ }
+ return parse_xml_config_raw($cffile, $rootobj, $isstring);
+}
+
+function parse_xml_config_raw($cffile, $rootobj, $isstring = "false") {
+ global $listtags;
+
+ $parsedcfg = array();
+
+ $par = new XMLReader();
+ if ($par->open($cffile, "UTF-8", LIBXML_NOERROR | LIBXML_NOWARNING)) {
+ add_elements($parsedcfg, $par);
+ $par->close();
+ } else {
+ log_error(sprintf(gettext("Error returned while trying to parse %s"), $cffile));
+ }
+
+ if ($rootobj) {
+ if (!is_array($rootobj)) {
+ $rootobj = array($rootobj);
+ }
+ foreach ($rootobj as $rootobj_name) {
+ if ($parsedcfg[$rootobj_name]) {
+ break;
+ }
+ }
+
+ return $parsedcfg[$rootobj_name];
+ } else {
+ return $parsedcfg;
+ }
+}
+
+function dump_xml_config_sub(& $writer, $arr) {
+ global $listtags;
+
+ foreach ($arr as $ent => $val) {
+ if (is_array($val)) {
+ /* is it just a list of multiple values? */
+ if (isset($listtags[strtolower($ent)])) {
+ foreach ($val as $cval) {
+ if (is_array($cval)) {
+ if (empty($cval)) {
+ $writer->writeElement($ent);
+ } else {
+ $writer->startElement($ent);
+ dump_xml_config_sub($writer, $cval);
+ $writer->endElement();
+ }
+ } else {
+ if ($cval === false) {
+ continue;
+ }
+ if ((is_bool($val) && ($val == true)) || ($val === "")) {
+ $writer->writeElement($ent);
+ } else if (!is_bool($val)) {
+ $writer->writeElement($ent, $cval);
+ }
+ }
+ }
+ } else if (empty($val)) {
+ $writer->writeElement($ent);
+ } else {
+ /* it's an array */
+ $writer->startElement($ent);
+ dump_xml_config_sub($writer, $val);
+ $writer->endElement();
+ }
+ } else {
+ if ((is_bool($val) && ($val == true)) || ($val === "")) {
+ $writer->writeElement($ent);
+ } else if (!is_bool($val)) {
+ $writer->writeElement($ent, $val);
+ }
+ }
+ }
+}
+
+function dump_xml_config($arr, $rootobj) {
+ global $listtags;
+
+ $listtags = listtags();
+ if (isset($GLOBALS['custom_listtags'])) {
+ foreach ($GLOBALS['custom_listtags'] as $tag) {
+ $listtags[$tag] = $tag;
+ }
+ }
+ return dump_xml_config_raw($arr, $rootobj);
+}
+
+function dump_xml_config_pkg($arr, $rootobj) {
+ global $listtags;
+
+ $listtags = listtags_pkg();
+ if (isset($GLOBALS['custom_listtags_pkg'])) {
+ foreach ($GLOBALS['custom_listtags_pkg'] as $tag) {
+ $listtags[$tag] = $tag;
+ }
+ }
+ return dump_xml_config_raw($arr, $rootobj);
+}
+
+function dump_xml_config_raw($arr, $rootobj) {
+
+ $writer = new XMLWriter();
+ $writer->openMemory();
+ $writer->setIndent(true);
+ $writer->setIndentString("\t");
+ $writer->startDocument("1.0", "UTF-8");
+ $writer->startElement($rootobj);
+
+ dump_xml_config_sub($writer, $arr);
+
+ $writer->endElement();
+ $writer->endDocument();
+ $xmlconfig = $writer->outputMemory(true);
+
+ return $xmlconfig;
+}
+
+?>
diff --git a/src/etc/inc/xmlrpc.inc b/src/etc/inc/xmlrpc.inc
new file mode 100644
index 0000000..e96e783
--- /dev/null
+++ b/src/etc/inc/xmlrpc.inc
@@ -0,0 +1,148 @@
+<?php
+/*
+ $Id$
+
+ xmlrpc.inc
+ Copyright (C) 2005-2006 Colin Smith
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES:
+ pfSense_MODULE: utils
+*/
+
+require_once("auth.inc");
+require_once("xmlrpc_client.inc");
+
+/*
+ * xmlrpc_params_to_php: Convert params array passed from XMLRPC server into a PHP array and return it.
+ */
+function xmlrpc_params_to_php($params) {
+ $array = array();
+ for ($i = 0; $i < $params->getNumParams(); $i++) {
+ $value = $params->getParam($i);
+ $array[] = XML_RPC_decode($value);
+ }
+ return $array;
+}
+
+/*
+ * xmlrpc_value_to_php: Convert an XMLRPC value into a PHP scalar/array and return it.
+ */
+function xmlrpc_value_to_php($raw_value) {
+ /*
+ switch ($raw_value->kindOf()) {
+ case "scalar":
+ if ($raw_value->scalartyp() == "boolean") {
+ $return = (boolean) $raw_value->scalarval();
+ }
+ $return = $raw_value->scalarval();
+ break;
+ case "array":
+ $return = array();
+ for ($i = 0; $i < $raw_value->arraysize(); $i++) {
+ $value = $raw_value->arraymem($i);
+ $return[] = xmlrpc_value_to_php($value);
+ }
+ break;
+ case "struct":
+ $return = array();
+ for ($i = 0; $i < $raw_value->arraysize(); $i++) {
+ list($key, $value) = $raw_value->structeach();
+ $return[$key] = xmlrpc_value_to_php($value);
+ }
+ break;
+ }
+ */
+ return XML_RPC_decode($raw_value);
+}
+
+/*
+ * php_value_to_xmlrpc: Convert a PHP scalar or array into its XMLRPC equivalent.
+ */
+function php_value_to_xmlrpc($value, $force_array = false) {
+ $toreturn = XML_RPC_encode($value);
+ return $force_array ? array($toreturn) : $toreturn;
+ /*
+ if (gettype($value) == "array") {
+ $xmlrpc_type = "array";
+ $toreturn = array();
+ foreach ($value as $key => $val) {
+ if (is_string($key)) {
+ $xmlrpc_type = "struct";
+ }
+ $toreturn[$key] = php_value_to_xmlrpc($val);
+ }
+ return new XML_RPC_Value($toreturn, $xmlrpc_type);
+ } else {
+ if ($force_array == true) {
+ return new XML_RPC_Value(array(new XML_RPC_Value($value, gettype($value))), "array");
+ } else {
+ return new XML_RPC_Value($value, gettype($value));
+ }
+ }
+ */
+}
+
+/*
+ * xmlrpc_auth: Handle basic crypt() authentication of an XMLRPC request. This function assumes that
+ * $params[0] contains the local system's plaintext password and removes the password from
+ * the array before returning it.
+ */
+function xmlrpc_auth(&$params) {
+ global $config, $_SERVER;
+
+ /* XXX: Should teach caller to pass username and use it here. */
+ /* XXX: Should clarify from old behaviour what is in params[0] that differs from params['xmlrpcauth'] */
+ if (isset($config['system']['webgui']['authmode'])) {
+ $authcfg = auth_get_authserver($config['system']['webgui']['authmode']);
+ if (authenticate_user("admin", $params[0], $authcfg) ||
+ authenticate_user("admin", $params[0])) {
+ array_shift($params);
+ unset($params['xmlrpcauth']);
+ return true;
+ } else if (!empty($params['xmlrpcauth']) && (authenticate_user("admin", $params['xmlrpcauth'], $authcfg) ||
+ authenticate_user("admin", $params['xmlrpcauth']))) {
+ array_shift($params);
+ unset($params['xmlrpcauth']);
+ return true;
+ }
+ } else if (authenticate_user("admin", $params[0])) {
+ array_shift($params);
+ unset($params['xmlrpcauth']);
+ return true;
+ } else if (!empty($params['xmlrpcauth']) && authenticate_user("admin", $params['xmlrpcauth'])) {
+ array_shift($params);
+ unset($params['xmlrpcauth']);
+ return true;
+ }
+
+ array_shift($params);
+ unset($params['xmlrpcauth']);
+ log_error("webConfigurator authentication error for 'admin' from {$_SERVER['REMOTE_ADDR']} during sync settings.");
+ return false;
+}
+
+?>
diff --git a/src/etc/inc/xmlrpc_client.inc b/src/etc/inc/xmlrpc_client.inc
new file mode 100644
index 0000000..fbbf977
--- /dev/null
+++ b/src/etc/inc/xmlrpc_client.inc
@@ -0,0 +1,2060 @@
+<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP implementation of the XML-RPC protocol
+ *
+ * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
+ * It has support for HTTP transport, proxies and authentication.
+ *
+ * PHP versions 4 and 5
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2010 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version SVN: $Id: RPC.php 300961 2010-07-03 02:17:34Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ */
+
+
+if (!function_exists('xml_parser_create')) {
+ include_once 'PEAR.inc';
+ PEAR::loadExtension('xml');
+}
+
+/**#@+
+ * Error constants
+ */
+/**
+ * Parameter values don't match parameter types
+ */
+define('XML_RPC_ERROR_INVALID_TYPE', 101);
+/**
+ * Parameter declared to be numeric but the values are not
+ */
+define('XML_RPC_ERROR_NON_NUMERIC_FOUND', 102);
+/**
+ * Communication error
+ */
+define('XML_RPC_ERROR_CONNECTION_FAILED', 103);
+/**
+ * The array or struct has already been started
+ */
+define('XML_RPC_ERROR_ALREADY_INITIALIZED', 104);
+/**
+ * Incorrect parameters submitted
+ */
+define('XML_RPC_ERROR_INCORRECT_PARAMS', 105);
+/**
+ * Programming error by developer
+ */
+define('XML_RPC_ERROR_PROGRAMMING', 106);
+/**#@-*/
+
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_I4']
+ */
+$GLOBALS['XML_RPC_I4'] = 'i4';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Int']
+ */
+$GLOBALS['XML_RPC_Int'] = 'int';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Boolean']
+ */
+$GLOBALS['XML_RPC_Boolean'] = 'boolean';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Double']
+ */
+$GLOBALS['XML_RPC_Double'] = 'double';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_String']
+ */
+$GLOBALS['XML_RPC_String'] = 'string';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_DateTime']
+ */
+$GLOBALS['XML_RPC_DateTime'] = 'dateTime.iso8601';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Base64']
+ */
+$GLOBALS['XML_RPC_Base64'] = 'base64';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Array']
+ */
+$GLOBALS['XML_RPC_Array'] = 'array';
+
+/**
+ * Data types
+ * @global string $GLOBALS['XML_RPC_Struct']
+ */
+$GLOBALS['XML_RPC_Struct'] = 'struct';
+
+
+/**
+ * Data type meta-types
+ * @global array $GLOBALS['XML_RPC_Types']
+ */
+$GLOBALS['XML_RPC_Types'] = array(
+ $GLOBALS['XML_RPC_I4'] => 1,
+ $GLOBALS['XML_RPC_Int'] => 1,
+ $GLOBALS['XML_RPC_Boolean'] => 1,
+ $GLOBALS['XML_RPC_String'] => 1,
+ $GLOBALS['XML_RPC_Double'] => 1,
+ $GLOBALS['XML_RPC_DateTime'] => 1,
+ $GLOBALS['XML_RPC_Base64'] => 1,
+ $GLOBALS['XML_RPC_Array'] => 2,
+ $GLOBALS['XML_RPC_Struct'] => 3,
+);
+
+
+/**
+ * Error message numbers
+ * @global array $GLOBALS['XML_RPC_err']
+ */
+$GLOBALS['XML_RPC_err'] = array(
+ 'unknown_method' => 1,
+ 'invalid_return' => 2,
+ 'incorrect_params' => 3,
+ 'introspect_unknown' => 4,
+ 'http_error' => 5,
+ 'not_response_object' => 6,
+ 'invalid_request' => 7,
+);
+
+/**
+ * Error message strings
+ * @global array $GLOBALS['XML_RPC_str']
+ */
+$GLOBALS['XML_RPC_str'] = array(
+ 'unknown_method' => gettext("Unknown method"),
+ 'invalid_return' => gettext("Invalid return payload: enable debugging to examine incoming payload"),
+ 'incorrect_params' => gettext("Incorrect parameters passed to method"),
+ 'introspect_unknown' => gettext("Can't introspect: method unknown"),
+ 'http_error' => gettext("Didn't receive 200 OK from remote server."),
+ 'not_response_object' => gettext("The requested method didn't return an XML_RPC_Response object."),
+ 'invalid_request' => gettext("Invalid request payload"),
+);
+
+
+/**
+ * Default XML encoding (ISO-8859-1, UTF-8 or US-ASCII)
+ * @global string $GLOBALS['XML_RPC_defencoding']
+ */
+$GLOBALS['XML_RPC_defencoding'] = 'UTF-8';
+
+/**
+ * User error codes start at 800
+ * @global int $GLOBALS['XML_RPC_erruser']
+ */
+$GLOBALS['XML_RPC_erruser'] = 800;
+
+/**
+ * XML parse error codes start at 100
+ * @global int $GLOBALS['XML_RPC_errxml']
+ */
+$GLOBALS['XML_RPC_errxml'] = 100;
+
+
+/**
+ * Compose backslashes for escaping regexp
+ * @global string $GLOBALS['XML_RPC_backslash']
+ */
+$GLOBALS['XML_RPC_backslash'] = chr(92) . chr(92);
+
+
+/**
+ * Should we automatically base64 encode strings that contain characters
+ * which can cause PHP's SAX-based XML parser to break?
+ * @global boolean $GLOBALS['XML_RPC_auto_base64']
+ */
+$GLOBALS['XML_RPC_auto_base64'] = true;
+
+
+/**
+ * Valid parents of XML elements
+ * @global array $GLOBALS['XML_RPC_valid_parents']
+ */
+$GLOBALS['XML_RPC_valid_parents'] = array(
+ 'BOOLEAN' => array('VALUE'),
+ 'I4' => array('VALUE'),
+ 'INT' => array('VALUE'),
+ 'STRING' => array('VALUE'),
+ 'DOUBLE' => array('VALUE'),
+ 'DATETIME.ISO8601' => array('VALUE'),
+ 'BASE64' => array('VALUE'),
+ 'ARRAY' => array('VALUE'),
+ 'STRUCT' => array('VALUE'),
+ 'PARAM' => array('PARAMS'),
+ 'METHODNAME' => array('METHODCALL'),
+ 'PARAMS' => array('METHODCALL', 'METHODRESPONSE'),
+ 'MEMBER' => array('STRUCT'),
+ 'NAME' => array('MEMBER'),
+ 'DATA' => array('ARRAY'),
+ 'FAULT' => array('METHODRESPONSE'),
+ 'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'),
+);
+
+
+/**
+ * Stores state during parsing
+ *
+ * quick explanation of components:
+ * + ac = accumulates values
+ * + qt = decides if quotes are needed for evaluation
+ * + cm = denotes struct or array (comma needed)
+ * + isf = indicates a fault
+ * + lv = indicates "looking for a value": implements the logic
+ * to allow values with no types to be strings
+ * + params = stores parameters in method calls
+ * + method = stores method name
+ *
+ * @global array $GLOBALS['XML_RPC_xh']
+ */
+$GLOBALS['XML_RPC_xh'] = array();
+
+
+/**
+ * Start element handler for the XML parser
+ *
+ * @return void
+ */
+function XML_RPC_se($parser_resource, $name, $attrs)
+{
+ global $XML_RPC_xh, $XML_RPC_valid_parents;
+
+ $parser = (int) $parser_resource;
+
+ // if invalid xmlrpc already detected, skip all processing
+ if ($XML_RPC_xh[$parser]['isf'] >= 2) {
+ return;
+ }
+
+ // check for correct element nesting
+ // top level element can only be of 2 types
+ if (count($XML_RPC_xh[$parser]['stack']) == 0) {
+ if ($name != 'METHODRESPONSE' && $name != 'METHODCALL') {
+ $XML_RPC_xh[$parser]['isf'] = 2;
+ $XML_RPC_xh[$parser]['isf_reason'] = gettext('missing top level xmlrpc element');
+ return;
+ }
+ } else {
+ // not top level element: see if parent is OK
+ if (!in_array($XML_RPC_xh[$parser]['stack'][0], $XML_RPC_valid_parents[$name])) {
+ $name = preg_replace('@[^a-zA-Z0-9._-]@', '', $name);
+ $XML_RPC_xh[$parser]['isf'] = 2;
+ $XML_RPC_xh[$parser]['isf_reason'] = sprintf(gettext('xmlrpc element %1$s cannot be child of %2$s'), $name, $XML_RPC_xh[$parser]['stack'][0]);
+ return;
+ }
+ }
+
+ switch ($name) {
+ case 'STRUCT':
+ $XML_RPC_xh[$parser]['cm']++;
+
+ // turn quoting off
+ $XML_RPC_xh[$parser]['qt'] = 0;
+
+ $cur_val = array();
+ $cur_val['value'] = array();
+ $cur_val['members'] = 1;
+ array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
+ break;
+
+ case 'ARRAY':
+ $XML_RPC_xh[$parser]['cm']++;
+
+ // turn quoting off
+ $XML_RPC_xh[$parser]['qt'] = 0;
+
+ $cur_val = array();
+ $cur_val['value'] = array();
+ $cur_val['members'] = 0;
+ array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
+ break;
+
+ case 'NAME':
+ $XML_RPC_xh[$parser]['ac'] = '';
+ break;
+
+ case 'FAULT':
+ $XML_RPC_xh[$parser]['isf'] = 1;
+ break;
+
+ case 'PARAM':
+ $XML_RPC_xh[$parser]['valuestack'] = array();
+ break;
+
+ case 'VALUE':
+ $XML_RPC_xh[$parser]['lv'] = 1;
+ $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_String'];
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = 0;
+ // look for a value: if this is still 1 by the
+ // time we reach the first data segment then the type is string
+ // by implication and we need to add in a quote
+ break;
+
+ case 'I4':
+ case 'INT':
+ case 'STRING':
+ case 'BOOLEAN':
+ case 'DOUBLE':
+ case 'DATETIME.ISO8601':
+ case 'BASE64':
+ $XML_RPC_xh[$parser]['ac'] = ''; // reset the accumulator
+
+ if ($name == 'DATETIME.ISO8601' || $name == 'STRING') {
+ $XML_RPC_xh[$parser]['qt'] = 1;
+
+ if ($name == 'DATETIME.ISO8601') {
+ $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_DateTime'];
+ }
+
+ } elseif ($name == 'BASE64') {
+ $XML_RPC_xh[$parser]['qt'] = 2;
+ } else {
+ // No quoting is required here -- but
+ // at the end of the element we must check
+ // for data format errors.
+ $XML_RPC_xh[$parser]['qt'] = 0;
+ }
+ break;
+
+ case 'MEMBER':
+ $XML_RPC_xh[$parser]['ac'] = '';
+ break;
+
+ case 'DATA':
+ case 'METHODCALL':
+ case 'METHODNAME':
+ case 'METHODRESPONSE':
+ case 'PARAMS':
+ // valid elements that add little to processing
+ break;
+ }
+
+
+ // Save current element to stack
+ array_unshift($XML_RPC_xh[$parser]['stack'], $name);
+
+ if ($name != 'VALUE') {
+ $XML_RPC_xh[$parser]['lv'] = 0;
+ }
+}
+
+/**
+ * End element handler for the XML parser
+ *
+ * @return void
+ */
+function XML_RPC_ee($parser_resource, $name)
+{
+ global $XML_RPC_xh;
+
+ $parser = (int) $parser_resource;
+
+ if ($XML_RPC_xh[$parser]['isf'] >= 2) {
+ return;
+ }
+
+ // push this element from stack
+ // NB: if XML validates, correct opening/closing is guaranteed and
+ // we do not have to check for $name == $curr_elem.
+ // we also checked for proper nesting at start of elements...
+ $curr_elem = array_shift($XML_RPC_xh[$parser]['stack']);
+
+ switch ($name) {
+ case 'STRUCT':
+ case 'ARRAY':
+ $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
+ $XML_RPC_xh[$parser]['value'] = $cur_val['value'];
+ $XML_RPC_xh[$parser]['vt'] = strtolower($name);
+ $XML_RPC_xh[$parser]['cm']--;
+ break;
+
+ case 'NAME':
+ $XML_RPC_xh[$parser]['valuestack'][0]['name'] = $XML_RPC_xh[$parser]['ac'];
+ break;
+
+ case 'BOOLEAN':
+ // special case here: we translate boolean 1 or 0 into PHP
+ // constants true or false
+ if ($XML_RPC_xh[$parser]['ac'] == '1') {
+ $XML_RPC_xh[$parser]['ac'] = 'true';
+ } else {
+ $XML_RPC_xh[$parser]['ac'] = 'false';
+ }
+
+ $XML_RPC_xh[$parser]['vt'] = strtolower($name);
+ // Drop through intentionally.
+
+ case 'I4':
+ case 'INT':
+ case 'STRING':
+ case 'DOUBLE':
+ case 'DATETIME.ISO8601':
+ case 'BASE64':
+ if ($XML_RPC_xh[$parser]['qt'] == 1) {
+ // we use double quotes rather than single so backslashification works OK
+ $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
+ } elseif ($XML_RPC_xh[$parser]['qt'] == 2) {
+ $XML_RPC_xh[$parser]['value'] = base64_decode($XML_RPC_xh[$parser]['ac']);
+ } elseif ($name == 'BOOLEAN') {
+ $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
+ } else {
+ // we have an I4, INT or a DOUBLE
+ // we must check that only 0123456789-.<space> are characters here
+ if (!preg_match("@^[+-]?[0123456789 \t\.]+$@", $XML_RPC_xh[$parser]['ac'])) {
+ XML_RPC_Base::raiseError(gettext('Non-numeric value received in INT or DOUBLE'),
+ XML_RPC_ERROR_NON_NUMERIC_FOUND);
+ $XML_RPC_xh[$parser]['value'] = XML_RPC_ERROR_NON_NUMERIC_FOUND;
+ } else {
+ // it's ok, add it on
+ $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
+ }
+ }
+
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = 0;
+ $XML_RPC_xh[$parser]['lv'] = 3; // indicate we've found a value
+ break;
+
+ case 'VALUE':
+ if ($XML_RPC_xh[$parser]['vt'] == $GLOBALS['XML_RPC_String']) {
+ if (strlen($XML_RPC_xh[$parser]['ac']) > 0) {
+ $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
+ } elseif ($XML_RPC_xh[$parser]['lv'] == 1) {
+ // The <value> element was empty.
+ $XML_RPC_xh[$parser]['value'] = '';
+ }
+ }
+
+ $temp = new XML_RPC_Value($XML_RPC_xh[$parser]['value'], $XML_RPC_xh[$parser]['vt']);
+
+ $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
+ if (is_array($cur_val)) {
+ if ($cur_val['members']==0) {
+ $cur_val['value'][] = $temp;
+ } else {
+ $XML_RPC_xh[$parser]['value'] = $temp;
+ }
+ array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
+ } else {
+ $XML_RPC_xh[$parser]['value'] = $temp;
+ }
+ break;
+
+ case 'MEMBER':
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = 0;
+
+ $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
+ if (is_array($cur_val)) {
+ if ($cur_val['members']==1) {
+ $cur_val['value'][$cur_val['name']] = $XML_RPC_xh[$parser]['value'];
+ }
+ array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
+ }
+ break;
+
+ case 'DATA':
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = 0;
+ break;
+
+ case 'PARAM':
+ $XML_RPC_xh[$parser]['params'][] = $XML_RPC_xh[$parser]['value'];
+ break;
+
+ case 'METHODNAME':
+ case 'RPCMETHODNAME':
+ $XML_RPC_xh[$parser]['method'] = preg_replace("@^[\n\r\t ]+@", '',
+ $XML_RPC_xh[$parser]['ac']);
+ break;
+ }
+
+ // if it's a valid type name, set the type
+ if (isset($GLOBALS['XML_RPC_Types'][strtolower($name)])) {
+ $XML_RPC_xh[$parser]['vt'] = strtolower($name);
+ }
+}
+
+/**
+ * Character data handler for the XML parser
+ *
+ * @return void
+ */
+function XML_RPC_cd($parser_resource, $data)
+{
+ global $XML_RPC_xh, $XML_RPC_backslash;
+
+ $parser = (int) $parser_resource;
+
+ if ($XML_RPC_xh[$parser]['lv'] != 3) {
+ // "lookforvalue==3" means that we've found an entire value
+ // and should discard any further character data
+
+ if ($XML_RPC_xh[$parser]['lv'] == 1) {
+ // if we've found text and we're just in a <value> then
+ // turn quoting on, as this will be a string
+ $XML_RPC_xh[$parser]['qt'] = 1;
+ // and say we've found a value
+ $XML_RPC_xh[$parser]['lv'] = 2;
+ }
+
+ // replace characters that eval would
+ // do special things with
+ if (!isset($XML_RPC_xh[$parser]['ac'])) {
+ $XML_RPC_xh[$parser]['ac'] = '';
+ }
+ $XML_RPC_xh[$parser]['ac'] .= $data;
+ }
+}
+
+/**
+ * The common methods and properties for all of the XML_RPC classes
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2010 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Base {
+
+ /**
+ * PEAR Error handling
+ *
+ * @return object PEAR_Error object
+ */
+ function raiseError($msg, $code)
+ {
+ include_once 'PEAR.inc';
+ if (is_object(@$this)) {
+ log_error(get_class($this) . ': ' . $msg . " {$code}");
+ return PEAR::raiseError(get_class($this) . ': ' . $msg, $code);
+ } else {
+ log_error("XML_RPC: " . ': ' . $msg . " {$code}");
+ return PEAR::raiseError('XML_RPC: ' . $msg, $code);
+ }
+ }
+
+ /**
+ * Tell whether something is a PEAR_Error object
+ *
+ * @param mixed $value the item to check
+ *
+ * @return bool whether $value is a PEAR_Error object or not
+ *
+ * @access public
+ */
+ function isError($value)
+ {
+ return is_a($value, 'PEAR_Error');
+ }
+}
+
+/**
+ * The methods and properties for submitting XML RPC requests
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2010 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Client extends XML_RPC_Base {
+
+ /**
+ * The path and name of the RPC server script you want the request to go to
+ * @var string
+ */
+ var $path = '';
+
+ /**
+ * The name of the remote server to connect to
+ * @var string
+ */
+ var $server = '';
+
+ /**
+ * The protocol to use in contacting the remote server
+ * @var string
+ */
+ var $protocol = 'http://';
+
+ /**
+ * The port for connecting to the remote server
+ *
+ * The default is 80 for http:// connections
+ * and 443 for https:// and ssl:// connections.
+ *
+ * @var integer
+ */
+ var $port = 80;
+
+ /**
+ * A user name for accessing the RPC server
+ * @var string
+ * @see XML_RPC_Client::setCredentials()
+ */
+ var $username = '';
+
+ /**
+ * A password for accessing the RPC server
+ * @var string
+ * @see XML_RPC_Client::setCredentials()
+ */
+ var $password = '';
+
+ /**
+ * The name of the proxy server to use, if any
+ * @var string
+ */
+ var $proxy = '';
+
+ /**
+ * The protocol to use in contacting the proxy server, if any
+ * @var string
+ */
+ var $proxy_protocol = 'http://';
+
+ /**
+ * The port for connecting to the proxy server
+ *
+ * The default is 8080 for http:// connections
+ * and 443 for https:// and ssl:// connections.
+ *
+ * @var integer
+ */
+ var $proxy_port = 8080;
+
+ /**
+ * A user name for accessing the proxy server
+ * @var string
+ */
+ var $proxy_user = '';
+
+ /**
+ * A password for accessing the proxy server
+ * @var string
+ */
+ var $proxy_pass = '';
+
+ /**
+ * The error number, if any
+ * @var integer
+ */
+ var $errno = 0;
+
+ /**
+ * The error message, if any
+ * @var string
+ */
+ var $errstr = '';
+
+ /**
+ * The current debug mode (1 = on, 0 = off)
+ * @var integer
+ */
+ var $debug = 0;
+
+ /**
+ * The HTTP headers for the current request.
+ * @var string
+ */
+ var $headers = '';
+
+
+ /**
+ * Sets the object's properties
+ *
+ * @param string $path the path and name of the RPC server script
+ * you want the request to go to
+ * @param string $server the URL of the remote server to connect to.
+ * If this parameter doesn't specify a
+ * protocol and $port is 443, ssl:// is
+ * assumed.
+ * @param integer $port a port for connecting to the remote server.
+ * Defaults to 80 for http:// connections and
+ * 443 for https:// and ssl:// connections.
+ * @param string $proxy the URL of the proxy server to use, if any.
+ * If this parameter doesn't specify a
+ * protocol and $port is 443, ssl:// is
+ * assumed.
+ * @param integer $proxy_port a port for connecting to the remote server.
+ * Defaults to 8080 for http:// connections and
+ * 443 for https:// and ssl:// connections.
+ * @param string $proxy_user a user name for accessing the proxy server
+ * @param string $proxy_pass a password for accessing the proxy server
+ *
+ * @return void
+ */
+ function XML_RPC_Client($path, $server, $port = 0,
+ $proxy = '', $proxy_port = 0,
+ $proxy_user = '', $proxy_pass = '')
+ {
+ $this->path = $path;
+ $this->proxy_user = $proxy_user;
+ $this->proxy_pass = $proxy_pass;
+
+ preg_match('@^(http://|https://|ssl://)?(.*)$@', $server, $match);
+ if ($match[1] == '') {
+ if ($port == 443) {
+ $this->server = $match[2];
+ $this->protocol = 'ssl://';
+ $this->port = 443;
+ } else {
+ $this->server = $match[2];
+ if ($port) {
+ $this->port = $port;
+ }
+ }
+ } elseif ($match[1] == 'http://') {
+ $this->server = $match[2];
+ if ($port) {
+ $this->port = $port;
+ }
+ } else {
+ $this->server = $match[2];
+ $this->protocol = 'ssl://';
+ if ($port) {
+ $this->port = $port;
+ } else {
+ $this->port = 443;
+ }
+ }
+
+ if ($proxy) {
+ preg_match('@^(http://|https://|ssl://)?(.*)$@', $proxy, $match);
+ if ($match[1] == '') {
+ if ($proxy_port == 443) {
+ $this->proxy = $match[2];
+ $this->proxy_protocol = 'ssl://';
+ $this->proxy_port = 443;
+ } else {
+ $this->proxy = $match[2];
+ if ($proxy_port) {
+ $this->proxy_port = $proxy_port;
+ }
+ }
+ } elseif ($match[1] == 'http://') {
+ $this->proxy = $match[2];
+ if ($proxy_port) {
+ $this->proxy_port = $proxy_port;
+ }
+ } else {
+ $this->proxy = $match[2];
+ $this->proxy_protocol = 'ssl://';
+ if ($proxy_port) {
+ $this->proxy_port = $proxy_port;
+ } else {
+ $this->proxy_port = 443;
+ }
+ }
+ }
+ }
+
+ /**
+ * Change the current debug mode
+ *
+ * @param int $in where 1 = on, 0 = off
+ *
+ * @return void
+ */
+ function setDebug($in)
+ {
+ if ($in) {
+ $this->debug = 1;
+ } else {
+ $this->debug = 0;
+ }
+ }
+
+ /**
+ * Sets whether strings that contain characters which may cause PHP's
+ * SAX-based XML parser to break should be automatically base64 encoded
+ *
+ * This is is a workaround for systems that don't have PHP's mbstring
+ * extension available.
+ *
+ * @param int $in where 1 = on, 0 = off
+ *
+ * @return void
+ */
+ function setAutoBase64($in)
+ {
+ if ($in) {
+ $GLOBALS['XML_RPC_auto_base64'] = true;
+ } else {
+ $GLOBALS['XML_RPC_auto_base64'] = false;
+ }
+ }
+
+ /**
+ * Set username and password properties for connecting to the RPC server
+ *
+ * @param string $u the user name
+ * @param string $p the password
+ *
+ * @return void
+ *
+ * @see XML_RPC_Client::$username, XML_RPC_Client::$password
+ */
+ function setCredentials($u, $p)
+ {
+ $this->username = $u;
+ $this->password = $p;
+ }
+
+ /**
+ * Transmit the RPC request via HTTP 1.0 protocol
+ *
+ * @param object $msg the XML_RPC_Message object
+ * @param int $timeout how many seconds to wait for the request
+ *
+ * @return object an XML_RPC_Response object. 0 is returned if any
+ * problems happen.
+ *
+ * @see XML_RPC_Message, XML_RPC_Client::XML_RPC_Client(),
+ * XML_RPC_Client::setCredentials()
+ */
+ function send($msg, $timeout = 0)
+ {
+ if (!is_a($msg, 'XML_RPC_Message')) {
+ $this->errstr = sprintf(
+ gettext(
+ "send()'s %s parameter must be an XML_RPC_Message object."
+ ), $msg);
+ $this->raiseError($this->errstr, XML_RPC_ERROR_PROGRAMMING);
+ return 0;
+ }
+ $msg->debug = $this->debug;
+ return $this->sendPayloadHTTP10($msg, $this->server, $this->port,
+ $timeout, $this->username,
+ $this->password);
+ }
+
+ /**
+ * Transmit the RPC request via HTTP 1.0 protocol
+ *
+ * Requests should be sent using XML_RPC_Client send() rather than
+ * calling this method directly.
+ *
+ * @param object $msg the XML_RPC_Message object
+ * @param string $server the server to send the request to
+ * @param int $port the server port send the request to
+ * @param int $timeout how many seconds to wait for the request
+ * before giving up
+ * @param string $username a user name for accessing the RPC server
+ * @param string $password a password for accessing the RPC server
+ *
+ * @return object an XML_RPC_Response object. 0 is returned if any
+ * problems happen.
+ *
+ * @access protected
+ * @see XML_RPC_Client::send()
+ */
+ function sendPayloadHTTP10($msg, $server, $port, $timeout = 0,
+ $username = '', $password = '')
+ {
+ // Pre-emptive BC hacks for fools calling sendPayloadHTTP10() directly
+ if ($username != $this->username) {
+ $this->setCredentials($username, $password);
+ }
+
+ // Only create the payload if it was not created previously
+ if (empty($msg->payload)) {
+ $msg->createPayload();
+ }
+ $this->createHeaders($msg);
+
+ $op = $this->headers . "\r\n\r\n";
+ $op .= $msg->payload;
+
+ if ($this->debug) {
+ print "\n<pre>---SENT---\n";
+ print $op;
+ print "\n---END---</pre>\n";
+ }
+
+ /*
+ * If we're using a proxy open a socket to the proxy server
+ * instead to the xml-rpc server
+ */
+ if ($this->proxy) {
+ if ($this->proxy_protocol == 'http://') {
+ $protocol = '';
+ } else {
+ $protocol = $this->proxy_protocol;
+ }
+ if ($timeout > 0) {
+ $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
+ $this->errno, $this->errstr, $timeout);
+ } else {
+ $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
+ $this->errno, $this->errstr);
+ }
+ } else {
+ if ($this->protocol == 'http://') {
+ $protocol = '';
+ } else {
+ $protocol = $this->protocol;
+ }
+ if ($timeout > 0) {
+ $fp = @fsockopen($protocol . $server, $port,
+ $this->errno, $this->errstr, $timeout);
+ } else {
+ $fp = @fsockopen($protocol . $server, $port,
+ $this->errno, $this->errstr);
+ }
+ }
+
+ /*
+ * Just raising the error without returning it is strange,
+ * but keep it here for backwards compatibility.
+ */
+ if (!$fp && $this->proxy) {
+ $this->raiseError(sprintf(gettext('Connection to proxy server
+ %1$s:%2$s failed. %3$s')
+ ,$this->proxy,$this->proxy_port,$this->errstr),
+ XML_RPC_ERROR_CONNECTION_FAILED);
+ return 0;
+ } elseif (!$fp) {
+ $this->raiseError(sprintf(gettext('Connection to RPC server
+ %1$s:%2$s failed. %3$s')
+ ,$server,$port,$this->errstr),
+ XML_RPC_ERROR_CONNECTION_FAILED);
+ return 0;
+ }
+
+ if ($timeout) {
+ /*
+ * Using socket_set_timeout() because stream_set_timeout()
+ * was introduced in 4.3.0, but we need to support 4.2.0.
+ */
+ socket_set_timeout($fp, $timeout);
+ }
+
+ if (!fputs($fp, $op, strlen($op))) {
+ $this->errstr = 'Write error';
+ return 0;
+ }
+ $resp = $msg->parseResponseFile($fp);
+
+ $meta = socket_get_status($fp);
+ if ($meta['timed_out']) {
+ fclose($fp);
+ $this->errstr = 'RPC server did not send response before timeout.';
+ $this->raiseError($this->errstr, XML_RPC_ERROR_CONNECTION_FAILED);
+ return 0;
+ }
+
+ fclose($fp);
+ return $resp;
+ }
+
+ /**
+ * Determines the HTTP headers and puts it in the $headers property
+ *
+ * @param object $msg the XML_RPC_Message object
+ *
+ * @return boolean TRUE if okay, FALSE if the message payload isn't set.
+ *
+ * @access protected
+ */
+ function createHeaders($msg)
+ {
+ if (empty($msg->payload)) {
+ return false;
+ }
+ if ($this->proxy) {
+ $this->headers = 'POST ' . ($this->protocol=='ssl://'?'https://':$this->protocol). $this->server;
+ if ($this->proxy_port) {
+ $this->headers .= ':' . $this->port;
+ }
+ } else {
+ $this->headers = 'POST ';
+ }
+ $this->headers .= $this->path. " HTTP/1.0\r\n";
+
+ $this->headers .= "User-Agent: PEAR XML_RPC\r\n";
+ $this->headers .= 'Host: ' . $this->server . "\r\n";
+
+ if ($this->proxy && $this->proxy_user) {
+ $this->headers .= 'Proxy-Authorization: Basic '
+ . base64_encode("$this->proxy_user:$this->proxy_pass")
+ . "\r\n";
+ }
+
+ // thanks to Grant Rauscher <grant7@firstworld.net> for this
+ if ($this->username) {
+ $this->headers .= 'Authorization: Basic '
+ . base64_encode("$this->username:$this->password")
+ . "\r\n";
+ }
+
+ $this->headers .= "Content-Type: text/xml\r\n";
+ $this->headers .= 'Content-Length: ' . strlen($msg->payload);
+ return true;
+ }
+}
+
+/**
+ * The methods and properties for interpreting responses to XML RPC requests
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2010 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Response extends XML_RPC_Base
+{
+ var $xv;
+ var $fn;
+ var $fs;
+ var $hdrs;
+
+ /**
+ * @return void
+ */
+ function XML_RPC_Response($val, $fcode = 0, $fstr = '')
+ {
+ if ($fcode != 0) {
+ $this->fn = $fcode;
+ $this->fs = htmlspecialchars($fstr);
+ } else {
+ $this->xv = $val;
+ }
+ }
+
+ /**
+ * @return int the error code
+ */
+ function faultCode()
+ {
+ if (isset($this->fn)) {
+ return $this->fn;
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * @return string the error string
+ */
+ function faultString()
+ {
+ return $this->fs;
+ }
+
+ /**
+ * @return mixed the value
+ */
+ function value()
+ {
+ return $this->xv;
+ }
+
+ /**
+ * @return string the error message in XML format
+ */
+ function serialize()
+ {
+ $rs = "<methodResponse>\n";
+ if ($this->fn) {
+ $rs .= "<fault>
+ <value>
+ <struct>
+ <member>
+ <name>faultCode</name>
+ <value><int>" . $this->fn . "</int></value>
+ </member>
+ <member>
+ <name>faultString</name>
+ <value><string>" . $this->fs . "</string></value>
+ </member>
+ </struct>
+ </value>
+</fault>";
+ } else {
+ $rs .= "<params>\n<param>\n" . $this->xv->serialize() .
+ "</param>\n</params>";
+ }
+ $rs .= "\n</methodResponse>";
+ return $rs;
+ }
+}
+
+/**
+ * The methods and properties for composing XML RPC messages
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2010 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Message extends XML_RPC_Base
+{
+ /**
+ * Should the payload's content be passed through mb_convert_encoding()?
+ *
+ * @see XML_RPC_Message::setConvertPayloadEncoding()
+ * @since Property available since Release 1.5.1
+ * @var boolean
+ */
+ var $convert_payload_encoding = false;
+
+ /**
+ * The current debug mode (1 = on, 0 = off)
+ * @var integer
+ */
+ var $debug = 0;
+
+ /**
+ * The encoding to be used for outgoing messages
+ *
+ * Defaults to the value of <var>$GLOBALS['XML_RPC_defencoding']</var>
+ *
+ * @var string
+ * @see XML_RPC_Message::setSendEncoding(),
+ * $GLOBALS['XML_RPC_defencoding'], XML_RPC_Message::xml_header()
+ */
+ var $send_encoding = '';
+
+ /**
+ * The method presently being evaluated
+ * @var string
+ */
+ var $methodname = '';
+
+ /**
+ * @var array
+ */
+ var $params = array();
+
+ /**
+ * The XML message being generated
+ * @var string
+ */
+ var $payload = '';
+
+ /**
+ * Should extra line breaks be removed from the payload?
+ * @since Property available since Release 1.4.6
+ * @var boolean
+ */
+ var $remove_extra_lines = true;
+
+ /**
+ * The XML response from the remote server
+ * @since Property available since Release 1.4.6
+ * @var string
+ */
+ var $response_payload = '';
+
+
+ /**
+ * @return void
+ */
+ function XML_RPC_Message($meth, $pars = 0)
+ {
+ $this->methodname = $meth;
+ if (is_array($pars) && sizeof($pars) > 0) {
+ for ($i = 0; $i < sizeof($pars); $i++) {
+ $this->addParam($pars[$i]);
+ }
+ }
+ }
+
+ /**
+ * Produces the XML declaration including the encoding attribute
+ *
+ * The encoding is determined by this class' <var>$send_encoding</var>
+ * property. If the <var>$send_encoding</var> property is not set, use
+ * <var>$GLOBALS['XML_RPC_defencoding']</var>.
+ *
+ * @return string the XML declaration and <methodCall> element
+ *
+ * @see XML_RPC_Message::setSendEncoding(),
+ * XML_RPC_Message::$send_encoding, $GLOBALS['XML_RPC_defencoding']
+ */
+ function xml_header()
+ {
+ global $XML_RPC_defencoding;
+
+ if (!$this->send_encoding) {
+ $this->send_encoding = $XML_RPC_defencoding;
+ }
+ return '<?xml version="1.0" encoding="' . $this->send_encoding . '"?>'
+ . "\n<methodCall>\n";
+ }
+
+ /**
+ * @return string the closing </methodCall> tag
+ */
+ function xml_footer()
+ {
+ return "</methodCall>\n";
+ }
+
+ /**
+ * Fills the XML_RPC_Message::$payload property
+ *
+ * Part of the process makes sure all line endings are in DOS format
+ * (CRLF), which is probably required by specifications.
+ *
+ * If XML_RPC_Message::setConvertPayloadEncoding() was set to true,
+ * the payload gets passed through mb_convert_encoding()
+ * to ensure the payload matches the encoding set in the
+ * XML declaration. The encoding type can be manually set via
+ * XML_RPC_Message::setSendEncoding().
+ *
+ * @return void
+ *
+ * @uses XML_RPC_Message::xml_header(), XML_RPC_Message::xml_footer()
+ * @see XML_RPC_Message::setSendEncoding(), $GLOBALS['XML_RPC_defencoding'],
+ * XML_RPC_Message::setConvertPayloadEncoding()
+ */
+ function createPayload()
+ {
+ $this->payload = $this->xml_header();
+ $this->payload .= '<methodName>' . $this->methodname . "</methodName>\n";
+ $this->payload .= "<params>\n";
+ for ($i = 0; $i < sizeof($this->params); $i++) {
+ $p = $this->params[$i];
+ $this->payload .= "<param>\n" . $p->serialize() . "</param>\n";
+ }
+ $this->payload .= "</params>\n";
+ $this->payload .= $this->xml_footer();
+ if ($this->remove_extra_lines) {
+ $this->payload = preg_replace("@[\r\n]+@", "\r\n", $this->payload);
+ } else {
+ $this->payload = preg_replace("@\r\n|\n|\r|\n\r@", "\r\n", $this->payload);
+ }
+ if ($this->convert_payload_encoding) {
+ $this->payload = mb_convert_encoding($this->payload, $this->send_encoding);
+ }
+ }
+
+ /**
+ * @return string the name of the method
+ */
+ function method($meth = '')
+ {
+ if ($meth != '') {
+ $this->methodname = $meth;
+ }
+ return $this->methodname;
+ }
+
+ /**
+ * @return string the payload
+ */
+ function serialize()
+ {
+ $this->createPayload();
+ return $this->payload;
+ }
+
+ /**
+ * @return void
+ */
+ function addParam($par)
+ {
+ $this->params[] = $par;
+ }
+
+ /**
+ * Obtains an XML_RPC_Value object for the given parameter
+ *
+ * @param int $i the index number of the parameter to obtain
+ *
+ * @return object the XML_RPC_Value object.
+ * If the parameter doesn't exist, an XML_RPC_Response object.
+ *
+ * @since Returns XML_RPC_Response object on error since Release 1.3.0
+ */
+ function getParam($i)
+ {
+ global $XML_RPC_err, $XML_RPC_str;
+
+ if (isset($this->params[$i])) {
+ return $this->params[$i];
+ } else {
+ $this->raiseError(gettext('The submitted request did not contain this parameter'),
+ XML_RPC_ERROR_INCORRECT_PARAMS);
+ return new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
+ $XML_RPC_str['incorrect_params']);
+ }
+ }
+
+ /**
+ * @return int the number of parameters
+ */
+ function getNumParams()
+ {
+ return sizeof($this->params);
+ }
+
+ /**
+ * Sets whether the payload's content gets passed through
+ * mb_convert_encoding()
+ *
+ * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
+ *
+ * @param int $in where 1 = on, 0 = off
+ *
+ * @return void
+ *
+ * @see XML_RPC_Message::setSendEncoding()
+ * @since Method available since Release 1.5.1
+ */
+ function setConvertPayloadEncoding($in)
+ {
+ if ($in && !function_exists('mb_convert_encoding')) {
+ return $this->raiseError(gettext('mb_convert_encoding() is not available'),
+ XML_RPC_ERROR_PROGRAMMING);
+ }
+ $this->convert_payload_encoding = $in;
+ }
+
+ /**
+ * Sets the XML declaration's encoding attribute
+ *
+ * @param string $type the encoding type (ISO-8859-1, UTF-8 or US-ASCII)
+ *
+ * @return void
+ *
+ * @see XML_RPC_Message::setConvertPayloadEncoding(), XML_RPC_Message::xml_header()
+ * @since Method available since Release 1.2.0
+ */
+ function setSendEncoding($type)
+ {
+ $this->send_encoding = $type;
+ }
+
+ /**
+ * Determine the XML's encoding via the encoding attribute
+ * in the XML declaration
+ *
+ * If the encoding parameter is not set or is not ISO-8859-1, UTF-8
+ * or US-ASCII, $XML_RPC_defencoding will be returned.
+ *
+ * @param string $data the XML that will be parsed
+ *
+ * @return string the encoding to be used
+ *
+ * @link http://php.net/xml_parser_create
+ * @since Method available since Release 1.2.0
+ */
+ function getEncoding($data)
+ {
+ global $XML_RPC_defencoding;
+
+ if (preg_match('@<\?xml[^>]*\s*encoding\s*=\s*[\'"]([^"\']*)[\'"]@',
+ $data, $match))
+ {
+ $match[1] = trim(strtoupper($match[1]));
+ switch ($match[1]) {
+ case 'ISO-8859-1':
+ case 'UTF-8':
+ case 'US-ASCII':
+ return $match[1];
+ break;
+
+ default:
+ return $XML_RPC_defencoding;
+ }
+ } else {
+ return $XML_RPC_defencoding;
+ }
+ }
+
+ /**
+ * @return object a new XML_RPC_Response object
+ */
+ function parseResponseFile($fp)
+ {
+ $ipd = '';
+ while ($data = @fread($fp, 8192)) {
+ $ipd .= $data;
+ }
+ return $this->parseResponse($ipd);
+ }
+
+ /**
+ * @return object a new XML_RPC_Response object
+ */
+ function parseResponse($data = '')
+ {
+ global $XML_RPC_xh, $XML_RPC_err, $XML_RPC_str, $XML_RPC_defencoding;
+
+ $encoding = $this->getEncoding($data);
+ $parser_resource = xml_parser_create($encoding);
+ $parser = (int) $parser_resource;
+
+ $XML_RPC_xh = array();
+ $XML_RPC_xh[$parser] = array();
+
+ $XML_RPC_xh[$parser]['cm'] = 0;
+ $XML_RPC_xh[$parser]['isf'] = 0;
+ $XML_RPC_xh[$parser]['ac'] = '';
+ $XML_RPC_xh[$parser]['qt'] = '';
+ $XML_RPC_xh[$parser]['stack'] = array();
+ $XML_RPC_xh[$parser]['valuestack'] = array();
+
+ xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
+ xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
+ xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');
+
+ $hdrfnd = 0;
+ if ($this->debug) {
+ print "\n<pre>---GOT---\n";
+ print isset($_SERVER['SERVER_PROTOCOL']) ? htmlspecialchars($data) : $data;
+ print "\n---END---</pre>\n";
+ }
+
+ // See if response is a 200 or a 100 then a 200, else raise error.
+ // But only do this if we're using the HTTP protocol.
+ if (preg_match('@^HTTP@', $data) &&
+ !preg_match('@^HTTP/[0-9\.]+ 200 @', $data) &&
+ !preg_match('@^HTTP/[0-9\.]+ 10[0-9]([A-Z ]+)?[\r\n]+HTTP/[0-9\.]+ 200@', $data))
+ {
+ $errstr = substr($data, 0, strpos($data, "\n") - 1);
+ error_log(sprintf(gettext("HTTP error, got response: %s"),$errstr));
+ $r = new XML_RPC_Response(0, $XML_RPC_err['http_error'],
+ $XML_RPC_str['http_error'] . ' (' .
+ $errstr . ')');
+ xml_parser_free($parser_resource);
+ return $r;
+ }
+
+ // gotta get rid of headers here
+ if (!$hdrfnd && ($brpos = strpos($data,"\r\n\r\n"))) {
+ $XML_RPC_xh[$parser]['ha'] = substr($data, 0, $brpos);
+ $data = substr($data, $brpos + 4);
+ $hdrfnd = 1;
+ }
+
+ /*
+ * be tolerant of junk after methodResponse
+ * (e.g. javascript automatically inserted by free hosts)
+ * thanks to Luca Mariano <luca.mariano@email.it>
+ */
+ $data = substr($data, 0, strpos($data, "</methodResponse>") + 17);
+ $this->response_payload = $data;
+
+ if (!xml_parse($parser_resource, $data, sizeof($data))) {
+ // thanks to Peter Kocks <peter.kocks@baygate.com>
+ if (xml_get_current_line_number($parser_resource) == 1) {
+ /* We already error on this in the GUI, no need to log it and cause a PHP error. */
+ //$errstr = gettext("XML error at line 1, check URL");
+ } else {
+ $errstr = sprintf('XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($parser_resource)),
+ xml_get_current_line_number($parser_resource));
+ }
+ if (!empty($errstr))
+ error_log($errstr);
+ $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
+ $XML_RPC_str['invalid_return']);
+ xml_parser_free($parser_resource);
+ return $r;
+ }
+
+ xml_parser_free($parser_resource);
+
+ if ($this->debug) {
+ print "\n<pre>---PARSED---\n";
+ var_dump($XML_RPC_xh[$parser]['value']);
+ print "---END---</pre>\n";
+ }
+
+ if ($XML_RPC_xh[$parser]['isf'] > 1) {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
+ $XML_RPC_str['invalid_return'].' '.$XML_RPC_xh[$parser]['isf_reason']);
+ } elseif (!is_object($XML_RPC_xh[$parser]['value'])) {
+ // then something odd has happened
+ // and it's time to generate a client side error
+ // indicating something odd went on
+ $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
+ $XML_RPC_str['invalid_return']);
+ } else {
+ $v = $XML_RPC_xh[$parser]['value'];
+ if ($XML_RPC_xh[$parser]['isf']) {
+ $f = $v->structmem('faultCode');
+ $fs = $v->structmem('faultString');
+ $r = new XML_RPC_Response($v, $f->scalarval(),
+ $fs->scalarval());
+ } else {
+ $r = new XML_RPC_Response($v);
+ }
+ }
+ $r->hdrs = preg_split("@\r?\n@", $XML_RPC_xh[$parser]['ha'][1]);
+ return $r;
+ }
+}
+
+/**
+ * The methods and properties that represent data in XML RPC format
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2010 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Value extends XML_RPC_Base
+{
+ var $me = array();
+ var $mytype = 0;
+
+ /**
+ * @return void
+ */
+ function XML_RPC_Value($val = -1, $type = '')
+ {
+ $this->me = array();
+ $this->mytype = 0;
+ if ($val != -1 || $type != '') {
+ if ($type == '') {
+ $type = 'string';
+ }
+ if (!array_key_exists($type, $GLOBALS['XML_RPC_Types'])) {
+ // XXX
+ // need some way to report this error
+ } elseif ($GLOBALS['XML_RPC_Types'][$type] == 1) {
+ $this->addScalar($val, $type);
+ } elseif ($GLOBALS['XML_RPC_Types'][$type] == 2) {
+ $this->addArray($val);
+ } elseif ($GLOBALS['XML_RPC_Types'][$type] == 3) {
+ $this->addStruct($val);
+ }
+ }
+ }
+
+ /**
+ * @return int returns 1 if successful or 0 if there are problems
+ */
+ function addScalar($val, $type = 'string')
+ {
+ if ($this->mytype == 1) {
+ $this->raiseError(gettext('Scalar can have only one value'),
+ XML_RPC_ERROR_INVALID_TYPE);
+ return 0;
+ }
+ $typeof = $GLOBALS['XML_RPC_Types'][$type];
+ if ($typeof != 1) {
+ $this->raiseError(
+ sprintf(gettext("Not a scalar type (%s)"), $typeof),
+ XML_RPC_ERROR_INVALID_TYPE);
+ return 0;
+ }
+
+ if ($type == $GLOBALS['XML_RPC_Boolean']) {
+ if (strcasecmp($val, 'true') == 0
+ || $val == 1
+ || ($val == true && strcasecmp($val, 'false')))
+ {
+ $val = 1;
+ } else {
+ $val = 0;
+ }
+ }
+
+ if ($this->mytype == 2) {
+ // we're adding to an array here
+ $ar = $this->me['array'];
+ $ar[] = new XML_RPC_Value($val, $type);
+ $this->me['array'] = $ar;
+ } else {
+ // a scalar, so set the value and remember we're scalar
+ $this->me[$type] = $val;
+ $this->mytype = $typeof;
+ }
+ return 1;
+ }
+
+ /**
+ * @return int returns 1 if successful or 0 if there are problems
+ */
+ function addArray($vals)
+ {
+ if ($this->mytype != 0) {
+ $this->raiseError(
+ sprintf(gettext('Already initialized as a [%s]'), $this->kindOf()),
+ XML_RPC_ERROR_ALREADY_INITIALIZED);
+ return 0;
+ }
+ $this->mytype = $GLOBALS['XML_RPC_Types']['array'];
+ $this->me['array'] = $vals;
+ return 1;
+ }
+
+ /**
+ * @return int returns 1 if successful or 0 if there are problems
+ */
+ function addStruct($vals)
+ {
+ if ($this->mytype != 0) {
+ $this->raiseError(
+ sprintf(gettext('Already initialized as a [%s]'), $this->kindOf()),
+ XML_RPC_ERROR_ALREADY_INITIALIZED);
+ return 0;
+ }
+ $this->mytype = $GLOBALS['XML_RPC_Types']['struct'];
+ $this->me['struct'] = $vals;
+ return 1;
+ }
+
+ /**
+ * @return void
+ */
+ function dump($ar)
+ {
+ reset($ar);
+ foreach ($ar as $key => $val) {
+ echo "$key => $val<br />";
+ if ($key == 'array') {
+ foreach ($val as $key2 => $val2) {
+ echo "-- $key2 => $val2<br />";
+ }
+ }
+ }
+ }
+
+ /**
+ * @return string the data type of the current value
+ */
+ function kindOf()
+ {
+ switch ($this->mytype) {
+ case 3:
+ return 'struct';
+
+ case 2:
+ return 'array';
+
+ case 1:
+ return 'scalar';
+
+ default:
+ return 'undef';
+ }
+ }
+
+ /**
+ * @return string the data in XML format
+ */
+ function serializedata($typ, $val)
+ {
+ $rs = '';
+ if (!array_key_exists($typ, $GLOBALS['XML_RPC_Types'])) {
+ // XXX
+ // need some way to report this error
+ return;
+ }
+ switch ($GLOBALS['XML_RPC_Types'][$typ]) {
+ case 3:
+ // struct
+ $rs .= "<struct>\n";
+ reset($val);
+ foreach ($val as $key2 => $val2) {
+ $rs .= "<member><name>" . htmlspecialchars($key2) . "</name>\n";
+ $rs .= $this->serializeval($val2);
+ $rs .= "</member>\n";
+ }
+ $rs .= '</struct>';
+ break;
+
+ case 2:
+ // array
+ $rs .= "<array>\n<data>\n";
+ foreach ($val as $value) {
+ $rs .= $this->serializeval($value);
+ }
+ $rs .= "</data>\n</array>";
+ break;
+
+ case 1:
+ switch ($typ) {
+ case $GLOBALS['XML_RPC_Base64']:
+ $rs .= "<${typ}>" . base64_encode($val) . "</${typ}>";
+ break;
+ case $GLOBALS['XML_RPC_Boolean']:
+ $rs .= "<${typ}>" . ($val ? '1' : '0') . "</${typ}>";
+ break;
+ case $GLOBALS['XML_RPC_String']:
+ $rs .= "<${typ}>" . htmlspecialchars($val). "</${typ}>";
+ break;
+ default:
+ $rs .= "<${typ}>${val}</${typ}>";
+ }
+ }
+ return $rs;
+ }
+
+ /**
+ * @return string the data in XML format
+ */
+ function serialize()
+ {
+ return $this->serializeval($this);
+ }
+
+ /**
+ * @return string the data in XML format
+ */
+ function serializeval($o)
+ {
+ if (!is_object($o) || empty($o->me) || !is_array($o->me)) {
+ return '';
+ }
+ $ar = $o->me;
+ reset($ar);
+ list($typ, $val) = each($ar);
+ return '<value>' . $this->serializedata($typ, $val) . "</value>\n";
+ }
+
+ /**
+ * @return mixed the contents of the element requested
+ */
+ function structmem($m)
+ {
+ return $this->me['struct'][$m];
+ }
+
+ /**
+ * @return void
+ */
+ function structreset()
+ {
+ reset($this->me['struct']);
+ }
+
+ /**
+ * @return the key/value pair of the struct's current element
+ */
+ function structeach()
+ {
+ return each($this->me['struct']);
+ }
+
+ /**
+ * @return mixed the current value
+ */
+ function getval()
+ {
+ // UNSTABLE
+
+ reset($this->me);
+ $b = current($this->me);
+
+ // contributed by I Sofer, 2001-03-24
+ // add support for nested arrays to scalarval
+ // i've created a new method here, so as to
+ // preserve back compatibility
+
+ if (is_array($b)) {
+ foreach ($b as $id => $cont) {
+ $b[$id] = $cont->scalarval();
+ }
+ }
+
+ // add support for structures directly encoding php objects
+ if (is_object($b)) {
+ $t = get_object_vars($b);
+ foreach ($t as $id => $cont) {
+ $t[$id] = $cont->scalarval();
+ }
+ foreach ($t as $id => $cont) {
+ $b->$id = $cont;
+ }
+ }
+
+ // end contrib
+ return $b;
+ }
+
+ /**
+ * @return mixed the current element's scalar value. If the value is
+ * not scalar, FALSE is returned.
+ */
+ function scalarval()
+ {
+ reset($this->me);
+ $v = current($this->me);
+ if (!is_scalar($v)) {
+ $v = false;
+ }
+ return $v;
+ }
+
+ /**
+ * @return string
+ */
+ function scalartyp()
+ {
+ reset($this->me);
+ $a = key($this->me);
+ if ($a == $GLOBALS['XML_RPC_I4']) {
+ $a = $GLOBALS['XML_RPC_Int'];
+ }
+ return $a;
+ }
+
+ /**
+ * @return mixed the struct's current element
+ */
+ function arraymem($m)
+ {
+ return $this->me['array'][$m];
+ }
+
+ /**
+ * @return int the number of elements in the array
+ */
+ function arraysize()
+ {
+ reset($this->me);
+ list($a, $b) = each($this->me);
+ return sizeof($b);
+ }
+
+ /**
+ * Determines if the item submitted is an XML_RPC_Value object
+ *
+ * @param mixed $val the variable to be evaluated
+ *
+ * @return bool TRUE if the item is an XML_RPC_Value object
+ *
+ * @static
+ * @since Method available since Release 1.3.0
+ */
+ function isValue($val)
+ {
+ return (strtolower(get_class($val)) == 'xml_rpc_value');
+ }
+}
+
+/**
+ * Return an ISO8601 encoded string
+ *
+ * While timezones ought to be supported, the XML-RPC spec says:
+ *
+ * "Don't assume a timezone. It should be specified by the server in its
+ * documentation what assumptions it makes about timezones."
+ *
+ * This routine always assumes localtime unless $utc is set to 1, in which
+ * case UTC is assumed and an adjustment for locale is made when encoding.
+ *
+ * @return string the formatted date
+ */
+function XML_RPC_iso8601_encode($timet, $utc = 0)
+{
+ if (!$utc) {
+ $t = strftime('%Y%m%dT%H:%M:%S', $timet);
+ } else {
+ if (function_exists('gmstrftime')) {
+ // gmstrftime doesn't exist in some versions
+ // of PHP
+ $t = gmstrftime('%Y%m%dT%H:%M:%S', $timet);
+ } else {
+ $t = strftime('%Y%m%dT%H:%M:%S', $timet - date('Z'));
+ }
+ }
+ return $t;
+}
+
+/**
+ * Convert a datetime string into a Unix timestamp
+ *
+ * While timezones ought to be supported, the XML-RPC spec says:
+ *
+ * "Don't assume a timezone. It should be specified by the server in its
+ * documentation what assumptions it makes about timezones."
+ *
+ * This routine always assumes localtime unless $utc is set to 1, in which
+ * case UTC is assumed and an adjustment for locale is made when encoding.
+ *
+ * @return int the unix timestamp of the date submitted
+ */
+function XML_RPC_iso8601_decode($idate, $utc = 0)
+{
+ $t = 0;
+ if (preg_match('@([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})@', $idate, $regs)) {
+ if ($utc) {
+ $t = gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
+ } else {
+ $t = mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
+ }
+ }
+ return $t;
+}
+
+/**
+ * Converts an XML_RPC_Value object into native PHP types
+ *
+ * @param object $XML_RPC_val the XML_RPC_Value object to decode
+ *
+ * @return mixed the PHP values
+ */
+function XML_RPC_decode($XML_RPC_val)
+{
+ $kind = $XML_RPC_val->kindOf();
+
+ if ($kind == 'scalar') {
+ return $XML_RPC_val->scalarval();
+
+ } elseif ($kind == 'array') {
+ $size = $XML_RPC_val->arraysize();
+ $arr = array();
+ for ($i = 0; $i < $size; $i++) {
+ $arr[] = XML_RPC_decode($XML_RPC_val->arraymem($i));
+ }
+ return $arr;
+
+ } elseif ($kind == 'struct') {
+ $XML_RPC_val->structreset();
+ $arr = array();
+ while (list($key, $value) = $XML_RPC_val->structeach()) {
+ $arr[$key] = XML_RPC_decode($value);
+ }
+ return $arr;
+ }
+}
+
+/**
+ * Converts native PHP types into an XML_RPC_Value object
+ *
+ * @param mixed $php_val the PHP value or variable you want encoded
+ *
+ * @return object the XML_RPC_Value object
+ */
+function XML_RPC_encode($php_val)
+{
+ $type = gettype($php_val);
+ $XML_RPC_val = new XML_RPC_Value;
+
+ switch ($type) {
+ case 'array':
+ if (empty($php_val)) {
+ $XML_RPC_val->addArray($php_val);
+ break;
+ }
+ $tmp = array_diff(array_keys($php_val), range(0, count($php_val)-1));
+ if (empty($tmp)) {
+ $arr = array();
+ foreach ($php_val as $k => $v) {
+ $arr[$k] = XML_RPC_encode($v);
+ }
+ $XML_RPC_val->addArray($arr);
+ break;
+ }
+ // fall though if it's not an enumerated array
+
+ case 'object':
+ $arr = array();
+ foreach ($php_val as $k => $v) {
+ $arr[$k] = XML_RPC_encode($v);
+ }
+ $XML_RPC_val->addStruct($arr);
+ break;
+
+ case 'integer':
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Int']);
+ break;
+
+ case 'double':
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Double']);
+ break;
+
+ case 'string':
+ case 'NULL':
+ if (preg_match('@^[0-9]{8}\T{1}[0-9]{2}\:[0-9]{2}\:[0-9]{2}$@', $php_val)) {
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_DateTime']);
+ } elseif ($GLOBALS['XML_RPC_auto_base64']
+ && preg_match("@[^ -~\t\r\n]@", $php_val))
+ {
+ // Characters other than alpha-numeric, punctuation, SP, TAB,
+ // LF and CR break the XML parser, encode value via Base 64.
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Base64']);
+ } else {
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_String']);
+ }
+ break;
+
+ case 'boolean':
+ // Add support for encoding/decoding of booleans, since they
+ // are supported in PHP
+ // by <G_Giunta_2001-02-29>
+ $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Boolean']);
+ break;
+
+ case 'unknown type':
+ default:
+ $XML_RPC_val = false;
+ }
+ return $XML_RPC_val;
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+
+?>
diff --git a/src/etc/inc/xmlrpc_server.inc b/src/etc/inc/xmlrpc_server.inc
new file mode 100644
index 0000000..f4d8a46
--- /dev/null
+++ b/src/etc/inc/xmlrpc_server.inc
@@ -0,0 +1,678 @@
+<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Server commands for our PHP implementation of the XML-RPC protocol
+ *
+ * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
+ * It has support for HTTP transport, proxies and authentication.
+ *
+ * PHP versions 4 and 5
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2010 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version SVN: $Id: Server.php 300961 2010-07-03 02:17:34Z danielc $
+ * @link http://pear.php.net/package/XML_RPC
+ */
+
+
+/**
+ * Pull in the XML_RPC class
+ */
+require_once 'xmlrpc_client.inc';
+
+
+/**
+ * signature for system.listMethods: return = array,
+ * parameters = a string or nothing
+ * @global array $GLOBALS['XML_RPC_Server_listMethods_sig']
+ */
+$GLOBALS['XML_RPC_Server_listMethods_sig'] = array(
+ array($GLOBALS['XML_RPC_Array'],
+ $GLOBALS['XML_RPC_String']
+ ),
+ array($GLOBALS['XML_RPC_Array'])
+);
+
+/**
+ * docstring for system.listMethods
+ * @global string $GLOBALS['XML_RPC_Server_listMethods_doc']
+ */
+$GLOBALS['XML_RPC_Server_listMethods_doc'] = gettext('This method lists all the'
+ . ' methods that the XML-RPC server knows how to dispatch');
+
+/**
+ * signature for system.methodSignature: return = array,
+ * parameters = string
+ * @global array $GLOBALS['XML_RPC_Server_methodSignature_sig']
+ */
+$GLOBALS['XML_RPC_Server_methodSignature_sig'] = array(
+ array($GLOBALS['XML_RPC_Array'],
+ $GLOBALS['XML_RPC_String']
+ )
+);
+
+/**
+ * docstring for system.methodSignature
+ * @global string $GLOBALS['XML_RPC_Server_methodSignature_doc']
+ */
+$GLOBALS['XML_RPC_Server_methodSignature_doc'] = gettext('Returns an array of known'
+ . ' signatures (an array of arrays) for the method name passed. If'
+ . ' no signatures are known, returns a none-array (test for type !='
+ . ' array to detect missing signature)');
+
+/**
+ * signature for system.methodHelp: return = string,
+ * parameters = string
+ * @global array $GLOBALS['XML_RPC_Server_methodHelp_sig']
+ */
+$GLOBALS['XML_RPC_Server_methodHelp_sig'] = array(
+ array($GLOBALS['XML_RPC_String'],
+ $GLOBALS['XML_RPC_String']
+ )
+);
+
+/**
+ * docstring for methodHelp
+ * @global string $GLOBALS['XML_RPC_Server_methodHelp_doc']
+ */
+$GLOBALS['XML_RPC_Server_methodHelp_doc'] = gettext('Returns help text if defined'
+ . ' for the method passed, otherwise returns an empty string');
+
+/**
+ * dispatch map for the automatically declared XML-RPC methods.
+ * @global array $GLOBALS['XML_RPC_Server_dmap']
+ */
+$GLOBALS['XML_RPC_Server_dmap'] = array(
+ 'system.listMethods' => array(
+ 'function' => 'XML_RPC_Server_listMethods',
+ 'signature' => $GLOBALS['XML_RPC_Server_listMethods_sig'],
+ 'docstring' => $GLOBALS['XML_RPC_Server_listMethods_doc']
+ ),
+ 'system.methodHelp' => array(
+ 'function' => 'XML_RPC_Server_methodHelp',
+ 'signature' => $GLOBALS['XML_RPC_Server_methodHelp_sig'],
+ 'docstring' => $GLOBALS['XML_RPC_Server_methodHelp_doc']
+ ),
+ 'system.methodSignature' => array(
+ 'function' => 'XML_RPC_Server_methodSignature',
+ 'signature' => $GLOBALS['XML_RPC_Server_methodSignature_sig'],
+ 'docstring' => $GLOBALS['XML_RPC_Server_methodSignature_doc']
+ )
+);
+
+/**
+ * @global string $GLOBALS['XML_RPC_Server_debuginfo']
+ */
+$GLOBALS['XML_RPC_Server_debuginfo'] = '';
+
+
+/**
+ * Lists all the methods that the XML-RPC server knows how to dispatch
+ *
+ * @return object a new XML_RPC_Response object
+ */
+function XML_RPC_Server_listMethods($server, $m)
+{
+ global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;
+
+ $v = new XML_RPC_Value();
+ $outAr = array();
+ foreach ($server->dmap as $key => $val) {
+ $outAr[] = new XML_RPC_Value($key, 'string');
+ }
+ foreach ($XML_RPC_Server_dmap as $key => $val) {
+ $outAr[] = new XML_RPC_Value($key, 'string');
+ }
+ $v->addArray($outAr);
+ return new XML_RPC_Response($v);
+}
+
+/**
+ * Returns an array of known signatures (an array of arrays)
+ * for the given method
+ *
+ * If no signatures are known, returns a none-array
+ * (test for type != array to detect missing signature)
+ *
+ * @return object a new XML_RPC_Response object
+ */
+function XML_RPC_Server_methodSignature($server, $m)
+{
+ global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;
+
+ $methName = $m->getParam(0);
+ $methName = $methName->scalarval();
+ if (strpos($methName, 'system.') === 0) {
+ $dmap = $XML_RPC_Server_dmap;
+ $sysCall = 1;
+ } else {
+ $dmap = $server->dmap;
+ $sysCall = 0;
+ }
+ // print "<!-- ${methName} -->\n";
+ if (isset($dmap[$methName])) {
+ if ($dmap[$methName]['signature']) {
+ $sigs = array();
+ $thesigs = $dmap[$methName]['signature'];
+ for ($i = 0; $i < sizeof($thesigs); $i++) {
+ $cursig = array();
+ $inSig = $thesigs[$i];
+ for ($j = 0; $j < sizeof($inSig); $j++) {
+ $cursig[] = new XML_RPC_Value($inSig[$j], 'string');
+ }
+ $sigs[] = new XML_RPC_Value($cursig, 'array');
+ }
+ $r = new XML_RPC_Response(new XML_RPC_Value($sigs, 'array'));
+ } else {
+ $r = new XML_RPC_Response(new XML_RPC_Value('undef', 'string'));
+ }
+ } else {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
+ $XML_RPC_str['introspect_unknown']);
+ }
+ return $r;
+}
+
+/**
+ * Returns help text if defined for the method passed, otherwise returns
+ * an empty string
+ *
+ * @return object a new XML_RPC_Response object
+ */
+function XML_RPC_Server_methodHelp($server, $m)
+{
+ global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;
+
+ $methName = $m->getParam(0);
+ $methName = $methName->scalarval();
+ if (strpos($methName, 'system.') === 0) {
+ $dmap = $XML_RPC_Server_dmap;
+ $sysCall = 1;
+ } else {
+ $dmap = $server->dmap;
+ $sysCall = 0;
+ }
+
+ if (isset($dmap[$methName])) {
+ if ($dmap[$methName]['docstring']) {
+ $r = new XML_RPC_Response(new XML_RPC_Value($dmap[$methName]['docstring']),
+ 'string');
+ } else {
+ $r = new XML_RPC_Response(new XML_RPC_Value('', 'string'));
+ }
+ } else {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
+ $XML_RPC_str['introspect_unknown']);
+ }
+ return $r;
+}
+
+/**
+ * @return void
+ */
+function XML_RPC_Server_debugmsg($m)
+{
+ global $XML_RPC_Server_debuginfo;
+ $XML_RPC_Server_debuginfo = $XML_RPC_Server_debuginfo . $m . "\n";
+}
+
+
+/**
+ * A server for receiving and replying to XML RPC requests
+ *
+ * <code>
+ * $server = new XML_RPC_Server(
+ * array(
+ * 'isan8' =>
+ * array(
+ * 'function' => 'is_8',
+ * 'signature' =>
+ * array(
+ * array('boolean', 'int'),
+ * array('boolean', 'int', 'boolean'),
+ * array('boolean', 'string'),
+ * array('boolean', 'string', 'boolean'),
+ * ),
+ * 'docstring' => 'Is the value an 8?'
+ * ),
+ * ),
+ * 1,
+ * 0
+ * );
+ * </code>
+ *
+ * @category Web Services
+ * @package XML_RPC
+ * @author Edd Dumbill <edd@usefulinc.com>
+ * @author Stig Bakken <stig@php.net>
+ * @author Martin Jansen <mj@php.net>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1999-2001 Edd Dumbill, 2001-2010 The PHP Group
+ * @license http://www.php.net/license/3_01.txt PHP License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/XML_RPC
+ */
+class XML_RPC_Server
+{
+ /**
+ * Should the payload's content be passed through mb_convert_encoding()?
+ *
+ * @see XML_RPC_Server::setConvertPayloadEncoding()
+ * @since Property available since Release 1.5.1
+ * @var boolean
+ */
+ var $convert_payload_encoding = false;
+
+ /**
+ * The dispatch map, listing the methods this server provides.
+ * @var array
+ */
+ var $dmap = array();
+
+ /**
+ * The present response's encoding
+ * @var string
+ * @see XML_RPC_Message::getEncoding()
+ */
+ var $encoding = '';
+
+ /**
+ * Debug mode (0 = off, 1 = on)
+ * @var integer
+ */
+ var $debug = 0;
+
+ /**
+ * The response's HTTP headers
+ * @var string
+ */
+ var $server_headers = '';
+
+ /**
+ * The response's XML payload
+ * @var string
+ */
+ var $server_payload = '';
+
+
+ /**
+ * The HTTP request data
+ * @null
+ */
+ var $client_data = '';
+
+ /**
+ * Constructor for the XML_RPC_Server class
+ *
+ * @param array $dispMap the dispatch map. An associative array
+ * explaining each function. The keys of the main
+ * array are the procedure names used by the
+ * clients. The value is another associative array
+ * that contains up to three elements:
+ * + The 'function' element's value is the name
+ * of the function or method that gets called.
+ * To define a class' method: 'class::method'.
+ * + The 'signature' element (optional) is an
+ * array describing the return values and
+ * parameters
+ * + The 'docstring' element (optional) is a
+ * string describing what the method does
+ * @param int $serviceNow should the HTTP response be sent now?
+ * (1 = yes, 0 = no)
+ * @param int $debug should debug output be displayed?
+ * (1 = yes, 0 = no)
+ *
+ * @return void
+ */
+ function XML_RPC_Server($dispMap, $serviceNow = 1, $debug = 0)
+ {
+
+ if ($debug) {
+ $this->debug = 1;
+ } else {
+ $this->debug = 0;
+ }
+
+ $this->dmap = $dispMap;
+
+ if ($serviceNow) {
+ $this->service();
+ } else {
+ $this->createServerPayload();
+ $this->createServerHeaders();
+ }
+ }
+
+ /**
+ * @return string the debug information if debug debug mode is on
+ */
+ function serializeDebug()
+ {
+ global $XML_RPC_Server_debuginfo;
+
+ if ($this->debug) {
+ XML_RPC_Server_debugmsg('vvv POST DATA RECEIVED BY SERVER vvv' . "\n"
+ . $this->server_payload . $this->client_data
+ . "\n" . '^^^ END POST DATA ^^^');
+ }
+
+ if ($XML_RPC_Server_debuginfo != '') {
+ return "<!-- PEAR XML_RPC SERVER DEBUG INFO:\n\n"
+ . str_replace('--', '- - ', $XML_RPC_Server_debuginfo)
+ . "-->\n";
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Sets whether the payload's content gets passed through
+ * mb_convert_encoding()
+ *
+ * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
+ *
+ * @param int $in where 1 = on, 0 = off
+ *
+ * @return void
+ *
+ * @see XML_RPC_Message::getEncoding()
+ * @since Method available since Release 1.5.1
+ */
+ function setConvertPayloadEncoding($in)
+ {
+ if ($in && !function_exists('mb_convert_encoding')) {
+ return $this->raiseError('mb_convert_encoding() is not available',
+ XML_RPC_ERROR_PROGRAMMING);
+ }
+ $this->convert_payload_encoding = $in;
+ }
+
+ /**
+ * Sends the response
+ *
+ * The encoding and content-type are determined by
+ * XML_RPC_Message::getEncoding()
+ *
+ * @return void
+ *
+ * @uses XML_RPC_Server::createServerPayload(),
+ * XML_RPC_Server::createServerHeaders()
+ */
+ function service()
+ {
+ if (!$this->server_payload) {
+ $this->createServerPayload();
+ }
+ if (!$this->server_headers) {
+ $this->createServerHeaders();
+ }
+
+ /*
+ * $server_headers needs to remain a string for compatibility with
+ * old scripts using this package, but PHP 4.4.2 no longer allows
+ * line breaks in header() calls. So, we split each header into
+ * an individual call. The initial replace handles the off chance
+ * that someone composed a single header with multiple lines, which
+ * the RFCs allow.
+ */
+ $this->server_headers = preg_replace("@[\r\n]+[ \t]+@",
+ ' ', trim($this->server_headers));
+ $headers = preg_split("@[\r\n]+@", $this->server_headers);
+ foreach ($headers as $header)
+ {
+ header($header);
+ }
+
+ print $this->server_payload;
+ }
+
+ /**
+ * Generates the payload and puts it in the $server_payload property
+ *
+ * If XML_RPC_Server::setConvertPayloadEncoding() was set to true,
+ * the payload gets passed through mb_convert_encoding()
+ * to ensure the payload matches the encoding set in the
+ * XML declaration. The encoding type can be manually set via
+ * XML_RPC_Message::setSendEncoding().
+ *
+ * @return void
+ *
+ * @uses XML_RPC_Server::parseRequest(), XML_RPC_Server::$encoding,
+ * XML_RPC_Response::serialize(), XML_RPC_Server::serializeDebug()
+ * @see XML_RPC_Server::setConvertPayloadEncoding()
+ */
+ function createServerPayload()
+ {
+ $this->client_data = file_get_contents("php://input");
+
+ $r = $this->parseRequest($this->client_data);
+ $this->server_payload = '<?xml version="1.0" encoding="'
+ . $this->encoding . '"?>' . "\n"
+ . $this->serializeDebug()
+ . $r->serialize();
+ if ($this->convert_payload_encoding) {
+ $this->server_payload = mb_convert_encoding($this->server_payload,
+ $this->encoding);
+ }
+ }
+
+ /**
+ * Determines the HTTP headers and puts them in the $server_headers
+ * property
+ *
+ * @return boolean TRUE if okay, FALSE if $server_payload isn't set.
+ *
+ * @uses XML_RPC_Server::createServerPayload(),
+ * XML_RPC_Server::$server_headers
+ */
+ function createServerHeaders()
+ {
+ if (!$this->server_payload) {
+ return false;
+ }
+ $this->server_headers = 'Content-Length: '
+ . strlen($this->server_payload) . "\r\n"
+ . 'Content-Type: text/xml;'
+ . ' charset=' . $this->encoding;
+ return true;
+ }
+
+ /**
+ * @return array
+ */
+ function verifySignature($in, $sig)
+ {
+ for ($i = 0; $i < sizeof($sig); $i++) {
+ // check each possible signature in turn
+ $cursig = $sig[$i];
+ if (sizeof($cursig) == $in->getNumParams() + 1) {
+ $itsOK = 1;
+ for ($n = 0; $n < $in->getNumParams(); $n++) {
+ $p = $in->getParam($n);
+ // print "<!-- $p -->\n";
+ if ($p->kindOf() == 'scalar') {
+ $pt = $p->scalartyp();
+ } else {
+ $pt = $p->kindOf();
+ }
+ // $n+1 as first type of sig is return type
+ if ($pt != $cursig[$n+1]) {
+ $itsOK = 0;
+ $pno = $n+1;
+ $wanted = $cursig[$n+1];
+ $got = $pt;
+ break;
+ }
+ }
+ if ($itsOK) {
+ return array(1);
+ }
+ }
+ }
+ if (isset($wanted)) {
+ return array(0, "Wanted ${wanted}, got ${got} at param ${pno}");
+ } else {
+ $allowed = array();
+ foreach ($sig as $val) {
+ end($val);
+ $allowed[] = key($val);
+ }
+ $allowed = array_unique($allowed);
+ $last = count($allowed) - 1;
+ if ($last > 0) {
+ $allowed[$last] = 'or ' . $allowed[$last];
+ }
+ return array(0,
+ 'Signature permits ' . implode(', ', $allowed)
+ . ' parameters but the request had '
+ . $in->getNumParams());
+ }
+ }
+
+ /**
+ * @return object a new XML_RPC_Response object
+ *
+ * @uses XML_RPC_Message::getEncoding(), XML_RPC_Server::$encoding
+ */
+ function parseRequest($data = '')
+ {
+ global $XML_RPC_xh,
+ $XML_RPC_err, $XML_RPC_str, $XML_RPC_errxml,
+ $XML_RPC_defencoding, $XML_RPC_Server_dmap;
+
+ if ($data == '') {
+ $data = file_get_contents("php://input");
+ $this->client_data = $data;
+ }
+
+ $this->encoding = XML_RPC_Message::getEncoding($data);
+ $parser_resource = xml_parser_create($this->encoding);
+ $parser = (int) $parser_resource;
+
+ $XML_RPC_xh[$parser] = array();
+ $XML_RPC_xh[$parser]['cm'] = 0;
+ $XML_RPC_xh[$parser]['isf'] = 0;
+ $XML_RPC_xh[$parser]['params'] = array();
+ $XML_RPC_xh[$parser]['method'] = '';
+ $XML_RPC_xh[$parser]['stack'] = array();
+ $XML_RPC_xh[$parser]['valuestack'] = array();
+
+ $plist = '';
+
+ // decompose incoming XML into request structure
+
+ xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
+ xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
+ xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');
+ if (!xml_parse($parser_resource, $data, 1)) {
+ // return XML error as a faultCode
+ $r = new XML_RPC_Response(0,
+ $XML_RPC_errxml+xml_get_error_code($parser_resource),
+ sprintf('XML error: %s at line %d',
+ xml_error_string(xml_get_error_code($parser_resource)),
+ xml_get_current_line_number($parser_resource)));
+ xml_parser_free($parser_resource);
+ } elseif ($XML_RPC_xh[$parser]['isf']>1) {
+ $r = new XML_RPC_Response(0,
+ $XML_RPC_err['invalid_request'],
+ $XML_RPC_str['invalid_request']
+ . ': '
+ . $XML_RPC_xh[$parser]['isf_reason']);
+ xml_parser_free($parser_resource);
+ } else {
+ xml_parser_free($parser_resource);
+ $m = new XML_RPC_Message($XML_RPC_xh[$parser]['method']);
+ // now add parameters in
+ for ($i = 0; $i < sizeof($XML_RPC_xh[$parser]['params']); $i++) {
+ // print '<!-- ' . $XML_RPC_xh[$parser]['params'][$i]. "-->\n";
+ $plist .= "$i - " . var_export($XML_RPC_xh[$parser]['params'][$i], true) . " \n";
+ $m->addParam($XML_RPC_xh[$parser]['params'][$i]);
+ }
+
+ if ($this->debug) {
+ XML_RPC_Server_debugmsg($plist);
+ }
+
+ // now to deal with the method
+ $methName = $XML_RPC_xh[$parser]['method'];
+ if (strpos($methName, 'system.') === 0) {
+ $dmap = $XML_RPC_Server_dmap;
+ $sysCall = 1;
+ } else {
+ $dmap = $this->dmap;
+ $sysCall = 0;
+ }
+
+ if (isset($dmap[$methName]['function'])
+ && is_string($dmap[$methName]['function'])
+ && strpos($dmap[$methName]['function'], '::') !== false)
+ {
+ $dmap[$methName]['function'] =
+ explode('::', $dmap[$methName]['function']);
+ }
+
+ if (isset($dmap[$methName]['function'])
+ && is_callable($dmap[$methName]['function']))
+ {
+ // dispatch if exists
+ if (isset($dmap[$methName]['signature'])) {
+ $sr = $this->verifySignature($m,
+ $dmap[$methName]['signature'] );
+ }
+ if (!isset($dmap[$methName]['signature']) || $sr[0]) {
+ // if no signature or correct signature
+ if ($sysCall) {
+ $r = call_user_func($dmap[$methName]['function'], $this, $m);
+ } else {
+ $r = call_user_func($dmap[$methName]['function'], $m);
+ }
+ if (!is_a($r, 'XML_RPC_Response')) {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['not_response_object'],
+ $XML_RPC_str['not_response_object']);
+ }
+ } else {
+ $r = new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
+ $XML_RPC_str['incorrect_params']
+ . ': ' . $sr[1]);
+ }
+ } else {
+ // else prepare error response
+ $r = new XML_RPC_Response(0, $XML_RPC_err['unknown_method'],
+ $XML_RPC_str['unknown_method']);
+ }
+ }
+ return $r;
+ }
+
+ /**
+ * Echos back the input packet as a string value
+ *
+ * @return void
+ *
+ * Useful for debugging.
+ */
+ function echoInput()
+ {
+ $r = new XML_RPC_Response(0);
+ $r->xv = new XML_RPC_Value("'Aha said I: '" . $this->client_data, 'string');
+ print $r->serialize();
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+
+?>
diff --git a/src/etc/inc/zeromq.inc b/src/etc/inc/zeromq.inc
new file mode 100644
index 0000000..6b513d3
--- /dev/null
+++ b/src/etc/inc/zeromq.inc
@@ -0,0 +1,340 @@
+<?php
+/*
+ zeromq.inc
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright 2010 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+define('ZEROMQ_AUTH_FAIL', 'authfail');
+define('ZEROMQ_TRUE', 'true');
+define('ZEROMQ_FASLE', 'false');
+
+$do_not_include_config_gui_inc = true;
+require_once("auth.inc");
+
+//$debug = true;
+
+/* zeromq_send: Send a message to a member node */
+function zeromq_send($protocol = "tcp", $ipaddress = "127.0.0.1", $port = "8888",
+ $method, $params, $username, $password) {
+
+ global $debug;
+
+ /* Set calling function and auth information */
+ $xmlparams = array(
+ $username,
+ $password,
+ $method,
+ $params
+ );
+
+ /* Create new queue object */
+ $queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ, "MySock1");
+ $queue->connect("{$protocol}://{$ipaddress}:{$port}");
+
+ /* Assign socket 1 to the queue, send and receive */
+ $result = $queue->send(serialize($xmlparams))->recv();
+
+ /* xmlrpc_params_to_php() the result and return */
+ $unserializedresult = unserialize($result);
+
+ /* Return the result to the caller */
+ return $unserializedresult;
+}
+
+function zeromq_server($protocol = "tcp", $ipaddress = "127.0.0.1", $port = "8888") {
+ global $debug;
+ if (!$ipaddress || !$port) {
+ if ($debug) {
+ echo "ERROR: You must pass, proto, ipaddress and port\n";
+ }
+ return;
+ }
+ if ($debug) {
+ echo "Creating ZMQSocket()\n";
+ }
+ $server = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REP);
+ if ($debug) {
+ echo "Binding to {$protocol}://{$ipaddress}:{$port}\n";
+ }
+ $server->bind("{$protocol}://{$ipaddress}:{$port}");
+ if ($debug) {
+ echo "Entering while() loop\n";
+ }
+ while ($msg = $server->recv()) {
+ // Convert the XML to a PHP array
+ $message = unserialize($msg);
+ if ($debug) {
+ echo "Message received:\n";
+ print_r($message);
+ }
+ switch ($message[2]) {
+ case "pfsense.exec_shell":
+ $function_to_call = "exec_shell_zeromq";
+ break;
+ case "pfsense.exec_php":
+ $function_to_call = "exec_php_zeromq";
+ break;
+ case "pfsense.filter_configure":
+ $function_to_call = "filter_configure_zeromq";
+ break;
+ case "pfsense.interfaces_carp_configure":
+ $function_to_call = "interfaces_carp_configure_zeromq";
+ break;
+ case "pfsense.backup_config_section":
+ $function_to_call = "backup_config_section_zeromq";
+ break;
+ case "pfsense.restore_config_section":
+ $function_to_call = "restore_config_section_zeromq";
+ break;
+ case "pfsense.merge_config_section":
+ $function_to_call = "merge_config_section_zeromq";
+ break;
+ case "pfsense.merge_installedpackages_section_zeromq":
+ $function_to_call = "merge_installedpackages_section_zeromq";
+ break;
+ case "pfsense.check_firmware_version":
+ $function_to_call = "check_firmware_version_zeromq";
+ break;
+ case "pfsense.reboot":
+ $function_to_call = "reboot_zeromq";
+ break;
+ case "pfsense.get_notices":
+ $function_to_call = "get_notices_zeromq";
+ break;
+ }
+ if (!$function_to_call) {
+ if ($debug) {
+ echo "ERROR: Could not find a function to call";
+ }
+ return;
+ } else {
+ if ($debug) {
+ echo "Invoking function {$message[2]}()\n;";
+ }
+ }
+ /* Call function that is being invoked */
+ $result = $function_to_call($message);
+ /* echo back the result */
+ $server->send($result);
+ }
+}
+
+function zeromq_auth($params) {
+ global $config, $g, $debug;
+
+ $username = $params[0];
+ $passwd = $params[1];
+
+ $user = getUserEntry($username);
+ if (!$user) {
+ if ($debug) {
+ echo "Could not locate user $username with getUserEntry()\n";
+ }
+ return false;
+ }
+
+ if (is_account_disabled($username) || is_account_expired($username)) {
+ if ($debug) {
+ echo "Returning account expired/disabled\n";
+ }
+ return false;
+ }
+
+ if ($user['password']) {
+ $passwd = crypt($passwd, $user['password']);
+ if ($passwd == $user['password']) {
+ return true;
+ }
+ }
+
+ if ($user['md5-hash']) {
+ $passwd = md5($passwd);
+ if ($passwd == $user['md5-hash']) {
+ return true;
+ }
+ }
+
+ if ($debug) {
+ echo "zeromq_auth() fall through == false\n";
+ }
+
+ return false;
+}
+
+function exec_php_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ if ($debug) {
+ echo "Auth failed in exec_shell_zeromq()\n";
+ }
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $exec_php = $params[3];
+ if ($debug) {
+ echo "Running exec_php_zeromq(): {$exec_php}\n";
+ }
+ eval($exec_php);
+ if ($toreturn) {
+ return serialize($toreturn);
+ } else {
+ return ZEROMQ_FASLE;
+ }
+}
+
+function exec_shell_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ if ($debug) {
+ echo "Auth failed in exec_shell_zeromq()\n";
+ }
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $shell_cmd = $params[3];
+ if ($debug) {
+ echo "Running exec_shell_zeromq(): {$shell_cmd}\n";
+ }
+ mwexec($shell_cmd);
+ return ZEROMQ_FASLE;
+}
+
+function backup_config_section_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $val = array_intersect_key($config, array_flip($params[3]));
+ return serialize($val);
+}
+
+function restore_config_section_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $config = array_merge($config, $params[3]);
+ $mergedkeys = implode(",", array_keys($params[3]));
+ write_config(sprintf(gettext("Merged in config (%s sections) from ZeroMQ client."), $mergedkeys));
+ return ZEROMQ_FASLE;
+}
+
+function merge_installedpackages_section_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $config['installedpackages'] = array_merge($config['installedpackages'], $params[0]);
+ $mergedkeys = implode(",", array_keys($params[3]));
+ write_config(sprintf(gettext("Merged in config (%s sections) from ZeroMQ client."), $mergedkeys));
+ return ZEROMQ_FASLE;
+}
+
+function merge_config_section_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ $config = array_merge_recursive_unique($config, $params[0]);
+ $mergedkeys = implode(",", array_keys($params[3]));
+ write_config("Merged in config ({$mergedkeys} sections) from ZeroMQ client.");
+ return ZEROMQ_FASLE;
+}
+
+function filter_configure_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ filter_configure();
+ system_routing_configure();
+ setup_gateways_monitor();
+ relayd_configure();
+ require_once("openvpn.inc");
+ openvpn_resync_all();
+ services_dhcpd_configure();
+ if (isset($config['dnsmasq']['enable'])) {
+ services_dnsmasq_configure();
+ } elseif (isset($config['unbound']['enable'])) {
+ services_unbound_configure();
+ }
+ local_sync_accounts();
+ return ZEROMQ_FASLE;
+}
+
+function interfaces_carp_configure_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ interfaces_sync_setup();
+ interfaces_vips_configure();
+ return ZEROMQ_FASLE;
+}
+
+function check_firmware_version_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ return serialize(check_firmware_version(false));
+}
+
+function reboot_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ mwexec_bg("/etc/rc.reboot");
+ return ZEROMQ_FASLE;
+}
+
+function get_notices_zeromq($raw_params) {
+ global $config, $g, $debug;
+ $params = $raw_params;
+ if (zeromq_auth($raw_params) == false) {
+ return ZEROMQ_AUTH_FAIL;
+ }
+ if (!function_exists("get_notices")) {
+ require("notices.inc");
+ }
+ if (!$params) {
+ $toreturn = get_notices();
+ } else {
+ $toreturn = get_notices($params);
+ }
+ return serialize($toreturn);
+}
+
+?>
diff --git a/src/etc/inetd.conf b/src/etc/inetd.conf
new file mode 100644
index 0000000..0ff37ae
--- /dev/null
+++ b/src/etc/inetd.conf
@@ -0,0 +1 @@
+tftp-proxy dgram udp wait root /usr/libexec/tftp-proxy tftp-proxy \ No newline at end of file
diff --git a/src/etc/login.conf b/src/etc/login.conf
new file mode 100644
index 0000000..1e61a9f
--- /dev/null
+++ b/src/etc/login.conf
@@ -0,0 +1,317 @@
+# login.conf - login class capabilities database.
+#
+# Remember to rebuild the database after each change to this file:
+#
+# cap_mkdb /etc/login.conf
+#
+# This file controls resource limits, accounting limits and
+# default user environment settings.
+#
+# $FreeBSD: src/etc/login.conf,v 1.34.2.6 2002/07/02 20:06:18 dillon Exp $
+#
+
+# Default settings effectively disable resource limits, see the
+# examples below for a starting point to enable them.
+
+# defaults
+# These settings are used by login(1) by default for classless users
+# Note that entries like "cputime" set both "cputime-cur" and "cputime-max"
+
+default:\
+ :passwd_format=md5:\
+ :copyright=/etc/COPYRIGHT:\
+ :welcome=/dev/null:\
+ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\
+ :path=/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin ~/bin:\
+ :nologin=/var/run/nologin:\
+ :cputime=unlimited:\
+ :datasize=unlimited:\
+ :stacksize=unlimited:\
+ :memorylocked=unlimited:\
+ :memoryuse=unlimited:\
+ :filesize=unlimited:\
+ :coredumpsize=unlimited:\
+ :openfiles=unlimited:\
+ :maxproc=unlimited:\
+ :sbsize=unlimited:\
+ :vmemoryuse=unlimited:\
+ :idletime=unlimited:\
+ :priority=0:\
+ :ignoretime@:\
+ :umask=022:
+
+
+#
+# A collection of common class names - forward them all to 'default'
+# (login would normally do this anyway, but having a class name
+# here suppresses the diagnostic)
+#
+standard:\
+ :tc=default:
+xuser:\
+ :tc=default:
+staff:\
+ :tc=default:
+daemon:\
+ :tc=default:
+news:\
+ :tc=default:
+dialer:\
+ :tc=default:
+
+#
+# Root can always login
+#
+# N.B. login_getpwclass(3) will use this entry for the root account,
+# in preference to 'default'.
+root:\
+ :ignorenologin:\
+ :tc=default:
+
+#
+# Russian Users Accounts. Setup proper environment variables.
+#
+russian|Russian Users Accounts:\
+ :charset=KOI8-R:\
+ :lang=ru_RU.KOI8-R:\
+ :tc=default:
+
+
+######################################################################
+######################################################################
+##
+## Example entries
+##
+######################################################################
+######################################################################
+
+## Example defaults
+## These settings are used by login(1) by default for classless users
+## Note that entries like "cputime" set both "cputime-cur" and "cputime-max"
+#
+#default:\
+# :cputime=infinity:\
+# :datasize-cur=22M:\
+# :stacksize-cur=8M:\
+# :memorylocked-cur=10M:\
+# :memoryuse-cur=30M:\
+# :filesize=infinity:\
+# :coredumpsize=infinity:\
+# :maxproc-cur=64:\
+# :openfiles-cur=64:\
+# :priority=0:\
+# :requirehome@:\
+# :umask=022:\
+# :tc=auth-defaults:
+#
+#
+##
+## standard - standard user defaults
+##
+#standard:\
+# :copyright=/etc/COPYRIGHT:\
+# :welcome=/etc/motd:\
+# :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
+# :path=~/bin /bin /usr/bin /usr/local/bin:\
+# :manpath=/usr/share/man /usr/local/man:\
+# :nologin=/var/run/nologin:\
+# :cputime=1h30m:\
+# :datasize=8M:\
+# :vmemoryuse=100M:\
+# :stacksize=2M:\
+# :memorylocked=4M:\
+# :memoryuse=8M:\
+# :filesize=8M:\
+# :coredumpsize=8M:\
+# :openfiles=24:\
+# :maxproc=32:\
+# :priority=0:\
+# :requirehome:\
+# :passwordtime=90d:\
+# :umask=002:\
+# :ignoretime@:\
+# :tc=default:
+#
+#
+##
+## users of X (needs more resources!)
+##
+#xuser:\
+# :manpath=/usr/share/man /usr/X11R6/man /usr/local/man:\
+# :cputime=4h:\
+# :datasize=12M:\
+# :vmemoryuse=infinity:\
+# :stacksize=4M:\
+# :filesize=8M:\
+# :memoryuse=16M:\
+# :openfiles=32:\
+# :maxproc=48:\
+# :tc=standard:
+#
+#
+##
+## Staff users - few restrictions and allow login anytime
+##
+#staff:\
+# :ignorenologin:\
+# :ignoretime:\
+# :requirehome@:\
+# :accounted@:\
+# :path=~/bin /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin:\
+# :umask=022:\
+# :tc=standard:
+#
+#
+##
+## root - fallback for root logins
+##
+#root:\
+# :path=~/bin /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin:\
+# :cputime=infinity:\
+# :datasize=infinity:\
+# :stacksize=infinity:\
+# :memorylocked=infinity:\
+# :memoryuse=infinity:\
+# :filesize=infinity:\
+# :coredumpsize=infinity:\
+# :openfiles=infinity:\
+# :maxproc=infinity:\
+# :memoryuse-cur=32M:\
+# :maxproc-cur=64:\
+# :openfiles-cur=1024:\
+# :priority=0:\
+# :requirehome@:\
+# :umask=022:\
+# :tc=auth-root-defaults:
+#
+#
+##
+## Settings used by /etc/rc
+##
+#daemon:\
+# :coredumpsize@:\
+# :coredumpsize-cur=0:\
+# :datasize=infinity:\
+# :datasize-cur@:\
+# :maxproc=512:\
+# :maxproc-cur@:\
+# :memoryuse-cur=64M:\
+# :memorylocked-cur=64M:\
+# :openfiles=1024:\
+# :openfiles-cur@:\
+# :stacksize=16M:\
+# :stacksize-cur@:\
+# :tc=default:
+#
+#
+##
+## Settings used by news subsystem
+##
+#news:\
+# :path=/usr/local/news/bin /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin:\
+# :cputime=infinity:\
+# :filesize=128M:\
+# :datasize-cur=64M:\
+# :stacksize-cur=32M:\
+# :coredumpsize-cur=0:\
+# :maxmemorysize-cur=128M:\
+# :memorylocked=32M:\
+# :maxproc=128:\
+# :openfiles=256:\
+# :tc=default:
+#
+#
+##
+## The dialer class should be used for a dialup PPP/SLIP accounts
+## Welcome messages/news suppressed
+##
+#dialer:\
+# :hushlogin:\
+# :requirehome@:\
+# :cputime=unlimited:\
+# :filesize=2M:\
+# :datasize=2M:\
+# :stacksize=4M:\
+# :coredumpsize=0:\
+# :memoryuse=4M:\
+# :memorylocked=1M:\
+# :maxproc=16:\
+# :openfiles=32:\
+# :tc=standard:
+#
+#
+##
+## Site full-time 24/7 PPP/SLIP connections
+## - no time accounting, restricted to access via dialin lines
+##
+#site:\
+# :ignoretime:\
+# :passwordtime@:\
+# :refreshtime@:\
+# :refreshperiod@:\
+# :sessionlimit@:\
+# :autodelete@:\
+# :expireperiod@:\
+# :graceexpire@:\
+# :gracetime@:\
+# :warnexpire@:\
+# :warnpassword@:\
+# :idletime@:\
+# :sessiontime@:\
+# :daytime@:\
+# :weektime@:\
+# :monthtime@:\
+# :warntime@:\
+# :accounted@:\
+# :tc=dialer:\
+# :tc=staff:
+#
+#
+##
+## Example standard accounting entries for subscriber levels
+##
+#
+#subscriber|Subscribers:\
+# :accounted:\
+# :refreshtime=180d:\
+# :refreshperiod@:\
+# :sessionlimit@:\
+# :autodelete=30d:\
+# :expireperiod=180d:\
+# :graceexpire=7d:\
+# :gracetime=10m:\
+# :warnexpire=7d:\
+# :warnpassword=7d:\
+# :idletime=30m:\
+# :sessiontime=4h:\
+# :daytime=6h:\
+# :weektime=40h:\
+# :monthtime=120h:\
+# :warntime=4h:\
+# :tc=standard:
+#
+#
+##
+## Subscriber accounts. These accounts have their login times
+## accounted and have access limits applied.
+##
+#subppp|PPP Subscriber Accounts:\
+# :tc=dialer:\
+# :tc=subscriber:
+#
+#
+#subslip|SLIP Subscriber Accounts:\
+# :tc=dialer:\
+# :tc=subscriber:
+#
+#
+#subshell|Shell Subscriber Accounts:\
+# :tc=subscriber:
+#
+##
+## If you want some of the accounts to use traditional UNIX DES based
+## password hashes.
+##
+#des_users:\
+# :passwd_format=des:\
+# :tc=default:
diff --git a/src/etc/master.passwd b/src/etc/master.passwd
new file mode 100644
index 0000000..bb46954
--- /dev/null
+++ b/src/etc/master.passwd
@@ -0,0 +1,29 @@
+# $FreeBSD: src/etc/master.passwd,v 1.39 2004/08/01 21:33:47 markm Exp $
+#
+root:$1$9ZCIHWSF$/6MpmsZXSQbkARathg3cX1:0:0::0:0:Charlie &:/root:/bin/sh
+toor:*:0:0::0:0:Bourne-again Superuser:/root:
+daemon:*:1:1::0:0:Owner of many system processes:/root:/usr/sbin/nologin
+operator:*:2:5::0:0:System &:/:/usr/sbin/nologin
+bin:*:3:7::0:0:Binaries Commands and Source:/:/usr/sbin/nologin
+tty:*:4:65533::0:0:Tty Sandbox:/:/usr/sbin/nologin
+kmem:*:5:65533::0:0:KMem Sandbox:/:/usr/sbin/nologin
+games:*:7:13::0:0:Games pseudo-user:/usr/games:/usr/sbin/nologin
+news:*:8:8::0:0:News Subsystem:/:/usr/sbin/nologin
+man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/usr/sbin/nologin
+sshd:*:22:22::0:0:Secure Shell Daemon:/var/empty:/usr/sbin/nologin
+smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/usr/sbin/nologin
+mailnull:*:26:26::0:0:Sendmail Default User:/var/spool/mqueue:/usr/sbin/nologin
+bind:*:53:53::0:0:Bind Sandbox:/:/usr/sbin/nologin
+unbound:*:59:59::0:0:Unbound DNS Resolver:/var/unbound:/usr/sbin/nologin
+proxy:*:62:62::0:0:Packet Filter pseudo-user:/nonexistent:/usr/sbin/nologin
+_pflogd:*:64:64::0:0:pflogd privsep user:/var/empty:/usr/sbin/nologin
+www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/usr/sbin/nologin
+nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin
+dhcpd:*:1002:1002::0:0:DHCP Daemon:/nonexistent:/sbin/nologin
+admin:$1$9ZCIHWSF$/6MpmsZXSQbkARathg3cX1:0:0::0:0:Admin User:/root:/bin/sh
+_dhcp:*:65:65::0:0:dhcp programs:/var/empty:/usr/sbin/nologin
+_isakmpd:*:68:68::0:0:isakmpd privsep:/var/empty:/sbin/nologin
+uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/local/libexec/uucp/uucico
+pop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
+_ntp:*:123:123::0:0:NTP daemon:/var/empty:/sbin/nologin
+_relayd:*:913:913::0:0:Relay Daemon:/var/empty:/usr/sbin/nologin
diff --git a/src/etc/motd b/src/etc/motd
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/etc/motd
diff --git a/src/etc/mtree/BSD.local.dist b/src/etc/mtree/BSD.local.dist
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/etc/mtree/BSD.local.dist
diff --git a/src/etc/networks b/src/etc/networks
new file mode 100644
index 0000000..92982b5
--- /dev/null
+++ b/src/etc/networks
@@ -0,0 +1,17 @@
+# $FreeBSD: src/etc/networks,v 1.3 1999/08/27 23:23:42 peter Exp $
+# @(#)networks 5.1 (Berkeley) 6/30/90
+#
+# Your Local Networks Database
+#
+your-net 127 # your comment
+your-netmask 255.255.255 # subnet mask for your-net
+
+#
+# Your subnets
+#
+subnet1 127.0.1 alias1 # comment 1
+subnet2 127.0.2 alias2 # comment 2
+
+#
+# Internet networks (from nic.ddn.mil)
+#
diff --git a/src/etc/passwd b/src/etc/passwd
new file mode 100644
index 0000000..040f3e5
--- /dev/null
+++ b/src/etc/passwd
@@ -0,0 +1,26 @@
+root:*:0:0:Charlie &:/root:/bin/sh
+toor:*:0:0:Bourne-again Superuser:/root:
+daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin
+operator:*:2:5:System &:/:/usr/sbin/nologin
+bin:*:3:7:Binaries Commands and Source:/:/usr/sbin/nologin
+tty:*:4:65533:Tty Sandbox:/:/usr/sbin/nologin
+kmem:*:5:65533:KMem Sandbox:/:/usr/sbin/nologin
+games:*:7:13:Games pseudo-user:/usr/games:/usr/sbin/nologin
+news:*:8:8:News Subsystem:/:/usr/sbin/nologin
+man:*:9:9:Mister Man Pages:/usr/share/man:/usr/sbin/nologin
+sshd:*:22:22:Secure Shell Daemon:/var/empty:/usr/sbin/nologin
+smmsp:*:25:25:Sendmail Submission User:/var/spool/clientmqueue:/usr/sbin/nologin
+mailnull:*:26:26:Sendmail Default User:/var/spool/mqueue:/usr/sbin/nologin
+bind:*:53:53:Bind Sandbox:/:/usr/sbin/nologin
+unbound:*:59:59:Unbound DNS Resolver:/var/unbound:/usr/sbin/nologin
+proxy:*:62:62:Packet Filter pseudo-user:/nonexistent:/usr/sbin/nologin
+_pflogd:*:64:64:pflogd privsep user:/var/empty:/usr/sbin/nologin
+uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/local/libexec/uucp/uucico
+pop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
+www:*:80:80:World Wide Web Owner:/nonexistent:/usr/sbin/nologin
+nobody:*:65534:65534:Unprivileged user:/nonexistent:/usr/sbin/nologin
+distcc:*:1001:1001:Distcc:/home/distcc:/sbin/nologin
+dhcpd:*:1002:1002:DHCP Daemon:/nonexistent:/sbin/nologin
+admin:*:0:0:Admin User:/home/admin:/bin/sh
+_ntp:*:123:123:NTP daemon:/var/empty:/sbin/nologin
+_relayd:*:913:913:Relay Daemon:/var/empty:/usr/sbin/nologin
diff --git a/src/etc/pf.os b/src/etc/pf.os
new file mode 100644
index 0000000..56c7cbf
--- /dev/null
+++ b/src/etc/pf.os
@@ -0,0 +1,698 @@
+# $FreeBSD: stable/10/etc/pf.os 244096 2012-12-10 20:52:52Z delphij $
+# $OpenBSD: pf.os,v 1.26 2012/08/03 12:25:16 jsg Exp $
+# passive OS fingerprinting
+# -------------------------
+#
+# SYN signatures. Those signatures work for SYN packets only (duh!).
+#
+# (C) Copyright 2000-2003 by Michal Zalewski <lcamtuf@coredump.cx>
+# (C) Copyright 2003 by Mike Frantzen <frantzen@w4g.org>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+#
+# This fingerprint database is adapted from Michal Zalewski's p0f passive
+# operating system package. The last database sync was from a Nov 3 2003
+# p0f.fp.
+#
+#
+# Each line in this file specifies a single fingerprint. Please read the
+# information below carefully before attempting to append any signatures
+# reported as UNKNOWN to this file to avoid mistakes.
+#
+# We use the following set metrics for fingerprinting:
+#
+# - Window size (WSS) - a highly OS dependent setting used for TCP/IP
+# performance control (max. amount of data to be sent without ACK).
+# Some systems use a fixed value for initial packets. On other
+# systems, it is a multiple of MSS or MTU (MSS+40). In some rare
+# cases, the value is just arbitrary.
+#
+# NEW SIGNATURE: if p0f reported a special value of 'Snn', the number
+# appears to be a multiple of MSS (MSS*nn); a special value of 'Tnn'
+# means it is a multiple of MTU ((MSS+40)*nn). Unless you notice the
+# value of nn is not fixed (unlikely), just copy the Snn or Tnn token
+# literally. If you know this device has a simple stack and a fixed
+# MTU, you can however multiply S value by MSS, or T value by MSS+40,
+# and put it instead of Snn or Tnn.
+#
+# If WSS otherwise looks like a fixed value (for example a multiple
+# of two), or if you can confirm the value is fixed, please quote
+# it literally. If there's no apparent pattern in WSS chosen, you
+# should consider wildcarding this value.
+#
+# - Overall packet size - a function of all IP and TCP options and bugs.
+#
+# NEW SIGNATURE: Copy this value literally.
+#
+# - Initial TTL - We check the actual TTL of a received packet. It can't
+# be higher than the initial TTL, and also shouldn't be dramatically
+# lower (maximum distance is defined as 40 hops).
+#
+# NEW SIGNATURE: *Never* copy TTL from a p0f-reported signature literally.
+# You need to determine the initial TTL. The best way to do it is to
+# check the documentation for a remote system, or check its settings.
+# A fairly good method is to simply round the observed TTL up to
+# 32, 64, 128, or 255, but it should be noted that some obscure devices
+# might not use round TTLs (in particular, some shoddy appliances use
+# "original" initial TTL settings). If not sure, you can see how many
+# hops you're away from the remote party with traceroute or mtr.
+#
+# - Don't fragment flag (DF) - some modern OSes set this to implement PMTU
+# discovery. Others do not bother.
+#
+# NEW SIGNATURE: Copy this value literally.
+#
+# - Maximum segment size (MSS) - this setting is usually link-dependent. P0f
+# uses it to determine link type of the remote host.
+#
+# NEW SIGNATURE: Always wildcard this value, except for rare cases when
+# you have an appliance with a fixed value, know the system supports only
+# a very limited number of network interface types, or know the system
+# is using a value it pulled out of nowhere. Specific unique MSS
+# can be used to tell Google crawlbots from the rest of the population.
+#
+# - Window scaling (WSCALE) - this feature is used to scale WSS.
+# It extends the size of a TCP/IP window to 32 bits. Some modern
+# systems implement this feature.
+#
+# NEW SIGNATURE: Observe several signatures. Initial WSCALE is often set
+# to zero or other low value. There's usually no need to wildcard this
+# parameter.
+#
+# - Timestamp - some systems that implement timestamps set them to
+# zero in the initial SYN. This case is detected and handled appropriately.
+#
+# - Selective ACK permitted - a flag set by systems that implement
+# selective ACK functionality.
+#
+# - The sequence of TCP all options (MSS, window scaling, selective ACK
+# permitted, timestamp, NOP). Other than the options previously
+# discussed, p0f also checks for timestamp option (a silly
+# extension to broadcast your uptime ;-), NOP options (used for
+# header padding) and sackOK option (selective ACK feature).
+#
+# NEW SIGNATURE: Copy the sequence literally.
+#
+# To wildcard any value (except for initial TTL or TCP options), replace
+# it with '*'. You can also use a modulo operator to match any values
+# that divide by nnn - '%nnn'.
+#
+# Fingerprint entry format:
+#
+# wwww:ttt:D:ss:OOO...:OS:Version:Subtype:Details
+#
+# wwww - window size (can be *, %nnn, Snn or Tnn). The special values
+# "S" and "T" which are a multiple of MSS or a multiple of MTU
+# respectively.
+# ttt - initial TTL
+# D - don't fragment bit (0 - not set, 1 - set)
+# ss - overall SYN packet size
+# OOO - option value and order specification (see below)
+# OS - OS genre (Linux, Solaris, Windows)
+# Version - OS Version (2.0.27 on x86, etc)
+# Subtype - OS subtype or patchlevel (SP3, lo0)
+# details - Generic OS details
+#
+# If OS genre starts with '*', p0f will not show distance, link type
+# and timestamp data. It is useful for userland TCP/IP stacks of
+# network scanners and so on, where many settings are randomized or
+# bogus.
+#
+# If OS genre starts with @, it denotes an approximate hit for a group
+# of operating systems (signature reporting still enabled in this case).
+# Use this feature at the end of this file to catch cases for which
+# you don't have a precise match, but can tell it's Windows or FreeBSD
+# or whatnot by looking at, say, flag layout alone.
+#
+# Option block description is a list of comma or space separated
+# options in the order they appear in the packet:
+#
+# N - NOP option
+# Wnnn - window scaling option, value nnn (or * or %nnn)
+# Mnnn - maximum segment size option, value nnn (or * or %nnn)
+# S - selective ACK OK
+# T - timestamp
+# T0 - timestamp with a zero value
+#
+# To denote no TCP options, use a single '.'.
+#
+# Please report any additions to this file, or any inaccuracies or
+# problems spotted, to the maintainers: lcamtuf@coredump.cx,
+# frantzen@openbsd.org and bugs@openbsd.org with a tcpdump packet
+# capture of the relevant SYN packet(s)
+#
+# A test and submission page is available at
+# http://lcamtuf.coredump.cx/p0f-help/
+#
+#
+# WARNING WARNING WARNING
+# -----------------------
+#
+# Do not add a system X as OS Y just because NMAP says so. It is often
+# the case that X is a NAT firewall. While nmap is talking to the
+# device itself, p0f is fingerprinting the guy behind the firewall
+# instead.
+#
+# When in doubt, use common sense, don't add something that looks like
+# a completely different system as Linux or FreeBSD or LinkSys router.
+# Check DNS name, establish a connection to the remote host and look
+# at SYN+ACK - does it look similar?
+#
+# Some users tweak their TCP/IP settings - enable or disable RFC1323
+# functionality, enable or disable timestamps or selective ACK,
+# disable PMTU discovery, change MTU and so on. Always compare a new rule
+# to other fingerprints for this system, and verify the system isn't
+# "customized" before adding it. It is OK to add signature variants
+# caused by a commonly used software (personal firewalls, security
+# packages, etc), but it makes no sense to try to add every single
+# possible /proc/sys/net/ipv4 tweak on Linux or so.
+#
+# KEEP IN MIND: Some packet firewalls configured to normalize outgoing
+# traffic (OpenBSD pf with "scrub" enabled, for example) will, well,
+# normalize packets. Signatures will not correspond to the originating
+# system (and probably not quite to the firewall either).
+#
+# NOTE: Try to keep this file in some reasonable order, from most to
+# least likely systems. This will speed up operation. Also keep most
+# generic and broad rules near the end.
+#
+
+##########################
+# Standard OS signatures #
+##########################
+
+# ----------------- AIX ---------------------
+
+# AIX is first because its signatures are close to NetBSD, MacOS X and
+# Linux 2.0, but it uses a fairly rare MSSes, at least sometimes...
+# This is a shoddy hack, though.
+
+45046:64:0:44:M*: AIX:4.3::AIX 4.3
+16384:64:0:44:M512: AIX:4.3:2-3:AIX 4.3.2 and earlier
+
+16384:64:0:60:M512,N,W%2,N,N,T: AIX:4.3:3:AIX 4.3.3-5.2
+16384:64:0:60:M512,N,W%2,N,N,T: AIX:5.1-5.2::AIX 4.3.3-5.2
+32768:64:0:60:M512,N,W%2,N,N,T: AIX:4.3:3:AIX 4.3.3-5.2
+32768:64:0:60:M512,N,W%2,N,N,T: AIX:5.1-5.2::AIX 4.3.3-5.2
+65535:64:0:60:M512,N,W%2,N,N,T: AIX:4.3:3:AIX 4.3.3-5.2
+65535:64:0:60:M512,N,W%2,N,N,T: AIX:5.1-5.2::AIX 4.3.3-5.2
+65535:64:0:64:M*,N,W1,N,N,T,N,N,S: AIX:5.3:ML1:AIX 5.3 ML1
+
+# ----------------- Linux -------------------
+
+# S1:64:0:44:M*:A: Linux:1.2::Linux 1.2.x (XXX quirks support)
+512:64:0:44:M*: Linux:2.0:3x:Linux 2.0.3x
+16384:64:0:44:M*: Linux:2.0:3x:Linux 2.0.3x
+
+# Endian snafu! Nelson says "ha-ha":
+2:64:0:44:M*: Linux:2.0:3x:Linux 2.0.3x (MkLinux) on Mac
+64:64:0:44:M*: Linux:2.0:3x:Linux 2.0.3x (MkLinux) on Mac
+
+
+S4:64:1:60:M1360,S,T,N,W0: Linux:google::Linux (Google crawlbot)
+
+S2:64:1:60:M*,S,T,N,W0: Linux:2.4::Linux 2.4 (big boy)
+S3:64:1:60:M*,S,T,N,W0: Linux:2.4:.18-21:Linux 2.4.18 and newer
+S4:64:1:60:M*,S,T,N,W0: Linux:2.4::Linux 2.4/2.6 <= 2.6.7
+S4:64:1:60:M*,S,T,N,W0: Linux:2.6:.1-7:Linux 2.4/2.6 <= 2.6.7
+
+S4:64:1:60:M*,S,T,N,W5: Linux:2.6::Linux 2.6 (newer, 1)
+S4:64:1:60:M*,S,T,N,W6: Linux:2.6::Linux 2.6 (newer, 2)
+S4:64:1:60:M*,S,T,N,W7: Linux:2.6::Linux 2.6 (newer, 3)
+T4:64:1:60:M*,S,T,N,W7: Linux:2.6::Linux 2.6 (newer, 4)
+
+S10:64:1:60:M*,S,T,N,W4: Linux:3.0::Linux 3.0
+
+S3:64:1:60:M*,S,T,N,W1: Linux:2.5::Linux 2.5 (sometimes 2.4)
+S4:64:1:60:M*,S,T,N,W1: Linux:2.5-2.6::Linux 2.5/2.6
+S3:64:1:60:M*,S,T,N,W2: Linux:2.5::Linux 2.5 (sometimes 2.4)
+S4:64:1:60:M*,S,T,N,W2: Linux:2.5::Linux 2.5 (sometimes 2.4)
+
+S20:64:1:60:M*,S,T,N,W0: Linux:2.2:20-25:Linux 2.2.20 and newer
+S22:64:1:60:M*,S,T,N,W0: Linux:2.2::Linux 2.2
+S11:64:1:60:M*,S,T,N,W0: Linux:2.2::Linux 2.2
+
+# Popular cluster config scripts disable timestamps and
+# selective ACK:
+S4:64:1:48:M1460,N,W0: Linux:2.4:cluster:Linux 2.4 in cluster
+
+# This needs to be investigated. On some systems, WSS
+# is selected as a multiple of MTU instead of MSS. I got
+# many submissions for this for many late versions of 2.4:
+T4:64:1:60:M1412,S,T,N,W0: Linux:2.4::Linux 2.4 (late, uncommon)
+
+# This happens only over loopback, but let's make folks happy:
+32767:64:1:60:M16396,S,T,N,W0: Linux:2.4:lo0:Linux 2.4 (local)
+S8:64:1:60:M3884,S,T,N,W0: Linux:2.2:lo0:Linux 2.2 (local)
+
+# Opera visitors:
+16384:64:1:60:M*,S,T,N,W0: Linux:2.2:Opera:Linux 2.2 (Opera?)
+32767:64:1:60:M*,S,T,N,W0: Linux:2.4:Opera:Linux 2.4 (Opera?)
+
+# Some fairly common mods:
+S4:64:1:52:M*,N,N,S,N,W0: Linux:2.4:ts:Linux 2.4 w/o timestamps
+S22:64:1:52:M*,N,N,S,N,W0: Linux:2.2:ts:Linux 2.2 w/o timestamps
+
+
+# ----------------- FreeBSD -----------------
+
+16384:64:1:44:M*: FreeBSD:2.0-2.2::FreeBSD 2.0-4.2
+16384:64:1:44:M*: FreeBSD:3.0-3.5::FreeBSD 2.0-4.2
+16384:64:1:44:M*: FreeBSD:4.0-4.2::FreeBSD 2.0-4.2
+16384:64:1:60:M*,N,W0,N,N,T: FreeBSD:4.4::FreeBSD 4.4
+
+1024:64:1:60:M*,N,W0,N,N,T: FreeBSD:4.4::FreeBSD 4.4
+
+57344:64:1:44:M*: FreeBSD:4.6-4.8:noRFC1323:FreeBSD 4.6-4.8 (no RFC1323)
+57344:64:1:60:M*,N,W0,N,N,T: FreeBSD:4.6-4.9::FreeBSD 4.6-4.9
+
+32768:64:1:60:M*,N,W0,N,N,T: FreeBSD:4.8-4.11::FreeBSD 4.8-5.1 (or MacOS X)
+32768:64:1:60:M*,N,W0,N,N,T: FreeBSD:5.0-5.1::FreeBSD 4.8-5.1 (or MacOS X)
+65535:64:1:60:M*,N,W0,N,N,T: FreeBSD:4.8-4.11::FreeBSD 4.8-5.2 (or MacOS X)
+65535:64:1:60:M*,N,W0,N,N,T: FreeBSD:5.0-5.2::FreeBSD 4.8-5.2 (or MacOS X)
+65535:64:1:60:M*,N,W1,N,N,T: FreeBSD:4.7-4.11::FreeBSD 4.7-5.2
+65535:64:1:60:M*,N,W1,N,N,T: FreeBSD:5.0-5.2::FreeBSD 4.7-5.2
+
+# XXX need quirks support
+# 65535:64:1:60:M*,N,W0,N,N,T:Z:FreeBSD:5.1-5.4::5.1-current (1)
+# 65535:64:1:60:M*,N,W1,N,N,T:Z:FreeBSD:5.1-5.4::5.1-current (2)
+# 65535:64:1:60:M*,N,W2,N,N,T:Z:FreeBSD:5.1-5.4::5.1-current (3)
+# 65535:64:1:44:M*:Z:FreeBSD:5.2::FreeBSD 5.2 (no RFC1323)
+
+# 16384:64:1:60:M*,N,N,N,N,N,N,T:FreeBSD:4.4:noTS:FreeBSD 4.4 (w/o timestamps)
+
+# ----------------- NetBSD ------------------
+
+16384:64:0:60:M*,N,W0,N,N,T: NetBSD:1.3::NetBSD 1.3
+65535:64:0:60:M*,N,W0,N,N,T0: NetBSD:1.6:opera:NetBSD 1.6 (Opera)
+16384:64:0:60:M*,N,W0,N,N,T0: NetBSD:1.6::NetBSD 1.6
+16384:64:1:60:M*,N,W0,N,N,T0: NetBSD:1.6:df:NetBSD 1.6 (DF)
+65535:64:1:60:M*,N,W1,N,N,T0: NetBSD:1.6::NetBSD 1.6W-current (DF)
+65535:64:1:60:M*,N,W0,N,N,T0: NetBSD:1.6::NetBSD 1.6X (DF)
+32768:64:1:60:M*,N,W0,N,N,T0: NetBSD:1.6:randomization:NetBSD 1.6ZH-current (w/ ip_id randomization)
+
+# ----------------- OpenBSD -----------------
+
+16384:64:0:60:M*,N,W0,N,N,T: OpenBSD:2.6::NetBSD 1.3 (or OpenBSD 2.6)
+16384:64:1:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.0-4.8::OpenBSD 3.0-4.8
+16384:64:0:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.0-4.8:no-df:OpenBSD 3.0-4.8 (scrub no-df)
+57344:64:1:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.3-4.0::OpenBSD 3.3-4.0
+57344:64:0:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.3-4.0:no-df:OpenBSD 3.3-4.0 (scrub no-df)
+
+65535:64:1:64:M*,N,N,S,N,W0,N,N,T: OpenBSD:3.0-4.0:opera:OpenBSD 3.0-4.0 (Opera)
+
+16384:64:1:64:M*,N,N,S,N,W3,N,N,T: OpenBSD:4.9::OpenBSD 4.9
+16384:64:0:64:M*,N,N,S,N,W3,N,N,T: OpenBSD:4.9:no-df:OpenBSD 4.9 (scrub no-df)
+
+# ----------------- Solaris -----------------
+
+S17:64:1:64:N,W3,N,N,T0,N,N,S,M*: Solaris:8:RFC1323:Solaris 8 RFC1323
+S17:64:1:48:N,N,S,M*: Solaris:8::Solaris 8
+S17:255:1:44:M*: Solaris:2.5-2.7::Solaris 2.5 to 7
+
+S6:255:1:44:M*: Solaris:2.6-2.7::Solaris 2.6 to 7
+S23:255:1:44:M*: Solaris:2.5:1:Solaris 2.5.1
+S34:64:1:48:M*,N,N,S: Solaris:2.9::Solaris 9
+S44:255:1:44:M*: Solaris:2.7::Solaris 7
+
+4096:64:0:44:M1460: SunOS:4.1::SunOS 4.1.x
+
+S34:64:1:52:M*,N,W0,N,N,S: Solaris:10:beta:Solaris 10 (beta)
+32850:64:1:64:M*,N,N,T,N,W1,N,N,S: Solaris:10::Solaris 10 1203
+
+# ----------------- IRIX --------------------
+
+49152:64:0:44:M*: IRIX:6.4::IRIX 6.4
+61440:64:0:44:M*: IRIX:6.2-6.5::IRIX 6.2-6.5
+49152:64:0:52:M*,N,W2,N,N,S: IRIX:6.5:RFC1323:IRIX 6.5 (RFC1323)
+49152:64:0:52:M*,N,W3,N,N,S: IRIX:6.5:RFC1323:IRIX 6.5 (RFC1323)
+
+61440:64:0:48:M*,N,N,S: IRIX:6.5:12-21:IRIX 6.5.12 - 6.5.21
+49152:64:0:48:M*,N,N,S: IRIX:6.5:15-21:IRIX 6.5.15 - 6.5.21
+
+49152:60:0:64:M*,N,W2,N,N,T,N,N,S: IRIX:6.5:IP27:IRIX 6.5 IP27
+
+
+# ----------------- Tru64 -------------------
+
+32768:64:1:48:M*,N,W0: Tru64:4.0::Tru64 4.0 (or OS/2 Warp 4)
+32768:64:0:48:M*,N,W0: Tru64:5.0::Tru64 5.0
+8192:64:0:44:M1460: Tru64:5.1:noRFC1323:Tru64 6.1 (no RFC1323) (or QNX 6)
+61440:64:0:48:M*,N,W0: Tru64:5.1a:JP4:Tru64 v5.1a JP4 (or OpenVMS 7.x on Compaq 5.x stack)
+
+# ----------------- OpenVMS -----------------
+
+6144:64:1:60:M*,N,W0,N,N,T: OpenVMS:7.2::OpenVMS 7.2 (Multinet 4.4 stack)
+
+# ----------------- MacOS -------------------
+
+# XXX Need EOL tcp opt support
+# S2:255:1:48:M*,W0,E:.:MacOS:8.6 classic
+
+# XXX some of these use EOL too
+16616:255:1:48:M*,W0: MacOS:7.3-7.6:OTTCP:MacOS 7.3-8.6 (OTTCP)
+16616:255:1:48:M*,W0: MacOS:8.0-8.6:OTTCP:MacOS 7.3-8.6 (OTTCP)
+16616:255:1:48:M*,N,N,N: MacOS:8.1-8.6:OTTCP:MacOS 8.1-8.6 (OTTCP)
+32768:255:1:48:M*,W0,N: MacOS:9.0-9.2::MacOS 9.0-9.2
+65535:255:1:48:M*,N,N,N,N: MacOS:9.1::MacOS 9.1 (OT 2.7.4)
+
+
+# ----------------- Windows -----------------
+
+# Windows TCP/IP stack is a mess. For most recent XP, 2000 and
+# even 98, the patchlevel, not the actual OS version, is more
+# relevant to the signature. They share the same code, so it would
+# seem. Luckily for us, almost all Windows 9x boxes have an
+# awkward MSS of 536, which I use to tell one from another
+# in most difficult cases.
+
+8192:32:1:44:M*: Windows:3.11::Windows 3.11 (Tucows)
+S44:64:1:64:M*,N,W0,N,N,T0,N,N,S: Windows:95::Windows 95
+8192:128:1:64:M*,N,W0,N,N,T0,N,N,S: Windows:95:b:Windows 95b
+
+# There were so many tweaking tools and so many stack versions for
+# Windows 98 it is no longer possible to tell them from each other
+# without some very serious research. Until then, there's an insane
+# number of signatures, for your amusement:
+
+S44:32:1:48:M*,N,N,S: Windows:98:lowTTL:Windows 98 (low TTL)
+8192:32:1:48:M*,N,N,S: Windows:98:lowTTL:Windows 98 (low TTL)
+%8192:64:1:48:M536,N,N,S: Windows:98::Windows 98
+%8192:128:1:48:M536,N,N,S: Windows:98::Windows 98
+S4:64:1:48:M*,N,N,S: Windows:98::Windows 98
+S6:64:1:48:M*,N,N,S: Windows:98::Windows 98
+S12:64:1:48:M*,N,N,S: Windows:98::Windows 98
+T30:64:1:64:M1460,N,W0,N,N,T0,N,N,S: Windows:98::Windows 98
+32767:64:1:48:M*,N,N,S: Windows:98::Windows 98
+37300:64:1:48:M*,N,N,S: Windows:98::Windows 98
+46080:64:1:52:M*,N,W3,N,N,S: Windows:98:RFC1323:Windows 98 (RFC1323)
+65535:64:1:44:M*: Windows:98:noSack:Windows 98 (no sack)
+S16:128:1:48:M*,N,N,S: Windows:98::Windows 98
+S16:128:1:64:M*,N,W0,N,N,T0,N,N,S: Windows:98::Windows 98
+S26:128:1:48:M*,N,N,S: Windows:98::Windows 98
+T30:128:1:48:M*,N,N,S: Windows:98::Windows 98
+32767:128:1:52:M*,N,W0,N,N,S: Windows:98::Windows 98
+60352:128:1:48:M*,N,N,S: Windows:98::Windows 98
+60352:128:1:64:M*,N,W2,N,N,T0,N,N,S: Windows:98::Windows 98
+
+# What's with 1414 on NT?
+T31:128:1:44:M1414: Windows:NT:4.0:Windows NT 4.0 SP6a
+64512:128:1:44:M1414: Windows:NT:4.0:Windows NT 4.0 SP6a
+8192:128:1:44:M*: Windows:NT:4.0:Windows NT 4.0 (older)
+
+# Windows XP and 2000. Most of the signatures that were
+# either dubious or non-specific (no service pack data)
+# were deleted and replaced with generics at the end.
+
+65535:128:1:48:M*,N,N,S: Windows:2000:SP4:Windows 2000 SP4, XP SP1
+65535:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows 2000 SP4, XP SP1
+%8192:128:1:48:M*,N,N,S: Windows:2000:SP2+:Windows 2000 SP2, XP SP1 (seldom 98 4.10.2222)
+%8192:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows 2000 SP2, XP SP1 (seldom 98 4.10.2222)
+S20:128:1:48:M*,N,N,S: Windows:2000::Windows 2000/XP SP3
+S20:128:1:48:M*,N,N,S: Windows:XP:SP3:Windows 2000/XP SP3
+S45:128:1:48:M*,N,N,S: Windows:2000:SP4:Windows 2000 SP4, XP SP 1
+S45:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows 2000 SP4, XP SP 1
+40320:128:1:48:M*,N,N,S: Windows:2000:SP4:Windows 2000 SP4
+
+S6:128:1:48:M*,N,N,S: Windows:2000:SP2:Windows XP, 2000 SP2+
+S6:128:1:48:M*,N,N,S: Windows:XP::Windows XP, 2000 SP2+
+S12:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows XP SP1
+S44:128:1:48:M*,N,N,S: Windows:2000:SP3:Windows Pro SP1, 2000 SP3
+S44:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows Pro SP1, 2000 SP3
+64512:128:1:48:M*,N,N,S: Windows:2000:SP3:Windows SP1, 2000 SP3
+64512:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows SP1, 2000 SP3
+32767:128:1:48:M*,N,N,S: Windows:2000:SP4:Windows SP1, 2000 SP4
+32767:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows SP1, 2000 SP4
+
+8192:128:1:52:M*,N,W2,N,N,S: Windows:Vista::Windows Vista/7
+
+# Odds, ends, mods:
+
+S52:128:1:48:M1260,N,N,S: Windows:2000:cisco:Windows XP/2000 via Cisco
+S52:128:1:48:M1260,N,N,S: Windows:XP:cisco:Windows XP/2000 via Cisco
+65520:128:1:48:M*,N,N,S: Windows:XP::Windows XP bare-bone
+16384:128:1:52:M536,N,W0,N,N,S: Windows:2000:ZoneAlarm:Windows 2000 w/ZoneAlarm?
+2048:255:0:40:.: Windows:.NET::Windows .NET Enterprise Server
+
+44620:64:0:48:M*,N,N,S: Windows:ME::Windows ME no SP (?)
+S6:255:1:48:M536,N,N,S: Windows:95:winsock2:Windows 95 winsock 2
+32768:32:1:52:M1460,N,W0,N,N,S: Windows:2003:AS:Windows 2003 AS
+
+
+# No need to be more specific, it passes:
+# *:128:1:48:M*,N,N,S:U:-Windows:XP/2000 while downloading (leak!) XXX quirk
+# there is an equiv similar generic sig w/o the quirk
+
+# ----------------- HP/UX -------------------
+
+32768:64:1:44:M*: HP-UX:B.10.20::HP-UX B.10.20
+32768:64:0:48:M*,W0,N: HP-UX:11.0::HP-UX 11.0
+32768:64:1:48:M*,W0,N: HP-UX:11.10::HP-UX 11.0 or 11.11
+32768:64:1:48:M*,W0,N: HP-UX:11.11::HP-UX 11.0 or 11.11
+
+# Whoa. Hardcore WSS.
+0:64:0:48:M*,W0,N: HP-UX:B.11.00:A:HP-UX B.11.00 A (RFC1323)
+
+# ----------------- RiscOS ------------------
+
+# We don't yet support the ?12 TCP option
+#16384:64:1:68:M1460,N,W0,N,N,T,N,N,?12: RISCOS:3.70-4.36::RISC OS 3.70-4.36
+12288:32:0:44:M536: RISC OS:3.70:4.10:RISC OS 3.70 inet 4.10
+
+# XXX quirk
+# 4096:64:1:56:M1460,N,N,T:T: RISC OS:3.70:freenet:RISC OS 3.70 freenet 2.00
+
+
+
+# ----------------- BSD/OS ------------------
+
+# Once again, power of two WSS is also shared by MacOS X with DF set
+8192:64:1:60:M1460,N,W0,N,N,T: BSD/OS:3.1::BSD/OS 3.1-4.3 (or MacOS X 10.2 w/DF)
+8192:64:1:60:M1460,N,W0,N,N,T: BSD/OS:4.0-4.3::BSD/OS 3.1-4.3 (or MacOS X 10.2)
+
+
+# ---------------- NewtonOS -----------------
+
+4096:64:0:44:M1420: NewtonOS:2.1::NewtonOS 2.1
+
+# ---------------- NeXTSTEP -----------------
+
+S4:64:0:44:M1024: NeXTSTEP:3.3::NeXTSTEP 3.3
+S8:64:0:44:M512: NeXTSTEP:3.3::NeXTSTEP 3.3
+
+# ------------------ BeOS -------------------
+
+1024:255:0:48:M*,N,W0: BeOS:5.0-5.1::BeOS 5.0-5.1
+12288:255:0:44:M1402: BeOS:5.0::BeOS 5.0.x
+
+# ------------------ OS/400 -----------------
+
+8192:64:1:60:M1440,N,W0,N,N,T: OS/400:VR4::OS/400 VR4/R5
+8192:64:1:60:M1440,N,W0,N,N,T: OS/400:VR5::OS/400 VR4/R5
+4096:64:1:60:M1440,N,W0,N,N,T: OS/400:V4R5:CF67032:OS/400 V4R5 + CF67032
+
+# XXX quirk
+# 28672:64:0:44:M1460:A:OS/390:?
+
+# ------------------ ULTRIX -----------------
+
+16384:64:0:40:.: ULTRIX:4.5::ULTRIX 4.5
+
+# ------------------- QNX -------------------
+
+S16:64:0:44:M512: QNX:::QNX demodisk
+
+# ------------------ Novell -----------------
+
+16384:128:1:44:M1460: Novell:NetWare:5.0:Novel Netware 5.0
+6144:128:1:44:M1460: Novell:IntranetWare:4.11:Novell IntranetWare 4.11
+6144:128:1:44:M1368: Novell:BorderManager::Novell BorderManager ?
+
+6144:128:1:52:M*,W0,N,S,N,N: Novell:Netware:6:Novell Netware 6 SP3
+
+
+# ----------------- SCO ------------------
+S3:64:1:60:M1460,N,W0,N,N,T: SCO:UnixWare:7.1:SCO UnixWare 7.1
+S17:64:1:60:M1380,N,W0,N,N,T: SCO:UnixWare:7.1:SCO UnixWare 7.1.3 MP3
+S23:64:1:44:M1380: SCO:OpenServer:5.0:SCO OpenServer 5.0
+
+# ------------------- DOS -------------------
+
+2048:255:0:44:M536: DOS:WATTCP:1.05:DOS Arachne via WATTCP/1.05
+T2:255:0:44:M984: DOS:WATTCP:1.05Arachne:Arachne via WATTCP/1.05 (eepro)
+
+# ------------------ OS/2 -------------------
+
+S56:64:0:44:M512: OS/2:4::OS/2 4
+28672:64:0:44:M1460: OS/2:4::OS/2 Warp 4.0
+
+# ----------------- TOPS-20 -----------------
+
+# Another hardcore MSS, one of the ACK leakers hunted down.
+# XXX QUIRK 0:64:0:44:M1460:A:TOPS-20:version 7
+0:64:0:44:M1460: TOPS-20:7::TOPS-20 version 7
+
+# ----------------- FreeMiNT ----------------
+
+S44:255:0:44:M536: FreeMiNT:1:16A:FreeMiNT 1 patch 16A (Atari)
+
+# ------------------ AMIGA ------------------
+
+# XXX TCP option 12
+# S32:64:1:56:M*,N,N,S,N,N,?12:.:AMIGA:3.9 BB2 with Miami stack
+
+# ------------------ Plan9 ------------------
+
+65535:255:0:48:M1460,W0,N: Plan9:4::Plan9 edition 4
+
+# ----------------- AMIGAOS -----------------
+
+16384:64:1:48:M1560,N,N,S: AMIGAOS:3.9::AMIGAOS 3.9 BB2 MiamiDX
+
+###########################################
+# Appliance / embedded / other signatures #
+###########################################
+
+# ---------- Firewalls / routers ------------
+
+S12:64:1:44:M1460: @Checkpoint:::Checkpoint (unknown 1)
+S12:64:1:48:N,N,S,M1460: @Checkpoint:::Checkpoint (unknown 2)
+4096:32:0:44:M1460: ExtremeWare:4.x::ExtremeWare 4.x
+
+# XXX TCP option 12
+# S32:64:0:68:M512,N,W0,N,N,T,N,N,?12:.:Nokia:IPSO w/Checkpoint NG FP3
+# S16:64:0:68:M1024,N,W0,N,N,T,N,N,?12:.:Nokia:IPSO 3.7 build 026
+
+S4:64:1:60:W0,N,S,T,M1460: FortiNet:FortiGate:50:FortiNet FortiGate 50
+
+8192:64:1:44:M1460: Eagle:::Eagle Secure Gateway
+
+S52:128:1:48:M1260,N,N,N,N: LinkSys:WRV54G::LinkSys WRV54G VPN router
+
+
+
+# ------- Switches and other stuff ----------
+
+4128:255:0:44:M*: Cisco:::Cisco Catalyst 3500, 7500 etc
+S8:255:0:44:M*: Cisco:12008::Cisco 12008
+60352:128:1:64:M1460,N,W2,N,N,T,N,N,S: Alteon:ACEswitch::Alteon ACEswitch
+64512:128:1:44:M1370: Nortel:Contivity Client::Nortel Conectivity Client
+
+
+# ---------- Caches and whatnots ------------
+
+S4:64:1:52:M1460,N,N,S,N,W0: AOL:web cache::AOL web cache
+
+32850:64:1:64:N,W1,N,N,T,N,N,S,M*: NetApp:5.x::NetApp Data OnTap 5.x
+16384:64:1:64:M1460,N,N,S,N,W0,N: NetApp:5.3:1:NetApp 5.3.1
+65535:64:0:64:M1460,N,N,S,N,W*,N,N,T: NetApp:5.3-5.5::NetApp 5.3-5.5
+65535:64:0:60:M1460,N,W0,N,N,T: NetApp:CacheFlow::NetApp CacheFlow
+8192:64:1:64:M1460,N,N,S,N,W0,N,N,T: NetApp:5.2:1:NetApp NetCache 5.2.1
+20480:64:1:64:M1460,N,N,S,N,W0,N,N,T: NetApp:4.1::NetApp NetCache4.1
+
+65535:64:0:60:M1460,N,W0,N,N,T: CacheFlow:4.1::CacheFlow CacheOS 4.1
+8192:64:0:60:M1380,N,N,N,N,N,N,T: CacheFlow:1.1::CacheFlow CacheOS 1.1
+
+S4:64:0:48:M1460,N,N,S: Cisco:Content Engine::Cisco Content Engine
+
+27085:128:0:40:.: Dell:PowerApp cache::Dell PowerApp (Linux-based)
+
+65535:255:1:48:N,W1,M1460: Inktomi:crawler::Inktomi crawler
+S1:255:1:60:M1460,S,T,N,W0: LookSmart:ZyBorg::LookSmart ZyBorg
+
+16384:255:0:40:.: Proxyblocker:::Proxyblocker (what's this?)
+
+65535:255:0:48:M*,N,N,S: Redline:::Redline T|X 2200
+
+32696:128:0:40:M1460: Spirent:Avalanche::Spirent Web Avalanche HTTP benchmarking engine
+
+# ----------- Embedded systems --------------
+
+S9:255:0:44:M536: PalmOS:Tungsten:C:PalmOS Tungsten C
+S5:255:0:44:M536: PalmOS:3::PalmOS 3/4
+S5:255:0:44:M536: PalmOS:4::PalmOS 3/4
+S4:255:0:44:M536: PalmOS:3:5:PalmOS 3.5
+2948:255:0:44:M536: PalmOS:3:5:PalmOS 3.5.3 (Handera)
+S29:255:0:44:M536: PalmOS:5::PalmOS 5.0
+16384:255:0:44:M1398: PalmOS:5.2:Clie:PalmOS 5.2 (Clie)
+S14:255:0:44:M1350: PalmOS:5.2:Treo:PalmOS 5.2.1 (Treo)
+
+S23:64:1:64:N,W1,N,N,T,N,N,S,M1460: SymbianOS:7::SymbianOS 7
+
+8192:255:0:44:M1460: SymbianOS:6048::Symbian OS 6048 (Nokia 7650?)
+8192:255:0:44:M536: SymbianOS:9210::Symbian OS (Nokia 9210?)
+S22:64:1:56:M1460,T,S: SymbianOS:P800::Symbian OS ? (SE P800?)
+S36:64:1:56:M1360,T,S: SymbianOS:6600::Symbian OS 60xx (Nokia 6600?)
+
+
+# Perhaps S4?
+5840:64:1:60:M1452,S,T,N,W1: Zaurus:3.10::Zaurus 3.10
+
+32768:128:1:64:M1460,N,W0,N,N,T0,N,N,S: PocketPC:2002::PocketPC 2002
+
+S1:255:0:44:M346: Contiki:1.1:rc0:Contiki 1.1-rc0
+
+4096:128:0:44:M1460: Sega:Dreamcast:3.0:Sega Dreamcast Dreamkey 3.0
+T5:64:0:44:M536: Sega:Dreamcast:HKT-3020:Sega Dreamcast HKT-3020 (browser disc 51027)
+S22:64:1:44:M1460: Sony:PS2::Sony Playstation 2 (SOCOM?)
+
+S12:64:0:44:M1452: AXIS:5600:v5.64:AXIS Printer Server 5600 v5.64
+
+3100:32:1:44:M1460: Windows:CE:2.0:Windows CE 2.0
+
+####################
+# Fancy signatures #
+####################
+
+1024:64:0:40:.: *NMAP:syn scan:1:NMAP syn scan (1)
+2048:64:0:40:.: *NMAP:syn scan:2:NMAP syn scan (2)
+3072:64:0:40:.: *NMAP:syn scan:3:NMAP syn scan (3)
+4096:64:0:40:.: *NMAP:syn scan:4:NMAP syn scan (4)
+
+# Requires quirks support
+# 1024:64:0:40:.:A:*NMAP:TCP sweep probe (1)
+# 2048:64:0:40:.:A:*NMAP:TCP sweep probe (2)
+# 3072:64:0:40:.:A:*NMAP:TCP sweep probe (3)
+# 4096:64:0:40:.:A:*NMAP:TCP sweep probe (4)
+
+1024:64:0:60:W10,N,M265,T: *NMAP:OS:1:NMAP OS detection probe (1)
+2048:64:0:60:W10,N,M265,T: *NMAP:OS:2:NMAP OS detection probe (2)
+3072:64:0:60:W10,N,M265,T: *NMAP:OS:3:NMAP OS detection probe (3)
+4096:64:0:60:W10,N,M265,T: *NMAP:OS:4:NMAP OS detection probe (4)
+
+32767:64:0:40:.: *NAST:::NASTsyn scan
+
+# Requires quirks support
+# 12345:255:0:40:.:A:-p0f:sendsyn utility
+
+
+#####################################
+# Generic signatures - just in case #
+#####################################
+
+#*:64:1:60:M*,N,W*,N,N,T: @FreeBSD:4.0-4.9::FreeBSD 4.x/5.x
+#*:64:1:60:M*,N,W*,N,N,T: @FreeBSD:5.0-5.1::FreeBSD 4.x/5.x
+
+*:128:1:52:M*,N,W0,N,N,S: @Windows:XP:RFC1323:Windows XP/2000 (RFC1323 no tstamp)
+*:128:1:52:M*,N,W0,N,N,S: @Windows:2000:RFC1323:Windows XP/2000 (RFC1323 no tstamp)
+*:128:1:52:M*,N,W*,N,N,S: @Windows:XP:RFC1323:Windows XP/2000 (RFC1323 no tstamp)
+*:128:1:52:M*,N,W*,N,N,S: @Windows:2000:RFC1323:Windows XP/2000 (RFC1323 no tstamp)
+*:128:1:64:M*,N,W0,N,N,T0,N,N,S: @Windows:XP:RFC1323:Windows XP/2000 (RFC1323)
+*:128:1:64:M*,N,W0,N,N,T0,N,N,S: @Windows:2000:RFC1323:Windows XP/2000 (RFC1323)
+*:128:1:64:M*,N,W*,N,N,T0,N,N,S: @Windows:XP:RFC1323:Windows XP (RFC1323, w+)
+*:128:1:48:M536,N,N,S: @Windows:98::Windows 98
+*:128:1:48:M*,N,N,S: @Windows:XP::Windows XP/2000
+*:128:1:48:M*,N,N,S: @Windows:2000::Windows XP/2000
+
+
diff --git a/src/etc/pfSense.obsoletedfiles b/src/etc/pfSense.obsoletedfiles
new file mode 100644
index 0000000..cae1bcf
--- /dev/null
+++ b/src/etc/pfSense.obsoletedfiles
@@ -0,0 +1,1018 @@
+/.cvsignore
+/.history
+/RELENG_1_2
+/bin/rcp
+/boot/device.hints_wrap
+/dist
+/etc/auth.conf
+/etc/current-supfile
+/etc/defaults/pccard.conf
+/etc/freebsd-update.conf
+/etc/gnats
+/etc/hostid
+/etc/hosts.lpd
+/etc/inc/cmd_chain.inc
+/etc/inc/lb.inc
+/etc/inc/m0n0
+/etc/inc/regdomain.inc
+/etc/inc/sysctl.inc
+/etc/inc/array_intersect_key.inc
+/etc/isdn
+/etc/locate.rc
+/etc/mail.rc
+/etc/manpath.config
+/etc/mtree/BSD.x11-4.dist
+/etc/mtree/BSD.x11.dist
+/etc/ntp.conf
+/etc/pccard.conf
+/etc/periodic/daily/130.clean-msgs
+/etc/periodic/daily/140.clean-rwho
+/etc/periodic/daily/150.clean-hoststat
+/etc/periodic/daily/220.backup-pkgdb
+/etc/periodic/daily/300.calendar
+/etc/periodic/daily/405.status-ata-raid
+/etc/periodic/daily/430.status-rwho
+/etc/periodic/daily/440.status-mailq
+/etc/periodic/daily/460.status-mail-rejects
+/etc/periodic/daily/470.status-named
+/etc/periodic/daily/480.status-ntpd
+/etc/periodic/daily/500.queuerun
+/etc/periodic/security/460.chkportsum
+/etc/periodic/security/510.ipfdenied
+/etc/periodic/security/600.ip6fwdenied
+/etc/periodic/security/650.ip6fwlimit
+/etc/periodic/weekly/120.clean-kvmdb
+/etc/periodic/weekly/310.locate
+/etc/periodic/weekly/320.whatis
+/etc/periodic/weekly/330.catman
+/etc/periodic/weekly/400.status-pkg
+/etc/pf.conf
+/etc/pfSense.mtree
+/etc/phpshellsessions/cvssync
+/etc/phpshellsessions/restartftphelper
+/etc/ping_hosts.sh
+/etc/portsnap.conf
+/etc/rc.d/amd
+/etc/rc.d/auto_linklocal
+/etc/rc.d/bluetooth
+/etc/rc.d/bthidd
+/etc/rc.d/early.sh
+/etc/rc.d/encswap
+/etc/rc.d/hcsecd
+/etc/rc.d/idmapd
+/etc/rc.d/ike
+/etc/rc.d/ip6fw
+/etc/rc.d/ipxrouted
+/etc/rc.d/isdnd
+/etc/rc.d/kerberos
+/etc/rc.d/kernel
+/etc/rc.d/lpd
+/etc/rc.d/named
+/etc/rc.d/network_ipv6
+/etc/rc.d/nfslocking
+/etc/rc.d/nfsserver
+/etc/rc.d/ntpd
+/etc/rc.d/othermta
+/etc/rc.d/pccard
+/etc/rc.d/pcvt
+/etc/rc.d/ramdisk
+/etc/rc.d/ramdisk-own
+/etc/rc.d/rootmfs
+/etc/rc.d/rwho
+/etc/rc.d/sendmail
+/etc/rc.d/swap1
+/etc/rc.d/usbd
+/etc/rc.d/uzip
+/etc/rc.dyndns.storecache
+/etc/rc.firewall6
+/etc/rc.initial_firmware_update
+/etc/rc.linkup.sh
+/etc/rc.parse-isc-dhcpd
+/etc/rc.sendmail
+/etc/rrdtool.core
+/etc/ttys_wrap
+/etc/usbd.conf
+/etc/version_base
+/etc/version_kernel
+/kernels
+/lib/libalias.so.5
+/lib/libalias.so.6
+/lib/libbegemot.so.2
+/lib/libbegemot.so.3
+/lib/libbsdxml.so.2
+/lib/libbsdxml.so.3
+/lib/libbsnmp.so.3
+/lib/libbsnmp.so.4
+/lib/libbsnmp.so.5
+/lib/libc.so.6
+/lib/libcam.so.4
+/lib/libcam.so.5
+/lib/libcrypt.so.3
+/lib/libcrypt.so.4
+/lib/libcrypto.so.4
+/lib/libcrypto.so.5
+/lib/libcrypto.so.6
+/lib/libdevstat.so.5
+/lib/libdevstat.so.6
+/lib/libedit.so.5
+/lib/libedit.so.6
+/lib/libgeom.so.3
+/lib/libgeom.so.4
+/lib/libipsec.so.2
+/lib/libipsec.so.3
+/lib/libipx.so.3
+/lib/libkiconv.so.2
+/lib/libkiconv.so.3
+/lib/libkvm.so.3
+/lib/libkvm.so.4
+/lib/libkvm.so.5
+/lib/libm.so.4
+/lib/libmd.so.3
+/lib/libmd.so.4
+/lib/libmd.so.5
+/lib/libncurses.so.6
+/lib/libncurses.so.7
+/lib/libncursesw.so.7
+/lib/libpcap.so.4
+/lib/libpcap.so.5
+/lib/libpcap.so.7
+/lib/libpthread.so.2
+/lib/libreadline.so.6
+/lib/libreadline.so.7
+/lib/libsbuf.so.3
+/lib/libsbuf.so.4
+/lib/libsbuf.so.5
+/lib/libufs.so.3
+/lib/libufs.so.4
+/lib/libufs.so.5
+/lib/libutil.so.5
+/lib/libutil.so.7
+/lib/libutil.so.8
+/lib/libz.so.3
+/lib/libz.so.4
+/lib/libz.so.5
+/root/latest.tgz.sha256
+/sbin/atacontrol
+/sbin/idmapd
+/sbin/ip6fw
+/sbin/mount_devfs
+/sbin/mount_fdescfs
+/sbin/mount_linsysfs
+/sbin/mount_newnfs
+/sbin/mount_nfs4
+/sbin/mount_procfs
+/sbin/ppp-script
+/scripts/dev_bootstrap.sh
+/touch
+/usr/X11R6
+/usr/bin/addftinfo
+/usr/bin/addr2line
+/usr/bin/afmtodit
+/usr/bin/ar
+/usr/bin/as
+/usr/bin/byacc
+/usr/bin/c89
+/usr/bin/c99
+/usr/bin/cc
+/usr/bin/cpp
+/usr/bin/dig
+/usr/bin/eqn
+/usr/bin/flex
+/usr/bin/flex++
+/usr/bin/gcc
+/usr/bin/gnu-ar
+/usr/bin/gnu-ranlib
+/usr/bin/gprof
+/usr/bin/grn
+/usr/bin/grodvi
+/usr/bin/groff
+/usr/bin/grog
+/usr/bin/grolbp
+/usr/bin/grolj4
+/usr/bin/grops
+/usr/bin/grotty
+/usr/bin/hpftodit
+/usr/bin/indxbib
+/usr/bin/install-info
+/usr/bin/ld
+/usr/bin/lex
+/usr/bin/lex++
+/usr/bin/lint
+/usr/bin/lkbib
+/usr/bin/lookbib
+/usr/bin/mmroff
+/usr/bin/neqn
+/usr/bin/nm
+/usr/bin/nroff
+/usr/bin/nslookup
+/usr/bin/nsupdate
+/usr/bin/ntpq
+/usr/bin/objcopy
+/usr/bin/objdump
+/usr/bin/pfbtops
+/usr/bin/pic
+/usr/bin/post-grohtml
+/usr/bin/pre-grohtml
+/usr/bin/psroff
+/usr/bin/ranlib
+/usr/bin/readelf
+/usr/bin/refer
+/usr/bin/rlogin
+/usr/bin/rsh
+/usr/bin/size
+/usr/bin/soelim
+/usr/bin/strings
+/usr/bin/strip
+/usr/bin/tbl
+/usr/bin/texindex
+/usr/bin/tfmtodit
+/usr/bin/troff
+/usr/bin/yacc
+/usr/bin/yyfix
+/usr/lib/libarchive.so.2
+/usr/lib/libarchive.so.4
+/usr/lib/libarchive.so.5
+/usr/lib/libasn1.so.10
+/usr/lib/libbsm.so.1
+/usr/lib/libbsm.so.2
+/usr/lib/libbz2.so.2
+/usr/lib/libbz2.so.3
+/usr/lib/libc_pic.a
+/usr/lib/libc_r.a
+/usr/lib/libc_r.so
+/usr/lib/libc_r.so.6
+/usr/lib/libcalendar.so.3
+/usr/lib/libcalendar.so.4
+/usr/lib/libcom_err.so.3
+/usr/lib/libcom_err.so.4
+/usr/lib/libdevinfo.so.3
+/usr/lib/libdevinfo.so.4
+/usr/lib/libdialog.so.5
+/usr/lib/libdialog.so.6
+/usr/lib/libdialog.so.7
+/usr/lib/libdisk.a
+/usr/lib/libdwarf.so.1
+/usr/lib/libdwarf.so.2
+/usr/lib/libexec
+/usr/lib/libexec/ftp-proxy
+/usr/lib/libfetch.so.4
+/usr/lib/libfetch.so.5
+/usr/lib/libfl.a
+/usr/lib/libform.so.3
+/usr/lib/libform.so.4
+/usr/lib/libformw.so.4
+/usr/lib/libftpio.a
+/usr/lib/libftpio.so
+/usr/lib/libftpio.so.6
+/usr/lib/libftpio.so.7
+/usr/lib/libftpio.so.8
+/usr/lib/libgcc_pic.a
+/usr/lib/libgnuregex.so.3
+/usr/lib/libgnuregex.so.4
+/usr/lib/libheimntlm.so.10
+/usr/lib/libhistory.so.6
+/usr/lib/libhistory.so.7
+/usr/lib/libhx509.so.10
+/usr/lib/libipx.a
+/usr/lib/libipx.so
+/usr/lib/libkeycap.a
+/usr/lib/libkrb5.so.10
+/usr/lib/libkse.so
+/usr/lib/libkse.so.3
+/usr/lib/libl.a
+/usr/lib/libln.a
+/usr/lib/libmagic.so.2
+/usr/lib/libmagic.so.3
+/usr/lib/libmemstat.so.1
+/usr/lib/libmemstat.so.2
+/usr/lib/libmenu.so.3
+/usr/lib/libmenu.so.4
+/usr/lib/libmenuw.so.4
+/usr/lib/libmp.so.5
+/usr/lib/libmp.so.6
+/usr/lib/libmytinfo.a
+/usr/lib/libmytinfo.so
+/usr/lib/libncp.a
+/usr/lib/libncp.so
+/usr/lib/libncp.so.2
+/usr/lib/libnetgraph.so.2
+/usr/lib/libnetgraph.so.3
+/usr/lib/libopie.so.4
+/usr/lib/libopie.so.5
+/usr/lib/libopie.so.6
+/usr/lib/libpam.so.3
+/usr/lib/libpam.so.4
+/usr/lib/libpanel.so.3
+/usr/lib/libpanel.so.4
+/usr/lib/libpanelw.so.4
+/usr/lib/libpcap.so.4
+/usr/lib/libpmc.so.3
+/usr/lib/libpmc.so.4
+/usr/lib/libproc.so.1
+/usr/lib/libpthread.so.2
+/usr/lib/libradius.so.2
+/usr/lib/libradius.so.3
+/usr/lib/libroken.so.10
+/usr/lib/librpcsvc.so.3
+/usr/lib/librpcsvc.so.4
+/usr/lib/librtld_db.so.1
+/usr/lib/libsmb.so.2
+/usr/lib/libsmb.so.3
+/usr/lib/libssh.a
+/usr/lib/libssh.so
+/usr/lib/libssh.so.3
+/usr/lib/libssh.so.4
+/usr/lib/libssh.so.5
+/usr/lib/libssl.so.4
+/usr/lib/libssl.so.5
+/usr/lib/libssl.so.6
+/usr/lib/libstdc++.a
+/usr/lib/libstdc++.so
+/usr/lib/libstdc++.so.5
+/usr/lib/libstdc++.so.6
+/usr/lib/libsupc++.a
+/usr/lib/libtacplus.so.2
+/usr/lib/libtacplus.so.3
+/usr/lib/libtacplus.so.4
+/usr/lib/libthr.so.2
+/usr/lib/libthread_db.so.2
+/usr/lib/libugidfw.so.2
+/usr/lib/libugidfw.so.3
+/usr/lib/libusb.so.2
+/usr/lib/libusbhid.so.3
+/usr/lib/libvgl.so.4
+/usr/lib/libvgl.so.5
+/usr/lib/libwrap.so.4
+/usr/lib/libwrap.so.5
+/usr/lib/pam_chroot.so.3
+/usr/lib/pam_chroot.so.4
+/usr/lib/pam_deny.so.3
+/usr/lib/pam_deny.so.4
+/usr/lib/pam_echo.so.3
+/usr/lib/pam_echo.so.4
+/usr/lib/pam_exec.so.3
+/usr/lib/pam_exec.so.4
+/usr/lib/pam_ftpusers.so.3
+/usr/lib/pam_ftpusers.so.4
+/usr/lib/pam_group.so.3
+/usr/lib/pam_group.so.4
+/usr/lib/pam_guest.so.3
+/usr/lib/pam_guest.so.4
+/usr/lib/pam_lastlog.so.3
+/usr/lib/pam_lastlog.so.4
+/usr/lib/pam_login_access.so.3
+/usr/lib/pam_login_access.so.4
+/usr/lib/pam_nologin.so.3
+/usr/lib/pam_nologin.so.4
+/usr/lib/pam_opie.so.3
+/usr/lib/pam_opie.so.4
+/usr/lib/pam_opieaccess.so.3
+/usr/lib/pam_opieaccess.so.4
+/usr/lib/pam_passwdqc.so.3
+/usr/lib/pam_passwdqc.so.4
+/usr/lib/pam_permit.so.3
+/usr/lib/pam_permit.so.4
+/usr/lib/pam_radius.so.3
+/usr/lib/pam_radius.so.4
+/usr/lib/pam_rhosts.so.3
+/usr/lib/pam_rhosts.so.4
+/usr/lib/pam_rootok.so.3
+/usr/lib/pam_rootok.so.4
+/usr/lib/pam_securetty.so.3
+/usr/lib/pam_securetty.so.4
+/usr/lib/pam_self.so.3
+/usr/lib/pam_self.so.4
+/usr/lib/pam_ssh.so.3
+/usr/lib/pam_ssh.so.4
+/usr/lib/pam_tacplus.so.3
+/usr/lib/pam_tacplus.so.4
+/usr/lib/pam_unix.so.3
+/usr/lib/pam_unix.so.4
+/usr/lib/private/libunbound.a
+/usr/lib/private/libunbound.so
+/usr/lib/private/libunbound.so.5
+/usr/lib/private/libunbound_p.a
+/usr/lib/snmp_bridge.so.5
+/usr/lib/snmp_hostres.so.4
+/usr/lib/snmp_hostres.so.5
+/usr/lib/snmp_mibII.so.4
+/usr/lib/snmp_mibII.so.5
+/usr/lib/snmp_netgraph.so.4
+/usr/lib/snmp_netgraph.so.5
+/usr/lib/snmp_pf.so.4
+/usr/lib/snmp_pf.so.5
+/usr/libexec/catman.local
+/usr/libexec/cc1
+/usr/libexec/lint1
+/usr/libexec/lint2
+/usr/libexec/make_index
+/usr/local/bin/3gstat
+/usr/local/bin/atareinit
+/usr/local/bin/bsdiff
+/usr/local/bin/bspatch
+/usr/local/bin/c_rehash
+/usr/local/bin/checkreload.sh
+/usr/local/bin/ez-ipupdate
+/usr/local/bin/kill_ghosts.sh
+/usr/local/bin/l2tpd
+/usr/local/bin/lua
+/usr/local/bin/luac
+/usr/local/bin/msntp
+/usr/local/bin/ntp-wait
+/usr/local/bin/ntpd
+/usr/local/bin/ntpdate
+/usr/local/bin/ntpdc
+/usr/local/bin/ntpq
+/usr/local/bin/ntptime
+/usr/local/bin/ntptrace
+/usr/local/bin/openssl
+/usr/local/bin/sntp
+/usr/local/bin/spawn-fcgi
+/usr/local/bin/tickadj
+/usr/local/bin/verifysig
+/usr/local/include
+/usr/local/info
+/usr/local/lib/engines
+/usr/local/lib/engines/lib4758cca.so
+/usr/local/lib/engines/libaep.so
+/usr/local/lib/engines/libatalla.so
+/usr/local/lib/engines/libcapi.so
+/usr/local/lib/engines/libchil.so
+/usr/local/lib/engines/libcswift.so
+/usr/local/lib/engines/libgmp.so
+/usr/local/lib/engines/libgost.so
+/usr/local/lib/engines/libnuron.so
+/usr/local/lib/engines/libpadlock.so
+/usr/local/lib/engines/libsureware.so
+/usr/local/lib/engines/libubsec.so
+/usr/local/lib/event2
+/usr/local/lib/event2/libevent_core-2.0.so.6
+/usr/local/lib/event2/libevent_pthreads-2.0.so.6
+/usr/local/lib/libcrypto.a
+/usr/local/lib/libcrypto.so
+/usr/local/lib/libcrypto.so.8
+/usr/local/lib/libcurl.so.3
+/usr/local/lib/libcurl.so.5
+/usr/local/lib/libcurl.so.6
+/usr/local/lib/libczmq.so.0
+/usr/local/lib/libczmq.so.1
+/usr/local/lib/libdns_sd.so.1
+/usr/local/lib/libevent-1.2.so
+/usr/local/lib/libevent-1.3e.so.1
+/usr/local/lib/libevent-1.4.so.4
+/usr/local/lib/libevtlog.so.0
+/usr/local/lib/libfreetype.so.9
+/usr/local/lib/libglib-2.0.so.0
+/usr/local/lib/libgmodule-2.0.so.0
+/usr/local/lib/libgthread-2.0.so.0
+/usr/local/lib/libhistory.so.5
+/usr/local/lib/libiconv.so.3
+/usr/local/lib/libidn.so.17
+/usr/local/lib/libipsec.so
+/usr/local/lib/libipsec.so.0
+/usr/local/lib/liblber-2.4.so.3
+/usr/local/lib/liblber-2.4.so.7
+/usr/local/lib/liblber-2.4.so.8
+/usr/local/lib/libldap-2.4.so.3
+/usr/local/lib/libldap-2.4.so.7
+/usr/local/lib/libldap-2.4.so.8
+/usr/local/lib/liblua.so
+/usr/local/lib/liblua.so.5
+/usr/local/lib/liblualib.so
+/usr/local/lib/liblualib.so.5
+/usr/local/lib/libmcrypt.so.8
+/usr/local/lib/libmhash.so.2
+/usr/local/lib/libpcre.la
+/usr/local/lib/libpcre.so.0
+/usr/local/lib/libpcrecpp.la
+/usr/local/lib/libpcreposix.la
+/usr/local/lib/libpng.so.5
+/usr/local/lib/libpng.so.6
+/usr/local/lib/libpng15.so.15
+/usr/local/lib/libracoon.so.0
+/usr/local/lib/libreadline.so.5
+/usr/local/lib/libsqlite3.so.8
+/usr/local/lib/libssl.a
+/usr/local/lib/libssl.so
+/usr/local/lib/libssl.so.8
+/usr/local/lib/libsyslog-ng-3.3.5.so
+/usr/local/lib/libsyslog-ng-3.3.8.so
+/usr/local/lib/libsyslog-ng-3.3.9.so
+/usr/local/lib/libsyslog-ng-3.4.7.so
+/usr/local/lib/libsyslog-ng-3.5.4.1.so
+/usr/local/lib/libxml2.so.5
+/usr/local/lib/lighttpd/mod_access.a
+/usr/local/lib/lighttpd/mod_access.la
+/usr/local/lib/lighttpd/mod_accesslog.a
+/usr/local/lib/lighttpd/mod_accesslog.la
+/usr/local/lib/lighttpd/mod_alias.a
+/usr/local/lib/lighttpd/mod_alias.la
+/usr/local/lib/lighttpd/mod_auth.a
+/usr/local/lib/lighttpd/mod_auth.la
+/usr/local/lib/lighttpd/mod_cgi.a
+/usr/local/lib/lighttpd/mod_cgi.la
+/usr/local/lib/lighttpd/mod_cml.a
+/usr/local/lib/lighttpd/mod_cml.la
+/usr/local/lib/lighttpd/mod_compress.a
+/usr/local/lib/lighttpd/mod_compress.la
+/usr/local/lib/lighttpd/mod_dirlisting.a
+/usr/local/lib/lighttpd/mod_dirlisting.la
+/usr/local/lib/lighttpd/mod_evasive.a
+/usr/local/lib/lighttpd/mod_evasive.la
+/usr/local/lib/lighttpd/mod_evhost.a
+/usr/local/lib/lighttpd/mod_evhost.la
+/usr/local/lib/lighttpd/mod_expire.a
+/usr/local/lib/lighttpd/mod_expire.la
+/usr/local/lib/lighttpd/mod_fastcgi.a
+/usr/local/lib/lighttpd/mod_fastcgi.la
+/usr/local/lib/lighttpd/mod_flv_streaming.a
+/usr/local/lib/lighttpd/mod_flv_streaming.la
+/usr/local/lib/lighttpd/mod_indexfile.a
+/usr/local/lib/lighttpd/mod_indexfile.la
+/usr/local/lib/lighttpd/mod_mysql_vhost.a
+/usr/local/lib/lighttpd/mod_mysql_vhost.la
+/usr/local/lib/lighttpd/mod_proxy.a
+/usr/local/lib/lighttpd/mod_proxy.la
+/usr/local/lib/lighttpd/mod_redirect.a
+/usr/local/lib/lighttpd/mod_redirect.la
+/usr/local/lib/lighttpd/mod_rewrite.a
+/usr/local/lib/lighttpd/mod_rewrite.la
+/usr/local/lib/lighttpd/mod_rrdtool.a
+/usr/local/lib/lighttpd/mod_rrdtool.la
+/usr/local/lib/lighttpd/mod_scgi.a
+/usr/local/lib/lighttpd/mod_scgi.la
+/usr/local/lib/lighttpd/mod_secdownload.a
+/usr/local/lib/lighttpd/mod_secdownload.la
+/usr/local/lib/lighttpd/mod_setenv.a
+/usr/local/lib/lighttpd/mod_setenv.la
+/usr/local/lib/lighttpd/mod_simple_vhost.a
+/usr/local/lib/lighttpd/mod_simple_vhost.la
+/usr/local/lib/lighttpd/mod_ssi.a
+/usr/local/lib/lighttpd/mod_ssi.la
+/usr/local/lib/lighttpd/mod_staticfile.a
+/usr/local/lib/lighttpd/mod_staticfile.la
+/usr/local/lib/lighttpd/mod_status.a
+/usr/local/lib/lighttpd/mod_status.la
+/usr/local/lib/lighttpd/mod_trigger_b4_dl.a
+/usr/local/lib/lighttpd/mod_trigger_b4_dl.la
+/usr/local/lib/lighttpd/mod_userdir.a
+/usr/local/lib/lighttpd/mod_userdir.la
+/usr/local/lib/lighttpd/mod_usertrack.a
+/usr/local/lib/lighttpd/mod_usertrack.la
+/usr/local/lib/lighttpd/mod_webdav.a
+/usr/local/lib/lighttpd/mod_webdav.la
+/usr/local/lib/mysql/libmysqlclient.so.15
+/usr/local/lib/mysql/libmysqlclient.so.18
+/usr/local/lib/olsrd_dot_draw.so.0.3
+/usr/local/lib/olsrd_dyn_gw.so.0.4
+/usr/local/lib/olsrd_dyn_gw_plain.so.0.4
+/usr/local/lib/olsrd_httpinfo.so.0.1
+/usr/local/lib/olsrd_mini.so.0.1
+/usr/local/lib/olsrd_nameservice.so.0.2
+/usr/local/lib/olsrd_nameservice.so.0.3
+/usr/local/lib/olsrd_pgraph.so.1.1
+/usr/local/lib/olsrd_power.so.0.3
+/usr/local/lib/olsrd_secure.so.0.5
+/usr/local/lib/olsrd_txtinfo.so.0.1
+/usr/local/lib/php/20060613
+/usr/local/lib/php/20090626
+/usr/local/lib/php/extensions/no-debug-non-zts-20020429
+/usr/local/lib/snmp_regex.la
+/usr/local/lib/snmp_ucd.a
+/usr/local/lib/snmp_ucd.la
+/usr/local/libdata/pkgconfig/libcrypto.pc
+/usr/local/libdata/pkgconfig/libssl.pc
+/usr/local/libdata/pkgconfig/openssl.pc
+/usr/local/livefs
+/usr/local/livefs/lib
+/usr/local/man
+/usr/local/openssl/misc
+/usr/local/openssl/misc/CA.pl
+/usr/local/openssl/misc/CA.sh
+/usr/local/openssl/misc/c_hash
+/usr/local/openssl/misc/c_info
+/usr/local/openssl/misc/c_issuer
+/usr/local/openssl/misc/c_name
+/usr/local/openssl/misc/tsget
+/usr/local/openssl/openssl.cnf.sample
+/usr/local/pkg/carp.xml
+/usr/local/pkg/carp_settings.xml
+/usr/local/pkg/olsrd.xml
+/usr/local/pkg/openntpd.inc
+/usr/local/pkg/openntpd.xml
+/usr/local/pkg/openvpn.xml
+/usr/local/pkg/openvpn_cli.xml
+/usr/local/pkg/openvpn_csc.xml
+/usr/local/pkg/routed
+/usr/local/pkg/routed.inc
+/usr/local/pkg/routed.xml
+/usr/local/pkg/routed/routed.inc
+/usr/local/pkg/routed/routed.xml
+/usr/local/pkg/sasyncd.xml
+/usr/local/sbin/atareinit
+/usr/local/sbin/bpalogin
+/usr/local/sbin/cvs_sync.sh
+/usr/local/sbin/dnsextd
+/usr/local/sbin/dnswatch
+/usr/local/sbin/env4801
+/usr/local/sbin/fping
+/usr/local/sbin/ftpsesame
+/usr/local/sbin/grub-install1
+/usr/local/sbin/ipfw_context
+/usr/local/sbin/kbdcheck
+/usr/local/sbin/mdnsd
+/usr/local/sbin/mini_httpd
+/usr/local/sbin/mpd
+/usr/local/sbin/olsrd
+/usr/local/sbin/pbi_makeport_chroot
+/usr/local/sbin/pbi_pbid
+/usr/local/sbin/pftpx
+/usr/local/sbin/racoon
+/usr/local/sbin/racoon_watch.sh
+/usr/local/sbin/racoonctl
+/usr/local/sbin/reset_slbd.sh
+/usr/local/sbin/sasyncd
+/usr/local/sbin/setkey
+/usr/local/sbin/slbd
+/usr/local/sbin/slbd.sh
+/usr/local/sbin/syslog-ng
+/usr/local/share/aclocal
+/usr/local/share/dict
+/usr/local/share/doc
+/usr/local/share/emacs
+/usr/local/share/examples
+/usr/local/share/java
+/usr/local/share/locale/af
+/usr/local/share/locale/am
+/usr/local/share/locale/ar
+/usr/local/share/locale/az
+/usr/local/share/locale/bg
+/usr/local/share/locale/bn
+/usr/local/share/locale/br
+/usr/local/share/locale/bs
+/usr/local/share/locale/cy
+/usr/local/share/locale/da
+/usr/local/share/locale/de
+/usr/local/share/locale/dk
+/usr/local/share/locale/ee
+/usr/local/share/locale/en_CA
+/usr/local/share/locale/en_GB
+/usr/local/share/locale/es
+/usr/local/share/locale/es_ES
+/usr/local/share/locale/es_MX
+/usr/local/share/locale/et
+/usr/local/share/locale/eu
+/usr/local/share/locale/fa
+/usr/local/share/locale/fr
+/usr/local/share/locale/ga
+/usr/local/share/locale/gu
+/usr/local/share/locale/he
+/usr/local/share/locale/hi
+/usr/local/share/locale/hr
+/usr/local/share/locale/hu
+/usr/local/share/locale/id
+/usr/local/share/locale/is
+/usr/local/share/locale/it
+/usr/local/share/locale/ka
+/usr/local/share/locale/kn
+/usr/local/share/locale/lt
+/usr/local/share/locale/lv
+/usr/local/share/locale/mk
+/usr/local/share/locale/ml
+/usr/local/share/locale/mn
+/usr/local/share/locale/ms
+/usr/local/share/locale/mt
+/usr/local/share/locale/nb
+/usr/local/share/locale/nl
+/usr/local/share/locale/or
+/usr/local/share/locale/pa
+/usr/local/share/locale/pt_BR.ISO8858-1
+/usr/local/share/locale/pt_PT
+/usr/local/share/locale/ru
+/usr/local/share/locale/sq
+/usr/local/share/locale/sr@Latn
+/usr/local/share/locale/sv
+/usr/local/share/locale/ta
+/usr/local/share/locale/th
+/usr/local/share/locale/vi
+/usr/local/share/locale/wa
+/usr/local/share/locale/zh
+/usr/local/share/locale/zh_CN.GB2312
+/usr/local/share/locale/zh_TW.Big5
+/usr/local/share/misc
+/usr/local/share/nls
+/usr/local/share/sgml
+/usr/local/share/skel
+/usr/local/share/xml
+/usr/local/www/auto_complete_helper.js
+/usr/local/www/csrf/csrf-secret.php
+/usr/local/www/datetimepicker.js
+/usr/local/www/dfly-pg.gif
+/usr/local/www/dfuife.cgi
+/usr/local/www/dfuife.css
+/usr/local/www/dfuife.js
+/usr/local/www/diag_dhcp_leases.php
+/usr/local/www/diag_logs_slbd.php
+/usr/local/www/diag_showbogons.php
+/usr/local/www/dom-drag.js
+/usr/local/www/draglist.js
+/usr/local/www/dtree.js
+/usr/local/www/easyrule.inc
+/usr/local/www/exec_raw.php
+/usr/local/www/filter_log.inc
+/usr/local/www/filterparser.php
+/usr/local/www/firewall_nat_server.php
+/usr/local/www/firewall_nat_server_edit.php
+/usr/local/www/firewall_rules_schedule_logic.php
+/usr/local/www/firewall_shaper_edit.php
+/usr/local/www/firewall_shaper_queues_edit.php
+/usr/local/www/fred.png
+/usr/local/www/fred-bg.png
+/usr/local/www/ifstats.cgi
+/usr/local/www/includes/javascript.inc.php
+/usr/local/www/includes/log.inc.php
+/usr/local/www/includes/sajax.class.php
+/usr/local/www/index.html
+/usr/local/www/installer/index.php
+/usr/local/www/installer/installer.php
+/usr/local/www/installer
+/usr/local/www/interfaces_lan.php
+/usr/local/www/interfaces_opt.php
+/usr/local/www/interfaces_ppp.php
+/usr/local/www/interfaces_ppp_edit.php
+/usr/local/www/interfaces_wan.php
+/usr/local/www/interfaces_wlan.inc
+/usr/local/www/interfaces_wlan_scan.php
+/usr/local/www/ip_helper.js
+/usr/local/www/javascript/datetimepicker.js
+/usr/local/www/javascript/diag_backup
+/usr/local/www/javascript/diag_backup/diag_backup.js
+/usr/local/www/javascript/firewall_rules_edit.js
+/usr/local/www/javascript/index/sajax.js
+/usr/local/www/javascript/jquery.js
+/usr/local/www/javascript/jquery/jquery-ui.custom.css
+/usr/local/www/javascript/jquery/jquery-ui.custom.min.js
+/usr/local/www/javascript/NetUtils.js
+/usr/local/www/javascript/scriptaculous/CHANGELOG
+/usr/local/www/javascript/scriptaculous/MIT-LICENSE
+/usr/local/www/javascript/system_advanced
+/usr/local/www/javascript/system_advanced/system_advanced.js
+/usr/local/www/load_balancer_relay_action.php
+/usr/local/www/load_balancer_relay_action_edit.php
+/usr/local/www/load_balancer_relay_protocol.php
+/usr/local/www/load_balancer_relay_protocol_edit.php
+/usr/local/www/m0n0
+/usr/local/www/niftyjsCode.js
+/usr/local/www/pool.js
+/usr/local/www/preload.php
+/usr/local/www/progress.php
+/usr/local/www/row_helper.js
+/usr/local/www/row_helper_dynamic.js
+/usr/local/www/row_toggle.js
+/usr/local/www/rrdtool.core
+/usr/local/www/sajax
+/usr/local/www/sajax/index.sajax.php
+/usr/local/www/services_captiveportal_users.php
+/usr/local/www/services_captiveportal_users_edit.php
+/usr/local/www/services_proxyarp.php
+/usr/local/www/services_proxyarp_edit.php
+/usr/local/www/services_usermanager.php
+/usr/local/www/status_slbd_pool.php
+/usr/local/www/status_slbd_vs.php
+/usr/local/www/system_advanced.php
+/usr/local/www/system_advanced_create_certs.php
+/usr/local/www/system_usermanager_addcert.php
+/usr/local/www/themes/_orange-flow
+/usr/local/www/themes/metallic/images/button_left.gif
+/usr/local/www/themes/metallic/images/button_mid.gif
+/usr/local/www/themes/metallic/images/button_right.gif
+/usr/local/www/themes/metallic/images/misc/plogo_0.gif
+/usr/local/www/themes/metallic/images/misc/plogo_1.gif
+/usr/local/www/themes/metallic/images/misc/plogo_10.gif
+/usr/local/www/themes/metallic/images/misc/plogo_2.gif
+/usr/local/www/themes/metallic/images/misc/plogo_3.gif
+/usr/local/www/themes/metallic/images/misc/plogo_4.gif
+/usr/local/www/themes/metallic/images/misc/plogo_5.gif
+/usr/local/www/themes/metallic/images/misc/plogo_6.gif
+/usr/local/www/themes/metallic/images/misc/plogo_7.gif
+/usr/local/www/themes/metallic/images/misc/plogo_8.gif
+/usr/local/www/themes/metallic/images/misc/plogo_9.gif
+/usr/local/www/themes/nervecenter/images/button_left.gif
+/usr/local/www/themes/nervecenter/images/button_mid.gif
+/usr/local/www/themes/nervecenter/images/button_right.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_0.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_1.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_10.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_2.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_3.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_4.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_5.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_6.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_7.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_8.gif
+/usr/local/www/themes/nervecenter/images/misc/plogo_9.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_0.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_1.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_10.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_2.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_3.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_4.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_5.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_6.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_7.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_8.gif
+/usr/local/www/themes/pfsense-dropdown/images/misc/plogo_9.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_0.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_1.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_10.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_2.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_3.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_4.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_5.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_6.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_7.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_8.gif
+/usr/local/www/themes/pfsense/images/misc/plogo_9.gif
+/usr/local/www/themes/pfsense_ng/all backup 1.css
+/usr/local/www/themes/pfsense_ng/images/background.gif
+/usr/local/www/themes/pfsense_ng/images/background.png
+/usr/local/www/themes/pfsense_ng/images/button_left.gif
+/usr/local/www/themes/pfsense_ng/images/button_mid.gif
+/usr/local/www/themes/pfsense_ng/images/button_right.gif
+/usr/local/www/themes/pfsense_ng/images/horizontal.gif
+/usr/local/www/themes/pfsense_ng/images/menu_down.gif
+/usr/local/www/themes/pfsense_ng/images/metal_bgr.gif
+/usr/local/www/themes/pfsense_ng/images/metal_bgr_red.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_0.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_1.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_10.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_2.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_3.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_4.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_5.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_6.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_7.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_8.gif
+/usr/local/www/themes/pfsense_ng/images/misc/plogo_9.gif
+/usr/local/www/themes/the_wall/images/Thumbs.db
+/usr/local/www/themes/the_wall/images/icons/Thumbs.db
+/usr/local/www/themes/the_wall/images/misc/Thumbs.db
+/usr/local/www/ticker.js
+/usr/local/www/tree-images/Thumbs.db
+/usr/local/www/upload_progress.php
+/usr/local/www/vpn_ipsec_ca.php
+/usr/local/www/vpn_ipsec_ca_edit.php
+/usr/local/www/vpn_ipsec_ca_edit_create_cert.php
+/usr/local/www/vpn_ipsec_edit.php
+/usr/local/www/vpn_openvpn.php
+/usr/local/www/vpn_openvpn_ccd.php
+/usr/local/www/vpn_openvpn_ccd_edit.php
+/usr/local/www/vpn_openvpn_cli.php
+/usr/local/www/vpn_openvpn_cli_edit.php
+/usr/local/www/vpn_openvpn_create_certs.php
+/usr/local/www/vpn_openvpn_crl.php
+/usr/local/www/vpn_openvpn_crl_edit.php
+/usr/local/www/vpn_openvpn_srv.php
+/usr/local/www/vpn_openvpn_srv_edit.php
+/usr/local/www/vpn_pppoe_users.php
+/usr/local/www/vpn_pppoe_users_edit.php
+/usr/local/www/wizards/traffic_shaper_wizard.inc
+/usr/local/www/wizards/traffic_shaper_wizard.xml
+/usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc
+/usr/local/www/wizards/traffic_shaper_wizard_multi_lan.xml
+/usr/local/www/wlan_strong_key_generator
+/usr/sbin/arlcontrol
+/usr/sbin/audit
+/usr/sbin/auditd
+/usr/sbin/auditreduce
+/usr/sbin/authpf
+/usr/sbin/clog
+/usr/sbin/config_lock.sh
+/usr/sbin/config_unlock.sh
+/usr/sbin/freebsd-update
+/usr/sbin/ispcvt
+/usr/sbin/local-unbound-setup
+/usr/sbin/manctl
+/usr/sbin/nsupdate
+/usr/sbin/ntp-keygen
+/usr/sbin/ntpd
+/usr/sbin/ntpdate
+/usr/sbin/ntpdc
+/usr/sbin/ntptime
+/usr/sbin/ntptrace
+/usr/sbin/pc-sysinstall/Makefile
+/usr/sbin/pc-sysinstall/Makefile.inc
+/usr/sbin/pc-sysinstall/backend-partmanager/Makefile
+/usr/sbin/pc-sysinstall/backend-partmanager/create-part.sh
+/usr/sbin/pc-sysinstall/backend-partmanager/delete-part.sh
+/usr/sbin/pc-sysinstall/backend-query/Makefile
+/usr/sbin/pc-sysinstall/backend-query/detect-emulation.sh
+/usr/sbin/pc-sysinstall/backend-query/detect-laptop.sh
+/usr/sbin/pc-sysinstall/backend-query/detect-nics.sh
+/usr/sbin/pc-sysinstall/backend-query/disk-info.sh
+/usr/sbin/pc-sysinstall/backend-query/disk-list.sh
+/usr/sbin/pc-sysinstall/backend-query/disk-part.sh
+/usr/sbin/pc-sysinstall/backend-query/enable-net.sh
+/usr/sbin/pc-sysinstall/backend-query/get-packages.sh
+/usr/sbin/pc-sysinstall/backend-query/list-components.sh
+/usr/sbin/pc-sysinstall/backend-query/list-config.sh
+/usr/sbin/pc-sysinstall/backend-query/list-mirrors.sh
+/usr/sbin/pc-sysinstall/backend-query/list-packages.sh
+/usr/sbin/pc-sysinstall/backend-query/list-rsync-backups.sh
+/usr/sbin/pc-sysinstall/backend-query/list-tzones.sh
+/usr/sbin/pc-sysinstall/backend-query/query-langs.sh
+/usr/sbin/pc-sysinstall/backend-query/send-logs.sh
+/usr/sbin/pc-sysinstall/backend-query/set-mirror.sh
+/usr/sbin/pc-sysinstall/backend-query/setup-ssh-keys.sh
+/usr/sbin/pc-sysinstall/backend-query/sys-mem.sh
+/usr/sbin/pc-sysinstall/backend-query/test-live.sh
+/usr/sbin/pc-sysinstall/backend-query/test-netup.sh
+/usr/sbin/pc-sysinstall/backend-query/update-part-list.sh
+/usr/sbin/pc-sysinstall/backend-query/xkeyboard-layouts.sh
+/usr/sbin/pc-sysinstall/backend-query/xkeyboard-models.sh
+/usr/sbin/pc-sysinstall/backend-query/xkeyboard-variants.sh
+/usr/sbin/pc-sysinstall/backend/Makefile
+/usr/sbin/pc-sysinstall/backend/functions-bsdlabel.sh
+/usr/sbin/pc-sysinstall/backend/functions-cleanup.sh
+/usr/sbin/pc-sysinstall/backend/functions-disk.sh
+/usr/sbin/pc-sysinstall/backend/functions-extractimage.sh
+/usr/sbin/pc-sysinstall/backend/functions-ftp.sh
+/usr/sbin/pc-sysinstall/backend/functions-installcomponents.sh
+/usr/sbin/pc-sysinstall/backend/functions-installpackages.sh
+/usr/sbin/pc-sysinstall/backend/functions-localize.sh
+/usr/sbin/pc-sysinstall/backend/functions-mountdisk.sh
+/usr/sbin/pc-sysinstall/backend/functions-mountoptical.sh
+/usr/sbin/pc-sysinstall/backend/functions-networking.sh
+/usr/sbin/pc-sysinstall/backend/functions-newfs.sh
+/usr/sbin/pc-sysinstall/backend/functions-packages.sh
+/usr/sbin/pc-sysinstall/backend/functions-parse.sh
+/usr/sbin/pc-sysinstall/backend/functions-runcommands.sh
+/usr/sbin/pc-sysinstall/backend/functions-unmount.sh
+/usr/sbin/pc-sysinstall/backend/functions-upgrade.sh
+/usr/sbin/pc-sysinstall/backend/functions-users.sh
+/usr/sbin/pc-sysinstall/backend/functions.sh
+/usr/sbin/pc-sysinstall/backend/installimage.sh
+/usr/sbin/pc-sysinstall/backend/parseconfig.sh
+/usr/sbin/pc-sysinstall/backend/startautoinstall.sh
+/usr/sbin/pc-sysinstall/conf/Makefile
+/usr/sbin/pc-sysinstall/conf/avail-langs
+/usr/sbin/pc-sysinstall/conf/exclude-from-upgrade
+/usr/sbin/pc-sysinstall/conf/licenses/bsd-en.txt
+/usr/sbin/pc-sysinstall/conf/licenses/intel-en.txt
+/usr/sbin/pc-sysinstall/conf/licenses/nvidia-en.txt
+/usr/sbin/pc-sysinstall/conf/pc-sysinstall.conf
+/usr/sbin/pc-sysinstall/doc/Makefile
+/usr/sbin/pc-sysinstall/doc/help-disk-list
+/usr/sbin/pc-sysinstall/doc/help-disk-size
+/usr/sbin/pc-sysinstall/doc/help-index
+/usr/sbin/pc-sysinstall/doc/help-start-autoinstall
+/usr/sbin/pc-sysinstall/examples/Makefile
+/usr/sbin/pc-sysinstall/examples/README
+/usr/sbin/pc-sysinstall/examples/pc-autoinstall.conf
+/usr/sbin/pc-sysinstall/examples/pcinstall.cfg.fbsd-netinstall
+/usr/sbin/pc-sysinstall/examples/pcinstall.cfg.geli
+/usr/sbin/pc-sysinstall/examples/pcinstall.cfg.gmirror
+/usr/sbin/pc-sysinstall/examples/pcinstall.cfg.netinstall
+/usr/sbin/pc-sysinstall/examples/pcinstall.cfg.restore
+/usr/sbin/pc-sysinstall/examples/pcinstall.cfg.rsync
+/usr/sbin/pc-sysinstall/examples/pcinstall.cfg.upgrade
+/usr/sbin/pc-sysinstall/examples/pcinstall.cfg.zfs
+/usr/sbin/pc-sysinstall/examples/pfSense.cfg
+/usr/sbin/pc-sysinstall/examples/pfSense.cfg.zfs
+/usr/sbin/pc-sysinstall/pc-sysinstall/Makefile
+/usr/sbin/pc-sysinstall/pc-sysinstall/pc-sysinstall.8
+/usr/sbin/pc-sysinstall/pc-sysinstall/pc-sysinstall.sh
+/usr/sbin/pkg_add
+/usr/sbin/pkg_check
+/usr/sbin/pkg_create
+/usr/sbin/pkg_delete
+/usr/sbin/pkg_info
+/usr/sbin/pkg_sign
+/usr/sbin/pkg_updating
+/usr/sbin/pkg_version
+/usr/sbin/pppd
+/usr/sbin/pppstats
+/usr/sbin/praudit
+/usr/sbin/sliplogin
+/usr/sbin/unbound
+/usr/sbin/unbound-anchor
+/usr/sbin/unbound-checkconf
+/usr/sbin/unbound-control
+/usr/sbin/unbound-control-setup
+/usr/sbin/usbdevs
+/usr/sbin/wicontrol
+/usr/share/man
+/usr/share/misc/gprof.callg
+/usr/share/misc/gprof.flat
+/usr/share/nls/C/ee.cat
+/usr/share/nls/POSIX/ee.cat
+/usr/share/nls/en_US.US-ASCII/ee.cat
+/usr/share/syscons
+/usr/share/zoneinfo/GMT
+/var/db/dhclient.leases.sis1
+/var/db/rrd/71
+/var/db/rrd/index.html
+/var/dhcpd/lib/libc.so.6
+/var/etc/pppoe-vpn
+/var/mail/_relayd
+/var/mail/unbound
diff --git a/src/etc/phpshellsessions/changepassword b/src/etc/phpshellsessions/changepassword
new file mode 100644
index 0000000..6243fb8
--- /dev/null
+++ b/src/etc/phpshellsessions/changepassword
@@ -0,0 +1,79 @@
+require_once("config.inc");
+require("auth.inc");
+require_once("functions.inc");
+
+global $g, $config, $argv, $userindex;
+$userindex = index_users();
+
+$args = array_slice($argv, 3);
+
+$password = "";
+$confpassword = "";
+$username = "";
+
+$fp = fopen('php://stdin', 'r');
+
+// If the first parameter is empty, ask for username
+if (empty($args[0])) {
+ echo gettext("Enter username: ");
+ $username = fgets($fp);
+} else {
+ $username = $args[0];
+}
+$username = trim($username);
+
+// If the user does not exist, bail
+$user =& getUserEntry($username);
+if ($user == NULL) {
+ printf(gettext("User '%s' does not exist.\n"), $username);
+ exit(-1);
+} else {
+ printf(gettext("Changing password for '%s'.\n"), $username);
+}
+
+// If the user does exist, prompt for password
+while (empty($password)) {
+ echo gettext("New Password") . ": ";
+ exec('/bin/stty -echo');
+ $password = trim(fgets($fp));
+ exec('/bin/stty echo');
+ echo "\n";
+}
+
+// Confirm password
+while (empty($confpassword)) {
+ echo gettext("Confirm New Password") . ": ";
+ exec('/bin/stty -echo');
+ $confpassword = trim(fgets($fp));
+ exec('/bin/stty echo');
+ echo "\n";
+}
+
+// Check if user is disabled
+if (is_account_disabled($username)) {
+ echo gettext("Account is disabled, would you like to re-enable? [y|n]") . ": ";
+ if (strcasecmp(chop(fgets($fp)), "y") == 0) {
+ unset($user['disabled']);
+ }
+}
+// Check if user is expired
+if (is_account_expired($username)) {
+ echo gettext("Account is expired, would you like to clear the expiration date? [y|n]") . ": ";
+ if (strcasecmp(chop(fgets($fp)), "y") == 0) {
+ unset($user['expires']);
+ }
+}
+
+fclose($fp);
+
+// Compare password and confirm
+if ($password == $confpassword) {
+ //Reset password
+ local_user_set_password($user, $password);
+ local_user_set($user);
+ write_config(sprintf(gettext("password changed for user '%s' from console."), $username));
+ exit(0);
+} else {
+ echo gettext("New and Confirm passwords did not match.") . "\n";
+ exit(-1);
+} \ No newline at end of file
diff --git a/src/etc/phpshellsessions/disablecarp b/src/etc/phpshellsessions/disablecarp
new file mode 100644
index 0000000..1673269
--- /dev/null
+++ b/src/etc/phpshellsessions/disablecarp
@@ -0,0 +1,17 @@
+! echo "Disabling CARP..."
+require_once("config.inc");
+require_once("interfaces.inc");
+require_once("util.inc");
+
+set_single_sysctl("net.inet.carp.allow", "0");
+if (is_array($config['virtualip']['vip'])) {
+ $viparr = &$config['virtualip']['vip'];
+ foreach ($viparr as $vip) {
+ switch ($vip['mode']) {
+ case "carp":
+ interface_vip_bring_down($vip);
+ sleep(1);
+ break;
+ }
+ }
+}
diff --git a/src/etc/phpshellsessions/disabledhcpd b/src/etc/phpshellsessions/disabledhcpd
new file mode 100644
index 0000000..4dc029c
--- /dev/null
+++ b/src/etc/phpshellsessions/disabledhcpd
@@ -0,0 +1,13 @@
+global $config;
+
+$config = parse_config(true);
+
+unset($config['dhcpd']);
+
+echo "Disabling DHCP Server on all interfaces...";
+
+write_config("pfSsh.php disabled dhcp on all interfaces");
+
+services_dhcpd_configure();
+
+echo "done.\n"; \ No newline at end of file
diff --git a/src/etc/phpshellsessions/disablereferercheck b/src/etc/phpshellsessions/disablereferercheck
new file mode 100644
index 0000000..97d444a
--- /dev/null
+++ b/src/etc/phpshellsessions/disablereferercheck
@@ -0,0 +1,11 @@
+global $config;
+
+$config = parse_config(true);
+
+$config['system']['webgui']['nohttpreferercheck'] = true;
+
+echo "Disabling HTTP referer check...";
+
+write_config("PHP shell disabled HTTP referer check");
+
+echo "done.\n";
diff --git a/src/etc/phpshellsessions/enableallowallwan b/src/etc/phpshellsessions/enableallowallwan
new file mode 100644
index 0000000..5ce4f0f
--- /dev/null
+++ b/src/etc/phpshellsessions/enableallowallwan
@@ -0,0 +1,36 @@
+global $config;
+require_once("filter.inc");
+require("shaper.inc");
+$config = parse_config(true);
+echo "Adding allow all rule...\n";
+$filterent = array();
+$filterent["type"] = "pass";
+$filterent["interface"] = "wan";
+$filterent["source"]["any"] = "";
+$filterent["destination"]["any"] = "";
+$filterent["statetype"] = "keep state";
+$filterent["os"] = "";
+$filterent["descr"] = "Allow all ipv4 via pfSsh.php";
+$config["filter"]["rule"][] = $filterent;
+$filterent = array();
+$filterent["type"] = "pass";
+$filterent["ipprotocol"] = "inet6";
+$filterent["interface"] = "wan";
+$filterent["source"]["any"] = "";
+$filterent["destination"]["any"] = "";
+$filterent["statetype"] = "keep state";
+$filterent["os"] = "";
+$filterent["descr"] = "Allow all ipv6 via pfSsh.php";
+$config["filter"]["rule"][] = $filterent;
+echo "Turning off block private networks (if on)...\n";
+unset($config["interfaces"]["wan"]["blockpriv"]);
+echo "Turning off block bogon networks (if on)...\n";
+unset($config["interfaces"]["wan"]["blockbogons"]);
+unlink_if_exists("/tmp/config.cache");
+write_config("pfSsh.php added allow all wan rule");
+unlink_if_exists("/tmp/config.cache");
+unset($config['interfaces']['wan']['blockbogons']);
+$config = parse_config(true);
+echo "Reloading the filter configuration...";
+filter_configure_sync();
+echo "\n\n"; \ No newline at end of file
diff --git a/src/etc/phpshellsessions/enablecarp b/src/etc/phpshellsessions/enablecarp
new file mode 100644
index 0000000..276f29a
--- /dev/null
+++ b/src/etc/phpshellsessions/enablecarp
@@ -0,0 +1,23 @@
+! echo "Enabling CARP..."
+require_once("config.inc");
+require_once("interfaces.inc");
+require_once("util.inc");
+
+if (is_array($config['virtualip']['vip'])) {
+ $viparr = &$config['virtualip']['vip'];
+ foreach ($viparr as $vip) {
+ switch ($vip['mode']) {
+ case "carp":
+ interface_carp_configure($vip);
+ sleep(1);
+ break;
+ case "ipalias":
+ if (strpos($vip['interface'], '_vip')) {
+ interface_ipalias_configure($vip);
+ }
+ break;
+ }
+ }
+}
+interfaces_sync_setup();
+set_single_sysctl("net.inet.carp.allow", "1");
diff --git a/src/etc/phpshellsessions/enablesshd b/src/etc/phpshellsessions/enablesshd
new file mode 100644
index 0000000..0dc76de
--- /dev/null
+++ b/src/etc/phpshellsessions/enablesshd
@@ -0,0 +1,12 @@
+global $config;
+echo "Starting enablesshd...";
+require("config.inc");
+echo ".";
+$config = parse_config(true);
+echo ".";
+$config['system']['enablesshd'] = true;
+echo ".";
+write_config("pfSsh.php enabled sshd");
+echo "\nEnabling SSHD, please wait...";
+send_event("service reload sshd");
+echo "\n\n";
diff --git a/src/etc/phpshellsessions/externalconfiglocator b/src/etc/phpshellsessions/externalconfiglocator
new file mode 100644
index 0000000..84534b3
--- /dev/null
+++ b/src/etc/phpshellsessions/externalconfiglocator
@@ -0,0 +1,3 @@
+
+include("/etc/ecl.php");
+
diff --git a/src/etc/phpshellsessions/generateguicert b/src/etc/phpshellsessions/generateguicert
new file mode 100644
index 0000000..925ab60
--- /dev/null
+++ b/src/etc/phpshellsessions/generateguicert
@@ -0,0 +1,8 @@
+require_once("system.inc");
+
+echo gettext("Generating a new self-signed SSL certificate for the GUI...");
+$cert = system_webgui_create_certificate();
+echo gettext("Done.\n");
+echo gettext("Restarting webConfigurator...");
+send_event("service restart webgui");
+echo gettext("Done.\n"); \ No newline at end of file
diff --git a/src/etc/phpshellsessions/gitsync b/src/etc/phpshellsessions/gitsync
new file mode 100644
index 0000000..aced804
--- /dev/null
+++ b/src/etc/phpshellsessions/gitsync
@@ -0,0 +1,434 @@
+/* cvs_sync
+ * Written by Scott Ullrich
+ * (C)2005-2007 Scott Ullrich
+ * (C)2010-2012 Erik Fonnesbeck
+ * Part of the pfSense project pfSsh.php subsystem
+ */
+
+require_once("globals.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("rrd.inc");
+require_once("pfsense-utils.inc");
+
+$GIT_PKG = "git"; // Either "git" or the full package URL
+$GIT_BIN= "/usr/local/bin/git";
+$GIT_REPO = "git://github.com/pfsense/pfsense.git";
+$DEFAULT_BRANCH = "master";
+$CODIR = "/root/pfsense";
+$GITSYNC_MERGE = "/root/.gitsync_merge";
+
+/* NOTE: Set branches here */
+$branches = array(
+ "master" => "2.2 development branch",
+ "RELENG_2_2" => "2.2.* release branch",
+ "RELENG_2_1" => "2.1.* release branch",
+ "RELENG_2_0" => "2.0.* release branch",
+ "RELENG_1_2" => "1.2.* release branch",
+ "build_commit" => "The commit originally used to build the image"
+);
+
+global $g;
+global $argv;
+global $command_split;
+
+if (is_array($command_split)) {
+ $temp_args = array_slice($command_split, 2);
+} else {
+ $temp_args = array_slice($argv, 3);
+}
+
+$valid_args = array(
+ "--minimal" => "\tPerform a minimal copy of only the updated files.\n" .
+ "\tNot recommended if the system has files modified by any method other\n" .
+ "\tthan gitsync.\n",
+ "--help" => "\tDisplay this help list.\n"
+ );
+$args = array();
+$arg_count = 0;
+while (!empty($temp_args)) {
+ $arg = array_shift($temp_args);
+ if ($arg[0] == '-') {
+ switch ($arg) {
+ case "--help":
+ echo "Usage: playback gitsync [options] [[repository] <branch>]\nOptions:\n";
+ foreach($valid_args as $arg_name => $arg_desc) {
+ echo $arg_name . "\n" . $arg_desc;
+ }
+ exit;
+ case "--upgrading":
+ // Disables all interactive functions and neither PHP
+ // nor the web GUI will be killed or restarted.
+ $upgrading = true;
+ case (isset($valid_args[$arg])):
+ $args[$arg] = true;
+ break;
+ default:
+ echo "Invalid option: {$arg}\nUse --help for usage information.\n";
+ exit;
+ }
+ } else {
+ $args[$arg_count++] = $arg;
+ }
+}
+
+unlink_if_exists("/tmp/config.cache");
+conf_mount_rw();
+
+if (!file_exists($GIT_BIN)) {
+ require_once("pkg-utils.inc");
+
+ echo "Cannot find git, installing...\n";
+ if (!pkg_call('install -y -q git-lite')) {
+ echo "\nERROR: Unable to install git pkg.\n";
+ return;
+ }
+}
+
+# Remove mainline if exists (older)
+if (is_dir("/root/pfsense/mainline")) {
+ exec("rm -rf /root/pfsense/mainline");
+}
+
+# Remove RELENG_1_2 if exists (older)
+if (is_dir("/root/pfsense/RELENG_1_2")) {
+ exec("rm -rf /root/pfsense/RELENG_1_2");
+}
+
+# Remove HEAD if exists (older)
+if (is_dir("/root/pfsense/HEAD")) {
+ exec("rm -rf /root/pfsense/HEAD");
+}
+
+if (file_exists("/root/cvssync_backup.tgz")) {
+ $backup_date = `ls -lah /root/cvssync_backup.tgz | awk '{ print $6,$7,$8 }'`;
+ $tmp = array("RESTORE" => "Restores prior CVSSync backup data performed at {$backup_date}");
+ $branches = array_merge($branches, $tmp);
+}
+
+if (is_dir("$CODIR/pfSenseGITREPO/pfSenseGITREPO")) {
+ exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} config remote.origin.url", $output_str, $ret);
+ if (is_array($output_str) && !empty($output_str[0])) {
+ $GIT_REPO = $output_str[0];
+ }
+ unset($output_str);
+}
+
+if (!$args[0] && !$upgrading) {
+ echo "\nCurrent repository is $GIT_REPO\n";
+ echo "\nPlease select which branch you would like to sync against:\n\n";
+ foreach ($branches as $branchname => $branchdesc) {
+ echo "{$branchname} \t {$branchdesc}\n";
+ }
+ echo "\nOr alternatively you may enter a custom RCS branch URL (Git or HTTP).\n\n";
+ $branch = readline("> ");
+ echo "\n";
+} else {
+ $branch = $args[0];
+}
+
+if ($args[1] == "NOBACKUP") {
+ $nobackup = true;
+} else {
+ $nobackup = false;
+}
+
+// If the repository has been fetched before, build a list of its branches.
+if (is_dir("$CODIR/pfSenseGITREPO/pfSenseGITREPO")) {
+ exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} branch -r", $branch_list, $ret);
+ if ($ret == 0 && is_array($branch_list)) {
+ foreach ($branch_list as $branch_item) {
+ $branch_item = substr(strrchr($branch_item, "/"), 1);
+ if (!isset($branches[$branch_item])) {
+ $branches[$branch_item] = " ";
+ }
+ }
+ }
+}
+
+$found = false;
+foreach ($branches as $branchname => $branchdesc) {
+ if ($branchname == $branch) {
+ $found = true;
+ }
+}
+if (!$found) {
+ if (isURL($branch) && !$upgrading) {
+ if ($args[1]) {
+ $GIT_REPO = $branch;
+ $branch = $args[1];
+ $found = true;
+ } else {
+ echo "\n";
+ echo "NOTE: $branch was not found.\n\n";
+ $command = readline("Is this a custom GIT URL? [y]? ");
+ if (strtolower($command) == "y" or $command == "") {
+ $GIT_REPO = $branch;
+ $command = readline("Checkout which branch [${DEFAULT_BRANCH}]? ");
+ if ($command == "") {
+ $branch = $DEFAULT_BRANCH;
+ }
+ if ($command) {
+ $branch = $command;
+ }
+ $found = true;
+ }
+ }
+ }
+ if (!$found) {
+ echo "\nNo valid branch found. Exiting.\n\n";
+ conf_mount_ro();
+ exit;
+ }
+}
+
+$merge_repos = array();
+if (file_exists($GITSYNC_MERGE)) {
+ $gitsync_merges = file($GITSYNC_MERGE, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if (!empty($gitsync_merges) && is_array($gitsync_merges)) {
+ echo "\n===> Automatic merge list read from ${GITSYNC_MERGE}\n";
+ foreach ($gitsync_merges as $merge_line_num => $merge_line) {
+ $merge_comments = explode("#", trim($merge_line));
+ if (empty($merge_comments[0])) {
+ continue;
+ }
+
+ $merge_line = explode(" ", trim($merge_comments[0]));
+ if (count($merge_line) != 2 || empty($merge_line[0]) || empty($merge_line[1])) {
+ echo "\nLine " . ($merge_line_num + 1) . " does not have the correct parameter count or has improper spacing.\n";
+ echo "Expected parameters: repository_url branch\n";
+ echo "Line read: " . implode(" ", $merge_line) . "\n\n";
+ echo "Aborting automatic merge.\n\n";
+ $merge_repos = array();
+ break;
+ }
+ $merge_repos[] = array('repo' => $merge_line[0], 'branch' => $merge_line[1]);
+ }
+ }
+}
+if (!$args[0] && !$upgrading) {
+ do {
+ echo "\nAdd a custom RCS branch URL (Git or HTTP) to merge in or press enter if done.\n\n";
+ $merge_repo = readline("> ");
+ if (!empty($merge_repo)) {
+ $merge_branch = readline("Merge which branch [${DEFAULT_BRANCH}]? ");
+ if ($merge_branch == "") {
+ $merge_repos[] = array('repo' => $merge_repo, 'branch' => $DEFAULT_BRANCH);
+ } else if ($merge_branch) {
+ $merge_repos[] = array('repo' => $merge_repo, 'branch' => $merge_branch);
+ }
+ }
+ } while (!empty($merge_repo));
+}
+
+if ($branch == "RESTORE" && $g['platform'] == "pfSense") {
+ if (!file_exists("/root/cvssync_backup.tgz")) {
+ echo "Sorry, we could not find a previous CVSSync backup file.\n";
+ conf_mount_ro();
+ exit();
+ }
+ echo "===> Restoring previous CVSSync backup... Please wait...\n";
+ exec("tar Uxpf /root/cvssync_backup.tgz -C /");
+ post_cvssync_commands();
+ conf_mount_ro();
+ exit();
+} else {
+ $nobackup = true; // do not backup embedded, livecd
+}
+
+if ($nobackup == false) {
+ echo "===> Backing up current pfSense information...\n";
+ echo "===> Please wait... ";
+ exec("tar czPf /root/cvssync_backup.tgz --exclude /root --exclude /dev --exclude /tmp --exclude /var/run --exclude /var/empty /");
+ $size = filesize("/root/cvssync_backup.tgz");
+ echo "{$size} bytes.\n\n";
+ sleep(5);
+}
+
+echo "===> Checking out $branch\n";
+
+// Git commands for resetting to the specified branch
+if ($branch == "build_commit") {
+ $git_cmd = array(
+ "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} branch " . escapeshellarg($branch) . " 2>/dev/null",
+ "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} checkout -f " . escapeshellarg($branch) . " 2>/dev/null",
+ "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} reset --hard " . escapeshellarg(trim(file_get_contents("/etc/version.lastcommit")))
+ );
+} else {
+ $git_cmd = array(
+ "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} branch " . escapeshellarg($branch) . " " . escapeshellarg("origin/{$branch}") . " 2>/dev/null",
+ "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} checkout -f " . escapeshellarg($branch) . " 2>/dev/null",
+ "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} reset --hard " . escapeshellarg("origin/{$branch}")
+ );
+}
+
+// Git 'er done!
+if (is_dir("$CODIR/pfSenseGITREPO/pfSenseGITREPO")) {
+ echo "===> Fetching updates...\n";
+ exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} config remote.origin.url " . escapeshellarg($GIT_REPO));
+ exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} fetch");
+ exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} clean -f -f -x -d");
+ run_cmds($git_cmd);
+} else {
+ exec("mkdir -p $CODIR/pfSenseGITREPO");
+ echo "Executing cd $CODIR/pfSenseGITREPO && {$GIT_BIN} clone $GIT_REPO pfSenseGITREPO\n";
+ exec("cd $CODIR/pfSenseGITREPO && {$GIT_BIN} clone " . escapeshellarg($GIT_REPO) . " pfSenseGITREPO");
+ if (is_dir("$CODIR/pfSenseGITREPO/pfSense")) {
+ exec("mv $CODIR/pfSenseGITREPO/pfSense $CODIR/pfSenseGITREPO/pfSenseGITREPO");
+ }
+ if (is_dir("$CODIR/pfSenseGITREPO/mainline")) {
+ exec("mv $CODIR/pfSenseGITREPO/mainline $CODIR/pfSenseGITREPO/pfSenseGITREPO");
+ }
+ run_cmds($git_cmd);
+}
+
+foreach ($merge_repos as $merge_repo) {
+ echo "===> Merging branch {$merge_repo['branch']} from {$merge_repo['repo']}\n";
+ exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} pull " . escapeshellarg($merge_repo['repo']) . " " . escapeshellarg($merge_repo['branch']), $output_str, $ret);
+ unset($output_str);
+ if ($ret <> 0) {
+ echo "\nMerge failed. Aborting sync.\n\n";
+ run_cmds($git_cmd);
+ conf_mount_ro();
+ exit;
+ }
+}
+
+if (isset($args["--minimal"])) {
+ if (file_exists("/etc/version.gitsync")) {
+ $old_revision = trim(file_get_contents("/etc/version.gitsync"));
+ } else if (file_exists("/etc/version.lastcommit")) {
+ $old_revision = trim(file_get_contents("/etc/version.lastcommit"));
+ }
+ $files_to_copy = strtr(shell_exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} diff --name-only " . escapeshellarg($old_revision)), "\n", " ");
+} else {
+ $files_to_copy = '--exclude .git .';
+}
+
+// Save new commit ID for later minimal file copies
+exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} rev-parse -q --verify HEAD > /etc/version.gitsync");
+
+exec("mkdir -p /tmp/lighttpd/cache/compress/");
+
+// Nuke CVS and pfSense tarballs
+exec("cd ${CODIR}/pfSenseGITREPO/pfSenseGITREPO && find . -name CVS -exec rm -rf {} \; 2>/dev/null");
+exec("cd ${CODIR}/pfSenseGITREPO/pfSenseGITREPO && find . -name pfSense.tgz -exec rm {} \; 2>/dev/null");
+
+// Remove files that we do not want to overwrite the system with
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/crontab 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/master.passwd 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/passwd 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/fstab 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/ttys 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/group 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/fstab 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/platform 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/boot/device.hints 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/boot/loader.conf 2>/dev/null");
+exec("rm ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/boot/loader.rc 2>/dev/null");
+exec("rm -rf ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/conf*");
+exec("rm -rf ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/cf 2>/dev/null");
+exec("rm -rf ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/root/.shrc");
+exec("rm -rf ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/root/.tcshrc");
+exec("rm -f ${CODIR}/pfSenseGITREPO/pfSenseGITREPO/etc/syslog.conf 2>/dev/null");
+
+echo "===> Installing new files...\n";
+
+if ($g['platform'] == "pfSense") {
+ $command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - {$files_to_copy} | (cd / ; tar -Uxpf -)";
+} else {
+ $command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - {$files_to_copy} | (cd / ; tar -xpf -) 2>/dev/null";
+}
+
+if (!empty($files_to_copy)) {
+ exec($command);
+} else {
+ echo "Already up-to-date.\n";
+ $upgrading = true;
+}
+
+// Reset the repository to restore the deleted files
+exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} reset --hard >/dev/null 2>/dev/null");
+
+// Remove obsolete files
+$files_to_remove = file("/etc/pfSense.obsoletedfiles");
+foreach ($files_to_remove as $file_to_remove) {
+ if (file_exists($file_to_remove)) {
+ exec("/bin/rm -f $file_to_remove");
+ }
+}
+
+if (!$upgrading) {
+ post_cvssync_commands();
+}
+
+echo "===> Checkout complete.\n";
+echo "\n";
+if (!$upgrading) {
+ echo "Your system is now sync'd and PHP and Lighty will be restarted in 5 seconds.\n\n";
+} else {
+ echo "Your system is now sync'd.\n\n";
+}
+
+function post_cvssync_commands() {
+ echo "===> Removing FAST-CGI temporary files...\n";
+ exec("find /tmp -name \"php-fastcgi.socket*\" -exec rm -rf {} \;");
+ exec("find /tmp -name \"*.tmp\" -exec rm -rf {} \;");
+
+ exec("rm -rf /tmp/xcache/* 2>/dev/null");
+
+ echo "===> Upgrading configuration (if needed)...\n";
+ convert_config();
+
+ echo "===> Configuring filter...";
+ exec("/etc/rc.filter_configure_sync");
+ exec("pfctl -f /tmp/rules.debug");
+ echo "\n";
+
+ if (file_exists("/etc/rc.php_ini_setup")) {
+ echo "===> Running /etc/rc.php_ini_setup...";
+ exec("/etc/rc.php_ini_setup");
+ echo "\n";
+ }
+
+ /* lock down console if necessary */
+ echo "===> Locking down the console if needed...\n";
+ reload_ttys();
+
+ echo "===> Signaling PHP and Lighty restart...";
+ $fd = fopen("/tmp/restart_lighty", "w");
+ fwrite($fd, "#!/bin/sh\n");
+ fwrite($fd, "sleep 5\n");
+ fwrite($fd, "/usr/local/sbin/pfSctl -c 'service restart webgui'\n");
+ if (file_exists("/var/etc/lighty-CaptivePortal.conf")) {
+ fwrite($fd, "/usr/local/sbin/lighttpd -f /var/etc/lighty-CaptivePortal.conf\n");
+ }
+ fclose($fd);
+ mwexec_bg("sh /tmp/restart_lighty");
+ echo "\n";
+
+}
+
+function isUrl($url = "") {
+ if ($url) {
+ if (strstr($url, "rcs.pfsense.org") or
+ strstr($url, "mainline") or
+ strstr($url, ".git") or
+ strstr($url, "git://")) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function run_cmds($cmds) {
+ global $debug;
+ foreach ($cmds as $cmd) {
+ if ($debug) {
+ echo "Running $cmd";
+ }
+ exec($cmd);
+ }
+}
+
+conf_mount_ro();
diff --git a/src/etc/phpshellsessions/installpkg b/src/etc/phpshellsessions/installpkg
new file mode 100644
index 0000000..1ac71bf
--- /dev/null
+++ b/src/etc/phpshellsessions/installpkg
@@ -0,0 +1,36 @@
+require_once("config.inc");
+require_once("util.inc");
+require_once("pkg-utils.inc");
+
+global $g, $config, $argv, $command_split;
+
+if (is_array($command_split)) {
+ $args = array_slice($command_split, 1);
+} else {
+ $args = array_slice($argv, 2);
+}
+
+$pkg_name = $args[0];
+
+echo "Installing package \"{$pkg_name}\"...\n";
+
+echo "Trying to fetch package info...";
+$pkg_info = get_pkg_info();
+if ($pkg_info) {
+ echo " Done.\n";
+} else {
+ echo "\n" . gettext(' >>> Unable to get pkg info.') . "\n";
+ return;
+}
+
+$static_output = "";
+$pkg_interface = "console";
+
+if (empty($pkg_info[$pkg_name])) {
+ echo "\nPackage not found.\n";
+ return;
+}
+
+install_package($pkg_name);
+
+echo "\nDone.\n";
diff --git a/src/etc/phpshellsessions/listpkg b/src/etc/phpshellsessions/listpkg
new file mode 100644
index 0000000..ed2c793
--- /dev/null
+++ b/src/etc/phpshellsessions/listpkg
@@ -0,0 +1,16 @@
+require_once("config.inc");
+require_once("util.inc");
+
+global $g, $config;
+
+echo "Installed packages:\n";
+
+foreach ($config['installedpackages']['package'] as $package) {
+ $name = str_pad("{$package['name']}-{$package['version']}", 30);
+ $descr = $package['descr'];
+ $line = "{$name} {$descr}";
+ if (strlen($line) > 80) {
+ $line = substr($line, 0, 77) . "...";
+ }
+ echo "{$line}\n";
+}
diff --git a/src/etc/phpshellsessions/removepkgconfig b/src/etc/phpshellsessions/removepkgconfig
new file mode 100644
index 0000000..ea365bf
--- /dev/null
+++ b/src/etc/phpshellsessions/removepkgconfig
@@ -0,0 +1,8 @@
+global $config;
+$config = parse_config(true);
+unset($config['installedpackages']);
+echo "Clearing package configuration information...\n";
+write_config("pfSsh.php cleared package configuration data.");
+$config = parse_config(true);
+echo "Removing startup files from /usr/local/etc/rc.d/...\n";
+exec("rm /usr/local/etc/rc.d/*");
diff --git a/src/etc/phpshellsessions/removeshaper b/src/etc/phpshellsessions/removeshaper
new file mode 100644
index 0000000..298e618
--- /dev/null
+++ b/src/etc/phpshellsessions/removeshaper
@@ -0,0 +1,25 @@
+require("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("rrd.inc");
+
+/* Much of this borrowed from firewall_shaper.php */
+
+echo gettext("Removing shaper settings...\n");
+
+unset($config['shaper']['queue']);
+unset($queue);
+unset($altq);
+
+foreach ($config['filter']['rule'] as $key => $rule) {
+ if (isset($rule['wizard']) && $rule['wizard'] == "yes") {
+ unset($config['filter']['rule'][$key]);
+ }
+}
+if (write_config()) {
+ echo gettext("Shaper Successfully Removed.\n");
+} else {
+ echo gettext("Unable to write config.xml (Access Denied?)\n");
+}
+filter_configure(); \ No newline at end of file
diff --git a/src/etc/phpshellsessions/restartdhcpd b/src/etc/phpshellsessions/restartdhcpd
new file mode 100644
index 0000000..e24c842
--- /dev/null
+++ b/src/etc/phpshellsessions/restartdhcpd
@@ -0,0 +1,4 @@
+! echo "Killing dhcp server..."
+! killall dhcpd
+! echo "Restarting dhcp server..."
+services_dhcpd_configure();
diff --git a/src/etc/phpshellsessions/restartipsec b/src/etc/phpshellsessions/restartipsec
new file mode 100644
index 0000000..ebbe9b3
--- /dev/null
+++ b/src/etc/phpshellsessions/restartipsec
@@ -0,0 +1,7 @@
+! echo "Restarting ipsec..."
+require_once("config.inc");
+require_once("filter.inc");
+require_once("auth.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+vpn_ipsec_configure(true);
diff --git a/src/etc/phpshellsessions/svc b/src/etc/phpshellsessions/svc
new file mode 100644
index 0000000..ee1ab40
--- /dev/null
+++ b/src/etc/phpshellsessions/svc
@@ -0,0 +1,99 @@
+require_once("config.inc");
+require_once("util.inc");
+require_once("service-utils.inc");
+
+function usage() {
+ echo "Usage: playback svc <action> <service name> [service-specific options]\n\n";
+ echo "Examples:\n";
+ echo "playback svc stop dhcpd\n";
+ echo "playback svc restart openvpn client 2\n";
+ echo "playback svc stop captiveportal zone1\n";
+ echo "\n";
+}
+
+global $g, $config, $argv, $command_split;
+
+if (is_array($command_split)) {
+ $args = array_slice($command_split, 2);
+} else {
+ $args = array_slice($argv, 3);
+}
+
+if (empty($args[0])) {
+ usage();
+}
+
+$extras = array();
+
+// start, stop, restart
+$action = $args[0];
+
+// dhcpd, openvpn, etc.
+$svc_name = $args[1];
+
+// Handle servive-specific options.
+switch ($svc_name) {
+ case "openvpn":
+ if (in_array($args[2], array("server", "client"))) {
+ $extras['vpnmode'] = $args[2];
+ } else {
+ echo "Invalid OpenVPN mode (server, client)\n";
+ return;
+ }
+ if (is_numeric($args[3])) {
+ $extras['id'] = $args[3];
+ } else {
+ echo "Invalid OpenVPN ID, must be numeric\n";
+ return;
+ }
+ $vpnsvc = find_service_by_openvpn_vpnid($extras['id']);
+ if (empty($vpnsvc)) {
+ echo "No OpenVPN client or server found with that ID.\n";
+ return;
+ }
+ break;
+ case "captiveportal":
+ if (is_validaliasname($args[2])) {
+ $extras['zone'] = $args[2];
+ } else {
+ echo "Invalid Captive Portal Zone.\n";
+ return;
+ }
+ $cpzone = find_service_by_cp_zone($extras['zone']);
+ if (empty($cpzone)) {
+ echo "No Captive Portal Zone found with that name.\n";
+ return;
+ }
+ break;
+}
+
+switch ($action) {
+ case "restart":
+ echo "Attempting to issue {$action} to {$svc_name} service...\n";
+ $savemsg = service_control_restart($svc_name, $extras);
+ break;
+ case "start":
+ echo "Attempting to issue {$action} to {$svc_name} service...\n";
+ $savemsg = service_control_start($svc_name, $extras);
+ break;
+ case "stop":
+ echo "Attempting to issue {$action} to {$svc_name} service...\n";
+ $savemsg = service_control_stop($svc_name, $extras);
+ break;
+ case "status":
+ switch ($svc_name) {
+ case "openvpn":
+ $service = $vpnsvc;
+ break;
+ case "captiveportal":
+ $service = $cpzone;
+ break;
+ default:
+ $service = find_service_by_name($svc_name);
+ break;
+ }
+ $savemsg = get_service_status($service) ? "Service {$svc_name} is running." : "Service {$svc_name} is stopped.";
+ break;
+}
+
+echo "\n{$savemsg}\n";
diff --git a/src/etc/phpshellsessions/uninstallpkg b/src/etc/phpshellsessions/uninstallpkg
new file mode 100644
index 0000000..9030e56
--- /dev/null
+++ b/src/etc/phpshellsessions/uninstallpkg
@@ -0,0 +1,34 @@
+require_once("config.inc");
+require_once("util.inc");
+require_once("pkg-utils.inc");
+
+global $g, $config, $argv, $command_split;
+
+if (is_array($command_split)) {
+ $args = array_slice($command_split, 1);
+} else {
+ $args = array_slice($argv, 2);
+}
+
+$pkg_name = $args[0];
+$pkg_info = array();
+
+echo "Removing package \"{$pkg_name}\"...\n";
+
+foreach ($config['installedpackages']['package'] as $package) {
+ if ($pkg_name == $package['name']) {
+ $pkg_info = $package;
+ }
+}
+
+$static_output = "";
+$pkg_interface = "console";
+
+if (empty($pkg_info)) {
+ echo "\nPackage not installed.\n";
+ return;
+}
+
+uninstall_package($pkg_name);
+
+echo "\nDone.\n";
diff --git a/src/etc/platform b/src/etc/platform
new file mode 100644
index 0000000..8443722
--- /dev/null
+++ b/src/etc/platform
@@ -0,0 +1 @@
+pfSense \ No newline at end of file
diff --git a/src/etc/printcap b/src/etc/printcap
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/etc/printcap
diff --git a/src/etc/protocols b/src/etc/protocols
new file mode 100644
index 0000000..763cbcd
--- /dev/null
+++ b/src/etc/protocols
@@ -0,0 +1,158 @@
+#
+# Internet protocols
+#
+# $FreeBSD: stable/10/etc/protocols 250453 2013-05-10 13:57:44Z eadler $
+# from: @(#)protocols 5.1 (Berkeley) 4/17/89
+#
+# See also http://www.iana.org/assignments/protocol-numbers
+#
+ip 0 IP # internet protocol, pseudo protocol number
+#hopopt 0 HOPOPT # hop-by-hop options for ipv6
+icmp 1 ICMP # internet control message protocol
+igmp 2 IGMP # internet group management protocol
+ggp 3 GGP # gateway-gateway protocol
+ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'')
+st2 5 ST2 # ST2 datagram mode (RFC 1819) (officially ``ST'')
+tcp 6 TCP # transmission control protocol
+cbt 7 CBT # CBT, Tony Ballardie <A.Ballardie@cs.ucl.ac.uk>
+egp 8 EGP # exterior gateway protocol
+igp 9 IGP # any private interior gateway (Cisco: for IGRP)
+bbn-rcc 10 BBN-RCC-MON # BBN RCC Monitoring
+nvp 11 NVP-II # Network Voice Protocol
+pup 12 PUP # PARC universal packet protocol
+argus 13 ARGUS # ARGUS
+emcon 14 EMCON # EMCON
+xnet 15 XNET # Cross Net Debugger
+chaos 16 CHAOS # Chaos
+udp 17 UDP # user datagram protocol
+mux 18 MUX # Multiplexing protocol
+dcn 19 DCN-MEAS # DCN Measurement Subsystems
+hmp 20 HMP # host monitoring protocol
+prm 21 PRM # packet radio measurement protocol
+xns-idp 22 XNS-IDP # Xerox NS IDP
+trunk-1 23 TRUNK-1 # Trunk-1
+trunk-2 24 TRUNK-2 # Trunk-2
+leaf-1 25 LEAF-1 # Leaf-1
+leaf-2 26 LEAF-2 # Leaf-2
+rdp 27 RDP # "reliable datagram" protocol
+irtp 28 IRTP # Internet Reliable Transaction Protocol
+iso-tp4 29 ISO-TP4 # ISO Transport Protocol Class 4
+netblt 30 NETBLT # Bulk Data Transfer Protocol
+mfe-nsp 31 MFE-NSP # MFE Network Services Protocol
+merit-inp 32 MERIT-INP # MERIT Internodal Protocol
+dccp 33 DCCP # Datagram Congestion Control Protocol
+3pc 34 3PC # Third Party Connect Protocol
+idpr 35 IDPR # Inter-Domain Policy Routing Protocol
+xtp 36 XTP # Xpress Tranfer Protocol
+ddp 37 DDP # Datagram Delivery Protocol
+idpr-cmtp 38 IDPR-CMTP # IDPR Control Message Transport Proto
+tp++ 39 TP++ # TP++ Transport Protocol
+il 40 IL # IL Transport Protocol
+ipv6 41 IPV6 # ipv6
+sdrp 42 SDRP # Source Demand Routing Protocol
+ipv6-route 43 IPV6-ROUTE # routing header for ipv6
+ipv6-frag 44 IPV6-FRAG # fragment header for ipv6
+idrp 45 IDRP # Inter-Domain Routing Protocol
+rsvp 46 RSVP # Resource ReSerVation Protocol
+gre 47 GRE # Generic Routing Encapsulation
+dsr 48 DSR # Dynamic Source Routing Protocol
+bna 49 BNA # BNA
+esp 50 ESP # encapsulating security payload
+ah 51 AH # authentication header
+i-nlsp 52 I-NLSP # Integrated Net Layer Security TUBA
+swipe 53 SWIPE # IP with Encryption
+narp 54 NARP # NBMA Address Resolution Protocol
+mobile 55 MOBILE # IP Mobility
+tlsp 56 TLSP # Transport Layer Security Protocol
+skip 57 SKIP # SKIP
+ipv6-icmp 58 IPV6-ICMP icmp6 # ICMP for IPv6
+ipv6-nonxt 59 IPV6-NONXT # no next header for ipv6
+ipv6-opts 60 IPV6-OPTS # destination options for ipv6
+# 61 # any host internal protocol
+cftp 62 CFTP # CFTP
+# 63 # any local network
+sat-expak 64 SAT-EXPAK # SATNET and Backroom EXPAK
+kryptolan 65 KRYPTOLAN # Kryptolan
+rvd 66 RVD # MIT Remote Virtual Disk Protocol
+ippc 67 IPPC # Internet Pluribus Packet Core
+# 68 # any distributed filesystem
+sat-mon 69 SAT-MON # SATNET Monitoring
+visa 70 VISA # VISA Protocol
+ipcv 71 IPCV # Internet Packet Core Utility
+cpnx 72 CPNX # Computer Protocol Network Executive
+cphb 73 CPHB # Computer Protocol Heart Beat
+wsn 74 WSN # Wang Span Network
+pvp 75 PVP # Packet Video Protocol
+br-sat-mon 76 BR-SAT-MON # Backroom SATNET Monitoring
+sun-nd 77 SUN-ND # SUN ND PROTOCOL-Temporary
+wb-mon 78 WB-MON # WIDEBAND Monitoring
+wb-expak 79 WB-EXPAK # WIDEBAND EXPAK
+iso-ip 80 ISO-IP # ISO Internet Protocol
+vmtp 81 VMTP # Versatile Message Transport
+secure-vmtp 82 SECURE-VMTP # SECURE-VMTP
+vines 83 VINES # VINES
+ttp 84 TTP # TTP
+#iptm 84 IPTM # Protocol Internet Protocol Traffic
+nsfnet-igp 85 NSFNET-IGP # NSFNET-IGP
+dgp 86 DGP # Dissimilar Gateway Protocol
+tcf 87 TCF # TCF
+eigrp 88 EIGRP # Enhanced Interior Routing Protocol (Cisco)
+ospf 89 OSPFIGP # Open Shortest Path First IGP
+sprite-rpc 90 Sprite-RPC # Sprite RPC Protocol
+larp 91 LARP # Locus Address Resolution Protocol
+mtp 92 MTP # Multicast Transport Protocol
+ax.25 93 AX.25 # AX.25 Frames
+ipip 94 IPIP # Yet Another IP encapsulation
+micp 95 MICP # Mobile Internetworking Control Pro.
+scc-sp 96 SCC-SP # Semaphore Communications Sec. Pro.
+etherip 97 ETHERIP # Ethernet-within-IP Encapsulation
+encap 98 ENCAP # Yet Another IP encapsulation
+# 99 # any private encryption scheme
+gmtp 100 GMTP # GMTP
+ifmp 101 IFMP # Ipsilon Flow Management Protocol
+pnni 102 PNNI # PNNI over IP
+pim 103 PIM # Protocol Independent Multicast
+aris 104 ARIS # ARIS
+scps 105 SCPS # SCPS
+qnx 106 QNX # QNX
+a/n 107 A/N # Active Networks
+ipcomp 108 IPComp # IP Payload Compression Protocol
+snp 109 SNP # Sitara Networks Protocol
+compaq-peer 110 Compaq-Peer # Compaq Peer Protocol
+ipx-in-ip 111 IPX-in-IP # IPX in IP
+carp 112 CARP vrrp # Common Address Redundancy Protocol
+pgm 113 PGM # PGM Reliable Transport Protocol
+# 114 # any 0-hop protocol
+l2tp 115 L2TP # Layer Two Tunneling Protocol
+ddx 116 DDX # D-II Data Exchange
+iatp 117 IATP # Interactive Agent Transfer Protocol
+stp 118 STP # Schedule Transfer Protocol
+srp 119 SRP # SpectraLink Radio Protocol
+uti 120 UTI # UTI
+smp 121 SMP # Simple Message Protocol
+sm 122 SM # SM
+ptp 123 PTP # Performance Transparency Protocol
+isis 124 ISIS # ISIS over IPv4
+fire 125 FIRE
+crtp 126 CRTP # Combat Radio Transport Protocol
+crudp 127 CRUDP # Combat Radio User Datagram
+sscopmce 128 SSCOPMCE
+iplt 129 IPLT
+sps 130 SPS # Secure Packet Shield
+pipe 131 PIPE # Private IP Encapsulation within IP
+sctp 132 SCTP # Stream Control Transmission Protocol
+fc 133 FC # Fibre Channel
+rsvp-e2e-ignore 134 RSVP-E2E-IGNORE # Aggregation of RSVP for IP reservations
+mobility-header 135 Mobility-Header # Mobility Support in IPv6
+udplite 136 UDPLite # The UDP-Lite Protocol
+mpls-in-ip 137 MPLS-IN-IP # Encapsulating MPLS in IP
+manet 138 MANET # MANET Protocols (RFC5498)
+hip 139 HIP # Host Identity Protocol (RFC5201)
+shim6 140 SHIM6 # Shim6 Protocol (RFC5533)
+wesp 141 WESP # Wrapped Encapsulating Security Payload (RFC5840)
+rohc 142 ROHC # Robust Header Compression (RFC5858)
+# 138-254 # Unassigned
+pfsync 240 PFSYNC # PF Synchronization
+# 253-254 # Use for experimentation and testing (RFC3692)
+# 255 # Reserved
+divert 258 DIVERT # Divert pseudo-protocol [non IANA]
diff --git a/src/etc/pubkey.pem b/src/etc/pubkey.pem
new file mode 100644
index 0000000..7dd575d
--- /dev/null
+++ b/src/etc/pubkey.pem
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAN08c22jym3KCRUF8/rKNXgU/J0vv6UC9eCta/ATTNgeW/z2rp/HsjcPkMLx9dLaqufShC0VzsUbGlqCsdQT8jfwBiLG2pjUkX20qTStRG/rs9Tv0rS/8eVNT/DbQ6zL3PTdp+XAIq+KQLucqcBazTqSzyF7ghZ7OVmsX1/ixTP3AAAAFQCYcP378X/dQ08l6u8O5uvEtxbvEwAAAIEAyOOuWttXGrprzBhKrjhop58bZTOZp0J0IMHMwi/J+K3HUuPZnaltGoW21MjqSvVor4m22r/3b8aUIom+jp4I/bmpxTOUgO6owTlCVX614fGPWcCw2M017aghQ/vUa/92DaMLO//FYD8X2b7WgyPNrJh9ckZ14oncBleJUfXmue8AAACBAKw00/IkoMJzTumFfT9+Jb442O1KZvtGyj1YWpyYXf3xbQFGXND7m4rTIS2zPvTcOauCHbZwZ9uBxE4zTdlGJ4XirPEbWwOl1TU71bZ3OqonVesyqSC04LLiuLGlIHyXxyc/UCzg1UL8mCBlLzqmPUkJoL0ZINo8Raqip8WM63KM root@freebsd-nexus-computers.pfsense.org
diff --git a/src/etc/rc b/src/etc/rc
new file mode 100755
index 0000000..1215883
--- /dev/null
+++ b/src/etc/rc
@@ -0,0 +1,439 @@
+#!/bin/sh
+
+# $Id$
+
+# /etc/rc - master bootup script, invokes php setup
+# part of pfSense by Scott Ullrich
+# Copyright (C) 2004-2010 Scott Ullrich, All rights reserved.
+# originally based on m0n0wall (http://neon1.net/m0n0wall)
+# Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+# All rights reserved.
+
+#/bin/stty status '^T'
+#/bin/stty susp '^-' intr '^-' quit '^-'
+
+#trap : 2
+#trap : 3
+
+HOME=/
+PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
+export HOME PATH
+
+# Set our operating platform
+PLATFORM=`/bin/cat /etc/platform`
+
+# Set our current version
+version=`/bin/cat /etc/version`
+
+# Setup dumpdev/ddb/savecore"
+echo "Configuring crash dumps..."
+if [ "$PLATFORM" = "pfSense" ]; then
+ /etc/rc.dumpon
+fi
+
+# Setup ddb on all platforms. On full install it will save the dump, on NanoBSD it will print to console and auto-reboot.
+if [ ! -z "`sysctl -Nq debug.ddb.scripting.scripts`" ]; then
+ /sbin/ddb /etc/ddb.conf
+fi
+
+if [ -e /root/force_fsck ]; then
+ echo "Forcing filesystem(s) check..."
+ /sbin/fsck -y -F -t ufs
+fi
+
+if [ ! "${PLATFORM}" = "cdrom" ]; then
+ /sbin/fsck -p -F
+ FSCK_ACTION_NEEDED=0
+ case $? in
+ 0)
+ echo "Filesystems are clean, continuing..."
+ echo "Mounting filesystems..."
+ ;;
+ 8)
+ echo "Preen mode recommended running a check that will be performed now."
+ FSCK_ACTION_NEEDED=1
+ ;;
+ *)
+ echo "Stopping boot is recommended due to filesystem manual action needed, nevertheless it will be tried to repair the filesystem."
+ FSCK_ACTION_NEEDED=1
+ ;;
+ esac
+
+ if [ ${FSCK_ACTION_NEEDED} = 1 ]; then
+ echo "WARNING: Trying to recover filesystem from inconsistency..."
+ /sbin/fsck -yF
+ fi
+
+ /sbin/mount -a 2>/dev/null
+ mount_rc=$?
+ attempts=0
+ while [ ${mount_rc} -ne 0 -a ${attempts} -lt 3 ]; do
+ /sbin/fsck -yF
+ /sbin/mount -a 2>/dev/null
+ mount_rc=$?
+ attempts=$((attempts+1))
+ done
+
+ if [ "${PLATFORM}" = "nanobsd" ]; then
+ # XXX This script does need all filesystems rw!!!!
+ # Put this workaround for now until better ways are found.
+ /sbin/mount -u -w -o sync,noatime /
+ /sbin/mount -u -w -o sync,noatime /cf
+ fi
+
+ # If /conf is a directory, convert it to a symlink to /cf/conf
+ if [ -d "/conf" ]; then
+ # If item is not a symlink then rm and recreate
+ CONFPOINTSTO=`readlink /conf`
+ if ! test "x$CONFPOINTSTO" = "x/cf/conf"; then
+ /bin/rm -rf /conf
+ /bin/ln -s /cf/conf /conf
+ fi
+ fi
+
+ USE_MFS_TMPVAR=`/usr/bin/grep -c use_mfs_tmpvar /cf/conf/config.xml`
+ if [ "${PLATFORM}" = "nanobsd" ] || [ ${USE_MFS_TMPVAR} -gt 0 ]; then
+ /etc/rc.embedded
+ fi
+fi
+
+/bin/rm -f /root/force_fsck
+/bin/rm -f /root/TRIM_set
+/bin/rm -f /root/TRIM_unset
+
+if [ "${PLATFORM}" = "nanobsd" ]; then
+ /sbin/kldstat -qm zfs
+ if [ $? -eq 0 ]; then
+ /sbin/kldunload zfs
+ fi
+elif [ "$PLATFORM" = "pfSense" ]; then
+ # Handle ZFS read-only case
+ /sbin/kldstat -qm zfs
+ if [ $? -eq 0 ]; then
+ ZFSFSAVAILABLE=$(/sbin/zfs mount 2>/dev/null | wc -l)
+ if [ $ZFSFSAVAILABLE -eq 0 ]; then
+ /sbin/kldunload zfs
+ elif [ -f /usr/bin/grep ]; then
+ ZFSROOT=`/sbin/zfs mount | /usr/bin/grep ' /$' | /usr/bin/cut -d ' ' -f 1`
+ if [ "$ZFSROOT" != "" ]; then
+ /sbin/zfs set readonly=off $ZFSROOT
+ fi
+ fi
+ fi
+elif [ "${PLATFORM}" = "cdrom" ]; then
+ /etc/rc.cdrom
+fi
+
+# Disable APM on ATA drives. Leaving this on will kill drives long-term, especially laptop drives, by generating excessive Load Cycles.
+if [ -f /etc/rc.disable_hdd_apm ]; then
+ /etc/rc.disable_hdd_apm
+fi
+
+#Eject CD devices on 3G modems
+MANUFACTURER="huawei|zte"
+CDDEVICE=`dmesg |egrep -ie "($MANUFACTURER)" | awk -F: '/cd/ {print $1}'`
+if [ "$CDDEVICE" != "" ]; then
+ cdcontrol -f /dev/"$CDDEVICE" eject
+fi
+
+product=`/usr/bin/grep product_name /etc/inc/globals.inc | /usr/bin/cut -d'"' -f4`
+hideplatform=`/usr/bin/grep hideplatform /etc/inc/globals.inc | /usr/bin/wc -l`
+varrunpath=`/usr/bin/grep varrun_path /etc/inc/globals.inc | /usr/bin/cut -d'"' -f4`
+
+if [ "$PLATFORM" = "pfSense" ] && [ ${USE_MFS_TMPVAR} -eq 0 ]; then
+ /sbin/mdmfs -S -M -s 4m md $varrunpath
+fi
+
+if [ "$hideplatform" -gt "0" ]; then
+ platformbanner="" # hide the platform
+else
+ platformbanner=" on the '${PLATFORM}' platform"
+fi
+
+echo
+cat /etc/ascii-art/pfsense-logo-small.txt
+echo
+echo
+echo "Welcome to ${product} ${version} ${platformbanner} ..."
+echo
+
+/sbin/conscontrol mute off >/dev/null
+
+if [ "$PLATFORM" = "cdrom" ] ; then
+ # do nothing for cdrom platform
+elif [ "$PLATFORM" = "nanobsd" ] || [ ${USE_MFS_TMPVAR} -gt 0 ]; then
+ # Ensure that old-style PKG packages can be persistent across reboots
+ /bin/mkdir -p /root/var/db/pkg
+ /bin/rm -rf /var/db/pkg
+ /bin/ln -s /root/var/db/pkg/ /var/db/pkg
+ # Ensure that PBI packages can be persistent across reboots
+ /bin/mkdir -p /root/var/db/pbi
+ /bin/rm -rf /var/db/pbi
+ /bin/ln -s /root/var/db/pbi/ /var/db/pbi
+else
+ SWAPDEVICE=`/bin/cat /etc/fstab | /usr/bin/grep swap | /usr/bin/cut -f1`
+ /sbin/swapon -a 2>/dev/null >/dev/null
+ /etc/rc.savecore
+
+ if [ -d /root/var/db/pkg ]; then
+ # User must have just disabled RAM disks, move these back into place.
+ /bin/mkdir -p /var/db/pkg
+ /bin/mv /root/var/db/pkg /var/db/pkg
+ /bin/mkdir -p /var/db/pbi
+ /bin/mv /root/var/db/pbi /var/db/pbi
+ fi
+fi
+
+# Copy PBI keys
+if ls /usr/local/share/pbi-keys/*.ssl >/dev/null 2>&1; then
+ if [ ! -d "/var/db/pbi/keys" ]; then
+ mkdir -p /var/db/pbi/keys
+ fi
+ cp -f /usr/local/share/pbi-keys/*.ssl /var/db/pbi/keys
+fi
+
+if [ "$PLATFORM" = "cdrom" ] ; then
+ echo -n "Mounting unionfs directories..."
+ /bin/mkdir /tmp/unionfs
+ /bin/mkdir /tmp/unionfs/usr
+ /bin/mkdir /tmp/unionfs/root
+ /bin/mkdir /tmp/unionfs/sbin
+ /bin/mkdir /tmp/unionfs/bin
+ /bin/mkdir /tmp/unionfs/boot
+ /bin/mkdir /tmp/unionfs/confdefault
+ /sbin/mount_unionfs /tmp/unionfs/usr /usr/
+ /sbin/mount_unionfs /tmp/unionfs/root /root/
+ /sbin/mount_unionfs /tmp/unionfs/bin /bin/
+ /sbin/mount_unionfs /tmp/unionfs/sbin /sbin/
+ /sbin/mount_unionfs /tmp/unionfs/boot /boot/
+ /sbin/mount_unionfs /tmp/unionfs/confdefault /conf.default/
+ echo "done."
+fi
+
+# make some directories in /var
+/bin/mkdir -p $varrunpath /var/log /var/etc /var/db/entropy /var/db/rrd /var/at/jobs/ /var/empty 2>/dev/null
+/bin/rm -rf $varrunpath/*
+if [ "$PLATFORM" != "pfSense" ]; then
+ /bin/rm /var/log/* 2>/dev/null
+fi
+
+# Cleanup configuration files from previous instance
+/bin/rm -rf /var/etc/*
+
+echo -n "Creating symlinks..."
+# Repair symlinks if they are broken
+if [ -f /etc/newsyslog.conf ]; then
+ /bin/rm -f /etc/newsyslog.conf
+fi
+if [ ! -L /etc/syslog.conf ]; then
+ /bin/rm -rf /etc/syslog.conf
+ if [ ! -f /var/etc/syslog.conf ]; then
+ touch /var/etc/syslog.conf
+ fi
+ /bin/ln -s /var/etc/syslog.conf /etc/syslog.conf
+fi
+
+# Repair symlinks if they are broken
+if [ ! -L /etc/hosts ]; then
+ /bin/rm -rf /etc/hosts
+ /bin/ln -s /var/etc/hosts /etc/hosts
+fi
+
+if [ ! -L /etc/resolv.conf ]; then
+ /bin/rm -rf /etc/resolv.conf
+ /bin/ln -s /var/etc/resolv.conf /etc/resolv.conf
+fi
+
+if [ ! -L /etc/resolvconf.conf ]; then
+ /bin/rm -rf /etc/resolvconf.conf
+ /bin/ln -s /var/etc/resolvconf.conf /etc/resolvconf.conf
+fi
+
+# Setup compatibility link for packages that
+# have trouble overriding the PREFIX configure
+# argument since we build our packages in a
+# separated PREFIX area
+# Only create if symlink does not exist.
+if [ ! -h /tmp/tmp ]; then
+ /bin/ln -hfs / /tmp/tmp
+fi
+
+# Make sure our /tmp is 777 + Sticky
+if [ ! "$PLATFORM" = "cdrom" ] ; then
+ /bin/rm -rf /tmp/*
+fi
+/bin/chmod 1777 /tmp
+
+if [ ! "$PLATFORM" = "cdrom" ] ; then
+ # Malloc debugging check
+ if [ -L /etc/malloc.conf ]; then
+ #ln -s aj /etc/malloc.conf
+ /bin/rm /etc/malloc.conf
+ fi
+fi
+
+if [ ! -L /etc/dhclient.conf ]; then
+ /bin/rm -rf /etc/dhclient.conf
+fi
+
+if [ ! -d /var/tmp ]; then
+ /bin/mkdir -p /var/tmp
+fi
+
+if [ ! -d /cf/conf/backup/ ]; then
+ /bin/mkdir -p /cf/conf/backup/
+fi
+
+set -T
+trap "echo 'Reboot interrupted'; exit 1" 3
+
+# Remove old nameserver resolution files
+/bin/rm -f /var/etc/nameserver*
+
+echo -n "."
+DISABLESYSLOGCLOG=`/usr/bin/grep -c disablesyslogclog /cf/conf/config.xml`
+ENABLEFIFOLOG=`/usr/bin/grep -c usefifolog /cf/conf/config.xml`
+LOG_FILES="system filter dhcpd vpn pptps poes l2tps openvpn portalauth ipsec ppp relayd wireless lighttpd ntpd gateways resolver routing"
+
+DEFAULT_LOG_FILE_SIZE=`/usr/local/bin/xmllint --xpath 'string(//pfsense/syslog/logfilesize)' /conf/config.xml`
+if [ ! ${DEFAULT_LOG_FILE_SIZE} ]; then
+ DEFAULT_LOG_FILE_SIZE=511488
+fi
+
+for logfile in $LOG_FILES; do
+ if [ "$DISABLESYSLOGCLOG" -gt "0" ]; then
+ /usr/bin/touch /var/log/$logfile.log
+ else
+ if [ ! -f /var/log/$logfile.log ]; then
+ if [ "$ENABLEFIFOLOG" -gt "0" ]; then
+ # generate fifolog files
+ /usr/sbin/fifolog_create -s ${DEFAULT_LOG_FILE_SIZE} /var/log/$logfile.log
+ else
+ /usr/local/sbin/clog -i -s ${DEFAULT_LOG_FILE_SIZE} /var/log/$logfile.log
+ fi
+ fi
+ fi
+done
+
+# change permissions on newly created fifolog files.
+/bin/chmod 0600 /var/log/*.log
+
+echo -n "."
+DEVFS=`/sbin/mount | /usr/bin/grep devfs | /usr/bin/wc -l | /usr/bin/cut -d" " -f8`
+if [ "$DEVFS" = "0" ]; then
+ mount_devfs devfs /dev
+fi
+
+# Create an initial utmp file
+cd $varrunpath && /bin/cp /dev/null utmp && /bin/chmod 644 utmp
+
+echo -n "."
+/sbin/ldconfig -elf /usr/lib /usr/local/lib /lib
+/etc/rc.d/ldconfig start 2>/dev/null
+
+# Launching kbdmux(4)
+if [ -f "/dev/kbdmux0" ]; then
+ echo -n "."
+ /usr/sbin/kbdcontrol -k /dev/kbdmux0 < /dev/console
+ [ -c "/dev/atkbd0" ] && kbdcontrol -a atkbd0 < /dev/console
+ [ -c "/dev/ukbd0" ] && kbdcontrol -a ukbd0 < /dev/console
+fi
+
+# Fire up unionfs if mount points exist.
+if [ -f /dist/uniondirs ]; then
+ echo -n "."
+ /etc/rc.d/unionfs start
+fi
+
+echo "done."
+
+# Recreate capabilities DB
+/usr/bin/cap_mkdb /etc/login.conf
+
+# Run the php.ini setup file and populate
+# /usr/local/etc/php.ini and /usr/local/lib/php.ini
+/etc/rc.php_ini_setup 2>/tmp/php_errors.txt
+/usr/local/sbin/php-fpm -c /usr/local/lib/php.ini -y /usr/local/lib/php-fpm.conf -RD 2>&1 >/dev/null
+
+# Launch external configuration loader for supported platforms
+if [ "$PLATFORM" = "nanobsd" ]; then
+ /usr/local/sbin/fcgicli -f /etc/ecl.php
+fi
+
+# Launch external configuration loader for supported platforms
+if [ "$PLATFORM" = "pfSense" ]; then
+ /usr/local/sbin/fcgicli -f /etc/ecl.php
+fi
+
+if [ -f /etc/rc.custom_boot_early ]; then
+ /bin/echo -n "Launching /etc/rc.custom_boot_early...";
+ /etc/rc.custom_boot_early
+ echo "Done"
+fi
+
+export fcgipath=/var/run/php-fpm.socket
+/usr/bin/nice -n20 /usr/local/sbin/check_reload_status
+
+# let the PHP-based configuration subsystem set up the system now
+echo -n "Launching the init system..."
+/bin/rm -f /cf/conf/backup/backup.cache
+/bin/rm -f /root/lighttpd*
+/usr/bin/touch $varrunpath/booting
+
+if [ "${PLATFORM}" = "nanobsd" ]; then
+ # XXX This script does need all filesystems rw!!!!
+ # Put this workaround for now until better ways are found.
+ /sbin/mount -u -f -r -o sync,noatime /
+ /sbin/mount -u -f -r -o sync,noatime /cf
+fi
+
+/etc/rc.bootup
+
+# /etc/rc.bootup unset $g['booting'], and removes file
+# Be sure the file is removed to not create troubles after
+if [ -f $varrunpath/booting ]; then
+ /bin/rm $varrunpath/booting
+fi
+
+echo -n "Starting CRON... "
+cd /tmp && /usr/sbin/cron -s 2>/dev/null
+echo "done."
+
+# Start packages
+/usr/local/sbin/fcgicli -f /etc/rc.start_packages
+
+/bin/rm -rf /usr/local/pkg/pf/CVS
+
+# Start ping handler every 240 seconds
+/usr/local/bin/minicron 240 $varrunpath/ping_hosts.pid /usr/local/bin/ping_hosts.sh
+
+# Start account expire handler every hour
+/usr/local/bin/minicron 3600 $varrunpath/expire_accounts.pid '/usr/local/sbin/fcgicli -f /etc/rc.expireaccounts'
+
+# Start alias url updater every 24 hours
+/usr/local/bin/minicron 86400 $varrunpath/update_alias_url_data.pid '/usr/local/sbin/fcgicli -f /etc/rc.update_alias_url_data'
+
+/bin/chmod a+rw /tmp/.
+
+# Check for GEOM mirrors
+GMIRROR_STATUS=`/sbin/gmirror status`
+if [ "${GMIRROR_STATUS}" != "" ]; then
+ # Using a flag file at bootup saves an expensive exec/check on each page load.
+ /usr/bin/touch /var/run/gmirror_active
+ # Setup monitoring/notifications
+ /usr/local/bin/minicron 60 /var/run/gmirror_status_check.pid /usr/local/sbin/gmirror_status_check.php
+fi
+
+# Log product version to syslog
+BUILDTIME=`cat /etc/version.buildtime`
+ARCH=`uname -m`
+echo "$product ($PLATFORM) $version $ARCH $BUILDTIME"
+
+echo "Bootup complete"
+
+/usr/local/bin/beep.sh start 2>&1 >/dev/null
+
+# Reset the cache. read-only requires this.
+/bin/rm -f /tmp/config.cache
+
+exit 0
diff --git a/src/etc/rc.backup_dhcpleases.sh b/src/etc/rc.backup_dhcpleases.sh
new file mode 100755
index 0000000..73f83a8
--- /dev/null
+++ b/src/etc/rc.backup_dhcpleases.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# Save the DHCP lease database to the config path.
+if [ -d "/var/dhcpd/var/db" ]; then
+ /etc/rc.conf_mount_rw
+ cd / && tar -czf /cf/conf/dhcpleases.tgz -C / var/dhcpd/var/db/
+ /etc/rc.conf_mount_ro
+fi
diff --git a/src/etc/rc.backup_rrd.sh b/src/etc/rc.backup_rrd.sh
new file mode 100755
index 0000000..c14ffc7
--- /dev/null
+++ b/src/etc/rc.backup_rrd.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+: ${RRDDBPATH:=/var/db/rrd}
+: ${CF_CONF_PATH:=/cf/conf}
+
+# Save the rrd databases to the config path.
+if [ -d "${RRDDBPATH}" ]; then
+ [ -z "$NO_REMOUNT" ] && /etc/rc.conf_mount_rw
+ [ -f "${CF_CONF_PATH}/rrd.tgz" ] && /bin/rm -f "${CF_CONF_PATH}"/rrd.tgz
+
+ tgzlist=""
+
+ for rrdfile in "${RRDDBPATH}"/*.rrd ; do
+ xmlfile="${rrdfile%.rrd}.xml"
+ tgzfile="${rrdfile%.rrd}.tgz"
+ /usr/bin/nice -n20 /usr/local/bin/rrdtool dump "$rrdfile" "$xmlfile"
+ cd / && /usr/bin/tar -czf "${tgzfile}" -C / "${RRDDBPATH#/}"/*.xml
+ /bin/rm -f "${RRDDBPATH}"/*.xml
+ tgzlist="${tgzlist} @${tgzfile}"
+ done
+ if [ -n "${tgzlist}" ]; then
+ cd / && /usr/bin/tar -czf "${CF_CONF_PATH}/rrd.tgz" ${tgzlist}
+ /bin/rm -f "${RRDDBPATH}"/*.tgz
+ fi
+ [ -z "$NO_REMOUNT" ] && /etc/rc.conf_mount_ro
+fi
+
diff --git a/src/etc/rc.banner b/src/etc/rc.banner
new file mode 100755
index 0000000..5e64dae
--- /dev/null
+++ b/src/etc/rc.banner
@@ -0,0 +1,123 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ $Id$
+
+ rc.banner
+ part of pfSense
+ Copyright (C) 2005 Scott Ullrich and Colin Smith
+ Copyright (C) 2009 Ermal Luçi
+ All rights reserved
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+ require_once("config.inc");
+ require_once("gwlb.inc");
+ require_once("interfaces.inc");
+
+ $platform = trim(file_get_contents("{$g['etc_path']}/platform"));
+ $hostname = $config['system']['hostname'];
+ $product = $g['product_name'];
+ $machine = trim(`uname -m`);
+ $hideplatform = $g['hideplatform'];
+
+ if (!$hideplatform) {
+ $platformbanner = "-{$platform}";
+ }
+
+ print "*** Welcome to {$product} {$g['product_version']}{$platformbanner} ({$machine}) on {$hostname} ***\n";
+
+ $iflist = get_configured_interface_with_descr(false, true);
+ foreach ($iflist as $ifname => $friendly) {
+ /* point to this interface's config */
+ $ifconf = $config['interfaces'][$ifname];
+ /* look for 'special cases' */
+ switch ($ifconf['ipaddr']) {
+ case "dhcp":
+ $class = "/DHCP4";
+ break;
+ case "pppoe":
+ $class = "/PPPoE";
+ break;
+ case "pptp":
+ $class = "/PPTP";
+ break;
+ case "l2tp":
+ $class = "/L2TP";
+ break;
+ default:
+ $class = "";
+ break;
+ }
+ switch ($ifconf['ipaddrv6']) {
+ case "dhcp6":
+ $class6 = "/DHCP6";
+ break;
+ case "slaac":
+ $class6 = "/SLAAC";
+ break;
+ case "6rd":
+ $class6 = "/6RD";
+ break;
+ case "6to4":
+ $class6 = "/6to4";
+ break;
+ case "track6":
+ $class6 = "/t6";
+ break;
+ }
+ $ipaddr = get_interface_ip($ifname);
+ $subnet = get_interface_subnet($ifname);
+ $ipaddr6 = get_interface_ipv6($ifname);
+ $subnet6 = get_interface_subnetv6($ifname);
+ $realif = get_real_interface($ifname);
+ $tobanner = "{$friendly} ({$ifname})";
+
+ printf("\n %-15s -> %-10s -> ",
+ $tobanner,
+ $realif
+ );
+ $v6first = false;
+ if (!empty($ipaddr) && !empty($subnet)) {
+ printf("v4%s: %s/%s",
+ $class,
+ $ipaddr,
+ $subnet
+ );
+ } else {
+ $v6first = true;
+ }
+ if (!empty($ipaddr6) && !empty($subnet6)) {
+ if (!$v6first) {
+ printf("\n%s", str_repeat(" ", 34));
+ }
+ printf("v6%s: %s/%s",
+ $class6,
+ $ipaddr6,
+ $subnet6
+ );
+ }
+ }
+ printf("\n");
+?>
diff --git a/src/etc/rc.bootup b/src/etc/rc.bootup
new file mode 100755
index 0000000..d27f795
--- /dev/null
+++ b/src/etc/rc.bootup
@@ -0,0 +1,428 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.bootup
+ part of pfSense by Scott Ullrich
+ originally based on m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2004-2009 Scott Ullrich <sullrich@pfsense.org>.
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2009 Erik Kristensen
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+function rescue_detect_keypress() {
+ // How long do you want the script to wait before moving on (in seconds)
+ $timeout=9;
+ echo "\n";
+ echo "[ Press R to enter recovery mode or ]\n";
+ echo "[ press I to launch the installer ]\n\n";
+ echo "(R)ecovery mode can assist by rescuing config.xml\n";
+ echo "from a broken hard disk installation, etc.\n\n";
+ echo "(I)nstaller will be invoked\n\n";
+ echo "Timeout before auto boot continues (seconds): {$timeout}";
+ $key = null;
+ exec("/bin/stty erase " . chr(8));
+ while (!in_array($key, array("r", "R", "i", "I"))) {
+ echo chr(8) . "{$timeout}";
+ `/bin/stty -icanon min 0 time 25`;
+ $key = trim(`KEY=\`dd count=1 2>/dev/null\`; echo \$KEY`);
+ `/bin/stty icanon`;
+ // Decrement our timeout value
+ $timeout--;
+ // If we have reached 0 exit and continue on
+ if ($timeout == 0) {
+ break;
+ }
+ }
+ // If R or I was pressed do our logic here
+ if (in_array($key, array("r", "R"))) {
+ putenv("TERM=cons25");
+ echo "\n\nRecovery mode selected...\n";
+ passthru("/usr/bin/env TERM=cons25 /bin/tcsh -c /scripts/lua_installer rescue");
+ } else {
+ putenv("TERM=cons25");
+ echo "\n\nInstaller mode selected...\n";
+ passthru("/usr/bin/env TERM=cons25 /bin/tcsh -c /scripts/lua_installer");
+ }
+
+ passthru("/etc/rc.reboot");
+ exit;
+}
+
+echo " done.\n";
+
+echo "Initializing...";
+echo ".";
+require_once("/etc/inc/globals.inc");
+echo ".";
+require_once("/etc/inc/led.inc");
+led_normalize();
+echo ".";
+if (led_count() >= 3) {
+ led_kitt();
+}
+
+/* let the other functions know we're booting */
+$pkg_interface = 'console';
+$g['booting'] = true;
+
+/* parse the configuration and include all functions used below */
+require_once("/etc/inc/config.inc");
+echo ".";
+require_once("/etc/inc/config.console.inc");
+echo ".";
+require_once("/etc/inc/auth.inc");
+echo ".";
+require_once("/etc/inc/functions.inc");
+echo ".";
+require_once("/etc/inc/filter.inc");
+echo ".";
+require_once("/etc/inc/shaper.inc");
+echo ".";
+require_once("/etc/inc/ipsec.inc");
+echo ".";
+require_once("/etc/inc/vpn.inc");
+echo ".";
+require_once("/etc/inc/openvpn.inc");
+echo ".";
+require_once("/etc/inc/captiveportal.inc");
+echo ".";
+require_once("/etc/inc/rrd.inc");
+echo ".";
+require_once("/etc/inc/pfsense-utils.inc");
+echo ".";
+
+/* get system memory amount */
+$memory = get_memory();
+$physmem = $memory[0];
+$realmem = $memory[1];
+echo " done.\n";
+
+conf_mount_rw();
+
+/* save dmesg output to file */
+system_dmesg_save();
+
+/* check whether config reset is desired (via hardware button on WRAP/ALIX) */
+system_check_reset_button();
+
+/* remove previous firmware upgrade if present */
+if (file_exists("/root/firmware.tgz")) {
+ unlink("/root/firmware.tgz");
+}
+
+/* start devd (dhclient now uses it) */
+echo "Starting device manager (devd)...";
+mute_kernel_msgs();
+start_devd();
+set_device_perms();
+unmute_kernel_msgs();
+echo "done.\n";
+
+// Display rescue configuration option
+if ($g['platform'] == "cdrom") {
+ rescue_detect_keypress();
+}
+
+echo "Loading configuration...";
+parse_config_bootup();
+echo "done.\n";
+
+/*
+ * Determine if we need to throw a interface exception
+ * and ask the user to reassign interfaces. This will
+ * avoid a reboot and that is a good thing.
+ */
+while (is_interface_mismatch() == true) {
+ led_assigninterfaces();
+ if (isset($config['revision'])) {
+ if (file_exists("{$g['tmp_path']}/missing_interfaces")) {
+ echo "Warning: Configuration references interfaces that do not exist: " . file_get_contents("{$g['tmp_path']}/missing_interfaces") . "\n";
+ }
+ echo "\nNetwork interface mismatch -- Running interface assignment option.\n";
+ } else {
+ echo "\nDefault interfaces not found -- Running interface assignment option.\n";
+ }
+ $ifaces = get_interface_list();
+ if (is_array($ifaces)) {
+ foreach ($ifaces as $iface => $ifdata) {
+ interfaces_bring_up($iface);
+ }
+ }
+ set_networking_interfaces_ports();
+ led_kitt();
+}
+
+/* convert config and clean backups */
+echo "Updating configuration...";
+convert_config();
+echo "done.\n";
+
+echo "Cleaning backup cache...";
+cleanup_backupcache(true);
+echo "done.\n";
+
+/* read in /etc/sysctl.conf and set values if needed */
+echo "Setting up extended sysctls...";
+system_setup_sysctl();
+echo "done.\n";
+
+/* enable optional crypto modules */
+load_crypto();
+
+/* enable optional thermal sensor modules */
+load_thermal_hardware();
+
+/* run any early shell commands specified in config.xml */
+system_do_shell_commands(1);
+
+/* set up our timezone */
+system_timezone_configure();
+
+/* set up our hostname */
+system_hostname_configure();
+
+/* make hosts file */
+system_hosts_generate();
+
+/* configure loopback interface */
+interfaces_loopback_configure();
+
+/* start syslogd */
+system_syslogd_start();
+
+echo "Starting Secure Shell Services...";
+send_event("service reload sshd");
+echo "done.\n";
+
+/* setup polling */
+echo "Setting up polling defaults...";
+setup_polling();
+echo "done.\n";
+
+/* setup interface microcode which improves tcp/ip speed */
+echo "Setting up interfaces microcode...";
+setup_microcode();
+echo "done.\n";
+
+/* set up interfaces */
+if (!$debugging) {
+ mute_kernel_msgs();
+}
+interfaces_configure();
+interfaces_sync_setup();
+if (!$debugging) {
+ unmute_kernel_msgs();
+}
+
+/* re-make hosts file after configuring interfaces */
+system_hosts_generate();
+
+/* start OpenVPN server & clients */
+echo "Syncing OpenVPN settings...";
+openvpn_resync_all();
+echo "done.\n";
+
+/* generate resolv.conf */
+system_resolvconf_generate();
+
+/* setup altq + pf */
+filter_configure_sync();
+
+/* start pflog */
+echo "Starting PFLOG...";
+filter_pflog_start();
+echo "done.\n";
+
+/* reconfigure our gateway monitor */
+echo "Setting up gateway monitors...";
+setup_gateways_monitor();
+echo "done.\n";
+
+echo "Synchronizing user settings...";
+local_sync_accounts();
+echo "done.\n";
+
+if ($realmem > 0 and $realmem < 65) {
+ echo "System has less than 65 megabytes of ram {$realmem}. Delaying webConfigurator startup.\n";
+ /* start webConfigurator up on final pass */
+ mwexec("/usr/local/sbin/pfSctl -c 'service restart webgui'");
+} else {
+ /* start web server */
+ system_webgui_start();
+}
+
+/* configure cron service */
+echo "Configuring CRON...";
+configure_cron();
+echo "done.\n";
+
+/* set up static routes */
+system_routing_configure();
+
+/* enable routing */
+system_routing_enable();
+
+/* start dnsmasq service */
+services_dnsmasq_configure();
+
+/* start unbound service */
+services_unbound_configure();
+
+/* Do an initial time sync */
+echo "Starting NTP time client...";
+/* At bootup this will just write the config, ntpd will launch from ntpdate_sync_once.sh */
+system_ntp_configure(false);
+mwexec_bg("/usr/local/sbin/ntpdate_sync_once.sh", true);
+echo "done.\n";
+
+/* start load balancer daemon */
+relayd_configure();
+
+/* configure console menu */
+system_console_configure();
+
+/* start DHCP service */
+services_dhcpd_configure();
+
+/* start dhcpleases dhcp hosts leases program */
+system_dhcpleases_configure();
+
+/* start DHCP relay */
+services_dhcrelay_configure();
+
+/* start DHCP6 relay */
+services_dhcrelay6_configure();
+
+/* dyndns service updates */
+send_event("service reload dyndnsall");
+
+/* Run a filter configure now that most all services have started */
+filter_configure_sync();
+
+/* setup pppoe and pptp */
+vpn_setup();
+
+/* start the captive portal */
+captiveportal_configure();
+
+/* start Voucher support */
+voucher_configure();
+
+/* run any shell commands specified in config.xml */
+system_do_shell_commands();
+
+/* start IPsec tunnels */
+$ipsec_dynamic_hosts = vpn_ipsec_configure();
+
+/* start SNMP service */
+services_snmpd_configure();
+
+/* power down hard drive if needed/set */
+system_set_harddisk_standby();
+
+/* lock down console if necessary */
+reload_ttys();
+
+/* load graphing functions */
+enable_rrd_graphing();
+
+/* enable watchdog if supported */
+enable_watchdog();
+
+/* if <system><afterbootupshellcmd> exists, execute the command */
+if ($config['system']['afterbootupshellcmd'] <> "") {
+ echo "Running afterbootupshellcmd {$config['system']['afterbootupshellcmd']}\n";
+ mwexec($config['system']['afterbootupshellcmd']);
+}
+
+if ($physmem < $g['minimum_ram_warning']) {
+ require_once("/etc/inc/notices.inc");
+ file_notice("{$g['product_name']}MemoryRequirements", "{$g['product_name']} requires at least {$g['minimum_ram_warning_text']} of RAM. Expect unusual performance. This platform is not supported.", "Memory", "", 1);
+ set_sysctl(array(
+ "net.inet.tcp.recvspace" => "4096",
+ "net.inet.tcp.sendspace" => "4096"
+ ));
+}
+
+/* if we are operating at 1000 then increase timeouts.
+ this was never accounted for after moving to 1000 hz */
+$kern_hz = get_single_sysctl('kern.clockrate');
+$kern_hz = substr($kern_hz, strpos($kern_hz, "hz = ") + 5);
+$kern_hz = substr($kern_hz, 0, strpos($kern_hz, ","));
+if ($kern_hz == "1000") {
+ set_single_sysctl("net.inet.tcp.rexmit_min" , "30");
+}
+
+/* start the igmpproxy daemon */
+services_igmpproxy_configure();
+
+/* start the upnp daemon if it is enabled */
+upnp_start();
+
+/* If powerd is enabled, lets launch it */
+activate_powerd();
+
+/* Set preferred protocol */
+prefer_ipv4_or_ipv6();
+
+/* Remove the old shutdown binary if we kept it. */
+if (file_exists("/sbin/shutdown.old")) {
+ @unlink("/sbin/shutdown.old");
+}
+
+/* Resync / Reinstall packages if need be */
+if (file_exists('/conf/needs_package_sync')) {
+ if ($config['installedpackages'] <> '' && is_array($config['installedpackages']['package'])) {
+ require_once("pkg-utils.inc");
+ if ($g['platform'] == "pfSense" || $g['platform'] == "nanobsd") {
+ mark_subsystem_dirty('packagelock');
+ pkg_reinstall_all();
+ clear_subsystem_dirty('packagelock');
+ }
+ }
+ @unlink('/conf/needs_package_sync');
+}
+
+/* Give syslogd a kick after everything else has been initialized, otherwise it can occasionally
+ fail to route syslog messages properly on both IPv4 and IPv6 */
+system_syslogd_start();
+
+/* done */
+unset($g['booting']);
+@unlink("{$g['varrun_path']}/booting");
+
+/* If there are ipsec dynamic hosts try again to reload the tunnels as rc.newipsecdns does */
+if ($ipsec_dynamic_hosts) {
+ vpn_ipsec_configure();
+}
+if ($ipsec_dynamic_hosts || !empty($filterdns)) {
+ filter_configure();
+}
+
+led_normalize();
+
+conf_mount_ro();
+
+?>
diff --git a/src/etc/rc.captiveportal_configure b/src/etc/rc.captiveportal_configure
new file mode 100755
index 0000000..45c26bf
--- /dev/null
+++ b/src/etc/rc.captiveportal_configure
@@ -0,0 +1,40 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.captiveportal_configure
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require("config.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+captiveportal_configure();
+
+?>
diff --git a/src/etc/rc.captiveportal_configure_mac b/src/etc/rc.captiveportal_configure_mac
new file mode 100755
index 0000000..b0daf68
--- /dev/null
+++ b/src/etc/rc.captiveportal_configure_mac
@@ -0,0 +1,52 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.captiveportal_configure_mac
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2015 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require("config.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+global $cpzone;
+
+$cpzone = isset($_GET['cpzone']) ? $_GET['cpzone'] : trim($argv[1]);
+$startidx = isset($_GET['startidx']) ? $_GET['startidx'] : trim($argv[2]);
+$stopidx = isset($_GET['cpzone']) ? $_GET['stopidx'] : trim($argv[3]);
+
+$cpzoneidx = $config['captiveportal'][$cpzone]['zoneid'];
+$filename = "{$g['tmp_path']}/{$cpzoneidx}_mac_{$startidx}_{$stopidx}";
+
+//log_error("STARTED: " . time() . " - {$cpzone} : $startidx : {$stopidx} : {$cpzoneidx} : {$filename}");
+captiveportal_passthrumac_configure($filename, $startidx, $stopidx);
+//log_error("STOPPED: " .time() . " - {$cpzone} : $startidx : {$stopidx} : {$cpzoneidx} : {$filename}");
+
+mwexec("/sbin/ipfw -x {$cpzoneidx} -q {$filename}");
+@unlink($filename);
+?>
diff --git a/src/etc/rc.carpbackup b/src/etc/rc.carpbackup
new file mode 100755
index 0000000..6961bc8
--- /dev/null
+++ b/src/etc/rc.carpbackup
@@ -0,0 +1,97 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.carpbackup
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("functions.inc");
+require_once("config.inc");
+require_once("notices.inc");
+require_once("openvpn.inc");
+require_once("interfaces.inc");
+
+if (isset($_GET)) {
+ $argument = $_GET['interface'];
+} else {
+ $argument = str_replace("\n", "", $argv[1]);
+}
+if (!strstr($argument, "@")) {
+ log_error("Carp MASTER event triggered from wrong source {$argument}");
+}
+
+list($vhid, $iface) = explode("@", $argument);
+
+$friendly = convert_real_interface_to_friendly_interface_name($iface);
+$friendly_descr = convert_friendly_interface_to_friendly_descr($friendly);
+$vips = link_interface_to_vips($friendly, '', $vhid);
+$carp_iface = "{$friendly}_vip{$vhid}";
+foreach ($vips as $vip) {
+ $notificationmsg = sprintf('Carp cluster member "{$friendly_descr)(%2$s): {$vip['subnet']} (%1$s)" has resumed the state "BACKUP" for vhid %s', $argument, $vip['descr'], $vhid);
+
+ notify_via_smtp($notificationmsg);
+ notify_via_growl($notificationmsg);
+ log_error($notificationmsg);
+}
+
+/* Stop OpenVPN clients running on this VIP, since multiple active OpenVPN clients on a CARP cluster can be problematic. */
+global $config;
+if (is_array($config['openvpn']) && is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as $settings) {
+ foreach ($vips as $vip) {
+ if ($settings['interface'] == "_vip{$vip['uniqid']}") {
+ log_error("Stopping OpenVPN client instance on {$friendly_descr} because of transition to CARP backup.");
+ openvpn_restart('client', $settings);
+ }
+ }
+ }
+}
+
+/* Reconfigure radvd when necessary */
+if (isset($config['dhcpdv6']) && is_array($config['dhcpdv6'])) {
+ $found = false;
+ foreach ($config['dhcpdv6'] as $dhcpv6if => $dhcpv6ifconf) {
+ if ($dhcpv6ifconf['rainterface'] != $carp_iface) {
+ continue;
+ }
+
+ $found = true;
+ break;
+ }
+
+ if ($found === true) {
+ services_radvd_configure();
+ }
+}
+
+$pluginparams = array();
+$pluginparams['type'] = 'carp';
+$pluginparams['event'] = 'rc.carpbackup';
+$pluginparams['interface'] = $argument;
+pkg_call_plugins('plugin_carp', $pluginparams);
+
+?>
diff --git a/src/etc/rc.carpmaster b/src/etc/rc.carpmaster
new file mode 100755
index 0000000..022fe8f
--- /dev/null
+++ b/src/etc/rc.carpmaster
@@ -0,0 +1,105 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.carpmaster
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("functions.inc");
+require_once("config.inc");
+require_once("notices.inc");
+require_once("openvpn.inc");
+require_once("interfaces.inc");
+
+if (isset($_GET)) {
+ $argument = $_GET['interface'];
+} else {
+ $argument = str_replace("\n", "", $argv[1]);
+}
+if (!strstr($argument, "@")) {
+ log_error("Carp MASTER event triggered from wrong source {$argument}");
+}
+
+list($vhid, $iface) = explode("@", $argument);
+
+$friendly = convert_real_interface_to_friendly_interface_name($iface);
+$friendly_descr = convert_friendly_interface_to_friendly_descr($friendly);
+$vips = link_interface_to_vips($friendly, '', $vhid);
+$carp_iface = "{$friendly}_vip{$vhid}";
+foreach ($vips as $vip) {
+ $notificationmsg = sprintf('Carp cluster member "{$friendly_descr)(%2$s): {$vip['subnet']} (%1$s)" has resumed the state "MASTER" for vhid %s', $argument, $vip['descr'], $vhid);
+
+ notify_via_smtp($notificationmsg);
+ notify_via_growl($notificationmsg);
+ log_error($notificationmsg);
+}
+
+/* Start OpenVPN clients running on this VIP, since they should be in the stopped state while the VIP is CARP Backup. */
+global $config;
+if (is_array($config['openvpn']) && is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as $settings) {
+ foreach ($vips as $vip) {
+ if ($settings['interface'] == "_vip{$vip['uniqid']}") {
+ log_error("Starting OpenVPN client instance on {$friendly_descr} because of transition to CARP master.");
+ openvpn_restart('client', $settings);
+ }
+ }
+ }
+}
+if (is_array($config['openvpn']) && is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $settings) {
+ if ($settings['interface'] == $carp_iface) {
+ log_error("Starting OpenVPN instance on {$friendly_descr} because of transition to CARP master.");
+ openvpn_restart('server', $settings);
+ }
+ }
+}
+
+/* Reconfigure radvd when necessary */
+if (isset($config['dhcpdv6']) && is_array($config['dhcpdv6'])) {
+ $found = false;
+ foreach ($config['dhcpdv6'] as $dhcpv6if => $dhcpv6ifconf) {
+ if ($dhcpv6ifconf['rainterface'] != $carp_iface) {
+ continue;
+ }
+
+ $found = true;
+ break;
+ }
+
+ if ($found === true) {
+ services_radvd_configure();
+ }
+}
+
+$pluginparams = array();
+$pluginparams['type'] = 'carp';
+$pluginparams['event'] = 'rc.carpmaster';
+$pluginparams['interface'] = $argument;
+pkg_call_plugins('plugin_carp', $pluginparams);
+
+?>
diff --git a/src/etc/rc.cdrom b/src/etc/rc.cdrom
new file mode 100755
index 0000000..5e8d80f
--- /dev/null
+++ b/src/etc/rc.cdrom
@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# rc.cdrom - livedisc specific routines
+# For pfSense
+
+# Size of memory file system /cf/conf partition
+partsize="6m"
+
+export VARMFS_COPYDBPKG=yes
+
+for i in tmp varmfs etcmfs; do
+ if [ -f /etc/rc.d/$i ]; then
+ sh /etc/rc.d/$i start
+ fi
+done
+
+# Start PFI
+/bin/sh /scripts/pfi start
+
+# If PFI did not find a config, we should create
+# a tiny mfs under /cf/conf and populate with stock
+# configuration.
+if [ ! -f /conf/config.xml ]; then
+ echo -n "Generating a MFS /conf partition... "
+ device=$(mdconfig -a -t malloc -s ${partsize})
+ newfs /dev/${device} > /dev/null 2>&1
+ mount /dev/${device} /cf/conf
+ cp /conf.default/* /cf/conf
+ echo "done."
+fi
+
+echo -n "Generating a MFS /home partition... "
+device=$(mdconfig -a -t malloc -s ${partsize})
+newfs /dev/${device} > /dev/null 2>&1
+mount /dev/${device} /home
+echo "done."
+
+# Create some needed directories
+/bin/mkdir -p /var/tmp/vi.recover/
diff --git a/src/etc/rc.conf b/src/etc/rc.conf
new file mode 100644
index 0000000..01cd50f
--- /dev/null
+++ b/src/etc/rc.conf
@@ -0,0 +1 @@
+# THIS FILE DOES NOTHING, DO NOT MAKE CONFIG CHANGES HERE
diff --git a/src/etc/rc.conf_mount_ro b/src/etc/rc.conf_mount_ro
new file mode 100755
index 0000000..6beb5e8
--- /dev/null
+++ b/src/etc/rc.conf_mount_ro
@@ -0,0 +1,36 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.conf_mount_ro
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+
+conf_mount_ro();
+
+?>
diff --git a/src/etc/rc.conf_mount_rw b/src/etc/rc.conf_mount_rw
new file mode 100755
index 0000000..b153e36
--- /dev/null
+++ b/src/etc/rc.conf_mount_rw
@@ -0,0 +1,36 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.conf_mount_rw
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+
+conf_mount_rw();
+
+?>
diff --git a/src/etc/rc.create_full_backup b/src/etc/rc.create_full_backup
new file mode 100755
index 0000000..048e68b
--- /dev/null
+++ b/src/etc/rc.create_full_backup
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+FILENAME="pfSense-full-backup-`date "+%Y%m%d-%H%M"`.tgz"
+echo ">>> Creating full backup to /root/$FILENAME"
+tar czPf /root/$FILENAME \
+ --exclude dev/* \
+ --exclude tmp/* \
+ --exclude var/db \
+ --exclude var/run/* \
+ --exclude root/* \
+ --exclude var/empty/* \
+ --exclude var/empty \
+ --exclude var/etc \
+ /
+
+echo ">>> Backup completed. Note: this backup includes config.xml!"
+echo ">>> To restore this backup run this command:"
+echo " /etc/rc.restore_full_backup /root/$FILENAME"
diff --git a/src/etc/rc.d/etcmfs b/src/etc/rc.d/etcmfs
new file mode 100755
index 0000000..7e50427
--- /dev/null
+++ b/src/etc/rc.d/etcmfs
@@ -0,0 +1,80 @@
+#!/bin/sh
+#
+# Copyright (c) 2005 Dario Freni
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+# $Id: etcmfs.rc,v 1.1.1.1 2008/03/25 19:58:16 sullrich Exp $
+#
+
+# PROVIDE: etcmfs
+# REQUIRE: mountcritlocal
+# BEFORE: var
+
+. /etc/rc.subr
+
+name="etcmfs"
+kenvetcsize=`kenv -q freesbie.etcsize`
+etcsize=${kenvetcsize:-"20m"}
+kenvlocaletcsize=`kenv -q freesbie.localetcsize`
+localetcsize=${kenvlocaletcsize:-"32m"}
+
+load_rc_config $name
+
+tempdir=/tmp
+
+echo "Generating MFS /etc partition"
+
+device=$(mdconfig -a -t malloc -o compress -s ${etcsize})
+bsdlabel -w ${device} auto
+newfs -n -m 2 /dev/${device} > /dev/null 2>&1
+mount -o noatime /dev/${device} ${tempdir}
+
+back=$PWD
+
+cd /etc
+find . -print -depth | cpio -dump --quiet ${tempdir}
+
+cd $back
+
+mtree -PUer -q -p ${tempdir} < /etc/mtree/etc.dist > /dev/null 2>&1
+
+umount ${tempdir}
+mount -o noatime /dev/${device} /etc
+
+if [ -f /etc/mtree/localetc.dist ]; then
+ device=$(mdconfig -a -t malloc -o compress -s ${localetcsize})
+ newfs /dev/${device} > /dev/null 2>&1
+ mount -o noatime /dev/${device} ${tempdir}
+
+ cd /usr/local/etc
+ find . -print -depth | cpio -dump --quiet ${tempdir}
+
+ cd $back
+
+ mtree -PUer -q -p ${tempdir} < /etc/mtree/localetc.dist > /dev/null 2>&1
+
+ umount ${tempdir}
+ mount -o noatime /dev/${device} /usr/local/etc
+fi
diff --git a/src/etc/rc.d/hostid b/src/etc/rc.d/hostid
new file mode 100755
index 0000000..37ea173
--- /dev/null
+++ b/src/etc/rc.d/hostid
@@ -0,0 +1,137 @@
+#!/bin/sh
+#
+# Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org>
+# Copyright (c) 2015 Xin LI <delphij@FreeBSD.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+
+# PROVIDE: hostid
+# REQUIRE: sysctl
+# KEYWORD: nojail
+
+. /etc/rc.subr
+
+name="hostid"
+start_cmd="hostid_start"
+stop_cmd=":"
+reset_cmd="hostid_reset"
+extra_commands="reset"
+rcvar="hostid_enable"
+
+hostid_set()
+{
+ uuid=$1
+ # Generate hostid based on hostuuid - take first four bytes from md5(uuid).
+ id=`echo -n $uuid | /sbin/md5`
+ id="0x${id%????????????????????????}"
+
+ # Set both kern.hostuuid and kern.hostid.
+ #
+ check_startmsgs && echo "Setting hostuuid: ${uuid}."
+ ${SYSCTL} kern.hostuuid="${uuid}" >/dev/null
+ check_startmsgs && echo "Setting hostid: ${id}."
+ ${SYSCTL} kern.hostid=${id} >/dev/null
+}
+
+valid_hostid()
+{
+ uuid=$1
+
+ x="[0-9a-f]"
+ y=$x$x$x$x
+
+ # Check against a blacklist before
+ # accepting the UUID.
+ case "${uuid}" in
+ 00000000-0000-0000-0000-000000000000)
+ ;;
+ 00020003-0004-0005-0006-000700080009)
+ ;;
+ 03000200-0400-0500-0006-000700080009)
+ ;;
+ 07090201-0103-0301-0807-060504030201)
+ ;;
+ 11111111-1111-1111-1111-111111111111)
+ ;;
+ 11111111-2222-3333-4444-555555555555)
+ ;;
+ 4c4c4544-0000-2010-8020-80c04f202020)
+ ;;
+ 58585858-5858-5858-5858-585858585858)
+ ;;
+ 890e2d14-cacd-45d1-ae66-bc80e8bfeb0f)
+ ;;
+ 8e275844-178f-44a8-aceb-a7d7e5178c63)
+ ;;
+ dc698397-fa54-4cf2-82c8-b1b5307a6a7f)
+ ;;
+ fefefefe-fefe-fefe-fefe-fefefefefefe)
+ ;;
+ *-ffff-ffff-ffff-ffffffffffff)
+ ;;
+ $y$y-$y-$y-$y-$y$y$y)
+ return 0
+ ;;
+ esac
+
+ return 1
+}
+
+hostid_generate()
+{
+ # First look for UUID in hardware.
+ # If not found, fall back to software-generated UUID.
+ uuid=`uuidgen`
+ hostid_set $uuid
+}
+
+hostid_reset()
+{
+ hostid_generate
+ # Store newly generated UUID in ${hostid_file}.
+ echo $uuid > ${hostid_file}
+ if [ $? -ne 0 ]; then
+ warn "could not store hostuuid in ${hostid_file}."
+ fi
+}
+
+hostid_start()
+{
+ # If ${hostid_file} already exists, we take UUID from there.
+ if [ -r ${hostid_file} ]; then
+ read saved_hostid < ${hostid_file}
+ if valid_hostid ${saved_hostid}; then
+ hostid_set `cat ${hostid_file}`
+ exit 0
+ fi
+ fi
+
+ # No hostid file, generate UUID.
+ hostid_generate
+}
+
+load_rc_config $name
+run_rc_command "$1"
diff --git a/src/etc/rc.d/varmfs b/src/etc/rc.d/varmfs
new file mode 100755
index 0000000..2921a1a
--- /dev/null
+++ b/src/etc/rc.d/varmfs
@@ -0,0 +1,66 @@
+#!/bin/sh
+#
+# Copyright (c) 2005 Dario Freni
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+# $Id: varmfs.rc,v 1.1.1.1 2008/03/25 19:58:16 sullrich Exp $
+#
+
+# PROVIDE: varmfs
+# REQUIRE: mountcritlocal
+# BEFORE: var
+
+. /etc/rc.subr
+
+name="varmfs"
+kenvvarsize=`kenv -q freesbie.varsize`
+varsize=${kenvvarsize:-"32m"}
+
+load_rc_config $name
+
+tempdir=/tmp
+
+echo "Generating MFS /var partition"
+
+device=$(mdconfig -a -t malloc -o compress -s ${varsize})
+bsdlabel -w ${device} auto
+newfs -n -m 2 /dev/${device} > /dev/null 2>&1
+mount -o noatime /dev/${device} ${tempdir}
+
+back=$PWD
+
+cd /var
+if [ -z "${VARMFS_COPYDBPKG:-}" ]; then
+ find . -not -path "*/db/pkg*" -print -depth | cpio -dump --quiet ${tempdir}
+else
+ find . -print -depth | cpio -dump --quiet ${tempdir}
+fi
+
+cd $back
+
+mtree -PUer -q -p ${tempdir} < /etc/mtree/var.dist > /dev/null 2>&1
+
+umount ${tempdir}
+mount -o noatime /dev/${device} /var
diff --git a/src/etc/rc.dhclient_cron b/src/etc/rc.dhclient_cron
new file mode 100755
index 0000000..a38932d
--- /dev/null
+++ b/src/etc/rc.dhclient_cron
@@ -0,0 +1,53 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.dhclient_cron
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2006 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+
+/* invalidate cache */
+vc_invalidate();
+
+unlink_if_exists("/tmp/config.cache");
+
+$iflist = get_configured_interface_with_descr();
+foreach ($iflist as $ifname => $interface) {
+ $real_interface = get_real_interface($ifname);
+ if ($config['interfaces'][$ifname]['ipaddr'] == "dhcp") {
+ $pid = find_dhclient_process($real_interface);
+ if ($pid == 0 or !$pid) {
+ /* dhclient is not running for interface, kick it */
+ log_error("DHCLIENT was not running for {$real_interface} ... Launching new instance.");
+ exec("/sbin/dhclient $real_interface");
+ }
+ }
+}
+
+?>
diff --git a/src/etc/rc.disable_hdd_apm b/src/etc/rc.disable_hdd_apm
new file mode 100755
index 0000000..e9b3ba5
--- /dev/null
+++ b/src/etc/rc.disable_hdd_apm
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+ATAIDLE=/usr/local/sbin/ataidle
+for i in /dev/ad?; do
+ if [ ! -e ${i} ]; then
+ continue;
+ fi
+ SUPPORTED=`${ATAIDLE} ${i} | grep "APM Supported" | awk '{print $3;}'`
+ if [ "${SUPPORTED}" = "yes" ] ; then
+ echo Disabling APM on $i
+ ${ATAIDLE} -P 0 ${i}
+ fi
+done
diff --git a/src/etc/rc.dumpon b/src/etc/rc.dumpon
new file mode 100755
index 0000000..1ad40bb
--- /dev/null
+++ b/src/etc/rc.dumpon
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Based on:
+# FreeBSD: src/etc/rc.d/dumpon,v 1.12.2.1.4.1 2010/06/14 02:09:06 kensmith Exp
+
+# dumpon
+
+dumpon_try()
+{
+ if /sbin/dumpon "${1}" ; then
+ # Make a symlink in devfs for savecore
+ echo "Using ${1} for dump device."
+ ln -fs "${1}" /dev/dumpdev
+ return 0
+ fi
+ echo "Unable to specify $1 as a dump device."
+ return 1
+}
+
+# Enable dumpdev so that savecore can see it. Enable it
+# early so a crash early in the boot process can be caught.
+#
+while read dev mp type more ; do
+ [ "${type}" = "swap" ] || continue
+ [ -c "${dev}" ] || continue
+ dumpon_try "${dev}" && works=true
+done </etc/fstab
+if [ "${works}" != "true" ]; then
+ echo "No suitable dump device was found." 1>&2
+ exit
+fi \ No newline at end of file
diff --git a/src/etc/rc.dyndns.update b/src/etc/rc.dyndns.update
new file mode 100755
index 0000000..543b5a0
--- /dev/null
+++ b/src/etc/rc.dyndns.update
@@ -0,0 +1,58 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.dyndns.update
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("gwlb.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+/* Interface IP address has changed */
+
+if (isset($_GET['dyndns'])) {
+ $argument = $_GET['dyndns'];
+} else {
+ $argument = trim($argv[1], " \n");
+}
+
+if (empty($argument) || $argument == "all") {
+ services_dyndns_configure();
+ services_dnsupdate_process();
+} else {
+ $interface = lookup_gateway_interface_by_name($argument);
+ if (empty($interface)) {
+ $interface = $argument;
+ }
+ services_dyndns_configure($interface);
+ services_dnsupdate_process($interface);
+}
+
+?>
diff --git a/src/etc/rc.embedded b/src/etc/rc.embedded
new file mode 100755
index 0000000..663822d
--- /dev/null
+++ b/src/etc/rc.embedded
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# rc.embedded - embedded system specific startup information
+# For pfSense
+
+# Size of /tmp
+USE_MFS_TMP_SIZE=`/usr/bin/grep use_mfs_tmp_size /cf/conf/config.xml | /usr/bin/cut -f2 -d'>' | /usr/bin/cut -f1 -d'<'`
+if [ ! -z ${USE_MFS_TMP_SIZE} ] && [ ${USE_MFS_TMP_SIZE} -gt 0 ]; then
+ tmpsize="${USE_MFS_TMP_SIZE}m"
+else
+ tmpsize="40m"
+fi
+
+# Size of /var
+USE_MFS_VAR_SIZE=`/usr/bin/grep use_mfs_var_size /cf/conf/config.xml | /usr/bin/cut -f2 -d'>' | /usr/bin/cut -f1 -d'<'`
+if [ ! -z ${USE_MFS_VAR_SIZE} ] && [ ${USE_MFS_VAR_SIZE} -gt 0 ]; then
+ varsize="${USE_MFS_VAR_SIZE}m"
+else
+ varsize="60m"
+fi
+
+echo -n "Setting up memory disks..."
+mdmfs -S -M -s ${tmpsize} md /tmp
+mdmfs -S -M -s ${varsize} md /var
+
+# Create some needed directories
+/bin/mkdir -p /var/db /var/spool/lock
+/usr/sbin/chown uucp:dialer /var/spool/lock
+
+# Ensure vi's recover directory is present
+/bin/mkdir -p /var/tmp/vi.recover/
+echo " done."
diff --git a/src/etc/rc.expireaccounts b/src/etc/rc.expireaccounts
new file mode 100755
index 0000000..3befa17
--- /dev/null
+++ b/src/etc/rc.expireaccounts
@@ -0,0 +1,70 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.expireaccounts
+ part of pfSense
+
+ Copyright (C) 2009 Shrew Soft Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ require_once("config.inc");
+ require_once("functions.inc");
+
+ $removed = 0;
+ if (!is_array($config['system']['user'])) {
+ return;
+ }
+
+ $count = count($config['system']['user']);
+ $index = 0;
+ for (; $index < $count; $index++) {
+ $user =& $config['system']['user'][$index];
+ if ($user['scope'] == "system") {
+ continue;
+ }
+ echo "1\n";
+ echo "User {$user['name']} expires {$user['expires']}\n";
+ if (!$user['expires'] || isset($user['disabled'])) {
+ continue;
+ }
+ echo "1\n";
+ if (strtotime("-1 day") > strtotime($user['expires'])) {
+ echo "Disabling user {$user['name']} at index #{$index}\n";
+ //unset($config['system']['user'][$index]);
+ $user['disabled'] = true;
+ $removed++;
+ $count--;
+ $index--;
+ }
+ }
+
+ if ($removed > 0) {
+ write_config("Expired {$removed} user accounts");
+ }
+
+ //print_r($config);
+
+?>
diff --git a/src/etc/rc.filter_configure b/src/etc/rc.filter_configure
new file mode 100755
index 0000000..2c996e9
--- /dev/null
+++ b/src/etc/rc.filter_configure
@@ -0,0 +1,43 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.filter_configure
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+/* invalidate interface cache */
+get_interface_arr(true);
+
+unlink_if_exists("/tmp/config.cache");
+filter_configure();
+
+?>
diff --git a/src/etc/rc.filter_configure_sync b/src/etc/rc.filter_configure_sync
new file mode 100755
index 0000000..86ab309
--- /dev/null
+++ b/src/etc/rc.filter_configure_sync
@@ -0,0 +1,41 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.filter_configure_sync
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+
+filter_configure_sync();
+
+?>
diff --git a/src/etc/rc.filter_configure_xmlrpc b/src/etc/rc.filter_configure_xmlrpc
new file mode 100755
index 0000000..584cc9c
--- /dev/null
+++ b/src/etc/rc.filter_configure_xmlrpc
@@ -0,0 +1,53 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.filter_configure_xmlrpc
+ Copyright (C) 2004-2006 Scott Ullrich
+ Copyright (C) 2005 Bill Marquette
+ Copyright (C) 2006 Peter Allgeyer
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+require_once("globals.inc");
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("xmlrpc.inc");
+require_once("interfaces.inc");
+
+system_routing_configure();
+setup_gateways_monitor();
+relayd_configure();
+require_once("openvpn.inc");
+openvpn_resync_all();
+services_dhcpd_configure();
+
+?>
diff --git a/src/etc/rc.filter_synchronize b/src/etc/rc.filter_synchronize
new file mode 100755
index 0000000..f31fa34
--- /dev/null
+++ b/src/etc/rc.filter_synchronize
@@ -0,0 +1,488 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.filter_synchronize
+ Copyright (C) 2004-2006 Scott Ullrich
+ Copyright (C) 2005 Bill Marquette
+ Copyright (C) 2006 Peter Allgeyer
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+require_once("globals.inc");
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("xmlrpc.inc");
+require_once("interfaces.inc");
+
+/*
+ * backup_vip_config_section($section): returns as an xml file string of
+ * the configuration section
+ */
+function backup_vip_config_section() {
+ global $config;
+
+ if (!is_array($config['virtualip']['vip'])) {
+ return;
+ }
+ $temp = array();
+ $temp['vip'] = array();
+ foreach ($config['virtualip']['vip'] as $section) {
+ if (($section['mode'] == 'proxyarp' || $section['mode'] == 'ipalias') &&
+ (strpos($section['interface'], '_vip') === FALSE) &&
+ (strpos($section['interface'], 'lo0') === FALSE)) {
+ continue;
+ }
+ if ($section['advskew'] <> "") {
+ $section_val = intval($section['advskew']);
+ $section_val=$section_val+100;
+ if ($section_val > 254) {
+ $section_val = 254;
+ }
+ $section['advskew'] = $section_val;
+ }
+ if ($section['advbase'] <> "") {
+ $section_val = intval($section['advbase']);
+ if ($section_val > 254) {
+ $section_val = 254;
+ }
+ $section['advbase'] = $section_val;
+ }
+ $temp['vip'][] = $section;
+ }
+ return $temp;
+}
+
+function remove_special_characters($string) {
+ $match_array = "";
+ preg_match_all("/[a-zA-Z0-9\_\-]+/", $string, $match_array);
+ $string = "";
+ foreach ($match_array[0] as $ma) {
+ if ($string <> "") {
+ $string .= " ";
+ }
+ $string .= $ma;
+ }
+ return $string;
+}
+
+function carp_check_version($url, $username, $password, $port = 80, $method = 'pfsense.host_firmware_version') {
+ global $config, $g;
+
+ if (file_exists("{$g['varrun_path']}/booting") || platform_booting()) {
+ return;
+ }
+
+ $params = array(
+ XML_RPC_encode($password)
+ );
+
+ $numberofruns = 0;
+ while ($numberofruns < 2) {
+ $msg = new XML_RPC_Message($method, $params);
+ $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port);
+ $cli->setCredentials($username, $password);
+ if ($numberofruns > 0) {
+ $cli->setDebug(1);
+ }
+ /* send our XMLRPC message and timeout after 240 seconds */
+ $resp = $cli->send($msg, "240");
+ if (!is_object($resp)) {
+ $error = "A communications error occurred while attempting XMLRPC sync with username {$username} {$url}:{$port}.";
+ } elseif ($resp->faultCode()) {
+ $error = "An error code was received while attempting XMLRPC sync with username {$username} {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
+ } else {
+ $parsed_response = XML_RPC_decode($resp->value());
+ if (!is_array($parsed_response)) {
+ if (trim($parsed_response) == "Authentication failed") {
+ $error = "An authentication failure occurred while trying to access {$url}:{$port} ({$method}).";
+ log_error($error);
+ file_notice("sync_settings", $error, "Settings Sync", "");
+ return false;
+ }
+ } else {
+ if (!isset($parsed_response['config_version']) ||
+ ($parsed_response['config_version'] < $config['version']) ||
+ ($parsed_response['config_version'] > $config['version'])) {
+ update_filter_reload_status("The other member is on a different configuration version of {$g['product_name']}. Sync will not be done to prevent problems!");
+ log_error("The other member is on a different configuration version of {$g['product_name']}. Sync will not be done to prevent problems!");
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+ log_error($error);
+ file_notice("sync_settings", $error, "Settings Sync", "");
+ $numberofruns++;
+ }
+
+ return false;
+}
+
+function carp_sync_xml($url, $username, $password, $sections, $port = 80, $method = 'pfsense.restore_config_section') {
+ global $config, $g;
+
+ if (file_exists("{$g['varrun_path']}/booting") || platform_booting()) {
+ return;
+ }
+
+ update_filter_reload_status("Syncing CARP data to {$url}");
+
+ /* make a copy of config */
+ $config_copy = $config;
+
+ /* strip out nosync items */
+ if (is_array($config_copy['nat']['outbound']['rule'])) {
+ $rulescnt = count($config_copy['nat']['outbound']['rule']);
+ for ($x = 0; $x < $rulescnt; $x++) {
+ $config_copy['nat']['outbound']['rule'][$x]['descr'] = remove_special_characters($config_copy['nat']['outbound']['rule'][$x]['descr']);
+ if (isset ($config_copy['nat']['outbound']['rule'][$x]['nosync'])) {
+ unset ($config_copy['nat']['outbound']['rule'][$x]);
+ }
+ }
+ }
+ if (is_array($config_copy['nat']['rule'])) {
+ $natcnt = count($config_copy['nat']['rule']);
+ for ($x = 0; $x < $natcnt; $x++) {
+ $config_copy['nat']['rule'][$x]['descr'] = remove_special_characters($config_copy['nat']['rule'][$x]['descr']);
+ if (isset ($config_copy['nat']['rule'][$x]['nosync'])) {
+ unset ($config_copy['nat']['rule'][$x]);
+ }
+ }
+ }
+ if (is_array($config_copy['filter']['rule'])) {
+ $filtercnt = count($config_copy['filter']['rule']);
+ for ($x = 0; $x < $filtercnt; $x++) {
+ $config_copy['filter']['rule'][$x]['descr'] = remove_special_characters($config_copy['filter']['rule'][$x]['descr']);
+ if (isset ($config_copy['filter']['rule'][$x]['nosync'])) {
+ unset ($config_copy['filter']['rule'][$x]);
+ }
+ }
+ }
+ if (is_array($config_copy['aliases']['alias'])) {
+ $aliascnt = count($config_copy['aliases']['alias']);
+ for ($x = 0; $x < $aliascnt; $x++) {
+ $config_copy['aliases']['alias'][$x]['descr'] = remove_special_characters($config_copy['aliases']['alias'][$x]['descr']);
+ if (isset ($config_copy['aliases']['alias'][$x]['nosync'])) {
+ unset ($config_copy['aliases']['alias'][$x]);
+ }
+ }
+ }
+ if (is_array($config_copy['dnsmasq']['hosts'])) {
+ $dnscnt = count($config_copy['dnsmasq']['hosts']);
+ for ($x = 0; $x < $dnscnt; $x++) {
+ $config_copy['dnsmasq']['hosts'][$x]['descr'] = remove_special_characters($config_copy['dnsmasq']['hosts'][$x]['descr']);
+ if (isset ($config_copy['dnsmasq']['hosts'][$x]['nosync'])) {
+ unset ($config_copy['dnsmasq']['hosts'][$x]);
+ }
+ }
+ }
+ if (is_array($config_copy['ipsec']['tunnel'])) {
+ $ipseccnt = count($config_copy['ipsec']['tunnel']);
+ for ($x = 0; $x < $ipseccnt; $x++) {
+ $config_copy['ipsec']['tunnel'][$x]['descr'] = remove_special_characters($config_copy['ipsec']['tunnel'][$x]['descr']);
+ if (isset ($config_copy['ipsec']['tunnel'][$x]['nosync'])) {
+ unset ($config_copy['ipsec']['tunnel'][$x]);
+ }
+ }
+ }
+
+ if (is_array($config_copy['dhcpd'])) {
+ foreach ($config_copy['dhcpd'] as $dhcpif => $dhcpifconf) {
+ if ($dhcpifconf['failover_peerip'] <> "") {
+ $int = guess_interface_from_ip($dhcpifconf['failover_peerip']);
+ $intip = find_interface_ip($int);
+ $config_copy['dhcpd'][$dhcpif]['failover_peerip'] = $intip;
+ }
+ }
+ }
+
+ foreach ($sections as $section) {
+ /* we can't use array_intersect_key()
+ * due to the vip 'special case'
+ */
+ switch ($section) {
+ case 'virtualip':
+ $xml[$section] = backup_vip_config_section();
+ break;
+ case 'user':
+ $xml['system'][$section] = $config_copy['system'][$section];
+ $xml['system']['nextuid'] = $config_copy['system']['nextuid'];
+ break;
+ case 'group':
+ $xml['system'][$section] = $config_copy['system'][$section];
+ $xml['system']['nextgid'] = $config_copy['system']['nextgid'];
+ break;
+ case 'authserver':
+ $xml['system'][$section] = $config_copy['system'][$section];
+ default:
+ $xml[$section] = $config_copy[$section];
+ }
+ }
+
+ $params = array(
+ XML_RPC_encode($password),
+ XML_RPC_encode($xml)
+ );
+
+ $numberofruns = 0;
+ while ($numberofruns < 2) {
+ log_error("Beginning XMLRPC sync to {$url}:{$port}.");
+ $msg = new XML_RPC_Message($method, $params);
+ $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port);
+ $cli->setCredentials($username, $password);
+ if ($numberofruns > 0) {
+ $cli->setDebug(1);
+ }
+ /* send our XMLRPC message and timeout after 240 seconds */
+ $resp = $cli->send($msg, "240");
+ if (!is_object($resp)) {
+ $error = "A communications error occurred while attempting XMLRPC sync with username {$username} {$url}:{$port}.";
+ log_error($error);
+ file_notice("sync_settings", $error, "Settings Sync", "");
+ } elseif ($resp->faultCode()) {
+ $error = "An error code was received while attempting XMLRPC sync with username {$username} {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
+ log_error($error);
+ file_notice("sync_settings", $error, "Settings Sync", "");
+ } else {
+ $parsed_response = XML_RPC_decode($resp->value());
+ if (!is_array($parsed_response) && trim($parsed_response) == "Authentication failed") {
+ $error = "An authentication failure occurred while trying to access {$url}:{$port} ($method).";
+ log_error($error);
+ file_notice("sync_settings", $error, "Settings Sync", "");
+ return -1;
+ } else {
+ log_error("XMLRPC sync successfully completed with {$url}:{$port}.");
+ update_filter_reload_status("XMLRPC sync successfully completed with {$url}:{$port}.");
+ }
+ $numberofruns = 3;
+ }
+ $numberofruns++;
+ }
+}
+
+if (platform_booting()) {
+ return;
+}
+
+if (is_array($config['hasync'])) {
+ update_filter_reload_status("Building high availability sync information");
+ $hasync = $config['hasync'];
+
+ if (empty($hasync['synchronizetoip'])) {
+ /* this gets hit on every filter sync on the secondary, a log here creates a lot of log spam and I never saw it actually log anything useful */
+ return;
+ }
+
+ /*
+ * XXX: The way we're finding the port right now is really suboptimal -
+ * we can't assume that the other machine is setup identically.
+ */
+ if (!empty($config['system']['webgui']['protocol'])) {
+ $synchronizetoip = $config['system']['webgui']['protocol'];
+ $synchronizetoip .= "://";
+ }
+
+ /* if port is empty lets rely on the protocol selection */
+ $port = $config['system']['webgui']['port'];
+ if (empty($port)) {
+ if ($config['system']['webgui']['protocol'] == "http") {
+ $port = "80";
+ } else {
+ $port = "443";
+ }
+ }
+
+ if (is_ipaddrv6($hasync['synchronizetoip'])) {
+ $hasync['synchronizetoip'] = "[{$hasync['synchronizetoip']}]";
+ }
+ $synchronizetoip .= $hasync['synchronizetoip'];
+ if ($hasync['synchronizerules'] != "") {
+ if (!is_array($config['filter'])) {
+ $config['filter'] = array();
+ }
+ $sections[] = 'filter';
+ }
+ if ($hasync['synchronizenat'] != "") {
+ if (!is_array($config['nat'])) {
+ $config['nat'] = array();
+ }
+ $sections[] = 'nat';
+ }
+ if ($hasync['synchronizealiases'] != "") {
+ if (!is_array($config['aliases'])) {
+ $config['aliases'] = array();
+ }
+ $sections[] = 'aliases';
+ }
+ if ($hasync['synchronizedhcpd'] != "" and is_array($config['dhcpd'])) {
+ $sections[] = 'dhcpd';
+ }
+ if ($hasync['synchronizewol'] != "") {
+ if (!is_array($config['wol'])) {
+ $config['wol'] = array();
+ }
+ $sections[] = 'wol';
+ }
+ if ($hasync['synchronizetrafficshaper'] != "" and is_array($config['shaper'])) {
+ $sections[] = 'shaper';
+ }
+ if ($hasync['synchronizetrafficshaperlimiter'] != "" and is_array($config['dnshaper'])) {
+ $sections[] = 'dnshaper';
+ }
+ if ($hasync['synchronizetrafficshaperlayer7'] != "" and is_array($config['l7shaper'])) {
+ $sections[] = 'l7shaper';
+ }
+ if ($hasync['synchronizestaticroutes'] != "") {
+ if (!is_array($config['staticroutes'])) {
+ $config['staticroutes'] = array();
+ }
+ if (!is_array($config['staticroutes']['route'])) {
+ $config['staticroutes']['route'] = array();
+ }
+ $sections[] = 'staticroutes';
+ if (!is_array($config['gateways'])) {
+ $config['gateways'] = array();
+ }
+ $sections[] = 'gateways';
+ }
+ if ($hasync['synchronizevirtualip'] != "") {
+ if (!is_array($config['virtualip'])) {
+ $config['virtualip'] = array();
+ }
+ $sections[] = 'virtualip';
+ }
+ if ($hasync['synchronizelb'] != "") {
+ if (!is_array($config['load_balancer'])) {
+ $config['load_balancer'] = array();
+ }
+ $sections[] = 'load_balancer';
+ }
+ if ($hasync['synchronizeipsec'] != "") {
+ if (!is_array($config['ipsec'])) {
+ $config['ipsec'] = array();
+ }
+ $sections[] = 'ipsec';
+ }
+ if ($hasync['synchronizeopenvpn'] != "") {
+ if (!is_array($config['openvpn'])) {
+ $config['openvpn'] = array();
+ }
+ $sections[] = 'openvpn';
+ }
+ if ($hasync['synchronizecerts'] != "" || $hasync['synchronizeopenvpn'] != "") {
+ if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+ }
+ $sections[] = 'cert';
+
+ if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+ }
+ $sections[] = 'ca';
+
+ if (!is_array($config['crl'])) {
+ $config['crl'] = array();
+ }
+ $sections[] = 'crl';
+ }
+ if ($hasync['synchronizeusers'] != "") {
+ $sections[] = 'user';
+ $sections[] = 'group';
+ }
+ if ($hasync['synchronizeauthservers'] != "") {
+ $sections[] = 'authserver';
+ }
+ if ($hasync['synchronizednsforwarder'] != "") {
+ if (is_array($config['dnsmasq'])) {
+ $sections[] = 'dnsmasq';
+ }
+ if (is_array($config['unbound'])) {
+ $sections[] = 'unbound';
+ }
+ }
+ if ($hasync['synchronizeschedules'] != "" || $hasync['synchronizerules'] != "") {
+ if (!is_array($config['schedules'])) {
+ $config['schedules'] = array();
+ }
+ $sections[] = 'schedules';
+ }
+ if ($hasync['synchronizecaptiveportal'] != "" and is_array($config['captiveportal'])) {
+ $sections[] = 'captiveportal';
+ }
+ if ($hasync['synchronizecaptiveportal'] != "" and is_array($config['vouchers'])) {
+ $sections[] = 'vouchers';
+ }
+
+ if (count($sections) <= 0) {
+ log_error("Nothing has been configured to be synched. Skipping....");
+ return;
+ }
+
+ if (empty($hasync['username'])) {
+ $username = "admin";
+ } else {
+ $username = $hasync['username'];
+ }
+
+ if (!carp_check_version($synchronizetoip, $username, $hasync['password'], $port)) {
+ return;
+ }
+
+ update_filter_reload_status("Signaling CARP reload signal...");
+ if (carp_sync_xml($synchronizetoip, $username, $hasync['password'], $sections, $port) == -1) {
+ return;
+ }
+ $cli = new XML_RPC_Client('/xmlrpc.php', $synchronizetoip, $port);
+ $params = array(
+ XML_RPC_encode($hasync['password'])
+ );
+
+ $msg = new XML_RPC_Message('pfsense.filter_configure', $params);
+ $cli->setCredentials($username, $hasync['password']);
+ $resp = $cli->send($msg, "900");
+
+ if (!is_object($resp)) {
+ $error = "A communications error occurred while attempting Filter sync with username {$username} {$synchronizetoip}:{$port}.";
+ log_error($error);
+ file_notice("sync_settings", $error, "Settings Sync", "");
+ } elseif ($resp->faultCode()) {
+ $error = "An error code was received while attempting Filter sync with username {$username} {$synchronizetoip}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
+ log_error($error);
+ file_notice("sync_settings", $error, "Settings Sync", "");
+ } else {
+ log_error("Filter sync successfully completed with {$synchronizetoip}:{$port}.");
+ $numberofruns = 3;
+ }
+}
+
+?>
diff --git a/src/etc/rc.firmware b/src/etc/rc.firmware
new file mode 100755
index 0000000..e8d549f
--- /dev/null
+++ b/src/etc/rc.firmware
@@ -0,0 +1,476 @@
+#!/bin/sh
+
+# /etc/rc.firmware
+# originally part of m0n0wall (http://neon1.net/m0n0wall)
+# Copyright (C) 2005-2009 Scott Ullrich <sullrich@pfsense.org>.
+# Copyright (C) 2003 Manuel Kasper <mk@neon1.net>.
+# All rights reserved.
+
+# mount /cf
+/etc/rc.conf_mount_rw
+
+# Reset file(s)
+echo "" >/conf/upgrade_log.txt
+echo "" >/conf/firmware_update_misc_log.txt
+echo "" >/conf/fdisk_upgrade_log.txt
+
+exec 3>&2 2>>/conf/firmware_update_misc_log.txt
+
+export ACTION=$1
+export IMG=$2
+if [ $# -eq 3 ]; then
+ export CUSTOMIMG=$3
+fi
+
+file_notice() {
+ /usr/local/bin/php-cgi -q -d auto_prepend_file=config.inc <<ENDOFF
+ <?php
+ require_once("globals.inc");
+ require_once("functions.inc");
+ file_notice("$1", "$2", "$1", "");
+ ?>
+ENDOFF
+}
+
+output_env_to_log() {
+ date >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ ls -lah /dev/ >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ ls -lah $IMG >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ md5 $IMG >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ mount >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ top >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+}
+
+backup_chflags() {
+ TOPROCESS="bin lib libexec sbin usr"
+ for files in $TOPROCESS; do
+ /usr/sbin/mtree -Pcp /${files} | bzip2 -9 > /tmp/chflags.dist.${files}.bz2 2>> /conf/upgrade_log.txt
+ done
+}
+
+restore_chflags() {
+ TOPROCESS="bin lib libexec sbin usr"
+ for files in $TOPROCESS; do
+ cd / && /usr/bin/bzcat /tmp/chflags.dist.${files}.bz2 | /usr/sbin/mtree -P -p /${files} >> /conf/upgrade_log.txt 2>&1
+ done
+}
+
+remove_chflags() {
+ TOPROCESS="bin lib libexec sbin usr"
+ for files in $TOPROCESS; do
+ /bin/chflags -R noschg /${files}
+ /bin/chmod -R u+rw /${files}
+ done
+}
+
+case $ACTION in
+enable)
+ touch /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+ echo "Enable" >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+ /etc/rc.conf_mount_ro
+ ;;
+auto)
+ touch /var/run/firmwarelock.dirty
+ backup_chflags
+ remove_chflags
+ /etc/rc.firmware_auto
+ restore_chflags
+ /etc/rc.conf_mount_ro
+ ;;
+pfSenseNanoBSDupgrade)
+
+ # Sanity check - bail early if there's no firmware file!
+ if [ ! -r $IMG ]; then
+ echo "2nd parameter has not been passed or file does not exist. Exiting." >> /conf/upgrade_log.txt 2>&1
+ /etc/rc.conf_mount_ro
+ exit 1
+ fi
+
+ # Prevent full upgrade file from being used to upgrade
+ if [ `echo $IMG | grep "full"` ]; then
+ echo "You cannot use a full file for upgrade. Please use a file labelled nanobsd upgrade."
+ file_notice "NanoBSDUpgradeFailure" "You have attempted to use a full NanoBSD installation file as an upgrade. Please use a NanoBSD file labelled 'upgrade' instead."
+ rm -f $IMG
+ /etc/rc.conf_mount_ro
+ exit 1
+ fi
+
+ touch /var/run/firmwarelock.dirty
+
+ echo "NanoBSD Firmware upgrade in progress..." >> /conf/upgrade_log.txt 2>&1
+ echo "NanoBSD Firmware upgrade in progress..." | wall
+ /etc/rc.notify_message -e -g -m "NanoBSD Firmware upgrade in progress..."
+
+ # backup config
+ /bin/mkdir -p /tmp/configbak
+ cp -Rp /conf/* /tmp/configbak 2>/dev/null
+
+ # Remove logs from backup dir to avoid clobbering upon restore.
+ rm /tmp/configbak/*_log.txt 2>/dev/null
+
+ echo "" >> /conf/upgrade_log.txt
+
+ echo "Installing ${IMG}." >> /conf/upgrade_log.txt 2>&1
+ echo "Installing ${IMG}." | wall
+
+ # resolve glabel label that we booted from
+ BOOT_DEVICE=`/sbin/mount | /usr/bin/grep pfsense | /usr/bin/cut -d'/' -f4 | /usr/bin/cut -d' ' -f1`
+ # resolve glabel to the real boot dev entry
+ REAL_BOOT_DEVICE=`/sbin/glabel list | /usr/bin/grep -B2 ufs/${BOOT_DEVICE} | /usr/bin/head -n 1 | /usr/bin/cut -f3 -d' '`
+ # grab the boot device, example ad1, ad0
+ BOOT_DRIVE=`/sbin/glabel list | /usr/bin/grep -B2 ufs/pfsense | /usr/bin/head -n 1 | /usr/bin/cut -f3 -d' ' | /usr/bin/cut -d's' -f1`
+ # test the slice. if we are on slice 1 we need to flash 2 and vice versa
+ if [ `echo $REAL_BOOT_DEVICE | /usr/bin/grep "s1"` ]; then
+ SLICE="2"
+ OLDSLICE="1"
+ TOFLASH="${BOOT_DRIVE}s${SLICE}"
+ COMPLETE_PATH="${BOOT_DRIVE}s${SLICE}a"
+ GLABEL_SLICE="pfsense1"
+ UFS_ID="1"
+ OLD_UFS_ID="0"
+ else
+ SLICE="1"
+ OLDSLICE="2"
+ TOFLASH="${BOOT_DRIVE}s${SLICE}"
+ COMPLETE_PATH="${BOOT_DRIVE}s${SLICE}a"
+ GLABEL_SLICE="pfsense0"
+ UFS_ID="0"
+ OLD_UFS_ID="1"
+ fi
+
+ # Output specific information that this script is using
+ echo "SLICE ${SLICE}" >> /conf/upgrade_log.txt
+ echo "OLDSLICE ${OLDSLICE}" >> /conf/upgrade_log.txt
+ echo "TOFLASH ${TOFLASH}" >> /conf/upgrade_log.txt
+ echo "COMPLETE_PATH ${COMPLETE_PATH}" >> /conf/upgrade_log.txt
+ echo "GLABEL_SLICE ${GLABEL_SLICE}" >> /conf/upgrade_log.txt
+
+ # First ensure the new file can fit inside the
+ # slice that we are going to be operating on.
+ NEW_IMG_SIZE=`echo $((\`gzip -l ${IMG} | grep -v compressed | awk '{ print $2}'\` / 1024 / 1024))`
+ SIZE=`/sbin/fdisk ${COMPLETE_PATH} | /usr/bin/grep Meg | /usr/bin/awk '{ print $5 }' | /usr/bin/cut -d"(" -f2`
+ # USB slices are under-reported even more than CF slices when viewed
+ # directly, instead of when looking at the entire disk. Compensate
+ # by adding exactly 6MB. 4MB was consistently 2MB too few, and
+ # was resulting in failing upgrades on USB Flash based installs.
+ SIZE=`expr $SIZE + 6`
+ if [ "$SIZE" -lt "$NEW_IMG_SIZE" ]; then
+ file_notice "UpgradeFailure" "Upgrade failed due to the upgrade image being larger than the partition that is configured on disk. Halting. Size on disk: $SIZE < Size of new image: $NEW_IMG_SIZE"
+ echo "Upgrade failed. Please check the system log file for more information" | wall
+ rm -f $IMG
+ rm -f /var/run/firmwarelock.dirty
+ rm -f /var/run/firmware.lock
+ rm -f ${IMG}
+ /etc/rc.conf_mount_ro
+ exit 1
+ fi
+
+ # Output environment information to log file
+ output_env_to_log
+
+ # Grab a before upgrade look at fdisk
+ echo "" >> /conf/fdisk_upgrade_log.txt
+ echo "Before upgrade fdisk/bsdlabel" >> /conf/fdisk_upgrade_log.txt
+ fdisk $BOOT_DRIVE >> /conf/fdisk_upgrade_log.txt
+ bsdlabel -A ${BOOT_DRIVE}s1 >> /conf/fdisk_upgrade_log.txt
+ bsdlabel -A ${BOOT_DRIVE}s2 >> /conf/fdisk_upgrade_log.txt
+ bsdlabel -A ${BOOT_DRIVE}s3 >> /conf/fdisk_upgrade_log.txt
+ echo "---------------------------------------------------------------" >> /conf/fdisk_upgrade_log.txt
+ echo "" >> /conf/fdisk_upgrade_log.txt
+
+ # Log that we are really doing a NanoBSD upgrade
+ echo "" >> /conf/upgrade_log.txt
+ echo "NanoBSD upgrade starting" >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ # Remove TOFLASH and get ready for new flash image
+ echo "" >> /conf/upgrade_log.txt
+ echo "dd if=/dev/zero of=/dev/${TOFLASH} bs=1m count=1" >> /conf/upgrade_log.txt
+ dd if=/dev/zero of=/dev/${TOFLASH} bs=1m count=1 >> /conf/upgrade_log.txt 2>&1
+
+ # Stream gzipped image to dd and explode image to new area
+ echo "" >> /conf/upgrade_log.txt
+ echo "/usr/bin/gzip -dc $IMG | /bin/dd of=/dev/${TOFLASH} obs=64k" >> /conf/upgrade_log.txt
+ /usr/bin/gzip -dc $IMG | /bin/dd of=/dev/${TOFLASH} obs=64k >> /conf/upgrade_log.txt 2>&1
+
+ # Grab an after upgrade look at fdisk
+ echo "" >> /conf/fdisk_upgrade_log.txt
+ echo "After upgrade fdisk/bsdlabel" >> /conf/upgrade_log.txt
+ fdisk $BOOT_DRIVE >> /conf/fdisk_upgrade_log.txt
+ bsdlabel -A ${BOOT_DRIVE}s1 >> /conf/fdisk_upgrade_log.txt
+ bsdlabel -A ${BOOT_DRIVE}s2 >> /conf/fdisk_upgrade_log.txt
+ bsdlabel -A ${BOOT_DRIVE}s3 >> /conf/fdisk_upgrade_log.txt
+ echo "---------------------------------------------------------------" >> /conf/fdisk_upgrade_log.txt
+ echo "" >> /conf/fdisk_upgrade_log.txt
+
+ # Ensure that our new system is sound and bail if it is not and file a notice
+ echo "" >> /conf/upgrade_log.txt
+ echo "/sbin/fsck_ufs -y /dev/${COMPLETE_PATH}" >> /conf/upgrade_log.txt
+ /sbin/fsck_ufs -y /dev/${COMPLETE_PATH} >> /conf/upgrade_log.txt 2>&1
+ if [ $? != 0 ]; then
+ file_notice "UpgradeFailure" "{\$g['product_name']} upgrade has failed. Your system has been left in a usable state."
+ rm -f $IMG
+ rm -f /var/run/firmwarelock.dirty
+ rm -f /var/run/firmware.lock
+ /etc/rc.conf_mount_ro
+ exit 1
+ fi
+
+ # Enable foot shooting
+ sysctl kern.geom.debugflags=16
+
+ # Add back the corresponding glabel
+ echo "" >> /conf/upgrade_log.txt
+ echo "/sbin/tunefs -L ${GLABEL_SLICE} /dev/${COMPLETE_PATH}" >> /conf/upgrade_log.txt
+ /sbin/tunefs -L ${GLABEL_SLICE} /dev/${COMPLETE_PATH} >> /conf/upgrade_log.txt 2>&1
+
+ # restore config
+ cp -Rp /tmp/configbak/* /conf 2>/dev/null
+
+ # Remove upgrade file
+ rm -f $IMG
+
+ # Mount newly prepared slice
+ mkdir /tmp/$GLABEL_SLICE
+ mount /dev/ufs/$GLABEL_SLICE /tmp/$GLABEL_SLICE
+
+ # If /boot/loader.conf.local exists
+ # copy to the other slice.
+ if [ -f /boot/loader.conf.local ]; then
+ cp /boot/loader.conf.local /tmp/$GLABEL_SLICE/boot/loader.conf.local
+ fi
+
+ # If /tmp/$GLABEL_SLICE/usr/local/share/pfSense/post_upgrade_command exists
+ # after update then execute the command.
+ echo "Checking for post_upgrade_command..." >> /conf/upgrade_log.txt
+ if [ -f /tmp/$GLABEL_SLICE/usr/local/share/pfSense/post_upgrade_command ]; then
+ echo "Found post_upgrade_command, executing ($GLABEL_SLICE)..." >> /conf/upgrade_log.txt
+ sh /tmp/$GLABEL_SLICE/usr/local/share/pfSense/post_upgrade_command $GLABEL_SLICE >> /conf/upgrade_log.txt 2>&1
+ fi
+
+ # Update fstab
+ cp /etc/fstab /tmp/$GLABEL_SLICE/etc/fstab
+ sed -i "" "s/pfsense${OLD_UFS_ID}/pfsense${UFS_ID}/g" /tmp/$GLABEL_SLICE/etc/fstab
+ if [ $? != 0 ]; then
+ echo "Something went wrong when trying to update the fstab entry. Aborting upgrade."
+ file_notice "UpgradeFailure" "Something went wrong when trying to update the fstab entry. Aborting upgrade."
+ rm -f $IMG
+ rm -f /var/run/firmwarelock.dirty
+ rm -f /var/run/firmware.lock
+ umount /tmp/$GLABEL_SLICE
+ /etc/rc.conf_mount_ro
+ exit 1
+ fi
+ echo "" >> /conf/upgrade_log.txt
+ cat /tmp/$GLABEL_SLICE/etc/fstab >> /conf/upgrade_log.txt
+
+ echo "" >> /conf/upgrade_log.txt
+ find /tmp/$GLABEL_SLICE >/conf/file_upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ # Unmount newly prepared slice
+ umount /tmp/$GLABEL_SLICE
+
+ sync
+
+ # Set active mount slice in fdisk
+ echo "" >> /conf/upgrade_log.txt
+ echo "gpart set -a active -i ${SLICE} ${BOOT_DRIVE}" >> /conf/upgrade_log.txt
+ gpart set -a active -i ${SLICE} ${BOOT_DRIVE} >> /conf/upgrade_log.txt 2>&1
+
+ sync
+
+ # Set active boot source - NanoBSD does not do this but otherwise we
+ # end up with the wrong partition being active.
+ echo "" >> /conf/upgrade_log.txt
+ echo "/usr/sbin/boot0cfg -s ${SLICE} -v /dev/${BOOT_DRIVE}" >> /conf/upgrade_log.txt
+ /usr/sbin/boot0cfg -s ${SLICE} -v /dev/${BOOT_DRIVE} >> /conf/upgrade_log.txt 2>&1
+
+ # Disable foot shooting
+ sysctl kern.geom.debugflags=0
+
+ # Grab a final look at fdisk
+ echo "" >> /conf/fdisk_upgrade_log.txt
+ echo "Final upgrade fdisk/bsdlabel" >> /conf/fdisk_upgrade_log.txt
+ fdisk $BOOT_DRIVE >> /conf/fdisk_upgrade_log.txt
+ bsdlabel -A ${BOOT_DRIVE}s1 >> /conf/fdisk_upgrade_log.txt
+ bsdlabel -A ${BOOT_DRIVE}s2 >> /conf/fdisk_upgrade_log.txt
+ bsdlabel -A ${BOOT_DRIVE}s3 >> /conf/fdisk_upgrade_log.txt
+ echo "---------------------------------------------------------------" >> /conf/fdisk_upgrade_log.txt
+ echo "" >> /conf/fdisk_upgrade_log.txt
+
+ # Remove extra stuff
+ rm -rf /usr/savecore/*
+
+ date >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ # Trigger a package reinstallation on reboot
+ touch /conf/needs_package_sync
+
+ # remount /cf ro
+ /etc/rc.conf_mount_ro
+ /bin/sync
+
+ echo "NanoBSD Firmware upgrade is complete. Rebooting in 10 seconds." >> /conf/upgrade_log.txt 2>&1
+ echo "NanoBSD Firmware upgrade is complete. Rebooting in 10 seconds." | wall
+ /etc/rc.notify_message -e -g -m "NanoBSD Firmware upgrade is complete. Rebooting in 10 seconds."
+
+ sleep 10
+
+ rm -f /var/run/firmwarelock.dirty
+ rm -f /var/run/firmware.lock
+ . /etc/rc.reboot
+
+ ;;
+pfSenseupgrade)
+
+ # Sanity check - bail early if there's no firmware file!
+ if [ ! -r $IMG ]; then
+ echo "2nd parameter has not been passed or file does not exist. Exiting." >> /conf/upgrade_log.txt 2>&1
+ /etc/rc.conf_mount_ro
+ exit
+ fi
+
+ # wait 1 second before beginning
+ sleep 1
+
+ # Log that we are really doing a pfSense upgrade
+ echo "" >> /conf/upgrade_log.txt
+ echo "pfSenseupgrade upgrade starting" >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ touch /var/run/firmwarelock.dirty
+
+ if [ -f /tmp/perform_full_backup.txt ]; then
+ echo "Performing full backup" >> /conf/upgrade_log.txt
+ /etc/rc.create_full_backup
+ rm /tmp/perform_full_backup.txt
+ fi
+
+ touch /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ # Output environment information to log file
+ output_env_to_log
+
+ backup_chflags
+ remove_chflags
+
+ # Do we have a pre-upgrade hook in the update file?
+ if [ `tar tvzf $IMG | grep /usr/local/share/pfSense/pre_upgrade_command | wc -l` -gt 0 ]; then
+ tar xzvf $IMG -C / ./usr/local/share/pfSense/pre_upgrade_command >> /conf/upgrade_log.txt 2>&1
+ chmod a+rx /usr/local/share/pfSense/pre_upgrade_command >> /conf/upgrade_log.txt 2>&1
+ sh /usr/local/share/pfSense/pre_upgrade_command >> /conf/upgrade_log.txt 2>&1
+ fi
+
+ echo "Firmware upgrade in progress..." >> /conf/upgrade_log.txt 2>&1
+ echo "Firmware upgrade in progress..." | wall
+ /etc/rc.notify_message -e -g -m "Firmware upgrade in progress..."
+
+ # backup config
+ [ -d /tmp/configbak ] && rm -rf /tmp/configbak
+ /bin/mkdir -p /tmp/configbak
+ cp -Rp /conf/* /tmp/configbak 2>/dev/null
+
+ # Remove logs from backup dir to avoid clobbering upon restore.
+ rm /tmp/configbak/*_log.txt 2>/dev/null
+
+ # tar explode image onto hd
+ killall -9 check_reload_status
+ killall -9 check_reload_status
+ echo "Installing $IMG." >> /conf/upgrade_log.txt 2>&1
+ cd / && /usr/bin/tar --exclude=./dev -xzUPf $IMG >> /conf/upgrade_log.txt 2>&1
+ /usr/local/sbin/check_reload_status
+ echo "Image installed $IMG." >> /conf/upgrade_log.txt 2>&1
+
+ # process custom image if its passed
+ if [ $# -eq 3 ]; then
+ if [ -f $CUSTOMIMG ]; then
+ echo "Custom image $CUSTOMIMG found." >> /conf/upgrade_log.txt 2>&1
+ echo "Custom image ($CUSTOMIMG) found." >> /conf/upgrade_log.txt 2>&1
+ PWD_DIR=`pwd`
+ cd / && /usr/bin/tar xzPUf $CUSTOMIMG >> /conf/upgrade_log.txt 2>&1
+ cd $PWD_DIR
+ echo "Custom image $CUSTOMIMG installed." >> /conf/upgrade_log.txt 2>&1
+ fi
+ fi
+
+ # restore config
+ cp -Rp /tmp/configbak/* /conf 2>/dev/null
+
+ # restore /etc symlinks
+ rm /etc/hosts
+ ln -s /var/etc/hosts /etc/hosts
+
+ restore_chflags
+
+ # Remove upgrade file
+ rm -f $IMG
+
+ if [ -e /etc/init_bootloader.sh ]; then
+ if [ ! -x /etc/init_bootloader.sh ]; then
+ chmod ug+x /etc/init_bootloader.sh
+ fi
+ /etc/init_bootloader.sh >> /conf/upgrade_log.txt 2>&1
+ fi
+
+ # Remove saved commit ID for gitsync
+ rm -f /etc/version.gitsync
+
+ # If /usr/local/share/pfSense/post_upgrade_command exists after update
+ # then execute the command.
+ if [ -f /usr/local/share/pfSense/post_upgrade_command ]; then
+ if [ ! -x /usr/local/share/pfSense/post_upgrade_command ]; then
+ chmod ug+x /usr/local/share/pfSense/post_upgrade_command
+ fi
+ /usr/local/share/pfSense/post_upgrade_command >> /conf/upgrade_log.txt 2>&1
+ fi
+
+ # remove unused files
+ rm -rf /etc/rc.conf
+ rm -rf /usr/savecore/*
+
+ date >> /conf/upgrade_log.txt
+ echo "" >> /conf/upgrade_log.txt
+
+ # remount /cf ro
+ /etc/rc.conf_mount_ro
+
+ # release the firmware lock
+ rm -f /var/run/firmwarelock.dirty
+ rm -f /var/run/firmware.lock
+ /bin/sync
+
+ echo "Firmware upgrade is complete. Rebooting in 10 seconds." >> /conf/upgrade_log.txt 2>&1
+ echo "Firmware upgrade is complete. Rebooting in 10 seconds." | wall
+ /etc/rc.notify_message -e -g -m "Firmware upgrade is complete. Rebooting in 10 seconds."
+
+ # Sleep and allow disks to catch up
+ sleep 10
+
+ # If the archive has unpacked a file called
+ # /tmp/no_upgrade_reboot_required then do
+ # not reboot after upgrade.
+ if [ -f /tmp/no_upgrade_reboot_required ]; then
+ rm /tmp/no_upgrade_reboot_required
+ else
+ . /etc/rc.reboot
+ fi
+
+ ;;
+esac
+
diff --git a/src/etc/rc.firmware_auto b/src/etc/rc.firmware_auto
new file mode 100755
index 0000000..5b355df
--- /dev/null
+++ b/src/etc/rc.firmware_auto
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+# /etc/rc.firmware_auto
+# Copyright (C) 2005-2015 Electric Sheep Fencing LLC
+# Part of pfSense
+
+# $Id$
+
+FMBASEURL=$1
+FMFILENAME=$2
+FETCHFILENAME=$1/$2
+
+product=`cat /etc/inc/globals.inc | grep product_name | cut -d'"' -f4`
+
+# wait 5 seconds before beginning
+sleep 5
+
+logger -p daemon.info -i -t AutoUpgrade "Auto Upgrade started"
+
+HTTP_AUTH=""
+
+# if username and password is passed, let fetch utilize.
+if [ $# -gt 3 ]; then
+HTTP_AUTH="basic:*:$3:$4"
+fi
+
+if [ $# -gt 1 ]; then
+ echo "Downloading $FMFILENAME from $FMBASEURL ..." | logger -p daemon.info -i -t AutoUpgrade
+ /usr/bin/fetch -o /tmp/latest.tgz $FETCHFILENAME | logger -p daemon.info -i -t AutoUpgrade
+ echo "Downloading $FMFILENAME.sha256 from $FMBASEURL ..." | logger -p daemon.info -i -t AutoUpgrade
+ /usr/bin/fetch -o /tmp/latest.tgz.sha256 $FETCHFILENAME.sha256 | logger -p daemon.info -i -t AutoUpgrade
+fi
+
+DLHASH=`/bin/cat /tmp/latest.tgz.sha256 | cut -d" " -f4 `
+FILEHASH=`/sbin/sha256 /tmp/latest.tgz | cut -d" " -f4`
+
+PLATFORM=`cat /etc/platform`
+
+echo " Package sha256: ${DLHASH}" | logger -p daemon.info -i -t AutoUpgrade
+echo "Downloaded sha256: ${FILEHASH}" | logger -p daemon.info -i -t AutoUpgrade
+
+if [ "$DLHASH" = "" ]; then
+ echo "Downloaded sha256 is null. Require proxy auth?" | logger -p daemon.info -i -t AutoUpgrade
+ exit 1
+fi
+
+if [ "$FILEHASH" = "" ]; then
+ echo "Downloaded file's sha256 is null." | logger -p daemon.info -i -t AutoUpgrade
+ exit 1
+fi
+
+if [ "$DLHASH" = "$FILEHASH" ]; then
+ echo "sha256 hashes match." | logger -p daemon.info -i -t AutoUpgrade
+ echo "Beginning ${product} upgrade." | wall
+ if [ "$PLATFORM" = "nanobsd" ]; then
+ /usr/local/bin/php-cgi /etc/rc.conf_mount_rw
+ fi
+ if [ -r "/tmp/custom.tgz" ]; then
+ sh /etc/rc.firmware pfSenseupgrade /tmp/latest.tgz /tmp/custom.tgz
+ else
+ if [ "$PLATFORM" = "nanobsd" ]; then
+ sh /etc/rc.firmware pfSenseNanoBSDupgrade /tmp/latest.tgz
+ else
+ sh /etc/rc.firmware pfSenseupgrade /tmp/latest.tgz
+ fi
+ fi
+ exit 0
+fi
+
+echo "sha256 hashes do not match. Upgrade aborted." | logger -p daemon.info -i -t AutoUpgrade
+rm /tmp/latest*
+exit 1
diff --git a/src/etc/rc.halt b/src/etc/rc.halt
new file mode 100755
index 0000000..fd6318b
--- /dev/null
+++ b/src/etc/rc.halt
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# $Id$
+
+if ! /usr/bin/lockf -s -t 30 /tmp/config.lock /usr/bin/true; then
+ echo "Cannot halt at this moment, a config write operation is in progress and 30 seconds have passed."
+ exit -1
+fi
+
+sleep 1
+
+/sbin/shutdown -p now
+
diff --git a/src/etc/rc.initial b/src/etc/rc.initial
new file mode 100755
index 0000000..b103bf7
--- /dev/null
+++ b/src/etc/rc.initial
@@ -0,0 +1,167 @@
+#!/bin/sh
+
+# /etc/rc.initial
+# part of pfSense by Scott Ullrich
+# Copyright (C) 2004-2011 Scott Ullrich, All rights reserved.
+# originally based on m0n0wall (http://neon1.net/m0n0wall)
+# Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+# All rights reserved.
+
+# make sure the user can't kill us by pressing Ctrl-C,
+# ctrl-z, etc.
+#trap : 2
+#trap : 3
+#trap : 4
+
+if [ -f /etc/rc.local ]; then
+ RCLOCALPWD=`ps awux | grep rc.local | grep -v grep | awk '{ print $2 }'`
+ if [ "$RCLOCALPWD" = "" ]; then
+ echo ">>> Launching rc.local in background..."
+ sh /etc/rc.local &
+ sleep 1
+ sh /etc/rc.local.running &
+ else
+ if [ -f /etc/rc.local.running ]; then
+ echo ">>> Launching rc.local.running in background..."
+ sh /etc/rc.local.running &
+ fi
+ fi
+fi
+
+CONFIG="/cf/conf/config.xml"
+WORD="https"
+
+# Set our operating platform
+PLATFORM=`cat /etc/platform`
+
+# endless loop
+while : ; do
+
+if [ -f /tmp/ttybug ]; then
+ rm /tmp/ttybug
+ exit && exit && logout
+fi
+
+/etc/rc.banner
+
+product=`grep product_name /etc/inc/globals.inc | cut -d'"' -f4`
+hidebanner=`grep hidebanner /etc/inc/globals.inc | cut -d'"' -f4`
+
+# Check to see if SSH is running.
+if pgrep -q -a -F /var/run/sshd.pid sshd >/dev/null 2>&1; then
+ sshd_option="14) Disable Secure Shell (sshd)";
+else
+ sshd_option="14) Enable Secure Shell (sshd)";
+fi
+
+for i in /var/db/pfi/capable_*; do
+ if [ -f $i -a ! -L /cf/conf ]; then
+ option98="98) Move configuration file to removable device"
+ break
+ fi
+done
+
+if [ "$PLATFORM" = "cdrom" ]; then
+ option99="99) Install ${product} to a hard drive, etc."
+fi
+
+# display a cheap menu
+echo ""
+echo " 0) Logout (SSH only) 9) pfTop"
+echo " 1) Assign Interfaces 10) Filter Logs"
+echo " 2) Set interface(s) IP address 11) Restart webConfigurator"
+echo " 3) Reset webConfigurator password 12) ${product} Developer Shell"
+echo " 4) Reset to factory defaults 13) Upgrade from console"
+echo " 5) Reboot system ${sshd_option}"
+echo " 6) Halt system 15) Restore recent configuration"
+echo " 7) Ping host 16) Restart PHP-FPM"
+echo " 8) Shell"
+echo " ${option98} "
+
+if [ "${option99}" != "" ]; then
+ /bin/echo "${option99}"
+fi
+
+echo
+read -p "Enter an option: " opmode
+echo
+
+# see what the user has chosen
+case ${opmode} in
+0)
+ exit && exit && logout
+ ;;
+1)
+ /etc/rc.initial.setports
+ ;;
+2)
+ /etc/rc.initial.setlanip
+ ;;
+3)
+ /etc/rc.initial.password
+ ;;
+4)
+ /etc/rc.initial.defaults
+ ;;
+5)
+ /etc/rc.initial.reboot
+ ;;
+6)
+ /etc/rc.initial.halt
+ ;;
+7)
+ /etc/rc.initial.ping
+ ;;
+8)
+ /bin/tcsh
+ ;;
+9)
+ /usr/local/sbin/pftop
+ ;;
+10)
+ /usr/local/sbin/clog -f /var/log/filter.log
+ ;;
+11 | 111)
+ /etc/rc.restart_webgui
+ ;;
+12)
+ /usr/local/sbin/pfSsh.php
+ ;;
+13)
+ php -f /etc/rc.initial.firmware_update
+ ;;
+14)
+ php -f /etc/rc.initial.toggle_sshd
+ ;;
+15)
+ /etc/rc.restore_config_backup
+ ;;
+16)
+ /etc/rc.php-fpm_restart
+ ;;
+98)
+ if [ ! -f /tmp/config_moved ]; then
+ /etc/rc.initial.store_config_to_removable_device
+ fi
+ ;;
+99)
+ if [ -e /dev/ukbd0 ]; then
+ env TERM=cons25 /scripts/lua_installer
+ else
+ /scripts/lua_installer
+ fi
+ ;;
+100)
+ if grep "$WORD" "$CONFIG"; then
+ links "https://localhost"
+ else
+ links "http://localhost"
+ fi
+ ;;
+"")
+ kill $PPID ; exit
+ ;;
+esac
+
+done
+
diff --git a/src/etc/rc.initial.defaults b/src/etc/rc.initial.defaults
new file mode 100755
index 0000000..6901dae
--- /dev/null
+++ b/src/etc/rc.initial.defaults
@@ -0,0 +1,62 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.initial.defaults
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+ require_once("util.inc");
+ require_once("config.lib.inc");
+ require_once("functions.inc");
+
+ $fp = fopen('php://stdin', 'r');
+
+ echo <<<EOD
+
+You are about to reset the firewall to factory defaults.
+The firewall will reboot after resetting the configuration.
+
+Do you want to proceed [y|n]?
+EOD;
+
+ if (strcasecmp(chop(fgets($fp)), "y") == 0) {
+
+ reset_factory_defaults();
+
+ echo <<<EOD
+
+{$g['product_name']} is rebooting now.
+
+EOD;
+
+ system_reboot_sync();
+ }
+
+ fclose($fp);
+?>
diff --git a/src/etc/rc.initial.firmware_update b/src/etc/rc.initial.firmware_update
new file mode 100755
index 0000000..2dff066
--- /dev/null
+++ b/src/etc/rc.initial.firmware_update
@@ -0,0 +1,190 @@
+#!/usr/local/bin/php-cgi -f
+
+<?php
+
+require("globals.inc");
+require("config.inc");
+require("functions.inc");
+
+echo "Starting the {$g['product_name']} console firmware update system";
+
+require("functions.inc");
+echo ".";
+
+if (isset($config['system']['firmware']['alturl']['enable'])) {
+ $updater_url = "{$config['system']['firmware']['alturl']['firmwareurl']}";
+} else {
+ $updater_url = $g['update_url'];
+}
+
+$nanosize = "";
+if ($g['platform'] == "nanobsd") {
+ if (file_exists("/etc/nano_use_vga.txt")) {
+ $nanosize = "-nanobsd-vga-";
+ } else {
+ $nanosize = "-nanobsd-";
+ }
+
+ $nanosize .= strtolower(trim(file_get_contents("/etc/nanosize.txt")));
+ $update_filename = "latest{$nanosize}.img.gz";
+} else {
+ $update_filename = "latest.tgz";
+}
+$autoupdateurl = "{$updater_url}/{$update_filename}";
+
+$fp = fopen('php://stdin', 'r');
+
+echo ".\n\n";
+
+$shell_active = true;
+
+echo "1) Update from a URL\n";
+echo "2) Update from a local file\n";
+echo "Q) Quit\n";
+
+echo "\nPlease select an option to continue: ";
+
+$pkg_interface = 'console';
+$command = strtoupper(chop(fgets($fp)));
+
+switch ($command) {
+ case "q":
+ case "quit":
+ echo "\n";
+ fclose($fp);
+ die;
+ break;
+ case "1":
+ echo "\nEnter the URL to the .tgz or .img.gz update file. \nType 'auto' to use {$autoupdateurl}\n> ";
+ $url = chop(fgets($fp));
+ if (!$url) {
+ fclose($fp);
+ die;
+ }
+ if ($url == "auto") {
+ $url = $autoupdateurl;
+ }
+ $status = does_url_exist($url);
+ if ($status) {
+ conf_mount_rw();
+ mark_subsystem_dirty('firmware');
+ unlink_if_exists("/root/firmware.tgz");
+ echo "\nFetching file... ";
+ download_file_with_progress_bar($url, '/root/firmware.tgz');
+ if (!file_exists("/root/firmware.tgz")) {
+ echo "Something went wrong during file transfer. Exiting.\n\n";
+ fclose($fp);
+ clear_subsystem_dirty('firmware');
+ die;
+ }
+ $status = does_url_exist("$url.sha256");
+ if ($status) {
+ echo "\nFetching sha256... ";
+ download_file_with_progress_bar($url . ".sha256", '/root/firmware.tgz.sha256');
+ echo "\n";
+ } else {
+ echo "\n\nWARNING.\n";
+ echo "\nCould not locate a sha256 file. We cannot verify the download once completed.\n\n";
+ echo "Do you still want to proceed with the upgrade [n]? ";
+ $answer = strtoupper(chop(fgets($fp)));
+ if ($answer == "Y" or $answer == "YES") {
+ echo "\nContinuing upgrade...";
+ } else {
+ echo "\nUpgrade cancelled.\n\n";
+ die;
+ }
+ }
+ if (file_exists("/root/firmware.tgz.sha256")) {
+ $source_sha256 = trim(`cat /root/firmware.tgz.sha256 | awk '{ print \$4 }'`, "\r");
+ $file_sha256 = trim(`sha256 /root/firmware.tgz | awk '{ print \$4 }'`, "\r");
+ echo "URL sha256: $source_sha256\n";
+ echo "Downloaded file sha256: $file_sha256\n";
+ if ($source_sha256 <> $file_sha256) {
+ echo "\n\nsha256 checksum does not match. Cancelling upgrade.\n\n";
+ unlink_if_exists("/root/firmware.tgz.sha256");
+ fclose($fp);
+ clear_subsystem_dirty('firmware');
+ die -1;
+ }
+ echo "\nsha256 checksum matches.\n";
+ unlink_if_exists("/root/firmware.tgz.sha256");
+ }
+ if (strstr($url, "nanobsd")) {
+ echo "NanoBSD upgrade file detected...\n";
+ $type = "nanobsd";
+ } else {
+ $type = "normal";
+ }
+ do_upgrade("/root/firmware.tgz", $type);
+ clear_subsystem_dirty('firmware');
+ exit;
+ }
+ case "2":
+ echo "\nEnter the complete path to the .tgz or .img.gz update file: ";
+ $path = chop(fgets($fp));
+ if (!$path) {
+ fclose($fp);
+ die;
+ }
+ if (stristr($path, "nanobsd")) {
+ $type = "nanobsd";
+ }
+ if (file_exists($path)) {
+ mark_subsystem_dirty('firmware');
+ do_upgrade($path, $type);
+ clear_subsystem_dirty('firmware');
+ } else {
+ echo "\nCould not find file.\n\n";
+ fclose($fp);
+ die -1;
+ }
+}
+
+function do_upgrade($path, $type) {
+ global $g, $fp;
+
+ $sigchk = verify_digital_signature($path);
+ if ($sigchk == 1) {
+ $sig_warning = "The digital signature on this image is invalid.";
+ } elseif ($sigchk == 2) {
+ $sig_warning = "This image is not digitally signed.";
+ } elseif (($sigchk == 3) || ($sigchk == 4)) {
+ $sig_warning = "There has been an error verifying the signature on this image.";
+ }
+ if ($sig_warning) {
+ $sig_warning = "\nWARNING! ACHTUNG! DANGER!\n\n{$sig_warning}\n\n" .
+ "This means that the image you uploaded is not an official/supported image and\n" .
+ "may lead to unexpected behavior or security compromises.\n\n" .
+ "Only install images that come from sources that you trust, and make sure\n".
+ "that the image has not been tampered with.\n\n".
+ "Do you want to install this image anyway at your own risk [n]?";
+ echo $sig_warning;
+ $command = strtoupper(chop(fgets($fp)));
+ if (strtoupper($command) == "Y" or strtoupper($command) == "Y" or strtoupper($command) == "YES") {
+ echo "\nContinuing upgrade...";
+ } else {
+ echo "\nUpgrade cancelled.\n\n";
+ die;
+ }
+ }
+ mark_subsystem_dirty('firmwarelock');
+ echo "\nOne moment please...\nInvoking firmware upgrade...";
+ if ($type == "nanobsd") {
+ mwexec_bg("/etc/rc.firmware pfSenseNanoBSDupgrade $path");
+ } else {
+ mwexec_bg("/etc/rc.firmware pfSenseupgrade $path");
+ }
+ sleep(10);
+ while (is_subsystem_dirty('firmwarelock')) {
+ sleep(1);
+ echo ".";
+ }
+ sleep(10);
+ echo "Done. Rebooting...\n\n";
+ clear_subsystem_dirty('firmwarelock');
+}
+
+exec("rm -f /root/*.sha256");
+fclose($fp);
+
+?>
diff --git a/src/etc/rc.initial.halt b/src/etc/rc.initial.halt
new file mode 100755
index 0000000..9ff189b
--- /dev/null
+++ b/src/etc/rc.initial.halt
@@ -0,0 +1,61 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.initial.halt
+ part of pfSense (www.pfSense.com)
+ Copyright (C)2004 Bachman Kharazmi
+
+ Originally part of m0n0wall as rc.initial.reboot (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+ require_once("config.inc");
+ require_once("functions.inc");
+
+ $fp = fopen('php://stdin', 'r');
+
+ echo <<<EOD
+
+{$g['product_name']} will shutdown and halt system. This may take a few minutes, depending on your hardware.
+
+Do you want to proceed [y|n]?
+EOD;
+
+ if (strcasecmp(chop(fgets($fp)), "y") == 0) {
+
+ echo <<<EOD
+
+{$g['product_name']} will shutdown and halt system now.
+
+EOD;
+
+ system_halt();
+ }
+
+ fclose($fp);
+
+?>
diff --git a/src/etc/rc.initial.password b/src/etc/rc.initial.password
new file mode 100755
index 0000000..b5e01ed
--- /dev/null
+++ b/src/etc/rc.initial.password
@@ -0,0 +1,89 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.initial.password
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+
+ require_once("config.inc");
+ require("auth.inc");
+ require_once("functions.inc");
+ require_once("shaper.inc");
+
+ $fp = fopen('php://stdin', 'r');
+
+ echo "\n" . gettext('
+The webConfigurator admin password and privileges will be reset to the default (which is "' . strtolower($g['product_name']) . '").') . "\n" .
+ gettext('Do you want to proceed [y|n]?');
+
+ if (strcasecmp(chop(fgets($fp)), "y") == 0) {
+ if (isset($config['system']['webgui']['authmode']) &&
+ $config['system']['webgui']['authmode'] != "Local Database") {
+ echo "\n" . gettext('
+The User manager authentication server is set to "' . $config['system']['webgui']['authmode'] . '".') . "\n" .
+ gettext('Do you want to set it back to Local Database [y|n]?');
+ if (strcasecmp(chop(fgets($fp)), "y") == 0) {
+ $config['system']['webgui']['authmode'] = "Local Database";
+ }
+ }
+ $admin_user =& getUserEntryByUID(0);
+ if (!$admin_user) {
+ echo "Failed to locate the admin user account! Attempting to restore access.\n";
+ $admin_user = array();
+ $admin_user['uid'] = 0;
+ if (!is_array($config['system']['user'])) {
+ $config['system']['user'] = array();
+ }
+ $config['system']['user'][] = $admin_user;
+ }
+
+ $admin_user['name'] = "admin";
+ $admin_user['scope'] = "system";
+ $admin_user['priv'] = array("user-shell-access");
+
+ if (isset($admin_user['disabled'])) {
+ unset($admin_user['disabled']);
+ }
+
+ local_user_set_password($admin_user, strtolower($g['product_name']));
+ local_user_set($admin_user);
+ write_config(gettext("password changed from console menu"));
+
+ echo "\n" . gettext('
+The password for the webConfigurator has been reset and
+the default username has been set to "admin".') . "\n" .
+ gettext('
+Remember to set the password to something else than
+the default as soon as you have logged into the webConfigurator.') . "\n" .
+ gettext("Press ENTER to continue.");
+
+ fgets($fp);
+ }
+?>
diff --git a/src/etc/rc.initial.ping b/src/etc/rc.initial.ping
new file mode 100755
index 0000000..055d556
--- /dev/null
+++ b/src/etc/rc.initial.ping
@@ -0,0 +1,55 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.initial.ping
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+ require_once("config.inc");
+ require_once("functions.inc");
+
+ $fp = fopen('php://stdin', 'r');
+
+ echo "\nEnter a host name or IP address: ";
+
+ $pinghost = chop(fgets($fp));
+ if (is_ipaddrv4($pinghost) || is_hostname($pinghost)) {
+ $command = "ping";
+ } elseif (is_ipaddrv6($pinghost)) {
+ $command = "ping6";
+ }
+ if ($command) {
+ echo "\n";
+ passthru("/sbin/{$command} -c 3 -n " . escapeshellarg($pinghost));
+ echo "\nPress ENTER to continue.\n";
+ fgets($fp);
+ }
+
+ fclose($fp);
+?>
diff --git a/src/etc/rc.initial.reboot b/src/etc/rc.initial.reboot
new file mode 100755
index 0000000..38f9e3b
--- /dev/null
+++ b/src/etc/rc.initial.reboot
@@ -0,0 +1,61 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.initial.reboot
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+ require_once("config.inc");
+ require_once("functions.inc");
+ require_once("filter.inc");
+ require_once("captiveportal.inc");
+
+ $fp = fopen('php://stdin', 'r');
+
+ echo <<<EOD
+
+{$g['product_name']} will reboot. This may take a few minutes, depending on your hardware.
+
+Do you want to proceed [y|n]?
+EOD;
+
+ if (strcasecmp(chop(fgets($fp)), "y") == 0) {
+
+ echo <<<EOD
+
+{$g['product_name']} is rebooting now.
+
+EOD;
+
+ system_reboot_sync();
+ }
+
+ fclose($fp);
+
+?>
diff --git a/src/etc/rc.initial.setlanip b/src/etc/rc.initial.setlanip
new file mode 100755
index 0000000..e33a05a
--- /dev/null
+++ b/src/etc/rc.initial.setlanip
@@ -0,0 +1,556 @@
+#!/usr/local/bin/php-cgi -q
+<?php
+/* $Id$ */
+/*
+ rc.initial.setlanip
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$options = getopt("hn", array("dry-run", "help"));
+
+if (isset($options["h"]) || isset($options["help"])) {
+ echo "usage: /etc/rc.initial.setlanip [option ...]\n";
+ echo " -h, --help show this message\n";
+ echo " -n, --dry-run do not make any configuration changes\n";
+ return 0;
+}
+
+$dry_run = isset($options["n"]) || isset($options["dry-run"]);
+if ($dry_run) {
+ echo "DRY RUN MODE IS ON\n";
+}
+
+/* parse the configuration and include all functions used below */
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("rrd.inc");
+
+function console_prompt_for_yn ($prompt_text) {
+ global $fp;
+
+ $good_answer = false;
+
+ do {
+ echo "\n" . $prompt_text . " (y/n) ";
+ $yn = strtolower(chop(fgets($fp)));
+ if (($yn == "y") || ($yn == "yes")) {
+ $boolean_answer = true;
+ $good_answer = true;
+ }
+ if (($yn == "n") || ($yn == "no")) {
+ $boolean_answer = false;
+ $good_answer = true;
+ }
+ } while (!$good_answer);
+
+ return $boolean_answer;
+}
+
+function console_get_interface_from_ppp($realif) {
+ global $config;
+
+ if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
+ if ($realif == $ppp['if']) {
+ $ifaces = explode(",", $ppp['ports']);
+ return $ifaces[0];
+ }
+ }
+ }
+
+ return "";
+}
+
+function prompt_for_enable_dhcp_server($version = 4) {
+ global $config, $fp, $interface;
+ if ($interface == "wan") {
+ if ($config['interfaces']['lan']) {
+ return false;
+ }
+ }
+ /* only allow DHCP server to be enabled when static IP is
+ configured on this interface */
+ if ($version === 6) {
+ $is_ipaddr = is_ipaddrv6($config['interfaces'][$interface]['ipaddrv6']);
+ } else {
+ $is_ipaddr = is_ipaddrv4($config['interfaces'][$interface]['ipaddr']);
+ }
+ if (!($is_ipaddr)) {
+ return false;
+ }
+
+ $label_DHCP = ($version === 6) ? "DHCP6" : "DHCP";
+ $upperifname = strtoupper($interface);
+ return console_prompt_for_yn (sprintf(gettext("Do you want to enable the %s server on %s?"), $label_DHCP, $upperifname));
+}
+
+function get_interface_config_description($iface) {
+ global $config;
+ $c = $config['interfaces'][$iface];
+ if (!$c) {
+ return null;
+ }
+ $if = $c['if'];
+ $result = $if;
+ $result2 = array();
+ $ipaddr = $c['ipaddr'];
+ $ipaddrv6 = $c['ipaddrv6'];
+ if (is_ipaddr($ipaddr)) {
+ $result2[] = "static";
+ } else if ($ipaddr == "dhcp") {
+ $result2[] = "dhcp";
+ }
+ if (is_ipaddr($ipaddrv6)) {
+ $result2[] = "staticv6";
+ } else if ($ipaddrv6 == "dhcp6") {
+ $result2[] = "dhcp6";
+ }
+ if (count($result2)) {
+ $result .= " - " . implode(", ", $result2);
+ }
+ return $result;
+}
+
+$fp = fopen('php://stdin', 'r');
+
+/* build an interface collection */
+$ifdescrs = get_configured_interface_with_descr(false, true);
+$count = count($ifdescrs);
+
+/* grab interface that we will operate on, unless there is only one interface */
+if ($count > 1) {
+ echo "Available interfaces:\n\n";
+ $x=1;
+ foreach ($ifdescrs as $iface => $ifdescr) {
+ $config_descr = get_interface_config_description($iface);
+ echo "{$x} - {$ifdescr} ({$config_descr})\n";
+ $x++;
+ }
+ echo "\nEnter the number of the interface you wish to configure: ";
+ $intnum = chop(fgets($fp));
+} else {
+ $intnum = $count;
+}
+
+if ($intnum < 1) {
+ return;
+}
+if ($intnum > $count) {
+ return;
+}
+
+$index = 1;
+foreach ($ifdescrs as $ifname => $ifdesc) {
+ if ($intnum == $index) {
+ $interface = $ifname;
+ break;
+ } else {
+ $index++;
+ }
+}
+if (!$interface) {
+ echo "Invalid interface!\n";
+ return;
+}
+
+$ifaceassigned = "";
+
+function next_unused_gateway_name($interface) {
+ global $g, $config;
+ $new_name = "GW_" . strtoupper($interface);
+
+ if (!is_array($config['gateways']['gateway_item'])) {
+ return $new_name;
+ }
+ $count = 1;
+ do {
+ $existing = false;
+ foreach ($config['gateways']['gateway_item'] as $item) {
+ if ($item['name'] === $new_name) {
+ $existing = true;
+ break;
+ }
+ }
+ if ($existing) {
+ $count += 1;
+ $new_name = "GW_" . strtoupper($interface) . "_" . $count;
+ }
+ } while ($existing);
+ return $new_name;
+}
+
+function add_gateway_to_config($interface, $gatewayip, $inet_type) {
+ global $g, $config, $dry_run;
+ if (!is_array($config['gateways']['gateway_item'])) {
+ $config['gateways']['gateway_item'] = array();
+ }
+ $a_gateways = &$config['gateways']['gateway_item'];
+ if ($dry_run) {
+ print_r($a_gateways);
+ }
+ $new_name = '';
+ $is_default = true;
+ foreach ($a_gateways as $item) {
+ if ($item['ipprotocol'] === $inet_type) {
+ if (isset($item['defaultgw'])) {
+ $is_default = false;
+ }
+ if (($item['interface'] === $interface) && ($item['gateway'] === $gatewayip)) {
+ $new_name = $item['name'];
+ }
+ }
+ }
+ if ($new_name == '') {
+ $new_name = next_unused_gateway_name($interface);
+ $item = array(
+ "interface" => $interface,
+ "gateway" => $gatewayip,
+ "name" => $new_name,
+ "weight" => 1,
+ "ipprotocol" => $inet_type,
+ "interval" => true,
+ "descr" => "Interface $interface Gateway",
+ "defaultgw" => $is_default
+ );
+ if ($dry_run) {
+ print_r($item);
+ }
+ $a_gateways[] = $item;
+ }
+
+ return $new_name;
+}
+
+function console_configure_ip_address($version) {
+ global $g, $config, $interface, $restart_dhcpd, $ifaceassigned, $fp;
+
+ $label_IPvX = ($version === 6) ? "IPv6" : "IPv4";
+ $maxbits = ($version === 6) ? 127 : 31;
+ $label_DHCP = ($version === 6) ? "DHCP6" : "DHCP";
+
+ $upperifname = strtoupper($interface);
+
+ if ($interface == "wan") {
+ if (console_prompt_for_yn (sprintf(gettext("Configure %s address %s interface via %s?"), $label_IPvX, $upperifname, $label_DHCP))) {
+ $ifppp = console_get_interface_from_ppp(get_real_interface("wan"));
+ if (!empty($ifppp)) {
+ $ifaceassigned = $ifppp;
+ }
+ $intip = ($version === 6) ? "dhcp6" : "dhcp";
+ $intbits = "";
+ $isintdhcp = true;
+ $restart_dhcpd = true;
+ }
+ }
+
+ if ($isintdhcp == false or $interface <> "wan") {
+ while (true) {
+ do {
+ echo "\n" . sprintf(gettext("Enter the new %s %s address. Press <ENTER> for none:"),
+ $upperifname, $label_IPvX) . "\n> ";
+ $intip = chop(fgets($fp));
+ $is_ipaddr = ($version === 6) ? is_ipaddrv6($intip) : is_ipaddrv4($intip);
+ if ($is_ipaddr && is_ipaddr_configured($intip, $interface, true)) {
+ $ip_conflict = true;
+ echo gettext("This IP address conflicts with another interface or a VIP") . "\n";
+ } else {
+ $ip_conflict = false;
+ }
+ } while (($ip_conflict === true) || !($is_ipaddr || $intip == ''));
+ if ($intip != '') {
+ echo "\n" . sprintf(gettext("Subnet masks are entered as bit counts (as in CIDR notation) in %s."),
+ $g['product_name']) . "\n";
+ if ($version === 6) {
+ echo "e.g. ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00 = 120\n";
+ echo " ffff:ffff:ffff:ffff:ffff:ffff:ffff:0 = 112\n";
+ echo " ffff:ffff:ffff:ffff:ffff:ffff:0:0 = 96\n";
+ echo " ffff:ffff:ffff:ffff:ffff:0:0:0 = 80\n";
+ echo " ffff:ffff:ffff:ffff:0:0:0:0 = 64\n";
+ } else {
+ echo "e.g. 255.255.255.0 = 24\n";
+ echo " 255.255.0.0 = 16\n";
+ echo " 255.0.0.0 = 8\n";
+ }
+ do {
+ $upperifname = strtoupper($interface);
+ echo "\n" . sprintf(gettext("Enter the new %s %s subnet bit count (1 to %s):"),
+ $upperifname, $label_IPvX, $maxbits) . "\n> ";
+ $intbits = chop(fgets($fp));
+ $intbits_ok = is_numeric($intbits) && (($intbits >= 1) && ($intbits <= $maxbits));
+ $restart_dhcpd = true;
+
+ if ($version === 4 && $intbits < $maxbits) {
+ if ($intip == gen_subnet($intip, $intbits)) {
+ echo gettext("You cannot set network address to an interface");
+ continue 2;
+ $intbits_ok = false;
+ } else if ($intip == gen_subnet_max($intip, $intbits)) {
+ echo gettext("You cannot set broadcast address to an interface");
+ continue 2;
+ $intbits_ok = false;
+ }
+ }
+ } while (!$intbits_ok);
+
+ if ($version === 6) {
+ $subnet = gen_subnetv6($intip, $intbits);
+ } else {
+ $subnet = gen_subnet($intip, $intbits);
+ }
+ do {
+ echo "\n" . sprintf(gettext("For a WAN, enter the new %s %s upstream gateway address."), $upperifname, $label_IPvX) . "\n" .
+ gettext("For a LAN, press <ENTER> for none:") . "\n> ";
+ $gwip = chop(fgets($fp));
+ $is_ipaddr = ($version === 6) ? is_ipaddrv6($gwip) : is_ipaddrv4($gwip);
+ $is_in_subnet = $is_ipaddr && ip_in_subnet($gwip, $subnet . "/" . $intbits);
+ if ($gwip != '') {
+ if (!$is_ipaddr) {
+ echo sprintf(gettext("not an %s IP address!"), $label_IPvX) . "\n";
+ } else if (!$is_in_subnet) {
+ echo gettext("not in subnet!") . "\n";
+ }
+ }
+ } while (!($gwip == '' || ($is_ipaddr && $is_in_subnet)));
+
+ if ($gwip != '') {
+ $inet_type = ($version === 6) ? "inet6" : "inet";
+ $gwname = add_gateway_to_config($interface, $gwip, $inet_type);
+ }
+ }
+ $ifppp = console_get_interface_from_ppp(get_real_interface($interface));
+ if (!empty($ifppp)) {
+ $ifaceassigned = $ifppp;
+ }
+ break;
+ }
+ }
+
+ return array($intip, $intbits, $gwname);
+}
+
+list($intip, $intbits, $gwname) = console_configure_ip_address(4);
+list($intip6, $intbits6, $gwname6) = console_configure_ip_address(6);
+
+if (!empty($ifaceassigned)) {
+ $config['interfaces'][$interface]['if'] = $ifaceassigned;
+}
+$config['interfaces'][$interface]['ipaddr'] = $intip;
+$config['interfaces'][$interface]['subnet'] = $intbits;
+$config['interfaces'][$interface]['gateway'] = $gwname;
+$config['interfaces'][$interface]['ipaddrv6'] = $intip6;
+$config['interfaces'][$interface]['subnetv6'] = $intbits6;
+$config['interfaces'][$interface]['gatewayv6'] = $gwname6;
+$config['interfaces'][$interface]['enable'] = true;
+
+function console_configure_dhcpd($version = 4) {
+ global $g, $config, $restart_dhcpd, $fp, $interface, $dry_run, $intip, $intbits, $intip6, $intbits6;
+
+ $label_IPvX = ($version === 6) ? "IPv6" : "IPv4";
+ $dhcpd = ($version === 6) ? "dhcpdv6" : "dhcpd";
+
+ if ($g['services_dhcp_server_enable'] && prompt_for_enable_dhcp_server($version)) {
+ $subnet_start = ($version === 6) ? gen_subnetv6($intip6, $intbits6) : gen_subnet($intip, $intbits);
+ $subnet_end = ($version === 6) ? gen_subnetv6_max($intip6, $intbits6) : gen_subnet_max($intip, $intbits);
+ do {
+ do {
+ echo sprintf(gettext("Enter the start address of the %s client address range:"), $label_IPvX) . " ";
+ $dhcpstartip = chop(fgets($fp));
+ if ($dhcpstartip === "") {
+ fclose($fp);
+ return 0;
+ }
+ $is_ipaddr = ($version === 6) ? is_ipaddrv6($dhcpstartip) : is_ipaddrv4($dhcpstartip);
+ $is_inrange = is_inrange($dhcpstartip, $subnet_start, $subnet_end);
+ if (!$is_inrange) {
+ echo gettext("This IP address must be in the interface's subnet") . "\n";
+ }
+ } while (!$is_ipaddr || !$is_inrange);
+
+ do {
+ echo sprintf(gettext("Enter the end address of the %s client address range:"), $label_IPvX) . " ";
+ $dhcpendip = chop(fgets($fp));
+ if ($dhcpendip === "") {
+ fclose($fp);
+ return 0;
+ }
+ $is_ipaddr = ($version === 6) ? is_ipaddrv6($dhcpendip) : is_ipaddrv4($dhcpendip);
+ $is_inrange = is_inrange($dhcpendip, $subnet_start, $subnet_end);
+ if (!$is_inrange) {
+ echo gettext("This IP address must be in the interface's subnet") . "\n";
+ }
+ $not_inorder = ($version === 6) ? (inet_pton($dhcpendip) < inet_pton($dhcpstartip)) : ip_less_than($dhcpendip, $dhcpstartip);
+ if ($not_inorder) {
+ echo gettext("The end address of the DHCP range must be >= the start address") . "\n";
+ }
+ } while (!$is_ipaddr || !$is_inrange);
+ } while ($not_inorder);
+ $restart_dhcpd = true;
+ $config[$dhcpd][$interface]['enable'] = true;
+ $config[$dhcpd][$interface]['range']['from'] = $dhcpstartip;
+ $config[$dhcpd][$interface]['range']['to'] = $dhcpendip;
+ } else {
+ if (isset($config[$dhcpd][$interface]['enable'])) {
+ unset($config[$dhcpd][$interface]['enable']);
+ printf(gettext("Disabling %s DHCPD..."), $label_IPvX);
+ $restart_dhcpd = true;
+ }
+ }
+ return 1;
+}
+
+if (console_configure_dhcpd(4) == 0) {
+ return 0;
+}
+if (console_configure_dhcpd(6) == 0) {
+ return 0;
+}
+
+//*****************************************************************************
+
+if ($config['system']['webgui']['protocol'] == "https") {
+
+ if (console_prompt_for_yn (gettext("Do you want to revert to HTTP as the webConfigurator protocol?"))) {
+ $config['system']['webgui']['protocol'] = "http";
+ $restart_webgui = true;
+ }
+}
+
+if (isset($config['system']['webgui']['noantilockout'])) {
+ echo "\n" . sprintf(gettext("Note: the anti-lockout rule on %s has been re-enabled."), $interface) . "\n";
+ unset($config['system']['webgui']['noantilockout']);
+}
+
+if ($config['interfaces']['lan']) {
+ if ($config['dhcpd']) {
+ if ($config['dhcpd']['wan']) {
+ unset($config['dhcpd']['wan']);
+ }
+ }
+ if ($config['dhcpdv6']) {
+ if ($config['dhcpdv6']['wan']) {
+ unset($config['dhcpdv6']['wan']);
+ }
+ }
+}
+
+if (!$config['interfaces']['lan']) {
+ unset($config['interfaces']['lan']);
+ if ($config['dhcpd']['lan']) {
+ unset($config['dhcpd']['lan']);
+ }
+ if ($config['dhcpdv6']['lan']) {
+ unset($config['dhcpdv6']['lan']);
+ }
+ unset($config['shaper']);
+ unset($config['ezshaper']);
+ unset($config['nat']);
+ if (!$dry_run) {
+ system("rm /var/dhcpd/var/db/* >/dev/null 2>/dev/null");
+ $restart_dhcpd = true;
+ }
+}
+
+$upperifname = strtoupper($interface);
+if (!$dry_run) {
+ echo "\nPlease wait while the changes are saved to {$upperifname}...";
+ write_config(sprintf(gettext("%s IP configuration from console menu"), $interface));
+ interface_reconfigure(strtolower($upperifname));
+ echo "\n Reloading filter...";
+ filter_configure_sync();
+ echo "\n Reloading routing configuration...";
+ system_routing_configure();
+ if ($restart_dhcpd) {
+ echo "\n DHCPD...";
+ services_dhcpd_configure();
+ }
+ if ($restart_webgui) {
+ echo "\n Restarting webConfigurator... ";
+ mwexec("/etc/rc.restart_webgui");
+ }
+}
+
+if ($intip != '') {
+ if (is_ipaddr($intip)) {
+ echo "\n\n" . sprintf(gettext("The IPv4 %s address has been set to %s"),
+ $upperifname, "{$intip}/{$intbits}") . "\n";
+ } else {
+ echo "\n\n" . sprintf(gettext("The IPv4 %s address has been set to %s"),
+ $upperifname, $intip) . "\n";
+ }
+}
+if ($intip6 != '') {
+ if (is_ipaddr($intip6)) {
+ echo "\n\n" . sprintf(gettext("The IPv6 %s address has been set to %s"),
+ $upperifname, "${intip6}/${intbits6}") . "\n";
+ } else {
+ echo "\n\n" . sprintf(gettext("The IPv6 %s address has been set to %s"),
+ $upperifname, $intip6) . "\n";
+ }
+}
+
+if ($intip != '' || $intip6 != '') {
+ if (count($ifdescrs) == "1" or $interface == "lan") {
+ if ($debug) {
+ echo "ifdescrs count is " . count($ifdescrs) . "\n";
+ echo "interface is {$interface} \n";
+ }
+ echo gettext('You can now access the webConfigurator by opening the following URL in your web browser:') . "\n";
+ if (!empty($config['system']['webgui']['port'])) {
+ $webuiport = $config['system']['webgui']['port'];
+ if ($intip != '') {
+ echo " {$config['system']['webgui']['protocol']}://{$intip}:{$webuiport}/\n";
+ }
+ if ($intip6 != '') {
+ if (is_ipaddr($intip6)) {
+ echo " {$config['system']['webgui']['protocol']}://[{$intip6}]:{$webuiport}/\n";
+ } else {
+ echo " {$config['system']['webgui']['protocol']}://{$intip6}:{$webuiport}/\n";
+ }
+ }
+ } else {
+ if ($intip != '') {
+ echo " {$config['system']['webgui']['protocol']}://{$intip}/\n";
+ }
+ if ($intip6 != '') {
+ if (is_ipaddr($intip6)) {
+ echo " {$config['system']['webgui']['protocol']}://[{$intip6}]/\n";
+ } else {
+ echo " {$config['system']['webgui']['protocol']}://{$intip6}/\n";
+ }
+ }
+ }
+ }
+}
+
+echo "\n" . gettext('Press <ENTER> to continue.');
+
+fgets($fp);
+fclose($fp);
+
+?>
diff --git a/src/etc/rc.initial.setports b/src/etc/rc.initial.setports
new file mode 100755
index 0000000..147912f
--- /dev/null
+++ b/src/etc/rc.initial.setports
@@ -0,0 +1,51 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.initial.setports
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+ require_once("config.inc");
+ require_once("config.console.inc");
+ require_once("functions.inc");
+ require_once("filter.inc");
+ require_once("shaper.inc");
+ require_once("ipsec.inc");
+ require_once("vpn.inc");
+ require_once("captiveportal.inc");
+ require_once("rrd.inc");
+
+ set_networking_interfaces_ports();
+
+ reload_interfaces_sync();
+
+ /* reload graphing functions */
+ enable_rrd_graphing();
+
+?>
diff --git a/src/etc/rc.initial.store_config_to_removable_device b/src/etc/rc.initial.store_config_to_removable_device
new file mode 100755
index 0000000..a40df6f
--- /dev/null
+++ b/src/etc/rc.initial.store_config_to_removable_device
@@ -0,0 +1,93 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.initial.store_config_to_removable_device
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+ require_once("config.inc");
+ require_once("functions.inc");
+ require_once("util.inc");
+
+ $fp = fopen('php://stdin', 'r');
+
+ do {
+ $dirs = array();
+ $dirs = return_dir_as_array("/var/db/pfi/");
+ if (!is_array($dirs)) {
+ echo "\nNo capable storage devices detected.\n";
+ fclose($fp);
+ return;
+ }
+ echo "\nDevices capable of config.xml storage:\n";
+ foreach ($dirs as $dir) {
+ preg_match_all("/capable\_(.*)/", $dir, $match_array);
+ echo $match_array[1][0] . " ";
+ }
+ echo "\n\n";
+ echo "Enter the device that you wish the";
+ echo "\n";
+ echo "{$g['product_name']} configuration file to reside on: ";
+ $move_config_to_device = chop(fgets($fp));
+ if ($move_config_to_device == "") {
+ fclose($fp);
+ return 0;
+ }
+ } while (!$move_config_to_device);
+
+ mwexec("/bin/mkdir -p /tmp/mnt/cf");
+
+ $status = mwexec("/sbin/mount -w -t msdosfs /dev/{$move_config_to_device} /tmp/mnt/cf");
+ if (!$status) {
+ echo "Error while mounting {$move_config_to_device}.\n";
+ fclose($fp);
+ return;
+ }
+
+ echo "\n\nProcessing: ";
+ $lockkey = lock('config');
+ echo "moving...";
+ mwexec("mkdir -p /tmp/mnt/cf/conf/");
+ mwexec("/bin/mv /cf/conf/config.xml /tmp/mnt/cf/conf/");
+ echo "removing old...";
+ echo " nullfs... ";
+ system("/sbin/umount /cf/conf");
+ system("/sbin/umount /conf");
+ mwexec("/bin/rm -rf /conf/*.*");
+ /* use nullfs to mount */
+ system("/sbin/mount_nullfs /tmp/mnt/cf/conf /conf");
+ system("/sbin/mount_nullfs /tmp/mnt/cf /cf");
+ echo "linking...";
+ mwexec("/bin/rm -rf /var/db/pfi");
+ unlock($lockkey);
+ echo "done.\n";
+ echo "\nYour configuration has been moved to {$move_config_to_device}\n";
+ touch("/tmp/config_moved");
+ fclose($fp);
+?>
diff --git a/src/etc/rc.initial.toggle_sshd b/src/etc/rc.initial.toggle_sshd
new file mode 100755
index 0000000..695a6c1
--- /dev/null
+++ b/src/etc/rc.initial.toggle_sshd
@@ -0,0 +1,75 @@
+#! /usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.initial.toggle_sshd
+ sshd - Modified to work on disk based system
+ Copyright 2004 Scott K Ullrich
+
+ Original Copyright (C) 2004 Fred Mol <fredmol@xs4all.nl>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+
+conf_mount_rw();
+
+$fp = fopen('php://stdin', 'r');
+
+if (isset($config['system']['enablesshd'])) {
+ echo "SSHD is currently enabled. Would you like to disable? [y/n]? ";
+ $yn = chop(fgets($fp));
+ if ($yn[0] == "y") {
+ unset($config['system']['enablesshd']);
+ echo "\nWriting configuration...";
+ write_config();
+ echo " done.\n";
+ echo "\nDisabling SSHD...";
+ send_event("service reload sshd");
+ echo "\nReloading firewall rules.";
+ filter_configure();
+ echo " done.\n";
+ exec("ps awux | grep '/usr/sbin/sshd' | grep -v grep | awk '{print $2}' | xargs kill");
+ }
+
+} else {
+ echo "SSHD is currently disabled. Would you like to enable? [y/n]? ";
+ $yn = chop(fgets($fp));
+ if ($yn[0] == "y") {
+ $config['system']['enablesshd'] = true;
+ echo "\nWriting configuration...";
+ write_config();
+ echo " done.\n";
+ echo "\nEnabling SSHD...";
+ send_event("service reload sshd");
+ echo "\nReloading firewall rules.";
+ filter_configure();
+ echo " done.\n\n";
+ }
+}
+
+fclose($fp);
+
+conf_mount_ro();
diff --git a/src/etc/rc.interfaces_carp_configure b/src/etc/rc.interfaces_carp_configure
new file mode 100755
index 0000000..33a0b38
--- /dev/null
+++ b/src/etc/rc.interfaces_carp_configure
@@ -0,0 +1,39 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.interfaces_carp_configure
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+interfaces_carp_configure();
+
+?>
diff --git a/src/etc/rc.interfaces_lan_configure b/src/etc/rc.interfaces_lan_configure
new file mode 100755
index 0000000..2924cf9
--- /dev/null
+++ b/src/etc/rc.interfaces_lan_configure
@@ -0,0 +1,39 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.interfaces_lan_configure
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+interface_configure("lan");
+
+?>
diff --git a/src/etc/rc.interfaces_opt_configure b/src/etc/rc.interfaces_opt_configure
new file mode 100755
index 0000000..c00877a
--- /dev/null
+++ b/src/etc/rc.interfaces_opt_configure
@@ -0,0 +1,41 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.interfaces_opt_configure
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("vpn.inc");
+require_once("captiveportal.inc");
+
+interfaces_configure();
+
+?>
diff --git a/src/etc/rc.interfaces_wan_configure b/src/etc/rc.interfaces_wan_configure
new file mode 100755
index 0000000..9b064d0
--- /dev/null
+++ b/src/etc/rc.interfaces_wan_configure
@@ -0,0 +1,50 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.interfaces_wan_configure
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+if (isset($_GET['interface'])) {
+ $argument = $_GET['interface'];
+} else {
+ $argument = str_replace("\n", "", $argv[1]);
+}
+if (empty($argument)) {
+ interface_configure("wan");
+} else {
+ if (!empty($config['interfaces'][$argument])) {
+ interface_configure($argument);
+ }
+}
+
+?>
diff --git a/src/etc/rc.kill_states b/src/etc/rc.kill_states
new file mode 100755
index 0000000..715c860
--- /dev/null
+++ b/src/etc/rc.kill_states
@@ -0,0 +1,94 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.kill_states
+ Copyright (C) 2013 Renato Botelho (garga@pfsense.org)
+ part of pfSense (https://www.pfsense.org)
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* parse the configuration and include all functions used below */
+require_once("globals.inc");
+require_once("config.inc");
+require_once("interfaces.inc");
+require_once("util.inc");
+
+// Do not process while booting
+if (platform_booting()) {
+ return;
+}
+
+/* Interface address to cleanup states */
+$interface = str_replace("\n", "", $argv[1]);
+
+/* IP address to cleanup states */
+$local_ip = str_replace("\n", "", $argv[2]);
+
+if (empty($interface) || !does_interface_exist($interface)) {
+ log_error("rc.kill_states: Invalid interface '{$interface}'");
+ return;
+}
+
+if (!empty($local_ip)) {
+ list($local_ip, $subnet_bits) = explode("/", $local_ip);
+
+ if (empty($subnet_bits)) {
+ $subnet_bits = "32";
+ }
+
+ if (!is_ipaddr($local_ip)) {
+ log_error("rc.kill_states: Invalid IP address '{$local_ip}'");
+ return;
+ }
+}
+
+if (!isset($config['system']['kill_states'])) {
+ if (!empty($local_ip)) {
+ log_error("rc.kill_states: Removing states for IP {$local_ip}/{$subnet_bits}");
+ $nat_states = exec_command("/sbin/pfctl -i {$interface} -ss | " .
+ "/usr/bin/egrep '\-> +{$local_ip}:[0-9]+ +\->'");
+
+ $cleared_states = array();
+ foreach (explode("\n", $nat_states) as $nat_state) {
+ if (preg_match_all('/([\d\.]+):[\d]+[\s->]+/i', $nat_state, $matches, PREG_SET_ORDER) != 3) {
+ continue;
+ }
+
+ $src = $matches[0][1];
+ $dst = $matches[2][1];
+
+ if (empty($src) || empty($dst) || in_array("{$src},{$dst}", $cleared_states)) {
+ continue;
+ }
+
+ $cleared_states[] = "{$src},{$dst}";
+ pfSense_kill_states($src, $dst);
+ }
+
+ pfSense_kill_states("0.0.0.0/0", "{$local_ip}/{$subnet_bits}");
+ pfSense_kill_states("{$local_ip}/{$subnet_bits}");
+ pfSense_kill_srcstates("{$local_ip}/{$subnet_bits}");
+ }
+ log_error("rc.kill_states: Removing states for interface {$interface}");
+ mwexec("/sbin/pfctl -i {$interface} -Fs", true);
+}
diff --git a/src/etc/rc.linkup b/src/etc/rc.linkup
new file mode 100755
index 0000000..153cd49
--- /dev/null
+++ b/src/etc/rc.linkup
@@ -0,0 +1,165 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.linkup - devd hotplug actions
+ part of pfSense
+
+ Copyright (C) 2003-2005 Scott Ullrich <sullrich@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* parse the configuration and include all functions used below */
+require_once("globals.inc");
+require_once("config.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("interfaces.inc");
+
+if (platform_booting()) {
+ return;
+}
+
+function handle_argument_group($iface, $argument2) {
+ global $config;
+
+ if (!is_array($config['interfaces'][$iface])) {
+ log_error("Cannot find interface configuration for {$iface}");
+ return;
+ }
+
+ if (!isset($config['interfaces'][$iface]['enable'])) {
+ if (!platform_booting()) {
+ log_error("Linkup detected on disabled interface...Ignoring");
+ }
+ return;
+ }
+
+ $ipaddr = $config['interfaces'][$iface]['ipaddr'];
+ $ip6addr = $config['interfaces'][$iface]['ipaddrv6'];
+ $staticv4 = false;
+ if (empty($ipaddr)) {
+ $staticv4 = true;
+ } else {
+ $staticv4 = is_ipaddrv4($ipaddr);
+ }
+ $staticv6 = false;
+ if (empty($ip6addr)) {
+ $staticv6 = true;
+ } else {
+ $staticv6 = is_ipaddrv6($ip6addr);
+ }
+ if ($staticv4 === true && $staticv6 === true) {
+ $friendly = convert_friendly_interface_to_friendly_descr($iface);
+ log_error("Hotplug event detected for {$friendly}({$iface}) but ignoring since interface is configured with static IP ({$ipaddr} {$ip6addr})");
+ interfaces_staticarp_configure($iface);
+ switch ($argument2) {
+ case 'start':
+ case 'up':
+ $iface = get_real_interface($iface);
+ /* NOTE: Do not generate event for OpenVPN since the daemon does that for us. */
+ if (substr($iface, 0, 4) != "ovpn") {
+ send_event("interface newip {$iface}");
+ }
+ break;
+ }
+ } else {
+ switch ($argument2) {
+ case "stop":
+ case "down":
+ log_error("DEVD Ethernet detached event for {$iface}");
+ interface_bring_down($iface);
+ break;
+ case "start":
+ case "up":
+ log_error("DEVD Ethernet attached event for {$iface}");
+ log_error("HOTPLUG: Configuring interface {$iface}");
+ require_once("vpn.inc");
+ require_once("captiveportal.inc");
+ // Do not try to readd to bridge otherwise em(4) has problems
+ interface_configure($iface, true, true);
+ break;
+ }
+ }
+}
+
+if (isset($_GET['interface'])) {
+ if (!empty($_GET['interface'])) {
+ $realiface = $_GET['interface'];
+ }
+ $action = $_GET['action'];
+} else {
+ if ($argc < 3) {
+ log_error("HOTPLUG event: The required number of parameters not passed!");
+ return;
+ }
+ $action = $argv[1];
+ $realiface = $argv[2];
+}
+
+switch ($action) {
+ case "start":
+ case "stop":
+ break;
+ default:
+ log_error("HOTPLUG event: Action parameter ($action) passed is wrong - only start/stop/up/down are allowed!");
+ return;
+ /* NOTREACHED */
+ break;
+}
+
+if (!empty($realiface)) {
+ if (substr($realiface, 0, 4) == 'ovpn') {
+ log_error("Ignoring link event for ovpn interface");
+ return;
+ }
+ $rclinkuplock = lock("rclinkup{$realiface}", LOCK_EX);
+ $interface = convert_real_interface_to_friendly_interface_name($realiface);
+ if (!empty($interface)) {
+ handle_argument_group($interface, $action);
+ }
+ if ($action == 'start') {
+ /* Check if there is any child on this one as ppp types and trigger them */
+ if (is_array($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as $pppidx => $ppp) {
+ if ($ppp['type'] == 'ppp') {
+ continue;
+ }
+ $ports = explode(',', $ppp['ports']);
+ foreach ($ports as $pid => $parent_if) {
+ /* The loop here is because ppp types can have real and assigned interfaces as members */
+ $tmpiface = get_real_interface($parent_if);
+ if ($tmpiface != $realiface) {
+ continue;
+ }
+ $tmpiface = convert_real_interface_to_friendly_interface_name($ppp['if']);
+ if (!empty($tmpiface)) {
+ interface_configure($tmpiface, true, true);
+ }
+ }
+ }
+ }
+ }
+ unlock($rclinkuplock);
+}
+?>
diff --git a/src/etc/rc.nanobsd_switch_boot_slice b/src/etc/rc.nanobsd_switch_boot_slice
new file mode 100755
index 0000000..58dbcc6
--- /dev/null
+++ b/src/etc/rc.nanobsd_switch_boot_slice
@@ -0,0 +1,27 @@
+#!/usr/local/bin/php-cgi -q
+<?php
+require_once("globals.inc");
+require_once("config.inc");
+require_once("pfsense-utils.inc");
+
+global $g;
+global $SLICE, $OLDSLICE, $TOFLASH, $COMPLETE_PATH, $COMPLETE_BOOT_PATH;
+global $GLABEL_SLICE, $UFS_ID, $OLD_UFS_ID, $BOOTFLASH;
+global $BOOT_DEVICE, $REAL_BOOT_DEVICE, $BOOT_DRIVE, $ACTIVE_SLICE;
+nanobsd_detect_slice_info();
+
+if ($g['platform'] != "nanobsd") {
+ echo "This script can only be used on NanoBSD (embedded) images.\n";
+ return 1;
+}
+
+echo "Boot slice : {$BOOTFLASH} ({$BOOT_DEVICE})\n";
+echo "Active slice: {$ACTIVE_SLICE}\n\n";
+
+echo "Switching active slice...";
+nanobsd_switch_boot_slice();
+echo "Done.\n\n";
+nanobsd_detect_slice_info();
+echo "Boot slice : {$BOOTFLASH} ({$BOOT_DEVICE})\n";
+echo "Active slice: {$ACTIVE_SLICE}\n\n";
+?>
diff --git a/src/etc/rc.newipsecdns b/src/etc/rc.newipsecdns
new file mode 100755
index 0000000..7c5428a
--- /dev/null
+++ b/src/etc/rc.newipsecdns
@@ -0,0 +1,61 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.newipsecdns
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2007 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2009 Seth Mos <seth.mos@dds.nl>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* parse the configuration and include all functions used below */
+require_once("util.inc");
+require_once("config.inc");
+require_once("gwlb.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("auth.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+
+/* make sure to wait until the boot scripts have finished */
+if (file_exists("{$g['varrun_path']}/booting")) {
+ return;
+}
+
+if (isset($config['ipsec']['enable'])) {
+ sleep(15);
+ log_error("IPSEC: One or more IPsec tunnel endpoints has changed its IP. Refreshing.");
+} else {
+ return;
+}
+
+$ipseclck = lock('ipsecdns', LOCK_EX);
+
+vpn_ipsec_configure();
+
+unlock($ipseclck);
+?>
diff --git a/src/etc/rc.newroutedns b/src/etc/rc.newroutedns
new file mode 100755
index 0000000..de3a081
--- /dev/null
+++ b/src/etc/rc.newroutedns
@@ -0,0 +1,59 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.newroutedns
+ Copyright (C) 2013 Renato Botelho <garga@pfsense.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* parse the configuration and include all functions used below */
+require_once("util.inc");
+require_once("config.inc");
+require_once("functions.inc");
+require_once("system.inc");
+
+/* make sure to wait until the boot scripts have finished */
+if (file_exists("{$g['varrun_path']}/booting")) {
+ return;
+}
+
+$staticroutes = get_staticroutes();
+
+if (count($staticroutes)) {
+ log_error("Static Routes: One or more aliases used for routing has changed its IP. Refreshing.");
+} else {
+ return;
+}
+
+$routelck = lock('routedns', LOCK_EX);
+
+/* We will walk the list of hostnames found in static routes
+ * configuration. Since we are already triggered by filterdns
+ * that a hostname has changed we can proceed to compare the
+ * new IP address with the old address from the DNS cache.
+ */
+system_staticroutes_configure();
+
+unlock($routelck);
+?>
diff --git a/src/etc/rc.newwanip b/src/etc/rc.newwanip
new file mode 100755
index 0000000..01d211c
--- /dev/null
+++ b/src/etc/rc.newwanip
@@ -0,0 +1,268 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.newwanip
+ Copyright (C) 2006 Scott Ullrich (sullrich@gmail.com)
+ part of pfSense (https://www.pfsense.org)
+
+ Originally part of m0n0wall (http://m0n0.ch)
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* parse the configuration and include all functions used below */
+require_once("globals.inc");
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+require_once("openvpn.inc");
+require_once("IPv6.inc");
+require_once("rrd.inc");
+
+function restart_packages() {
+ global $oldip, $curwanip, $g;
+
+ /* restart packages */
+ system_ntp_configure(false);
+ mwexec_bg("/usr/local/sbin/ntpdate_sync_once.sh", true);
+ log_error("{$g['product_name']} package system has detected an IP change or dynamic WAN reconnection - $oldip -> $curwanip - Restarting packages.");
+ send_event("service reload packages");
+}
+
+/* Interface IP address has changed */
+if (isset($_GET['interface'])) {
+ $argument = $_GET['interface'];
+} else {
+ $argument = str_replace("\n", "", $argv[1]);
+}
+
+log_error("rc.newwanip: Info: starting on {$argument}.");
+
+if (empty($argument)) {
+ $interface = "wan";
+ $interface_real = get_real_interface();
+} else {
+ $interface = convert_real_interface_to_friendly_interface_name($argument);
+ $interface_real = $argument;
+}
+
+$interface_descr = convert_friendly_interface_to_friendly_descr($interface);
+
+/* If the interface is configured and not enabled, bail. We do not need to change settings for disabled interfaces. #3313 */
+if (is_array($config['interfaces'][$interface]) && !isset($config['interfaces'][$interface]['enable'])) {
+ log_error("Interface is disabled, nothing to do.");
+ return;
+}
+
+if (empty($argument)) {
+ $curwanip = get_interface_ip();
+} else {
+ $curwanip = find_interface_ip($interface_real, true);
+ if ($curwanip == "") {
+ $curwanip = get_interface_ip($interface);
+ }
+}
+
+if (!platform_booting()) {
+ log_error("rc.newwanip: on (IP address: {$curwanip}) (interface: {$interface_descr}[{$interface}]) (real interface: {$interface_real}).");
+}
+
+/*
+ * NOTE: Take care of openvpn, no-ip or similar interfaces if you generate the event to reconfigure an interface.
+ * i.e. OpenVPN might be in tap mode and not have an ip.
+ */
+if ($curwanip == "0.0.0.0" || !is_ipaddr($curwanip)) {
+ if (substr($interface_real, 0, 4) != "ovpn") {
+ if (!empty($config['interfaces'][$interface]['ipaddr'])) {
+ log_error("rc.newwanip: Failed to update {$interface} IP, restarting...");
+ send_event("interface reconfigure {$interface}");
+ return;
+ }
+ }
+}
+
+/* XXX: This really possible? */
+if (empty($interface)) {
+ if (platform_booting()) {
+ return;
+ }
+ filter_configure();
+ restart_packages();
+ return;
+}
+
+$oldip = "0.0.0.0";
+if (file_exists("{$g['vardb_path']}/{$interface}_cacheip")) {
+ $oldip = file_get_contents("{$g['vardb_path']}/{$interface}_cacheip");
+}
+
+/* regenerate resolv.conf if DNS overrides are allowed */
+if (!platform_booting()) {
+ system_resolvconf_generate(true);
+}
+
+/* write the current interface IP to file */
+if (is_ipaddr($curwanip)) {
+ @file_put_contents("{$g['vardb_path']}/{$interface}_ip", $curwanip);
+}
+
+link_interface_to_vips($interface, "update");
+
+unset($gre);
+$gre = link_interface_to_gre($interface);
+if (!empty($gre)) {
+ array_walk($gre, 'interface_gre_configure');
+}
+
+unset($gif);
+$gif = link_interface_to_gif($interface);
+if (!empty($gif)) {
+ array_walk($gif, 'interface_gif_configure');
+}
+
+$grouptmp = link_interface_to_group($interface);
+if (!empty($grouptmp)) {
+ array_walk($grouptmp, 'interface_group_add_member');
+}
+
+unset($bridgetmp);
+$bridgetmp = link_interface_to_bridge($interface);
+if (!empty($bridgetmp)) {
+ interface_bridge_add_member($bridgetmp, $interface_real);
+}
+
+// Do not process while booting
+if (platform_booting()) {
+ return;
+}
+
+/* make new hosts file */
+system_hosts_generate();
+
+/* check tunnelled IPv6 interface tracking */
+switch ($config['interfaces'][$interface]['ipaddrv6']) {
+ case "6to4":
+ interface_6to4_configure($interface, $config['interfaces'][$interface]);
+ break;
+ case "6rd":
+ interface_6rd_configure($interface, $config['interfaces'][$interface]);
+ break;
+ case "dhcp6":
+ if (isset($config['interfaces'][$interface]['dhcp6usev4iface'])) {
+ interface_dhcpv6_configure($interface, $config['interfaces'][$interface]);
+ }
+ break;
+}
+
+/* Check Gif tunnels */
+if (!empty($gif)) {
+ foreach ($gif as $giftun) {
+ $confif = convert_real_interface_to_friendly_interface_name($giftun['gifif']);
+ if (!empty($confif)) {
+ interface_configure($confif);
+ system_routing_configure($confif);
+ }
+ }
+}
+if (!empty($gre)) {
+ foreach ($gre as $gretun) {
+ $confif = convert_real_interface_to_friendly_interface_name($gretun['greif']);
+ if (!empty($confif)) {
+ interface_configure($confif);
+ system_routing_configure($confif);
+ }
+ }
+}
+
+/*
+ * We need to force sync VPNs on such even when the IP is the same for dynamic interfaces.
+ * Even with the same IP the VPN software is unhappy with the IP disappearing, and we
+ * could be failing back in which case we need to switch IPs back anyhow.
+ */
+if (!is_ipaddr($oldip) || $curwanip != $oldip || !is_ipaddrv4($config['interfaces'][$interface]['ipaddr'])) {
+ /* IP changed, kill states accordingly */
+ if ($curwanip != $oldip) {
+ log_error("IP has changed, killing states on former IP $oldip.");
+ pfSense_kill_states($oldip);
+ if (isset($config['system']['ip_change_kill_states'])) {
+ /* hidden config option to wipe all states if needed */
+ log_error("Killing all states post-IP change.");
+ filter_flush_state_table();
+ }
+ }
+
+ /*
+ * Some services (e.g. dyndns, see ticket #4066) depend on
+ * filter_configure() to be called before, otherwise pass out
+ * route-to rules have the old ip set in 'from' and connection
+ * do not go through correct link
+ */
+ filter_configure_sync();
+
+ /* reconfigure static routes (kernel may have deleted them) */
+ system_routing_configure($interface);
+
+ /* reconfigure our gateway monitor */
+ setup_gateways_monitor();
+
+ /* reload unbound */
+ services_unbound_configure();
+
+ if (is_ipaddr($curwanip)) {
+ @file_put_contents("{$g['vardb_path']}/{$interface}_cacheip", $curwanip);
+ }
+
+ /* perform RFC 2136 DNS update */
+ services_dnsupdate_process($interface);
+
+ /* signal dyndns update */
+ services_dyndns_configure($interface);
+
+ /* reconfigure IPsec tunnels */
+ vpn_ipsec_force_reload($interface);
+
+ /* start OpenVPN server & clients */
+ if (substr($interface_real, 0, 4) != "ovpn") {
+ openvpn_resync_all($interface);
+ }
+
+ /* reload graphing functions */
+ enable_rrd_graphing();
+
+ /* reload igmpproxy */
+ services_igmpproxy_configure();
+
+ /* restart snmp */
+ services_snmpd_configure();
+
+ restart_packages();
+} else {
+ /* signal filter reload */
+ filter_configure();
+}
+
+?>
diff --git a/src/etc/rc.newwanipv6 b/src/etc/rc.newwanipv6
new file mode 100755
index 0000000..1030d96
--- /dev/null
+++ b/src/etc/rc.newwanipv6
@@ -0,0 +1,204 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.newwanipv6
+ Copyright (C) 2006 Scott Ullrich (sullrich@gmail.com)
+ part of pfSense (https://www.pfsense.org)
+
+ Originally part of m0n0wall (http://m0n0.ch)
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* parse the configuration and include all functions used below */
+require_once("globals.inc");
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+require_once("openvpn.inc");
+require_once("IPv6.inc");
+require_once("services.inc");
+require_once("rrd.inc");
+
+function restart_packages() {
+ global $oldipv6, $curwanipv6, $g;
+
+ /* restart packages */
+ system_ntp_configure(false);
+ mwexec_bg("/usr/local/sbin/ntpdate_sync_once.sh", true);
+ log_error("{$g['product_name']} package system has detected an IP change or dynamic WAN reconnection - $oldipv6 -> $curwanipv6 - Restarting packages.");
+ send_event("service reload packages");
+}
+
+/* Interface IP address has changed */
+if (isset($_GET['interface'])) {
+ $argument = $_GET['interface'];
+} else {
+ $argument = trim($argv[1], " \n\t");
+}
+
+log_error("rc.newwanipv6: Info: starting on {$argument}.");
+
+if (empty($argument)) {
+ $interface = "wan";
+ $interface_real = get_real_interface($interface, "inet6");
+ $curwanipv6 = get_interface_ipv6($interface, true);
+} else {
+ $interface_real = $argument;
+ $interface = convert_real_interface_to_friendly_interface_name($interface_real);
+ $curwanipv6 = get_interface_ipv6($interface, true);
+}
+
+$interface_descr = convert_friendly_interface_to_friendly_descr($interface);
+
+if (empty($interface)) {
+ filter_configure();
+ // restart_packages();
+ return;
+}
+
+//Do not process while booting
+if (platform_booting() && $config['interfaces'][$interface]['ipaddrv6'] != "dhcp6") {
+ return;
+}
+
+/*
+ * NOTE: Take care of openvpn and similar if you generate the event to reconfigure an interface.
+ * i.e. OpenVPN might be in tap mode and not have an ip.
+ */
+if ((empty($curwanipv6) || !is_ipaddrv6($curwanipv6)) && substr($interface_real, 0, 4) != "ovpn") {
+ log_error("rc.newwanipv6: Failed to update {$interface_descr}[{$interface}] IPv6, restarting...");
+ // send_event("interface reconfigure {$interface}");
+ return;
+}
+
+if (isset($_GET['dmips'])) {
+ $new_domain_name_servers = $_GET['dmips'];
+} else {
+ $new_domain_name_servers = getenv("new_domain_name_servers");
+}
+
+if (!empty($new_domain_name_servers)) {
+ $name_servers = explode(" ", $new_domain_name_servers);
+ $valid_ns = array();
+ foreach ($name_servers as $ns) {
+ if (is_ipaddrv6(trim($ns))) {
+ $valid_ns[] = trim($ns);
+ }
+ }
+
+ if (count($valid_ns > 0)) {
+ file_put_contents("{$g['varetc_path']}/nameserver_v6{$interface}", implode("\n", $valid_ns));
+ }
+}
+if (isset($_GET['dmnames'])) {
+ $new_domain_name = $_GET['dmnames'];
+} else {
+ $new_domain_name = getenv("new_domain_name");
+}
+
+if (!empty($new_domain_name)) {
+ file_put_contents("{$g['varetc_path']}/searchdomain_v6{$interface}", $new_domain_name);
+}
+
+/* write current WAN IPv6 to file */
+if (is_ipaddrv6($curwanipv6)) {
+ @file_put_contents("{$g['vardb_path']}/{$interface}_ipv6", $curwanipv6);
+}
+
+log_error("rc.newwanipv6: on (IP address: {$curwanipv6}) (interface: {$interface}) (real interface: {$interface_real}).");
+
+$oldipv6 = '';
+if (file_exists("{$g['vardb_path']}/{$interface}_cacheipv6")) {
+ $oldipv6 = file_get_contents("{$g['vardb_path']}/{$interface}_cacheipv6");
+}
+
+$grouptmp = link_interface_to_group($interface);
+if (!empty($grouptmp)) {
+ array_walk($grouptmp, 'interface_group_add_member');
+}
+
+link_interface_to_track6($interface, "update");
+
+/* regenerate resolv.conf if DNS overrides are allowed */
+system_resolvconf_generate(true);
+
+/* reconfigure static routes (kernel may have deleted them) */
+system_routing_configure($interface);
+
+/* reconfigure our gateway monitor */
+setup_gateways_monitor();
+
+/* signal filter reload */
+filter_configure();
+
+if (empty($oldipv6) || is_ipaddrv6($oldipv6)) {
+ if ($curwanipv6 == $oldipv6) {
+ // Still need to sync VPNs on PPPoE and such, as even with the same IP the VPN software is unhappy with the IP disappearing.
+ if (in_array($config['interfaces'][$interface]['ipaddrv6'], array('pppoe', 'pptp', 'ppp'))) {
+ /* reconfigure IPsec tunnels */
+ vpn_ipsec_force_reload($interface);
+
+ /* start OpenVPN server & clients */
+ if (substr($interface_real, 0, 4) != "ovpn") {
+ openvpn_resync_all($interface);
+ }
+ }
+ return;
+ } else if (does_interface_exist($interface_real) && !empty($oldipv6)) {
+ mwexec("/sbin/ifconfig {$interface_real} inet6 {$oldipv6} delete");
+ }
+
+ file_put_contents("{$g['vardb_path']}/{$interface}_cacheipv6", $curwanipv6);
+}
+
+/* reload unbound */
+services_unbound_configure();
+
+/* perform RFC 2136 DNS update */
+services_dnsupdate_process($interface);
+
+/* signal dyndns update */
+services_dyndns_configure($interface);
+
+/* reconfigure IPsec tunnels */
+vpn_ipsec_force_reload($interface);
+
+/* start OpenVPN server & clients */
+if (substr($interface_real, 0, 4) != "ovpn") {
+ openvpn_resync_all($interface);
+}
+
+/* reload graphing functions */
+enable_rrd_graphing();
+
+/* reload igmpproxy */
+services_igmpproxy_configure();
+
+restart_packages();
+
+?>
diff --git a/src/etc/rc.notify_message b/src/etc/rc.notify_message
new file mode 100755
index 0000000..fec1949
--- /dev/null
+++ b/src/etc/rc.notify_message
@@ -0,0 +1,64 @@
+#!/usr/local/bin/php-cgi
+<?php
+/*
+ rc.notify_message
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("notices.inc");
+
+$arguments = getopt("egm:");
+
+$send_email = false;
+$send_growl = false;
+$message = "";
+
+foreach ($arguments as $item => $arg) {
+ switch ($item) {
+ case "e":
+ $send_email = true;
+ break;
+ case "g":
+ $send_growl = true;
+ break;
+ case "m":
+ $message = $arg;
+ break;
+ }
+}
+
+if ($message) {
+ if ($send_email) {
+ notify_via_smtp($message);
+ }
+ if ($send_growl) {
+ notify_via_growl($message);
+ }
+}
+
+?>
diff --git a/src/etc/rc.ntpdate b/src/etc/rc.ntpdate
new file mode 100755
index 0000000..4bdc647
--- /dev/null
+++ b/src/etc/rc.ntpdate
@@ -0,0 +1,39 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id: */
+/*
+ rc.ntpdate
+ part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Scott Ullrich <sullrich@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+ require_once("config.inc");
+ require_once("functions.inc");
+ require_once("filter.inc");
+ require_once("shaper.inc");
+
+ system_ntp_configure();
+?>
diff --git a/src/etc/rc.openvpn b/src/etc/rc.openvpn
new file mode 100755
index 0000000..cda8067
--- /dev/null
+++ b/src/etc/rc.openvpn
@@ -0,0 +1,132 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.openvpn
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2007 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2009 Seth Mos <seth.mos@dds.nl>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* parse the configuration and include all functions used below */
+require_once("util.inc");
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("gwlb.inc");
+require_once("openvpn.inc");
+
+function openvpn_resync_if_needed ($mode, $ovpn_settings, $interface) {
+ global $g, $config;
+
+ $resync_needed = true;
+ if (isset($ovpn_settings['disable'])) {
+ $resync_needed = false;
+ } else {
+ if (!empty($interface)) {
+ $mode_id = $mode . $ovpn_settings['vpnid'];
+ $fpath = "{$g['varetc_path']}/openvpn/{$mode_id}.interface";
+ if (file_exists($fpath)) {
+ /* Compare the interface currently used by the VPN with the interface that should be used.
+ If the VPN should stay on the same interface, do not resync */
+ if (trim(file_get_contents($fpath), " \t\n") == get_failover_interface($ovpn_settings['interface'])) {
+ $resync_needed = false;
+ }
+ }
+ }
+ }
+ if ($resync_needed == true) {
+ log_error("OpenVPN: Resync " . $mode_id . " " . $ovpn_settings['description']);
+ openvpn_resync($mode, $ovpn_settings);
+ }
+}
+
+/* make sure to wait until the boot scripts have finished */
+if (file_exists("{$g['varrun_path']}/booting")) {
+ return;
+}
+
+/* Input argument is a comma-separated list of gateway names, blank or "all". */
+if (isset($_GET['interface'])) {
+ $argument = $_GET['interface'];
+} else {
+ $argument = trim($argv[1], " \n");
+}
+
+if ((is_array($config['openvpn']['openvpn-server']) && count($config['openvpn']['openvpn-server'])) ||
+ (is_array($config['openvpn']['openvpn-client']) && count($config['openvpn']['openvpn-client']))) {
+ if (empty($argument) || $argument == "all") {
+ $argument = "all";
+ $log_text = "all";
+ } else {
+ $log_text = "endpoints that may use " . $argument;
+ }
+ log_error("OpenVPN: One or more OpenVPN tunnel endpoints may have changed its IP. Reloading " . $log_text . ".");
+} else {
+ return;
+}
+
+$openvpnlck = try_lock('openvpn', 10);
+if (!$openvpnlck) {
+ log_error(gettext("Could not obtain openvpn lock for executing rc.openvpn for more than 10 seconds continuing..."));
+ unlock_force('openvpn');
+ $openvpnlck = lock('openvpn', LOCK_EX);
+}
+
+$arg_array = explode(",", $argument);
+foreach ($arg_array as $arg_element) {
+ $gwgroups = array();
+ if ($arg_element == "all") {
+ $interface = "";
+ } else {
+ // e.g. $arg_element = "WANGW", $interface = "wan"
+ $interface = lookup_gateway_interface_by_name($arg_element);
+ if (empty($interface)) {
+ $interface = $arg_element;
+ } else {
+ // e.g. $arg_element = "WANGW", $gwgroups = array of gateway groups that use "wan"
+ $gwgroups = gateway_is_gwgroup_member($arg_element);
+ }
+ }
+
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as &$server) {
+ if ($server['interface'] == $interface || empty($interface) || (!empty($gwgroups) && in_array($server['interface'], $gwgroups))) {
+ openvpn_resync_if_needed('server', $server, $interface);
+ }
+ }
+ }
+
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as &$client) {
+ if ($client['interface'] == $interface || empty($interface) || (!empty($gwgroups) && in_array($client['interface'], $gwgroups))) {
+ openvpn_resync_if_needed('client', $client, $interface);
+ }
+ }
+ }
+}
+
+unlock($openvpnlck);
+?>
diff --git a/src/etc/rc.packages b/src/etc/rc.packages
new file mode 100755
index 0000000..cdca880
--- /dev/null
+++ b/src/etc/rc.packages
@@ -0,0 +1,88 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.packages
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("captiveportal.inc");
+require_once("pkg-utils.inc");
+require_once("pfsense-utils.inc");
+
+function usage() {
+ print "Usage: rc.packages PKG_NAME (POST-INSTALL|DEINSTALL|POST-DEINSTALL)\n";
+ exit(1);
+}
+
+$pkg_interface = "console";
+
+/* Keep old behavior: with no params, sync all and exit */
+if ($argc == 1) {
+ resync_all_package_configs(true);
+ exit;
+}
+
+$pkg = '';
+$when = '';
+
+if (isset($_GET['pkg'])) {
+ $pkg = $_GET['pkg'];
+} else {
+ $pkg = $argv[1];
+}
+
+if (isset($_GET['when'])) {
+ $when = strtolower($_GET['when']);
+} else {
+ $when = strtolower($argv[2]);
+}
+
+if ($pkg == '' || $when == '') {
+ print "Error: invalid parameters\n";
+ usage();
+}
+
+/* Remove pkg_prefix from pkg name */
+pkg_remove_prefix($pkg);
+
+switch ($when) {
+case "post-install":
+ install_package_xml($pkg);
+ break;
+case "deinstall":
+case "post-deinstall":
+ delete_package_xml($pkg, $when);
+ break;
+default:
+ usage();
+}
+
+?>
diff --git a/src/etc/rc.php-fpm_restart b/src/etc/rc.php-fpm_restart
new file mode 100755
index 0000000..6ce04c6
--- /dev/null
+++ b/src/etc/rc.php-fpm_restart
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+echo ">>> Killing php-fpm"
+/bin/pkill -F /var/run/php-fpm.pid
+sleep 2
+
+# Run the php.ini setup file and populate
+# /usr/local/etc/php.ini and /usr/local/lib/php.ini
+/etc/rc.conf_mount_rw
+/etc/rc.php_ini_setup 2>/tmp/php_errors.txt
+/bin/rm -f /var/run/php-fpm.pid 2>/dev/null
+/bin/rm -f /var/run/php-fpm.socket 2>/dev/null
+/etc/rc.conf_mount_ro
+echo ">>> Restarting php-fpm" | /usr/bin/logger -p daemon.info -i -t rc.php-fpm_restart
+echo ">>> Starting php-fpm"
+/usr/local/sbin/php-fpm -c /usr/local/lib/php.ini -y /usr/local/lib/php-fpm.conf -RD 2>&1 >/dev/null
+
diff --git a/src/etc/rc.php_ini_setup b/src/etc/rc.php_ini_setup
new file mode 100755
index 0000000..0013b58
--- /dev/null
+++ b/src/etc/rc.php_ini_setup
@@ -0,0 +1,417 @@
+#!/bin/sh
+#
+# rc.php_ini_setup
+# Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# Set our operating platform
+PLATFORM=`/bin/cat /etc/platform`
+MIN_REALMEM_FOR_OPCACHE=512
+
+if [ -d /usr/local/lib/php/20121212 ]; then
+ EXTENSIONSDIR="/usr/local/lib/php/20121212/"
+elif [ -d /usr/local/lib/php/20090626 ]; then
+ EXTENSIONSDIR="/usr/local/lib/php/20090626/"
+else
+ EXTENSIONSDIR="/usr/local/lib/php/20060613/"
+fi
+
+# Grab amount of memory that is detected
+if [ -f /var/log/dmesg.boot ]; then
+ AVAILMEM=`/bin/cat /var/log/dmesg.boot |/usr/bin/awk '/avail memory/ { memory=($4 / 1048576); printf("%0.0f\n", memory); exit}'`
+else
+ AVAILMEM=`/sbin/dmesg -a |/usr/bin/awk '/avail memory/ { memory=($4 / 1048576); printf("%0.0f\n", memory); exit}'`
+fi
+
+if [ -z "$AVAILMEM" ]; then
+ MEM=`/sbin/sysctl hw.physmem | cut -d':' -f2`
+ AVAILMEM=`/bin/expr $MEM / 1048576`
+fi
+
+
+# Get amount of ram installed on this system
+REALMEM=`/sbin/sysctl hw.realmem | /usr/bin/awk '{print $2/1048576}' | /usr/bin/awk -F '.' '{print $1}'`
+export REALMEM
+export LOWMEM
+
+if [ ${REALMEM} -lt $MIN_REALMEM_FOR_OPCACHE ]; then
+ LOWMEM="TRUE"
+ echo ">>> Under $MIN_REALMEM_FOR_OPCACHE megabytes of ram detected. Not enabling opcache"
+ echo ">>> Under $MIN_REALMEM_FOR_OPCACHE megabytes of ram detected. Not enabling opcache" | /usr/bin/logger -p daemon.info -i -t rc.php_ini_setup
+else
+
+ # Calculate opcache memory size according
+ # to detected memory values
+ if [ "$AVAILMEM" -gt "135" ]; then
+ OPCACHEMEMSIZE="10"
+ fi
+ if [ "$AVAILMEM" -gt "256" ]; then
+ OPCACHEMEMSIZE="20"
+ fi
+ if [ "$AVAILMEM" -gt "384" ]; then
+ OPCACHEMEMSIZE="25"
+ fi
+ if [ "$AVAILMEM" -gt "512" ]; then
+ OPCACHEMEMSIZE="30"
+ fi
+ if [ "$AVAILMEM" -gt "784" ]; then
+ OPCACHEMEMSIZE="50"
+ fi
+fi
+
+# Set upload directory
+if [ "$PLATFORM" = "nanobsd" ]; then
+ UPLOADTMPDIR=`/usr/bin/grep upload_path /etc/inc/globals.inc | /usr/bin/cut -d'"' -f4`
+else
+ UPLOADTMPDIR="/tmp"
+fi
+
+# Define php modules. Do not add .so, it will
+# be done automatically by the script below.
+PHPMODULES="standard"
+if [ "$LOWMEM" != "TRUE" ]; then
+ PHPMODULES="$PHPMODULES opcache"
+fi
+# Config read/write
+PHPMODULES="$PHPMODULES xml libxml dom"
+PHPMODULES="$PHPMODULES SimpleXML xmlreader xmlwriter"
+# Downloading via HTTP/FTP (pkg mgr, etc)
+PHPMODULES="$PHPMODULES curl date"
+# Internationalization
+PHPMODULES="$PHPMODULES gettext"
+# User manager
+PHPMODULES="$PHPMODULES ldap openssl pcntl"
+PHPMODULES="$PHPMODULES hash"
+PHPMODULES="$PHPMODULES mcrypt"
+# Regexs, PERL style!
+PHPMODULES="$PHPMODULES pcre"
+# The mighty posix!
+PHPMODULES="$PHPMODULES posix"
+PHPMODULES="$PHPMODULES readline"
+# Login sessions
+PHPMODULES="$PHPMODULES session"
+# Extra sanity seatbelts
+PHPMODULES="$PHPMODULES suhosin"
+# Firewall rules edit
+PHPMODULES="$PHPMODULES ctype"
+# firewall_rules_edit.php
+PHPMODULES="$PHPMODULES mbstring"
+# Synchronization primitives
+PHPMODULES="$PHPMODULES shmop"
+# Page compression
+PHPMODULES="$PHPMODULES zlib"
+# SQLlite & Database
+PHPMODULES="$PHPMODULES spl"
+PHPMODULES="$PHPMODULES PDO"
+PHPMODULES="$PHPMODULES sqlite3"
+# RADIUS
+PHPMODULES="$PHPMODULES radius"
+# ZeroMQ
+PHPMODULES="$PHPMODULES zmq"
+# SSH2
+PHPMODULES="$PHPMODULES ssh2"
+# pfSense extensions
+PHPMODULES="$PHPMODULES pfSense"
+# json
+PHPMODULES="$PHPMODULES json"
+# bcmath
+PHPMODULES="$PHPMODULES bcmath"
+# filter
+PHPMODULES="$PHPMODULES filter"
+
+PHP_ZEND_MODULES="ioncube_loader"
+PHP_ZEND_MODULES_TS="ioncube_loader_ts"
+
+# Modules previously included.
+# can be turned on by touching
+# /etc/php_dynamodules/$modulename
+# sysvmsg \
+# sysvsem \
+# sysvshm \
+# bcmath \
+# tokenizer \
+# uploadprogress \
+# sockets \
+# Reflection \
+# mysql \
+# bz2 \
+
+# Clear the .ini file to make sure we are clean
+if [ -f /usr/local/etc/php.ini ]; then
+ /bin/rm /usr/local/etc/php.ini
+fi
+if [ -f /usr/local/lib/php.ini ]; then
+ /bin/rm /usr/local/lib/php.ini
+fi
+LOADED_MODULES=`/usr/local/bin/php-cgi -m | /usr/bin/grep -v "\["`
+
+# Fetch the timezone from the XML and set it here. We set it later too in the running scripts
+TIMEZONE=`cat /conf/config.xml | egrep -E '<timezone>(.*?)</timezone>' | awk -F'>' '{print $2}'|awk -F'<' '{print $1}'`
+
+# Get a loaded module list in the stock php
+# Populate a dummy php.ini to avoid
+# the file being clobbered and the firewall
+# not being able to boot back up.
+/bin/cat >/usr/local/lib/php.ini <<EOF
+; File generated from /etc/rc.php_ini_setup
+output_buffering = "0"
+expose_php = Off
+implicit_flush = true
+magic_quotes_gpc = Off
+max_execution_time = 900
+max_input_time = 1800
+register_argc_argv = On
+register_long_arrays = Off
+variables_order = "GPCS"
+file_uploads = On
+upload_tmp_dir = ${UPLOADTMPDIR}
+upload_max_filesize = 200M
+post_max_size = 200M
+html_errors = Off
+zlib.output_compression = Off
+zlib.output_compression_level = 1
+include_path = ".:/etc/inc:/usr/local/www:/usr/local/captiveportal:/usr/local/pkg"
+display_startup_errors=on
+display_errors=on
+log_errors=on
+error_log=/tmp/PHP_errors.log
+extension_dir=${EXTENSIONSDIR}
+date.timezone="${TIMEZONE}"
+
+; Extensions
+
+EOF
+
+# Copy php.ini file to etc/ too (cli)
+/bin/cp /usr/local/lib/php.ini /usr/local/etc/php.ini
+
+# Ensure directory exists
+if [ ! -d /etc/php_dynamodules ]; then
+ /bin/mkdir /etc/php_dynamodules
+fi
+if [ ! -d /etc/php_dynamodules_zend ]; then
+ /bin/mkdir /etc/php_dynamodules_zend
+fi
+if [ ! -d /etc/php_dynamodules_zend_ts ]; then
+ /bin/mkdir /etc/php_dynamodules_zend_ts
+fi
+
+# Read in dynamodules
+if [ -d /etc/php_dynamodules ]; then
+ DYNA_MODULES=`/bin/ls -Utr /etc/php_dynamodules/`
+ PHPMODULES="$PHPMODULES $DYNA_MODULES"
+fi
+
+# Read in zend modules
+if [ -d /etc/php_dynamodules_zend ]; then
+ DYNA_MODULES=`/bin/ls /etc/php_dynamodules_zend/`
+ PHP_ZEND_MODULES="$PHP_ZEND_MODULES $DYNA_MODULES"
+fi
+
+# Read in zend threaded modules
+if [ -d /etc/php_dynamodules_zend_ts ]; then
+ DYNA_MODULES=`/bin/ls /etc/php_dynamodules_zend_ts/`
+ PHP_ZEND_MODULES_TS="$PHP_ZEND_MODULES_TS $DYNA_MODULES"
+fi
+
+# Loop through and generate modules to load.
+# Take into account modules built into php.
+for EXT in $PHPMODULES; do
+ SHOULDADD="true"
+ # Check to see if module is compiled into php statically
+ for LM in $LOADED_MODULES; do
+ if [ "$EXT" = "$LM" ]; then
+ SHOULDADD="false"
+ fi
+ done
+ if [ "$SHOULDADD" = "true" ]; then
+ # Ensure extension exists before adding.
+ if [ -f "${EXTENSIONSDIR}${EXT}.so" ]; then
+ echo "extension=${EXT}.so" >> /usr/local/lib/php.ini
+ fi
+ fi
+done
+
+# Zend modules
+for EXT in $PHP_ZEND_MODULES; do
+ # Ensure extension exists before adding.
+ if [ -f "${EXTENSIONSDIR}/ioncube/${EXT}.so" ]; then
+ echo "zend_extension=${EXTENSIONSDIR}/ioncube/${EXT}.so" >> /usr/local/lib/php.ini
+ fi
+done
+
+# Zend threaded modules
+for EXT in $PHP_ZEND_MODULES_TS; do
+ # Ensure extension exists before adding.
+ if [ -f "${EXTENSIONSDIR}/ioncube/${EXT}.so" ]; then
+ echo "zend_extension_ts=${EXTENSIONSDIR}/ioncube/${EXT}.so" >> /usr/local/lib/php.ini
+ fi
+done
+
+
+if [ "$LOWMEM" != "TRUE" ]; then
+
+ /bin/cat >>/usr/local/lib/php.ini <<EOF
+
+; opcache Settings
+opcache.enabled="1"
+opcache.enable_cli="0"
+opcache.memory_consumption="${OPCACHEMEMSIZE}"
+
+EOF
+fi
+
+ /bin/cat >>/usr/local/lib/php.ini <<EOF
+
+[suhosin]
+suhosin.get.max_array_depth = 5000
+suhosin.get.max_array_index_length = 256
+suhosin.get.max_vars = 5000
+suhosin.get.max_value_length = 500000
+suhosin.post.max_array_depth = 5000
+suhosin.post.max_array_index_length = 256
+suhosin.post.max_vars = 5000
+suhosin.post.max_value_length = 500000
+suhosin.request.max_array_depth = 5000
+suhosin.request.max_array_index_length = 256
+suhosin.request.max_vars = 5000
+suhosin.request.max_value_length = 500000
+suhosin.memory_limit = 512435456
+
+EOF
+
+
+PHPFPMMAX=3
+if [ $REALMEM -lt 250 ]; then
+ PHPFPMMAX=2
+elif [ ${REALMEM} -gt 1000 ]; then
+ PHPFPMMAX=4
+fi
+
+/bin/cat > /usr/local/lib/php-fpm.conf <<EOF
+
+[global]
+pid = run/php-fpm.pid
+error_log=syslog
+syslog.facility = daemon
+syslog.ident = system
+log_level = error
+daemonize = yes
+events.mechanism = kqueue
+process.max = ${PHPFPMMAX}
+
+[lighty]
+user = root
+group = wheel
+;mode = 0600
+
+listen = /var/run/php-fpm.socket
+listen.owner = root
+listen.group = wheel
+listen.mode = 0600
+
+security.limit_extensions =
+
+; Pass environment variables
+env[PATH] = /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
+env[LOGNAME] = root
+
+EOF
+
+if [ $REALMEM -lt 350 ]; then
+ /bin/cat >> /usr/local/lib/php-fpm.conf <<EOF
+
+pm = ondemand
+pm.process_idle_timeout = 5
+pm.max_children = $PHPFPMMAX
+pm.max_requests = 500
+
+EOF
+
+elif [ $REALMEM -gt 1000 ]; then
+ /bin/cat >> /usr/local/lib/php-fpm.conf <<EOF
+
+pm = dynamic
+pm.process_idle_timeout = 5
+pm.max_children = $PHPFPMMAX
+pm.start_servers = 1
+pm.max_requests = 500
+pm.min_spare_servers=1
+pm.max_spare_servers=1
+
+EOF
+else
+
+ /bin/cat >> /usr/local/lib/php-fpm.conf <<EOF
+
+pm = static
+pm.max_children = $PHPFPMMAX
+pm.max_requests = 500
+
+EOF
+
+fi
+
+# Copy php.ini file to etc/ too (cli)
+/bin/cp /usr/local/lib/php.ini /usr/local/etc/php.ini
+
+# Remove old log file if it exists.
+if [ -f /var/run/php_modules_load_errors.txt ]; then
+ /bin/rm /var/run/php_modules_load_errors.txt
+fi
+
+for EXT in $PHPMODULES; do
+ PHPMODULESLC="$PHPMODULESLC `echo "$EXT" | /usr/bin/tr '[:upper:]' '[:lower:]'`"
+done
+
+# Check loaded modules and remove anything that did not load correctly
+LOADED_MODULES=`/usr/local/bin/php-cgi -m | /usr/bin/tr '[:upper:]' '[:lower:]' 2>/dev/null | /usr/bin/grep -v "\["`
+for EXT in $PHPMODULESLC; do
+ SHOULDREMOVE="true"
+ for LM in $LOADED_MODULES; do
+ if [ "$EXT" = "$LM" ]; then
+ SHOULDREMOVE="false"
+ fi
+ done
+ # Handle low memory situations
+ if [ "$LOWMEM" = "TRUE" ]; then
+ if [ "$EXT" = "opcache" ]; then
+ SHOULDREMOVE="true"
+ fi
+ if [ "$EXT" = "xcache" ]; then
+ SHOULDREMOVE="true"
+ fi
+ fi
+ if [ "$SHOULDREMOVE" = "true" ]; then
+ if [ -f "${EXTENSIONSDIR}${EXT}.so" ]; then
+ echo ">>> ${EXT} did not load correctly. Removing from php.ini..." >> /var/run/php_modules_load_errors.txt
+ /bin/cat /usr/local/lib/php.ini | /usr/bin/grep -v $EXT > /tmp/php.ini
+ /bin/rm -f /usr/local/lib/php.ini
+ /bin/mv /tmp/php.ini /usr/local/lib/php.ini
+ fi
+ fi
+done
+
+# Copy php.ini file to etc/ too (cli)
+/bin/cp /usr/local/lib/php.ini /usr/local/etc/php.ini
diff --git a/src/etc/rc.prunecaptiveportal b/src/etc/rc.prunecaptiveportal
new file mode 100755
index 0000000..c4b760a
--- /dev/null
+++ b/src/etc/rc.prunecaptiveportal
@@ -0,0 +1,66 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.prunecaptiveportal
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* parse the configuration and include all functions used below */
+/* config.inc retrieves the util.inc and globals.inc */
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("captiveportal.inc");
+
+global $g;
+global $cpzone;
+global $cpzoneid;
+
+$cpzone = str_replace("\n", "", $argv[1]);
+if (!is_array($config['captiveportal'][$cpzone])) {
+ log_error("{$cpzone} is not a valid zone in the configuration!");
+ return;
+}
+$cpzoneid = $config['captiveportal'][$cpzone]['zoneid'];
+
+if (file_exists("{$g['tmp_path']}/.rc.prunecaptiveportal.{$cpzone}.running")) {
+ $stat = stat("{$g['tmp_path']}/.rc.prunecaptiveportal.{$cpzone}.running");
+ if (time() - $stat['mtime'] >= 120) {
+ @unlink("{$g['tmp_path']}/.rc.prunecaptiveportal.{$cpzone}.running");
+ } else {
+ log_error("Skipping CP pruning process because previous/another instance is already running");
+ return;
+ }
+}
+
+@file_put_contents("{$g['tmp_path']}/.rc.prunecaptiveportal.{$cpzone}.running", "");
+captiveportal_prune_old();
+@unlink("{$g['tmp_path']}/.rc.prunecaptiveportal.{$cpzone}.running");
+
+?>
diff --git a/src/etc/rc.reboot b/src/etc/rc.reboot
new file mode 100755
index 0000000..afdc93c
--- /dev/null
+++ b/src/etc/rc.reboot
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+# $Id$
+
+if ! /usr/bin/lockf -s -t 30 /tmp/config.lock /usr/bin/true; then
+ echo "Cannot reboot at this moment, a config write operation is in progress, and 30 seconds have passed."
+ exit 1
+fi
+
+sleep 1
+
+# If PLATFORM is pfSense then remove
+# temporary files on shutdown from /tmp/
+PLATFORM=`cat /etc/platform`
+if [ "$PLATFORM" = "pfSense" ]; then
+ rm -rf /tmp/*
+fi
+
+USE_MFS_TMPVAR=`/usr/bin/grep -c use_mfs_tmpvar /cf/conf/config.xml`
+DISK_NAME=`/bin/df /var/db/rrd | /usr/bin/tail -1 | /usr/bin/awk '{print $1;}'`
+DISK_TYPE=`/usr/bin/basename ${DISK_NAME} | /usr/bin/cut -c1-2`
+# If we are not on a full install, or if the full install wants RAM disks, or if the full install _was_ using RAM disks, but isn't for the next boot...
+if [ "${PLATFORM}" != "pfSense" ] || [ ${USE_MFS_TMPVAR} -gt 0 ] || [ "${DISK_TYPE}" = "md" ]; then
+ /etc/rc.backup_rrd.sh
+ /etc/rc.backup_dhcpleases.sh
+fi
+
+sleep 1
+
+SHUTDOWN=/sbin/shutdown
+if [ -f /sbin/shutdown.old ]; then
+ SHUTDOWN=/sbin/shutdown.old
+fi
+
+$SHUTDOWN -r now
diff --git a/src/etc/rc.reload_all b/src/etc/rc.reload_all
new file mode 100755
index 0000000..162553c
--- /dev/null
+++ b/src/etc/rc.reload_all
@@ -0,0 +1,46 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.reload_all
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+require_once("captiveportal.inc");
+
+log_error("rc.reload_all: Reloading all configuration settings.");
+reload_all_sync();
+sleep(2);
+log_error("rc.reload_all: Reloading filter configuration.");
+filter_configure_sync();
+
+?>
diff --git a/src/etc/rc.reload_interfaces b/src/etc/rc.reload_interfaces
new file mode 100755
index 0000000..e34588f
--- /dev/null
+++ b/src/etc/rc.reload_interfaces
@@ -0,0 +1,45 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.reload_interfaces
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("openvpn.inc");
+require_once("vpn.inc");
+require_once("captiveportal.inc");
+
+reload_interfaces_sync();
+filter_configure_sync();
+/* XXX: needs fixing */
+//ovpn_config_server("pfreload");
+
+?>
diff --git a/src/etc/rc.resolv_conf_generate b/src/etc/rc.resolv_conf_generate
new file mode 100755
index 0000000..e37203b
--- /dev/null
+++ b/src/etc/rc.resolv_conf_generate
@@ -0,0 +1,36 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ rc.resolv_conf_generate
+ Copyright (C) 2010 Ermal Lui
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("globals.inc");
+require_once("config.inc");
+require_once("functions.inc");
+
+system_resolvconf_generate(true);
+
+?>
diff --git a/src/etc/rc.restart_webgui b/src/etc/rc.restart_webgui
new file mode 100755
index 0000000..7a0bcd3
--- /dev/null
+++ b/src/etc/rc.restart_webgui
@@ -0,0 +1,28 @@
+#!/usr/local/bin/php-cgi -f
+
+<?php
+
+require("config.inc");
+require("functions.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+require_once("rrd.inc");
+
+echo "Restarting webConfigurator...";
+
+sigkillbyname("lighttpd", "KILL");
+
+while (is_process_running("lighttpd")) {
+ echo '.';
+ sleep(1);
+}
+
+system_webgui_start();
+
+captiveportal_init_webgui();
+
+enable_rrd_graphing();
+
+echo " done.\n\n";
+
+?>
diff --git a/src/etc/rc.restore_config_backup b/src/etc/rc.restore_config_backup
new file mode 100755
index 0000000..b64e023
--- /dev/null
+++ b/src/etc/rc.restore_config_backup
@@ -0,0 +1,129 @@
+#!/usr/local/bin/php-cgi -q
+<?php
+require_once('config.inc');
+
+cleanup_backupcache();
+$confvers = get_backups();
+unset($confvers['versions']);
+
+$fp = fopen('php://stdin', 'r');
+
+function print_backup_info($backup_info, $number) {
+ if ($backup_info['time'] != 0) {
+ $date = date(gettext("n/j/y H:i:s"), $backup_info['time']);
+ } else {
+ $date = gettext("Unknown");
+ }
+
+ list($page, $reason) = explode(": ", $backup_info['description'], 2);
+ if (empty($reason)) {
+ $reason = $page;
+ $page = gettext("Unknown Page");
+ }
+
+ echo sprintf("%02d", $number) . ". {$date}\tv{$backup_info['version']}\t{$page}\n";
+ if ($reason) {
+ echo " {$reason}\n";
+ }
+}
+
+function list_backups($which="all", $return=false) {
+ global $confvers;
+
+ if (count($confvers) == 0) {
+ echo gettext("No backups found in the configuration history.");
+ return;
+ }
+
+ for ($c = count($confvers)-1; $c >= 0; $c--) {
+ if (is_numeric($which) && ($c != $which)) {
+ continue;
+ }
+ print_backup_info($confvers[$c], $c+1);
+ echo "\n";
+ }
+}
+
+function choose_backup() {
+ global $fp, $confvers;
+ if (count($confvers) == 0) {
+ echo gettext("No backups found in the configuration history.");
+ return -1;
+ }
+ echo gettext("Which configuration would you like to restore?") . "\n";
+ echo " 1-" . count($confvers) . " : ";
+ $number = strtoupper(chop(fgets($fp)));
+ if (is_numeric($number) && ($number > 0) && ($number <= count($confvers))) {
+ return $number;
+ } else {
+ echo gettext("That is not a valid backup number.\n");
+ return -1;
+ }
+}
+
+function restore_history_backup($number) {
+ global $g, $fp, $confvers;
+ if (is_numeric($number) && ($number > 0) && ($number <= count($confvers))) {
+ $realnumber = $number - 1;
+ echo "\n" . gettext("Is this the backup you wish to restore?") . "\n";
+ list_backups($realnumber);
+ $thisbackup = $confvers[$realnumber];
+ echo gettext("Y/N?") . " : ";
+ $confirm = strtoupper(chop(fgets($fp)));
+ if ($confirm == gettext("Y")) {
+ conf_mount_rw();
+ if (config_restore($g['conf_path'] . '/backup/config-' . $thisbackup['time'] . '.xml') == 0) {
+ echo "\n";
+ echo sprintf(gettext('Successfully reverted to timestamp %1$s with description "%2$s".'), date(gettext("n/j/y H:i:s"), $thisbackup['time']), $thisbackup['description']);
+ echo "\n" . gettext("You may need to reboot the firewall or restart services before the restored configuration is fully active.") . "\n\n";
+ } else {
+ echo gettext("Unable to revert to the selected configuration.") . "\n";
+ }
+ conf_mount_ro();
+ } else {
+ echo gettext("Restore cancelled.") . "\n";
+ }
+ } else {
+ echo gettext("Restore cancelled due to invalid input.") . "\n";
+ }
+}
+
+while (true) {
+
+ echo "\n";
+ echo gettext("Restore Backup from Configuration History") . "\n\n";
+ echo "1) " . gettext("List Backups") . "\n";
+ echo "2) " . gettext("Restore Backup") . "\n";
+ echo "Q) " . gettext("Quit") . "\n";
+ echo "\n\n";
+ echo gettext("Please select an option to continue") . ": ";
+
+ $command = strtolower(chop(fgets($fp)));
+
+ // Make sure we can detect a foreign language "quit" command.
+ if (strtolower($command) == gettext("quit")) {
+ $command = "quit";
+ }
+
+ switch ($command) {
+ case "q":
+ case "quit":
+ echo "\n";
+ fclose($fp);
+ die;
+ break;
+ case "1":
+ list_backups();
+ break;
+ case "2":
+ $number = choose_backup();
+ restore_history_backup($number);
+ fclose($fp);
+ die;
+ break;
+ }
+}
+
+fclose($fp);
+die;
+?>
diff --git a/src/etc/rc.restore_full_backup b/src/etc/rc.restore_full_backup
new file mode 100755
index 0000000..dc44c19
--- /dev/null
+++ b/src/etc/rc.restore_full_backup
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+echo -n "Checking..."
+if [ `tar tzPf $1 /etc/rc 2>/dev/null` ]; then
+ echo " Backup file looks OK."
+ echo "One moment, restoring ${1}..."
+ if [ -f /tmp/do_not_restore_config.xml ]; then
+ EXCLUDE="--exclude /cf/conf/config.xml"
+ rm /tmp/do_not_restore_config.xml
+ else
+ EXCLUDE=""
+ fi
+ tar xzPfU $1 $EXCLUDE -C / 2>/var/etc/restore_log.txt
+ echo "Restore of $1 complete. Rebooting"
+ /sbin/reboot
+else
+ echo " Error."
+ echo "File not found or invalid backup file. Available backups:"
+ ls -lah /root | grep backup | more
+fi
diff --git a/src/etc/rc.savecore b/src/etc/rc.savecore
new file mode 100755
index 0000000..1612a40
--- /dev/null
+++ b/src/etc/rc.savecore
@@ -0,0 +1,22 @@
+#!/bin/sh
+# Based on:
+# FreeBSD: src/etc/rc.d/savecore,v 1.16.2.2.4.1 2010/06/14 02:09:06 kensmith Exp
+
+dumpdev=`/bin/realpath /dev/dumpdev`
+dumpdir='/var/crash'
+
+if [ ! -c "${dumpdev}" ]; then
+ echo "Dump device does not exist. Savecore not run."
+ exit
+fi
+
+if [ ! -d "${dumpdir}" ]; then
+ echo "Dump directory does not exist. Savecore not run."
+ exit
+fi
+
+if savecore -C "${dumpdev}" >/dev/null; then
+ savecore ${dumpdir} ${dumpdev}
+else
+ echo 'No core dumps found.'
+fi
diff --git a/src/etc/rc.savevoucher b/src/etc/rc.savevoucher
new file mode 100755
index 0000000..22e592d
--- /dev/null
+++ b/src/etc/rc.savevoucher
@@ -0,0 +1,40 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2007 Marcel Wiget <mwiget@mac.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ /* parse the configuration and include all functions used below */
+ require_once("config.inc");
+ require_once("functions.inc");
+ require_once("filter.inc");
+ require_once("shaper.inc");
+ require_once("captiveportal.inc");
+ require_once("voucher.inc");
+
+ voucher_save_db_to_config();
+?>
diff --git a/src/etc/rc.shutdown b/src/etc/rc.shutdown
new file mode 100755
index 0000000..aa6468a
--- /dev/null
+++ b/src/etc/rc.shutdown
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+if ! /usr/bin/lockf -s -t 30 /tmp/config.lock /usr/bin/true; then
+ echo "Cannot shutdown at this moment, a config write operation is in progress and 30 seconds have passed."
+ exit -1
+fi
+
+product=`cat /etc/inc/globals.inc | grep product_name | cut -d'"' -f4`
+
+echo
+echo "${product} is now shutting down ..."
+echo
+
+stty status '^T'
+
+# Set shell to ignore SIGINT (2), but not children;
+trap : 2
+
+HOME=/; export HOME
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+export PATH
+
+# If PLATFORM is pfSense then remove
+# temporary files on shutdown from /tmp/
+PLATFORM=`cat /etc/platform`
+if [ "$PLATFORM" = "pfSense" ]; then
+ find -x /tmp/* -type f -exec rm -f {} \; >/dev/null 2>&1
+fi
+
+USE_MFS_TMPVAR=`/usr/bin/grep -c use_mfs_tmpvar /cf/conf/config.xml`
+DISK_NAME=`/bin/df /var/db/rrd | /usr/bin/tail -1 | /usr/bin/awk '{print $1;}'`
+DISK_TYPE=`/usr/bin/basename ${DISK_NAME} | /usr/bin/cut -c1-2`
+# If we are not on a full install, or if the full install wants RAM disks, or if the full install _was_ using RAM disks, but isn't for the next boot...
+if [ "${PLATFORM}" != "pfSense" ] || [ ${USE_MFS_TMPVAR} -gt 0 ] || [ "${DISK_TYPE}" = "md" ]; then
+ /etc/rc.backup_rrd.sh
+ /etc/rc.backup_dhcpleases.sh
+fi
diff --git a/src/etc/rc.start_packages b/src/etc/rc.start_packages
new file mode 100755
index 0000000..3d8bbbc
--- /dev/null
+++ b/src/etc/rc.start_packages
@@ -0,0 +1,88 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.start_packages
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("config.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("captiveportal.inc");
+require_once("pkg-utils.inc");
+require_once("pfsense-utils.inc");
+require_once("service-utils.inc");
+
+if (file_exists("{$g['tmp_path']}/.rc.start_packages.running")) {
+ $stat = stat("{$g['tmp_path']}/.rc.start_packages.running");
+ if (time() - $stat['mtime'] >= 90) {
+ @unlink("{$g['tmp_path']}/.rc.start_packages.running");
+ } else {
+ log_error("Skipping STARTing packages process because previous/another instance is already running");
+ return;
+ }
+}
+
+@file_put_contents("{$g['tmp_path']}/.rc.start_packages.running", "");
+
+log_error("Restarting/Starting all packages.");
+
+$rcfiles = glob(RCFILEPREFIX . "*.sh");
+if (!$rcfiles) {
+ $rcfiles = array();
+} else {
+ $rcfiles = array_flip($rcfiles);
+ if (!$rcfiles) {
+ $rcfiles = array();
+ }
+}
+
+if (is_array($config['installedpackages']['package'])) {
+ foreach ($config['installedpackages']['package'] as $pkgid => $package) {
+ echo " Starting package {$package['name']}...";
+ sync_package($package['name']);
+ $internal_name = get_package_internal_name($package);
+ start_service($internal_name);
+ unset($rcfiles[RCFILEPREFIX . strtolower($internal_name) . ".sh"]);
+ echo "done.\n";
+ }
+}
+
+$shell = @popen("/bin/sh", "w");
+if ($shell) {
+ foreach ($rcfiles as $rcfile => $number) {
+ echo " Starting {$rcfile}...";
+ fwrite($shell, "{$rcfile} start >>/tmp/bootup_messages 2>&1 &");
+ echo "done.\n";
+ }
+
+ pclose($shell);
+}
+
+@unlink("{$g['tmp_path']}/.rc.start_packages.running");
+?>
diff --git a/src/etc/rc.stop_packages b/src/etc/rc.stop_packages
new file mode 100755
index 0000000..995248a
--- /dev/null
+++ b/src/etc/rc.stop_packages
@@ -0,0 +1,5 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+require_once("pkg-utils.inc");
+stop_packages();
+?>
diff --git a/src/etc/rc.update_alias_url_data b/src/etc/rc.update_alias_url_data
new file mode 100755
index 0000000..fd56b43
--- /dev/null
+++ b/src/etc/rc.update_alias_url_data
@@ -0,0 +1,43 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/* $Id$ */
+/*
+ rc.update_alias_url_data
+ part of pfSense (https://www.pfsense.org)
+
+ Copyright (C) 2010 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* parse the configuration and include all functions used below */
+/* config.inc retrieves the util.inc and globals.inc */
+
+require_once("config.inc");
+require_once("functions.inc");
+
+if (update_alias_url_data()) {
+ write_config();
+ send_event("filter reload");
+}
+?>
diff --git a/src/etc/rc.update_bogons.sh b/src/etc/rc.update_bogons.sh
new file mode 100755
index 0000000..85cb7df
--- /dev/null
+++ b/src/etc/rc.update_bogons.sh
@@ -0,0 +1,152 @@
+#!/bin/sh
+
+# Update bogons file
+# Part of the pfSense project
+# https://www.pfsense.org
+
+# Global variables
+proc_error=""
+
+# Download and extract if necessary
+process_url() {
+ local file=$1
+ local url=$2
+ local filename=${url##*/}
+ local ext=${filename#*.}
+
+ /usr/bin/fetch -a -w 600 -T 30 -q -o $file "${url}"
+
+ if [ ! -f $file ]; then
+ echo "Could not download ${url}" | logger
+ proc_error="true"
+ fi
+
+ case "$ext" in
+ tar)
+ mv $file $file.tmp
+ /usr/bin/tar -xf $file.tmp -O > $file 2> /dev/null
+ ;;
+ tar.gz)
+ mv $file $file.tmp
+ /usr/bin/tar -xzf $file.tmp -O > $file 2> /dev/null
+ ;;
+ tgz)
+ mv $file $file.tmp
+ /usr/bin/tar -xzf $file.tmp -O > $file 2> /dev/null
+ ;;
+ tar.bz2)
+ mv $file $file.tmp
+ /usr/bin/tar -xjf $file.tmp -O > $file 2> /dev/null
+ ;;
+ *)
+ ;;
+ esac
+
+ if [ -f $file.tmp ]; then
+ rm $file.tmp
+ fi
+
+ if [ ! -f $file ]; then
+ echo "Could not extract ${filename}" | logger
+ proc_error="true"
+ fi
+}
+
+echo "rc.update_bogons.sh is starting up." | logger
+
+# Sleep for some time, unless an argument is specified.
+if [ "$1" = "" ]; then
+ # Grab a random value
+ value=`od -A n -d -N2 /dev/random | awk '{ print $1 }'`
+ echo "rc.update_bogons.sh is sleeping for $value" | logger
+ sleep $value
+fi
+
+echo "rc.update_bogons.sh is beginning the update cycle." | logger
+
+# Load custom bogon configuration
+if [ -f /var/etc/bogon_custom ]; then
+ . /var/etc/bogon_custom
+fi
+
+# Set default values if not overriden
+v4url=${v4url:-"https://files.pfsense.org/lists/fullbogons-ipv4.txt"}
+v6url=${v6url:-"https://files.pfsense.org/lists/fullbogons-ipv6.txt"}
+v4urlcksum=${v4urlcksum:-"${v4url}.md5"}
+v6urlcksum=${v6urlcksum:-"${v6url}.md5"}
+
+process_url /tmp/bogons "${v4url}"
+process_url /tmp/bogonsv6 "${v6url}"
+
+if [ "$proc_error" != "" ]; then
+ # Relaunch and sleep
+ sh /etc/rc.update_bogons.sh &
+ exit
+fi
+
+BOGON_V4_CKSUM=`/usr/bin/fetch -T 30 -q -o - "${v4urlcksum}" | awk '{ print $4 }'`
+ON_DISK_V4_CKSUM=`md5 /tmp/bogons | awk '{ print $4 }'`
+BOGON_V6_CKSUM=`/usr/bin/fetch -T 30 -q -o - "${v6urlcksum}" | awk '{ print $4 }'`
+ON_DISK_V6_CKSUM=`md5 /tmp/bogonsv6 | awk '{ print $4 }'`
+
+if [ "$BOGON_V4_CKSUM" = "$ON_DISK_V4_CKSUM" ] || [ "$BOGON_V6_CKSUM" = "$ON_DISK_V6_CKSUM" ]; then
+ # At least one of the downloaded checksums matches, so mount RW
+ /etc/rc.conf_mount_rw
+
+ ENTRIES_MAX=`pfctl -s memory | awk '/table-entries/ { print $4 }'`
+
+ if [ "$BOGON_V4_CKSUM" = "$ON_DISK_V4_CKSUM" ]; then
+ ENTRIES_TOT=`pfctl -vvsTables | awk '/Addresses/ {s+=$2}; END {print s}'`
+ ENTRIES_V4=`pfctl -vvsTables | awk '/-\tbogons$/ {getline; print $2}'`
+ LINES_V4=`wc -l /tmp/bogons | awk '{ print $1 }'`
+ if [ $ENTRIES_MAX -gt $((2*ENTRIES_TOT-${ENTRIES_V4:-0}+LINES_V4)) ]; then
+ egrep -v "^192.168.0.0/16|^172.16.0.0/12|^10.0.0.0/8" /tmp/bogons > /etc/bogons
+ RESULT=`/sbin/pfctl -t bogons -T replace -f /etc/bogons 2>&1`
+ echo "$RESULT" | awk '{ print "Bogons V4 file downloaded: " $0 }' | logger
+ else
+ echo "Not updating IPv4 bogons (increase table-entries limit)" | logger
+ fi
+ rm /tmp/bogons
+ else
+ echo "Could not download ${v4url} (checksum mismatch)" | logger
+ checksum_error="true"
+ fi
+
+ if [ "$BOGON_V6_CKSUM" = "$ON_DISK_V6_CKSUM" ]; then
+ BOGONS_V6_TABLE_COUNT=`pfctl -sTables | grep ^bogonsv6$ | wc -l | awk '{ print $1 }'`
+ ENTRIES_TOT=`pfctl -vvsTables | awk '/Addresses/ {s+=$2}; END {print s}'`
+ LINES_V6=`wc -l /tmp/bogonsv6 | awk '{ print $1 }'`
+ if [ $BOGONS_V6_TABLE_COUNT -gt 0 ]; then
+ ENTRIES_V6=`pfctl -vvsTables | awk '/-\tbogonsv6$/ {getline; print $2}'`
+ if [ $ENTRIES_MAX -gt $((2*ENTRIES_TOT-${ENTRIES_V6:-0}+LINES_V6)) ]; then
+ egrep -iv "^fc00::/7" /tmp/bogonsv6 > /etc/bogonsv6
+ RESULT=`/sbin/pfctl -t bogonsv6 -T replace -f /etc/bogonsv6 2>&1`
+ echo "$RESULT" | awk '{ print "Bogons V6 file downloaded: " $0 }' | logger
+ else
+ echo "Not saving or updating IPv6 bogons (increase table-entries limit)" | logger
+ fi
+ else
+ if [ $ENTRIES_MAX -gt $((2*ENTRIES_TOT+LINES_V6)) ]; then
+ egrep -iv "^fc00::/7" /tmp/bogonsv6 > /etc/bogonsv6
+ echo "Bogons V6 file downloaded but not updating IPv6 bogons table because IPv6 Allow is off" | logger
+ else
+ echo "Not saving IPv6 bogons table (IPv6 Allow is off and table-entries limit is potentially too low)" | logger
+ fi
+ fi
+ rm /tmp/bogonsv6
+ else
+ echo "Could not download ${v6url} (checksum mismatch)" | logger
+ checksum_error="true"
+ fi
+
+ # We mounted RW, so switch back to RO
+ /etc/rc.conf_mount_ro
+fi
+
+if [ "$checksum_error" != "" ]; then
+ # Relaunch and sleep
+ sh /etc/rc.update_bogons.sh &
+ exit
+fi
+
+echo "rc.update_bogons.sh is ending the update cycle." | logger
diff --git a/src/etc/rc.update_urltables b/src/etc/rc.update_urltables
new file mode 100755
index 0000000..c4dfeb1
--- /dev/null
+++ b/src/etc/rc.update_urltables
@@ -0,0 +1,60 @@
+#!/usr/local/bin/php-cgi -q
+<?php
+require_once("config.inc");
+require_once("util.inc");
+require_once("pfsense-utils.inc");
+
+if (!is_array($config['aliases']['alias'])) {
+ // No aliases
+ return;
+}
+
+// Gather list of urltable aliases
+$todo = array();
+foreach ($config['aliases']['alias'] as $alias) {
+ if (preg_match('/urltable/i', $alias['type'])) {
+ $tmp = array();
+ $tmp['type'] = $alias['type'];
+ $tmp['name'] = $alias['name'];
+ $tmp['url'] = $alias['url'];
+ $tmp['freq'] = $alias['updatefreq'];
+ $todo[] = $tmp;
+ }
+}
+
+if (count($todo) > 0) {
+ log_error("{$argv[0]}: Starting up.");
+
+ if ($argv[1] != "now") {
+ // Wait a little before updating.
+ $wait = mt_rand(5, 60);
+ log_error("{$argv[0]}: Sleeping for {$wait} seconds.");
+ sleep($wait);
+ }
+
+ log_error("{$argv[0]}: Starting URL table alias updates");
+
+ $filter_reload = false;
+ foreach ($todo as $t) {
+ $r = process_alias_urltable($t['name'], $t['url'], $t['freq']);
+ if ($r == 1) {
+ $result = "";
+ // TODO: Change it when pf supports tables with ports
+ if ($t['type'] == "urltable") {
+ exec("/sbin/pfctl -t " . escapeshellarg($t['name']) . " -T replace -f /var/db/aliastables/" . escapeshellarg($t['name']) . ".txt 2>&1", $result);
+ } else {
+ $filter_reload = true;
+ }
+ log_error("{$argv[0]}: Updated {$t['name']} content from {$t['url']}: {$result[0]}");
+ } elseif ($r == -1) {
+ log_error("{$argv[0]}: {$t['name']} does not need updating.");
+ } else {
+ log_error("{$argv[0]}: ERROR: could not update {$t['name']} content from {$t['url']}");
+ }
+ }
+
+ if ($filter_reload) {
+ send_event("filter reload");
+ }
+}
+?>
diff --git a/src/etc/services b/src/etc/services
new file mode 100644
index 0000000..1f85da0
--- /dev/null
+++ b/src/etc/services
@@ -0,0 +1,4111 @@
+#
+# Network services, Internet style
+#
+# Note that it is presently the policy of IANA to assign a single well-known
+# port number for both TCP and UDP; hence, most entries here have two entries
+# even if the protocol doesn't support UDP operations.
+#
+# The latest IANA port assignments can be gotten from
+#
+# http://www.iana.org/assignments/port-numbers
+#
+# The Well Known Ports are those from 0 through 1023.
+# The Registered Ports are those from 1024 through 49151
+# The Dynamic and/or Private Ports are those from 49152 through 65535
+#
+# Kerberos services are for Kerberos v4, and are unofficial. Sites running
+# v5 should uncomment v5 entries and comment v4 entries.
+#
+# $FreeBSD: src/etc/services,v 1.62.2.12 2003/02/01 16:48:17 schweikh Exp $
+# From: @(#)services 5.8 (Berkeley) 5/9/91
+#
+# WELL KNOWN PORT NUMBERS
+#
+rtmp 1/ddp #Routing Table Maintenance Protocol
+tcpmux 1/tcp #TCP Port Service Multiplexer
+tcpmux 1/udp #TCP Port Service Multiplexer
+nbp 2/ddp #Name Binding Protocol
+compressnet 2/tcp #Management Utility
+compressnet 2/udp #Management Utility
+compressnet 3/tcp #Compression Process
+compressnet 3/udp #Compression Process
+echo 4/ddp #AppleTalk Echo Protocol
+rje 5/tcp #Remote Job Entry
+rje 5/udp #Remote Job Entry
+zip 6/ddp #Zone Information Protocol
+echo 7/tcp
+echo 7/udp
+discard 9/tcp sink null
+discard 9/udp sink null
+systat 11/tcp users #Active Users
+systat 11/udp users #Active Users
+daytime 13/tcp
+daytime 13/udp
+qotd 17/tcp quote #Quote of the Day
+qotd 17/udp quote #Quote of the Day
+msp 18/tcp #Message Send Protocol
+msp 18/udp #Message Send Protocol
+chargen 19/tcp ttytst source #Character Generator
+chargen 19/udp ttytst source #Character Generator
+ftp-data 20/tcp #File Transfer [Default Data]
+ftp-data 20/udp #File Transfer [Default Data]
+ftp 21/tcp #File Transfer [Control]
+ftp 21/udp #File Transfer [Control]
+ssh 22/tcp #Secure Shell Login
+ssh 22/udp #Secure Shell Login
+telnet 23/tcp
+telnet 23/udp
+# 24/tcp any private mail system
+# 24/udp any private mail system
+smtp 25/tcp mail #Simple Mail Transfer
+smtp 25/udp mail #Simple Mail Transfer
+nsw-fe 27/tcp #NSW User System FE
+nsw-fe 27/udp #NSW User System FE
+msg-icp 29/tcp #MSG ICP
+msg-icp 29/udp #MSG ICP
+msg-auth 31/tcp #MSG Authentication
+msg-auth 31/udp #MSG Authentication
+dsp 33/tcp #Display Support Protocol
+dsp 33/udp #Display Support Protocol
+# 35/tcp any private printer server
+# 35/udp any private printer server
+time 37/tcp timserver
+time 37/udp timserver
+rap 38/tcp #Route Access Protocol
+rap 38/udp #Route Access Protocol
+rlp 39/tcp resource #Resource Location Protocol
+rlp 39/udp resource #Resource Location Protocol
+graphics 41/tcp
+graphics 41/udp
+nameserver 42/tcp name #Host Name Server
+nameserver 42/udp name #Host Name Server
+nicname 43/tcp whois
+nicname 43/udp whois
+mpm-flags 44/tcp #MPM FLAGS Protocol
+mpm-flags 44/udp #MPM FLAGS Protocol
+mpm 45/tcp #Message Processing Module [recv]
+mpm 45/udp #Message Processing Module [recv]
+mpm-snd 46/tcp #MPM [default send]
+mpm-snd 46/udp #MPM [default send]
+ni-ftp 47/tcp #NI FTP
+ni-ftp 47/udp #NI FTP
+auditd 48/tcp #Digital Audit Daemon
+auditd 48/udp #Digital Audit Daemon
+tacacs 49/tcp #Login Host Protocol (TACACS)
+tacacs 49/udp #Login Host Protocol (TACACS)
+re-mail-ck 50/tcp #Remote Mail Checking Protocol
+re-mail-ck 50/udp #Remote Mail Checking Protocol
+la-maint 51/tcp #IMP Logical Address Maintenance
+la-maint 51/udp #IMP Logical Address Maintenance
+xns-time 52/tcp #XNS Time Protocol
+xns-time 52/udp #XNS Time Protocol
+domain 53/tcp #Domain Name Server
+domain 53/udp #Domain Name Server
+xns-ch 54/tcp #XNS Clearinghouse
+xns-ch 54/udp #XNS Clearinghouse
+isi-gl 55/tcp #ISI Graphics Language
+isi-gl 55/udp #ISI Graphics Language
+xns-auth 56/tcp #XNS Authentication
+xns-auth 56/udp #XNS Authentication
+mtp 57/tcp # deprecated
+#PROBLEMS!==============================================================
+# 57/tcp any private terminal access
+#PROBLEMS!==============================================================
+# 57/udp any private terminal access
+xns-mail 58/tcp #XNS Mail
+xns-mail 58/udp #XNS Mail
+# 59/tcp any private file service
+# 59/udp any private file service
+ni-mail 61/tcp #NI MAIL
+ni-mail 61/udp #NI MAIL
+acas 62/tcp #ACA Services
+acas 62/udp #ACA Services
+whois++ 63/tcp
+whois++ 63/udp
+covia 64/tcp #Communications Integrator (CI)
+covia 64/udp #Communications Integrator (CI)
+tacacs-ds 65/tcp #TACACS-Database Service
+tacacs-ds 65/udp #TACACS-Database Service
+sql*net 66/tcp #Oracle SQL*NET
+sql*net 66/udp #Oracle SQL*NET
+bootps 67/tcp dhcps #Bootstrap Protocol Server
+bootps 67/udp dhcps #Bootstrap Protocol Server
+bootpc 68/tcp dhcpc #Bootstrap Protocol Client
+bootpc 68/udp dhcpc #Bootstrap Protocol Client
+tftp 69/tcp #Trivial File Transfer
+tftp 69/udp #Trivial File Transfer
+tftp-proxy 6969/udp
+gopher 70/tcp
+gopher 70/udp
+netrjs-1 71/tcp #Remote Job Service
+netrjs-1 71/udp #Remote Job Service
+netrjs-2 72/tcp #Remote Job Service
+netrjs-2 72/udp #Remote Job Service
+netrjs-3 73/tcp #Remote Job Service
+netrjs-3 73/udp #Remote Job Service
+netrjs-4 74/tcp #Remote Job Service
+netrjs-4 74/udp #Remote Job Service
+# 75/tcp any private dial out service
+# 75/udp any private dial out service
+deos 76/tcp #Distributed External Object Store
+deos 76/udp #Distributed External Object Store
+netrjs 77/tcp
+#PROBLEMS!==============================================================
+# 77/tcp any private RJE service
+#PROBLEMS!==============================================================
+# 77/udp any private RJE service
+vettcp 78/tcp
+vettcp 78/udp
+finger 79/tcp
+finger 79/udp
+http 80/tcp www www-http #World Wide Web HTTP
+http 80/udp www www-http #World Wide Web HTTP
+hosts2-ns 81/tcp #HOSTS2 Name Server
+hosts2-ns 81/udp #HOSTS2 Name Server
+xfer 82/tcp #XFER Utility
+xfer 82/udp #XFER Utility
+mit-ml-dev 83/tcp #MIT ML Device
+mit-ml-dev 83/udp #MIT ML Device
+ctf 84/tcp #Common Trace Facility
+ctf 84/udp #Common Trace Facility
+mit-ml-dev 85/tcp #MIT ML Device
+mit-ml-dev 85/udp #MIT ML Device
+mfcobol 86/tcp #Micro Focus Cobol
+mfcobol 86/udp #Micro Focus Cobol
+ttylink 87/tcp
+#PROBLEMS!===========================================================
+# 87/tcp any private terminal link
+#PROBLEMS!===========================================================
+# 87/udp any private terminal link
+kerberos-sec 88/tcp kerberos # krb5 # Kerberos (v5)
+kerberos-sec 88/udp kerberos # krb5 # Kerberos (v5)
+su-mit-tg 89/tcp #SU/MIT Telnet Gateway
+su-mit-tg 89/udp #SU/MIT Telnet Gateway
+dnsix 90/tcp #DNSIX Securit Attribute Token Map
+dnsix 90/udp #DNSIX Securit Attribute Token Map
+mit-dov 91/tcp #MIT Dover Spooler
+mit-dov 91/udp #MIT Dover Spooler
+npp 92/tcp #Network Printing Protocol
+npp 92/udp #Network Printing Protocol
+dcp 93/tcp #Device Control Protocol
+dcp 93/udp #Device Control Protocol
+objcall 94/tcp #Tivoli Object Dispatcher
+objcall 94/udp #Tivoli Object Dispatcher
+supdup 95/tcp
+supdup 95/udp
+dixie 96/tcp #DIXIE Protocol Specification
+dixie 96/udp #DIXIE Protocol Specification
+swift-rvf 97/tcp #Swift Remote Virtural File Protocol
+swift-rvf 97/udp #Swift Remote Virtural File Protocol
+tacnews 98/tcp #TAC News, Unofficial: Red Hat linuxconf
+tacnews 98/udp #TAC News, Unofficial: Red Hat linuxconf
+metagram 99/tcp #Metagram Relay
+metagram 99/udp #Metagram Relay
+newacct 100/tcp #[unauthorized use]
+hostname 101/tcp hostnames #NIC Host Name Server
+hostname 101/udp hostnames #NIC Host Name Server
+iso-tsap 102/tcp tsap #ISO-TSAP Class 0
+iso-tsap 102/udp tsap #ISO-TSAP Class 0
+gppitnp 103/tcp #Genesis Point-to-Point Trans Net
+gppitnp 103/udp #Genesis Point-to-Point Trans Net
+acr-nema 104/tcp #ACR-NEMA Digital Imag. & Comm. 300
+acr-nema 104/udp #ACR-NEMA Digital Imag. & Comm. 300
+csnet-ns 105/tcp cso-ns cso #Mailbox Name Nameserver
+csnet-ns 105/udp cso-ns cso #Mailbox Name Nameserver
+pop3pw 106/tcp 3com-tsmux #Eudora compatible PW changer
+3com-tsmux 106/udp
+rtelnet 107/tcp #Remote Telnet Service
+rtelnet 107/udp #Remote Telnet Service
+snagas 108/tcp #SNA Gateway Access Server
+snagas 108/udp #SNA Gateway Access Server
+pop2 109/tcp postoffice #Post Office Protocol - Version 2
+pop2 109/udp postoffice #Post Office Protocol - Version 2
+pop3 110/tcp #Post Office Protocol - Version 3
+pop3 110/udp #Post Office Protocol - Version 3
+sunrpc 111/tcp rpcbind #SUN Remote Procedure Call
+sunrpc 111/udp rpcbind #SUN Remote Procedure Call
+mcidas 112/tcp #McIDAS Data Transmission Protocol
+mcidas 112/udp #McIDAS Data Transmission Protocol
+auth 113/tcp ident tap #Authentication Service
+auth 113/udp ident tap #Authentication Service
+audionews 114/tcp #Audio News Multicast
+audionews 114/udp #Audio News Multicast
+sftp 115/tcp #Simple File Transfer Protocol
+sftp 115/udp #Simple File Transfer Protocol
+ansanotify 116/tcp #ANSA REX Notify
+ansanotify 116/udp #ANSA REX Notify
+uucp-path 117/tcp #UUCP Path Service
+uucp-path 117/udp #UUCP Path Service
+sqlserv 118/tcp #SQL Services
+sqlserv 118/udp #SQL Services
+nntp 119/tcp usenet #Network News Transfer Protocol
+nntp 119/udp usenet #Network News Transfer Protocol
+cfdptkt 120/tcp
+cfdptkt 120/udp
+erpc 121/tcp #Encore Expedited Remote Pro.Call
+erpc 121/udp #Encore Expedited Remote Pro.Call
+smakynet 122/tcp
+smakynet 122/udp
+ntp 123/tcp #Network Time Protocol
+ntp 123/udp #Network Time Protocol
+ansatrader 124/tcp #ANSA REX Trader
+ansatrader 124/udp #ANSA REX Trader
+locus-map 125/tcp #Locus PC-Interface Net Map Ser
+locus-map 125/udp #Locus PC-Interface Net Map Ser
+unitary 126/tcp #Unisys Unitary Login
+unitary 126/udp #Unisys Unitary Login
+locus-con 127/tcp #Locus PC-Interface Conn Server
+locus-con 127/udp #Locus PC-Interface Conn Server
+gss-xlicen 128/tcp #GSS X License Verification
+gss-xlicen 128/udp #GSS X License Verification
+pwdgen 129/tcp #Password Generator Protocol
+pwdgen 129/udp #Password Generator Protocol
+cisco-fna 130/tcp #cisco FNATIVE
+cisco-fna 130/udp #cisco FNATIVE
+cisco-tna 131/tcp #cisco TNATIVE
+cisco-tna 131/udp #cisco TNATIVE
+cisco-sys 132/tcp #cisco SYSMAINT
+cisco-sys 132/udp #cisco SYSMAINT
+statsrv 133/tcp #Statistics Service
+statsrv 133/udp #Statistics Service
+ingres-net 134/tcp #INGRES-NET Service
+ingres-net 134/udp #INGRES-NET Service
+loc-srv 135/tcp epmap #Location Service
+loc-srv 135/udp epmap #Location Service
+profile 136/tcp #PROFILE Naming System
+profile 136/udp #PROFILE Naming System
+netbios-ns 137/tcp #NETBIOS Name Service
+netbios-ns 137/udp #NETBIOS Name Service
+netbios-dgm 138/tcp #NETBIOS Datagram Service
+netbios-dgm 138/udp #NETBIOS Datagram Service
+netbios-ssn 139/tcp #NETBIOS Session Service
+netbios-ssn 139/udp #NETBIOS Session Service
+emfis-data 140/tcp #EMFIS Data Service
+emfis-data 140/udp #EMFIS Data Service
+emfis-cntl 141/tcp #EMFIS Control Service
+emfis-cntl 141/udp #EMFIS Control Service
+bl-idm 142/tcp #Britton-Lee IDM
+bl-idm 142/udp #Britton-Lee IDM
+imap 143/tcp imap2 imap4 #Interim Mail Access Protocol v2
+imap 143/udp imap2 imap4 #Interim Mail Access Protocol v2
+NeWS 144/tcp # Window System
+NeWS 144/udp # Window System
+#PROBLEMS!==============================================================
+#uma 144/tcp #Universal Management Architecture
+#uma 144/udp #Universal Management Architecture
+#PROBLEMS!==============================================================
+uaac 145/tcp #UAAC Protocol
+uaac 145/udp #UAAC Protocol
+iso-tp0 146/tcp
+iso-tp0 146/udp
+iso-ip 147/tcp
+iso-ip 147/udp
+cronus 148/tcp jargon #CRONUS-SUPPORT
+cronus 148/udp jargon #CRONUS-SUPPORT
+aed-512 149/tcp #AED 512 Emulation Service
+aed-512 149/udp #AED 512 Emulation Service
+sql-net 150/tcp
+sql-net 150/udp
+hems 151/tcp
+hems 151/udp
+bftp 152/tcp #Background File Transfer Program
+bftp 152/udp #Background File Transfer Program
+sgmp 153/tcp
+sgmp 153/udp
+netsc-prod 154/tcp
+netsc-prod 154/udp
+netsc-dev 155/tcp
+netsc-dev 155/udp
+sqlsrv 156/tcp #SQL Service
+sqlsrv 156/udp #SQL Service
+knet-cmp 157/tcp #KNET/VM Command/Message Protocol
+knet-cmp 157/udp #KNET/VM Command/Message Protocol
+pcmail-srv 158/tcp #PCMail Server
+pcmail-srv 158/udp #PCMail Server
+nss-routing 159/tcp
+nss-routing 159/udp
+sgmp-traps 160/tcp
+sgmp-traps 160/udp
+snmp 161/tcp
+snmp 161/udp
+snmptrap 162/tcp snmp-trap
+snmptrap 162/udp snmp-trap
+cmip-man 163/tcp #CMIP/TCP Manager
+cmip-man 163/udp #CMIP/TCP Manager
+cmip-agent 164/tcp #CMIP/TCP Agent
+smip-agent 164/udp #CMIP/TCP Agent
+xns-courier 165/tcp #Xerox
+xns-courier 165/udp #Xerox
+s-net 166/tcp #Sirius Systems
+s-net 166/udp #Sirius Systems
+namp 167/tcp
+namp 167/udp
+rsvd 168/tcp
+rsvd 168/udp
+send 169/tcp
+send 169/udp
+print-srv 170/tcp #Network PostScript
+print-srv 170/udp #Network PostScript
+multiplex 171/tcp #Network Innovations Multiplex
+multiplex 171/udp #Network Innovations Multiplex
+cl/1 172/tcp #Network Innovations CL/1
+cl/1 172/udp #Network Innovations CL/1
+xyplex-mux 173/tcp
+xyplex-mux 173/udp
+mailq 174/tcp
+mailq 174/udp
+vmnet 175/tcp
+vmnet 175/udp
+genrad-mux 176/tcp
+genrad-mux 176/udp
+xdmcp 177/tcp #X Display Manager Control Protocol
+xdmcp 177/udp #X Display Manager Control Protocol
+NextStep 178/tcp nextstep NeXTStep #NextStep Window Server
+NextStep 178/udp nextstep NeXTStep #NextStep Window Server
+bgp 179/tcp #Border Gateway Protocol
+bgp 179/udp #Border Gateway Protocol
+ris 180/tcp #Intergraph
+ris 180/udp #Intergraph
+unify 181/tcp
+unify 181/udp
+audit 182/tcp #Unisys Audit SITP
+audit 182/udp #Unisys Audit SITP
+ocbinder 183/tcp
+ocbinder 183/udp
+ocserver 184/tcp
+ocserver 184/udp
+remote-kis 185/tcp
+remote-kis 185/udp
+kis 186/tcp #KIS Protocol
+kis 186/udp #KIS Protocol
+aci 187/tcp #Application Communication Interface
+aci 187/udp #Application Communication Interface
+mumps 188/tcp #Plus Five's MUMPS
+mumps 188/udp #Plus Five's MUMPS
+qft 189/tcp #Queued File Transport
+qft 189/udp #Queued File Transport
+gacp 190/tcp #Gateway Access Control Protocol
+gacp 190/udp cacp #Gateway Access Control Protocol
+prospero 191/tcp #Prospero Directory Service
+prospero 191/udp #Prospero Directory Service
+osu-nms 192/tcp #OSU Network Monitoring System
+osu-nms 192/udp #OSU Network Monitoring System
+srmp 193/tcp #Spider Remote Monitoring Protocol
+srmp 193/udp #Spider Remote Monitoring Protocol
+irc 194/tcp #Internet Relay Chat Protocol
+irc 194/udp #Internet Relay Chat Protocol
+dn6-nlm-aud 195/tcp #DNSIX Network Level Module Audit
+dn6-nlm-aud 195/udp #DNSIX Network Level Module Audit
+dn6-smm-red 196/tcp #DNSIX Session Mgt Module Audit Redir
+dn6-smm-red 196/udp #DNSIX Session Mgt Module Audit Redir
+dls 197/tcp #Directory Location Service
+dls 197/udp #Directory Location Service
+dls-mon 198/tcp #Directory Location Service Monitor
+dls-mon 198/udp #Directory Location Service Monitor
+smux 199/tcp
+smux 199/udp
+src 200/tcp #IBM System Resource Controller
+src 200/udp #IBM System Resource Controller
+at-rtmp 201/tcp #AppleTalk Routing Maintenance
+at-rtmp 201/udp #AppleTalk Routing Maintenance
+at-nbp 202/tcp #AppleTalk Name Binding
+at-nbp 202/udp #AppleTalk Name Binding
+at-3 203/tcp #AppleTalk Unused
+at-3 203/udp #AppleTalk Unused
+at-echo 204/tcp #AppleTalk Echo
+at-echo 204/udp #AppleTalk Echo
+at-5 205/tcp #AppleTalk Unused
+at-5 205/udp #AppleTalk Unused
+at-zis 206/tcp #AppleTalk Zone Information
+at-zis 206/udp #AppleTalk Zone Information
+at-7 207/tcp #AppleTalk Unused
+at-7 207/udp #AppleTalk Unused
+at-8 208/tcp #AppleTalk Unused
+at-8 208/udp #AppleTalk Unused
+qmtp 209/tcp #The Quick Mail Transfer Protocol
+qmtp 209/udp #The Quick Mail Transfer Protocol
+#PROBLEMS!==============================================================
+#tam 209/tcp #Trivial Authenticated Mail Protocol
+#tam 209/udp #Trivial Authenticated Mail Protocol
+#PROBLEMS!==============================================================
+z39.50 210/tcp wais #ANSI Z39.50
+z39.50 210/udp wais #ANSI Z39.50
+914c/g 211/tcp #Texas Instruments 914C/G Terminal
+914c/g 211/udp #Texas Instruments 914C/G Terminal
+anet 212/tcp #ATEXSSTR
+anet 212/udp #ATEXSSTR
+ipx 213/tcp
+ipx 213/udp
+vmpwscs 214/tcp
+vmpwscs 214/udp
+softpc 215/tcp #Insignia Solutions
+softpc 215/udp #Insignia Solutions
+CAIlic 216/tcp atls #Computer Associates Int'l License Server
+CAIlic 216/udp atls #Computer Associates Int'l License Server
+dbase 217/tcp #dBASE Unix
+dbase 217/udp #dBASE Unix
+mpp 218/tcp #Netix Message Posting Protocol
+mpp 218/udp #Netix Message Posting Protocol
+uarps 219/tcp #Unisys ARPs
+uarps 219/udp #Unisys ARPs
+#imap3@220 was never used and never should have been allocated. See PR 46294.
+#imap3 220/tcp #Interactive Mail Access Protocol v3
+#imap3 220/udp #Interactive Mail Access Protocol v3
+fln-spx 221/tcp #Berkeley rlogind with SPX auth
+fln-spx 221/udp #Berkeley rlogind with SPX auth
+rsh-spx 222/tcp #Berkeley rshd with SPX auth
+rsh-spx 222/udp #Berkeley rshd with SPX auth
+cdc 223/tcp #Certificate Distribution Center
+cdc 223/udp #Certificate Distribution Center
+direct 242/tcp
+direct 242/udp
+sur-meas 243/tcp #Survey Measurement
+sur-meas 243/udp #Survey Measurement
+dayna 244/tcp
+dayna 244/udp
+link 245/tcp
+link 245/udp
+dsp3270 246/tcp #Display Systems Protocol
+dsp3270 246/udp #Display Systems Protocol
+subntbcst_tftp 247/tcp #subntbcst_tftp
+subntbcst_tftp 247/udp #subntbcst_tftp
+bhfhs 248/tcp
+bhfhs 248/udp
+# 249-255 reserved
+rap 256/tcp
+rap 256/udp
+set 257/tcp #secure electronic transaction
+set 257/udp #secure electronic transaction
+yak-chat 258/tcp #yak winsock personal chat
+yak-chat 258/udp #yak winsock personal chat
+esro-gen 259/tcp #efficient short remote operations
+esro-gen 259/udp #efficient short remote operations
+openport 260/tcp
+openport 260/udp
+nsiiops 261/tcp #iiop name service over tls/ssl
+nsiiops 261/udp #iiop name service over tls/ssl
+arcisdms 262/tcp
+arcisdms 262/udp
+hdap 263/tcp
+hdap 263/udp
+bgmp 264/tcp
+bgmp 264/udp
+# 265-279 unassigned
+http-mgmt 280/tcp
+http-mgmt 280/udp
+personal-link 281/tcp
+personal-link 281/udp
+cableport-ax 282/tcp #cable port a/x
+cableport-ax 282/udp #cable port a/x
+# 283-307 unassigned
+novastorbakcup 308/tcp #novastor backup
+novastorbakcup 308/udp #novastor backup
+entrusttime 309/tcp
+entrusttime 309/udp
+bhmds 310/tcp
+bhmds 310/udp
+asip-webadmin 311/tcp #appleshare ip webadmin
+asip-webadmin 311/udp #appleshare ip webadmin
+vslmp 312/tcp
+vslmp 312/udp
+magenta-logic 313/tcp
+magenta-logic 313/udp
+opalis-robot 314/tcp
+opalis-robot 314/udp
+dpsi 315/tcp
+dpsi 315/udp
+decauth 316/tcp
+decauth 316/udp
+zannet 317/tcp
+zannet 317/udp
+# 318-320 #unassigned
+pip 321/tcp
+pip 321/udp
+# 322-343 #unassigned
+pdap 344/tcp #Prospero Data Access Protocol
+pdap 344/udp #Prospero Data Access Protocol
+pawserv 345/tcp #Perf Analysis Workbench
+pawserv 345/udp #Perf Analysis Workbench
+zserv 346/tcp #Zebra server
+zserv 346/udp #Zebra server
+fatserv 347/tcp #Fatmen Server
+fatserv 347/udp #Fatmen Server
+csi-sgwp 348/tcp #Cabletron Management Protocol
+csi-sgwp 348/udp #Cabletron Management Protocol
+mftp 349/tcp
+mftp 349/udp
+matip-type-a 350/tcp #MATIP Type A
+matip-type-a 350/udp
+matip-type-b 351/tcp #MATIP Type B
+matip-type-b 351/udp
+bhoetty 351/tcp #unassigned but widespread use
+bhoetty 351/udp #unassigned but widespread use
+dtag-ste-sb 352/tcp #DTAG
+dtag-ste-sb 352/udp #DTAG
+bhoedap4 352/tcp #unassigned but widespread use
+bhoedap4 352/udp #unassigned but widespread use
+ndsauth 353/tcp
+ndsauth 353/udp
+bh611 354/tcp
+bh611 354/udp
+datex-asn 355/tcp
+datex-asn 355/udp
+cloanto-net-1 356/tcp #Cloanto Net 1
+cloanto-net-1 356/udp
+bhevent 357/tcp
+bhevent 357/udp
+shrinkwrap 358/tcp
+shrinkwrap 358/udp
+tenebris_nts 359/tcp #Tenebris Network Trace Service
+tenebris_nts 359/udp #Tenebris Network Trace Service
+scoi2odialog 360/tcp
+scoi2odialog 360/udp
+semantix 361/tcp
+semantix 361/udp
+srssend 362/tcp #SRS Send
+srssend 362/udp #SRS Send
+rsvp_tunnel 363/tcp
+rsvp_tunnel 363/udp
+aurora-cmgr 364/tcp
+aurora-cmgr 364/udp
+dtk 365/tcp #Deception Tool Kit - Fred Cohen <fc@all.net>
+dtk 365/udp #Deception Tool Kit - Fred Cohen <fc@all.net>
+odmr 366/tcp
+odmr 366/udp
+mortgageware 367/tcp
+mortgageware 367/udp
+qbikgdp 368/tcp #QbikGDP
+qbikgdp 368/udp
+rpc2portmap 369/tcp
+rpc2portmap 369/udp
+codaauth2 370/tcp
+codaauth2 370/udp
+clearcase 371/tcp
+clearcase 371/udp
+ulistserv 372/tcp ulistproc #Unix Listserv
+ulistserv 372/udp ulistproc #Unix Listserv
+legent-1 373/tcp #Legent Corporation (now Computer Associates Intl.)
+legent-1 373/udp #Legent Corporation (now Computer Associates Intl.)
+legent-2 374/tcp #Legent Corporation (now Computer Associates Intl.)
+legent-2 374/udp #Legent Corporation (now Computer Associates Intl.)
+hassle 375/tcp
+hassle 375/udp
+nip 376/tcp #Amiga Envoy Network Inquiry Proto
+nip 376/udp #Amiga Envoy Network Inquiry Proto
+tnETOS 377/tcp #NEC Corporation
+tnETOS 377/udp #NEC Corporation
+dsETOS 378/tcp #NEC Corporation
+dsETOS 378/udp #NEC Corporation
+is99c 379/tcp #TIA/EIA/IS-99 modem client
+is99c 379/udp #TIA/EIA/IS-99 modem client
+is99s 380/tcp #TIA/EIA/IS-99 modem server
+is99s 380/udp #TIA/EIA/IS-99 modem server
+hp-collector 381/tcp #hp performance data collector
+hp-collector 381/udp #hp performance data collector
+hp-managed-node 382/tcp #hp performance data managed node
+hp-managed-node 382/udp #hp performance data managed node
+hp-alarm-mgr 383/tcp #hp performance data alarm manager
+hp-alarm-mgr 383/udp #hp performance data alarm manager
+arns 384/tcp #A Remote Network Server System
+arns 384/udp #A Remote Network Server System
+ibm-app 385/tcp #IBM Application
+ibm-app 385/udp #IBM Application
+asa 386/tcp #ASA Message Router Object Def.
+asa 386/udp #ASA Message Router Object Def.
+aurp 387/tcp #Appletalk Update-Based Routing Pro.
+aurp 387/udp #Appletalk Update-Based Routing Pro.
+unidata-ldm 388/tcp #Unidata LDM Version 4
+unidata-ldm 388/udp #Unidata LDM Version 4
+ldap 389/tcp #Lightweight Directory Access Protocol
+ldap 389/udp #Lightweight Directory Access Protocol
+uis 390/tcp
+uis 390/udp
+synotics-relay 391/tcp #SynOptics SNMP Relay Port
+synotics-relay 391/udp #SynOptics SNMP Relay Port
+synotics-broker 392/tcp #SynOptics Port Broker Port
+synotics-broker 392/udp #SynOptics Port Broker Port
+dis 393/tcp #Data Interpretation System
+dis 393/udp #Data Interpretation System
+embl-ndt 394/tcp #EMBL Nucleic Data Transfer
+embl-ndt 394/udp #EMBL Nucleic Data Transfer
+netcp 395/tcp #NETscout Control Protocol
+netcp 395/udp #NETscout Control Protocol
+netware-ip 396/tcp #Novell Netware over IP
+netware-ip 396/udp #Novell Netware over IP
+mptn 397/tcp #Multi Protocol Trans. Net.
+mptn 397/udp #Multi Protocol Trans. Net.
+kryptolan 398/tcp
+kryptolan 398/udp
+iso-tsap-c2 399/tcp #ISO-TSAP Class 2
+iso-tsap-c2 399/udp #ISO-TSAP Class 2
+work-sol 400/tcp #Workstation Solutions
+work-sol 400/udp #Workstation Solutions
+ups 401/tcp #Uninterruptible Power Supply
+ups 401/udp #Uninterruptible Power Supply
+genie 402/tcp #Genie Protocol
+genie 402/udp #Genie Protocol
+decap 403/tcp
+decap 403/udp
+nced 404/tcp
+nced 404/udp
+ncld 405/tcp
+ncld 405/udp
+imsp 406/tcp #Interactive Mail Support Protocol
+imsp 406/udp #Interactive Mail Support Protocol
+timbuktu 407/tcp
+timbuktu 407/udp
+prm-sm 408/tcp #Prospero Resource Manager Sys. Man.
+prm-sm 408/udp #Prospero Resource Manager Sys. Man.
+prm-nm 409/tcp #Prospero Resource Manager Node Man.
+prm-nm 409/udp #Prospero Resource Manager Node Man.
+decladebug 410/tcp #DECLadebug Remote Debug Protocol
+decladebug 410/udp #DECLadebug Remote Debug Protocol
+rmt 411/tcp #Remote MT Protocol
+rmt 411/udp #Remote MT Protocol
+synoptics-trap 412/tcp #Trap Convention Port
+synoptics-trap 412/udp #Trap Convention Port
+smsp 413/tcp
+smsp 413/udp
+infoseek 414/tcp
+infoseek 414/udp
+bnet 415/tcp
+bnet 415/udp
+silverplatter 416/tcp
+silverplatter 416/udp
+onmux 417/tcp
+onmux 417/udp
+hyper-g 418/tcp
+hyper-g 418/udp
+ariel1 419/tcp
+ariel1 419/udp
+smpte 420/tcp
+smpte 420/udp
+ariel2 421/tcp
+ariel2 421/udp
+ariel3 422/tcp
+ariel3 422/udp
+opc-job-start 423/tcp #IBM Operations Planning and Control Start
+opc-job-start 423/udp #IBM Operations Planning and Control Start
+opc-job-track 424/tcp #IBM Operations Planning and Control Track
+opc-job-track 424/udp #IBM Operations Planning and Control Track
+icad-el 425/tcp
+icad-el 425/udp
+smartsdp 426/tcp
+smartsdp 426/udp
+svrloc 427/tcp #Server Location
+svrloc 427/udp #Server Location
+ocs_cmu 428/tcp
+ocs_cmu 428/udp
+ocs_amu 429/tcp
+ocs_amu 429/udp
+utmpsd 430/tcp
+utmpsd 430/udp
+utmpcd 431/tcp
+utmpcd 431/udp
+iasd 432/tcp
+iasd 432/udp
+nnsp 433/tcp
+nnsp 433/udp
+mobileip-agent 434/tcp
+mobileip-agent 434/udp
+mobilip-mn 435/tcp
+mobilip-mn 435/udp
+dna-cml 436/tcp
+dna-cml 436/udp
+comscm 437/tcp
+comscm 437/udp
+dsfgw 438/tcp
+dsfgw 438/udp
+dasp 439/tcp
+dasp 439/udp
+sgcp 440/tcp
+sgcp 440/udp
+decvms-sysmgt 441/tcp
+decvms-sysmgt 441/udp
+cvc_hostd 442/tcp
+cvc_hostd 442/udp
+https 443/tcp
+https 443/udp
+snpp 444/tcp #Simple Network Paging Protocol
+snpp 444/udp #Simple Network Paging Protocol
+# [RFC1568]
+microsoft-ds 445/tcp
+microsoft-ds 445/udp
+ddm-rdb 446/tcp
+ddm-rdb 446/udp
+ddm-dfm 447/tcp
+ddm-dfm 447/udp
+ddm-ssl 448/tcp ddm-byte
+ddm-ssl 448/udp ddm-byte
+as-servermap 449/tcp #AS Server Mapper
+as-servermap 449/udp #AS Server Mapper
+tserver 450/tcp
+tserver 450/udp
+sfs-smp-net 451/tcp #Cray Network Semaphore server
+sfs-smp-net 451/udp #Cray Network Semaphore server
+sfs-config 452/tcp #Cray SFS config server
+sfs-config 452/udp #Cray SFS config server
+creativeserver 453/tcp #CreativeServer
+creativeserver 453/udp #CreativeServer
+contentserver 454/tcp #ContentServer
+contentserver 454/udp #ContentServer
+creativepartnr 455/tcp #CreativePartnr
+creativepartnr 455/udp #CreativePartnr
+macon-tcp 456/tcp
+macon-udp 456/udp
+scohelp 457/tcp
+scohelp 457/udp
+appleqtc 458/tcp #apple quick time
+appleqtc 458/udp #apple quick time
+ampr-rcmd 459/tcp
+ampr-rcmd 459/udp
+skronk 460/tcp
+skronk 460/udp
+datasurfsrv 461/tcp
+datasurfsrv 461/udp
+datasurfsrvsec 462/tcp
+datasurfsrvsec 462/udp
+alpes 463/tcp
+alpes 463/udp
+#
+kpasswd5 464/tcp # Kerberos (v5)
+kpasswd5 464/udp # Kerberos (v5)
+#PROBLEMS!==============================================================
+# IANA has offically assigned these two ports as ``kpasswd''
+#kpasswd 464/tcp # Kerberos (v5)
+#kpasswd 464/udp # Kerberos (v5)
+#PROBLEMS!==============================================================
+smtps 465/tcp #smtp protocol over TLS/SSL (was ssmtp)
+smtps 465/udp #smtp protocol over TLS/SSL (was ssmtp)
+digital-vrc 466/tcp
+digital-vrc 466/udp
+mylex-mapd 467/tcp
+mylex-mapd 467/udp
+photuris 468/tcp
+photuris 468/udp
+rcp 469/tcp #Radio Control Protocol
+rcp 469/udp #Radio Control Protocol
+scx-proxy 470/tcp
+scx-proxy 470/udp
+mondex 471/tcp
+mondex 471/udp
+ljk-login 472/tcp
+ljk-login 472/udp
+hybrid-pop 473/tcp
+hybrid-pop 473/udp
+tn-tl-w1 474/tcp
+tn-tl-w2 474/udp
+tcpnethaspsrv 475/tcp
+tcpnethaspsrv 475/udp
+tn-tl-fd1 476/tcp
+tn-tl-fd1 476/udp
+ss7ns 477/tcp
+ss7ns 477/udp
+spsc 478/tcp
+spsc 478/udp
+iafserver 479/tcp
+iafserver 479/udp
+iafdbase 480/tcp
+iafdbase 480/udp
+ph 481/tcp
+ph 481/udp
+bgs-nsi 482/tcp
+bgs-nsi 482/udp
+ulpnet 483/tcp
+ulpnet 483/udp
+integra-sme 484/tcp #Integra Software Management Environment
+integra-sme 484/udp #Integra Software Management Environment
+powerburst 485/tcp #Air Soft Power Burst
+powerburst 485/udp #Air Soft Power Burst
+avian 486/tcp
+avian 486/udp
+saft 487/tcp #saft Simple Asynchronous File Transfer
+saft 487/udp #saft Simple Asynchronous File Transfer
+gss-http 488/tcp
+gss-http 488/udp
+nest-protocol 489/tcp
+nest-protocol 489/udp
+micom-pfs 490/tcp
+micom-pfs 490/udp
+go-login 491/tcp
+go-login 491/udp
+ticf-1 492/tcp #Transport Independent Convergence for FNA
+ticf-1 492/udp #Transport Independent Convergence for FNA
+ticf-2 493/tcp #Transport Independent Convergence for FNA
+ticf-2 493/udp #Transport Independent Convergence for FNA
+pov-ray 494/tcp
+pov-ray 494/udp
+intecourier 495/tcp
+intecourier 495/udp
+pim-rp-disc 496/tcp
+pim-rp-disc 496/udp
+dantz 497/tcp
+dantz 497/udp
+siam 498/tcp
+siam 498/udp
+iso-ill 499/tcp #ISO ILL Protocol
+iso-ill 499/udp #ISO ILL Protocol
+isakmp 500/tcp
+isakmp 500/udp
+stmf 501/tcp
+stmf 501/udp
+asa-appl-proto 502/tcp
+asa-appl-proto 502/udp
+intrinsa 503/tcp
+intrinsa 503/udp
+citadel 504/tcp
+citadel 504/udp
+mailbox-lm 505/tcp
+mailbox-lm 505/udp
+ohimsrv 506/tcp
+ohimsrv 506/udp
+crs 507/tcp
+crs 507/udp
+xvttp 508/tcp
+xvttp 508/udp
+snare 509/tcp
+snare 509/udp
+fcp 510/tcp #FirstClass Protocol
+fcp 510/udp #FirstClass Protocol
+passgo 511/tcp
+passgo 511/udp
+#
+# Berkeley-specific services
+#
+exec 512/tcp #remote process execution;
+# authentication performed using
+# passwords and UNIX login names
+biff 512/udp comsat #used by mail system to notify users
+# of new mail received; currently
+# receives messages only from
+# processes on the same machine
+login 513/tcp #remote login a la telnet;
+# automatic authentication performed
+# based on priviledged port numbers
+# and distributed data bases which
+# identify "authentication domains"
+who 513/udp whod #maintains data bases showing who's
+# logged in to machines on a local
+# net and the load average of the
+# machine
+shell 514/tcp cmd #like exec, but automatic
+# authentication is performed as for
+# login server
+syslog 514/udp
+printer 515/tcp spooler
+printer 515/udp spooler
+videotex 516/tcp
+videotex 516/udp
+talk 517/tcp #like tenex link, but across
+# machine - unfortunately, doesn't
+# use link protocol (this is actually
+# just a rendezvous port from which a
+# tcp connection is established)
+talk 517/udp #like tenex link, but across
+# machine - unfortunately, doesn't
+# use link protocol (this is actually
+# just a rendezvous port from which a
+# tcp connection is established)
+ntalk 518/tcp
+ntalk 518/udp
+utime 519/tcp unixtime
+utime 519/udp unixtime
+efs 520/tcp #extended file name server
+router 520/udp route routed #local routing process (on site);
+# uses variant of Xerox NS routing
+# information protocol
+ripng 521/tcp
+ripng 521/udp
+ulp 522/tcp
+ulp 522/udp
+ibm-db2 523/tcp
+ibm-db2 523/udp
+ncp 524/tcp
+ncp 524/udp
+timed 525/tcp timeserver
+timed 525/udp timeserver
+tempo 526/tcp newdate
+tempo 526/udp newdate
+stx 527/tcp #Stock IXChange
+stx 527/udp #Stock IXChange
+custix 528/tcp #Customer IXChange
+custix 528/udp #Customer IXChange
+irc-serv 529/tcp
+irc-serv 529/udp
+courier 530/tcp rpc
+courier 530/udp rpc
+conference 531/tcp chat
+conference 531/udp chat
+netnews 532/tcp readnews
+netnews 532/udp readnews
+netwall 533/tcp #for emergency broadcasts
+netwall 533/udp #for emergency broadcasts
+mm-admin 534/tcp #MegaMedia Admin
+mm-admin 534/udp #MegaMedia Admin
+iiop 535/tcp
+iiop 535/udp
+opalis-rdv 536/tcp
+opalis-rdv 536/udp
+nmsp 537/tcp #Networked Media Streaming Protocol
+nmsp 537/udp #Networked Media Streaming Protocol
+gdomap 538/tcp
+gdomap 538/udp
+apertus-ldp 539/tcp #Apertus Technologies Load Determination
+apertus-ldp 539/udp #Apertus Technologies Load Determination
+uucp 540/tcp uucpd
+uucp 540/udp uucpd
+uucp-rlogin 541/tcp
+uucp-rlogin 541/udp
+commerce 542/tcp
+commerce 542/udp
+klogin 543/tcp # Kerberos (v4/v5)
+klogin 543/udp # Kerberos (v4/v5)
+kshell 544/tcp krcmd # Kerberos (v4/v5)
+kshell 544/udp krcmd # Kerberos (v4/v5)
+appleqtcsrvr 545/tcp
+appleqtcsrvr 545/udp
+dhcpv6-client 546/tcp #DHCPv6 Client
+dhcpv6-client 546/udp #DHCPv6 Client
+dhcpv6-server 547/tcp #DHCPv6 Server
+dhcpv6-server 547/udp #DHCPv6 Server
+afpovertcp 548/tcp #AFP over TCP
+afpovertcp 548/udp #AFP over TCP
+idfp 549/tcp
+idfp 549/udp
+new-rwho 550/tcp new-who
+new-rwho 550/udp new-who
+cybercash 551/tcp
+cybercash 551/udp
+deviceshare 552/tcp
+deviceshare 552/udp
+pirp 553/tcp
+pirp 553/udp
+rtsp 554/tcp #Real Time Stream Control Protocol
+rtsp 554/udp #Real Time Stream Control Protocol
+dsf 555/tcp
+dsf 555/udp
+remotefs 556/tcp rfs rfs_server # Brunhoff remote filesystem
+remotefs 556/udp rfs rfs_server # Brunhoff remote filesystem
+openvms-sysipc 557/tcp
+openvms-sysipc 557/udp
+sdnskmp 558/tcp
+sdnskmp 558/udp
+teedtap 559/tcp
+teedtap 559/udp
+rmonitor 560/tcp rmonitord
+rmonitor 560/udp rmonitord
+monitor 561/tcp
+monitor 561/udp
+chshell 562/tcp chcmd
+chshell 562/udp chcmd
+nntps 563/tcp snntp #nntp protocol over TLS/SSL
+nntps 563/udp snntp #nntp protocol over TLS/SSL
+9pfs 564/tcp #plan 9 file service
+9pfs 564/udp #plan 9 file service
+whoami 565/tcp
+whoami 565/udp
+streettalk 566/tcp
+banyan-rpc 567/tcp
+banyan-rpc 567/udp
+ms-shuttle 568/tcp #Microsoft shuttle
+ms-shuttle 568/udp #Microsoft shuttle
+ms-rome 569/tcp #Microsoft rome
+ms-rome 569/udp #Microsoft rome
+meter 570/tcp #demon
+meter 570/udp #demon
+umeter 571/tcp #udemon
+umeter 571/udp #udemon
+sonar 572/tcp
+sonar 572/udp
+banyan-vip 573/tcp
+banyan-vip 573/udp
+ftp-agent 574/tcp #FTP Software Agent System
+ftp-agent 574/udp #FTP Software Agent System
+vemmi 575/tcp
+vemmi 575/udp
+ipcd 576/tcp
+ipcd 576/udp
+vnas 577/tcp
+vnas 577/udp
+ipdd 578/tcp
+ipdd 578/udp
+decbsrv 579/tcp
+decbsrv 579/udp
+sntp-heartbeat 580/tcp
+sntp-heartbeat 580/udp
+bdp 581/tcp #Bundle Discovery Protocol
+bdp 581/udp #Bundle Discovery Protocol
+scc-security 582/tcp
+scc-security 582/udp
+philips-vc 583/tcp #Philips Video-Conferencing
+philips-vc 583/udp #Philips Video-Conferencing
+keyserver 584/tcp
+keyserver 584/udp
+#imap4-ssl@585 never should have been allocated. See PR 46294.
+#imap4-ssl 585/tcp #IMAP4+SSL (use of 585 is not recommended,
+#imap4-ssl 585/udp # use 993 instead)
+password-chg 586/tcp
+password-chg 586/udp
+submission 587/tcp
+submission 587/udp
+cal 588/tcp
+cal 588/udp
+eyelink 589/tcp
+eyelink 589/udp
+tns-cml 590/tcp
+tns-cml 590/udp
+http-alt 591/tcp #FileMaker, Inc. - HTTP Alternate (see Port 80)
+http-alt 591/udp #FileMaker, Inc. - HTTP Alternate (see Port 80)
+eudora-set 592/tcp
+eudora-set 592/udp
+http-rpc-epmap 593/tcp #HTTP RPC Ep Map
+http-rpc-epmap 593/udp #HTTP RPC Ep Map
+tpip 594/tcp
+tpip 594/udp
+cab-protocol 595/tcp
+cab-protocol 595/udp
+smsd 596/tcp
+smsd 596/udp
+ptcnameservice 597/tcp #PTC Name Service
+ptcnameservice 597/udp #PTC Name Service
+sco-websrvrmg3 598/tcp #SCO Web Server Manager 3
+sco-websrvrmg3 598/udp #SCO Web Server Manager 3
+acp 599/tcp #Aeolon Core Protocol
+acp 599/udp #Aeolon Core Protocol
+ipcserver 600/tcp #Sun IPC server
+ipcserver 600/udp #Sun IPC server
+nqs 607/tcp
+nqs 607/udp
+urm 606/tcp #Cray Unified Resource Manager
+urm 606/udp #Cray Unified Resource Manager
+sift-uft 608/tcp #Sender-Initiated/Unsolicited File Transfer
+sift-uft 608/udp #Sender-Initiated/Unsolicited File Transfer
+npmp-trap 609/tcp
+npmp-trap 609/udp
+npmp-local 610/tcp
+npmp-local 610/udp
+npmp-gui 611/tcp
+npmp-gui 611/udp
+sshell 614/tcp #SSLshell
+sshell 614/udp
+ipp 631/tcp #IPP (Internet Printing Protocol)
+ipp 631/udp #IPP (Internet Printing Protocol)
+ginad 634/tcp
+ginad 634/udp
+ldaps 636/tcp sldap #ldap protocol over TLS/SSL
+ldaps 636/udp sldap
+mdqs 666/tcp
+mdqs 666/udp
+#PROBLEMS!===============================================
+doom 666/tcp #doom Id Software
+doom 666/udp #doom Id Software
+#PROBLEMS!===============================================
+acap 674/tcp #Application Configuration Access Protocol
+acap 674/udp #Application Configuration Access Protocol
+elcsd 704/tcp #errlog copy/server daemon
+elcsd 704/udp #errlog copy/server daemon
+entrustmanager 709/tcp #EntrustManager
+entrustmanager 709/udp #EntrustManager
+netviewdm1 729/tcp #IBM NetView DM/6000 Server/Client
+netviewdm1 729/udp #IBM NetView DM/6000 Server/Client
+netviewdm2 730/tcp #IBM NetView DM/6000 send/tcp
+netviewdm2 730/udp #IBM NetView DM/6000 send/tcp
+netviewdm3 731/tcp #IBM NetView DM/6000 receive/tcp
+netviewdm3 731/udp #IBM NetView DM/6000 receive/tcp
+netgw 741/tcp
+netgw 741/udp
+netrcs 742/tcp #Network based Rev. Cont. Sys.
+netrcs 742/udp #Network based Rev. Cont. Sys.
+flexlm 744/tcp #Flexible License Manager
+flexlm 744/udp #Flexible License Manager
+fujitsu-dev 747/tcp #Fujitsu Device Control
+fujitsu-dev 747/udp #Fujitsu Device Control
+ris-cm 748/tcp #Russell Info Sci Calendar Manager
+ris-cm 748/udp #Russell Info Sci Calendar Manager
+kerberos-adm 749/tcp #Kerberos administration (v5)
+kerberos-adm 749/udp #Kerberos administration (v5)
+kerberos-iv 750/udp kdc # Kerberos (v4)
+kerberos-iv 750/tcp kdc # Kerberos (v4)
+#PROBLEMS!========================================================
+#rfile 750/tcp
+#loadav 750/udp
+#PROBLEMS!========================================================
+kerberos_master 751/tcp # Kerberos `kadmin' (v4)
+kerberos_master 751/udp # Kerberos `kadmin' (v4)
+#PROBLEMS!========================================================
+pump 751/tcp
+pump 751/udp
+#PROBLEMS!========================================================
+qrh 752/tcp
+qrh 752/udp
+rrh 753/tcp
+rrh 753/udp
+krb_prop 754/tcp krb5_prop # kerberos/v5 server propagation
+#PROBLEMS!========================================================
+tell 754/tcp #send
+#PROBLEMS!========================================================
+tell 754/udp #send
+nlogin 758/tcp
+nlogin 758/udp
+con 759/tcp
+con 759/udp
+krbupdate 760/tcp kreg # Kerberos (v4) registration
+#PROBLEMS!========================================================
+ns 760/tcp
+#PROBLEMS!========================================================
+ns 760/udp
+kpasswd 761/tcp kpwd # Kerberos (v4) "passwd"
+#PROBLEMS!========================================================
+rxe 761/tcp
+#PROBLEMS!========================================================
+rxe 761/udp
+quotad 762/tcp
+quotad 762/udp
+cycleserv 763/tcp
+cycleserv 763/udp
+omserv 764/tcp
+omserv 764/udp
+webster 765/tcp
+webster 765/udp
+phonebook 767/tcp #phone
+phonebook 767/udp #phone
+vid 769/tcp
+vid 769/udp
+cadlock 770/tcp
+cadlock 770/udp
+rtip 771/tcp
+rtip 771/udp
+cycleserv2 772/tcp
+cycleserv2 772/udp
+submit 773/tcp
+notify 773/udp
+rpasswd 774/tcp
+acmaint_dbd 774/udp
+entomb 775/tcp
+acmaint_transd 775/udp
+wpages 776/tcp
+wpages 776/udp
+wpgs 780/tcp
+wpgs 780/udp
+concert 786/tcp
+concert 786/udp
+mdbs_daemon 800/tcp
+mdbs_daemon 800/udp
+device 801/tcp
+device 801/udp
+supfilesrv 871/tcp # for SUP
+rsync 873/tcp
+rsync 873/udp
+accessbuilder 888/tcp
+accessbuilder 888/udp
+swat 901/tcp # samba web configuration tool
+ftps-data 989/tcp # ftp protocol, data, over TLS/SSL
+ftps-data 989/udp
+ftps 990/tcp # ftp protocol, control, over TLS/SSL
+ftps 990/udp
+telnets 992/tcp # telnet protocol over TLS/SSL
+telnets 992/udp
+imaps 993/tcp # imap4 protocol over TLS/SSL
+imaps 993/udp
+ircs 994/tcp # irc protocol over TLS/SSL
+ircs 994/udp
+pop3s 995/tcp spop3 # pop3 protocol over TLS/SSL
+pop3s 995/udp spop3
+vsinet 996/tcp
+vsinet 996/udp
+maitrd 997/tcp
+maitrd 997/udp
+busboy 998/tcp
+puparp 998/udp
+garcon 999/tcp
+applix 999/udp #Applix ac
+puprouter 999/tcp
+puprouter 999/udp
+cadlock 1000/tcp
+ock 1000/udp
+#
+# REGISTERED PORT NUMBERS
+#
+blackjack 1025/tcp #network blackjack
+blackjack 1025/udp #network blackjack
+iad1 1030/tcp #BBN IAD
+iad1 1030/udp #BBN IAD
+iad2 1031/tcp #BBN IAD
+iad2 1031/udp #BBN IAD
+iad3 1032/tcp #BBN IAD
+iad3 1032/udp #BBN IAD
+nim 1058/tcp
+nim 1058/udp
+nimreg 1059/tcp
+nimreg 1059/udp
+instl_boots 1067/tcp #Installation Bootstrap Proto. Serv.
+instl_boots 1067/udp #Installation Bootstrap Proto. Serv.
+instl_bootc 1068/tcp #Installation Bootstrap Proto. Cli.
+instl_bootc 1068/udp #Installation Bootstrap Proto. Cli.
+socks 1080/tcp
+socks 1080/udp
+ansoft-lm-1 1083/tcp #Anasoft License Manager
+ansoft-lm-1 1083/udp #Anasoft License Manager
+ansoft-lm-2 1084/tcp #Anasoft License Manager
+ansoft-lm-2 1084/udp #Anasoft License Manager
+webobjects 1085/tcp #Web Objects
+webobjects 1085/udp #Web Objects
+kpop 1109/tcp #Unofficial
+kpop 1109/udp #Unofficial
+nfsd-status 1110/tcp #Cluster status info
+nfsd-keepalive 1110/udp #Client status info
+supfiledbg 1127/tcp # for SUP
+nfa 1155/tcp #Network File Access
+nfa 1155/udp #Network File Access
+phone 1167/udp #conference calling
+skkserv 1178/tcp #SKK (kanji input)
+lupa 1212/tcp
+lupa 1212/udp
+nerv 1222/tcp #SNI R&D network
+nerv 1222/udp #SNI R&D network
+hermes 1248/tcp
+hermes 1248/udp
+healthd 1281/tcp #healthd
+healthd 1281/udp #healthd
+alta-ana-lm 1346/tcp #Alta Analytics License Manager
+alta-ana-lm 1346/udp #Alta Analytics License Manager
+bbn-mmc 1347/tcp #multi media conferencing
+bbn-mmc 1347/udp #multi media conferencing
+bbn-mmx 1348/tcp #multi media conferencing
+bbn-mmx 1348/udp #multi media conferencing
+sbook 1349/tcp #Registration Network Protocol
+sbook 1349/udp #Registration Network Protocol
+editbench 1350/tcp #Registration Network Protocol
+editbench 1350/udp #Registration Network Protocol
+equationbuilder 1351/tcp #Digital Tool Works (MIT)
+equationbuilder 1351/udp #Digital Tool Works (MIT)
+lotusnote 1352/tcp #Lotus Note
+lotusnote 1352/udp #Lotus Note
+relief 1353/tcp #Relief Consulting
+relief 1353/udp #Relief Consulting
+rightbrain 1354/tcp #RightBrain Software
+rightbrain 1354/udp #RightBrain Software
+intuitive-edge 1355/tcp #Intuitive Edge
+intuitive-edge 1355/udp #Intuitive Edge
+cuillamartin 1356/tcp #CuillaMartin Company
+cuillamartin 1356/udp #CuillaMartin Company
+pegboard 1357/tcp #Electronic PegBoard
+pegboard 1357/udp #Electronic PegBoard
+connlcli 1358/tcp
+connlcli 1358/udp
+ftsrv 1359/tcp
+ftsrv 1359/udp
+mimer 1360/tcp
+mimer 1360/udp
+linx 1361/tcp
+linx 1361/udp
+timeflies 1362/tcp
+timeflies 1362/udp
+ndm-requester 1363/tcp #Network DataMover Requester
+ndm-requester 1363/udp #Network DataMover Requester
+ndm-server 1364/tcp #Network DataMover Server
+ndm-server 1364/udp #Network DataMover Server
+adapt-sna 1365/tcp #Network Software Associates
+adapt-sna 1365/udp #Network Software Associates
+netware-csp 1366/tcp #Novell NetWare Comm Service Platform
+netware-csp 1366/udp #Novell NetWare Comm Service Platform
+dcs 1367/tcp
+dcs 1367/udp
+screencast 1368/tcp
+screencast 1368/udp
+gv-us 1369/tcp #GlobalView to Unix Shell
+gv-us 1369/udp #GlobalView to Unix Shell
+us-gv 1370/tcp #Unix Shell to GlobalView
+us-gv 1370/udp #Unix Shell to GlobalView
+fc-cli 1371/tcp #Fujitsu Config Protocol
+fc-cli 1371/udp #Fujitsu Config Protocol
+fc-ser 1372/tcp #Fujitsu Config Protocol
+fc-ser 1372/udp #Fujitsu Config Protocol
+chromagrafx 1373/tcp
+chromagrafx 1373/udp
+molly 1374/tcp #EPI Software Systems
+molly 1374/udp #EPI Software Systems
+bytex 1375/tcp
+bytex 1375/udp
+ibm-pps 1376/tcp #IBM Person to Person Software
+ibm-pps 1376/udp #IBM Person to Person Software
+cichlid 1377/tcp #Cichlid License Manager
+cichlid 1377/udp #Cichlid License Manager
+elan 1378/tcp #Elan License Manager
+elan 1378/udp #Elan License Manager
+dbreporter 1379/tcp #Integrity Solutions
+dbreporter 1379/udp #Integrity Solutions
+telesis-licman 1380/tcp #Telesis Network License Manager
+telesis-licman 1380/udp #Telesis Network License Manager
+apple-licman 1381/tcp #Apple Network License Manager
+apple-licman 1381/udp #Apple Network License Manager
+#udt_os 1382/tcp
+#udt_os 1382/udp
+gwha 1383/tcp #GW Hannaway Network License Manager
+gwha 1383/udp #GW Hannaway Network License Manager
+os-licman 1384/tcp #Objective Solutions License Manager
+os-licman 1384/udp #Objective Solutions License Manager
+atex_elmd 1385/tcp #Atex Publishing License Manager
+atex_elmd 1385/udp #Atex Publishing License Manager
+checksum 1386/tcp #CheckSum License Manager
+checksum 1386/udp #CheckSum License Manager
+cadsi-lm 1387/tcp #Computer Aided Design Software Inc LM
+cadsi-lm 1387/udp #Computer Aided Design Software Inc LM
+objective-dbc 1388/tcp #Objective Solutions DataBase Cache
+objective-dbc 1388/udp #Objective Solutions DataBase Cache
+iclpv-dm 1389/tcp #Document Manager
+iclpv-dm 1389/udp #Document Manager
+iclpv-sc 1390/tcp #Storage Controller
+iclpv-sc 1390/udp #Storage Controller
+iclpv-sas 1391/tcp #Storage Access Server
+iclpv-sas 1391/udp #Storage Access Server
+iclpv-pm 1392/tcp #Print Manager
+iclpv-pm 1392/udp #Print Manager
+iclpv-nls 1393/tcp #Network Log Server
+iclpv-nls 1393/udp #Network Log Server
+iclpv-nlc 1394/tcp #Network Log Client
+iclpv-nlc 1394/udp #Network Log Client
+iclpv-wsm 1395/tcp #PC Workstation Manager software
+iclpv-wsm 1395/udp #PC Workstation Manager software
+dvl-activemail 1396/tcp #DVL Active Mail
+dvl-activemail 1396/udp #DVL Active Mail
+audio-activmail 1397/tcp #Audio Active Mail
+audio-activmail 1397/udp #Audio Active Mail
+video-activmail 1398/tcp #Video Active Mail
+video-activmail 1398/udp #Video Active Mail
+cadkey-licman 1399/tcp #Cadkey License Manager
+cadkey-licman 1399/udp #Cadkey License Manager
+cadkey-tablet 1400/tcp #Cadkey Tablet Daemon
+cadkey-tablet 1400/udp #Cadkey Tablet Daemon
+goldleaf-licman 1401/tcp #Goldleaf License Manager
+goldleaf-licman 1401/udp #Goldleaf License Manager
+prm-sm-np 1402/tcp #Prospero Resource Manager
+prm-sm-np 1402/udp #Prospero Resource Manager
+prm-nm-np 1403/tcp #Prospero Resource Manager
+prm-nm-np 1403/udp #Prospero Resource Manager
+igi-lm 1404/tcp #Infinite Graphics License Manager
+igi-lm 1404/udp #Infinite Graphics License Manager
+ibm-res 1405/tcp #IBM Remote Execution Starter
+ibm-res 1405/udp #IBM Remote Execution Starter
+netlabs-lm 1406/tcp #NetLabs License Manager
+netlabs-lm 1406/udp #NetLabs License Manager
+dbsa-lm 1407/tcp #DBSA License Manager
+dbsa-lm 1407/udp #DBSA License Manager
+sophia-lm 1408/tcp #Sophia License Manager
+sophia-lm 1408/udp #Sophia License Manager
+here-lm 1409/tcp #Here License Manager
+here-lm 1409/udp #Here License Manager
+hiq 1410/tcp #HiQ License Manager
+hiq 1410/udp #HiQ License Manager
+af 1411/tcp #AudioFile
+af 1411/udp #AudioFile
+innosys 1412/tcp
+innosys 1412/udp
+innosys-acl 1413/tcp
+innosys-acl 1413/udp
+ibm-mqseries 1414/tcp #IBM MQSeries
+ibm-mqseries 1414/udp #IBM MQSeries
+dbstar 1415/tcp
+dbstar 1415/udp
+novell-lu6.2 1416/tcp #Novell LU6.2
+novell-lu6.2 1416/udp #Novell LU6.2
+timbuktu-srv1 1417/tcp #Timbuktu Service 1 Port
+timbuktu-srv1 1417/udp #Timbuktu Service 1 Port
+timbuktu-srv2 1418/tcp #Timbuktu Service 2 Port
+timbuktu-srv2 1418/udp #Timbuktu Service 2 Port
+timbuktu-srv3 1419/tcp #Timbuktu Service 3 Port
+timbuktu-srv3 1419/udp #Timbuktu Service 3 Port
+timbuktu-srv4 1420/tcp #Timbuktu Service 4 Port
+timbuktu-srv4 1420/udp #Timbuktu Service 4 Port
+gandalf-lm 1421/tcp #Gandalf License Manager
+gandalf-lm 1421/udp #Gandalf License Manager
+autodesk-lm 1422/tcp #Autodesk License Manager
+autodesk-lm 1422/udp #Autodesk License Manager
+essbase 1423/tcp #Essbase Arbor Software
+essbase 1423/udp #Essbase Arbor Software
+hybrid 1424/tcp #Hybrid Encryption Protocol
+hybrid 1424/udp #Hybrid Encryption Protocol
+zion-lm 1425/tcp #Zion Software License Manager
+zion-lm 1425/udp #Zion Software License Manager
+sas-1 1426/tcp #Satellite-data Acquisition System 1
+sas-1 1426/udp #Satellite-data Acquisition System 1
+mloadd 1427/tcp #mloadd monitoring tool
+mloadd 1427/udp #mloadd monitoring tool
+informatik-lm 1428/tcp #Informatik License Manager
+informatik-lm 1428/udp #Informatik License Manager
+nms 1429/tcp #Hypercom NMS
+nms 1429/udp #Hypercom NMS
+tpdu 1430/tcp #Hypercom TPDU
+tpdu 1430/udp #Hypercom TPDU
+rgtp 1431/tcp #Reverse Gossip Transport
+rgtp 1431/udp #Reverse Gossip Transport
+blueberry-lm 1432/tcp #Blueberry Software License Manager
+blueberry-lm 1432/udp #Blueberry Software License Manager
+ms-sql-s 1433/tcp #Microsoft-SQL-Server
+ms-sql-s 1433/udp #Microsoft-SQL-Server
+ms-sql-m 1434/tcp #Microsoft-SQL-Monitor
+ms-sql-m 1434/udp #Microsoft-SQL-Monitor
+ibm-cics 1435/tcp
+ibm-cics 1435/udp
+sas-2 1436/tcp #Satellite-data Acquisition System 2
+sas-2 1436/udp #Satellite-data Acquisition System 2
+tabula 1437/tcp
+tabula 1437/udp
+eicon-server 1438/tcp #Eicon Security Agent/Server
+eicon-server 1438/udp #Eicon Security Agent/Server
+eicon-x25 1439/tcp #Eicon X25/SNA Gateway
+eicon-x25 1439/udp #Eicon X25/SNA Gateway
+eicon-slp 1440/tcp #Eicon Service Location Protocol
+eicon-slp 1440/udp #Eicon Service Location Protocol
+cadis-1 1441/tcp #Cadis License Management
+cadis-1 1441/udp #Cadis License Management
+cadis-2 1442/tcp #Cadis License Management
+cadis-2 1442/udp #Cadis License Management
+ies-lm 1443/tcp #Integrated Engineering Software
+ies-lm 1443/udp #Integrated Engineering Software
+marcam-lm 1444/tcp #Marcam License Management
+marcam-lm 1444/udp #Marcam License Management
+proxima-lm 1445/tcp #Proxima License Manager
+proxima-lm 1445/udp #Proxima License Manager
+ora-lm 1446/tcp #Optical Research Associates License Manager
+ora-lm 1446/udp #Optical Research Associates License Manager
+apri-lm 1447/tcp #Applied Parallel Research LM
+apri-lm 1447/udp #Applied Parallel Research LM
+oc-lm 1448/tcp #OpenConnect License Manager
+oc-lm 1448/udp #OpenConnect License Manager
+peport 1449/tcp
+peport 1449/udp
+dwf 1450/tcp #Tandem Distributed Workbench Facility
+dwf 1450/udp #Tandem Distributed Workbench Facility
+infoman 1451/tcp #IBM Information Management
+infoman 1451/udp #IBM Information Management
+gtegsc-lm 1452/tcp #GTE Government Systems License Man
+gtegsc-lm 1452/udp #GTE Government Systems License Man
+genie-lm 1453/tcp #Genie License Manager
+genie-lm 1453/udp #Genie License Manager
+interhdl_elmd 1454/tcp #interHDL License Manager
+interhdl_elmd 1454/udp #interHDL License Manager
+esl-lm 1455/tcp #ESL License Manager
+esl-lm 1455/udp #ESL License Manager
+dca 1456/tcp
+dca 1456/udp
+valisys-lm 1457/tcp #Valisys License Manager
+valisys-lm 1457/udp #Valisys License Manager
+nrcabq-lm 1458/tcp #Nichols Research Corp.
+nrcabq-lm 1458/udp #Nichols Research Corp.
+proshare1 1459/tcp #Proshare Notebook Application
+proshare1 1459/udp #Proshare Notebook Application
+proshare2 1460/tcp #Proshare Notebook Application
+proshare2 1460/udp #Proshare Notebook Application
+ibm_wrless_lan 1461/tcp #IBM Wireless LAN
+ibm_wrless_lan 1461/udp #IBM Wireless LAN
+world-lm 1462/tcp #World License Manager
+world-lm 1462/udp #World License Manager
+nucleus 1463/tcp
+nucleus 1463/udp
+msl_lmd 1464/tcp #MSL License Manager
+msl_lmd 1464/udp #MSL License Manager
+pipes 1465/tcp #Pipes Platform
+pipes 1465/udp #Pipes Platform mfarlin@peerlogic.com
+oceansoft-lm 1466/tcp #Ocean Software License Manager
+oceansoft-lm 1466/udp #Ocean Software License Manager
+csdmbase 1467/tcp
+csdmbase 1467/udp
+csdm 1468/tcp
+csdm 1468/udp
+aal-lm 1469/tcp #Active Analysis Limited License Manager
+aal-lm 1469/udp #Active Analysis Limited License Manager
+uaiact 1470/tcp #Universal Analytics
+uaiact 1470/udp #Universal Analytics
+csdmbase 1471/tcp
+csdmbase 1471/udp
+csdm 1472/tcp
+csdm 1472/udp
+openmath 1473/tcp
+openmath 1473/udp
+telefinder 1474/tcp
+telefinder 1474/udp
+taligent-lm 1475/tcp #Taligent License Manager
+taligent-lm 1475/udp #Taligent License Manager
+clvm-cfg 1476/tcp
+clvm-cfg 1476/udp
+ms-sna-server 1477/tcp
+ms-sna-server 1477/udp
+ms-sna-base 1478/tcp
+ms-sna-base 1478/udp
+dberegister 1479/tcp
+dberegister 1479/udp
+pacerforum 1480/tcp
+pacerforum 1480/udp
+airs 1481/tcp
+airs 1481/udp
+miteksys-lm 1482/tcp #Miteksys License Manager
+miteksys-lm 1482/udp #Miteksys License Manager
+afs 1483/tcp #AFS License Manager
+afs 1483/udp #AFS License Manager
+confluent 1484/tcp #Confluent License Manager
+confluent 1484/udp #Confluent License Manager
+lansource 1485/tcp
+lansource 1485/udp
+nms_topo_serv 1486/tcp
+nms_topo_serv 1486/udp
+localinfosrvr 1487/tcp
+localinfosrvr 1487/udp
+docstor 1488/tcp
+docstor 1488/udp
+dmdocbroker 1489/tcp
+dmdocbroker 1489/udp
+insitu-conf 1490/tcp
+insitu-conf 1490/udp
+anynetgateway 1491/tcp
+anynetgateway 1491/udp
+stone-design-1 1492/tcp
+stone-design-1 1492/udp
+netmap_lm 1493/tcp
+netmap_lm 1493/udp
+ica 1494/tcp
+ica 1494/udp
+cvc 1495/tcp
+cvc 1495/udp
+liberty-lm 1496/tcp
+liberty-lm 1496/udp
+rfx-lm 1497/tcp
+rfx-lm 1497/udp
+watcom-sql 1498/tcp
+watcom-sql 1498/udp
+fhc 1499/tcp #Federico Heinz Consultora
+fhc 1499/udp #Federico Heinz Consultora
+vlsi-lm 1500/tcp #VLSI License Manager
+vlsi-lm 1500/udp #VLSI License Manager
+sas-3 1501/tcp #Satellite-data Acquisition System 3
+sas-3 1501/udp #Satellite-data Acquisition System 3
+shivadiscovery 1502/tcp #Shiva
+shivadiscovery 1502/udp #Shiva
+imtc-mcs 1503/tcp #Databeam
+imtc-mcs 1503/udp #Databeam
+evb-elm 1504/tcp #EVB Software Engineering License Manager
+evb-elm 1504/udp #EVB Software Engineering License Manager
+funkproxy 1505/tcp #Funk Software, Inc.
+funkproxy 1505/udp #Funk Software, Inc.
+utcd 1506/tcp #Universal Time daemon (utcd)
+utcd 1506/udp #Universal Time daemon (utcd)
+symplex 1507/tcp
+symplex 1507/udp
+diagmond 1508/tcp
+diagmond 1508/udp
+robcad-lm 1509/tcp #Robcad, Ltd. License Manager
+robcad-lm 1509/udp #Robcad, Ltd. License Manager
+mvx-lm 1510/tcp #Midland Valley Exploration Ltd. Lic. Man.
+mvx-lm 1510/udp #Midland Valley Exploration Ltd. Lic. Man.
+3l-l1 1511/tcp
+3l-l1 1511/udp
+wins 1512/tcp #Microsoft's Windows Internet Name Service
+wins 1512/udp #Microsoft's Windows Internet Name Service
+fujitsu-dtc 1513/tcp #Fujitsu Systems Business of America, Inc
+fujitsu-dtc 1513/udp #Fujitsu Systems Business of America, Inc
+fujitsu-dtcns 1514/tcp #Fujitsu Systems Business of America, Inc
+fujitsu-dtcns 1514/udp #Fujitsu Systems Business of America, Inc
+ifor-protocol 1515/tcp
+ifor-protocol 1515/udp
+vpad 1516/tcp #Virtual Places Audio data
+vpad 1516/udp #Virtual Places Audio data
+vpac 1517/tcp #Virtual Places Audio control
+vpac 1517/udp #Virtual Places Audio control
+vpvd 1518/tcp #Virtual Places Video data
+vpvd 1518/udp #Virtual Places Video data
+vpvc 1519/tcp #Virtual Places Video control
+vpvc 1519/udp #Virtual Places Video control
+atm-zip-office 1520/tcp #atm zip office
+atm-zip-office 1520/udp #atm zip office
+ncube-lm 1521/tcp #nCube License Manager
+ncube-lm 1521/udp #nCube License Manager
+rna-lm 1522/tcp #Ricardo North America License Manager
+rna-lm 1522/udp #Ricardo North America License Manager
+cichild-lm 1523/tcp
+cichild-lm 1523/udp
+ingreslock 1524/tcp #ingres
+ingreslock 1524/udp #ingres
+prospero-np 1525/tcp #Prospero Directory Service non-priv
+prospero-np 1525/udp #Prospero Directory Service non-priv
+#PROBLEMS!========================================================
+orasrv 1525/tcp #oracle
+orasrv 1525/udp #oracle
+#PROBLEMS!========================================================
+pdap-np 1526/tcp #Prospero Data Access Prot non-priv
+pdap-np 1526/udp #Prospero Data Access Prot non-priv
+tlisrv 1527/tcp #oracle
+tlisrv 1527/udp #oracle
+mciautoreg 1528/tcp
+mciautoreg 1528/udp
+support 1529/tcp prmsd gnatsd # cygnus bug tracker
+coauthor 1529/tcp #oracle
+coauthor 1529/udp #oracle
+rap-service 1530/tcp
+rap-service 1530/udp
+rap-listen 1531/tcp
+rap-listen 1531/udp
+miroconnect 1532/tcp
+miroconnect 1532/udp
+virtual-places 1533/tcp #Virtual Places Software
+virtual-places 1533/udp #Virtual Places Software
+micromuse-lm 1534/tcp
+micromuse-lm 1534/udp
+ampr-info 1535/tcp
+ampr-info 1535/udp
+ampr-inter 1536/tcp
+ampr-inter 1536/udp
+sdsc-lm 1537/tcp
+sdsc-lm 1537/udp
+3ds-lm 1538/tcp
+3ds-lm 1538/udp
+intellistor-lm 1539/tcp #Intellistor License Manager
+intellistor-lm 1539/udp #Intellistor License Manager
+rds 1540/tcp
+rds 1540/udp
+rds2 1541/tcp
+rds2 1541/udp
+gridgen-elmd 1542/tcp
+gridgen-elmd 1542/udp
+simba-cs 1543/tcp
+simba-cs 1543/udp
+aspeclmd 1544/tcp
+aspeclmd 1544/udp
+vistium-share 1545/tcp
+vistium-share 1545/udp
+abbaccuray 1546/tcp
+abbaccuray 1546/udp
+laplink 1547/tcp
+laplink 1547/udp
+axon-lm 1548/tcp #Axon License Manager
+axon-lm 1548/udp #Axon License Manager
+shivahose 1549/tcp #Shiva Hose
+shivasound 1549/udp #Shiva Sound
+3m-image-lm 1550/tcp #Image Storage license manager 3M Company
+3m-image-lm 1550/udp #Image Storage license manager 3M Company
+hecmtl-db 1551/tcp
+hecmtl-db 1551/udp
+pciarray 1552/tcp
+pciarray 1552/udp
+issd 1600/tcp
+issd 1600/udp
+# IMPORTANT NOTE: Ports 1645/1646 are the traditional radius ports used by
+# many vendors without obtaining official IANA assignment. The official
+# assignment is now ports 1812/1813 and users are encouraged to migrate
+# when possible to these new ports.
+#radius 1645/udp #RADIUS authentication protocol (old)
+#radacct 1646/udp #RADIUS accounting protocol (old)
+nkd 1650/tcp
+nkd 1650/udp
+shiva_confsrvr 1651/tcp
+shiva_confsrvr 1651/udp
+xnmp 1652/tcp
+xnmp 1652/udp
+netview-aix-1 1661/tcp
+netview-aix-1 1661/udp
+netview-aix-2 1662/tcp
+netview-aix-2 1662/udp
+netview-aix-3 1663/tcp
+netview-aix-3 1663/udp
+netview-aix-4 1664/tcp
+netview-aix-4 1664/udp
+netview-aix-5 1665/tcp
+netview-aix-5 1665/udp
+netview-aix-6 1666/tcp
+netview-aix-6 1666/udp
+netview-aix-7 1667/tcp
+netview-aix-7 1667/udp
+netview-aix-8 1668/tcp
+netview-aix-8 1668/udp
+netview-aix-9 1669/tcp
+netview-aix-9 1669/udp
+netview-aix-10 1670/tcp
+netview-aix-10 1670/udp
+netview-aix-11 1671/tcp
+netview-aix-11 1671/udp
+netview-aix-12 1672/tcp
+netview-aix-12 1672/udp
+l2f 1701/tcp #l2f
+l2f 1701/udp #l2f
+l2tp 1701/tcp #Layer 2 Tunnelling Protocol
+l2tp 1701/udp #Layer 2 Tunnelling Protocol
+pptp 1723/tcp #Point-to-point tunnelling protocol
+# IMPORTANT NOTE: See comments for ports 1645/1646 when using older equipment
+radius 1812/udp #RADIUS authentication protocol (IANA sanctioned)
+radacct 1813/udp #RADIUS accounting protocol (IANA sanctioned)
+licensedaemon 1986/tcp #cisco license management
+licensedaemon 1986/udp #cisco license management
+tr-rsrb-p1 1987/tcp #cisco RSRB Priority 1 port
+tr-rsrb-p1 1987/udp #cisco RSRB Priority 1 port
+tr-rsrb-p2 1988/tcp #cisco RSRB Priority 2 port
+tr-rsrb-p2 1988/udp #cisco RSRB Priority 2 port
+tr-rsrb-p3 1989/tcp #cisco RSRB Priority 3 port
+tr-rsrb-p3 1989/udp #cisco RSRB Priority 3 port
+#PROBLEMS!===================================================
+mshnet 1989/tcp #MHSnet system
+mshnet 1989/udp #MHSnet system
+#PROBLEMS!===================================================
+stun-p1 1990/tcp #cisco STUN Priority 1 port
+stun-p1 1990/udp #cisco STUN Priority 1 port
+stun-p2 1991/tcp #cisco STUN Priority 2 port
+stun-p2 1991/udp #cisco STUN Priority 2 port
+stun-p3 1992/tcp #cisco STUN Priority 3 port
+stun-p3 1992/udp #cisco STUN Priority 3 port
+#PROBLEMS!===================================================
+ipsendmsg 1992/tcp
+ipsendmsg 1992/udp
+#PROBLEMS!===================================================
+snmp-tcp-port 1993/tcp #cisco SNMP TCP port
+snmp-tcp-port 1993/udp #cisco SNMP TCP port
+stun-port 1994/tcp #cisco serial tunnel port
+stun-port 1994/udp #cisco serial tunnel port
+perf-port 1995/tcp #cisco perf port
+perf-port 1995/udp #cisco perf port
+tr-rsrb-port 1996/tcp #cisco Remote SRB port
+tr-rsrb-port 1996/udp #cisco Remote SRB port
+gdp-port 1997/tcp #cisco Gateway Discovery Protocol
+gdp-port 1997/udp #cisco Gateway Discovery Protocol
+x25-svc-port 1998/tcp #cisco X.25 service (XOT)
+x25-svc-port 1998/udp #cisco X.25 service (XOT)
+tcp-id-port 1999/tcp #cisco identification port
+tcp-id-port 1999/udp #cisco identification port
+callbook 2000/tcp
+callbook 2000/udp
+dc 2001/tcp
+wizard 2001/udp #curry
+globe 2002/tcp
+globe 2002/udp
+cfingerd 2003/tcp #GNU finger
+mailbox 2004/tcp
+emce 2004/udp #CCWS mm conf
+berknet 2005/tcp
+oracle 2005/udp
+invokator 2006/tcp
+raid-cc 2006/udp #raid
+dectalk 2007/tcp
+raid-am 2007/udp
+conf 2008/tcp
+terminaldb 2008/udp
+news 2009/tcp
+whosockami 2009/udp
+search 2010/tcp
+pipe_server 2010/udp
+raid-cc 2011/tcp #raid
+servserv 2011/udp
+ttyinfo 2012/tcp
+raid-ac 2012/udp
+raid-am 2013/tcp
+raid-cd 2013/udp
+troff 2014/tcp
+raid-sf 2014/udp
+cypress 2015/tcp
+raid-cs 2015/udp
+bootserver 2016/tcp
+bootserver 2016/udp
+cypress-stat 2017/tcp
+bootclient 2017/udp
+terminaldb 2018/tcp
+rellpack 2018/udp
+whosockami 2019/tcp
+about 2019/udp
+xinupageserver 2020/tcp
+xinupageserver 2020/udp
+servexec 2021/tcp
+xinuexpansion1 2021/udp
+down 2022/tcp
+xinuexpansion2 2022/udp
+xinuexpansion3 2023/tcp
+xinuexpansion3 2023/udp
+xinuexpansion4 2024/tcp
+xinuexpansion4 2024/udp
+ellpack 2025/tcp
+xribs 2025/udp
+scrabble 2026/tcp
+scrabble 2026/udp
+shadowserver 2027/tcp
+shadowserver 2027/udp
+submitserver 2028/tcp
+submitserver 2028/udp
+device2 2030/tcp
+device2 2030/udp
+blackboard 2032/tcp
+blackboard 2032/udp
+glogger 2033/tcp
+glogger 2033/udp
+scoremgr 2034/tcp
+scoremgr 2034/udp
+imsldoc 2035/tcp
+imsldoc 2035/udp
+objectmanager 2038/tcp
+objectmanager 2038/udp
+lam 2040/tcp
+lam 2040/udp
+interbase 2041/tcp
+interbase 2041/udp
+isis 2042/tcp
+isis 2042/udp
+isis-bcast 2043/tcp
+isis-bcast 2043/udp
+rimsl 2044/tcp
+rimsl 2044/udp
+cdfunc 2045/tcp
+cdfunc 2045/udp
+sdfunc 2046/tcp
+sdfunc 2046/udp
+#dls 2047/tcp
+#dls 2047/udp
+dls-monitor 2048/tcp
+dls-monitor 2048/udp
+nfsd 2049/tcp nfs # NFS server daemon
+nfsd 2049/udp nfs # NFS server daemon
+#PROBLEMS!=============================================================
+#shilp 2049/tcp
+#shilp 2049/udp
+#PROBLEMS!=============================================================
+dlsrpn 2065/tcp #Data Link Switch Read Port Number
+dlsrpn 2065/udp #Data Link Switch Read Port Number
+dlswpn 2067/tcp #Data Link Switch Write Port Number
+dlswpn 2067/udp #Data Link Switch Write Port Number
+zephyr-clt 2103/udp #Zephyr serv-hm connection
+zephyr-hm 2104/udp #Zephyr hostmanager
+#PROBLEMS!=============================================================
+#zephyr-hm-srv 2105/udp #Zephyr hm-serv connection
+#PROBLEMS!=============================================================
+eklogin 2105/tcp #Kerberos (v4) encrypted rlogin
+eklogin 2105/udp #Kerberos (v4) encrypted rlogin
+ekshell 2106/tcp #Kerberos (v4) encrypted rshell
+ekshell 2106/udp #Kerberos (v4) encrypted rshell
+rkinit 2108/tcp #Kerberos (v4) remote initialization
+rkinit 2108/udp #Kerberos (v4) remote initialization
+ats 2201/tcp #Advanced Training System Program
+ats 2201/udp #Advanced Training System Program
+ivs-video 2232/tcp #IVS Video default
+ivs-video 2232/udp #IVS Video default
+ivsd 2241/tcp #IVS Daemon
+ivsd 2241/udp #IVS Daemon
+pehelp 2307/tcp
+pehelp 2307/udp
+cvspserver 2401/tcp #CVS network server
+cvspserver 2401/udp #CVS network server
+venus 2430/tcp #venus
+venus 2430/udp #venus
+venus-se 2431/tcp #venus-se
+venus-se 2431/udp #venus-se
+codasrv 2432/tcp #codasrv
+codasrv 2432/udp #codasrv
+codasrv-se 2433/tcp #codasrv-se
+codasrv-se 2433/udp #codasrv-se
+rtsserv 2500/tcp #Resource Tracking system server
+rtsserv 2500/udp #Resource Tracking system server
+rtsclient 2501/tcp #Resource Tracking system client
+rtsclient 2501/udp #Resource Tracking system client
+hp-3000-telnet 2564/tcp #HP 3000 NS/VT block mode telnet
+zebrasrv 2600/tcp #zebra service
+zebra 2601/tcp #zebra vty
+ripd 2602/tcp #RIPd vty
+ripngd 2603/tcp #RIPngd vty
+ospfd 2604/tcp #OSPFd vty
+bgpd 2605/tcp #BGPd vty
+ospf6d 2606/tcp #OSPF6d vty
+listen 2766/tcp #System V listener port
+www-dev 2784/tcp #world wide web - development
+www-dev 2784/udp #world wide web - development
+dict 2628/tcp #RFC 2229
+dict 2628/udp #RFC 2229
+eppc 3031/tcp #Remote AppleEvents/PPC Toolbox
+eppc 3031/udp #Remote AppleEvents/PPC Toolbox
+NSWS 3049/tcp
+NSWS 3049/udp
+sj3 3086/tcp #SJ3 (kanji input)
+vmodem 3141/tcp
+vmodem 3141/udp
+ccmail 3264/tcp #cc:mail/lotus
+ccmail 3264/udp #cc:mail/lotus
+dec-notes 3333/tcp #DEC Notes
+dec-notes 3333/udp #DEC Notes
+rsvp-encap 3455/udp #RSVP encapsulated in UDP
+mapper-nodemgr 3984/tcp #MAPPER network node manager
+mapper-nodemgr 3984/udp #MAPPER network node manager
+mapper-mapethd 3985/tcp #MAPPER TCP/IP server
+mapper-mapethd 3985/udp #MAPPER TCP/IP server
+mapper-ws_ethd 3986/tcp #MAPPER workstation server
+mapper-ws_ethd 3986/udp #MAPPER workstation server
+bmap 3421/tcp #Bull Apprise portmapper
+bmap 3421/udp #Bull Apprise portmapper
+prsvp 3455/tcp #RSVP Port
+prsvp 3455/udp #RSVP Port
+vat 3456/tcp #VAT default data
+vat 3456/udp #VAT default data
+vat-control 3457/tcp #VAT default control
+vat-control 3457/udp #VAT default control
+udt_os 3900/tcp #Unidata UDT OS
+udt_os 3900/udp #Unidata UDT OS
+netcheque 4008/tcp #NetCheque accounting
+netcheque 4008/udp #NetCheque accounting
+lockd 4045/udp # NFS lock daemon/manager
+lockd 4045/tcp
+nuts_dem 4132/tcp #NUTS Daemon
+nuts_dem 4132/udp #NUTS Daemon
+nuts_bootp 4133/tcp #NUTS Bootp Server
+nuts_bootp 4133/udp #NUTS Bootp Server
+rwhois 4321/tcp #Remote Who Is
+rwhois 4321/udp #Remote Who Is
+unicall 4343/tcp
+unicall 4343/udp
+krb524 4444/tcp
+krb524 4444/udp
+# PROBLEM krb524 assigned the port,
+# PROBLEM nv used it without an assignment
+nv-video 4444/tcp #NV Video default
+nv-video 4444/udp #NV Video default
+sae-urn 4500/tcp
+sae-urn 4500/udp
+fax 4557/tcp #FAX transmission service
+hylafax 4559/tcp #HylaFAX client-server protocol
+rfa 4672/tcp #remote file access server
+rfa 4672/udp #remote file access server
+commplex-main 5000/tcp
+commplex-main 5000/udp
+commplex-link 5001/tcp
+commplex-link 5001/udp
+rfe 5002/tcp #radio free ethernet
+rfe 5002/udp #radio free ethernet
+telelpathstart 5010/tcp
+telelpathstart 5010/udp
+telelpathattack 5011/tcp
+telelpathattack 5011/udp
+mmcc 5050/tcp #multimedia conference control tool
+mmcc 5050/udp #multimedia conference control tool
+rmonitor_secure 5145/tcp
+rmonitor_secure 5145/udp
+aol 5190/tcp #America-Online
+aol 5190/udp #America-Online
+aol-1 5191/tcp #AmericaOnline1
+aol-1 5191/udp #AmericaOnline1
+aol-2 5192/tcp #AmericaOnline2
+aol-2 5192/udp #AmericaOnline2
+aol-3 5193/tcp #AmericaOnline3
+aol-3 5193/udp #AmericaOnline3
+jabber-client 5222/tcp #Jabber Client Connection
+jabber-client 5222/udp #Jabber Client Connection
+padl2sim 5236/tcp
+padl2sim 5236/udp
+jabber-server 5269/tcp #Jabber Server Connection
+jabber-server 5269/udp #Jabber Server Connection
+hacl-hb 5300/tcp # HA cluster heartbeat
+hacl-hb 5300/udp # HA cluster heartbeat
+hacl-gs 5301/tcp # HA cluster general services
+hacl-gs 5301/udp # HA cluster general services
+hacl-cfg 5302/tcp # HA cluster configuration
+hacl-cfg 5302/udp # HA cluster configuration
+hacl-probe 5303/tcp # HA cluster probing
+hacl-probe 5303/udp # HA cluster probing
+hacl-local 5304/tcp
+hacl-local 5304/udp
+hacl-test 5305/tcp
+hacl-test 5305/udp
+cfengine 5308/tcp
+cfengine 5308/udp
+postgresql 5432/tcp #PostgreSQL Database
+postgresql 5432/udp #PostgreSQL Database
+rplay 5555/udp
+canna 5680/tcp #Canna (Japanese Input)
+proshareaudio 5713/tcp #proshare conf audio
+proshareaudio 5713/udp #proshare conf audio
+prosharevideo 5714/tcp #proshare conf video
+prosharevideo 5714/udp #proshare conf video
+prosharedata 5715/tcp #proshare conf data
+prosharedata 5715/udp #proshare conf data
+prosharerequest 5716/tcp #proshare conf request
+prosharerequest 5716/udp #proshare conf request
+prosharenotify 5717/tcp #proshare conf notify
+prosharenotify 5717/udp #proshare conf notify
+cvsup 5999/tcp #CVSup file transfer/John Polstra/FreeBSD
+x11 6000/tcp #6000-6063 are assigned to X Window System
+x11 6000/udp
+x11-ssh 6010/tcp #Unofficial name, for convenience
+x11-ssh 6010/udp
+softcm 6110/tcp #HP SoftBench CM
+softcm 6110/udp #HP SoftBench CM
+spc 6111/tcp #HP SoftBench Sub-Process Control
+spc 6111/udp #HP SoftBench Sub-Process Control
+meta-corp 6141/tcp #Meta Corporation License Manager
+meta-corp 6141/udp #Meta Corporation License Manager
+aspentec-lm 6142/tcp #Aspen Technology License Manager
+aspentec-lm 6142/udp #Aspen Technology License Manager
+watershed-lm 6143/tcp #Watershed License Manager
+watershed-lm 6143/udp #Watershed License Manager
+statsci1-lm 6144/tcp #StatSci License Manager - 1
+statsci1-lm 6144/udp #StatSci License Manager - 1
+statsci2-lm 6145/tcp #StatSci License Manager - 2
+statsci2-lm 6145/udp #StatSci License Manager - 2
+lonewolf-lm 6146/tcp #Lone Wolf Systems License Manager
+lonewolf-lm 6146/udp #Lone Wolf Systems License Manager
+montage-lm 6147/tcp #Montage License Manager
+montage-lm 6147/udp #Montage License Manager
+ricardo-lm 6148/tcp #Ricardo North America License Manager
+ricardo-lm 6148/udp #Ricardo North America License Manager
+xdsxdm 6558/tcp
+xdsxdm 6558/udp
+ircd 6667/tcp #Internet Relay Chat (unoffical)
+acmsoda 6969/tcp
+acmsoda 6969/udp
+afs3-fileserver 7000/tcp #file server itself
+afs3-fileserver 7000/udp #file server itself
+afs3-callback 7001/tcp #callbacks to cache managers
+afs3-callback 7001/udp #callbacks to cache managers
+afs3-prserver 7002/tcp #users & groups database
+afs3-prserver 7002/udp #users & groups database
+afs3-vlserver 7003/tcp #volume location database
+afs3-vlserver 7003/udp #volume location database
+afs3-kaserver 7004/tcp #AFS/Kerberos authentication service
+afs3-kaserver 7004/udp #AFS/Kerberos authentication service
+afs3-volser 7005/tcp #volume management server
+afs3-volser 7005/udp #volume management server
+afs3-errors 7006/tcp #error interpretation service
+afs3-errors 7006/udp #error interpretation service
+afs3-bos 7007/tcp #basic overseer process
+afs3-bos 7007/udp #basic overseer process
+afs3-update 7008/tcp #server-to-server updater
+afs3-update 7008/udp #server-to-server updater
+afs3-rmtsys 7009/tcp #remote cache manager service
+afs3-rmtsys 7009/udp #remote cache manager service
+afs3-resserver 7010/tcp #MR-AFS residence server
+afs3-resserver 7010/udp #MR-AFS residence server
+afs3-remio 7011/tcp #MR-AFS remote IO server
+afs3-remio 7011/udp #MR-AFS remote IO server
+ups-onlinet 7010/tcp #onlinet uninterruptable power supplies
+ups-onlinet 7010/udp #onlinet uninterruptable power supplies
+font-service 7100/tcp #X Font Service
+font-service 7100/udp #X Font Service
+fodms 7200/tcp #FODMS FLIP
+fodms 7200/udp #FODMS FLIP
+dlip 7201/tcp
+dlip 7201/udp
+ftp-proxy 8021/tcp # pf ftp-proxy
+spamd 8025/tcp # spamd(8)
+spamd-sync 8025/udp # spamd(8) synchronisation
+spamd-cfg 8026/tcp # spamd(8) configuration
+natd 8668/divert # Network Address Translation
+jetdirect 9100/tcp #HP JetDirect card
+man 9535/tcp
+man 9535/udp
+sd 9876/tcp #Session Director
+sd 9876/udp #Session Director
+amanda 10080/udp #Dump server control
+amandaidx 10082/tcp #Amanda indexing
+amidxtape 10083/tcp #Amanda tape indexing
+isode-dua 17007/tcp
+isode-dua 17007/udp
+biimenu 18000/tcp #Beckman Instruments, Inc.
+biimenu 18000/udp #Beckman Instruments, Inc.
+19000 19000/tcp # pfSense nat bouncing
+19000 19000/udp # pfSense nat bouncing
+19001 19001/tcp # pfSense nat bouncing
+19001 19001/udp # pfSense nat bouncing
+19002 19002/tcp # pfSense nat bouncing
+19002 19002/udp # pfSense nat bouncing
+19003 19003/tcp # pfSense nat bouncing
+19003 19003/udp # pfSense nat bouncing
+19004 19004/tcp # pfSense nat bouncing
+19004 19004/udp # pfSense nat bouncing
+19005 19005/tcp # pfSense nat bouncing
+19005 19005/udp # pfSense nat bouncing
+19006 19006/tcp # pfSense nat bouncing
+19006 19006/udp # pfSense nat bouncing
+19007 19007/tcp # pfSense nat bouncing
+19007 19007/udp # pfSense nat bouncing
+19008 19008/tcp # pfSense nat bouncing
+19008 19008/udp # pfSense nat bouncing
+19009 19009/tcp # pfSense nat bouncing
+19009 19009/udp # pfSense nat bouncing
+19010 19010/tcp # pfSense nat bouncing
+19010 19010/udp # pfSense nat bouncing
+19011 19011/tcp # pfSense nat bouncing
+19011 19011/udp # pfSense nat bouncing
+19012 19012/tcp # pfSense nat bouncing
+19012 19012/udp # pfSense nat bouncing
+19013 19013/tcp # pfSense nat bouncing
+19013 19013/udp # pfSense nat bouncing
+19014 19014/tcp # pfSense nat bouncing
+19014 19014/udp # pfSense nat bouncing
+19015 19015/tcp # pfSense nat bouncing
+19015 19015/udp # pfSense nat bouncing
+19016 19016/tcp # pfSense nat bouncing
+19016 19016/udp # pfSense nat bouncing
+19017 19017/tcp # pfSense nat bouncing
+19017 19017/udp # pfSense nat bouncing
+19018 19018/tcp # pfSense nat bouncing
+19018 19018/udp # pfSense nat bouncing
+19019 19019/tcp # pfSense nat bouncing
+19019 19019/udp # pfSense nat bouncing
+19020 19020/tcp # pfSense nat bouncing
+19020 19020/udp # pfSense nat bouncing
+19021 19021/tcp # pfSense nat bouncing
+19021 19021/udp # pfSense nat bouncing
+19022 19022/tcp # pfSense nat bouncing
+19022 19022/udp # pfSense nat bouncing
+19023 19023/tcp # pfSense nat bouncing
+19023 19023/udp # pfSense nat bouncing
+19024 19024/tcp # pfSense nat bouncing
+19024 19024/udp # pfSense nat bouncing
+19025 19025/tcp # pfSense nat bouncing
+19025 19025/udp # pfSense nat bouncing
+19026 19026/tcp # pfSense nat bouncing
+19026 19026/udp # pfSense nat bouncing
+19027 19027/tcp # pfSense nat bouncing
+19027 19027/udp # pfSense nat bouncing
+19028 19028/tcp # pfSense nat bouncing
+19028 19028/udp # pfSense nat bouncing
+19029 19029/tcp # pfSense nat bouncing
+19029 19029/udp # pfSense nat bouncing
+19030 19030/tcp # pfSense nat bouncing
+19030 19030/udp # pfSense nat bouncing
+19031 19031/tcp # pfSense nat bouncing
+19031 19031/udp # pfSense nat bouncing
+19032 19032/tcp # pfSense nat bouncing
+19032 19032/udp # pfSense nat bouncing
+19033 19033/tcp # pfSense nat bouncing
+19033 19033/udp # pfSense nat bouncing
+19034 19034/tcp # pfSense nat bouncing
+19034 19034/udp # pfSense nat bouncing
+19035 19035/tcp # pfSense nat bouncing
+19035 19035/udp # pfSense nat bouncing
+19036 19036/tcp # pfSense nat bouncing
+19036 19036/udp # pfSense nat bouncing
+19037 19037/tcp # pfSense nat bouncing
+19037 19037/udp # pfSense nat bouncing
+19038 19038/tcp # pfSense nat bouncing
+19038 19038/udp # pfSense nat bouncing
+19039 19039/tcp # pfSense nat bouncing
+19039 19039/udp # pfSense nat bouncing
+19040 19040/tcp # pfSense nat bouncing
+19040 19040/udp # pfSense nat bouncing
+19041 19041/tcp # pfSense nat bouncing
+19041 19041/udp # pfSense nat bouncing
+19042 19042/tcp # pfSense nat bouncing
+19042 19042/udp # pfSense nat bouncing
+19043 19043/tcp # pfSense nat bouncing
+19043 19043/udp # pfSense nat bouncing
+19044 19044/tcp # pfSense nat bouncing
+19044 19044/udp # pfSense nat bouncing
+19045 19045/tcp # pfSense nat bouncing
+19045 19045/udp # pfSense nat bouncing
+19046 19046/tcp # pfSense nat bouncing
+19046 19046/udp # pfSense nat bouncing
+19047 19047/tcp # pfSense nat bouncing
+19047 19047/udp # pfSense nat bouncing
+19048 19048/tcp # pfSense nat bouncing
+19048 19048/udp # pfSense nat bouncing
+19049 19049/tcp # pfSense nat bouncing
+19049 19049/udp # pfSense nat bouncing
+19050 19050/tcp # pfSense nat bouncing
+19050 19050/udp # pfSense nat bouncing
+19051 19051/tcp # pfSense nat bouncing
+19051 19051/udp # pfSense nat bouncing
+19052 19052/tcp # pfSense nat bouncing
+19052 19052/udp # pfSense nat bouncing
+19053 19053/tcp # pfSense nat bouncing
+19053 19053/udp # pfSense nat bouncing
+19054 19054/tcp # pfSense nat bouncing
+19054 19054/udp # pfSense nat bouncing
+19055 19055/tcp # pfSense nat bouncing
+19055 19055/udp # pfSense nat bouncing
+19056 19056/tcp # pfSense nat bouncing
+19056 19056/udp # pfSense nat bouncing
+19057 19057/tcp # pfSense nat bouncing
+19057 19057/udp # pfSense nat bouncing
+19058 19058/tcp # pfSense nat bouncing
+19058 19058/udp # pfSense nat bouncing
+19059 19059/tcp # pfSense nat bouncing
+19059 19059/udp # pfSense nat bouncing
+19060 19060/tcp # pfSense nat bouncing
+19060 19060/udp # pfSense nat bouncing
+19061 19061/tcp # pfSense nat bouncing
+19061 19061/udp # pfSense nat bouncing
+19062 19062/tcp # pfSense nat bouncing
+19062 19062/udp # pfSense nat bouncing
+19063 19063/tcp # pfSense nat bouncing
+19063 19063/udp # pfSense nat bouncing
+19064 19064/tcp # pfSense nat bouncing
+19064 19064/udp # pfSense nat bouncing
+19065 19065/tcp # pfSense nat bouncing
+19065 19065/udp # pfSense nat bouncing
+19066 19066/tcp # pfSense nat bouncing
+19066 19066/udp # pfSense nat bouncing
+19067 19067/tcp # pfSense nat bouncing
+19067 19067/udp # pfSense nat bouncing
+19068 19068/tcp # pfSense nat bouncing
+19068 19068/udp # pfSense nat bouncing
+19069 19069/tcp # pfSense nat bouncing
+19069 19069/udp # pfSense nat bouncing
+19070 19070/tcp # pfSense nat bouncing
+19070 19070/udp # pfSense nat bouncing
+19071 19071/tcp # pfSense nat bouncing
+19071 19071/udp # pfSense nat bouncing
+19072 19072/tcp # pfSense nat bouncing
+19072 19072/udp # pfSense nat bouncing
+19073 19073/tcp # pfSense nat bouncing
+19073 19073/udp # pfSense nat bouncing
+19074 19074/tcp # pfSense nat bouncing
+19074 19074/udp # pfSense nat bouncing
+19075 19075/tcp # pfSense nat bouncing
+19075 19075/udp # pfSense nat bouncing
+19076 19076/tcp # pfSense nat bouncing
+19076 19076/udp # pfSense nat bouncing
+19077 19077/tcp # pfSense nat bouncing
+19077 19077/udp # pfSense nat bouncing
+19078 19078/tcp # pfSense nat bouncing
+19078 19078/udp # pfSense nat bouncing
+19079 19079/tcp # pfSense nat bouncing
+19079 19079/udp # pfSense nat bouncing
+19080 19080/tcp # pfSense nat bouncing
+19080 19080/udp # pfSense nat bouncing
+19081 19081/tcp # pfSense nat bouncing
+19081 19081/udp # pfSense nat bouncing
+19082 19082/tcp # pfSense nat bouncing
+19082 19082/udp # pfSense nat bouncing
+19083 19083/tcp # pfSense nat bouncing
+19083 19083/udp # pfSense nat bouncing
+19084 19084/tcp # pfSense nat bouncing
+19084 19084/udp # pfSense nat bouncing
+19085 19085/tcp # pfSense nat bouncing
+19085 19085/udp # pfSense nat bouncing
+19086 19086/tcp # pfSense nat bouncing
+19086 19086/udp # pfSense nat bouncing
+19087 19087/tcp # pfSense nat bouncing
+19087 19087/udp # pfSense nat bouncing
+19088 19088/tcp # pfSense nat bouncing
+19088 19088/udp # pfSense nat bouncing
+19089 19089/tcp # pfSense nat bouncing
+19089 19089/udp # pfSense nat bouncing
+19090 19090/tcp # pfSense nat bouncing
+19090 19090/udp # pfSense nat bouncing
+19091 19091/tcp # pfSense nat bouncing
+19091 19091/udp # pfSense nat bouncing
+19092 19092/tcp # pfSense nat bouncing
+19092 19092/udp # pfSense nat bouncing
+19093 19093/tcp # pfSense nat bouncing
+19093 19093/udp # pfSense nat bouncing
+19094 19094/tcp # pfSense nat bouncing
+19094 19094/udp # pfSense nat bouncing
+19095 19095/tcp # pfSense nat bouncing
+19095 19095/udp # pfSense nat bouncing
+19096 19096/tcp # pfSense nat bouncing
+19096 19096/udp # pfSense nat bouncing
+19097 19097/tcp # pfSense nat bouncing
+19097 19097/udp # pfSense nat bouncing
+19098 19098/tcp # pfSense nat bouncing
+19098 19098/udp # pfSense nat bouncing
+19099 19099/tcp # pfSense nat bouncing
+19099 19099/udp # pfSense nat bouncing
+19100 19100/tcp # pfSense nat bouncing
+19100 19100/udp # pfSense nat bouncing
+19101 19101/tcp # pfSense nat bouncing
+19101 19101/udp # pfSense nat bouncing
+19102 19102/tcp # pfSense nat bouncing
+19102 19102/udp # pfSense nat bouncing
+19103 19103/tcp # pfSense nat bouncing
+19103 19103/udp # pfSense nat bouncing
+19104 19104/tcp # pfSense nat bouncing
+19104 19104/udp # pfSense nat bouncing
+19105 19105/tcp # pfSense nat bouncing
+19105 19105/udp # pfSense nat bouncing
+19106 19106/tcp # pfSense nat bouncing
+19106 19106/udp # pfSense nat bouncing
+19107 19107/tcp # pfSense nat bouncing
+19107 19107/udp # pfSense nat bouncing
+19108 19108/tcp # pfSense nat bouncing
+19108 19108/udp # pfSense nat bouncing
+19109 19109/tcp # pfSense nat bouncing
+19109 19109/udp # pfSense nat bouncing
+19110 19110/tcp # pfSense nat bouncing
+19110 19110/udp # pfSense nat bouncing
+19111 19111/tcp # pfSense nat bouncing
+19111 19111/udp # pfSense nat bouncing
+19112 19112/tcp # pfSense nat bouncing
+19112 19112/udp # pfSense nat bouncing
+19113 19113/tcp # pfSense nat bouncing
+19113 19113/udp # pfSense nat bouncing
+19114 19114/tcp # pfSense nat bouncing
+19114 19114/udp # pfSense nat bouncing
+19115 19115/tcp # pfSense nat bouncing
+19115 19115/udp # pfSense nat bouncing
+19116 19116/tcp # pfSense nat bouncing
+19116 19116/udp # pfSense nat bouncing
+19117 19117/tcp # pfSense nat bouncing
+19117 19117/udp # pfSense nat bouncing
+19118 19118/tcp # pfSense nat bouncing
+19118 19118/udp # pfSense nat bouncing
+19119 19119/tcp # pfSense nat bouncing
+19119 19119/udp # pfSense nat bouncing
+19120 19120/tcp # pfSense nat bouncing
+19120 19120/udp # pfSense nat bouncing
+19121 19121/tcp # pfSense nat bouncing
+19121 19121/udp # pfSense nat bouncing
+19122 19122/tcp # pfSense nat bouncing
+19122 19122/udp # pfSense nat bouncing
+19123 19123/tcp # pfSense nat bouncing
+19123 19123/udp # pfSense nat bouncing
+19124 19124/tcp # pfSense nat bouncing
+19124 19124/udp # pfSense nat bouncing
+19125 19125/tcp # pfSense nat bouncing
+19125 19125/udp # pfSense nat bouncing
+19126 19126/tcp # pfSense nat bouncing
+19126 19126/udp # pfSense nat bouncing
+19127 19127/tcp # pfSense nat bouncing
+19127 19127/udp # pfSense nat bouncing
+19128 19128/tcp # pfSense nat bouncing
+19128 19128/udp # pfSense nat bouncing
+19129 19129/tcp # pfSense nat bouncing
+19129 19129/udp # pfSense nat bouncing
+19130 19130/tcp # pfSense nat bouncing
+19130 19130/udp # pfSense nat bouncing
+19131 19131/tcp # pfSense nat bouncing
+19131 19131/udp # pfSense nat bouncing
+19132 19132/tcp # pfSense nat bouncing
+19132 19132/udp # pfSense nat bouncing
+19133 19133/tcp # pfSense nat bouncing
+19133 19133/udp # pfSense nat bouncing
+19134 19134/tcp # pfSense nat bouncing
+19134 19134/udp # pfSense nat bouncing
+19135 19135/tcp # pfSense nat bouncing
+19135 19135/udp # pfSense nat bouncing
+19136 19136/tcp # pfSense nat bouncing
+19136 19136/udp # pfSense nat bouncing
+19137 19137/tcp # pfSense nat bouncing
+19137 19137/udp # pfSense nat bouncing
+19138 19138/tcp # pfSense nat bouncing
+19138 19138/udp # pfSense nat bouncing
+19139 19139/tcp # pfSense nat bouncing
+19139 19139/udp # pfSense nat bouncing
+19140 19140/tcp # pfSense nat bouncing
+19140 19140/udp # pfSense nat bouncing
+19141 19141/tcp # pfSense nat bouncing
+19141 19141/udp # pfSense nat bouncing
+19142 19142/tcp # pfSense nat bouncing
+19142 19142/udp # pfSense nat bouncing
+19143 19143/tcp # pfSense nat bouncing
+19143 19143/udp # pfSense nat bouncing
+19144 19144/tcp # pfSense nat bouncing
+19144 19144/udp # pfSense nat bouncing
+19145 19145/tcp # pfSense nat bouncing
+19145 19145/udp # pfSense nat bouncing
+19146 19146/tcp # pfSense nat bouncing
+19146 19146/udp # pfSense nat bouncing
+19147 19147/tcp # pfSense nat bouncing
+19147 19147/udp # pfSense nat bouncing
+19148 19148/tcp # pfSense nat bouncing
+19148 19148/udp # pfSense nat bouncing
+19149 19149/tcp # pfSense nat bouncing
+19149 19149/udp # pfSense nat bouncing
+19150 19150/tcp # pfSense nat bouncing
+19150 19150/udp # pfSense nat bouncing
+19151 19151/tcp # pfSense nat bouncing
+19151 19151/udp # pfSense nat bouncing
+19152 19152/tcp # pfSense nat bouncing
+19152 19152/udp # pfSense nat bouncing
+19153 19153/tcp # pfSense nat bouncing
+19153 19153/udp # pfSense nat bouncing
+19154 19154/tcp # pfSense nat bouncing
+19154 19154/udp # pfSense nat bouncing
+19155 19155/tcp # pfSense nat bouncing
+19155 19155/udp # pfSense nat bouncing
+19156 19156/tcp # pfSense nat bouncing
+19156 19156/udp # pfSense nat bouncing
+19157 19157/tcp # pfSense nat bouncing
+19157 19157/udp # pfSense nat bouncing
+19158 19158/tcp # pfSense nat bouncing
+19158 19158/udp # pfSense nat bouncing
+19159 19159/tcp # pfSense nat bouncing
+19159 19159/udp # pfSense nat bouncing
+19160 19160/tcp # pfSense nat bouncing
+19160 19160/udp # pfSense nat bouncing
+19161 19161/tcp # pfSense nat bouncing
+19161 19161/udp # pfSense nat bouncing
+19162 19162/tcp # pfSense nat bouncing
+19162 19162/udp # pfSense nat bouncing
+19163 19163/tcp # pfSense nat bouncing
+19163 19163/udp # pfSense nat bouncing
+19164 19164/tcp # pfSense nat bouncing
+19164 19164/udp # pfSense nat bouncing
+19165 19165/tcp # pfSense nat bouncing
+19165 19165/udp # pfSense nat bouncing
+19166 19166/tcp # pfSense nat bouncing
+19166 19166/udp # pfSense nat bouncing
+19167 19167/tcp # pfSense nat bouncing
+19167 19167/udp # pfSense nat bouncing
+19168 19168/tcp # pfSense nat bouncing
+19168 19168/udp # pfSense nat bouncing
+19169 19169/tcp # pfSense nat bouncing
+19169 19169/udp # pfSense nat bouncing
+19170 19170/tcp # pfSense nat bouncing
+19170 19170/udp # pfSense nat bouncing
+19171 19171/tcp # pfSense nat bouncing
+19171 19171/udp # pfSense nat bouncing
+19172 19172/tcp # pfSense nat bouncing
+19172 19172/udp # pfSense nat bouncing
+19173 19173/tcp # pfSense nat bouncing
+19173 19173/udp # pfSense nat bouncing
+19174 19174/tcp # pfSense nat bouncing
+19174 19174/udp # pfSense nat bouncing
+19175 19175/tcp # pfSense nat bouncing
+19175 19175/udp # pfSense nat bouncing
+19176 19176/tcp # pfSense nat bouncing
+19176 19176/udp # pfSense nat bouncing
+19177 19177/tcp # pfSense nat bouncing
+19177 19177/udp # pfSense nat bouncing
+19178 19178/tcp # pfSense nat bouncing
+19178 19178/udp # pfSense nat bouncing
+19179 19179/tcp # pfSense nat bouncing
+19179 19179/udp # pfSense nat bouncing
+19180 19180/tcp # pfSense nat bouncing
+19180 19180/udp # pfSense nat bouncing
+19181 19181/tcp # pfSense nat bouncing
+19181 19181/udp # pfSense nat bouncing
+19182 19182/tcp # pfSense nat bouncing
+19182 19182/udp # pfSense nat bouncing
+19183 19183/tcp # pfSense nat bouncing
+19183 19183/udp # pfSense nat bouncing
+19184 19184/tcp # pfSense nat bouncing
+19184 19184/udp # pfSense nat bouncing
+19185 19185/tcp # pfSense nat bouncing
+19185 19185/udp # pfSense nat bouncing
+19186 19186/tcp # pfSense nat bouncing
+19186 19186/udp # pfSense nat bouncing
+19187 19187/tcp # pfSense nat bouncing
+19187 19187/udp # pfSense nat bouncing
+19188 19188/tcp # pfSense nat bouncing
+19188 19188/udp # pfSense nat bouncing
+19189 19189/tcp # pfSense nat bouncing
+19189 19189/udp # pfSense nat bouncing
+19190 19190/tcp # pfSense nat bouncing
+19190 19190/udp # pfSense nat bouncing
+19191 19191/tcp # pfSense nat bouncing
+19191 19191/udp # pfSense nat bouncing
+19192 19192/tcp # pfSense nat bouncing
+19192 19192/udp # pfSense nat bouncing
+19193 19193/tcp # pfSense nat bouncing
+19193 19193/udp # pfSense nat bouncing
+19194 19194/tcp # pfSense nat bouncing
+19194 19194/udp # pfSense nat bouncing
+19195 19195/tcp # pfSense nat bouncing
+19195 19195/udp # pfSense nat bouncing
+19196 19196/tcp # pfSense nat bouncing
+19196 19196/udp # pfSense nat bouncing
+19197 19197/tcp # pfSense nat bouncing
+19197 19197/udp # pfSense nat bouncing
+19198 19198/tcp # pfSense nat bouncing
+19198 19198/udp # pfSense nat bouncing
+19199 19199/tcp # pfSense nat bouncing
+19199 19199/udp # pfSense nat bouncing
+19200 19200/tcp # pfSense nat bouncing
+19200 19200/udp # pfSense nat bouncing
+19201 19201/tcp # pfSense nat bouncing
+19201 19201/udp # pfSense nat bouncing
+19202 19202/tcp # pfSense nat bouncing
+19202 19202/udp # pfSense nat bouncing
+19203 19203/tcp # pfSense nat bouncing
+19203 19203/udp # pfSense nat bouncing
+19204 19204/tcp # pfSense nat bouncing
+19204 19204/udp # pfSense nat bouncing
+19205 19205/tcp # pfSense nat bouncing
+19205 19205/udp # pfSense nat bouncing
+19206 19206/tcp # pfSense nat bouncing
+19206 19206/udp # pfSense nat bouncing
+19207 19207/tcp # pfSense nat bouncing
+19207 19207/udp # pfSense nat bouncing
+19208 19208/tcp # pfSense nat bouncing
+19208 19208/udp # pfSense nat bouncing
+19209 19209/tcp # pfSense nat bouncing
+19209 19209/udp # pfSense nat bouncing
+19210 19210/tcp # pfSense nat bouncing
+19210 19210/udp # pfSense nat bouncing
+19211 19211/tcp # pfSense nat bouncing
+19211 19211/udp # pfSense nat bouncing
+19212 19212/tcp # pfSense nat bouncing
+19212 19212/udp # pfSense nat bouncing
+19213 19213/tcp # pfSense nat bouncing
+19213 19213/udp # pfSense nat bouncing
+19214 19214/tcp # pfSense nat bouncing
+19214 19214/udp # pfSense nat bouncing
+19215 19215/tcp # pfSense nat bouncing
+19215 19215/udp # pfSense nat bouncing
+19216 19216/tcp # pfSense nat bouncing
+19216 19216/udp # pfSense nat bouncing
+19217 19217/tcp # pfSense nat bouncing
+19217 19217/udp # pfSense nat bouncing
+19218 19218/tcp # pfSense nat bouncing
+19218 19218/udp # pfSense nat bouncing
+19219 19219/tcp # pfSense nat bouncing
+19219 19219/udp # pfSense nat bouncing
+19220 19220/tcp # pfSense nat bouncing
+19220 19220/udp # pfSense nat bouncing
+19221 19221/tcp # pfSense nat bouncing
+19221 19221/udp # pfSense nat bouncing
+19222 19222/tcp # pfSense nat bouncing
+19222 19222/udp # pfSense nat bouncing
+19223 19223/tcp # pfSense nat bouncing
+19223 19223/udp # pfSense nat bouncing
+19224 19224/tcp # pfSense nat bouncing
+19224 19224/udp # pfSense nat bouncing
+19225 19225/tcp # pfSense nat bouncing
+19225 19225/udp # pfSense nat bouncing
+19226 19226/tcp # pfSense nat bouncing
+19226 19226/udp # pfSense nat bouncing
+19227 19227/tcp # pfSense nat bouncing
+19227 19227/udp # pfSense nat bouncing
+19228 19228/tcp # pfSense nat bouncing
+19228 19228/udp # pfSense nat bouncing
+19229 19229/tcp # pfSense nat bouncing
+19229 19229/udp # pfSense nat bouncing
+19230 19230/tcp # pfSense nat bouncing
+19230 19230/udp # pfSense nat bouncing
+19231 19231/tcp # pfSense nat bouncing
+19231 19231/udp # pfSense nat bouncing
+19232 19232/tcp # pfSense nat bouncing
+19232 19232/udp # pfSense nat bouncing
+19233 19233/tcp # pfSense nat bouncing
+19233 19233/udp # pfSense nat bouncing
+19234 19234/tcp # pfSense nat bouncing
+19234 19234/udp # pfSense nat bouncing
+19235 19235/tcp # pfSense nat bouncing
+19235 19235/udp # pfSense nat bouncing
+19236 19236/tcp # pfSense nat bouncing
+19236 19236/udp # pfSense nat bouncing
+19237 19237/tcp # pfSense nat bouncing
+19237 19237/udp # pfSense nat bouncing
+19238 19238/tcp # pfSense nat bouncing
+19238 19238/udp # pfSense nat bouncing
+19239 19239/tcp # pfSense nat bouncing
+19239 19239/udp # pfSense nat bouncing
+19240 19240/tcp # pfSense nat bouncing
+19240 19240/udp # pfSense nat bouncing
+19241 19241/tcp # pfSense nat bouncing
+19241 19241/udp # pfSense nat bouncing
+19242 19242/tcp # pfSense nat bouncing
+19242 19242/udp # pfSense nat bouncing
+19243 19243/tcp # pfSense nat bouncing
+19243 19243/udp # pfSense nat bouncing
+19244 19244/tcp # pfSense nat bouncing
+19244 19244/udp # pfSense nat bouncing
+19245 19245/tcp # pfSense nat bouncing
+19245 19245/udp # pfSense nat bouncing
+19246 19246/tcp # pfSense nat bouncing
+19246 19246/udp # pfSense nat bouncing
+19247 19247/tcp # pfSense nat bouncing
+19247 19247/udp # pfSense nat bouncing
+19248 19248/tcp # pfSense nat bouncing
+19248 19248/udp # pfSense nat bouncing
+19249 19249/tcp # pfSense nat bouncing
+19249 19249/udp # pfSense nat bouncing
+19250 19250/tcp # pfSense nat bouncing
+19250 19250/udp # pfSense nat bouncing
+19251 19251/tcp # pfSense nat bouncing
+19251 19251/udp # pfSense nat bouncing
+19252 19252/tcp # pfSense nat bouncing
+19252 19252/udp # pfSense nat bouncing
+19253 19253/tcp # pfSense nat bouncing
+19253 19253/udp # pfSense nat bouncing
+19254 19254/tcp # pfSense nat bouncing
+19254 19254/udp # pfSense nat bouncing
+19255 19255/tcp # pfSense nat bouncing
+19255 19255/udp # pfSense nat bouncing
+19256 19256/tcp # pfSense nat bouncing
+19256 19256/udp # pfSense nat bouncing
+19257 19257/tcp # pfSense nat bouncing
+19257 19257/udp # pfSense nat bouncing
+19258 19258/tcp # pfSense nat bouncing
+19258 19258/udp # pfSense nat bouncing
+19259 19259/tcp # pfSense nat bouncing
+19259 19259/udp # pfSense nat bouncing
+19260 19260/tcp # pfSense nat bouncing
+19260 19260/udp # pfSense nat bouncing
+19261 19261/tcp # pfSense nat bouncing
+19261 19261/udp # pfSense nat bouncing
+19262 19262/tcp # pfSense nat bouncing
+19262 19262/udp # pfSense nat bouncing
+19263 19263/tcp # pfSense nat bouncing
+19263 19263/udp # pfSense nat bouncing
+19264 19264/tcp # pfSense nat bouncing
+19264 19264/udp # pfSense nat bouncing
+19265 19265/tcp # pfSense nat bouncing
+19265 19265/udp # pfSense nat bouncing
+19266 19266/tcp # pfSense nat bouncing
+19266 19266/udp # pfSense nat bouncing
+19267 19267/tcp # pfSense nat bouncing
+19267 19267/udp # pfSense nat bouncing
+19268 19268/tcp # pfSense nat bouncing
+19268 19268/udp # pfSense nat bouncing
+19269 19269/tcp # pfSense nat bouncing
+19269 19269/udp # pfSense nat bouncing
+19270 19270/tcp # pfSense nat bouncing
+19270 19270/udp # pfSense nat bouncing
+19271 19271/tcp # pfSense nat bouncing
+19271 19271/udp # pfSense nat bouncing
+19272 19272/tcp # pfSense nat bouncing
+19272 19272/udp # pfSense nat bouncing
+19273 19273/tcp # pfSense nat bouncing
+19273 19273/udp # pfSense nat bouncing
+19274 19274/tcp # pfSense nat bouncing
+19274 19274/udp # pfSense nat bouncing
+19275 19275/tcp # pfSense nat bouncing
+19275 19275/udp # pfSense nat bouncing
+19276 19276/tcp # pfSense nat bouncing
+19276 19276/udp # pfSense nat bouncing
+19277 19277/tcp # pfSense nat bouncing
+19277 19277/udp # pfSense nat bouncing
+19278 19278/tcp # pfSense nat bouncing
+19278 19278/udp # pfSense nat bouncing
+19279 19279/tcp # pfSense nat bouncing
+19279 19279/udp # pfSense nat bouncing
+19280 19280/tcp # pfSense nat bouncing
+19280 19280/udp # pfSense nat bouncing
+19281 19281/tcp # pfSense nat bouncing
+19281 19281/udp # pfSense nat bouncing
+19282 19282/tcp # pfSense nat bouncing
+19282 19282/udp # pfSense nat bouncing
+19283 19283/tcp # pfSense nat bouncing
+19283 19283/udp # pfSense nat bouncing
+19284 19284/tcp # pfSense nat bouncing
+19284 19284/udp # pfSense nat bouncing
+19285 19285/tcp # pfSense nat bouncing
+19285 19285/udp # pfSense nat bouncing
+19286 19286/tcp # pfSense nat bouncing
+19286 19286/udp # pfSense nat bouncing
+19287 19287/tcp # pfSense nat bouncing
+19287 19287/udp # pfSense nat bouncing
+19288 19288/tcp # pfSense nat bouncing
+19288 19288/udp # pfSense nat bouncing
+19289 19289/tcp # pfSense nat bouncing
+19289 19289/udp # pfSense nat bouncing
+19290 19290/tcp # pfSense nat bouncing
+19290 19290/udp # pfSense nat bouncing
+19291 19291/tcp # pfSense nat bouncing
+19291 19291/udp # pfSense nat bouncing
+19292 19292/tcp # pfSense nat bouncing
+19292 19292/udp # pfSense nat bouncing
+19293 19293/tcp # pfSense nat bouncing
+19293 19293/udp # pfSense nat bouncing
+19294 19294/tcp # pfSense nat bouncing
+19294 19294/udp # pfSense nat bouncing
+19295 19295/tcp # pfSense nat bouncing
+19295 19295/udp # pfSense nat bouncing
+19296 19296/tcp # pfSense nat bouncing
+19296 19296/udp # pfSense nat bouncing
+19297 19297/tcp # pfSense nat bouncing
+19297 19297/udp # pfSense nat bouncing
+19298 19298/tcp # pfSense nat bouncing
+19298 19298/udp # pfSense nat bouncing
+19299 19299/tcp # pfSense nat bouncing
+19299 19299/udp # pfSense nat bouncing
+19300 19300/tcp # pfSense nat bouncing
+19300 19300/udp # pfSense nat bouncing
+19301 19301/tcp # pfSense nat bouncing
+19301 19301/udp # pfSense nat bouncing
+19302 19302/tcp # pfSense nat bouncing
+19302 19302/udp # pfSense nat bouncing
+19303 19303/tcp # pfSense nat bouncing
+19303 19303/udp # pfSense nat bouncing
+19304 19304/tcp # pfSense nat bouncing
+19304 19304/udp # pfSense nat bouncing
+19305 19305/tcp # pfSense nat bouncing
+19305 19305/udp # pfSense nat bouncing
+19306 19306/tcp # pfSense nat bouncing
+19306 19306/udp # pfSense nat bouncing
+19307 19307/tcp # pfSense nat bouncing
+19307 19307/udp # pfSense nat bouncing
+19308 19308/tcp # pfSense nat bouncing
+19308 19308/udp # pfSense nat bouncing
+19309 19309/tcp # pfSense nat bouncing
+19309 19309/udp # pfSense nat bouncing
+19310 19310/tcp # pfSense nat bouncing
+19310 19310/udp # pfSense nat bouncing
+19311 19311/tcp # pfSense nat bouncing
+19311 19311/udp # pfSense nat bouncing
+19312 19312/tcp # pfSense nat bouncing
+19312 19312/udp # pfSense nat bouncing
+19313 19313/tcp # pfSense nat bouncing
+19313 19313/udp # pfSense nat bouncing
+19314 19314/tcp # pfSense nat bouncing
+19314 19314/udp # pfSense nat bouncing
+19315 19315/tcp # pfSense nat bouncing
+19315 19315/udp # pfSense nat bouncing
+19316 19316/tcp # pfSense nat bouncing
+19316 19316/udp # pfSense nat bouncing
+19317 19317/tcp # pfSense nat bouncing
+19317 19317/udp # pfSense nat bouncing
+19318 19318/tcp # pfSense nat bouncing
+19318 19318/udp # pfSense nat bouncing
+19319 19319/tcp # pfSense nat bouncing
+19319 19319/udp # pfSense nat bouncing
+19320 19320/tcp # pfSense nat bouncing
+19320 19320/udp # pfSense nat bouncing
+19321 19321/tcp # pfSense nat bouncing
+19321 19321/udp # pfSense nat bouncing
+19322 19322/tcp # pfSense nat bouncing
+19322 19322/udp # pfSense nat bouncing
+19323 19323/tcp # pfSense nat bouncing
+19323 19323/udp # pfSense nat bouncing
+19324 19324/tcp # pfSense nat bouncing
+19324 19324/udp # pfSense nat bouncing
+19325 19325/tcp # pfSense nat bouncing
+19325 19325/udp # pfSense nat bouncing
+19326 19326/tcp # pfSense nat bouncing
+19326 19326/udp # pfSense nat bouncing
+19327 19327/tcp # pfSense nat bouncing
+19327 19327/udp # pfSense nat bouncing
+19328 19328/tcp # pfSense nat bouncing
+19328 19328/udp # pfSense nat bouncing
+19329 19329/tcp # pfSense nat bouncing
+19329 19329/udp # pfSense nat bouncing
+19330 19330/tcp # pfSense nat bouncing
+19330 19330/udp # pfSense nat bouncing
+19331 19331/tcp # pfSense nat bouncing
+19331 19331/udp # pfSense nat bouncing
+19332 19332/tcp # pfSense nat bouncing
+19332 19332/udp # pfSense nat bouncing
+19333 19333/tcp # pfSense nat bouncing
+19333 19333/udp # pfSense nat bouncing
+19334 19334/tcp # pfSense nat bouncing
+19334 19334/udp # pfSense nat bouncing
+19335 19335/tcp # pfSense nat bouncing
+19335 19335/udp # pfSense nat bouncing
+19336 19336/tcp # pfSense nat bouncing
+19336 19336/udp # pfSense nat bouncing
+19337 19337/tcp # pfSense nat bouncing
+19337 19337/udp # pfSense nat bouncing
+19338 19338/tcp # pfSense nat bouncing
+19338 19338/udp # pfSense nat bouncing
+19339 19339/tcp # pfSense nat bouncing
+19339 19339/udp # pfSense nat bouncing
+19340 19340/tcp # pfSense nat bouncing
+19340 19340/udp # pfSense nat bouncing
+19341 19341/tcp # pfSense nat bouncing
+19341 19341/udp # pfSense nat bouncing
+19342 19342/tcp # pfSense nat bouncing
+19342 19342/udp # pfSense nat bouncing
+19343 19343/tcp # pfSense nat bouncing
+19343 19343/udp # pfSense nat bouncing
+19344 19344/tcp # pfSense nat bouncing
+19344 19344/udp # pfSense nat bouncing
+19345 19345/tcp # pfSense nat bouncing
+19345 19345/udp # pfSense nat bouncing
+19346 19346/tcp # pfSense nat bouncing
+19346 19346/udp # pfSense nat bouncing
+19347 19347/tcp # pfSense nat bouncing
+19347 19347/udp # pfSense nat bouncing
+19348 19348/tcp # pfSense nat bouncing
+19348 19348/udp # pfSense nat bouncing
+19349 19349/tcp # pfSense nat bouncing
+19349 19349/udp # pfSense nat bouncing
+19350 19350/tcp # pfSense nat bouncing
+19350 19350/udp # pfSense nat bouncing
+19351 19351/tcp # pfSense nat bouncing
+19351 19351/udp # pfSense nat bouncing
+19352 19352/tcp # pfSense nat bouncing
+19352 19352/udp # pfSense nat bouncing
+19353 19353/tcp # pfSense nat bouncing
+19353 19353/udp # pfSense nat bouncing
+19354 19354/tcp # pfSense nat bouncing
+19354 19354/udp # pfSense nat bouncing
+19355 19355/tcp # pfSense nat bouncing
+19355 19355/udp # pfSense nat bouncing
+19356 19356/tcp # pfSense nat bouncing
+19356 19356/udp # pfSense nat bouncing
+19357 19357/tcp # pfSense nat bouncing
+19357 19357/udp # pfSense nat bouncing
+19358 19358/tcp # pfSense nat bouncing
+19358 19358/udp # pfSense nat bouncing
+19359 19359/tcp # pfSense nat bouncing
+19359 19359/udp # pfSense nat bouncing
+19360 19360/tcp # pfSense nat bouncing
+19360 19360/udp # pfSense nat bouncing
+19361 19361/tcp # pfSense nat bouncing
+19361 19361/udp # pfSense nat bouncing
+19362 19362/tcp # pfSense nat bouncing
+19362 19362/udp # pfSense nat bouncing
+19363 19363/tcp # pfSense nat bouncing
+19363 19363/udp # pfSense nat bouncing
+19364 19364/tcp # pfSense nat bouncing
+19364 19364/udp # pfSense nat bouncing
+19365 19365/tcp # pfSense nat bouncing
+19365 19365/udp # pfSense nat bouncing
+19366 19366/tcp # pfSense nat bouncing
+19366 19366/udp # pfSense nat bouncing
+19367 19367/tcp # pfSense nat bouncing
+19367 19367/udp # pfSense nat bouncing
+19368 19368/tcp # pfSense nat bouncing
+19368 19368/udp # pfSense nat bouncing
+19369 19369/tcp # pfSense nat bouncing
+19369 19369/udp # pfSense nat bouncing
+19370 19370/tcp # pfSense nat bouncing
+19370 19370/udp # pfSense nat bouncing
+19371 19371/tcp # pfSense nat bouncing
+19371 19371/udp # pfSense nat bouncing
+19372 19372/tcp # pfSense nat bouncing
+19372 19372/udp # pfSense nat bouncing
+19373 19373/tcp # pfSense nat bouncing
+19373 19373/udp # pfSense nat bouncing
+19374 19374/tcp # pfSense nat bouncing
+19374 19374/udp # pfSense nat bouncing
+19375 19375/tcp # pfSense nat bouncing
+19375 19375/udp # pfSense nat bouncing
+19376 19376/tcp # pfSense nat bouncing
+19376 19376/udp # pfSense nat bouncing
+19377 19377/tcp # pfSense nat bouncing
+19377 19377/udp # pfSense nat bouncing
+19378 19378/tcp # pfSense nat bouncing
+19378 19378/udp # pfSense nat bouncing
+19379 19379/tcp # pfSense nat bouncing
+19379 19379/udp # pfSense nat bouncing
+19380 19380/tcp # pfSense nat bouncing
+19380 19380/udp # pfSense nat bouncing
+19381 19381/tcp # pfSense nat bouncing
+19381 19381/udp # pfSense nat bouncing
+19382 19382/tcp # pfSense nat bouncing
+19382 19382/udp # pfSense nat bouncing
+19383 19383/tcp # pfSense nat bouncing
+19383 19383/udp # pfSense nat bouncing
+19384 19384/tcp # pfSense nat bouncing
+19384 19384/udp # pfSense nat bouncing
+19385 19385/tcp # pfSense nat bouncing
+19385 19385/udp # pfSense nat bouncing
+19386 19386/tcp # pfSense nat bouncing
+19386 19386/udp # pfSense nat bouncing
+19387 19387/tcp # pfSense nat bouncing
+19387 19387/udp # pfSense nat bouncing
+19388 19388/tcp # pfSense nat bouncing
+19388 19388/udp # pfSense nat bouncing
+19389 19389/tcp # pfSense nat bouncing
+19389 19389/udp # pfSense nat bouncing
+19390 19390/tcp # pfSense nat bouncing
+19390 19390/udp # pfSense nat bouncing
+19391 19391/tcp # pfSense nat bouncing
+19391 19391/udp # pfSense nat bouncing
+19392 19392/tcp # pfSense nat bouncing
+19392 19392/udp # pfSense nat bouncing
+19393 19393/tcp # pfSense nat bouncing
+19393 19393/udp # pfSense nat bouncing
+19394 19394/tcp # pfSense nat bouncing
+19394 19394/udp # pfSense nat bouncing
+19395 19395/tcp # pfSense nat bouncing
+19395 19395/udp # pfSense nat bouncing
+19396 19396/tcp # pfSense nat bouncing
+19396 19396/udp # pfSense nat bouncing
+19397 19397/tcp # pfSense nat bouncing
+19397 19397/udp # pfSense nat bouncing
+19398 19398/tcp # pfSense nat bouncing
+19398 19398/udp # pfSense nat bouncing
+19399 19399/tcp # pfSense nat bouncing
+19399 19399/udp # pfSense nat bouncing
+19400 19400/tcp # pfSense nat bouncing
+19400 19400/udp # pfSense nat bouncing
+19401 19401/tcp # pfSense nat bouncing
+19401 19401/udp # pfSense nat bouncing
+19402 19402/tcp # pfSense nat bouncing
+19402 19402/udp # pfSense nat bouncing
+19403 19403/tcp # pfSense nat bouncing
+19403 19403/udp # pfSense nat bouncing
+19404 19404/tcp # pfSense nat bouncing
+19404 19404/udp # pfSense nat bouncing
+19405 19405/tcp # pfSense nat bouncing
+19405 19405/udp # pfSense nat bouncing
+19406 19406/tcp # pfSense nat bouncing
+19406 19406/udp # pfSense nat bouncing
+19407 19407/tcp # pfSense nat bouncing
+19407 19407/udp # pfSense nat bouncing
+19408 19408/tcp # pfSense nat bouncing
+19408 19408/udp # pfSense nat bouncing
+19409 19409/tcp # pfSense nat bouncing
+19409 19409/udp # pfSense nat bouncing
+19410 19410/tcp # pfSense nat bouncing
+19410 19410/udp # pfSense nat bouncing
+19411 19411/tcp # pfSense nat bouncing
+19411 19411/udp # pfSense nat bouncing
+19412 19412/tcp # pfSense nat bouncing
+19412 19412/udp # pfSense nat bouncing
+19413 19413/tcp # pfSense nat bouncing
+19413 19413/udp # pfSense nat bouncing
+19414 19414/tcp # pfSense nat bouncing
+19414 19414/udp # pfSense nat bouncing
+19415 19415/tcp # pfSense nat bouncing
+19415 19415/udp # pfSense nat bouncing
+19416 19416/tcp # pfSense nat bouncing
+19416 19416/udp # pfSense nat bouncing
+19417 19417/tcp # pfSense nat bouncing
+19417 19417/udp # pfSense nat bouncing
+19418 19418/tcp # pfSense nat bouncing
+19418 19418/udp # pfSense nat bouncing
+19419 19419/tcp # pfSense nat bouncing
+19419 19419/udp # pfSense nat bouncing
+19420 19420/tcp # pfSense nat bouncing
+19420 19420/udp # pfSense nat bouncing
+19421 19421/tcp # pfSense nat bouncing
+19421 19421/udp # pfSense nat bouncing
+19422 19422/tcp # pfSense nat bouncing
+19422 19422/udp # pfSense nat bouncing
+19423 19423/tcp # pfSense nat bouncing
+19423 19423/udp # pfSense nat bouncing
+19424 19424/tcp # pfSense nat bouncing
+19424 19424/udp # pfSense nat bouncing
+19425 19425/tcp # pfSense nat bouncing
+19425 19425/udp # pfSense nat bouncing
+19426 19426/tcp # pfSense nat bouncing
+19426 19426/udp # pfSense nat bouncing
+19427 19427/tcp # pfSense nat bouncing
+19427 19427/udp # pfSense nat bouncing
+19428 19428/tcp # pfSense nat bouncing
+19428 19428/udp # pfSense nat bouncing
+19429 19429/tcp # pfSense nat bouncing
+19429 19429/udp # pfSense nat bouncing
+19430 19430/tcp # pfSense nat bouncing
+19430 19430/udp # pfSense nat bouncing
+19431 19431/tcp # pfSense nat bouncing
+19431 19431/udp # pfSense nat bouncing
+19432 19432/tcp # pfSense nat bouncing
+19432 19432/udp # pfSense nat bouncing
+19433 19433/tcp # pfSense nat bouncing
+19433 19433/udp # pfSense nat bouncing
+19434 19434/tcp # pfSense nat bouncing
+19434 19434/udp # pfSense nat bouncing
+19435 19435/tcp # pfSense nat bouncing
+19435 19435/udp # pfSense nat bouncing
+19436 19436/tcp # pfSense nat bouncing
+19436 19436/udp # pfSense nat bouncing
+19437 19437/tcp # pfSense nat bouncing
+19437 19437/udp # pfSense nat bouncing
+19438 19438/tcp # pfSense nat bouncing
+19438 19438/udp # pfSense nat bouncing
+19439 19439/tcp # pfSense nat bouncing
+19439 19439/udp # pfSense nat bouncing
+19440 19440/tcp # pfSense nat bouncing
+19440 19440/udp # pfSense nat bouncing
+19441 19441/tcp # pfSense nat bouncing
+19441 19441/udp # pfSense nat bouncing
+19442 19442/tcp # pfSense nat bouncing
+19442 19442/udp # pfSense nat bouncing
+19443 19443/tcp # pfSense nat bouncing
+19443 19443/udp # pfSense nat bouncing
+19444 19444/tcp # pfSense nat bouncing
+19444 19444/udp # pfSense nat bouncing
+19445 19445/tcp # pfSense nat bouncing
+19445 19445/udp # pfSense nat bouncing
+19446 19446/tcp # pfSense nat bouncing
+19446 19446/udp # pfSense nat bouncing
+19447 19447/tcp # pfSense nat bouncing
+19447 19447/udp # pfSense nat bouncing
+19448 19448/tcp # pfSense nat bouncing
+19448 19448/udp # pfSense nat bouncing
+19449 19449/tcp # pfSense nat bouncing
+19449 19449/udp # pfSense nat bouncing
+19450 19450/tcp # pfSense nat bouncing
+19450 19450/udp # pfSense nat bouncing
+19451 19451/tcp # pfSense nat bouncing
+19451 19451/udp # pfSense nat bouncing
+19452 19452/tcp # pfSense nat bouncing
+19452 19452/udp # pfSense nat bouncing
+19453 19453/tcp # pfSense nat bouncing
+19453 19453/udp # pfSense nat bouncing
+19454 19454/tcp # pfSense nat bouncing
+19454 19454/udp # pfSense nat bouncing
+19455 19455/tcp # pfSense nat bouncing
+19455 19455/udp # pfSense nat bouncing
+19456 19456/tcp # pfSense nat bouncing
+19456 19456/udp # pfSense nat bouncing
+19457 19457/tcp # pfSense nat bouncing
+19457 19457/udp # pfSense nat bouncing
+19458 19458/tcp # pfSense nat bouncing
+19458 19458/udp # pfSense nat bouncing
+19459 19459/tcp # pfSense nat bouncing
+19459 19459/udp # pfSense nat bouncing
+19460 19460/tcp # pfSense nat bouncing
+19460 19460/udp # pfSense nat bouncing
+19461 19461/tcp # pfSense nat bouncing
+19461 19461/udp # pfSense nat bouncing
+19462 19462/tcp # pfSense nat bouncing
+19462 19462/udp # pfSense nat bouncing
+19463 19463/tcp # pfSense nat bouncing
+19463 19463/udp # pfSense nat bouncing
+19464 19464/tcp # pfSense nat bouncing
+19464 19464/udp # pfSense nat bouncing
+19465 19465/tcp # pfSense nat bouncing
+19465 19465/udp # pfSense nat bouncing
+19466 19466/tcp # pfSense nat bouncing
+19466 19466/udp # pfSense nat bouncing
+19467 19467/tcp # pfSense nat bouncing
+19467 19467/udp # pfSense nat bouncing
+19468 19468/tcp # pfSense nat bouncing
+19468 19468/udp # pfSense nat bouncing
+19469 19469/tcp # pfSense nat bouncing
+19469 19469/udp # pfSense nat bouncing
+19470 19470/tcp # pfSense nat bouncing
+19470 19470/udp # pfSense nat bouncing
+19471 19471/tcp # pfSense nat bouncing
+19471 19471/udp # pfSense nat bouncing
+19472 19472/tcp # pfSense nat bouncing
+19472 19472/udp # pfSense nat bouncing
+19473 19473/tcp # pfSense nat bouncing
+19473 19473/udp # pfSense nat bouncing
+19474 19474/tcp # pfSense nat bouncing
+19474 19474/udp # pfSense nat bouncing
+19475 19475/tcp # pfSense nat bouncing
+19475 19475/udp # pfSense nat bouncing
+19476 19476/tcp # pfSense nat bouncing
+19476 19476/udp # pfSense nat bouncing
+19477 19477/tcp # pfSense nat bouncing
+19477 19477/udp # pfSense nat bouncing
+19478 19478/tcp # pfSense nat bouncing
+19478 19478/udp # pfSense nat bouncing
+19479 19479/tcp # pfSense nat bouncing
+19479 19479/udp # pfSense nat bouncing
+19480 19480/tcp # pfSense nat bouncing
+19480 19480/udp # pfSense nat bouncing
+19481 19481/tcp # pfSense nat bouncing
+19481 19481/udp # pfSense nat bouncing
+19482 19482/tcp # pfSense nat bouncing
+19482 19482/udp # pfSense nat bouncing
+19483 19483/tcp # pfSense nat bouncing
+19483 19483/udp # pfSense nat bouncing
+19484 19484/tcp # pfSense nat bouncing
+19484 19484/udp # pfSense nat bouncing
+19485 19485/tcp # pfSense nat bouncing
+19485 19485/udp # pfSense nat bouncing
+19486 19486/tcp # pfSense nat bouncing
+19486 19486/udp # pfSense nat bouncing
+19487 19487/tcp # pfSense nat bouncing
+19487 19487/udp # pfSense nat bouncing
+19488 19488/tcp # pfSense nat bouncing
+19488 19488/udp # pfSense nat bouncing
+19489 19489/tcp # pfSense nat bouncing
+19489 19489/udp # pfSense nat bouncing
+19490 19490/tcp # pfSense nat bouncing
+19490 19490/udp # pfSense nat bouncing
+19491 19491/tcp # pfSense nat bouncing
+19491 19491/udp # pfSense nat bouncing
+19492 19492/tcp # pfSense nat bouncing
+19492 19492/udp # pfSense nat bouncing
+19493 19493/tcp # pfSense nat bouncing
+19493 19493/udp # pfSense nat bouncing
+19494 19494/tcp # pfSense nat bouncing
+19494 19494/udp # pfSense nat bouncing
+19495 19495/tcp # pfSense nat bouncing
+19495 19495/udp # pfSense nat bouncing
+19496 19496/tcp # pfSense nat bouncing
+19496 19496/udp # pfSense nat bouncing
+19497 19497/tcp # pfSense nat bouncing
+19497 19497/udp # pfSense nat bouncing
+19498 19498/tcp # pfSense nat bouncing
+19498 19498/udp # pfSense nat bouncing
+19499 19499/tcp # pfSense nat bouncing
+19499 19499/udp # pfSense nat bouncing
+19500 19500/tcp # pfSense nat bouncing
+19500 19500/udp # pfSense nat bouncing
+19501 19501/tcp # pfSense nat bouncing
+19501 19501/udp # pfSense nat bouncing
+19502 19502/tcp # pfSense nat bouncing
+19502 19502/udp # pfSense nat bouncing
+19503 19503/tcp # pfSense nat bouncing
+19503 19503/udp # pfSense nat bouncing
+19504 19504/tcp # pfSense nat bouncing
+19504 19504/udp # pfSense nat bouncing
+19505 19505/tcp # pfSense nat bouncing
+19505 19505/udp # pfSense nat bouncing
+19506 19506/tcp # pfSense nat bouncing
+19506 19506/udp # pfSense nat bouncing
+19507 19507/tcp # pfSense nat bouncing
+19507 19507/udp # pfSense nat bouncing
+19508 19508/tcp # pfSense nat bouncing
+19508 19508/udp # pfSense nat bouncing
+19509 19509/tcp # pfSense nat bouncing
+19509 19509/udp # pfSense nat bouncing
+19510 19510/tcp # pfSense nat bouncing
+19510 19510/udp # pfSense nat bouncing
+19511 19511/tcp # pfSense nat bouncing
+19511 19511/udp # pfSense nat bouncing
+19512 19512/tcp # pfSense nat bouncing
+19512 19512/udp # pfSense nat bouncing
+19513 19513/tcp # pfSense nat bouncing
+19513 19513/udp # pfSense nat bouncing
+19514 19514/tcp # pfSense nat bouncing
+19514 19514/udp # pfSense nat bouncing
+19515 19515/tcp # pfSense nat bouncing
+19515 19515/udp # pfSense nat bouncing
+19516 19516/tcp # pfSense nat bouncing
+19516 19516/udp # pfSense nat bouncing
+19517 19517/tcp # pfSense nat bouncing
+19517 19517/udp # pfSense nat bouncing
+19518 19518/tcp # pfSense nat bouncing
+19518 19518/udp # pfSense nat bouncing
+19519 19519/tcp # pfSense nat bouncing
+19519 19519/udp # pfSense nat bouncing
+19520 19520/tcp # pfSense nat bouncing
+19520 19520/udp # pfSense nat bouncing
+19521 19521/tcp # pfSense nat bouncing
+19521 19521/udp # pfSense nat bouncing
+19522 19522/tcp # pfSense nat bouncing
+19522 19522/udp # pfSense nat bouncing
+19523 19523/tcp # pfSense nat bouncing
+19523 19523/udp # pfSense nat bouncing
+19524 19524/tcp # pfSense nat bouncing
+19524 19524/udp # pfSense nat bouncing
+19525 19525/tcp # pfSense nat bouncing
+19525 19525/udp # pfSense nat bouncing
+19526 19526/tcp # pfSense nat bouncing
+19526 19526/udp # pfSense nat bouncing
+19527 19527/tcp # pfSense nat bouncing
+19527 19527/udp # pfSense nat bouncing
+19528 19528/tcp # pfSense nat bouncing
+19528 19528/udp # pfSense nat bouncing
+19529 19529/tcp # pfSense nat bouncing
+19529 19529/udp # pfSense nat bouncing
+19530 19530/tcp # pfSense nat bouncing
+19530 19530/udp # pfSense nat bouncing
+19531 19531/tcp # pfSense nat bouncing
+19531 19531/udp # pfSense nat bouncing
+19532 19532/tcp # pfSense nat bouncing
+19532 19532/udp # pfSense nat bouncing
+19533 19533/tcp # pfSense nat bouncing
+19533 19533/udp # pfSense nat bouncing
+19534 19534/tcp # pfSense nat bouncing
+19534 19534/udp # pfSense nat bouncing
+19535 19535/tcp # pfSense nat bouncing
+19535 19535/udp # pfSense nat bouncing
+19536 19536/tcp # pfSense nat bouncing
+19536 19536/udp # pfSense nat bouncing
+19537 19537/tcp # pfSense nat bouncing
+19537 19537/udp # pfSense nat bouncing
+19538 19538/tcp # pfSense nat bouncing
+19538 19538/udp # pfSense nat bouncing
+19539 19539/tcp # pfSense nat bouncing
+19539 19539/udp # pfSense nat bouncing
+19540 19540/tcp # pfSense nat bouncing
+19540 19540/udp # pfSense nat bouncing
+19541 19541/tcp # pfSense nat bouncing
+19541 19541/udp # pfSense nat bouncing
+19542 19542/tcp # pfSense nat bouncing
+19542 19542/udp # pfSense nat bouncing
+19543 19543/tcp # pfSense nat bouncing
+19543 19543/udp # pfSense nat bouncing
+19544 19544/tcp # pfSense nat bouncing
+19544 19544/udp # pfSense nat bouncing
+19545 19545/tcp # pfSense nat bouncing
+19545 19545/udp # pfSense nat bouncing
+19546 19546/tcp # pfSense nat bouncing
+19546 19546/udp # pfSense nat bouncing
+19547 19547/tcp # pfSense nat bouncing
+19547 19547/udp # pfSense nat bouncing
+19548 19548/tcp # pfSense nat bouncing
+19548 19548/udp # pfSense nat bouncing
+19549 19549/tcp # pfSense nat bouncing
+19549 19549/udp # pfSense nat bouncing
+19550 19550/tcp # pfSense nat bouncing
+19550 19550/udp # pfSense nat bouncing
+19551 19551/tcp # pfSense nat bouncing
+19551 19551/udp # pfSense nat bouncing
+19552 19552/tcp # pfSense nat bouncing
+19552 19552/udp # pfSense nat bouncing
+19553 19553/tcp # pfSense nat bouncing
+19553 19553/udp # pfSense nat bouncing
+19554 19554/tcp # pfSense nat bouncing
+19554 19554/udp # pfSense nat bouncing
+19555 19555/tcp # pfSense nat bouncing
+19555 19555/udp # pfSense nat bouncing
+19556 19556/tcp # pfSense nat bouncing
+19556 19556/udp # pfSense nat bouncing
+19557 19557/tcp # pfSense nat bouncing
+19557 19557/udp # pfSense nat bouncing
+19558 19558/tcp # pfSense nat bouncing
+19558 19558/udp # pfSense nat bouncing
+19559 19559/tcp # pfSense nat bouncing
+19559 19559/udp # pfSense nat bouncing
+19560 19560/tcp # pfSense nat bouncing
+19560 19560/udp # pfSense nat bouncing
+19561 19561/tcp # pfSense nat bouncing
+19561 19561/udp # pfSense nat bouncing
+19562 19562/tcp # pfSense nat bouncing
+19562 19562/udp # pfSense nat bouncing
+19563 19563/tcp # pfSense nat bouncing
+19563 19563/udp # pfSense nat bouncing
+19564 19564/tcp # pfSense nat bouncing
+19564 19564/udp # pfSense nat bouncing
+19565 19565/tcp # pfSense nat bouncing
+19565 19565/udp # pfSense nat bouncing
+19566 19566/tcp # pfSense nat bouncing
+19566 19566/udp # pfSense nat bouncing
+19567 19567/tcp # pfSense nat bouncing
+19567 19567/udp # pfSense nat bouncing
+19568 19568/tcp # pfSense nat bouncing
+19568 19568/udp # pfSense nat bouncing
+19569 19569/tcp # pfSense nat bouncing
+19569 19569/udp # pfSense nat bouncing
+19570 19570/tcp # pfSense nat bouncing
+19570 19570/udp # pfSense nat bouncing
+19571 19571/tcp # pfSense nat bouncing
+19571 19571/udp # pfSense nat bouncing
+19572 19572/tcp # pfSense nat bouncing
+19572 19572/udp # pfSense nat bouncing
+19573 19573/tcp # pfSense nat bouncing
+19573 19573/udp # pfSense nat bouncing
+19574 19574/tcp # pfSense nat bouncing
+19574 19574/udp # pfSense nat bouncing
+19575 19575/tcp # pfSense nat bouncing
+19575 19575/udp # pfSense nat bouncing
+19576 19576/tcp # pfSense nat bouncing
+19576 19576/udp # pfSense nat bouncing
+19577 19577/tcp # pfSense nat bouncing
+19577 19577/udp # pfSense nat bouncing
+19578 19578/tcp # pfSense nat bouncing
+19578 19578/udp # pfSense nat bouncing
+19579 19579/tcp # pfSense nat bouncing
+19579 19579/udp # pfSense nat bouncing
+19580 19580/tcp # pfSense nat bouncing
+19580 19580/udp # pfSense nat bouncing
+19581 19581/tcp # pfSense nat bouncing
+19581 19581/udp # pfSense nat bouncing
+19582 19582/tcp # pfSense nat bouncing
+19582 19582/udp # pfSense nat bouncing
+19583 19583/tcp # pfSense nat bouncing
+19583 19583/udp # pfSense nat bouncing
+19584 19584/tcp # pfSense nat bouncing
+19584 19584/udp # pfSense nat bouncing
+19585 19585/tcp # pfSense nat bouncing
+19585 19585/udp # pfSense nat bouncing
+19586 19586/tcp # pfSense nat bouncing
+19586 19586/udp # pfSense nat bouncing
+19587 19587/tcp # pfSense nat bouncing
+19587 19587/udp # pfSense nat bouncing
+19588 19588/tcp # pfSense nat bouncing
+19588 19588/udp # pfSense nat bouncing
+19589 19589/tcp # pfSense nat bouncing
+19589 19589/udp # pfSense nat bouncing
+19590 19590/tcp # pfSense nat bouncing
+19590 19590/udp # pfSense nat bouncing
+19591 19591/tcp # pfSense nat bouncing
+19591 19591/udp # pfSense nat bouncing
+19592 19592/tcp # pfSense nat bouncing
+19592 19592/udp # pfSense nat bouncing
+19593 19593/tcp # pfSense nat bouncing
+19593 19593/udp # pfSense nat bouncing
+19594 19594/tcp # pfSense nat bouncing
+19594 19594/udp # pfSense nat bouncing
+19595 19595/tcp # pfSense nat bouncing
+19595 19595/udp # pfSense nat bouncing
+19596 19596/tcp # pfSense nat bouncing
+19596 19596/udp # pfSense nat bouncing
+19597 19597/tcp # pfSense nat bouncing
+19597 19597/udp # pfSense nat bouncing
+19598 19598/tcp # pfSense nat bouncing
+19598 19598/udp # pfSense nat bouncing
+19599 19599/tcp # pfSense nat bouncing
+19599 19599/udp # pfSense nat bouncing
+19600 19600/tcp # pfSense nat bouncing
+19600 19600/udp # pfSense nat bouncing
+19601 19601/tcp # pfSense nat bouncing
+19601 19601/udp # pfSense nat bouncing
+19602 19602/tcp # pfSense nat bouncing
+19602 19602/udp # pfSense nat bouncing
+19603 19603/tcp # pfSense nat bouncing
+19603 19603/udp # pfSense nat bouncing
+19604 19604/tcp # pfSense nat bouncing
+19604 19604/udp # pfSense nat bouncing
+19605 19605/tcp # pfSense nat bouncing
+19605 19605/udp # pfSense nat bouncing
+19606 19606/tcp # pfSense nat bouncing
+19606 19606/udp # pfSense nat bouncing
+19607 19607/tcp # pfSense nat bouncing
+19607 19607/udp # pfSense nat bouncing
+19608 19608/tcp # pfSense nat bouncing
+19608 19608/udp # pfSense nat bouncing
+19609 19609/tcp # pfSense nat bouncing
+19609 19609/udp # pfSense nat bouncing
+19610 19610/tcp # pfSense nat bouncing
+19610 19610/udp # pfSense nat bouncing
+19611 19611/tcp # pfSense nat bouncing
+19611 19611/udp # pfSense nat bouncing
+19612 19612/tcp # pfSense nat bouncing
+19612 19612/udp # pfSense nat bouncing
+19613 19613/tcp # pfSense nat bouncing
+19613 19613/udp # pfSense nat bouncing
+19614 19614/tcp # pfSense nat bouncing
+19614 19614/udp # pfSense nat bouncing
+19615 19615/tcp # pfSense nat bouncing
+19615 19615/udp # pfSense nat bouncing
+19616 19616/tcp # pfSense nat bouncing
+19616 19616/udp # pfSense nat bouncing
+19617 19617/tcp # pfSense nat bouncing
+19617 19617/udp # pfSense nat bouncing
+19618 19618/tcp # pfSense nat bouncing
+19618 19618/udp # pfSense nat bouncing
+19619 19619/tcp # pfSense nat bouncing
+19619 19619/udp # pfSense nat bouncing
+19620 19620/tcp # pfSense nat bouncing
+19620 19620/udp # pfSense nat bouncing
+19621 19621/tcp # pfSense nat bouncing
+19621 19621/udp # pfSense nat bouncing
+19622 19622/tcp # pfSense nat bouncing
+19622 19622/udp # pfSense nat bouncing
+19623 19623/tcp # pfSense nat bouncing
+19623 19623/udp # pfSense nat bouncing
+19624 19624/tcp # pfSense nat bouncing
+19624 19624/udp # pfSense nat bouncing
+19625 19625/tcp # pfSense nat bouncing
+19625 19625/udp # pfSense nat bouncing
+19626 19626/tcp # pfSense nat bouncing
+19626 19626/udp # pfSense nat bouncing
+19627 19627/tcp # pfSense nat bouncing
+19627 19627/udp # pfSense nat bouncing
+19628 19628/tcp # pfSense nat bouncing
+19628 19628/udp # pfSense nat bouncing
+19629 19629/tcp # pfSense nat bouncing
+19629 19629/udp # pfSense nat bouncing
+19630 19630/tcp # pfSense nat bouncing
+19630 19630/udp # pfSense nat bouncing
+19631 19631/tcp # pfSense nat bouncing
+19631 19631/udp # pfSense nat bouncing
+19632 19632/tcp # pfSense nat bouncing
+19632 19632/udp # pfSense nat bouncing
+19633 19633/tcp # pfSense nat bouncing
+19633 19633/udp # pfSense nat bouncing
+19634 19634/tcp # pfSense nat bouncing
+19634 19634/udp # pfSense nat bouncing
+19635 19635/tcp # pfSense nat bouncing
+19635 19635/udp # pfSense nat bouncing
+19636 19636/tcp # pfSense nat bouncing
+19636 19636/udp # pfSense nat bouncing
+19637 19637/tcp # pfSense nat bouncing
+19637 19637/udp # pfSense nat bouncing
+19638 19638/tcp # pfSense nat bouncing
+19638 19638/udp # pfSense nat bouncing
+19639 19639/tcp # pfSense nat bouncing
+19639 19639/udp # pfSense nat bouncing
+19640 19640/tcp # pfSense nat bouncing
+19640 19640/udp # pfSense nat bouncing
+19641 19641/tcp # pfSense nat bouncing
+19641 19641/udp # pfSense nat bouncing
+19642 19642/tcp # pfSense nat bouncing
+19642 19642/udp # pfSense nat bouncing
+19643 19643/tcp # pfSense nat bouncing
+19643 19643/udp # pfSense nat bouncing
+19644 19644/tcp # pfSense nat bouncing
+19644 19644/udp # pfSense nat bouncing
+19645 19645/tcp # pfSense nat bouncing
+19645 19645/udp # pfSense nat bouncing
+19646 19646/tcp # pfSense nat bouncing
+19646 19646/udp # pfSense nat bouncing
+19647 19647/tcp # pfSense nat bouncing
+19647 19647/udp # pfSense nat bouncing
+19648 19648/tcp # pfSense nat bouncing
+19648 19648/udp # pfSense nat bouncing
+19649 19649/tcp # pfSense nat bouncing
+19649 19649/udp # pfSense nat bouncing
+19650 19650/tcp # pfSense nat bouncing
+19650 19650/udp # pfSense nat bouncing
+19651 19651/tcp # pfSense nat bouncing
+19651 19651/udp # pfSense nat bouncing
+19652 19652/tcp # pfSense nat bouncing
+19652 19652/udp # pfSense nat bouncing
+19653 19653/tcp # pfSense nat bouncing
+19653 19653/udp # pfSense nat bouncing
+19654 19654/tcp # pfSense nat bouncing
+19654 19654/udp # pfSense nat bouncing
+19655 19655/tcp # pfSense nat bouncing
+19655 19655/udp # pfSense nat bouncing
+19656 19656/tcp # pfSense nat bouncing
+19656 19656/udp # pfSense nat bouncing
+19657 19657/tcp # pfSense nat bouncing
+19657 19657/udp # pfSense nat bouncing
+19658 19658/tcp # pfSense nat bouncing
+19658 19658/udp # pfSense nat bouncing
+19659 19659/tcp # pfSense nat bouncing
+19659 19659/udp # pfSense nat bouncing
+19660 19660/tcp # pfSense nat bouncing
+19660 19660/udp # pfSense nat bouncing
+19661 19661/tcp # pfSense nat bouncing
+19661 19661/udp # pfSense nat bouncing
+19662 19662/tcp # pfSense nat bouncing
+19662 19662/udp # pfSense nat bouncing
+19663 19663/tcp # pfSense nat bouncing
+19663 19663/udp # pfSense nat bouncing
+19664 19664/tcp # pfSense nat bouncing
+19664 19664/udp # pfSense nat bouncing
+19665 19665/tcp # pfSense nat bouncing
+19665 19665/udp # pfSense nat bouncing
+19666 19666/tcp # pfSense nat bouncing
+19666 19666/udp # pfSense nat bouncing
+19667 19667/tcp # pfSense nat bouncing
+19667 19667/udp # pfSense nat bouncing
+19668 19668/tcp # pfSense nat bouncing
+19668 19668/udp # pfSense nat bouncing
+19669 19669/tcp # pfSense nat bouncing
+19669 19669/udp # pfSense nat bouncing
+19670 19670/tcp # pfSense nat bouncing
+19670 19670/udp # pfSense nat bouncing
+19671 19671/tcp # pfSense nat bouncing
+19671 19671/udp # pfSense nat bouncing
+19672 19672/tcp # pfSense nat bouncing
+19672 19672/udp # pfSense nat bouncing
+19673 19673/tcp # pfSense nat bouncing
+19673 19673/udp # pfSense nat bouncing
+19674 19674/tcp # pfSense nat bouncing
+19674 19674/udp # pfSense nat bouncing
+19675 19675/tcp # pfSense nat bouncing
+19675 19675/udp # pfSense nat bouncing
+19676 19676/tcp # pfSense nat bouncing
+19676 19676/udp # pfSense nat bouncing
+19677 19677/tcp # pfSense nat bouncing
+19677 19677/udp # pfSense nat bouncing
+19678 19678/tcp # pfSense nat bouncing
+19678 19678/udp # pfSense nat bouncing
+19679 19679/tcp # pfSense nat bouncing
+19679 19679/udp # pfSense nat bouncing
+19680 19680/tcp # pfSense nat bouncing
+19680 19680/udp # pfSense nat bouncing
+19681 19681/tcp # pfSense nat bouncing
+19681 19681/udp # pfSense nat bouncing
+19682 19682/tcp # pfSense nat bouncing
+19682 19682/udp # pfSense nat bouncing
+19683 19683/tcp # pfSense nat bouncing
+19683 19683/udp # pfSense nat bouncing
+19684 19684/tcp # pfSense nat bouncing
+19684 19684/udp # pfSense nat bouncing
+19685 19685/tcp # pfSense nat bouncing
+19685 19685/udp # pfSense nat bouncing
+19686 19686/tcp # pfSense nat bouncing
+19686 19686/udp # pfSense nat bouncing
+19687 19687/tcp # pfSense nat bouncing
+19687 19687/udp # pfSense nat bouncing
+19688 19688/tcp # pfSense nat bouncing
+19688 19688/udp # pfSense nat bouncing
+19689 19689/tcp # pfSense nat bouncing
+19689 19689/udp # pfSense nat bouncing
+19690 19690/tcp # pfSense nat bouncing
+19690 19690/udp # pfSense nat bouncing
+19691 19691/tcp # pfSense nat bouncing
+19691 19691/udp # pfSense nat bouncing
+19692 19692/tcp # pfSense nat bouncing
+19692 19692/udp # pfSense nat bouncing
+19693 19693/tcp # pfSense nat bouncing
+19693 19693/udp # pfSense nat bouncing
+19694 19694/tcp # pfSense nat bouncing
+19694 19694/udp # pfSense nat bouncing
+19695 19695/tcp # pfSense nat bouncing
+19695 19695/udp # pfSense nat bouncing
+19696 19696/tcp # pfSense nat bouncing
+19696 19696/udp # pfSense nat bouncing
+19697 19697/tcp # pfSense nat bouncing
+19697 19697/udp # pfSense nat bouncing
+19698 19698/tcp # pfSense nat bouncing
+19698 19698/udp # pfSense nat bouncing
+19699 19699/tcp # pfSense nat bouncing
+19699 19699/udp # pfSense nat bouncing
+19700 19700/tcp # pfSense nat bouncing
+19700 19700/udp # pfSense nat bouncing
+19701 19701/tcp # pfSense nat bouncing
+19701 19701/udp # pfSense nat bouncing
+19702 19702/tcp # pfSense nat bouncing
+19702 19702/udp # pfSense nat bouncing
+19703 19703/tcp # pfSense nat bouncing
+19703 19703/udp # pfSense nat bouncing
+19704 19704/tcp # pfSense nat bouncing
+19704 19704/udp # pfSense nat bouncing
+19705 19705/tcp # pfSense nat bouncing
+19705 19705/udp # pfSense nat bouncing
+19706 19706/tcp # pfSense nat bouncing
+19706 19706/udp # pfSense nat bouncing
+19707 19707/tcp # pfSense nat bouncing
+19707 19707/udp # pfSense nat bouncing
+19708 19708/tcp # pfSense nat bouncing
+19708 19708/udp # pfSense nat bouncing
+19709 19709/tcp # pfSense nat bouncing
+19709 19709/udp # pfSense nat bouncing
+19710 19710/tcp # pfSense nat bouncing
+19710 19710/udp # pfSense nat bouncing
+19711 19711/tcp # pfSense nat bouncing
+19711 19711/udp # pfSense nat bouncing
+19712 19712/tcp # pfSense nat bouncing
+19712 19712/udp # pfSense nat bouncing
+19713 19713/tcp # pfSense nat bouncing
+19713 19713/udp # pfSense nat bouncing
+19714 19714/tcp # pfSense nat bouncing
+19714 19714/udp # pfSense nat bouncing
+19715 19715/tcp # pfSense nat bouncing
+19715 19715/udp # pfSense nat bouncing
+19716 19716/tcp # pfSense nat bouncing
+19716 19716/udp # pfSense nat bouncing
+19717 19717/tcp # pfSense nat bouncing
+19717 19717/udp # pfSense nat bouncing
+19718 19718/tcp # pfSense nat bouncing
+19718 19718/udp # pfSense nat bouncing
+19719 19719/tcp # pfSense nat bouncing
+19719 19719/udp # pfSense nat bouncing
+19720 19720/tcp # pfSense nat bouncing
+19720 19720/udp # pfSense nat bouncing
+19721 19721/tcp # pfSense nat bouncing
+19721 19721/udp # pfSense nat bouncing
+19722 19722/tcp # pfSense nat bouncing
+19722 19722/udp # pfSense nat bouncing
+19723 19723/tcp # pfSense nat bouncing
+19723 19723/udp # pfSense nat bouncing
+19724 19724/tcp # pfSense nat bouncing
+19724 19724/udp # pfSense nat bouncing
+19725 19725/tcp # pfSense nat bouncing
+19725 19725/udp # pfSense nat bouncing
+19726 19726/tcp # pfSense nat bouncing
+19726 19726/udp # pfSense nat bouncing
+19727 19727/tcp # pfSense nat bouncing
+19727 19727/udp # pfSense nat bouncing
+19728 19728/tcp # pfSense nat bouncing
+19728 19728/udp # pfSense nat bouncing
+19729 19729/tcp # pfSense nat bouncing
+19729 19729/udp # pfSense nat bouncing
+19730 19730/tcp # pfSense nat bouncing
+19730 19730/udp # pfSense nat bouncing
+19731 19731/tcp # pfSense nat bouncing
+19731 19731/udp # pfSense nat bouncing
+19732 19732/tcp # pfSense nat bouncing
+19732 19732/udp # pfSense nat bouncing
+19733 19733/tcp # pfSense nat bouncing
+19733 19733/udp # pfSense nat bouncing
+19734 19734/tcp # pfSense nat bouncing
+19734 19734/udp # pfSense nat bouncing
+19735 19735/tcp # pfSense nat bouncing
+19735 19735/udp # pfSense nat bouncing
+19736 19736/tcp # pfSense nat bouncing
+19736 19736/udp # pfSense nat bouncing
+19737 19737/tcp # pfSense nat bouncing
+19737 19737/udp # pfSense nat bouncing
+19738 19738/tcp # pfSense nat bouncing
+19738 19738/udp # pfSense nat bouncing
+19739 19739/tcp # pfSense nat bouncing
+19739 19739/udp # pfSense nat bouncing
+19740 19740/tcp # pfSense nat bouncing
+19740 19740/udp # pfSense nat bouncing
+19741 19741/tcp # pfSense nat bouncing
+19741 19741/udp # pfSense nat bouncing
+19742 19742/tcp # pfSense nat bouncing
+19742 19742/udp # pfSense nat bouncing
+19743 19743/tcp # pfSense nat bouncing
+19743 19743/udp # pfSense nat bouncing
+19744 19744/tcp # pfSense nat bouncing
+19744 19744/udp # pfSense nat bouncing
+19745 19745/tcp # pfSense nat bouncing
+19745 19745/udp # pfSense nat bouncing
+19746 19746/tcp # pfSense nat bouncing
+19746 19746/udp # pfSense nat bouncing
+19747 19747/tcp # pfSense nat bouncing
+19747 19747/udp # pfSense nat bouncing
+19748 19748/tcp # pfSense nat bouncing
+19748 19748/udp # pfSense nat bouncing
+19749 19749/tcp # pfSense nat bouncing
+19749 19749/udp # pfSense nat bouncing
+19750 19750/tcp # pfSense nat bouncing
+19750 19750/udp # pfSense nat bouncing
+19751 19751/tcp # pfSense nat bouncing
+19751 19751/udp # pfSense nat bouncing
+19752 19752/tcp # pfSense nat bouncing
+19752 19752/udp # pfSense nat bouncing
+19753 19753/tcp # pfSense nat bouncing
+19753 19753/udp # pfSense nat bouncing
+19754 19754/tcp # pfSense nat bouncing
+19754 19754/udp # pfSense nat bouncing
+19755 19755/tcp # pfSense nat bouncing
+19755 19755/udp # pfSense nat bouncing
+19756 19756/tcp # pfSense nat bouncing
+19756 19756/udp # pfSense nat bouncing
+19757 19757/tcp # pfSense nat bouncing
+19757 19757/udp # pfSense nat bouncing
+19758 19758/tcp # pfSense nat bouncing
+19758 19758/udp # pfSense nat bouncing
+19759 19759/tcp # pfSense nat bouncing
+19759 19759/udp # pfSense nat bouncing
+19760 19760/tcp # pfSense nat bouncing
+19760 19760/udp # pfSense nat bouncing
+19761 19761/tcp # pfSense nat bouncing
+19761 19761/udp # pfSense nat bouncing
+19762 19762/tcp # pfSense nat bouncing
+19762 19762/udp # pfSense nat bouncing
+19763 19763/tcp # pfSense nat bouncing
+19763 19763/udp # pfSense nat bouncing
+19764 19764/tcp # pfSense nat bouncing
+19764 19764/udp # pfSense nat bouncing
+19765 19765/tcp # pfSense nat bouncing
+19765 19765/udp # pfSense nat bouncing
+19766 19766/tcp # pfSense nat bouncing
+19766 19766/udp # pfSense nat bouncing
+19767 19767/tcp # pfSense nat bouncing
+19767 19767/udp # pfSense nat bouncing
+19768 19768/tcp # pfSense nat bouncing
+19768 19768/udp # pfSense nat bouncing
+19769 19769/tcp # pfSense nat bouncing
+19769 19769/udp # pfSense nat bouncing
+19770 19770/tcp # pfSense nat bouncing
+19770 19770/udp # pfSense nat bouncing
+19771 19771/tcp # pfSense nat bouncing
+19771 19771/udp # pfSense nat bouncing
+19772 19772/tcp # pfSense nat bouncing
+19772 19772/udp # pfSense nat bouncing
+19773 19773/tcp # pfSense nat bouncing
+19773 19773/udp # pfSense nat bouncing
+19774 19774/tcp # pfSense nat bouncing
+19774 19774/udp # pfSense nat bouncing
+19775 19775/tcp # pfSense nat bouncing
+19775 19775/udp # pfSense nat bouncing
+19776 19776/tcp # pfSense nat bouncing
+19776 19776/udp # pfSense nat bouncing
+19777 19777/tcp # pfSense nat bouncing
+19777 19777/udp # pfSense nat bouncing
+19778 19778/tcp # pfSense nat bouncing
+19778 19778/udp # pfSense nat bouncing
+19779 19779/tcp # pfSense nat bouncing
+19779 19779/udp # pfSense nat bouncing
+19780 19780/tcp # pfSense nat bouncing
+19780 19780/udp # pfSense nat bouncing
+19781 19781/tcp # pfSense nat bouncing
+19781 19781/udp # pfSense nat bouncing
+19782 19782/tcp # pfSense nat bouncing
+19782 19782/udp # pfSense nat bouncing
+19783 19783/tcp # pfSense nat bouncing
+19783 19783/udp # pfSense nat bouncing
+19784 19784/tcp # pfSense nat bouncing
+19784 19784/udp # pfSense nat bouncing
+19785 19785/tcp # pfSense nat bouncing
+19785 19785/udp # pfSense nat bouncing
+19786 19786/tcp # pfSense nat bouncing
+19786 19786/udp # pfSense nat bouncing
+19787 19787/tcp # pfSense nat bouncing
+19787 19787/udp # pfSense nat bouncing
+19788 19788/tcp # pfSense nat bouncing
+19788 19788/udp # pfSense nat bouncing
+19789 19789/tcp # pfSense nat bouncing
+19789 19789/udp # pfSense nat bouncing
+19790 19790/tcp # pfSense nat bouncing
+19790 19790/udp # pfSense nat bouncing
+19791 19791/tcp # pfSense nat bouncing
+19791 19791/udp # pfSense nat bouncing
+19792 19792/tcp # pfSense nat bouncing
+19792 19792/udp # pfSense nat bouncing
+19793 19793/tcp # pfSense nat bouncing
+19793 19793/udp # pfSense nat bouncing
+19794 19794/tcp # pfSense nat bouncing
+19794 19794/udp # pfSense nat bouncing
+19795 19795/tcp # pfSense nat bouncing
+19795 19795/udp # pfSense nat bouncing
+19796 19796/tcp # pfSense nat bouncing
+19796 19796/udp # pfSense nat bouncing
+19797 19797/tcp # pfSense nat bouncing
+19797 19797/udp # pfSense nat bouncing
+19798 19798/tcp # pfSense nat bouncing
+19798 19798/udp # pfSense nat bouncing
+19799 19799/tcp # pfSense nat bouncing
+19799 19799/udp # pfSense nat bouncing
+19800 19800/tcp # pfSense nat bouncing
+19800 19800/udp # pfSense nat bouncing
+19801 19801/tcp # pfSense nat bouncing
+19801 19801/udp # pfSense nat bouncing
+19802 19802/tcp # pfSense nat bouncing
+19802 19802/udp # pfSense nat bouncing
+19803 19803/tcp # pfSense nat bouncing
+19803 19803/udp # pfSense nat bouncing
+19804 19804/tcp # pfSense nat bouncing
+19804 19804/udp # pfSense nat bouncing
+19805 19805/tcp # pfSense nat bouncing
+19805 19805/udp # pfSense nat bouncing
+19806 19806/tcp # pfSense nat bouncing
+19806 19806/udp # pfSense nat bouncing
+19807 19807/tcp # pfSense nat bouncing
+19807 19807/udp # pfSense nat bouncing
+19808 19808/tcp # pfSense nat bouncing
+19808 19808/udp # pfSense nat bouncing
+19809 19809/tcp # pfSense nat bouncing
+19809 19809/udp # pfSense nat bouncing
+19810 19810/tcp # pfSense nat bouncing
+19810 19810/udp # pfSense nat bouncing
+19811 19811/tcp # pfSense nat bouncing
+19811 19811/udp # pfSense nat bouncing
+19812 19812/tcp # pfSense nat bouncing
+19812 19812/udp # pfSense nat bouncing
+19813 19813/tcp # pfSense nat bouncing
+19813 19813/udp # pfSense nat bouncing
+19814 19814/tcp # pfSense nat bouncing
+19814 19814/udp # pfSense nat bouncing
+19815 19815/tcp # pfSense nat bouncing
+19815 19815/udp # pfSense nat bouncing
+19816 19816/tcp # pfSense nat bouncing
+19816 19816/udp # pfSense nat bouncing
+19817 19817/tcp # pfSense nat bouncing
+19817 19817/udp # pfSense nat bouncing
+19818 19818/tcp # pfSense nat bouncing
+19818 19818/udp # pfSense nat bouncing
+19819 19819/tcp # pfSense nat bouncing
+19819 19819/udp # pfSense nat bouncing
+19820 19820/tcp # pfSense nat bouncing
+19820 19820/udp # pfSense nat bouncing
+19821 19821/tcp # pfSense nat bouncing
+19821 19821/udp # pfSense nat bouncing
+19822 19822/tcp # pfSense nat bouncing
+19822 19822/udp # pfSense nat bouncing
+19823 19823/tcp # pfSense nat bouncing
+19823 19823/udp # pfSense nat bouncing
+19824 19824/tcp # pfSense nat bouncing
+19824 19824/udp # pfSense nat bouncing
+19825 19825/tcp # pfSense nat bouncing
+19825 19825/udp # pfSense nat bouncing
+19826 19826/tcp # pfSense nat bouncing
+19826 19826/udp # pfSense nat bouncing
+19827 19827/tcp # pfSense nat bouncing
+19827 19827/udp # pfSense nat bouncing
+19828 19828/tcp # pfSense nat bouncing
+19828 19828/udp # pfSense nat bouncing
+19829 19829/tcp # pfSense nat bouncing
+19829 19829/udp # pfSense nat bouncing
+19830 19830/tcp # pfSense nat bouncing
+19830 19830/udp # pfSense nat bouncing
+19831 19831/tcp # pfSense nat bouncing
+19831 19831/udp # pfSense nat bouncing
+19832 19832/tcp # pfSense nat bouncing
+19832 19832/udp # pfSense nat bouncing
+19833 19833/tcp # pfSense nat bouncing
+19833 19833/udp # pfSense nat bouncing
+19834 19834/tcp # pfSense nat bouncing
+19834 19834/udp # pfSense nat bouncing
+19835 19835/tcp # pfSense nat bouncing
+19835 19835/udp # pfSense nat bouncing
+19836 19836/tcp # pfSense nat bouncing
+19836 19836/udp # pfSense nat bouncing
+19837 19837/tcp # pfSense nat bouncing
+19837 19837/udp # pfSense nat bouncing
+19838 19838/tcp # pfSense nat bouncing
+19838 19838/udp # pfSense nat bouncing
+19839 19839/tcp # pfSense nat bouncing
+19839 19839/udp # pfSense nat bouncing
+19840 19840/tcp # pfSense nat bouncing
+19840 19840/udp # pfSense nat bouncing
+19841 19841/tcp # pfSense nat bouncing
+19841 19841/udp # pfSense nat bouncing
+19842 19842/tcp # pfSense nat bouncing
+19842 19842/udp # pfSense nat bouncing
+19843 19843/tcp # pfSense nat bouncing
+19843 19843/udp # pfSense nat bouncing
+19844 19844/tcp # pfSense nat bouncing
+19844 19844/udp # pfSense nat bouncing
+19845 19845/tcp # pfSense nat bouncing
+19845 19845/udp # pfSense nat bouncing
+19846 19846/tcp # pfSense nat bouncing
+19846 19846/udp # pfSense nat bouncing
+19847 19847/tcp # pfSense nat bouncing
+19847 19847/udp # pfSense nat bouncing
+19848 19848/tcp # pfSense nat bouncing
+19848 19848/udp # pfSense nat bouncing
+19849 19849/tcp # pfSense nat bouncing
+19849 19849/udp # pfSense nat bouncing
+19850 19850/tcp # pfSense nat bouncing
+19850 19850/udp # pfSense nat bouncing
+19851 19851/tcp # pfSense nat bouncing
+19851 19851/udp # pfSense nat bouncing
+19852 19852/tcp # pfSense nat bouncing
+19852 19852/udp # pfSense nat bouncing
+19853 19853/tcp # pfSense nat bouncing
+19853 19853/udp # pfSense nat bouncing
+19854 19854/tcp # pfSense nat bouncing
+19854 19854/udp # pfSense nat bouncing
+19855 19855/tcp # pfSense nat bouncing
+19855 19855/udp # pfSense nat bouncing
+19856 19856/tcp # pfSense nat bouncing
+19856 19856/udp # pfSense nat bouncing
+19857 19857/tcp # pfSense nat bouncing
+19857 19857/udp # pfSense nat bouncing
+19858 19858/tcp # pfSense nat bouncing
+19858 19858/udp # pfSense nat bouncing
+19859 19859/tcp # pfSense nat bouncing
+19859 19859/udp # pfSense nat bouncing
+19860 19860/tcp # pfSense nat bouncing
+19860 19860/udp # pfSense nat bouncing
+19861 19861/tcp # pfSense nat bouncing
+19861 19861/udp # pfSense nat bouncing
+19862 19862/tcp # pfSense nat bouncing
+19862 19862/udp # pfSense nat bouncing
+19863 19863/tcp # pfSense nat bouncing
+19863 19863/udp # pfSense nat bouncing
+19864 19864/tcp # pfSense nat bouncing
+19864 19864/udp # pfSense nat bouncing
+19865 19865/tcp # pfSense nat bouncing
+19865 19865/udp # pfSense nat bouncing
+19866 19866/tcp # pfSense nat bouncing
+19866 19866/udp # pfSense nat bouncing
+19867 19867/tcp # pfSense nat bouncing
+19867 19867/udp # pfSense nat bouncing
+19868 19868/tcp # pfSense nat bouncing
+19868 19868/udp # pfSense nat bouncing
+19869 19869/tcp # pfSense nat bouncing
+19869 19869/udp # pfSense nat bouncing
+19870 19870/tcp # pfSense nat bouncing
+19870 19870/udp # pfSense nat bouncing
+19871 19871/tcp # pfSense nat bouncing
+19871 19871/udp # pfSense nat bouncing
+19872 19872/tcp # pfSense nat bouncing
+19872 19872/udp # pfSense nat bouncing
+19873 19873/tcp # pfSense nat bouncing
+19873 19873/udp # pfSense nat bouncing
+19874 19874/tcp # pfSense nat bouncing
+19874 19874/udp # pfSense nat bouncing
+19875 19875/tcp # pfSense nat bouncing
+19875 19875/udp # pfSense nat bouncing
+19876 19876/tcp # pfSense nat bouncing
+19876 19876/udp # pfSense nat bouncing
+19877 19877/tcp # pfSense nat bouncing
+19877 19877/udp # pfSense nat bouncing
+19878 19878/tcp # pfSense nat bouncing
+19878 19878/udp # pfSense nat bouncing
+19879 19879/tcp # pfSense nat bouncing
+19879 19879/udp # pfSense nat bouncing
+19880 19880/tcp # pfSense nat bouncing
+19880 19880/udp # pfSense nat bouncing
+19881 19881/tcp # pfSense nat bouncing
+19881 19881/udp # pfSense nat bouncing
+19882 19882/tcp # pfSense nat bouncing
+19882 19882/udp # pfSense nat bouncing
+19883 19883/tcp # pfSense nat bouncing
+19883 19883/udp # pfSense nat bouncing
+19884 19884/tcp # pfSense nat bouncing
+19884 19884/udp # pfSense nat bouncing
+19885 19885/tcp # pfSense nat bouncing
+19885 19885/udp # pfSense nat bouncing
+19886 19886/tcp # pfSense nat bouncing
+19886 19886/udp # pfSense nat bouncing
+19887 19887/tcp # pfSense nat bouncing
+19887 19887/udp # pfSense nat bouncing
+19888 19888/tcp # pfSense nat bouncing
+19888 19888/udp # pfSense nat bouncing
+19889 19889/tcp # pfSense nat bouncing
+19889 19889/udp # pfSense nat bouncing
+19890 19890/tcp # pfSense nat bouncing
+19890 19890/udp # pfSense nat bouncing
+19891 19891/tcp # pfSense nat bouncing
+19891 19891/udp # pfSense nat bouncing
+19892 19892/tcp # pfSense nat bouncing
+19892 19892/udp # pfSense nat bouncing
+19893 19893/tcp # pfSense nat bouncing
+19893 19893/udp # pfSense nat bouncing
+19894 19894/tcp # pfSense nat bouncing
+19894 19894/udp # pfSense nat bouncing
+19895 19895/tcp # pfSense nat bouncing
+19895 19895/udp # pfSense nat bouncing
+19896 19896/tcp # pfSense nat bouncing
+19896 19896/udp # pfSense nat bouncing
+19897 19897/tcp # pfSense nat bouncing
+19897 19897/udp # pfSense nat bouncing
+19898 19898/tcp # pfSense nat bouncing
+19898 19898/udp # pfSense nat bouncing
+19899 19899/tcp # pfSense nat bouncing
+19899 19899/udp # pfSense nat bouncing
+19900 19900/tcp # pfSense nat bouncing
+19900 19900/udp # pfSense nat bouncing
+19901 19901/tcp # pfSense nat bouncing
+19901 19901/udp # pfSense nat bouncing
+19902 19902/tcp # pfSense nat bouncing
+19902 19902/udp # pfSense nat bouncing
+19903 19903/tcp # pfSense nat bouncing
+19903 19903/udp # pfSense nat bouncing
+19904 19904/tcp # pfSense nat bouncing
+19904 19904/udp # pfSense nat bouncing
+19905 19905/tcp # pfSense nat bouncing
+19905 19905/udp # pfSense nat bouncing
+19906 19906/tcp # pfSense nat bouncing
+19906 19906/udp # pfSense nat bouncing
+19907 19907/tcp # pfSense nat bouncing
+19907 19907/udp # pfSense nat bouncing
+19908 19908/tcp # pfSense nat bouncing
+19908 19908/udp # pfSense nat bouncing
+19909 19909/tcp # pfSense nat bouncing
+19909 19909/udp # pfSense nat bouncing
+19910 19910/tcp # pfSense nat bouncing
+19910 19910/udp # pfSense nat bouncing
+19911 19911/tcp # pfSense nat bouncing
+19911 19911/udp # pfSense nat bouncing
+19912 19912/tcp # pfSense nat bouncing
+19912 19912/udp # pfSense nat bouncing
+19913 19913/tcp # pfSense nat bouncing
+19913 19913/udp # pfSense nat bouncing
+19914 19914/tcp # pfSense nat bouncing
+19914 19914/udp # pfSense nat bouncing
+19915 19915/tcp # pfSense nat bouncing
+19915 19915/udp # pfSense nat bouncing
+19916 19916/tcp # pfSense nat bouncing
+19916 19916/udp # pfSense nat bouncing
+19917 19917/tcp # pfSense nat bouncing
+19917 19917/udp # pfSense nat bouncing
+19918 19918/tcp # pfSense nat bouncing
+19918 19918/udp # pfSense nat bouncing
+19919 19919/tcp # pfSense nat bouncing
+19919 19919/udp # pfSense nat bouncing
+19920 19920/tcp # pfSense nat bouncing
+19920 19920/udp # pfSense nat bouncing
+19921 19921/tcp # pfSense nat bouncing
+19921 19921/udp # pfSense nat bouncing
+19922 19922/tcp # pfSense nat bouncing
+19922 19922/udp # pfSense nat bouncing
+19923 19923/tcp # pfSense nat bouncing
+19923 19923/udp # pfSense nat bouncing
+19924 19924/tcp # pfSense nat bouncing
+19924 19924/udp # pfSense nat bouncing
+19925 19925/tcp # pfSense nat bouncing
+19925 19925/udp # pfSense nat bouncing
+19926 19926/tcp # pfSense nat bouncing
+19926 19926/udp # pfSense nat bouncing
+19927 19927/tcp # pfSense nat bouncing
+19927 19927/udp # pfSense nat bouncing
+19928 19928/tcp # pfSense nat bouncing
+19928 19928/udp # pfSense nat bouncing
+19929 19929/tcp # pfSense nat bouncing
+19929 19929/udp # pfSense nat bouncing
+19930 19930/tcp # pfSense nat bouncing
+19930 19930/udp # pfSense nat bouncing
+19931 19931/tcp # pfSense nat bouncing
+19931 19931/udp # pfSense nat bouncing
+19932 19932/tcp # pfSense nat bouncing
+19932 19932/udp # pfSense nat bouncing
+19933 19933/tcp # pfSense nat bouncing
+19933 19933/udp # pfSense nat bouncing
+19934 19934/tcp # pfSense nat bouncing
+19934 19934/udp # pfSense nat bouncing
+19935 19935/tcp # pfSense nat bouncing
+19935 19935/udp # pfSense nat bouncing
+19936 19936/tcp # pfSense nat bouncing
+19936 19936/udp # pfSense nat bouncing
+19937 19937/tcp # pfSense nat bouncing
+19937 19937/udp # pfSense nat bouncing
+19938 19938/tcp # pfSense nat bouncing
+19938 19938/udp # pfSense nat bouncing
+19939 19939/tcp # pfSense nat bouncing
+19939 19939/udp # pfSense nat bouncing
+19940 19940/tcp # pfSense nat bouncing
+19940 19940/udp # pfSense nat bouncing
+19941 19941/tcp # pfSense nat bouncing
+19941 19941/udp # pfSense nat bouncing
+19942 19942/tcp # pfSense nat bouncing
+19942 19942/udp # pfSense nat bouncing
+19943 19943/tcp # pfSense nat bouncing
+19943 19943/udp # pfSense nat bouncing
+19944 19944/tcp # pfSense nat bouncing
+19944 19944/udp # pfSense nat bouncing
+19945 19945/tcp # pfSense nat bouncing
+19945 19945/udp # pfSense nat bouncing
+19946 19946/tcp # pfSense nat bouncing
+19946 19946/udp # pfSense nat bouncing
+19947 19947/tcp # pfSense nat bouncing
+19947 19947/udp # pfSense nat bouncing
+19948 19948/tcp # pfSense nat bouncing
+19948 19948/udp # pfSense nat bouncing
+19949 19949/tcp # pfSense nat bouncing
+19949 19949/udp # pfSense nat bouncing
+19950 19950/tcp # pfSense nat bouncing
+19950 19950/udp # pfSense nat bouncing
+19951 19951/tcp # pfSense nat bouncing
+19951 19951/udp # pfSense nat bouncing
+19952 19952/tcp # pfSense nat bouncing
+19952 19952/udp # pfSense nat bouncing
+19953 19953/tcp # pfSense nat bouncing
+19953 19953/udp # pfSense nat bouncing
+19954 19954/tcp # pfSense nat bouncing
+19954 19954/udp # pfSense nat bouncing
+19955 19955/tcp # pfSense nat bouncing
+19955 19955/udp # pfSense nat bouncing
+19956 19956/tcp # pfSense nat bouncing
+19956 19956/udp # pfSense nat bouncing
+19957 19957/tcp # pfSense nat bouncing
+19957 19957/udp # pfSense nat bouncing
+19958 19958/tcp # pfSense nat bouncing
+19958 19958/udp # pfSense nat bouncing
+19959 19959/tcp # pfSense nat bouncing
+19959 19959/udp # pfSense nat bouncing
+19960 19960/tcp # pfSense nat bouncing
+19960 19960/udp # pfSense nat bouncing
+19961 19961/tcp # pfSense nat bouncing
+19961 19961/udp # pfSense nat bouncing
+19962 19962/tcp # pfSense nat bouncing
+19962 19962/udp # pfSense nat bouncing
+19963 19963/tcp # pfSense nat bouncing
+19963 19963/udp # pfSense nat bouncing
+19964 19964/tcp # pfSense nat bouncing
+19964 19964/udp # pfSense nat bouncing
+19965 19965/tcp # pfSense nat bouncing
+19965 19965/udp # pfSense nat bouncing
+19966 19966/tcp # pfSense nat bouncing
+19966 19966/udp # pfSense nat bouncing
+19967 19967/tcp # pfSense nat bouncing
+19967 19967/udp # pfSense nat bouncing
+19968 19968/tcp # pfSense nat bouncing
+19968 19968/udp # pfSense nat bouncing
+19969 19969/tcp # pfSense nat bouncing
+19969 19969/udp # pfSense nat bouncing
+19970 19970/tcp # pfSense nat bouncing
+19970 19970/udp # pfSense nat bouncing
+19971 19971/tcp # pfSense nat bouncing
+19971 19971/udp # pfSense nat bouncing
+19972 19972/tcp # pfSense nat bouncing
+19972 19972/udp # pfSense nat bouncing
+19973 19973/tcp # pfSense nat bouncing
+19973 19973/udp # pfSense nat bouncing
+19974 19974/tcp # pfSense nat bouncing
+19974 19974/udp # pfSense nat bouncing
+19975 19975/tcp # pfSense nat bouncing
+19975 19975/udp # pfSense nat bouncing
+19976 19976/tcp # pfSense nat bouncing
+19976 19976/udp # pfSense nat bouncing
+19977 19977/tcp # pfSense nat bouncing
+19977 19977/udp # pfSense nat bouncing
+19978 19978/tcp # pfSense nat bouncing
+19978 19978/udp # pfSense nat bouncing
+19979 19979/tcp # pfSense nat bouncing
+19979 19979/udp # pfSense nat bouncing
+19980 19980/tcp # pfSense nat bouncing
+19980 19980/udp # pfSense nat bouncing
+19981 19981/tcp # pfSense nat bouncing
+19981 19981/udp # pfSense nat bouncing
+19982 19982/tcp # pfSense nat bouncing
+19982 19982/udp # pfSense nat bouncing
+19983 19983/tcp # pfSense nat bouncing
+19983 19983/udp # pfSense nat bouncing
+19984 19984/tcp # pfSense nat bouncing
+19984 19984/udp # pfSense nat bouncing
+19985 19985/tcp # pfSense nat bouncing
+19985 19985/udp # pfSense nat bouncing
+19986 19986/tcp # pfSense nat bouncing
+19986 19986/udp # pfSense nat bouncing
+19987 19987/tcp # pfSense nat bouncing
+19987 19987/udp # pfSense nat bouncing
+19988 19988/tcp # pfSense nat bouncing
+19988 19988/udp # pfSense nat bouncing
+19989 19989/tcp # pfSense nat bouncing
+19989 19989/udp # pfSense nat bouncing
+19990 19990/tcp # pfSense nat bouncing
+19990 19990/udp # pfSense nat bouncing
+19991 19991/tcp # pfSense nat bouncing
+19991 19991/udp # pfSense nat bouncing
+19992 19992/tcp # pfSense nat bouncing
+19992 19992/udp # pfSense nat bouncing
+19993 19993/tcp # pfSense nat bouncing
+19993 19993/udp # pfSense nat bouncing
+19994 19994/tcp # pfSense nat bouncing
+19994 19994/udp # pfSense nat bouncing
+19995 19995/tcp # pfSense nat bouncing
+19995 19995/udp # pfSense nat bouncing
+19996 19996/tcp # pfSense nat bouncing
+19996 19996/udp # pfSense nat bouncing
+19997 19997/tcp # pfSense nat bouncing
+19997 19997/udp # pfSense nat bouncing
+19998 19998/tcp # pfSense nat bouncing
+19998 19998/udp # pfSense nat bouncing
+19999 19999/tcp # pfSense nat bouncing
+19999 19999/udp # pfSense nat bouncing
+dbbrowse 47557/tcp #Databeam Corporation
+dbbrowse 47557/udp #Databeam Corporation
+wnn4 22273/tcp #Wnn4 (Japanese input)
+wnn4_Cn 22289/tcp #Wnn4 (Chinese input)
+wnn4_Tw 22321/tcp #Wnn4 (Taiwanse input)
+wnn4_Kr 22305/tcp #Wnn4 (Korean input)
+wnn6 22273/tcp #Wnn6 (Japanese input)
+wnn6_Cn 22289/tcp #Wnn6 (Chinese input)
+wnn6_Tw 22321/tcp #Wnn6 (Taiwanse input)
+wnn6_Kr 22305/tcp #Wnn6 (Korean input)
+wnn6_DS 26208/tcp #Wnn6 (Dserver)
diff --git a/src/etc/shells b/src/etc/shells
new file mode 100644
index 0000000..3ccb4dc
--- /dev/null
+++ b/src/etc/shells
@@ -0,0 +1,12 @@
+# $FreeBSD: src/etc/shells,v 1.5 2000/04/27 21:58:46 ache Exp $
+#
+# List of acceptable shells for chpass(1).
+# Ftpd will not allow users to connect who are not using
+# one of these shells.
+
+/bin/sh
+/bin/csh
+/bin/tcsh
+/etc/rc.initial
+/usr/local/sbin/ssh_tunnel_shell
+
diff --git a/src/etc/skel/dot.profile b/src/etc/skel/dot.profile
new file mode 100644
index 0000000..700597a
--- /dev/null
+++ b/src/etc/skel/dot.profile
@@ -0,0 +1,5 @@
+# Detect interactive logins and display the shell
+if [ -n "${SSH_TTY}" -o "${TERM}" = "cons25" ]; then
+ /etc/rc.initial
+ exit
+fi
diff --git a/src/etc/skel/dot.shrc b/src/etc/skel/dot.shrc
new file mode 100644
index 0000000..6f3c2fc
--- /dev/null
+++ b/src/etc/skel/dot.shrc
@@ -0,0 +1,14 @@
+HTTP_PROXY=`/usr/local/bin/xmllint --xpath 'string(//pfsense/system/proxyurl)' /conf/config.xml`
+if [ "${HTTP_PROXY}" != "" ]; then
+ HTTP_PROXY_PORT=`/usr/local/bin/xmllint --xpath 'string(//pfsense/system/proxyport)' /conf/config.xml`
+ if [ "${HTTP_PROXY_PORT}" != "" ]; then
+ HTTP_PROXY="${HTTP_PROXY}:${HTTP_PROXY_PORT}"
+ fi
+ export HTTP_PROXY
+fi
+
+# Detect interactive logins and display the shell
+if [ -n "${SSH_TTY}" -o "${TERM}" = "cons25" ]; then
+ /etc/rc.initial
+ exit
+fi
diff --git a/src/etc/skel/dot.tcshrc b/src/etc/skel/dot.tcshrc
new file mode 100644
index 0000000..38cf897
--- /dev/null
+++ b/src/etc/skel/dot.tcshrc
@@ -0,0 +1,30 @@
+set prompt="%{\033[0;1;33m%}[%{\033[0;1;37m%}`cat /etc/version`%{\033[0;1;33m%}]%{\033[0;1;33m%}%B[%{\033[0;1;37m%}%n%{\033[0;1;31m%}@%{\033[0;1;37m%}%M%{\033[0;1;33m%}]%{\033[0;1;32m%}%b%/%{\033[0;1;33m%}%{\033[0;1;36m%}%{\033[0;1;31m%}:%{\033[0;0;0m%} "
+set autologout="0"
+set autolist set color set colorcat
+setenv CLICOLOR "true"
+setenv LSCOLORS "exfxcxdxbxegedabagacad"
+if ($term == "xterm" || $term == "vt100" || $term == "vt102" || $term == "vt220" || $term !~ "con*") then
+ bindkey "\e[2~" overwrite-mode # Ins
+ bindkey "\e[3~" delete-char # Del
+
+ bindkey "\e[1~" beginning-of-line # Home vt
+ bindkey "\e[4~" end-of-line # End vt
+
+ bindkey "\eOH" beginning-of-line # Home vt220
+ bindkey "\eOF" end-of-line # End vt220
+
+ bindkey "\e[H" beginning-of-line # Home kvt
+ bindkey "\e[F" end-of-line # End kvt
+
+ bindkey "\e[7~" beginning-of-line # Home rxvt/konsole
+ bindkey "\e[8~" end-of-line # End rxvt/konsole
+endif
+
+set http_proxy=`/usr/local/bin/xmllint --xpath 'string(//pfsense/system/proxyurl)' /conf/config.xml`
+if (${http_proxy} != "") then
+ set http_proxy_port=`/usr/local/bin/xmllint --xpath 'string(//pfsense/system/proxyport)' /conf/config.xml`
+ if (${http_proxy_port} != "") then
+ set http_proxy="${http_proxy}:${http_proxy_port}"
+ endif
+ setenv HTTP_PROXY ${http_proxy}
+endif
diff --git a/src/etc/ssh/sshd_config b/src/etc/ssh/sshd_config
new file mode 100644
index 0000000..f2f288b
--- /dev/null
+++ b/src/etc/ssh/sshd_config
@@ -0,0 +1,103 @@
+# $OpenBSD: sshd_config,v 1.68 2003/12/29 16:39:50 millert Exp $
+# $FreeBSD: src/crypto/openssh/sshd_config,v 1.40 2004/04/20 09:37:29 des Exp $
+
+# This is the sshd server system-wide configuration file. See
+# sshd_config(5) for more information.
+
+# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
+
+# The strategy used for options in the default sshd_config shipped with
+# OpenSSH is to specify options with their default value where
+# possible, but leave them commented. Uncommented options change a
+# default value.
+
+# Note that some of FreeBSD's defaults differ from OpenBSD's, and
+# FreeBSD has a few additional options.
+
+#VersionAddendum FreeBSD-20040419
+
+#Port 22
+#Protocol 2
+#ListenAddress 0.0.0.0
+#ListenAddress ::
+
+# HostKey for protocol version 1
+#HostKey /etc/ssh/ssh_host_key
+# HostKeys for protocol version 2
+#HostKey /etc/ssh/ssh_host_dsa_key
+
+# Lifetime and size of ephemeral version 1 server key
+#KeyRegenerationInterval 1h
+#ServerKeyBits 768
+
+# Logging
+#obsoletes QuietMode and FascistLogging
+#SyslogFacility AUTH
+#LogLevel INFO
+
+# Authentication:
+
+#LoginGraceTime 2m
+PermitRootLogin yes
+#StrictModes yes
+
+#RSAAuthentication yes
+#PubkeyAuthentication yes
+#AuthorizedKeysFile .ssh/authorized_keys
+
+# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
+#RhostsRSAAuthentication no
+# similar for protocol version 2
+#HostbasedAuthentication no
+# Change to yes if you don't trust ~/.ssh/known_hosts for
+# RhostsRSAAuthentication and HostbasedAuthentication
+#IgnoreUserKnownHosts no
+# Don't read the user's ~/.rhosts and ~/.shosts files
+#IgnoreRhosts yes
+
+# Change to yes to enable built-in password authentication.
+#PasswordAuthentication no
+#PermitEmptyPasswords no
+
+# Change to no to disable PAM authentication
+#ChallengeResponseAuthentication yes
+
+# Kerberos options
+#KerberosAuthentication no
+#KerberosOrLocalPasswd yes
+#KerberosTicketCleanup yes
+#KerberosGetAFSToken no
+
+# GSSAPI options
+#GSSAPIAuthentication no
+#GSSAPICleanupCredentials yes
+
+# Set this to 'no' to disable PAM authentication (via challenge-response)
+# and session processing.
+#UsePAM yes
+
+#AllowTcpForwarding yes
+#GatewayPorts no
+#X11DisplayOffset 10
+#X11UseLocalhost yes
+#PrintMotd yes
+#PrintLastLog yes
+#TCPKeepAlive yes
+#UseLogin no
+#UsePrivilegeSeparation yes
+#PermitUserEnvironment no
+
+#PidFile /var/run/sshd.pid
+#MaxStartups 10
+
+# no default banner path
+#Banner /some/path
+
+Compression yes
+ClientAliveInterval 30
+ClientAliveCountMax 5
+UseDNS no
+X11Forwarding no
+
+# override default of no subsystems
+Subsystem sftp /usr/libexec/sftp-server
diff --git a/src/etc/sshd b/src/etc/sshd
new file mode 100755
index 0000000..05ddb63
--- /dev/null
+++ b/src/etc/sshd
@@ -0,0 +1,207 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ sshd - Modified to work on disk based system
+ Copyright 2004 Scott K Ullrich
+
+ Original Copyright (C) 2004 Fred Mol <fredmol@xs4all.nl>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+ require_once("globals.inc");
+ require_once("config.inc");
+ require_once("functions.inc");
+ require_once("shaper.inc");
+
+ if (!isset($config['system']['enablesshd'])) {
+ return;
+ }
+
+ /* are we already running? if not, do conf_mount_rw(), otherwise it should already be rw */
+ if (!is_subsystem_dirty('sshdkeys')) {
+ conf_mount_rw();
+ }
+
+ $sshConfigDir = "/etc/ssh";
+
+ $keys = array(
+ array('type' => 'rsa1', 'suffix' => ''),
+ array('type' => 'rsa', 'suffix' => 'rsa_'),
+ array('type' => 'dsa', 'suffix' => 'dsa_'),
+ array('type' => 'ecdsa', 'suffix' => 'ecdsa_'),
+ array('type' => 'ed25519', 'suffix' => 'ed25519_')
+ );
+
+ $keyfiles = array();
+ foreach ($keys as $key) {
+ $keyfiles[] = "ssh_host_{$key['suffix']}key";
+ $keyfiles[] = "ssh_host_{$key['suffix']}key.pub";
+ }
+
+ /* restore ssh data for nanobsd platform */
+ if ($g['platform'] == "nanobsd" and file_exists("/conf/sshd/ssh_host_key") and !file_exists("{$sshConfigDir}/ssh_host_key.pub")) {
+ echo "Restoring SSH from /conf/sshd/";
+ exec("/bin/cp -p /conf/sshd/* {$sshConfigDir}/");
+
+ /* make sure host private key permissions aren't too open so sshd won't complain */
+ foreach ($keyfiles as $f2c) {
+ if (file_exists("{$sshConfigDir}/{$f2c}")) {
+ chmod("{$sshConfigDir}/{$f2c}", 0600);
+ }
+ }
+ }
+
+ /* if any of these files are 0 bytes then they are corrupted.
+ * remove them
+ */
+ foreach ($keyfiles as $f2c) {
+ if (!file_exists("{$sshConfigDir}/{$f2c}") || filesize("{$sshConfigDir}/{$f2c}") == 0) {
+ /* Make sure we remove both files */
+ unlink_if_exists($sshConfigDir . '/' . basename($f2c, ".pub"));
+ unlink_if_exists($sshConfigDir . '/' . $f2c);
+ }
+ }
+
+ if (!is_dir("/var/empty")) {
+ /* make ssh home directory */
+ mkdir("/var/empty", 0555);
+ }
+
+ if (!file_exists("/var/log/lastlog")) {
+ /* Login related files. */
+ @touch("/var/log/lastlog");
+ }
+
+ if (is_array($config['system']['ssh']) && !empty($config['system']['ssh']['port'])) {
+ $sshport = $config['system']['ssh']['port'];
+ } else {
+ $sshport = 22;
+ }
+
+ /* Include default configuration for pfSense */
+ $sshconf = "# This file is automatically generated at startup\n";
+ $sshconf .= "Ciphers aes128-ctr,aes256-ctr,arcfour256,arcfour,aes128-cbc,aes256-cbc\n";
+ $sshconf .= "PermitRootLogin yes\n";
+ $sshconf .= "Compression yes\n";
+ $sshconf .= "ClientAliveInterval 30\n";
+ $sshconf .= "UseDNS no\n";
+ $sshconf .= "X11Forwarding no\n";
+ if (isset($config['system']['ssh']['sshdkeyonly'])) {
+ $sshconf .= "# Login via Key only\n";
+ $sshconf .= "PasswordAuthentication no\n";
+ $sshconf .= "ChallengeResponseAuthentication no\n";
+ $sshconf .= "PubkeyAuthentication yes\n";
+ } else {
+ $sshconf .= "# Login via Key and Password\n";
+ $sshconf .= "PasswordAuthentication yes\n";
+ $sshconf .= "ChallengeResponseAuthentication yes\n";
+ $sshconf .= "PubkeyAuthentication yes\n";
+ }
+ $sshconf .= "# override default of no subsystems\n";
+ $sshconf .= "Subsystem sftp /usr/libexec/sftp-server\n";
+ /* Only allow protocol 2, because we say so */
+ $sshconf .= "Protocol 2\n";
+ /* Run the server on another port if we have one defined */
+ $sshconf .= "Port $sshport\n";
+ /* Hide FreeBSD version */
+ $sshconf .= "VersionAddendum none\n";
+ $sshconf .= "LoginGraceTime 30s\n";
+
+ /* Apply package SSHDCond settings if config file exists */
+ if (file_exists("/etc/sshd_extra")) {
+ $fdExtra = fopen("/etc/sshd_extra", 'r');
+ $szExtra = fread($fdExtra, 1048576); // Read up to 1MB from extra file
+ $sshconf .= $szExtra;
+ fclose($fdExtra);
+ }
+
+ /* Write the new sshd config file */
+ @file_put_contents("{$sshConfigDir}/sshd_config", $sshconf);
+
+ /* mop up from a badly implemented ssh keys -> cf backup */
+ if ($config['ssh']['dsa_key'] <> "") {
+ unset($config['ssh']['dsa_key']);
+ unset($config['ssh']['ecdsa_key']);
+ unset($config['ssh']['ed25519_key']);
+ unset($config['ssh']['rsa_key']);
+ unset($config['ssh']['rsa1_key']);
+ unset($config['ssh']['dsa']);
+ unset($config['ssh']['rsa']);
+ unset($config['ssh']['rsa1']);
+ unset($config['ssh']['ak']);
+ write_config("Clearing SSH keys from config.xml");
+ }
+
+ /* are we already running? if so exit */
+ if (is_subsystem_dirty('sshdkeys')) {
+ unset($keys, $keyfiles);
+ return;
+ }
+
+ // Check for all needed key files. If any are missing, the keys need to be regenerated.
+ $generate_keys = array();
+ foreach ($keys as $key) {
+ if (!file_exists("{$sshConfigDir}/ssh_host_{$key['suffix']}key") ||
+ !file_exists("{$sshConfigDir}/ssh_host_{$key['suffix']}key.pub")) {
+ $generate_keys[] = $key;
+ }
+ }
+
+ if (!empty($generate_keys)) {
+ /* remove previous keys and regen later */
+ file_notice("SSH", "{$g['product_name']} has started creating missing SSH keys. SSH Startup will be delayed. Please note that reloading the filter rules and changes will be delayed until this operation is completed.", "SSH KeyGen", "");
+ mark_subsystem_dirty('sshdkeys');
+ echo " Generating Keys:\n";
+ foreach ($generate_keys as $key) {
+ $_gb = exec("/usr/bin/nice -n20 /usr/bin/ssh-keygen -t {$key['type']} -N '' -f {$sshConfigDir}/ssh_host_{$key['suffix']}key");
+ }
+ clear_subsystem_dirty('sshdkeys');
+ file_notice("SSH", "{$g['product_name']} has completed creating your SSH keys. SSH is now started.", "SSH Startup", "");
+ }
+
+ /* kill existing sshd process, server only, not the childs */
+ $sshd_pid = exec("ps ax | egrep '/usr/sbin/[s]shd' | awk '{print $1}'");
+ if ($sshd_pid <> "") {
+ echo "stopping ssh process $sshd_pid \n";
+ @posix_kill($sshd_pid, SIGTERM);
+ }
+ /* Launch new server process */
+ $status = mwexec("/usr/sbin/sshd");
+ if ($status <> 0) {
+ file_notice("sshd_startup", "SSHD failed to start.", "SSHD Daemon", "");
+ echo "error!\n";
+ } else {
+ echo "done.\n";
+ }
+
+ // NanoBSD
+ if ($g['platform'] == "nanobsd") {
+ if (!is_dir("/conf/sshd")) {
+ mkdir("/conf/sshd", 0750);
+ }
+ $_gb = exec("/bin/cp -p {$sshConfigDir}/ssh_host* /conf/sshd");
+ }
+ conf_mount_ro();
+ unset($keys, $keyfiles);
+?>
diff --git a/src/etc/ssl/openssl.cnf b/src/etc/ssl/openssl.cnf
new file mode 100644
index 0000000..41664e6
--- /dev/null
+++ b/src/etc/ssl/openssl.cnf
@@ -0,0 +1,309 @@
+# $FreeBSD: src/crypto/openssl/apps/openssl.cnf,v 1.6 2004/03/17 17:44:38 nectar Exp $
+#
+# OpenSSL example configuration file.
+# This is mostly being used for generation of certificate requests.
+#
+#
+# This definition stops the following lines choking if HOME isn't
+# defined.
+HOME = .
+RANDFILE = $ENV::HOME/.rnd
+
+# default SAN value if $ENV::SAN is not defined
+#
+SAN =
+
+# Extra OBJECT IDENTIFIER info:
+#oid_file = $ENV::HOME/.oid
+oid_section = new_oids
+
+# To use this configuration file with the "-extfile" option of the
+# "openssl x509" utility, name here the section containing the
+# X.509v3 extensions to use:
+# extensions =
+# (Alternatively, use a configuration file that has only
+# X.509v3 extensions in its main [= default] section.)
+
+[ new_oids ]
+
+# We can add new OIDs in here for use by 'ca' and 'req'.
+# Add a simple OID like this:
+# testoid1=1.2.3.4
+# Or use config file substitution like this:
+# testoid2=${testoid1}.5.6
+
+####################################################################
+[ ca ]
+default_ca = CA_default # The default ca section
+
+####################################################################
+[ CA_default ]
+
+dir = ./demoCA # Where everything is kept
+certs = $dir/certs # Where the issued certs are kept
+crl_dir = $dir/crl # Where the issued crl are kept
+database = $dir/index.txt # database index file.
+#unique_subject = no # Set to 'no' to allow creation of
+ # several certificates with same subject.
+new_certs_dir = $dir/newcerts # default place for new certs.
+
+certificate = $dir/cacert.pem # The CA certificate
+serial = $dir/serial # The current serial number
+#crlnumber = $dir/crlnumber # the current crl number
+ # must be commented out to leave a V1 CRL
+crl = $dir/crl.pem # The current CRL
+private_key = $dir/private/cakey.pem# The private key
+RANDFILE = $dir/private/.rand # private random number file
+
+x509_extensions = usr_cert # The extensions to add to the cert
+
+# Comment out the following two lines for the "traditional"
+# (and highly broken) format.
+name_opt = ca_default # Subject Name options
+cert_opt = ca_default # Certificate field options
+
+# Extension copying option: use with caution.
+# copy_extensions = copy
+
+# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
+# so this is commented out by default to leave a V1 CRL.
+# crlnumber must also be commented out to leave a V1 CRL.
+crl_extensions = crl_ext
+
+default_days = 365 # how long to certify for
+default_crl_days= 30 # how long before next CRL
+default_md = md5 # which md to use.
+preserve = no # keep passed DN ordering
+
+# A few difference way of specifying how similar the request should look
+# For type CA, the listed attributes must be the same, and the optional
+# and supplied fields are just that :-)
+policy = policy_match
+
+# For the CA policy
+[ policy_match ]
+countryName = match
+stateOrProvinceName = match
+organizationName = match
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+# For the 'anything' policy
+# At this point in time, you must list all acceptable 'object'
+# types.
+[ policy_anything ]
+countryName = optional
+stateOrProvinceName = optional
+localityName = optional
+organizationName = optional
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+####################################################################
+[ req ]
+distinguished_name=req_distinguished_name
+req_extensions = v3_req
+prompt=no
+
+default_bits = 2048
+default_keyfile = privkey.pem
+distinguished_name = req_distinguished_name
+attributes = req_attributes
+x509_extensions = v3_ca # The extensions to add to the self signed cert
+
+# Passwords for private keys if not present they will be prompted for
+#input_password=""
+#output_password=""
+
+# This sets a mask for permitted string types. There are several options.
+# default: PrintableString, T61String, BMPString.
+# pkix : PrintableString, BMPString.
+# utf8only: only UTF8Strings.
+# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
+# MASK:XXXX a literal mask value.
+# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
+# so use this option with caution!
+string_mask = nombstr
+
+# req_extensions = v3_req # The extensions to add to a certificate request
+
+[ req_distinguished_name ]
+countryName = US
+#countryName_default = AU
+#countryName_min = 2
+#countryName_max = 2
+
+stateOrProvinceName = Somewhere
+#stateOrProvinceName_default = Somestate
+
+localityName = Somecity
+
+0.organizationName = CompanyName
+#0.organizationName_default = SampleNameDefault
+
+# we can do this but it is not needed normally :-)
+#1.organizationName = Second Organization Name (eg, company)
+#1.organizationName_default = World Wide Web Pty Ltd
+
+organizationalUnitName = Organizational Unit Name (eg, section)
+#organizationalUnitName_default =
+
+commonName = Common Name (eg, YOUR name)
+#commonName_max = 64
+
+emailAddress = Email Address
+#emailAddress_max = 64
+
+# SET-ex3 = SET extension number 3
+
+[ req_attributes ]
+challengePassword = A challenge password
+#challengePassword_min = 4
+#challengePassword_max = 20
+
+unstructuredName = An optional company name
+
+[ usr_cert ]
+
+# These extensions are added when 'ca' signs a request.
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# Here are some examples of the usage of nsCertType. If it is omitted
+# the certificate can be used for anything *except* object signing.
+
+# This is OK for an SSL server.
+# nsCertType = server
+
+# For an object signing certificate this would be used.
+# nsCertType = objsign
+
+# For normal client use this is typical
+# nsCertType = client, email
+
+# and for everything including object signing:
+# nsCertType = client, email, objsign
+
+# This is typical in keyUsage for a client certificate.
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# This will be displayed in Netscape's comment listbox.
+nsComment = "OpenSSL Generated User Certificate"
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer:always
+extendedKeyUsage=clientAuth
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
+#nsBaseUrl
+#nsRevocationUrl
+#nsRenewalUrl
+#nsCaPolicyUrl
+#nsSslServerName
+
+[ usr_cert_san ]
+
+# copy of [ usr_cert ] plus nonempty Subject Alternative Names
+basicConstraints=CA:FALSE
+nsComment = "OpenSSL Generated User Certificate"
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer:always
+extendedKeyUsage=clientAuth
+subjectAltName=$ENV::SAN
+
+[ server ]
+
+# Make a cert with nsCertType=server
+basicConstraints=CA:FALSE
+nsCertType = server
+nsComment = "OpenSSL Generated Server Certificate"
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer:always
+extendedKeyUsage=serverAuth,1.3.6.1.5.5.8.2.2
+keyUsage = digitalSignature, keyEncipherment
+
+[ server_san ]
+
+# copy of [ server ] plus nonempty Subject Alternative Names
+basicConstraints=CA:FALSE
+nsCertType = server
+nsComment = "OpenSSL Generated Server Certificate"
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer:always
+extendedKeyUsage=serverAuth,1.3.6.1.5.5.8.2.2
+keyUsage = digitalSignature, keyEncipherment
+subjectAltName=$ENV::SAN
+
+[ v3_req ]
+
+# Extensions to add to a certificate request
+
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+[ v3_ca ]
+
+
+# Extensions for a typical CA
+
+
+# PKIX recommendation.
+
+subjectKeyIdentifier=hash
+
+authorityKeyIdentifier=keyid:always,issuer:always
+
+# This is what PKIX recommends but some broken software chokes on critical
+# extensions.
+#basicConstraints = critical,CA:true
+# So we do this instead.
+basicConstraints = CA:true
+
+# Key usage: this is typical for a CA certificate.
+keyUsage = cRLSign, keyCertSign
+
+# Some might want this also
+# nsCertType = sslCA, emailCA
+
+# Include email address in subject alt name: another PKIX recommendation
+# subjectAltName=email:copy
+# Copy issuer details
+# issuerAltName=issuer:copy
+
+# DER hex encoding of an extension: beware experts only!
+# obj=DER:02:03
+# Where 'obj' is a standard or added object
+# You can even override a supported extension:
+# basicConstraints= critical, DER:30:03:01:01:FF
+
+[ v3_ca_san ]
+
+# copy of [ v3_ca ] plus nonempty Subject Alternative Names
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid:always,issuer:always
+basicConstraints = CA:true
+subjectAltName=$ENV::SAN
+
+[ crl_ext ]
+
+# CRL extensions.
+# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
+
+# issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always,issuer:always
diff --git a/src/etc/syslog.conf b/src/etc/syslog.conf
new file mode 100644
index 0000000..6f29538
--- /dev/null
+++ b/src/etc/syslog.conf
@@ -0,0 +1,12 @@
+local0.* %/var/log/filter.log
+local3.* %/var/log/vpn.log
+local4.* %/var/log/portalauth.log
+local7.* %/var/log/dhcpd.log
+local7.none %/var/log/system.log
+kern.debug;lpr.info;mail.crit; %/var/log/system.log
+news.err;local3.none;local4.none; %/var/log/system.log
+*.notice; %/var/log/system.log
+local0.none;daemon.info %/var/log/system.log
+daemon.info;security.* %/var/log/ipsec.log
+auth.info;authpriv.info %/var/log/system.log
+auth.info;authpriv.info |exec /usr/local/sbin/sshlockout_pf
diff --git a/src/etc/ttys b/src/etc/ttys
new file mode 100644
index 0000000..382c6a7
--- /dev/null
+++ b/src/etc/ttys
@@ -0,0 +1,49 @@
+#
+# $FreeBSD: stable/10/etc/etc.amd64/ttys 267236 2014-06-08 17:50:07Z nwhitehorn $
+# @(#)ttys 5.1 (Berkeley) 4/17/89
+#
+# This file specifies various information about terminals on the system.
+# It is used by several different programs. Common entries for the
+# various columns include:
+#
+# name The name of the terminal device.
+#
+# getty The program to start running on the terminal. Typically a
+# getty program, as the name implies. Other common entries
+# include none, when no getty is needed, and xdm, to start the
+# X Window System.
+#
+# type The initial terminal type for this port. For hardwired
+# terminal lines, this will contain the type of terminal used.
+# For virtual consoles, the correct type is typically xterm.
+# Other common values include dialup for incoming modem ports, and
+# unknown when the terminal type cannot be predetermined.
+#
+# status Must be on or off. If on, init will run the getty program on
+# the specified port. If the word "secure" appears, this tty
+# allows root login.
+#
+# name getty type status comments
+#
+# If console is marked "insecure", then init will ask for the root password
+# when going to single-user mode.
+console none unknown off secure
+#
+ttyv0 "/usr/libexec/getty al.Pc" cons25 on secure
+# Virtual terminals
+ttyv1 "/usr/libexec/getty Pc" xterm off secure
+ttyv2 "/usr/libexec/getty Pc" xterm off secure
+ttyv3 "/usr/libexec/getty Pc" xterm off secure
+ttyv4 "/usr/libexec/getty Pc" xterm off secure
+ttyv5 "/usr/libexec/getty Pc" xterm off secure
+ttyv6 "/usr/libexec/getty Pc" xterm off secure
+ttyv7 "/usr/libexec/getty Pc" xterm off secure
+ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure
+# Serial terminals
+# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
+ttyu0 "/usr/libexec/getty al.115200" cons25 onifconsole secure
+ttyu1 "/usr/libexec/getty al.115200" cons25 onifconsole secure
+ttyu2 "/usr/libexec/getty al.115200" cons25 onifconsole secure
+ttyu3 "/usr/libexec/getty al.115200" cons25 onifconsole secure
+# Dumb console
+dcons "/usr/libexec/getty std.9600" vt100 off secure
diff --git a/src/etc/version b/src/etc/version
new file mode 100644
index 0000000..d5221db
--- /dev/null
+++ b/src/etc/version
@@ -0,0 +1 @@
+2.3-DEVELOPMENT
diff --git a/src/home/.empty b/src/home/.empty
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/home/.empty
diff --git a/src/root/.gitsync_merge.sample b/src/root/.gitsync_merge.sample
new file mode 100644
index 0000000..1c2606c
--- /dev/null
+++ b/src/root/.gitsync_merge.sample
@@ -0,0 +1,3 @@
+# Sample automatic merge list for gitsync
+# gitsync will automatically merge anything listed in /root/.gitsync_merge
+http://repositorysite/my_repository.git my_branch
diff --git a/src/root/.hushlogin b/src/root/.hushlogin
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/root/.hushlogin
diff --git a/src/root/.profile b/src/root/.profile
new file mode 100644
index 0000000..700597a
--- /dev/null
+++ b/src/root/.profile
@@ -0,0 +1,5 @@
+# Detect interactive logins and display the shell
+if [ -n "${SSH_TTY}" -o "${TERM}" = "cons25" ]; then
+ /etc/rc.initial
+ exit
+fi
diff --git a/src/root/.shrc b/src/root/.shrc
new file mode 100644
index 0000000..6f3c2fc
--- /dev/null
+++ b/src/root/.shrc
@@ -0,0 +1,14 @@
+HTTP_PROXY=`/usr/local/bin/xmllint --xpath 'string(//pfsense/system/proxyurl)' /conf/config.xml`
+if [ "${HTTP_PROXY}" != "" ]; then
+ HTTP_PROXY_PORT=`/usr/local/bin/xmllint --xpath 'string(//pfsense/system/proxyport)' /conf/config.xml`
+ if [ "${HTTP_PROXY_PORT}" != "" ]; then
+ HTTP_PROXY="${HTTP_PROXY}:${HTTP_PROXY_PORT}"
+ fi
+ export HTTP_PROXY
+fi
+
+# Detect interactive logins and display the shell
+if [ -n "${SSH_TTY}" -o "${TERM}" = "cons25" ]; then
+ /etc/rc.initial
+ exit
+fi
diff --git a/src/root/.tcshrc b/src/root/.tcshrc
new file mode 100644
index 0000000..38cf897
--- /dev/null
+++ b/src/root/.tcshrc
@@ -0,0 +1,30 @@
+set prompt="%{\033[0;1;33m%}[%{\033[0;1;37m%}`cat /etc/version`%{\033[0;1;33m%}]%{\033[0;1;33m%}%B[%{\033[0;1;37m%}%n%{\033[0;1;31m%}@%{\033[0;1;37m%}%M%{\033[0;1;33m%}]%{\033[0;1;32m%}%b%/%{\033[0;1;33m%}%{\033[0;1;36m%}%{\033[0;1;31m%}:%{\033[0;0;0m%} "
+set autologout="0"
+set autolist set color set colorcat
+setenv CLICOLOR "true"
+setenv LSCOLORS "exfxcxdxbxegedabagacad"
+if ($term == "xterm" || $term == "vt100" || $term == "vt102" || $term == "vt220" || $term !~ "con*") then
+ bindkey "\e[2~" overwrite-mode # Ins
+ bindkey "\e[3~" delete-char # Del
+
+ bindkey "\e[1~" beginning-of-line # Home vt
+ bindkey "\e[4~" end-of-line # End vt
+
+ bindkey "\eOH" beginning-of-line # Home vt220
+ bindkey "\eOF" end-of-line # End vt220
+
+ bindkey "\e[H" beginning-of-line # Home kvt
+ bindkey "\e[F" end-of-line # End kvt
+
+ bindkey "\e[7~" beginning-of-line # Home rxvt/konsole
+ bindkey "\e[8~" end-of-line # End rxvt/konsole
+endif
+
+set http_proxy=`/usr/local/bin/xmllint --xpath 'string(//pfsense/system/proxyurl)' /conf/config.xml`
+if (${http_proxy} != "") then
+ set http_proxy_port=`/usr/local/bin/xmllint --xpath 'string(//pfsense/system/proxyport)' /conf/config.xml`
+ if (${http_proxy_port} != "") then
+ set http_proxy="${http_proxy}:${http_proxy_port}"
+ endif
+ setenv HTTP_PROXY ${http_proxy}
+endif
diff --git a/src/sbin/athctrl.sh b/src/sbin/athctrl.sh
new file mode 100755
index 0000000..6ba35ff
--- /dev/null
+++ b/src/sbin/athctrl.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Set the IFS parameters for an interface configured for
+# point-to-point use at a specific distance. Based on a
+# program by Gunter Burchardt.
+#
+DEV=ath0
+d=0
+
+usage()
+{
+ echo "Usage: $0 [-i athX] [-d meters]"
+ exit 2
+}
+
+args=`getopt d:i: $*`
+test $? -ne 0 && usage
+
+set -- $args
+for i; do
+ case "$i" in
+ -i) DEV="$2"; shift; shift;;
+ -d) d="$2"; shift; shift;;
+ --) shift; break;
+ esac
+done
+
+test $d -eq 0 && usage
+
+slottime=`expr 9 + \( $d / 300 \)`
+if expr \( $d % 300 \) != 0 >/dev/null 2>&1; then
+ slottime=`expr $slottime + 1`
+fi
+timeout=`expr $slottime \* 2 + 3`
+
+printf "Setup IFS parameters on interface ${DEV} for %i meter p-2-p link\n" $d
+ATHN=`echo $DEV | sed 's/ath//'`
+sysctl dev.ath.$ATHN.slottime=$slottime
+sysctl dev.ath.$ATHN.acktimeout=$timeout
+sysctl dev.ath.$ATHN.ctstimeout=$timeout
+
diff --git a/src/sbin/dhclient-script b/src/sbin/dhclient-script
new file mode 100755
index 0000000..9d71aaf
--- /dev/null
+++ b/src/sbin/dhclient-script
@@ -0,0 +1,404 @@
+#!/bin/sh
+# $Id$
+# $OpenBSD: dhclient-script,v 1.6 2004/05/06 18:22:41 claudio Exp $
+# $FreeBSD: src/sbin/dhclient/dhclient-script,v 1.4 2005/06/10 03:41:18 brooks Exp $
+#
+# Copyright (c) 2003 Kenneth R Westerback <krw@openbsd.org>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+NETSTAT=/usr/bin/netstat
+GREP=/usr/bin/grep
+AWK=/usr/bin/awk
+HOSTNAME=/bin/hostname
+GREP=/usr/bin/grep
+ROUTE=/sbin/route
+SED=/usr/bin/sed
+ARP=/usr/sbin/arp
+IFCONFIG=/sbin/ifconfig
+PFCTL=/sbin/pfctl
+
+LOCALHOST=127.0.0.1
+
+if [ -x /usr/bin/logger ]; then
+ LOGGER="/usr/bin/logger -s -p user.notice -t dhclient"
+else
+ LOGGER="echo"
+fi
+
+#
+# Helper functions that implement common actions.
+#
+
+check_hostname() {
+ current_hostname=`$HOSTNAME`
+ if [ -z "$current_hostname" ] || \
+ [ "$current_hostname" = "$old_host_name" -a \
+ "$new_hostname" != "$old_host_name" ]; then
+ $LOGGER "New Hostname ($interface): $new_host_name"
+ $HOSTNAME $new_host_name
+ fi
+}
+
+arp_flush() {
+ $ARP -an -i $interface | \
+ $SED -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' | \
+ /bin/sh >/dev/null 2>&1
+}
+
+# NOTE: use of the below has been disabled because rc.newwanip handles this correctly and this
+# unnecessarily killed states in multiple circumstances. Leaving here for now, should be safe
+# to remove later. -cmb 20141105
+delete_old_states() {
+ $LOGGER "Starting delete_old_states()"
+ _FLUSHED=0
+ # If the IP changed, remove states from the old one
+ if [ -f /var/db/${interface}_ip ]; then
+ OLD_IP=`cat /var/db/${interface}_ip`
+ $LOGGER "Comparing IPs: Old: ${OLD_IP} New: ${new_ip_address}"
+ if [ -n "${OLD_IP}" ] && [ "${OLD_IP}" != "${new_ip_address}" ]; then
+ $LOGGER "Removing states from old IP '${OLD_IP}' (new IP '${new_ip_address}')"
+ ${PFCTL} -i $interface -Fs
+ ${PFCTL} -K ${OLD_IP}/32
+ _FLUSHED=1
+ fi
+ fi
+ # Delete states through old gateway if it's not the same
+ OLD_ROUTER=""
+ if [ -n "${old_routers}" ]; then
+ OLD_ROUTER=$old_routers
+ elif [ -f /tmp/${interface}_router ]; then
+ OLD_ROUTER=`cat /tmp/${interface}_router`
+ fi
+ if [ ${_FLUSHED} -eq 0 -a -n "${OLD_ROUTER}" ]; then
+ $LOGGER "Comparing Routers: Old: ${OLD_ROUTER} New: ${new_routers}"
+ if [ "${OLD_ROUTER}" != "${new_routers}" ]; then
+ $LOGGER "Removing states through old gateway '${OLD_ROUTER}' (new gateway '${new_routers}')"
+ ${PFCTL} -i $interface -Fs
+ fi
+ fi
+}
+
+delete_old_address() {
+ /bin/rm -f /var/db/${interface}_ip
+ $IFCONFIG $interface inet -alias $old_ip_address $medium
+}
+
+add_new_address() {
+
+ $LOGGER "Starting add_new_address()"
+
+ $LOGGER "ifconfig $interface inet $new_ip_address netmask $new_subnet_mask broadcast $new_broadcast_address $medium"
+
+ $IFCONFIG $interface \
+ inet $new_ip_address \
+ netmask $new_subnet_mask \
+ broadcast $new_broadcast_address \
+ $medium
+ $IFCONFIG $interface setfirst $new_ip_address
+
+ $LOGGER "New IP Address ($interface): $new_ip_address"
+ $LOGGER "New Subnet Mask ($interface): $new_subnet_mask"
+ $LOGGER "New Broadcast Address ($interface): $new_broadcast_address"
+ $LOGGER "New Routers ($interface): $new_routers"
+
+
+ # This is necessary otherwise apinger will try to ping all 1s address
+ if [ -n "$new_routers" ] && [ "$new_routers" != "255.255.255.255" ]; then
+ echo $new_routers > /tmp/${interface}_router
+ fi
+ echo $new_ip_address > /var/db/${interface}_ip
+}
+
+delete_old_alias() {
+ if [ -n "$alias_ip_address" ]; then
+ $IFCONFIG $interface inet -alias $alias_ip_address > /dev/null 2>&1
+ $ROUTE delete $alias_ip_address $LOCALHOST > /dev/null 2>&1
+ fi
+}
+
+add_new_alias() {
+ if [ -n "$alias_ip_address" ]; then
+ $IFCONFIG $interface inet alias $alias_ip_address netmask \
+ $alias_subnet_mask
+ $ROUTE add $alias_ip_address $LOCALHOST
+ fi
+}
+
+fill_classless_routes() {
+ set $1
+ while [ $# -ge 5 ]; do
+ if [ $1 -eq 0 ]; then
+ route="default"
+ elif [ $1 -le 8 ]; then
+ route="$2.0.0.0/$1"
+ shift
+ elif [ $1 -le 16 ]; then
+ route="$2.$3.0.0/$1"
+ shift; shift
+ elif [ $1 -le 24 ]; then
+ route="$2.$3.$4.0/$1"
+ shift; shift; shift
+ else
+ route="$2.$3.$4.$5/$1"
+ shift; shift; shift; shift
+ fi
+ shift
+ router="$1.$2.$3.$4"
+ classless_routes="$classless_routes $route $router"
+ shift; shift; shift; shift
+ done
+}
+
+delete_old_routes() {
+ $LOGGER "Deleting old routes"
+
+ if [ -n "$old_classless_routes" ]; then
+ fill_classless_routes "$old_classless_routes"
+ set $classless_routes
+ while [ $# -gt 1 ]; do
+ route delete "$1" "$2"
+ shift; shift
+ done
+ return 0;
+ fi
+
+ # Only allow the default route to be overridden if it's on our own interface
+ if [ -f "/tmp/${interface}_defaultgw" ]; then
+ for router in $old_routers; do
+ $ROUTE delete default $router >/dev/null 2>&1
+ /bin/rm -f /tmp/${interface}_router
+ done
+ fi
+
+ if [ -n "$old_static_routes" ]; then
+ set $old_static_routes
+ while [ $# -gt 1 ]; do
+ $ROUTE delete "$1" "$2"
+ shift; shift
+ /bin/rm -f /tmp/${interface}_router
+ done
+ fi
+
+ arp_flush
+}
+
+add_new_routes() {
+ $LOGGER "Adding new routes to interface: $interface"
+
+ # RFC 3442: If the DHCP server returns both a Classless Static
+ # Routes option and a Router option, the DHCP client MUST ignore
+ # the Router option.
+ #
+ # DHCP clients that support this option (Classless Static Routes)
+ # MUST NOT install the routes specified in the Static Routes
+ # option (option code 33) if both a Static Routes option and the
+ # Classless Static Routes option are provided.
+ if [ -n "$new_classless_routes" ]; then
+ fill_classless_routes "$new_classless_routes"
+ $LOGGER "New Classless Static Routes ($interface): $classless_routes"
+ set $classless_routes
+ while [ $# -gt 1 ]; do
+ if [ "0.0.0.0" = "$2" ]; then
+ route add "$1" -iface "$interface"
+ else
+ route add "$1" "$2"
+ fi
+ shift; shift
+ done
+ return
+ fi
+
+ ADDED_ROUTE=no
+ EXISTSGW=`/bin/ls -l /tmp/*_defaultgw | /usr/bin/wc -l`
+ # Only allow the default route to be overridden if it's on our own interface
+ if [ -f "/tmp/${interface}_defaultgw" -o $EXISTSGW -eq 0 ]; then
+ $ROUTE delete default
+ for router in $new_routers; do
+ if [ "$new_ip_address" = "$router" -o "$router" = "255.255.255.255" ]; then
+ $ROUTE add default -iface $interface
+ echo $ROUTE add default -iface $interface | $LOGGER
+ # NOTE: Do not activate this for all ones address since pf(4) will try to forward packets to it.
+ if [ "$new_ip_address" = "$router" ]; then
+ echo $router > /tmp/${interface}_router
+ fi
+ else
+ $ROUTE add default $router
+ echo $ROUTE add default $router | $LOGGER
+ echo $router > /tmp/${interface}_router
+ fi
+ ADDED_ROUTE=yes
+ # 2nd and subsequent default routers error out, so explicitly
+ # stop processing the list after the first one.
+ break
+ done
+ fi
+
+ if [ -n "$new_static_routes" ]; then
+ $LOGGER "New Static Routes ($interface): $new_static_routes"
+ set $new_static_routes
+ while [ $# -gt 1 ]; do
+ $ROUTE add $1 $2
+ if [ "$ADDED_ROUTE" = "no" ]; then
+ echo $2 > /tmp/${interface}_router
+ fi
+ shift; shift
+ done
+ fi
+}
+
+add_new_resolv_conf() {
+ $LOGGER "Creating resolv.conf"
+ if [ -f "/var/etc/nameserver_$interface" ]; then
+ # Remove old entries
+ for nameserver in `cat /var/etc/nameserver_$interface`; do
+ $ROUTE delete $nameserver >/dev/null 2>&1
+ done
+ fi
+ if [ -n "$new_domain_name_servers" ]; then
+ /bin/rm -f /var/etc/nameserver_$interface
+ ALLOWOVERRIDE=`/usr/bin/grep dnsallowoverride /conf/config.xml | /usr/bin/wc -l`
+ for nameserver in $new_domain_name_servers; do
+ # Add a route to the nameserver out the correct interface
+ # so that mulitple wans work correctly with multiple dns
+ # also backup the nameserver for later route removal
+ if [ $ALLOWOVERRIDE -gt 0 ]; then
+ echo $nameserver >>/var/etc/nameserver_$interface
+ $ROUTE add $nameserver -iface $interface
+ fi
+ done
+ echo $new_domain_name >/var/etc/searchdomain_$interface
+ fi
+
+ return 0
+}
+
+# Notify rc.newwanip of changes to an interface
+notify_rc_newwanip() {
+ /usr/local/sbin/pfSctl -c "interface newip $interface"
+}
+
+#
+# Start of active code.
+#
+
+# Invoke the local dhcp client enter hooks, if they exist.
+if [ -f /etc/dhclient-enter-hooks ]; then
+ $LOGGER "dhclient-enter-hooks"
+ exit_status=0
+ . /etc/dhclient-enter-hooks
+ # allow the local script to abort processing of this state
+ # local script must set exit_status variable to nonzero.
+ if [ $exit_status -ne 0 ]; then
+ exit $exit_status
+ fi
+fi
+
+#if [ -x $ROUTE ]; then
+# if_defaultroute=`$ROUTE -n get -inet default | $GREP interface | $AWK '{print $2}'`
+#else
+# $LOGGER "if_defaultroute"
+# if_defaultroute="x"
+#fi
+
+$LOGGER $reason
+case $reason in
+MEDIUM)
+ $IFCONFIG $interface $medium
+ $IFCONFIG $interface inet -alias 0.0.0.0 $medium >/dev/null 2>&1
+ /bin/sleep 1
+ ;;
+
+PREINIT)
+ delete_old_alias
+ $IFCONFIG $interface inet 0.0.0.0 netmask 255.0.0.0 broadcast 255.255.255.255 up
+ /bin/rm -f /tmp/${interface}_router
+ ;;
+
+ARPCHECK|ARPSEND)
+ ;;
+
+BOUND|RENEW|REBIND|REBOOT)
+ check_hostname
+ changes="no"
+ if [ -n "$old_ip_address" ]; then
+ if [ -n "$alias_ip_address" ] && \
+ [ "$old_ip_address" != "$alias_ip_address" ]; then
+ delete_old_alias
+ changes="yes"
+ fi
+ if [ "$old_ip_address" != "$new_ip_address" ]; then
+ delete_old_address
+ delete_old_routes
+ changes="yes"
+ fi
+ fi
+ if [ "$reason" = BOUND ] || \
+ [ "$reason" = REBOOT ] || \
+ [ -z "$old_ip_address" ] || \
+ [ "$old_ip_address" != "$new_ip_address" ]; then
+ add_new_address
+ add_new_routes
+ changes="yes"
+ fi
+ if [ -n "$alias_ip_address" ] && \
+ [ "$new_ip_address" != "$alias_ip_address" ]; then
+ add_new_alias
+ changes="yes"
+ fi
+ add_new_resolv_conf
+ if [ "$changes" = "yes" ] ; then
+ notify_rc_newwanip
+ fi
+ ;;
+
+EXPIRE|FAIL)
+ delete_old_alias
+ if [ -n "$old_ip_address" ]; then
+ delete_old_address
+ delete_old_routes
+ fi
+ ;;
+
+TIMEOUT)
+ delete_old_alias
+ add_new_address
+ /bin/sleep 1
+ if [ -n "$new_routers" ]; then
+ $LOGGER "New Routers ($interface): $new_routers"
+ set "$new_routers"
+ if /sbin/ping -q -c 1 -t 1 "$1"; then
+ if [ "$new_ip_address" != "$alias_ip_address" ]; then
+ add_new_alias
+ fi
+ add_new_routes
+ if add_new_resolv_conf; then
+ notify_rc_newwanip
+ fi
+ fi
+ fi
+ $IFCONFIG $interface inet -alias $new_ip_address $medium
+ delete_old_routes
+ ;;
+esac
+
+# Invoke the local dhcp client exit hooks, if they exist.
+if [ -f /etc/dhclient-exit-hooks ]; then
+ $LOGGER "dhclient-exit-hooks"
+ exit_status=0
+ . /etc/dhclient-exit-hooks
+ # allow the local script to abort processing of this state
+ # local script must set exit_status variable to nonzero.
+ exit $exit_status
+fi
diff --git a/src/usr/local/bin/3gstats.php b/src/usr/local/bin/3gstats.php
new file mode 100755
index 0000000..cc385fc
--- /dev/null
+++ b/src/usr/local/bin/3gstats.php
@@ -0,0 +1,83 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+
+ini_set("max_execution_time", "0");
+
+if(empty($argv[1])) {
+ echo "No modem device given \n";
+ exit(0);
+}
+
+/* Huawei example */
+$device = "/dev/{$argv[1]}";
+$statfile = "/tmp/3gstats.{$argv[2]}";
+/* mode is a comma separated value, thus submode is born */
+$header = "#seconds,rssi,mode,submode,upstream,downstream,sentbytes,receivedbyts,bwupstream,bwdownstream,simstate,service\n";
+
+$i = 0;
+
+$record = array();
+$handle = fopen($device, "r");
+if(! $handle) {
+ echo "Can not open modem stats device\n";
+ exit(1);
+}
+
+$record['time'] = 0;
+$record['rssi'] = 0;
+$record['mode'] = "0,0";
+$record['upstream'] = 0;
+$record['downstream'] = 0;
+$record['sent'] = 0;
+$record['received'] = 0;
+$record['bwupstream'] = 0;
+$record['bwdownstream'] = 0;
+$record['simstate'] = 0;
+$record['service'] = 0;
+
+while (true) {
+ $string = "";
+ $string = fgets($handle, 256);
+
+ $elements = array();
+ $elements = explode(':', $string);
+ $elements[0] = trim($elements[0]);
+ $elements[1] = trim($elements[1]);
+
+ switch ($elements[0]) {
+ case "^MODE":
+ $record['mode'] = $elements[1];
+ break;
+ case "^SRVST":
+ $record['service'] = $elements[1];
+ break;
+ case "^SIMST":
+ $record['simstate'] = $elements[1];
+ break;
+ case "^RSSI":
+ $record['rssi'] = $elements[1];
+ break;
+ case "^DSFLOWRPT":
+ $items = array();
+ $items = explode(',', $elements[1]);
+ $record['time'] = hexdec($items[0]);
+ $record['upstream'] = round((floatval(hexdec($items[1])) * 8) /1024);
+ $record['downstream'] = round((floatval(hexdec($items[2])) * 8) /1024);
+ $record['sent'] = hexdec($items[3]);
+ $record['received'] = hexdec($items[4]);
+ $record['bwupstream'] = round((floatval(hexdec($items[5])) * 8) /1024);
+ $record['bwdownstream'] = round((floatval(hexdec($items[6])) * 8) /1024);
+ break;
+ }
+
+ if ($i > 10) {
+ $csv = $header;
+ $csv .= implode(",", $record);
+ $csv .= "\n";
+ file_put_contents($statfile, $csv);
+ $i = 0;
+ }
+ $i++;
+}
+fclose($handle);
+?>
diff --git a/src/usr/local/bin/beep.sh b/src/usr/local/bin/beep.sh
new file mode 100755
index 0000000..ed9382d
--- /dev/null
+++ b/src/usr/local/bin/beep.sh
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+
+BEEP=`/usr/bin/grep -c disablebeep /conf/config.xml`
+if [ $BEEP -gt 0 ]; then
+ exit;
+fi
+
+# Standard note length
+NOTELENGTH="25"
+
+# this is super annoying in VMware, exit if in VMware
+if [ -f /var/log/dmesg.boot ]; then
+ VMWCOUNT=`/usr/bin/grep -c VMware /var/log/dmesg.boot`
+ if [ $VMWCOUNT -gt 0 ]; then
+ exit;
+ fi
+fi
+
+# Check for different HZ
+if [ -f /boot/loader.conf ]; then
+ HZ=`/usr/bin/grep -c kern.hz /boot/loader.conf`
+ if [ "$HZ" = "1" ]; then
+ NOTELENGTH="10"
+ fi
+fi
+
+if [ -c "/dev/speaker" ]; then
+ if [ "$1" = "start" ]; then
+ /usr/local/bin/beep -p 500 $NOTELENGTH
+ /usr/local/bin/beep -p 400 $NOTELENGTH
+ /usr/local/bin/beep -p 600 $NOTELENGTH
+ /usr/local/bin/beep -p 800 $NOTELENGTH
+ /usr/local/bin/beep -p 800 $NOTELENGTH
+ fi
+ if [ "$1" = "stop" ]; then
+ /usr/local/bin/beep -p 600 $NOTELENGTH
+ /usr/local/bin/beep -p 800 $NOTELENGTH
+ /usr/local/bin/beep -p 500 $NOTELENGTH
+ /usr/local/bin/beep -p 400 $NOTELENGTH
+ /usr/local/bin/beep -p 400 $NOTELENGTH
+ fi
+fi
diff --git a/src/usr/local/bin/captiveportal_gather_stats.php b/src/usr/local/bin/captiveportal_gather_stats.php
new file mode 100644
index 0000000..23d6b5d
--- /dev/null
+++ b/src/usr/local/bin/captiveportal_gather_stats.php
@@ -0,0 +1,115 @@
+#!/usr/local/bin/php-cgi -q
+<?php
+/* $Id$ */
+/*
+ captiveportal_gather_stats.php
+ Copyright (C) 2011 Warren Baker
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("functions.inc");
+require_once("captiveportal.inc");
+require_once("util.inc");
+
+global $cpzone;
+
+$cpzone = $argv[1];
+$type = $argv[2];
+
+/* read in captive portal db */
+$cpdb = captiveportal_read_db();
+
+/* determine number of logged in users */
+$no_users = count($cpdb);
+$concurrent_users = $no_users;
+
+/* set initial user count to zero */
+$current_user_count = 0;
+
+/* tmp file to use to store old data (per interface)*/
+$tmpfile = "{$g['vardb_path']}/captiveportal_online_users";
+
+if (empty($type)) {
+ exit;
+}
+
+/* echo the rrd required syntax */
+echo "N:";
+$result = "NaN";
+
+if ($type == "loggedin") {
+
+ /* Find out the previous user timestamp
+ * so we can determine the difference between the current
+ * and previous user count. If the file is empty return a 0.
+ */
+ $fd = @fopen($tmpfile, "r");
+ if ($fd) {
+ while (!feof($fd)) {
+ $line = trim(fgets($fd));
+ if ($line) {
+ $previous_user_timestamp = $line;
+ } else {
+ $previous_user_timestamp = 0;
+ }
+ }
+ } else {
+ $previous_user_timestamp = 0;
+ }
+ @fclose($fd);
+
+ foreach ($cpdb as $user) {
+ $user_ip = $user[2];
+ // Record the timestamp
+ $timestamp = $user[0];
+ if ($timestamp > $previous_user_timestamp) {
+ $current_user_count = $current_user_count + 1;
+ }
+ }
+
+ // Write out the latest timestamp but not if it is empty
+ if (!empty($timestamp)) {
+ $fd = @fopen($tmpfile, "w");
+ if ($fd) {
+ fwrite($fd, $timestamp);
+ }
+ @fclose($fd);
+ }
+
+ /* If $timestamp is less than or equal to previous_user_timestamp return 0,
+ * as we only want the 'X' number of users logged in since last RRD poll.
+ */
+ if ($timestamp <= $previous_user_timestamp) {
+ $result = 0;
+ } else {
+ $result = $current_user_count;
+ }
+} elseif ($type == "concurrent") {
+ $result = $no_users;
+}
+
+echo "$result";
+
+?>
diff --git a/src/usr/local/bin/easyrule b/src/usr/local/bin/easyrule
new file mode 100755
index 0000000..8461a7a
--- /dev/null
+++ b/src/usr/local/bin/easyrule
@@ -0,0 +1,147 @@
+#!/usr/local/bin/php-cgi -q
+<?php
+/*
+ easyrule CLI Program
+
+ Copyright (C) 2010 Jim Pingle (jpingle@gmail.com)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("pfsense-utils.inc");
+require_once("easyrule.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$message = "";
+$specialsrcdst = explode(" ", "any pptp pppoe l2tp openvpn");
+$ifdisp = get_configured_interface_with_descr();
+foreach ($ifdisp as $kif => $kdescr) {
+ $specialsrcdst[] = "{$kif}";
+ $specialsrcdst[] = "{$kif}ip";
+}
+
+/* Borrow this function from guiconfig.inc since we can't include it for use at the CLI
+
+ - Maybe these need to be moved to util.inc or pfsense-utils.inc?
+
+*/
+function pconfig_to_address(&$adr, $padr, $pmask, $pnot=false, $pbeginport=0, $pendport=0) {
+
+ $adr = array();
+
+ if ($padr == "any") {
+ $adr['any'] = true;
+ } else if (is_specialnet($padr)) {
+ $adr['network'] = $padr;
+ } else {
+ $adr['address'] = $padr;
+ if ($pmask != 32) {
+ $adr['address'] .= "/" . $pmask;
+ }
+ }
+
+ if ($pnot) {
+ $adr['not'] = true;
+ } else {
+ unset($adr['not']);
+ }
+
+ if (($pbeginport != 0) && ($pbeginport != "any")) {
+ if ($pbeginport != $pendport) {
+ $adr['port'] = $pbeginport . "-" . $pendport;
+ } else {
+ $adr['port'] = $pbeginport;
+ }
+ }
+
+ if (is_alias($pbeginport)) {
+ $adr['port'] = $pbeginport;
+ }
+}
+
+/* Borrow this one from guiconfig.inc also */
+function is_specialnet($net) {
+ global $specialsrcdst;
+
+ if (!$net) {
+ return false;
+ }
+ if (in_array($net, $specialsrcdst)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+
+if (($argc > 1) && !empty($argv[1])) {
+
+ /* Automagically derive an alternate alias name from the scripts name
+ * This allows for using alternate alias lists with just a symlink */
+ if (($alias = basename($argv[0])) != 'easyrule') {
+ $blockaliasname = ucfirst($alias).'Rules';
+ }
+
+ $message = "";
+ switch ($argv[1]) {
+ case 'block':
+ $message = easyrule_parse_block($argv[2], $argv[3]);
+ break;
+ case 'unblock':
+ $message = easyrule_parse_unblock($argv[2], $argv[3]);
+ break;
+ case 'showblock':
+ $message = easyrule_parse_getblock($argv[2]);
+ break;
+ case 'pass':
+ $message = easyrule_parse_pass($argv[2], $argv[3], $argv[4], $argv[5], $argv[6]);
+ break;
+ }
+ echo $message . "\n";
+} else {
+ // Print usage:
+ echo "usage:\n";
+ echo " Blocking only requires an IP to block, block rules can be shown with showblock and revoked using unblock\n";
+ echo " " . basename($argv[0]) . " block <interface> <source IP>\n";
+ echo "\n";
+ echo " Passing requires more detail, as it must be as specific as possible. The destination port is optional if you're using a protocol without a port (e.g. ICMP, OSPF, etc).\n";
+ echo " " . basename($argv[0]) . " pass <interface> <protocol> <source IP> <destination ip> [destination port]\n";
+ echo "\n";
+ echo " Block example:\n";
+ echo " " . basename($argv[0]) . " block wan 1.2.3.4\n";
+ echo "\n";
+ echo " Show active blocks example:\n";
+ echo " " . basename($argv[0]) . " showblock wan\n";
+ echo "\n";
+ echo " Unblock example:\n";
+ echo " " . basename($argv[0]) . " unblock wan 1.2.3.4\n";
+ echo "\n";
+ echo " Pass example (protocol with port):\n";
+ echo " " . basename($argv[0]) . " pass wan tcp 1.2.3.4 192.168.0.4 80\n";
+ echo "\n";
+ echo " Pass example (protocol without port):\n";
+ echo " " . basename($argv[0]) . " pass wan icmp 1.2.3.4 192.168.0.4\n";
+ echo "\n";
+}
+?>
diff --git a/src/usr/local/bin/filterparser.php b/src/usr/local/bin/filterparser.php
new file mode 100755
index 0000000..fa60262
--- /dev/null
+++ b/src/usr/local/bin/filterparser.php
@@ -0,0 +1,58 @@
+#!/usr/local/bin/php-cgi -q
+<?php
+/* $Id$ */
+/*
+ filterparser.php
+ part of pfSesne by Scott Ullrich
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2009 Jim Pingle <myfirstname>@<mylastname>.org
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ A quick CLI log parser.
+ Examples:
+ clog /var/log/filter.log | tail -50 | /usr/local/www/filterparser.php
+ clog -f /var/log/filter.log | /usr/local/www/filterparser.php
+*/
+/*
+ pfSense_MODULE: logs
+*/
+
+include_once("functions.inc");
+include_once("filter_log.inc");
+
+$log = fopen("php://stdin", "r");
+$lastline = "";
+while (!feof($log)) {
+ $line = fgets($log);
+ $line = rtrim($line);
+ $flent = parse_filter_line(trim($line));
+ if ($flent != "") {
+ $flags = (($flent['proto'] == "TCP") && !empty($flent['tcpflags'])) ? ":" . $flent['tcpflags'] : "";
+ echo "{$flent['time']} {$flent['act']} {$flent['realint']} {$flent['proto']}{$flags} {$flent['src']} {$flent['dst']}\n";
+ $flent = "";
+ }
+}
+fclose($log); ?>
diff --git a/src/usr/local/bin/mail.php b/src/usr/local/bin/mail.php
new file mode 100755
index 0000000..130d9e0
--- /dev/null
+++ b/src/usr/local/bin/mail.php
@@ -0,0 +1,25 @@
+#!/usr/local/bin/php-cgi -q
+<?php
+require_once("config.inc");
+require_once("globals.inc");
+require_once("notices.inc");
+$options = getopt("s::");
+
+$message = "";
+
+if ($options['s'] <> "") {
+ $subject = $options['s'];
+}
+
+
+$in = file("php://stdin");
+foreach ($in as $line){
+ $message .= "$line";
+}
+
+if (!empty($subject)) {
+ send_smtp_message($message, $subject);
+} else {
+ send_smtp_message($message);
+}
+?>
diff --git a/src/usr/local/bin/ping_hosts.sh b/src/usr/local/bin/ping_hosts.sh
new file mode 100755
index 0000000..eef64f3
--- /dev/null
+++ b/src/usr/local/bin/ping_hosts.sh
@@ -0,0 +1,134 @@
+#!/bin/sh
+
+# pfSense ping helper
+# written by Scott Ullrich
+# (C)2006 Scott Ullrich
+# All rights reserved.
+
+# Format of file should be delimited by |
+# Field 1: Source IP
+# Field 2: Destination IP
+# Field 3: Ping count
+# Field 4: Script to run when service is down
+# Field 5: Script to run once service is restored
+# Field 6: Ping time threshold
+# Field 7: Wan ping time threshold
+# Field 8: Address family
+
+# Read in ipsec ping hosts and check the CARP status
+if [ -f /var/db/ipsecpinghosts ]; then
+ IPSECHOSTS="/var/db/ipsecpinghosts"
+ CURRENTIPSECHOSTS="/var/db/currentipsecpinghosts"
+ IFVPNSTATE=`ifconfig $IFVPN | grep "carp: BACKUP vhid" | wc -l`
+ if [ $IFVPNSTATE -gt 1 ]; then
+ echo -e "CARP interface in BACKUP (not pinging ipsec hosts)"
+ rm -f $CURRENTIPSECHOSTS
+ touch $CURRENTIPSECHOSTS
+ else
+ echo -e "CARP interface is MASTER or non CARP (pinging ipsec hosts)"
+ cat < $IPSECHOSTS > $CURRENTIPSECHOSTS
+ fi
+fi
+
+# General file meant for user consumption
+if [ -f /var/db/hosts ]; then
+ HOSTS="/var/db/hosts"
+fi
+
+# Package specific ping requests
+if [ -f /var/db/pkgpinghosts ]; then
+ PKGHOSTS="/var/db/pkgpinghosts"
+fi
+
+cat $PKGHOSTS $HOSTS $CURRENTIPSECHOSTS >/tmp/tmpHOSTS
+
+if [ ! -d /var/db/pingstatus ]; then
+ /bin/mkdir -p /var/db/pingstatus
+fi
+
+if [ ! -d /var/db/pingmsstatus ]; then
+ /bin/mkdir -p /var/db/pingmsstatus
+fi
+
+PINGHOSTS=`cat /tmp/tmpHOSTS`
+
+PINGHOSTCOUNT=`cat /tmp/tmpHOSTS | wc -l`
+
+if [ "$PINGHOSTCOUNT" -lt "1" ]; then
+ exit
+fi
+
+for TOPING in $PINGHOSTS ; do
+ echo "PROCESSING $TOPING"
+ SRCIP=`echo $TOPING | cut -d"|" -f1`
+ DSTIP=`echo $TOPING | cut -d"|" -f2`
+ COUNT=`echo $TOPING | cut -d"|" -f3`
+ FAILURESCRIPT=`echo $TOPING | cut -d"|" -f4`
+ SERVICERESTOREDSCRIPT=`echo $TOPING | cut -d"|" -f5`
+ THRESHOLD=`echo $TOPING | cut -d"|" -f6`
+ WANTHRESHOLD=`echo $TOPING | cut -d"|" -f7`
+ AF=`echo $TOPING | cut -d"|" -f8`
+ if [ "$AF" == "inet6" ]; then
+ PINGCMD=ping6
+ else
+ PINGCMD=ping
+ fi
+ echo Processing $DSTIP
+ # Look for a service being down
+ # Read in previous status
+ PREVIOUSSTATUS=""
+ if [ -f "/var/db/pingstatus/${DSTIP}" ]; then
+ PREVIOUSSTATUS=`cat /var/db/pingstatus/$DSTIP`
+ fi
+ $PINGCMD -c $COUNT -S $SRCIP $DSTIP
+ if [ $? -eq 0 ]; then
+ # Host is up
+ if [ "$PREVIOUSSTATUS" != "UP" ]; then
+ # Service restored
+ echo "UP" > /var/db/pingstatus/$DSTIP
+ if [ "$SERVICERESTOREDSCRIPT" != "" ]; then
+ echo "$DSTIP is UP, previous state was DOWN .. Running $SERVICERESTOREDSCRIPT"
+ echo "$DSTIP is UP, previous state was DOWN .. Running $SERVICERESTOREDSCRIPT" | logger -p daemon.info -i -t PingMonitor
+ sh -c $SERVICERESTOREDSCRIPT
+ fi
+ fi
+ else
+ # Host is down
+ if [ "$PREVIOUSSTATUS" != "DOWN" ]; then
+ # Service is down
+ echo "DOWN" > /var/db/pingstatus/$DSTIP
+ if [ "$FAILURESCRIPT" != "" ]; then
+ echo "$DSTIP is DOWN, previous state was UP .. Running $FAILURESCRIPT"
+ echo "$DSTIP is DOWN, previous state was UP .. Running $FAILURESCRIPT" | logger -p daemon.info -i -t PingMonitor
+ sh -c $FAILURESCRIPT
+ fi
+ fi
+ fi
+ echo "Checking ping time $DSTIP"
+ # Look at ping values themselves
+ PINGTIME=`$PINGCMD -c 1 -S $SRCIP $DSTIP | awk '{ print $7 }' | grep time | cut -d "=" -f2`
+ echo "Ping returned $?"
+ echo $PINGTIME > /var/db/pingmsstatus/$DSTIP
+ if [ "$THRESHOLD" != "" ]; then
+ if [ $(echo "${PINGTIME} > ${THRESHOLD}" | /usr/bin/bc) -eq 1 ]; then
+ echo "$DSTIP has exceeded ping threshold $PINGTIME / $THRESHOLD .. Running $FAILURESCRIPT"
+ echo "$DSTIP has exceeded ping threshold $PINGTIME / $THRESHOLD .. Running $FAILURESCRIPT" | logger -p daemon.info -i -t PingMonitor
+ sh -c $FAILURESCRIPT
+ fi
+ fi
+ # Wan ping time threshold
+ #WANTIME=`rrdtool fetch /var/db/rrd/wan-quality.rrd AVERAGE -r 120 -s -1min -e -1min | grep ":" | cut -f3 -d" " | cut -d"e" -f1`
+ echo "Checking wan ping time $WANTIME"
+ echo $WANTIME > /var/db/wanaverage
+ if [ "$WANTHRESHOLD" != "" -a "$WANTIME" != "" ]; then
+ if [ $(echo "${WANTIME} > ${WANTHRESHOLD}" | /usr/bin/bc) -eq 1 ]; then
+ echo "$DSTIP has exceeded wan ping threshold $WANTIME / $WANTHRESHOLD .. Running $FAILURESCRIPT"
+ echo "$DSTIP has exceeded wan ping threshold $WANTIME / $WANTHRESHOLD .. Running $FAILURESCRIPT" | logger -p daemon.info -i -t PingMonitor
+ sh -c $FAILURESCRIPT
+ fi
+ fi
+ sleep 1
+done
+
+exit 0
+
diff --git a/src/usr/local/bin/runmsntp.sh b/src/usr/local/bin/runmsntp.sh
new file mode 100755
index 0000000..d770632
--- /dev/null
+++ b/src/usr/local/bin/runmsntp.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# write our PID to file
+echo $$ > $1
+
+# execute msntp in endless loop; restart if it
+# exits (wait 1 second to avoid restarting too fast in case
+# the network is not yet setup)
+while true; do
+ /usr/local/bin/msntp -v -r -P no -l $2 -x $3 $4 2>&1 | logger -p daemon.info -i -t msntp
+ sleep 60
+done
diff --git a/src/usr/local/bin/slowdownpipe.sh b/src/usr/local/bin/slowdownpipe.sh
new file mode 100755
index 0000000..13b9e8d
--- /dev/null
+++ b/src/usr/local/bin/slowdownpipe.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+# Illustrates use of a while loop to read a file
+
+cat - | \
+while read line
+do
+ echo "$line"
+ sleep 0.01
+done
diff --git a/src/usr/local/bin/viconfig b/src/usr/local/bin/viconfig
new file mode 100755
index 0000000..93618f2
--- /dev/null
+++ b/src/usr/local/bin/viconfig
@@ -0,0 +1,3 @@
+#!/bin/sh
+vi /cf/conf/config.xml
+rm /tmp/config.cache \ No newline at end of file
diff --git a/src/usr/local/captiveportal/index.php b/src/usr/local/captiveportal/index.php
new file mode 100644
index 0000000..d450233
--- /dev/null
+++ b/src/usr/local/captiveportal/index.php
@@ -0,0 +1,252 @@
+<?php
+/*
+ $Id$
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009 Ermal Luçi
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+require_once("auth.inc");
+require_once("functions.inc");
+require_once("captiveportal.inc");
+
+$errormsg = "Invalid credentials specified.";
+
+header("Expires: 0");
+header("Cache-Control: no-cache, no-store, must-revalidate");
+header("Pragma: no-cache");
+header("Connection: close");
+
+global $cpzone, $cpzoneid;
+
+$cpzone = $_REQUEST['zone'];
+$cpcfg = $config['captiveportal'][$cpzone];
+if (empty($cpcfg)) {
+ log_error("Submission to captiveportal with unknown parameter zone: " . htmlspecialchars($cpzone));
+ portal_reply_page($redirurl, "error", $errormsg);
+ ob_flush();
+ return;
+}
+
+$cpzoneid = $cpcfg['zoneid'];
+
+$orig_host = $_SERVER['HTTP_HOST'];
+/* NOTE: IE 8/9 is buggy and that is why this is needed */
+$orig_request = trim($_REQUEST['redirurl'], " /");
+$clientip = $_SERVER['REMOTE_ADDR'];
+
+if (!$clientip) {
+ /* not good - bail out */
+ log_error("Zone: {$cpzone} - Captive portal could not determine client's IP address.");
+ $error_message = "An error occurred. Please check the system logs for more information.";
+ portal_reply_page($redirurl, "error", $errormsg);
+ ob_flush();
+ return;
+}
+
+$ourhostname = portal_hostname_from_client_ip($clientip);
+if ($orig_host != $ourhostname) {
+ /* the client thinks it's connected to the desired web server, but instead
+ it's connected to us. Issue a redirect... */
+ $protocol = (isset($cpcfg['httpslogin'])) ? 'https://' : 'http://';
+ header("Location: {$protocol}{$ourhostname}/index.php?zone={$cpzone}&redirurl=" . urlencode("http://{$orig_host}/{$orig_request}"));
+
+ ob_flush();
+ return;
+}
+
+if (!empty($cpcfg['redirurl'])) {
+ $redirurl = $cpcfg['redirurl'];
+} else if (preg_match("/redirurl=(.*)/", $orig_request, $matches)) {
+ $redirurl = urldecode($matches[1]);
+} else if ($_REQUEST['redirurl']) {
+ $redirurl = $_REQUEST['redirurl'];
+}
+
+$macfilter = !isset($cpcfg['nomacfilter']);
+$passthrumac = isset($cpcfg['passthrumacadd']);
+
+/* find MAC address for client */
+if ($macfilter || $passthrumac) {
+ $tmpres = pfSense_ip_to_mac($clientip);
+ if (!is_array($tmpres)) {
+ /* unable to find MAC address - shouldn't happen! - bail out */
+ captiveportal_logportalauth("unauthenticated", "noclientmac", $clientip, "ERROR");
+ echo "An error occurred. Please check the system logs for more information.";
+ log_error("Zone: {$cpzone} - Captive portal could not determine client's MAC address. Disable MAC address filtering in captive portal if you do not need this functionality.");
+ ob_flush();
+ return;
+ }
+ $clientmac = $tmpres['macaddr'];
+ unset($tmpres);
+}
+
+/* find out if we need RADIUS + RADIUSMAC or not */
+if (file_exists("{$g['vardb_path']}/captiveportal_radius_{$cpzone}.db")) {
+ $radius_enable = TRUE;
+ if (isset($cpcfg['radmac_enable'])) {
+ $radmac_enable = TRUE;
+ }
+}
+
+/* find radius context */
+$radiusctx = 'first';
+if ($_POST['auth_user2']) {
+ $radiusctx = 'second';
+}
+
+if ($_POST['logout_id']) {
+ echo <<<EOD
+<html>
+<head><title>Disconnecting...</title></head>
+<body bgcolor="#435370">
+<span style="color: #ffffff; font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 11px;">
+<b>You have been disconnected.</b>
+</span>
+<script type="text/javascript">
+<!--
+setTimeout('window.close();',5000) ;
+-->
+</script>
+</body>
+</html>
+
+EOD;
+ captiveportal_disconnect_client($_POST['logout_id']);
+
+} else if ($macfilter && $clientmac && captiveportal_blocked_mac($clientmac)) {
+ captiveportal_logportalauth($clientmac, $clientmac, $clientip, "Blocked MAC address");
+ if (!empty($cpcfg['blockedmacsurl'])) {
+ portal_reply_page($cpcfg['blockedmacsurl'], "redir");
+ } else {
+ portal_reply_page($redirurl, "error", "This MAC address has been blocked");
+ }
+
+} else if ($clientmac && $radmac_enable && portal_mac_radius($clientmac, $clientip, $radiusctx)) {
+ /* radius functions handle everything so we exit here since we're done */
+
+} else if (portal_consume_passthrough_credit($clientmac)) {
+ /* allow the client through if it had a pass-through credit for its MAC */
+ captiveportal_logportalauth("unauthenticated", $clientmac, $clientip, "ACCEPT");
+ portal_allow($clientip, $clientmac, "unauthenticated");
+
+} else if (isset($config['voucher'][$cpzone]['enable']) && $_POST['accept'] && $_POST['auth_voucher']) {
+ $voucher = trim($_POST['auth_voucher']);
+ $timecredit = voucher_auth($voucher);
+ // $timecredit contains either a credit in minutes or an error message
+ if ($timecredit > 0) { // voucher is valid. Remaining minutes returned
+ // if multiple vouchers given, use the first as username
+ $a_vouchers = preg_split("/[\t\n\r ]+/s", $voucher);
+ $voucher = $a_vouchers[0];
+ $attr = array(
+ 'voucher' => 1,
+ 'session_timeout' => $timecredit*60,
+ 'session_terminate_time' => 0);
+ if (portal_allow($clientip, $clientmac, $voucher, null, $attr)) {
+ // YES: user is good for $timecredit minutes.
+ captiveportal_logportalauth($voucher, $clientmac, $clientip, "Voucher login good for $timecredit min.");
+ } else {
+ portal_reply_page($redirurl, "error", $config['voucher'][$cpzone]['descrmsgexpired'] ? $config['voucher'][$cpzone]['descrmsgexpired']: $errormsg);
+ }
+ } else if (-1 == $timecredit) { // valid but expired
+ captiveportal_logportalauth($voucher, $clientmac, $clientip, "FAILURE", "voucher expired");
+ portal_reply_page($redirurl, "error", $config['voucher'][$cpzone]['descrmsgexpired'] ? $config['voucher'][$cpzone]['descrmsgexpired']: $errormsg);
+ } else {
+ captiveportal_logportalauth($voucher, $clientmac, $clientip, "FAILURE");
+ portal_reply_page($redirurl, "error", $config['voucher'][$cpzone]['descrmsgnoaccess'] ? $config['voucher'][$cpzone]['descrmsgnoaccess'] : $errormsg);
+ }
+
+} else if ($_POST['accept'] && $radius_enable) {
+ if (($_POST['auth_user'] && isset($_POST['auth_pass'])) || ($_POST['auth_user2'] && isset($_POST['auth_pass2']))) {
+ if (!empty($_POST['auth_user'])) {
+ $user = $_POST['auth_user'];
+ $paswd = $_POST['auth_pass'];
+ } else if (!empty($_POST['auth_user2'])) {
+ $user = $_POST['auth_user2'];
+ $paswd = $_POST['auth_pass2'];
+ }
+ $auth_list = radius($user, $paswd, $clientip, $clientmac, "USER LOGIN", $radiusctx);
+ $type = "error";
+ if (!empty($auth_list['url_redirection'])) {
+ $redirurl = $auth_list['url_redirection'];
+ $type = "redir";
+ }
+
+ if ($auth_list['auth_val'] == 1) {
+ captiveportal_logportalauth($user, $clientmac, $clientip, "ERROR", $auth_list['error']);
+ portal_reply_page($redirurl, $type, $auth_list['error'] ? $auth_list['error'] : $errormsg);
+ } else if ($auth_list['auth_val'] == 3) {
+ captiveportal_logportalauth($user, $clientmac, $clientip, "FAILURE", $auth_list['reply_message']);
+ portal_reply_page($redirurl, $type, $auth_list['reply_message'] ? $auth_list['reply_message'] : $errormsg);
+ }
+ } else {
+ if (!empty($_POST['auth_user'])) {
+ $user = $_POST['auth_user'];
+ } else if (!empty($_POST['auth_user2'])) {
+ $user = $_POST['auth_user2'];
+ } else {
+ $user = 'unknown';
+ }
+ captiveportal_logportalauth($user, $clientmac, $clientip, "ERROR");
+ portal_reply_page($redirurl, "error", $errormsg);
+ }
+
+} else if ($_POST['accept'] && $cpcfg['auth_method'] == "local") {
+ if ($_POST['auth_user'] && $_POST['auth_pass']) {
+ //check against local user manager
+ $loginok = local_backed($_POST['auth_user'], $_POST['auth_pass']);
+
+ if ($loginok && isset($cpcfg['localauth_priv'])) {
+ $loginok = userHasPrivilege(getUserEntry($_POST['auth_user']), "user-services-captiveportal-login");
+ }
+
+ if ($loginok) {
+ captiveportal_logportalauth($_POST['auth_user'], $clientmac, $clientip, "LOGIN");
+ portal_allow($clientip, $clientmac, $_POST['auth_user']);
+ } else {
+ captiveportal_logportalauth($_POST['auth_user'], $clientmac, $clientip, "FAILURE");
+ portal_reply_page($redirurl, "error", $errormsg);
+ }
+ } else {
+ portal_reply_page($redirurl, "error", $errormsg);
+ }
+
+} else if ($_POST['accept'] && $clientip && $cpcfg['auth_method'] == "none") {
+ captiveportal_logportalauth("unauthenticated", $clientmac, $clientip, "ACCEPT");
+ portal_allow($clientip, $clientmac, "unauthenticated");
+
+} else {
+ /* display captive portal page */
+ portal_reply_page($redirurl, "login", null, $clientmac, $clientip);
+}
+
+ob_flush();
+
+?>
diff --git a/src/usr/local/captiveportal/radius_accounting.inc b/src/usr/local/captiveportal/radius_accounting.inc
new file mode 100644
index 0000000..2d9c97e
--- /dev/null
+++ b/src/usr/local/captiveportal/radius_accounting.inc
@@ -0,0 +1,323 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+/*
+
+ $Id$
+
+ Copyright (c) 2006, Jonathan De Graeve <jonathan.de.graeve@imelda.be>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This code cannot simply be copied and put under the GNU Public License or
+ any other GPL-like (LGPL, GPL2) License.
+
+ This code is made possible thx to samples made by Michael Bretterklieber <michael@bretterklieber.com>
+ author of the PHP PECL Radius package
+
+*/
+
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+define('GIGAWORDS_RIGHT_OPERAND', '4294967296'); // 2^32
+
+/*
+RADIUS ACCOUNTING START
+-----------------------
+*/
+
+PEAR::loadExtension('bcmath');
+
+function RADIUS_ACCOUNTING_START($ruleno, $username, $sessionid, $radiusservers, $clientip, $clientmac) {
+
+ global $config, $cpzone;
+
+ $retvalue = array();
+ $nas_mac = mac_format(get_interface_mac("wan"));
+ $clientmac = mac_format($clientmac);
+ $nas_port = intval($ruleno);
+ $radiusvendor = $config['captiveportal'][$cpzone]['radiusvendor'] ? $config['captiveportal'][$cpzone]['radiusvendor'] : null;
+
+ switch ($radiusvendor) {
+
+ case 'cisco':
+ $calledstationid = $clientmac;
+ $callingstationid = $clientip;
+ break;
+
+ default:
+ if (!function_exists('getNasIP'))
+ require_once("captiveportal.inc");
+ $calledstationid = getNasIP();
+ $callingstationid = $clientmac;
+ break;
+ }
+
+ // Create our instance
+ $racct = new Auth_RADIUS_Acct_Start;
+
+ /* Different Authentication options
+ *
+ * Its possible todo other authentication methods but still do radius accounting
+ *
+ * RADIUS_AUTH_RADIUS => authenticated via Radius
+ * RADIUS_AUTH_LOCAL => authenticated local
+ * RADIUS_AUTH_REMOTE => authenticated remote
+ *
+ */
+ $racct->authentic = RADIUS_AUTH_RADIUS;
+
+ // Construct data package
+ $racct->username = $username;
+ /*
+ Add support for more then one radiusserver.
+ At most 10 servers may be specified.
+ When multiple servers are given, they are tried in round-robin fashion until a valid response is received
+ */
+ foreach ($radiusservers as $radsrv) {
+ // Add a new server to our instance
+ $racct->addServer($radsrv['ipaddr'], $radsrv['acctport'], $radsrv['key']);
+ }
+
+ if (PEAR::isError($racct->start())) {
+ $retvalue['acct_val'] = 1;
+ $retvalue['error'] = $racct->getMessage();
+
+ // If we encounter an error immediately stop this function and go back
+ $racct->close();
+ return $retvalue;
+
+ /* Old code:
+ * $status = $racct->start();
+ * if(PEAR::isError($status)) {
+ * if ($debug)
+ * printf("Radius start: %s<br />\n", $status->getMessage());
+ * exit;
+ * }
+ */
+ }
+
+ /*
+ * NAS_PORT_TYPE, int => RADIUS_ETHERNET (15), RADIUS_WIRELESS_OTHER (18), RADIUS_WIRELESS_IEEE_802_11 (19)
+ */
+
+ // Default attributes
+ $racct->putAttribute(RADIUS_NAS_PORT_TYPE, RADIUS_ETHERNET);
+ $racct->putAttribute(RADIUS_NAS_PORT, $nas_port, 'integer');
+ $racct->putAttribute(RADIUS_ACCT_SESSION_ID, $sessionid);
+
+ // Extra data to identify the client and nas
+ $racct->putAttribute(RADIUS_FRAMED_IP_ADDRESS, $clientip, "addr");
+ $racct->putAttribute(RADIUS_CALLED_STATION_ID, $calledstationid);
+ $racct->putAttribute(RADIUS_CALLING_STATION_ID, $callingstationid);
+
+ // Send request
+ $result = $racct->send();
+
+ // Evaluation of the response
+ // 5 -> Accounting-Response
+ // See RFC2866 for this.
+ if (PEAR::isError($result)) {
+ $retvalue['acct_val'] = 1;
+ $retvalue['error'] = $result->getMessage();
+
+ } else if ($result === true) {
+ $retvalue['acct_val'] = 5 ;
+
+ } else {
+ $retvalue['acct_val'] = 1 ;
+
+ }
+
+ // close OO RADIUS_ACCOUNTING
+ $racct->close();
+ unset($racct);
+
+ return $retvalue ;
+
+}
+
+/*
+RADIUS ACCOUNTING STOP/UPDATE
+-----------------------------
+*/
+
+function RADIUS_ACCOUNTING_STOP($ruleno,$username,$sessionid,$start_time,$radiusservers,$clientip,$clientmac, $term_cause = 1, $interimupdate=false,$stop_time = null) {
+
+ global $config, $cpzone;
+
+ $retvalue = array();
+ $nas_mac = mac_format(get_interface_mac("wan"));
+ $volume = getVolume($clientip, $clientmac);
+ $clientmac = mac_format($clientmac);
+ $nas_port = intval($ruleno);
+ $radiusvendor = $config['captiveportal'][$cpzone]['radiusvendor'] ? $config['captiveportal'][$cpzone]['radiusvendor'] : null;
+ $stop_time = (empty($stop_time)) ? time() : $stop_time;
+ $session_time = $stop_time - $start_time;
+ $volume['input_bytes_radius'] = remainder($volume['input_bytes']);
+ $volume['input_gigawords'] = gigawords($volume['input_bytes']);
+ $volume['output_bytes_radius'] = remainder($volume['output_bytes']);
+ $volume['output_gigawords'] = gigawords($volume['output_bytes']);
+
+ switch($radiusvendor) {
+
+ case 'cisco':
+ $calledstationid = $clientmac;
+ $callingstationid = $clientip;
+ break;
+
+ default:
+ $calledstationid = getNasIP();
+ $callingstationid = $clientmac;
+ break;
+ }
+
+ // Create our instance, see if we should use Accounting Interim Updates or Accounting STOP messages
+ if ($interimupdate)
+ $racct = new Auth_RADIUS_Acct_Update;
+ else
+ $racct = new Auth_RADIUS_Acct_Stop;
+
+ /*
+ Add support for more then one radiusserver.
+ At most 10 servers may be specified.
+ When multiple servers are given, they are tried in round-robin fashion until a valid response is received
+ */
+ foreach ($radiusservers as $radsrv) {
+ // Add a new server to our instance
+ $racct->addServer($radsrv['ipaddr'], $radsrv['acctport'], $radsrv['key']);
+ }
+
+ // See RADIUS_ACCOUNTING_START for info
+ $racct->authentic = RADIUS_AUTH_RADIUS;
+
+ // Construct data package
+ $racct->username = $username;
+ // Set session_time
+ $racct->session_time = $session_time;
+
+ if (PEAR::isError($racct->start())) {
+ $retvalue['acct_val'] = 1;
+ $retvalue['error'] = $racct->getMessage();
+
+ // If we encounter an error immediately stop this function and go back
+ $racct->close();
+ return $retvalue;
+ }
+
+ // The RADIUS PECL Package doesn't have this vars so we create them ourself
+ define("RADIUS_ACCT_INPUT_GIGAWORDS", "52");
+ define("RADIUS_ACCT_OUTPUT_GIGAWORDS", "53");
+
+ // Default attributes
+ $racct->putAttribute(RADIUS_NAS_PORT_TYPE, RADIUS_ETHERNET);
+ $racct->putAttribute(RADIUS_NAS_PORT, $nas_port, 'integer');
+ $racct->putAttribute(RADIUS_ACCT_SESSION_ID, $sessionid);
+
+ // Extra data to identify the client and nas
+ $racct->putAttribute(RADIUS_FRAMED_IP_ADDRESS, $clientip, "addr");
+ $racct->putAttribute(RADIUS_CALLED_STATION_ID, $calledstationid);
+ $racct->putAttribute(RADIUS_CALLING_STATION_ID, $callingstationid);
+
+ // Volume stuff: Ingress
+ $racct->putAttribute(RADIUS_ACCT_INPUT_PACKETS, $volume['input_pkts'], "integer");
+ $racct->putAttribute(RADIUS_ACCT_INPUT_OCTETS, $volume['input_bytes_radius'], "integer");
+ $racct->putAttribute(RADIUS_ACCT_INPUT_GIGAWORDS, $volume['input_gigawords'], "integer");
+ // Volume stuff: Outgress
+ $racct->putAttribute(RADIUS_ACCT_OUTPUT_PACKETS, $volume['output_pkts'], "integer");
+ $racct->putAttribute(RADIUS_ACCT_OUTPUT_OCTETS, $volume['output_bytes_radius'], "integer");
+ $racct->putAttribute(RADIUS_ACCT_OUTPUT_GIGAWORDS, $volume['output_gigawords'], "integer");
+ $racct->putAttribute(RADIUS_ACCT_SESSION_TIME, $session_time, "integer");
+
+ if (!$interimupdate)
+ $racct->putAttribute(RADIUS_ACCT_TERMINATE_CAUSE, $term_cause);
+
+ // Send request
+ $result = $racct->send();
+
+ // Evaluation of the response
+ // 5 -> Accounting-Response
+ // See RFC2866 for this.
+ if (PEAR::isError($result)) {
+ $retvalue['acct_val'] = 1;
+ $retvalue['error'] = $result->getMessage();
+
+ } else if ($result === true) {
+ $retvalue['acct_val'] = 5 ;
+
+ } else {
+ $retvalue['acct_val'] = 1 ;
+
+ }
+
+ // close OO RADIUS_ACCOUNTING
+ $racct->close();
+
+ return $retvalue;
+
+}
+
+
+/**
+ * Radius Volume Helpers
+ *
+ */
+
+function gigawords($bytes) {
+
+
+ /*
+ * RFC2866 Specifies a 32bit unsigned integer, which is a max of 4294967295
+ * Currently there is a fault in the PECL radius_put_int function which can handle only 32bit signed integer.
+ */
+
+ // We use BCMath functions since normal integers don't work with so large numbers
+ $gigawords = bcdiv( bcsub( $bytes, remainder($bytes) ) , GIGAWORDS_RIGHT_OPERAND) ;
+
+ // We need to manually set this to a zero instead of NULL for put_int() safety
+ if (is_null($gigawords)) {
+ $gigawords = 0;
+ }
+
+ return $gigawords;
+
+}
+
+function remainder($bytes) {
+
+ // Calculate the bytes we are going to send to the radius
+ $bytes = bcmod($bytes, GIGAWORDS_RIGHT_OPERAND);
+
+ if (is_null($bytes)) {
+ $bytes = 0;
+ }
+
+
+ return $bytes;
+
+}
+
+?>
diff --git a/src/usr/local/captiveportal/radius_authentication.inc b/src/usr/local/captiveportal/radius_authentication.inc
new file mode 100644
index 0000000..9938e24
--- /dev/null
+++ b/src/usr/local/captiveportal/radius_authentication.inc
@@ -0,0 +1,189 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+/*
+ $Id$
+
+ Copyright (c) 2006, Jonathan De Graeve <jonathan.de.graeve@imelda.be>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The names of the authors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This code cannot simply be copied and put under the GNU Public License or
+ any other GPL-like (LGPL, GPL2) License.
+
+ This code is made possible thx to samples made by Michael Bretterklieber <michael@bretterklieber.com>
+ author of the PHP PECL Radius package
+
+*/
+
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+/*
+RADIUS AUTHENTICATION
+---------------------
+*/
+
+require_once("CHAP.inc");
+
+function RADIUS_AUTHENTICATION($username,$password,$radiusservers,$clientip,$clientmac,$ruleno) {
+
+ global $config, $cpzone;
+
+ $retvalue = array();
+ $clientmac = mac_format($clientmac);
+ $nas_port = $ruleno;
+ $radiusvendor = $config['captiveportal'][$cpzone]['radiusvendor'] ? $config['captiveportal'][$cpzone]['radiusvendor'] : null;
+ $radius_protocol = $config['captiveportal'][$cpzone]['radius_protocol'];
+ // Do we even need to set it to NULL?
+ $retvalue['error'] = $retvalue['reply_message'] = $retvalue['url_redirection'] = $retvalue['session_timeout'] = null;
+ $retvalue['idle_timeout'] = $retvalue['session_terminate_time'] = $retvalue['interim_interval'] = null;
+
+ switch($radiusvendor) {
+
+ case 'cisco':
+ $calledstationid = $clientmac;
+ $callingstationid = $clientip;
+ break;
+ default:
+ if (!function_exists('getNasIP'))
+ require_once("captiveportal.inc");
+ $calledstationid = getNasIP();
+ $callingstationid = $clientmac;
+ break;
+ }
+
+ // Create our instance
+ $classname = 'Auth_RADIUS_' . $radius_protocol;
+ $rauth = new $classname($username, $password);
+
+ /*
+ * Add support for more then one radiusserver.
+ * At most 10 servers may be specified.
+ * When multiple servers are given, they are tried in round-robin fashion until a valid response is received
+ */
+ foreach ($radiusservers as $radsrv) {
+ // Add a new server to our instance
+ $rauth->addServer($radsrv['ipaddr'], $radsrv['port'], $radsrv['key']);
+
+ }
+
+ // Construct data package
+ $rauth->username = $username;
+ switch ($radius_protocol) {
+ case 'CHAP_MD5':
+ case 'MSCHAPv1':
+ $classname = $radius_protocol == 'MSCHAPv1' ? 'Crypt_CHAP_MSv1' : 'Crypt_CHAP_MD5';
+ $crpt = new $classname;
+ $crpt->username = $username;
+ $crpt->password = $password;
+ $rauth->challenge = $crpt->challenge;
+ $rauth->chapid = $crpt->chapid;
+ $rauth->response = $crpt->challengeResponse();
+ $rauth->flags = 1;
+ // If you must use deprecated and weak LAN-Manager-Responses use this:
+ //$rauth->lmResponse = $crpt->lmChallengeResponse();
+ //$rauth->flags = 0;
+ break;
+
+ case 'MSCHAPv2':
+ // Construct data package
+ $crpt = new Crypt_CHAP_MSv2;
+ $crpt->username = $username;
+ $crpt->password = $password;
+ $rauth->challenge = $crpt->authChallenge;
+ $rauth->peerChallenge = $crpt->peerChallenge;
+ $rauth->chapid = $crpt->chapid;
+ $rauth->response = $crpt->challengeResponse();
+ break;
+
+ default:
+ $rauth->password = $password;
+ break;
+ }
+
+ if (PEAR::isError($rauth->start())) {
+ $retvalue['auth_val'] = 1;
+ $retvalue['error'] = $rauth->getError();
+
+ // If we encounter an error immediately stop this function and go back
+ $rauth->close();
+ return $retvalue;
+ }
+
+ // Default attributes
+ $rauth->putAttribute(RADIUS_SERVICE_TYPE, RADIUS_LOGIN);
+ $rauth->putAttribute(RADIUS_NAS_PORT_TYPE, RADIUS_ETHERNET);
+ $rauth->putAttribute(RADIUS_NAS_PORT, $nas_port, 'integer');
+
+ // Extra data to identify the client and nas
+ $rauth->putAttribute(RADIUS_FRAMED_IP_ADDRESS, $clientip, addr);
+ $rauth->putAttribute(RADIUS_CALLED_STATION_ID, $calledstationid);
+ $rauth->putAttribute(RADIUS_CALLING_STATION_ID, $callingstationid);
+
+ // Send request
+ $result = $rauth->send();
+
+ // Evaluation of the response
+ // 1 -> Access-Request => We will use this value as an error indicator since we can't get a 1 back from the radius
+ // 2 -> Access-Accept
+ // 3 -> Access-Reject
+ // See RFC2865 for this.
+ if (PEAR::isError($result)) {
+ $retvalue['auth_val'] = 1;
+ $retvalue['error'] = $result->getMessage();
+
+ } else if ($result === true) {
+ $retvalue['auth_val'] = 2;
+
+ } else {
+ $retvalue['auth_val'] = 3;
+
+ }
+
+ // Get attributes, even if auth failed.
+ // We will push the results in the retvalue array
+ if (!$rauth->getAttributes()) {
+ $retvalue['error'] = $rauth->getError();
+
+ } else {
+ $retvalue = array_merge($retvalue,$rauth->listAttributes());
+
+ // We convert the session_terminate_time to unixtimestamp if its set before returning the whole array to our caller
+ if (!empty($retvalue['session_terminate_time'])) {
+ $stt = &$retvalue['session_terminate_time'];
+ $stt = strtotime(preg_replace("/\+(\d+):(\d+)$/", " +\${1}\${2}", preg_replace("/(\d+)T(\d+)/", "\${1} \${2}",$stt)));
+ }
+ }
+
+ // close OO RADIUS_AUTHENTICATION
+ $rauth->close();
+ unset($rauth);
+
+ return $retvalue;
+
+}
+
+?>
diff --git a/src/usr/local/openssl/openssl.cnf b/src/usr/local/openssl/openssl.cnf
new file mode 120000
index 0000000..f95d25b
--- /dev/null
+++ b/src/usr/local/openssl/openssl.cnf
@@ -0,0 +1 @@
+../../../etc/ssl/openssl.cnf \ No newline at end of file
diff --git a/src/usr/local/pkg/miniupnpd.inc b/src/usr/local/pkg/miniupnpd.inc
new file mode 100644
index 0000000..4ea768c
--- /dev/null
+++ b/src/usr/local/pkg/miniupnpd.inc
@@ -0,0 +1,297 @@
+<?php
+ require_once("util.inc");
+ require_once("config.inc");
+ require_once("functions.inc");
+ require_once("shaper.inc");
+
+ $shortcut_section = "upnp";
+
+ /* MiniUPnPd */
+
+ function upnp_notice($msg) {
+ log_error("miniupnpd: {$msg}");
+ }
+
+ function upnp_warn($msg) {
+ log_error("miniupnpd: {$msg}");
+ }
+
+ function upnp_running () {
+ if ((int)exec('/bin/pgrep -a miniupnpd | /usr/bin/wc -l') > 0) {
+ return true;
+ }
+ return false;
+ }
+
+ function upnp_write_config($file, $text) {
+ $handle = fopen($file, 'w');
+ if (!$handle) {
+ upnp_warn("Could not open {$file} for writing.");
+ return;
+ }
+ fwrite($handle, $text);
+ fclose($handle);
+ }
+
+ function upnp_uuid() {
+ /* md5 hash of wan mac */
+ $uuid = md5(get_interface_mac(get_real_interface("wan")));
+ /* put uuid in correct format 8-4-4-4-12 */
+ return substr($uuid, 0, 8) . '-' . substr($uuid, 9, 4) . '-' . substr($uuid, 13, 4) . '-' . substr($uuid, 17, 4) . '-' . substr($uuid, 21, 12);
+ }
+
+ function upnp_validate_queue($qname) {
+ read_altq_config();
+ $qlist = get_altq_name_list();
+ if (is_array($qlist)) {
+ return in_array($qname, $qlist);
+ } else {
+ return false;
+ }
+ }
+
+ function upnp_validate_ip($ip, $check_cdir) {
+ /* validate cidr */
+ $ip_array = array();
+ if ($check_cdir) {
+ $ip_array = explode('/', $ip);
+ if (count($ip_array) == 2) {
+ if ($ip_array[1] < 1 || $ip_array[1] > 32) {
+ return false;
+ }
+ } else {
+ if (count($ip_array) != 1) {
+ return false;
+ }
+ }
+ } else {
+ $ip_array[] = $ip;
+ }
+
+ /* validate ip */
+ if (!is_ipaddr($ip_array[0])) {
+ return false;
+ }
+ return true;
+ }
+
+ function upnp_validate_port($port) {
+ foreach (explode('-', $port) as $sub) {
+ if ($sub < 0 || $sub > 65535) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function before_form_miniupnpd(&$pkg) {
+ global $config;
+
+ }
+
+ function validate_form_miniupnpd($post, &$input_errors) {
+ if ($post['enable'] && (!$post['enable_upnp'] && !$post['enable_natpmp'])) {
+ $input_errors[] = 'At least one of \'UPnP\' or \'NAT-PMP\' must be allowed';
+ }
+ if ($post['iface_array']) {
+ foreach ($post['iface_array'] as $iface) {
+ if ($iface == 'wan') {
+ $input_errors[] = 'It is a security risk to specify WAN in the \'Interface\' field';
+ } elseif ($iface == $post['ext_iface']) {
+ $input_errors[] = 'You cannot select the external interface as an internal interface.';
+ }
+ }
+ }
+ if ($post['overridewanip'] && !upnp_validate_ip($post['overridewanip'], false)) {
+ $input_errors[] = 'You must specify a valid ip address in the \'Override WAN address\' field';
+ }
+ if (($post['download'] && !$post['upload']) || ($post['upload'] && !$post['download'])) {
+ $input_errors[] = 'You must fill in both \'Maximum Download Speed\' and \'Maximum Upload Speed\' fields';
+ }
+ if ($post['download'] && $post['download'] <= 0) {
+ $input_errors[] = 'You must specify a value greater than 0 in the \'Maximum Download Speed\' field';
+ }
+ if ($post['upload'] && $post['upload'] <= 0) {
+ $input_errors[] = 'You must specify a value greater than 0 in the \'Maximum Upload Speed\' field';
+ }
+ if ($post['upnpqueue'] && !upnp_validate_queue($post['upnpqueue'])) {
+ $input_errors[] = 'You must specify a valid traffic shaping queue.';
+ }
+
+ /* user permissions validation */
+ $j = substr_count(implode(array_keys($post)), "permuser");
+ for ($i = 0; $i < $j; $i++) {
+ if ($post["permuser{$i}"]) {
+ $perm = explode(' ', $post["permuser{$i}"]);
+ /* should explode to 4 args */
+ if (count($perm) != 4) {
+ $input_errors[] = "You must follow the specified format in the 'User specified permissions {$i}' field";
+ } else {
+ /* must with allow or deny */
+ if (!($perm[0] == 'allow' || $perm[0] == 'deny')) {
+ $input_errors[] = "You must begin with allow or deny in the 'User specified permissions {$i}' field";
+ }
+ /* verify port or port range */
+ if (!upnp_validate_port($perm[1]) || !upnp_validate_port($perm[3])) {
+ $input_errors[] = "You must specify a port or port range between 0 and 65535 in the 'User specified permissions {$i}' field";
+ }
+ /* verify ip address */
+ if (!upnp_validate_ip($perm[2], true)) {
+ $input_errors[] = "You must specify a valid ip address in the 'User specified permissions {$i}' field";
+ }
+ }
+ }
+ }
+ }
+
+ function sync_package_miniupnpd() {
+ global $g, $config;
+ global $input_errors;
+
+ $upnp_config = $config['installedpackages']['miniupnpd']['config'][0];
+ $config_file = '/var/etc/miniupnpd.conf';
+
+ if (!isset($upnp_config['ext_iface']) || empty($upnp_config['ext_iface'])) {
+ $ext_ifname = get_real_interface();
+ } else {
+ $if = convert_friendly_interface_to_real_interface_name($upnp_config['ext_iface']);
+ if ($if != $upnp_config['ext_iface']) {
+ $ext_ifname = $if;
+ } else {
+ $ext_ifname = get_real_interface();
+ upnp_warn("Could not resolve real interface for {$upnp_config['ext_iface']}, defaulting to WAN");
+ }
+ }
+
+ $config_text = "ext_ifname={$ext_ifname}\n";
+ $config_text .= "port=2189\n";
+
+ $ifaces_active = '';
+
+ /* since config is written before this file is invoked we don't need to read post data */
+ if ($upnp_config['enable'] && !empty($upnp_config['iface_array'])) {
+ $iface_array = explode(',', $upnp_config['iface_array']);
+
+ foreach ($iface_array as $iface) {
+ /* Setting the same internal and external interface is not allowed. */
+ if ($iface == $upnp_config['ext_iface']) {
+ continue;
+ }
+ $if = convert_friendly_interface_to_real_interface_name($iface);
+ /* above function returns iface if fail */
+ if ($if != $iface) {
+ $addr = find_interface_ip($if);
+ $bits = find_interface_subnet($if);
+ /* check that the interface has an ip address before adding parameters */
+ if (is_ipaddr($addr)) {
+ $config_text .= "listening_ip={$if}\n";
+ if (!$ifaces_active) {
+ $webgui_ip = $addr;
+ $ifaces_active = $iface;
+ } else {
+ $ifaces_active .= ", {$iface}";
+ }
+ } else {
+ upnp_warn("Interface {$iface} has no ip address, ignoring");
+ }
+ } else {
+ upnp_warn("Could not resolve real interface for {$iface}");
+ }
+ }
+
+ if (!empty($ifaces_active)) {
+ /* override wan ip address, common for carp, etc */
+ if ($upnp_config['overridewanip']) {
+ $config_text .= "ext_ip={$upnp_config['overridewanip']}\n";
+ }
+
+ $download = $upnp_config['download']*1000;
+ $upload = $upnp_config['upload']*1000;
+
+ /* set upload and download bitrates */
+ if (!empty($download) && !empty($upload)) {
+ $config_text .= "bitrate_down={$download}\n";
+ $config_text .= "bitrate_up={$upload}\n";
+ }
+
+ /* enable logging of packets handled by miniupnpd rules */
+ if ($upnp_config['logpackets']) {
+ $config_text .= "packet_log=yes\n";
+ }
+
+ /* enable system uptime instead of miniupnpd uptime */
+ if ($upnp_config['sysuptime']) {
+ $config_text .= "system_uptime=yes\n";
+ }
+
+ /* set webgui url */
+ if (!empty($config['system']['webgui']['protocol'])) {
+ $config_text .= "presentation_url={$config['system']['webgui']['protocol']}://{$webgui_ip}";
+ if (!empty($config['system']['webgui']['port'])) {
+ $config_text .= ":{$config['system']['webgui']['port']}";
+ }
+ $config_text .= "/\n";
+ }
+
+ /* set uuid and serial */
+ $config_text .= "uuid=".upnp_uuid()."\n";
+ $config_text .= "serial=".strtoupper(substr(upnp_uuid(), 0, 8))."\n";
+
+ /* set model number */
+ $config_text .= "model_number=" . $g['product_version'] . "\n";
+
+ /* upnp access restrictions */
+ foreach ($upnp_config['row'] as $row) {
+ if ($row['permuser']) {
+ $config_text .= "{$row["permuser"]}\n";
+ }
+ }
+
+ if ($upnp_config['permdefault']) {
+ $config_text .= "deny 0-65535 0.0.0.0/0 0-65535\n";
+ }
+
+ /* Recheck if queue is valid */
+ if (!upnp_validate_queue($upnp_config['upnpqueue'])) {
+ unset($upnp_config['upnpqueue']);
+ }
+
+ /* Add shaper queue */
+ if ($upnp_config['upnpqueue']) {
+ $config_text .= "queue={$upnp_config['upnpqueue']}\n";
+ }
+
+ /* Allow UPnP or NAT-PMP as requested */
+ $config_text .= "enable_upnp=" . ($upnp_config['enable_upnp'] ? "yes\n" : "no\n");
+ $config_text .= "enable_natpmp=" . ($upnp_config['enable_natpmp'] ? "yes\n" : "no\n");
+
+ /* write out the configuration */
+ upnp_write_config($config_file, $config_text);
+
+ /* if miniupnpd not running start it */
+ if (!upnp_running()) {
+ upnp_notice("Starting service on interface: {$ifaces_active}");
+ upnp_action('start');
+ } else {
+ /* restart miniupnpd if settings were changed */
+ upnp_notice("Restarting service on interface: {$ifaces_active}");
+ upnp_action('restart');
+ }
+ }
+ } else {
+ /* user does not want miniupnpd running */
+ /* lets stop the service and remove the rc file */
+
+ if (file_exists($config_file)) {
+ if (!$upnp_config['enable']) {
+ upnp_notice('Stopping service: miniupnpd disabled');
+ } else {
+ upnp_notice('Stopping service: no interfaces selected');
+ }
+
+ upnp_action('stop');
+ @unlink($config_file);
+ }
+ }
+ }
+?>
diff --git a/src/usr/local/pkg/miniupnpd.xml b/src/usr/local/pkg/miniupnpd.xml
new file mode 100644
index 0000000..33d8ac4
--- /dev/null
+++ b/src/usr/local/pkg/miniupnpd.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<packagegui>
+ <title>Services: UPnP &amp; NAT-PMP</title>
+ <name>miniupnpd</name>
+ <version>20100712</version>
+ <savetext>Change</savetext>
+ <include_file>/usr/local/pkg/miniupnpd.inc</include_file>
+ <menu>
+ <name>UPnP &amp; NAT-PMP</name>
+ <tooltiptext>Set UPnP &amp; NAT-PMP settings such as interfaces to listen on.</tooltiptext>
+ <section>Services</section>
+ <url>/pkg_edit.php?xml=miniupnpd.xml&amp;id=0</url>
+ </menu>
+ <additional_files_needed>
+ <item>https://packages.pfsense.org/packages/config/miniupnpd/miniupnpd.inc</item>
+ <prefix>/usr/local/pkg/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <item>https://packages.pfsense.org/packages/config/miniupnpd/status_upnp.php</item>
+ <prefix>/usr/local/www/</prefix>
+ <chmod>0755</chmod>
+ </additional_files_needed>
+ <additional_files_needed>
+ <prefix>/usr/local/sbin/</prefix>
+ <chmod>0755</chmod>
+ <item>https://packages.pfsense.org/packages/config/miniupnpd/sbin/miniupnpd</item>
+ </additional_files_needed>
+ <service>
+ <name>miniupnpd</name>
+ <rcfile>miniupnpd.sh</rcfile>
+ <executable>miniupnpd</executable>
+ </service>
+ <fields>
+ <field>
+ <name>UPnP &amp; NAT-PMP Settings</name>
+ <type>listtopic</type>
+ <enablefields>enable_upnp,enable_natpmp,ext_iface,iface_array,download,upload,overridewanip,upnpqueue,logpackets,sysuptime,permdefault</enablefields>
+ </field>
+ <field>
+ <fielddescr>Enable UPnP &amp; NAT-PMP</fielddescr>
+ <fieldname>enable</fieldname>
+ <type>checkbox</type>
+ <enablefields>enable_upnp,enable_natpmp,ext_iface,iface_array,download,upload,overridewanip,upnpqueue,logpackets,sysuptime,permdefault</enablefields>
+ </field>
+ <field>
+ <fielddescr>Allow UPnP Port Mapping</fielddescr>
+ <fieldname>enable_upnp</fieldname>
+ <type>checkbox</type>
+ <description>This protocol is often used by Microsoft-compatible systems.</description>
+ </field>
+ <field>
+ <fielddescr>Allow NAT-PMP Port Mapping</fielddescr>
+ <fieldname>enable_natpmp</fieldname>
+ <type>checkbox</type>
+ <description>This protocol is often used by Apple-compatible systems.</description>
+ </field>
+ <field>
+ <fielddescr>External Interface (generally WAN)</fielddescr>
+ <fieldname>ext_iface</fieldname>
+ <default_value>wan</default_value>
+ <type>interfaces_selection</type>
+ <hideinterfaceregex>loopback</hideinterfaceregex>
+ <description>Select only your primary WAN interface (interface with your default route). Only one interface is allowed here, not multiple.</description>
+ <required/>
+ </field>
+ <field>
+ <fielddescr>Interfaces (generally LAN)</fielddescr>
+ <fieldname>iface_array</fieldname>
+ <default_value>lan</default_value>
+ <type>interfaces_selection</type>
+ <description>You can use the CTRL or COMMAND key to select multiple interfaces.</description>
+ <required/>
+ <multiple/>
+ </field>
+ <field>
+ <fielddescr>Maximum Download Speed (Kbits/second)</fielddescr>
+ <fieldname>download</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Maximum Upload Speed (Kbits/second)</fielddescr>
+ <fieldname>upload</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Override WAN address</fielddescr>
+ <fieldname>overridewanip</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Traffic Shaping Queue</fielddescr>
+ <fieldname>upnpqueue</fieldname>
+ <type>input</type>
+ </field>
+ <field>
+ <fielddescr>Log packets handled by UPnP &amp; NAT-PMP rules?</fielddescr>
+ <fieldname>logpackets</fieldname>
+ <type>checkbox</type>
+ </field>
+ <field>
+ <fielddescr>Use system uptime instead of UPnP &amp; NAT-PMP service uptime?</fielddescr>
+ <fieldname>sysuptime</fieldname>
+ <type>checkbox</type>
+ </field>
+ <field>
+ <fielddescr>By default deny access to UPnP &amp; NAT-PMP?</fielddescr>
+ <fieldname>permdefault</fieldname>
+ <type>checkbox</type>
+ </field>
+ <field>
+ <fielddescr>User specified permissions</fielddescr>
+ <fieldname>none</fieldname>
+ <description>Format: [allow or deny] [ext port or range] [int ipaddr or ipaddr/CIDR] [int port or range]
+ &lt;br /&gt;Example: allow 1024-65535 192.168.0.0/24 1024-65535</description>
+ <type>rowhelper</type>
+ <rowhelper>
+ <rowhelperfield>
+ <fieldname>permuser</fieldname>
+ <type>input</type>
+ <size>60</size>
+ </rowhelperfield>
+ </rowhelper>
+ </field>
+ </fields>
+ <custom_php_command_before_form>
+ before_form_miniupnpd($pkg);
+ </custom_php_command_before_form>
+ <custom_php_validation_command>
+ validate_form_miniupnpd($_POST, $input_errors);
+ </custom_php_validation_command>
+ <custom_php_resync_config_command>
+ sync_package_miniupnpd();
+ </custom_php_resync_config_command>
+</packagegui>
diff --git a/src/usr/local/sbin/cleargmirror.sh b/src/usr/local/sbin/cleargmirror.sh
new file mode 100755
index 0000000..a00cc93
--- /dev/null
+++ b/src/usr/local/sbin/cleargmirror.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+clear_disk() {
+ local _disk="${1}"
+ local _mirror=$(/sbin/gmirror dump ${_disk} 2>/dev/null | sed '/name: /!d; s,^.*: ,,')
+
+ if [ -n "${_mirror}" ]; then
+ /sbin/gmirror destroy -f ${_mirror} >/dev/null 2>&1
+ fi
+ /sbin/gmirror clear ${_disk} >/dev/null 2>&1
+}
+
+mirror="${1}"
+disk1="${2}"
+disk2="${3}"
+
+if [ -z "${mirror}" -o -z "${disk1}" -o -z "${disk2}" ]; then
+ echo "You must specify mirror name, and disks that should be cleared"
+ exit 1
+fi
+
+/sbin/gmirror destroy -f ${mirror} >/dev/null 2>&1
+clear_disk ${disk1}
+clear_disk ${disk2}
+
+exit 0
diff --git a/src/usr/local/sbin/cleargpt.sh b/src/usr/local/sbin/cleargpt.sh
new file mode 100755
index 0000000..07d530a
--- /dev/null
+++ b/src/usr/local/sbin/cleargpt.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+DISK=$1
+if [ "$DISK" = "" ]; then
+ echo "You must specify the disk that should be formatted/cleared."
+ exit 1
+fi
+for PART in `/sbin/gpart show $DISK | grep -v '=>' | awk '{ print $3 }'`; do
+ if [ "$PART" != "" ]; then
+ /sbin/gpart delete -i $PART $DISK >/dev/null
+ fi
+done
+/sbin/gpart destroy $DISK >/dev/null
+exit 0
diff --git a/src/usr/local/sbin/gmirror_status_check.php b/src/usr/local/sbin/gmirror_status_check.php
new file mode 100644
index 0000000..f19a5d1
--- /dev/null
+++ b/src/usr/local/sbin/gmirror_status_check.php
@@ -0,0 +1,96 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+/*
+ gmirror_status_check.php
+ Copyright (C) 2014 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/gmirror /sbin/geom /usr/bin/grep /usr/bin/egrep /usr/bin/cut /usr/bin/head
+ pfSense_BUILDER_BINARIES: /sbin/mount /usr/bin/awk /usr/bin/sed
+ pfSense_MODULE: gmirror
+*/
+
+require_once("config.inc");
+require_once("notices.inc");
+require_once("globals.inc");
+require_once("gmirror.inc");
+
+global $g;
+$status_file = "{$g['varrun_path']}/gmirror.status";
+
+$mirror_status = gmirror_get_status();
+$mirror_list = array_keys($mirror_status);
+sort($mirror_list);
+$notices = array();
+
+// Check for gmirror.status
+if (file_exists($status_file)) {
+ // If it exists, read status in
+ $previous_mirror_status = unserialize(file_get_contents($status_file));
+ $previous_mirror_list = array_keys($previous_mirror_status);
+ sort($previous_mirror_list);
+ if (count($previous_mirror_status) > 0) {
+ // Check list of current mirrors vs old mirrors, notify if one has appeared/disappeared
+ if ($mirror_list != $previous_mirror_list) {
+ $notices[] = sprintf(gettext("List of mirrors changed. Old: (%s) New: (%s)"), implode(", ", $previous_mirror_list), implode(", ", $mirror_list));
+ }
+
+ // For each mirror, check the mirror status, notify if changed
+ foreach ($mirror_list as $mirror) {
+ if (is_array($previous_mirror_status[$mirror])) {
+ // Notify if the status changed
+ if ($mirror_status[$mirror]['status'] != $previous_mirror_status[$mirror]['status']) {
+ $notices[] = sprintf(gettext("Mirror %s status changed from %s to %s."), $mirror, $previous_mirror_status[$mirror]['status'], $mirror_status[$mirror]['status']);
+ }
+ // Notify if the drive count changed
+ if (count($mirror_status[$mirror]['components']) != count($previous_mirror_status[$mirror]['components'])) {
+ // Notify if the consumer count changed.
+ $notices[] = sprintf(gettext("Mirror %s consumer count changed from %d to %d."), $mirror, count($previous_mirror_status[$mirror]['components']), count($mirror_status[$mirror]['components']));
+ }
+ if (strtoupper($mirror_status[$mirror]['status']) == "DEGRADED") {
+ // Check the drive status as it may be different.
+ asort($mirror_status[$mirror]['components']);
+ asort($previous_mirror_status[$mirror]['components']);
+ if ($mirror_status[$mirror]['components'] != $previous_mirror_status[$mirror]['components']) {
+ $notices[] = sprintf(gettext("Mirror %s drive status changed. Old: (%s) New: (%s)"),
+ $mirror,
+ implode(", ", $previous_mirror_status[$mirror]['components']),
+ implode(", ", $mirror_status[$mirror]['components']));
+ }
+ }
+ }
+ }
+ }
+}
+if (count($notices)) {
+ file_notice("gmirror", implode("\n ", $notices), "GEOM Mirror Status Change", 1);
+}
+// Write out current status if changed
+if ($mirror_status != $previous_mirror_status) {
+ file_put_contents($status_file, serialize($mirror_status));
+}
+
+?>
diff --git a/src/usr/local/sbin/mpd.script b/src/usr/local/sbin/mpd.script
new file mode 100644
index 0000000..28054d7
--- /dev/null
+++ b/src/usr/local/sbin/mpd.script
@@ -0,0 +1,1642 @@
+#################################################################
+#
+# $Id: mpd.script.sample,v 1.9 2009/10/04 19:36:04 amotin Exp $
+#
+# Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
+# See ``COPYRIGHT.whistle''
+#
+#################################################################
+
+##
+## MPD Modem script variables:
+##
+## $DialPrefix Modem dialing prefix (eg. "DT")
+## $Telephone Telephone number to dial (not duplicated using &)
+## $ConnectTimeout Wait-for-connect timeout, in seconds (default 45 secs)
+## $SpeakerOff Set to "yes" to quiet modem speakers
+## $Serial230K If "yes", we can support 230K serial port speed
+## $CountryCode Country code for Winmodem
+## $InitString External initialization string
+## $LoginScript If "yes", look for script login
+##
+## pfSense specific variables:
+## $APN Access Point (host)Name for 3G connections
+## $APNum Access Point Number, typically "1", might not matter
+## $SimPin SIM card PIN number
+## $PinWait Wait for SIM to connect to network after PIN entered
+##
+## ISDN Terminal Adapter specific variables (all start with "TA_"):
+##
+## $TA_Bonding Bonding on TA: "yes" or "no"
+## $TA_NoDoubleTelno When $TA_Bonding, don't double the dialed number
+## $TA_56K Restrict to 56K on TA: "yes" or "no"
+## $TA_VoiceCall Originate calls using voice mode
+## $TA_AuthChap Tell TA to use CHAP: "yes" or "no"
+## $TA_Dirno1 TA directory #1
+## $TA_Dirno2 TA directory #2
+## $TA_SPID1 SPID #1
+## $TA_SPID2 SPID #2
+## $TA_SwitchType One of these values
+## "NI-1"
+## "DMS-100"
+## "5ESS P2P"
+## "5ESS MP"
+## $TA_NewSwitch Means the switch type is new, initiate auto-detect
+## (3Com Impact IQ only)
+##
+## We set $OptimizeNextTime to "yes" after a successful connection so we
+## can avoid verifing configuration when things are working good.
+##
+## Internal variables:
+##
+## $ModemSetupFunc Routine to set up modem for dialing out
+## $ModemAnsSetupFunc Routine to set up modem for answer mode (if different)
+## $ModemDetectRing Routine to detect an incoming call for ringback
+## $ModemIsAnalog If "yes" modem is analog (ie, not terminal adapter)
+##
+
+#################################################################
+#
+# MODEM DIALING
+#
+#################################################################
+
+DialPeer:
+ set $CallingID ""
+ set $CalledID $Telephone
+ if $Telephone == "00000" goto DialNullModem
+ set $optimize $OptimizeNextTime
+ set $OptimizeNextTime "no"
+
+ if $optimize == "yes" goto DialPeer2
+ call ModemFind
+ if $ErrorMsg == "" goto DialPeer1
+ log $ErrorMsg
+ failure
+DialPeer1:
+ set $ModTelephone $Telephone
+ call ModemIdent
+ if $ModemDescription != "" goto DialPeer2
+ log "No match found in the ModemIdent function in the chat script."
+ failure
+
+DialPeer2:
+ log "Detected $ModemDescription."
+ call $ModemSetupFunc
+ log "Dialing server at $Telephone..."
+ call ModemDial
+ if $dialResult == "OK" goto DialPeerOK
+ set $optimize "no"
+ failure
+
+DialPeerOK:
+ if $ConnectionSpeed == "" log "Connected at an unknown speed."
+ if $ConnectionSpeed == "" goto DialPeer3
+ log "Connected at $ConnectionSpeed."
+DialPeer3:
+ if $LoginScript == "yes" call AutoLogin
+ set $OptimizeNextTime "yes"
+ success
+
+DialPeerSetPin:
+ set $modemCmd "+CPIN?"
+ log $modemCmd
+ call ModemQuery
+ log $modemQuery
+ if $modemQuery match ".*READY.*" goto DialPinReady
+ set $modemCmd "+CPIN=\"$SimPin\""
+ call ModemCmd2
+ wait $PinWait
+
+DialPinReady:
+ return
+
+DialPeerSetAPN:
+ set $modemCmd "+CGDCONT=$APNum,\"IP\",\"$APN\""
+ log $modemCmd
+ call ModemCmd2
+ return
+
+# Null-modem connection
+DialNullModem:
+ log "Connected via null modem connection."
+ success
+
+##
+## Dial modem
+##
+## Variables:
+##
+## $DialPrefix Modem dialing prefix (eg. "DT")
+## $ModTelephone Telephone number to dial
+## $ConnectTimeout Wait-for-connect timeout, in seconds (default 45 secs)
+## $noDialToneSubr (optional) Subroutine to call if NO DIALTONE
+## $dialErrorSubr (optional) Subroutine to call if ERR
+##
+## Returns:
+##
+## $dialResult "OK" or "FAIL"
+## $ConnectionSpeed Connection speed reported by modem (possibly empty)
+##
+
+ModemDial:
+ set $dialResult "FAIL"
+ set $ConnectionSpeed ""
+ if $ConnectTimeout == "" set $ConnectTimeout 45
+ print "AT${DialPrefix}${ModTelephone}\r\n"
+ log "AT${DialPrefix}${ModTelephone}"
+ match "NO CARRIER" DialAbortNoCar
+ match "NO DIAL" DialAbortNoDial
+ match "BUSY" DialAbortBusy
+ regex "CONNECT *([0-9]*).*$" DialConnect
+ match "ERR" DialError
+ wait $ConnectTimeout
+ log "No response from the modem after dialing."
+ return
+DialAbortNoCar:
+ log "The remote modem did not answer."
+ return
+DialAbortNoDial:
+ if $noDialToneSubr != "" goto $noDialToneSubr
+ log "No dialtone. Is the modem plugged in?"
+ return
+DialError:
+ if ${ModTelephone} != "" goto DialErrorInit
+ log "Invalid empty telephone number."
+ return
+DialErrorInit:
+ if $dialErrorSubr != "" goto $dialErrorSubr
+ log "Invalid dial init string."
+ return
+DialAbortBusy:
+ log "The line was busy."
+ return
+DialConnect:
+ set $ConnectionSpeed $matchedString1
+ set $dialResult "OK"
+ return
+
+#################################################################
+#
+# MODEM ANSWERING
+#
+#################################################################
+
+##
+## This is an idle script that waits for an incoming call and answers it
+##
+## Variables:
+##
+## $RingTimeout How long to wait for a RING before giving up
+## $ConnectTimeout Wait-for-connect timeout, in seconds (default 45 secs)
+##
+
+AnswerCall:
+ set $CallingID ""
+ set $CalledID ""
+ set $optimize $OptimizeNextTime
+ set $OptimizeNextTime "no"
+
+# Skip modem detection if we connected successfully last time
+
+ if $optimize == "yes" goto AnswerCall2
+ call ModemFind
+ if $ErrorMsg == "" goto AnswerCall0
+ log $ErrorMsg
+ failure
+AnswerCall0:
+ call ModemIdent
+ if $ModemDescription != "" goto AnswerCall1
+ log "The modem is not responding."
+ failure
+AnswerCall1:
+ log "Detected $ModemDescription."
+
+AnswerCall2:
+ if $ModemAnsSetupFunc == "" set $ModemAnsSetupFunc $ModemSetupFunc
+ call $ModemAnsSetupFunc
+ log "Waiting for ring..."
+ call ModemAnswer
+ if $answerReturn == "OK" goto AnswerCallOK
+ set $IdleResult ""
+ set $optimize "no"
+ failure
+
+AnswerCallOK:
+ log "Connected at $ConnectionSpeed."
+ set $OptimizeNextTime "yes"
+ set $IdleResult "answer"
+ success
+
+#################################################################
+#
+# MODEM RINGBACK
+#
+#################################################################
+
+##
+## This is an idle script that implements the ringback feature.
+## When we're idle, and we detect an incoming call, then call back
+## to bring up the link. For analog modems, we have to wait until
+## the ringing stops before dialing back (otherwise we'd answer the
+## call, which we don't want to do).
+##
+## Variables:
+##
+## $RingbackTimeout How long before giving up (reset and try again).
+## Default: 60 minutes
+## $RingStoppedTime Max time between consecutive "RING"s (if analog)
+## Default: 8 seconds
+##
+
+Ringback:
+ set $CallingID ""
+ set $CalledID ""
+ if $RingbackTimeout == "" set $RingbackTimeout "3600"
+ if $RingStoppedTime == "" set $RingStoppedTime "8"
+ set $ModemDetectRing RingbackWait
+ call ModemFind
+ if $ErrorMsg == "" goto Ringback1
+ log $ErrorMsg
+ failure
+Ringback1:
+ call ModemIdent
+ if $ModemDescription != "" goto Ringback2
+ log "The modem is not responding."
+ failure
+
+Ringback2:
+ log "Detected $ModemDescription."
+ goto $ModemDetectRing
+
+# Detect an incoming call by waiting for a "RING" indication
+# On an analog modem, we have to wait for the ringing to stop
+
+RingbackWait:
+ match "RING\r\n" RingbackGotRings
+ log "Remote Dial-Back mode enabled; waiting for incoming call."
+ wait $RingbackTimeout
+ failure
+
+# We saw it ring; wait for the ringing to stop (analog modems only).
+
+RingbackGotRings:
+ log "Incoming call detected..."
+ if $ModemIsAnalog != "yes" goto RingbackDone
+RingbackWaitStop:
+ match "RING\r\n" RingbackWaitStop
+ wait $RingStoppedTime
+RingbackDone:
+ set $IdleResult "ringback"
+ success
+
+# Strip leading and trailing spaces and log calling party number
+
+RingbackDetectCID:
+ if $cid match " *(.*) *" nop
+ set $cid $matchedString1
+ if $cid == "" goto RingbackDetectNoCID
+ log "Incoming call detected from $cid..."
+ success
+
+# We couldn't determine calling party number
+
+RingbackDetectNoCID:
+ log "Incoming call detected..."
+ success
+
+#################################################################
+#
+# MODEM IDENTIFICATION
+#
+#################################################################
+
+##
+## Identify
+##
+## This is meant to be called from the top level, to just identify
+## what's on the serial port and print out some info about it.
+##
+
+Identify:
+ call ModemFind
+ if $ErrorMsg == "" goto Identify1
+ failure
+Identify1:
+ call ModemIdent
+ if $ModemDescription == "" failure
+ log "ANALOG=$ModemIsAnalog"
+ log "DESCRIPTION=$ModemDescription"
+ success
+
+##
+## ModemIdent
+##
+## This identifies the type of modem and sets these variables accordingly:
+##
+## $ModemDescription
+## $ModemSetupFunc
+## $ModemAnsSetupFunc
+## $ModemDetectRing
+## $ModemIsAnalog
+##
+## If no response seen, this sets $ModemDescription to the empty string.
+##
+
+ModemIdent:
+ set $ModemDescription ""
+ set $ModemSetupFunc ""
+ set $ModemAnsSetupFunc ""
+ set $ModemDetectRing ""
+ set $ModemIsAnalog "yes"
+ if $InitString != "" goto ModemIdentCustom
+ print "ATI\r\n"
+ match "ADTRAN EXPRESS XR" ModemIdentAdtranXRT
+ match "Model: Ovation MC950D Card" ModemIdentMC950D
+ match "ERR" ModemIdentGeneric
+ match "OK\r\n" ModemIdentGeneric
+ wait 3
+ print "ATI1\r\n"
+ match "NTK omni.net" ModemIdentNTK
+ match "ERR" ModemIdentGeneric
+ match "OK\r\n" ModemIdentGeneric
+ wait 3
+ print "ATI3\r\n"
+ match "Courier" ModemIdentUsr
+ match "Sportster" ModemIdentUsr
+ match "3ComImpact IQ" ModemIdentImpactIQ
+ match "U.S. Robotics 56K" ModemIdentUsr
+ match "ZOOM V.90" ModemIdentZoom56
+ match "LT V.90" ModemIdentLucent
+ match "ERR"
+ match "OK\r\n"
+ wait 3
+ print "ATI4\r\n"
+ match "AtermIT NEC Corporation" ModemIdentAterm
+ match "INSMATEV-7 NTT Corporation" ModemIdentAterm
+ match "MNP Class 10 V.34 Modem" ModemIdentDeskPorte
+ match "Smart One 56" ModemIdentSmartOne
+ match "ERR"
+ match "OK\r\n"
+ wait 3
+ print "ATI5\r\n"
+ match "C885" ModemIdentC885
+ match "ERR"
+ match "OK\r\n" ModemIdentGeneric
+ wait 3
+ print "ATI8\r\n"
+ match "BitSURFR PRO\r" ModemIdentBitsurfr
+ match "BitSURFR PRO EZ" ModemIdentBitsurfrEZ
+ match "3C882" ModemIdentImpactIQ
+ match "ERR"
+ match "OK\r\n"
+ wait 3
+ log "The modem is not responding to any ATI[1,3-5,8] commands."
+ failure
+
+ModemIdentGeneric:
+ set $ModemDescription "Hayes compatible modem"
+ if $SimPin != "" call DialPeerSetPin
+ if $APN != "" call DialPeerSetAPN
+ set $ModemSetupFunc GenericSetup
+ return
+
+ModemIdentCustom:
+ set $ModemDescription "Custom modem"
+ set $ModemSetupFunc CustomSetup
+ return
+
+ModemIdentUsr:
+ set $SportsterHack "no"
+ if $matchedString == "Sportster" set $SportsterHack "yes"
+ set $ModemDescription "USR $matchedString modem"
+ call GetOK
+ set $ModemSetupFunc UsrSetup
+ return
+ModemIdentC885:
+ set $ModemDescription "Sierra Wireless Compass $matchedString USB 3G modem"
+ set $ModemSetupFunc GenericSetup
+ return
+ModemIdentMC950D:
+ set $ModemDescription "Novatel Wireless $matchedString USB 3G modem"
+ set $ModemSetupFunc GenericSetup
+ return
+ModemIdentBitsurfrEZ:
+ set $bitsEZ "yes"
+ModemIdentBitsurfr:
+ set $ModemDescription "Motorola $matchedString"
+ call GetOK
+ set $ModemSetupFunc BitsurfrSetup
+ set $ModemIsAnalog "no"
+ set $ModemDetectRing BitsurfrDetectRing
+ return
+
+ModemIdentImpactIQ:
+ set $matchedString "3ComImpact IQ"
+ set $ModemDescription "$matchedString"
+ call GetOK
+ set $ModemSetupFunc ImpactIQSetup
+ set $ModemIsAnalog "no"
+ set $ModemDetectRing ImpactIQDetectRing
+ return
+
+ModemIdentAdtranXRT:
+ set $ModemDescription "AdTran Express XR/XRT"
+ call GetOK
+ set $ModemSetupFunc AdtranXRTSetup
+ set $ModemIsAnalog "no"
+ return
+
+ModemIdentAterm:
+ set $ModemDescription "NEC Aterm TA"
+ call GetOK
+ set $ModemSetupFunc AtermSetup
+ set $ModemIsAnalog "no"
+ return
+
+ModemIdentNTK:
+ set $ModemDescription "$matchedString"
+ call GetOK
+ set $ModemSetupFunc NTKSetup
+ set $ModemIsAnalog "no"
+ return
+
+ModemIdentDeskPorte:
+ set $ModemDescription "$matchedString"
+ call GetOK
+ set $ModemSetupFunc DeskPorteSetup
+ return
+
+ModemIdentZoom56:
+ModemIdentSmartOne:
+ set $ModemDescription "$matchedString"
+ call GetOK
+ set $ModemSetupFunc Modem56Setup
+ return
+
+# Support the Lucent Winmodem, Xircom 56k
+ModemIdentLucent:
+ set $ModemDescription "$matchedString"
+ call GetOK
+ set $ModemSetupFunc ModemLucentSetup
+ return
+
+#################################################################
+#
+# GENERIC MODEM SETUP
+#
+#################################################################
+
+GenericSetup:
+ set $noDialToneSubr GenericNoDialtone
+ set $temp "M1"
+ if $SpeakerOff == "yes" set $temp "M0"
+ set $modemCmd "&F&C1&D2E0S0=0${temp}"
+ call ModemCmd2
+ return
+
+CustomSetup:
+ set $noDialToneSubr GenericNoDialtone
+ set $modemCmd "${InitString}"
+ call ModemCmd2
+ return
+
+GenericNoDialtone:
+ log "No dialtone. Is the modem plugged in?"
+ return
+
+#################################################################
+#
+# USR MODEM SETUP
+#
+#################################################################
+
+UsrSetup:
+# Lower baudrate to 57600 for crappy internal Sportster modem
+ if $SportsterHack != "yes" goto UsrSetup2
+ if $modemDevice != "/dev/cuad2" goto UsrSetup2
+ set $Baudrate 57600
+ set $modemCmd ""
+ call ModemCmd2
+UsrSetup2:
+ set $noDialToneSubr GenericNoDialtone
+ set $temp "M1"
+ if $SpeakerOff == "yes" set $temp "M0"
+ set $modemCmd "&F1&C1&D2E0S0=0S13.0=1L0S6=5${temp}"
+ call ModemCmd2
+ return
+
+#################################################################
+#
+# GENERAL 56K MODEM SETUP
+#
+#################################################################
+
+Modem56Setup:
+ set $noDialToneSubr GenericNoDialtone
+ set $temp "M1"
+ if $SpeakerOff == "yes" set $temp "M0"
+ set $modemCmd "&FL2W2E0${temp}"
+ call ModemCmd2
+ return
+
+#################################################################
+#
+# LUCENT WINMODEM AND XIRCOM 56K SETUP
+#
+#################################################################
+
+ModemLucentSetup:
+ set $noDialToneSubr GenericNoDialtone
+ set $temp "M1"
+ if $SpeakerOff == "yes" set $temp "M0"
+ set $tempCountryCode ""
+ if $CountryCode != "" set $tempCountryCode "+GCI=${CountryCode}"
+ if $CountryCode != "" log "Use country ${CountryCode}"
+ set $modemCmd "&FL2W2E0${temp}${tempCountryCode}"
+ call ModemCmd2
+ return
+
+#################################################################
+#
+# BITSURFR PRO AND BITSURFR PRO EZ SETUP
+#
+#################################################################
+
+BitsurfrSetup:
+ set $noDialToneSubr BitsurfrNoDialtone
+ set $factory "1"
+ if $bitsEZ == "yes" set $factory "0"
+ set $modemCmd "Z&F${factory}&C1&D2E0W1X2%A2=95S0=0"
+ call ModemCmd2
+
+# Set to 230K baud if we support it
+
+ if $bitsEZ != "yes" goto BitsurfrSetup1
+ set $modemCmd "@P2=230400"
+ set $newBaudrate "230400"
+ call SetBaudrate
+
+# Check software revision and ISDN settings
+
+BitsurfrSetup1:
+ if $optimize == "yes" goto BitsurfrSetup2
+ if $bitsEZ != "yes" call BitsurfrCheckRev
+ call BitsurfrCheckConfig
+
+# Set the PAP/CHAP, multi-link, and 56K/64K settings, and return
+
+BitsurfrSetup2:
+ set $authCmd "@M2=P"
+ if $TA_AuthChap == "yes" set $authCmd "@M2=C"
+ set $bondCmd "@B0=1"
+ if $TA_Bonding == "yes" set $bondCmd "@B0=2"
+ set $bearCmd "%A4=0"
+ if $TA_56K == "yes" set $bearCmd "%A4=1"
+ if $TA_VoiceCall == "yes" set $bearCmd "%A4=1"
+ set $voiceCmd "%A98=D%A96=0"
+ if $TA_VoiceCall == "yes" set $voiceCmd "%A98=S%A96=1"
+
+# BS PRO EZ changes
+
+ if $bitsEZ == "yes" set $authCmd "${authCmd}@M20=\"\""
+ set $modemCmd "$authCmd$bondCmd$bearCmd$voiceCmd"
+ call ModemCmd2
+ if $TA_NoDoubleTelno == "yes" return
+ if $TA_Bonding == "yes" set $ModTelephone "${Telephone}&${Telephone}"
+ return
+
+##
+## What to do when NO DIALTONE
+##
+
+BitsurfrNoDialtone:
+ log "ISDN initialization failed (or BitSURFR restarting). Please verify proper line connection and ISDN settings."
+ return
+
+##
+## BitsurfrCheckConfig
+##
+## Verify and adjust ISDN configuration as necessary
+##
+
+BitsurfrCheckConfig:
+ log "Checking the BitSURFR's ISDN configuration..."
+ set $valueChanged "no"
+
+# Check switch type
+
+ set $checkCmd "!C0"
+ set $checkValue "000"
+ set $checkValueNew "0"
+ if $TA_SwitchType == "DMS-100" set $checkValue "001"
+ if $TA_SwitchType == "DMS-100" set $checkValueNew "1"
+ if $TA_SwitchType == "NI-1" set $checkValue "002"
+ if $TA_SwitchType == "NI-1" set $checkValueNew "2"
+ set $checkMsg "Reprogramming switch type ($TA_SwitchType)..."
+ call ModemCheckValue
+
+ set $checkCmd "!C1"
+ set $checkValue "004"
+ set $checkValueNew "4"
+ if $TA_SwitchType == "DMS-100" set $checkValue "003"
+ if $TA_SwitchType == "DMS-100" set $checkValueNew "3"
+ if $TA_SwitchType == "5ESS P2P" set $checkValue "000"
+ if $TA_SwitchType == "5ESS P2P" set $checkValueNew "0"
+ if $TA_SwitchType == "5ESS MP" set $checkValue "001"
+ if $TA_SwitchType == "5ESS MP" set $checkValueNew "1"
+ set $checkMsg "Reprogramming switch software version..."
+ call ModemCheckValue
+
+# Check directory numbers
+
+ set $checkCmd "*1!N1"
+ set $checkValue $TA_Dirno1
+ set $checkValueNew $TA_Dirno1
+ set $checkMsg "Reprogramming voice line #1 directory number..."
+ call ModemCheckValue
+
+ set $checkCmd "*2!N1"
+ set $checkValue $TA_Dirno2
+ set $checkValueNew $TA_Dirno2
+ set $checkMsg "Reprogramming voice line #2 directory number..."
+ call ModemCheckValue
+ set $checkCmd "!N1"
+ set $checkMsg "Reprogramming data line directory number..."
+ call ModemCheckValue
+
+# Check SPIDs
+
+ set $checkCmd "*1!C6"
+ set $checkValue $TA_SPID1
+ set $checkValueNew $TA_SPID1
+ set $checkMsg "Reprogramming voice line #1 SPID..."
+ call ModemCheckValue
+
+ set $checkCmd "*2!C6"
+ set $checkValue $TA_SPID2
+ set $checkValueNew $TA_SPID2
+ set $checkMsg "Reprogramming voice line #2 SPID..."
+ call ModemCheckValue
+ set $checkCmd "!C6"
+ set $checkMsg "Reprogramming data line SPID..."
+ call ModemCheckValue
+
+# Restart if necessary
+
+ if $valueChanged == "no" return
+ log "Restarting BitSURFR Pro with new configuration..."
+ set $modemCmd ">W"
+ call ModemCmd2
+ set $modemCmd ">Z"
+ call ModemCmd2
+ failure
+
+##
+## Verify the BitSURFR's software revision. Only do this
+## once, the first time we try to dial.
+##
+
+BitsurfrCheckRev:
+ log "Checking the BitSURFR's software revision..."
+ print "ATI3\r\n"
+ match "-1A" BitsurfrCheckRevOld
+ match "-1B" BitsurfrCheckRevOld
+ match "-1C" BitsurfrCheckRevOld
+ match "-1D" BitsurfrCheckRevOld
+ match "-1E" BitsurfrCheckRevOld
+ match "-1F" BitsurfrCheckRevOld
+ match "-1G" BitsurfrCheckRevOld
+ match "-1H" BitsurfrCheckRevOld
+ match "-1I" BitsurfrCheckRevOld
+ match "OK\r\n" BitsurfrCheckRevOK
+ match "ERR"
+ wait 5
+ log "The BitSURFR did not properly answer ATI3."
+ failure
+BitsurfrCheckRevOK:
+ return
+BitsurfrCheckRevOld:
+ log "The BitSURFR Pro has an old software revision $matchedString. Please upgrade according to the manufacturer's instructions."
+ call GetOK
+ failure
+
+# This is how we detect an incoming call with a BitSURFR
+
+BitsurfrDetectRing:
+# First, we need to be properly configured
+ call BitsurfrSetup
+# Enable Caller-ID logging
+ set $modemCmd "@N0=1*1@N0=1*2@N0=1"
+ call ModemCmd
+ if $modemCmdResult != "OK" goto RingbackWait
+# A "RING" at any time is good enough
+ match ringset "RING\r\n" RingbackDone
+# Clear Caller-ID buffers
+ set $modemCmd "@L0*1@L0*2@L0"
+ call ModemCmd2
+# Read each buffer
+ call BitsurfrDetectReadCID
+ log "Remote Dial-Back mode enabled; waiting for incoming call."
+# Now wait indefinitely for one of those buffers to change
+BitsurfrDetectLoop:
+ wait 5
+ set $oldDataCID $dataCID
+ set $oldVoice1CID $voice1CID
+ set $oldVoice2CID $voice2CID
+ call BitsurfrDetectReadCID
+ if $oldDataCID != $dataCID goto BitsurfrDetectDone
+ if $oldVoice1CID != $voice1CID goto BitsurfrDetectDone
+ if $oldVoice2CID != $voice2CID goto BitsurfrDetectDone
+ goto BitsurfrDetectLoop
+
+# Examine the CID from each port
+BitsurfrDetectDone:
+ set $cid $dataCID
+ call BitsurfrDetectTryCID
+ set $cid $voice1CID
+ call BitsurfrDetectTryCID
+ set $cid $voice2CID
+ call BitsurfrDetectTryCID
+ goto RingbackDetectNoCID
+
+# Try to extract the calling party number
+BitsurfrDetectTryCID:
+# Strip the log number
+ if $cid match "[0-9] (.*)" set $cid $matchedString1
+# Check for various strings
+ if $cid match "BLOCKED" return
+ if $cid match "NO NUMBER" return
+ if $cid match "NO CID SERVICE" return
+ if $cid match "OUT OF AREA" return
+ goto RingbackDetectCID
+
+# Read Caller-ID buffers
+BitsurfrDetectReadCID:
+ set $modemCmd "@L1"
+ call ModemQueryStrip
+ set $dataCID $modemQuery
+ set $modemCmd "*1@L1"
+ call ModemQueryStrip
+ set $voice1CID $modemQuery
+ set $modemCmd "*2@L1"
+ call ModemQueryStrip
+ set $voice2CID $modemQuery
+ return
+
+#################################################################
+#
+# 3COM IMPACT IQ SETUP
+#
+#################################################################
+
+ImpactIQSetup:
+ set $noDialToneSubr ImpactIQNoDialtone
+ set $modemCmd "Z&F%C2E0"
+ call ModemCmd2
+
+# Set to 230K baud if we support it
+
+ set $modemCmd "$$B230400"
+ set $newBaudrate "230400"
+ call SetBaudrate
+
+# Check ISDN config and link status (XXX should we check revision too?)
+
+ImpactIQSetup1:
+ if $optimize == "yes" goto IQInitSetup2
+ call ImpactIQCheckConfig
+ call ImpactIQCheckLink
+
+# Now set the PAP/CHAP setting and voice/data originate mode setting
+
+IQInitSetup2:
+ set $authCmd "S84=1"
+ if $TA_AuthChap == "yes" set $authCmd "S84=0"
+ set $voiceCmd "S61=0"
+ if $TA_VoiceCall == "yes" set $voiceCmd "S61=1"
+ set $modemCmd "$authCmd$voiceCmd"
+ call ModemCmd2
+ if $TA_NoDoubleTelno == "yes" return
+ if $TA_Bonding == "yes" set $ModTelephone "${Telephone}&${Telephone}"
+ return
+
+##
+## What to do when NO DIALTONE
+##
+
+ImpactIQNoDialtone:
+ log "ISDN config problem (or modem restart). Check your ISDN switch type, directory numbers, and SPID settings."
+ return
+
+##
+## ImpactIQCheckLink
+##
+## Check the link status registers
+##
+
+ImpactIQCheckLink:
+ log "Checking the ISDN modem's link status..."
+ print "ATS59?\r\n"
+ match "000" IQSyncFail
+ match "001" IQSyncOK
+ match "ERR"
+ match "OK\r\n"
+ wait 3
+ call GetOK
+ log "The ISDN modem did not properly answer ATS59?"
+ failure
+IQSyncOK:
+ call GetOK
+ goto ImpactIQCheckInit
+IQSyncFail:
+ log "The ISDN modem is not receiving any ISDN signal. Please verify that it's connected to an ISDN line."
+ call GetOK
+ failure
+
+ImpactIQCheckInit:
+ set $impactInitReg "57"
+ call IQInitCheck
+ if $TA_Bonding == "yes" return
+ set $impactInitReg "58"
+ call IQInitCheck
+ return
+
+# A little subroutine
+
+IQInitCheck:
+ print "ATS${impactInitReg}?\r\n"
+ match "000" IQInitOK
+ match "001" IQInitOK
+ match "002" IQInitFail
+ match "ERR"
+ match "OK\r\n"
+ wait 3
+ call GetOK
+ log "The ISDN modem did not properly answer ATS${impactInitReg}?"
+ failure
+IQInitOK:
+ call GetOK
+ return
+IQInitFail:
+ log "ISDN initialization failed. Please check your ISDN switch type, directory numbers, and SPID settings."
+ call GetOK
+ failure
+
+##
+## ImpactIQCheckConfig
+##
+## Verify and adjust ISDN configuration as necessary
+##
+
+ImpactIQCheckConfig:
+ log "Checking the ISDN modem's ISDN configuration..."
+ set $valueChanged "no"
+
+# Check switch type XXX
+#
+# NOTE: The Impact IQ changes the value of this field as it auto-detects.
+# Not only that, but it cycles through each switch type as it is "trying
+# out" that type, so that reading this field is pretty much useless...
+# Our strategy is just to hope that auto-detect works!
+
+ if $TA_NewSwitch != "yes" goto ImpactIQCheckDirnos
+ log "Initiating switch type auto-detect..."
+ set $modemCmd "S50=0"
+ call ModemCmd2
+ set $TA_NewSwitch ""
+ set $valueChanged "yes"
+ set $iq_new_switch "yes"
+
+# Check directory numbers
+
+ImpactIQCheckDirnos:
+ set $checkCmd "S51"
+ set $checkValue $TA_Dirno1
+ set $checkValueNew $TA_Dirno1
+ set $checkMsg "Reprogramming line #1 directory number..."
+ call ModemCheckValue
+
+ set $checkCmd "S53"
+ set $checkValue $TA_Dirno2
+ set $checkValueNew $TA_Dirno2
+ set $checkMsg "Reprogramming line #2 directory number..."
+ call ModemCheckValue
+
+# Check SPIDs
+
+ set $checkCmd "S52"
+ set $checkValue $TA_SPID1
+ set $checkValueNew $TA_SPID1
+ set $checkMsg "Reprogramming line #1 SPID..."
+ call ModemCheckValue
+
+ set $checkCmd "S54"
+ set $checkValue $TA_SPID2
+ set $checkValueNew $TA_SPID2
+ set $checkMsg "Reprogramming line #2 SPID..."
+ call ModemCheckValue
+
+# Check 56K/64K setting
+
+ set $checkValue "064"
+ set $checkValueNew "64"
+ if $TA_56K == "yes" set $checkValue "056"
+ if $TA_56K == "yes" set $checkValueNew "56"
+ set $checkCmd "S60"
+ set $checkMsg "Reprogramming B channel data rate to ${checkValueNew}K..."
+ call ModemCheckValue
+ set $checkValueNew ""
+
+# Check Multi-link setting
+
+ set $checkValue "000"
+ set $checkValueNew "0"
+ if $TA_Bonding == "yes" set $checkValue "001"
+ if $TA_Bonding == "yes" set $checkValueNew "1"
+ set $checkCmd "S80"
+ set $checkMsg "Reprogramming mutli-link PPP setting..."
+ call ModemCheckValue
+
+# Restart if necessary, and wait extra long if the switch type changed
+
+ if $valueChanged == "no" return
+ log "Restarting ISDN modem with the new configuration..."
+ set $modemCmd "Z"
+ call ModemCmd2
+ failure
+
+##
+## Detect an incoming call with the 3Com
+##
+
+ImpactIQDetectRing:
+ call ImpactIQSetup
+ if $modemCmdResult != "OK" goto RingbackWait
+ match ringset "RING\r\n" RingbackDone
+# Clear Caller-ID buffers
+ set $modemCmd "\\N0"
+# We don't care if this command fails...
+ call ModemCmd
+# Read most recent incoming call
+ call ImpactIQDetectReadCID
+ log "Remote Dial-Back mode enabled; waiting for incoming call."
+# Now wait for a change
+ImpactIQDetectLoop:
+ wait 5
+ set $oldIncomingCall $incomingCall
+ call ImpactIQDetectReadCID
+ if $oldIncomingCall != $incomingCall goto ImpactIQDetectDone
+ goto ImpactIQDetectLoop
+
+# Examine the CID from each port
+ImpactIQDetectDone:
+ if $incomingCall !match "((.{14}).{10}) ((.{14}).{10}) ((.{14}).{10})" goto RingbackDetectNoCID
+ set $dataCID $matchedString2
+ set $voice1CID $matchedString4
+ set $voice2CID $matchedString6
+ set $cid $dataCID
+ call ImpactIQDetectTryCID
+ set $cid $voice1CID
+ call ImpactIQDetectTryCID
+ set $cid $voice2CID
+ call ImpactIQDetectTryCID
+ goto RingbackDetectNoCID
+
+# Look for a valid CID string
+ImpactIQDetectTryCID:
+ if $cid match " *" return
+ if $cid match " *N/A" return
+ goto RingbackDetectCID
+
+# Read first line of incoming call log (it's the 14th line of output)
+ImpactIQDetectReadCID:
+ set $modemCmd "\\N"
+ call ModemCmdSend
+ call ReadLine
+# Older version of the 3Com don't support this command
+ if $matchedString == "OK" return
+ if $matchedString match "ERR(O)?(R)?" return
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ call ReadLine
+ set $incomingCall $matchedString
+ call GetOK
+ return
+
+#################################################################
+#
+# NEC ATERM SETUP
+#
+#################################################################
+
+AtermSetup:
+ if $AtermHardReset == "yes" goto AtermSetup2
+
+# Do hardware reset, which takes a while and doesn't give back "OK"
+
+ log "Initializing modem..."
+ print "ATZ98\r\n"
+ wait 6
+ set $AtermHardReset "yes"
+ failure
+
+AtermSetup2:
+
+# Set to 230K baud if we support it
+
+ set $modemCmd ""
+ set $newBaudrate "230400"
+ call SetBaudrate
+
+# Is this an IT55 or IT65?
+
+ set $atermIT65 ""
+ set $modemCmd "$$N14=0"
+ call ModemCmd
+ if $modemCmdResult == "OK" set $atermIT65 "yes"
+
+# Set normal stuff, PPP mode
+
+ set $modemCmd "&C1&D0&K3X4$$N1=1$$N9=0"
+ call ModemCmd2
+
+# Set the multi-link setting
+
+ set $bondCmd "$$N11=0"
+ if $TA_Bonding == "yes" set $bondCmd "$$N11=1"
+ set $modemCmd "$bondCmd"
+ call ModemCmd2
+
+# Additional settings for the IT65 go here...
+
+ if $atermIT65 != "yes" return
+ return
+
+#################################################################
+#
+# MICROCOM DESKPORTE SETUP
+#
+#################################################################
+
+DeskPorteSetup:
+ set $noDialToneSubr GenericNoDialtone
+ set $temp "M1"
+ if $SpeakerOff == "yes" set $temp "M0"
+ set $modemCmd "Z&F&C1&D2X3E0S0=0${temp}"
+ call ModemCmd2
+ return
+
+#################################################################
+#
+# KOREAN TERMINAL ADAPTER SETUP
+#
+#################################################################
+
+NTKSetup:
+ set $noDialToneSubr GenericNoDialtone
+ set $modemCmd "ZB40&J3"
+ call ModemCmd2
+ return
+
+#################################################################
+#
+# ADTRAN EXPRESS XRT SETUP
+#
+#################################################################
+
+AdtranXRTSetup:
+ set $noDialToneSubr ImpactIQNoDialtone
+ set $dialErrorSubr AdtranXRTDialError
+ set $bonding "&F1"
+ if $TA_Bonding == "yes" set $bonding "&F2"
+ set $chap "S118=0"
+ if $TA_AuthChap == "yes" set $chap "S118=32"
+ set $origCmd "S53=3"
+ if $TA_56K == "yes" set $origCmd "S53=2"
+ if $TA_VoiceCall == "yes" set $origCmd "S53=0"
+ set $modemCmd "ZE0${bonding}&C1&D2${chap}${origCmd}"
+ call ModemCmd2
+
+# Check ISDN config and link status (XXX should we check revision too?)
+
+ if $optimize == "yes" return
+ call AdtranXRTCheckConfig
+ call AdtranXRTCheckLink
+ return
+
+##
+## What to do when ERROR when dialing
+##
+## This is what the Adtran returns if the line is not ready yet.
+## So we look into the status buffer to see if we recognize the
+## error condition.
+##
+
+AdtranXRTDialError:
+ call AdtranXRTDiagnose
+ failure
+
+##
+## Check the last status bufffer entry for what the problem is
+## XXX Figure out more stuff to look for and when it can happen
+##
+
+AdtranXRTDiagnose:
+ log "Checking the Adtran status buffer..."
+ print "AT!S\r\n"
+ match "\r\n\r\n" AdtranXRTDiagBlank
+ match "END OF STATUS BUFFER" AdtranXRTDiagBlank
+ match "L1 not up." AdtranXRTDiagL1
+ match "FACILITY_NOT_SUBSCRIBED" AdtranXRTDiagFNS
+ match "Unknown AT cmd" IQSyncOK
+ match "ERR"
+ match "OK\r\n"
+ wait 3
+ call GetOK
+ log "The ISDN modem did not properly answer ATS59?"
+ failure
+ goto ImpactIQCheckInit
+
+AdtranXRTDiagFNS:
+ log "ISDN initialization failed. Please check your ISDN switch type, directory numbers, and SPID settings."
+ failure
+
+AdtranXRTDiagL1:
+ log "The ISDN modem is not receiving any ISDN signal. Please verify that it's connected to an ISDN line."
+ failure
+
+AdtranXRTDiagBlank:
+ log "ISDN initialization failed or restarting link. Please verify proper line connection and ISDN settings."
+ failure
+
+##
+## AdtranXRTCheckLink
+##
+## Check the link status registers
+##
+
+AdtranXRTCheckLink:
+ log "Checking the ISDN modem's link status..."
+ print "AT!S1\r\n"
+ match "Link In Sync" AdtranXRTSyncReg
+ match "Getting" AdtranXRTSyncReg
+ match "Register" AdtranXRTSyncReg
+ match "Ready" AdtranXRTSyncOK
+ match "Down" AdtranXRTSyncFail
+ match "ERR"
+ match "OK\r\n"
+ wait 3
+ call GetOK
+ log "The ISDN modem did not properly answer AT!S1."
+ failure
+AdtranXRTSyncOK:
+ return
+AdtranXRTSyncFail:
+ print "ATDT1\r\n"
+ wait 1
+ goto AdtranXRTDiagnose
+AdtranXRTSyncReg:
+ log "The ISDN modem is initializing itself."
+ failure
+
+##
+## AdtranXRTCheckConfig
+##
+## Verify and adjust ISDN configuration as necessary
+##
+
+AdtranXRTCheckConfig:
+ log "Checking the ISDN modem's ISDN configuration..."
+ set $valueChanged "no"
+
+ set $checkCmd "S52"
+ set $checkValue "000"
+ set $checkValueNew "0"
+ if $TA_SwitchType == "DMS-100" set $checkValue "001"
+ if $TA_SwitchType == "DMS-100" set $checkValueNew "1"
+ if $TA_SwitchType == "NI-1" set $checkValue "002"
+ if $TA_SwitchType == "NI-1" set $checkValueNew "2"
+ set $checkMsg "Reprogramming switch type ($TA_SwitchType)..."
+ call ModemCheckValue
+
+# Check directory numbers
+
+AdtranXRTCheckDirnos:
+ set $checkCmd "SS62"
+ set $checkValue $TA_Dirno1
+ set $checkValueNew $TA_Dirno1
+ set $checkMsg "Reprogramming line #1 directory number..."
+ call ModemCheckValue
+
+ set $checkCmd "SS63"
+ set $checkValue $TA_Dirno2
+ set $checkValueNew $TA_Dirno2
+ set $checkMsg "Reprogramming line #2 directory number..."
+ call ModemCheckValue
+
+# Check SPIDs
+
+ set $checkCmd "SS60"
+ set $checkValue $TA_SPID1
+ set $checkValueNew $TA_SPID1
+ set $checkMsg "Reprogramming line #1 SPID..."
+ call ModemCheckValue
+
+ set $checkCmd "SS61"
+ set $checkValue $TA_SPID2
+ set $checkValueNew $TA_SPID2
+ set $checkMsg "Reprogramming line #2 SPID..."
+ call ModemCheckValue
+
+# Restart if necessary
+
+ if $valueChanged == "no" return
+ log "Restarting ISDN modem with the new configuration..."
+ set $modemCmd "&W"
+ call ModemCmd2
+ set $modemCmd "Z"
+ call ModemCmd2
+ failure
+
+#################################################################
+#
+# BASIC MODEM STUFF
+#
+#################################################################
+
+##
+## ModemAnswer
+##
+## Wait for a RING and answer it. Variables:
+##
+## $RingTimeout How long for a RING before giving up (default 10 min)
+## $ConnectTimeout How long for connect after answering (default 45 secs)
+##
+## Returns:
+##
+## $answerReturn "OK" or "FAIL"
+## $ConnectionSpeed Connection speed reported by modem (possibly empty)
+##
+
+ModemAnswer:
+ if $RingTimeout == "" set $RingTimeout 600
+ if $ConnectTimeout == "" set $ConnectTimeout 45
+ match "RING\r" ModemAnswerGotRing
+ wait $RingTimeout
+ log "No RING detected after $RingTimeout seconds."
+ set $answerReturn "FAIL"
+ return
+ModemAnswerGotRing:
+ log "Incoming call detected..."
+ print "ATA\r\n"
+ regex "CONNECT *([0-9]*).*$" ModemAnswerConnect
+ wait $ConnectTimeout
+ log "Failed to connect incoming call."
+ set $answerReturn "FAIL"
+ return
+ModemAnswerConnect:
+ set $ConnectionSpeed $matchedString1
+ set $answerReturn "OK"
+ return
+
+##
+## ModemFind
+##
+## Just try to get where we are talking to the modem.
+## Returns with $ErrorMsg equal to the empty string if
+## we found the modem, or else some error message if not.
+##
+
+ModemFind:
+
+# Do a quick check first...
+
+ set $ErrorMsg ""
+ call ModemFind4
+ if $modemCmdResult == "OK" return
+ if $Serial230K != "yes" goto ModemFind1
+ set $newBaudrate 230400
+ if $Baudrate == "230400" set $newBaudrate 115200
+ set $Baudrate $newBaudrate
+ call ModemFind4
+ if $modemCmdResult == "OK" return
+
+# Now try possible baud rates more extensively
+
+ModemFind1:
+ set $Baudrate 115200
+ call ModemFind2
+ if $modemCmdResult == "OK" return
+ if $Serial230K != "yes" return
+ set $Baudrate 230400
+ wait 1
+ call ModemFind2
+ if $modemCmdResult == "OK" return
+ set $ErrorMsg "The modem is not responding."
+ return
+
+# This tries the +++ sequence in case the modem is in "on-line" mode
+
+ModemFind2:
+ call ModemFind3
+ if $modemCmdResult == "OK" return
+ call SendTriplePlus
+ call ModemFind3
+ return
+
+# This tries a few commands to see if the modem responds with "OK"
+
+ModemFind3:
+ set $modemCmd ""
+ set $modemCmdTimeout 1
+ call ModemCmd0
+ if $modemCmdResult == "OK" return
+ set $modemCmd "Z"
+ set $modemCmdTimeout 2
+ call ModemCmd0
+ if $modemCmdResult == "OK" return
+ModemFind4:
+ set $modemCmd ""
+ set $modemCmdTimeout 1
+ call ModemCmd0
+ return
+
+##
+## SetBaudrate
+##
+## Change baud rates (as allowed) and verify modem is still there.
+## If not, then fail the script.
+##
+## $newBaudrate New baud rate; if we don't support it, just return.
+## $modemCmd Command to send modem to jump to the new baud rate.
+##
+
+SetBaudrate:
+ if $Baudrate == $newBaudrate return
+ if $newBaudrate != 230400 goto SetBaudrate2
+ if $Serial230K != "yes" return
+SetBaudrate2:
+ log "Setting serial port speed to $newBaudrate..."
+ print "AT$modemCmd\r\n"
+ wait 1
+ set $Baudrate $newBaudrate
+ wait 1
+ set $modemCmd ""
+ goto ModemCmd2
+
+##
+## ModemCheckValue
+##
+## Check the value in an S-register (or equivalent). If it is
+## not what we want, then change it and set $valueChanged to "yes",
+## and log $checkMsg (if not empty). The value $checkValueNew is
+## what we program the S-register to equal if it doesn't match.
+##
+## The $checkValue must match exactly on the first line of output.
+## If we get any weird error, then fail the script.
+##
+
+ModemCheckValue:
+ set $modemCmd "${checkCmd}?"
+ call ModemQuery
+ if $modemQuery == $checkValue return
+ set $valueChanged "yes"
+ set $checkValueMyNew $checkValueNew
+ if $checkValueNew == "" set $checkValueMyNew $checkValue
+ set $modemCmd "${checkCmd}=${checkValueMyNew}"
+ if $checkMsg != "" log $checkMsg
+ goto ModemCmd2
+
+##
+## ModemCmd
+##
+## Do the modem command in $modemCmd. Set $modemCmdResult to
+##
+## OK The modem returned "OK"
+## ERROR The modem returned "ERR" or "ERROR"
+## TIMEOUT The modem did not respond within three seconds
+##
+## If ERR or TIMEOUT, also set $ErrorMsg to an appropriate message
+##
+
+ModemCmd:
+ set $modemCmdTimeout 3
+ModemCmd0:
+ print "AT$modemCmd\r\n"
+ match "OK\r\n" ModemCmdOk
+ match "ERR" ModemCmdErr
+ wait $modemCmdTimeout
+ set $modemCmdResult "TIMEOUT"
+ModemCmdTimeout:
+ set $ErrorMsg "The modem is not responding to \"AT$modemCmd\" at ModemCmd: label."
+ return
+ModemCmdOk:
+ set $modemCmdResult "OK"
+ return
+ModemCmdErr:
+ set $modemCmdResult "ERROR"
+ set $ErrorMsg "The modem responded with \"ERROR\" to the command \"AT$modemCmd\" at ModemCmd: label."
+ return
+
+##
+## ModemCmd2
+##
+## Do the modem command in $modemCmd. If we don't get OK back,
+## fail the script and log an error message.
+##
+
+ModemCmd2:
+ call ModemCmd
+ if $modemCmdResult == "OK" return
+ log $ErrorMsg
+ failure
+
+##
+## ModemCmdSend
+##
+## Send a modem command and read the echo'ed CR-LF
+##
+
+ModemCmdSend:
+ print "AT$modemCmd\r\n"
+ match "\r\n" ModemCmdSend2
+ wait 3
+ goto ModemCmdTimeout
+ModemCmdSend2:
+ return
+
+##
+## ModemQuery
+##
+## Do the $modemCmd and expect exactly one line of response, then OK.
+## Return the response in $modemQuery. If anything goes wrong, die.
+##
+
+ModemQuery:
+ call ModemCmdSend
+ call ReadLine
+ set $modemQuery $matchedString
+ if $modemQuery == "ERR" goto ModemQueryError
+ if $modemQuery == "ERROR" goto ModemQueryError
+ goto GetOK
+ModemQueryError:
+ call ModemCmdErr
+ failure
+
+# Same thing, but strip leading and trailing blanks
+
+ModemQueryStrip:
+ call ModemQuery
+ if $modemQuery match " *(.*) *" nop
+ set $modemQuery $matchedString1
+ return
+
+##
+## ReadLine
+##
+## Read the next line of output. It should come within $modemCmdTimeout
+## seconds, or else we fail. Return it in $matchedString.
+##
+
+ReadLine:
+ regex "^.*$" ReadLineDone
+ wait $modemCmdTimeout
+ set $ErrorMsg "The modem is not responding."
+ log $ErrorMsg
+ failure
+ReadLineDone:
+ return
+
+##
+## Get an OK within 3 seconds or die
+##
+
+GetOK:
+ match "OK\r\n" GotOK
+ wait 3
+ log "The modem did not respond with \"OK\"."
+ failure
+GotOK:
+ return
+
+##
+## Send "+++" to get modem attention if on-line
+##
+
+SendTriplePlus:
+ print "\r\n"
+ wait 2
+ print "+++"
+ wait 2
+ return
+
+#################################################################
+#
+# LOGIN AUTO-SCRIPTING
+#
+#################################################################
+
+##
+## AutoLogin
+##
+## Here we attempt to figure out what the remote server wants
+## from us. We do this by checking for bytes that correspond
+## to PPP packets (in which case we are done) as well as common
+## login type stuff like "name:", "ogin:", etc.
+##
+## This always returns. The hope is that when it returns, the
+## remote side has reached PPP mode.
+##
+## This has been crafted from empirical evidence. Lots of terminal
+## servers have various intelligent/stupid features which we
+## take advantage of/have to work around.
+##
+## Variables (set automatically by mpd):
+##
+## $Login Authorization login
+## $Password Authorization password
+##
+
+AutoLogin:
+ log "Initiating auto-login..."
+
+# Spend at most this long doing auto-login before giving up
+
+ timer autoLogin 5 AutoLoginTimeout
+
+# At any time if we see an LCP frame (not our own echo) then we're done
+
+ match autoLogin "\x7e\xff\x03\xc0\x21" AutoLoginFrame
+ match autoLogin "\x7e\xff\x7d\x23\xc0\x21\x7d\x21" AutoLoginFrame
+ match autoLogin "\x7e\xc0\x21" AutoLoginFrame
+
+# Now send a "fake" PPP frame (this is an empty config-reject with id# 172).
+# This should trigger any auto-detecting servers to jump into PPP mode,
+# which is good because it's faster (by avoiding human readable messages)
+# and more reliable (PPP framing).
+
+ print "\x7e\xff\x7d\x23\xc0\x21\x7d\x24\xac\x7d\x20\x7d\x24\x2e\x2b\x7e"
+
+# Wait one second for server to auto-detect PPP or send a login prompt.
+# After one second of neither, try sending a carriage return (some servers
+# require this). After that, we have to see something recognizable from
+# the peer, otherwise we'll just timeout.
+
+ match "ogin" AutoLoginPrompt
+ match "name" AutoLoginPrompt
+ wait 1
+ print "\r"
+ match "ogin" AutoLoginPrompt
+ match "name" AutoLoginPrompt
+ wait
+
+# At this point we've seen a login prompt; do the manual login
+
+AutoLoginPrompt:
+ log "Sending login..."
+ print "${Login}\r"
+ match "word"
+ wait
+ log "Sending password..."
+ print "${Password}\r"
+ match "\r"
+ wait
+ if $didLogin != "yes" match "ogin:" LoginAgain
+ match ">"
+ match "%"
+ match ":"
+ wait
+ log "Enabling PPP..."
+ print "ppp\r"
+ cancel all
+ return
+
+LoginAgain:
+ set $didLogin "yes"
+ goto AutoLoginPrompt
+
+# We saw a PPP frame
+
+AutoLoginFrame:
+ log "Detected PPP frame."
+ cancel all
+ return
+
+# We timed out before seeing a PPP frame. Cross your fingers and pray.
+
+AutoLoginTimeout:
+ log "Auto-login timeout."
+ cancel all
+ return
+
diff --git a/src/usr/local/sbin/ntpdate_sync_once.sh b/src/usr/local/sbin/ntpdate_sync_once.sh
new file mode 100755
index 0000000..c183b79
--- /dev/null
+++ b/src/usr/local/sbin/ntpdate_sync_once.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+NOTSYNCED="true"
+MAX_ATTEMPTS=3
+SERVER=`/bin/cat /cf/conf/config.xml | /usr/bin/grep timeservers | /usr/bin/cut -d">" -f2 | /usr/bin/cut -d"<" -f1`
+if [ "${SERVER}" = "" ]; then
+ exit
+fi
+
+/bin/pkill -f ntpdate_sync_once.sh
+
+ATTEMPT=1
+# Loop until we're synchronized, but for a set number of attempts so we don't get stuck here forever.
+while [ "$NOTSYNCED" = "true" ] && [ ${ATTEMPT} -le ${MAX_ATTEMPTS} ]; do
+ # Ensure that ntpd and ntpdate are not running so that the socket we want will be free.
+ while [ true ]; do
+ /usr/bin/killall ntpdate 2>/dev/null
+ /bin/pgrep ntpd
+ if [ $? -eq 0 ]; then
+ /usr/bin/killall ntpd 2>/dev/null
+ else
+ break
+ fi
+ done
+ sleep 1
+ /usr/local/sbin/ntpdate -s -t 5 ${SERVER}
+ if [ "$?" = "0" ]; then
+ NOTSYNCED="false"
+ else
+ sleep 5
+ ATTEMPT=`expr ${ATTEMPT} + 1`
+ fi
+done
+
+if [ "$NOTSYNCED" = "true" ]; then
+ echo "Giving up on time sync after ${MAX_ATTEMPTS} attempts." | /usr/bin/logger -t ntp;
+else
+ echo "Successfully synced time after ${ATTEMPT} attempts." | /usr/bin/logger -t ntp;
+fi
+
+if [ -f /var/etc/ntpd.conf ]; then
+ echo "Starting NTP Daemon." | /usr/bin/logger -t ntp;
+ /usr/local/sbin/ntpd -g -c /var/etc/ntpd.conf -p /var/run/ntpd.pid
+else
+ echo "NTP configuration file missing, not starting daemon." | /usr/bin/logger -t ntp;
+fi
diff --git a/src/usr/local/sbin/openvpn.attributes.sh b/src/usr/local/sbin/openvpn.attributes.sh
new file mode 100755
index 0000000..add8e32
--- /dev/null
+++ b/src/usr/local/sbin/openvpn.attributes.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+echo $script_type > /tmp/script
+if [ "$script_type" = "client-connect" ]; then
+ if [ -f /tmp/$common_name ]; then
+ /bin/cat /tmp/$common_name > $1
+ /bin/rm /tmp/$common_name
+ fi
+elif [ "$script_type" = "client-disconnect" ]; then
+ command="/sbin/pfctl -a 'openvpn/$common_name' -F rules"
+ eval $command
+ /sbin/pfctl -k $ifconfig_pool_remote_ip
+ /sbin/pfctl -K $ifconfig_pool_remote_ip
+fi
+
+exit 0
diff --git a/src/usr/local/sbin/ovpn-linkdown b/src/usr/local/sbin/ovpn-linkdown
new file mode 100755
index 0000000..708d507
--- /dev/null
+++ b/src/usr/local/sbin/ovpn-linkdown
@@ -0,0 +1,7 @@
+#!/bin/sh
+/sbin/pfctl -i $1 -Fs
+# delete the node just in case mpd cannot do that
+/bin/rm -f /var/etc/nameserver_$1
+/bin/rm -f /tmp/$1_router
+/bin/rm -f /tmp/$1up
+/usr/local/sbin/pfSctl -c 'filter reload'
diff --git a/src/usr/local/sbin/ovpn-linkup b/src/usr/local/sbin/ovpn-linkup
new file mode 100755
index 0000000..1164835
--- /dev/null
+++ b/src/usr/local/sbin/ovpn-linkup
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+# let the configuration system know that the ip has changed.
+#/usr/local/sbin/pfSctl -c "interface newip $interface"
+
+if [ "${dev_type}" = "tun" ]; then
+ if [ -n "${route_vpn_gateway}" ]; then
+ /bin/echo ${route_vpn_gateway} > /tmp/${1}_router
+ elif [ -n "${ifconfig_remote}" ]; then
+ /bin/echo ${ifconfig_remote} > /tmp/${1}_router
+ elif [ -n "${ifconfig_local}" ]; then
+ /bin/echo ${ifconfig_local} > /tmp/${1}_router
+ else
+ /bin/echo ${5} > /tmp/${1}_router
+ fi
+fi
+
+/usr/bin/touch /tmp/${1}up
+# reload filter
+/usr/local/sbin/pfSctl -c "interface newip ${1}"
+exit 0
diff --git a/src/usr/local/sbin/ovpn_auth_verify b/src/usr/local/sbin/ovpn_auth_verify
new file mode 100755
index 0000000..b38fcb9
--- /dev/null
+++ b/src/usr/local/sbin/ovpn_auth_verify
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+if [ "$1" = "tls" ]; then
+ RESULT=$(/usr/local/sbin/fcgicli -f /etc/inc/openvpn.tls-verify.php -d "servercn=$2&depth=$3&certdepth=$4&certsubject=$5")
+else
+ # Single quoting $password breaks getting the value from the variable.
+ password=$(echo -n "${password}" | openssl enc -base64 | sed -e 's/=/%3D/g')
+ username=$(echo -n "${username}" | openssl enc -base64 | sed -e 's/=/%3D/g')
+ RESULT=$(/usr/local/sbin/fcgicli -f /etc/inc/openvpn.auth-user.php -d "username=$username&password=$password&cn=$common_name&strictcn=$3&authcfg=$2&modeid=$4")
+fi
+
+if [ "${RESULT}" = "OK" ]; then
+ exit 0
+fi
+
+exit 1
diff --git a/src/usr/local/sbin/pfSsh.php b/src/usr/local/sbin/pfSsh.php
new file mode 100755
index 0000000..8bfc909
--- /dev/null
+++ b/src/usr/local/sbin/pfSsh.php
@@ -0,0 +1,344 @@
+#!/usr/local/bin/php-cgi -f
+
+<?php
+
+require_once("globals.inc");
+echo "Starting the {$g['product_name']} developer shell";
+require_once("functions.inc");
+echo ".";
+require_once("config.inc");
+echo ".";
+require_once("util.inc");
+echo ".";
+
+$shell_cmds = array("alias", "alloc", "bg", "bind", "bindkey", "break",
+ "breaksw", "builtins", "case", "cd", "chdir", "command", "complete", "continue", "default",
+ "dirs", "do", "done", "echo", "echotc", "elif", "else", "end", "endif", "endsw", "esac", "eval",
+ "exec", "exit", "export", "false", "fc", "fg", "filetest", "fi", "for", "foreach", "getopts",
+ "glob", "goto", "hash", "hashstat", "history", "hup", "if", "jobid", "jobs", "kill", "limit",
+ "local", "log", "login", "logout", "ls-F", "nice", "nohup", "notify", "onintr", "popd",
+ "printenv", "pushd", "pwd", "read", "readonly", "rehash", "repeat", "return", "sched", "set",
+ "setenv", "settc", "setty", "setvar", "shift", "source", "stop", "suspend", "switch",
+ "telltc", "test", "then", "time", "trap", "true", "type", "ulimit", "umask", "unalias",
+ "uncomplete", "unhash", "unlimit", "unset", "unsetenv", "until", "wait", "where", "which",
+ "while");
+
+function pipe_cmd($command, $text_to_pipe) {
+ $descriptorspec = array(
+ 0 => array("pipe", "r"), // stdin
+ 1 => array("pipe", "w"), // stdout
+ 2 => array("pipe", "w")); // stderr ?? instead of a file
+
+ $fd = proc_open("$command", $descriptorspec, $pipes);
+ if (is_resource($fd)) {
+ fwrite($pipes[0], "{$text_to_pipe}");
+ fclose($pipes[0]);
+ while ($s= fgets($pipes[1], 1024)) {
+ // read from the pipe
+ $buffer .= $s;
+ }
+ fclose($pipes[1]);
+ fclose($pipes[2]);
+ }
+ return $buffer;
+}
+
+if (!function_exists("readline")) {
+ function readline() {
+ $fp = fopen('php://stdin', 'r');
+ $textinput = chop(fgets($fp));
+ fclose($fp);
+ return $textinput;
+ }
+}
+
+function more($text, $count=24) {
+ $counter=0;
+ $lines = explode("\n", $text);
+ foreach ($lines as $line) {
+ if ($counter > $count) {
+ echo "Press RETURN to continue ...";
+ $fp = fopen('php://stdin', 'r');
+ $pressreturn = chop(fgets($fp));
+ if ($pressreturn == "q" || $pressreturn == "quit") {
+ return;
+ }
+ fclose($fp);
+ $counter = 0;
+ }
+ echo "{$line}\n";
+ $counter++;
+ }
+}
+
+function show_help() {
+
+$show_help_text = <<<EOF
+
+ Enter a series of commands and then execute the set with "exec".
+
+ For example:
+ echo "foo"; // php command
+ echo "foo2"; // php command
+ ! echo "heh" # shell command
+ exec
+
+ Example commands:
+
+ startrecording <recordingfilename>
+ stoprecording <recordingfilename>
+ showrecordings
+
+ parse_config(true); # reloads the \$config array
+
+ \$temp = print_r(\$config, true);
+ more(\$temp);
+
+ /* to output a configuration array */
+ print_r(\$config);
+
+ /* to output the interfaces configuration portion of config.xml */
+ print_r(\$config['interfaces']);
+
+ /* to output the dhcp server configuration */
+ print_r(\$config['dhcpd']);
+
+ /* to exit the {$g['product_name']} developer shell */
+ exit
+
+ /* to output supported wireless modes for an interface */
+ print_r(get_wireless_modes(\"ath0\"));
+
+ /* to enable SSH */
+ \$config['system']['enablesshd'] = true;
+
+ /* change OPTX to the OPT interface name such as BACKHAUL */
+ \$config['interfaces']['optx']['wireless']['standard'] = "11a";
+ \$config['interfaces']['optx']['wireless']['mode'] = "hostap";
+ \$config['interfaces']['optx']['wireless']['channel'] = "6";
+
+ /* to enable dhcp server for an optx interface */
+ \$config['dhcpd']['optx']['enable'] = true;
+ \$config['dhcpd']['optx']['range']['from'] = "192.168.31.100";
+ \$config['dhcpd']['optx']['range']['to'] = "192.168.31.150";
+
+ /* to disable the firewall filter */
+ \$config['system']['disablefilter'] = true;
+
+ /* to enable an interface and configure it as a DHCP client */
+ \$config['interfaces']['optx']['disabled'] = false;
+ \$config['interfaces']['optx']['ipaddr'] = "dhcp";
+
+ /* to enable an interface and set a static IPv4 address */
+ \$config['interfaces']['wan']['enable'] = true;
+ \$config['interfaces']['wan']['ipaddr'] = "192.168.100.1";
+ \$config['interfaces']['wan']['subnet'] = "24";
+
+ /* to save out the new configuration (config.xml) */
+ write_config();
+
+ /* to reboot the system after saving */
+ system_reboot_sync();
+
+EOF;
+
+ more($show_help_text);
+
+}
+
+$fp = fopen('php://stdin', 'r');
+
+echo ".\n\n";
+
+$pkg_interface='console';
+
+$shell_active = true;
+$tccommands = array();
+
+function completion($string, $index) {
+ global $tccommands;
+ return $tccommands;
+}
+
+readline_completion_function("completion");
+
+if ($argc < 2) {
+ echo "Welcome to the {$g['product_name']} developer shell\n";
+ echo "\nType \"help\" to show common usage scenarios.\n";
+ echo "\nAvailable playback commands:\n ";
+ $files = scandir("/etc/phpshellsessions/");
+ $tccommands[] = "playback";
+ foreach ($files as $file) {
+ if ($file <> "." and $file <> "..") {
+ echo $file . " ";
+ if (function_exists("readline_add_history")) {
+ readline_add_history("playback $file");
+ $tccommands[] = "$file";
+ }
+ }
+ }
+ echo "\n\n";
+}
+
+$recording = false;
+$playback_file_split = array();
+$playbackbuffer = "";
+
+if ($argv[1]=="playback" or $argv[1]=="run") {
+ if (!file_exists("/etc/phpshellsessions/{$argv[2]}")) {
+ echo "Could not locate playback file.";
+ exit;
+ }
+ playback_file($argv[2]);
+ exit;
+}
+
+// Define more commands
+$tccommands[] = "exit";
+$tccommands[] = "quit";
+$tccommands[] = "?";
+$tccommands[] = "exec";
+$tccommands[] = "startrecording";
+$tccommands[] = "stoprecording";
+$tccommands[] = "showrecordings";
+$tccommands[] = "record";
+$tccommands[] = "reset";
+$tccommands[] = "master";
+$tccommands[] = "RELENG_1_2";
+
+while ($shell_active == true) {
+ $command = readline("{$g['product_name']} shell: ");
+ readline_add_history($command);
+ $command_split = explode(" ", $command);
+ $first_command = $command_split[0];
+ if ($first_command == "playback" || $first_command == "run") {
+ $playback_file = $command_split[1];
+ if (!$playback_file || !file_exists("/etc/phpshellsessions/{$playback_file}")) {
+ $command = "";
+ echo "Could not locate playback file.\n";
+ } else {
+ $command = "";
+ echo "\nPlayback of file {$command_split[1]} started.\n\n";
+ playback_file("{$playback_file}");
+ continue;
+ }
+ }
+ if ($first_command == "exit" or $first_command == "quit") {
+ die;
+ }
+ if ($first_command == "help" or $first_command == "?") {
+ show_help();
+ $playbackbuffer = "";
+ continue;
+ }
+ if ($first_command == "exec" or $first_command == "exec;") {
+ playback_text($playbackbuffer);
+ $playbackbuffer = "";
+ continue;
+ }
+ if ($first_command == "stoprecording" || $first_command == "stoprecord" || $first_command == "stop") {
+ if ($recording) {
+ fwrite($recording_fd, $playbackbuffer);
+ fclose($recording_fd);
+ $command = "";
+ conf_mount_ro();
+ echo "Recording stopped.\n";
+ $recording = false;
+ } else {
+ echo "No recording session in progress.\n";
+ $command = "";
+ }
+ }
+ if ($first_command == "showrecordings") {
+ show_recordings();
+ $command = "";
+ }
+ if ($first_command == "reset") {
+ $playbackbuffer = "";
+ echo "\nBuffer reset.\n\n";
+ continue;
+ }
+ if ($first_command == "record") {
+ if (!$command_split[1]) {
+ echo "usage: record playbackname\n";
+ $command = "";
+ } else {
+ /* time to record */
+ conf_mount_rw();
+ safe_mkdir("/etc/phpshellsessions");
+ $recording_fd = fopen("/etc/phpshellsessions/{$command_split[1]}","w");
+ if (!$recording_fd) {
+ echo "Could not start recording session.\n";
+ $command = "";
+ } else {
+ $recording = true;
+ echo "Recording of {$command_split[1]} started.\n";
+ $command = "";
+ }
+ }
+ }
+ $playbackbuffer .= $command . "\n";
+}
+
+function show_recordings() {
+ conf_mount_rw();
+ safe_mkdir("/etc/phpshellsessions");
+ if ($recording) {
+ conf_mount_ro();
+ }
+ echo "==> Sessions available for playback are:\n";
+ system("cd /etc/phpshellsessions && ls /etc/phpshellsessions");
+ echo "==> end of list.\n";
+}
+
+function returnlastchar($command) {
+ $commandlen = strlen($command);
+ $endofstring = substr($command, ($commandlen-1));
+ return $endofstring;
+}
+
+function returnfirstchar($command) {
+ $commandlen = strlen($command);
+ $endofstring = substr($command, 0, 1);
+ return $endofstring;
+}
+
+function str_replace_all($search,$replace,$subject) {
+ while (strpos($subject,$search)!==false) {
+ $subject = str_replace($search,$replace,$subject);
+ }
+ return $subject;
+}
+
+function playback_text($playback_file_contents) {
+ $playback_file_split = explode("\n", $playback_file_contents);
+ $playback_text = "require_once('functions.inc');\n";
+ $playback_text .= "require_once('globals.inc');\n";
+ $playback_text .= "require_once('config.inc');\n";
+ $toquote = '"';
+ $toquotereplace = '\\"';
+ foreach ($playback_file_split as $pfs) {
+ $firstchar = returnfirstchar($pfs);
+ $currentline = $pfs;
+ if ($firstchar == "!") {
+ /* XXX: encode " in $pfs */
+ $pfsa = str_replace($toquote, $toquotereplace, $currentline);
+ $playback_text .= str_replace("!", "system(\"", $pfsa) . "\");\n";
+ } else if ($firstchar == "=") {
+ /* XXX: encode " in $pfs */
+ $pfsa = str_replace($toquote, $toquotereplace, $currentline);
+ $currentline .= str_replace("!", "system(\"", $pfsa) . "\");\n";
+ } else {
+ $playback_text .= $pfs . "\n";
+ }
+ }
+ global $config;
+ eval($playback_text);
+}
+
+function playback_file($playback_file) {
+ $playback_file_contents = file_get_contents("/etc/phpshellsessions/{$playback_file}");
+ playback_text($playback_file_contents);
+}
+
+?>
diff --git a/src/usr/local/sbin/ppp-linkdown b/src/usr/local/sbin/ppp-linkdown
new file mode 100755
index 0000000..62d07ed
--- /dev/null
+++ b/src/usr/local/sbin/ppp-linkdown
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+IF="${1}"
+LOCAL_IP="${3}"
+
+if [ -f /tmp/${IF}up ] && [ -f /conf/${IF}.log ]; then
+ seconds=$((`date -j +%s` - `/usr/bin/stat -f %m /tmp/${IF}up`))
+ /usr/local/sbin/ppp-log-uptime.sh $seconds ${IF} &
+fi
+
+/etc/rc.kill_states ${IF} ${LOCAL_IP}
+
+if [ -s "/tmp/${IF}_defaultgw" ]; then
+ GW=`head -n 1 /tmp/${IF}_defaultgw`
+ [ -n "${GW}" ] \
+ && /sbin/route delete default ${GW}
+fi
+# delete the node just in case mpd cannot do that
+/usr/sbin/ngctl shutdown ${IF}:
+if [ -f "/var/etc/nameserver_${IF}" ]; then
+ # Remove old entries
+ for nameserver in `cat /var/etc/nameserver_${IF}`; do
+ /sbin/route delete ${nameserver} >/dev/null 2>&1
+ done
+ /bin/rm -f /var/etc/nameserver_${IF}
+fi
+# Do not remove gateway used during filter reload.
+/bin/rm -f /tmp/${IF}_router
+/bin/rm -f /tmp/${IF}up
+/bin/rm -f /tmp/${IF}_ip
+/usr/local/sbin/pfSctl -c 'service reload dns'
diff --git a/src/usr/local/sbin/ppp-linkup b/src/usr/local/sbin/ppp-linkup
new file mode 100755
index 0000000..2d1eb33
--- /dev/null
+++ b/src/usr/local/sbin/ppp-linkup
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin
+
+if [ "${2}" == "inet" ]; then
+
+ OLD_ROUTER=`cat /tmp/${1}_router`
+ if [ -n "${OLD_ROUTER}" ]; then
+ echo "Removing states to old router ${OLD_ROUTER}" | logger -t ppp-linkup
+ pfctl -i ${1} -k 0.0.0.0/0 -k ${OLD_ROUTER}/32
+ pfctl -i ${1} -k ${OLD_ROUTER}/32 -k 0.0.0.0/0
+ fi
+
+ # let the configuration system know that the ipv4 has changed.
+ echo ${4} > /tmp/${1}_router
+ echo ${3} > /tmp/${1}_ip
+ touch /tmp/${1}up
+
+ if grep -q dnsallowoverride /conf/config.xml; then
+ # write nameservers to file
+ echo -n "" > /var/etc/nameserver_${1}
+ if echo "${6}" | grep -q dns1; then
+ DNS1=`echo "${6}" | awk '{print $2}'`
+ echo "${DNS1}" >> /var/etc/nameserver_${1}
+ route change "${DNS1}" ${4}
+ fi
+ if echo "${7}" | grep -q dns2; then
+ DNS2=`echo "${7}" | awk '{print $2}'`
+ echo "${DNS2}" >> /var/etc/nameserver_${1}
+ route change "${DNS2}" ${4}
+ fi
+ pfSctl -c 'service reload dns'
+ sleep 1
+ fi
+ pfSctl -c "interface newip ${1}"
+
+elif [ "${2}" == "inet6" ]; then
+ # let the configuration system know that the ipv6 has changed.
+ echo ${4} |cut -d% -f1 > /tmp/${1}_routerv6
+ echo ${3} |cut -d% -f1 > /tmp/${1}_ipv6
+ touch /tmp/${1}upv6
+
+ if grep -q dnsallowoverride /conf/config.xml; then
+ # write nameservers to file
+ echo -n "" > /var/etc/nameserver_v6${1}
+ if echo "${6}" | grep -q dns1; then
+ DNS1=`echo "${6}" | awk '{print $2}'`
+ echo "${DNS1}" >> /var/etc/nameserver_v6${1}
+ route change -inet6 "${DNS1}" ${4}
+ fi
+ if echo "${7}" | grep -q dns2; then
+ DNS2=`echo "${7}" | awk '{print $2}'`
+ echo "${DNS2}" >> /var/etc/nameserver_v6${1}
+ route change -inet6 "${DNS2}" ${4}
+ fi
+ pfSctl -c 'service reload dns'
+ sleep 1
+ fi
+ pfSctl -c "interface newipv6 ${1}"
+fi
+
+exit 0
diff --git a/src/usr/local/sbin/ppp-log-uptime.sh b/src/usr/local/sbin/ppp-log-uptime.sh
new file mode 100755
index 0000000..6fd8def
--- /dev/null
+++ b/src/usr/local/sbin/ppp-log-uptime.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+#write the uptime in seconds to the persistent log in /conf/
+/etc/rc.conf_mount_rw
+/bin/echo `date -j +%Y.%m.%d-%H:%M:%S` $1 >> /conf/$2.log
+/etc/rc.conf_mount_ro
diff --git a/src/usr/local/sbin/ppp-uptime.sh b/src/usr/local/sbin/ppp-uptime.sh
new file mode 100755
index 0000000..d7a8441
--- /dev/null
+++ b/src/usr/local/sbin/ppp-uptime.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+#get ppp uptime from age of /tmp/{interface}up file
+[ -f /tmp/$1up ] && /bin/echo $((`date -j +%s` - `/usr/bin/stat -f %m /tmp/$1up`)) \ No newline at end of file
diff --git a/src/usr/local/sbin/prefixes.php b/src/usr/local/sbin/prefixes.php
new file mode 100644
index 0000000..118bd9e
--- /dev/null
+++ b/src/usr/local/sbin/prefixes.php
@@ -0,0 +1,93 @@
+<?php
+
+$leases_file = "/var/dhcpd/var/db/dhcpd6.leases";
+if (!file_exists($leases_file)) {
+ exit(1);
+}
+
+$fd = fopen($leases_file, 'r');
+
+$duid_arr = array();
+while (( $line = fgets($fd, 4096)) !== false) {
+ // echo "$line";
+ if (preg_match("/^(ia-[np][ad])[ ]+\"(.*?)\"/i", $line, $duidmatch)) {
+ $type = $duidmatch[1];
+ $duid = $duidmatch[2];
+ continue;
+ }
+
+ /* is it active? otherwise just discard */
+ if (preg_match("/binding state active/i", $line, $activematch)) {
+ $active = true;
+ continue;
+ }
+
+ if (preg_match("/iaaddr[ ]+([0-9a-f:]+)[ ]+/i", $line, $addressmatch)) {
+ $ia_na = $addressmatch[1];
+ continue;
+ }
+
+ if (preg_match("/iaprefix[ ]+([0-9a-f:\/]+)[ ]+/i", $line, $prefixmatch)) {
+ $ia_pd = $prefixmatch[1];
+ continue;
+ }
+
+ /* closing bracket */
+ if (preg_match("/^}/i", $line)) {
+ switch ($type) {
+ case "ia-na":
+ $duid_arr[$duid][$type] = $ia_na;
+ break;
+ case "ia-pd":
+ $duid_arr[$duid][$type] = $ia_pd;
+ break;
+ }
+ unset($type);
+ unset($duid);
+ unset($active);
+ unset($ia_na);
+ unset($ia_pd);
+ continue;
+ }
+}
+fclose($fd);
+
+$routes = array();
+foreach ($duid_arr as $entry) {
+ if (!empty($entry['ia-pd'])) {
+ $routes[$entry['ia-na']] = $entry['ia-pd'];
+ }
+}
+
+// echo "add routes\n";
+if (count($routes) > 0) {
+ foreach ($routes as $address => $prefix) {
+ echo "/sbin/route change -inet6 {$prefix} {$address}\n";
+ }
+}
+
+/* get clog from dhcpd */
+$dhcpdlogfile = "/var/log/dhcpd.log";
+$expires = array();
+if (file_exists($dhcpdlogfile)) {
+ $fd = popen("clog $dhcpdlogfile", 'r');
+ while (($line = fgets($fd)) !== false) {
+ //echo $line;
+ if (preg_match("/releases[ ]+prefix[ ]+([0-9a-f:]+\/[0-9]+)/i", $line, $expire)) {
+ if (in_array($expire[1], $routes)) {
+ continue;
+ }
+ $expires[$expire[1]] = $expire[1];
+ }
+ }
+ pclose($fd);
+}
+
+// echo "remove routes\n";
+if (count($expires) > 0) {
+ foreach ($expires as $prefix) {
+ echo "/sbin/route delete -inet6 {$prefix['prefix']}\n";
+ }
+}
+
+?>
diff --git a/src/usr/local/sbin/show_filter_reload_status.php b/src/usr/local/sbin/show_filter_reload_status.php
new file mode 100755
index 0000000..e66c890
--- /dev/null
+++ b/src/usr/local/sbin/show_filter_reload_status.php
@@ -0,0 +1,26 @@
+#!/usr/local/bin/php-cgi -q
+<?php
+
+$last_text = "";
+
+while (!stristr($status, "Done")) {
+ $status = get_status();
+ if ($status <> "") {
+ echo $status . "\n";
+ }
+ sleep(1);
+}
+
+function get_status() {
+ global $last_text;
+ $status = file_get_contents("/var/run/filter_reload_status");
+ $status = str_replace("...", "", $status);
+ $status .= "...";
+ if ($status <> $last_text) {
+ $last_text = $status;
+ return $status;
+ }
+ return "";
+}
+
+?>
diff --git a/src/usr/local/sbin/ufslabels.sh b/src/usr/local/sbin/ufslabels.sh
new file mode 100755
index 0000000..bded665
--- /dev/null
+++ b/src/usr/local/sbin/ufslabels.sh
@@ -0,0 +1,149 @@
+#!/bin/sh
+############################################
+#
+# Change fstab to use ufsid and geom labels to avoid relying on device numbers directly.
+#
+############################################
+
+# : cat /etc/fstab
+# # Device Mountpoint FStype Options Dump Pass#
+# /dev/ad0s1a / ufs rw 1 1
+# /dev/ad0s1b none swap sw 0 0
+
+string_length() {
+ unset LEN
+ LEN=$(echo -n "${1}" | /usr/bin/wc -m)
+}
+
+get_ufsid() {
+ # $1 = device
+ # : /sbin/dumpfs /dev/ad0s1a | /usr/bin/head -n 2 | /usr/bin/tail -n 1 | /usr/bin/cut -f2 -d'[' | /usr/bin/cut -f1 -d ']' | /usr/bin/sed -e 's/[[:blank:]]//g'
+ # 51928c99a471c440
+
+ unset UFSID
+ local _dev="${1}"
+
+ if [ -z "${_dev}" ]; then
+ return
+ fi
+
+ ID_PARTS=$(/sbin/dumpfs /dev/${_dev} | \
+ /usr/bin/head -n 2 | \
+ /usr/bin/tail -n 1 | \
+ /usr/bin/cut -f2 -d'[' | \
+ /usr/bin/cut -f1 -d ']')
+ # " 51110eb0 f288b35d " (note it has more spaces than we need/want)
+ ID_PART1=$(echo ${ID_PARTS} | awk '{print $1}')
+ # "51110eb0"
+ ID_PART2=$(echo ${ID_PARTS} | awk '{print $2}')
+ # "f288b35d"
+
+ if [ -z "${ID_PART1}" -o -z "${ID_PART2}" ]; then
+ echo "Invalid ufsid on ${1} (${ID_PARTS}), cannot continue"
+ exit -1
+ fi
+
+ # Safety check to avoid http://www.freebsd.org/cgi/query-pr.cgi?pr=156908
+ string_length "${ID_PART1}"
+ if [ ${LEN} -ne 8 ]; then
+ ID_PART1=$(printf "%08s" "${ID_PART1}")
+ fi
+ string_length "${ID_PART2}"
+ if [ ${LEN} -ne 8 ]; then
+ ID_PART2=$(printf "%08s" "${ID_PART2}")
+ fi
+ UFSID="${ID_PART1}${ID_PART2}"
+}
+
+find_fs_device() {
+ unset DEV
+ DEV=$(/usr/bin/grep -e "[[:blank:]]*${1}[[:blank:]]" ${FSTAB} | awk '{print $1}')
+ DEV=${DEV##/dev/}
+}
+
+FSTAB=${DESTDIR}/etc/fstab
+unset NEED_CHANGES
+cp ${FSTAB} ${FSTAB}.tmp
+
+ALL_FILESYSTEMS=$(/usr/bin/awk '/ufs/ && !(/dev\/mirror\// || /dev\/ufsid\// || /dev\/label\// || /dev\/geom\//) {print $2}' ${DESTDIR}/etc/fstab)
+
+for FS in ${ALL_FILESYSTEMS}
+do
+ find_fs_device "${FS}"
+ if [ "${DEV}" != "" ]; then
+ get_ufsid ${DEV}
+ string_length "${UFSID}"
+ if [ ${LEN} -ne 16 ]; then
+ echo "Invalid UFS ID for FS ${FS} ($UFSID), skipping"
+ else
+ /usr/bin/sed -i '' -e "s/${DEV}/ufsid\/${UFSID}/g" ${FSTAB}.tmp
+ NEED_CHANGES=1
+ fi
+ else
+ echo "Unable to find device for ${FS}"
+ exit -1
+ fi
+ echo "FS: ${FS} on device ${DEV} with ufsid ${UFSID}"
+done
+
+ALL_SWAPFS=$(/usr/bin/awk '/swap/ && !(/dev\/mirror\// || /dev\/ufsid\// || /dev\/label\// || /dev\/geom\//) {print $1}' ${DESTDIR}/etc/fstab)
+SWAPNUM=0
+for SFS in ${ALL_SWAPFS}
+do
+ DEV=${SFS##/dev/}
+ if [ "${DEV}" != "" ]; then
+ SWAPDEV=${DEV}
+ echo "FS: Swap slice ${SWAPNUM} on device ${SWAPDEV}"
+ if [ "${SWAPDEV}" != "" ]; then
+ /usr/bin/sed -i '' -e "s/${SWAPDEV}/label\/swap${SWAPNUM}/g" ${FSTAB}.tmp
+ NEED_CHANGES=1
+ fi
+ SWAPNUM=$((SWAPNUM+1))
+ fi
+done
+
+if [ -z "${NEED_CHANGES}" ]; then
+ echo Nothing to do, all filesystems and swap already use some form of device-independent labels
+ exit 0
+fi
+
+echo "===================="
+echo "Current fstab:"
+cat ${FSTAB}
+echo "===================="
+echo "New fstab:"
+cat ${FSTAB}.tmp
+
+if [ "${1}" = "commit" ]; then
+ COMMIT=y
+else
+ echo "Commit changes? (y/n):"
+ read COMMIT
+fi
+
+# Commit changes
+if [ "${COMMIT}" = "y" -o "${COMMIT}" = "Y" ]; then
+
+ echo "Applying label to swap partition"
+ SWAPNUM=0
+ for SFS in ${ALL_SWAPFS}
+ do
+ find_fs_device "${SFS}"
+ if [ "${DEV}" != "" ]; then
+ SWAPDEV=${DEV}
+ if [ -n "${SWAPDEV}" ]; then
+ echo "Disabling swap ${SWAPDEV} to apply label"
+ /sbin/swapoff /dev/${SWAPDEV}
+ /sbin/glabel label swap${SWAPNUM} /dev/${SWAPDEV}
+ fi
+ SWAPNUM=$((SWAPNUM+1))
+ fi
+ done
+
+ echo "Activating new fstab"
+ /bin/mv -f ${FSTAB} ${FSTAB}.old
+ /bin/mv -f ${FSTAB}.tmp ${FSTAB}
+
+ echo "Re-enabling swap"
+ /sbin/swapon -a 2>/dev/null >/dev/null
+fi
diff --git a/src/usr/local/sbin/vpn-linkdown b/src/usr/local/sbin/vpn-linkdown
new file mode 100755
index 0000000..b6d033c
--- /dev/null
+++ b/src/usr/local/sbin/vpn-linkdown
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# record logout
+/usr/bin/logger -p local3.info "logout,$1,$4,$5"
+/sbin/pfctl -i $1 -Fs
+/sbin/pfctl -K $4/32
diff --git a/src/usr/local/sbin/vpn-linkup b/src/usr/local/sbin/vpn-linkup
new file mode 100755
index 0000000..bca7b6e
--- /dev/null
+++ b/src/usr/local/sbin/vpn-linkup
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# record login
+/usr/bin/logger -p local3.info "login,$1,$4,$5"
+
+case `/bin/echo $1 | /usr/bin/cut -c1-4` in
+ pptp)
+ /sbin/ifconfig $1 group pptp
+ ;;
+ poes)
+ /sbin/ifconfig $1 group pppoe
+ ;;
+ l2tp)
+ /sbin/ifconfig $1 group l2tp
+ ;;
+esac
diff --git a/src/usr/local/share/locale/en/LC_MESSAGES/pfSense.pot b/src/usr/local/share/locale/en/LC_MESSAGES/pfSense.pot
new file mode 100644
index 0000000..7c01160
--- /dev/null
+++ b/src/usr/local/share/locale/en/LC_MESSAGES/pfSense.pot
@@ -0,0 +1,29959 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-12-12 12:10-0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: etc/inc/array_intersect_key.inc:37
+msgid "Wrong parameter count for array_intersect_key()"
+msgstr ""
+
+#: etc/inc/array_intersect_key.inc:45
+msgid "array_intersect_key() Argument #"
+msgstr ""
+
+#: etc/inc/array_intersect_key.inc:46
+msgid " is not an array"
+msgstr ""
+
+#: etc/inc/auth.inc:106
+msgid ""
+"Potential DNS Rebind attack detected, see http://en.wikipedia.org/wiki/"
+"DNS_rebinding<br />Try accessing the router by IP address instead of by "
+"hostname."
+msgstr ""
+
+#: etc/inc/auth.inc:121
+msgid "Redirecting..."
+msgstr ""
+
+#: etc/inc/auth.inc:121
+msgid "Redirecting to the dashboard..."
+msgstr ""
+
+#: etc/inc/auth.inc:338 etc/inc/auth.inc:358 etc/inc/auth.inc:429
+#: etc/inc/auth.inc:458 etc/inc/auth.inc:514 etc/inc/auth.inc:648
+#: etc/inc/auth.inc:660
+#, php-format
+msgid "Running: %s"
+msgstr ""
+
+#: etc/inc/auth.inc:695 etc/inc/auth.inc:767 etc/inc/auth.inc:838
+#: etc/inc/auth.inc:1093
+#, php-format
+msgid "ERROR! Could not connect to server %s."
+msgstr ""
+
+#: etc/inc/auth.inc:713
+#, php-format
+msgid "LDAP: Could not lookup CA by reference for host %s."
+msgstr ""
+
+#: etc/inc/auth.inc:825
+msgid ""
+"ERROR! ldap_get_user_ous() backed selected with no LDAP authentication "
+"server defined."
+msgstr ""
+
+#: etc/inc/auth.inc:852
+#, php-format
+msgid "ERROR! ldap_get_user_ous() could not bind anonymously to server %s."
+msgstr ""
+
+#: etc/inc/auth.inc:857
+#, php-format
+msgid "ERROR! ldap_get_user_ous() could not bind to server %s."
+msgstr ""
+
+#: etc/inc/auth.inc:953
+#, php-format
+msgid "ERROR! ldap_get_groups() Could not connect to server %s."
+msgstr ""
+
+#: etc/inc/auth.inc:966
+#, php-format
+msgid "ERROR! ldap_get_groups() could not bind anonymously to server %s."
+msgstr ""
+
+#: etc/inc/auth.inc:971
+#, php-format
+msgid "ERROR! ldap_get_groups() could not bind to server %s."
+msgstr ""
+
+#: etc/inc/auth.inc:1072
+msgid ""
+"ERROR! ldap_backed() called with no LDAP authentication server defined. "
+"Defaulting to local user database. Visit System -> User Manager."
+msgstr ""
+
+#: etc/inc/auth.inc:1075
+msgid "ERROR! ldap_backed() called with no LDAP authentication server defined."
+msgstr ""
+
+#: etc/inc/auth.inc:1109
+#, php-format
+msgid "ERROR! Could not bind to server %s."
+msgstr ""
+
+#: etc/inc/auth.inc:1127
+#, php-format
+msgid "Now Searching for %s in directory."
+msgstr ""
+
+#: etc/inc/auth.inc:1135
+#, php-format
+msgid "Now Searching in server %1$s, container %2$s with filter %3$s."
+msgstr ""
+
+#: etc/inc/auth.inc:1146
+#, php-format
+msgid "Search resulted in error: %s"
+msgstr ""
+
+#: etc/inc/auth.inc:1162
+msgid "ERROR! Either LDAP search failed, or multiple users were found."
+msgstr ""
+
+#: etc/inc/auth.inc:1169
+#, php-format
+msgid "ERROR! Could not login to server %1$s as user %2$s: %3$s"
+msgstr ""
+
+#: etc/inc/auth.inc:1176
+#, php-format
+msgid "Logged in successfully as %1$s via LDAP server %2$s with DN = %3$s."
+msgstr ""
+
+#: etc/inc/auth.inc:1211
+#, php-format
+msgid "Radius start: %s<br />\n"
+msgstr ""
+
+#: etc/inc/auth.inc:1222
+#, php-format
+msgid "Radius send failed: %s<br />\n"
+msgstr ""
+
+#: etc/inc/auth.inc:1228
+#, php-format
+msgid "Radius Auth succeeded"
+msgstr ""
+
+#: etc/inc/auth.inc:1233
+#, php-format
+msgid "Radius Auth rejected"
+msgstr ""
+
+#: etc/inc/auth.inc:1276 etc/inc/auth.inc:1291
+msgid "Local Database"
+msgstr ""
+
+#: etc/inc/auth.inc:1380
+#, php-format
+msgid "Successful login for user '%1$s' from: %2$s"
+msgstr ""
+
+#: etc/inc/auth.inc:1433
+#, php-format
+msgid "Session timed out for user '%1$s' from: %2$s"
+msgstr ""
+
+#: etc/inc/auth.inc:1435
+#, php-format
+msgid "User logged out for user '%1$s' from: %2$s"
+msgstr ""
+
+#: etc/inc/authgui.inc:75
+msgid "No page assigned to this user! Click here to logout."
+msgstr ""
+
+#: etc/inc/authgui.inc:105
+#, php-format
+msgid "Error: %1$s Description: %2$s"
+msgstr ""
+
+#: etc/inc/authgui.inc:168
+msgid "unknown reason"
+msgstr ""
+
+#: etc/inc/authgui.inc:169
+#, php-format
+msgid "Invalid login (%s)."
+msgstr ""
+
+#: etc/inc/authgui.inc:174
+#, php-format
+msgid "This device is currently being maintained by: %s."
+msgstr ""
+
+#: etc/inc/authgui.inc:245 etc/inc/authgui.inc:308
+msgid "Login"
+msgstr ""
+
+#: etc/inc/authgui.inc:273
+msgid ""
+"You are accessing this router by an IP address not configured locally, which "
+"may be forwarded by NAT or other means. <br /><br />If you did not setup "
+"this forwarding, you may be the target of a man-in-the-middle attack."
+msgstr ""
+
+#: etc/inc/authgui.inc:282
+msgid "Username:"
+msgstr ""
+
+#: etc/inc/authgui.inc:289 usr/local/www/diag_backup.php:693
+#: usr/local/www/system_authservers.php:655
+msgid "Password:"
+msgstr ""
+
+#: etc/inc/authgui.inc:296
+msgid "Enter username and password to login."
+msgstr ""
+
+#: etc/inc/authgui.inc:302
+msgid "Your browser must support cookies to login."
+msgstr ""
+
+#: etc/inc/captiveportal.inc:1388
+#, php-format
+msgid "Error: cannot open '%s' in captiveportal_write_elements()%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:59
+msgid "DANGER! WARNING! ACHTUNG!"
+msgstr ""
+
+#: etc/inc/config.console.inc:60
+#, php-format
+msgid "%s requires *AT LEAST* %s RAM to function correctly.%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:61
+#, php-format
+msgid "Only (%s) MB RAM has been detected, with (%s) available to %s.%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:62
+msgid "Press ENTER to continue."
+msgstr ""
+
+#: etc/inc/config.console.inc:84 etc/inc/config.console.inc:484
+msgid "No interfaces found!"
+msgstr ""
+
+#: etc/inc/config.console.inc:182
+msgid "VLAN interfaces:"
+msgstr ""
+
+#: etc/inc/config.console.inc:201
+msgid "Enter the WAN interface name or 'a' for auto-detection:"
+msgstr ""
+
+#: etc/inc/config.console.inc:209 etc/inc/config.console.inc:234
+#: etc/inc/config.console.inc:266 etc/inc/config.console.inc:507
+#, php-format
+msgid "%sInvalid interface name '%s'%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:216
+#, php-format
+msgid ""
+"%sEnter the LAN interface name or 'a' for auto-detection %sNOTE: this "
+"enables full Firewalling/NAT mode.%s(or nothing if finished):%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:251
+#, php-format
+msgid "%sOptional interface %s description found: %s"
+msgstr ""
+
+#: etc/inc/config.console.inc:253
+#, php-format
+msgid ""
+"%sEnter the Optional %s interface name or 'a' for auto-detection%s(or "
+"nothing if finished):%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:260
+msgid "Optional"
+msgstr ""
+
+#: etc/inc/config.console.inc:294
+msgid "The interfaces will be assigned as follows:"
+msgstr ""
+
+#: etc/inc/config.console.inc:408
+#, php-format
+msgid "%sWriting configuration..."
+msgstr ""
+
+#: etc/inc/config.console.inc:410
+#, php-format
+msgid "done.%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:417
+msgid "One moment while we reload the settings..."
+msgstr ""
+
+#: etc/inc/config.console.inc:418
+msgid " done!"
+msgstr ""
+
+#: etc/inc/config.console.inc:438
+#, php-format
+msgid "Detected link-up on interface %s.%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:443
+#, php-format
+msgid "No link-up detected.%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:482
+msgid "VLAN Capable interfaces:"
+msgstr ""
+
+#: etc/inc/config.console.inc:497
+msgid "No VLAN capable interfaces detected."
+msgstr ""
+
+#: etc/inc/config.console.inc:501
+msgid ""
+"Enter the parent interface name for the new VLAN (or nothing if finished):"
+msgstr ""
+
+#: etc/inc/config.console.inc:514
+msgid "Enter the VLAN tag (1-4094):"
+msgstr ""
+
+#: etc/inc/config.console.inc:518
+#, php-format
+msgid "%sInvalid VLAN tag '%s'%s"
+msgstr ""
+
+#: etc/inc/config.inc:96
+msgid "Upgrading m0n0wall configuration to pfSense... "
+msgstr ""
+
+#: etc/inc/config.inc:99
+msgid "ERROR! Could not convert m0n0wall -> pfsense in config.xml"
+msgstr ""
+
+#: etc/inc/config.inc:128
+msgid "CDROM build"
+msgstr ""
+
+#: etc/inc/config.inc:129 etc/inc/config.inc:130
+msgid "CFG:"
+msgstr ""
+
+#: etc/inc/config.inc:131
+msgid "TYPE:"
+msgstr ""
+
+#: etc/inc/config.inc:146 etc/inc/config.inc:161
+#, php-format
+msgid "Found configuration on %s.%s"
+msgstr ""
+
+#: etc/inc/config.inc:175 etc/inc/config.inc:176 etc/inc/config.lib.inc:105
+#: etc/inc/config.lib.inc:106 etc/inc/config.lib.inc:249
+#: etc/inc/config.lib.inc:271 etc/inc/config.lib.inc:272
+msgid "No config.xml found, attempting last known config restore."
+msgstr ""
+
+#: etc/inc/config.inc:179
+msgid "No config.xml or config backups found, resetting to factory defaults."
+msgstr ""
+
+#: etc/inc/config.lib.inc:79
+msgid "Config.xml unlocked."
+msgstr ""
+
+#: etc/inc/config.lib.inc:82
+msgid "Invalid password entered. Please try again."
+msgstr ""
+
+#: etc/inc/config.lib.inc:110 etc/inc/config.lib.inc:140
+#: etc/inc/config.lib.inc:276
+msgid ""
+"Config.xml is corrupted and is 0 bytes. Could not restore a previous backup."
+msgstr ""
+
+#: etc/inc/config.lib.inc:138 etc/inc/config.lib.inc:149
+#: etc/inc/config.lib.inc:548
+msgid "Could not restore config.xml."
+msgstr ""
+
+#: etc/inc/config.lib.inc:214 etc/inc/config.lib.inc:215
+#, php-format
+msgid "%1$s is restoring the configuration %2$s"
+msgstr ""
+
+#: etc/inc/config.lib.inc:237
+msgid "Resetting factory defaults..."
+msgstr ""
+
+#: etc/inc/config.lib.inc:240
+msgid ""
+"No XML configuration file found - using factory defaults.\n"
+"Make sure that the configuration floppy disk with the conf/config.xml\n"
+"file is inserted. If it isn't, your configuration changes will be lost\n"
+"on reboot.\n"
+msgstr ""
+
+#: etc/inc/config.lib.inc:253
+#, php-format
+msgid "XML configuration file not found. %s cannot continue booting."
+msgstr ""
+
+#: etc/inc/config.lib.inc:259
+msgid ""
+"Last known config found and restored. Please double check your "
+"configuration file for accuracy."
+msgstr ""
+
+#: etc/inc/config.lib.inc:263
+msgid "Could not find a usable configuration file! Exiting...."
+msgstr ""
+
+#: etc/inc/config.lib.inc:323
+msgid "Disk is dirty. Running fsck -y"
+msgstr ""
+
+#: etc/inc/config.lib.inc:334
+msgid "File system is dirty. Launching FSCK for /"
+msgstr ""
+
+#: etc/inc/config.lib.inc:388
+#, php-format
+msgid "Start Configuration upgrade at %s, set execution timeout to 15 minutes"
+msgstr ""
+
+#: etc/inc/config.lib.inc:399 etc/inc/config.lib.inc:400
+msgid "Updated bogon update frequency to 3am"
+msgstr ""
+
+#: etc/inc/config.lib.inc:431
+#, php-format
+msgid "Ended Configuration upgrade at %s"
+msgstr ""
+
+#: etc/inc/config.lib.inc:434
+#, php-format
+msgid "Upgraded config version level from %1$s to %2$s"
+msgstr ""
+
+#: etc/inc/config.lib.inc:525
+msgid "WARNING: Config contents could not be save. Could not open file!"
+msgstr ""
+
+#: etc/inc/config.lib.inc:527
+#, php-format
+msgid "Unable to open %s/config.xml for writing in write_config()%s"
+msgstr ""
+
+#: etc/inc/config.lib.inc:633
+msgid "Reverted to"
+msgstr ""
+
+#: etc/inc/config.lib.inc:648
+msgid "Installing configuration..."
+msgstr ""
+
+#: etc/inc/config.lib.inc:650
+msgid "Installing configuration ...."
+msgstr ""
+
+#: etc/inc/config.lib.inc:701
+msgid "XML error: unable to open file"
+msgstr ""
+
+#: etc/inc/config.lib.inc:707
+#, php-format
+msgid "%1$s at line %2$d"
+msgstr ""
+
+#: etc/inc/config.lib.inc:759 etc/inc/config.lib.inc:761
+#, php-format
+msgid "The backup cache file %s is corrupted. Unlinking."
+msgstr ""
+
+#: etc/inc/config.lib.inc:901
+#, php-format
+msgid "%s made unknown change"
+msgstr ""
+
+#: etc/inc/easyrule.inc:118
+msgid "Easy Rule: Blocked from Firewall Log View"
+msgstr ""
+
+#: etc/inc/easyrule.inc:119 etc/inc/easyrule.inc:302
+msgid "Easy Rule"
+msgstr ""
+
+#: etc/inc/easyrule.inc:179 etc/inc/easyrule.inc:187
+msgid "Entry added"
+msgstr ""
+
+#: etc/inc/easyrule.inc:184
+msgid "Hosts blocked from Firewall Log view"
+msgstr ""
+
+#: etc/inc/easyrule.inc:264
+msgid "Easy Rule: Passed from Firewall Log View"
+msgstr ""
+
+#: etc/inc/easyrule.inc:319
+msgid "Tried to block invalid IP:"
+msgstr ""
+
+#: etc/inc/easyrule.inc:323
+msgid "Invalid interface for block rule:"
+msgstr ""
+
+#: etc/inc/easyrule.inc:326
+msgid "Host added successfully"
+msgstr ""
+
+#: etc/inc/easyrule.inc:328
+msgid "Failed to create block rule, alias, or add host."
+msgstr ""
+
+#: etc/inc/easyrule.inc:331
+msgid "Tried to block but had no host IP or interface"
+msgstr ""
+
+#: etc/inc/easyrule.inc:333
+msgid "Unknown block error."
+msgstr ""
+
+#: etc/inc/easyrule.inc:344
+msgid "Invalid interface for pass rule:"
+msgstr ""
+
+#: etc/inc/easyrule.inc:347
+msgid "Invalid protocol for pass rule:"
+msgstr ""
+
+#: etc/inc/easyrule.inc:350
+msgid "Tried to pass invalid source IP:"
+msgstr ""
+
+#: etc/inc/easyrule.inc:353
+msgid "Tried to pass invalid destination IP:"
+msgstr ""
+
+#: etc/inc/easyrule.inc:357
+msgid "Missing destination port:"
+msgstr ""
+
+#: etc/inc/easyrule.inc:360
+msgid "Tried to pass invalid destination port:"
+msgstr ""
+
+#: etc/inc/easyrule.inc:367
+msgid "Successfully added pass rule!"
+msgstr ""
+
+#: etc/inc/easyrule.inc:369
+msgid "Failed to add pass rule."
+msgstr ""
+
+#: etc/inc/easyrule.inc:372
+msgid "Missing parameters for pass rule."
+msgstr ""
+
+#: etc/inc/easyrule.inc:374
+msgid "Unknown pass error."
+msgstr ""
+
+#: etc/inc/filter.inc:62 etc/inc/filter.inc:92
+#: usr/local/www/firewall_nat_1to1_edit.php:364
+#: usr/local/www/firewall_nat_1to1_edit.php:437
+#: usr/local/www/firewall_nat_edit.php:569
+#: usr/local/www/firewall_nat_edit.php:616
+#: usr/local/www/firewall_nat_edit.php:629
+#: usr/local/www/firewall_nat_edit.php:658
+#: usr/local/www/firewall_nat_out_edit.php:540
+#: usr/local/www/firewall_nat_out_edit.php:590
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/firewall_rules_edit.php:1110
+#: usr/local/www/firewall_rules_edit.php:1123
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1152
+#: usr/local/www/firewall_rules_edit.php:1209
+#: usr/local/www/firewall_rules_edit.php:1222
+#: usr/local/www/services_captiveportal_hostname.php:180
+#: usr/local/www/services_captiveportal_hostname.php:187
+msgid "any"
+msgstr ""
+
+#: etc/inc/filter.inc:63 etc/inc/filter.inc:97
+msgid "Echo request"
+msgstr ""
+
+#: etc/inc/filter.inc:64 etc/inc/filter.inc:98
+msgid "Echo reply"
+msgstr ""
+
+#: etc/inc/filter.inc:65 etc/inc/filter.inc:93
+msgid "Destination unreachable"
+msgstr ""
+
+#: etc/inc/filter.inc:66
+msgid "Source quench"
+msgstr ""
+
+#: etc/inc/filter.inc:67 etc/inc/filter.inc:109
+msgid "Redirect"
+msgstr ""
+
+#: etc/inc/filter.inc:68
+msgid "Alternate Host"
+msgstr ""
+
+#: etc/inc/filter.inc:69 etc/inc/filter.inc:106
+msgid "Router advertisement"
+msgstr ""
+
+#: etc/inc/filter.inc:70 etc/inc/filter.inc:105
+msgid "Router solicitation"
+msgstr ""
+
+#: etc/inc/filter.inc:71 etc/inc/filter.inc:95
+msgid "Time exceeded"
+msgstr ""
+
+#: etc/inc/filter.inc:72
+msgid "Invalid IP header"
+msgstr ""
+
+#: etc/inc/filter.inc:73
+msgid "Timestamp"
+msgstr ""
+
+#: etc/inc/filter.inc:74
+msgid "Timestamp reply"
+msgstr ""
+
+#: etc/inc/filter.inc:75
+msgid "Information request"
+msgstr ""
+
+#: etc/inc/filter.inc:76
+msgid "Information reply"
+msgstr ""
+
+#: etc/inc/filter.inc:77
+msgid "Address mask request"
+msgstr ""
+
+#: etc/inc/filter.inc:78
+msgid "Address mask reply"
+msgstr ""
+
+#: etc/inc/filter.inc:79 usr/local/www/diag_dns.php:264
+#: usr/local/www/diag_traceroute.php:47 usr/local/www/diag_traceroute.php:97
+#: usr/local/www/diag_traceroute.php:156 usr/local/www/fbegin.inc:233
+msgid "Traceroute"
+msgstr ""
+
+#: etc/inc/filter.inc:80
+msgid "Datagram conversion error"
+msgstr ""
+
+#: etc/inc/filter.inc:81
+msgid "Mobile host redirect"
+msgstr ""
+
+#: etc/inc/filter.inc:82
+msgid "IPv6 where-are-you"
+msgstr ""
+
+#: etc/inc/filter.inc:83
+msgid "IPv6 I-am-here"
+msgstr ""
+
+#: etc/inc/filter.inc:84
+msgid "Mobile registration request"
+msgstr ""
+
+#: etc/inc/filter.inc:85
+msgid "Mobile registration reply"
+msgstr ""
+
+#: etc/inc/filter.inc:86
+msgid "SKIP"
+msgstr ""
+
+#: etc/inc/filter.inc:87
+msgid "Photuris"
+msgstr ""
+
+#: etc/inc/filter.inc:94
+msgid "Packet too big"
+msgstr ""
+
+#: etc/inc/filter.inc:96
+msgid "Parameter problem"
+msgstr ""
+
+#: etc/inc/filter.inc:99
+msgid "Group membership query"
+msgstr ""
+
+#: etc/inc/filter.inc:100
+msgid "Multicast listener query"
+msgstr ""
+
+#: etc/inc/filter.inc:101
+msgid "Group membership report"
+msgstr ""
+
+#: etc/inc/filter.inc:102
+msgid "Multicast listener report"
+msgstr ""
+
+#: etc/inc/filter.inc:103
+msgid "Group membership termination"
+msgstr ""
+
+#: etc/inc/filter.inc:104
+msgid "Multicast listener done"
+msgstr ""
+
+#: etc/inc/filter.inc:107
+msgid "Neighbor solicitation"
+msgstr ""
+
+#: etc/inc/filter.inc:108
+msgid "Neighbor advertisement"
+msgstr ""
+
+#: etc/inc/filter.inc:110
+msgid "Router renumbering"
+msgstr ""
+
+#: etc/inc/filter.inc:111
+msgid "Who are you request"
+msgstr ""
+
+#: etc/inc/filter.inc:112
+msgid "Who are you reply"
+msgstr ""
+
+#: etc/inc/filter.inc:113
+msgid "FQDN query"
+msgstr ""
+
+#: etc/inc/filter.inc:114
+msgid "FQDN reply"
+msgstr ""
+
+#: etc/inc/filter.inc:115
+msgid "Node information request"
+msgstr ""
+
+#: etc/inc/filter.inc:116
+msgid "Node information reply"
+msgstr ""
+
+#: etc/inc/filter.inc:117
+msgid "mtrace resp"
+msgstr ""
+
+#: etc/inc/filter.inc:118
+msgid "mtrace messages"
+msgstr ""
+
+#: etc/inc/filter.inc:223
+msgid "Initializing"
+msgstr ""
+
+#: etc/inc/filter.inc:235
+msgid "Configuring firewall"
+msgstr ""
+
+#: etc/inc/filter.inc:240
+msgid "Creating aliases"
+msgstr ""
+
+#: etc/inc/filter.inc:245
+msgid "Generating Limiter rules"
+msgstr ""
+
+#: etc/inc/filter.inc:248
+msgid "Generating NAT rules"
+msgstr ""
+
+#: etc/inc/filter.inc:253
+msgid "Generating filter rules"
+msgstr ""
+
+#: etc/inc/filter.inc:259
+msgid "Generating ALTQ queues"
+msgstr ""
+
+#: etc/inc/filter.inc:261
+msgid "Generating Layer7 rules"
+msgstr ""
+
+#: etc/inc/filter.inc:265
+msgid "Loading filter rules"
+msgstr ""
+
+#: etc/inc/filter.inc:272
+msgid "Filter is disabled. Not loading rules."
+msgstr ""
+
+#: etc/inc/filter.inc:274 etc/inc/filter.inc:462 etc/inc/interfaces.inc:190
+#: etc/inc/interfaces.inc:210 etc/inc/interfaces.inc:342
+#: etc/inc/interfaces.inc:399 etc/inc/interfaces.inc:653
+#: etc/inc/interfaces.inc:959 etc/inc/interfaces.inc:987
+#: etc/inc/interfaces.inc:1008 etc/inc/interfaces.inc:1023
+#: etc/inc/interfaces.inc:1922 etc/inc/pkg-utils.inc:365
+#: etc/inc/pkg-utils.inc:651 etc/inc/pkg-utils.inc:676
+#: etc/inc/pkg-utils.inc:754 etc/inc/pkg-utils.inc:769
+#: etc/inc/pkg-utils.inc:803 etc/inc/pkg-utils.inc:832
+#: etc/inc/pkg-utils.inc:839 etc/inc/pkg-utils.inc:856
+#: etc/inc/pkg-utils.inc:872 etc/inc/pkg-utils.inc:888
+#: etc/inc/pkg-utils.inc:995 etc/inc/pkg-utils.inc:1012
+#: etc/inc/pkg-utils.inc:1037 etc/inc/pkg-utils.inc:1082
+#: etc/inc/pkg-utils.inc:1091 etc/inc/pkg-utils.inc:1101
+#: etc/inc/pkg-utils.inc:1116 etc/inc/pkg-utils.inc:1123
+#: etc/inc/pkg-utils.inc:1142 etc/inc/pkg-utils.inc:1468
+#: etc/inc/pkg-utils.inc:1494 etc/inc/pkg-utils.inc:1537 etc/inc/rrd.inc:938
+#: etc/inc/services.inc:1328 etc/inc/services.inc:1686
+#: etc/inc/services.inc:1870 etc/inc/services.inc:1907
+#: etc/inc/services.inc:2118 etc/inc/system.inc:895 etc/inc/system.inc:986
+#: etc/inc/system.inc:1406 etc/inc/system.inc:1769 etc/inc/system.inc:1909
+msgid "done."
+msgstr ""
+
+#: etc/inc/filter.inc:314
+msgid "Setting up logging information"
+msgstr ""
+
+#: etc/inc/filter.inc:319
+msgid "Setting up SCRUB information"
+msgstr ""
+
+#: etc/inc/filter.inc:363
+#, php-format
+msgid "The line in question reads [%1$d]: %2$s"
+msgstr ""
+
+#: etc/inc/filter.inc:369
+msgid "PF was wedged/busy and has been reset."
+msgstr ""
+
+#: etc/inc/filter.inc:377 etc/inc/filter.inc:378
+#, php-format
+msgid "There were error(s) loading the rules: %1$s - %2$s"
+msgstr ""
+
+#: etc/inc/filter.inc:388
+msgid "Starting up layer7 daemon"
+msgstr ""
+
+#: etc/inc/filter.inc:447
+msgid "Processing down interface states"
+msgstr ""
+
+#: etc/inc/filter.inc:451
+msgid "Running plugins"
+msgstr ""
+
+#: etc/inc/filter.inc:455
+msgid "Running plugins (pf)"
+msgstr ""
+
+#: etc/inc/filter.inc:457
+msgid "Plugins completed."
+msgstr ""
+
+#: etc/inc/filter.inc:460 usr/local/www/restart_httpd.php:53
+#: usr/local/www/restart_httpd.php:56 usr/local/www/restart_httpd.php:59
+#: usr/local/www/restart_httpd.php:62
+msgid "Done"
+msgstr ""
+
+#: etc/inc/filter.inc:738
+msgid "Creating gateway group item..."
+msgstr ""
+
+#: etc/inc/filter.inc:773
+#, php-format
+msgid "Setting up route with %1$s on %2$s"
+msgstr ""
+
+#: etc/inc/filter.inc:780
+#, php-format
+msgid ""
+"An error occurred while trying to find the interface got %s . The rule has "
+"not been added."
+msgstr ""
+
+#: etc/inc/filter.inc:1118
+#, php-format
+msgid "Creating reflection NAT rule for %s..."
+msgstr ""
+
+#: etc/inc/filter.inc:1207
+#, php-format
+msgid "Creating reflection rule for %s..."
+msgstr ""
+
+#: etc/inc/filter.inc:1390
+msgid "localhost"
+msgstr ""
+
+#: etc/inc/filter.inc:1398
+msgid "static route"
+msgstr ""
+
+#: etc/inc/filter.inc:1409
+msgid "DHCP alias address"
+msgstr ""
+
+#: etc/inc/filter.inc:1446
+msgid "PPTP server"
+msgstr ""
+
+#: etc/inc/filter.inc:1455
+msgid "PPPoE server"
+msgstr ""
+
+#: etc/inc/filter.inc:1464
+msgid "L2TP server"
+msgstr ""
+
+#: etc/inc/filter.inc:1473
+msgid "OpenVPN server"
+msgstr ""
+
+#: etc/inc/filter.inc:1480
+msgid "OpenVPN client"
+msgstr ""
+
+#: etc/inc/filter.inc:1488
+msgid "IPsec client"
+msgstr ""
+
+#: etc/inc/filter.inc:1521
+msgid "Auto created rule for ISAKMP"
+msgstr ""
+
+#: etc/inc/filter.inc:1531
+msgid "Auto created rule"
+msgstr ""
+
+#: etc/inc/filter.inc:1630
+msgid "Creating 1:1 rules..."
+msgstr ""
+
+#: etc/inc/filter.inc:1786
+#, php-format
+msgid "Creating advanced outbound rule %s"
+msgstr ""
+
+#: etc/inc/filter.inc:1824
+msgid "Creating outbound NAT rules"
+msgstr ""
+
+#: etc/inc/filter.inc:1831
+msgid "Creating automatic outbound rules"
+msgstr ""
+
+#: etc/inc/filter.inc:1861
+msgid "Setting up TFTP helper"
+msgstr ""
+
+#: etc/inc/filter.inc:1893
+#, php-format
+msgid "Creating NAT rule %s"
+msgstr ""
+
+#: etc/inc/filter.inc:2100
+#, php-format
+msgid "Creating filter rule %s ..."
+msgstr ""
+
+#: etc/inc/filter.inc:2432
+#, php-format
+msgid "Setting up pass/block rules %s"
+msgstr ""
+
+#: etc/inc/filter.inc:2441
+#, php-format
+msgid "Could not find IPv6 gateway for interface (%s)."
+msgstr ""
+
+#: etc/inc/filter.inc:2447
+#, php-format
+msgid "Could not find IPv4 gateway for interface (%s)."
+msgstr ""
+
+#: etc/inc/filter.inc:2474
+#, php-format
+msgid "Creating rule %s"
+msgstr ""
+
+#: etc/inc/filter.inc:2725
+msgid "Creating default rules"
+msgstr ""
+
+#: etc/inc/filter.inc:3344
+msgid "Creating IPsec rules..."
+msgstr ""
+
+#: etc/inc/filter.inc:3397
+msgid ""
+"Please use filter_tdr_install_cron() function tdr_install_cron will be "
+"deprecated!"
+msgstr ""
+
+#: etc/inc/filter.inc:3443
+msgid "Installed 15 minute filter reload for Time Based Rules"
+msgstr ""
+
+#: etc/inc/filter.inc:3450
+msgid "Removed 15 minute filter reload for Time Based Rules"
+msgstr ""
+
+#: etc/inc/filter.inc:3766
+#, php-format
+msgid "Checking for %1$s PF hooks in package %2$s"
+msgstr ""
+
+#: etc/inc/filter.inc:3772
+#, php-format
+msgid "Processing early %1$s rules for package %2$s"
+msgstr ""
+
+#: etc/inc/filter.inc:3777
+#, php-format
+msgid "There was an error while parsing the package filter rules for %s."
+msgstr ""
+
+#: etc/inc/filter_log.inc:251
+#, php-format
+msgid ""
+"There was a error parsing rule number: %s. Please report to mailing list "
+"or forum."
+msgstr ""
+
+#: etc/inc/filter_log.inc:260
+#, php-format
+msgid ""
+"There was a error parsing rule: %s. Please report to mailing list or forum."
+msgstr ""
+
+#: etc/inc/filter_log.inc:273
+#, php-format
+msgid "Service %1$s/%2$s: %3$s"
+msgstr ""
+
+#: etc/inc/functions.inc:94
+msgid "Acknowledge All Notices"
+msgstr ""
+
+#: etc/inc/functions.inc:95
+msgid "Click to Acknowledge"
+msgstr ""
+
+#: etc/inc/functions.inc:113
+msgid "unread notice"
+msgstr ""
+
+#: etc/inc/functions.inc:115
+msgid "unread notices"
+msgstr ""
+
+#: etc/inc/gwlb.inc:939
+#, php-format
+msgid "Updating gateway group gateway for %1$s - new gateway is %2$s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:51
+msgid "interfaces_bring_up() was called but no variable defined."
+msgstr ""
+
+#: etc/inc/interfaces.inc:186
+msgid "Configuring loopback interface..."
+msgstr ""
+
+#: etc/inc/interfaces.inc:197
+msgid "Configuring VLAN interfaces..."
+msgstr ""
+
+#: etc/inc/interfaces.inc:217
+msgid "VLAN: called with wrong options. Problems with config!"
+msgstr ""
+
+#: etc/inc/interfaces.inc:225
+msgid "interface_vlan_configure called with if undefined."
+msgstr ""
+
+#: etc/inc/interfaces.inc:259 etc/inc/interfaces.inc:349
+#, php-format
+msgid "QinQ compat VLAN: called with wrong options. Problems with config!%s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:266
+#, php-format
+msgid "interface_qinq_configure called with if undefined.%s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:271
+#, php-format
+msgid "interface_qinq_configure called with invalid if.%s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:334
+msgid "Configuring QinQ interfaces..."
+msgstr ""
+
+#: etc/inc/interfaces.inc:357
+#, php-format
+msgid "interface_qinq2_configure called with if undefined.%s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:378
+msgid "Creating wireless clone interfaces..."
+msgstr ""
+
+#: etc/inc/interfaces.inc:446
+#, php-format
+msgid "No members found on %s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:502
+msgid "realif not defined in interfaces bridge - up"
+msgstr ""
+
+#: etc/inc/interfaces.inc:615
+msgid "bridgeif not defined -- could not bring interface up"
+msgstr ""
+
+#: etc/inc/interfaces.inc:639
+msgid "Configuring LAGG interfaces..."
+msgstr ""
+
+#: etc/inc/interfaces.inc:778
+msgid "Could not bring greif up -- variable not defined."
+msgstr ""
+
+#: etc/inc/interfaces.inc:847
+msgid ""
+"could not bring realif up -- variable not defined -- "
+"interface_gif_configure()"
+msgstr ""
+
+#: etc/inc/interfaces.inc:872
+msgid "could not bring gifif up -- variable not defined"
+msgstr ""
+
+#: etc/inc/interfaces.inc:953 etc/inc/interfaces.inc:980
+#: etc/inc/interfaces.inc:1001 etc/inc/interfaces.inc:1016
+#, php-format
+msgid "Configuring %s interface..."
+msgstr ""
+
+#: etc/inc/interfaces.inc:956 etc/inc/interfaces.inc:982
+#: etc/inc/interfaces.inc:1003 etc/inc/interfaces.inc:1018
+#, php-format
+msgid "Configuring %s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:1103
+msgid "Wrong parameters used during interface_bring_down"
+msgstr ""
+
+#: etc/inc/interfaces.inc:1440
+#, php-format
+msgid "Can't find PPP config for %s in interface_ppps_configure()."
+msgstr ""
+
+#: etc/inc/interfaces.inc:1499
+#, php-format
+msgid ""
+"Could not get a PPTP/L2TP Remote IP address from %1$s for %2$s in "
+"interfaces_ppps_configure."
+msgstr ""
+
+#: etc/inc/interfaces.inc:1506
+#, php-format
+msgid ""
+"Device %s does not exist. PPP link cannot start without the modem device."
+msgstr ""
+
+#: etc/inc/interfaces.inc:1511
+#, php-format
+msgid "Unkown %s configured as ppp interface."
+msgstr ""
+
+#: etc/inc/interfaces.inc:1783
+#, php-format
+msgid "Error: cannot open mpd_%s.conf in interface_ppps_configure().%s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:1865
+msgid "Configuring CARP settings..."
+msgstr ""
+
+#: etc/inc/interfaces.inc:2120
+#, php-format
+msgid ""
+"Interface specified for the virtual IP address %s does not exist. Skipping "
+"this VIP."
+msgstr ""
+
+#: etc/inc/interfaces.inc:2128
+#, php-format
+msgid ""
+"Interface does not have required IP address in the subnet of virtual IP "
+"address %s. Skipping this VIP."
+msgstr ""
+
+#: etc/inc/interfaces.inc:2135
+#, php-format
+msgid ""
+"Interface does not have required IPv6 address in the subnet of virtual IPv6 "
+"address %s. Skipping this VIP."
+msgstr ""
+
+#: etc/inc/interfaces.inc:2191
+#, php-format
+msgid "Interface %s changed to hostap mode"
+msgstr ""
+
+#: etc/inc/interfaces.inc:2195
+#, php-format
+msgid "Interface %s changed to adhoc mode"
+msgstr ""
+
+#: etc/inc/interfaces.inc:2199
+#, php-format
+msgid "Interface %s changed to infrastructure mode"
+msgstr ""
+
+#: etc/inc/interfaces.inc:2211
+#, php-format
+msgid "Cloning new wireless interface %s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:2216
+#, php-format
+msgid "Failed to clone interface %1$s with error code %2$s, output %3$s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:2914
+msgid "Generating new MAC address."
+msgstr ""
+
+#: etc/inc/interfaces.inc:2920
+#, php-format
+msgid ""
+"The INVALID MAC address (ff:ff:ff:ff:ff:ff) on interface %1$s has been "
+"automatically replaced with %2$s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:3741
+#, php-format
+msgid ""
+"Error: cannot open dhclient_%s.conf in interface_dhcp_configure() for "
+"writing.%s"
+msgstr ""
+
+#: etc/inc/interfaces.inc:3754
+#, php-format
+msgid "Invalid interface \"%s\" in interface_dhcp_configure()"
+msgstr ""
+
+#: etc/inc/interfaces.inc:3806
+#, php-format
+msgid "Could not bring up %s interface in interface_dhcp_configure()"
+msgstr ""
+
+#: etc/inc/ipsec.inc:45
+msgid "My IP address"
+msgstr ""
+
+#: etc/inc/ipsec.inc:46 etc/inc/ipsec.inc:55 usr/local/www/diag_arp.php:314
+#: usr/local/www/diag_logs_vpn.php:178
+#: usr/local/www/services_captiveportal.php:726
+#: usr/local/www/services_captiveportal.php:747
+#: usr/local/www/services_captiveportal.php:769
+#: usr/local/www/services_captiveportal.php:788
+#: usr/local/www/services_captiveportal_ip.php:119
+#: usr/local/www/services_captiveportal_ip_edit.php:190
+#: usr/local/www/services_dhcp.php:1248
+#: usr/local/www/services_dhcp_edit.php:394
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:76
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+#: usr/local/www/services_dnsmasq_edit.php:85
+#: usr/local/www/services_dnsmasq_edit.php:230
+#: usr/local/www/services_unbound_domainoverride_edit.php:71
+#: usr/local/www/services_unbound_domainoverride_edit.php:137
+#: usr/local/www/services_unbound_host_edit.php:87
+#: usr/local/www/services_unbound_host_edit.php:232
+#: usr/local/www/status_captiveportal.php:157
+#: usr/local/www/status_dhcp_leases.php:331
+#: usr/local/www/system_advanced_network.php:233
+#: usr/local/www/vpn_ipsec_phase2.php:823 usr/local/www/vpn_l2tp_users.php:104
+#: usr/local/www/vpn_l2tp_users_edit.php:174
+#: usr/local/www/vpn_pptp_users.php:101
+#: usr/local/www/vpn_pptp_users_edit.php:165
+msgid "IP address"
+msgstr ""
+
+#: etc/inc/ipsec.inc:47 etc/inc/ipsec.inc:56
+#: usr/local/www/system_camanager.php:503
+#: usr/local/www/system_certmanager.php:748
+#: usr/local/www/system_certmanager.php:900
+msgid "Distinguished name"
+msgstr ""
+
+#: etc/inc/ipsec.inc:48 etc/inc/ipsec.inc:57
+msgid "User distinguished name"
+msgstr ""
+
+#: etc/inc/ipsec.inc:49 etc/inc/ipsec.inc:58
+msgid "ASN.1 distinguished Name"
+msgstr ""
+
+#: etc/inc/ipsec.inc:50 etc/inc/ipsec.inc:59
+msgid "KeyID tag"
+msgstr ""
+
+#: etc/inc/ipsec.inc:51 usr/local/www/fbegin.inc:147
+#: usr/local/www/services_dhcp.php:1041
+#: usr/local/www/services_dhcp_edit.php:496
+#: usr/local/www/services_dhcpv6.php:697
+msgid "Dynamic DNS"
+msgstr ""
+
+#: etc/inc/ipsec.inc:54
+msgid "Peer IP address"
+msgstr ""
+
+#: etc/inc/ipsec.inc:302 usr/local/www/vpn_ipsec.php:343
+#: usr/local/www/vpn_ipsec_phase1.php:398
+#: usr/local/www/vpn_ipsec_phase2.php:360
+msgid "Mobile Client"
+msgstr ""
+
+#: etc/inc/ipsec.inc:305 usr/local/www/diag_system_pftop.php:153
+#: usr/local/www/firewall_nat_edit.php:818
+#: usr/local/www/firewall_nat_edit.php:849 usr/local/www/interfaces.php:1411
+#: usr/local/www/interfaces.php:1412 usr/local/www/interfaces.php:1798
+#: usr/local/www/interfaces.php:1904
+#: usr/local/www/interfaces_bridge_edit.php:449
+#: usr/local/www/system_advanced_misc.php:438
+#: usr/local/www/vpn_ipsec_phase2.php:629
+msgid "None"
+msgstr ""
+
+#: etc/inc/ipsec.inc:598
+msgid ""
+"Unable to find IPsec daemon leases file. Could not display mobile user stats!"
+msgstr ""
+
+#: etc/inc/meta.inc:68
+#, php-format
+msgid "list_phpfiles: unable to examine path %s\n"
+msgstr ""
+
+#: etc/inc/meta.inc:99
+#, php-format
+msgid "unable to read %s\n"
+msgstr ""
+
+#: etc/inc/meta.inc:132
+#, php-format
+msgid "error: tag mismatch ( %1$s != %2$s ) in '%3$s'%4$s"
+msgstr ""
+
+#: etc/inc/meta.inc:143
+#, php-format
+msgid "warning: tag %1$s has no data in '%2$s'%3$s"
+msgstr ""
+
+#: etc/inc/meta.inc:163
+#, php-format
+msgid "warning: tag %1$s has malformed data in '%2$s'%3$s"
+msgstr ""
+
+#: etc/inc/meta.inc:185
+#, php-format
+msgid "warning: tag %1$s has invalid data in '%2$s'%3$s"
+msgstr ""
+
+#: etc/inc/notices.inc:76
+#, php-format
+msgid "Could not open %s for writing"
+msgstr ""
+
+#: etc/inc/notices.inc:337
+#, php-format
+msgid "Message sent to %s OK"
+msgstr ""
+
+#: etc/inc/notices.inc:340 etc/inc/notices.inc:341
+#, php-format
+msgid "Could not send the message to %1$s -- Error: %2$s"
+msgstr ""
+
+#: etc/inc/openvpn.inc:101 etc/inc/openvpn.inc:109
+msgid "Peer to Peer ( SSL/TLS )"
+msgstr ""
+
+#: etc/inc/openvpn.inc:102 etc/inc/openvpn.inc:110
+msgid "Peer to Peer ( Shared Key )"
+msgstr ""
+
+#: etc/inc/openvpn.inc:103
+msgid "Remote Access ( SSL/TLS )"
+msgstr ""
+
+#: etc/inc/openvpn.inc:104
+msgid "Remote Access ( User Auth )"
+msgstr ""
+
+#: etc/inc/openvpn.inc:105
+msgid "Remote Access ( SSL/TLS + User Auth )"
+msgstr ""
+
+#: etc/inc/openvpn.inc:114
+msgid "No Preference"
+msgstr ""
+
+#: etc/inc/openvpn.inc:115
+msgid "Disabled - No Compression"
+msgstr ""
+
+#: etc/inc/openvpn.inc:116
+msgid "Enabled with Adaptive Compression"
+msgstr ""
+
+#: etc/inc/openvpn.inc:117
+msgid "Enabled without Adaptive Compression"
+msgstr ""
+
+#: etc/inc/openvpn.inc:223
+msgid "None (No Encryption)"
+msgstr ""
+
+#: etc/inc/openvpn.inc:237
+msgid "None (No Authentication)"
+msgstr ""
+
+#: etc/inc/openvpn.inc:280
+#, php-format
+msgid "The field '%s' must contain a valid IP address or domain name."
+msgstr ""
+
+#: etc/inc/openvpn.inc:287
+#, php-format
+msgid "The field '%s' must contain a valid port, ranging from 0 to 65535."
+msgstr ""
+
+#: etc/inc/openvpn.inc:299
+#, php-format
+msgid "The field '%s' must contain a single valid %s CIDR range."
+msgstr ""
+
+#: etc/inc/openvpn.inc:311
+#, php-format
+msgid ""
+"The field '%s' must contain only valid %s CIDR range(s) separated by commas."
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:380
+msgid "MASTER"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:382
+msgid "BACKUP"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:384
+msgid "INIT"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:452
+msgid "After synch increase advertising skew"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:497
+msgid "Error creating socket!"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:498
+#, php-format
+msgid "Error code is '%1$s' - %2$s"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:503
+#, php-format
+msgid "setsockopt() failed, error: %s"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:506
+#, php-format
+msgid "Magic Packet sent (%1$s) to {%2$s} MAC=%3$s"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:568 etc/inc/pfsense-utils.inc:590
+#, php-format
+msgid "Restored %s of config file (maybe from CARP partner)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:751
+#, php-format
+msgid "XMLRPC communication error: %s"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:754
+#, php-format
+msgid "XMLRPC request failed with error %1$s: %2$s"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:854
+msgid "reload_interfaces_sync() is starting."
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:862
+msgid "Enabling system routing"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:865
+msgid "Cleaning up Interfaces"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1213
+msgid "No history data found!"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1336
+msgid "device not present! Is the modem attached to the system?"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1403
+msgid "running"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1404 usr/local/www/graph.php:207
+msgid "up"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1447
+msgid "blocking"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1447
+msgid "check for ethernet loops"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1450
+msgid "learning"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1453
+msgid "forwarding"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1586
+#, php-format
+msgid "DNSCACHE: Found old IP %1$s and new IP %2$s"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1960
+msgid ""
+"Alias archive is a .zip file which cannot be decompressed because utility is "
+"missing!"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1992
+msgid ""
+"Alias archive is a .tar/tgz file which cannot be decompressed because "
+"utility is missing!"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2659 etc/inc/pfsense-utils.inc:2701
+msgid "English"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2660 etc/inc/pfsense-utils.inc:2713
+msgid "Portuguese (Brazil)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2661 etc/inc/pfsense-utils.inc:2718
+msgid "Turkish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2695
+msgid "Albanian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2696
+msgid "Bulgarian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2697
+msgid "Chinese (Simplified)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2698
+msgid "Chinese (Traditional)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2699
+msgid "Dutch"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2700
+msgid "Danish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2702
+msgid "Finnish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2703
+msgid "French"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2704
+msgid "German"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2705
+msgid "Greek"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2706
+msgid "Hungarian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2707
+msgid "Italian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2708
+msgid "Japanese"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2709
+msgid "Korean"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2710
+msgid "Latvian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2711
+msgid "Norwegian (Bokmal)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2712
+msgid "Polish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2714
+msgid "Portuguese (Portugal)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2715
+msgid "Romanian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2716
+msgid "Russian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2717
+msgid "Slovenian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2719
+msgid "Spanish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2720
+msgid "Swedish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2721
+msgid "Slovak"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2722
+msgid "Czech"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:219
+msgid "Resyncing configuration for all packages."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:239
+msgid "Syncing packages:"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:281
+#, php-format
+msgid ""
+"The %1$s package is missing required dependencies and must be reinstalled. "
+"%2$s"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:306 etc/inc/pkg-utils.inc:432
+#, php-format
+msgid ""
+"The %s package is missing required dependencies and must be reinstalled."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:399
+#, php-format
+msgid ""
+"The %s package is missing its configuration file and must be reinstalled."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:628 etc/inc/pkg-utils.inc:629
+#, php-format
+msgid "Package %s is not supported on this version."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:636 usr/local/www/pkg_mgr_install.php:170
+msgid "Beginning package installation."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:637 etc/inc/pkg-utils.inc:638
+#, php-format
+msgid "Beginning package installation for %s ."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:646
+msgid "Saving updated package information..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:650
+#, php-format
+msgid "Installed %s package."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:654
+#, php-format
+msgid "Overwrote previous installation of %s."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:655
+msgid "overwrite!"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:667
+#, php-format
+msgid "Failed to install package: %s."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:668
+msgid "Failed to install package."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:672
+msgid "Writing configuration... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:675
+#, php-format
+msgid "Successfully installed package: %s."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:709
+#, php-format
+msgid "The %s package is not installed.%sInstallation aborted."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:724
+msgid "Installing"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:724
+msgid "and its dependencies."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:725
+msgid "Downloading"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:725
+msgid "and its dependencies... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:737
+msgid "Package WAS NOT installed properly."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:751 etc/inc/pkg-utils.inc:1491
+msgid "Loading package configuration... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:756
+msgid "Configuring package components...\n"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:762 etc/inc/pkg-utils.inc:1077
+msgid "System files... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:781 etc/inc/pkg-utils.inc:1053
+msgid "Loading package instructions..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:796
+msgid "Custom commands..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:800
+msgid "Executing custom_php_global_functions()..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:807
+msgid "Executing custom_php_install_command()..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:836
+msgid "Executing custom_php_resync_config_command()..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:845 etc/inc/pkg-utils.inc:1000
+msgid "Menu items... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:861
+msgid "Integrated Tab items... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:877 etc/inc/pkg-utils.inc:1017
+msgid "Services... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:892
+msgid "Loading package configuration... failed!"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:892
+msgid "Installation aborted."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:894
+msgid "Unable to load package configuration. Installation aborted."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:939
+#, php-format
+msgid "Starting package deletion for %s..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:959
+#, php-format
+msgid "The %s package is not installed.%sDeletion aborted."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:970
+#, php-format
+msgid "Removing %s package... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:971
+#, php-format
+msgid "Removing %s components..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:983
+msgid "Tabs items... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1087
+msgid "Deinstall commands... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1097
+msgid "Removing package instructions..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1099
+#, php-format
+msgid "Remove '%s'"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1106
+msgid "Auxiliary files... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1120
+msgid "Package XML... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1139
+msgid "Configuration... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1222
+msgid "One moment please, reinstalling packages...\n"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1223
+msgid " >>> Trying to fetch package info..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1224
+msgid "Attempting to reinstall all packages"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1230
+#, php-format
+msgid ""
+" >>> Unable to communicate with %1$s. Please verify DNS and interface "
+"configuration, and that %2$s has functional Internet connectivity."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1232
+msgid "Cannot reinstall packages: "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1241
+msgid "List of packages to reinstall: "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1248
+msgid "Uninstalling package"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1250
+msgid "Finished uninstalling package"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1251
+msgid "Reinstalling package"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1253
+msgid "Finished installing package"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1256
+msgid "Finished reinstalling all packages."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1432
+msgid "Package Manager Settings"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1451
+msgid "Downloading package configuration file... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1453
+msgid "Downloading package configuration file..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1457
+msgid ""
+"ERROR! Unable to fetch package configuration file. Aborting installation."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1459
+msgid ""
+"ERROR! Unable to fetch package configuration file. Aborting package "
+"installation."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1461
+msgid ""
+"failed!\n"
+"\n"
+"Installation aborted.\n"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1498
+msgid "Additional files... "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1524
+msgid "Extracting tarball to -C for "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1530
+#, php-format
+msgid "Changing file mode to %1$s for %2$s%3$s%4$s"
+msgstr ""
+
+#: etc/inc/priv/user.priv.inc:6
+msgid "User - Services - Captive portal login"
+msgstr ""
+
+#: etc/inc/priv/user.priv.inc:7
+msgid "Indicates whether the user is able to login on the captive portal."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:10
+msgid "WebCfg - All pages"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:11
+msgid "Allow access to all pages"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:16
+msgid "WebCfg - Status: CARP page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:17
+msgid "Allow access to the 'Status: CARP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:22
+msgid "WebCfg - Crash reporter"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:23
+msgid "Uploads crash reports to pfSense and or deletes crash reports."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:28
+msgid "WebCfg - Diagnostics: ARP Table page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:29
+msgid "Allow access to the 'Diagnostics: ARP Table' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:34
+msgid "WebCfg - Diagnostics: Authentication page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:35
+msgid "Allow access to the 'Diagnostics: Authentication' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:40
+msgid "WebCfg - Diagnostics: Backup/restore page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:41
+msgid "Allow access to the 'Diagnostics: Backup/restore' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:46
+msgid "WebCfg - Diagnostics: Configuration History page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:47
+msgid "Allow access to the 'Diagnostics: Configuration History' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:52
+msgid "WebCfg - Diagnostics: Factory defaults page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:53
+msgid "Allow access to the 'Diagnostics: Factory defaults' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:58
+msgid "Webcfg - Diagnostics: NDP Table page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:59
+msgid "Allow access to the 'Diagnostics: NDP Table' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:64
+msgid "Webcfg - Diagnostics: Restore full backup"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:65
+msgid "Allow access to the 'Diagnostics: Restore Full Backup' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:70
+msgid "WebCfg - Diagnostics: Show States page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:71
+msgid "Allow access to the 'Diagnostics: Show States' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:76
+msgid "WebCfg - Diagnostics: Sockets page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:77
+msgid "Allow access to the 'Diagnostics: Sockets' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:82
+msgid "Webcfg - Diagnostics: Test Port"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:83
+msgid "Allow access to the 'Diagnostics: Test Port' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:88
+msgid "WebCfg - Status: IPsec page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:89
+msgid "Allow access to the 'Status: IPsec' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:94
+msgid "WebCfg - Status: IPsec: Leasespage"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:95
+msgid "Allow access to the 'Status: IPsec: Leases' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:100
+msgid "WebCfg - Status: IPsec: SAD page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:101
+msgid "Allow access to the 'Status: IPsec: SAD' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:106
+msgid "WebCfg - Status: IPsec: SPD page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:107
+msgid "Allow access to the 'Status: IPsec: SPD' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:112
+msgid "Webcfg - Status: NTP page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:113
+msgid "Allow access to the 'Status: NTP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:118
+msgid "WebCfg - Diag IPsec XML page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:119
+msgid "Allow access to the 'Diag IPsec XML' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:124
+msgid "WebCfg - Diagnostics: Logs: System page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:125
+msgid "Allow access to the 'Diagnostics: Logs: System' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:130
+msgid "WebCfg - Status: System logs: Portal Auth page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:131
+msgid "Allow access to the 'Status: System logs: Portal Auth' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:136
+msgid "WebCfg - Diagnostics: Logs: DHCP page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:137
+msgid "Allow access to the 'Diagnostics: Logs: DHCP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:142
+msgid "WebCfg - Diagnostics: Logs: Firewall page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:143
+msgid "Allow access to the 'Diagnostics: Logs: Firewall' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:148
+msgid "WebCfg - Diagnostics: Logs: Gateways page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:149
+msgid "Allow access to the 'Diagnostics: Logs: System: Gateways' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:154
+msgid "WebCfg - Diagnostics: Logs: Resolver page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:155
+msgid "Allow access to the 'Diagnostics: Logs: System: Resolver' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:160
+msgid "WebCfg - Hidden: No longer included page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:161
+msgid "Allow access to the 'Hidden: No longer included' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:166 etc/inc/priv.defs.inc:184
+msgid "WebCfg - Status: System logs: IPsec VPN page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:167 etc/inc/priv.defs.inc:185
+msgid "Allow access to the 'Status: System logs: IPsec VPN' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:172
+msgid "WebCfg - Status: System logs: NTP page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:173
+msgid "Allow access to the 'Status: System logs: NTP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:178
+msgid "WebCfg - Status: System logs: OpenVPN page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:179
+msgid "Allow access to the 'Status: System logs: OpenVPN' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:190
+msgid "WebCfg - Status: System logs: Load Balancer page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:191
+msgid "Allow access to the 'Status: System logs: Load Balancer' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:196
+msgid "Webcfg - Status: System logs: Routing page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:197
+msgid "Allow access to the 'Status: System logs: System: Routing' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:202
+msgid "Webcfg - Status: System logs: Wireless page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:203
+msgid "Allow access to the 'Status: System logs: System: Wireless' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:208
+msgid "WebCfg - Diagnostics: Logs: Settings page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:209
+msgid "Allow access to the 'Diagnostics: Logs: Settings' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:214
+msgid "WebCfg - Diagnostics: Logs: VPN page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:215
+msgid "Allow access to the 'Diagnostics: Logs: VPN' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:220
+msgid "WebCfg - Diagnostics: NanoBSD"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:221
+msgid "Allow access to the 'Diagnostics: NanoBSD' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:226
+msgid "WebCfg - Diagnostics: Packet Capture page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:227
+msgid "Allow access to the 'Diagnostics: Packet Capture' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:232
+msgid "WebCfg - Diagnostics: Patterns page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:233
+msgid "Allow access to the 'Diagnostics: Patterns' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:238 usr/local/www/diag_limiter_info.php:45
+msgid "Diagnostics: Limiter Info"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:239
+msgid "Allows access to the 'Diagnostics: Limiter Info' page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:244 usr/local/www/diag_pf_info.php:45
+msgid "Diagnostics: pfInfo"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:245
+msgid "Allows access to the 'Diagnostics: pfInfo' page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:250
+msgid "WebCfg - Diagnostics: System Activity"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:251
+msgid "Allows access to the 'Diagnostics: System Activity' page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:256 usr/local/www/diag_system_pftop.php:44
+msgid "Diagnostics: pfTop"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:257
+msgid "Allows access to the 'Diagnostics: pfTop' page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:262
+msgid "WebCfg - Diagnostics: Ping page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:263
+msgid "Allow access to the 'Diagnostics: Ping' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:268
+msgid "WebCfg - Status: Package logs page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:269
+msgid "Allow access to the 'Status: Package logs' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:274
+msgid "WebCfg - Diagnostics: Reset state page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:275
+msgid "Allow access to the 'Diagnostics: Reset state' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:280
+msgid "WebCfg - Diagnostics: Routing tables page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:281
+msgid "Allow access to the 'Diagnostics: Routing tables' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:286
+msgid "WebCfg - Diagnostics: States Summary page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:287
+msgid "Allow access to the 'Diagnostics: States Summary' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:292
+msgid "WebCfg - Diagnostics: PF Table IP addresses"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:293
+msgid "Allow access to the 'Diagnostics: Tables' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:298
+msgid "WebCfg - Diagnostics: Traceroute page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:299
+msgid "Allow access to the 'Diagnostics: Traceroute' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:304
+msgid "WebCfg - Diagnostics: Edit FIle"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:305
+msgid "Allow access to the 'Diagnostics: Edit File' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:312
+msgid "WebCfg - Diagnostics: Command page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:313
+msgid "Allow access to the 'Diagnostics: Command' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:318
+msgid "WebCfg - Firewall: Aliases page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:319
+msgid "Allow access to the 'Firewall: Aliases' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:324
+msgid "WebCfg - Firewall: Alias: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:325
+msgid "Allow access to the 'Firewall: Alias: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:330
+msgid "WebCfg - Firewall: Alias: Import page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:331
+msgid "Allow access to the 'Firewall: Alias: Import' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:336
+msgid "Webcfg - Firewall: NAT: NPT page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:337
+msgid "Allow access to the 'Firewall: NAT: NPT' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:342
+msgid "Webcfg - Firewall: NAT: NPt: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:343
+msgid "Allow access to the 'Firewall: NAT: NPt: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:348
+msgid "WebCfg - Firewall: NAT: Port Forward page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:349
+msgid "Allow access to the 'Firewall: NAT: Port Forward' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:354
+msgid "WebCfg - Firewall: NAT: 1:1 page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:355
+msgid "Allow access to the 'Firewall: NAT: 1:1' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:360
+msgid "WebCfg - Firewall: NAT: 1:1: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:361
+msgid "Allow access to the 'Firewall: NAT: 1:1: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:366
+msgid "WebCfg - Firewall: NAT: Port Forward: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:367
+msgid "Allow access to the 'Firewall: NAT: Port Forward: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:372
+msgid "WebCfg - Firewall: NAT: Outbound page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:373
+msgid "Allow access to the 'Firewall: NAT: Outbound' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:378
+msgid "WebCfg - Firewall: NAT: Outbound: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:379
+msgid "Allow access to the 'Firewall: NAT: Outbound: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:384
+msgid "WebCfg - Firewall: Rules page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:385
+msgid "Allow access to the 'Firewall: Rules' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:390
+msgid "WebCfg - Firewall: Rules: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:391
+msgid "Allow access to the 'Firewall: Rules: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:396
+msgid "WebCfg - Firewall: Schedules page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:397
+msgid "Allow access to the 'Firewall: Schedules' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:402
+msgid "WebCfg - Firewall: Schedules: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:403
+msgid "Allow access to the 'Firewall: Schedules: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:408
+msgid "WebCfg - Firewall: Traffic Shaper page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:409
+msgid "Allow access to the 'Firewall: Traffic Shaper' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:414
+msgid "WebCfg - Firewall: Traffic Shaper: Layer7 page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:415
+msgid "Allow access to the 'Firewall: Traffic Shaper: Layer7' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:420
+msgid "WebCfg - Firewall: Traffic Shaper: Queues page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:421
+msgid "Allow access to the 'Firewall: Traffic Shaper: Queues' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:426
+msgid "WebCfg - Firewall: Traffic Shaper: Limiter page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:427
+msgid "Allow access to the 'Firewall: Traffic Shaper: Limiter' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:432
+msgid "WebCfg - Firewall: Traffic Shaper: Wizard page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:433
+msgid "Allow access to the 'Firewall: Traffic Shaper: Wizard' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:438
+msgid "WebCfg - Firewall: Virtual IP Addresses page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:439
+msgid "Allow access to the 'Firewall: Virtual IP Addresses' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:444
+msgid "WebCfg - Firewall: Virtual IP Address: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:445
+msgid "Allow access to the 'Firewall: Virtual IP Address: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:450
+msgid "WebCfg - AJAX: Get Service Providers"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:451
+msgid "Allow access to the 'AJAX: Service Providers' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:456
+msgid "WebCfg - AJAX: Get Stats"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:457
+msgid "Allow access to the 'AJAX: Get Stats' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:462
+msgid "WebCfg - Diagnostics: Interface Traffic page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:463
+msgid "Allow access to the 'Diagnostics: Interface Traffic' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:468 etc/inc/priv.defs.inc:972
+msgid "WebCfg - Diagnostics: CPU Utilization page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:469 etc/inc/priv.defs.inc:973
+msgid "Allow access to the 'Diagnostics: CPU Utilization' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:474
+msgid "WebCfg - Diagnostics: Halt system page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:475
+msgid "Allow access to the 'Diagnostics: Halt system' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:480
+msgid "WebCfg - Required for javascript page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:481
+msgid "Allow access to the 'Required for javascript' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:486
+msgid "WebCfg - XMLRPC Interface Stats page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:487
+msgid "Allow access to the 'XMLRPC Interface Stats' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:492
+msgid "WebCfg - System: Login / Logout page / Dashboard"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:493
+msgid "Allow access to the 'System: Login / Logout' page and Dashboard."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:498
+msgid "WebCfg - Interfaces: WAN page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:499
+msgid "Allow access to the 'Interfaces' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:504
+msgid "WebCfg - Interfaces: Assign network ports page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:505
+msgid "Allow access to the 'Interfaces: Assign network ports' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:510
+msgid "WebCfg - Interfaces: Bridge page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:511
+msgid "Allow access to the 'Interfaces: Bridge' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:516
+msgid "WebCfg - Interfaces: Bridge edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:517
+msgid "Allow access to the 'Interfaces: Bridge : Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:522
+msgid "WebCfg - Interfaces: GIF page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:523
+msgid "Allow access to the 'Interfaces: GIF' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:528
+msgid "WebCfg - Interfaces: GIF: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:529
+msgid "Allow access to the 'Interfaces: GIF: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:534
+msgid "WebCfg - Interfaces: GRE page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:535
+msgid "Allow access to the 'Interfaces: GRE' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:540
+msgid "WebCfg - Interfaces: GRE: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:541
+msgid "Allow access to the 'Interfaces: GRE: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:546
+msgid "WebCfg - Interfaces: Groups page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:547
+msgid "Create interface groups"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:552
+msgid "Interfaces: Groups: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:553
+msgid "Allow access to the 'Interfaces: Groups: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:558
+msgid "WebCfg - Interfaces: LAGG: page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:559
+msgid "Edit Interface LAGG"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:564
+msgid "Interfaces: LAGG: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:565
+msgid "Allow access to the 'Interfaces: LAGG: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:570
+msgid "WebCfg - Interfaces: ppps page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:571
+msgid "Allow access to the 'Interfaces: ppps' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:576
+msgid "WebCfg - Interfaces: PPPs: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:577
+msgid "Allow access to the 'Interfaces: PPPs: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:582
+msgid "WebCfg - Interfaces: QinQ page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:583
+msgid "Allow access to the 'Interfaces: QinQ' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:588
+msgid "Interfaces: QinQ: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:589
+msgid "Allow access to 'Interfaces: QinQ: Edit' page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:594
+msgid "WebCfg - Interfaces: VLAN page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:595
+msgid "Allow access to the 'Interfaces: VLAN' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:600
+msgid "WebCfg - Interfaces: VLAN: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:601
+msgid "Allow access to the 'Interfaces: VLAN: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:606
+msgid "WebCfg - Interfaces: Wireless page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:607
+msgid "Allow access to the 'Interfaces: Wireless' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:612
+msgid "WebCfg - Interfaces: Wireless edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:613
+msgid "Allow access to the 'Interfaces: Wireless : Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:618
+msgid "WebCfg - System: License page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:619
+msgid "Allow access to the 'System: License' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:624
+msgid "WebCfg - Services: Load Balancer: Monitors page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:625
+msgid "Allow access to the 'Services: Load Balancer: Monitors' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:630
+msgid "WebCfg - Services: Load Balancer: Monitor: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:631
+msgid "Allow access to the 'Services: Load Balancer: Monitor: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:636
+msgid "WebCfg - Load Balancer: Pool page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:637
+msgid "Allow access to the 'Load Balancer: Pool' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:642
+msgid "WebCfg - Load Balancer: Pool: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:643
+msgid "Allow access to the 'Load Balancer: Pool: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:648
+msgid "WebCfg - Services: Load Balancer: Relay Actions page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:649
+msgid "Allow access to the 'Services: Load Balancer: Relay Actions' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:654
+msgid "WebCfg - Services: Load Balancer: Relay Action: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:655
+msgid "Allow access to the 'Services: Load Balancer: Relay Action: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:660
+msgid "WebCfg - Services: Load Balancer: Relay Protocols page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:661
+msgid "Allow access to the 'Services: Load Balancer: Relay Protocols' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:666
+msgid "WebCfg - Services: Load Balancer: Relay Protocol: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:667
+msgid ""
+"Allow access to the 'Services: Load Balancer: Relay Protocol: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:672
+msgid "Webcfg - Services: Load Balancer: setting page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:673
+msgid "Allow access to the 'Settings: Load Balancer: Settings' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:678
+msgid "WebCfg - Services: Load Balancer: Virtual Servers page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:679
+msgid "Allow access to the 'Services: Load Balancer: Virtual Servers' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:684
+msgid "Webcfg - Services: NTP"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:685
+msgid "Allow access to the 'Services: NTP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:690
+msgid "Webcfg - Status: NTP GPS page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:691
+msgid "Allow access to the 'Status: NTP Serial GPS' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:696
+msgid "Webcfg - Status: NTP PPS page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:697
+msgid "Allow access to the 'Status: NTP PPS' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:702
+msgid "WebCfg - Load Balancer: Virtual Server: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:703
+msgid "Allow access to the 'Load Balancer: Virtual Server: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:708
+msgid "WebCfg - Package: Settings page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:709
+msgid "Allow access to the 'Package: Settings' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:714
+msgid "WebCfg - Package: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:715
+msgid "Allow access to the 'Package: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:720
+msgid "WebCfg - System: Package Manager page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:721
+msgid "Allow access to the 'System: Package Manager' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:726
+msgid "WebCfg - System: Package Manager: Install Package page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:727
+msgid "Allow access to the 'System: Package Manager: Install Package' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:732
+msgid "WebCfg - System: Package Manager: Installed page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:733
+msgid "Allow access to the 'System: Package Manager: Installed' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:738
+msgid "WebCfg - Packages: Settings page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:739
+msgid "Allow access to the 'Packages: Settings' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:744
+msgid "WebCfg - Diagnostics: Reboot System page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:745
+msgid "Allow access to the 'Diagnostics: Reboot System' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:750
+msgid "WebCfg - Diagnostics: Restart HTTPD : System page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:751
+msgid "Allow access to the 'Diagnostics: Restart HTTPD: System' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:756
+msgid "WebCfg - Services: Captive portal page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:757
+msgid "Allow access to the 'Services: Captive portal' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:762
+msgid "WebCfg - Services: Captive portal: File Manager page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:763
+msgid "Allow access to the 'Services: Captive portal: File Manager' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:768
+msgid "WebCfg - Services: Captive portal: Allowed IPs page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:769
+msgid "Allow access to the 'Services: Captive portal: Allowed IPs' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:774
+msgid "WebCfg - Services: Captive portal: Edit Allowed IPs page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:775
+msgid "Allow access to the 'Services: Captive portal: Edit Allowed IPs' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:780
+msgid "WebCfg - Services: Captive portal: Mac Addresses page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:781
+msgid "Allow access to the 'Services: Captive portal: Mac Addresses' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:786
+msgid "WebCfg - Services: Captive portal: Edit MAC Addresses page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:787
+msgid ""
+"Allow access to the 'Services: Captive portal: Edit MAC Addresses' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:792
+msgid "WebCfg - Services: Captive portal: Allowed Hostnames page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:793 etc/inc/priv.defs.inc:799
+msgid "Allow access to the 'Services: Captive portal: Allowed Hostnames' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:798
+msgid "WebCfg - Services: Captive portal: Edit Allowed Hostnames page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:804
+msgid "Webcfg - Services: Captive portal: Edit Zones page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:805
+msgid "Allow access to the 'Services: Captive portal: Edit Zones' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:810
+msgid "WebCfg - Services: Captive portal Vouchers page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:811
+msgid "Allow access to the 'Services: Captive portal Vouchers' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:822
+msgid "WebCfg - Services: Captiveprotal Zones page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:823
+msgid "Allow access to the 'Services: CaptivePortal Zones' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:828
+msgid "WebCfg - Services: DHCP server page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:829
+msgid "Allow access to the 'Services: DHCP server' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:834
+msgid "WebCfg - Services: DHCP Server : Edit static mapping page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:835
+msgid "Allow access to the 'Services: DHCP Server : Edit static mapping' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:840
+msgid "WebCfg - Services: DHCP Relay page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:841
+msgid "Allow access to the 'Services: DHCP Relay' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:846
+msgid "Webcfg - Services: DHCPv6 server page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:847
+msgid "Allow access to the 'Services: DHCPv6 server' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:852
+msgid "Webcfg - Services: DHCPv6 Server : Edit static mapping page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:853
+msgid ""
+"Allow access to the 'Services: DHCPv6 Server : Edit static mapping' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:858
+msgid "Webcfg - Services: DHCPv6 Relay page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:859
+msgid "Allow access to the 'Services: DHCPv6 Relay' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:864
+msgid "WebCfg - Services: DNS Forwarder page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:865
+msgid "Allow access to the 'Services: DNS Forwarder' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:870
+msgid "WebCfg - Services: DNS Forwarder: Edit Domain Override page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:871
+msgid ""
+"Allow access to the 'Services: DNS Forwarder: Edit Domain Override' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:876
+msgid "WebCfg - Services: DNS Forwarder: Edit host page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:877
+msgid "Allow access to the 'Services: DNS Forwarder: Edit host' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:882
+msgid "WebCfg - Services: DNS Resolver page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:883
+msgid "Allow access to the 'Services: DNS Resolver' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:888
+msgid "WebCfg - Services: DNS Resolver: Advanced page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:889
+msgid "Allow access to the 'Services: DNS Resolver: Advanced' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:894
+msgid "WebCfg - Services: DNS Resolver: Access Lists page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:895
+msgid "Allow access to the 'Services: DNS Resolver: Access Lists' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:900
+msgid "WebCfg - Services: DNS Resolver: Access Lists: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:901
+msgid "Allow access to the 'Services: DNS Resolver: Access Lists: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:906
+msgid "WebCfg - Services: DNS Resolver: Edit Domain Override page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:907
+msgid ""
+"Allow access to the 'Services: DNS Resolver: Edit Domain Override' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:912
+msgid "WebCfg - Services: DNS Resolver: Edit host page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:913
+msgid "Allow access to the 'Services: DNS Resolver: Edit host' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:918
+msgid "WebCfg - Services: Dynamic DNS clients page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:919
+msgid "Allow access to the 'Services: Dynamic DNS clients' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:924
+msgid "WebCfg - Services: Dynamic DNS client page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:925
+msgid "Allow access to the 'Services: Dynamic DNS client' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:930
+msgid "WebCfg - Services: Igmpproxy page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:931
+msgid "Allow access to the 'Services: Igmpproxy' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:936
+msgid "Firewall: Igmpproxy: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:937
+msgid "Allow access to the 'Services: Igmpproxy: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:942
+msgid "WebCfg - Services: RFC 2136 clients page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:943
+msgid "Allow access to the 'Services: RFC 2136 clients' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:948
+msgid "Webcfg - Services: Router advertisementspage"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:949
+msgid "Allow access to the 'Services: Router Advertisements' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:954
+msgid "WebCfg - Services: SNMP page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:955
+msgid "Allow access to the 'Services: SNMP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:960
+msgid "WebCfg - Services: Wake on LAN page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:961
+msgid "Allow access to the 'Services: Wake on LAN' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:966
+msgid "WebCfg - Services: Wake on LAN: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:967
+msgid "Allow access to the 'Services: Wake on LAN: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:978
+msgid "WebCfg - Hidden: Detailed Status page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:979
+msgid "Allow access to the 'Hidden: Detailed Status' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:984
+msgid "WebCfg - Status: Captive portal page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:985
+msgid "Allow access to the 'Status: Captive portal' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:990
+msgid "Webcfg - Status: Captive portal Expire Vouchers page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:991
+msgid "Allow access to the 'Status: Captive portal Expire Vouchers' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:996
+msgid "WebCfg - Status: Captive portal test Vouchers page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:997
+msgid "Allow access to the 'Status: Captive portal Test Vouchers' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1002
+msgid "WebCfg - Status: Captive portal Voucher Rolls page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1003
+msgid "Allow access to the 'Status: Captive portal Voucher Rolls' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1008
+msgid "WebCfg - Status: Captive portal Vouchers page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1009
+msgid "Allow access to the 'Status: Captive portal Vouchers' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1014
+msgid "WebCfg - Status: DHCP leases page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1015
+msgid "Allow access to the 'Status: DHCP leases' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1020
+msgid "Webcfg - Status: DHCPv6 leases page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1021
+msgid "Allow access to the 'Status: DHCPv6 leases' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1026
+msgid "WebCfg - Status: Filter Reload Status page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1027
+msgid "Allow access to the 'Status: Filter Reload Status' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1032
+msgid "WebCfg - Status: Gateway Groups page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1033
+msgid "Allow access to the 'Status: Gateway Groups' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1038
+msgid "WebCfg - Status: Gateways page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1039
+msgid "Allow access to the 'Status: Gateways' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1044
+msgid "WebCfg - Status: Traffic Graph page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1045
+msgid "Allow access to the 'Status: Traffic Graph' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1053
+msgid "WebCfg - Status: CPU load page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1054
+msgid "Allow access to the 'Status: CPU load' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1059
+msgid "WebCfg - Status: Interfaces page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1060
+msgid "Allow access to the 'Status: Interfaces' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1065
+msgid "WebCfg - Status: Load Balancer: Pool page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1066
+msgid "Allow access to the 'Status: Load Balancer: Pool' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1071
+msgid "WebCfg - Status: Load Balancer: Virtual Server page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1072
+msgid "Allow access to the 'Status: Load Balancer: Virtual Server' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1077
+msgid "WebCfg - Status: OpenVPN page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1078
+msgid "Allow access to the 'Status: OpenVPN' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1083
+msgid "WebCfg - Status: Traffic shaper: Queues page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1084
+msgid "Allow access to the 'Status: Traffic shaper: Queues' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1089
+msgid "WebCfg - Status: RRD Graphs page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1090
+msgid "Allow access to the 'Status: RRD Graphs' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1096
+msgid "WebCfg - Status: RRD Graphs settings page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1097
+msgid "Allow access to the 'Status: RRD Graphs: settings' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1102
+msgid "WebCfg - Status: Services page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1103
+msgid "Allow access to the 'Status: Services' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1108
+msgid "WebCfg - Status: UPnP Status page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1109
+msgid "Allow access to the 'Status: UPnP Status' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1114
+msgid "WebCfg - Status: Wireless page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1115
+msgid "Allow access to the 'Status: Wireless' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1120
+msgid "WebCfg - System: General Setup page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1121
+msgid "Allow access to the 'System: General Setup' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1126
+msgid "WebCfg - System: Advanced: Admin Access Page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1127
+msgid "Allow access to the 'System: Advanced: Admin Access' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1132
+msgid "WebCfg - System: Advanced: Firewall and NAT page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1133
+msgid "Allow access to the 'System: Advanced: Firewall and NAT' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1138
+msgid "WebCfg - System: Advanced: Miscellaneous page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1139
+msgid "Allow access to the 'System: Advanced: Miscellaneous' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1144
+msgid "WebCfg - System: Advanced: Network page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1145
+msgid "Allow access to the 'System: Advanced: Networking' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1150
+msgid "WebCfg - System: Advanced: Notifications page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1151
+msgid "Allow access to the 'System: Advanced: Notifications' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1156
+msgid "WebCfg - System: Advanced: Tunables page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1157
+msgid "Allow access to the 'System: Advanced: Tunables' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1162
+msgid "WebCfg - System: Authentication Servers"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1163
+msgid "Allow access to the 'System: Authentication Servers' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1168
+msgid "WebCfg - System: CA Manager"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1169
+msgid "Allow access to the 'System: CA Manager' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1174
+msgid "WebCfg - System: Certificate Manager"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1175
+msgid "Allow access to the 'System: Certificate Manager' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1180
+msgid "WebCfg - System: CRL Manager"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1181
+msgid "Allow access to the 'System: CRL Manager' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1186
+msgid "WebCfg - System: Firmware: Manual Update page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1187
+msgid "Allow access to the 'System: Firmware: Manual Update' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1192
+msgid "WebCfg - System: Firmware: Check For Update page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1193
+msgid "Allow access to the 'System: Firmware: Check For Update' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1198
+msgid "WebCfg - System: Firmware: Auto Update page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1199
+msgid "Allow access to the 'System: Firmware: Auto Update' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1204
+msgid "WebCfg - System: Firmware: Settings page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1205
+msgid "Allow access to the 'System: Firmware: Settings' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1210
+msgid "WebCfg - System: Gateway Groups page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1211
+msgid "Allow access to the 'System: Gateway Groups' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1216
+msgid "WebCfg - System: Gateways: Edit Gateway Groups page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1217
+msgid "Allow access to the 'System: Gateways: Edit Gateway Groups' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1222
+msgid "WebCfg - System: Gateways page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1223
+msgid "Allow access to the 'System: Gateways' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1228
+msgid "WebCfg - System: Gateways: Edit Gateway page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1229
+msgid "Allow access to the 'System: Gateways: Edit Gateway' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1234
+msgid "WebCfg - System: Group manager page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1235
+msgid "Allow access to the 'System: Group manager' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1240
+msgid "WebCfg - System: Group Manager: Add Privileges page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1241
+msgid "Allow access to the 'System: Group Manager: Add Privileges' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1246
+msgid "Webcfg - System: High Availability Sync"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1247
+msgid "Allow access to the 'System: High Availability Sync' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1252
+msgid "WebCfg - System: Static Routes page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1253
+msgid "Allow access to the 'System: Static Routes' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1258
+msgid "WebCfg - System: Static Routes: Edit route page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1259
+msgid "Allow access to the 'System: Static Routes: Edit route' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1264
+msgid "WebCfg - System: User Manager page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1265
+msgid "Allow access to the 'System: User Manager' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1270
+msgid "WebCfg - System: User Manager: Add Privileges page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1271
+msgid "Allow access to the 'System: User Manager: Add Privileges' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1276
+msgid "WebCfg - System: User Password Manager page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1277
+msgid "Allow access to the 'System: User Password Manager' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1282
+msgid "WebCfg - System: User Manager: settings page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1283
+msgid "Allow access to the 'System: User Manager: settings' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1288
+msgid "WebCfg - System: User Manager: Settings: Test LDAP page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1289
+msgid "Allow access to the 'System: User Manager: Settings: Test LDAP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1294
+msgid "WebCfg - System: Firmware: Manual Update page (progress bar)"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1295
+msgid ""
+"Allow access to the 'System: Firmware: Manual Update: Progress bar' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1300
+msgid "WebCfg - Hidden: Upload Configuration page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1301
+msgid "Allow access to the 'Hidden: Upload Configuration' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1306
+msgid "WebCfg - VPN: IPsec page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1307
+msgid "Allow access to the 'VPN: IPsec' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1312
+msgid "WebCfg - VPN: IPsec: Pre-Shared Keys List"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1313
+msgid "Allow access to the 'VPN: IPsec: Pre-Shared Keys List' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1318
+msgid "WebCfg - VPN: IPsec: Edit Pre-Shared Keys"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1319
+msgid "Allow access to the 'VPN: IPsec: Edit Pre-Shared Keys' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1324
+msgid "WebCfg - VPN: IPsec: Mobile page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1325
+msgid "Allow access to the 'VPN: IPsec: Mobile' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1330
+msgid "WebCfg - VPN: IPsec: Edit Phase 1 page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1331
+msgid "Allow access to the 'VPN: IPsec: Edit Phase 1' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1336
+msgid "WebCfg - VPN: IPsec: Edit Phase 2 page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1337
+msgid "Allow access to the 'VPN: IPsec: Edit Phase 2' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1342
+msgid "WebCfg - VPN: VPN L2TP page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1343
+msgid "Allow access to the 'VPN: VPN L2TP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1348
+msgid "WebCfg - VPN: VPN L2TP : Users page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1349
+msgid "Allow access to the 'VPN: VPN L2TP : Users' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1354
+msgid "WebCfg - VPN: VPN L2TP : Users : Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1355
+msgid "Allow access to the 'VPN: VPN L2TP : Users : Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1360
+msgid "WebCfg - OpenVPN: Client page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1361
+msgid "Allow access to the 'OpenVPN: Client' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1366
+msgid "WebCfg - OpenVPN: Client Specific Override page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1367
+msgid "Allow access to the 'OpenVPN: Client Specific Override' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1372
+msgid "WebCfg - OpenVPN: Server page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1373
+msgid "Allow access to the 'OpenVPN: Server' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1378
+msgid "WebCfg - Services: PPPoE Server page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1379
+msgid "Allow access to the 'Services: PPPoE Server' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1384
+msgid "WebCfg - Services: PPPoE Server: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1385
+msgid "Allow access to the 'Services: PPPoE Server: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1390
+msgid "WebCfg - VPN: VPN PPTP page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1391
+msgid "Allow access to the 'VPN: VPN PPTP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1396
+msgid "WebCfg - VPN: VPN PPTP: Users page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1397
+msgid "Allow access to the 'VPN: VPN PPTP: Users' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1402
+msgid "WebCfg - VPN: VPN PPTP: User: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1403
+msgid "Allow access to the 'VPN: VPN PPTP: User: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1408
+msgid "WebCfg - pfSense wizard subsystem page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1409
+msgid "Allow access to the 'pfSense wizard subsystem' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1414
+msgid "WebCfg - XMLRPC Library page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1415
+msgid "Allow access to the 'XMLRPC Library' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1420
+msgid "WebCfg - Firewall: Easy Rule add/status page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1421
+msgid "Allow access to the 'Firewall: Easy Rule' add/status page."
+msgstr ""
+
+#: etc/inc/radius.inc:406
+msgid "Error sending request:"
+msgstr ""
+
+#: etc/inc/radius.inc:412
+msgid "RADIUS_ACCESS_ACCEPT is unexpected for accounting"
+msgstr ""
+
+#: etc/inc/radius.inc:421
+msgid "RADIUS_ACCOUNTING_RESPONSE is unexpected for authentication"
+msgstr ""
+
+#: etc/inc/radius.inc:426
+#, php-format
+msgid "Unexpected return value: %s"
+msgstr ""
+
+#: etc/inc/rrd.inc:44
+#, php-format
+msgid "RRD dump failed exited with %1$s, the error is: %2$s"
+msgstr ""
+
+#: etc/inc/rrd.inc:102
+#, php-format
+msgid "RRD create failed exited with %1$s, the error is: %2$s"
+msgstr ""
+
+#: etc/inc/rrd.inc:117
+#, php-format
+msgid ""
+"Import RRD has %1$s DS values and %2$s RRA databases, new format RRD has "
+"%3$s DS values and %4$s RRA databases"
+msgstr ""
+
+#: etc/inc/rrd.inc:201
+#, php-format
+msgid "The new RRD now has %1$s DS values and %2$s RRA databases"
+msgstr ""
+
+#: etc/inc/rrd.inc:209
+msgid "Generating RRD graphs..."
+msgstr ""
+
+#: etc/inc/rrd.inc:912
+msgid "Creating rrd update script"
+msgstr ""
+
+#: etc/inc/service-utils.inc:239
+msgid "Router Advertisement Daemon"
+msgstr ""
+
+#: etc/inc/service-utils.inc:246 usr/local/www/diag_backup.php:184
+#: usr/local/www/fbegin.inc:139
+msgid "DNS Forwarder"
+msgstr ""
+
+#: etc/inc/service-utils.inc:253
+msgid "Unbound DNS Resolver"
+msgstr ""
+
+#: etc/inc/service-utils.inc:259
+msgid "NTP clock sync"
+msgstr ""
+
+#: etc/inc/service-utils.inc:268 usr/local/www/diag_backup.php:182
+#: usr/local/www/fbegin.inc:138 usr/local/www/fbegin.inc:173
+#: usr/local/www/services_captiveportal_zones.php:64
+#: usr/local/www/status_rrd_graph_settings.php:59
+#: usr/local/www/status_rrd_graph_settings.php:162
+msgid "Captive Portal"
+msgstr ""
+
+#: etc/inc/service-utils.inc:285 usr/local/www/fbegin.inc:141
+#: usr/local/www/services_dhcp_relay.php:102
+msgid "DHCP Relay"
+msgstr ""
+
+#: etc/inc/service-utils.inc:292 usr/local/www/fbegin.inc:142
+#: usr/local/www/services_dhcpv6_relay.php:103
+msgid "DHCPv6 Relay"
+msgstr ""
+
+#: etc/inc/service-utils.inc:299
+msgid "DHCP Service"
+msgstr ""
+
+#: etc/inc/service-utils.inc:307
+msgid "Gateway Monitoring Daemon"
+msgstr ""
+
+#: etc/inc/service-utils.inc:314
+msgid "SNMP Service"
+msgstr ""
+
+#: etc/inc/service-utils.inc:321 usr/local/www/fbegin.inc:148
+msgid "IGMP proxy"
+msgstr ""
+
+#: etc/inc/service-utils.inc:328
+msgid "UPnP Service"
+msgstr ""
+
+#: etc/inc/service-utils.inc:335
+msgid "RIP Daemon"
+msgstr ""
+
+#: etc/inc/service-utils.inc:342 usr/local/www/diag_logs_ipsec.php:61
+msgid "IPsec VPN"
+msgstr ""
+
+#: etc/inc/service-utils.inc:349
+msgid "Secure Shell Daemon"
+msgstr ""
+
+#: etc/inc/service-utils.inc:362 etc/inc/system.inc:2091
+#: usr/local/www/diag_backup.php:191 usr/local/www/diag_logs.php:86
+#: usr/local/www/diag_logs_auth.php:77 usr/local/www/diag_logs_dhcp.php:80
+#: usr/local/www/diag_logs_filter.php:143
+#: usr/local/www/diag_logs_filter_dynamic.php:108
+#: usr/local/www/diag_logs_filter_summary.php:197
+#: usr/local/www/diag_logs_gateways.php:88
+#: usr/local/www/diag_logs_ipsec.php:81 usr/local/www/diag_logs_ntpd.php:75
+#: usr/local/www/diag_logs_openvpn.php:46
+#: usr/local/www/diag_logs_openvpn.php:79 usr/local/www/diag_logs_ppp.php:77
+#: usr/local/www/diag_logs_relayd.php:76
+#: usr/local/www/diag_logs_resolver.php:88
+#: usr/local/www/diag_logs_routing.php:75
+#: usr/local/www/diag_logs_settings.php:275
+#: usr/local/www/diag_logs_vpn.php:135 usr/local/www/diag_logs_wireless.php:77
+#: usr/local/www/diag_packet_capture.php:110 usr/local/www/fbegin.inc:165
+#: usr/local/www/fbegin.inc:184 usr/local/www/license.php:143
+#: usr/local/www/status_graph.php:69 usr/local/www/status_openvpn.php:46
+#: usr/local/www/vpn_openvpn_client.php:41
+#: usr/local/www/vpn_openvpn_csc.php:41
+#: usr/local/www/vpn_openvpn_server.php:479
+msgid "OpenVPN"
+msgstr ""
+
+#: etc/inc/service-utils.inc:372
+msgid "Server load balancing daemon"
+msgstr ""
+
+#: etc/inc/service-utils.inc:416
+msgid "Not available."
+msgstr ""
+
+#: etc/inc/service-utils.inc:449
+msgid "Running"
+msgstr ""
+
+#: etc/inc/service-utils.inc:450 etc/inc/service-utils.inc:458
+#, php-format
+msgid "%s Service is"
+msgstr ""
+
+#: etc/inc/service-utils.inc:457
+msgid "Stopped"
+msgstr ""
+
+#: etc/inc/service-utils.inc:457 usr/local/www/firewall_nat_1to1_edit.php:287
+#: usr/local/www/firewall_nat_edit.php:479
+#: usr/local/www/firewall_nat_npt_edit.php:165
+#: usr/local/www/firewall_nat_out_edit.php:453
+#: usr/local/www/firewall_rules_edit.php:856 usr/local/www/interfaces.php:2732
+#: usr/local/www/interfaces_ppps_edit.php:616
+#: usr/local/www/system_gateways_edit.php:647
+#: usr/local/www/system_routes_edit.php:315
+#: usr/local/www/system_usermanager.php:527
+#: usr/local/www/system_usermanager.php:906
+#: usr/local/www/vpn_ipsec_phase1.php:569
+#: usr/local/www/vpn_ipsec_phase2.php:552
+#: usr/local/www/vpn_openvpn_client.php:465
+#: usr/local/www/vpn_openvpn_client.php:1115
+#: usr/local/www/vpn_openvpn_csc.php:336 usr/local/www/vpn_openvpn_csc.php:746
+#: usr/local/www/vpn_openvpn_server.php:763
+#: usr/local/www/vpn_openvpn_server.php:1831
+msgid "Disabled"
+msgstr ""
+
+#: etc/inc/service-utils.inc:482
+#, php-format
+msgid "Restart %sService"
+msgstr ""
+
+#: etc/inc/service-utils.inc:493
+#, php-format
+msgid "Stop %sService"
+msgstr ""
+
+#: etc/inc/service-utils.inc:509
+#, php-format
+msgid "Start %sService"
+msgstr ""
+
+#: etc/inc/service-utils.inc:577
+#, php-format
+msgid "%s has been started."
+msgstr ""
+
+#: etc/inc/service-utils.inc:647
+#, php-format
+msgid "%s has been stopped."
+msgstr ""
+
+#: etc/inc/service-utils.inc:716
+#, php-format
+msgid "%s has been restarted."
+msgstr ""
+
+#: etc/inc/services.inc:378
+#, php-format
+msgid "DHCP leases restore failed exited with %1$s, the error is: %2$s%3$s"
+msgstr ""
+
+#: etc/inc/services.inc:404
+msgid "Starting DHCP service..."
+msgstr ""
+
+#: etc/inc/services.inc:487
+msgid "Warning! DHCP Failover setup and no CARP virtual IPs defined!"
+msgstr ""
+
+#: etc/inc/services.inc:896
+#, php-format
+msgid "Error: cannot open dhcpd.conf in services_dhcpdv4_configure().%s"
+msgstr ""
+
+#: etc/inc/services.inc:1377
+msgid "Could not write Igmpproxy configuration file!"
+msgstr ""
+
+#: etc/inc/services.inc:1386
+msgid "Started IGMP proxy service."
+msgstr ""
+
+#: etc/inc/services.inc:1410
+msgid "Starting DHCP relay service..."
+msgstr ""
+
+#: etc/inc/services.inc:1532
+msgid "Starting DHCPv6 relay service..."
+msgstr ""
+
+#: etc/inc/services.inc:1673
+msgid "Starting DynDNS clients..."
+msgstr ""
+
+#: etc/inc/services.inc:1742
+msgid "Starting DNS forwarder..."
+msgstr ""
+
+#: etc/inc/services.inc:1896
+msgid "Starting DNS Resolver..."
+msgstr ""
+
+#: etc/inc/services.inc:1936
+msgid "Starting SNMP daemon... "
+msgstr ""
+
+#: etc/inc/services.inc:1941
+#, php-format
+msgid "Error: cannot open snmpd.conf in services_snmpd_configure().%s"
+msgstr ""
+
+#: etc/inc/services.inc:2285
+msgid "pfSense specific crontab entries"
+msgstr ""
+
+#: etc/inc/services.inc:2286
+msgid "Created:"
+msgstr ""
+
+#: etc/inc/services.inc:2307
+msgid "If possible do not add items to this file manually."
+msgstr ""
+
+#: etc/inc/services.inc:2308
+msgid ""
+"If you do so, this file must be terminated with a blank line (e.g. new line)"
+msgstr ""
+
+#: etc/inc/services.inc:2352
+msgid "Starting UPnP service... "
+msgstr ""
+
+#: etc/inc/services.inc:2389
+#, php-format
+msgid "Installed cron job for %s"
+msgstr ""
+
+#: etc/inc/services.inc:2392
+#, php-format
+msgid "Updated cron job for %s"
+msgstr ""
+
+#: etc/inc/services.inc:2397
+#, php-format
+msgid "Removed cron job for %s"
+msgstr ""
+
+#: etc/inc/shaper.inc:190
+#, php-format
+msgid "The field '%s' contains invalid characters."
+msgstr ""
+
+#: etc/inc/shaper.inc:196
+#, php-format
+msgid "The field '%s' is required."
+msgstr ""
+
+#: etc/inc/shaper.inc:321 etc/inc/shaper.inc:680 etc/inc/shaper.inc:1599
+#: etc/inc/shaper.inc:1914 etc/inc/shaper.inc:2259 etc/inc/shaper.inc:2399
+#: etc/inc/shaper.inc:2542 etc/inc/shaper.inc:2673 etc/inc/shaper.inc:2889
+#: etc/inc/shaper.inc:3323 usr/local/www/interfaces_ppps_edit.php:762
+#: usr/local/www/status_queues.php:175
+msgid "Bandwidth"
+msgstr ""
+
+#: etc/inc/shaper.inc:323 etc/inc/shaper.inc:1601 etc/inc/shaper.inc:2261
+#: etc/inc/shaper.inc:2544 etc/inc/shaper.inc:2893
+msgid "Bandwidthtype"
+msgstr ""
+
+#: etc/inc/shaper.inc:328 etc/inc/shaper.inc:1607 etc/inc/shaper.inc:2266
+#: etc/inc/shaper.inc:2549
+msgid "Bandwidth must be an integer."
+msgstr ""
+
+#: etc/inc/shaper.inc:330 etc/inc/shaper.inc:1610 etc/inc/shaper.inc:2270
+#: etc/inc/shaper.inc:2553
+msgid "Bandwidth cannot be negative."
+msgstr ""
+
+#: etc/inc/shaper.inc:332
+msgid "Qlimit must be an integer."
+msgstr ""
+
+#: etc/inc/shaper.inc:334
+msgid "Qlimit must be positive."
+msgstr ""
+
+#: etc/inc/shaper.inc:336
+msgid "Tbrsize must be an integer."
+msgstr ""
+
+#: etc/inc/shaper.inc:338
+msgid "Tbrsize must be positive."
+msgstr ""
+
+#: etc/inc/shaper.inc:639 etc/inc/shaper.inc:1167 etc/inc/shaper.inc:3632
+#: etc/inc/shaper.inc:3879
+msgid "Enable/Disable"
+msgstr ""
+
+#: etc/inc/shaper.inc:644
+msgid "Enable/disable discipline and its children"
+msgstr ""
+
+#: etc/inc/shaper.inc:646 etc/inc/shaper.inc:1004 etc/inc/shaper.inc:2895
+#: etc/inc/shaper.inc:3312 etc/inc/shaper.inc:3639 etc/inc/shaper.inc:3887
+#: etc/inc/shaper.inc:3959 usr/local/www/diag_gmirror.php:220
+#: usr/local/www/diag_gmirror.php:287 usr/local/www/firewall_aliases.php:191
+#: usr/local/www/firewall_aliases_edit.php:131
+#: usr/local/www/firewall_aliases_edit.php:746
+#: usr/local/www/firewall_aliases_import.php:68
+#: usr/local/www/firewall_schedule.php:97
+#: usr/local/www/interfaces_groups.php:96
+#: usr/local/www/load_balancer_monitor.php:122
+#: usr/local/www/load_balancer_monitor_edit.php:91
+#: usr/local/www/load_balancer_monitor_edit.php:237
+#: usr/local/www/load_balancer_pool.php:131
+#: usr/local/www/load_balancer_pool_edit.php:81
+#: usr/local/www/load_balancer_pool_edit.php:201
+#: usr/local/www/load_balancer_relay_action.php:139
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:412
+#: usr/local/www/load_balancer_relay_protocol.php:133
+#: usr/local/www/load_balancer_relay_protocol_edit.php:82
+#: usr/local/www/load_balancer_relay_protocol_edit.php:196
+#: usr/local/www/load_balancer_virtual_server.php:132
+#: usr/local/www/load_balancer_virtual_server_edit.php:76
+#: usr/local/www/load_balancer_virtual_server_edit.php:81
+#: usr/local/www/load_balancer_virtual_server_edit.php:166
+#: usr/local/www/pkg_mgr.php:193 usr/local/www/pkg_mgr_installed.php:123
+#: usr/local/www/services_captiveportal_filemanager.php:160
+#: usr/local/www/services_igmpproxy.php:96
+#: usr/local/www/status_gateways.php:74 usr/local/www/status_lb_pool.php:131
+#: usr/local/www/status_lb_vs.php:78 usr/local/www/status_openvpn.php:276
+#: usr/local/www/status_openvpn.php:339 usr/local/www/system_camanager.php:593
+#: usr/local/www/system_certmanager.php:1083
+#: usr/local/www/system_crlmanager.php:541
+#: usr/local/www/system_gateways.php:217
+#: usr/local/www/system_gateways_edit.php:114
+#: usr/local/www/system_gateways_edit.php:689
+#: usr/local/www/system_groupmanager.php:410
+#: usr/local/www/system_usermanager.php:644
+#: usr/local/www/system_usermanager.php:704
+#: usr/local/www/widgets/widgets/system_information.widget.php:118
+msgid "Name"
+msgstr ""
+
+#: etc/inc/shaper.inc:650
+msgid "Scheduler Type "
+msgstr ""
+
+#: etc/inc/shaper.inc:676
+msgid "NOTE: Changing this changes all child queues!"
+msgstr ""
+
+#: etc/inc/shaper.inc:677
+msgid " Beware you can lose information."
+msgstr ""
+
+#: etc/inc/shaper.inc:715
+msgid ""
+"Adjusts the size, in bytes, of the token bucket regulator. If not specified, "
+"heuristics based on the interface bandwidth are used to determine the size."
+msgstr ""
+
+#: etc/inc/shaper.inc:1013
+msgid "The priority must be an integer between 1 and 15."
+msgstr ""
+
+#: etc/inc/shaper.inc:1016 etc/inc/shaper.inc:2906
+msgid "Queue limit must be an integer"
+msgstr ""
+
+#: etc/inc/shaper.inc:1018
+msgid "Queue limit must be positive"
+msgstr ""
+
+#: etc/inc/shaper.inc:1020 etc/inc/shaper.inc:1022 etc/inc/shaper.inc:2908
+#: etc/inc/shaper.inc:2910 etc/inc/shaper.inc:3964
+msgid "Queue names must be alphanumeric and _ or - only."
+msgstr ""
+
+#: etc/inc/shaper.inc:1025
+msgid "Only one default queue per interface is allowed."
+msgstr ""
+
+#: etc/inc/shaper.inc:1172
+msgid "Enable/Disable queue and its children"
+msgstr ""
+
+#: etc/inc/shaper.inc:1176
+msgid "Queue Name"
+msgstr ""
+
+#: etc/inc/shaper.inc:1183
+msgid ""
+"Enter the name of the queue here. Do not use spaces and limit the size to "
+"15 characters."
+msgstr ""
+
+#: etc/inc/shaper.inc:1186 usr/local/www/interfaces_bridge_edit.php:373
+#: usr/local/www/interfaces_bridge_edit.php:392
+#: usr/local/www/system_gateway_groups.php:133
+msgid "Priority"
+msgstr ""
+
+#: etc/inc/shaper.inc:1190
+msgid ""
+"For hfsc, the range is 0 to 7. The default is 1. Hfsc queues with a higher "
+"priority are preferred in the case of overload."
+msgstr ""
+
+#: etc/inc/shaper.inc:1193
+msgid "Queue limit"
+msgstr ""
+
+#: etc/inc/shaper.inc:1197
+msgid "Queue limit in packets."
+msgstr ""
+
+#: etc/inc/shaper.inc:1200
+msgid "Scheduler options"
+msgstr ""
+
+#: etc/inc/shaper.inc:1205 etc/inc/shaper.inc:1208
+msgid "Default queue"
+msgstr ""
+
+#: etc/inc/shaper.inc:1215
+msgid "Random Early Detection"
+msgstr ""
+
+#: etc/inc/shaper.inc:1220
+msgid "Random Early Detection In and Out"
+msgstr ""
+
+#: etc/inc/shaper.inc:1225
+msgid "Explicit Congestion Notification"
+msgstr ""
+
+#: etc/inc/shaper.inc:1230
+msgid "Codel Active Queue"
+msgstr ""
+
+#: etc/inc/shaper.inc:1231
+msgid "Select options for this queue"
+msgstr ""
+
+#: etc/inc/shaper.inc:1233 etc/inc/shaper.inc:3413 etc/inc/shaper.inc:3694
+#: etc/inc/shaper.inc:3892 usr/local/www/diag_ipsec.php:107
+#: usr/local/www/firewall_aliases.php:193
+#: usr/local/www/firewall_aliases_edit.php:583
+#: usr/local/www/firewall_aliases_edit.php:761
+#: usr/local/www/firewall_aliases_edit.php:798
+#: usr/local/www/firewall_aliases_import.php:185
+#: usr/local/www/firewall_nat.php:212 usr/local/www/firewall_nat_1to1.php:186
+#: usr/local/www/firewall_nat_1to1_edit.php:508
+#: usr/local/www/firewall_nat_edit.php:789
+#: usr/local/www/firewall_nat_npt.php:110
+#: usr/local/www/firewall_nat_npt_edit.php:269
+#: usr/local/www/firewall_nat_out.php:313
+#: usr/local/www/firewall_nat_out.php:550
+#: usr/local/www/firewall_nat_out_edit.php:781
+#: usr/local/www/firewall_rules.php:350
+#: usr/local/www/firewall_rules_edit.php:1249
+#: usr/local/www/firewall_schedule.php:99
+#: usr/local/www/firewall_schedule_edit.php:805
+#: usr/local/www/firewall_schedule_edit.php:1010
+#: usr/local/www/firewall_virtual_ip.php:242
+#: usr/local/www/firewall_virtual_ip_edit.php:501
+#: usr/local/www/interfaces.php:1655 usr/local/www/interfaces_bridge.php:120
+#: usr/local/www/interfaces_bridge_edit.php:292
+#: usr/local/www/interfaces_gif.php:114
+#: usr/local/www/interfaces_gif_edit.php:223
+#: usr/local/www/interfaces_gre.php:115
+#: usr/local/www/interfaces_gre_edit.php:226
+#: usr/local/www/interfaces_groups.php:98
+#: usr/local/www/interfaces_groups_edit.php:261
+#: usr/local/www/interfaces_lagg.php:120
+#: usr/local/www/interfaces_lagg_edit.php:225
+#: usr/local/www/interfaces_ppps.php:112
+#: usr/local/www/interfaces_ppps_edit.php:482
+#: usr/local/www/interfaces_qinq.php:124
+#: usr/local/www/interfaces_qinq_edit.php:343
+#: usr/local/www/interfaces_vlan.php:117
+#: usr/local/www/interfaces_vlan_edit.php:193
+#: usr/local/www/interfaces_wireless.php:112
+#: usr/local/www/interfaces_wireless_edit.php:191
+#: usr/local/www/load_balancer_monitor.php:124
+#: usr/local/www/load_balancer_monitor_edit.php:91
+#: usr/local/www/load_balancer_monitor_edit.php:243
+#: usr/local/www/load_balancer_pool.php:136
+#: usr/local/www/load_balancer_pool_edit.php:216
+#: usr/local/www/load_balancer_relay_action.php:142
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:418
+#: usr/local/www/load_balancer_relay_protocol.php:136
+#: usr/local/www/load_balancer_relay_protocol_edit.php:82
+#: usr/local/www/load_balancer_relay_protocol_edit.php:219
+#: usr/local/www/load_balancer_virtual_server.php:138
+#: usr/local/www/load_balancer_virtual_server_edit.php:172
+#: usr/local/www/pkg_mgr.php:199 usr/local/www/pkg_mgr_installed.php:126
+#: usr/local/www/services_captiveportal_hostname.php:127
+#: usr/local/www/services_captiveportal_hostname_edit.php:186
+#: usr/local/www/services_captiveportal_ip.php:120
+#: usr/local/www/services_captiveportal_ip_edit.php:203
+#: usr/local/www/services_captiveportal_mac.php:171
+#: usr/local/www/services_captiveportal_mac_edit.php:218
+#: usr/local/www/services_captiveportal_zones.php:83
+#: usr/local/www/services_captiveportal_zones_edit.php:106
+#: usr/local/www/services_dhcp.php:876 usr/local/www/services_dhcp.php:1250
+#: usr/local/www/services_dhcp_edit.php:424
+#: usr/local/www/services_dhcpv6.php:861
+#: usr/local/www/services_dhcpv6_edit.php:240
+#: usr/local/www/services_dnsmasq.php:355
+#: usr/local/www/services_dnsmasq.php:442
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:155
+#: usr/local/www/services_dnsmasq_edit.php:237
+#: usr/local/www/services_dnsmasq_edit.php:258
+#: usr/local/www/services_dyndns.php:90
+#: usr/local/www/services_dyndns_edit.php:416
+#: usr/local/www/services_igmpproxy.php:99
+#: usr/local/www/services_igmpproxy_edit.php:180
+#: usr/local/www/services_rfc2136.php:84
+#: usr/local/www/services_rfc2136_edit.php:206
+#: usr/local/www/services_unbound.php:423
+#: usr/local/www/services_unbound.php:510
+#: usr/local/www/services_unbound_acls.php:242
+#: usr/local/www/services_unbound_acls.php:296
+#: usr/local/www/services_unbound_acls.php:323
+#: usr/local/www/services_unbound_domainoverride_edit.php:148
+#: usr/local/www/services_unbound_host_edit.php:240
+#: usr/local/www/services_unbound_host_edit.php:261
+#: usr/local/www/services_wol.php:164 usr/local/www/services_wol_edit.php:152
+#: usr/local/www/status_gateway_groups.php:78
+#: usr/local/www/status_gateways.php:80 usr/local/www/status_lb_pool.php:135
+#: usr/local/www/status_lb_vs.php:82 usr/local/www/status_services.php:85
+#: usr/local/www/status_upnp.php:91
+#: usr/local/www/system_advanced_sysctl.php:182
+#: usr/local/www/system_advanced_sysctl.php:255
+#: usr/local/www/system_gateway_groups.php:134
+#: usr/local/www/system_gateway_groups_edit.php:339
+#: usr/local/www/system_gateways.php:221
+#: usr/local/www/system_gateways_edit.php:852
+#: usr/local/www/system_groupmanager.php:327
+#: usr/local/www/system_groupmanager.php:411
+#: usr/local/www/system_groupmanager.php:482
+#: usr/local/www/system_groupmanager_addprivs.php:218
+#: usr/local/www/system_routes.php:237
+#: usr/local/www/system_routes_edit.php:323
+#: usr/local/www/system_usermanager.php:645
+#: usr/local/www/system_usermanager_addprivs.php:187
+#: usr/local/www/vpn_ipsec_phase1.php:660
+#: usr/local/www/vpn_ipsec_phase2.php:691
+#: usr/local/www/vpn_openvpn_client.php:663
+#: usr/local/www/vpn_openvpn_client.php:1118
+#: usr/local/www/vpn_openvpn_csc.php:364 usr/local/www/vpn_openvpn_csc.php:748
+#: usr/local/www/vpn_openvpn_server.php:892
+#: usr/local/www/vpn_openvpn_server.php:1834 usr/local/www/vpn_pppoe.php:107
+#: usr/local/www/vpn_pppoe_edit.php:456
+msgid "Description"
+msgstr ""
+
+#: etc/inc/shaper.inc:1260
+msgid "Bandwidth:"
+msgstr ""
+
+#: etc/inc/shaper.inc:1264
+msgid "Priority: on"
+msgstr ""
+
+#: etc/inc/shaper.inc:1267
+msgid "Default: on"
+msgstr ""
+
+#: etc/inc/shaper.inc:1274 etc/inc/shaper.inc:1275
+msgid "Delete queue from interface"
+msgstr ""
+
+#: etc/inc/shaper.inc:1614 etc/inc/shaper.inc:2274 etc/inc/shaper.inc:2558
+msgid "Bandwidth in percentage should be between 1 and 100 bounds."
+msgstr ""
+
+#: etc/inc/shaper.inc:1631
+msgid "upperlimit service curve defined but missing (d) value"
+msgstr ""
+
+#: etc/inc/shaper.inc:1633
+msgid ""
+"upperlimit service curve defined but missing initial bandwidth (m1) value"
+msgstr ""
+
+#: etc/inc/shaper.inc:1635
+msgid "upperlimit m1 value needs to be Kb, Mb, Gb, or %"
+msgstr ""
+
+#: etc/inc/shaper.inc:1637
+msgid "upperlimit d value needs to be numeric"
+msgstr ""
+
+#: etc/inc/shaper.inc:1639
+msgid "upperlimit m2 value needs to be Kb, Mb, Gb, or %"
+msgstr ""
+
+#: etc/inc/shaper.inc:1653
+msgid "linkshare service curve defined but missing (d) value"
+msgstr ""
+
+#: etc/inc/shaper.inc:1655
+msgid ""
+"linkshare service curve defined but missing initial bandwidth (m1) value"
+msgstr ""
+
+#: etc/inc/shaper.inc:1657
+msgid "linkshare m1 value needs to be Kb, Mb, Gb, or %"
+msgstr ""
+
+#: etc/inc/shaper.inc:1659
+msgid "linkshare d value needs to be numeric"
+msgstr ""
+
+#: etc/inc/shaper.inc:1661
+msgid "linkshare m2 value needs to be Kb, Mb, Gb, or %"
+msgstr ""
+
+#: etc/inc/shaper.inc:1663
+msgid "realtime service curve defined but missing (d) value"
+msgstr ""
+
+#: etc/inc/shaper.inc:1665
+msgid "realtime service curve defined but missing initial bandwidth (m1) value"
+msgstr ""
+
+#: etc/inc/shaper.inc:1680
+msgid "realtime m1 value needs to be Kb, Mb, Gb, or %"
+msgstr ""
+
+#: etc/inc/shaper.inc:1682
+msgid "realtime d value needs to be numeric"
+msgstr ""
+
+#: etc/inc/shaper.inc:1684
+msgid "realtime m2 value needs to be Kb, Mb, Gb, or %"
+msgstr ""
+
+#: etc/inc/shaper.inc:1922 etc/inc/shaper.inc:2408 etc/inc/shaper.inc:2682
+msgid "Gbit/s"
+msgstr ""
+
+#: etc/inc/shaper.inc:1926 etc/inc/shaper.inc:2412 etc/inc/shaper.inc:2686
+msgid "Mbit/s"
+msgstr ""
+
+#: etc/inc/shaper.inc:1930 etc/inc/shaper.inc:2416 etc/inc/shaper.inc:2690
+#: usr/local/www/services_captiveportal.php:652
+#: usr/local/www/services_captiveportal.php:656
+msgid "Kbit/s"
+msgstr ""
+
+#: etc/inc/shaper.inc:1934 etc/inc/shaper.inc:2420 etc/inc/shaper.inc:2694
+msgid "Bit/s"
+msgstr ""
+
+#: etc/inc/shaper.inc:1940 etc/inc/shaper.inc:2426 etc/inc/shaper.inc:2700
+msgid "Choose the amount of bandwidth for this queue"
+msgstr ""
+
+#: etc/inc/shaper.inc:1943
+msgid "Service Curve (sc)"
+msgstr ""
+
+#: etc/inc/shaper.inc:1950
+msgid "Upperlimit:"
+msgstr ""
+
+#: etc/inc/shaper.inc:1965
+msgid "The maximum allowed bandwidth for the queue."
+msgstr ""
+
+#: etc/inc/shaper.inc:1969
+msgid "Real time:"
+msgstr ""
+
+#: etc/inc/shaper.inc:1984
+msgid "The minimum required bandwidth for the queue."
+msgstr ""
+
+#: etc/inc/shaper.inc:1988
+msgid "Link share:"
+msgstr ""
+
+#: etc/inc/shaper.inc:2003
+msgid "The bandwidth share of a backlogged queue - this overrides priority."
+msgstr ""
+
+#: etc/inc/shaper.inc:2005
+msgid ""
+"The format for service curve specifications is (m1, d, m2). m2 controls the "
+"bandwidth assigned to the queue. m1 and d are optional and can be used to "
+"control the initial bandwidth assignment. For the first d milliseconds the "
+"queue gets the bandwidth given as m1, afterwards the value given in m2."
+msgstr ""
+
+#: etc/inc/shaper.inc:2257
+msgid "Priority must be an integer between 1 and 7."
+msgstr ""
+
+#: etc/inc/shaper.inc:2428 etc/inc/shaper.inc:2702
+msgid "Scheduler specific options"
+msgstr ""
+
+#: etc/inc/shaper.inc:2432
+msgid "Borrow from other queues when available"
+msgstr ""
+
+#: etc/inc/shaper.inc:2540
+msgid "Priority must be an integer between 1 and 255."
+msgstr ""
+
+#: etc/inc/shaper.inc:2708
+msgid "Number of buckets available."
+msgstr ""
+
+#: etc/inc/shaper.inc:2713
+msgid "Bandwidth limit for hosts to not saturate link."
+msgstr ""
+
+#: etc/inc/shaper.inc:2901
+msgid "Plr must be a value between 0 and 1."
+msgstr ""
+
+#: etc/inc/shaper.inc:2904
+msgid "Buckets must be an integer between 16 and 65535."
+msgstr ""
+
+#: etc/inc/shaper.inc:2913
+msgid "IPV4 bit mask must be blank or numeric value between 1 and 32."
+msgstr ""
+
+#: etc/inc/shaper.inc:2916
+msgid "IPV6 bit mask must be blank or numeric value between 1 and 128."
+msgstr ""
+
+#: etc/inc/shaper.inc:3057
+#, php-format
+msgid "Bandwidth for schedule %s must be an integer."
+msgstr ""
+
+#: etc/inc/shaper.inc:3059
+#, php-format
+msgid "Burst for schedule %s must be an integer."
+msgstr ""
+
+#: etc/inc/shaper.inc:3065
+msgid "You need to specify a schedule for every additional entry"
+msgstr ""
+
+#: etc/inc/shaper.inc:3067
+msgid "If more than one bandwidth configured all schedules need to be selected"
+msgstr ""
+
+#: etc/inc/shaper.inc:3069
+msgid "At least one bw specification is necessary"
+msgstr ""
+
+#: etc/inc/shaper.inc:3071
+msgid "Delay must be an integer."
+msgstr ""
+
+#: etc/inc/shaper.inc:3305 usr/local/www/diag_routes.php:171
+#: usr/local/www/interfaces.php:1645 usr/local/www/services_dnsmasq.php:189
+#: usr/local/www/services_rfc2136_edit.php:135
+#: usr/local/www/services_snmp.php:291 usr/local/www/services_snmp.php:351
+#: usr/local/www/services_unbound.php:254
+#: usr/local/www/system_firmware.php:125
+msgid "Enable"
+msgstr ""
+
+#: etc/inc/shaper.inc:3310
+msgid "Enable limiter and its children"
+msgstr ""
+
+#: etc/inc/shaper.inc:3365
+msgid "add another schedule"
+msgstr ""
+
+#: etc/inc/shaper.inc:3367
+msgid ""
+"Bandwidth is the rate (e.g. Mbit/s) to which traffic in this limiter will be "
+"restricted."
+msgstr ""
+
+#: etc/inc/shaper.inc:3369 etc/inc/shaper.inc:3650
+msgid "Mask"
+msgstr ""
+
+#: etc/inc/shaper.inc:3380 etc/inc/shaper.inc:3661
+msgid "Source addresses"
+msgstr ""
+
+#: etc/inc/shaper.inc:3384 etc/inc/shaper.inc:3665
+msgid "Destination addresses"
+msgstr ""
+
+#: etc/inc/shaper.inc:3387 etc/inc/shaper.inc:3668
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"a dynamic pipe with the bandwidth, delay, packet loss and queue size given "
+"above will \n"
+"be created for each source/destination IP address encountered, \n"
+"respectively. This makes it possible to easily specify bandwidth \n"
+"limits per host."
+msgstr ""
+
+#: etc/inc/shaper.inc:3408
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"leaving the mask bits blank will create one pipe per host. Otherwise "
+"specify \n"
+"the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+"per pipe."
+msgstr ""
+
+#: etc/inc/shaper.inc:3419 etc/inc/shaper.inc:3700 etc/inc/shaper.inc:3898
+#: usr/local/www/firewall_aliases_edit.php:766
+#: usr/local/www/firewall_nat_1to1_edit.php:513
+#: usr/local/www/firewall_nat_edit.php:792
+#: usr/local/www/firewall_nat_npt_edit.php:272
+#: usr/local/www/firewall_nat_out_edit.php:785
+#: usr/local/www/firewall_schedule_edit.php:808
+#: usr/local/www/firewall_schedule_edit.php:982
+#: usr/local/www/firewall_virtual_ip_edit.php:504
+#: usr/local/www/interfaces_gif_edit.php:226
+#: usr/local/www/interfaces_gre_edit.php:229
+#: usr/local/www/interfaces_groups_edit.php:266
+#: usr/local/www/interfaces_qinq_edit.php:348
+#: usr/local/www/interfaces_vlan_edit.php:196
+#: usr/local/www/interfaces_wireless_edit.php:194
+#: usr/local/www/services_dhcp_edit.php:427
+#: usr/local/www/services_dhcpv6_edit.php:243
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:158
+#: usr/local/www/services_dnsmasq_edit.php:240
+#: usr/local/www/services_igmpproxy_edit.php:185
+#: usr/local/www/services_unbound_domainoverride_edit.php:152
+#: usr/local/www/services_unbound_host_edit.php:243
+#: usr/local/www/services_wol_edit.php:155
+#: usr/local/www/system_gateway_groups_edit.php:342
+#: usr/local/www/system_routes_edit.php:326
+msgid "You may enter a description here for your reference (not parsed)."
+msgstr ""
+
+#: etc/inc/shaper.inc:3425 etc/inc/shaper.inc:3706
+#: usr/local/www/interfaces_bridge_edit.php:300
+#: usr/local/www/interfaces_ppps_edit.php:751
+msgid "Show advanced options"
+msgstr ""
+
+#: etc/inc/shaper.inc:3429 usr/local/www/status_ntpd.php:186
+msgid "Delay"
+msgstr ""
+
+#: etc/inc/shaper.inc:3433
+msgid ""
+"Hint: in most cases, you should specify 0 here (or leave the field empty)"
+msgstr ""
+
+#: etc/inc/shaper.inc:3437 etc/inc/shaper.inc:3717
+msgid "Packet loss rate"
+msgstr ""
+
+#: etc/inc/shaper.inc:3441 etc/inc/shaper.inc:3721
+msgid ""
+"Hint: in most cases, you should specify 0 here (or leave the field empty). A "
+"value of 0.001 means one packet in 1000 gets dropped"
+msgstr ""
+
+#: etc/inc/shaper.inc:3446 etc/inc/shaper.inc:3726
+msgid "Queue Size"
+msgstr ""
+
+#: etc/inc/shaper.inc:3451 etc/inc/shaper.inc:3731
+msgid ""
+"Hint: in most cases, you should leave the field empty. All packets in this "
+"pipe are placed into a fixed-size queue first, then they are delayed by "
+"value specified in the Delay field, and then they are delivered to their "
+"destination."
+msgstr ""
+
+#: etc/inc/shaper.inc:3457 etc/inc/shaper.inc:3737
+msgid "Bucket Size"
+msgstr ""
+
+#: etc/inc/shaper.inc:3462 etc/inc/shaper.inc:3742
+msgid ""
+"Hint: in most cases, you should leave the field empty. It increases the hash "
+"size set."
+msgstr ""
+
+#: etc/inc/shaper.inc:3530
+msgid "Weight must be an integer between 1 and 100."
+msgstr ""
+
+#: etc/inc/shaper.inc:3637
+msgid "Enable/Disable queue"
+msgstr ""
+
+#: etc/inc/shaper.inc:3657 usr/local/www/firewall_rules.php:734
+#: usr/local/www/firewall_rules_edit.php:1410
+#: usr/local/www/firewall_rules_edit.php:1419
+#: usr/local/www/interfaces_lagg_edit.php:218
+#: usr/local/www/load_balancer_virtual_server_edit.php:232
+#: usr/local/www/vpn_ipsec_mobile.php:405
+#: usr/local/www/vpn_openvpn_client.php:609
+msgid "none"
+msgstr ""
+
+#: etc/inc/shaper.inc:3689
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"leaving the mask bits blank will create one pipe per host. Otherwise "
+"specify \n"
+"the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+"per queue."
+msgstr ""
+
+#: etc/inc/shaper.inc:3709 usr/local/www/system_gateways_edit.php:753
+msgid "Weight"
+msgstr ""
+
+#: etc/inc/shaper.inc:3713
+msgid ""
+"Hint: For queues under the same parent this specifies the share that a queue "
+"gets(values range from 1 to 100, you can leave it blank otherwise)"
+msgstr ""
+
+#: etc/inc/shaper.inc:3741
+msgid "slots"
+msgstr ""
+
+#: etc/inc/shaper.inc:3885
+msgid "Enable/Disable layer7 Container"
+msgstr ""
+
+#: etc/inc/shaper.inc:4150
+#, php-format
+msgid "Sending HUP signal to %s"
+msgstr ""
+
+#: etc/inc/shaper.inc:4511
+msgid " Clone shaper/queue on this interface"
+msgstr ""
+
+#: etc/inc/shaper.inc:4519 etc/inc/shaper.inc:4526
+#, php-format
+msgid "Welcome to the %s Traffic Shaper."
+msgstr ""
+
+#: etc/inc/shaper.inc:4520 etc/inc/shaper.inc:4527
+msgid ""
+"The tree on the left helps you navigate through the queues <br />buttons at "
+"the bottom represent queue actions and are activated accordingly."
+msgstr ""
+
+#: etc/inc/smtp.inc:93
+msgid ": data access time out"
+msgstr ""
+
+#: etc/inc/smtp.inc:96
+msgid ": the server disconnected"
+msgstr ""
+
+#: etc/inc/smtp.inc:108
+msgid "reached the end of data while reading from the SMTP server conection"
+msgstr ""
+
+#: etc/inc/smtp.inc:114
+msgid "it was not possible to read line from the SMTP server"
+msgstr ""
+
+#: etc/inc/smtp.inc:136
+msgid "it was not possible to send a line to the SMTP server"
+msgstr ""
+
+#: etc/inc/smtp.inc:150
+msgid "it was not possible to send data to the SMTP server"
+msgstr ""
+
+#: etc/inc/smtp.inc:222
+msgid "establishing SSL connections requires at least PHP version 4.3.0"
+msgstr ""
+
+#: etc/inc/smtp.inc:225
+msgid "establishing SSL connections requires the OpenSSL extension enabled"
+msgstr ""
+
+#: etc/inc/smtp.inc:234
+#, php-format
+msgid "could not resolve host \"%s\""
+msgstr ""
+
+#: etc/inc/smtp.inc:238
+#, php-format
+msgid "domain \"%s\" resolved to an address excluded to be valid"
+msgstr ""
+
+#: etc/inc/smtp.inc:240
+#, php-format
+msgid "Connecting to host address \"%1$s\" port %2$s..."
+msgstr ""
+
+#: etc/inc/smtp.inc:247
+msgid "-3 socket could not be created"
+msgstr ""
+
+#: etc/inc/smtp.inc:249
+#, php-format
+msgid "-4 dns lookup on hostname \"%s\" failed"
+msgstr ""
+
+#: etc/inc/smtp.inc:251
+msgid "-5 connection refused or timed out"
+msgstr ""
+
+#: etc/inc/smtp.inc:253
+msgid "-6 fdopen() call failed"
+msgstr ""
+
+#: etc/inc/smtp.inc:255
+msgid "-7 setvbuf() call failed"
+msgstr ""
+
+#: etc/inc/smtp.inc:257
+#, php-format
+msgid "could not connect to the host \"%1$s\": %2$s"
+msgstr ""
+
+#: etc/inc/smtp.inc:266
+msgid ""
+"it is not possible to authenticate using the specified mechanism because the "
+"SASL library class is not loaded"
+msgstr ""
+
+#: etc/inc/smtp.inc:290
+#, php-format
+msgid "authenticated mechanism %1$s may not be used: %2$s"
+msgstr ""
+
+#: etc/inc/smtp.inc:295
+msgid "Could not start the SASL authentication client:"
+msgstr ""
+
+#: etc/inc/smtp.inc:302
+msgid "Could not send the AUTH command"
+msgstr ""
+
+#: etc/inc/smtp.inc:317 etc/inc/smtp.inc:347
+msgid "Authentication error:"
+msgstr ""
+
+#: etc/inc/smtp.inc:332
+msgid "Could not send the authentication step message"
+msgstr ""
+
+#: etc/inc/smtp.inc:352
+msgid "Could not process the SASL authentication step:"
+msgstr ""
+
+#: etc/inc/smtp.inc:366
+msgid "connection is already established"
+msgstr ""
+
+#: etc/inc/smtp.inc:404
+msgid "it was not specified the POP3 authentication user"
+msgstr ""
+
+#: etc/inc/smtp.inc:410
+msgid "it was not specified the POP3 authentication password"
+msgstr ""
+
+#: etc/inc/smtp.inc:414
+#, php-format
+msgid "Resolving POP3 authentication host \"%s\"..."
+msgstr ""
+
+#: etc/inc/smtp.inc:421
+msgid "POP3 authentication server greeting was not found"
+msgstr ""
+
+#: etc/inc/smtp.inc:429
+msgid "POP3 authentication user was not accepted:"
+msgstr ""
+
+#: etc/inc/smtp.inc:437
+msgid "POP3 authentication password was not accepted:"
+msgstr ""
+
+#: etc/inc/smtp.inc:446
+msgid "could not determine the SMTP to connect"
+msgstr ""
+
+#: etc/inc/smtp.inc:452
+#, php-format
+msgid "Resolving SMTP server domain \"%s\"..."
+msgstr ""
+
+#: etc/inc/smtp.inc:464
+#, php-format
+msgid "Connected to SMTP server \"%s\"."
+msgstr ""
+
+#: etc/inc/smtp.inc:478
+msgid "server does not require authentication"
+msgstr ""
+
+#: etc/inc/smtp.inc:542
+msgid ""
+"it is not supported any of the authentication mechanisms required by the "
+"server"
+msgstr ""
+
+#: etc/inc/smtp.inc:632
+msgid ""
+"direct delivery connection is already established and sender is already set"
+msgstr ""
+
+#: etc/inc/smtp.inc:640
+msgid "connection is not in the initial state"
+msgstr ""
+
+#: etc/inc/smtp.inc:662
+msgid "it was not specified a valid direct recipient"
+msgstr ""
+
+#: etc/inc/smtp.inc:681
+msgid ""
+"it is not possible to deliver directly to recipients of different domains"
+msgstr ""
+
+#: etc/inc/smtp.inc:686
+msgid "connection is already established and the recipient is already set"
+msgstr ""
+
+#: etc/inc/smtp.inc:698
+msgid "connection is not in the recipient setting state"
+msgstr ""
+
+#: etc/inc/smtp.inc:727
+msgid "connection is not in the start sending data state"
+msgstr ""
+
+#: etc/inc/smtp.inc:757 etc/inc/smtp.inc:768
+msgid "connection is not in the sending data state"
+msgstr ""
+
+#: etc/inc/smtp.inc:804
+msgid "it was not previously established a SMTP connection"
+msgstr ""
+
+#: etc/inc/system.inc:515
+#, php-format
+msgid "Not adding default route because OLSR dynamic gateway is enabled."
+msgstr ""
+
+#: etc/inc/system.inc:556
+#, php-format
+msgid "Static Routes: Gateway IP could not be found for %s"
+msgstr ""
+
+#: etc/inc/system.inc:715
+msgid "Starting syslog..."
+msgstr ""
+
+#: etc/inc/system.inc:860
+#, php-format
+msgid "Error: cannot open syslog.conf in system_syslogd_start().%s"
+msgstr ""
+
+#: etc/inc/system.inc:942
+msgid "Starting webConfigurator..."
+msgstr ""
+
+#: etc/inc/system.inc:988 etc/inc/system.inc:1912 etc/inc/system.inc:1915
+msgid "failed!"
+msgstr ""
+
+#: etc/inc/system.inc:1288
+#, php-format
+msgid "Error: cannot open cert.pem in system_webgui_start().%s"
+msgstr ""
+
+#: etc/inc/system.inc:1299
+#, php-format
+msgid "Error: cannot open ca.pem in system_webgui_start().%s"
+msgstr ""
+
+#: etc/inc/system.inc:1307
+msgid "ssl configuration"
+msgstr ""
+
+#: etc/inc/system.inc:1360
+#, php-format
+msgid "Error: cannot open %s in system_generate_lighty_config().%s"
+msgstr ""
+
+#: etc/inc/system.inc:1380
+msgid "Setting timezone..."
+msgstr ""
+
+#: etc/inc/system.inc:1761
+msgid "Syncing system time before startup..."
+msgstr ""
+
+#: etc/inc/system.inc:1875
+#, php-format
+msgid "Error: cannot open dmesg.boot in system_dmesg_save().%s"
+msgstr ""
+
+#: etc/inc/system.inc:1897
+msgid "Setting hard disk standby... "
+msgstr ""
+
+#: etc/inc/system.inc:2018
+msgid "Generic PC"
+msgstr ""
+
+#: etc/inc/system.inc:2021
+msgid "Generic PC (CD-ROM)"
+msgstr ""
+
+#: etc/inc/system.inc:2030
+msgid "PC Engines WRAP"
+msgstr ""
+
+#: etc/inc/system.inc:2033
+msgid "PC Engines ALIX"
+msgstr ""
+
+#: etc/inc/system.inc:2045
+msgid "embedded (unknown)"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:113
+#, php-format
+msgid "%sWarning: filter rule removed (interface '%s' does not exist anymore)."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:125
+#, php-format
+msgid ""
+"%sWarning: filter rule removed (source network '%s' does not exist anymore)."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:138
+#, php-format
+msgid ""
+"%sWarning: filter rule removed (destination network '%s' does not exist "
+"anymore)."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:158
+#, php-format
+msgid ""
+"%sWarning: traffic shaper rule removed (interface '%s' does not exist "
+"anymore)."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:170
+#, php-format
+msgid ""
+"%sWarning: traffic shaper rule removed (source network '%s' does not exist "
+"anymore)."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:183
+#, php-format
+msgid ""
+"%sWarning: traffic shaper rule removed (destination network '%s' does not "
+"exist anymore)."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:333
+#, php-format
+msgid "CARP vhid %s"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:510
+msgid "Permit IPsec traffic."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:585
+msgid "System Administrators"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:604
+msgid ""
+"Indicates whether this user will lock access to the webConfigurator for "
+"other users."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:607
+msgid ""
+"Indicates whether this user will lock individual HTML pages after having "
+"accessed a particular page (the lock will be freed if the user leaves or "
+"saves the page form)."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:610
+msgid "Indicates whether this user is able to login for example via SSH."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:613
+#, php-format
+msgid ""
+"Indicates whether this user is allowed to copy files onto the %s appliance "
+"via SCP/SFTP. If you are going to use this privilege, you must install "
+"scponly on the appliance (Hint: pkg_add -r scponly)."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:616
+msgid ""
+"This user is associated with the UNIX root user (you should associate this "
+"privilege only with one single user)."
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:633
+msgid "Drop packets to closed TCP ports without returning a RST"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:637
+msgid "Do not send ICMP port unreachable messages for closed UDP ports"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:641
+msgid "Randomize the ID field in IP packets (default is 0: sequential IP IDs)"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:645
+msgid "Drop SYN-FIN packets (breaks RFC1379, but nobody uses it anyway)"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:649
+msgid "Sending of IPv4 ICMP redirects"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:653
+msgid "Sending of IPv6 ICMP redirects"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:657
+msgid "Generate SYN cookies for outbound SYN-ACK packets"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:661
+msgid "Maximum incoming TCP datagram size"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:665
+msgid "Maximum outgoing TCP datagram size"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:669
+msgid ""
+"Fastforwarding (see http://lists.freebsd.org/pipermail/freebsd-net/2004-"
+"January/002534.html)"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:673
+msgid "Do not delay ACK to try and piggyback it onto a data packet"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:677
+msgid "Maximum outgoing UDP datagram size"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:681
+msgid ""
+"Handling of non-IP packets which are not passed to pfil (see if_bridge(4))"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:685
+msgid "Allow unprivileged access to tap(4) device nodes"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:689
+msgid "Randomize PID's (see src/sys/kern/kern_fork.c: sysctl_kern_randompid())"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:693
+msgid ""
+"The system will attempt to calculate the bandwidth delay product for each "
+"connection and limit the amount of data queued to the network to just the "
+"amount required to maintain optimum throughput. "
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:697
+msgid "Set ICMP Limits"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:701
+msgid "TCP Offload engine"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:742
+#, php-format
+msgid "Interface %s Static Gateway"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:745
+#, php-format
+msgid "Interface %s Dynamic Gateway"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:811
+#, php-format
+msgid "Upgraded static route for %s"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:908
+#, php-format
+msgid "Sitedown pool for VS: %s"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:1063
+#, php-format
+msgid "phase2 for %s"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:1290
+#, php-format
+msgid "Upgraded Dyndns %s"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:1342
+msgid "All Users"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:1474
+#, php-format
+msgid "Converted bridged %s"
+msgstr ""
+
+#: etc/inc/upgrade_config.inc:1848
+msgid "Auto added OpenVPN rule from config upgrade."
+msgstr ""
+
+#: etc/inc/util.inc:101
+#, php-format
+msgid "WARNING: Could not mark subsystem: %s dirty"
+msgstr ""
+
+#: etc/inc/util.inc:121
+msgid "WARNING: You must give a name as parameter to lock() function."
+msgstr ""
+
+#: etc/inc/util.inc:138
+msgid "WARNING: You must give a name as parameter to try_lock() function."
+msgstr ""
+
+#: etc/inc/util.inc:273
+#, php-format
+msgid "Reference %s is going negative, not doing unreference."
+msgstr ""
+
+#: etc/inc/util.inc:1254
+#, php-format
+msgid "The command '%1$s' returned exit code '%2$d', the output was '%3$s' "
+msgstr ""
+
+#: etc/inc/voucher.inc:391
+#, php-format
+msgid "%1$s (%2$s/%3$s) active and good for %4$d Minutes"
+msgstr ""
+
+#: etc/inc/voucher.inc:428
+msgid "Access denied!"
+msgstr ""
+
+#: etc/inc/voucher.inc:430
+#, php-format
+msgid "Access granted for %d Minutes in total."
+msgstr ""
+
+#: etc/inc/voucher.inc:496
+msgid "Enabling voucher support... "
+msgstr ""
+
+#: etc/inc/voucher.inc:535
+#, php-format
+msgid "Error: cannot write voucher.cfg"
+msgstr ""
+
+#: etc/inc/voucher.inc:586
+#, php-format
+msgid "cant write %1$s/voucher_%s_used_%2$s.db"
+msgstr ""
+
+#: etc/inc/voucher.inc:667
+#, php-format
+msgid "cant read %1$s/voucher_%s_used_%2$s.db"
+msgstr ""
+
+#: etc/inc/voucher.inc:684
+#, php-format
+msgid "Voucher: %s"
+msgstr ""
+
+#: etc/inc/vpn.inc:161
+msgid "Configuring IPsec VPN... "
+msgstr ""
+
+#: etc/inc/vpn.inc:423
+#, php-format
+msgid "Error: Invalid certificate info for %s"
+msgstr ""
+
+#: etc/inc/vpn.inc:429
+#, php-format
+msgid "Error: Invalid certificate hash info for %s"
+msgstr ""
+
+#: etc/inc/vpn.inc:434
+#, php-format
+msgid "Error: Cannot write IPsec CA file for %s"
+msgstr ""
+
+#: etc/inc/vpn.inc:456
+#, php-format
+msgid "Error: Invalid phase1 certificate reference for %s"
+msgstr ""
+
+#: etc/inc/vpn.inc:464
+#, php-format
+msgid "Error: Cannot write phase1 key file for %s"
+msgstr ""
+
+#: etc/inc/vpn.inc:471
+#, php-format
+msgid "Error: Cannot write phase1 certificate file for %s"
+msgstr ""
+
+#: etc/inc/vpn.inc:916
+#, php-format
+msgid "Ignoring IPsec reload since there are no tunnels on interface %s"
+msgstr ""
+
+#: etc/inc/vpn.inc:923
+msgid "Forcefully reloading IPsec"
+msgstr ""
+
+#: etc/inc/vpn.inc:967
+msgid "Configuring PPTP VPN service... "
+msgstr ""
+
+#: etc/inc/vpn.inc:977
+msgid "Could not kill mpd within 3 seconds. Trying again."
+msgstr ""
+
+#: etc/inc/vpn.inc:1000
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_pptpd_configure()."
+msgstr ""
+
+#: etc/inc/vpn.inc:1119
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_pptpd_configure()."
+msgstr ""
+
+#: etc/inc/vpn.inc:1144
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_pptpd_configure()."
+msgstr ""
+
+#: etc/inc/vpn.inc:1202
+msgid "Configuring PPPoE Server service... "
+msgstr ""
+
+#: etc/inc/vpn.inc:1226
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_pppoe_configure()."
+msgstr ""
+
+#: etc/inc/vpn.inc:1335
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_pppoe_configure()."
+msgstr ""
+
+#: etc/inc/vpn.inc:1362
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_pppoe_configure()."
+msgstr ""
+
+#: etc/inc/vpn.inc:1395 usr/local/www/system_firmware_check.php:141
+msgid "done"
+msgstr ""
+
+#: etc/inc/vpn.inc:1414
+msgid "Configuring l2tp VPN service... "
+msgstr ""
+
+#: etc/inc/vpn.inc:1439
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_l2tp_configure()."
+msgstr ""
+
+#: etc/inc/vpn.inc:1538
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_l2tp_configure()."
+msgstr ""
+
+#: etc/inc/vpn.inc:1564
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_l2tp_configure()."
+msgstr ""
+
+#: etc/inc/xmlparse.inc:93 etc/inc/xmlparse_attr.inc:78
+#, php-format
+msgid "XML error: %1$s at line %2$d cannot occur more than once"
+msgstr ""
+
+#: etc/inc/xmlparse.inc:184 etc/inc/xmlparse_attr.inc:187
+msgid "Error: could not open XML input"
+msgstr ""
+
+#: etc/inc/xmlparse.inc:190
+#, php-format
+msgid "XML error: %1$s at line %2$d in %3$s"
+msgstr ""
+
+#: etc/inc/xmlparse.inc:207 etc/inc/xmlparse_attr.inc:210
+#, php-format
+msgid "XML error: no %s object found!"
+msgstr ""
+
+#: etc/inc/xmlparse_attr.inc:197
+#, php-format
+msgid "XML error: %1$s at line %2$d"
+msgstr ""
+
+#: etc/inc/xmlreader.inc:168
+#, php-format
+msgid "Error returned while trying to parse %s"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:152
+msgid "Unknown method"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:153
+msgid "Invalid return payload: enable debugging to examine incoming payload"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:154
+msgid "Incorrect parameters passed to method"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:155
+msgid "Can't introspect: method unknown"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:156
+msgid "Didn't receive 200 OK from remote server."
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:157
+msgid "The requested method didn't return an XML_RPC_Response object."
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:158
+msgid "Invalid request payload"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:260
+msgid "missing top level xmlrpc element"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:268
+#, php-format
+msgid "xmlrpc element %1$s cannot be child of %2$s"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:431
+msgid "Non-numeric value received in INT or DOUBLE"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:860
+#, php-format
+msgid "send()'s %s parameter must be an XML_RPC_Message object."
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:951
+#, php-format
+msgid ""
+"Connection to proxy server \n"
+" %1$s:%2$s failed. %3$s"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:957
+#, php-format
+msgid ""
+"Connection to RPC server \n"
+" %1$s:%2$s failed. %3$s"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:1330
+msgid "The submitted request did not contain this parameter"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:1361
+msgid "mb_convert_encoding() is not available"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:1470
+#, php-format
+msgid "HTTP error, got response: %s"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:1593
+msgid "Scalar can have only one value"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:1600
+#, php-format
+msgid "Not a scalar type (%s)"
+msgstr ""
+
+#: etc/inc/xmlrpc_client.inc:1636 etc/inc/xmlrpc_client.inc:1652
+#, php-format
+msgid "Already initialized as a [%s]"
+msgstr ""
+
+#: etc/inc/xmlrpc_server.inc:48
+msgid ""
+"This method lists all the methods that the XML-RPC server knows how to "
+"dispatch"
+msgstr ""
+
+#: etc/inc/xmlrpc_server.inc:66
+msgid ""
+"Returns an array of known signatures (an array of arrays) for the method "
+"name passed. If no signatures are known, returns a none-array (test for "
+"type != array to detect missing signature)"
+msgstr ""
+
+#: etc/inc/xmlrpc_server.inc:86
+msgid ""
+"Returns help text if defined for the method passed, otherwise returns an "
+"empty string"
+msgstr ""
+
+#: etc/inc/zeromq.inc:225 etc/inc/zeromq.inc:236
+#, php-format
+msgid "Merged in config (%s sections) from ZeroMQ client."
+msgstr ""
+
+#: usr/local/sbin/gmirror_status_check.php:58
+#, php-format
+msgid "List of mirrors changed. Old: (%s) New: (%s)"
+msgstr ""
+
+#: usr/local/sbin/gmirror_status_check.php:65
+#, php-format
+msgid "Mirror %s status changed from %s to %s."
+msgstr ""
+
+#: usr/local/sbin/gmirror_status_check.php:70
+#, php-format
+msgid "Mirror %s consumer count changed from %d to %d."
+msgstr ""
+
+#: usr/local/sbin/gmirror_status_check.php:77
+#, php-format
+msgid "Mirror %s drive status changed. Old: (%s) New: (%s)"
+msgstr ""
+
+#: usr/local/www/bandwidth_by_ip.php:24
+msgid "Wrong Interface"
+msgstr ""
+
+#: usr/local/www/bandwidth_by_ip.php:119
+msgid "no info"
+msgstr ""
+
+#: usr/local/www/carp_status.php:72
+#, php-format
+msgid ""
+"%s IPs have been disabled. Please note that disabling does not survive a "
+"reboot."
+msgstr ""
+
+#: usr/local/www/carp_status.php:75
+msgid "CARP has been enabled."
+msgstr ""
+
+#: usr/local/www/carp_status.php:99 usr/local/www/carp_status.php:148
+#: usr/local/www/diag_gmirror.php:221 usr/local/www/diag_ipsec.php:49
+#: usr/local/www/diag_ipsec.php:115 usr/local/www/diag_ipsec_leases.php:46
+#: usr/local/www/diag_ipsec_leases.php:89 usr/local/www/diag_ipsec_sad.php:50
+#: usr/local/www/diag_ipsec_spd.php:50 usr/local/www/diag_logs.php:66
+#: usr/local/www/diag_logs_auth.php:57 usr/local/www/diag_logs_dhcp.php:60
+#: usr/local/www/diag_logs_filter.php:123
+#: usr/local/www/diag_logs_filter_dynamic.php:62
+#: usr/local/www/diag_logs_filter_summary.php:35
+#: usr/local/www/diag_logs_gateways.php:67
+#: usr/local/www/diag_logs_ipsec.php:61 usr/local/www/diag_logs_ntpd.php:55
+#: usr/local/www/diag_logs_openvpn.php:46 usr/local/www/diag_logs_ppp.php:58
+#: usr/local/www/diag_logs_relayd.php:56
+#: usr/local/www/diag_logs_resolver.php:67
+#: usr/local/www/diag_logs_routing.php:55
+#: usr/local/www/diag_logs_settings.php:187 usr/local/www/diag_logs_vpn.php:45
+#: usr/local/www/diag_logs_wireless.php:57 usr/local/www/diag_pkglogs.php:86
+#: usr/local/www/easyrule.php:83 usr/local/www/fbegin.inc:324
+#: usr/local/www/pkg_mgr.php:198
+#: usr/local/www/status_captiveportal_expire.php:60
+#: usr/local/www/status_captiveportal_test.php:59
+#: usr/local/www/status_captiveportal_voucher_rolls.php:58
+#: usr/local/www/status_captiveportal_vouchers.php:58
+#: usr/local/www/status_dhcp_leases.php:50
+#: usr/local/www/status_dhcpv6_leases.php:51
+#: usr/local/www/status_filter_reload.php:45
+#: usr/local/www/status_gateway_groups.php:53
+#: usr/local/www/status_gateways.php:52 usr/local/www/status_gateways.php:79
+#: usr/local/www/status_graph.php:114 usr/local/www/status_graph_cpu.php:42
+#: usr/local/www/status_interfaces.php:60
+#: usr/local/www/status_interfaces.php:88 usr/local/www/status_lb_pool.php:63
+#: usr/local/www/status_lb_vs.php:57 usr/local/www/status_lb_vs.php:81
+#: usr/local/www/status_ntpd.php:164 usr/local/www/status_ntpd.php:178
+#: usr/local/www/status_openvpn.php:46 usr/local/www/status_openvpn.php:277
+#: usr/local/www/status_openvpn.php:340 usr/local/www/status_queues.php:124
+#: usr/local/www/status_rrd_graph.php:260
+#: usr/local/www/status_rrd_graph_settings.php:120
+#: usr/local/www/status_services.php:68 usr/local/www/status_services.php:86
+#: usr/local/www/status_upnp.php:59 usr/local/www/status_wireless.php:42
+#: usr/local/www/status_wireless.php:79
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:46
+msgid "Status"
+msgstr ""
+
+#: usr/local/www/carp_status.php:99
+#: usr/local/www/firewall_virtual_ip_edit.php:389
+msgid "CARP"
+msgstr ""
+
+#: usr/local/www/carp_status.php:110
+msgid ""
+"CARP has detected a problem and this unit has been demoted to BACKUP status."
+msgstr ""
+
+#: usr/local/www/carp_status.php:110
+msgid "Check link status on all interfaces with configured CARP VIPs."
+msgstr ""
+
+#: usr/local/www/carp_status.php:130
+msgid "Temporarily Disable CARP"
+msgstr ""
+
+#: usr/local/www/carp_status.php:133
+msgid "Enable CARP"
+msgstr ""
+
+#: usr/local/www/carp_status.php:136
+msgid "Leave Persistent CARP Maintenance Mode"
+msgstr ""
+
+#: usr/local/www/carp_status.php:138
+msgid "Enter Persistent CARP Maintenance Mode"
+msgstr ""
+
+#: usr/local/www/carp_status.php:146
+msgid "CARP Interface"
+msgstr ""
+
+#: usr/local/www/carp_status.php:147 usr/local/www/firewall_nat_out.php:649
+#: usr/local/www/firewall_nat_out_edit.php:712
+#: usr/local/www/system_gateway_groups_edit.php:319
+msgid "Virtual IP"
+msgstr ""
+
+#: usr/local/www/carp_status.php:152
+msgid "Could not locate any defined CARP interfaces."
+msgstr ""
+
+#: usr/local/www/carp_status.php:199 usr/local/www/diag_packet_capture.php:262
+#: usr/local/www/diag_packet_capture.php:348
+#: usr/local/www/firewall_shaper_layer7.php:66
+#: usr/local/www/interfaces_wireless.php:137 usr/local/www/pkg_edit.php:936
+#: usr/local/www/services_ntpd_pps.php:138 usr/local/www/status_graph.php:338
+#: usr/local/www/status_graph_cpu.php:54 usr/local/www/status_queues.php:187
+#: usr/local/www/vpn_ipsec.php:642 usr/local/www/vpn_ipsec_keys.php:180
+#: usr/local/www/vpn_ipsec_keys_edit.php:161
+#: usr/local/www/vpn_pppoe_edit.php:610 usr/local/www/vpn_pptp.php:487
+msgid "Note"
+msgstr ""
+
+#: usr/local/www/carp_status.php:201
+msgid "You can configure high availability sync settings"
+msgstr ""
+
+#: usr/local/www/carp_status.php:201
+#: usr/local/www/firewall_shaper_layer7.php:67
+#: usr/local/www/firewall_virtual_ip.php:308 usr/local/www/interfaces.php:3490
+#: usr/local/www/interfaces.php:3499 usr/local/www/status_queues.php:189
+msgid "here"
+msgstr ""
+
+#: usr/local/www/carp_status.php:205
+msgid "pfSync nodes"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:69
+msgid "Unfortunately we have detected a programming bug."
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:70
+msgid ""
+"Would you like to submit the programming debug logs to the pfSense "
+"developers for inspection?"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:71
+msgid ""
+"Please double check the contents to ensure you are comfortable sending this "
+"information before clicking Yes."
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:72
+msgid "Contents of crash reports"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:74 usr/local/www/diag_defaults.php:61
+#: usr/local/www/diag_defaults.php:71 usr/local/www/diag_defaults.php:83
+#: usr/local/www/halt.php:61 usr/local/www/halt.php:70
+#: usr/local/www/pkg.php:426 usr/local/www/reboot.php:55
+#: usr/local/www/reboot.php:65 usr/local/www/system_firmware.php:231
+msgid "Yes"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:74
+msgid " - Submit this to the developers for inspection"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:75 usr/local/www/diag_defaults.php:48
+#: usr/local/www/diag_defaults.php:84 usr/local/www/halt.php:50
+#: usr/local/www/halt.php:71 usr/local/www/pkg.php:424
+#: usr/local/www/reboot.php:44 usr/local/www/reboot.php:66
+#: usr/local/www/system_firmware.php:232
+msgid "No"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:75
+msgid " - Just delete the crash report and take me back to the Dashboard"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:79 usr/local/www/diag_arp.php:262
+#: usr/local/www/diag_authentication.php:69 usr/local/www/diag_backup.php:593
+#: usr/local/www/diag_confbak.php:110 usr/local/www/diag_defaults.php:53
+#: usr/local/www/diag_dns.php:35 usr/local/www/diag_dump_states.php:72
+#: usr/local/www/diag_dump_states_sources.php:66
+#: usr/local/www/diag_gmirror.php:46 usr/local/www/diag_nanobsd.php:50
+#: usr/local/www/diag_ndp.php:107 usr/local/www/diag_packet_capture.php:88
+#: usr/local/www/diag_patterns.php:63 usr/local/www/diag_ping.php:47
+#: usr/local/www/diag_resetstate.php:65 usr/local/www/diag_routes.php:71
+#: usr/local/www/diag_smart.php:18 usr/local/www/diag_sockets.php:45
+#: usr/local/www/diag_states_summary.php:187 usr/local/www/diag_tables.php:45
+#: usr/local/www/diag_testport.php:49 usr/local/www/diag_traceroute.php:47
+#: usr/local/www/edit.php:42 usr/local/www/exec.php:96
+#: usr/local/www/fbegin.inc:332 usr/local/www/halt.php:55
+#: usr/local/www/reboot.php:49 usr/local/www/system_firmware_auto.php:62
+#: usr/local/www/system_firmware_restorefullbackup.php:105
+msgid "Diagnostics"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:79
+msgid "Crash reporter"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:100
+msgid "Processing..."
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:109
+msgid "Uploading..."
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:119
+#: usr/local/www/services_captiveportal_zones_edit.php:116
+msgid "Continue"
+msgstr ""
+
+#: usr/local/www/crash_reporter.php:119
+msgid " and delete crash report files from local disk."
+msgstr ""
+
+#: usr/local/www/diag_arp.php:262 usr/local/www/fbegin.inc:206
+msgid "ARP Table"
+msgstr ""
+
+#: usr/local/www/diag_arp.php:272 usr/local/www/diag_ndp.php:117
+#: usr/local/www/firewall_rules.php:300
+msgid "Loading, please wait..."
+msgstr ""
+
+#: usr/local/www/diag_arp.php:315 usr/local/www/diag_ndp.php:134
+#: usr/local/www/interfaces.php:1694
+#: usr/local/www/services_captiveportal_mac.php:170
+#: usr/local/www/services_captiveportal_mac_edit.php:102
+#: usr/local/www/services_captiveportal_mac_edit.php:205
+#: usr/local/www/services_dhcp.php:1247
+#: usr/local/www/services_dhcp_edit.php:374 usr/local/www/services_wol.php:145
+#: usr/local/www/services_wol.php:163 usr/local/www/services_wol_edit.php:86
+#: usr/local/www/services_wol_edit.php:144
+#: usr/local/www/status_captiveportal.php:158
+#: usr/local/www/status_dhcp_leases.php:332
+#: usr/local/www/status_interfaces.php:246
+msgid "MAC address"
+msgstr ""
+
+#: usr/local/www/diag_arp.php:316 usr/local/www/diag_ndp.php:135
+#: usr/local/www/interfaces.php:2004
+#: usr/local/www/services_captiveportal_hostname.php:126
+#: usr/local/www/services_captiveportal_hostname_edit.php:179
+#: usr/local/www/services_captiveportal_hostname_edit.php:183
+#: usr/local/www/services_dhcp.php:1249
+#: usr/local/www/services_dhcp_edit.php:404
+#: usr/local/www/services_dhcpv6.php:860
+#: usr/local/www/services_dhcpv6_edit.php:220
+#: usr/local/www/services_dyndns.php:88
+#: usr/local/www/services_dyndns_edit.php:100
+#: usr/local/www/services_dyndns_edit.php:312
+#: usr/local/www/services_rfc2136.php:82
+#: usr/local/www/services_rfc2136_edit.php:74
+#: usr/local/www/services_rfc2136_edit.php:152
+#: usr/local/www/status_dhcp_leases.php:333 usr/local/www/system.php:108
+#: usr/local/www/system.php:312
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:83
+msgid "Hostname"
+msgstr ""
+
+#: usr/local/www/diag_arp.php:317 usr/local/www/diag_logs_filter.php:203
+#: usr/local/www/diag_logs_filter.php:237 usr/local/www/diag_ndp.php:136
+#: usr/local/www/diag_packet_capture.php:243
+#: usr/local/www/firewall_nat_1to1.php:182
+#: usr/local/www/firewall_nat_1to1_edit.php:117
+#: usr/local/www/firewall_nat_1to1_edit.php:295
+#: usr/local/www/firewall_nat_edit.php:197
+#: usr/local/www/firewall_nat_edit.php:200
+#: usr/local/www/firewall_nat_edit.php:495
+#: usr/local/www/firewall_nat_npt.php:107
+#: usr/local/www/firewall_nat_npt_edit.php:108
+#: usr/local/www/firewall_nat_npt_edit.php:173
+#: usr/local/www/firewall_nat_out.php:305
+#: usr/local/www/firewall_nat_out.php:542
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_nat_out_edit.php:469
+#: usr/local/www/firewall_rules_edit.php:906
+#: usr/local/www/firewall_virtual_ip.php:240
+#: usr/local/www/firewall_virtual_ip_edit.php:397
+#: usr/local/www/interfaces_assign.php:482
+#: usr/local/www/interfaces_bridge.php:118
+#: usr/local/www/interfaces_gif.php:112 usr/local/www/interfaces_gre.php:113
+#: usr/local/www/interfaces_groups_edit.php:276
+#: usr/local/www/interfaces_lagg.php:118 usr/local/www/interfaces_ppps.php:110
+#: usr/local/www/interfaces_qinq.php:121 usr/local/www/interfaces_vlan.php:115
+#: usr/local/www/interfaces_wireless.php:110
+#: usr/local/www/services_captiveportal.php:211
+#: usr/local/www/services_dhcp_relay.php:73
+#: usr/local/www/services_dhcpv6_relay.php:74
+#: usr/local/www/services_dyndns.php:86
+#: usr/local/www/services_igmpproxy_edit.php:166
+#: usr/local/www/services_wol.php:131 usr/local/www/services_wol.php:162
+#: usr/local/www/services_wol_edit.php:86
+#: usr/local/www/services_wol_edit.php:130 usr/local/www/status_graph.php:208
+#: usr/local/www/system_gateways.php:218
+#: usr/local/www/system_gateways_edit.php:114
+#: usr/local/www/system_gateways_edit.php:655
+#: usr/local/www/system_routes.php:236 usr/local/www/vpn_ipsec_phase1.php:610
+#: usr/local/www/vpn_l2tp.php:309 usr/local/www/vpn_openvpn_client.php:530
+#: usr/local/www/vpn_openvpn_server.php:850 usr/local/www/vpn_pppoe.php:104
+#: usr/local/www/vpn_pppoe_edit.php:383
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:45
+msgid "Interface"
+msgstr ""
+
+#: usr/local/www/diag_arp.php:343
+msgid "NOTE: Local IPv6 peers use"
+msgstr ""
+
+#: usr/local/www/diag_arp.php:343
+msgid "NDP"
+msgstr ""
+
+#: usr/local/www/diag_arp.php:343
+msgid "instead of ARP"
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:52
+msgid "is not a valid authentication server"
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:55
+msgid "A username and password must be specified."
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:59
+#: usr/local/www/diag_logs_vpn.php:177
+#: usr/local/www/system_groupmanager.php:533
+#: usr/local/www/system_usermanager.php:99
+#: usr/local/www/system_usermanager.php:959
+#: usr/local/www/vpn_l2tp_users_edit.php:39
+#: usr/local/www/vpn_pptp_users_edit.php:138
+msgid "User"
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:59
+msgid "authenticated successfully."
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:61
+msgid "This user is a member of these groups"
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:65
+msgid "Authentication failed."
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:69 usr/local/www/fbegin.inc:207
+#: usr/local/www/interfaces.php:3238
+#: usr/local/www/services_captiveportal.php:662
+#: usr/local/www/services_captiveportal.php:1039
+msgid "Authentication"
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:91
+#: usr/local/www/system_authservers.php:85
+#: usr/local/www/system_usermanager_settings.php:141
+msgid "Authentication Server"
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:107
+#: usr/local/www/firewall_aliases_edit.php:602
+#: usr/local/www/interfaces.php:2619 usr/local/www/interfaces.php:2693
+#: usr/local/www/interfaces.php:2802
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+#: usr/local/www/interfaces_ppps_edit.php:523
+#: usr/local/www/services_dyndns_edit.php:104
+#: usr/local/www/services_dyndns_edit.php:356
+#: usr/local/www/status_captiveportal.php:159
+#: usr/local/www/system_usermanager.php:205
+#: usr/local/www/system_usermanager.php:210
+#: usr/local/www/system_usermanager.php:215
+#: usr/local/www/system_usermanager.php:533
+#: usr/local/www/system_usermanager.php:904
+#: usr/local/www/vpn_l2tp_users.php:103
+#: usr/local/www/vpn_l2tp_users_edit.php:83
+#: usr/local/www/vpn_l2tp_users_edit.php:86
+#: usr/local/www/vpn_l2tp_users_edit.php:159
+#: usr/local/www/vpn_openvpn_client.php:621
+#: usr/local/www/vpn_openvpn_client.php:685
+#: usr/local/www/vpn_pppoe_edit.php:548 usr/local/www/vpn_pptp_users.php:100
+#: usr/local/www/vpn_pptp_users_edit.php:79
+#: usr/local/www/vpn_pptp_users_edit.php:82
+#: usr/local/www/vpn_pptp_users_edit.php:150
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:107
+msgid "Username"
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:113 usr/local/www/interfaces.php:2625
+#: usr/local/www/interfaces.php:2699 usr/local/www/interfaces.php:2808
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+#: usr/local/www/interfaces_ppps_edit.php:529
+#: usr/local/www/services_dyndns_edit.php:102
+#: usr/local/www/services_dyndns_edit.php:365
+#: usr/local/www/system_advanced_notifications.php:232
+#: usr/local/www/system_usermanager.php:211
+#: usr/local/www/system_usermanager.php:216
+#: usr/local/www/system_usermanager.php:540
+#: usr/local/www/system_usermanager_passwordmg.php:51
+#: usr/local/www/system_usermanager_passwordmg.php:111
+#: usr/local/www/system_usermanager_passwordmg.php:115
+#: usr/local/www/vpn_l2tp_users_edit.php:86
+#: usr/local/www/vpn_l2tp_users_edit.php:165
+#: usr/local/www/vpn_openvpn_client.php:631
+#: usr/local/www/vpn_openvpn_client.php:695
+#: usr/local/www/vpn_pppoe_edit.php:549
+#: usr/local/www/vpn_pptp_users_edit.php:82
+#: usr/local/www/vpn_pptp_users_edit.php:156
+msgid "Password"
+msgstr ""
+
+#: usr/local/www/diag_authentication.php:121 usr/local/www/diag_smart.php:370
+#: usr/local/www/diag_testport.php:181
+msgid "Test"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:162
+msgid "Restored base_package menus after configuration restore."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:181 usr/local/www/fbegin.inc:128
+#: usr/local/www/firewall_aliases.php:157
+#: usr/local/www/firewall_aliases_edit.php:53
+#: usr/local/www/firewall_aliases_import.php:50
+#: usr/local/www/firewall_aliases_import.php:68
+#: usr/local/www/services_dnsmasq_edit.php:244
+#: usr/local/www/services_unbound_host_edit.php:247
+msgid "Aliases"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:183
+msgid "Captive Portal Vouchers"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:185 usr/local/www/fbegin.inc:144
+msgid "DHCP Server"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:186 usr/local/www/services_dhcpv6.php:533
+#: usr/local/www/services_dhcpv6.php:543
+#: usr/local/www/services_router_advertisements.php:262
+msgid "DHCPv6 Server"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:187
+msgid "Firewall Rules"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:188
+#: usr/local/www/diag_logs_filter_summary.php:48 usr/local/www/fbegin.inc:180
+#: usr/local/www/fbegin.inc:292 usr/local/www/interfaces.php:1406
+#: usr/local/www/interfaces_assign.php:44
+#: usr/local/www/interfaces_bridge.php:87
+#: usr/local/www/interfaces_bridge_edit.php:240
+#: usr/local/www/interfaces_gif.php:81
+#: usr/local/www/interfaces_gif_edit.php:136
+#: usr/local/www/interfaces_gre.php:82
+#: usr/local/www/interfaces_gre_edit.php:130
+#: usr/local/www/interfaces_groups.php:64
+#: usr/local/www/interfaces_groups_edit.php:45
+#: usr/local/www/interfaces_lagg.php:87
+#: usr/local/www/interfaces_lagg_edit.php:137
+#: usr/local/www/interfaces_ppps_edit.php:389
+#: usr/local/www/interfaces_qinq.php:90
+#: usr/local/www/interfaces_qinq_edit.php:40
+#: usr/local/www/interfaces_vlan.php:84
+#: usr/local/www/interfaces_vlan_edit.php:152
+#: usr/local/www/interfaces_wireless.php:79
+#: usr/local/www/interfaces_wireless_edit.php:151
+#: usr/local/www/services_captiveportal.php:523
+#: usr/local/www/services_captiveportal_zones.php:81
+#: usr/local/www/services_dnsmasq.php:269
+#: usr/local/www/status_interfaces.php:60
+msgid "Interfaces"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:189
+msgid "IPSEC"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:190 usr/local/www/fbegin.inc:129
+#: usr/local/www/firewall_nat.php:167 usr/local/www/firewall_nat_1to1.php:148
+#: usr/local/www/firewall_nat_1to1_edit.php:227
+#: usr/local/www/firewall_nat_edit.php:457
+#: usr/local/www/firewall_nat_npt.php:81
+#: usr/local/www/firewall_nat_npt_edit.php:148
+#: usr/local/www/firewall_nat_out.php:214
+#: usr/local/www/firewall_nat_out_edit.php:343
+#: usr/local/www/firewall_virtual_ip.php:307
+msgid "NAT"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:192 usr/local/www/fbegin.inc:437
+#: usr/local/www/pkg_mgr.php:59 usr/local/www/pkg_mgr.php:106
+#: usr/local/www/pkg_mgr_install.php:58 usr/local/www/pkg_mgr_installed.php:52
+#: usr/local/www/pkg_mgr_installed.php:81
+msgid "Package Manager"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:193
+msgid "PPTP Server"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:194
+msgid "RRD Data"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:195
+msgid "Scheduled Tasks"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:196
+msgid "Syslog"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:197 usr/local/www/diag_logs.php:78
+#: usr/local/www/diag_logs_auth.php:69 usr/local/www/diag_logs_dhcp.php:72
+#: usr/local/www/diag_logs_filter.php:135
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/diag_logs_filter_summary.php:189
+#: usr/local/www/diag_logs_gateways.php:80
+#: usr/local/www/diag_logs_ipsec.php:73 usr/local/www/diag_logs_ntpd.php:67
+#: usr/local/www/diag_logs_openvpn.php:71 usr/local/www/diag_logs_ppp.php:69
+#: usr/local/www/diag_logs_relayd.php:68
+#: usr/local/www/diag_logs_resolver.php:80
+#: usr/local/www/diag_logs_routing.php:67
+#: usr/local/www/diag_logs_settings.php:267
+#: usr/local/www/diag_logs_vpn.php:127 usr/local/www/diag_logs_wireless.php:69
+#: usr/local/www/fbegin.inc:284 usr/local/www/fbegin.inc:437
+#: usr/local/www/pkg_mgr.php:59 usr/local/www/pkg_mgr.php:106
+#: usr/local/www/pkg_mgr_install.php:58 usr/local/www/pkg_mgr_installed.php:52
+#: usr/local/www/pkg_mgr_installed.php:81
+#: usr/local/www/pkg_mgr_settings.php:63
+#: usr/local/www/status_rrd_graph.php:416
+#: usr/local/www/status_rrd_graph_img.php:44
+#: usr/local/www/status_rrd_graph_settings.php:54
+#: usr/local/www/status_rrd_graph_settings.php:135 usr/local/www/system.php:76
+#: usr/local/www/system.php:289 usr/local/www/system.php:309
+#: usr/local/www/system_advanced_admin.php:275
+#: usr/local/www/system_advanced_firewall.php:233
+#: usr/local/www/system_advanced_misc.php:245
+#: usr/local/www/system_advanced_network.php:154
+#: usr/local/www/system_advanced_notifications.php:164
+#: usr/local/www/system_advanced_sysctl.php:135
+#: usr/local/www/system_authservers.php:45
+#: usr/local/www/system_camanager.php:52
+#: usr/local/www/system_certmanager.php:58
+#: usr/local/www/system_crlmanager.php:47
+#: usr/local/www/system_firmware.php:103 usr/local/www/system_firmware.php:202
+#: usr/local/www/system_firmware_check.php:50
+#: usr/local/www/system_firmware_settings.php:87
+#: usr/local/www/system_gateway_groups.php:99
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/system_gateways.php:182
+#: usr/local/www/system_gateways_edit.php:523
+#: usr/local/www/system_groupmanager.php:53
+#: usr/local/www/system_groupmanager_addprivs.php:57
+#: usr/local/www/system_hasync.php:101 usr/local/www/system_routes.php:199
+#: usr/local/www/system_routes_edit.php:212
+#: usr/local/www/system_usermanager.php:58
+#: usr/local/www/system_usermanager_passwordmg.php:44
+#: usr/local/www/system_usermanager_settings.php:50
+msgid "System"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:198
+msgid "Static routes"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:199
+msgid "System tunables"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:200
+msgid "SNMP Server"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:201 usr/local/www/fbegin.inc:132
+#: usr/local/www/firewall_shaper.php:55
+#: usr/local/www/firewall_shaper_layer7.php:60
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_wizards.php:74
+msgid "Traffic Shaper"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:202
+msgid "VLANS"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:203 usr/local/www/fbegin.inc:159
+#: usr/local/www/services_wol.php:116 usr/local/www/services_wol.php:128
+#: usr/local/www/services_wol_edit.php:116
+msgid "Wake on LAN"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:207
+msgid "ALL"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:248 usr/local/www/diag_backup.php:715
+#: usr/local/www/diag_backup.php:752
+msgid "Restore configuration"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:250
+msgid "Reinstall"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:252 usr/local/www/diag_backup.php:774
+msgid "Clear Package Lock"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:254 usr/local/www/diag_tables.php:157
+#: usr/local/www/diag_tables.php:166 usr/local/www/exec.php:279
+#: usr/local/www/exec.php:289
+#: usr/local/www/system_firmware_restorefullbackup.php:167
+msgid "Download"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:256
+msgid "Restore version"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:271
+msgid "You must supply and confirm the password for encryption."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:273 usr/local/www/diag_backup.php:350
+msgid "The supplied 'Password' and 'Confirm' field values must match."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:348
+msgid "You must supply and confirm the password for decryption."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:360
+#, php-format
+msgid "Warning, could not read file %s"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:366
+msgid ""
+"The uploaded file does not appear to contain an encrypted pfsense "
+"configuration."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:373
+msgid "Upgrading m0n0wall configuration to pfsense."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:381 usr/local/www/diag_backup.php:384
+msgid ""
+"You have selected to restore an area but we could not locate the correct xml "
+"tag."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:396
+msgid ""
+"The configuration area has been restored. You may need to reboot the "
+"firewall."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:401
+#, php-format
+msgid ""
+"You have selected to restore the full configuration but we could not locate "
+"a %s tag."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:527
+msgid "The m0n0wall configuration has been restored and upgraded to pfSense."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:555 usr/local/www/diag_backup.php:579
+msgid "The configuration could not be restored."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:560
+msgid "The configuration could not be restored (file upload error)."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:573
+msgid ""
+"XXX - this feature may hose your config (do NOT backrev configs!) - billm"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:582
+msgid "No version selected."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:593
+msgid "Backup/restore"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:636
+#: usr/local/www/system_firmware_restorefullbackup.php:117
+msgid "The firewall configuration has been changed."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:636
+#: usr/local/www/system_firmware_restorefullbackup.php:117
+msgid "The firewall is now rebooting."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:645 usr/local/www/diag_confbak.php:151
+msgid "Config History"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:646 usr/local/www/diag_confbak.php:152
+#: usr/local/www/fbegin.inc:208
+msgid "Backup/Restore"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:656
+msgid "Backup configuration"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:661
+msgid "Click this button to download the system configuration in XML format."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:661
+msgid "Backup area:"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:668
+msgid "Do not backup package information."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:678
+msgid "Encrypt this configuration file."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:686
+msgid ""
+"Do not backup RRD data (NOTE: RRD Data can consume 4+ megabytes of config."
+"xml space!)"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:701
+msgid "confirm:"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:708
+msgid "Download configuration"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:720
+msgid "Open a"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:720
+msgid ""
+"configuration XML file and click the button below to restore the "
+"configuration."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:722
+msgid "Restore area:"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:730
+msgid "Configuration file is encrypted."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:737
+msgid "Password :"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:745
+msgid "confirm :"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:753 usr/local/www/diag_ipsec.php:498
+#: usr/local/www/diag_ipsec_leases.php:125
+#: usr/local/www/diag_ipsec_sad.php:135 usr/local/www/diag_ipsec_spd.php:132
+#: usr/local/www/diag_logs_settings.php:469
+#: usr/local/www/diag_packet_capture.php:339 usr/local/www/diag_routes.php:207
+#: usr/local/www/firewall_aliases.php:291
+#: usr/local/www/firewall_nat_1to1.php:339
+#: usr/local/www/firewall_nat_out.php:637
+#: usr/local/www/firewall_schedule.php:241
+#: usr/local/www/firewall_virtual_ip.php:306
+#: usr/local/www/firewall_virtual_ip_edit.php:520
+#: usr/local/www/interfaces.php:2749 usr/local/www/interfaces_bridge.php:155
+#: usr/local/www/interfaces_bridge_edit.php:467
+#: usr/local/www/interfaces_bridge_edit.php:511
+#: usr/local/www/interfaces_bridge_edit.php:555
+#: usr/local/www/interfaces_gif.php:138 usr/local/www/interfaces_gre.php:139
+#: usr/local/www/interfaces_groups.php:150
+#: usr/local/www/interfaces_lagg.php:144
+#: usr/local/www/interfaces_ppps_edit.php:633
+#: usr/local/www/interfaces_qinq.php:156 usr/local/www/interfaces_vlan.php:141
+#: usr/local/www/load_balancer_virtual_server_edit.php:289
+#: usr/local/www/services_captiveportal.php:1087
+#: usr/local/www/services_captiveportal_filemanager.php:213
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/services_captiveportal_ip.php:172
+#: usr/local/www/services_captiveportal_mac.php:215
+#: usr/local/www/services_captiveportal_vouchers.php:642
+#: usr/local/www/services_dhcp.php:1007 usr/local/www/services_dhcp.php:1032
+#: usr/local/www/services_dhcp.php:1227 usr/local/www/services_dhcpv6.php:688
+#: usr/local/www/services_dhcpv6.php:840
+#: usr/local/www/services_dnsmasq.php:323
+#: usr/local/www/services_dyndns.php:189
+#: usr/local/www/services_dyndns_edit.php:317
+#: usr/local/www/services_dyndns_edit.php:434
+#: usr/local/www/services_igmpproxy.php:161
+#: usr/local/www/services_rfc2136_edit.php:224
+#: usr/local/www/services_unbound.php:394 usr/local/www/services_wol.php:211
+#: usr/local/www/status_rrd_graph_settings.php:247
+#: usr/local/www/system_advanced_network.php:268
+#: usr/local/www/system_advanced_network.php:279
+#: usr/local/www/system_advanced_network.php:290
+#: usr/local/www/system_gateway_groups.php:206
+#: usr/local/www/system_routes.php:372 usr/local/www/vpn_l2tp.php:456
+msgid "Note:"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:753
+msgid "The firewall will reboot after restoring the configuration."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:761
+msgid "Package Functions"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:767
+msgid ""
+"Click this button to reinstall all system packages. This may take a while."
+msgstr ""
+
+#: usr/local/www/diag_backup.php:768
+msgid "Reinstall packages"
+msgstr ""
+
+#: usr/local/www/diag_backup.php:773
+msgid ""
+"Click this button to clear the package lock if a package fails to reinstall "
+"properly after an upgrade."
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:55 usr/local/www/diag_confbak.php:185
+#: usr/local/www/diag_gmirror.php:74 usr/local/www/diag_gmirror.php:204
+msgid "Confirm"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:64
+#, php-format
+msgid "Successfully reverted to timestamp %1$s with description \"%2$s\"."
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:64 usr/local/www/diag_confbak.php:70
+#: usr/local/www/diag_confbak.php:123 usr/local/www/diag_confbak.php:184
+#: usr/local/www/diag_confbak.php:231 usr/local/www/diag_confbak.php:241
+#: usr/local/www/firewall_nat_edit.php:876
+#: usr/local/www/firewall_nat_edit.php:884
+#: usr/local/www/firewall_nat_out_edit.php:805
+#: usr/local/www/firewall_nat_out_edit.php:816
+#: usr/local/www/firewall_rules_edit.php:1721
+#: usr/local/www/firewall_rules_edit.php:1729
+msgid "n/j/y H:i:s"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:66
+msgid "Unable to revert to the selected configuration."
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:70
+#, php-format
+msgid "Deleted backup with timestamp %1$s and description \"%2$s\"."
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:110
+msgid "Configuration History"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:123
+msgid "Configuration diff from"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:123 usr/local/www/diag_dump_states.php:213
+#: usr/local/www/diag_dump_states_sources.php:182
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_nat_edit.php:755
+#: usr/local/www/services_captiveportal_hostname.php:181
+#: usr/local/www/services_dhcp.php:864 usr/local/www/services_dhcpv6.php:606
+#: usr/local/www/services_dhcpv6.php:613
+msgid "to"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:165 usr/local/www/diag_gmirror.php:186
+msgid "Confirm Action"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:171 usr/local/www/diag_gmirror.php:191
+msgid "Please confirm the selected action"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:173 usr/local/www/diag_gmirror.php:193
+#: usr/local/www/diag_logs_filter.php:174 usr/local/www/diag_logs_vpn.php:176
+#: usr/local/www/firewall_rules_edit.php:836
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:485
+#: usr/local/www/services_captiveportal_mac_edit.php:102
+#: usr/local/www/services_captiveportal_mac_edit.php:186
+#: usr/local/www/services_unbound_acls.php:215
+#: usr/local/www/services_unbound_acls.php:322
+msgid "Action"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:175
+msgid "Restore from Configuration Backup"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:179
+msgid "Remove Configuration Backup"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:183
+msgid "Target Configuration"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:184
+#, php-format
+msgid "Timestamp %1$s"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:192
+msgid "Backup Count"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:197
+msgid ""
+"Enter the number of older configurations to keep in the local backup cache. "
+"By default this is 30 for a full install or 5 on NanoBSD."
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:199 usr/local/www/diag_logs_settings.php:464
+#: usr/local/www/diag_nanobsd.php:199 usr/local/www/diag_smart.php:244
+#: usr/local/www/edit.php:189 usr/local/www/firewall_aliases_edit.php:851
+#: usr/local/www/firewall_aliases_import.php:215
+#: usr/local/www/firewall_nat_1to1_edit.php:536
+#: usr/local/www/firewall_nat_edit.php:896
+#: usr/local/www/firewall_nat_npt_edit.php:278
+#: usr/local/www/firewall_nat_out.php:265
+#: usr/local/www/firewall_nat_out_edit.php:828
+#: usr/local/www/firewall_rules_edit.php:1261
+#: usr/local/www/firewall_rules_edit.php:1738
+#: usr/local/www/firewall_schedule_edit.php:1168
+#: usr/local/www/firewall_shaper.php:351
+#: usr/local/www/firewall_shaper_layer7.php:566
+#: usr/local/www/firewall_shaper_vinterface.php:319
+#: usr/local/www/firewall_virtual_ip_edit.php:509
+#: usr/local/www/interfaces.php:3379 usr/local/www/interfaces_assign.php:553
+#: usr/local/www/interfaces_bridge_edit.php:604
+#: usr/local/www/interfaces_gif_edit.php:233
+#: usr/local/www/interfaces_gre_edit.php:236
+#: usr/local/www/interfaces_groups_edit.php:333
+#: usr/local/www/interfaces_lagg_edit.php:235
+#: usr/local/www/interfaces_ppps_edit.php:795
+#: usr/local/www/interfaces_qinq_edit.php:397
+#: usr/local/www/interfaces_vlan_edit.php:203
+#: usr/local/www/interfaces_wireless_edit.php:201
+#: usr/local/www/load_balancer_monitor_edit.php:358
+#: usr/local/www/load_balancer_pool_edit.php:334
+#: usr/local/www/load_balancer_relay_action_edit.php:558
+#: usr/local/www/load_balancer_relay_protocol_edit.php:281
+#: usr/local/www/load_balancer_setting.php:162 usr/local/www/pkg_edit.php:435
+#: usr/local/www/pkg_mgr_settings.php:143
+#: usr/local/www/services_captiveportal.php:1081
+#: usr/local/www/services_captiveportal_hostname_edit.php:206
+#: usr/local/www/services_captiveportal_ip_edit.php:226
+#: usr/local/www/services_captiveportal_mac_edit.php:244
+#: usr/local/www/services_captiveportal_vouchers.php:636
+#: usr/local/www/services_captiveportal_vouchers_edit.php:208
+#: usr/local/www/services_dhcp.php:1222
+#: usr/local/www/services_dhcp_edit.php:545
+#: usr/local/www/services_dhcp_relay.php:192
+#: usr/local/www/services_dhcpv6.php:835
+#: usr/local/www/services_dhcpv6_edit.php:249
+#: usr/local/www/services_dhcpv6_relay.php:193
+#: usr/local/www/services_dnsmasq.php:318
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:164
+#: usr/local/www/services_dnsmasq_edit.php:305
+#: usr/local/www/services_dyndns_edit.php:424
+#: usr/local/www/services_igmpproxy.php:155
+#: usr/local/www/services_igmpproxy_edit.php:282
+#: usr/local/www/services_ntpd.php:411 usr/local/www/services_ntpd_gps.php:574
+#: usr/local/www/services_ntpd_pps.php:217
+#: usr/local/www/services_rfc2136_edit.php:214
+#: usr/local/www/services_router_advertisements.php:407
+#: usr/local/www/services_snmp.php:438 usr/local/www/services_unbound.php:382
+#: usr/local/www/services_unbound_acls.php:117
+#: usr/local/www/services_unbound_acls.php:310
+#: usr/local/www/services_unbound_domainoverride_edit.php:159
+#: usr/local/www/services_unbound_host_edit.php:310
+#: usr/local/www/services_wol_edit.php:161
+#: usr/local/www/status_lb_pool.php:218
+#: usr/local/www/status_rrd_graph_settings.php:236
+#: usr/local/www/system.php:521 usr/local/www/system_advanced_admin.php:611
+#: usr/local/www/system_advanced_firewall.php:559
+#: usr/local/www/system_advanced_misc.php:651
+#: usr/local/www/system_advanced_network.php:330
+#: usr/local/www/system_advanced_notifications.php:101
+#: usr/local/www/system_advanced_notifications.php:343
+#: usr/local/www/system_advanced_sysctl.php:114
+#: usr/local/www/system_advanced_sysctl.php:269
+#: usr/local/www/system_authservers.php:791
+#: usr/local/www/system_camanager.php:369
+#: usr/local/www/system_camanager.php:580
+#: usr/local/www/system_certmanager.php:197
+#: usr/local/www/system_certmanager.php:595
+#: usr/local/www/system_certmanager.php:1016
+#: usr/local/www/system_crlmanager.php:298
+#: usr/local/www/system_crlmanager.php:401
+#: usr/local/www/system_crlmanager.php:433
+#: usr/local/www/system_firmware_settings.php:274
+#: usr/local/www/system_gateway_groups_edit.php:347
+#: usr/local/www/system_gateways_edit.php:861
+#: usr/local/www/system_groupmanager.php:460
+#: usr/local/www/system_groupmanager_addprivs.php:226
+#: usr/local/www/system_routes_edit.php:332
+#: usr/local/www/system_usermanager.php:882
+#: usr/local/www/system_usermanager_addprivs.php:195
+#: usr/local/www/system_usermanager_passwordmg.php:133
+#: usr/local/www/system_usermanager_settings.php:163
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:124
+#: usr/local/www/vpn_ipsec.php:266 usr/local/www/vpn_ipsec_keys_edit.php:150
+#: usr/local/www/vpn_ipsec_mobile.php:659
+#: usr/local/www/vpn_ipsec_phase1.php:924
+#: usr/local/www/vpn_ipsec_phase2.php:833
+#: usr/local/www/vpn_ipsec_settings.php:297 usr/local/www/vpn_l2tp.php:450
+#: usr/local/www/vpn_l2tp_users_edit.php:182
+#: usr/local/www/vpn_openvpn_client.php:1100
+#: usr/local/www/vpn_openvpn_csc.php:732
+#: usr/local/www/vpn_openvpn_server.php:1816
+#: usr/local/www/vpn_pppoe_edit.php:604 usr/local/www/vpn_pptp.php:482
+#: usr/local/www/vpn_pptp_users_edit.php:173
+msgid "Save"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:204
+msgid ""
+"NOTE: Be aware of how much space is consumed by backups before adjusting "
+"this value. Current space used by backups: "
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:214
+msgid ""
+"To view the differences between an older configuration and a newer "
+"configuration, select the older configuration using the left column of radio "
+"options and select the newer configuration in the right column, then press "
+"the Diff button."
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:219 usr/local/www/diag_confbak.php:275
+msgid "Diff"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:220
+#: usr/local/www/system_firmware_restorefullbackup.php:141
+msgid "Date"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:221 usr/local/www/pkg_mgr_installed.php:125
+#: usr/local/www/widgets/widgets/system_information.widget.php:122
+msgid "Version"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:222 usr/local/www/diag_gmirror.php:288
+#: usr/local/www/diag_system_pftop.php:138
+#: usr/local/www/diag_system_pftop.php:157
+#: usr/local/www/services_captiveportal_filemanager.php:161
+#: usr/local/www/system_firmware_restorefullbackup.php:142
+msgid "Size"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:223
+msgid "Configuration Change"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:235
+msgid "Current"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:243 usr/local/www/diag_ipsec.php:143
+#: usr/local/www/diag_ipsec.php:151 usr/local/www/diag_ipsec.php:158
+#: usr/local/www/diag_ipsec.php:164 usr/local/www/diag_ipsec.php:173
+#: usr/local/www/diag_ipsec.php:188 usr/local/www/diag_ipsec.php:198
+#: usr/local/www/diag_ipsec.php:204 usr/local/www/diag_ipsec.php:302
+#: usr/local/www/diag_ipsec.php:321 usr/local/www/diag_ipsec.php:409
+#: usr/local/www/diag_ipsec.php:418 usr/local/www/diag_ipsec.php:427
+#: usr/local/www/diag_ipsec.php:436
+#: usr/local/www/widgets/widgets/gateways.widget.php:123
+msgid "Unknown"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:263
+msgid "Revert to this configuration"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:266
+msgid "Remove this backup"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:269
+msgid "Download this backup"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:281
+msgid "No backups found."
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:53
+msgid "Factory defaults"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:62
+msgid ""
+"The system has been reset to factory defaults and is now rebooting. This may "
+"take a few minutes, depending on your hardware."
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:71
+msgid "If you click"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:71
+msgid "the firewall will:"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:73
+msgid "Reset to factory defaults"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:74
+msgid "LAN IP address will be reset to 192.168.1.1"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:75
+msgid "System will be configured as a DHCP server on the default LAN interface"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:76
+msgid "Reboot after changes are installed"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:77
+msgid ""
+"WAN interface will be set to obtain an address automatically from a DHCP "
+"server"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:78
+msgid "webConfigurator admin username will be reset to 'admin'"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:79
+msgid "webConfigurator admin password will be reset to"
+msgstr ""
+
+#: usr/local/www/diag_defaults.php:81
+msgid "Are you sure you want to proceed?"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:35 usr/local/www/diag_dns.php:277
+#: usr/local/www/fbegin.inc:210
+msgid "DNS Lookup"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:101
+msgid "Host must be a valid hostname or IP address."
+msgstr ""
+
+#: usr/local/www/diag_dns.php:110
+msgid "No response"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:143
+msgid "No record found"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:156 usr/local/www/diag_tables.php:137
+#: usr/local/www/interfaces_ppps_edit.php:673
+#: usr/local/www/load_balancer_virtual_server.php:134
+#: usr/local/www/load_balancer_virtual_server_edit.php:76
+#: usr/local/www/load_balancer_virtual_server_edit.php:81
+#: usr/local/www/load_balancer_virtual_server_edit.php:178
+#: usr/local/www/system_advanced_notifications.php:225
+msgid "IP Address"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:157 usr/local/www/system_authservers.php:807
+msgid "Host Name"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:160 usr/local/www/diag_dns.php:234
+#: usr/local/www/diag_logs_settings.php:421
+#: usr/local/www/diag_logs_settings.php:425
+#: usr/local/www/diag_logs_settings.php:429
+#: usr/local/www/services_rfc2136.php:81
+#: usr/local/www/services_rfc2136_edit.php:187
+#: usr/local/www/status_ntpd.php:179 usr/local/www/vpn_ipsec_mobile.php:547
+#: usr/local/www/vpn_ipsec_mobile.php:553
+#: usr/local/www/vpn_ipsec_mobile.php:559
+#: usr/local/www/vpn_ipsec_mobile.php:565
+#: usr/local/www/vpn_ipsec_mobile.php:589
+#: usr/local/www/vpn_ipsec_mobile.php:595
+#: usr/local/www/vpn_openvpn_client.php:445
+#: usr/local/www/vpn_openvpn_client.php:1117
+#: usr/local/www/vpn_openvpn_csc.php:316 usr/local/www/vpn_openvpn_csc.php:551
+#: usr/local/www/vpn_openvpn_csc.php:559 usr/local/www/vpn_openvpn_csc.php:567
+#: usr/local/www/vpn_openvpn_csc.php:575 usr/local/www/vpn_openvpn_csc.php:603
+#: usr/local/www/vpn_openvpn_csc.php:611 usr/local/www/vpn_openvpn_csc.php:699
+#: usr/local/www/vpn_openvpn_csc.php:707
+#: usr/local/www/vpn_openvpn_server.php:479
+#: usr/local/www/vpn_openvpn_server.php:743
+#: usr/local/www/vpn_openvpn_server.php:1554
+#: usr/local/www/vpn_openvpn_server.php:1562
+#: usr/local/www/vpn_openvpn_server.php:1570
+#: usr/local/www/vpn_openvpn_server.php:1578
+#: usr/local/www/vpn_openvpn_server.php:1626
+#: usr/local/www/vpn_openvpn_server.php:1634
+#: usr/local/www/vpn_openvpn_server.php:1722
+#: usr/local/www/vpn_openvpn_server.php:1730
+msgid "Server"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:160
+msgid "Query Time"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:182
+msgid "Resolve DNS hostname or IP"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:185 usr/local/www/system_authservers.php:168
+#: usr/local/www/system_authservers.php:191
+msgid "Hostname or IP"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:229
+msgid "Resolution time per server"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:237
+msgid "Query time"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:261
+msgid "More Information:"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:263 usr/local/www/diag_ping.php:47
+#: usr/local/www/diag_ping.php:97 usr/local/www/diag_ping.php:144
+#: usr/local/www/fbegin.inc:222
+msgid "Ping"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:266
+msgid ""
+"NOTE: The following links are to external services, so their reliability "
+"cannot be guaranteed."
+msgstr ""
+
+#: usr/local/www/diag_dns.php:267
+msgid "IP WHOIS @ DNS Stuff"
+msgstr ""
+
+#: usr/local/www/diag_dns.php:268
+msgid "IP Info @ DNS Stuff"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:52
+#: usr/local/www/diag_dump_states_sources.php:52
+#: usr/local/www/status_openvpn.php:63
+#: usr/local/www/widgets/widgets/openvpn.widget.php:20
+msgid "invalid input"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:72
+msgid "Show States"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:108
+#: usr/local/www/diag_dump_states_sources.php:96
+#: usr/local/www/status_openvpn.php:134
+#: usr/local/www/widgets/widgets/openvpn.widget.php:87
+msgid "An error occurred."
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:124
+#: usr/local/www/diag_dump_states_sources.php:112
+#: usr/local/www/diag_resetstate.php:78
+#: usr/local/www/diag_states_summary.php:153
+#: usr/local/www/diag_states_summary.php:155 usr/local/www/fbegin.inc:230
+msgid "States"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:126
+#: usr/local/www/diag_dump_states_sources.php:113
+#: usr/local/www/diag_resetstate.php:80
+msgid "Source Tracking"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:127
+#: usr/local/www/diag_dump_states_sources.php:114
+#: usr/local/www/diag_resetstate.php:81
+msgid "Reset States"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:149
+msgid "Current total state count"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:152
+#: usr/local/www/diag_dump_states_sources.php:133
+msgid "Filter expression:"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:154
+#: usr/local/www/diag_dump_states_sources.php:135
+#: usr/local/www/diag_logs.php:127 usr/local/www/diag_logs_filter.php:219
+#: usr/local/www/diag_logs_filter.php:282
+#: usr/local/www/diag_logs_gateways.php:129
+#: usr/local/www/diag_logs_resolver.php:129
+msgid "Filter"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:156
+msgid "Kill"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:169
+msgid "Int"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:170
+#: usr/local/www/diag_logs_filter.php:329
+#: usr/local/www/diag_logs_filter_dynamic.php:140
+#: usr/local/www/diag_states_summary.php:154
+#: usr/local/www/firewall_nat.php:205 usr/local/www/firewall_rules.php:339
+msgid "Proto"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:171
+msgid "Source -> Router -> Destination"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:172
+#: usr/local/www/diag_system_pftop.php:140
+#: usr/local/www/status_dhcpv6_leases.php:507
+msgid "State"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:213
+msgid "Remove all state entries from"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:224
+msgid "No states were found."
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:237
+msgid "States matching current filter"
+msgstr ""
+
+#: usr/local/www/diag_dump_states_sources.php:66
+msgid "Show Source Tracking"
+msgstr ""
+
+#: usr/local/www/diag_dump_states_sources.php:147
+msgid "Source -> Destination"
+msgstr ""
+
+#: usr/local/www/diag_dump_states_sources.php:148
+msgid "# States"
+msgstr ""
+
+#: usr/local/www/diag_dump_states_sources.php:149
+msgid "# Connections"
+msgstr ""
+
+#: usr/local/www/diag_dump_states_sources.php:150
+#: usr/local/www/diag_system_pftop.php:156
+#: usr/local/www/status_interfaces.php:377
+msgid "Rate"
+msgstr ""
+
+#: usr/local/www/diag_dump_states_sources.php:182
+msgid "Remove all source tracking entries from"
+msgstr ""
+
+#: usr/local/www/diag_dump_states_sources.php:192
+msgid "No source tracking entries were found."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:46 usr/local/www/fbegin.inc:215
+msgid "GEOM Mirrors"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:58
+msgid "Forget all formerly connected consumers"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:59 usr/local/www/diag_gmirror.php:301
+msgid "Remove metadata from disk"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:60
+msgid "Insert consumer into mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:61
+msgid "Remove consumer from mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:62
+msgid "Reactivate consumer on mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:63
+msgid "Deactivate consumer from mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:64
+msgid "Force rebuild of mirror consumer"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:81
+msgid "You must supply a valid mirror name."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:84
+msgid "You must supply a valid consumer name"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:90
+msgid ""
+"Consumer is already in use and cannot be inserted. Remove consumer from "
+"existing mirror first."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:92
+msgid ""
+"Consumer has metadata from an existing mirror. Clear metadata before "
+"inserting consumer."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:95
+msgid ""
+"Mirror is not in a COMPLETE state, cannot insert consumer. Forget "
+"disconnected disks or wait for rebuild to finish."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:99
+msgid "Consumer is in use and cannot be cleared. Deactivate disk first."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:101
+msgid "Consumer has no metadata to clear."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:105
+msgid "Consumer is already present on specified mirror."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:107
+msgid "Consumer has no metadata and cannot be reactivated."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:114
+msgid "Consumer must be present on the specified mirror."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:166
+msgid ""
+"There was an error performing the chosen mirror operation. Check the System "
+"Log for details."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:176 usr/local/www/diag_nanobsd.php:137
+#: usr/local/www/interfaces.php:3490 usr/local/www/interfaces.php:3499
+#: usr/local/www/interfaces_groups_edit.php:325
+#: usr/local/www/load_balancer_virtual_server_edit.php:210
+#: usr/local/www/load_balancer_virtual_server_edit.php:229
+#: usr/local/www/system_advanced_admin.php:322
+#: usr/local/www/system_advanced_firewall.php:285
+#: usr/local/www/system_advanced_misc.php:302
+#: usr/local/www/system_advanced_network.php:203
+#: usr/local/www/system_advanced_sysctl.php:173
+#: usr/local/www/system_firmware_settings.php:175
+#: usr/local/www/system_routes_edit.php:393
+msgid "NOTE:"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:178
+msgid ""
+"The options on this page are intended for use by advanced users only. This "
+"page is for managing existing mirrors, not creating new mirrors."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:196
+msgid "Mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:200
+msgid "Consumer"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:209
+msgid "GEOM Mirror information"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:213
+msgid "Mirror Status"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:222
+msgid "Component"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:234
+msgid "Forget Disconnected Disks"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:242 usr/local/www/diag_gmirror.php:257
+msgid "Rebuild"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:243 usr/local/www/diag_gmirror.php:258
+msgid "Deactivate"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:244 usr/local/www/diag_gmirror.php:259
+#: usr/local/www/load_balancer_pool_edit.php:303
+#: usr/local/www/load_balancer_pool_edit.php:323
+#: usr/local/www/load_balancer_relay_protocol_edit.php:254
+msgid "Remove"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:267
+msgid "No Mirrors Found"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:271
+msgid ""
+"Some disk operations may only be performed when there are multiple consumers "
+"present in a mirror."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:276
+msgid "Consumer information"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:280
+msgid "Available Consumers"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:289
+msgid "Add to Mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:300
+msgid "Reactivate on:"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:316
+msgid "No unused consumers found"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:320
+msgid ""
+"Consumers may only be added to a mirror if they are larger than the size of "
+"the mirror."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:327
+msgid ""
+"To repair a failed mirror, first perform a 'Forget' command on the mirror, "
+"followed by an 'insert' action on the new consumer."
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:49 usr/local/www/diag_ipsec_leases.php:46
+#: usr/local/www/diag_ipsec_sad.php:50 usr/local/www/diag_ipsec_spd.php:50
+#: usr/local/www/diag_logs.php:82 usr/local/www/diag_logs_auth.php:73
+#: usr/local/www/diag_logs_dhcp.php:76 usr/local/www/diag_logs_filter.php:139
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_filter_summary.php:193
+#: usr/local/www/diag_logs_gateways.php:84
+#: usr/local/www/diag_logs_ipsec.php:77 usr/local/www/diag_logs_ntpd.php:71
+#: usr/local/www/diag_logs_openvpn.php:75 usr/local/www/diag_logs_ppp.php:73
+#: usr/local/www/diag_logs_relayd.php:72
+#: usr/local/www/diag_logs_resolver.php:84
+#: usr/local/www/diag_logs_routing.php:71
+#: usr/local/www/diag_logs_settings.php:271
+#: usr/local/www/diag_logs_vpn.php:131 usr/local/www/diag_logs_wireless.php:73
+#: usr/local/www/fbegin.inc:164 usr/local/www/fbegin.inc:181
+#: usr/local/www/vpn_ipsec.php:216 usr/local/www/vpn_ipsec_mobile.php:241
+#: usr/local/www/vpn_ipsec_phase1.php:398
+#: usr/local/www/vpn_ipsec_phase1.php:400
+#: usr/local/www/vpn_ipsec_phase2.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:362
+#: usr/local/www/vpn_ipsec_settings.php:168
+msgid "IPsec"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:92 usr/local/www/diag_ipsec_leases.php:61
+#: usr/local/www/diag_ipsec_sad.php:75 usr/local/www/diag_ipsec_spd.php:64
+msgid "Overview"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:93 usr/local/www/diag_ipsec_leases.php:46
+#: usr/local/www/diag_ipsec_leases.php:62 usr/local/www/diag_ipsec_sad.php:76
+#: usr/local/www/diag_ipsec_spd.php:65
+msgid "Leases"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:94 usr/local/www/diag_ipsec_leases.php:63
+#: usr/local/www/diag_ipsec_sad.php:50 usr/local/www/diag_ipsec_sad.php:77
+#: usr/local/www/diag_ipsec_spd.php:66
+msgid "SAD"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:95 usr/local/www/diag_ipsec_leases.php:64
+#: usr/local/www/diag_ipsec_sad.php:78 usr/local/www/diag_ipsec_spd.php:50
+#: usr/local/www/diag_ipsec_spd.php:67
+msgid "SPD"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:96 usr/local/www/diag_ipsec_leases.php:65
+#: usr/local/www/diag_ipsec_sad.php:79 usr/local/www/diag_ipsec_spd.php:68
+msgid "Logs"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:108
+msgid "Local ID"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:109 usr/local/www/interfaces_ppps_edit.php:665
+#: usr/local/www/vpn_pppoe.php:105
+msgid "Local IP"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:110
+msgid "Remote ID"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:111
+msgid "Remote IP"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:112
+msgid "Role"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:113
+msgid "Reauth"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:114 usr/local/www/diag_ipsec.php:284
+msgid "Algo"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:147
+msgid "Any identifier"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:162 usr/local/www/diag_ipsec.php:202
+msgid "Port: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:246 usr/local/www/diag_ipsec.php:472
+msgid "Connect VPN"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:254
+msgid "Disconnect VPN"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:257
+msgid "Disconnect VPN Connection"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:280
+msgid "Local subnets"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:281
+msgid "Local SPI(s)"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:282
+msgid "Remote subnets"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:283
+msgid "Times"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:285
+msgid "Stats"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:308
+msgid "Local: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:310
+msgid "Remote: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:326
+msgid "Rekey: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:327
+msgid "Life: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:328
+msgid "Install: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:350
+msgid "IPComp: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:355
+msgid "Bytes-In: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:357
+msgid "Packets-In: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:359
+msgid "Bytes-Out: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:361
+msgid "Packets-Out: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:367
+msgid "Disconnect Child SA"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:452 usr/local/www/diag_ipsec.php:453
+msgid "Awaiting connections"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:465 usr/local/www/diag_ipsec.php:466
+msgid "Disconnected"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:500
+msgid "You can configure IPsec"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:79
+msgid "Pool: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:80
+msgid "usage: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:81
+msgid "online: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:87 usr/local/www/firewall_rules.php:335
+#: usr/local/www/load_balancer_relay_action_edit.php:511
+msgid "ID"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:88 usr/local/www/diag_ping.php:60
+#: usr/local/www/diag_ping.php:100 usr/local/www/diag_testport.php:60
+#: usr/local/www/diag_testport.php:117 usr/local/www/diag_traceroute.php:64
+#: usr/local/www/diag_traceroute.php:100
+#: usr/local/www/load_balancer_monitor_edit.php:280
+#: usr/local/www/load_balancer_monitor_edit.php:313
+#: usr/local/www/services_dnsmasq.php:352
+#: usr/local/www/services_dnsmasq_edit.php:215
+#: usr/local/www/services_dnsmasq_edit.php:256
+#: usr/local/www/services_rfc2136_edit.php:175
+#: usr/local/www/services_unbound.php:420
+#: usr/local/www/services_unbound_host_edit.php:216
+#: usr/local/www/services_unbound_host_edit.php:259
+msgid "Host"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:104
+msgid "No leases from this pool yet."
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:114
+msgid "No IPsec pools."
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:126
+#: usr/local/www/diag_ipsec_sad.php:136 usr/local/www/diag_ipsec_spd.php:133
+msgid "You can configure your IPsec"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:126
+#: usr/local/www/diag_ipsec_sad.php:136 usr/local/www/diag_ipsec_spd.php:133
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/firewall_rules_edit.php:998
+msgid "here."
+msgstr ""
+
+#: usr/local/www/diag_ipsec_sad.php:90 usr/local/www/diag_ipsec_spd.php:79
+#: usr/local/www/diag_logs_filter.php:327
+#: usr/local/www/diag_logs_filter_dynamic.php:138
+#: usr/local/www/firewall_nat_edit.php:548
+#: usr/local/www/firewall_nat_edit.php:554
+#: usr/local/www/firewall_nat_out.php:306
+#: usr/local/www/firewall_nat_out.php:543
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_nat_out_edit.php:533
+#: usr/local/www/firewall_rules.php:340
+#: usr/local/www/firewall_rules_edit.php:1034
+#: usr/local/www/vpn_ipsec_mobile.php:385
+#: usr/local/www/vpn_ipsec_mobile.php:403
+#: usr/local/www/widgets/widgets/log.widget.php:181
+msgid "Source"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_sad.php:91 usr/local/www/diag_ipsec_spd.php:80
+#: usr/local/www/diag_logs_filter.php:328
+#: usr/local/www/diag_logs_filter_dynamic.php:139
+#: usr/local/www/firewall_nat_1to1_edit.php:422
+#: usr/local/www/firewall_nat_edit.php:643
+#: usr/local/www/firewall_nat_out.php:308
+#: usr/local/www/firewall_nat_out.php:545
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_nat_out_edit.php:578
+#: usr/local/www/firewall_rules.php:342
+#: usr/local/www/firewall_rules_edit.php:1137
+#: usr/local/www/widgets/widgets/log.widget.php:182
+msgid "Destination"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_sad.php:92 usr/local/www/diag_ipsec_spd.php:82
+#: usr/local/www/diag_logs_filter.php:193
+#: usr/local/www/diag_packet_capture.php:277
+#: usr/local/www/firewall_nat_edit.php:197
+#: usr/local/www/firewall_nat_edit.php:200
+#: usr/local/www/firewall_nat_edit.php:537
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_nat_out_edit.php:513
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_shaper_layer7.php:467
+#: usr/local/www/interfaces_bridge_edit.php:310
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:425
+#: usr/local/www/load_balancer_virtual_server.php:133
+#: usr/local/www/services_rfc2136_edit.php:193
+#: usr/local/www/status_upnp.php:88
+#: usr/local/www/system_advanced_admin.php:333
+#: usr/local/www/vpn_ipsec_phase2.php:710
+#: usr/local/www/vpn_openvpn_client.php:500
+#: usr/local/www/vpn_openvpn_client.php:1116
+#: usr/local/www/vpn_openvpn_server.php:815
+msgid "Protocol"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_sad.php:93
+msgid "SPI"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_sad.php:94
+msgid "Enc. alg."
+msgstr ""
+
+#: usr/local/www/diag_ipsec_sad.php:95
+msgid "Auth. alg."
+msgstr ""
+
+#: usr/local/www/diag_ipsec_sad.php:96
+msgid "Data"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_sad.php:115
+msgid "Do you really want to delete this security association?"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_sad.php:124
+msgid "No IPsec security associations."
+msgstr ""
+
+#: usr/local/www/diag_ipsec_spd.php:81
+#: usr/local/www/firewall_rules_edit.php:954
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:444
+#: usr/local/www/services_captiveportal_hostname_edit.php:163
+msgid "Direction"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_spd.php:83
+msgid "Tunnel endpoints"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_spd.php:109
+msgid "incoming (as seen by firewall)"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_spd.php:116
+msgid "outgoing (as seen by firewall)"
+msgstr ""
+
+#: usr/local/www/diag_ipsec_spd.php:121
+msgid "No IPsec security policies."
+msgstr ""
+
+#: usr/local/www/diag_limiter_info.php:106
+msgid "Gathering Limiter information, please wait..."
+msgstr ""
+
+#: usr/local/www/diag_logs.php:66 usr/local/www/diag_logs_auth.php:57
+#: usr/local/www/diag_logs_dhcp.php:60 usr/local/www/diag_logs_filter.php:123
+#: usr/local/www/diag_logs_filter_dynamic.php:62
+#: usr/local/www/diag_logs_filter_summary.php:35
+#: usr/local/www/diag_logs_gateways.php:67
+#: usr/local/www/diag_logs_ipsec.php:61 usr/local/www/diag_logs_ntpd.php:55
+#: usr/local/www/diag_logs_openvpn.php:46 usr/local/www/diag_logs_ppp.php:58
+#: usr/local/www/diag_logs_relayd.php:56
+#: usr/local/www/diag_logs_resolver.php:67
+#: usr/local/www/diag_logs_routing.php:55
+#: usr/local/www/diag_logs_settings.php:187 usr/local/www/diag_logs_vpn.php:45
+#: usr/local/www/diag_logs_wireless.php:57
+msgid "System logs"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:66 usr/local/www/diag_logs.php:96
+#: usr/local/www/diag_logs_gateways.php:98
+#: usr/local/www/diag_logs_resolver.php:98
+#: usr/local/www/diag_logs_routing.php:84
+#: usr/local/www/diag_logs_wireless.php:86
+msgid "General"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:79 usr/local/www/diag_logs_auth.php:70
+#: usr/local/www/diag_logs_dhcp.php:73 usr/local/www/diag_logs_filter.php:123
+#: usr/local/www/diag_logs_filter.php:136
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_filter_summary.php:190
+#: usr/local/www/diag_logs_gateways.php:81
+#: usr/local/www/diag_logs_ipsec.php:74 usr/local/www/diag_logs_ntpd.php:68
+#: usr/local/www/diag_logs_openvpn.php:72 usr/local/www/diag_logs_ppp.php:70
+#: usr/local/www/diag_logs_relayd.php:69
+#: usr/local/www/diag_logs_resolver.php:81
+#: usr/local/www/diag_logs_routing.php:68
+#: usr/local/www/diag_logs_settings.php:268
+#: usr/local/www/diag_logs_vpn.php:128 usr/local/www/diag_logs_wireless.php:70
+#: usr/local/www/fbegin.inc:300 usr/local/www/firewall_aliases.php:157
+#: usr/local/www/firewall_aliases_edit.php:53
+#: usr/local/www/firewall_aliases_import.php:50
+#: usr/local/www/firewall_nat.php:167 usr/local/www/firewall_nat_1to1.php:148
+#: usr/local/www/firewall_nat_1to1_edit.php:227
+#: usr/local/www/firewall_nat_edit.php:457
+#: usr/local/www/firewall_nat_npt.php:81
+#: usr/local/www/firewall_nat_npt_edit.php:148
+#: usr/local/www/firewall_nat_out.php:214
+#: usr/local/www/firewall_nat_out_edit.php:343
+#: usr/local/www/firewall_rules.php:50
+#: usr/local/www/firewall_rules_edit.php:805
+#: usr/local/www/firewall_schedule.php:51
+#: usr/local/www/firewall_schedule_edit.php:62
+#: usr/local/www/firewall_shaper.php:55
+#: usr/local/www/firewall_shaper_layer7.php:60
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_wizards.php:74
+#: usr/local/www/firewall_virtual_ip.php:203
+#: usr/local/www/firewall_virtual_ip_edit.php:290
+#: usr/local/www/services_igmpproxy_edit.php:46
+msgid "Firewall"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:80 usr/local/www/diag_logs_auth.php:71
+#: usr/local/www/diag_logs_dhcp.php:60 usr/local/www/diag_logs_dhcp.php:74
+#: usr/local/www/diag_logs_filter.php:137
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_filter_summary.php:191
+#: usr/local/www/diag_logs_gateways.php:82
+#: usr/local/www/diag_logs_ipsec.php:75 usr/local/www/diag_logs_ntpd.php:69
+#: usr/local/www/diag_logs_openvpn.php:73 usr/local/www/diag_logs_ppp.php:71
+#: usr/local/www/diag_logs_relayd.php:70
+#: usr/local/www/diag_logs_resolver.php:82
+#: usr/local/www/diag_logs_routing.php:69
+#: usr/local/www/diag_logs_settings.php:269
+#: usr/local/www/diag_logs_vpn.php:129 usr/local/www/diag_logs_wireless.php:71
+#: usr/local/www/interfaces.php:1411 usr/local/www/services_dhcp_edit.php:335
+msgid "DHCP"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:81 usr/local/www/diag_logs_auth.php:57
+#: usr/local/www/diag_logs_auth.php:72 usr/local/www/diag_logs_dhcp.php:75
+#: usr/local/www/diag_logs_filter.php:138
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_filter_summary.php:192
+#: usr/local/www/diag_logs_gateways.php:83
+#: usr/local/www/diag_logs_ipsec.php:76 usr/local/www/diag_logs_ntpd.php:70
+#: usr/local/www/diag_logs_openvpn.php:74 usr/local/www/diag_logs_ppp.php:72
+#: usr/local/www/diag_logs_relayd.php:71
+#: usr/local/www/diag_logs_resolver.php:83
+#: usr/local/www/diag_logs_routing.php:70
+#: usr/local/www/diag_logs_settings.php:270
+#: usr/local/www/diag_logs_vpn.php:130 usr/local/www/diag_logs_wireless.php:72
+msgid "Portal Auth"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:83 usr/local/www/diag_logs_auth.php:74
+#: usr/local/www/diag_logs_dhcp.php:77 usr/local/www/diag_logs_filter.php:140
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_filter_summary.php:194
+#: usr/local/www/diag_logs_gateways.php:85
+#: usr/local/www/diag_logs_ipsec.php:78 usr/local/www/diag_logs_ntpd.php:72
+#: usr/local/www/diag_logs_openvpn.php:76 usr/local/www/diag_logs_ppp.php:58
+#: usr/local/www/diag_logs_ppp.php:74 usr/local/www/diag_logs_relayd.php:73
+#: usr/local/www/diag_logs_resolver.php:85
+#: usr/local/www/diag_logs_routing.php:72
+#: usr/local/www/diag_logs_settings.php:272
+#: usr/local/www/diag_logs_vpn.php:132 usr/local/www/diag_logs_wireless.php:74
+#: usr/local/www/interfaces.php:1411 usr/local/www/status_interfaces.php:165
+msgid "PPP"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:84 usr/local/www/diag_logs_auth.php:75
+#: usr/local/www/diag_logs_dhcp.php:78 usr/local/www/diag_logs_filter.php:141
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: usr/local/www/diag_logs_filter_summary.php:195
+#: usr/local/www/diag_logs_gateways.php:86
+#: usr/local/www/diag_logs_ipsec.php:79 usr/local/www/diag_logs_ntpd.php:73
+#: usr/local/www/diag_logs_openvpn.php:77 usr/local/www/diag_logs_ppp.php:75
+#: usr/local/www/diag_logs_relayd.php:74
+#: usr/local/www/diag_logs_resolver.php:86
+#: usr/local/www/diag_logs_routing.php:73
+#: usr/local/www/diag_logs_settings.php:273 usr/local/www/diag_logs_vpn.php:45
+#: usr/local/www/diag_logs_vpn.php:133 usr/local/www/diag_logs_wireless.php:75
+#: usr/local/www/fbegin.inc:316
+#: usr/local/www/status_rrd_graph_settings.php:158
+#: usr/local/www/vpn_ipsec.php:216 usr/local/www/vpn_ipsec_mobile.php:241
+#: usr/local/www/vpn_ipsec_phase1.php:398
+#: usr/local/www/vpn_ipsec_phase1.php:400
+#: usr/local/www/vpn_ipsec_phase2.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:362
+#: usr/local/www/vpn_ipsec_settings.php:168 usr/local/www/vpn_l2tp.php:39
+#: usr/local/www/vpn_l2tp_users.php:39
+#: usr/local/www/vpn_l2tp_users_edit.php:39 usr/local/www/vpn_pppoe.php:88
+#: usr/local/www/vpn_pptp.php:197 usr/local/www/vpn_pptp_users.php:72
+#: usr/local/www/vpn_pptp_users_edit.php:138
+msgid "VPN"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:85 usr/local/www/diag_logs_auth.php:76
+#: usr/local/www/diag_logs_dhcp.php:79 usr/local/www/diag_logs_filter.php:142
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_filter_summary.php:196
+#: usr/local/www/diag_logs_gateways.php:87
+#: usr/local/www/diag_logs_ipsec.php:80 usr/local/www/diag_logs_ntpd.php:74
+#: usr/local/www/diag_logs_openvpn.php:78 usr/local/www/diag_logs_ppp.php:76
+#: usr/local/www/diag_logs_relayd.php:56 usr/local/www/diag_logs_relayd.php:75
+#: usr/local/www/diag_logs_resolver.php:87
+#: usr/local/www/diag_logs_routing.php:74
+#: usr/local/www/diag_logs_settings.php:274
+#: usr/local/www/diag_logs_vpn.php:134 usr/local/www/diag_logs_wireless.php:76
+#: usr/local/www/fbegin.inc:149 usr/local/www/fbegin.inc:182
+#: usr/local/www/load_balancer_monitor.php:89
+#: usr/local/www/load_balancer_monitor_edit.php:196
+#: usr/local/www/load_balancer_pool.php:98
+#: usr/local/www/load_balancer_pool_edit.php:170
+#: usr/local/www/load_balancer_relay_action.php:105
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_relay_protocol.php:101
+#: usr/local/www/load_balancer_relay_protocol_edit.php:140
+#: usr/local/www/load_balancer_setting.php:100
+#: usr/local/www/load_balancer_virtual_server.php:99
+#: usr/local/www/load_balancer_virtual_server_edit.php:147
+#: usr/local/www/status_lb_pool.php:63 usr/local/www/status_lb_vs.php:57
+msgid "Load Balancer"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:87 usr/local/www/diag_logs_auth.php:78
+#: usr/local/www/diag_logs_dhcp.php:81 usr/local/www/diag_logs_filter.php:144
+#: usr/local/www/diag_logs_filter_dynamic.php:109
+#: usr/local/www/diag_logs_filter_summary.php:198
+#: usr/local/www/diag_logs_gateways.php:89
+#: usr/local/www/diag_logs_ipsec.php:82 usr/local/www/diag_logs_ntpd.php:55
+#: usr/local/www/diag_logs_ntpd.php:76 usr/local/www/diag_logs_openvpn.php:80
+#: usr/local/www/diag_logs_ppp.php:78 usr/local/www/diag_logs_relayd.php:77
+#: usr/local/www/diag_logs_resolver.php:89
+#: usr/local/www/diag_logs_routing.php:76
+#: usr/local/www/diag_logs_settings.php:276
+#: usr/local/www/diag_logs_vpn.php:136 usr/local/www/diag_logs_wireless.php:78
+#: usr/local/www/fbegin.inc:150 usr/local/www/fbegin.inc:183
+#: usr/local/www/services_ntpd.php:180 usr/local/www/services_ntpd.php:237
+#: usr/local/www/services_ntpd_gps.php:366
+#: usr/local/www/services_ntpd_pps.php:117 usr/local/www/status_ntpd.php:164
+#: usr/local/www/status_rrd_graph_settings.php:62
+msgid "NTP"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:88 usr/local/www/diag_logs_auth.php:79
+#: usr/local/www/diag_logs_dhcp.php:82 usr/local/www/diag_logs_filter.php:145
+#: usr/local/www/diag_logs_filter_dynamic.php:110
+#: usr/local/www/diag_logs_filter_summary.php:199
+#: usr/local/www/diag_logs_gateways.php:90
+#: usr/local/www/diag_logs_ipsec.php:83 usr/local/www/diag_logs_ntpd.php:77
+#: usr/local/www/diag_logs_openvpn.php:81 usr/local/www/diag_logs_ppp.php:79
+#: usr/local/www/diag_logs_relayd.php:78
+#: usr/local/www/diag_logs_resolver.php:90
+#: usr/local/www/diag_logs_routing.php:77
+#: usr/local/www/diag_logs_settings.php:187
+#: usr/local/www/diag_logs_settings.php:277
+#: usr/local/www/diag_logs_vpn.php:137 usr/local/www/diag_logs_wireless.php:79
+#: usr/local/www/load_balancer_monitor.php:111
+#: usr/local/www/load_balancer_pool.php:120
+#: usr/local/www/load_balancer_setting.php:100
+#: usr/local/www/load_balancer_setting.php:123
+#: usr/local/www/load_balancer_virtual_server.php:121
+#: usr/local/www/status_rrd_graph.php:452
+#: usr/local/www/status_rrd_graph_settings.php:171
+#: usr/local/www/system_authservers.php:450
+#: usr/local/www/system_firmware_settings.php:87
+#: usr/local/www/system_groupmanager.php:290
+#: usr/local/www/system_groupmanager_addprivs.php:170
+#: usr/local/www/system_usermanager.php:496
+#: usr/local/www/system_usermanager_addprivs.php:159
+#: usr/local/www/system_usermanager_settings.php:116
+#: usr/local/www/vpn_ipsec_settings.php:168
+msgid "Settings"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:97 usr/local/www/diag_logs_gateways.php:67
+#: usr/local/www/diag_logs_gateways.php:99
+#: usr/local/www/diag_logs_resolver.php:99
+#: usr/local/www/diag_logs_routing.php:85
+#: usr/local/www/diag_logs_wireless.php:87 usr/local/www/fbegin.inc:176
+#: usr/local/www/status_gateway_groups.php:66
+#: usr/local/www/status_gateway_groups.php:77
+#: usr/local/www/status_gateways.php:52 usr/local/www/status_gateways.php:64
+#: usr/local/www/system_gateway_groups.php:119
+#: usr/local/www/system_gateway_groups.php:132
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/system_gateways.php:182 usr/local/www/system_gateways.php:203
+#: usr/local/www/system_gateways_edit.php:523
+#: usr/local/www/system_routes.php:220
+msgid "Gateways"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:98 usr/local/www/diag_logs_gateways.php:100
+#: usr/local/www/diag_logs_resolver.php:100
+#: usr/local/www/diag_logs_routing.php:55
+#: usr/local/www/diag_logs_routing.php:86
+#: usr/local/www/diag_logs_wireless.php:88 usr/local/www/fbegin.inc:108
+msgid "Routing"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:99 usr/local/www/diag_logs_gateways.php:101
+#: usr/local/www/diag_logs_resolver.php:67
+#: usr/local/www/diag_logs_resolver.php:101
+#: usr/local/www/diag_logs_routing.php:87
+#: usr/local/www/diag_logs_wireless.php:89
+msgid "Resolver"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:100 usr/local/www/diag_logs_gateways.php:102
+#: usr/local/www/diag_logs_resolver.php:102
+#: usr/local/www/diag_logs_routing.php:88
+#: usr/local/www/diag_logs_wireless.php:57
+#: usr/local/www/diag_logs_wireless.php:90 usr/local/www/fbegin.inc:201
+#: usr/local/www/interfaces_assign.php:467
+#: usr/local/www/interfaces_bridge.php:102 usr/local/www/interfaces_gif.php:96
+#: usr/local/www/interfaces_gre.php:97 usr/local/www/interfaces_groups.php:79
+#: usr/local/www/interfaces_lagg.php:102 usr/local/www/interfaces_ppps.php:94
+#: usr/local/www/interfaces_qinq.php:105 usr/local/www/interfaces_vlan.php:99
+#: usr/local/www/interfaces_wireless.php:79
+#: usr/local/www/interfaces_wireless.php:94
+#: usr/local/www/interfaces_wireless_edit.php:151
+#: usr/local/www/status_rrd_graph.php:431
+#: usr/local/www/status_rrd_graph_settings.php:150
+#: usr/local/www/status_wireless.php:42
+msgid "Wireless"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:110 usr/local/www/diag_logs_gateways.php:112
+#: usr/local/www/diag_logs_resolver.php:112
+#, php-format
+msgid "Last %s system log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs.php:121 usr/local/www/diag_logs_auth.php:93
+#: usr/local/www/diag_logs_dhcp.php:96 usr/local/www/diag_logs_filter.php:410
+#: usr/local/www/diag_logs_gateways.php:123
+#: usr/local/www/diag_logs_ipsec.php:110 usr/local/www/diag_logs_ntpd.php:92
+#: usr/local/www/diag_logs_openvpn.php:98 usr/local/www/diag_logs_ppp.php:96
+#: usr/local/www/diag_logs_relayd.php:92
+#: usr/local/www/diag_logs_resolver.php:123
+#: usr/local/www/diag_logs_routing.php:103 usr/local/www/diag_logs_vpn.php:188
+#: usr/local/www/diag_logs_wireless.php:105
+msgid "Clear log"
+msgstr ""
+
+#: usr/local/www/diag_logs_auth.php:89
+#, php-format
+msgid "Last %s Portal Auth log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_dhcp.php:92
+#, php-format
+msgid "Last %s DHCP service log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:58
+msgid "Cannot resolve"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:78
+msgid "The rule that triggered this action is"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:152
+#: usr/local/www/diag_logs_filter_dynamic.php:117
+#: usr/local/www/diag_logs_filter_summary.php:206
+msgid "Normal View"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:153
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter_summary.php:207
+msgid "Dynamic View"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:154
+#: usr/local/www/diag_logs_filter_dynamic.php:119
+#: usr/local/www/diag_logs_filter_summary.php:208
+msgid "Summary View"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:322
+#: usr/local/www/diag_logs_filter_dynamic.php:136
+#: usr/local/www/diag_logs_vpn.php:175 usr/local/www/diag_system_pftop.php:141
+#: usr/local/www/firewall_schedule_edit.php:922
+#: usr/local/www/widgets/widgets/log.widget.php:179
+msgid "Time"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:185
+msgid "Source IP Address"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:189
+#: usr/local/www/diag_system_pftop.php:158 usr/local/www/diag_testport.php:129
+#: usr/local/www/firewall_nat_out.php:307
+#: usr/local/www/firewall_nat_out.php:544
+msgid "Source Port"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:197
+#: usr/local/www/diag_logs_filter.php:277
+msgid "Quantity"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:207
+msgid "Destination IP Address"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:211
+#: usr/local/www/diag_system_pftop.php:151
+#: usr/local/www/firewall_nat_out.php:309
+#: usr/local/www/firewall_nat_out.php:546
+msgid "Destination Port"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:215
+msgid "Protocol Flags"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:225
+#: usr/local/www/diag_logs_filter.php:288
+#, php-format
+msgid "Matches %1$s regular expression%2$s."
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:226
+msgid "Precede with exclamation (!) as first character to exclude match."
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:273 usr/local/www/diag_routes.php:193
+msgid "Filter expression"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:314
+#, php-format
+msgid "Last %s firewall log entries."
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:316
+msgid "matched log entries."
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:317
+#, php-format
+msgid "Max(%s)"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:321
+#: usr/local/www/diag_logs_filter_dynamic.php:135
+#: usr/local/www/widgets/widgets/log.widget.php:178
+msgid "Act"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:323
+#: usr/local/www/diag_logs_filter_dynamic.php:137
+#: usr/local/www/firewall_nat.php:204 usr/local/www/services_rfc2136.php:80
+msgid "If"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:325
+msgid "Rule"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:370
+#: usr/local/www/diag_logs_filter.php:376
+msgid "Click to resolve"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:371
+msgid "Easy Rule: Add to Block List"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:371
+msgid "Do you really want to add this BLOCK rule?"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:377
+msgid "Easy Rule: Pass this traffic"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:377
+msgid "Do you really want to add this PASS rule?"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:398
+#, php-format
+msgid "Last %s firewall log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_dynamic.php:62
+msgid "Firewall (Dynamic View)"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_dynamic.php:131
+#, php-format
+msgid "Last %s records"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_dynamic.php:131
+msgid "Pause:"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_dynamic.php:173
+msgid "TCP Flags"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:35
+msgid "Firewall Log Summary"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:47
+#: usr/local/www/load_balancer_relay_protocol_edit.php:231
+msgid "Actions"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:49
+msgid "Protocols"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:50
+msgid "Source IPs"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:51
+msgid "Destination IPs"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:52
+msgid "Source Ports"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:53
+msgid "Destination Ports"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:73
+msgid "data"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:83
+#: usr/local/www/widgets/widgets/log.widget.php:201
+#: usr/local/www/widgets/widgets/log.widget.php:204
+msgid "Reverse Resolve with DNS"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:219
+#, php-format
+msgid ""
+"This is a firewall log summary, of the last %1$s lines of the firewall log "
+"(Max %2$s)."
+msgstr ""
+
+#: usr/local/www/diag_logs_filter_summary.php:220
+msgid "NOTE: IE8 users must enable compatibility view."
+msgstr ""
+
+#: usr/local/www/diag_logs_ipsec.php:93
+#, php-format
+msgid "Last %s IPsec log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_ntpd.php:87
+#, php-format
+msgid "Last %s NTP log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_openvpn.php:91
+#, php-format
+msgid "Last %s OpenVPN log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_ppp.php:89
+#, php-format
+msgid "Last %s PPP log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_relayd.php:88
+#, php-format
+msgid "Last %s Load Balancer log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_routing.php:99
+#, php-format
+msgid "Routing daemon log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:88
+#: usr/local/www/diag_logs_settings.php:366
+msgid "Reset Log Files"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:90
+msgid "The log files have been reset."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:98
+msgid ""
+"A valid IP address/hostname or IP/hostname:port must be specified for remote "
+"syslog server #1."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:101
+msgid ""
+"A valid IP address/hostname or IP/hostname:port must be specified for remote "
+"syslog server #2."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:104
+msgid ""
+"A valid IP address/hostname or IP/hostname:port must be specified for remote "
+"syslog server #3."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:108
+msgid "Number of log entries to show must be between 5 and 2000."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:113
+msgid "Log file size must be a positive integer greater than 5120."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:178
+#: usr/local/www/system_advanced_admin.php:650
+msgid "webConfigurator configuration has changed. Restarting webConfigurator."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:180
+msgid "WebGUI process is restarting."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:286
+msgid "General Logging Options"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:291
+msgid "Show log entries in reverse order (newest entries on top)"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:297
+msgid ""
+"Hint: This is only the number of log entries displayed in the GUI. It does "
+"not affect how many entries are contained in the actual log files."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:303
+msgid ""
+"Logs are held in constant-size circular log files. This field controls how "
+"large each log file is, and thus how many entries may exist inside the log. "
+"By default this is approximately 500KB per log file, and there are nearly 20 "
+"such log files."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:305
+msgid ""
+"NOTE: Log sizes are changed the next time a log file is cleared or deleted. "
+"To immediately increase the size of the log files, you must first save the "
+"options to set the size, then clear all logs using the \"Reset Log Files\" "
+"option farther down this page. "
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:306
+msgid ""
+"Be aware that increasing this value increases every log file size, so disk "
+"usage will increase significantly."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:307
+msgid "Disk space currently used by log files: "
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:308
+msgid "Remaining disk space for log files: "
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:315
+msgid "Log packets matched from the default block rules put in the ruleset"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:316
+msgid ""
+"Hint: packets that are blocked by the implicit default block rule will not "
+"be logged if you uncheck this option. Per-rule logging options are still "
+"respected."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:319
+msgid "Log packets matched from the default pass rules put in the ruleset"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:320
+msgid ""
+"Hint: packets that are allowed by the implicit default pass rule will be "
+"logged if you check this option. Per-rule logging options are still "
+"respected."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:323
+msgid "Log packets blocked by 'Block Bogon Networks' rules"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:326
+msgid "Log packets blocked by 'Block Private Networks' rules"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:332
+msgid "Log errors from the web server process."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:333
+msgid ""
+"Hint: If this is checked, errors from the lighttpd web server process for "
+"the GUI or Captive Portal will appear in the main system log."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:338
+msgid "Show raw filter logs"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:339
+msgid ""
+"Hint: If this is checked, filter logs are shown as generated by the packet "
+"filter, without any formatting. This will reveal more detailed information, "
+"but it is more difficult to read."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:349
+msgid "Show the applied rule description below or in the firewall log rows."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:351
+msgid ""
+"Displaying rule descriptions for all lines in the log might affect "
+"performance with large rule sets."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:358
+msgid "Disable writing log files to the local disk"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:360
+msgid "Disable writing log files to the local RAM disk"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:366
+msgid ""
+"Do you really want to reset the log files? This will erase all local log "
+"data."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:368
+msgid ""
+"Note: Clears all local log files and reinitializes them as empty logs. This "
+"also restarts the DHCP daemon. Use the Save button first if you have made "
+"any setting changes."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:375
+msgid "Remote Logging Options"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:378 usr/local/www/diag_ping.php:114
+#: usr/local/www/diag_system_pftop.php:159 usr/local/www/diag_testport.php:143
+#: usr/local/www/diag_traceroute.php:114
+msgid "Source Address"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:394
+msgid ""
+"This option will allow the logging daemon to bind to a single IP address, "
+"rather than all IP addresses."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:395
+msgid ""
+"If you pick a single IP, remote syslog severs must all be of that IP type. "
+"If you wish to mix IPv4 and IPv6 remote syslog servers, you must bind to all "
+"interfaces."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:397
+msgid ""
+"NOTE: If an IP address cannot be located on the chosen interface, the daemon "
+"will bind to all addresses."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:401 usr/local/www/diag_ping.php:105
+#: usr/local/www/diag_testport.php:161 usr/local/www/diag_traceroute.php:105
+msgid "IP Protocol"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:408
+msgid ""
+"This option is only used when a non-default address is chosen as the source "
+"above. This option only expresses a preference; If an IP address of the "
+"selected type is not found on the chosen interface, the other type will be "
+"tried."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:412
+msgid "Enable Remote Logging"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:414
+msgid "Send log messages to remote syslog server"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:417
+msgid "Remote Syslog Servers"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:434
+msgid "IP addresses of remote syslog servers, or an IP:port."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:440
+msgid "Remote Syslog Contents"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:443
+msgid "Everything"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:445
+msgid "System events"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:447
+msgid "Firewall events"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:449
+msgid "DHCP service events"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:451
+msgid "Portal Auth events"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:453
+msgid "VPN (PPTP, IPsec, OpenVPN) events"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:455
+msgid "Gateway Monitor events"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:457
+msgid "Server Load Balancer events"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:459
+msgid "Wireless events"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:470
+msgid ""
+"syslog sends UDP datagrams to port 514 on the specified remote syslog "
+"server, unless another port is specified. Be sure to set syslogd on the "
+"remote server to accept syslog messages from"
+msgstr ""
+
+#: usr/local/www/diag_logs_vpn.php:144
+msgid "PPTP Logins"
+msgstr ""
+
+#: usr/local/www/diag_logs_vpn.php:147
+msgid "PPTP Raw"
+msgstr ""
+
+#: usr/local/www/diag_logs_vpn.php:150
+msgid "PPPoE Logins"
+msgstr ""
+
+#: usr/local/www/diag_logs_vpn.php:153
+msgid "PPPoE Raw"
+msgstr ""
+
+#: usr/local/www/diag_logs_vpn.php:156
+msgid "L2TP Logins"
+msgstr ""
+
+#: usr/local/www/diag_logs_vpn.php:159
+msgid "L2TP Raw"
+msgstr ""
+
+#: usr/local/www/diag_logs_vpn.php:171
+#, php-format
+msgid "Last %1$s %2$s VPN log entries"
+msgstr ""
+
+#: usr/local/www/diag_logs_wireless.php:101
+#, php-format
+msgid "Wireless (hostapd) log entries"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:50 usr/local/www/fbegin.inc:236
+msgid "NanoBSD"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:70
+msgid "Setting slice information, please wait..."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:79
+msgid "The boot slice has been set to"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:86
+msgid "Duplicating slice. Please wait, this will take a moment..."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:95
+msgid "The slice has been duplicated."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:95
+msgid ""
+"If you would like to boot from this newly duplicated slice please set it "
+"using the bootup information area."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:97
+msgid "There was an error while duplicating the slice. Operation aborted."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:139
+#: usr/local/www/system_advanced_admin.php:324
+#: usr/local/www/system_advanced_firewall.php:287
+#: usr/local/www/system_advanced_misc.php:304
+#: usr/local/www/system_advanced_network.php:205
+#: usr/local/www/system_advanced_sysctl.php:175
+msgid "The options on this page are intended for use by advanced users only."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:145
+msgid "Bootup information"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:148
+msgid "NanoBSD Image size"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:154
+msgid "Bootup"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:157
+msgid "Bootup slice is currently:"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:158
+msgid "This will switch the bootup slice to the alternate slice."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:168
+msgid "Media Read/Write Status"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:182
+msgid "Read/Write"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:184
+msgid "Switch to Read-Only"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:186
+msgid "Read-Only"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:188
+msgid "Switch to Read/Write"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:191
+msgid ""
+"NOTE: This setting is only temporary, and can be switched dynamically in the "
+"background."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:198
+msgid "Keep media mounted read/write at all times."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:207
+msgid "Duplicate bootup slice to alternate"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:210
+msgid "Duplicate bootup slice"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:213
+msgid "Destination slice:"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:220
+msgid ""
+"This will duplicate the bootup slice to the alternate slice. Use this if "
+"you would like to duplicate the known good working boot partition to the "
+"alternate."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:221
+msgid "Duplicate slice"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:229
+msgid "Periodic Data Backup"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:232
+msgid "RRD/DHCP Backup"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:234
+msgid "These options have been relocated to"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:234
+msgid "System > Advanced, Miscellaneous tab"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:242
+msgid "View upgrade log"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:245
+msgid "View previous upgrade log"
+msgstr ""
+
+#: usr/local/www/diag_ndp.php:107 usr/local/www/fbegin.inc:219
+msgid "NDP Table"
+msgstr ""
+
+#: usr/local/www/diag_ndp.php:133 usr/local/www/interfaces.php:564
+#: usr/local/www/interfaces.php:1883 usr/local/www/services_dhcpv6.php:859
+#: usr/local/www/services_dhcpv6_edit.php:210
+#: usr/local/www/status_dhcpv6_leases.php:416
+#: usr/local/www/status_interfaces.php:291
+msgid "IPv6 address"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:85
+#: usr/local/www/diag_packet_capture.php:371
+msgid "Download Capture"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:88 usr/local/www/fbegin.inc:234
+msgid "Packet Capture"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:127
+msgid "Invalid interface."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:130
+msgid "Invalid address family."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:133
+msgid "Invalid protocol."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:145
+#, php-format
+msgid "A valid IP address or CIDR block must be specified. [%s]"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:151
+msgid "Invalid value specified for port."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:158
+msgid "Invalid value specified for packet length."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:165
+msgid "Invalid value specified for packet count."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:191
+#: usr/local/www/diag_packet_capture.php:365
+#: usr/local/www/diag_packet_capture.php:420
+#: usr/local/www/status_dhcp_leases.php:334
+#: usr/local/www/status_dhcpv6_leases.php:420
+#: usr/local/www/status_dhcpv6_leases.php:505
+msgid "Start"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:198
+#: usr/local/www/diag_packet_capture.php:364
+#: usr/local/www/diag_packet_capture.php:367
+msgid "Stop"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:240
+msgid "Packet capture"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:254
+msgid "Select the interface on which to capture traffic."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:258
+msgid "Promiscuous"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:261
+msgid "If checked, the"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:261
+msgid "packet capture"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:261
+msgid "will be performed using promiscuous mode."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:262
+msgid "Some network adapters do not support or work well in promiscuous mode."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:266
+#: usr/local/www/system_gateways_edit.php:672
+msgid "Address Family"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:273
+msgid ""
+"Select the type of traffic to be captured, either Any, IPv4 only or IPv6 "
+"only."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:295
+msgid "Select the protocol to capture, or Any."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:299
+msgid "Host Address"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:302
+msgid ""
+"This value is either the Source or Destination IP address or subnet in CIDR "
+"notation. The packet capture will look for this address in either field."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:303
+msgid ""
+"Matching can be negated by preceding the value with \"!\". Multiple IP "
+"addresses or CIDR subnets may be specified. Comma (\",\") separated values "
+"perform a boolean \"and\". Separating with a pipe (\"|\") performs a boolean "
+"\"or\"."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:304
+msgid ""
+"If you leave this field blank, all packets on the specified interface will "
+"be captured."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:308
+#: usr/local/www/diag_testport.php:60 usr/local/www/diag_testport.php:123
+#: usr/local/www/firewall_aliases_edit.php:587
+#: usr/local/www/firewall_rules.php:341 usr/local/www/firewall_rules.php:343
+#: usr/local/www/load_balancer_pool.php:134
+#: usr/local/www/load_balancer_pool_edit.php:81
+#: usr/local/www/load_balancer_pool_edit.php:223
+#: usr/local/www/load_balancer_virtual_server.php:135
+#: usr/local/www/load_balancer_virtual_server_edit.php:192
+#: usr/local/www/services_captiveportal.php:731
+#: usr/local/www/services_captiveportal.php:752
+#: usr/local/www/services_captiveportal.php:774
+#: usr/local/www/services_captiveportal.php:793
+#: usr/local/www/status_upnp.php:87
+msgid "Port"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:311
+msgid ""
+"The port can be either the source or destination port. The packet capture "
+"will look for this port in either field."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:312
+msgid "Leave blank if you do not want to filter by port."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:316
+msgid "Packet Length"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:319
+msgid ""
+"The Packet length is the number of bytes of each packet that will be "
+"captured. Default value is 0, which will capture the entire frame regardless "
+"of its size."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:323 usr/local/www/diag_ping.php:60
+#: usr/local/www/diag_ping.php:132
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/services_captiveportal_vouchers_edit.php:190
+msgid "Count"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:326
+msgid ""
+"This is the number of packets the packet capture will grab. Default value is "
+"100."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:326
+msgid "Enter 0 (zero) for no count limit."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:330
+msgid "Level of Detail"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:333
+msgid "Normal"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:334
+msgid "Medium"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:335
+msgid "High"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:336
+msgid "Full"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:338
+msgid ""
+"This is the level of detail that will be displayed after hitting 'Stop' when "
+"the packets have been captured."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:340
+msgid ""
+"This option does not affect the level of detail when downloading the packet "
+"capture."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:344
+msgid "Reverse DNS Lookup"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:347
+msgid ""
+"This check box will cause the packet capture to perform a reverse DNS lookup "
+"associated with all IP addresses."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:348
+msgid "This option can cause delays for large packet captures."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:370
+msgid "View Capture"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:372
+msgid "The packet capture file was last updated:"
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:385
+#: usr/local/www/diag_packet_capture.php:422
+msgid "Packet Capture is running."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:429
+msgid "Packet Capture stopped."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:429
+msgid "Packets Captured:"
+msgstr ""
+
+#: usr/local/www/diag_patterns.php:43 usr/local/www/diag_patterns.php:85
+msgid "Upload Pattern file"
+msgstr ""
+
+#: usr/local/www/diag_patterns.php:49
+#, php-format
+msgid "Added custom l7 pattern %s"
+msgstr ""
+
+#: usr/local/www/diag_patterns.php:51
+msgid "Uploaded file to"
+msgstr ""
+
+#: usr/local/www/diag_patterns.php:54
+msgid "Warning: You must upload a file with .pat extension."
+msgstr ""
+
+#: usr/local/www/diag_patterns.php:63
+msgid "Add layer7 pattern"
+msgstr ""
+
+#: usr/local/www/diag_patterns.php:74
+msgid "Upload layer7 pattern file"
+msgstr ""
+
+#: usr/local/www/diag_patterns.php:77
+msgid "File to upload:"
+msgstr ""
+
+#: usr/local/www/diag_pf_info.php:101
+msgid "Gathering PF information, please wait..."
+msgstr ""
+
+#: usr/local/www/diag_ping.php:64
+#, php-format
+msgid "Count must be between 1 and %s"
+msgstr ""
+
+#: usr/local/www/diag_ping.php:70 usr/local/www/diag_traceroute.php:73
+msgid "When using IPv4, the target host must be an IPv4 address or hostname."
+msgstr ""
+
+#: usr/local/www/diag_ping.php:72 usr/local/www/diag_traceroute.php:75
+msgid "When using IPv6, the target host must be an IPv6 address or hostname."
+msgstr ""
+
+#: usr/local/www/diag_ping.php:151
+msgid "Ping output"
+msgstr ""
+
+#: usr/local/www/diag_pkglogs.php:86
+msgid "Package logs"
+msgstr ""
+
+#: usr/local/www/diag_pkglogs.php:97
+msgid "No packages with logging facilities are currently installed."
+msgstr ""
+
+#: usr/local/www/diag_pkglogs.php:108 usr/local/www/diag_pkglogs.php:110
+#, php-format
+msgid "%s"
+msgstr ""
+
+#: usr/local/www/diag_pkglogs.php:123
+#, php-format
+msgid "Last %1$s %2$s log entries"
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:55
+msgid "The state table has been flushed successfully."
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:61
+msgid "The source tracking table has been flushed successfully."
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:65
+msgid "Reset state"
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:92
+msgid "Firewall state table"
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:94
+msgid ""
+"Resetting the state tables will remove all entries from the corresponding "
+"tables. This means that all open connections will be broken and will have to "
+"be re-established. This may be necessary after making substantial changes to "
+"the firewall and/or NAT rules, especially if there are IP protocol mappings "
+"(e.g. for PPTP or IPv6) with open connections."
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:101
+msgid ""
+"The firewall will normally leave the state tables intact when changing rules."
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:104
+msgid ""
+"NOTE: If you reset the firewall state table, the browser session may appear "
+"to be hung after clicking &quot;Reset&quot;. Simply refresh the page to "
+"continue."
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:114
+msgid "Firewall Source Tracking"
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:116
+msgid ""
+"Resetting the source tracking table will remove all source/destination "
+"associations. This means that the \"sticky\" source/destination association "
+"will be cleared for all clients."
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:120
+msgid "This does not clear active connection states, only source tracking."
+msgstr ""
+
+#: usr/local/www/diag_resetstate.php:128 usr/local/www/status_lb_pool.php:219
+msgid "Reset"
+msgstr ""
+
+#: usr/local/www/diag_routes.php:71
+msgid "Routing tables"
+msgstr ""
+
+#: usr/local/www/diag_routes.php:169
+msgid "Name resolution"
+msgstr ""
+
+#: usr/local/www/diag_routes.php:173
+msgid "Enable this to attempt to resolve names when displaying the tables."
+msgstr ""
+
+#: usr/local/www/diag_routes.php:178
+msgid "Number of rows"
+msgstr ""
+
+#: usr/local/www/diag_routes.php:182 usr/local/www/diag_tables.php:169
+msgid "all"
+msgstr ""
+
+#: usr/local/www/diag_routes.php:188
+msgid "Select how many rows to display."
+msgstr ""
+
+#: usr/local/www/diag_routes.php:197
+msgid "Use a regular expression to filter IP address or hostnames."
+msgstr ""
+
+#: usr/local/www/diag_routes.php:204 usr/local/www/system_certmanager.php:413
+#: usr/local/www/system_certmanager.php:1025
+#: usr/local/www/system_certmanager.php:1069
+msgid "Update"
+msgstr ""
+
+#: usr/local/www/diag_routes.php:207
+msgid ""
+"By enabling name resolution, the query should take a bit longer. You can "
+"stop it at any time by clicking the Stop button in your browser."
+msgstr ""
+
+#: usr/local/www/diag_routes.php:219 usr/local/www/diag_routes.php:227
+msgid "Gathering data, please wait..."
+msgstr ""
+
+#: usr/local/www/diag_smart.php:18
+msgid "S.M.A.R.T. Monitor Tools"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:77
+msgid "PASSED"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:78
+msgid "FAILED"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:79
+msgid "Warning"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:130 usr/local/www/diag_smart.php:437
+msgid "Abort"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:179
+#, php-format
+msgid "Email sent to %s"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:219 usr/local/www/diag_smart.php:290
+msgid "Information/Tests"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:220 usr/local/www/diag_smart.php:231
+msgid "Config"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:234 usr/local/www/system_camanager.php:552
+#: usr/local/www/system_certmanager.php:776
+#: usr/local/www/system_certmanager.php:949
+msgid "Email Address"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:256
+msgid "Test email"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:261
+#, php-format
+msgid "Send test email to %s"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:269 usr/local/www/services_wol.php:153
+msgid "Send"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:302 usr/local/www/diag_smart.php:307
+msgid "Info"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:305
+msgid "Info type"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:308
+msgid "Health"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:309
+msgid "SMART Capabilities"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:310
+msgid "Attributes"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:311 usr/local/www/firewall_aliases.php:180
+#: usr/local/www/pkg_mgr.php:176
+msgid "All"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:315 usr/local/www/diag_smart.php:354
+#: usr/local/www/diag_smart.php:391 usr/local/www/diag_smart.php:421
+msgid "Device: /dev/"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:331 usr/local/www/diag_smart.php:407
+msgid "View"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:342
+msgid "Perform Self-tests"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:345
+msgid "Test type"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:347
+#: usr/local/www/status_gateway_groups.php:125
+#: usr/local/www/status_gateways.php:123
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:63
+msgid "Offline"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:348
+msgid "Short"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:349 usr/local/www/diag_system_pftop.php:135
+msgid "Long"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:350
+msgid "Conveyance (ATA Disks Only)"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:381
+msgid "View Logs"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:384
+msgid "Log type"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:386
+msgid "Error"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:387
+msgid "Self-test"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:418
+msgid "Abort tests"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:437
+msgid "Do you really want to abort the test?"
+msgstr ""
+
+#: usr/local/www/diag_smart.php:452
+msgid "Back"
+msgstr ""
+
+#: usr/local/www/diag_sockets.php:45 usr/local/www/fbegin.inc:229
+msgid "Sockets"
+msgstr ""
+
+#: usr/local/www/diag_states_summary.php:152
+#: usr/local/www/firewall_aliases.php:177
+#: usr/local/www/services_dnsmasq.php:354
+#: usr/local/www/services_dnsmasq.php:441
+#: usr/local/www/services_unbound.php:422
+#: usr/local/www/services_unbound.php:509 usr/local/www/vpn_pppoe_edit.php:550
+msgid "IP"
+msgstr ""
+
+#: usr/local/www/diag_states_summary.php:156
+msgid "Src Ports"
+msgstr ""
+
+#: usr/local/www/diag_states_summary.php:157
+msgid "Dst Ports"
+msgstr ""
+
+#: usr/local/www/diag_states_summary.php:187
+msgid "State Table Summary"
+msgstr ""
+
+#: usr/local/www/diag_states_summary.php:194
+msgid "By Source IP"
+msgstr ""
+
+#: usr/local/www/diag_states_summary.php:195
+msgid "By Destination IP"
+msgstr ""
+
+#: usr/local/www/diag_states_summary.php:196
+msgid "Total per IP"
+msgstr ""
+
+#: usr/local/www/diag_states_summary.php:197
+msgid "By IP Pair"
+msgstr ""
+
+#: usr/local/www/diag_system_activity.php:46
+msgid "Diagnostics: System Activity"
+msgstr ""
+
+#: usr/local/www/diag_system_activity.php:99
+msgid "Gathering CPU activity, please wait..."
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:131
+msgid "View type:"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:133 usr/local/www/interfaces.php:2972
+#: usr/local/www/interfaces.php:2983 usr/local/www/interfaces.php:2995
+#: usr/local/www/interfaces.php:3025 usr/local/www/interfaces.php:3041
+#: usr/local/www/interfaces.php:3057
+msgid "Default"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:134
+msgid "Label"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:136
+#: usr/local/www/firewall_rules.php:345 usr/local/www/status_queues.php:166
+msgid "Queue"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:137 usr/local/www/fbegin.inc:130
+#: usr/local/www/firewall_rules.php:50
+#: usr/local/www/firewall_rules_edit.php:805
+msgid "Rules"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:139
+msgid "Speed"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:146
+msgid "Sort type:"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:148
+msgid "Age"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:149
+msgid "Bytes"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:150
+msgid "Destination Address"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:152
+msgid "Expiry"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:154
+msgid "Peak"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:155
+msgid "Packet"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:164
+msgid "Number of States:"
+msgstr ""
+
+#: usr/local/www/diag_system_pftop.php:184
+msgid "Gathering pfTOP activity, please wait..."
+msgstr ""
+
+#: usr/local/www/diag_tables.php:45 usr/local/www/fbegin.inc:221
+msgid "Tables"
+msgstr ""
+
+#: usr/local/www/diag_tables.php:88
+msgid "The bogons database has been updated."
+msgstr ""
+
+#: usr/local/www/diag_tables.php:122
+msgid "Table:"
+msgstr ""
+
+#: usr/local/www/diag_tables.php:157 usr/local/www/diag_tables.php:159
+msgid "No entries exist in this table."
+msgstr ""
+
+#: usr/local/www/diag_tables.php:157 usr/local/www/diag_tables.php:166
+msgid " the latest bogon data."
+msgstr ""
+
+#: usr/local/www/diag_tables.php:166 usr/local/www/diag_tables.php:169
+msgid "entries in this table."
+msgstr ""
+
+#: usr/local/www/diag_tables.php:169
+#: usr/local/www/firewall_shaper_layer7.php:572
+#: usr/local/www/services_dhcpv6.php:809
+#: usr/local/www/system_firmware_restorefullbackup.php:164
+msgid "Delete"
+msgstr ""
+
+#: usr/local/www/diag_testport.php:49 usr/local/www/diag_testport.php:114
+#: usr/local/www/fbegin.inc:223
+msgid "Test Port"
+msgstr ""
+
+#: usr/local/www/diag_testport.php:64
+msgid "Please enter a valid IP or hostname."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:68
+msgid "Please enter a valid port number."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:72
+msgid "Please enter a valid source port number, or leave the field blank."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:76
+msgid "You cannot connect to an IPv4 address using IPv6."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:79
+msgid "You cannot connect to an IPv6 address using IPv4."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:106
+msgid ""
+"This page allows you to perform a simple TCP connection test to determine if "
+"a host is up and accepting connections on a given port. This test does not "
+"function for UDP since there is no way to reliably determine if a UDP port "
+"accepts connections in this manner."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:108
+msgid ""
+"No data is transmitted to the remote host during this test, it will only "
+"attempt to open a connection and optionally display the data sent back from "
+"the server."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:132
+msgid "This should typically be left blank."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:136
+msgid "Show Remote Text"
+msgstr ""
+
+#: usr/local/www/diag_testport.php:139
+msgid ""
+"Shows the text given by the server when connecting to the port. Will take "
+"10+ seconds to display if checked."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:168
+msgid "IPv4"
+msgstr ""
+
+#: usr/local/www/diag_testport.php:171
+msgid "IPv6"
+msgstr ""
+
+#: usr/local/www/diag_testport.php:175
+msgid ""
+"If you force IPv4 or IPv6 and use a hostname that does not contain a result "
+"using that protocol, it will result in an error. For example if you force "
+"IPv4 and use a hostname that only returns an AAAA IPv6 IP address, it will "
+"not work."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:188
+msgid "Port Test Results"
+msgstr ""
+
+#: usr/local/www/diag_testport.php:266
+msgid ""
+"No output received, or connection failed. Try with \"Show Remote Text\" "
+"unchecked first."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:268
+msgid "Connection failed (Refused/Timeout)"
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:64
+msgid "ttl"
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:68
+#, php-format
+msgid "Maximum number of hops must be between 1 and %s"
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:132
+msgid "Maximum number of hops"
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:142
+msgid "Reverse Address Lookup"
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:148
+msgid "Use ICMP"
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:162
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/services_ntpd_gps.php:402
+#: usr/local/www/services_ntpd_gps.php:404
+msgid "Note: "
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:163
+msgid ""
+"Traceroute may take a while to complete. You may hit the Stop button on your "
+"browser at any time to see the progress of failed traceroutes."
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:165
+msgid ""
+"Using a source interface/IP address that does not match selected type (IPv4, "
+"IPv6) will result in an error or empty output."
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:174
+msgid "Traceroute output:"
+msgstr ""
+
+#: usr/local/www/easyrule.php:42
+msgid "Firewall: EasyRule"
+msgstr ""
+
+#: usr/local/www/easyrule.php:77
+msgid "Message"
+msgstr ""
+
+#: usr/local/www/easyrule.php:80
+msgid ""
+"This is the Easy Rule status page, mainly used to display errors when adding "
+"rules. If you are seeing this, there apparently was not an error, and you "
+"navigated to the page directly without telling it what to do"
+msgstr ""
+
+#: usr/local/www/easyrule.php:83
+msgid ""
+"This page is meant to be called from the block/pass buttons on the Firewall "
+"Logs page"
+msgstr ""
+
+#: usr/local/www/easyrule.php:83
+msgid "System Logs, Firewall Tab"
+msgstr ""
+
+#: usr/local/www/edit.php:42
+msgid "Edit file"
+msgstr ""
+
+#: usr/local/www/edit.php:49 usr/local/www/edit.php:66
+msgid "No file name specified"
+msgstr ""
+
+#: usr/local/www/edit.php:51
+msgid "Loading a directory is not supported"
+msgstr ""
+
+#: usr/local/www/edit.php:53
+msgid "File does not exist or is not a regular file"
+msgstr ""
+
+#: usr/local/www/edit.php:57
+msgid "Failed to read file"
+msgstr ""
+
+#: usr/local/www/edit.php:78
+msgid "Failed to write file"
+msgstr ""
+
+#: usr/local/www/edit.php:80
+msgid "Error while writing file"
+msgstr ""
+
+#: usr/local/www/edit.php:82
+msgid "File successfully saved"
+msgstr ""
+
+#: usr/local/www/edit.php:104
+msgid "Loading file"
+msgstr ""
+
+#: usr/local/www/edit.php:124
+msgid "File successfully loaded"
+msgstr ""
+
+#: usr/local/www/edit.php:147
+msgid "Saving file"
+msgstr ""
+
+#: usr/local/www/edit.php:185
+msgid "Save / Load from path"
+msgstr ""
+
+#: usr/local/www/edit.php:187
+msgid "Load"
+msgstr ""
+
+#: usr/local/www/edit.php:188
+msgid "Browse"
+msgstr ""
+
+#: usr/local/www/exec.php:96
+msgid "Execute command"
+msgstr ""
+
+#: usr/local/www/exec.php:159
+msgid "Nothing to recall"
+msgstr ""
+
+#: usr/local/www/exec.php:228
+msgid "Note: this function is unsupported. Use it on your own risk"
+msgstr ""
+
+#: usr/local/www/exec.php:259
+msgid "Execute Shell command"
+msgstr ""
+
+#: usr/local/www/exec.php:262 usr/local/www/exec.php:315
+msgid "Command"
+msgstr ""
+
+#: usr/local/www/exec.php:270 usr/local/www/exec.php:321
+msgid "Execute"
+msgstr ""
+
+#: usr/local/www/exec.php:272 usr/local/www/status_upnp.php:79
+msgid "Clear"
+msgstr ""
+
+#: usr/local/www/exec.php:282
+msgid "File to download"
+msgstr ""
+
+#: usr/local/www/exec.php:296 usr/local/www/exec.php:306
+#: usr/local/www/services_captiveportal_filemanager.php:193
+msgid "Upload"
+msgstr ""
+
+#: usr/local/www/exec.php:299
+msgid "File to upload"
+msgstr ""
+
+#: usr/local/www/exec.php:312
+msgid "PHP Execute"
+msgstr ""
+
+#: usr/local/www/exec.php:323
+msgid "Example"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:100 usr/local/www/firewall_nat_edit.php:550
+#: usr/local/www/firewall_rules_edit.php:1096
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1302
+#: usr/local/www/firewall_rules_edit.php:1318
+#: usr/local/www/firewall_rules_edit.php:1358
+#: usr/local/www/firewall_rules_edit.php:1398
+#: usr/local/www/firewall_rules_edit.php:1428
+#: usr/local/www/firewall_rules_edit.php:1440
+#: usr/local/www/firewall_rules_edit.php:1495
+#: usr/local/www/firewall_rules_edit.php:1522
+#: usr/local/www/firewall_rules_edit.php:1571
+#: usr/local/www/firewall_rules_edit.php:1621
+#: usr/local/www/firewall_rules_edit.php:1676
+#: usr/local/www/interfaces.php:1743 usr/local/www/interfaces.php:2847
+#: usr/local/www/pkg_edit.php:1129 usr/local/www/services_dhcp.php:1044
+#: usr/local/www/services_dhcp.php:1066 usr/local/www/services_dhcp.php:1080
+#: usr/local/www/services_dhcp.php:1092 usr/local/www/services_dhcp.php:1104
+#: usr/local/www/services_dhcp.php:1116 usr/local/www/services_dhcp.php:1143
+#: usr/local/www/services_dhcp_edit.php:499
+#: usr/local/www/services_dhcp_edit.php:522
+#: usr/local/www/services_dhcp_edit.php:534
+#: usr/local/www/services_dhcpv6.php:700 usr/local/www/services_dhcpv6.php:723
+#: usr/local/www/services_dhcpv6.php:736 usr/local/www/services_dhcpv6.php:749
+#: usr/local/www/services_dhcpv6.php:761 usr/local/www/services_dhcpv6.php:776
+#: usr/local/www/services_dnsmasq.php:304
+#: usr/local/www/services_dnsmasq.php:307
+#: usr/local/www/services_dnsmasq.php:310 usr/local/www/services_ntpd.php:346
+#: usr/local/www/services_ntpd.php:366 usr/local/www/services_ntpd.php:395
+#: usr/local/www/services_ntpd_gps.php:558
+#: usr/local/www/services_unbound.php:368
+#: usr/local/www/services_unbound.php:371
+#: usr/local/www/services_unbound.php:374
+#: usr/local/www/services_unbound_advanced.php:191
+#: usr/local/www/system_gateways_edit.php:744
+#: usr/local/www/vpn_openvpn_client.php:1057
+#: usr/local/www/vpn_openvpn_csc.php:716
+#: usr/local/www/vpn_openvpn_server.php:1773
+msgid "Advanced"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:101 usr/local/www/system_firmware.php:103
+#: usr/local/www/system_firmware.php:202
+#: usr/local/www/system_firmware_auto.php:62
+#: usr/local/www/system_firmware_check.php:50
+#: usr/local/www/system_firmware_settings.php:87
+msgid "Firmware"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:102 usr/local/www/system.php:289
+msgid "General Setup"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:103
+msgid "High Avail. Sync"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:104 usr/local/www/services_captiveportal.php:1059
+msgid "Logout"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:106
+msgid "Packages"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:107
+msgid "Setup Wizard"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:109
+msgid "Cert Manager"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:111 usr/local/www/fbegin.inc:113
+#: usr/local/www/services_captiveportal.php:671
+#: usr/local/www/system_usermanager.php:58
+msgid "User Manager"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:119
+msgid "(assign)"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:131 usr/local/www/firewall_schedule.php:51
+#: usr/local/www/firewall_schedule_edit.php:62
+#: usr/local/www/system_advanced_misc.php:496
+msgid "Schedules"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:133 usr/local/www/firewall_virtual_ip.php:226
+msgid "Virtual IPs"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:140 usr/local/www/services_unbound.php:204
+#: usr/local/www/services_unbound_advanced.php:191
+#: usr/local/www/services_unbound_domainoverride_edit.php:115
+#: usr/local/www/services_unbound_host_edit.php:183
+msgid "DNS Resolver"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:145
+msgid "DHCPv6 Server/RA"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:151 usr/local/www/vpn_pppoe_edit.php:239
+msgid "PPPoE Server"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:152 usr/local/www/services_snmp.php:170
+msgid "SNMP"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:157 usr/local/www/fbegin.inc:193
+msgid "UPnP &amp; NAT-PMP"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:166 usr/local/www/interfaces.php:1411
+#: usr/local/www/status_interfaces.php:139
+msgid "PPTP"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:167 usr/local/www/interfaces.php:1411
+#: usr/local/www/status_interfaces.php:152 usr/local/www/vpn_l2tp.php:39
+#: usr/local/www/vpn_l2tp_users.php:39
+#: usr/local/www/vpn_l2tp_users_edit.php:39
+msgid "L2TP"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:174
+msgid "CARP (failover)"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:175
+msgid "Dashboard"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:177
+msgid "DHCP Leases"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:178
+msgid "DHCPv6 Leases"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:179
+msgid "Filter Reload"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:186
+msgid "Package Logs"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:187 usr/local/www/status_queues.php:124
+#: usr/local/www/status_rrd_graph.php:425
+#: usr/local/www/status_rrd_graph_settings.php:58
+#: usr/local/www/status_rrd_graph_settings.php:144
+msgid "Queues"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:188 usr/local/www/status_rrd_graph.php:260
+#: usr/local/www/status_rrd_graph_img.php:44
+#: usr/local/www/status_rrd_graph_settings.php:120
+#: usr/local/www/status_rrd_graph_settings.php:182
+msgid "RRD Graphs"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:189 usr/local/www/fbegin.inc:308
+#: usr/local/www/load_balancer_monitor.php:89
+#: usr/local/www/load_balancer_monitor_edit.php:196
+#: usr/local/www/load_balancer_pool.php:98
+#: usr/local/www/load_balancer_pool_edit.php:170
+#: usr/local/www/load_balancer_relay_action.php:105
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_relay_protocol.php:101
+#: usr/local/www/load_balancer_relay_protocol_edit.php:140
+#: usr/local/www/load_balancer_setting.php:100
+#: usr/local/www/load_balancer_virtual_server.php:99
+#: usr/local/www/load_balancer_virtual_server_edit.php:147
+#: usr/local/www/services_captiveportal.php:69
+#: usr/local/www/services_captiveportal_filemanager.php:72
+#: usr/local/www/services_captiveportal_hostname.php:67
+#: usr/local/www/services_captiveportal_hostname_edit.php:60
+#: usr/local/www/services_captiveportal_ip.php:65
+#: usr/local/www/services_captiveportal_ip_edit.php:61
+#: usr/local/www/services_captiveportal_mac.php:64
+#: usr/local/www/services_captiveportal_mac_edit.php:61
+#: usr/local/www/services_captiveportal_vouchers.php:92
+#: usr/local/www/services_captiveportal_vouchers_edit.php:46
+#: usr/local/www/services_captiveportal_zones_edit.php:46
+#: usr/local/www/services_dhcp.php:597
+#: usr/local/www/services_dhcp_edit.php:335
+#: usr/local/www/services_dhcp_relay.php:102
+#: usr/local/www/services_dhcpv6.php:375
+#: usr/local/www/services_dhcpv6_edit.php:185
+#: usr/local/www/services_dhcpv6_relay.php:103
+#: usr/local/www/services_dnsmasq.php:153
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:122
+#: usr/local/www/services_dnsmasq_edit.php:182
+#: usr/local/www/services_dyndns.php:61
+#: usr/local/www/services_dyndns_edit.php:181
+#: usr/local/www/services_igmpproxy.php:81 usr/local/www/services_ntpd.php:180
+#: usr/local/www/services_ntpd_gps.php:160
+#: usr/local/www/services_ntpd_pps.php:101
+#: usr/local/www/services_rfc2136.php:56
+#: usr/local/www/services_rfc2136_edit.php:116
+#: usr/local/www/services_router_advertisements.php:194
+#: usr/local/www/services_snmp.php:170 usr/local/www/services_unbound.php:204
+#: usr/local/www/services_unbound_advanced.php:191
+#: usr/local/www/services_unbound_domainoverride_edit.php:115
+#: usr/local/www/services_unbound_host_edit.php:183
+#: usr/local/www/services_wol.php:116 usr/local/www/services_wol_edit.php:116
+#: usr/local/www/status_services.php:68
+#: usr/local/www/system_authservers.php:192
+#: usr/local/www/vpn_pppoe_edit.php:239
+msgid "Services"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:190
+msgid "System Logs"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:191 usr/local/www/status_graph.php:114
+msgid "Traffic Graph"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:209
+msgid "Command Prompt"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:211
+msgid "Edit File"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:212
+msgid "Factory Defaults"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:217
+msgid "Halt System"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:218
+msgid "Limiter Info"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:224
+msgid "pfInfo"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:225
+msgid "pfTop"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:226
+msgid "Reboot"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:227 usr/local/www/system_gateway_groups.php:120
+#: usr/local/www/system_gateways.php:204 usr/local/www/system_routes.php:221
+msgid "Routes"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:228
+#: usr/local/www/widgets/widgets/smart_status.widget.php:40
+msgid "SMART Status"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:231
+msgid "States Summary"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:232
+msgid "System Activity"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:239
+msgid "Restart HTTPD"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:245
+msgid "pfSense Gold"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:250
+msgid "About this Page"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:252
+msgid "Bug Database"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:253
+msgid "User Forum"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:254
+msgid "Documentation"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:255
+msgid "Developers Wiki"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:256
+msgid "Paid Support"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:257
+msgid "pfSense Book"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:258
+msgid "Search portal"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:259
+msgid "FreeBSD Handbook"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:340
+msgid "Gold"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:349
+msgid "Help"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:428
+msgid "Help for items on this page"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:438
+msgid ""
+"Packages are currently being reinstalled in the background.<p>Do not make "
+"changes in the GUI until this is complete."
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:109
+#, php-format
+msgid "Cannot delete alias. Currently in use by %s"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:169
+msgid "The alias list has been changed."
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:169 usr/local/www/firewall_nat.php:184
+#: usr/local/www/firewall_nat_1to1.php:162
+#: usr/local/www/firewall_nat_npt.php:90
+#: usr/local/www/firewall_nat_out.php:226
+#: usr/local/www/firewall_shaper.php:406
+#: usr/local/www/firewall_shaper_layer7.php:402
+#: usr/local/www/firewall_shaper_queues.php:189
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/firewall_shaper_wizards.php:97
+#: usr/local/www/firewall_virtual_ip.php:218 usr/local/www/interfaces.php:1633
+#: usr/local/www/load_balancer_monitor.php:101
+#: usr/local/www/load_balancer_relay_protocol.php:113
+#: usr/local/www/load_balancer_setting.php:112
+#: usr/local/www/load_balancer_virtual_server.php:111
+#: usr/local/www/services_captiveportal_zones.php:75
+#: usr/local/www/services_dhcp.php:738 usr/local/www/services_dhcpv6.php:482
+#: usr/local/www/services_dnsmasq.php:182
+#: usr/local/www/services_igmpproxy.php:91
+#: usr/local/www/services_unbound_acls.php:179
+#: usr/local/www/services_unbound_advanced.php:204
+#: usr/local/www/system_gateways.php:196 usr/local/www/vpn_ipsec.php:231
+#: usr/local/www/vpn_ipsec_keys.php:92 usr/local/www/vpn_ipsec_mobile.php:331
+#: usr/local/www/vpn_pppoe.php:99
+msgid "You must apply the changes in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:178
+msgid "Ports"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:179
+msgid "URLs"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:192
+#: usr/local/www/services_igmpproxy.php:98
+msgid "Values"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:198
+#: usr/local/www/firewall_aliases.php:278
+msgid "Add a new alias"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:260
+msgid "Edit alias"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:261
+msgid ""
+"Do you really want to delete this alias? All elements that still use it will "
+"become invalid (e.g. filter rules)!"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:261
+msgid "Delete alias"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:281
+msgid "Bulk import aliases from list"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:291
+msgid ""
+"Aliases act as placeholders for real hosts, networks or ports. They can be "
+"used to minimize the number of changes that have to be made if a host, "
+"network or port changes. You can enter the name of an alias instead of the "
+"host, network or port in all fields that have a red background. The alias "
+"will be resolved according to the list above. If an alias cannot be resolved "
+"(e.g. because you deleted it), the corresponding element (e.g. filter/NAT/"
+"shaper rule) will be considered invalid and skipped."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:53
+#: usr/local/www/firewall_nat_1to1_edit.php:227
+#: usr/local/www/firewall_nat_edit.php:457
+#: usr/local/www/firewall_nat_npt_edit.php:148
+#: usr/local/www/firewall_nat_out_edit.php:343
+#: usr/local/www/firewall_rules_edit.php:805
+#: usr/local/www/firewall_schedule_edit.php:62
+#: usr/local/www/firewall_virtual_ip_edit.php:290
+#: usr/local/www/interfaces_bridge_edit.php:240
+#: usr/local/www/interfaces_gif_edit.php:136
+#: usr/local/www/interfaces_gre_edit.php:130
+#: usr/local/www/interfaces_groups_edit.php:45
+#: usr/local/www/interfaces_lagg_edit.php:137
+#: usr/local/www/interfaces_ppps_edit.php:389
+#: usr/local/www/interfaces_qinq_edit.php:40
+#: usr/local/www/interfaces_vlan_edit.php:152
+#: usr/local/www/interfaces_wireless_edit.php:151
+#: usr/local/www/load_balancer_monitor_edit.php:196
+#: usr/local/www/load_balancer_pool_edit.php:170
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_relay_protocol_edit.php:140
+#: usr/local/www/load_balancer_virtual_server_edit.php:147
+#: usr/local/www/pkg_edit.php:259 usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/services_rfc2136_edit.php:116
+#: usr/local/www/services_wol_edit.php:116
+#: usr/local/www/vpn_l2tp_users_edit.php:39
+#: usr/local/www/vpn_pppoe_edit.php:239
+#: usr/local/www/vpn_pptp_users_edit.php:138
+msgid "Edit"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:126
+msgid ""
+"Vertical bars (|) at start or end, or double in the middle of descriptions "
+"not allowed. Descriptions have been cleaned. Check and save again."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:137
+#: usr/local/www/firewall_aliases_edit.php:139
+msgid "Reserved word used for alias name."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:142
+msgid ""
+"The alias name must be less than 32 characters long, may not consist of only "
+"numbers, and may only contain the following characters"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:148
+#: usr/local/www/firewall_aliases_import.php:77
+msgid "An alias with this name already exists."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:157
+#: usr/local/www/firewall_aliases_import.php:83
+#, php-format
+msgid "Cannot use a reserved keyword as alias name %s"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:162
+#: usr/local/www/firewall_aliases_import.php:88
+msgid "An interface description with this name already exists."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:185
+msgid "You must provide a valid URL."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:187
+msgid "Unable to fetch usable data."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:199
+#: usr/local/www/firewall_aliases_edit.php:241
+#: usr/local/www/firewall_aliases_edit.php:306
+#, php-format
+msgid "Entry added %s"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:270
+#, php-format
+msgid "You must provide a valid URL. Could not fetch usable data from '%s'."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:274
+#, php-format
+msgid "URL '%s' is not valid."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:337
+#, php-format
+msgid "Range is too large to expand into individual host IP addresses (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:338
+#: usr/local/www/firewall_aliases_edit.php:366
+#, php-format
+msgid "The maximum number of entries in an alias is %s"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:346
+#: usr/local/www/firewall_aliases_import.php:113
+#, php-format
+msgid "IPv6 address ranges are not supported (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:365
+#, php-format
+msgid "Subnet is too large to expand into individual host IP addresses (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:373
+#, php-format
+msgid "IPv6 subnets are not supported in host aliases (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:400
+#, php-format
+msgid "The maximum number of entries in an alias has been exceeded (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:417
+msgid "is not a valid port or alias."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:421
+#, php-format
+msgid "%1$s is not a valid %2$s address, FQDN or alias."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:426
+#, php-format
+msgid "%s/%s is not a valid subnet."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:434
+#, php-format
+msgid ""
+"The alias(es): %s cannot be nested because they are not of the same type."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:580
+msgid "Network or FQDN"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:581
+#: usr/local/www/firewall_aliases_edit.php:775
+msgid "Network(s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:582
+#: usr/local/www/services_igmpproxy_edit.php:229
+#: usr/local/www/services_unbound_acls.php:241
+msgid "CIDR"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:584
+#: usr/local/www/firewall_aliases_edit.php:774
+#: usr/local/www/firewall_aliases_edit.php:786
+msgid "Host(s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:585
+msgid "IP or FQDN"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:586
+#: usr/local/www/firewall_aliases_edit.php:776
+msgid "Port(s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:588
+#: usr/local/www/firewall_aliases_edit.php:778
+msgid "URL (IPs)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:589
+#: usr/local/www/firewall_aliases_edit.php:779
+msgid "URL (Ports)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:590
+#: usr/local/www/firewall_aliases_edit.php:780
+msgid "URL Table (IPs)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:591
+#: usr/local/www/firewall_aliases_edit.php:781
+msgid "URL Table (Ports)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:592
+msgid "Update Freq. (days)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:594
+msgid ""
+"Networks are specified in CIDR format. Select the CIDR mask that pertains "
+"to each entry. /32 specifies a single IPv4 host, /128 specifies a single "
+"IPv6 host, /24 specifies 255.255.255.0, /64 specifies a normal IPv6 network, "
+"etc. Hostnames (FQDNs) may also be specified, using a /32 mask for IPv4 "
+"or /128 for IPv6. You may also enter an IP range such as "
+"192.168.1.1-192.168.1.254 and a list of CIDR networks will be derived to "
+"fill the range."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:595
+msgid ""
+"Enter as many hosts as you would like. Hosts must be specified by their IP "
+"address or fully qualified domain name (FQDN). FQDN hostnames are "
+"periodically re-resolved and updated. If multiple IPs are returned by a DNS "
+"query, all are used. You may also enter an IP range such as "
+"192.168.1.1-192.168.1.10 or a small subnet such as 192.168.1.16/28 and a "
+"list of individual IP addresses will be generated."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:596
+msgid ""
+"Enter as many ports as you wish. Port ranges can be expressed by separating "
+"with a colon."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:597
+#, php-format
+msgid ""
+"Enter as many URLs as you wish. After saving %s will download the URL and "
+"import the items into the alias. Use only with small sets of IP addresses "
+"(less than 3000)."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:598
+#, php-format
+msgid ""
+"Enter as many URLs as you wish. After saving %s will download the URL and "
+"import the items into the alias. Use only with small sets of Ports (less "
+"than 3000)."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:599
+#, php-format
+msgid ""
+"Enter a single URL containing a large number of IPs and/or Subnets. After "
+"saving %s will download the URL and create a table file containing these "
+"addresses. This will work with large numbers of addresses (30,000+) or small "
+"numbers."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:600
+#, php-format
+msgid ""
+"Enter a single URL containing a list of Port numbers and/or Port ranges. "
+"After saving %s will download the URL."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:603
+#: usr/local/www/firewall_aliases_edit.php:777
+msgid "OpenVPN Users"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:604
+msgid "Enter as many usernames as you wish."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:743
+msgid "Alias Edit"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:755
+msgid ""
+"The name of the alias may only consist of the characters \"a-z, A-Z, 0-9 and "
+"_\"."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:771
+#: usr/local/www/firewall_virtual_ip.php:241
+#: usr/local/www/firewall_virtual_ip_edit.php:110
+#: usr/local/www/firewall_virtual_ip_edit.php:384
+#: usr/local/www/load_balancer_monitor.php:123
+#: usr/local/www/load_balancer_monitor_edit.php:91
+#: usr/local/www/load_balancer_monitor_edit.php:249
+#: usr/local/www/load_balancer_relay_action.php:140
+#: usr/local/www/load_balancer_relay_action_edit.php:464
+#: usr/local/www/load_balancer_relay_protocol.php:134
+#: usr/local/www/load_balancer_relay_protocol_edit.php:82
+#: usr/local/www/load_balancer_relay_protocol_edit.php:202
+#: usr/local/www/services_captiveportal.php:894
+#: usr/local/www/services_dhcp.php:1157
+#: usr/local/www/services_igmpproxy.php:97
+#: usr/local/www/services_igmpproxy_edit.php:190
+#: usr/local/www/status_ntpd.php:182 usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:190
+#: usr/local/www/system_authservers.php:476
+#: usr/local/www/system_authservers.php:806
+#: usr/local/www/system_certmanager.php:805
+#: usr/local/www/vpn_ipsec_phase2.php:582
+#: usr/local/www/vpn_ipsec_phase2.php:617
+#: usr/local/www/vpn_ipsec_phase2.php:659
+msgid "Type"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:792
+msgid "Item information"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:796
+#: usr/local/www/firewall_nat_1to1_edit.php:368
+#: usr/local/www/firewall_nat_1to1_edit.php:442
+#: usr/local/www/firewall_nat_edit.php:571
+#: usr/local/www/firewall_nat_edit.php:660
+#: usr/local/www/firewall_nat_out_edit.php:542
+#: usr/local/www/firewall_nat_out_edit.php:593
+#: usr/local/www/firewall_rules_edit.php:1057
+#: usr/local/www/firewall_rules_edit.php:1160
+#: usr/local/www/firewall_virtual_ip_edit.php:424
+#: usr/local/www/services_igmpproxy_edit.php:228
+#: usr/local/www/services_unbound_acls.php:240
+#: usr/local/www/system_routes.php:234 usr/local/www/vpn_ipsec_mobile.php:435
+#: usr/local/www/vpn_ipsec_phase2.php:587
+#: usr/local/www/vpn_ipsec_phase2.php:622
+#: usr/local/www/vpn_ipsec_phase2.php:664
+msgid "Network"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:830
+#: usr/local/www/services_dnsmasq_edit.php:279
+#: usr/local/www/services_router_advertisements.php:345
+#: usr/local/www/services_unbound_host_edit.php:283
+#: usr/local/www/system_certmanager.php:825
+msgid "remove this entry"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:843
+#: usr/local/www/firewall_shaper_layer7.php:556
+#: usr/local/www/interfaces_groups_edit.php:322
+#: usr/local/www/interfaces_qinq_edit.php:390
+#: usr/local/www/services_dhcp.php:1197 usr/local/www/services_dhcpv6.php:817
+#: usr/local/www/services_dnsmasq_edit.php:290
+#: usr/local/www/services_igmpproxy_edit.php:275
+#: usr/local/www/services_router_advertisements.php:363
+#: usr/local/www/services_unbound_acls.php:281
+#: usr/local/www/services_unbound_host_edit.php:295
+#: usr/local/www/system_certmanager.php:837
+#: usr/local/www/vpn_pppoe_edit.php:586
+msgid "add another entry"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:852
+#: usr/local/www/firewall_aliases_import.php:216
+#: usr/local/www/firewall_nat_1to1_edit.php:537
+#: usr/local/www/firewall_nat_edit.php:897
+#: usr/local/www/firewall_nat_npt_edit.php:279
+#: usr/local/www/firewall_nat_out_edit.php:829
+#: usr/local/www/firewall_rules_edit.php:1262
+#: usr/local/www/firewall_rules_edit.php:1739
+#: usr/local/www/firewall_schedule_edit.php:1169
+#: usr/local/www/firewall_shaper_layer7.php:569
+#: usr/local/www/firewall_virtual_ip_edit.php:510
+#: usr/local/www/interfaces.php:1856 usr/local/www/interfaces.php:1962
+#: usr/local/www/interfaces.php:3380
+#: usr/local/www/interfaces_bridge_edit.php:605
+#: usr/local/www/interfaces_gif_edit.php:234
+#: usr/local/www/interfaces_gre_edit.php:237
+#: usr/local/www/interfaces_groups_edit.php:334
+#: usr/local/www/interfaces_lagg_edit.php:236
+#: usr/local/www/interfaces_ppps_edit.php:796
+#: usr/local/www/interfaces_qinq_edit.php:398
+#: usr/local/www/interfaces_vlan_edit.php:204
+#: usr/local/www/interfaces_wireless_edit.php:202
+#: usr/local/www/load_balancer_monitor_edit.php:359
+#: usr/local/www/load_balancer_pool_edit.php:335
+#: usr/local/www/load_balancer_relay_action_edit.php:559
+#: usr/local/www/load_balancer_relay_protocol_edit.php:282
+#: usr/local/www/load_balancer_virtual_server_edit.php:280
+#: usr/local/www/pkg_edit.php:942
+#: usr/local/www/services_captiveportal.php:1082
+#: usr/local/www/services_captiveportal_vouchers.php:637
+#: usr/local/www/services_dhcp_edit.php:546
+#: usr/local/www/services_dhcpv6_edit.php:250
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:165
+#: usr/local/www/services_dnsmasq_edit.php:306
+#: usr/local/www/services_dyndns_edit.php:425
+#: usr/local/www/services_igmpproxy_edit.php:283
+#: usr/local/www/services_rfc2136_edit.php:215
+#: usr/local/www/services_unbound_acls.php:311
+#: usr/local/www/services_unbound_domainoverride_edit.php:160
+#: usr/local/www/services_unbound_host_edit.php:311
+#: usr/local/www/services_wol_edit.php:162
+#: usr/local/www/system_advanced_sysctl.php:270
+#: usr/local/www/system_gateway_groups_edit.php:348
+#: usr/local/www/system_gateways_edit.php:862
+#: usr/local/www/system_groupmanager.php:461
+#: usr/local/www/system_groupmanager_addprivs.php:227
+#: usr/local/www/system_hasync.php:348
+#: usr/local/www/system_routes_edit.php:302
+#: usr/local/www/system_routes_edit.php:333
+#: usr/local/www/system_usermanager.php:883
+#: usr/local/www/system_usermanager_addprivs.php:196
+#: usr/local/www/vpn_l2tp_users_edit.php:183
+#: usr/local/www/vpn_pppoe_edit.php:605
+msgid "Cancel"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:50
+msgid "Bulk import"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:73
+msgid "The alias name may only consist of the characters"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:115
+#, php-format
+msgid "%s is not an IP address. Please correct the error to continue"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:123
+msgid ""
+"Descriptions may not start or end with vertical bar (|) or contain double "
+"vertical bar ||."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:132
+msgid "Descriptions must be less than 200 characters long."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:172
+msgid "Alias Import"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:175
+msgid "Alias Name"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:180
+msgid ""
+"The name of the alias may only consist of the characters \"a-z, A-Z and "
+"0-9\"."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:190
+#: usr/local/www/interfaces_lagg_edit.php:228
+#: usr/local/www/services_captiveportal_hostname_edit.php:189
+#: usr/local/www/services_captiveportal_ip_edit.php:206
+#: usr/local/www/services_captiveportal_mac_edit.php:222
+#: usr/local/www/services_captiveportal_zones_edit.php:110
+#: usr/local/www/system_gateways_edit.php:855
+#: usr/local/www/vpn_ipsec_phase1.php:665
+#: usr/local/www/vpn_ipsec_phase2.php:696
+#: usr/local/www/vpn_openvpn_client.php:667
+#: usr/local/www/vpn_openvpn_csc.php:368
+#: usr/local/www/vpn_openvpn_server.php:896
+msgid "You may enter a description here for your reference (not parsed)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:195
+msgid "Aliases to import"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:200
+msgid ""
+"Paste in the aliases to import separated by a carriage return. Common "
+"examples are lists of IPs, networks, blacklists, etc."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:202
+msgid ""
+"The list may contain IP addresses, with or without CIDR prefix, IP ranges, "
+"blank lines (ignored) and an optional description after each IP. e.g.:"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:167 usr/local/www/firewall_nat.php:190
+#: usr/local/www/firewall_nat_1to1.php:169
+#: usr/local/www/firewall_nat_edit.php:457
+#: usr/local/www/firewall_nat_npt.php:95
+#: usr/local/www/firewall_nat_out.php:233
+msgid "Port Forward"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:184 usr/local/www/firewall_nat_npt.php:90
+msgid "The NAT configuration has been changed"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:191 usr/local/www/firewall_nat_1to1.php:148
+#: usr/local/www/firewall_nat_1to1.php:170
+#: usr/local/www/firewall_nat_1to1_edit.php:227
+#: usr/local/www/firewall_nat_npt.php:96
+#: usr/local/www/firewall_nat_out.php:234
+msgid "1:1"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:192 usr/local/www/firewall_nat_1to1.php:171
+#: usr/local/www/firewall_nat_npt.php:97
+#: usr/local/www/firewall_nat_out.php:214
+#: usr/local/www/firewall_nat_out.php:235
+#: usr/local/www/firewall_nat_out_edit.php:343
+msgid "Outbound"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:193 usr/local/www/firewall_nat_1to1.php:172
+#: usr/local/www/firewall_nat_npt.php:81 usr/local/www/firewall_nat_npt.php:98
+#: usr/local/www/firewall_nat_npt_edit.php:148
+#: usr/local/www/firewall_nat_out.php:236
+msgid "NPt"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:206
+msgid "Src. addr"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:207
+msgid "Src. ports"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:208
+msgid "Dest. addr"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:209
+msgid "Dest. ports"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:210
+msgid "NAT IP"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:211
+msgid "NAT Ports"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:218 usr/local/www/firewall_nat.php:220
+#: usr/local/www/firewall_nat.php:349 usr/local/www/firewall_nat.php:351
+#: usr/local/www/firewall_nat_1to1.php:321
+#: usr/local/www/firewall_nat_out.php:515 usr/local/www/firewall_rules.php:367
+#: usr/local/www/firewall_rules.php:368 usr/local/www/firewall_rules.php:804
+#: usr/local/www/firewall_rules.php:805
+msgid "delete selected rules"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:220 usr/local/www/firewall_nat.php:351
+#: usr/local/www/firewall_rules.php:368 usr/local/www/firewall_rules.php:805
+msgid "Do you really want to delete the selected rules?"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:269
+msgid "All traffic matching this NAT entry is passed"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:271
+msgid "Firewall rule ID"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:271
+msgid "is managed with this rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:326 usr/local/www/firewall_nat_1to1.php:260
+#: usr/local/www/firewall_nat_out.php:460 usr/local/www/firewall_rules.php:402
+#: usr/local/www/firewall_rules.php:431 usr/local/www/firewall_rules.php:459
+#: usr/local/www/firewall_rules.php:750
+msgid "move selected rules before this rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:327 usr/local/www/firewall_nat_1to1.php:265
+#: usr/local/www/firewall_nat_npt.php:160 usr/local/www/firewall_rules.php:403
+#: usr/local/www/firewall_rules.php:432 usr/local/www/firewall_rules.php:460
+#: usr/local/www/firewall_rules.php:751
+msgid "edit rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:330 usr/local/www/firewall_nat_1to1.php:271
+#: usr/local/www/firewall_nat_out.php:469
+msgid "Do you really want to delete this rule?"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:330 usr/local/www/firewall_nat_1to1.php:272
+#: usr/local/www/firewall_nat_npt.php:161
+#: usr/local/www/firewall_nat_out.php:470 usr/local/www/firewall_rules.php:754
+msgid "delete rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:331 usr/local/www/firewall_nat_out.php:475
+msgid "add a new NAT based on this one"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:344 usr/local/www/firewall_rules.php:798
+msgid "move selected rules to end"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:362 usr/local/www/firewall_rules.php:817
+msgid "pass"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:366
+msgid "linked rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:160
+#: usr/local/www/firewall_nat_out.php:226
+msgid "The NAT configuration has been changed."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:183
+msgid "External IP"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:184
+#: usr/local/www/firewall_nat_1to1_edit.php:348
+#: usr/local/www/status_upnp.php:89
+msgid "Internal IP"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:185
+msgid "Destination IP"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:193
+#: usr/local/www/firewall_nat_npt.php:115
+#: usr/local/www/firewall_nat_npt.php:173
+msgid "add rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:219
+#: usr/local/www/firewall_nat_out.php:371 usr/local/www/firewall_rules.php:507
+#: usr/local/www/system_gateways.php:272 usr/local/www/system_gateways.php:278
+#: usr/local/www/system_routes.php:264 usr/local/www/vpn_ipsec.php:300
+#: usr/local/www/vpn_ipsec.php:475
+msgid "click to toggle enabled/disabled status"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:277
+#: usr/local/www/firewall_rules.php:407 usr/local/www/firewall_rules.php:436
+#: usr/local/www/firewall_rules.php:464 usr/local/www/firewall_rules.php:755
+msgid "add a new rule based on this one"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:298
+#: usr/local/www/firewall_nat_1to1.php:303
+#: usr/local/www/firewall_nat_out.php:495
+#: usr/local/www/firewall_nat_out.php:499
+msgid "move selected mappings to end"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:311
+#: usr/local/www/firewall_nat_out.php:320
+#: usr/local/www/firewall_nat_out.php:506
+msgid "add new mapping"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:326
+#: usr/local/www/firewall_nat_out.php:519
+msgid "delete selected mappings"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:327
+#: usr/local/www/firewall_nat_out.php:519
+msgid "Do you really want to delete the selected mappings?"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:340
+msgid "Depending on the way your WAN connection is setup, you may also need a"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:341
+msgid "Virtual IP."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1.php:342
+msgid ""
+"If you add a 1:1 NAT entry for any of the interface IPs on this system, it "
+"will make this system inaccessible on that IP address. i.e. if you use your "
+"WAN IP address, any services on this system (IPsec, OpenVPN server, etc.) "
+"using the WAN IP address will no longer function."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:112
+#: usr/local/www/firewall_nat_out_edit.php:141
+#, php-format
+msgid ""
+"Invalid characters detected (%s). Please remove invalid characters and save "
+"again."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:117
+msgid "External subnet"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:120
+#: usr/local/www/firewall_nat_edit.php:205
+msgid "Source address"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:124
+#: usr/local/www/firewall_nat_edit.php:209
+msgid "Destination address"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:155
+msgid "A valid external subnet must be specified."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:159
+#: usr/local/www/firewall_nat_edit.php:254
+#: usr/local/www/firewall_rules_edit.php:446
+#: usr/local/www/firewall_rules_edit.php:450
+msgid "You must specify single host or alias for alias entries."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:164
+#, php-format
+msgid "%s is not a valid internal IP address."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:167
+msgid "A valid internal bit count must be specified."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:174
+#: usr/local/www/firewall_nat_edit.php:267
+#: usr/local/www/firewall_rules_edit.php:463
+#, php-format
+msgid "%s is not a valid destination IP address or alias."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:177
+#: usr/local/www/firewall_nat_edit.php:270
+#: usr/local/www/firewall_nat_out_edit.php:188
+#: usr/local/www/firewall_rules_edit.php:466
+msgid "A valid destination bit count must be specified."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:284
+msgid "Edit NAT 1:1 entry"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:290
+#: usr/local/www/firewall_nat_edit.php:482
+#: usr/local/www/firewall_nat_npt_edit.php:168
+#: usr/local/www/firewall_nat_out_edit.php:456
+#: usr/local/www/firewall_rules_edit.php:859
+msgid "Disable this rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:291
+#: usr/local/www/firewall_nat_edit.php:483
+#: usr/local/www/firewall_nat_npt_edit.php:169
+#: usr/local/www/firewall_nat_out_edit.php:457
+#: usr/local/www/firewall_rules_edit.php:860
+msgid "Set this option to disable this rule without removing it from the list."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:332
+#: usr/local/www/firewall_nat_npt_edit.php:209
+msgid "Choose which interface this rule applies to"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:333
+#: usr/local/www/firewall_nat_npt_edit.php:210
+msgid "Hint: in most cases, you'll want to use WAN here"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:336
+msgid "External subnet IP"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:341
+msgid ""
+"Enter the external (usually on a WAN) subnet's starting address for the 1:1 "
+"mapping. The subnet mask from the internal address below will be applied to "
+"this IP address."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:343
+msgid ""
+"Hint: this is generally an address owned by the router itself on the "
+"selected interface."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:351
+#: usr/local/www/firewall_nat_1to1_edit.php:425
+#: usr/local/www/firewall_nat_edit.php:557
+#: usr/local/www/firewall_nat_edit.php:646
+#: usr/local/www/firewall_nat_npt_edit.php:216
+#: usr/local/www/firewall_nat_npt_edit.php:244
+#: usr/local/www/firewall_nat_out_edit.php:581
+#: usr/local/www/firewall_rules_edit.php:1037
+#: usr/local/www/firewall_rules_edit.php:1140
+msgid "not"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:353
+#: usr/local/www/firewall_nat_1to1_edit.php:427
+#: usr/local/www/firewall_nat_edit.php:559
+#: usr/local/www/firewall_nat_edit.php:648
+#: usr/local/www/firewall_nat_npt_edit.php:218
+#: usr/local/www/firewall_nat_npt_edit.php:246
+#: usr/local/www/firewall_nat_out_edit.php:582
+#: usr/local/www/firewall_rules_edit.php:1039
+#: usr/local/www/firewall_rules_edit.php:1142
+msgid "Use this option to invert the sense of the match."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:358
+#: usr/local/www/firewall_nat_1to1_edit.php:432
+#: usr/local/www/firewall_nat_edit.php:564
+#: usr/local/www/firewall_nat_edit.php:653
+#: usr/local/www/firewall_nat_out_edit.php:537
+#: usr/local/www/firewall_nat_out_edit.php:586
+#: usr/local/www/firewall_rules_edit.php:1044
+#: usr/local/www/firewall_rules_edit.php:1147
+#: usr/local/www/firewall_virtual_ip_edit.php:419
+msgid "Type:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:366
+msgid "Single host"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:372
+#: usr/local/www/firewall_nat_1to1_edit.php:448
+#: usr/local/www/firewall_nat_edit.php:573
+#: usr/local/www/firewall_nat_edit.php:663
+#: usr/local/www/firewall_rules_edit.php:1062
+#: usr/local/www/firewall_rules_edit.php:1163
+msgid "PPTP clients"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:377
+#: usr/local/www/firewall_nat_1to1_edit.php:455
+#: usr/local/www/firewall_nat_edit.php:576
+#: usr/local/www/firewall_nat_edit.php:666
+#: usr/local/www/firewall_rules_edit.php:1065
+#: usr/local/www/firewall_rules_edit.php:1166
+msgid "PPPoE clients"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:382
+#: usr/local/www/firewall_nat_1to1_edit.php:462
+#: usr/local/www/firewall_nat_edit.php:579
+#: usr/local/www/firewall_nat_edit.php:669
+#: usr/local/www/firewall_rules_edit.php:1068
+#: usr/local/www/firewall_rules_edit.php:1169
+msgid "L2TP clients"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:389
+#: usr/local/www/firewall_nat_1to1_edit.php:471
+#: usr/local/www/firewall_nat_edit.php:584
+#: usr/local/www/firewall_nat_edit.php:674
+#: usr/local/www/firewall_rules_edit.php:1073
+#: usr/local/www/firewall_rules_edit.php:1174
+msgid "net"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:392
+#: usr/local/www/firewall_nat_1to1_edit.php:474
+#: usr/local/www/firewall_nat_edit.php:586
+#: usr/local/www/firewall_nat_edit.php:676
+#: usr/local/www/firewall_rules_edit.php:1075
+#: usr/local/www/firewall_rules_edit.php:1176
+msgid "address"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:402
+#: usr/local/www/firewall_nat_1to1_edit.php:484
+#: usr/local/www/firewall_nat_edit.php:594
+#: usr/local/www/firewall_nat_edit.php:705
+#: usr/local/www/firewall_nat_npt_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:251
+#: usr/local/www/firewall_nat_out_edit.php:547
+#: usr/local/www/firewall_nat_out_edit.php:599
+#: usr/local/www/firewall_nat_out_edit.php:634
+#: usr/local/www/firewall_rules_edit.php:1083
+#: usr/local/www/firewall_rules_edit.php:1184
+#: usr/local/www/firewall_virtual_ip_edit.php:430
+#: usr/local/www/vpn_ipsec_phase2.php:598
+#: usr/local/www/vpn_ipsec_phase2.php:634
+msgid "Address:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:418
+msgid ""
+"Enter the internal (LAN) subnet for the 1:1 mapping. The subnet size "
+"specified for the internal subnet will be applied to the external subnet."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:439
+#: usr/local/www/firewall_nat_edit.php:570
+#: usr/local/www/firewall_nat_edit.php:659
+#: usr/local/www/firewall_rules_edit.php:1056
+#: usr/local/www/firewall_rules_edit.php:1159
+msgid "Single host or alias"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:502
+msgid ""
+"The 1:1 mapping will only be used for connections to or from the specified "
+"destination."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:503
+msgid "Hint: this is usually 'any'."
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:518
+#: usr/local/www/firewall_nat_edit.php:803
+msgid "NAT reflection"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:522
+msgid "use system default"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:525
+msgid "enable"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:528
+msgid "disable"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:124
+#, php-format
+msgid ""
+"Invalid characters detected %s. Please remove invalid characters and save "
+"again."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:197
+msgid "Destination port from"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:197
+msgid "Destination port to"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:213
+#: usr/local/www/firewall_nat_edit.php:760
+msgid "Redirect target IP"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:235
+#, php-format
+msgid "\"%s\" is not a valid redirect target IP address or host alias."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:239
+#: usr/local/www/firewall_rules_edit.php:410
+#, php-format
+msgid ""
+"%s is not a valid start source port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:241
+#, php-format
+msgid ""
+"%s is not a valid end source port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:243
+#: usr/local/www/firewall_rules_edit.php:414
+#, php-format
+msgid ""
+"%s is not a valid start destination port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:245
+#: usr/local/www/firewall_rules_edit.php:416
+#, php-format
+msgid ""
+"%s is not a valid end destination port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:248
+#, php-format
+msgid ""
+"A valid redirect target port must be specified. It must be a port alias or "
+"integer between 1 and 65535."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:259
+#: usr/local/www/firewall_rules_edit.php:455
+#, php-format
+msgid "%s is not a valid source IP address or alias."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:262
+#: usr/local/www/firewall_nat_out_edit.php:180
+#: usr/local/www/firewall_rules_edit.php:458
+msgid "A valid source bit count must be specified."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:289
+msgid "The target port range must be an integer between 1 and 65535."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:310
+msgid "The destination port range overlaps with an existing entry."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:422
+msgid "NAT Port Forward"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:472
+msgid "Edit Redirect entry"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:487
+msgid "No RDR (NOT)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:490
+msgid ""
+"Enabling this option will disable redirection for traffic matching this rule."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:491
+msgid ""
+"Hint: this option is rarely needed, don't use this unless you know what "
+"you're doing."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:533
+#: usr/local/www/firewall_nat_out_edit.php:507
+msgid "Choose which interface this rule applies to."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:534
+#: usr/local/www/firewall_nat_out_edit.php:508
+msgid "Hint: in most cases, you'll want to use WAN here."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:543
+#: usr/local/www/firewall_rules_edit.php:998
+msgid "Choose which IP protocol this rule should match."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:545
+msgid "Hint: in most cases, you should specify"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/load_balancer_monitor_edit.php:200
+#: usr/local/www/load_balancer_relay_action_edit.php:188
+#: usr/local/www/load_balancer_relay_protocol_edit.php:145
+msgid "TCP"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:550
+msgid "Show source address and port range"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:608
+#: usr/local/www/firewall_rules_edit.php:1102
+msgid "Source port range"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:612
+#: usr/local/www/firewall_nat_edit.php:725
+#: usr/local/www/firewall_rules_edit.php:1106
+#: usr/local/www/firewall_rules_edit.php:1205
+msgid "from:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:615
+#: usr/local/www/firewall_nat_edit.php:628
+#: usr/local/www/firewall_nat_edit.php:728
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/firewall_nat_edit.php:771
+#: usr/local/www/firewall_rules_edit.php:1109
+#: usr/local/www/firewall_rules_edit.php:1122
+#: usr/local/www/firewall_rules_edit.php:1208
+#: usr/local/www/firewall_rules_edit.php:1221
+msgid "other"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:625
+#: usr/local/www/firewall_nat_edit.php:738
+#: usr/local/www/firewall_rules_edit.php:1119
+#: usr/local/www/firewall_rules_edit.php:1218
+msgid "to:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:639
+msgid "Specify the source port or port range for this rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid "This is usually"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid "random"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:639
+msgid ""
+"and almost never equal to the destination port range (and should usually be "
+"'any')"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_nat_edit.php:755
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1235
+msgid "Hint: you can leave the"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid "field empty if you only want to filter a single port."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:661
+#: usr/local/www/firewall_nat_out_edit.php:541
+#: usr/local/www/firewall_rules_edit.php:1059
+#: usr/local/www/firewall_rules_edit.php:1161
+msgid "This Firewall (self)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:721
+msgid "Destination port range"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:753
+msgid ""
+"Specify the port or port range for the destination of the packet for this "
+"mapping."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:755
+msgid "field empty if you only want to map a single port"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:763
+msgid ""
+"Enter the internal IP address of the server on which you want to map the "
+"ports."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:765
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:138
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:145
+#: usr/local/www/services_dnsmasq_edit.php:220
+#: usr/local/www/services_dnsmasq_edit.php:227
+#: usr/local/www/services_dnsmasq_edit.php:234
+#: usr/local/www/services_unbound_domainoverride_edit.php:132
+#: usr/local/www/services_unbound_domainoverride_edit.php:142
+#: usr/local/www/services_unbound_host_edit.php:220
+#: usr/local/www/services_unbound_host_edit.php:228
+#: usr/local/www/services_unbound_host_edit.php:236
+#: usr/local/www/system.php:318 usr/local/www/system.php:329
+msgid "e.g."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:768
+msgid "Redirect target port"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:782
+msgid ""
+"Specify the port on the machine with the IP address entered above. In case "
+"of a port range, specify the beginning port of the range (the end port will "
+"be calculated automatically)."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:786
+msgid "Hint: this is usually identical to the 'from' port above"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:796
+#: usr/local/www/firewall_nat_out_edit.php:774
+#: usr/local/www/firewall_rules_edit.php:1425
+msgid "No XMLRPC Sync"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:799
+#: usr/local/www/firewall_nat_out_edit.php:777
+#: usr/local/www/firewall_rules_edit.php:1432
+msgid ""
+"Hint: This prevents the rule on Master from automatically syncing to other "
+"CARP members. This does NOT prevent the rule from being overwritten on Slave."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:806
+msgid "Use system default"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:807
+#: usr/local/www/system_advanced_firewall.php:490
+msgid "Enable (NAT + Proxy)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:808
+#: usr/local/www/system_advanced_firewall.php:491
+msgid "Enable (Pure NAT)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:809
+#: usr/local/www/services_dyndns_edit.php:241
+#: usr/local/www/system_advanced_firewall.php:489
+#: usr/local/www/system_advanced_misc.php:576
+#: usr/local/www/system_advanced_misc.php:592
+#: usr/local/www/system_firmware.php:127
+msgid "Disable"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:815
+#: usr/local/www/firewall_nat_edit.php:846
+msgid "Filter rule association"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:819
+#: usr/local/www/firewall_nat_edit.php:852
+msgid "Pass"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:829
+msgid "View the filter rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:837
+msgid "Create new associated filter rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:850
+msgid "Add associated filter rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:851
+msgid "Add unassociated filter rule"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:854
+msgid ""
+"NOTE: The \"pass\" selection does not work properly with Multi-WAN. It will "
+"only work on an interface containing the default gateway."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:870
+#: usr/local/www/firewall_nat_out_edit.php:797
+#: usr/local/www/firewall_rules_edit.php:1715
+msgid "Rule Information"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:874
+#: usr/local/www/firewall_nat_out_edit.php:803
+#: usr/local/www/firewall_rules_edit.php:1719
+msgid "Created"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:876
+#: usr/local/www/firewall_nat_edit.php:884
+#: usr/local/www/firewall_nat_out_edit.php:805
+#: usr/local/www/firewall_nat_out_edit.php:816
+#: usr/local/www/firewall_rules_edit.php:1721
+#: usr/local/www/firewall_rules_edit.php:1729 usr/local/www/license.php:49
+msgid "by"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:882
+#: usr/local/www/firewall_nat_out_edit.php:814
+#: usr/local/www/firewall_rules_edit.php:1727
+msgid "Updated"
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt.php:108
+msgid "External Prefix"
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt.php:109
+msgid "Internal prefix"
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt.php:161 usr/local/www/services_dhcp.php:1285
+#: usr/local/www/services_dhcpv6.php:891
+msgid "Do you really want to delete this mapping?"
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt_edit.php:110
+msgid "Source prefix"
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt_edit.php:112
+msgid "Destination prefix"
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt_edit.php:162
+msgid "Edit NAT NPt entry"
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt_edit.php:213
+msgid "Internal IPv6 Prefix"
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt_edit.php:235
+msgid ""
+"Enter the internal (LAN) ULA IPv6 Prefix for the Network Prefix translation. "
+"The prefix size specified for the internal IPv6 prefix will be applied to "
+"the \n"
+"external prefix."
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt_edit.php:241
+msgid "Destination IPv6 Prefix"
+msgstr ""
+
+#: usr/local/www/firewall_nat_npt_edit.php:265
+msgid "Enter the Global Unicast routable IPv6 prefix here"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:101
+#, php-format
+msgid " - %1$s to %2$s"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:104
+msgid "Manual Outbound NAT Switch"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:123
+msgid "Default rules for each interface have been created."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:245
+msgid "Mode:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:251
+msgid "Automatic outbound NAT rule generation"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:252
+msgid "(IPsec passthrough included)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:260
+msgid "Hybrid Outbound NAT rule generation"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:261
+msgid "(Automatic Outbound NAT + rules below)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:279
+msgid "Manual Outbound NAT rule generation"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:280
+msgid "(AON - Advanced Outbound NAT)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:288
+msgid "Disable Outbound NAT rule generation"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:289
+msgid "(No Outbound NAT rules)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:300
+msgid "Mappings:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:310
+#: usr/local/www/firewall_nat_out.php:547
+msgid "NAT Address"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/firewall_nat_out.php:548
+msgid "NAT Port"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:312
+#: usr/local/www/firewall_nat_out.php:549
+msgid "Static Port"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:365
+msgid "This rule is being ignored"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:448
+#: usr/local/www/firewall_nat_out.php:620
+msgid "YES"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:450
+#: usr/local/www/firewall_nat_out.php:622
+msgid "NO"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:463
+msgid "edit mapping"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:537
+msgid "Automatic rules:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:559
+msgid "automatic outbound nat"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:638
+msgid ""
+"If automatic outbound NAT selected, a mapping is automatically created for "
+"each interface's subnet (except WAN-type connections) and the rules on "
+"\"Mappings\" section of this page are ignored.<br /><br /> If manual "
+"outbound NAT is selected, outbound NAT rules will not be automatically "
+"generated and only the mappings you specify on this page will be used. <br /"
+"><br /> If hybrid outbound NAT is selected, mappings you specify on this "
+"page will be used, followed by the automatically generated ones. <br /><br /"
+">If disable outbound NAT is selected, no rules will be used. <br /><br />If "
+"a target address other than an interface's IP address is used, then "
+"depending on the way the WAN connection is setup, a "
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:650
+msgid " may also be required."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:146
+msgid "Source bit count"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_rules_edit.php:395
+msgid "Destination bit count"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:166
+msgid ""
+"You must supply either a valid port or port alias for the source port entry."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:169
+msgid ""
+"You must supply either a valid port or port alias for the destination port "
+"entry."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:172
+msgid "You must supply a valid port for the NAT port entry."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:176
+msgid "A valid source must be specified."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:184
+msgid "A valid destination must be specified."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:192
+msgid "Negating destination address of \"any\" is invalid."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:197
+msgid "A valid target IP address must be specified."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:202
+msgid "A valid target IP must be specified when using the 'Other Subnet' type."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:205
+msgid ""
+"A valid target bit count must be specified when using the 'Other Subnet' "
+"type."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:218
+msgid "Only Round Robin pool options may be chosen when selecting an alias."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:446
+msgid "Edit Advanced Outbound NAT entry"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:461
+msgid "Do not NAT"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:464
+msgid ""
+"Enabling this option will disable NAT for traffic matching this rule and "
+"stop processing Outbound NAT rules."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:465
+msgid "Hint: in most cases, you won't use this option."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:525
+msgid "Choose which protocol this rule should match."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:527
+#, php-format
+msgid "Hint: in most cases, you should specify %s any %s here."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:564
+msgid "Enter the source network for the outbound NAT mapping."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:568
+msgid "Source port:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:571
+#: usr/local/www/firewall_nat_out_edit.php:623
+msgid "(leave blank for any)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:616
+msgid "Enter the destination network for the outbound NAT mapping."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:620
+msgid "Destination port:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:630
+msgid "Translation"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:638
+msgid "Interface address"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:684
+msgid "Other Subnet (Enter Below)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:691
+msgid "Other Subnet:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:709
+msgid "Packets matching this rule will be mapped to the IP address given here."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:710
+msgid ""
+"If you want this rule to apply to another IP address rather than the IP "
+"address of the interface chosen above, select it here (you will need to "
+"define "
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:713
+msgid "addresses on the interface first)."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:745
+msgid ""
+"Only Round Robin types work with Host Aliases. Any type can be used with a "
+"Subnet."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:746
+msgid "Round Robin: Loops through the translation addresses."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:747
+msgid "Random: Selects an address from the translation address pool at random."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:748
+msgid ""
+"Source Hash: Uses a hash of the source address to determine the translation "
+"address, ensuring that the redirection address is always the same for a "
+"given source."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:749
+msgid ""
+"Bitmask: Applies the subnet mask and keeps the last portion identical; "
+"10.0.1.50 -&gt; x.x.x.50."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:750
+msgid ""
+"Sticky Address: The Sticky Address option can be used with the Random and "
+"Round Robin pool types to ensure that a particular source address is always "
+"mapped to the same translation address."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:755
+msgid "Port:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:763
+msgid "Enter the source port for the outbound NAT mapping."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:767
+msgid "Static-port:"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:109
+msgid "Drag and drop firewall rules ordering update."
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:184
+#, php-format
+msgid ""
+"The settings have been applied. The firewall rules are now reloading in the "
+"background.<br />You can also %s monitor %s the reload progress"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:292 usr/local/www/firewall_rules.php:294
+msgid ""
+"The firewall rule configuration has been changed.<br />You must apply the "
+"changes in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:292 usr/local/www/guiconfig.inc:307
+#: usr/local/www/headjs.php:148
+msgid "Apply changes"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:315
+msgid "Floating"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:344
+#: usr/local/www/firewall_rules_edit.php:1519 usr/local/www/interfaces.php:511
+#: usr/local/www/interfaces.php:564 usr/local/www/services_dhcp.php:944
+#: usr/local/www/services_dhcp_edit.php:455
+#: usr/local/www/status_gateways.php:75 usr/local/www/system_gateways.php:219
+#: usr/local/www/system_gateways_edit.php:696
+#: usr/local/www/system_routes.php:235 usr/local/www/system_routes_edit.php:87
+#: usr/local/www/system_routes_edit.php:244
+msgid "Gateway"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:346
+#: usr/local/www/firewall_rules_edit.php:1492
+msgid "Schedule"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:371 usr/local/www/firewall_rules.php:774
+#: usr/local/www/firewall_rules.php:808
+msgid "add new rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:398
+msgid "Anti-Lockout Rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:420
+msgid "RFC 1918 networks"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:427 usr/local/www/interfaces.php:3348
+msgid "Block private networks"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:448
+msgid "Reserved/not assigned by IANA"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:455 usr/local/www/interfaces.php:3360
+msgid "Block bogon networks"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:480
+msgid "advanced settings set"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:858
+msgid "Mon"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+msgid "Tues"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:860
+msgid "Wed"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+msgid "Thur"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:862
+msgid "Fri"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:863
+msgid "Sat"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:864
+msgid "Sun"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "January"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "February"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "March"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "April"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "May"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "June"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "July"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "August"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "September"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "October"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "November"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "December"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:654
+msgid "Traffic matching this rule is currently being denied"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:657
+msgid "Traffic matching this rule is currently being allowed"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:665
+msgid "This rule is not currently active because its period has expired"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:769
+msgid "No floating rules are currently defined."
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:771
+msgid "No rules are currently defined for this interface"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:772
+msgid ""
+"All incoming connections on this interface will be blocked until you add "
+"pass rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:774
+msgid "Click the"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:774
+msgid " button to add a new rule."
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:820
+msgid "match"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:823
+msgid "block"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:826
+msgid "reject"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:829
+msgid "log"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:833
+msgid "pass (disabled)"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:836
+msgid "match (disabled)"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:839
+msgid "block (disabled)"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:842
+msgid "reject (disabled)"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:845
+msgid "log (disabled)"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:851
+#: usr/local/www/load_balancer_pool.php:148 usr/local/www/vpn_l2tp.php:359
+#: usr/local/www/vpn_l2tp.php:376
+msgid "Hint:"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:855
+msgid ""
+"Rules are evaluated on a first-match basis (i.e. the action of the first "
+"rule to match a packet will be executed). This means that if you use block "
+"rules, you'll have to pay attention to the rule order. Everything that isn't "
+"explicitly passed is blocked by default. "
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:862
+msgid ""
+"Floating rules are evaluated on a first-match basis (i.e. the action of the "
+"first rule to match a packet will be executed) only if the 'quick' option is "
+"checked on a rule. Otherwise they will only apply if no other rules match. "
+"Pay close attention to the rule order and options chosen. If no rule here "
+"matches, the per-interface or default rules are used. "
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:278
+#: usr/local/www/firewall_rules_edit.php:292
+msgid "You can not assign a gateway to a rule that applies to IPv4 and IPv6"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:281
+msgid "You can not assign an IPv4 gateway group on IPv6 Address Family rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:284
+msgid "You can not assign an IPv6 gateway group on IPv4 Address Family rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:295
+msgid "You can not assign an IPv4 Gateway to an IPv6 Filter rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:298
+msgid "You can not assign an IPv6 Gateway to an IPv4 Filter rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:304
+msgid ""
+"You can not assign a protocol other than ICMP, TCP, UDP or TCP/UDP to a rule "
+"that applies to IPv4 and IPv6"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:308
+msgid "You can not assign a ICMP type to a rule that applies to IPv4 and IPv6"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:382
+#, php-format
+msgid "%s is only valid with protocol TCP."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:384
+#, php-format
+msgid "%s is only valid if the gateway is set to 'default'."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:412
+#, php-format
+msgid ""
+"%s is not a valid end source port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:471
+#, php-format
+msgid ""
+"The Source IP address %s Address Family differs from the destination %s."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:473
+msgid "You can not use IPv6 addresses in IPv4 rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:475
+msgid "You can not use IPv4 addresses in IPv6 rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:479
+msgid "You can not use a IPv4 or IPv6 address in combined IPv4 + IPv6 rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:495
+msgid "OS detection is only valid with protocol TCP."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:497
+msgid "Invalid OS detection selection. Please select a valid OS."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:502
+msgid "You have to select a queue when you select an acknowledge queue too."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:504
+msgid "Acknowledge queue and Queue cannot be the same."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:507
+msgid ""
+"You can not use limiters in Floating rules without choosing a direction."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:509
+msgid ""
+"You can not use gateways in Floating rules without choosing a direction."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:512
+msgid ""
+"You must select a queue for the In direction before selecting one for Out "
+"too."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:514
+msgid "In and Out Queue cannot be the same."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:516
+#: usr/local/www/firewall_rules_edit.php:518
+msgid ""
+"You cannot select one queue and one virtual interface for IN and Out. Both "
+"must be from the same type."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:520
+msgid ""
+"Please select a gateway, normally the interface selected gateway, so the "
+"limiters work correctly"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:523
+msgid "ID must be an integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:526
+msgid "You can only select a layer7 container for TCP and/or UDP protocols"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:528
+msgid "You can only select a layer7 container for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:533
+msgid ""
+"You can only specify the maximum number of established connections per host "
+"(advanced option) for TCP protocol."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:535
+msgid ""
+"You can only specify the maximum new connections per host / per second(s) "
+"(advanced option) for TCP protocol."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:537
+msgid ""
+"You can only specify the state timeout (advanced option) for TCP protocol."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:542
+msgid ""
+"You can only specify the maximum state entries (advanced option) for Pass "
+"type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:544
+msgid ""
+"You can only specify the maximum number of unique source hosts (advanced "
+"option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:546
+msgid ""
+"You can only specify the maximum number of established connections per host "
+"(advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:548
+msgid ""
+"You can only specify the maximum state entries per host (advanced option) "
+"for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:550
+msgid ""
+"You can only specify the maximum new connections per host / per second(s) "
+"(advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:552
+msgid ""
+"You can only specify the state timeout (advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:557
+msgid ""
+"You cannot specify the maximum state entries (advanced option) if statetype "
+"is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:559
+msgid ""
+"You cannot specify the maximum number of unique source hosts (advanced "
+"option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:561
+msgid ""
+"You cannot specify the maximum number of established connections per host "
+"(advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:563
+msgid ""
+"You cannot specify the maximum state entries per host (advanced option) if "
+"statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:565
+msgid ""
+"You cannot specify the maximum new connections per host / per second(s) "
+"(advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:567
+msgid ""
+"You cannot specify the state timeout (advanced option) if statetype is none "
+"and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:571
+msgid "Maximum state entries (advanced option) must be a positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:574
+msgid ""
+"Maximum number of unique source hosts (advanced option) must be a positive "
+"integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:577
+msgid ""
+"Maximum number of established connections per host (advanced option) must be "
+"a positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:580
+msgid ""
+"Maximum state entries per host (advanced option) must be a positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:583
+msgid ""
+"Maximum new connections per host / per second(s) (advanced option) must be a "
+"positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:586
+msgid "State timeout (advanced option) must be a positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:590
+msgid ""
+"Both maximum new connections per host and the interval (per second(s)) must "
+"be specified"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:602
+msgid ""
+"If you specify TCP flags that should be set you should specify out of which "
+"flags as well."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:829
+msgid "Edit Firewall rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:850
+msgid "Choose what to do with packets that match the criteria specified below."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:851
+msgid ""
+"Hint: the difference between block and reject is that with reject, a packet "
+"(TCP RST or ICMP port unreachable for UDP) is returned to the sender, "
+"whereas with block the packet is dropped silently. In either case, the "
+"original packet is discarded."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:866
+msgid "Quick"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:870
+msgid "Apply the action immediately on match."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:871
+msgid ""
+"Set this option if you need to apply this action to traffic that matches "
+"this rule immediately."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:878
+msgid "Associated filter rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:880
+msgid "This is associated to a NAT rule."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:881
+msgid ""
+"You cannot edit the interface, protocol, source, or destination of "
+"associated filter rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:888
+msgid "View the NAT rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:948
+msgid "Choose on which interface packets must come in to match this rule."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:972
+msgid "TCP/IP Version"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:984
+msgid "Select the Internet Protocol version this rule applies to"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:998
+msgid "Hint: in most cases, you should specify "
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1002
+msgid "ICMP type"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1014
+#: usr/local/www/firewall_rules_edit.php:1030
+msgid ""
+"If you selected ICMP for the protocol above, you may specify an ICMP type "
+"here."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1018
+msgid "ICMPv6 type"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1096
+msgid "Show source port range"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid "Specify the source port or port range for this rule."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid ""
+"and almost never equal to the destination port range (and should usually be"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1235
+msgid "'to'"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1201
+msgid "Destination port range "
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1233
+msgid ""
+"Specify the port or port range for the destination of the packet for this "
+"rule."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1235
+msgid "field empty if you only want to filter a single port"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1240
+msgid "Log"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1243
+msgid "Log packets that are handled by this rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1245
+msgid ""
+"Hint: the firewall has limited local log space. Don't turn on logging for "
+"everything. If you want to do a lot of logging, consider using a remote "
+"syslog server"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1245
+msgid "see the"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1245
+msgid "Diagnostics: System logs: Settings"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1245
+#: usr/local/www/services_captiveportal.php:1060
+#: usr/local/www/system_advanced_firewall.php:345
+msgid "page"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1253
+#: usr/local/www/services_unbound_acls.php:300
+msgid "You may enter a description here for your reference."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1274 usr/local/www/pkg_edit.php:446
+msgid "Advanced features"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1277
+msgid "Source OS"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1302
+#: usr/local/www/firewall_rules_edit.php:1318
+#: usr/local/www/firewall_rules_edit.php:1358
+#: usr/local/www/firewall_rules_edit.php:1398
+#: usr/local/www/firewall_rules_edit.php:1428
+#: usr/local/www/firewall_rules_edit.php:1440
+#: usr/local/www/firewall_rules_edit.php:1495
+#: usr/local/www/firewall_rules_edit.php:1522
+#: usr/local/www/firewall_rules_edit.php:1571
+#: usr/local/www/firewall_rules_edit.php:1621
+#: usr/local/www/firewall_rules_edit.php:1676
+#: usr/local/www/interfaces.php:1743 usr/local/www/pkg_edit.php:1129
+#: usr/local/www/services_dnsmasq.php:307
+#: usr/local/www/services_unbound.php:371
+msgid "Show advanced option"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1283
+msgid "OS Type:"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1294
+msgid ""
+"Note: this only works for TCP rules. General OS choice matches all subtypes."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1299
+msgid "Diffserv Code Point"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1315
+#: usr/local/www/interfaces_ppps_edit.php:688
+#: usr/local/www/vpn_ipsec_phase1.php:862
+#: usr/local/www/vpn_ipsec_phase2.php:817
+msgid "Advanced Options"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1322
+msgid ""
+"This allows packets with IP options to pass. Otherwise they are blocked by "
+"default. This is usually only seen with multicast traffic."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1325
+msgid "This will disable auto generated reply-to for this rule."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1328
+msgid ""
+"You can mark a packet matching this rule and use this mark to match on other "
+"NAT/filter rules. It is called"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1328
+msgid "Policy filtering"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1331
+msgid "You can match packet on a mark placed before on another rule."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1333
+msgid " Maximum state entries this rule can create"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1334
+msgid " Maximum number of unique source hosts"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1335
+msgid " Maximum number of established connections per host (TCP only)"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1336
+msgid " Maximum state entries per host"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1345
+msgid "Maximum new connections per host / per second(s) (TCP only)"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1348
+msgid "State Timeout in seconds (TCP only)"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1350
+msgid "Note: Leave fields blank to disable that feature."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1355
+msgid "TCP flags"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1387
+msgid "Any flags."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1389
+msgid ""
+"Use this to choose TCP flags that must be set or cleared for this rule to "
+"match."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1395
+msgid "State Type"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1404
+msgid ""
+"Hint: This prevents states created by this rule to be sync'ed over pfsync."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1407
+#: usr/local/www/firewall_rules_edit.php:1416
+msgid "keep state"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1408
+#: usr/local/www/firewall_rules_edit.php:1417
+msgid "sloppy state"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1409
+#: usr/local/www/firewall_rules_edit.php:1418
+msgid "synproxy state"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1413
+msgid ""
+"Hint: Select which type of state tracking mechanism you would like to use. "
+"If in doubt, use keep state."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1416
+#: usr/local/www/firewall_rules_edit.php:1417
+msgid "Works with all IP protocols."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1418
+msgid ""
+"Proxies incoming TCP connections to help protect servers from spoofed TCP "
+"SYN floods. This option includes the functionality of keep state and "
+"modulate state combined."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1419
+msgid ""
+"Do not use state mechanisms to keep track. This is only useful if you're "
+"doing advanced queueing in certain situations. Please check the "
+"documentation."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1437
+msgid "802.1p"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1472
+msgid "Choose 802.1p priority to match on"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1476
+msgid "Choose 802.1p priority to apply"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1514
+msgid "Leave as 'none' to leave the rule enabled all the time."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1526
+#: usr/local/www/services_captiveportal.php:896
+#: usr/local/www/services_captiveportal.php:926
+#: usr/local/www/services_ntpd_gps.php:464
+#: usr/local/www/services_ntpd_gps.php:470
+#: usr/local/www/services_ntpd_gps.php:476
+#: usr/local/www/services_ntpd_gps.php:552
+#: usr/local/www/services_ntpd_pps.php:162
+#: usr/local/www/services_ntpd_pps.php:168
+#: usr/local/www/services_ntpd_pps.php:212
+msgid "default"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1563
+msgid ""
+"Leave as 'default' to use the system routing table. Or choose a gateway to "
+"utilize policy based routing."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1568
+msgid "In/Out"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1612
+msgid ""
+"Choose the Out queue/Virtual interface only if you have also selected In."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1612
+msgid ""
+"The Out selection is applied to traffic leaving the interface where the rule "
+"is created, In is applied to traffic coming into the chosen interface."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1612
+msgid ""
+"If you are creating a floating rule, if the direction is In then the same "
+"rules apply, if the direction is out the selections are reverted Out is for "
+"incoming and In is for outgoing."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1618
+msgid "Ackqueue/Queue"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1668
+msgid "Choose the Acknowledge Queue only if you have selected Queue."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1673
+#: usr/local/www/firewall_shaper.php:415
+#: usr/local/www/firewall_shaper_layer7.php:60
+#: usr/local/www/firewall_shaper_layer7.php:411
+#: usr/local/www/firewall_shaper_queues.php:198
+#: usr/local/www/firewall_shaper_vinterface.php:395
+#: usr/local/www/firewall_shaper_wizards.php:106
+msgid "Layer7"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1696
+msgid ""
+"Choose a Layer7 container to apply application protocol inspection rules. "
+"These are valid for TCP and UDP protocols only."
+msgstr ""
+
+#: usr/local/www/firewall_schedule.php:78
+#, php-format
+msgid "Cannot delete Schedule. Currently in use by %s"
+msgstr ""
+
+#: usr/local/www/firewall_schedule.php:98
+msgid "Time Range(s)"
+msgstr ""
+
+#: usr/local/www/firewall_schedule.php:104
+#: usr/local/www/firewall_schedule.php:234
+msgid "add a new schedule"
+msgstr ""
+
+#: usr/local/www/firewall_schedule.php:116
+msgid "Schedule is currently active"
+msgstr ""
+
+#: usr/local/www/firewall_schedule.php:221
+msgid "edit alias"
+msgstr ""
+
+#: usr/local/www/firewall_schedule.php:222
+msgid "Do you really want to delete this schedule?"
+msgstr ""
+
+#: usr/local/www/firewall_schedule.php:222
+msgid "delete alias"
+msgstr ""
+
+#: usr/local/www/firewall_schedule.php:241
+msgid ""
+"Schedules act as placeholders for time ranges to be used in Firewall Rules."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:90
+msgid "Schedule may not be named LAN."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:92
+msgid "Schedule may not be named WAN."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:94
+msgid "Schedule name cannot be blank."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:98
+msgid "Reserved word used for schedule name."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:101
+msgid "The schedule name may only consist of the characters a-z, A-Z, 0-9"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:110
+msgid "A Schedule with this name already exists."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:123
+#, php-format
+msgid "Invalid start time - '%s'"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:127
+#, php-format
+msgid "Invalid stop time - '%s'"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:175
+msgid "The schedule must have at least one time range configured."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:782
+msgid "Schedule information"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:788
+msgid "Schedule Name"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:794
+msgid "NOTE: This schedule is in use so the name may not be modified!"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:799
+msgid ""
+"The name of the alias may only consist of the characters a-z, A-Z and 0-9"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:816
+msgid "Month"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:859
+msgid "Tue"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:861
+msgid "Thu"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:918
+msgid ""
+"Click individual date to select that date only. Click the appropriate "
+"weekday Header to select all occurrences of that weekday."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:926
+#: usr/local/www/firewall_schedule_edit.php:1008
+msgid "Start Time"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:926
+#: usr/local/www/firewall_schedule_edit.php:1009
+msgid "Stop Time"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:939
+#: usr/local/www/firewall_schedule_edit.php:964
+msgid "Hr"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:946
+#: usr/local/www/firewall_schedule_edit.php:971
+msgid "Min"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:975
+msgid ""
+"Select the time range for the day(s) selected on the Month(s) above. A full "
+"day is 0:00-23:59."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:979
+msgid "Time Range Description"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:989
+msgid "Add Time"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:990
+msgid "Clear Selection"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:999
+msgid "Schedule repeat"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:1002
+msgid "Configured Ranges"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:1007
+msgid "Day(s)"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:132
+#: usr/local/www/firewall_shaper_vinterface.php:146
+msgid "Unable to write config.xml (Access Denied?)"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:161
+#: usr/local/www/firewall_shaper_vinterface.php:160
+msgid "Could not create new queue/discipline!"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:177 usr/local/www/firewall_shaper.php:186
+#: usr/local/www/firewall_shaper.php:195
+#: usr/local/www/firewall_shaper_vinterface.php:173
+#: usr/local/www/firewall_shaper_vinterface.php:183
+#: usr/local/www/firewall_shaper_vinterface.php:193
+msgid "Queue not found!"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:272
+#: usr/local/www/firewall_shaper_vinterface.php:247
+msgid "Could not add new queue."
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:348
+#: usr/local/www/firewall_shaper_vinterface.php:316
+msgid "Queue Actions"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:359
+#: usr/local/www/firewall_shaper_vinterface.php:327
+msgid "Add new queue"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:370
+#: usr/local/www/firewall_shaper_vinterface.php:338
+msgid "Delete this queue"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:372
+msgid "Disable shaper on interface"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:406
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/firewall_shaper_wizards.php:97
+msgid "The traffic shaper configuration has been changed."
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:412
+#: usr/local/www/firewall_shaper_layer7.php:408
+#: usr/local/www/firewall_shaper_queues.php:195
+#: usr/local/www/firewall_shaper_vinterface.php:392
+#: usr/local/www/firewall_shaper_wizards.php:103
+msgid "By Interface"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:413
+#: usr/local/www/firewall_shaper_layer7.php:409
+#: usr/local/www/firewall_shaper_queues.php:196
+#: usr/local/www/firewall_shaper_vinterface.php:393
+#: usr/local/www/firewall_shaper_wizards.php:104
+msgid "By Queue"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:414
+#: usr/local/www/firewall_shaper_layer7.php:410
+#: usr/local/www/firewall_shaper_queues.php:197
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_vinterface.php:394
+#: usr/local/www/firewall_shaper_wizards.php:105
+msgid "Limiter"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:416
+#: usr/local/www/firewall_shaper_layer7.php:412
+#: usr/local/www/firewall_shaper_queues.php:199
+#: usr/local/www/firewall_shaper_vinterface.php:396
+#: usr/local/www/firewall_shaper_wizards.php:74
+#: usr/local/www/firewall_shaper_wizards.php:107
+#: usr/local/www/vpn_openvpn_client.php:448
+#: usr/local/www/vpn_openvpn_csc.php:319
+#: usr/local/www/vpn_openvpn_server.php:746
+msgid "Wizards"
+msgstr ""
+
+#: usr/local/www/firewall_shaper.php:427
+msgid "Remove Shaper"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_layer7.php:67
+msgid "You can add new layer7 protocol patterns by simply uploading the file"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_layer7.php:112
+msgid "Layer7 Rules Container not found!"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_layer7.php:162
+msgid "Found the following repeated protocol definitions"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_layer7.php:402
+#: usr/local/www/firewall_shaper_queues.php:189
+msgid "The traffic shaper configuration has been changed"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_layer7.php:433
+msgid "Create new l7 rules group"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_layer7.php:446
+msgid "Rule(s)"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_layer7.php:458
+msgid "Add one or more rules"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_layer7.php:474
+msgid "Structure"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_layer7.php:481
+msgid "Behaviour"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_queues.php:173
+msgid "Firewall: Shaper: By Queues View"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_vinterface.php:102
+msgid ""
+"This pipe/queue is referenced in filter rules, please remove references from "
+"there before deleting."
+msgstr ""
+
+#: usr/local/www/firewall_shaper_vinterface.php:114
+#, php-format
+msgid "No queue with name %s was found!"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_vinterface.php:205
+#: usr/local/www/firewall_shaper_vinterface.php:230
+msgid "You cannot name a child queue with the same name as a parent limiter"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_vinterface.php:340
+msgid "Delete Limiter"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_vinterface.php:415
+msgid "Create new limiter"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_wizards.php:78
+msgid "Multiple Lan/Wan"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_wizards.php:79
+msgid "Dedicated Links"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_wizards.php:116
+msgid "Wizard function"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_wizards.php:117
+msgid "Wizard Link"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:104
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"NAT mapping."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:138
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"Gateway."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:165
+msgid ""
+"This entry cannot be deleted because it is still referenced by a CARP IP "
+"with the description"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:170
+msgid ""
+"This entry cannot be deleted because it is still referenced by an IP alias "
+"entry with the description"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:203
+msgid "Virtual IP Addresses"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:218
+msgid "The VIP configuration has been changed."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:227
+msgid "CARP Settings"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:239
+msgid "Virtual IP address"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:285
+#: usr/local/www/services_captiveportal_zones.php:117
+#: usr/local/www/services_dyndns.php:179 usr/local/www/services_wol.php:189
+#: usr/local/www/system_advanced_sysctl.php:210
+msgid "Do you really want to delete this entry?"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:307
+msgid "The virtual IP addresses defined on this page may be used in"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:307
+msgid "mappings."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip.php:308
+msgid "You can check the status of your CARP Virtual IPs and interfaces "
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:119
+#: usr/local/www/services_dhcp_edit.php:180
+#: usr/local/www/services_dnsmasq_edit.php:103
+#: usr/local/www/services_unbound_host_edit.php:105
+msgid "A valid IP address must be specified."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:140
+msgid "This IP address is being used by another interface or VIP."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:149
+msgid ""
+"The interface chosen for the VIP has no IPv4 or IPv6 address configured so "
+"it cannot be used as a parent for the VIP."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:163
+msgid "You cannot use the network address for this VIP"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:165
+msgid "You cannot use the broadcast address for this VIP"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:177
+#, php-format
+msgid ""
+"VHID %s is already in use on interface %s. Pick a unique number on this "
+"interface."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:181
+msgid ""
+"You must specify a CARP password that is shared between the two VHID members."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:194
+#: usr/local/www/firewall_virtual_ip_edit.php:218
+msgid "For this type of vip localhost is not allowed."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:196
+#: usr/local/www/firewall_virtual_ip_edit.php:220
+msgid ""
+"A CARP parent interface can only be used with IP Alias type Virtual IPs."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:212
+#, php-format
+msgid ""
+"Sorry, we could not locate an interface with a matching subnet for %s. "
+"Please add an IP alias in this subnet on this interface."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:290
+msgid "Virtual IP Address"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:316
+#: usr/local/www/firewall_virtual_ip_edit.php:318
+msgid ""
+"This must be the network's subnet mask. It does not specify a CIDR range."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:317
+msgid "This is a CIDR block of proxy ARP addresses."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:381
+msgid "Edit Virtual IP"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:387
+msgid "IP Alias"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:391
+msgid "Proxy ARP"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:393
+msgid "Other"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:415
+msgid "IP Address(es)"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:422
+msgid "Single address"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:442
+msgid "Expansion:"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:462
+msgid "Virtual IP Password"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:464
+msgid "Enter the VHID group password."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:468
+msgid "VHID Group"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:476
+msgid "Enter the VHID group that the machines will share"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:480
+msgid "Advertising Frequency"
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:497
+msgid ""
+"The frequency that this machine will advertise. 0 means usually master. "
+"Otherwise the lowest combination of both values in the cluster determines "
+"the master."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:522
+msgid ""
+"Proxy ARP and Other type Virtual IPs cannot be bound to by anything running "
+"on the firewall, such as IPsec, OpenVPN, etc. Use a CARP or IP Alias type "
+"address for these cases."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:523
+msgid "For more information on CARP and the above values, visit the OpenBSD "
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:523
+msgid "CARP FAQ"
+msgstr ""
+
+#: usr/local/www/graph.php:117
+msgid "In"
+msgstr ""
+
+#: usr/local/www/graph.php:118
+msgid "Out"
+msgstr ""
+
+#: usr/local/www/graph.php:122
+msgid "Switch to bytes/s"
+msgstr ""
+
+#: usr/local/www/graph.php:123
+msgid "AutoScale"
+msgstr ""
+
+#: usr/local/www/graph.php:126
+msgid "Graph shows last"
+msgstr ""
+
+#: usr/local/www/graph.php:126 usr/local/www/interfaces.php:2721
+#: usr/local/www/interfaces.php:2843
+#: usr/local/www/interfaces_bridge_edit.php:347
+#: usr/local/www/interfaces_bridge_edit.php:357
+#: usr/local/www/interfaces_bridge_edit.php:366
+#: usr/local/www/interfaces_bridge_edit.php:437
+#: usr/local/www/services_dhcp.php:968 usr/local/www/services_dhcp.php:978
+#: usr/local/www/services_dhcp_edit.php:479
+#: usr/local/www/services_dhcp_edit.php:489
+#: usr/local/www/services_dhcpv6.php:655 usr/local/www/services_dhcpv6.php:665
+#: usr/local/www/services_ntpd_gps.php:463
+#: usr/local/www/services_ntpd_gps.php:469
+#: usr/local/www/services_ntpd_pps.php:161
+#: usr/local/www/services_rfc2136_edit.php:162
+#: usr/local/www/vpn_ipsec_phase1.php:855
+#: usr/local/www/vpn_ipsec_phase1.php:900
+#: usr/local/www/vpn_ipsec_phase2.php:810
+msgid "seconds"
+msgstr ""
+
+#: usr/local/www/graph.php:129 usr/local/www/graph_cpu.php:85
+msgid "Collecting initial data, please wait"
+msgstr ""
+
+#: usr/local/www/graph.php:141 usr/local/www/graph_cpu.php:97
+msgid "No URL for getURL"
+msgstr ""
+
+#: usr/local/www/graph.php:148 usr/local/www/graph_cpu.php:104
+msgid "No callback function for getURL"
+msgstr ""
+
+#: usr/local/www/graph.php:164 usr/local/www/graph_cpu.php:120
+msgid "Both getURL and XMLHttpRequest are undefined"
+msgstr ""
+
+#: usr/local/www/graph.php:201
+msgid "Switch to"
+msgstr ""
+
+#: usr/local/www/graph.php:207
+msgid "follow"
+msgstr ""
+
+#: usr/local/www/graph.php:368
+msgid "Kbps"
+msgstr ""
+
+#: usr/local/www/graph.php:370
+msgid "Mbps"
+msgstr ""
+
+#: usr/local/www/graph.php:372
+msgid "Gbps"
+msgstr ""
+
+#: usr/local/www/graph.php:378
+msgid "KB/s"
+msgstr ""
+
+#: usr/local/www/graph.php:380
+msgid "MB/s"
+msgstr ""
+
+#: usr/local/www/graph.php:382
+msgid "GB/s"
+msgstr ""
+
+#: usr/local/www/graph_cpu.php:84
+msgid "Cannot get CPU load"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:257
+#, php-format
+msgid "The field %s contains invalid characters."
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:263
+#, php-format
+msgid "The field %s is required."
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:280
+msgid "The following input errors were detected:"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:314
+msgid "apply"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:314
+msgid "save"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:314 usr/local/www/system_certmanager.php:667
+#: usr/local/www/vpn_ipsec_mobile.php:336
+msgid "create"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:337 usr/local/www/guiconfig.inc:402
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:98
+#: usr/local/www/system_usermanager_settings_test.php:128
+msgid "Close"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:379
+msgid "Undo"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:448
+msgid "The changes have been applied successfully."
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:453
+msgid ""
+"You can also <a href=\"status_filter_reload.php\">monitor</a> the filter "
+"reload progress."
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:1013
+msgid "Currently viewing: "
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:1071
+msgid "move mouse out this alias to hide"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:1111
+msgid "listing only first 10k items"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:1135
+msgid "edit this alias"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:1146 usr/local/www/guiconfig.inc:1158
+msgid "loading..."
+msgstr ""
+
+#: usr/local/www/halt.php:55
+msgid "Halt system"
+msgstr ""
+
+#: usr/local/www/halt.php:62
+msgid "The system is halting now. This may take one minute."
+msgstr ""
+
+#: usr/local/www/halt.php:68
+msgid "Are you sure you want to halt the system?"
+msgstr ""
+
+#: usr/local/www/index.php:128
+msgid "Widget configuration has been changed."
+msgstr ""
+
+#: usr/local/www/index.php:185
+#, php-format
+msgid "Welcome to %s!\n"
+msgstr ""
+
+#: usr/local/www/index.php:186
+msgid "One moment while we start the initial setup wizard."
+msgstr ""
+
+#: usr/local/www/index.php:187
+msgid ""
+"Embedded platform users: Please be patient, the wizard takes a little longer "
+"to run than the normal GUI."
+msgstr ""
+
+#: usr/local/www/index.php:188
+#, php-format
+msgid "To bypass the wizard, click on the %s logo on the initial page."
+msgstr ""
+
+#: usr/local/www/index.php:467
+msgid "Status: Dashboard"
+msgstr ""
+
+#: usr/local/www/index.php:497
+msgid "Available Widgets"
+msgstr ""
+
+#: usr/local/www/index.php:534
+msgid "Welcome to the Dashboard page"
+msgstr ""
+
+#: usr/local/www/index.php:541
+msgid ""
+"This page allows you to customize the information you want to be displayed!"
+msgstr ""
+
+#: usr/local/www/index.php:542
+msgid "To get started click the"
+msgstr ""
+
+#: usr/local/www/index.php:542
+msgid "icon to add widgets."
+msgstr ""
+
+#: usr/local/www/index.php:544
+msgid "You can move any widget around by clicking and dragging the title."
+msgstr ""
+
+#: usr/local/www/index.php:551
+msgid "Click here to add widgets"
+msgstr ""
+
+#: usr/local/www/index.php:553
+msgid "Click here for help"
+msgstr ""
+
+#: usr/local/www/index.php:557
+msgid "Save Settings"
+msgstr ""
+
+#: usr/local/www/index.php:730
+msgid "Loading selected widget"
+msgstr ""
+
+#: usr/local/www/installer/installer.php:187
+msgid "Could not open /tmp/installer.sh for writing"
+msgstr ""
+
+#: usr/local/www/installer/installer.php:362
+#, php-format
+msgid "Beginning installation on disk %s."
+msgstr ""
+
+#: usr/local/www/installer/installer.php:408
+msgid "Installer"
+msgstr ""
+
+#: usr/local/www/installer/installer.php:916
+#: usr/local/www/installer/installer.php:1104
+msgid "ERROR: Could not find any suitable disks for installation."
+msgstr ""
+
+#: usr/local/www/interfaces.php:250
+#, php-format
+msgid "Sorry, an alias with the name %s already exists."
+msgstr ""
+
+#: usr/local/www/interfaces.php:415
+msgid "You have already applied your settings!"
+msgstr ""
+
+#: usr/local/www/interfaces.php:495
+msgid "An interface with the specified description already exists."
+msgstr ""
+
+#: usr/local/www/interfaces.php:500
+msgid "The interface description cannot contain only numbers."
+msgstr ""
+
+#: usr/local/www/interfaces.php:504
+msgid ""
+"The DHCP Server is active on this interface and it can be used only with a "
+"static IP configuration. Please disable the DHCP Server service on this "
+"interface first, then change the interface configuration."
+msgstr ""
+
+#: usr/local/www/interfaces.php:506
+msgid ""
+"The DHCP6 Server is active on this interface and it can be used only with a "
+"static IPv6 configuration. Please disable the DHCPv6 Server service on this "
+"interface first, then change the interface configuration."
+msgstr ""
+
+#: usr/local/www/interfaces.php:511 usr/local/www/interfaces.php:1777
+#: usr/local/www/status_interfaces.php:260
+msgid "IPv4 address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:511 usr/local/www/interfaces.php:564
+msgid "Subnet bit count"
+msgstr ""
+
+#: usr/local/www/interfaces.php:518
+msgid ""
+"This interface is referenced by IPv4 VIPs. Please delete those before "
+"setting the interface to 'none' configuration."
+msgstr ""
+
+#: usr/local/www/interfaces.php:523 usr/local/www/interfaces.php:576
+#: usr/local/www/interfaces.php:588 usr/local/www/interfaces.php:598
+#: usr/local/www/interfaces.php:603
+#, php-format
+msgid "You have to reassign the interface to be able to configure as %s."
+msgstr ""
+
+#: usr/local/www/interfaces.php:527 usr/local/www/interfaces.php:2643
+msgid "Modem Port"
+msgstr ""
+
+#: usr/local/www/interfaces.php:527 usr/local/www/interfaces.php:2631
+#: usr/local/www/interfaces_ppps_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:536
+msgid "Phone Number"
+msgstr ""
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:536
+msgid "PPPoE username"
+msgstr ""
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:536
+msgid "PPPoE password"
+msgstr ""
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:543
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:2711
+#: usr/local/www/interfaces.php:2833
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:210
+msgid "Dial on demand"
+msgstr ""
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:543
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:210
+msgid "Idle timeout value"
+msgstr ""
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP username"
+msgstr ""
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP password"
+msgstr ""
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP local IP address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP subnet"
+msgstr ""
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP remote IP address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:556
+msgid "L2TP username"
+msgstr ""
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:556
+msgid "L2TP password"
+msgstr ""
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:556
+msgid "L2TP remote IP address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:571
+msgid ""
+"This interface is referenced by IPv6 VIPs. Please delete those before "
+"setting the interface to 'none' configuration."
+msgstr ""
+
+#: usr/local/www/interfaces.php:582
+msgid "You can only have one interface configured in 6rd with same prefix."
+msgstr ""
+
+#: usr/local/www/interfaces.php:593
+#, php-format
+msgid "You can only have one interface configured as 6to4."
+msgstr ""
+
+#: usr/local/www/interfaces.php:606
+msgid "You must enter a valid hexadecimal number for the IPv6 prefix ID."
+msgstr ""
+
+#: usr/local/www/interfaces.php:618
+#, php-format
+msgid "This track6 prefix ID is already being used in %s."
+msgstr ""
+
+#: usr/local/www/interfaces.php:631
+msgid "A valid IPv4 address must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:634
+msgid "This IPv4 address is being used by another interface or VIP."
+msgstr ""
+
+#: usr/local/www/interfaces.php:639
+msgid "This IPv4 address is the network address and cannot be used"
+msgstr ""
+
+#: usr/local/www/interfaces.php:641
+msgid "This IPv4 address is the broadcast address and cannot be used"
+msgstr ""
+
+#: usr/local/www/interfaces.php:647
+msgid "This IPv4 address conflicts with a Static Route."
+msgstr ""
+
+#: usr/local/www/interfaces.php:656 usr/local/www/services_dhcpv6_edit.php:132
+msgid "A valid IPv6 address must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:659
+msgid "This IPv6 address is being used by another interface or VIP."
+msgstr ""
+
+#: usr/local/www/interfaces.php:664
+msgid "This IPv6 address conflicts with a Static Route."
+msgstr ""
+
+#: usr/local/www/interfaces.php:672 usr/local/www/interfaces.php:674
+msgid "A valid subnet bit count must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:676
+msgid "A valid alias IP address must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:678
+msgid "A valid alias subnet bit count must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:680
+msgid "A valid alias IP address must be specified to reject DHCP Leases from."
+msgstr ""
+
+#: usr/local/www/interfaces.php:694 usr/local/www/system_routes_edit.php:99
+msgid "A valid gateway must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:698
+msgid "The service name contains invalid characters."
+msgstr ""
+
+#: usr/local/www/interfaces.php:700 usr/local/www/interfaces.php:716
+#: usr/local/www/interfaces_ppps_edit.php:228
+msgid "The idle timeout value must be an integer."
+msgstr ""
+
+#: usr/local/www/interfaces.php:703 usr/local/www/interfaces_ppps_edit.php:231
+msgid "A valid PPPoE reset hour must be specified (0-23)."
+msgstr ""
+
+#: usr/local/www/interfaces.php:706 usr/local/www/interfaces_ppps_edit.php:234
+msgid "A valid PPPoE reset minute must be specified (0-59)."
+msgstr ""
+
+#: usr/local/www/interfaces.php:708 usr/local/www/interfaces_ppps_edit.php:236
+msgid "A valid PPPoE reset date must be specified (mm/dd/yyyy)."
+msgstr ""
+
+#: usr/local/www/interfaces.php:710
+msgid "A valid PPTP local IP address must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:712
+msgid "A valid PPTP subnet bit count must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:714
+msgid "A valid PPTP remote IP address must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:718 usr/local/www/services_dhcp_edit.php:183
+#: usr/local/www/services_wol.php:87 usr/local/www/services_wol_edit.php:94
+msgid "A valid MAC address must be specified."
+msgstr ""
+
+#: usr/local/www/interfaces.php:731
+#, php-format
+msgid "The MTU must be between %d and %d bytes."
+msgstr ""
+
+#: usr/local/www/interfaces.php:742
+msgid "The MTU of a VLAN cannot be greater than that of its parent interface."
+msgstr ""
+
+#: usr/local/www/interfaces.php:757
+#, php-format
+msgid "Interface %s (VLAN) has MTU set to a larger value"
+msgstr ""
+
+#: usr/local/www/interfaces.php:763
+msgid "The MSS must be an integer between 576 and 65535 bytes."
+msgstr ""
+
+#: usr/local/www/interfaces.php:767 usr/local/www/interfaces.php:3075
+#: usr/local/www/interfaces_wireless.php:111
+#: usr/local/www/interfaces_wireless_edit.php:90
+#: usr/local/www/interfaces_wireless_edit.php:182
+#: usr/local/www/load_balancer_pool.php:132
+#: usr/local/www/load_balancer_pool_edit.php:81
+#: usr/local/www/load_balancer_pool_edit.php:207
+#: usr/local/www/load_balancer_virtual_server_edit.php:76
+#: usr/local/www/status_lb_pool.php:132 usr/local/www/vpn_ipsec.php:276
+#: usr/local/www/vpn_ipsec.php:444 usr/local/www/vpn_ipsec_phase2.php:563
+msgid "Mode"
+msgstr ""
+
+#: usr/local/www/interfaces.php:770 usr/local/www/interfaces.php:3085
+#: usr/local/www/status_interfaces.php:363
+msgid "SSID"
+msgstr ""
+
+#: usr/local/www/interfaces.php:805
+msgid ""
+"Invalid WEP key. Enter a valid 40, 64, 104 or 128 bit WEP key."
+msgstr ""
+
+#: usr/local/www/interfaces.php:813
+msgid "The WPA passphrase must be between 8 and 63 characters long."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1383
+#, php-format
+msgid ""
+"Unable to change mode to %s. You may already have the maximum number of "
+"wireless clones supported in this mode."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1411
+msgid "Static IPv4"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1411 usr/local/www/status_interfaces.php:126
+#: usr/local/www/vpn_pppoe.php:88
+msgid "PPPoE"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1412
+msgid "Static IPv6"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1412
+msgid "DHCP6"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1412
+msgid "SLAAC"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1412
+msgid "6rd Tunnel"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1412
+msgid "6to4 Tunnel"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1412
+msgid "Track Interface"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1633
+#, php-format
+msgid "The %s configuration has been changed."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1633
+msgid "Don't forget to adjust the DHCP Server range if needed after applying."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1642
+msgid "General configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1648
+msgid "Enable Interface"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1658
+msgid "Enter a description (name) for the interface here."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1662
+msgid "IPv4 Configuration Type"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1678
+msgid "IPv6 Configuration Type"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1703
+msgid "Insert my local MAC address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1706
+msgid ""
+"This field can be used to modify (\"spoof\") the MAC address of this "
+"interface"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1708
+msgid "(may be required with some cable connections)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1709
+msgid ""
+"Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx or leave blank"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1714
+#: usr/local/www/interfaces_ppps_edit.php:769
+#: usr/local/www/status_interfaces.php:326
+msgid "MTU"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1719
+msgid ""
+"If you leave this field blank, the adapter's default MTU will be used. This "
+"is typically 1500 bytes but can vary in some circumstances."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1725
+msgid "MSS"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1729
+msgid ""
+"If you enter a value in this field, then MSS clamping for TCP connections to "
+"the value entered above minus 40 (TCP/IP header size) will be in effect."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1738
+msgid "Speed and duplex"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1759
+msgid ""
+"Here you can explicitly set speed and duplex mode for this interface. "
+"WARNING: You MUST leave this set to autoselect (automatically negotiate "
+"speed) unless the port this interface connects to has its speed and duplex "
+"forced."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1774
+msgid "Static IPv4 configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1795
+msgid "IPv4 Upstream Gateway"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1813 usr/local/www/interfaces.php:1919
+#: usr/local/www/system_routes_edit.php:257
+msgid "add a new one."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1816 usr/local/www/interfaces.php:1922
+msgid ""
+"If this interface is an Internet connection, select an existing Gateway from "
+"the list or add a new one using the link above."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1817 usr/local/www/interfaces.php:1923
+msgid "On local LANs the upstream gateway should be \"none\"."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1831 usr/local/www/system_routes_edit.php:270
+msgid "Add new gateway:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1839
+msgid "Default gateway:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1842 usr/local/www/system_routes_edit.php:288
+msgid "Gateway Name:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1845
+msgid "Gateway IPv4:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1848 usr/local/www/interfaces.php:1954
+#: usr/local/www/system_routes_edit.php:294
+msgid "Description:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1855 usr/local/www/interfaces.php:1961
+#: usr/local/www/system_routes_edit.php:301
+msgid "Save Gateway"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1880
+msgid "Static IPv6 configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1901
+msgid "IPv6 Upstream Gateway"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1937
+msgid "Add new v6 gateway:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1945
+msgid "Default v6 gateway:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1948
+msgid "Gateway Name IPv6:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1951
+msgid "Gateway IPv6:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1985
+msgid ""
+"DHCP client configuration &nbsp; &nbsp; <input name="
+"\"adv_dhcp_config_advanced\" type=\"checkbox\" id=\"adv_dhcp_config_advanced"
+"\" value=\"\" onclick=\"show_adv_dhcp_config(this)\" /> Advanced &nbsp; "
+"&nbsp; <input name=\"adv_dhcp_config_file_override\" type=\"checkbox\" id="
+"\"adv_dhcp_config_file_override\" value=\"\" onclick="
+"\"show_adv_dhcp_config(this)\" /> Config File Override &nbsp; &nbsp; "
+msgstr ""
+
+#: usr/local/www/interfaces.php:1994
+msgid "Enable DHCP+"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1997
+msgid "Enable DHCP+L2TP or DHCP+PPTP."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1999
+msgid ""
+"Status changes on this interface will trigger reconfiguration (if necessary) "
+"of the associated PPTP/L2TP link."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2008
+msgid ""
+"The value in this field is sent as the DHCP client identifier and hostname "
+"when requesting a DHCP lease. Some ISPs may require this (for client "
+"identification)."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2014
+msgid "Alias IPv4 address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2028
+msgid ""
+"The value in this field is used as a fixed alias IPv4 address by the DHCP "
+"client."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2033
+msgid "Reject Leases From"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2037
+msgid ""
+"If there is a certain upstream DHCP server that should be ignored, place the "
+"IP address or subnet of the DHCP server to be ignored here."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2038
+msgid ""
+"This is useful for rejecting leases from cable modems that offer private IPs "
+"when they lose upstream sync."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2043
+msgid "Protocol Timing"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2064
+msgid ""
+"The values in these fields are DHCP protocol timings used when requesting a "
+"lease. <br /> "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2105
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Lease "
+"Requirements and Requests</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2107
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Send</a> "
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp-options&amp;sektion=5\">Options</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2110
+msgid ""
+"The values in this field are DHCP options to be sent when requesting a DHCP "
+"lease. [option declaration [, ...]] <br />Value Substitutions: {interface}, "
+"{hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />Where C is U(pper) or "
+"L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) "
+"(omitted for none). <br />Some ISPs may require certain options be or not be "
+"sent. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2115
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Request</"
+"a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp-options&amp;sektion=5\">Options</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2118
+msgid ""
+"The values in this field are DHCP option 55 to be sent when requesting a "
+"DHCP lease. [option [, ...]] <br />Some ISPs may require certain options be "
+"or not be requested. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2121
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Require</"
+"a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp-options&amp;sektion=5\">Options</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2124
+msgid ""
+"The values in this field are DHCP options required by the client when "
+"requesting a DHCP lease. [option [, ...]] "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2129
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp-options&amp;sektion=5\">Option</a> <a target=\"FreeBSD_DHCP\" "
+"href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;"
+"sektion=5#OPTION_MODIFIERS\">Modifiers</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2133
+msgid ""
+"The values in this field are DHCP option modifiers applied to obtained DHCP "
+"lease. [modifier option declaration [, ...]] <br /> modifiers: (default, "
+"supersede, prepend, append)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2139
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5\">Configuration File</a> Override"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2143 usr/local/www/interfaces.php:2388
+msgid ""
+"The value in this field is the full absolute path to a DHCP client "
+"configuration file. [/[dirname/[.../]]filename[.ext]] <br /> Value "
+"Substitutions in Config File: {interface}, {hostname}, {mac_addr_asciiCD}, "
+"{mac_addr_hexCD} <br />Where C is U(pper) or L(ower) Case, and D is \" :-.\" "
+"Delimiter (space, colon, hyphen, or period) (omitted for none). <br />Some "
+"ISPs may require certain options be or not be sent. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2197
+msgid ""
+"DHCP6 client configuration &nbsp; &nbsp; <input name="
+"\"adv_dhcp6_config_advanced\" type=\"checkbox\" id="
+"\"adv_dhcp6_config_advanced\" value=\"\" onclick="
+"\"show_adv_dhcp6_config(this)\" /> Advanced &nbsp; &nbsp; <input name="
+"\"adv_dhcp6_config_file_override\" type=\"checkbox\" id="
+"\"adv_dhcp6_config_file_override\" value=\"\" onclick="
+"\"show_adv_dhcp6_config(this)\" /> Config File Override &nbsp; &nbsp; "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2206
+msgid "DHCPv6 Unique Identifier (DUID)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2210
+msgid ""
+"The value in this field is sent as the DHCPv6 client identifier when "
+"requesting a DHCPv6 lease."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2215
+#, php-format
+msgid "The current DUID is: '%s'"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2222
+msgid "Use IPv4 connectivity as parent interface"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2225
+msgid "Request a IPv6 prefix/information through the IPv4 connectivity link"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2229
+msgid "Request only an IPv6 prefix"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2232
+msgid "Only request an IPv6 prefix, do not request an IPv6 address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2236
+msgid "DHCPv6 Prefix Delegation size"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2249
+msgid ""
+"The value in this field is the delegated prefix length provided by the "
+"DHCPv6 server. Normally specified by the ISP."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2253
+msgid "Send IPv6 prefix hint"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2256
+msgid ""
+"Send an IPv6 prefix hint to indicate the desired prefix size for delegation"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2262
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Interface_statement\">Interface Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2265
+msgid "Information Only"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2268
+msgid "Send Options"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2271
+msgid ""
+"The values in this field are DHCP send options to be sent when requesting a "
+"DHCP lease. [option declaration [, ...]] <br />Value Substitutions: "
+"{interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />Where C "
+"is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, "
+"hyphen, or period) (omitted for none). <br />Some DHCP services may require "
+"certain options be or not be sent. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2277
+msgid "Request Options"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2280
+msgid ""
+"The values in this field are DHCP request options to be sent when requesting "
+"a DHCP lease. [option [, ...]] <br />Some DHCP services may require certain "
+"options be or not be requested. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2284
+msgid "Script"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2287
+msgid ""
+"The value in this field is the absolute path to a script invoked on certain "
+"conditions including when a reply message is received. <br />[/[dirname/"
+"[.../]]filename[.ext]] "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2294
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Identity_association_statement\">Identity Association Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2299
+msgid "Non-Temporary Address Allocation"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2301
+msgid "id-assoc na"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2302 usr/local/www/interfaces.php:2319
+msgid "<i>ID</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2305 usr/local/www/status_lb_vs.php:79
+#: usr/local/www/vpn_ipsec_phase2.php:586
+#: usr/local/www/vpn_ipsec_phase2.php:621
+#: usr/local/www/vpn_ipsec_phase2.php:663
+#: usr/local/www/vpn_ipsec_phase2.php:669
+msgid "Address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2306
+msgid "<i>ipv6-address</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2308 usr/local/www/interfaces.php:2325
+msgid "<i>pltime</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2310 usr/local/www/interfaces.php:2327
+msgid "<i>vltime</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2316
+msgid "Prefix Delegation"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2318
+msgid "id-assoc pd"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2322
+msgid "Prefix"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2323
+msgid "<i>ipv6-prefix</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2335
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Prefix_interface_statement\">Prefix Interface Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2338
+msgid "Prefix Interface "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2339
+msgid "<i>sla-id</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2341
+msgid "<i>sla-len</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2348
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Authentication_statement\">Authentication Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2351
+msgid "<i>authname</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2353
+msgid "<i>protocol</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2355
+msgid "<i>algorithm</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2357
+msgid "<i>rdm</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2364
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Keyinfo_statement\">Keyinfo Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2367
+msgid "<i>keyname</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2369
+msgid "<i>realm</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2372
+msgid "<i>keyid</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2374
+msgid "<i>secret</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2376
+msgid "<i>expire</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2383
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports"
+"\">Configuration File</a> Override"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2469
+msgid "6RD Configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2472
+msgid "6RD prefix"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2476
+msgid ""
+"The value in this field is the 6RD IPv6 prefix assigned by your ISP. e.g. "
+"'2001:db8::/32'"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2480
+msgid "6RD Border Relay"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2484
+msgid ""
+"The value in this field is 6RD IPv4 gateway address assigned by your ISP"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2488
+msgid "6RD IPv4 Prefix length"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2500
+msgid ""
+"The value in this field is the 6RD IPv4 prefix length. Normally specified by "
+"the ISP. A value of 0 means we embed the entire IPv4 address in the 6RD "
+"prefix."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2513
+msgid "Track IPv6 Interface"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2516
+msgid "IPv6 Interface"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2554
+msgid "This selects the dynamic IPv6 WAN interface to track for configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2558
+msgid "IPv6 Prefix ID"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2569
+msgid ""
+"The value in this field is the (Delegated) IPv6 prefix ID. This determines "
+"the configurable network ID based on the dynamic IPv6 connection"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2571
+msgid "default value is 0."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2584
+msgid "PPP configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2587
+#: usr/local/www/interfaces_ppps_edit.php:491
+msgid "Service Provider"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2591
+#: usr/local/www/interfaces_ppps_edit.php:495
+msgid "Country:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2599
+#: usr/local/www/interfaces_ppps_edit.php:503
+msgid "Provider:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2607
+#: usr/local/www/interfaces_ppps_edit.php:511
+msgid "Plan:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces_ppps_edit.php:519
+msgid "Select to fill in data for your service provider."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2637
+#: usr/local/www/interfaces_ppps_edit.php:543
+msgid "Access Point Name (APN)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2667
+msgid "Advanced PPP"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2670 usr/local/www/interfaces.php:2675
+#: usr/local/www/interfaces.php:2779 usr/local/www/interfaces.php:2784
+#: usr/local/www/interfaces.php:2850 usr/local/www/interfaces.php:2855
+msgid "Click here"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2671
+msgid "to edit PPP configuration."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2676
+msgid "to create a PPP configuration."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2690
+msgid "PPPoE configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2705
+#: usr/local/www/interfaces_ppps_edit.php:602
+msgid "Service name"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2707
+msgid "Hint: this field can usually be left empty"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2714 usr/local/www/interfaces.php:2836
+msgid "Enable Dial-On-Demand mode"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2715
+msgid ""
+"This option causes the interface to operate in dial-on-demand mode, allowing "
+"you to have a "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2715 usr/local/www/interfaces.php:2837
+msgid "virtual full time"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2715 usr/local/www/interfaces.php:2837
+msgid ""
+"connection. The interface is configured, but the actual connection of the "
+"link is delayed until qualifying outgoing traffic is detected."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2719 usr/local/www/interfaces.php:2841
+#: usr/local/www/services_captiveportal.php:550
+msgid "Idle timeout"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2721 usr/local/www/interfaces.php:2843
+msgid ""
+"If no qualifying outgoing packets are transmitted for the specified number "
+"of seconds, the connection is brought down. An idle timeout of zero disables "
+"this feature."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2725
+#: usr/local/www/interfaces_ppps_edit.php:609
+msgid "Periodic reset"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2733
+#: usr/local/www/interfaces_ppps_edit.php:617
+#: usr/local/www/status_rrd_graph.php:450
+#: usr/local/www/status_rrd_graph_settings.php:169
+msgid "Custom"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2734
+#: usr/local/www/interfaces_ppps_edit.php:618
+msgid "Pre-Set"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2735
+#: usr/local/www/interfaces_ppps_edit.php:619
+msgid "Select a reset timing type"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2743
+#: usr/local/www/interfaces_ppps_edit.php:627
+msgid "hour (0-23)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2745
+#: usr/local/www/interfaces_ppps_edit.php:629
+msgid "minute (0-59)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2747
+#: usr/local/www/interfaces_ppps_edit.php:631
+msgid "reset at a specific date (mm/dd/yyyy)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2750
+#: usr/local/www/interfaces_ppps_edit.php:634
+msgid ""
+"If you leave the date field empty, the reset will be executed each day at "
+"the time you did specify using the minutes and hour field."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2758
+#: usr/local/www/interfaces_ppps_edit.php:642
+msgid "reset at each month ('0 0 1 * *')"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2761
+#: usr/local/www/interfaces_ppps_edit.php:645
+msgid "reset at each week ('0 0 * * 0')"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2764
+#: usr/local/www/interfaces_ppps_edit.php:648
+msgid "reset at each day ('0 0 * * *')"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2767
+#: usr/local/www/interfaces_ppps_edit.php:651
+msgid "reset at each hour ('0 * * * *')"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2776
+msgid "Advanced and MLPPP"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2780
+msgid ""
+"for additional PPPoE configuration options. Save first if you made changes."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2785
+msgid "for advanced PPPoE configuration options and MLPPP configuration."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2799
+msgid "PPTP/L2TP configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2814
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+msgid "Local IP address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2827
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+msgid "Remote IP address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2837
+msgid ""
+"This option causes the interface to operate in dial-on-demand mode, allowing "
+"you to have a"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2851
+msgid ""
+"for additional PPTP and L2TP configuration options. Save first if you made "
+"changes."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2856
+msgid "for advanced PPTP and L2TP configuration options"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2871
+msgid ""
+"Common wireless configuration - Settings apply to all wireless networks on"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2874
+msgid "Persist common settings"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2877
+msgid ""
+"Enabling this preserves the common wireless configuration through interface "
+"deletions and reassignments."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2881
+msgid "Standard"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2901
+msgid "Protection Mode"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2904
+msgid "Protection mode off"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2905
+msgid "Protection mode CTS to self"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2906
+msgid "Protection mode RTS and CTS"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2909
+msgid ""
+"For IEEE 802.11g, use the specified technique for protecting OFDM frames in "
+"a mixed 11b/11g network."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2917
+msgid "Transmit power"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2930
+msgid ""
+"Note: Typically only a few discreet power settings are available and the "
+"driver will use the setting closest to the specified value. Not all "
+"adapters support changing the transmit power setting."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2934 usr/local/www/status_interfaces.php:356
+msgid "Channel"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2937 usr/local/www/interfaces.php:2984
+#: usr/local/www/interfaces.php:2996 usr/local/www/vpn_ipsec_phase1.php:882
+msgid "Auto"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2957
+msgid ""
+"Legend: wireless standards - channel # (frequency @ max TX power / TX power "
+"allowed in reg. domain)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2959
+msgid ""
+"Note: Not all channels may be supported by your card. Auto may override the "
+"wireless standard selected above."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2964
+msgid "Antenna settings"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2970
+msgid "Diversity"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2973 usr/local/www/vpn_l2tp.php:299
+#: usr/local/www/vpn_pppoe_edit.php:372 usr/local/www/vpn_pptp.php:320
+msgid "Off"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2974
+msgid "On"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2981
+msgid "Transmit antenna"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2985 usr/local/www/interfaces.php:2997
+msgid "#1"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2986 usr/local/www/interfaces.php:2998
+msgid "#2"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2993
+msgid "Receive antenna"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3005
+msgid ""
+"Note: The antenna numbers do not always match up with the labels on the card."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3011
+msgid "Distance setting"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3015
+msgid ""
+"Note: This field can be used to tune ACK/CTS timers to fit the distance "
+"between AP and Client"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3016
+msgid "(measured in meters)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3021
+msgid "Regulatory settings"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3023
+msgid "Regulatory domain"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3037
+msgid ""
+"Note: Some cards have a default that is not recognized and require changing "
+"the regulatory domain to one in this list for the changes to other "
+"regulatory settings to work."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3039
+msgid "Country (listed with country code and regulatory domain)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3053
+msgid ""
+"Note: Any country setting other than \"Default\" will override the "
+"regulatory domain setting"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3055
+msgid "Location"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3058
+msgid "Indoor"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3059
+msgid "Outdoor"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3060
+msgid "Anywhere"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3063
+msgid ""
+"These settings may affect which channels are available and the maximum "
+"transmit power allowed on those channels. Using the correct settings to "
+"comply with local regulatory requirements is recommended."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3065
+msgid ""
+"Note: All wireless networks on this interface will be temporarily brought "
+"down when changing regulatory settings. Some of the regulatory domains or "
+"country codes may not be allowed by some cards. These settings may not be "
+"able to add additional channels that are not already supported."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3072
+msgid "Network-specific wireless configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3078
+#: usr/local/www/interfaces_wireless_edit.php:185
+msgid "Infrastructure (BSS)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3079
+#: usr/local/www/interfaces_wireless_edit.php:186
+msgid "Ad-hoc (IBSS)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3080
+#: usr/local/www/interfaces_wireless_edit.php:187
+msgid "Access Point"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3089
+msgid ""
+"Note: Only required in Access Point mode. If left blank in Ad-hoc or "
+"Infrastructure mode, this interface will connect to any available SSID"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3094
+msgid "Minimum wireless standard"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3097
+msgid "Any"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3099
+msgid "802.11g"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3101
+msgid "802.11n"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3104
+msgid ""
+"When operating as an access point, allow only stations capable of the "
+"selected wireless standard to associate (stations not capable are not "
+"permitted to associate)."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3109
+msgid "802.11g only"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3112
+msgid ""
+"When operating as an access point in 802.11g mode, allow only 11g-capable "
+"stations to associate (11b-only stations are not permitted to associate)."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3117
+msgid "Allow intra-BSS communication"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3121
+msgid ""
+"When operating as an access point, enable this if you want to pass packets "
+"between wireless clients directly."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3123
+msgid ""
+"Disabling the internal bridging is useful when traffic is to be processed "
+"with packet filtering."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3127
+msgid "Enable WME"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3130
+msgid "Setting this option will force the card to use WME (wireless QoS)."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3134
+msgid "Enable Hide SSID"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3138
+msgid "Setting this option will force the card to NOT broadcast its SSID"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3140
+msgid "(this might create problems for some clients)."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3144
+msgid "WEP"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3147
+msgid "Enable WEP"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3152
+msgid "TX key"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3155
+msgid "Key 1:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3164
+msgid "Key 2:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3173
+msgid "Key 3:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3182
+msgid "Key 4:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3192
+msgid ""
+"40 (64) bit keys may be entered as 5 ASCII characters or 10 hex digits "
+"preceded by '0x'."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3193
+msgid ""
+"104 (128) bit keys may be entered as 13 ASCII characters or 26 hex digits "
+"preceded by '0x'."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3197 usr/local/www/interfaces.php:3221
+msgid "WPA"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3200
+msgid "Enable WPA"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3205
+msgid "WPA Pre-Shared Key"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3208
+msgid "PSK:"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3214
+msgid "WPA Passphrase must be between 8 and 63 characters long."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3218
+msgid "WPA Mode"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3222
+msgid "WPA2"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3223 usr/local/www/interfaces.php:3233
+#: usr/local/www/interfaces.php:3243 usr/local/www/interfaces.php:3252
+#: usr/local/www/services_captiveportal_hostname_edit.php:167
+msgid "Both"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3228
+msgid "WPA Key Management Mode"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3231 usr/local/www/vpn_ipsec_keys.php:113
+#: usr/local/www/vpn_ipsec_keys_edit.php:72
+#: usr/local/www/vpn_ipsec_keys_edit.php:142
+#: usr/local/www/vpn_ipsec_mobile.php:348
+#: usr/local/www/vpn_ipsec_phase1.php:174
+#: usr/local/www/vpn_ipsec_phase1.php:747
+#: usr/local/www/vpn_ipsec_settings.php:206
+msgid "Pre-Shared Key"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3232
+msgid "Extensible Authentication Protocol"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3241
+msgid "Open System Authentication"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3242
+msgid "Shared Key Authentication"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3245
+msgid "Note: Shared Key Authentication requires WEP."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3249
+msgid "WPA Pairwise"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3253
+msgid "AES (recommended)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3254
+msgid "TKIP"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3259
+msgid "Key Rotation"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3262
+msgid ""
+"Allowed values are 1-9999. Must be longer than Master Key "
+"Regeneration time."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3266
+msgid "Master Key Regeneration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3269
+msgid ""
+"Allowed values are 1-9999. Must be shorter than Key Rotation time."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3273
+msgid "Strict Key Regeneration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3276
+msgid ""
+"Setting this option will force the AP to rekey whenever a client "
+"disassociates."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3280
+msgid "Enable IEEE802.1X Authentication"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3283
+msgid "Setting this option will enable 802.1X authentication."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3284
+#: usr/local/www/load_balancer_pool_edit.php:267
+#: usr/local/www/status_openvpn.php:392
+msgid "NOTE"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3284
+msgid "this option requires checking the \"Enable WPA box\"."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3288
+msgid "802.1X Authentication Server IP Address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3291 usr/local/www/interfaces.php:3312
+msgid ""
+"Enter the IP address of the 802.1X Authentication Server. This is commonly "
+"a Radius server (FreeRadius, Internet Authentication Services, etc.)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3295
+msgid "802.1X Authentication Server Port"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3298 usr/local/www/interfaces.php:3319
+msgid "Leave blank for the default port 1812."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3302
+msgid "802.1X Authentication Server Shared Secret"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3309
+msgid "Secondary 802.1X Authentication Server IP Address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3316
+msgid "Secondary 802.1X Authentication Server Port"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3323
+msgid "Secondary 802.1X Authentication Server Shared Secret"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3330
+msgid "Authentication Roaming Preauth"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3341
+msgid "Private networks"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3349
+msgid ""
+"When set, this option blocks traffic from IP addresses that are reserved for "
+"private networks as per RFC 1918 (10/8, 172.16/12, 192.168/16) as"
+msgstr ""
+
+#: usr/local/www/interfaces.php:3351
+msgid "well as loopback addresses (127/8)."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3351
+msgid ""
+"You should generally leave this option turned on, unless your WAN network "
+"lies in such a private address space, too."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3361
+msgid ""
+"When set, this option blocks traffic from IP addresses that are reserved "
+"(but not RFC 1918) or not yet assigned by IANA."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3363
+msgid ""
+"Bogons are prefixes that should never appear in the Internet routing table, "
+"and obviously should not appear as the source address in any packets you "
+"receive."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3366
+msgid ""
+"Note: The update frequency can be changed under System->Advanced Firewall/"
+"NAT settings."
+msgstr ""
+
+#: usr/local/www/interfaces.php:3490 usr/local/www/interfaces.php:3499
+msgid "You can manage Gateways"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:44
+msgid "Assign network ports"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:59
+#, php-format
+msgid "VLAN %1$s on %2$s"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:208
+msgid "lan"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:209
+msgid "LAN"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:234
+msgid "Interface has been added."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:274
+#, php-format
+msgid "Port %1$s was assigned to %2$s interfaces:"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:290
+#, php-format
+msgid ""
+"You cannot set port %s to interface %s because this interface is a member of "
+"%s."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:367
+msgid ""
+"The interface is part of a group. Please remove it from the group to continue"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:369
+msgid ""
+"The interface is part of a bridge. Please remove it from the bridge to "
+"continue"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:371
+msgid ""
+"The interface is part of a gre tunnel. Please delete the tunnel to continue"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:373
+msgid ""
+"The interface is part of a gif tunnel. Please delete the tunnel to continue"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:411
+msgid "Interface has been deleted."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:435
+msgid "The system is now rebooting. Please wait."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:437
+msgid "Reboot is needed. Please apply the settings in order to reboot."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:439
+msgid ""
+"Interface mismatch detected. Please resolve the mismatch and click 'Apply "
+"changes'. The firewall will reboot afterwards."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:451
+msgid ""
+"The interface configuration has been changed.<br />You must apply the "
+"changes in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:465
+#: usr/local/www/interfaces_bridge.php:100 usr/local/www/interfaces_gif.php:94
+#: usr/local/www/interfaces_gre.php:95 usr/local/www/interfaces_groups.php:77
+#: usr/local/www/interfaces_lagg.php:100 usr/local/www/interfaces_ppps.php:92
+#: usr/local/www/interfaces_qinq.php:103 usr/local/www/interfaces_vlan.php:97
+#: usr/local/www/interfaces_wireless.php:92
+msgid "Interface assignments"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:466
+#: usr/local/www/interfaces_bridge.php:101 usr/local/www/interfaces_gif.php:95
+#: usr/local/www/interfaces_gre.php:96 usr/local/www/interfaces_groups.php:78
+#: usr/local/www/interfaces_lagg.php:101 usr/local/www/interfaces_ppps.php:93
+#: usr/local/www/interfaces_qinq.php:104 usr/local/www/interfaces_vlan.php:98
+#: usr/local/www/interfaces_wireless.php:93
+msgid "Interface Groups"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:468
+#: usr/local/www/interfaces_bridge.php:103 usr/local/www/interfaces_gif.php:97
+#: usr/local/www/interfaces_gre.php:98 usr/local/www/interfaces_groups.php:80
+#: usr/local/www/interfaces_lagg.php:103 usr/local/www/interfaces_ppps.php:95
+#: usr/local/www/interfaces_qinq.php:106 usr/local/www/interfaces_vlan.php:100
+#: usr/local/www/interfaces_wireless.php:95
+msgid "VLANs"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:469
+#: usr/local/www/interfaces_bridge.php:104 usr/local/www/interfaces_gif.php:98
+#: usr/local/www/interfaces_gre.php:99 usr/local/www/interfaces_groups.php:81
+#: usr/local/www/interfaces_lagg.php:104 usr/local/www/interfaces_ppps.php:96
+#: usr/local/www/interfaces_qinq.php:107 usr/local/www/interfaces_vlan.php:101
+#: usr/local/www/interfaces_wireless.php:96
+msgid "QinQs"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:470
+#: usr/local/www/interfaces_bridge.php:105 usr/local/www/interfaces_gif.php:99
+#: usr/local/www/interfaces_gre.php:100 usr/local/www/interfaces_groups.php:82
+#: usr/local/www/interfaces_lagg.php:105 usr/local/www/interfaces_ppps.php:97
+#: usr/local/www/interfaces_ppps_edit.php:389
+#: usr/local/www/interfaces_qinq.php:108 usr/local/www/interfaces_vlan.php:102
+#: usr/local/www/interfaces_wireless.php:97
+msgid "PPPs"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:471
+#: usr/local/www/interfaces_bridge.php:106
+#: usr/local/www/interfaces_gif.php:100 usr/local/www/interfaces_gre.php:82
+#: usr/local/www/interfaces_gre.php:101
+#: usr/local/www/interfaces_gre_edit.php:130
+#: usr/local/www/interfaces_groups.php:83
+#: usr/local/www/interfaces_lagg.php:106 usr/local/www/interfaces_ppps.php:98
+#: usr/local/www/interfaces_qinq.php:109 usr/local/www/interfaces_vlan.php:103
+#: usr/local/www/interfaces_wireless.php:98
+msgid "GRE"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:472
+#: usr/local/www/interfaces_bridge.php:107 usr/local/www/interfaces_gif.php:81
+#: usr/local/www/interfaces_gif.php:101
+#: usr/local/www/interfaces_gif_edit.php:136
+#: usr/local/www/interfaces_gre.php:102 usr/local/www/interfaces_groups.php:84
+#: usr/local/www/interfaces_lagg.php:107 usr/local/www/interfaces_ppps.php:99
+#: usr/local/www/interfaces_qinq.php:110 usr/local/www/interfaces_vlan.php:104
+#: usr/local/www/interfaces_wireless.php:99
+msgid "GIF"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:473
+#: usr/local/www/interfaces_bridge.php:108
+#: usr/local/www/interfaces_gif.php:102 usr/local/www/interfaces_gre.php:103
+#: usr/local/www/interfaces_groups.php:85
+#: usr/local/www/interfaces_lagg.php:108 usr/local/www/interfaces_ppps.php:100
+#: usr/local/www/interfaces_qinq.php:111 usr/local/www/interfaces_vlan.php:105
+#: usr/local/www/interfaces_wireless.php:100
+msgid "Bridges"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:474
+#: usr/local/www/interfaces_bridge.php:109
+#: usr/local/www/interfaces_gif.php:103 usr/local/www/interfaces_gre.php:104
+#: usr/local/www/interfaces_groups.php:86 usr/local/www/interfaces_lagg.php:87
+#: usr/local/www/interfaces_lagg.php:109
+#: usr/local/www/interfaces_lagg_edit.php:137
+#: usr/local/www/interfaces_ppps.php:101 usr/local/www/interfaces_qinq.php:112
+#: usr/local/www/interfaces_vlan.php:106
+#: usr/local/www/interfaces_wireless.php:101
+msgid "LAGG"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:483
+msgid "Network port"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:513
+msgid "delete interface"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:515
+msgid "Do you really want to delete this interface?"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:527
+msgid "Available network ports:"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:543
+msgid "add selected interface"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:556
+msgid ""
+"Interfaces that are configured as members of a lagg(4) interface will not be "
+"shown."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge.php:64 usr/local/www/interfaces_gif.php:64
+#: usr/local/www/interfaces_gre.php:65 usr/local/www/interfaces_lagg.php:70
+#: usr/local/www/interfaces_vlan.php:65
+msgid "Wrong parameters supplied"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge.php:66 usr/local/www/interfaces_gif.php:66
+#: usr/local/www/interfaces_gre.php:67 usr/local/www/interfaces_lagg.php:72
+#: usr/local/www/interfaces_vlan.php:67
+msgid "Wrong index supplied"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge.php:69
+msgid "This bridge cannot be deleted because it is assigned as an interface."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge.php:87
+#: usr/local/www/interfaces_bridge_edit.php:240
+msgid "Bridge"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge.php:119
+#: usr/local/www/interfaces_groups.php:97
+#: usr/local/www/interfaces_lagg.php:119
+#: usr/local/www/load_balancer_pool_edit.php:286
+#: usr/local/www/system_groupmanager.php:375
+msgid "Members"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge.php:146
+msgid "Do you really want to delete this bridge?"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge.php:157
+msgid "Here you can configure bridging of interfaces."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:123
+msgid "Member Interfaces"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:128
+msgid "Maxage needs to be an integer between 6 and 40."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:130
+msgid "Maxaddr needs to be an integer."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:132
+msgid "Timeout needs to be an integer."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:134
+msgid "Forward Delay needs to be an integer between 4 and 30."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:136
+msgid "Hello time for STP needs to be an integer between 1 and 2."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:138
+msgid "Priority for STP needs to be an integer between 0 and 61440."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:140
+msgid "Transmit Hold Count for STP needs to be an integer between 1 and 10."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:143
+msgid "interface priority for STP needs to be an integer between 0 and 240."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:148
+msgid ""
+"interface path cost for STP needs to be an integer between 1 and 200000000."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:153
+msgid "You must select at least 2 member interfaces for a bridge."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:158
+msgid "A member interface passed does not exist in configuration"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:161
+msgid "Bridging a wireless interface is only possible in hostap mode."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:163
+msgid ""
+"Span interface cannot be part of the bridge. Remove the span interface from "
+"bridge members to continue."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:221
+#: usr/local/www/interfaces_gif_edit.php:117
+#: usr/local/www/interfaces_gre_edit.php:111
+#: usr/local/www/interfaces_lagg_edit.php:118
+#: usr/local/www/interfaces_vlan_edit.php:134
+msgid "Error occurred creating interface, please retry."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:270
+msgid "Bridge configuration"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:273
+#: usr/local/www/interfaces_lagg_edit.php:92
+msgid "Member interfaces"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:288
+msgid "Interfaces participating in the bridge."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:304
+msgid "RSTP/STP"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:307
+msgid "Enable spanning tree options for this bridge."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:323
+msgid "Protocol used for spanning tree."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:325
+msgid "STP interfaces"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:339
+msgid ""
+"Enable Spanning Tree Protocol on interface. The if_bridge(4) driver has "
+"support for the IEEE 802.1D Spanning Tree Protocol (STP). STP is used to "
+"detect and remove loops in a network topology."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:345
+msgid "Valid time"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:350
+msgid ""
+"Set the time that a Spanning Tree Protocol configuration is valid. The "
+"default is 20 seconds. The minimum is 6 seconds and the maximum is 40 "
+"seconds."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:355
+msgid "Forward time"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:360
+msgid ""
+"Set the time that must pass before an interface begins forwarding packets "
+"when Spanning Tree is enabled. The default is 15 seconds. The minimum is 4 "
+"seconds and the maximum is 30 seconds."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:364
+msgid "Hello time"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:369
+msgid ""
+"Set the time between broadcasting of Spanning Tree Protocol configuration "
+"messages. The hello time may only be changed when operating in legacy STP "
+"mode. The default is 2 seconds. The minimum is 1 second and the maximum is "
+"2 seconds."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:378
+msgid ""
+"Set the bridge priority for Spanning Tree. The default is 32768. The "
+"minimum is 0 and the maximum is 61440."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:382
+msgid "Hold count"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:387
+msgid ""
+"Set the transmit hold count for Spanning Tree. This is the number of "
+"packets transmitted before being rate limited. The default is 6. The "
+"minimum is 1 and the maximum is 10."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:402
+msgid ""
+"Set the Spanning Tree priority of interface to value. The default is 128. "
+"The minimum is 0 and the maximum is 240. Increments of 16."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:406
+msgid "Path cost"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:416
+msgid ""
+"Set the Spanning Tree path cost of interface to value. The default is "
+"calculated from the link speed. To change a previously selected path cost "
+"back to automatic, set the cost to 0. The minimum is 1 and the maximum is "
+"200000000."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:425
+msgid "Cache size"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:427
+msgid "entries"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:429
+msgid ""
+"Set the size of the bridge address cache to size.\tThe default is .100 "
+"entries."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:435
+msgid "Cache entry expire time"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:439
+msgid ""
+"Set the timeout of address cache entries to this number of seconds. If "
+"seconds is zero, then address cache entries will not be expired. The default "
+"is 240 seconds."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:446
+msgid "Span port"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:460
+msgid ""
+"Add the interface named by interface as a span port on the bridge. Span "
+"ports transmit a copy of every frame received by the bridge. This is most "
+"useful for snooping a bridged network passively on another host connected to "
+"one of the span ports of the bridge."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:469
+msgid "The span interface cannot be part of the bridge member interfaces."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:474
+msgid "Edge ports"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:488
+msgid ""
+"Set interface as an edge port. An edge port connects directly to end "
+"stations and cannot create bridging loops in the network; this allows it to "
+"transition straight to forwarding."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:494
+msgid "Auto Edge ports"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:508
+msgid ""
+"Allow interface to automatically detect edge status. This is the default "
+"for all interfaces added to a bridge."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:513
+msgid "This will disable the autoedge status of interfaces."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:517
+msgid "PTP ports"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:531
+msgid ""
+"Set the interface as a point-to-point link. This is required for straight "
+"transitions to forwarding and should be enabled on a direct link to another "
+"RSTP-capable switch."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:537
+msgid "Auto PTP ports"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:551
+msgid ""
+"Automatically detect the point-to-point status on interface by checking the "
+"full duplex link status. This is the default for interfaces added to the "
+"bridge."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:557
+msgid ""
+"The interfaces selected here will be removed from default autoedge status."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:561
+msgid "Sticky ports"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:575
+msgid ""
+"Mark an interface as a \"sticky\" interface. Dynamically learned address "
+"entries are treated as static once entered into the cache. Sticky entries "
+"are never aged out of the cache or replaced, even if the address is seen on "
+"a different interface."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:582
+msgid "Private ports"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:596
+msgid ""
+"Mark an interface as a \"private\" interface. A private interface does not "
+"forward any traffic to any other port that is also a private interface."
+msgstr ""
+
+#: usr/local/www/interfaces_gif.php:69
+msgid ""
+"This gif TUNNEL cannot be deleted because it is still being used as an "
+"interface."
+msgstr ""
+
+#: usr/local/www/interfaces_gif.php:113 usr/local/www/interfaces_gre.php:114
+msgid "Tunnel to..."
+msgstr ""
+
+#: usr/local/www/interfaces_gif.php:129
+msgid "Do you really want to delete this gif tunnel?"
+msgstr ""
+
+#: usr/local/www/interfaces_gif.php:140
+msgid "GIF tunnels are configured here."
+msgstr ""
+
+#: usr/local/www/interfaces_gif.php:142
+msgid ""
+"If you are using a GIF tunnel to connect to a Hurricane Electric (he.net) "
+"Tunnel Broker on a WAN with a dynamic IP, you may want to add a"
+msgstr ""
+
+#: usr/local/www/interfaces_gif.php:142
+msgid "HE.net Tunnelbroker type DynDNS Entry"
+msgstr ""
+
+#: usr/local/www/interfaces_gif.php:142
+msgid "to keep your tunnel functional when your IP changes."
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:78
+msgid ""
+"Parent interface,Local address, Remote tunnel address, Remote tunnel "
+"network, Local tunnel address"
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:84
+#: usr/local/www/interfaces_gre_edit.php:83
+msgid "The tunnel local and tunnel remote fields must have valid IP addresses."
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:90
+msgid ""
+"The alias IP address family has to match the family of the remote peer "
+"address."
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:98
+#, php-format
+msgid "A gif with the network %s is already defined."
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:149
+msgid "GIF configuration"
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:152
+#: usr/local/www/interfaces_gre_edit.php:77
+#: usr/local/www/interfaces_gre_edit.php:146
+#: usr/local/www/interfaces_lagg_edit.php:152
+#: usr/local/www/interfaces_qinq_edit.php:294
+#: usr/local/www/interfaces_vlan_edit.php:79
+#: usr/local/www/interfaces_vlan_edit.php:167
+#: usr/local/www/interfaces_wireless_edit.php:90
+#: usr/local/www/interfaces_wireless_edit.php:165
+msgid "Parent interface"
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:172
+msgid ""
+"The interface here serves as the local address to be used for the gif tunnel."
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:175
+msgid "gif remote address"
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:179
+msgid "Peer address where encapsulated gif packets will be sent. "
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:182
+msgid "gif tunnel local address"
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:186
+msgid "Local gif tunnel endpoint"
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:189
+msgid "gif tunnel remote address "
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:203
+msgid ""
+"Remote gif address endpoint. The subnet part is used for determining the "
+"network that is tunnelled."
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:206
+msgid "Route caching "
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:210
+msgid ""
+"Specify if route caching can be enabled. Be careful with these settings on "
+"dynamic networks. "
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:213
+msgid "ECN friendly behavior"
+msgstr ""
+
+#: usr/local/www/interfaces_gif_edit.php:218
+msgid ""
+"Note that the ECN friendly behavior violates RFC2893. This should be used "
+"in mutual agreement with the peer."
+msgstr ""
+
+#: usr/local/www/interfaces_gre.php:70
+msgid ""
+"This GRE tunnel cannot be deleted because it is still being used as an "
+"interface."
+msgstr ""
+
+#: usr/local/www/interfaces_gre.php:130
+msgid "Do you really want to delete this GRE tunnel?"
+msgstr ""
+
+#: usr/local/www/interfaces_gre.php:139
+msgid ""
+"Here you can configure Generic Routing Encapsulation (GRE - RFC 2784) "
+"tunnels."
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:77
+msgid "Local address"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:77
+msgid "Remote tunnel address"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:77
+msgid "Remote tunnel network"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:77
+msgid "Local tunnel address"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:91
+#, php-format
+msgid "A GRE tunnel with the network %s is already defined."
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:143
+msgid "GRE configuration"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:166
+msgid ""
+"The interface here serves as the local address to be used for the GRE tunnel."
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:169
+msgid "Remote tunnel endpoint IP address"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:173
+msgid "Peer address where encapsulated GRE packets will be sent "
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:176
+msgid "Local tunnel IP address "
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:180
+msgid "Local IP address assigned inside this tunnel"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:183
+msgid "Remote tunnel IP address "
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:197
+msgid ""
+"IP address inside this tunnel on the remote end. The subnet part is used for "
+"the determining the network that is tunneled."
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:200
+msgid "Mobile encapsulation"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:204
+msgid ""
+"Check this box to use mobile encapsulation (IP protocol 55, RFC 2004). When "
+"unchecked, uses GRE encapsulation (IP protocol 47, RFCs 1701, 1702)."
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:207
+msgid "Route search type"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:212
+msgid ""
+"For correct operation, the GRE device needs a route to the destination that "
+"is less specific than the one over the tunnel. (Basically, there needs to "
+"be a route to the decapsulating host that does not run over the tunnel, as "
+"this would be a loop."
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:219
+msgid "WCCP version"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:223
+msgid ""
+"Check this box for WCCP encapsulation version 2, or leave unchecked for "
+"version 1."
+msgstr ""
+
+#: usr/local/www/interfaces_groups.php:64
+#: usr/local/www/interfaces_groups_edit.php:45
+#: usr/local/www/system_authservers.php:449
+#: usr/local/www/system_gateway_groups.php:121
+#: usr/local/www/system_gateways.php:205
+#: usr/local/www/system_groupmanager.php:289
+#: usr/local/www/system_groupmanager_addprivs.php:169
+#: usr/local/www/system_routes.php:222
+#: usr/local/www/system_usermanager.php:495
+#: usr/local/www/system_usermanager.php:907
+#: usr/local/www/system_usermanager_addprivs.php:158
+#: usr/local/www/system_usermanager_settings.php:115
+msgid "Groups"
+msgstr ""
+
+#: usr/local/www/interfaces_groups.php:130
+#: usr/local/www/system_groupmanager.php:552
+msgid "edit group"
+msgstr ""
+
+#: usr/local/www/interfaces_groups.php:131
+msgid ""
+"Do you really want to delete this group? All elements that still use it will "
+"become invalid (e.g. filter rules)!"
+msgstr ""
+
+#: usr/local/www/interfaces_groups.php:131
+msgid "delete ifgroupentry"
+msgstr ""
+
+#: usr/local/www/interfaces_groups.php:143
+msgid "add a new group"
+msgstr ""
+
+#: usr/local/www/interfaces_groups.php:150
+msgid ""
+"Interface Groups allow you to create rules that apply to multiple interfaces "
+"without duplicating the rules. If you remove members from an interface "
+"group, the group rules no longer apply to that interface."
+msgstr ""
+
+#: usr/local/www/interfaces_groups_edit.php:75
+msgid "Group name already exists!"
+msgstr ""
+
+#: usr/local/www/interfaces_groups_edit.php:78
+msgid "Only letters A-Z are allowed as the group name."
+msgstr ""
+
+#: usr/local/www/interfaces_groups_edit.php:250
+msgid "Interface Groups Edit"
+msgstr ""
+
+#: usr/local/www/interfaces_groups_edit.php:253
+#: usr/local/www/status_gateway_groups.php:76
+#: usr/local/www/system_gateway_groups.php:131
+#: usr/local/www/system_gateway_groups_edit.php:235
+#: usr/local/www/system_gateway_groups_edit.php:238
+#: usr/local/www/system_groupmanager.php:143
+msgid "Group Name"
+msgstr ""
+
+#: usr/local/www/interfaces_groups_edit.php:257
+msgid "No numbers or spaces are allowed. Only characters in a-zA-Z"
+msgstr ""
+
+#: usr/local/www/interfaces_groups_edit.php:271
+#: usr/local/www/interfaces_qinq_edit.php:353
+msgid "Member (s)"
+msgstr ""
+
+#: usr/local/www/interfaces_groups_edit.php:326
+msgid ""
+"Rules for WAN type interfaces in groups do not contain the reply-to "
+"mechanism upon which Multi-WAN typically relies."
+msgstr ""
+
+#: usr/local/www/interfaces_groups_edit.php:327
+msgid "More Information"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg.php:75
+msgid "This LAGG interface cannot be deleted because it is still being used."
+msgstr ""
+
+#: usr/local/www/interfaces_lagg.php:146
+msgid ""
+"LAGG allows for link aggregation, bonding and fault tolerance. Only "
+"unassigned interfaces can be added to LAGG."
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:92
+msgid "Lagg protocol"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:99
+#: usr/local/www/interfaces_lagg_edit.php:102
+msgid "Interface supplied as member is invalid"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:105
+msgid "Protocol supplied is invalid"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:149
+msgid "LAGG configuration"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:167
+msgid "Choose the members that will be used for the link aggregation"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:170
+msgid "Lag proto"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:185
+msgid "failover"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:186
+msgid ""
+"Sends and receives traffic only through the master port. If the master port "
+"becomes unavailable, the next active port is used. The first interface "
+"added is the master port; any interfaces added after that are used as "
+"failover devices."
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:191
+msgid "fec"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:191
+msgid ""
+"Supports Cisco EtherChannel. This is a static setup and does not negotiate "
+"aggregation with the peer or exchange frames to monitor the link."
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:195
+msgid "lacp"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:195
+msgid ""
+"Supports the IEEE 802.3ad Link Aggregation Control Protocol (LACP) and the "
+"Marker Protocol. LACP will negotiate a set of aggregable links with the "
+"peer in to one or more Link Aggregated Groups. Each LAG is composed of "
+"ports of the same speed, set to full-duplex operation. The traffic will be "
+"balanced across the ports in the LAG with the greatest total speed, in most "
+"cases there will only be one LAG which contains all ports. In the event of "
+"changes in physical connectivity, Link Aggregation will quickly converge to "
+"a new configuration."
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:206
+msgid "loadbalance"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:206
+msgid ""
+"Balances outgoing traffic across the active ports based on hashed protocol "
+"header information and accepts incoming traffic from any active port. This "
+"is a static setup and does not negotiate aggregation with the peer or "
+"exchange frames to monitor the link. The hash includes the Ethernet source "
+"and destination address, and, if available, the VLAN tag, and the IP source "
+"and destination address"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:214
+msgid "roundrobin"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:214
+msgid ""
+"Distributes outgoing traffic using a round-robin scheduler through all "
+"active ports and accepts incoming traffic from any active port"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:218
+msgid ""
+"This protocol is intended to do nothing: it disables any traffic without "
+"disabling the lagg interface itself"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps.php:63
+msgid ""
+"This point-to-point link cannot be deleted because it is still being used as "
+"an interface."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps.php:79
+msgid "Interfaces: PPPs"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps.php:111
+msgid "Interface(s)/Port(s)"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps.php:134
+msgid "Do you really want to delete this PPP interface?"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+msgid "Link Interface(s)"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+#: usr/local/www/services_dhcp.php:804 usr/local/www/services_dhcpv6.php:555
+msgid "Subnet"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:218
+msgid "Please choose a Link Type."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:222
+msgid ""
+"Multilink connections (MLPPP) using the PPP link type is not currently "
+"supported. Please select only one Link Interface."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:224
+msgid "The Service name contains invalid characters."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:226
+msgid "Do not specify both a Service name and a NULL Service name."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:240
+msgid ""
+"A valid PPPoE reset month must be specified (1-12) in the Custom PPPoE "
+"Periodic reset fields."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:242
+msgid ""
+"A valid PPPoE reset day of month must be specified (1-31) in the Custom "
+"PPPoE Periodic reset fields. No checks are done on valid # of days per month"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:244
+msgid ""
+"A valid PPPoE reset year must be specified. Don't select a year in the past!"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:249
+#, php-format
+msgid "A valid local IP address must be specified for %s."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:251
+#, php-format
+msgid "A valid gateway IP address OR hostname must be specified for %s."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:253
+#, php-format
+msgid "The bandwidth value for %s must be an integer."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:255
+#, php-format
+msgid "The MTU for %s must be greater than 576 bytes."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:257
+#, php-format
+msgid "The MRU for %s must be greater than 576 bytes."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:393
+#: usr/local/www/system_authservers.php:605
+msgid "Select"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:412
+msgid "PPPs configuration"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:415
+msgid "Link Type"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:430
+msgid "Link interface(s)"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:436
+msgid "Select at least two interfaces for Multilink (MLPPP) connections."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:485
+msgid ""
+"You may enter a description here for your reference. Description will appear "
+"in the \"Interfaces Assign\" select lists."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:539
+msgid "Note: Typically *99# for GSM networks and #777 for CDMA networks"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:553
+msgid "APN number (optional)"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:556
+msgid ""
+"Note: Defaults to 1 if you set APN above. Ignored if you set no APN above."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:560
+msgid "SIM PIN"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:567
+msgid "SIM PIN wait"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:570
+msgid ""
+"Note: Time to wait for SIM to discover network after PIN is sent to SIM "
+"(seconds)."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:574
+msgid "Init String"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:577
+msgid ""
+"Note: Enter the modem initialization string here. Do NOT include the \"AT\" "
+"string at the beginning of the command. Many modern USB 3G modems don't need "
+"an initialization string."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:582
+msgid "Connection Timeout"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:585
+msgid ""
+"Note: Enter timeout in seconds for connection to be established (sec.) "
+"Default is 45 sec."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:589
+msgid "Uptime Logging"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:591
+msgid "Enable persistent logging of connection uptime."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:592
+msgid ""
+"This option causes cumulative uptime to be recorded and displayed on the "
+"Status Interfaces page."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:604
+msgid "Configure a NULL Service name"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:605
+msgid ""
+"Hint: this field can usually be left empty. Service name will not be "
+"configured if this field is empty. Check the \"Configure NULL\" box to "
+"configure a blank Service name."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:680
+msgid "IP Address OR Hostname"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:691
+msgid "Dial On Demand"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:693
+msgid "Enable Dial-on-Demand mode"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:694
+msgid ""
+"This option causes the interface to operate in dial-on-demand mode. Do NOT "
+"enable if you want your link to be always up. The interface is configured, "
+"but the actual connection of the link is delayed until qualifying outgoing "
+"traffic is detected."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:699
+msgid "Idle Timeout"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:701
+msgid "(seconds) Default is 0, which disables the timeout feature."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:702
+msgid ""
+"If no incoming or outgoing packets are transmitted for the entered number of "
+"seconds the connection is brought down."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:703
+msgid ""
+"When the idle timeout occurs, if the dial-on-demand option is enabled, mpd "
+"goes back into dial-on-demand mode. Otherwise, the interface is brought down "
+"and all associated routes removed."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:707
+#: usr/local/www/vpn_openvpn_client.php:956
+#: usr/local/www/vpn_openvpn_server.php:1349
+msgid "Compression"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:709
+msgid "Disable vjcomp(compression) (auto-negotiated by default)."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:710
+msgid ""
+"This option enables Van Jacobson TCP header compression, which saves several "
+"bytes per TCP data packet. You almost always want this option. This "
+"compression ineffective for TCP connections with enabled modern extensions "
+"like time stamping or SACK, which modify TCP options between sequential "
+"packets."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:716
+msgid "TCPmssFix"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:718
+msgid "Disable tcpmssfix (enabled by default)."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:719
+msgid ""
+"This option causes mpd to adjust incoming and outgoing TCP SYN segments so "
+"that the requested maximum segment size is not greater than the amount "
+"allowed by the interface MTU. This is necessary in many setups to avoid "
+"problems caused by routers that drop ICMP Datagram Too Big messages. Without "
+"these messages, the originating machine sends data, it passes the rogue "
+"router then hits a machine that has an MTU that is not big enough for the "
+"data. Because the IP Don't Fragment option is set, this machine sends an "
+"ICMP Datagram Too Big message back to the originator and drops the packet. "
+"The rogue router drops the ICMP message and the originator never gets to "
+"discover that it must reduce the fragment size or drop the IP Don't Fragment "
+"option from its outgoing data."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:727
+msgid "ShortSeq"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:729
+msgid "Disable shortseq (auto-negotiated by default)."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:730
+msgid ""
+"This option is only meaningful if multi-link PPP is negotiated. It "
+"proscribes shorter multi-link fragment headers, saving two bytes on every "
+"frame. It is not necessary to disable this for connections that are not "
+"multi-link."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:735
+msgid "ACFComp"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:737
+msgid "Disable acfcomp (compression) (auto-negotiated by default)."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:738
+msgid ""
+"Address and control field compression. This option only applies to "
+"asynchronous link types. It saves two bytes per frame."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:742
+msgid "ProtoComp"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:744
+msgid "Disable protocomp (compression) (auto-negotiated by default)."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:745
+msgid ""
+"Protocol field compression. This option saves one byte per frame for most "
+"frames."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:758
+msgid "Link Parameters"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:765
+msgid ""
+"Set ONLY for MLPPP connections and ONLY when links have different bandwidths."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:772
+msgid "MTU will default to 1492."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:776
+msgid "MRU"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:779
+#: usr/local/www/interfaces_ppps_edit.php:786
+msgid "will be auto-negotiated by default."
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:783
+msgid "MRRU"
+msgstr ""
+
+#: usr/local/www/interfaces_ppps_edit.php:786
+msgid "Set ONLY for MLPPP connections."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq.php:67
+msgid ""
+"This QinQ cannot be deleted because it is still being used as an interface."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq.php:69
+msgid "QinQ interface does not exist"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq.php:90
+#: usr/local/www/interfaces_qinq_edit.php:40
+msgid "QinQ"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq.php:122
+#: usr/local/www/interfaces_qinq_edit.php:362
+msgid "Tag"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq.php:123
+msgid "QinQ members"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq.php:147
+msgid "Do you really want to delete this QinQ?"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq.php:158
+#, php-format
+msgid ""
+"Not all drivers/NICs support 802.1Q QinQ tagging properly. On cards that do "
+"not explicitly support it, QinQ tagging will still work, but the reduced MTU "
+"may cause problems. See the %s handbook for information on supported cards."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:87
+msgid "First level tag cannot be empty."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:89
+msgid ""
+"You are editing an existing entry and modifying the first level tag is not "
+"allowed."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:91
+msgid ""
+"You are editing an existing entry and modifying the interface is not allowed."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:95
+msgid "QinQ level already exists for this interface, edit it!"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:99
+msgid ""
+"A normal VLAN exists with this tag please remove it to use this tag for QinQ "
+"first level."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:126
+#: usr/local/www/interfaces_qinq_edit.php:136
+msgid "Tags can contain only numbers or a range in format #-#."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:199
+msgid "QinQ VLANs group"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:274
+msgid "members"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:278
+msgid "detail"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:291
+msgid "Interface QinQ Edit"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:311
+msgid "Only QinQ capable interfaces will be shown."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:314
+msgid "First level tag"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:319
+msgid ""
+"This is the first level VLAN tag. On top of this are stacked the member "
+"VLANs defined below."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:324
+#: usr/local/www/load_balancer_relay_action.php:141
+#: usr/local/www/load_balancer_relay_action_edit.php:516
+#: usr/local/www/load_balancer_relay_action_edit.php:536
+#: usr/local/www/load_balancer_relay_protocol.php:135
+msgid "Options"
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:339
+msgid ""
+"Adds interface to QinQ interface groups so you can write filter rules easily."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq_edit.php:356
+msgid ""
+"You can specify ranges in the input below. The format is pretty simple i.e "
+"9-100 or 10.20..."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan.php:70
+msgid ""
+"This VLAN cannot be deleted because it is still being used as an interface."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan.php:84
+#: usr/local/www/interfaces_vlan_edit.php:152
+msgid "VLAN"
+msgstr ""
+
+#: usr/local/www/interfaces_vlan.php:116
+#: usr/local/www/interfaces_vlan_edit.php:79
+msgid "VLAN tag"
+msgstr ""
+
+#: usr/local/www/interfaces_vlan.php:132
+msgid "Do you really want to delete this VLAN?"
+msgstr ""
+
+#: usr/local/www/interfaces_vlan.php:143
+#, php-format
+msgid ""
+"Not all drivers/NICs support 802.1Q VLAN tagging properly. On cards that do "
+"not explicitly support it, VLAN tagging will still work, but the reduced MTU "
+"may cause problems. See the %s handbook for information on supported cards."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:84
+msgid "The VLAN tag must be an integer between 1 and 4094."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:88
+msgid "Interface supplied as parent is invalid"
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:93
+msgid ""
+"Interface is assigned and you cannot change the VLAN tag while assigned."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:101
+#, php-format
+msgid "A VLAN with the tag %s is already defined on this interface."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:108
+msgid "A QinQ VLAN exists with this tag please remove it to use this tag with."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:164
+msgid "VLAN configuration"
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:183
+msgid "Only VLAN capable interfaces will be shown."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:186
+msgid "VLAN tag "
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:190
+msgid "802.1Q VLAN tag (between 1 and 4094) "
+msgstr ""
+
+#: usr/local/www/interfaces_wireless.php:66
+msgid ""
+"This wireless clone cannot be deleted because it is assigned as an interface."
+msgstr ""
+
+#: usr/local/www/interfaces_wireless.php:128
+msgid "Do you really want to delete this wireless clone?"
+msgstr ""
+
+#: usr/local/www/interfaces_wireless.php:139
+msgid ""
+"Here you can configure clones of wireless interfaces, which can be assigned "
+"as separate independent interfaces. Only available on wireless chipsets that "
+"support this, with limitations on the number that can be created in each "
+"mode."
+msgstr ""
+
+#: usr/local/www/interfaces_wireless_edit.php:122
+msgid ""
+"This wireless clone cannot be modified because it is still assigned as an "
+"interface."
+msgstr ""
+
+#: usr/local/www/interfaces_wireless_edit.php:124
+msgid ""
+"Use the configuration page for the assigned interface to change the mode."
+msgstr ""
+
+#: usr/local/www/interfaces_wireless_edit.php:129
+#, php-format
+msgid ""
+"Error creating interface with mode %1$s. The %2$s interface may not support "
+"creating more clones with the selected mode."
+msgstr ""
+
+#: usr/local/www/interfaces_wireless_edit.php:134
+#, php-format
+msgid "Created with id %s"
+msgstr ""
+
+#: usr/local/www/interfaces_wireless_edit.php:137
+msgid "Created without id"
+msgstr ""
+
+#: usr/local/www/interfaces_wireless_edit.php:162
+msgid "Wireless clone configuration"
+msgstr ""
+
+#: usr/local/www/license.php:47
+msgid "License"
+msgstr ""
+
+#: usr/local/www/license.php:49
+msgid "is Copyright"
+msgstr ""
+
+#: usr/local/www/license.php:50 usr/local/www/license.php:54
+msgid "All rights reserved"
+msgstr ""
+
+#: usr/local/www/license.php:52
+msgid "m0n0wall is Copyright "
+msgstr ""
+
+#: usr/local/www/license.php:52
+msgid "2002-2014 by Manuel Kasper"
+msgstr ""
+
+#: usr/local/www/license.php:55
+msgid "Redistribution and use in source and binary forms, with or without"
+msgstr ""
+
+#: usr/local/www/license.php:56
+msgid ""
+"modification, are permitted provided that the following conditions are met"
+msgstr ""
+
+#: usr/local/www/license.php:59
+msgid ""
+"1. Redistributions of source code must retain the above copyright notice,"
+msgstr ""
+
+#: usr/local/www/license.php:61
+msgid "this list of conditions and the following disclaimer"
+msgstr ""
+
+#: usr/local/www/license.php:63
+msgid "2. Redistributions in binary form must reproduce the above copyright"
+msgstr ""
+
+#: usr/local/www/license.php:64
+msgid "notice, this list of conditions and the following disclaimer in the"
+msgstr ""
+
+#: usr/local/www/license.php:66
+msgid "documentation and/or other materials provided with the distribution."
+msgstr ""
+
+#: usr/local/www/license.php:68
+msgid "THIS SOFTWARE IS PROVIDED "
+msgstr ""
+
+#: usr/local/www/license.php:68
+msgid "AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,"
+msgstr ""
+
+#: usr/local/www/license.php:70
+msgid ""
+"INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY"
+msgstr ""
+
+#: usr/local/www/license.php:71
+msgid ""
+"AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE"
+msgstr ""
+
+#: usr/local/www/license.php:73
+msgid ""
+"AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,"
+msgstr ""
+
+#: usr/local/www/license.php:75
+msgid "OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF"
+msgstr ""
+
+#: usr/local/www/license.php:77
+msgid ""
+"SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS"
+msgstr ""
+
+#: usr/local/www/license.php:79
+msgid "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN"
+msgstr ""
+
+#: usr/local/www/license.php:81
+msgid "CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)"
+msgstr ""
+
+#: usr/local/www/license.php:82
+msgid ""
+"ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE"
+msgstr ""
+
+#: usr/local/www/license.php:84
+msgid "POSSIBILITY OF SUCH DAMAGE"
+msgstr ""
+
+#: usr/local/www/license.php:86
+msgid "is based upon/includes various free software packages, listed below."
+msgstr ""
+
+#: usr/local/www/license.php:88
+#, php-format
+msgid ""
+"The authors of %s would like to thank the authors of these software packages "
+"for their efforts"
+msgstr ""
+
+#: usr/local/www/license.php:91 usr/local/www/license.php:94
+#: usr/local/www/license.php:97 usr/local/www/license.php:101
+#: usr/local/www/license.php:102 usr/local/www/license.php:107
+#: usr/local/www/license.php:111 usr/local/www/license.php:114
+#: usr/local/www/license.php:117 usr/local/www/license.php:120
+#: usr/local/www/license.php:124 usr/local/www/license.php:125
+#: usr/local/www/license.php:127 usr/local/www/license.php:133
+#: usr/local/www/license.php:134 usr/local/www/license.php:141
+msgid "Copyright"
+msgstr ""
+
+#: usr/local/www/license.php:91
+msgid "1992-2014 The FreeBSD Project. All rights reserved"
+msgstr ""
+
+#: usr/local/www/license.php:93
+msgid "This product includes PHP, freely available from"
+msgstr ""
+
+#: usr/local/www/license.php:94
+msgid "1999-2014 The PHP Group. All rights reserved."
+msgstr ""
+
+#: usr/local/www/license.php:96
+msgid "LightTPD"
+msgstr ""
+
+#: usr/local/www/license.php:97
+msgid "2004, Jan Knescke, incremental"
+msgstr ""
+
+#: usr/local/www/license.php:98 usr/local/www/license.php:108
+msgid "All rights reserved."
+msgstr ""
+
+#: usr/local/www/license.php:100
+msgid "ISC DHCP server "
+msgstr ""
+
+#: usr/local/www/license.php:101
+msgid "2004-2012 Internet Software Consortium, Inc."
+msgstr ""
+
+#: usr/local/www/license.php:102
+msgid "1995-2003 Internet Software Consortium"
+msgstr ""
+
+#: usr/local/www/license.php:104 usr/local/www/services_snmp.php:397
+msgid "PF"
+msgstr ""
+
+#: usr/local/www/license.php:106
+msgid "MPD - Multi-link PPP daemon for FreeBSD"
+msgstr ""
+
+#: usr/local/www/license.php:110
+msgid "Circular log support for FreeBSD syslogd "
+msgstr ""
+
+#: usr/local/www/license.php:113
+msgid "Dnsmasq - a DNS forwarder for NAT firewalls"
+msgstr ""
+
+#: usr/local/www/license.php:116
+msgid "IPsec-Tools"
+msgstr ""
+
+#: usr/local/www/license.php:117
+msgid "1995-2002 WIDE Project. All rights reserved."
+msgstr ""
+
+#: usr/local/www/license.php:119
+msgid "msntp"
+msgstr ""
+
+#: usr/local/www/license.php:120
+msgid ""
+" 1996, 1997, 2000 N.M. Maclaren, University of Cambridge. All rights "
+"reserved."
+msgstr ""
+
+#: usr/local/www/license.php:123
+msgid "UCD-SNMP"
+msgstr ""
+
+#: usr/local/www/license.php:124
+msgid "1989, 1991, 1992 by Carnegie Mellon University."
+msgstr ""
+
+#: usr/local/www/license.php:125
+msgid ""
+"1996, 1998-2000 The Regents of the University of California. All rights "
+"reserved"
+msgstr ""
+
+#: usr/local/www/license.php:127
+msgid "2001-2002, Network Associates Technology, Inc. All rights reserved."
+msgstr ""
+
+#: usr/local/www/license.php:129
+msgid "Portions of this code are copyright"
+msgstr ""
+
+#: usr/local/www/license.php:129
+msgid "2001-2002, Cambridge Broadband Ltd. All rights reserved."
+msgstr ""
+
+#: usr/local/www/license.php:132
+msgid "choparp"
+msgstr ""
+
+#: usr/local/www/license.php:136
+msgid "php-radius"
+msgstr ""
+
+#: usr/local/www/license.php:137
+msgid "Copyright 2000, 2001, 2002 by Edwin Groothuis. All rights reserved."
+msgstr ""
+
+#: usr/local/www/license.php:138
+msgid "This product includes software developed by Edwin Groothuis."
+msgstr ""
+
+#: usr/local/www/license.php:140
+msgid "wol"
+msgstr ""
+
+#: usr/local/www/license.php:144
+msgid "Copyright (C) 2002-2005 OpenVPN Solutions LLC "
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor.php:73
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"pool."
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor.php:89
+#: usr/local/www/load_balancer_monitor_edit.php:196
+#: usr/local/www/load_balancer_pool.php:135
+#: usr/local/www/load_balancer_pool_edit.php:81
+#: usr/local/www/load_balancer_pool_edit.php:252
+#: usr/local/www/status_gateways.php:76 usr/local/www/status_lb_pool.php:134
+msgid "Monitor"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor.php:101
+#: usr/local/www/load_balancer_relay_protocol.php:113
+#: usr/local/www/load_balancer_setting.php:112
+msgid "The load balancer configuration has been changed"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor.php:108
+#: usr/local/www/load_balancer_pool.php:117
+#: usr/local/www/load_balancer_relay_action.php:125
+#: usr/local/www/load_balancer_relay_protocol.php:121
+#: usr/local/www/load_balancer_setting.php:120
+#: usr/local/www/load_balancer_virtual_server.php:118
+#: usr/local/www/status_lb_pool.php:121 usr/local/www/status_lb_vs.php:68
+msgid "Pools"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor.php:109
+#: usr/local/www/load_balancer_pool.php:118
+#: usr/local/www/load_balancer_relay_action.php:126
+#: usr/local/www/load_balancer_relay_protocol.php:122
+#: usr/local/www/load_balancer_setting.php:121
+#: usr/local/www/load_balancer_virtual_server.php:99
+#: usr/local/www/load_balancer_virtual_server.php:119
+#: usr/local/www/status_lb_pool.php:122 usr/local/www/status_lb_vs.php:69
+msgid "Virtual Servers"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor.php:110
+#: usr/local/www/load_balancer_pool.php:119
+#: usr/local/www/load_balancer_relay_action.php:124
+#: usr/local/www/load_balancer_relay_protocol.php:120
+#: usr/local/www/load_balancer_setting.php:122
+#: usr/local/www/load_balancer_virtual_server.php:120
+msgid "Monitors"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:69
+msgid "Load Balancer: Monitor:"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:98
+msgid "This monitor name has already been used. Monitor names must be unique."
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:101
+#: usr/local/www/load_balancer_pool_edit.php:91
+#: usr/local/www/load_balancer_relay_action_edit.php:131
+#: usr/local/www/load_balancer_relay_protocol_edit.php:92
+msgid "You cannot use spaces in the 'name' field."
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:115
+#: usr/local/www/services_dhcp_edit.php:172
+#: usr/local/www/services_dhcpv6_edit.php:124
+msgid "The hostname can only contain the characters A-Z, 0-9 and '-'."
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:121
+msgid "HTTP(s) codes must be from RFC2616."
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:125
+msgid "The path to monitor must be set."
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:148
+#, php-format
+msgid "modified '%s' monitor:"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:200
+msgid "ICMP"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:200
+#: usr/local/www/load_balancer_monitor_edit.php:270
+#: usr/local/www/load_balancer_relay_action_edit.php:188
+#: usr/local/www/load_balancer_relay_protocol_edit.php:145
+#: usr/local/www/system_advanced_admin.php:344
+msgid "HTTP"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:200
+#: usr/local/www/load_balancer_monitor_edit.php:303
+#: usr/local/www/system_advanced_admin.php:347
+msgid "HTTPS"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:200
+#: usr/local/www/load_balancer_monitor_edit.php:337
+msgid "Send/Expect"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:234
+msgid "Edit Load Balancer - Monitor entry"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:274
+#: usr/local/www/load_balancer_monitor_edit.php:307
+msgid "Path"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:282
+#: usr/local/www/load_balancer_monitor_edit.php:315
+msgid "Hostname for Host: header if needed."
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:286
+#: usr/local/www/load_balancer_monitor_edit.php:319
+msgid "HTTP Code"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:341
+msgid "Send string"
+msgstr ""
+
+#: usr/local/www/load_balancer_monitor_edit.php:347
+msgid "Expect string"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool.php:73
+#: usr/local/www/load_balancer_relay_protocol.php:72
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"virtual server."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool.php:98
+#: usr/local/www/load_balancer_pool_edit.php:170
+#: usr/local/www/load_balancer_virtual_server.php:136
+#: usr/local/www/status_lb_pool.php:63
+msgid "Pool"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool.php:110
+#: usr/local/www/status_lb_pool.php:114
+#, php-format
+msgid ""
+"The load balancer configuration has been changed%sYou must apply the changes "
+"in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool.php:133
+#: usr/local/www/status_lb_pool.php:133 usr/local/www/status_lb_vs.php:80
+#: usr/local/www/system_authservers.php:451
+#: usr/local/www/system_groupmanager.php:291
+#: usr/local/www/system_groupmanager_addprivs.php:171
+#: usr/local/www/system_usermanager.php:497
+#: usr/local/www/system_usermanager_addprivs.php:160
+#: usr/local/www/system_usermanager_settings.php:117
+msgid "Servers"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool.php:149
+#, php-format
+msgid ""
+"The Load Balancer in %s 2.0 is for server load balancing, not Multi-WAN. For "
+"load balancing or failover for multiple WANs, use "
+msgstr ""
+
+#: usr/local/www/load_balancer_pool.php:150
+#: usr/local/www/status_gateway_groups.php:49
+#: usr/local/www/status_gateway_groups.php:53
+#: usr/local/www/status_gateway_groups.php:67
+#: usr/local/www/status_gateways.php:65
+#: usr/local/www/system_gateway_groups.php:54
+#: usr/local/www/system_gateway_groups.php:99
+msgid "Gateway Groups"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:70
+msgid "Load Balancer: Pool:"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:81
+msgid "Server List"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:88
+msgid "This pool name has already been used. Pool names must be unique."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:94
+#, php-format
+msgid "The name '%s' is a reserved word and cannot be used."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:97
+#, php-format
+msgid "Sorry, an alias is already named %s."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:100
+msgid "The port must be an integer between 1 and 65535, or a port alias."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:104
+msgid "The retry value must be an integer between 1 and 65535."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:109
+#, php-format
+msgid "%s is not a valid IP address or IPv4 subnet (in \"enabled\" list)."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:112
+#, php-format
+msgid ""
+"%s is a subnet containing more than 64 IP addresses (in \"enabled\" list)."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:119
+#, php-format
+msgid "%s is not a valid IP address or IPv4 subnet (in \"disabled\" list)."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:122
+#, php-format
+msgid ""
+"%s is a subnet containing more than 64 IP addresses (in \"disabled\" list)."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:131
+msgid "Invalid monitor chosen."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:138
+#, php-format
+msgid " modified '%s' pool:"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:198
+msgid "Add/edit Load Balancer - Pool entry"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:210
+msgid "Load Balance"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:211
+msgid "Manual Failover"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:227
+msgid "This is the port your servers are listening on."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:228
+#: usr/local/www/load_balancer_virtual_server_edit.php:197
+msgid ""
+"You may also specify a port alias listed in Firewall -&gt; Aliases here."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:239
+msgid "Retry"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:242
+msgid ""
+"Optionally specify how many times to retry checking a server before "
+"declaring it down."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:249
+msgid "Add item to pool"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:267
+msgid ""
+"Please add a monitor IP address on the monitors tab if you wish to use this "
+"feature."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:273
+msgid "Server IP Address"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:276
+msgid "Add to pool"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:283
+msgid "Current Pool Members"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:292
+msgid "Pool Disabled"
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:312
+msgid "Enabled (default)"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action.php:75
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"relay protocol."
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action.php:105
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+msgid "Relay Action"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action.php:117
+msgid ""
+"The load balancer configuration has been changed.<br />You must apply the "
+"changes in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action.php:127
+msgid "Relay Actions"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action.php:128
+msgid "Relay Protocols"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action_edit.php:69
+msgid "Load Balancer: Relay Action:"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action_edit.php:128
+msgid "This action name has already been used. Action names must be unique."
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action_edit.php:138
+#, php-format
+msgid "modified '%s' action:"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action_edit.php:188
+#: usr/local/www/load_balancer_relay_protocol_edit.php:145
+msgid "DNS"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action_edit.php:409
+msgid "Edit Load Balancer - Relay Action entry"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action_edit.php:507
+#: usr/local/www/services_dhcp.php:1158 usr/local/www/services_dhcpv6.php:790
+#: usr/local/www/system_advanced_sysctl.php:183
+#: usr/local/www/system_advanced_sysctl.php:261
+#: usr/local/www/system_certmanager.php:806
+msgid "Value"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action_edit.php:509
+#: usr/local/www/services_rfc2136_edit.php:74
+#: usr/local/www/services_rfc2136_edit.php:180
+msgid "Key"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action_edit.php:518
+#: usr/local/www/load_balancer_relay_action_edit.php:538
+msgid "TODO"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol.php:101
+#: usr/local/www/load_balancer_relay_protocol_edit.php:140
+#: usr/local/www/load_balancer_virtual_server_edit.php:81
+#: usr/local/www/load_balancer_virtual_server_edit.php:260
+msgid "Relay Protocol"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:68
+msgid "Load Balancer: Relay Protocol:"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:89
+msgid ""
+"This protocol name has already been used. Protocol names must be unique."
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:108
+#, php-format
+msgid "modified '%s' load balancing protocol:"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:110
+msgid "name"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:111
+#: usr/local/www/load_balancer_relay_protocol_edit.php:113
+msgid "type"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:112
+msgid "description"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:114
+msgid "action"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:193
+msgid "Edit Load Balancer - Relay Protocol entry"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:228
+msgid "Add / remove available actions"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:238
+msgid "Available Actions"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:253
+#: usr/local/www/system_crlmanager.php:528
+msgid "Add"
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:260
+msgid "Enabled Actions"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:71
+msgid "Timeout must be a numeric value"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:75
+msgid "Interval must be a numeric value"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:80
+msgid "Prefork must be a numeric value"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:83
+msgid "Prefork value must be between 1 and 32"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:133
+msgid "Relayd global settings"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:136
+msgid "timeout"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:140
+msgid ""
+"Set the global timeout in milliseconds for checks. Leave blank to use the "
+"default value of 1000 ms "
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:144
+msgid "interval"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:148
+msgid ""
+"Set the interval in seconds at which the member of a pool will be checked. "
+"Leave blank to use the default interval of 10 seconds"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:152
+msgid "prefork"
+msgstr ""
+
+#: usr/local/www/load_balancer_setting.php:156
+msgid ""
+"Number of processes used by relayd for dns protocol. Leave blank to use the "
+"default value of 5 processes"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server.php:111
+msgid "The virtual server configuration has been changed"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server.php:137
+#: usr/local/www/load_balancer_virtual_server_edit.php:226
+msgid "Fall Back Pool"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:65
+msgid "Load Balancer: Virtual Server:"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:90
+msgid ""
+"This virtual server name has already been used. Virtual server names must "
+"be unique."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:93
+msgid "You cannot use spaces or slashes in the 'name' field."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:96
+msgid ""
+"The port must be an integer between 1 and 65535, a port alias, or left blank."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:99
+#, php-format
+msgid "%s is not a valid IP address, IPv4 subnet, or alias."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:101
+#, php-format
+msgid "%s is a subnet containing more than 64 IP addresses."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:104
+msgid "You cannot select a Fall Back Pool when using the DNS relay protocol."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:111
+#, php-format
+msgid "modified '%s' vs:"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:113
+#, php-format
+msgid "created '%s' vs:"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:147
+#: usr/local/www/status_lb_vs.php:57
+msgid "Virtual Server"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:163
+msgid "Edit Load Balancer - Virtual Server entry"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:181
+msgid ""
+"This is normally the WAN IP address that you would like the server to listen "
+"on. All connections to this IP and port will be forwarded to the pool "
+"cluster."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:182
+msgid ""
+"You may also specify a host alias listed in Firewall -&gt; Aliases here."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:195
+msgid ""
+"This is the port that the clients will connect to. All connections to this "
+"port will be forwarded to the pool cluster."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:196
+msgid "If left blank, listening ports from the pool will be used."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:207
+msgid "Virtual Server Pool"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:210
+#: usr/local/www/load_balancer_virtual_server_edit.php:229
+msgid "Please add a pool on the Pools tab to use this feature."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:242
+msgid ""
+"The server pool to which clients will be redirected if *ALL* servers in the "
+"Virtual Server Pool are offline."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:243
+msgid "This option is NOT compatible with the DNS relay protocol."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:279
+#: usr/local/www/status_captiveportal_expire.php:95
+#: usr/local/www/status_captiveportal_test.php:95
+msgid "Submit"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:289
+msgid ""
+"Don't forget to add a firewall rule for the virtual server/pool after you're "
+"finished setting it up."
+msgstr ""
+
+#: usr/local/www/pkg.php:57
+msgid "ERROR: No package defined."
+msgstr ""
+
+#: usr/local/www/pkg.php:188
+msgid "Saving changes..."
+msgstr ""
+
+#: usr/local/www/pkg.php:189
+msgid "Do you really want to save changes?"
+msgstr ""
+
+#: usr/local/www/pkg.php:458
+msgid "Do you really want to delete this item?"
+msgstr ""
+
+#: usr/local/www/pkg_edit.php:74
+msgid "ERROR: No valid package defined."
+msgstr ""
+
+#: usr/local/www/pkg_edit.php:263
+msgid "Package Editor"
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:91
+#, php-format
+msgid "Unable to retrieve package info from %s. Cached data will be used."
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:94
+#, php-format
+msgid ""
+"Unable to communicate with %1$s. Please verify DNS and interface "
+"configuration, and that %2$s has functional Internet connectivity."
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:138 usr/local/www/pkg_mgr_installed.php:109
+msgid "Available Packages"
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:139 usr/local/www/pkg_mgr_installed.php:113
+#: usr/local/www/pkg_mgr_settings.php:102
+msgid "Installed Packages"
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:184
+msgid "Other Categories"
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:196 usr/local/www/pkg_mgr_installed.php:124
+msgid "Category"
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:203 usr/local/www/pkg_mgr.php:279
+msgid "There are currently no packages available for installation."
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:225 usr/local/www/pkg_mgr_installed.php:190
+msgid "Package info"
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:228 usr/local/www/pkg_mgr_installed.php:194
+msgid "No package info, check the forum"
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:234
+msgid "Click on package name to access its website."
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:245
+msgid "Click "
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:245
+msgid " version to check its change log."
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:257
+msgid "platform"
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:261 usr/local/www/pkg_mgr_installed.php:211
+msgid "Click package info for more details about "
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:273
+msgid "Install "
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:58
+msgid "Install Package"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:100
+msgid "Available packages"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:101
+msgid "Installed packages"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:102
+msgid "Package Installer"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:197
+msgid "Something is wrong on the request."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:201
+msgid "Log was not retrievable."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:206
+msgid "installation completed."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:209
+#, php-format
+msgid "Could not find %s."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:220
+msgid "Creating restore point before package installation."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:225 usr/local/www/pkg_mgr_install.php:226
+msgid "Package deleted."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:236 usr/local/www/pkg_mgr_install.php:237
+msgid "Package reinstallation failed."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:240 usr/local/www/pkg_mgr_install.php:241
+msgid "Package reinstalled."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:263 usr/local/www/pkg_mgr_install.php:264
+msgid "All packages reinstalled."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:269
+msgid "No packages are installed."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:275
+msgid "Installation of"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:275
+msgid "FAILED!"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:276
+msgid "Installation halted."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:283
+msgid "Installation completed."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:283
+msgid "setup instructions"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:285
+msgid ""
+"Installation completed. Please check to make sure that the package is "
+"configured from the respective menu then start the package."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:154
+#: usr/local/www/pkg_mgr_installed.php:156
+#: usr/local/www/pkg_mgr_installed.php:163
+#: usr/local/www/pkg_mgr_installed.php:165
+msgid "Available"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:157
+#: usr/local/www/pkg_mgr_installed.php:166
+#: usr/local/www/pkg_mgr_installed.php:184
+msgid "Installed"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:181
+#: usr/local/www/pkg_mgr_installed.php:183
+msgid "Latest"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:181
+#: usr/local/www/pkg_mgr_installed.php:183
+msgid "N/A"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:209
+msgid "Click on "
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:220
+msgid "Remove "
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:224
+#: usr/local/www/pkg_mgr_installed.php:227
+msgid "Reinstall "
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:237
+msgid "There are no packages currently installed."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:63
+#: usr/local/www/pkg_mgr_settings.php:103
+msgid "Package Settings"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:101
+#, php-format
+msgid "%s packages"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:112
+msgid ""
+"This page allows an alternate package repository to be configured, primarily "
+"for temporary use as a testing mechanism."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:113
+msgid ""
+"The contents of unofficial packages servers cannot be verified and may "
+"contain malicious files."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:114
+msgid ""
+"The package server settings should remain at their default values to ensure "
+"that verifiable and trusted packages are recevied."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:116
+msgid ""
+"A warning is printed on the Dashboard and in the package manager when an "
+"unofficial package server is in use."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:121
+#: usr/local/www/pkg_mgr_settings.php:124
+msgid "Package Repository URL"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:126
+msgid "Use a non-official server for packages"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:128
+#: usr/local/www/system_firmware_settings.php:170
+msgid "Base URL:"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:131
+#, php-format
+msgid "This is where %s will check for packages when the"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:131
+msgid "System: Packages"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:131
+#: usr/local/www/system_firmware_settings.php:173
+msgid "page is viewed."
+msgstr ""
+
+#: usr/local/www/reboot.php:49
+msgid "Reboot System"
+msgstr ""
+
+#: usr/local/www/reboot.php:57
+msgid "The system is rebooting now. This may take one minute."
+msgstr ""
+
+#: usr/local/www/reboot.php:63
+msgid "Are you sure you want to reboot the system?"
+msgstr ""
+
+#: usr/local/www/restart_httpd.php:43
+msgid "Restarting httpd"
+msgstr ""
+
+#: usr/local/www/restart_httpd.php:51
+msgid "Mounting file systems read/write"
+msgstr ""
+
+#: usr/local/www/restart_httpd.php:54
+msgid "Forcing all PHP file permissions to 0755"
+msgstr ""
+
+#: usr/local/www/restart_httpd.php:57
+msgid "Mounting file systems read only"
+msgstr ""
+
+#: usr/local/www/restart_httpd.php:60
+msgid "Restarting mini_httpd"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:69
+#: usr/local/www/services_captiveportal_filemanager.php:72
+#: usr/local/www/services_captiveportal_hostname.php:67
+#: usr/local/www/services_captiveportal_hostname_edit.php:60
+#: usr/local/www/services_captiveportal_ip.php:65
+#: usr/local/www/services_captiveportal_ip_edit.php:61
+#: usr/local/www/services_captiveportal_mac.php:64
+#: usr/local/www/services_captiveportal_mac_edit.php:61
+#: usr/local/www/services_captiveportal_vouchers.php:92
+#: usr/local/www/services_captiveportal_vouchers_edit.php:46
+#: usr/local/www/services_captiveportal_zones_edit.php:46
+#: usr/local/www/status_captiveportal_expire.php:60
+#: usr/local/www/status_captiveportal_test.php:59
+#: usr/local/www/status_captiveportal_voucher_rolls.php:58
+#: usr/local/www/status_captiveportal_vouchers.php:58
+msgid "Captive portal"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:88
+#, php-format
+msgid "Captive Portal: zone %s: Restore default portal page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:107
+#, php-format
+msgid "Captive Portal: zone %s: Restore default error page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:126
+#, php-format
+msgid "Captive Portal: zone %s: Restore default logout page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:211
+#: usr/local/www/services_captiveportal_zones_edit.php:60
+#: usr/local/www/services_captiveportal_zones_edit.php:98
+msgid "Zone name"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:219
+#, php-format
+msgid ""
+"The captive portal cannot be used on interface %s since it is part of a "
+"bridge."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:223
+#, php-format
+msgid ""
+"The captive portal cannot be used on interface %s since it is used already "
+"on %s instance."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:231
+msgid "Certificate must be specified for HTTPS login."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:234
+msgid "The HTTPS server name must be specified for HTTPS login."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:241
+msgid "The timeout must be at least 1 minute."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:254
+msgid ""
+"Hard timeout must be less or equal Default lease time set on DHCP Server"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:259
+msgid "The idle timeout must be at least 1 minute."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:262
+msgid "The pass-through credit count must be a number or left blank."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:265
+msgid ""
+"The waiting period to restore pass-through credits must be above 0 hours."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:269
+#: usr/local/www/services_captiveportal.php:272
+#: usr/local/www/services_captiveportal.php:275
+#: usr/local/www/services_captiveportal.php:278
+#: usr/local/www/services_captiveportal_ip_edit.php:106
+#, php-format
+msgid "A valid IP address must be specified. [%s]"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:281
+#: usr/local/www/services_captiveportal.php:284
+#: usr/local/www/services_captiveportal.php:287
+#: usr/local/www/services_captiveportal.php:290
+#: usr/local/www/services_captiveportal.php:293
+#, php-format
+msgid "A valid port number must be specified. [%s]"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:296
+msgid ""
+"The maximum number of concurrent connections per client IP address may not "
+"be larger than the global maximum."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:299
+msgid ""
+"The NAS-Identifier must be 3-253 characters long and should only contain "
+"ASCII characters."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:505
+#: usr/local/www/services_captiveportal_filemanager.php:148
+#: usr/local/www/services_captiveportal_hostname.php:113
+#: usr/local/www/services_captiveportal_ip.php:106
+#: usr/local/www/services_captiveportal_mac.php:156
+#: usr/local/www/services_captiveportal_vouchers.php:442
+msgid "Captive portal(s)"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:506
+#: usr/local/www/services_captiveportal_filemanager.php:149
+#: usr/local/www/services_captiveportal_hostname.php:114
+#: usr/local/www/services_captiveportal_ip.php:107
+#: usr/local/www/services_captiveportal_mac.php:157
+#: usr/local/www/services_captiveportal_vouchers.php:443
+msgid "MAC"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:507
+#: usr/local/www/services_captiveportal_filemanager.php:150
+#: usr/local/www/services_captiveportal_ip.php:108
+#: usr/local/www/services_captiveportal_mac.php:158
+#: usr/local/www/services_captiveportal_vouchers.php:444
+msgid "Allowed IP addresses"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:508
+#: usr/local/www/services_captiveportal_filemanager.php:151
+#: usr/local/www/services_captiveportal_hostname.php:116
+#: usr/local/www/services_captiveportal_ip.php:109
+#: usr/local/www/services_captiveportal_mac.php:159
+#: usr/local/www/services_captiveportal_vouchers.php:445
+msgid "Allowed Hostnames"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:509
+#: usr/local/www/services_captiveportal.php:671
+#: usr/local/www/services_captiveportal_filemanager.php:152
+#: usr/local/www/services_captiveportal_hostname.php:117
+#: usr/local/www/services_captiveportal_ip.php:110
+#: usr/local/www/services_captiveportal_mac.php:160
+#: usr/local/www/services_captiveportal_vouchers.php:92
+#: usr/local/www/services_captiveportal_vouchers.php:446
+#: usr/local/www/status_captiveportal_vouchers.php:58
+msgid "Vouchers"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:510
+#: usr/local/www/services_captiveportal_filemanager.php:153
+#: usr/local/www/services_captiveportal_hostname.php:118
+#: usr/local/www/services_captiveportal_ip.php:111
+#: usr/local/www/services_captiveportal_mac.php:161
+#: usr/local/www/services_captiveportal_vouchers.php:447
+msgid "File Manager"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:520
+msgid "Enable captive portal"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:535
+msgid "Select the interface(s) to enable for captive portal."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:538
+msgid "Maximum concurrent connections"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:542
+msgid "per client IP address (0 = no limit)"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:545
+msgid ""
+"This setting limits the number of concurrent connections to the captive "
+"portal HTTP(S) server. This does not set how many users can be logged in to "
+"the captive portal, but rather how many users can load the portal page or "
+"authenticate at the same time! Possible setting allowed is: minimum 4 "
+"connections per client IP address, with a total maximum of 100 connections."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:553
+#: usr/local/www/services_captiveportal.php:560
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/system_advanced_misc.php:623
+msgid "minutes"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:554
+msgid ""
+"Clients will be disconnected after this amount of inactivity. They may log "
+"in again immediately, though. Leave this field blank for no idle timeout."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:557
+msgid "Hard timeout"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:561
+msgid ""
+"Clients will be disconnected after this amount of time, regardless of "
+"activity. They may log in again immediately, though. Leave this field blank "
+"for no hard timeout (not recommended unless an idle timeout is set)."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:564
+msgid "Pass-through credits allowed per MAC address"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:567
+msgid "per client MAC address (0 or blank = none)"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:568
+msgid ""
+"This setting allows passing through the captive portal without "
+"authentication a limited number of times per MAC address. Once used up, the "
+"client can only log in with valid credentials until the waiting period "
+"specified below has expired. Recommended to set a hard timeout and/or idle "
+"timeout when using this for it to be effective."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:571
+msgid "Waiting period to restore pass-through credits"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:574
+msgid "hours"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:575
+msgid ""
+"Clients will have their available pass-through credits restored to the "
+"original count after this amount of time since using the first one. This "
+"must be above 0 hours if pass-through credits are enabled."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:578
+msgid "Reset waiting period on attempted access"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:581
+msgid "Enable waiting period reset on attempted access"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:582
+msgid ""
+"If enabled, the waiting period is reset to the original duration if access "
+"is attempted when all pass-through credits have already been exhausted."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:585
+msgid "Logout popup window"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:588
+msgid "Enable logout popup window"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:589
+msgid ""
+"If enabled, a popup window will appear when clients are allowed through the "
+"captive portal. This allows clients to explicitly disconnect themselves "
+"before the idle or hard timeout occurs."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:592
+msgid "Pre-authentication redirect URL"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:595
+#, php-format
+msgid ""
+"Use this field to set $PORTAL_REDIRURL$ variable which can be accessed using "
+"your custom captive portal index.php page or error pages."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:599
+msgid "After authentication Redirection URL"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:603
+msgid ""
+"If you provide a URL here, clients will be redirected to that URL instead of "
+"the one they initially tried to access after they've authenticated."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:607
+msgid "Blocked MAC address redirect URL"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:610
+#, php-format
+msgid ""
+"If you provide a URL here, MAC addresses set to be blocked will be redirect "
+"to that URL when attempt to access anything."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:614
+msgid "Concurrent user logins"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:617
+msgid "Disable concurrent logins"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:618
+msgid ""
+"If this option is set, only the most recent login per username will be "
+"active. Subsequent logins will cause machines previously logged in with the "
+"same username to be disconnected."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:621
+msgid "MAC filtering"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:624
+msgid "Disable MAC filtering"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:625
+msgid ""
+"If this option is set, no attempts will be made to ensure that the MAC "
+"address of clients stays the same while they're logged in.This is required "
+"when the MAC address of the client cannot be determined (usually because "
+"there are routers between"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:626
+msgid "and the clients)."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:627
+msgid "If this is enabled, RADIUS MAC authentication cannot be used."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:630
+msgid "Pass-through MAC Auto Entry"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:633
+msgid "Enable Pass-through MAC automatic additions"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:634
+msgid ""
+"If this option is set, a MAC passthrough entry is automatically added after "
+"the user has successfully authenticated. Users of that MAC address will "
+"never have to authenticate again."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:635
+#: usr/local/www/services_captiveportal.php:641
+msgid ""
+"To remove the passthrough MAC entry you either have to log in and remove it "
+"manually from the"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:635
+#: usr/local/www/services_captiveportal.php:641
+msgid "MAC tab"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:635
+#: usr/local/www/services_captiveportal.php:641
+msgid "or send a POST from another system to remove it."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:636
+msgid ""
+"If this is enabled, RADIUS MAC authentication cannot be used. Also, the "
+"logout window will not be shown."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:639
+msgid "Enable Pass-through MAC automatic addition with username"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:640
+msgid ""
+"If this option is set, with the automatically MAC passthrough entry created "
+"the username, used during authentication, will be saved."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:645
+msgid "Per-user bandwidth restriction"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:648
+msgid "Enable per-user bandwidth restriction"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:651
+msgid "Default download"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:655
+msgid "Default upload"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:659
+msgid ""
+"If this option is set, the captive portal will restrict each user who logs "
+"in to the specified default bandwidth. RADIUS can override the default "
+"settings. Leave empty or set to 0 for no limit."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:667
+msgid "No Authentication"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:671
+msgid "Local"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:680
+msgid "Allow only users/groups with 'Captive portal login' privilege set"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:683
+msgid "RADIUS Authentication"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:689
+msgid "RADIUS Protocol"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:694 usr/local/www/vpn_l2tp.php:392
+msgid "PAP"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:698
+msgid "CHAP_MD5"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:702
+msgid "MSCHAPv1"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:706
+msgid "MSCHAPv2"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:723
+#: usr/local/www/services_captiveportal.php:766
+msgid "Primary RADIUS server"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:728
+msgid ""
+"Enter the IP address of the RADIUS server which users of the captive portal "
+"have to authenticate against."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:733
+msgid "Leave this field blank to use the default port (1812)."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:736
+#: usr/local/www/services_captiveportal.php:756
+#: usr/local/www/services_captiveportal.php:778
+#: usr/local/www/services_captiveportal.php:797
+msgid "Shared secret"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:738
+msgid ""
+"Leave this field blank to not use a RADIUS shared secret (not recommended)."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:744
+#: usr/local/www/services_captiveportal.php:785 usr/local/www/vpn_pptp.php:450
+msgid "Secondary RADIUS server"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:749
+msgid ""
+"If you have a second RADIUS server, you can activate it by entering its IP "
+"address here."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:771
+msgid ""
+"If you have a third RADIUS server, you can activate it by entering its IP "
+"address here."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:790
+msgid ""
+"If you have a fourth RADIUS server, you can activate it by entering its IP "
+"address here."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:804
+msgid "Accounting"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:809
+msgid "send RADIUS accounting packets"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:810
+msgid ""
+"If this is enabled, RADIUS accounting packets will be sent to the primary "
+"RADIUS server."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:813
+msgid "Accounting port"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:815
+msgid "Leave blank to use the default port (1813)."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:821
+msgid "Accounting updates"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:823
+msgid "no accounting updates"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:824
+msgid "stop/start accounting"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:825
+msgid "interim update"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:832
+msgid "RADIUS options"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:835
+msgid "Reauthentication"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:837
+msgid "Reauthenticate connected users every minute"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:838
+msgid ""
+"If reauthentication is enabled, Access-Requests will be sent to the RADIUS "
+"server for each user that is logged in every minute. If an Access-Reject is "
+"received for a user, that user is disconnected from the captive portal "
+"immediately."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:842
+msgid "RADIUS MAC authentication"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:844
+msgid "Enable RADIUS MAC authentication"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:845
+msgid ""
+"If this option is enabled, the captive portal will try to authenticate users "
+"by sending their MAC address as the username and the password entered below "
+"to the RADIUS server."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:849
+msgid "MAC authentication secret"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:853
+msgid "RADIUS NAS IP attribute"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:883
+msgid "Choose the IP to use for calling station attribute."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:888
+msgid "Session-Timeout"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:889
+msgid "Use RADIUS Session-Timeout attributes"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:890
+msgid ""
+"When this is enabled, clients will be disconnected after the amount of time "
+"retrieved from the RADIUS Session-Timeout attribute."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:906
+#, php-format
+msgid ""
+"If RADIUS type is set to Cisco, in Access-Requests the value of Calling-"
+"Station-Id will be set to the client's IP address and the Called-Station-Id "
+"to the client's MAC address. Default behavior is Calling-Station-Id = "
+"client's MAC address and Called-Station-Id = %s's WAN IP address."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:912
+msgid "Accounting Style"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:913
+msgid "Invert Acct-Input-Octets and Acct-Output-Octets"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:914
+msgid ""
+"When this is enabled, data counts for RADIUS accounting packets will be "
+"taken from the client perspective, not the NAS. Acct-Input-Octets will "
+"represent download, and Acct-Output-Octets will represent upload."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:918
+msgid "NAS Identifier"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:920
+msgid "Specify a NAS identifier to override the default value"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:923
+msgid "MAC address format"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:938
+msgid ""
+"This option changes the MAC address format used in the whole RADIUS system. "
+"Change this if you also"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:939
+msgid "need to change the username format for RADIUS MAC authentication."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:940
+msgid "default:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:941
+msgid "singledash:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:942
+msgid "ietf:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:943
+msgid "cisco:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:944
+msgid "unformatted:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:951
+msgid "HTTPS login"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:954
+msgid "Enable HTTPS login"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:955
+msgid ""
+"If enabled, the username and password will be transmitted over an HTTPS "
+"connection to protect against eavesdroppers. A server name and certificate "
+"must also be specified below."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:958
+msgid "HTTPS server name"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:961
+#, php-format
+msgid ""
+"This name will be used in the form action for the HTTPS POST and should "
+"match the Common Name (CN) in your certificate (otherwise, the client "
+"browser will most likely display a security warning). Make sure captive "
+"portal clients can resolve this name in DNS and verify on the client that "
+"the IP resolves to the correct interface IP on %s."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:964
+#: usr/local/www/system_advanced_admin.php:357
+msgid "SSL Certificate"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:978
+msgid "No Certificates defined."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:983
+#: usr/local/www/services_captiveportal.php:986
+msgid "Disable HTTPS forwards"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:987
+msgid ""
+"If this option is set, attempts to connect to SSL/HTTPS (Port 443) sites "
+"will not be forwarded to the captive portal. This prevents certificate "
+"errors from being presented to the user even if HTTPS logins are enabled. "
+"Users must attempt a connecton to an HTTP (Port 80) site to get forwarded to "
+"the captive portal. If HTTPS logins are enabled, the user will be redirected "
+"to the HTTPS login page."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:990
+msgid "Portal page contents"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1005
+#: usr/local/www/services_captiveportal.php:1045
+#: usr/local/www/services_captiveportal.php:1065
+msgid "View current page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1007
+#: usr/local/www/services_captiveportal.php:1047
+#: usr/local/www/services_captiveportal.php:1067
+msgid "Download current page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1010
+msgid "Restore default portal page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1017
+#, php-format
+msgid ""
+"Upload an HTML/PHP file for the portal page here (leave blank to keep the "
+"current one). Make sure to include a form (POST to %1$s) with a submit "
+"button (%2$s) and a hidden field with %3$s and %4$s. Include the %5$s and "
+"%6$s and/or %7$s input fields if authentication is enabled, otherwise it "
+"will always fail."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1028
+msgid "Example code for the form:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1040
+msgid "error page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1041
+#: usr/local/www/services_captiveportal.php:1061
+msgid "contents"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1050
+msgid "Restore default error page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1055
+msgid ""
+"The contents of the HTML/PHP file that you upload here are displayed when an "
+"authentication error occurs. You may include"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1056
+msgid ""
+"which will be replaced by the error or reply messages from the RADIUS "
+"server, if any."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1070
+msgid "Restore default logout page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1075
+msgid ""
+"The contents of the HTML/PHP file that you upload here are displayed on "
+"authentication success when the logout popup is enabled."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1088
+msgid ""
+"Changing any settings on this page will disconnect all clients! Don't forget "
+"to enable the DHCP server on your captive portal interface! Make sure that "
+"the default/maximum DHCP lease time is higher than the timeout entered on "
+"this page. Also, the DNS Forwarder or Resolver needs to be enabled for DNS lookups by "
+"unauthenticated clients to work."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:99
+#, php-format
+msgid "A file with the name '%s' already exists."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:106
+msgid "The total size of all files uploaded may not exceed "
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:166
+#: usr/local/www/services_captiveportal_filemanager.php:205
+msgid "add file"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:177
+msgid "Do you really want to delete this file?"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:177
+msgid "delete file"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:184
+msgid "TOTAL"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:195
+msgid "cancel"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:215
+msgid ""
+"Any files that you upload here with the filename prefix of captiveportal- "
+"will be made available in the root directory of the captive portal HTTP(S) "
+"server. You may reference them directly from your portal page HTML code "
+"using relative paths. Example: you've uploaded an image with the name "
+"'captiveportal-test.jpg' using the file manager. Then you can include it in "
+"your portal page like this:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:222
+msgid ""
+"In addition, you can also upload .php files for execution. You can pass the "
+"filename to your custom page from the initial page by using text similar to:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:225
+msgid "Acceptable usage policy"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_filemanager.php:227
+#, php-format
+msgid "The total size limit for all files is %s."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname.php:115
+msgid "Allowed IP Addresses"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname.php:132
+#: usr/local/www/services_captiveportal_hostname.php:168
+#: usr/local/www/services_captiveportal_ip.php:125
+#: usr/local/www/services_captiveportal_ip.php:165
+msgid "add address"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname.php:158
+#: usr/local/www/services_captiveportal_ip.php:155
+msgid "edit address"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname.php:159
+#: usr/local/www/services_captiveportal_ip.php:156
+msgid "Do you really want to delete this address?"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname.php:159
+#: usr/local/www/services_captiveportal_ip.php:156
+msgid "delete address"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname.php:177
+msgid ""
+"Adding allowed Hostnames will allow a DNS hostname access to/from access "
+"through the captive portal without being taken to the portal page. This can "
+"be used for a web server serving images for the portal page or a DNS server "
+"on another network, for example. By specifying <em>from</em> addresses, it "
+"may be used to always allow pass-through access from a client behind the "
+"captive portal."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname.php:181
+#: usr/local/www/services_captiveportal_hostname.php:188
+msgid "All connections"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname.php:181
+#: usr/local/www/services_captiveportal_hostname.php:188
+msgid "the Hostname are allowed"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname.php:188
+msgid "from"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:60
+msgid "Edit allowed Hostname"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:102
+msgid "Allowed Hostname"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:107
+#, php-format
+msgid "A valid Hostname must be specified. [%s]"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:110
+#: usr/local/www/services_captiveportal_ip_edit.php:112
+#: usr/local/www/services_captiveportal_mac_edit.php:122
+msgid "Upload speed needs to be an integer"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:112
+#: usr/local/www/services_captiveportal_ip_edit.php:115
+#: usr/local/www/services_captiveportal_mac_edit.php:124
+msgid "Download speed needs to be an integer"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:119
+#: usr/local/www/services_captiveportal_ip_edit.php:122
+msgid "already allowed"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:167
+#: usr/local/www/services_captiveportal_hostname_edit.php:175
+#: usr/local/www/system_gateways_edit.php:771
+#: usr/local/www/system_gateways_edit.php:783
+msgid "From"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:167
+#: usr/local/www/services_captiveportal_hostname_edit.php:176
+#: usr/local/www/system_gateways_edit.php:774
+#: usr/local/www/system_gateways_edit.php:786
+msgid "To"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:175
+#: usr/local/www/services_captiveportal_hostname_edit.php:176
+msgid "Use"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:175
+msgid ""
+"to always allow an Hostname through the captive portal (without "
+"authentication)"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:176
+msgid ""
+"to allow access from all clients (even non-authenticated ones) behind the "
+"portal to this Hostname"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:192
+#: usr/local/www/services_captiveportal_ip_edit.php:210
+#: usr/local/www/services_captiveportal_mac_edit.php:226
+msgid "Bandwidth up"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:195
+msgid "Enter a upload limit to be enforced on this Hostname in Kbit/s"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:198
+#: usr/local/www/services_captiveportal_ip_edit.php:217
+#: usr/local/www/services_captiveportal_mac_edit.php:234
+msgid "Bandwidth down"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:201
+msgid "Enter a download limit to be enforced on this Hostname in Kbit/s"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip.php:174
+msgid ""
+"Adding allowed IP addresses will allow IP access to/from these addresses "
+"through the captive portal without being taken to the portal page. This can "
+"be used for a web server serving images for the portal page or a DNS server "
+"on another network, for example."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip_edit.php:61
+msgid "Edit allowed IP address"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip_edit.php:101
+msgid "Allowed IP address"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip_edit.php:101
+#: usr/local/www/services_dhcp.php:810 usr/local/www/services_dhcpv6.php:561
+msgid "Subnet mask"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip_edit.php:109
+msgid "A valid subnet mask must be specified"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip_edit.php:187
+msgid "Edit allowed ip rule"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip_edit.php:199
+msgid "IP address and subnet mask. Use /32 for a single IP"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip_edit.php:213
+msgid "Enter a upload limit to be enforced on this IP address in Kbit/s"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip_edit.php:220
+msgid "Enter a download limit to be enforced on this IP address in Kbit/s"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:82
+msgid "No entry exists yet!"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:86
+msgid "Please set the zone on which the operation should be allowed"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:98
+msgid "No entry exists for this username:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:117
+msgid "The entry was sucessfully deleted"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:119
+msgid "No entry exists for this mac address:"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:150
+msgid ""
+"The captive portal MAC address configuration has been changed.<br />You must "
+"apply the changes in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:191
+msgid "edit host"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:194
+#: usr/local/www/services_dnsmasq.php:398
+#: usr/local/www/services_unbound.php:466
+msgid "Do you really want to delete this host?"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:195
+msgid "delete host"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:208
+msgid "add host"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:216
+msgid ""
+"Adding MAC addresses as 'pass' MACs allows them access through the captive "
+"portal automatically without being taken to the portal page."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:61
+#: usr/local/www/services_captiveportal_mac_edit.php:183
+msgid "Edit MAC address rules"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:113
+#, php-format
+msgid ""
+"The MAC address %s belongs to a local interface, you cannot use it here."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:118
+msgid "A valid MAC address must be specified"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:131
+#: usr/local/www/services_captiveportal_zones_edit.php:70
+msgid "already exists"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:201
+msgid "Choose what to do with packets coming from this MAC address"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:213
+#: usr/local/www/services_dhcp_edit.php:382
+msgid "Copy my MAC address"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:215
+msgid "MAC address (6 hex octets separated by colons)"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:230
+msgid "Enter a upload limit to be enforced on this MAC address in Kbit/s"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:238
+msgid "Enter a download limit to be enforced on this MAC address in Kbit/s"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:67
+msgid ""
+"You will need to recreate any existing Voucher Rolls due to the public and "
+"private key changes. Click cancel if you do not wish to recreate the "
+"vouchers."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:133
+msgid "Voucher invalid"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:135
+msgid "Voucher expired"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:158
+msgid "Cannot write private key file"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:178
+msgid "Need private RSA key to print vouchers"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "charset"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "rollbits"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "ticketbits"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "checksumbits"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "publickey"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "magic"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:216
+#: usr/local/www/services_captiveportal_vouchers.php:603
+msgid "Synchronize Voucher Database IP"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:216
+msgid "Sync port"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:216
+msgid "Sync password"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:216
+msgid "Sync username"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:225
+msgid "Need at least 2 characters to create vouchers."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:227
+msgid "Double quotes aren't allowed."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:229
+msgid "aren't allowed."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:231
+msgid "# of Bits to store Roll Id needs to be between 1..31."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:233
+msgid "# of Bits to store Ticket Id needs to be between 1..16."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:235
+msgid "# of Bits to store checksum needs to be between 1..31."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:237
+msgid "This doesn't look like an RSA Public key."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:239
+msgid "This doesn't look like an RSA Private key."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:241
+msgid "You cannot sync the voucher database to this host (itself)."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:459
+msgid "Enable Vouchers"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:464
+#: usr/local/www/status_captiveportal.php:117
+#: usr/local/www/status_captiveportal_expire.php:74
+#: usr/local/www/status_captiveportal_test.php:74
+#: usr/local/www/status_captiveportal_voucher_rolls.php:58
+#: usr/local/www/status_captiveportal_voucher_rolls.php:79
+#: usr/local/www/status_captiveportal_vouchers.php:112
+msgid "Voucher Rolls"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:473
+#: usr/local/www/services_captiveportal_vouchers_edit.php:174
+#: usr/local/www/status_captiveportal_vouchers.php:124
+msgid "Roll"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:474
+#: usr/local/www/status_captiveportal_voucher_rolls.php:91
+msgid "Minutes/Ticket"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:475
+msgid "of Tickets"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:476
+#: usr/local/www/services_captiveportal_vouchers_edit.php:198
+#: usr/local/www/status_captiveportal_voucher_rolls.php:93
+msgid "Comment"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:496
+msgid "edit voucher"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:497
+msgid ""
+"Do you really want to delete this voucher? This makes all vouchers from this "
+"roll invalid"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:497
+msgid "delete vouchers"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:498
+msgid "generate vouchers for this roll to CSV file"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:508
+msgid "add voucher"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:513
+msgid ""
+"Create, generate and activate Rolls with Vouchers that allow access through "
+"the captive portal for the configured time. Once a voucher is activated, its "
+"clock is started and runs uninterrupted until it expires. During that time, "
+"the voucher can be re-used from the same or a different computer. If the "
+"voucher is used again from another computer, the previous session is stopped."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:519
+msgid ""
+"Enable Voucher support first using the checkbox above and hit Save at the "
+"bottom."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:525
+msgid "Voucher public key"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:530
+msgid ""
+"Paste an RSA public key (64 Bit or smaller) in PEM format here. This key is "
+"used to decrypt vouchers."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:530
+#: usr/local/www/services_captiveportal_vouchers.php:537
+msgid "Generate"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:530
+#: usr/local/www/services_captiveportal_vouchers.php:537
+msgid "new key"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:533
+msgid "Voucher private key"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:537
+msgid ""
+"Paste an RSA private key (64 Bit or smaller) in PEM format here. This key is "
+"only used to generate encrypted vouchers and doesn't need to be available if "
+"the vouchers have been generated offline."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:540
+msgid "Character set"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:544
+msgid ""
+"Tickets are generated with the specified character set. It should contain "
+"printable characters (numbers, lower case and upper case letters) that are "
+"hard to confuse with others. Avoid e.g. 0/O and l/1."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:548
+msgid "of Roll Bits"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:552
+msgid ""
+"Reserves a range in each voucher to store the Roll # it belongs to. Allowed "
+"range: 1..31. Sum of Roll+Ticket+Checksum bits must be one Bit less than the "
+"RSA key size."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:556
+msgid "of Ticket Bits"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:560
+msgid ""
+"Reserves a range in each voucher to store the Ticket# it belongs to. Allowed "
+"range: 1..16. Using 16 bits allows a roll to have up to 65535 vouchers. A "
+"bit array, stored in RAM and in the config, is used to mark if a voucher has "
+"been used. A bit array for 65535 vouchers requires 8 KB of storage."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:564
+msgid "of Checksum Bits"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:568
+msgid ""
+"Reserves a range in each voucher to store a simple checksum over Roll # and "
+"Ticket#. Allowed range is 0..31."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:572
+msgid "Magic Number"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:576
+msgid ""
+"Magic number stored in every voucher. Verified during voucher check. Size "
+"depends on how many bits are left by Roll+Ticket+Checksum bits. If all bits "
+"are used, no magic number will be used and checked."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:580
+msgid "Invalid Voucher Message"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:583
+msgid ""
+"Error message displayed for invalid vouchers on captive portal error page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:587
+msgid "Expired Voucher Message"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:590
+msgid ""
+"Error message displayed for expired vouchers on captive portal error page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:600
+msgid "Voucher database synchronization"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:606
+msgid ""
+"IP address of master nodes webConfigurator to synchronize voucher database "
+"and used vouchers from."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:607
+msgid "NOTE: this should be setup on the slave nodes and not the primary node!"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:611
+msgid "Voucher sync port"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:614
+msgid ""
+"This is the port of the master voucher nodes webConfigurator. Example: 443"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:618
+msgid "Voucher sync username"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:621
+msgid "This is the username of the master voucher nodes webConfigurator."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:625
+msgid "Voucher sync password"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:628
+msgid "This is the password of the master voucher nodes webConfigurator."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:643
+msgid ""
+"Changing any Voucher parameter (apart from managing the list of Rolls) on "
+"this page will render existing vouchers useless if they were generated with "
+"different settings."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:645
+msgid ""
+"Specifying the Voucher Database Synchronization options will not record any "
+"other value from the other options. They will be retrieved/synced from the "
+"master."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:46
+msgid "Edit Voucher Rolls"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/services_dhcp.php:1156 usr/local/www/services_dhcpv6.php:789
+msgid "Number"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:101
+#, php-format
+msgid "Roll number %s already exists."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:107
+#, php-format
+msgid "Roll number must be numeric and less than %s"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:110
+#, php-format
+msgid "A roll has at least one voucher and less than %s."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:113
+msgid "Each voucher must be good for at least 1 minute."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:134
+#, php-format
+msgid "All %1$s vouchers from Roll %2$s marked unused"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:178
+msgid "Enter the Roll"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:178
+msgid "found on top of the generated/printed vouchers"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:182
+msgid "Minutes per Ticket"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:186
+msgid ""
+"Defines the time in minutes that a user is allowed access. The clock starts "
+"ticking the first time a voucher is used for authentication"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:194
+msgid "Enter the number of vouchers"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:194
+msgid ""
+"found on top of the generated/printed vouchers. WARNING: Changing this "
+"number for an existing Roll will mark all vouchers as unused again"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:202
+msgid "Can be used to further identify this roll. Ignored by the system"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones.php:64
+msgid "Zones"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones.php:75
+msgid "The CaptivePortal entry list has been changed"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones.php:80
+#: usr/local/www/services_rfc2136_edit.php:174
+msgid "Zone"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones.php:82
+#: usr/local/www/vpn_pppoe.php:106
+msgid "Number of users"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones.php:88
+#: usr/local/www/services_captiveportal_zones.php:129
+msgid "add a new captiveportal instance"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones.php:116
+msgid "edit captiveportal instance"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones.php:117
+msgid "delete captiveportal instance"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones_edit.php:46
+msgid "Edit Zones"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones_edit.php:65
+msgid "The zone name can only contain letters, digits, and underscores (_)."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones_edit.php:95
+msgid "Edit Captive Portal Zones"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones_edit.php:102
+msgid "Zone name. Can only contain letters, digits, and underscores (_)."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:249 usr/local/www/services_dhcpv6.php:170
+msgid "Range begin"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:249 usr/local/www/services_dhcpv6.php:170
+msgid "Range end"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:254 usr/local/www/services_dhcp.php:256
+#: usr/local/www/services_dhcpv6.php:175 usr/local/www/services_dhcpv6.php:179
+#: usr/local/www/services_dhcpv6.php:181
+msgid "A valid range must be specified."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:258
+#: usr/local/www/services_dhcp_edit.php:225
+msgid "A valid IP address must be specified for the gateway."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:260
+#: usr/local/www/services_dhcp_edit.php:227
+msgid ""
+"A valid IP address must be specified for the primary/secondary WINS servers."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:265
+#: usr/local/www/services_dhcp_edit.php:233
+#, php-format
+msgid ""
+"The gateway address %s does not lie within the chosen interface's subnet."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:268
+#: usr/local/www/services_dhcp_edit.php:236
+msgid "A valid IP address must be specified for each of the DNS servers."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:271
+#: usr/local/www/services_dhcp_edit.php:239
+#: usr/local/www/services_dhcpv6.php:188
+msgid "The default lease time must be at least 60 seconds."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:288
+#, php-format
+msgid ""
+"The Captive Portal zone '%s' has Hard Timeout parameter set to a value "
+"bigger than Default lease time (%s)."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:293
+#: usr/local/www/services_dhcp_edit.php:241
+#: usr/local/www/services_dhcpv6.php:190
+msgid ""
+"The maximum lease time must be at least 60 seconds and higher than the "
+"default lease time."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:295
+#: usr/local/www/services_dhcp_edit.php:243
+#: usr/local/www/services_dhcpv6.php:192
+msgid "A valid domain name must be specified for the dynamic DNS registration."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:297
+#: usr/local/www/services_dhcp_edit.php:245
+msgid ""
+"A valid primary domain name server IP address must be specified for the "
+"dynamic domain name."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:300
+#: usr/local/www/services_dhcp_edit.php:248
+#: usr/local/www/services_dhcpv6.php:197
+msgid "You must specify both a valid domain key and key name."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:305
+#: usr/local/www/services_dhcp_edit.php:253
+#: usr/local/www/services_dhcpv6.php:202
+#: usr/local/www/services_router_advertisements.php:155
+msgid "A valid domain search list must be specified."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:313
+msgid ""
+"If you specify a mac allow list, it must contain only valid partial MAC "
+"addresses."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:315
+msgid ""
+"If you specify a mac deny list, it must contain only valid partial MAC "
+"addresses."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:318
+#: usr/local/www/services_dhcp_edit.php:260
+msgid ""
+"A valid IP address must be specified for the primary/secondary NTP servers."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:320 usr/local/www/services_dhcpv6.php:211
+msgid "A valid domain name must be specified for the DNS domain."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:322
+#: usr/local/www/services_dhcp_edit.php:262
+msgid "A valid IP address or hostname must be specified for the TFTP server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:324
+#: usr/local/www/services_dhcp_edit.php:264
+msgid "A valid IP address must be specified for the network boot server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:327
+msgid "You cannot use the network address in the starting subnet range."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:329
+msgid "You cannot use the broadcast address in the ending subnet range."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:336
+#, php-format
+msgid "The subnet range cannot overlap with virtual IP address %s."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:351
+msgid "Text type cannot include quotation marks."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:353
+msgid ""
+"String type must be enclosed in quotes like \"this\" or must be a series of "
+"octets specified in hexadecimal, separated by colons, like 01:23:45:67:89:ab:"
+"cd:ef"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:355
+msgid "Boolean type must be true, false, on, or off."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:357
+msgid "Unsigned 8-bit integer type must be a number in the range 0 to 255."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:359
+msgid "Unsigned 16-bit integer type must be a number in the range 0 to 65535."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:361
+msgid ""
+"Unsigned 32-bit integer type must be a number in the range 0 to 4294967295."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:363
+msgid "Signed 8-bit integer type must be a number in the range -128 to 127."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:365
+msgid ""
+"Signed 16-bit integer type must be a number in the range -32768 to 32767."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:367
+msgid ""
+"Signed 32-bit integer type must be a number in the range -2147483648 to "
+"2147483647."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:369
+msgid "IP address or host type must be an IP address or host name."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:380 usr/local/www/services_dhcpv6.php:239
+msgid "The specified range lies outside of the current subnet."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:384 usr/local/www/services_dhcpv6.php:244
+msgid "The range is invalid (first element higher than second element)."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:391
+msgid ""
+"The specified range must not be within the DHCP range for this interface."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:400
+msgid ""
+"The specified range must not be within the range configured on a DHCP pool "
+"for this interface."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:407 usr/local/www/services_dhcpv6.php:248
+#, php-format
+msgid ""
+"You must disable the DHCP relay on the %s interface before enabling the DHCP "
+"server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:417 usr/local/www/services_dhcpv6.php:263
+#, php-format
+msgid "The DHCP range cannot overlap any static DHCP mappings."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:597
+msgid "DHCP server"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:611
+msgid "Text"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:611
+msgid "String"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:611
+msgid "Boolean"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:612
+msgid "Unsigned 8-bit integer"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:612
+msgid "Unsigned 16-bit integer"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:612
+msgid "Unsigned 32-bit integer"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:613
+msgid "Signed 8-bit integer"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:613
+msgid "Signed 16-bit integer"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:613
+msgid "Signed 32-bit integer"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:613
+msgid "IP address or host"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:730 usr/local/www/services_dhcpv6.php:474
+msgid ""
+"DHCP Relay is currently enabled. Cannot enable the DHCP Server service while "
+"the DHCP Relay is enabled on any interface."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:738 usr/local/www/services_dhcpv6.php:482
+msgid "The static mapping configuration has been changed"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:760
+msgid ""
+"The DHCP Server can only be enabled on interfaces configured with a static "
+"IPv4 address. This system has none."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:779
+#, php-format
+msgid "Enable DHCP server on %s interface"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:785
+msgid ""
+"Editing Pool-Specific Options. To return to the Interface, click its tab "
+"above."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:792
+msgid "Deny unknown clients"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:793
+msgid ""
+"If this is checked, only the clients defined below will get DHCP leases from "
+"this server. "
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:797
+msgid "Pool Description"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:816 usr/local/www/services_dhcpv6.php:567
+msgid "Available range"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:844 usr/local/www/services_dhcpv6.php:586
+#: usr/local/www/vpn_l2tp.php:346
+msgid "Subnet Mask"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:861 usr/local/www/services_dhcpv6.php:603
+msgid "Range"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:869
+msgid "Additional Pools"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:871
+msgid ""
+"If you need additional pools of addresses inside of this subnet outside the "
+"above Range, they may be specified here."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:874
+msgid "Pool Start"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:875
+msgid "Pool End"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:903
+msgid "Do you really want to delete this pool?"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:927
+#: usr/local/www/services_dhcp_edit.php:438
+msgid "WINS servers"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:934
+#: usr/local/www/services_dhcp_edit.php:445
+#: usr/local/www/services_dhcpv6.php:628
+#: usr/local/www/services_router_advertisements.php:377
+#: usr/local/www/system.php:334 usr/local/www/vpn_pppoe_edit.php:463
+msgid "DNS servers"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:940
+#: usr/local/www/services_dhcp_edit.php:451
+#: usr/local/www/services_dhcpv6.php:634
+#: usr/local/www/services_router_advertisements.php:383
+msgid ""
+"NOTE: leave blank to use the system default DNS servers - this interface's "
+"IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the "
+"General page."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:947
+msgid ""
+"The default is to use the IP on this interface of the firewall as the "
+"gateway. Specify an alternate gateway here if this is not the correct "
+"gateway for your network. Type \"none\" for no gateway assignment."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:951
+#: usr/local/www/services_dhcp_edit.php:462
+#: usr/local/www/services_dhcpv6.php:638
+msgid "Domain name"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:954
+#: usr/local/www/services_dhcp_edit.php:465
+#: usr/local/www/services_dhcpv6.php:641
+msgid ""
+"The default is to use the domain name of this system as the default domain "
+"name provided by DHCP. You may specify an alternate domain name here."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:958
+#: usr/local/www/services_dhcp_edit.php:469
+#: usr/local/www/services_dhcpv6.php:645
+#: usr/local/www/services_router_advertisements.php:388
+msgid "Domain search list"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:961
+#: usr/local/www/services_dhcp_edit.php:472
+msgid ""
+"The DHCP server can optionally provide a domain search list. Use the "
+"semicolon character as separator "
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:965
+#: usr/local/www/services_dhcp_edit.php:476
+#: usr/local/www/services_dhcpv6.php:652
+msgid "Default lease time"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:969
+#: usr/local/www/services_dhcp_edit.php:480
+#: usr/local/www/services_dhcpv6.php:656
+msgid ""
+"This is used for clients that do not ask for a specific expiration time."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:971
+#: usr/local/www/services_dhcp_edit.php:482
+#: usr/local/www/services_dhcpv6.php:658
+msgid "The default is 7200 seconds."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:975
+#: usr/local/www/services_dhcp_edit.php:486
+#: usr/local/www/services_dhcpv6.php:662
+msgid "Maximum lease time"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:979
+#: usr/local/www/services_dhcp_edit.php:490
+#: usr/local/www/services_dhcpv6.php:666
+msgid ""
+"This is the maximum lease time for clients that ask for a specific "
+"expiration time."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:981
+#: usr/local/www/services_dhcp_edit.php:492
+#: usr/local/www/services_dhcpv6.php:668
+msgid "The default is 86400 seconds."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:986
+msgid "Failover peer IP:"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:989
+msgid ""
+"Leave blank to disable. Enter the interface IP address of the other "
+"machine. Machines must be using CARP. Interface's advskew determines "
+"whether the DHCPd process is Primary or Secondary. Ensure one machine's "
+"advskew<20 (and the other is >20)."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:995 usr/local/www/services_dhcp.php:1246
+msgid "Static ARP"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1002
+msgid "Enable Static ARP entries"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1007
+msgid ""
+"This option persists even if DHCP server is disabled. Only the machines "
+"listed below will be able to communicate with the firewall on this NIC."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1016 usr/local/www/services_dhcpv6.php:672
+msgid "Time format change"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1025
+msgid "Change DHCP display lease time from UTC to local time."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1032
+msgid ""
+"By default DHCP leases are displayed in UTC time. By checking this\n"
+"\t\t\t\t\t\tbox DHCP lease time will be displayed in local time and set to "
+"time zone selected. This will be used for all DHCP interfaces lease time."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1044
+#: usr/local/www/services_dhcp_edit.php:499
+#: usr/local/www/services_dhcpv6.php:700
+msgid "Show Dynamic DNS"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1048
+#: usr/local/www/services_dhcp_edit.php:503
+#: usr/local/www/services_dhcpv6.php:704
+msgid "Enable registration of DHCP client names in DNS."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1051
+#: usr/local/www/services_dhcp_edit.php:506
+#: usr/local/www/services_dhcpv6.php:707
+msgid "Note: Leave blank to disable dynamic DNS registration."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1052
+#: usr/local/www/services_dhcp_edit.php:507
+#: usr/local/www/services_dhcpv6.php:708
+msgid ""
+"Enter the dynamic DNS domain which will be used to register client names in "
+"the DNS server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1054
+#: usr/local/www/services_dhcp_edit.php:509
+#: usr/local/www/services_dhcpv6.php:710
+msgid ""
+"Enter the primary domain name server IP address for the dynamic domain name."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1056
+#: usr/local/www/services_dhcp_edit.php:511
+#: usr/local/www/services_dhcpv6.php:712
+msgid ""
+"Enter the dynamic DNS domain key name which will be used to register client "
+"names in the DNS server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1058
+#: usr/local/www/services_dhcp_edit.php:513
+#: usr/local/www/services_dhcpv6.php:714
+msgid ""
+"Enter the dynamic DNS domain key secret which will be used to register "
+"client names in the DNS server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1063
+msgid "MAC Address Control"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1066
+msgid "Show MAC Address Control"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1070
+msgid ""
+"Enter a list of partial MAC addresses to allow, comma separated, no spaces, "
+"such as "
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1072
+msgid ""
+"Enter a list of partial MAC addresses to deny access, comma separated, no "
+"spaces, such as "
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1077
+#: usr/local/www/services_dhcp_edit.php:519
+#: usr/local/www/services_dhcpv6.php:720
+msgid "NTP servers"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1080
+#: usr/local/www/services_dhcp_edit.php:522
+#: usr/local/www/services_dhcpv6.php:723
+msgid "Show NTP configuration"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1089
+#: usr/local/www/services_dhcp_edit.php:531
+#: usr/local/www/services_dhcpv6.php:733
+msgid "TFTP server"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1092
+#: usr/local/www/services_dhcp_edit.php:534
+#: usr/local/www/services_dhcpv6.php:736
+msgid "Show TFTP configuration"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1096
+#: usr/local/www/services_dhcp_edit.php:538
+#: usr/local/www/services_dhcpv6.php:740
+msgid ""
+"Leave blank to disable. Enter a full hostname or IP for the TFTP server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1101 usr/local/www/services_dhcpv6.php:746
+msgid "LDAP URI"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1104 usr/local/www/services_dhcpv6.php:749
+msgid "Show LDAP configuration"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1108 usr/local/www/services_dhcpv6.php:753
+msgid ""
+"Leave blank to disable. Enter a full URI for the LDAP server in the form "
+"ldap://ldap.example.com/dc=example,dc=com"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1113 usr/local/www/services_dhcpv6.php:758
+msgid "Enable network booting"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1116 usr/local/www/services_dhcpv6.php:761
+msgid "Show Network booting"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1120 usr/local/www/services_dhcpv6.php:765
+msgid "Enables network booting."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1122
+msgid "Enter the IP of the"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1122
+msgid "next-server"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1124
+msgid "and the default bios filename"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1126
+msgid "and the UEFI 32bit filename "
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1128
+msgid "and the UEFI 64bit filename "
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1130
+msgid ""
+"Note: You need both a filename and a boot server configured for this to work!"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1131
+msgid ""
+"You will need all three filenames and a boot server configured for UEFI to "
+"work!"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1132
+#: usr/local/www/services_dhcp_edit.php:420
+#: usr/local/www/services_dhcpv6_edit.php:236
+msgid "Enter the"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1132
+#: usr/local/www/services_dhcp_edit.php:420
+#: usr/local/www/services_dhcpv6_edit.php:236
+msgid "root-path"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1132
+#: usr/local/www/services_dhcp_edit.php:420
+#: usr/local/www/services_dhcpv6_edit.php:236
+msgid "string"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1134
+msgid ""
+"Note: string-format: iscsi:(servername):(protocol):(port):(LUN):targetname"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1140 usr/local/www/services_dhcpv6.php:773
+msgid "Additional BOOTP/DHCP Options"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1143 usr/local/www/services_dhcpv6.php:776
+msgid "Show Additional BOOTP/DHCP Options"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1151 usr/local/www/services_dhcpv6.php:784
+msgid ""
+"Enter the DHCP option number and the value for each item you would like to "
+"include in the DHCP lease information. For a list of available options "
+"please visit this"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1151 usr/local/www/services_dhcpv6.php:784
+msgid "URL"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1228 usr/local/www/services_dhcpv6.php:841
+msgid "The DNS servers entered in"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1228 usr/local/www/services_dhcpv6.php:841
+msgid "System: General setup"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1229 usr/local/www/services_dhcpv6.php:842
+msgid "(or the"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1229 usr/local/www/services_dhcpv6.php:842
+#: usr/local/www/services_dnsmasq.php:153
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:122
+#: usr/local/www/services_dnsmasq_edit.php:182
+msgid "DNS forwarder"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1230 usr/local/www/services_dhcpv6.php:843
+msgid "if enabled)"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1230 usr/local/www/services_dhcpv6.php:843
+msgid "will be assigned to clients by the DHCP server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1233 usr/local/www/services_dhcpv6.php:846
+msgid "The DHCP lease table can be viewed on the"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1233
+msgid "Status: DHCP leases"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1234 usr/local/www/services_dhcpv6.php:847
+msgid "page."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1242
+msgid "DHCP Static Mappings for this interface."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:162
+msgid "Either MAC address or Client identifier must be specified"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:170
+#: usr/local/www/services_dhcpv6_edit.php:122
+msgid "The hostname cannot end with a hyphen according to RFC952"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:175
+#: usr/local/www/services_dhcpv6_edit.php:127
+#: usr/local/www/services_dnsmasq_edit.php:94
+#: usr/local/www/services_unbound_host_edit.php:96
+#: usr/local/www/system.php:117
+msgid ""
+"A valid hostname is specified, but the domain name part should be omitted"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:186
+msgid "Static ARP is enabled. You must specify an IP address."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:195
+msgid "This Hostname, IP, MAC address or Client identifier already exists."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:206
+#, php-format
+msgid "The IP address must not be within the DHCP range for this interface."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:211
+msgid ""
+"The IP address must not be within the range configured on a DHCP pool for "
+"this interface."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:220
+#, php-format
+msgid "The IP address must lie in the %s subnet."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:335
+#: usr/local/www/services_dhcpv6_edit.php:185
+msgid "Edit static mapping"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:371
+msgid "Static DHCP Mapping"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:384
+msgid "Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:388
+msgid "Client identifier"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:398
+msgid "If an IPv4 address is entered, the address must be outside of the pool."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:400
+msgid ""
+"If no IPv4 address is given, one will be dynamically allocated from the pool."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:407
+#: usr/local/www/services_dhcpv6_edit.php:223
+msgid "Name of the host, without domain part."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:431
+msgid "ARP Table Static Entry"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:434
+msgid "Create an ARP Table Static Entry for this MAC &amp; IP Address pair. "
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:458
+msgid ""
+"The default is to use the IP on this interface of the firewall as the "
+"gateway. Specify an alternate gateway here if this is not the correct "
+"gateway for your network."
+msgstr ""
+
+#: usr/local/www/services_dhcp_relay.php:73
+#: usr/local/www/services_dhcpv6_relay.php:74
+msgid "Destination Server"
+msgstr ""
+
+#: usr/local/www/services_dhcp_relay.php:81
+msgid "A valid Destination Server IP address must be specified."
+msgstr ""
+
+#: usr/local/www/services_dhcp_relay.php:147
+msgid "DHCP Relay configuration"
+msgstr ""
+
+#: usr/local/www/services_dhcp_relay.php:153
+#, php-format
+msgid "Enable DHCP relay on interface"
+msgstr ""
+
+#: usr/local/www/services_dhcp_relay.php:178
+#: usr/local/www/services_dhcpv6_relay.php:179
+msgid "Append circuit ID and agent ID to requests"
+msgstr ""
+
+#: usr/local/www/services_dhcp_relay.php:179
+#, php-format
+msgid ""
+"If this is checked, the DHCP relay will append the circuit ID (%s interface "
+"number) and the agent ID to the DHCP request."
+msgstr ""
+
+#: usr/local/www/services_dhcp_relay.php:182
+#: usr/local/www/services_dhcpv6_relay.php:183
+msgid "Destination server"
+msgstr ""
+
+#: usr/local/www/services_dhcp_relay.php:186
+msgid ""
+"This is the IP address of the server to which DHCP requests are relayed. You "
+"can enter multiple server IP addresses, separated by commas. Select \"Proxy "
+"requests to DHCP server on WAN subnet\" to relay DHCP packets to the server "
+"that was used on the WAN interface."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:177
+msgid "A valid prefix range must be specified."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:183
+msgid "A valid IPv6 address must be specified for the gateway."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:185
+#: usr/local/www/services_router_advertisements.php:150
+msgid "A valid IPv6 address must be specified for each of the DNS servers."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:194
+msgid ""
+"A valid primary domain name server IPv4 address must be specified for the "
+"dynamic domain name."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:209
+msgid ""
+"A valid IPv6 address must be specified for the primary/secondary NTP servers."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:213
+msgid "A valid IPv6 address or hostname must be specified for the TFTP server."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:215
+msgid "A valid URL must be specified for the network bootfile."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:222
+#, php-format
+msgid "The subnet range cannot overlap with virtual IPv6 address %s."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:375
+msgid "DHCPv6 server"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:520
+msgid ""
+"The DHCPv6 Server can only be enabled on interfaces configured with a static "
+"IPv6 address. This system has none."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:534
+#: usr/local/www/services_router_advertisements.php:263
+#: usr/local/www/services_router_advertisements.php:272
+msgid "Router Advertisements"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:546
+#, php-format
+msgid "Enable DHCPv6 server on %s interface"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:610
+msgid "Prefix Delegation Range"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:614
+msgid "Prefix Delegation Size"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:623
+msgid ""
+"You can define a Prefix range here for DHCP Prefix Delegation. This allows "
+"for \n"
+"\t\t\t\t\tassigning networks to subrouters. The start and end of the range "
+"must end on boundaries of the prefix delegation size."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:648
+msgid ""
+"The DHCP server can optionally provide a domain search list. Use the "
+"semicolon character as separator"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:681
+msgid "Change DHCPv6 display lease time from UTC to local time."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:688
+msgid ""
+"By default DHCPv6 leases are displayed in UTC time. By checking this \n"
+"\t\t\t\t\t\tbox DHCPv6 lease time will be displayed in local time and set to "
+"time zone selected. This will be used for all DHCPv6 interfaces lease time."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:767
+msgid "Enter the Bootfile URL"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:846
+msgid "Status: DHCPv6 leases"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:854
+msgid "DHCPv6 Static Mappings for this interface."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:858
+#: usr/local/www/status_dhcpv6_leases.php:418
+#: usr/local/www/status_dhcpv6_leases.php:504
+msgid "DUID"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_edit.php:115
+#: usr/local/www/services_dhcpv6_edit.php:201
+msgid "DUID Identifier"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_edit.php:135
+msgid "A valid DUID Identifier must be specified."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_edit.php:144
+msgid "This Hostname, IP or DUID Identifier already exists."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_edit.php:185
+msgid "DHCPv6"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_edit.php:198
+msgid "Static DHCPv6 Mapping"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_edit.php:205
+msgid "Enter a DUID Identifier in the following format: "
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_edit.php:214
+msgid "If an IPv6 address is entered, the address must be outside of the pool."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_edit.php:216
+msgid ""
+"If no IPv6 address is given, one will be dynamically allocated from the pool."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_relay.php:82
+msgid "A valid Destination Server IPv6 address must be specified."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_relay.php:148
+msgid "DHCPv6 Relay configuration"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_relay.php:154
+#, php-format
+msgid "Enable DHCPv6 relay on interface"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_relay.php:172
+msgid "Interfaces without an IPv6 address will not be shown."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_relay.php:180
+#, php-format
+msgid ""
+"If this is checked, the DHCPv6 relay will append the circuit ID (%s "
+"interface number) and the agent ID to the DHCPv6 request."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_relay.php:187
+msgid ""
+"This is the IPv6 address of the server to which DHCPv6 requests are relayed. "
+"You can enter multiple server IPv6 addresses, separated by commas. "
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:94
+#: usr/local/www/system_advanced_admin.php:105
+msgid "You must specify a valid port number"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:109
+msgid "Invalid custom options"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:182
+msgid "The DNS forwarder configuration has been changed"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:186
+msgid "General DNS Forwarder Options"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:192
+msgid "Enable DNS forwarder"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:196
+#: usr/local/www/services_unbound.php:337
+msgid "DHCP Registration"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:199
+msgid "Register DHCP leases in DNS forwarder"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:200
+#, php-format
+msgid ""
+"If this option is set, then machines that specify their hostname when "
+"requesting a DHCP lease will be registered in the DNS forwarder, so that "
+"their name can be resolved. You should also set the domain in %sSystem: "
+"General setup%s to the proper value."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:208
+#: usr/local/www/services_unbound.php:349
+msgid "Static DHCP"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:211
+msgid "Register DHCP static mappings in DNS forwarder"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:212
+#, php-format
+msgid ""
+"If this option is set, then DHCP static mappings will be registered in the "
+"DNS forwarder, so that their name can be resolved. You should also set the "
+"domain in %sSystem: General setup%s to the proper value."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:219
+msgid "Prefer DHCP"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:222
+msgid "Resolve DHCP mappings first"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:223
+#, php-format
+msgid ""
+"If this option is set, then DHCP mappings will be resolved before the manual "
+"list of names below. This only affects the name given for a reverse lookup "
+"(PTR)."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:229
+#: usr/local/www/services_unbound.php:330
+msgid "DNS Query Forwarding"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:232
+msgid "Query DNS servers sequentially"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:233
+#, php-format
+msgid ""
+"If this option is set, %s DNS Forwarder (dnsmasq) will query the DNS servers "
+"sequentially in the order specified (<i>System - General Setup - DNS "
+"Servers</i>), rather than all at once in parallel. "
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:242
+msgid "Require domain"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:243
+#, php-format
+msgid ""
+"If this option is set, %s DNS Forwarder (dnsmasq) will not forward A or AAAA "
+"queries for plain names, without dots or domain parts, to upstream name "
+"servers. If the name is not known from /etc/hosts or DHCP then a \"not found"
+"\" answer is returned. "
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:252
+msgid "Do not forward private reverse lookups"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:253
+#, php-format
+msgid ""
+"If this option is set, %s DNS Forwarder (dnsmasq) will not forward reverse "
+"DNS lookups (PTR) for private addresses (RFC 1918) to upstream name "
+"servers. Any entries in the Domain Overrides section forwarding private \"n."
+"n.n.in-addr.arpa\" names to a specific server are still forwarded. If the IP "
+"to name is not known from /etc/hosts, DHCP or a specific domain override "
+"then a \"not found\" answer is immediately returned. "
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:261
+#: usr/local/www/services_unbound.php:262
+msgid "Listen Port"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:265
+#: usr/local/www/services_unbound.php:267
+msgid ""
+"The port used for responding to DNS queries. It should normally be left "
+"blank unless another service needs to bind to TCP/UDP port 53."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:275
+msgid ""
+"Interface IPs used by the DNS Forwarder for responding to queries from "
+"clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries "
+"to other interface IPs not selected below are discarded. The default "
+"behavior is to respond to queries on every available IPv4 and IPv6 address."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:295
+msgid "Strict Interface Binding"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:297
+msgid ""
+"If this option is set, the DNS forwarder will only bind to the interfaces "
+"containing the IP addresses selected above, rather than binding to all "
+"interfaces and discarding queries to other addresses."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:299
+msgid ""
+"NOTE: This option does NOT work with IPv6. If set, dnsmasq will not bind to "
+"IPv6 addresses."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:312
+msgid ""
+"Enter any additional options you would like to add to the dnsmasq "
+"configuration here, separated by a space or newline"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:324
+#, php-format
+msgid ""
+"If the DNS forwarder is enabled, the DHCP service (if enabled) will "
+"automatically serve the LAN IP address as a DNS server to DHCP clients so "
+"they will use the forwarder. The DNS forwarder will use the DNS servers "
+"entered in %sSystem: General setup%s or those obtained via DHCP or PPP on "
+"WAN if the &quot;Allow DNS server list to be overridden by DHCP/PPP on "
+"WAN&quot; is checked. If you don't use that option (or if you use a static "
+"IP address on WAN), you must manually specify at least one DNS server on the "
+"%sSystem:General setup%s page."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:340
+#: usr/local/www/services_unbound.php:408
+msgid "Host Overrides"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:344
+#: usr/local/www/services_unbound.php:412
+msgid ""
+"Entries in this section override individual results from the forwarders."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:345
+#: usr/local/www/services_unbound.php:413
+msgid "Use these for changing DNS results or for adding custom DNS records."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:353
+#: usr/local/www/services_dnsmasq.php:440
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:76
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+#: usr/local/www/services_dnsmasq_edit.php:85
+#: usr/local/www/services_dnsmasq_edit.php:223
+#: usr/local/www/services_dnsmasq_edit.php:257
+#: usr/local/www/services_unbound.php:421
+#: usr/local/www/services_unbound.php:508
+#: usr/local/www/services_unbound_domainoverride_edit.php:71
+#: usr/local/www/services_unbound_domainoverride_edit.php:127
+#: usr/local/www/services_unbound_host_edit.php:87
+#: usr/local/www/services_unbound_host_edit.php:224
+#: usr/local/www/services_unbound_host_edit.php:260
+#: usr/local/www/system.php:108 usr/local/www/system.php:323
+msgid "Domain"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:430
+#: usr/local/www/services_unbound.php:498
+msgid "Domain Overrides"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:433
+msgid ""
+"Entries in this area override an entire domain, and subdomains, by "
+"specifying an authoritative DNS server to be queried for that domain."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:479
+#: usr/local/www/services_unbound.php:552
+msgid "Do you really want to delete this domain override?"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:87
+#: usr/local/www/services_unbound_domainoverride_edit.php:82
+msgid "A valid domain must be specified after _msdcs."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:91
+#: usr/local/www/services_dnsmasq_edit.php:100
+#: usr/local/www/services_unbound_domainoverride_edit.php:84
+#: usr/local/www/services_unbound_host_edit.php:102
+msgid "A valid domain must be specified."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:94
+msgid ""
+"A valid IP address must be specified, or # for an exclusion or ! to not "
+"forward at all."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:97
+msgid "An interface IP address must be specified for the DNS query source."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:122
+#: usr/local/www/services_unbound_domainoverride_edit.php:115
+msgid "Edit Domain Override"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:137
+#: usr/local/www/services_unbound_domainoverride_edit.php:131
+msgid "Domain to override (NOTE: this does not have to be a valid TLD!)"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:138
+#: usr/local/www/services_unbound_domainoverride_edit.php:132
+msgid "test"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:138
+#: usr/local/www/services_dnsmasq_edit.php:234
+#: usr/local/www/services_unbound_domainoverride_edit.php:132
+#: usr/local/www/services_unbound_host_edit.php:236
+msgid "or"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:144
+#: usr/local/www/services_unbound_domainoverride_edit.php:141
+msgid "IP address of the authoritative DNS server for this domain"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:145
+msgid ""
+"Or enter # for an exclusion to pass through this host/subdomain to standard "
+"nameservers instead of a previous override."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:145
+msgid ""
+"Or enter ! for lookups for this host/subdomain to NOT be forwarded anywhere."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:148
+msgid "Source IP"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:151
+msgid ""
+"Source IP address for queries to the DNS server for the override domain."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:152
+msgid "Leave blank unless your DNS server is accessed through a VPN tunnel."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:91 usr/local/www/system.php:114
+msgid ""
+"The hostname can only contain the characters A-Z, 0-9 and '-'. It may not "
+"start or end with '-'."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:130
+#: usr/local/www/services_unbound_host_edit.php:132
+msgid "Alias Domain"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:135
+#: usr/local/www/services_unbound_host_edit.php:137
+msgid ""
+"Hostnames in an alias list can only contain the characters A-Z, 0-9 and '-'. "
+"They may not start or end with '-'."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:138
+#: usr/local/www/services_unbound_host_edit.php:140
+msgid ""
+"A valid alias hostname is specified, but the domain name part should be "
+"omitted"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:143
+#: usr/local/www/services_unbound_host_edit.php:145
+msgid "A valid domain must be specified in alias list."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:154
+#: usr/local/www/services_unbound_host_edit.php:155
+msgid "This host/domain already exists."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:182
+#: usr/local/www/services_unbound_host_edit.php:183
+msgid "Edit host"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:212
+msgid "Edit DNS Forwarder entry"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:218
+#: usr/local/www/services_unbound_host_edit.php:219
+msgid "Name of the host, without domain part"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:220
+#: usr/local/www/services_unbound_host_edit.php:220
+msgid "myhost"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:226
+#: usr/local/www/services_unbound_host_edit.php:227
+msgid "Domain of the host"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:227
+#: usr/local/www/services_unbound_host_edit.php:228
+msgid "example.com"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:233
+#: usr/local/www/services_unbound_host_edit.php:235
+msgid "IP address of the host"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:251
+#: usr/local/www/services_unbound_host_edit.php:254
+msgid "Enter additional names for this host."
+msgstr ""
+
+#: usr/local/www/services_dyndns.php:61
+msgid "Dynamic DNS clients"
+msgstr ""
+
+#: usr/local/www/services_dyndns.php:75 usr/local/www/services_rfc2136.php:69
+msgid "DynDns"
+msgstr ""
+
+#: usr/local/www/services_dyndns.php:76 usr/local/www/services_rfc2136.php:70
+msgid "RFC 2136"
+msgstr ""
+
+#: usr/local/www/services_dyndns.php:87 usr/local/www/status_openvpn.php:283
+#: usr/local/www/status_openvpn.php:346 usr/local/www/status_services.php:84
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:82
+msgid "Service"
+msgstr ""
+
+#: usr/local/www/services_dyndns.php:89 usr/local/www/services_rfc2136.php:83
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:84
+msgid "Cached IP"
+msgstr ""
+
+#: usr/local/www/services_dyndns.php:191
+msgid ""
+"IP addresses appearing in green are up to date with Dynamic DNS provider."
+msgstr ""
+
+#: usr/local/www/services_dyndns.php:192
+msgid ""
+"You can force an update for an IP address on the edit page for that service."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:97
+#: usr/local/www/services_dyndns_edit.php:247
+msgid "Service type"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:107
+#: usr/local/www/services_dyndns_edit.php:382
+msgid "Update URL"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:121
+msgid "The hostname contains invalid characters."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:126
+msgid "The MX contains invalid characters."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:128
+#: usr/local/www/system_usermanager.php:227
+#: usr/local/www/vpn_l2tp_users_edit.php:92
+#: usr/local/www/vpn_pptp_users_edit.php:88
+msgid "The username contains invalid characters."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:181
+#: usr/local/www/services_dyndns_edit.php:236
+msgid "Dynamic DNS client"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:243
+#: usr/local/www/services_rfc2136_edit.php:195
+#: usr/local/www/services_rfc2136_edit.php:201
+msgid "yes"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:261
+#: usr/local/www/services_rfc2136_edit.php:141
+msgid "Interface to monitor"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:286
+msgid "Interface to send update from"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:308
+msgid "Note: This is almost always the same as the Interface to Monitor."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:319
+msgid "Enter the complete host/domain name. example: myhost.dyndns.org"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:320
+msgid "For he.net tunnelbroker, enter your tunnel ID"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:325
+msgid "MX"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:329
+msgid ""
+"Note: With DynDNS service you can only use a hostname, not an IP address."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:331
+msgid ""
+"Set this option only if you need a special MX record. Not all services "
+"support this."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:335
+msgid "Wildcards"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:338
+#: usr/local/www/services_dyndns_edit.php:344
+msgid "Enable "
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:338
+msgid "Wildcard"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:341
+msgid "Verbose logging"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:344
+msgid "verbose logging"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:347
+msgid "CURL options"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:350
+msgid "Force IPv4 resolving"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:352
+msgid "Verify SSL peer"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:359
+msgid ""
+"Username is required for all types except Namecheap, FreeDNS and Custom "
+"Entries."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:360
+msgid "Route 53: Enter your Access Key ID."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:361
+msgid ""
+"For Custom Entries, Username and Password represent HTTP Authentication "
+"username and passwords."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:369
+msgid ""
+"FreeDNS (freedns.afraid.org): Enter your \"Authentication Token\" provided "
+"by FreeDNS."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:370
+msgid "Route 53: Enter your Secret Access Key."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:375
+msgid "Zone ID"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:378
+msgid ""
+"Enter Zone ID that you received when you created your domain in Route 53."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:385
+msgid ""
+"This is the only field required by for Custom Dynamic DNS, and is only used "
+"by Custom Entries."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:387
+#: usr/local/www/services_dyndns_edit.php:398
+msgid ""
+"If you need the new IP to be included in the request, put %IP% in its place."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:391
+msgid "Result Match"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:394
+msgid "This field is only used by Custom Dynamic DNS Entries."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:396
+msgid ""
+"This field should be identical to what your DDNS Provider will return if the "
+"update succeeds, leave it blank to disable checking of returned results."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:400
+msgid ""
+"If you need to include multiple possible values, separate them with a |. If "
+"your provider includes a |, escape it with \\|"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:402
+msgid ""
+"Tabs (\\t), newlines (\\n) and carriage returns (\\r) at the beginning or "
+"end of the returned results are removed before comparison."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:407
+#: usr/local/www/services_rfc2136_edit.php:74
+#: usr/local/www/services_rfc2136_edit.php:159
+msgid "TTL"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:410
+msgid "Choose TTL for your dns record."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:428
+#: usr/local/www/services_rfc2136_edit.php:106
+msgid "Save & Force Update"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:435
+#, php-format
+msgid ""
+"You must configure a DNS server in %sSystem:\n"
+" General setup%s or allow the DNS server list to be "
+"overridden\n"
+" by DHCP/PPP on WAN for dynamic DNS updates to work."
+msgstr ""
+
+#: usr/local/www/services_igmpproxy.php:81
+#: usr/local/www/services_igmpproxy_edit.php:46
+msgid "IGMP Proxy"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy.php:91
+msgid "The IGMP entry list has been changed"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy.php:104
+#: usr/local/www/services_igmpproxy.php:147
+msgid "add a new igmpentry"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy.php:134
+msgid "edit igmpentry"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy.php:135
+msgid ""
+"Do you really want to delete this igmp entry? All elements that still use it "
+"will become invalid (e.g. filter rules)!"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy.php:135
+msgid "delete igmpentry"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy.php:161
+msgid ""
+"Please add the interface for upstream, the allowed subnets, and the "
+"downstream interfaces you would like the proxy to allow. Only one 'upstream' "
+"interface can be configured."
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:80
+msgid "Only one 'upstream' interface can be configured."
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:163
+msgid "IGMP Proxy Edit"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:193
+msgid "Upstream Interface"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:194
+msgid "Downstream Interface"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:198
+msgid ""
+"The <b>upstream</b> network interface is the outgoing interface which is "
+"responsible for communicating to available multicast data sources. There can "
+"only be one upstream interface."
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:204
+msgid "Downstream"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:204
+msgid ""
+"network interfaces are the distribution interfaces to the destination "
+"networks, where multicast clients can join groups and receive multicast "
+"data. One or more downstream interfaces must be configured."
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:211
+msgid "Threshold"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:216
+msgid ""
+"Defines the TTL threshold for the network interface. Packets with a "
+"lower TTL than the threshold value will be ignored. This setting is "
+"optional, and by default the threshold is 1."
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:223
+msgid "Network (s)"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:214 usr/local/www/services_ntpd.php:306
+msgid "Add another Time server"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:238 usr/local/www/services_ntpd_gps.php:367
+#: usr/local/www/services_ntpd_pps.php:118
+msgid "Serial GPS"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:239 usr/local/www/services_ntpd_gps.php:368
+#: usr/local/www/services_ntpd_pps.php:119 usr/local/www/status_queues.php:174
+msgid "PPS"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:249
+msgid "NTP Server Configuration"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:276
+msgid "Interfaces without an IP address will not be shown."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:278
+msgid "Selecting no interfaces will listen on all interfaces with a wildcard."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:279
+msgid ""
+"Selecting all interfaces will explicitly listen on only the interfaces/IPs "
+"specified."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:309
+msgid "For best results three to five servers should be configured here."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:311
+msgid ""
+"The <i>prefer</i> option indicates that NTP should favor the use of this "
+"server more than all others."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:313
+msgid ""
+"The <i>noselect</i> option indicates that NTP should not use this server for "
+"time, but stats for this server will be collected and displayed."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:319
+msgid "(0-15)"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:320
+msgid ""
+"Orphan mode allows the system clock to be used when no other clocks are "
+"available. The number here specifies the stratum reported during orphan mode "
+"and should normally be set to a number high enough to insure that any other "
+"servers available to clients are preferred over this server. (default: 12)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:327
+msgid "Enable RRD graphs of NTP statistics (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:333
+msgid ""
+"These options enable additional messages from NTP to be written to the "
+"System Log"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:333
+msgid "Status > System Logs > NTP"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:336
+msgid "Enable logging of peer messages (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:339
+msgid "Enable logging of system messages (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:346
+msgid "Show statistics logging options"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:349
+msgid "Warning: "
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:349
+msgid "these options will create persistant daily log files in /var/log/ntp."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:352
+msgid "Enable logging of reference clock statistics (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:355
+msgid "Enable logging of clock discipline statistics (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:358
+msgid "Enable logging of NTP peer statistics (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:366
+msgid "Show access restriction options"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:369
+msgid "these options control access to NTP from the WAN."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:372
+msgid "Enable Kiss-o'-death packets (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:375
+msgid ""
+"Deny state modifications (i.e. run time configuration) by ntpq and ntpdc "
+"(default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:378
+msgid "Disable ntpq and ntpdc queries (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:381
+msgid "Disable all except ntpq and ntpdc queries (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:384
+msgid "Deny packets that attempt a peer association (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:387
+msgid "Deny mode 6 control message trap service (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:395
+msgid "Show Leap second configuration"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:398
+msgid ""
+"A leap second file allows NTP to advertize an upcoming leap second addition "
+"or subtraction."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:399
+msgid "Normally this is only useful if this server is a stratum 1 time server."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:401
+msgid "Enter Leap second configuration as text:"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:403
+msgid "Or"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:403
+msgid "select a file to upload:"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:160
+msgid "NTP GPS"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:376
+msgid "NTP Serial GPS Configuration"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:383
+msgid ""
+"For the best results, NTP should have at least three sources of time. So it "
+"is best to configure at least 2 servers under"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:383
+#: usr/local/www/services_ntpd_pps.php:138
+msgid "Services > NTP"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:383
+msgid ""
+"to minimize clock drift if the GPS data is not valid over time. Otherwise "
+"ntpd may only use values from the unsynchronized local clock when providing "
+"time to clients."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:387
+msgid "GPS"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:399
+msgid "This option allows you to select a predefined configuration."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:402
+msgid "Default is the configuration of pfSense 2.1 and earlier"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:403
+msgid " (not recommended). Select Generic if your GPS is not listed.)"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:404
+msgid ""
+"The perdefined configurations assume your GPS has already been set to NMEA "
+"mode."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:428
+msgid ""
+"All serial ports are listed, be sure to pick the port with the GPS attached."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:437
+msgid "Serial port baud rate."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:440
+msgid ""
+"Note: A higher baud rate is generally only helpful if the GPS is sending too "
+"many sentences. It is recommended to configure the GPS to send only one "
+"sentence at a baud rate of 4800 or 9600."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:457
+msgid ""
+"By default NTP will listen for all supported NMEA sentences. Here one or "
+"more sentences to listen for may be specified."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:464
+msgid "Fudge time 1 is used to specify the GPS PPS signal offset"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:470
+msgid "Fudge time 2 is used to specify the GPS time offset"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:475
+#: usr/local/www/services_ntpd_pps.php:167
+msgid "(0-16)"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:476
+msgid "This may be used to change the GPS Clock stratum"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:476
+msgid ""
+"This may be useful if, for some reason, you want ntpd to prefer a different "
+"clock"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:484
+#: usr/local/www/services_ntpd_pps.php:176
+msgid ""
+"Normally there should be no need to change these options from the defaults."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:494
+msgid "NTP should prefer this clock (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:502
+msgid ""
+"NTP should not use this clock, it will be displayed for reference "
+"only(default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:510
+msgid "Enable PPS signal processing (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:518
+#: usr/local/www/services_ntpd_pps.php:186
+msgid "Enable falling edge PPS signal processing (default: rising edge)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:526
+msgid "Enable kernel PPS clock discipline (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:534
+msgid "Obscure location in timestamp (default: unobscured)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:542
+msgid ""
+"Log the sub-second fraction of the received time stamp (default: Not logged)."
+"<br />Note: enabling this will rapidly fill the log, but is useful for "
+"tuning Fudge time 2."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:551
+#: usr/local/www/services_ntpd_pps.php:211
+msgid "(1 to 4 charactors)"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:552
+msgid "This may be used to change the GPS Clock ID"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:558
+msgid "Show GPS Initialization commands"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:563
+msgid ""
+"Note: Commands entered here will be sent to the GPS during initialization. "
+"Please read and understand your GPS documentation before making any changes "
+"here."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:564
+msgid "NMEA checksum calculator"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:566
+msgid ""
+"Enter the text between &quot;$&quot; and &quot;*&quot; of a NMEA command "
+"string:"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:566
+msgid "checksum"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:567
+msgid "Calculate NMEA checksum"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:101
+msgid "NTP PPS"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:129
+msgid "NTP PPS Configuration"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:134
+msgid ""
+"Devices with a Pulse Per Second output such as radios that receive a time "
+"signal from DCF77 (DE), JJY (JP), MSF (GB) or WWVB (US) may be used as a PPS "
+"reference for NTP."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:135
+msgid ""
+"A serial GPS may also be used, but the serial GPS driver would usually be "
+"the better option."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:136
+msgid ""
+"A PPS signal only provides a reference to the change of a second, so at "
+"least one other source to number the seconds is required."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:138
+msgid "At least 3 additional time sources should be configured under"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:138
+msgid "to reliably supply the time of each PPS pulse."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:154
+msgid ""
+"All serial ports are listed, be sure to pick the port with the PPS source "
+"attached."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:162
+msgid ""
+"Fudge time is used to specify the PPS signal offset from the actual second "
+"such as the transmission delay between the transmitter and the receiver."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:168
+msgid "This may be used to change the PPS Clock stratum"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:168
+msgid ""
+"This may be useful if, for some reason, you want ntpd to prefer a different "
+"clock and just monitor this source."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:194
+msgid "Enable kernel PPS clock discipline (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:202
+msgid ""
+"Record a timestamp once for each second, useful for constructing Allan "
+"deviation plots (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:212
+msgid "This may be used to change the PPS Clock ID"
+msgstr ""
+
+#: usr/local/www/services_rfc2136.php:56
+msgid "RFC 2136 clients"
+msgstr ""
+
+#: usr/local/www/services_rfc2136.php:166
+#: usr/local/www/vpn_openvpn_client.php:1165
+msgid "Do you really want to delete this client?"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:74
+#: usr/local/www/services_rfc2136_edit.php:165
+msgid "Key name"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:79
+msgid "The DNS update host name contains invalid characters."
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:81
+msgid "The DNS update TTL must be an integer."
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:83
+msgid "The DNS update key name contains invalid characters."
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:104
+msgid "New/Edited RFC2136 dnsupdate entry was posted."
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:116
+#: usr/local/www/services_rfc2136_edit.php:130
+msgid "RFC 2136 client"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:169
+msgid "This must match the setting on the DNS server."
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:172
+msgid "Key type"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:176
+msgid " User"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:184
+msgid "Paste an HMAC-MD5 key here."
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:196
+msgid "Use TCP instead of UDP"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:199
+msgid "Use Public IP"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:202
+msgid ""
+"If the interface IP is private, attempt to fetch and use the public IP "
+"instead."
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:216
+msgid "Save &amp; Force Update"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:225
+#, php-format
+msgid ""
+"You must configure a DNS server in %sSystem: General setup %sor allow the "
+"DNS server list to be overridden by DHCP/PPP on WAN for dynamic DNS updates "
+"to work."
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:75
+msgid ""
+"The DHCPv6 Server can only be enabled on interfaces configured with static "
+"IP addresses"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:76
+msgid "Only interfaces configured with a static IP will be shown"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:118
+msgid ""
+"Subnets are specified in CIDR format. Select the CIDR mask that pertains to "
+"each entry. /128 specifies a single IPv6 host; /64 specifies a normal IPv6 "
+"network; etc. If no subnets are specified here, the Router Advertisement "
+"(RA) Daemon will advertise to the subnet to which the router's interface is "
+"assigned."
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:145
+#, php-format
+msgid "An invalid subnet or alias was specified. [%s/%s]"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:194
+msgid "Router advertisements"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:279
+#, php-format
+msgid "Select the Operating Mode for the Router Advertisement (RA) Daemon."
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:280
+#, php-format
+msgid ""
+"Use \"Router Only\" to only advertise this router, \"Unmanaged\" for Router "
+"Advertising with Stateless Autoconfig, \"Managed\" for assignment through "
+"(a) DHCPv6 Server, \"Assisted\" for DHCPv6 Server assignment combined with "
+"Stateless Autoconfig"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:281
+#, php-format
+msgid ""
+"It is not required to activate this DHCPv6 server when set to \"Managed\", "
+"this can be another host on the network"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:285
+msgid "Router Priority"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:292
+#, php-format
+msgid "Select the Priority for the Router Advertisement (RA) Daemon."
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:306
+msgid "RA Interface"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:314
+#, php-format
+msgid "Select the Interface for the Router Advertisement (RA) Daemon."
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:320
+msgid "RA Subnet(s)"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:391
+msgid ""
+"The RA server can optionally provide a domain search list. Use the semicolon "
+"character as separator"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:399
+msgid "Use same settings as DHCPv6 server"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:95
+msgid "Invalid character '#' in system location"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:96
+msgid "Invalid character '#' in system contact"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:97
+msgid "Invalid character '#' in read community string"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:100
+msgid "Community"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:104
+msgid "Polling Port"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:111
+msgid "Invalid character '#' in SNMP trap string"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:114 usr/local/www/services_snmp.php:357
+msgid "Trap server"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:118
+msgid "Trap server port"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:122 usr/local/www/services_snmp.php:376
+msgid "Trap string"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:290
+msgid "SNMP Daemon"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:296
+msgid "Polling Port "
+msgstr ""
+
+#: usr/local/www/services_snmp.php:299
+msgid "Enter the port to accept polling events on (default 161)"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:304
+msgid "System location"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:311
+msgid "System contact"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:318
+msgid "Read Community String"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:321
+msgid ""
+"The community string is like a password, restricting access to querying SNMP "
+"to hosts knowing the community string. Use a strong value here to protect "
+"from unauthorized information disclosure."
+msgstr ""
+
+#: usr/local/www/services_snmp.php:350
+msgid "SNMP Traps"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:360
+msgid "Enter trap server name"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:365
+msgid "Trap server port "
+msgstr ""
+
+#: usr/local/www/services_snmp.php:368
+msgid "Enter the port to send the traps to (default 162)"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:373
+msgid "Enter the SNMP trap string"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:385
+msgid "Modules"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:391
+msgid "SNMP Modules"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:393
+msgid "MibII"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:395
+msgid "Netgraph"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:399
+msgid "Host Resources (Requires MibII)"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:401
+msgid "UCD"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:403
+msgid "Regex"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:413
+msgid "Interface Binding"
+msgstr ""
+
+#: usr/local/www/services_snmp.php:418
+msgid "Bind Interface"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:130
+msgid "You must specify a valid port number."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:230
+msgid "The configuration of the DNS Resolver has been changed"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:230
+msgid "You must apply changes for them to take effect."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:238
+#: usr/local/www/services_unbound_advanced.php:212
+msgid "General settings"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:239
+#: usr/local/www/services_unbound_acls.php:189
+#: usr/local/www/services_unbound_advanced.php:213
+msgid "Advanced settings"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:240
+#: usr/local/www/services_unbound_acls.php:190
+#: usr/local/www/services_unbound_advanced.php:214
+msgid "Access Lists"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:251
+msgid "General DNS Resolver Options"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:257
+msgid "Enable DNS Resolver"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:272
+#: usr/local/www/system_advanced_network.php:251
+msgid "Network Interfaces"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:278
+msgid ""
+"Interface IPs used by the DNS Resolver for responding to queries from "
+"clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries "
+"to other interface IPs not selected below are discarded. The default "
+"behavior is to respond to queries on every available IPv4 and IPv6 address."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:297
+msgid "Outgoing Network Interfaces"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:303
+msgid ""
+"Utilize different network interface(s) that the DNS Resolver will use to "
+"send queries to authoritative servers and receive their replies. By default "
+"all interfaces are used."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:322
+msgid "DNSSEC"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:325
+msgid "Enable DNSSEC Support"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:333
+msgid "Enable Forwarding Mode"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:340
+msgid "Register DHCP leases in the DNS Resolver"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:341
+#, php-format
+msgid ""
+"If this option is set, then machines that specify their hostname when "
+"requesting a DHCP lease will be registered in the DNS Resolver, so that "
+"their name can be resolved. You should also set the domain in %sSystem: "
+"General setup%s to the proper value."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:352
+msgid "Register DHCP static mappings in the DNS Resolver"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:353
+#, php-format
+msgid ""
+"If this option is set, then DHCP static mappings will be registered in the "
+"DNS Resolver, so that their name can be resolved. You should also set the "
+"domain in %sSystem: General setup%s to the proper value."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:360
+msgid "TXT Comment Support"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:363
+msgid ""
+"If this option is set, then any descriptions associated with Host entries "
+"and DHCP Static mappings will create a corresponding TXT record."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:376
+msgid ""
+"Enter any additional configuration parameters to add to the DNS Resolver "
+"configuration here, separated by a newline"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:395
+#, php-format
+msgid ""
+"If the DNS Resolver is enabled, the DHCP service (if enabled) will "
+"automatically serve the LAN IP address as a DNS server to DHCP clients so "
+"they will use the DNS Resolver. If Forwarding, is enabled, the DNS Resolver "
+"will use the DNS servers entered in %sSystem: General setup%s or those "
+"obtained via DHCP or PPP on WAN if the &quot;Allow DNS server list to be "
+"overridden by DHCP/PPP on WAN&quot; is checked."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:501
+msgid ""
+"Entries in this area override an entire domain by specifying an "
+"authoritative DNS server to be queried for that domain."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:95
+#: usr/local/www/services_unbound_acls.php:109
+msgid "You must enter a valid IP address for each row under Networks."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:100
+msgid "You must enter a valid IPv4 netmask for each IPv4 row under Networks."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:106
+msgid "You must enter a valid IPv6 netmask for each IPv6 row under Networks."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:179
+#: usr/local/www/services_unbound_advanced.php:204
+msgid "The configuration of the DNS Resolver, has been changed"
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:188
+msgid "General Settings"
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:204
+#, php-format
+msgid "%s Access List"
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:207
+msgid "Access List name"
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:211
+msgid "Provide an Access List name."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:226
+msgid ""
+"Choose what to do with DNS requests that match the criteria specified below."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:227
+msgid ""
+"<b>Deny:</b> This action stops queries from hosts within the netblock "
+"defined below."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:228
+msgid ""
+"<b>Refuse:</b> This action also stops queries from hosts within the netblock "
+"defined below, but sends a DNS rcode REFUSED error message back to the "
+"client."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:229
+msgid ""
+"<b>Allow:</b> This action allows queries from hosts within the netblock "
+"defined below."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:230
+msgid ""
+"<b>Allow Snoop:</b> This action allows recursive and nonrecursive access "
+"from hosts within the netblock defined below. Used for cache snooping and "
+"ideally should only be configured for your administrative host."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:235
+msgid "Networks"
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:321
+msgid "Access List Name"
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:335
+msgid "Add new Access List"
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:344
+msgid "Access Lists to control access to the DNS Resolver can be defined here."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:368
+msgid "edit access list"
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:370
+msgid "Do you really want to delete this access list?"
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:371
+msgid "delete access list"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:225
+msgid "Advanced Resolver Options"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:228
+msgid "Hide Identity"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:231
+msgid "If enabled, id.server and hostname.bind queries are refused."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:235
+msgid "Hide Version"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:238
+msgid "If enabled, version.server and version.bind queries are refused."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:242
+msgid "Prefetch Support"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:245
+msgid ""
+"Message cache elements are prefetched before they expire to help keep the "
+"cache up to date. When enabled, this option can cause an increase of around "
+"10% more DNS traffic and load on the server, but frequently requested items "
+"will not expire from the cache."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:249
+msgid "Prefetch DNS Key Support"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:252
+#, php-format
+msgid ""
+"DNSKEY's are fetched earlier in the validation process when a %sDelegation "
+"signer%s is encountered. This helps lower the latency of requests but does "
+"utilize a little more CPU."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:256
+msgid "Harden Glue"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:259
+msgid "Only trust glue if it is within the servers authority."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:263
+msgid "Harden DNSSEC data"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:266
+msgid ""
+"DNSSEC data is required for trust-anchored zones. If such data is absent, "
+"the zone becomes bogus. If this is disabled and no DNSSEC data is received, "
+"then the zone is made insecure."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:270
+msgid "Message Cache Size"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:283
+msgid ""
+"Size of the message cache. The message cache stores DNS rcodes and "
+"validation statuses. The RRSet cache will automatically be set to twice this "
+"amount. The RRSet cache contains the actual RR data. The default is 4 "
+"megabytes."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:287
+msgid "Outgoing TCP Buffers"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:300
+msgid ""
+"The number of outgoing TCP buffers to allocate per thread. The default value "
+"is 10. If 0 is selected then no TCP queries, to authoritative servers, are "
+"done."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:304
+msgid "Incoming TCP Buffers"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:317
+msgid ""
+"The number of incoming TCP buffers to allocate per thread. The default value "
+"is 10. If 0 is selected then no TCP queries, from clients, are accepted."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:321
+msgid "EDNS Buffer Size"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:334
+msgid ""
+"Number of bytes size to advertise as the EDNS reassembly buffer size. This "
+"is the value that is used in UDP datagrams sent to peers. RFC recommendation "
+"is 4096 (which is the default). If you have fragmentation reassemble "
+"problems, usually seen as timeouts, then a value of 1480 should help. The "
+"512 value bypasses most MTU path problems, but it can generate an excessive "
+"amount of TCP fallback."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:338
+msgid "Number of queries per thread"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:351
+msgid ""
+"The number of queries that every thread will service simultaneously. If more "
+"queries arrive that need to be serviced, and no queries can be jostled, then "
+"these queries are dropped."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:355
+msgid "Jostle Timeout"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:368
+msgid ""
+"This timeout is used for when the server is very busy. This protects against "
+"denial of service by slow queries or high query rates. The default value is "
+"200 milliseconds."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:372
+msgid "Maximum TTL for RRsets and messages"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:375
+msgid ""
+"Configure a maximum Time to live for RRsets and messages in the cache. The "
+"default is 86400 seconds (1 day). When the internal TTL expires the cache "
+"item is expired. This can be configured to force the resolver to query for "
+"data more often and not trust (very large) TTL values."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:379
+msgid "Minimum TTL for RRsets and messages"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:382
+msgid ""
+"Configure a minimum Time to live for RRsets and messages in the cache. The "
+"default is 0 seconds. If the minimum value kicks in, the data is cached for "
+"longer than the domain owner intended, and thus less queries are made to "
+"look up the data. The 0 value ensures the data in the cache is as the domain "
+"owner intended. High values can lead to trouble as the data in the cache "
+"might not match up with the actual data anymore."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:386
+msgid "TTL for Host cache entries"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:395
+msgid ""
+"Time to live for entries in the host cache. The host cache contains "
+"roundtrip timing and EDNS support information. The default is 15 minutes."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:399
+msgid "TTL for lame delegation"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:408
+msgid ""
+"Time to live for when a delegation is considered to be lame. The default is "
+"15 minutes."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:412
+msgid "Number of Hosts to cache"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:421
+msgid "Number of hosts for which information is cached. The default is 10,000."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:425
+msgid "Unwanted Reply Threshold"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:435
+msgid ""
+"If enabled, a total number of unwanted replies is kept track of in every "
+"thread. When it reaches the threshold, a defensive action is taken and a "
+"warning is printed to the log file. This defensive action is to clear the "
+"RRSet and message caches, hopefully flushing away any poison. The default is "
+"disabled, but if enabled a value of 10 million is suggested."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:439
+msgid "Log level verbosity"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:452
+msgid "Select the log verbosity."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:456
+msgid "Disable auto-added access control"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:459
+msgid ""
+"Check this box to disable the automatically-added access control entries. By "
+"default, IPv4 and IPv6 networks residing on internal interfaces of this "
+"system are permitted. Allowed networks must be manually configured on the "
+"Access Lists tab if the auto-added entries are disabled."
+msgstr ""
+
+#: usr/local/www/services_unbound_domainoverride_edit.php:90
+msgid ""
+"A valid IP address and port must be specified, for example "
+"192.168.100.10@5353."
+msgstr ""
+
+#: usr/local/www/services_unbound_domainoverride_edit.php:92
+msgid "A valid IP address must be specified, for example 192.168.100.10."
+msgstr ""
+
+#: usr/local/www/services_unbound_domainoverride_edit.php:143
+msgid ""
+"To use a nondefault port for communication, append an '@' with the port "
+"number."
+msgstr ""
+
+#: usr/local/www/services_unbound_host_edit.php:93
+msgid ""
+"The hostname can only contain the characters A-Z, 0-9, '_' and '-'. It may "
+"not start or end with '-'."
+msgstr ""
+
+#: usr/local/www/services_unbound_host_edit.php:213
+msgid "Edit DNS Resolver entry"
+msgstr ""
+
+#: usr/local/www/services_wol.php:64
+#, php-format
+msgid "Sent magic packet to %1$s (%2$s)%3$s"
+msgstr ""
+
+#: usr/local/www/services_wol.php:66
+#, php-format
+msgid ""
+"Please check the %1$ssystem log%2$s, the wol command for %3$s (%4$s) did not "
+"complete successfully%5$s"
+msgstr ""
+
+#: usr/local/www/services_wol.php:89
+msgid "A valid interface must be specified."
+msgstr ""
+
+#: usr/local/www/services_wol.php:95
+msgid "A valid ip could not be found!"
+msgstr ""
+
+#: usr/local/www/services_wol.php:100
+#, php-format
+msgid "Sent magic packet to %s."
+msgstr ""
+
+#: usr/local/www/services_wol.php:102
+#, php-format
+msgid ""
+"Please check the %1$ssystem log%2$s, the wol command for %3$s did not "
+"complete successfully%4$s"
+msgstr ""
+
+#: usr/local/www/services_wol.php:142
+msgid "Choose which interface the host to be woken up is connected to."
+msgstr ""
+
+#: usr/local/www/services_wol.php:149
+msgid "Enter a MAC address "
+msgstr ""
+
+#: usr/local/www/services_wol.php:149
+msgid "in the following format: xx:xx:xx:xx:xx:xx"
+msgstr ""
+
+#: usr/local/www/services_wol.php:158
+msgid "Wake all clients at once: "
+msgstr ""
+
+#: usr/local/www/services_wol.php:159
+msgid "Or Click the MAC address to wake up an individual device:"
+msgstr ""
+
+#: usr/local/www/services_wol.php:213
+msgid ""
+"This service can be used to wake up (power on) computers by sending special"
+msgstr ""
+
+#: usr/local/www/services_wol.php:213
+msgid "Magic Packets"
+msgstr ""
+
+#: usr/local/www/services_wol.php:213
+msgid ""
+"The NIC in the computer that is to be woken up must support Wake on LAN and "
+"has to be configured properly (WOL cable, BIOS settings). "
+msgstr ""
+
+#: usr/local/www/services_wol_edit.php:127
+msgid "Edit WOL entry"
+msgstr ""
+
+#: usr/local/www/services_wol_edit.php:141
+msgid "Choose which interface this host is connected to."
+msgstr ""
+
+#: usr/local/www/services_wol_edit.php:148
+msgid "Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx"
+msgstr ""
+
+#: usr/local/www/shortcuts.inc:96
+msgid "Main page for this section"
+msgstr ""
+
+#: usr/local/www/shortcuts.inc:120
+msgid "Status of items on this page"
+msgstr ""
+
+#: usr/local/www/shortcuts.inc:127
+msgid "Log entries for items on this page"
+msgstr ""
+
+#: usr/local/www/status.php:125
+msgid "This status page includes the following information"
+msgstr ""
+
+#: usr/local/www/status.php:245
+msgid ""
+"Note: make sure to remove any sensitive information (passwords, maybe also "
+"IP addresses) before posting information from this page in public places "
+"(like mailing lists)"
+msgstr ""
+
+#: usr/local/www/status.php:248
+msgid "Passwords in config.xml have been automatically removed"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:53
+msgid "Status: Captive portal"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:115
+#: usr/local/www/status_captiveportal_expire.php:72
+#: usr/local/www/status_captiveportal_test.php:72
+#: usr/local/www/status_captiveportal_voucher_rolls.php:77
+#: usr/local/www/status_captiveportal_vouchers.php:110
+msgid "Active Users"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:116
+#: usr/local/www/status_captiveportal_expire.php:73
+#: usr/local/www/status_captiveportal_test.php:73
+#: usr/local/www/status_captiveportal_voucher_rolls.php:78
+#: usr/local/www/status_captiveportal_vouchers.php:111
+msgid "Active Vouchers"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:118
+#: usr/local/www/status_captiveportal_expire.php:75
+#: usr/local/www/status_captiveportal_test.php:59
+#: usr/local/www/status_captiveportal_test.php:75
+#: usr/local/www/status_captiveportal_voucher_rolls.php:80
+#: usr/local/www/status_captiveportal_vouchers.php:113
+msgid "Test Vouchers"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:119
+#: usr/local/www/status_captiveportal_expire.php:60
+#: usr/local/www/status_captiveportal_expire.php:76
+#: usr/local/www/status_captiveportal_test.php:76
+#: usr/local/www/status_captiveportal_voucher_rolls.php:81
+#: usr/local/www/status_captiveportal_vouchers.php:114
+msgid "Expire Vouchers"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:130
+msgid "Captive Portal Zone"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:154
+msgid "Captive Portal status"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:161
+#: usr/local/www/status_captiveportal.php:164
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:111
+msgid "Session start"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:162
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:112
+msgid "Last activity"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:190
+msgid "Do you really want to disconnect this client?"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:190
+#: usr/local/www/status_interfaces.php:132
+#: usr/local/www/status_interfaces.php:145
+#: usr/local/www/status_interfaces.php:158
+#: usr/local/www/status_interfaces.php:172
+msgid "Disconnect"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:207
+msgid "Don't show last activity"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:210
+msgid "Show last activity"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_expire.php:85
+#: usr/local/www/status_captiveportal_test.php:85
+msgid "Voucher(s)"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_expire.php:89
+msgid ""
+"Enter multiple vouchers separated by space or newline. All valid vouchers "
+"will be marked as expired"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_test.php:89
+msgid ""
+"Enter multiple vouchers separated by space or newline. The remaining time, "
+"if valid, will be shown for each voucher"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:90
+msgid "Roll#"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:92
+msgid "# of Tickets"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:94
+msgid "used"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:95
+msgid "active"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:96
+msgid "ready"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_vouchers.php:123
+msgid "Voucher"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_vouchers.php:125
+msgid "Activated at"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_vouchers.php:126
+msgid "Expires in"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_vouchers.php:127
+msgid "Expires at"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_vouchers.php:135
+msgid "min"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:50
+msgid "DHCP leases"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:300
+#: usr/local/www/status_dhcpv6_leases.php:385
+msgid "Failover Group"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:301
+#: usr/local/www/status_dhcpv6_leases.php:386
+msgid "My State"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:302
+#: usr/local/www/status_dhcp_leases.php:304
+#: usr/local/www/status_dhcpv6_leases.php:387
+#: usr/local/www/status_dhcpv6_leases.php:389
+msgid "Since"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:303
+#: usr/local/www/status_dhcpv6_leases.php:388
+msgid "Peer State"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:335
+#: usr/local/www/status_dhcpv6_leases.php:421
+#: usr/local/www/status_dhcpv6_leases.php:506
+msgid "End"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:336
+#: usr/local/www/status_dhcpv6_leases.php:422
+#: usr/local/www/status_gateway_groups.php:134
+#: usr/local/www/status_gateways.php:132 usr/local/www/status_gateways.php:136
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:60
+msgid "Online"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:337
+#: usr/local/www/status_dhcpv6_leases.php:423
+msgid "Lease Type"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:386
+msgid "send Wake on LAN packet to this MAC address"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:408
+#: usr/local/www/status_dhcpv6_leases.php:482
+msgid "add a static mapping for this MAC address"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:411
+msgid "edit the static mapping for this entry"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:415
+msgid "add a Wake on LAN mapping for this MAC address"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:420
+#: usr/local/www/status_dhcpv6_leases.php:491
+msgid "delete this DHCP lease"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:433
+#: usr/local/www/status_dhcpv6_leases.php:562
+msgid "Show active and static leases only"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:436
+#: usr/local/www/status_dhcpv6_leases.php:565
+msgid "Show all configured leases"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:440
+#: usr/local/www/status_dhcpv6_leases.php:569
+msgid "No leases file found. Is the DHCP server active"
+msgstr ""
+
+#: usr/local/www/status_dhcpv6_leases.php:51
+msgid "DHCPv6 leases"
+msgstr ""
+
+#: usr/local/www/status_dhcpv6_leases.php:417
+#: usr/local/www/status_dhcpv6_leases.php:503
+msgid "IAID"
+msgstr ""
+
+#: usr/local/www/status_dhcpv6_leases.php:419
+msgid "Hostname/MAC"
+msgstr ""
+
+#: usr/local/www/status_dhcpv6_leases.php:502
+msgid "IPv6 Prefix"
+msgstr ""
+
+#: usr/local/www/status_filter_reload.php:45
+msgid "Filter Reload Status"
+msgstr ""
+
+#: usr/local/www/status_filter_reload.php:90
+msgid ""
+"This page will automatically refresh every 3 seconds until the filter is "
+"done reloading"
+msgstr ""
+
+#: usr/local/www/status_gateway_groups.php:102
+#, php-format
+msgid "Tier %s"
+msgstr ""
+
+#: usr/local/www/status_gateway_groups.php:128
+#: usr/local/www/status_gateways.php:126
+msgid "Warning, Packetloss"
+msgstr ""
+
+#: usr/local/www/status_gateway_groups.php:131
+#: usr/local/www/status_gateways.php:129
+msgid "Warning, Latency"
+msgstr ""
+
+#: usr/local/www/status_gateway_groups.php:137
+msgid "Gathering data"
+msgstr ""
+
+#: usr/local/www/status_gateways.php:77
+msgid "RTT"
+msgstr ""
+
+#: usr/local/www/status_gateways.php:78
+msgid "Loss"
+msgstr ""
+
+#: usr/local/www/status_gateways.php:102 usr/local/www/status_gateways.php:110
+#: usr/local/www/status_gateways.php:139
+#: usr/local/www/widgets/widgets/gateways.widget.php:88
+#: usr/local/www/widgets/widgets/gateways.widget.php:97
+msgid "Pending"
+msgstr ""
+
+#: usr/local/www/status_gateways.php:120
+msgid "Offline (forced)"
+msgstr ""
+
+#: usr/local/www/status_gateways.php:145
+msgid "Last check:"
+msgstr ""
+
+#: usr/local/www/status_graph.php:250
+msgid "Host IP"
+msgstr ""
+
+#: usr/local/www/status_graph.php:250
+msgid "Host Name or IP"
+msgstr ""
+
+#: usr/local/www/status_graph.php:251
+msgid "Bandwidth In"
+msgstr ""
+
+#: usr/local/www/status_graph.php:252
+msgid "Bandwidth Out"
+msgstr ""
+
+#: usr/local/www/status_graph.php:338
+msgid "the"
+msgstr ""
+
+#: usr/local/www/status_graph.php:338
+msgid "Adobe SVG Viewer"
+msgstr ""
+
+#: usr/local/www/status_graph.php:338
+msgid ""
+"Firefox 1.5 or later or other browser supporting SVG is required to view the "
+"graph"
+msgstr ""
+
+#: usr/local/www/status_graph_cpu.php:42
+msgid "CPU load"
+msgstr ""
+
+#: usr/local/www/status_graph_cpu.php:47
+msgid "Status: CPU Graph"
+msgstr ""
+
+#: usr/local/www/status_graph_cpu.php:54
+msgid "if you can't see the graph, you may have to install the"
+msgstr ""
+
+#: usr/local/www/status_graph_cpu.php:54
+msgid "Adobe SVG viewer"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:84
+msgid "interface"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:103
+#: usr/local/www/status_interfaces.php:119
+msgid "Release"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:103
+#: usr/local/www/status_interfaces.php:119
+msgid "Renew"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:132
+#: usr/local/www/status_interfaces.php:145
+#: usr/local/www/status_interfaces.php:158
+#: usr/local/www/status_interfaces.php:175
+msgid "Connect"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:183
+msgid "Uptime "
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:190
+msgid "Cell Signal (RSSI)"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:197
+msgid "Cell Mode"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:204
+msgid "Cell SIM State"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:211
+msgid "Cell Service"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:218
+msgid "Cell Upstream"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:225
+msgid "Cell Downstream"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:232
+msgid "Cell Current Up"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:239
+msgid "Cell Current Down"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:268
+msgid "Subnet mask IPv4"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:275
+msgid "Gateway IPv4"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:283
+msgid "IPv6 Link Local"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:299
+msgid "Subnet mask IPv6"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:306
+msgid "Gateway IPv6"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:314
+msgid "ISP DNS servers"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:333
+msgid "Media"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:340
+msgid "LAGG Protocol"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:347
+msgid "LAGG Ports"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:370
+msgid "BSSID"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:384
+msgid "RSSI"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:391
+msgid "In/out packets"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:400
+msgid "In/out packets (pass)"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:409
+msgid "In/out packets (block)"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:419
+msgid "In/out errors"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:427
+msgid "Collisions"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:436
+#, php-format
+msgid "Bridge (%s)"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:458
+msgid "Interrupts/Second"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:461
+msgid "total"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:463
+msgid "rate"
+msgstr ""
+
+#: usr/local/www/status_interfaces.php:474
+#, php-format
+msgid ""
+"Using dial-on-demand will bring the connection up again if any packet "
+"triggers it. To substantiate this point: disconnecting manually will %snot%s "
+"prevent dial-on-demand from making connections to the outside! Don't use "
+"dial-on-demand if you want to make sure that the line is kept disconnected."
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:180
+msgid "Ref ID"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:181
+msgid "Stratum"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:183
+msgid "When"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:184
+msgid "Poll"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:185
+msgid "Reach"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:187
+msgid "Offset"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:188
+msgid "Jitter"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:245
+msgid "Clock Latitude"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:246
+msgid "Clock Longitude"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:247
+msgid "Clock Altitude"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:248
+msgid "Satellites"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:150
+msgid "Client connections"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:157 usr/local/www/status_openvpn.php:227
+#: usr/local/www/system_camanager.php:562
+#: usr/local/www/system_certmanager.php:786
+#: usr/local/www/system_certmanager.php:959
+#: usr/local/www/vpn_openvpn_csc.php:747
+msgid "Common Name"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:158 usr/local/www/status_openvpn.php:228
+msgid "Real Address"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:159
+msgid "Virtual Address"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:160 usr/local/www/status_openvpn.php:278
+#: usr/local/www/status_openvpn.php:341
+msgid "Connected Since"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:161 usr/local/www/status_openvpn.php:281
+#: usr/local/www/status_openvpn.php:344
+msgid "Bytes Sent"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:162
+msgid "Bytes Received"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:189
+msgid "Kill client connection from"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:214
+msgid "Show Routing Table"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:214
+msgid "Display OpenVPN's internal routing table for this server."
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:220
+msgid "Routing Table"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:229
+msgid "Target Network"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:230
+msgid "Last Used"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:252
+msgid ""
+"An IP address followed by C indicates a host currently connected through the "
+"VPN."
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:269
+msgid "Peer to Peer Server Instance Statistics"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:279 usr/local/www/status_openvpn.php:342
+msgid "Virtual Addr"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:280 usr/local/www/status_openvpn.php:343
+msgid "Remote Host"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:282 usr/local/www/status_openvpn.php:345
+msgid "Bytes Rcvd"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:332
+msgid "Client Instance Statistics"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:392
+msgid ""
+"If you have custom options that override the management features of OpenVPN "
+"on a client or server, they will cause that OpenVPN instance to not work "
+"correctly with this status page."
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:396
+msgid "No OpenVPN instances defined"
+msgstr ""
+
+#: usr/local/www/status_queues.php:124
+msgid "Traffic shaper"
+msgstr ""
+
+#: usr/local/www/status_queues.php:132
+msgid "Traffic shaping is not configured."
+msgstr ""
+
+#: usr/local/www/status_queues.php:168
+msgid "Statistics"
+msgstr ""
+
+#: usr/local/www/status_queues.php:176
+msgid "Borrows"
+msgstr ""
+
+#: usr/local/www/status_queues.php:177
+msgid "Suspends"
+msgstr ""
+
+#: usr/local/www/status_queues.php:178
+msgid "Drops"
+msgstr ""
+
+#: usr/local/www/status_queues.php:179
+msgid "Length"
+msgstr ""
+
+#: usr/local/www/status_queues.php:188
+msgid "Queue graphs take 5 seconds to sample data"
+msgstr ""
+
+#: usr/local/www/status_queues.php:189
+msgid "You can configure the Traffic Shaper"
+msgstr ""
+
+#: usr/local/www/status_queues.php:250
+msgid "Loading"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:160
+msgid "Invalid start date/time:"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:173
+msgid "Invalid end date/time:"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:188
+#: usr/local/www/status_rrd_graph_settings.php:65
+msgid "Inverse"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:189
+#: usr/local/www/status_rrd_graph_settings.php:66
+msgid "Absolute"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:250
+#: usr/local/www/status_rrd_graph_settings.php:67
+msgid "Absolute Timespans"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:250
+#: usr/local/www/status_rrd_graph_settings.php:68
+msgid "Current Period"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:250
+#: usr/local/www/status_rrd_graph_settings.php:69
+msgid "Previous Period"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:418
+#: usr/local/www/status_rrd_graph_settings.php:55
+#: usr/local/www/status_rrd_graph_settings.php:137
+msgid "Traffic"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:420
+#: usr/local/www/status_rrd_graph_settings.php:56
+#: usr/local/www/status_rrd_graph_settings.php:139
+msgid "Packets"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:422
+#: usr/local/www/status_rrd_graph_settings.php:57
+#: usr/local/www/status_rrd_graph_settings.php:141
+msgid "Quality"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:427
+#: usr/local/www/status_rrd_graph_settings.php:146
+msgid "QueueDrops"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:435
+#: usr/local/www/status_rrd_graph_settings.php:154
+msgid "Cellular"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:469
+msgid ""
+"Note: Change of color and/or style may not take effect until the next refresh"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:473
+msgid "Graphs:"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:536
+msgid "Style:"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:550
+msgid "Period:"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:566
+msgid "Enter date and/or time. Current timezone:"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:570
+msgid "Start:"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:572
+msgid "End:"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph.php:574
+msgid "Go"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_img.php:44
+msgid "Image viewer"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_img.php:268
+#, php-format
+msgid "rrdcolors.inc.php for theme %s does not exist, using defaults!"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_img.php:1228
+#, php-format
+msgid "Sorry we do not have data to graph for %s"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_img.php:1248
+#, php-format
+msgid "Failed to create graph with error code %1$s, the error is: %2$s"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_img.php:1250
+#: usr/local/www/status_rrd_graph_img.php:1257
+#, php-format
+msgid "failed to create graph from %s%s, removing database"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:185
+msgid "Enables the RRD graphing backend."
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:189
+msgid "Default category"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:200
+msgid "This selects default category."
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:204
+msgid "Default style"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:215
+msgid "This selects the default style."
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:219
+msgid "Default period"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:230
+msgid "This selects the default period."
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:242
+msgid "Reset RRD Data"
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:242
+msgid ""
+"Do you really want to reset the RRD graphs? This will erase all graph data."
+msgstr ""
+
+#: usr/local/www/status_rrd_graph_settings.php:248
+msgid ""
+"Graphs will not be allowed to be recreated within a 1 minute interval, "
+"please take this into account after changing the style."
+msgstr ""
+
+#: usr/local/www/status_services.php:120
+#: usr/local/www/widgets/widgets/services_status.widget.php:90
+msgid "No services found"
+msgstr ""
+
+#: usr/local/www/status_upnp.php:49
+msgid "Rules have been cleared and the daemon restarted"
+msgstr ""
+
+#: usr/local/www/status_upnp.php:59
+msgid "UPnP &amp; NAT-PMP Status"
+msgstr ""
+
+#: usr/local/www/status_upnp.php:69
+msgid "UPnP is currently disabled."
+msgstr ""
+
+#: usr/local/www/status_upnp.php:79
+msgid "all currently connected sessions"
+msgstr ""
+
+#: usr/local/www/status_upnp.php:90
+msgid "Int. Port"
+msgstr ""
+
+#: usr/local/www/status_wireless.php:85
+msgid ""
+"Rescan has been initiated in the background. Refresh this page in 10 seconds "
+"to see the results."
+msgstr ""
+
+#: usr/local/www/status_wireless.php:95
+msgid "Nearby access points or ad-hoc peers"
+msgstr ""
+
+#: usr/local/www/status_wireless.php:142
+msgid "Associated or ad-hoc peers"
+msgstr ""
+
+#: usr/local/www/system.php:122
+msgid "The domain may only contain the characters a-z, 0-9, '-' and '.'."
+msgstr ""
+
+#: usr/local/www/system.php:158
+#, php-format
+msgid ""
+"You can not assign a gateway to DNS '%s' server which is on a directly "
+"connected network."
+msgstr ""
+
+#: usr/local/www/system.php:167
+msgid ""
+"The time update interval must be either 0 (disabled) or between 6 and 1440."
+msgstr ""
+
+#: usr/local/www/system.php:174
+msgid ""
+"A NTP Time Server name may only contain the characters a-z, 0-9, '-' and '.'."
+msgstr ""
+
+#: usr/local/www/system.php:316
+msgid "Name of the firewall host, without domain part"
+msgstr ""
+
+#: usr/local/www/system.php:327
+msgid ""
+"Do not use 'local' as a domain name. It will cause local hosts running mDNS "
+"(avahi, bonjour, etc.) to be unable to resolve local hosts not running mDNS."
+msgstr ""
+
+#: usr/local/www/system.php:329
+msgid "mycorp.com, home, office, private, etc."
+msgstr ""
+
+#: usr/local/www/system.php:339
+msgid "DNS Server"
+msgstr ""
+
+#: usr/local/www/system.php:341
+msgid "Use gateway"
+msgstr ""
+
+#: usr/local/www/system.php:388
+msgid ""
+"Enter IP addresses to be used by the system for DNS resolution. These are "
+"also used for the DHCP service, DNS forwarder and for PPTP VPN clients."
+msgstr ""
+
+#: usr/local/www/system.php:393
+msgid ""
+"In addition, optionally select the gateway for each DNS server. When using "
+"multiple WAN connections there should be at least one unique DNS server per "
+"gateway."
+msgstr ""
+
+#: usr/local/www/system.php:400
+msgid "Allow DNS server list to be overridden by DHCP/PPP on WAN"
+msgstr ""
+
+#: usr/local/www/system.php:403
+#, php-format
+msgid ""
+"If this option is set, %s will use DNS servers assigned by a DHCP/PPP server "
+"on WAN for its own purposes (including the DNS forwarder). However, they "
+"will not be assigned to DHCP and PPTP VPN clients."
+msgstr ""
+
+#: usr/local/www/system.php:412
+msgid "Do not use the DNS Forwarder or Resolver as a DNS server for the firewall"
+msgstr ""
+
+#: usr/local/www/system.php:415
+msgid ""
+"By default localhost (127.0.0.1) will be used as the first DNS server where "
+"the DNS Forwarder or DNS Resolver is enabled and set to listen on Localhost, "
+"so system can use the local DNS service to perform lookups. Checking this "
+"box omits localhost from the list of DNS servers."
+msgstr ""
+
+#: usr/local/www/system.php:421
+msgid "Time zone"
+msgstr ""
+
+#: usr/local/www/system.php:433
+msgid "Select the location closest to you"
+msgstr ""
+
+#: usr/local/www/system.php:451
+msgid "NTP time server"
+msgstr ""
+
+#: usr/local/www/system.php:456
+msgid ""
+"Use a space to separate multiple hosts (only one required). Remember to set "
+"up at least one DNS server if you enter a host name here!"
+msgstr ""
+
+#: usr/local/www/system.php:463
+msgid "Language"
+msgstr ""
+
+#: usr/local/www/system.php:476
+msgid "Choose a language for the webConfigurator"
+msgstr ""
+
+#: usr/local/www/system.php:485
+msgid "Theme"
+msgstr ""
+
+#: usr/local/www/system.php:509
+msgid "This will change the look and feel of"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:90
+msgid "You must specify a valid webConfigurator port number"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:94
+msgid "Max Processes must be a number 1 or greater"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:100
+#, php-format
+msgid "Alternate hostname %s is not a valid hostname."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:247
+#, php-format
+msgid "One moment...redirecting to %s in 20 seconds."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:275
+msgid "Advanced: Admin Access"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:307
+#: usr/local/www/system_advanced_firewall.php:270
+#: usr/local/www/system_advanced_misc.php:287
+#: usr/local/www/system_advanced_network.php:188
+#: usr/local/www/system_advanced_notifications.php:184
+#: usr/local/www/system_advanced_sysctl.php:157
+msgid "Admin Access"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:308
+#: usr/local/www/system_advanced_firewall.php:271
+#: usr/local/www/system_advanced_misc.php:288
+#: usr/local/www/system_advanced_network.php:189
+#: usr/local/www/system_advanced_notifications.php:185
+#: usr/local/www/system_advanced_sysctl.php:158
+msgid "Firewall / NAT"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:309
+#: usr/local/www/system_advanced_firewall.php:272
+#: usr/local/www/system_advanced_misc.php:289
+#: usr/local/www/system_advanced_network.php:190
+#: usr/local/www/system_advanced_notifications.php:186
+#: usr/local/www/system_advanced_sysctl.php:159
+msgid "Networking"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:310
+#: usr/local/www/system_advanced_firewall.php:273
+#: usr/local/www/system_advanced_misc.php:290
+#: usr/local/www/system_advanced_network.php:191
+#: usr/local/www/system_advanced_notifications.php:187
+#: usr/local/www/system_advanced_sysctl.php:160
+msgid "Miscellaneous"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:311
+#: usr/local/www/system_advanced_firewall.php:274
+#: usr/local/www/system_advanced_misc.php:291
+#: usr/local/www/system_advanced_network.php:192
+#: usr/local/www/system_advanced_notifications.php:188
+#: usr/local/www/system_advanced_sysctl.php:161
+msgid "System Tunables"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:312
+#: usr/local/www/system_advanced_firewall.php:275
+#: usr/local/www/system_advanced_misc.php:292
+#: usr/local/www/system_advanced_network.php:193
+#: usr/local/www/system_advanced_notifications.php:189
+#: usr/local/www/system_advanced_sysctl.php:162
+msgid "Notifications"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:330
+msgid "webConfigurator"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:350
+msgid "No Certificates have been defined. You must"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:351
+msgid "Create or Import"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:352
+msgid "a Certificate before SSL can be enabled."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:376
+msgid "TCP port"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:381
+msgid ""
+"Enter a custom port number for the webConfigurator above if you want to "
+"override the default (80 for HTTP, 443 for HTTPS). Changes will take effect "
+"immediately after save."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:388
+msgid "Max Processes"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:393
+msgid ""
+"Enter the number of webConfigurator processes you want to run. This defaults "
+"to 2. Increasing this will allow more users/browsers to access the GUI "
+"concurrently."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:400
+msgid "WebGUI redirect"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:403
+msgid "Disable webConfigurator redirect rule"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:405
+msgid ""
+"When this is unchecked, access to the webConfigurator is always permitted "
+"even on port 80, regardless of the listening port configured. Check this box "
+"to disable this automatically added redirect rule. "
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:412
+msgid "WebGUI Login Autocomplete"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:415
+msgid "Enable webConfigurator login autocomplete"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:417
+msgid ""
+"When this is checked, login credentials for the webConfigurator may be saved "
+"by the browser. While convenient, some security standards require this to be "
+"disabled. Check this box to enable autocomplete on the login form so that "
+"browsers will prompt to save credentials (NOTE: Some browsers do not respect "
+"this option). "
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:424
+msgid "WebGUI login messages"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:427
+msgid "Disable logging of webConfigurator successful logins"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:429
+msgid ""
+"When this is checked, successful logins to the webConfigurator will not be "
+"logged."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:435
+msgid "Anti-lockout"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:444
+msgid "Disable webConfigurator anti-lockout rule"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:446
+#, php-format
+msgid ""
+"When this is unchecked, access to the webConfigurator on the %s interface is "
+"always permitted, regardless of the user-defined firewall rule set. Check "
+"this box to disable this automatically added rule, so access to the "
+"webConfigurator is controlled by the user-defined firewall rules (ensure you "
+"have a firewall rule in place that allows you in, or you will lock yourself "
+"out!)"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:452
+msgid ""
+"Hint: the &quot;Set interface(s) IP address&quot; option in the console menu "
+"resets this setting as well."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:456
+msgid "DNS Rebind Check"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:459
+msgid "Disable DNS Rebinding Checks"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:461
+msgid ""
+"When this is unchecked, your system is protected against <a href=\"http://en."
+"wikipedia.org/wiki/DNS_rebinding\">DNS Rebinding attacks</a>. This blocks "
+"private IP responses from your configured DNS servers. Check this box to "
+"disable this protection if it interferes with webConfigurator access or name "
+"resolution in your environment. "
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:468
+msgid "Alternate Hostnames"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:472
+msgid "Alternate Hostnames for DNS Rebinding and HTTP_REFERER Checks"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:474
+msgid ""
+"Here you can specify alternate hostnames by which the router may be queried, "
+"to bypass the DNS Rebinding Attack checks. Separate hostnames with spaces."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:479
+msgid "Browser HTTP_REFERER enforcement"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:482
+msgid "Disable HTTP_REFERER enforcement check"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:484
+msgid ""
+"When this is unchecked, access to the webConfigurator is protected against "
+"HTTP_REFERER redirection attempts. Check this box to disable this protection "
+"if you find that it interferes with webConfigurator access in certain corner "
+"cases such as using external scripts to interact with this system. More "
+"information on HTTP_REFERER is available from <a target='_blank' "
+"href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:491
+msgid "BEAST Attack Protection"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:494
+msgid "Mitigate the BEAST SSL Attack"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:496
+msgid ""
+"When this is checked, the webConfigurator can mitigate BEAST SSL attacks. "
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:499
+#, php-format
+msgid ""
+"This option has been automatically disabled because a conflicting "
+"cryptographic accelerator card has been detected (%s)."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:501
+msgid ""
+"This option is off by default because Hifn accelerators do NOT work with "
+"this option, and the GUI will not function. It is possible that other "
+"accelerators have a similar problem that is not yet known/documented. More "
+"information on BEAST is available from <a target='_blank' href='https://en."
+"wikipedia.org/wiki/Transport_Layer_Security#BEAST_attack'>Wikipedia</a>."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:507
+msgid "Browser tab text"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:510
+msgid "Display page name first in browser tab"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:512
+msgid ""
+"When this is unchecked, the browser tab shows the host name followed by the "
+"current page. "
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:514
+msgid "Check this box to display the current page followed by the host name."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:521
+msgid "Secure Shell"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:524
+msgid "Secure Shell Server"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:527
+msgid "Enable Secure Shell"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:531
+msgid "Authentication Method"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:534
+msgid "Disable password login for Secure Shell (RSA/DSA key only)"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:536
+msgid "When enabled, authorized keys need to be configured for each"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:537
+msgid "user"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:538
+msgid "that has been granted secure shell access."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:542
+msgid "SSH port"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:546
+msgid "Note: Leave this blank for the default of 22."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:553
+msgid "Serial Communications"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:557
+msgid "Serial Terminal"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:560
+msgid ""
+"Enables the first serial port with 115200/8/N/1 by default, or another speed "
+"selectable below."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:561
+msgid ""
+"Note: This will redirect the console output and messages to the serial "
+"port. You can still access the console menu from the internal video card/"
+"keyboard. A <b>null modem</b> serial cable or adapter is required to use the "
+"serial console."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:566
+msgid "Serial Speed"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:576
+msgid "Allows selection of different speeds for the serial console port."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:581
+msgid "Primary Console"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:587
+msgid ""
+"Select the preferred console if multiple consoles are present. The preferred "
+"console will show pfSense boot script output. All consoles display OS boot "
+"messages, console messages, and the console menu."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:595
+msgid "Console Options"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:598
+msgid "Console menu"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:601
+msgid "Password protect the console menu"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:603
+msgid "Changes to this option will take effect after a reboot."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:640
+msgid "secure shell configuration has changed. Stopping sshd."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:643
+msgid "secure shell configuration has changed. Restarting sshd."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:82
+msgid "The Firewall Adaptive values must be set together."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:84
+msgid "The Firewall Adaptive Start value must be an integer."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:87
+msgid "The Firewall Adaptive End value must be an integer."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:90
+msgid "The Firewall Maximum States value must be an integer."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:93
+msgid "The Aliases Hostname Resolve Interval value must be an integer."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:96
+msgid "The Firewall Maximum Table Entries value must be an integer."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:99
+msgid "The TCP idle timeout must be an integer."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:102
+msgid "The Reflection timeout must be an integer."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:233
+msgid "Advanced: Firewall and NAT"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:245
+msgid "as the name says, it's the normal optimization algorithm"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:246
+msgid ""
+"used for high latency links, such as satellite links. Expires idle "
+"connections later than default"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:247
+msgid ""
+"expires idle connections quicker. More efficient use of CPU and memory but "
+"can drop legitimate idle connections"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:248
+msgid ""
+"tries to avoid dropping any legitimate idle connections at the expense of "
+"increased memory usage and CPU utilization."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:293
+msgid "Firewall Advanced"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:296
+msgid "IP Do-Not-Fragment compatibility"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:299
+msgid "Clear invalid DF bits instead of dropping the packets"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:300
+msgid ""
+"This allows for communications with hosts that generate fragmented packets "
+"with the don't fragment (DF) bit set. Linux NFS is known to do this. This "
+"will cause the filter to not drop such packets but instead clear the don't "
+"fragment bit."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:307
+msgid "IP Random id generation"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:310
+msgid ""
+"Insert a stronger id into IP header of packets passing through the filter."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:311
+msgid ""
+"Replaces the IP identification field of packets with random values to "
+"compensate for operating systems that use predictable values. This option "
+"only applies to packets that are not fragmented after the optional packet "
+"reassembly."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:318
+msgid "Firewall Optimization Options"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:321
+msgid "normal"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:322
+msgid "high-latency"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:323
+msgid "aggressive"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:324
+msgid "conservative"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:334
+msgid "Select the type of state table optimization to use"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:338
+msgid "Disable Firewall"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:341
+msgid "Disable all packet filtering."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:343
+#, php-format
+msgid "Note: This converts %s into a routing only platform!"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:344
+msgid "Note: This will also turn off NAT!"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:345
+msgid "If you only want to disable NAT, and not firewall rules, visit the"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:345
+msgid "Outbound NAT"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:350
+msgid "Disable Firewall Scrub"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:353
+msgid ""
+"Disables the PF scrubbing option which can sometimes interfere with NFS and "
+"PPTP traffic."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:358
+msgid "Firewall Adaptive Timeouts"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:360
+msgid ""
+"Timeouts for states can be scaled adaptively as the number of state table "
+"entries grows."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:363
+msgid ""
+"When the number of state entries exceeds this value, adaptive scaling "
+"begins. All timeout values are scaled linearly with factor (adaptive.end - "
+"number of states) / (adaptive.end - adaptive.start)."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:367
+msgid ""
+"When reaching this number of state entries, all timeout values become zero, "
+"effectively purging all state entries immediately. This value is used to "
+"define the scale factor, it should not actually be reached (set a lower "
+"state limit, see below)."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:369
+msgid "Note: Leave this blank for the default(0)."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:373
+msgid "Firewall Maximum States"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:377
+msgid "Maximum number of connections to hold in the firewall state table."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:379
+msgid ""
+"Note: Leave this blank for the default. On your system the default size is:"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:383
+msgid "Firewall Maximum Table Entries"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:387
+msgid ""
+"Maximum number of table entries for systems such as aliases, sshlockout, "
+"snort, etc, combined."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:390
+msgid "Note: Leave this blank for the default."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:392
+msgid "On your system the default size is:"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:398
+msgid "Static route filtering"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:401
+msgid "Bypass firewall rules for traffic on the same interface"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:403
+msgid ""
+"This option only applies if you have defined one or more static routes. If "
+"it is enabled, traffic that enters and leaves through the same interface "
+"will not be checked by the firewall. This may be desirable in some "
+"situations where multiple subnets are connected to the same interface."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:413
+msgid "Disable all auto-added VPN rules."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:415
+msgid "Note: This disables automatically added rules for IPsec, PPTP."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:423
+msgid "Disable reply-to on WAN rules"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:425
+msgid ""
+"With Multi-WAN you generally want to ensure traffic leaves the same "
+"interface it arrives on, hence reply-to is added automatically by default. "
+"When using bridging, you must disable this behavior if the WAN gateway IP is "
+"different from the gateway IP of the hosts behind the bridged interface."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:434
+msgid "Disable Negate rule on policy routing rules"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:436
+msgid ""
+"With Multi-WAN you generally want to ensure traffic reaches directly "
+"connected networks and VPN networks when using policy routing. You can "
+"disable this for special purposes but it requires manually creating rules "
+"for these networks"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:441
+msgid "Aliases Hostnames Resolve Interval"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:445
+msgid ""
+"Interval, in seconds, that will be used to resolve hostnames configured on "
+"aliases."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:447
+msgid "Note: Leave this blank for the default (300s)."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:451
+msgid "Check certificate of aliases URLs"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:454
+msgid "Verify HTTPS certificates when downloading alias URLs"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:456
+msgid ""
+"Make sure the certificate is valid for all HTTPS addresses on aliases. If "
+"it's not valid or is revoked, do not download it."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:464
+msgid "Bogon Networks"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:467
+msgid "Update Frequency"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:470
+msgid "Monthly"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:471
+msgid "Weekly"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:472
+msgid "Daily"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:475
+msgid ""
+"The frequency of updating the lists of IP addresses that are reserved (but "
+"not RFC 1918) or not yet assigned by IANA."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:483
+msgid "Network Address Translation"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:486
+msgid "NAT Reflection mode for port forwards"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:494
+msgid ""
+"When enabled, this automatically creates additional NAT redirect rules for "
+"access to port forwards on your external IP addresses from within your "
+"internal networks."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:496
+msgid ""
+"The NAT + proxy mode uses a helper program to send packets to the target of "
+"the port forward. It is useful in setups where the interface and/or gateway "
+"IP used for communication with the target cannot be accurately determined at "
+"the time the rules are loaded. Reflection rules are not created for ranges "
+"larger than 500 ports and will not be used for more than 1000 ports total "
+"between all port forwards. Only TCP and UDP protocols are supported."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:498
+msgid ""
+"The pure NAT mode uses a set of NAT rules to direct packets to the target of "
+"the port forward. It has better scalability, but it must be possible to "
+"accurately determine the interface and gateway IP used for communication "
+"with the target at the time the rules are loaded. There are no inherent "
+"limits to the number of ports other than the limits of the protocols. All "
+"protocols available for port forwards are supported."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:500
+#: usr/local/www/system_advanced_firewall.php:520
+msgid ""
+"Individual rules may be configured to override this system setting on a per-"
+"rule basis."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:504
+msgid "Reflection Timeout"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:507
+msgid "Enter value for Reflection timeout in seconds."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:509
+msgid "Note: Only applies to Reflection on port forwards in NAT + proxy mode."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:513
+msgid "Enable NAT Reflection for 1:1 NAT"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:516
+msgid ""
+"Enables the automatic creation of additional NAT redirect rules for access "
+"to 1:1 mappings of your external IP addresses from within your internal "
+"networks."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:518
+msgid ""
+"Note: Reflection on 1:1 mappings is only for the inbound component of the "
+"1:1 mappings. This functions the same as the pure NAT mode for port "
+"forwards. For more details, refer to the pure NAT mode description above."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:524
+msgid "Enable automatic outbound NAT for Reflection"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:527
+msgid ""
+"Automatically create outbound NAT rules which assist inbound NAT rules that "
+"direct traffic back out to the same subnet it originated from."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:529
+msgid ""
+"Required for full functionality of the pure NAT mode of NAT Reflection for "
+"port forwards or NAT Reflection for 1:1 NAT."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:531
+msgid ""
+"Note: This only works for assigned interfaces. Other interfaces require "
+"manually creating the outbound NAT rules that direct the reply packets back "
+"through the router."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:535
+msgid "TFTP Proxy"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:550
+msgid "Choose the interfaces where you want TFTP proxy helper to be enabled."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:85
+msgid "AMD Geode LX Security Block"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:86
+msgid "AES-NI CPU-based Acceleration"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:88
+msgid "Intel Core* CPU on-die thermal sensor"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:89
+msgid "AMD K8, K10 and K11 CPU on-die thermal sensor"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:100
+msgid "Please select a valid Cryptographic Accelerator."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:103
+msgid "Please select a valid Thermal Hardware Sensor."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:106
+msgid "/tmp Size must be numeric and should not be less than 40MB."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:109
+msgid "/var Size must be numeric and should not be less than 60MB."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:245
+msgid "Advanced: Miscellaneous"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:310
+msgid "Proxy support"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:313
+msgid "Proxy URL"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:317
+#, php-format
+msgid ""
+"Hostname or IP address of proxy server this system will use for its outbound "
+"Internet access."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:321
+msgid "Proxy Port"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:325
+#, php-format
+msgid "Port where proxy server is listening."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:329
+msgid "Proxy Username"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:333
+#, php-format
+msgid ""
+"Username for authentication to proxy server. Optional, leave blank to not "
+"use authentication."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:337
+msgid "Proxy Password"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:341
+#, php-format
+msgid "Password for authentication to proxy server."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:345
+#: usr/local/www/system_advanced_misc.php:348
+#: usr/local/www/system_advanced_misc.php:369
+msgid "Load Balancing"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:351
+msgid "Use sticky connections"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:352
+msgid ""
+"Successive connections will be redirected to the servers in a round-robin "
+"manner with connections from the same source being sent to the same web "
+"server. This 'sticky connection' will exist as long as there are states that "
+"refer to this connection. Once the states expire, so will the sticky "
+"connection. Further connections from that host will be redirected to the "
+"next web server in the round robin. Changing this option will restart the "
+"Load Balancing service."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:363
+msgid ""
+"Set the source tracking timeout for sticky connections. By default this is "
+"0, so source tracking is removed as soon as the state expires. Setting this "
+"timeout higher will cause the source/destination relationship to persist for "
+"longer periods of time."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:372
+msgid "Enable default gateway switching"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:373
+msgid ""
+"If the default gateway goes down, switch the default gateway to another "
+"available one. This is not enabled by default, as it's unnecessary in most "
+"all scenarios, which instead use gateway groups."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:381
+msgid "Power savings"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:384
+msgid "PowerD"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:387
+msgid "Use PowerD"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:389
+msgid "On AC Power Mode"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:391
+#: usr/local/www/system_advanced_misc.php:399
+#: usr/local/www/system_advanced_misc.php:407
+msgid "Hiadaptive"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:392
+#: usr/local/www/system_advanced_misc.php:400
+#: usr/local/www/system_advanced_misc.php:408
+msgid "Adaptive"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:393
+#: usr/local/www/system_advanced_misc.php:401
+#: usr/local/www/system_advanced_misc.php:409
+msgid "Minimum"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:394
+#: usr/local/www/system_advanced_misc.php:402
+#: usr/local/www/system_advanced_misc.php:410
+msgid "Maximum"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:397
+msgid "On Battery Power Mode"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:405
+msgid "On Unknown Power Mode"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:413
+msgid ""
+"The powerd utility monitors the system state and sets various power control "
+"options accordingly. It offers four modes (maximum, minimum, adaptive and "
+"hiadaptive) that can be individually selected while on AC power or "
+"batteries. The modes maximum, minimum, adaptive and hiadaptive may be "
+"abbreviated max, min, adp, hadp. Maximum mode chooses the highest "
+"performance values. Minimum mode selects the lowest performance values to "
+"get the most power savings. Adaptive mode attempts to strike a balance by "
+"degrading performance when the system appears idle and increasing it when "
+"the system is busy. It offers a good balance between a small performance "
+"loss for greatly increased power savings. Hiadaptive mode is alike adaptive "
+"mode, but tuned for systems where performance and interactivity are more "
+"important than power consumption. It raises frequency faster, drops slower "
+"and keeps twice lower CPU load."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:432
+msgid "Cryptographic Hardware Acceleration"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:435
+msgid "Cryptographic Hardware"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:444
+msgid ""
+"A cryptographic accelerator module will use hardware support to speed up "
+"some cryptographic functions on systems which have the chip. Do not enable "
+"this option if you have a Hifn cryptographic acceleration card, as this will "
+"take precedence and the Hifn card will not be used. Acceleration should be "
+"automatic for IPsec when using a cipher supported by your chip, such as "
+"AES-128. OpenVPN should be set for AES-128-CBC and have cryptodev enabled "
+"for hardware acceleration."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:452
+msgid ""
+"If you do not have a crypto chip in your system, this option will have no "
+"effect. To unload the selected module, set this option to 'none' and then "
+"reboot."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:460
+#: usr/local/www/system_advanced_misc.php:463
+msgid "Thermal Sensors"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:466
+msgid "None/ACPI"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:472
+msgid ""
+"If you have a supported CPU, selecting a themal sensor will load the "
+"appropriate driver to read its temperature. Setting this to 'None' will "
+"attempt to read the temperature from an ACPI-compliant motherboard sensor "
+"instead, if one is present."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:476
+msgid ""
+"If you do not have a supported thermal sensor chip in your system, this "
+"option will have no effect. To unload the selected module, set this option "
+"to 'none' and then reboot."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:484
+msgid "IP Security"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:489
+msgid ""
+"These settings have moved to <a href=\"vpn_ipsec_settings.php\">VPN &gt; "
+"IPsec on the Advanced Settings tab</a>."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:499
+msgid "Schedule States"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:503
+msgid ""
+"By default, when a schedule expires, connections permitted by that schedule "
+"are killed. This option overrides that behavior by not clearing states for "
+"existing connections."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:511
+msgid "Gateway Monitoring"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:514
+msgid "State Killing on Gateway Failure"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:518
+msgid ""
+"The monitoring process will flush states for a gateway that goes down if "
+"this box is not checked. Check this box to disable this behavior."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:522
+msgid "Skip rules when gateway is down"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:526
+msgid ""
+"By default, when a rule has a gateway specified and this gateway is down, "
+"the rule is created omitting the gateway. This option overrides that "
+"behavior by omitting the entire rule instead."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:532
+msgid "Enable gateway monitoring debug logging"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:536
+msgid ""
+"Enable this setting to log debug information from the gateway monitoring "
+"process to the system logs."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:540
+msgid "RAM Disk Settings (Reboot to Apply Changes)"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:544
+msgid "Use RAM Disks"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:547
+msgid "Use memory file system for /tmp and /var"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:548
+msgid ""
+"Set this if you wish to use /tmp and /var as RAM disks (memory file system "
+"disks) on a full install rather than use the hard disk. Setting this will "
+"cause the data in /tmp and /var to be lost at reboot, including log data. "
+"RRD and DHCP Leases will be retained."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:554
+msgid "/tmp RAM Disk Size"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:558
+msgid ""
+"Set the size, in MB, for the /tmp RAM disk. Leave blank for 40MB. Do not set "
+"lower than 40."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:563
+msgid "/var RAM Disk Size"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:567
+msgid ""
+"Set the size, in MB, for the /var RAM disk. Leave blank for 60MB. Do not set "
+"lower than 60."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:572
+msgid "Periodic RRD Backup"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:574
+#: usr/local/www/system_advanced_misc.php:590
+msgid "Frequency:"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:578
+#: usr/local/www/system_advanced_misc.php:594
+msgid "hour"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:582
+msgid ""
+"This will periodically backup the RRD data so it can be restored "
+"automatically on the next boot. Keep in mind that the more frequent the "
+"backup, the more writes will happen to your media."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:588
+msgid "Periodic DHCP Leases Backup"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:598
+msgid ""
+"This will periodically backup the DHCP leases data so it can be restored "
+"automatically on the next boot. Keep in mind that the more frequent the "
+"backup, the more writes will happen to your media."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:608
+msgid "Hardware Settings"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:611
+msgid "Hard disk standby time "
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:618
+msgid "Always on"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:627
+msgid ""
+"Puts the hard disk into standby mode when the selected amount of time after "
+"the last access has elapsed."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:628
+msgid "Do not set this for CF cards."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:637
+msgid "Package settings"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:640
+msgid "Package signature"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:643
+msgid "Do NOT check package signature"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:644
+msgid ""
+"Enable this option to allow pfSense to install any package without checking "
+"its signature."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:68
+msgid "You must specify an IP address to NAT IPv6 packets."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:154
+msgid "Advanced: Networking"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:211
+msgid "IPv6 Options"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:214
+#: usr/local/www/system_advanced_network.php:217
+msgid "Allow IPv6"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:218
+msgid ""
+"All IPv6 traffic will be blocked by the firewall unless this box is checked."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:219
+msgid ""
+"NOTE: This does not disable any IPv6 features on the firewall, it only "
+"blocks traffic."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:224
+msgid "IPv6 over IPv4 Tunneling"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:227
+msgid "Enable IPv4 NAT encapsulation of IPv6 packets"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:228
+msgid ""
+"This provides an RFC 2893 compatibility mechanism that can be used to "
+"tunneling IPv6 packets over IPv4 routing infrastructures. If enabled, don't "
+"forget to add a firewall rule to permit IPv6 packets."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:238
+msgid "Prefer IPv4 over IPv6"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:241
+msgid "Prefer to use IPv4 even if IPv6 is available"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:242
+msgid ""
+"By default, if a hostname resolves IPv6 and IPv4 addresses IPv6 will be "
+"used, if you check this option, IPv4 will be used instead of IPv6."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:254
+msgid "Device polling"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:257
+msgid "Enable device polling"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:258
+#, php-format
+msgid ""
+"Device polling is a technique that lets the system periodically poll network "
+"devices for new data instead of relying on interrupts. This prevents your "
+"webConfigurator, SSH, etc. from being inaccessible due to interrupt floods "
+"when under extreme load. Generally this is not recommended. Not all NICs "
+"support polling; see the %s homepage for a list of supported cards."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:262
+msgid "Hardware Checksum Offloading"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:265
+msgid "Disable hardware checksum offload"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:266
+msgid ""
+"Checking this option will disable hardware checksum offloading. Checksum "
+"offloading is broken in some hardware, particularly some Realtek cards. "
+"Rarely, drivers may have problems with checksum offloading and some specific "
+"NICs."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:269
+#: usr/local/www/system_advanced_network.php:280
+#: usr/local/www/system_advanced_network.php:291
+msgid ""
+"This will take effect after you reboot the machine or re-configure each "
+"interface."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:273
+msgid "Hardware TCP Segmentation Offloading"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:276
+msgid "Disable hardware TCP segmentation offload"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:277
+msgid ""
+"Checking this option will disable hardware TCP segmentation offloading (TSO, "
+"TSO4, TSO6). This offloading is broken in some hardware drivers, and may "
+"impact performance with some specific NICs."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:284
+msgid "Hardware Large Receive Offloading"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:287
+msgid "Disable hardware large receive offload"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:288
+msgid ""
+"Checking this option will disable hardware large receive offloading (LRO). "
+"This offloading is broken in some hardware drivers, and may impact "
+"performance with some specific NICs."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:295
+msgid "ARP Handling"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:298
+msgid "Suppress ARP messages"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:299
+msgid ""
+"This option will suppress ARP log messages when multiple interfaces reside "
+"on the same broadcast domain"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:147
+#: usr/local/www/system_advanced_notifications.php:243
+msgid "Test Growl"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:153
+#: usr/local/www/system_advanced_notifications.php:160
+#, php-format
+msgid "This is a test message from %s. It is safe to ignore this message."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:156
+#: usr/local/www/system_advanced_notifications.php:315
+msgid "Test SMTP"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:164
+msgid "Advanced: Notifications"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:201
+msgid "Growl"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:204
+msgid "Disable Growl Notifications"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:207
+msgid ""
+"Check this option to disable growl notifications but preserve the settings "
+"below."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:211
+msgid "Registration Name"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:214
+msgid "Enter the name to register with the Growl server (default: PHP-Growl)."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:218
+msgid "Notification Name"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:221
+#, php-format
+msgid "Enter a name for the Growl notifications (default: %s growl alert)."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:228
+msgid ""
+"This is the IP address that you would like to send growl notifications to."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:235
+msgid "Enter the password of the remote growl notification device."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:244
+msgid ""
+"NOTE: A test notification will be sent even if the service is marked as "
+"disabled."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:252
+msgid "SMTP E-Mail"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:255
+msgid "Disable SMTP Notifications"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:258
+msgid ""
+"Check this option to disable SMTP notifications but preserve the settings "
+"below. Some other mechanisms, such as packages, may need these settings in "
+"place to function."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:262
+msgid "E-Mail server"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:265
+msgid ""
+"This is the FQDN or IP address of the SMTP E-Mail server to which "
+"notifications will be sent."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:269
+msgid "SMTP Port of E-Mail server"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:272
+msgid ""
+"This is the port of the SMTP E-Mail server, typically 25, 587 (submission) "
+"or 465 (smtps)"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:276
+msgid "Secure SMTP Connection"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:283
+msgid "From e-mail address"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:286
+msgid "This is the e-mail address that will appear in the from field."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:290
+msgid "Notification E-Mail address"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:293
+msgid ""
+"Enter the e-mail address that you would like email notifications sent to."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:297
+msgid "Notification E-Mail auth username (optional)"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:300
+msgid "Enter the e-mail address username for SMTP authentication."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:304
+msgid "Notification E-Mail auth password"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:307
+msgid "Enter the e-mail address password for SMTP authentication."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:316
+msgid ""
+"NOTE: A test message will be sent even if the service is marked as disabled."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:324
+msgid "System Sounds"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:327
+msgid "Startup/Shutdown Sound"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:330
+msgid "Disable the startup/shutdown beep"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:332
+msgid "When this is checked, startup and shutdown sounds will no longer play."
+msgstr ""
+
+#: usr/local/www/system_advanced_sysctl.php:135
+msgid "Advanced: System Tunables"
+msgstr ""
+
+#: usr/local/www/system_advanced_sysctl.php:149
+msgid ""
+"The firewall tunables have changed. You must apply the configuration to "
+"take affect."
+msgstr ""
+
+#: usr/local/www/system_advanced_sysctl.php:181
+msgid "Tunable Name"
+msgstr ""
+
+#: usr/local/www/system_advanced_sysctl.php:246
+msgid "Edit system tunable"
+msgstr ""
+
+#: usr/local/www/system_advanced_sysctl.php:249
+msgid "Tunable"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:45
+msgid "Authentication Servers"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:86
+msgid "deleted"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:189
+#: usr/local/www/system_authservers.php:465
+#: usr/local/www/system_camanager.php:170
+#: usr/local/www/system_camanager.php:182
+#: usr/local/www/system_camanager.php:197
+#: usr/local/www/system_camanager.php:379
+#: usr/local/www/system_certmanager.php:206
+#: usr/local/www/system_certmanager.php:218
+#: usr/local/www/system_certmanager.php:236
+#: usr/local/www/system_certmanager.php:420
+#: usr/local/www/system_certmanager.php:621
+#: usr/local/www/system_certmanager.php:1030
+#: usr/local/www/system_crlmanager.php:195
+#: usr/local/www/system_crlmanager.php:202
+#: usr/local/www/system_crlmanager.php:327
+#: usr/local/www/system_crlmanager.php:417
+#: usr/local/www/system_usermanager.php:217
+#: usr/local/www/system_usermanager.php:795
+msgid "Descriptive name"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:169
+#: usr/local/www/system_authservers.php:512
+msgid "Port value"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:170
+#: usr/local/www/system_authservers.php:518
+msgid "Transport"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:171
+#: usr/local/www/system_authservers.php:554
+msgid "Protocol version"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:172
+msgid "Search level"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:173
+msgid "User naming Attribute"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:174
+msgid "Group naming Attribute"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:175
+#: usr/local/www/system_authservers.php:693
+msgid "Group member attribute"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:176
+msgid "Authentication container"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:181
+msgid "Bind user DN"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:182
+msgid "Bind Password"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:197
+#: usr/local/www/system_authservers.php:765
+msgid "Authentication port value"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:203
+#: usr/local/www/system_authservers.php:771
+msgid "Accounting port value"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:208
+#: usr/local/www/system_authservers.php:744
+msgid "Shared Secret"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:215
+msgid "The host name contains invalid characters."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:218
+msgid "An authentication server with the same name already exists."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:221
+msgid "RADIUS Timeout value must be numeric and positive."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:405
+msgid "Please fill the required values."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:411
+msgid "Please fill the bind username/password."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:433
+#: usr/local/www/system_usermanager_settings.php:103
+msgid "Popup blocker detected. Action aborted."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:448
+#: usr/local/www/system_groupmanager.php:288
+#: usr/local/www/system_groupmanager_addprivs.php:168
+#: usr/local/www/system_usermanager.php:494
+#: usr/local/www/system_usermanager_addprivs.php:157
+#: usr/local/www/system_usermanager_settings.php:114
+#: usr/local/www/vpn_l2tp.php:286 usr/local/www/vpn_l2tp_users.php:39
+#: usr/local/www/vpn_l2tp_users.php:95 usr/local/www/vpn_pptp.php:307
+#: usr/local/www/vpn_pptp_users.php:72 usr/local/www/vpn_pptp_users.php:92
+msgid "Users"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:502
+msgid "LDAP Server Settings"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:505
+#: usr/local/www/system_authservers.php:738
+msgid "Hostname or IP address"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:508
+msgid ""
+"NOTE: When using SSL, this hostname MUST match the Common Name (CN) of the "
+"LDAP server's SSL Certificate."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:533
+#: usr/local/www/vpn_openvpn_client.php:751
+#: usr/local/www/vpn_openvpn_server.php:948
+msgid "Peer Certificate Authority"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:546
+msgid "This option is used if 'SSL Encrypted' option is choosen."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:547
+msgid "It must match with the CA in the AD otherwise problems will arise."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:569
+msgid "Search scope"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:573
+msgid "Level:"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:588
+msgid "Base DN:"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:598
+msgid "Authentication containers"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:602
+msgid "Containers:"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:606
+msgid ""
+"Note: Semi-Colon separated. This will be prepended to the search base dn "
+"above or you can specify full container path containing a dc= component."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:607
+#: usr/local/www/system_authservers.php:608
+#: usr/local/www/system_authservers.php:625
+msgid "Example:"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:615
+msgid "Extended Query"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:632
+msgid "Bind credentials"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:640
+msgid "Use anonymous binds to resolve distinguished names"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:649
+msgid "User DN:"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:665
+msgid "Initial Template"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:681
+msgid "User naming attribute"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:687
+msgid "Group naming attribute"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:699
+msgid "UTF8 Encode"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:707
+msgid ""
+"UTF8 encode LDAP parameters before sending them to the server. Required to "
+"support international characters, but may not be supported by every LDAP "
+"server."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:714
+msgid "Username Alterations"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:722
+msgid ""
+"Do not strip away parts of the username after the @ symbol, e.g. user@host "
+"becomes user when unchecked."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:735
+msgid "Radius Server Settings"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:750
+msgid "Services offered"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:777
+msgid "Authentication Timeout"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:780
+msgid ""
+"This value controls how long, in seconds, that the RADIUS server may take to "
+"respond to an authentication request."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:781
+msgid "If left blank, the default value is 5 seconds."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:782
+msgid ""
+"NOTE: If you are using an interactive two-factor authentication system, "
+"increase this timeout to account for how long it will take the user to "
+"receive and enter a token."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:805
+msgid "Server Name"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:816
+#: usr/local/www/vpn_openvpn_server.php:1842
+msgid "add server"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:823
+msgid "Additional authentication servers can be added here."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:843
+#: usr/local/www/vpn_openvpn_server.php:1871
+msgid "edit server"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:846
+msgid "Do you really want to delete this Server?"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:847
+#: usr/local/www/vpn_openvpn_server.php:1875
+msgid "delete server"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:45
+msgid "Import an existing Certificate Authority"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:46
+msgid "Create an internal Certificate Authority"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:47
+msgid "Create an intermediate Certificate Authority"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:52
+msgid "Certificate Authority Manager"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:98
+#, php-format
+msgid "Certificate Authority %s and its CRLs (if any) successfully deleted"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:171
+#: usr/local/www/system_camanager.php:412
+#: usr/local/www/system_certmanager.php:207
+#: usr/local/www/system_certmanager.php:637
+msgid "Certificate data"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:173
+#: usr/local/www/system_certmanager.php:210
+msgid "This certificate does not appear to be valid."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:175
+msgid "Encrypted private keys are not yet supported."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:183
+#: usr/local/www/system_camanager.php:199
+#: usr/local/www/system_camanager.php:464
+#: usr/local/www/system_certmanager.php:220
+#: usr/local/www/system_certmanager.php:237
+#: usr/local/www/system_certmanager.php:692
+#: usr/local/www/system_certmanager.php:866
+#: usr/local/www/system_usermanager.php:219
+#: usr/local/www/system_usermanager.php:821
+msgid "Key length"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:184
+#: usr/local/www/system_camanager.php:200
+#: usr/local/www/system_camanager.php:496
+#: usr/local/www/system_certmanager.php:222
+#: usr/local/www/system_certmanager.php:741
+#: usr/local/www/system_crlmanager.php:380
+#: usr/local/www/system_usermanager.php:220
+#: usr/local/www/system_usermanager.php:839
+#: usr/local/www/vpn_ipsec_phase1.php:852
+#: usr/local/www/vpn_ipsec_phase2.php:807
+msgid "Lifetime"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:185
+#: usr/local/www/system_camanager.php:201
+#: usr/local/www/system_certmanager.php:223
+#: usr/local/www/system_certmanager.php:238
+msgid "Distinguished name Country Code"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:186
+#: usr/local/www/system_camanager.php:202
+#: usr/local/www/system_certmanager.php:224
+#: usr/local/www/system_certmanager.php:239
+msgid "Distinguished name State or Province"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:187
+#: usr/local/www/system_camanager.php:203
+#: usr/local/www/system_certmanager.php:225
+#: usr/local/www/system_certmanager.php:240
+msgid "Distinguished name City"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:188
+#: usr/local/www/system_camanager.php:204
+#: usr/local/www/system_certmanager.php:226
+#: usr/local/www/system_certmanager.php:241
+msgid "Distinguished name Organization"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:189
+#: usr/local/www/system_camanager.php:205
+#: usr/local/www/system_certmanager.php:227
+#: usr/local/www/system_certmanager.php:242
+msgid "Distinguished name Email Address"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:190
+#: usr/local/www/system_camanager.php:206
+#: usr/local/www/system_certmanager.php:228
+#: usr/local/www/system_certmanager.php:243
+msgid "Distinguished name Common Name"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:198
+#: usr/local/www/system_camanager.php:447
+msgid "Signing Certificate Authority"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:223
+#: usr/local/www/system_certmanager.php:311
+#: usr/local/www/system_certmanager.php:316
+msgid "Please select a valid Key Length."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:225
+#: usr/local/www/system_certmanager.php:313
+#: usr/local/www/system_certmanager.php:318
+msgid "Please select a valid Digest Algorithm."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:358
+#: usr/local/www/system_certmanager.php:584
+#: usr/local/www/system_crlmanager.php:287
+msgid "CAs"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:359
+#: usr/local/www/system_camanager.php:596
+#: usr/local/www/system_certmanager.php:585
+#: usr/local/www/system_crlmanager.php:288
+#: usr/local/www/system_crlmanager.php:543
+msgid "Certificates"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:360
+#: usr/local/www/system_certmanager.php:586
+#: usr/local/www/system_crlmanager.php:289
+msgid "Certificate Revocation"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:386
+#: usr/local/www/system_certmanager.php:601
+#: usr/local/www/system_crlmanager.php:304
+msgid "Method"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:408
+msgid "Existing Certificate Authority"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:416
+#: usr/local/www/system_certmanager.php:641
+msgid "Paste a certificate in X.509 PEM format here."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:420
+msgid "Certificate Private Key"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:420
+msgid "(optional)"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:424
+msgid ""
+"Paste the private key for the above certificate here. This is optional in "
+"most cases, but required if you need to generate a Certificate Revocation "
+"List (CRL)."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:430
+msgid "Serial for next certificate"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:433
+msgid ""
+"Enter a decimal number to be used as the serial number for the next "
+"certificate to be created using this CA."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:444
+msgid "Internal Certificate Authority"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:476
+#: usr/local/www/system_certmanager.php:704 usr/local/www/vpn_ipsec.php:363
+#: usr/local/www/vpn_ipsec.php:517 usr/local/www/vpn_ipsec_phase2.php:757
+#: usr/local/www/vpn_openvpn_server.php:1034
+msgid "bits"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:480
+#: usr/local/www/system_certmanager.php:708
+#: usr/local/www/system_certmanager.php:884
+msgid "Digest Algorithm"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:492
+#: usr/local/www/system_certmanager.php:720
+#: usr/local/www/system_certmanager.php:896
+msgid ""
+"NOTE: It is recommended to use an algorithm stronger than SHA1 when possible."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:499
+#: usr/local/www/system_certmanager.php:744
+#: usr/local/www/system_crlmanager.php:383
+msgid "days"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:507
+#: usr/local/www/system_certmanager.php:752
+#: usr/local/www/system_certmanager.php:904
+msgid "Country Code"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:522
+#: usr/local/www/system_certmanager.php:758
+#: usr/local/www/system_certmanager.php:919
+msgid "State or Province"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:526
+#: usr/local/www/system_camanager.php:536
+#: usr/local/www/system_camanager.php:546
+#: usr/local/www/system_camanager.php:556
+#: usr/local/www/system_camanager.php:566
+msgid "ex:"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:528
+#: usr/local/www/system_certmanager.php:925
+msgid "Texas"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:532
+#: usr/local/www/system_certmanager.php:764
+#: usr/local/www/system_certmanager.php:929
+msgid "City"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:538
+#: usr/local/www/system_certmanager.php:935
+msgid "Austin"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:542
+#: usr/local/www/system_certmanager.php:770
+#: usr/local/www/system_certmanager.php:939
+msgid "Organization"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:548
+#: usr/local/www/system_certmanager.php:945
+msgid "My Company Inc."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:558
+msgid "admin@mycompany.com"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:568
+msgid "internal-ca"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:594
+#: usr/local/www/system_crlmanager.php:542
+msgid "Internal"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:595
+#: usr/local/www/system_certmanager.php:1084
+msgid "Issuer"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:597
+#: usr/local/www/system_certmanager.php:1085
+msgid "Distinguished Name"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:608
+#: usr/local/www/system_certmanager.php:1100
+msgid "self-signed"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:610
+#: usr/local/www/system_certmanager.php:1102
+msgid "external"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:656
+#: usr/local/www/system_certmanager.php:1148
+msgid "Valid From"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:661
+#: usr/local/www/system_certmanager.php:1153
+msgid "Valid Until"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:668
+msgid "edit CA"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:671
+msgid "export CA cert"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:675
+msgid "export CA private key"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:678
+msgid ""
+"Do you really want to delete this Certificate Authority and its CRLs, and "
+"unreference any associated certificates?"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:679
+msgid "delete ca"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:691
+msgid "add or import ca"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:691
+msgid "add ca"
+msgstr ""
+
+#: usr/local/www/system_camanager.php:698
+msgid "Additional trusted Certificate Authorities can be added here."
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:45
+msgid "Import an existing Certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:46
+msgid "Create an internal Certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:47
+msgid "Create a Certificate Signing Request"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:58
+msgid "Certificate Manager"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:66
+msgid "Choose an existing certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:106
+#, php-format
+msgid "Certificate %s successfully deleted"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:208
+msgid "Key data"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:219
+#: usr/local/www/system_certmanager.php:675
+#: usr/local/www/system_usermanager.php:218
+#: usr/local/www/system_usermanager.php:801
+msgid "Certificate authority"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:221
+#: usr/local/www/system_certmanager.php:724
+msgid "Certificate Type"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:248
+msgid "Existing Certificate Choice"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:421
+msgid "Final Certificate data"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:441
+#, php-format
+msgid "The certificate modulus does not match the signing request modulus."
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:633
+msgid "Import Certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:645
+msgid "Private key data"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:649
+msgid "Paste a private key in X.509 PEM format here."
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:659
+msgid "Internal Certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:666
+msgid "No internal Certificate Authorities have been defined. You must"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:668
+msgid "an internal CA before creating an internal certificate."
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:737
+msgid ""
+"Type of certificate to generate. Used for placing restrictions on the usage "
+"of the generated certificate."
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:782
+#: usr/local/www/system_certmanager.php:955
+msgid "webadmin@mycompany.com"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:796
+#: usr/local/www/system_certmanager.php:965
+msgid "www.example.com"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:800
+msgid "Alternative Names"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:863
+msgid "External Signing Request"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:978
+msgid "Choose an Existing Certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:981
+msgid "Existing Certificates"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1039
+msgid "Complete Signing Request"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1043
+msgid "Signing request data"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1047
+msgid ""
+"Copy the certificate signing data from here and forward it to your "
+"certificate authority for signing."
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1051
+msgid "Final certificate data"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1055
+msgid "Paste the certificate received from your certificate authority here."
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1086
+#: usr/local/www/system_crlmanager.php:544
+msgid "In Use"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1108
+msgid "external - signature pending"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1183
+#: usr/local/www/system_usermanager.php:742
+msgid "export cert"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1183
+#: usr/local/www/system_certmanager.php:1186
+msgid "export ca"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1186
+msgid "export key"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1189
+msgid "export ca cert+user cert+user cert key in .p12 format"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1192
+msgid "Do you really want to delete this Certificate?"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1193
+#: usr/local/www/system_usermanager.php:749
+msgid "delete cert"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1199
+msgid "update csr"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1212
+msgid "add or import certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1212
+msgid "add certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1218
+msgid "Note: You can only delete a certificate if it is not currently in use."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:47
+msgid "Certificate Revocation List Manager"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:50
+msgid "Create an internal Certificate Revocation List"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:51
+msgid "Import an existing Certificate Revocation List"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:88
+msgid "Invalid CRL reference."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:94
+#, php-format
+msgid "Certificate Revocation List %s is in use and cannot be deleted"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:100
+#, php-format
+msgid "Certificate Revocation List %s successfully deleted"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:139
+msgid "Both the Certificate and CRL must be specified."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:143
+msgid "CA mismatch between the Certificate and CRL. Unable to Revoke."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:146
+msgid "Cannot revoke certificates for an imported/external CRL."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:178
+#: usr/local/www/system_crlmanager.php:180
+#, php-format
+msgid "Deleted Certificate %s from CRL %s"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:182
+#, php-format
+msgid "Failed to delete Certificate %s from CRL %s"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:196
+msgid "Certificate Revocation List data"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:203
+#: usr/local/www/system_crlmanager.php:333
+#: usr/local/www/vpn_ipsec_phase1.php:181
+#: usr/local/www/vpn_openvpn_client.php:258
+#: usr/local/www/vpn_openvpn_server.php:333
+msgid "Certificate Authority"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:359
+msgid "Existing Certificate Revocation List"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:363
+#: usr/local/www/system_crlmanager.php:423
+msgid "CRL data"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:367
+#: usr/local/www/system_crlmanager.php:427
+msgid "Paste a Certificate Revocation List in X.509 CRL format here."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:377
+msgid "Internal Certificate Revocation List"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:384
+msgid "Default: 9999"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:388
+msgid "Serial"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:392
+msgid "Default: 0"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:414
+msgid "Edit Imported Certificate Revocation List"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:447
+msgid "Currently Revoked Certificates for CRL"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:451
+msgid "Certificate Name"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:452
+msgid "Revocation Reason"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:453
+msgid "Revoked At"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:462
+msgid "No Certificates Found for this CRL."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:481
+msgid "Do you really want to delete this Certificate from the CRL?"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:482
+msgid "Delete this certificate from the CRL "
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:499
+msgid "No Certificates Found for this CA."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:506
+msgid "Choose a Certificate to Revoke"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:515
+msgid "Reason"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:552
+msgid "Additional Certificate Revocation Lists can be added here."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:589
+#, php-format
+msgid "Add or Import CRL for %s"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:589
+#: usr/local/www/system_crlmanager.php:593
+msgid "add crl"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:593
+#, php-format
+msgid "Import CRL for %s"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:613
+msgid "Export CRL"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:617
+#: usr/local/www/system_crlmanager.php:621
+msgid "Edit CRL"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:625
+msgid "Do you really want to delete this Certificate Revocation List?"
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:626
+msgid "Delete CRL"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:83
+msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:85
+msgid ""
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
+"the HTML form"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:87
+msgid "The uploaded file was only partially uploaded"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:89
+msgid "No file was uploaded"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:91
+msgid "Missing a temporary folder"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:93
+msgid "Failed to write file to disk"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:95
+msgid "File upload stopped by extension"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:97
+msgid "Unknown upload error"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:103 usr/local/www/system_firmware.php:240
+#: usr/local/www/system_firmware_auto.php:81
+#: usr/local/www/system_firmware_check.php:65
+#: usr/local/www/system_firmware_restorefullbackup.php:126
+#: usr/local/www/system_firmware_settings.php:125
+msgid "Manual Update"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:108
+msgid ""
+"An upgrade is currently in progress.<p>The firewall will reboot when the "
+"operation is complete."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:129
+msgid "Upgrade"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:148
+msgid "The uploaded image file is not for this platform."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:151
+msgid "Image upload failed (out of memory?)"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:162
+#: usr/local/www/system_firmware_auto.php:209
+msgid "The digital signature on this image is invalid."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:164
+#: usr/local/www/system_firmware_auto.php:212
+msgid "This image is not digitally signed."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:166
+#: usr/local/www/system_firmware_auto.php:216
+msgid "There has been an error verifying the signature on this image."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:169
+#: usr/local/www/system_firmware_auto.php:231
+msgid "The image file is corrupt."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:182
+msgid ""
+"The firmware is now being updated. The firewall will reboot automatically."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:196
+#, php-format
+msgid "Firmware image missing or other error, please try again %s."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:222
+msgid ""
+"This means that the image you uploaded is not an official/supported image "
+"and may lead to unexpected behavior or security compromises. Only install "
+"images that come from sources that you trust, and make sure that the image "
+"has not been tampered with."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:226
+msgid "Do you want to install this image anyway (on your own risk)?"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:241
+#: usr/local/www/system_firmware_auto.php:62
+#: usr/local/www/system_firmware_auto.php:82
+#: usr/local/www/system_firmware_check.php:50
+#: usr/local/www/system_firmware_check.php:66
+#: usr/local/www/system_firmware_restorefullbackup.php:127
+#: usr/local/www/system_firmware_settings.php:126
+msgid "Auto Update"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:242
+#: usr/local/www/system_firmware_auto.php:83
+#: usr/local/www/system_firmware_check.php:67
+#: usr/local/www/system_firmware_restorefullbackup.php:128
+#: usr/local/www/system_firmware_settings.php:127
+msgid "Updater Settings"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:244
+#: usr/local/www/system_firmware_auto.php:85
+#: usr/local/www/system_firmware_check.php:69
+#: usr/local/www/system_firmware_restorefullbackup.php:130
+#: usr/local/www/system_firmware_settings.php:129
+msgid "Restore Full Backup"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:254
+msgid "Invoke"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:254
+msgid "Manual Upgrade"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:261
+msgid "Enable firmware upload"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:263
+#, php-format
+msgid "Click \"Enable firmware upload\" to begin."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:266
+msgid "Disable firmware upload"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:282
+#: usr/local/www/system_firmware_check.php:106
+msgid "Perform full backup prior to upgrade"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:285
+msgid "Upgrade firmware"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:286
+msgid "Click \"Upgrade firmware\" to start the upgrade process."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:288
+msgid "You must reboot the system before you can upgrade the firmware."
+msgstr ""
+
+#: usr/local/www/system_firmware.php:299
+msgid "Warning:"
+msgstr ""
+
+#: usr/local/www/system_firmware.php:302
+msgid ""
+"DO NOT abort the firmware upgrade once it has started. The firewall will "
+"reboot automatically after storing the new firmware. The configuration will "
+"be maintained."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:122
+msgid "Beginning firmware upgrade"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:141
+msgid "Downloading current version information"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:156
+#: usr/local/www/system_firmware_auto.php:165
+#: usr/local/www/system_firmware_check.php:143
+msgid "Unable to check for updates."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:170
+msgid "Downloading updates"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:180
+msgid "download complete."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:182
+#: usr/local/www/system_firmware_check.php:161
+msgid "You are on the latest version."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:222
+msgid ""
+"Update cannot continue. You can disable this check on the Updater Settings "
+"tab."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:227
+msgid ""
+"Upgrade Image does not contain a signature but the system has been "
+"configured to allow unsigned images. One moment please..."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:232
+msgid "Update cannot continue"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:243
+msgid "Downloading complete but sha256 does not match."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:244
+msgid "Auto upgrade aborted."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:244
+msgid "Downloaded SHA256"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:244
+msgid "Needed SHA256"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:246
+msgid "is now upgrading."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:246
+msgid "The firewall will reboot once the operation is completed."
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:268
+msgid "Auto Update Download Status"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:270
+msgid "Current Version"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:271
+msgid "Latest Version"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:272
+msgid "File size"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:273
+msgid "Downloaded"
+msgstr ""
+
+#: usr/local/www/system_firmware_auto.php:274
+msgid "Percent"
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:109
+msgid "Invoke Auto Upgrade"
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:127
+msgid "Downloading new version information..."
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:145
+msgid "Could not contact custom update server."
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:147
+#, php-format
+msgid "Could not contact %1$s update server %2$s%3$s"
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:149
+msgid "Obtaining current version information..."
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:186
+msgid "A new version is now available"
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:187
+msgid "Current version"
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:189
+msgid "NanoBSD Size"
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:191
+msgid "Built On"
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:192
+msgid "New version"
+msgstr ""
+
+#: usr/local/www/system_firmware_check.php:193
+msgid "Update source"
+msgstr ""
+
+#: usr/local/www/system_firmware_restorefullbackup.php:105
+msgid "Restore full backup"
+msgstr ""
+
+#: usr/local/www/system_firmware_restorefullbackup.php:140
+msgid "Filename"
+msgstr ""
+
+#: usr/local/www/system_firmware_restorefullbackup.php:163
+msgid "Do you really want to delete this backup?"
+msgstr ""
+
+#: usr/local/www/system_firmware_restorefullbackup.php:175
+msgid "Could not locate any previous backups."
+msgstr ""
+
+#: usr/local/www/system_firmware_restorefullbackup.php:183
+msgid "do not restore config.xml."
+msgstr ""
+
+#: usr/local/www/system_firmware_restorefullbackup.php:185
+msgid "Restore"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:50
+msgid ""
+"A Firmware Auto Update Base URL must be specified when \"Use an unofficial "
+"server for firmware upgrades\" is enabled."
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:137
+msgid "Firmware Branch"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:141
+msgid "Default Auto Update URLs"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:161
+#, php-format
+msgid ""
+"Entries denoted by \"Current architecture\" match the architecture of your "
+"current installation, such as %s. Changing architectures during an upgrade "
+"is not recommended, and may require a manual reboot after the update "
+"completes."
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:166
+msgid "Firmware Auto Update URL"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:168
+msgid "Use an unofficial server for firmware upgrades"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:173
+msgid "This is where"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:173
+msgid "will check for newer firmware versions when the"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:173
+msgid "System: Firmware: Auto Update"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:175
+#, php-format
+msgid ""
+"When a custom URL is configured, the system will not verify the image has an "
+"official digital signature"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:183
+msgid "Updates"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:186
+msgid "Unsigned images"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:190
+msgid ""
+"Allow auto-update firmware images with a missing or invalid digital "
+"signature to be used."
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:194
+msgid "Dashboard check"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:198
+msgid "Disable the automatic dashboard auto-update check."
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:206
+msgid "Gitsync"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:209
+msgid "Auto sync on update"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:213
+msgid ""
+"After updating, sync with the following repository/branch before reboot."
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:225
+msgid "Repository URL"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:230
+#, php-format
+msgid "The most recently used repository was %s"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:232
+msgid "This will be used if the field is left blank."
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:251
+msgid "Branch name"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:256
+#, php-format
+msgid "The most recently used branch was %s"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:259
+msgid "Usually the branch name is master"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:262
+msgid "Note: Sync will not be performed if a branch is not specified."
+msgstr ""
+
+#: usr/local/www/system_gateway_groups.php:86
+msgid "removed gateway group"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups.php:112
+#, php-format
+msgid ""
+"The gateway configuration has been changed.%sYou must apply the changes in "
+"order for them to take effect."
+msgstr ""
+
+#: usr/local/www/system_gateway_groups.php:188
+msgid "Do you really want to delete this gateway group?"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups.php:206
+msgid ""
+"Remember to use these Gateway Groups in firewall rules in order to enable "
+"load balancing, failover, or policy-based routing. Without rules directing "
+"traffic into the Gateway Groups, they will not be used."
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:56
+msgid "Member Down"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:57
+msgid "Packet Loss"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:58
+msgid "High Latency"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:59
+msgid "Packet Loss or High Latency"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:91
+msgid "A valid gateway group name must be specified."
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:94
+#: usr/local/www/system_gateways_edit.php:122
+msgid "The gateway name must not contain invalid characters."
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:103
+msgid "Changing name on a gateway group is not allowed."
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:108
+#, php-format
+msgid "A gateway group with this name \"%s\" already exists."
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:125
+#, php-format
+msgid ""
+"A gateway group cannot have the same name with a gateway \"%s\" please "
+"choose another name."
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:129
+msgid "No gateway(s) have been selected to be used in this group"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:153
+msgid "Edit gateway group"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:232
+msgid "Edit gateway group entry"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:241
+msgid "Gateway Priority"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:275
+msgid "Never"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:276
+msgid "Tier 1"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:277
+msgid "Tier 2"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:278
+msgid "Tier 3"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:279
+msgid "Tier 4"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:280
+msgid "Tier 5"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:296
+msgid "Interface Address"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:314
+msgid "Link Priority"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:315
+msgid ""
+"The priority selected here defines in what order failover and balancing of "
+"links will be done. Multiple links of the same priority will balance "
+"connections until all links in the priority will be exhausted. If all links "
+"in a priority level are exhausted we will use the next available link(s) in "
+"the next priority level."
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:320
+msgid ""
+"The virtual IP field selects what (virtual) IP should be used when this "
+"group applies to a local Dynamic DNS, IPsec or OpenVPN endpoint"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:325
+msgid "Trigger Level"
+msgstr ""
+
+#: usr/local/www/system_gateway_groups_edit.php:336
+msgid "When to trigger exclusion of a member"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:89
+#, php-format
+msgid ""
+"Gateway '%s' cannot be deleted because it is in use on Gateway Group '%s'"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:99
+#, php-format
+msgid ""
+"Gateway '%s' cannot be deleted because it is in use on Static Route '%s'"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:196
+msgid "The gateway configuration has been changed."
+msgstr ""
+
+#: usr/local/www/system_gateways.php:220
+#: usr/local/www/system_gateways_edit.php:719
+msgid "Monitor IP"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:266
+msgid "This gateway is inactive because interface is missing"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:340
+msgid "Do you really want to delete this gateway?"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:377 usr/local/www/system_gateways.php:382
+msgid "delete selected items"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:383
+msgid "Do you really want to delete the selected gateway items?"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:126
+msgid "A valid gateway IP address must be specified."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:134
+msgid ""
+"Cannot add IPv4 Gateway Address because no IPv4 address could be found on "
+"the interface."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:153
+#: usr/local/www/system_gateways_edit.php:181
+#, php-format
+msgid ""
+"The gateway address %1$s does not lie within one of the chosen interface's "
+"subnets."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:162
+msgid ""
+"Cannot add IPv6 Gateway Address because no IPv6 address could be found on "
+"the interface."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:188
+msgid ""
+"Dynamic gateway values cannot be specified for interfaces with a static IPv4 "
+"configuration."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:192
+msgid ""
+"Dynamic gateway values cannot be specified for interfaces with a static IPv6 "
+"configuration."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:196
+msgid "A valid monitor IP address must be specified."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:222
+msgid "Changing name on a gateway is not allowed."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:227
+#, php-format
+msgid "The gateway name \"%s\" already exists."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:233
+#, php-format
+msgid "The gateway IP address \"%s\" already exists."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:239
+#, php-format
+msgid ""
+"The monitor IP address \"%s\" is already in use. You must choose a different "
+"monitor IP."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:249
+msgid "The low latency threshold needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:252
+msgid "The low latency threshold needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:259
+msgid "The high latency threshold needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:262
+msgid "The high latency threshold needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:269
+msgid "The low Packet Loss threshold needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:272
+msgid "The low Packet Loss threshold needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:275
+msgid "The low Packet Loss threshold needs to be less than 100."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:282
+msgid "The high Packet Loss threshold needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:285
+msgid "The high Packet Loss threshold needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:288
+msgid "The high Packet Loss threshold needs to be 100 or less."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:296
+msgid ""
+"The high latency threshold needs to be higher than the low latency threshold"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:319
+msgid ""
+"The high Packet Loss threshold needs to be higher than the low Packet Loss "
+"threshold"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:341
+msgid "The probe interval needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:344
+msgid "The probe interval needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:351
+msgid "The down time setting needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:354
+msgid "The down time setting needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:362
+msgid "The probe interval needs to be less than the down time setting."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:384
+msgid "The average delay replies qty needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:387
+msgid "The average delay replies qty needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:394
+msgid "The average packet loss probes qty needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:397
+msgid "The average packet loss probes qty needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:404
+msgid "The lost probe delay needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:407
+msgid "The lost probe delay needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:523
+#: usr/local/www/system_gateways_edit.php:644
+msgid "Edit gateway"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:650
+msgid "Disable this gateway"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:651
+msgid ""
+"Set this option to disable this gateway without removing it from the list."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:668
+msgid "Choose which interface this gateway applies to."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:685
+msgid "Choose the Internet Protocol this gateway uses."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:692
+msgid "Gateway name"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:699
+msgid "Gateway IP address"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:703
+#: usr/local/www/system_gateways_edit.php:706
+msgid "Default Gateway"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:707
+msgid "This will select the above gateway as the default gateway"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:711
+#: usr/local/www/system_gateways_edit.php:714
+msgid "Disable Gateway Monitoring"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:715
+msgid "This will consider this gateway as always being up"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:728
+msgid "Alternative monitor IP"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:729
+msgid ""
+"Enter an alternative address here to be used to monitor the link. This is "
+"used for the quality RRD graphs as well as the load balancer entries. Use "
+"this if the gateway does not respond to ICMP echo requests (pings)"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:736
+#: usr/local/www/system_gateways_edit.php:739
+msgid "Mark Gateway as Down"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:740
+msgid "This will force this gateway to be considered Down"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:748
+msgid " - Show advanced option"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:765
+msgid "Weight for this gateway when used in a Gateway Group."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:769
+msgid "Latency thresholds"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:781
+msgid "Packet Loss thresholds"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:793
+msgid "Probe Interval"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:799
+msgid ""
+"NOTE: The quality graph is averaged over seconds, not intervals, so as the "
+"probe interval is increased the accuracy of the quality graph is decreased."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:804
+msgid "Down"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:812
+msgid "Average Delay Replies Qty"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:817
+#: usr/local/www/system_gateways_edit.php:827
+#: usr/local/www/system_gateways_edit.php:837
+msgid "Use calculated value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:822
+msgid "Average Packet Loss Probes Qty"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:832
+msgid "Lost Probe Delay"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:843
+msgid ""
+"The probe interval must be less than the down time, otherwise the gateway "
+"will seem to go down then come up again at the next probe."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:844
+msgid ""
+"The down time defines the length of time before the gateway is marked as "
+"down, but the accuracy is controlled by the probe interval. For example, if "
+"your down time is 40 seconds but on a 30 second probe interval, only one "
+"probe would have to fail before the gateway is marked down at the 40 second "
+"mark. By default, the gateway is considered down after 10 seconds, and the "
+"probe interval is 1 second, so 10 probes would have to fail before the "
+"gateway is marked down."
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:53
+#: usr/local/www/system_groupmanager_addprivs.php:57
+msgid "Group manager"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:79
+#: usr/local/www/vpn_ipsec_mobile.php:619
+msgid "Group"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:80
+#: usr/local/www/system_groupmanager.php:104
+#: usr/local/www/system_usermanager.php:100
+#: usr/local/www/system_usermanager.php:115
+msgid "successfully deleted"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:103
+#: usr/local/www/system_usermanager.php:114
+msgid "Privilege"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:131
+msgid "Selected groups removed successfully!"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:148
+msgid "The group name contains invalid characters."
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:151
+msgid "The group name is longer than 16 characters."
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:157
+msgid "Another entry with the same group name already exists."
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:314
+#: usr/local/www/system_usermanager.php:520
+msgid "Defined by"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:321
+#: usr/local/www/system_groupmanager.php:481
+msgid "Group name"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:331
+msgid "Group description, for your own information only"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:338
+#: usr/local/www/system_usermanager.php:566
+msgid "Group Memberships"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:343
+msgid "Not Members"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:367
+msgid "Add Members"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:371
+msgid "Remove Members"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:398
+#: usr/local/www/system_groupmanager_addprivs.php:196
+#: usr/local/www/system_usermanager.php:632
+#: usr/local/www/system_usermanager_addprivs.php:183
+msgid "Hold down CTRL (pc)/COMMAND (mac) key to select multiple items"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:406
+msgid "Assigned Privileges"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:432
+#: usr/local/www/system_usermanager.php:674
+msgid "Do you really want to delete this privilege?"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:433
+#: usr/local/www/system_usermanager.php:675
+msgid "delete privilege"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:483
+msgid "Member Count"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:494
+msgid "add group"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:495
+msgid "Delete selected groups"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:495
+msgid "Do you really want to delete selected groups?"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:501
+msgid ""
+"Additional webConfigurator groups can be added here.\n"
+"\t\t\t\t\t\t\t\t\t\tGroup permissions can be assigned which are inherited by "
+"users who are members of the group.\n"
+"\t\t\t\t\t\t\t\t\t\tAn icon that appears grey indicates that it is a system "
+"defined object.\n"
+"\t\t\t\t\t\t\t\t\t\tSome system object properties can be modified but they "
+"cannot be deleted."
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:562
+msgid "Do you really want to delete this group?"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:563
+msgid "delete group"
+msgstr ""
+
+#: usr/local/www/system_groupmanager_addprivs.php:57
+msgid "Add privileges"
+msgstr ""
+
+#: usr/local/www/system_groupmanager_addprivs.php:81
+#: usr/local/www/system_usermanager_addprivs.php:75
+msgid "Selected priveleges"
+msgstr ""
+
+#: usr/local/www/system_groupmanager_addprivs.php:182
+#: usr/local/www/system_usermanager_addprivs.php:171
+msgid "System Privileges"
+msgstr ""
+
+#: usr/local/www/system_groupmanager_addprivs.php:220
+#: usr/local/www/system_usermanager_addprivs.php:189
+msgid "Select a privilege from the list above for a description"
+msgstr ""
+
+#: usr/local/www/system_hasync.php:101
+msgid "High Availability Sync"
+msgstr ""
+
+#: usr/local/www/system_routes.php:54 usr/local/www/system_routes.php:199
+#: usr/local/www/system_routes_edit.php:212
+msgid "Static Routes"
+msgstr ""
+
+#: usr/local/www/system_routes.php:114 usr/local/www/system_routes.php:126
+msgid "removed route to"
+msgstr ""
+
+#: usr/local/www/system_routes.php:141
+msgid "enabled route to"
+msgstr ""
+
+#: usr/local/www/system_routes.php:145
+msgid "disabled route to"
+msgstr ""
+
+#: usr/local/www/system_routes.php:212
+#, php-format
+msgid ""
+"The static route configuration has been changed.%sYou must apply the changes "
+"in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/system_routes.php:293
+msgid "move selected routes before this route"
+msgstr ""
+
+#: usr/local/www/system_routes.php:298
+msgid "edit route"
+msgstr ""
+
+#: usr/local/www/system_routes.php:304
+msgid "Do you really want to delete this route?"
+msgstr ""
+
+#: usr/local/www/system_routes.php:305
+msgid "delete route"
+msgstr ""
+
+#: usr/local/www/system_routes.php:310
+msgid "add a new route based on this one"
+msgstr ""
+
+#: usr/local/www/system_routes.php:328 usr/local/www/system_routes.php:333
+msgid "move selected routes to end"
+msgstr ""
+
+#: usr/local/www/system_routes.php:341
+msgid "add new route"
+msgstr ""
+
+#: usr/local/www/system_routes.php:351 usr/local/www/system_routes.php:356
+msgid "delete selected routes"
+msgstr ""
+
+#: usr/local/www/system_routes.php:357
+msgid "Do you really want to delete the selected routes?"
+msgstr ""
+
+#: usr/local/www/system_routes.php:372
+msgid ""
+"Do not enter static routes for networks assigned on any interface of this "
+"firewall. Static routes are only used for networks reachable via a "
+"different router, and not reachable via your default gateway."
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:85
+#: usr/local/www/system_routes_edit.php:229
+msgid "Destination network"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:86
+msgid "Destination network bit count"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:92
+msgid "A valid IPv4 or IPv6 destination network must be specified."
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:95
+msgid "A valid destination network bit count must be specified."
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:113
+msgid "A IPv4 subnet can not be over 32 bits."
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:155
+msgid "A route to these destination networks already exists"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:165
+#: usr/local/www/system_routes_edit.php:172
+#, php-format
+msgid "This network conflicts with address configured on interface %s."
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:212
+msgid "Edit route"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:226
+msgid "Edit route entry"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:240
+msgid "Destination network for this static route"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:257
+msgid "Choose which gateway this route applies to or"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:274
+msgid "Default gateway:"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:277
+msgid "Interface:"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:291
+msgid "Gateway IP:"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:318
+msgid "Disable this static route"
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:319
+msgid ""
+"Set this option to disable this static route without removing it from the "
+"list."
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:393
+#, php-format
+msgid "You can manage Gateways %shere%s."
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:396
+msgid "Sorry, we could not create your gateway at this time."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:167
+#: usr/local/www/system_usermanager.php:781
+#: usr/local/www/system_usermanager.php:791
+#: usr/local/www/vpn_ipsec_phase1.php:181
+#: usr/local/www/vpn_openvpn_server.php:333
+msgid "Certificate"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:168
+msgid "association removed."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:193
+msgid "Selected users removed successfully!"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:230
+msgid "The username is longer than 16 characters."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:233
+#: usr/local/www/system_usermanager_passwordmg.php:55
+#: usr/local/www/vpn_l2tp_users_edit.php:98
+#: usr/local/www/vpn_pptp_users_edit.php:97
+msgid "The passwords do not match."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:236
+msgid "IPsec Pre-Shared Key contains invalid characters."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:246
+#: usr/local/www/vpn_l2tp_users_edit.php:108
+#: usr/local/www/vpn_pptp_users_edit.php:107
+msgid "Another entry with the same username already exists."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:257
+msgid "That username is reserved by the system."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:277
+msgid "Invalid expiration date format; use MM/DD/YYYY instead."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:284
+msgid "Invalid internal Certificate Authority"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:547
+#: usr/local/www/system_usermanager_passwordmg.php:123
+msgid "(confirmation)"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:551
+#: usr/local/www/system_usermanager.php:905
+msgid "Full name"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:555
+msgid "User's full name, for your own information only"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:559
+msgid "Expiration date"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:563
+msgid ""
+"Leave blank if the account shouldn't expire, otherwise enter the expiration "
+"date in the following format: mm/dd/yyyy"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:571
+msgid "Not Member Of"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:597
+msgid "Add Groups"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:601
+msgid "Remove Groups"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:605
+msgid "Member Of"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:639
+msgid "Effective Privileges"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:643
+msgid "Inherited From"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:700
+msgid "User Certificates"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:705
+msgid "CA"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:736
+msgid "export private key"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:748
+msgid "Do you really want to remove this certificate association?"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:748
+msgid "(Certificate will not be deleted)"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:783
+msgid "Click to create a user certificate."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:853
+#: usr/local/www/system_usermanager.php:859
+msgid "Authorized keys"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:855
+msgid "Click to paste an authorized key."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:870
+msgid "Paste an authorized keys file here."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:874
+msgid "IPsec Pre-Shared Key"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:918
+#: usr/local/www/vpn_l2tp_users.php:122 usr/local/www/vpn_pptp_users.php:106
+#: usr/local/www/vpn_pptp_users.php:129
+msgid "add user"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:919
+msgid "Delete selected users"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:919
+msgid "Do you really want to delete selected Users?"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:925
+msgid ""
+"Additional users can be added here. User permissions for accessing the "
+"webConfigurator can be assigned directly or inherited from group "
+"memberships. An icon that appears grey indicates that it is a system defined "
+"object. Some system object properties can be modified but they cannot be "
+"deleted."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:930
+msgid ""
+"Accounts created here are also used for other parts of the system such as "
+"OpenVPN, IPsec, and Captive Portal."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:978
+#: usr/local/www/vpn_pptp_users.php:119
+msgid "edit user"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:988
+#: usr/local/www/vpn_l2tp_users.php:117 usr/local/www/vpn_pptp_users.php:120
+msgid "Do you really want to delete this user?"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:989
+#: usr/local/www/vpn_l2tp_users.php:117 usr/local/www/vpn_pptp_users.php:120
+msgid "delete user"
+msgstr ""
+
+#: usr/local/www/system_usermanager_passwordmg.php:44
+msgid "User Password"
+msgstr ""
+
+#: usr/local/www/system_usermanager_passwordmg.php:67
+msgid "Password successfully changed"
+msgstr ""
+
+#: usr/local/www/system_usermanager_passwordmg.php:96
+msgid "Sorry, you cannot change the password for a non-local user."
+msgstr ""
+
+#: usr/local/www/system_usermanager_passwordmg.php:126
+msgid "Select a new password"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings.php:50
+msgid "User manager settings"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings.php:60
+msgid "Session timeout must be an integer value."
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings.php:70
+msgid ""
+"The test was not performed because it is supported only for ldap based "
+"backends."
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings.php:132
+msgid "Session Timeout"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings.php:136
+msgid ""
+"Time in minutes to expire idle management sessions. The default is 4 hours "
+"(240 minutes)."
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings.php:137
+msgid "Enter 0 to never expire sessions. NOTE: This is a security risk!"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings.php:164
+msgid "Save and Test"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:97
+msgid ""
+"Could not connect to the LDAP server. Please check your LDAP configuration."
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:100
+msgid "Please select which containers to Authenticate against:"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings_test.php:81
+#, php-format
+msgid "Could not find settings for %s%s"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings_test.php:86
+#, php-format
+msgid "Testing %s LDAP settings... One moment please..."
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings_test.php:90
+msgid "Attempting connection to"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings_test.php:94
+msgid "Attempting bind to"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings_test.php:98
+msgid "Attempting to fetch Organizational Units from"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings_test.php:105
+msgid "Organization units found"
+msgstr ""
+
+#: usr/local/www/system_usermanager_settings_test.php:112
+#: usr/local/www/system_usermanager_settings_test.php:117
+#: usr/local/www/system_usermanager_settings_test.php:121
+msgid "failed"
+msgstr ""
+
+#: usr/local/www/uploadconfig.php:49
+msgid "ERR Could not save configuration."
+msgstr ""
+
+#: usr/local/www/uploadconfig.php:55
+msgid "OK"
+msgstr ""
+
+#: usr/local/www/uploadconfig.php:58
+msgid "ERR Could not install configuration."
+msgstr ""
+
+#: usr/local/www/uploadconfig.php:61
+msgid "ERR Invalid configuration received."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:231 usr/local/www/vpn_ipsec_keys.php:92
+#: usr/local/www/vpn_ipsec_mobile.php:331
+msgid "The IPsec tunnel configuration has been changed"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:238 usr/local/www/vpn_ipsec_keys.php:100
+#: usr/local/www/vpn_ipsec_mobile.php:346
+#: usr/local/www/vpn_ipsec_phase1.php:553
+#: usr/local/www/vpn_ipsec_phase2.php:539
+#: usr/local/www/vpn_ipsec_settings.php:204
+msgid "Tunnels"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:239 usr/local/www/vpn_ipsec_keys.php:101
+#: usr/local/www/vpn_ipsec_mobile.php:347
+#: usr/local/www/vpn_ipsec_phase1.php:554
+#: usr/local/www/vpn_ipsec_phase2.php:540
+#: usr/local/www/vpn_ipsec_settings.php:205
+msgid "Mobile clients"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:240 usr/local/www/vpn_ipsec_keys.php:102
+#: usr/local/www/vpn_ipsec_phase1.php:555
+#: usr/local/www/vpn_ipsec_phase2.php:541
+msgid "Pre-Shared Keys"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:241 usr/local/www/vpn_ipsec_keys.php:103
+#: usr/local/www/vpn_ipsec_mobile.php:349
+#: usr/local/www/vpn_ipsec_phase1.php:556
+#: usr/local/www/vpn_ipsec_phase2.php:542
+#: usr/local/www/vpn_ipsec_settings.php:207
+msgid "Advanced Settings"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:258
+msgid "Enable IPsec"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:274
+msgid "IKE"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:275
+msgid "Remote Gateway"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:277
+msgid "P1 Protocol"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:278
+msgid "P1 Transforms"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:279
+msgid "P1 Description"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:361 usr/local/www/vpn_ipsec.php:515
+#: usr/local/www/vpn_ipsec_phase2.php:746
+msgid "auto"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:384 usr/local/www/vpn_ipsec.php:539
+msgid "move selected entries before this"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:389
+msgid "edit phase1 entry"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:396
+msgid "delete phase1 entry"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:398
+msgid ""
+"Do you really want to delete this phase1 and all associated phase2 entries?"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:405
+msgid "copy phase1 entry"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:437
+#, php-format
+msgid "Show %s Phase-2 entries"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:445
+msgid "Local Subnet"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:446
+msgid "Remote Subnet"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:447
+msgid "P2 Protocol"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:448
+msgid "P2 Transforms"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:449
+msgid "P2 Auth Methods"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:542
+msgid "edit phase2 entry"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:545
+msgid "delete phase2 entry"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:547
+msgid "Do you really want to delete this phase2 entry?"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:549
+msgid "add a new Phase 2 based on this one"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:563 usr/local/www/vpn_ipsec.php:567
+msgid "move selected phase2 entries to end"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:572
+msgid "add phase2 entry"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:577 usr/local/www/vpn_ipsec.php:581
+msgid "delete selected phase2 entries"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:581
+msgid "Do you really want to delete the selected phase2 entries?"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:604 usr/local/www/vpn_ipsec.php:608
+msgid "move selected phase1 entries to end"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:615
+msgid "add new phase1"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:624 usr/local/www/vpn_ipsec.php:628
+msgid "delete selected phase1 entries"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:628
+msgid "Do you really want to delete the selected phase1 entries?"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:644
+msgid "You can check your IPsec status at"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:644
+msgid "Status:IPsec"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:645
+msgid "IPsec Debug Mode can be enabled at"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:645 usr/local/www/vpn_ipsec.php:646
+msgid "VPN:IPsec:Advanced Settings"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:646
+msgid "IPsec can be set to prefer older SAs at"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:71
+msgid "Deleted IPsec Pre-Shared Key"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:78
+msgid "VPN: IPsec: Keys"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:112
+#: usr/local/www/vpn_ipsec_keys_edit.php:72
+#: usr/local/www/vpn_ipsec_keys_edit.php:134
+msgid "Identifier"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:118 usr/local/www/vpn_ipsec_keys.php:166
+msgid "add key"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:128
+msgid "ANY USER"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:142
+msgid "edit"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:156
+msgid "edit key"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:157
+msgid "Do you really want to delete this Pre-Shared Key?"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:157
+msgid "delete key"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:182
+#: usr/local/www/vpn_ipsec_keys_edit.php:163
+msgid "PSK for any user can be set by using an identifier of any/ANY"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:77
+msgid "The identifier contains invalid characters."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:80
+msgid "A user with this name already exists. Add the key to the user instead."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:84
+#: usr/local/www/vpn_ipsec_phase1.php:193
+msgid "Pre-Shared Key contains invalid characters."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:90
+msgid "Another entry with the same identifier already exists."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:107
+msgid "Edited"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:110
+msgid "Added"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:121
+msgid "VPN: IPsec: Edit Pre-Shared Key"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:138
+msgid ""
+"This can be either an IP address, fully qualified domain name or an e-mail "
+"address"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:133
+msgid "User Authentication Source"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:133
+msgid "Group Authentication Source"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:139
+msgid ""
+"A valid IP address for 'Virtual Address Pool Network' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:143
+msgid "A valid value for 'DNS Default Domain' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:150
+msgid "A valid split DNS domain list must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:160
+msgid ""
+"At least one DNS server must be specified to enable the DNS Server option."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:162
+msgid "A valid IP address for 'DNS Server #1' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:164
+msgid "A valid IP address for 'DNS Server #2' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:166
+msgid "A valid IP address for 'DNS Server #3' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:168
+msgid "A valid IP address for 'DNS Server #4' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:173
+msgid ""
+"At least one WINS server must be specified to enable the DNS Server option."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:175
+msgid "A valid IP address for 'WINS Server #1' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:177
+msgid "A valid IP address for 'WINS Server #2' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:182
+msgid "A valid value for 'Login Banner' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:241
+msgid "Mobile"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:336
+msgid ""
+"Support for IPsec Mobile clients is enabled but a Phase1 definition was not "
+"found"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:336
+msgid "Please click Create to define one."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:336
+msgid "Create Phase1"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:359
+msgid "IKE Extensions"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:368
+msgid "Enable IPsec Mobile Client Support"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:379
+msgid "Extended Authentication (Xauth)"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:383
+msgid "User Authentication"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:401
+msgid "Group Authentication"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:406
+msgid "system"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:415
+msgid "Client Configuration (mode-cfg)"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:419
+msgid "Virtual Address Pool"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:428
+msgid "Provide a virtual IP address to clients"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:451
+msgid "Network List"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:460
+msgid "Provide a list of accessible networks to clients"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:467
+msgid "Save Xauth Password"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:476
+msgid "Allow clients to save Xauth passwords (Cisco VPN client only)."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:477
+msgid ""
+"NOTE: With iPhone clients, this does not work when deployed via the iPhone "
+"configuration utility, only by manual entry."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:484
+#: usr/local/www/vpn_openvpn_csc.php:507
+#: usr/local/www/vpn_openvpn_server.php:1510
+msgid "DNS Default Domain"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:493
+#: usr/local/www/vpn_openvpn_csc.php:517
+#: usr/local/www/vpn_openvpn_server.php:1520
+msgid "Provide a default domain name to clients"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:507
+msgid "Split DNS"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:516
+msgid ""
+"Provide a list of split DNS domain names to clients. Enter a comma separated "
+"list."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:517
+msgid ""
+"NOTE: If left blank, and a default domain is set, it will be used for this "
+"value."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:531
+#: usr/local/www/vpn_openvpn_csc.php:532
+#: usr/local/www/vpn_openvpn_server.php:1535
+msgid "DNS Servers"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:540
+#: usr/local/www/vpn_openvpn_csc.php:542
+#: usr/local/www/vpn_openvpn_server.php:1545
+msgid "Provide a DNS server list to clients"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:573
+#: usr/local/www/vpn_openvpn_csc.php:680
+#: usr/local/www/vpn_openvpn_server.php:1703
+msgid "WINS Servers"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:582
+#: usr/local/www/vpn_openvpn_csc.php:690
+#: usr/local/www/vpn_openvpn_server.php:1713
+msgid "Provide a WINS server list to clients"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:603
+msgid "Phase2 PFS Group"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:612
+msgid ""
+"Provide the Phase2 PFS group to clients ( overrides all mobile phase2 "
+"settings )"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:633
+msgid "Login Banner"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_mobile.php:642
+msgid "Provide a login banner to clients"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:165
+msgid "EAP-TLS can only be used with IKEv2 type VPNs."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:186
+#: usr/local/www/vpn_ipsec_phase1.php:649
+msgid "Remote gateway"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:197
+msgid "The P1 lifetime must be an integer."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:201
+msgid "A valid remote gateway address or host name must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:203
+msgid ""
+"A valid remote gateway IPv4 address must be specified or you need to change "
+"protocol to IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:205
+msgid ""
+"A valid remote gateway IPv6 address must be specified or you need to change "
+"protocol to IPv4"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:214
+#, php-format
+msgid "The remote gateway \"%1$s\" is already used by phase1 \"%2$s\"."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:225
+msgid "There is a Phase 2 using IPv6, you cannot use IPv4."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:229
+msgid "There is a Phase 2 using IPv4, you cannot use IPv6."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:242
+msgid "Please enter an address for 'My Identifier'"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:245
+msgid "Please enter a keyid tag for 'My Identifier'"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:248
+msgid "Please enter a fully qualified domain name for 'My Identifier'"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:251
+msgid "Please enter a user and fully qualified domain name for 'My Identifier'"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:254
+msgid "Please enter a dynamic domain name for 'My Identifier'"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:257
+msgid "A valid IP address for 'My identifier' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:260
+msgid "A valid domain name for 'My identifier' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:264
+msgid "A valid FQDN for 'My identifier' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:269
+msgid ""
+"A valid User FQDN in the form of user@my.domain.com for 'My identifier' must "
+"be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:274
+msgid "A valid Dynamic DNS address for 'My identifier' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:284
+msgid "Please enter an address for 'Peer Identifier'"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:287
+msgid "Please enter a keyid tag for 'Peer Identifier'"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:290
+msgid "Please enter a fully qualified domain name for 'Peer Identifier'"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:293
+msgid ""
+"Please enter a user and fully qualified domain name for 'Peer Identifier'"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:296
+msgid "A valid IP address for 'Peer identifier' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:299
+msgid "A valid domain name for 'Peer identifier' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:303
+msgid "A valid FQDN for 'Peer identifier' must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:308
+msgid ""
+"A valid User FQDN in the form of user@my.domain.com for 'Peer identifier' "
+"must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:314
+msgid "A numeric value must be specified for DPD delay."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:317
+msgid "A numeric value must be specified for DPD retries."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:321
+msgid "Valid arguments for IKE type is v1 or v2 or auto"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:398
+#: usr/local/www/vpn_ipsec_phase1.php:400
+msgid "Edit Phase 1"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:566
+#: usr/local/www/vpn_openvpn_client.php:462
+#: usr/local/www/vpn_openvpn_csc.php:333
+#: usr/local/www/vpn_openvpn_server.php:760
+msgid "General information"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:572
+msgid "Disable this phase1 entry"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:574
+msgid ""
+"Set this option to disable this phase1 without removing it from the list"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:580
+msgid "Key Exchange version"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:591
+msgid ""
+"Select the Internet Key Exchange protocol version to be used, IKEv1 or IKEv2"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:595
+msgid "Internet Protocol"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:606
+msgid "Select the Internet Protocol family from this dropdown"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:642
+msgid "Select the interface for the local endpoint of this phase1 entry"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:653
+msgid "Enter the public IP address or host name of the remote gateway"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:675
+msgid "Phase 1 proposal (Authentication)"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:679
+#: usr/local/www/vpn_openvpn_client.php:604
+msgid "Authentication method"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:694
+#: usr/local/www/vpn_ipsec_phase1.php:831
+#: usr/local/www/vpn_ipsec_phase1.php:847
+msgid "Must match the setting chosen on the remote side"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:699
+msgid "Negotiation mode"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:710
+msgid "Aggressive is more flexible, but less secure"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:714
+msgid "My identifier"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:727
+msgid "Peer identifier"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:742
+msgid ""
+"NOTE: This is known as the \"group\" setting on some VPN client "
+"implementations"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:753
+msgid "Input your Pre-Shared Key string"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:758
+msgid "My Certificate"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:772
+msgid "Select a certificate previously configured in the Certificate Manager"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:777
+msgid "My Certificate Authority"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:791
+msgid ""
+"Select a certificate authority previously configured in the Certificate "
+"Manager"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:797
+msgid "Phase 1 proposal (Algorithms)"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:801
+#: usr/local/www/vpn_openvpn_client.php:828
+#: usr/local/www/vpn_openvpn_server.php:1068
+msgid "Encryption algorithm"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:820
+msgid "Hash algorithm"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:836
+msgid "DH key group"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:865
+msgid "Disable Rekey"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:868
+msgid "Whether a connection should be renegotiated when it is about to expire."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:872
+msgid "Disable Reauth"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:875
+msgid ""
+"Whether rekeying of an IKE_SA should also reauthenticate the peer. In IKEv1, "
+"reauthentication is always done."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:879
+msgid "NAT Traversal"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:883
+msgid "Force"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:887
+msgid ""
+"Set this option to enable the use of NAT-T (i.e. the encapsulation of ESP in "
+"UDP packets) if needed, which can help with clients that are behind "
+"restrictive firewalls"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:893
+msgid "Dead Peer Detection"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:896
+msgid "Enable DPD"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:902
+msgid "Delay between requesting peer acknowledgement"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:906
+msgid "retries"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:908
+msgid "Number of consecutive failures allowed before disconnect"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:132
+msgid "A valid ikeid must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:136
+msgid "Local network type"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:136
+msgid "Unique Identifier"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:139
+msgid "Remote network type"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:149
+msgid "A valid local network bit count must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:152
+msgid "A valid local network IP address must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:154
+msgid ""
+"A valid local network IPv4 address must be specified or you need to change "
+"Mode to IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:156
+msgid ""
+"A valid local network IPv6 address must be specified or you need to change "
+"Mode to IPv4"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:166
+#: usr/local/www/vpn_ipsec_phase2.php:192
+msgid "Invalid Local Network."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:166
+#: usr/local/www/vpn_ipsec_phase2.php:192
+msgid "has no subnet."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:173
+msgid "A valid NAT local network bit count must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:175
+msgid ""
+"You cannot configure a network type address for NAT while only an address "
+"type is selected for local source."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:178
+msgid "A valid NAT local network IP address must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:180
+msgid ""
+"A valid NAT local network IPv4 address must be specified or you need to "
+"change Mode to IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:182
+msgid ""
+"A valid NAT local network IPv6 address must be specified or you need to "
+"change Mode to IPv4"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:199
+msgid "A valid remote network bit count must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:202
+msgid "A valid remote network IP address must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:204
+msgid ""
+"A valid remote network IPv4 address must be specified or you need to change "
+"Mode to IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:206
+msgid ""
+"A valid remote network IPv6 address must be specified or you need to change "
+"Mode to IPv4"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:224
+msgid "Phase2 with this Local Network is already defined for mobile clients."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:249
+msgid ""
+"Phase2 with this Local/Remote networks combination is already defined for "
+"this Phase1."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:280
+#: usr/local/www/vpn_ipsec_phase2.php:285
+msgid ""
+"The local and remote networks of a phase 2 entry cannot overlap the outside "
+"of the tunnel (interface and remote gateway) configured in its phase 1."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:299
+msgid "At least one encryption algorithm must be selected."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:304
+msgid "At least one hashing algorithm needs to be selected."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:313
+msgid "The P2 lifetime must be an integer."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:362
+msgid "Edit Phase 2"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:555
+msgid "Disable this phase2 entry"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:557
+msgid ""
+"Set this option to disable this phase2 entry without removing it from the "
+"list"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:578
+msgid "Local Network"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:592
+#: usr/local/www/vpn_ipsec_phase2.php:627
+#, php-format
+msgid "%s subnet"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:614
+msgid ""
+"In case you need NAT/BINAT on this network specify the address to be "
+"translated"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:655
+msgid "Remote Network"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:706
+msgid "Phase 2 proposal (SA/Key Exchange)"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:721
+msgid "ESP is encryption, AH is authentication only"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:726
+msgid "Encryption algorithms"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:768
+msgid ""
+"Hint: use 3DES for best compatibility or if you have a hardware crypto "
+"accelerator card. Blowfish is usually the fastest in software encryption"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:774
+msgid "Hash algorithms"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:784
+msgid "PFS key group"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:802
+msgid "Set globally in mobile client options"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:820
+msgid "Automatically ping host"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:217
+msgid "IPsec Advanced Settings"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:220
+msgid "Security Associations"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:223
+msgid "Prefer older IPsec SAs"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:225
+msgid ""
+"By default, if several SAs match, the newest one is preferred if it's at "
+"least 30 seconds old. Select this option to always prefer old SAs over new "
+"ones."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:231
+msgid "IPsec Debug"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:233
+msgid "Start IPsec in debug mode based on sections selected"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:254
+msgid ""
+"Launches IPsec in debug mode so that more verbose logs will be generated to "
+"aid in troubleshooting."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:259
+msgid "IPsec Reload on Failover"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:262
+msgid "Force IPsec Reload on Failover"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:264
+msgid ""
+"In some circumstances using a gateway group as the interface for an IPsec "
+"tunnel does not function properly, and IPsec must be forcefully reloaded "
+"when a failover occurs. Because this will disrupt all IPsec tunnels, this "
+"behavior is disabled by default. Check this box to force IPsec to fully "
+"reload on failover."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:271
+msgid "Unencrypted payloads in IKEv1 Main Mode"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:274
+msgid "Accept unencrypted ID and HASH payloads in IKEv1 Main Mode"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:276
+msgid ""
+"Some implementations send the third Main Mode message unencrypted, probably "
+"to find the PSKs for the specified ID for authentication.This is very "
+"similar to Aggressive Mode, and has the same security implications: A "
+"passive attacker can sniff the negotiated Identity, and start brute forcing "
+"the PSK using the HASH payload. It is recommended to keep this option to no, "
+"unless you know exactly what the implications are and require compatibility "
+"to such devices (for example, some SonicWall boxes)."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:283
+msgid "Maximum MSS"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:286
+msgid "Enable MSS clamping on VPN traffic"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:290
+msgid ""
+"Enable MSS clamping on TCP flows over VPN. This helps overcome problems with "
+"PMTUD on IPsec VPN links. If left blank, the default value is 1400 bytes. "
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:75 usr/local/www/vpn_pppoe_edit.php:114
+#: usr/local/www/vpn_pppoe_edit.php:436 usr/local/www/vpn_pptp.php:83
+#: usr/local/www/vpn_pptp.php:362
+msgid "Server address"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:75 usr/local/www/vpn_pppoe_edit.php:114
+#: usr/local/www/vpn_pptp.php:83
+msgid "Remote start address"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:80 usr/local/www/vpn_pppoe_edit.php:119
+#: usr/local/www/vpn_pptp.php:88
+msgid "RADIUS server address"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:80 usr/local/www/vpn_pppoe_edit.php:119
+#: usr/local/www/vpn_pptp.php:88 usr/local/www/vpn_pptp.php:442
+msgid "RADIUS shared secret"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:86 usr/local/www/vpn_pppoe_edit.php:125
+#: usr/local/www/vpn_pptp.php:94
+msgid "A valid server address must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:89 usr/local/www/vpn_pptp.php:97
+msgid ""
+"'Server address' parameter should NOT be set to any IP address currently in "
+"use on this firewall."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:92 usr/local/www/vpn_pppoe_edit.php:127
+#: usr/local/www/vpn_pptp.php:100
+msgid "A valid remote start address must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:95 usr/local/www/vpn_pppoe_edit.php:129
+#: usr/local/www/vpn_pptp.php:103
+msgid "A valid RADIUS server address must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:111 usr/local/www/vpn_pppoe_edit.php:136
+#: usr/local/www/vpn_pptp.php:112
+msgid "The specified server address lies in the remote subnet."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:114 usr/local/www/vpn_pptp.php:116
+msgid "The specified server address is equal to the LAN interface address."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:285 usr/local/www/vpn_l2tp_users.php:94
+#: usr/local/www/vpn_pptp.php:306 usr/local/www/vpn_pptp_users.php:91
+msgid "Configuration"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:305
+msgid "Enable L2TP server"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:326
+msgid "Server Address"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:330
+msgid ""
+"Enter the IP address the L2TP server should give to clients for use as their "
+"\"gateway\""
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:332 usr/local/www/vpn_pppoe_edit.php:442
+#: usr/local/www/vpn_pptp.php:368
+msgid "Typically this is set to an unused IP just outside of the client range"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:335 usr/local/www/vpn_pppoe_edit.php:445
+#: usr/local/www/vpn_pptp.php:371
+msgid ""
+"NOTE: This should NOT be set to any IP address currently in use on this "
+"firewall"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:338
+msgid "Remote Address Range"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:342
+msgid "Specify the starting address for the client IP address subnet."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:359 usr/local/www/vpn_pppoe_edit.php:415
+msgid "is"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:363
+msgid "Number of L2TP users"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:376
+msgid "is ten L2TP clients"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:380
+msgid "Secret"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:384
+msgid ""
+"Specify optional secret shared between peers. Required on some devices/"
+"setups."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:388
+msgid "Authentication Type"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:391
+msgid "CHAP"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:395
+msgid "Specifies which protocol to use for authentication."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:399
+msgid "L2TP DNS Servers"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:405
+msgid "primary and secondary DNS servers assigned to L2TP clients"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:409 usr/local/www/vpn_pptp.php:393
+msgid "WINS Server"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:415 usr/local/www/vpn_pppoe_edit.php:473
+#: usr/local/www/vpn_pptp.php:399
+msgid "RADIUS"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:418 usr/local/www/vpn_pppoe_edit.php:476
+#: usr/local/www/vpn_pptp.php:402
+msgid "Use a RADIUS server for authentication"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:419
+msgid ""
+"When set, all users will be authenticated using the RADIUS server specified "
+"below. The local user database will not be used."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:422 usr/local/www/vpn_pppoe_edit.php:482
+#: usr/local/www/vpn_pptp.php:408
+msgid "Enable RADIUS accounting"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:423
+msgid "Sends accounting packets to the RADIUS server."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:426 usr/local/www/vpn_pptp.php:433
+msgid "RADIUS Server"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:430
+msgid "Enter the IP address of the RADIUS server."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:433
+msgid "RADIUS Shared Secret"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:437
+msgid ""
+"Enter the shared secret that will be used to authenticate to the RADIUS "
+"server."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:440
+msgid "RADIUS Issued IP's"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:444
+msgid "Issue IP Addresses via RADIUS server."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:457
+msgid ""
+"Don't forget to add a firewall rule to permit traffic from L2TP clients!"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp_users.php:86 usr/local/www/vpn_pptp_users.php:83
+msgid "Warning: RADIUS is enabled. The local user database will not be used."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp_users.php:88
+msgid "The l2tp user list has been modified"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp_users.php:88 usr/local/www/vpn_pptp_users.php:85
+msgid "You must apply the changes in order for them to take effect"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp_users.php:88
+msgid "Warning: this will terminate all current l2tp sessions!"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp_users_edit.php:95
+#: usr/local/www/vpn_pptp_users_edit.php:94
+msgid "The password contains invalid characters."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp_users_edit.php:101
+#: usr/local/www/vpn_pptp_users_edit.php:100
+msgid "The IP address entered is not valid."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp_users_edit.php:169
+#: usr/local/www/vpn_pptp_users_edit.php:160
+msgid "confirmation"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp_users_edit.php:170
+msgid "If you want to change the users password, enter it here twice."
+msgstr ""
+
+#: usr/local/www/vpn_l2tp_users_edit.php:177
+#: usr/local/www/vpn_pptp_users_edit.php:168
+msgid ""
+"If you want the user to be assigned a specific IP address, enter it here."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:41
+#: usr/local/www/vpn_openvpn_client.php:446
+#: usr/local/www/vpn_openvpn_csc.php:317
+#: usr/local/www/vpn_openvpn_server.php:744
+msgid "Client"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:88
+msgid "Client successfully deleted"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:180
+#: usr/local/www/vpn_openvpn_server.php:232
+msgid ""
+"Protocol and IP address families do not match. You cannot select an IPv6 "
+"protocol and an IPv4 IP address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:182
+#: usr/local/www/vpn_openvpn_server.php:234
+msgid ""
+"Protocol and IP address families do not match. You cannot select an IPv4 "
+"protocol and an IPv6 IP address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:184
+#: usr/local/www/vpn_openvpn_server.php:236
+msgid ""
+"An IPv4 protocol was selected, but the selected interface has no IPv4 "
+"address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:186
+#: usr/local/www/vpn_openvpn_server.php:238
+msgid ""
+"An IPv6 protocol was selected, but the selected interface has no IPv6 "
+"address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:202
+#: usr/local/www/vpn_openvpn_server.php:273
+msgid "The specified 'Local port' is in use. Please select another value"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:221
+msgid "User name and password are required for proxy with authentication."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:240
+msgid "The bandwidth limit must be a positive numeric value."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:248
+#: usr/local/www/vpn_openvpn_server.php:281
+msgid "The field 'Shared Key' does not appear to be valid"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:253
+#: usr/local/www/vpn_openvpn_server.php:286
+msgid "The field 'TLS Authentication Key' does not appear to be valid"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:262
+#: usr/local/www/vpn_openvpn_server.php:337
+msgid "Shared key"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:268
+msgid ""
+"If no Client Certificate is selected, a username and password must be "
+"entered."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:447
+#: usr/local/www/vpn_openvpn_csc.php:318
+#: usr/local/www/vpn_openvpn_server.php:745
+msgid "Client Specific Overrides"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:476
+msgid "Disable this client"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:481
+msgid ""
+"Set this option to disable this client without removing it from the list"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:485
+#: usr/local/www/vpn_openvpn_server.php:783
+msgid "Server Mode"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:515
+msgid "Device mode"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:566
+#: usr/local/www/vpn_openvpn_server.php:886
+msgid "Local port"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:570
+msgid ""
+"Set this option if you would like to bind to a specific port. Leave this "
+"blank or enter 0 for a random dynamic port."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:574
+msgid "Server host or address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:580
+msgid "Server port"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:586
+msgid "Proxy host or address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:592
+msgid "Proxy port"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:598
+msgid "Proxy authentication extra options"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:610
+msgid "basic"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:611
+msgid "ntlm"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:642
+msgid "Server host name resolution"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:652
+msgid "Infinitely resolve server"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:657
+msgid ""
+"Continuously attempt to resolve the server host name. Useful when "
+"communicating with a server that is not permanently connected to the Internet"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:674
+msgid "User Authentication Settings"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:677
+msgid "User name/pass"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:679
+msgid "Leave empty when no user name and password are needed."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:706
+#: usr/local/www/vpn_openvpn_server.php:903
+msgid "Cryptographic Settings"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:709
+#: usr/local/www/vpn_openvpn_server.php:906
+msgid "TLS Authentication"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:719
+#: usr/local/www/vpn_openvpn_server.php:916
+msgid "Enable authentication of TLS packets"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:733
+#: usr/local/www/vpn_openvpn_server.php:930
+msgid "Automatically generate a shared TLS authentication key"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:744
+#: usr/local/www/vpn_openvpn_client.php:821
+#: usr/local/www/vpn_openvpn_server.php:941
+#: usr/local/www/vpn_openvpn_server.php:1061
+msgid "Paste your shared key here"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:770
+msgid "Client Certificate"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:799
+#: usr/local/www/vpn_openvpn_server.php:1039
+msgid "Shared Key"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:810
+#: usr/local/www/vpn_openvpn_server.php:1050
+msgid "Automatically generate a shared key"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:846
+#: usr/local/www/vpn_openvpn_server.php:1086
+msgid "Auth Digest Algorithm"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:861
+msgid ""
+"NOTE: Leave this set to SHA1 unless the server is set to match. SHA1 is the "
+"default for OpenVPN."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:865
+#: usr/local/www/vpn_openvpn_server.php:1105
+msgid "Hardware Crypto"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:886
+#: usr/local/www/vpn_openvpn_csc.php:396
+#: usr/local/www/vpn_openvpn_server.php:1169
+msgid "Tunnel Settings"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:889
+#: usr/local/www/vpn_openvpn_server.php:1172
+msgid "IPv4 Tunnel Network"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:893
+#: usr/local/www/vpn_openvpn_csc.php:403
+msgid ""
+"This is the virtual network used for private communications between this "
+"client and the server expressed using CIDR (eg. 10.0.8.0/24). The first "
+"network address is assumed to be the server address and the second network "
+"address will be assigned to the client virtual interface"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:903
+#: usr/local/www/vpn_openvpn_server.php:1186
+msgid "IPv6 Tunnel Network"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:907
+msgid ""
+"This is the IPv6 virtual network used for private communications between "
+"this client and the server expressed using CIDR (eg. fe80::/64). The first "
+"network address is assumed to be the server address and the second network "
+"address will be assigned to the client virtual interface"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:917
+#: usr/local/www/vpn_openvpn_csc.php:435
+#: usr/local/www/vpn_openvpn_server.php:1313
+msgid "IPv4 Remote Network/s"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:921
+msgid ""
+"These are the IPv4 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more CIDR ranges. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank to only communicate with other clients"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:931
+#: usr/local/www/vpn_openvpn_csc.php:450
+#: usr/local/www/vpn_openvpn_server.php:1327
+msgid "IPv6 Remote Network/s"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:935
+msgid ""
+"These are the IPv6 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more IP/PREFIX. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank to only communicate with other clients"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:945
+msgid "Limit outgoing bandwidth"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:949
+msgid ""
+"Maximum outgoing bandwidth for this tunnel. Leave empty for no limit. The "
+"input value has to be something between 100 bytes/sec and 100 Mbytes/sec "
+"(entered as bytes per second)"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:969
+msgid ""
+"Compress tunnel packets using the LZO algorithm. Adaptive compression will "
+"dynamically disable compression for a period of time if OpenVPN detects that "
+"the data in the packets is not being compressed efficiently."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:973
+#: usr/local/www/vpn_openvpn_server.php:1366
+msgid "Type-of-Service"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:983
+#: usr/local/www/vpn_openvpn_server.php:1376
+msgid ""
+"Set the TOS IP header value of tunnel packets to match the encapsulated "
+"packet value"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:992
+#: usr/local/www/vpn_openvpn_server.php:1421
+msgid "Disable IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1002
+#: usr/local/www/vpn_openvpn_server.php:1431
+msgid "Don't forward IPv6 traffic"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1011
+msgid "Don't pull routes"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1021
+msgid "Don't add or remove routes automatically. Instead pass routes to "
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1021
+msgid "script using environmental variables"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1030
+msgid "Don't add/remove routes"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1040
+msgid ""
+"This option effectively bars the server from adding routes to the client's "
+"routing table, however note that this option still allows the server to set "
+"the TCP/IP properties of the client's TUN/TAP interface"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1054
+#: usr/local/www/vpn_openvpn_server.php:1770
+msgid "Advanced configuration"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1063
+msgid ""
+"Enter any additional options you would like to add to the OpenVPN client "
+"configuration here, separated by a semicolon"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1064
+msgid "EXAMPLE:"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1072
+#: usr/local/www/vpn_openvpn_server.php:1788
+msgid "Verbosity level"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1085
+#: usr/local/www/vpn_openvpn_server.php:1801
+msgid ""
+"Each level shows all info from the previous levels. Level 3 is recommended "
+"if you want a good summary of what's happening without being swamped by "
+"output"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1086
+#: usr/local/www/vpn_openvpn_server.php:1802
+msgid "No output except fatal errors"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1087
+#: usr/local/www/vpn_openvpn_server.php:1803
+msgid "Normal usage range"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1088
+#: usr/local/www/vpn_openvpn_server.php:1804
+msgid ""
+"Output R and W characters to the console for each packet read and write, "
+"uppercase is used for TCP/UDP packets and lowercase is used for TUN/TAP "
+"packets"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1089
+#: usr/local/www/vpn_openvpn_server.php:1805
+msgid "Debug info range"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1126
+msgid "add client"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1133
+msgid "Additional OpenVPN clients can be added here."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1162
+msgid "edit client"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1166
+msgid "delete client"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:41
+msgid "Client Specific Override"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:68
+msgid "Client Specific Override successfully deleted"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:148
+#: usr/local/www/vpn_openvpn_server.php:290
+msgid "The field 'DNS Server #1' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:150
+#: usr/local/www/vpn_openvpn_server.php:292
+msgid "The field 'DNS Server #2' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:152
+#: usr/local/www/vpn_openvpn_server.php:294
+msgid "The field 'DNS Server #3' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:154
+#: usr/local/www/vpn_openvpn_server.php:296
+msgid "The field 'DNS Server #4' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:159
+#: usr/local/www/vpn_openvpn_server.php:301
+msgid "The field 'NTP Server #1' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:161
+#: usr/local/www/vpn_openvpn_server.php:303
+msgid "The field 'NTP Server #2' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:163
+#: usr/local/www/vpn_openvpn_server.php:305
+msgid "The field 'NTP Server #3' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:165
+#: usr/local/www/vpn_openvpn_server.php:307
+msgid "The field 'NTP Server #4' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:171
+#: usr/local/www/vpn_openvpn_server.php:313
+msgid "The field 'WINS Server #1' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:173
+#: usr/local/www/vpn_openvpn_server.php:315
+msgid "The field 'WINS Server #2' must contain a valid IP address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:177
+#: usr/local/www/vpn_openvpn_server.php:319
+msgid ""
+"The field 'NetBIOS Data Distribution Server #1' must contain a valid IP "
+"address"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:347
+msgid "Disable this override"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:352
+msgid ""
+"Set this option to disable this client-specific override without removing it "
+"from the list"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:356
+msgid "Common name"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:360
+msgid "Enter the client's X.509 common name here"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:372
+msgid "Connection blocking"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:382
+msgid "Block this client connection based on its common name"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:387
+msgid ""
+"Don't use this option to permanently disable a client due to a compromised "
+"key or password. Use a CRL (certificate revocation list) instead"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:399
+#: usr/local/www/vpn_openvpn_server.php:1833
+msgid "Tunnel Network"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:413
+#: usr/local/www/vpn_openvpn_server.php:1287
+msgid "IPv4 Local Network/s"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:417
+msgid ""
+"These are the IPv4 networks that will be accessible from this particular "
+"client. Expressed as a comma-separated list of one or more CIDR ranges."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:419 usr/local/www/vpn_openvpn_csc.php:430
+msgid ""
+"NOTE: You do not need to specify networks here if they have already been "
+"defined on the main server configuration."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:424
+#: usr/local/www/vpn_openvpn_server.php:1300
+msgid "IPv6 Local Network/s"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:428
+msgid ""
+"These are the IPv6 networks that will be accessible from this particular "
+"client. Expressed as a comma-separated list of one or more IP/PREFIX "
+"networks."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:439
+msgid ""
+"These are the IPv4 networks that will be routed to this client specifically "
+"using iroute, so that a site-to-site VPN can be established. Expressed as a "
+"comma-separated list of one or more CIDR ranges. You may leave this blank if "
+"there are no client-side networks to be routed"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:445
+msgid ""
+"NOTE: Remember to add these subnets to the IPv4 Remote Networks list on the "
+"corresponding OpenVPN server settings."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:454
+msgid ""
+"These are the IPv6 networks that will be routed to this client specifically "
+"using iroute, so that a site-to-site VPN can be established. Expressed as a "
+"comma-separated list of one or more IP/PREFIX networks. You may leave this "
+"blank if there are no client-side networks to be routed"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:460
+msgid ""
+"NOTE: Remember to add these subnets to the IPv6 Remote Networks list on the "
+"corresponding OpenVPN server settings."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:465
+#: usr/local/www/vpn_openvpn_server.php:1269
+msgid "Redirect Gateway"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:475
+#: usr/local/www/vpn_openvpn_server.php:1279
+msgid "Force all client generated traffic through the tunnel"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:486
+#: usr/local/www/vpn_openvpn_server.php:1446
+msgid "Client Settings"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:489
+msgid "Server Definitions"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:499
+msgid "Prevent this client from receiving any server-defined client settings"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:584
+#: usr/local/www/vpn_openvpn_server.php:1607
+msgid "NTP Servers"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:594
+#: usr/local/www/vpn_openvpn_server.php:1617
+msgid "Provide a NTP server list to clients"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:620
+#: usr/local/www/vpn_openvpn_server.php:1643
+msgid "NetBIOS Options"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:630
+#: usr/local/www/vpn_openvpn_server.php:1653
+msgid "Enable NetBIOS over TCP/IP"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:635
+#: usr/local/www/vpn_openvpn_server.php:1658
+msgid ""
+"If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) "
+"will be disabled"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:642
+#: usr/local/www/vpn_openvpn_server.php:1665
+msgid "Node Type"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:655
+#: usr/local/www/vpn_openvpn_server.php:1678
+msgid ""
+"Possible options: b-node (broadcasts), p-node (point-to-point name queries "
+"to a WINS server), m-node (broadcast then query name server), and h-node "
+"(query name server, then broadcast)"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:669
+#: usr/local/www/vpn_openvpn_server.php:1692
+msgid ""
+"A NetBIOS Scope\tID provides an extended naming service for\tNetBIOS over "
+"TCP/IP. The NetBIOS scope ID isolates NetBIOS traffic on a single network to "
+"only those nodes with the same NetBIOS scope ID"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:722
+msgid ""
+"Enter any additional options you would like to add for this client specific "
+"override, separated by a semicolon"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:723
+#: usr/local/www/vpn_openvpn_server.php:1780
+msgid "EXAMPLE: push \"route 10.0.0.0 255.255.255.0\""
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:770
+msgid "edit csc"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:773
+msgid "Do you really want to delete this csc?"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:774
+msgid "delete csc"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:785
+msgid "add csc"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:792
+msgid "Additional OpenVPN client specific overrides can be added here."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:89
+msgid "Server successfully deleted"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:247
+msgid ""
+"You must select a Backend for Authentication if the server mode requires "
+"User Auth."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:328
+msgid "The field 'Concurrent connections' must be numeric."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:342
+msgid "Tunnel network"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:345
+msgid ""
+"Using a tunnel network and server bridge settings together is not allowed."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:348
+msgid "Server Bridge DHCP Start and End must both be empty, or defined."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:350
+msgid "Server Bridge DHCP Start must be an IPv4 address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:352
+msgid "Server Bridge DHCP End must be an IPv4 address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:354
+msgid "The Server Bridge DHCP range is invalid (start higher than end)."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:774
+msgid "Disable this server"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:779
+msgid ""
+"Set this option to disable this server without removing it from the list"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:798
+msgid "Backend for authentication"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:830
+msgid "Device Mode"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:967
+msgid "Peer Certificate Revocation List"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:992
+msgid "Server Certificate"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1021
+msgid "DH Parameters Length"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1101
+msgid ""
+"NOTE: Leave this set to SHA1 unless all clients are set to match. SHA1 is "
+"the default for OpenVPN."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1123
+msgid "Certificate Depth"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1141
+msgid ""
+"When a certificate-based client logs in, do not accept certificates below "
+"this depth. Useful for denying certificates made with intermediate CAs "
+"generated from the same CA as the server."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1148
+msgid "Strict User/CN Matching"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1158
+msgid ""
+"When authenticating users, enforce a match between the common name of the "
+"client certificate and the username given at login."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1176
+msgid ""
+"This is the IPv4 virtual network used for private communications between "
+"this server and client hosts expressed using CIDR (eg. 10.0.8.0/24). The "
+"first network address will be assigned to the\tserver virtual interface. The "
+"remaining network addresses can optionally be assigned to connecting "
+"clients. (see Address Pool)"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1190
+msgid ""
+"This is the IPv6 virtual network used for private communications between "
+"this server and client hosts expressed using CIDR (eg. fe80::/64). The first "
+"network address will be assigned to the server virtual interface. The "
+"remaining network addresses can optionally be assigned to connecting "
+"clients. (see Address Pool)"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1200
+msgid "Bridge DHCP"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1210
+msgid "Allow clients on the bridge to obtain DHCP."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1218
+msgid "Bridge Interface"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1240
+msgid ""
+"The interface to which this tap instance will be bridged. This is not done "
+"automatically. You must assign this interface and create the bridge "
+"separately. This setting controls which existing IP address and subnet mask "
+"are used by OpenVPN for the bridge. Setting this to 'none' will cause the "
+"Server Bridge DHCP settings below to be ignored."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1249
+msgid "Server Bridge DHCP Start"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1253
+msgid ""
+"When using tap mode as a multi-point server, you may optionally supply a "
+"DHCP range to use on the interface to which this tap instance is bridged. If "
+"these settings are left blank, DHCP will be passed through to the LAN, and "
+"the interface setting above will be ignored."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1262
+msgid "Server Bridge DHCP End"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1291
+msgid ""
+"These are the IPv4 networks that will be accessible from the remote "
+"endpoint. Expressed as a comma-separated list of one or more CIDR ranges. "
+"You may leave this blank if you don't want to add a route to the local "
+"network through this tunnel on the remote machine. This is generally set to "
+"your LAN network"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1304
+msgid ""
+"These are the IPv6 networks that will be accessible from the remote "
+"endpoint. Expressed as a comma-separated list of one or more IP/PREFIX. You "
+"may leave this blank if you don't want to add a route to the local network "
+"through this tunnel on the remote machine. This is generally set to your LAN "
+"network"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1317
+msgid ""
+"These are the IPv4 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more CIDR ranges. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank if you don't want a site-to-site VPN"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1331
+msgid ""
+"These are the IPv6 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more IP/PREFIX. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank if you don't want a site-to-site VPN"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1341
+msgid "Concurrent connections"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1345
+msgid ""
+"Specify the maximum number of clients allowed to concurrently connect to "
+"this server"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1362
+msgid ""
+"Compress tunnel packets using the LZO algorithm. Adaptive compression will "
+"dynamically disable compression for a period of time if OpenVPN detects that "
+"the data in the packets is not being compressed efficiently"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1384
+msgid "Inter-client communication"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1394
+msgid "Allow communication between clients connected to this server"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1402
+msgid "Duplicate Connections"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1412
+msgid ""
+"Allow multiple concurrent connections from clients using the same Common "
+"Name.<br />NOTE: This is not generally recommended, but may be needed for "
+"some scenarios."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1449
+msgid "Dynamic IP"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1459
+msgid ""
+"Allow connected clients to retain their connections if their IP address "
+"changes"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1467
+msgid "Address Pool"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1477
+msgid "Provide a virtual adapter IP address to clients (see Tunnel Network)"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1485
+msgid "Topology"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1495
+msgid ""
+"Allocate only one IP per client (topology subnet), rather than an isolated "
+"subnet per client (topology net30)."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1502
+msgid ""
+"Relevant when supplying a virtual adapter IP address to clients when using "
+"tun mode on IPv4."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1503
+msgid ""
+"Some clients may require this even for IPv6, such as OpenVPN Connect (iOS/"
+"Android). Others may break if it is present, such as older versions of "
+"OpenVPN or clients such as Yealink phones."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1588
+msgid "Force DNS cache update"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1598
+msgid ""
+"Run ''net stop dnscache'', ''net start dnscache'', ''ipconfig /flushdns'' "
+"and ''ipconfig /registerdns'' on connection initiation. This is known to "
+"kick Windows into recognizing pushed DNS servers."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1688
+msgid "Scope ID"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1739
+msgid "Client Management Port"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1749
+msgid ""
+"Use a different management port on clients. The default port is 166. Specify "
+"a different port if the client machines need to select from multiple OpenVPN "
+"links."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1779
+msgid ""
+"Enter any additional options you would like to add to the OpenVPN server "
+"configuration here, separated by a semicolon"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1832
+msgid "Protocol / Port"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1874
+msgid "Do you really want to delete this server?"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1887
+msgid "Additional OpenVPN servers can be added here."
+msgstr ""
+
+#: usr/local/www/vpn_pppoe.php:99
+msgid "The PPPoE entry list has been changed"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe.php:112 usr/local/www/vpn_pppoe.php:147
+msgid "add a new pppoe instance"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe.php:134
+msgid "edit PPPoE instance"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe.php:135
+msgid ""
+"Do you really want to delete this entry? All elements that still use it will "
+"become invalid (e.g. filter rules)!"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe.php:135
+msgid "delete pppoe instance"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:138
+msgid "The specified server address is equal to an interface ip address."
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:143
+#, php-format
+msgid "No password specified for username %s"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:145
+#, php-format
+msgid "Incorrect ip address specified for username %s"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:151
+msgid "Wrong data submitted"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:366
+msgid "PPPoE server configuration"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:379
+msgid "Enable PPPoE server"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:402
+msgid "Subnet netmask"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:415
+msgid "Hint"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:419
+msgid "No. PPPoE users"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:432
+msgid "Hint: 10 is ten PPPoE clients"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:440
+msgid ""
+"Enter the IP address the PPPoE server should give to clients for use as "
+"their \"gateway\""
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:448 usr/local/www/vpn_pptp.php:374
+msgid "Remote address range"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:452
+msgid "Specify the starting address for the client IP address subnet"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:469
+msgid ""
+"If entered they will be given to all PPPoE clients, else LAN DNS and one WAN "
+"DNS will go to all clients"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:477 usr/local/www/vpn_pptp.php:403
+msgid ""
+"When set, all users will be authenticated using the RADIUS server specified "
+"below. The local user database will not be used"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:484 usr/local/www/vpn_pptp.php:409
+msgid "Sends accounting packets to the RADIUS server"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:486
+msgid "Use Backup RADIUS Server"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:487
+msgid ""
+"When set, if primary server fails all requests will be sent via backup server"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:490
+msgid "NAS IP Address"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:493
+msgid "RADIUS server NAS IP Address"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:497 usr/local/www/vpn_pptp.php:427
+msgid "RADIUS Accounting Update"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:500
+msgid "RADIUS accounting update period in seconds"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:504 usr/local/www/vpn_pptp.php:416
+msgid "RADIUS issued IPs"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:507
+msgid "Issue IP Addresses via RADIUS server"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:510
+msgid "RADIUS server Primary"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:515
+msgid ""
+"Enter the IP address, authentication port and accounting port (optional) of "
+"the RADIUS server."
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:516 usr/local/www/vpn_pppoe_edit.php:532
+msgid "standard port 1812 and 1813 accounting"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:519
+msgid "RADIUS primary shared secret"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:522 usr/local/www/vpn_pppoe_edit.php:539
+#: usr/local/www/vpn_pptp.php:446
+msgid ""
+"Enter the shared secret that will be used to authenticate to the RADIUS "
+"server"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:526
+msgid "RADIUS server Secondary"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:531
+msgid ""
+"Enter the IP address, authentication port and accounting port (optional) of "
+"the backup RADIUS server."
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:535
+msgid "RADIUS secondary shared secret"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:543
+msgid "User (s)"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:611
+msgid ""
+"don't forget to add a firewall rule to permit traffic from PPPoE clients"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:121
+msgid "PPTP redirection target address"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:126
+msgid "A valid target address must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:197 usr/local/www/vpn_pptp_users.php:72
+#: usr/local/www/vpn_pptp_users_edit.php:138
+msgid "VPN PPTP"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:301
+msgid ""
+"PPTP is no longer considered a secure VPN technology because it relies upon "
+"MS-CHAPv2 which has been compromised. If you continue to use PPTP be aware "
+"that intercepted traffic can be decrypted by a third party, so it should be "
+"considered unencrypted. We advise migrating to another VPN type such as "
+"OpenVPN or IPsec.<br /><br /><a href=\"https://isc.sans.edu/diary/End+of+Days"
+"+for+MS-CHAPv2/13807\">Read More</a>"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:327
+msgid "Redirect incoming PPTP connections to"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:330
+msgid "PPTP redirection"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:334
+msgid ""
+"Enter the IP address of a host which will accept incoming PPTP connections"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:341
+msgid "Enable PPTP server"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:344
+msgid "No. PPTP users"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:358
+msgid "Hint: 10 is ten PPTP clients"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:366
+msgid ""
+"Enter the IP address the PPTP server should give to clients for use as their "
+"\"gateway\""
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:379
+msgid "Specify the starting address for the client IP subnet"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:383
+msgid "PPTP DNS Servers"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:389
+msgid "primary and secondary DNS servers assigned to PPTP clients"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:412
+msgid "Secondary RADIUS server for failover authentication"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:413
+msgid ""
+"When set, all requests will go to the secondary server when primary fails"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:417
+msgid "Issue IP addresses via RADIUS server"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:421
+msgid "RADIUS NAS IP"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:439 usr/local/www/vpn_pptp.php:456
+msgid ""
+"Enter the IP address, RADIUS port, and RADIUS accounting port of the RADIUS "
+"server"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:459
+msgid "Secondary RADIUS shared secret"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:463
+msgid ""
+"Enter the shared secret that will be used to authenticate to the secondary "
+"RADIUS server"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:473
+msgid "Require 128-bit encryption"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:474
+msgid ""
+"When set, only 128-bit encryption will be accepted. Otherwise 40-bit and 56-"
+"bit encryption will be accepted as well. Note that encryption will always be "
+"forced on PPTP connections (i.e. unencrypted connections will not be "
+"accepted)"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:488
+msgid "don't forget to "
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:488
+msgid "add a firewall rule"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:488
+msgid "to permit traffic from PPTP clients"
+msgstr ""
+
+#: usr/local/www/vpn_pptp_users.php:85
+msgid "The PPTP user list has been modified"
+msgstr ""
+
+#: usr/local/www/vpn_pptp_users.php:85
+msgid "Warning: this will terminate all current PPTP sessions"
+msgstr ""
+
+#: usr/local/www/vpn_pptp_users_edit.php:91
+msgid "The password cannot start with '!'."
+msgstr ""
+
+#: usr/local/www/vpn_pptp_users_edit.php:161
+msgid "If you want to change the users' password, enter it here twice."
+msgstr ""
+
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:81
+msgid "Int."
+msgstr ""
+
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:134
+msgid "Checking ..."
+msgstr ""
+
+#: usr/local/www/widgets/widgets/log.widget.php:180
+msgid "IF"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/smart_status.widget.php:38
+msgid "Drive"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/smart_status.widget.php:39
+msgid "Ident"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:133
+msgid "Obtaining update status"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:139
+msgid "Platform"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:157
+msgid "NanoBSD Boot Slice"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:168
+msgid "CPU Type"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:183
+msgid "Hardware crypto"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:188
+msgid "Uptime"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:192
+msgid "Current date/time"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:198
+msgid "DNS server(s)"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:210
+msgid "Last config change"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:215
+msgid "State table size"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:223
+msgid "Show states"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:227
+msgid "MBUF Usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:239
+msgid "Temperature"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:248
+msgid "Load average"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:254
+msgid "CPU usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:261
+msgid "Memory usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:270
+msgid "SWAP usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:279
+msgid "Disk usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:44
+msgid "Computer / Device"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:70
+msgid "Wake Up"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:75
+msgid "No saved WoL addresses"
+msgstr ""
+
+#: usr/local/www/wizard.php:66 usr/local/www/wizard.php:72
+#, php-format
+msgid "ERROR: Could not open %s."
+msgstr ""
+
+#: usr/local/www/wizard.php:78
+#, php-format
+msgid "ERROR: Could not parse %s/wizards/%s file."
+msgstr ""
+
+#: usr/local/www/wizards/openvpn_wizard.inc:626
+#: usr/local/www/wizards/openvpn_wizard.inc:643
+#, php-format
+msgid "OpenVPN %s wizard"
+msgstr ""
+
+#: usr/local/www/wizards/openvpn_wizard.inc:638
+#: usr/local/www/wizards/openvpn_wizard.inc:653
+msgid "OpenVPN Wizard"
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:60
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:63
+msgid "You need to specify the number of connections."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:65
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:68
+msgid "The number of connections should be greater than 1."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:90
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:104
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:111
+msgid "You have less interfaces than number of connections!"
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:302
+msgid "You cannot specify bandwidth smaller than 1!"
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:313
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:336
+msgid "You cannot select the same interface for local and outside."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:495
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:591
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:538
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:641
+msgid ""
+"Address must be a valid IP address or Firewall Alias. Please correct this "
+"value to continue."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:579
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:608
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:629
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:656
+msgid "Only percentage bandwidth specification is allowed."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:762
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1146
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:811
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1209
+msgid ""
+"Custom Bandwidths are greater than 30%. Please lower them for the wizard to "
+"continue."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1448
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1517
+msgid "Penalty Box"
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1455
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1475
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1489
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1506
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1525
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1549
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1628
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1524
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1545
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1559
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1576
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1595
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1619
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1646
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1699
+msgid "Traffic Shaper Wizard"
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1467
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1537
+msgid "Connections From Upstream SIP Server"
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1481
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1551
+msgid "Connections To Upstream SIP Server"
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:74
+msgid "You need to specify the number of LAN type interfaces."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:79
+msgid "The number of LAN type interfaces should be greater than 1."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:323
+msgid "You cannot specify 0 bandwidth!"
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:345
+msgid "You cannot select the same interface twice on local interfaces."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:68
+msgid "Authentication failed"
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:79
+msgid ""
+"XMLRPC wrapper for eval(). This method must be called with two parameters: a "
+"string containing the local system\\'s password followed by the PHP code to "
+"evaluate."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:110
+msgid ""
+"XMLRPC wrapper for mwexec(). This method must be called with two parameters: "
+"a string containing the local system\\'s password followed by an shell "
+"command to execute."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:134
+msgid ""
+"XMLRPC wrapper for backup_config_section. This method must be called with "
+"two parameters: a string containing the local system\\'s password followed "
+"by an array containing the keys to be backed up."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:162
+msgid ""
+"XMLRPC wrapper for restore_config_section. This method must be called with "
+"two parameters: a string containing the local system\\'s password and an "
+"array to merge into the system\\'s config. This function returns true upon "
+"completion."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:229 usr/local/www/xmlrpc.php:320
+#: usr/local/www/xmlrpc.php:351
+#, php-format
+msgid "Merged in config (%s sections) from XMLRPC client."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:296
+msgid ""
+"XMLRPC wrapper for merging package sections. This method must be called with "
+"two parameters: a string containing the local system\\'s password and an "
+"array to merge into the system\\'s config. This function returns true upon "
+"completion."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:326
+msgid ""
+"XMLRPC wrapper for merge_config_section. This method must be called with two "
+"parameters: a string containing the local system\\'s password and an array "
+"to merge into the system\\'s config. This function returns true upon "
+"completion."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:356
+msgid ""
+"Basic XMLRPC wrapper for filter_configure. This method must be called with "
+"one paramater: a string containing the local system\\'s password. This "
+"function returns true upon completion."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:393
+msgid "Basic XMLRPC wrapper for configuring CARP interfaces."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:420 usr/local/www/xmlrpc.php:441
+msgid ""
+"Basic XMLRPC wrapper for check_firmware_version. This function will return "
+"the output of check_firmware_version upon completion."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:462
+msgid "Basic XMLRPC wrapper for rc.reboot."
+msgstr ""
diff --git a/src/usr/local/share/locale/ja/LC_MESSAGES/pfSense.po b/src/usr/local/share/locale/ja/LC_MESSAGES/pfSense.po
new file mode 100644
index 0000000..6b417dc
--- /dev/null
+++ b/src/usr/local/share/locale/ja/LC_MESSAGES/pfSense.po
@@ -0,0 +1,48738 @@
+# Language translation for pfSense project.
+# Copyright (C) 2011-2015 Electric Sheep Fencing LLC
+# This file is distributed under the same license as the pfSense package.
+# Kiyo Takami and Isaac (.ike) Levy, 2013.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.1\n"
+"Report-Msgid-Bugs-To: foof@blackskyresearch.net\n"
+"POT-Creation-Date: 2013-12-31 18:00-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: The Foof <foof@blackskyresearch.net>\n"
+"Language-Team: JAPANESE <foof@blackskyresearch.net>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: vim(1), awk(1), sed(1)\n, https://github.com/soimort/google-translate-cli"
+"X-Machinegen: translate.google.com"
+
+#: etc/inc/PEAR.inc:161
+#, php-format
+msgid "PEAR constructor called, class=%s\n"
+msgstr "と呼ばれるPEARのコンストラクター、クラス="
+
+#: etc/inc/PEAR.inc:198
+#, php-format
+msgid "PEAR destructor called, class=%s\n"
+msgstr "と呼ばれるPEARのデストラクタ、クラス="
+
+#: etc/inc/PEAR.inc:337 etc/inc/PEAR.inc:595 etc/inc/PEAR.inc:632
+msgid "invalid error callback"
+msgstr "エラー·コールバック無効"
+
+#: etc/inc/PEAR.inc:342 etc/inc/PEAR.inc:600 etc/inc/PEAR.inc:637
+msgid "invalid error mode"
+msgstr "エラーモード無効"
+
+#: etc/inc/PEAR.inc:445 etc/inc/PEAR.inc:451
+msgid "The expected error you submitted does not exist"
+msgstr "あなたが提出した予想されるエラーが存在していません"
+
+#: etc/inc/PEAR.inc:455
+msgid "The expected error you submitted is empty"
+msgstr "あなたが提出した予想されるエラーは空です"
+
+#: etc/inc/PEAR.inc:866
+msgid ""
+"PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_ErrorStack for exceptions"
+msgstr "PEAR_ERROR_EXCEPTIONは例外の廃止され、使用クラスのPEAR_ErrorStackです"
+
+#: etc/inc/PEAR.inc:1023
+#, php-format
+msgid ""
+"[%s: message="%s" code=%d mode=callback callback=%s prefix="%s" info="%s"
+""]"
+msgstr ""((%s: message="%s" code=%d mode=callback callback=%s prefix="%s" info="%s""))"
+
+#: etc/inc/PEAR.inc:1041
+#, php-format
+msgid "[%s: message="%s" code=%d mode=%s level=%s prefix="%s" info="%s"]"
+msgstr "((%s: message="%s" code=%d mode=%s level=%s prefix="%s" info="%s"))"
+
+#: etc/inc/array_intersect_key.inc:37 etc/inc/array_intersect_key.inc:37
+msgid "Wrong parameter count for array_intersect_key()"
+msgstr "間違ったパラメータ数 array_intersect_key.()"
+
+#: etc/inc/array_intersect_key.inc:45 etc/inc/array_intersect_key.inc:45
+msgid "array_intersect_key() Argument #"
+msgstr "array_intersect_key.() アーギュメント #"
+
+#: etc/inc/array_intersect_key.inc:46 etc/inc/array_intersect_key.inc:46
+msgid " is not an array"
+msgstr " は配列ではありません"
+
+#: etc/inc/auth.inc:100 etc/inc/auth.inc:100
+msgid ""
+"Potential DNS Rebind attack detected, see http://en.wikipedia.org/wiki/"
+"DNS_rebinding<br />Try accessing the router by IP address instead of by "
+"hostname."
+msgstr ""検出された潜在的なDNS再バインド攻撃, 見る http://en.wikipedia.org/wiki/"DNS_rebinding<br />"IPアドレスでルータにアクセスする代わりにホスト名でみてください。"
+
+#: etc/inc/auth.inc:115 etc/inc/auth.inc:115
+msgid "Redirecting..."
+msgstr "リダイレクト..."
+
+#: etc/inc/auth.inc:115 etc/inc/auth.inc:115
+msgid "Redirecting to the dashboard..."
+msgstr "ダッシュボードへのリダイレクト..."
+
+#: etc/inc/auth.inc:315 etc/inc/auth.inc:335 etc/inc/auth.inc:406
+#: etc/inc/auth.inc:433 etc/inc/auth.inc:478 etc/inc/auth.inc:609
+#: etc/inc/auth.inc:621 etc/inc/auth.inc:311 etc/inc/auth.inc:331
+#: etc/inc/auth.inc:402 etc/inc/auth.inc:431 etc/inc/auth.inc:487
+#: etc/inc/auth.inc:618 etc/inc/auth.inc:630 etc/inc/auth.inc:311
+#: etc/inc/auth.inc:331 etc/inc/auth.inc:402 etc/inc/auth.inc:431
+#: etc/inc/auth.inc:487 etc/inc/auth.inc:618 etc/inc/auth.inc:630
+#, php-format
+msgid "Running: %s"
+msgstr "%s 実行中"
+
+#: etc/inc/auth.inc:656 etc/inc/auth.inc:728 etc/inc/auth.inc:796
+#: etc/inc/auth.inc:1040 etc/inc/auth.inc:665 etc/inc/auth.inc:737
+#: etc/inc/auth.inc:805 etc/inc/auth.inc:1049 etc/inc/auth.inc:1053
+#: etc/inc/auth.inc:806 etc/inc/auth.inc:1057 etc/inc/auth.inc:665
+#: etc/inc/auth.inc:737 etc/inc/auth.inc:806 etc/inc/auth.inc:1057
+#, php-format
+msgid "ERROR! Could not connect to server %s."
+msgstr "エラー!サーバー%sに接続できませんでした。"
+
+#: etc/inc/auth.inc:674 etc/inc/auth.inc:683 etc/inc/auth.inc:683
+#, php-format
+msgid "LDAP: Could not lookup CA by reference for host %s."
+msgstr "LDAP:ホスト%sを参照した結果、CAを検索できませんでした。"
+
+#: etc/inc/auth.inc:783 etc/inc/auth.inc:792 etc/inc/auth.inc:793
+#: etc/inc/auth.inc:793
+msgid ""
+"ERROR! ldap_get_user_ous() backed selected with no LDAP authentication "
+"server defined."
+msgstr "エラー! ldap_get_user_ous.() が定義されていないLDAP認証サーバと選択したバックアップ。"
+
+#: etc/inc/auth.inc:807 etc/inc/auth.inc:816 etc/inc/auth.inc:818
+#: etc/inc/auth.inc:818
+#, php-format
+msgid "ERROR! ldap_get_user_ous() could not bind anonymously to server %s."
+msgstr "エラー! ldap_get_user_ous.() サーバ%sに匿名でバインドできませんでした。"
+
+#: etc/inc/auth.inc:812 etc/inc/auth.inc:821 etc/inc/auth.inc:823
+#: etc/inc/auth.inc:823
+#, php-format
+msgid "ERROR! ldap_get_user_ous() could not bind to server %s."
+msgstr "エラー! ldap_get_user_ous.() サーバ%sをバインドできませんでした。"
+
+#: etc/inc/auth.inc:908 etc/inc/auth.inc:917 etc/inc/auth.inc:919
+#: etc/inc/auth.inc:919
+#, php-format
+msgid "ERROR! ldap_get_groups() Could not connect to server %s."
+msgstr "エラー! ldap_get_groups.() サーバー%sに接続できませんでした。"
+
+#: etc/inc/auth.inc:918 etc/inc/auth.inc:927 etc/inc/auth.inc:930
+#: etc/inc/auth.inc:930
+#, php-format
+msgid "ERROR! ldap_get_groups() could not bind anonymously to server %s."
+msgstr "エラー! ldap_get_groups.() サーバ%sに匿名でバインドできませんでした。"
+
+#: etc/inc/auth.inc:923 etc/inc/auth.inc:932 etc/inc/auth.inc:935
+#: etc/inc/auth.inc:935
+#, php-format
+msgid "ERROR! ldap_get_groups() could not bind to server %s."
+msgstr "エラー! ldap_get_groups.() サーバ%sをバインドできませんでした。"
+
+#: etc/inc/auth.inc:1020 etc/inc/auth.inc:1029 etc/inc/auth.inc:1033
+#: etc/inc/auth.inc:1036 etc/inc/auth.inc:1036
+msgid ""
+"ERROR! ldap_backed() called with no LDAP authentication server defined. "
+"Defaulting to local user database. Visit System -> User Manager."
+msgstr ""エラー\! ldap_backed.() はLDAP認証サーバーの定義なく呼び出されました。"ローカルユーザデータベースにデフォルト設定。"へ システム -> ユーザーマネージャ"
+
+#: etc/inc/auth.inc:1023 etc/inc/auth.inc:1032 etc/inc/auth.inc:1036
+#: etc/inc/auth.inc:1039 etc/inc/auth.inc:1039
+msgid "ERROR! ldap_backed() called with no LDAP authentication server defined."
+msgstr "エラー! ldap_backed.() はLDAP認証サーバーの定義なく呼び出されました。"
+
+#: etc/inc/auth.inc:1054 etc/inc/auth.inc:1063 etc/inc/auth.inc:1067
+#: etc/inc/auth.inc:1071 etc/inc/auth.inc:1071
+#, php-format
+msgid "ERROR! Could not bind to server %s."
+msgstr "エラー! サーバー%sにバインドできませんでした。"
+
+#: etc/inc/auth.inc:1071 etc/inc/auth.inc:1080 etc/inc/auth.inc:1084
+#: etc/inc/auth.inc:1085 etc/inc/auth.inc:1089 etc/inc/auth.inc:1089
+#, php-format
+msgid "Now Searching for %s in directory."
+msgstr "ディレクトリ内で%sを検索中。"
+
+#: etc/inc/auth.inc:1075 etc/inc/auth.inc:1084 etc/inc/auth.inc:1088
+#: etc/inc/auth.inc:1090 etc/inc/auth.inc:1094 etc/inc/auth.inc:1094
+#, php-format
+msgid "Now Searching in server %1$s, container %2$s with filter %3$s."
+msgstr "サーバー%1$sとコンテナ%2$s内をフィルター%3$sで検索中。"
+
+#: etc/inc/auth.inc:1086 etc/inc/auth.inc:1095 etc/inc/auth.inc:1099
+#: etc/inc/auth.inc:1101 etc/inc/auth.inc:1105 etc/inc/auth.inc:1105
+#, php-format
+msgid "Search resulted in error: %s"
+msgstr "検索結果エラー:%s"
+
+#: etc/inc/auth.inc:1102 etc/inc/auth.inc:1111 etc/inc/auth.inc:1115
+#: etc/inc/auth.inc:1117 etc/inc/auth.inc:1121 etc/inc/auth.inc:1121
+msgid "ERROR! Either LDAP search failed, or multiple users were found."
+msgstr "エラー! LDAP検索に失敗しました、または複数のユーザーが見つかりました。"
+
+#: etc/inc/auth.inc:1108 etc/inc/auth.inc:1117 etc/inc/auth.inc:1121
+#: etc/inc/auth.inc:1123
+#, php-format
+msgid "ERROR! Could not login to server %1$s as user %2$s."
+msgstr "エラー! ユーザー名%2$sはサーバ%1$sにログインできませんでした。"
+
+#: etc/inc/auth.inc:1113 etc/inc/auth.inc:1122 etc/inc/auth.inc:1126
+#: etc/inc/auth.inc:1129 etc/inc/auth.inc:1133 etc/inc/auth.inc:1133
+#, php-format
+msgid "Logged in successfully as %1$s via LDAP server %2$s with DN = %3$s."
+msgstr "DN = %3$sとLDAPサーバー%2$s経由%1$sとして正常にログインし"
+
+#: etc/inc/auth.inc:1144 etc/inc/auth.inc:1153 etc/inc/auth.inc:1157
+#: etc/inc/auth.inc:1163 etc/inc/auth.inc:1167 etc/inc/auth.inc:1167
+#, php-format
+msgid "Radius start: %s<br />\n"
+msgstr "RADIUSスタート: "
+
+#: etc/inc/auth.inc:1155 etc/inc/auth.inc:1164 etc/inc/auth.inc:1168
+#: etc/inc/auth.inc:1174 etc/inc/auth.inc:1178 etc/inc/auth.inc:1178
+#, php-format
+msgid "Radius send failed: %s<br />\n"
+msgstr "RADIUS送信に失敗しました: %s<br />\n"
+
+#: etc/inc/auth.inc:1159 etc/inc/auth.inc:1170 etc/inc/auth.inc:1174
+#: etc/inc/auth.inc:1180 etc/inc/auth.inc:1184 etc/inc/auth.inc:1184
+#, php-format
+msgid "Radius Auth succeeded"
+msgstr "RADIUS認証が成功しました"
+
+#: etc/inc/auth.inc:1164 etc/inc/auth.inc:1175 etc/inc/auth.inc:1179
+#: etc/inc/auth.inc:1185 etc/inc/auth.inc:1189 etc/inc/auth.inc:1189
+#, php-format
+msgid "Radius Auth rejected"
+msgstr "RADIUS認証は拒否"
+
+#: etc/inc/auth.inc:1207 etc/inc/auth.inc:1222 etc/inc/auth.inc:1218
+#: etc/inc/auth.inc:1233 etc/inc/auth.inc:1237 etc/inc/auth.inc:1228
+#: etc/inc/auth.inc:1243 etc/inc/auth.inc:1232 etc/inc/auth.inc:1247
+#: etc/inc/auth.inc:1232 etc/inc/auth.inc:1247
+msgid "Local Database"
+msgstr "ローカルデータベース"
+
+#: etc/inc/auth.inc:1207 etc/inc/auth.inc:1222 etc/inc/auth.inc:1218
+#: etc/inc/auth.inc:1233 etc/inc/auth.inc:1237
+msgid "Local Auth"
+msgstr "ローカル認証"
+
+#: etc/inc/auth.inc:1293 etc/inc/auth.inc:1317 etc/inc/auth.inc:1321
+#: etc/inc/auth.inc:1327 etc/inc/auth.inc:1331 etc/inc/auth.inc:1331
+#, php-format
+msgid "Successful login for user '%1$s' from: %2$s"
+msgstr "%2$sからユーザー'%1$s'ためのログインに成功"
+
+#: etc/inc/auth.inc:1347 etc/inc/auth.inc:1371 etc/inc/auth.inc:1375
+#: etc/inc/auth.inc:1381 etc/inc/auth.inc:1385 etc/inc/auth.inc:1385
+#, php-format
+msgid "Session timed out for user '%1$s' from: %2$s"
+msgstr "セッションは%2$sからユーザー'%1$s'ためタイムアウトしました"
+
+#: etc/inc/auth.inc:1349 etc/inc/auth.inc:1373 etc/inc/auth.inc:1377
+#: etc/inc/auth.inc:1383 etc/inc/auth.inc:1387 etc/inc/auth.inc:1387
+#, php-format
+msgid "User logged out for user '%1$s' from: %2$s"
+msgstr "ユーザーは%2$sからユーザー'%1$s'がログアウトする"
+
+#: etc/inc/captiveportal.inc:1374 etc/inc/captiveportal.inc:1383
+#: etc/inc/captiveportal.inc:1420 etc/inc/captiveportal.inc:1335
+#: etc/inc/captiveportal.inc:1338 etc/inc/captiveportal.inc:1338
+#, php-format
+msgid "Error: cannot open '%s' in captiveportal_write_elements()%s"
+msgstr "エラー: captiveportal_write_elements.()%s を処理'%s'を開くことができません"
+
+#: etc/inc/config.inc:100 etc/inc/config.inc:100
+msgid "Upgrading m0n0wall configuration to pfSense... "
+msgstr "pfSenseにm0n0wall構成のアップグレード... "
+
+#: etc/inc/config.inc:103 etc/inc/config.inc:103
+msgid "ERROR! Could not convert m0n0wall -> pfsense in config.xml"
+msgstr "エラー! m0n0wallはconfig.xmlにpfsenseに変換することができませんでした"
+
+#: etc/inc/config.inc:133 etc/inc/config.inc:133
+msgid "CDROM build"
+msgstr "CD-ROMのビルド"
+
+#: etc/inc/config.inc:134 etc/inc/config.inc:135 etc/inc/config.inc:134
+#: etc/inc/config.inc:135
+msgid "CFG:"
+msgstr "CFG:"
+
+#: etc/inc/config.inc:136 etc/inc/config.inc:136
+msgid "TYPE:"
+msgstr "タイプ:"
+
+#: etc/inc/config.inc:151 etc/inc/config.inc:166 etc/inc/config.inc:151
+#: etc/inc/config.inc:166
+#, php-format
+msgid "Found configuration on %s.%s"
+msgstr "%s.%sタブの設定"
+
+#: etc/inc/config.inc:180 etc/inc/config.inc:181 etc/inc/config.lib.inc:105
+#: etc/inc/config.lib.inc:106 etc/inc/config.lib.inc:245
+#: etc/inc/config.lib.inc:266 etc/inc/config.lib.inc:267
+#: etc/inc/config.inc:180 etc/inc/config.inc:181 etc/inc/config.lib.inc:105
+#: etc/inc/config.lib.inc:106 etc/inc/config.lib.inc:245
+#: etc/inc/config.lib.inc:266 etc/inc/config.lib.inc:267
+msgid "No config.xml found, attempting last known config restore."
+msgstr "いいえconfig.xmlには最後の既知の設定の復元を試みて、見つからなかった。"
+
+#: etc/inc/config.inc:184 etc/inc/config.inc:184
+msgid "No config.xml or config backups found, resetting to factory defaults."
+msgstr "全くconfig.xmlや設定のバックアップ工場出荷時設定へのリセット、見つかりませんでした。"
+
+#: etc/inc/filter.inc:197 etc/inc/filter.inc:194 etc/inc/filter.inc:193
+#: etc/inc/filter.inc:168 etc/inc/filter.inc:168
+msgid "Initializing"
+msgstr "イニシャライズ"
+
+#: etc/inc/filter.inc:209 etc/inc/filter.inc:206 etc/inc/filter.inc:205
+#: etc/inc/filter.inc:180 etc/inc/filter.inc:180
+msgid "Configuring firewall"
+msgstr "設定ファイアウォール"
+
+#: etc/inc/filter.inc:214 etc/inc/filter.inc:211 etc/inc/filter.inc:210
+#: etc/inc/filter.inc:185 etc/inc/filter.inc:185
+msgid "Creating aliases"
+msgstr "エイリアスの作成"
+
+#: etc/inc/filter.inc:219 etc/inc/filter.inc:218 etc/inc/filter.inc:193
+#: etc/inc/filter.inc:193
+msgid "Generating NAT rules"
+msgstr "NATのルールを生成する"
+
+#: etc/inc/filter.inc:224 etc/inc/filter.inc:223 etc/inc/filter.inc:198
+#: etc/inc/filter.inc:198
+msgid "Generating filter rules"
+msgstr "フィルタルールを生成する"
+
+#: etc/inc/filter.inc:230 etc/inc/filter.inc:229 etc/inc/filter.inc:204
+#: etc/inc/filter.inc:204
+msgid "Generating ALTQ queues"
+msgstr "ALTQキューを生成する"
+
+#: etc/inc/filter.inc:232 etc/inc/filter.inc:216 etc/inc/filter.inc:215
+#: etc/inc/filter.inc:190 etc/inc/filter.inc:190
+msgid "Generating Limiter rules"
+msgstr "リミッタールールを生成する"
+
+#: etc/inc/filter.inc:234 etc/inc/filter.inc:232 etc/inc/filter.inc:231
+#: etc/inc/filter.inc:206 etc/inc/filter.inc:206
+msgid "Generating Layer7 rules"
+msgstr "生成レイヤ7ルール"
+
+#: etc/inc/filter.inc:238 etc/inc/filter.inc:236 etc/inc/filter.inc:235
+#: etc/inc/filter.inc:210 etc/inc/filter.inc:210
+msgid "Loading filter rules"
+msgstr "フィルタルールのロード"
+
+#: etc/inc/filter.inc:245 etc/inc/filter.inc:243 etc/inc/filter.inc:242
+#: etc/inc/filter.inc:217 etc/inc/filter.inc:217
+msgid "Filter is disabled. Not loading rules."
+msgstr "フィルタが無効になっています。ルールをロードしていない。"
+
+#: etc/inc/filter.inc:247 etc/inc/filter.inc:418 etc/inc/interfaces.inc:217
+#: etc/inc/interfaces.inc:234 etc/inc/interfaces.inc:360
+#: etc/inc/interfaces.inc:410 etc/inc/interfaces.inc:664
+#: etc/inc/interfaces.inc:924 etc/inc/interfaces.inc:964
+#: etc/inc/interfaces.inc:979 etc/inc/interfaces.inc:1780
+#: etc/inc/pkg-utils.inc:586 etc/inc/pkg-utils.inc:596
+#: etc/inc/pkg-utils.inc:619 etc/inc/pkg-utils.inc:696
+#: etc/inc/pkg-utils.inc:711 etc/inc/pkg-utils.inc:755
+#: etc/inc/pkg-utils.inc:786 etc/inc/pkg-utils.inc:805
+#: etc/inc/pkg-utils.inc:812 etc/inc/pkg-utils.inc:829
+#: etc/inc/pkg-utils.inc:845 etc/inc/pkg-utils.inc:861
+#: etc/inc/pkg-utils.inc:967 etc/inc/pkg-utils.inc:984
+#: etc/inc/pkg-utils.inc:1009 etc/inc/pkg-utils.inc:1054
+#: etc/inc/pkg-utils.inc:1063 etc/inc/pkg-utils.inc:1073
+#: etc/inc/pkg-utils.inc:1088 etc/inc/pkg-utils.inc:1095
+#: etc/inc/pkg-utils.inc:1114 etc/inc/services.inc:899
+#: etc/inc/services.inc:1234 etc/inc/services.inc:1297
+#: etc/inc/services.inc:1477 etc/inc/system.inc:651 etc/inc/system.inc:674
+#: etc/inc/system.inc:759 etc/inc/system.inc:1197 etc/inc/system.inc:1278
+#: etc/inc/system.inc:1409 etc/inc/rrd.inc:782 etc/inc/system.inc:699
+#: etc/inc/system.inc:722 etc/inc/system.inc:806 etc/inc/system.inc:1249
+#: etc/inc/system.inc:1334 etc/inc/system.inc:1466 etc/inc/pkg-utils.inc:612
+#: etc/inc/pkg-utils.inc:622 etc/inc/pkg-utils.inc:645
+#: etc/inc/pkg-utils.inc:722 etc/inc/pkg-utils.inc:737
+#: etc/inc/pkg-utils.inc:781 etc/inc/pkg-utils.inc:841
+#: etc/inc/pkg-utils.inc:848 etc/inc/pkg-utils.inc:865
+#: etc/inc/pkg-utils.inc:881 etc/inc/pkg-utils.inc:897
+#: etc/inc/pkg-utils.inc:1004 etc/inc/pkg-utils.inc:1021
+#: etc/inc/pkg-utils.inc:1046 etc/inc/pkg-utils.inc:1091
+#: etc/inc/pkg-utils.inc:1100 etc/inc/pkg-utils.inc:1110
+#: etc/inc/pkg-utils.inc:1125 etc/inc/pkg-utils.inc:1132
+#: etc/inc/pkg-utils.inc:1151 etc/inc/interfaces.inc:219
+#: etc/inc/interfaces.inc:236 etc/inc/interfaces.inc:362
+#: etc/inc/interfaces.inc:412 etc/inc/interfaces.inc:671
+#: etc/inc/interfaces.inc:951 etc/inc/interfaces.inc:991
+#: etc/inc/interfaces.inc:1006 etc/inc/interfaces.inc:1845 etc/inc/rrd.inc:806
+#: etc/inc/services.inc:1028 etc/inc/services.inc:1370
+#: etc/inc/services.inc:1434 etc/inc/services.inc:1669 etc/inc/filter.inc:245
+#: etc/inc/filter.inc:420 etc/inc/system.inc:703 etc/inc/system.inc:726
+#: etc/inc/system.inc:804 etc/inc/system.inc:1229 etc/inc/system.inc:1376
+#: etc/inc/system.inc:1508 etc/inc/pkg-utils.inc:394 etc/inc/pkg-utils.inc:613
+#: etc/inc/pkg-utils.inc:623 etc/inc/pkg-utils.inc:646
+#: etc/inc/pkg-utils.inc:723 etc/inc/pkg-utils.inc:738
+#: etc/inc/pkg-utils.inc:782 etc/inc/pkg-utils.inc:813
+#: etc/inc/pkg-utils.inc:842 etc/inc/pkg-utils.inc:849
+#: etc/inc/pkg-utils.inc:866 etc/inc/pkg-utils.inc:882
+#: etc/inc/pkg-utils.inc:898 etc/inc/pkg-utils.inc:1005
+#: etc/inc/pkg-utils.inc:1022 etc/inc/pkg-utils.inc:1047
+#: etc/inc/pkg-utils.inc:1092 etc/inc/pkg-utils.inc:1101
+#: etc/inc/pkg-utils.inc:1111 etc/inc/pkg-utils.inc:1126
+#: etc/inc/pkg-utils.inc:1133 etc/inc/pkg-utils.inc:1152
+#: etc/inc/interfaces.inc:218 etc/inc/interfaces.inc:235
+#: etc/inc/interfaces.inc:361 etc/inc/interfaces.inc:411
+#: etc/inc/interfaces.inc:670 etc/inc/interfaces.inc:950
+#: etc/inc/interfaces.inc:990 etc/inc/interfaces.inc:1005
+#: etc/inc/interfaces.inc:1849 etc/inc/services.inc:1160
+#: etc/inc/services.inc:1509 etc/inc/services.inc:1573
+#: etc/inc/services.inc:1808 etc/inc/filter.inc:244 etc/inc/filter.inc:423
+#: etc/inc/filter.inc:219 etc/inc/filter.inc:395 etc/inc/pkg-utils.inc:411
+#: etc/inc/pkg-utils.inc:648 etc/inc/pkg-utils.inc:658
+#: etc/inc/pkg-utils.inc:681 etc/inc/pkg-utils.inc:758
+#: etc/inc/pkg-utils.inc:773 etc/inc/pkg-utils.inc:817
+#: etc/inc/pkg-utils.inc:877 etc/inc/pkg-utils.inc:884
+#: etc/inc/pkg-utils.inc:901 etc/inc/pkg-utils.inc:917
+#: etc/inc/pkg-utils.inc:933 etc/inc/pkg-utils.inc:1040
+#: etc/inc/pkg-utils.inc:1057 etc/inc/pkg-utils.inc:1082
+#: etc/inc/pkg-utils.inc:1127 etc/inc/pkg-utils.inc:1136
+#: etc/inc/pkg-utils.inc:1146 etc/inc/pkg-utils.inc:1161
+#: etc/inc/pkg-utils.inc:1168 etc/inc/pkg-utils.inc:1187
+#: etc/inc/interfaces.inc:216 etc/inc/interfaces.inc:233
+#: etc/inc/interfaces.inc:365 etc/inc/interfaces.inc:422
+#: etc/inc/interfaces.inc:697 etc/inc/interfaces.inc:1033
+#: etc/inc/interfaces.inc:1054 etc/inc/interfaces.inc:1069
+#: etc/inc/interfaces.inc:1889 etc/inc/services.inc:1154
+#: etc/inc/services.inc:1499 etc/inc/services.inc:1596
+#: etc/inc/services.inc:1797 etc/inc/system.inc:712 etc/inc/system.inc:735
+#: etc/inc/system.inc:815 etc/inc/system.inc:1178 etc/inc/system.inc:1318
+#: etc/inc/system.inc:1457 etc/inc/rrd.inc:829 etc/inc/filter.inc:399
+#: etc/inc/interfaces.inc:1894 etc/inc/services.inc:1516
+#: etc/inc/services.inc:1628 etc/inc/services.inc:1837 etc/inc/rrd.inc:831
+#: etc/inc/services.inc:1659 etc/inc/services.inc:1868 etc/inc/rrd.inc:834
+#: etc/inc/filter.inc:219 etc/inc/filter.inc:399 etc/inc/pkg-utils.inc:411
+#: etc/inc/pkg-utils.inc:648 etc/inc/pkg-utils.inc:658
+#: etc/inc/pkg-utils.inc:681 etc/inc/pkg-utils.inc:758
+#: etc/inc/pkg-utils.inc:773 etc/inc/pkg-utils.inc:817
+#: etc/inc/pkg-utils.inc:848 etc/inc/pkg-utils.inc:877
+#: etc/inc/pkg-utils.inc:884 etc/inc/pkg-utils.inc:901
+#: etc/inc/pkg-utils.inc:917 etc/inc/pkg-utils.inc:933
+#: etc/inc/pkg-utils.inc:1040 etc/inc/pkg-utils.inc:1057
+#: etc/inc/pkg-utils.inc:1082 etc/inc/pkg-utils.inc:1127
+#: etc/inc/pkg-utils.inc:1136 etc/inc/pkg-utils.inc:1146
+#: etc/inc/pkg-utils.inc:1161 etc/inc/pkg-utils.inc:1168
+#: etc/inc/pkg-utils.inc:1187 etc/inc/interfaces.inc:216
+#: etc/inc/interfaces.inc:233 etc/inc/interfaces.inc:365
+#: etc/inc/interfaces.inc:422 etc/inc/interfaces.inc:697
+#: etc/inc/interfaces.inc:1005 etc/inc/interfaces.inc:1033
+#: etc/inc/interfaces.inc:1054 etc/inc/interfaces.inc:1069
+#: etc/inc/interfaces.inc:1894 etc/inc/services.inc:1212
+#: etc/inc/services.inc:1568 etc/inc/services.inc:1723
+#: etc/inc/services.inc:1932 etc/inc/system.inc:771 etc/inc/system.inc:794
+#: etc/inc/system.inc:874 etc/inc/system.inc:1237 etc/inc/system.inc:1377
+#: etc/inc/system.inc:1516 etc/inc/rrd.inc:834
+msgid "done."
+msgstr "完了。"
+
+#: etc/inc/filter.inc:259 etc/inc/filter.inc:265 etc/inc/filter.inc:289
+#: etc/inc/filter.inc:269 etc/inc/filter.inc:269
+msgid "Setting up logging information"
+msgstr "ログ情報の設定"
+
+#: etc/inc/filter.inc:290 etc/inc/filter.inc:294 etc/inc/filter.inc:274
+#: etc/inc/filter.inc:274
+msgid "Setting up SCRUB information"
+msgstr "SCRUB情報を設定する"
+
+#: etc/inc/filter.inc:336 etc/inc/filter.inc:338 etc/inc/filter.inc:341
+#: etc/inc/filter.inc:313 etc/inc/filter.inc:313
+#, php-format
+msgid "The line in question reads [%1$d]: %2$s"
+msgstr "%2$s:問題の行は((%1$d))を読み込み"
+
+#: etc/inc/filter.inc:338 etc/inc/filter.inc:340 etc/inc/filter.inc:342
+#: etc/inc/filter.inc:343 etc/inc/filter.inc:345 etc/inc/filter.inc:316
+#: etc/inc/filter.inc:317 etc/inc/filter.inc:316 etc/inc/filter.inc:317
+#, php-format
+msgid "There were error(s) loading the rules: %1$s - %2$s"
+msgstr "ルールのロード中にエラー(S)がありました:%1$s - %2$s"
+
+#: etc/inc/filter.inc:349 etc/inc/filter.inc:351 etc/inc/filter.inc:354
+#: etc/inc/filter.inc:324 etc/inc/filter.inc:324
+msgid "PF was wedged/busy and has been reset."
+msgstr "PFは忙しい/押し込まれ、リセットされました。"
+
+#: etc/inc/filter.inc:355 etc/inc/filter.inc:357 etc/inc/filter.inc:360
+#: etc/inc/filter.inc:329 etc/inc/filter.inc:333 etc/inc/filter.inc:333
+msgid "Starting up layer7 daemon"
+msgstr "レイヤ7デーモンを起動"
+
+#: etc/inc/filter.inc:403 etc/inc/filter.inc:405 etc/inc/filter.inc:408
+#: etc/inc/filter.inc:380 etc/inc/filter.inc:384 etc/inc/filter.inc:384
+msgid "Processing down interface states"
+msgstr "界面準位を下処理"
+
+#: etc/inc/filter.inc:407 etc/inc/filter.inc:409 etc/inc/filter.inc:412
+#: etc/inc/filter.inc:384 etc/inc/filter.inc:388 etc/inc/filter.inc:388
+msgid "Running plugins"
+msgstr "プラグインを実行している"
+
+#: etc/inc/filter.inc:411 etc/inc/filter.inc:413 etc/inc/filter.inc:416
+#: etc/inc/filter.inc:388 etc/inc/filter.inc:392 etc/inc/filter.inc:392
+msgid "Running plugins (pf)"
+msgstr "実行されているプラグイン(PF)"
+
+#: etc/inc/filter.inc:413 etc/inc/filter.inc:415 etc/inc/filter.inc:418
+#: etc/inc/filter.inc:390 etc/inc/filter.inc:394 etc/inc/filter.inc:394
+msgid "Plugins completed."
+msgstr "プラグイン完了"
+
+#: etc/inc/filter.inc:416 usr/local/www/restart_httpd.php:52
+#: usr/local/www/restart_httpd.php:55 usr/local/www/restart_httpd.php:58
+#: usr/local/www/restart_httpd.php:61 etc/inc/filter.inc:418
+#: etc/inc/filter.inc:421 etc/inc/filter.inc:393 etc/inc/filter.inc:397
+#: usr/local/www/restart_httpd.php:52 usr/local/www/restart_httpd.php:55
+#: usr/local/www/restart_httpd.php:58 usr/local/www/restart_httpd.php:61
+#: etc/inc/filter.inc:397
+msgid "Done"
+msgstr "行う"
+
+#: etc/inc/filter.inc:636 etc/inc/filter.inc:649 etc/inc/filter.inc:652
+#: etc/inc/filter.inc:641 etc/inc/filter.inc:657 etc/inc/filter.inc:652
+msgid "Creating gateway group item..."
+msgstr "ゲートウェイ·グループ項目を作成しています..."
+
+#: etc/inc/filter.inc:666 etc/inc/filter.inc:681 etc/inc/filter.inc:684
+#: etc/inc/filter.inc:673 etc/inc/filter.inc:687 etc/inc/filter.inc:692
+#: etc/inc/filter.inc:687
+#, php-format
+msgid "Setting up route with %1$s on %2$s"
+msgstr "%2$sの上の%1$sでルートを設定する"
+
+#: etc/inc/filter.inc:673 etc/inc/filter.inc:688 etc/inc/filter.inc:691
+#: etc/inc/filter.inc:680 etc/inc/filter.inc:694 etc/inc/filter.inc:699
+#: etc/inc/filter.inc:694
+#, php-format
+msgid ""
+"An error occurred while trying to find the interface got %s . The rule has "
+"not been added."
+msgstr ""インタフェースは%sを持っ見つけようとしているときにエラーが発生しました。"ルールが追加されていません。"
+
+#: etc/inc/filter.inc:937 etc/inc/filter.inc:987 etc/inc/filter.inc:975
+#: etc/inc/filter.inc:1009 etc/inc/filter.inc:1027 etc/inc/filter.inc:1032
+#: etc/inc/filter.inc:1027
+#, php-format
+msgid "Creating reflection NAT rule for %s..."
+msgstr "%sのための反射NATルールを作成しています..."
+
+#: etc/inc/filter.inc:991 etc/inc/filter.inc:1076 etc/inc/filter.inc:1064
+#: etc/inc/filter.inc:1098 etc/inc/filter.inc:1116 etc/inc/filter.inc:1121
+#: etc/inc/filter.inc:1116
+#, php-format
+msgid "Creating reflection rule for %s..."
+msgstr "%sのための反射のルールを作成しています..."
+
+#: etc/inc/filter.inc:1251 etc/inc/filter.inc:1338 etc/inc/filter.inc:1326
+#: etc/inc/filter.inc:1360 etc/inc/filter.inc:1378 etc/inc/filter.inc:1383
+#: etc/inc/filter.inc:1378
+msgid "Creating 1:1 rules..."
+msgstr "1:1のルールを作成しています..."
+
+#: etc/inc/filter.inc:1350 etc/inc/filter.inc:1437 etc/inc/filter.inc:1454
+#: etc/inc/filter.inc:1501 etc/inc/filter.inc:1519 etc/inc/filter.inc:1524
+#: etc/inc/filter.inc:1519
+#, php-format
+msgid "Creating advanced outbound rule %s"
+msgstr "高度なアウトバウンドルール%sを作成"
+
+#: etc/inc/filter.inc:1386 etc/inc/filter.inc:1473 etc/inc/filter.inc:1490
+#: etc/inc/filter.inc:1533 etc/inc/filter.inc:1551 etc/inc/filter.inc:1556
+#: etc/inc/filter.inc:1551
+msgid "Creating outbound NAT rules"
+msgstr "アウトバウンドNATルールを作成する"
+
+#: etc/inc/filter.inc:1481 etc/inc/filter.inc:1566 etc/inc/filter.inc:1583
+#: etc/inc/filter.inc:1626 etc/inc/filter.inc:1644 etc/inc/filter.inc:1649
+#: etc/inc/filter.inc:1644
+#, php-format
+msgid "Creating outbound rules %1$s - (%2$s)"
+msgstr "%1$s - (%2$s) をアウトバウンドルールの作成"
+
+#: etc/inc/filter.inc:1499 etc/inc/filter.inc:1584 etc/inc/filter.inc:1601
+#: etc/inc/filter.inc:1644 etc/inc/filter.inc:1662 etc/inc/filter.inc:1667
+#: etc/inc/filter.inc:1662
+msgid "Setting up TFTP helper"
+msgstr "TFTPヘルパーの設定"
+
+#: etc/inc/filter.inc:1545 etc/inc/filter.inc:1630 etc/inc/filter.inc:1644
+#: etc/inc/filter.inc:1676 etc/inc/filter.inc:1694 etc/inc/filter.inc:1699
+#: etc/inc/filter.inc:1694
+#, php-format
+msgid "Creating NAT rule %s"
+msgstr "NATルール%sは作成"
+
+#: etc/inc/filter.inc:1689 etc/inc/filter.inc:1837 etc/inc/filter.inc:1850
+#: etc/inc/filter.inc:1882 etc/inc/filter.inc:1900 etc/inc/filter.inc:1905
+#: etc/inc/filter.inc:1900
+#, php-format
+msgid "Creating filter rule %s ..."
+msgstr "フィルタルール%sは作成..."
+
+#: etc/inc/filter.inc:1827 etc/inc/filter.inc:1975 etc/inc/filter.inc:1988
+#: etc/inc/filter.inc:2024 etc/inc/filter.inc:2054 etc/inc/filter.inc:2059
+#: etc/inc/filter.inc:2054
+#, php-format
+msgid "filter_generate_address: %s is not a valid source port."
+msgstr "filter_generate_address:%sを、有効な送信元ポートではありません。"
+
+#: etc/inc/filter.inc:1943 etc/inc/filter.inc:2094 etc/inc/filter.inc:2107
+#: etc/inc/filter.inc:2142 etc/inc/filter.inc:2172 etc/inc/filter.inc:2177
+#: etc/inc/filter.inc:2172
+#, php-format
+msgid "Setting up pass/block rules %s"
+msgstr "パス/ブロックルール%sの設定"
+
+#: etc/inc/filter.inc:1962 etc/inc/filter.inc:2113 etc/inc/filter.inc:2126
+#: etc/inc/filter.inc:2157 etc/inc/filter.inc:2187 etc/inc/filter.inc:2192
+#: etc/inc/filter.inc:2187
+#, php-format
+msgid "Could not find IPv4 gateway for interface (%s)."
+msgstr "インターフェイスのIPv4ゲートウェイ(%s)を見つけることができませんでした。"
+
+#: etc/inc/filter.inc:1989 etc/inc/filter.inc:2140 etc/inc/filter.inc:2153
+#: etc/inc/filter.inc:2182 etc/inc/filter.inc:2214 etc/inc/filter.inc:2219
+#: etc/inc/filter.inc:2214
+#, php-format
+msgid "Creating rule %s"
+msgstr "ルール%sを作成中"
+
+#: etc/inc/filter.inc:2198 etc/inc/filter.inc:2355 etc/inc/filter.inc:2378
+#: etc/inc/filter.inc:2407 etc/inc/filter.inc:2439 etc/inc/filter.inc:2444
+#: etc/inc/filter.inc:2439
+msgid "Creating default rules"
+msgstr "デフォルトのルールを作成中"
+
+#: etc/inc/filter.inc:2649 etc/inc/filter.inc:2862 etc/inc/filter.inc:2887
+#: etc/inc/filter.inc:2976 etc/inc/filter.inc:3000 etc/inc/filter.inc:3005
+#: etc/inc/filter.inc:3000
+msgid "Creating IPsec rules..."
+msgstr "IPsecのルールを作成中..."
+
+#: etc/inc/filter.inc:2702 etc/inc/filter.inc:2915 etc/inc/filter.inc:2940
+#: etc/inc/filter.inc:3026 etc/inc/filter.inc:3050 etc/inc/filter.inc:3055
+#: etc/inc/filter.inc:3050
+msgid ""
+"Please use filter_tdr_install_cron() function tdr_install_cron will be "
+"deprecated!"
+msgstr ""filter_tdr_install_cron.() を使用してください機能tdr_install_cronはは廃止されます!"
+
+#: etc/inc/filter.inc:2747 etc/inc/filter.inc:2960 etc/inc/filter.inc:2986
+#: etc/inc/filter.inc:3072 etc/inc/filter.inc:3096 etc/inc/filter.inc:3101
+#: etc/inc/filter.inc:3096
+msgid "Installed 15 minute filter reload for Time Based Rules"
+msgstr "時間ベースのルールのためにインストールさ15分のフィルターリロード"
+
+#: etc/inc/filter.inc:3102 etc/inc/filter.inc:3313 etc/inc/filter.inc:3293
+#: etc/inc/filter.inc:3389 etc/inc/filter.inc:3413 etc/inc/filter.inc:3418
+#: etc/inc/filter.inc:3412
+#, php-format
+msgid "Checking for %1$s PF hooks in package %2$s"
+msgstr "パッケージ%2$sを処理%1$s PFフックのチェック"
+
+#: etc/inc/filter.inc:3107 etc/inc/filter.inc:3318 etc/inc/filter.inc:3299
+#: etc/inc/filter.inc:3395 etc/inc/filter.inc:3419 etc/inc/filter.inc:3424
+#: etc/inc/filter.inc:3418
+#, php-format
+msgid "Processing early %1$s rules for package %2$s"
+msgstr "パッケージ%2$sを早期%1$sのルールの処理"
+
+#: etc/inc/filter.inc:3112 etc/inc/filter.inc:3323 etc/inc/filter.inc:3304
+#: etc/inc/filter.inc:3400 etc/inc/filter.inc:3424 etc/inc/filter.inc:3429
+#: etc/inc/filter.inc:3423
+#, php-format
+msgid "There was an error while parsing the package filter rules for %s."
+msgstr "%sのパッケージフィルタルール解析中にエラーが発生しました。"
+
+#: etc/inc/interfaces.inc:51 etc/inc/interfaces.inc:53
+#: etc/inc/interfaces.inc:51
+msgid "interfaces_bring_up() was called but no variable defined."
+msgstr "interfaces_bring_up.() が呼び出さしかし、誰変数が定義されていなかった。"
+
+#: etc/inc/interfaces.inc:213 etc/inc/interfaces.inc:215
+#: etc/inc/interfaces.inc:214 etc/inc/interfaces.inc:212
+#: etc/inc/interfaces.inc:212
+msgid "Configuring loopback interface..."
+msgstr "ループバックインターフェイスを設定中..."
+
+#: etc/inc/interfaces.inc:224 etc/inc/interfaces.inc:226
+#: etc/inc/interfaces.inc:225 etc/inc/interfaces.inc:223
+#: etc/inc/interfaces.inc:223
+msgid "Configuring VLAN interfaces..."
+msgstr "VLANインターフェイスを設定中..."
+
+#: etc/inc/interfaces.inc:241 etc/inc/interfaces.inc:243
+#: etc/inc/interfaces.inc:242 etc/inc/interfaces.inc:240
+#: etc/inc/interfaces.inc:240
+msgid "VLAN: called with wrong options. Problems with config!"
+msgstr "VLAN:間違ったオプションを使用して呼び出さ。設定に問題が!"
+
+#: etc/inc/interfaces.inc:249
+msgid "interface_vlan_confgure called with if undefined."
+msgstr "定義されていない場合で呼び出されinterface_vlan_confgure。"
+
+#: etc/inc/interfaces.inc:283 etc/inc/interfaces.inc:367
+#: etc/inc/interfaces.inc:285 etc/inc/interfaces.inc:369
+#: etc/inc/interfaces.inc:284 etc/inc/interfaces.inc:368
+#: etc/inc/interfaces.inc:282 etc/inc/interfaces.inc:372
+#: etc/inc/interfaces.inc:282 etc/inc/interfaces.inc:372
+#, php-format
+msgid "QinQ compat VLAN: called with wrong options. Problems with config!%s"
+msgstr "QinQの互換VLAN:間違ったオプションを使用して呼び出さ。設定に問題が!%s"
+
+#: etc/inc/interfaces.inc:290 etc/inc/interfaces.inc:375
+#, php-format
+msgid "interface_qinq_confgure called with if undefined.%s"
+msgstr "と呼ばinterface_qinq_confgure場合undefined.%s"
+
+#: etc/inc/interfaces.inc:352 etc/inc/interfaces.inc:354
+#: etc/inc/interfaces.inc:353 etc/inc/interfaces.inc:357
+#: etc/inc/interfaces.inc:357
+msgid "Configuring QinQ interfaces..."
+msgstr "QinQサブインターフェイスの設定..."
+
+#: etc/inc/interfaces.inc:396 etc/inc/interfaces.inc:398
+#: etc/inc/interfaces.inc:397
+msgid "Creating other wireless clone interfaces..."
+msgstr "他のワイヤレスクローン·インターフェースを作成中..."
+
+#: etc/inc/interfaces.inc:439 etc/inc/interfaces.inc:438
+#: etc/inc/interfaces.inc:437 etc/inc/interfaces.inc:466
+#: etc/inc/interfaces.inc:466
+#, php-format
+msgid "No members found on %s"
+msgstr "%sにはメンバーが見つかりませんでした"
+
+#: etc/inc/interfaces.inc:505 etc/inc/interfaces.inc:512
+#: etc/inc/interfaces.inc:511 etc/inc/interfaces.inc:541
+#: etc/inc/interfaces.inc:541
+msgid "realif not defined in interfaces bridge - up"
+msgstr "realifインターフェースブリッジで定義されていません - アップ"
+
+#: etc/inc/interfaces.inc:618 etc/inc/interfaces.inc:625
+#: etc/inc/interfaces.inc:624 etc/inc/interfaces.inc:654
+#: etc/inc/interfaces.inc:654
+msgid "bridgeif not defined -- could not bring interface up"
+msgstr "bridgeif定義されていない - インタフェースを持ち出すことができませんでした"
+
+#: etc/inc/interfaces.inc:652 etc/inc/interfaces.inc:659
+#: etc/inc/interfaces.inc:658 etc/inc/interfaces.inc:685
+#: etc/inc/interfaces.inc:685
+msgid "Configuring LAGG interfaces..."
+msgstr "LAGGインターフェイスの設定..."
+
+#: etc/inc/interfaces.inc:790 etc/inc/interfaces.inc:801
+#: etc/inc/interfaces.inc:800 etc/inc/interfaces.inc:835
+#: etc/inc/interfaces.inc:835
+msgid "Could not bring greif up -- variable not defined."
+msgstr "変数定義されていません - 最大グライフなれなかった。"
+
+#: etc/inc/interfaces.inc:833 etc/inc/interfaces.inc:851
+#: etc/inc/interfaces.inc:850 etc/inc/interfaces.inc:899
+#: etc/inc/interfaces.inc:899
+msgid ""
+"could not bring realif up -- variable not defined -- "
+"interface_gif_configure()"
+msgstr ""変数に定義されていない - - interface_gif_configure.()"を最大realifなれなかった"
+
+#: etc/inc/interfaces.inc:856 etc/inc/interfaces.inc:874
+#: etc/inc/interfaces.inc:873 etc/inc/interfaces.inc:922
+#: etc/inc/interfaces.inc:922
+msgid "could not bring gifif up -- variable not defined"
+msgstr "変数定義されていません - 最大gififなれなかった"
+
+#: etc/inc/interfaces.inc:919 etc/inc/interfaces.inc:957
+#: etc/inc/interfaces.inc:972 etc/inc/interfaces.inc:945
+#: etc/inc/interfaces.inc:984 etc/inc/interfaces.inc:999
+#: etc/inc/interfaces.inc:944 etc/inc/interfaces.inc:983
+#: etc/inc/interfaces.inc:998 etc/inc/interfaces.inc:1026
+#: etc/inc/interfaces.inc:1047 etc/inc/interfaces.inc:1062
+#: etc/inc/interfaces.inc:999 etc/inc/interfaces.inc:1026
+#: etc/inc/interfaces.inc:1047 etc/inc/interfaces.inc:1062
+#, php-format
+msgid "Configuring %s interface..."
+msgstr "%sのインターフェイスを設定中..."
+
+#: etc/inc/interfaces.inc:921 etc/inc/interfaces.inc:959
+#: etc/inc/interfaces.inc:974 etc/inc/interfaces.inc:948
+#: etc/inc/interfaces.inc:986 etc/inc/interfaces.inc:1001
+#: etc/inc/interfaces.inc:947 etc/inc/interfaces.inc:985
+#: etc/inc/interfaces.inc:1000 etc/inc/interfaces.inc:1002
+#: etc/inc/interfaces.inc:1028 etc/inc/interfaces.inc:1049
+#: etc/inc/interfaces.inc:1064 etc/inc/interfaces.inc:1002
+#: etc/inc/interfaces.inc:1028 etc/inc/interfaces.inc:1049
+#: etc/inc/interfaces.inc:1064
+#, php-format
+msgid "Configuring %s"
+msgstr "%s を設定中"
+
+#: etc/inc/interfaces.inc:1299 etc/inc/interfaces.inc:1339
+#: etc/inc/interfaces.inc:1338 etc/inc/interfaces.inc:1407
+#: etc/inc/interfaces.inc:1412 etc/inc/interfaces.inc:1412
+#, php-format
+msgid "Can't find PPP config for %s in interface_ppps_configure()."
+msgstr "interface_ppps_configure.() を処理%sのPPP設定を見つけることができません。"
+
+#: etc/inc/interfaces.inc:1362 etc/inc/interfaces.inc:1402
+#: etc/inc/interfaces.inc:1401 etc/inc/interfaces.inc:1464
+#: etc/inc/interfaces.inc:1469 etc/inc/interfaces.inc:1469
+#, php-format
+msgid ""
+"Could not get a PPTP/L2TP Remote IP address from %1$s for %2$s in "
+"interfaces_ppps_configure."
+msgstr ""interfaces_ppps_configure中%2$sをため%1$sからPPTP/L2TPリモート"IPアドレスを取得できませんでした。"
+
+#: etc/inc/interfaces.inc:1369 etc/inc/interfaces.inc:1409
+#: etc/inc/interfaces.inc:1408 etc/inc/interfaces.inc:1471
+#: etc/inc/interfaces.inc:1476 etc/inc/interfaces.inc:1476
+#, php-format
+msgid ""
+"Device %s does not exist. PPP link cannot start without the modem device."
+msgstr ""デバイス%sは存在しません。 PPPリンクは、モデム装置なしで開始することはできません。"
+
+#: etc/inc/interfaces.inc:1374 etc/inc/interfaces.inc:1414
+#: etc/inc/interfaces.inc:1413 etc/inc/interfaces.inc:1476
+#: etc/inc/interfaces.inc:1481 etc/inc/interfaces.inc:1481
+#, php-format
+msgid "Unkown %s configured as ppp interface."
+msgstr "UNKOWN %sは、PPPインターフェイスとして設定。"
+
+#: etc/inc/interfaces.inc:1641 etc/inc/interfaces.inc:1686
+#: etc/inc/interfaces.inc:1685 etc/inc/interfaces.inc:1748
+#: etc/inc/interfaces.inc:1753 etc/inc/interfaces.inc:1753
+#, php-format
+msgid "Error: cannot open mpd_%s.conf in interface_ppps_configure().%s"
+msgstr "エラー:interface_ppps_configure.().%s を処理mpd_%s.conf開くことができません。"
+
+#: etc/inc/interfaces.inc:1702 etc/inc/interfaces.inc:1771
+#: etc/inc/interfaces.inc:1770 etc/inc/interfaces.inc:1828
+#: etc/inc/interfaces.inc:1833 etc/inc/interfaces.inc:1833
+msgid "Configuring CARP settings..."
+msgstr "CARPを設定中..."
+
+#: etc/inc/interfaces.inc:1723 etc/inc/interfaces.inc:1788
+#: etc/inc/interfaces.inc:1787
+msgid "Enable CARP ARP-balancing"
+msgstr "CARP ARPバランスを有効にする"
+
+#: etc/inc/interfaces.inc:1724 etc/inc/interfaces.inc:1789
+#: etc/inc/interfaces.inc:1788
+msgid "Disallow CARP preemption"
+msgstr "CARPプリエンプションを禁止する"
+
+#: etc/inc/interfaces.inc:1726 etc/inc/interfaces.inc:1791
+#: etc/inc/interfaces.inc:1790
+msgid "Enable CARP preemption"
+msgstr "CARPプリエンプションを有効にする"
+
+#: etc/inc/interfaces.inc:1728 etc/inc/interfaces.inc:1793
+#: etc/inc/interfaces.inc:1792
+msgid "Enable CARP logging"
+msgstr "CARPのログを有効にする"
+
+#: etc/inc/interfaces.inc:1744 etc/inc/interfaces.inc:1809
+#: etc/inc/interfaces.inc:1808
+msgid "Could not create rules.boot file!"
+msgstr "rules.bootファイルを作成できませんでした!"
+
+#: etc/inc/interfaces.inc:1750 etc/inc/interfaces.inc:1815
+#: etc/inc/interfaces.inc:1814
+msgid "Bring up pfsync0 syncpeer"
+msgstr "pfsync0のsyncpeerを持ち出す"
+
+#: etc/inc/interfaces.inc:1752 etc/inc/interfaces.inc:1817
+#: etc/inc/interfaces.inc:1816
+msgid "Bring up pfsync0 syncdev"
+msgstr "pfsync0のsyncdevを持ち出す"
+
+#: etc/inc/interfaces.inc:1754 etc/inc/interfaces.inc:1819
+#: etc/inc/interfaces.inc:1818
+msgid "Bring up pfsync0"
+msgstr "pfsync0を持ち出す"
+
+#: etc/inc/interfaces.inc:1768 etc/inc/interfaces.inc:1833
+#: etc/inc/interfaces.inc:1837
+msgid "Allow CARP."
+msgstr "CARPを許可します。"
+
+#: etc/inc/interfaces.inc:1770 etc/inc/interfaces.inc:1835
+#: etc/inc/interfaces.inc:1839
+msgid "Disallow CARP."
+msgstr "CARPを禁止。"
+
+#: etc/inc/interfaces.inc:1963 etc/inc/interfaces.inc:2038
+#: etc/inc/interfaces.inc:2020 etc/inc/interfaces.inc:2099
+#: etc/inc/interfaces.inc:2016 etc/inc/interfaces.inc:2056
+#: etc/inc/interfaces.inc:2061 etc/inc/interfaces.inc:2061
+#, php-format
+msgid ""
+"Interface specified for the virtual IP address %s does not exist. Skipping "
+"this VIP."
+msgstr ""仮想IPアドレス%sに指定されたインタフェースが存在しません。このVIPをスキップする。"
+
+#: etc/inc/interfaces.inc:1972 etc/inc/interfaces.inc:2029
+#: etc/inc/interfaces.inc:2025 etc/inc/interfaces.inc:2065
+#: etc/inc/interfaces.inc:2070 etc/inc/interfaces.inc:2070
+#, php-format
+msgid ""
+"Sorry but we could not find a matching real interface subnet for the virtual "
+"IP address %s."
+msgstr ""申し訳ありませんが、我々は仮想IPv4アドレス%sのマッチング実際"のインターフェイスのサブネットを見つけられませんでした。"
+
+#: etc/inc/interfaces.inc:1981 etc/inc/interfaces.inc:2038
+#: etc/inc/interfaces.inc:2034 etc/inc/interfaces.inc:2074
+#: etc/inc/interfaces.inc:2079 etc/inc/interfaces.inc:2079
+#, php-format
+msgid ""
+"Sorry but we could not find a matching real interface subnet for the virtual "
+"IPv6 address %s."
+msgstr ""申し訳ありませんが、我々は仮想IPv6アドレス%sのマッチング実際"のインターフェイスのサブネットを見つけられませんでした。"
+
+#: etc/inc/interfaces.inc:2084
+#, php-format
+msgid ""
+"Error: cannot open dhclient_%s.conf in interfaces_carpdev_configure() for "
+"writing.%s"
+msgstr ""エラー:writing.%s用interfaces_carpdev_configure.()を処理dhclient_%s.confを開くことはできません"
+
+#: etc/inc/interfaces.inc:2117 etc/inc/interfaces.inc:2185
+#: etc/inc/interfaces.inc:2104 etc/inc/interfaces.inc:2144
+#: etc/inc/interfaces.inc:2149 etc/inc/interfaces.inc:2149
+#, php-format
+msgid "Interface %s changed to hostap mode"
+msgstr "インターフェース%sをhostapモードに変更"
+
+#: etc/inc/interfaces.inc:2121 etc/inc/interfaces.inc:2189
+#: etc/inc/interfaces.inc:2108 etc/inc/interfaces.inc:2148
+#: etc/inc/interfaces.inc:2153 etc/inc/interfaces.inc:2153
+#, php-format
+msgid "Interface %s changed to adhoc mode"
+msgstr "インターフェース%sはアドホックモードに変更"
+
+#: etc/inc/interfaces.inc:2125 etc/inc/interfaces.inc:2193
+#: etc/inc/interfaces.inc:2112 etc/inc/interfaces.inc:2152
+#: etc/inc/interfaces.inc:2157 etc/inc/interfaces.inc:2157
+#, php-format
+msgid "Interface %s changed to infrastructure mode"
+msgstr "インターフェース%sアドホックモードに変更"
+
+#: etc/inc/interfaces.inc:2137 etc/inc/interfaces.inc:2205
+#: etc/inc/interfaces.inc:2124 etc/inc/interfaces.inc:2164
+#: etc/inc/interfaces.inc:2169 etc/inc/interfaces.inc:2169
+#, php-format
+msgid "Cloning new wireless interface %s"
+msgstr "新しい無線インタフェース%sのクローン作成"
+
+#: etc/inc/interfaces.inc:2142 etc/inc/interfaces.inc:2210
+#: etc/inc/interfaces.inc:2129 etc/inc/interfaces.inc:2169
+#: etc/inc/interfaces.inc:2174 etc/inc/interfaces.inc:2174
+#, php-format
+msgid "Failed to clone interface %1$s with error code %2$s, output %3$s"
+msgstr "エラーコード%2$s、出力%3$sとのインタフェースは%1$sのクローンを作成できませんでした"
+
+#: etc/inc/interfaces.inc:2715 etc/inc/interfaces.inc:2790
+#: etc/inc/interfaces.inc:2709 etc/inc/interfaces.inc:2761
+#: etc/inc/interfaces.inc:2784 etc/inc/interfaces.inc:2784
+msgid "Generating new MAC address."
+msgstr "新しいMACアドレスを生成する。"
+
+#: etc/inc/interfaces.inc:2721 etc/inc/interfaces.inc:2796
+#: etc/inc/interfaces.inc:2715 etc/inc/interfaces.inc:2767
+#: etc/inc/interfaces.inc:2790 etc/inc/interfaces.inc:2790
+#, php-format
+msgid ""
+"The INVALID MAC address (ff:ff:ff:ff:ff:ff) on interface %1$s has been "
+"automatically replaced with %2$s"
+msgstr ""無効なMACアドレスのインタフェースは%1$s上(ff:ff:ff:ff:ff:ff)"が自動的%2$sに置き換えられました"
+
+#: etc/inc/interfaces.inc:2910
+msgid "Could not bring wanif up in terface_carpdev_dhcp_configure()"
+msgstr "terface_carpdev_dhcp_configure.() を処理wanifを持ち出すことができませんでした"
+
+#: etc/inc/interfaces.inc:3016
+#, php-format
+msgid ""
+"Error: cannot open dhclient_%s.conf in interfaces_wan_dhcp_configure() for "
+"writing.%s"
+msgstr ""エラー:writing.%sため interfaces_wan_dhcp_configure.() にdhclient_%s.conf"を開くことはできません"
+
+msgstr ""エラー:writing.%sため interfaces_wan_dhcp_configure.() にdhclient_%s.conf"を開くことはできません"
+
+#: etc/inc/interfaces.inc:3029 etc/inc/interfaces.inc:3513
+#: etc/inc/interfaces.inc:3373 etc/inc/interfaces.inc:3466
+#: etc/inc/interfaces.inc:3593 etc/inc/interfaces.inc:3538
+#: etc/inc/interfaces.inc:3538
+#, php-format
+msgid "Invalid interface "%s" in interface_dhcp_configure()"
+msgstr "interface_dhcp_configure.() 内の無効なインターフェイス"%s""
+
+#: etc/inc/interfaces.inc:3064 etc/inc/interfaces.inc:3548
+#: etc/inc/interfaces.inc:3408 etc/inc/interfaces.inc:3501
+#: etc/inc/interfaces.inc:3628 etc/inc/interfaces.inc:3573
+#: etc/inc/interfaces.inc:3573
+#, php-format
+msgid "Could not bring up %s interface in interface_dhcp_configure()"
+msgstr "interface_dhcp_configure.() で%sはインターフェイスを起動できませんでした"
+
+#: etc/inc/notices.inc:76 etc/inc/notices.inc:76
+#, php-format
+msgid "Could not open %s for writing"
+msgstr "書き込み用%sを開くことができませんでした"
+
+#: etc/inc/notices.inc:327 etc/inc/notices.inc:327
+#, php-format
+msgid "Message sent to %s OK"
+msgstr "((OK))を%sはに送信されたメッセージ"
+
+#: etc/inc/notices.inc:330 etc/inc/notices.inc:331 etc/inc/notices.inc:330
+#: etc/inc/notices.inc:331
+#, php-format
+msgid "Could not send the message to %1$s -- Error: %2$s"
+msgstr "%1$sにメッセージを送信できませんでした - エラー:%2$s"
+
+#: etc/inc/openvpn.inc:83 etc/inc/openvpn.inc:90 etc/inc/openvpn.inc:81
+#: etc/inc/openvpn.inc:88 etc/inc/openvpn.inc:81 etc/inc/openvpn.inc:88
+msgid "Peer to Peer ( SSL/TLS )"
+msgstr "ピア·ツー·ピア(SSL / TLS)"
+
+#: etc/inc/openvpn.inc:84 etc/inc/openvpn.inc:91 etc/inc/openvpn.inc:82
+#: etc/inc/openvpn.inc:89 etc/inc/openvpn.inc:82 etc/inc/openvpn.inc:89
+msgid "Peer to Peer ( Shared Key )"
+msgstr "ピアツーピア(共有鍵)"
+
+#: etc/inc/openvpn.inc:85 etc/inc/openvpn.inc:83 etc/inc/openvpn.inc:83
+msgid "Remote Access ( SSL/TLS )"
+msgstr "リモートアクセス ( SSL/TLS )"
+
+#: etc/inc/openvpn.inc:86 etc/inc/openvpn.inc:84 etc/inc/openvpn.inc:84
+msgid "Remote Access ( User Auth )"
+msgstr "リモートアクセス(ユーザ認証)"
+
+#: etc/inc/openvpn.inc:87 etc/inc/openvpn.inc:85 etc/inc/openvpn.inc:85
+msgid "Remote Access ( SSL/TLS + User Auth )"
+msgstr "リモートアクセス ( SSL/TLS + ユーザ認証)"
+
+#: etc/inc/openvpn.inc:179 etc/inc/openvpn.inc:177 etc/inc/openvpn.inc:195
+#: etc/inc/openvpn.inc:195
+msgid "None (No Encryption)"
+msgstr "なし(暗号化なし)"
+
+#: etc/inc/openvpn.inc:203 etc/inc/openvpn.inc:201 etc/inc/openvpn.inc:238
+#: etc/inc/openvpn.inc:238
+#, php-format
+msgid "The field '%s' must contain a valid IP address or domain name."
+msgstr "フィールドが '%s'は有効なIPアドレスまたはドメイン名が含まれている必要があります。"
+
+#: etc/inc/openvpn.inc:210 etc/inc/openvpn.inc:208 etc/inc/openvpn.inc:245
+#: etc/inc/openvpn.inc:245
+#, php-format
+msgid "The field '%s' must contain a valid port, ranging from 0 to 65535."
+msgstr "フィールドが '%s'は0〜65535範囲、有効なポートが含まれている必要があります。"
+
+#: etc/inc/openvpn.inc:219 etc/inc/openvpn.inc:217
+#, php-format
+msgid "The field '%s' must contain a valid CIDR range."
+msgstr "フィールドが '%s'は有効なCIDR範囲が含まれている必要があります。"
+
+#: etc/inc/pfsense-utils.inc:345 etc/inc/pfsense-utils.inc:330
+#: etc/inc/pfsense-utils.inc:330
+msgid "MASTER"
+# ikenote: not sure if this is the best word to use?
+msgstr "マスター"
+
+#: etc/inc/pfsense-utils.inc:347 etc/inc/pfsense-utils.inc:332
+#: etc/inc/pfsense-utils.inc:332
+msgid "BACKUP"
+msgstr "バックアップ"
+
+#: etc/inc/pfsense-utils.inc:349 etc/inc/pfsense-utils.inc:334
+#: etc/inc/pfsense-utils.inc:334
+msgid "INIT"
+# ikenote: not sure if this is the best word to use?
+msgstr "イニシャライズ"
+
+#: etc/inc/pfsense-utils.inc:417 etc/inc/pfsense-utils.inc:402
+#: etc/inc/pfsense-utils.inc:402
+msgid "After synch increase advertising skew"
+msgstr "後の同期の増加広告スキュー"
+
+#: etc/inc/pfsense-utils.inc:462 etc/inc/pfsense-utils.inc:447
+#: etc/inc/pfsense-utils.inc:447
+msgid "Error creating socket!"
+msgstr "エラーソケットを作成する!"
+
+#: etc/inc/pfsense-utils.inc:463 etc/inc/pfsense-utils.inc:448
+#: etc/inc/pfsense-utils.inc:448
+#, php-format
+msgid "Error code is '%1$s' - %2$s"
+msgstr "'%2$s' - エラーコードは'%1$s'です"
+
+#: etc/inc/pfsense-utils.inc:468 etc/inc/pfsense-utils.inc:453
+#: etc/inc/pfsense-utils.inc:453
+#, php-format
+msgid "setsockopt() failed, error: %s"
+msgstr "%s :setsockopt.() 、エラー、障害が発生した"
+
+#: etc/inc/pfsense-utils.inc:471 etc/inc/pfsense-utils.inc:456
+#: etc/inc/pfsense-utils.inc:456
+#, php-format
+msgid "Magic Packet sent (%1$s) to {%2$s} MAC=%3$s"
+msgstr "マジックパケットは、MAC=%3$sを{%2$s}するは(%1$s)を送った"
+
+#: etc/inc/pfsense-utils.inc:518 etc/inc/pfsense-utils.inc:540
+#: etc/inc/pfsense-utils.inc:533 etc/inc/pfsense-utils.inc:555
+#: etc/inc/pfsense-utils.inc:518 etc/inc/pfsense-utils.inc:540
+#, php-format
+msgid "Restored %s of config file (maybe from CARP partner)"
+msgstr "configファイルの復元%sは(多分CARPパートナーから)"
+
+#: etc/inc/pfsense-utils.inc:699 etc/inc/pfsense-utils.inc:714
+#: etc/inc/pfsense-utils.inc:699
+#, php-format
+msgid "XMLRPC communication error: %s"
+msgstr "XMLRPC通信エラー:%s"
+
+#: etc/inc/pfsense-utils.inc:702 etc/inc/pfsense-utils.inc:717
+#: etc/inc/pfsense-utils.inc:702
+#, php-format
+msgid "XMLRPC request failed with error %1$s: %2$s"
+msgstr "XMLRPC要求は、エラーは%1$sで失敗しました:%2$s"
+
+#: etc/inc/pfsense-utils.inc:795 etc/inc/pfsense-utils.inc:810
+#: etc/inc/pfsense-utils.inc:795
+msgid "reload_interfaces_sync() is starting."
+msgstr "reload_interfaces_sync.() 開始しています。"
+
+#: etc/inc/pfsense-utils.inc:803 etc/inc/pfsense-utils.inc:818
+#: etc/inc/pfsense-utils.inc:803
+msgid "Enabling system routing"
+msgstr "システムルーティングを有効にする"
+
+#: etc/inc/pfsense-utils.inc:806 etc/inc/pfsense-utils.inc:821
+#: etc/inc/pfsense-utils.inc:806
+msgid "Cleaning up Interfaces"
+msgstr "インタフェースのクリーンアップ"
+
+#: etc/inc/pfsense-utils.inc:912 etc/inc/pfsense-utils.inc:927
+#: etc/inc/pfsense-utils.inc:936 etc/inc/pfsense-utils.inc:936
+msgid "Enabling auto login was not possible."
+msgstr "自動ログインを有効にすることはできませんでした。"
+
+#: etc/inc/pfsense-utils.inc:1100 etc/inc/pfsense-utils.inc:1137
+#: etc/inc/pfsense-utils.inc:1191 etc/inc/pfsense-utils.inc:1196
+#: etc/inc/pfsense-utils.inc:1196
+msgid "No history data found!"
+msgstr "履歴はありませんデータ発見!"
+
+#: etc/inc/pfsense-utils.inc:1222 etc/inc/pfsense-utils.inc:1260
+#: etc/inc/pfsense-utils.inc:1313 etc/inc/pfsense-utils.inc:1318
+#: etc/inc/pfsense-utils.inc:1318
+msgid "device not present! Is the modem attached to the system?"
+msgstr "デバイスが存在しません!モデムがシステムに接続されていませんか?"
+
+#: etc/inc/pfsense-utils.inc:1262 etc/inc/pfsense-utils.inc:1327
+#: etc/inc/pfsense-utils.inc:1380 etc/inc/pfsense-utils.inc:1385
+#: etc/inc/pfsense-utils.inc:1385
+msgid "running"
+msgstr "ランニング"
+
+#: etc/inc/pfsense-utils.inc:1263 usr/local/www/graph.php:201
+#: etc/inc/pfsense-utils.inc:1328 etc/inc/pfsense-utils.inc:1381
+#: etc/inc/pfsense-utils.inc:1386 usr/local/www/graph.php:201
+#: etc/inc/pfsense-utils.inc:1386
+msgid "up"
+msgstr "アップ"
+
+#: etc/inc/pfsense-utils.inc:1300 etc/inc/pfsense-utils.inc:1371
+#: etc/inc/pfsense-utils.inc:1424 etc/inc/pfsense-utils.inc:1429
+#: etc/inc/pfsense-utils.inc:1429
+msgid "blocking"
+msgstr "ブロッキング"
+
+#: etc/inc/pfsense-utils.inc:1300 etc/inc/pfsense-utils.inc:1371
+#: etc/inc/pfsense-utils.inc:1424 etc/inc/pfsense-utils.inc:1429
+#: etc/inc/pfsense-utils.inc:1429
+msgid "check for ethernet loops"
+msgstr "イーサネットループの有無を調べる"
+
+#: etc/inc/pfsense-utils.inc:1303 etc/inc/pfsense-utils.inc:1374
+#: etc/inc/pfsense-utils.inc:1427 etc/inc/pfsense-utils.inc:1432
+#: etc/inc/pfsense-utils.inc:1432
+msgid "learning"
+msgstr "ラーニング"
+
+#: etc/inc/pfsense-utils.inc:1306 etc/inc/pfsense-utils.inc:1377
+#: etc/inc/pfsense-utils.inc:1430 etc/inc/pfsense-utils.inc:1435
+#: etc/inc/pfsense-utils.inc:1435
+msgid "forwarding"
+msgstr "転送"
+
+#: etc/inc/pfsense-utils.inc:1417 etc/inc/pfsense-utils.inc:1493
+#: etc/inc/pfsense-utils.inc:1546 etc/inc/pfsense-utils.inc:1551
+#: etc/inc/pfsense-utils.inc:1555
+#, php-format
+msgid "DNSCACHE: Found old IP %1$s and new IP %2$s"
+msgstr "DNSCACHE:実測古いIPは%1$sと新しいIP %2$s"
+
+#: etc/inc/pkg-utils.inc:211 etc/inc/pkg-utils.inc:226
+#: etc/inc/pkg-utils.inc:244 etc/inc/pkg-utils.inc:244
+msgid "Resyncing configuration for all packages."
+msgstr "すべてのパッケージの構成を再同期。"
+
+#: etc/inc/pkg-utils.inc:231 etc/inc/pkg-utils.inc:246
+#: etc/inc/pkg-utils.inc:264 etc/inc/pkg-utils.inc:264
+msgid "Syncing packages:"
+msgstr "パッケージを同期する:"
+
+#: etc/inc/pkg-utils.inc:273 etc/inc/pkg-utils.inc:288
+#: etc/inc/pkg-utils.inc:306 etc/inc/pkg-utils.inc:306
+#, php-format
+msgid ""
+"The %1$s package is missing required dependencies and must be reinstalled. "
+"%2$s"
+msgstr ""%1$sパッケージには、必要な依存関係が欠落して、再インストールする必要があります。"%2$s"
+
+#: etc/inc/pkg-utils.inc:297 etc/inc/pkg-utils.inc:437
+#: etc/inc/pkg-utils.inc:312 etc/inc/pkg-utils.inc:462
+#: etc/inc/pkg-utils.inc:464 etc/inc/pkg-utils.inc:330
+#: etc/inc/pkg-utils.inc:481 etc/inc/pkg-utils.inc:330
+#: etc/inc/pkg-utils.inc:481
+#, php-format
+msgid ""
+"The %s package is missing required dependencies and must be reinstalled."
+msgstr ""%sパッケージには、必要な依存関係が欠落して、再インストールする必要があります。"
+
+#: etc/inc/pkg-utils.inc:404 etc/inc/pkg-utils.inc:429
+#: etc/inc/pkg-utils.inc:431 etc/inc/pkg-utils.inc:448
+#: etc/inc/pkg-utils.inc:448
+#, php-format
+msgid ""
+"The %s package is missing its configuration file and must be reinstalled."
+msgstr ""%sパッケージには、その設定ファイルが欠落して、再インストールする必要があります。"
+
+#: etc/inc/pkg-utils.inc:563 usr/local/www/pkg_mgr_install.php:101
+#: etc/inc/pkg-utils.inc:589 etc/inc/pkg-utils.inc:590
+#: usr/local/www/pkg_mgr_install.php:99 etc/inc/pkg-utils.inc:625
+#: usr/local/www/pkg_mgr_install.php:97 usr/local/www/pkg_mgr_install.php:97
+#: etc/inc/pkg-utils.inc:625
+msgid "Beginning package installation."
+msgstr "パッケージのインストールを開始する。"
+
+#: etc/inc/pkg-utils.inc:564 etc/inc/pkg-utils.inc:565
+#: etc/inc/pkg-utils.inc:590 etc/inc/pkg-utils.inc:591
+#: etc/inc/pkg-utils.inc:592 etc/inc/pkg-utils.inc:626
+#: etc/inc/pkg-utils.inc:627 etc/inc/pkg-utils.inc:626
+#: etc/inc/pkg-utils.inc:627
+#, php-format
+msgid "Beginning package installation for %s ."
+msgstr "%sために開始するパッケージのインストール。"
+
+#: etc/inc/pkg-utils.inc:569 etc/inc/pkg-utils.inc:595
+#: etc/inc/pkg-utils.inc:596 etc/inc/pkg-utils.inc:631
+#: etc/inc/pkg-utils.inc:631
+msgid "Downloading package configuration file... "
+msgstr "パッケージ構成ファイルのダウンロード... "
+
+#: etc/inc/pkg-utils.inc:571 etc/inc/pkg-utils.inc:597
+#: etc/inc/pkg-utils.inc:598 etc/inc/pkg-utils.inc:633
+#: etc/inc/pkg-utils.inc:633
+msgid "Downloading package configuration file..."
+msgstr "パッケージ構成ファイルのダウンロード..."
+
+#: etc/inc/pkg-utils.inc:575 etc/inc/pkg-utils.inc:601
+#: etc/inc/pkg-utils.inc:602 etc/inc/pkg-utils.inc:637
+#: etc/inc/pkg-utils.inc:637
+msgid ""
+"ERROR! Unable to fetch package configuration file. Aborting installation."
+msgstr ""エラー!パッケージ構成ファイルを取得することができません。インストールを中止しています。"
+
+#: etc/inc/pkg-utils.inc:577 etc/inc/pkg-utils.inc:603
+#: etc/inc/pkg-utils.inc:604 etc/inc/pkg-utils.inc:639
+#: etc/inc/pkg-utils.inc:639
+msgid ""
+"ERROR! Unable to fetch package configuration file. Aborting package "
+"installation."
+msgstr ""エラー!パッケージ構成ファイルを取得することができません。"パッケージのインストールを中止しています。"
+
+#: etc/inc/pkg-utils.inc:579 etc/inc/pkg-utils.inc:605
+#: etc/inc/pkg-utils.inc:606 etc/inc/pkg-utils.inc:641
+#: etc/inc/pkg-utils.inc:641
+msgid ""
+"failed!\n"
+"\n"
+"Installation aborted.\n"
+msgstr ""失敗しました!\n"\n"インストールが中止されました。\n"
+
+#: etc/inc/pkg-utils.inc:591 etc/inc/pkg-utils.inc:617
+#: etc/inc/pkg-utils.inc:618 etc/inc/pkg-utils.inc:653
+#: etc/inc/pkg-utils.inc:653
+msgid "Saving updated package information..."
+msgstr "更新されたパッケージ情報の保存..."
+
+#: etc/inc/pkg-utils.inc:595 etc/inc/pkg-utils.inc:621
+#: etc/inc/pkg-utils.inc:622 etc/inc/pkg-utils.inc:657
+#: etc/inc/pkg-utils.inc:657
+#, php-format
+msgid "Installed %s package."
+msgstr "インストールされてパッケージ。"
+
+#: etc/inc/pkg-utils.inc:599 etc/inc/pkg-utils.inc:625
+#: etc/inc/pkg-utils.inc:626 etc/inc/pkg-utils.inc:661
+#: etc/inc/pkg-utils.inc:661
+#, php-format
+msgid "Overwrote previous installation of %s."
+msgstr "%sの上書き以前のインストール。"
+
+#: etc/inc/pkg-utils.inc:600 etc/inc/pkg-utils.inc:626
+#: etc/inc/pkg-utils.inc:627 etc/inc/pkg-utils.inc:662
+#: etc/inc/pkg-utils.inc:662
+msgid "overwrite!"
+msgstr "オーバーライト!"
+
+#: etc/inc/pkg-utils.inc:612 etc/inc/pkg-utils.inc:638
+#: etc/inc/pkg-utils.inc:639 etc/inc/pkg-utils.inc:674
+#: etc/inc/pkg-utils.inc:674
+msgid "Failed to install package."
+msgstr "パッケージのインストールに失敗しました。"
+
+#: etc/inc/pkg-utils.inc:616 etc/inc/pkg-utils.inc:642
+#: etc/inc/pkg-utils.inc:643 etc/inc/pkg-utils.inc:678
+#: etc/inc/pkg-utils.inc:678
+msgid "Writing configuration... "
+msgstr "設定を書き込み中... "
+
+#: etc/inc/pkg-utils.inc:652 etc/inc/pkg-utils.inc:678
+#: etc/inc/pkg-utils.inc:679 etc/inc/pkg-utils.inc:714
+#: etc/inc/pkg-utils.inc:714
+#, php-format
+msgid "The %s package is not installed.%sInstallation aborted."
+msgstr "%sパッケージがインストールされていません。%sインストールが中止されました。"
+
+#: etc/inc/pkg-utils.inc:667 etc/inc/pkg-utils.inc:693
+#: etc/inc/pkg-utils.inc:694 etc/inc/pkg-utils.inc:729
+#: etc/inc/pkg-utils.inc:729
+msgid "Installing"
+msgstr "インストール"
+
+#: etc/inc/pkg-utils.inc:667 etc/inc/pkg-utils.inc:693
+#: etc/inc/pkg-utils.inc:694 etc/inc/pkg-utils.inc:729
+#: etc/inc/pkg-utils.inc:729
+msgid "and its dependencies."
+msgstr "とその依存関係。"
+
+#: etc/inc/pkg-utils.inc:668 etc/inc/pkg-utils.inc:694
+#: etc/inc/pkg-utils.inc:695 etc/inc/pkg-utils.inc:730
+#: etc/inc/pkg-utils.inc:730
+msgid "Downloading"
+msgstr "ダウンロード中"
+
+#: etc/inc/pkg-utils.inc:668 etc/inc/pkg-utils.inc:694
+#: etc/inc/pkg-utils.inc:695 etc/inc/pkg-utils.inc:730
+#: etc/inc/pkg-utils.inc:730
+msgid "and its dependencies... "
+msgstr "とその依存関係... "
+
+#: etc/inc/pkg-utils.inc:680 etc/inc/pkg-utils.inc:706
+#: etc/inc/pkg-utils.inc:707 etc/inc/pkg-utils.inc:742
+#: etc/inc/pkg-utils.inc:742
+msgid "Package WAS NOT installed properly."
+msgstr "パッケージが正しくインストールされていません。"
+
+#: etc/inc/pkg-utils.inc:693 etc/inc/pkg-utils.inc:719
+#: etc/inc/pkg-utils.inc:720 etc/inc/pkg-utils.inc:755
+#: etc/inc/pkg-utils.inc:755
+msgid "Loading package configuration... "
+msgstr "パッケージ構成を読み込んでいます... "
+
+#: etc/inc/pkg-utils.inc:698 etc/inc/pkg-utils.inc:724
+#: etc/inc/pkg-utils.inc:725 etc/inc/pkg-utils.inc:760
+#: etc/inc/pkg-utils.inc:760
+msgid "Configuring package components...\n"
+msgstr "パッケージコンポーネントの設定...\n"
+
+#: etc/inc/pkg-utils.inc:704 etc/inc/pkg-utils.inc:1049
+#: etc/inc/pkg-utils.inc:730 etc/inc/pkg-utils.inc:1086
+#: etc/inc/pkg-utils.inc:731 etc/inc/pkg-utils.inc:1087
+#: etc/inc/pkg-utils.inc:766 etc/inc/pkg-utils.inc:1122
+#: etc/inc/pkg-utils.inc:766 etc/inc/pkg-utils.inc:1122
+msgid "System files... "
+msgstr "システムファイル..."
+
+#: etc/inc/pkg-utils.inc:716 etc/inc/pkg-utils.inc:742
+#: etc/inc/pkg-utils.inc:743 etc/inc/pkg-utils.inc:778
+#: etc/inc/pkg-utils.inc:778
+msgid "Additional files... "
+msgstr "追加ファイル..."
+
+#: etc/inc/pkg-utils.inc:742 etc/inc/pkg-utils.inc:768
+#: etc/inc/pkg-utils.inc:769 etc/inc/pkg-utils.inc:804
+#: etc/inc/pkg-utils.inc:804
+msgid "Extracting tarball to -C for "
+msgstr "のために -C へのtarballを解凍"
+
+#: etc/inc/pkg-utils.inc:748 etc/inc/pkg-utils.inc:774
+#: etc/inc/pkg-utils.inc:775 etc/inc/pkg-utils.inc:810
+#: etc/inc/pkg-utils.inc:810
+#, php-format
+msgid "Changing file mode to %1$s for %2$s%3$s%4$s"
+msgstr "%2$s%3$s%4$sをするために%1$sにファイルモードを変更する"
+
+#: etc/inc/pkg-utils.inc:764 etc/inc/pkg-utils.inc:1025
+#: etc/inc/pkg-utils.inc:790 etc/inc/pkg-utils.inc:1062
+#: etc/inc/pkg-utils.inc:791 etc/inc/pkg-utils.inc:1063
+#: etc/inc/pkg-utils.inc:826 etc/inc/pkg-utils.inc:1098
+#: etc/inc/pkg-utils.inc:826 etc/inc/pkg-utils.inc:1098
+msgid "Loading package instructions..."
+msgstr "ローディングパッケージの説明書..."
+
+#: etc/inc/pkg-utils.inc:779 etc/inc/pkg-utils.inc:805
+#: etc/inc/pkg-utils.inc:806 etc/inc/pkg-utils.inc:841
+#: etc/inc/pkg-utils.inc:841
+msgid "Custom commands..."
+msgstr "カスタムコマンド..."
+
+#: etc/inc/pkg-utils.inc:783 etc/inc/pkg-utils.inc:809
+#: etc/inc/pkg-utils.inc:810 etc/inc/pkg-utils.inc:845
+#: etc/inc/pkg-utils.inc:845
+msgid "Executing custom_php_global_functions()..."
+msgstr "custom_php_global_functions.() を実行..."
+
+#: etc/inc/pkg-utils.inc:790 etc/inc/pkg-utils.inc:816
+#: etc/inc/pkg-utils.inc:817 etc/inc/pkg-utils.inc:852
+#: etc/inc/pkg-utils.inc:852
+msgid "Executing custom_php_install_command()..."
+msgstr "custom_php_global_functions.() を実行..."
+
+#: etc/inc/pkg-utils.inc:809 etc/inc/pkg-utils.inc:845
+#: etc/inc/pkg-utils.inc:846 etc/inc/pkg-utils.inc:881
+#: etc/inc/pkg-utils.inc:881
+msgid "Executing custom_php_resync_config_command()..."
+msgstr "custom_php_global_functions.() を実行..."
+
+#: etc/inc/pkg-utils.inc:818 etc/inc/pkg-utils.inc:972
+#: etc/inc/pkg-utils.inc:854 etc/inc/pkg-utils.inc:1009
+#: etc/inc/pkg-utils.inc:855 etc/inc/pkg-utils.inc:1010
+#: etc/inc/pkg-utils.inc:890 etc/inc/pkg-utils.inc:1045
+#: etc/inc/pkg-utils.inc:890 etc/inc/pkg-utils.inc:1045
+msgid "Menu items... "
+msgstr "メニュー項目..."
+
+#: etc/inc/pkg-utils.inc:834 etc/inc/pkg-utils.inc:870
+#: etc/inc/pkg-utils.inc:871 etc/inc/pkg-utils.inc:906
+#: etc/inc/pkg-utils.inc:906
+msgid "Integrated Tab items... "
+msgstr "統合されたタブ項目..."
+
+#: etc/inc/pkg-utils.inc:850 etc/inc/pkg-utils.inc:989
+#: etc/inc/pkg-utils.inc:886 etc/inc/pkg-utils.inc:1026
+#: etc/inc/pkg-utils.inc:887 etc/inc/pkg-utils.inc:1027
+#: etc/inc/pkg-utils.inc:922 etc/inc/pkg-utils.inc:1062
+#: etc/inc/pkg-utils.inc:922 etc/inc/pkg-utils.inc:1062
+msgid "Services... "
+msgstr "サービス..."
+
+#: etc/inc/pkg-utils.inc:865 etc/inc/pkg-utils.inc:901
+#: etc/inc/pkg-utils.inc:902 etc/inc/pkg-utils.inc:937
+#: etc/inc/pkg-utils.inc:937
+msgid "Loading package configuration... failed!"
+msgstr "パッケージ構成を読み込んでいます...失敗しました!"
+
+#: etc/inc/pkg-utils.inc:865 etc/inc/pkg-utils.inc:901
+#: etc/inc/pkg-utils.inc:902 etc/inc/pkg-utils.inc:937
+#: etc/inc/pkg-utils.inc:937
+msgid "Installation aborted."
+msgstr "インストールが中止されました。"
+
+#: etc/inc/pkg-utils.inc:867 etc/inc/pkg-utils.inc:903
+#: etc/inc/pkg-utils.inc:904 etc/inc/pkg-utils.inc:939
+#: etc/inc/pkg-utils.inc:939
+msgid "Unable to load package configuration. Installation aborted."
+msgstr "パッケージ構成を読み込むことができません。インストールが中止されました。"
+
+#: etc/inc/pkg-utils.inc:911 etc/inc/pkg-utils.inc:948
+#: etc/inc/pkg-utils.inc:949 etc/inc/pkg-utils.inc:984
+#: etc/inc/pkg-utils.inc:984
+#, php-format
+msgid "Starting package deletion for %s..."
+msgstr "%sのパッケージの削除を開始する..."
+
+#: etc/inc/pkg-utils.inc:931 etc/inc/pkg-utils.inc:968
+#: etc/inc/pkg-utils.inc:969 etc/inc/pkg-utils.inc:1004
+#: etc/inc/pkg-utils.inc:1004
+#, php-format
+msgid "The %s package is not installed.%sDeletion aborted."
+msgstr "%sのパッケージがインストールされていません。%sを削除は中止されました。"
+
+#: etc/inc/pkg-utils.inc:942 etc/inc/pkg-utils.inc:979
+#: etc/inc/pkg-utils.inc:980 etc/inc/pkg-utils.inc:1015
+#: etc/inc/pkg-utils.inc:1015
+#, php-format
+msgid "Removing %s package... "
+msgstr "%sのパッケージを削除しています..."
+
+#: etc/inc/pkg-utils.inc:943 etc/inc/pkg-utils.inc:980
+#: etc/inc/pkg-utils.inc:981 etc/inc/pkg-utils.inc:1016
+#: etc/inc/pkg-utils.inc:1016
+#, php-format
+msgid "Removing %s components..."
+msgstr "%sのコンポーネントを削除しています..."
+
+#: etc/inc/pkg-utils.inc:955 etc/inc/pkg-utils.inc:992
+#: etc/inc/pkg-utils.inc:993 etc/inc/pkg-utils.inc:1028
+#: etc/inc/pkg-utils.inc:1028
+msgid "Tabs items... "
+msgstr "タブ項目... "
+
+#: etc/inc/pkg-utils.inc:1059 etc/inc/pkg-utils.inc:1096
+#: etc/inc/pkg-utils.inc:1097 etc/inc/pkg-utils.inc:1132
+#: etc/inc/pkg-utils.inc:1132
+msgid "Deinstall commands... "
+msgstr "アンインストールコマンド... "
+
+#: etc/inc/pkg-utils.inc:1069 etc/inc/pkg-utils.inc:1106
+#: etc/inc/pkg-utils.inc:1107 etc/inc/pkg-utils.inc:1142
+#: etc/inc/pkg-utils.inc:1142
+msgid "Removing package instructions..."
+msgstr "パッケージの指示に従って削除しています..."
+
+#: etc/inc/pkg-utils.inc:1071 etc/inc/pkg-utils.inc:1108
+#: etc/inc/pkg-utils.inc:1109 etc/inc/pkg-utils.inc:1144
+#: etc/inc/pkg-utils.inc:1144
+#, php-format
+msgid "Remove '%s'"
+msgstr "'%s'をを削除"
+
+#: etc/inc/pkg-utils.inc:1078 etc/inc/pkg-utils.inc:1115
+#: etc/inc/pkg-utils.inc:1116 etc/inc/pkg-utils.inc:1151
+#: etc/inc/pkg-utils.inc:1151
+msgid "Auxiliary files... "
+msgstr "補助ファイル... "
+
+#: etc/inc/pkg-utils.inc:1092 etc/inc/pkg-utils.inc:1129
+#: etc/inc/pkg-utils.inc:1130 etc/inc/pkg-utils.inc:1165
+#: etc/inc/pkg-utils.inc:1165
+msgid "Package XML... "
+msgstr "パッケージXML... "
+
+#: etc/inc/pkg-utils.inc:1111 etc/inc/pkg-utils.inc:1148
+#: etc/inc/pkg-utils.inc:1149 etc/inc/pkg-utils.inc:1184
+#: etc/inc/pkg-utils.inc:1184
+msgid "Configuration... "
+msgstr "コンフィギュレーション··· "
+
+#: etc/inc/pkg-utils.inc:1205 etc/inc/pkg-utils.inc:1242
+#: etc/inc/pkg-utils.inc:1243 etc/inc/pkg-utils.inc:1274
+#: etc/inc/pkg-utils.inc:1274
+#, php-format
+msgid ""
+" >>> Unable to communicate with %1$s. Please verify DNS and interface "
+"configuration, and that %2$s has functional Internet connectivity."
+msgstr ""%1$sと通信できません。DNSとインターフェイスの設定を確認してください、"その%2$s、機能、インターネット接続を持っています。"
+
+#: etc/inc/radius.inc:404 etc/inc/radius.inc:406 etc/inc/radius.inc:406
+msgid "Error sending request:"
+msgstr "リクエスト送信エラー:"
+
+#: etc/inc/radius.inc:410 etc/inc/radius.inc:412 etc/inc/radius.inc:412
+msgid "RADIUS_ACCESS_ACCEPT is unexpected for accounting"
+msgstr "RADIUS_ACCESS_ACCEPTは、会計のために予想外である"
+
+#: etc/inc/radius.inc:419 etc/inc/radius.inc:421 etc/inc/radius.inc:421
+msgid "RADIUS_ACCOUNTING_RESPONSE is unexpected for authentication"
+msgstr "RADIUS_ACCOUNTING_RESPONSEは、認証のために予想外である"
+
+#: etc/inc/radius.inc:424 etc/inc/radius.inc:426 etc/inc/radius.inc:426
+#, php-format
+msgid "Unexpected return value: %s"
+msgstr "予期しない戻り値:%s"
+
+#: etc/inc/services.inc:262 etc/inc/services.inc:333 etc/inc/services.inc:360
+#: etc/inc/services.inc:369 etc/inc/services.inc:371 etc/inc/services.inc:373
+#, php-format
+msgid "DHCP leases restore failed exited with %1$s, the error is: %2$s%3$s"
+msgstr "DHCPリースは%1$sで終了しました復元に失敗しました、エラー:%2$s%3$s"
+
+#: etc/inc/services.inc:275 etc/inc/services.inc:346 etc/inc/services.inc:373
+#: etc/inc/services.inc:382 etc/inc/services.inc:387 etc/inc/services.inc:389
+msgid "Starting DHCP service..."
+msgstr "DHCPサービスを開始..."
+
+#: etc/inc/services.inc:282 etc/inc/services.inc:353 etc/inc/services.inc:380
+#: etc/inc/services.inc:820 etc/inc/services.inc:825 etc/inc/services.inc:877
+#, php-format
+msgid "Error: cannot open dhcpd.conf in services_dhcpdv4_configure().%s"
+msgstr "エラー:services_dhcpdv4_configure.().%s を処理dhcpd.confの開くことができません。"
+
+#: etc/inc/services.inc:353 etc/inc/services.inc:434 etc/inc/services.inc:461
+#: etc/inc/services.inc:463 etc/inc/services.inc:468 etc/inc/services.inc:469
+msgid "Warning! DHCP Failover setup and no CARP virtual IP's defined!"
+msgstr "警告!DHCPフェールオーバーの設定なしCARP仮想IPの定義された!"
+
+#: etc/inc/services.inc:949 etc/inc/services.inc:1078
+#: etc/inc/services.inc:1210 etc/inc/services.inc:1203
+#: etc/inc/services.inc:1209 etc/inc/services.inc:1261
+msgid "Could not write Igmpproxy configuration file!"
+msgstr "Igmpproxy設定ファイルを書き込むことができませんでした!"
+
+#: etc/inc/services.inc:956
+msgid "Started Igmpproxy service successfully."
+msgstr "首尾Igmpproxyサービスを開始しました。"
+
+#: etc/inc/services.inc:980 etc/inc/services.inc:1109
+#: etc/inc/services.inc:1241 etc/inc/services.inc:1235
+#: etc/inc/services.inc:1242 etc/inc/services.inc:1294
+msgid "Starting DHCP relay service..."
+msgstr "DHCPリレーサービスを開始..."
+
+#: etc/inc/services.inc:1096 etc/inc/services.inc:1223
+#: etc/inc/services.inc:1355 etc/inc/services.inc:1350
+#: etc/inc/services.inc:1365 etc/inc/services.inc:1417
+msgid "Starting DHCPv6 relay service..."
+msgstr "DHCPv6リレーサービスを開始..."
+
+#: etc/inc/services.inc:1222 etc/inc/services.inc:1358
+#: etc/inc/services.inc:1493 etc/inc/services.inc:1489
+#: etc/inc/services.inc:1505 etc/inc/services.inc:1557
+msgid "Starting DynDNS clients..."
+msgstr "DynDNSクライアント起動中..."
+
+#: etc/inc/services.inc:1255 etc/inc/services.inc:1392
+#: etc/inc/services.inc:1531 etc/inc/services.inc:1545
+#: etc/inc/services.inc:1562 etc/inc/services.inc:1622
+msgid "Starting DNS forwarder..."
+msgstr "DNSフォワーダを開始..."
+
+#: etc/inc/services.inc:1324 etc/inc/services.inc:1507
+#: etc/inc/services.inc:1646 etc/inc/services.inc:1623
+#: etc/inc/services.inc:1655 etc/inc/services.inc:1686
+#: etc/inc/services.inc:1750
+msgid "Starting SNMP daemon... "
+msgstr "SNMPデーモンを起動する... "
+
+#: etc/inc/services.inc:1329 etc/inc/services.inc:1512
+#: etc/inc/services.inc:1651 etc/inc/services.inc:1628
+#: etc/inc/services.inc:1660 etc/inc/services.inc:1691
+#: etc/inc/services.inc:1755
+#, php-format
+msgid "Error: cannot open snmpd.conf in services_snmpd_configure().%s"
+msgstr "エラー:services_snmpd_configure.().%sを処理のsnmpd.confを開くことはできません"
+
+#: etc/inc/services.inc:1875 etc/inc/services.inc:2067
+#: etc/inc/services.inc:1919 etc/inc/services.inc:1908
+#: etc/inc/services.inc:1948 etc/inc/services.inc:1979
+#: etc/inc/services.inc:2043
+msgid "pfSense specific crontab entries"
+msgstr "pfSense特定crontabのエントリ"
+
+#: etc/inc/services.inc:1876 etc/inc/services.inc:2068
+#: etc/inc/services.inc:1920 etc/inc/services.inc:1909
+#: etc/inc/services.inc:1949 etc/inc/services.inc:1980
+#: etc/inc/services.inc:2044
+msgid "Created:"
+msgstr "作成:"
+
+#: etc/inc/services.inc:1890 etc/inc/services.inc:2082
+#: etc/inc/services.inc:1934 etc/inc/services.inc:1923
+#: etc/inc/services.inc:1963 etc/inc/services.inc:1994
+#: etc/inc/services.inc:2058
+msgid "If possible do not add items to this file manually."
+msgstr "できればこのファイルに項目を手動で追加しないでください。"
+
+#: etc/inc/services.inc:1891 etc/inc/services.inc:2083
+#: etc/inc/services.inc:1935 etc/inc/services.inc:1924
+#: etc/inc/services.inc:1964 etc/inc/services.inc:1995
+#: etc/inc/services.inc:2059
+msgid ""
+"If you do so, this file must be terminated with a blank line (e.g. new line)"
+msgstr ""その場合、このファイルには、空白行(例えば新しい行)で終了する必要があります"
+
+#: etc/inc/services.inc:1934 etc/inc/services.inc:2126
+#: etc/inc/services.inc:1978 etc/inc/services.inc:1968
+#: etc/inc/services.inc:2008 etc/inc/services.inc:2039
+#: etc/inc/services.inc:2103
+msgid "Starting UPnP service... "
+msgstr "UPnPサービスを開始... "
+
+#: etc/inc/services.inc:1969 etc/inc/services.inc:2161
+#: etc/inc/services.inc:2013 etc/inc/services.inc:2005
+#: etc/inc/services.inc:2045 etc/inc/services.inc:2076
+#: etc/inc/services.inc:2140
+#, php-format
+msgid "Installed cron job for %s"
+msgstr "%sのためにインストールcronジョブ"
+
+#: etc/inc/services.inc:1972 etc/inc/services.inc:2164
+#: etc/inc/services.inc:2016 etc/inc/services.inc:2008
+#: etc/inc/services.inc:2048 etc/inc/services.inc:2079
+#: etc/inc/services.inc:2143
+#, php-format
+msgid "Updated cron job for %s"
+msgstr "%sのための更新されたcronジョブ"
+
+#: etc/inc/services.inc:1977 etc/inc/services.inc:2169
+#: etc/inc/services.inc:2021
+#, php-format
+msgid "Remvoed cron job for %s"
+msgstr "%sのために取り外さcronジョブ"
+
+#: etc/inc/shaper.inc:189 etc/inc/shaper.inc:190 etc/inc/shaper.inc:190
+#, php-format
+msgid "The field '%s' contains invalid characters."
+msgstr "フィールドが '%s'は無効な文字が含まれています。"
+
+#: etc/inc/shaper.inc:195 etc/inc/shaper.inc:196 etc/inc/shaper.inc:196
+#, php-format
+msgid "The field '%s' is required."
+msgstr "フィールドが '%s'が必要です。"
+
+#: etc/inc/shaper.inc:317 etc/inc/shaper.inc:651 etc/inc/shaper.inc:1544
+#: etc/inc/shaper.inc:1850 etc/inc/shaper.inc:2192 etc/inc/shaper.inc:2327
+#: etc/inc/shaper.inc:2467 etc/inc/shaper.inc:2593 etc/inc/shaper.inc:2787
+#: etc/inc/shaper.inc:3023 usr/local/www/interfaces_ppps_edit.php:750
+#: etc/inc/shaper.inc:318 etc/inc/shaper.inc:652 etc/inc/shaper.inc:1546
+#: etc/inc/shaper.inc:1852 etc/inc/shaper.inc:2194 etc/inc/shaper.inc:2329
+#: etc/inc/shaper.inc:2469 etc/inc/shaper.inc:2595 etc/inc/shaper.inc:2789
+#: etc/inc/shaper.inc:3031 etc/inc/shaper.inc:3161
+#: usr/local/www/interfaces_ppps_edit.php:751
+#: usr/local/www/interfaces_ppps_edit.php:757
+#: usr/local/www/status_queues.php:151 etc/inc/shaper.inc:1547
+#: etc/inc/shaper.inc:1853 etc/inc/shaper.inc:2195 etc/inc/shaper.inc:2330
+#: etc/inc/shaper.inc:2470 etc/inc/shaper.inc:2596 etc/inc/shaper.inc:2790
+#: etc/inc/shaper.inc:3162 etc/inc/shaper.inc:654 etc/inc/shaper.inc:1550
+#: etc/inc/shaper.inc:1858 etc/inc/shaper.inc:2200 etc/inc/shaper.inc:2335
+#: etc/inc/shaper.inc:2475 etc/inc/shaper.inc:2601 etc/inc/shaper.inc:2795
+#: etc/inc/shaper.inc:3169 usr/local/www/interfaces_ppps_edit.php:754
+#: etc/inc/shaper.inc:321 etc/inc/shaper.inc:678 etc/inc/shaper.inc:1601
+#: etc/inc/shaper.inc:1916 etc/inc/shaper.inc:2258 etc/inc/shaper.inc:2398
+#: etc/inc/shaper.inc:2538 etc/inc/shaper.inc:2669 etc/inc/shaper.inc:2863
+#: etc/inc/shaper.inc:3237 usr/local/www/interfaces_ppps_edit.php:754
+#: usr/local/www/status_queues.php:151 etc/inc/shaper.inc:321
+#: etc/inc/shaper.inc:678 etc/inc/shaper.inc:1601 etc/inc/shaper.inc:1916
+#: etc/inc/shaper.inc:2258 etc/inc/shaper.inc:2398 etc/inc/shaper.inc:2538
+#: etc/inc/shaper.inc:2669 etc/inc/shaper.inc:2882 etc/inc/shaper.inc:3293
+msgid "Bandwidth"
+msgstr "帯域幅"
+
+#: etc/inc/shaper.inc:319 etc/inc/shaper.inc:1546 etc/inc/shaper.inc:2194
+#: etc/inc/shaper.inc:2469 etc/inc/shaper.inc:2789 etc/inc/shaper.inc:320
+#: etc/inc/shaper.inc:1548 etc/inc/shaper.inc:2196 etc/inc/shaper.inc:2471
+#: etc/inc/shaper.inc:2791 etc/inc/shaper.inc:1549 etc/inc/shaper.inc:2197
+#: etc/inc/shaper.inc:2472 etc/inc/shaper.inc:2792 etc/inc/shaper.inc:1552
+#: etc/inc/shaper.inc:2202 etc/inc/shaper.inc:2477 etc/inc/shaper.inc:2797
+#: etc/inc/shaper.inc:323 etc/inc/shaper.inc:1603 etc/inc/shaper.inc:2260
+#: etc/inc/shaper.inc:2540 etc/inc/shaper.inc:2865 etc/inc/shaper.inc:323
+#: etc/inc/shaper.inc:1603 etc/inc/shaper.inc:2260 etc/inc/shaper.inc:2540
+#: etc/inc/shaper.inc:2884
+msgid "Bandwidthtype"
+msgstr "帯域幅タイプ"
+
+#: etc/inc/shaper.inc:324 etc/inc/shaper.inc:1552 etc/inc/shaper.inc:2199
+#: etc/inc/shaper.inc:2474 etc/inc/shaper.inc:2900 etc/inc/shaper.inc:325
+#: etc/inc/shaper.inc:1554 etc/inc/shaper.inc:2201 etc/inc/shaper.inc:2476
+#: etc/inc/shaper.inc:2904 etc/inc/shaper.inc:1555 etc/inc/shaper.inc:2202
+#: etc/inc/shaper.inc:2477 etc/inc/shaper.inc:1558 etc/inc/shaper.inc:2207
+#: etc/inc/shaper.inc:2482 etc/inc/shaper.inc:328 etc/inc/shaper.inc:1609
+#: etc/inc/shaper.inc:2265 etc/inc/shaper.inc:2545 etc/inc/shaper.inc:328
+#: etc/inc/shaper.inc:1609 etc/inc/shaper.inc:2265 etc/inc/shaper.inc:2545
+msgid "Bandwidth must be an integer."
+msgstr "帯域幅は、整数でなければなりません。"
+
+#: etc/inc/shaper.inc:326 etc/inc/shaper.inc:1555 etc/inc/shaper.inc:2203
+#: etc/inc/shaper.inc:2478 etc/inc/shaper.inc:327 etc/inc/shaper.inc:1557
+#: etc/inc/shaper.inc:2205 etc/inc/shaper.inc:2480 etc/inc/shaper.inc:1558
+#: etc/inc/shaper.inc:2206 etc/inc/shaper.inc:2481 etc/inc/shaper.inc:1561
+#: etc/inc/shaper.inc:2211 etc/inc/shaper.inc:2486 etc/inc/shaper.inc:330
+#: etc/inc/shaper.inc:1612 etc/inc/shaper.inc:2269 etc/inc/shaper.inc:2549
+#: etc/inc/shaper.inc:330 etc/inc/shaper.inc:1612 etc/inc/shaper.inc:2269
+#: etc/inc/shaper.inc:2549
+msgid "Bandwidth cannot be negative."
+msgstr "帯域幅は、負にすることはできません。"
+
+#: etc/inc/shaper.inc:328 etc/inc/shaper.inc:329 etc/inc/shaper.inc:332
+#: etc/inc/shaper.inc:332
+msgid "Qlimit must be an integer."
+msgstr "Qlimitは整数でなければなりません。"
+
+#: etc/inc/shaper.inc:330 etc/inc/shaper.inc:331 etc/inc/shaper.inc:334
+#: etc/inc/shaper.inc:334
+msgid "Qlimit must be an positive."
+msgstr "Qlimitは正でなければなりません。"
+
+#: etc/inc/shaper.inc:332 etc/inc/shaper.inc:333 etc/inc/shaper.inc:336
+#: etc/inc/shaper.inc:336
+msgid "Tbrsize must be an integer."
+msgstr "Tbrsizeは整数でなければなりません。"
+
+#: etc/inc/shaper.inc:334 etc/inc/shaper.inc:335 etc/inc/shaper.inc:338
+#: etc/inc/shaper.inc:338
+msgid "Tbrsize must be an positive."
+msgstr "Tbrsizeは正でなければなりません。"
+
+#: etc/inc/shaper.inc:614 etc/inc/shaper.inc:1120 etc/inc/shaper.inc:3269
+#: etc/inc/shaper.inc:3488 etc/inc/shaper.inc:615 etc/inc/shaper.inc:1121
+#: etc/inc/shaper.inc:3277 etc/inc/shaper.inc:3500 etc/inc/shaper.inc:3432
+#: etc/inc/shaper.inc:3655 etc/inc/shaper.inc:1122 etc/inc/shaper.inc:3433
+#: etc/inc/shaper.inc:3656 etc/inc/shaper.inc:617 etc/inc/shaper.inc:1126
+#: etc/inc/shaper.inc:3440 etc/inc/shaper.inc:3663 etc/inc/shaper.inc:637
+#: etc/inc/shaper.inc:1169 etc/inc/shaper.inc:3508 etc/inc/shaper.inc:3731
+#: etc/inc/shaper.inc:637 etc/inc/shaper.inc:1169 etc/inc/shaper.inc:3589
+#: etc/inc/shaper.inc:3836
+msgid "Enable/Disable"
+msgstr "有効/無効"
+
+#: etc/inc/shaper.inc:619 etc/inc/shaper.inc:620 etc/inc/shaper.inc:622
+#: etc/inc/shaper.inc:642 etc/inc/shaper.inc:642
+msgid "Enable/disable discipline and its children"
+msgstr "規律とその子を有効または無効にする"
+
+#: etc/inc/shaper.inc:621 etc/inc/shaper.inc:965 etc/inc/shaper.inc:2791
+#: etc/inc/shaper.inc:3016 etc/inc/shaper.inc:3276 etc/inc/shaper.inc:3496
+#: etc/inc/shaper.inc:3568 usr/local/www/load_balancer_virtual_server.php:128
+#: usr/local/www/firewall_aliases_import.php:59
+#: usr/local/www/load_balancer_relay_action.php:140
+#: usr/local/www/interfaces_groups.php:94
+#: usr/local/www/firewall_aliases.php:165
+#: usr/local/www/firewall_aliases_edit.php:134
+#: usr/local/www/firewall_aliases_edit.php:576
+#: usr/local/www/firewall_schedule.php:96
+#: usr/local/www/load_balancer_pool.php:131
+#: usr/local/www/load_balancer_monitor.php:122
+#: usr/local/www/load_balancer_monitor_edit.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:235
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:181
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:183
+#: usr/local/www/services_captiveportal_filemanager.php:162
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:411
+#: usr/local/www/load_balancer_relay_protocol.php:134
+#: usr/local/www/load_balancer_relay_protocol_edit.php:79
+#: usr/local/www/load_balancer_relay_protocol_edit.php:195
+#: usr/local/www/services_igmpproxy.php:95
+#: usr/local/www/status_gateways.php:72 usr/local/www/status_lb_pool.php:130
+#: usr/local/www/status_lb_vs.php:77 usr/local/www/status_openvpn.php:211
+#: usr/local/www/status_openvpn.php:262 usr/local/www/system_camanager.php:565
+#: usr/local/www/system_certmanager.php:854
+#: usr/local/www/system_crlmanager.php:487
+#: usr/local/www/system_gateways.php:152
+#: usr/local/www/system_gateways_edit.php:98
+#: usr/local/www/system_gateways_edit.php:370
+#: usr/local/www/system_groupmanager.php:346
+#: usr/local/www/system_usermanager.php:577
+#: usr/local/www/system_usermanager.php:630 etc/inc/shaper.inc:622
+#: etc/inc/shaper.inc:966 etc/inc/shaper.inc:2793 etc/inc/shaper.inc:3020
+#: etc/inc/shaper.inc:3284 etc/inc/shaper.inc:3508 etc/inc/shaper.inc:3580
+#: usr/local/www/pkg_mgr.php:129 usr/local/www/system_certmanager.php:1020
+#: usr/local/www/load_balancer_relay_action_edit.php:410
+#: usr/local/www/system_usermanager.php:575
+#: usr/local/www/system_usermanager.php:628
+#: usr/local/www/firewall_aliases_edit.php:581
+#: usr/local/www/pkg_mgr_installed.php:111
+#: usr/local/www/load_balancer_virtual_server.php:129
+#: usr/local/www/system_gateways_edit.php:99
+#: usr/local/www/system_gateways_edit.php:391
+#: usr/local/www/load_balancer_monitor.php:123
+#: usr/local/www/load_balancer_virtual_server_edit.php:157
+#: usr/local/www/firewall_aliases.php:168
+#: usr/local/www/system_camanager.php:566
+#: usr/local/www/load_balancer_pool_edit.php:189
+#: usr/local/www/load_balancer_pool.php:132 etc/inc/shaper.inc:3150
+#: etc/inc/shaper.inc:3439 etc/inc/shaper.inc:3663 etc/inc/shaper.inc:3735
+#: usr/local/www/status_openvpn.php:214 usr/local/www/status_openvpn.php:265
+#: usr/local/www/load_balancer_relay_protocol_edit.php:193
+#: usr/local/www/interfaces_groups.php:95
+#: usr/local/www/load_balancer_relay_action_edit.php:408
+#: usr/local/www/load_balancer_monitor_edit.php:233
+#: usr/local/www/system_crlmanager.php:520
+#: usr/local/www/firewall_aliases_edit.php:584
+#: usr/local/www/load_balancer_virtual_server.php:127
+#: usr/local/www/system_gateways_edit.php:100
+#: usr/local/www/system_gateways_edit.php:497
+#: usr/local/www/status_gateways.php:73
+#: usr/local/www/services_captiveportal_filemanager.php:159
+#: usr/local/www/load_balancer_monitor.php:121
+#: usr/local/www/load_balancer_relay_protocol.php:132
+#: usr/local/www/load_balancer_virtual_server_edit.php:155
+#: usr/local/www/firewall_aliases.php:188
+#: usr/local/www/load_balancer_relay_action.php:138
+#: usr/local/www/load_balancer_pool_edit.php:187
+#: usr/local/www/load_balancer_pool.php:130
+#: usr/local/www/system_gateways_edit.php:499
+#: usr/local/www/system_camanager.php:590 usr/local/www/status_openvpn.php:313
+#: usr/local/www/system_certmanager.php:1062 etc/inc/shaper.inc:2794
+#: etc/inc/shaper.inc:3151 etc/inc/shaper.inc:3440 etc/inc/shaper.inc:3664
+#: etc/inc/shaper.inc:3736 usr/local/www/system_gateways_edit.php:501
+#: usr/local/www/status_openvpn.php:272 usr/local/www/status_openvpn.php:333
+#: usr/local/www/pkg_mgr_installed.php:113
+#: usr/local/www/system_certmanager.php:1066 usr/local/www/pkg_mgr.php:132
+#: usr/local/www/firewall_aliases_edit.php:128
+#: usr/local/www/firewall_aliases_edit.php:615 etc/inc/shaper.inc:624
+#: etc/inc/shaper.inc:970 etc/inc/shaper.inc:2799 etc/inc/shaper.inc:3158
+#: etc/inc/shaper.inc:3447 etc/inc/shaper.inc:3671 etc/inc/shaper.inc:3743
+#: usr/local/www/system_gateways_edit.php:531 etc/inc/shaper.inc:644
+#: etc/inc/shaper.inc:1002 etc/inc/shaper.inc:2867 etc/inc/shaper.inc:3226
+#: etc/inc/shaper.inc:3515 etc/inc/shaper.inc:3739 etc/inc/shaper.inc:3811
+#: usr/local/www/system_gateways_edit.php:100
+#: usr/local/www/system_gateways_edit.php:531
+#: usr/local/www/system_camanager.php:590
+#: usr/local/www/load_balancer_relay_protocol_edit.php:79
+#: usr/local/www/load_balancer_relay_protocol_edit.php:193
+#: usr/local/www/system_groupmanager.php:346
+#: usr/local/www/firewall_schedule.php:96 usr/local/www/status_openvpn.php:272
+#: usr/local/www/status_openvpn.php:333
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:155
+#: usr/local/www/firewall_aliases.php:188
+#: usr/local/www/load_balancer_relay_protocol.php:132
+#: usr/local/www/pkg_mgr_installed.php:113
+#: usr/local/www/firewall_aliases_import.php:59
+#: usr/local/www/load_balancer_relay_action.php:138
+#: usr/local/www/system_certmanager.php:1066
+#: usr/local/www/status_lb_pool.php:130 usr/local/www/interfaces_groups.php:95
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:408
+#: usr/local/www/pkg_mgr.php:177 usr/local/www/system_crlmanager.php:520
+#: usr/local/www/load_balancer_pool.php:130
+#: usr/local/www/services_captiveportal_filemanager.php:159
+#: usr/local/www/load_balancer_monitor_edit.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:233
+#: usr/local/www/firewall_aliases_edit.php:128
+#: usr/local/www/firewall_aliases_edit.php:601
+#: usr/local/www/services_igmpproxy.php:95
+#: usr/local/www/widgets/widgets/system_information.widget.php:88
+#: usr/local/www/load_balancer_monitor.php:121
+#: usr/local/www/system_usermanager.php:575
+#: usr/local/www/system_usermanager.php:628
+#: usr/local/www/system_gateways.php:152
+#: usr/local/www/load_balancer_virtual_server.php:127
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:187
+#: usr/local/www/status_lb_vs.php:77 usr/local/www/status_gateways.php:73
+#: etc/inc/shaper.inc:644 etc/inc/shaper.inc:1002 etc/inc/shaper.inc:2886
+#: etc/inc/shaper.inc:3282 etc/inc/shaper.inc:3596 etc/inc/shaper.inc:3844
+#: etc/inc/shaper.inc:3916
+msgid "Name"
+msgstr "ネーム"
+
+#: etc/inc/shaper.inc:625 etc/inc/shaper.inc:626 etc/inc/shaper.inc:628
+#: etc/inc/shaper.inc:648 etc/inc/shaper.inc:648
+msgid "Scheduler Type "
+msgstr "スケジューラの種類 "
+
+#: etc/inc/shaper.inc:647 etc/inc/shaper.inc:648 etc/inc/shaper.inc:650
+#: etc/inc/shaper.inc:674 etc/inc/shaper.inc:674
+msgid "NOTE: Changing this changes all child queues!"
+msgstr "注:これは、すべての子のキューを変更する変更!"
+
+#: etc/inc/shaper.inc:648 etc/inc/shaper.inc:649 etc/inc/shaper.inc:651
+#: etc/inc/shaper.inc:675 etc/inc/shaper.inc:675
+msgid " Beware you can lose information."
+msgstr " 情報を失う可能性があります注意してください。"
+
+#: etc/inc/shaper.inc:686 etc/inc/shaper.inc:687 etc/inc/shaper.inc:689
+#: etc/inc/shaper.inc:713 etc/inc/shaper.inc:713
+msgid ""
+"Adjusts the size, in bytes, of the token bucket regulator. If not specified, "
+"heuristics based on the interface bandwidth are used to determine the size."
+msgstr ""トークンバケットレギュレータのサイズをバイト単位で、調整します。"指定しない場合、ヒューリスティックは、インターフェイスの帯域幅に基づいて"サイズを決定するために使用される。"
+
+#: etc/inc/shaper.inc:978 etc/inc/shaper.inc:979 etc/inc/shaper.inc:983
+#: etc/inc/shaper.inc:1015 etc/inc/shaper.inc:1015
+msgid "The priority must be an integer between 1 and 15."
+msgstr "優先度は1から15までの整数でなければなりません。"
+
+#: etc/inc/shaper.inc:981 etc/inc/shaper.inc:2802 etc/inc/shaper.inc:982
+#: etc/inc/shaper.inc:2804 etc/inc/shaper.inc:2805 etc/inc/shaper.inc:986
+#: etc/inc/shaper.inc:2810 etc/inc/shaper.inc:1018 etc/inc/shaper.inc:2878
+#: etc/inc/shaper.inc:1018 etc/inc/shaper.inc:2897
+msgid "Queue limit must be an integer"
+msgstr "キュー制限は、整数でなければなりません"
+
+#: etc/inc/shaper.inc:983 etc/inc/shaper.inc:984 etc/inc/shaper.inc:988
+#: etc/inc/shaper.inc:1020 etc/inc/shaper.inc:1020
+msgid "Queue limit must be positive"
+msgstr "キュー制限は正でなければなりません"
+
+#: etc/inc/shaper.inc:985 etc/inc/shaper.inc:987 etc/inc/shaper.inc:2804
+#: etc/inc/shaper.inc:2806 etc/inc/shaper.inc:3573 etc/inc/shaper.inc:986
+#: etc/inc/shaper.inc:988 etc/inc/shaper.inc:2808 etc/inc/shaper.inc:3585
+#: etc/inc/shaper.inc:3740 etc/inc/shaper.inc:2807 etc/inc/shaper.inc:2809
+#: etc/inc/shaper.inc:3741 etc/inc/shaper.inc:990 etc/inc/shaper.inc:992
+#: etc/inc/shaper.inc:2812 etc/inc/shaper.inc:2814 etc/inc/shaper.inc:3748
+#: etc/inc/shaper.inc:1022 etc/inc/shaper.inc:1024 etc/inc/shaper.inc:2880
+#: etc/inc/shaper.inc:2882 etc/inc/shaper.inc:3816 etc/inc/shaper.inc:1022
+#: etc/inc/shaper.inc:1024 etc/inc/shaper.inc:2899 etc/inc/shaper.inc:2901
+#: etc/inc/shaper.inc:3921
+msgid "Queue names must be alphanumeric and _ or - only."
+msgstr "キュー名は英数字でと '_'または必要があります' - 'のみ。"
+
+#: etc/inc/shaper.inc:989 etc/inc/shaper.inc:990 etc/inc/shaper.inc:991
+#: etc/inc/shaper.inc:995 etc/inc/shaper.inc:1027 etc/inc/shaper.inc:1027
+msgid "Only one default queue per interface is allowed."
+msgstr "インターフェイスごとに1つだけのデフォルトのキューが許可されています。"
+
+#: etc/inc/shaper.inc:1125 etc/inc/shaper.inc:1126 etc/inc/shaper.inc:1127
+#: etc/inc/shaper.inc:1131 etc/inc/shaper.inc:1174 etc/inc/shaper.inc:1174
+msgid "Enable/Disable queue and its children"
+msgstr "キューとその子を有効または無効にする"
+
+#: etc/inc/shaper.inc:1129 etc/inc/shaper.inc:1130 etc/inc/shaper.inc:1131
+#: etc/inc/shaper.inc:1135 etc/inc/shaper.inc:1178 etc/inc/shaper.inc:1178
+msgid "Queue Name"
+msgstr "キュー名"
+
+#: etc/inc/shaper.inc:1136 etc/inc/shaper.inc:1137 etc/inc/shaper.inc:1138
+#: etc/inc/shaper.inc:1142 etc/inc/shaper.inc:1185 etc/inc/shaper.inc:1185
+msgid ""
+"Enter the name of the queue here. Do not use spaces and limit the size to "
+"15 characters."
+msgstr ""ここにキューの名前を入力します。"スペースを使用し、15文字までのサイズを限定するものではない。"
+
+#: etc/inc/shaper.inc:1139 usr/local/www/interfaces_bridge_edit.php:354
+#: usr/local/www/interfaces_bridge_edit.php:373
+#: usr/local/www/system_gateway_groups.php:122 etc/inc/shaper.inc:1140
+#: usr/local/www/interfaces_bridge_edit.php:363
+#: usr/local/www/interfaces_bridge_edit.php:382
+#: usr/local/www/system_gateway_groups.php:123
+#: usr/local/www/interfaces_bridge_edit.php:364
+#: usr/local/www/interfaces_bridge_edit.php:383
+#: usr/local/www/interfaces_bridge_edit.php:365
+#: usr/local/www/interfaces_bridge_edit.php:384 etc/inc/shaper.inc:1141
+#: usr/local/www/system_gateway_groups.php:132 etc/inc/shaper.inc:1145
+#: usr/local/www/interfaces_bridge_edit.php:367
+#: usr/local/www/interfaces_bridge_edit.php:386 etc/inc/shaper.inc:1188
+#: usr/local/www/interfaces_bridge_edit.php:367
+#: usr/local/www/interfaces_bridge_edit.php:386
+#: usr/local/www/system_gateway_groups.php:132 etc/inc/shaper.inc:1188
+msgid "Priority"
+msgstr "プライオリティ"
+
+#: etc/inc/shaper.inc:1143 etc/inc/shaper.inc:1144 etc/inc/shaper.inc:1145
+#: etc/inc/shaper.inc:1149 etc/inc/shaper.inc:1192 etc/inc/shaper.inc:1192
+msgid ""
+"For hfsc, the range is 0 to 7. The default is 1. Hfsc queues with a higher "
+"priority are preferred in the case of overload."
+msgstr ""HFSCの場合、範囲は0〜7です。デフォルトは1です。"優先度の高いキューはHFSC過負荷の場合に好ましい。"
+
+#: etc/inc/shaper.inc:1146 etc/inc/shaper.inc:1147 etc/inc/shaper.inc:1148
+#: etc/inc/shaper.inc:1152 etc/inc/shaper.inc:1195 etc/inc/shaper.inc:1195
+msgid "Queue limit"
+msgstr "キュー制限"
+
+#: etc/inc/shaper.inc:1150 etc/inc/shaper.inc:1151 etc/inc/shaper.inc:1152
+#: etc/inc/shaper.inc:1156 etc/inc/shaper.inc:1199 etc/inc/shaper.inc:1199
+msgid "Queue limit in packets per second."
+msgstr "1秒あたりのパケット数、キュー制限。"
+
+#: etc/inc/shaper.inc:1153 etc/inc/shaper.inc:1154 etc/inc/shaper.inc:1155
+#: etc/inc/shaper.inc:1159 etc/inc/shaper.inc:1202 etc/inc/shaper.inc:1202
+msgid "Scheduler options"
+msgstr "スケジューラオプション"
+
+#: etc/inc/shaper.inc:1158 etc/inc/shaper.inc:1161 etc/inc/shaper.inc:1159
+#: etc/inc/shaper.inc:1162 etc/inc/shaper.inc:1160 etc/inc/shaper.inc:1163
+#: etc/inc/shaper.inc:1164 etc/inc/shaper.inc:1167 etc/inc/shaper.inc:1207
+#: etc/inc/shaper.inc:1210 etc/inc/shaper.inc:1207 etc/inc/shaper.inc:1210
+msgid "Default queue"
+msgstr "デフォルトのキュー"
+
+#: etc/inc/shaper.inc:1168 etc/inc/shaper.inc:1169 etc/inc/shaper.inc:1170
+#: etc/inc/shaper.inc:1174 etc/inc/shaper.inc:1217 etc/inc/shaper.inc:1217
+msgid "Random Early Detection"
+msgstr "ランダム早期検出"
+
+#: etc/inc/shaper.inc:1173 etc/inc/shaper.inc:1174 etc/inc/shaper.inc:1175
+#: etc/inc/shaper.inc:1179 etc/inc/shaper.inc:1222 etc/inc/shaper.inc:1222
+msgid "Random Early Detection In and Out"
+msgstr "ランダム早期検出InとOut"
+
+#: etc/inc/shaper.inc:1178 etc/inc/shaper.inc:1179 etc/inc/shaper.inc:1180
+#: etc/inc/shaper.inc:1184 etc/inc/shaper.inc:1227 etc/inc/shaper.inc:1227
+msgid "Explicit Congestion Notification"
+msgstr "明示的輻輳通知"
+
+#: etc/inc/shaper.inc:1179 etc/inc/shaper.inc:1180 etc/inc/shaper.inc:1181
+#: etc/inc/shaper.inc:1185 etc/inc/shaper.inc:1233 etc/inc/shaper.inc:1233
+msgid "Select options for this queue"
+msgstr "このキューの((オプション))を選択します"
+
+#: etc/inc/shaper.inc:1181 etc/inc/shaper.inc:3069 etc/inc/shaper.inc:3501
+#: usr/local/www/load_balancer_virtual_server.php:134
+#: usr/local/www/pkg_mgr_installed.php:94
+#: usr/local/www/firewall_aliases_import.php:140
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:121
+#: usr/local/www/firewall_virtual_ip_edit.php:538
+#: usr/local/www/load_balancer_relay_action.php:143
+#: usr/local/www/services_dyndns.php:103 usr/local/www/services_wol.php:163
+#: usr/local/www/services_wol_edit.php:148
+#: usr/local/www/interfaces_bridge.php:109
+#: usr/local/www/interfaces_bridge_edit.php:273
+#: usr/local/www/interfaces_gif.php:108
+#: usr/local/www/interfaces_gif_edit.php:208
+#: usr/local/www/interfaces_gre.php:109
+#: usr/local/www/interfaces_gre_edit.php:219
+#: usr/local/www/interfaces_groups.php:96
+#: usr/local/www/interfaces_groups_edit.php:259
+#: usr/local/www/firewall_aliases.php:167
+#: usr/local/www/firewall_aliases_edit.php:455
+#: usr/local/www/firewall_aliases_edit.php:591
+#: usr/local/www/firewall_aliases_edit.php:626
+#: usr/local/www/firewall_nat_1to1.php:108
+#: usr/local/www/firewall_nat_1to1_edit.php:440
+#: usr/local/www/firewall_nat_edit.php:769
+#: usr/local/www/firewall_nat_out.php:349
+#: usr/local/www/firewall_nat_out_edit.php:636
+#: usr/local/www/firewall_rules.php:374
+#: usr/local/www/firewall_rules_edit.php:1053
+#: usr/local/www/firewall_schedule.php:98
+#: usr/local/www/firewall_schedule_edit.php:793
+#: usr/local/www/firewall_schedule_edit.php:998
+#: usr/local/www/firewall_virtual_ip.php:187 usr/local/www/interfaces.php:1244
+#: usr/local/www/load_balancer_pool.php:136
+#: usr/local/www/interfaces_vlan.php:110
+#: usr/local/www/interfaces_vlan_edit.php:179
+#: usr/local/www/system_routes.php:129
+#: usr/local/www/system_routes_edit.php:267
+#: usr/local/www/interfaces_lagg.php:114
+#: usr/local/www/interfaces_lagg_edit.php:208
+#: usr/local/www/interfaces_ppps.php:110
+#: usr/local/www/interfaces_ppps_edit.php:467
+#: usr/local/www/interfaces_qinq.php:119
+#: usr/local/www/interfaces_qinq_edit.php:337
+#: usr/local/www/interfaces_wireless.php:108
+#: usr/local/www/interfaces_wireless_edit.php:185
+#: usr/local/www/load_balancer_monitor.php:124 usr/local/www/vpn_pppoe.php:104
+#: usr/local/www/load_balancer_monitor_edit.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:241
+#: usr/local/www/load_balancer_pool_edit.php:196
+#: usr/local/www/load_balancer_virtual_server_edit.php:189
+#: usr/local/www/pkg_mgr.php:118 usr/local/www/firewall_nat.php:203
+#: usr/local/www/diag_ipsec.php:95
+#: usr/local/www/services_captiveportal_ip.php:118
+#: usr/local/www/services_captiveportal_ip_edit.php:208
+#: usr/local/www/services_captiveportal_mac.php:168
+#: usr/local/www/services_captiveportal_mac_edit.php:182
+#: usr/local/www/services_dhcp.php:893
+#: usr/local/www/services_dhcp_edit.php:242
+#: usr/local/www/services_dnsmasq.php:246
+#: usr/local/www/services_dnsmasq.php:313
+#: usr/local/www/services_dnsmasq_edit.php:163
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:417
+#: usr/local/www/load_balancer_relay_protocol.php:137
+#: usr/local/www/load_balancer_relay_protocol_edit.php:79
+#: usr/local/www/load_balancer_relay_protocol_edit.php:218
+#: usr/local/www/services_captiveportal_hostname.php:123
+#: usr/local/www/services_captiveportal_hostname_edit.php:183
+#: usr/local/www/status_services.php:245 usr/local/www/status_upnp.php:88
+#: usr/local/www/services_dyndns_edit.php:228
+#: usr/local/www/services_igmpproxy.php:98
+#: usr/local/www/services_igmpproxy_edit.php:175
+#: usr/local/www/services_rfc2136.php:80
+#: usr/local/www/services_rfc2136_edit.php:192
+#: usr/local/www/status_gateway_groups.php:76
+#: usr/local/www/status_gateways.php:78 usr/local/www/status_lb_pool.php:134
+#: usr/local/www/status_lb_vs.php:81
+#: usr/local/www/system_advanced_sysctl.php:172
+#: usr/local/www/system_advanced_sysctl.php:243
+#: usr/local/www/system_gateway_groups.php:123
+#: usr/local/www/system_gateway_groups_edit.php:219
+#: usr/local/www/system_gateways.php:156
+#: usr/local/www/system_gateways_edit.php:484
+#: usr/local/www/system_groupmanager.php:275
+#: usr/local/www/system_groupmanager.php:347
+#: usr/local/www/system_groupmanager.php:405
+#: usr/local/www/system_groupmanager_addprivs.php:216
+#: usr/local/www/system_usermanager.php:578
+#: usr/local/www/system_usermanager_addprivs.php:197
+#: usr/local/www/vpn_ipsec_phase1.php:575
+#: usr/local/www/vpn_ipsec_phase2.php:497
+#: usr/local/www/vpn_openvpn_client.php:573
+#: usr/local/www/vpn_openvpn_client.php:863
+#: usr/local/www/vpn_openvpn_csc.php:342 usr/local/www/vpn_openvpn_csc.php:674
+#: usr/local/www/vpn_openvpn_server.php:722
+#: usr/local/www/vpn_openvpn_server.php:1451
+#: usr/local/www/vpn_pppoe_edit.php:444 usr/local/www/firewall_nat_npt.php:107
+#: usr/local/www/firewall_nat_npt_edit.php:261
+#: usr/local/www/services_dhcpv6.php:806
+#: usr/local/www/services_dhcpv6_edit.php:219
+#: usr/local/www/services_captiveportal_zones.php:55
+#: usr/local/www/services_captiveportal_zones_edit.php:106
+#: etc/inc/shaper.inc:1182 etc/inc/shaper.inc:3077 etc/inc/shaper.inc:3513
+#: usr/local/www/system_routes_edit.php:307 usr/local/www/pkg_mgr.php:132
+#: usr/local/www/services_unbound_acls.php:238
+#: usr/local/www/services_unbound_acls.php:292
+#: usr/local/www/services_unbound_acls.php:319
+#: usr/local/www/system_gateway_groups_edit.php:274
+#: usr/local/www/services_dnsmasq.php:334
+#: usr/local/www/services_dyndns_edit.php:358
+#: usr/local/www/firewall_nat_out.php:359
+#: usr/local/www/services_dnsmasq_edit.php:218
+#: usr/local/www/services_dnsmasq_edit.php:239
+#: usr/local/www/firewall_nat_1to1_edit.php:447
+#: usr/local/www/services_dhcpv6_edit.php:228
+#: usr/local/www/firewall_nat_npt_edit.php:266
+#: usr/local/www/firewall_nat_out_edit.php:649
+#: usr/local/www/diag_ipsec.php:106
+#: usr/local/www/load_balancer_relay_action_edit.php:416
+#: usr/local/www/firewall_rules_edit.php:1088
+#: usr/local/www/services_unbound.php:282
+#: usr/local/www/services_unbound.php:349
+#: usr/local/www/system_usermanager.php:576
+#: usr/local/www/services_igmpproxy_edit.php:177
+#: usr/local/www/firewall_aliases_edit.php:458
+#: usr/local/www/firewall_aliases_edit.php:596
+#: usr/local/www/firewall_aliases_edit.php:631
+#: usr/local/www/pkg_mgr_installed.php:114
+#: usr/local/www/firewall_rules.php:378
+#: usr/local/www/load_balancer_virtual_server.php:135
+#: usr/local/www/system_groupmanager_addprivs.php:214
+#: usr/local/www/system_gateways_edit.php:519
+#: usr/local/www/load_balancer_monitor.php:125
+#: usr/local/www/services_dyndns.php:112
+#: usr/local/www/vpn_openvpn_server.php:795
+#: usr/local/www/vpn_openvpn_server.php:1593
+#: usr/local/www/services_dhcp.php:931
+#: usr/local/www/load_balancer_virtual_server_edit.php:163
+#: usr/local/www/interfaces_bridge_edit.php:282
+#: usr/local/www/firewall_aliases.php:170
+#: usr/local/www/vpn_ipsec_phase2.php:523
+#: usr/local/www/firewall_nat_edit.php:776
+#: usr/local/www/services_dhcp_edit.php:251 usr/local/www/interfaces.php:1348
+#: usr/local/www/vpn_openvpn_client.php:578
+#: usr/local/www/vpn_openvpn_client.php:868
+#: usr/local/www/load_balancer_pool_edit.php:204
+#: usr/local/www/firewall_virtual_ip_edit.php:526
+#: usr/local/www/interfaces_gre_edit.php:218
+#: usr/local/www/load_balancer_pool.php:137
+#: usr/local/www/vpn_ipsec_phase1.php:588
+#: usr/local/www/services_dhcpv6.php:901 etc/inc/shaper.inc:3225
+#: etc/inc/shaper.inc:3668 usr/local/www/vpn_pppoe_edit.php:445
+#: usr/local/www/system_routes_edit.php:308
+#: usr/local/www/system_gateway_groups_edit.php:334
+#: usr/local/www/interfaces_vlan_edit.php:180
+#: usr/local/www/services_dnsmasq.php:247
+#: usr/local/www/services_dnsmasq.php:335
+#: usr/local/www/firewall_nat_out.php:360
+#: usr/local/www/system_groupmanager.php:406
+#: usr/local/www/services_dnsmasq_edit.php:219
+#: usr/local/www/services_dnsmasq_edit.php:240
+#: usr/local/www/load_balancer_relay_protocol_edit.php:216
+#: usr/local/www/firewall_nat_1to1_edit.php:445
+#: usr/local/www/services_dhcpv6_edit.php:230
+#: usr/local/www/services_captiveportal_ip.php:116
+#: usr/local/www/firewall_nat_npt_edit.php:265 usr/local/www/vpn_pppoe.php:105
+#: usr/local/www/interfaces_groups.php:97
+#: usr/local/www/services_captiveportal_hostname_edit.php:181
+#: usr/local/www/interfaces_qinq_edit.php:338
+#: usr/local/www/interfaces_gif_edit.php:209 usr/local/www/diag_ipsec.php:107
+#: usr/local/www/firewall_nat.php:208 usr/local/www/interfaces_qinq.php:120
+#: usr/local/www/load_balancer_relay_action_edit.php:414
+#: usr/local/www/interfaces_ppps.php:111
+#: usr/local/www/load_balancer_monitor_edit.php:239
+#: usr/local/www/services_captiveportal_mac.php:166
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:151
+#: usr/local/www/services_captiveportal_mac_edit.php:180
+#: usr/local/www/firewall_schedule_edit.php:792
+#: usr/local/www/firewall_schedule_edit.php:997
+#: usr/local/www/interfaces_bridge.php:110
+#: usr/local/www/interfaces_ppps_edit.php:468
+#: usr/local/www/interfaces_lagg.php:115
+#: usr/local/www/firewall_aliases_edit.php:460
+#: usr/local/www/firewall_aliases_edit.php:599
+#: usr/local/www/firewall_aliases_edit.php:634
+#: usr/local/www/interfaces_lagg_edit.php:209
+#: usr/local/www/vpn_openvpn_csc.php:341 usr/local/www/vpn_openvpn_csc.php:673
+#: usr/local/www/services_captiveportal_hostname.php:121
+#: usr/local/www/firewall_rules.php:371 usr/local/www/interfaces_gre.php:110
+#: usr/local/www/load_balancer_virtual_server.php:133
+#: usr/local/www/interfaces_wireless.php:109
+#: usr/local/www/system_gateway_groups.php:124
+#: usr/local/www/status_services.php:241
+#: usr/local/www/system_gateways_edit.php:619
+#: usr/local/www/status_gateways.php:79
+#: usr/local/www/load_balancer_monitor.php:123
+#: usr/local/www/services_captiveportal_ip_edit.php:206
+#: usr/local/www/load_balancer_relay_protocol.php:135
+#: usr/local/www/vpn_openvpn_server.php:823
+#: usr/local/www/vpn_openvpn_server.php:1634 usr/local/www/status_upnp.php:89
+#: usr/local/www/services_dhcp.php:1135
+#: usr/local/www/load_balancer_virtual_server_edit.php:161
+#: usr/local/www/interfaces_bridge_edit.php:283
+#: usr/local/www/firewall_aliases.php:190
+#: usr/local/www/load_balancer_relay_action.php:141
+#: usr/local/www/interfaces_groups_edit.php:260
+#: usr/local/www/services_captiveportal_zones_edit.php:108
+#: usr/local/www/vpn_ipsec_phase2.php:625
+#: usr/local/www/interfaces_vlan.php:111
+#: usr/local/www/firewall_nat_edit.php:775
+#: usr/local/www/services_dhcp_edit.php:253 usr/local/www/interfaces.php:1336
+#: usr/local/www/services_captiveportal_zones.php:56
+#: usr/local/www/vpn_openvpn_client.php:596
+#: usr/local/www/vpn_openvpn_client.php:921
+#: usr/local/www/status_gateway_groups.php:77
+#: usr/local/www/load_balancer_pool_edit.php:202
+#: usr/local/www/firewall_virtual_ip_edit.php:471
+#: usr/local/www/interfaces_gif.php:109
+#: usr/local/www/load_balancer_pool.php:135
+#: usr/local/www/firewall_virtual_ip.php:191
+#: usr/local/www/vpn_ipsec_phase1.php:587
+#: usr/local/www/services_dhcpv6.php:832 usr/local/www/services_rfc2136.php:81
+#: usr/local/www/status_services.php:239
+#: usr/local/www/system_gateways_edit.php:623
+#: usr/local/www/services_captiveportal_ip_edit.php:200
+#: usr/local/www/vpn_pppoe.php:106
+#: usr/local/www/interfaces_wireless_edit.php:187
+#: usr/local/www/services_captiveportal_zones_edit.php:105
+#: usr/local/www/vpn_openvpn_client.php:615
+#: usr/local/www/vpn_openvpn_client.php:940
+#: usr/local/www/services_dhcpv6_edit.php:233
+#: usr/local/www/services_dyndns_edit.php:362
+#: usr/local/www/firewall_rules_edit.php:1103
+#: usr/local/www/interfaces_qinq.php:123
+#: usr/local/www/interfaces_vlan_edit.php:183
+#: usr/local/www/interfaces_ppps_edit.php:474
+#: usr/local/www/firewall_virtual_ip.php:205
+#: usr/local/www/interfaces_lagg_edit.php:222
+#: usr/local/www/firewall_nat_edit.php:770
+#: usr/local/www/interfaces_lagg.php:119 usr/local/www/interfaces_vlan.php:117
+#: usr/local/www/interfaces_gif_edit.php:220
+#: usr/local/www/services_dhcp_edit.php:381
+#: usr/local/www/firewall_virtual_ip_edit.php:463
+#: usr/local/www/diag_ipsec.php:109 usr/local/www/interfaces_bridge.php:116
+#: usr/local/www/interfaces_wireless.php:111
+#: usr/local/www/system_routes.php:133 usr/local/www/vpn_pppoe_edit.php:448
+#: usr/local/www/services_dhcp.php:792 usr/local/www/services_dhcp.php:1154
+#: usr/local/www/services_captiveportal_mac_edit.php:193
+#: usr/local/www/services_dhcpv6.php:853
+#: usr/local/www/interfaces_bridge_edit.php:284
+#: usr/local/www/services_dnsmasq.php:272
+#: usr/local/www/services_dnsmasq.php:360
+#: usr/local/www/services_captiveportal_mac.php:176
+#: usr/local/www/vpn_ipsec_phase1.php:608 usr/local/www/interfaces_gre.php:114
+#: usr/local/www/firewall_nat_out_edit.php:651
+#: usr/local/www/vpn_openvpn_server.php:850
+#: usr/local/www/vpn_openvpn_server.php:1686
+#: usr/local/www/vpn_ipsec_phase2.php:646 usr/local/www/services_dyndns.php:93
+#: usr/local/www/interfaces_gif.php:113
+#: usr/local/www/interfaces_qinq_edit.php:341
+#: usr/local/www/interfaces.php:1349 etc/inc/shaper.inc:1183
+#: etc/inc/shaper.inc:3226 etc/inc/shaper.inc:3669
+#: usr/local/www/status_services.php:80
+#: usr/local/www/system_gateways_edit.php:625
+#: usr/local/www/services_dyndns_edit.php:370
+#: usr/local/www/firewall_rules_edit.php:1116
+#: usr/local/www/firewall_nat_edit.php:782
+#: usr/local/www/firewall_virtual_ip_edit.php:483
+#: usr/local/www/pkg_mgr_installed.php:116 usr/local/www/services_dhcp.php:812
+#: usr/local/www/services_dhcp.php:1174 usr/local/www/pkg_mgr.php:135
+#: usr/local/www/system_routes_edit.php:331
+#: usr/local/www/firewall_nat_out.php:367 usr/local/www/firewall_rules.php:369
+#: usr/local/www/system_gateway_groups_edit.php:336
+#: usr/local/www/firewall_aliases_edit.php:482
+#: usr/local/www/firewall_aliases_edit.php:630
+#: usr/local/www/firewall_aliases_edit.php:665
+#: usr/local/www/services_dnsmasq.php:285
+#: usr/local/www/services_dnsmasq.php:373
+#: usr/local/www/firewall_nat_out_edit.php:663
+#: usr/local/www/services_dyndns.php:89
+#: usr/local/www/system_gateway_groups.php:133
+#: usr/local/www/interfaces.php:1391 etc/inc/shaper.inc:1187
+#: etc/inc/shaper.inc:3233 etc/inc/shaper.inc:3481 etc/inc/shaper.inc:3676
+#: usr/local/www/system_gateways_edit.php:655
+#: usr/local/www/firewall_rules_edit.php:1115
+#: usr/local/www/firewall_virtual_ip.php:228
+#: usr/local/www/interfaces_lagg_edit.php:221
+#: usr/local/www/firewall_nat_edit.php:783 usr/local/www/system_routes.php:149
+#: usr/local/www/firewall_nat.php:211 usr/local/www/system_routes_edit.php:340
+#: usr/local/www/firewall_nat_out.php:366
+#: usr/local/www/interfaces_bridge_edit.php:286
+#: usr/local/www/services_dnsmasq.php:349
+#: usr/local/www/services_dnsmasq.php:437 usr/local/www/interfaces.php:1386
+#: etc/inc/shaper.inc:1235 etc/inc/shaper.inc:3301 etc/inc/shaper.inc:3549
+#: etc/inc/shaper.inc:3744 usr/local/www/services_rfc2136.php:81
+#: usr/local/www/status_services.php:80
+#: usr/local/www/system_gateways_edit.php:656
+#: usr/local/www/services_captiveportal_ip_edit.php:200
+#: usr/local/www/vpn_pppoe.php:106
+#: usr/local/www/interfaces_wireless_edit.php:187
+#: usr/local/www/load_balancer_relay_protocol_edit.php:79
+#: usr/local/www/load_balancer_relay_protocol_edit.php:216
+#: usr/local/www/system_groupmanager.php:275
+#: usr/local/www/system_groupmanager.php:347
+#: usr/local/www/system_groupmanager.php:406
+#: usr/local/www/services_captiveportal_zones_edit.php:105
+#: usr/local/www/interfaces_gre_edit.php:219
+#: usr/local/www/vpn_openvpn_client.php:615
+#: usr/local/www/vpn_openvpn_client.php:940
+#: usr/local/www/firewall_schedule.php:98
+#: usr/local/www/system_usermanager_addprivs.php:197
+#: usr/local/www/services_dhcpv6_edit.php:233
+#: usr/local/www/services_dyndns_edit.php:370
+#: usr/local/www/services_wol.php:163
+#: usr/local/www/firewall_rules_edit.php:1115
+#: usr/local/www/load_balancer_virtual_server_edit.php:161
+#: usr/local/www/services_captiveportal_ip.php:116
+#: usr/local/www/interfaces_qinq.php:123
+#: usr/local/www/interfaces_vlan_edit.php:183
+#: usr/local/www/interfaces_ppps_edit.php:474
+#: usr/local/www/firewall_virtual_ip.php:228
+#: usr/local/www/vpn_openvpn_csc.php:341 usr/local/www/vpn_openvpn_csc.php:673
+#: usr/local/www/interfaces_lagg_edit.php:221
+#: usr/local/www/firewall_schedule_edit.php:792
+#: usr/local/www/firewall_schedule_edit.php:997
+#: usr/local/www/firewall_nat_edit.php:783
+#: usr/local/www/interfaces_lagg.php:119 usr/local/www/interfaces_vlan.php:117
+#: usr/local/www/services_captiveportal_hostname_edit.php:183
+#: usr/local/www/interfaces_gif_edit.php:220
+#: usr/local/www/firewall_aliases.php:190
+#: usr/local/www/services_dhcp_edit.php:381
+#: usr/local/www/services_wol_edit.php:148
+#: usr/local/www/firewall_virtual_ip_edit.php:483
+#: usr/local/www/load_balancer_relay_protocol.php:135
+#: usr/local/www/diag_ipsec.php:109 usr/local/www/pkg_mgr_installed.php:116
+#: usr/local/www/interfaces_bridge.php:116
+#: usr/local/www/firewall_aliases_import.php:140
+#: usr/local/www/interfaces_wireless.php:111
+#: usr/local/www/system_routes.php:149
+#: usr/local/www/load_balancer_relay_action.php:141
+#: usr/local/www/vpn_pppoe_edit.php:448 usr/local/www/services_dhcp.php:812
+#: usr/local/www/services_dhcp.php:1174 usr/local/www/firewall_nat.php:211
+#: usr/local/www/status_lb_pool.php:134 usr/local/www/interfaces_groups.php:97
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:414
+#: usr/local/www/pkg_mgr.php:183 usr/local/www/system_routes_edit.php:334
+#: usr/local/www/services_captiveportal_mac_edit.php:193
+#: usr/local/www/load_balancer_pool.php:135
+#: usr/local/www/services_captiveportal_hostname.php:121
+#: usr/local/www/services_dhcpv6.php:853
+#: usr/local/www/firewall_nat_out.php:366
+#: usr/local/www/interfaces_ppps.php:111 usr/local/www/firewall_rules.php:369
+#: usr/local/www/firewall_nat_npt.php:107
+#: usr/local/www/firewall_nat_1to1.php:108
+#: usr/local/www/firewall_nat_npt_edit.php:265
+#: usr/local/www/interfaces_groups_edit.php:260
+#: usr/local/www/load_balancer_monitor_edit.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:239
+#: usr/local/www/system_gateway_groups_edit.php:336
+#: usr/local/www/services_captiveportal_zones.php:56
+#: usr/local/www/system_groupmanager_addprivs.php:216
+#: usr/local/www/firewall_aliases_edit.php:468
+#: usr/local/www/firewall_aliases_edit.php:616
+#: usr/local/www/firewall_aliases_edit.php:651
+#: usr/local/www/interfaces_bridge_edit.php:286
+#: usr/local/www/services_igmpproxy_edit.php:177
+#: usr/local/www/services_igmpproxy.php:98
+#: usr/local/www/firewall_nat_1to1_edit.php:447
+#: usr/local/www/status_gateway_groups.php:77
+#: usr/local/www/services_dnsmasq_edit.php:219
+#: usr/local/www/services_dnsmasq_edit.php:240
+#: usr/local/www/load_balancer_monitor.php:123
+#: usr/local/www/services_rfc2136_edit.php:192
+#: usr/local/www/services_dnsmasq.php:349
+#: usr/local/www/services_dnsmasq.php:437
+#: usr/local/www/services_captiveportal_mac.php:176
+#: usr/local/www/vpn_ipsec_phase1.php:608 usr/local/www/interfaces_gre.php:114
+#: usr/local/www/system_usermanager.php:576
+#: usr/local/www/system_gateways.php:156
+#: usr/local/www/load_balancer_virtual_server.php:133
+#: usr/local/www/load_balancer_pool_edit.php:202
+#: usr/local/www/status_lb_vs.php:81
+#: usr/local/www/firewall_nat_out_edit.php:663
+#: usr/local/www/vpn_openvpn_server.php:850
+#: usr/local/www/vpn_openvpn_server.php:1686
+#: usr/local/www/vpn_ipsec_phase2.php:646 usr/local/www/status_gateways.php:79
+#: usr/local/www/services_dyndns.php:89
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:151
+#: usr/local/www/interfaces_gif.php:113
+#: usr/local/www/interfaces_qinq_edit.php:341
+#: usr/local/www/system_gateway_groups.php:133
+#: usr/local/www/status_upnp.php:89
+#: usr/local/www/system_advanced_sysctl.php:172
+#: usr/local/www/system_advanced_sysctl.php:243
+#: usr/local/www/interfaces.php:1386 etc/inc/shaper.inc:1235
+#: etc/inc/shaper.inc:3378 etc/inc/shaper.inc:3651 etc/inc/shaper.inc:3849
+msgid "Description"
+msgstr "デスクリプション"
+
+#: etc/inc/shaper.inc:1207 etc/inc/shaper.inc:1209 etc/inc/shaper.inc:1210
+#: etc/inc/shaper.inc:1214 etc/inc/shaper.inc:1262 etc/inc/shaper.inc:1262
+msgid "Bandwidth:"
+msgstr "帯域幅:"
+
+#: etc/inc/shaper.inc:1212 etc/inc/shaper.inc:1214 etc/inc/shaper.inc:1215
+#: etc/inc/shaper.inc:1218 etc/inc/shaper.inc:1266 etc/inc/shaper.inc:1266
+msgid "Priority: on"
+msgstr "優先:オン"
+
+#: etc/inc/shaper.inc:1215 etc/inc/shaper.inc:1217 etc/inc/shaper.inc:1218
+#: etc/inc/shaper.inc:1221 etc/inc/shaper.inc:1269 etc/inc/shaper.inc:1269
+msgid "Default: on"
+msgstr "デフォルト:オン"
+
+#: etc/inc/shaper.inc:1222 etc/inc/shaper.inc:1223 etc/inc/shaper.inc:1224
+#: etc/inc/shaper.inc:1225 etc/inc/shaper.inc:1226 etc/inc/shaper.inc:1228
+#: etc/inc/shaper.inc:1229 etc/inc/shaper.inc:1276 etc/inc/shaper.inc:1277
+#: etc/inc/shaper.inc:1276 etc/inc/shaper.inc:1277
+msgid "Delete queue from interface"
+msgstr "インターフェイスからキューを削除"
+
+#: etc/inc/shaper.inc:1559 etc/inc/shaper.inc:2207 etc/inc/shaper.inc:2483
+#: etc/inc/shaper.inc:1561 etc/inc/shaper.inc:2209 etc/inc/shaper.inc:2485
+#: etc/inc/shaper.inc:1562 etc/inc/shaper.inc:2210 etc/inc/shaper.inc:2486
+#: etc/inc/shaper.inc:1565 etc/inc/shaper.inc:2215 etc/inc/shaper.inc:2491
+#: etc/inc/shaper.inc:1616 etc/inc/shaper.inc:2273 etc/inc/shaper.inc:2554
+#: etc/inc/shaper.inc:1616 etc/inc/shaper.inc:2273 etc/inc/shaper.inc:2554
+msgid "Bandwidth in percentage should be between 1 and 100 bounds."
+msgstr "割合の帯域幅は1と100の境界の間でなければなりません。"
+
+#: etc/inc/shaper.inc:1576 etc/inc/shaper.inc:1578 etc/inc/shaper.inc:1579
+#: etc/inc/shaper.inc:1582 etc/inc/shaper.inc:1633 etc/inc/shaper.inc:1633
+msgid "upperlimit service curve defined but missing (d) value"
+msgstr "UPPERLIMITサービスカーブが定義されていますが、不足している(d)の値"
+
+#: etc/inc/shaper.inc:1578 etc/inc/shaper.inc:1580 etc/inc/shaper.inc:1581
+#: etc/inc/shaper.inc:1584 etc/inc/shaper.inc:1635 etc/inc/shaper.inc:1635
+msgid ""
+"upperlimit service curve defined but missing initial bandwidth (m1) value"
+msgstr "UPPERLIMITサービス曲線が不足している初期の帯域幅(m1)の値を定義されていますが、"
+
+#: etc/inc/shaper.inc:1580 etc/inc/shaper.inc:1582 etc/inc/shaper.inc:1583
+#: etc/inc/shaper.inc:1586 etc/inc/shaper.inc:1637 etc/inc/shaper.inc:1637
+msgid "upperlimit m1 value needs to be Kb, Mb, Gb, or %"
+msgstr "upperlimit m1の値はKB、MB、GB、または%である必要がある"
+
+#: etc/inc/shaper.inc:1582 etc/inc/shaper.inc:1584 etc/inc/shaper.inc:1585
+#: etc/inc/shaper.inc:1588 etc/inc/shaper.inc:1639 etc/inc/shaper.inc:1639
+msgid "upperlimit d value needs to be numeric"
+msgstr "upperlimit d値は数値でなければなりません"
+
+#: etc/inc/shaper.inc:1584 etc/inc/shaper.inc:1586 etc/inc/shaper.inc:1587
+#: etc/inc/shaper.inc:1590 etc/inc/shaper.inc:1641 etc/inc/shaper.inc:1641
+msgid "upperlimit m2 value needs to be Kb, Mb, Gb, or %"
+msgstr "upperlimit m2 値はKB、MB、GB、または%である必要がある"
+
+#: etc/inc/shaper.inc:1598 etc/inc/shaper.inc:1600 etc/inc/shaper.inc:1601
+#: etc/inc/shaper.inc:1604 etc/inc/shaper.inc:1655 etc/inc/shaper.inc:1655
+msgid "linkshare service curve defined but missing (d) value"
+msgstr "リンクシェア·サービス曲線定義されているが、不足している(d)の値"
+
+#: etc/inc/shaper.inc:1600 etc/inc/shaper.inc:1602 etc/inc/shaper.inc:1603
+#: etc/inc/shaper.inc:1606 etc/inc/shaper.inc:1657 etc/inc/shaper.inc:1657
+msgid ""
+"linkshare service curve defined but missing initial bandwidth (m1) value"
+msgstr ""リンクシェア·サービス曲線定義されているが、不足している初期の帯域幅(m1)の値"
+
+#: etc/inc/shaper.inc:1602 etc/inc/shaper.inc:1604 etc/inc/shaper.inc:1605
+#: etc/inc/shaper.inc:1608 etc/inc/shaper.inc:1659 etc/inc/shaper.inc:1659
+msgid "linkshare m1 value needs to be Kb, Mb, Gb, or %"
+msgstr "リンクシェアのm1の値はKB、MB、GB、または%である必要がある"
+
+#: etc/inc/shaper.inc:1604 etc/inc/shaper.inc:1606 etc/inc/shaper.inc:1607
+#: etc/inc/shaper.inc:1610 etc/inc/shaper.inc:1661 etc/inc/shaper.inc:1661
+msgid "linkshare d value needs to be numeric"
+msgstr "リンクシェアのd値は数値でなければなりません"
+
+#: etc/inc/shaper.inc:1606 etc/inc/shaper.inc:1608 etc/inc/shaper.inc:1609
+#: etc/inc/shaper.inc:1612 etc/inc/shaper.inc:1663 etc/inc/shaper.inc:1663
+msgid "linkshare m2 value needs to be Kb, Mb, Gb, or %"
+msgstr "リンクシェアのm2の値はKB、MB、GB、または%である必要がある"
+
+#: etc/inc/shaper.inc:1608 etc/inc/shaper.inc:1610 etc/inc/shaper.inc:1611
+#: etc/inc/shaper.inc:1614 etc/inc/shaper.inc:1665 etc/inc/shaper.inc:1665
+msgid "realtime service curve defined but missing (d) value"
+msgstr "リアルタイムサービス曲線定義されているが、不足している(d)の値"
+
+#: etc/inc/shaper.inc:1610 etc/inc/shaper.inc:1612 etc/inc/shaper.inc:1613
+#: etc/inc/shaper.inc:1616 etc/inc/shaper.inc:1667 etc/inc/shaper.inc:1667
+msgid "realtime service curve defined but missing initial bandwidth (m1) value"
+msgstr "リアルタイムサービス曲線定義されているが、不足している初期の帯域幅(m1)の値"
+
+#: etc/inc/shaper.inc:1625 etc/inc/shaper.inc:1627 etc/inc/shaper.inc:1628
+#: etc/inc/shaper.inc:1631 etc/inc/shaper.inc:1682 etc/inc/shaper.inc:1682
+msgid "realtime m1 value needs to be Kb, Mb, Gb, or %"
+msgstr "リアルタイムm1の値はKB、MB、GB、または%である必要がある"
+
+#: etc/inc/shaper.inc:1627 etc/inc/shaper.inc:1629 etc/inc/shaper.inc:1630
+#: etc/inc/shaper.inc:1633 etc/inc/shaper.inc:1684 etc/inc/shaper.inc:1684
+msgid "realtime d value needs to be numeric"
+msgstr "リアルタイムD値は数値でなければなりません"
+
+#: etc/inc/shaper.inc:1629 etc/inc/shaper.inc:1631 etc/inc/shaper.inc:1632
+#: etc/inc/shaper.inc:1635 etc/inc/shaper.inc:1686 etc/inc/shaper.inc:1686
+msgid "realtime m2 value needs to be Kb, Mb, Gb, or %"
+msgstr "リアルタイムのm2値はKB、MB、GB、または%である必要がある"
+
+#: etc/inc/shaper.inc:1858 etc/inc/shaper.inc:2336 etc/inc/shaper.inc:2602
+#: etc/inc/shaper.inc:3039 etc/inc/shaper.inc:1860 etc/inc/shaper.inc:2338
+#: etc/inc/shaper.inc:2604 etc/inc/shaper.inc:3047 etc/inc/shaper.inc:1861
+#: etc/inc/shaper.inc:2339 etc/inc/shaper.inc:2605 etc/inc/shaper.inc:1866
+#: etc/inc/shaper.inc:2344 etc/inc/shaper.inc:2610 etc/inc/shaper.inc:1924
+#: etc/inc/shaper.inc:2407 etc/inc/shaper.inc:2678 etc/inc/shaper.inc:1924
+#: etc/inc/shaper.inc:2407 etc/inc/shaper.inc:2678
+msgid "Gbit/s"
+msgstr "Gビット/秒"
+
+#: etc/inc/shaper.inc:1862 etc/inc/shaper.inc:2340 etc/inc/shaper.inc:2606
+#: etc/inc/shaper.inc:3035 etc/inc/shaper.inc:1864 etc/inc/shaper.inc:2342
+#: etc/inc/shaper.inc:2608 etc/inc/shaper.inc:3043 etc/inc/shaper.inc:1865
+#: etc/inc/shaper.inc:2343 etc/inc/shaper.inc:2609 etc/inc/shaper.inc:1870
+#: etc/inc/shaper.inc:2348 etc/inc/shaper.inc:2614 etc/inc/shaper.inc:1928
+#: etc/inc/shaper.inc:2411 etc/inc/shaper.inc:2682 etc/inc/shaper.inc:1928
+#: etc/inc/shaper.inc:2411 etc/inc/shaper.inc:2682
+msgid "Mbit/s"
+msgstr "Mビット/秒"
+
+#: etc/inc/shaper.inc:1866 etc/inc/shaper.inc:2344 etc/inc/shaper.inc:2610
+#: etc/inc/shaper.inc:3031 usr/local/www/services_captiveportal.php:560
+#: usr/local/www/services_captiveportal.php:564 etc/inc/shaper.inc:1868
+#: etc/inc/shaper.inc:2346 etc/inc/shaper.inc:2612 etc/inc/shaper.inc:3039
+#: usr/local/www/services_captiveportal.php:565
+#: usr/local/www/services_captiveportal.php:569
+#: usr/local/www/services_captiveportal.php:563
+#: usr/local/www/services_captiveportal.php:567 etc/inc/shaper.inc:1869
+#: etc/inc/shaper.inc:2347 etc/inc/shaper.inc:2613
+#: usr/local/www/services_captiveportal.php:581
+#: usr/local/www/services_captiveportal.php:585 etc/inc/shaper.inc:1874
+#: etc/inc/shaper.inc:2352 etc/inc/shaper.inc:2618 etc/inc/shaper.inc:1932
+#: etc/inc/shaper.inc:2415 etc/inc/shaper.inc:2686
+#: usr/local/www/services_captiveportal.php:581
+#: usr/local/www/services_captiveportal.php:585 etc/inc/shaper.inc:1932
+#: etc/inc/shaper.inc:2415 etc/inc/shaper.inc:2686
+msgid "Kbit/s"
+msgstr "Kビット/秒"
+
+#: etc/inc/shaper.inc:1870 etc/inc/shaper.inc:2348 etc/inc/shaper.inc:2614
+#: etc/inc/shaper.inc:3043 etc/inc/shaper.inc:1872 etc/inc/shaper.inc:2350
+#: etc/inc/shaper.inc:2616 etc/inc/shaper.inc:3051 etc/inc/shaper.inc:1873
+#: etc/inc/shaper.inc:2351 etc/inc/shaper.inc:2617 etc/inc/shaper.inc:1878
+#: etc/inc/shaper.inc:2356 etc/inc/shaper.inc:2622 etc/inc/shaper.inc:1936
+#: etc/inc/shaper.inc:2419 etc/inc/shaper.inc:2690 etc/inc/shaper.inc:1936
+#: etc/inc/shaper.inc:2419 etc/inc/shaper.inc:2690
+msgid "Bit/s"
+msgstr "ビット/秒"
+
+#: etc/inc/shaper.inc:1876 etc/inc/shaper.inc:2354 etc/inc/shaper.inc:2620
+#: etc/inc/shaper.inc:1878 etc/inc/shaper.inc:2356 etc/inc/shaper.inc:2622
+#: etc/inc/shaper.inc:1879 etc/inc/shaper.inc:2357 etc/inc/shaper.inc:2623
+#: etc/inc/shaper.inc:1884 etc/inc/shaper.inc:2362 etc/inc/shaper.inc:2628
+#: etc/inc/shaper.inc:1942 etc/inc/shaper.inc:2425 etc/inc/shaper.inc:2696
+#: etc/inc/shaper.inc:1942 etc/inc/shaper.inc:2425 etc/inc/shaper.inc:2696
+msgid "Choose the amount of bandwidth for this queue"
+msgstr "このキューの帯域幅の量を選択してください"
+
+#: etc/inc/shaper.inc:1879 etc/inc/shaper.inc:1881 etc/inc/shaper.inc:1882
+#: etc/inc/shaper.inc:1887 etc/inc/shaper.inc:1945 etc/inc/shaper.inc:1945
+msgid "Service Curve (sc)"
+msgstr "サービス曲線(SC)"
+
+#: etc/inc/shaper.inc:1886 etc/inc/shaper.inc:1888 etc/inc/shaper.inc:1889
+#: etc/inc/shaper.inc:1894 etc/inc/shaper.inc:1952 etc/inc/shaper.inc:1952
+msgid "Upperlimit:"
+msgstr "上限:"
+
+#: etc/inc/shaper.inc:1901 etc/inc/shaper.inc:1903 etc/inc/shaper.inc:1904
+#: etc/inc/shaper.inc:1909 etc/inc/shaper.inc:1967 etc/inc/shaper.inc:1967
+msgid "The maximum allowed bandwidth for the queue."
+msgstr "最大値は、キューの帯域幅を可能にした。"
+
+#: etc/inc/shaper.inc:1905 etc/inc/shaper.inc:1907 etc/inc/shaper.inc:1908
+#: etc/inc/shaper.inc:1913 etc/inc/shaper.inc:1971 etc/inc/shaper.inc:1971
+msgid "Real time:"
+msgstr "リアルタイム:"
+
+#: etc/inc/shaper.inc:1920 etc/inc/shaper.inc:1922 etc/inc/shaper.inc:1923
+#: etc/inc/shaper.inc:1928 etc/inc/shaper.inc:1986 etc/inc/shaper.inc:1986
+msgid "The minimum required bandwidth for the queue."
+msgstr "最小値は、キューの帯域を必要とした。"
+
+#: etc/inc/shaper.inc:1924 etc/inc/shaper.inc:1926 etc/inc/shaper.inc:1927
+#: etc/inc/shaper.inc:1932 etc/inc/shaper.inc:1990 etc/inc/shaper.inc:1990
+msgid "Link share:"
+msgstr "共有リンク:"
+
+#: etc/inc/shaper.inc:1939 etc/inc/shaper.inc:1941 etc/inc/shaper.inc:1942
+#: etc/inc/shaper.inc:1947 etc/inc/shaper.inc:2005 etc/inc/shaper.inc:2005
+msgid "The bandwidth share of a backlogged queue - this overrides priority."
+msgstr "バックログキューの帯域幅の共有 - これは、優先度を上書きする。"
+
+#: etc/inc/shaper.inc:1941 etc/inc/shaper.inc:1943 etc/inc/shaper.inc:1944
+#: etc/inc/shaper.inc:1949 etc/inc/shaper.inc:2007 etc/inc/shaper.inc:2007
+msgid ""
+"The format for service curve specifications is (m1, d, m2). m2 controls the "
+"bandwidth assigned to the queue. m1 and d are optional and can be used to "
+"control the initial bandwidth assignment. For the first d milliseconds the "
+"queue gets the bandwidth given as m1, afterwards the value given in m2."
+msgstr ""サービスカーブ仕様の形式は、(m1、d、m2)。 m2はキューに割り当てられた帯域幅を制御します。"m1およびdは任意であり、最初の帯域幅の割り当てを制御するために使用することができる。"最初のdミリ秒待ち、その後m1、m2で与えられた値として与えられた帯域幅を取得します。"
+
+#: etc/inc/shaper.inc:2190 etc/inc/shaper.inc:2192 etc/inc/shaper.inc:2193
+#: etc/inc/shaper.inc:2198 etc/inc/shaper.inc:2256 etc/inc/shaper.inc:2256
+msgid "Priority must be an integer between 1 and 7."
+msgstr "優先順位は1から7までの整数でなければなりません。"
+
+#: etc/inc/shaper.inc:2356 etc/inc/shaper.inc:2622 etc/inc/shaper.inc:2358
+#: etc/inc/shaper.inc:2624 etc/inc/shaper.inc:2359 etc/inc/shaper.inc:2625
+#: etc/inc/shaper.inc:2364 etc/inc/shaper.inc:2630 etc/inc/shaper.inc:2427
+#: etc/inc/shaper.inc:2698 etc/inc/shaper.inc:2427 etc/inc/shaper.inc:2698
+msgid "Scheduler specific options"
+msgstr "スケジューラ固有のオプション"
+
+#: etc/inc/shaper.inc:2360 etc/inc/shaper.inc:2362 etc/inc/shaper.inc:2363
+#: etc/inc/shaper.inc:2368 etc/inc/shaper.inc:2431 etc/inc/shaper.inc:2431
+msgid "Borrow from other queues when available"
+msgstr "他のキューから借りる際に利用できる"
+
+#: etc/inc/shaper.inc:2465 etc/inc/shaper.inc:2467 etc/inc/shaper.inc:2468
+#: etc/inc/shaper.inc:2473 etc/inc/shaper.inc:2536 etc/inc/shaper.inc:2536
+msgid "Priority must be an integer between 1 and 255."
+msgstr "優先順位は1から255までの整数でなければなりません。"
+
+#: etc/inc/shaper.inc:2628 etc/inc/shaper.inc:2630 etc/inc/shaper.inc:2631
+#: etc/inc/shaper.inc:2636 etc/inc/shaper.inc:2704 etc/inc/shaper.inc:2704
+msgid "Number of buckets available."
+msgstr "利用可能なバケット数。"
+
+#: etc/inc/shaper.inc:2633 etc/inc/shaper.inc:2635 etc/inc/shaper.inc:2636
+#: etc/inc/shaper.inc:2641 etc/inc/shaper.inc:2709 etc/inc/shaper.inc:2709
+msgid "Bandwidth limit for hosts to not saturate link."
+msgstr "ホストがリンクを飽和しないようにするための帯域幅制限。"
+
+#: etc/inc/shaper.inc:2797 etc/inc/shaper.inc:2799 etc/inc/shaper.inc:2800
+#: etc/inc/shaper.inc:2805 etc/inc/shaper.inc:2873 etc/inc/shaper.inc:2892
+msgid "Plr must be an integer between 1 and 100."
+msgstr "Plr 1〜100の整数でなければなりません"
+
+#: etc/inc/shaper.inc:2800 etc/inc/shaper.inc:2802 etc/inc/shaper.inc:2803
+#: etc/inc/shaper.inc:2808 etc/inc/shaper.inc:2876 etc/inc/shaper.inc:2895
+msgid "Buckets must be an integer between 16 and 65535."
+msgstr "バケットは、16〜65535の間の整数でなければなりません"
+
+#: etc/inc/shaper.inc:2902 etc/inc/shaper.inc:2906 etc/inc/shaper.inc:2921
+#: etc/inc/shaper.inc:2922 etc/inc/shaper.inc:2927 etc/inc/shaper.inc:2995
+#: etc/inc/shaper.inc:3053
+msgid "Delay must be an integer."
+msgstr "遅延は整数でなければなりません。"
+
+#: etc/inc/shaper.inc:3009 usr/local/www/services_snmp.php:276
+#: usr/local/www/services_snmp.php:336 usr/local/www/interfaces.php:1234
+#: usr/local/www/system_firmware.php:131
+#: usr/local/www/services_dnsmasq.php:154 usr/local/www/diag_routes.php:60
+#: usr/local/www/services_rfc2136_edit.php:128
+#: usr/local/www/vpn_ipsec_phase1.php:813 etc/inc/shaper.inc:3013
+#: usr/local/www/services_unbound.php:150 usr/local/www/interfaces.php:1338
+#: usr/local/www/services_snmp.php:274 usr/local/www/services_snmp.php:334
+#: usr/local/www/vpn_ipsec_phase1.php:826 etc/inc/shaper.inc:3143
+#: usr/local/www/services_dnsmasq.php:155 usr/local/www/diag_routes.php:61
+#: usr/local/www/system_firmware.php:138 usr/local/www/interfaces.php:1326
+#: usr/local/www/services_snmp.php:275 usr/local/www/services_snmp.php:335
+#: usr/local/www/vpn_ipsec_phase1.php:823
+#: usr/local/www/system_firmware.php:133
+#: usr/local/www/services_dnsmasq.php:159
+#: usr/local/www/vpn_ipsec_phase1.php:844 usr/local/www/services_snmp.php:285
+#: usr/local/www/services_snmp.php:345 usr/local/www/interfaces.php:1339
+#: etc/inc/shaper.inc:3144 usr/local/www/services_dnsmasq.php:161
+#: usr/local/www/interfaces.php:1381 etc/inc/shaper.inc:3151
+#: usr/local/www/services_dnsmasq.php:182 usr/local/www/interfaces.php:1376
+#: etc/inc/shaper.inc:3219 usr/local/www/system_firmware.php:133
+#: usr/local/www/diag_routes.php:61
+#: usr/local/www/services_rfc2136_edit.php:128
+#: usr/local/www/services_dnsmasq.php:182
+#: usr/local/www/vpn_ipsec_phase1.php:844 usr/local/www/services_snmp.php:285
+#: usr/local/www/services_snmp.php:345 usr/local/www/interfaces.php:1376
+#: etc/inc/shaper.inc:3275
+msgid "Enable"
+msgstr "有効にする"
+
+#: etc/inc/shaper.inc:3014 etc/inc/shaper.inc:3018 etc/inc/shaper.inc:3148
+#: etc/inc/shaper.inc:3149 etc/inc/shaper.inc:3156 etc/inc/shaper.inc:3224
+#: etc/inc/shaper.inc:3280
+msgid "Enable limiter and its children"
+msgstr "リミッターとその子を有効にする"
+
+#: etc/inc/shaper.inc:3046 etc/inc/shaper.inc:3283 etc/inc/shaper.inc:3054
+#: etc/inc/shaper.inc:3295 etc/inc/shaper.inc:3202 etc/inc/shaper.inc:3450
+#: etc/inc/shaper.inc:3203 etc/inc/shaper.inc:3451 etc/inc/shaper.inc:3210
+#: etc/inc/shaper.inc:3458 etc/inc/shaper.inc:3278 etc/inc/shaper.inc:3526
+#: etc/inc/shaper.inc:3334 etc/inc/shaper.inc:3607
+msgid "Mask"
+msgstr "マスク"
+
+#: etc/inc/shaper.inc:3056 etc/inc/shaper.inc:3293 etc/inc/shaper.inc:3064
+#: etc/inc/shaper.inc:3305 etc/inc/shaper.inc:3212 etc/inc/shaper.inc:3460
+#: etc/inc/shaper.inc:3213 etc/inc/shaper.inc:3461 etc/inc/shaper.inc:3220
+#: etc/inc/shaper.inc:3468 etc/inc/shaper.inc:3288 etc/inc/shaper.inc:3536
+#: etc/inc/shaper.inc:3345 etc/inc/shaper.inc:3618
+msgid "Source addresses"
+msgstr "送信元アドレス"
+
+#: etc/inc/shaper.inc:3060 etc/inc/shaper.inc:3297 etc/inc/shaper.inc:3068
+#: etc/inc/shaper.inc:3309 etc/inc/shaper.inc:3216 etc/inc/shaper.inc:3464
+#: etc/inc/shaper.inc:3217 etc/inc/shaper.inc:3465 etc/inc/shaper.inc:3224
+#: etc/inc/shaper.inc:3472 etc/inc/shaper.inc:3292 etc/inc/shaper.inc:3540
+#: etc/inc/shaper.inc:3349 etc/inc/shaper.inc:3622
+msgid "Destination addresses"
+msgstr "宛先アドレス"
+
+#: etc/inc/shaper.inc:3063 etc/inc/shaper.inc:3300 etc/inc/shaper.inc:3071
+#: etc/inc/shaper.inc:3312 etc/inc/shaper.inc:3219 etc/inc/shaper.inc:3467
+#: etc/inc/shaper.inc:3220 etc/inc/shaper.inc:3468 etc/inc/shaper.inc:3227
+#: etc/inc/shaper.inc:3475 etc/inc/shaper.inc:3295 etc/inc/shaper.inc:3543
+msgid ""
+"If 'source' or 'destination' is chosen, \n"
+"a dynamic pipe with the bandwidth, delay, packet loss and queue size given "
+"above will \n"
+"be created for each source/destination IP address encountered, \n"
+"respectively. This makes it possible to easily specify bandwidth \n"
+"limits per host."
+msgstr ""「ソース」または「送信先」が選択された場合、前記所定の帯域幅、遅延、パケット損失、"キューサイズの動的パイプはそれぞれ、遭遇した各送信元/宛先IPアドレスが作成されます。"これにより、簡単にホストごとに帯域幅制限を指定することができます。"
+
+#: etc/inc/shaper.inc:3075 etc/inc/shaper.inc:3312 etc/inc/shaper.inc:3507
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:124
+#: usr/local/www/firewall_virtual_ip_edit.php:541
+#: usr/local/www/services_wol_edit.php:151
+#: usr/local/www/interfaces_gif_edit.php:211
+#: usr/local/www/interfaces_gre_edit.php:222
+#: usr/local/www/interfaces_groups_edit.php:264
+#: usr/local/www/firewall_aliases_edit.php:596
+#: usr/local/www/firewall_nat_1to1_edit.php:443
+#: usr/local/www/firewall_nat_edit.php:772
+#: usr/local/www/firewall_nat_out_edit.php:639
+#: usr/local/www/firewall_schedule_edit.php:796
+#: usr/local/www/firewall_schedule_edit.php:970
+#: usr/local/www/interfaces_vlan_edit.php:182
+#: usr/local/www/system_routes_edit.php:270
+#: usr/local/www/interfaces_qinq_edit.php:342
+#: usr/local/www/interfaces_wireless_edit.php:188
+#: usr/local/www/services_dhcp_edit.php:245
+#: usr/local/www/services_dnsmasq_edit.php:166
+#: usr/local/www/services_igmpproxy_edit.php:180
+#: usr/local/www/system_gateway_groups_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:264
+#: usr/local/www/services_dhcpv6_edit.php:222 etc/inc/shaper.inc:3083
+#: etc/inc/shaper.inc:3324 etc/inc/shaper.inc:3519
+#: usr/local/www/system_routes_edit.php:310
+#: usr/local/www/system_gateway_groups_edit.php:278
+#: usr/local/www/services_dnsmasq_edit.php:221
+#: usr/local/www/firewall_nat_1to1_edit.php:450
+#: usr/local/www/services_dhcpv6_edit.php:231
+#: usr/local/www/firewall_nat_npt_edit.php:269
+#: usr/local/www/firewall_nat_out_edit.php:652
+#: usr/local/www/services_igmpproxy_edit.php:182
+#: usr/local/www/firewall_aliases_edit.php:601
+#: usr/local/www/firewall_nat_edit.php:779
+#: usr/local/www/services_dhcp_edit.php:254
+#: usr/local/www/firewall_virtual_ip_edit.php:529
+#: usr/local/www/interfaces_gre_edit.php:221 etc/inc/shaper.inc:3231
+#: etc/inc/shaper.inc:3479 etc/inc/shaper.inc:3674
+#: usr/local/www/system_routes_edit.php:311
+#: usr/local/www/system_gateway_groups_edit.php:338
+#: usr/local/www/interfaces_vlan_edit.php:183
+#: usr/local/www/services_dnsmasq_edit.php:222
+#: usr/local/www/firewall_nat_1to1_edit.php:448
+#: usr/local/www/services_dhcpv6_edit.php:233
+#: usr/local/www/firewall_nat_npt_edit.php:268
+#: usr/local/www/interfaces_qinq_edit.php:343
+#: usr/local/www/interfaces_gif_edit.php:212
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:154
+#: usr/local/www/firewall_schedule_edit.php:795
+#: usr/local/www/firewall_schedule_edit.php:969
+#: usr/local/www/firewall_aliases_edit.php:604
+#: usr/local/www/interfaces_groups_edit.php:265
+#: usr/local/www/firewall_nat_edit.php:778
+#: usr/local/www/services_dhcp_edit.php:256
+#: usr/local/www/firewall_virtual_ip_edit.php:474
+#: usr/local/www/interfaces_wireless_edit.php:190
+#: usr/local/www/services_dhcpv6_edit.php:236
+#: usr/local/www/interfaces_vlan_edit.php:186
+#: usr/local/www/firewall_nat_edit.php:773
+#: usr/local/www/interfaces_gif_edit.php:223
+#: usr/local/www/services_dhcp_edit.php:384
+#: usr/local/www/firewall_virtual_ip_edit.php:466
+#: usr/local/www/firewall_nat_out_edit.php:654
+#: usr/local/www/interfaces_qinq_edit.php:346 etc/inc/shaper.inc:3232
+#: etc/inc/shaper.inc:3480 etc/inc/shaper.inc:3675
+#: usr/local/www/firewall_nat_edit.php:785
+#: usr/local/www/firewall_virtual_ip_edit.php:486
+#: usr/local/www/system_routes_edit.php:334
+#: usr/local/www/system_gateway_groups_edit.php:339
+#: usr/local/www/firewall_aliases_edit.php:635
+#: usr/local/www/firewall_nat_out_edit.php:666 etc/inc/shaper.inc:3239
+#: etc/inc/shaper.inc:3487 etc/inc/shaper.inc:3682
+#: usr/local/www/firewall_nat_edit.php:786
+#: usr/local/www/system_routes_edit.php:343 etc/inc/shaper.inc:3307
+#: etc/inc/shaper.inc:3555 etc/inc/shaper.inc:3750
+#: usr/local/www/interfaces_wireless_edit.php:190
+#: usr/local/www/interfaces_gre_edit.php:222
+#: usr/local/www/services_dhcpv6_edit.php:236
+#: usr/local/www/interfaces_vlan_edit.php:186
+#: usr/local/www/firewall_schedule_edit.php:795
+#: usr/local/www/firewall_schedule_edit.php:969
+#: usr/local/www/firewall_nat_edit.php:786
+#: usr/local/www/interfaces_gif_edit.php:223
+#: usr/local/www/services_dhcp_edit.php:384
+#: usr/local/www/services_wol_edit.php:151
+#: usr/local/www/firewall_virtual_ip_edit.php:486
+#: usr/local/www/system_routes_edit.php:337
+#: usr/local/www/firewall_nat_npt_edit.php:268
+#: usr/local/www/interfaces_groups_edit.php:265
+#: usr/local/www/system_gateway_groups_edit.php:339
+#: usr/local/www/firewall_aliases_edit.php:621
+#: usr/local/www/services_igmpproxy_edit.php:182
+#: usr/local/www/firewall_nat_1to1_edit.php:450
+#: usr/local/www/services_dnsmasq_edit.php:222
+#: usr/local/www/firewall_nat_out_edit.php:666
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:154
+#: usr/local/www/interfaces_qinq_edit.php:346 etc/inc/shaper.inc:3384
+#: etc/inc/shaper.inc:3657 etc/inc/shaper.inc:3855
+msgid "You may enter a description here for your reference (not parsed)."
+msgstr "ここに参照用の説明文を入力することもできます(構文解析されません)。"
+
+#: etc/inc/shaper.inc:3081 etc/inc/shaper.inc:3318
+#: usr/local/www/interfaces_bridge_edit.php:281
+#: usr/local/www/interfaces_ppps_edit.php:738 etc/inc/shaper.inc:3089
+#: etc/inc/shaper.inc:3330 usr/local/www/interfaces_bridge_edit.php:290
+#: etc/inc/shaper.inc:3237 etc/inc/shaper.inc:3485
+#: usr/local/www/interfaces_ppps_edit.php:739
+#: usr/local/www/interfaces_bridge_edit.php:291
+#: usr/local/www/interfaces_ppps_edit.php:745
+#: usr/local/www/interfaces_bridge_edit.php:292 etc/inc/shaper.inc:3238
+#: etc/inc/shaper.inc:3486 etc/inc/shaper.inc:3245 etc/inc/shaper.inc:3493
+#: usr/local/www/interfaces_ppps_edit.php:743
+#: usr/local/www/interfaces_bridge_edit.php:294 etc/inc/shaper.inc:3313
+#: etc/inc/shaper.inc:3561 usr/local/www/interfaces_ppps_edit.php:743
+#: usr/local/www/interfaces_bridge_edit.php:294 etc/inc/shaper.inc:3390
+#: etc/inc/shaper.inc:3663
+msgid "Show advanced options"
+msgstr "高度なオプションを表示する"
+
+#: etc/inc/shaper.inc:3085 etc/inc/shaper.inc:3093
+#: usr/local/www/status_ntpd.php:115 etc/inc/shaper.inc:3241
+#: usr/local/www/status_ntpd.php:131 etc/inc/shaper.inc:3242
+#: usr/local/www/status_ntpd.php:137 etc/inc/shaper.inc:3249
+#: etc/inc/shaper.inc:3317 usr/local/www/status_ntpd.php:137
+#: etc/inc/shaper.inc:3394
+msgid "Delay"
+msgstr "ディレイ"
+
+#: etc/inc/shaper.inc:3089 etc/inc/shaper.inc:3097 etc/inc/shaper.inc:3245
+#: etc/inc/shaper.inc:3246 etc/inc/shaper.inc:3253 etc/inc/shaper.inc:3321
+#: etc/inc/shaper.inc:3398
+msgid ""
+"Hint: in most cases, you should specify 0 here (or leave the field empty)"
+msgstr ""ヒント:ほとんどの場合、あなたはここに0を指定する必要があります(かフィールドを空にしておく)"
+
+#: etc/inc/shaper.inc:3093 etc/inc/shaper.inc:3329 etc/inc/shaper.inc:3101
+#: etc/inc/shaper.inc:3341 etc/inc/shaper.inc:3249 etc/inc/shaper.inc:3496
+#: etc/inc/shaper.inc:3250 etc/inc/shaper.inc:3497 etc/inc/shaper.inc:3257
+#: etc/inc/shaper.inc:3504 etc/inc/shaper.inc:3325 etc/inc/shaper.inc:3572
+#: etc/inc/shaper.inc:3402 etc/inc/shaper.inc:3674
+msgid "Packet loss rate"
+msgstr "パケット損失率"
+
+#: etc/inc/shaper.inc:3097 etc/inc/shaper.inc:3333 etc/inc/shaper.inc:3105
+#: etc/inc/shaper.inc:3345 etc/inc/shaper.inc:3253 etc/inc/shaper.inc:3500
+#: etc/inc/shaper.inc:3254 etc/inc/shaper.inc:3501 etc/inc/shaper.inc:3261
+#: etc/inc/shaper.inc:3508 etc/inc/shaper.inc:3329 etc/inc/shaper.inc:3576
+#: etc/inc/shaper.inc:3406 etc/inc/shaper.inc:3678
+msgid ""
+"Hint: in most cases, you should specify 0 here (or leave the field empty). A "
+"value of 0.001 means one packet in 1000 gets dropped"
+msgstr ""ヒント:ほとんどの場合、あなたはここに0を指定する(かフィールドを空にしておく)必要があります。"0.001の値は、1000年における1パケットはドロップされますことを意味"
+
+#: etc/inc/shaper.inc:3102 etc/inc/shaper.inc:3338 etc/inc/shaper.inc:3110
+#: etc/inc/shaper.inc:3350 etc/inc/shaper.inc:3258 etc/inc/shaper.inc:3505
+#: etc/inc/shaper.inc:3259 etc/inc/shaper.inc:3506 etc/inc/shaper.inc:3266
+#: etc/inc/shaper.inc:3513 etc/inc/shaper.inc:3334 etc/inc/shaper.inc:3581
+#: etc/inc/shaper.inc:3411 etc/inc/shaper.inc:3683
+msgid "Queue Size"
+msgstr "キューサイズ"
+
+#: etc/inc/shaper.inc:3107 etc/inc/shaper.inc:3343 etc/inc/shaper.inc:3115
+#: etc/inc/shaper.inc:3355 etc/inc/shaper.inc:3263 etc/inc/shaper.inc:3510
+#: etc/inc/shaper.inc:3264 etc/inc/shaper.inc:3511 etc/inc/shaper.inc:3271
+#: etc/inc/shaper.inc:3518 etc/inc/shaper.inc:3339 etc/inc/shaper.inc:3586
+#: etc/inc/shaper.inc:3416 etc/inc/shaper.inc:3688
+msgid ""
+"Hint: in most cases, you should leave the field empty. All packets in this "
+"pipe are placed into a fixed-size queue first, then they are delayed by "
+"value specified in the Delay field, and then they are delivered to their "
+"destination."
+msgstr ""ヒント:ほとんどの場合、空のフィールドを残してください。"この配管内のすべてのパケットは、最初に固定サイズのキューに配置されている"そしてそれらは、Delayフィールドで指定された値遅れで表示されています"そして、彼らは、その送信先に配信されます。"
+
+#: etc/inc/shaper.inc:3113 etc/inc/shaper.inc:3349 etc/inc/shaper.inc:3121
+#: etc/inc/shaper.inc:3361 etc/inc/shaper.inc:3269 etc/inc/shaper.inc:3516
+#: etc/inc/shaper.inc:3270 etc/inc/shaper.inc:3517 etc/inc/shaper.inc:3277
+#: etc/inc/shaper.inc:3524 etc/inc/shaper.inc:3345 etc/inc/shaper.inc:3592
+#: etc/inc/shaper.inc:3422 etc/inc/shaper.inc:3694
+msgid "Bucket Size"
+msgstr "バケットサイズ"
+
+#: etc/inc/shaper.inc:3118 etc/inc/shaper.inc:3354 etc/inc/shaper.inc:3126
+#: etc/inc/shaper.inc:3366 etc/inc/shaper.inc:3274 etc/inc/shaper.inc:3521
+#: etc/inc/shaper.inc:3275 etc/inc/shaper.inc:3522 etc/inc/shaper.inc:3282
+#: etc/inc/shaper.inc:3529 etc/inc/shaper.inc:3350 etc/inc/shaper.inc:3597
+#: etc/inc/shaper.inc:3427 etc/inc/shaper.inc:3699
+msgid ""
+"Hint: in most cases, you should leave the field empty. It increases the hash "
+"size set."
+msgstr ""ヒント:ほとんどの場合、空のフィールドを残してください。"これは、ハッシュ·サイズのセットが増加します。"
+
+msgstr ""ヒント:ほとんどの場合、空のフィールドを残してください。"これは、ハッシュ·サイズのセットが増加します。"
+
+#: etc/inc/shaper.inc:3176 etc/inc/shaper.inc:3184 etc/inc/shaper.inc:3339
+#: etc/inc/shaper.inc:3340 etc/inc/shaper.inc:3347 etc/inc/shaper.inc:3415
+#: etc/inc/shaper.inc:3495
+msgid "Weight must be an integer between 1 and 100."
+msgstr "重量は1から100までの整数でなければなりません。"
+
+#: etc/inc/shaper.inc:3274 etc/inc/shaper.inc:3282 etc/inc/shaper.inc:3437
+#: etc/inc/shaper.inc:3438 etc/inc/shaper.inc:3445 etc/inc/shaper.inc:3513
+#: etc/inc/shaper.inc:3594
+msgid "Enable/Disable queue"
+msgstr "キューを有効または無効にする"
+
+#: etc/inc/shaper.inc:3289 usr/local/www/firewall_rules.php:760
+#: usr/local/www/firewall_rules_edit.php:1224
+#: usr/local/www/firewall_rules_edit.php:1231
+#: usr/local/www/diag_system_pftop.php:107
+#: usr/local/www/interfaces_lagg_edit.php:201
+#: usr/local/www/load_balancer_virtual_server_edit.php:234
+#: usr/local/www/vpn_openvpn_client.php:519 etc/inc/shaper.inc:3301
+#: usr/local/www/firewall_rules_edit.php:1259
+#: usr/local/www/firewall_rules_edit.php:1266
+#: usr/local/www/firewall_rules.php:757
+#: usr/local/www/load_balancer_virtual_server_edit.php:223
+#: usr/local/www/vpn_openvpn_client.php:524 etc/inc/shaper.inc:3456
+#: usr/local/www/vpn_ipsec_mobile.php:403
+#: usr/local/www/interfaces_lagg_edit.php:202
+#: usr/local/www/firewall_rules.php:750
+#: usr/local/www/load_balancer_virtual_server_edit.php:221
+#: usr/local/www/vpn_openvpn_client.php:542
+#: usr/local/www/vpn_openvpn_client.php:561
+#: usr/local/www/firewall_rules_edit.php:1274
+#: usr/local/www/firewall_rules_edit.php:1281
+#: usr/local/www/interfaces_lagg_edit.php:215 etc/inc/shaper.inc:3457
+#: usr/local/www/firewall_rules_edit.php:1283
+#: usr/local/www/firewall_rules_edit.php:1289
+#: usr/local/www/firewall_rules.php:749 etc/inc/shaper.inc:3464
+#: usr/local/www/firewall_rules_edit.php:1282
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/interfaces_lagg_edit.php:214 etc/inc/shaper.inc:3532
+#: usr/local/www/vpn_openvpn_client.php:561
+#: usr/local/www/firewall_rules_edit.php:1282
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/load_balancer_virtual_server_edit.php:221
+#: usr/local/www/interfaces_lagg_edit.php:214
+#: usr/local/www/firewall_rules.php:749 usr/local/www/vpn_ipsec_mobile.php:403
+#: etc/inc/shaper.inc:3614
+msgid "none"
+msgstr "なし"
+
+#: etc/inc/shaper.inc:3321 usr/local/www/system_gateways_edit.php:424
+#: etc/inc/shaper.inc:3333 usr/local/www/system_gateways_edit.php:445
+#: etc/inc/shaper.inc:3488 usr/local/www/system_gateways_edit.php:551
+#: usr/local/www/system_gateways_edit.php:555 etc/inc/shaper.inc:3489
+#: usr/local/www/system_gateways_edit.php:557 etc/inc/shaper.inc:3496
+#: usr/local/www/system_gateways_edit.php:587 etc/inc/shaper.inc:3564
+#: usr/local/www/system_gateways_edit.php:587 etc/inc/shaper.inc:3666
+msgid "Weight"
+msgstr "ウエート"
+
+#: etc/inc/shaper.inc:3325 etc/inc/shaper.inc:3337 etc/inc/shaper.inc:3492
+#: etc/inc/shaper.inc:3493 etc/inc/shaper.inc:3500 etc/inc/shaper.inc:3568
+#: etc/inc/shaper.inc:3670
+msgid ""
+"Hint: For queues under the same parent this specifies the share that a queue "
+"gets(values range from 1 to 100, you can leave it blank otherwise)"
+msgstr ""ヒント:同じ親の下にキューの場合、これはキューが取得する共有を指定"(値は1から100の範囲には、そうでない場合、空白のままにすることができます)"
+
+#: etc/inc/shaper.inc:3353 etc/inc/shaper.inc:3365 etc/inc/shaper.inc:3520
+#: etc/inc/shaper.inc:3521 etc/inc/shaper.inc:3528 etc/inc/shaper.inc:3596
+#: etc/inc/shaper.inc:3698
+msgid "slots"
+msgstr "スロット"
+
+#: etc/inc/shaper.inc:3494 etc/inc/shaper.inc:3506 etc/inc/shaper.inc:3661
+#: etc/inc/shaper.inc:3662 etc/inc/shaper.inc:3669 etc/inc/shaper.inc:3737
+#: etc/inc/shaper.inc:3842
+msgid "Enable/Disable layer7 Container"
+msgstr "レイヤ7コンテナを有効または無効にします"
+
+#: etc/inc/shaper.inc:3744 etc/inc/shaper.inc:3756 etc/inc/shaper.inc:3911
+#: etc/inc/shaper.inc:3912 etc/inc/shaper.inc:3919 etc/inc/shaper.inc:3987
+#: etc/inc/shaper.inc:4092
+#, php-format
+msgid "Sending HUP signal to %s"
+msgstr "%sにHUPシグナルを送る"
+
+#: etc/inc/shaper.inc:4052 etc/inc/shaper.inc:4112 etc/inc/shaper.inc:4269
+#: etc/inc/shaper.inc:4270 etc/inc/shaper.inc:4277 etc/inc/shaper.inc:4345
+#: etc/inc/shaper.inc:4450
+msgid " Clone shaper/queue on this interface"
+msgstr " Clone shaper/queue on this interface"
+
+#: etc/inc/shaper.inc:4060 etc/inc/shaper.inc:4067 etc/inc/shaper.inc:4120
+#: etc/inc/shaper.inc:4127 etc/inc/shaper.inc:4277 etc/inc/shaper.inc:4284
+#: etc/inc/shaper.inc:4278 etc/inc/shaper.inc:4285 etc/inc/shaper.inc:4292
+#: etc/inc/shaper.inc:4353 etc/inc/shaper.inc:4360 etc/inc/shaper.inc:4458
+#: etc/inc/shaper.inc:4465
+#, php-format
+msgid "Welcome to the %s Traffic Shaper."
+msgstr "%sのトラフィック·シェーパにようこそ。"
+
+#: etc/inc/shaper.inc:4061 etc/inc/shaper.inc:4068 etc/inc/shaper.inc:4121
+#: etc/inc/shaper.inc:4128 etc/inc/shaper.inc:4278 etc/inc/shaper.inc:4285
+#: etc/inc/shaper.inc:4279 etc/inc/shaper.inc:4286 etc/inc/shaper.inc:4293
+#: etc/inc/shaper.inc:4354 etc/inc/shaper.inc:4361 etc/inc/shaper.inc:4459
+#: etc/inc/shaper.inc:4466
+msgid ""
+"The tree on the left helps you navigate through the queues <br />buttons at "
+"the bottom represent queue actions and are activated accordingly."
+msgstr ""左側のツリーでは、キューの動作を表しており、それに応じて<br />起動される下部"にキューボタンをナビゲートするのに役立ちます。"
+
+#: etc/inc/system.inc:430 etc/inc/system.inc:449 etc/inc/system.inc:457
+#: etc/inc/system.inc:467
+#, php-format
+msgid "Static Routes: Gateway IP could not be found for %s"
+msgstr "静的ルート:ゲートウェイのIPは%sを見つかりませんでした"
+
+#: etc/inc/system.inc:497 etc/inc/system.inc:529 etc/inc/system.inc:533
+#: etc/inc/system.inc:547 etc/inc/system.inc:606
+msgid "Starting syslog..."
+msgstr "syslogを開始..."
+
+#: etc/inc/system.inc:536 etc/inc/system.inc:568 etc/inc/system.inc:572
+#: etc/inc/system.inc:695 etc/inc/system.inc:754
+#, php-format
+msgid "Error: cannot open syslog.conf in system_syslogd_start().%s"
+msgstr "エラー:system_syslogd_start.().%s 処理のsyslog.confを開くことはできません"
+
+#: etc/inc/system.inc:664 etc/inc/system.inc:712 etc/inc/system.inc:716
+#: etc/inc/system.inc:725 etc/inc/system.inc:784
+msgid "Initializing PCMCIA..."
+msgstr "PCMCIAの初期化..."
+
+#: etc/inc/system.inc:676 etc/inc/system.inc:761 etc/inc/system.inc:1412
+#: etc/inc/system.inc:1415 etc/inc/system.inc:724 etc/inc/system.inc:808
+#: etc/inc/system.inc:1469 etc/inc/system.inc:1472 etc/inc/system.inc:728
+#: etc/inc/system.inc:806 etc/inc/system.inc:1511 etc/inc/system.inc:1514
+#: etc/inc/system.inc:737 etc/inc/system.inc:817 etc/inc/system.inc:1460
+#: etc/inc/system.inc:1463 etc/inc/system.inc:796 etc/inc/system.inc:876
+#: etc/inc/system.inc:1519 etc/inc/system.inc:1522
+msgid "failed!"
+msgstr "フェイル"
+
+#: etc/inc/system.inc:687 etc/inc/system.inc:735 etc/inc/system.inc:739
+#: etc/inc/system.inc:748 etc/inc/system.inc:807
+msgid "Starting webConfigurator..."
+msgstr "webConfiguratorを開始..."
+
+#: etc/inc/system.inc:719 etc/inc/system.inc:767 etc/inc/system.inc:771
+#: etc/inc/system.inc:775 etc/inc/system.inc:834
+msgid "webConfigurator default"
+msgstr "webConfiguratorデフォルト"
+
+#: etc/inc/system.inc:729 etc/inc/system.inc:777 etc/inc/system.inc:781
+#: etc/inc/system.inc:785 etc/inc/system.inc:844
+msgid "Importing HTTPS certificate"
+msgstr "HTTPS証明書のインポート"
+
+#: etc/inc/system.inc:1115 etc/inc/system.inc:1167 etc/inc/system.inc:1147
+#: etc/inc/system.inc:1096 etc/inc/system.inc:1155
+#, php-format
+msgid "Error: cannot open cert.pem in system_webgui_start().%s"
+msgstr "エラー:system_webgui_start.().%s 処理cert.pemに開くことはできません"
+
+#: etc/inc/system.inc:1126 etc/inc/system.inc:1178 etc/inc/system.inc:1158
+#: etc/inc/system.inc:1107 etc/inc/system.inc:1166
+#, php-format
+msgid "Error: cannot open ca.pem in system_webgui_start().%s"
+msgstr "エラー:system_webgui_start.().%s 処理ca.pemを開くことはできません"
+
+#: etc/inc/system.inc:1134 etc/inc/system.inc:1186 etc/inc/system.inc:1166
+#: etc/inc/system.inc:1115 etc/inc/system.inc:1174
+msgid "ssl configuration"
+msgstr "SSL設定"
+
+#: etc/inc/system.inc:1161 etc/inc/system.inc:1213 etc/inc/system.inc:1193
+#: etc/inc/system.inc:1142 etc/inc/system.inc:1201
+#, php-format
+msgid "Error: cannot open %s in system_generate_lighty_config().%s"
+msgstr "エラー:system_generate_lighty_config.().%s 処理%sを開くことはできません"
+
+#: etc/inc/system.inc:1181 etc/inc/system.inc:1233 etc/inc/system.inc:1213
+#: etc/inc/system.inc:1162 etc/inc/system.inc:1221
+msgid "Setting timezone..."
+msgstr "タイムゾーンの設定..."
+
+#: etc/inc/system.inc:1270 etc/inc/system.inc:1326 etc/inc/system.inc:1368
+#: etc/inc/system.inc:1310 etc/inc/system.inc:1369
+msgid "Syncing system time before startup..."
+msgstr "起動する前に、システムの時刻を同期させる..."
+
+#: etc/inc/system.inc:1376 etc/inc/system.inc:1433 etc/inc/system.inc:1475
+#: etc/inc/system.inc:1424 etc/inc/system.inc:1483
+#, php-format
+msgid "Error: cannot open dmesg.boot in system_dmesg_save().%s"
+msgstr "エラー:system_dmesg_save.().%s 処理dmesg.boot開くことができません。"
+
+#: etc/inc/system.inc:1397 etc/inc/system.inc:1454 etc/inc/system.inc:1496
+#: etc/inc/system.inc:1445 etc/inc/system.inc:1504
+msgid "Setting hard disk standby... "
+msgstr "ハードディスクのスタンバイの設定... "
+
+#: etc/inc/system.inc:1514 etc/inc/system.inc:1571 etc/inc/system.inc:1613
+#: etc/inc/system.inc:1562 etc/inc/system.inc:1621
+msgid "Generic PC"
+msgstr "一般的なPC"
+
+#: etc/inc/system.inc:1517 etc/inc/system.inc:1574 etc/inc/system.inc:1616
+#: etc/inc/system.inc:1565 etc/inc/system.inc:1624
+msgid "Generic PC (CD-ROM)"
+msgstr "一般的なPC (シーディーロム)"
+
+#: etc/inc/system.inc:1526 etc/inc/system.inc:1583 etc/inc/system.inc:1625
+#: etc/inc/system.inc:1574 etc/inc/system.inc:1633
+msgid "PC Engines WRAP"
+msgstr "PCエンジンラップ"
+
+#: etc/inc/system.inc:1529 etc/inc/system.inc:1586 etc/inc/system.inc:1628
+#: etc/inc/system.inc:1577 etc/inc/system.inc:1636
+msgid "PC Engines ALIX"
+msgstr "PCエンジンALIX"
+
+#: etc/inc/system.inc:1541 etc/inc/system.inc:1598 etc/inc/system.inc:1640
+#: etc/inc/system.inc:1589 etc/inc/system.inc:1648
+msgid "embedded (unknown)"
+msgstr "埋め込み(不明)"
+
+msgstr "埋め込み(不明)"
+
+#: etc/inc/util.inc:99 etc/inc/util.inc:101 etc/inc/util.inc:101
+#, php-format
+msgid "WARNING: Could not mark subsystem: %s dirty"
+msgstr "警告:サブシステムをマークできませんでした:汚い%s"
+
+#: etc/inc/util.inc:119 etc/inc/util.inc:121 etc/inc/util.inc:121
+msgid "WARNING: You must give a name as parameter to lock() function."
+msgstr "警告:あなたが機能を lock.() パラメータとして名前を付ける必要があります。"
+
+#: etc/inc/util.inc:213 etc/inc/util.inc:208 etc/inc/util.inc:238
+#: etc/inc/util.inc:240 etc/inc/util.inc:240
+#, php-format
+msgid "Reference %s is going negative, not doing unreference."
+msgstr "参照%sはは、負方向の非参照を実行していません。"
+
+#: etc/inc/util.inc:980 etc/inc/util.inc:981 etc/inc/util.inc:1026
+#: etc/inc/util.inc:1076 etc/inc/util.inc:1080 etc/inc/util.inc:1080
+#, php-format
+msgid "The command '%1$s' returned exit code '%2$d', the output was '%3$s' "
+msgstr "コマンドは「%1$s」が終了コード'%2$d」を返されると、出力は「%3$s」だった"
+
+#: etc/inc/vpn.inc:126 etc/inc/vpn.inc:134 etc/inc/vpn.inc:133
+msgid "Configuring IPsec VPN... "
+msgstr "IPsecのVPNを設定... "
+
+#: etc/inc/vpn.inc:229 etc/inc/vpn.inc:228 etc/inc/vpn.inc:238
+#: etc/inc/vpn.inc:237 etc/inc/vpn.inc:236
+#, php-format
+msgid "Error: Invalid certificate info for %s"
+msgstr "エラー:%s無効な証明書情報"
+
+#: etc/inc/vpn.inc:235 etc/inc/vpn.inc:234 etc/inc/vpn.inc:244
+#: etc/inc/vpn.inc:243 etc/inc/vpn.inc:242
+#, php-format
+msgid "Error: Invalid certificate hash info for %s"
+msgstr "エラー:%s無効な証明書のハッシュ情報"
+
+#: etc/inc/vpn.inc:240 etc/inc/vpn.inc:239 etc/inc/vpn.inc:249
+#: etc/inc/vpn.inc:248 etc/inc/vpn.inc:247
+#, php-format
+msgid "Error: Cannot write IPsec CA file for %s"
+msgstr "エラー: %sのIPsec CAファイルを書き込むことができません"
+
+#: etc/inc/vpn.inc:249 etc/inc/vpn.inc:248
+#, php-format
+msgid "Error: cannot open psk.txt in vpn_ipsec_configure()."
+msgstr "エラー: vpn_ipsec_configure.()にpsk.txtを開くことができません。"
+
+#: etc/inc/vpn.inc:312 etc/inc/vpn.inc:311
+#, php-format
+msgid "Error: cannot open racoon.conf in vpn_ipsec_configure()."
+msgstr "エラー: vpn_ipsec_configure.()でのracoon.confを開くことができません。"
+
+#: etc/inc/vpn.inc:404 etc/inc/vpn.inc:403
+#, php-format
+msgid "Error: cannot open server %s in vpn.\n"
+msgstr "エラー: vpn.\nでサーバー%sを開くことはできません"
+
+#: etc/inc/vpn.inc:560 etc/inc/vpn.inc:559 etc/inc/vpn.inc:546
+#: etc/inc/vpn.inc:549 etc/inc/vpn.inc:548
+#, php-format
+msgid "Error: Invalid phase1 certificate reference for %s"
+msgstr "エラー: %sの無効なフェーズ1証明書の参照"
+
+#: etc/inc/vpn.inc:569 etc/inc/vpn.inc:568 etc/inc/vpn.inc:555
+#: etc/inc/vpn.inc:558 etc/inc/vpn.inc:557
+#, php-format
+msgid "Error: Cannot write phase1 certificate file for %s"
+msgstr "エラー: %sためのフェーズ1の証明書ファイルを書き込むことができません"
+
+#: etc/inc/vpn.inc:580 etc/inc/vpn.inc:579 etc/inc/vpn.inc:566
+#: etc/inc/vpn.inc:569 etc/inc/vpn.inc:568
+#, php-format
+msgid "Error: Cannot write phase1 key file for %s"
+msgstr "エラー: %sためのフェーズ1キーファイルを書き込むことができません"
+
+#: etc/inc/vpn.inc:593 etc/inc/vpn.inc:592 etc/inc/vpn.inc:579
+#: etc/inc/vpn.inc:582 etc/inc/vpn.inc:581
+#, php-format
+msgid "Error: Cannot write phase1 CA certificate file for %s"
+msgstr "エラー: %sためのフェーズ1のCA証明書ファイルを書き込むことができません"
+
+#: etc/inc/vpn.inc:826 etc/inc/vpn.inc:829
+#, php-format
+msgid "Error: cannot open spd.conf in vpn_ipsec_configure()."
+msgstr "エラー: vpn_ipsec_configure.()にspd.confを開くことができません。"
+
+#: etc/inc/vpn.inc:1008 etc/inc/vpn.inc:1014 etc/inc/vpn.inc:1013
+#: etc/inc/vpn.inc:1022 etc/inc/vpn.inc:1035 etc/inc/vpn.inc:1034
+msgid "Forcefully reloading IPsec racoon daemon"
+msgstr "強制的にIPsec racoonデーモンを再ロード"
+
+#: etc/inc/vpn.inc:1052 etc/inc/vpn.inc:1058 etc/inc/vpn.inc:1056
+#: etc/inc/vpn.inc:1065 etc/inc/vpn.inc:1078 etc/inc/vpn.inc:1077
+msgid "Configuring PPTP VPN service... "
+msgstr "PPTPのVPNサービスの設定..."
+
+#: etc/inc/vpn.inc:1062 etc/inc/vpn.inc:1068 etc/inc/vpn.inc:1066
+#: etc/inc/vpn.inc:1075 etc/inc/vpn.inc:1088 etc/inc/vpn.inc:1087
+msgid "Could not kill mpd within 3 seconds. Trying again."
+msgstr "3秒以内にMPDを殺すことができませんでした。再試行。"
+
+#: etc/inc/vpn.inc:1085 etc/inc/vpn.inc:1091 etc/inc/vpn.inc:1089
+#: etc/inc/vpn.inc:1098 etc/inc/vpn.inc:1111 etc/inc/vpn.inc:1110
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_pptpd_configure()."
+msgstr "エラー: vpn_pptpd_configure.()にmpd.confを開くことができません。"
+
+#: etc/inc/vpn.inc:1198 etc/inc/vpn.inc:1204 etc/inc/vpn.inc:1202
+#: etc/inc/vpn.inc:1212 etc/inc/vpn.inc:1225 etc/inc/vpn.inc:1224
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_pptpd_configure()."
+msgstr "エラー: vpn_pptpd_configure.()にmpd.linksを開くことができません。"
+
+#: etc/inc/vpn.inc:1222 etc/inc/vpn.inc:1228 etc/inc/vpn.inc:1226
+#: etc/inc/vpn.inc:1237 etc/inc/vpn.inc:1250 etc/inc/vpn.inc:1249
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_pptpd_configure()."
+msgstr "エラー: vpn_pptpd_configure.()にmpd.secretを開くことができません。"
+
+#: etc/inc/vpn.inc:1279 etc/inc/vpn.inc:1285 etc/inc/vpn.inc:1283
+#: etc/inc/vpn.inc:1295 etc/inc/vpn.inc:1308 etc/inc/vpn.inc:1307
+msgid "Configuring PPPoE Server service... "
+msgstr "PPPoEのVPNサービスの設定..."
+
+#: etc/inc/vpn.inc:1303 etc/inc/vpn.inc:1309 etc/inc/vpn.inc:1307
+#: etc/inc/vpn.inc:1319 etc/inc/vpn.inc:1332 etc/inc/vpn.inc:1331
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_pppoe_configure()."
+msgstr "エラー: vpn_pppoe_configure.()にmpd.confを開くことができません。"
+
+#: etc/inc/vpn.inc:1406 etc/inc/vpn.inc:1412 etc/inc/vpn.inc:1410
+#: etc/inc/vpn.inc:1423 etc/inc/vpn.inc:1436 etc/inc/vpn.inc:1435
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_pppoe_configure()."
+msgstr "エラー: vpn_pppoe_configure.()にmpd.linksを開くことができません。"
+
+#: etc/inc/vpn.inc:1432 etc/inc/vpn.inc:1438 etc/inc/vpn.inc:1436
+#: etc/inc/vpn.inc:1450 etc/inc/vpn.inc:1463 etc/inc/vpn.inc:1462
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_pppoe_configure()."
+msgstr "エラー: vpn_pppoe_configure.()にmpd.secretを開くことができません。"
+
+#: etc/inc/vpn.inc:1460 usr/local/www/system_firmware_check.php:139
+#: etc/inc/vpn.inc:1470 etc/inc/vpn.inc:1468
+#: usr/local/www/system_firmware_check.php:141 etc/inc/vpn.inc:1483
+#: usr/local/www/system_firmware_check.php:133 etc/inc/vpn.inc:1496
+#: usr/local/www/system_firmware_check.php:133 etc/inc/vpn.inc:1495
+msgid "done"
+msgstr "終わった"
+
+#: etc/inc/vpn.inc:1479 etc/inc/vpn.inc:1489 etc/inc/vpn.inc:1487
+#: etc/inc/vpn.inc:1502 etc/inc/vpn.inc:1515 etc/inc/vpn.inc:1514
+msgid "Configuring l2tp VPN service... "
+msgstr "L2TPのVPNサービスの設定..."
+
+#: etc/inc/vpn.inc:1504 etc/inc/vpn.inc:1514 etc/inc/vpn.inc:1512
+#: etc/inc/vpn.inc:1527 etc/inc/vpn.inc:1540 etc/inc/vpn.inc:1539
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_l2tp_configure()."
+msgstr "エラー: vpn_l2tp_configure.()にmpd.confを開くことができません。"
+
+#: etc/inc/vpn.inc:1597 etc/inc/vpn.inc:1607 etc/inc/vpn.inc:1605
+#: etc/inc/vpn.inc:1621 etc/inc/vpn.inc:1634 etc/inc/vpn.inc:1633
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_l2tp_configure()."
+msgstr "エラー: vpn_l2tp_configure.()にmpd.linksを開くことができません。"
+
+#: etc/inc/vpn.inc:1622 etc/inc/vpn.inc:1632 etc/inc/vpn.inc:1630
+#: etc/inc/vpn.inc:1647 etc/inc/vpn.inc:1660 etc/inc/vpn.inc:1659
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_l2tp_configure()."
+msgstr "エラー: vpn_l2tp_configure.()にmpd.secretを開くことができません。"
+
+#: etc/inc/vpn.inc:1769 etc/inc/vpn.inc:1779 etc/inc/vpn.inc:1764
+#: etc/inc/vpn.inc:1836 etc/inc/vpn.inc:1849 etc/inc/vpn.inc:1846
+#, php-format
+msgid "Could not determine VPN endpoint for '%s'"
+msgstr "「 %s'のVPNエンドポイントを決定することができませんでした"
+
+#: etc/inc/vpn.inc:1774 etc/inc/vpn.inc:1784 etc/inc/vpn.inc:1769
+#: etc/inc/vpn.inc:1841 etc/inc/vpn.inc:1854 etc/inc/vpn.inc:1851
+#, php-format
+msgid ""
+"IPSEC: ERROR: One of the endpoints is not a IP address. Old EP '%1$s' new EP "
+"'%2$s'"
+msgstr "「 IPSEC :エラー:エンドポイントの一つは、 IPアドレスの旧EP "は%1$s'新EPではありません」 「 %2$s'"
+
+#: etc/inc/vpn.inc:1777 etc/inc/vpn.inc:1787 etc/inc/vpn.inc:1772
+#: etc/inc/vpn.inc:1844 etc/inc/vpn.inc:1857 etc/inc/vpn.inc:1854
+#, php-format
+msgid ""
+"IPSEC: ERROR: One of the remote endpoints is not a IP address. Old RG '%1$s' "
+"new RG '%2$s'"
+msgstr "「 IPSEC :エラー:リモートエンドポイントの一つは、 IPアドレスオールドRG'は%1$s 」ではない「新しいRG' %2$s'"
+
+#: etc/inc/vpn.inc:1833 etc/inc/vpn.inc:1843 etc/inc/vpn.inc:1835
+#: etc/inc/vpn.inc:1907 etc/inc/vpn.inc:1920 etc/inc/vpn.inc:1917
+#, php-format
+msgid ""
+"Reloading IPsec tunnel '%1$s'. Previous IP '%2$s', current IP '%3$s'. "
+"Reloading policy"
+msgstr "「リロードIPsecトンネル」は%1$s' 。以前のIP' %2$s'、現在のIP' %3$s' 。 "リロードポリシー"
+
+#: etc/inc/xmlparse.inc:85 etc/inc/xmlparse_attr.inc:78
+#: etc/inc/xmlparse_attr.inc:78 etc/inc/xmlparse.inc:85
+#, php-format
+msgid "XML error: %1$s at line %2$d cannot occur more than once"
+msgstr "XMLエラー:行% 2の $ dのは%1$sが複数回出現することはできません"
+
+#: etc/inc/xmlparse.inc:176 etc/inc/xmlparse_attr.inc:187
+#: etc/inc/xmlparse_attr.inc:187 etc/inc/xmlparse.inc:176
+msgid "Error: could not open XML input"
+msgstr "エラー: XML入力をオープンできませんでした"
+
+#: etc/inc/xmlparse.inc:182 etc/inc/xmlparse.inc:182
+#, php-format
+msgid "XML error: %1$s at line %2$d in %3$s"
+msgstr "XMLエラー:行%では%1$s %3$s中2 $ dの"
+
+#: etc/inc/xmlparse.inc:198 etc/inc/xmlparse_attr.inc:210
+#: etc/inc/xmlparse.inc:199 etc/inc/xmlparse_attr.inc:210
+#: etc/inc/xmlparse.inc:199
+#, php-format
+msgid "XML error: no %s object found!"
+msgstr "XMLエラー:なし%sオブジェクト見つからない !"
+
+#: etc/inc/xmlrpc_client.inc:152 etc/inc/xmlrpc_client.inc:152
+msgid "Unknown method"
+msgstr "未知の方法"
+
+#: etc/inc/xmlrpc_client.inc:153 etc/inc/xmlrpc_client.inc:153
+msgid "Invalid return payload: enable debugging to examine incoming payload"
+msgstr "無効な戻りペイロード:受信ペイロードを検査するためにデバッグを有効に"
+
+#: etc/inc/xmlrpc_client.inc:154 etc/inc/xmlrpc_client.inc:154
+msgid "Incorrect parameters passed to method"
+msgstr "メソッドに渡されたパラメータが正しくありません"
+
+#: etc/inc/xmlrpc_client.inc:155 etc/inc/xmlrpc_client.inc:155
+msgid "Can't introspect: method unknown"
+msgstr "イントロスペクションすることはできません:メソッド未知"
+
+#: etc/inc/xmlrpc_client.inc:156 etc/inc/xmlrpc_client.inc:156
+msgid "Didn't receive 200 OK from remote server."
+msgstr "リモートサーバから200 OKを受信しませんでした。"
+
+#: etc/inc/xmlrpc_client.inc:157 etc/inc/xmlrpc_client.inc:157
+msgid "The requested method didn't return an XML_RPC_Response object."
+msgstr "要求されたメソッドは、はXML_RPC_Responseオブジェクトが返されませんでした。"
+
+#: etc/inc/xmlrpc_client.inc:158 etc/inc/xmlrpc_client.inc:158
+msgid "Invalid request payload"
+msgstr "無効な要求ペイロード"
+
+#: etc/inc/xmlrpc_client.inc:260 etc/inc/xmlrpc_client.inc:260
+msgid "missing top level xmlrpc element"
+msgstr "トップレベルのXMLRPC要素がありません"
+
+#: etc/inc/xmlrpc_client.inc:268 etc/inc/xmlrpc_client.inc:268
+#, php-format
+msgid "xmlrpc element %1$s cannot be child of %2$s"
+msgstr "XMLRPC要素は%1$sは%2$sの子にすることはできません"
+
+#: etc/inc/xmlrpc_client.inc:431 etc/inc/xmlrpc_client.inc:431
+msgid "Non-numeric value received in INT or DOUBLE"
+msgstr "数値以外の値がINTまたはDOUBLEで受信"
+
+#: etc/inc/xmlrpc_client.inc:860 etc/inc/xmlrpc_client.inc:860
+#, php-format
+msgid "send()'s %s parameter must be an XML_RPC_Message object."
+msgstr "send.()の%sパラメータはXML_RPC_Messageオブジェクトでなければなりません。"
+
+#: etc/inc/xmlrpc_client.inc:951 etc/inc/xmlrpc_client.inc:951
+#, php-format
+msgid ""
+"Connection to proxy server \n"
+" %1$s:%2$s failed. %3$s"
+msgstr "は%1$s 「プロキシサーバ\nへの接続」 : %2$sに失敗しました。 %3$s"
+
+#: etc/inc/xmlrpc_client.inc:957 etc/inc/xmlrpc_client.inc:957
+#, php-format
+msgid ""
+"Connection to RPC server \n"
+" %1$s:%2$s failed. %3$s"
+msgstr "は%1$s 「RPCサーバー\nへの接続」 : %2$sに失敗しました。 %3$s"
+
+#: etc/inc/xmlrpc_client.inc:1330 etc/inc/xmlrpc_client.inc:1330
+msgid "The submitted request did not contain this parameter"
+msgstr "送信された要求は、このパラメータが含まれていませんでした"
+
+#: etc/inc/xmlrpc_client.inc:1361 etc/inc/xmlrpc_client.inc:1361
+msgid "mb_convert_encoding() is not available"
+msgstr "mb_convert_encoding.()は使用できません"
+
+#: etc/inc/xmlrpc_client.inc:1470 etc/inc/xmlrpc_client.inc:1470
+#, php-format
+msgid "HTTP error, got response: %s"
+msgstr "HTTPエラー、持っ応答: %s"
+
+#: etc/inc/xmlrpc_client.inc:1496
+msgid "XML error at line 1, check URL"
+msgstr "1行目のXMLエラー、 URLを確認してください"
+
+#: etc/inc/xmlrpc_client.inc:1591 etc/inc/xmlrpc_client.inc:1593
+#: etc/inc/xmlrpc_client.inc:1593
+msgid "Scalar can have only one value"
+msgstr "スカラ1つの値しか持つことができます"
+
+#: etc/inc/xmlrpc_client.inc:1598 etc/inc/xmlrpc_client.inc:1600
+#: etc/inc/xmlrpc_client.inc:1600
+#, php-format
+msgid "Not a scalar type (%s)"
+msgstr "スカラ型でない( %s )"
+
+#: etc/inc/xmlrpc_client.inc:1634 etc/inc/xmlrpc_client.inc:1650
+#: etc/inc/xmlrpc_client.inc:1636 etc/inc/xmlrpc_client.inc:1652
+#: etc/inc/xmlrpc_client.inc:1636 etc/inc/xmlrpc_client.inc:1652
+#, php-format
+msgid "Already initialized as a [%s]"
+msgstr "すでに( ) ( %s )として初期化"
+
+#: etc/inc/xmlrpc_server.inc:48 etc/inc/xmlrpc_server.inc:48
+msgid ""
+"This method lists all the methods that the XML-RPC server knows how to "
+"dispatch"
+msgstr "発送"このメソッドは、XML -RPCサーバがどのように知っているすべてのメソッドが一覧表示されます""
+
+#: etc/inc/xmlrpc_server.inc:66 etc/inc/xmlrpc_server.inc:66
+msgid ""
+"Returns an array of known signatures (an array of arrays) for the method "
+"name passed. If no signatures are known, returns a none-array (test for "
+"type != array to detect missing signature)"
+msgstr "渡された名前"メソッドのために知られてシグネチャの配列(配列の配列)を返します」 。全く署名が知られていない場合は、 ( 「タイプ ! =行方不明の署名を検出するためのアレイのためのテスト)なし - 配列を返します"
+
+#: etc/inc/xmlrpc_server.inc:86 etc/inc/xmlrpc_server.inc:86
+msgid ""
+"Returns help text if defined for the method passed, otherwise returns an "
+"empty string"
+msgstr "空の文字列"渡されたメソッドのために定義されている場合戻り値は、テキストを助ける、そうでなければ返す」"
+
+#: etc/inc/authgui.inc:73 etc/inc/authgui.inc:73
+msgid "No page assigned to this user! Click here to logout."
+msgstr "このユーザーに割り当てられたページです!ログアウトするにはここをクリックしてください。"
+
+#: etc/inc/authgui.inc:97 etc/inc/authgui.inc:103 etc/inc/authgui.inc:103
+#, php-format
+msgid "Error: %1$s Description: %2$s"
+msgstr "エラー:は%1$sの説明: %2$s"
+
+#: etc/inc/authgui.inc:160 etc/inc/authgui.inc:159 etc/inc/authgui.inc:165
+#: etc/inc/authgui.inc:165
+msgid "unknown reason"
+msgstr "未知の原因"
+
+#: etc/inc/authgui.inc:161 etc/inc/authgui.inc:160 etc/inc/authgui.inc:166
+#: etc/inc/authgui.inc:166
+#, php-format
+msgid "Invalid login (%s)."
+msgstr "無効なログイン( %s ) 。"
+
+#: etc/inc/authgui.inc:166 etc/inc/authgui.inc:165 etc/inc/authgui.inc:171
+#: etc/inc/authgui.inc:171
+#, php-format
+msgid "This device is currently being maintained by: %s."
+msgstr "%s. :このデバイスは、現在で維持されている"
+
+#: etc/inc/authgui.inc:214 etc/inc/authgui.inc:277 etc/inc/authgui.inc:212
+#: etc/inc/authgui.inc:275 etc/inc/authgui.inc:235 etc/inc/authgui.inc:298
+#: etc/inc/authgui.inc:235 etc/inc/authgui.inc:298
+msgid "Login"
+msgstr "ログイン"
+
+#: etc/inc/authgui.inc:242 etc/inc/authgui.inc:240 etc/inc/authgui.inc:263
+#: etc/inc/authgui.inc:263
+msgid ""
+"You are accessing this router by an IP address not configured locally, which "
+"may be forwarded by NAT or other means. <br /><br />If you did not setup this "
+"forwarding, you may be the target of a man-in-the-middle attack."
+msgstr "NATまたはその他の手段によって転送されてもよい」はローカルに設定されていないIPアドレスによって、このルータにアクセスしている」 。セットアップこの「転送しなかった<br /><br />Ifは、 man-in-the-middle攻撃の標的となる可能性がある。"
+
+#: etc/inc/authgui.inc:251 etc/inc/authgui.inc:249 etc/inc/authgui.inc:272
+#: etc/inc/authgui.inc:272
+msgid "Username:"
+msgstr "ユーザー名:"
+
+#: etc/inc/authgui.inc:258 usr/local/www/diag_backup.php:597
+#: usr/local/www/system_authservers.php:627 etc/inc/authgui.inc:256
+#: usr/local/www/diag_backup.php:676 usr/local/www/system_authservers.php:632
+#: usr/local/www/system_authservers.php:639 usr/local/www/diag_backup.php:681
+#: etc/inc/authgui.inc:279 usr/local/www/system_authservers.php:639
+#: usr/local/www/diag_backup.php:681 etc/inc/authgui.inc:279
+msgid "Password:"
+msgstr "パスワード:"
+
+#: etc/inc/authgui.inc:265 etc/inc/authgui.inc:263 etc/inc/authgui.inc:286
+#: etc/inc/authgui.inc:286
+msgid "Enter username and password to login."
+msgstr "ユーザ名とパスワードを入力してログインします。"
+
+#: etc/inc/authgui.inc:271 etc/inc/authgui.inc:269 etc/inc/authgui.inc:292
+#: etc/inc/authgui.inc:292
+msgid "Your browser must support cookies to login."
+msgstr "お使いのブラウザは、ログインするためにCookieをサポートしている必要があります。"
+
+#: etc/inc/cmd_chain.inc:101
+#, php-format
+msgid "CmdCHAIN is executing -> %1$s - %2$s"
+msgstr "CmdCHAIN​​が実行されている - u003eは%1$s - %2$s"
+
+#: etc/inc/cmd_chain.inc:109 etc/inc/cmd_chain.inc:111
+#, php-format
+msgid "%1$s failed with return code -> %2$s. The command was %3$s"
+msgstr "は%1$s 、戻りコードで失敗しました - u003e %2$s 。コマンドは%3$sた"
+
+#: etc/inc/config.console.inc:58 etc/inc/config.console.inc:58
+msgid "DANGER! WARNING! ACHTUNG!"
+msgstr "危険 !警告 ! ACHTUNG !"
+
+#: etc/inc/config.console.inc:59 etc/inc/config.console.inc:59
+#, php-format
+msgid "%s requires *AT LEAST* %s RAM to function correctly.%s"
+msgstr "%sは* correctly.%s機能するには、少なくとも* %s RAMが必要です"
+
+#: etc/inc/config.console.inc:60 etc/inc/config.console.inc:60
+#, php-format
+msgid "Only (%s) MB RAM has been detected.%s"
+msgstr "のみ( %s ) MBのRAMがdetected.%sされている"
+
+#: etc/inc/config.console.inc:61 etc/inc/config.console.inc:61
+msgid "Press ENTER to continue."
+msgstr "Enterキーを押して続行します。"
+
+#: etc/inc/config.console.inc:83 etc/inc/config.console.inc:495
+#: etc/inc/config.console.inc:497 etc/inc/config.console.inc:83
+#: etc/inc/config.console.inc:497
+msgid "No interfaces found!"
+msgstr "何のインターフェイスは、見つからない!"
+
+#: etc/inc/config.console.inc:181 etc/inc/config.console.inc:181
+msgid "VLAN interfaces:"
+msgstr "VLANインタフェース:"
+
+#: etc/inc/config.console.inc:207 etc/inc/config.console.inc:207
+msgid "Enter the WAN interface name or 'a' for auto-detection:"
+msgstr ": WANインターフェイス名、または自動検出のための「A」を入力してください"
+
+#: etc/inc/config.console.inc:215 etc/inc/config.console.inc:276
+#: etc/inc/config.console.inc:518 etc/inc/config.console.inc:520
+#: etc/inc/config.console.inc:244 etc/inc/config.console.inc:215
+#: etc/inc/config.console.inc:244 etc/inc/config.console.inc:276
+#: etc/inc/config.console.inc:520
+#, php-format
+msgid "%sInvalid interface name '%s'%s"
+msgstr "%sInvalidインタフェース名「 %s' %s"
+
+#: etc/inc/config.console.inc:222 etc/inc/config.console.inc:222
+#, php-format
+msgid ""
+"%sEnter the LAN interface name or 'a' for auto-detection %sNOTE: this "
+"enables full Firewalling/NAT mode.%s(or nothing if finished):%s"
+msgstr "「LANインタフェース名または''自動検出%sNOTEため%sEnter :これは「フルファイアウォー/ NAT mode.%s (または完成した場合Nothing)を有効にします。 %s"
+
+#: etc/inc/config.console.inc:244
+#, php-format
+msgid "%sInvalid interface name '%s'%s)"
+msgstr "%sInvalidインタフェース名「 %s' %s )"
+
+#: etc/inc/config.console.inc:261 etc/inc/config.console.inc:261
+#, php-format
+msgid "%sOptional interface %s description found: %s"
+msgstr "%s : %sOptionalインタフェースが記述発見を%s"
+
+#: etc/inc/config.console.inc:264
+#, php-format
+msgid "(or nothing if finished):%s"
+msgstr "(または何も終わっている場合) : %s"
+
+#: etc/inc/config.console.inc:270 etc/inc/config.console.inc:270
+msgid "Optional"
+msgstr "オプショナル"
+
+#: etc/inc/config.console.inc:304 etc/inc/config.console.inc:304
+msgid "The interfaces will be assigned as follows:"
+msgstr "次のようにインタフェースが割り当てられます。"
+
+#: etc/inc/config.console.inc:416 etc/inc/config.console.inc:418
+#: etc/inc/config.console.inc:418
+#, php-format
+msgid "%sWriting configuration..."
+msgstr "設定を%sWriting..."
+
+#: etc/inc/config.console.inc:418 etc/inc/config.console.inc:420
+#: etc/inc/config.console.inc:420
+#, php-format
+msgid "done.%s"
+msgstr "done.%s"
+
+#: etc/inc/config.console.inc:425 etc/inc/config.console.inc:427
+#: etc/inc/config.console.inc:427
+msgid "One moment while we reload the settings..."
+msgstr "一瞬我々は、設定をリロードしながら..."
+
+#: etc/inc/config.console.inc:429 etc/inc/config.console.inc:431
+#: etc/inc/config.console.inc:431
+msgid " done!"
+msgstr "行わ !"
+
+#: etc/inc/config.console.inc:449 etc/inc/config.console.inc:451
+#: etc/inc/config.console.inc:451
+#, php-format
+msgid "Detected link-up on interface %s.%s"
+msgstr "インタフェース%s.%sで検出されたリンクアップ"
+
+#: etc/inc/config.console.inc:454 etc/inc/config.console.inc:456
+#: etc/inc/config.console.inc:456
+#, php-format
+msgid "No link-up detected.%s"
+msgstr "いいえリンクアップdetected.%sん"
+
+#: etc/inc/config.console.inc:493 etc/inc/config.console.inc:495
+#: etc/inc/config.console.inc:495
+msgid "VLAN Capable interfaces:"
+msgstr "VLAN対応インターフェイス:"
+
+#: etc/inc/config.console.inc:508 etc/inc/config.console.inc:510
+#: etc/inc/config.console.inc:510
+msgid "No VLAN capable interfaces detected."
+msgstr "いいえ、VLANが可能なインターフェイスは、検出されません。"
+
+#: etc/inc/config.console.inc:512 etc/inc/config.console.inc:514
+#: etc/inc/config.console.inc:514
+msgid ""
+"Enter the parent interface name for the new VLAN (or nothing if finished):"
+msgstr "「新しいVLAN (または完成した場合はNothing)の親インタフェース名を入力します。"
+
+#: etc/inc/config.console.inc:525 etc/inc/config.console.inc:527
+#: etc/inc/config.console.inc:527
+msgid "Enter the VLAN tag (1-4094):"
+msgstr "VLANタグ( 1-4094 )を入力します。"
+
+#: etc/inc/config.console.inc:529 etc/inc/config.console.inc:531
+#: etc/inc/config.console.inc:531
+#, php-format
+msgid "%sInvalid VLAN tag '%s'%s"
+msgstr "%sInvalid VLANタグ「 %s' %s"
+
+#: etc/inc/config.lib.inc:79 etc/inc/config.lib.inc:79
+msgid "Config.xml unlocked."
+msgstr "config.xmlがアンロック。"
+
+#: etc/inc/config.lib.inc:82 etc/inc/config.lib.inc:82
+msgid "Invalid password entered. Please try again."
+msgstr "無効なパスワードが入力されました。もう一度やり直してください。"
+
+#: etc/inc/config.lib.inc:110 etc/inc/config.lib.inc:140
+#: etc/inc/config.lib.inc:271 etc/inc/config.lib.inc:110
+#: etc/inc/config.lib.inc:140 etc/inc/config.lib.inc:271
+msgid ""
+"Config.xml is corrupted and is 0 bytes. Could not restore a previous backup."
+msgstr "「 config.xmlという破損し、 0バイトである。以前のバックアップを復元できませんでしたされている。"
+
+#: etc/inc/config.lib.inc:138 etc/inc/config.lib.inc:149
+#: etc/inc/config.lib.inc:552 etc/inc/config.lib.inc:560
+#: etc/inc/config.lib.inc:577 etc/inc/config.lib.inc:555
+#: etc/inc/config.lib.inc:138 etc/inc/config.lib.inc:149
+#: etc/inc/config.lib.inc:555
+msgid "Could not restore config.xml."
+msgstr "config.xmlには復元できませんでした。"
+
+#: etc/inc/config.lib.inc:210 etc/inc/config.lib.inc:211
+#: etc/inc/config.lib.inc:210 etc/inc/config.lib.inc:211
+#, php-format
+msgid "%1$s is restoring the configuration %2$s"
+msgstr "は%1$sは、コンフィギュレーション%2$sを復元されている"
+
+#: etc/inc/config.lib.inc:233 etc/inc/config.lib.inc:233
+msgid "Resetting factory defaults..."
+msgstr "工場出荷時の設定をリセットする..."
+
+#: etc/inc/config.lib.inc:236 etc/inc/config.lib.inc:236
+msgid ""
+"No XML configuration file found - using factory defaults.\n"
+"Make sure that the configuration floppy disk with the conf/config.xml\n"
+"file is inserted. If it isn't, your configuration changes will be lost\n"
+"on reboot.\n"
+msgstr "「見つかりませんXML設定ファイル - 工場defaults.\n使用」を参照してください。そうでない場合は研究会/ config.xml\n "ファイルを使用して構成をフロッピーディスクが挿入されていることを確認し、設定の変更はlost\nできなくなります「 reboot.\n上"
+
+#: etc/inc/config.lib.inc:249 etc/inc/config.lib.inc:249
+#, php-format
+msgid "XML configuration file not found. %s cannot continue booting."
+msgstr "XML設定ファイルが見つかりません。 %sはブートを続行できません。"
+
+#: etc/inc/config.lib.inc:255 etc/inc/config.lib.inc:255
+msgid ""
+"Last known config found and restored. Please double check your "
+"configuration file for accuracy."
+msgstr "精度のための設定ファイル「最後の既知の設定が見つかり、復元された。あなたを再確認してください」 。"
+
+#: etc/inc/config.lib.inc:317 etc/inc/config.lib.inc:320
+#: etc/inc/config.lib.inc:320
+msgid "Disk is dirty. Running fsck -y"
+msgstr "ディスクが汚れています。 fsckを-Y稼働"
+
+#: etc/inc/config.lib.inc:328 etc/inc/config.lib.inc:331
+#: etc/inc/config.lib.inc:331
+msgid "File system is dirty. Launching FSCK for /"
+msgstr "ファイルシステムは汚れている。 /のための起動FSCK"
+
+#: etc/inc/config.lib.inc:379 etc/inc/config.lib.inc:382
+#: etc/inc/config.lib.inc:382
+#, php-format
+msgid "Start Configuration upgrade at %s, set execution timeout to 15 minutes"
+msgstr "%sでのコンフィギュレーションのアップグレード、 15分に設定され、実行のタイムアウトを開始"
+
+#: etc/inc/config.lib.inc:389 etc/inc/config.lib.inc:390
+#: etc/inc/config.lib.inc:392 etc/inc/config.lib.inc:393
+#: etc/inc/config.lib.inc:392 etc/inc/config.lib.inc:393
+msgid "Updated bogon update frequency to 3am"
+msgstr "午前3時に更新されたbogonの更新頻度"
+
+#: etc/inc/config.lib.inc:420 etc/inc/config.lib.inc:423
+#: etc/inc/config.lib.inc:423
+#, php-format
+msgid "Ended Configuration upgrade at %s"
+msgstr "%sでエンド構成のアップグレード"
+
+#: etc/inc/config.lib.inc:423 etc/inc/config.lib.inc:426
+#: etc/inc/config.lib.inc:426
+#, php-format
+msgid "Upgraded config version level from %1$s to %2$s"
+msgstr "%2$sには%1$sからアップグレードしたコンフィギュレーションのバージョン·レベル"
+
+#: etc/inc/config.lib.inc:512 etc/inc/config.lib.inc:520
+#: etc/inc/config.lib.inc:537 etc/inc/config.lib.inc:903
+#: etc/inc/config.lib.inc:903
+#, php-format
+msgid "%s made unknown change"
+msgstr "%sは、未知の変更を行った"
+
+#: etc/inc/config.lib.inc:525 etc/inc/config.lib.inc:533
+#: etc/inc/config.lib.inc:550 etc/inc/config.lib.inc:528
+#: etc/inc/config.lib.inc:528
+msgid "WARNING: Config contents could not be save. Could not open file!"
+msgstr "警告:構成内容は保存されませんでした。ファイルを開くことができませんでした!"
+
+#: etc/inc/config.lib.inc:527 etc/inc/config.lib.inc:535
+#: etc/inc/config.lib.inc:552 etc/inc/config.lib.inc:530
+#: etc/inc/config.lib.inc:530
+#, php-format
+msgid "Unable to open %s/config.xml for writing in write_config()%s"
+msgstr "write_config.()%sに書き込むため%s / config.xmlのを開くことができません。"
+
+#: etc/inc/config.lib.inc:636 etc/inc/config.lib.inc:644
+#: etc/inc/config.lib.inc:661 etc/inc/config.lib.inc:639
+#: etc/inc/config.lib.inc:639
+msgid "Reverted to"
+msgstr "に戻った"
+
+#: etc/inc/config.lib.inc:651 etc/inc/config.lib.inc:659
+#: etc/inc/config.lib.inc:676 etc/inc/config.lib.inc:654
+#: etc/inc/config.lib.inc:654
+msgid "Installing configuration..."
+msgstr "構成をインストール..."
+
+#: etc/inc/config.lib.inc:653 etc/inc/config.lib.inc:661
+#: etc/inc/config.lib.inc:678 etc/inc/config.lib.inc:656
+#: etc/inc/config.lib.inc:656
+msgid "Installing configuration ...."
+msgstr "構成をインストール...."
+
+#: etc/inc/config.lib.inc:704 etc/inc/config.lib.inc:712
+#: etc/inc/config.lib.inc:729 etc/inc/config.lib.inc:707
+#: etc/inc/config.lib.inc:707
+msgid "XML error: unable to open file"
+msgstr "XMLエラー:ファイルをオープンできません"
+
+#: etc/inc/config.lib.inc:710 etc/inc/config.lib.inc:718
+#: etc/inc/config.lib.inc:735 etc/inc/config.lib.inc:713
+#: etc/inc/config.lib.inc:713
+#, php-format
+msgid "%1$s at line %2$d"
+msgstr "行%では%1$s 2 $ dの"
+
+#: etc/inc/config.lib.inc:756 etc/inc/config.lib.inc:758
+#: etc/inc/config.lib.inc:764 etc/inc/config.lib.inc:766
+#: etc/inc/config.lib.inc:781 etc/inc/config.lib.inc:783
+#: etc/inc/config.lib.inc:759 etc/inc/config.lib.inc:761
+#: etc/inc/config.lib.inc:759 etc/inc/config.lib.inc:761
+#, php-format
+msgid "The backup cache file %s is corrupted. Unlinking."
+msgstr "バックアップキャッシュファイル%sが破損しています。リンク解除。"
+
+#: etc/inc/easyrule.inc:116 etc/inc/easyrule.inc:117 etc/inc/easyrule.inc:117
+msgid "Easy Rule: Blocked from Firewall Log View"
+msgstr "簡単なルール:ファイアウォールログの表示がブロックされ"
+
+#: etc/inc/easyrule.inc:165 etc/inc/easyrule.inc:173 etc/inc/easyrule.inc:181
+#: etc/inc/easyrule.inc:177 etc/inc/easyrule.inc:185 etc/inc/easyrule.inc:178
+#: etc/inc/easyrule.inc:186 etc/inc/easyrule.inc:178 etc/inc/easyrule.inc:186
+msgid "Entry added"
+msgstr "副出記入"
+
+#: etc/inc/easyrule.inc:170 etc/inc/easyrule.inc:178 etc/inc/easyrule.inc:182
+#: etc/inc/easyrule.inc:183 etc/inc/easyrule.inc:183
+msgid "Hosts blocked from Firewall Log view"
+msgstr "ファイアウォールログビューからブロックのホスト"
+
+#: etc/inc/easyrule.inc:249 etc/inc/easyrule.inc:257 etc/inc/easyrule.inc:262
+#: etc/inc/easyrule.inc:263 etc/inc/easyrule.inc:263
+msgid "Easy Rule: Passed from Firewall Log View"
+msgstr "簡単なルール:ファイアウォールログビューから渡された"
+
+#: etc/inc/easyrule.inc:280 etc/inc/easyrule.inc:303 etc/inc/easyrule.inc:309
+#: etc/inc/easyrule.inc:313 etc/inc/easyrule.inc:318 etc/inc/easyrule.inc:318
+msgid "Tried to block invalid IP:"
+msgstr "無効なIPをブロックしようとした。"
+
+#: etc/inc/easyrule.inc:284 etc/inc/easyrule.inc:307 etc/inc/easyrule.inc:313
+#: etc/inc/easyrule.inc:317 etc/inc/easyrule.inc:322 etc/inc/easyrule.inc:322
+msgid "Invalid interface for block rule:"
+msgstr "ブロックルールの無効なインターフェイス:"
+
+#: etc/inc/easyrule.inc:287 etc/inc/easyrule.inc:310 etc/inc/easyrule.inc:316
+#: etc/inc/easyrule.inc:320 etc/inc/easyrule.inc:325 etc/inc/easyrule.inc:325
+msgid "Host added successfully"
+msgstr "ホスト正常に追加"
+
+#: etc/inc/easyrule.inc:289 etc/inc/easyrule.inc:312 etc/inc/easyrule.inc:318
+#: etc/inc/easyrule.inc:322 etc/inc/easyrule.inc:327 etc/inc/easyrule.inc:327
+msgid "Failed to create block rule, alias, or add host."
+msgstr "ブロックルール、エイリアス、またはホストを追加の作成に失敗しました。"
+
+#: etc/inc/easyrule.inc:292 etc/inc/easyrule.inc:315 etc/inc/easyrule.inc:321
+#: etc/inc/easyrule.inc:325 etc/inc/easyrule.inc:330 etc/inc/easyrule.inc:330
+msgid "Tried to block but had no host IP or interface"
+msgstr "ブロックしようとしたが、持っていたんホストIPませんまたはインタフェース"
+
+#: etc/inc/easyrule.inc:294 etc/inc/easyrule.inc:317 etc/inc/easyrule.inc:323
+#: etc/inc/easyrule.inc:327 etc/inc/easyrule.inc:332 etc/inc/easyrule.inc:332
+msgid "Unknown block error."
+msgstr "不明なブロックエラー。"
+
+#: etc/inc/easyrule.inc:303 etc/inc/easyrule.inc:326 etc/inc/easyrule.inc:334
+#: etc/inc/easyrule.inc:338 etc/inc/easyrule.inc:343 etc/inc/easyrule.inc:343
+msgid "Invalid interface for pass rule:"
+msgstr "パス·ルールの無効なインターフェイス:"
+
+#: etc/inc/easyrule.inc:306 etc/inc/easyrule.inc:329 etc/inc/easyrule.inc:337
+#: etc/inc/easyrule.inc:341 etc/inc/easyrule.inc:346 etc/inc/easyrule.inc:346
+msgid "Invalid protocol for pass rule:"
+msgstr "パス·ルールの無効なプロトコル:"
+
+#: etc/inc/easyrule.inc:309 etc/inc/easyrule.inc:332 etc/inc/easyrule.inc:340
+#: etc/inc/easyrule.inc:344 etc/inc/easyrule.inc:349 etc/inc/easyrule.inc:349
+msgid "Tried to pass invalid source IP:"
+msgstr "無効な送信元IPアドレスを渡そうとしました。"
+
+#: etc/inc/easyrule.inc:312 etc/inc/easyrule.inc:335 etc/inc/easyrule.inc:343
+#: etc/inc/easyrule.inc:347 etc/inc/easyrule.inc:352 etc/inc/easyrule.inc:352
+msgid "Tried to pass invalid destination IP:"
+msgstr "無効な送信先IPを渡そうとしました。"
+
+#: etc/inc/easyrule.inc:316 etc/inc/easyrule.inc:339 etc/inc/easyrule.inc:347
+#: etc/inc/easyrule.inc:351 etc/inc/easyrule.inc:356 etc/inc/easyrule.inc:356
+msgid "Missing destination port:"
+msgstr "不足している宛先ポート:"
+
+#: etc/inc/easyrule.inc:319 etc/inc/easyrule.inc:342 etc/inc/easyrule.inc:350
+#: etc/inc/easyrule.inc:354 etc/inc/easyrule.inc:359 etc/inc/easyrule.inc:359
+msgid "Tried to pass invalid destination port:"
+msgstr "無効な宛先ポートを渡そうとしました。"
+
+#: etc/inc/easyrule.inc:326 etc/inc/easyrule.inc:349 etc/inc/easyrule.inc:357
+#: etc/inc/easyrule.inc:361 etc/inc/easyrule.inc:366 etc/inc/easyrule.inc:366
+msgid "Successfully added pass rule!"
+msgstr "正常に追加され、パスのルール !"
+
+#: etc/inc/easyrule.inc:328 etc/inc/easyrule.inc:351 etc/inc/easyrule.inc:359
+#: etc/inc/easyrule.inc:363 etc/inc/easyrule.inc:368 etc/inc/easyrule.inc:368
+msgid "Failed to add pass rule."
+msgstr "パス·ルールを追加できませんでした。"
+
+#: etc/inc/easyrule.inc:331 etc/inc/easyrule.inc:354 etc/inc/easyrule.inc:362
+#: etc/inc/easyrule.inc:366 etc/inc/easyrule.inc:371 etc/inc/easyrule.inc:371
+msgid "Missing parameters for pass rule."
+msgstr "パス·ルールのパラメータがありません。"
+
+#: etc/inc/easyrule.inc:333 etc/inc/easyrule.inc:356 etc/inc/easyrule.inc:364
+#: etc/inc/easyrule.inc:368 etc/inc/easyrule.inc:373 etc/inc/easyrule.inc:373
+msgid "Unknown pass error."
+msgstr "未知のパスエラー。"
+
+#: etc/inc/filter_log.inc:164 etc/inc/filter_log.inc:167
+#: etc/inc/filter_log.inc:191 etc/inc/filter_log.inc:201
+#: etc/inc/filter_log.inc:201
+#, php-format
+msgid ""
+"There was a error parsing rule: %s. Please report to mailing list or forum."
+msgstr "%s.がメーリングリストやフォーラムに報告してください。「エラー解析ルールがありました。"
+
+#: etc/inc/filter_log.inc:208 etc/inc/filter_log.inc:210
+#: etc/inc/filter_log.inc:213 etc/inc/filter_log.inc:237
+#: etc/inc/filter_log.inc:247 etc/inc/filter_log.inc:247
+#, php-format
+msgid "Service %1$s/%2$s: %3$s"
+msgstr "サービス%1$s/%2$s : %3$s"
+
+#: etc/inc/gwlb.inc:230 etc/inc/gwlb.inc:237 etc/inc/gwlb.inc:242
+#: etc/inc/gwlb.inc:244 etc/inc/gwlb.inc:244
+#, php-format
+msgid ""
+"Removing static route for monitor %1$s and adding a new route through %2$s"
+msgstr "「モニターは%1$sのスタティックルートの取り外しと%2$sを通じて新しいルートを追加する"
+
+#: etc/inc/gwlb.inc:501 etc/inc/gwlb.inc:727 etc/inc/gwlb.inc:750
+#, php-format
+msgid "MONITOR: %s is down, omitting from routing group"
+msgstr "モニタ: %s 、グループをルーティングから取り出し、ダウンしている"
+
+#: etc/inc/gwlb.inc:505 etc/inc/gwlb.inc:731 etc/inc/gwlb.inc:754
+#, php-format
+msgid "MONITOR: %s has packet loss, omitting from routing group"
+msgstr "MONITOR : %sは、ルーティンググループから除去し、パケット損失を有する"
+
+#: etc/inc/gwlb.inc:509 etc/inc/gwlb.inc:735 etc/inc/gwlb.inc:758
+#, php-format
+msgid "MONITOR: %s has high latency, omitting from routing group"
+msgstr "モニタ: %s 、グループをルーティングから取り出し、大きな遅延がある"
+
+#: etc/inc/gwlb.inc:526 etc/inc/gwlb.inc:752 etc/inc/gwlb.inc:775
+msgid "Gateways status could not be determined, considering all as up/active."
+msgstr "ゲートウェイの状態は、アクティブ/アップとして、すべてを考慮し、決定することができなかった。"
+
+#: etc/inc/gwlb.inc:580 etc/inc/gwlb.inc:809 etc/inc/gwlb.inc:835
+#: etc/inc/gwlb.inc:844 etc/inc/gwlb.inc:823 etc/inc/gwlb.inc:807
+#: etc/inc/gwlb.inc:807
+#, php-format
+msgid "Updating gateway group gateway for %1$s - new gateway is %2$s"
+msgstr "は%1$sのゲートウェイ·グループゲートウェイの更新 - 新規ゲートウェイは、 %2$sです"
+
+#: etc/inc/ipsec.inc:39 etc/inc/ipsec.inc:39
+msgid "My IP address"
+msgstr "私のIPアドレス"
+
+#: etc/inc/ipsec.inc:40 etc/inc/ipsec.inc:49
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:65
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:114
+#: usr/local/www/diag_logs_vpn.php:178
+#: usr/local/www/status_captiveportal.php:160
+#: usr/local/www/services_captiveportal.php:602
+#: usr/local/www/services_captiveportal.php:623
+#: usr/local/www/services_captiveportal.php:642
+#: usr/local/www/services_captiveportal.php:661
+#: usr/local/www/services_captiveportal_ip.php:117
+#: usr/local/www/services_captiveportal_ip_edit.php:195
+#: usr/local/www/services_dhcp.php:891
+#: usr/local/www/services_dhcp_edit.php:221
+#: usr/local/www/services_dnsmasq_edit.php:80
+#: usr/local/www/services_dnsmasq_edit.php:156
+#: usr/local/www/vpn_pptp_users.php:99
+#: usr/local/www/vpn_pptp_users_edit.php:160 usr/local/www/diag_arp.php:313
+#: usr/local/www/status_dhcp_leases.php:318
+#: usr/local/www/system_advanced_network.php:226
+#: usr/local/www/vpn_ipsec_phase2.php:635 usr/local/www/vpn_l2tp_users.php:102
+#: usr/local/www/vpn_l2tp_users_edit.php:168
+#: usr/local/www/services_dnsmasq_edit.php:81
+#: usr/local/www/services_dnsmasq_edit.php:211
+#: usr/local/www/diag_logs_vpn.php:177
+#: usr/local/www/services_captiveportal.php:638
+#: usr/local/www/services_captiveportal.php:659
+#: usr/local/www/services_captiveportal.php:681
+#: usr/local/www/services_captiveportal.php:700
+#: usr/local/www/status_dhcp_leases.php:339
+#: usr/local/www/services_dhcp.php:929 usr/local/www/vpn_ipsec_phase2.php:661
+#: usr/local/www/services_dhcp_edit.php:224
+#: usr/local/www/services_dnsmasq_edit.php:212
+#: usr/local/www/services_captiveportal_ip.php:115
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:72
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:137
+#: usr/local/www/vpn_l2tp_users.php:103
+#: usr/local/www/services_captiveportal.php:636
+#: usr/local/www/services_captiveportal.php:657
+#: usr/local/www/services_captiveportal.php:679
+#: usr/local/www/services_captiveportal.php:698
+#: usr/local/www/status_dhcp_leases.php:341
+#: usr/local/www/services_captiveportal_ip_edit.php:193
+#: usr/local/www/services_dhcp.php:1133 usr/local/www/vpn_ipsec_phase2.php:757
+#: usr/local/www/vpn_pptp_users_edit.php:161
+#: usr/local/www/services_dhcp_edit.php:223
+#: usr/local/www/vpn_l2tp_users_edit.php:169
+#: usr/local/www/vpn_pptp_users.php:100
+#: usr/local/www/services_captiveportal_ip_edit.php:187
+#: usr/local/www/services_dhcp_edit.php:351
+#: usr/local/www/services_dhcp.php:1152
+#: usr/local/www/status_captiveportal.php:146
+#: usr/local/www/services_captiveportal.php:637
+#: usr/local/www/services_captiveportal.php:658
+#: usr/local/www/services_captiveportal.php:680
+#: usr/local/www/services_captiveportal.php:699
+#: usr/local/www/vpn_ipsec_phase2.php:778 usr/local/www/services_dhcp.php:1172
+#: usr/local/www/services_captiveportal.php:653
+#: usr/local/www/services_captiveportal.php:674
+#: usr/local/www/services_captiveportal.php:696
+#: usr/local/www/services_captiveportal.php:715
+#: usr/local/www/system_advanced_network.php:227
+#: usr/local/www/services_captiveportal_ip_edit.php:187
+#: usr/local/www/diag_arp.php:313 usr/local/www/vpn_pptp_users.php:100
+#: usr/local/www/services_captiveportal_ip.php:115
+#: usr/local/www/services_dhcp_edit.php:351
+#: usr/local/www/services_dhcp.php:1172 usr/local/www/vpn_l2tp_users.php:103
+#: usr/local/www/status_captiveportal.php:146
+#: usr/local/www/services_captiveportal.php:653
+#: usr/local/www/services_captiveportal.php:674
+#: usr/local/www/services_captiveportal.php:696
+#: usr/local/www/services_captiveportal.php:715
+#: usr/local/www/status_dhcp_leases.php:341
+#: usr/local/www/vpn_l2tp_users_edit.php:169
+#: usr/local/www/services_dnsmasq_edit.php:81
+#: usr/local/www/services_dnsmasq_edit.php:212
+#: usr/local/www/diag_logs_vpn.php:177
+#: usr/local/www/vpn_pptp_users_edit.php:161
+#: usr/local/www/system_advanced_network.php:227
+#: usr/local/www/vpn_ipsec_phase2.php:778
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:72
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:137
+#: etc/inc/ipsec.inc:40 etc/inc/ipsec.inc:49
+msgid "IP address"
+msgstr "IPアドレス"
+
+#: etc/inc/ipsec.inc:41 etc/inc/ipsec.inc:50
+#: usr/local/www/system_camanager.php:476
+#: usr/local/www/system_certmanager.php:589
+#: usr/local/www/system_certmanager.php:672
+#: usr/local/www/system_certmanager.php:705
+#: usr/local/www/system_certmanager.php:838
+#: usr/local/www/system_camanager.php:477
+#: usr/local/www/system_camanager.php:500
+#: usr/local/www/system_certmanager.php:730
+#: usr/local/www/system_certmanager.php:879
+#: usr/local/www/system_certmanager.php:731
+#: usr/local/www/system_certmanager.php:883
+#: usr/local/www/system_camanager.php:500
+#: usr/local/www/system_certmanager.php:731
+#: usr/local/www/system_certmanager.php:883 etc/inc/ipsec.inc:41
+#: etc/inc/ipsec.inc:50
+msgid "Distinguished name"
+msgstr "識別名"
+
+#: etc/inc/ipsec.inc:42 etc/inc/ipsec.inc:51 etc/inc/ipsec.inc:42
+#: etc/inc/ipsec.inc:51
+msgid "User distinguished name"
+msgstr "ユーザー識別名"
+
+#: etc/inc/ipsec.inc:43 etc/inc/ipsec.inc:52 etc/inc/ipsec.inc:43
+#: etc/inc/ipsec.inc:52
+msgid "ASN.1 distinguished Name"
+msgstr "ASN.1の識別名"
+
+#: etc/inc/ipsec.inc:44 etc/inc/ipsec.inc:53 etc/inc/ipsec.inc:44
+#: etc/inc/ipsec.inc:53
+msgid "KeyID tag"
+msgstr "KEYIDタグ"
+
+#: etc/inc/ipsec.inc:45 usr/local/www/services_dhcp.php:722
+#: usr/local/www/fbegin.inc:128 usr/local/www/services_dhcpv6.php:648
+#: usr/local/www/fbegin.inc:145 usr/local/www/services_dhcp.php:760
+#: usr/local/www/services_dhcpv6.php:741 usr/local/www/fbegin.inc:154
+#: usr/local/www/services_dhcp.php:942 usr/local/www/services_dhcpv6.php:672
+#: usr/local/www/services_dhcp_edit.php:451
+#: usr/local/www/services_dhcp.php:955 usr/local/www/services_dhcpv6.php:689
+#: usr/local/www/fbegin.inc:146 usr/local/www/services_dhcp.php:975
+#: usr/local/www/services_dhcp_edit.php:451
+#: usr/local/www/services_dhcp.php:975 usr/local/www/services_dhcpv6.php:689
+#: usr/local/www/fbegin.inc:146 etc/inc/ipsec.inc:45
+msgid "Dynamic DNS"
+msgstr "ダイナミックDNS"
+
+#: etc/inc/ipsec.inc:48 etc/inc/ipsec.inc:48
+msgid "Peer IP address"
+msgstr "ピアIPアドレス"
+
+#: etc/inc/ipsec.inc:256 usr/local/www/vpn_ipsec.php:206
+#: usr/local/www/vpn_ipsec_phase1.php:358
+#: usr/local/www/vpn_ipsec_phase2.php:255 usr/local/www/vpn_ipsec.php:217
+#: usr/local/www/vpn_ipsec_phase2.php:268 etc/inc/ipsec.inc:281
+#: usr/local/www/vpn_ipsec.php:216 usr/local/www/vpn_ipsec_phase2.php:294
+#: usr/local/www/vpn_ipsec.php:222 usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase2.php:316 etc/inc/ipsec.inc:289
+#: usr/local/www/vpn_ipsec.php:222 usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase2.php:316 etc/inc/ipsec.inc:289
+msgid "Mobile Client"
+msgstr "移動クライアント"
+
+#: etc/inc/ipsec.inc:258 usr/local/www/interfaces_bridge_edit.php:428
+#: usr/local/www/firewall_nat_edit.php:797
+#: usr/local/www/firewall_nat_edit.php:828 usr/local/www/interfaces.php:1032
+#: usr/local/www/interfaces.php:1033 usr/local/www/interfaces.php:1385
+#: usr/local/www/interfaces.php:1491 usr/local/www/interfaces.php:1567
+#: usr/local/www/vpn_ipsec_phase2.php:435
+#: usr/local/www/interfaces_bridge_edit.php:437
+#: usr/local/www/vpn_ipsec_phase2.php:461
+#: usr/local/www/firewall_nat_edit.php:805
+#: usr/local/www/firewall_nat_edit.php:836 usr/local/www/interfaces.php:1118
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1489
+#: usr/local/www/interfaces.php:1597 etc/inc/ipsec.inc:283
+#: usr/local/www/system_advanced_misc.php:386
+#: usr/local/www/interfaces_bridge_edit.php:438
+#: usr/local/www/vpn_ipsec_phase2.php:527
+#: usr/local/www/vpn_ipsec_phase2.php:563
+#: usr/local/www/firewall_nat_edit.php:804
+#: usr/local/www/firewall_nat_edit.php:835 usr/local/www/interfaces.php:1106
+#: usr/local/www/interfaces.php:1107 usr/local/www/interfaces.php:1477
+#: usr/local/www/interfaces.php:1585 usr/local/www/firewall_nat_edit.php:799
+#: usr/local/www/firewall_nat_edit.php:830
+#: usr/local/www/diag_system_pftop.php:155
+#: usr/local/www/system_advanced_misc.php:398
+#: usr/local/www/interfaces_bridge_edit.php:439
+#: usr/local/www/vpn_ipsec_phase2.php:584 usr/local/www/interfaces.php:1120
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1490
+#: usr/local/www/interfaces.php:1595 etc/inc/ipsec.inc:292
+#: usr/local/www/firewall_nat_edit.php:811
+#: usr/local/www/firewall_nat_edit.php:842
+#: usr/local/www/system_advanced_misc.php:445
+#: usr/local/www/interfaces.php:1162 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1535 usr/local/www/interfaces.php:1641
+#: usr/local/www/firewall_nat_edit.php:812
+#: usr/local/www/firewall_nat_edit.php:843
+#: usr/local/www/interfaces_bridge_edit.php:443
+#: usr/local/www/interfaces.php:1157 usr/local/www/interfaces.php:1158
+#: usr/local/www/interfaces.php:1529 usr/local/www/interfaces.php:1634
+#: usr/local/www/firewall_nat_edit.php:812
+#: usr/local/www/firewall_nat_edit.php:843
+#: usr/local/www/diag_system_pftop.php:155
+#: usr/local/www/system_advanced_misc.php:445
+#: usr/local/www/interfaces_bridge_edit.php:443
+#: usr/local/www/vpn_ipsec_phase2.php:584 usr/local/www/interfaces.php:1157
+#: usr/local/www/interfaces.php:1158 usr/local/www/interfaces.php:1529
+#: usr/local/www/interfaces.php:1634 etc/inc/ipsec.inc:292
+msgid "None"
+msgstr "なし"
+
+#: etc/inc/meta.inc:68 etc/inc/meta.inc:68
+#, php-format
+msgid "list_phpfiles: unable to examine path %s\n"
+msgstr "list_phpfiles :パス%s\nを調べることができない"
+
+#: etc/inc/meta.inc:99 etc/inc/meta.inc:99
+#, php-format
+msgid "unable to read %s\n"
+msgstr "%s\nを読み取ることができません"
+
+#: etc/inc/meta.inc:132 etc/inc/meta.inc:132
+#, php-format
+msgid "error: tag mismatch ( %1$s != %2$s ) in '%3$s'%4$s"
+msgstr "エラー:' %3$s' % 4 $ s内のタグが一致しません(は%1$sの = %2$s !)"
+
+#: etc/inc/meta.inc:143 etc/inc/meta.inc:143
+#, php-format
+msgid "warning: tag %1$s has no data in '%2$s'%3$s"
+msgstr "警告:タグは%1$sは「 %2$s' %3$s内のデータがありません"
+
+#: etc/inc/meta.inc:163 etc/inc/meta.inc:163
+#, php-format
+msgid "warning: tag %1$s has malformed data in '%2$s'%3$s"
+msgstr "警告:タグは%1$sは「 %2$s' %3$s内のデータを不正な形式している"
+
+#: etc/inc/meta.inc:185 etc/inc/meta.inc:185
+#, php-format
+msgid "warning: tag %1$s has invalid data in '%2$s'%3$s"
+msgstr "警告:タグは%1$sは「 %2$s' %3$sに無効なデータを持っている"
+
+#: etc/inc/priv.defs.inc:10 etc/inc/priv.defs.inc:10
+msgid "WebCfg - All pages"
+msgstr "WebCfg - 全ページ"
+
+#: etc/inc/priv.defs.inc:11 etc/inc/priv.defs.inc:11
+msgid "Allow access to all pages"
+msgstr "すべてのページへのアクセスを許可"
+
+#: etc/inc/priv.defs.inc:16 etc/inc/priv.defs.inc:16
+msgid "WebCfg - Status: CARP page"
+msgstr "WebCfg - ステータス: CARPページ"
+
+#: etc/inc/priv.defs.inc:17 etc/inc/priv.defs.inc:17
+msgid "Allow access to the 'Status: CARP' page."
+msgstr "ページ: 「 CARP状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:22 etc/inc/priv.defs.inc:22
+msgid "WebCfg - Crash reporter"
+msgstr "WebCfg - クラッシュレポータ"
+
+#: etc/inc/priv.defs.inc:23 etc/inc/priv.defs.inc:23
+msgid "Uploads crash reports to pfSense and or deletes crash reports."
+msgstr "pfSenseとORへのアップロードのクラッシュレポートは、クラッシュレポートを削除します。"
+
+#: etc/inc/priv.defs.inc:28 etc/inc/priv.defs.inc:28
+msgid "WebCfg - Diagnostics: ARP Table page"
+msgstr "WebCfg - 診断: ARPテーブルページ"
+
+#: etc/inc/priv.defs.inc:29 etc/inc/priv.defs.inc:29
+msgid "Allow access to the 'Diagnostics: ARP Table' page."
+msgstr "ページ: 「 ARPテーブル診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:34 etc/inc/priv.defs.inc:34
+msgid "WebCfg - Diagnostics: Authentication page"
+msgstr "WebCfg - 診断:認証ページ"
+
+#: etc/inc/priv.defs.inc:35 etc/inc/priv.defs.inc:35
+msgid "Allow access to the 'Diagnostics: Authentication' page."
+msgstr "ページ:'認証診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:40 etc/inc/priv.defs.inc:40
+msgid "WebCfg - Diagnostics: Backup/restore page"
+msgstr "WebCfg - 診断:バックアップ/ページを復元する"
+
+#: etc/inc/priv.defs.inc:41 etc/inc/priv.defs.inc:41
+msgid "Allow access to the 'Diagnostics: Backup/restore' page."
+msgstr "ページ: 「バックアップ/リストア診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:46 etc/inc/priv.defs.inc:46
+msgid "WebCfg - Diagnostics: Configuration History page"
+msgstr "WebCfg - 診断:構成履歴ページ"
+
+#: etc/inc/priv.defs.inc:47 etc/inc/priv.defs.inc:47
+msgid "Allow access to the 'Diagnostics: Configuration History' page."
+msgstr "ページ: 「設定履歴診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:52 etc/inc/priv.defs.inc:52
+msgid "WebCfg - Diagnostics: Factory defaults page"
+msgstr "WebCfg - 診断:工場出荷時のデフォルト設定ページ"
+
+#: etc/inc/priv.defs.inc:53 etc/inc/priv.defs.inc:53
+msgid "Allow access to the 'Diagnostics: Factory defaults' page."
+msgstr "ページ: 「工場出荷時のデフォルト値診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:58 etc/inc/priv.defs.inc:58
+msgid "WebCfg - Diagnostics: Show States page"
+msgstr "WebCfg - 診断:表示状態ページ"
+
+#: etc/inc/priv.defs.inc:59 etc/inc/priv.defs.inc:59
+msgid "Allow access to the 'Diagnostics: Show States' page."
+msgstr "' :表示状態の診断」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:64 etc/inc/priv.defs.inc:70 etc/inc/priv.defs.inc:70
+msgid "WebCfg - Status: IPsec page"
+msgstr "WebCfg - ステータス: IPsecのページ"
+
+#: etc/inc/priv.defs.inc:65 etc/inc/priv.defs.inc:71 etc/inc/priv.defs.inc:71
+msgid "Allow access to the 'Status: IPsec' page."
+msgstr "ページ: 「 IPsecの状況」にアクセスすることができます。"
+
+#: etc/inc/priv.defs.inc:70 etc/inc/priv.defs.inc:76 etc/inc/priv.defs.inc:76
+msgid "WebCfg - Status: IPsec: SAD page"
+msgstr "WebCfg - ステータス: IPsecの: SADページ"
+
+#: etc/inc/priv.defs.inc:71 etc/inc/priv.defs.inc:77 etc/inc/priv.defs.inc:77
+msgid "Allow access to the 'Status: IPsec: SAD' page."
+msgstr "ページ': IPsecのSAD状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:76 etc/inc/priv.defs.inc:82 etc/inc/priv.defs.inc:82
+msgid "WebCfg - Status: IPsec: SPD page"
+msgstr "WebCfg - ステータス: IPsecの: SPDページ"
+
+#: etc/inc/priv.defs.inc:77 etc/inc/priv.defs.inc:83 etc/inc/priv.defs.inc:83
+msgid "Allow access to the 'Status: IPsec: SPD' page."
+msgstr "ページ': IPsecのSPDステータス'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:82 etc/inc/priv.defs.inc:88 etc/inc/priv.defs.inc:88
+msgid "WebCfg - Diag IPsec XML page"
+msgstr "WebCfg - ダイアグのIPsec XMLページ"
+
+#: etc/inc/priv.defs.inc:83 etc/inc/priv.defs.inc:89 etc/inc/priv.defs.inc:89
+msgid "Allow access to the 'Diag IPsec XML' page."
+msgstr "「ダイアグのIPsec XML 」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:88 etc/inc/priv.defs.inc:184
+#: etc/inc/priv.defs.inc:220 etc/inc/priv.defs.inc:226
+#: etc/inc/priv.defs.inc:202 etc/inc/priv.defs.inc:238
+#: etc/inc/priv.defs.inc:244 etc/inc/priv.defs.inc:94
+#: etc/inc/priv.defs.inc:208 etc/inc/priv.defs.inc:250
+#: etc/inc/priv.defs.inc:94 etc/inc/priv.defs.inc:208
+#: etc/inc/priv.defs.inc:244 etc/inc/priv.defs.inc:250
+msgid "WebCfg - Diagnostics: System Activity"
+msgstr "WebCfg - 診断:システムアクティビティ"
+
+#: etc/inc/priv.defs.inc:89 etc/inc/priv.defs.inc:185
+#: etc/inc/priv.defs.inc:221 etc/inc/priv.defs.inc:227
+#: etc/inc/priv.defs.inc:203 etc/inc/priv.defs.inc:239
+#: etc/inc/priv.defs.inc:245 etc/inc/priv.defs.inc:95
+#: etc/inc/priv.defs.inc:209 etc/inc/priv.defs.inc:251
+#: etc/inc/priv.defs.inc:95 etc/inc/priv.defs.inc:209
+#: etc/inc/priv.defs.inc:245 etc/inc/priv.defs.inc:251
+msgid "Allows access to the 'Diagnostics: System Activity' page"
+msgstr "ことができます'診断:システム動作'へのアクセスページ"
+
+#: etc/inc/priv.defs.inc:94 etc/inc/priv.defs.inc:100
+#: etc/inc/priv.defs.inc:100
+msgid "WebCfg - Diagnostics: Logs: System page"
+msgstr "WebCfg - 診断:ログ: Systemページ"
+
+#: etc/inc/priv.defs.inc:95 etc/inc/priv.defs.inc:101
+#: etc/inc/priv.defs.inc:101
+msgid "Allow access to the 'Diagnostics: Logs: System' page."
+msgstr "ページ':ログシステム診断プログラム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:100 etc/inc/priv.defs.inc:106
+#: etc/inc/priv.defs.inc:106
+msgid "WebCfg - Status: System logs: Portal Auth page"
+msgstr "WebCfg - ステータス:システムログ:ポータル認証ページ"
+
+#: etc/inc/priv.defs.inc:101 etc/inc/priv.defs.inc:107
+#: etc/inc/priv.defs.inc:107
+msgid "Allow access to the 'Status: System logs: Portal Auth' page."
+msgstr "ページ':システムログポータル認証ステータス'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:106 etc/inc/priv.defs.inc:112
+#: etc/inc/priv.defs.inc:112
+msgid "WebCfg - Diagnostics: Logs: DHCP page"
+msgstr "WebCfg - 診断:ログ: DHCPページ"
+
+#: etc/inc/priv.defs.inc:107 etc/inc/priv.defs.inc:113
+#: etc/inc/priv.defs.inc:113
+msgid "Allow access to the 'Diagnostics: Logs: DHCP' page."
+msgstr "ページ':ログDHCPの診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:112 etc/inc/priv.defs.inc:118
+#: etc/inc/priv.defs.inc:118
+msgid "WebCfg - Diagnostics: Logs: Firewall page"
+msgstr "WebCfg - 診断:ログ:ファイアウォールのページ"
+
+#: etc/inc/priv.defs.inc:113 etc/inc/priv.defs.inc:119
+#: etc/inc/priv.defs.inc:119
+msgid "Allow access to the 'Diagnostics: Logs: Firewall' page."
+msgstr "ページ':ログファイアウォール診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:118 etc/inc/priv.defs.inc:136
+#: etc/inc/priv.defs.inc:142 etc/inc/priv.defs.inc:142
+msgid "WebCfg - Hidden: No longer included page"
+msgstr "WebCfg - 非表示:もう含まページ"
+
+#: etc/inc/priv.defs.inc:119 etc/inc/priv.defs.inc:137
+#: etc/inc/priv.defs.inc:143 etc/inc/priv.defs.inc:143
+msgid "Allow access to the 'Hidden: No longer included' page."
+msgstr "ページ:'はもはや含まれて隠された'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:124 etc/inc/priv.defs.inc:142
+#: etc/inc/priv.defs.inc:160 etc/inc/priv.defs.inc:148
+#: etc/inc/priv.defs.inc:166 etc/inc/priv.defs.inc:148
+#: etc/inc/priv.defs.inc:166
+msgid "WebCfg - Status: System logs: IPsec VPN page"
+msgstr "WebCfg - ステータス:システムログ: IPsec VPNのページ"
+
+#: etc/inc/priv.defs.inc:125 etc/inc/priv.defs.inc:143
+#: etc/inc/priv.defs.inc:161 etc/inc/priv.defs.inc:149
+#: etc/inc/priv.defs.inc:167 etc/inc/priv.defs.inc:149
+#: etc/inc/priv.defs.inc:167
+msgid "Allow access to the 'Status: System logs: IPsec VPN' page."
+msgstr "ページ':システムログのIPsec VPNの状況」にアクセスすることができます。"
+
+#: etc/inc/priv.defs.inc:130
+msgid "WebCfg - Status: System logs: OpenNTPD page"
+msgstr "WebCfg - ステータス:システムログ: OpenNTPDページ"
+
+#: etc/inc/priv.defs.inc:131
+msgid "Allow access to the 'Status: System logs: OpenNTPD' page."
+msgstr "ページ':システムログOpenNTPD状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:136 etc/inc/priv.defs.inc:154
+#: etc/inc/priv.defs.inc:160 etc/inc/priv.defs.inc:160
+msgid "WebCfg - Status: System logs: OpenVPN page"
+msgstr "WebCfg - ステータス:システムログ: OpenVPNのページ"
+
+#: etc/inc/priv.defs.inc:137 etc/inc/priv.defs.inc:155
+#: etc/inc/priv.defs.inc:161 etc/inc/priv.defs.inc:161
+msgid "Allow access to the 'Status: System logs: OpenVPN' page."
+msgstr "ページ':システムログOpenVPNの状況」にアクセスすることができます。"
+
+#: etc/inc/priv.defs.inc:148 etc/inc/priv.defs.inc:166
+#: etc/inc/priv.defs.inc:172 etc/inc/priv.defs.inc:172
+msgid "WebCfg - Status: System logs: Load Balancer page"
+msgstr "WebCfg - ステータス:システムログ:ロードバランサページ"
+
+#: etc/inc/priv.defs.inc:149 etc/inc/priv.defs.inc:167
+#: etc/inc/priv.defs.inc:173 etc/inc/priv.defs.inc:173
+msgid "Allow access to the 'Status: System logs: Load Balancer' page."
+msgstr "ページ':システムログは、Load Balancerの状態」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:154 etc/inc/priv.defs.inc:172
+#: etc/inc/priv.defs.inc:178 etc/inc/priv.defs.inc:178
+msgid "WebCfg - Diagnostics: Logs: Settings page"
+msgstr "WebCfg - 診断:ログ:((設定))ページ"
+
+#: etc/inc/priv.defs.inc:155 etc/inc/priv.defs.inc:173
+#: etc/inc/priv.defs.inc:179 etc/inc/priv.defs.inc:179
+msgid "Allow access to the 'Diagnostics: Logs: Settings' page."
+msgstr "ページ':ログ設定の診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:160 etc/inc/priv.defs.inc:178
+#: etc/inc/priv.defs.inc:184 etc/inc/priv.defs.inc:184
+msgid "WebCfg - Diagnostics: Logs: VPN page"
+msgstr "WebCfg - 診断:ログ: VPNのページ"
+
+#: etc/inc/priv.defs.inc:161 etc/inc/priv.defs.inc:179
+#: etc/inc/priv.defs.inc:185 etc/inc/priv.defs.inc:185
+msgid "Allow access to the 'Diagnostics: Logs: VPN' page."
+msgstr "ページ':ログVPNの診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:166 etc/inc/priv.defs.inc:184
+#: etc/inc/priv.defs.inc:190 etc/inc/priv.defs.inc:190
+msgid "WebCfg - Diagnostics: NanoBSD"
+msgstr "WebCfg - 診断: NanoBSDの"
+
+#: etc/inc/priv.defs.inc:167 etc/inc/priv.defs.inc:185
+#: etc/inc/priv.defs.inc:191 etc/inc/priv.defs.inc:191
+msgid "Allow access to the 'Diagnostics: NanoBSD' page."
+msgstr "ページ:' NanoBSDの診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:172 etc/inc/priv.defs.inc:190
+#: etc/inc/priv.defs.inc:196 etc/inc/priv.defs.inc:196
+msgid "WebCfg - Diagnostics: Packet Capture page"
+msgstr "WebCfg - 診断:パケットキャプチャページ"
+
+#: etc/inc/priv.defs.inc:173 etc/inc/priv.defs.inc:191
+#: etc/inc/priv.defs.inc:197 etc/inc/priv.defs.inc:197
+msgid "Allow access to the 'Diagnostics: Packet Capture' page."
+msgstr "ページ: 「パケットキャプチャ診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:178 etc/inc/priv.defs.inc:196
+#: etc/inc/priv.defs.inc:202 etc/inc/priv.defs.inc:202
+msgid "WebCfg - Diagnostics: Patterns page"
+msgstr "WebCfg - 診断:パターンページ"
+
+#: etc/inc/priv.defs.inc:179 etc/inc/priv.defs.inc:197
+#: etc/inc/priv.defs.inc:203 etc/inc/priv.defs.inc:203
+msgid "Allow access to the 'Diagnostics: Patterns' page."
+msgstr "ページ:'パターン診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:190 etc/inc/priv.defs.inc:208
+#: etc/inc/priv.defs.inc:214 etc/inc/priv.defs.inc:214
+msgid "WebCfg - Diagnostics: Ping page"
+msgstr "WebCfg - 診断: Pingのページ"
+
+#: etc/inc/priv.defs.inc:191 etc/inc/priv.defs.inc:209
+#: etc/inc/priv.defs.inc:215 etc/inc/priv.defs.inc:215
+msgid "Allow access to the 'Diagnostics: Ping' page."
+msgstr "ページ:' Pingの診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:196 etc/inc/priv.defs.inc:214
+#: etc/inc/priv.defs.inc:220 etc/inc/priv.defs.inc:220
+msgid "WebCfg - Status: Package logs page"
+msgstr "WebCfg - ステータス:パッケージログページ"
+
+#: etc/inc/priv.defs.inc:197 etc/inc/priv.defs.inc:215
+#: etc/inc/priv.defs.inc:221 etc/inc/priv.defs.inc:221
+msgid "Allow access to the 'Status: Package logs' page."
+msgstr "ページ:'パッケージログステータス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:202 etc/inc/priv.defs.inc:220
+#: etc/inc/priv.defs.inc:226 etc/inc/priv.defs.inc:226
+msgid "WebCfg - Diagnostics: Reset state page"
+msgstr "WebCfg - 診断:状態ページをリセット"
+
+#: etc/inc/priv.defs.inc:203 etc/inc/priv.defs.inc:221
+#: etc/inc/priv.defs.inc:227 etc/inc/priv.defs.inc:227
+msgid "Allow access to the 'Diagnostics: Reset state' page."
+msgstr "ページ: 「リセット状態診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:208 etc/inc/priv.defs.inc:226
+#: etc/inc/priv.defs.inc:232 etc/inc/priv.defs.inc:232
+msgid "WebCfg - Diagnostics: Routing tables page"
+msgstr "WebCfg - 診断:ルーティングテーブルページ"
+
+#: etc/inc/priv.defs.inc:209 etc/inc/priv.defs.inc:227
+#: etc/inc/priv.defs.inc:233 etc/inc/priv.defs.inc:233
+msgid "Allow access to the 'Diagnostics: Routing tables' page."
+msgstr "へのアクセスを許可する「診断:テーブルルーティング」ページを。"
+
+#: etc/inc/priv.defs.inc:214 etc/inc/priv.defs.inc:232
+#: etc/inc/priv.defs.inc:238 etc/inc/priv.defs.inc:238
+msgid "WebCfg - Diagnostics: States Summary page"
+msgstr "WebCfg - 診断:米国の概要))ページ"
+
+#: etc/inc/priv.defs.inc:215 etc/inc/priv.defs.inc:233
+#: etc/inc/priv.defs.inc:239 etc/inc/priv.defs.inc:239
+msgid "Allow access to the 'Diagnostics: States Summary' page."
+msgstr "へのアクセスを許可する「診断:米国概略))ページ。"
+
+#: etc/inc/priv.defs.inc:232 etc/inc/priv.defs.inc:250
+#: etc/inc/priv.defs.inc:256 etc/inc/priv.defs.inc:256
+msgid "WebCfg - Diagnostics: PF Table IP addresses"
+msgstr "WebCfg - 診断:PF表のIPアドレス"
+
+#: etc/inc/priv.defs.inc:233 etc/inc/priv.defs.inc:251
+#: etc/inc/priv.defs.inc:257 etc/inc/priv.defs.inc:257
+msgid "Allow access to the 'Diagnostics: Tables' page."
+msgstr "ページ:「表の診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:238 etc/inc/priv.defs.inc:256
+#: etc/inc/priv.defs.inc:262 etc/inc/priv.defs.inc:262
+msgid "WebCfg - Diagnostics: Traceroute page"
+msgstr "WebCfg - 診断:tracerouteのページ"
+
+#: etc/inc/priv.defs.inc:239 etc/inc/priv.defs.inc:257
+#: etc/inc/priv.defs.inc:263 etc/inc/priv.defs.inc:263
+msgid "Allow access to the 'Diagnostics: Traceroute' page."
+msgstr "ページ:「トレースルート診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:244 etc/inc/priv.defs.inc:262
+#: etc/inc/priv.defs.inc:268 etc/inc/priv.defs.inc:268
+msgid "WebCfg - Diagnostics: Edit FIle"
+msgstr "WebCfg - 診断:編集ファイル"
+
+#: etc/inc/priv.defs.inc:245 etc/inc/priv.defs.inc:263
+#: etc/inc/priv.defs.inc:269 etc/inc/priv.defs.inc:269
+msgid "Allow access to the 'Diagnostics: Edit File' page."
+msgstr "ページ:'ファイルの編集診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:250 etc/inc/priv.defs.inc:268
+#: etc/inc/priv.defs.inc:274 etc/inc/priv.defs.inc:276
+#: etc/inc/priv.defs.inc:276
+msgid "WebCfg - Diagnostics: Command page"
+msgstr "WebCfg - 診断:コマンドのページ"
+
+#: etc/inc/priv.defs.inc:251 etc/inc/priv.defs.inc:269
+#: etc/inc/priv.defs.inc:275 etc/inc/priv.defs.inc:277
+#: etc/inc/priv.defs.inc:277
+msgid "Allow access to the 'Diagnostics: Command' page."
+msgstr "ページ:'コマンド診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:256 etc/inc/priv.defs.inc:274
+#: etc/inc/priv.defs.inc:280
+msgid "WebCfg - Hidden: Exec Raw page"
+msgstr "WebCfg - 非表示: Execの生のページが"
+
+#: etc/inc/priv.defs.inc:257 etc/inc/priv.defs.inc:275
+#: etc/inc/priv.defs.inc:281
+msgid "Allow access to the 'Hidden: Exec Raw' page."
+msgstr "ページ:' Execの生の隠れた」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:262 etc/inc/priv.defs.inc:280
+#: etc/inc/priv.defs.inc:286 etc/inc/priv.defs.inc:282
+#: etc/inc/priv.defs.inc:282
+msgid "WebCfg - Firewall: Aliases page"
+msgstr "WebCfg - ファイアウォール:エイリアスページ"
+
+#: etc/inc/priv.defs.inc:263 etc/inc/priv.defs.inc:281
+#: etc/inc/priv.defs.inc:287 etc/inc/priv.defs.inc:283
+#: etc/inc/priv.defs.inc:283
+msgid "Allow access to the 'Firewall: Aliases' page."
+msgstr "ページ: 「エイリアスファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:268 etc/inc/priv.defs.inc:286
+#: etc/inc/priv.defs.inc:292 etc/inc/priv.defs.inc:288
+#: etc/inc/priv.defs.inc:288
+msgid "WebCfg - Firewall: Alias: Edit page"
+msgstr "WebCfg - ファイアウォール:別名: Editページ"
+
+#: etc/inc/priv.defs.inc:269 etc/inc/priv.defs.inc:287
+#: etc/inc/priv.defs.inc:293 etc/inc/priv.defs.inc:289
+#: etc/inc/priv.defs.inc:289
+msgid "Allow access to the 'Firewall: Alias: Edit' page."
+msgstr "ページ':エイリアスの編集ファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:274 etc/inc/priv.defs.inc:292
+#: etc/inc/priv.defs.inc:298 etc/inc/priv.defs.inc:294
+#: etc/inc/priv.defs.inc:294
+msgid "WebCfg - Firewall: Alias: Import page"
+msgstr "WebCfg - ファイアウォール:別名: Importページ"
+
+#: etc/inc/priv.defs.inc:275 etc/inc/priv.defs.inc:293
+#: etc/inc/priv.defs.inc:299 etc/inc/priv.defs.inc:295
+#: etc/inc/priv.defs.inc:295
+msgid "Allow access to the 'Firewall: Alias: Import' page."
+msgstr "' :別名:輸入ファイアウォール」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:280 etc/inc/priv.defs.inc:298
+#: etc/inc/priv.defs.inc:304 etc/inc/priv.defs.inc:300
+#: etc/inc/priv.defs.inc:300
+msgid "WebCfg - Firewall: NAT: Port Forward page"
+msgstr "WebCfg - ファイアウォール: NAT :ポートフォワードページ"
+
+#: etc/inc/priv.defs.inc:281 etc/inc/priv.defs.inc:299
+#: etc/inc/priv.defs.inc:305 etc/inc/priv.defs.inc:301
+#: etc/inc/priv.defs.inc:301
+msgid "Allow access to the 'Firewall: NAT: Port Forward' page."
+msgstr "ページ': NATのポートフォワードファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:286 etc/inc/priv.defs.inc:304
+#: etc/inc/priv.defs.inc:310 etc/inc/priv.defs.inc:306
+#: etc/inc/priv.defs.inc:306
+msgid "WebCfg - Firewall: NAT: 1:1 page"
+msgstr "WebCfg - ファイアウォール: NATの1:1ページ"
+
+#: etc/inc/priv.defs.inc:287 etc/inc/priv.defs.inc:305
+#: etc/inc/priv.defs.inc:311 etc/inc/priv.defs.inc:307
+#: etc/inc/priv.defs.inc:307
+msgid "Allow access to the 'Firewall: NAT: 1:1' page."
+msgstr "ページ': NATの午前1時01ファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:292 etc/inc/priv.defs.inc:310
+#: etc/inc/priv.defs.inc:316 etc/inc/priv.defs.inc:312
+#: etc/inc/priv.defs.inc:312
+msgid "WebCfg - Firewall: NAT: 1:1: Edit page"
+msgstr "WebCfg - ファイアウォール: NAT : 1時01分: Editページ"
+
+#: etc/inc/priv.defs.inc:293 etc/inc/priv.defs.inc:311
+#: etc/inc/priv.defs.inc:317 etc/inc/priv.defs.inc:313
+#: etc/inc/priv.defs.inc:313
+msgid "Allow access to the 'Firewall: NAT: 1:1: Edit' page."
+msgstr "' : NAT :午前1時01分:編集ファイアウォール」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:298 etc/inc/priv.defs.inc:316
+#: etc/inc/priv.defs.inc:322 etc/inc/priv.defs.inc:318
+#: etc/inc/priv.defs.inc:318
+msgid "WebCfg - Firewall: NAT: Port Forward: Edit page"
+msgstr "WebCfg - ファイアウォール: NAT :ポートフォワード: Editページ"
+
+#: etc/inc/priv.defs.inc:299 etc/inc/priv.defs.inc:317
+#: etc/inc/priv.defs.inc:323 etc/inc/priv.defs.inc:319
+#: etc/inc/priv.defs.inc:319
+msgid "Allow access to the 'Firewall: NAT: Port Forward: Edit' page."
+msgstr "ページ' : NAT :ポートフォワード編集ファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:304 etc/inc/priv.defs.inc:322
+#: etc/inc/priv.defs.inc:328 etc/inc/priv.defs.inc:324
+#: etc/inc/priv.defs.inc:324
+msgid "WebCfg - Firewall: NAT: Outbound page"
+msgstr "WebCfg - ファイアウォール: NAT :発信ページ"
+
+#: etc/inc/priv.defs.inc:305 etc/inc/priv.defs.inc:323
+#: etc/inc/priv.defs.inc:329 etc/inc/priv.defs.inc:325
+#: etc/inc/priv.defs.inc:325
+msgid "Allow access to the 'Firewall: NAT: Outbound' page."
+msgstr "ページ': NATのアウトバウンドファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:310 etc/inc/priv.defs.inc:328
+#: etc/inc/priv.defs.inc:334 etc/inc/priv.defs.inc:330
+#: etc/inc/priv.defs.inc:330
+msgid "WebCfg - Firewall: NAT: Outbound: Edit page"
+msgstr "WebCfg - ファイアウォール: NAT :送信: Editページ"
+
+#: etc/inc/priv.defs.inc:311 etc/inc/priv.defs.inc:329
+#: etc/inc/priv.defs.inc:335 etc/inc/priv.defs.inc:331
+#: etc/inc/priv.defs.inc:331
+msgid "Allow access to the 'Firewall: NAT: Outbound: Edit' page."
+msgstr "ページ' : NAT :アウトバウンド編集ファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:316 etc/inc/priv.defs.inc:334
+#: etc/inc/priv.defs.inc:340 etc/inc/priv.defs.inc:336
+#: etc/inc/priv.defs.inc:336
+msgid "WebCfg - Firewall: Rules page"
+msgstr "WebCfg - ファイアウォール:ルールページ"
+
+#: etc/inc/priv.defs.inc:317 etc/inc/priv.defs.inc:335
+#: etc/inc/priv.defs.inc:341 etc/inc/priv.defs.inc:337
+#: etc/inc/priv.defs.inc:337
+msgid "Allow access to the 'Firewall: Rules' page."
+msgstr "' :ルールファイアウォール」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:322 etc/inc/priv.defs.inc:340
+#: etc/inc/priv.defs.inc:346 etc/inc/priv.defs.inc:342
+#: etc/inc/priv.defs.inc:342
+msgid "WebCfg - Firewall: Rules: Edit page"
+msgstr "WebCfg - ファイアウォール:ルール: Editページ"
+
+#: etc/inc/priv.defs.inc:323 etc/inc/priv.defs.inc:341
+#: etc/inc/priv.defs.inc:347 etc/inc/priv.defs.inc:343
+#: etc/inc/priv.defs.inc:343
+msgid "Allow access to the 'Firewall: Rules: Edit' page."
+msgstr "ページ':ルールの編集ファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:328 etc/inc/priv.defs.inc:346
+#: etc/inc/priv.defs.inc:352 etc/inc/priv.defs.inc:348
+#: etc/inc/priv.defs.inc:348
+msgid "WebCfg - Firewall: Schedules page"
+msgstr "WebCfg - ファイアウォール:スケジュール·ページ"
+
+#: etc/inc/priv.defs.inc:329 etc/inc/priv.defs.inc:347
+#: etc/inc/priv.defs.inc:353 etc/inc/priv.defs.inc:349
+#: etc/inc/priv.defs.inc:349
+msgid "Allow access to the 'Firewall: Schedules' page."
+msgstr "ページ: 「スケジュールファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:334 etc/inc/priv.defs.inc:352
+#: etc/inc/priv.defs.inc:358 etc/inc/priv.defs.inc:354
+#: etc/inc/priv.defs.inc:354
+msgid "WebCfg - Firewall: Schedules: Edit page"
+msgstr "WebCfg - ファイアウォール:スケジュール: Editページ"
+
+#: etc/inc/priv.defs.inc:335 etc/inc/priv.defs.inc:353
+#: etc/inc/priv.defs.inc:359 etc/inc/priv.defs.inc:355
+#: etc/inc/priv.defs.inc:355
+msgid "Allow access to the 'Firewall: Schedules: Edit' page."
+msgstr "ページ':スケジュールを編集ファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:340 etc/inc/priv.defs.inc:358
+#: etc/inc/priv.defs.inc:364 etc/inc/priv.defs.inc:360
+#: etc/inc/priv.defs.inc:360
+msgid "WebCfg - Firewall: Traffic Shaper page"
+msgstr "WebCfg - ファイアウォール:トラフィックシェイパーページ"
+
+#: etc/inc/priv.defs.inc:341 etc/inc/priv.defs.inc:359
+#: etc/inc/priv.defs.inc:365 etc/inc/priv.defs.inc:361
+#: etc/inc/priv.defs.inc:361
+msgid "Allow access to the 'Firewall: Traffic Shaper' page."
+msgstr "ページ: 「トラフィック·シェイパーファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:346 etc/inc/priv.defs.inc:364
+#: etc/inc/priv.defs.inc:370 etc/inc/priv.defs.inc:366
+#: etc/inc/priv.defs.inc:366
+msgid "WebCfg - Firewall: Traffic Shaper: Layer7 page"
+msgstr "WebCfg - ファイアウォール:トラフィックシェイパー:レイヤ7ページ"
+
+#: etc/inc/priv.defs.inc:347 etc/inc/priv.defs.inc:365
+#: etc/inc/priv.defs.inc:371 etc/inc/priv.defs.inc:367
+#: etc/inc/priv.defs.inc:367
+msgid "Allow access to the 'Firewall: Traffic Shaper: Layer7' page."
+msgstr "ページ': Traffic Shaperはレイヤ7ファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:352 etc/inc/priv.defs.inc:370
+#: etc/inc/priv.defs.inc:376 etc/inc/priv.defs.inc:372
+#: etc/inc/priv.defs.inc:372
+msgid "WebCfg - Firewall: Traffic Shaper: Queues page"
+msgstr "WebCfg - ファイアウォール:トラフィックシェイパー:キューページ"
+
+#: etc/inc/priv.defs.inc:353 etc/inc/priv.defs.inc:371
+#: etc/inc/priv.defs.inc:377 etc/inc/priv.defs.inc:373
+#: etc/inc/priv.defs.inc:373
+msgid "Allow access to the 'Firewall: Traffic Shaper: Queues' page."
+msgstr "ページ': Traffic Shaperはキューファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:358 etc/inc/priv.defs.inc:376
+#: etc/inc/priv.defs.inc:382 etc/inc/priv.defs.inc:378
+#: etc/inc/priv.defs.inc:378
+msgid "WebCfg - Firewall: Traffic Shaper: Limiter page"
+msgstr "WebCfg - ファイアウォール:トラフィックシェイパー:リミッターページ"
+
+#: etc/inc/priv.defs.inc:359 etc/inc/priv.defs.inc:377
+#: etc/inc/priv.defs.inc:383 etc/inc/priv.defs.inc:379
+#: etc/inc/priv.defs.inc:379
+msgid "Allow access to the 'Firewall: Traffic Shaper: Limiter' page."
+msgstr "ページ': Traffic Shaperはリミッターファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:364 etc/inc/priv.defs.inc:382
+#: etc/inc/priv.defs.inc:388 etc/inc/priv.defs.inc:384
+#: etc/inc/priv.defs.inc:384
+msgid "WebCfg - Firewall: Traffic Shaper: Wizard page"
+msgstr "WebCfg - ファイアウォール:トラフィックシェイパー:ウィザードのページ"
+
+#: etc/inc/priv.defs.inc:365 etc/inc/priv.defs.inc:383
+#: etc/inc/priv.defs.inc:389 etc/inc/priv.defs.inc:385
+#: etc/inc/priv.defs.inc:385
+msgid "Allow access to the 'Firewall: Traffic Shaper: Wizard' page."
+msgstr "ページ': Traffic Shaperはウィザードファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:370 etc/inc/priv.defs.inc:388
+#: etc/inc/priv.defs.inc:394 etc/inc/priv.defs.inc:390
+#: etc/inc/priv.defs.inc:390
+msgid "WebCfg - Firewall: Virtual IP Addresses page"
+msgstr "WebCfg - ファイアウォール:仮想IPアドレス))ページ"
+
+#: etc/inc/priv.defs.inc:371 etc/inc/priv.defs.inc:389
+#: etc/inc/priv.defs.inc:395 etc/inc/priv.defs.inc:391
+#: etc/inc/priv.defs.inc:391
+msgid "Allow access to the 'Firewall: Virtual IP Addresses' page."
+msgstr "ページ:「仮想IPアドレスファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:376 etc/inc/priv.defs.inc:394
+#: etc/inc/priv.defs.inc:400 etc/inc/priv.defs.inc:396
+#: etc/inc/priv.defs.inc:396
+msgid "WebCfg - Firewall: Virtual IP Address: Edit page"
+msgstr "WebCfg - ファイアウォール:仮想IPアドレス:Editページ"
+
+#: etc/inc/priv.defs.inc:377 etc/inc/priv.defs.inc:395
+#: etc/inc/priv.defs.inc:401 etc/inc/priv.defs.inc:397
+#: etc/inc/priv.defs.inc:397
+msgid "Allow access to the 'Firewall: Virtual IP Address: Edit' page."
+msgstr "ページ':仮想IPアドレスを編集ファイアウォール」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:382 etc/inc/priv.defs.inc:400
+#: etc/inc/priv.defs.inc:406 etc/inc/priv.defs.inc:402
+#: etc/inc/priv.defs.inc:402
+msgid "WebCfg - AJAX: Get Service Providers"
+msgstr "WebCfg - AJAX:サービスプロバイダを取得する"
+
+#: etc/inc/priv.defs.inc:383 etc/inc/priv.defs.inc:401
+#: etc/inc/priv.defs.inc:407 etc/inc/priv.defs.inc:403
+#: etc/inc/priv.defs.inc:403
+msgid "Allow access to the 'AJAX: Service Providers' page."
+msgstr "ページ:「サービスプロバイダAJAX」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:388 etc/inc/priv.defs.inc:406
+#: etc/inc/priv.defs.inc:412 etc/inc/priv.defs.inc:408
+#: etc/inc/priv.defs.inc:408
+msgid "WebCfg - AJAX: Get Stats"
+msgstr "WebCfg - AJAX:ゲット統計"
+
+#: etc/inc/priv.defs.inc:389 etc/inc/priv.defs.inc:407
+#: etc/inc/priv.defs.inc:413 etc/inc/priv.defs.inc:409
+#: etc/inc/priv.defs.inc:409
+msgid "Allow access to the 'AJAX: Get Stats' page."
+msgstr "へのアクセスを許可します。ページ'、Ajaxを統計取得))を。"
+
+#: etc/inc/priv.defs.inc:394 etc/inc/priv.defs.inc:412
+#: etc/inc/priv.defs.inc:418 etc/inc/priv.defs.inc:414
+#: etc/inc/priv.defs.inc:414
+msgid "WebCfg - Diagnostics: Interface Traffic page"
+msgstr "WebCfg - 診断:インターフェイストラフィックページ"
+
+#: etc/inc/priv.defs.inc:395 etc/inc/priv.defs.inc:413
+#: etc/inc/priv.defs.inc:419 etc/inc/priv.defs.inc:415
+#: etc/inc/priv.defs.inc:415
+msgid "Allow access to the 'Diagnostics: Interface Traffic' page."
+msgstr "ページ:「インターフェーストラフィック診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:400 etc/inc/priv.defs.inc:814
+#: etc/inc/priv.defs.inc:418 etc/inc/priv.defs.inc:832
+#: etc/inc/priv.defs.inc:424 etc/inc/priv.defs.inc:838
+#: etc/inc/priv.defs.inc:420 etc/inc/priv.defs.inc:846
+#: etc/inc/priv.defs.inc:420 etc/inc/priv.defs.inc:846
+msgid "WebCfg - Diagnostics: CPU Utilization page"
+msgstr "WebCfg - 診断:CPU使用率ページ"
+
+#: etc/inc/priv.defs.inc:401 etc/inc/priv.defs.inc:815
+#: etc/inc/priv.defs.inc:419 etc/inc/priv.defs.inc:833
+#: etc/inc/priv.defs.inc:425 etc/inc/priv.defs.inc:839
+#: etc/inc/priv.defs.inc:421 etc/inc/priv.defs.inc:847
+#: etc/inc/priv.defs.inc:421 etc/inc/priv.defs.inc:847
+msgid "Allow access to the 'Diagnostics: CPU Utilization' page."
+msgstr "ページ:「CPU使用率の診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:406 etc/inc/priv.defs.inc:424
+#: etc/inc/priv.defs.inc:430 etc/inc/priv.defs.inc:426
+#: etc/inc/priv.defs.inc:426
+msgid "WebCfg - Diagnostics: Halt system page"
+msgstr "WebCfg - 診断:停止システムページ"
+
+#: etc/inc/priv.defs.inc:407 etc/inc/priv.defs.inc:425
+#: etc/inc/priv.defs.inc:431 etc/inc/priv.defs.inc:427
+#: etc/inc/priv.defs.inc:427
+msgid "Allow access to the 'Diagnostics: Halt system' page."
+msgstr "ページ:'ホルトシステム診断プログラム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:412 etc/inc/priv.defs.inc:430
+#: etc/inc/priv.defs.inc:436 etc/inc/priv.defs.inc:432
+#: etc/inc/priv.defs.inc:432
+msgid "WebCfg - Required for javascript page"
+msgstr "WebCfg - javascriptのページに必要な"
+
+#: etc/inc/priv.defs.inc:413 etc/inc/priv.defs.inc:431
+#: etc/inc/priv.defs.inc:437 etc/inc/priv.defs.inc:433
+#: etc/inc/priv.defs.inc:433
+msgid "Allow access to the 'Required for javascript' page."
+msgstr "「 JavaScriptが必要です」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:418 etc/inc/priv.defs.inc:436
+#: etc/inc/priv.defs.inc:442 etc/inc/priv.defs.inc:438
+#: etc/inc/priv.defs.inc:438
+msgid "WebCfg - XMLRPC Interface Stats page"
+msgstr "WebCfg - XMLRPCインタフェース統計ページ"
+
+#: etc/inc/priv.defs.inc:419 etc/inc/priv.defs.inc:437
+#: etc/inc/priv.defs.inc:443 etc/inc/priv.defs.inc:439
+#: etc/inc/priv.defs.inc:439
+msgid "Allow access to the 'XMLRPC Interface Stats' page."
+msgstr "' XMLRPCインタフェース統計」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:424 etc/inc/priv.defs.inc:442
+#: etc/inc/priv.defs.inc:448 etc/inc/priv.defs.inc:444
+#: etc/inc/priv.defs.inc:444
+msgid "WebCfg - System: Login / Logout page / Dashboard"
+msgstr "WebCfg - システム:ログイン/ログアウトページ/ダッシュボード"
+
+#: etc/inc/priv.defs.inc:425 etc/inc/priv.defs.inc:443
+#: etc/inc/priv.defs.inc:449 etc/inc/priv.defs.inc:445
+#: etc/inc/priv.defs.inc:445
+msgid "Allow access to the 'System: Login / Logout' page and Dashboard."
+msgstr "ページとダッシュボード:'ログイン/ログアウトシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:430 etc/inc/priv.defs.inc:448
+#: etc/inc/priv.defs.inc:454 etc/inc/priv.defs.inc:450
+#: etc/inc/priv.defs.inc:450
+msgid "WebCfg - Interfaces: WAN page"
+msgstr "WebCfg - インターフェース: WANのページ"
+
+#: etc/inc/priv.defs.inc:431 etc/inc/priv.defs.inc:449
+#: etc/inc/priv.defs.inc:455 etc/inc/priv.defs.inc:451
+#: etc/inc/priv.defs.inc:451
+msgid "Allow access to the 'Interfaces' page."
+msgstr "'インタフェース'ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:436 etc/inc/priv.defs.inc:454
+#: etc/inc/priv.defs.inc:460 etc/inc/priv.defs.inc:456
+#: etc/inc/priv.defs.inc:456
+msgid "WebCfg - Interfaces: Assign network ports page"
+msgstr "WebCfg - インターフェース:ネットワークポートのページを割り当て"
+
+#: etc/inc/priv.defs.inc:437 etc/inc/priv.defs.inc:455
+#: etc/inc/priv.defs.inc:461 etc/inc/priv.defs.inc:457
+#: etc/inc/priv.defs.inc:457
+msgid "Allow access to the 'Interfaces: Assign network ports' page."
+msgstr "ページ:'割り当てネットワークポートインタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:442 etc/inc/priv.defs.inc:460
+#: etc/inc/priv.defs.inc:466 etc/inc/priv.defs.inc:462
+#: etc/inc/priv.defs.inc:462
+msgid "WebCfg - Interfaces: Bridge page"
+msgstr "WebCfg - インターフェース:ブリッジページ"
+
+#: etc/inc/priv.defs.inc:443 etc/inc/priv.defs.inc:461
+#: etc/inc/priv.defs.inc:467 etc/inc/priv.defs.inc:463
+#: etc/inc/priv.defs.inc:463
+msgid "Allow access to the 'Interfaces: Bridge' page."
+msgstr "ページ: 「ブリッジ·インタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:448 etc/inc/priv.defs.inc:466
+#: etc/inc/priv.defs.inc:472 etc/inc/priv.defs.inc:468
+#: etc/inc/priv.defs.inc:468
+msgid "WebCfg - Interfaces: Bridge edit page"
+msgstr "WebCfg - インターフェース:ブリッジEditページ"
+
+#: etc/inc/priv.defs.inc:449 etc/inc/priv.defs.inc:467
+#: etc/inc/priv.defs.inc:473 etc/inc/priv.defs.inc:469
+#: etc/inc/priv.defs.inc:469
+msgid "Allow access to the 'Interfaces: Bridge : Edit' page."
+msgstr "ページ':橋編集インタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:454 etc/inc/priv.defs.inc:472
+#: etc/inc/priv.defs.inc:478 etc/inc/priv.defs.inc:474
+#: etc/inc/priv.defs.inc:474
+msgid "WebCfg - Interfaces: GIF page"
+msgstr "WebCfg - インターフェース: GIFページ"
+
+#: etc/inc/priv.defs.inc:455 etc/inc/priv.defs.inc:473
+#: etc/inc/priv.defs.inc:479 etc/inc/priv.defs.inc:475
+#: etc/inc/priv.defs.inc:475
+msgid "Allow access to the 'Interfaces: GIF' page."
+msgstr "ページ:' GIFインタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:460 etc/inc/priv.defs.inc:478
+#: etc/inc/priv.defs.inc:484 etc/inc/priv.defs.inc:480
+#: etc/inc/priv.defs.inc:480
+msgid "WebCfg - Interfaces: GIF: Edit page"
+msgstr "WebCfg - インターフェース: GIF : Editページ"
+
+#: etc/inc/priv.defs.inc:461 etc/inc/priv.defs.inc:479
+#: etc/inc/priv.defs.inc:485 etc/inc/priv.defs.inc:481
+#: etc/inc/priv.defs.inc:481
+msgid "Allow access to the 'Interfaces: GIF: Edit' page."
+msgstr "ページ': GIF編集インタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:466 etc/inc/priv.defs.inc:484
+#: etc/inc/priv.defs.inc:490 etc/inc/priv.defs.inc:486
+#: etc/inc/priv.defs.inc:486
+msgid "WebCfg - Interfaces: GRE page"
+msgstr "WebCfg - インターフェース: GREのページ"
+
+#: etc/inc/priv.defs.inc:467 etc/inc/priv.defs.inc:485
+#: etc/inc/priv.defs.inc:491 etc/inc/priv.defs.inc:487
+#: etc/inc/priv.defs.inc:487
+msgid "Allow access to the 'Interfaces: GRE' page."
+msgstr "ページ: 「 GREインタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:472 etc/inc/priv.defs.inc:490
+#: etc/inc/priv.defs.inc:496 etc/inc/priv.defs.inc:492
+#: etc/inc/priv.defs.inc:492
+msgid "WebCfg - Interfaces: GRE: Edit page"
+msgstr "WebCfg - インターフェース: GRE : Editページ"
+
+#: etc/inc/priv.defs.inc:473 etc/inc/priv.defs.inc:491
+#: etc/inc/priv.defs.inc:497 etc/inc/priv.defs.inc:493
+#: etc/inc/priv.defs.inc:493
+msgid "Allow access to the 'Interfaces: GRE: Edit' page."
+msgstr "ページ': GRE編集インタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:478 etc/inc/priv.defs.inc:496
+#: etc/inc/priv.defs.inc:502 etc/inc/priv.defs.inc:498
+#: etc/inc/priv.defs.inc:498
+msgid "WebCfg - Interfaces: Groups page"
+msgstr "WebCfg - インターフェース:グループ))ページ"
+
+#: etc/inc/priv.defs.inc:479 etc/inc/priv.defs.inc:497
+#: etc/inc/priv.defs.inc:503 etc/inc/priv.defs.inc:499
+#: etc/inc/priv.defs.inc:499
+msgid "Create interface groups"
+msgstr "インタフェースグループを作成します。"
+
+#: etc/inc/priv.defs.inc:484 etc/inc/priv.defs.inc:502
+#: etc/inc/priv.defs.inc:508 etc/inc/priv.defs.inc:504
+#: etc/inc/priv.defs.inc:504
+msgid "WebCfg - Interfaces: Groups: Edit page"
+msgstr "WebCfg - インターフェース:グループ:Editページ"
+
+#: etc/inc/priv.defs.inc:485 etc/inc/priv.defs.inc:503
+#: etc/inc/priv.defs.inc:509 etc/inc/priv.defs.inc:505
+#: etc/inc/priv.defs.inc:505
+msgid "Edit Interface groups"
+msgstr "インターフェースの編集グループ"
+
+#: etc/inc/priv.defs.inc:490 etc/inc/priv.defs.inc:508
+#: etc/inc/priv.defs.inc:514 etc/inc/priv.defs.inc:510
+#: etc/inc/priv.defs.inc:510
+msgid "WebCfg - Interfaces: LAGG: page"
+msgstr "WebCfg - インターフェース:LAGG:ページ"
+
+#: etc/inc/priv.defs.inc:491 etc/inc/priv.defs.inc:497
+#: etc/inc/priv.defs.inc:509 etc/inc/priv.defs.inc:515
+#: etc/inc/priv.defs.inc:521 etc/inc/priv.defs.inc:511
+#: etc/inc/priv.defs.inc:517 etc/inc/priv.defs.inc:511
+#: etc/inc/priv.defs.inc:517
+msgid "Edit Interface LAGG"
+msgstr "インターフェースの編集LAGG"
+
+#: etc/inc/priv.defs.inc:496 etc/inc/priv.defs.inc:514
+#: etc/inc/priv.defs.inc:520 etc/inc/priv.defs.inc:516
+#: etc/inc/priv.defs.inc:516
+msgid "WebCfg - Interfaces: LAGG: Edit page"
+msgstr "WebCfg - インターフェース:LAGG:Editページ"
+
+#: etc/inc/priv.defs.inc:502 etc/inc/priv.defs.inc:520
+#: etc/inc/priv.defs.inc:526 etc/inc/priv.defs.inc:522
+#: etc/inc/priv.defs.inc:522
+msgid "WebCfg - Interfaces: ppps page"
+msgstr "WebCfg - インターフェース:購買力平価ページ"
+
+#: etc/inc/priv.defs.inc:503 etc/inc/priv.defs.inc:521
+#: etc/inc/priv.defs.inc:527 etc/inc/priv.defs.inc:523
+#: etc/inc/priv.defs.inc:523
+msgid "Allow access to the 'Interfaces: ppps' page."
+msgstr "ページ: 'のPPPインタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:508 etc/inc/priv.defs.inc:526
+#: etc/inc/priv.defs.inc:532 etc/inc/priv.defs.inc:528
+#: etc/inc/priv.defs.inc:528
+msgid "WebCfg - Interfaces: PPPs: Edit page"
+msgstr "WebCfg - インターフェース:購買力平価:Editページ"
+
+#: etc/inc/priv.defs.inc:509 etc/inc/priv.defs.inc:527
+#: etc/inc/priv.defs.inc:533 etc/inc/priv.defs.inc:529
+#: etc/inc/priv.defs.inc:529
+msgid "Allow access to the 'Interfaces: PPPs: Edit' page."
+msgstr "ページ':PPPの編集インタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:514 etc/inc/priv.defs.inc:532
+#: etc/inc/priv.defs.inc:538 etc/inc/priv.defs.inc:534
+#: etc/inc/priv.defs.inc:534
+msgid "WebCfg - Interfaces: QinQ page"
+msgstr "WebCfg - インターフェース:QinQサブページ"
+
+#: etc/inc/priv.defs.inc:515 etc/inc/priv.defs.inc:533
+#: etc/inc/priv.defs.inc:539 etc/inc/priv.defs.inc:535
+#: etc/inc/priv.defs.inc:535
+msgid "Allow access to the 'Interfaces: QinQ' page."
+msgstr "ページ: 'のQinQインターフェイス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:520 etc/inc/priv.defs.inc:538
+#: etc/inc/priv.defs.inc:544 etc/inc/priv.defs.inc:540
+#: etc/inc/priv.defs.inc:540
+msgid "WebCfg - Interfaces: QinQ: Edit page"
+msgstr "WebCfg - インターフェース:のQinQ:Editページ""
+
+#: etc/inc/priv.defs.inc:521 etc/inc/priv.defs.inc:539
+#: etc/inc/priv.defs.inc:545 etc/inc/priv.defs.inc:541
+#: etc/inc/priv.defs.inc:541
+msgid "Edit Interface qinq"
+msgstr "インターフェースの編集のQinQ"
+
+#: etc/inc/priv.defs.inc:526 etc/inc/priv.defs.inc:544
+#: etc/inc/priv.defs.inc:550 etc/inc/priv.defs.inc:546
+#: etc/inc/priv.defs.inc:546
+msgid "WebCfg - Interfaces: VLAN page"
+msgstr "WebCfg - インターフェース:VLANのページ"
+
+#: etc/inc/priv.defs.inc:527 etc/inc/priv.defs.inc:545
+#: etc/inc/priv.defs.inc:551 etc/inc/priv.defs.inc:547
+#: etc/inc/priv.defs.inc:547
+msgid "Allow access to the 'Interfaces: VLAN' page."
+msgstr "Allow access to the 'Interfaces: VLAN' page."
+
+#: etc/inc/priv.defs.inc:532 etc/inc/priv.defs.inc:550
+#: etc/inc/priv.defs.inc:556 etc/inc/priv.defs.inc:552
+#: etc/inc/priv.defs.inc:552
+msgid "WebCfg - Interfaces: VLAN: Edit page"
+msgstr "WebCfg - インターフェース:VLAN:Editページ"
+
+#: etc/inc/priv.defs.inc:533 etc/inc/priv.defs.inc:551
+#: etc/inc/priv.defs.inc:557 etc/inc/priv.defs.inc:553
+#: etc/inc/priv.defs.inc:553
+msgid "Allow access to the 'Interfaces: VLAN: Edit' page."
+msgstr "ページ':VLANの編集インタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:538 etc/inc/priv.defs.inc:556
+#: etc/inc/priv.defs.inc:562 etc/inc/priv.defs.inc:558
+#: etc/inc/priv.defs.inc:558
+msgid "WebCfg - Interfaces: Wireless page"
+msgstr "WebCfg - インターフェース:ワイヤレスページ"
+
+#: etc/inc/priv.defs.inc:539 etc/inc/priv.defs.inc:557
+#: etc/inc/priv.defs.inc:563 etc/inc/priv.defs.inc:559
+#: etc/inc/priv.defs.inc:559
+msgid "Allow access to the 'Interfaces: Wireless' page."
+msgstr "ページ:「ワイヤレスインターフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:544 etc/inc/priv.defs.inc:562
+#: etc/inc/priv.defs.inc:568 etc/inc/priv.defs.inc:564
+#: etc/inc/priv.defs.inc:564
+msgid "WebCfg - Interfaces: Wireless edit page"
+msgstr "WebCfg - インターフェース:ワイヤレスEditページ"
+
+#: etc/inc/priv.defs.inc:545 etc/inc/priv.defs.inc:563
+#: etc/inc/priv.defs.inc:569 etc/inc/priv.defs.inc:565
+#: etc/inc/priv.defs.inc:565
+msgid "Allow access to the 'Interfaces: Wireless : Edit' page."
+msgstr "ページ':ワイヤレス編集インタフェース」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:550 etc/inc/priv.defs.inc:568
+#: etc/inc/priv.defs.inc:574 etc/inc/priv.defs.inc:570
+#: etc/inc/priv.defs.inc:570
+msgid "WebCfg - System: License page"
+msgstr "WebCfg - システム:ライセンスページ"
+
+#: etc/inc/priv.defs.inc:551 etc/inc/priv.defs.inc:569
+#: etc/inc/priv.defs.inc:575 etc/inc/priv.defs.inc:571
+#: etc/inc/priv.defs.inc:571
+msgid "Allow access to the 'System: License' page."
+msgstr "ページ:「ライセンスシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:556 etc/inc/priv.defs.inc:574
+#: etc/inc/priv.defs.inc:580 etc/inc/priv.defs.inc:576
+#: etc/inc/priv.defs.inc:576
+msgid "WebCfg - Services: Load Balancer: Monitors page"
+msgstr "WebCfg - サービス:監視))ページ:ロードバランサ"
+
+#: etc/inc/priv.defs.inc:557 etc/inc/priv.defs.inc:575
+#: etc/inc/priv.defs.inc:581 etc/inc/priv.defs.inc:577
+#: etc/inc/priv.defs.inc:577
+msgid "Allow access to the 'Services: Load Balancer: Monitors' page."
+msgstr "へのアクセスを許可する'サービス:ロード·バランサ:モニターのページを。"
+
+#: etc/inc/priv.defs.inc:562 etc/inc/priv.defs.inc:580
+#: etc/inc/priv.defs.inc:586 etc/inc/priv.defs.inc:582
+#: etc/inc/priv.defs.inc:582
+msgid "WebCfg - Services: Load Balancer: Monitor: Edit page"
+msgstr "WebCfg - サービス:モニタ:Editページロードバランサ"
+
+#: etc/inc/priv.defs.inc:563 etc/inc/priv.defs.inc:581
+#: etc/inc/priv.defs.inc:587 etc/inc/priv.defs.inc:583
+#: etc/inc/priv.defs.inc:583
+msgid "Allow access to the 'Services: Load Balancer: Monitor: Edit' page."
+msgstr "Allow access to the 'Services: Load Balancer: Monitor: Edit' page."
+
+#: etc/inc/priv.defs.inc:568 etc/inc/priv.defs.inc:586
+#: etc/inc/priv.defs.inc:592 etc/inc/priv.defs.inc:588
+#: etc/inc/priv.defs.inc:588
+msgid "WebCfg - Load Balancer: Pool page"
+msgstr "WebCfg - ロード·バランサ:プールページを"
+
+#: etc/inc/priv.defs.inc:569 etc/inc/priv.defs.inc:587
+#: etc/inc/priv.defs.inc:593 etc/inc/priv.defs.inc:589
+#: etc/inc/priv.defs.inc:589
+msgid "Allow access to the 'Load Balancer: Pool' page."
+msgstr "ページ: 「プールのLoad Balancer 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:574 etc/inc/priv.defs.inc:592
+#: etc/inc/priv.defs.inc:598 etc/inc/priv.defs.inc:594
+#: etc/inc/priv.defs.inc:594
+msgid "WebCfg - Load Balancer: Pool: Edit page"
+msgstr "WebCfg - ロード·バランサ:プール:Editページ"
+
+#: etc/inc/priv.defs.inc:575 etc/inc/priv.defs.inc:593
+#: etc/inc/priv.defs.inc:599 etc/inc/priv.defs.inc:595
+#: etc/inc/priv.defs.inc:595
+msgid "Allow access to the 'Load Balancer: Pool: Edit' page."
+msgstr "ページ':プールの編集ロードバランサ」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:580 etc/inc/priv.defs.inc:598
+#: etc/inc/priv.defs.inc:604 etc/inc/priv.defs.inc:600
+#: etc/inc/priv.defs.inc:600
+msgid "WebCfg - Services: Load Balancer: Relay Actions page"
+msgstr "WebCfg - サービス:リレーアクション))ページ:ロードバランサ"
+
+#: etc/inc/priv.defs.inc:581 etc/inc/priv.defs.inc:599
+#: etc/inc/priv.defs.inc:605 etc/inc/priv.defs.inc:601
+#: etc/inc/priv.defs.inc:601
+msgid "Allow access to the 'Services: Load Balancer: Relay Actions' page."
+msgstr "へのアクセスを許可する'サービス:ロード·バランサ:リレーアクション」ページを。"
+
+#: etc/inc/priv.defs.inc:586 etc/inc/priv.defs.inc:604
+#: etc/inc/priv.defs.inc:610 etc/inc/priv.defs.inc:606
+#: etc/inc/priv.defs.inc:606
+msgid "WebCfg - Services: Load Balancer: Relay Action: Edit page"
+msgstr "WebCfg - サービス:リレー動作:Editページバランサをロード"
+
+#: etc/inc/priv.defs.inc:587 etc/inc/priv.defs.inc:605
+#: etc/inc/priv.defs.inc:611 etc/inc/priv.defs.inc:607
+#: etc/inc/priv.defs.inc:607
+msgid "Allow access to the 'Services: Load Balancer: Relay Action: Edit' page."
+msgstr "へのアクセスを許可するページ」サービス:リレー動作:編集ロードバランサ」 。"
+
+#: etc/inc/priv.defs.inc:592 etc/inc/priv.defs.inc:610
+#: etc/inc/priv.defs.inc:616 etc/inc/priv.defs.inc:612
+#: etc/inc/priv.defs.inc:612
+msgid "WebCfg - Services: Load Balancer: Relay Protocols page"
+msgstr "WebCfg - サービス:ロード·バランサ:リレープロトコル))ページを"
+
+#: etc/inc/priv.defs.inc:593 etc/inc/priv.defs.inc:611
+#: etc/inc/priv.defs.inc:617 etc/inc/priv.defs.inc:613
+#: etc/inc/priv.defs.inc:613
+msgid "Allow access to the 'Services: Load Balancer: Relay Protocols' page."
+msgstr "へのアクセスを許可する'サービス:ロード·バランサ:リレー·プロトコル」のページを。"
+
+#: etc/inc/priv.defs.inc:598 etc/inc/priv.defs.inc:616
+#: etc/inc/priv.defs.inc:622 etc/inc/priv.defs.inc:618
+#: etc/inc/priv.defs.inc:618
+msgid "WebCfg - Services: Load Balancer: Relay Protocol: Edit page"
+msgstr "WebCfg - サービス:リレープロトコル::Editページバランサをロード"
+
+#: etc/inc/priv.defs.inc:599 etc/inc/priv.defs.inc:617
+#: etc/inc/priv.defs.inc:623 etc/inc/priv.defs.inc:619
+#: etc/inc/priv.defs.inc:619
+msgid ""
+"Allow access to the 'Services: Load Balancer: Relay Protocol: Edit' page."
+msgstr ""へのアクセスを許可する'サービス:ロード·バランサ:リレープロトコル:編集'ページ。"
+
+#: etc/inc/priv.defs.inc:604 etc/inc/priv.defs.inc:622
+#: etc/inc/priv.defs.inc:628 etc/inc/priv.defs.inc:624
+#: etc/inc/priv.defs.inc:624
+msgid "WebCfg - Services: Load Balancer: Virtual Servers page"
+msgstr "WebCfg - サービス:ロード·バランサ:仮想サーバーのページを"
+
+#: etc/inc/priv.defs.inc:605 etc/inc/priv.defs.inc:623
+#: etc/inc/priv.defs.inc:629 etc/inc/priv.defs.inc:625
+#: etc/inc/priv.defs.inc:625
+msgid "Allow access to the 'Services: Load Balancer: Virtual Servers' page."
+msgstr "へのアクセスを許可する'サービス:ロード·バランサ:仮想サーバのページを。"
+
+#: etc/inc/priv.defs.inc:610 etc/inc/priv.defs.inc:628
+#: etc/inc/priv.defs.inc:634 etc/inc/priv.defs.inc:630
+#: etc/inc/priv.defs.inc:630
+msgid "WebCfg - Load Balancer: Virtual Server: Edit page"
+msgstr "WebCfg - ロード·バランサ:仮想サーバー:Editページ"
+
+#: etc/inc/priv.defs.inc:611 etc/inc/priv.defs.inc:629
+#: etc/inc/priv.defs.inc:635 etc/inc/priv.defs.inc:631
+#: etc/inc/priv.defs.inc:631
+msgid "Allow access to the 'Load Balancer: Virtual Server: Edit' page."
+msgstr "ページ':仮想サーバーの編集ロードバランサ」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:616 etc/inc/priv.defs.inc:634
+#: etc/inc/priv.defs.inc:640 etc/inc/priv.defs.inc:636
+#: etc/inc/priv.defs.inc:636
+msgid "WebCfg - Package: Settings page"
+msgstr "WebCfg - パッケージ: Settingsページ"
+
+#: etc/inc/priv.defs.inc:617 etc/inc/priv.defs.inc:635
+#: etc/inc/priv.defs.inc:641 etc/inc/priv.defs.inc:637
+#: etc/inc/priv.defs.inc:637
+msgid "Allow access to the 'Package: Settings' page."
+msgstr "ページ: 「設定パッケージ'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:622 etc/inc/priv.defs.inc:640
+#: etc/inc/priv.defs.inc:646 etc/inc/priv.defs.inc:642
+#: etc/inc/priv.defs.inc:642
+msgid "WebCfg - Package: Edit page"
+msgstr "WebCfg - パッケージ: Editページ"
+
+#: etc/inc/priv.defs.inc:623 etc/inc/priv.defs.inc:641
+#: etc/inc/priv.defs.inc:647 etc/inc/priv.defs.inc:643
+#: etc/inc/priv.defs.inc:643
+msgid "Allow access to the 'Package: Edit' page."
+msgstr "ページ: 「編集パッケージ'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:628 etc/inc/priv.defs.inc:646
+#: etc/inc/priv.defs.inc:652 etc/inc/priv.defs.inc:648
+#: etc/inc/priv.defs.inc:648
+msgid "WebCfg - System: Package Manager page"
+msgstr "WebCfg - システム:パッケージマネージャ))ページ"
+
+#: etc/inc/priv.defs.inc:629 etc/inc/priv.defs.inc:647
+#: etc/inc/priv.defs.inc:653 etc/inc/priv.defs.inc:649
+#: etc/inc/priv.defs.inc:649
+msgid "Allow access to the 'System: Package Manager' page."
+msgstr "ページ:'パッケージマネージャシステム」へのアクセスを可能にする。"
+
+#: etc/inc/priv.defs.inc:634 etc/inc/priv.defs.inc:652
+#: etc/inc/priv.defs.inc:658 etc/inc/priv.defs.inc:654
+#: etc/inc/priv.defs.inc:654
+msgid "WebCfg - System: Package Manager: Install Package page"
+msgstr "WebCfg - システム:パッケージマネージャ:パッケージのインストール))ページ"
+
+#: etc/inc/priv.defs.inc:635 etc/inc/priv.defs.inc:653
+#: etc/inc/priv.defs.inc:659 etc/inc/priv.defs.inc:655
+#: etc/inc/priv.defs.inc:655
+msgid "Allow access to the 'System: Package Manager: Install Package' page."
+msgstr "へのアクセスを許可する' :パッケージマネージャ:システムのパッケージのインストール」ページを。"
+
+#: etc/inc/priv.defs.inc:640 etc/inc/priv.defs.inc:658
+#: etc/inc/priv.defs.inc:664 etc/inc/priv.defs.inc:660
+#: etc/inc/priv.defs.inc:660
+msgid "WebCfg - System: Package Manager: Installed page"
+msgstr "WebCfg - システム:パッケージマネージャ:インストールページ"
+
+#: etc/inc/priv.defs.inc:641 etc/inc/priv.defs.inc:659
+#: etc/inc/priv.defs.inc:665 etc/inc/priv.defs.inc:661
+#: etc/inc/priv.defs.inc:661
+msgid "Allow access to the 'System: Package Manager: Installed' page."
+msgstr "ページ':パッケージマネージャインストールされたシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:646 etc/inc/priv.defs.inc:664
+#: etc/inc/priv.defs.inc:670 etc/inc/priv.defs.inc:666
+#: etc/inc/priv.defs.inc:666
+msgid "WebCfg - Packages: Settings page"
+msgstr "WebCfg - パッケージ:Settingsページ"
+
+#: etc/inc/priv.defs.inc:647 etc/inc/priv.defs.inc:665
+#: etc/inc/priv.defs.inc:671 etc/inc/priv.defs.inc:667
+#: etc/inc/priv.defs.inc:667
+msgid "Allow access to the 'Packages: Settings' page."
+msgstr "ページ: 「設定パッケージ」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:652 etc/inc/priv.defs.inc:670
+#: etc/inc/priv.defs.inc:676 etc/inc/priv.defs.inc:672
+#: etc/inc/priv.defs.inc:672
+msgid "WebCfg - Diagnostics: Reboot System page"
+msgstr "WebCfg - 診断:再起動システムページ"
+
+#: etc/inc/priv.defs.inc:653 etc/inc/priv.defs.inc:671
+#: etc/inc/priv.defs.inc:677 etc/inc/priv.defs.inc:673
+#: etc/inc/priv.defs.inc:673
+msgid "Allow access to the 'Diagnostics: Reboot System' page."
+msgstr "ページ: 「再起動のシステム診断プログラム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:658 etc/inc/priv.defs.inc:676
+#: etc/inc/priv.defs.inc:682 etc/inc/priv.defs.inc:678
+#: etc/inc/priv.defs.inc:678
+msgid "WebCfg - Diagnostics: Restart HTTPD : System page"
+msgstr "WebCfg - 診断:再起動HTTPD:システムページ"
+
+#: etc/inc/priv.defs.inc:659 etc/inc/priv.defs.inc:677
+#: etc/inc/priv.defs.inc:683 etc/inc/priv.defs.inc:679
+#: etc/inc/priv.defs.inc:679
+msgid "Allow access to the 'Diagnostics: Restart HTTPD: System' page."
+msgstr "ページ':再起動httpdのシステム診断プログラム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:664 etc/inc/priv.defs.inc:682
+#: etc/inc/priv.defs.inc:688 etc/inc/priv.defs.inc:684
+#: etc/inc/priv.defs.inc:684
+msgid "WebCfg - Services: Captive portal page"
+msgstr "WebCfg - サービス:キャプティブポータルページ"
+
+#: etc/inc/priv.defs.inc:665 etc/inc/priv.defs.inc:683
+#: etc/inc/priv.defs.inc:689 etc/inc/priv.defs.inc:685
+#: etc/inc/priv.defs.inc:685
+msgid "Allow access to the 'Services: Captive portal' page."
+msgstr "ページ: 「キャプティブポータルサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:670 etc/inc/priv.defs.inc:688
+#: etc/inc/priv.defs.inc:694 etc/inc/priv.defs.inc:690
+#: etc/inc/priv.defs.inc:690
+msgid "WebCfg - Services: Captive portal: File Manager page"
+msgstr "WebCfg - サービス:キャプティブポータル:ファイルマネージャページ"
+
+#: etc/inc/priv.defs.inc:671 etc/inc/priv.defs.inc:689
+#: etc/inc/priv.defs.inc:695 etc/inc/priv.defs.inc:691
+#: etc/inc/priv.defs.inc:691
+msgid "Allow access to the 'Services: Captive portal: File Manager' page."
+msgstr "ページ':キャプティブポータルファイルマネージャサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:676 etc/inc/priv.defs.inc:688
+#: etc/inc/priv.defs.inc:694 etc/inc/priv.defs.inc:706
+#: etc/inc/priv.defs.inc:700 etc/inc/priv.defs.inc:712
+#: etc/inc/priv.defs.inc:696 etc/inc/priv.defs.inc:708
+#: etc/inc/priv.defs.inc:696 etc/inc/priv.defs.inc:708
+msgid "WebCfg - Services: Captive portal: Allowed IPs page"
+msgstr "WebCfg - サービス:キャプティブポータル:可IPアドレスページ"
+
+#: etc/inc/priv.defs.inc:677 etc/inc/priv.defs.inc:689
+#: etc/inc/priv.defs.inc:695 etc/inc/priv.defs.inc:707
+#: etc/inc/priv.defs.inc:701 etc/inc/priv.defs.inc:713
+#: etc/inc/priv.defs.inc:697 etc/inc/priv.defs.inc:709
+#: etc/inc/priv.defs.inc:697 etc/inc/priv.defs.inc:709
+msgid "Allow access to the 'Services: Captive portal: Allowed IPs' page."
+msgstr "ページ':キャプティブポータル可のIPサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:682 etc/inc/priv.defs.inc:694
+#: etc/inc/priv.defs.inc:700 etc/inc/priv.defs.inc:712
+#: etc/inc/priv.defs.inc:706 etc/inc/priv.defs.inc:718
+#: etc/inc/priv.defs.inc:702 etc/inc/priv.defs.inc:714
+#: etc/inc/priv.defs.inc:702 etc/inc/priv.defs.inc:714
+msgid "WebCfg - Services: Captive portal: Edit Allowed IPs page"
+msgstr "WebCfg - サービス:キャプティブポータル:編集可のIPページ"
+
+#: etc/inc/priv.defs.inc:683 etc/inc/priv.defs.inc:695
+#: etc/inc/priv.defs.inc:701 etc/inc/priv.defs.inc:713
+#: etc/inc/priv.defs.inc:707 etc/inc/priv.defs.inc:719
+#: etc/inc/priv.defs.inc:703 etc/inc/priv.defs.inc:715
+#: etc/inc/priv.defs.inc:703 etc/inc/priv.defs.inc:715
+msgid "Allow access to the 'Services: Captive portal: Edit Allowed IPs' page."
+msgstr "へのアクセスを許可する'サービス:キャプティブポータル:編集IPを許可」のページ。"
+
+#: etc/inc/priv.defs.inc:700 etc/inc/priv.defs.inc:718
+#: etc/inc/priv.defs.inc:724 etc/inc/priv.defs.inc:720
+#: etc/inc/priv.defs.inc:720
+msgid "WebCfg - Services: Captive portal: Mac Addresses page"
+msgstr "WebCfg - サービス:キャプティブポータル:MACアドレスのページ"
+
+#: etc/inc/priv.defs.inc:701 etc/inc/priv.defs.inc:719
+#: etc/inc/priv.defs.inc:725 etc/inc/priv.defs.inc:721
+#: etc/inc/priv.defs.inc:721
+msgid "Allow access to the 'Services: Captive portal: Mac Addresses' page."
+msgstr "ページ':キャプティブポータルのMACアドレスサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:706 etc/inc/priv.defs.inc:724
+#: etc/inc/priv.defs.inc:730 etc/inc/priv.defs.inc:726
+#: etc/inc/priv.defs.inc:726
+msgid "WebCfg - Services: Captive portal: Edit MAC Addresses page"
+msgstr "WebCfg - サービス:キャプティブポータル:編集のMACアドレス))ページ"
+
+#: etc/inc/priv.defs.inc:707 etc/inc/priv.defs.inc:725
+#: etc/inc/priv.defs.inc:731 etc/inc/priv.defs.inc:727
+#: etc/inc/priv.defs.inc:727
+msgid ""
+"Allow access to the 'Services: Captive portal: Edit MAC Addresses' page."
+msgstr "ページ"':キャプティブポータルの編集MACアドレスサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:712 etc/inc/priv.defs.inc:730
+#: etc/inc/priv.defs.inc:736 etc/inc/priv.defs.inc:744
+#: etc/inc/priv.defs.inc:744
+msgid "WebCfg - Services: Captive portal Vouchers page"
+msgstr "WebCfg - サービス:キャプティブポータルバウチャーページ"
+
+#: etc/inc/priv.defs.inc:713 etc/inc/priv.defs.inc:731
+#: etc/inc/priv.defs.inc:737 etc/inc/priv.defs.inc:745
+#: etc/inc/priv.defs.inc:745
+msgid "Allow access to the 'Services: Captive portal Vouchers' page."
+msgstr "ページ: 「キャプティブポータルバウチャーサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:724 etc/inc/priv.defs.inc:742
+#: etc/inc/priv.defs.inc:748 etc/inc/priv.defs.inc:756
+#: etc/inc/priv.defs.inc:756
+msgid "WebCfg - Services: DHCP server page"
+msgstr "WebCfg - サービス:DHCP Serverページ"
+
+#: etc/inc/priv.defs.inc:725 etc/inc/priv.defs.inc:743
+#: etc/inc/priv.defs.inc:749 etc/inc/priv.defs.inc:757
+#: etc/inc/priv.defs.inc:757
+msgid "Allow access to the 'Services: DHCP server' page."
+msgstr "ページ:「DHCPサーバサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:730 etc/inc/priv.defs.inc:748
+#: etc/inc/priv.defs.inc:754 etc/inc/priv.defs.inc:762
+#: etc/inc/priv.defs.inc:762
+msgid "WebCfg - Services: DHCP Server : Edit static mapping page"
+msgstr "WebCfg - サービス:DHCPサーバ:静的マッピングページを編集"
+
+#: etc/inc/priv.defs.inc:731 etc/inc/priv.defs.inc:749
+#: etc/inc/priv.defs.inc:755 etc/inc/priv.defs.inc:763
+#: etc/inc/priv.defs.inc:763
+msgid "Allow access to the 'Services: DHCP Server : Edit static mapping' page."
+msgstr "ページ': DHCPサーバの編集静的マッピングサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:736 etc/inc/priv.defs.inc:754
+#: etc/inc/priv.defs.inc:760 etc/inc/priv.defs.inc:768
+#: etc/inc/priv.defs.inc:768
+msgid "WebCfg - Services: DHCP Relay page"
+msgstr "WebCfg - サービス:DHCPリレーページ"
+
+#: etc/inc/priv.defs.inc:737 etc/inc/priv.defs.inc:755
+#: etc/inc/priv.defs.inc:761 etc/inc/priv.defs.inc:769
+#: etc/inc/priv.defs.inc:769
+msgid "Allow access to the 'Services: DHCP Relay' page."
+msgstr "ページ: 「 DHCPリレーサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:742 etc/inc/priv.defs.inc:760
+#: etc/inc/priv.defs.inc:766 etc/inc/priv.defs.inc:774
+#: etc/inc/priv.defs.inc:774
+msgid "WebCfg - Services: DHCPv6 Relay page"
+msgstr "WebCfg - Services: DHCPv6 Relay page"
+
+#: etc/inc/priv.defs.inc:743 etc/inc/priv.defs.inc:761
+#: etc/inc/priv.defs.inc:767 etc/inc/priv.defs.inc:775
+#: etc/inc/priv.defs.inc:775
+msgid "Allow access to the 'Services: DHCPv6 Relay' page."
+msgstr "ページ: 「 DHCPv6リレーサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:748 etc/inc/priv.defs.inc:766
+#: etc/inc/priv.defs.inc:772 etc/inc/priv.defs.inc:780
+#: etc/inc/priv.defs.inc:780
+msgid "WebCfg - Services: DNS Forwarder page"
+msgstr "WebCfg - サービス: DNSフォワーダページ"
+
+#: etc/inc/priv.defs.inc:749 etc/inc/priv.defs.inc:767
+#: etc/inc/priv.defs.inc:773 etc/inc/priv.defs.inc:781
+#: etc/inc/priv.defs.inc:781
+msgid "Allow access to the 'Services: DNS Forwarder' page."
+msgstr "ページ: 「 DNSフォワーダサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:754 etc/inc/priv.defs.inc:772
+#: etc/inc/priv.defs.inc:778 etc/inc/priv.defs.inc:786
+#: etc/inc/priv.defs.inc:786
+msgid "WebCfg - Services: DNS Forwarder: Edit Domain Override page"
+msgstr "WebCfg - サービス: DNSフォワーダ:ドメイン編集オーバーライドページ"
+
+#: etc/inc/priv.defs.inc:755 etc/inc/priv.defs.inc:773
+#: etc/inc/priv.defs.inc:779 etc/inc/priv.defs.inc:787
+#: etc/inc/priv.defs.inc:787
+msgid ""
+"Allow access to the 'Services: DNS Forwarder: Edit Domain Override' page."
+msgstr "ページ"': DNSフォワーダドメイン編集オーバーライドサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:760 etc/inc/priv.defs.inc:778
+#: etc/inc/priv.defs.inc:784 etc/inc/priv.defs.inc:792
+#: etc/inc/priv.defs.inc:792
+msgid "WebCfg - Services: DNS Forwarder: Edit host page"
+msgstr "WebCfg - サービス: DNSフォワーダ:編集ホストページ"
+
+#: etc/inc/priv.defs.inc:761 etc/inc/priv.defs.inc:779
+#: etc/inc/priv.defs.inc:785 etc/inc/priv.defs.inc:793
+#: etc/inc/priv.defs.inc:793
+msgid "Allow access to the 'Services: DNS Forwarder: Edit host' page."
+msgstr "ページ': DNSフォワーダの編集ホストサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:766 etc/inc/priv.defs.inc:784
+#: etc/inc/priv.defs.inc:790 etc/inc/priv.defs.inc:798
+#: etc/inc/priv.defs.inc:798
+msgid "WebCfg - Services: Dynamic DNS clients page"
+msgstr "WebCfg - サービス:ダイナミックDNSクライアントのページ"
+
+#: etc/inc/priv.defs.inc:767 etc/inc/priv.defs.inc:785
+#: etc/inc/priv.defs.inc:791 etc/inc/priv.defs.inc:799
+#: etc/inc/priv.defs.inc:799
+msgid "Allow access to the 'Services: Dynamic DNS clients' page."
+msgstr "ページ: 「ダイナミックDNSクライアントサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:772 etc/inc/priv.defs.inc:790
+#: etc/inc/priv.defs.inc:796 etc/inc/priv.defs.inc:804
+#: etc/inc/priv.defs.inc:804
+msgid "WebCfg - Services: Dynamic DNS client page"
+msgstr "WebCfg - サービス:ダイナミックDNSクライアントページ"
+
+#: etc/inc/priv.defs.inc:773 etc/inc/priv.defs.inc:791
+#: etc/inc/priv.defs.inc:797 etc/inc/priv.defs.inc:805
+#: etc/inc/priv.defs.inc:805
+msgid "Allow access to the 'Services: Dynamic DNS client' page."
+msgstr "ページ: 「ダイナミックDNSクライアントサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:778 etc/inc/priv.defs.inc:796
+#: etc/inc/priv.defs.inc:802 etc/inc/priv.defs.inc:810
+#: etc/inc/priv.defs.inc:810
+msgid "WebCfg - Services: Igmpproxy page"
+msgstr "WebCfg - サービス: Igmpproxyページ"
+
+#: etc/inc/priv.defs.inc:779 etc/inc/priv.defs.inc:797
+#: etc/inc/priv.defs.inc:803 etc/inc/priv.defs.inc:811
+#: etc/inc/priv.defs.inc:811
+msgid "Allow access to the 'Services: Igmpproxy' page."
+msgstr "ページ:' Igmpproxyサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:784 etc/inc/priv.defs.inc:802
+#: etc/inc/priv.defs.inc:808 etc/inc/priv.defs.inc:816
+#: etc/inc/priv.defs.inc:816
+msgid "WebCfg - Firewall: Igmpproxy: Edit page"
+msgstr "WebCfg - ファイアウォール: Igmpproxy : Editページ"
+
+#: etc/inc/priv.defs.inc:785 etc/inc/priv.defs.inc:803
+#: etc/inc/priv.defs.inc:809 etc/inc/priv.defs.inc:817
+#: etc/inc/priv.defs.inc:817
+msgid "Allow access to the 'Firewall: Igmpproxy' page."
+msgstr "' : Igmpproxyファイアウォール」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:790 etc/inc/priv.defs.inc:808
+#: etc/inc/priv.defs.inc:814 etc/inc/priv.defs.inc:822
+#: etc/inc/priv.defs.inc:822
+msgid "WebCfg - Services: RFC 2136 clients page"
+msgstr "WebCfg - サービス: RFC 2136 Clientsページ"
+
+#: etc/inc/priv.defs.inc:791 etc/inc/priv.defs.inc:809
+#: etc/inc/priv.defs.inc:815 etc/inc/priv.defs.inc:823
+#: etc/inc/priv.defs.inc:823
+msgid "Allow access to the 'Services: RFC 2136 clients' page."
+msgstr "ページ:' 、RFC 2136のクライアント·サービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:796 etc/inc/priv.defs.inc:814
+#: etc/inc/priv.defs.inc:820 etc/inc/priv.defs.inc:828
+#: etc/inc/priv.defs.inc:828
+msgid "WebCfg - Services: SNMP page"
+msgstr "WebCfg - サービス:SNMP]ページ"
+
+#: etc/inc/priv.defs.inc:797 etc/inc/priv.defs.inc:815
+#: etc/inc/priv.defs.inc:821 etc/inc/priv.defs.inc:829
+#: etc/inc/priv.defs.inc:829
+msgid "Allow access to the 'Services: SNMP' page."
+msgstr "ページ: 「 SNMPサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:802 etc/inc/priv.defs.inc:820
+#: etc/inc/priv.defs.inc:826 etc/inc/priv.defs.inc:834
+#: etc/inc/priv.defs.inc:834
+msgid "WebCfg - Services: Wake on LAN page"
+msgstr "WebCfg - サービス: LANのページでウェイク"
+
+#: etc/inc/priv.defs.inc:803 etc/inc/priv.defs.inc:821
+#: etc/inc/priv.defs.inc:827 etc/inc/priv.defs.inc:835
+#: etc/inc/priv.defs.inc:835
+msgid "Allow access to the 'Services: Wake on LAN' page."
+msgstr "ページ: 「モーニングLAN上のサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:808 etc/inc/priv.defs.inc:826
+#: etc/inc/priv.defs.inc:832 etc/inc/priv.defs.inc:840
+#: etc/inc/priv.defs.inc:840
+msgid "WebCfg - Services: Wake on LAN: Edit page"
+msgstr "WebCfg - サービス: Wake on LANは: Editページ"
+
+#: etc/inc/priv.defs.inc:809 etc/inc/priv.defs.inc:827
+#: etc/inc/priv.defs.inc:833 etc/inc/priv.defs.inc:841
+#: etc/inc/priv.defs.inc:841
+msgid "Allow access to the 'Services: Wake on LAN: Edit' page."
+msgstr "ページ':ウェイクLAN上のサービスを編集」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:820 etc/inc/priv.defs.inc:838
+#: etc/inc/priv.defs.inc:844 etc/inc/priv.defs.inc:852
+#: etc/inc/priv.defs.inc:852
+msgid "WebCfg - Hidden: Detailed Status page"
+msgstr "WebCfg - 非表示:詳細ステータスページには、"
+
+#: etc/inc/priv.defs.inc:821 etc/inc/priv.defs.inc:839
+#: etc/inc/priv.defs.inc:845 etc/inc/priv.defs.inc:853
+#: etc/inc/priv.defs.inc:853
+msgid "Allow access to the 'Hidden: Detailed Status' page."
+msgstr "ページ: 「詳細ステータス隠れた」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:826 etc/inc/priv.defs.inc:844
+#: etc/inc/priv.defs.inc:850 etc/inc/priv.defs.inc:858
+#: etc/inc/priv.defs.inc:858
+msgid "WebCfg - Status: Captive portal page"
+msgstr "WebCfg - ステータス:キャプティブポータルページ"
+
+#: etc/inc/priv.defs.inc:827 etc/inc/priv.defs.inc:845
+#: etc/inc/priv.defs.inc:851 etc/inc/priv.defs.inc:859
+#: etc/inc/priv.defs.inc:859
+msgid "Allow access to the 'Status: Captive portal' page."
+msgstr "ページ: 「キャプティブポータルステータス'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:832 etc/inc/priv.defs.inc:850
+#: etc/inc/priv.defs.inc:856 etc/inc/priv.defs.inc:864
+#: etc/inc/priv.defs.inc:864
+msgid "WebCfg - Status: Captive portal test Vouchers page"
+msgstr "WebCfg - ステータス:キャプティブポータルの試験バウチャーページ"
+
+#: etc/inc/priv.defs.inc:833 etc/inc/priv.defs.inc:851
+#: etc/inc/priv.defs.inc:857 etc/inc/priv.defs.inc:865
+#: etc/inc/priv.defs.inc:865
+msgid "Allow access to the 'Status: Captive portal Test Vouchers' page."
+msgstr "ページ: 「キャプティブポータルのテストバウチャー状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:838 etc/inc/priv.defs.inc:856
+#: etc/inc/priv.defs.inc:862 etc/inc/priv.defs.inc:870
+#: etc/inc/priv.defs.inc:870
+msgid "WebCfg - Status: Captive portal Voucher Rolls page"
+msgstr "WebCfg - ステータス:キャプティブポータルバウチャーロールスロイスページ"
+
+#: etc/inc/priv.defs.inc:839 etc/inc/priv.defs.inc:857
+#: etc/inc/priv.defs.inc:863 etc/inc/priv.defs.inc:871
+#: etc/inc/priv.defs.inc:871
+msgid "Allow access to the 'Status: Captive portal Voucher Rolls' page."
+msgstr "ページ: 「キャプティブポータルバウチャーロールスロイス状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:844 etc/inc/priv.defs.inc:862
+#: etc/inc/priv.defs.inc:868 etc/inc/priv.defs.inc:876
+#: etc/inc/priv.defs.inc:876
+msgid "WebCfg - Status: Captive portal Vouchers page"
+msgstr "WebCfg - ステータス:キャプティブポータルバウチャーページ"
+
+#: etc/inc/priv.defs.inc:845 etc/inc/priv.defs.inc:863
+#: etc/inc/priv.defs.inc:869 etc/inc/priv.defs.inc:877
+#: etc/inc/priv.defs.inc:877
+msgid "Allow access to the 'Status: Captive portal Vouchers' page."
+msgstr "ページ: 「キャプティブポータルバウチャー状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:850 etc/inc/priv.defs.inc:868
+#: etc/inc/priv.defs.inc:874 etc/inc/priv.defs.inc:882
+#: etc/inc/priv.defs.inc:882
+msgid "WebCfg - Status: DHCP leases page"
+msgstr "WebCfg - ステータス: DHCPは、ページをリース"
+
+#: etc/inc/priv.defs.inc:851 etc/inc/priv.defs.inc:869
+#: etc/inc/priv.defs.inc:875 etc/inc/priv.defs.inc:883
+#: etc/inc/priv.defs.inc:883
+msgid "Allow access to the 'Status: DHCP leases' page."
+msgstr "ページ: 「 DHCPのリース状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:856 etc/inc/priv.defs.inc:874
+#: etc/inc/priv.defs.inc:880 etc/inc/priv.defs.inc:888
+#: etc/inc/priv.defs.inc:888
+msgid "WebCfg - Status: Filter Reload Status page"
+msgstr "WebCfg - ステータス:フィルタのリロードステータスページ"
+
+#: etc/inc/priv.defs.inc:857 etc/inc/priv.defs.inc:875
+#: etc/inc/priv.defs.inc:881 etc/inc/priv.defs.inc:889
+#: etc/inc/priv.defs.inc:889
+msgid "Allow access to the 'Status: Filter Reload Status' page."
+msgstr "へのアクセスを許可します。ページ「ステータスをリロードステータスフィルタ」 。"
+
+#: etc/inc/priv.defs.inc:862 etc/inc/priv.defs.inc:880
+#: etc/inc/priv.defs.inc:886 etc/inc/priv.defs.inc:894
+#: etc/inc/priv.defs.inc:894
+msgid "WebCfg - Status: Gateway Groups page"
+msgstr "WebCfg - ステータス:ゲートウェイグループ]"
+
+#: etc/inc/priv.defs.inc:863 etc/inc/priv.defs.inc:881
+#: etc/inc/priv.defs.inc:887 etc/inc/priv.defs.inc:895
+#: etc/inc/priv.defs.inc:895
+msgid "Allow access to the 'Status: Gateway Groups' page."
+msgstr "ページ:'ゲートウェイグループステータス'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:868 etc/inc/priv.defs.inc:886
+#: etc/inc/priv.defs.inc:892 etc/inc/priv.defs.inc:900
+#: etc/inc/priv.defs.inc:900
+msgid "WebCfg - Status: Gateways page"
+msgstr "WebCfg - ステータス:ゲートウェイページ"
+
+#: etc/inc/priv.defs.inc:869 etc/inc/priv.defs.inc:887
+#: etc/inc/priv.defs.inc:893 etc/inc/priv.defs.inc:901
+#: etc/inc/priv.defs.inc:901
+msgid "Allow access to the 'Status: Gateways' page."
+msgstr "ページ:'ゲートウェイの状況」にアクセスすることができます。"
+
+#: etc/inc/priv.defs.inc:874 etc/inc/priv.defs.inc:892
+#: etc/inc/priv.defs.inc:898 etc/inc/priv.defs.inc:906
+#: etc/inc/priv.defs.inc:906
+msgid "WebCfg - Status: Traffic Graph page"
+msgstr "WebCfg - ステータス:トラフィックグラフページ"
+
+#: etc/inc/priv.defs.inc:875 etc/inc/priv.defs.inc:893
+#: etc/inc/priv.defs.inc:899 etc/inc/priv.defs.inc:907
+#: etc/inc/priv.defs.inc:907
+msgid "Allow access to the 'Status: Traffic Graph' page."
+msgstr "ページ: 「トラフィックグラフ状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:881 etc/inc/priv.defs.inc:899
+#: etc/inc/priv.defs.inc:905 etc/inc/priv.defs.inc:913
+#: etc/inc/priv.defs.inc:913
+msgid "WebCfg - Status: CPU load page"
+msgstr "WebCfg - ステータス: CPU負荷のページ"
+
+#: etc/inc/priv.defs.inc:882 etc/inc/priv.defs.inc:900
+#: etc/inc/priv.defs.inc:906 etc/inc/priv.defs.inc:914
+#: etc/inc/priv.defs.inc:914
+msgid "Allow access to the 'Status: CPU load' page."
+msgstr "ページ: 「 CPU負荷状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:887 etc/inc/priv.defs.inc:905
+#: etc/inc/priv.defs.inc:911 etc/inc/priv.defs.inc:919
+#: etc/inc/priv.defs.inc:919
+msgid "WebCfg - Status: Interfaces page"
+msgstr "WebCfg - ステータス: Interfacesページ"
+
+#: etc/inc/priv.defs.inc:888 etc/inc/priv.defs.inc:906
+#: etc/inc/priv.defs.inc:912 etc/inc/priv.defs.inc:920
+#: etc/inc/priv.defs.inc:920
+msgid "Allow access to the 'Status: Interfaces' page."
+msgstr "ページ: 「インタフェースの状態」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:893 etc/inc/priv.defs.inc:911
+#: etc/inc/priv.defs.inc:917 etc/inc/priv.defs.inc:925
+#: etc/inc/priv.defs.inc:925
+msgid "WebCfg - Status: Load Balancer: Pool page"
+msgstr "WebCfg - ステータス:ロード·バランサ:プールページ"
+
+#: etc/inc/priv.defs.inc:894 etc/inc/priv.defs.inc:912
+#: etc/inc/priv.defs.inc:918 etc/inc/priv.defs.inc:926
+#: etc/inc/priv.defs.inc:926
+msgid "Allow access to the 'Status: Load Balancer: Pool' page."
+msgstr "へのアクセスを許可する'ステータス:ロード·バランサ:プール'ページを。"
+
+#: etc/inc/priv.defs.inc:899 etc/inc/priv.defs.inc:917
+#: etc/inc/priv.defs.inc:923 etc/inc/priv.defs.inc:931
+#: etc/inc/priv.defs.inc:931
+msgid "WebCfg - Status: Load Balancer: Virtual Server page"
+msgstr "WebCfg - ステータス:仮想サーバーのページ:バランサをロード"
+
+#: etc/inc/priv.defs.inc:900 etc/inc/priv.defs.inc:918
+#: etc/inc/priv.defs.inc:924 etc/inc/priv.defs.inc:932
+#: etc/inc/priv.defs.inc:932
+msgid "Allow access to the 'Status: Load Balancer: Virtual Server' page."
+msgstr "へのアクセスを許可する'ステータス:ロード·バランサ:仮想サーバー」ページを。"
+
+#: etc/inc/priv.defs.inc:905 etc/inc/priv.defs.inc:923
+#: etc/inc/priv.defs.inc:929 etc/inc/priv.defs.inc:937
+#: etc/inc/priv.defs.inc:937
+msgid "WebCfg - Status: OpenVPN page"
+msgstr "WebCfg - ステータス: OpenVPNのページ"
+
+#: etc/inc/priv.defs.inc:906 etc/inc/priv.defs.inc:924
+#: etc/inc/priv.defs.inc:930 etc/inc/priv.defs.inc:938
+#: etc/inc/priv.defs.inc:938
+msgid "Allow access to the 'Status: OpenVPN' page."
+msgstr "ページ: 「 OpenVPNの状況」にアクセスすることができます。"
+
+#: etc/inc/priv.defs.inc:911 etc/inc/priv.defs.inc:929
+#: etc/inc/priv.defs.inc:935 etc/inc/priv.defs.inc:943
+#: etc/inc/priv.defs.inc:943
+msgid "WebCfg - Status: Traffic shaper: Queues page"
+msgstr "WebCfg - ステータス:トラフィックシェイ:キューページ"
+
+#: etc/inc/priv.defs.inc:912 etc/inc/priv.defs.inc:930
+#: etc/inc/priv.defs.inc:936 etc/inc/priv.defs.inc:944
+#: etc/inc/priv.defs.inc:944
+msgid "Allow access to the 'Status: Traffic shaper: Queues' page."
+msgstr "ページ':トラフィックシェーパキューの状態」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:917 etc/inc/priv.defs.inc:935
+#: etc/inc/priv.defs.inc:941 etc/inc/priv.defs.inc:949
+#: etc/inc/priv.defs.inc:949
+msgid "WebCfg - Status: RRD Graphs page"
+msgstr "WebCfg - ステータス: RRDグラフページ"
+
+#: etc/inc/priv.defs.inc:918 etc/inc/priv.defs.inc:936
+#: etc/inc/priv.defs.inc:942 etc/inc/priv.defs.inc:950
+#: etc/inc/priv.defs.inc:950
+msgid "Allow access to the 'Status: RRD Graphs' page."
+msgstr "ページ:' RRDグラフの状況」にアクセスすることができます。"
+
+#: etc/inc/priv.defs.inc:924 etc/inc/priv.defs.inc:942
+#: etc/inc/priv.defs.inc:948 etc/inc/priv.defs.inc:956
+#: etc/inc/priv.defs.inc:956
+msgid "WebCfg - Status: RRD Graphs settings page"
+msgstr "WebCfg - ステータス: RRDグラフの設定ページ"
+
+#: etc/inc/priv.defs.inc:925 etc/inc/priv.defs.inc:943
+#: etc/inc/priv.defs.inc:949 etc/inc/priv.defs.inc:957
+#: etc/inc/priv.defs.inc:957
+msgid "Allow access to the 'Status: RRD Graphs: settings' page."
+msgstr "ページ': RRDグラフの設定状況」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:930 etc/inc/priv.defs.inc:948
+#: etc/inc/priv.defs.inc:954 etc/inc/priv.defs.inc:962
+#: etc/inc/priv.defs.inc:962
+msgid "WebCfg - Status: Services page"
+msgstr "WebCfg - ステータス:サービスページ"
+
+#: etc/inc/priv.defs.inc:931 etc/inc/priv.defs.inc:949
+#: etc/inc/priv.defs.inc:955 etc/inc/priv.defs.inc:963
+#: etc/inc/priv.defs.inc:963
+msgid "Allow access to the 'Status: Services' page."
+msgstr "ページ: 「サービスステータス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:936 etc/inc/priv.defs.inc:954
+#: etc/inc/priv.defs.inc:960 etc/inc/priv.defs.inc:968
+#: etc/inc/priv.defs.inc:968
+msgid "WebCfg - Status: UPnP Status page"
+msgstr "WebCfg - ステータス: UPnPのステータスページ"
+
+#: etc/inc/priv.defs.inc:937 etc/inc/priv.defs.inc:955
+#: etc/inc/priv.defs.inc:961 etc/inc/priv.defs.inc:969
+#: etc/inc/priv.defs.inc:969
+msgid "Allow access to the 'Status: UPnP Status' page."
+msgstr "ページ: 「 UPnPのステータスステータス'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:942 etc/inc/priv.defs.inc:960
+#: etc/inc/priv.defs.inc:966 etc/inc/priv.defs.inc:974
+#: etc/inc/priv.defs.inc:974
+msgid "WebCfg - Status: Wireless page"
+msgstr "WebCfg - ステータス:ワイヤレスページ"
+
+#: etc/inc/priv.defs.inc:943 etc/inc/priv.defs.inc:961
+#: etc/inc/priv.defs.inc:967 etc/inc/priv.defs.inc:975
+#: etc/inc/priv.defs.inc:975
+msgid "Allow access to the 'Status: Wireless' page."
+msgstr "ページ: 「ワイヤレスステータス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:948 etc/inc/priv.defs.inc:966
+#: etc/inc/priv.defs.inc:972 etc/inc/priv.defs.inc:980
+#: etc/inc/priv.defs.inc:980
+msgid "WebCfg - System: General Setup page"
+msgstr "WebCfg - システム: General Setupページ"
+
+#: etc/inc/priv.defs.inc:949 etc/inc/priv.defs.inc:967
+#: etc/inc/priv.defs.inc:973 etc/inc/priv.defs.inc:981
+#: etc/inc/priv.defs.inc:981
+msgid "Allow access to the 'System: General Setup' page."
+msgstr "ページ: 「一般的なセットアップシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:954 etc/inc/priv.defs.inc:972
+#: etc/inc/priv.defs.inc:978 etc/inc/priv.defs.inc:986
+#: etc/inc/priv.defs.inc:986
+msgid "WebCfg - System: Advanced: Admin Access Page"
+msgstr "WebCfg - システム:高度:管理アクセスページ"
+
+#: etc/inc/priv.defs.inc:955 etc/inc/priv.defs.inc:973
+#: etc/inc/priv.defs.inc:979 etc/inc/priv.defs.inc:987
+#: etc/inc/priv.defs.inc:987
+msgid "Allow access to the 'System: Advanced: Admin Access' page."
+msgstr "ページ':上級管理者のアクセス·システム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:960 etc/inc/priv.defs.inc:978
+#: etc/inc/priv.defs.inc:984 etc/inc/priv.defs.inc:992
+#: etc/inc/priv.defs.inc:992
+msgid "WebCfg - System: Advanced: Firewall and NAT page"
+msgstr "WebCfg - システム:高度:ファイアウォールやNATのページ"
+
+#: etc/inc/priv.defs.inc:961 etc/inc/priv.defs.inc:979
+#: etc/inc/priv.defs.inc:985 etc/inc/priv.defs.inc:993
+#: etc/inc/priv.defs.inc:993
+msgid "Allow access to the 'System: Advanced: Firewall and NAT' page."
+msgstr "' :高度:ファイアウォールとNATシステム」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:966 etc/inc/priv.defs.inc:984
+#: etc/inc/priv.defs.inc:990 etc/inc/priv.defs.inc:998
+#: etc/inc/priv.defs.inc:998
+msgid "WebCfg - System: Advanced: Miscellaneous page"
+msgstr "WebCfg - システム:高度:その他のページ"
+
+#: etc/inc/priv.defs.inc:967 etc/inc/priv.defs.inc:985
+#: etc/inc/priv.defs.inc:991 etc/inc/priv.defs.inc:999
+#: etc/inc/priv.defs.inc:999
+msgid "Allow access to the 'System: Advanced: Miscellaneous' page."
+msgstr "' :高度:雑多なシステム」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:972 etc/inc/priv.defs.inc:990
+#: etc/inc/priv.defs.inc:996 etc/inc/priv.defs.inc:1004
+#: etc/inc/priv.defs.inc:1004
+msgid "WebCfg - System: Advanced: Network page"
+msgstr "WebCfg - システム:拡張:ネットワークページ"
+
+#: etc/inc/priv.defs.inc:973 etc/inc/priv.defs.inc:991
+#: etc/inc/priv.defs.inc:997 etc/inc/priv.defs.inc:1005
+#: etc/inc/priv.defs.inc:1005
+msgid "Allow access to the 'System: Advanced: Networking' page."
+msgstr "' :高度:ネットワーキングシステム」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:978 etc/inc/priv.defs.inc:984
+#: etc/inc/priv.defs.inc:996 etc/inc/priv.defs.inc:1002
+#: etc/inc/priv.defs.inc:1008 etc/inc/priv.defs.inc:1010
+#: etc/inc/priv.defs.inc:1016 etc/inc/priv.defs.inc:1010
+#: etc/inc/priv.defs.inc:1016
+msgid "WebCfg - System: Advanced: Tunables page"
+msgstr "WebCfg - システム:高度:チューニングパラメータページ"
+
+#: etc/inc/priv.defs.inc:979 etc/inc/priv.defs.inc:985
+#: etc/inc/priv.defs.inc:997 etc/inc/priv.defs.inc:1003
+#: etc/inc/priv.defs.inc:1009 etc/inc/priv.defs.inc:1011
+#: etc/inc/priv.defs.inc:1017 etc/inc/priv.defs.inc:1011
+#: etc/inc/priv.defs.inc:1017
+msgid "Allow access to the 'System: Advanced: Tunables' page."
+msgstr "' :高度:チューニング可能システム」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:990 etc/inc/priv.defs.inc:1008
+#: etc/inc/priv.defs.inc:1014 etc/inc/priv.defs.inc:1022
+#: etc/inc/priv.defs.inc:1022
+msgid "WebCfg - System: Authentication Servers"
+msgstr "WebCfg - システム:認証サーバー"
+
+#: etc/inc/priv.defs.inc:991 etc/inc/priv.defs.inc:1009
+#: etc/inc/priv.defs.inc:1015 etc/inc/priv.defs.inc:1023
+#: etc/inc/priv.defs.inc:1023
+msgid "Allow access to the 'System: Authentication Servers' page."
+msgstr "ページ:'認証サーバーシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:996 etc/inc/priv.defs.inc:1014
+#: etc/inc/priv.defs.inc:1020 etc/inc/priv.defs.inc:1028
+#: etc/inc/priv.defs.inc:1028
+msgid "WebCfg - System: CA Manager"
+msgstr "WebCfg - システム:カリフォルニアマネージャー"
+
+#: etc/inc/priv.defs.inc:997 etc/inc/priv.defs.inc:1015
+#: etc/inc/priv.defs.inc:1021 etc/inc/priv.defs.inc:1029
+#: etc/inc/priv.defs.inc:1029
+msgid "Allow access to the 'System: CA Manager' page."
+msgstr "ページ:'CAマネージャシステム」へのアクセスを可能にする。"
+
+#: etc/inc/priv.defs.inc:1002 etc/inc/priv.defs.inc:1020
+#: etc/inc/priv.defs.inc:1026 etc/inc/priv.defs.inc:1034
+#: etc/inc/priv.defs.inc:1034
+msgid "WebCfg - System: Certificate Manager"
+msgstr "WebCfg - システム:証明書マネージャ"
+
+#: etc/inc/priv.defs.inc:1003 etc/inc/priv.defs.inc:1021
+#: etc/inc/priv.defs.inc:1027 etc/inc/priv.defs.inc:1035
+#: etc/inc/priv.defs.inc:1035
+msgid "Allow access to the 'System: Certificate Manager' page."
+msgstr "ページ: 「証明書マネージャシステム」へのアクセスを可能にする。"
+
+#: etc/inc/priv.defs.inc:1008 etc/inc/priv.defs.inc:1026
+#: etc/inc/priv.defs.inc:1032 etc/inc/priv.defs.inc:1040
+#: etc/inc/priv.defs.inc:1040
+msgid "WebCfg - System: CRL Manager"
+msgstr "WebCfg - システム: CRLマネージャー"
+
+#: etc/inc/priv.defs.inc:1009 etc/inc/priv.defs.inc:1027
+#: etc/inc/priv.defs.inc:1033 etc/inc/priv.defs.inc:1041
+#: etc/inc/priv.defs.inc:1041
+msgid "Allow access to the 'System: CRL Manager' page."
+msgstr "ページ: 「 CRLマネージャシステム」へのアクセスを可能にする。"
+
+#: etc/inc/priv.defs.inc:1014 etc/inc/priv.defs.inc:1032
+#: etc/inc/priv.defs.inc:1038 etc/inc/priv.defs.inc:1046
+#: etc/inc/priv.defs.inc:1046
+msgid "WebCfg - System: Firmware: Manual Update page"
+msgstr "WebCfg - システム:ファームウェア:手動アップデートページ"
+
+#: etc/inc/priv.defs.inc:1015 etc/inc/priv.defs.inc:1033
+#: etc/inc/priv.defs.inc:1039 etc/inc/priv.defs.inc:1047
+#: etc/inc/priv.defs.inc:1047
+msgid "Allow access to the 'System: Firmware: Manual Update' page."
+msgstr "ページ':ファームウェアの手動更新システム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1020 etc/inc/priv.defs.inc:1038
+#: etc/inc/priv.defs.inc:1044 etc/inc/priv.defs.inc:1052
+#: etc/inc/priv.defs.inc:1052
+msgid "WebCfg - System: Firmware: Check For Update page"
+msgstr "WebCfg - システム:ファームウェア:アップデートページではチェック"
+
+#: etc/inc/priv.defs.inc:1021 etc/inc/priv.defs.inc:1039
+#: etc/inc/priv.defs.inc:1045 etc/inc/priv.defs.inc:1053
+#: etc/inc/priv.defs.inc:1053
+msgid "Allow access to the 'System: Firmware: Check For Update' page."
+msgstr "ページ':ファームウェアの更新を確認システム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1026 etc/inc/priv.defs.inc:1044
+#: etc/inc/priv.defs.inc:1050 etc/inc/priv.defs.inc:1058
+#: etc/inc/priv.defs.inc:1058
+msgid "WebCfg - System: Firmware: Auto Update page"
+msgstr "WebCfg - システム:ファームウェア:自動アップデートページ"
+
+#: etc/inc/priv.defs.inc:1027 etc/inc/priv.defs.inc:1045
+#: etc/inc/priv.defs.inc:1051 etc/inc/priv.defs.inc:1059
+#: etc/inc/priv.defs.inc:1059
+msgid "Allow access to the 'System: Firmware: Auto Update' page."
+msgstr "ページ':ファームウェアの自動アップデートシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1032 etc/inc/priv.defs.inc:1050
+#: etc/inc/priv.defs.inc:1056 etc/inc/priv.defs.inc:1064
+#: etc/inc/priv.defs.inc:1064
+msgid "WebCfg - System: Firmware: Settings page"
+msgstr "WebCfg - システム:ファームウェア: Settingsページ"
+
+#: etc/inc/priv.defs.inc:1033 etc/inc/priv.defs.inc:1051
+#: etc/inc/priv.defs.inc:1057 etc/inc/priv.defs.inc:1065
+#: etc/inc/priv.defs.inc:1065
+msgid "Allow access to the 'System: Firmware: Settings' page."
+msgstr "ページ':ファームウェアの設定システム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1038 etc/inc/priv.defs.inc:1056
+#: etc/inc/priv.defs.inc:1062 etc/inc/priv.defs.inc:1070
+#: etc/inc/priv.defs.inc:1070
+msgid "WebCfg - System: Gateway Groups page"
+msgstr "WebCfg - システム:ゲートウェイグループ]"
+
+#: etc/inc/priv.defs.inc:1039 etc/inc/priv.defs.inc:1057
+#: etc/inc/priv.defs.inc:1063 etc/inc/priv.defs.inc:1071
+#: etc/inc/priv.defs.inc:1071
+msgid "Allow access to the 'System: Gateway Groups' page."
+msgstr "ページ:'ゲートウェイグループシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1044 etc/inc/priv.defs.inc:1062
+#: etc/inc/priv.defs.inc:1068 etc/inc/priv.defs.inc:1076
+#: etc/inc/priv.defs.inc:1076
+msgid "WebCfg - System: Gateways: Edit Gateway Groups page"
+msgstr "WebCfg - システム:ゲートウェイ:編集ゲートウェイグループ]"
+
+#: etc/inc/priv.defs.inc:1045 etc/inc/priv.defs.inc:1063
+#: etc/inc/priv.defs.inc:1069 etc/inc/priv.defs.inc:1077
+#: etc/inc/priv.defs.inc:1077
+msgid "Allow access to the 'System: Gateways: Edit Gateway Groups' page."
+msgstr "ページ':ゲートウェイの編集ゲートウェイグループシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1050 etc/inc/priv.defs.inc:1068
+#: etc/inc/priv.defs.inc:1074 etc/inc/priv.defs.inc:1082
+#: etc/inc/priv.defs.inc:1082
+msgid "WebCfg - System: Gateways page"
+msgstr "WebCfg - システム:ゲートウェイページ"
+
+#: etc/inc/priv.defs.inc:1051 etc/inc/priv.defs.inc:1069
+#: etc/inc/priv.defs.inc:1075 etc/inc/priv.defs.inc:1083
+#: etc/inc/priv.defs.inc:1083
+msgid "Allow access to the 'System: Gateways' page."
+msgstr "ページ: 「ゲートウェイシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1056 etc/inc/priv.defs.inc:1074
+#: etc/inc/priv.defs.inc:1080 etc/inc/priv.defs.inc:1088
+#: etc/inc/priv.defs.inc:1088
+msgid "WebCfg - System: Gateways: Edit Gateway page"
+msgstr "WebCfg - システム:ゲートウェイ:編集ゲートウェイページ"
+
+#: etc/inc/priv.defs.inc:1057 etc/inc/priv.defs.inc:1075
+#: etc/inc/priv.defs.inc:1081 etc/inc/priv.defs.inc:1089
+#: etc/inc/priv.defs.inc:1089
+msgid "Allow access to the 'System: Gateways: Edit Gateway' page."
+msgstr "ページ':ゲートウェイの編集ゲートウェイシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1062 etc/inc/priv.defs.inc:1080
+#: etc/inc/priv.defs.inc:1086 etc/inc/priv.defs.inc:1094
+#: etc/inc/priv.defs.inc:1094
+msgid "WebCfg - System: Group manager page"
+msgstr "WebCfg - システム:グループマネージャページ"
+
+#: etc/inc/priv.defs.inc:1063 etc/inc/priv.defs.inc:1081
+#: etc/inc/priv.defs.inc:1087 etc/inc/priv.defs.inc:1095
+#: etc/inc/priv.defs.inc:1095
+msgid "Allow access to the 'System: Group manager' page."
+msgstr "ページ: 「グループ·マネージャーシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1068 etc/inc/priv.defs.inc:1086
+#: etc/inc/priv.defs.inc:1092 etc/inc/priv.defs.inc:1100
+#: etc/inc/priv.defs.inc:1100
+msgid "WebCfg - System: Group Manager: Add Privileges page"
+msgstr "WebCfg - システム:グループマネージャー:特権のページを追加"
+
+#: etc/inc/priv.defs.inc:1069 etc/inc/priv.defs.inc:1087
+#: etc/inc/priv.defs.inc:1093 etc/inc/priv.defs.inc:1101
+#: etc/inc/priv.defs.inc:1101
+msgid "Allow access to the 'System: Group Manager: Add Privileges' page."
+msgstr "へのアクセスを許可する」 :グループ·マネージャー:システム権限の追加」ページが。"
+
+#: etc/inc/priv.defs.inc:1074 etc/inc/priv.defs.inc:1092
+#: etc/inc/priv.defs.inc:1098 etc/inc/priv.defs.inc:1106
+#: etc/inc/priv.defs.inc:1106
+msgid "WebCfg - System: Static Routes page"
+msgstr "WebCfg - システム:静的ルート]ページ"
+
+#: etc/inc/priv.defs.inc:1075 etc/inc/priv.defs.inc:1093
+#: etc/inc/priv.defs.inc:1099 etc/inc/priv.defs.inc:1107
+#: etc/inc/priv.defs.inc:1107
+msgid "Allow access to the 'System: Static Routes' page."
+msgstr "ページ: 「スタティックルートシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1080 etc/inc/priv.defs.inc:1098
+#: etc/inc/priv.defs.inc:1104 etc/inc/priv.defs.inc:1112
+#: etc/inc/priv.defs.inc:1112
+msgid "WebCfg - System: Static Routes: Edit route page"
+msgstr "WebCfg - システム:静的ルート:編集ルートページ"
+
+#: etc/inc/priv.defs.inc:1081 etc/inc/priv.defs.inc:1099
+#: etc/inc/priv.defs.inc:1105 etc/inc/priv.defs.inc:1113
+#: etc/inc/priv.defs.inc:1113
+msgid "Allow access to the 'System: Static Routes: Edit route' page."
+msgstr "ページ':静的ルートの編集ルートシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1086 etc/inc/priv.defs.inc:1104
+#: etc/inc/priv.defs.inc:1110 etc/inc/priv.defs.inc:1118
+#: etc/inc/priv.defs.inc:1118
+msgid "WebCfg - System: User Manager page"
+msgstr "WebCfg - システム:ユーザーマネージャページ"
+
+#: etc/inc/priv.defs.inc:1087 etc/inc/priv.defs.inc:1105
+#: etc/inc/priv.defs.inc:1111 etc/inc/priv.defs.inc:1119
+#: etc/inc/priv.defs.inc:1119
+msgid "Allow access to the 'System: User Manager' page."
+msgstr "ページ: 「ユーザーマネージャシステム」へのアクセスを可能にする。"
+
+#: etc/inc/priv.defs.inc:1092 etc/inc/priv.defs.inc:1110
+#: etc/inc/priv.defs.inc:1116 etc/inc/priv.defs.inc:1124
+#: etc/inc/priv.defs.inc:1124
+msgid "WebCfg - System: User Manager: Add Privileges page"
+msgstr "WebCfg - システム:ユーザーマネージャ:権限]ページを追加する"
+
+#: etc/inc/priv.defs.inc:1093 etc/inc/priv.defs.inc:1111
+#: etc/inc/priv.defs.inc:1117 etc/inc/priv.defs.inc:1125
+#: etc/inc/priv.defs.inc:1125
+msgid "Allow access to the 'System: User Manager: Add Privileges' page."
+msgstr "ページ':ユーザーマネージャの権限の追加システム」をへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1098 etc/inc/priv.defs.inc:1116
+#: etc/inc/priv.defs.inc:1122 etc/inc/priv.defs.inc:1130
+#: etc/inc/priv.defs.inc:1130
+msgid "WebCfg - System: User Password Manager page"
+msgstr "WebCfg - システム:ユーザーパスワードマネージャ]ページ"
+
+#: etc/inc/priv.defs.inc:1099 etc/inc/priv.defs.inc:1117
+#: etc/inc/priv.defs.inc:1123 etc/inc/priv.defs.inc:1131
+#: etc/inc/priv.defs.inc:1131
+msgid "Allow access to the 'System: User Password Manager' page."
+msgstr "ページ: 「ユーザー·パスワードマネージャシステム」へのアクセスを可能にする。"
+
+#: etc/inc/priv.defs.inc:1104 etc/inc/priv.defs.inc:1122
+#: etc/inc/priv.defs.inc:1128
+msgid "WebCfg - System: User manager: settings page"
+msgstr "WebCfg - システム:ユーザーマネージャ:設定ページ"
+
+#: etc/inc/priv.defs.inc:1105 etc/inc/priv.defs.inc:1123
+#: etc/inc/priv.defs.inc:1129
+msgid "Allow access to the 'System: User manager: settings' page."
+msgstr "ページ':ユーザーマネージャの設定システム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1110 etc/inc/priv.defs.inc:1128
+#: etc/inc/priv.defs.inc:1134 etc/inc/priv.defs.inc:1142
+#: etc/inc/priv.defs.inc:1142
+msgid "WebCfg - System: User Manager: Settings: Test LDAP page"
+msgstr "WebCfg - システム:ユーザーマネージャ:セッティング:テストのLDAPページ"
+
+#: etc/inc/priv.defs.inc:1111 etc/inc/priv.defs.inc:1129
+#: etc/inc/priv.defs.inc:1135 etc/inc/priv.defs.inc:1143
+#: etc/inc/priv.defs.inc:1143
+msgid "Allow access to the 'System: User Manager: Settings: Test LDAP' page."
+msgstr "ページ' :ユーザーマネージャ:設定テストLDAPシステムの'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1116 etc/inc/priv.defs.inc:1134
+#: etc/inc/priv.defs.inc:1140 etc/inc/priv.defs.inc:1148
+#: etc/inc/priv.defs.inc:1148
+msgid "WebCfg - System: Firmware: Manual Update page (progress bar)"
+msgstr "WebCfg - システム:ファームウェア:手動アップデートページ(プログレスバー)"
+
+#: etc/inc/priv.defs.inc:1117 etc/inc/priv.defs.inc:1135
+#: etc/inc/priv.defs.inc:1141 etc/inc/priv.defs.inc:1149
+#: etc/inc/priv.defs.inc:1149
+msgid ""
+"Allow access to the 'System: Firmware: Manual Update: Progress bar' page."
+msgstr "ページ"' :ファームウェア:手動アップデートプログレスバーシステム」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1122 etc/inc/priv.defs.inc:1140
+#: etc/inc/priv.defs.inc:1146 etc/inc/priv.defs.inc:1154
+#: etc/inc/priv.defs.inc:1154
+msgid "WebCfg - Hidden: Upload Configuration page"
+msgstr "WebCfg - 非表示:アップロード設定]ページが"
+
+#: etc/inc/priv.defs.inc:1123 etc/inc/priv.defs.inc:1141
+#: etc/inc/priv.defs.inc:1147 etc/inc/priv.defs.inc:1155
+#: etc/inc/priv.defs.inc:1155
+msgid "Allow access to the 'Hidden: Upload Configuration' page."
+msgstr "ページ:'アップロードの設定隠れた」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1128 etc/inc/priv.defs.inc:1146
+#: etc/inc/priv.defs.inc:1152 etc/inc/priv.defs.inc:1160
+#: etc/inc/priv.defs.inc:1160
+msgid "WebCfg - VPN: IPsec page"
+msgstr "WebCfg - VPN : IPsecのページ"
+
+#: etc/inc/priv.defs.inc:1129 etc/inc/priv.defs.inc:1147
+#: etc/inc/priv.defs.inc:1153 etc/inc/priv.defs.inc:1161
+#: etc/inc/priv.defs.inc:1161
+msgid "Allow access to the 'VPN: IPsec' page."
+msgstr "ページ:'のIPsec VPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1134 etc/inc/priv.defs.inc:1152
+#: etc/inc/priv.defs.inc:1158 etc/inc/priv.defs.inc:1166
+#: etc/inc/priv.defs.inc:1166
+msgid "WebCfg - VPN: IPsec: Pre-Shared Keys List"
+msgstr "WebCfg - VPN : IPsecの:事前共有鍵リスト"
+
+#: etc/inc/priv.defs.inc:1135 etc/inc/priv.defs.inc:1153
+#: etc/inc/priv.defs.inc:1159 etc/inc/priv.defs.inc:1167
+#: etc/inc/priv.defs.inc:1167
+msgid "Allow access to the 'VPN: IPsec: Pre-Shared Keys List' page."
+msgstr "ページ': IPsecの事前共有鍵リストのVPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1140 etc/inc/priv.defs.inc:1158
+#: etc/inc/priv.defs.inc:1164 etc/inc/priv.defs.inc:1172
+#: etc/inc/priv.defs.inc:1172
+msgid "WebCfg - VPN: IPsec: Edit Pre-Shared Keys"
+msgstr "WebCfg - VPN : IPsecの編集:事前共有鍵"
+
+#: etc/inc/priv.defs.inc:1141 etc/inc/priv.defs.inc:1159
+#: etc/inc/priv.defs.inc:1165 etc/inc/priv.defs.inc:1173
+#: etc/inc/priv.defs.inc:1173
+msgid "Allow access to the 'VPN: IPsec: Edit Pre-Shared Keys' page."
+msgstr "へのアクセスを許可する」にVPNを: IPsecの編集:事前共有鍵」のページ。"
+
+#: etc/inc/priv.defs.inc:1146 etc/inc/priv.defs.inc:1164
+#: etc/inc/priv.defs.inc:1170 etc/inc/priv.defs.inc:1178
+#: etc/inc/priv.defs.inc:1178
+msgid "WebCfg - VPN: IPsec: Mobile page"
+msgstr "WebCfg - VPN : IPsecの:モバイルページ"
+
+#: etc/inc/priv.defs.inc:1147 etc/inc/priv.defs.inc:1165
+#: etc/inc/priv.defs.inc:1171 etc/inc/priv.defs.inc:1179
+#: etc/inc/priv.defs.inc:1179
+msgid "Allow access to the 'VPN: IPsec: Mobile' page."
+msgstr "ページ': IPsecのモバイルVPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1152 etc/inc/priv.defs.inc:1170
+#: etc/inc/priv.defs.inc:1176 etc/inc/priv.defs.inc:1184
+#: etc/inc/priv.defs.inc:1184
+msgid "WebCfg - VPN: IPsec: Edit Phase 1 page"
+msgstr "WebCfg - VPN : IPsecの編集:フェーズ1ページ"
+
+#: etc/inc/priv.defs.inc:1153 etc/inc/priv.defs.inc:1171
+#: etc/inc/priv.defs.inc:1177 etc/inc/priv.defs.inc:1185
+#: etc/inc/priv.defs.inc:1185
+msgid "Allow access to the 'VPN: IPsec: Edit Phase 1' page."
+msgstr "へのアクセスを許可する」にVPNを: IPsecの編集:フェーズ1 」のページ。"
+
+#: etc/inc/priv.defs.inc:1158 etc/inc/priv.defs.inc:1176
+#: etc/inc/priv.defs.inc:1182 etc/inc/priv.defs.inc:1190
+#: etc/inc/priv.defs.inc:1190
+msgid "WebCfg - VPN: IPsec: Edit Phase 2 page"
+msgstr "WebCfg - VPN : IPsecの編集:フェーズ2ページ"
+
+#: etc/inc/priv.defs.inc:1159 etc/inc/priv.defs.inc:1177
+#: etc/inc/priv.defs.inc:1183 etc/inc/priv.defs.inc:1191
+#: etc/inc/priv.defs.inc:1191
+msgid "Allow access to the 'VPN: IPsec: Edit Phase 2' page."
+msgstr "へのアクセスを許可する」にVPNを: IPsecの編集:フェーズ2 」のページ。"
+
+#: etc/inc/priv.defs.inc:1164 etc/inc/priv.defs.inc:1182
+#: etc/inc/priv.defs.inc:1188 etc/inc/priv.defs.inc:1196
+#: etc/inc/priv.defs.inc:1196
+msgid "WebCfg - VPN: VPN L2TP page"
+msgstr "WebCfg - VPN : VPN L2TPページ"
+
+#: etc/inc/priv.defs.inc:1165 etc/inc/priv.defs.inc:1183
+#: etc/inc/priv.defs.inc:1189 etc/inc/priv.defs.inc:1197
+#: etc/inc/priv.defs.inc:1197
+msgid "Allow access to the 'VPN: VPN L2TP' page."
+msgstr "ページ: 「 VPNのL2TP VPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1170 etc/inc/priv.defs.inc:1188
+#: etc/inc/priv.defs.inc:1194 etc/inc/priv.defs.inc:1202
+#: etc/inc/priv.defs.inc:1202
+msgid "WebCfg - VPN: VPN L2TP : Users page"
+msgstr "WebCfg - VPN : VPN L2TP :ユーザーのページ"
+
+#: etc/inc/priv.defs.inc:1171 etc/inc/priv.defs.inc:1189
+#: etc/inc/priv.defs.inc:1195 etc/inc/priv.defs.inc:1203
+#: etc/inc/priv.defs.inc:1203
+msgid "Allow access to the 'VPN: VPN L2TP : Users' page."
+msgstr "ページ': VPN L2TPユーザーVPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1176 etc/inc/priv.defs.inc:1194
+#: etc/inc/priv.defs.inc:1200 etc/inc/priv.defs.inc:1208
+#: etc/inc/priv.defs.inc:1208
+msgid "WebCfg - VPN: VPN L2TP : Users : Edit page"
+msgstr "WebCfg - VPN : VPN L2TP :ユーザー: Editページ"
+
+#: etc/inc/priv.defs.inc:1177 etc/inc/priv.defs.inc:1195
+#: etc/inc/priv.defs.inc:1201 etc/inc/priv.defs.inc:1209
+#: etc/inc/priv.defs.inc:1209
+msgid "Allow access to the 'VPN: VPN L2TP : Users : Edit' page."
+msgstr "ページ' : VPN L2TP :ユーザーの編集VPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1182 etc/inc/priv.defs.inc:1200
+#: etc/inc/priv.defs.inc:1206 etc/inc/priv.defs.inc:1214
+#: etc/inc/priv.defs.inc:1214
+msgid "WebCfg - OpenVPN: Client page"
+msgstr "WebCfg - OpenVPNの: Clientページ"
+
+#: etc/inc/priv.defs.inc:1183 etc/inc/priv.defs.inc:1201
+#: etc/inc/priv.defs.inc:1207 etc/inc/priv.defs.inc:1215
+#: etc/inc/priv.defs.inc:1215
+msgid "Allow access to the 'OpenVPN: Client' page."
+msgstr "ページ:'クライアントのOpenVPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1188 etc/inc/priv.defs.inc:1206
+#: etc/inc/priv.defs.inc:1212 etc/inc/priv.defs.inc:1220
+#: etc/inc/priv.defs.inc:1220
+msgid "WebCfg - OpenVPN: Client Specific Override page"
+msgstr "WebCfg - OpenVPNの:クライアント固有のオーバーライドページ"
+
+#: etc/inc/priv.defs.inc:1189 etc/inc/priv.defs.inc:1207
+#: etc/inc/priv.defs.inc:1213 etc/inc/priv.defs.inc:1221
+#: etc/inc/priv.defs.inc:1221
+msgid "Allow access to the 'OpenVPN: Client Specific Override' page."
+msgstr "ページ:'クライアントの特定のオーバーライドOpenVPNの'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1194 etc/inc/priv.defs.inc:1212
+#: etc/inc/priv.defs.inc:1218 etc/inc/priv.defs.inc:1226
+#: etc/inc/priv.defs.inc:1226
+msgid "WebCfg - OpenVPN: Server page"
+msgstr "WebCfg - OpenVPNの: Serverページ"
+
+#: etc/inc/priv.defs.inc:1195 etc/inc/priv.defs.inc:1213
+#: etc/inc/priv.defs.inc:1219 etc/inc/priv.defs.inc:1227
+#: etc/inc/priv.defs.inc:1227
+msgid "Allow access to the 'OpenVPN: Server' page."
+msgstr "ページ:'サーバーOpenVPNの'へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1200 etc/inc/priv.defs.inc:1218
+#: etc/inc/priv.defs.inc:1224 etc/inc/priv.defs.inc:1232
+#: etc/inc/priv.defs.inc:1232
+msgid "WebCfg - Services: PPPoE Server page"
+msgstr "WebCfg - サービス: PPPoEサーバページに"
+
+#: etc/inc/priv.defs.inc:1201 etc/inc/priv.defs.inc:1219
+#: etc/inc/priv.defs.inc:1225 etc/inc/priv.defs.inc:1233
+#: etc/inc/priv.defs.inc:1233
+msgid "Allow access to the 'Services: PPPoE Server' page."
+msgstr "ページ:'のPPPoEサーバサービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1206 etc/inc/priv.defs.inc:1224
+#: etc/inc/priv.defs.inc:1230 etc/inc/priv.defs.inc:1238
+#: etc/inc/priv.defs.inc:1238
+msgid "WebCfg - Services: PPPoE Server: Edit page"
+msgstr "WebCfg - サービス: PPPoEサーバ: Editページ"
+
+#: etc/inc/priv.defs.inc:1207 etc/inc/priv.defs.inc:1225
+#: etc/inc/priv.defs.inc:1231 etc/inc/priv.defs.inc:1239
+#: etc/inc/priv.defs.inc:1239
+msgid "Allow access to the 'Services: PPPoE Server: Edit' page."
+msgstr "ページ': PPPoEサーバサービスを編集」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1212 etc/inc/priv.defs.inc:1230
+#: etc/inc/priv.defs.inc:1236 etc/inc/priv.defs.inc:1244
+#: etc/inc/priv.defs.inc:1244
+msgid "WebCfg - VPN: VPN PPTP page"
+msgstr "WebCfg - VPN : VPNのPPTPページ"
+
+#: etc/inc/priv.defs.inc:1213 etc/inc/priv.defs.inc:1231
+#: etc/inc/priv.defs.inc:1237 etc/inc/priv.defs.inc:1245
+#: etc/inc/priv.defs.inc:1245
+msgid "Allow access to the 'VPN: VPN PPTP' page."
+msgstr "ページ: 「 VPN PPTP VPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1218 etc/inc/priv.defs.inc:1236
+#: etc/inc/priv.defs.inc:1242 etc/inc/priv.defs.inc:1250
+#: etc/inc/priv.defs.inc:1250
+msgid "WebCfg - VPN: VPN PPTP: Users page"
+msgstr "WebCfg - VPN : VPNのPPTP :ユーザーのページ"
+
+#: etc/inc/priv.defs.inc:1219 etc/inc/priv.defs.inc:1237
+#: etc/inc/priv.defs.inc:1243 etc/inc/priv.defs.inc:1251
+#: etc/inc/priv.defs.inc:1251
+msgid "Allow access to the 'VPN: VPN PPTP: Users' page."
+msgstr "ページ': VPN PPTPユーザーVPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1224 etc/inc/priv.defs.inc:1242
+#: etc/inc/priv.defs.inc:1248 etc/inc/priv.defs.inc:1256
+#: etc/inc/priv.defs.inc:1256
+msgid "WebCfg - VPN: VPN PPTP: User: Edit page"
+msgstr "WebCfg - VPN : VPN PPTPユーザー: Editページ"
+
+#: etc/inc/priv.defs.inc:1225 etc/inc/priv.defs.inc:1243
+#: etc/inc/priv.defs.inc:1249 etc/inc/priv.defs.inc:1257
+#: etc/inc/priv.defs.inc:1257
+msgid "Allow access to the 'VPN: VPN PPTP: User: Edit' page."
+msgstr "ページ' : VPN PPTP :ユーザーの編集VPN 」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1230 etc/inc/priv.defs.inc:1248
+#: etc/inc/priv.defs.inc:1254 etc/inc/priv.defs.inc:1262
+#: etc/inc/priv.defs.inc:1262
+msgid "WebCfg - pfSense wizard subsystem page"
+msgstr "WebCfg - pfSenseウィザード·サブページ"
+
+#: etc/inc/priv.defs.inc:1231 etc/inc/priv.defs.inc:1249
+#: etc/inc/priv.defs.inc:1255 etc/inc/priv.defs.inc:1263
+#: etc/inc/priv.defs.inc:1263
+msgid "Allow access to the 'pfSense wizard subsystem' page."
+msgstr "「 pfSenseウィザードサブシステム」ページへのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:1236 etc/inc/priv.defs.inc:1254
+#: etc/inc/priv.defs.inc:1260 etc/inc/priv.defs.inc:1268
+#: etc/inc/priv.defs.inc:1268
+msgid "WebCfg - XMLRPC Library page"
+msgstr "WebCfg - XMLRPCライブラリページ"
+
+#: etc/inc/priv.defs.inc:1237 etc/inc/priv.defs.inc:1255
+#: etc/inc/priv.defs.inc:1261 etc/inc/priv.defs.inc:1269
+#: etc/inc/priv.defs.inc:1269
+msgid "Allow access to the 'XMLRPC Library' page."
+msgstr "' XMLRPCライブラリ」ページへのアクセスを許可します。"
+
+#: etc/inc/rrd.inc:45 etc/inc/rrd.inc:45
+#, php-format
+msgid "RRD dump failed exited with %1$s, the error is: %2$s"
+msgstr "RRDダンプがは%1$sで終了しました失敗し、エラーは、次のとおりです。 %2$s"
+
+#: etc/inc/rrd.inc:56 etc/inc/rrd.inc:92 etc/inc/rrd.inc:96 etc/inc/rrd.inc:98
+#: etc/inc/rrd.inc:98
+#, php-format
+msgid "RRD create failed exited with %1$s, the error is: %2$s"
+msgstr "RRDは%1$sで終了しました作成に失敗しました、エラー: %2$s"
+
+#: etc/inc/rrd.inc:70 etc/inc/rrd.inc:106 etc/inc/rrd.inc:110
+#: etc/inc/rrd.inc:113 etc/inc/rrd.inc:113
+#, php-format
+msgid ""
+"Import RRD has %1$s DS values and %2$s RRA databases, new format RRD has "
+"%3$s DS values and %4$s RRA databases"
+msgstr "%3$s DSの値および% 4 $ sのRRAデータベース「インポートRRDはは%1$s 、DS値と%2$sのRRAデータベース、 RRDが持つ新しいフォーマットを持っている」"
+
+#: etc/inc/rrd.inc:154 etc/inc/rrd.inc:190 etc/inc/rrd.inc:194
+#: etc/inc/rrd.inc:197 etc/inc/rrd.inc:197
+#, php-format
+msgid "The new RRD now has %1$s DS values and %2$s RRA databases"
+msgstr "新しいRRDは今は%1$s DSの値と%2$sのRRAデータベースを持っている"
+
+#: etc/inc/rrd.inc:162 etc/inc/rrd.inc:198 etc/inc/rrd.inc:202
+#: etc/inc/rrd.inc:205 etc/inc/rrd.inc:205
+msgid "Generating RRD graphs..."
+msgstr "RRDグラフを生成する..."
+
+#: etc/inc/rrd.inc:247
+#, php-format
+msgid "RRD restore failed exited with %1$s, the error is: %2$s%3$s"
+msgstr "RRDは%1$sで終了しました復元に失敗しました、エラー: %2$s%3$s"
+
+#: etc/inc/rrd.inc:758 etc/inc/rrd.inc:782 etc/inc/rrd.inc:803
+#: etc/inc/rrd.inc:805 etc/inc/rrd.inc:808 etc/inc/rrd.inc:808
+msgid "Creating rrd update script"
+msgstr "RRD更新スクリプトの作成"
+
+#: etc/inc/smtp.inc:92 etc/inc/smtp.inc:92
+msgid ": data access time out"
+msgstr ":外データアクセス時間"
+
+#: etc/inc/smtp.inc:95 etc/inc/smtp.inc:95
+msgid ": the server disconnected"
+msgstr ":切断されたサーバー"
+
+#: etc/inc/smtp.inc:107 etc/inc/smtp.inc:107
+msgid "reached the end of data while reading from the SMTP server conection"
+msgstr "SMTPサーバたっから読み取り中にデータの最後に到達した"
+
+#: etc/inc/smtp.inc:113 etc/inc/smtp.inc:113
+msgid "it was not possible to read line from the SMTP server"
+msgstr "それは、SMTPサーバーからのラインを読むことができませんでした"
+
+#: etc/inc/smtp.inc:135 etc/inc/smtp.inc:135
+msgid "it was not possible to send a line to the SMTP server"
+msgstr "それはSMTPサーバに行を送信することはできませんでした"
+
+#: etc/inc/smtp.inc:149 etc/inc/smtp.inc:149
+msgid "it was not possible to send data to the SMTP server"
+msgstr "これは、SMTPサーバーにデータを送信することはできませんでした"
+
+#: etc/inc/smtp.inc:221 etc/inc/smtp.inc:221
+msgid "establishing SSL connections requires at least PHP version 4.3.0"
+msgstr "SSL接続を確立することは、少なくとも、PHPのバージョン4.3.0が必要です"
+
+#: etc/inc/smtp.inc:224 etc/inc/smtp.inc:224
+msgid "establishing SSL connections requires the OpenSSL extension enabled"
+msgstr "SSL接続を確立することは有効のOpenSSL拡張モジュールを必要と"
+
+#: etc/inc/smtp.inc:233 etc/inc/smtp.inc:233
+#, php-format
+msgid "could not resolve host "%s""
+msgstr "ホスト「 %s "を解決できませんでした"
+
+#: etc/inc/smtp.inc:237 etc/inc/smtp.inc:237
+#, php-format
+msgid "domain "%s" resolved to an address excluded to be valid"
+msgstr "有効であるために除外されたアドレスに解決されたドメイン」 %s 」"
+
+#: etc/inc/smtp.inc:239 etc/inc/smtp.inc:239
+#, php-format
+msgid "Connecting to host address "%1$s" port %2$s..."
+msgstr "アドレス "は%1$s "ポート%2$sをホストに接続する..."
+
+#: etc/inc/smtp.inc:246 etc/inc/smtp.inc:246
+msgid "-3 socket could not be created"
+msgstr "-3ソケットを作成できませんでした"
+
+#: etc/inc/smtp.inc:248 etc/inc/smtp.inc:248
+#, php-format
+msgid "-4 dns lookup on hostname "%s" failed"
+msgstr "-4 DNSルックアップのホスト名の「 %s 「失敗した"
+
+#: etc/inc/smtp.inc:250 etc/inc/smtp.inc:250
+msgid "-5 connection refused or timed out"
+msgstr "-5接続が拒否またはタイムアウト"
+
+#: etc/inc/smtp.inc:252 etc/inc/smtp.inc:252
+msgid "-6 fdopen() call failed"
+msgstr "-6 fdopen.()呼び出しに失敗しました"
+
+#: etc/inc/smtp.inc:254 etc/inc/smtp.inc:254
+msgid "-7 setvbuf() call failed"
+msgstr "-7 setvbuf.()呼び出しに失敗しました"
+
+#: etc/inc/smtp.inc:256 etc/inc/smtp.inc:256
+#, php-format
+msgid "could not connect to the host "%1$s": %2$s"
+msgstr "ホスト"は%1$s "に接続できませんでした。 %2$s"
+
+#: etc/inc/smtp.inc:265 etc/inc/smtp.inc:265
+msgid ""
+"it is not possible to authenticate using the specified mechanism because the "
+"SASL library class is not loaded"
+msgstr "SASLライブラリクラスロードされていない」ことが原因指定されたメカニズムを使用して認証することはできません」"
+
+#: etc/inc/smtp.inc:289 etc/inc/smtp.inc:289
+#, php-format
+msgid "authenticated mechanism %1$s may not be used: %2$s"
+msgstr "認証された機構は%1$sを使用することはできません。 %2$s"
+
+#: etc/inc/smtp.inc:294 etc/inc/smtp.inc:294
+msgid "Could not start the SASL authentication client:"
+msgstr "SASL認証クライアントを起動できませんでした:"
+
+#: etc/inc/smtp.inc:301 etc/inc/smtp.inc:301
+msgid "Could not send the AUTH command"
+msgstr "AUTHコマンドを送信できませんでした"
+
+#: etc/inc/smtp.inc:316 etc/inc/smtp.inc:346 etc/inc/smtp.inc:316
+#: etc/inc/smtp.inc:346
+msgid "Authentication error:"
+msgstr "認証エラー:"
+
+#: etc/inc/smtp.inc:331 etc/inc/smtp.inc:331
+msgid "Could not send the authentication step message"
+msgstr "認証ステップメッセージを送信できませんでした"
+
+#: etc/inc/smtp.inc:351 etc/inc/smtp.inc:351
+msgid "Could not process the SASL authentication step:"
+msgstr "SASL認証ステップを処理できませんでした。"
+
+#: etc/inc/smtp.inc:365 etc/inc/smtp.inc:365
+msgid "connection is already established"
+msgstr "接続がすでに確立されている"
+
+#: etc/inc/smtp.inc:403 etc/inc/smtp.inc:403
+msgid "it was not specified the POP3 authentication user"
+msgstr "それは、POP3認証ユーザーに指定されていなかった"
+
+#: etc/inc/smtp.inc:409 etc/inc/smtp.inc:409
+msgid "it was not specified the POP3 authentication password"
+msgstr "それは、POP3認証パスワードを指定しなかった"
+
+#: etc/inc/smtp.inc:413 etc/inc/smtp.inc:413
+#, php-format
+msgid "Resolving POP3 authentication host "%s"..."
+msgstr "POP3認証ホスト」 %s 」を解決する..."
+
+#: etc/inc/smtp.inc:420 etc/inc/smtp.inc:420
+msgid "POP3 authentication server greeting was not found"
+msgstr "POP3認証サーバのグリーティングが見つかりませんでした"
+
+#: etc/inc/smtp.inc:428 etc/inc/smtp.inc:428
+msgid "POP3 authentication user was not accepted:"
+msgstr "POP3認証ユーザーが受け入れられませんでした。"
+
+#: etc/inc/smtp.inc:436 etc/inc/smtp.inc:436
+msgid "POP3 authentication password was not accepted:"
+msgstr "POP3認証のパスワードが受け入れられませんでした。"
+
+#: etc/inc/smtp.inc:445 etc/inc/smtp.inc:445
+msgid "could not determine the SMTP to connect"
+msgstr "接続するためにSMTPを決定することができませんでした"
+
+#: etc/inc/smtp.inc:451 etc/inc/smtp.inc:451
+#, php-format
+msgid "Resolving SMTP server domain "%s"..."
+msgstr "解決SMTPサーバドメイン」 %s "..."
+
+#: etc/inc/smtp.inc:463 etc/inc/smtp.inc:463
+#, php-format
+msgid "Connected to SMTP server "%s"."
+msgstr "SMTPサーバ」 %s 」に接続されている。"
+
+#: etc/inc/smtp.inc:517 etc/inc/smtp.inc:519 etc/inc/smtp.inc:519
+msgid "server does not require authentication"
+msgstr "サーバが認証を必要としない"
+
+#: etc/inc/smtp.inc:581 etc/inc/smtp.inc:583 etc/inc/smtp.inc:583
+msgid ""
+"it is not supported any of the authentication mechanisms required by the "
+"server"
+msgstr "サーバー」とは、によって必要とされる認証メカニズムのいずれもサポートされていません ""
+
+#: etc/inc/smtp.inc:613 etc/inc/smtp.inc:615 etc/inc/smtp.inc:615
+msgid ""
+"direct delivery connection is already established and sender is already set"
+msgstr "「直接受け渡し接続がすでに確立され、送信者がすでに設定されています"
+
+#: etc/inc/smtp.inc:621 etc/inc/smtp.inc:623 etc/inc/smtp.inc:623
+msgid "connection is not in the initial state"
+msgstr "接続は、初期状態ではありません"
+
+#: etc/inc/smtp.inc:643 etc/inc/smtp.inc:645 etc/inc/smtp.inc:645
+msgid "it was not specified a valid direct recipient"
+msgstr "それは、有効な直接受信者に指定されていなかった"
+
+#: etc/inc/smtp.inc:662 etc/inc/smtp.inc:664 etc/inc/smtp.inc:664
+msgid ""
+"it is not possible to deliver directly to recipients of different domains"
+msgstr "「それは異なるドメインの受信者に直接配信することはできません"
+
+#: etc/inc/smtp.inc:667 etc/inc/smtp.inc:669 etc/inc/smtp.inc:669
+msgid "connection is already established and the recipient is already set"
+msgstr "接続がすでに確立され、受信者がすでに設定されています"
+
+#: etc/inc/smtp.inc:679 etc/inc/smtp.inc:681 etc/inc/smtp.inc:681
+msgid "connection is not in the recipient setting state"
+msgstr "接続は、受信者の設定状態ではありません"
+
+#: etc/inc/smtp.inc:708 etc/inc/smtp.inc:710 etc/inc/smtp.inc:710
+msgid "connection is not in the start sending data state"
+msgstr "接続が開始送信データ状態ではありません"
+
+#: etc/inc/smtp.inc:738 etc/inc/smtp.inc:749 etc/inc/smtp.inc:740
+#: etc/inc/smtp.inc:751 etc/inc/smtp.inc:740 etc/inc/smtp.inc:751
+msgid "connection is not in the sending data state"
+msgstr "接続は、データ送信状態ではない"
+
+#: etc/inc/smtp.inc:785 etc/inc/smtp.inc:787 etc/inc/smtp.inc:787
+msgid "it was not previously established a SMTP connection"
+msgstr "それは、以前のSMTP接続を確立していなかった"
+
+#: etc/inc/upgrade_config.inc:113 etc/inc/upgrade_config.inc:113
+#, php-format
+msgid "%sWarning: filter rule removed (interface '%s' does not exist anymore)."
+msgstr "%sWarning :削除フィルタルール(インタフェース「 %s 」はもはや存在しない) 。"
+
+#: etc/inc/upgrade_config.inc:125 etc/inc/upgrade_config.inc:125
+#, php-format
+msgid ""
+"%sWarning: filter rule removed (source network '%s' does not exist anymore)."
+msgstr "「 %sWarning :削除フィルタルール(ソース·ネットワーク」 %s 」はもはや存在しない) 。"
+
+#: etc/inc/upgrade_config.inc:138 etc/inc/upgrade_config.inc:138
+#, php-format
+msgid ""
+"%sWarning: filter rule removed (destination network '%s' does not exist "
+"anymore)."
+msgstr "「 : (もう%sWarning削除フィルタルール宛先ネットワーク' %s'は存在しません」 ) 。"
+
+#: etc/inc/upgrade_config.inc:158 etc/inc/upgrade_config.inc:158
+#, php-format
+msgid ""
+"%sWarning: traffic shaper rule removed (interface '%s' does not exist "
+"anymore)."
+msgstr "「 : (もう%sWarning削除トラフィックシェールールインターフェース「 %s'は存在しません」 ) 。"
+
+#: etc/inc/upgrade_config.inc:170 etc/inc/upgrade_config.inc:170
+#, php-format
+msgid ""
+"%sWarning: traffic shaper rule removed (source network '%s' does not exist "
+"anymore)."
+msgstr "「 : (もう%sWarning削除トラフィックシェールールソース·ネットワーク」 %s'は存在しません」 ) 。"
+
+#: etc/inc/upgrade_config.inc:183 etc/inc/upgrade_config.inc:183
+#, php-format
+msgid ""
+"%sWarning: traffic shaper rule removed (destination network '%s' does not "
+"exist anymore)."
+msgstr "「 %sWarning :削除トラフィックシェールール(' %s'宛先ネットワークがありません」もはや存在) 。"
+
+#: etc/inc/upgrade_config.inc:333 etc/inc/upgrade_config.inc:333
+#, php-format
+msgid "CARP vhid %s"
+msgstr "CARPのVHIDの%s"
+
+#: etc/inc/upgrade_config.inc:510 etc/inc/upgrade_config.inc:510
+msgid "Permit IPsec traffic."
+msgstr "IPsecトラフィックを許可します。"
+
+#: etc/inc/upgrade_config.inc:585 etc/inc/upgrade_config.inc:585
+msgid "System Administrators"
+msgstr "システム管理者"
+
+#: etc/inc/upgrade_config.inc:604 etc/inc/upgrade_config.inc:604
+msgid ""
+"Indicates whether this user will lock access to the webConfigurator for "
+"other users."
+msgstr "他のユーザー「このユーザーが探しwebConfiguratorへのアクセスをロックするかどうかを示します」 。"
+
+#: etc/inc/upgrade_config.inc:607 etc/inc/upgrade_config.inc:607
+msgid ""
+"Indicates whether this user will lock individual HTML pages after having "
+"accessed a particular page (the lock will be freed if the user leaves or "
+"saves the page form)."
+msgstr "特定のページを(ユーザーがログオフしたとき、または「ページのフォームを保存する場合は、ロックが解放されます)にアクセスし、「このユーザーがした後、個々のHTMLページをロックするかどうかを示します」 。"
+
+#: etc/inc/upgrade_config.inc:610 etc/inc/upgrade_config.inc:610
+msgid "Indicates whether this user is able to login for example via SSH."
+msgstr "このユーザーは、SSH経由で例えばログインすることであるかどうかを示します。"
+
+#: etc/inc/upgrade_config.inc:613 etc/inc/upgrade_config.inc:613
+#, php-format
+msgid ""
+"Indicates whether this user is allowed to copy files onto the %s appliance "
+"via SCP/SFTP. If you are going to use this privilege, you must install "
+"scponly on the appliance (Hint: pkg_add -r scponly)."
+msgstr "SCP / SFTP経由で「このユーザーが%sアプライアンスにファイルをコピーできるかどうかを示します」 。この権限を使用しようとしている場合は、アプライアンス( : scponlyのpkg_addに-Rヒント)にscponlyの「インストールする必要があります。"
+
+#: etc/inc/upgrade_config.inc:616 etc/inc/upgrade_config.inc:616
+msgid ""
+"This user is associated with the UNIX root user (you should associate this "
+"privilege only with one single user)."
+msgstr "「 (一つだけ単一のユーザと権限このユーザーは、UNIXのrootユーザーこれを関連付ける必要があります)と関連している」 。"
+
+#: etc/inc/upgrade_config.inc:633 etc/inc/upgrade_config.inc:633
+msgid "Drop packets to closed TCP ports without returning a RST"
+msgstr "RSTを返さずに、閉じたTCPポートにパケットをドロップする"
+
+#: etc/inc/upgrade_config.inc:637 etc/inc/upgrade_config.inc:637
+msgid "Do not send ICMP port unreachable messages for closed UDP ports"
+msgstr "閉じられたUDPポートのためのICMPポート到達不能メッセージを送信しないでください"
+
+#: etc/inc/upgrade_config.inc:641 etc/inc/upgrade_config.inc:641
+msgid "Randomize the ID field in IP packets (default is 0: sequential IP IDs)"
+msgstr "IPパケット内のIDフィールドをランダム化します(デフォルトは0である:連続したIPのID )"
+
+#: etc/inc/upgrade_config.inc:645 etc/inc/upgrade_config.inc:645
+msgid "Drop SYN-FIN packets (breaks RFC1379, but nobody uses it anyway)"
+msgstr "ドロップSYN- FINパケット(休憩のRFC1379が、誰もとにかくそれを使用しません)"
+
+#: etc/inc/upgrade_config.inc:649 etc/inc/upgrade_config.inc:649
+msgid "Sending of IPv4 ICMP redirects"
+msgstr "IPv4のICMPリダイレクトを送信"
+
+#: etc/inc/upgrade_config.inc:653 etc/inc/upgrade_config.inc:653
+msgid "Sending of IPv6 ICMP redirects"
+msgstr "IPv6のICMPリダイレクトを送信"
+
+#: etc/inc/upgrade_config.inc:657 etc/inc/upgrade_config.inc:657
+msgid "Generate SYN cookies for outbound SYN-ACK packets"
+msgstr "アウトバウンドSYN- ACKパケットのためにSYNクッキーを生成"
+
+#: etc/inc/upgrade_config.inc:661 etc/inc/upgrade_config.inc:661
+msgid "Maximum incoming TCP datagram size"
+msgstr "最大着信TCPデータグラムサイズ"
+
+#: etc/inc/upgrade_config.inc:665 etc/inc/upgrade_config.inc:665
+msgid "Maximum outgoing TCP datagram size"
+msgstr "最大発信TCPデータグラムサイズ"
+
+#: etc/inc/upgrade_config.inc:669 etc/inc/upgrade_config.inc:669
+msgid ""
+"Fastforwarding (see http://lists.freebsd.org/pipermail/freebsd-net/2004-"
+"January/002534.html)"
+msgstr "「 ( January/002534.htmlを早送りはhttp://lists.freebsd.org/pipermail/freebsd-net/2004-を参照してください。 ")"
+
+#: etc/inc/upgrade_config.inc:673 etc/inc/upgrade_config.inc:673
+msgid "Do not delay ACK to try and piggyback it onto a data packet"
+msgstr "データパケットにそれを試してみて、ピギーバックにACKを遅らせないでください"
+
+#: etc/inc/upgrade_config.inc:677 etc/inc/upgrade_config.inc:677
+msgid "Maximum outgoing UDP datagram size"
+msgstr "最大送信UDPデータグラムサイズ"
+
+#: etc/inc/upgrade_config.inc:681 etc/inc/upgrade_config.inc:681
+msgid ""
+"Handling of non-IP packets which are not passed to pfil (see if_bridge(4))"
+msgstr "「 pfilをに渡されません非IPパケットの処理は、 ( if_bridge (4)を参照)"
+
+#: etc/inc/upgrade_config.inc:685 etc/inc/upgrade_config.inc:685
+msgid "Allow unprivileged access to tap(4) device nodes"
+msgstr "( 4 )デバイスノードをタップして、権限のないアクセスを可能にする"
+
+#: etc/inc/upgrade_config.inc:689 etc/inc/upgrade_config.inc:689
+msgid "Randomize PID's (see src/sys/kern/kern_fork.c: sysctl_kern_randompid())"
+msgstr "ランダム化、PIDの(SRC / SYS /カーン/ kern_fork.c参照: sysctl_kern_randompid.() )"
+
+#: etc/inc/upgrade_config.inc:693 etc/inc/upgrade_config.inc:693
+msgid ""
+"The system will attempt to calculate the bandwidth delay product for each "
+"connection and limit the amount of data queued to the network to just the "
+"amount required to maintain optimum throughput. "
+msgstr "接続し、ネットワークにキューされたデータの量を制限する「システム毎に帯域幅遅延積を計算しようとする「最適なスループットを維持するために必要なわずかな」量である。"
+
+#: etc/inc/upgrade_config.inc:697 etc/inc/upgrade_config.inc:697
+msgid "Set ICMP Limits"
+msgstr "ICMPの制限を設定"
+
+#: etc/inc/upgrade_config.inc:701 etc/inc/upgrade_config.inc:701
+msgid "TCP Offload engine"
+msgstr "TCPオフロードエンジン"
+
+#: etc/inc/upgrade_config.inc:742 etc/inc/upgrade_config.inc:742
+#, php-format
+msgid "Interface %s Static Gateway"
+msgstr "インターフェイス%s静的ゲートウェイ"
+
+#: etc/inc/upgrade_config.inc:745 etc/inc/upgrade_config.inc:745
+#, php-format
+msgid "Interface %s Dynamic Gateway"
+msgstr "インターフェイス%sダイナミックゲートウェイ"
+
+#: etc/inc/upgrade_config.inc:810 etc/inc/upgrade_config.inc:811
+#: etc/inc/upgrade_config.inc:811
+#, php-format
+msgid "Upgraded static route for %s"
+msgstr "%sためにアップグレードスタティックルート"
+
+#: etc/inc/upgrade_config.inc:907 etc/inc/upgrade_config.inc:908
+#: etc/inc/upgrade_config.inc:908
+#, php-format
+msgid "Sitedown pool for VS: %s"
+msgstr "VS用Sitedownプール: %s"
+
+#: etc/inc/upgrade_config.inc:1060 etc/inc/upgrade_config.inc:1062
+#: etc/inc/upgrade_config.inc:1063 etc/inc/upgrade_config.inc:1063
+#, php-format
+msgid "phase2 for %s"
+msgstr "%sためのフェーズ2"
+
+#: etc/inc/upgrade_config.inc:1287 etc/inc/upgrade_config.inc:1289
+#: etc/inc/upgrade_config.inc:1290 etc/inc/upgrade_config.inc:1290
+#, php-format
+msgid "Upgraded Dyndns %s"
+msgstr "アップグレードされたダイナミックDNS %s"
+
+#: etc/inc/upgrade_config.inc:1339 etc/inc/upgrade_config.inc:1341
+#: etc/inc/upgrade_config.inc:1342 etc/inc/upgrade_config.inc:1342
+msgid "All Users"
+msgstr "すべてのユーザー"
+
+#: etc/inc/upgrade_config.inc:1471 etc/inc/upgrade_config.inc:1473
+#: etc/inc/upgrade_config.inc:1474 etc/inc/upgrade_config.inc:1474
+#, php-format
+msgid "Converted bridged %s"
+msgstr "変換された橋かけ%s"
+
+#: etc/inc/upgrade_config.inc:1797 etc/inc/upgrade_config.inc:1845
+#: etc/inc/upgrade_config.inc:1847 etc/inc/upgrade_config.inc:1848
+#: etc/inc/upgrade_config.inc:1848
+msgid "Auto added OpenVPN rule from config upgrade."
+msgstr "自動設定のアップグレードからOpenVPNのルールを追加しました。"
+
+#: etc/inc/voucher.inc:364 etc/inc/voucher.inc:367 etc/inc/voucher.inc:382
+#, php-format
+msgid "%1$s (%2$s/%3$s) active and good for %4$d Minutes"
+msgstr "は%1$s ( %2$s/%3$s )アクティブおよび% 4 の$ d分のために良い"
+
+#: etc/inc/voucher.inc:401 etc/inc/voucher.inc:404 etc/inc/voucher.inc:419
+msgid "Access denied!"
+msgstr "アクセスは、を否定!"
+
+#: etc/inc/voucher.inc:403 etc/inc/voucher.inc:406 etc/inc/voucher.inc:421
+#, php-format
+msgid "Access granted for %d Minutes in total."
+msgstr "アクセスは全部で% d分に付与された。"
+
+#: etc/inc/voucher.inc:466 etc/inc/voucher.inc:469 etc/inc/voucher.inc:484
+msgid "Enabling voucher support... "
+msgstr "バウチャーのサポートを有効にする..."
+
+#: etc/inc/voucher.inc:505 etc/inc/voucher.inc:508 etc/inc/voucher.inc:523
+#, php-format
+msgid "Error: cannot write voucher.cfg"
+msgstr "エラー: voucher.cfgを書き込むことはできません"
+
+#: etc/inc/voucher.inc:556 etc/inc/voucher.inc:559 etc/inc/voucher.inc:574
+#, php-format
+msgid "cant write %1$s/voucher_%s_used_%2$s.db"
+msgstr "カント書き込み%1$s/voucher_%s_used_%2$s.db"
+
+#: etc/inc/voucher.inc:635 etc/inc/voucher.inc:638 etc/inc/voucher.inc:653
+#, php-format
+msgid "cant read %1$s/voucher_%s_used_%2$s.db"
+msgstr "カント%1$s/voucher_%s_used_%2$s.dbを読む"
+
+#: etc/inc/voucher.inc:653 etc/inc/voucher.inc:652 etc/inc/voucher.inc:655
+#: etc/inc/voucher.inc:670
+#, php-format
+msgid "Voucher: %s"
+msgstr "バウチャー: %s"
+
+#: etc/inc/xmlparse_attr.inc:197 etc/inc/xmlparse_attr.inc:197
+#, php-format
+msgid "XML error: %1$s at line %2$d"
+msgstr "XMLエラー:行%では%1$s 2 $ dの"
+
+#: etc/inc/xmlreader.inc:129 etc/inc/xmlreader.inc:129
+#, php-format
+msgid "Error returned while trying to parse %s"
+msgstr "%sを解析しようとしてエラーが返さ"
+
+#: etc/inc/zeromq.inc:225 etc/inc/zeromq.inc:236 etc/inc/zeromq.inc:225
+#: etc/inc/zeromq.inc:236
+#, php-format
+msgid "Merged in config (%s sections) from ZeroMQ client."
+msgstr "ZeroMQクライアントから(セクション%s )設定に合併しました。"
+
+#: usr/local/www/load_balancer_virtual_server.php:94
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:96
+#: usr/local/www/load_balancer_relay_action.php:104
+#: usr/local/www/services_dyndns.php:76 usr/local/www/services_snmp.php:159
+#: usr/local/www/services_wol.php:115 usr/local/www/services_wol_edit.php:112
+#: usr/local/www/load_balancer_pool.php:97
+#: usr/local/www/load_balancer_monitor.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:153
+#: usr/local/www/load_balancer_virtual_server_edit.php:134
+#: usr/local/www/services_captiveportal.php:63
+#: usr/local/www/services_captiveportal_filemanager.php:75
+#: usr/local/www/services_captiveportal_ip.php:64
+#: usr/local/www/services_captiveportal_ip_edit.php:63
+#: usr/local/www/services_captiveportal_mac.php:63
+#: usr/local/www/services_captiveportal_mac_edit.php:60
+#: usr/local/www/services_dhcp.php:421
+#: usr/local/www/services_dhcp_edit.php:190
+#: usr/local/www/services_dhcp_relay.php:100
+#: usr/local/www/services_dnsmasq.php:119
+#: usr/local/www/services_dnsmasq_edit.php:127
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/load_balancer_relay_protocol.php:100
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/services_captiveportal_hostname.php:66
+#: usr/local/www/services_captiveportal_hostname_edit.php:62
+#: usr/local/www/services_captiveportal_vouchers.php:85
+#: usr/local/www/services_captiveportal_vouchers_edit.php:48
+#: usr/local/www/fbegin.inc:171 usr/local/www/fbegin.inc:343
+#: usr/local/www/status_services.php:226
+#: usr/local/www/services_dyndns_edit.php:133
+#: usr/local/www/services_igmpproxy.php:80
+#: usr/local/www/services_rfc2136.php:55
+#: usr/local/www/services_rfc2136_edit.php:109
+#: usr/local/www/system_authservers.php:186
+#: usr/local/www/vpn_pppoe_edit.php:234 usr/local/www/services_dhcpv6.php:359
+#: usr/local/www/services_dhcpv6_edit.php:172
+#: usr/local/www/services_dhcpv6_relay.php:101
+#: usr/local/www/services_captiveportal_zones_edit.php:48
+#: usr/local/www/services_dyndns_edit.php:156 usr/local/www/fbegin.inc:189
+#: usr/local/www/fbegin.inc:361 usr/local/www/services_dnsmasq_edit.php:166
+#: usr/local/www/services_dhcpv6_edit.php:175
+#: usr/local/www/load_balancer_setting.php:98
+#: usr/local/www/services_unbound.php:102
+#: usr/local/www/services_unbound_advanced.php:88
+#: usr/local/www/services_dyndns.php:85 usr/local/www/services_dhcp.php:433
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/services_ntpd.php:71 usr/local/www/services_dhcp_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/services_dhcpv6.php:386
+#: usr/local/www/services_captiveportal_vouchers.php:82
+#: usr/local/www/fbegin.inc:197 usr/local/www/fbegin.inc:307
+#: usr/local/www/services_captiveportal_vouchers_edit.php:45
+#: usr/local/www/services_router_advertisements.php:194
+#: usr/local/www/services_captiveportal_ip.php:61
+#: usr/local/www/services_captiveportal_hostname_edit.php:59
+#: usr/local/www/services_captiveportal_mac.php:60
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/services_captiveportal_mac_edit.php:57
+#: usr/local/www/services_captiveportal_hostname.php:63
+#: usr/local/www/status_services.php:222
+#: usr/local/www/services_captiveportal.php:60
+#: usr/local/www/services_captiveportal_filemanager.php:71
+#: usr/local/www/services_captiveportal_ip_edit.php:60
+#: usr/local/www/services_dhcp.php:527 usr/local/www/services_ntpd.php:76
+#: usr/local/www/services_captiveportal_zones_edit.php:45
+#: usr/local/www/services_dhcpv6.php:367
+#: usr/local/www/system_authservers.php:187
+#: usr/local/www/status_services.php:220
+#: usr/local/www/services_dhcpv6_edit.php:178
+#: usr/local/www/services_dyndns_edit.php:160
+#: usr/local/www/services_dhcp_edit.php:301
+#: usr/local/www/services_captiveportal_vouchers.php:89
+#: usr/local/www/vpn_pppoe_edit.php:237 usr/local/www/services_dhcp.php:526
+#: usr/local/www/services_dhcpv6.php:362
+#: usr/local/www/system_authservers.php:188 usr/local/www/fbegin.inc:188
+#: usr/local/www/fbegin.inc:299 usr/local/www/services_dnsmasq.php:123
+#: usr/local/www/services_dyndns.php:64 usr/local/www/services_snmp.php:165
+#: usr/local/www/status_services.php:63
+#: usr/local/www/services_router_advertisements.php:189
+#: usr/local/www/services_dyndns_edit.php:162
+#: usr/local/www/services_dhcp.php:546 usr/local/www/services_dnsmasq.php:125
+#: usr/local/www/services_dyndns.php:60 usr/local/www/services_dnsmasq.php:146
+#: usr/local/www/services_rfc2136.php:55 usr/local/www/status_services.php:63
+#: usr/local/www/services_router_advertisements.php:189
+#: usr/local/www/services_captiveportal_ip_edit.php:60
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/services_captiveportal_zones_edit.php:45
+#: usr/local/www/services_dhcpv6_edit.php:178
+#: usr/local/www/services_dyndns_edit.php:162
+#: usr/local/www/services_wol.php:115
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/services_captiveportal_ip.php:61
+#: usr/local/www/services_captiveportal_hostname_edit.php:59
+#: usr/local/www/services_dhcp_edit.php:301
+#: usr/local/www/services_wol_edit.php:112
+#: usr/local/www/load_balancer_relay_protocol.php:100
+#: usr/local/www/services_ntpd.php:76
+#: usr/local/www/services_dhcpv6_relay.php:101
+#: usr/local/www/services_captiveportal_vouchers.php:89
+#: usr/local/www/load_balancer_relay_action.php:104
+#: usr/local/www/vpn_pppoe_edit.php:237 usr/local/www/services_dhcp.php:546
+#: usr/local/www/services_captiveportal_vouchers_edit.php:45
+#: usr/local/www/load_balancer_setting.php:98
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/services_captiveportal_mac_edit.php:57
+#: usr/local/www/load_balancer_pool.php:97
+#: usr/local/www/services_captiveportal_hostname.php:63
+#: usr/local/www/services_dhcpv6.php:362
+#: usr/local/www/services_captiveportal_filemanager.php:71
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/system_authservers.php:188
+#: usr/local/www/services_captiveportal.php:60
+#: usr/local/www/services_igmpproxy.php:80
+#: usr/local/www/services_dnsmasq_edit.php:166 usr/local/www/fbegin.inc:188
+#: usr/local/www/fbegin.inc:299 usr/local/www/load_balancer_monitor.php:88
+#: usr/local/www/services_rfc2136_edit.php:109
+#: usr/local/www/services_dnsmasq.php:146
+#: usr/local/www/services_captiveportal_mac.php:60
+#: usr/local/www/load_balancer_virtual_server.php:94
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/services_dyndns.php:60
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/services_dhcp_relay.php:100
+#: usr/local/www/services_snmp.php:165
+msgid "Services"
+msgstr "サービス"
+
+#: usr/local/www/load_balancer_virtual_server.php:94
+#: usr/local/www/load_balancer_relay_action.php:104
+#: usr/local/www/diag_logs.php:84 usr/local/www/diag_logs_auth.php:72
+#: usr/local/www/diag_logs_dhcp.php:77 usr/local/www/diag_logs_filter.php:108
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_ipsec.php:109 usr/local/www/diag_logs_ntpd.php:72
+#: usr/local/www/diag_logs_openvpn.php:76
+#: usr/local/www/diag_logs_settings.php:217
+#: usr/local/www/diag_logs_vpn.php:133 usr/local/www/load_balancer_pool.php:97
+#: usr/local/www/diag_logs_filter_summary.php:191
+#: usr/local/www/diag_logs_ppp.php:77 usr/local/www/diag_logs_relayd.php:55
+#: usr/local/www/diag_logs_relayd.php:73
+#: usr/local/www/load_balancer_monitor.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:153
+#: usr/local/www/load_balancer_virtual_server_edit.php:134
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/load_balancer_relay_protocol.php:100
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/fbegin.inc:130 usr/local/www/fbegin.inc:165
+#: usr/local/www/status_lb_pool.php:62 usr/local/www/status_lb_vs.php:56
+#: usr/local/www/diag_logs_wireless.php:74
+#: usr/local/www/diag_logs_routing.php:72
+#: usr/local/www/diag_logs_settings.php:222 usr/local/www/fbegin.inc:147
+#: usr/local/www/fbegin.inc:182 usr/local/www/load_balancer_setting.php:98
+#: usr/local/www/diag_logs_resolver.php:85
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/diag_logs_gateways.php:85
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_routing.php:73
+#: usr/local/www/diag_logs_settings.php:229 usr/local/www/fbegin.inc:156
+#: usr/local/www/fbegin.inc:190 usr/local/www/diag_logs_relayd.php:74
+#: usr/local/www/diag_logs_auth.php:73 usr/local/www/diag_logs_ipsec.php:110
+#: usr/local/www/diag_logs_resolver.php:86 usr/local/www/diag_logs_ntpd.php:73
+#: usr/local/www/diag_logs_dhcp.php:78 usr/local/www/diag_logs_wireless.php:75
+#: usr/local/www/diag_logs_filter_summary.php:192
+#: usr/local/www/diag_logs_gateways.php:86
+#: usr/local/www/diag_logs_openvpn.php:77
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: usr/local/www/diag_logs_filter.php:98
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_ppp.php:75 usr/local/www/fbegin.inc:148
+#: usr/local/www/fbegin.inc:181 usr/local/www/diag_logs_filter.php:128
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/diag_logs_auth.php:73
+#: usr/local/www/diag_logs_settings.php:229
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/diag_logs_filter.php:128
+#: usr/local/www/diag_logs_routing.php:73 usr/local/www/diag_logs_dhcp.php:78
+#: usr/local/www/load_balancer_relay_protocol.php:100
+#: usr/local/www/diag_logs.php:84
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_ntpd.php:73
+#: usr/local/www/load_balancer_relay_action.php:104
+#: usr/local/www/diag_logs_openvpn.php:77 usr/local/www/status_lb_pool.php:62
+#: usr/local/www/load_balancer_setting.php:98
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/diag_logs_ppp.php:75 usr/local/www/load_balancer_pool.php:97
+#: usr/local/www/diag_logs_gateways.php:86
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/fbegin.inc:148 usr/local/www/fbegin.inc:181
+#: usr/local/www/diag_logs_relayd.php:55 usr/local/www/diag_logs_relayd.php:74
+#: usr/local/www/diag_logs_vpn.php:133 usr/local/www/diag_logs_ipsec.php:110
+#: usr/local/www/load_balancer_monitor.php:88
+#: usr/local/www/load_balancer_virtual_server.php:94
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/status_lb_vs.php:56 usr/local/www/diag_logs_wireless.php:75
+#: usr/local/www/diag_logs_resolver.php:86
+#: usr/local/www/diag_logs_filter_summary.php:192
+msgid "Load Balancer"
+msgstr "バランサをロードする"
+
+#: usr/local/www/load_balancer_virtual_server.php:94
+#: usr/local/www/load_balancer_virtual_server.php:116
+#: usr/local/www/load_balancer_relay_action.php:127
+#: usr/local/www/load_balancer_pool.php:119
+#: usr/local/www/load_balancer_monitor.php:110
+#: usr/local/www/load_balancer_relay_protocol.php:123
+#: usr/local/www/status_lb_pool.php:121 usr/local/www/status_lb_vs.php:68
+#: usr/local/www/load_balancer_setting.php:120
+#: usr/local/www/load_balancer_setting.php:119
+#: usr/local/www/load_balancer_virtual_server.php:114
+#: usr/local/www/load_balancer_monitor.php:108
+#: usr/local/www/load_balancer_relay_protocol.php:121
+#: usr/local/www/load_balancer_relay_action.php:125
+#: usr/local/www/load_balancer_pool.php:117
+#: usr/local/www/load_balancer_relay_protocol.php:121
+#: usr/local/www/load_balancer_relay_action.php:125
+#: usr/local/www/status_lb_pool.php:121
+#: usr/local/www/load_balancer_setting.php:119
+#: usr/local/www/load_balancer_pool.php:117
+#: usr/local/www/load_balancer_monitor.php:108
+#: usr/local/www/load_balancer_virtual_server.php:94
+#: usr/local/www/load_balancer_virtual_server.php:114
+#: usr/local/www/status_lb_vs.php:68
+msgid "Virtual Servers"
+msgstr "仮想サーバー"
+
+#: usr/local/www/load_balancer_virtual_server.php:108
+#: usr/local/www/load_balancer_virtual_server.php:106
+#: usr/local/www/load_balancer_virtual_server.php:106
+msgid "The virtual server configuration has been changed"
+msgstr "仮想サーバーの構成が変更されました"
+
+#: usr/local/www/load_balancer_virtual_server.php:108
+#: usr/local/www/firewall_shaper_layer7.php:401
+#: usr/local/www/firewall_shaper_vinterface.php:366
+#: usr/local/www/firewall_shaper_wizards.php:96
+#: usr/local/www/firewall_aliases.php:160
+#: usr/local/www/firewall_nat_1to1.php:87
+#: usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_shaper.php:403
+#: usr/local/www/firewall_shaper_queues.php:187
+#: usr/local/www/firewall_virtual_ip.php:164 usr/local/www/interfaces.php:1222
+#: usr/local/www/vpn_ipsec.php:134 usr/local/www/vpn_ipsec_keys.php:86
+#: usr/local/www/vpn_ipsec_mobile.php:303
+#: usr/local/www/load_balancer_monitor.php:102 usr/local/www/vpn_pppoe.php:96
+#: usr/local/www/firewall_nat.php:175 usr/local/www/services_dhcp.php:536
+#: usr/local/www/services_dnsmasq.php:147
+#: usr/local/www/load_balancer_relay_protocol.php:114
+#: usr/local/www/services_igmpproxy.php:90
+#: usr/local/www/system_gateways.php:134 usr/local/www/firewall_nat_npt.php:87
+#: usr/local/www/services_dhcpv6.php:461
+#: usr/local/www/services_captiveportal_zones.php:47
+#: usr/local/www/firewall_nat_out.php:304
+#: usr/local/www/load_balancer_setting.php:111
+#: usr/local/www/services_unbound.php:129
+#: usr/local/www/services_unbound_advanced.php:116
+#: usr/local/www/firewall_shaper_vinterface.php:376
+#: usr/local/www/services_dhcp.php:549 usr/local/www/firewall_aliases.php:163
+#: usr/local/www/interfaces.php:1326 usr/local/www/services_dhcpv6.php:488
+#: usr/local/www/services_dnsmasq.php:148
+#: usr/local/www/firewall_nat_out.php:305
+#: usr/local/www/load_balancer_setting.php:110 usr/local/www/vpn_pppoe.php:97
+#: usr/local/www/vpn_ipsec.php:133 usr/local/www/vpn_ipsec_mobile.php:330
+#: usr/local/www/firewall_nat.php:180 usr/local/www/firewall_shaper.php:404
+#: usr/local/www/vpn_ipsec_keys.php:85
+#: usr/local/www/firewall_shaper_vinterface.php:383
+#: usr/local/www/load_balancer_virtual_server.php:106
+#: usr/local/www/load_balancer_monitor.php:100
+#: usr/local/www/load_balancer_relay_protocol.php:112
+#: usr/local/www/services_dhcp.php:653 usr/local/www/firewall_aliases.php:167
+#: usr/local/www/interfaces.php:1314
+#: usr/local/www/services_captiveportal_zones.php:48
+#: usr/local/www/firewall_virtual_ip.php:167
+#: usr/local/www/services_dhcpv6.php:468 usr/local/www/vpn_pppoe.php:98
+#: usr/local/www/vpn_ipsec.php:139 usr/local/www/firewall_virtual_ip.php:181
+#: usr/local/www/services_dhcp.php:655 usr/local/www/services_dhcpv6.php:463
+#: usr/local/www/services_dnsmasq.php:152 usr/local/www/interfaces.php:1327
+#: usr/local/www/firewall_shaper.php:405
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/firewall_shaper_queues.php:188
+#: usr/local/www/firewall_aliases.php:166
+#: usr/local/www/firewall_shaper_wizards.php:97
+#: usr/local/www/services_dhcp.php:675 usr/local/www/firewall_nat_out.php:312
+#: usr/local/www/services_dnsmasq.php:154 usr/local/www/interfaces.php:1369
+#: usr/local/www/firewall_virtual_ip.php:204
+#: usr/local/www/firewall_nat.php:183 usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/services_dnsmasq.php:175 usr/local/www/interfaces.php:1364
+#: usr/local/www/firewall_shaper_layer7.php:401 usr/local/www/vpn_pppoe.php:98
+#: usr/local/www/firewall_shaper.php:405
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/vpn_ipsec.php:139 usr/local/www/firewall_virtual_ip.php:204
+#: usr/local/www/firewall_shaper_queues.php:188
+#: usr/local/www/firewall_aliases.php:166
+#: usr/local/www/load_balancer_relay_protocol.php:112
+#: usr/local/www/firewall_shaper_wizards.php:97
+#: usr/local/www/services_dhcp.php:675 usr/local/www/firewall_nat.php:183
+#: usr/local/www/load_balancer_setting.php:110
+#: usr/local/www/services_dhcpv6.php:463
+#: usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/firewall_nat_npt.php:87
+#: usr/local/www/firewall_nat_1to1.php:87
+#: usr/local/www/services_captiveportal_zones.php:48
+#: usr/local/www/services_igmpproxy.php:90
+#: usr/local/www/load_balancer_monitor.php:100
+#: usr/local/www/services_dnsmasq.php:175
+#: usr/local/www/vpn_ipsec_mobile.php:330
+#: usr/local/www/system_gateways.php:134
+#: usr/local/www/load_balancer_virtual_server.php:106
+#: usr/local/www/vpn_ipsec_keys.php:85 usr/local/www/interfaces.php:1364
+msgid "You must apply the changes in order for them to take effect."
+msgstr "あなたはそれらを有効にするために変更を適用する必要があります。"
+
+#: usr/local/www/load_balancer_virtual_server.php:115
+#: usr/local/www/load_balancer_relay_action.php:126
+#: usr/local/www/load_balancer_pool.php:118
+#: usr/local/www/load_balancer_monitor.php:109
+#: usr/local/www/load_balancer_relay_protocol.php:122
+#: usr/local/www/status_lb_pool.php:120 usr/local/www/status_lb_vs.php:67
+#: usr/local/www/load_balancer_setting.php:119
+#: usr/local/www/load_balancer_setting.php:118
+#: usr/local/www/load_balancer_virtual_server.php:113
+#: usr/local/www/load_balancer_monitor.php:107
+#: usr/local/www/load_balancer_relay_protocol.php:120
+#: usr/local/www/load_balancer_relay_action.php:124
+#: usr/local/www/load_balancer_pool.php:116
+#: usr/local/www/load_balancer_relay_protocol.php:120
+#: usr/local/www/load_balancer_relay_action.php:124
+#: usr/local/www/status_lb_pool.php:120
+#: usr/local/www/load_balancer_setting.php:118
+#: usr/local/www/load_balancer_pool.php:116
+#: usr/local/www/load_balancer_monitor.php:107
+#: usr/local/www/load_balancer_virtual_server.php:113
+#: usr/local/www/status_lb_vs.php:67
+msgid "Pools"
+msgstr "プール"
+
+#: usr/local/www/load_balancer_virtual_server.php:117
+#: usr/local/www/load_balancer_relay_action.php:125
+#: usr/local/www/load_balancer_pool.php:120
+#: usr/local/www/load_balancer_monitor.php:111
+#: usr/local/www/load_balancer_relay_protocol.php:121
+#: usr/local/www/load_balancer_setting.php:121
+#: usr/local/www/load_balancer_setting.php:120
+#: usr/local/www/load_balancer_virtual_server.php:115
+#: usr/local/www/load_balancer_monitor.php:109
+#: usr/local/www/load_balancer_relay_protocol.php:119
+#: usr/local/www/load_balancer_relay_action.php:123
+#: usr/local/www/load_balancer_pool.php:118
+#: usr/local/www/load_balancer_relay_protocol.php:119
+#: usr/local/www/load_balancer_relay_action.php:123
+#: usr/local/www/load_balancer_setting.php:120
+#: usr/local/www/load_balancer_pool.php:118
+#: usr/local/www/load_balancer_monitor.php:109
+#: usr/local/www/load_balancer_virtual_server.php:115
+msgid "Monitors"
+msgstr "モニター"
+
+#: usr/local/www/load_balancer_virtual_server.php:129
+#: usr/local/www/firewall_shaper_layer7.php:466
+#: usr/local/www/interfaces_bridge_edit.php:291
+#: usr/local/www/firewall_nat_edit.php:182
+#: usr/local/www/firewall_nat_edit.php:185
+#: usr/local/www/firewall_nat_edit.php:518
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:456
+#: usr/local/www/firewall_rules_edit.php:808
+#: usr/local/www/diag_ipsec_sad.php:89 usr/local/www/diag_ipsec_spd.php:89
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:424
+#: usr/local/www/status_upnp.php:86
+#: usr/local/www/services_rfc2136_edit.php:186
+#: usr/local/www/system_advanced_admin.php:300
+#: usr/local/www/vpn_ipsec_phase2.php:516
+#: usr/local/www/vpn_openvpn_client.php:421
+#: usr/local/www/vpn_openvpn_client.php:861
+#: usr/local/www/vpn_openvpn_server.php:656
+#: usr/local/www/firewall_nat_out_edit.php:469
+#: usr/local/www/load_balancer_relay_action_edit.php:423
+#: usr/local/www/firewall_rules_edit.php:843
+#: usr/local/www/load_balancer_virtual_server.php:130
+#: usr/local/www/vpn_openvpn_server.php:729
+#: usr/local/www/interfaces_bridge_edit.php:300
+#: usr/local/www/diag_packet_capture.php:160
+#: usr/local/www/vpn_ipsec_phase2.php:542
+#: usr/local/www/firewall_nat_edit.php:525
+#: usr/local/www/vpn_openvpn_client.php:426
+#: usr/local/www/vpn_openvpn_client.php:866
+#: usr/local/www/load_balancer_relay_action_edit.php:421
+#: usr/local/www/diag_ipsec_sad.php:90
+#: usr/local/www/load_balancer_virtual_server.php:128
+#: usr/local/www/vpn_openvpn_server.php:747 usr/local/www/status_upnp.php:87
+#: usr/local/www/interfaces_bridge_edit.php:301
+#: usr/local/www/diag_packet_capture.php:207
+#: usr/local/www/vpn_ipsec_phase2.php:644
+#: usr/local/www/firewall_nat_edit.php:524
+#: usr/local/www/vpn_openvpn_client.php:434
+#: usr/local/www/vpn_openvpn_client.php:919
+#: usr/local/www/diag_ipsec_spd.php:90
+#: usr/local/www/vpn_openvpn_client.php:452
+#: usr/local/www/vpn_openvpn_client.php:938
+#: usr/local/www/firewall_rules_edit.php:846
+#: usr/local/www/firewall_nat_edit.php:187
+#: usr/local/www/firewall_nat_edit.php:190
+#: usr/local/www/firewall_nat_edit.php:519
+#: usr/local/www/interfaces_bridge_edit.php:302
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:473
+#: usr/local/www/vpn_openvpn_server.php:773
+#: usr/local/www/vpn_ipsec_phase2.php:665
+#: usr/local/www/firewall_rules_edit.php:858
+#: usr/local/www/diag_logs_filter.php:171
+#: usr/local/www/firewall_nat_edit.php:192
+#: usr/local/www/firewall_nat_edit.php:195
+#: usr/local/www/firewall_nat_edit.php:531
+#: usr/local/www/diag_packet_capture.php:223
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:485
+#: usr/local/www/firewall_rules_edit.php:857
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/interfaces_bridge_edit.php:304
+#: usr/local/www/firewall_shaper_layer7.php:466
+#: usr/local/www/vpn_openvpn_client.php:452
+#: usr/local/www/vpn_openvpn_client.php:938
+#: usr/local/www/firewall_rules_edit.php:857
+#: usr/local/www/diag_logs_filter.php:171
+#: usr/local/www/firewall_nat_edit.php:192
+#: usr/local/www/firewall_nat_edit.php:195
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/diag_packet_capture.php:223
+#: usr/local/www/diag_ipsec_spd.php:90
+#: usr/local/www/system_advanced_admin.php:300
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:421
+#: usr/local/www/interfaces_bridge_edit.php:304
+#: usr/local/www/services_rfc2136_edit.php:186
+#: usr/local/www/load_balancer_virtual_server.php:128
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:485
+#: usr/local/www/diag_ipsec_sad.php:90
+#: usr/local/www/vpn_openvpn_server.php:773
+#: usr/local/www/vpn_ipsec_phase2.php:665 usr/local/www/status_upnp.php:87
+msgid "Protocol"
+msgstr "プロトコル"
+
+#: usr/local/www/load_balancer_virtual_server.php:130
+#: usr/local/www/diag_tables.php:133
+#: usr/local/www/interfaces_ppps_edit.php:660
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:195
+#: usr/local/www/system_advanced_notifications.php:185
+#: usr/local/www/diag_tables.php:132
+#: usr/local/www/system_advanced_notifications.php:194
+#: usr/local/www/load_balancer_virtual_server.php:131
+#: usr/local/www/load_balancer_virtual_server_edit.php:169
+#: usr/local/www/interfaces_ppps_edit.php:661
+#: usr/local/www/load_balancer_virtual_server.php:129
+#: usr/local/www/load_balancer_virtual_server_edit.php:167
+#: usr/local/www/interfaces_ppps_edit.php:667 usr/local/www/diag_dns.php:153
+#: usr/local/www/interfaces_ppps_edit.php:665
+#: usr/local/www/diag_tables.php:133
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:167
+#: usr/local/www/interfaces_ppps_edit.php:665 usr/local/www/diag_dns.php:153
+#: usr/local/www/system_advanced_notifications.php:194
+#: usr/local/www/load_balancer_virtual_server.php:129
+msgid "IP Address"
+msgstr "IPアドレス"
+
+#: usr/local/www/load_balancer_virtual_server.php:131
+#: usr/local/www/diag_packet_capture.php:165
+#: usr/local/www/firewall_aliases_edit.php:459
+#: usr/local/www/firewall_rules.php:365 usr/local/www/firewall_rules.php:367
+#: usr/local/www/load_balancer_pool.php:134
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:203
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:202
+#: usr/local/www/services_captiveportal.php:607
+#: usr/local/www/services_captiveportal.php:628
+#: usr/local/www/services_captiveportal.php:647
+#: usr/local/www/services_captiveportal.php:666
+#: usr/local/www/status_upnp.php:85
+#: usr/local/www/firewall_aliases_edit.php:462
+#: usr/local/www/firewall_rules.php:369 usr/local/www/firewall_rules.php:371
+#: usr/local/www/load_balancer_virtual_server.php:132
+#: usr/local/www/services_captiveportal.php:643
+#: usr/local/www/services_captiveportal.php:664
+#: usr/local/www/services_captiveportal.php:686
+#: usr/local/www/services_captiveportal.php:705
+#: usr/local/www/load_balancer_virtual_server_edit.php:183
+#: usr/local/www/diag_packet_capture.php:185
+#: usr/local/www/load_balancer_pool_edit.php:211
+#: usr/local/www/load_balancer_pool.php:135
+#: usr/local/www/firewall_aliases_edit.php:464
+#: usr/local/www/firewall_rules.php:362 usr/local/www/firewall_rules.php:364
+#: usr/local/www/load_balancer_virtual_server.php:130
+#: usr/local/www/services_captiveportal.php:641
+#: usr/local/www/services_captiveportal.php:662
+#: usr/local/www/services_captiveportal.php:684
+#: usr/local/www/services_captiveportal.php:703
+#: usr/local/www/status_upnp.php:86
+#: usr/local/www/load_balancer_virtual_server_edit.php:181
+#: usr/local/www/diag_packet_capture.php:232
+#: usr/local/www/load_balancer_pool_edit.php:209
+#: usr/local/www/load_balancer_pool.php:133 usr/local/www/diag_testport.php:60
+#: usr/local/www/diag_testport.php:123
+#: usr/local/www/services_captiveportal.php:642
+#: usr/local/www/services_captiveportal.php:663
+#: usr/local/www/services_captiveportal.php:685
+#: usr/local/www/services_captiveportal.php:704
+#: usr/local/www/diag_packet_capture.php:248
+#: usr/local/www/firewall_rules.php:360
+#: usr/local/www/services_captiveportal.php:658
+#: usr/local/www/services_captiveportal.php:679
+#: usr/local/www/services_captiveportal.php:701
+#: usr/local/www/services_captiveportal.php:720
+#: usr/local/www/firewall_aliases_edit.php:486
+#: usr/local/www/diag_testport.php:60 usr/local/www/diag_testport.php:123
+#: usr/local/www/load_balancer_virtual_server_edit.php:181
+#: usr/local/www/diag_packet_capture.php:248
+#: usr/local/www/load_balancer_pool.php:133
+#: usr/local/www/firewall_rules.php:360 usr/local/www/firewall_rules.php:362
+#: usr/local/www/services_captiveportal.php:658
+#: usr/local/www/services_captiveportal.php:679
+#: usr/local/www/services_captiveportal.php:701
+#: usr/local/www/services_captiveportal.php:720
+#: usr/local/www/firewall_aliases_edit.php:472
+#: usr/local/www/load_balancer_virtual_server.php:130
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:209
+#: usr/local/www/status_upnp.php:86
+msgid "Port"
+msgstr "ポート"
+
+#: usr/local/www/load_balancer_virtual_server.php:132
+#: usr/local/www/load_balancer_pool.php:97
+#: usr/local/www/load_balancer_pool_edit.php:153
+#: usr/local/www/status_lb_pool.php:62
+#: usr/local/www/load_balancer_virtual_server.php:133
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/load_balancer_virtual_server.php:131
+#: usr/local/www/status_lb_pool.php:62 usr/local/www/load_balancer_pool.php:97
+#: usr/local/www/load_balancer_virtual_server.php:131
+#: usr/local/www/load_balancer_pool_edit.php:159
+msgid "Pool"
+msgstr "プール"
+
+#: usr/local/www/load_balancer_virtual_server.php:133
+#: usr/local/www/load_balancer_virtual_server_edit.php:228
+#: usr/local/www/load_balancer_virtual_server.php:134
+#: usr/local/www/load_balancer_virtual_server_edit.php:217
+#: usr/local/www/load_balancer_virtual_server.php:132
+#: usr/local/www/load_balancer_virtual_server_edit.php:215
+#: usr/local/www/load_balancer_virtual_server_edit.php:215
+#: usr/local/www/load_balancer_virtual_server.php:132
+msgid "Fall Back Pool"
+msgstr "プールのフォールバック"
+
+#: usr/local/www/diag_tables.php:44 usr/local/www/diag_defaults.php:58
+#: usr/local/www/diag_dump_states.php:65 usr/local/www/diag_nanobsd.php:49
+#: usr/local/www/diag_packet_capture.php:41
+#: usr/local/www/crash_reporter.php:82
+#: usr/local/www/diag_authentication.php:69 usr/local/www/diag_backup.php:499
+#: usr/local/www/diag_confbak.php:98 usr/local/www/halt.php:59
+#: usr/local/www/diag_smart.php:14 usr/local/www/diag_states_summary.php:185
+#: usr/local/www/system_firmware_auto.php:60
+#: usr/local/www/diag_patterns.php:58 usr/local/www/diag_dns.php:34
+#: usr/local/www/reboot.php:51 usr/local/www/edit.php:39
+#: usr/local/www/diag_ping.php:43 usr/local/www/diag_resetstate.php:64
+#: usr/local/www/diag_routes.php:45 usr/local/www/diag_traceroute.php:45
+#: usr/local/www/exec.php:91 usr/local/www/fbegin.inc:367
+#: usr/local/www/diag_arp.php:261 usr/local/www/diag_ndp.php:103
+#: usr/local/www/system_firmware_restorefullbackup.php:104
+#: usr/local/www/diag_dump_states_sources.php:65 usr/local/www/fbegin.inc:385
+#: usr/local/www/diag_backup.php:576 usr/local/www/reboot.php:48
+#: usr/local/www/edit.php:42 usr/local/www/diag_dump_states.php:75
+#: usr/local/www/halt.php:54 usr/local/www/diag_states_summary.php:174
+#: usr/local/www/fbegin.inc:331 usr/local/www/diag_sockets.php:44
+#: usr/local/www/exec.php:93 usr/local/www/diag_packet_capture.php:43
+#: usr/local/www/diag_states_summary.php:176
+#: usr/local/www/diag_testport.php:49 usr/local/www/diag_defaults.php:52
+#: usr/local/www/diag_backup.php:581 usr/local/www/edit.php:41
+#: usr/local/www/fbegin.inc:323 usr/local/www/diag_dump_states.php:67
+#: usr/local/www/system_firmware_auto.php:61
+#: usr/local/www/diag_traceroute.php:46 usr/local/www/diag_ping.php:44
+#: usr/local/www/diag_ndp.php:103 usr/local/www/reboot.php:48
+#: usr/local/www/diag_arp.php:261 usr/local/www/diag_authentication.php:69
+#: usr/local/www/diag_tables.php:44 usr/local/www/diag_testport.php:49
+#: usr/local/www/diag_dump_states.php:67
+#: usr/local/www/diag_states_summary.php:176
+#: usr/local/www/system_firmware_auto.php:61
+#: usr/local/www/diag_defaults.php:52
+#: usr/local/www/diag_dump_states_sources.php:65
+#: usr/local/www/diag_packet_capture.php:43 usr/local/www/diag_routes.php:45
+#: usr/local/www/diag_traceroute.php:46 usr/local/www/diag_smart.php:14
+#: usr/local/www/exec.php:93 usr/local/www/halt.php:54
+#: usr/local/www/diag_patterns.php:58 usr/local/www/diag_backup.php:581
+#: usr/local/www/diag_ping.php:44 usr/local/www/diag_resetstate.php:64
+#: usr/local/www/system_firmware_restorefullbackup.php:104
+#: usr/local/www/diag_dns.php:34 usr/local/www/edit.php:41
+#: usr/local/www/fbegin.inc:323 usr/local/www/diag_confbak.php:98
+#: usr/local/www/diag_sockets.php:44 usr/local/www/diag_nanobsd.php:49
+#: usr/local/www/crash_reporter.php:82
+msgid "Diagnostics"
+msgstr "診断法"
+
+#: usr/local/www/diag_tables.php:44 usr/local/www/fbegin.inc:199
+#: usr/local/www/fbegin.inc:217 usr/local/www/fbegin.inc:225
+#: usr/local/www/fbegin.inc:216 usr/local/www/diag_tables.php:44
+#: usr/local/www/fbegin.inc:216
+msgid "Tables"
+msgstr "テーブル"
+
+#: usr/local/www/diag_tables.php:86 usr/local/www/diag_tables.php:87
+#: usr/local/www/diag_tables.php:87
+msgid "The bogons database has been updated."
+msgstr "bogonsデータベースが更新されました。"
+
+#: usr/local/www/diag_tables.php:118 usr/local/www/diag_tables.php:117
+#: usr/local/www/diag_tables.php:118
+msgid "Table:"
+msgstr "表:"
+
+#: usr/local/www/diag_tables.php:152 usr/local/www/diag_tables.php:151
+#: usr/local/www/diag_tables.php:153 usr/local/www/diag_tables.php:155
+#: usr/local/www/diag_tables.php:153 usr/local/www/diag_tables.php:155
+msgid "No entries exist in this table."
+msgstr "エントリはこの表に存在しません。"
+
+#: usr/local/www/diag_tables.php:160 usr/local/www/diag_backup.php:163
+#: usr/local/www/exec.php:273 usr/local/www/exec.php:283
+#: usr/local/www/system_firmware_restorefullbackup.php:166
+#: usr/local/www/diag_tables.php:159 usr/local/www/diag_backup.php:250
+#: usr/local/www/exec.php:275 usr/local/www/exec.php:285
+#: usr/local/www/diag_tables.php:153 usr/local/www/diag_tables.php:162
+#: usr/local/www/diag_tables.php:153 usr/local/www/diag_tables.php:162
+#: usr/local/www/exec.php:275 usr/local/www/exec.php:285
+#: usr/local/www/diag_backup.php:250
+#: usr/local/www/system_firmware_restorefullbackup.php:166
+msgid "Download"
+msgstr "ダウンロード"
+
+#: usr/local/www/diag_tables.php:160 usr/local/www/diag_tables.php:159
+#: usr/local/www/diag_tables.php:153 usr/local/www/diag_tables.php:162
+#: usr/local/www/diag_tables.php:153 usr/local/www/diag_tables.php:162
+msgid " the latest bogon data."
+msgstr "最新のbogonデータ。"
+
+#: usr/local/www/diag_tables.php:162
+#: usr/local/www/firewall_shaper_layer7.php:576
+#: usr/local/www/services_dhcpv6.php:758
+#: usr/local/www/system_firmware_restorefullbackup.php:163
+#: usr/local/www/diag_tables.php:161 usr/local/www/services_dhcpv6.php:853
+#: usr/local/www/services_dhcpv6.php:784 usr/local/www/diag_tables.php:165
+#: usr/local/www/services_dhcpv6.php:801
+#: usr/local/www/firewall_shaper_layer7.php:571
+#: usr/local/www/firewall_shaper_layer7.php:571
+#: usr/local/www/diag_tables.php:165 usr/local/www/services_dhcpv6.php:801
+#: usr/local/www/system_firmware_restorefullbackup.php:163
+msgid "Delete"
+msgstr "削除"
+
+#: usr/local/www/diag_tables.php:162 usr/local/www/diag_tables.php:161
+#: usr/local/www/diag_tables.php:165 usr/local/www/diag_tables.php:165
+msgid "all"
+msgstr "すべて"
+
+#: usr/local/www/diag_tables.php:162 usr/local/www/diag_tables.php:161
+#: usr/local/www/diag_tables.php:165 usr/local/www/diag_tables.php:162
+#: usr/local/www/diag_tables.php:165
+msgid "entries in this table."
+msgstr "この表のエントリ。"
+
+#: usr/local/www/pkg_edit.php:61 usr/local/www/pkg.php:51
+#: usr/local/www/pkg.php:55 usr/local/www/pkg_edit.php:69
+#: usr/local/www/pkg.php:55 usr/local/www/pkg_edit.php:69
+msgid "ERROR: No package defined."
+msgstr "エラー:パッケージ定義されています。"
+
+#: usr/local/www/pkg_edit.php:256
+#: usr/local/www/firewall_virtual_ip_edit.php:281
+#: usr/local/www/services_wol_edit.php:112
+#: usr/local/www/interfaces_bridge_edit.php:226
+#: usr/local/www/interfaces_gif_edit.php:125
+#: usr/local/www/interfaces_gre_edit.php:127
+#: usr/local/www/interfaces_groups_edit.php:44
+#: usr/local/www/firewall_aliases_edit.php:56
+#: usr/local/www/firewall_nat_1to1_edit.php:216
+#: usr/local/www/firewall_nat_edit.php:438
+#: usr/local/www/firewall_nat_out_edit.php:300
+#: usr/local/www/firewall_rules_edit.php:628
+#: usr/local/www/firewall_schedule_edit.php:61
+#: usr/local/www/interfaces_vlan_edit.php:139
+#: usr/local/www/interfaces_lagg_edit.php:120
+#: usr/local/www/interfaces_ppps_edit.php:378
+#: usr/local/www/interfaces_qinq_edit.php:39
+#: usr/local/www/interfaces_wireless_edit.php:145
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:153
+#: usr/local/www/load_balancer_virtual_server_edit.php:134
+#: usr/local/www/vpn_pptp_users_edit.php:135
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/services_rfc2136_edit.php:109
+#: usr/local/www/vpn_l2tp_users_edit.php:38
+#: usr/local/www/vpn_pppoe_edit.php:234
+#: usr/local/www/firewall_nat_npt_edit.php:140
+#: usr/local/www/firewall_nat_1to1_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:145 usr/local/www/pkg_edit.php:251
+#: usr/local/www/firewall_nat_out_edit.php:313
+#: usr/local/www/firewall_rules_edit.php:660
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/interfaces_bridge_edit.php:235
+#: usr/local/www/firewall_nat_edit.php:445
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/firewall_virtual_ip_edit.php:268
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+#: usr/local/www/firewall_nat_npt_edit.php:144 usr/local/www/pkg_edit.php:254
+#: usr/local/www/firewall_rules_edit.php:661
+#: usr/local/www/firewall_nat_edit.php:444
+#: usr/local/www/firewall_virtual_ip_edit.php:261
+#: usr/local/www/interfaces_wireless_edit.php:147
+#: usr/local/www/firewall_rules_edit.php:664
+#: usr/local/www/interfaces_vlan_edit.php:142
+#: usr/local/www/interfaces_ppps_edit.php:384
+#: usr/local/www/interfaces_lagg_edit.php:133
+#: usr/local/www/firewall_nat_edit.php:439
+#: usr/local/www/interfaces_gif_edit.php:133
+#: usr/local/www/firewall_virtual_ip_edit.php:253
+#: usr/local/www/vpn_pppoe_edit.php:237
+#: usr/local/www/interfaces_bridge_edit.php:236
+#: usr/local/www/firewall_nat_out_edit.php:317
+#: usr/local/www/firewall_rules_edit.php:676
+#: usr/local/www/firewall_nat_edit.php:451
+#: usr/local/www/firewall_virtual_ip_edit.php:273
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/firewall_nat_edit.php:452
+#: usr/local/www/interfaces_wireless_edit.php:147
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/interfaces_gre_edit.php:127
+#: usr/local/www/firewall_rules_edit.php:676
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/interfaces_vlan_edit.php:142
+#: usr/local/www/interfaces_ppps_edit.php:384
+#: usr/local/www/interfaces_lagg_edit.php:133
+#: usr/local/www/firewall_schedule_edit.php:61
+#: usr/local/www/firewall_nat_edit.php:452
+#: usr/local/www/interfaces_gif_edit.php:133
+#: usr/local/www/services_wol_edit.php:112
+#: usr/local/www/firewall_virtual_ip_edit.php:273
+#: usr/local/www/vpn_pppoe_edit.php:237
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/firewall_nat_npt_edit.php:144
+#: usr/local/www/interfaces_groups_edit.php:44
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/firewall_aliases_edit.php:56 usr/local/www/pkg_edit.php:254
+#: usr/local/www/vpn_l2tp_users_edit.php:38
+#: usr/local/www/interfaces_bridge_edit.php:236
+#: usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+#: usr/local/www/vpn_pptp_users_edit.php:135
+#: usr/local/www/services_rfc2136_edit.php:109
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/interfaces_qinq_edit.php:39
+msgid "Edit"
+msgstr "編集"
+
+#: usr/local/www/pkg_edit.php:260 usr/local/www/pkg_edit.php:255
+#: usr/local/www/pkg_edit.php:258 usr/local/www/pkg_edit.php:258
+msgid "Package Editor"
+msgstr "パッケージ·エディター"
+
+#: usr/local/www/pkg_edit.php:405
+#: usr/local/www/firewall_aliases_import.php:154
+#: usr/local/www/firewall_shaper_layer7.php:569
+#: usr/local/www/firewall_shaper_vinterface.php:307
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:130
+#: usr/local/www/firewall_virtual_ip_edit.php:546
+#: usr/local/www/diag_logs_settings.php:321 usr/local/www/diag_nanobsd.php:219
+#: usr/local/www/services_snmp.php:400 usr/local/www/services_wol_edit.php:157
+#: usr/local/www/interfaces_bridge_edit.php:583
+#: usr/local/www/interfaces_gif_edit.php:218
+#: usr/local/www/interfaces_gre_edit.php:229
+#: usr/local/www/interfaces_groups_edit.php:322
+#: usr/local/www/firewall_aliases_edit.php:686
+#: usr/local/www/firewall_nat_1to1_edit.php:459
+#: usr/local/www/firewall_nat_edit.php:846
+#: usr/local/www/firewall_nat_out.php:320
+#: usr/local/www/firewall_nat_out_edit.php:649
+#: usr/local/www/firewall_rules_edit.php:1065
+#: usr/local/www/firewall_rules_edit.php:1480
+#: usr/local/www/firewall_schedule_edit.php:1156
+#: usr/local/www/firewall_shaper.php:349 usr/local/www/interfaces.php:2443
+#: usr/local/www/interfaces_assign.php:501 usr/local/www/diag_smart.php:219
+#: usr/local/www/system.php:447 usr/local/www/interfaces_vlan_edit.php:189
+#: usr/local/www/system_firmware_settings.php:238
+#: usr/local/www/system_routes_edit.php:275 usr/local/www/vpn_ipsec.php:168
+#: usr/local/www/vpn_ipsec_keys_edit.php:144
+#: usr/local/www/vpn_ipsec_mobile.php:608
+#: usr/local/www/interfaces_lagg_edit.php:218
+#: usr/local/www/interfaces_ppps_edit.php:783
+#: usr/local/www/interfaces_qinq_edit.php:394
+#: usr/local/www/interfaces_wireless_edit.php:195
+#: usr/local/www/load_balancer_monitor_edit.php:356
+#: usr/local/www/load_balancer_pool_edit.php:311 usr/local/www/edit.php:181
+#: usr/local/www/services_captiveportal.php:923
+#: usr/local/www/services_captiveportal_ip_edit.php:231
+#: usr/local/www/services_captiveportal_mac_edit.php:203
+#: usr/local/www/services_dhcp.php:871
+#: usr/local/www/services_dhcp_edit.php:251
+#: usr/local/www/services_dhcp_relay.php:189
+#: usr/local/www/services_dnsmasq.php:209
+#: usr/local/www/services_dnsmasq_edit.php:172 usr/local/www/vpn_pptp.php:472
+#: usr/local/www/vpn_pptp_users_edit.php:168
+#: usr/local/www/load_balancer_relay_action_edit.php:557
+#: usr/local/www/load_balancer_relay_protocol_edit.php:280
+#: usr/local/www/pkg_mgr_settings.php:120
+#: usr/local/www/services_captiveportal_hostname_edit.php:203
+#: usr/local/www/services_captiveportal_vouchers.php:597
+#: usr/local/www/services_captiveportal_vouchers_edit.php:207
+#: usr/local/www/status_rrd_graph_settings.php:225
+#: usr/local/www/services_dyndns_edit.php:236
+#: usr/local/www/services_igmpproxy.php:155
+#: usr/local/www/services_igmpproxy_edit.php:280
+#: usr/local/www/services_rfc2136_edit.php:200
+#: usr/local/www/status_lb_pool.php:217
+#: usr/local/www/system_advanced_admin.php:535
+#: usr/local/www/system_advanced_firewall.php:416
+#: usr/local/www/system_advanced_misc.php:442
+#: usr/local/www/system_advanced_network.php:304
+#: usr/local/www/system_advanced_notifications.php:93
+#: usr/local/www/system_advanced_notifications.php:254
+#: usr/local/www/system_advanced_sysctl.php:104
+#: usr/local/www/system_advanced_sysctl.php:257
+#: usr/local/www/system_authservers.php:724
+#: usr/local/www/system_camanager.php:359
+#: usr/local/www/system_camanager.php:552
+#: usr/local/www/system_certmanager.php:155
+#: usr/local/www/system_certmanager.php:469
+#: usr/local/www/system_certmanager.php:787
+#: usr/local/www/system_crlmanager.php:294
+#: usr/local/www/system_crlmanager.php:387
+#: usr/local/www/system_gateway_groups_edit.php:228
+#: usr/local/www/system_gateways_edit.php:492
+#: usr/local/www/system_groupmanager.php:390
+#: usr/local/www/system_groupmanager_addprivs.php:224
+#: usr/local/www/system_usermanager.php:774
+#: usr/local/www/system_usermanager_addprivs.php:205
+#: usr/local/www/system_usermanager_passwordmg.php:119
+#: usr/local/www/system_usermanager_settings.php:161
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:124
+#: usr/local/www/vpn_ipsec_phase1.php:855
+#: usr/local/www/vpn_ipsec_phase2.php:648 usr/local/www/vpn_l2tp.php:445
+#: usr/local/www/vpn_l2tp_users_edit.php:176
+#: usr/local/www/vpn_openvpn_client.php:845
+#: usr/local/www/vpn_openvpn_csc.php:658
+#: usr/local/www/vpn_openvpn_server.php:1433
+#: usr/local/www/vpn_pppoe_edit.php:589
+#: usr/local/www/firewall_nat_npt_edit.php:270
+#: usr/local/www/services_dhcpv6.php:784
+#: usr/local/www/services_dhcpv6_edit.php:228
+#: usr/local/www/services_dhcpv6_relay.php:190
+#: usr/local/www/system_routes_edit.php:315
+#: usr/local/www/services_unbound_acls.php:101
+#: usr/local/www/services_unbound_acls.php:306
+#: usr/local/www/diag_logs_settings.php:328
+#: usr/local/www/system_gateway_groups_edit.php:283
+#: usr/local/www/services_captiveportal_vouchers.php:604
+#: usr/local/www/services_dyndns_edit.php:366
+#: usr/local/www/firewall_nat_out.php:330
+#: usr/local/www/services_dnsmasq_edit.php:284
+#: usr/local/www/firewall_nat_1to1_edit.php:466
+#: usr/local/www/services_dhcpv6_edit.php:237
+#: usr/local/www/firewall_nat_npt_edit.php:275
+#: usr/local/www/load_balancer_setting.php:161
+#: usr/local/www/status_rrd_graph_settings.php:226
+#: usr/local/www/pkg_edit.php:413 usr/local/www/firewall_nat_out_edit.php:662
+#: usr/local/www/system_certmanager.php:183
+#: usr/local/www/system_certmanager.php:568
+#: usr/local/www/system_certmanager.php:953
+#: usr/local/www/load_balancer_relay_action_edit.php:556
+#: usr/local/www/firewall_rules_edit.php:1100
+#: usr/local/www/firewall_rules_edit.php:1551
+#: usr/local/www/services_unbound.php:245
+#: usr/local/www/system_usermanager.php:772
+#: usr/local/www/services_igmpproxy_edit.php:282
+#: usr/local/www/system_advanced_firewall.php:475
+#: usr/local/www/firewall_aliases_edit.php:691
+#: usr/local/www/system_advanced_notifications.php:96
+#: usr/local/www/system_advanced_notifications.php:281
+#: usr/local/www/system_advanced_misc.php:485
+#: usr/local/www/firewall_shaper_vinterface.php:317
+#: usr/local/www/system_groupmanager_addprivs.php:222
+#: usr/local/www/edit.php:184 usr/local/www/services_captiveportal.php:968
+#: usr/local/www/system_gateways_edit.php:527
+#: usr/local/www/vpn_openvpn_server.php:1575
+#: usr/local/www/services_dhcp.php:909 usr/local/www/services_ntpd.php:121
+#: usr/local/www/interfaces_bridge_edit.php:592
+#: usr/local/www/system_camanager.php:553
+#: usr/local/www/vpn_ipsec_phase2.php:674
+#: usr/local/www/firewall_nat_edit.php:854
+#: usr/local/www/services_dhcp_edit.php:260 usr/local/www/interfaces.php:2644
+#: usr/local/www/vpn_openvpn_client.php:850
+#: usr/local/www/load_balancer_pool_edit.php:328
+#: usr/local/www/firewall_virtual_ip_edit.php:534
+#: usr/local/www/services_snmp.php:414 usr/local/www/system.php:476
+#: usr/local/www/interfaces_gre_edit.php:228
+#: usr/local/www/vpn_ipsec_phase1.php:868 usr/local/www/diag_nanobsd.php:218
+#: usr/local/www/services_dhcpv6.php:574 usr/local/www/services_dhcpv6.php:879
+#: usr/local/www/vpn_pppoe_edit.php:590
+#: usr/local/www/system_routes_edit.php:316
+#: usr/local/www/diag_logs_settings.php:348
+#: usr/local/www/system_gateway_groups_edit.php:343
+#: usr/local/www/interfaces_vlan_edit.php:190
+#: usr/local/www/services_dnsmasq.php:210
+#: usr/local/www/services_captiveportal_vouchers.php:618
+#: usr/local/www/firewall_nat_out.php:331
+#: usr/local/www/services_dnsmasq_edit.php:285
+#: usr/local/www/load_balancer_relay_protocol_edit.php:278
+#: usr/local/www/services_captiveportal_vouchers_edit.php:205
+#: usr/local/www/firewall_nat_1to1_edit.php:464
+#: usr/local/www/services_dhcpv6_edit.php:239
+#: usr/local/www/services_router_advertisements.php:400
+#: usr/local/www/firewall_nat_npt_edit.php:274
+#: usr/local/www/load_balancer_setting.php:160 usr/local/www/vpn_ipsec.php:167
+#: usr/local/www/services_dhcp_relay.php:190
+#: usr/local/www/services_captiveportal_hostname_edit.php:201
+#: usr/local/www/vpn_ipsec_mobile.php:657 usr/local/www/pkg_edit.php:416
+#: usr/local/www/interfaces_qinq_edit.php:395
+#: usr/local/www/interfaces_gif_edit.php:219
+#: usr/local/www/firewall_shaper.php:350
+#: usr/local/www/load_balancer_relay_action_edit.php:554
+#: usr/local/www/load_balancer_monitor_edit.php:354
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:160
+#: usr/local/www/services_captiveportal_mac_edit.php:201
+#: usr/local/www/firewall_schedule_edit.php:1155
+#: usr/local/www/interfaces_ppps_edit.php:784
+#: usr/local/www/system_crlmanager.php:295
+#: usr/local/www/system_crlmanager.php:388
+#: usr/local/www/system_crlmanager.php:420
+#: usr/local/www/firewall_aliases_edit.php:694 usr/local/www/vpn_pptp.php:474
+#: usr/local/www/interfaces_lagg_edit.php:219
+#: usr/local/www/vpn_openvpn_csc.php:657
+#: usr/local/www/system_advanced_misc.php:534
+#: usr/local/www/firewall_shaper_vinterface.php:319
+#: usr/local/www/services_captiveportal.php:964
+#: usr/local/www/system_gateways_edit.php:627
+#: usr/local/www/services_dhcpv6_relay.php:191
+#: usr/local/www/system_usermanager_passwordmg.php:120
+#: usr/local/www/interfaces_assign.php:495
+#: usr/local/www/services_captiveportal_ip_edit.php:229
+#: usr/local/www/vpn_openvpn_server.php:1616
+#: usr/local/www/services_dhcp.php:1113
+#: usr/local/www/system_firmware_settings.php:251
+#: usr/local/www/services_ntpd.php:151
+#: usr/local/www/interfaces_bridge_edit.php:593
+#: usr/local/www/interfaces_groups_edit.php:323
+#: usr/local/www/vpn_ipsec_phase2.php:770
+#: usr/local/www/firewall_nat_edit.php:853
+#: usr/local/www/vpn_pptp_users_edit.php:169
+#: usr/local/www/vpn_ipsec_keys_edit.php:143
+#: usr/local/www/services_dhcp_edit.php:262 usr/local/www/interfaces.php:2632
+#: usr/local/www/vpn_openvpn_client.php:903
+#: usr/local/www/load_balancer_pool_edit.php:326
+#: usr/local/www/vpn_l2tp_users_edit.php:177 usr/local/www/vpn_l2tp.php:446
+#: usr/local/www/firewall_virtual_ip_edit.php:479
+#: usr/local/www/services_snmp.php:415 usr/local/www/system.php:469
+#: usr/local/www/vpn_ipsec_phase1.php:865 usr/local/www/diag_nanobsd.php:209
+#: usr/local/www/diag_nanobsd.php:277 usr/local/www/services_dhcpv6.php:810
+#: usr/local/www/system_authservers.php:729 usr/local/www/vpn_l2tp.php:449
+#: usr/local/www/system_gateways_edit.php:632
+#: usr/local/www/system_camanager.php:366
+#: usr/local/www/system_camanager.php:577
+#: usr/local/www/services_captiveportal_ip_edit.php:223
+#: usr/local/www/interfaces_wireless_edit.php:197
+#: usr/local/www/vpn_openvpn_client.php:922
+#: usr/local/www/services_dhcpv6_edit.php:242
+#: usr/local/www/services_dyndns_edit.php:370
+#: usr/local/www/firewall_rules_edit.php:1115
+#: usr/local/www/firewall_rules_edit.php:1566
+#: usr/local/www/interfaces_vlan_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:790 usr/local/www/vpn_ipsec.php:173
+#: usr/local/www/system_firmware_settings.php:260
+#: usr/local/www/interfaces_lagg_edit.php:232
+#: usr/local/www/firewall_nat_edit.php:849
+#: usr/local/www/interfaces_gif_edit.php:230
+#: usr/local/www/services_dhcp_edit.php:494
+#: usr/local/www/firewall_virtual_ip_edit.php:471
+#: usr/local/www/diag_smart.php:240
+#: usr/local/www/services_captiveportal_vouchers.php:627
+#: usr/local/www/vpn_pppoe_edit.php:593 usr/local/www/services_dhcp.php:1126
+#: usr/local/www/system_certmanager.php:186
+#: usr/local/www/system_certmanager.php:577
+#: usr/local/www/system_certmanager.php:995
+#: usr/local/www/system_advanced_misc.php:546
+#: usr/local/www/services_captiveportal_mac_edit.php:214
+#: usr/local/www/services_dhcpv6.php:827
+#: usr/local/www/system_usermanager_passwordmg.php:125
+#: usr/local/www/system_authservers.php:745
+#: usr/local/www/system_advanced_firewall.php:537
+#: usr/local/www/services_captiveportal.php:966 usr/local/www/vpn_pptp.php:477
+#: usr/local/www/pkg_edit.php:420 usr/local/www/edit.php:185
+#: usr/local/www/interfaces_bridge_edit.php:594
+#: usr/local/www/services_dnsmasq.php:235
+#: usr/local/www/vpn_ipsec_phase1.php:886
+#: usr/local/www/firewall_nat_out_edit.php:664
+#: usr/local/www/vpn_openvpn_server.php:1668
+#: usr/local/www/vpn_ipsec_phase2.php:791 usr/local/www/services_snmp.php:430
+#: usr/local/www/interfaces_qinq_edit.php:398
+#: usr/local/www/interfaces.php:2664
+#: usr/local/www/firewall_shaper_layer7.php:565
+#: usr/local/www/services_router_advertisements.php:395
+#: usr/local/www/system_gateways_edit.php:634
+#: usr/local/www/services_dyndns_edit.php:378
+#: usr/local/www/firewall_rules_edit.php:1128
+#: usr/local/www/firewall_rules_edit.php:1602
+#: usr/local/www/system_firmware_settings.php:266 usr/local/www/system.php:467
+#: usr/local/www/firewall_nat_edit.php:889
+#: usr/local/www/firewall_virtual_ip_edit.php:491
+#: usr/local/www/services_dhcp.php:1146
+#: usr/local/www/system_certmanager.php:578
+#: usr/local/www/system_certmanager.php:999
+#: usr/local/www/system_advanced_misc.php:667
+#: usr/local/www/system_routes_edit.php:339
+#: usr/local/www/firewall_nat_out.php:338
+#: usr/local/www/system_gateway_groups_edit.php:344
+#: usr/local/www/system_advanced_firewall.php:538
+#: usr/local/www/services_captiveportal.php:982
+#: usr/local/www/firewall_aliases_edit.php:725
+#: usr/local/www/pkg_mgr_settings.php:123
+#: usr/local/www/system_usermanager_settings.php:164
+#: usr/local/www/services_dnsmasq.php:248
+#: usr/local/www/system_advanced_network.php:305
+#: usr/local/www/firewall_nat_out_edit.php:704
+#: usr/local/www/diag_nanobsd.php:200 usr/local/www/interfaces.php:2710
+#: usr/local/www/system_gateways_edit.php:664
+#: usr/local/www/firewall_rules_edit.php:1127
+#: usr/local/www/firewall_rules_edit.php:1613
+#: usr/local/www/interfaces_ppps_edit.php:787
+#: usr/local/www/interfaces_lagg_edit.php:231
+#: usr/local/www/firewall_nat_edit.php:890
+#: usr/local/www/system_routes_edit.php:349
+#: usr/local/www/firewall_nat_out.php:337
+#: usr/local/www/interfaces_groups_edit.php:320 usr/local/www/pkg_edit.php:422
+#: usr/local/www/interfaces_bridge_edit.php:598
+#: usr/local/www/services_dnsmasq.php:312 usr/local/www/interfaces.php:2699
+#: usr/local/www/firewall_shaper_layer7.php:565 usr/local/www/vpn_l2tp.php:449
+#: usr/local/www/services_router_advertisements.php:395
+#: usr/local/www/system_gateways_edit.php:665
+#: usr/local/www/system_camanager.php:366
+#: usr/local/www/system_camanager.php:577
+#: usr/local/www/services_captiveportal_ip_edit.php:223
+#: usr/local/www/interfaces_wireless_edit.php:197
+#: usr/local/www/firewall_shaper.php:350
+#: usr/local/www/load_balancer_relay_protocol_edit.php:278
+#: usr/local/www/system_groupmanager.php:390
+#: usr/local/www/diag_logs_settings.php:348
+#: usr/local/www/interfaces_gre_edit.php:229
+#: usr/local/www/firewall_shaper_vinterface.php:319
+#: usr/local/www/vpn_openvpn_client.php:922
+#: usr/local/www/system_usermanager_addprivs.php:205
+#: usr/local/www/services_dhcpv6_edit.php:242
+#: usr/local/www/services_dyndns_edit.php:378
+#: usr/local/www/firewall_rules_edit.php:1127
+#: usr/local/www/firewall_rules_edit.php:1613
+#: usr/local/www/interfaces_vlan_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:787 usr/local/www/vpn_ipsec.php:173
+#: usr/local/www/system_firmware_settings.php:266
+#: usr/local/www/vpn_openvpn_csc.php:657
+#: usr/local/www/interfaces_lagg_edit.php:231 usr/local/www/system.php:467
+#: usr/local/www/firewall_schedule_edit.php:1155
+#: usr/local/www/firewall_nat_edit.php:890
+#: usr/local/www/services_captiveportal_hostname_edit.php:203
+#: usr/local/www/interfaces_gif_edit.php:230
+#: usr/local/www/services_dhcp_edit.php:494
+#: usr/local/www/vpn_ipsec_keys_edit.php:143
+#: usr/local/www/services_wol_edit.php:157
+#: usr/local/www/firewall_virtual_ip_edit.php:491
+#: usr/local/www/services_ntpd.php:151
+#: usr/local/www/status_rrd_graph_settings.php:226
+#: usr/local/www/services_dhcpv6_relay.php:191
+#: usr/local/www/firewall_aliases_import.php:154
+#: usr/local/www/diag_smart.php:240
+#: usr/local/www/services_captiveportal_vouchers.php:632
+#: usr/local/www/vpn_pppoe_edit.php:593 usr/local/www/services_dhcp.php:1146
+#: usr/local/www/services_captiveportal_vouchers_edit.php:205
+#: usr/local/www/system_certmanager.php:186
+#: usr/local/www/system_certmanager.php:578
+#: usr/local/www/system_certmanager.php:999
+#: usr/local/www/status_lb_pool.php:217
+#: usr/local/www/load_balancer_setting.php:160
+#: usr/local/www/system_advanced_admin.php:535
+#: usr/local/www/load_balancer_relay_action_edit.php:554
+#: usr/local/www/system_advanced_misc.php:667
+#: usr/local/www/system_routes_edit.php:343
+#: usr/local/www/services_captiveportal_mac_edit.php:214
+#: usr/local/www/system_crlmanager.php:295
+#: usr/local/www/system_crlmanager.php:388
+#: usr/local/www/system_crlmanager.php:420
+#: usr/local/www/services_dhcpv6.php:827
+#: usr/local/www/firewall_nat_out.php:337
+#: usr/local/www/system_usermanager_passwordmg.php:125
+#: usr/local/www/firewall_nat_npt_edit.php:274
+#: usr/local/www/interfaces_groups_edit.php:320
+#: usr/local/www/load_balancer_monitor_edit.php:354
+#: usr/local/www/system_gateway_groups_edit.php:344
+#: usr/local/www/system_authservers.php:745
+#: usr/local/www/system_advanced_firewall.php:538
+#: usr/local/www/services_captiveportal.php:982
+#: usr/local/www/system_groupmanager_addprivs.php:224
+#: usr/local/www/firewall_aliases_edit.php:711 usr/local/www/vpn_pptp.php:477
+#: usr/local/www/pkg_mgr_settings.php:123
+#: usr/local/www/system_usermanager_settings.php:164
+#: usr/local/www/pkg_edit.php:422 usr/local/www/edit.php:185
+#: usr/local/www/vpn_l2tp_users_edit.php:177
+#: usr/local/www/interfaces_bridge_edit.php:598
+#: usr/local/www/services_igmpproxy_edit.php:282
+#: usr/local/www/services_igmpproxy.php:155
+#: usr/local/www/firewall_nat_1to1_edit.php:466
+#: usr/local/www/services_dnsmasq_edit.php:285
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:124
+#: usr/local/www/system_advanced_notifications.php:96
+#: usr/local/www/system_advanced_notifications.php:281
+#: usr/local/www/vpn_pptp_users_edit.php:169
+#: usr/local/www/services_rfc2136_edit.php:200
+#: usr/local/www/services_dnsmasq.php:312
+#: usr/local/www/vpn_ipsec_phase1.php:886
+#: usr/local/www/system_usermanager.php:772
+#: usr/local/www/vpn_ipsec_mobile.php:657
+#: usr/local/www/load_balancer_pool_edit.php:326
+#: usr/local/www/system_advanced_network.php:305
+#: usr/local/www/firewall_nat_out_edit.php:704
+#: usr/local/www/vpn_openvpn_server.php:1668
+#: usr/local/www/vpn_ipsec_phase2.php:791 usr/local/www/diag_nanobsd.php:200
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:160
+#: usr/local/www/services_dhcp_relay.php:190
+#: usr/local/www/interfaces_assign.php:501 usr/local/www/services_snmp.php:430
+#: usr/local/www/interfaces_qinq_edit.php:395
+#: usr/local/www/system_advanced_sysctl.php:104
+#: usr/local/www/system_advanced_sysctl.php:257
+#: usr/local/www/interfaces.php:2699
+msgid "Save"
+msgstr "保存"
+
+#: usr/local/www/pkg_edit.php:415 usr/local/www/firewall_rules_edit.php:1077
+#: usr/local/www/pkg_edit.php:424 usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/pkg_edit.php:427 usr/local/www/firewall_rules_edit.php:1127
+#: usr/local/www/pkg_edit.php:431 usr/local/www/firewall_rules_edit.php:1140
+#: usr/local/www/firewall_rules_edit.php:1139 usr/local/www/pkg_edit.php:433
+#: usr/local/www/firewall_rules_edit.php:1139 usr/local/www/pkg_edit.php:433
+msgid "Advanced features"
+msgstr "高度な機能"
+
+#: usr/local/www/pkg_edit.php:817 usr/local/www/firewall_shaper_layer7.php:65
+#: usr/local/www/diag_packet_capture.php:203 usr/local/www/vpn_ipsec.php:422
+#: usr/local/www/interfaces_wireless.php:133 usr/local/www/vpn_pptp.php:477
+#: usr/local/www/status_graph.php:291 usr/local/www/carp_status.php:194
+#: usr/local/www/status_queues.php:172 usr/local/www/status_graph_cpu.php:53
+#: usr/local/www/vpn_pppoe_edit.php:595 usr/local/www/vpn_ipsec.php:433
+#: usr/local/www/status_graph.php:286 usr/local/www/pkg_edit.php:864
+#: usr/local/www/status_queues.php:180
+#: usr/local/www/diag_packet_capture.php:223
+#: usr/local/www/vpn_pppoe_edit.php:596 usr/local/www/carp_status.php:187
+#: usr/local/www/vpn_ipsec.php:432 usr/local/www/status_graph.php:297
+#: usr/local/www/pkg_edit.php:873 usr/local/www/status_queues.php:181
+#: usr/local/www/vpn_pptp.php:479 usr/local/www/interfaces_wireless.php:134
+#: usr/local/www/diag_packet_capture.php:270 usr/local/www/vpn_ipsec.php:438
+#: usr/local/www/status_graph.php:308
+#: usr/local/www/interfaces_wireless.php:136
+#: usr/local/www/vpn_pppoe_edit.php:599 usr/local/www/vpn_pptp.php:482
+#: usr/local/www/pkg_edit.php:917 usr/local/www/status_queues.php:163
+#: usr/local/www/status_graph.php:330
+#: usr/local/www/diag_packet_capture.php:208
+#: usr/local/www/diag_packet_capture.php:288 usr/local/www/pkg_edit.php:921
+#: usr/local/www/firewall_shaper_layer7.php:65 usr/local/www/vpn_ipsec.php:438
+#: usr/local/www/status_graph_cpu.php:53 usr/local/www/status_graph.php:330
+#: usr/local/www/diag_packet_capture.php:208
+#: usr/local/www/diag_packet_capture.php:288
+#: usr/local/www/interfaces_wireless.php:136
+#: usr/local/www/vpn_pppoe_edit.php:599 usr/local/www/vpn_pptp.php:482
+#: usr/local/www/pkg_edit.php:921 usr/local/www/status_queues.php:163
+#: usr/local/www/carp_status.php:187
+msgid "Note"
+msgstr "ノート"
+
+#: usr/local/www/pkg_edit.php:823 usr/local/www/pkg_edit.php:835
+#: usr/local/www/firewall_aliases_import.php:155
+#: usr/local/www/firewall_shaper_layer7.php:573
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:130
+#: usr/local/www/firewall_virtual_ip_edit.php:546
+#: usr/local/www/services_wol_edit.php:157
+#: usr/local/www/interfaces_bridge_edit.php:583
+#: usr/local/www/interfaces_gif_edit.php:218
+#: usr/local/www/interfaces_gre_edit.php:229
+#: usr/local/www/interfaces_groups_edit.php:323
+#: usr/local/www/firewall_aliases_edit.php:687
+#: usr/local/www/firewall_nat_1to1_edit.php:459
+#: usr/local/www/firewall_nat_edit.php:846
+#: usr/local/www/firewall_nat_out_edit.php:649
+#: usr/local/www/firewall_rules_edit.php:1065
+#: usr/local/www/firewall_rules_edit.php:1480
+#: usr/local/www/firewall_schedule_edit.php:1157
+#: usr/local/www/interfaces.php:1443 usr/local/www/interfaces.php:1549
+#: usr/local/www/interfaces.php:2444
+#: usr/local/www/interfaces_vlan_edit.php:189
+#: usr/local/www/system_routes_edit.php:255
+#: usr/local/www/system_routes_edit.php:275
+#: usr/local/www/interfaces_lagg_edit.php:218
+#: usr/local/www/interfaces_ppps_edit.php:784
+#: usr/local/www/interfaces_qinq_edit.php:395
+#: usr/local/www/interfaces_wireless_edit.php:195
+#: usr/local/www/load_balancer_monitor_edit.php:356
+#: usr/local/www/load_balancer_pool_edit.php:312
+#: usr/local/www/load_balancer_virtual_server_edit.php:280
+#: usr/local/www/services_captiveportal.php:924
+#: usr/local/www/services_dhcp_edit.php:251
+#: usr/local/www/services_dnsmasq_edit.php:172
+#: usr/local/www/load_balancer_relay_action_edit.php:557
+#: usr/local/www/load_balancer_relay_protocol_edit.php:280
+#: usr/local/www/services_captiveportal_vouchers.php:598
+#: usr/local/www/services_dyndns_edit.php:237
+#: usr/local/www/services_igmpproxy_edit.php:281
+#: usr/local/www/services_rfc2136_edit.php:201
+#: usr/local/www/system_advanced_sysctl.php:258
+#: usr/local/www/system_gateway_groups_edit.php:228
+#: usr/local/www/system_gateways_edit.php:492
+#: usr/local/www/system_groupmanager_addprivs.php:225
+#: usr/local/www/system_usermanager_addprivs.php:206
+#: usr/local/www/vpn_l2tp_users_edit.php:177
+#: usr/local/www/vpn_pppoe_edit.php:590
+#: usr/local/www/firewall_nat_npt_edit.php:270
+#: usr/local/www/services_dhcpv6_edit.php:228
+#: usr/local/www/system_routes_edit.php:287
+#: usr/local/www/system_routes_edit.php:315
+#: usr/local/www/services_unbound_acls.php:306
+#: usr/local/www/system_gateway_groups_edit.php:283
+#: usr/local/www/services_captiveportal_vouchers.php:605
+#: usr/local/www/services_dyndns_edit.php:367
+#: usr/local/www/services_dnsmasq_edit.php:284
+#: usr/local/www/firewall_nat_1to1_edit.php:466
+#: usr/local/www/services_dhcpv6_edit.php:237
+#: usr/local/www/firewall_nat_npt_edit.php:275 usr/local/www/pkg_edit.php:870
+#: usr/local/www/firewall_nat_out_edit.php:662
+#: usr/local/www/load_balancer_relay_action_edit.php:556
+#: usr/local/www/firewall_rules_edit.php:1100
+#: usr/local/www/firewall_rules_edit.php:1551
+#: usr/local/www/services_igmpproxy_edit.php:283
+#: usr/local/www/firewall_aliases_edit.php:692
+#: usr/local/www/system_groupmanager_addprivs.php:223
+#: usr/local/www/services_captiveportal.php:969
+#: usr/local/www/system_gateways_edit.php:527
+#: usr/local/www/load_balancer_virtual_server_edit.php:269
+#: usr/local/www/interfaces_bridge_edit.php:592
+#: usr/local/www/firewall_nat_edit.php:854
+#: usr/local/www/services_dhcp_edit.php:260 usr/local/www/interfaces.php:1655
+#: usr/local/www/interfaces.php:2645
+#: usr/local/www/load_balancer_pool_edit.php:329
+#: usr/local/www/firewall_virtual_ip_edit.php:534
+#: usr/local/www/interfaces_gre_edit.php:228
+#: usr/local/www/vpn_pppoe_edit.php:591
+#: usr/local/www/system_routes_edit.php:288
+#: usr/local/www/system_routes_edit.php:316
+#: usr/local/www/system_gateway_groups_edit.php:343
+#: usr/local/www/interfaces_vlan_edit.php:190
+#: usr/local/www/services_captiveportal_vouchers.php:619
+#: usr/local/www/services_dnsmasq_edit.php:285
+#: usr/local/www/load_balancer_relay_protocol_edit.php:278
+#: usr/local/www/firewall_nat_1to1_edit.php:464
+#: usr/local/www/services_dhcpv6_edit.php:239
+#: usr/local/www/firewall_nat_npt_edit.php:274 usr/local/www/pkg_edit.php:879
+#: usr/local/www/interfaces_qinq_edit.php:396
+#: usr/local/www/interfaces_gif_edit.php:219
+#: usr/local/www/load_balancer_relay_action_edit.php:554
+#: usr/local/www/load_balancer_monitor_edit.php:354
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:160
+#: usr/local/www/firewall_schedule_edit.php:1156
+#: usr/local/www/interfaces_ppps_edit.php:785
+#: usr/local/www/firewall_aliases_edit.php:695
+#: usr/local/www/interfaces_lagg_edit.php:219
+#: usr/local/www/services_captiveportal.php:965
+#: usr/local/www/system_gateways_edit.php:627
+#: usr/local/www/load_balancer_virtual_server_edit.php:267
+#: usr/local/www/interfaces_bridge_edit.php:593
+#: usr/local/www/interfaces_groups_edit.php:324
+#: usr/local/www/firewall_nat_edit.php:853
+#: usr/local/www/services_dhcp_edit.php:262 usr/local/www/interfaces.php:1537
+#: usr/local/www/interfaces.php:1643 usr/local/www/interfaces.php:2633
+#: usr/local/www/load_balancer_pool_edit.php:327
+#: usr/local/www/vpn_l2tp_users_edit.php:178
+#: usr/local/www/firewall_virtual_ip_edit.php:479
+#: usr/local/www/system_gateways_edit.php:632
+#: usr/local/www/interfaces_wireless_edit.php:197
+#: usr/local/www/services_dhcpv6_edit.php:242
+#: usr/local/www/services_dyndns_edit.php:371
+#: usr/local/www/firewall_rules_edit.php:1115
+#: usr/local/www/firewall_rules_edit.php:1566
+#: usr/local/www/interfaces_vlan_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:791
+#: usr/local/www/interfaces_lagg_edit.php:232
+#: usr/local/www/firewall_nat_edit.php:849
+#: usr/local/www/interfaces_gif_edit.php:230
+#: usr/local/www/services_dhcp_edit.php:494
+#: usr/local/www/firewall_virtual_ip_edit.php:471
+#: usr/local/www/services_captiveportal_vouchers.php:628
+#: usr/local/www/vpn_pppoe_edit.php:594
+#: usr/local/www/services_captiveportal.php:967 usr/local/www/pkg_edit.php:923
+#: usr/local/www/interfaces_bridge_edit.php:594
+#: usr/local/www/firewall_nat_out_edit.php:664
+#: usr/local/www/interfaces_qinq_edit.php:399
+#: usr/local/www/interfaces.php:1547 usr/local/www/interfaces.php:1652
+#: usr/local/www/interfaces.php:2665
+#: usr/local/www/firewall_shaper_layer7.php:568
+#: usr/local/www/system_gateways_edit.php:634
+#: usr/local/www/services_dyndns_edit.php:379
+#: usr/local/www/firewall_rules_edit.php:1128
+#: usr/local/www/firewall_rules_edit.php:1602
+#: usr/local/www/firewall_nat_edit.php:889
+#: usr/local/www/firewall_virtual_ip_edit.php:491
+#: usr/local/www/system_routes_edit.php:313
+#: usr/local/www/system_routes_edit.php:339
+#: usr/local/www/system_gateway_groups_edit.php:344
+#: usr/local/www/services_captiveportal.php:983
+#: usr/local/www/firewall_aliases_edit.php:726
+#: usr/local/www/firewall_nat_out_edit.php:704
+#: usr/local/www/interfaces.php:1592 usr/local/www/interfaces.php:1698
+#: usr/local/www/interfaces.php:2711
+#: usr/local/www/system_gateways_edit.php:664
+#: usr/local/www/firewall_rules_edit.php:1127
+#: usr/local/www/firewall_rules_edit.php:1613
+#: usr/local/www/interfaces_ppps_edit.php:788
+#: usr/local/www/interfaces_lagg_edit.php:231
+#: usr/local/www/firewall_nat_edit.php:890
+#: usr/local/www/system_routes_edit.php:319
+#: usr/local/www/system_routes_edit.php:349
+#: usr/local/www/interfaces_groups_edit.php:321 usr/local/www/pkg_edit.php:927
+#: usr/local/www/interfaces_bridge_edit.php:598
+#: usr/local/www/interfaces.php:1586 usr/local/www/interfaces.php:1691
+#: usr/local/www/interfaces.php:2700
+#: usr/local/www/firewall_shaper_layer7.php:568
+#: usr/local/www/system_gateways_edit.php:665
+#: usr/local/www/interfaces_wireless_edit.php:197
+#: usr/local/www/load_balancer_relay_protocol_edit.php:278
+#: usr/local/www/interfaces_gre_edit.php:229
+#: usr/local/www/system_usermanager_addprivs.php:206
+#: usr/local/www/services_dhcpv6_edit.php:242
+#: usr/local/www/services_dyndns_edit.php:379
+#: usr/local/www/firewall_rules_edit.php:1127
+#: usr/local/www/firewall_rules_edit.php:1613
+#: usr/local/www/load_balancer_virtual_server_edit.php:267
+#: usr/local/www/interfaces_vlan_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:788
+#: usr/local/www/interfaces_lagg_edit.php:231
+#: usr/local/www/firewall_schedule_edit.php:1156
+#: usr/local/www/firewall_nat_edit.php:890
+#: usr/local/www/interfaces_gif_edit.php:230
+#: usr/local/www/services_dhcp_edit.php:494
+#: usr/local/www/services_wol_edit.php:157
+#: usr/local/www/firewall_virtual_ip_edit.php:491
+#: usr/local/www/firewall_aliases_import.php:155
+#: usr/local/www/services_captiveportal_vouchers.php:633
+#: usr/local/www/vpn_pppoe_edit.php:594
+#: usr/local/www/load_balancer_relay_action_edit.php:554
+#: usr/local/www/system_routes_edit.php:313
+#: usr/local/www/system_routes_edit.php:343
+#: usr/local/www/firewall_nat_npt_edit.php:274
+#: usr/local/www/interfaces_groups_edit.php:321
+#: usr/local/www/load_balancer_monitor_edit.php:354
+#: usr/local/www/system_gateway_groups_edit.php:344
+#: usr/local/www/services_captiveportal.php:983
+#: usr/local/www/system_groupmanager_addprivs.php:225
+#: usr/local/www/firewall_aliases_edit.php:712 usr/local/www/pkg_edit.php:927
+#: usr/local/www/vpn_l2tp_users_edit.php:178
+#: usr/local/www/interfaces_bridge_edit.php:598
+#: usr/local/www/services_igmpproxy_edit.php:283
+#: usr/local/www/firewall_nat_1to1_edit.php:466
+#: usr/local/www/services_dnsmasq_edit.php:285
+#: usr/local/www/services_rfc2136_edit.php:201
+#: usr/local/www/load_balancer_pool_edit.php:327
+#: usr/local/www/firewall_nat_out_edit.php:704
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:160
+#: usr/local/www/interfaces_qinq_edit.php:396
+#: usr/local/www/system_advanced_sysctl.php:258
+#: usr/local/www/interfaces.php:1586 usr/local/www/interfaces.php:1691
+#: usr/local/www/interfaces.php:2700
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: usr/local/www/pkg_edit.php:1037 usr/local/www/firewall_nat_edit.php:531
+#: usr/local/www/firewall_rules_edit.php:908
+#: usr/local/www/firewall_rules_edit.php:1083
+#: usr/local/www/firewall_rules_edit.php:1117
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1175
+#: usr/local/www/firewall_rules_edit.php:1217
+#: usr/local/www/firewall_rules_edit.php:1241
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1291
+#: usr/local/www/firewall_rules_edit.php:1342
+#: usr/local/www/firewall_rules_edit.php:1392
+#: usr/local/www/firewall_rules_edit.php:1446
+#: usr/local/www/interfaces.php:1330 usr/local/www/interfaces.php:1940
+#: usr/local/www/services_dhcp.php:725 usr/local/www/services_dhcp.php:741
+#: usr/local/www/services_dhcp.php:753 usr/local/www/services_dhcp.php:765
+#: usr/local/www/services_dhcp.php:777 usr/local/www/services_dhcp.php:799
+#: usr/local/www/services_dnsmasq.php:194
+#: usr/local/www/services_dnsmasq.php:197
+#: usr/local/www/services_dnsmasq.php:200 usr/local/www/fbegin.inc:83
+#: usr/local/www/system_gateways_edit.php:415
+#: usr/local/www/vpn_openvpn_client.php:829
+#: usr/local/www/vpn_openvpn_csc.php:642
+#: usr/local/www/vpn_openvpn_server.php:1412
+#: usr/local/www/services_dhcpv6.php:651 usr/local/www/services_dhcpv6.php:667
+#: usr/local/www/services_dhcpv6.php:679 usr/local/www/services_dhcpv6.php:691
+#: usr/local/www/services_dhcpv6.php:703 usr/local/www/services_dhcpv6.php:725
+#: usr/local/www/fbegin.inc:99 usr/local/www/pkg_edit.php:1052
+#: usr/local/www/firewall_rules_edit.php:943
+#: usr/local/www/firewall_rules_edit.php:1118
+#: usr/local/www/firewall_rules_edit.php:1152
+#: usr/local/www/firewall_rules_edit.php:1168
+#: usr/local/www/firewall_rules_edit.php:1210
+#: usr/local/www/firewall_rules_edit.php:1252
+#: usr/local/www/firewall_rules_edit.php:1276
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1331
+#: usr/local/www/firewall_rules_edit.php:1358
+#: usr/local/www/firewall_rules_edit.php:1413
+#: usr/local/www/firewall_rules_edit.php:1463
+#: usr/local/www/firewall_rules_edit.php:1517
+#: usr/local/www/services_unbound_advanced.php:88
+#: usr/local/www/system_gateways_edit.php:436
+#: usr/local/www/vpn_openvpn_server.php:1554
+#: usr/local/www/services_dhcp.php:763 usr/local/www/services_dhcp.php:779
+#: usr/local/www/services_dhcp.php:791 usr/local/www/services_dhcp.php:803
+#: usr/local/www/services_dhcp.php:815 usr/local/www/services_dhcp.php:837
+#: usr/local/www/firewall_nat_edit.php:538 usr/local/www/interfaces.php:1434
+#: usr/local/www/interfaces.php:2118 usr/local/www/vpn_openvpn_client.php:834
+#: usr/local/www/services_dhcpv6.php:744 usr/local/www/services_dhcpv6.php:760
+#: usr/local/www/services_dhcpv6.php:773 usr/local/www/services_dhcpv6.php:786
+#: usr/local/www/services_dhcpv6.php:798 usr/local/www/services_dhcpv6.php:820
+#: usr/local/www/services_dnsmasq.php:195
+#: usr/local/www/services_dnsmasq.php:198
+#: usr/local/www/services_dnsmasq.php:201 usr/local/www/fbegin.inc:108
+#: usr/local/www/pkg_edit.php:1063 usr/local/www/vpn_openvpn_csc.php:641
+#: usr/local/www/system_gateways_edit.php:542
+#: usr/local/www/vpn_openvpn_server.php:1596
+#: usr/local/www/services_dhcp.php:945 usr/local/www/services_dhcp.php:961
+#: usr/local/www/services_dhcp.php:975 usr/local/www/services_dhcp.php:987
+#: usr/local/www/services_dhcp.php:999 usr/local/www/services_dhcp.php:1011
+#: usr/local/www/services_dhcp.php:1034
+#: usr/local/www/firewall_nat_edit.php:537 usr/local/www/interfaces.php:1422
+#: usr/local/www/interfaces.php:2106 usr/local/www/vpn_openvpn_client.php:883
+#: usr/local/www/services_dhcpv6.php:675 usr/local/www/services_dhcpv6.php:704
+#: usr/local/www/services_dhcpv6.php:717 usr/local/www/services_dhcpv6.php:729
+#: usr/local/www/services_dhcpv6.php:751
+#: usr/local/www/system_gateways_edit.php:546
+#: usr/local/www/vpn_openvpn_client.php:902
+#: usr/local/www/firewall_rules_edit.php:952
+#: usr/local/www/firewall_rules_edit.php:1167
+#: usr/local/www/firewall_rules_edit.php:1183
+#: usr/local/www/firewall_rules_edit.php:1225
+#: usr/local/www/firewall_rules_edit.php:1267
+#: usr/local/www/firewall_rules_edit.php:1303
+#: usr/local/www/firewall_rules_edit.php:1346
+#: usr/local/www/firewall_rules_edit.php:1373
+#: usr/local/www/firewall_rules_edit.php:1428
+#: usr/local/www/firewall_rules_edit.php:1478
+#: usr/local/www/firewall_rules_edit.php:1532
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/services_dhcp_edit.php:454
+#: usr/local/www/services_dhcp_edit.php:470
+#: usr/local/www/services_dhcp_edit.php:482
+#: usr/local/www/services_dhcp.php:958 usr/local/www/services_dhcp.php:974
+#: usr/local/www/services_dhcp.php:988 usr/local/www/services_dhcp.php:1000
+#: usr/local/www/services_dhcp.php:1012 usr/local/www/services_dhcp.php:1024
+#: usr/local/www/services_dhcp.php:1047 usr/local/www/services_dhcpv6.php:692
+#: usr/local/www/services_dhcpv6.php:708 usr/local/www/services_dhcpv6.php:721
+#: usr/local/www/services_dhcpv6.php:734 usr/local/www/services_dhcpv6.php:746
+#: usr/local/www/services_dhcpv6.php:768 usr/local/www/pkg_edit.php:1107
+#: usr/local/www/fbegin.inc:100 usr/local/www/services_dnsmasq.php:220
+#: usr/local/www/services_dnsmasq.php:223
+#: usr/local/www/services_dnsmasq.php:226
+#: usr/local/www/vpn_openvpn_server.php:1648 usr/local/www/interfaces.php:1435
+#: usr/local/www/interfaces.php:2136
+#: usr/local/www/system_gateways_edit.php:548
+#: usr/local/www/firewall_rules_edit.php:964
+#: usr/local/www/firewall_rules_edit.php:1146
+#: usr/local/www/firewall_rules_edit.php:1180
+#: usr/local/www/firewall_rules_edit.php:1196
+#: usr/local/www/firewall_rules_edit.php:1236
+#: usr/local/www/firewall_rules_edit.php:1298
+#: usr/local/www/firewall_rules_edit.php:1310
+#: usr/local/www/firewall_rules_edit.php:1353
+#: usr/local/www/firewall_rules_edit.php:1380
+#: usr/local/www/firewall_rules_edit.php:1435
+#: usr/local/www/firewall_rules_edit.php:1485
+#: usr/local/www/firewall_rules_edit.php:1540
+#: usr/local/www/firewall_nat_edit.php:544 usr/local/www/services_dhcp.php:978
+#: usr/local/www/services_dhcp.php:994 usr/local/www/services_dhcp.php:1008
+#: usr/local/www/services_dhcp.php:1020 usr/local/www/services_dhcp.php:1032
+#: usr/local/www/services_dhcp.php:1044 usr/local/www/services_dhcp.php:1067
+#: usr/local/www/services_dnsmasq.php:233
+#: usr/local/www/services_dnsmasq.php:236
+#: usr/local/www/services_dnsmasq.php:239 usr/local/www/interfaces.php:1479
+#: usr/local/www/interfaces.php:2182
+#: usr/local/www/system_gateways_edit.php:578
+#: usr/local/www/firewall_rules_edit.php:963
+#: usr/local/www/firewall_rules_edit.php:1145
+#: usr/local/www/firewall_rules_edit.php:1179
+#: usr/local/www/firewall_rules_edit.php:1195
+#: usr/local/www/firewall_rules_edit.php:1235
+#: usr/local/www/firewall_rules_edit.php:1275
+#: usr/local/www/firewall_rules_edit.php:1297
+#: usr/local/www/firewall_rules_edit.php:1309
+#: usr/local/www/firewall_rules_edit.php:1364
+#: usr/local/www/firewall_rules_edit.php:1391
+#: usr/local/www/firewall_rules_edit.php:1496
+#: usr/local/www/firewall_rules_edit.php:1551
+#: usr/local/www/firewall_nat_edit.php:545 usr/local/www/pkg_edit.php:1114
+#: usr/local/www/services_dnsmasq.php:297
+#: usr/local/www/services_dnsmasq.php:300
+#: usr/local/www/services_dnsmasq.php:303 usr/local/www/interfaces.php:1474
+#: usr/local/www/interfaces.php:2171
+#: usr/local/www/system_gateways_edit.php:578
+#: usr/local/www/vpn_openvpn_client.php:902
+#: usr/local/www/firewall_rules_edit.php:963
+#: usr/local/www/firewall_rules_edit.php:1145
+#: usr/local/www/firewall_rules_edit.php:1179
+#: usr/local/www/firewall_rules_edit.php:1195
+#: usr/local/www/firewall_rules_edit.php:1235
+#: usr/local/www/firewall_rules_edit.php:1275
+#: usr/local/www/firewall_rules_edit.php:1297
+#: usr/local/www/firewall_rules_edit.php:1309
+#: usr/local/www/firewall_rules_edit.php:1364
+#: usr/local/www/firewall_rules_edit.php:1391
+#: usr/local/www/firewall_rules_edit.php:1446
+#: usr/local/www/firewall_rules_edit.php:1496
+#: usr/local/www/firewall_rules_edit.php:1551
+#: usr/local/www/vpn_openvpn_csc.php:641
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/services_dhcp_edit.php:454
+#: usr/local/www/services_dhcp_edit.php:470
+#: usr/local/www/services_dhcp_edit.php:482
+#: usr/local/www/services_dhcp.php:978 usr/local/www/services_dhcp.php:994
+#: usr/local/www/services_dhcp.php:1008 usr/local/www/services_dhcp.php:1020
+#: usr/local/www/services_dhcp.php:1032 usr/local/www/services_dhcp.php:1044
+#: usr/local/www/services_dhcp.php:1067 usr/local/www/services_dhcpv6.php:692
+#: usr/local/www/services_dhcpv6.php:708 usr/local/www/services_dhcpv6.php:721
+#: usr/local/www/services_dhcpv6.php:734 usr/local/www/services_dhcpv6.php:746
+#: usr/local/www/services_dhcpv6.php:768 usr/local/www/pkg_edit.php:1114
+#: usr/local/www/fbegin.inc:100 usr/local/www/services_dnsmasq.php:297
+#: usr/local/www/services_dnsmasq.php:300
+#: usr/local/www/services_dnsmasq.php:303
+#: usr/local/www/vpn_openvpn_server.php:1648 usr/local/www/interfaces.php:1474
+#: usr/local/www/interfaces.php:2171
+msgid "Advanced"
+msgstr "高度な"
+
+#: usr/local/www/pkg_edit.php:1037 usr/local/www/firewall_rules_edit.php:1083
+#: usr/local/www/firewall_rules_edit.php:1117
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1175
+#: usr/local/www/firewall_rules_edit.php:1217
+#: usr/local/www/firewall_rules_edit.php:1241
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1291
+#: usr/local/www/firewall_rules_edit.php:1342
+#: usr/local/www/firewall_rules_edit.php:1392
+#: usr/local/www/firewall_rules_edit.php:1446
+#: usr/local/www/interfaces.php:1330 usr/local/www/services_dnsmasq.php:197
+#: usr/local/www/pkg_edit.php:1052 usr/local/www/firewall_rules_edit.php:1118
+#: usr/local/www/firewall_rules_edit.php:1152
+#: usr/local/www/firewall_rules_edit.php:1168
+#: usr/local/www/firewall_rules_edit.php:1210
+#: usr/local/www/firewall_rules_edit.php:1252
+#: usr/local/www/firewall_rules_edit.php:1276
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1331
+#: usr/local/www/firewall_rules_edit.php:1358
+#: usr/local/www/firewall_rules_edit.php:1413
+#: usr/local/www/firewall_rules_edit.php:1463
+#: usr/local/www/firewall_rules_edit.php:1517
+#: usr/local/www/interfaces.php:1434 usr/local/www/services_dnsmasq.php:198
+#: usr/local/www/pkg_edit.php:1063 usr/local/www/interfaces.php:1422
+#: usr/local/www/firewall_rules_edit.php:1167
+#: usr/local/www/firewall_rules_edit.php:1183
+#: usr/local/www/firewall_rules_edit.php:1225
+#: usr/local/www/firewall_rules_edit.php:1267
+#: usr/local/www/firewall_rules_edit.php:1303
+#: usr/local/www/firewall_rules_edit.php:1346
+#: usr/local/www/firewall_rules_edit.php:1373
+#: usr/local/www/firewall_rules_edit.php:1428
+#: usr/local/www/firewall_rules_edit.php:1478
+#: usr/local/www/firewall_rules_edit.php:1532 usr/local/www/pkg_edit.php:1107
+#: usr/local/www/services_dnsmasq.php:223 usr/local/www/interfaces.php:1435
+#: usr/local/www/firewall_rules_edit.php:1146
+#: usr/local/www/firewall_rules_edit.php:1180
+#: usr/local/www/firewall_rules_edit.php:1196
+#: usr/local/www/firewall_rules_edit.php:1236
+#: usr/local/www/firewall_rules_edit.php:1298
+#: usr/local/www/firewall_rules_edit.php:1310
+#: usr/local/www/firewall_rules_edit.php:1353
+#: usr/local/www/firewall_rules_edit.php:1380
+#: usr/local/www/firewall_rules_edit.php:1435
+#: usr/local/www/firewall_rules_edit.php:1485
+#: usr/local/www/firewall_rules_edit.php:1540
+#: usr/local/www/services_dnsmasq.php:236 usr/local/www/interfaces.php:1479
+#: usr/local/www/firewall_rules_edit.php:1145
+#: usr/local/www/firewall_rules_edit.php:1179
+#: usr/local/www/firewall_rules_edit.php:1195
+#: usr/local/www/firewall_rules_edit.php:1235
+#: usr/local/www/firewall_rules_edit.php:1275
+#: usr/local/www/firewall_rules_edit.php:1297
+#: usr/local/www/firewall_rules_edit.php:1309
+#: usr/local/www/firewall_rules_edit.php:1364
+#: usr/local/www/firewall_rules_edit.php:1391
+#: usr/local/www/firewall_rules_edit.php:1496
+#: usr/local/www/firewall_rules_edit.php:1551 usr/local/www/pkg_edit.php:1114
+#: usr/local/www/services_dnsmasq.php:300 usr/local/www/interfaces.php:1474
+#: usr/local/www/firewall_rules_edit.php:1145
+#: usr/local/www/firewall_rules_edit.php:1179
+#: usr/local/www/firewall_rules_edit.php:1195
+#: usr/local/www/firewall_rules_edit.php:1235
+#: usr/local/www/firewall_rules_edit.php:1275
+#: usr/local/www/firewall_rules_edit.php:1297
+#: usr/local/www/firewall_rules_edit.php:1309
+#: usr/local/www/firewall_rules_edit.php:1364
+#: usr/local/www/firewall_rules_edit.php:1391
+#: usr/local/www/firewall_rules_edit.php:1446
+#: usr/local/www/firewall_rules_edit.php:1496
+#: usr/local/www/firewall_rules_edit.php:1551 usr/local/www/pkg_edit.php:1114
+#: usr/local/www/services_dnsmasq.php:300 usr/local/www/interfaces.php:1474
+msgid "Show advanced option"
+msgstr "高度なオプションを表示する"
+
+#: usr/local/www/pkg_mgr_installed.php:45
+#: usr/local/www/pkg_mgr_installed.php:63 usr/local/www/diag_logs.php:65
+#: usr/local/www/diag_logs.php:77 usr/local/www/diag_logs_auth.php:65
+#: usr/local/www/diag_logs_dhcp.php:70 usr/local/www/diag_logs_filter.php:101
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/diag_logs_ipsec.php:102 usr/local/www/diag_logs_ntpd.php:65
+#: usr/local/www/diag_logs_openvpn.php:69
+#: usr/local/www/diag_logs_settings.php:210
+#: usr/local/www/diag_logs_vpn.php:126 usr/local/www/diag_backup.php:117
+#: usr/local/www/system.php:74 usr/local/www/system.php:231
+#: usr/local/www/system.php:251 usr/local/www/system_firmware.php:102
+#: usr/local/www/system_firmware.php:203
+#: usr/local/www/system_firmware_check.php:49
+#: usr/local/www/system_firmware_settings.php:74
+#: usr/local/www/system_routes.php:94 usr/local/www/system_routes_edit.php:165
+#: usr/local/www/diag_logs_filter_summary.php:184
+#: usr/local/www/diag_logs_ppp.php:70 usr/local/www/diag_logs_relayd.php:66
+#: usr/local/www/pkg_mgr.php:49 usr/local/www/pkg_mgr.php:81
+#: usr/local/www/pkg_mgr_install.php:57 usr/local/www/pkg_mgr_settings.php:62
+#: usr/local/www/fbegin.inc:319 usr/local/www/fbegin.inc:440
+#: usr/local/www/status_rrd_graph.php:329
+#: usr/local/www/status_rrd_graph_img.php:41
+#: usr/local/www/status_rrd_graph_settings.php:53
+#: usr/local/www/status_rrd_graph_settings.php:128
+#: usr/local/www/system_advanced_admin.php:242
+#: usr/local/www/system_advanced_firewall.php:178
+#: usr/local/www/system_advanced_misc.php:179
+#: usr/local/www/system_advanced_network.php:148
+#: usr/local/www/system_advanced_notifications.php:131
+#: usr/local/www/system_advanced_sysctl.php:125
+#: usr/local/www/system_authservers.php:44
+#: usr/local/www/system_camanager.php:50
+#: usr/local/www/system_certmanager.php:51
+#: usr/local/www/system_crlmanager.php:46
+#: usr/local/www/system_gateway_groups.php:88
+#: usr/local/www/system_gateway_groups_edit.php:142
+#: usr/local/www/system_gateways.php:120
+#: usr/local/www/system_gateways_edit.php:313
+#: usr/local/www/system_groupmanager.php:49
+#: usr/local/www/system_groupmanager_addprivs.php:56
+#: usr/local/www/system_usermanager.php:54
+#: usr/local/www/system_usermanager_passwordmg.php:43
+#: usr/local/www/system_usermanager_settings.php:51
+#: usr/local/www/diag_logs_wireless.php:67
+#: usr/local/www/diag_logs_routing.php:65
+#: usr/local/www/system_routes_edit.php:198 usr/local/www/pkg_mgr.php:55
+#: usr/local/www/pkg_mgr.php:93 usr/local/www/diag_logs_settings.php:215
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/fbegin.inc:337 usr/local/www/fbegin.inc:458
+#: usr/local/www/status_rrd_graph_settings.php:129
+#: usr/local/www/system_certmanager.php:56 usr/local/www/diag_backup.php:195
+#: usr/local/www/diag_logs_resolver.php:78
+#: usr/local/www/system_advanced_firewall.php:192
+#: usr/local/www/pkg_mgr_installed.php:51
+#: usr/local/www/pkg_mgr_installed.php:80
+#: usr/local/www/system_advanced_notifications.php:140
+#: usr/local/www/status_rrd_graph.php:377
+#: usr/local/www/system_advanced_misc.php:199
+#: usr/local/www/system_gateways_edit.php:319
+#: usr/local/www/system_hasync.php:96 usr/local/www/diag_logs_gateways.php:78
+#: usr/local/www/diag_logs_filter_dynamic.php:98 usr/local/www/system.php:75
+#: usr/local/www/system.php:242 usr/local/www/system.php:262
+#: usr/local/www/diag_logs_routing.php:66
+#: usr/local/www/diag_logs_settings.php:222
+#: usr/local/www/system_gateway_groups_edit.php:146
+#: usr/local/www/fbegin.inc:283 usr/local/www/fbegin.inc:428
+#: usr/local/www/diag_logs_relayd.php:67 usr/local/www/diag_logs_auth.php:66
+#: usr/local/www/diag_logs_ipsec.php:103
+#: usr/local/www/diag_logs_resolver.php:79 usr/local/www/diag_logs_ntpd.php:66
+#: usr/local/www/system_advanced_misc.php:218
+#: usr/local/www/diag_logs_dhcp.php:71
+#: usr/local/www/system_gateway_groups.php:89
+#: usr/local/www/system_gateways_edit.php:425
+#: usr/local/www/diag_logs_wireless.php:68
+#: usr/local/www/system_firmware.php:109 usr/local/www/system_firmware.php:210
+#: usr/local/www/diag_logs_filter_summary.php:185
+#: usr/local/www/system_firmware_settings.php:79
+#: usr/local/www/diag_logs_gateways.php:79
+#: usr/local/www/diag_logs_openvpn.php:70
+#: usr/local/www/diag_logs_filter_dynamic.php:99 usr/local/www/system.php:235
+#: usr/local/www/system.php:255 usr/local/www/diag_logs_filter.php:91
+#: usr/local/www/system_firmware.php:108 usr/local/www/system_camanager.php:51
+#: usr/local/www/status_rrd_graph_img.php:43
+#: usr/local/www/status_rrd_graph.php:402
+#: usr/local/www/diag_logs_filter_dynamic.php:97
+#: usr/local/www/system_routes.php:98 usr/local/www/system_hasync.php:97
+#: usr/local/www/system_certmanager.php:57
+#: usr/local/www/system_advanced_misc.php:222
+#: usr/local/www/diag_logs_ppp.php:68
+#: usr/local/www/system_advanced_firewall.php:221
+#: usr/local/www/pkg_mgr_install.php:55 usr/local/www/fbegin.inc:275
+#: usr/local/www/fbegin.inc:420 usr/local/www/diag_logs_filter.php:121
+#: usr/local/www/system_advanced_misc.php:254 usr/local/www/pkg_mgr.php:94
+#: usr/local/www/system_routes_edit.php:227
+#: usr/local/www/system_gateway_groups_edit.php:150
+#: usr/local/www/system_gateway_groups.php:98
+#: usr/local/www/system_gateways_edit.php:455
+#: usr/local/www/system_routes.php:113
+#: usr/local/www/system_routes_edit.php:229
+#: usr/local/www/system_firmware.php:108 usr/local/www/system_firmware.php:210
+#: usr/local/www/system_gateways_edit.php:455
+#: usr/local/www/system_camanager.php:51 usr/local/www/diag_logs_auth.php:66
+#: usr/local/www/system_groupmanager.php:49
+#: usr/local/www/diag_logs_settings.php:222
+#: usr/local/www/system_firmware_check.php:49
+#: usr/local/www/diag_logs_filter.php:121
+#: usr/local/www/status_rrd_graph_img.php:43
+#: usr/local/www/system_firmware_settings.php:79
+#: usr/local/www/diag_logs_routing.php:66 usr/local/www/system.php:75
+#: usr/local/www/system.php:235 usr/local/www/system.php:255
+#: usr/local/www/diag_logs_dhcp.php:71 usr/local/www/status_rrd_graph.php:402
+#: usr/local/www/pkg_mgr_installed.php:51
+#: usr/local/www/pkg_mgr_installed.php:80
+#: usr/local/www/status_rrd_graph_settings.php:53
+#: usr/local/www/status_rrd_graph_settings.php:129
+#: usr/local/www/diag_logs.php:77
+#: usr/local/www/diag_logs_filter_dynamic.php:97
+#: usr/local/www/system_routes.php:113 usr/local/www/diag_logs_ntpd.php:66
+#: usr/local/www/system_hasync.php:97 usr/local/www/system_certmanager.php:57
+#: usr/local/www/diag_logs_openvpn.php:70
+#: usr/local/www/system_advanced_admin.php:242
+#: usr/local/www/system_advanced_misc.php:254 usr/local/www/pkg_mgr.php:57
+#: usr/local/www/pkg_mgr.php:104 usr/local/www/diag_logs_ppp.php:68
+#: usr/local/www/system_routes_edit.php:223
+#: usr/local/www/system_crlmanager.php:46
+#: usr/local/www/system_usermanager_passwordmg.php:43
+#: usr/local/www/diag_logs_gateways.php:79
+#: usr/local/www/system_gateway_groups_edit.php:150
+#: usr/local/www/system_authservers.php:44
+#: usr/local/www/system_advanced_firewall.php:221
+#: usr/local/www/system_groupmanager_addprivs.php:56
+#: usr/local/www/diag_backup.php:195 usr/local/www/pkg_mgr_settings.php:62
+#: usr/local/www/system_usermanager_settings.php:51
+#: usr/local/www/pkg_mgr_install.php:55 usr/local/www/fbegin.inc:275
+#: usr/local/www/fbegin.inc:420 usr/local/www/diag_logs_relayd.php:67
+#: usr/local/www/diag_logs_vpn.php:126
+#: usr/local/www/system_advanced_notifications.php:140
+#: usr/local/www/diag_logs_ipsec.php:103
+#: usr/local/www/system_usermanager.php:54
+#: usr/local/www/system_gateways.php:120
+#: usr/local/www/system_advanced_network.php:148
+#: usr/local/www/diag_logs_wireless.php:68
+#: usr/local/www/system_gateway_groups.php:98
+#: usr/local/www/diag_logs_resolver.php:79
+#: usr/local/www/system_advanced_sysctl.php:125
+#: usr/local/www/diag_logs_filter_summary.php:185
+msgid "System"
+msgstr "システム"
+
+#: usr/local/www/pkg_mgr_installed.php:45
+#: usr/local/www/pkg_mgr_installed.php:63 usr/local/www/diag_backup.php:113
+#: usr/local/www/pkg_mgr.php:49 usr/local/www/pkg_mgr.php:81
+#: usr/local/www/pkg_mgr_install.php:57 usr/local/www/fbegin.inc:440
+#: usr/local/www/pkg_mgr.php:55 usr/local/www/pkg_mgr.php:93
+#: usr/local/www/fbegin.inc:458 usr/local/www/diag_backup.php:190
+#: usr/local/www/pkg_mgr_installed.php:51
+#: usr/local/www/pkg_mgr_installed.php:80 usr/local/www/fbegin.inc:428
+#: usr/local/www/pkg_mgr_install.php:55 usr/local/www/fbegin.inc:420
+#: usr/local/www/pkg_mgr.php:94 usr/local/www/pkg_mgr_installed.php:51
+#: usr/local/www/pkg_mgr_installed.php:80 usr/local/www/pkg_mgr.php:57
+#: usr/local/www/pkg_mgr.php:104 usr/local/www/diag_backup.php:190
+#: usr/local/www/pkg_mgr_install.php:55 usr/local/www/fbegin.inc:420
+msgid "Package Manager"
+msgstr "パッケージマネージャー"
+
+#: usr/local/www/pkg_mgr_installed.php:76 usr/local/www/pkg_mgr.php:99
+#: usr/local/www/pkg_mgr.php:115 usr/local/www/pkg_mgr_installed.php:97
+#: usr/local/www/pkg_mgr_installed.php:99 usr/local/www/pkg_mgr.php:118
+#: usr/local/www/pkg_mgr_installed.php:99 usr/local/www/pkg_mgr.php:127
+msgid "Available Packages"
+msgstr "利用可能なパッケージ"
+
+#: usr/local/www/pkg_mgr_installed.php:80 usr/local/www/pkg_mgr.php:103
+#: usr/local/www/pkg_mgr_settings.php:93 usr/local/www/pkg_mgr.php:119
+#: usr/local/www/pkg_mgr_installed.php:101
+#: usr/local/www/pkg_mgr_installed.php:103 usr/local/www/pkg_mgr.php:122
+#: usr/local/www/pkg_mgr_settings.php:92
+#: usr/local/www/pkg_mgr_installed.php:103 usr/local/www/pkg_mgr.php:128
+#: usr/local/www/pkg_mgr_settings.php:92
+msgid "Installed Packages"
+msgstr "インストール済みパッケージ"
+
+#: usr/local/www/pkg_mgr_installed.php:90 usr/local/www/pkg_mgr.php:113
+msgid "Package Name"
+msgstr "パッケージ名"
+
+#: usr/local/www/pkg_mgr_installed.php:91 usr/local/www/pkg_mgr.php:114
+#: usr/local/www/pkg_mgr.php:130 usr/local/www/pkg_mgr_installed.php:112
+#: usr/local/www/pkg_mgr_installed.php:114 usr/local/www/pkg_mgr.php:133
+#: usr/local/www/pkg_mgr_installed.php:114 usr/local/www/pkg_mgr.php:180
+msgid "Category"
+msgstr "カテゴリ"
+
+#: usr/local/www/pkg_mgr_installed.php:92
+#: usr/local/www/pkg_mgr_installed.php:150 usr/local/www/pkg_mgr.php:117
+#: usr/local/www/pkg_mgr.php:200
+msgid "Package Info"
+msgstr "パッケージ情報"
+
+#: usr/local/www/pkg_mgr_installed.php:93
+msgid "Package Version"
+msgstr "パッケージバージョン"
+
+#: usr/local/www/pkg_mgr_installed.php:116
+#: usr/local/www/pkg_mgr_installed.php:122
+#: usr/local/www/pkg_mgr_installed.php:142
+#: usr/local/www/pkg_mgr_installed.php:144
+#: usr/local/www/pkg_mgr_installed.php:151
+#: usr/local/www/pkg_mgr_installed.php:153
+#: usr/local/www/pkg_mgr_installed.php:146
+#: usr/local/www/pkg_mgr_installed.php:155
+#: usr/local/www/pkg_mgr_installed.php:144
+#: usr/local/www/pkg_mgr_installed.php:146
+#: usr/local/www/pkg_mgr_installed.php:153
+#: usr/local/www/pkg_mgr_installed.php:155
+msgid "Available"
+msgstr "利用できる"
+
+#: usr/local/www/pkg_mgr_installed.php:117
+#: usr/local/www/pkg_mgr_installed.php:123
+#: usr/local/www/pkg_mgr_installed.php:145
+#: usr/local/www/pkg_mgr_installed.php:154
+#: usr/local/www/pkg_mgr_installed.php:147
+#: usr/local/www/pkg_mgr_installed.php:156
+#: usr/local/www/pkg_mgr_installed.php:147
+#: usr/local/www/pkg_mgr_installed.php:156
+msgid "Installed"
+msgstr "インストールされて"
+
+#: usr/local/www/pkg_mgr_installed.php:152 usr/local/www/pkg_mgr.php:202
+msgid "No info, check the"
+msgstr "情報無、チェックしない"
+
+#: usr/local/www/pkg_mgr_installed.php:152 usr/local/www/pkg_mgr.php:202
+msgid "forum"
+msgstr "フォーラム"
+
+#: usr/local/www/pkg_mgr_installed.php:163
+msgid "Do you really want to remove this package?"
+msgstr "あなたは本当にこのパッケージを削除しますか?"
+
+#: usr/local/www/pkg_mgr_installed.php:164
+msgid "Remove this package."
+msgstr "このパッケージを削除します。"
+
+#: usr/local/www/pkg_mgr_installed.php:168
+msgid "Reinstall this package."
+msgstr "このパッケージを再インストールしてください。"
+
+#: usr/local/www/pkg_mgr_installed.php:171
+msgid "Reinstall this package's GUI components."
+msgstr "このパッケージのGUIコンポーネントを再インストールします。"
+
+#: usr/local/www/pkg_mgr_installed.php:181
+#: usr/local/www/pkg_mgr_installed.php:222
+#: usr/local/www/pkg_mgr_installed.php:225
+#: usr/local/www/pkg_mgr_installed.php:227
+#: usr/local/www/pkg_mgr_installed.php:227
+msgid "There are no packages currently installed."
+msgstr "現在インストールされないパッケージがありません。"
+
+#: usr/local/www/easyrule.php:34 usr/local/www/easyrule.php:34
+msgid "Status : EasyRule"
+msgstr "ステータス: EasyRule"
+
+#: usr/local/www/easyrule.php:69 usr/local/www/easyrule.php:69
+msgid "Message"
+msgstr "メッセージ"
+
+#: usr/local/www/easyrule.php:72 usr/local/www/easyrule.php:72
+msgid ""
+"This is the Easy Rule status page, mainly used to display errors when adding "
+"rules. If you are seeing this, there apparently was not an error, and you "
+"navigated to the page directly without telling it what to do"
+msgstr "ルールを"これは主に追加するときにエラーを表示するために使用される、簡単なルールのステータスページ」です。あなたはこれを見ている場合は、明らかに誤りがなかったし、あなたが「何を行うには、それを伝えることなく、直接ページに移動"
+
+#: usr/local/www/easyrule.php:75 usr/local/www/easyrule.php:75
+msgid ""
+"This page is meant to be called from the block/pass buttons on the Firewall "
+"Logs page"
+msgstr "このページは、ファイアウォールのログページ上のブロック/パスボタンから呼び出されることを意図して"
+
+#: usr/local/www/easyrule.php:75 usr/local/www/diag_logs.php:65
+#: usr/local/www/diag_logs_auth.php:54 usr/local/www/diag_logs_dhcp.php:59
+#: usr/local/www/diag_logs_filter.php:90
+#: usr/local/www/diag_logs_filter_dynamic.php:61
+#: usr/local/www/diag_logs_ipsec.php:91 usr/local/www/diag_logs_ntpd.php:54
+#: usr/local/www/diag_logs_openvpn.php:45
+#: usr/local/www/diag_logs_settings.php:132 usr/local/www/diag_logs_vpn.php:44
+#: usr/local/www/status_wireless.php:41 usr/local/www/status_wireless.php:77
+#: usr/local/www/diag_logs_filter_summary.php:34
+#: usr/local/www/diag_logs_ppp.php:59 usr/local/www/diag_logs_relayd.php:55
+#: usr/local/www/pkg_mgr.php:116 usr/local/www/diag_ipsec.php:48
+#: usr/local/www/diag_ipsec.php:96 usr/local/www/diag_ipsec_sad.php:49
+#: usr/local/www/diag_ipsec_spd.php:49 usr/local/www/diag_pkglogs.php:81
+#: usr/local/www/status_filter_reload.php:44 usr/local/www/status_graph.php:85
+#: usr/local/www/carp_status.php:100 usr/local/www/carp_status.php:140
+#: usr/local/www/status_interfaces.php:58
+#: usr/local/www/status_interfaces.php:85 usr/local/www/fbegin.inc:359
+#: usr/local/www/status_queues.php:98 usr/local/www/status_rrd_graph.php:224
+#: usr/local/www/status_rrd_graph_settings.php:113
+#: usr/local/www/status_services.php:226 usr/local/www/status_services.php:246
+#: usr/local/www/status_upnp.php:58
+#: usr/local/www/status_captiveportal_test.php:58
+#: usr/local/www/status_captiveportal_voucher_rolls.php:57
+#: usr/local/www/status_captiveportal_vouchers.php:57
+#: usr/local/www/status_dhcp_leases.php:48
+#: usr/local/www/status_gateway_groups.php:52
+#: usr/local/www/status_gateways.php:51 usr/local/www/status_gateways.php:77
+#: usr/local/www/status_graph_cpu.php:41 usr/local/www/status_lb_pool.php:62
+#: usr/local/www/status_lb_vs.php:56 usr/local/www/status_lb_vs.php:80
+#: usr/local/www/status_openvpn.php:46 usr/local/www/status_openvpn.php:212
+#: usr/local/www/status_openvpn.php:263
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:43
+#: usr/local/www/status_dhcpv6_leases.php:49
+#: usr/local/www/diag_logs_wireless.php:56
+#: usr/local/www/diag_logs_routing.php:54 usr/local/www/pkg_mgr.php:131
+#: usr/local/www/diag_logs_settings.php:136 usr/local/www/fbegin.inc:377
+#: usr/local/www/status_rrd_graph_settings.php:114
+#: usr/local/www/status_queues.php:101 usr/local/www/diag_ipsec.php:107
+#: usr/local/www/diag_logs_resolver.php:66
+#: usr/local/www/status_rrd_graph.php:244 usr/local/www/status_ntpd.php:94
+#: usr/local/www/status_ntpd.php:107 usr/local/www/status_dhcpv6_leases.php:50
+#: usr/local/www/status_dhcp_leases.php:49
+#: usr/local/www/diag_logs_gateways.php:66
+#: usr/local/www/status_openvpn.php:215 usr/local/www/status_openvpn.php:266
+#: usr/local/www/diag_logs_settings.php:143 usr/local/www/fbegin.inc:323
+#: usr/local/www/status_interfaces.php:60
+#: usr/local/www/status_interfaces.php:88 usr/local/www/carp_status.php:92
+#: usr/local/www/carp_status.php:133 usr/local/www/status_graph.php:90
+#: usr/local/www/diag_ipsec.php:108 usr/local/www/status_wireless.php:78
+#: usr/local/www/status_ntpd.php:109 usr/local/www/status_ntpd.php:123
+#: usr/local/www/status_services.php:222 usr/local/www/status_services.php:242
+#: usr/local/www/status_gateways.php:78 usr/local/www/diag_logs_filter.php:79
+#: usr/local/www/status_services.php:220 usr/local/www/status_services.php:240
+#: usr/local/www/status_openvpn.php:314
+#: usr/local/www/status_captiveportal_expire.php:58
+#: usr/local/www/status_graph.php:101 usr/local/www/diag_ipsec.php:110
+#: usr/local/www/status_rrd_graph.php:248 usr/local/www/diag_logs_ppp.php:57
+#: usr/local/www/status_queues.php:109 usr/local/www/fbegin.inc:315
+#: usr/local/www/status_services.php:63 usr/local/www/status_services.php:81
+#: usr/local/www/status_openvpn.php:273 usr/local/www/status_openvpn.php:334
+#: usr/local/www/diag_logs_filter.php:109 usr/local/www/status_graph.php:111
+#: usr/local/www/pkg_mgr.php:134 usr/local/www/status_ntpd.php:115
+#: usr/local/www/status_ntpd.php:129 usr/local/www/status_services.php:63
+#: usr/local/www/status_services.php:81
+#: usr/local/www/status_dhcpv6_leases.php:50
+#: usr/local/www/status_wireless.php:41 usr/local/www/status_wireless.php:78
+#: usr/local/www/diag_logs_auth.php:54
+#: usr/local/www/diag_logs_settings.php:143
+#: usr/local/www/status_openvpn.php:46 usr/local/www/status_openvpn.php:273
+#: usr/local/www/status_openvpn.php:334 usr/local/www/diag_logs_filter.php:109
+#: usr/local/www/status_captiveportal_expire.php:58
+#: usr/local/www/status_graph_cpu.php:41
+#: usr/local/www/diag_logs_routing.php:54 usr/local/www/status_graph.php:111
+#: usr/local/www/diag_logs_dhcp.php:59
+#: usr/local/www/status_filter_reload.php:44 usr/local/www/diag_ipsec.php:48
+#: usr/local/www/diag_ipsec.php:110 usr/local/www/status_rrd_graph.php:248
+#: usr/local/www/status_rrd_graph_settings.php:114
+#: usr/local/www/diag_logs.php:65
+#: usr/local/www/diag_logs_filter_dynamic.php:61
+#: usr/local/www/diag_logs_ntpd.php:54 usr/local/www/status_interfaces.php:60
+#: usr/local/www/status_interfaces.php:88 usr/local/www/diag_ipsec_spd.php:49
+#: usr/local/www/diag_logs_openvpn.php:45 usr/local/www/status_lb_pool.php:62
+#: usr/local/www/pkg_mgr.php:182 usr/local/www/diag_logs_ppp.php:57
+#: usr/local/www/status_captiveportal_vouchers.php:57
+#: usr/local/www/diag_pkglogs.php:81 usr/local/www/status_ntpd.php:115
+#: usr/local/www/status_ntpd.php:129 usr/local/www/diag_logs_gateways.php:66
+#: usr/local/www/status_captiveportal_test.php:58
+#: usr/local/www/status_dhcp_leases.php:49 usr/local/www/status_queues.php:109
+#: usr/local/www/status_gateway_groups.php:52 usr/local/www/fbegin.inc:315
+#: usr/local/www/diag_logs_relayd.php:55 usr/local/www/diag_logs_vpn.php:44
+#: usr/local/www/diag_logs_ipsec.php:91
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:43
+#: usr/local/www/status_captiveportal_voucher_rolls.php:57
+#: usr/local/www/status_lb_vs.php:56 usr/local/www/status_lb_vs.php:80
+#: usr/local/www/diag_ipsec_sad.php:49 usr/local/www/status_gateways.php:51
+#: usr/local/www/status_gateways.php:78
+#: usr/local/www/diag_logs_wireless.php:56 usr/local/www/status_upnp.php:58
+#: usr/local/www/easyrule.php:75 usr/local/www/diag_logs_resolver.php:66
+#: usr/local/www/diag_logs_filter_summary.php:34
+#: usr/local/www/carp_status.php:92 usr/local/www/carp_status.php:133
+msgid "Status"
+msgstr "ステータス"
+
+#: usr/local/www/easyrule.php:75 usr/local/www/easyrule.php:75
+msgid "System Logs, Firewall Tab"
+msgstr "システムログ、ファイアウォールタブ"
+
+#: usr/local/www/firewall_aliases_import.php:48
+#: usr/local/www/firewall_shaper_layer7.php:59
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_wizards.php:73
+#: usr/local/www/firewall_virtual_ip_edit.php:281
+#: usr/local/www/diag_logs.php:78 usr/local/www/diag_logs_auth.php:66
+#: usr/local/www/diag_logs_dhcp.php:71 usr/local/www/diag_logs_filter.php:90
+#: usr/local/www/diag_logs_filter.php:102
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_ipsec.php:103 usr/local/www/diag_logs_ntpd.php:66
+#: usr/local/www/diag_logs_openvpn.php:70
+#: usr/local/www/diag_logs_settings.php:211
+#: usr/local/www/diag_logs_vpn.php:127 usr/local/www/firewall_aliases.php:150
+#: usr/local/www/firewall_aliases_edit.php:56
+#: usr/local/www/firewall_nat_1to1.php:78
+#: usr/local/www/firewall_nat_1to1_edit.php:216
+#: usr/local/www/firewall_nat_edit.php:438
+#: usr/local/www/firewall_nat_out.php:283
+#: usr/local/www/firewall_nat_out_edit.php:300
+#: usr/local/www/firewall_rules.php:52
+#: usr/local/www/firewall_rules_edit.php:628
+#: usr/local/www/firewall_schedule.php:50
+#: usr/local/www/firewall_schedule_edit.php:61
+#: usr/local/www/firewall_shaper.php:54
+#: usr/local/www/firewall_virtual_ip.php:149
+#: usr/local/www/diag_logs_filter_summary.php:185
+#: usr/local/www/diag_logs_ppp.php:71 usr/local/www/diag_logs_relayd.php:67
+#: usr/local/www/firewall_nat.php:160 usr/local/www/fbegin.inc:335
+#: usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/firewall_nat_npt.php:78
+#: usr/local/www/firewall_nat_npt_edit.php:140
+#: usr/local/www/diag_logs_wireless.php:68
+#: usr/local/www/diag_logs_routing.php:66
+#: usr/local/www/diag_logs_settings.php:216 usr/local/www/fbegin.inc:353
+#: usr/local/www/firewall_nat_out.php:293
+#: usr/local/www/firewall_nat_1to1_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:145
+#: usr/local/www/firewall_nat_out_edit.php:313
+#: usr/local/www/firewall_rules_edit.php:660
+#: usr/local/www/diag_logs_resolver.php:79
+#: usr/local/www/firewall_aliases.php:153
+#: usr/local/www/diag_logs_gateways.php:79
+#: usr/local/www/firewall_nat_edit.php:445
+#: usr/local/www/firewall_virtual_ip_edit.php:268
+#: usr/local/www/diag_logs_filter_dynamic.php:99
+#: usr/local/www/diag_logs_routing.php:67
+#: usr/local/www/diag_logs_settings.php:223 usr/local/www/fbegin.inc:299
+#: usr/local/www/diag_logs_relayd.php:68
+#: usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+#: usr/local/www/firewall_nat_npt_edit.php:144
+#: usr/local/www/firewall_nat.php:165 usr/local/www/diag_logs_auth.php:67
+#: usr/local/www/firewall_rules_edit.php:661
+#: usr/local/www/diag_logs_ipsec.php:104
+#: usr/local/www/diag_logs_resolver.php:80 usr/local/www/diag_logs_ntpd.php:67
+#: usr/local/www/firewall_rules.php:49 usr/local/www/diag_logs_dhcp.php:72
+#: usr/local/www/diag_logs_wireless.php:69
+#: usr/local/www/diag_logs_filter_summary.php:186
+#: usr/local/www/firewall_aliases.php:155
+#: usr/local/www/diag_logs_gateways.php:80
+#: usr/local/www/firewall_nat_edit.php:444
+#: usr/local/www/diag_logs_openvpn.php:71
+#: usr/local/www/firewall_virtual_ip_edit.php:261
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/firewall_virtual_ip.php:152
+#: usr/local/www/diag_logs_filter.php:79 usr/local/www/diag_logs_filter.php:92
+#: usr/local/www/firewall_rules_edit.php:664
+#: usr/local/www/firewall_virtual_ip.php:166
+#: usr/local/www/firewall_nat_edit.php:439
+#: usr/local/www/firewall_virtual_ip_edit.php:253
+#: usr/local/www/diag_logs_filter_dynamic.php:98
+#: usr/local/www/diag_logs_ppp.php:69 usr/local/www/fbegin.inc:291
+#: usr/local/www/firewall_nat_out_edit.php:317
+#: usr/local/www/firewall_rules_edit.php:676
+#: usr/local/www/diag_logs_filter.php:109
+#: usr/local/www/diag_logs_filter.php:122
+#: usr/local/www/firewall_nat_edit.php:451
+#: usr/local/www/firewall_aliases.php:154
+#: usr/local/www/firewall_virtual_ip_edit.php:273
+#: usr/local/www/firewall_nat_out.php:301
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/firewall_virtual_ip.php:189
+#: usr/local/www/firewall_nat_edit.php:452 usr/local/www/firewall_nat.php:166
+#: usr/local/www/firewall_shaper_layer7.php:59
+#: usr/local/www/firewall_shaper.php:54 usr/local/www/diag_logs_auth.php:67
+#: usr/local/www/diag_logs_settings.php:223
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_schedule.php:50
+#: usr/local/www/firewall_rules_edit.php:676
+#: usr/local/www/diag_logs_filter.php:109
+#: usr/local/www/diag_logs_filter.php:122
+#: usr/local/www/firewall_virtual_ip.php:189
+#: usr/local/www/diag_logs_routing.php:67
+#: usr/local/www/firewall_schedule_edit.php:61
+#: usr/local/www/firewall_nat_edit.php:452
+#: usr/local/www/firewall_aliases.php:154 usr/local/www/diag_logs_dhcp.php:72
+#: usr/local/www/firewall_virtual_ip_edit.php:273
+#: usr/local/www/firewall_shaper_wizards.php:73 usr/local/www/diag_logs.php:78
+#: usr/local/www/diag_logs_filter_dynamic.php:98
+#: usr/local/www/firewall_aliases_import.php:48
+#: usr/local/www/diag_logs_ntpd.php:67 usr/local/www/firewall_nat.php:166
+#: usr/local/www/diag_logs_openvpn.php:71 usr/local/www/diag_logs_ppp.php:69
+#: usr/local/www/firewall_nat_out.php:301 usr/local/www/firewall_rules.php:49
+#: usr/local/www/firewall_nat_npt.php:78
+#: usr/local/www/firewall_nat_1to1.php:78
+#: usr/local/www/firewall_nat_npt_edit.php:144
+#: usr/local/www/diag_logs_gateways.php:80
+#: usr/local/www/firewall_aliases_edit.php:56
+#: usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/firewall_nat_1to1_edit.php:221 usr/local/www/fbegin.inc:291
+#: usr/local/www/diag_logs_relayd.php:68 usr/local/www/diag_logs_vpn.php:127
+#: usr/local/www/diag_logs_ipsec.php:104
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/diag_logs_wireless.php:69
+#: usr/local/www/diag_logs_resolver.php:80
+#: usr/local/www/diag_logs_filter_summary.php:186
+msgid "Firewall"
+msgstr "ファイアウォール"
+
+#: usr/local/www/firewall_aliases_import.php:48
+#: usr/local/www/firewall_aliases_import.php:59
+#: usr/local/www/firewall_aliases.php:150
+#: usr/local/www/firewall_aliases_edit.php:56
+#: usr/local/www/diag_backup.php:103 usr/local/www/fbegin.inc:110
+#: usr/local/www/fbegin.inc:127 usr/local/www/services_dnsmasq_edit.php:225
+#: usr/local/www/diag_backup.php:180 usr/local/www/firewall_aliases.php:153
+#: usr/local/www/fbegin.inc:136 usr/local/www/services_dnsmasq_edit.php:226
+#: usr/local/www/firewall_aliases.php:155 usr/local/www/fbegin.inc:128
+#: usr/local/www/firewall_aliases.php:154
+#: usr/local/www/firewall_aliases.php:154
+#: usr/local/www/firewall_aliases_import.php:48
+#: usr/local/www/firewall_aliases_import.php:59
+#: usr/local/www/firewall_aliases_edit.php:56
+#: usr/local/www/diag_backup.php:180
+#: usr/local/www/services_dnsmasq_edit.php:226 usr/local/www/fbegin.inc:128
+msgid "Aliases"
+msgstr "エイリアス"
+
+#: usr/local/www/firewall_aliases_import.php:48
+#: usr/local/www/firewall_aliases_import.php:48
+msgid "Bulk import"
+msgstr "一括インポート"
+
+#: usr/local/www/firewall_aliases_import.php:64
+#: usr/local/www/firewall_aliases_import.php:64
+msgid "The alias name may only consist of the characters"
+msgstr "エイリアス名は、文字だけで構成することができる"
+
+#: usr/local/www/firewall_aliases_import.php:68
+#: usr/local/www/firewall_aliases_edit.php:151
+#: usr/local/www/firewall_aliases_edit.php:145
+#: usr/local/www/firewall_aliases_import.php:68
+#: usr/local/www/firewall_aliases_edit.php:145
+msgid "An alias with this name already exists."
+msgstr "この名前の別名がすでに存在しています。"
+
+#: usr/local/www/firewall_aliases_import.php:74
+#: usr/local/www/firewall_aliases_edit.php:160
+#: usr/local/www/firewall_aliases_edit.php:154
+#: usr/local/www/firewall_aliases_import.php:74
+#: usr/local/www/firewall_aliases_edit.php:154
+#, php-format
+msgid "Cannot use a reserved keyword as alias name %s"
+msgstr "別名%sとして予約キーワードを使用することはできません"
+
+#: usr/local/www/firewall_aliases_import.php:79
+#: usr/local/www/firewall_aliases_edit.php:165
+#: usr/local/www/firewall_aliases_edit.php:159
+#: usr/local/www/firewall_aliases_import.php:79
+#: usr/local/www/firewall_aliases_edit.php:159
+msgid "An interface description with this name already exists."
+msgstr "この名前のインターフェイスの説明は、すでに存在しています。"
+
+#: usr/local/www/firewall_aliases_import.php:94
+#: usr/local/www/firewall_aliases_import.php:94
+#, php-format
+msgid "%s is not an IP address. Please correct the error to continue"
+msgstr "%sは、IPアドレスではありません。継続して、エラーを修正してください"
+
+#: usr/local/www/firewall_aliases_import.php:131
+#: usr/local/www/firewall_aliases_import.php:131
+msgid "Alias Import"
+msgstr "エイリアスのインポート"
+
+#: usr/local/www/firewall_aliases_import.php:134
+#: usr/local/www/firewall_aliases_import.php:134
+msgid "Alias Name"
+msgstr "別名"
+
+#: usr/local/www/firewall_aliases_import.php:137
+#: usr/local/www/firewall_aliases_edit.php:585
+#: usr/local/www/firewall_aliases_import.php:137
+msgid ""
+"The name of the alias may only consist of the characters "a-z, A-Z and "
+"0-9"."
+msgstr "AZ 、 AZと "0-9 ""エイリアスの名前が文字のみで構成することができる」 。"
+
+#: usr/local/www/firewall_aliases_import.php:142
+#: usr/local/www/interfaces_lagg_edit.php:211
+#: usr/local/www/services_captiveportal_ip_edit.php:211
+#: usr/local/www/services_captiveportal_mac_edit.php:185
+#: usr/local/www/services_captiveportal_hostname_edit.php:186
+#: usr/local/www/system_gateways_edit.php:487
+#: usr/local/www/vpn_ipsec_phase1.php:580
+#: usr/local/www/vpn_ipsec_phase2.php:502
+#: usr/local/www/vpn_openvpn_client.php:577
+#: usr/local/www/vpn_openvpn_csc.php:346
+#: usr/local/www/vpn_openvpn_server.php:726
+#: usr/local/www/services_captiveportal_zones_edit.php:109
+#: usr/local/www/system_gateways_edit.php:522
+#: usr/local/www/vpn_openvpn_server.php:799
+#: usr/local/www/vpn_ipsec_phase2.php:528
+#: usr/local/www/vpn_openvpn_client.php:582
+#: usr/local/www/vpn_ipsec_phase1.php:593
+#: usr/local/www/services_captiveportal_hostname_edit.php:184
+#: usr/local/www/services_captiveportal_mac_edit.php:183
+#: usr/local/www/interfaces_lagg_edit.php:212
+#: usr/local/www/vpn_openvpn_csc.php:345
+#: usr/local/www/system_gateways_edit.php:622
+#: usr/local/www/services_captiveportal_ip_edit.php:209
+#: usr/local/www/vpn_openvpn_server.php:827
+#: usr/local/www/services_captiveportal_zones_edit.php:111
+#: usr/local/www/vpn_ipsec_phase2.php:630
+#: usr/local/www/vpn_openvpn_client.php:600
+#: usr/local/www/vpn_ipsec_phase1.php:592
+#: usr/local/www/system_gateways_edit.php:626
+#: usr/local/www/services_captiveportal_ip_edit.php:203
+#: usr/local/www/vpn_openvpn_client.php:619
+#: usr/local/www/interfaces_lagg_edit.php:225
+#: usr/local/www/services_captiveportal_mac_edit.php:196
+#: usr/local/www/vpn_ipsec_phase1.php:613
+#: usr/local/www/vpn_openvpn_server.php:854
+#: usr/local/www/vpn_ipsec_phase2.php:651
+#: usr/local/www/system_gateways_edit.php:628
+#: usr/local/www/system_gateways_edit.php:658
+#: usr/local/www/interfaces_lagg_edit.php:224
+#: usr/local/www/system_gateways_edit.php:659
+#: usr/local/www/services_captiveportal_ip_edit.php:203
+#: usr/local/www/services_captiveportal_zones_edit.php:109
+#: usr/local/www/vpn_openvpn_client.php:619
+#: usr/local/www/vpn_openvpn_csc.php:345
+#: usr/local/www/interfaces_lagg_edit.php:224
+#: usr/local/www/services_captiveportal_hostname_edit.php:186
+#: usr/local/www/firewall_aliases_import.php:142
+#: usr/local/www/services_captiveportal_mac_edit.php:196
+#: usr/local/www/vpn_ipsec_phase1.php:613
+#: usr/local/www/vpn_openvpn_server.php:854
+#: usr/local/www/vpn_ipsec_phase2.php:651
+msgid "You may enter a description here for your reference (not parsed)"
+msgstr "ここに参照用の説明文を入力することもできます(構文解析されません)"
+
+#: usr/local/www/firewall_aliases_import.php:146
+#: usr/local/www/firewall_aliases_import.php:146
+msgid "Aliases to import"
+msgstr "インポートするエイリアス"
+
+#: usr/local/www/firewall_aliases_import.php:148
+#: usr/local/www/firewall_aliases_import.php:148
+msgid ""
+"Paste in the aliases to import separated by a carriage return. Common "
+"examples are lists of IPs, networks, blacklists, etc."
+msgstr "「キャリッジリターンで区切られたインポートする別名に貼り付けます。共通」の例であるなどIPS、ネットワーク、ブラックリストの一覧表示"
+
+#: usr/local/www/firewall_aliases_import.php:149
+#: usr/local/www/firewall_aliases_import.php:149
+msgid "The list may contain only IP addresses."
+msgstr "リストは、 IPアドレスを含んでもよい。"
+
+#: usr/local/www/firewall_shaper_layer7.php:59
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_wizards.php:73
+#: usr/local/www/firewall_shaper.php:54 usr/local/www/diag_backup.php:121
+#: usr/local/www/fbegin.inc:114 usr/local/www/fbegin.inc:131
+#: usr/local/www/diag_backup.php:199 usr/local/www/fbegin.inc:140
+#: usr/local/www/fbegin.inc:132 usr/local/www/firewall_shaper_layer7.php:59
+#: usr/local/www/firewall_shaper.php:54
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_wizards.php:73
+#: usr/local/www/diag_backup.php:199 usr/local/www/fbegin.inc:132
+msgid "Traffic Shaper"
+msgstr "トラフィックシェー"
+
+#: usr/local/www/firewall_shaper_layer7.php:59
+#: usr/local/www/firewall_shaper_layer7.php:410
+#: usr/local/www/firewall_shaper_vinterface.php:375
+#: usr/local/www/firewall_shaper_wizards.php:105
+#: usr/local/www/firewall_rules_edit.php:1443
+#: usr/local/www/firewall_shaper.php:412
+#: usr/local/www/firewall_shaper_queues.php:196
+#: usr/local/www/firewall_rules_edit.php:1514
+#: usr/local/www/firewall_shaper_vinterface.php:385
+#: usr/local/www/firewall_shaper.php:413
+#: usr/local/www/firewall_shaper_vinterface.php:392
+#: usr/local/www/firewall_rules_edit.php:1529
+#: usr/local/www/firewall_shaper.php:414
+#: usr/local/www/firewall_shaper_vinterface.php:395
+#: usr/local/www/firewall_rules_edit.php:1537
+#: usr/local/www/firewall_shaper_queues.php:197
+#: usr/local/www/firewall_shaper_wizards.php:106
+#: usr/local/www/firewall_rules_edit.php:1548
+#: usr/local/www/firewall_shaper_layer7.php:59
+#: usr/local/www/firewall_shaper_layer7.php:410
+#: usr/local/www/firewall_shaper.php:414
+#: usr/local/www/firewall_shaper_vinterface.php:395
+#: usr/local/www/firewall_rules_edit.php:1548
+#: usr/local/www/firewall_shaper_queues.php:197
+#: usr/local/www/firewall_shaper_wizards.php:106
+msgid "Layer7"
+msgstr "レイヤ7"
+
+#: usr/local/www/firewall_shaper_layer7.php:66
+#: usr/local/www/firewall_shaper_layer7.php:66
+msgid "You can add new layer7 protocol patterns by simply uploading the file"
+msgstr "あなたは、単にファイルをアップロードすることにより、新たなレイヤ7プロトコルのパターンを追加することができます"
+
+#: usr/local/www/firewall_shaper_layer7.php:66
+#: usr/local/www/firewall_virtual_ip.php:243 usr/local/www/interfaces.php:2550
+#: usr/local/www/interfaces.php:2559 usr/local/www/carp_status.php:196
+#: usr/local/www/status_queues.php:174 usr/local/www/status_queues.php:182
+#: usr/local/www/interfaces.php:2752 usr/local/www/interfaces.php:2761
+#: usr/local/www/carp_status.php:189 usr/local/www/status_queues.php:183
+#: usr/local/www/interfaces.php:2740 usr/local/www/interfaces.php:2749
+#: usr/local/www/firewall_virtual_ip.php:249
+#: usr/local/www/firewall_virtual_ip.php:269
+#: usr/local/www/status_queues.php:165 usr/local/www/interfaces.php:2774
+#: usr/local/www/interfaces.php:2783 usr/local/www/interfaces.php:2820
+#: usr/local/www/interfaces.php:2829 usr/local/www/firewall_virtual_ip.php:292
+#: usr/local/www/interfaces.php:2806 usr/local/www/interfaces.php:2815
+#: usr/local/www/firewall_shaper_layer7.php:66
+#: usr/local/www/firewall_virtual_ip.php:292
+#: usr/local/www/status_queues.php:165 usr/local/www/interfaces.php:2806
+#: usr/local/www/interfaces.php:2815 usr/local/www/carp_status.php:189
+msgid "here"
+msgstr "ここに"
+
+#: usr/local/www/firewall_shaper_layer7.php:111
+#: usr/local/www/firewall_shaper_layer7.php:111
+msgid "Layer7 Rules Container not found!"
+msgstr "レイヤ7ルールコンテナが見つかりません !"
+
+#: usr/local/www/firewall_shaper_layer7.php:161
+#: usr/local/www/firewall_shaper_layer7.php:161
+msgid "Found the following repeated protocol definitions"
+msgstr "次の反復プロトコル定義を見つけた"
+
+#: usr/local/www/firewall_shaper_layer7.php:401
+#: usr/local/www/firewall_shaper_queues.php:187
+#: usr/local/www/firewall_shaper_queues.php:188
+#: usr/local/www/firewall_shaper_layer7.php:401
+#: usr/local/www/firewall_shaper_queues.php:188
+msgid "The traffic shaper configuration has been changed"
+msgstr "トラフィックシェーパの構成が変更されました"
+
+#: usr/local/www/firewall_shaper_layer7.php:407
+#: usr/local/www/firewall_shaper_vinterface.php:372
+#: usr/local/www/firewall_shaper_wizards.php:102
+#: usr/local/www/firewall_shaper.php:409
+#: usr/local/www/firewall_shaper_queues.php:193
+#: usr/local/www/firewall_shaper_vinterface.php:382
+#: usr/local/www/firewall_shaper.php:410
+#: usr/local/www/firewall_shaper_vinterface.php:389
+#: usr/local/www/firewall_shaper.php:411
+#: usr/local/www/firewall_shaper_vinterface.php:392
+#: usr/local/www/firewall_shaper_queues.php:194
+#: usr/local/www/firewall_shaper_wizards.php:103
+#: usr/local/www/firewall_shaper_layer7.php:407
+#: usr/local/www/firewall_shaper.php:411
+#: usr/local/www/firewall_shaper_vinterface.php:392
+#: usr/local/www/firewall_shaper_queues.php:194
+#: usr/local/www/firewall_shaper_wizards.php:103
+msgid "By Interface"
+msgstr "インタフェースで"
+
+#: usr/local/www/firewall_shaper_layer7.php:408
+#: usr/local/www/firewall_shaper_vinterface.php:373
+#: usr/local/www/firewall_shaper_wizards.php:103
+#: usr/local/www/firewall_shaper.php:410
+#: usr/local/www/firewall_shaper_queues.php:194
+#: usr/local/www/firewall_shaper_vinterface.php:383
+#: usr/local/www/firewall_shaper.php:411
+#: usr/local/www/firewall_shaper_vinterface.php:390
+#: usr/local/www/firewall_shaper.php:412
+#: usr/local/www/firewall_shaper_vinterface.php:393
+#: usr/local/www/firewall_shaper_queues.php:195
+#: usr/local/www/firewall_shaper_wizards.php:104
+#: usr/local/www/firewall_shaper_layer7.php:408
+#: usr/local/www/firewall_shaper.php:412
+#: usr/local/www/firewall_shaper_vinterface.php:393
+#: usr/local/www/firewall_shaper_queues.php:195
+#: usr/local/www/firewall_shaper_wizards.php:104
+msgid "By Queue"
+msgstr "キューによって"
+
+#: usr/local/www/firewall_shaper_layer7.php:409
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_vinterface.php:374
+#: usr/local/www/firewall_shaper_wizards.php:104
+#: usr/local/www/firewall_shaper.php:411
+#: usr/local/www/firewall_shaper_queues.php:195
+#: usr/local/www/firewall_shaper_vinterface.php:384
+#: usr/local/www/firewall_shaper.php:412
+#: usr/local/www/firewall_shaper_vinterface.php:391
+#: usr/local/www/firewall_shaper.php:413
+#: usr/local/www/firewall_shaper_vinterface.php:394
+#: usr/local/www/firewall_shaper_queues.php:196
+#: usr/local/www/firewall_shaper_wizards.php:105
+#: usr/local/www/firewall_shaper_layer7.php:409
+#: usr/local/www/firewall_shaper.php:413
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_vinterface.php:394
+#: usr/local/www/firewall_shaper_queues.php:196
+#: usr/local/www/firewall_shaper_wizards.php:105
+msgid "Limiter"
+msgstr "リミッタ"
+
+#: usr/local/www/firewall_shaper_layer7.php:411
+#: usr/local/www/firewall_shaper_vinterface.php:376
+#: usr/local/www/firewall_shaper_wizards.php:73
+#: usr/local/www/firewall_shaper_wizards.php:106
+#: usr/local/www/firewall_shaper.php:413
+#: usr/local/www/firewall_shaper_queues.php:197
+#: usr/local/www/vpn_openvpn_client.php:368
+#: usr/local/www/vpn_openvpn_csc.php:296
+#: usr/local/www/vpn_openvpn_server.php:586
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/vpn_openvpn_server.php:659
+#: usr/local/www/vpn_openvpn_client.php:373
+#: usr/local/www/firewall_shaper.php:414 usr/local/www/vpn_openvpn_csc.php:295
+#: usr/local/www/firewall_shaper_vinterface.php:393
+#: usr/local/www/vpn_openvpn_server.php:677
+#: usr/local/www/vpn_openvpn_client.php:381
+#: usr/local/www/vpn_openvpn_client.php:399
+#: usr/local/www/vpn_openvpn_server.php:703
+#: usr/local/www/firewall_shaper.php:415
+#: usr/local/www/firewall_shaper_vinterface.php:396
+#: usr/local/www/firewall_shaper_queues.php:198
+#: usr/local/www/firewall_shaper_wizards.php:107
+#: usr/local/www/firewall_shaper_layer7.php:411
+#: usr/local/www/firewall_shaper.php:415
+#: usr/local/www/firewall_shaper_vinterface.php:396
+#: usr/local/www/vpn_openvpn_client.php:399
+#: usr/local/www/vpn_openvpn_csc.php:295
+#: usr/local/www/firewall_shaper_queues.php:198
+#: usr/local/www/firewall_shaper_wizards.php:73
+#: usr/local/www/firewall_shaper_wizards.php:107
+#: usr/local/www/vpn_openvpn_server.php:703
+msgid "Wizards"
+msgstr "ウィザーズ"
+
+#: usr/local/www/firewall_shaper_layer7.php:432
+#: usr/local/www/firewall_shaper_layer7.php:432
+msgid "Create new l7 rules group"
+msgstr "新しいL7ルール·グループを作成する"
+
+#: usr/local/www/firewall_shaper_layer7.php:445
+#: usr/local/www/firewall_shaper_layer7.php:445
+msgid "Rule(s)"
+msgstr "規則(単数または複数)"
+
+#: usr/local/www/firewall_shaper_layer7.php:457
+#: usr/local/www/firewall_shaper_layer7.php:457
+msgid "Add one or more rules"
+msgstr "1つ以上のルールを追加"
+
+#: usr/local/www/firewall_shaper_layer7.php:473
+#: usr/local/www/firewall_shaper_layer7.php:473
+msgid "Structure"
+msgstr "構造"
+
+#: usr/local/www/firewall_shaper_layer7.php:480
+#: usr/local/www/firewall_shaper_layer7.php:480
+msgid "Behaviour"
+msgstr "行動"
+
+#: usr/local/www/firewall_shaper_layer7.php:558
+#: usr/local/www/interfaces_groups_edit.php:315
+#: usr/local/www/firewall_aliases_edit.php:680
+#: usr/local/www/interfaces_qinq_edit.php:387
+#: usr/local/www/services_dhcp.php:855
+#: usr/local/www/services_igmpproxy_edit.php:273
+#: usr/local/www/vpn_pppoe_edit.php:573 usr/local/www/services_dhcpv6.php:768
+#: usr/local/www/services_unbound_acls.php:279
+#: usr/local/www/services_dnsmasq_edit.php:271
+#: usr/local/www/system_certmanager.php:793
+#: usr/local/www/services_igmpproxy_edit.php:275
+#: usr/local/www/firewall_aliases_edit.php:685
+#: usr/local/www/services_dhcp.php:893 usr/local/www/services_dhcpv6.php:863
+#: usr/local/www/vpn_pppoe_edit.php:574
+#: usr/local/www/services_dnsmasq_edit.php:272
+#: usr/local/www/services_router_advertisements.php:358
+#: usr/local/www/interfaces_qinq_edit.php:388
+#: usr/local/www/firewall_aliases_edit.php:688
+#: usr/local/www/services_dhcp.php:1090
+#: usr/local/www/interfaces_groups_edit.php:316
+#: usr/local/www/services_dhcpv6.php:794 usr/local/www/vpn_pppoe_edit.php:577
+#: usr/local/www/services_dhcp.php:1103
+#: usr/local/www/system_certmanager.php:818
+#: usr/local/www/services_dhcpv6.php:811
+#: usr/local/www/interfaces_qinq_edit.php:391
+#: usr/local/www/firewall_shaper_layer7.php:555
+#: usr/local/www/services_router_advertisements.php:353
+#: usr/local/www/services_dhcp.php:1123
+#: usr/local/www/system_certmanager.php:820
+#: usr/local/www/firewall_aliases_edit.php:717
+#: usr/local/www/interfaces_groups_edit.php:313
+#: usr/local/www/firewall_shaper_layer7.php:555
+#: usr/local/www/services_router_advertisements.php:353
+#: usr/local/www/vpn_pppoe_edit.php:577 usr/local/www/services_dhcp.php:1123
+#: usr/local/www/system_certmanager.php:820
+#: usr/local/www/services_dhcpv6.php:811
+#: usr/local/www/interfaces_groups_edit.php:313
+#: usr/local/www/firewall_aliases_edit.php:703
+#: usr/local/www/services_igmpproxy_edit.php:275
+#: usr/local/www/services_dnsmasq_edit.php:272
+#: usr/local/www/interfaces_qinq_edit.php:388
+msgid "add another entry"
+msgstr "別のエントリを追加"
+
+#: usr/local/www/firewall_shaper_vinterface.php:102
+#: usr/local/www/firewall_shaper_vinterface.php:102
+msgid ""
+"This pipe/queue is referenced in filter rules, please remove references from "
+"there before deleting."
+msgstr "削除する前に、そこに「このパイプ/キューはフィルタルールで参照されてから参照を削除してください」 。"
+
+#: usr/local/www/firewall_shaper_vinterface.php:114
+#: usr/local/www/firewall_shaper_vinterface.php:114
+#, php-format
+msgid "No queue with name %s was found!"
+msgstr "名前%sとのキューが見つかりませんでした !"
+
+#: usr/local/www/firewall_shaper_vinterface.php:160
+#: usr/local/www/firewall_shaper.php:159 usr/local/www/firewall_shaper.php:160
+#: usr/local/www/firewall_shaper.php:160
+#: usr/local/www/firewall_shaper_vinterface.php:160
+msgid "Could not create new queue/discipline!"
+msgstr "新しいキュー/規律を作成することができませんでした!"
+
+#: usr/local/www/firewall_shaper_vinterface.php:172
+#: usr/local/www/firewall_shaper_vinterface.php:181
+#: usr/local/www/firewall_shaper_vinterface.php:190
+#: usr/local/www/firewall_shaper.php:175 usr/local/www/firewall_shaper.php:184
+#: usr/local/www/firewall_shaper.php:193
+#: usr/local/www/firewall_shaper_vinterface.php:182
+#: usr/local/www/firewall_shaper_vinterface.php:192
+#: usr/local/www/firewall_shaper.php:176 usr/local/www/firewall_shaper.php:185
+#: usr/local/www/firewall_shaper.php:194
+#: usr/local/www/firewall_shaper_vinterface.php:173
+#: usr/local/www/firewall_shaper_vinterface.php:183
+#: usr/local/www/firewall_shaper_vinterface.php:193
+#: usr/local/www/firewall_shaper.php:176 usr/local/www/firewall_shaper.php:185
+#: usr/local/www/firewall_shaper.php:194
+#: usr/local/www/firewall_shaper_vinterface.php:173
+#: usr/local/www/firewall_shaper_vinterface.php:183
+#: usr/local/www/firewall_shaper_vinterface.php:193
+msgid "Queue not found!"
+msgstr "キューが見つかりません !"
+
+#: usr/local/www/firewall_shaper_vinterface.php:235
+#: usr/local/www/firewall_shaper.php:270
+#: usr/local/www/firewall_shaper_vinterface.php:245
+#: usr/local/www/firewall_shaper.php:271
+#: usr/local/www/firewall_shaper_vinterface.php:247
+#: usr/local/www/firewall_shaper.php:271
+#: usr/local/www/firewall_shaper_vinterface.php:247
+msgid "Could not add new queue."
+msgstr "新しいキューを追加できませんでした。"
+
+#: usr/local/www/firewall_shaper_vinterface.php:304
+#: usr/local/www/firewall_shaper.php:346
+#: usr/local/www/firewall_shaper_vinterface.php:314
+#: usr/local/www/firewall_shaper.php:347
+#: usr/local/www/firewall_shaper_vinterface.php:316
+#: usr/local/www/firewall_shaper.php:347
+#: usr/local/www/firewall_shaper_vinterface.php:316
+msgid "Queue Actions"
+msgstr "アクションをキュー"
+
+#: usr/local/www/firewall_shaper_vinterface.php:315
+#: usr/local/www/firewall_shaper.php:357
+#: usr/local/www/firewall_shaper_vinterface.php:325
+#: usr/local/www/firewall_shaper.php:358
+#: usr/local/www/firewall_shaper_vinterface.php:327
+#: usr/local/www/firewall_shaper.php:358
+#: usr/local/www/firewall_shaper_vinterface.php:327
+msgid "Add new queue"
+msgstr "新しいキューを追加する"
+
+#: usr/local/www/firewall_shaper_vinterface.php:326
+#: usr/local/www/firewall_shaper.php:367
+#: usr/local/www/firewall_shaper_vinterface.php:336
+#: usr/local/www/firewall_shaper.php:368
+#: usr/local/www/firewall_shaper_vinterface.php:338
+#: usr/local/www/firewall_shaper.php:368
+#: usr/local/www/firewall_shaper_vinterface.php:338
+msgid "Delete this queue"
+msgstr "このキューの削除"
+
+#: usr/local/www/firewall_shaper_vinterface.php:328
+#: usr/local/www/firewall_shaper_vinterface.php:338
+#: usr/local/www/firewall_shaper_vinterface.php:340
+#: usr/local/www/firewall_shaper_vinterface.php:340
+msgid "Delete virtual interface"
+msgstr "仮想インターフェイスを削除する"
+
+#: usr/local/www/firewall_shaper_vinterface.php:366
+#: usr/local/www/firewall_shaper_wizards.php:96
+#: usr/local/www/firewall_shaper.php:403
+#: usr/local/www/firewall_shaper_vinterface.php:376
+#: usr/local/www/firewall_shaper.php:404
+#: usr/local/www/firewall_shaper_vinterface.php:383
+#: usr/local/www/firewall_shaper.php:405
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/firewall_shaper_wizards.php:97
+#: usr/local/www/firewall_shaper.php:405
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/firewall_shaper_wizards.php:97
+msgid "The traffic shaper configuration has been changed."
+msgstr "トラフィックシェーパの構成が変更されています。"
+
+#: usr/local/www/firewall_shaper_vinterface.php:395
+#: usr/local/www/firewall_shaper_vinterface.php:405
+#: usr/local/www/firewall_shaper_vinterface.php:412
+#: usr/local/www/firewall_shaper_vinterface.php:415
+#: usr/local/www/firewall_shaper_vinterface.php:415
+msgid "Create new limiter"
+msgstr "新しいリミッターを作成"
+
+#: usr/local/www/firewall_shaper_wizards.php:76
+#: usr/local/www/firewall_shaper_wizards.php:76
+msgid "Single Lan multi Wan"
+msgstr "単一のLANマルチワン"
+
+#: usr/local/www/firewall_shaper_wizards.php:77
+#: usr/local/www/firewall_shaper_wizards.php:77
+msgid "Single Wan multi Lan"
+msgstr "シングルワンマルチ蘭"
+
+#: usr/local/www/firewall_shaper_wizards.php:78
+#: usr/local/www/firewall_shaper_wizards.php:78
+msgid "Multiple Lan/Wan"
+msgstr "複数のLAN / WAN"
+
+#: usr/local/www/firewall_shaper_wizards.php:79
+#: usr/local/www/firewall_shaper_wizards.php:79
+msgid "Dedicated Links"
+msgstr "の専用リンク"
+
+#: usr/local/www/firewall_shaper_wizards.php:115
+#: usr/local/www/firewall_shaper_wizards.php:116
+#: usr/local/www/firewall_shaper_wizards.php:116
+msgid "Wizard function"
+msgstr "ウィザード機能"
+
+#: usr/local/www/firewall_shaper_wizards.php:116
+#: usr/local/www/firewall_shaper_wizards.php:117
+#: usr/local/www/firewall_shaper_wizards.php:117
+msgid "Wizard Link"
+msgstr "ウィザードのリンク"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:65
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:107
+#: usr/local/www/system.php:113 usr/local/www/system.php:265
+#: usr/local/www/services_dnsmasq.php:244
+#: usr/local/www/services_dnsmasq.php:311
+#: usr/local/www/services_dnsmasq_edit.php:80
+#: usr/local/www/services_dnsmasq_edit.php:149
+#: usr/local/www/services_dnsmasq.php:332
+#: usr/local/www/services_dnsmasq_edit.php:81
+#: usr/local/www/services_dnsmasq_edit.php:204
+#: usr/local/www/services_dnsmasq_edit.php:238
+#: usr/local/www/services_unbound.php:280
+#: usr/local/www/services_unbound.php:347 usr/local/www/system.php:114
+#: usr/local/www/system.php:276 usr/local/www/services_dnsmasq.php:245
+#: usr/local/www/services_dnsmasq.php:333
+#: usr/local/www/services_dnsmasq_edit.php:205
+#: usr/local/www/services_dnsmasq_edit.php:239
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:72
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:130
+#: usr/local/www/system.php:107 usr/local/www/system.php:269
+#: usr/local/www/services_dnsmasq.php:270
+#: usr/local/www/services_dnsmasq.php:358
+#: usr/local/www/services_dnsmasq.php:283
+#: usr/local/www/services_dnsmasq.php:371
+#: usr/local/www/services_dnsmasq.php:347
+#: usr/local/www/services_dnsmasq.php:435 usr/local/www/system.php:107
+#: usr/local/www/system.php:269 usr/local/www/services_dnsmasq_edit.php:81
+#: usr/local/www/services_dnsmasq_edit.php:205
+#: usr/local/www/services_dnsmasq_edit.php:239
+#: usr/local/www/services_dnsmasq.php:347
+#: usr/local/www/services_dnsmasq.php:435
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:72
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:130
+msgid "Domain"
+msgstr "ドメイン"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:70
+#: usr/local/www/services_dnsmasq_edit.php:88
+#: usr/local/www/services_dnsmasq_edit.php:89
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:87
+#: usr/local/www/services_dnsmasq_edit.php:89
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:87
+msgid "A valid domain must be specified."
+msgstr "有効なドメインを指定する必要があります。"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:73
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:90
+msgid "A valid IP address must be specified, or # for an exclusion."
+msgstr "有効なIPアドレスが指定された、またはする必要があります"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:96
+#: usr/local/www/services_dhcp.php:878 usr/local/www/services_dnsmasq.php:119
+#: usr/local/www/services_dnsmasq_edit.php:127
+#: usr/local/www/services_dhcpv6.php:791
+#: usr/local/www/services_dnsmasq_edit.php:166
+#: usr/local/www/services_dhcp.php:916 usr/local/www/services_dhcpv6.php:886
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/services_dhcp.php:1120 usr/local/www/services_dhcpv6.php:817
+#: usr/local/www/services_dhcp.php:1133 usr/local/www/services_dhcpv6.php:834
+#: usr/local/www/services_dnsmasq.php:123 usr/local/www/services_dhcp.php:1153
+#: usr/local/www/services_dnsmasq.php:125
+#: usr/local/www/services_dnsmasq.php:146 usr/local/www/services_dhcp.php:1153
+#: usr/local/www/services_dhcpv6.php:834
+#: usr/local/www/services_dnsmasq_edit.php:166
+#: usr/local/www/services_dnsmasq.php:146
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+msgid "DNS forwarder"
+msgstr "DNSフォワーダ"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:96
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+msgid "Edit Domain Override"
+msgstr "ドメイン編集オーバーライド"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:110
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:133
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:133
+msgid "Domain to override (NOTE: this does not have to be a valid TLD!)"
+msgstr "オーバーライドするドメイン(注:これが有効なTLD である必要はありません)"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:111
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/firewall_nat_edit.php:745 usr/local/www/system.php:260
+#: usr/local/www/system.php:271 usr/local/www/services_dnsmasq_edit.php:146
+#: usr/local/www/services_dnsmasq_edit.php:153
+#: usr/local/www/services_dnsmasq_edit.php:160
+#: usr/local/www/services_dnsmasq_edit.php:201
+#: usr/local/www/services_dnsmasq_edit.php:208
+#: usr/local/www/services_dnsmasq_edit.php:215
+#: usr/local/www/firewall_nat_edit.php:752 usr/local/www/system.php:282
+#: usr/local/www/services_dnsmasq_edit.php:202
+#: usr/local/www/services_dnsmasq_edit.php:209
+#: usr/local/www/services_dnsmasq_edit.php:216
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+#: usr/local/www/firewall_nat_edit.php:751 usr/local/www/system.php:264
+#: usr/local/www/system.php:275 usr/local/www/firewall_nat_edit.php:746
+#: usr/local/www/firewall_nat_edit.php:758
+#: usr/local/www/firewall_nat_edit.php:759 usr/local/www/system.php:264
+#: usr/local/www/system.php:275 usr/local/www/firewall_nat_edit.php:759
+#: usr/local/www/services_dnsmasq_edit.php:202
+#: usr/local/www/services_dnsmasq_edit.php:209
+#: usr/local/www/services_dnsmasq_edit.php:216
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+msgid "e.g."
+msgstr "例えば"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:111
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+msgid "test"
+msgstr "テスト"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:117
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:140
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:140
+msgid "IP address of the authoritative DNS server for this domain"
+msgstr "このドメインの権限DNSサーバのIPアドレス"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+msgid ""
+"Or enter # for an exclusion to pass through this host/subdomain to standard "
+"nameservers instead of a previous override."
+msgstr ""またはEnter"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:106
+#: usr/local/www/firewall_virtual_ip_edit.php:415
+#: usr/local/www/load_balancer_relay_action.php:141
+#: usr/local/www/firewall_aliases_edit.php:601
+#: usr/local/www/firewall_virtual_ip.php:186
+#: usr/local/www/load_balancer_monitor.php:123
+#: usr/local/www/load_balancer_monitor_edit.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:247
+#: usr/local/www/services_captiveportal.php:777
+#: usr/local/www/services_dhcp.php:813
+#: usr/local/www/load_balancer_relay_action_edit.php:463
+#: usr/local/www/load_balancer_relay_protocol.php:135
+#: usr/local/www/load_balancer_relay_protocol_edit.php:79
+#: usr/local/www/load_balancer_relay_protocol_edit.php:201
+#: usr/local/www/services_igmpproxy.php:96
+#: usr/local/www/services_igmpproxy_edit.php:185
+#: usr/local/www/system_authservers.php:161
+#: usr/local/www/system_authservers.php:184
+#: usr/local/www/system_authservers.php:449
+#: usr/local/www/system_authservers.php:738
+#: usr/local/www/vpn_ipsec_phase2.php:423
+#: usr/local/www/vpn_ipsec_phase2.php:465
+#: usr/local/www/system_certmanager.php:762
+#: usr/local/www/load_balancer_relay_action_edit.php:462
+#: usr/local/www/services_igmpproxy_edit.php:187
+#: usr/local/www/firewall_aliases_edit.php:606
+#: usr/local/www/status_ntpd.php:111
+#: usr/local/www/services_captiveportal.php:819
+#: usr/local/www/load_balancer_monitor.php:124
+#: usr/local/www/services_dhcp.php:851 usr/local/www/vpn_ipsec_phase2.php:449
+#: usr/local/www/vpn_ipsec_phase2.php:491
+#: usr/local/www/firewall_virtual_ip_edit.php:403
+#: usr/local/www/load_balancer_relay_protocol_edit.php:199
+#: usr/local/www/load_balancer_relay_action_edit.php:460
+#: usr/local/www/load_balancer_monitor_edit.php:245
+#: usr/local/www/firewall_aliases_edit.php:609
+#: usr/local/www/status_ntpd.php:127
+#: usr/local/www/services_captiveportal.php:817
+#: usr/local/www/load_balancer_monitor.php:122
+#: usr/local/www/load_balancer_relay_protocol.php:133
+#: usr/local/www/services_dhcp.php:1048
+#: usr/local/www/load_balancer_relay_action.php:139
+#: usr/local/www/vpn_ipsec_phase2.php:515
+#: usr/local/www/vpn_ipsec_phase2.php:551
+#: usr/local/www/vpn_ipsec_phase2.php:593
+#: usr/local/www/firewall_virtual_ip_edit.php:355
+#: usr/local/www/firewall_virtual_ip.php:190
+#: usr/local/www/system_authservers.php:162
+#: usr/local/www/system_authservers.php:185
+#: usr/local/www/system_authservers.php:454
+#: usr/local/www/system_authservers.php:744
+#: usr/local/www/firewall_virtual_ip.php:204
+#: usr/local/www/firewall_virtual_ip_edit.php:347
+#: usr/local/www/services_dhcp.php:1061
+#: usr/local/www/system_certmanager.php:787
+#: usr/local/www/system_authservers.php:163
+#: usr/local/www/system_authservers.php:186
+#: usr/local/www/system_authservers.php:461
+#: usr/local/www/system_authservers.php:760
+#: usr/local/www/services_captiveportal.php:805
+#: usr/local/www/vpn_ipsec_phase2.php:537
+#: usr/local/www/vpn_ipsec_phase2.php:572
+#: usr/local/www/vpn_ipsec_phase2.php:614
+#: usr/local/www/firewall_virtual_ip_edit.php:367
+#: usr/local/www/services_dhcp.php:1081
+#: usr/local/www/system_certmanager.php:788 usr/local/www/status_ntpd.php:133
+#: usr/local/www/services_captiveportal.php:821
+#: usr/local/www/firewall_aliases_edit.php:640
+#: usr/local/www/firewall_virtual_ip.php:227
+#: usr/local/www/load_balancer_relay_protocol_edit.php:79
+#: usr/local/www/load_balancer_relay_protocol_edit.php:199
+#: usr/local/www/firewall_virtual_ip.php:227
+#: usr/local/www/firewall_virtual_ip_edit.php:106
+#: usr/local/www/firewall_virtual_ip_edit.php:367
+#: usr/local/www/load_balancer_relay_protocol.php:133
+#: usr/local/www/load_balancer_relay_action.php:139
+#: usr/local/www/services_dhcp.php:1081
+#: usr/local/www/system_certmanager.php:788
+#: usr/local/www/load_balancer_relay_action_edit.php:460
+#: usr/local/www/status_ntpd.php:133
+#: usr/local/www/load_balancer_monitor_edit.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:245
+#: usr/local/www/system_authservers.php:163
+#: usr/local/www/system_authservers.php:186
+#: usr/local/www/system_authservers.php:461
+#: usr/local/www/system_authservers.php:760
+#: usr/local/www/services_captiveportal.php:821
+#: usr/local/www/firewall_aliases_edit.php:626
+#: usr/local/www/services_igmpproxy_edit.php:187
+#: usr/local/www/services_igmpproxy.php:96
+#: usr/local/www/load_balancer_monitor.php:122
+#: usr/local/www/vpn_ipsec_phase2.php:537
+#: usr/local/www/vpn_ipsec_phase2.php:572
+#: usr/local/www/vpn_ipsec_phase2.php:614
+msgid "Type"
+msgstr "タイプ"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:111
+#: usr/local/www/diag_logs_settings.php:88
+#: usr/local/www/services_dhcp_edit.php:126
+#: usr/local/www/services_dnsmasq_edit.php:91
+#: usr/local/www/services_dnsmasq_edit.php:92
+#: usr/local/www/services_dhcp_edit.php:128
+#: usr/local/www/firewall_virtual_ip_edit.php:114
+#: usr/local/www/services_dhcp_edit.php:162
+#: usr/local/www/firewall_virtual_ip_edit.php:115
+#: usr/local/www/services_dhcp_edit.php:162
+#: usr/local/www/firewall_virtual_ip_edit.php:115
+#: usr/local/www/services_dnsmasq_edit.php:92
+msgid "A valid IP address must be specified."
+msgstr "有効なIPアドレスを指定する必要があります。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:116
+#: usr/local/www/firewall_virtual_ip_edit.php:119
+#: usr/local/www/firewall_virtual_ip_edit.php:123
+#: usr/local/www/firewall_virtual_ip_edit.php:123
+msgid ""
+"The interface chosen for the VIP has no IPv4 or IPv6 address configured so "
+"it cannot be used as a parent for the VIP."
+msgstr "「 VIPのために選択したインターフェイスにはIPv4アドレスを持っていないか、設定されたIPv6アドレスは、その「それは、VIPの親として使用することはできません。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:118
+#: usr/local/www/firewall_virtual_ip_edit.php:121
+#, php-format
+msgid "The %s IP address may not be used in a virtual entry."
+msgstr "%s IPアドレスは、仮想エントリで使用することはできません。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:123
+#: usr/local/www/firewall_virtual_ip_edit.php:126
+msgid "The /32 subnet mask is invalid for CARP IPs."
+msgstr "/ 32サブネットマスクは、CARPのIPアドレスは無効です。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:127
+#: usr/local/www/firewall_virtual_ip_edit.php:130
+msgid "The /128 subnet mask is invalid for CARP IPs."
+msgstr "/ 128サブネットマスクは、CARPのIPアドレスは無効です。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:135
+#: usr/local/www/firewall_virtual_ip_edit.php:138
+msgid "There is already a virtual IP entry for the specified IP address."
+msgstr "指定したIPアドレスの仮想IPエントリが既に存在します。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:150
+#, php-format
+msgid "VHID %s is already in use. Pick a unique number."
+msgstr "VHIDの%sは既に使用されています。一意の番号を選ぶ。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:154
+#: usr/local/www/firewall_virtual_ip_edit.php:157
+#: usr/local/www/firewall_virtual_ip_edit.php:156
+#: usr/local/www/firewall_virtual_ip_edit.php:148
+#: usr/local/www/firewall_virtual_ip_edit.php:164
+#: usr/local/www/firewall_virtual_ip_edit.php:164
+msgid ""
+"You must specify a CARP password that is shared between the two VHID members."
+msgstr ""あなたは2 VHIDメンバー間で共有されているCARPのパスワードを指定する必要があります。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:161
+#: usr/local/www/firewall_virtual_ip_edit.php:170
+#: usr/local/www/firewall_virtual_ip_edit.php:182
+#: usr/local/www/firewall_virtual_ip_edit.php:164
+#: usr/local/www/firewall_virtual_ip_edit.php:173
+#: usr/local/www/firewall_virtual_ip_edit.php:185
+#: usr/local/www/firewall_virtual_ip_edit.php:163
+#: usr/local/www/firewall_virtual_ip_edit.php:172
+#: usr/local/www/firewall_virtual_ip_edit.php:184
+#: usr/local/www/firewall_virtual_ip_edit.php:155
+#: usr/local/www/firewall_virtual_ip_edit.php:176
+#: usr/local/www/firewall_virtual_ip_edit.php:178
+#: usr/local/www/firewall_virtual_ip_edit.php:197
+#: usr/local/www/firewall_virtual_ip_edit.php:178
+#: usr/local/www/firewall_virtual_ip_edit.php:197
+#, php-format
+msgid ""
+"Sorry, we could not locate an interface with a matching subnet for %s. "
+"Please add an IP alias in this subnet on this interface."
+msgstr "「申し訳ありませんが、我々は%s.用一致するサブネットとのインタフェースを見つけることができませんでした」このインターフェイスでこのサブネット内のIPエイリアスを追加してください。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:174
+#: usr/local/www/firewall_virtual_ip_edit.php:177
+#: usr/local/www/firewall_virtual_ip_edit.php:176
+#: usr/local/www/firewall_virtual_ip_edit.php:168
+#: usr/local/www/firewall_virtual_ip_edit.php:182
+#: usr/local/www/firewall_virtual_ip_edit.php:182
+msgid "A CARP parent interface can only be used with IP Alias type Virtual IPs."
+msgstr "VIPこの種のコイ親が許可されていません。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:188
+#: usr/local/www/firewall_virtual_ip_edit.php:191
+#: usr/local/www/firewall_virtual_ip_edit.php:190
+#: usr/local/www/firewall_virtual_ip_edit.php:182
+#: usr/local/www/firewall_virtual_ip_edit.php:203
+#: usr/local/www/firewall_virtual_ip_edit.php:203
+msgid "For this type of VIP, a CARP parent is not allowed."
+msgstr "VIPのこの種のコイの親が許可されていません。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:202
+msgid "This entry cannot be modified because it is still referenced by CARP"
+msgstr "それはまだCARPによって参照されているため、このエントリは変更できません"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:281
+#: usr/local/www/firewall_virtual_ip_edit.php:268
+#: usr/local/www/firewall_virtual_ip_edit.php:261
+#: usr/local/www/firewall_virtual_ip_edit.php:253
+#: usr/local/www/firewall_virtual_ip_edit.php:273
+#: usr/local/www/firewall_virtual_ip_edit.php:273
+msgid "Virtual IP Address"
+msgstr "仮想IPアドレス"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:300
+#: usr/local/www/firewall_virtual_ip_edit.php:302
+#: usr/local/www/firewall_virtual_ip_edit.php:288
+#: usr/local/www/firewall_virtual_ip_edit.php:290
+#: usr/local/www/firewall_virtual_ip_edit.php:287
+#: usr/local/www/firewall_virtual_ip_edit.php:289
+#: usr/local/www/firewall_virtual_ip_edit.php:279
+#: usr/local/www/firewall_virtual_ip_edit.php:281
+#: usr/local/www/firewall_virtual_ip_edit.php:299
+#: usr/local/www/firewall_virtual_ip_edit.php:301
+#: usr/local/www/firewall_virtual_ip_edit.php:299
+#: usr/local/www/firewall_virtual_ip_edit.php:301
+msgid ""
+"This must be the network's subnet mask. It does not specify a CIDR range."
+msgstr "「これは、ネットワークのサブネットマスクである必要があります。これは、 CIDR範囲を指定していません。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:301
+#: usr/local/www/firewall_virtual_ip_edit.php:289
+#: usr/local/www/firewall_virtual_ip_edit.php:288
+#: usr/local/www/firewall_virtual_ip_edit.php:280
+#: usr/local/www/firewall_virtual_ip_edit.php:300
+#: usr/local/www/firewall_virtual_ip_edit.php:300
+msgid "This is a CIDR block of proxy ARP addresses."
+msgstr "これは、プロキシARPのアドレスのCIDRブロックです。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:412
+#: usr/local/www/firewall_virtual_ip_edit.php:400
+#: usr/local/www/firewall_virtual_ip_edit.php:352
+#: usr/local/www/firewall_virtual_ip_edit.php:344
+#: usr/local/www/firewall_virtual_ip_edit.php:364
+#: usr/local/www/firewall_virtual_ip_edit.php:364
+msgid "Edit Virtual IP"
+msgstr "仮想IPを編集"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:418
+#: usr/local/www/firewall_virtual_ip_edit.php:406
+#: usr/local/www/firewall_virtual_ip_edit.php:362
+#: usr/local/www/firewall_virtual_ip_edit.php:354
+#: usr/local/www/firewall_virtual_ip_edit.php:374
+#: usr/local/www/firewall_virtual_ip_edit.php:374
+msgid "Proxy ARP"
+msgstr "プロキシARP"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:420
+#: usr/local/www/carp_status.php:100
+#: usr/local/www/firewall_virtual_ip_edit.php:408
+#: usr/local/www/carp_status.php:92
+#: usr/local/www/firewall_virtual_ip_edit.php:360
+#: usr/local/www/firewall_virtual_ip_edit.php:352
+#: usr/local/www/firewall_virtual_ip_edit.php:372
+#: usr/local/www/firewall_virtual_ip_edit.php:372
+#: usr/local/www/carp_status.php:92
+msgid "CARP"
+msgstr "CARP"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:422
+#: usr/local/www/firewall_virtual_ip_edit.php:410
+#: usr/local/www/firewall_virtual_ip_edit.php:364
+#: usr/local/www/firewall_virtual_ip_edit.php:356
+#: usr/local/www/firewall_virtual_ip_edit.php:376
+#: usr/local/www/firewall_virtual_ip_edit.php:376
+msgid "Other"
+msgstr "その他"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:424
+#: usr/local/www/firewall_virtual_ip_edit.php:412
+#: usr/local/www/firewall_virtual_ip_edit.php:358
+#: usr/local/www/firewall_virtual_ip_edit.php:350
+#: usr/local/www/firewall_virtual_ip_edit.php:370
+#: usr/local/www/firewall_virtual_ip_edit.php:370
+msgid "IP Alias"
+msgstr "IPエイリアス"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:435
+#: usr/local/www/diag_packet_capture.php:119
+#: usr/local/www/services_wol.php:130 usr/local/www/services_wol.php:161
+#: usr/local/www/services_wol_edit.php:82
+#: usr/local/www/services_wol_edit.php:126
+#: usr/local/www/interfaces_bridge.php:107
+#: usr/local/www/interfaces_gif.php:106 usr/local/www/interfaces_gre.php:107
+#: usr/local/www/interfaces_groups_edit.php:274
+#: usr/local/www/firewall_nat_1to1.php:104
+#: usr/local/www/firewall_nat_1to1_edit.php:114
+#: usr/local/www/firewall_nat_1to1_edit.php:280
+#: usr/local/www/firewall_nat_edit.php:182
+#: usr/local/www/firewall_nat_edit.php:185
+#: usr/local/www/firewall_nat_edit.php:476
+#: usr/local/www/firewall_nat_out.php:341
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:417
+#: usr/local/www/firewall_rules_edit.php:727
+#: usr/local/www/interfaces_assign.php:420
+#: usr/local/www/interfaces_vlan.php:108 usr/local/www/system_routes.php:128
+#: usr/local/www/interfaces_lagg.php:112 usr/local/www/interfaces_ppps.php:108
+#: usr/local/www/interfaces_qinq.php:116
+#: usr/local/www/interfaces_wireless.php:106 usr/local/www/vpn_pppoe.php:101
+#: usr/local/www/services_captiveportal.php:146 usr/local/www/diag_ping.php:95
+#: usr/local/www/services_dhcp_relay.php:72 usr/local/www/status_graph.php:179
+#: usr/local/www/diag_arp.php:316
+#: usr/local/www/services_igmpproxy_edit.php:161
+#: usr/local/www/system_gateways.php:153
+#: usr/local/www/system_gateways_edit.php:98
+#: usr/local/www/system_gateways_edit.php:347
+#: usr/local/www/vpn_ipsec_phase1.php:538 usr/local/www/vpn_l2tp.php:304
+#: usr/local/www/vpn_openvpn_client.php:451
+#: usr/local/www/vpn_openvpn_server.php:691
+#: usr/local/www/vpn_pppoe_edit.php:372
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:42
+#: usr/local/www/diag_ndp.php:132 usr/local/www/firewall_nat_npt.php:104
+#: usr/local/www/firewall_nat_npt_edit.php:104
+#: usr/local/www/firewall_nat_npt_edit.php:166
+#: usr/local/www/services_dhcpv6_relay.php:73
+#: usr/local/www/firewall_nat_out.php:351
+#: usr/local/www/firewall_nat_1to1_edit.php:287
+#: usr/local/www/firewall_nat_npt_edit.php:171
+#: usr/local/www/status_graph.php:177
+#: usr/local/www/firewall_nat_out_edit.php:430
+#: usr/local/www/firewall_rules_edit.php:760
+#: usr/local/www/services_igmpproxy_edit.php:163
+#: usr/local/www/services_captiveportal.php:147
+#: usr/local/www/system_gateways_edit.php:99
+#: usr/local/www/system_gateways_edit.php:353
+#: usr/local/www/services_dyndns.php:108
+#: usr/local/www/vpn_openvpn_server.php:764
+#: usr/local/www/diag_packet_capture.php:123
+#: usr/local/www/firewall_nat_edit.php:483
+#: usr/local/www/vpn_openvpn_client.php:456
+#: usr/local/www/firewall_virtual_ip_edit.php:423
+#: usr/local/www/vpn_pppoe_edit.php:373 usr/local/www/firewall_nat_out.php:352
+#: usr/local/www/firewall_nat_1to1_edit.php:285
+#: usr/local/www/firewall_nat_npt_edit.php:170 usr/local/www/vpn_pppoe.php:102
+#: usr/local/www/status_graph.php:183 usr/local/www/interfaces_qinq.php:117
+#: usr/local/www/interfaces_ppps.php:109
+#: usr/local/www/interfaces_bridge.php:108
+#: usr/local/www/interfaces_lagg.php:113 usr/local/www/interfaces_gre.php:108
+#: usr/local/www/interfaces_wireless.php:107
+#: usr/local/www/services_captiveportal.php:153
+#: usr/local/www/system_gateways_edit.php:100
+#: usr/local/www/system_gateways_edit.php:459
+#: usr/local/www/interfaces_assign.php:414
+#: usr/local/www/vpn_openvpn_server.php:782
+#: usr/local/www/interfaces_groups_edit.php:275
+#: usr/local/www/diag_packet_capture.php:181
+#: usr/local/www/interfaces_vlan.php:109
+#: usr/local/www/firewall_nat_edit.php:482
+#: usr/local/www/vpn_openvpn_client.php:464 usr/local/www/vpn_l2tp.php:305
+#: usr/local/www/firewall_virtual_ip_edit.php:368
+#: usr/local/www/interfaces_gif.php:107
+#: usr/local/www/firewall_virtual_ip.php:189
+#: usr/local/www/vpn_ipsec_phase1.php:537 usr/local/www/vpn_l2tp.php:308
+#: usr/local/www/vpn_pppoe.php:103 usr/local/www/vpn_openvpn_client.php:482
+#: usr/local/www/diag_testport.php:143
+#: usr/local/www/firewall_rules_edit.php:763
+#: usr/local/www/interfaces_qinq.php:120
+#: usr/local/www/firewall_virtual_ip.php:203
+#: usr/local/www/firewall_nat_edit.php:187
+#: usr/local/www/firewall_nat_edit.php:190
+#: usr/local/www/firewall_nat_edit.php:477 usr/local/www/status_graph.php:196
+#: usr/local/www/interfaces_lagg.php:117 usr/local/www/interfaces_vlan.php:115
+#: usr/local/www/firewall_virtual_ip_edit.php:360
+#: usr/local/www/interfaces_bridge.php:114
+#: usr/local/www/interfaces_wireless.php:109
+#: usr/local/www/system_routes.php:132 usr/local/www/vpn_pppoe_edit.php:376
+#: usr/local/www/services_captiveportal.php:155
+#: usr/local/www/vpn_ipsec_phase1.php:558 usr/local/www/interfaces_gre.php:112
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:434
+#: usr/local/www/vpn_openvpn_server.php:808
+#: usr/local/www/services_dyndns.php:89 usr/local/www/interfaces_gif.php:111
+#: usr/local/www/system_gateways_edit.php:461
+#: usr/local/www/firewall_rules_edit.php:775
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:215
+#: usr/local/www/firewall_nat_edit.php:192
+#: usr/local/www/firewall_nat_edit.php:195
+#: usr/local/www/firewall_nat_edit.php:489 usr/local/www/status_graph.php:206
+#: usr/local/www/firewall_virtual_ip_edit.php:380
+#: usr/local/www/diag_packet_capture.php:189
+#: usr/local/www/firewall_nat_out.php:359
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:446
+#: usr/local/www/services_dyndns.php:85
+#: usr/local/www/system_gateways_edit.php:491
+#: usr/local/www/firewall_virtual_ip.php:226
+#: usr/local/www/firewall_nat_edit.php:490 usr/local/www/system_routes.php:148
+#: usr/local/www/firewall_nat_out.php:358
+#: usr/local/www/firewall_nat_npt_edit.php:169
+#: usr/local/www/firewall_nat_1to1_edit.php:286 usr/local/www/diag_ndp.php:132
+#: usr/local/www/vpn_l2tp.php:308 usr/local/www/system_gateways_edit.php:100
+#: usr/local/www/system_gateways_edit.php:491 usr/local/www/vpn_pppoe.php:103
+#: usr/local/www/diag_arp.php:316 usr/local/www/vpn_openvpn_client.php:482
+#: usr/local/www/services_wol.php:130 usr/local/www/services_wol.php:161
+#: usr/local/www/firewall_rules_edit.php:775
+#: usr/local/www/interfaces_qinq.php:120
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:215
+#: usr/local/www/firewall_virtual_ip.php:226
+#: usr/local/www/firewall_nat_edit.php:192
+#: usr/local/www/firewall_nat_edit.php:195
+#: usr/local/www/firewall_nat_edit.php:490 usr/local/www/status_graph.php:206
+#: usr/local/www/interfaces_lagg.php:117 usr/local/www/interfaces_vlan.php:115
+#: usr/local/www/services_wol_edit.php:82
+#: usr/local/www/services_wol_edit.php:126
+#: usr/local/www/firewall_virtual_ip_edit.php:380
+#: usr/local/www/services_dhcpv6_relay.php:73
+#: usr/local/www/diag_packet_capture.php:189
+#: usr/local/www/interfaces_bridge.php:114
+#: usr/local/www/interfaces_wireless.php:109
+#: usr/local/www/system_routes.php:148 usr/local/www/vpn_pppoe_edit.php:376
+#: usr/local/www/firewall_nat_out.php:358
+#: usr/local/www/interfaces_ppps.php:109
+#: usr/local/www/firewall_nat_npt.php:104
+#: usr/local/www/firewall_nat_1to1.php:104
+#: usr/local/www/firewall_nat_npt_edit.php:104
+#: usr/local/www/firewall_nat_npt_edit.php:169
+#: usr/local/www/interfaces_groups_edit.php:275
+#: usr/local/www/services_captiveportal.php:155
+#: usr/local/www/services_igmpproxy_edit.php:163
+#: usr/local/www/firewall_nat_1to1_edit.php:114
+#: usr/local/www/firewall_nat_1to1_edit.php:286
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:42
+#: usr/local/www/vpn_ipsec_phase1.php:558 usr/local/www/interfaces_gre.php:112
+#: usr/local/www/system_gateways.php:153
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:446
+#: usr/local/www/vpn_openvpn_server.php:808
+#: usr/local/www/services_dyndns.php:85
+#: usr/local/www/services_dhcp_relay.php:72
+#: usr/local/www/interfaces_gif.php:111
+#: usr/local/www/interfaces_assign.php:420
+msgid "Interface"
+msgstr "インターフェース"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:452
+#: usr/local/www/firewall_virtual_ip_edit.php:440
+#: usr/local/www/firewall_virtual_ip_edit.php:385
+#: usr/local/www/firewall_virtual_ip_edit.php:377
+#: usr/local/www/firewall_virtual_ip_edit.php:397
+#: usr/local/www/firewall_virtual_ip_edit.php:397
+msgid "IP Address(es)"
+msgstr "IPアドレス( ES )"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:456
+#: usr/local/www/firewall_nat_1to1_edit.php:338
+#: usr/local/www/firewall_nat_1to1_edit.php:393
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_out_edit.php:472
+#: usr/local/www/firewall_nat_out_edit.php:506
+#: usr/local/www/firewall_rules_edit.php:865
+#: usr/local/www/firewall_rules_edit.php:958
+#: usr/local/www/firewall_nat_1to1_edit.php:345
+#: usr/local/www/firewall_nat_1to1_edit.php:400
+#: usr/local/www/firewall_nat_out_edit.php:485
+#: usr/local/www/firewall_nat_out_edit.php:519
+#: usr/local/www/firewall_rules_edit.php:900
+#: usr/local/www/firewall_rules_edit.php:993
+#: usr/local/www/firewall_nat_edit.php:552
+#: usr/local/www/firewall_nat_edit.php:641
+#: usr/local/www/firewall_virtual_ip_edit.php:444
+#: usr/local/www/firewall_nat_1to1_edit.php:343
+#: usr/local/www/firewall_nat_1to1_edit.php:398
+#: usr/local/www/firewall_nat_edit.php:551
+#: usr/local/www/firewall_nat_edit.php:640
+#: usr/local/www/firewall_virtual_ip_edit.php:389
+#: usr/local/www/firewall_rules_edit.php:903
+#: usr/local/www/firewall_rules_edit.php:1002
+#: usr/local/www/firewall_nat_edit.php:546
+#: usr/local/www/firewall_nat_edit.php:635
+#: usr/local/www/firewall_virtual_ip_edit.php:381
+#: usr/local/www/firewall_nat_out_edit.php:489
+#: usr/local/www/firewall_nat_out_edit.php:523
+#: usr/local/www/firewall_rules_edit.php:915
+#: usr/local/www/firewall_rules_edit.php:1015
+#: usr/local/www/firewall_nat_edit.php:558
+#: usr/local/www/firewall_nat_edit.php:647
+#: usr/local/www/firewall_virtual_ip_edit.php:401
+#: usr/local/www/firewall_nat_out_edit.php:501
+#: usr/local/www/firewall_nat_out_edit.php:535
+#: usr/local/www/firewall_rules_edit.php:914
+#: usr/local/www/firewall_rules_edit.php:1014
+#: usr/local/www/firewall_nat_edit.php:559
+#: usr/local/www/firewall_nat_edit.php:648
+#: usr/local/www/firewall_nat_1to1_edit.php:344
+#: usr/local/www/firewall_nat_1to1_edit.php:399
+#: usr/local/www/firewall_nat_out_edit.php:536
+#: usr/local/www/firewall_rules_edit.php:914
+#: usr/local/www/firewall_rules_edit.php:1014
+#: usr/local/www/firewall_nat_edit.php:559
+#: usr/local/www/firewall_nat_edit.php:648
+#: usr/local/www/firewall_virtual_ip_edit.php:401
+#: usr/local/www/firewall_nat_1to1_edit.php:344
+#: usr/local/www/firewall_nat_1to1_edit.php:399
+#: usr/local/www/firewall_nat_out_edit.php:501
+#: usr/local/www/firewall_nat_out_edit.php:536
+msgid "Type:"
+msgstr "タイプ:"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:459
+#: usr/local/www/firewall_virtual_ip_edit.php:447
+#: usr/local/www/firewall_virtual_ip_edit.php:392
+#: usr/local/www/firewall_virtual_ip_edit.php:384
+#: usr/local/www/firewall_virtual_ip_edit.php:404
+#: usr/local/www/firewall_virtual_ip_edit.php:404
+msgid "Single address"
+msgstr "単一のアドレス"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:461
+#: usr/local/www/firewall_aliases_edit.php:452
+#: usr/local/www/firewall_aliases_edit.php:624
+#: usr/local/www/firewall_nat_1to1_edit.php:345
+#: usr/local/www/firewall_nat_1to1_edit.php:400
+#: usr/local/www/firewall_nat_edit.php:552
+#: usr/local/www/firewall_nat_edit.php:641
+#: usr/local/www/firewall_nat_out_edit.php:476
+#: usr/local/www/firewall_nat_out_edit.php:511
+#: usr/local/www/firewall_rules_edit.php:872
+#: usr/local/www/firewall_rules_edit.php:965
+#: usr/local/www/system_routes.php:126 usr/local/www/vpn_ipsec_mobile.php:408
+#: usr/local/www/services_igmpproxy_edit.php:223
+#: usr/local/www/vpn_ipsec_phase2.php:428
+#: usr/local/www/vpn_ipsec_phase2.php:470
+#: usr/local/www/services_unbound_acls.php:236
+#: usr/local/www/firewall_nat_1to1_edit.php:352
+#: usr/local/www/firewall_nat_1to1_edit.php:407
+#: usr/local/www/firewall_nat_out_edit.php:489
+#: usr/local/www/firewall_nat_out_edit.php:524
+#: usr/local/www/firewall_rules_edit.php:907
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/services_igmpproxy_edit.php:225
+#: usr/local/www/firewall_aliases_edit.php:455
+#: usr/local/www/firewall_aliases_edit.php:629
+#: usr/local/www/vpn_ipsec_phase2.php:454
+#: usr/local/www/vpn_ipsec_phase2.php:496
+#: usr/local/www/firewall_nat_edit.php:559
+#: usr/local/www/firewall_nat_edit.php:648
+#: usr/local/www/firewall_virtual_ip_edit.php:449
+#: usr/local/www/firewall_nat_1to1_edit.php:350
+#: usr/local/www/firewall_nat_1to1_edit.php:405
+#: usr/local/www/vpn_ipsec_mobile.php:433
+#: usr/local/www/firewall_aliases_edit.php:457
+#: usr/local/www/firewall_aliases_edit.php:632
+#: usr/local/www/vpn_ipsec_phase2.php:520
+#: usr/local/www/vpn_ipsec_phase2.php:556
+#: usr/local/www/vpn_ipsec_phase2.php:598
+#: usr/local/www/firewall_nat_edit.php:558
+#: usr/local/www/firewall_nat_edit.php:647
+#: usr/local/www/firewall_virtual_ip_edit.php:394
+#: usr/local/www/firewall_rules_edit.php:916
+#: usr/local/www/firewall_rules_edit.php:1015
+#: usr/local/www/firewall_nat_edit.php:553
+#: usr/local/www/firewall_nat_edit.php:642
+#: usr/local/www/firewall_virtual_ip_edit.php:386
+#: usr/local/www/system_routes.php:130
+#: usr/local/www/firewall_nat_out_edit.php:493
+#: usr/local/www/firewall_nat_out_edit.php:528
+#: usr/local/www/vpn_ipsec_phase2.php:542
+#: usr/local/www/vpn_ipsec_phase2.php:577
+#: usr/local/www/vpn_ipsec_phase2.php:619
+#: usr/local/www/firewall_rules_edit.php:928
+#: usr/local/www/firewall_rules_edit.php:1028
+#: usr/local/www/firewall_nat_edit.php:565
+#: usr/local/www/firewall_nat_edit.php:654
+#: usr/local/www/firewall_virtual_ip_edit.php:406
+#: usr/local/www/firewall_aliases_edit.php:479
+#: usr/local/www/firewall_aliases_edit.php:663
+#: usr/local/www/firewall_nat_out_edit.php:505
+#: usr/local/www/firewall_nat_out_edit.php:540
+#: usr/local/www/firewall_rules_edit.php:927
+#: usr/local/www/firewall_rules_edit.php:1027
+#: usr/local/www/firewall_nat_edit.php:566
+#: usr/local/www/firewall_nat_edit.php:655 usr/local/www/system_routes.php:146
+#: usr/local/www/firewall_nat_1to1_edit.php:351
+#: usr/local/www/firewall_nat_1to1_edit.php:406
+#: usr/local/www/firewall_nat_out_edit.php:541
+#: usr/local/www/firewall_rules_edit.php:927
+#: usr/local/www/firewall_rules_edit.php:1027
+#: usr/local/www/firewall_nat_edit.php:566
+#: usr/local/www/firewall_nat_edit.php:655
+#: usr/local/www/firewall_virtual_ip_edit.php:406
+#: usr/local/www/system_routes.php:146
+#: usr/local/www/firewall_aliases_edit.php:465
+#: usr/local/www/firewall_aliases_edit.php:649
+#: usr/local/www/services_igmpproxy_edit.php:225
+#: usr/local/www/firewall_nat_1to1_edit.php:351
+#: usr/local/www/firewall_nat_1to1_edit.php:406
+#: usr/local/www/vpn_ipsec_mobile.php:433
+#: usr/local/www/firewall_nat_out_edit.php:505
+#: usr/local/www/firewall_nat_out_edit.php:541
+#: usr/local/www/vpn_ipsec_phase2.php:542
+#: usr/local/www/vpn_ipsec_phase2.php:577
+#: usr/local/www/vpn_ipsec_phase2.php:619
+msgid "Network"
+msgstr "ネットワーク"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:467
+#: usr/local/www/firewall_nat_1to1_edit.php:367
+#: usr/local/www/firewall_nat_1to1_edit.php:422
+#: usr/local/www/firewall_nat_edit.php:575
+#: usr/local/www/firewall_nat_edit.php:685
+#: usr/local/www/firewall_nat_out_edit.php:479
+#: usr/local/www/firewall_nat_out_edit.php:515
+#: usr/local/www/firewall_nat_out_edit.php:542
+#: usr/local/www/firewall_rules_edit.php:895
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/vpn_ipsec_phase2.php:440
+#: usr/local/www/firewall_nat_npt_edit.php:216
+#: usr/local/www/firewall_nat_npt_edit.php:244
+#: usr/local/www/firewall_nat_1to1_edit.php:374
+#: usr/local/www/firewall_nat_1to1_edit.php:429
+#: usr/local/www/firewall_nat_npt_edit.php:221
+#: usr/local/www/firewall_nat_npt_edit.php:249
+#: usr/local/www/firewall_nat_out_edit.php:492
+#: usr/local/www/firewall_nat_out_edit.php:528
+#: usr/local/www/firewall_nat_out_edit.php:555
+#: usr/local/www/firewall_rules_edit.php:930
+#: usr/local/www/firewall_rules_edit.php:1023
+#: usr/local/www/vpn_ipsec_phase2.php:466
+#: usr/local/www/firewall_nat_edit.php:582
+#: usr/local/www/firewall_nat_edit.php:692
+#: usr/local/www/firewall_virtual_ip_edit.php:455
+#: usr/local/www/firewall_nat_1to1_edit.php:372
+#: usr/local/www/firewall_nat_1to1_edit.php:427
+#: usr/local/www/firewall_nat_npt_edit.php:220
+#: usr/local/www/firewall_nat_npt_edit.php:248
+#: usr/local/www/vpn_ipsec_phase2.php:532
+#: usr/local/www/vpn_ipsec_phase2.php:568
+#: usr/local/www/firewall_nat_edit.php:581
+#: usr/local/www/firewall_nat_edit.php:691
+#: usr/local/www/firewall_virtual_ip_edit.php:400
+#: usr/local/www/firewall_rules_edit.php:939
+#: usr/local/www/firewall_rules_edit.php:1038
+#: usr/local/www/firewall_nat_edit.php:576
+#: usr/local/www/firewall_nat_edit.php:686
+#: usr/local/www/firewall_virtual_ip_edit.php:392
+#: usr/local/www/firewall_nat_out_edit.php:496
+#: usr/local/www/firewall_nat_out_edit.php:532
+#: usr/local/www/firewall_nat_out_edit.php:559
+#: usr/local/www/vpn_ipsec_phase2.php:553
+#: usr/local/www/vpn_ipsec_phase2.php:589
+#: usr/local/www/firewall_rules_edit.php:951
+#: usr/local/www/firewall_rules_edit.php:1051
+#: usr/local/www/firewall_nat_edit.php:588
+#: usr/local/www/firewall_nat_edit.php:698
+#: usr/local/www/firewall_virtual_ip_edit.php:412
+#: usr/local/www/firewall_nat_out_edit.php:508
+#: usr/local/www/firewall_nat_out_edit.php:544
+#: usr/local/www/firewall_nat_out_edit.php:571
+#: usr/local/www/firewall_rules_edit.php:950
+#: usr/local/www/firewall_rules_edit.php:1050
+#: usr/local/www/firewall_nat_edit.php:589
+#: usr/local/www/firewall_nat_edit.php:699
+#: usr/local/www/firewall_nat_npt_edit.php:219
+#: usr/local/www/firewall_nat_npt_edit.php:247
+#: usr/local/www/firewall_nat_1to1_edit.php:373
+#: usr/local/www/firewall_nat_1to1_edit.php:428
+#: usr/local/www/firewall_nat_out_edit.php:510
+#: usr/local/www/firewall_nat_out_edit.php:545
+#: usr/local/www/firewall_rules_edit.php:950
+#: usr/local/www/firewall_rules_edit.php:1050
+#: usr/local/www/firewall_nat_edit.php:589
+#: usr/local/www/firewall_nat_edit.php:699
+#: usr/local/www/firewall_virtual_ip_edit.php:412
+#: usr/local/www/firewall_nat_npt_edit.php:219
+#: usr/local/www/firewall_nat_npt_edit.php:247
+#: usr/local/www/firewall_nat_1to1_edit.php:373
+#: usr/local/www/firewall_nat_1to1_edit.php:428
+#: usr/local/www/firewall_nat_out_edit.php:510
+#: usr/local/www/firewall_nat_out_edit.php:545
+#: usr/local/www/firewall_nat_out_edit.php:571
+#: usr/local/www/vpn_ipsec_phase2.php:553
+#: usr/local/www/vpn_ipsec_phase2.php:589
+msgid "Address:"
+msgstr "住所:"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:479
+#: usr/local/www/firewall_virtual_ip_edit.php:467
+#: usr/local/www/firewall_virtual_ip_edit.php:412
+#: usr/local/www/firewall_virtual_ip_edit.php:404
+#: usr/local/www/firewall_virtual_ip_edit.php:424
+#: usr/local/www/firewall_virtual_ip_edit.php:424
+msgid "Expansion:"
+msgstr "拡大:"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:499
+#: usr/local/www/firewall_virtual_ip_edit.php:487
+#: usr/local/www/firewall_virtual_ip_edit.php:432
+#: usr/local/www/firewall_virtual_ip_edit.php:424
+#: usr/local/www/firewall_virtual_ip_edit.php:444
+#: usr/local/www/firewall_virtual_ip_edit.php:444
+msgid "Virtual IP Password"
+msgstr "仮想IPパスワード"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:501
+#: usr/local/www/firewall_virtual_ip_edit.php:489
+#: usr/local/www/firewall_virtual_ip_edit.php:434
+#: usr/local/www/firewall_virtual_ip_edit.php:426
+#: usr/local/www/firewall_virtual_ip_edit.php:446
+#: usr/local/www/firewall_virtual_ip_edit.php:446
+msgid "Enter the VHID group password."
+msgstr "VHIDグループのパスワードを入力してください。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:505
+#: usr/local/www/firewall_virtual_ip_edit.php:493
+#: usr/local/www/firewall_virtual_ip_edit.php:438
+#: usr/local/www/firewall_virtual_ip_edit.php:430
+#: usr/local/www/firewall_virtual_ip_edit.php:450
+#: usr/local/www/firewall_virtual_ip_edit.php:450
+msgid "VHID Group"
+msgstr "VHIDグループ"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:513
+#: usr/local/www/firewall_virtual_ip_edit.php:501
+#: usr/local/www/firewall_virtual_ip_edit.php:446
+#: usr/local/www/firewall_virtual_ip_edit.php:438
+#: usr/local/www/firewall_virtual_ip_edit.php:458
+#: usr/local/www/firewall_virtual_ip_edit.php:458
+msgid "Enter the VHID group that the machines will share"
+msgstr "マシンが共有するVHIDグループを入力してください"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:517
+#: usr/local/www/firewall_virtual_ip_edit.php:505
+#: usr/local/www/firewall_virtual_ip_edit.php:450
+#: usr/local/www/firewall_virtual_ip_edit.php:442
+#: usr/local/www/firewall_virtual_ip_edit.php:462
+#: usr/local/www/firewall_virtual_ip_edit.php:462
+msgid "Advertising Frequency"
+msgstr "広告頻度"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:534
+#: usr/local/www/firewall_virtual_ip_edit.php:522
+#: usr/local/www/firewall_virtual_ip_edit.php:467
+#: usr/local/www/firewall_virtual_ip_edit.php:459
+#: usr/local/www/firewall_virtual_ip_edit.php:479
+#: usr/local/www/firewall_virtual_ip_edit.php:479
+msgid ""
+"The frequency that this machine will advertise. 0 means usually master. "
+"Otherwise the lowest combination of both values in the cluster determines "
+"the master."
+msgstr "「このマシンが広告することを周波数。 0は通常のマスターを意味する」そうでない場合は、クラスタ内の両方の値の最も低い組み合わせは"マスターが決定されます。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:557
+#: usr/local/www/diag_logs_settings.php:326
+#: usr/local/www/diag_packet_capture.php:195
+#: usr/local/www/services_dyndns.php:160 usr/local/www/services_wol.php:210
+#: usr/local/www/interfaces_bridge.php:144
+#: usr/local/www/interfaces_bridge_edit.php:446
+#: usr/local/www/interfaces_bridge_edit.php:490
+#: usr/local/www/interfaces_bridge_edit.php:534
+#: usr/local/www/interfaces_gif.php:132 usr/local/www/interfaces_gre.php:133
+#: usr/local/www/interfaces_groups.php:148
+#: usr/local/www/firewall_aliases.php:229
+#: usr/local/www/firewall_nat_1to1.php:179
+#: usr/local/www/firewall_nat_out.php:459
+#: usr/local/www/firewall_schedule.php:240 usr/local/www/diag_backup.php:655
+#: usr/local/www/firewall_virtual_ip.php:241 usr/local/www/interfaces.php:1845
+#: usr/local/www/interfaces_vlan.php:134 usr/local/www/system_routes.php:188
+#: usr/local/www/interfaces_lagg.php:138
+#: usr/local/www/interfaces_ppps_edit.php:620
+#: usr/local/www/interfaces_qinq.php:151
+#: usr/local/www/load_balancer_virtual_server_edit.php:289
+#: usr/local/www/services_captiveportal.php:929
+#: usr/local/www/services_captiveportal_filemanager.php:215
+#: usr/local/www/diag_ipsec.php:163 usr/local/www/diag_ipsec_sad.php:134
+#: usr/local/www/services_captiveportal_ip.php:170
+#: usr/local/www/services_captiveportal_mac.php:190
+#: usr/local/www/diag_ipsec_spd.php:143 usr/local/www/services_dhcp.php:715
+#: usr/local/www/services_dhcp.php:876 usr/local/www/services_dnsmasq.php:214
+#: usr/local/www/services_captiveportal_hostname.php:171
+#: usr/local/www/services_captiveportal_vouchers.php:603
+#: usr/local/www/diag_routes.php:72
+#: usr/local/www/status_rrd_graph_settings.php:236
+#: usr/local/www/services_dyndns_edit.php:189
+#: usr/local/www/services_dyndns_edit.php:245
+#: usr/local/www/services_igmpproxy.php:161
+#: usr/local/www/services_rfc2136_edit.php:209
+#: usr/local/www/system_advanced_admin.php:289
+#: usr/local/www/system_gateway_groups.php:195 usr/local/www/vpn_l2tp.php:451
+#: usr/local/www/services_dhcpv6.php:789
+#: usr/local/www/diag_logs_settings.php:333
+#: usr/local/www/services_captiveportal_vouchers.php:610
+#: usr/local/www/services_dyndns_edit.php:272
+#: usr/local/www/services_dyndns_edit.php:376
+#: usr/local/www/firewall_nat_out.php:470 usr/local/www/system_routes.php:199
+#: usr/local/www/status_rrd_graph_settings.php:237
+#: usr/local/www/diag_ipsec.php:221 usr/local/www/diag_backup.php:736
+#: usr/local/www/services_unbound.php:253
+#: usr/local/www/services_captiveportal.php:974
+#: usr/local/www/services_dyndns.php:181 usr/local/www/services_dhcp.php:728
+#: usr/local/www/services_dhcp.php:751 usr/local/www/services_dhcp.php:914
+#: usr/local/www/load_balancer_virtual_server_edit.php:278
+#: usr/local/www/interfaces_bridge_edit.php:455
+#: usr/local/www/interfaces_bridge_edit.php:499
+#: usr/local/www/interfaces_bridge_edit.php:543
+#: usr/local/www/firewall_aliases.php:232
+#: usr/local/www/diag_packet_capture.php:215 usr/local/www/interfaces.php:2023
+#: usr/local/www/firewall_virtual_ip_edit.php:545
+#: usr/local/www/services_dhcpv6.php:732 usr/local/www/services_dhcpv6.php:884
+#: usr/local/www/diag_logs_settings.php:353
+#: usr/local/www/services_dnsmasq.php:215
+#: usr/local/www/services_captiveportal_vouchers.php:624
+#: usr/local/www/firewall_nat_out.php:471
+#: usr/local/www/services_captiveportal_ip.php:168
+#: usr/local/www/interfaces_groups.php:149 usr/local/www/diag_ipsec.php:222
+#: usr/local/www/interfaces_qinq.php:152 usr/local/www/diag_ipsec_sad.php:135
+#: usr/local/www/services_captiveportal_mac.php:188
+#: usr/local/www/interfaces_bridge.php:145
+#: usr/local/www/interfaces_ppps_edit.php:621
+#: usr/local/www/interfaces_lagg.php:139
+#: usr/local/www/services_captiveportal_hostname.php:169
+#: usr/local/www/interfaces_gre.php:134 usr/local/www/diag_routes.php:73
+#: usr/local/www/system_gateway_groups.php:196
+#: usr/local/www/services_captiveportal.php:970
+#: usr/local/www/services_captiveportal_filemanager.php:212
+#: usr/local/www/services_dhcp.php:907 usr/local/www/services_dhcp.php:932
+#: usr/local/www/services_dhcp.php:1118
+#: usr/local/www/load_balancer_virtual_server_edit.php:276
+#: usr/local/www/interfaces_bridge_edit.php:456
+#: usr/local/www/interfaces_bridge_edit.php:500
+#: usr/local/www/interfaces_bridge_edit.php:544
+#: usr/local/www/firewall_aliases.php:284
+#: usr/local/www/diag_packet_capture.php:262
+#: usr/local/www/interfaces_vlan.php:135 usr/local/www/interfaces.php:2011
+#: usr/local/www/vpn_l2tp.php:452
+#: usr/local/www/firewall_virtual_ip_edit.php:490
+#: usr/local/www/interfaces_gif.php:133 usr/local/www/diag_ipsec_spd.php:144
+#: usr/local/www/firewall_virtual_ip.php:247
+#: usr/local/www/services_dhcpv6.php:663 usr/local/www/services_dhcpv6.php:815
+#: usr/local/www/vpn_l2tp.php:455 usr/local/www/services_dyndns_edit.php:276
+#: usr/local/www/services_dyndns_edit.php:380
+#: usr/local/www/interfaces_qinq.php:155
+#: usr/local/www/interfaces_ppps_edit.php:627
+#: usr/local/www/firewall_virtual_ip.php:267
+#: usr/local/www/interfaces_lagg.php:143 usr/local/www/interfaces_vlan.php:141
+#: usr/local/www/firewall_virtual_ip_edit.php:482
+#: usr/local/www/diag_ipsec.php:223 usr/local/www/interfaces_bridge.php:151
+#: usr/local/www/services_captiveportal_vouchers.php:633
+#: usr/local/www/system_routes.php:203 usr/local/www/services_dhcp.php:921
+#: usr/local/www/services_dhcp.php:946 usr/local/www/services_dhcp.php:1131
+#: usr/local/www/services_dhcpv6.php:680 usr/local/www/services_dhcpv6.php:832
+#: usr/local/www/firewall_nat_out.php:468
+#: usr/local/www/services_captiveportal.php:972
+#: usr/local/www/diag_backup.php:741
+#: usr/local/www/interfaces_bridge_edit.php:457
+#: usr/local/www/interfaces_bridge_edit.php:501
+#: usr/local/www/interfaces_bridge_edit.php:545
+#: usr/local/www/services_dnsmasq.php:240
+#: usr/local/www/services_captiveportal_mac.php:198
+#: usr/local/www/interfaces_gre.php:138 usr/local/www/interfaces_gif.php:137
+#: usr/local/www/interfaces.php:2038
+#: usr/local/www/services_dyndns_edit.php:278
+#: usr/local/www/services_dyndns_edit.php:388
+#: usr/local/www/firewall_aliases.php:287
+#: usr/local/www/firewall_virtual_ip_edit.php:501
+#: usr/local/www/diag_packet_capture.php:279
+#: usr/local/www/services_dhcp.php:941 usr/local/www/services_dhcp.php:966
+#: usr/local/www/services_dhcp.php:1151 usr/local/www/firewall_nat_out.php:475
+#: usr/local/www/services_captiveportal.php:988
+#: usr/local/www/services_dnsmasq.php:253
+#: usr/local/www/services_dyndns.php:177
+#: usr/local/www/system_gateway_groups.php:205
+#: usr/local/www/interfaces.php:2084
+#: usr/local/www/interfaces_ppps_edit.php:625
+#: usr/local/www/firewall_virtual_ip.php:290
+#: usr/local/www/firewall_aliases.php:288 usr/local/www/system_routes.php:219
+#: usr/local/www/firewall_nat_out.php:474
+#: usr/local/www/interfaces_bridge_edit.php:461
+#: usr/local/www/interfaces_bridge_edit.php:505
+#: usr/local/www/interfaces_bridge_edit.php:549
+#: usr/local/www/services_dnsmasq.php:317 usr/local/www/interfaces.php:2073
+#: usr/local/www/vpn_l2tp.php:455 usr/local/www/diag_logs_settings.php:353
+#: usr/local/www/firewall_schedule.php:240
+#: usr/local/www/services_dyndns_edit.php:278
+#: usr/local/www/services_dyndns_edit.php:388
+#: usr/local/www/services_wol.php:210
+#: usr/local/www/load_balancer_virtual_server_edit.php:276
+#: usr/local/www/services_captiveportal_ip.php:168
+#: usr/local/www/interfaces_qinq.php:155
+#: usr/local/www/interfaces_ppps_edit.php:625
+#: usr/local/www/firewall_virtual_ip.php:290
+#: usr/local/www/interfaces_lagg.php:143 usr/local/www/interfaces_vlan.php:141
+#: usr/local/www/firewall_aliases.php:288
+#: usr/local/www/firewall_virtual_ip_edit.php:501
+#: usr/local/www/diag_ipsec.php:223
+#: usr/local/www/status_rrd_graph_settings.php:237
+#: usr/local/www/diag_packet_capture.php:279 usr/local/www/diag_routes.php:73
+#: usr/local/www/interfaces_bridge.php:151
+#: usr/local/www/services_captiveportal_vouchers.php:638
+#: usr/local/www/system_routes.php:219 usr/local/www/services_dhcp.php:941
+#: usr/local/www/services_dhcp.php:966 usr/local/www/services_dhcp.php:1151
+#: usr/local/www/diag_ipsec_spd.php:144
+#: usr/local/www/interfaces_groups.php:148
+#: usr/local/www/services_captiveportal_hostname.php:169
+#: usr/local/www/services_dhcpv6.php:680 usr/local/www/services_dhcpv6.php:832
+#: usr/local/www/firewall_nat_out.php:474
+#: usr/local/www/services_captiveportal_filemanager.php:212
+#: usr/local/www/firewall_nat_1to1.php:179
+#: usr/local/www/services_captiveportal.php:988
+#: usr/local/www/diag_backup.php:741
+#: usr/local/www/interfaces_bridge_edit.php:461
+#: usr/local/www/interfaces_bridge_edit.php:505
+#: usr/local/www/interfaces_bridge_edit.php:549
+#: usr/local/www/services_igmpproxy.php:161
+#: usr/local/www/services_rfc2136_edit.php:209
+#: usr/local/www/services_dnsmasq.php:317
+#: usr/local/www/services_captiveportal_mac.php:198
+#: usr/local/www/interfaces_gre.php:138 usr/local/www/diag_ipsec_sad.php:135
+#: usr/local/www/services_dyndns.php:177 usr/local/www/interfaces_gif.php:137
+#: usr/local/www/system_gateway_groups.php:205
+#: usr/local/www/interfaces.php:2073
+msgid "Note:"
+msgstr "注意:"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:559
+#: usr/local/www/firewall_virtual_ip_edit.php:547
+#: usr/local/www/firewall_virtual_ip_edit.php:492
+#: usr/local/www/firewall_virtual_ip_edit.php:484
+#: usr/local/www/firewall_virtual_ip_edit.php:503
+#: usr/local/www/firewall_virtual_ip_edit.php:503
+msgid ""
+"Proxy ARP and Other type Virtual IPs cannot be bound to by anything running "
+"on the firewall, such as IPsec, OpenVPN, etc. Use a CARP or IP Alias type "
+"address for these cases."
+msgstr "このような場合のために、CARPまたはIPエイリアスタイプ "アドレスを使用してくださいなどのIPsec 、 OpenVPNを、として、ファイアウォールの「プロキシARPおよび他のタイプの仮想IPは何も実行してにバインドすることはできません」 。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:560
+#: usr/local/www/firewall_virtual_ip_edit.php:548
+#: usr/local/www/firewall_virtual_ip_edit.php:493
+#: usr/local/www/firewall_virtual_ip_edit.php:485
+#: usr/local/www/firewall_virtual_ip_edit.php:504
+#: usr/local/www/firewall_virtual_ip_edit.php:504
+msgid "For more information on CARP and the above values, visit the OpenBSD "
+msgstr "CARPと上記の値の詳細については、 OpenBSDのをご覧ください"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:560
+#: usr/local/www/firewall_virtual_ip_edit.php:548
+#: usr/local/www/firewall_virtual_ip_edit.php:493
+#: usr/local/www/firewall_virtual_ip_edit.php:485
+#: usr/local/www/firewall_virtual_ip_edit.php:504
+#: usr/local/www/firewall_virtual_ip_edit.php:504
+msgid "CARP FAQ"
+msgstr "CARPよくある質問"
+
+#: usr/local/www/load_balancer_relay_action.php:74
+#: usr/local/www/load_balancer_relay_action.php:74
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"relay protocol."
+msgstr "リレープロトコル"それはまだ少なくとも1によって参照されているため、このエントリは削除できません」 。"
+
+#: usr/local/www/load_balancer_relay_action.php:104
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/load_balancer_relay_action.php:104
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+msgid "Relay Action"
+msgstr "リレー動作"
+
+#: usr/local/www/load_balancer_relay_action.php:118
+#: usr/local/www/load_balancer_relay_action.php:116
+#: usr/local/www/load_balancer_relay_action.php:116
+msgid ""
+"The load balancer configuration has been changed.<br />You must apply the "
+"changes in order for them to take effect."
+msgstr "それらを有効にするための変更」ロードバランサ設定が変更されています。検索して、適用する必要があります」 。"
+
+#: usr/local/www/load_balancer_relay_action.php:128
+#: usr/local/www/load_balancer_relay_action.php:126
+#: usr/local/www/load_balancer_relay_action.php:126
+msgid "Relay Actions"
+msgstr "アクションリレー"
+
+#: usr/local/www/load_balancer_relay_action.php:129
+#: usr/local/www/load_balancer_relay_action.php:127
+#: usr/local/www/load_balancer_relay_action.php:127
+msgid "Relay Protocols"
+msgstr "リレープロトコル"
+
+#: usr/local/www/load_balancer_relay_action.php:142
+#: usr/local/www/interfaces_qinq_edit.php:318
+#: usr/local/www/load_balancer_relay_action_edit.php:515
+#: usr/local/www/load_balancer_relay_action_edit.php:535
+#: usr/local/www/load_balancer_relay_protocol.php:136
+#: usr/local/www/load_balancer_relay_action_edit.php:514
+#: usr/local/www/load_balancer_relay_action_edit.php:534
+#: usr/local/www/interfaces_qinq_edit.php:319
+#: usr/local/www/load_balancer_relay_action_edit.php:512
+#: usr/local/www/load_balancer_relay_action_edit.php:532
+#: usr/local/www/load_balancer_relay_protocol.php:134
+#: usr/local/www/load_balancer_relay_action.php:140
+#: usr/local/www/interfaces_qinq_edit.php:322
+#: usr/local/www/load_balancer_relay_protocol.php:134
+#: usr/local/www/load_balancer_relay_action.php:140
+#: usr/local/www/load_balancer_relay_action_edit.php:512
+#: usr/local/www/load_balancer_relay_action_edit.php:532
+#: usr/local/www/interfaces_qinq_edit.php:322
+msgid "Options"
+msgstr "オプション"
+
+#: usr/local/www/diag_defaults.php:51
+msgid ""
+"The system has been reset to factory defaults and is now rebooting. This may "
+"take one minute."
+msgstr "「システムは工場出荷時の設定にリセットされ、現在、再起動されている。これは可能性"1分ほどかかる。"
+
+#: usr/local/www/diag_defaults.php:58 usr/local/www/diag_defaults.php:52
+#: usr/local/www/diag_defaults.php:52
+msgid "Factory defaults"
+msgstr "工場出荷時のデフォルト"
+
+#: usr/local/www/diag_defaults.php:67 usr/local/www/diag_defaults.php:70
+#: usr/local/www/diag_defaults.php:70
+msgid "If you click"
+msgstr "あなたがクリックした場合"
+
+#: usr/local/www/diag_defaults.php:67 usr/local/www/diag_defaults.php:81
+#: usr/local/www/crash_reporter.php:76 usr/local/www/halt.php:69
+#: usr/local/www/pkg.php:342 usr/local/www/system_firmware.php:229
+#: usr/local/www/reboot.php:61 usr/local/www/reboot.php:72
+#: usr/local/www/pkg.php:424 usr/local/www/reboot.php:53
+#: usr/local/www/reboot.php:64 usr/local/www/halt.php:60
+#: usr/local/www/system_firmware.php:236 usr/local/www/system_firmware.php:239
+#: usr/local/www/diag_defaults.php:60 usr/local/www/diag_defaults.php:70
+#: usr/local/www/diag_defaults.php:82 usr/local/www/system_firmware.php:239
+#: usr/local/www/reboot.php:53 usr/local/www/reboot.php:64
+#: usr/local/www/pkg.php:424 usr/local/www/diag_defaults.php:60
+#: usr/local/www/diag_defaults.php:70 usr/local/www/diag_defaults.php:82
+#: usr/local/www/halt.php:60 usr/local/www/halt.php:69
+#: usr/local/www/crash_reporter.php:76
+msgid "Yes"
+msgstr "はい"
+
+#: usr/local/www/diag_defaults.php:67 usr/local/www/diag_defaults.php:70
+#: usr/local/www/diag_defaults.php:70
+msgid "the firewall will:"
+msgstr "ファイアウォールは、以下となります。"
+
+#: usr/local/www/diag_defaults.php:70 usr/local/www/diag_defaults.php:72
+#: usr/local/www/diag_defaults.php:72
+msgid "Reset to factory defaults"
+msgstr "工場出荷時の設定にリセット"
+
+#: usr/local/www/diag_defaults.php:71 usr/local/www/diag_defaults.php:73
+#: usr/local/www/diag_defaults.php:73
+msgid "LAN IP address will be reset to 192.168.1.1"
+msgstr "LAN IPアドレスは192.168.1.1にリセットされます"
+
+#: usr/local/www/diag_defaults.php:72 usr/local/www/diag_defaults.php:74
+#: usr/local/www/diag_defaults.php:74
+msgid "System will be configured as a DHCP server on the default LAN interface"
+msgstr "システムはデフォルトのLANインターフェイス上でDHCPサーバとして設定されます"
+
+#: usr/local/www/diag_defaults.php:73 usr/local/www/diag_defaults.php:75
+#: usr/local/www/diag_defaults.php:75
+msgid "Reboot after changes are installed"
+msgstr "変更がインストールされた後に再起動します"
+
+#: usr/local/www/diag_defaults.php:74 usr/local/www/diag_defaults.php:76
+#: usr/local/www/diag_defaults.php:76
+msgid ""
+"WAN interface will be set to obtain an address automatically from a DHCP "
+"server"
+msgstr "サーバ」 WANインターフェイスがDHCPから自動的にアドレスを取得するように設定される""
+
+#: usr/local/www/diag_defaults.php:75 usr/local/www/diag_defaults.php:77
+#: usr/local/www/diag_defaults.php:77
+msgid "webConfigurator admin username will be reset to 'admin'"
+msgstr "webConfigurator管理者のユーザー名がリセットされます「管理者」に"
+
+#: usr/local/www/diag_defaults.php:76 usr/local/www/diag_defaults.php:78
+#: usr/local/www/diag_defaults.php:78
+msgid "webConfigurator admin password will be reset to"
+msgstr "webConfigurator管理者パスワードにリセットされます"
+
+#: usr/local/www/diag_defaults.php:79 usr/local/www/diag_defaults.php:80
+#: usr/local/www/diag_defaults.php:80
+msgid "Are you sure you want to proceed?"
+msgstr "あなたが続行してもよろしいですか?"
+
+#: usr/local/www/diag_defaults.php:82 usr/local/www/crash_reporter.php:77
+#: usr/local/www/halt.php:70 usr/local/www/pkg.php:340
+#: usr/local/www/system_firmware.php:230 usr/local/www/reboot.php:62
+#: usr/local/www/pkg.php:422 usr/local/www/reboot.php:43
+#: usr/local/www/reboot.php:65 usr/local/www/halt.php:49
+#: usr/local/www/system_firmware.php:237 usr/local/www/system_firmware.php:240
+#: usr/local/www/diag_defaults.php:47 usr/local/www/diag_defaults.php:83
+#: usr/local/www/system_firmware.php:240 usr/local/www/reboot.php:43
+#: usr/local/www/reboot.php:65 usr/local/www/pkg.php:422
+#: usr/local/www/diag_defaults.php:47 usr/local/www/diag_defaults.php:83
+#: usr/local/www/halt.php:49 usr/local/www/halt.php:70
+#: usr/local/www/crash_reporter.php:77
+msgid "No"
+msgstr "いいえ"
+
+#: usr/local/www/diag_logs.php:65 usr/local/www/diag_logs_auth.php:54
+#: usr/local/www/diag_logs_dhcp.php:59 usr/local/www/diag_logs_filter.php:90
+#: usr/local/www/diag_logs_filter_dynamic.php:61
+#: usr/local/www/diag_logs_ipsec.php:91 usr/local/www/diag_logs_ntpd.php:54
+#: usr/local/www/diag_logs_openvpn.php:45
+#: usr/local/www/diag_logs_settings.php:132 usr/local/www/diag_logs_vpn.php:44
+#: usr/local/www/diag_logs_filter_summary.php:34
+#: usr/local/www/diag_logs_ppp.php:59 usr/local/www/diag_logs_relayd.php:55
+#: usr/local/www/diag_logs_wireless.php:56
+#: usr/local/www/diag_logs_routing.php:54
+#: usr/local/www/diag_logs_settings.php:136
+#: usr/local/www/diag_logs_resolver.php:66
+#: usr/local/www/diag_logs_gateways.php:66
+#: usr/local/www/diag_logs_settings.php:143
+#: usr/local/www/diag_logs_filter.php:79 usr/local/www/diag_logs_ppp.php:57
+#: usr/local/www/diag_logs_filter.php:109 usr/local/www/diag_logs_auth.php:54
+#: usr/local/www/diag_logs_settings.php:143
+#: usr/local/www/diag_logs_filter.php:109
+#: usr/local/www/diag_logs_routing.php:54 usr/local/www/diag_logs_dhcp.php:59
+#: usr/local/www/diag_logs.php:65
+#: usr/local/www/diag_logs_filter_dynamic.php:61
+#: usr/local/www/diag_logs_ntpd.php:54 usr/local/www/diag_logs_openvpn.php:45
+#: usr/local/www/diag_logs_ppp.php:57 usr/local/www/diag_logs_gateways.php:66
+#: usr/local/www/diag_logs_relayd.php:55 usr/local/www/diag_logs_vpn.php:44
+#: usr/local/www/diag_logs_ipsec.php:91
+#: usr/local/www/diag_logs_wireless.php:56
+#: usr/local/www/diag_logs_resolver.php:66
+#: usr/local/www/diag_logs_filter_summary.php:34
+msgid "System logs"
+msgstr "システムログ"
+
+#: usr/local/www/diag_logs.php:79 usr/local/www/diag_logs_auth.php:67
+#: usr/local/www/diag_logs_dhcp.php:59 usr/local/www/diag_logs_dhcp.php:72
+#: usr/local/www/diag_logs_filter.php:103
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_ipsec.php:104 usr/local/www/diag_logs_ntpd.php:67
+#: usr/local/www/diag_logs_openvpn.php:71
+#: usr/local/www/diag_logs_settings.php:212
+#: usr/local/www/diag_logs_vpn.php:128 usr/local/www/interfaces.php:1032
+#: usr/local/www/diag_logs_filter_summary.php:186
+#: usr/local/www/diag_logs_ppp.php:72 usr/local/www/diag_logs_relayd.php:68
+#: usr/local/www/services_dhcp_edit.php:190
+#: usr/local/www/diag_logs_wireless.php:69
+#: usr/local/www/diag_logs_routing.php:67
+#: usr/local/www/diag_logs_settings.php:217
+#: usr/local/www/diag_logs_resolver.php:80
+#: usr/local/www/diag_logs_gateways.php:80
+#: usr/local/www/services_dhcp_edit.php:193 usr/local/www/interfaces.php:1118
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/diag_logs_routing.php:68
+#: usr/local/www/diag_logs_settings.php:224
+#: usr/local/www/diag_logs_relayd.php:69 usr/local/www/diag_logs_auth.php:68
+#: usr/local/www/diag_logs_ipsec.php:105
+#: usr/local/www/diag_logs_resolver.php:81 usr/local/www/diag_logs_ntpd.php:68
+#: usr/local/www/diag_logs_dhcp.php:73 usr/local/www/diag_logs_wireless.php:70
+#: usr/local/www/diag_logs_filter_summary.php:187
+#: usr/local/www/diag_logs_gateways.php:81
+#: usr/local/www/diag_logs_openvpn.php:72 usr/local/www/interfaces.php:1106
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_filter.php:93
+#: usr/local/www/services_dhcp_edit.php:301
+#: usr/local/www/diag_logs_filter_dynamic.php:99
+#: usr/local/www/diag_logs_ppp.php:70 usr/local/www/interfaces.php:1120
+#: usr/local/www/diag_logs_filter.php:123 usr/local/www/interfaces.php:1162
+#: usr/local/www/interfaces.php:1157 usr/local/www/diag_logs_auth.php:68
+#: usr/local/www/diag_logs_settings.php:224
+#: usr/local/www/diag_logs_filter.php:123
+#: usr/local/www/diag_logs_routing.php:68
+#: usr/local/www/services_dhcp_edit.php:301
+#: usr/local/www/diag_logs_dhcp.php:59 usr/local/www/diag_logs_dhcp.php:73
+#: usr/local/www/diag_logs.php:79
+#: usr/local/www/diag_logs_filter_dynamic.php:99
+#: usr/local/www/diag_logs_ntpd.php:68 usr/local/www/diag_logs_openvpn.php:72
+#: usr/local/www/diag_logs_ppp.php:70 usr/local/www/diag_logs_gateways.php:81
+#: usr/local/www/diag_logs_relayd.php:69 usr/local/www/diag_logs_vpn.php:128
+#: usr/local/www/diag_logs_ipsec.php:105
+#: usr/local/www/diag_logs_wireless.php:70
+#: usr/local/www/diag_logs_resolver.php:81
+#: usr/local/www/diag_logs_filter_summary.php:187
+#: usr/local/www/interfaces.php:1157
+msgid "DHCP"
+msgstr "DHCP"
+
+#: usr/local/www/diag_logs.php:80 usr/local/www/diag_logs_auth.php:54
+#: usr/local/www/diag_logs_auth.php:68 usr/local/www/diag_logs_dhcp.php:73
+#: usr/local/www/diag_logs_filter.php:104
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_ipsec.php:105 usr/local/www/diag_logs_ntpd.php:68
+#: usr/local/www/diag_logs_openvpn.php:72
+#: usr/local/www/diag_logs_settings.php:213
+#: usr/local/www/diag_logs_vpn.php:129
+#: usr/local/www/diag_logs_filter_summary.php:187
+#: usr/local/www/diag_logs_ppp.php:73 usr/local/www/diag_logs_relayd.php:69
+#: usr/local/www/diag_logs_wireless.php:70
+#: usr/local/www/diag_logs_routing.php:68
+#: usr/local/www/diag_logs_settings.php:218
+#: usr/local/www/diag_logs_resolver.php:81
+#: usr/local/www/diag_logs_gateways.php:81
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_routing.php:69
+#: usr/local/www/diag_logs_settings.php:225
+#: usr/local/www/diag_logs_relayd.php:70 usr/local/www/diag_logs_auth.php:69
+#: usr/local/www/diag_logs_ipsec.php:106
+#: usr/local/www/diag_logs_resolver.php:82 usr/local/www/diag_logs_ntpd.php:69
+#: usr/local/www/diag_logs_dhcp.php:74 usr/local/www/diag_logs_wireless.php:71
+#: usr/local/www/diag_logs_filter_summary.php:188
+#: usr/local/www/diag_logs_gateways.php:82
+#: usr/local/www/diag_logs_openvpn.php:73
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_filter.php:94
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/diag_logs_ppp.php:71 usr/local/www/diag_logs_filter.php:124
+#: usr/local/www/diag_logs_auth.php:54 usr/local/www/diag_logs_auth.php:69
+#: usr/local/www/diag_logs_settings.php:225
+#: usr/local/www/diag_logs_filter.php:124
+#: usr/local/www/diag_logs_routing.php:69 usr/local/www/diag_logs_dhcp.php:74
+#: usr/local/www/diag_logs.php:80
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/diag_logs_ntpd.php:69 usr/local/www/diag_logs_openvpn.php:73
+#: usr/local/www/diag_logs_ppp.php:71 usr/local/www/diag_logs_gateways.php:82
+#: usr/local/www/diag_logs_relayd.php:70 usr/local/www/diag_logs_vpn.php:129
+#: usr/local/www/diag_logs_ipsec.php:106
+#: usr/local/www/diag_logs_wireless.php:71
+#: usr/local/www/diag_logs_resolver.php:82
+#: usr/local/www/diag_logs_filter_summary.php:188
+msgid "Portal Auth"
+msgstr "ポータル認証"
+
+#: usr/local/www/diag_logs.php:81 usr/local/www/diag_logs_auth.php:69
+#: usr/local/www/diag_logs_dhcp.php:74 usr/local/www/diag_logs_filter.php:105
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_ipsec.php:106 usr/local/www/diag_logs_ntpd.php:69
+#: usr/local/www/diag_logs_openvpn.php:73
+#: usr/local/www/diag_logs_settings.php:214
+#: usr/local/www/diag_logs_vpn.php:130
+#: usr/local/www/diag_logs_filter_summary.php:188
+#: usr/local/www/vpn_ipsec.php:119 usr/local/www/diag_logs_ppp.php:74
+#: usr/local/www/diag_logs_relayd.php:70
+#: usr/local/www/vpn_ipsec_mobile.php:220 usr/local/www/diag_ipsec.php:48
+#: usr/local/www/diag_ipsec_sad.php:49 usr/local/www/diag_ipsec_spd.php:49
+#: usr/local/www/fbegin.inc:147 usr/local/www/fbegin.inc:164
+#: usr/local/www/vpn_ipsec_phase1.php:358
+#: usr/local/www/vpn_ipsec_phase1.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:255
+#: usr/local/www/vpn_ipsec_phase2.php:257
+#: usr/local/www/diag_logs_wireless.php:71
+#: usr/local/www/diag_logs_routing.php:69
+#: usr/local/www/diag_logs_settings.php:219 usr/local/www/fbegin.inc:181
+#: usr/local/www/diag_logs_resolver.php:82
+#: usr/local/www/vpn_ipsec_phase2.php:268
+#: usr/local/www/vpn_ipsec_phase2.php:270
+#: usr/local/www/diag_logs_gateways.php:82
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_routing.php:70
+#: usr/local/www/diag_logs_settings.php:226 usr/local/www/fbegin.inc:172
+#: usr/local/www/fbegin.inc:189 usr/local/www/diag_logs_relayd.php:71
+#: usr/local/www/vpn_ipsec_mobile.php:240 usr/local/www/diag_logs_auth.php:70
+#: usr/local/www/diag_logs_ipsec.php:107
+#: usr/local/www/diag_logs_resolver.php:83 usr/local/www/diag_logs_ntpd.php:70
+#: usr/local/www/diag_logs_dhcp.php:75 usr/local/www/diag_logs_wireless.php:72
+#: usr/local/www/diag_logs_filter_summary.php:189
+#: usr/local/www/vpn_ipsec_phase2.php:294
+#: usr/local/www/vpn_ipsec_phase2.php:296
+#: usr/local/www/diag_logs_gateways.php:83
+#: usr/local/www/diag_logs_openvpn.php:74
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_filter.php:95 usr/local/www/vpn_ipsec.php:125
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_ppp.php:72 usr/local/www/fbegin.inc:163
+#: usr/local/www/fbegin.inc:180 usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase1.php:381
+#: usr/local/www/vpn_ipsec_phase2.php:316
+#: usr/local/www/vpn_ipsec_phase2.php:318
+#: usr/local/www/diag_logs_filter.php:125 usr/local/www/diag_logs_auth.php:70
+#: usr/local/www/diag_logs_settings.php:226
+#: usr/local/www/diag_logs_filter.php:125 usr/local/www/vpn_ipsec.php:125
+#: usr/local/www/diag_logs_routing.php:70 usr/local/www/diag_logs_dhcp.php:75
+#: usr/local/www/diag_ipsec.php:48 usr/local/www/diag_logs.php:81
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_ntpd.php:70 usr/local/www/diag_ipsec_spd.php:49
+#: usr/local/www/diag_logs_openvpn.php:74 usr/local/www/diag_logs_ppp.php:72
+#: usr/local/www/diag_logs_gateways.php:83 usr/local/www/fbegin.inc:163
+#: usr/local/www/fbegin.inc:180 usr/local/www/diag_logs_relayd.php:71
+#: usr/local/www/diag_logs_vpn.php:130 usr/local/www/diag_logs_ipsec.php:107
+#: usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase1.php:381
+#: usr/local/www/vpn_ipsec_mobile.php:240 usr/local/www/diag_ipsec_sad.php:49
+#: usr/local/www/vpn_ipsec_phase2.php:316
+#: usr/local/www/vpn_ipsec_phase2.php:318
+#: usr/local/www/diag_logs_wireless.php:72
+#: usr/local/www/diag_logs_resolver.php:83
+#: usr/local/www/diag_logs_filter_summary.php:189
+msgid "IPsec"
+msgstr "IPsecの"
+
+#: usr/local/www/diag_logs.php:82 usr/local/www/diag_logs_auth.php:70
+#: usr/local/www/diag_logs_dhcp.php:75 usr/local/www/diag_logs_filter.php:106
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_ipsec.php:107 usr/local/www/diag_logs_ntpd.php:70
+#: usr/local/www/diag_logs_openvpn.php:74
+#: usr/local/www/diag_logs_settings.php:215
+#: usr/local/www/diag_logs_vpn.php:131 usr/local/www/interfaces.php:1032
+#: usr/local/www/diag_logs_filter_summary.php:189
+#: usr/local/www/diag_logs_ppp.php:59 usr/local/www/diag_logs_ppp.php:75
+#: usr/local/www/diag_logs_relayd.php:71
+#: usr/local/www/status_interfaces.php:154
+#: usr/local/www/diag_logs_wireless.php:72
+#: usr/local/www/diag_logs_routing.php:70
+#: usr/local/www/diag_logs_settings.php:220
+#: usr/local/www/status_interfaces.php:172
+#: usr/local/www/diag_logs_resolver.php:83
+#: usr/local/www/diag_logs_gateways.php:83 usr/local/www/interfaces.php:1118
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_routing.php:71
+#: usr/local/www/diag_logs_settings.php:227
+#: usr/local/www/diag_logs_relayd.php:72
+#: usr/local/www/status_interfaces.php:175 usr/local/www/diag_logs_auth.php:71
+#: usr/local/www/diag_logs_ipsec.php:108
+#: usr/local/www/diag_logs_resolver.php:84 usr/local/www/diag_logs_ntpd.php:71
+#: usr/local/www/diag_logs_dhcp.php:76 usr/local/www/diag_logs_wireless.php:73
+#: usr/local/www/diag_logs_filter_summary.php:190
+#: usr/local/www/diag_logs_gateways.php:84
+#: usr/local/www/diag_logs_openvpn.php:75 usr/local/www/interfaces.php:1106
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_filter.php:96
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_ppp.php:57 usr/local/www/diag_logs_ppp.php:73
+#: usr/local/www/interfaces.php:1120 usr/local/www/diag_logs_filter.php:126
+#: usr/local/www/interfaces.php:1162 usr/local/www/interfaces.php:1157
+#: usr/local/www/diag_logs_auth.php:71
+#: usr/local/www/diag_logs_settings.php:227
+#: usr/local/www/diag_logs_filter.php:126
+#: usr/local/www/diag_logs_routing.php:71 usr/local/www/diag_logs_dhcp.php:76
+#: usr/local/www/diag_logs.php:82
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_ntpd.php:71 usr/local/www/status_interfaces.php:175
+#: usr/local/www/diag_logs_openvpn.php:75 usr/local/www/diag_logs_ppp.php:57
+#: usr/local/www/diag_logs_ppp.php:73 usr/local/www/diag_logs_gateways.php:84
+#: usr/local/www/diag_logs_relayd.php:72 usr/local/www/diag_logs_vpn.php:131
+#: usr/local/www/diag_logs_ipsec.php:108
+#: usr/local/www/diag_logs_wireless.php:73
+#: usr/local/www/diag_logs_resolver.php:84
+#: usr/local/www/diag_logs_filter_summary.php:190
+#: usr/local/www/interfaces.php:1157
+msgid "PPP"
+msgstr "PPP"
+
+#: usr/local/www/diag_logs.php:83 usr/local/www/diag_logs_auth.php:71
+#: usr/local/www/diag_logs_dhcp.php:76 usr/local/www/diag_logs_filter.php:107
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: usr/local/www/diag_logs_ipsec.php:108 usr/local/www/diag_logs_ntpd.php:71
+#: usr/local/www/diag_logs_openvpn.php:75
+#: usr/local/www/diag_logs_settings.php:216 usr/local/www/diag_logs_vpn.php:44
+#: usr/local/www/diag_logs_vpn.php:132
+#: usr/local/www/diag_logs_filter_summary.php:190
+#: usr/local/www/vpn_ipsec.php:119 usr/local/www/diag_logs_ppp.php:76
+#: usr/local/www/diag_logs_relayd.php:72
+#: usr/local/www/vpn_ipsec_mobile.php:220 usr/local/www/vpn_pppoe.php:86
+#: usr/local/www/vpn_pptp.php:193 usr/local/www/vpn_pptp_users.php:71
+#: usr/local/www/vpn_pptp_users_edit.php:135 usr/local/www/fbegin.inc:351
+#: usr/local/www/status_rrd_graph_settings.php:151
+#: usr/local/www/vpn_ipsec_phase1.php:358
+#: usr/local/www/vpn_ipsec_phase1.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:255
+#: usr/local/www/vpn_ipsec_phase2.php:257 usr/local/www/vpn_l2tp.php:38
+#: usr/local/www/vpn_l2tp_users.php:38
+#: usr/local/www/vpn_l2tp_users_edit.php:38
+#: usr/local/www/diag_logs_wireless.php:73
+#: usr/local/www/diag_logs_routing.php:71
+#: usr/local/www/diag_logs_settings.php:221 usr/local/www/fbegin.inc:369
+#: usr/local/www/status_rrd_graph_settings.php:152
+#: usr/local/www/diag_logs_resolver.php:84
+#: usr/local/www/vpn_ipsec_phase2.php:268
+#: usr/local/www/vpn_ipsec_phase2.php:270
+#: usr/local/www/diag_logs_gateways.php:84
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_routing.php:72
+#: usr/local/www/diag_logs_settings.php:228 usr/local/www/fbegin.inc:315
+#: usr/local/www/diag_logs_relayd.php:73
+#: usr/local/www/vpn_ipsec_mobile.php:240 usr/local/www/diag_logs_auth.php:72
+#: usr/local/www/diag_logs_ipsec.php:109
+#: usr/local/www/diag_logs_resolver.php:85 usr/local/www/diag_logs_ntpd.php:72
+#: usr/local/www/diag_logs_dhcp.php:77 usr/local/www/diag_logs_wireless.php:74
+#: usr/local/www/diag_logs_filter_summary.php:191
+#: usr/local/www/vpn_ipsec_phase2.php:294
+#: usr/local/www/vpn_ipsec_phase2.php:296
+#: usr/local/www/diag_logs_gateways.php:85
+#: usr/local/www/diag_logs_openvpn.php:76
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_filter.php:97 usr/local/www/vpn_pppoe.php:87
+#: usr/local/www/vpn_ipsec.php:125
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_ppp.php:74 usr/local/www/vpn_pptp.php:196
+#: usr/local/www/fbegin.inc:307 usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase1.php:381
+#: usr/local/www/vpn_ipsec_phase2.php:316
+#: usr/local/www/vpn_ipsec_phase2.php:318
+#: usr/local/www/diag_logs_filter.php:127 usr/local/www/vpn_l2tp.php:38
+#: usr/local/www/vpn_pppoe.php:87 usr/local/www/diag_logs_auth.php:72
+#: usr/local/www/diag_logs_settings.php:228
+#: usr/local/www/vpn_pptp_users.php:71 usr/local/www/diag_logs_filter.php:127
+#: usr/local/www/vpn_ipsec.php:125 usr/local/www/diag_logs_routing.php:72
+#: usr/local/www/diag_logs_dhcp.php:77
+#: usr/local/www/status_rrd_graph_settings.php:152
+#: usr/local/www/diag_logs.php:83
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_ntpd.php:72 usr/local/www/vpn_l2tp_users.php:38
+#: usr/local/www/diag_logs_openvpn.php:76 usr/local/www/diag_logs_ppp.php:74
+#: usr/local/www/diag_logs_gateways.php:85 usr/local/www/vpn_pptp.php:196
+#: usr/local/www/vpn_l2tp_users_edit.php:38 usr/local/www/fbegin.inc:307
+#: usr/local/www/diag_logs_relayd.php:73 usr/local/www/diag_logs_vpn.php:44
+#: usr/local/www/diag_logs_vpn.php:132
+#: usr/local/www/vpn_pptp_users_edit.php:135
+#: usr/local/www/diag_logs_ipsec.php:109
+#: usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase1.php:381
+#: usr/local/www/vpn_ipsec_mobile.php:240
+#: usr/local/www/vpn_ipsec_phase2.php:316
+#: usr/local/www/vpn_ipsec_phase2.php:318
+#: usr/local/www/diag_logs_wireless.php:74
+#: usr/local/www/diag_logs_resolver.php:85
+#: usr/local/www/diag_logs_filter_summary.php:191
+msgid "VPN"
+msgstr "VPN"
+
+#: usr/local/www/diag_logs.php:85 usr/local/www/diag_logs_auth.php:73
+#: usr/local/www/diag_logs_dhcp.php:78 usr/local/www/diag_logs_filter.php:109
+#: usr/local/www/diag_logs_filter_dynamic.php:108
+#: usr/local/www/diag_logs_ipsec.php:110 usr/local/www/diag_logs_ntpd.php:73
+#: usr/local/www/diag_logs_openvpn.php:45
+#: usr/local/www/diag_logs_openvpn.php:77
+#: usr/local/www/diag_logs_settings.php:218
+#: usr/local/www/diag_logs_vpn.php:134
+#: usr/local/www/diag_packet_capture.php:130 usr/local/www/diag_backup.php:112
+#: usr/local/www/license.php:213
+#: usr/local/www/diag_logs_filter_summary.php:192
+#: usr/local/www/diag_logs_ppp.php:78 usr/local/www/diag_logs_relayd.php:74
+#: usr/local/www/status_graph.php:66 usr/local/www/fbegin.inc:148
+#: usr/local/www/fbegin.inc:166 usr/local/www/status_services.php:343
+#: usr/local/www/status_openvpn.php:46 usr/local/www/vpn_openvpn_client.php:40
+#: usr/local/www/vpn_openvpn_csc.php:40
+#: usr/local/www/vpn_openvpn_server.php:40
+#: usr/local/www/widgets/widgets/services_status.widget.php:148
+#: usr/local/www/diag_logs_wireless.php:75
+#: usr/local/www/diag_logs_routing.php:73
+#: usr/local/www/diag_logs_settings.php:223 usr/local/www/fbegin.inc:165
+#: usr/local/www/fbegin.inc:184 usr/local/www/diag_backup.php:189
+#: usr/local/www/diag_logs_resolver.php:86
+#: usr/local/www/diag_packet_capture.php:134
+#: usr/local/www/diag_logs_gateways.php:86
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: etc/inc/service-utils.inc:333 usr/local/www/diag_logs_routing.php:74
+#: usr/local/www/diag_logs_settings.php:230 usr/local/www/fbegin.inc:173
+#: usr/local/www/fbegin.inc:192 usr/local/www/diag_logs_relayd.php:75
+#: usr/local/www/diag_logs_auth.php:74 usr/local/www/diag_logs_ipsec.php:111
+#: usr/local/www/diag_logs_resolver.php:87 usr/local/www/diag_logs_ntpd.php:74
+#: usr/local/www/diag_logs_dhcp.php:79 usr/local/www/diag_logs_wireless.php:76
+#: usr/local/www/vpn_openvpn_server.php:423
+#: usr/local/www/diag_logs_filter_summary.php:193
+#: usr/local/www/diag_packet_capture.php:64
+#: usr/local/www/diag_logs_gateways.php:87
+#: usr/local/www/diag_logs_openvpn.php:78
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_filter.php:99
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_ppp.php:76 usr/local/www/fbegin.inc:164
+#: usr/local/www/fbegin.inc:183 usr/local/www/vpn_openvpn_server.php:445
+#: etc/inc/service-utils.inc:332 usr/local/www/diag_logs_filter.php:129
+#: etc/inc/system.inc:1627 etc/inc/service-utils.inc:349
+#: etc/inc/system.inc:1635 usr/local/www/diag_logs_auth.php:74
+#: usr/local/www/diag_logs_settings.php:230
+#: usr/local/www/vpn_openvpn_client.php:40 usr/local/www/status_openvpn.php:46
+#: usr/local/www/diag_logs_filter.php:129 usr/local/www/vpn_openvpn_csc.php:40
+#: usr/local/www/diag_logs_routing.php:74 usr/local/www/status_graph.php:66
+#: usr/local/www/diag_logs_dhcp.php:79
+#: usr/local/www/diag_packet_capture.php:64 usr/local/www/diag_logs.php:85
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_ntpd.php:74 usr/local/www/license.php:213
+#: usr/local/www/diag_logs_openvpn.php:45
+#: usr/local/www/diag_logs_openvpn.php:78 usr/local/www/diag_logs_ppp.php:76
+#: usr/local/www/diag_logs_gateways.php:87 usr/local/www/diag_backup.php:189
+#: usr/local/www/fbegin.inc:164 usr/local/www/fbegin.inc:183
+#: usr/local/www/diag_logs_relayd.php:75 usr/local/www/diag_logs_vpn.php:134
+#: usr/local/www/diag_logs_ipsec.php:111
+#: usr/local/www/vpn_openvpn_server.php:445
+#: usr/local/www/diag_logs_wireless.php:76
+#: usr/local/www/diag_logs_resolver.php:87
+#: usr/local/www/diag_logs_filter_summary.php:193 etc/inc/system.inc:1694
+#: etc/inc/service-utils.inc:349
+msgid "OpenVPN"
+msgstr "OpenVPNの"
+
+#: usr/local/www/diag_logs.php:86 usr/local/www/diag_logs_auth.php:74
+#: usr/local/www/diag_logs_dhcp.php:79 usr/local/www/diag_logs_filter.php:110
+#: usr/local/www/diag_logs_filter_dynamic.php:109
+#: usr/local/www/diag_logs_ipsec.php:111 usr/local/www/diag_logs_ntpd.php:54
+#: usr/local/www/diag_logs_ntpd.php:74 usr/local/www/diag_logs_openvpn.php:78
+#: usr/local/www/diag_logs_settings.php:219
+#: usr/local/www/diag_logs_vpn.php:135
+#: usr/local/www/diag_logs_filter_summary.php:193
+#: usr/local/www/diag_logs_ppp.php:79 usr/local/www/diag_logs_relayd.php:75
+#: usr/local/www/fbegin.inc:141 usr/local/www/diag_logs_wireless.php:76
+msgid "OpenNTPD"
+msgstr "OpenNTPD"
+
+#: usr/local/www/diag_logs.php:87 usr/local/www/diag_logs_auth.php:75
+#: usr/local/www/diag_logs_dhcp.php:80 usr/local/www/diag_logs_filter.php:111
+#: usr/local/www/diag_logs_filter_dynamic.php:110
+#: usr/local/www/diag_logs_ipsec.php:112 usr/local/www/diag_logs_ntpd.php:75
+#: usr/local/www/diag_logs_openvpn.php:79
+#: usr/local/www/diag_logs_settings.php:220
+#: usr/local/www/diag_logs_vpn.php:136 usr/local/www/interfaces_bridge.php:91
+#: usr/local/www/interfaces_gif.php:90 usr/local/www/interfaces_gre.php:91
+#: usr/local/www/interfaces_groups.php:77
+#: usr/local/www/interfaces_assign.php:404
+#: usr/local/www/status_wireless.php:41 usr/local/www/interfaces_vlan.php:92
+#: usr/local/www/diag_logs_filter_summary.php:194
+#: usr/local/www/diag_logs_ppp.php:80 usr/local/www/diag_logs_relayd.php:76
+#: usr/local/www/interfaces_lagg.php:96 usr/local/www/interfaces_ppps.php:92
+#: usr/local/www/interfaces_qinq.php:100
+#: usr/local/www/interfaces_wireless.php:76
+#: usr/local/www/interfaces_wireless.php:90
+#: usr/local/www/interfaces_wireless_edit.php:145 usr/local/www/fbegin.inc:183
+#: usr/local/www/status_rrd_graph.php:344
+#: usr/local/www/status_rrd_graph_settings.php:143
+#: usr/local/www/diag_logs_wireless.php:56
+#: usr/local/www/diag_logs_wireless.php:77
+#: usr/local/www/diag_logs_routing.php:86 usr/local/www/fbegin.inc:201
+#: usr/local/www/status_rrd_graph_settings.php:144
+#: usr/local/www/diag_logs_resolver.php:100 usr/local/www/diag_logs.php:99
+#: usr/local/www/status_rrd_graph.php:392
+#: usr/local/www/diag_logs_wireless.php:88
+#: usr/local/www/diag_logs_gateways.php:100
+#: usr/local/www/diag_logs_filter_dynamic.php:108
+#: usr/local/www/diag_logs_routing.php:87 usr/local/www/fbegin.inc:209
+#: usr/local/www/interfaces_groups.php:78
+#: usr/local/www/interfaces_qinq.php:101 usr/local/www/interfaces_ppps.php:93
+#: usr/local/www/interfaces_bridge.php:92
+#: usr/local/www/diag_logs_resolver.php:101
+#: usr/local/www/interfaces_lagg.php:97 usr/local/www/interfaces_gre.php:92
+#: usr/local/www/interfaces_wireless.php:91
+#: usr/local/www/diag_logs_wireless.php:89
+#: usr/local/www/interfaces_assign.php:398
+#: usr/local/www/diag_logs_gateways.php:101
+#: usr/local/www/interfaces_vlan.php:93
+#: usr/local/www/diag_logs_filter_dynamic.php:109
+#: usr/local/www/interfaces_gif.php:91
+#: usr/local/www/interfaces_wireless_edit.php:147
+#: usr/local/www/interfaces_qinq.php:104 usr/local/www/interfaces_lagg.php:101
+#: usr/local/www/interfaces_vlan.php:99 usr/local/www/status_rrd_graph.php:417
+#: usr/local/www/interfaces_bridge.php:98
+#: usr/local/www/interfaces_wireless.php:78
+#: usr/local/www/interfaces_wireless.php:93 usr/local/www/fbegin.inc:200
+#: usr/local/www/interfaces_gre.php:96 usr/local/www/interfaces_gif.php:95
+#: usr/local/www/status_wireless.php:41
+#: usr/local/www/interfaces_wireless_edit.php:147
+#: usr/local/www/interfaces_qinq.php:104
+#: usr/local/www/diag_logs_routing.php:87
+#: usr/local/www/interfaces_lagg.php:101 usr/local/www/interfaces_vlan.php:99
+#: usr/local/www/status_rrd_graph.php:417
+#: usr/local/www/status_rrd_graph_settings.php:144
+#: usr/local/www/diag_logs.php:99 usr/local/www/interfaces_bridge.php:98
+#: usr/local/www/interfaces_wireless.php:78
+#: usr/local/www/interfaces_wireless.php:93
+#: usr/local/www/interfaces_groups.php:78 usr/local/www/interfaces_ppps.php:93
+#: usr/local/www/diag_logs_gateways.php:101 usr/local/www/fbegin.inc:200
+#: usr/local/www/interfaces_gre.php:96 usr/local/www/interfaces_gif.php:95
+#: usr/local/www/interfaces_assign.php:404
+#: usr/local/www/diag_logs_wireless.php:56
+#: usr/local/www/diag_logs_wireless.php:89
+#: usr/local/www/diag_logs_resolver.php:101
+msgid "Wireless"
+msgstr "ワイヤレス"
+
+#: usr/local/www/diag_logs.php:88 usr/local/www/diag_logs_auth.php:76
+#: usr/local/www/diag_logs_dhcp.php:81 usr/local/www/diag_logs_filter.php:112
+#: usr/local/www/diag_logs_filter_dynamic.php:111
+#: usr/local/www/diag_logs_ipsec.php:113 usr/local/www/diag_logs_ntpd.php:76
+#: usr/local/www/diag_logs_openvpn.php:80
+#: usr/local/www/diag_logs_settings.php:132
+#: usr/local/www/diag_logs_settings.php:221
+#: usr/local/www/diag_logs_vpn.php:137
+#: usr/local/www/system_firmware_settings.php:74
+#: usr/local/www/diag_logs_filter_summary.php:195
+#: usr/local/www/diag_logs_ppp.php:81 usr/local/www/diag_logs_relayd.php:77
+#: usr/local/www/status_rrd_graph.php:361
+#: usr/local/www/status_rrd_graph_settings.php:160
+#: usr/local/www/system_authservers.php:423
+#: usr/local/www/system_groupmanager.php:242
+#: usr/local/www/system_groupmanager_addprivs.php:170
+#: usr/local/www/system_usermanager.php:442
+#: usr/local/www/system_usermanager_addprivs.php:169
+#: usr/local/www/system_usermanager_settings.php:115
+#: usr/local/www/diag_logs_wireless.php:78
+#: usr/local/www/diag_logs_routing.php:75
+#: usr/local/www/diag_logs_settings.php:136
+#: usr/local/www/diag_logs_settings.php:225
+#: usr/local/www/diag_logs_relayd.php:76
+#: usr/local/www/load_balancer_setting.php:98
+#: usr/local/www/load_balancer_setting.php:122
+#: usr/local/www/status_rrd_graph_settings.php:161
+#: usr/local/www/diag_logs_auth.php:75 usr/local/www/diag_logs_ipsec.php:112
+#: usr/local/www/system_usermanager.php:440
+#: usr/local/www/diag_logs_vpn.php:136 usr/local/www/diag_logs_ppp.php:80
+#: usr/local/www/diag_logs_resolver.php:88 usr/local/www/diag_logs_ntpd.php:75
+#: usr/local/www/diag_logs.php:87 usr/local/www/status_rrd_graph.php:409
+#: usr/local/www/load_balancer_virtual_server.php:118
+#: usr/local/www/system_groupmanager_addprivs.php:168
+#: usr/local/www/diag_logs_dhcp.php:80 usr/local/www/diag_logs_wireless.php:77
+#: usr/local/www/load_balancer_monitor.php:112
+#: usr/local/www/diag_logs_filter_summary.php:194
+#: usr/local/www/diag_logs_gateways.php:88
+#: usr/local/www/diag_logs_openvpn.php:79
+#: usr/local/www/diag_logs_filter_dynamic.php:109
+#: usr/local/www/load_balancer_pool.php:121
+#: usr/local/www/diag_logs_filter.php:111
+#: usr/local/www/diag_logs_routing.php:76
+#: usr/local/www/diag_logs_settings.php:143
+#: usr/local/www/diag_logs_settings.php:232
+#: usr/local/www/load_balancer_setting.php:121
+#: usr/local/www/diag_logs_resolver.php:89
+#: usr/local/www/load_balancer_virtual_server.php:116
+#: usr/local/www/load_balancer_monitor.php:110
+#: usr/local/www/system_firmware_settings.php:79
+#: usr/local/www/diag_logs_gateways.php:89
+#: usr/local/www/diag_logs_filter_dynamic.php:110
+#: usr/local/www/load_balancer_pool.php:119
+#: usr/local/www/system_authservers.php:428
+#: usr/local/www/diag_logs_filter.php:101
+#: usr/local/www/status_rrd_graph.php:434
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_ppp.php:78 usr/local/www/system_authservers.php:435
+#: usr/local/www/diag_logs_filter.php:131
+#: usr/local/www/system_usermanager_settings.php:117
+#: usr/local/www/diag_logs_auth.php:76
+#: usr/local/www/system_groupmanager.php:242
+#: usr/local/www/diag_logs_settings.php:143
+#: usr/local/www/diag_logs_settings.php:232
+#: usr/local/www/system_usermanager_addprivs.php:169
+#: usr/local/www/diag_logs_filter.php:131
+#: usr/local/www/system_firmware_settings.php:79
+#: usr/local/www/diag_logs_routing.php:76 usr/local/www/diag_logs_dhcp.php:81
+#: usr/local/www/status_rrd_graph.php:434
+#: usr/local/www/status_rrd_graph_settings.php:161
+#: usr/local/www/diag_logs.php:87
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_ntpd.php:76 usr/local/www/diag_logs_openvpn.php:80
+#: usr/local/www/load_balancer_setting.php:98
+#: usr/local/www/load_balancer_setting.php:121
+#: usr/local/www/diag_logs_ppp.php:78 usr/local/www/load_balancer_pool.php:119
+#: usr/local/www/diag_logs_gateways.php:89
+#: usr/local/www/system_authservers.php:435
+#: usr/local/www/system_groupmanager_addprivs.php:168
+#: usr/local/www/system_usermanager_settings.php:117
+#: usr/local/www/diag_logs_relayd.php:77 usr/local/www/diag_logs_vpn.php:136
+#: usr/local/www/diag_logs_ipsec.php:113
+#: usr/local/www/load_balancer_monitor.php:110
+#: usr/local/www/system_usermanager.php:440
+#: usr/local/www/load_balancer_virtual_server.php:116
+#: usr/local/www/diag_logs_wireless.php:78
+#: usr/local/www/diag_logs_resolver.php:89
+#: usr/local/www/diag_logs_filter_summary.php:195
+msgid "Settings"
+msgstr "セッティング"
+
+#: usr/local/www/diag_logs.php:98 usr/local/www/diag_logs_resolver.php:110
+#: usr/local/www/diag_logs.php:109 usr/local/www/diag_logs_gateways.php:110
+#: usr/local/www/diag_logs_resolver.php:111
+#: usr/local/www/diag_logs_gateways.php:111 usr/local/www/diag_logs.php:109
+#: usr/local/www/diag_logs_gateways.php:111
+#: usr/local/www/diag_logs_resolver.php:111
+#, php-format
+msgid "Last %s system log entries"
+msgstr "最後%sシステムログエントリ"
+
+#: usr/local/www/diag_logs.php:109 usr/local/www/diag_logs_auth.php:90
+#: usr/local/www/diag_logs_dhcp.php:95 usr/local/www/diag_logs_filter.php:208
+#: usr/local/www/diag_logs_ipsec.php:150 usr/local/www/diag_logs_ntpd.php:91
+#: usr/local/www/diag_logs_openvpn.php:97 usr/local/www/diag_logs_vpn.php:188
+#: usr/local/www/diag_logs_ppp.php:114 usr/local/www/diag_logs_relayd.php:91
+#: usr/local/www/diag_logs_wireless.php:92
+#: usr/local/www/diag_logs_routing.php:101
+#: usr/local/www/diag_logs_relayd.php:90 usr/local/www/diag_logs_auth.php:89
+#: usr/local/www/diag_logs_ipsec.php:149 usr/local/www/diag_logs_vpn.php:187
+#: usr/local/www/diag_logs_ppp.php:113
+#: usr/local/www/diag_logs_resolver.php:121
+#: usr/local/www/diag_logs_ntpd.php:90 usr/local/www/diag_logs.php:120
+#: usr/local/www/diag_logs_dhcp.php:94
+#: usr/local/www/diag_logs_wireless.php:103
+#: usr/local/www/diag_logs_gateways.php:121
+#: usr/local/www/diag_logs_openvpn.php:96
+#: usr/local/www/diag_logs_filter.php:205
+#: usr/local/www/diag_logs_routing.php:102
+#: usr/local/www/diag_logs_resolver.php:122
+#: usr/local/www/diag_logs_wireless.php:104
+#: usr/local/www/diag_logs_gateways.php:122
+#: usr/local/www/diag_logs_filter.php:264 usr/local/www/diag_logs_ppp.php:95
+#: usr/local/www/diag_logs_ipsec.php:151
+#: usr/local/www/diag_logs_filter.php:398 usr/local/www/diag_logs_auth.php:90
+#: usr/local/www/diag_logs_filter.php:398
+#: usr/local/www/diag_logs_routing.php:102 usr/local/www/diag_logs_dhcp.php:95
+#: usr/local/www/diag_logs.php:120 usr/local/www/diag_logs_ntpd.php:91
+#: usr/local/www/diag_logs_openvpn.php:97 usr/local/www/diag_logs_ppp.php:95
+#: usr/local/www/diag_logs_gateways.php:122
+#: usr/local/www/diag_logs_relayd.php:91 usr/local/www/diag_logs_vpn.php:187
+#: usr/local/www/diag_logs_ipsec.php:151
+#: usr/local/www/diag_logs_wireless.php:104
+#: usr/local/www/diag_logs_resolver.php:122
+msgid "Clear log"
+msgstr "ログの消去"
+
+#: usr/local/www/diag_logs.php:115 usr/local/www/diag_logs_filter.php:128
+#: usr/local/www/diag_dump_states.php:138
+#: usr/local/www/diag_dump_states_sources.php:133
+#: usr/local/www/diag_logs_resolver.php:127 usr/local/www/diag_logs.php:126
+#: usr/local/www/diag_dump_states.php:153
+#: usr/local/www/diag_logs_gateways.php:127
+#: usr/local/www/diag_logs_filter.php:127
+#: usr/local/www/diag_logs_resolver.php:128
+#: usr/local/www/diag_dump_states_sources.php:132
+#: usr/local/www/diag_dump_states.php:152
+#: usr/local/www/diag_logs_gateways.php:128
+#: usr/local/www/diag_logs_filter.php:147
+#: usr/local/www/diag_logs_filter.php:197
+#: usr/local/www/diag_logs_filter.php:260
+#: usr/local/www/diag_dump_states.php:141
+#: usr/local/www/diag_logs_filter.php:197
+#: usr/local/www/diag_logs_filter.php:260
+#: usr/local/www/diag_dump_states.php:141
+#: usr/local/www/diag_dump_states_sources.php:132
+#: usr/local/www/diag_logs.php:126 usr/local/www/diag_logs_gateways.php:128
+#: usr/local/www/diag_logs_resolver.php:128
+msgid "Filter"
+msgstr "フィルター"
+
+#: usr/local/www/diag_logs_auth.php:86 usr/local/www/diag_logs_auth.php:85
+#: usr/local/www/diag_logs_auth.php:86
+#, php-format
+msgid "Last %s Portal Auth log entries"
+msgstr "最後%sポータル認証ログエントリ"
+
+#: usr/local/www/diag_logs_dhcp.php:91 usr/local/www/diag_logs_dhcp.php:90
+#: usr/local/www/diag_logs_dhcp.php:91
+#, php-format
+msgid "Last %s DHCP service log entries"
+msgstr "最後%s DHCPサービスのログエントリ"
+
+#: usr/local/www/diag_logs_filter.php:56 usr/local/www/diag_logs_filter.php:63
+#: usr/local/www/diag_logs_filter.php:63
+msgid "The rule that triggered this action is"
+msgstr "このアクションをトリガしたルールがある"
+
+#: usr/local/www/diag_logs_filter.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:119
+#: usr/local/www/diag_logs_filter_summary.php:204
+#: usr/local/www/diag_logs_filter_summary.php:203
+#: usr/local/www/diag_logs_filter_dynamic.php:117
+#: usr/local/www/diag_logs_filter.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter.php:152
+#: usr/local/www/diag_logs_filter.php:274
+#: usr/local/www/diag_logs_filter.php:274
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter_summary.php:204
+msgid "Normal View"
+msgstr "通常のビュー"
+
+#: usr/local/www/diag_logs_filter.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:119
+#: usr/local/www/diag_logs_filter_summary.php:204
+#: usr/local/www/diag_logs_filter_summary.php:203
+#: usr/local/www/diag_logs_filter_dynamic.php:117
+#: usr/local/www/diag_logs_filter.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter.php:152
+#: usr/local/www/diag_logs_filter.php:274
+#: usr/local/www/diag_logs_filter.php:274
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter_summary.php:204
+msgid "Dynamic View"
+msgstr "動的ビュー"
+
+#: usr/local/www/diag_logs_filter.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:119
+#: usr/local/www/diag_logs_filter_summary.php:204
+#: usr/local/www/diag_logs_filter_summary.php:203
+#: usr/local/www/diag_logs_filter_dynamic.php:117
+#: usr/local/www/diag_logs_filter.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter.php:152
+#: usr/local/www/diag_logs_filter.php:274
+#: usr/local/www/diag_logs_filter.php:274
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter_summary.php:204
+msgid "Summary View"
+msgstr "概要ビュー"
+
+#: usr/local/www/diag_logs_filter.php:139
+#: usr/local/www/diag_logs_filter.php:138
+#: usr/local/www/diag_logs_filter.php:170
+#: usr/local/www/diag_logs_filter.php:296
+#: usr/local/www/diag_logs_filter.php:296
+#, php-format
+msgid "Last %s firewall log entries."
+msgstr "最後%sはログエントリをファイアウォール。"
+
+#: usr/local/www/diag_logs_filter.php:141
+#: usr/local/www/diag_logs_filter.php:140
+#: usr/local/www/diag_logs_filter.php:172
+#: usr/local/www/diag_logs_filter.php:298
+#: usr/local/www/diag_logs_filter.php:298
+msgid "matched log entries."
+msgstr "一致したログエントリ。"
+
+#: usr/local/www/diag_logs_filter.php:143
+#: usr/local/www/diag_logs_filter.php:142
+#: usr/local/www/diag_logs_filter.php:173
+#: usr/local/www/diag_logs_filter.php:299
+#: usr/local/www/diag_logs_filter.php:299
+#, php-format
+msgid "Max(%s)"
+msgstr "マックス( %s )"
+
+#: usr/local/www/diag_logs_filter.php:146
+#: usr/local/www/diag_logs_filter_dynamic.php:126
+#: usr/local/www/diag_logs_filter_dynamic.php:124
+#: usr/local/www/diag_logs_filter.php:145
+#: usr/local/www/diag_logs_filter_dynamic.php:125
+#: usr/local/www/diag_logs_filter.php:177
+#: usr/local/www/diag_logs_filter_dynamic.php:128
+#: usr/local/www/widgets/widgets/log.widget.php:163
+#: usr/local/www/diag_logs_filter.php:303
+#: usr/local/www/widgets/widgets/log.widget.php:167
+#: usr/local/www/diag_logs_filter.php:303
+#: usr/local/www/diag_logs_filter_dynamic.php:128
+#: usr/local/www/widgets/widgets/log.widget.php:174
+msgid "Act"
+msgstr "行為"
+
+#: usr/local/www/diag_logs_filter.php:147
+#: usr/local/www/diag_logs_filter_dynamic.php:127
+#: usr/local/www/diag_logs_vpn.php:175
+#: usr/local/www/firewall_schedule_edit.php:910
+#: usr/local/www/diag_logs_vpn.php:174
+#: usr/local/www/diag_logs_filter_dynamic.php:125
+#: usr/local/www/diag_logs_filter.php:146
+#: usr/local/www/firewall_schedule_edit.php:909
+#: usr/local/www/diag_logs_filter_dynamic.php:126
+#: usr/local/www/diag_logs_filter.php:178
+#: usr/local/www/diag_logs_filter_dynamic.php:129
+#: usr/local/www/diag_system_pftop.php:143
+#: usr/local/www/diag_logs_filter.php:159
+#: usr/local/www/diag_logs_filter.php:304
+#: usr/local/www/diag_logs_filter.php:159
+#: usr/local/www/diag_logs_filter.php:304
+#: usr/local/www/firewall_schedule_edit.php:909
+#: usr/local/www/diag_logs_filter_dynamic.php:129
+#: usr/local/www/diag_system_pftop.php:143 usr/local/www/diag_logs_vpn.php:174
+#: usr/local/www/widgets/widgets/log.widget.php:175
+msgid "Time"
+msgstr "時間"
+
+#: usr/local/www/diag_logs_filter.php:148
+#: usr/local/www/diag_logs_filter_dynamic.php:128
+#: usr/local/www/firewall_nat.php:195
+#: usr/local/www/diag_logs_filter_dynamic.php:126
+#: usr/local/www/diag_logs_filter.php:147 usr/local/www/firewall_nat.php:200
+#: usr/local/www/diag_logs_filter_dynamic.php:127
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter_dynamic.php:130
+#: usr/local/www/diag_logs_filter.php:305 usr/local/www/firewall_nat.php:203
+#: usr/local/www/diag_logs_filter.php:305
+#: usr/local/www/diag_logs_filter_dynamic.php:130
+#: usr/local/www/firewall_nat.php:203
+msgid "If"
+msgstr "もし"
+
+#: usr/local/www/diag_logs_filter.php:149
+#: usr/local/www/diag_logs_filter_dynamic.php:129
+#: usr/local/www/firewall_nat_edit.php:529
+#: usr/local/www/firewall_nat_edit.php:535
+#: usr/local/www/firewall_nat_out.php:342
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:468
+#: usr/local/www/firewall_rules.php:364
+#: usr/local/www/firewall_rules_edit.php:855
+#: usr/local/www/vpn_ipsec_mobile.php:356
+#: usr/local/www/vpn_ipsec_mobile.php:377 usr/local/www/diag_ipsec_sad.php:87
+#: usr/local/www/diag_ipsec_spd.php:86 usr/local/www/firewall_nat_out.php:352
+#: usr/local/www/firewall_nat_out_edit.php:481
+#: usr/local/www/firewall_rules_edit.php:890
+#: usr/local/www/firewall_rules.php:368
+#: usr/local/www/firewall_nat_edit.php:536
+#: usr/local/www/firewall_nat_edit.php:542
+#: usr/local/www/diag_logs_filter_dynamic.php:127
+#: usr/local/www/diag_logs_filter.php:148
+#: usr/local/www/firewall_nat_out.php:353
+#: usr/local/www/vpn_ipsec_mobile.php:383
+#: usr/local/www/vpn_ipsec_mobile.php:401 usr/local/www/diag_ipsec_sad.php:88
+#: usr/local/www/firewall_rules.php:361
+#: usr/local/www/firewall_nat_edit.php:541
+#: usr/local/www/diag_logs_filter_dynamic.php:128
+#: usr/local/www/diag_ipsec_spd.php:87 usr/local/www/diag_logs_filter.php:183
+#: usr/local/www/firewall_rules_edit.php:893
+#: usr/local/www/firewall_nat_edit.php:530
+#: usr/local/www/diag_logs_filter_dynamic.php:131
+#: usr/local/www/widgets/widgets/log.widget.php:165
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:485
+#: usr/local/www/firewall_rules_edit.php:905
+#: usr/local/www/diag_logs_filter.php:309
+#: usr/local/www/firewall_nat_edit.php:548
+#: usr/local/www/firewall_nat_out.php:360 usr/local/www/firewall_rules.php:359
+#: usr/local/www/widgets/widgets/log.widget.php:169
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:497
+#: usr/local/www/firewall_rules_edit.php:904
+#: usr/local/www/firewall_nat_edit.php:543
+#: usr/local/www/firewall_nat_edit.php:549
+#: usr/local/www/firewall_nat_out.php:359
+#: usr/local/www/firewall_rules_edit.php:904
+#: usr/local/www/diag_logs_filter.php:309
+#: usr/local/www/firewall_nat_edit.php:543
+#: usr/local/www/firewall_nat_edit.php:549
+#: usr/local/www/diag_logs_filter_dynamic.php:131
+#: usr/local/www/diag_ipsec_spd.php:87 usr/local/www/firewall_nat_out.php:359
+#: usr/local/www/firewall_rules.php:359
+#: usr/local/www/widgets/widgets/log.widget.php:177
+#: usr/local/www/vpn_ipsec_mobile.php:383
+#: usr/local/www/vpn_ipsec_mobile.php:401
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:497
+#: usr/local/www/diag_ipsec_sad.php:88
+msgid "Source"
+msgstr "ソース"
+
+#: usr/local/www/diag_logs_filter.php:150
+#: usr/local/www/diag_logs_filter_dynamic.php:130
+#: usr/local/www/firewall_nat_1to1_edit.php:383
+#: usr/local/www/firewall_nat_edit.php:624
+#: usr/local/www/firewall_nat_out.php:344
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:498
+#: usr/local/www/firewall_rules.php:366
+#: usr/local/www/firewall_rules_edit.php:948
+#: usr/local/www/diag_ipsec_sad.php:88 usr/local/www/diag_ipsec_spd.php:87
+#: usr/local/www/firewall_nat_out.php:354
+#: usr/local/www/firewall_nat_1to1_edit.php:390
+#: usr/local/www/firewall_nat_out_edit.php:511
+#: usr/local/www/firewall_rules_edit.php:983
+#: usr/local/www/firewall_rules.php:370
+#: usr/local/www/firewall_nat_edit.php:631
+#: usr/local/www/diag_logs_filter_dynamic.php:128
+#: usr/local/www/diag_logs_filter.php:149
+#: usr/local/www/firewall_nat_out.php:355
+#: usr/local/www/firewall_nat_1to1_edit.php:388
+#: usr/local/www/diag_ipsec_sad.php:89 usr/local/www/firewall_rules.php:363
+#: usr/local/www/firewall_nat_edit.php:630
+#: usr/local/www/diag_logs_filter_dynamic.php:129
+#: usr/local/www/diag_ipsec_spd.php:88 usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/firewall_rules_edit.php:992
+#: usr/local/www/firewall_nat_edit.php:625
+#: usr/local/www/diag_logs_filter_dynamic.php:132
+#: usr/local/www/widgets/widgets/log.widget.php:166
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:515
+#: usr/local/www/firewall_rules_edit.php:1005
+#: usr/local/www/diag_logs_filter.php:310
+#: usr/local/www/firewall_nat_edit.php:637
+#: usr/local/www/firewall_nat_out.php:362 usr/local/www/firewall_rules.php:361
+#: usr/local/www/widgets/widgets/log.widget.php:170
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:527
+#: usr/local/www/firewall_rules_edit.php:1004
+#: usr/local/www/firewall_nat_edit.php:638
+#: usr/local/www/firewall_nat_out.php:361
+#: usr/local/www/firewall_nat_1to1_edit.php:389
+#: usr/local/www/firewall_nat_out_edit.php:528
+#: usr/local/www/firewall_rules_edit.php:1004
+#: usr/local/www/diag_logs_filter.php:310
+#: usr/local/www/firewall_nat_edit.php:638
+#: usr/local/www/diag_logs_filter_dynamic.php:132
+#: usr/local/www/diag_ipsec_spd.php:88 usr/local/www/firewall_nat_out.php:361
+#: usr/local/www/firewall_rules.php:361
+#: usr/local/www/firewall_nat_1to1_edit.php:389
+#: usr/local/www/widgets/widgets/log.widget.php:178
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:528
+#: usr/local/www/diag_ipsec_sad.php:89
+msgid "Destination"
+msgstr "先"
+
+#: usr/local/www/diag_logs_filter.php:151
+#: usr/local/www/diag_logs_filter_dynamic.php:131
+#: usr/local/www/diag_dump_states.php:150 usr/local/www/firewall_rules.php:363
+#: usr/local/www/diag_states_summary.php:152
+#: usr/local/www/firewall_nat.php:196 usr/local/www/firewall_rules.php:367
+#: usr/local/www/diag_dump_states.php:168
+#: usr/local/www/diag_logs_filter_dynamic.php:129
+#: usr/local/www/diag_states_summary.php:141
+#: usr/local/www/diag_logs_filter.php:150 usr/local/www/firewall_nat.php:201
+#: usr/local/www/firewall_rules.php:360 usr/local/www/diag_dump_states.php:167
+#: usr/local/www/diag_logs_filter_dynamic.php:130
+#: usr/local/www/diag_states_summary.php:143
+#: usr/local/www/diag_logs_filter.php:185
+#: usr/local/www/diag_logs_filter_dynamic.php:133
+#: usr/local/www/diag_logs_filter.php:311
+#: usr/local/www/diag_dump_states.php:156 usr/local/www/firewall_rules.php:358
+#: usr/local/www/firewall_nat.php:204 usr/local/www/diag_logs_filter.php:311
+#: usr/local/www/diag_dump_states.php:156
+#: usr/local/www/diag_states_summary.php:143
+#: usr/local/www/diag_logs_filter_dynamic.php:133
+#: usr/local/www/firewall_nat.php:204 usr/local/www/firewall_rules.php:358
+msgid "Proto"
+msgstr "プロト"
+
+#: usr/local/www/diag_logs_filter.php:178
+#: usr/local/www/diag_logs_filter.php:183
+#: usr/local/www/diag_logs_filter_summary.php:81
+#: usr/local/www/diag_logs_filter.php:175
+#: usr/local/www/diag_logs_filter.php:180
+#: usr/local/www/diag_logs_filter_summary.php:82
+#: usr/local/www/diag_logs_filter.php:221
+#: usr/local/www/diag_logs_filter.php:228
+#: usr/local/www/diag_logs_filter.php:351
+#: usr/local/www/diag_logs_filter.php:353
+#: usr/local/www/diag_logs_filter.php:360
+#: usr/local/www/diag_logs_filter.php:362
+#: usr/local/www/widgets/widgets/log.widget.php:189
+#: usr/local/www/widgets/widgets/log.widget.php:192
+#: usr/local/www/diag_logs_filter.php:351
+#: usr/local/www/diag_logs_filter.php:353
+#: usr/local/www/diag_logs_filter.php:360
+#: usr/local/www/diag_logs_filter.php:362
+#: usr/local/www/widgets/widgets/log.widget.php:197
+#: usr/local/www/widgets/widgets/log.widget.php:200
+#: usr/local/www/diag_logs_filter_summary.php:82
+msgid "Reverse Resolve with DNS"
+msgstr "DNSに逆解決"
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:355
+msgid "Easy Rule: Add to Block List"
+msgstr "簡単なルール:リストをブロックするために追加する"
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:355
+msgid "Do you really want to add this BLOCK rule?"
+msgstr "あなたは本当にこのブロックルールを追加しますか?"
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:364
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Easy Rule is still experimental."
+msgstr "簡単なルールは、まだ実験的なものです。"
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:364
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Continue at risk of your own peril."
+msgstr "あなた自身の危険のリスクが継続する。"
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:364
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Backups are also nice."
+msgstr "バックアップもいいです。"
+
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:364
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Easy Rule: Pass this traffic"
+msgstr "簡単なルール:このトラフィックを通過させる"
+
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:364
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Do you really want to add this PASS rule?"
+msgstr "あなたは本当にこのパスの規則を追加しますか?"
+
+#: usr/local/www/diag_logs_filter.php:196
+#: usr/local/www/diag_logs_filter.php:193
+#: usr/local/www/diag_logs_filter.php:251
+#: usr/local/www/diag_logs_filter.php:385
+#: usr/local/www/diag_logs_filter.php:385
+#, php-format
+msgid "Last %s firewall log entries"
+msgstr "最後%sファイアウォールのログエントリ"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:61
+#: usr/local/www/diag_logs_filter_dynamic.php:61
+msgid "Firewall (Dynamic View)"
+msgstr "ファイアウォール(ダイナミックビュー)"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:120
+#: usr/local/www/diag_logs_filter_dynamic.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:124
+#: usr/local/www/diag_logs_filter_dynamic.php:124
+#, php-format
+msgid "Last %s records"
+msgstr "最後%sレコード"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:120
+#: usr/local/www/diag_logs_filter_dynamic.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:124
+#: usr/local/www/diag_logs_filter_dynamic.php:124
+msgid "Pause:"
+msgstr "一時停止:"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:153
+#: usr/local/www/diag_logs_filter_dynamic.php:151
+#: usr/local/www/diag_logs_filter_dynamic.php:152
+#: usr/local/www/diag_logs_filter_dynamic.php:165
+#: usr/local/www/diag_logs_filter_dynamic.php:165
+msgid "TCP Flags"
+msgstr "TCPフラグ"
+
+#: usr/local/www/diag_logs_ipsec.php:91 usr/local/www/status_services.php:330
+#: usr/local/www/widgets/widgets/services_status.widget.php:135
+#: etc/inc/service-utils.inc:320 etc/inc/service-utils.inc:319
+#: etc/inc/service-utils.inc:336 usr/local/www/diag_logs_ipsec.php:91
+#: etc/inc/service-utils.inc:336
+msgid "IPsec VPN"
+msgstr "IPsec VPNの"
+
+#: usr/local/www/diag_logs_ipsec.php:123 usr/local/www/diag_logs_ipsec.php:122
+#: usr/local/www/diag_logs_ipsec.php:123
+#, php-format
+msgid "Last %s IPsec log entries"
+msgstr "最後%s IPsecのログエントリ"
+
+#: usr/local/www/diag_logs_ipsec.php:135 usr/local/www/diag_logs_ppp.php:99
+#: usr/local/www/diag_logs_ipsec.php:134 usr/local/www/diag_logs_ppp.php:98
+#: usr/local/www/diag_logs_ipsec.php:136 usr/local/www/diag_logs_ipsec.php:136
+msgid "Unknown Gateway/Dynamic"
+msgstr "未知のゲートウェイ/ダイナミック"
+
+#: usr/local/www/diag_logs_ntpd.php:86
+#, php-format
+msgid "Last %s OpenNTPD log entries"
+msgstr "最後%sはログエントリをOpenNTPD"
+
+#: usr/local/www/diag_logs_openvpn.php:90
+#: usr/local/www/diag_logs_openvpn.php:89
+#: usr/local/www/diag_logs_openvpn.php:90
+#, php-format
+msgid "Last %s OpenVPN log entries"
+msgstr "最後%s OpenVPNのログエントリ"
+
+#: usr/local/www/diag_dump_states.php:51 usr/local/www/status_openvpn.php:59
+#: usr/local/www/widgets/widgets/openvpn.widget.php:16
+#: usr/local/www/diag_dump_states_sources.php:51
+#: usr/local/www/widgets/widgets/openvpn.widget.php:17
+#: usr/local/www/status_openvpn.php:61 usr/local/www/status_openvpn.php:62
+#: usr/local/www/status_openvpn.php:62 usr/local/www/diag_dump_states.php:51
+#: usr/local/www/diag_dump_states_sources.php:51
+#: usr/local/www/widgets/widgets/openvpn.widget.php:17
+msgid "invalid input"
+msgstr "無効入力"
+
+#: usr/local/www/diag_dump_states.php:65 usr/local/www/diag_dump_states.php:75
+#: usr/local/www/diag_dump_states.php:67 usr/local/www/diag_dump_states.php:67
+msgid "Show States"
+msgstr "表示状態"
+
+#: usr/local/www/diag_dump_states.php:95 usr/local/www/status_openvpn.php:130
+#: usr/local/www/widgets/widgets/openvpn.widget.php:84
+#: usr/local/www/diag_dump_states_sources.php:95
+#: usr/local/www/diag_dump_states.php:105
+#: usr/local/www/widgets/widgets/openvpn.widget.php:85
+#: usr/local/www/status_openvpn.php:131
+#: usr/local/www/diag_dump_states_sources.php:94
+#: usr/local/www/diag_dump_states.php:104 usr/local/www/status_openvpn.php:132
+#: usr/local/www/diag_dump_states.php:96 usr/local/www/status_openvpn.php:132
+#: usr/local/www/diag_dump_states.php:96
+#: usr/local/www/diag_dump_states_sources.php:94
+#: usr/local/www/widgets/widgets/openvpn.widget.php:84
+msgid "An error occurred."
+msgstr "エラーが発生しました。"
+
+#: usr/local/www/diag_dump_states.php:110
+#: usr/local/www/diag_states_summary.php:151
+#: usr/local/www/diag_states_summary.php:153
+#: usr/local/www/diag_resetstate.php:77 usr/local/www/fbegin.inc:206
+#: usr/local/www/system_advanced_misc.php:398
+#: usr/local/www/diag_dump_states_sources.php:110 usr/local/www/fbegin.inc:224
+#: usr/local/www/system_advanced_misc.php:441
+#: usr/local/www/diag_dump_states.php:120
+#: usr/local/www/diag_states_summary.php:140
+#: usr/local/www/diag_states_summary.php:142 usr/local/www/fbegin.inc:233
+#: usr/local/www/system_advanced_misc.php:490
+#: usr/local/www/diag_dump_states_sources.php:109
+#: usr/local/www/diag_dump_states.php:119
+#: usr/local/www/diag_states_summary.php:144
+#: usr/local/www/system_advanced_misc.php:502 usr/local/www/fbegin.inc:225
+#: usr/local/www/diag_dump_states.php:111
+#: usr/local/www/system_advanced_misc.php:549
+#: usr/local/www/diag_dump_states.php:111
+#: usr/local/www/diag_states_summary.php:142
+#: usr/local/www/diag_states_summary.php:144
+#: usr/local/www/diag_dump_states_sources.php:109
+#: usr/local/www/system_advanced_misc.php:549
+#: usr/local/www/diag_resetstate.php:77 usr/local/www/fbegin.inc:225
+msgid "States"
+msgstr "米国"
+
+#: usr/local/www/diag_dump_states.php:112 usr/local/www/diag_resetstate.php:79
+#: usr/local/www/diag_dump_states_sources.php:111
+#: usr/local/www/diag_dump_states.php:122
+#: usr/local/www/diag_dump_states_sources.php:110
+#: usr/local/www/diag_dump_states.php:121
+#: usr/local/www/diag_dump_states.php:113
+#: usr/local/www/diag_dump_states.php:113
+#: usr/local/www/diag_dump_states_sources.php:110
+#: usr/local/www/diag_resetstate.php:79
+msgid "Source Tracking"
+msgstr "ソースの追跡"
+
+#: usr/local/www/diag_dump_states.php:113 usr/local/www/diag_resetstate.php:80
+#: usr/local/www/diag_dump_states_sources.php:112
+#: usr/local/www/diag_dump_states.php:123
+#: usr/local/www/diag_dump_states_sources.php:111
+#: usr/local/www/diag_dump_states.php:122
+#: usr/local/www/diag_dump_states.php:114
+#: usr/local/www/diag_dump_states.php:114
+#: usr/local/www/diag_dump_states_sources.php:111
+#: usr/local/www/diag_resetstate.php:80
+msgid "Reset States"
+msgstr "米国のリセット"
+
+#: usr/local/www/diag_dump_states.php:134
+msgid "Current state count:"
+msgstr "現在の状態カウント:"
+
+#: usr/local/www/diag_dump_states.php:136
+#: usr/local/www/diag_dump_states_sources.php:131
+#: usr/local/www/diag_dump_states.php:151
+#: usr/local/www/diag_dump_states_sources.php:130
+#: usr/local/www/diag_dump_states.php:150
+#: usr/local/www/diag_dump_states.php:139
+#: usr/local/www/diag_dump_states.php:139
+#: usr/local/www/diag_dump_states_sources.php:130
+msgid "Filter expression:"
+msgstr "式をフィルタ:"
+
+#: usr/local/www/diag_dump_states.php:151
+#: usr/local/www/diag_dump_states.php:169
+#: usr/local/www/diag_dump_states.php:168
+#: usr/local/www/diag_dump_states.php:157
+#: usr/local/www/diag_dump_states.php:157
+msgid "Source -> Router -> Destination"
+msgstr "ソース - u003eルータ - u003e目的地"
+
+#: usr/local/www/diag_dump_states.php:152
+#: usr/local/www/status_dhcpv6_leases.php:486
+#: usr/local/www/diag_dump_states.php:170
+#: usr/local/www/status_dhcpv6_leases.php:487
+#: usr/local/www/diag_dump_states.php:169
+#: usr/local/www/status_dhcpv6_leases.php:490
+#: usr/local/www/diag_system_pftop.php:142
+#: usr/local/www/diag_dump_states.php:158
+#: usr/local/www/status_dhcpv6_leases.php:490
+#: usr/local/www/diag_dump_states.php:158
+#: usr/local/www/diag_system_pftop.php:142
+msgid "State"
+msgstr "状態"
+
+#: usr/local/www/diag_dump_states.php:185
+#: usr/local/www/diag_dump_states.php:203
+#: usr/local/www/diag_dump_states.php:202
+#: usr/local/www/diag_dump_states.php:194
+#: usr/local/www/diag_dump_states.php:194
+msgid "Remove all state entries from"
+msgstr "からすべての状態のエントリを削除する"
+
+#: usr/local/www/diag_dump_states.php:185
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:735 usr/local/www/diag_confbak.php:111
+#: usr/local/www/services_captiveportal_ip.php:176
+#: usr/local/www/services_dhcp.php:636
+#: usr/local/www/services_captiveportal_hostname.php:177
+#: usr/local/www/services_dhcpv6.php:572 usr/local/www/services_dhcpv6.php:579
+#: usr/local/www/diag_dump_states_sources.php:180
+#: usr/local/www/diag_dump_states.php:203 usr/local/www/services_dhcp.php:649
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:742
+#: usr/local/www/services_dhcpv6.php:645 usr/local/www/services_dhcpv6.php:652
+#: usr/local/www/services_captiveportal_ip.php:174
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/diag_dump_states_sources.php:179
+#: usr/local/www/diag_dump_states.php:202 usr/local/www/services_dhcp.php:770
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/services_dhcpv6.php:576 usr/local/www/services_dhcpv6.php:583
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_nat_edit.php:736 usr/local/www/services_dhcp.php:780
+#: usr/local/www/services_dhcpv6.php:593 usr/local/www/services_dhcpv6.php:600
+#: usr/local/www/diag_dump_states.php:194
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_nat_edit.php:748 usr/local/www/services_dhcp.php:800
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_edit.php:749
+#: usr/local/www/services_captiveportal_ip.php:174
+#: usr/local/www/diag_dump_states.php:194
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_edit.php:749
+#: usr/local/www/diag_dump_states_sources.php:179
+#: usr/local/www/services_dhcp.php:800
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/services_dhcpv6.php:593 usr/local/www/services_dhcpv6.php:600
+#: usr/local/www/diag_confbak.php:111
+msgid "to"
+msgstr "へ"
+
+#: usr/local/www/diag_dump_states.php:194
+#: usr/local/www/diag_dump_states.php:212
+#: usr/local/www/diag_dump_states.php:211
+#: usr/local/www/diag_dump_states.php:205
+#: usr/local/www/diag_dump_states.php:205
+msgid "No states were found."
+msgstr "何の状態が見つかりませんでした。"
+
+#: usr/local/www/diag_logs_settings.php:79
+msgid "A valid IP address must be specified for remote syslog server #1."
+msgstr "有効なIPアドレスは、リモートsyslogサーバを指定する必要があります"
+
+#: usr/local/www/diag_logs_settings.php:82
+msgid "A valid IP address must be specified for remote syslog server #2."
+msgstr "有効なIPアドレスは、リモートsyslogサーバを指定する必要があります"
+
+#: usr/local/www/diag_logs_settings.php:85
+msgid "A valid IP address must be specified for remote syslog server #3."
+msgstr "有効なIPアドレスは、リモートsyslogサーバを指定する必要があります"
+
+#: usr/local/www/diag_logs_settings.php:92
+#: usr/local/www/diag_logs_settings.php:96
+#: usr/local/www/diag_logs_settings.php:97
+#: usr/local/www/diag_logs_settings.php:97
+msgid "Number of log entries to show must be between 5 and 2000."
+msgstr "表示するログエントリの数は、 5年から2000年の間でなければなりません。"
+
+#: usr/local/www/diag_logs_settings.php:232
+#: usr/local/www/diag_logs_settings.php:239
+#: usr/local/www/diag_logs_settings.php:246
+#: usr/local/www/diag_logs_settings.php:246
+msgid "Show log entries in reverse order (newest entries on top)"
+msgstr "逆の順序で表示するログエントリ(一番上の最新のエントリ)"
+
+#: usr/local/www/diag_logs_settings.php:236
+msgid "Number of log entries to show:"
+msgstr "ショーのログエントリの数:"
+
+#: usr/local/www/diag_logs_settings.php:242
+#: usr/local/www/diag_logs_settings.php:250
+#: usr/local/www/diag_logs_settings.php:257
+#: usr/local/www/diag_logs_settings.php:257
+msgid "Log packets blocked by the default rule"
+msgstr "デフォルトのルールでブロックされたパケットをログに記録する"
+
+#: usr/local/www/diag_logs_settings.php:243
+msgid ""
+"Hint: packets that are blocked by the implicit default block rule will not "
+"be logged anymore if you uncheck this option. Per-rule logging options are "
+"not affected."
+msgstr ""ヒント:暗黙のデフォルトのブロックルールによってブロックされたパケットがない」このオプションをオフにした場合はもうログインする。ルールごとのログオプション」の影響を受けません。"
+
+#: usr/local/www/diag_logs_settings.php:250
+#: usr/local/www/diag_logs_settings.php:258
+#: usr/local/www/diag_logs_settings.php:265
+#: usr/local/www/diag_logs_settings.php:265
+msgid "Show raw filter logs"
+msgstr "生のフィルタログを表示する"
+
+#: usr/local/www/diag_logs_settings.php:251
+msgid ""
+"Hint: If this is checked, filter logs are shown as generated by the packet "
+"filter, without any formatting. This will reveal more detailed information."
+msgstr ""ヒント:これをチェックすると、パケットによって生成されるように、フィルタログが表示されます"をフォーマットせずに、フィルタ。これは、より詳細な情報を明らかにする。"
+
+#: usr/local/www/diag_logs_settings.php:256
+#: usr/local/www/diag_logs_settings.php:267
+#: usr/local/www/diag_logs_settings.php:287
+#: usr/local/www/diag_logs_settings.php:287
+msgid "Disable writing log files to the local RAM disk"
+msgstr "ローカルRAMディスクにログファイルを書き込み不可に"
+
+#: usr/local/www/diag_logs_settings.php:261
+msgid "Enable syslog'ing to remote syslog server"
+msgstr "リモートsyslogサーバにsyslog'ing有効にします"
+
+#: usr/local/www/diag_logs_settings.php:264
+msgid "Remote syslog servers"
+msgstr "リモートsyslogサーバ"
+
+#: usr/local/www/diag_logs_settings.php:269
+#: usr/local/www/diag_logs_settings.php:277
+#: usr/local/www/diag_logs_settings.php:285
+#: usr/local/www/vpn_ipsec_mobile.php:496
+#: usr/local/www/vpn_ipsec_mobile.php:502
+#: usr/local/www/vpn_ipsec_mobile.php:508
+#: usr/local/www/vpn_ipsec_mobile.php:514
+#: usr/local/www/vpn_ipsec_mobile.php:538
+#: usr/local/www/vpn_ipsec_mobile.php:544 usr/local/www/diag_dns.php:208
+#: usr/local/www/services_rfc2136_edit.php:180
+#: usr/local/www/vpn_openvpn_client.php:365
+#: usr/local/www/vpn_openvpn_client.php:862
+#: usr/local/www/vpn_openvpn_csc.php:293 usr/local/www/vpn_openvpn_csc.php:477
+#: usr/local/www/vpn_openvpn_csc.php:485 usr/local/www/vpn_openvpn_csc.php:493
+#: usr/local/www/vpn_openvpn_csc.php:501 usr/local/www/vpn_openvpn_csc.php:529
+#: usr/local/www/vpn_openvpn_csc.php:537 usr/local/www/vpn_openvpn_csc.php:625
+#: usr/local/www/vpn_openvpn_csc.php:633
+#: usr/local/www/vpn_openvpn_server.php:40
+#: usr/local/www/vpn_openvpn_server.php:583
+#: usr/local/www/vpn_openvpn_server.php:1238
+#: usr/local/www/vpn_openvpn_server.php:1246
+#: usr/local/www/vpn_openvpn_server.php:1254
+#: usr/local/www/vpn_openvpn_server.php:1262
+#: usr/local/www/vpn_openvpn_server.php:1290
+#: usr/local/www/vpn_openvpn_server.php:1298
+#: usr/local/www/vpn_openvpn_server.php:1386
+#: usr/local/www/vpn_openvpn_server.php:1394
+#: usr/local/www/diag_logs_settings.php:286
+#: usr/local/www/diag_logs_settings.php:290
+#: usr/local/www/diag_logs_settings.php:294 usr/local/www/status_ntpd.php:108
+#: usr/local/www/diag_dns.php:207 usr/local/www/vpn_openvpn_server.php:656
+#: usr/local/www/vpn_openvpn_server.php:1380
+#: usr/local/www/vpn_openvpn_server.php:1388
+#: usr/local/www/vpn_openvpn_server.php:1396
+#: usr/local/www/vpn_openvpn_server.php:1404
+#: usr/local/www/vpn_openvpn_server.php:1432
+#: usr/local/www/vpn_openvpn_server.php:1440
+#: usr/local/www/vpn_openvpn_server.php:1528
+#: usr/local/www/vpn_openvpn_server.php:1536
+#: usr/local/www/vpn_openvpn_client.php:370
+#: usr/local/www/vpn_openvpn_client.php:867
+#: usr/local/www/diag_logs_settings.php:306
+#: usr/local/www/diag_logs_settings.php:310
+#: usr/local/www/diag_logs_settings.php:314
+#: usr/local/www/vpn_ipsec_mobile.php:545
+#: usr/local/www/vpn_ipsec_mobile.php:551
+#: usr/local/www/vpn_ipsec_mobile.php:557
+#: usr/local/www/vpn_ipsec_mobile.php:563
+#: usr/local/www/vpn_ipsec_mobile.php:587
+#: usr/local/www/vpn_ipsec_mobile.php:593
+#: usr/local/www/vpn_openvpn_csc.php:292 usr/local/www/vpn_openvpn_csc.php:476
+#: usr/local/www/vpn_openvpn_csc.php:484 usr/local/www/vpn_openvpn_csc.php:492
+#: usr/local/www/vpn_openvpn_csc.php:500 usr/local/www/vpn_openvpn_csc.php:528
+#: usr/local/www/vpn_openvpn_csc.php:536 usr/local/www/vpn_openvpn_csc.php:624
+#: usr/local/www/vpn_openvpn_csc.php:632 usr/local/www/status_ntpd.php:124
+#: usr/local/www/vpn_openvpn_server.php:423
+#: usr/local/www/vpn_openvpn_server.php:674
+#: usr/local/www/vpn_openvpn_server.php:1422
+#: usr/local/www/vpn_openvpn_server.php:1430
+#: usr/local/www/vpn_openvpn_server.php:1438
+#: usr/local/www/vpn_openvpn_server.php:1446
+#: usr/local/www/vpn_openvpn_server.php:1474
+#: usr/local/www/vpn_openvpn_server.php:1482
+#: usr/local/www/vpn_openvpn_server.php:1570
+#: usr/local/www/vpn_openvpn_server.php:1578
+#: usr/local/www/vpn_openvpn_client.php:378
+#: usr/local/www/vpn_openvpn_client.php:920
+#: usr/local/www/vpn_openvpn_client.php:396
+#: usr/local/www/vpn_openvpn_client.php:939
+#: usr/local/www/vpn_openvpn_server.php:445
+#: usr/local/www/vpn_openvpn_server.php:700
+#: usr/local/www/vpn_openvpn_server.php:1490
+#: usr/local/www/vpn_openvpn_server.php:1498
+#: usr/local/www/vpn_openvpn_server.php:1526
+#: usr/local/www/vpn_openvpn_server.php:1534
+#: usr/local/www/vpn_openvpn_server.php:1622
+#: usr/local/www/vpn_openvpn_server.php:1630 usr/local/www/status_ntpd.php:130
+#: usr/local/www/diag_dns.php:156 usr/local/www/diag_dns.php:224
+#: usr/local/www/diag_logs_settings.php:306
+#: usr/local/www/diag_logs_settings.php:310
+#: usr/local/www/diag_logs_settings.php:314
+#: usr/local/www/vpn_openvpn_client.php:396
+#: usr/local/www/vpn_openvpn_client.php:939
+#: usr/local/www/vpn_openvpn_csc.php:292 usr/local/www/vpn_openvpn_csc.php:476
+#: usr/local/www/vpn_openvpn_csc.php:484 usr/local/www/vpn_openvpn_csc.php:492
+#: usr/local/www/vpn_openvpn_csc.php:500 usr/local/www/vpn_openvpn_csc.php:528
+#: usr/local/www/vpn_openvpn_csc.php:536 usr/local/www/vpn_openvpn_csc.php:624
+#: usr/local/www/vpn_openvpn_csc.php:632 usr/local/www/status_ntpd.php:130
+#: usr/local/www/diag_dns.php:156 usr/local/www/diag_dns.php:224
+#: usr/local/www/services_rfc2136_edit.php:180
+#: usr/local/www/vpn_ipsec_mobile.php:545
+#: usr/local/www/vpn_ipsec_mobile.php:551
+#: usr/local/www/vpn_ipsec_mobile.php:557
+#: usr/local/www/vpn_ipsec_mobile.php:563
+#: usr/local/www/vpn_ipsec_mobile.php:587
+#: usr/local/www/vpn_ipsec_mobile.php:593
+#: usr/local/www/vpn_openvpn_server.php:445
+#: usr/local/www/vpn_openvpn_server.php:700
+#: usr/local/www/vpn_openvpn_server.php:1474
+#: usr/local/www/vpn_openvpn_server.php:1482
+#: usr/local/www/vpn_openvpn_server.php:1490
+#: usr/local/www/vpn_openvpn_server.php:1498
+#: usr/local/www/vpn_openvpn_server.php:1526
+#: usr/local/www/vpn_openvpn_server.php:1534
+#: usr/local/www/vpn_openvpn_server.php:1622
+#: usr/local/www/vpn_openvpn_server.php:1630
+msgid "Server"
+msgstr "サーバー"
+
+#: usr/local/www/diag_logs_settings.php:296
+msgid "IP addresses of remote syslog servers"
+msgstr "リモートsyslogサーバのIPアドレス"
+
+#: usr/local/www/diag_logs_settings.php:300
+#: usr/local/www/diag_logs_settings.php:309
+#: usr/local/www/diag_logs_settings.php:329
+#: usr/local/www/diag_logs_settings.php:329
+msgid "System events"
+msgstr "システム·イベント"
+
+#: usr/local/www/diag_logs_settings.php:302
+#: usr/local/www/diag_logs_settings.php:311
+#: usr/local/www/diag_logs_settings.php:331
+#: usr/local/www/diag_logs_settings.php:331
+msgid "Firewall events"
+msgstr "ファイアウォールイベント"
+
+#: usr/local/www/diag_logs_settings.php:304
+#: usr/local/www/diag_logs_settings.php:313
+#: usr/local/www/diag_logs_settings.php:333
+#: usr/local/www/diag_logs_settings.php:333
+msgid "DHCP service events"
+msgstr "DHCPサービスのイベント"
+
+#: usr/local/www/diag_logs_settings.php:306
+#: usr/local/www/diag_logs_settings.php:315
+#: usr/local/www/diag_logs_settings.php:335
+#: usr/local/www/diag_logs_settings.php:335
+msgid "Portal Auth events"
+msgstr "ポータル認証イベント"
+
+#: usr/local/www/diag_logs_settings.php:308
+#: usr/local/www/diag_logs_settings.php:317
+#: usr/local/www/diag_logs_settings.php:337
+#: usr/local/www/diag_logs_settings.php:337
+msgid "VPN (PPTP, IPsec, OpenVPN) events"
+msgstr "VPN ( PPTP 、 IPsecの、 OpenVPNの)イベント"
+
+#: usr/local/www/diag_logs_settings.php:310
+#: usr/local/www/diag_logs_settings.php:319
+#: usr/local/www/diag_logs_settings.php:339
+#: usr/local/www/diag_logs_settings.php:339
+msgid "Gateway Monitor events"
+msgstr "ゲートウェイモニタイベント"
+
+#: usr/local/www/diag_logs_settings.php:312
+#: usr/local/www/diag_logs_settings.php:321
+#: usr/local/www/diag_logs_settings.php:341
+#: usr/local/www/diag_logs_settings.php:341
+msgid "Server Load Balancer events"
+msgstr "サーバロードバランサイベント"
+
+#: usr/local/www/diag_logs_settings.php:314
+#: usr/local/www/diag_logs_settings.php:323
+#: usr/local/www/diag_logs_settings.php:343
+#: usr/local/www/diag_logs_settings.php:343
+msgid "Wireless events"
+msgstr "ワイヤレスイベント"
+
+#: usr/local/www/diag_logs_settings.php:316
+#: usr/local/www/diag_logs_settings.php:307
+#: usr/local/www/diag_logs_settings.php:327
+#: usr/local/www/diag_logs_settings.php:327
+msgid "Everything"
+msgstr "すべてのもの"
+
+#: usr/local/www/diag_logs_settings.php:327
+msgid ""
+"syslog sends UDP datagrams to port 514 on the specified remote syslog "
+"server. Be sure to set syslogd on the remote server to accept syslog "
+"messages from"
+msgstr "サーバー「 syslogが指定されたリモートのsyslogのポート514にUDPデータグラムを送信します」 。からのsyslog 」のメッセージを受け入れるようにリモート·サーバー上のsyslogd設定してください"
+
+#: usr/local/www/diag_logs_vpn.php:144 usr/local/www/diag_logs_vpn.php:143
+#: usr/local/www/diag_logs_vpn.php:143
+msgid "PPTP Logins"
+msgstr "PPTPログイン"
+
+#: usr/local/www/diag_logs_vpn.php:147 usr/local/www/diag_logs_vpn.php:146
+#: usr/local/www/diag_logs_vpn.php:146
+msgid "PPTP Raw"
+msgstr "PPTP生"
+
+#: usr/local/www/diag_logs_vpn.php:150 usr/local/www/diag_logs_vpn.php:149
+#: usr/local/www/diag_logs_vpn.php:149
+msgid "PPPoE Logins"
+msgstr "PPPoEのログイン"
+
+#: usr/local/www/diag_logs_vpn.php:153 usr/local/www/diag_logs_vpn.php:152
+#: usr/local/www/diag_logs_vpn.php:152
+msgid "PPPoE Raw"
+msgstr "PPPoEの生"
+
+#: usr/local/www/diag_logs_vpn.php:156 usr/local/www/diag_logs_vpn.php:155
+#: usr/local/www/diag_logs_vpn.php:155
+msgid "L2TP Logins"
+msgstr "L2TPログイン"
+
+#: usr/local/www/diag_logs_vpn.php:159 usr/local/www/diag_logs_vpn.php:158
+#: usr/local/www/diag_logs_vpn.php:158
+msgid "L2TP Raw"
+msgstr "L2TP生"
+
+#: usr/local/www/diag_logs_vpn.php:171 usr/local/www/diag_logs_vpn.php:170
+#: usr/local/www/diag_logs_vpn.php:170
+#, php-format
+msgid "Last %1$s %2$s VPN log entries"
+msgstr "最後は%1$s %2$s VPNのログエントリ"
+
+#: usr/local/www/diag_logs_vpn.php:176
+#: usr/local/www/firewall_rules_edit.php:659
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:484
+#: usr/local/www/services_unbound_acls.php:211
+#: usr/local/www/services_unbound_acls.php:318
+#: usr/local/www/load_balancer_relay_action_edit.php:483
+#: usr/local/www/firewall_rules_edit.php:692
+#: usr/local/www/diag_logs_vpn.php:175
+#: usr/local/www/load_balancer_relay_action_edit.php:481
+#: usr/local/www/firewall_rules_edit.php:695
+#: usr/local/www/firewall_rules_edit.php:707
+#: usr/local/www/diag_logs_filter.php:151
+#: usr/local/www/firewall_rules_edit.php:707
+#: usr/local/www/diag_logs_filter.php:151
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:481
+#: usr/local/www/diag_logs_vpn.php:175
+msgid "Action"
+msgstr "アクション"
+
+#: usr/local/www/diag_logs_vpn.php:177
+#: usr/local/www/diag_authentication.php:59
+#: usr/local/www/vpn_pptp_users_edit.php:135
+#: usr/local/www/system_groupmanager.php:426
+#: usr/local/www/system_usermanager.php:89
+#: usr/local/www/system_usermanager.php:808
+#: usr/local/www/vpn_l2tp_users_edit.php:38
+#: usr/local/www/system_usermanager.php:806
+#: usr/local/www/diag_logs_vpn.php:176
+#: usr/local/www/system_groupmanager.php:429
+#: usr/local/www/system_usermanager.php:809
+#: usr/local/www/system_groupmanager.php:448
+#: usr/local/www/system_usermanager.php:832
+#: usr/local/www/diag_authentication.php:59
+#: usr/local/www/system_groupmanager.php:448
+#: usr/local/www/vpn_l2tp_users_edit.php:38
+#: usr/local/www/diag_logs_vpn.php:176
+#: usr/local/www/vpn_pptp_users_edit.php:135
+#: usr/local/www/system_usermanager.php:89
+#: usr/local/www/system_usermanager.php:832
+msgid "User"
+msgstr "ユーザー"
+
+#: usr/local/www/diag_nanobsd.php:49 usr/local/www/fbegin.inc:212
+#: usr/local/www/fbegin.inc:230 usr/local/www/fbegin.inc:239
+#: usr/local/www/fbegin.inc:231 usr/local/www/fbegin.inc:231
+#: usr/local/www/diag_nanobsd.php:49
+msgid "NanoBSD"
+msgstr "NanoBSDの"
+
+#: usr/local/www/diag_nanobsd.php:70 usr/local/www/diag_nanobsd.php:69
+#: usr/local/www/diag_nanobsd.php:69
+msgid "Setting slice information, please wait..."
+msgstr "スライス情報を設定しています。しばらくお待ちください..."
+
+#: usr/local/www/diag_nanobsd.php:79 usr/local/www/diag_nanobsd.php:78
+#: usr/local/www/diag_nanobsd.php:78
+msgid "The boot slice has been set to"
+msgstr "ブート·スライスに設定されている"
+
+#: usr/local/www/diag_nanobsd.php:86 usr/local/www/diag_nanobsd.php:85
+#: usr/local/www/diag_nanobsd.php:85
+msgid "Duplicating slice. Please wait, this will take a moment..."
+msgstr "スライスを複製。これは少し時間がかかるでしょう、しばらくお待ちください..."
+
+#: usr/local/www/diag_nanobsd.php:95 usr/local/www/diag_nanobsd.php:94
+#: usr/local/www/diag_nanobsd.php:94
+msgid "The slice has been duplicated."
+msgstr "スライスが複製されています。"
+
+#: usr/local/www/diag_nanobsd.php:95 usr/local/www/diag_nanobsd.php:94
+#: usr/local/www/diag_nanobsd.php:94
+msgid ""
+"If you would like to boot from this newly duplicated slice please set it "
+"using the bootup information area."
+msgstr "ブートアップ情報領域を使用して「あなたは、この新たに複製されたスライスから起動したい場合に設定してください」 。"
+
+#: usr/local/www/diag_nanobsd.php:97 usr/local/www/diag_nanobsd.php:96
+#: usr/local/www/diag_nanobsd.php:96
+msgid "There was an error while duplicating the slice. Operation aborted."
+msgstr "スライスを複製中にエラーが発生しました。操作は中断されました。"
+
+#: usr/local/www/diag_nanobsd.php:128 usr/local/www/interfaces.php:2550
+#: usr/local/www/interfaces.php:2559
+#: usr/local/www/system_firmware_settings.php:151
+#: usr/local/www/system_routes_edit.php:334
+#: usr/local/www/load_balancer_virtual_server_edit.php:212
+#: usr/local/www/load_balancer_virtual_server_edit.php:231
+#: usr/local/www/load_balancer_virtual_server_edit.php:244
+#: usr/local/www/system_advanced_firewall.php:231
+#: usr/local/www/system_advanced_misc.php:221
+#: usr/local/www/system_advanced_network.php:197
+#: usr/local/www/system_advanced_sysctl.php:163
+#: usr/local/www/system_routes_edit.php:374
+#: usr/local/www/system_advanced_firewall.php:245
+#: usr/local/www/system_advanced_admin.php:289
+#: usr/local/www/system_advanced_misc.php:247
+#: usr/local/www/load_balancer_virtual_server_edit.php:201
+#: usr/local/www/load_balancer_virtual_server_edit.php:220
+#: usr/local/www/load_balancer_virtual_server_edit.php:233
+#: usr/local/www/interfaces.php:2752 usr/local/www/interfaces.php:2761
+#: usr/local/www/diag_nanobsd.php:127 usr/local/www/system_routes_edit.php:375
+#: usr/local/www/system_advanced_misc.php:266
+#: usr/local/www/load_balancer_virtual_server_edit.php:199
+#: usr/local/www/load_balancer_virtual_server_edit.php:218
+#: usr/local/www/system_firmware_settings.php:156
+#: usr/local/www/interfaces.php:2740 usr/local/www/interfaces.php:2749
+#: usr/local/www/diag_nanobsd.php:148
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/system_advanced_misc.php:270
+#: usr/local/www/system_advanced_firewall.php:274
+#: usr/local/www/interfaces.php:2774 usr/local/www/interfaces.php:2783
+#: usr/local/www/system_firmware_settings.php:167
+#: usr/local/www/system_advanced_misc.php:317
+#: usr/local/www/system_routes_edit.php:399
+#: usr/local/www/system_advanced_firewall.php:273
+#: usr/local/www/diag_nanobsd.php:139 usr/local/www/interfaces.php:2820
+#: usr/local/www/interfaces.php:2829 usr/local/www/system_routes_edit.php:409
+#: usr/local/www/interfaces.php:2806 usr/local/www/interfaces.php:2815
+#: usr/local/www/load_balancer_virtual_server_edit.php:199
+#: usr/local/www/load_balancer_virtual_server_edit.php:218
+#: usr/local/www/load_balancer_virtual_server_edit.php:231
+#: usr/local/www/system_firmware_settings.php:167
+#: usr/local/www/system_advanced_admin.php:289
+#: usr/local/www/system_advanced_misc.php:317
+#: usr/local/www/system_routes_edit.php:403
+#: usr/local/www/system_advanced_firewall.php:273
+#: usr/local/www/system_advanced_network.php:197
+#: usr/local/www/diag_nanobsd.php:139
+#: usr/local/www/system_advanced_sysctl.php:163
+#: usr/local/www/interfaces.php:2806 usr/local/www/interfaces.php:2815
+msgid "NOTE:"
+msgstr "注:"
+
+#: usr/local/www/diag_nanobsd.php:130
+#: usr/local/www/system_advanced_admin.php:291
+#: usr/local/www/system_advanced_firewall.php:233
+#: usr/local/www/system_advanced_misc.php:223
+#: usr/local/www/system_advanced_network.php:199
+#: usr/local/www/system_advanced_sysctl.php:165
+#: usr/local/www/system_advanced_firewall.php:247
+#: usr/local/www/system_advanced_misc.php:249
+#: usr/local/www/diag_nanobsd.php:129
+#: usr/local/www/system_advanced_misc.php:268
+#: usr/local/www/diag_nanobsd.php:150
+#: usr/local/www/system_advanced_misc.php:272
+#: usr/local/www/system_advanced_firewall.php:276
+#: usr/local/www/system_advanced_misc.php:319
+#: usr/local/www/system_advanced_firewall.php:275
+#: usr/local/www/diag_nanobsd.php:141
+#: usr/local/www/system_advanced_admin.php:291
+#: usr/local/www/system_advanced_misc.php:319
+#: usr/local/www/system_advanced_firewall.php:275
+#: usr/local/www/system_advanced_network.php:199
+#: usr/local/www/diag_nanobsd.php:141
+#: usr/local/www/system_advanced_sysctl.php:165
+msgid "The options on this page are intended for use by advanced users only."
+msgstr "このページのオプションは、上級ユーザーのみが使用するためのものです。"
+
+#: usr/local/www/diag_nanobsd.php:136 usr/local/www/diag_nanobsd.php:135
+#: usr/local/www/diag_nanobsd.php:156 usr/local/www/diag_nanobsd.php:147
+#: usr/local/www/diag_nanobsd.php:147
+msgid "Bootup information"
+msgstr "情報をブートアップ"
+
+#: usr/local/www/diag_nanobsd.php:139 usr/local/www/diag_nanobsd.php:138
+#: usr/local/www/diag_nanobsd.php:159 usr/local/www/diag_nanobsd.php:150
+#: usr/local/www/diag_nanobsd.php:150
+msgid "NanoBSD Image size"
+msgstr "NanoBSDの画像サイズ"
+
+#: usr/local/www/diag_nanobsd.php:145 usr/local/www/diag_nanobsd.php:144
+#: usr/local/www/diag_nanobsd.php:165 usr/local/www/diag_nanobsd.php:156
+#: usr/local/www/diag_nanobsd.php:156
+msgid "Bootup"
+msgstr "ブートアップ"
+
+#: usr/local/www/diag_nanobsd.php:148 usr/local/www/diag_nanobsd.php:147
+#: usr/local/www/diag_nanobsd.php:168 usr/local/www/diag_nanobsd.php:159
+#: usr/local/www/diag_nanobsd.php:159
+msgid "Bootup slice is currently:"
+msgstr "ブートアップスライスは、現在、次のとおりです"
+
+#: usr/local/www/diag_nanobsd.php:149 usr/local/www/diag_nanobsd.php:148
+#: usr/local/www/diag_nanobsd.php:169 usr/local/www/diag_nanobsd.php:160
+#: usr/local/www/diag_nanobsd.php:160
+msgid "This will switch the bootup slice to the alternate slice."
+msgstr "これは別のスライスにブートアップスライスを切り替えます。"
+
+#: usr/local/www/diag_nanobsd.php:159 usr/local/www/diag_nanobsd.php:158
+#: usr/local/www/diag_nanobsd.php:217 usr/local/www/diag_nanobsd.php:208
+#: usr/local/www/diag_nanobsd.php:208
+msgid "Duplicate bootup slice to alternate"
+msgstr "交互にブートアップスライスを複製"
+
+#: usr/local/www/diag_nanobsd.php:162 usr/local/www/diag_nanobsd.php:161
+#: usr/local/www/diag_nanobsd.php:220 usr/local/www/diag_nanobsd.php:211
+#: usr/local/www/diag_nanobsd.php:211
+msgid "Duplicate bootup slice"
+msgstr "ブートアップスライスを複製"
+
+#: usr/local/www/diag_nanobsd.php:165 usr/local/www/diag_nanobsd.php:164
+#: usr/local/www/diag_nanobsd.php:223 usr/local/www/diag_nanobsd.php:214
+#: usr/local/www/diag_nanobsd.php:214
+msgid "Destination slice:"
+msgstr "先のスライス:"
+
+#: usr/local/www/diag_nanobsd.php:172 usr/local/www/diag_nanobsd.php:171
+#: usr/local/www/diag_nanobsd.php:230 usr/local/www/diag_nanobsd.php:221
+#: usr/local/www/diag_nanobsd.php:221
+msgid ""
+"This will duplicate the bootup slice to the alternate slice. Use this if "
+"you would like to duplicate the known good working boot partition to the "
+"alternate."
+msgstr ""これは別のスライスに、起動スライスを複製します。場合は、これを使用して"あなたは"代替に知られている良好なブートパーティションを複製したいと思います。"
+
+#: usr/local/www/diag_nanobsd.php:182 usr/local/www/diag_nanobsd.php:181
+#: usr/local/www/diag_nanobsd.php:240 usr/local/www/diag_nanobsd.php:231
+#: usr/local/www/diag_nanobsd.php:231
+msgid "Periodic Data Backup"
+msgstr "定期的なデータバックアップ"
+
+#: usr/local/www/diag_nanobsd.php:185 usr/local/www/diag_nanobsd.php:184
+#: usr/local/www/diag_nanobsd.php:243
+msgid "RRD Backup"
+msgstr "RRDのバックアップ"
+
+#: usr/local/www/diag_nanobsd.php:188 usr/local/www/diag_nanobsd.php:205
+#: usr/local/www/diag_nanobsd.php:187 usr/local/www/diag_nanobsd.php:204
+#: usr/local/www/diag_nanobsd.php:246 usr/local/www/diag_nanobsd.php:263
+#: usr/local/www/system_advanced_misc.php:602
+#: usr/local/www/system_advanced_misc.php:618
+#: usr/local/www/system_advanced_misc.php:602
+#: usr/local/www/system_advanced_misc.php:618
+msgid "Frequency:"
+msgstr "周波数:"
+
+#: usr/local/www/diag_nanobsd.php:190 usr/local/www/diag_nanobsd.php:207
+#: usr/local/www/system_firmware.php:133
+#: usr/local/www/services_dyndns_edit.php:152
+#: usr/local/www/vpn_ipsec_phase1.php:812
+#: usr/local/www/services_dyndns_edit.php:210
+#: usr/local/www/system_advanced_firewall.php:410
+#: usr/local/www/firewall_nat_edit.php:796
+#: usr/local/www/vpn_ipsec_phase1.php:825 usr/local/www/diag_nanobsd.php:189
+#: usr/local/www/diag_nanobsd.php:206 usr/local/www/system_firmware.php:140
+#: usr/local/www/firewall_nat_edit.php:795
+#: usr/local/www/vpn_ipsec_phase1.php:822 usr/local/www/diag_nanobsd.php:248
+#: usr/local/www/diag_nanobsd.php:265 usr/local/www/system_firmware.php:135
+#: usr/local/www/services_dyndns_edit.php:214
+#: usr/local/www/firewall_nat_edit.php:790
+#: usr/local/www/system_advanced_firewall.php:472
+#: usr/local/www/vpn_ipsec_phase1.php:843
+#: usr/local/www/services_dyndns_edit.php:216
+#: usr/local/www/firewall_nat_edit.php:802
+#: usr/local/www/system_advanced_misc.php:604
+#: usr/local/www/system_advanced_misc.php:620
+#: usr/local/www/system_advanced_firewall.php:473
+#: usr/local/www/firewall_nat_edit.php:803
+#: usr/local/www/system_firmware.php:135
+#: usr/local/www/services_dyndns_edit.php:216
+#: usr/local/www/firewall_nat_edit.php:803
+#: usr/local/www/system_advanced_misc.php:604
+#: usr/local/www/system_advanced_misc.php:620
+#: usr/local/www/system_advanced_firewall.php:473
+#: usr/local/www/vpn_ipsec_phase1.php:843
+msgid "Disable"
+msgstr "無効にする"
+
+#: usr/local/www/diag_nanobsd.php:192 usr/local/www/diag_nanobsd.php:209
+#: usr/local/www/diag_nanobsd.php:191 usr/local/www/diag_nanobsd.php:208
+#: usr/local/www/diag_nanobsd.php:250 usr/local/www/diag_nanobsd.php:267
+#: usr/local/www/system_advanced_misc.php:606
+#: usr/local/www/system_advanced_misc.php:622
+#: usr/local/www/system_advanced_misc.php:606
+#: usr/local/www/system_advanced_misc.php:622
+msgid "hour"
+msgstr "時間"
+
+#: usr/local/www/diag_nanobsd.php:196 usr/local/www/diag_nanobsd.php:195
+#: usr/local/www/diag_nanobsd.php:254
+#: usr/local/www/system_advanced_misc.php:610
+#: usr/local/www/system_advanced_misc.php:610
+msgid ""
+"This will periodically backup the RRD data so it can be restored "
+"automatically on the next boot. Keep in mind that the more frequent the "
+"backup, the more writes will happen to your media."
+msgstr "次回の起動時に自動的に "これはRRDデータを定期的にバックアップ復元することができますので」 。より頻繁には、「バックアップ、より多くの書き込みが、メディアはどうなることに注意してください。"
+
+#: usr/local/www/diag_nanobsd.php:202 usr/local/www/diag_nanobsd.php:201
+#: usr/local/www/diag_nanobsd.php:260
+msgid "DHCP Leases Backup"
+msgstr "DHCPは、バックアップのリース"
+
+#: usr/local/www/diag_nanobsd.php:213 usr/local/www/diag_nanobsd.php:212
+#: usr/local/www/diag_nanobsd.php:271
+#: usr/local/www/system_advanced_misc.php:626
+#: usr/local/www/system_advanced_misc.php:626
+msgid ""
+"This will periodically backup the DHCP leases data so it can be restored "
+"automatically on the next boot. Keep in mind that the more frequent the "
+"backup, the more writes will happen to your media."
+msgstr "次回の起動時に自動的に「それが復元できるようにこれは、DHCPは、データを定期的にバックアップリースます」 。より頻繁には、「バックアップ、より多くの書き込みが、メディアはどうなることに注意してください。"
+
+#: usr/local/www/diag_nanobsd.php:226 usr/local/www/diag_nanobsd.php:225
+#: usr/local/www/diag_nanobsd.php:284 usr/local/www/diag_nanobsd.php:244
+#: usr/local/www/diag_nanobsd.php:244
+msgid "View upgrade log"
+msgstr "ビューアップグレードログ"
+
+#: usr/local/www/diag_nanobsd.php:229 usr/local/www/diag_nanobsd.php:228
+#: usr/local/www/diag_nanobsd.php:287 usr/local/www/diag_nanobsd.php:247
+#: usr/local/www/diag_nanobsd.php:247
+msgid "View previous upgrade log"
+msgstr "前回のアップグレードログを表示する"
+
+#: usr/local/www/diag_packet_capture.php:38
+#: usr/local/www/diag_packet_capture.php:225
+#: usr/local/www/diag_packet_capture.php:246
+#: usr/local/www/diag_packet_capture.php:40
+#: usr/local/www/diag_packet_capture.php:293
+#: usr/local/www/diag_packet_capture.php:311
+#: usr/local/www/diag_packet_capture.php:40
+#: usr/local/www/diag_packet_capture.php:311
+msgid "Download Capture"
+msgstr "キャプチャをダウンロード"
+
+#: usr/local/www/diag_packet_capture.php:41 usr/local/www/fbegin.inc:210
+#: usr/local/www/fbegin.inc:228 usr/local/www/fbegin.inc:237
+#: usr/local/www/diag_packet_capture.php:43 usr/local/www/fbegin.inc:229
+#: usr/local/www/diag_packet_capture.php:43 usr/local/www/fbegin.inc:229
+msgid "Packet Capture"
+msgstr "パケットキャプチャ"
+
+#: usr/local/www/diag_packet_capture.php:71
+#: usr/local/www/diag_packet_capture.php:220
+#: usr/local/www/diag_packet_capture.php:265
+#: usr/local/www/status_dhcp_leases.php:321
+#: usr/local/www/status_dhcpv6_leases.php:363
+#: usr/local/www/status_dhcpv6_leases.php:407
+#: usr/local/www/status_dhcpv6_leases.php:484
+#: usr/local/www/status_dhcp_leases.php:342
+#: usr/local/www/diag_packet_capture.php:75
+#: usr/local/www/diag_packet_capture.php:240
+#: usr/local/www/diag_packet_capture.php:294
+#: usr/local/www/status_dhcpv6_leases.php:408
+#: usr/local/www/status_dhcpv6_leases.php:485
+#: usr/local/www/status_dhcp_leases.php:344
+#: usr/local/www/diag_packet_capture.php:129
+#: usr/local/www/diag_packet_capture.php:287
+#: usr/local/www/diag_packet_capture.php:341
+#: usr/local/www/status_dhcpv6_leases.php:411
+#: usr/local/www/status_dhcpv6_leases.php:488
+#: usr/local/www/diag_packet_capture.php:137
+#: usr/local/www/diag_packet_capture.php:305
+#: usr/local/www/diag_packet_capture.php:359
+#: usr/local/www/status_dhcpv6_leases.php:411
+#: usr/local/www/status_dhcpv6_leases.php:488
+#: usr/local/www/diag_packet_capture.php:137
+#: usr/local/www/diag_packet_capture.php:305
+#: usr/local/www/diag_packet_capture.php:359
+#: usr/local/www/status_dhcp_leases.php:344
+msgid "Start"
+msgstr "スタート"
+
+#: usr/local/www/diag_packet_capture.php:78
+#: usr/local/www/diag_packet_capture.php:219
+#: usr/local/www/diag_packet_capture.php:222
+#: usr/local/www/diag_packet_capture.php:82
+#: usr/local/www/diag_packet_capture.php:239
+#: usr/local/www/diag_packet_capture.php:242
+#: usr/local/www/diag_packet_capture.php:136
+#: usr/local/www/diag_packet_capture.php:286
+#: usr/local/www/diag_packet_capture.php:289
+#: usr/local/www/diag_packet_capture.php:144
+#: usr/local/www/diag_packet_capture.php:304
+#: usr/local/www/diag_packet_capture.php:307
+#: usr/local/www/diag_packet_capture.php:144
+#: usr/local/www/diag_packet_capture.php:304
+#: usr/local/www/diag_packet_capture.php:307
+msgid "Stop"
+msgstr "停止"
+
+#: usr/local/www/diag_packet_capture.php:116
+#: usr/local/www/diag_packet_capture.php:120
+#: usr/local/www/diag_packet_capture.php:178
+#: usr/local/www/diag_packet_capture.php:186
+#: usr/local/www/diag_packet_capture.php:186
+msgid "Packet capture"
+msgstr "パケットキャプチャ"
+
+#: usr/local/www/diag_packet_capture.php:141
+#: usr/local/www/diag_packet_capture.php:145
+#: usr/local/www/diag_packet_capture.php:192
+#: usr/local/www/diag_packet_capture.php:200
+#: usr/local/www/diag_packet_capture.php:200
+msgid "Select the interface on which to capture traffic."
+msgstr "トラフィックをキャプチャするインターフェイスを選択します。"
+
+#: usr/local/www/diag_packet_capture.php:145
+#: usr/local/www/system_gateways_edit.php:376
+#: usr/local/www/diag_packet_capture.php:149
+#: usr/local/www/system_gateways_edit.php:482
+#: usr/local/www/diag_packet_capture.php:196
+#: usr/local/www/system_gateways_edit.php:484
+#: usr/local/www/diag_packet_capture.php:212
+#: usr/local/www/system_gateways_edit.php:514
+#: usr/local/www/system_gateways_edit.php:514
+#: usr/local/www/diag_packet_capture.php:212
+msgid "Address Family"
+msgstr "アドレスファミリ"
+
+#: usr/local/www/diag_packet_capture.php:152
+#: usr/local/www/diag_packet_capture.php:156
+#: usr/local/www/diag_packet_capture.php:203
+#: usr/local/www/diag_packet_capture.php:219
+#: usr/local/www/diag_packet_capture.php:219
+msgid ""
+"Select the type of traffic to be captured, either Any, IPv4 only or IPv6 "
+"only."
+msgstr "「捕獲されるトラフィックの種類を選択し、いずれか任意のはIPv4のみまたはIPv6 」のみ。"
+
+#: usr/local/www/diag_packet_capture.php:156
+#: usr/local/www/diag_packet_capture.php:176
+#: usr/local/www/diag_packet_capture.php:223
+#: usr/local/www/diag_packet_capture.php:239
+#: usr/local/www/diag_packet_capture.php:239
+msgid "Host Address"
+msgstr "ホストアドレス"
+
+#: usr/local/www/diag_packet_capture.php:159
+#: usr/local/www/diag_packet_capture.php:179
+#: usr/local/www/diag_packet_capture.php:226
+#: usr/local/www/diag_packet_capture.php:242
+#: usr/local/www/diag_packet_capture.php:242
+msgid ""
+"This value is either the Source or Destination IP address or subnet in CIDR "
+"notation. The packet capture will look for this address in either field."
+msgstr "表記"この値は、CIDRでのソースまたは宛先IPアドレスやサブネットのどちらかである」 。パケットキャプチャは、フィールドのいずれかで、このアドレスを検索します。"
+
+#: usr/local/www/diag_packet_capture.php:160
+#: usr/local/www/diag_packet_capture.php:180
+#: usr/local/www/diag_packet_capture.php:227
+#: usr/local/www/diag_packet_capture.php:243
+#: usr/local/www/diag_packet_capture.php:243
+msgid ""
+"This value can be a domain name or IP address, or subnet in CIDR notation."
+msgstr "「この値は、 CIDR表記のドメイン名またはIPアドレス、またはサブネットすることができます。"
+
+#: usr/local/www/diag_packet_capture.php:161
+#: usr/local/www/diag_packet_capture.php:181
+#: usr/local/www/diag_packet_capture.php:228
+#: usr/local/www/diag_packet_capture.php:244
+#: usr/local/www/diag_packet_capture.php:244
+msgid ""
+"If you leave this field blank, all packets on the specified interface will "
+"be captured."
+msgstr ""あなたは、このフィールドを空白のままにしておくと、指定したインターフェイス上のすべてのパケットがします」捕獲すること。"
+
+#: usr/local/www/diag_packet_capture.php:168
+#: usr/local/www/diag_packet_capture.php:188
+#: usr/local/www/diag_packet_capture.php:235
+#: usr/local/www/diag_packet_capture.php:251
+#: usr/local/www/diag_packet_capture.php:251
+msgid ""
+"The port can be either the source or destination port. The packet capture "
+"will look for this port in either field."
+msgstr "「ポートは、送信元または宛先ポートのいずれかになります。パケットキャプチャ」はいずれかのフィールドに、このポートを検索します。"
+
+#: usr/local/www/diag_packet_capture.php:169
+#: usr/local/www/diag_packet_capture.php:189
+#: usr/local/www/diag_packet_capture.php:236
+#: usr/local/www/diag_packet_capture.php:252
+#: usr/local/www/diag_packet_capture.php:252
+msgid "Leave blank if you do not want to filter by port."
+msgstr "あなたは、ポートでフィルタしたくない場合は空白のままにします。"
+
+#: usr/local/www/diag_packet_capture.php:173
+#: usr/local/www/diag_packet_capture.php:193
+#: usr/local/www/diag_packet_capture.php:240
+#: usr/local/www/diag_packet_capture.php:256
+#: usr/local/www/diag_packet_capture.php:256
+msgid "Packet Length"
+msgstr "パケット長"
+
+#: usr/local/www/diag_packet_capture.php:176
+#: usr/local/www/diag_packet_capture.php:196
+#: usr/local/www/diag_packet_capture.php:243
+#: usr/local/www/diag_packet_capture.php:259
+#: usr/local/www/diag_packet_capture.php:259
+msgid ""
+"The Packet length is the number of bytes of each packet that will be "
+"captured. Default value is 0, which will capture the entire frame regardless "
+"of its size."
+msgstr "捕捉「パケット長がされる各パケットのバイト数である」 。デフォルト値は、そのサイズのため"に関係なく、フレーム全体をキャプチャしている、 0です。"
+
+#: usr/local/www/diag_packet_capture.php:180 usr/local/www/diag_ping.php:55
+#: usr/local/www/diag_ping.php:108
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/services_captiveportal_vouchers_edit.php:189
+#: usr/local/www/diag_packet_capture.php:200
+#: usr/local/www/services_captiveportal_vouchers_edit.php:92
+#: usr/local/www/services_captiveportal_vouchers_edit.php:187
+#: usr/local/www/diag_packet_capture.php:247
+#: usr/local/www/diag_packet_capture.php:263 usr/local/www/diag_ping.php:57
+#: usr/local/www/diag_ping.php:129 usr/local/www/diag_packet_capture.php:263
+#: usr/local/www/services_captiveportal_vouchers_edit.php:92
+#: usr/local/www/services_captiveportal_vouchers_edit.php:187
+#: usr/local/www/diag_ping.php:57 usr/local/www/diag_ping.php:129
+msgid "Count"
+msgstr "カウント"
+
+#: usr/local/www/diag_packet_capture.php:183
+#: usr/local/www/diag_packet_capture.php:203
+#: usr/local/www/diag_packet_capture.php:250
+#: usr/local/www/diag_packet_capture.php:266
+#: usr/local/www/diag_packet_capture.php:266
+msgid ""
+"This is the number of packets the packet capture will grab. Default value is "
+"100."
+msgstr "「これは、パケットキャプチャがつかむますパケットの数です。デフォルト値は"100 。"
+
+#: usr/local/www/diag_packet_capture.php:183
+#: usr/local/www/diag_packet_capture.php:203
+#: usr/local/www/diag_packet_capture.php:250
+#: usr/local/www/diag_packet_capture.php:266
+#: usr/local/www/diag_packet_capture.php:266
+msgid "Enter 0 (zero) for no count limit."
+msgstr "無カウント制限のために0 (ゼロ)を入力します。"
+
+#: usr/local/www/diag_packet_capture.php:186
+#: usr/local/www/diag_packet_capture.php:206
+#: usr/local/www/diag_packet_capture.php:253
+#: usr/local/www/diag_packet_capture.php:270
+#: usr/local/www/diag_packet_capture.php:270
+msgid "Level of Detail"
+msgstr "詳細度"
+
+#: usr/local/www/diag_packet_capture.php:189
+#: usr/local/www/diag_packet_capture.php:209
+#: usr/local/www/diag_packet_capture.php:256
+#: usr/local/www/diag_packet_capture.php:273
+#: usr/local/www/diag_packet_capture.php:273
+msgid "Normal"
+msgstr "通常の"
+
+#: usr/local/www/diag_packet_capture.php:190
+#: usr/local/www/diag_packet_capture.php:210
+#: usr/local/www/diag_packet_capture.php:257
+#: usr/local/www/diag_packet_capture.php:274
+#: usr/local/www/diag_packet_capture.php:274
+msgid "Medium"
+msgstr "メディア"
+
+#: usr/local/www/diag_packet_capture.php:191
+#: usr/local/www/diag_packet_capture.php:211
+#: usr/local/www/diag_packet_capture.php:258
+#: usr/local/www/diag_packet_capture.php:275
+#: usr/local/www/diag_packet_capture.php:275
+msgid "High"
+msgstr "高い"
+
+#: usr/local/www/diag_packet_capture.php:192
+#: usr/local/www/diag_packet_capture.php:212
+#: usr/local/www/diag_packet_capture.php:259
+#: usr/local/www/diag_packet_capture.php:276
+#: usr/local/www/diag_packet_capture.php:276
+msgid "Full"
+msgstr "フル"
+
+#: usr/local/www/diag_packet_capture.php:194
+#: usr/local/www/diag_packet_capture.php:214
+#: usr/local/www/diag_packet_capture.php:261
+#: usr/local/www/diag_packet_capture.php:278
+#: usr/local/www/diag_packet_capture.php:278
+msgid ""
+"This is the level of detail that will be displayed after hitting 'Stop' when "
+"the packets have been captured."
+msgstr "パケットがキャプチャされてきた「これがとき' stop'を打った後に表示された詳細レベルである」 。"
+
+#: usr/local/www/diag_packet_capture.php:196
+#: usr/local/www/diag_packet_capture.php:216
+#: usr/local/www/diag_packet_capture.php:263
+#: usr/local/www/diag_packet_capture.php:280
+#: usr/local/www/diag_packet_capture.php:280
+msgid ""
+"This option does not affect the level of detail when downloading the packet "
+"capture."
+msgstr "キャプチャ"パケットをダウンロードするときにこのオプションは、詳細レベルには影響しません」 。"
+
+#: usr/local/www/diag_packet_capture.php:199
+#: usr/local/www/diag_packet_capture.php:219
+#: usr/local/www/diag_packet_capture.php:266
+#: usr/local/www/diag_packet_capture.php:284
+#: usr/local/www/diag_packet_capture.php:284
+msgid "Reverse DNS Lookup"
+msgstr "DNSの逆引き"
+
+#: usr/local/www/diag_packet_capture.php:202
+#: usr/local/www/diag_packet_capture.php:222
+#: usr/local/www/diag_packet_capture.php:269
+#: usr/local/www/diag_packet_capture.php:287
+#: usr/local/www/diag_packet_capture.php:287
+msgid ""
+"This check box will cause the packet capture to perform a reverse DNS lookup "
+"associated with all IP addresses."
+msgstr "すべてのIPアドレスに関連付けられている"このチェックボックスは、パケットキャプチャは、 DNSの逆引きが実行されます」 。"
+
+#: usr/local/www/diag_packet_capture.php:203
+#: usr/local/www/diag_packet_capture.php:223
+#: usr/local/www/diag_packet_capture.php:270
+#: usr/local/www/diag_packet_capture.php:288
+#: usr/local/www/diag_packet_capture.php:288
+msgid "This option can cause delays for large packet captures."
+msgstr "このオプションは、大規模なパケットキャプチャの遅延が発生する可能性があります。"
+
+#: usr/local/www/diag_packet_capture.php:226
+#: usr/local/www/diag_packet_capture.php:247
+#: usr/local/www/diag_packet_capture.php:294
+#: usr/local/www/diag_packet_capture.php:312
+#: usr/local/www/diag_packet_capture.php:312
+msgid "The packet capture file was last updated:"
+msgstr "パケットキャプチャファイルが最後に更新されました。"
+
+#: usr/local/www/diag_packet_capture.php:239
+#: usr/local/www/diag_packet_capture.php:267
+#: usr/local/www/diag_packet_capture.php:260
+#: usr/local/www/diag_packet_capture.php:296
+#: usr/local/www/diag_packet_capture.php:307
+#: usr/local/www/diag_packet_capture.php:343
+#: usr/local/www/diag_packet_capture.php:325
+#: usr/local/www/diag_packet_capture.php:361
+#: usr/local/www/diag_packet_capture.php:325
+#: usr/local/www/diag_packet_capture.php:361
+msgid "Packet Capture is running."
+msgstr "パケットキャプチャが実行されています。"
+
+#: usr/local/www/diag_packet_capture.php:272
+#: usr/local/www/diag_packet_capture.php:301
+#: usr/local/www/diag_packet_capture.php:347
+#: usr/local/www/diag_packet_capture.php:365
+#: usr/local/www/diag_packet_capture.php:365
+msgid "Packet Capture stopped."
+msgstr "パケットキャプチャを停止しました。"
+
+#: usr/local/www/diag_packet_capture.php:272
+#: usr/local/www/diag_packet_capture.php:301
+#: usr/local/www/diag_packet_capture.php:347
+#: usr/local/www/diag_packet_capture.php:365
+#: usr/local/www/diag_packet_capture.php:365
+msgid "Packets Captured:"
+msgstr "パケットは、保存されたビデオ:"
+
+#: usr/local/www/crash_reporter.php:68 usr/local/www/crash_reporter.php:68
+msgid "Unfortunately we have detected a programming bug."
+msgstr "残念ながら、我々は、プログラミングのバグを検出した。"
+
+#: usr/local/www/crash_reporter.php:69 usr/local/www/crash_reporter.php:69
+msgid ""
+"Would you like to submit the programming debug logs to the pfSense "
+"developers for inspection?"
+msgstr "検査のために開発者は「あなたはpfSenseにプログラミングデバッグログを送信したい"?"
+
+#: usr/local/www/crash_reporter.php:71 usr/local/www/crash_reporter.php:71
+msgid ""
+"Please double check the contents to ensure you are comfortable sending this "
+"information before clicking Yes."
+msgstr "[はい]をクリックする前にこの情報を送信することで快適であることを確認するために内容を再確認してください。"
+
+#: usr/local/www/crash_reporter.php:73 usr/local/www/crash_reporter.php:73
+msgid "Contents of crash reports"
+msgstr "クラッシュレポートの内容"
+
+#: usr/local/www/crash_reporter.php:76 usr/local/www/crash_reporter.php:76
+msgid " - Submit this to the developers for inspection"
+msgstr " - 検査のために、開発者にこれを提出"
+
+#: usr/local/www/crash_reporter.php:77 usr/local/www/crash_reporter.php:77
+msgid " - Just delete the crash report and take me back to the Dashboard"
+msgstr " - ちょうどクラッシュレポートを削除して、ダッシュボードに私を取り戻す"
+
+#: usr/local/www/crash_reporter.php:82 usr/local/www/crash_reporter.php:82
+msgid "Crash reporter"
+msgstr "クラッシュレポーター"
+
+#: usr/local/www/crash_reporter.php:101 usr/local/www/crash_reporter.php:103
+#: usr/local/www/crash_reporter.php:103
+msgid "Processing..."
+msgstr "処理中..."
+
+#: usr/local/www/crash_reporter.php:108 usr/local/www/crash_reporter.php:110
+#: usr/local/www/crash_reporter.php:112 usr/local/www/crash_reporter.php:112
+msgid "Uploading..."
+msgstr "アップロード..."
+
+#: usr/local/www/crash_reporter.php:116
+#: usr/local/www/services_captiveportal_zones_edit.php:115
+#: usr/local/www/crash_reporter.php:120
+#: usr/local/www/services_captiveportal_zones_edit.php:117
+#: usr/local/www/crash_reporter.php:122
+#: usr/local/www/services_captiveportal_zones_edit.php:115
+#: usr/local/www/crash_reporter.php:122
+msgid "Continue"
+msgstr "続ける"
+
+#: usr/local/www/crash_reporter.php:116 usr/local/www/crash_reporter.php:120
+#: usr/local/www/crash_reporter.php:122 usr/local/www/crash_reporter.php:122
+msgid " and delete crash report files from local disk."
+msgstr "ローカルディスクからのクラッシュレポートファイルを削除します。"
+
+#: usr/local/www/diag_authentication.php:52
+#: usr/local/www/diag_authentication.php:52
+msgid "is not a valid authentication server"
+msgstr "有効な認証サーバーではありません"
+
+#: usr/local/www/diag_authentication.php:55
+#: usr/local/www/diag_authentication.php:55
+msgid "A username and password must be specified."
+msgstr "ユーザー名とパスワードを指定する必要があります。"
+
+#: usr/local/www/diag_authentication.php:59
+#: usr/local/www/diag_authentication.php:59
+msgid "authenticated successfully."
+msgstr "認証に成功。"
+
+#: usr/local/www/diag_authentication.php:61
+#: usr/local/www/diag_authentication.php:61
+msgid "This user is a member of these groups"
+msgstr "このユーザーは、これらのグループのメンバーである"
+
+#: usr/local/www/diag_authentication.php:65
+#: usr/local/www/diag_authentication.php:65
+msgid "Authentication failed."
+msgstr "認証に失敗しました。"
+
+#: usr/local/www/diag_authentication.php:69 usr/local/www/interfaces.php:2325
+#: usr/local/www/services_captiveportal.php:578
+#: usr/local/www/services_captiveportal.php:893 usr/local/www/fbegin.inc:189
+#: usr/local/www/fbegin.inc:207 usr/local/www/services_captiveportal.php:583
+#: usr/local/www/services_captiveportal.php:938
+#: usr/local/www/interfaces.php:2505 usr/local/www/fbegin.inc:215
+#: usr/local/www/services_captiveportal.php:581
+#: usr/local/www/services_captiveportal.php:934
+#: usr/local/www/interfaces.php:2493
+#: usr/local/www/services_captiveportal.php:575
+#: usr/local/www/services_captiveportal.php:936 usr/local/www/fbegin.inc:206
+#: usr/local/www/interfaces.php:2523
+#: usr/local/www/services_captiveportal.php:591
+#: usr/local/www/services_captiveportal.php:952
+#: usr/local/www/interfaces.php:2569 usr/local/www/interfaces.php:2558
+#: usr/local/www/diag_authentication.php:69
+#: usr/local/www/services_captiveportal.php:591
+#: usr/local/www/services_captiveportal.php:952 usr/local/www/fbegin.inc:206
+#: usr/local/www/interfaces.php:2558
+msgid "Authentication"
+msgstr "認証"
+
+#: usr/local/www/diag_authentication.php:90
+#: usr/local/www/system_authservers.php:82
+#: usr/local/www/system_usermanager_settings.php:140
+#: usr/local/www/diag_authentication.php:91
+#: usr/local/www/system_authservers.php:83
+#: usr/local/www/system_usermanager_settings.php:143
+#: usr/local/www/diag_authentication.php:91
+#: usr/local/www/system_authservers.php:83
+#: usr/local/www/system_usermanager_settings.php:143
+msgid "Authentication Server"
+msgstr "認証サーバー"
+
+#: usr/local/www/diag_authentication.php:106
+#: usr/local/www/status_captiveportal.php:162
+#: usr/local/www/firewall_aliases_edit.php:470
+#: usr/local/www/interfaces.php:1724 usr/local/www/interfaces.php:1789
+#: usr/local/www/interfaces.php:1895
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:191
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:510
+#: usr/local/www/vpn_pptp_users.php:98
+#: usr/local/www/vpn_pptp_users_edit.php:76
+#: usr/local/www/vpn_pptp_users_edit.php:79
+#: usr/local/www/vpn_pptp_users_edit.php:146
+#: usr/local/www/services_dyndns_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:213
+#: usr/local/www/system_usermanager.php:177
+#: usr/local/www/system_usermanager.php:182
+#: usr/local/www/system_usermanager.php:187
+#: usr/local/www/system_usermanager.php:475
+#: usr/local/www/system_usermanager.php:787
+#: usr/local/www/vpn_l2tp_users.php:101
+#: usr/local/www/vpn_l2tp_users_edit.php:78
+#: usr/local/www/vpn_l2tp_users_edit.php:81
+#: usr/local/www/vpn_l2tp_users_edit.php:154
+#: usr/local/www/vpn_openvpn_client.php:531
+#: usr/local/www/vpn_pppoe_edit.php:536
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:95
+#: usr/local/www/services_dyndns_edit.php:99
+#: usr/local/www/services_dyndns_edit.php:296
+#: usr/local/www/system_usermanager.php:473
+#: usr/local/www/system_usermanager.php:785
+#: usr/local/www/firewall_aliases_edit.php:473
+#: usr/local/www/interfaces.php:1902 usr/local/www/interfaces.php:1967
+#: usr/local/www/interfaces.php:2073 usr/local/www/vpn_openvpn_client.php:536
+#: usr/local/www/vpn_pppoe_edit.php:537
+#: usr/local/www/system_usermanager.php:786
+#: usr/local/www/interfaces_ppps_edit.php:511
+#: usr/local/www/firewall_aliases_edit.php:475
+#: usr/local/www/vpn_l2tp_users.php:102
+#: usr/local/www/diag_authentication.php:107
+#: usr/local/www/vpn_pptp_users_edit.php:147 usr/local/www/interfaces.php:1890
+#: usr/local/www/interfaces.php:1955 usr/local/www/interfaces.php:2061
+#: usr/local/www/vpn_openvpn_client.php:554
+#: usr/local/www/vpn_l2tp_users_edit.php:79
+#: usr/local/www/vpn_l2tp_users_edit.php:82
+#: usr/local/www/vpn_l2tp_users_edit.php:155
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:97
+#: usr/local/www/vpn_pptp_users.php:99
+#: usr/local/www/vpn_openvpn_client.php:573
+#: usr/local/www/services_dyndns_edit.php:300
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:197
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces_ppps_edit.php:517
+#: usr/local/www/vpn_pppoe_edit.php:540
+#: usr/local/www/status_captiveportal.php:148
+#: usr/local/www/interfaces.php:1914 usr/local/www/interfaces.php:1982
+#: usr/local/www/interfaces.php:2091
+#: usr/local/www/services_dyndns_edit.php:100
+#: usr/local/www/services_dyndns_edit.php:308
+#: usr/local/www/firewall_aliases_edit.php:497
+#: usr/local/www/interfaces.php:1960 usr/local/www/interfaces.php:2028
+#: usr/local/www/interfaces.php:2137
+#: usr/local/www/interfaces_ppps_edit.php:515
+#: usr/local/www/interfaces.php:1948 usr/local/www/interfaces.php:2017
+#: usr/local/www/interfaces.php:2126 usr/local/www/diag_authentication.php:107
+#: usr/local/www/vpn_pptp_users.php:99
+#: usr/local/www/vpn_openvpn_client.php:573
+#: usr/local/www/services_dyndns_edit.php:100
+#: usr/local/www/services_dyndns_edit.php:308
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:197
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces_ppps_edit.php:515
+#: usr/local/www/vpn_pppoe_edit.php:540 usr/local/www/vpn_l2tp_users.php:102
+#: usr/local/www/status_captiveportal.php:148
+#: usr/local/www/firewall_aliases_edit.php:483
+#: usr/local/www/vpn_l2tp_users_edit.php:79
+#: usr/local/www/vpn_l2tp_users_edit.php:82
+#: usr/local/www/vpn_l2tp_users_edit.php:155
+#: usr/local/www/vpn_pptp_users_edit.php:76
+#: usr/local/www/vpn_pptp_users_edit.php:79
+#: usr/local/www/vpn_pptp_users_edit.php:147
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:95
+#: usr/local/www/system_usermanager.php:177
+#: usr/local/www/system_usermanager.php:182
+#: usr/local/www/system_usermanager.php:187
+#: usr/local/www/system_usermanager.php:473
+#: usr/local/www/system_usermanager.php:786 usr/local/www/interfaces.php:1948
+#: usr/local/www/interfaces.php:2017 usr/local/www/interfaces.php:2126
+msgid "Username"
+msgstr "ユーザ名"
+
+#: usr/local/www/diag_authentication.php:112 usr/local/www/interfaces.php:1730
+#: usr/local/www/interfaces.php:1795 usr/local/www/interfaces.php:1901
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:191
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:516
+#: usr/local/www/vpn_pptp_users_edit.php:79
+#: usr/local/www/vpn_pptp_users_edit.php:151
+#: usr/local/www/services_dyndns_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:220
+#: usr/local/www/system_advanced_notifications.php:192
+#: usr/local/www/system_usermanager.php:183
+#: usr/local/www/system_usermanager.php:188
+#: usr/local/www/system_usermanager.php:482
+#: usr/local/www/system_usermanager_passwordmg.php:50
+#: usr/local/www/system_usermanager_passwordmg.php:98
+#: usr/local/www/system_usermanager_passwordmg.php:101
+#: usr/local/www/vpn_l2tp_users_edit.php:81
+#: usr/local/www/vpn_l2tp_users_edit.php:159
+#: usr/local/www/vpn_openvpn_client.php:541
+#: usr/local/www/vpn_pppoe_edit.php:537
+#: usr/local/www/services_dyndns_edit.php:97
+#: usr/local/www/services_dyndns_edit.php:305
+#: usr/local/www/system_usermanager.php:480
+#: usr/local/www/system_advanced_notifications.php:201
+#: usr/local/www/interfaces.php:1908 usr/local/www/interfaces.php:1973
+#: usr/local/www/interfaces.php:2079 usr/local/www/vpn_openvpn_client.php:546
+#: usr/local/www/vpn_pppoe_edit.php:538
+#: usr/local/www/interfaces_ppps_edit.php:517
+#: usr/local/www/system_usermanager_passwordmg.php:99
+#: usr/local/www/system_usermanager_passwordmg.php:102
+#: usr/local/www/diag_authentication.php:113
+#: usr/local/www/vpn_pptp_users_edit.php:152 usr/local/www/interfaces.php:1896
+#: usr/local/www/interfaces.php:1961 usr/local/www/interfaces.php:2067
+#: usr/local/www/vpn_openvpn_client.php:564
+#: usr/local/www/vpn_l2tp_users_edit.php:82
+#: usr/local/www/vpn_l2tp_users_edit.php:160
+#: usr/local/www/vpn_openvpn_client.php:583
+#: usr/local/www/services_dyndns_edit.php:309
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:197
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces_ppps_edit.php:523
+#: usr/local/www/vpn_pppoe_edit.php:541
+#: usr/local/www/system_usermanager_passwordmg.php:104
+#: usr/local/www/system_usermanager_passwordmg.php:107
+#: usr/local/www/interfaces.php:1920 usr/local/www/interfaces.php:1988
+#: usr/local/www/interfaces.php:2097 usr/local/www/services_dyndns_edit.php:98
+#: usr/local/www/services_dyndns_edit.php:317
+#: usr/local/www/interfaces.php:1966 usr/local/www/interfaces.php:2034
+#: usr/local/www/interfaces.php:2143
+#: usr/local/www/interfaces_ppps_edit.php:521
+#: usr/local/www/interfaces.php:1954 usr/local/www/interfaces.php:2023
+#: usr/local/www/interfaces.php:2132 usr/local/www/diag_authentication.php:113
+#: usr/local/www/vpn_openvpn_client.php:583
+#: usr/local/www/services_dyndns_edit.php:98
+#: usr/local/www/services_dyndns_edit.php:317
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:197
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces_ppps_edit.php:521
+#: usr/local/www/vpn_pppoe_edit.php:541
+#: usr/local/www/system_usermanager_passwordmg.php:50
+#: usr/local/www/system_usermanager_passwordmg.php:104
+#: usr/local/www/system_usermanager_passwordmg.php:107
+#: usr/local/www/vpn_l2tp_users_edit.php:82
+#: usr/local/www/vpn_l2tp_users_edit.php:160
+#: usr/local/www/system_advanced_notifications.php:201
+#: usr/local/www/vpn_pptp_users_edit.php:79
+#: usr/local/www/vpn_pptp_users_edit.php:152
+#: usr/local/www/system_usermanager.php:183
+#: usr/local/www/system_usermanager.php:188
+#: usr/local/www/system_usermanager.php:480 usr/local/www/interfaces.php:1954
+#: usr/local/www/interfaces.php:2023 usr/local/www/interfaces.php:2132
+msgid "Password"
+msgstr "パスワード"
+
+#: usr/local/www/diag_authentication.php:120 usr/local/www/diag_smart.php:346
+#: usr/local/www/diag_authentication.php:121
+#: usr/local/www/diag_testport.php:179 usr/local/www/diag_smart.php:367
+#: usr/local/www/diag_testport.php:181
+#: usr/local/www/diag_authentication.php:121
+#: usr/local/www/diag_testport.php:181 usr/local/www/diag_smart.php:367
+msgid "Test"
+msgstr "テスト"
+
+#: usr/local/www/services_dyndns.php:76 usr/local/www/services_dyndns.php:85
+#: usr/local/www/services_dyndns.php:64 usr/local/www/services_dyndns.php:60
+#: usr/local/www/services_dyndns.php:60
+msgid "Dynamic DNS clients"
+msgstr "ダイナミックDNSクライアント"
+
+#: usr/local/www/services_dyndns.php:89 usr/local/www/services_rfc2136.php:68
+#: usr/local/www/services_dyndns.php:98 usr/local/www/services_dyndns.php:78
+#: usr/local/www/services_dyndns.php:74 usr/local/www/services_rfc2136.php:68
+#: usr/local/www/services_dyndns.php:74
+msgid "DynDns"
+msgstr "ダイナミックDNS"
+
+#: usr/local/www/services_dyndns.php:90 usr/local/www/services_rfc2136.php:69
+#: usr/local/www/services_dyndns.php:99 usr/local/www/services_dyndns.php:79
+#: usr/local/www/services_dyndns.php:75 usr/local/www/services_rfc2136.php:69
+#: usr/local/www/services_dyndns.php:75
+msgid "RFC 2136"
+msgstr "RFC 2136"
+
+#: usr/local/www/services_dyndns.php:100 usr/local/www/status_services.php:244
+#: usr/local/www/services_dyndns.php:109 usr/local/www/status_services.php:240
+#: usr/local/www/status_services.php:238
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:52
+#: usr/local/www/services_dyndns.php:90 usr/local/www/status_services.php:79
+#: usr/local/www/status_openvpn.php:279 usr/local/www/status_openvpn.php:340
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:79
+#: usr/local/www/services_dyndns.php:86 usr/local/www/status_services.php:79
+#: usr/local/www/status_openvpn.php:279 usr/local/www/status_openvpn.php:340
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:79
+#: usr/local/www/services_dyndns.php:86
+msgid "Service"
+msgstr "サービス"
+
+#: usr/local/www/services_dyndns.php:101 usr/local/www/interfaces.php:1612
+#: usr/local/www/system.php:113 usr/local/www/system.php:254
+#: usr/local/www/services_dhcp.php:892
+#: usr/local/www/services_dhcp_edit.php:228
+#: usr/local/www/services_captiveportal_hostname.php:122
+#: usr/local/www/services_captiveportal_hostname_edit.php:176
+#: usr/local/www/services_captiveportal_hostname_edit.php:180
+#: usr/local/www/diag_arp.php:315 usr/local/www/services_dyndns_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:184
+#: usr/local/www/services_rfc2136.php:79
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:146
+#: usr/local/www/status_dhcp_leases.php:320 usr/local/www/diag_ndp.php:131
+#: usr/local/www/services_dhcpv6.php:805
+#: usr/local/www/services_dhcpv6_edit.php:205
+#: usr/local/www/services_dyndns_edit.php:95
+#: usr/local/www/services_dyndns_edit.php:267
+#: usr/local/www/services_dhcpv6_edit.php:208
+#: usr/local/www/status_dhcp_leases.php:341
+#: usr/local/www/services_dyndns.php:110 usr/local/www/services_dhcp.php:930
+#: usr/local/www/services_dhcp_edit.php:231 usr/local/www/interfaces.php:1690
+#: usr/local/www/system.php:114 usr/local/www/system.php:265
+#: usr/local/www/services_dhcpv6.php:900
+#: usr/local/www/services_dhcpv6_edit.php:210
+#: usr/local/www/services_captiveportal_hostname_edit.php:174
+#: usr/local/www/services_captiveportal_hostname_edit.php:178
+#: usr/local/www/services_captiveportal_hostname.php:120
+#: usr/local/www/status_dhcp_leases.php:343
+#: usr/local/www/services_dhcp.php:1134
+#: usr/local/www/services_dhcp_edit.php:233 usr/local/www/interfaces.php:1678
+#: usr/local/www/system.php:107 usr/local/www/system.php:258
+#: usr/local/www/services_dhcpv6.php:831 usr/local/www/services_rfc2136.php:80
+#: usr/local/www/services_dhcpv6_edit.php:213
+#: usr/local/www/services_dyndns_edit.php:271
+#: usr/local/www/services_dhcp_edit.php:361
+#: usr/local/www/services_dhcp.php:1153 usr/local/www/services_dhcpv6.php:852
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:53
+#: usr/local/www/services_dyndns.php:91
+#: usr/local/www/services_dyndns_edit.php:96
+#: usr/local/www/services_dyndns_edit.php:273
+#: usr/local/www/services_dhcp.php:1173
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:80
+#: usr/local/www/services_dyndns.php:87 usr/local/www/interfaces.php:1736
+#: usr/local/www/interfaces.php:1728 usr/local/www/services_rfc2136.php:80
+#: usr/local/www/diag_ndp.php:131 usr/local/www/diag_arp.php:315
+#: usr/local/www/services_dhcpv6_edit.php:213
+#: usr/local/www/services_dyndns_edit.php:96
+#: usr/local/www/services_dyndns_edit.php:273 usr/local/www/system.php:107
+#: usr/local/www/system.php:258
+#: usr/local/www/services_captiveportal_hostname_edit.php:176
+#: usr/local/www/services_captiveportal_hostname_edit.php:180
+#: usr/local/www/services_dhcp_edit.php:361
+#: usr/local/www/services_dhcp.php:1173
+#: usr/local/www/services_captiveportal_hostname.php:120
+#: usr/local/www/services_dhcpv6.php:852
+#: usr/local/www/status_dhcp_leases.php:343
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:80
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:146
+#: usr/local/www/services_dyndns.php:87 usr/local/www/interfaces.php:1728
+msgid "Hostname"
+msgstr "ホスト名"
+
+#: usr/local/www/services_dyndns.php:102 usr/local/www/services_dyndns.php:111
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:54
+#: usr/local/www/services_dyndns.php:92
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:81
+#: usr/local/www/services_dyndns.php:88
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:81
+#: usr/local/www/services_dyndns.php:88
+msgid "Cached IP"
+msgstr "キャッシュされたIPアドレス"
+
+#: usr/local/www/services_dyndns.php:151 usr/local/www/services_wol.php:188
+#: usr/local/www/firewall_virtual_ip.php:221
+#: usr/local/www/system_advanced_sysctl.php:199
+#: usr/local/www/services_captiveportal_zones.php:89
+#: usr/local/www/services_dyndns.php:172
+#: usr/local/www/services_captiveportal_zones.php:90
+#: usr/local/www/firewall_virtual_ip.php:227
+#: usr/local/www/firewall_virtual_ip.php:247
+#: usr/local/www/services_dyndns.php:171 usr/local/www/services_dyndns.php:167
+#: usr/local/www/firewall_virtual_ip.php:270
+#: usr/local/www/services_wol.php:188
+#: usr/local/www/firewall_virtual_ip.php:270
+#: usr/local/www/services_captiveportal_zones.php:90
+#: usr/local/www/services_dyndns.php:167
+#: usr/local/www/system_advanced_sysctl.php:199
+msgid "Do you really want to delete this entry?"
+msgstr "あなたは本当に、このエントリを削除しますか?"
+
+#: usr/local/www/services_dyndns.php:162 usr/local/www/services_dyndns.php:183
+#: usr/local/www/services_dyndns.php:179 usr/local/www/services_dyndns.php:179
+msgid ""
+"IP addresses appearing in green are up to date with Dynamic DNS provider."
+msgstr "「緑の中に現れるIPアドレスは、ダイナミックDNSプロバイダとの最新のものである。"
+
+#: usr/local/www/graph_cpu.php:83 usr/local/www/graph_cpu.php:83
+msgid "Cannot get CPU load"
+msgstr "CPU負荷を取得できません"
+
+#: usr/local/www/graph_cpu.php:84 usr/local/www/graph.php:123
+#: usr/local/www/graph.php:123 usr/local/www/graph_cpu.php:84
+msgid "Collecting initial data, please wait"
+msgstr "初期データを収集しています。しばらくお待ちください"
+
+#: usr/local/www/graph_cpu.php:96 usr/local/www/graph.php:135
+#: usr/local/www/graph.php:135 usr/local/www/graph_cpu.php:96
+msgid "No URL for getURL"
+msgstr "のgetURLのためのURLがない"
+
+#: usr/local/www/graph_cpu.php:103 usr/local/www/graph.php:142
+#: usr/local/www/graph.php:142 usr/local/www/graph_cpu.php:103
+msgid "No callback function for getURL"
+msgstr "のgetURLのためのコールバック関数ません"
+
+#: usr/local/www/graph_cpu.php:119 usr/local/www/graph.php:158
+#: usr/local/www/graph.php:158 usr/local/www/graph_cpu.php:119
+msgid "Both getURL and XMLHttpRequest are undefined"
+msgstr "のgetURLとXMLHttpRequestの両方が定義されていません"
+
+#: usr/local/www/services_snmp.php:87 usr/local/www/services_snmp.php:91
+#: usr/local/www/services_snmp.php:91
+msgid "Invalid character '#' in system location"
+msgstr "無効な文字'"
+
+#: usr/local/www/services_snmp.php:88 usr/local/www/services_snmp.php:92
+#: usr/local/www/services_snmp.php:92
+msgid "Invalid character '#' in system contact"
+msgstr "無効な文字'"
+
+#: usr/local/www/services_snmp.php:89 usr/local/www/services_snmp.php:93
+#: usr/local/www/services_snmp.php:93
+msgid "Invalid character '#' in read community string"
+msgstr "無効な文字'"
+
+#: usr/local/www/services_snmp.php:92 usr/local/www/services_snmp.php:96
+#: usr/local/www/services_snmp.php:96
+msgid "Community"
+msgstr "コミュニティ"
+
+#: usr/local/www/services_snmp.php:96 usr/local/www/services_snmp.php:100
+#: usr/local/www/services_snmp.php:100
+msgid "Polling Port"
+msgstr "ポーリングポート"
+
+#: usr/local/www/services_snmp.php:103 usr/local/www/services_snmp.php:107
+#: usr/local/www/services_snmp.php:107
+msgid "Invalid character '#' in SNMP trap string"
+msgstr "無効な文字'"
+
+#: usr/local/www/services_snmp.php:106 usr/local/www/services_snmp.php:342
+#: usr/local/www/services_snmp.php:340 usr/local/www/services_snmp.php:341
+#: usr/local/www/services_snmp.php:110 usr/local/www/services_snmp.php:351
+#: usr/local/www/services_snmp.php:110 usr/local/www/services_snmp.php:351
+msgid "Trap server"
+msgstr "トラップサーバ"
+
+#: usr/local/www/services_snmp.php:110 usr/local/www/services_snmp.php:114
+#: usr/local/www/services_snmp.php:114
+msgid "Trap server port"
+msgstr "トラップサーバポート"
+
+#: usr/local/www/services_snmp.php:114 usr/local/www/services_snmp.php:361
+#: usr/local/www/services_snmp.php:359 usr/local/www/services_snmp.php:360
+#: usr/local/www/services_snmp.php:118 usr/local/www/services_snmp.php:370
+#: usr/local/www/services_snmp.php:118 usr/local/www/services_snmp.php:370
+msgid "Trap string"
+msgstr "トラップ文字列"
+
+#: usr/local/www/services_snmp.php:159 usr/local/www/fbegin.inc:134
+#: usr/local/www/fbegin.inc:152 usr/local/www/fbegin.inc:160
+#: usr/local/www/fbegin.inc:151 usr/local/www/services_snmp.php:165
+#: usr/local/www/fbegin.inc:151 usr/local/www/services_snmp.php:165
+msgid "SNMP"
+msgstr "SNMP"
+
+#: usr/local/www/services_snmp.php:275 usr/local/www/services_snmp.php:273
+#: usr/local/www/services_snmp.php:274 usr/local/www/services_snmp.php:284
+#: usr/local/www/services_snmp.php:284
+msgid "SNMP Daemon"
+msgstr "SNMPデーモン"
+
+#: usr/local/www/services_snmp.php:281 usr/local/www/services_snmp.php:279
+#: usr/local/www/services_snmp.php:280 usr/local/www/services_snmp.php:290
+#: usr/local/www/services_snmp.php:290
+msgid "Polling Port "
+msgstr "ポーリングポート"
+
+#: usr/local/www/services_snmp.php:284 usr/local/www/services_snmp.php:282
+#: usr/local/www/services_snmp.php:283 usr/local/www/services_snmp.php:293
+#: usr/local/www/services_snmp.php:293
+msgid "Enter the port to accept polling events on (default 161)"
+msgstr "(デフォルト161 )上でのポーリングイベントを受け入れるためにポートを入力します"
+
+#: usr/local/www/services_snmp.php:289 usr/local/www/services_snmp.php:287
+#: usr/local/www/services_snmp.php:288 usr/local/www/services_snmp.php:298
+#: usr/local/www/services_snmp.php:298
+msgid "System location"
+msgstr "システムの場所"
+
+#: usr/local/www/services_snmp.php:296 usr/local/www/services_snmp.php:294
+#: usr/local/www/services_snmp.php:295 usr/local/www/services_snmp.php:305
+#: usr/local/www/services_snmp.php:305
+msgid "System contact"
+msgstr "システムの連絡先"
+
+#: usr/local/www/services_snmp.php:303 usr/local/www/services_snmp.php:301
+#: usr/local/www/services_snmp.php:302 usr/local/www/services_snmp.php:312
+#: usr/local/www/services_snmp.php:312
+msgid "Read Community String"
+msgstr "コミュニティストリングを読む"
+
+#: usr/local/www/services_snmp.php:306 usr/local/www/services_snmp.php:304
+#: usr/local/www/services_snmp.php:305 usr/local/www/services_snmp.php:315
+#: usr/local/www/services_snmp.php:315
+msgid ""
+"The community string is like a password, restricting access to querying SNMP "
+"to hosts knowing the community string. Use a strong value here to protect "
+"from unauthorized information disclosure."
+msgstr "コミュニティストリングを知っているホストに「コミュニティ文字列は、SNMPを照会へのアクセスを制限する、パスワードのようなものです」 。不正な情報開示から「保護するためにここに強力な値を使用します。"
+
+#: usr/local/www/services_snmp.php:335 usr/local/www/services_snmp.php:333
+#: usr/local/www/services_snmp.php:334 usr/local/www/services_snmp.php:344
+#: usr/local/www/services_snmp.php:344
+msgid "SNMP Traps"
+msgstr "SNMPトラップ"
+
+#: usr/local/www/services_snmp.php:345 usr/local/www/services_snmp.php:343
+#: usr/local/www/services_snmp.php:344 usr/local/www/services_snmp.php:354
+#: usr/local/www/services_snmp.php:354
+msgid "Enter trap server name"
+msgstr "トラップサーバ名を入力してください"
+
+#: usr/local/www/services_snmp.php:350 usr/local/www/services_snmp.php:348
+#: usr/local/www/services_snmp.php:349 usr/local/www/services_snmp.php:359
+#: usr/local/www/services_snmp.php:359
+msgid "Trap server port "
+msgstr "トラップサーバポート"
+
+#: usr/local/www/services_snmp.php:353 usr/local/www/services_snmp.php:351
+#: usr/local/www/services_snmp.php:352 usr/local/www/services_snmp.php:362
+#: usr/local/www/services_snmp.php:362
+msgid "Enter the port to send the traps to (default 162)"
+msgstr "(デフォルト162 )にトラップを送信するようにポートを入力します"
+
+#: usr/local/www/services_snmp.php:358 usr/local/www/services_snmp.php:356
+#: usr/local/www/services_snmp.php:357 usr/local/www/services_snmp.php:367
+#: usr/local/www/services_snmp.php:367
+msgid "Enter the SNMP trap string"
+msgstr "SNMPトラップの文字列を入力してください"
+
+#: usr/local/www/services_snmp.php:370 usr/local/www/services_snmp.php:368
+#: usr/local/www/services_snmp.php:369 usr/local/www/services_snmp.php:379
+#: usr/local/www/services_snmp.php:379
+msgid "Modules"
+msgstr "モジュール"
+
+#: usr/local/www/services_snmp.php:376 usr/local/www/services_snmp.php:374
+#: usr/local/www/services_snmp.php:375 usr/local/www/services_snmp.php:385
+#: usr/local/www/services_snmp.php:385
+msgid "SNMP Modules"
+msgstr "SNMPモジュール"
+
+#: usr/local/www/services_snmp.php:378 usr/local/www/services_snmp.php:376
+#: usr/local/www/services_snmp.php:377 usr/local/www/services_snmp.php:387
+#: usr/local/www/services_snmp.php:387
+msgid "MibII"
+msgstr "MIBII"
+
+#: usr/local/www/services_snmp.php:380 usr/local/www/services_snmp.php:378
+#: usr/local/www/services_snmp.php:379 usr/local/www/services_snmp.php:389
+#: usr/local/www/services_snmp.php:389
+msgid "Netgraph"
+msgstr "NETGRAPH"
+
+#: usr/local/www/services_snmp.php:382 usr/local/www/license.php:171
+#: usr/local/www/services_snmp.php:380 usr/local/www/services_snmp.php:381
+#: usr/local/www/services_snmp.php:391 usr/local/www/license.php:171
+#: usr/local/www/services_snmp.php:391
+msgid "PF"
+msgstr "PF"
+
+#: usr/local/www/services_snmp.php:384 usr/local/www/services_snmp.php:382
+#: usr/local/www/services_snmp.php:383 usr/local/www/services_snmp.php:393
+#: usr/local/www/services_snmp.php:393
+msgid "Host Resources (Requires MibII)"
+msgstr "ホストリソース( MIBIIが必要です)"
+
+#: usr/local/www/services_snmp.php:391
+msgid "Bind to LAN interface only"
+msgstr "LANインターフェイスにバインドするだけ"
+
+#: usr/local/www/services_snmp.php:393
+msgid ""
+"This option can be useful when trying to access the SNMP agent by the LAN "
+"interface's IP address through a VPN tunnel terminated on the WAN interface."
+msgstr "WANインターフェイス上で終端VPNトンネル経由でインターフェイスのIPアドレス「LANによってSNMPエージェントにアクセスしようとすると、このオプションが役立ちます」 。"
+
+#: usr/local/www/headjs.php:143 usr/local/www/firewall_rules.php:315
+#: usr/local/www/firewall_rules.php:319 usr/local/www/guiconfig.inc:302
+#: usr/local/www/firewall_rules.php:312 usr/local/www/guiconfig.inc:291
+#: usr/local/www/guiconfig.inc:290 usr/local/www/headjs.php:146
+#: usr/local/www/firewall_rules.php:311 usr/local/www/guiconfig.inc:287
+#: usr/local/www/firewall_rules.php:311 usr/local/www/guiconfig.inc:287
+#: usr/local/www/headjs.php:146
+msgid "Apply changes"
+msgstr "変更を適用"
+
+#: usr/local/www/services_wol.php:63 usr/local/www/services_wol.php:63
+#, php-format
+msgid "Sent magic packet to %1$s (%2$s)%3$s"
+msgstr "は%1$s ( %2$s ) %3$sにマジックパケットを送信した"
+
+#: usr/local/www/services_wol.php:65 usr/local/www/services_wol.php:65
+#, php-format
+msgid ""
+"Please check the %1$ssystem log%2$s, the wol command for %3$s (%4$s) did not "
+"complete successfully%5$s"
+msgstr "「 ( $ S % 4 ) %3$sため、 WOLコマンドを%1$ssystemのlog%2$sを確認してくださいませんでした"5 $ sの%正常に完了"
+
+#: usr/local/www/services_wol.php:86 usr/local/www/services_wol_edit.php:90
+#: usr/local/www/interfaces.php:541 usr/local/www/services_dhcp_edit.php:129
+#: usr/local/www/services_dhcp_edit.php:131 usr/local/www/interfaces.php:611
+#: usr/local/www/interfaces.php:608 usr/local/www/services_dhcp_edit.php:165
+#: usr/local/www/interfaces.php:623 usr/local/www/interfaces.php:634
+#: usr/local/www/interfaces.php:630 usr/local/www/services_wol.php:86
+#: usr/local/www/services_dhcp_edit.php:165
+#: usr/local/www/services_wol_edit.php:90 usr/local/www/interfaces.php:630
+msgid "A valid MAC address must be specified."
+msgstr "有効なMACアドレスを指定する必要があります。"
+
+#: usr/local/www/services_wol.php:88 usr/local/www/services_wol.php:88
+msgid "A valid interface must be specified."
+msgstr "有効なインターフェイスを指定する必要があります。"
+
+#: usr/local/www/services_wol.php:94 usr/local/www/services_wol.php:94
+msgid "A valid ip could not be found!"
+msgstr "有効なIPが見つかりませんでした !"
+
+#: usr/local/www/services_wol.php:99 usr/local/www/services_wol.php:99
+#, php-format
+msgid "Sent magic packet to %s."
+msgstr "%s.に送信されたマジックパケット"
+
+#: usr/local/www/services_wol.php:101 usr/local/www/services_wol.php:101
+#, php-format
+msgid ""
+"Please check the %1$ssystem log%2$s, the wol command for %3$s did not "
+"complete successfully%4$s"
+msgstr "「 %1$ssystemのlog%2$sを確認してください、 %3$s用WOLコマンドはしませんでした"4 $ sの%正常に完了"
+
+#: usr/local/www/services_wol.php:115 usr/local/www/services_wol.php:127
+#: usr/local/www/services_wol_edit.php:112 usr/local/www/diag_backup.php:123
+#: usr/local/www/fbegin.inc:142 usr/local/www/fbegin.inc:159
+#: usr/local/www/diag_backup.php:201 usr/local/www/fbegin.inc:167
+#: usr/local/www/fbegin.inc:158 usr/local/www/services_wol.php:115
+#: usr/local/www/services_wol.php:127 usr/local/www/services_wol_edit.php:112
+#: usr/local/www/diag_backup.php:201 usr/local/www/fbegin.inc:158
+msgid "Wake on LAN"
+msgstr "Wake On LANの"
+
+#: usr/local/www/services_wol.php:141 usr/local/www/services_wol.php:141
+msgid "Choose which interface the host to be woken up is connected to."
+msgstr "に接続されているウェイクアップするホストとのインターフェースかを選択。"
+
+#: usr/local/www/services_wol.php:144 usr/local/www/services_wol.php:162
+#: usr/local/www/services_wol_edit.php:82
+#: usr/local/www/services_wol_edit.php:140
+#: usr/local/www/status_captiveportal.php:161
+#: usr/local/www/interfaces.php:1283
+#: usr/local/www/services_captiveportal_mac.php:167
+#: usr/local/www/services_captiveportal_mac_edit.php:98
+#: usr/local/www/services_captiveportal_mac_edit.php:175
+#: usr/local/www/services_dhcp.php:890
+#: usr/local/www/services_dhcp_edit.php:106
+#: usr/local/www/services_dhcp_edit.php:207
+#: usr/local/www/status_interfaces.php:178 usr/local/www/diag_arp.php:314
+#: usr/local/www/status_dhcp_leases.php:319 usr/local/www/diag_ndp.php:130
+#: usr/local/www/status_interfaces.php:252
+#: usr/local/www/status_dhcp_leases.php:340
+#: usr/local/www/services_dhcp.php:928
+#: usr/local/www/services_dhcp_edit.php:108
+#: usr/local/www/services_dhcp_edit.php:210 usr/local/www/interfaces.php:1387
+#: usr/local/www/status_interfaces.php:255
+#: usr/local/www/services_captiveportal_mac.php:165
+#: usr/local/www/services_captiveportal_mac_edit.php:96
+#: usr/local/www/services_captiveportal_mac_edit.php:173
+#: usr/local/www/status_dhcp_leases.php:342
+#: usr/local/www/services_dhcp.php:1132
+#: usr/local/www/services_dhcp_edit.php:209 usr/local/www/interfaces.php:1375
+#: usr/local/www/services_dhcp_edit.php:142
+#: usr/local/www/services_dhcp_edit.php:337
+#: usr/local/www/services_dhcp.php:1151
+#: usr/local/www/services_captiveportal_mac_edit.php:180
+#: usr/local/www/status_captiveportal.php:147
+#: usr/local/www/services_captiveportal_mac.php:175
+#: usr/local/www/interfaces.php:1388 usr/local/www/services_dhcp.php:1171
+#: usr/local/www/interfaces.php:1430 usr/local/www/interfaces.php:1425
+#: usr/local/www/diag_ndp.php:130 usr/local/www/diag_arp.php:314
+#: usr/local/www/services_wol.php:144 usr/local/www/services_wol.php:162
+#: usr/local/www/services_dhcp_edit.php:142
+#: usr/local/www/services_dhcp_edit.php:337
+#: usr/local/www/services_wol_edit.php:82
+#: usr/local/www/services_wol_edit.php:140
+#: usr/local/www/status_interfaces.php:255
+#: usr/local/www/services_dhcp.php:1171
+#: usr/local/www/services_captiveportal_mac_edit.php:96
+#: usr/local/www/services_captiveportal_mac_edit.php:180
+#: usr/local/www/status_captiveportal.php:147
+#: usr/local/www/status_dhcp_leases.php:342
+#: usr/local/www/services_captiveportal_mac.php:175
+#: usr/local/www/interfaces.php:1425
+msgid "MAC address"
+msgstr "MACアドレス"
+
+#: usr/local/www/services_wol.php:148 usr/local/www/services_wol.php:148
+msgid "Enter a MAC address "
+msgstr "MACアドレスを入力してください"
+
+#: usr/local/www/services_wol.php:148 usr/local/www/services_wol.php:148
+msgid "in the following format: xx:xx:xx:xx:xx:xx"
+msgstr "次の形式で: XX : XX : XX : XX : XX : XX"
+
+#: usr/local/www/services_wol.php:152 usr/local/www/diag_smart.php:244
+#: usr/local/www/diag_smart.php:265 usr/local/www/services_wol.php:152
+#: usr/local/www/diag_smart.php:265
+msgid "Send"
+msgstr "送信"
+
+#: usr/local/www/services_wol.php:157 usr/local/www/services_wol.php:157
+msgid "Wake all clients at once: "
+msgstr "一度にすべてのクライアントを覚ます。"
+
+#: usr/local/www/services_wol.php:158 usr/local/www/services_wol.php:158
+msgid "Or Click the MAC address to wake up an individual device:"
+msgstr "または個々のデバイスを起動するのにMACアドレスをクリックしてください。"
+
+#: usr/local/www/services_wol.php:212 usr/local/www/services_wol.php:212
+msgid ""
+"This service can be used to wake up (power on) computers by sending special"
+msgstr "「このサービスは、特別なを送信することにより、 (電源ON )コンピュータを起動するのに使用することができます"
+
+#: usr/local/www/services_wol.php:212 usr/local/www/services_wol.php:212
+msgid "Magic Packets"
+msgstr "マジックパケット"
+
+#: usr/local/www/services_wol.php:212 usr/local/www/services_wol.php:212
+msgid ""
+"The NIC in the computer that is to be woken up must support Wake on LAN and "
+"has to be configured properly (WOL cable, BIOS settings). "
+msgstr "「ウェイクアップするコンピュータ内のNICがWake on LANのをサポートしている必要があり、 「 ( WOLケーブル、 BIOS設定)を正しく設定する必要があります。"
+
+#: usr/local/www/services_wol_edit.php:123
+#: usr/local/www/services_wol_edit.php:123
+msgid "Edit WOL entry"
+msgstr "編集WOLエントリ"
+
+#: usr/local/www/services_wol_edit.php:137
+#: usr/local/www/services_wol_edit.php:137
+msgid "Choose which interface this host is connected to."
+msgstr "選択したどのインターフェイスこのホストがに接続されている。"
+
+#: usr/local/www/services_wol_edit.php:144
+#: usr/local/www/services_wol_edit.php:144
+msgid "Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx"
+msgstr "次の形式でMACアドレスを入力してください: XX : XX : XX : XX : XX : XX"
+
+#: usr/local/www/status_captiveportal.php:58
+#: usr/local/www/status_captiveportal.php:58
+msgid "Status: Captive portal"
+msgstr "ステータス:キャプティブポータル"
+
+#: usr/local/www/status_captiveportal.php:121
+#: usr/local/www/status_captiveportal_test.php:70
+#: usr/local/www/status_captiveportal_voucher_rolls.php:73
+#: usr/local/www/status_captiveportal_vouchers.php:103
+#: usr/local/www/status_captiveportal_vouchers.php:104
+#: usr/local/www/status_captiveportal_test.php:71
+#: usr/local/www/status_captiveportal_voucher_rolls.php:74
+#: usr/local/www/status_captiveportal_expire.php:69
+#: usr/local/www/status_captiveportal_vouchers.php:108
+#: usr/local/www/status_captiveportal.php:106
+#: usr/local/www/status_captiveportal_voucher_rolls.php:75
+#: usr/local/www/status_captiveportal_expire.php:69
+#: usr/local/www/status_captiveportal_vouchers.php:108
+#: usr/local/www/status_captiveportal.php:106
+#: usr/local/www/status_captiveportal_test.php:71
+#: usr/local/www/status_captiveportal_voucher_rolls.php:75
+msgid "Active Users"
+msgstr "アクティブユーザー"
+
+#: usr/local/www/status_captiveportal.php:122
+#: usr/local/www/status_captiveportal_test.php:71
+#: usr/local/www/status_captiveportal_voucher_rolls.php:74
+#: usr/local/www/status_captiveportal_vouchers.php:104
+#: usr/local/www/status_captiveportal_vouchers.php:105
+#: usr/local/www/status_captiveportal_test.php:72
+#: usr/local/www/status_captiveportal_voucher_rolls.php:75
+#: usr/local/www/status_captiveportal_expire.php:70
+#: usr/local/www/status_captiveportal_vouchers.php:109
+#: usr/local/www/status_captiveportal.php:107
+#: usr/local/www/status_captiveportal_voucher_rolls.php:76
+#: usr/local/www/status_captiveportal_expire.php:70
+#: usr/local/www/status_captiveportal_vouchers.php:109
+#: usr/local/www/status_captiveportal.php:107
+#: usr/local/www/status_captiveportal_test.php:72
+#: usr/local/www/status_captiveportal_voucher_rolls.php:76
+msgid "Active Vouchers"
+msgstr "アクティブバウチャー"
+
+#: usr/local/www/status_captiveportal.php:123
+#: usr/local/www/services_captiveportal_vouchers.php:426
+#: usr/local/www/status_captiveportal_test.php:72
+#: usr/local/www/status_captiveportal_voucher_rolls.php:57
+#: usr/local/www/status_captiveportal_voucher_rolls.php:75
+#: usr/local/www/status_captiveportal_vouchers.php:105
+#: usr/local/www/services_captiveportal_vouchers.php:433
+#: usr/local/www/status_captiveportal_vouchers.php:106
+#: usr/local/www/services_captiveportal_vouchers.php:446
+#: usr/local/www/status_captiveportal_test.php:73
+#: usr/local/www/status_captiveportal_voucher_rolls.php:76
+#: usr/local/www/status_captiveportal_expire.php:71
+#: usr/local/www/services_captiveportal_vouchers.php:455
+#: usr/local/www/status_captiveportal_vouchers.php:110
+#: usr/local/www/status_captiveportal.php:108
+#: usr/local/www/status_captiveportal_voucher_rolls.php:77
+#: usr/local/www/status_captiveportal_expire.php:71
+#: usr/local/www/services_captiveportal_vouchers.php:460
+#: usr/local/www/status_captiveportal_vouchers.php:110
+#: usr/local/www/status_captiveportal.php:108
+#: usr/local/www/status_captiveportal_test.php:73
+#: usr/local/www/status_captiveportal_voucher_rolls.php:57
+#: usr/local/www/status_captiveportal_voucher_rolls.php:77
+msgid "Voucher Rolls"
+msgstr "バウチャーロールスロイス"
+
+#: usr/local/www/status_captiveportal.php:124
+#: usr/local/www/status_captiveportal_test.php:58
+#: usr/local/www/status_captiveportal_test.php:73
+#: usr/local/www/status_captiveportal_voucher_rolls.php:76
+#: usr/local/www/status_captiveportal_vouchers.php:106
+#: usr/local/www/status_captiveportal_vouchers.php:107
+#: usr/local/www/status_captiveportal_test.php:74
+#: usr/local/www/status_captiveportal_voucher_rolls.php:77
+#: usr/local/www/status_captiveportal_expire.php:72
+#: usr/local/www/status_captiveportal_vouchers.php:111
+#: usr/local/www/status_captiveportal.php:109
+#: usr/local/www/status_captiveportal_voucher_rolls.php:78
+#: usr/local/www/status_captiveportal_expire.php:72
+#: usr/local/www/status_captiveportal_vouchers.php:111
+#: usr/local/www/status_captiveportal.php:109
+#: usr/local/www/status_captiveportal_test.php:58
+#: usr/local/www/status_captiveportal_test.php:74
+#: usr/local/www/status_captiveportal_voucher_rolls.php:78
+msgid "Test Vouchers"
+msgstr "テストバウチャー"
+
+#: usr/local/www/status_captiveportal.php:135
+#: usr/local/www/status_captiveportal.php:121
+#: usr/local/www/status_captiveportal.php:121
+msgid "Captive Portal Zone"
+msgstr "キャプティブポータルゾーン"
+
+#: usr/local/www/status_captiveportal.php:157
+#: usr/local/www/status_captiveportal.php:143
+#: usr/local/www/status_captiveportal.php:143
+msgid "Captive Portal status"
+msgstr "Captive Portal状況"
+
+#: usr/local/www/status_captiveportal.php:164
+#: usr/local/www/status_captiveportal.php:167
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:97
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:99
+#: usr/local/www/status_captiveportal.php:150
+#: usr/local/www/status_captiveportal.php:153
+#: usr/local/www/status_captiveportal.php:150
+#: usr/local/www/status_captiveportal.php:153
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:97
+msgid "Session start"
+msgstr "セッション開始"
+
+#: usr/local/www/status_captiveportal.php:165
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:98
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:100
+#: usr/local/www/status_captiveportal.php:151
+#: usr/local/www/status_captiveportal.php:151
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:98
+msgid "Last activity"
+msgstr "最後の活動"
+
+#: usr/local/www/status_captiveportal.php:181
+#: usr/local/www/status_captiveportal.php:168
+#: usr/local/www/status_captiveportal.php:168
+msgid "Do you really want to disconnect this client?"
+msgstr "あなたは本当に、このクライアントを切断しますか?"
+
+#: usr/local/www/status_captiveportal.php:181
+#: usr/local/www/status_interfaces.php:114
+#: usr/local/www/status_interfaces.php:129
+#: usr/local/www/status_interfaces.php:144
+#: usr/local/www/status_interfaces.php:159
+#: usr/local/www/status_interfaces.php:132
+#: usr/local/www/status_interfaces.php:147
+#: usr/local/www/status_interfaces.php:162
+#: usr/local/www/status_interfaces.php:177
+#: usr/local/www/status_interfaces.php:135
+#: usr/local/www/status_interfaces.php:150
+#: usr/local/www/status_interfaces.php:165
+#: usr/local/www/status_interfaces.php:180
+#: usr/local/www/status_captiveportal.php:168
+#: usr/local/www/status_interfaces.php:135
+#: usr/local/www/status_interfaces.php:150
+#: usr/local/www/status_interfaces.php:165
+#: usr/local/www/status_interfaces.php:180
+#: usr/local/www/status_captiveportal.php:168
+msgid "Disconnect"
+msgstr "切断"
+
+#: usr/local/www/status_captiveportal.php:198
+#: usr/local/www/status_captiveportal.php:185
+#: usr/local/www/status_captiveportal.php:185
+msgid "Don't show last activity"
+msgstr "最後のアクティビティを表示しない"
+
+#: usr/local/www/status_captiveportal.php:201
+#: usr/local/www/status_captiveportal.php:188
+#: usr/local/www/status_captiveportal.php:188
+msgid "Show last activity"
+msgstr "最後のアクティビティを表示する"
+
+#: usr/local/www/installer/installer.php:186
+#: usr/local/www/installer/installer.php:186
+msgid "Could not open /tmp/installer.sh for writing"
+msgstr "書き込み用にオープンできませんでした/ tmpに/ installer.sh"
+
+#: usr/local/www/installer/installer.php:360
+#: usr/local/www/installer/installer.php:361
+#: usr/local/www/installer/installer.php:361
+#, php-format
+msgid "Beginning installation on disk %s."
+msgstr "ディスク%s.上のインストールの開始"
+
+#: usr/local/www/installer/installer.php:409
+#: usr/local/www/installer/installer.php:410
+#: usr/local/www/installer/installer.php:410
+msgid "Installer"
+msgstr "インストーラ"
+
+#: usr/local/www/installer/installer.php:916
+#: usr/local/www/installer/installer.php:1104
+#: usr/local/www/installer/installer.php:917
+#: usr/local/www/installer/installer.php:1105
+#: usr/local/www/installer/installer.php:917
+#: usr/local/www/installer/installer.php:1105
+msgid "ERROR: Could not find any suitable disks for installation."
+msgstr "エラー:インストールするための任意の適切なディスクが見つかりませんでした。"
+
+#: usr/local/www/interfaces_bridge.php:64
+#: usr/local/www/interfaces_bridge.php:68
+#: usr/local/www/interfaces_bridge.php:68
+msgid "This bridge cannot be deleted because it is assigned as an interface."
+msgstr "それはインターフェイスとして割り当てられているため、この橋は削除できません。"
+
+#: usr/local/www/interfaces_bridge.php:77
+#: usr/local/www/interfaces_bridge_edit.php:226
+#: usr/local/www/interfaces_gif.php:76
+#: usr/local/www/interfaces_gif_edit.php:125
+#: usr/local/www/interfaces_gre.php:77
+#: usr/local/www/interfaces_gre_edit.php:127
+#: usr/local/www/interfaces_groups.php:63
+#: usr/local/www/interfaces_groups_edit.php:44
+#: usr/local/www/diag_backup.php:109 usr/local/www/interfaces.php:1027
+#: usr/local/www/interfaces_assign.php:43 usr/local/www/interfaces_vlan.php:78
+#: usr/local/www/interfaces_vlan_edit.php:139
+#: usr/local/www/diag_logs_filter_summary.php:46
+#: usr/local/www/interfaces_lagg.php:82
+#: usr/local/www/interfaces_lagg_edit.php:120
+#: usr/local/www/interfaces_ppps_edit.php:378
+#: usr/local/www/interfaces_qinq.php:86
+#: usr/local/www/interfaces_qinq_edit.php:39
+#: usr/local/www/interfaces_wireless.php:76
+#: usr/local/www/interfaces_wireless_edit.php:145
+#: usr/local/www/services_captiveportal.php:439
+#: usr/local/www/status_interfaces.php:58 usr/local/www/fbegin.inc:163
+#: usr/local/www/fbegin.inc:327
+#: usr/local/www/services_captiveportal_zones.php:53
+#: usr/local/www/fbegin.inc:180 usr/local/www/fbegin.inc:345
+#: usr/local/www/diag_backup.php:186
+#: usr/local/www/services_captiveportal.php:443
+#: usr/local/www/interfaces_bridge_edit.php:235
+#: usr/local/www/interfaces.php:1113 usr/local/www/fbegin.inc:188
+#: usr/local/www/fbegin.inc:291 usr/local/www/status_interfaces.php:60
+#: usr/local/www/services_captiveportal.php:441
+#: usr/local/www/diag_logs_filter_summary.php:47
+#: usr/local/www/interfaces.php:1101
+#: usr/local/www/services_captiveportal_zones.php:54
+#: usr/local/www/interfaces_wireless_edit.php:147
+#: usr/local/www/interfaces_qinq.php:89
+#: usr/local/www/interfaces_vlan_edit.php:142
+#: usr/local/www/interfaces_ppps_edit.php:384
+#: usr/local/www/interfaces_lagg_edit.php:133
+#: usr/local/www/interfaces_lagg.php:86 usr/local/www/interfaces_vlan.php:84
+#: usr/local/www/interfaces_gif_edit.php:133
+#: usr/local/www/interfaces_bridge.php:83
+#: usr/local/www/interfaces_wireless.php:78
+#: usr/local/www/interfaces_bridge_edit.php:236 usr/local/www/fbegin.inc:179
+#: usr/local/www/fbegin.inc:283 usr/local/www/interfaces_gre.php:81
+#: usr/local/www/interfaces_gif.php:80 usr/local/www/interfaces.php:1115
+#: usr/local/www/services_captiveportal.php:459
+#: usr/local/www/interfaces.php:1157 usr/local/www/services_dnsmasq.php:262
+#: usr/local/www/interfaces.php:1152
+#: usr/local/www/interfaces_wireless_edit.php:147
+#: usr/local/www/interfaces_gre_edit.php:127
+#: usr/local/www/interfaces_qinq.php:89
+#: usr/local/www/interfaces_vlan_edit.php:142
+#: usr/local/www/interfaces_ppps_edit.php:384
+#: usr/local/www/interfaces_lagg_edit.php:133
+#: usr/local/www/interfaces_lagg.php:86 usr/local/www/interfaces_vlan.php:84
+#: usr/local/www/interfaces_gif_edit.php:133
+#: usr/local/www/interfaces_bridge.php:83
+#: usr/local/www/interfaces_wireless.php:78
+#: usr/local/www/status_interfaces.php:60
+#: usr/local/www/interfaces_groups.php:63
+#: usr/local/www/interfaces_groups_edit.php:44
+#: usr/local/www/services_captiveportal_zones.php:54
+#: usr/local/www/services_captiveportal.php:459
+#: usr/local/www/diag_backup.php:186
+#: usr/local/www/interfaces_bridge_edit.php:236 usr/local/www/fbegin.inc:179
+#: usr/local/www/fbegin.inc:283 usr/local/www/services_dnsmasq.php:262
+#: usr/local/www/interfaces_gre.php:81 usr/local/www/interfaces_gif.php:80
+#: usr/local/www/interfaces_assign.php:43
+#: usr/local/www/interfaces_qinq_edit.php:39
+#: usr/local/www/diag_logs_filter_summary.php:47
+#: usr/local/www/interfaces.php:1152
+msgid "Interfaces"
+msgstr "インターフェース"
+
+#: usr/local/www/interfaces_bridge.php:77
+#: usr/local/www/interfaces_bridge_edit.php:226
+#: usr/local/www/interfaces_bridge_edit.php:235
+#: usr/local/www/interfaces_bridge.php:83
+#: usr/local/www/interfaces_bridge_edit.php:236
+#: usr/local/www/interfaces_bridge.php:83
+#: usr/local/www/interfaces_bridge_edit.php:236
+msgid "Bridge"
+msgstr "ブリッジ"
+
+#: usr/local/www/interfaces_bridge.php:89 usr/local/www/interfaces_gif.php:88
+#: usr/local/www/interfaces_gre.php:89 usr/local/www/interfaces_groups.php:75
+#: usr/local/www/interfaces_assign.php:402
+#: usr/local/www/interfaces_vlan.php:90 usr/local/www/interfaces_lagg.php:94
+#: usr/local/www/interfaces_ppps.php:90 usr/local/www/interfaces_qinq.php:98
+#: usr/local/www/interfaces_wireless.php:88
+#: usr/local/www/interfaces_groups.php:76 usr/local/www/interfaces_qinq.php:99
+#: usr/local/www/interfaces_ppps.php:91 usr/local/www/interfaces_bridge.php:90
+#: usr/local/www/interfaces_lagg.php:95 usr/local/www/interfaces_gre.php:90
+#: usr/local/www/interfaces_wireless.php:89
+#: usr/local/www/interfaces_assign.php:396
+#: usr/local/www/interfaces_vlan.php:91 usr/local/www/interfaces_gif.php:89
+#: usr/local/www/interfaces_qinq.php:102 usr/local/www/interfaces_lagg.php:99
+#: usr/local/www/interfaces_vlan.php:97 usr/local/www/interfaces_bridge.php:96
+#: usr/local/www/interfaces_wireless.php:91
+#: usr/local/www/interfaces_gre.php:94 usr/local/www/interfaces_gif.php:93
+#: usr/local/www/interfaces_qinq.php:102 usr/local/www/interfaces_lagg.php:99
+#: usr/local/www/interfaces_vlan.php:97 usr/local/www/interfaces_bridge.php:96
+#: usr/local/www/interfaces_wireless.php:91
+#: usr/local/www/interfaces_groups.php:76 usr/local/www/interfaces_ppps.php:91
+#: usr/local/www/interfaces_gre.php:94 usr/local/www/interfaces_gif.php:93
+#: usr/local/www/interfaces_assign.php:402
+msgid "Interface assignments"
+msgstr "インターフェイスの割り当て"
+
+#: usr/local/www/interfaces_bridge.php:90 usr/local/www/interfaces_gif.php:89
+#: usr/local/www/interfaces_gre.php:90 usr/local/www/interfaces_groups.php:76
+#: usr/local/www/interfaces_assign.php:403
+#: usr/local/www/interfaces_vlan.php:91 usr/local/www/interfaces_lagg.php:95
+#: usr/local/www/interfaces_ppps.php:91 usr/local/www/interfaces_qinq.php:99
+#: usr/local/www/interfaces_wireless.php:89
+#: usr/local/www/interfaces_groups.php:77
+#: usr/local/www/interfaces_qinq.php:100 usr/local/www/interfaces_ppps.php:92
+#: usr/local/www/interfaces_bridge.php:91 usr/local/www/interfaces_lagg.php:96
+#: usr/local/www/interfaces_gre.php:91
+#: usr/local/www/interfaces_wireless.php:90
+#: usr/local/www/interfaces_assign.php:397
+#: usr/local/www/interfaces_vlan.php:92 usr/local/www/interfaces_gif.php:90
+#: usr/local/www/interfaces_qinq.php:103 usr/local/www/interfaces_lagg.php:100
+#: usr/local/www/interfaces_vlan.php:98 usr/local/www/interfaces_bridge.php:97
+#: usr/local/www/interfaces_wireless.php:92
+#: usr/local/www/interfaces_gre.php:95 usr/local/www/interfaces_gif.php:94
+#: usr/local/www/interfaces_qinq.php:103 usr/local/www/interfaces_lagg.php:100
+#: usr/local/www/interfaces_vlan.php:98 usr/local/www/interfaces_bridge.php:97
+#: usr/local/www/interfaces_wireless.php:92
+#: usr/local/www/interfaces_groups.php:77 usr/local/www/interfaces_ppps.php:92
+#: usr/local/www/interfaces_gre.php:95 usr/local/www/interfaces_gif.php:94
+#: usr/local/www/interfaces_assign.php:403
+msgid "Interface Groups"
+msgstr "インタフェースグループ"
+
+#: usr/local/www/interfaces_bridge.php:92 usr/local/www/interfaces_gif.php:91
+#: usr/local/www/interfaces_gre.php:92 usr/local/www/interfaces_groups.php:78
+#: usr/local/www/interfaces_assign.php:405
+#: usr/local/www/interfaces_vlan.php:93 usr/local/www/interfaces_lagg.php:97
+#: usr/local/www/interfaces_ppps.php:93 usr/local/www/interfaces_qinq.php:101
+#: usr/local/www/interfaces_wireless.php:91
+#: usr/local/www/interfaces_groups.php:79
+#: usr/local/www/interfaces_qinq.php:102 usr/local/www/interfaces_ppps.php:94
+#: usr/local/www/interfaces_bridge.php:93 usr/local/www/interfaces_lagg.php:98
+#: usr/local/www/interfaces_gre.php:93
+#: usr/local/www/interfaces_wireless.php:92
+#: usr/local/www/interfaces_assign.php:399
+#: usr/local/www/interfaces_vlan.php:94 usr/local/www/interfaces_gif.php:92
+#: usr/local/www/interfaces_qinq.php:105 usr/local/www/interfaces_lagg.php:102
+#: usr/local/www/interfaces_vlan.php:100
+#: usr/local/www/interfaces_bridge.php:99
+#: usr/local/www/interfaces_wireless.php:94
+#: usr/local/www/interfaces_gre.php:97 usr/local/www/interfaces_gif.php:96
+#: usr/local/www/interfaces_qinq.php:105 usr/local/www/interfaces_lagg.php:102
+#: usr/local/www/interfaces_vlan.php:100
+#: usr/local/www/interfaces_bridge.php:99
+#: usr/local/www/interfaces_wireless.php:94
+#: usr/local/www/interfaces_groups.php:79 usr/local/www/interfaces_ppps.php:94
+#: usr/local/www/interfaces_gre.php:97 usr/local/www/interfaces_gif.php:96
+#: usr/local/www/interfaces_assign.php:405
+msgid "VLANs"
+msgstr "VLANは"
+
+#: usr/local/www/interfaces_bridge.php:93 usr/local/www/interfaces_gif.php:92
+#: usr/local/www/interfaces_gre.php:93 usr/local/www/interfaces_groups.php:79
+#: usr/local/www/interfaces_assign.php:406
+#: usr/local/www/interfaces_vlan.php:94 usr/local/www/interfaces_lagg.php:98
+#: usr/local/www/interfaces_ppps.php:94 usr/local/www/interfaces_qinq.php:102
+#: usr/local/www/interfaces_wireless.php:92
+#: usr/local/www/interfaces_groups.php:80
+#: usr/local/www/interfaces_qinq.php:103 usr/local/www/interfaces_ppps.php:95
+#: usr/local/www/interfaces_bridge.php:94 usr/local/www/interfaces_lagg.php:99
+#: usr/local/www/interfaces_gre.php:94
+#: usr/local/www/interfaces_wireless.php:93
+#: usr/local/www/interfaces_assign.php:400
+#: usr/local/www/interfaces_vlan.php:95 usr/local/www/interfaces_gif.php:93
+#: usr/local/www/interfaces_qinq.php:106 usr/local/www/interfaces_lagg.php:103
+#: usr/local/www/interfaces_vlan.php:101
+#: usr/local/www/interfaces_bridge.php:100
+#: usr/local/www/interfaces_wireless.php:95
+#: usr/local/www/interfaces_gre.php:98 usr/local/www/interfaces_gif.php:97
+#: usr/local/www/interfaces_qinq.php:106 usr/local/www/interfaces_lagg.php:103
+#: usr/local/www/interfaces_vlan.php:101
+#: usr/local/www/interfaces_bridge.php:100
+#: usr/local/www/interfaces_wireless.php:95
+#: usr/local/www/interfaces_groups.php:80 usr/local/www/interfaces_ppps.php:95
+#: usr/local/www/interfaces_gre.php:98 usr/local/www/interfaces_gif.php:97
+#: usr/local/www/interfaces_assign.php:406
+msgid "QinQs"
+msgstr "QinQs"
+
+#: usr/local/www/interfaces_bridge.php:94 usr/local/www/interfaces_gif.php:93
+#: usr/local/www/interfaces_gre.php:94 usr/local/www/interfaces_groups.php:80
+#: usr/local/www/interfaces_assign.php:407
+#: usr/local/www/interfaces_vlan.php:95 usr/local/www/interfaces_lagg.php:99
+#: usr/local/www/interfaces_ppps.php:95
+#: usr/local/www/interfaces_ppps_edit.php:378
+#: usr/local/www/interfaces_qinq.php:103
+#: usr/local/www/interfaces_wireless.php:93
+#: usr/local/www/interfaces_groups.php:81
+#: usr/local/www/interfaces_qinq.php:104 usr/local/www/interfaces_ppps.php:96
+#: usr/local/www/interfaces_bridge.php:95
+#: usr/local/www/interfaces_lagg.php:100 usr/local/www/interfaces_gre.php:95
+#: usr/local/www/interfaces_wireless.php:94
+#: usr/local/www/interfaces_assign.php:401
+#: usr/local/www/interfaces_vlan.php:96 usr/local/www/interfaces_gif.php:94
+#: usr/local/www/interfaces_qinq.php:107
+#: usr/local/www/interfaces_ppps_edit.php:384
+#: usr/local/www/interfaces_lagg.php:104 usr/local/www/interfaces_vlan.php:102
+#: usr/local/www/interfaces_bridge.php:101
+#: usr/local/www/interfaces_wireless.php:96
+#: usr/local/www/interfaces_gre.php:99 usr/local/www/interfaces_gif.php:98
+#: usr/local/www/interfaces_qinq.php:107
+#: usr/local/www/interfaces_ppps_edit.php:384
+#: usr/local/www/interfaces_lagg.php:104 usr/local/www/interfaces_vlan.php:102
+#: usr/local/www/interfaces_bridge.php:101
+#: usr/local/www/interfaces_wireless.php:96
+#: usr/local/www/interfaces_groups.php:81 usr/local/www/interfaces_ppps.php:96
+#: usr/local/www/interfaces_gre.php:99 usr/local/www/interfaces_gif.php:98
+#: usr/local/www/interfaces_assign.php:407
+msgid "PPPs"
+msgstr "購買力平価"
+
+#: usr/local/www/interfaces_bridge.php:95 usr/local/www/interfaces_gif.php:94
+#: usr/local/www/interfaces_gre.php:77 usr/local/www/interfaces_gre.php:95
+#: usr/local/www/interfaces_gre_edit.php:127
+#: usr/local/www/interfaces_groups.php:81
+#: usr/local/www/interfaces_assign.php:408
+#: usr/local/www/interfaces_vlan.php:96 usr/local/www/interfaces_lagg.php:100
+#: usr/local/www/interfaces_ppps.php:96 usr/local/www/interfaces_qinq.php:104
+#: usr/local/www/interfaces_wireless.php:94
+#: usr/local/www/interfaces_groups.php:82
+#: usr/local/www/interfaces_qinq.php:105 usr/local/www/interfaces_ppps.php:97
+#: usr/local/www/interfaces_bridge.php:96
+#: usr/local/www/interfaces_lagg.php:101 usr/local/www/interfaces_gre.php:96
+#: usr/local/www/interfaces_wireless.php:95
+#: usr/local/www/interfaces_assign.php:402
+#: usr/local/www/interfaces_vlan.php:97 usr/local/www/interfaces_gif.php:95
+#: usr/local/www/interfaces_qinq.php:108 usr/local/www/interfaces_lagg.php:105
+#: usr/local/www/interfaces_vlan.php:103
+#: usr/local/www/interfaces_bridge.php:102
+#: usr/local/www/interfaces_wireless.php:97
+#: usr/local/www/interfaces_gre.php:81 usr/local/www/interfaces_gre.php:100
+#: usr/local/www/interfaces_gif.php:99
+#: usr/local/www/interfaces_gre_edit.php:127
+#: usr/local/www/interfaces_qinq.php:108 usr/local/www/interfaces_lagg.php:105
+#: usr/local/www/interfaces_vlan.php:103
+#: usr/local/www/interfaces_bridge.php:102
+#: usr/local/www/interfaces_wireless.php:97
+#: usr/local/www/interfaces_groups.php:82 usr/local/www/interfaces_ppps.php:97
+#: usr/local/www/interfaces_gre.php:81 usr/local/www/interfaces_gre.php:100
+#: usr/local/www/interfaces_gif.php:99 usr/local/www/interfaces_assign.php:408
+msgid "GRE"
+msgstr "GRE"
+
+#: usr/local/www/interfaces_bridge.php:96 usr/local/www/interfaces_gif.php:76
+#: usr/local/www/interfaces_gif.php:95
+#: usr/local/www/interfaces_gif_edit.php:125
+#: usr/local/www/interfaces_gre.php:96 usr/local/www/interfaces_groups.php:82
+#: usr/local/www/interfaces_assign.php:409
+#: usr/local/www/interfaces_vlan.php:97 usr/local/www/interfaces_lagg.php:101
+#: usr/local/www/interfaces_ppps.php:97 usr/local/www/interfaces_qinq.php:105
+#: usr/local/www/interfaces_wireless.php:95
+#: usr/local/www/interfaces_groups.php:83
+#: usr/local/www/interfaces_qinq.php:106 usr/local/www/interfaces_ppps.php:98
+#: usr/local/www/interfaces_bridge.php:97
+#: usr/local/www/interfaces_lagg.php:102 usr/local/www/interfaces_gre.php:97
+#: usr/local/www/interfaces_wireless.php:96
+#: usr/local/www/interfaces_assign.php:403
+#: usr/local/www/interfaces_vlan.php:98 usr/local/www/interfaces_gif.php:96
+#: usr/local/www/interfaces_qinq.php:109 usr/local/www/interfaces_lagg.php:106
+#: usr/local/www/interfaces_vlan.php:104
+#: usr/local/www/interfaces_gif_edit.php:133
+#: usr/local/www/interfaces_bridge.php:103
+#: usr/local/www/interfaces_wireless.php:98
+#: usr/local/www/interfaces_gre.php:101 usr/local/www/interfaces_gif.php:80
+#: usr/local/www/interfaces_gif.php:100 usr/local/www/interfaces_qinq.php:109
+#: usr/local/www/interfaces_lagg.php:106 usr/local/www/interfaces_vlan.php:104
+#: usr/local/www/interfaces_gif_edit.php:133
+#: usr/local/www/interfaces_bridge.php:103
+#: usr/local/www/interfaces_wireless.php:98
+#: usr/local/www/interfaces_groups.php:83 usr/local/www/interfaces_ppps.php:98
+#: usr/local/www/interfaces_gre.php:101 usr/local/www/interfaces_gif.php:80
+#: usr/local/www/interfaces_gif.php:100
+#: usr/local/www/interfaces_assign.php:409
+msgid "GIF"
+msgstr "GIF"
+
+#: usr/local/www/interfaces_bridge.php:97 usr/local/www/interfaces_gif.php:96
+#: usr/local/www/interfaces_gre.php:97 usr/local/www/interfaces_groups.php:83
+#: usr/local/www/interfaces_assign.php:410
+#: usr/local/www/interfaces_vlan.php:98 usr/local/www/interfaces_lagg.php:102
+#: usr/local/www/interfaces_ppps.php:98 usr/local/www/interfaces_qinq.php:106
+#: usr/local/www/interfaces_wireless.php:96
+#: usr/local/www/interfaces_groups.php:84
+#: usr/local/www/interfaces_qinq.php:107 usr/local/www/interfaces_ppps.php:99
+#: usr/local/www/interfaces_bridge.php:98
+#: usr/local/www/interfaces_lagg.php:103 usr/local/www/interfaces_gre.php:98
+#: usr/local/www/interfaces_wireless.php:97
+#: usr/local/www/interfaces_assign.php:404
+#: usr/local/www/interfaces_vlan.php:99 usr/local/www/interfaces_gif.php:97
+#: usr/local/www/interfaces_qinq.php:110 usr/local/www/interfaces_lagg.php:107
+#: usr/local/www/interfaces_vlan.php:105
+#: usr/local/www/interfaces_bridge.php:104
+#: usr/local/www/interfaces_wireless.php:99
+#: usr/local/www/interfaces_gre.php:102 usr/local/www/interfaces_gif.php:101
+#: usr/local/www/interfaces_qinq.php:110 usr/local/www/interfaces_lagg.php:107
+#: usr/local/www/interfaces_vlan.php:105
+#: usr/local/www/interfaces_bridge.php:104
+#: usr/local/www/interfaces_wireless.php:99
+#: usr/local/www/interfaces_groups.php:84 usr/local/www/interfaces_ppps.php:99
+#: usr/local/www/interfaces_gre.php:102 usr/local/www/interfaces_gif.php:101
+#: usr/local/www/interfaces_assign.php:410
+msgid "Bridges"
+msgstr "橋"
+
+#: usr/local/www/interfaces_bridge.php:98 usr/local/www/interfaces_gif.php:97
+#: usr/local/www/interfaces_gre.php:98 usr/local/www/interfaces_groups.php:84
+#: usr/local/www/interfaces_assign.php:411
+#: usr/local/www/interfaces_vlan.php:99 usr/local/www/interfaces_lagg.php:82
+#: usr/local/www/interfaces_lagg.php:103
+#: usr/local/www/interfaces_lagg_edit.php:120
+#: usr/local/www/interfaces_ppps.php:99 usr/local/www/interfaces_qinq.php:107
+#: usr/local/www/interfaces_wireless.php:97
+#: usr/local/www/interfaces_groups.php:85
+#: usr/local/www/interfaces_qinq.php:108 usr/local/www/interfaces_ppps.php:100
+#: usr/local/www/interfaces_bridge.php:99
+#: usr/local/www/interfaces_lagg.php:104 usr/local/www/interfaces_gre.php:99
+#: usr/local/www/interfaces_wireless.php:98
+#: usr/local/www/interfaces_assign.php:405
+#: usr/local/www/interfaces_vlan.php:100 usr/local/www/interfaces_gif.php:98
+#: usr/local/www/interfaces_qinq.php:111
+#: usr/local/www/interfaces_lagg_edit.php:133
+#: usr/local/www/interfaces_lagg.php:86 usr/local/www/interfaces_lagg.php:108
+#: usr/local/www/interfaces_vlan.php:106
+#: usr/local/www/interfaces_bridge.php:105
+#: usr/local/www/interfaces_wireless.php:100
+#: usr/local/www/interfaces_gre.php:103 usr/local/www/interfaces_gif.php:102
+#: usr/local/www/interfaces_qinq.php:111
+#: usr/local/www/interfaces_lagg_edit.php:133
+#: usr/local/www/interfaces_lagg.php:86 usr/local/www/interfaces_lagg.php:108
+#: usr/local/www/interfaces_vlan.php:106
+#: usr/local/www/interfaces_bridge.php:105
+#: usr/local/www/interfaces_wireless.php:100
+#: usr/local/www/interfaces_groups.php:85
+#: usr/local/www/interfaces_ppps.php:100 usr/local/www/interfaces_gre.php:103
+#: usr/local/www/interfaces_gif.php:102
+#: usr/local/www/interfaces_assign.php:411
+msgid "LAGG"
+msgstr "LAGG"
+
+#: usr/local/www/interfaces_bridge.php:108
+#: usr/local/www/interfaces_groups.php:95
+#: usr/local/www/interfaces_lagg.php:113
+#: usr/local/www/load_balancer_pool_edit.php:257
+#: usr/local/www/system_groupmanager.php:317
+#: usr/local/www/load_balancer_pool_edit.php:274
+#: usr/local/www/interfaces_groups.php:96
+#: usr/local/www/interfaces_bridge.php:109
+#: usr/local/www/interfaces_lagg.php:114
+#: usr/local/www/load_balancer_pool_edit.php:272
+#: usr/local/www/interfaces_lagg.php:118
+#: usr/local/www/interfaces_bridge.php:115
+#: usr/local/www/system_groupmanager.php:317
+#: usr/local/www/interfaces_lagg.php:118
+#: usr/local/www/interfaces_bridge.php:115
+#: usr/local/www/interfaces_groups.php:96
+#: usr/local/www/load_balancer_pool_edit.php:272
+msgid "Members"
+msgstr "メンバー"
+
+#: usr/local/www/interfaces_bridge.php:135
+#: usr/local/www/interfaces_bridge.php:136
+#: usr/local/www/interfaces_bridge.php:142
+#: usr/local/www/interfaces_bridge.php:142
+msgid "Do you really want to delete this bridge?"
+msgstr "あなたは本当にこの橋を削除しますか?"
+
+#: usr/local/www/interfaces_bridge.php:146
+#: usr/local/www/interfaces_bridge.php:147
+#: usr/local/www/interfaces_bridge.php:153
+#: usr/local/www/interfaces_bridge.php:153
+msgid "Here you can configure bridging of interfaces."
+msgstr "ここでは、インターフェイスのブリッジングを設定することができます。"
+
+#: usr/local/www/interfaces_bridge_edit.php:111
+#: usr/local/www/interfaces_bridge_edit.php:119
+#: usr/local/www/interfaces_bridge_edit.php:119
+msgid "Member Interfaces"
+msgstr "メンバーインターフェイス"
+
+#: usr/local/www/interfaces_bridge_edit.php:116
+#: usr/local/www/interfaces_bridge_edit.php:124
+#: usr/local/www/interfaces_bridge_edit.php:124
+msgid "Maxage needs to be an integer between 6 and 40."
+msgstr "MAXAGEは6と40の間の整数である必要があります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:118
+#: usr/local/www/interfaces_bridge_edit.php:126
+#: usr/local/www/interfaces_bridge_edit.php:126
+msgid "Maxaddr needs to be an integer."
+msgstr "Maxaddrは、整数である必要があります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:120
+#: usr/local/www/interfaces_bridge_edit.php:128
+#: usr/local/www/interfaces_bridge_edit.php:128
+msgid "Timeout needs to be an integer."
+msgstr "タイムアウトは整数である必要があります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:122
+#: usr/local/www/interfaces_bridge_edit.php:130
+#: usr/local/www/interfaces_bridge_edit.php:130
+msgid "Forward Delay needs to be an integer between 4 and 30."
+msgstr "転送遅延は4と30の間の整数である必要があります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:124
+#: usr/local/www/interfaces_bridge_edit.php:132
+#: usr/local/www/interfaces_bridge_edit.php:132
+msgid "Hello time for STP needs to be an integer between 1 and 2."
+msgstr "ハローSTPのための時間は1と2の間の整数である必要がある。"
+
+#: usr/local/www/interfaces_bridge_edit.php:126
+#: usr/local/www/interfaces_bridge_edit.php:134
+#: usr/local/www/interfaces_bridge_edit.php:134
+msgid "Priority for STP needs to be an integer between 0 and 61440."
+msgstr "STPの優先順位は0と61440の間の整数である必要があります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:128
+#: usr/local/www/interfaces_bridge_edit.php:136
+#: usr/local/www/interfaces_bridge_edit.php:136
+msgid "Transmit Hold Count for STP needs to be an integer between 1 and 10."
+msgstr "STPは1 〜10の整数である必要があるため保留カウントを送信します。"
+
+#: usr/local/www/interfaces_bridge_edit.php:131
+#: usr/local/www/interfaces_bridge_edit.php:139
+#: usr/local/www/interfaces_bridge_edit.php:139
+msgid "interface priority for STP needs to be an integer between 0 and 240."
+msgstr "STPのためのインターフェイスの優先順位は0から240の間の整数である必要があります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:136
+#: usr/local/www/interfaces_bridge_edit.php:144
+#: usr/local/www/interfaces_bridge_edit.php:144
+msgid ""
+"interface path cost for STP needs to be an integer between 1 and 200000000."
+msgstr "「STPのためのインターフェイスのパスコストは1と200000000の間の整数である必要があります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:141
+#: usr/local/www/interfaces_bridge_edit.php:149
+#: usr/local/www/interfaces_bridge_edit.php:149
+msgid "You must select at least 2 member interfaces for a bridge."
+msgstr "あなたは橋のために少なくとも2メンバーインターフェイスを選択する必要があります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:147
+#: usr/local/www/interfaces_bridge_edit.php:155
+#: usr/local/www/interfaces_bridge_edit.php:157
+#: usr/local/www/interfaces_bridge_edit.php:157
+msgid "Bridging a wireless interface is only possible in hostap mode."
+msgstr "無線インタフェースをブリッジングのhostapモードでのみ可能です。"
+
+#: usr/local/www/interfaces_bridge_edit.php:149
+#: usr/local/www/interfaces_bridge_edit.php:157
+#: usr/local/www/interfaces_bridge_edit.php:159
+#: usr/local/www/interfaces_bridge_edit.php:159
+msgid ""
+"Span interface cannot be part of the bridge. Remove the span interface from "
+"bridge members to continue."
+msgstr "「スパンのインターフェイスは、ブリッジの一部にすることはできません。からスパンインターフェイスを削除し、「継続してブリッジ部材。"
+
+#: usr/local/www/interfaces_bridge_edit.php:206
+#: usr/local/www/interfaces_gif_edit.php:106
+#: usr/local/www/interfaces_gre_edit.php:108
+#: usr/local/www/interfaces_vlan_edit.php:121
+#: usr/local/www/interfaces_lagg_edit.php:101
+#: usr/local/www/interfaces_bridge_edit.php:215
+#: usr/local/www/interfaces_vlan_edit.php:124
+#: usr/local/www/interfaces_lagg_edit.php:114
+#: usr/local/www/interfaces_gif_edit.php:114
+#: usr/local/www/interfaces_bridge_edit.php:217
+#: usr/local/www/interfaces_gre_edit.php:108
+#: usr/local/www/interfaces_vlan_edit.php:124
+#: usr/local/www/interfaces_lagg_edit.php:114
+#: usr/local/www/interfaces_gif_edit.php:114
+#: usr/local/www/interfaces_bridge_edit.php:217
+msgid "Error occurred creating interface, please retry."
+msgstr "エラーが発生したインターフェイスを作成、再試行してください。"
+
+#: usr/local/www/interfaces_bridge_edit.php:253
+#: usr/local/www/interfaces_bridge_edit.php:262
+#: usr/local/www/interfaces_bridge_edit.php:263
+#: usr/local/www/interfaces_bridge_edit.php:264
+#: usr/local/www/interfaces_bridge_edit.php:266
+#: usr/local/www/interfaces_bridge_edit.php:266
+msgid "Bridge configuration"
+msgstr "ブリッジ構成"
+
+#: usr/local/www/interfaces_bridge_edit.php:256
+#: usr/local/www/interfaces_lagg_edit.php:86
+#: usr/local/www/interfaces_bridge_edit.php:265
+#: usr/local/www/interfaces_bridge_edit.php:266
+#: usr/local/www/interfaces_lagg_edit.php:88
+#: usr/local/www/interfaces_bridge_edit.php:267
+#: usr/local/www/interfaces_bridge_edit.php:269
+#: usr/local/www/interfaces_lagg_edit.php:88
+#: usr/local/www/interfaces_bridge_edit.php:269
+msgid "Member interfaces"
+msgstr "メンバーインターフェイス"
+
+#: usr/local/www/interfaces_bridge_edit.php:269
+#: usr/local/www/interfaces_bridge_edit.php:278
+#: usr/local/www/interfaces_bridge_edit.php:279
+#: usr/local/www/interfaces_bridge_edit.php:280
+#: usr/local/www/interfaces_bridge_edit.php:282
+#: usr/local/www/interfaces_bridge_edit.php:282
+msgid "Interfaces participating in the bridge."
+msgstr "ブリッジに参加するインターフェイス。"
+
+#: usr/local/www/interfaces_bridge_edit.php:285
+#: usr/local/www/interfaces_bridge_edit.php:294
+#: usr/local/www/interfaces_bridge_edit.php:295
+#: usr/local/www/interfaces_bridge_edit.php:296
+#: usr/local/www/interfaces_bridge_edit.php:298
+#: usr/local/www/interfaces_bridge_edit.php:298
+msgid "RSTP/STP"
+msgstr "RSTP / STP"
+
+#: usr/local/www/interfaces_bridge_edit.php:288
+#: usr/local/www/interfaces_bridge_edit.php:297
+#: usr/local/www/interfaces_bridge_edit.php:298
+#: usr/local/www/interfaces_bridge_edit.php:299
+#: usr/local/www/interfaces_bridge_edit.php:301
+#: usr/local/www/interfaces_bridge_edit.php:301
+msgid "Enable spanning tree options for this bridge."
+msgstr "このブリッジのツリーオプションにまたがる有効にします。"
+
+#: usr/local/www/interfaces_bridge_edit.php:304
+#: usr/local/www/interfaces_bridge_edit.php:313
+#: usr/local/www/interfaces_bridge_edit.php:314
+#: usr/local/www/interfaces_bridge_edit.php:315
+#: usr/local/www/interfaces_bridge_edit.php:317
+#: usr/local/www/interfaces_bridge_edit.php:317
+msgid "Protocol used for spanning tree."
+msgstr "プロトコルは、スパニングツリーに使用されます。"
+
+#: usr/local/www/interfaces_bridge_edit.php:306
+#: usr/local/www/interfaces_bridge_edit.php:315
+#: usr/local/www/interfaces_bridge_edit.php:316
+#: usr/local/www/interfaces_bridge_edit.php:317
+#: usr/local/www/interfaces_bridge_edit.php:319
+#: usr/local/www/interfaces_bridge_edit.php:319
+msgid "STP interfaces"
+msgstr "STPインターフェイス"
+
+#: usr/local/www/interfaces_bridge_edit.php:320
+#: usr/local/www/interfaces_bridge_edit.php:329
+#: usr/local/www/interfaces_bridge_edit.php:330
+#: usr/local/www/interfaces_bridge_edit.php:331
+#: usr/local/www/interfaces_bridge_edit.php:333
+#: usr/local/www/interfaces_bridge_edit.php:333
+msgid ""
+"Enable Spanning Tree Protocol on interface. The if_bridge(4) driver has "
+"support for the IEEE 802.1D Spanning Tree Protocol (STP). STP is used to "
+"detect and remove loops in a network topology."
+msgstr "「インターフェイス上でスパニングツリープロトコルを有効にします。 if_bridgeを( 4 )ドライバが持っている「IEEE 802.1Dスパニングツリープロトコル(STP )をサポート。 STPは、 「ネットワークトポロジー内のループを検出し、除去するために使用される。"
+
+#: usr/local/www/interfaces_bridge_edit.php:326
+#: usr/local/www/interfaces_bridge_edit.php:335
+#: usr/local/www/interfaces_bridge_edit.php:336
+#: usr/local/www/interfaces_bridge_edit.php:337
+#: usr/local/www/interfaces_bridge_edit.php:339
+#: usr/local/www/interfaces_bridge_edit.php:339
+msgid "Valid time"
+msgstr "適用時間"
+
+#: usr/local/www/interfaces_bridge_edit.php:328
+#: usr/local/www/interfaces_bridge_edit.php:338
+#: usr/local/www/interfaces_bridge_edit.php:347
+#: usr/local/www/interfaces_bridge_edit.php:416
+#: usr/local/www/interfaces.php:1817 usr/local/www/interfaces.php:1936
+#: usr/local/www/graph.php:120 usr/local/www/services_dhcp.php:679
+#: usr/local/www/services_dhcp.php:689
+#: usr/local/www/services_rfc2136_edit.php:156
+#: usr/local/www/vpn_ipsec_phase1.php:761
+#: usr/local/www/vpn_ipsec_phase1.php:831
+#: usr/local/www/vpn_ipsec_phase2.php:622
+#: usr/local/www/services_dhcpv6.php:624 usr/local/www/services_dhcpv6.php:634
+#: usr/local/www/services_dhcp.php:692 usr/local/www/services_dhcp.php:702
+#: usr/local/www/interfaces_bridge_edit.php:337
+#: usr/local/www/interfaces_bridge_edit.php:356
+#: usr/local/www/interfaces_bridge_edit.php:425
+#: usr/local/www/vpn_ipsec_phase2.php:648 usr/local/www/interfaces.php:1995
+#: usr/local/www/interfaces.php:2114 usr/local/www/vpn_ipsec_phase1.php:774
+#: usr/local/www/vpn_ipsec_phase1.php:844
+#: usr/local/www/services_dhcpv6.php:692 usr/local/www/services_dhcpv6.php:702
+#: usr/local/www/services_dhcp.php:868 usr/local/www/services_dhcp.php:878
+#: usr/local/www/interfaces_bridge_edit.php:348
+#: usr/local/www/interfaces_bridge_edit.php:357
+#: usr/local/www/interfaces_bridge_edit.php:426
+#: usr/local/www/vpn_ipsec_phase2.php:744 usr/local/www/interfaces.php:1983
+#: usr/local/www/interfaces.php:2102 usr/local/www/vpn_ipsec_phase1.php:771
+#: usr/local/www/vpn_ipsec_phase1.php:841
+#: usr/local/www/services_dhcpv6.php:623 usr/local/www/services_dhcpv6.php:633
+#: usr/local/www/services_dhcp_edit.php:434
+#: usr/local/www/services_dhcp_edit.php:444
+#: usr/local/www/services_dhcp.php:882 usr/local/www/services_dhcp.php:892
+#: usr/local/www/services_dhcpv6.php:640 usr/local/www/services_dhcpv6.php:650
+#: usr/local/www/interfaces_bridge_edit.php:339
+#: usr/local/www/interfaces_bridge_edit.php:349
+#: usr/local/www/interfaces_bridge_edit.php:358
+#: usr/local/www/interfaces_bridge_edit.php:427
+#: usr/local/www/vpn_ipsec_phase1.php:792
+#: usr/local/www/vpn_ipsec_phase1.php:862
+#: usr/local/www/vpn_ipsec_phase2.php:765 usr/local/www/interfaces.php:2010
+#: usr/local/www/interfaces.php:2132 usr/local/www/services_dhcp.php:902
+#: usr/local/www/services_dhcp.php:912 usr/local/www/interfaces.php:2056
+#: usr/local/www/interfaces.php:2178
+#: usr/local/www/interfaces_bridge_edit.php:341
+#: usr/local/www/interfaces_bridge_edit.php:351
+#: usr/local/www/interfaces_bridge_edit.php:360
+#: usr/local/www/interfaces_bridge_edit.php:431
+#: usr/local/www/interfaces.php:2045 usr/local/www/interfaces.php:2167
+#: usr/local/www/services_dhcp_edit.php:434
+#: usr/local/www/services_dhcp_edit.php:444
+#: usr/local/www/services_dhcp.php:902 usr/local/www/services_dhcp.php:912
+#: usr/local/www/services_dhcpv6.php:640 usr/local/www/services_dhcpv6.php:650
+#: usr/local/www/graph.php:120 usr/local/www/interfaces_bridge_edit.php:341
+#: usr/local/www/interfaces_bridge_edit.php:351
+#: usr/local/www/interfaces_bridge_edit.php:360
+#: usr/local/www/interfaces_bridge_edit.php:431
+#: usr/local/www/services_rfc2136_edit.php:156
+#: usr/local/www/vpn_ipsec_phase1.php:792
+#: usr/local/www/vpn_ipsec_phase1.php:862
+#: usr/local/www/vpn_ipsec_phase2.php:765 usr/local/www/interfaces.php:2045
+#: usr/local/www/interfaces.php:2167
+msgid "seconds"
+msgstr "秒"
+
+#: usr/local/www/interfaces_bridge_edit.php:331
+#: usr/local/www/interfaces_bridge_edit.php:340
+#: usr/local/www/interfaces_bridge_edit.php:341
+#: usr/local/www/interfaces_bridge_edit.php:342
+#: usr/local/www/interfaces_bridge_edit.php:344
+#: usr/local/www/interfaces_bridge_edit.php:344
+msgid ""
+"Set the time that a Spanning Tree Protocol configuration is valid. The "
+"default is 20 seconds. The minimum is 6 seconds and the maximum is 40 "
+"seconds."
+msgstr "「スパニングツリープロトコルの設定が有効である時間を設定します。 「デフォルトは20秒です。最小値は6秒で、最大値は40 」秒です。"
+
+#: usr/local/www/interfaces_bridge_edit.php:336
+#: usr/local/www/interfaces_bridge_edit.php:345
+#: usr/local/www/interfaces_bridge_edit.php:346
+#: usr/local/www/interfaces_bridge_edit.php:347
+#: usr/local/www/interfaces_bridge_edit.php:349
+#: usr/local/www/interfaces_bridge_edit.php:349
+msgid "Forward time"
+msgstr "転送時間"
+
+#: usr/local/www/interfaces_bridge_edit.php:341
+#: usr/local/www/interfaces_bridge_edit.php:350
+#: usr/local/www/interfaces_bridge_edit.php:351
+#: usr/local/www/interfaces_bridge_edit.php:352
+#: usr/local/www/interfaces_bridge_edit.php:354
+#: usr/local/www/interfaces_bridge_edit.php:354
+msgid ""
+"Set the time that must pass before an interface begins forwarding packets "
+"when Spanning Tree is enabled. The default is 15 seconds. The minimum is 4 "
+"seconds and the maximum is 30 seconds."
+msgstr "スパニングツリーが有効になっているときに「インターフェイスがパケットの転送を開始する前に通過しなければならない時間を設定します」 。デフォルトは15秒です。最小値は4秒」で、最大値は30秒です。"
+
+#: usr/local/www/interfaces_bridge_edit.php:345
+#: usr/local/www/interfaces_bridge_edit.php:354
+#: usr/local/www/interfaces_bridge_edit.php:355
+#: usr/local/www/interfaces_bridge_edit.php:356
+#: usr/local/www/interfaces_bridge_edit.php:358
+#: usr/local/www/interfaces_bridge_edit.php:358
+msgid "Hello time"
+msgstr "ハロータイム"
+
+#: usr/local/www/interfaces_bridge_edit.php:350
+#: usr/local/www/interfaces_bridge_edit.php:359
+#: usr/local/www/interfaces_bridge_edit.php:360
+#: usr/local/www/interfaces_bridge_edit.php:361
+#: usr/local/www/interfaces_bridge_edit.php:363
+#: usr/local/www/interfaces_bridge_edit.php:363
+msgid ""
+"Set the time between broadcasting of Spanning Tree Protocol configuration "
+"messages. The hello time may only be changed when operating in legacy STP "
+"mode. The default is 2 seconds. The minimum is 1 second and the maximum is "
+"2 seconds."
+msgstr "メッセージ「スパニングツリープロトコルの設定の放送までの時間を設定してください」 。レガシーSTPに動作している場合、helloタイムは変更されることがあります」モード。デフォルトは2秒です。最小値は1秒で、最大値は「 2秒。"
+
+#: usr/local/www/interfaces_bridge_edit.php:359
+#: usr/local/www/interfaces_bridge_edit.php:368
+#: usr/local/www/interfaces_bridge_edit.php:369
+#: usr/local/www/interfaces_bridge_edit.php:370
+#: usr/local/www/interfaces_bridge_edit.php:372
+#: usr/local/www/interfaces_bridge_edit.php:372
+msgid ""
+"Set the bridge priority for Spanning Tree. The default is 32768. The "
+"minimum is 0 and the maximum is 61440."
+msgstr "「スパニングツリーのブリッジプライオリティを設定します。デフォルトは32768です。 "最小値は0で、最大値は61440です。"
+
+#: usr/local/www/interfaces_bridge_edit.php:363
+#: usr/local/www/interfaces_bridge_edit.php:372
+#: usr/local/www/interfaces_bridge_edit.php:373
+#: usr/local/www/interfaces_bridge_edit.php:374
+#: usr/local/www/interfaces_bridge_edit.php:376
+#: usr/local/www/interfaces_bridge_edit.php:376
+msgid "Hold count"
+msgstr "カウントを保持"
+
+#: usr/local/www/interfaces_bridge_edit.php:368
+#: usr/local/www/interfaces_bridge_edit.php:377
+#: usr/local/www/interfaces_bridge_edit.php:378
+#: usr/local/www/interfaces_bridge_edit.php:379
+msgid ""
+"Set the transmit hold count for Spanning Tree. This is the num- ber of "
+"packets transmitted before being rate limited. The default is 6. The "
+"minimum is 1 and the maximum is 10."
+msgstr "レート制限される前に送信されたパケット」スパニングツリーの送信ホールドカウントを設定します。これは·ナンバーである"。デフォルトは6です。 「最小値は1で、最大値は10です。"
+
+#: usr/local/www/interfaces_bridge_edit.php:382
+msgid ""
+"Set the Spanning Tree priority of interface to value. The default is 128. "
+"The minimum is 0 and the maximum is 240."
+msgstr "「値へのインターフェイスのスパニングツリー優先度を設定します。デフォルトは128です。 「最小値は0で、最大値は240です。"
+
+#: usr/local/www/interfaces_bridge_edit.php:386
+#: usr/local/www/interfaces_bridge_edit.php:395
+#: usr/local/www/interfaces_bridge_edit.php:396
+#: usr/local/www/interfaces_bridge_edit.php:397
+#: usr/local/www/interfaces_bridge_edit.php:400
+#: usr/local/www/interfaces_bridge_edit.php:400
+msgid "Path cost"
+msgstr "パスコスト"
+
+#: usr/local/www/interfaces_bridge_edit.php:395
+#: usr/local/www/interfaces_bridge_edit.php:404
+#: usr/local/www/interfaces_bridge_edit.php:405
+#: usr/local/www/interfaces_bridge_edit.php:406
+#: usr/local/www/interfaces_bridge_edit.php:410
+#: usr/local/www/interfaces_bridge_edit.php:410
+msgid ""
+"Set the Spanning Tree path cost of interface to value. The default is "
+"calculated from the link speed. To change a previously selected path cost "
+"back to automatic, set the cost to 0. The minimum is 1 and the maximum is "
+"200000000."
+msgstr "「値へのインターフェイスのスパニングツリーパスコストを設定します。デフォルトはされている「リンク速度から算出した。以前に選択したパスコストを変更するには」 、戻って自動にコストを0に設定する。最小値は1で、最大値は「 200000000 。"
+
+#: usr/local/www/interfaces_bridge_edit.php:404
+#: usr/local/www/interfaces_bridge_edit.php:413
+#: usr/local/www/interfaces_bridge_edit.php:414
+#: usr/local/www/interfaces_bridge_edit.php:415
+#: usr/local/www/interfaces_bridge_edit.php:419
+#: usr/local/www/interfaces_bridge_edit.php:419
+msgid "Cache size"
+msgstr "キャッシュサイズ"
+
+#: usr/local/www/interfaces_bridge_edit.php:406
+#: usr/local/www/interfaces_bridge_edit.php:415
+#: usr/local/www/interfaces_bridge_edit.php:416
+#: usr/local/www/interfaces_bridge_edit.php:417
+#: usr/local/www/interfaces_bridge_edit.php:421
+#: usr/local/www/interfaces_bridge_edit.php:421
+msgid "entries"
+msgstr "エントリー"
+
+#: usr/local/www/interfaces_bridge_edit.php:408
+#: usr/local/www/interfaces_bridge_edit.php:417
+#: usr/local/www/interfaces_bridge_edit.php:418
+#: usr/local/www/interfaces_bridge_edit.php:419
+#: usr/local/www/interfaces_bridge_edit.php:423
+#: usr/local/www/interfaces_bridge_edit.php:423
+msgid ""
+"Set the size of the bridge address cache to size.tThe default is .100 "
+"entries."
+msgstr "エントリ「 size.tTheのデフォルトにブリッジ·アドレス·キャッシュのサイズを設定.100です」 。"
+
+#: usr/local/www/interfaces_bridge_edit.php:414
+#: usr/local/www/interfaces_bridge_edit.php:423
+#: usr/local/www/interfaces_bridge_edit.php:424
+#: usr/local/www/interfaces_bridge_edit.php:425
+#: usr/local/www/interfaces_bridge_edit.php:429
+#: usr/local/www/interfaces_bridge_edit.php:429
+msgid "Cache entry expire time"
+msgstr "キャッシュエントリは有効期限を"
+
+#: usr/local/www/interfaces_bridge_edit.php:418
+#: usr/local/www/interfaces_bridge_edit.php:427
+#: usr/local/www/interfaces_bridge_edit.php:428
+#: usr/local/www/interfaces_bridge_edit.php:429
+#: usr/local/www/interfaces_bridge_edit.php:433
+#: usr/local/www/interfaces_bridge_edit.php:433
+msgid ""
+"Set the timeout of address cache entries to this number of seconds. If "
+"seconds is zero, then address cache entries will not be expired. The default "
+"is 240 seconds."
+msgstr "「この秒数にアドレスキャッシュエントリのタイムアウトを設定します。場合は、 "秒がゼロの場合、キャッシュエントリが期限切れにされることはありません取り組む。デフォルトは "240秒です。"
+
+#: usr/local/www/interfaces_bridge_edit.php:425
+#: usr/local/www/interfaces_bridge_edit.php:434
+#: usr/local/www/interfaces_bridge_edit.php:435
+#: usr/local/www/interfaces_bridge_edit.php:436
+#: usr/local/www/interfaces_bridge_edit.php:440
+#: usr/local/www/interfaces_bridge_edit.php:440
+msgid "Span port"
+msgstr "SPANポート"
+
+#: usr/local/www/interfaces_bridge_edit.php:439
+#: usr/local/www/interfaces_bridge_edit.php:448
+#: usr/local/www/interfaces_bridge_edit.php:449
+#: usr/local/www/interfaces_bridge_edit.php:450
+#: usr/local/www/interfaces_bridge_edit.php:454
+#: usr/local/www/interfaces_bridge_edit.php:454
+msgid ""
+"Add the interface named by interface as a span port on the bridge. Span "
+"ports transmit a copy of every frame received by the bridge. This is most "
+"useful for snooping a bridged network passively on another host connected to "
+"one of the span ports of the bridge."
+msgstr "「ブリッジのSPANポートなどのインターフェイスによって指定されたインタフェースを追加します。スパン」ポートは、ブリッジが受信したすべてのフレームのコピーを送信する。これはブリッジのスパンポートの1ほとんどの "に接続された別のホスト上で受動的にブリッジネットワークをスヌーピングに便利」である。"
+
+#: usr/local/www/interfaces_bridge_edit.php:448
+#: usr/local/www/interfaces_bridge_edit.php:457
+#: usr/local/www/interfaces_bridge_edit.php:458
+#: usr/local/www/interfaces_bridge_edit.php:459
+#: usr/local/www/interfaces_bridge_edit.php:463
+#: usr/local/www/interfaces_bridge_edit.php:463
+msgid "The span interface cannot be part of the bridge member interfaces."
+msgstr "スパンのインターフェイスは、ブリッジメンバーインターフェイスの一部にすることはできません。"
+
+#: usr/local/www/interfaces_bridge_edit.php:453
+#: usr/local/www/interfaces_bridge_edit.php:462
+#: usr/local/www/interfaces_bridge_edit.php:463
+#: usr/local/www/interfaces_bridge_edit.php:464
+#: usr/local/www/interfaces_bridge_edit.php:468
+#: usr/local/www/interfaces_bridge_edit.php:468
+msgid "Edge ports"
+msgstr "エッジポート"
+
+#: usr/local/www/interfaces_bridge_edit.php:467
+#: usr/local/www/interfaces_bridge_edit.php:476
+#: usr/local/www/interfaces_bridge_edit.php:477
+#: usr/local/www/interfaces_bridge_edit.php:478
+#: usr/local/www/interfaces_bridge_edit.php:482
+#: usr/local/www/interfaces_bridge_edit.php:482
+msgid ""
+"Set interface as an edge port. An edge port connects directly to end "
+"stations and cannot create bridging loops in the network; this allows it to "
+"transition straight to forwarding."
+msgstr "「エッジポートとしてインターフェイスを設定し、エッジポートは、エンドに直接接続されています」のステーションを、ネットワーク内のブリッジングループは作成できませんが、これはそれがまっすぐフォワーディングを「移行することができます。"
+
+#: usr/local/www/interfaces_bridge_edit.php:473
+#: usr/local/www/interfaces_bridge_edit.php:482
+#: usr/local/www/interfaces_bridge_edit.php:483
+#: usr/local/www/interfaces_bridge_edit.php:484
+#: usr/local/www/interfaces_bridge_edit.php:488
+#: usr/local/www/interfaces_bridge_edit.php:488
+msgid "Auto Edge ports"
+msgstr "自動エッジポート"
+
+#: usr/local/www/interfaces_bridge_edit.php:487
+#: usr/local/www/interfaces_bridge_edit.php:496
+#: usr/local/www/interfaces_bridge_edit.php:497
+#: usr/local/www/interfaces_bridge_edit.php:498
+#: usr/local/www/interfaces_bridge_edit.php:502
+#: usr/local/www/interfaces_bridge_edit.php:502
+msgid ""
+"Allow interface to automatically detect edge status. This is the default "
+"for all interfaces added to a bridge."
+msgstr "ブリッジに追加されたすべてのインターフェイスの"インタフェースが自動的にエッジの状態を検出することを可能にする。これがデフォルトです」 。"
+
+#: usr/local/www/interfaces_bridge_edit.php:492
+#: usr/local/www/interfaces_bridge_edit.php:501
+#: usr/local/www/interfaces_bridge_edit.php:502
+#: usr/local/www/interfaces_bridge_edit.php:503
+#: usr/local/www/interfaces_bridge_edit.php:507
+#: usr/local/www/interfaces_bridge_edit.php:507
+msgid "This will disable the autoedge status of interfaces."
+msgstr "これはインタフェースのautoedge状態が無効になります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:496
+#: usr/local/www/interfaces_bridge_edit.php:505
+#: usr/local/www/interfaces_bridge_edit.php:506
+#: usr/local/www/interfaces_bridge_edit.php:507
+#: usr/local/www/interfaces_bridge_edit.php:511
+#: usr/local/www/interfaces_bridge_edit.php:511
+msgid "PTP ports"
+msgstr "PTPポート"
+
+#: usr/local/www/interfaces_bridge_edit.php:510
+#: usr/local/www/interfaces_bridge_edit.php:519
+#: usr/local/www/interfaces_bridge_edit.php:520
+#: usr/local/www/interfaces_bridge_edit.php:521
+#: usr/local/www/interfaces_bridge_edit.php:525
+#: usr/local/www/interfaces_bridge_edit.php:525
+msgid ""
+"Set the interface as a point-to-point link. This is required for straight "
+"transitions to forwarding and should be enabled on a direct link to another "
+"RSTP-capable switch."
+msgstr "「インターフェースの設定ポイントツーポイントリンクとして。これは真っ直ぐに必要とされる「転送に遷移し、別の「 RSTP対応スイッチへの直接のリンクを有効にする必要があります。"
+
+#: usr/local/www/interfaces_bridge_edit.php:516
+#: usr/local/www/interfaces_bridge_edit.php:525
+#: usr/local/www/interfaces_bridge_edit.php:526
+#: usr/local/www/interfaces_bridge_edit.php:527
+#: usr/local/www/interfaces_bridge_edit.php:531
+#: usr/local/www/interfaces_bridge_edit.php:531
+msgid "Auto PTP ports"
+msgstr "オートPTPポート"
+
+#: usr/local/www/interfaces_bridge_edit.php:530
+#: usr/local/www/interfaces_bridge_edit.php:539
+#: usr/local/www/interfaces_bridge_edit.php:540
+#: usr/local/www/interfaces_bridge_edit.php:541
+#: usr/local/www/interfaces_bridge_edit.php:545
+#: usr/local/www/interfaces_bridge_edit.php:545
+msgid ""
+"Automatically detect the point-to-point status on interface by checking the "
+"full duplex link status. This is the default for interfaces added to the "
+"bridge."
+msgstr "全二重リンク状態」を自動的にチェックすることにより、インターフェイス上のポイントツーポイント状態を検出」 。これは、 "ブリッジに追加のインタフェースのデフォルトです。"
+
+#: usr/local/www/interfaces_bridge_edit.php:536
+#: usr/local/www/interfaces_bridge_edit.php:545
+#: usr/local/www/interfaces_bridge_edit.php:546
+#: usr/local/www/interfaces_bridge_edit.php:547
+#: usr/local/www/interfaces_bridge_edit.php:551
+#: usr/local/www/interfaces_bridge_edit.php:551
+msgid ""
+"The interfaces selected here will be removed from default autoedge status."
+msgstr "「ここで選択したインターフェイスでは、デフォルトのautoedge状態から削除されます。"
+
+#: usr/local/www/interfaces_bridge_edit.php:540
+#: usr/local/www/interfaces_bridge_edit.php:549
+#: usr/local/www/interfaces_bridge_edit.php:550
+#: usr/local/www/interfaces_bridge_edit.php:551
+#: usr/local/www/interfaces_bridge_edit.php:555
+#: usr/local/www/interfaces_bridge_edit.php:555
+msgid "Sticky ports"
+msgstr "スティッキーポート"
+
+#: usr/local/www/interfaces_bridge_edit.php:554
+#: usr/local/www/interfaces_bridge_edit.php:563
+#: usr/local/www/interfaces_bridge_edit.php:564
+#: usr/local/www/interfaces_bridge_edit.php:565
+#: usr/local/www/interfaces_bridge_edit.php:569
+#: usr/local/www/interfaces_bridge_edit.php:569
+msgid ""
+"Mark an interface as a "sticky" interface. Dynamically learned address "
+"entries are treated as static once entered into the cache. Sticky entries "
+"are never aged out of the cache or replaced, even if the address is seen on "
+"a different interface."
+msgstr "「マークとしてインターフェイス「スティッキー」インタフェースが動的に学習されたアドレス "のエントリはスタティックとして扱われ、一度キャッシュに入った。スティッキエントリには異なるインターフェース「アドレスがで見ていても、キャッシュから老化しない、または交換決してあり」 。"
+
+#: usr/local/www/interfaces_bridge_edit.php:561
+#: usr/local/www/interfaces_bridge_edit.php:570
+#: usr/local/www/interfaces_bridge_edit.php:571
+#: usr/local/www/interfaces_bridge_edit.php:572
+#: usr/local/www/interfaces_bridge_edit.php:576
+#: usr/local/www/interfaces_bridge_edit.php:576
+msgid "Private ports"
+msgstr "プライベートポート"
+
+#: usr/local/www/interfaces_bridge_edit.php:575
+#: usr/local/www/interfaces_bridge_edit.php:584
+#: usr/local/www/interfaces_bridge_edit.php:585
+#: usr/local/www/interfaces_bridge_edit.php:586
+#: usr/local/www/interfaces_bridge_edit.php:590
+#: usr/local/www/interfaces_bridge_edit.php:590
+msgid ""
+"Mark an interface as a "private" interface. A private interface does not "
+"forward any traffic to any other port that is also a private interface."
+msgstr "プライベート "としてインターフェイスマーク」 」のインターフェイスを。プライベート·インタフェースがありません」また、プライベート·インタフェースである他のポートにトラフィックを転送します。"
+
+#: usr/local/www/interfaces_gif.php:64 usr/local/www/interfaces_gif.php:68
+#: usr/local/www/interfaces_gif.php:68
+msgid ""
+"This gif TUNNEL cannot be deleted because it is still being used as an "
+"interface."
+msgstr "インターフェイス「それはまだとして使用されているため、このGIFトンネルは削除できません」 。"
+
+#: usr/local/www/interfaces_gif.php:107 usr/local/www/interfaces_gre.php:108
+#: usr/local/www/interfaces_gre.php:109 usr/local/www/interfaces_gif.php:108
+#: usr/local/www/interfaces_gre.php:113 usr/local/www/interfaces_gif.php:112
+#: usr/local/www/interfaces_gre.php:113 usr/local/www/interfaces_gif.php:112
+msgid "Tunnel to..."
+msgstr "トンネルに..."
+
+#: usr/local/www/interfaces_gif.php:123 usr/local/www/interfaces_gif.php:124
+#: usr/local/www/interfaces_gif.php:128 usr/local/www/interfaces_gif.php:128
+msgid "Do you really want to delete this gif tunnel?"
+msgstr "あなたは本当にこのGIFトンネルを削除しますか?"
+
+#: usr/local/www/interfaces_gif.php:134 usr/local/www/interfaces_gif.php:135
+#: usr/local/www/interfaces_gif.php:139 usr/local/www/interfaces_gif.php:139
+msgid "GIF tunnels are configured here."
+msgstr "GIFトンネルはここで設定されています。"
+
+#: usr/local/www/interfaces_gif_edit.php:72
+#: usr/local/www/interfaces_gif_edit.php:75
+#: usr/local/www/interfaces_gif_edit.php:75
+msgid ""
+"Parent interface,Local address, Remote tunnel address, Remote tunnel "
+"network, Local tunnel address"
+msgstr "「親のインタフェース、ローカルアドレス、リモートトンネルアドレス、リモートトンネル」ネットワーク、ローカルトンネルアドレス"
+
+#: usr/local/www/interfaces_gif_edit.php:78
+#: usr/local/www/interfaces_gre_edit.php:80
+#: usr/local/www/interfaces_gif_edit.php:81
+#: usr/local/www/interfaces_gre_edit.php:80
+#: usr/local/www/interfaces_gif_edit.php:81
+msgid "The tunnel local and tunnel remote fields must have valid IP addresses."
+msgstr "トンネルのローカルおよびリモートのトンネルのフィールドは、有効なIPアドレスを持っている必要があります。"
+
+#: usr/local/www/interfaces_gif_edit.php:87
+#: usr/local/www/interfaces_gif_edit.php:95
+#: usr/local/www/interfaces_gif_edit.php:95
+#, php-format
+msgid "A gif with the network %s is already defined."
+msgstr "ネットワーク%sとGIFがすでに定義されています。"
+
+#: usr/local/www/interfaces_gif_edit.php:136
+#: usr/local/www/interfaces_gif_edit.php:137
+#: usr/local/www/interfaces_gif_edit.php:138
+#: usr/local/www/interfaces_gif_edit.php:146
+#: usr/local/www/interfaces_gif_edit.php:146
+msgid "GIF configuration"
+msgstr "GIFの設定"
+
+#: usr/local/www/interfaces_gif_edit.php:139
+#: usr/local/www/interfaces_gre_edit.php:74
+#: usr/local/www/interfaces_gre_edit.php:141
+#: usr/local/www/interfaces_vlan_edit.php:75
+#: usr/local/www/interfaces_vlan_edit.php:153
+#: usr/local/www/interfaces_lagg_edit.php:134
+#: usr/local/www/interfaces_qinq_edit.php:288
+#: usr/local/www/interfaces_wireless_edit.php:84
+#: usr/local/www/interfaces_wireless_edit.php:159
+#: usr/local/www/interfaces_gif_edit.php:140
+#: usr/local/www/interfaces_vlan_edit.php:154
+#: usr/local/www/interfaces_qinq_edit.php:289
+#: usr/local/www/interfaces_gif_edit.php:141
+#: usr/local/www/interfaces_lagg_edit.php:135
+#: usr/local/www/interfaces_gre_edit.php:142
+#: usr/local/www/interfaces_wireless_edit.php:86
+#: usr/local/www/interfaces_wireless_edit.php:161
+#: usr/local/www/interfaces_vlan_edit.php:157
+#: usr/local/www/interfaces_lagg_edit.php:148
+#: usr/local/www/interfaces_gif_edit.php:149
+#: usr/local/www/interfaces_qinq_edit.php:292
+#: usr/local/www/interfaces_wireless_edit.php:86
+#: usr/local/www/interfaces_wireless_edit.php:161
+#: usr/local/www/interfaces_gre_edit.php:74
+#: usr/local/www/interfaces_gre_edit.php:142
+#: usr/local/www/interfaces_vlan_edit.php:75
+#: usr/local/www/interfaces_vlan_edit.php:157
+#: usr/local/www/interfaces_lagg_edit.php:148
+#: usr/local/www/interfaces_gif_edit.php:149
+#: usr/local/www/interfaces_qinq_edit.php:292
+msgid "Parent interface"
+msgstr "親インターフェース"
+
+#: usr/local/www/interfaces_gif_edit.php:156
+#: usr/local/www/interfaces_gif_edit.php:157
+#: usr/local/www/interfaces_gif_edit.php:158
+#: usr/local/www/interfaces_gif_edit.php:169
+msgid ""
+"The interface here servers as the local address to be used for the gif "
+"tunnel."
+msgstr "トンネル"GIFに使用するローカルアドレスとして、ここでインターフェースのサーバー」 。"
+
+#: usr/local/www/interfaces_gif_edit.php:159
+#: usr/local/www/interfaces_gif_edit.php:160
+#: usr/local/www/interfaces_gif_edit.php:161
+#: usr/local/www/interfaces_gif_edit.php:172
+#: usr/local/www/interfaces_gif_edit.php:172
+msgid "gif remote address"
+msgstr "GIFリモートアドレス"
+
+#: usr/local/www/interfaces_gif_edit.php:163
+#: usr/local/www/interfaces_gif_edit.php:164
+#: usr/local/www/interfaces_gif_edit.php:165
+#: usr/local/www/interfaces_gif_edit.php:176
+#: usr/local/www/interfaces_gif_edit.php:176
+msgid "Peer address where encapsulated gif packets will be sent. "
+msgstr "カプセル化されたGIFパケットが送信されるピアアドレス。"
+
+#: usr/local/www/interfaces_gif_edit.php:166
+#: usr/local/www/interfaces_gif_edit.php:167
+#: usr/local/www/interfaces_gif_edit.php:168
+#: usr/local/www/interfaces_gif_edit.php:179
+#: usr/local/www/interfaces_gif_edit.php:179
+msgid "gif tunnel local address"
+msgstr "GIFトンネルのローカルアドレス"
+
+#: usr/local/www/interfaces_gif_edit.php:170
+#: usr/local/www/interfaces_gif_edit.php:171
+#: usr/local/www/interfaces_gif_edit.php:172
+#: usr/local/www/interfaces_gif_edit.php:183
+#: usr/local/www/interfaces_gif_edit.php:183
+msgid "Local gif tunnel endpoint"
+msgstr "ローカルGIFトンネルエンドポイント"
+
+#: usr/local/www/interfaces_gif_edit.php:173
+#: usr/local/www/interfaces_gif_edit.php:174
+#: usr/local/www/interfaces_gif_edit.php:175
+#: usr/local/www/interfaces_gif_edit.php:186
+#: usr/local/www/interfaces_gif_edit.php:186
+msgid "gif tunnel remote address "
+msgstr "GIFトンネルのリモートアドレス"
+
+#: usr/local/www/interfaces_gif_edit.php:188
+#: usr/local/www/interfaces_gif_edit.php:189
+#: usr/local/www/interfaces_gif_edit.php:200
+#: usr/local/www/interfaces_gif_edit.php:200
+msgid ""
+"Remote gif address endpoint. The subnet part is used for determining the "
+"network that is tunnelled."
+msgstr "「リモートgif注アドレス·エンドポイント。サブネット部を決定するために使用される「トンネリングされているネットワーク。"
+
+#: usr/local/www/interfaces_gif_edit.php:191
+#: usr/local/www/interfaces_gif_edit.php:192
+#: usr/local/www/interfaces_gif_edit.php:203
+#: usr/local/www/interfaces_gif_edit.php:203
+msgid "Route caching "
+msgstr "ルート·キャッシング"
+
+#: usr/local/www/interfaces_gif_edit.php:195
+#: usr/local/www/interfaces_gif_edit.php:196
+#: usr/local/www/interfaces_gif_edit.php:207
+#: usr/local/www/interfaces_gif_edit.php:207
+msgid ""
+"Specify if route caching can be enabled. Be careful with these settings on "
+"dynamic networks. "
+msgstr "「ルートキャッシュを有効にできるかどうかを指定します。これらの設定には注意してください"ダイナミックなネットワーク。"
+
+#: usr/local/www/interfaces_gif_edit.php:198
+#: usr/local/www/interfaces_gif_edit.php:199
+#: usr/local/www/interfaces_gif_edit.php:210
+msgid "ECN friendly behaviour"
+msgstr "電子証券取引ネットワークにやさしい行動"
+
+#: usr/local/www/interfaces_gif_edit.php:203
+#: usr/local/www/interfaces_gif_edit.php:204
+#: usr/local/www/interfaces_gif_edit.php:215
+#: usr/local/www/interfaces_gif_edit.php:215
+msgid ""
+"Note that the ECN friendly behavior violates RFC2893. This should be used "
+"in mutual agreement with the peer."
+msgstr "ピアとの合意で「電子証券取引ネットワークに優しい行動がRFC2893に違反していることに注意してください。これを使用する必要があります」 。"
+
+#: usr/local/www/interfaces_gre.php:65 usr/local/www/interfaces_gre.php:69
+#: usr/local/www/interfaces_gre.php:69
+msgid ""
+"This GRE tunnel cannot be deleted because it is still being used as an "
+"interface."
+msgstr "インターフェイス「それはまだとして使用されているため、このGREトンネルを削除することはできません」 。"
+
+#: usr/local/www/interfaces_gre.php:124 usr/local/www/interfaces_gre.php:125
+#: usr/local/www/interfaces_gre.php:129 usr/local/www/interfaces_gre.php:129
+msgid "Do you really want to delete this GRE tunnel?"
+msgstr "あなたは本当に、このGREトンネルを削除しますか?"
+
+#: usr/local/www/interfaces_gre.php:133 usr/local/www/interfaces_gre.php:134
+#: usr/local/www/interfaces_gre.php:138 usr/local/www/interfaces_gre.php:138
+msgid ""
+"Here you can configure Generic Routing Encapsulation (GRE - RFC 2784) "
+"tunnels."
+msgstr "トンネル - "ここでは総称ルーティングカプセル化( RFC 2784 GRE )を設定することができます」 。"
+
+#: usr/local/www/interfaces_gre_edit.php:74
+#: usr/local/www/interfaces_gre_edit.php:74
+msgid "Local address"
+msgstr "ローカルアドレス"
+
+#: usr/local/www/interfaces_gre_edit.php:74
+#: usr/local/www/interfaces_gre_edit.php:74
+msgid "Remote tunnel address"
+msgstr "リモートトンネルアドレス"
+
+#: usr/local/www/interfaces_gre_edit.php:74
+#: usr/local/www/interfaces_gre_edit.php:74
+msgid "Remote tunnel network"
+msgstr "リモートトンネルネットワーク"
+
+#: usr/local/www/interfaces_gre_edit.php:74
+#: usr/local/www/interfaces_gre_edit.php:74
+msgid "Local tunnel address"
+msgstr "ローカルトンネルアドレス"
+
+#: usr/local/www/interfaces_gre_edit.php:88
+#: usr/local/www/interfaces_gre_edit.php:88
+#, php-format
+msgid "A GRE tunnel with the network %s is already defined."
+msgstr "ネットワーク%sとGREトンネルはすでに定義されています。"
+
+#: usr/local/www/interfaces_gre_edit.php:138
+#: usr/local/www/interfaces_gre_edit.php:139
+#: usr/local/www/interfaces_gre_edit.php:139
+msgid "GRE configuration"
+msgstr "GREの設定"
+
+#: usr/local/www/interfaces_gre_edit.php:158
+#: usr/local/www/interfaces_gre_edit.php:159
+#: usr/local/www/interfaces_gre_edit.php:159
+msgid ""
+"The interface here serves as the local address to be used for the GRE tunnel."
+msgstr "「ここのインタフェースは、 GREトンネルに使用するローカルアドレスとして機能します。"
+
+#: usr/local/www/interfaces_gre_edit.php:161
+#: usr/local/www/interfaces_gre_edit.php:162
+#: usr/local/www/interfaces_gre_edit.php:162
+msgid "GRE remote address"
+msgstr "GREのリモートアドレス"
+
+#: usr/local/www/interfaces_gre_edit.php:165
+#: usr/local/www/interfaces_gre_edit.php:166
+#: usr/local/www/interfaces_gre_edit.php:166
+msgid "Peer address where encapsulated GRE packets will be sent "
+msgstr "カプセル化されたGREパケットの送信先となるピアアドレス"
+
+#: usr/local/www/interfaces_gre_edit.php:168
+#: usr/local/www/interfaces_gre_edit.php:169
+#: usr/local/www/interfaces_gre_edit.php:169
+msgid "GRE tunnel local address "
+msgstr "GREトンネルのローカルアドレス"
+
+#: usr/local/www/interfaces_gre_edit.php:172
+#: usr/local/www/interfaces_gre_edit.php:173
+#: usr/local/www/interfaces_gre_edit.php:173
+msgid "Local GRE tunnel endpoint"
+msgstr "ローカルのGREトンネルのエンドポイント"
+
+#: usr/local/www/interfaces_gre_edit.php:175
+#: usr/local/www/interfaces_gre_edit.php:176
+#: usr/local/www/interfaces_gre_edit.php:176
+msgid "GRE tunnel remote address "
+msgstr "GREトンネルのリモートアドレス"
+
+#: usr/local/www/interfaces_gre_edit.php:190
+#: usr/local/www/interfaces_gre_edit.php:189
+#: usr/local/www/interfaces_gre_edit.php:190
+msgid ""
+"Remote GRE address endpoint. The subnet part is used for the determining the "
+"network that is tunneled."
+msgstr "ネットワークにトンネリングされる「リモートGREアドレスエンドポイントは。サブネット部を決定するために使用される"。"
+
+#: usr/local/www/interfaces_gre_edit.php:193
+#: usr/local/www/interfaces_gre_edit.php:192
+#: usr/local/www/interfaces_gre_edit.php:193
+msgid "Mobile tunnel"
+msgstr "モバイルトンネル"
+
+#: usr/local/www/interfaces_gre_edit.php:197
+#: usr/local/www/interfaces_gre_edit.php:196
+#: usr/local/www/interfaces_gre_edit.php:197
+msgid "Specify which encapsulation method the tunnel should use. "
+msgstr "トンネルが使用する必要があるカプセル化方法を指定します。"
+
+#: usr/local/www/interfaces_gre_edit.php:200
+#: usr/local/www/interfaces_gre_edit.php:199
+#: usr/local/www/interfaces_gre_edit.php:200
+msgid "Route search type"
+msgstr "経路探索タイプ"
+
+#: usr/local/www/interfaces_gre_edit.php:205
+#: usr/local/www/interfaces_gre_edit.php:204
+#: usr/local/www/interfaces_gre_edit.php:205
+msgid ""
+"For correct operation, the GRE device needs a route to the destination that "
+"is less specific than the one over the tunnel. (Basically, there needs to "
+"be a route to the decapsulating host that does not run over the tunnel, as "
+"this would be a loop."
+msgstr "トンネル上の1よりも小さい固有である「正常な動作のためには、 GREのデバイスは、その目的地へのルートを必要とします」 。 (基本的に、これがループになる」と、トンネル上で実行されないカプセル化解除ホストへの経路であること」にある必要がある。"
+
+#: usr/local/www/interfaces_gre_edit.php:212
+#: usr/local/www/interfaces_gre_edit.php:211
+#: usr/local/www/interfaces_gre_edit.php:212
+msgid "WCCP version"
+msgstr "WCCPバージョン"
+
+#: usr/local/www/interfaces_gre_edit.php:216
+#: usr/local/www/interfaces_gre_edit.php:215
+#: usr/local/www/interfaces_gre_edit.php:216
+msgid ""
+"Specify which WCCP encapsulation(version 1 or 2) method the tunnel should use"
+msgstr "「これWCCPカプセル化(バージョン1または2 )の方法トンネルが使用する必要がありますを指定"
+
+#: usr/local/www/interfaces_groups.php:63
+#: usr/local/www/interfaces_groups_edit.php:44
+#: usr/local/www/system_routes.php:117
+#: usr/local/www/status_gateway_groups.php:65
+#: usr/local/www/system_authservers.php:422
+#: usr/local/www/system_gateway_groups.php:110
+#: usr/local/www/system_gateways.php:143
+#: usr/local/www/system_groupmanager.php:241
+#: usr/local/www/system_groupmanager_addprivs.php:169
+#: usr/local/www/system_usermanager.php:441
+#: usr/local/www/system_usermanager.php:790
+#: usr/local/www/system_usermanager_addprivs.php:168
+#: usr/local/www/system_usermanager_settings.php:114
+#: usr/local/www/system_usermanager.php:439
+#: usr/local/www/system_usermanager.php:788
+#: usr/local/www/system_groupmanager_addprivs.php:167
+#: usr/local/www/system_usermanager.php:789
+#: usr/local/www/system_gateway_groups.php:111
+#: usr/local/www/system_authservers.php:427
+#: usr/local/www/system_routes.php:121
+#: usr/local/www/system_authservers.php:434
+#: usr/local/www/system_usermanager_settings.php:116
+#: usr/local/www/system_gateway_groups.php:120
+#: usr/local/www/system_routes.php:136
+#: usr/local/www/system_groupmanager.php:241
+#: usr/local/www/system_usermanager_addprivs.php:168
+#: usr/local/www/system_routes.php:136 usr/local/www/interfaces_groups.php:63
+#: usr/local/www/interfaces_groups_edit.php:44
+#: usr/local/www/system_authservers.php:434
+#: usr/local/www/system_groupmanager_addprivs.php:167
+#: usr/local/www/system_usermanager_settings.php:116
+#: usr/local/www/system_usermanager.php:439
+#: usr/local/www/system_usermanager.php:789
+#: usr/local/www/system_gateways.php:143
+#: usr/local/www/system_gateway_groups.php:120
+msgid "Groups"
+msgstr "グループ"
+
+#: usr/local/www/interfaces_groups.php:127
+#: usr/local/www/system_groupmanager.php:443
+#: usr/local/www/system_groupmanager.php:446
+#: usr/local/www/interfaces_groups.php:128
+#: usr/local/www/system_groupmanager.php:464
+#: usr/local/www/system_groupmanager.php:464
+#: usr/local/www/interfaces_groups.php:128
+msgid "edit group"
+msgstr "編集グループ"
+
+#: usr/local/www/interfaces_groups.php:128
+#: usr/local/www/interfaces_groups.php:129
+#: usr/local/www/interfaces_groups.php:129
+msgid ""
+"Do you really want to delete this group? All elements that still use it will "
+"become invalid (e.g. filter rules)!"
+msgstr " (例えばフィルタルール)が無効になる「本当に?まだそれを使用するすべての要素がします。このグループを削除しますか"!"
+
+#: usr/local/www/interfaces_groups.php:128
+#: usr/local/www/interfaces_groups.php:129
+#: usr/local/www/interfaces_groups.php:129
+msgid "delete ifgroupentry"
+msgstr "ifgroupentryを削除"
+
+#: usr/local/www/interfaces_groups.php:140
+#: usr/local/www/interfaces_groups.php:141
+#: usr/local/www/interfaces_groups.php:141
+msgid "add a new group"
+msgstr "新しいグループを追加"
+
+#: usr/local/www/interfaces_groups.php:148
+#: usr/local/www/interfaces_groups.php:149
+#: usr/local/www/interfaces_groups.php:148
+msgid ""
+"Interface Groups allow you to create rules that apply to multiple interfaces "
+"without duplicating the rules. If you remove members from an interface "
+"group, the group rules no longer apply to that interface."
+msgstr "ルールを複製することなく「インターフェイスグループは、複数のインターフェイスに適用するルールを作成することができます」 。インターフェイス"グループからメンバーを削除すると、グループルールは、もはやそのインターフェイスに適用されません。"
+
+#: usr/local/www/interfaces_groups_edit.php:71
+#: usr/local/www/interfaces_groups_edit.php:72
+#: usr/local/www/interfaces_groups_edit.php:72
+msgid "Group name already exists!"
+msgstr "グループ名はすでに存在しています !"
+
+#: usr/local/www/interfaces_groups_edit.php:74
+#: usr/local/www/interfaces_groups_edit.php:75
+#: usr/local/www/interfaces_groups_edit.php:75
+msgid "Only letters A-Z are allowed as the group name."
+msgstr "唯一の文字A - Zはグループ名として許可されています。"
+
+#: usr/local/www/interfaces_groups_edit.php:248
+#: usr/local/www/interfaces_groups_edit.php:249
+#: usr/local/www/interfaces_groups_edit.php:249
+msgid "Interface Groups Edit"
+msgstr "インターフェースグループの編集"
+
+#: usr/local/www/interfaces_groups_edit.php:251
+#: usr/local/www/status_gateway_groups.php:74
+#: usr/local/www/system_gateway_groups.php:120
+#: usr/local/www/system_gateway_groups_edit.php:158
+#: usr/local/www/system_gateway_groups_edit.php:161
+#: usr/local/www/system_groupmanager.php:117
+#: usr/local/www/system_gateway_groups_edit.php:169
+#: usr/local/www/system_gateway_groups_edit.php:172
+#: usr/local/www/system_gateway_groups_edit.php:228
+#: usr/local/www/system_gateway_groups_edit.php:231
+#: usr/local/www/system_gateway_groups.php:121
+#: usr/local/www/interfaces_groups_edit.php:252
+#: usr/local/www/status_gateway_groups.php:75
+#: usr/local/www/system_gateway_groups_edit.php:232
+#: usr/local/www/system_gateway_groups_edit.php:235
+#: usr/local/www/system_gateway_groups.php:130
+#: usr/local/www/system_groupmanager.php:117
+#: usr/local/www/interfaces_groups_edit.php:252
+#: usr/local/www/system_gateway_groups_edit.php:232
+#: usr/local/www/system_gateway_groups_edit.php:235
+#: usr/local/www/status_gateway_groups.php:75
+#: usr/local/www/system_gateway_groups.php:130
+msgid "Group Name"
+msgstr "グループ名"
+
+#: usr/local/www/interfaces_groups_edit.php:255
+#: usr/local/www/interfaces_groups_edit.php:256
+#: usr/local/www/interfaces_groups_edit.php:256
+msgid "No numbers or spaces are allowed. Only characters in a-zA-Z"
+msgstr "全く数字やスペースは使用できません。 - ZA- Zの中の文字のみ"
+
+#: usr/local/www/interfaces_groups_edit.php:269
+#: usr/local/www/interfaces_qinq_edit.php:347
+#: usr/local/www/interfaces_qinq_edit.php:348
+#: usr/local/www/interfaces_groups_edit.php:270
+#: usr/local/www/interfaces_qinq_edit.php:351
+#: usr/local/www/interfaces_groups_edit.php:270
+#: usr/local/www/interfaces_qinq_edit.php:351
+msgid "Member (s)"
+msgstr "(履歴)"
+
+#: usr/local/www/firewall_aliases.php:103
+#: usr/local/www/firewall_aliases.php:106
+#: usr/local/www/firewall_aliases.php:107
+#: usr/local/www/firewall_aliases.php:106
+#, php-format
+msgid "Cannot delete alias. Currently in use by %s"
+msgstr "エイリアスを削除することはできません。現在%sで使用されている"
+
+#: usr/local/www/firewall_aliases.php:160
+#: usr/local/www/firewall_aliases.php:163
+#: usr/local/www/firewall_aliases.php:167
+#: usr/local/www/firewall_aliases.php:166
+#: usr/local/www/firewall_aliases.php:166
+msgid "The alias list has been changed."
+msgstr "エイリアスリストが変更されました。"
+
+#: usr/local/www/firewall_aliases.php:166
+#: usr/local/www/services_igmpproxy.php:97
+#: usr/local/www/firewall_aliases.php:169
+#: usr/local/www/firewall_aliases.php:189
+#: usr/local/www/firewall_aliases.php:189
+#: usr/local/www/services_igmpproxy.php:97
+msgid "Values"
+msgstr "値"
+
+#: usr/local/www/firewall_aliases.php:172
+#: usr/local/www/firewall_aliases.php:218
+#: usr/local/www/firewall_aliases.php:175
+#: usr/local/www/firewall_aliases.php:221
+msgid "add a new alias"
+msgstr "新しいエイリアスを追加"
+
+#: usr/local/www/firewall_aliases.php:204
+#: usr/local/www/firewall_schedule.php:220
+#: usr/local/www/firewall_aliases.php:207
+#: usr/local/www/firewall_schedule.php:220
+msgid "edit alias"
+msgstr "編集別名"
+
+#: usr/local/www/firewall_aliases.php:205
+#: usr/local/www/firewall_aliases.php:208
+#: usr/local/www/firewall_aliases.php:256
+#: usr/local/www/firewall_aliases.php:257
+#: usr/local/www/firewall_aliases.php:258
+#: usr/local/www/firewall_aliases.php:258
+msgid ""
+"Do you really want to delete this alias? All elements that still use it will "
+"become invalid (e.g. filter rules)!"
+msgstr "「あなたは本当にこのエイリアスを削除しますか?まだそれを使用するすべての要素がします" (例えばフィルタルール)無効になります。"
+
+#: usr/local/www/firewall_aliases.php:205
+#: usr/local/www/firewall_schedule.php:221
+#: usr/local/www/firewall_aliases.php:208
+#: usr/local/www/firewall_schedule.php:221
+msgid "delete alias"
+msgstr "エイリアスを削除"
+
+#: usr/local/www/firewall_aliases.php:221
+#: usr/local/www/firewall_aliases.php:224
+#: usr/local/www/firewall_aliases.php:275
+#: usr/local/www/firewall_aliases.php:277
+#: usr/local/www/firewall_aliases.php:278
+#: usr/local/www/firewall_aliases.php:278
+msgid "Bulk import aliases from list"
+msgstr "リストから一括インポートエイリアス"
+
+#: usr/local/www/firewall_aliases.php:229
+#: usr/local/www/firewall_aliases.php:232
+#: usr/local/www/firewall_aliases.php:284
+#: usr/local/www/firewall_aliases.php:287
+#: usr/local/www/firewall_aliases.php:288
+#: usr/local/www/firewall_aliases.php:288
+msgid ""
+"Aliases act as placeholders for real hosts, networks or ports. They can be "
+"used to minimize the number of changes that have to be made if a host, "
+"network or port changes. You can enter the name of an alias instead of the "
+"host, network or port in all fields that have a red background. The alias "
+"will be resolved according to the list above. If an alias cannot be resolved "
+"(e.g. because you deleted it), the corresponding element (e.g. filter/NAT/"
+"shaper rule) will be considered invalid and skipped."
+msgstr "「エイリアスは、実際のホスト、ネットワークまたはポートのプレースホルダとして機能します。彼らがすることができる「あなたの代わりに別名の名前を入力することができ、ホスト、 「ネットワークまたはポートが変更された場合。行わなければならない変更の数を最小化するために使用赤い背景を持っているすべてのフィールドでは「ホスト、ネットワークまたはポート。エイリアスが「上記のリストに従って解決されます。エイリアスが解決できない場合は、「 (あなたがそれを削除したなどため) 、対応する要素(例えば、フィルタ/ NAT / 「シェールール)は、無効とみなされ、スキップされます。"
+
+#: usr/local/www/firewall_aliases_edit.php:105
+#: usr/local/www/firewall_aliases_edit.php:107
+#: usr/local/www/firewall_aliases_edit.php:107
+#, php-format
+msgid "Sorry, an interface is already named %s."
+msgstr "申し訳ありませんが、インターフェイスはすでに%s.という名前です"
+
+#: usr/local/www/firewall_aliases_edit.php:140
+#: usr/local/www/firewall_aliases_edit.php:142
+#: usr/local/www/firewall_aliases_edit.php:134
+#: usr/local/www/firewall_aliases_edit.php:136
+#: usr/local/www/firewall_aliases_edit.php:134
+#: usr/local/www/firewall_aliases_edit.php:136
+msgid "Reserved word used for alias name."
+msgstr "エイリアス名に使用する予約語。"
+
+#: usr/local/www/firewall_aliases_edit.php:145
+#: usr/local/www/firewall_aliases_edit.php:139
+#: usr/local/www/firewall_aliases_edit.php:139
+msgid ""
+"The alias name must be less than 32 characters long, may not consist of only numbers, and may only contain the following characters "
+msgstr "「エイリアス名は、長い32文字未満でなければならず、唯一で構成することができる」の文字"
+
+#: usr/local/www/firewall_aliases_edit.php:187
+#: usr/local/www/firewall_aliases_edit.php:242
+#: usr/local/www/firewall_aliases_edit.php:188
+#: usr/local/www/firewall_aliases_edit.php:244
+#: usr/local/www/firewall_aliases_edit.php:182
+#: usr/local/www/firewall_aliases_edit.php:182
+msgid "You must provide a valid URL."
+msgstr "有効なURLを指定する必要があります。"
+
+#: usr/local/www/firewall_aliases_edit.php:190
+#: usr/local/www/firewall_aliases_edit.php:191
+#: usr/local/www/firewall_aliases_edit.php:185
+#: usr/local/www/firewall_aliases_edit.php:185
+msgid "Unable to fetch usable data."
+msgstr "使用可能なデータを取得することができません。"
+
+#: usr/local/www/firewall_aliases_edit.php:235
+#: usr/local/www/firewall_aliases_edit.php:237
+msgid "You must provide a valid URL. Could not fetch usable data."
+msgstr "有効なURLを指定する必要があります。使用可能なデータを取得できませんでした。"
+
+#: usr/local/www/firewall_aliases_edit.php:261
+#: usr/local/www/firewall_aliases_edit.php:264
+#: usr/local/www/firewall_aliases_edit.php:278
+#: usr/local/www/firewall_aliases_edit.php:269
+msgid "is not a valid port or alias."
+msgstr "有効なポートまたはエイリアスではありません。"
+
+#: usr/local/www/firewall_aliases_edit.php:266
+#: usr/local/www/firewall_aliases_edit.php:269
+#: usr/local/www/firewall_aliases_edit.php:283
+#: usr/local/www/firewall_aliases_edit.php:274
+#, php-format
+msgid "%1$s is not a valid %2$s alias."
+msgstr "は%1$sは有効%2$sの別名ではありません。"
+
+#: usr/local/www/firewall_aliases_edit.php:281
+#: usr/local/www/firewall_aliases_edit.php:284
+#: usr/local/www/firewall_aliases_edit.php:191
+#: usr/local/www/firewall_aliases_edit.php:221
+#: usr/local/www/firewall_aliases_edit.php:303
+#: usr/local/www/firewall_aliases_edit.php:191
+#: usr/local/www/firewall_aliases_edit.php:221
+#: usr/local/www/firewall_aliases_edit.php:289
+#, php-format
+msgid "Entry added %s"
+msgstr "エントリ追加%s"
+
+#: usr/local/www/firewall_aliases_edit.php:285
+#: usr/local/www/firewall_aliases_edit.php:288
+#: usr/local/www/firewall_aliases_edit.php:307
+#: usr/local/www/firewall_aliases_edit.php:293
+#, php-format
+msgid ""
+"The alias(es): %s cannot be nested because they are not of the same type."
+msgstr "「エイリアス( ES ) :彼らは同じ型ではないため%sを入れ子にすることはできません。"
+
+#: usr/local/www/firewall_aliases_edit.php:453
+#: usr/local/www/firewall_aliases_edit.php:605
+#: usr/local/www/firewall_aliases_edit.php:456
+#: usr/local/www/firewall_aliases_edit.php:610
+#: usr/local/www/firewall_aliases_edit.php:458
+#: usr/local/www/firewall_aliases_edit.php:613
+#: usr/local/www/firewall_aliases_edit.php:480
+#: usr/local/www/firewall_aliases_edit.php:644
+#: usr/local/www/firewall_aliases_edit.php:466
+#: usr/local/www/firewall_aliases_edit.php:630
+msgid "Network(s)"
+msgstr "ネットワーク(単数または複数)"
+
+#: usr/local/www/firewall_aliases_edit.php:454
+#: usr/local/www/services_igmpproxy_edit.php:224
+#: usr/local/www/services_unbound_acls.php:237
+#: usr/local/www/services_igmpproxy_edit.php:226
+#: usr/local/www/firewall_aliases_edit.php:457
+#: usr/local/www/firewall_aliases_edit.php:459
+#: usr/local/www/firewall_aliases_edit.php:481
+#: usr/local/www/firewall_aliases_edit.php:467
+#: usr/local/www/services_igmpproxy_edit.php:226
+msgid "CIDR"
+msgstr "CIDR"
+
+#: usr/local/www/firewall_aliases_edit.php:456
+#: usr/local/www/firewall_aliases_edit.php:604
+#: usr/local/www/firewall_aliases_edit.php:614
+#: usr/local/www/firewall_aliases_edit.php:459
+#: usr/local/www/firewall_aliases_edit.php:609
+#: usr/local/www/firewall_aliases_edit.php:619
+#: usr/local/www/firewall_aliases_edit.php:461
+#: usr/local/www/firewall_aliases_edit.php:612
+#: usr/local/www/firewall_aliases_edit.php:622
+#: usr/local/www/firewall_aliases_edit.php:483
+#: usr/local/www/firewall_aliases_edit.php:643
+#: usr/local/www/firewall_aliases_edit.php:653
+#: usr/local/www/firewall_aliases_edit.php:469
+#: usr/local/www/firewall_aliases_edit.php:629
+#: usr/local/www/firewall_aliases_edit.php:639
+msgid "Host(s)"
+msgstr "ホスト(単数または複数)"
+
+#: usr/local/www/firewall_aliases_edit.php:457
+#: usr/local/www/diag_states_summary.php:150
+#: usr/local/www/services_dnsmasq.php:245
+#: usr/local/www/services_dnsmasq.php:312 usr/local/www/vpn_pppoe_edit.php:538
+#: usr/local/www/services_dnsmasq.php:333
+#: usr/local/www/services_unbound.php:281
+#: usr/local/www/services_unbound.php:348
+#: usr/local/www/firewall_aliases_edit.php:460
+#: usr/local/www/diag_states_summary.php:139
+#: usr/local/www/vpn_pppoe_edit.php:539 usr/local/www/services_dnsmasq.php:246
+#: usr/local/www/services_dnsmasq.php:334
+#: usr/local/www/firewall_aliases_edit.php:462
+#: usr/local/www/firewall_aliases.php:176
+#: usr/local/www/diag_states_summary.php:141
+#: usr/local/www/vpn_pppoe_edit.php:542 usr/local/www/services_dnsmasq.php:271
+#: usr/local/www/services_dnsmasq.php:359
+#: usr/local/www/firewall_aliases.php:174
+#: usr/local/www/firewall_aliases_edit.php:484
+#: usr/local/www/services_dnsmasq.php:284
+#: usr/local/www/services_dnsmasq.php:372
+#: usr/local/www/services_dnsmasq.php:348
+#: usr/local/www/services_dnsmasq.php:436
+#: usr/local/www/diag_states_summary.php:141
+#: usr/local/www/firewall_aliases.php:174 usr/local/www/vpn_pppoe_edit.php:542
+#: usr/local/www/firewall_aliases_edit.php:470
+#: usr/local/www/services_dnsmasq.php:348
+#: usr/local/www/services_dnsmasq.php:436
+msgid "IP"
+msgstr "IP"
+
+#: usr/local/www/firewall_aliases_edit.php:458
+#: usr/local/www/firewall_aliases_edit.php:606
+#: usr/local/www/firewall_aliases_edit.php:461
+#: usr/local/www/firewall_aliases_edit.php:611
+#: usr/local/www/firewall_aliases_edit.php:463
+#: usr/local/www/firewall_aliases_edit.php:614
+#: usr/local/www/firewall_aliases_edit.php:485
+#: usr/local/www/firewall_aliases_edit.php:645
+#: usr/local/www/firewall_aliases_edit.php:471
+#: usr/local/www/firewall_aliases_edit.php:631
+msgid "Port(s)"
+msgstr "ポート(複数可)"
+
+#: usr/local/www/firewall_aliases_edit.php:460
+#: usr/local/www/firewall_aliases_edit.php:608
+#: usr/local/www/services_dhcp.php:807 usr/local/www/services_dhcpv6.php:733
+#: usr/local/www/firewall_aliases_edit.php:463
+#: usr/local/www/firewall_aliases_edit.php:613
+#: usr/local/www/services_dhcp.php:845 usr/local/www/services_dhcpv6.php:828
+#: usr/local/www/firewall_aliases_edit.php:465
+#: usr/local/www/firewall_aliases_edit.php:616
+#: usr/local/www/services_dhcp.php:1042 usr/local/www/services_dhcpv6.php:759
+#: usr/local/www/services_dhcp.php:1055 usr/local/www/services_dhcpv6.php:776
+#: usr/local/www/services_dhcp.php:1075
+#: usr/local/www/firewall_aliases_edit.php:487
+#: usr/local/www/firewall_aliases_edit.php:647
+#: usr/local/www/services_dhcp.php:1075 usr/local/www/services_dhcpv6.php:776
+#: usr/local/www/firewall_aliases_edit.php:473
+#: usr/local/www/firewall_aliases_edit.php:633
+msgid "URL"
+msgstr "URLは"
+
+#: usr/local/www/firewall_aliases_edit.php:461
+#: usr/local/www/firewall_aliases_edit.php:609
+#: usr/local/www/firewall_aliases_edit.php:464
+#: usr/local/www/firewall_aliases_edit.php:614
+#: usr/local/www/firewall_aliases_edit.php:466
+#: usr/local/www/firewall_aliases_edit.php:617
+#: usr/local/www/firewall_aliases_edit.php:488
+#: usr/local/www/firewall_aliases_edit.php:648
+#: usr/local/www/firewall_aliases_edit.php:474
+#: usr/local/www/firewall_aliases_edit.php:634
+msgid "URL Table"
+msgstr "URLテーブル"
+
+#: usr/local/www/firewall_aliases_edit.php:462
+#: usr/local/www/firewall_aliases_edit.php:465
+#: usr/local/www/firewall_aliases_edit.php:467
+#: usr/local/www/firewall_aliases_edit.php:489
+#: usr/local/www/firewall_aliases_edit.php:475
+msgid "Update Freq."
+msgstr "周波数を更新します。"
+
+#: usr/local/www/firewall_aliases_edit.php:464
+#: usr/local/www/firewall_aliases_edit.php:467
+#: usr/local/www/firewall_aliases_edit.php:469
+#: usr/local/www/firewall_aliases_edit.php:491
+#: usr/local/www/firewall_aliases_edit.php:477
+msgid ""
+"Networks are specified in CIDR format. Select the CIDR mask that pertains "
+"to each entry. /32 specifies a single IPv4 host, /128 specifies a single "
+"IPv6 host, /24 specifies 255.255.255.0, /64 specifies a normal IPv6 network, "
+"etc. Hostnames (FQDNs) may also be specified, using a /32 mask for IPv4 "
+"or /128 for IPv6. You may also enter an IP range such as "
+"192.168.1.1-192.168.1.254 and a list of CIDR networks will be derived to "
+"fill the range."
+msgstr "「ネットワークはCIDR形式で指定されています。関連するCIDRマスク選択」の各エントリには。 / 32は、単一のIPv4ホストを指定し、 / 128など」 、通常のIPv6ネットワークを指定したIPv6ホスト、 255.255.255.0 、 / 64 / 24指定"シングルを指定ホスト名( FQDNの)もIPv4の/ 32マスクを用いて、指定することが192.168.1.254の「 IPv6のか/ 128 。また、のようなIPアドレスの範囲を入力すること」とCIDRネットワークのリストは、派生されます「範囲を入力します。"
+
+#: usr/local/www/firewall_aliases_edit.php:465
+msgid ""
+"Enter as many hosts as you would like. Hosts must be specified by their IP "
+"address."
+msgstr "「あなたが望んでいるほど多くのホストを入力します。ホストがIPアドレスで指定する必要があります」のアドレス。"
+
+#: usr/local/www/firewall_aliases_edit.php:466
+#: usr/local/www/firewall_aliases_edit.php:469
+#: usr/local/www/firewall_aliases_edit.php:471
+#: usr/local/www/firewall_aliases_edit.php:493
+#: usr/local/www/firewall_aliases_edit.php:479
+msgid ""
+"Enter as many ports as you wish. Port ranges can be expressed by seperating "
+"with a colon."
+msgstr "コロンで"あなたは。ポート範囲がseperatingで表すことができることを願うと同数のポートを入力してください」 。"
+
+#: usr/local/www/firewall_aliases_edit.php:467
+#: usr/local/www/firewall_aliases_edit.php:470
+#: usr/local/www/firewall_aliases_edit.php:472
+#: usr/local/www/firewall_aliases_edit.php:494
+#: usr/local/www/firewall_aliases_edit.php:480
+#, php-format
+msgid ""
+"Enter as many URLs as you wish. After saving %s will download the URL and "
+"import the items into the alias. Use only with small sets of IP addresses "
+"(less than 3000)."
+msgstr "「あなたが望む限り多くのURLを入力してください。保存した後%sするURLをダウンロードし、 「エイリアスにアイテムをインポートします。 IPアドレスの小さなセット」 ( 3000未満)でのみ使用してください。"
+
+#: usr/local/www/firewall_aliases_edit.php:468
+#: usr/local/www/firewall_aliases_edit.php:471
+#: usr/local/www/firewall_aliases_edit.php:473
+#: usr/local/www/firewall_aliases_edit.php:495
+#: usr/local/www/firewall_aliases_edit.php:481
+#, php-format
+msgid ""
+"Enter a single URL containing a large number of IPs and/or Subnets. After "
+"saving %s will download the URL and create a table file containing these "
+"addresses. This will work with large numbers of addresses (30,000+) or small "
+"numbers."
+msgstr "%sを保存すると、URLをダウンロードし、これらを含むテーブルファイルが作成されます"の後にIPアドレス、および/またはサブネットの多数を含む単一のURLを入力してください。""アドレスは、これはアドレスの多数の(30,000 )で作業したり、小さなでしょう」数字。"
+
+#: usr/local/www/firewall_aliases_edit.php:471
+#: usr/local/www/firewall_aliases_edit.php:607
+#: usr/local/www/firewall_aliases_edit.php:474
+#: usr/local/www/firewall_aliases_edit.php:612
+#: usr/local/www/firewall_aliases_edit.php:476
+#: usr/local/www/firewall_aliases_edit.php:615
+#: usr/local/www/firewall_aliases_edit.php:498
+#: usr/local/www/firewall_aliases_edit.php:646
+#: usr/local/www/firewall_aliases_edit.php:484
+#: usr/local/www/firewall_aliases_edit.php:632
+msgid "OpenVPN Users"
+msgstr "OpenVPNのユーザー"
+
+#: usr/local/www/firewall_aliases_edit.php:472
+#: usr/local/www/firewall_aliases_edit.php:475
+#: usr/local/www/firewall_aliases_edit.php:477
+#: usr/local/www/firewall_aliases_edit.php:499
+#: usr/local/www/firewall_aliases_edit.php:485
+msgid "Enter as many usernames as you wish."
+msgstr "あなたが望む限り多くのユーザ名を入力してください。"
+
+#: usr/local/www/firewall_aliases_edit.php:573
+#: usr/local/www/firewall_aliases_edit.php:578
+#: usr/local/www/firewall_aliases_edit.php:581
+#: usr/local/www/firewall_aliases_edit.php:612
+#: usr/local/www/firewall_aliases_edit.php:598
+msgid "Alias Edit"
+msgstr "エイリアスを編集"
+
+#: usr/local/www/firewall_aliases_edit.php:620
+#: usr/local/www/firewall_aliases_edit.php:625
+#: usr/local/www/firewall_aliases_edit.php:628
+#: usr/local/www/firewall_aliases_edit.php:659
+#: usr/local/www/firewall_aliases_edit.php:645
+msgid "Item information"
+msgstr "アイテム情報"
+
+#: usr/local/www/firewall_aliases_edit.php:665
+#: usr/local/www/services_dnsmasq_edit.php:260
+#: usr/local/www/system_certmanager.php:782
+#: usr/local/www/firewall_aliases_edit.php:670
+#: usr/local/www/services_dnsmasq_edit.php:261
+#: usr/local/www/services_router_advertisements.php:343
+#: usr/local/www/firewall_aliases_edit.php:673
+#: usr/local/www/system_certmanager.php:807
+#: usr/local/www/services_router_advertisements.php:338
+#: usr/local/www/system_certmanager.php:808
+#: usr/local/www/firewall_aliases_edit.php:704
+#: usr/local/www/services_router_advertisements.php:338
+#: usr/local/www/system_certmanager.php:808
+#: usr/local/www/firewall_aliases_edit.php:690
+#: usr/local/www/services_dnsmasq_edit.php:261
+msgid "remove this entry"
+msgstr "このエントリを削除する"
+
+#: usr/local/www/firewall_nat_1to1.php:78
+#: usr/local/www/firewall_nat_1to1_edit.php:216
+#: usr/local/www/firewall_nat_edit.php:438
+#: usr/local/www/firewall_nat_out.php:283
+#: usr/local/www/firewall_nat_out_edit.php:300
+#: usr/local/www/diag_backup.php:111 usr/local/www/firewall_virtual_ip.php:242
+#: usr/local/www/firewall_nat.php:160 usr/local/www/fbegin.inc:111
+#: usr/local/www/firewall_nat_npt.php:78
+#: usr/local/www/firewall_nat_npt_edit.php:140 usr/local/www/fbegin.inc:128
+#: usr/local/www/firewall_nat_out.php:293
+#: usr/local/www/firewall_nat_1to1_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:145
+#: usr/local/www/firewall_nat_out_edit.php:313
+#: usr/local/www/diag_backup.php:188 usr/local/www/firewall_nat_edit.php:445
+#: usr/local/www/fbegin.inc:137 usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+#: usr/local/www/firewall_nat_npt_edit.php:144
+#: usr/local/www/firewall_nat.php:165 usr/local/www/firewall_nat_edit.php:444
+#: usr/local/www/firewall_virtual_ip.php:248
+#: usr/local/www/firewall_virtual_ip.php:268
+#: usr/local/www/firewall_nat_edit.php:439 usr/local/www/fbegin.inc:129
+#: usr/local/www/firewall_nat_out_edit.php:317
+#: usr/local/www/firewall_nat_edit.php:451
+#: usr/local/www/firewall_nat_out.php:301
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/firewall_virtual_ip.php:291
+#: usr/local/www/firewall_nat_edit.php:452 usr/local/www/firewall_nat.php:166
+#: usr/local/www/firewall_virtual_ip.php:291
+#: usr/local/www/firewall_nat_edit.php:452 usr/local/www/firewall_nat.php:166
+#: usr/local/www/firewall_nat_out.php:301
+#: usr/local/www/firewall_nat_npt.php:78
+#: usr/local/www/firewall_nat_1to1.php:78
+#: usr/local/www/firewall_nat_npt_edit.php:144
+#: usr/local/www/diag_backup.php:188
+#: usr/local/www/firewall_nat_1to1_edit.php:221 usr/local/www/fbegin.inc:129
+#: usr/local/www/firewall_nat_out_edit.php:329
+msgid "NAT"
+msgstr "NAT"
+
+#: usr/local/www/firewall_nat_1to1.php:78
+#: usr/local/www/firewall_nat_1to1.php:93
+#: usr/local/www/firewall_nat_1to1_edit.php:216
+#: usr/local/www/firewall_nat_out.php:300 usr/local/www/firewall_nat.php:182
+#: usr/local/www/firewall_nat_npt.php:93
+#: usr/local/www/firewall_nat_out.php:310
+#: usr/local/www/firewall_nat_1to1_edit.php:223
+#: usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+#: usr/local/www/firewall_nat.php:187 usr/local/www/firewall_nat_out.php:318
+#: usr/local/www/firewall_nat.php:190 usr/local/www/firewall_nat_out.php:317
+#: usr/local/www/firewall_nat.php:190 usr/local/www/firewall_nat_out.php:317
+#: usr/local/www/firewall_nat_npt.php:93
+#: usr/local/www/firewall_nat_1to1.php:78
+#: usr/local/www/firewall_nat_1to1.php:93
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+msgid "1:1"
+msgstr "午前1時01分"
+
+#: usr/local/www/firewall_nat_1to1.php:87 usr/local/www/firewall_nat.php:175
+#: usr/local/www/firewall_nat_npt.php:87 usr/local/www/firewall_nat.php:180
+#: usr/local/www/firewall_nat.php:183 usr/local/www/firewall_nat.php:183
+#: usr/local/www/firewall_nat_npt.php:87
+#: usr/local/www/firewall_nat_1to1.php:87
+msgid "The NAT configuration has been changed"
+msgstr "NAT設定が変更されました"
+
+#: usr/local/www/firewall_nat_1to1.php:92
+#: usr/local/www/firewall_nat_edit.php:438
+#: usr/local/www/firewall_nat_out.php:299 usr/local/www/firewall_nat.php:160
+#: usr/local/www/firewall_nat.php:181 usr/local/www/firewall_nat_npt.php:92
+#: usr/local/www/firewall_nat_out.php:309
+#: usr/local/www/firewall_nat_edit.php:445
+#: usr/local/www/firewall_nat_out.php:310 usr/local/www/firewall_nat.php:165
+#: usr/local/www/firewall_nat.php:186 usr/local/www/firewall_nat_edit.php:444
+#: usr/local/www/firewall_nat_edit.php:439
+#: usr/local/www/firewall_nat_edit.php:451
+#: usr/local/www/firewall_nat_out.php:317
+#: usr/local/www/firewall_nat_edit.php:452 usr/local/www/firewall_nat.php:166
+#: usr/local/www/firewall_nat.php:189 usr/local/www/firewall_nat_out.php:316
+#: usr/local/www/firewall_nat_edit.php:452 usr/local/www/firewall_nat.php:166
+#: usr/local/www/firewall_nat.php:189 usr/local/www/firewall_nat_out.php:316
+#: usr/local/www/firewall_nat_npt.php:92
+#: usr/local/www/firewall_nat_1to1.php:92
+msgid "Port Forward"
+msgstr "ポートフォワード"
+
+#: usr/local/www/firewall_nat_1to1.php:94
+#: usr/local/www/firewall_nat_out.php:283
+#: usr/local/www/firewall_nat_out.php:301
+#: usr/local/www/firewall_nat_out_edit.php:300
+#: usr/local/www/firewall_nat.php:183 usr/local/www/firewall_nat_npt.php:94
+#: usr/local/www/firewall_nat_out.php:293
+#: usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/firewall_nat_out_edit.php:313
+#: usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_nat_out.php:312 usr/local/www/firewall_nat.php:188
+#: usr/local/www/firewall_nat_out_edit.php:317
+#: usr/local/www/firewall_nat_out.php:319
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/firewall_nat.php:191 usr/local/www/firewall_nat_out.php:318
+#: usr/local/www/firewall_nat.php:191 usr/local/www/firewall_nat_out.php:301
+#: usr/local/www/firewall_nat_out.php:318
+#: usr/local/www/firewall_nat_npt.php:94
+#: usr/local/www/firewall_nat_1to1.php:94
+#: usr/local/www/firewall_nat_out_edit.php:329
+msgid "Outbound"
+msgstr "外国行きの"
+
+#: usr/local/www/firewall_nat_1to1.php:95
+#: usr/local/www/firewall_nat_out.php:302 usr/local/www/firewall_nat.php:184
+#: usr/local/www/firewall_nat_npt.php:78 usr/local/www/firewall_nat_npt.php:95
+#: usr/local/www/firewall_nat_npt_edit.php:140
+#: usr/local/www/firewall_nat_out.php:312
+#: usr/local/www/firewall_nat_npt_edit.php:145
+#: usr/local/www/firewall_nat_out.php:313
+#: usr/local/www/firewall_nat_npt_edit.php:144
+#: usr/local/www/firewall_nat.php:189 usr/local/www/firewall_nat_out.php:320
+#: usr/local/www/firewall_nat.php:192 usr/local/www/firewall_nat_out.php:319
+#: usr/local/www/firewall_nat.php:192 usr/local/www/firewall_nat_out.php:319
+#: usr/local/www/firewall_nat_npt.php:78 usr/local/www/firewall_nat_npt.php:95
+#: usr/local/www/firewall_nat_1to1.php:95
+#: usr/local/www/firewall_nat_npt_edit.php:144
+msgid "NPt"
+msgstr "NPT"
+
+#: usr/local/www/firewall_nat_1to1.php:105
+#: usr/local/www/firewall_nat_1to1.php:105
+msgid "External IP"
+msgstr "外部IP"
+
+#: usr/local/www/firewall_nat_1to1.php:106
+#: usr/local/www/firewall_nat_1to1_edit.php:328
+#: usr/local/www/status_upnp.php:87
+#: usr/local/www/firewall_nat_1to1_edit.php:335
+#: usr/local/www/firewall_nat_1to1_edit.php:333
+#: usr/local/www/status_upnp.php:88
+#: usr/local/www/firewall_nat_1to1_edit.php:334
+#: usr/local/www/firewall_nat_1to1.php:106
+#: usr/local/www/firewall_nat_1to1_edit.php:334
+#: usr/local/www/status_upnp.php:88
+msgid "Internal IP"
+msgstr "内部IP"
+
+#: usr/local/www/firewall_nat_1to1.php:107
+#: usr/local/www/firewall_nat_1to1.php:107
+msgid "Destination IP"
+msgstr "宛先IP"
+
+#: usr/local/www/firewall_nat_1to1.php:113
+#: usr/local/www/firewall_nat_1to1.php:172
+#: usr/local/www/firewall_nat_npt.php:112
+#: usr/local/www/firewall_nat_npt.php:170
+#: usr/local/www/firewall_nat_npt.php:112
+#: usr/local/www/firewall_nat_npt.php:170
+#: usr/local/www/firewall_nat_1to1.php:113
+#: usr/local/www/firewall_nat_1to1.php:172
+msgid "add rule"
+msgstr "ルールを追加"
+
+#: usr/local/www/firewall_nat_1to1.php:159
+#: usr/local/www/firewall_rules.php:436 usr/local/www/firewall_rules.php:465
+#: usr/local/www/firewall_rules.php:493 usr/local/www/firewall_rules.php:776
+#: usr/local/www/firewall_nat.php:310 usr/local/www/firewall_nat_npt.php:157
+#: usr/local/www/firewall_rules.php:430 usr/local/www/firewall_rules.php:459
+#: usr/local/www/firewall_rules.php:487 usr/local/www/firewall_rules.php:773
+#: usr/local/www/firewall_nat.php:323 usr/local/www/firewall_rules.php:423
+#: usr/local/www/firewall_rules.php:452 usr/local/www/firewall_rules.php:480
+#: usr/local/www/firewall_rules.php:766 usr/local/www/firewall_rules.php:422
+#: usr/local/www/firewall_rules.php:451 usr/local/www/firewall_rules.php:479
+#: usr/local/www/firewall_nat.php:326 usr/local/www/firewall_nat.php:326
+#: usr/local/www/firewall_rules.php:422 usr/local/www/firewall_rules.php:451
+#: usr/local/www/firewall_rules.php:479 usr/local/www/firewall_rules.php:766
+#: usr/local/www/firewall_nat_npt.php:157
+#: usr/local/www/firewall_nat_1to1.php:159
+msgid "edit rule"
+msgstr "編集規則"
+
+#: usr/local/www/firewall_nat_1to1.php:160 usr/local/www/services_dhcp.php:923
+#: usr/local/www/firewall_nat_npt.php:158
+#: usr/local/www/services_dhcpv6.php:836 usr/local/www/services_dhcp.php:961
+#: usr/local/www/services_dhcpv6.php:931 usr/local/www/services_dhcp.php:1165
+#: usr/local/www/services_dhcpv6.php:862 usr/local/www/services_dhcp.php:1189
+#: usr/local/www/services_dhcpv6.php:883 usr/local/www/services_dhcp.php:1209
+#: usr/local/www/services_dhcp.php:1209 usr/local/www/services_dhcpv6.php:883
+#: usr/local/www/firewall_nat_npt.php:158
+#: usr/local/www/firewall_nat_1to1.php:160
+msgid "Do you really want to delete this mapping?"
+msgstr "あなたは本当に、このマッピングを削除しますか?"
+
+#: usr/local/www/firewall_nat_1to1.php:160
+#: usr/local/www/firewall_rules.php:779 usr/local/www/firewall_nat.php:313
+#: usr/local/www/firewall_nat_npt.php:158
+#: usr/local/www/firewall_nat_out.php:450 usr/local/www/firewall_rules.php:776
+#: usr/local/www/firewall_nat_out.php:451 usr/local/www/firewall_nat.php:326
+#: usr/local/www/firewall_rules.php:769 usr/local/www/firewall_nat_out.php:448
+#: usr/local/www/firewall_nat_out.php:455 usr/local/www/firewall_nat.php:329
+#: usr/local/www/firewall_nat_out.php:454 usr/local/www/firewall_nat.php:329
+#: usr/local/www/firewall_nat_out.php:454 usr/local/www/firewall_rules.php:769
+#: usr/local/www/firewall_nat_npt.php:158
+#: usr/local/www/firewall_nat_1to1.php:160
+msgid "delete rule"
+msgstr "ルールを削除する"
+
+#: usr/local/www/firewall_nat_1to1.php:180
+#: usr/local/www/firewall_nat_1to1.php:180
+msgid "Depending on the way your WAN connection is setup, you may also need a"
+msgstr "あなたのWAN接続がセットアップされている方法に応じて、また必要な場合があります"
+
+#: usr/local/www/firewall_nat_1to1.php:180
+#: usr/local/www/firewall_nat_1to1.php:180
+msgid "Virtual IP."
+msgstr "仮想IP 。"
+
+#: usr/local/www/firewall_nat_1to1.php:181
+#: usr/local/www/firewall_nat_1to1.php:181
+msgid ""
+"If you add a 1:1 NAT entry for any of the interface IPs on this system, it "
+"will make this system inaccessible on that IP address. i.e. if you use your "
+"WAN IP address, any services on this system (IPsec, OpenVPN server, etc.) "
+"using the WAN IP address will no longer function."
+msgstr "「このシステムのインターフェイスIPのいずれかの1:1のNATエントリを追加する場合は、 「そのIPアドレスに、このシステムにアクセスできなくなります。つまり、あなたの使用している場合は、「 WAN IPアドレスを、このシステム( IPsecの、 OpenVPNのサーバなど)上の任意のサービス「WAN IPアドレスを使用して機能しなくなります。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:109
+#: usr/local/www/firewall_nat_out_edit.php:125
+#: usr/local/www/firewall_nat_out_edit.php:129
+#: usr/local/www/firewall_nat_out_edit.php:135
+#: usr/local/www/firewall_nat_1to1_edit.php:109
+#: usr/local/www/firewall_nat_out_edit.php:135
+#, php-format
+msgid ""
+"Invalid characters detected (%s). Please remove invalid characters and save "
+"again."
+msgstr "「無効な文字が( %s )を検出しました。無効な文字を削除してくださいして保存」を再び。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:114
+#: usr/local/www/firewall_nat_1to1_edit.php:114
+msgid "External subnet"
+msgstr "外部サブネット"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:117
+#: usr/local/www/firewall_nat_edit.php:190
+#: usr/local/www/firewall_nat_edit.php:195
+#: usr/local/www/firewall_nat_edit.php:200
+#: usr/local/www/firewall_nat_edit.php:200
+#: usr/local/www/firewall_nat_1to1_edit.php:117
+msgid "Source address"
+msgstr "送信元アドレス"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:121
+#: usr/local/www/firewall_nat_edit.php:194
+#: usr/local/www/firewall_nat_edit.php:199
+#: usr/local/www/firewall_nat_edit.php:204
+#: usr/local/www/firewall_nat_edit.php:204
+#: usr/local/www/firewall_nat_1to1_edit.php:121
+msgid "Destination address"
+msgstr "宛先アドレス"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:145
+#: usr/local/www/firewall_nat_1to1_edit.php:152
+#: usr/local/www/firewall_nat_1to1_edit.php:152
+msgid "A valid external subnet must be specified."
+msgstr "有効な外部のサブネットを指定する必要があります。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:149
+#: usr/local/www/firewall_nat_edit.php:232
+#: usr/local/www/firewall_rules_edit.php:356
+#: usr/local/www/firewall_rules_edit.php:360
+#: usr/local/www/firewall_nat_1to1_edit.php:156
+#: usr/local/www/firewall_rules_edit.php:385
+#: usr/local/www/firewall_rules_edit.php:389
+#: usr/local/www/firewall_nat_edit.php:239
+#: usr/local/www/firewall_rules_edit.php:384
+#: usr/local/www/firewall_rules_edit.php:388
+#: usr/local/www/firewall_rules_edit.php:387
+#: usr/local/www/firewall_rules_edit.php:391
+#: usr/local/www/firewall_nat_edit.php:244
+#: usr/local/www/firewall_rules_edit.php:393
+#: usr/local/www/firewall_rules_edit.php:397
+#: usr/local/www/firewall_nat_edit.php:249
+#: usr/local/www/firewall_rules_edit.php:393
+#: usr/local/www/firewall_rules_edit.php:397
+#: usr/local/www/firewall_nat_edit.php:249
+#: usr/local/www/firewall_nat_1to1_edit.php:156
+msgid "You must specify single host or alias for alias entries."
+msgstr "エイリアスエントリの単一のホストまたはエイリアスを指定する必要があります。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:154
+#: usr/local/www/firewall_nat_1to1_edit.php:161
+#: usr/local/www/firewall_nat_1to1_edit.php:161
+#, php-format
+msgid "%s is not a valid internal IP address."
+msgstr "%sは、有効な内部IPアドレスではありません。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:157
+#: usr/local/www/firewall_nat_1to1_edit.php:164
+#: usr/local/www/firewall_nat_1to1_edit.php:164
+msgid "A valid internal bit count must be specified."
+msgstr "有効な内部ビット数を指定する必要があります。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:164
+#: usr/local/www/firewall_nat_edit.php:245
+#: usr/local/www/firewall_rules_edit.php:373
+#: usr/local/www/firewall_nat_1to1_edit.php:171
+#: usr/local/www/firewall_rules_edit.php:402
+#: usr/local/www/firewall_nat_edit.php:252
+#: usr/local/www/firewall_rules_edit.php:401
+#: usr/local/www/firewall_rules_edit.php:404
+#: usr/local/www/firewall_nat_edit.php:257
+#: usr/local/www/firewall_rules_edit.php:410
+#: usr/local/www/firewall_nat_edit.php:262
+#: usr/local/www/firewall_rules_edit.php:410
+#: usr/local/www/firewall_nat_edit.php:262
+#: usr/local/www/firewall_nat_1to1_edit.php:171
+#, php-format
+msgid "%s is not a valid destination IP address or alias."
+msgstr "%sは有効な宛先IPアドレスまたはエイリアスではありません。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:167
+#: usr/local/www/firewall_nat_edit.php:248
+#: usr/local/www/firewall_nat_out_edit.php:159
+#: usr/local/www/firewall_rules_edit.php:376
+#: usr/local/www/firewall_nat_1to1_edit.php:174
+#: usr/local/www/firewall_nat_out_edit.php:172
+#: usr/local/www/firewall_rules_edit.php:405
+#: usr/local/www/firewall_nat_edit.php:255
+#: usr/local/www/firewall_rules_edit.php:404
+#: usr/local/www/firewall_rules_edit.php:407
+#: usr/local/www/firewall_nat_edit.php:260
+#: usr/local/www/firewall_nat_out_edit.php:176
+#: usr/local/www/firewall_rules_edit.php:413
+#: usr/local/www/firewall_nat_edit.php:265
+#: usr/local/www/firewall_nat_out_edit.php:182
+#: usr/local/www/firewall_rules_edit.php:413
+#: usr/local/www/firewall_nat_edit.php:265
+#: usr/local/www/firewall_nat_1to1_edit.php:174
+#: usr/local/www/firewall_nat_out_edit.php:182
+msgid "A valid destination bit count must be specified."
+msgstr "有効な宛先ビット数を指定する必要があります。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:270
+#: usr/local/www/firewall_nat_1to1_edit.php:277
+#: usr/local/www/firewall_nat_1to1_edit.php:275
+#: usr/local/www/firewall_nat_1to1_edit.php:275
+msgid "Edit NAT 1:1 entry"
+msgstr "編集NATの午前1時01分エントリー"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:273
+#: usr/local/www/firewall_nat_edit.php:460
+#: usr/local/www/firewall_rules_edit.php:679 usr/local/www/interfaces.php:1828
+#: usr/local/www/interfaces_ppps_edit.php:603
+#: usr/local/www/system_usermanager.php:469
+#: usr/local/www/system_usermanager.php:789
+#: usr/local/www/vpn_ipsec_phase1.php:512
+#: usr/local/www/vpn_ipsec_phase2.php:393
+#: usr/local/www/vpn_openvpn_client.php:386
+#: usr/local/www/vpn_openvpn_client.php:860
+#: usr/local/www/vpn_openvpn_csc.php:314 usr/local/www/vpn_openvpn_csc.php:672
+#: usr/local/www/vpn_openvpn_server.php:604
+#: usr/local/www/vpn_openvpn_server.php:1448
+#: usr/local/www/firewall_nat_npt_edit.php:159
+#: usr/local/www/system_routes_edit.php:299
+#: usr/local/www/firewall_nat_1to1_edit.php:280
+#: usr/local/www/firewall_nat_npt_edit.php:164
+#: usr/local/www/firewall_rules_edit.php:712
+#: usr/local/www/system_usermanager.php:467
+#: usr/local/www/system_usermanager.php:787
+#: usr/local/www/vpn_openvpn_server.php:677
+#: usr/local/www/vpn_openvpn_server.php:1590
+#: usr/local/www/vpn_ipsec_phase2.php:419
+#: usr/local/www/firewall_nat_edit.php:467 usr/local/www/interfaces.php:2006
+#: usr/local/www/vpn_openvpn_client.php:391
+#: usr/local/www/vpn_openvpn_client.php:865
+#: usr/local/www/system_routes_edit.php:300
+#: usr/local/www/firewall_nat_1to1_edit.php:278
+#: usr/local/www/firewall_nat_npt_edit.php:163
+#: usr/local/www/system_usermanager.php:788
+#: usr/local/www/interfaces_ppps_edit.php:604
+#: usr/local/www/vpn_openvpn_csc.php:313 usr/local/www/vpn_openvpn_csc.php:671
+#: usr/local/www/vpn_openvpn_server.php:695
+#: usr/local/www/vpn_openvpn_server.php:1631
+#: usr/local/www/vpn_ipsec_phase2.php:485
+#: usr/local/www/firewall_nat_edit.php:466 usr/local/www/interfaces.php:1994
+#: usr/local/www/vpn_openvpn_client.php:399
+#: usr/local/www/vpn_openvpn_client.php:918
+#: usr/local/www/vpn_ipsec_phase1.php:511
+#: usr/local/www/vpn_openvpn_client.php:417
+#: usr/local/www/vpn_openvpn_client.php:937
+#: usr/local/www/firewall_rules_edit.php:715
+#: usr/local/www/interfaces_ppps_edit.php:610
+#: usr/local/www/firewall_nat_edit.php:461
+#: usr/local/www/vpn_ipsec_phase1.php:532
+#: usr/local/www/vpn_openvpn_server.php:721
+#: usr/local/www/vpn_openvpn_server.php:1683
+#: usr/local/www/vpn_ipsec_phase2.php:507 usr/local/www/interfaces.php:2021
+#: usr/local/www/firewall_rules_edit.php:727
+#: usr/local/www/firewall_nat_edit.php:473
+#: usr/local/www/system_routes_edit.php:323 usr/local/www/interfaces.php:2067
+#: etc/inc/service-utils.inc:437 usr/local/www/interfaces_ppps_edit.php:608
+#: usr/local/www/firewall_nat_edit.php:474
+#: usr/local/www/system_routes_edit.php:332
+#: usr/local/www/firewall_nat_npt_edit.php:161
+#: usr/local/www/interfaces.php:2056 etc/inc/service-utils.inc:440
+#: usr/local/www/vpn_openvpn_client.php:417
+#: usr/local/www/vpn_openvpn_client.php:937
+#: usr/local/www/firewall_rules_edit.php:727
+#: usr/local/www/interfaces_ppps_edit.php:608
+#: usr/local/www/vpn_openvpn_csc.php:313 usr/local/www/vpn_openvpn_csc.php:671
+#: usr/local/www/firewall_nat_edit.php:474
+#: usr/local/www/system_routes_edit.php:326
+#: usr/local/www/firewall_nat_npt_edit.php:161
+#: usr/local/www/firewall_nat_1to1_edit.php:278
+#: usr/local/www/vpn_ipsec_phase1.php:532
+#: usr/local/www/system_usermanager.php:467
+#: usr/local/www/system_usermanager.php:788
+#: usr/local/www/vpn_openvpn_server.php:721
+#: usr/local/www/vpn_openvpn_server.php:1683
+#: usr/local/www/vpn_ipsec_phase2.php:507 usr/local/www/interfaces.php:2056
+#: etc/inc/service-utils.inc:440
+msgid "Disabled"
+msgstr "使用禁止"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:276
+#: usr/local/www/firewall_nat_edit.php:463
+#: usr/local/www/firewall_rules_edit.php:682
+#: usr/local/www/firewall_nat_npt_edit.php:162
+#: usr/local/www/firewall_nat_1to1_edit.php:283
+#: usr/local/www/firewall_nat_npt_edit.php:167
+#: usr/local/www/firewall_rules_edit.php:715
+#: usr/local/www/firewall_nat_edit.php:470
+#: usr/local/www/firewall_nat_1to1_edit.php:281
+#: usr/local/www/firewall_nat_npt_edit.php:166
+#: usr/local/www/firewall_nat_edit.php:469
+#: usr/local/www/firewall_rules_edit.php:718
+#: usr/local/www/firewall_nat_edit.php:464
+#: usr/local/www/firewall_rules_edit.php:730
+#: usr/local/www/firewall_nat_edit.php:476
+#: usr/local/www/firewall_nat_edit.php:477
+#: usr/local/www/firewall_nat_npt_edit.php:164
+#: usr/local/www/firewall_rules_edit.php:730
+#: usr/local/www/firewall_nat_edit.php:477
+#: usr/local/www/firewall_nat_npt_edit.php:164
+#: usr/local/www/firewall_nat_1to1_edit.php:281
+msgid "Disable this rule"
+msgstr "このルールを無効にする"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:277
+#: usr/local/www/firewall_nat_edit.php:464
+#: usr/local/www/firewall_rules_edit.php:683
+#: usr/local/www/firewall_nat_npt_edit.php:163
+#: usr/local/www/firewall_nat_1to1_edit.php:284
+#: usr/local/www/firewall_nat_npt_edit.php:168
+#: usr/local/www/firewall_rules_edit.php:716
+#: usr/local/www/firewall_nat_edit.php:471
+#: usr/local/www/firewall_nat_1to1_edit.php:282
+#: usr/local/www/firewall_nat_npt_edit.php:167
+#: usr/local/www/firewall_nat_edit.php:470
+#: usr/local/www/firewall_rules_edit.php:719
+#: usr/local/www/firewall_nat_edit.php:465
+#: usr/local/www/firewall_rules_edit.php:731
+#: usr/local/www/firewall_nat_edit.php:477
+#: usr/local/www/firewall_nat_edit.php:478
+#: usr/local/www/firewall_nat_npt_edit.php:165
+#: usr/local/www/firewall_rules_edit.php:731
+#: usr/local/www/firewall_nat_edit.php:478
+#: usr/local/www/firewall_nat_npt_edit.php:165
+#: usr/local/www/firewall_nat_1to1_edit.php:282
+msgid "Set this option to disable this rule without removing it from the list."
+msgstr "リストから削除せずに、このルールを無効にするには、このオプションを設定します。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:315
+#: usr/local/www/firewall_nat_npt_edit.php:202
+#: usr/local/www/firewall_nat_1to1_edit.php:322
+#: usr/local/www/firewall_nat_npt_edit.php:207
+#: usr/local/www/firewall_nat_1to1_edit.php:320
+#: usr/local/www/firewall_nat_npt_edit.php:206
+#: usr/local/www/firewall_nat_npt_edit.php:205
+#: usr/local/www/firewall_nat_1to1_edit.php:321
+#: usr/local/www/firewall_nat_npt_edit.php:205
+#: usr/local/www/firewall_nat_1to1_edit.php:321
+msgid "Choose which interface this rule applies to"
+msgstr "このルールが適用されるインターフェイスを選択します"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:316
+#: usr/local/www/firewall_nat_npt_edit.php:203
+#: usr/local/www/firewall_nat_1to1_edit.php:323
+#: usr/local/www/firewall_nat_npt_edit.php:208
+#: usr/local/www/firewall_nat_1to1_edit.php:321
+#: usr/local/www/firewall_nat_npt_edit.php:207
+#: usr/local/www/firewall_nat_npt_edit.php:206
+#: usr/local/www/firewall_nat_1to1_edit.php:322
+#: usr/local/www/firewall_nat_npt_edit.php:206
+#: usr/local/www/firewall_nat_1to1_edit.php:322
+msgid "Hint: in most cases, you'll want to use WAN here"
+msgstr "ヒント:ほとんどの場合、ここで、WANを使用したいと思う"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:319
+#: usr/local/www/firewall_nat_1to1_edit.php:326
+#: usr/local/www/firewall_nat_1to1_edit.php:324
+#: usr/local/www/firewall_nat_1to1_edit.php:325
+#: usr/local/www/firewall_nat_1to1_edit.php:325
+msgid "External subnet IP"
+msgstr "外部サブネットIP"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:323
+#: usr/local/www/firewall_nat_1to1_edit.php:330
+#: usr/local/www/firewall_nat_1to1_edit.php:328
+#: usr/local/www/firewall_nat_1to1_edit.php:329
+#: usr/local/www/firewall_nat_1to1_edit.php:329
+msgid ""
+"Enter the external (usually on a WAN) subnet's starting address for the 1:1 "
+"mapping. The subnet mask from the internal address below will be applied to "
+"this IP address."
+msgstr "マッピング「1:1のサブネットの開始アドレス(通常はWAN上)外部を入力してください "。以下に内部アドレスからサブネットマスクは、このIPアドレス "に適用される。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:324
+#: usr/local/www/firewall_nat_1to1_edit.php:331
+#: usr/local/www/firewall_nat_1to1_edit.php:329
+#: usr/local/www/firewall_nat_1to1_edit.php:330
+#: usr/local/www/firewall_nat_1to1_edit.php:330
+msgid ""
+"Hint: this is generally an address owned by the router itself on the "
+"selected interface."
+msgstr ""ヒント:これは一般的にルータ自身が所有するアドレスである「選択されたインタフェース。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:331
+#: usr/local/www/firewall_nat_1to1_edit.php:386
+#: usr/local/www/firewall_nat_edit.php:538
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_out_edit.php:501
+#: usr/local/www/firewall_rules_edit.php:858
+#: usr/local/www/firewall_rules_edit.php:951
+#: usr/local/www/firewall_nat_npt_edit.php:209
+#: usr/local/www/firewall_nat_npt_edit.php:237
+#: usr/local/www/firewall_nat_1to1_edit.php:338
+#: usr/local/www/firewall_nat_1to1_edit.php:393
+#: usr/local/www/firewall_nat_npt_edit.php:214
+#: usr/local/www/firewall_nat_npt_edit.php:242
+#: usr/local/www/firewall_nat_out_edit.php:514
+#: usr/local/www/firewall_rules_edit.php:893
+#: usr/local/www/firewall_rules_edit.php:986
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_1to1_edit.php:336
+#: usr/local/www/firewall_nat_1to1_edit.php:391
+#: usr/local/www/firewall_nat_npt_edit.php:213
+#: usr/local/www/firewall_nat_npt_edit.php:241
+#: usr/local/www/firewall_nat_edit.php:544
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_rules_edit.php:896
+#: usr/local/www/firewall_rules_edit.php:995
+#: usr/local/www/firewall_nat_edit.php:539
+#: usr/local/www/firewall_nat_edit.php:628
+#: usr/local/www/firewall_nat_out_edit.php:518
+#: usr/local/www/firewall_rules_edit.php:908
+#: usr/local/www/firewall_rules_edit.php:1008
+#: usr/local/www/firewall_nat_edit.php:551
+#: usr/local/www/firewall_nat_edit.php:640
+#: usr/local/www/firewall_nat_out_edit.php:530
+#: usr/local/www/firewall_rules_edit.php:907
+#: usr/local/www/firewall_rules_edit.php:1007
+#: usr/local/www/firewall_nat_edit.php:552
+#: usr/local/www/firewall_nat_edit.php:641
+#: usr/local/www/firewall_nat_npt_edit.php:212
+#: usr/local/www/firewall_nat_npt_edit.php:240
+#: usr/local/www/firewall_nat_1to1_edit.php:337
+#: usr/local/www/firewall_nat_1to1_edit.php:392
+#: usr/local/www/firewall_nat_out_edit.php:531
+#: usr/local/www/firewall_rules_edit.php:907
+#: usr/local/www/firewall_rules_edit.php:1007
+#: usr/local/www/firewall_nat_edit.php:552
+#: usr/local/www/firewall_nat_edit.php:641
+#: usr/local/www/firewall_nat_npt_edit.php:212
+#: usr/local/www/firewall_nat_npt_edit.php:240
+#: usr/local/www/firewall_nat_1to1_edit.php:337
+#: usr/local/www/firewall_nat_1to1_edit.php:392
+#: usr/local/www/firewall_nat_out_edit.php:531
+msgid "not"
+msgstr "しない"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:333
+#: usr/local/www/firewall_nat_1to1_edit.php:388
+#: usr/local/www/firewall_nat_edit.php:540
+#: usr/local/www/firewall_nat_edit.php:629
+#: usr/local/www/firewall_nat_out_edit.php:502
+#: usr/local/www/firewall_rules_edit.php:860
+#: usr/local/www/firewall_rules_edit.php:953
+#: usr/local/www/firewall_nat_npt_edit.php:211
+#: usr/local/www/firewall_nat_npt_edit.php:239
+#: usr/local/www/firewall_nat_1to1_edit.php:340
+#: usr/local/www/firewall_nat_1to1_edit.php:395
+#: usr/local/www/firewall_nat_npt_edit.php:216
+#: usr/local/www/firewall_nat_npt_edit.php:244
+#: usr/local/www/firewall_nat_out_edit.php:515
+#: usr/local/www/firewall_rules_edit.php:895
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_nat_edit.php:547
+#: usr/local/www/firewall_nat_edit.php:636
+#: usr/local/www/firewall_nat_1to1_edit.php:338
+#: usr/local/www/firewall_nat_1to1_edit.php:393
+#: usr/local/www/firewall_nat_npt_edit.php:215
+#: usr/local/www/firewall_nat_npt_edit.php:243
+#: usr/local/www/firewall_nat_edit.php:546
+#: usr/local/www/firewall_nat_edit.php:635
+#: usr/local/www/firewall_rules_edit.php:898
+#: usr/local/www/firewall_rules_edit.php:997
+#: usr/local/www/firewall_nat_edit.php:541
+#: usr/local/www/firewall_nat_edit.php:630
+#: usr/local/www/firewall_nat_out_edit.php:519
+#: usr/local/www/firewall_rules_edit.php:910
+#: usr/local/www/firewall_rules_edit.php:1010
+#: usr/local/www/firewall_nat_edit.php:553
+#: usr/local/www/firewall_nat_edit.php:642
+#: usr/local/www/firewall_nat_out_edit.php:531
+#: usr/local/www/firewall_rules_edit.php:909
+#: usr/local/www/firewall_rules_edit.php:1009
+#: usr/local/www/firewall_nat_edit.php:554
+#: usr/local/www/firewall_nat_edit.php:643
+#: usr/local/www/firewall_nat_npt_edit.php:214
+#: usr/local/www/firewall_nat_npt_edit.php:242
+#: usr/local/www/firewall_nat_1to1_edit.php:339
+#: usr/local/www/firewall_nat_1to1_edit.php:394
+#: usr/local/www/firewall_nat_out_edit.php:532
+#: usr/local/www/firewall_rules_edit.php:909
+#: usr/local/www/firewall_rules_edit.php:1009
+#: usr/local/www/firewall_nat_edit.php:554
+#: usr/local/www/firewall_nat_edit.php:643
+#: usr/local/www/firewall_nat_npt_edit.php:214
+#: usr/local/www/firewall_nat_npt_edit.php:242
+#: usr/local/www/firewall_nat_1to1_edit.php:339
+#: usr/local/www/firewall_nat_1to1_edit.php:394
+#: usr/local/www/firewall_nat_out_edit.php:532
+msgid "Use this option to invert the sense of the match."
+msgstr "マッチの意味を反転させるには、このオプションを使用します。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:343
+#: usr/local/www/firewall_nat_1to1_edit.php:398
+#: usr/local/www/firewall_nat_edit.php:550
+#: usr/local/www/firewall_nat_edit.php:597
+#: usr/local/www/firewall_nat_edit.php:610
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_nat_out_edit.php:475
+#: usr/local/www/firewall_nat_out_edit.php:509
+#: usr/local/www/firewall_nat_out_edit.php:569
+#: usr/local/www/firewall_rules.php:128
+#: usr/local/www/firewall_rules_edit.php:827
+#: usr/local/www/firewall_rules_edit.php:870
+#: usr/local/www/firewall_rules_edit.php:921
+#: usr/local/www/firewall_rules_edit.php:934
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:963
+#: usr/local/www/firewall_rules_edit.php:1013
+#: usr/local/www/firewall_rules_edit.php:1026
+#: usr/local/www/firewall_rules_edit.php:1090
+#: usr/local/www/services_captiveportal_ip.php:175
+#: usr/local/www/services_captiveportal_ip.php:182
+#: usr/local/www/services_captiveportal_hostname.php:176
+#: usr/local/www/services_captiveportal_hostname.php:183
+#: usr/local/www/firewall_nat_1to1_edit.php:350
+#: usr/local/www/firewall_nat_1to1_edit.php:405
+#: usr/local/www/firewall_nat_out_edit.php:488
+#: usr/local/www/firewall_nat_out_edit.php:522
+#: usr/local/www/firewall_nat_out_edit.php:582
+#: usr/local/www/firewall_rules_edit.php:862
+#: usr/local/www/firewall_rules_edit.php:905
+#: usr/local/www/firewall_rules_edit.php:956
+#: usr/local/www/firewall_rules_edit.php:969
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:998
+#: usr/local/www/firewall_rules_edit.php:1048
+#: usr/local/www/firewall_rules_edit.php:1061
+#: usr/local/www/firewall_rules_edit.php:1125
+#: usr/local/www/firewall_nat_edit.php:557
+#: usr/local/www/firewall_nat_edit.php:604
+#: usr/local/www/firewall_nat_edit.php:617
+#: usr/local/www/firewall_nat_edit.php:646
+#: usr/local/www/firewall_nat_1to1_edit.php:348
+#: usr/local/www/firewall_nat_1to1_edit.php:403
+#: usr/local/www/services_captiveportal_ip.php:173
+#: usr/local/www/services_captiveportal_ip.php:180
+#: usr/local/www/services_captiveportal_hostname.php:174
+#: usr/local/www/services_captiveportal_hostname.php:181
+#: usr/local/www/firewall_rules.php:126
+#: usr/local/www/firewall_nat_edit.php:556
+#: usr/local/www/firewall_nat_edit.php:603
+#: usr/local/www/firewall_nat_edit.php:616
+#: usr/local/www/firewall_nat_edit.php:645
+#: usr/local/www/firewall_rules_edit.php:865
+#: usr/local/www/firewall_rules_edit.php:908
+#: usr/local/www/firewall_rules_edit.php:965
+#: usr/local/www/firewall_rules_edit.php:978
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1007
+#: usr/local/www/firewall_rules_edit.php:1063
+#: usr/local/www/firewall_rules_edit.php:1076
+#: usr/local/www/firewall_rules_edit.php:1140
+#: usr/local/www/firewall_nat_edit.php:551
+#: usr/local/www/firewall_nat_edit.php:598
+#: usr/local/www/firewall_nat_edit.php:611
+#: usr/local/www/firewall_nat_edit.php:640
+#: usr/local/www/firewall_nat_out_edit.php:492
+#: usr/local/www/firewall_nat_out_edit.php:526
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules_edit.php:920
+#: usr/local/www/firewall_rules_edit.php:991
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1020
+#: usr/local/www/firewall_rules_edit.php:1089
+#: usr/local/www/firewall_rules_edit.php:1153
+#: usr/local/www/firewall_nat_edit.php:563
+#: usr/local/www/firewall_nat_edit.php:623
+#: usr/local/www/firewall_nat_edit.php:652
+#: usr/local/www/firewall_nat_out_edit.php:504
+#: usr/local/www/firewall_nat_out_edit.php:538
+#: usr/local/www/firewall_rules_edit.php:876
+#: usr/local/www/firewall_rules_edit.php:919
+#: usr/local/www/firewall_rules_edit.php:977
+#: usr/local/www/firewall_rules_edit.php:990
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1019
+#: usr/local/www/firewall_rules_edit.php:1075
+#: usr/local/www/firewall_rules_edit.php:1088
+#: usr/local/www/firewall_rules_edit.php:1152
+#: usr/local/www/firewall_nat_edit.php:564
+#: usr/local/www/firewall_nat_edit.php:624
+#: usr/local/www/firewall_nat_edit.php:653
+#: usr/local/www/firewall_nat_1to1_edit.php:349
+#: usr/local/www/firewall_nat_1to1_edit.php:404
+#: usr/local/www/firewall_nat_out_edit.php:539
+#: usr/local/www/firewall_rules_edit.php:876
+#: usr/local/www/firewall_rules_edit.php:919
+#: usr/local/www/firewall_rules_edit.php:977
+#: usr/local/www/firewall_rules_edit.php:990
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1019
+#: usr/local/www/firewall_rules_edit.php:1075
+#: usr/local/www/firewall_rules_edit.php:1088
+#: usr/local/www/firewall_rules_edit.php:1152
+#: usr/local/www/services_captiveportal_ip.php:173
+#: usr/local/www/services_captiveportal_ip.php:180
+#: usr/local/www/firewall_nat_edit.php:564
+#: usr/local/www/firewall_nat_edit.php:611
+#: usr/local/www/firewall_nat_edit.php:624
+#: usr/local/www/firewall_nat_edit.php:653
+#: usr/local/www/services_captiveportal_hostname.php:174
+#: usr/local/www/services_captiveportal_hostname.php:181
+#: usr/local/www/firewall_rules.php:126
+#: usr/local/www/firewall_nat_1to1_edit.php:349
+#: usr/local/www/firewall_nat_1to1_edit.php:404
+#: usr/local/www/firewall_nat_out_edit.php:504
+#: usr/local/www/firewall_nat_out_edit.php:539
+msgid "any"
+msgstr "任意の"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:344
+#: usr/local/www/firewall_nat_1to1_edit.php:351
+#: usr/local/www/firewall_nat_1to1_edit.php:349
+#: usr/local/www/firewall_nat_1to1_edit.php:350
+#: usr/local/www/firewall_nat_1to1_edit.php:350
+msgid "Single host"
+msgstr "単一宿主"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:347
+#: usr/local/www/firewall_nat_1to1_edit.php:402
+#: usr/local/www/firewall_nat_edit.php:554
+#: usr/local/www/firewall_nat_edit.php:643
+#: usr/local/www/firewall_rules_edit.php:874
+#: usr/local/www/firewall_rules_edit.php:967
+#: usr/local/www/firewall_nat_1to1_edit.php:354
+#: usr/local/www/firewall_nat_1to1_edit.php:409
+#: usr/local/www/firewall_rules_edit.php:909
+#: usr/local/www/firewall_rules_edit.php:1002
+#: usr/local/www/firewall_nat_edit.php:561
+#: usr/local/www/firewall_nat_edit.php:650
+#: usr/local/www/firewall_nat_1to1_edit.php:352
+#: usr/local/www/firewall_nat_1to1_edit.php:407
+#: usr/local/www/firewall_nat_edit.php:560
+#: usr/local/www/firewall_nat_edit.php:649
+#: usr/local/www/firewall_rules_edit.php:918
+#: usr/local/www/firewall_rules_edit.php:1017
+#: usr/local/www/firewall_nat_edit.php:555
+#: usr/local/www/firewall_nat_edit.php:644
+#: usr/local/www/firewall_rules_edit.php:930
+#: usr/local/www/firewall_rules_edit.php:1030
+#: usr/local/www/firewall_nat_edit.php:567
+#: usr/local/www/firewall_nat_edit.php:656
+#: usr/local/www/firewall_rules_edit.php:929
+#: usr/local/www/firewall_rules_edit.php:1029
+#: usr/local/www/firewall_nat_edit.php:568
+#: usr/local/www/firewall_nat_edit.php:657
+#: usr/local/www/firewall_nat_1to1_edit.php:353
+#: usr/local/www/firewall_nat_1to1_edit.php:408
+#: usr/local/www/firewall_rules_edit.php:929
+#: usr/local/www/firewall_rules_edit.php:1029
+#: usr/local/www/firewall_nat_edit.php:568
+#: usr/local/www/firewall_nat_edit.php:657
+#: usr/local/www/firewall_nat_1to1_edit.php:353
+#: usr/local/www/firewall_nat_1to1_edit.php:408
+msgid "PPTP clients"
+msgstr "PPTPクライアント"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:350
+#: usr/local/www/firewall_nat_1to1_edit.php:405
+#: usr/local/www/firewall_nat_edit.php:557
+#: usr/local/www/firewall_nat_edit.php:646
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules_edit.php:970
+#: usr/local/www/firewall_nat_1to1_edit.php:357
+#: usr/local/www/firewall_nat_1to1_edit.php:412
+#: usr/local/www/firewall_rules_edit.php:912
+#: usr/local/www/firewall_rules_edit.php:1005
+#: usr/local/www/firewall_nat_edit.php:564
+#: usr/local/www/firewall_nat_edit.php:653
+#: usr/local/www/firewall_nat_1to1_edit.php:355
+#: usr/local/www/firewall_nat_1to1_edit.php:410
+#: usr/local/www/firewall_nat_edit.php:563
+#: usr/local/www/firewall_nat_edit.php:652
+#: usr/local/www/firewall_rules_edit.php:921
+#: usr/local/www/firewall_rules_edit.php:1020
+#: usr/local/www/firewall_nat_edit.php:558
+#: usr/local/www/firewall_nat_edit.php:647
+#: usr/local/www/firewall_rules_edit.php:933
+#: usr/local/www/firewall_rules_edit.php:1033
+#: usr/local/www/firewall_nat_edit.php:570
+#: usr/local/www/firewall_nat_edit.php:659
+#: usr/local/www/firewall_rules_edit.php:932
+#: usr/local/www/firewall_rules_edit.php:1032
+#: usr/local/www/firewall_nat_edit.php:571
+#: usr/local/www/firewall_nat_edit.php:660
+#: usr/local/www/firewall_nat_1to1_edit.php:356
+#: usr/local/www/firewall_nat_1to1_edit.php:411
+#: usr/local/www/firewall_rules_edit.php:932
+#: usr/local/www/firewall_rules_edit.php:1032
+#: usr/local/www/firewall_nat_edit.php:571
+#: usr/local/www/firewall_nat_edit.php:660
+#: usr/local/www/firewall_nat_1to1_edit.php:356
+#: usr/local/www/firewall_nat_1to1_edit.php:411
+msgid "PPPoE clients"
+msgstr "PPPoEクライアント"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:353
+#: usr/local/www/firewall_nat_1to1_edit.php:408
+#: usr/local/www/firewall_nat_edit.php:560
+#: usr/local/www/firewall_nat_edit.php:649
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/firewall_rules_edit.php:973
+#: usr/local/www/firewall_nat_1to1_edit.php:360
+#: usr/local/www/firewall_nat_1to1_edit.php:415
+#: usr/local/www/firewall_rules_edit.php:915
+#: usr/local/www/firewall_rules_edit.php:1008
+#: usr/local/www/firewall_nat_edit.php:567
+#: usr/local/www/firewall_nat_edit.php:656
+#: usr/local/www/firewall_nat_1to1_edit.php:358
+#: usr/local/www/firewall_nat_1to1_edit.php:413
+#: usr/local/www/firewall_nat_edit.php:566
+#: usr/local/www/firewall_nat_edit.php:655
+#: usr/local/www/firewall_rules_edit.php:924
+#: usr/local/www/firewall_rules_edit.php:1023
+#: usr/local/www/firewall_nat_edit.php:561
+#: usr/local/www/firewall_nat_edit.php:650
+#: usr/local/www/firewall_rules_edit.php:936
+#: usr/local/www/firewall_rules_edit.php:1036
+#: usr/local/www/firewall_nat_edit.php:573
+#: usr/local/www/firewall_nat_edit.php:662
+#: usr/local/www/firewall_rules_edit.php:935
+#: usr/local/www/firewall_rules_edit.php:1035
+#: usr/local/www/firewall_nat_edit.php:574
+#: usr/local/www/firewall_nat_edit.php:663
+#: usr/local/www/firewall_nat_1to1_edit.php:359
+#: usr/local/www/firewall_nat_1to1_edit.php:414
+#: usr/local/www/firewall_rules_edit.php:935
+#: usr/local/www/firewall_rules_edit.php:1035
+#: usr/local/www/firewall_nat_edit.php:574
+#: usr/local/www/firewall_nat_edit.php:663
+#: usr/local/www/firewall_nat_1to1_edit.php:359
+#: usr/local/www/firewall_nat_1to1_edit.php:414
+msgid "L2TP clients"
+msgstr "L2TPクライアント"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:358
+#: usr/local/www/firewall_nat_1to1_edit.php:413
+#: usr/local/www/firewall_nat_edit.php:565
+#: usr/local/www/firewall_nat_edit.php:654
+#: usr/local/www/firewall_rules_edit.php:978
+#: usr/local/www/firewall_nat_1to1_edit.php:365
+#: usr/local/www/firewall_nat_1to1_edit.php:420
+#: usr/local/www/firewall_rules_edit.php:1013
+#: usr/local/www/firewall_nat_edit.php:572
+#: usr/local/www/firewall_nat_edit.php:661
+#: usr/local/www/firewall_nat_1to1_edit.php:363
+#: usr/local/www/firewall_nat_1to1_edit.php:418
+#: usr/local/www/firewall_nat_edit.php:571
+#: usr/local/www/firewall_nat_edit.php:660
+#: usr/local/www/firewall_rules_edit.php:1028
+#: usr/local/www/firewall_nat_edit.php:566
+#: usr/local/www/firewall_nat_edit.php:655
+#: usr/local/www/firewall_rules_edit.php:1041
+#: usr/local/www/firewall_nat_edit.php:578
+#: usr/local/www/firewall_nat_edit.php:667
+#: usr/local/www/firewall_rules_edit.php:1040
+#: usr/local/www/firewall_nat_edit.php:579
+#: usr/local/www/firewall_nat_edit.php:668
+#: usr/local/www/firewall_nat_1to1_edit.php:364
+#: usr/local/www/firewall_nat_1to1_edit.php:419
+#: usr/local/www/firewall_rules_edit.php:1040
+#: usr/local/www/firewall_nat_edit.php:579
+#: usr/local/www/firewall_nat_edit.php:668
+#: usr/local/www/firewall_nat_1to1_edit.php:364
+#: usr/local/www/firewall_nat_1to1_edit.php:419
+msgid "subnet"
+msgstr "サブネット"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:360
+#: usr/local/www/firewall_nat_1to1_edit.php:415
+#: usr/local/www/firewall_nat_edit.php:567
+#: usr/local/www/firewall_nat_edit.php:656
+#: usr/local/www/firewall_rules_edit.php:887
+#: usr/local/www/firewall_rules_edit.php:980
+#: usr/local/www/firewall_nat_1to1_edit.php:367
+#: usr/local/www/firewall_nat_1to1_edit.php:422
+#: usr/local/www/firewall_rules_edit.php:922
+#: usr/local/www/firewall_rules_edit.php:1015
+#: usr/local/www/firewall_nat_edit.php:574
+#: usr/local/www/firewall_nat_edit.php:663
+#: usr/local/www/firewall_nat_1to1_edit.php:365
+#: usr/local/www/firewall_nat_1to1_edit.php:420
+#: usr/local/www/firewall_nat_edit.php:573
+#: usr/local/www/firewall_nat_edit.php:662
+#: usr/local/www/firewall_rules_edit.php:931
+#: usr/local/www/firewall_rules_edit.php:1030
+#: usr/local/www/firewall_nat_edit.php:568
+#: usr/local/www/firewall_nat_edit.php:657
+#: usr/local/www/firewall_rules_edit.php:943
+#: usr/local/www/firewall_rules_edit.php:1043
+#: usr/local/www/firewall_nat_edit.php:580
+#: usr/local/www/firewall_nat_edit.php:669
+#: usr/local/www/firewall_rules_edit.php:942
+#: usr/local/www/firewall_rules_edit.php:1042
+#: usr/local/www/firewall_nat_edit.php:581
+#: usr/local/www/firewall_nat_edit.php:670
+#: usr/local/www/firewall_nat_1to1_edit.php:366
+#: usr/local/www/firewall_nat_1to1_edit.php:421
+#: usr/local/www/firewall_rules_edit.php:942
+#: usr/local/www/firewall_rules_edit.php:1042
+#: usr/local/www/firewall_nat_edit.php:581
+#: usr/local/www/firewall_nat_edit.php:670
+#: usr/local/www/firewall_nat_1to1_edit.php:366
+#: usr/local/www/firewall_nat_1to1_edit.php:421
+msgid "address"
+msgstr "アドレス"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:379
+#: usr/local/www/firewall_nat_1to1_edit.php:386
+#: usr/local/www/firewall_nat_1to1_edit.php:384
+#: usr/local/www/firewall_nat_1to1_edit.php:385
+#: usr/local/www/firewall_nat_1to1_edit.php:385
+msgid ""
+"Enter the internal (LAN) subnet for the 1:1 mapping. The subnet size "
+"specified for the internal subnet will be applied to the external subnet."
+msgstr "「 1対1のマッピングのために、内部( LAN)のサブネットを入力します。サブネットサイズ「内部サブネットに指定され、外部のサブネットに適用されます。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:399
+#: usr/local/www/firewall_nat_edit.php:551
+#: usr/local/www/firewall_nat_edit.php:640
+#: usr/local/www/firewall_rules_edit.php:871
+#: usr/local/www/firewall_rules_edit.php:964
+#: usr/local/www/firewall_nat_1to1_edit.php:406
+#: usr/local/www/firewall_rules_edit.php:906
+#: usr/local/www/firewall_rules_edit.php:999
+#: usr/local/www/firewall_nat_edit.php:558
+#: usr/local/www/firewall_nat_edit.php:647
+#: usr/local/www/firewall_nat_1to1_edit.php:404
+#: usr/local/www/firewall_nat_edit.php:557
+#: usr/local/www/firewall_nat_edit.php:646
+#: usr/local/www/firewall_rules_edit.php:915
+#: usr/local/www/firewall_rules_edit.php:1014
+#: usr/local/www/firewall_nat_edit.php:552
+#: usr/local/www/firewall_nat_edit.php:641
+#: usr/local/www/firewall_rules_edit.php:927
+#: usr/local/www/firewall_rules_edit.php:1027
+#: usr/local/www/firewall_nat_edit.php:564
+#: usr/local/www/firewall_nat_edit.php:653
+#: usr/local/www/firewall_rules_edit.php:926
+#: usr/local/www/firewall_rules_edit.php:1026
+#: usr/local/www/firewall_nat_edit.php:565
+#: usr/local/www/firewall_nat_edit.php:654
+#: usr/local/www/firewall_nat_1to1_edit.php:405
+#: usr/local/www/firewall_rules_edit.php:926
+#: usr/local/www/firewall_rules_edit.php:1026
+#: usr/local/www/firewall_nat_edit.php:565
+#: usr/local/www/firewall_nat_edit.php:654
+#: usr/local/www/firewall_nat_1to1_edit.php:405
+msgid "Single host or alias"
+msgstr "単一のホストまたはエイリアス"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:436
+#: usr/local/www/firewall_nat_1to1_edit.php:443
+#: usr/local/www/firewall_nat_1to1_edit.php:441
+#: usr/local/www/firewall_nat_1to1_edit.php:442
+#: usr/local/www/firewall_nat_1to1_edit.php:442
+msgid ""
+"The 1:1 mapping will only be used for connections to or from the specified "
+"destination."
+msgstr "目的地「 1対1のマッピングは、指定するか、からの接続に使用されます」 。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:437
+#: usr/local/www/firewall_nat_1to1_edit.php:444
+#: usr/local/www/firewall_nat_1to1_edit.php:442
+#: usr/local/www/firewall_nat_1to1_edit.php:443
+#: usr/local/www/firewall_nat_1to1_edit.php:443
+msgid "Hint: this is usually 'any'."
+msgstr "ヒント:これは通常、 「任意の」である。"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:447
+#: usr/local/www/firewall_nat_edit.php:783
+#: usr/local/www/firewall_nat_1to1_edit.php:454
+#: usr/local/www/firewall_nat_edit.php:790
+#: usr/local/www/firewall_nat_1to1_edit.php:452
+#: usr/local/www/firewall_nat_edit.php:789
+#: usr/local/www/firewall_nat_edit.php:784
+#: usr/local/www/firewall_nat_edit.php:796
+#: usr/local/www/firewall_nat_edit.php:797
+#: usr/local/www/firewall_nat_edit.php:797
+#: usr/local/www/firewall_nat_1to1_edit.php:454
+msgid "NAT reflection"
+msgstr "NATの反射"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:450
+#: usr/local/www/firewall_nat_edit.php:786
+#: usr/local/www/firewall_nat_1to1_edit.php:457
+#: usr/local/www/firewall_nat_1to1_edit.php:455
+#: usr/local/www/firewall_nat_1to1_edit.php:457
+msgid "use system default"
+msgstr "システムのデフォルトを使用"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:451
+#: usr/local/www/firewall_nat_edit.php:787
+#: usr/local/www/firewall_nat_1to1_edit.php:458
+#: usr/local/www/firewall_nat_1to1_edit.php:456
+#: usr/local/www/firewall_nat_1to1_edit.php:458
+msgid "enable"
+msgstr "有効にする"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:452
+#: usr/local/www/firewall_nat_edit.php:788
+#: usr/local/www/firewall_nat_1to1_edit.php:459
+#: usr/local/www/firewall_nat_1to1_edit.php:457
+#: usr/local/www/firewall_nat_1to1_edit.php:459
+msgid "disable"
+msgstr "無効にする"
+
+#: usr/local/www/firewall_nat_edit.php:109
+#: usr/local/www/firewall_nat_edit.php:114
+#: usr/local/www/firewall_nat_edit.php:119
+#: usr/local/www/firewall_nat_edit.php:119
+#, php-format
+msgid ""
+"Invalid characters detected %s. Please remove invalid characters and save "
+"again."
+msgstr "再び"無効な文字が%s.に無効な文字を削除して保存してください検出された「 。"
+
+#: usr/local/www/firewall_nat_edit.php:182
+#: usr/local/www/firewall_nat_edit.php:187
+#: usr/local/www/firewall_nat_edit.php:192
+#: usr/local/www/firewall_nat_edit.php:192
+msgid "Destination port from"
+msgstr "からの宛先ポート"
+
+#: usr/local/www/firewall_nat_edit.php:182
+#: usr/local/www/firewall_nat_edit.php:187
+#: usr/local/www/firewall_nat_edit.php:192
+#: usr/local/www/firewall_nat_edit.php:192
+msgid "Destination port to"
+msgstr "宛先ポートに"
+
+#: usr/local/www/firewall_nat_edit.php:198
+#: usr/local/www/firewall_nat_edit.php:740
+#: usr/local/www/firewall_nat_edit.php:747
+#: usr/local/www/firewall_nat_edit.php:746
+#: usr/local/www/firewall_nat_edit.php:203
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/firewall_nat_edit.php:208
+#: usr/local/www/firewall_nat_edit.php:753
+#: usr/local/www/firewall_nat_edit.php:754
+#: usr/local/www/firewall_nat_edit.php:208
+#: usr/local/www/firewall_nat_edit.php:754
+msgid "Redirect target IP"
+msgstr "ターゲットIPにリダイレクト"
+
+#: usr/local/www/firewall_nat_edit.php:213
+#: usr/local/www/firewall_nat_edit.php:220
+#: usr/local/www/firewall_nat_edit.php:225
+#: usr/local/www/firewall_nat_edit.php:230
+#: usr/local/www/firewall_nat_edit.php:230
+#, php-format
+msgid ""%s" is not a valid redirect target IP address or host alias."
+msgstr "「 %s "は有効なリダイレクト先のIPアドレスまたはホストエイリアスではありません。"
+
+#: usr/local/www/firewall_nat_edit.php:217
+#: usr/local/www/firewall_rules_edit.php:325
+#: usr/local/www/firewall_rules_edit.php:349
+#: usr/local/www/firewall_nat_edit.php:224
+#: usr/local/www/firewall_rules_edit.php:348
+#: usr/local/www/firewall_rules_edit.php:351
+#: usr/local/www/firewall_nat_edit.php:229
+#: usr/local/www/firewall_rules_edit.php:357
+#: usr/local/www/firewall_nat_edit.php:234
+#: usr/local/www/firewall_rules_edit.php:357
+#: usr/local/www/firewall_nat_edit.php:234
+#, php-format
+msgid ""
+"%s is not a valid start source port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr "「 %sは有効な開始送信元ポートではありません。これは、ポートエイリアスまたは整数でなければなりません "1 〜65535の間。"
+
+#: usr/local/www/firewall_nat_edit.php:219
+#: usr/local/www/firewall_nat_edit.php:226
+#: usr/local/www/firewall_nat_edit.php:231
+#: usr/local/www/firewall_nat_edit.php:236
+#: usr/local/www/firewall_nat_edit.php:236
+#, php-format
+msgid ""
+"%s is not a valid end source port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr "「 %sは有効な終了の送信元ポートではありません。これは、ポートエイリアスまたは整数でなければなりません "1 〜65535の間。"
+
+#: usr/local/www/firewall_nat_edit.php:221
+#: usr/local/www/firewall_rules_edit.php:329
+#: usr/local/www/firewall_rules_edit.php:353
+#: usr/local/www/firewall_nat_edit.php:228
+#: usr/local/www/firewall_rules_edit.php:352
+#: usr/local/www/firewall_rules_edit.php:355
+#: usr/local/www/firewall_nat_edit.php:233
+#: usr/local/www/firewall_rules_edit.php:361
+#: usr/local/www/firewall_nat_edit.php:238
+#: usr/local/www/firewall_rules_edit.php:361
+#: usr/local/www/firewall_nat_edit.php:238
+#, php-format
+msgid ""
+"%s is not a valid start destination port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr "「 %sは有効な開始宛先ポートではありません。これは、ポートエイリアスまたは整数でなければなりません "1 〜65535の間。"
+
+#: usr/local/www/firewall_nat_edit.php:223
+#: usr/local/www/firewall_rules_edit.php:331
+#: usr/local/www/firewall_rules_edit.php:355
+#: usr/local/www/firewall_nat_edit.php:230
+#: usr/local/www/firewall_rules_edit.php:354
+#: usr/local/www/firewall_rules_edit.php:357
+#: usr/local/www/firewall_nat_edit.php:235
+#: usr/local/www/firewall_rules_edit.php:363
+#: usr/local/www/firewall_nat_edit.php:240
+#: usr/local/www/firewall_rules_edit.php:363
+#: usr/local/www/firewall_nat_edit.php:240
+#, php-format
+msgid ""
+"%s is not a valid end destination port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr "「 %sは有効なエンド宛先ポートではありません。これは、ポートエイリアスまたは整数でなければなりません "1 〜65535の間。"
+
+#: usr/local/www/firewall_nat_edit.php:226
+#, php-format
+msgid ""
+"%s is not a valid local port. It must be a port alias or integer between 1 "
+"and 65535."
+msgstr "「 %sは有効なローカルポートではありません。これは、 1間のポートエイリアスまたは整数でなければなりません」と65535 。"
+
+#: usr/local/www/firewall_nat_edit.php:237
+#: usr/local/www/firewall_rules_edit.php:365
+#: usr/local/www/firewall_rules_edit.php:394
+#: usr/local/www/firewall_nat_edit.php:244
+#: usr/local/www/firewall_rules_edit.php:393
+#: usr/local/www/firewall_rules_edit.php:396
+#: usr/local/www/firewall_nat_edit.php:249
+#: usr/local/www/firewall_rules_edit.php:402
+#: usr/local/www/firewall_nat_edit.php:254
+#: usr/local/www/firewall_rules_edit.php:402
+#: usr/local/www/firewall_nat_edit.php:254
+#, php-format
+msgid "%s is not a valid source IP address or alias."
+msgstr "%sは、有効な送信元IPアドレスまたはエイリアスではありません。"
+
+#: usr/local/www/firewall_nat_edit.php:240
+#: usr/local/www/firewall_nat_out_edit.php:151
+#: usr/local/www/firewall_rules_edit.php:368
+#: usr/local/www/firewall_nat_out_edit.php:164
+#: usr/local/www/firewall_rules_edit.php:397
+#: usr/local/www/firewall_nat_edit.php:247
+#: usr/local/www/firewall_rules_edit.php:396
+#: usr/local/www/firewall_rules_edit.php:399
+#: usr/local/www/firewall_nat_edit.php:252
+#: usr/local/www/firewall_nat_out_edit.php:168
+#: usr/local/www/firewall_rules_edit.php:405
+#: usr/local/www/firewall_nat_edit.php:257
+#: usr/local/www/firewall_nat_out_edit.php:174
+#: usr/local/www/firewall_rules_edit.php:405
+#: usr/local/www/firewall_nat_edit.php:257
+#: usr/local/www/firewall_nat_out_edit.php:174
+msgid "A valid source bit count must be specified."
+msgstr "有効なソースビット数を指定する必要があります。"
+
+#: usr/local/www/firewall_nat_edit.php:267
+#: usr/local/www/firewall_nat_edit.php:274
+#: usr/local/www/firewall_nat_edit.php:279
+#: usr/local/www/firewall_nat_edit.php:284
+#: usr/local/www/firewall_nat_edit.php:284
+msgid "The target port range must be an integer between 1 and 65535."
+msgstr "ターゲットポートの範囲は1 〜65535の間の整数でなければなりません。"
+
+#: usr/local/www/firewall_nat_edit.php:288
+#: usr/local/www/firewall_nat_edit.php:295
+#: usr/local/www/firewall_nat_edit.php:300
+#: usr/local/www/firewall_nat_edit.php:305
+#: usr/local/www/firewall_nat_edit.php:305
+msgid "The destination port range overlaps with an existing entry."
+msgstr "宛先ポートの範囲は、既存のエントリと重複する。"
+
+#: usr/local/www/firewall_nat_edit.php:453
+#: usr/local/www/firewall_nat_edit.php:460
+#: usr/local/www/firewall_nat_edit.php:459
+#: usr/local/www/firewall_nat_edit.php:454
+#: usr/local/www/firewall_nat_edit.php:466
+#: usr/local/www/firewall_nat_edit.php:467
+#: usr/local/www/firewall_nat_edit.php:467
+msgid "Edit Redirect entry"
+msgstr "編集リダイレクトエントリー"
+
+#: usr/local/www/firewall_nat_edit.php:468
+#: usr/local/www/firewall_nat_edit.php:475
+#: usr/local/www/firewall_nat_edit.php:474
+#: usr/local/www/firewall_nat_edit.php:469
+#: usr/local/www/firewall_nat_edit.php:481
+#: usr/local/www/firewall_nat_edit.php:482
+#: usr/local/www/firewall_nat_edit.php:482
+msgid "No RDR (NOT)"
+msgstr "ノーRDR (NOT )"
+
+#: usr/local/www/firewall_nat_edit.php:471
+#: usr/local/www/firewall_nat_edit.php:478
+#: usr/local/www/firewall_nat_edit.php:477
+#: usr/local/www/firewall_nat_edit.php:472
+#: usr/local/www/firewall_nat_edit.php:484
+#: usr/local/www/firewall_nat_edit.php:485
+#: usr/local/www/firewall_nat_edit.php:485
+msgid ""
+"Enabling this option will disable redirection for traffic matching this rule."
+msgstr ""このオプションを有効にすると、このルールに一致するトラフィックのリダイレクトを無効にします。"
+
+#: usr/local/www/firewall_nat_edit.php:472
+#: usr/local/www/firewall_nat_edit.php:479
+#: usr/local/www/firewall_nat_edit.php:478
+#: usr/local/www/firewall_nat_edit.php:473
+#: usr/local/www/firewall_nat_edit.php:485
+#: usr/local/www/firewall_nat_edit.php:486
+#: usr/local/www/firewall_nat_edit.php:486
+msgid ""
+"Hint: this option is rarely needed, don't use this unless you know what "
+"you're doing."
+msgstr "あなたがやっている: "ヒントあなたが知っている限り、このオプションはほとんど必要ありません、これを使用しないでください」 。"
+
+#: usr/local/www/firewall_nat_edit.php:514
+#: usr/local/www/firewall_nat_out_edit.php:452
+#: usr/local/www/firewall_nat_out_edit.php:465
+#: usr/local/www/firewall_nat_edit.php:521
+#: usr/local/www/firewall_nat_edit.php:520
+#: usr/local/www/firewall_nat_edit.php:515
+#: usr/local/www/firewall_nat_out_edit.php:469
+#: usr/local/www/firewall_nat_edit.php:527
+#: usr/local/www/firewall_nat_out_edit.php:481
+#: usr/local/www/firewall_nat_edit.php:528
+#: usr/local/www/firewall_nat_edit.php:528
+#: usr/local/www/firewall_nat_out_edit.php:481
+msgid "Choose which interface this rule applies to."
+msgstr "選択しているインターフェイス、このルールが適用される。"
+
+#: usr/local/www/firewall_nat_edit.php:515
+#: usr/local/www/firewall_nat_out_edit.php:453
+#: usr/local/www/firewall_nat_out_edit.php:466
+#: usr/local/www/firewall_nat_edit.php:522
+#: usr/local/www/firewall_nat_edit.php:521
+#: usr/local/www/firewall_nat_edit.php:516
+#: usr/local/www/firewall_nat_out_edit.php:470
+#: usr/local/www/firewall_nat_edit.php:528
+#: usr/local/www/firewall_nat_out_edit.php:482
+#: usr/local/www/firewall_nat_edit.php:529
+#: usr/local/www/firewall_nat_edit.php:529
+#: usr/local/www/firewall_nat_out_edit.php:482
+msgid "Hint: in most cases, you'll want to use WAN here."
+msgstr "ヒント:ほとんどの場合、あなたはここで、WANを使うことになるでしょう。"
+
+#: usr/local/www/firewall_nat_edit.php:524
+#: usr/local/www/firewall_rules_edit.php:818
+#: usr/local/www/firewall_rules_edit.php:853
+#: usr/local/www/firewall_nat_edit.php:531
+#: usr/local/www/firewall_nat_edit.php:530
+#: usr/local/www/firewall_rules_edit.php:856
+#: usr/local/www/firewall_nat_edit.php:525
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_nat_edit.php:537
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_nat_edit.php:538
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_nat_edit.php:538
+msgid "Choose which IP protocol this rule should match."
+msgstr "選択しているIPプロトコルこの規則は、一致している必要があります。"
+
+#: usr/local/www/firewall_nat_edit.php:526
+#: usr/local/www/firewall_nat_edit.php:533
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/firewall_nat_edit.php:527
+#: usr/local/www/firewall_nat_edit.php:539
+#: usr/local/www/firewall_nat_edit.php:540
+#: usr/local/www/firewall_nat_edit.php:540
+msgid "Hint: in most cases, you should specify"
+msgstr "ヒント:ほとんどの場合、次のように指定する必要があり"
+
+#: usr/local/www/firewall_nat_edit.php:526
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_relay_action_edit.php:186
+#: usr/local/www/load_balancer_relay_protocol_edit.php:144
+#: usr/local/www/firewall_nat_edit.php:533
+#: usr/local/www/load_balancer_relay_protocol_edit.php:142
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/firewall_nat_edit.php:527
+#: usr/local/www/firewall_nat_edit.php:539
+#: usr/local/www/firewall_nat_edit.php:540
+#: usr/local/www/load_balancer_relay_protocol_edit.php:142
+#: usr/local/www/firewall_nat_edit.php:540
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_monitor_edit.php:197
+msgid "TCP"
+msgstr "TCP"
+
+#: usr/local/www/firewall_nat_edit.php:526
+#: usr/local/www/firewall_rules_edit.php:818
+#: usr/local/www/diag_ipsec_sad.php:135 usr/local/www/diag_ipsec_spd.php:144
+#: usr/local/www/firewall_rules_edit.php:853
+#: usr/local/www/firewall_nat_edit.php:533
+#: usr/local/www/diag_ipsec_sad.php:136
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/diag_ipsec_spd.php:145
+#: usr/local/www/firewall_rules_edit.php:856
+#: usr/local/www/firewall_nat_edit.php:527
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_nat_edit.php:539
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_nat_edit.php:540
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_nat_edit.php:540
+#: usr/local/www/diag_ipsec_spd.php:145 usr/local/www/diag_ipsec_sad.php:136
+msgid "here."
+msgstr "ここに。"
+
+#: usr/local/www/firewall_nat_edit.php:531
+#: usr/local/www/firewall_nat_edit.php:538
+#: usr/local/www/firewall_nat_edit.php:537
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/firewall_nat_edit.php:544
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/firewall_nat_edit.php:545
+msgid "Show source address and port range"
+msgstr "送信元アドレスおよびポート範囲を表示する"
+
+#: usr/local/www/firewall_nat_edit.php:589
+#: usr/local/www/firewall_rules_edit.php:913
+#: usr/local/www/firewall_rules_edit.php:948
+#: usr/local/www/firewall_nat_edit.php:596
+#: usr/local/www/firewall_nat_edit.php:595
+#: usr/local/www/firewall_rules_edit.php:957
+#: usr/local/www/firewall_nat_edit.php:590
+#: usr/local/www/firewall_rules_edit.php:970
+#: usr/local/www/firewall_nat_edit.php:602
+#: usr/local/www/firewall_rules_edit.php:969
+#: usr/local/www/firewall_nat_edit.php:603
+#: usr/local/www/firewall_rules_edit.php:969
+#: usr/local/www/firewall_nat_edit.php:603
+msgid "Source port range"
+msgstr "送信元ポート範囲"
+
+#: usr/local/www/firewall_nat_edit.php:593
+#: usr/local/www/firewall_nat_edit.php:705
+#: usr/local/www/firewall_rules_edit.php:917
+#: usr/local/www/firewall_rules_edit.php:1009
+#: usr/local/www/firewall_rules_edit.php:952
+#: usr/local/www/firewall_rules_edit.php:1044
+#: usr/local/www/firewall_nat_edit.php:600
+#: usr/local/www/firewall_nat_edit.php:712
+#: usr/local/www/firewall_nat_edit.php:599
+#: usr/local/www/firewall_nat_edit.php:711
+#: usr/local/www/firewall_rules_edit.php:961
+#: usr/local/www/firewall_rules_edit.php:1059
+#: usr/local/www/firewall_nat_edit.php:594
+#: usr/local/www/firewall_nat_edit.php:706
+#: usr/local/www/firewall_rules_edit.php:974
+#: usr/local/www/firewall_rules_edit.php:1072
+#: usr/local/www/firewall_nat_edit.php:606
+#: usr/local/www/firewall_nat_edit.php:718
+#: usr/local/www/firewall_rules_edit.php:973
+#: usr/local/www/firewall_rules_edit.php:1071
+#: usr/local/www/firewall_nat_edit.php:607
+#: usr/local/www/firewall_nat_edit.php:719
+#: usr/local/www/firewall_rules_edit.php:973
+#: usr/local/www/firewall_rules_edit.php:1071
+#: usr/local/www/firewall_nat_edit.php:607
+#: usr/local/www/firewall_nat_edit.php:719
+msgid "from:"
+msgstr "から:"
+
+#: usr/local/www/firewall_nat_edit.php:596
+#: usr/local/www/firewall_nat_edit.php:609
+#: usr/local/www/firewall_nat_edit.php:708
+#: usr/local/www/firewall_nat_edit.php:721
+#: usr/local/www/firewall_nat_edit.php:751
+#: usr/local/www/firewall_rules_edit.php:920
+#: usr/local/www/firewall_rules_edit.php:933
+#: usr/local/www/firewall_rules_edit.php:1012
+#: usr/local/www/firewall_rules_edit.php:1025
+#: usr/local/www/firewall_rules_edit.php:955
+#: usr/local/www/firewall_rules_edit.php:968
+#: usr/local/www/firewall_rules_edit.php:1047
+#: usr/local/www/firewall_rules_edit.php:1060
+#: usr/local/www/firewall_nat_edit.php:603
+#: usr/local/www/firewall_nat_edit.php:616
+#: usr/local/www/firewall_nat_edit.php:715
+#: usr/local/www/firewall_nat_edit.php:728
+#: usr/local/www/firewall_nat_edit.php:758
+#: usr/local/www/firewall_nat_edit.php:602
+#: usr/local/www/firewall_nat_edit.php:615
+#: usr/local/www/firewall_nat_edit.php:714
+#: usr/local/www/firewall_nat_edit.php:727
+#: usr/local/www/firewall_nat_edit.php:757
+#: usr/local/www/firewall_rules_edit.php:964
+#: usr/local/www/firewall_rules_edit.php:977
+#: usr/local/www/firewall_rules_edit.php:1062
+#: usr/local/www/firewall_rules_edit.php:1075
+#: usr/local/www/firewall_nat_edit.php:597
+#: usr/local/www/firewall_nat_edit.php:610
+#: usr/local/www/firewall_nat_edit.php:709
+#: usr/local/www/firewall_nat_edit.php:722
+#: usr/local/www/firewall_nat_edit.php:752
+#: usr/local/www/firewall_rules_edit.php:990
+#: usr/local/www/firewall_rules_edit.php:1088
+#: usr/local/www/firewall_nat_edit.php:622
+#: usr/local/www/firewall_nat_edit.php:734
+#: usr/local/www/firewall_nat_edit.php:764
+#: usr/local/www/firewall_rules_edit.php:976
+#: usr/local/www/firewall_rules_edit.php:989
+#: usr/local/www/firewall_rules_edit.php:1074
+#: usr/local/www/firewall_rules_edit.php:1087
+#: usr/local/www/firewall_nat_edit.php:623
+#: usr/local/www/firewall_nat_edit.php:735
+#: usr/local/www/firewall_nat_edit.php:765
+#: usr/local/www/firewall_rules_edit.php:976
+#: usr/local/www/firewall_rules_edit.php:989
+#: usr/local/www/firewall_rules_edit.php:1074
+#: usr/local/www/firewall_rules_edit.php:1087
+#: usr/local/www/firewall_nat_edit.php:610
+#: usr/local/www/firewall_nat_edit.php:623
+#: usr/local/www/firewall_nat_edit.php:722
+#: usr/local/www/firewall_nat_edit.php:735
+#: usr/local/www/firewall_nat_edit.php:765
+msgid "other"
+msgstr "その他"
+
+#: usr/local/www/firewall_nat_edit.php:606
+#: usr/local/www/firewall_nat_edit.php:718
+#: usr/local/www/firewall_rules_edit.php:930
+#: usr/local/www/firewall_rules_edit.php:1022
+#: usr/local/www/firewall_rules_edit.php:965
+#: usr/local/www/firewall_rules_edit.php:1057
+#: usr/local/www/firewall_nat_edit.php:613
+#: usr/local/www/firewall_nat_edit.php:725
+#: usr/local/www/firewall_nat_edit.php:612
+#: usr/local/www/firewall_nat_edit.php:724
+#: usr/local/www/firewall_rules_edit.php:974
+#: usr/local/www/firewall_rules_edit.php:1072
+#: usr/local/www/firewall_nat_edit.php:607
+#: usr/local/www/firewall_nat_edit.php:719
+#: usr/local/www/firewall_rules_edit.php:987
+#: usr/local/www/firewall_rules_edit.php:1085
+#: usr/local/www/firewall_nat_edit.php:619
+#: usr/local/www/firewall_nat_edit.php:731
+#: usr/local/www/firewall_rules_edit.php:986
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:732
+#: usr/local/www/firewall_rules_edit.php:986
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:732
+msgid "to:"
+msgstr "へ:"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_edit.php:634
+msgid "Specify the source port or port range for this rule"
+msgstr "このルールの送信元ポートまたはポート範囲を指定"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_nat_edit.php:634
+msgid "This is usually"
+msgstr "これは通常"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_nat_edit.php:634
+msgid "random"
+msgstr "ランダム"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_edit.php:634
+msgid ""
+"and almost never equal to the destination port range (and should usually be "
+"'any')"
+msgstr ""( 「任意の」と宛先ポート範囲とほぼ等しくなることは、通常でなければなりません」 )"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:735
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:1039
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:1074
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:742
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1089
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_nat_edit.php:736
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1102
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_nat_edit.php:748
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1101
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_edit.php:749
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1101
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_edit.php:749
+msgid "Hint: you can leave the"
+msgstr "ヒント:あなたが残すことができます"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_nat_edit.php:634
+msgid "field empty if you only want to filter a single port."
+msgstr "フィールドには、単一のポートをフィルタリングする場合は、空。"
+
+#: usr/local/www/firewall_nat_edit.php:701
+#: usr/local/www/firewall_nat_edit.php:708
+#: usr/local/www/firewall_nat_edit.php:707
+#: usr/local/www/firewall_nat_edit.php:702
+#: usr/local/www/firewall_nat_edit.php:714
+#: usr/local/www/firewall_nat_edit.php:715
+#: usr/local/www/firewall_nat_edit.php:715
+msgid "Destination port range"
+msgstr "宛先ポート範囲"
+
+#: usr/local/www/firewall_nat_edit.php:733
+#: usr/local/www/firewall_nat_edit.php:740
+#: usr/local/www/firewall_nat_edit.php:739
+#: usr/local/www/firewall_nat_edit.php:734
+#: usr/local/www/firewall_nat_edit.php:746
+#: usr/local/www/firewall_nat_edit.php:747
+#: usr/local/www/firewall_nat_edit.php:747
+msgid ""
+"Specify the port or port range for the destination of the packet for this "
+"mapping."
+msgstr "マッピング"このため、パケットの送信先のポートまたはポート範囲を指定してください」 。"
+
+#: usr/local/www/firewall_nat_edit.php:735
+#: usr/local/www/firewall_nat_edit.php:742
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/firewall_nat_edit.php:736
+#: usr/local/www/firewall_nat_edit.php:748
+#: usr/local/www/firewall_nat_edit.php:749
+#: usr/local/www/firewall_nat_edit.php:749
+msgid "field empty if you only want to map a single port"
+msgstr "フィールドの空のあなたは、単一のポートをマップする場合"
+
+#: usr/local/www/firewall_nat_edit.php:743
+#: usr/local/www/firewall_nat_edit.php:750
+#: usr/local/www/firewall_nat_edit.php:749
+#: usr/local/www/firewall_nat_edit.php:744
+#: usr/local/www/firewall_nat_edit.php:756
+#: usr/local/www/firewall_nat_edit.php:757
+#: usr/local/www/firewall_nat_edit.php:757
+msgid ""
+"Enter the internal IP address of the server on which you want to map the "
+"ports."
+msgstr "ポート」を、マップにしたいサーバーの内部IPアドレスを入力してください "。"
+
+#: usr/local/www/firewall_nat_edit.php:748
+#: usr/local/www/firewall_nat_edit.php:755
+#: usr/local/www/firewall_nat_edit.php:754
+#: usr/local/www/firewall_nat_edit.php:749
+#: usr/local/www/firewall_nat_edit.php:761
+#: usr/local/www/firewall_nat_edit.php:762
+#: usr/local/www/firewall_nat_edit.php:762
+msgid "Redirect target port"
+msgstr "ターゲットポートをリダイレクト"
+
+#: usr/local/www/firewall_nat_edit.php:762
+#: usr/local/www/firewall_nat_edit.php:769
+#: usr/local/www/firewall_nat_edit.php:768
+#: usr/local/www/firewall_nat_edit.php:763
+#: usr/local/www/firewall_nat_edit.php:775
+#: usr/local/www/firewall_nat_edit.php:776
+#: usr/local/www/firewall_nat_edit.php:776
+msgid ""
+"Specify the port on the machine with the IP address entered above. In case "
+"of a port range, specify the beginning port of the range (the end port will "
+"be calculated automatically)."
+msgstr ""上で入力したIPアドレスを持つマシンのポートを指定します。場合は、「ポート範囲の、 (エンド·ポートが「自動的に計算されます)範囲の開始ポートを指定します。"
+
+#: usr/local/www/firewall_nat_edit.php:766
+#: usr/local/www/firewall_nat_edit.php:773
+#: usr/local/www/firewall_nat_edit.php:772
+#: usr/local/www/firewall_nat_edit.php:767
+#: usr/local/www/firewall_nat_edit.php:779
+#: usr/local/www/firewall_nat_edit.php:780
+#: usr/local/www/firewall_nat_edit.php:780
+msgid "Hint: this is usually identical to the 'from' port above"
+msgstr "ヒント:これは、ポート'から'上、通常と同じです"
+
+#: usr/local/www/firewall_nat_edit.php:776
+#: usr/local/www/firewall_nat_out_edit.php:629
+#: usr/local/www/firewall_rules_edit.php:1238
+#: usr/local/www/firewall_nat_out_edit.php:642
+#: usr/local/www/firewall_rules_edit.php:1273
+#: usr/local/www/firewall_nat_edit.php:783
+#: usr/local/www/firewall_nat_edit.php:782
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_nat_edit.php:777
+#: usr/local/www/firewall_nat_out_edit.php:644
+#: usr/local/www/firewall_rules_edit.php:1295
+#: usr/local/www/firewall_nat_edit.php:789
+#: usr/local/www/firewall_nat_out_edit.php:656
+#: usr/local/www/firewall_rules_edit.php:1294
+#: usr/local/www/firewall_nat_edit.php:790
+#: usr/local/www/firewall_rules_edit.php:1294
+#: usr/local/www/firewall_nat_edit.php:790
+#: usr/local/www/firewall_nat_out_edit.php:656
+msgid "No XMLRPC Sync"
+msgstr "いいえXMLRPC同期しない"
+
+#: usr/local/www/firewall_nat_edit.php:779
+#: usr/local/www/firewall_nat_edit.php:786
+#: usr/local/www/firewall_nat_edit.php:785
+msgid ""
+"HINT: This prevents the rule from automatically syncing to other CARP members"
+msgstr ""ヒント:これは自動的に他のCARPのメンバーと同期からルールを防ぎ"
+
+#: usr/local/www/firewall_nat_edit.php:794
+#: usr/local/www/firewall_nat_edit.php:825
+#: usr/local/www/firewall_nat_edit.php:802
+#: usr/local/www/firewall_nat_edit.php:833
+#: usr/local/www/firewall_nat_edit.php:801
+#: usr/local/www/firewall_nat_edit.php:832
+#: usr/local/www/firewall_nat_edit.php:796
+#: usr/local/www/firewall_nat_edit.php:827
+#: usr/local/www/firewall_nat_edit.php:808
+#: usr/local/www/firewall_nat_edit.php:839
+#: usr/local/www/firewall_nat_edit.php:809
+#: usr/local/www/firewall_nat_edit.php:840
+#: usr/local/www/firewall_nat_edit.php:809
+#: usr/local/www/firewall_nat_edit.php:840
+msgid "Filter rule association"
+msgstr "フィルタ·ルールの関連付け"
+
+#: usr/local/www/firewall_nat_edit.php:798
+#: usr/local/www/firewall_nat_edit.php:831
+#: usr/local/www/firewall_nat_edit.php:806
+#: usr/local/www/firewall_nat_edit.php:839
+#: usr/local/www/firewall_nat_edit.php:805
+#: usr/local/www/firewall_nat_edit.php:838
+#: usr/local/www/firewall_nat_edit.php:800
+#: usr/local/www/firewall_nat_edit.php:833
+#: usr/local/www/firewall_nat_edit.php:812
+#: usr/local/www/firewall_nat_edit.php:845
+#: usr/local/www/firewall_nat_edit.php:813
+#: usr/local/www/firewall_nat_edit.php:846
+#: usr/local/www/firewall_nat_edit.php:813
+#: usr/local/www/firewall_nat_edit.php:846
+msgid "Pass"
+msgstr "パス"
+
+#: usr/local/www/firewall_nat_edit.php:808
+#: usr/local/www/firewall_nat_edit.php:816
+#: usr/local/www/firewall_nat_edit.php:815
+#: usr/local/www/firewall_nat_edit.php:810
+#: usr/local/www/firewall_nat_edit.php:822
+#: usr/local/www/firewall_nat_edit.php:823
+#: usr/local/www/firewall_nat_edit.php:823
+msgid "View the filter rule"
+msgstr "フィルタルールを表示する"
+
+#: usr/local/www/firewall_nat_edit.php:816
+#: usr/local/www/firewall_nat_edit.php:824
+#: usr/local/www/firewall_nat_edit.php:823
+#: usr/local/www/firewall_nat_edit.php:818
+#: usr/local/www/firewall_nat_edit.php:830
+#: usr/local/www/firewall_nat_edit.php:831
+#: usr/local/www/firewall_nat_edit.php:831
+msgid "Create new associated filter rule"
+msgstr "新しい関連するフィルタルールを作成する"
+
+#: usr/local/www/firewall_nat_edit.php:829
+#: usr/local/www/firewall_nat_edit.php:837
+#: usr/local/www/firewall_nat_edit.php:836
+#: usr/local/www/firewall_nat_edit.php:831
+#: usr/local/www/firewall_nat_edit.php:843
+#: usr/local/www/firewall_nat_edit.php:844
+#: usr/local/www/firewall_nat_edit.php:844
+msgid "Add associated filter rule"
+msgstr "関連するフィルタルールを追加"
+
+#: usr/local/www/firewall_nat_edit.php:830
+#: usr/local/www/firewall_nat_edit.php:838
+#: usr/local/www/firewall_nat_edit.php:837
+#: usr/local/www/firewall_nat_edit.php:832
+#: usr/local/www/firewall_nat_edit.php:844
+#: usr/local/www/firewall_nat_edit.php:845
+#: usr/local/www/firewall_nat_edit.php:845
+msgid "Add unassociated filter rule"
+msgstr "関連付けられていないフィルタルールを追加します。"
+
+#: usr/local/www/firewall_nat_out.php:111
+#: usr/local/www/firewall_nat_out.php:112
+#: usr/local/www/firewall_nat_out.php:112
+#, php-format
+msgid "Auto created rule for ISAKMP - %1$s to %2$s"
+msgstr "%2$sには%1$s - 自動ISAKMPのためのルールを作成した"
+
+#: usr/local/www/firewall_nat_out.php:121
+#: usr/local/www/firewall_nat_out.php:123
+#: usr/local/www/firewall_nat_out.php:123
+#, php-format
+msgid "Auto created rule for %1$s to %2$s"
+msgstr "自動%2$sには%1$sのルールを作成しました"
+
+#: usr/local/www/firewall_nat_out.php:131
+#: usr/local/www/firewall_nat_out.php:135
+#: usr/local/www/firewall_nat_out.php:135
+#, php-format
+msgid "Auto created rule for localhost to %1$s"
+msgstr "オートは%1$sにlocalhostのルールを作成した"
+
+#: usr/local/www/firewall_nat_out.php:147
+#: usr/local/www/firewall_nat_out.php:148
+#: usr/local/www/firewall_nat_out.php:152
+#: usr/local/www/firewall_nat_out.php:152
+msgid "Auto created rule for PPTP server"
+msgstr "オートは、PPTPサーバー用のルールを作成した"
+
+#: usr/local/www/firewall_nat_out.php:167
+#: usr/local/www/firewall_nat_out.php:168
+#: usr/local/www/firewall_nat_out.php:173
+#: usr/local/www/firewall_nat_out.php:173
+msgid "Auto created rule for PPPoE server"
+msgstr "自動PPPoEサーバのルールを作成しました"
+
+#: usr/local/www/firewall_nat_out.php:187
+#: usr/local/www/firewall_nat_out.php:188
+#: usr/local/www/firewall_nat_out.php:194
+#: usr/local/www/firewall_nat_out.php:194
+msgid "Auto created rule for L2TP server"
+msgstr "オートは、L2TPサーバのルールを作成しました"
+
+#: usr/local/www/firewall_nat_out.php:201
+#: usr/local/www/firewall_nat_out.php:202
+#: usr/local/www/firewall_nat_out.php:209
+#: usr/local/www/firewall_nat_out.php:209
+msgid "Auto created rule for OpenVPN server"
+msgstr "自動OpenVPNのサーバー用のルールを作成した"
+
+#: usr/local/www/firewall_nat_out.php:212
+#: usr/local/www/firewall_nat_out.php:213
+#: usr/local/www/firewall_nat_out.php:220
+#: usr/local/www/firewall_nat_out.php:220
+msgid "Default rules for each interface have been created."
+msgstr "各インタフェースのデフォルトルールが作成されている。"
+
+#: usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_nat_out.php:304
+#: usr/local/www/firewall_nat_out.php:305
+#: usr/local/www/firewall_nat_out.php:312
+#: usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/firewall_nat_out.php:311
+msgid "The NAT configuration has been changed."
+msgstr "NAT設定が変更されました。"
+
+#: usr/local/www/firewall_nat_out.php:310
+#: usr/local/www/firewall_nat_out.php:320
+#: usr/local/www/firewall_nat_out.php:321
+#: usr/local/www/firewall_nat_out.php:328
+#: usr/local/www/firewall_nat_out.php:327
+#: usr/local/www/firewall_nat_out.php:327
+msgid "Mode:"
+msgstr "モード:"
+
+#: usr/local/www/firewall_nat_out.php:313
+#: usr/local/www/firewall_nat_out.php:323
+#: usr/local/www/firewall_nat_out.php:324
+#: usr/local/www/firewall_nat_out.php:331
+#: usr/local/www/firewall_nat_out.php:330
+#: usr/local/www/firewall_nat_out.php:330
+msgid "Automatic outbound NAT rule generation"
+msgstr "自動アウトバウンドNATルールの生成"
+
+#: usr/local/www/firewall_nat_out.php:313
+#: usr/local/www/firewall_nat_out.php:323
+#: usr/local/www/firewall_nat_out.php:324
+#: usr/local/www/firewall_nat_out.php:331
+#: usr/local/www/firewall_nat_out.php:330
+#: usr/local/www/firewall_nat_out.php:330
+msgid "(IPsec passthrough included)"
+msgstr "( IPsecのパススルーは含まれています)"
+
+#: usr/local/www/firewall_nat_out.php:318
+#: usr/local/www/firewall_nat_out.php:328
+#: usr/local/www/firewall_nat_out.php:329
+#: usr/local/www/firewall_nat_out.php:336
+#: usr/local/www/firewall_nat_out.php:335
+#: usr/local/www/firewall_nat_out.php:335
+msgid "Manual Outbound NAT rule generation"
+msgstr "手動のアウトバウンドNATルールの生成"
+
+#: usr/local/www/firewall_nat_out.php:318
+#: usr/local/www/firewall_nat_out.php:328
+#: usr/local/www/firewall_nat_out.php:329
+#: usr/local/www/firewall_nat_out.php:336
+#: usr/local/www/firewall_nat_out.php:335
+#: usr/local/www/firewall_nat_out.php:335
+msgid "(AON - Advanced Outbound NAT)"
+msgstr "( AON - 高度なアウトバウンドNAT)"
+
+#: usr/local/www/firewall_nat_out.php:336
+#: usr/local/www/firewall_nat_out.php:346
+#: usr/local/www/firewall_nat_out.php:347
+#: usr/local/www/firewall_nat_out.php:354
+#: usr/local/www/firewall_nat_out.php:353
+#: usr/local/www/firewall_nat_out.php:353
+msgid "Mappings:"
+msgstr "マッピング:"
+
+#: usr/local/www/firewall_nat_out.php:343
+#: usr/local/www/firewall_nat_out.php:353
+#: usr/local/www/firewall_nat_out.php:354 usr/local/www/diag_testport.php:129
+#: usr/local/www/diag_system_pftop.php:160
+#: usr/local/www/diag_logs_filter.php:167
+#: usr/local/www/firewall_nat_out.php:361
+#: usr/local/www/firewall_nat_out.php:360 usr/local/www/diag_testport.php:129
+#: usr/local/www/diag_logs_filter.php:167
+#: usr/local/www/diag_system_pftop.php:160
+#: usr/local/www/firewall_nat_out.php:360
+msgid "Source Port"
+msgstr "ソースポート"
+
+#: usr/local/www/firewall_nat_out.php:345
+#: usr/local/www/firewall_nat_out.php:355
+#: usr/local/www/firewall_nat_out.php:356
+#: usr/local/www/diag_system_pftop.php:153
+#: usr/local/www/diag_logs_filter.php:189
+#: usr/local/www/firewall_nat_out.php:363
+#: usr/local/www/firewall_nat_out.php:362
+#: usr/local/www/diag_logs_filter.php:189
+#: usr/local/www/diag_system_pftop.php:153
+#: usr/local/www/firewall_nat_out.php:362
+msgid "Destination Port"
+msgstr "宛先ポート"
+
+#: usr/local/www/firewall_nat_out.php:346
+#: usr/local/www/firewall_nat_out.php:356
+#: usr/local/www/firewall_nat_out.php:357
+#: usr/local/www/firewall_nat_out.php:364
+#: usr/local/www/firewall_nat_out.php:363
+#: usr/local/www/firewall_nat_out.php:363
+msgid "NAT Address"
+msgstr "NATアドレス"
+
+#: usr/local/www/firewall_nat_out.php:347
+#: usr/local/www/firewall_nat_out.php:357
+#: usr/local/www/firewall_nat_out.php:358
+#: usr/local/www/firewall_nat_out.php:365
+#: usr/local/www/firewall_nat_out.php:364
+#: usr/local/www/firewall_nat_out.php:364
+msgid "NAT Port"
+msgstr "NATのポート"
+
+#: usr/local/www/firewall_nat_out.php:348
+#: usr/local/www/firewall_nat_out.php:358
+#: usr/local/www/firewall_nat_out.php:359
+#: usr/local/www/firewall_nat_out.php:366
+#: usr/local/www/firewall_nat_out.php:365
+#: usr/local/www/firewall_nat_out.php:365
+msgid "Static Port"
+msgstr "静的ポート"
+
+#: usr/local/www/firewall_nat_out.php:354
+#: usr/local/www/firewall_nat_out.php:450
+#: usr/local/www/firewall_nat_out.php:364
+#: usr/local/www/firewall_nat_out.php:461
+#: usr/local/www/firewall_nat_out.php:365
+#: usr/local/www/firewall_nat_out.php:462
+#: usr/local/www/firewall_nat_out.php:459
+#: usr/local/www/firewall_nat_out.php:372
+#: usr/local/www/firewall_nat_out.php:466
+#: usr/local/www/firewall_nat_out.php:371
+#: usr/local/www/firewall_nat_out.php:465
+#: usr/local/www/firewall_nat_out.php:371
+#: usr/local/www/firewall_nat_out.php:465
+msgid "add new mapping"
+msgstr "新しいマッピングを追加する"
+
+#: usr/local/www/firewall_nat_out.php:425
+#: usr/local/www/firewall_nat_out.php:435
+#: usr/local/www/firewall_nat_out.php:436
+#: usr/local/www/firewall_nat_out.php:433
+#: usr/local/www/firewall_nat_out.php:440
+#: usr/local/www/firewall_nat_out.php:439
+#: usr/local/www/firewall_nat_out.php:439
+msgid "YES"
+msgstr "YES"
+
+#: usr/local/www/firewall_nat_out.php:427
+#: usr/local/www/firewall_nat_out.php:437
+#: usr/local/www/firewall_nat_out.php:438
+#: usr/local/www/firewall_nat_out.php:435
+#: usr/local/www/firewall_nat_out.php:442
+#: usr/local/www/firewall_nat_out.php:441
+#: usr/local/www/firewall_nat_out.php:441
+msgid "NO"
+msgstr "NO"
+
+#: usr/local/www/firewall_nat_out.php:436
+#: usr/local/www/firewall_nat_out.php:447
+#: usr/local/www/firewall_nat_out.php:448
+#: usr/local/www/firewall_nat_out.php:445
+#: usr/local/www/firewall_nat_out.php:452
+#: usr/local/www/firewall_nat_out.php:451
+#: usr/local/www/firewall_nat_out.php:451
+msgid "edit mapping"
+msgstr "編集マッピング"
+
+#: usr/local/www/firewall_nat_out.php:439 usr/local/www/firewall_rules.php:435
+#: usr/local/www/firewall_rules.php:464 usr/local/www/firewall_rules.php:492
+#: usr/local/www/firewall_rules.php:775 usr/local/www/firewall_nat.php:309
+#: usr/local/www/firewall_nat_out.php:446 usr/local/www/firewall_rules.php:429
+#: usr/local/www/firewall_rules.php:458 usr/local/www/firewall_rules.php:486
+#: usr/local/www/firewall_rules.php:772 usr/local/www/firewall_nat_out.php:447
+#: usr/local/www/firewall_nat.php:322 usr/local/www/firewall_rules.php:422
+#: usr/local/www/firewall_rules.php:451 usr/local/www/firewall_rules.php:479
+#: usr/local/www/firewall_rules.php:765 usr/local/www/firewall_nat_out.php:444
+#: usr/local/www/firewall_nat_out.php:451 usr/local/www/firewall_rules.php:421
+#: usr/local/www/firewall_rules.php:450 usr/local/www/firewall_rules.php:478
+#: usr/local/www/firewall_nat.php:325 usr/local/www/firewall_nat_out.php:450
+#: usr/local/www/firewall_nat.php:325 usr/local/www/firewall_nat_out.php:450
+#: usr/local/www/firewall_rules.php:421 usr/local/www/firewall_rules.php:450
+#: usr/local/www/firewall_rules.php:478 usr/local/www/firewall_rules.php:765
+msgid "move selected rules before this rule"
+msgstr "このルールの前に、選択したルールを移動"
+
+#: usr/local/www/firewall_nat_out.php:440 usr/local/www/firewall_nat.php:314
+#: usr/local/www/firewall_nat_out.php:451
+#: usr/local/www/firewall_nat_out.php:452 usr/local/www/firewall_nat.php:327
+#: usr/local/www/firewall_nat_out.php:449
+#: usr/local/www/firewall_nat_out.php:456 usr/local/www/firewall_nat.php:330
+#: usr/local/www/firewall_nat_out.php:455 usr/local/www/firewall_nat.php:330
+#: usr/local/www/firewall_nat_out.php:455
+msgid "add a new NAT based on this one"
+msgstr "この1に基づいて、新しいNATを追加"
+
+#: usr/local/www/firewall_nat_out.php:449
+#: usr/local/www/firewall_nat_out.php:460
+#: usr/local/www/firewall_nat_out.php:461
+#: usr/local/www/firewall_nat_out.php:458
+#: usr/local/www/firewall_nat_out.php:465
+#: usr/local/www/firewall_nat_out.php:464
+#: usr/local/www/firewall_nat_out.php:464
+msgid "move selected mappings to end"
+msgstr "終了するには、選択したマッピングを移動"
+
+#: usr/local/www/firewall_nat_out.php:453 usr/local/www/firewall_rules.php:391
+#: usr/local/www/firewall_rules.php:392 usr/local/www/firewall_rules.php:823
+#: usr/local/www/firewall_rules.php:824 usr/local/www/firewall_nat.php:209
+#: usr/local/www/firewall_nat.php:211 usr/local/www/firewall_nat.php:332
+#: usr/local/www/firewall_nat.php:334 usr/local/www/firewall_nat_out.php:464
+#: usr/local/www/firewall_rules.php:395 usr/local/www/firewall_rules.php:396
+#: usr/local/www/firewall_rules.php:825 usr/local/www/firewall_nat_out.php:465
+#: usr/local/www/firewall_nat.php:214 usr/local/www/firewall_nat.php:216
+#: usr/local/www/firewall_nat.php:345 usr/local/www/firewall_nat.php:347
+#: usr/local/www/firewall_rules.php:388 usr/local/www/firewall_rules.php:389
+#: usr/local/www/firewall_rules.php:817 usr/local/www/firewall_rules.php:818
+#: usr/local/www/firewall_nat_out.php:462
+#: usr/local/www/firewall_nat_out.php:469 usr/local/www/firewall_rules.php:386
+#: usr/local/www/firewall_rules.php:387 usr/local/www/firewall_rules.php:819
+#: usr/local/www/firewall_rules.php:820 usr/local/www/firewall_nat.php:217
+#: usr/local/www/firewall_nat.php:219 usr/local/www/firewall_nat.php:348
+#: usr/local/www/firewall_nat.php:350 usr/local/www/firewall_nat_out.php:468
+#: usr/local/www/firewall_nat.php:217 usr/local/www/firewall_nat.php:219
+#: usr/local/www/firewall_nat.php:348 usr/local/www/firewall_nat.php:350
+#: usr/local/www/firewall_nat_out.php:468 usr/local/www/firewall_rules.php:386
+#: usr/local/www/firewall_rules.php:387 usr/local/www/firewall_rules.php:819
+#: usr/local/www/firewall_rules.php:820
+msgid "delete selected rules"
+msgstr "選択したルールを削除"
+
+#: usr/local/www/firewall_nat_out.php:453
+#: usr/local/www/firewall_nat_out.php:464
+#: usr/local/www/firewall_nat_out.php:465
+#: usr/local/www/firewall_nat_out.php:462
+#: usr/local/www/firewall_nat_out.php:469
+#: usr/local/www/firewall_nat_out.php:468
+#: usr/local/www/firewall_nat_out.php:468
+msgid "delete selected mappings"
+msgstr "選択したマッピングを削除"
+
+#: usr/local/www/firewall_nat_out.php:453
+#: usr/local/www/firewall_nat_out.php:464
+#: usr/local/www/firewall_nat_out.php:465
+#: usr/local/www/firewall_nat_out.php:462
+#: usr/local/www/firewall_nat_out.php:469
+#: usr/local/www/firewall_nat_out.php:468
+#: usr/local/www/firewall_nat_out.php:468
+msgid "Do you really want to delete the selected mappings?"
+msgstr "あなたは本当に選択したマッピングを削除しますか?"
+
+#: usr/local/www/firewall_nat_out.php:461
+#: usr/local/www/firewall_nat_out.php:472
+#: usr/local/www/firewall_nat_out.php:473
+#: usr/local/www/firewall_nat_out.php:470
+#: usr/local/www/firewall_nat_out.php:477
+#: usr/local/www/firewall_nat_out.php:476
+#: usr/local/www/firewall_nat_out.php:476
+msgid ""
+"With automatic outbound NAT enabled, a mapping is automatically created for "
+"each interface's subnet (except WAN-type connections) and the rules on this "
+"page are ignored.<br /><br /> If manual outbound NAT is enabled, outbound NAT "
+"rules will not be automatically generated and only the mappings you specify "
+"on this page will be used. <br /><br /> If a target address other than a WAN-"
+"type interface's IP address is used, then depending on the way the WAN "
+"connection is setup, a "
+msgstr "「自動アウトバウンドでのNATは、有効なマッピングが自動的にのために作成されている「 (WAN型の接続を除く)各インターフェイスのサブネットとこれに関するルールはルール」ページには、手動のアウトバウンドNATが有効になっている場合、アウトバウンドNAT ignored.<br /><br />です」自動的に生成されることはありませんし、指定したマッピングのみ」このページでは。 <br /><br />を使用する場合は、WAN以外のターゲットアドレス」タイプのインタフェースのIPアドレスは、次にように、WANに応じて、使用されている「接続セットアップ、 aは"
+
+#: usr/local/www/firewall_nat_out.php:469
+#: usr/local/www/firewall_nat_out_edit.php:588
+#: usr/local/www/carp_status.php:139
+#: usr/local/www/system_gateway_groups_edit.php:252
+#: usr/local/www/firewall_nat_out.php:480
+#: usr/local/www/firewall_nat_out_edit.php:601
+#: usr/local/www/system_gateway_groups_edit.php:312
+#: usr/local/www/firewall_nat_out.php:481 usr/local/www/carp_status.php:132
+#: usr/local/www/firewall_nat_out.php:478
+#: usr/local/www/firewall_nat_out_edit.php:604
+#: usr/local/www/firewall_nat_out.php:485
+#: usr/local/www/system_gateway_groups_edit.php:316
+#: usr/local/www/firewall_nat_out_edit.php:616
+#: usr/local/www/firewall_nat_out.php:484
+#: usr/local/www/firewall_nat_out.php:484
+#: usr/local/www/system_gateway_groups_edit.php:316
+#: usr/local/www/firewall_nat_out_edit.php:616
+#: usr/local/www/carp_status.php:132
+msgid "Virtual IP"
+msgstr "仮想IP"
+
+#: usr/local/www/firewall_nat_out.php:470
+#: usr/local/www/firewall_nat_out.php:481
+#: usr/local/www/firewall_nat_out.php:482
+#: usr/local/www/firewall_nat_out.php:479
+#: usr/local/www/firewall_nat_out.php:486
+#: usr/local/www/firewall_nat_out.php:485
+#: usr/local/www/firewall_nat_out.php:485
+msgid " may also be required."
+msgstr "また必要とされ得る。"
+
+#: usr/local/www/firewall_nat_out.php:472
+#: usr/local/www/firewall_nat_out.php:483
+#: usr/local/www/firewall_nat_out.php:484
+#: usr/local/www/firewall_nat_out.php:481
+#: usr/local/www/firewall_nat_out.php:488
+#: usr/local/www/firewall_nat_out.php:487
+#: usr/local/www/firewall_nat_out.php:487
+msgid ""
+"To completely disable outbound NAT, switch to Manual Outbound NAT then "
+"delete any NAT rules that appear in the list."
+msgstr "「完全に無効にするアウトバウンドNAT、手動アウトバウンドNATへの切り替えが、その後には「リストに表示されるすべてのNATルールを削除。"
+
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:140
+msgid "Source bit count"
+msgstr "ソースビット数"
+
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_rules_edit.php:310
+#: usr/local/www/firewall_rules_edit.php:334
+#: usr/local/www/firewall_rules_edit.php:333
+#: usr/local/www/firewall_rules_edit.php:336
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_rules_edit.php:342
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_rules_edit.php:342
+#: usr/local/www/firewall_nat_out_edit.php:140
+msgid "Destination bit count"
+msgstr "先のビット数"
+
+#: usr/local/www/firewall_nat_out_edit.php:137
+#: usr/local/www/firewall_nat_out_edit.php:150
+#: usr/local/www/firewall_nat_out_edit.php:154
+#: usr/local/www/firewall_nat_out_edit.php:160
+#: usr/local/www/firewall_nat_out_edit.php:160
+msgid ""
+"You must supply either a valid port or port alias for the source port entry."
+msgstr ""あなたは、ソースポートのエントリの有効なポートまたはポートの別名のいずれかを指定する必要があります。"
+
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:153
+#: usr/local/www/firewall_nat_out_edit.php:157
+#: usr/local/www/firewall_nat_out_edit.php:163
+#: usr/local/www/firewall_nat_out_edit.php:163
+msgid ""
+"You must supply either a valid port or port alias for the destination port "
+"entry."
+msgstr "エントリ"あなたは、宛先ポートの有効なポートまたはポートの別名のいずれかを指定する必要があります」 。"
+
+#: usr/local/www/firewall_nat_out_edit.php:143
+#: usr/local/www/firewall_nat_out_edit.php:156
+#: usr/local/www/firewall_nat_out_edit.php:160
+#: usr/local/www/firewall_nat_out_edit.php:166
+#: usr/local/www/firewall_nat_out_edit.php:166
+msgid "You must supply a valid port for the NAT port entry."
+msgstr "あなたは、NATのポートエントリの有効なポートを指定する必要があります。"
+
+#: usr/local/www/firewall_nat_out_edit.php:147
+#: usr/local/www/firewall_nat_out_edit.php:160
+#: usr/local/www/firewall_nat_out_edit.php:164
+#: usr/local/www/firewall_nat_out_edit.php:170
+#: usr/local/www/firewall_nat_out_edit.php:170
+msgid "A valid source must be specified."
+msgstr "有効なソースを指定する必要があります。"
+
+#: usr/local/www/firewall_nat_out_edit.php:155
+#: usr/local/www/firewall_nat_out_edit.php:168
+#: usr/local/www/firewall_nat_out_edit.php:172
+#: usr/local/www/firewall_nat_out_edit.php:178
+#: usr/local/www/firewall_nat_out_edit.php:178
+msgid "A valid destination must be specified."
+msgstr "有効な宛先を指定する必要があります。"
+
+#: usr/local/www/firewall_nat_out_edit.php:163
+#: usr/local/www/firewall_nat_out_edit.php:176
+#: usr/local/www/firewall_nat_out_edit.php:180
+#: usr/local/www/firewall_nat_out_edit.php:186
+#: usr/local/www/firewall_nat_out_edit.php:186
+msgid "Negating destination address of "any" is invalid."
+msgstr "の否定宛先アドレス「any」は、無効です。"
+
+#: usr/local/www/firewall_nat_out_edit.php:168
+#: usr/local/www/firewall_nat_out_edit.php:181
+#: usr/local/www/firewall_nat_out_edit.php:185
+#: usr/local/www/firewall_nat_out_edit.php:191
+#: usr/local/www/firewall_nat_out_edit.php:191
+msgid "A valid target IP address must be specified."
+msgstr "有効なターゲットIPアドレスを指定する必要があります。"
+
+#: usr/local/www/firewall_nat_out_edit.php:173
+#: usr/local/www/firewall_nat_out_edit.php:186
+#: usr/local/www/firewall_nat_out_edit.php:190
+#: usr/local/www/firewall_nat_out_edit.php:196
+#: usr/local/www/firewall_nat_out_edit.php:196
+msgid "A valid target IP must be specified when using the 'Other Subnet' type."
+msgstr "「その他サブネット」タイプを使用している場合、有効なターゲットIPを指定する必要があります。"
+
+#: usr/local/www/firewall_nat_out_edit.php:176
+#: usr/local/www/firewall_nat_out_edit.php:189
+#: usr/local/www/firewall_nat_out_edit.php:193
+#: usr/local/www/firewall_nat_out_edit.php:199
+#: usr/local/www/firewall_nat_out_edit.php:199
+msgid ""
+"A valid target bit count must be specified when using the 'Other Subnet' "
+"type."
+msgstr "タイプ ""その他のサブネットを「使用している場合、有効なターゲットビット数を指定する必要があります」 。"
+
+#: usr/local/www/firewall_nat_out_edit.php:189
+#: usr/local/www/firewall_nat_out_edit.php:202
+#: usr/local/www/firewall_nat_out_edit.php:206
+#: usr/local/www/firewall_nat_out_edit.php:212
+#: usr/local/www/firewall_nat_out_edit.php:212
+msgid "Only Round Robin pool options may be chosen when selecting an alias."
+msgstr "エイリアスを選択するときにのみラウンドロビン·プール·オプションを選択することができる。"
+
+#: usr/local/www/firewall_nat_out_edit.php:403
+#: usr/local/www/firewall_nat_out_edit.php:416
+#: usr/local/www/firewall_nat_out_edit.php:420
+#: usr/local/www/firewall_nat_out_edit.php:432
+#: usr/local/www/firewall_nat_out_edit.php:432
+msgid "Edit Advanced Outbound NAT entry"
+msgstr "編集高度なアウトバウンドのNATエントリ"
+
+#: usr/local/www/firewall_nat_out_edit.php:410
+#: usr/local/www/firewall_nat_out_edit.php:423
+#: usr/local/www/firewall_nat_out_edit.php:427
+#: usr/local/www/firewall_nat_out_edit.php:439
+#: usr/local/www/firewall_nat_out_edit.php:439
+msgid "Do not NAT"
+msgstr "しないで、NAT"
+
+#: usr/local/www/firewall_nat_out_edit.php:413
+#: usr/local/www/firewall_nat_out_edit.php:426
+#: usr/local/www/firewall_nat_out_edit.php:430
+#: usr/local/www/firewall_nat_out_edit.php:442
+#: usr/local/www/firewall_nat_out_edit.php:442
+msgid ""
+"Enabling this option will disable NAT for traffic matching this rule and "
+"stop processing Outbound NAT rules."
+msgstr ""このオプションを有効にすると、このルールに一致するトラフィックのNATを無効にします「アウトバウンドNATルールの処理を停止する。"
+
+#: usr/local/www/firewall_nat_out_edit.php:414
+#: usr/local/www/firewall_nat_out_edit.php:427
+#: usr/local/www/firewall_nat_out_edit.php:431
+#: usr/local/www/firewall_nat_out_edit.php:443
+#: usr/local/www/firewall_nat_out_edit.php:443
+msgid "Hint: in most cases, you won't use this option."
+msgstr "ヒント:ほとんどの場合、このオプションを使用することはありません。"
+
+#: usr/local/www/firewall_nat_out_edit.php:463
+#: usr/local/www/firewall_nat_out_edit.php:476
+#: usr/local/www/firewall_nat_out_edit.php:480
+#: usr/local/www/firewall_nat_out_edit.php:492
+#: usr/local/www/firewall_nat_out_edit.php:492
+msgid "Choose which protocol this rule should match."
+msgstr "選択したどのプロトコルこのルールが一致している必要があります。"
+
+#: usr/local/www/firewall_nat_out_edit.php:464
+#: usr/local/www/firewall_nat_out_edit.php:477
+#: usr/local/www/firewall_nat_out_edit.php:481
+#: usr/local/www/firewall_nat_out_edit.php:493
+#: usr/local/www/firewall_nat_out_edit.php:493
+#, php-format
+msgid "Hint: in most cases, you should specify %s any %s here."
+msgstr "ヒント:ほとんどの場合、あなたはここでどんな%s %s指定する必要があります。"
+
+#: usr/local/www/firewall_nat_out_edit.php:488
+#: usr/local/www/firewall_nat_out_edit.php:501
+#: usr/local/www/firewall_nat_out_edit.php:505
+#: usr/local/www/firewall_nat_out_edit.php:517
+#: usr/local/www/firewall_nat_out_edit.php:519
+#: usr/local/www/firewall_nat_out_edit.php:519
+msgid "Enter the source network for the outbound NAT mapping."
+msgstr "アウトバウンドのNATマッピングのソース·ネットワークを入力してください。"
+
+#: usr/local/www/firewall_nat_out_edit.php:491
+#: usr/local/www/firewall_nat_out_edit.php:504
+#: usr/local/www/firewall_nat_out_edit.php:508
+#: usr/local/www/firewall_nat_out_edit.php:520
+#: usr/local/www/firewall_nat_out_edit.php:522
+#: usr/local/www/firewall_nat_out_edit.php:522
+msgid "Source port:"
+msgstr "送信元ポート:"
+
+#: usr/local/www/firewall_nat_out_edit.php:492
+#: usr/local/www/firewall_nat_out_edit.php:505
+#: usr/local/www/firewall_nat_out_edit.php:509
+#: usr/local/www/firewall_nat_out_edit.php:521
+msgid ""
+"(leave \n"
+"blank for any)"
+msgstr "「 (任意の空白の\nのままに」 )"
+
+#: usr/local/www/firewall_nat_out_edit.php:526
+#: usr/local/www/firewall_nat_out_edit.php:539
+#: usr/local/www/firewall_nat_out_edit.php:543
+#: usr/local/www/firewall_nat_out_edit.php:555
+#: usr/local/www/firewall_nat_out_edit.php:556
+#: usr/local/www/firewall_nat_out_edit.php:556
+msgid "Enter the destination network for the outbound NAT mapping."
+msgstr "アウトバウンドのNATマッピングのために宛先ネットワークを入力します。"
+
+#: usr/local/www/firewall_nat_out_edit.php:530
+#: usr/local/www/firewall_nat_out_edit.php:543
+#: usr/local/www/firewall_nat_out_edit.php:547
+#: usr/local/www/firewall_nat_out_edit.php:559
+#: usr/local/www/firewall_nat_out_edit.php:560
+#: usr/local/www/firewall_nat_out_edit.php:560
+msgid "Destination port:"
+msgstr "宛先ポート:"
+
+#: usr/local/www/firewall_nat_out_edit.php:531
+#: usr/local/www/firewall_nat_out_edit.php:544
+#: usr/local/www/firewall_nat_out_edit.php:548
+#: usr/local/www/firewall_nat_out_edit.php:560
+msgid ""
+"(leave blank for \n"
+"any)"
+msgstr "「 (いずれかを\nは空白のままに」 )"
+
+#: usr/local/www/firewall_nat_out_edit.php:538
+#: usr/local/www/firewall_nat_out_edit.php:551
+#: usr/local/www/firewall_nat_out_edit.php:555
+#: usr/local/www/firewall_nat_out_edit.php:567
+#: usr/local/www/firewall_nat_out_edit.php:567
+msgid "Translation"
+msgstr "翻訳"
+
+#: usr/local/www/firewall_nat_out_edit.php:544
+#: usr/local/www/firewall_nat_out_edit.php:557
+#: usr/local/www/firewall_nat_out_edit.php:561
+#: usr/local/www/firewall_nat_out_edit.php:573
+#: usr/local/www/firewall_nat_out_edit.php:573
+msgid "Interface address"
+msgstr "インターフェース·アドレス"
+
+#: usr/local/www/firewall_nat_out_edit.php:568
+#: usr/local/www/firewall_nat_out_edit.php:581
+#: usr/local/www/firewall_nat_out_edit.php:585
+#: usr/local/www/firewall_nat_out_edit.php:597
+#: usr/local/www/firewall_nat_out_edit.php:597
+msgid "Other Subnet (Enter Below)"
+msgstr "他のサブネット(下記に入力)"
+
+#: usr/local/www/firewall_nat_out_edit.php:575
+#: usr/local/www/firewall_nat_out_edit.php:588
+#: usr/local/www/firewall_nat_out_edit.php:591
+#: usr/local/www/firewall_nat_out_edit.php:603
+#: usr/local/www/firewall_nat_out_edit.php:603
+msgid "Other Subnet:"
+msgstr "その他サブネット:"
+
+#: usr/local/www/firewall_nat_out_edit.php:586
+#: usr/local/www/firewall_nat_out_edit.php:599
+#: usr/local/www/firewall_nat_out_edit.php:602
+#: usr/local/www/firewall_nat_out_edit.php:614
+#: usr/local/www/firewall_nat_out_edit.php:614
+msgid "Packets matching this rule will be mapped to the IP address given here."
+msgstr "このルールに一致するパケットは、ここで指定したIPアドレスにマッピングされます。"
+
+#: usr/local/www/firewall_nat_out_edit.php:587
+#: usr/local/www/firewall_nat_out_edit.php:600
+#: usr/local/www/firewall_nat_out_edit.php:603
+#: usr/local/www/firewall_nat_out_edit.php:615
+#: usr/local/www/firewall_nat_out_edit.php:615
+msgid ""
+"If you want this rule to apply to another IP address rather than the IP "
+"address of the interface chosen above, select it here (you will need to "
+"define "
+msgstr "上記選択したインターフェイスのアドレスが「このルールはIPではなく別のIPアドレスに適用する場合は、「 (あなたは「定義する必要があります、ここでそれを選択"
+
+#: usr/local/www/firewall_nat_out_edit.php:588
+#: usr/local/www/firewall_nat_out_edit.php:601
+#: usr/local/www/firewall_nat_out_edit.php:604
+#: usr/local/www/firewall_nat_out_edit.php:616
+#: usr/local/www/firewall_nat_out_edit.php:616
+msgid "addresses on the interface first)."
+msgstr "インターフェイス上のアドレスが最初) 。"
+
+#: usr/local/www/firewall_nat_out_edit.php:589
+#: usr/local/www/firewall_nat_out_edit.php:602
+msgid ""
+"Also note that if you are trying to redirect connections on the LAN select "
+"the "any" option."
+msgstr ""すべての"オプション"また、あなたは、LAN上の接続をリダイレクトしようとする場合に選択していることに注意してください」 。"
+
+#: usr/local/www/firewall_nat_out_edit.php:605
+#: usr/local/www/firewall_nat_out_edit.php:618
+#: usr/local/www/firewall_nat_out_edit.php:620
+#: usr/local/www/firewall_nat_out_edit.php:632
+#: usr/local/www/firewall_nat_out_edit.php:632
+msgid ""
+"Only Round Robin types work with Host Aliases. Any type can be used with a "
+"Subnet."
+msgstr ""唯一のラウンドロビン·タイプは、ホスト別名で動作します。任意のタイプで使用できる「サブネット。"
+
+#: usr/local/www/firewall_nat_out_edit.php:606
+#: usr/local/www/firewall_nat_out_edit.php:619
+#: usr/local/www/firewall_nat_out_edit.php:621
+#: usr/local/www/firewall_nat_out_edit.php:633
+#: usr/local/www/firewall_nat_out_edit.php:633
+msgid "Round Robin: Loops through the translation addresses."
+msgstr "ラウンドロビン:翻訳·アドレスをループします。"
+
+#: usr/local/www/firewall_nat_out_edit.php:607
+#: usr/local/www/firewall_nat_out_edit.php:620
+#: usr/local/www/firewall_nat_out_edit.php:622
+#: usr/local/www/firewall_nat_out_edit.php:634
+#: usr/local/www/firewall_nat_out_edit.php:634
+msgid "Random: Selects an address from the translation address pool at random."
+msgstr "ランダム:ランダムに変換アドレスプールからアドレスを選択する。"
+
+#: usr/local/www/firewall_nat_out_edit.php:608
+#: usr/local/www/firewall_nat_out_edit.php:621
+#: usr/local/www/firewall_nat_out_edit.php:623
+#: usr/local/www/firewall_nat_out_edit.php:635
+#: usr/local/www/firewall_nat_out_edit.php:635
+msgid ""
+"Source Hash: Uses a hash of the source address to determine the translation "
+"address, ensuring that the redirection address is always the same for a "
+"given source."
+msgstr "リダイレクションアドレスが「与えられたソースのために、常に同じであることを保証し、アドレス: 「ソースハッシュは翻訳を決定するために、送信元アドレスのハッシュを使用します」 。"
+
+#: usr/local/www/firewall_nat_out_edit.php:609
+#: usr/local/www/firewall_nat_out_edit.php:622
+#: usr/local/www/firewall_nat_out_edit.php:624
+#: usr/local/www/firewall_nat_out_edit.php:636
+#: usr/local/www/firewall_nat_out_edit.php:636
+msgid ""
+"Bitmask: Applies the subnet mask and keeps the last portion identical; "
+"10.0.1.50 -&gt; x.x.x.50."
+msgstr "「ビットマスク:サブネットマスクを適用し、同一の最後の部分を保持し、 「 10.0.1.50は - u003e xxx50 。"
+
+#: usr/local/www/firewall_nat_out_edit.php:610
+#: usr/local/www/firewall_nat_out_edit.php:623
+#: usr/local/www/firewall_nat_out_edit.php:625
+#: usr/local/www/firewall_nat_out_edit.php:637
+#: usr/local/www/firewall_nat_out_edit.php:637
+msgid ""
+"Sticky Address: The Sticky Address option can be used with the Random and "
+"Round Robin pool types to ensure that a particular source address is always "
+"mapped to the same translation address."
+msgstr "「スティッキー住所:スティッキーアドレスオプションがランダムで一緒に使用することができる」とは、特定の送信元アドレスは、常に「同じ変換アドレスにマップされていることを保証するためにラウンドロビンプールタイプ。"
+
+#: usr/local/www/firewall_nat_out_edit.php:615
+#: usr/local/www/firewall_nat_out_edit.php:628
+#: usr/local/www/firewall_nat_out_edit.php:630
+#: usr/local/www/firewall_nat_out_edit.php:642
+#: usr/local/www/firewall_nat_out_edit.php:642
+msgid "Port:"
+msgstr "ポート:"
+
+#: usr/local/www/firewall_nat_out_edit.php:619
+#: usr/local/www/firewall_nat_out_edit.php:632
+#: usr/local/www/firewall_nat_out_edit.php:634
+#: usr/local/www/firewall_nat_out_edit.php:646
+#: usr/local/www/firewall_nat_out_edit.php:646
+msgid "Enter the source port for the outbound NAT mapping."
+msgstr "アウトバウンドのNATマッピングのために送信元ポートを入力します。"
+
+#: usr/local/www/firewall_nat_out_edit.php:622
+#: usr/local/www/firewall_nat_out_edit.php:635
+#: usr/local/www/firewall_nat_out_edit.php:637
+#: usr/local/www/firewall_nat_out_edit.php:649
+#: usr/local/www/firewall_nat_out_edit.php:649
+msgid "Static-port:"
+msgstr "静的ポート:"
+
+#: usr/local/www/firewall_nat_out_edit.php:632
+#: usr/local/www/firewall_nat_out_edit.php:645
+msgid ""
+"HINT: This prevents the rule from automatically syncing to other CARP "
+"members."
+msgstr ""ヒント:これは、自動的に他のCARPと同期からルールを防ぐ」のメンバー。"
+
+#: usr/local/www/firewall_rules.php:52
+#: usr/local/www/firewall_rules_edit.php:628 usr/local/www/fbegin.inc:112
+#: usr/local/www/fbegin.inc:129 usr/local/www/firewall_rules_edit.php:660
+#: usr/local/www/fbegin.inc:138 usr/local/www/firewall_rules_edit.php:661
+#: usr/local/www/firewall_rules.php:49
+#: usr/local/www/firewall_rules_edit.php:664
+#: usr/local/www/diag_system_pftop.php:139 usr/local/www/fbegin.inc:130
+#: usr/local/www/firewall_rules_edit.php:676
+#: usr/local/www/firewall_rules_edit.php:676
+#: usr/local/www/diag_system_pftop.php:139 usr/local/www/firewall_rules.php:49
+#: usr/local/www/fbegin.inc:130
+msgid "Rules"
+msgstr "ルール"
+
+#: usr/local/www/firewall_rules.php:129
+#: usr/local/www/firewall_rules_edit.php:828
+#: usr/local/www/firewall_rules_edit.php:863
+#: usr/local/www/firewall_rules.php:127
+#: usr/local/www/firewall_rules_edit.php:866
+#: usr/local/www/firewall_rules_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules.php:127
+msgid "Echo request"
+msgstr "エコー要求"
+
+#: usr/local/www/firewall_rules.php:130
+#: usr/local/www/firewall_rules_edit.php:829
+#: usr/local/www/firewall_rules_edit.php:864
+#: usr/local/www/firewall_rules.php:128
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_rules_edit.php:879
+#: usr/local/www/firewall_rules_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:878
+#: usr/local/www/firewall_rules.php:128
+msgid "Echo reply"
+msgstr "エコー応答"
+
+#: usr/local/www/firewall_rules.php:131
+#: usr/local/www/firewall_rules_edit.php:830
+#: usr/local/www/firewall_rules_edit.php:865
+#: usr/local/www/firewall_rules.php:129
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/firewall_rules_edit.php:879
+#: usr/local/www/firewall_rules_edit.php:879
+#: usr/local/www/firewall_rules.php:129
+msgid "Destination unreachable"
+msgstr "宛先到達不能"
+
+#: usr/local/www/firewall_rules.php:132
+#: usr/local/www/firewall_rules_edit.php:831
+#: usr/local/www/firewall_rules_edit.php:866
+#: usr/local/www/firewall_rules.php:130
+#: usr/local/www/firewall_rules_edit.php:869
+#: usr/local/www/firewall_rules_edit.php:881
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/firewall_rules.php:130
+msgid "Source quench"
+msgstr "送信元抑制"
+
+#: usr/local/www/firewall_rules.php:133
+#: usr/local/www/firewall_rules_edit.php:832
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_rules.php:131
+#: usr/local/www/firewall_rules_edit.php:870
+#: usr/local/www/firewall_rules_edit.php:882
+#: usr/local/www/firewall_rules_edit.php:881
+#: usr/local/www/firewall_rules_edit.php:881
+#: usr/local/www/firewall_rules.php:131
+msgid "Redirect"
+msgstr "リダイレクト"
+
+#: usr/local/www/firewall_rules.php:134
+#: usr/local/www/firewall_rules_edit.php:833
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_rules.php:132
+#: usr/local/www/firewall_rules_edit.php:871
+#: usr/local/www/firewall_rules_edit.php:883
+#: usr/local/www/firewall_rules_edit.php:882
+#: usr/local/www/firewall_rules_edit.php:882
+#: usr/local/www/firewall_rules.php:132
+msgid "Alternate Host"
+msgstr "中間宿主"
+
+#: usr/local/www/firewall_rules.php:135
+#: usr/local/www/firewall_rules_edit.php:834
+#: usr/local/www/firewall_rules_edit.php:869
+#: usr/local/www/firewall_rules.php:133
+#: usr/local/www/firewall_rules_edit.php:872
+#: usr/local/www/firewall_rules_edit.php:884
+#: usr/local/www/firewall_rules_edit.php:883
+#: usr/local/www/firewall_rules_edit.php:883
+#: usr/local/www/firewall_rules.php:133
+msgid "Router advertisement"
+msgstr "ルーター通知"
+
+#: usr/local/www/firewall_rules.php:136
+#: usr/local/www/firewall_rules_edit.php:835
+#: usr/local/www/firewall_rules_edit.php:870
+#: usr/local/www/firewall_rules.php:134
+#: usr/local/www/firewall_rules_edit.php:873
+#: usr/local/www/firewall_rules_edit.php:885
+#: usr/local/www/firewall_rules_edit.php:884
+#: usr/local/www/firewall_rules_edit.php:884
+#: usr/local/www/firewall_rules.php:134
+msgid "Router solicitation"
+msgstr "ルータ要請"
+
+#: usr/local/www/firewall_rules.php:137
+#: usr/local/www/firewall_rules_edit.php:836
+#: usr/local/www/firewall_rules_edit.php:871
+#: usr/local/www/firewall_rules.php:135
+#: usr/local/www/firewall_rules_edit.php:874
+#: usr/local/www/firewall_rules_edit.php:886
+#: usr/local/www/firewall_rules_edit.php:885
+#: usr/local/www/firewall_rules_edit.php:885
+#: usr/local/www/firewall_rules.php:135
+msgid "Time exceeded"
+msgstr "時間超過"
+
+#: usr/local/www/firewall_rules.php:138
+#: usr/local/www/firewall_rules_edit.php:837
+#: usr/local/www/firewall_rules_edit.php:872
+#: usr/local/www/firewall_rules.php:136
+#: usr/local/www/firewall_rules_edit.php:875
+#: usr/local/www/firewall_rules_edit.php:887
+#: usr/local/www/firewall_rules_edit.php:886
+#: usr/local/www/firewall_rules_edit.php:886
+#: usr/local/www/firewall_rules.php:136
+msgid "Invalid IP header"
+msgstr "無効なIPヘッダー"
+
+#: usr/local/www/firewall_rules.php:139
+#: usr/local/www/firewall_rules_edit.php:838
+#: usr/local/www/firewall_rules_edit.php:873
+#: usr/local/www/firewall_rules.php:137
+#: usr/local/www/firewall_rules_edit.php:876
+#: usr/local/www/firewall_rules_edit.php:888
+#: usr/local/www/firewall_rules_edit.php:887
+#: usr/local/www/firewall_rules_edit.php:887
+#: usr/local/www/firewall_rules.php:137
+msgid "Timestamp"
+msgstr "タイムスタンプ"
+
+#: usr/local/www/firewall_rules.php:140
+#: usr/local/www/firewall_rules_edit.php:839
+#: usr/local/www/firewall_rules_edit.php:874
+#: usr/local/www/firewall_rules.php:138
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules_edit.php:889
+#: usr/local/www/firewall_rules_edit.php:888
+#: usr/local/www/firewall_rules_edit.php:888
+#: usr/local/www/firewall_rules.php:138
+msgid "Timestamp reply"
+msgstr "タイムスタンプ応答"
+
+#: usr/local/www/firewall_rules.php:141
+#: usr/local/www/firewall_rules_edit.php:840
+#: usr/local/www/firewall_rules_edit.php:875
+#: usr/local/www/firewall_rules.php:139
+#: usr/local/www/firewall_rules_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:890
+#: usr/local/www/firewall_rules_edit.php:889
+#: usr/local/www/firewall_rules_edit.php:889
+#: usr/local/www/firewall_rules.php:139
+msgid "Information request"
+msgstr "情報要求"
+
+#: usr/local/www/firewall_rules.php:142
+#: usr/local/www/firewall_rules_edit.php:841
+#: usr/local/www/firewall_rules_edit.php:876
+#: usr/local/www/firewall_rules.php:140
+#: usr/local/www/firewall_rules_edit.php:879
+#: usr/local/www/firewall_rules_edit.php:891
+#: usr/local/www/firewall_rules_edit.php:890
+#: usr/local/www/firewall_rules_edit.php:890
+#: usr/local/www/firewall_rules.php:140
+msgid "Information reply"
+msgstr "情報応答"
+
+#: usr/local/www/firewall_rules.php:143
+#: usr/local/www/firewall_rules_edit.php:842
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules.php:141
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/firewall_rules_edit.php:892
+#: usr/local/www/firewall_rules_edit.php:891
+#: usr/local/www/firewall_rules_edit.php:891
+#: usr/local/www/firewall_rules.php:141
+msgid "Address mask request"
+msgstr "アドレスマスク要求"
+
+#: usr/local/www/firewall_rules.php:144
+#: usr/local/www/firewall_rules_edit.php:843
+#: usr/local/www/firewall_rules_edit.php:878
+#: usr/local/www/firewall_rules.php:142
+#: usr/local/www/firewall_rules_edit.php:881
+#: usr/local/www/firewall_rules_edit.php:893
+#: usr/local/www/firewall_rules_edit.php:892
+#: usr/local/www/firewall_rules_edit.php:892
+#: usr/local/www/firewall_rules.php:142
+msgid "Address mask reply"
+msgstr "アドレスマスク応答"
+
+#: usr/local/www/firewall_rules.php:201 usr/local/www/firewall_rules.php:205
+#: usr/local/www/firewall_rules.php:203 usr/local/www/firewall_rules.php:203
+#, php-format
+msgid ""
+"The settings have been applied. The firewall rules are now reloading in the "
+"background.<br />You can also %s monitor %s the reload progress"
+msgstr "「設定が適用されています。ファイアウォールのルールは今にリロードされる「 background.<br />Youこともモニターがリロードの進行状況を%s %sでき"
+
+#: usr/local/www/firewall_rules.php:315 usr/local/www/firewall_rules.php:317
+#: usr/local/www/firewall_rules.php:319 usr/local/www/firewall_rules.php:321
+#: usr/local/www/firewall_rules.php:312 usr/local/www/firewall_rules.php:314
+msgid ""
+"The firewall rule configuration has been changed.<br />You must apply the "
+"changes in order for them to take effect."
+msgstr "「ファイアウォールルールの設定が変更されています。あなたが適用する必要がありますポスター「それらを有効にするために変更を。"
+
+#: usr/local/www/firewall_rules.php:338 usr/local/www/firewall_rules.php:342
+#: usr/local/www/firewall_rules.php:335 usr/local/www/firewall_rules.php:334
+#: usr/local/www/firewall_rules.php:334
+msgid "Floating"
+msgstr "フローティング"
+
+#: usr/local/www/firewall_rules.php:359
+#: usr/local/www/load_balancer_relay_action_edit.php:510
+#: usr/local/www/load_balancer_relay_action_edit.php:509
+#: usr/local/www/firewall_rules.php:363
+#: usr/local/www/load_balancer_relay_action_edit.php:507
+#: usr/local/www/firewall_rules.php:356 usr/local/www/firewall_rules.php:354
+#: usr/local/www/load_balancer_relay_action_edit.php:507
+#: usr/local/www/firewall_rules.php:354
+msgid "ID"
+msgstr "ID"
+
+#: usr/local/www/firewall_rules.php:368
+#: usr/local/www/firewall_rules_edit.php:1288 usr/local/www/interfaces.php:420
+#: usr/local/www/interfaces.php:473 usr/local/www/interfaces.php:1382
+#: usr/local/www/system_routes.php:127 usr/local/www/system_routes_edit.php:91
+#: usr/local/www/system_routes_edit.php:199
+#: usr/local/www/services_dhcp.php:655 usr/local/www/status_gateways.php:73
+#: usr/local/www/system_gateways.php:154
+#: usr/local/www/system_gateways_edit.php:376
+#: usr/local/www/services_dhcpv6.php:599
+#: usr/local/www/system_routes_edit.php:92
+#: usr/local/www/system_routes_edit.php:231
+#: usr/local/www/firewall_rules_edit.php:1355
+#: usr/local/www/firewall_rules.php:372
+#: usr/local/www/system_gateways_edit.php:397
+#: usr/local/www/services_dhcp.php:668 usr/local/www/interfaces.php:456
+#: usr/local/www/interfaces.php:509 usr/local/www/interfaces.php:1486
+#: usr/local/www/system_routes_edit.php:232
+#: usr/local/www/firewall_rules.php:365
+#: usr/local/www/system_gateways_edit.php:503
+#: usr/local/www/status_gateways.php:74 usr/local/www/services_dhcp.php:844
+#: usr/local/www/interfaces.php:453 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:1474
+#: usr/local/www/system_gateways_edit.php:506
+#: usr/local/www/firewall_rules_edit.php:1370
+#: usr/local/www/services_dhcp_edit.php:410
+#: usr/local/www/diag_traceroute.php:98 usr/local/www/system_routes.php:131
+#: usr/local/www/services_dhcp.php:858 usr/local/www/interfaces.php:441
+#: usr/local/www/interfaces.php:494 usr/local/www/interfaces.php:1487
+#: usr/local/www/system_gateways_edit.php:508
+#: usr/local/www/firewall_rules_edit.php:1377
+#: usr/local/www/services_dhcp.php:878 usr/local/www/system_routes_edit.php:95
+#: usr/local/www/system_routes_edit.php:259
+#: usr/local/www/firewall_rules.php:363 usr/local/www/interfaces.php:446
+#: usr/local/www/interfaces.php:499 usr/local/www/interfaces.php:1532
+#: usr/local/www/system_gateways_edit.php:538
+#: usr/local/www/firewall_rules_edit.php:1388
+#: usr/local/www/system_routes.php:147
+#: usr/local/www/system_routes_edit.php:261 usr/local/www/interfaces.php:442
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:1526
+#: usr/local/www/system_gateways_edit.php:538
+#: usr/local/www/firewall_rules_edit.php:1388
+#: usr/local/www/services_dhcp_edit.php:410
+#: usr/local/www/system_routes.php:147 usr/local/www/services_dhcp.php:878
+#: usr/local/www/system_routes_edit.php:97
+#: usr/local/www/system_routes_edit.php:255
+#: usr/local/www/firewall_rules.php:363 usr/local/www/system_gateways.php:154
+#: usr/local/www/status_gateways.php:74 usr/local/www/interfaces.php:442
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:1526
+msgid "Gateway"
+msgstr "ゲートウェイ"
+
+#: usr/local/www/firewall_rules.php:369 usr/local/www/status_queues.php:135
+#: usr/local/www/status_queues.php:142 usr/local/www/firewall_rules.php:373
+#: usr/local/www/status_queues.php:143 usr/local/www/firewall_rules.php:366
+#: usr/local/www/diag_system_pftop.php:138 usr/local/www/status_queues.php:148
+#: usr/local/www/firewall_rules.php:364
+#: usr/local/www/diag_system_pftop.php:138
+#: usr/local/www/firewall_rules.php:364 usr/local/www/status_queues.php:148
+msgid "Queue"
+msgstr "キュー"
+
+#: usr/local/www/firewall_rules.php:370
+#: usr/local/www/firewall_rules_edit.php:1261
+#: usr/local/www/firewall_rules_edit.php:1328
+#: usr/local/www/firewall_rules.php:374 usr/local/www/firewall_rules.php:367
+#: usr/local/www/firewall_rules_edit.php:1343
+#: usr/local/www/firewall_rules_edit.php:1350
+#: usr/local/www/firewall_rules.php:365
+#: usr/local/www/firewall_rules_edit.php:1361
+#: usr/local/www/firewall_rules_edit.php:1361
+#: usr/local/www/firewall_rules.php:365
+msgid "Schedule"
+msgstr "スケジュール"
+
+#: usr/local/www/firewall_rules.php:392 usr/local/www/firewall_rules.php:824
+#: usr/local/www/firewall_nat.php:211 usr/local/www/firewall_nat.php:334
+#: usr/local/www/firewall_rules.php:396 usr/local/www/firewall_rules.php:825
+#: usr/local/www/firewall_nat.php:216 usr/local/www/firewall_nat.php:347
+#: usr/local/www/firewall_rules.php:389 usr/local/www/firewall_rules.php:818
+#: usr/local/www/firewall_rules.php:387 usr/local/www/firewall_rules.php:820
+#: usr/local/www/firewall_nat.php:219 usr/local/www/firewall_nat.php:350
+#: usr/local/www/firewall_nat.php:219 usr/local/www/firewall_nat.php:350
+#: usr/local/www/firewall_rules.php:387 usr/local/www/firewall_rules.php:820
+msgid "Do you really want to delete the selected rules?"
+msgstr "あなたは本当に、選択したルールを削除しますか?"
+
+#: usr/local/www/firewall_rules.php:394 usr/local/www/firewall_rules.php:794
+#: usr/local/www/firewall_rules.php:826 usr/local/www/firewall_rules.php:398
+#: usr/local/www/firewall_rules.php:795 usr/local/www/firewall_rules.php:827
+#: usr/local/www/firewall_rules.php:391 usr/local/www/firewall_rules.php:788
+#: usr/local/www/firewall_rules.php:820 usr/local/www/firewall_rules.php:390
+#: usr/local/www/firewall_rules.php:789 usr/local/www/firewall_rules.php:823
+#: usr/local/www/firewall_rules.php:390 usr/local/www/firewall_rules.php:789
+#: usr/local/www/firewall_rules.php:823
+msgid "add new rule"
+msgstr "新しいルールを追加"
+
+#: usr/local/www/firewall_rules.php:431 usr/local/www/firewall_rules.php:425
+#: usr/local/www/firewall_rules.php:418 usr/local/www/firewall_rules.php:417
+#: usr/local/www/firewall_rules.php:417
+msgid "Anti-Lockout Rule"
+msgstr "アンチロックアウトルール"
+
+#: usr/local/www/firewall_rules.php:440 usr/local/www/firewall_rules.php:469
+#: usr/local/www/firewall_rules.php:497 usr/local/www/firewall_rules.php:780
+#: usr/local/www/firewall_rules.php:434 usr/local/www/firewall_rules.php:463
+#: usr/local/www/firewall_rules.php:491 usr/local/www/firewall_rules.php:777
+#: usr/local/www/firewall_rules.php:427 usr/local/www/firewall_rules.php:456
+#: usr/local/www/firewall_rules.php:484 usr/local/www/firewall_rules.php:770
+#: usr/local/www/firewall_rules.php:426 usr/local/www/firewall_rules.php:455
+#: usr/local/www/firewall_rules.php:483 usr/local/www/firewall_rules.php:426
+#: usr/local/www/firewall_rules.php:455 usr/local/www/firewall_rules.php:483
+#: usr/local/www/firewall_rules.php:770
+msgid "add a new rule based on this one"
+msgstr "この1に基づいて、新しいルールを追加"
+
+#: usr/local/www/firewall_rules.php:453 usr/local/www/firewall_rules.php:447
+#: usr/local/www/firewall_rules.php:440 usr/local/www/firewall_rules.php:439
+#: usr/local/www/firewall_rules.php:439
+msgid "RFC 1918 networks"
+msgstr "RFC 1918ネットワーク"
+
+#: usr/local/www/firewall_rules.php:460 usr/local/www/interfaces.php:2414
+#: usr/local/www/firewall_rules.php:454 usr/local/www/interfaces.php:2615
+#: usr/local/www/firewall_rules.php:447 usr/local/www/interfaces.php:2603
+#: usr/local/www/interfaces.php:2633 usr/local/www/firewall_rules.php:446
+#: usr/local/www/interfaces.php:2679 usr/local/www/interfaces.php:2668
+#: usr/local/www/firewall_rules.php:446 usr/local/www/interfaces.php:2668
+msgid "Block private networks"
+msgstr "プライベートネットワークをブロックする"
+
+#: usr/local/www/firewall_rules.php:481 usr/local/www/firewall_rules.php:475
+#: usr/local/www/firewall_rules.php:468 usr/local/www/firewall_rules.php:467
+#: usr/local/www/firewall_rules.php:467
+msgid "Reserved/not assigned by IANA"
+msgstr "予約済み/ IANAによって割り当てられていない"
+
+#: usr/local/www/firewall_rules.php:488 usr/local/www/interfaces.php:2426
+#: usr/local/www/firewall_rules.php:482 usr/local/www/interfaces.php:2627
+#: usr/local/www/firewall_rules.php:475 usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces.php:2645 usr/local/www/firewall_rules.php:474
+#: usr/local/www/interfaces.php:2691 usr/local/www/interfaces.php:2680
+#: usr/local/www/firewall_rules.php:474 usr/local/www/interfaces.php:2680
+msgid "Block bogon networks"
+msgstr "ブロックbogonネットワーク"
+
+#: usr/local/www/firewall_rules.php:513 usr/local/www/firewall_rules.php:507
+#: usr/local/www/firewall_rules.php:500 usr/local/www/firewall_rules.php:499
+#: usr/local/www/firewall_rules.php:499
+msgid "advanced settings set"
+msgstr "高度な設定は、設定"
+
+#: usr/local/www/firewall_rules.php:537 usr/local/www/firewall_rules.php:531
+#: usr/local/www/firewall_rules.php:524 usr/local/www/firewall_rules.php:524
+msgid "click to toggle enabled/disabled status"
+msgstr "有効/無効状態を切り替えるをクリックします"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:846
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:845
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:845
+#: usr/local/www/firewall_rules.php:561
+msgid "Mon"
+msgstr "モン"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_rules.php:567 usr/local/www/firewall_rules.php:560
+#: usr/local/www/firewall_rules.php:561 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_rules.php:561
+msgid "Tues"
+msgstr "火曜"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:848
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:847
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:847
+#: usr/local/www/firewall_rules.php:561
+msgid "Wed"
+msgstr "結婚"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_rules.php:567 usr/local/www/firewall_rules.php:560
+#: usr/local/www/firewall_rules.php:561 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_rules.php:561
+msgid "Thur"
+msgstr "木"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:850
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:849
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:849
+#: usr/local/www/firewall_rules.php:561
+msgid "Fri"
+msgstr "金"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:851
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:850
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:850
+#: usr/local/www/firewall_rules.php:561
+msgid "Sat"
+msgstr "土"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:852
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:851
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:851
+#: usr/local/www/firewall_rules.php:561
+msgid "Sun"
+msgstr "太陽"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "January"
+msgstr "1月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "February"
+msgstr "2月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "March"
+msgstr "3月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "April"
+msgstr "4月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "May"
+msgstr "5月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "June"
+msgstr "6月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "July"
+msgstr "7月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "August"
+msgstr "8月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "September"
+msgstr "9月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "October"
+msgstr "10月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "November"
+msgstr "11月"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:562
+msgid "December"
+msgstr "12月"
+
+#: usr/local/www/firewall_rules.php:685 usr/local/www/firewall_rules.php:679
+#: usr/local/www/firewall_rules.php:672 usr/local/www/firewall_rules.php:671
+#: usr/local/www/firewall_rules.php:671
+msgid "Traffic matching this rule is currently being denied"
+msgstr "このルールに一致するトラフィックは現在、拒否されている"
+
+#: usr/local/www/firewall_rules.php:690 usr/local/www/firewall_rules.php:684
+#: usr/local/www/firewall_rules.php:677 usr/local/www/firewall_rules.php:674
+#: usr/local/www/firewall_rules.php:674
+msgid "Traffic matching this rule is currently being allowed"
+msgstr "このルールに一致するトラフィックは、現在許可されています"
+
+#: usr/local/www/firewall_rules.php:700 usr/local/www/firewall_rules.php:694
+#: usr/local/www/firewall_rules.php:687 usr/local/www/firewall_rules.php:682
+#: usr/local/www/firewall_rules.php:682
+msgid "This rule is not currently active because its period has expired"
+msgstr "その期間が満了したため、このルールは、現在アクティブではありません"
+
+#: usr/local/www/firewall_rules.php:792 usr/local/www/firewall_rules.php:785
+#: usr/local/www/firewall_rules.php:786 usr/local/www/firewall_rules.php:786
+msgid "No rules are currently defined for this interface"
+msgstr "何のルールは現在このインターフェイスのために定義されていません"
+
+#: usr/local/www/firewall_rules.php:793 usr/local/www/firewall_rules.php:786
+#: usr/local/www/firewall_rules.php:787 usr/local/www/firewall_rules.php:787
+msgid ""
+"All incoming connections on this interface will be blocked until you add "
+"pass rules."
+msgstr "パスルール」を追加するまで、このインターフェイスのすべての着信接続がブロックされます」 。"
+
+#: usr/local/www/firewall_rules.php:794 usr/local/www/firewall_rules.php:795
+#: usr/local/www/firewall_rules.php:788 usr/local/www/firewall_rules.php:789
+#: usr/local/www/firewall_rules.php:789
+msgid "Click the"
+msgstr "クリック"
+
+#: usr/local/www/firewall_rules.php:794 usr/local/www/firewall_rules.php:795
+#: usr/local/www/firewall_rules.php:788 usr/local/www/firewall_rules.php:789
+#: usr/local/www/firewall_rules.php:789
+msgid " button to add a new rule."
+msgstr "新しいルールを追加するためのボタン。"
+
+#: usr/local/www/firewall_rules.php:817 usr/local/www/firewall_nat.php:327
+#: usr/local/www/firewall_rules.php:818 usr/local/www/firewall_nat.php:340
+#: usr/local/www/firewall_rules.php:811 usr/local/www/firewall_rules.php:813
+#: usr/local/www/firewall_nat.php:343 usr/local/www/firewall_nat.php:343
+#: usr/local/www/firewall_rules.php:813
+msgid "move selected rules to end"
+msgstr "終了するには、選択したルールを移動"
+
+#: usr/local/www/firewall_rules.php:835 usr/local/www/firewall_nat.php:345
+#: usr/local/www/firewall_rules.php:836 usr/local/www/firewall_nat.php:358
+#: usr/local/www/firewall_rules.php:829 usr/local/www/firewall_rules.php:832
+#: usr/local/www/firewall_nat.php:361 usr/local/www/firewall_nat.php:361
+#: usr/local/www/firewall_rules.php:832
+msgid "pass"
+msgstr "合格"
+
+#: usr/local/www/firewall_rules.php:838 usr/local/www/firewall_rules.php:839
+#: usr/local/www/firewall_rules.php:832 usr/local/www/firewall_rules.php:835
+#: usr/local/www/firewall_rules.php:835
+msgid "block"
+msgstr "ブロック"
+
+#: usr/local/www/firewall_rules.php:841 usr/local/www/license.php:125
+#: usr/local/www/firewall_rules.php:842 usr/local/www/firewall_rules.php:835
+#: usr/local/www/firewall_rules.php:838 usr/local/www/license.php:125
+#: usr/local/www/firewall_rules.php:838
+msgid "reject"
+msgstr "拒絶する"
+
+#: usr/local/www/firewall_rules.php:844 usr/local/www/firewall_rules.php:845
+#: usr/local/www/firewall_rules.php:838 usr/local/www/firewall_rules.php:841
+#: usr/local/www/firewall_rules.php:841
+msgid "log"
+msgstr "ログ"
+
+#: usr/local/www/firewall_rules.php:848 usr/local/www/firewall_rules.php:849
+#: usr/local/www/firewall_rules.php:842 usr/local/www/firewall_rules.php:845
+#: usr/local/www/firewall_rules.php:845
+msgid "pass (disabled)"
+msgstr "合格(無効)"
+
+#: usr/local/www/firewall_rules.php:851 usr/local/www/firewall_rules.php:852
+#: usr/local/www/firewall_rules.php:845 usr/local/www/firewall_rules.php:848
+#: usr/local/www/firewall_rules.php:848
+msgid "block (disabled)"
+msgstr "ブロック(無効)"
+
+#: usr/local/www/firewall_rules.php:854 usr/local/www/firewall_rules.php:855
+#: usr/local/www/firewall_rules.php:848 usr/local/www/firewall_rules.php:851
+#: usr/local/www/firewall_rules.php:851
+msgid "reject (disabled)"
+msgstr "拒否(無効)"
+
+#: usr/local/www/firewall_rules.php:857 usr/local/www/firewall_rules.php:858
+#: usr/local/www/firewall_rules.php:851 usr/local/www/firewall_rules.php:854
+#: usr/local/www/firewall_rules.php:854
+msgid "log (disabled)"
+msgstr "LOG(使用不可)"
+
+#: usr/local/www/firewall_rules.php:863
+#: usr/local/www/load_balancer_pool.php:148 usr/local/www/vpn_l2tp.php:354
+#: usr/local/www/vpn_l2tp.php:371 usr/local/www/firewall_rules.php:864
+#: usr/local/www/load_balancer_pool.php:149
+#: usr/local/www/firewall_rules.php:857 usr/local/www/vpn_l2tp.php:355
+#: usr/local/www/vpn_l2tp.php:372 usr/local/www/load_balancer_pool.php:147
+#: usr/local/www/vpn_l2tp.php:358 usr/local/www/vpn_l2tp.php:375
+#: usr/local/www/firewall_rules.php:860 usr/local/www/vpn_l2tp.php:358
+#: usr/local/www/vpn_l2tp.php:375 usr/local/www/load_balancer_pool.php:147
+#: usr/local/www/firewall_rules.php:860
+msgid "Hint:"
+msgstr "ヒント:"
+
+#: usr/local/www/firewall_rules.php:867 usr/local/www/firewall_rules.php:868
+#: usr/local/www/firewall_rules.php:861 usr/local/www/firewall_rules.php:864
+#: usr/local/www/firewall_rules.php:864
+msgid ""
+"Rules are evaluated on a first-match basis (i.e. the action of the first "
+"rule to match a packet will be executed). This means that if you use block "
+"rules, you'll have to pay attention to the rule order. Everything that isn't "
+"explicitly passed is blocked by default. "
+msgstr "「 (パケットと一致するルールが実行されますルール、すなわち最初のアクションは)最初のマッチに基づいて評価されている」 。これは、ブロックを使用した場合、明示的に渡されたがデフォルトでブロックされている「ルールには、ルールの順序ではありません。すべてに注意を払う必要があるでしょう」ということです。"
+
+#: usr/local/www/firewall_rules.php:874 usr/local/www/firewall_rules.php:875
+#: usr/local/www/firewall_rules.php:868 usr/local/www/firewall_rules.php:871
+#: usr/local/www/firewall_rules.php:871
+msgid ""
+"Floating rules are evaluated on a first-match basis (i.e. the action of the "
+"first rule to match a packet will be executed) only if the 'quick' option is "
+"checked on a rule. Otherwise they will only apply if no other rules match. "
+"Pay close attention to the rule order and options chosen. If no rule here "
+"matches, the per-interface or default rules are used. "
+msgstr "そうでなければ、彼らはのみ適用されます。 「クイック」オプションは、「ルールにチェックされている場合にのみ、 「 (パケットと一致する最初のルールが実行されます浮動ルール、すなわちの作用が)最初のマッチに基づいて評価されている「なしの場合ルールの一致は「ルールの順序や選択したオプションに細心の注意を払ってください。ここにはルールが「一致しない場合は、インターフェイス単位またはデフォルトのルールが使用されている。"
+
+#: usr/local/www/firewall_rules_edit.php:201
+#: usr/local/www/firewall_rules_edit.php:210
+msgid "Reject type rules only works when the protocol is set to TCP."
+msgstr "プロトコルがTCPに設定されている場合にのみ機能タイプのルールを拒否します。"
+
+#: usr/local/www/firewall_rules_edit.php:204
+#: usr/local/www/firewall_rules_edit.php:213
+#: usr/local/www/firewall_rules_edit.php:210
+msgid "Queue type rules only work with queues."
+msgstr "キュータイプのルールは、キューだけで動作します。"
+
+#: usr/local/www/firewall_rules_edit.php:212
+#: usr/local/www/firewall_rules_edit.php:227
+#: usr/local/www/firewall_rules_edit.php:225
+#: usr/local/www/firewall_rules_edit.php:222
+#: usr/local/www/firewall_rules_edit.php:228
+#: usr/local/www/firewall_rules_edit.php:228
+msgid "You can not assign a IPv4 gateway group on IPv6 Address Family rule"
+msgstr "あなたは、IPv6アドレスファミリルールにIPv4ゲートウェイ·グループを割り当てることはできません"
+
+#: usr/local/www/firewall_rules_edit.php:215
+#: usr/local/www/firewall_rules_edit.php:230
+#: usr/local/www/firewall_rules_edit.php:228
+#: usr/local/www/firewall_rules_edit.php:225
+#: usr/local/www/firewall_rules_edit.php:231
+#: usr/local/www/firewall_rules_edit.php:231
+msgid "You can not assign a IPv6 gateway group on IPv4 Address Family rule"
+msgstr "あなたは、 IPv4アドレスファミリルールにIPv6ゲートウェイ·グループを割り当てることはできません"
+
+#: usr/local/www/firewall_rules_edit.php:222
+#: usr/local/www/firewall_rules_edit.php:240
+#: usr/local/www/firewall_rules_edit.php:239
+#: usr/local/www/firewall_rules_edit.php:236
+#: usr/local/www/firewall_rules_edit.php:242
+#: usr/local/www/firewall_rules_edit.php:242
+msgid "You can not assign the IPv4 Gateway to a IPv6 Filter rule"
+msgstr "あなたは、IPv6フィルタルールにはIPv4ゲートウェイを割り当てることはできません"
+
+#: usr/local/www/firewall_rules_edit.php:225
+#: usr/local/www/firewall_rules_edit.php:243
+#: usr/local/www/firewall_rules_edit.php:242
+#: usr/local/www/firewall_rules_edit.php:239
+#: usr/local/www/firewall_rules_edit.php:245
+#: usr/local/www/firewall_rules_edit.php:245
+msgid "You can not assign the IPv6 Gateway to a IPv4 Filter rule"
+msgstr "あなたは、IPv4フィルタルールにIPv6ゲートウェイを割り当てることはできません"
+
+#: usr/local/www/firewall_rules_edit.php:297
+#: usr/local/www/firewall_rules_edit.php:321
+#: usr/local/www/firewall_rules_edit.php:320
+#: usr/local/www/firewall_rules_edit.php:323
+#: usr/local/www/firewall_rules_edit.php:329
+#: usr/local/www/firewall_rules_edit.php:329
+#, php-format
+msgid "%s is only valid with protocol TCP."
+msgstr "%sはプロトコルTCPでのみ有効です。"
+
+#: usr/local/www/firewall_rules_edit.php:299
+#: usr/local/www/firewall_rules_edit.php:323
+#: usr/local/www/firewall_rules_edit.php:322
+#: usr/local/www/firewall_rules_edit.php:325
+#: usr/local/www/firewall_rules_edit.php:331
+#: usr/local/www/firewall_rules_edit.php:331
+#, php-format
+msgid "%s is only valid if the gateway is set to 'default'."
+msgstr "ゲートウェイが「デフォルト」に設定されている場合%sにのみ有効です。"
+
+#: usr/local/www/firewall_rules_edit.php:327
+#: usr/local/www/firewall_rules_edit.php:351
+#: usr/local/www/firewall_rules_edit.php:350
+#: usr/local/www/firewall_rules_edit.php:353
+#: usr/local/www/firewall_rules_edit.php:359
+#: usr/local/www/firewall_rules_edit.php:359
+#, php-format
+msgid ""
+"%s is not a valid end source port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr "「 %sは有効な終了の送信元ポートではありません。これは、ポートエイリアスまたは整数でなければなりません "1 〜65535の間。"
+
+#: usr/local/www/firewall_rules_edit.php:381
+#: usr/local/www/firewall_rules_edit.php:410
+#: usr/local/www/firewall_rules_edit.php:409
+#: usr/local/www/firewall_rules_edit.php:412
+#: usr/local/www/firewall_rules_edit.php:418
+#: usr/local/www/firewall_rules_edit.php:418
+#, php-format
+msgid ""
+"The Source IP address %s Address Family differs from the destination %s."
+msgstr "「送信元IPアドレス%sアドレスファミリは、先の%s.とは異なります"
+
+#: usr/local/www/firewall_rules_edit.php:383
+#: usr/local/www/firewall_rules_edit.php:412
+#: usr/local/www/firewall_rules_edit.php:411
+#: usr/local/www/firewall_rules_edit.php:414
+#: usr/local/www/firewall_rules_edit.php:420
+#: usr/local/www/firewall_rules_edit.php:420
+msgid "You can not use IPv6 addresses in IPv4 rules."
+msgstr "あなたは、IPv4ルールでIPv6アドレスを使用することはできません。"
+
+#: usr/local/www/firewall_rules_edit.php:385
+#: usr/local/www/firewall_rules_edit.php:414
+#: usr/local/www/firewall_rules_edit.php:413
+#: usr/local/www/firewall_rules_edit.php:416
+#: usr/local/www/firewall_rules_edit.php:422
+#: usr/local/www/firewall_rules_edit.php:422
+msgid "You can not use IPv4 addresses in IPv6 rules."
+msgstr "あなたは、IPv6ルールでIPv4アドレスを使用することはできません。"
+
+#: usr/local/www/firewall_rules_edit.php:402
+#: usr/local/www/firewall_rules_edit.php:434
+#: usr/local/www/firewall_rules_edit.php:433
+#: usr/local/www/firewall_rules_edit.php:436
+#: usr/local/www/firewall_rules_edit.php:442
+#: usr/local/www/firewall_rules_edit.php:442
+msgid "OS detection is only valid with protocol TCP."
+msgstr "OS検出、プロトコルはTCPでのみ有効です。"
+
+#: usr/local/www/firewall_rules_edit.php:406
+#: usr/local/www/firewall_rules_edit.php:438
+#: usr/local/www/firewall_rules_edit.php:437
+#: usr/local/www/firewall_rules_edit.php:440
+#: usr/local/www/firewall_rules_edit.php:446
+#: usr/local/www/firewall_rules_edit.php:446
+msgid "You have to select a queue when you select an acknowledge queue too."
+msgstr "あなたはあなたも認めるキューを選択したときに、キューを選択する必要があります。"
+
+#: usr/local/www/firewall_rules_edit.php:408
+#: usr/local/www/firewall_rules_edit.php:440
+#: usr/local/www/firewall_rules_edit.php:439
+#: usr/local/www/firewall_rules_edit.php:442
+#: usr/local/www/firewall_rules_edit.php:448
+#: usr/local/www/firewall_rules_edit.php:448
+msgid "Acknowledge queue and Queue cannot be the same."
+msgstr "キューを確認し、キューは同じにすることはできません。"
+
+#: usr/local/www/firewall_rules_edit.php:411
+#: usr/local/www/firewall_rules_edit.php:443
+#: usr/local/www/firewall_rules_edit.php:442
+#: usr/local/www/firewall_rules_edit.php:445
+#: usr/local/www/firewall_rules_edit.php:451
+#: usr/local/www/firewall_rules_edit.php:451
+msgid ""
+"You can not use limiters in Floating rules without choosing a direction."
+msgstr "「あなたが方向を選ばずフローティングルールの中でリミッターを使用することはできません。"
+
+#: usr/local/www/firewall_rules_edit.php:413
+#: usr/local/www/firewall_rules_edit.php:445
+#: usr/local/www/firewall_rules_edit.php:444
+#: usr/local/www/firewall_rules_edit.php:447
+#: usr/local/www/firewall_rules_edit.php:453
+#: usr/local/www/firewall_rules_edit.php:453
+msgid ""
+"You can not use gateways in Floating rules without choosing a direction."
+msgstr "「あなたが方向を選ばずフローティングルール内のゲートウェイを使用することはできません。"
+
+#: usr/local/www/firewall_rules_edit.php:416
+#: usr/local/www/firewall_rules_edit.php:448
+#: usr/local/www/firewall_rules_edit.php:447
+#: usr/local/www/firewall_rules_edit.php:450
+#: usr/local/www/firewall_rules_edit.php:456
+#: usr/local/www/firewall_rules_edit.php:456
+msgid ""
+"You must select a queue for the In direction before selecting one for Out "
+"too."
+msgstr "あまりにも"あなたはアウトのための1つを選択する前に方向のキューを選択する必要があります」 。"
+
+#: usr/local/www/firewall_rules_edit.php:418
+#: usr/local/www/firewall_rules_edit.php:450
+#: usr/local/www/firewall_rules_edit.php:449
+#: usr/local/www/firewall_rules_edit.php:452
+#: usr/local/www/firewall_rules_edit.php:458
+#: usr/local/www/firewall_rules_edit.php:458
+msgid "In and Out Queue cannot be the same."
+msgstr "INとOUTキューが同じにすることはできません。"
+
+#: usr/local/www/firewall_rules_edit.php:420
+#: usr/local/www/firewall_rules_edit.php:422
+#: usr/local/www/firewall_rules_edit.php:452
+#: usr/local/www/firewall_rules_edit.php:454
+#: usr/local/www/firewall_rules_edit.php:451
+#: usr/local/www/firewall_rules_edit.php:453
+#: usr/local/www/firewall_rules_edit.php:456
+#: usr/local/www/firewall_rules_edit.php:460
+#: usr/local/www/firewall_rules_edit.php:462
+#: usr/local/www/firewall_rules_edit.php:460
+#: usr/local/www/firewall_rules_edit.php:462
+msgid ""
+"You cannot select one queue and one virtual interface for IN and Out. both "
+"must be from the same type."
+msgstr "「あなたは、 1キューとINとOUTのための1つの仮想インターフェイスを選択することはできません。どちらも「同じタイプのものである必要があります。"
+
+#: usr/local/www/firewall_rules_edit.php:425
+#: usr/local/www/firewall_rules_edit.php:457
+#: usr/local/www/firewall_rules_edit.php:458
+#: usr/local/www/firewall_rules_edit.php:461
+#: usr/local/www/firewall_rules_edit.php:467
+#: usr/local/www/firewall_rules_edit.php:467
+msgid "ID must be an integer"
+msgstr "IDは整数でなければなりません"
+
+#: usr/local/www/firewall_rules_edit.php:428
+#: usr/local/www/firewall_rules_edit.php:460
+#: usr/local/www/firewall_rules_edit.php:461
+#: usr/local/www/firewall_rules_edit.php:464
+#: usr/local/www/firewall_rules_edit.php:470
+#: usr/local/www/firewall_rules_edit.php:470
+msgid "You can only select a layer7 container for TCP and/or UDP protocols"
+msgstr "あなただけのTCPおよび/またはUDPプロトコルのためのレイヤ7コンテナを選択することができます"
+
+#: usr/local/www/firewall_rules_edit.php:430
+#: usr/local/www/firewall_rules_edit.php:462
+#: usr/local/www/firewall_rules_edit.php:463
+#: usr/local/www/firewall_rules_edit.php:466
+#: usr/local/www/firewall_rules_edit.php:472
+#: usr/local/www/firewall_rules_edit.php:472
+msgid "You can only select a layer7 container for Pass type rules."
+msgstr "あなただけの通過型ルールのレイヤ7のコンテナを選択することができます。"
+
+#: usr/local/www/firewall_rules_edit.php:443
+#: usr/local/www/firewall_rules_edit.php:475
+#: usr/local/www/firewall_rules_edit.php:476
+#: usr/local/www/firewall_rules_edit.php:479
+#: usr/local/www/firewall_rules_edit.php:485
+#: usr/local/www/firewall_rules_edit.php:485
+msgid ""
+"If you specify TCP flags that should be set you should specify out of which "
+"flags as well."
+msgstr "同様にフラグ"あなたが設定する必要がTCPフラグを指定した場合には、そのうち指定する必要があります」 。"
+
+#: usr/local/www/firewall_rules_edit.php:652
+#: usr/local/www/firewall_rules_edit.php:685
+#: usr/local/www/firewall_rules_edit.php:688
+#: usr/local/www/firewall_rules_edit.php:700
+#: usr/local/www/firewall_rules_edit.php:700
+msgid "Edit Firewall rule"
+msgstr "編集ファイアウォールルール"
+
+#: usr/local/www/firewall_rules_edit.php:673
+#: usr/local/www/firewall_rules_edit.php:706
+#: usr/local/www/firewall_rules_edit.php:709
+#: usr/local/www/firewall_rules_edit.php:721
+#: usr/local/www/firewall_rules_edit.php:721
+msgid "Choose what to do with packets that match the criteria specified below."
+msgstr "下の指定された条件に一致するパケットをどうするかを選択します。"
+
+#: usr/local/www/firewall_rules_edit.php:674
+#: usr/local/www/firewall_rules_edit.php:707
+#: usr/local/www/firewall_rules_edit.php:710
+#: usr/local/www/firewall_rules_edit.php:722
+#: usr/local/www/firewall_rules_edit.php:722
+msgid ""
+"Hint: the difference between block and reject is that with reject, a packet "
+"(TCP RST or ICMP port unreachable for UDP) is returned to the sender, "
+"whereas with block the packet is dropped silently. In either case, the "
+"original packet is discarded."
+msgstr ""ヒント:ブロックと拒否の違いである拒否して、そのパケット"オリジナル "のブロックと、パケットがいずれの場合も、黙って廃棄され、一方、 「 ( TCP RSTまたはUDPの到達不能ICMPポート)は、送信者に返送されるパケットは破棄される。"
+
+#: usr/local/www/firewall_rules_edit.php:689
+#: usr/local/www/firewall_rules_edit.php:722
+#: usr/local/www/firewall_rules_edit.php:725
+#: usr/local/www/firewall_rules_edit.php:737
+#: usr/local/www/firewall_rules_edit.php:737
+msgid "Quick"
+msgstr "クイック"
+
+#: usr/local/www/firewall_rules_edit.php:693
+#: usr/local/www/firewall_rules_edit.php:726
+#: usr/local/www/firewall_rules_edit.php:729
+#: usr/local/www/firewall_rules_edit.php:741
+#: usr/local/www/firewall_rules_edit.php:741
+msgid "Apply the action immediately on match."
+msgstr "一致にすぐにアクションを適用します。"
+
+#: usr/local/www/firewall_rules_edit.php:694
+#: usr/local/www/firewall_rules_edit.php:727
+#: usr/local/www/firewall_rules_edit.php:730
+#: usr/local/www/firewall_rules_edit.php:742
+#: usr/local/www/firewall_rules_edit.php:742
+msgid ""
+"Set this option if you need to apply this action to traffic that matches "
+"this rule immediately."
+msgstr "すぐにこのルールを"あなたは一致するトラフィックにこのアクションを適用する必要がある場合は、このオプションを設定する」 。"
+
+#: usr/local/www/firewall_rules_edit.php:701
+#: usr/local/www/firewall_rules_edit.php:734
+#: usr/local/www/firewall_rules_edit.php:737
+#: usr/local/www/firewall_rules_edit.php:749
+#: usr/local/www/firewall_rules_edit.php:749
+msgid "Associated filter rule"
+msgstr "関連するフィルタルール"
+
+#: usr/local/www/firewall_rules_edit.php:703
+#: usr/local/www/diag_traceroute.php:117 usr/local/www/diag_traceroute.php:137
+#: usr/local/www/firewall_rules_edit.php:736
+#: usr/local/www/firewall_rules_edit.php:739
+#: usr/local/www/diag_traceroute.php:141
+#: usr/local/www/firewall_rules_edit.php:751
+#: usr/local/www/diag_traceroute.php:161
+#: usr/local/www/firewall_rules_edit.php:751
+#: usr/local/www/diag_traceroute.php:161
+msgid "Note: "
+msgstr "注意:"
+
+#: usr/local/www/firewall_rules_edit.php:703
+#: usr/local/www/firewall_rules_edit.php:736
+#: usr/local/www/firewall_rules_edit.php:739
+#: usr/local/www/firewall_rules_edit.php:751
+#: usr/local/www/firewall_rules_edit.php:751
+msgid "This is associated to a NAT rule."
+msgstr "これは、NATルールに関連付けられています。"
+
+#: usr/local/www/firewall_rules_edit.php:704
+#: usr/local/www/firewall_rules_edit.php:737
+#: usr/local/www/firewall_rules_edit.php:740
+#: usr/local/www/firewall_rules_edit.php:752
+#: usr/local/www/firewall_rules_edit.php:752
+msgid ""
+"You cannot edit the interface, protocol, source, or destination of "
+"associated filter rules."
+msgstr "関連するフィルタルール"あなたは、インターフェイス、プロトコル、送信元、または宛先を編集することはできません」 。"
+
+#: usr/local/www/firewall_rules_edit.php:711
+#: usr/local/www/firewall_rules_edit.php:744
+#: usr/local/www/firewall_rules_edit.php:747
+#: usr/local/www/firewall_rules_edit.php:759
+#: usr/local/www/firewall_rules_edit.php:759
+msgid "View the NAT rule"
+msgstr "NATルールを表示する"
+
+#: usr/local/www/firewall_rules_edit.php:768
+#: usr/local/www/firewall_rules_edit.php:803
+#: usr/local/www/firewall_rules_edit.php:806
+#: usr/local/www/firewall_rules_edit.php:818
+#: usr/local/www/firewall_rules_edit.php:817
+#: usr/local/www/firewall_rules_edit.php:817
+msgid "Choose on which interface packets must come in to match this rule."
+msgstr "たインターフェイスパケットがこのルールに一致するには来なければなりません]を選択します。"
+
+#: usr/local/www/firewall_rules_edit.php:774
+#: usr/local/www/services_captiveportal_ip_edit.php:178
+#: usr/local/www/diag_ipsec_spd.php:88
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:443
+#: usr/local/www/services_captiveportal_hostname_edit.php:160
+#: usr/local/www/load_balancer_relay_action_edit.php:442
+#: usr/local/www/firewall_rules_edit.php:809
+#: usr/local/www/services_captiveportal_hostname_edit.php:158
+#: usr/local/www/load_balancer_relay_action_edit.php:440
+#: usr/local/www/services_captiveportal_ip_edit.php:176
+#: usr/local/www/diag_ipsec_spd.php:89
+#: usr/local/www/firewall_rules_edit.php:812
+#: usr/local/www/firewall_rules_edit.php:824
+#: usr/local/www/firewall_rules_edit.php:823
+#: usr/local/www/firewall_rules_edit.php:823
+#: usr/local/www/services_captiveportal_hostname_edit.php:160
+#: usr/local/www/diag_ipsec_spd.php:89
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:440
+msgid "Direction"
+msgstr "方向"
+
+#: usr/local/www/firewall_rules_edit.php:792
+#: usr/local/www/firewall_rules_edit.php:827
+#: usr/local/www/firewall_rules_edit.php:830
+#: usr/local/www/firewall_rules_edit.php:842
+#: usr/local/www/firewall_rules_edit.php:841
+#: usr/local/www/firewall_rules_edit.php:841
+msgid "TCP/IP Version"
+msgstr "TCP / IPのバージョン"
+
+#: usr/local/www/firewall_rules_edit.php:804
+#: usr/local/www/firewall_rules_edit.php:839
+#: usr/local/www/firewall_rules_edit.php:842
+#: usr/local/www/firewall_rules_edit.php:854
+#: usr/local/www/firewall_rules_edit.php:853
+#: usr/local/www/firewall_rules_edit.php:853
+msgid "Select the Internet Protocol version this rule applies to"
+msgstr "このルールが適用されるインターネット·プロトコル·バージョンを選択"
+
+#: usr/local/www/firewall_rules_edit.php:818
+#: usr/local/www/firewall_rules_edit.php:853
+#: usr/local/www/firewall_rules_edit.php:856
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_rules_edit.php:867
+msgid "Hint: in most cases, you should specify "
+msgstr "ヒント:ほとんどの場合、次のように指定する必要があり"
+
+#: usr/local/www/firewall_rules_edit.php:822
+#: usr/local/www/firewall_rules_edit.php:857
+#: usr/local/www/firewall_rules_edit.php:860
+#: usr/local/www/firewall_rules_edit.php:872
+#: usr/local/www/firewall_rules_edit.php:871
+#: usr/local/www/firewall_rules_edit.php:871
+msgid "ICMP type"
+msgstr "ICMPタイプ"
+
+#: usr/local/www/firewall_rules_edit.php:851
+#: usr/local/www/firewall_rules_edit.php:886
+#: usr/local/www/firewall_rules_edit.php:889
+#: usr/local/www/firewall_rules_edit.php:901
+#: usr/local/www/firewall_rules_edit.php:900
+#: usr/local/www/firewall_rules_edit.php:900
+msgid ""
+"If you selected ICMP for the protocol above, you may specify an ICMP type "
+"here."
+msgstr "ここで"あなたは上記のプロトコルのためにICMPを選択した場合は、 ICMPタイプを指定することも」 。"
+
+#: usr/local/www/firewall_rules_edit.php:885
+#: usr/local/www/firewall_rules_edit.php:920
+#: usr/local/www/firewall_rules_edit.php:929
+#: usr/local/www/firewall_rules_edit.php:941
+#: usr/local/www/firewall_rules_edit.php:940
+#: usr/local/www/firewall_rules_edit.php:940
+msgid " subnet"
+msgstr "サブネット"
+
+#: usr/local/www/firewall_rules_edit.php:908
+#: usr/local/www/firewall_rules_edit.php:943
+#: usr/local/www/firewall_rules_edit.php:952
+#: usr/local/www/firewall_rules_edit.php:964
+#: usr/local/www/firewall_rules_edit.php:963
+#: usr/local/www/firewall_rules_edit.php:963
+msgid "Show source port range"
+msgstr "送信元ポート範囲を表示する"
+
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1000
+msgid "Specify the source port or port range for this rule."
+msgstr "このルールの送信元ポートまたはポート範囲を指定します。"
+
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1000
+msgid ""
+"and almost never equal to the destination port range (and should usually be"
+msgstr "「宛先ポート範囲とほぼ等しくなることは(通常はあるべき"
+
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:1039
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:1074
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1089
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1102
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1101
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1101
+msgid "'to'"
+msgstr "'から'"
+
+#: usr/local/www/firewall_rules_edit.php:1005
+#: usr/local/www/firewall_rules_edit.php:1040
+#: usr/local/www/firewall_rules_edit.php:1055
+#: usr/local/www/firewall_rules_edit.php:1068
+#: usr/local/www/firewall_rules_edit.php:1067
+#: usr/local/www/firewall_rules_edit.php:1067
+msgid "Destination port range "
+msgstr "宛先ポート範囲"
+
+#: usr/local/www/firewall_rules_edit.php:1037
+#: usr/local/www/firewall_rules_edit.php:1072
+#: usr/local/www/firewall_rules_edit.php:1087
+#: usr/local/www/firewall_rules_edit.php:1100
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/firewall_rules_edit.php:1099
+msgid ""
+"Specify the port or port range for the destination of the packet for this "
+"rule."
+msgstr "ルール"このため、パケットの送信先のポートまたはポート範囲を指定する」 。"
+
+#: usr/local/www/firewall_rules_edit.php:1039
+#: usr/local/www/firewall_rules_edit.php:1074
+#: usr/local/www/firewall_rules_edit.php:1089
+#: usr/local/www/firewall_rules_edit.php:1102
+#: usr/local/www/firewall_rules_edit.php:1101
+#: usr/local/www/firewall_rules_edit.php:1101
+msgid "field empty if you only want to filter a single port"
+msgstr "フィールドの空のあなたは、単一のポートをフィルタリングしたい場合に"
+
+#: usr/local/www/firewall_rules_edit.php:1044
+#: usr/local/www/firewall_rules_edit.php:1079
+#: usr/local/www/firewall_rules_edit.php:1094
+#: usr/local/www/firewall_rules_edit.php:1107
+#: usr/local/www/firewall_rules_edit.php:1106
+#: usr/local/www/firewall_rules_edit.php:1106
+msgid "Log"
+msgstr "ログ"
+
+#: usr/local/www/firewall_rules_edit.php:1047
+#: usr/local/www/firewall_rules_edit.php:1082
+#: usr/local/www/firewall_rules_edit.php:1097
+#: usr/local/www/firewall_rules_edit.php:1110
+#: usr/local/www/firewall_rules_edit.php:1109
+#: usr/local/www/firewall_rules_edit.php:1109
+msgid "Log packets that are handled by this rule"
+msgstr "この規則によって処理されたパケットをログに記録する"
+
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/firewall_rules_edit.php:1111
+#: usr/local/www/firewall_rules_edit.php:1111
+msgid ""
+"Hint: the firewall has limited local log space. Don't turn on logging for "
+"everything. If you want to do a lot of logging, consider using a remote "
+"syslog server"
+msgstr ""ヒント:ファイアウォールがローカルのログ·スペースが限られているため、ロギングをオンにしないでください。 」すべてのもの。ロギングをたくさんしたい場合は、リモート「 syslogサーバを使用することを検討"
+
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/firewall_rules_edit.php:1111
+#: usr/local/www/firewall_rules_edit.php:1111
+msgid "see the"
+msgstr "見る"
+
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/firewall_rules_edit.php:1111
+#: usr/local/www/firewall_rules_edit.php:1111
+msgid "Diagnostics: System logs: Settings"
+msgstr "診断:システムログ:セッティング"
+
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/services_captiveportal.php:908
+#: usr/local/www/system_advanced_firewall.php:289
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/system_advanced_firewall.php:303
+#: usr/local/www/services_captiveportal.php:953
+#: usr/local/www/services_captiveportal.php:949
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/services_captiveportal.php:951
+#: usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/system_advanced_firewall.php:333
+#: usr/local/www/services_captiveportal.php:967
+#: usr/local/www/firewall_rules_edit.php:1111
+#: usr/local/www/firewall_rules_edit.php:1111
+#: usr/local/www/system_advanced_firewall.php:333
+#: usr/local/www/services_captiveportal.php:967
+msgid "page"
+msgstr "ページ"
+
+#: usr/local/www/firewall_rules_edit.php:1057
+#: usr/local/www/services_unbound_acls.php:296
+#: usr/local/www/firewall_rules_edit.php:1092
+#: usr/local/www/firewall_rules_edit.php:1107
+#: usr/local/www/firewall_rules_edit.php:1120
+#: usr/local/www/firewall_rules_edit.php:1119
+#: usr/local/www/firewall_rules_edit.php:1119
+msgid "You may enter a description here for your reference."
+msgstr "ここに参照用の説明文を入力することもできます。"
+
+#: usr/local/www/firewall_rules_edit.php:1080
+#: usr/local/www/firewall_rules_edit.php:1115
+#: usr/local/www/firewall_rules_edit.php:1130
+#: usr/local/www/firewall_rules_edit.php:1143
+#: usr/local/www/firewall_rules_edit.php:1142
+#: usr/local/www/firewall_rules_edit.php:1142
+msgid "Source OS"
+msgstr "ソースのOS"
+
+#: usr/local/www/firewall_rules_edit.php:1086
+#: usr/local/www/firewall_rules_edit.php:1121
+#: usr/local/www/firewall_rules_edit.php:1136
+#: usr/local/www/firewall_rules_edit.php:1149
+#: usr/local/www/firewall_rules_edit.php:1148
+#: usr/local/www/firewall_rules_edit.php:1148
+msgid "OS Type:"
+msgstr "OSの種類:"
+
+#: usr/local/www/firewall_rules_edit.php:1109
+#: usr/local/www/firewall_rules_edit.php:1144
+#: usr/local/www/firewall_rules_edit.php:1159
+#: usr/local/www/firewall_rules_edit.php:1172
+#: usr/local/www/firewall_rules_edit.php:1171
+#: usr/local/www/firewall_rules_edit.php:1171
+msgid "Note: this only works for TCP rules"
+msgstr "注:TCPの規則については、この唯一の作品"
+
+#: usr/local/www/firewall_rules_edit.php:1114
+#: usr/local/www/firewall_rules_edit.php:1149
+#: usr/local/www/firewall_rules_edit.php:1164
+#: usr/local/www/firewall_rules_edit.php:1177
+#: usr/local/www/firewall_rules_edit.php:1176
+#: usr/local/www/firewall_rules_edit.php:1176
+msgid "Diffserv Code Point"
+msgstr "DiffServのコードポイント"
+
+#: usr/local/www/firewall_rules_edit.php:1130
+#: usr/local/www/interfaces_ppps_edit.php:675
+#: usr/local/www/vpn_ipsec_phase1.php:806
+#: usr/local/www/vpn_ipsec_phase2.php:629
+#: usr/local/www/firewall_rules_edit.php:1165
+#: usr/local/www/vpn_ipsec_phase2.php:655
+#: usr/local/www/vpn_ipsec_phase1.php:819
+#: usr/local/www/interfaces_ppps_edit.php:676
+#: usr/local/www/vpn_ipsec_phase2.php:751
+#: usr/local/www/vpn_ipsec_phase1.php:816
+#: usr/local/www/firewall_rules_edit.php:1180
+#: usr/local/www/interfaces_ppps_edit.php:682
+#: usr/local/www/vpn_ipsec_phase1.php:837
+#: usr/local/www/vpn_ipsec_phase2.php:772
+#: usr/local/www/firewall_rules_edit.php:1193
+#: usr/local/www/firewall_rules_edit.php:1192
+#: usr/local/www/interfaces_ppps_edit.php:680
+#: usr/local/www/firewall_rules_edit.php:1192
+#: usr/local/www/interfaces_ppps_edit.php:680
+#: usr/local/www/vpn_ipsec_phase1.php:837
+#: usr/local/www/vpn_ipsec_phase2.php:772
+msgid "Advanced Options"
+msgstr "詳細オプション"
+
+#: usr/local/www/firewall_rules_edit.php:1137
+#: usr/local/www/firewall_rules_edit.php:1172
+#: usr/local/www/firewall_rules_edit.php:1187
+#: usr/local/www/firewall_rules_edit.php:1200
+#: usr/local/www/firewall_rules_edit.php:1199
+#: usr/local/www/firewall_rules_edit.php:1199
+msgid ""
+"This allows packets with IP options to pass. Otherwise they are blocked by "
+"default. This is usually only seen with multicast traffic."
+msgstr "「これは、IPオプションを持つパケットを通過させることができます。そうでなければ彼らはによってブロックされている「デフォルト。これは通常、マルチキャストトラフィックで見られる。"
+
+#: usr/local/www/firewall_rules_edit.php:1140
+#: usr/local/www/firewall_rules_edit.php:1175
+#: usr/local/www/firewall_rules_edit.php:1190
+#: usr/local/www/firewall_rules_edit.php:1203
+#: usr/local/www/firewall_rules_edit.php:1202
+#: usr/local/www/firewall_rules_edit.php:1202
+msgid "This will disable auto generated reply-to for this rule."
+msgstr "これは自動返信にこのルールのために生成が無効になります。"
+
+#: usr/local/www/firewall_rules_edit.php:1143
+#: usr/local/www/firewall_rules_edit.php:1178
+#: usr/local/www/firewall_rules_edit.php:1193
+#: usr/local/www/firewall_rules_edit.php:1206
+#: usr/local/www/firewall_rules_edit.php:1205
+#: usr/local/www/firewall_rules_edit.php:1205
+msgid ""
+"You can mark a packet matching this rule and use this mark to match on other "
+"NAT/filter rules. It is called"
+msgstr ""あなたは、このルールに一致するパケットをマークし、他に一致するように、このマークを使用することができます「NAT /フィルタルール。それが呼び出されます"
+
+#: usr/local/www/firewall_rules_edit.php:1143
+#: usr/local/www/firewall_rules_edit.php:1178
+#: usr/local/www/firewall_rules_edit.php:1193
+#: usr/local/www/firewall_rules_edit.php:1206
+#: usr/local/www/firewall_rules_edit.php:1205
+#: usr/local/www/firewall_rules_edit.php:1205
+msgid "Policy filtering"
+msgstr "ポリシーのフィルター"
+
+#: usr/local/www/firewall_rules_edit.php:1146
+#: usr/local/www/firewall_rules_edit.php:1181
+#: usr/local/www/firewall_rules_edit.php:1196
+#: usr/local/www/firewall_rules_edit.php:1209
+#: usr/local/www/firewall_rules_edit.php:1208
+#: usr/local/www/firewall_rules_edit.php:1208
+msgid "You can match packet on a mark placed before on another rule."
+msgstr "あなたが別のルール上の前に置かマークでパケットを一致させることができます。"
+
+#: usr/local/www/firewall_rules_edit.php:1148
+#: usr/local/www/firewall_rules_edit.php:1183
+#: usr/local/www/firewall_rules_edit.php:1198
+#: usr/local/www/firewall_rules_edit.php:1211
+#: usr/local/www/firewall_rules_edit.php:1210
+#: usr/local/www/firewall_rules_edit.php:1210
+msgid " Maximum state entries this rule can create"
+msgstr "最大ステートエントリは、このルールを作成することができます"
+
+#: usr/local/www/firewall_rules_edit.php:1149
+#: usr/local/www/firewall_rules_edit.php:1184
+#: usr/local/www/firewall_rules_edit.php:1199
+#: usr/local/www/firewall_rules_edit.php:1212
+#: usr/local/www/firewall_rules_edit.php:1211
+#: usr/local/www/firewall_rules_edit.php:1211
+msgid " Maximum number of unique source hosts"
+msgstr "一意の送信元ホストの最大数"
+
+#: usr/local/www/firewall_rules_edit.php:1150
+#: usr/local/www/firewall_rules_edit.php:1185
+#: usr/local/www/firewall_rules_edit.php:1200
+#: usr/local/www/firewall_rules_edit.php:1213
+#: usr/local/www/firewall_rules_edit.php:1212
+#: usr/local/www/firewall_rules_edit.php:1212
+msgid " Maximum number of established connections per host"
+msgstr "ホストあたりの確立された接続の最大数"
+
+#: usr/local/www/firewall_rules_edit.php:1151
+#: usr/local/www/firewall_rules_edit.php:1186
+#: usr/local/www/firewall_rules_edit.php:1201
+#: usr/local/www/firewall_rules_edit.php:1214
+#: usr/local/www/firewall_rules_edit.php:1213
+#: usr/local/www/firewall_rules_edit.php:1213
+msgid " Maximum state entries per host"
+msgstr "ホストごとの最大ステートエントリ"
+
+#: usr/local/www/firewall_rules_edit.php:1160
+#: usr/local/www/firewall_rules_edit.php:1195
+#: usr/local/www/firewall_rules_edit.php:1210
+#: usr/local/www/firewall_rules_edit.php:1223
+#: usr/local/www/firewall_rules_edit.php:1222
+#: usr/local/www/firewall_rules_edit.php:1222
+msgid "Maximum new connections / per second(s)"
+msgstr "最大の新規接続/秒(S )"
+
+#: usr/local/www/firewall_rules_edit.php:1164
+#: usr/local/www/firewall_rules_edit.php:1199
+#: usr/local/www/firewall_rules_edit.php:1214
+#: usr/local/www/firewall_rules_edit.php:1226
+#: usr/local/www/firewall_rules_edit.php:1225
+#: usr/local/www/firewall_rules_edit.php:1225
+msgid "State Timeout in seconds"
+msgstr "秒単位の状態のタイムアウト"
+
+#: usr/local/www/firewall_rules_edit.php:1167
+#: usr/local/www/firewall_rules_edit.php:1202
+#: usr/local/www/firewall_rules_edit.php:1217
+#: usr/local/www/firewall_rules_edit.php:1228
+#: usr/local/www/firewall_rules_edit.php:1227
+#: usr/local/www/firewall_rules_edit.php:1227
+msgid "Note: Leave fields blank to disable that feature."
+msgstr "注:この機能を無効に空欄のままにしておきます。"
+
+#: usr/local/www/firewall_rules_edit.php:1172
+#: usr/local/www/firewall_rules_edit.php:1207
+#: usr/local/www/firewall_rules_edit.php:1222
+#: usr/local/www/firewall_rules_edit.php:1233
+#: usr/local/www/firewall_rules_edit.php:1232
+#: usr/local/www/firewall_rules_edit.php:1232
+msgid "TCP flags"
+msgstr "TCPフラグ"
+
+#: usr/local/www/firewall_rules_edit.php:1206
+#: usr/local/www/firewall_rules_edit.php:1241
+#: usr/local/www/firewall_rules_edit.php:1256
+#: usr/local/www/firewall_rules_edit.php:1265
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1264
+msgid "Any flags."
+msgstr "任意のフラグ。"
+
+#: usr/local/www/firewall_rules_edit.php:1208
+#: usr/local/www/firewall_rules_edit.php:1243
+#: usr/local/www/firewall_rules_edit.php:1258
+#: usr/local/www/firewall_rules_edit.php:1267
+#: usr/local/www/firewall_rules_edit.php:1266
+#: usr/local/www/firewall_rules_edit.php:1266
+msgid ""
+"Use this to choose TCP flags that must be set or cleared for this rule to "
+"match."
+msgstr "マッチ」には、このルールに設定またはクリアする必要がTCPフラグを選択して、これを使用してください」 。"
+
+#: usr/local/www/firewall_rules_edit.php:1214
+#: usr/local/www/firewall_rules_edit.php:1249
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1273
+#: usr/local/www/firewall_rules_edit.php:1272
+#: usr/local/www/firewall_rules_edit.php:1272
+msgid "State Type"
+msgstr "ステートタイプ"
+
+#: usr/local/www/firewall_rules_edit.php:1221
+#: usr/local/www/firewall_rules_edit.php:1228
+#: usr/local/www/firewall_rules_edit.php:1256
+#: usr/local/www/firewall_rules_edit.php:1263
+#: usr/local/www/firewall_rules_edit.php:1271
+#: usr/local/www/firewall_rules_edit.php:1278
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1286
+#: usr/local/www/firewall_rules_edit.php:1279
+#: usr/local/www/firewall_rules_edit.php:1285
+#: usr/local/www/firewall_rules_edit.php:1279
+#: usr/local/www/firewall_rules_edit.php:1285
+msgid "keep state"
+msgstr "状態を維持する"
+
+#: usr/local/www/firewall_rules_edit.php:1222
+#: usr/local/www/firewall_rules_edit.php:1229
+#: usr/local/www/firewall_rules_edit.php:1257
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1272
+#: usr/local/www/firewall_rules_edit.php:1279
+#: usr/local/www/firewall_rules_edit.php:1281
+#: usr/local/www/firewall_rules_edit.php:1287
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1286
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1286
+msgid "sloppy state"
+msgstr "ずさんな状態"
+
+#: usr/local/www/firewall_rules_edit.php:1223
+#: usr/local/www/firewall_rules_edit.php:1230
+#: usr/local/www/firewall_rules_edit.php:1258
+#: usr/local/www/firewall_rules_edit.php:1265
+#: usr/local/www/firewall_rules_edit.php:1273
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1282
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1281
+#: usr/local/www/firewall_rules_edit.php:1287
+#: usr/local/www/firewall_rules_edit.php:1281
+#: usr/local/www/firewall_rules_edit.php:1287
+msgid "synproxy state"
+msgstr "synproxy状態"
+
+#: usr/local/www/firewall_rules_edit.php:1225
+#: usr/local/www/firewall_rules_edit.php:1260
+#: usr/local/www/firewall_rules_edit.php:1275
+#: usr/local/www/firewall_rules_edit.php:1284
+#: usr/local/www/firewall_rules_edit.php:1283
+#: usr/local/www/firewall_rules_edit.php:1283
+msgid ""
+"Hint: Select which type of state tracking mechanism you would like to use. "
+"If in doubt, use keep state."
+msgstr ""ヒント:あなたが使用したい種類を状態追跡機構の選択」疑わしい場合は、状態を維持し使用している場合。"
+
+#: usr/local/www/firewall_rules_edit.php:1228
+#: usr/local/www/firewall_rules_edit.php:1229
+#: usr/local/www/firewall_rules_edit.php:1263
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1278
+#: usr/local/www/firewall_rules_edit.php:1279
+#: usr/local/www/firewall_rules_edit.php:1286
+#: usr/local/www/firewall_rules_edit.php:1287
+#: usr/local/www/firewall_rules_edit.php:1285
+#: usr/local/www/firewall_rules_edit.php:1285
+#: usr/local/www/firewall_rules_edit.php:1286
+msgid "Works with all IP protocols."
+msgstr "すべてのIPプロトコルで動作します。"
+
+#: usr/local/www/firewall_rules_edit.php:1230
+#: usr/local/www/firewall_rules_edit.php:1265
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1287
+#: usr/local/www/firewall_rules_edit.php:1287
+msgid ""
+"Proxies incoming TCP connections to help protect servers from spoofed TCP "
+"SYN floods. This option includes the functionality of keep state and "
+"modulate state combined."
+msgstr "SYNフラッド」スプーフィングされたTCPからサーバーを保護するためにTCP接続を着信プロキシ」 。このオプションは、組み合わせてキープ状態の機能と「調節状態を含む。"
+
+#: usr/local/www/firewall_rules_edit.php:1231
+#: usr/local/www/firewall_rules_edit.php:1266
+#: usr/local/www/firewall_rules_edit.php:1281
+#: usr/local/www/firewall_rules_edit.php:1289
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1288
+msgid ""
+"Do not use state mechanisms to keep track. This is only useful if you're "
+"doing advanced queueing in certain situations. Please check the "
+"documentation."
+msgstr "特定の状況でアドバンスト·キューイングを行って"あなたがしている場合を追跡するために状態のメカニズムを使用しないでください。これは便利です」 。 「マニュアルを確認してください。"
+
+#: usr/local/www/firewall_rules_edit.php:1245
+#: usr/local/www/firewall_rules_edit.php:1280
+msgid ""
+"Hint: This prevents the rule from automatically syncing to other CARP "
+"members."
+msgstr ""ヒント:これは、自動的に他のCARPと同期からルールを防ぐ」のメンバー。"
+
+#: usr/local/www/firewall_rules_edit.php:1283
+#: usr/local/www/firewall_rules_edit.php:1350
+#: usr/local/www/firewall_rules_edit.php:1365
+#: usr/local/www/firewall_rules_edit.php:1372
+#: usr/local/www/firewall_rules_edit.php:1383
+#: usr/local/www/firewall_rules_edit.php:1383
+msgid "Leave as 'none' to leave the rule enabled all the time."
+msgstr "すべての時間を有効にするルールを残して「該当なし」としておきます。"
+
+#: usr/local/www/firewall_rules_edit.php:1295
+#: usr/local/www/services_captiveportal.php:779
+#: usr/local/www/services_captiveportal.php:799
+#: usr/local/www/firewall_rules_edit.php:1362
+#: usr/local/www/services_captiveportal.php:821
+#: usr/local/www/services_captiveportal.php:841
+#: usr/local/www/services_captiveportal.php:819
+#: usr/local/www/services_captiveportal.php:839
+#: usr/local/www/firewall_rules_edit.php:1377
+#: usr/local/www/services_captiveportal.php:807
+#: usr/local/www/services_captiveportal.php:837
+#: usr/local/www/firewall_rules_edit.php:1384
+#: usr/local/www/services_captiveportal.php:823
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/firewall_rules_edit.php:1395
+#: usr/local/www/firewall_rules_edit.php:1395
+#: usr/local/www/services_captiveportal.php:823
+#: usr/local/www/services_captiveportal.php:853
+msgid "default"
+msgstr "デフォルト"
+
+#: usr/local/www/firewall_rules_edit.php:1334
+#: usr/local/www/firewall_rules_edit.php:1405
+#: usr/local/www/firewall_rules_edit.php:1420
+#: usr/local/www/firewall_rules_edit.php:1427
+#: usr/local/www/firewall_rules_edit.php:1438
+#: usr/local/www/firewall_rules_edit.php:1438
+msgid ""
+"Leave as 'default' to use the system routing table. Or choose a gateway to "
+"utilize policy based routing."
+msgstr "ポリシーベースのルーティングを使用する」には、システムのルーティングテーブルを使用するように「デフォルト」のままにします。またはゲートウェイを選択する」 。"
+
+#: usr/local/www/firewall_rules_edit.php:1339
+#: usr/local/www/firewall_rules_edit.php:1410
+#: usr/local/www/firewall_rules_edit.php:1425
+#: usr/local/www/firewall_rules_edit.php:1432
+#: usr/local/www/firewall_rules_edit.php:1443
+#: usr/local/www/firewall_rules_edit.php:1443
+msgid "In/Out"
+msgstr "イン/アウト"
+
+#: usr/local/www/firewall_rules_edit.php:1383
+#: usr/local/www/firewall_rules_edit.php:1454
+#: usr/local/www/firewall_rules_edit.php:1469
+#: usr/local/www/firewall_rules_edit.php:1476
+#: usr/local/www/firewall_rules_edit.php:1487
+#: usr/local/www/firewall_rules_edit.php:1487
+msgid ""
+"Choose the Out queue/Virtual interface only if you have also selected In."
+msgstr "「あなたも、選択された場合にのみ出力待ち行列/仮想インターフェイスを選択します。"
+
+#: usr/local/www/firewall_rules_edit.php:1383
+#: usr/local/www/firewall_rules_edit.php:1454
+#: usr/local/www/firewall_rules_edit.php:1469
+#: usr/local/www/firewall_rules_edit.php:1476
+#: usr/local/www/firewall_rules_edit.php:1487
+#: usr/local/www/firewall_rules_edit.php:1487
+msgid ""
+"The Out selection is applied to traffic leaving the interface where the rule "
+"is created, In is applied to traffic coming into the chosen interface."
+msgstr "作成された「アウト選択はルールがインターフェイスから送信されるトラフィックに適用されている」では、トラフィックが選ばれたインターフェイスに着信に適用されます。"
+
+#: usr/local/www/firewall_rules_edit.php:1383
+#: usr/local/www/firewall_rules_edit.php:1454
+#: usr/local/www/firewall_rules_edit.php:1469
+#: usr/local/www/firewall_rules_edit.php:1476
+#: usr/local/www/firewall_rules_edit.php:1487
+#: usr/local/www/firewall_rules_edit.php:1487
+msgid ""
+"If you are creating a floating rule, if the direction is In then the same "
+"rules apply, if the direction is out the selections are reverted Out is for "
+"incoming and In is for outgoing."
+msgstr "「フローティングルールを作成する場合は方向が同じで、その後にある場合は、 「方向は選択がアウト戻され外の場合のルールが適用「着信およびInは、発信用です用です。"
+
+#: usr/local/www/firewall_rules_edit.php:1389
+#: usr/local/www/firewall_rules_edit.php:1460
+#: usr/local/www/firewall_rules_edit.php:1475
+#: usr/local/www/firewall_rules_edit.php:1482
+#: usr/local/www/firewall_rules_edit.php:1493
+#: usr/local/www/firewall_rules_edit.php:1493
+msgid "Ackqueue/Queue"
+msgstr "Ackqueue /キュー"
+
+#: usr/local/www/firewall_rules_edit.php:1439
+#: usr/local/www/firewall_rules_edit.php:1510
+#: usr/local/www/firewall_rules_edit.php:1525
+#: usr/local/www/firewall_rules_edit.php:1532
+#: usr/local/www/firewall_rules_edit.php:1543
+#: usr/local/www/firewall_rules_edit.php:1543
+msgid "Choose the Acknowledge Queue only if you have selected Queue."
+msgstr "キューを選択した場合にのみ肯定応答キューを選択してください。"
+
+#: usr/local/www/firewall_rules_edit.php:1466
+#: usr/local/www/firewall_rules_edit.php:1537
+#: usr/local/www/firewall_rules_edit.php:1552
+#: usr/local/www/firewall_rules_edit.php:1560
+#: usr/local/www/firewall_rules_edit.php:1571
+#: usr/local/www/firewall_rules_edit.php:1571
+msgid ""
+"Choose a Layer7 container to apply application protocol inspection rules. "
+"These are valid for TCP and UDP protocols only."
+msgstr "「アプリケーションプロトコルインスペクションルールを適用するレイヤ7のコンテナを選択します。 「これらはTCPおよびUDPのみのプロトコルに有効です。"
+
+#: usr/local/www/firewall_schedule.php:50
+#: usr/local/www/firewall_schedule_edit.php:61 usr/local/www/fbegin.inc:113
+#: usr/local/www/system_advanced_misc.php:380 usr/local/www/fbegin.inc:130
+#: usr/local/www/system_advanced_misc.php:423 usr/local/www/fbegin.inc:139
+#: usr/local/www/system_advanced_misc.php:472
+#: usr/local/www/system_advanced_misc.php:484 usr/local/www/fbegin.inc:131
+#: usr/local/www/system_advanced_misc.php:531
+#: usr/local/www/firewall_schedule.php:50
+#: usr/local/www/firewall_schedule_edit.php:61
+#: usr/local/www/system_advanced_misc.php:531 usr/local/www/fbegin.inc:131
+msgid "Schedules"
+msgstr "スケジュール"
+
+#: usr/local/www/firewall_schedule.php:77
+#: usr/local/www/firewall_schedule.php:77
+#, php-format
+msgid "Cannot delete Schedule. Currently in use by %s"
+msgstr "スケジュールを削除することはできません。現在%sで使用されている"
+
+#: usr/local/www/firewall_schedule.php:97
+#: usr/local/www/firewall_schedule.php:97
+msgid "Time Range(s)"
+msgstr "時間範囲( S )"
+
+#: usr/local/www/firewall_schedule.php:103
+#: usr/local/www/firewall_schedule.php:233
+#: usr/local/www/firewall_schedule.php:103
+#: usr/local/www/firewall_schedule.php:233
+msgid "add a new schedule"
+msgstr "新しいスケジュールを追加"
+
+#: usr/local/www/firewall_schedule.php:115
+#: usr/local/www/firewall_schedule.php:115
+msgid "Schedule is currently active"
+msgstr "スケジュールが現在アクティブになっている"
+
+#: usr/local/www/firewall_schedule.php:221
+#: usr/local/www/firewall_schedule.php:221
+msgid "Do you really want to delete this schedule?"
+msgstr "あなたは本当にこのスケジュールを削除しますか?"
+
+#: usr/local/www/firewall_schedule.php:240
+#: usr/local/www/firewall_schedule.php:240
+msgid ""
+"Schedules act as placeholders for time ranges to be used in Firewall Rules."
+msgstr "時間のプレースホルダは、ファイアウォールルールで使用する範囲として「スケジュールは行動。"
+
+#: usr/local/www/firewall_schedule_edit.php:93
+#: usr/local/www/firewall_schedule_edit.php:93
+msgid "Schedule may not be named LAN."
+msgstr "スケジュールは、LAN命名されない場合があります。"
+
+#: usr/local/www/firewall_schedule_edit.php:95
+#: usr/local/www/firewall_schedule_edit.php:95
+msgid "Schedule may not be named WAN."
+msgstr "スケジュールは、WAN命名されない場合があります。"
+
+#: usr/local/www/firewall_schedule_edit.php:97
+#: usr/local/www/firewall_schedule_edit.php:97
+msgid "Schedule name cannot be blank."
+msgstr "スケジュール名を空白にすることはできません。"
+
+#: usr/local/www/firewall_schedule_edit.php:101
+#: usr/local/www/firewall_schedule_edit.php:101
+msgid "Reserved word used for schedule name."
+msgstr "スケジュール名に使用する予約語。"
+
+#: usr/local/www/firewall_schedule_edit.php:104
+#: usr/local/www/firewall_schedule_edit.php:104
+msgid "The schedule name may only consist of the characters a-z, A-Z, 0-9"
+msgstr "スケジュール名は文字だけAZ 、 AZ 、から構成されてもよい0-9"
+
+#: usr/local/www/firewall_schedule_edit.php:113
+#: usr/local/www/firewall_schedule_edit.php:113
+msgid "A Schedule with this name already exists."
+msgstr "この名前のスケジュールがすでに存在しています。"
+
+#: usr/local/www/firewall_schedule_edit.php:170
+#: usr/local/www/firewall_schedule_edit.php:170
+msgid "The schedule must have at least one time range configured."
+msgstr "スケジュールは、少なくとも1時間範囲が設定されている必要があります。"
+
+#: usr/local/www/firewall_schedule_edit.php:770
+#: usr/local/www/firewall_schedule_edit.php:769
+#: usr/local/www/firewall_schedule_edit.php:769
+msgid "Schedule information"
+msgstr "スケジュール情報"
+
+#: usr/local/www/firewall_schedule_edit.php:776
+#: usr/local/www/firewall_schedule_edit.php:775
+#: usr/local/www/firewall_schedule_edit.php:775
+msgid "Schedule Name"
+msgstr "スケジュール名"
+
+#: usr/local/www/firewall_schedule_edit.php:782
+#: usr/local/www/firewall_schedule_edit.php:781
+#: usr/local/www/firewall_schedule_edit.php:781
+msgid "NOTE: This schedule is in use so the name may not be modified!"
+msgstr "注意:名前は変更されない場合がありますので、このスケジュールは使用中です !"
+
+#: usr/local/www/firewall_schedule_edit.php:787
+#: usr/local/www/firewall_schedule_edit.php:786
+#: usr/local/www/firewall_schedule_edit.php:786
+msgid ""
+"The name of the alias may only consist of the characters a-z, A-Z and 0-9"
+msgstr "「エイリアスの名前は、文字だけAZ 、 AZと0-9で構成することができる"
+
+#: usr/local/www/firewall_schedule_edit.php:804
+#: usr/local/www/firewall_schedule_edit.php:803
+#: usr/local/www/firewall_schedule_edit.php:803
+msgid "Month"
+msgstr "月"
+
+#: usr/local/www/firewall_schedule_edit.php:847
+#: usr/local/www/firewall_schedule_edit.php:846
+#: usr/local/www/firewall_schedule_edit.php:846
+msgid "Tue"
+msgstr "火曜"
+
+#: usr/local/www/firewall_schedule_edit.php:849
+#: usr/local/www/firewall_schedule_edit.php:848
+#: usr/local/www/firewall_schedule_edit.php:848
+msgid "Thu"
+msgstr "木"
+
+#: usr/local/www/firewall_schedule_edit.php:906
+#: usr/local/www/firewall_schedule_edit.php:905
+#: usr/local/www/firewall_schedule_edit.php:905
+msgid ""
+"Click individual date to select that date only. Click the appropriate "
+"weekday Header to select all occurences of that weekday."
+msgstr "「それだけで日付を選択し、個々の日付をクリックします。適切なクリックして "その曜日のすべての出現箇所を選択するには、平日のヘッダー。"
+
+#: usr/local/www/firewall_schedule_edit.php:914
+#: usr/local/www/firewall_schedule_edit.php:996
+#: usr/local/www/firewall_schedule_edit.php:913
+#: usr/local/www/firewall_schedule_edit.php:995
+#: usr/local/www/firewall_schedule_edit.php:913
+#: usr/local/www/firewall_schedule_edit.php:995
+msgid "Start Time"
+msgstr "時間を開始"
+
+#: usr/local/www/firewall_schedule_edit.php:914
+#: usr/local/www/firewall_schedule_edit.php:997
+#: usr/local/www/firewall_schedule_edit.php:913
+#: usr/local/www/firewall_schedule_edit.php:996
+#: usr/local/www/firewall_schedule_edit.php:913
+#: usr/local/www/firewall_schedule_edit.php:996
+msgid "Stop Time"
+msgstr "停止時間"
+
+#: usr/local/www/firewall_schedule_edit.php:927
+#: usr/local/www/firewall_schedule_edit.php:952
+#: usr/local/www/firewall_schedule_edit.php:926
+#: usr/local/www/firewall_schedule_edit.php:951
+#: usr/local/www/firewall_schedule_edit.php:926
+#: usr/local/www/firewall_schedule_edit.php:951
+msgid "Hr"
+msgstr "時間"
+
+#: usr/local/www/firewall_schedule_edit.php:934
+#: usr/local/www/firewall_schedule_edit.php:959
+#: usr/local/www/firewall_schedule_edit.php:933
+#: usr/local/www/firewall_schedule_edit.php:958
+#: usr/local/www/firewall_schedule_edit.php:933
+#: usr/local/www/firewall_schedule_edit.php:958
+msgid "Min"
+msgstr "ミン"
+
+#: usr/local/www/firewall_schedule_edit.php:963
+#: usr/local/www/firewall_schedule_edit.php:962
+#: usr/local/www/firewall_schedule_edit.php:962
+msgid ""
+"Select the time range for the day(s) selected on the Month(s) above. A full "
+"day is 0:00-23:59."
+msgstr "「上記の月( S )上で選択した日の(S )の時間範囲を選択します。完全な "日は0:00-23:59です。"
+
+#: usr/local/www/firewall_schedule_edit.php:967
+#: usr/local/www/firewall_schedule_edit.php:966
+#: usr/local/www/firewall_schedule_edit.php:966
+msgid "Time Range Description"
+msgstr "時間範囲説明"
+
+#: usr/local/www/firewall_schedule_edit.php:977
+#: usr/local/www/firewall_schedule_edit.php:976
+#: usr/local/www/firewall_schedule_edit.php:976
+msgid "Add Time"
+msgstr "時間を加え"
+
+#: usr/local/www/firewall_schedule_edit.php:978
+#: usr/local/www/firewall_schedule_edit.php:977
+#: usr/local/www/firewall_schedule_edit.php:977
+msgid "Clear Selection"
+msgstr "選択をクリア"
+
+#: usr/local/www/firewall_schedule_edit.php:987
+#: usr/local/www/firewall_schedule_edit.php:986
+#: usr/local/www/firewall_schedule_edit.php:986
+msgid "Schedule repeat"
+msgstr "スケジュールの繰り返し"
+
+#: usr/local/www/firewall_schedule_edit.php:990
+#: usr/local/www/firewall_schedule_edit.php:989
+#: usr/local/www/firewall_schedule_edit.php:989
+msgid "Configured Ranges"
+msgstr "構成された範囲"
+
+#: usr/local/www/firewall_schedule_edit.php:995
+#: usr/local/www/firewall_schedule_edit.php:994
+#: usr/local/www/firewall_schedule_edit.php:994
+msgid "Day(s)"
+msgstr "日( S )"
+
+#: usr/local/www/firewall_shaper.php:369 usr/local/www/firewall_shaper.php:370
+#: usr/local/www/firewall_shaper.php:370
+msgid "Disable shaper on interface"
+msgstr "インターフェイス上でシェーパーを無効"
+
+#: usr/local/www/firewall_shaper.php:424 usr/local/www/firewall_shaper.php:425
+#: usr/local/www/firewall_shaper.php:426 usr/local/www/firewall_shaper.php:426
+msgid "Remove Shaper"
+msgstr "シェイパーを削除する"
+
+#: usr/local/www/diag_backup.php:84 usr/local/www/diag_backup.php:161
+#: usr/local/www/diag_backup.php:161
+msgid "Restored base_package menus after configuration restore."
+msgstr "コンフィギュレーション後に復元base_packageメニューが復元します。"
+
+#: usr/local/www/diag_backup.php:104 usr/local/www/fbegin.inc:120
+#: usr/local/www/fbegin.inc:156 usr/local/www/status_rrd_graph_settings.php:58
+#: usr/local/www/status_rrd_graph_settings.php:155
+#: usr/local/www/status_services.php:275
+#: usr/local/www/widgets/widgets/services_status.widget.php:80
+#: usr/local/www/fbegin.inc:137 usr/local/www/fbegin.inc:173
+#: usr/local/www/status_rrd_graph_settings.php:156
+#: usr/local/www/diag_backup.php:181 etc/inc/service-utils.inc:256
+#: usr/local/www/fbegin.inc:146 usr/local/www/fbegin.inc:181
+#: usr/local/www/fbegin.inc:138 usr/local/www/fbegin.inc:172
+#: etc/inc/service-utils.inc:255 etc/inc/service-utils.inc:272
+#: usr/local/www/status_rrd_graph_settings.php:58
+#: usr/local/www/status_rrd_graph_settings.php:156
+#: usr/local/www/diag_backup.php:181 usr/local/www/fbegin.inc:138
+#: usr/local/www/fbegin.inc:172 etc/inc/service-utils.inc:272
+msgid "Captive Portal"
+msgstr "キャプティブポータル"
+
+#: usr/local/www/diag_backup.php:105 usr/local/www/diag_backup.php:182
+#: usr/local/www/diag_backup.php:182
+msgid "Captive Portal Vouchers"
+msgstr "キャプティブポータルバウチャー"
+
+#: usr/local/www/diag_backup.php:106 usr/local/www/fbegin.inc:121
+#: usr/local/www/status_services.php:263
+#: usr/local/www/widgets/widgets/services_status.widget.php:68
+#: usr/local/www/fbegin.inc:138 usr/local/www/diag_backup.php:183
+#: etc/inc/service-utils.inc:241 usr/local/www/fbegin.inc:147
+#: usr/local/www/fbegin.inc:139 etc/inc/service-utils.inc:240
+#: etc/inc/service-utils.inc:257 usr/local/www/diag_backup.php:183
+#: usr/local/www/fbegin.inc:139 etc/inc/service-utils.inc:257
+msgid "DNS Forwarder"
+msgstr "DNSフォワーダ"
+
+#: usr/local/www/diag_backup.php:107 usr/local/www/fbegin.inc:125
+#: usr/local/www/fbegin.inc:142 usr/local/www/diag_backup.php:184
+#: usr/local/www/fbegin.inc:151 usr/local/www/fbegin.inc:143
+#: usr/local/www/diag_backup.php:184 usr/local/www/fbegin.inc:143
+msgid "DHCP Server"
+msgstr "DHCPサーバ"
+
+#: usr/local/www/diag_backup.php:108 usr/local/www/diag_backup.php:185
+#: usr/local/www/diag_backup.php:185
+msgid "Firewall Rules"
+msgstr "ファイアウォールルール"
+
+#: usr/local/www/diag_backup.php:110 usr/local/www/diag_backup.php:187
+#: usr/local/www/diag_backup.php:187
+msgid "IPSEC"
+msgstr "IPSEC"
+
+#: usr/local/www/diag_backup.php:114 usr/local/www/diag_backup.php:191
+#: usr/local/www/diag_backup.php:191
+msgid "PPTP Server"
+msgstr "PPTPサーバー"
+
+#: usr/local/www/diag_backup.php:115 usr/local/www/diag_backup.php:193
+#: usr/local/www/diag_backup.php:193
+msgid "Scheduled Tasks"
+msgstr "予定されたタスク"
+
+#: usr/local/www/diag_backup.php:116 usr/local/www/diag_backup.php:194
+#: usr/local/www/diag_backup.php:194
+msgid "Syslog"
+msgstr "Syslogの"
+
+#: usr/local/www/diag_backup.php:118 usr/local/www/diag_backup.php:196
+#: usr/local/www/diag_backup.php:196
+msgid "Static routes"
+msgstr "スタティックルート"
+
+#: usr/local/www/diag_backup.php:119 usr/local/www/diag_backup.php:197
+#: usr/local/www/diag_backup.php:197
+msgid "System tunables"
+msgstr "システム調整パラメータ"
+
+#: usr/local/www/diag_backup.php:120 usr/local/www/diag_backup.php:198
+#: usr/local/www/diag_backup.php:198
+msgid "SNMP Server"
+msgstr "SNMPサーバ"
+
+#: usr/local/www/diag_backup.php:122 usr/local/www/diag_backup.php:200
+#: usr/local/www/diag_backup.php:200
+msgid "VLANS"
+msgstr "のVLAN"
+
+#: usr/local/www/diag_backup.php:130 usr/local/www/diag_backup.php:205
+#: usr/local/www/diag_backup.php:205
+msgid "ALL"
+msgstr "ALL"
+
+#: usr/local/www/diag_backup.php:157 usr/local/www/diag_backup.php:619
+#: usr/local/www/diag_backup.php:654 usr/local/www/diag_backup.php:244
+#: usr/local/www/diag_backup.php:698 usr/local/www/diag_backup.php:735
+#: usr/local/www/diag_backup.php:703 usr/local/www/diag_backup.php:740
+#: usr/local/www/diag_backup.php:244 usr/local/www/diag_backup.php:703
+#: usr/local/www/diag_backup.php:740
+msgid "Restore configuration"
+msgstr "設定を復元する"
+
+#: usr/local/www/diag_backup.php:159 usr/local/www/diag_backup.php:246
+#: usr/local/www/diag_backup.php:246
+msgid "Reinstall"
+msgstr "再インストールする"
+
+#: usr/local/www/diag_backup.php:161 usr/local/www/diag_backup.php:673
+#: usr/local/www/diag_backup.php:248 usr/local/www/diag_backup.php:754
+#: usr/local/www/diag_backup.php:762 usr/local/www/diag_backup.php:248
+#: usr/local/www/diag_backup.php:762
+msgid "Clear Package Lock"
+msgstr "クリアパッケージ·ロック"
+
+#: usr/local/www/diag_backup.php:165 usr/local/www/diag_backup.php:252
+#: usr/local/www/diag_backup.php:252
+msgid "Restore version"
+msgstr "バージョンを復元"
+
+#: usr/local/www/diag_backup.php:180 usr/local/www/diag_backup.php:267
+#: usr/local/www/diag_backup.php:267
+msgid "You must supply and confirm the password for encryption."
+msgstr "あなたは、暗号化のパスワードを入力して確認する必要があります。"
+
+#: usr/local/www/diag_backup.php:182 usr/local/www/diag_backup.php:268
+#: usr/local/www/diag_backup.php:269 usr/local/www/diag_backup.php:346
+#: usr/local/www/diag_backup.php:269 usr/local/www/diag_backup.php:346
+msgid "The supplied 'Password' and 'Confirm' field values must match."
+msgstr "供給'パスワード'と' CONFIRM」フィールドの値が一致している必要があります。"
+
+#: usr/local/www/diag_backup.php:266 usr/local/www/diag_backup.php:344
+#: usr/local/www/diag_backup.php:344
+msgid "You must supply and confirm the password for decryption."
+msgstr "あなたは、復号化にパスワードを入力して確認する必要があります。"
+
+#: usr/local/www/diag_backup.php:278 usr/local/www/diag_backup.php:356
+#: usr/local/www/diag_backup.php:356
+#, php-format
+msgid "Warning, could not read file %s"
+msgstr "、警告ファイル%sを読み取ることができませんでした"
+
+#: usr/local/www/diag_backup.php:284 usr/local/www/diag_backup.php:362
+#: usr/local/www/diag_backup.php:362
+msgid ""
+"The uploaded file does not appear to contain an encrypted pfsense "
+"configuration."
+msgstr "コンフィグレーション"アップロードされたファイルは暗号化されたpfsenseを含むように表示されません」 。"
+
+#: usr/local/www/diag_backup.php:291 usr/local/www/diag_backup.php:369
+#: usr/local/www/diag_backup.php:369
+msgid "Upgrading m0n0wall configuration to pfsense."
+msgstr "pfsenseするm0n0wallの構成をアップグレードする。"
+
+#: usr/local/www/diag_backup.php:299 usr/local/www/diag_backup.php:377
+#: usr/local/www/diag_backup.php:380 usr/local/www/diag_backup.php:377
+#: usr/local/www/diag_backup.php:380
+msgid ""
+"You have selected to restore an area but we could not locate the correct xml "
+"tag."
+msgstr "「あなたは、エリアを回復するために選択したが、我々は正しいXML見つけることができませんでした"タグを。"
+
+#: usr/local/www/diag_backup.php:303 usr/local/www/diag_backup.php:392
+#: usr/local/www/diag_backup.php:392
+msgid ""
+"The configuration area has been restored. You may need to reboot the "
+"firewall."
+msgstr "「設定領域が復元されました。再起動する必要があるかもしれません」のファイアウォールを。"
+
+#: usr/local/www/diag_backup.php:307 usr/local/www/diag_backup.php:397
+#: usr/local/www/diag_backup.php:397
+#, php-format
+msgid ""
+"You have selected to restore the full configuration but we could not locate "
+"a %s tag."
+msgstr "「あなたは、完全な構成を復元することを選択したが、我々は見つけることができませんでした」 %sタグを。"
+
+#: usr/local/www/diag_backup.php:438 usr/local/www/diag_backup.php:515
+#: usr/local/www/diag_backup.php:515
+msgid "The m0n0wall configuration has been restored and upgraded to pfSense."
+msgstr "m0n0wallの構成はpfSenseに復元してアップグレードされました。"
+
+#: usr/local/www/diag_backup.php:461 usr/local/www/diag_backup.php:485
+#: usr/local/www/diag_backup.php:538 usr/local/www/diag_backup.php:562
+#: usr/local/www/diag_backup.php:543 usr/local/www/diag_backup.php:567
+#: usr/local/www/diag_backup.php:543 usr/local/www/diag_backup.php:567
+msgid "The configuration could not be restored."
+msgstr "設定は復元できませんでした。"
+
+#: usr/local/www/diag_backup.php:466 usr/local/www/diag_backup.php:543
+#: usr/local/www/diag_backup.php:548 usr/local/www/diag_backup.php:548
+msgid "The configuration could not be restored (file upload error)."
+msgstr "構成は、 (ファイルのアップロードエラー)復元できませんでした。"
+
+#: usr/local/www/diag_backup.php:479 usr/local/www/diag_backup.php:556
+#: usr/local/www/diag_backup.php:561 usr/local/www/diag_backup.php:561
+msgid ""
+"XXX - this feature may hose your config (do NOT backrev configs!) - billm"
+msgstr "「XXX - この機能は、あなたの設定をホースも( backrevないコンフィグを行う ! ) - billm"
+
+#: usr/local/www/diag_backup.php:488 usr/local/www/diag_backup.php:565
+#: usr/local/www/diag_backup.php:570 usr/local/www/diag_backup.php:570
+msgid "No version selected."
+msgstr "noバージョンが選択されていません。"
+
+#: usr/local/www/diag_backup.php:499 usr/local/www/diag_backup.php:576
+#: usr/local/www/diag_backup.php:581 usr/local/www/diag_backup.php:581
+msgid "Backup/restore"
+msgstr "バックアップ/リストア"
+
+#: usr/local/www/diag_backup.php:540
+#: usr/local/www/system_firmware_restorefullbackup.php:116
+#: usr/local/www/diag_backup.php:619 usr/local/www/diag_backup.php:624
+#: usr/local/www/diag_backup.php:624
+#: usr/local/www/system_firmware_restorefullbackup.php:116
+msgid "The firewall configuration has been changed."
+msgstr "ファイアウォールの設定が変更されました。"
+
+#: usr/local/www/diag_backup.php:540
+#: usr/local/www/system_firmware_restorefullbackup.php:116
+#: usr/local/www/diag_backup.php:619 usr/local/www/diag_backup.php:624
+#: usr/local/www/diag_backup.php:624
+#: usr/local/www/system_firmware_restorefullbackup.php:116
+msgid "The firewall is now rebooting."
+msgstr "ファイアウォールは、今、再起動されます。"
+
+#: usr/local/www/diag_backup.php:549 usr/local/www/diag_confbak.php:139
+#: usr/local/www/diag_backup.php:628 usr/local/www/diag_backup.php:633
+#: usr/local/www/diag_backup.php:633 usr/local/www/diag_confbak.php:139
+msgid "Config History"
+msgstr "設定変更の歴史"
+
+#: usr/local/www/diag_backup.php:550 usr/local/www/diag_confbak.php:140
+#: usr/local/www/fbegin.inc:190 usr/local/www/fbegin.inc:208
+#: usr/local/www/diag_backup.php:629 usr/local/www/fbegin.inc:216
+#: usr/local/www/diag_backup.php:634 usr/local/www/fbegin.inc:207
+#: usr/local/www/diag_backup.php:634 usr/local/www/fbegin.inc:207
+#: usr/local/www/diag_confbak.php:140
+msgid "Backup/Restore"
+msgstr "バックアップ/復元"
+
+#: usr/local/www/diag_backup.php:560 usr/local/www/diag_backup.php:639
+#: usr/local/www/diag_backup.php:644 usr/local/www/diag_backup.php:644
+msgid "Backup configuration"
+msgstr "バックアップの構成"
+
+#: usr/local/www/diag_backup.php:565 usr/local/www/diag_backup.php:644
+#: usr/local/www/diag_backup.php:649 usr/local/www/diag_backup.php:649
+msgid "Click this button to download the system configuration in XML format."
+msgstr "XML形式でシステム構成をダウンロードするにはこのボタンをクリックします。"
+
+#: usr/local/www/diag_backup.php:565 usr/local/www/diag_backup.php:644
+#: usr/local/www/diag_backup.php:649 usr/local/www/diag_backup.php:649
+msgid "Backup area:"
+msgstr "バックアップ領域:"
+
+#: usr/local/www/diag_backup.php:572 usr/local/www/diag_backup.php:651
+#: usr/local/www/diag_backup.php:656 usr/local/www/diag_backup.php:656
+msgid "Do not backup package information."
+msgstr "バックアップされないパッケージ情報を行います。"
+
+#: usr/local/www/diag_backup.php:582 usr/local/www/diag_backup.php:661
+#: usr/local/www/diag_backup.php:666 usr/local/www/diag_backup.php:666
+msgid "Encrypt this configuration file."
+msgstr "この構成ファイルを暗号化する。"
+
+#: usr/local/www/diag_backup.php:590 usr/local/www/diag_backup.php:669
+#: usr/local/www/diag_backup.php:674 usr/local/www/diag_backup.php:674
+msgid ""
+"Do not backup RRD data (NOTE: RRD Data can consume 4+ megabytes of config."
+"xml space!)"
+msgstr "「 ( !バックアップしないRRDデータDO注: RRDデータ設定の4メガバイトを消費する可能性が「XML空間 )"
+
+#: usr/local/www/diag_backup.php:605 usr/local/www/diag_backup.php:684
+#: usr/local/www/diag_backup.php:689 usr/local/www/diag_backup.php:689
+msgid "confirm:"
+msgstr "確認してください。"
+
+#: usr/local/www/diag_backup.php:612 usr/local/www/diag_backup.php:691
+#: usr/local/www/diag_backup.php:696 usr/local/www/diag_backup.php:696
+msgid "Download configuration"
+msgstr "ダウンロードの設定"
+
+#: usr/local/www/diag_backup.php:624 usr/local/www/diag_backup.php:703
+#: usr/local/www/diag_backup.php:708 usr/local/www/diag_backup.php:708
+msgid "Open a"
+msgstr "オープンA"
+
+#: usr/local/www/diag_backup.php:624 usr/local/www/diag_backup.php:703
+#: usr/local/www/diag_backup.php:708 usr/local/www/diag_backup.php:708
+msgid ""
+"configuration XML file and click the button below to restore the "
+"configuration."
+msgstr "「構成XMLファイルおよび復元するには、以下のボタンをクリックして「設定を。"
+
+#: usr/local/www/diag_backup.php:624 usr/local/www/diag_backup.php:705
+#: usr/local/www/diag_backup.php:710 usr/local/www/diag_backup.php:710
+msgid "Restore area:"
+msgstr "エリアを復元します。"
+
+#: usr/local/www/diag_backup.php:632 usr/local/www/diag_backup.php:713
+#: usr/local/www/diag_backup.php:718 usr/local/www/diag_backup.php:718
+msgid "Configuration file is encrypted."
+msgstr "設定ファイルが暗号化されています。"
+
+#: usr/local/www/diag_backup.php:639 usr/local/www/diag_backup.php:720
+#: usr/local/www/diag_backup.php:725 usr/local/www/diag_backup.php:725
+msgid "Password :"
+msgstr "パスワード:"
+
+#: usr/local/www/diag_backup.php:647 usr/local/www/diag_backup.php:728
+#: usr/local/www/diag_backup.php:733 usr/local/www/diag_backup.php:733
+msgid "confirm :"
+msgstr "確認してください。"
+
+#: usr/local/www/diag_backup.php:655 usr/local/www/diag_backup.php:736
+#: usr/local/www/diag_backup.php:741 usr/local/www/diag_backup.php:741
+msgid "The firewall will reboot after restoring the configuration."
+msgstr "ファイアウォールは、設定を復元した後に再起動します。"
+
+#: usr/local/www/diag_backup.php:663 usr/local/www/diag_backup.php:744
+#: usr/local/www/diag_backup.php:749 usr/local/www/diag_backup.php:749
+msgid "Package Functions"
+msgstr "パッケージ·ファンクション"
+
+#: usr/local/www/diag_backup.php:668 usr/local/www/diag_backup.php:749
+#: usr/local/www/diag_backup.php:755 usr/local/www/diag_backup.php:755
+msgid ""
+"Click this button to reinstall all system packages. This may take a while."
+msgstr "「すべてのシステムパッケージを再インストールするには、このボタンをクリックしてください。これは時間がかかることがあります。"
+
+#: usr/local/www/diag_backup.php:669 usr/local/www/diag_backup.php:750
+#: usr/local/www/diag_backup.php:756 usr/local/www/diag_backup.php:756
+msgid "Reinstall packages"
+msgstr "パッケージを再インストール"
+
+#: usr/local/www/diag_backup.php:672 usr/local/www/diag_backup.php:753
+#: usr/local/www/diag_backup.php:761 usr/local/www/diag_backup.php:761
+msgid ""
+"Click this button to clear the package lock if a package fails to reinstall "
+"properly after an upgrade."
+msgstr "適切にアップグレード後、「パッケージが再インストールに失敗した場合、パッケージのロックをクリアするには、このボタンをクリックしてください"。"
+
+#: usr/local/www/firewall_shaper_queues.php:172
+#: usr/local/www/firewall_shaper_queues.php:172
+msgid "Firewall: Shaper: By Queues View"
+msgstr "ファイアウォール:シェイパー:キューを見ることにより、"
+
+#: usr/local/www/diag_confbak.php:49 usr/local/www/diag_confbak.php:49
+#, php-format
+msgid "Successfully reverted to timestamp %1$s with description "%2$s"."
+msgstr "首尾よく説明「 %2$s 」とタイムスタンプは%1$sに戻った。"
+
+#: usr/local/www/diag_confbak.php:49 usr/local/www/diag_confbak.php:59
+#: usr/local/www/diag_confbak.php:111 usr/local/www/diag_confbak.php:161
+#: usr/local/www/diag_confbak.php:169 usr/local/www/diag_confbak.php:162
+#: usr/local/www/diag_confbak.php:171
+#: usr/local/www/firewall_rules_edit.php:1585
+#: usr/local/www/firewall_rules_edit.php:1593
+#: usr/local/www/firewall_nat_edit.php:869
+#: usr/local/www/firewall_nat_edit.php:877
+#: usr/local/www/firewall_nat_out_edit.php:684
+#: usr/local/www/firewall_nat_out_edit.php:692
+#: usr/local/www/firewall_rules_edit.php:1596
+#: usr/local/www/firewall_rules_edit.php:1604
+#: usr/local/www/firewall_nat_edit.php:870
+#: usr/local/www/firewall_nat_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:1596
+#: usr/local/www/firewall_rules_edit.php:1604
+#: usr/local/www/firewall_nat_edit.php:870
+#: usr/local/www/firewall_nat_edit.php:878 usr/local/www/diag_confbak.php:49
+#: usr/local/www/diag_confbak.php:59 usr/local/www/diag_confbak.php:111
+#: usr/local/www/diag_confbak.php:162 usr/local/www/diag_confbak.php:171
+#: usr/local/www/firewall_nat_out_edit.php:684
+#: usr/local/www/firewall_nat_out_edit.php:692
+msgid "n/j/y H:i:s"
+msgstr "N / J / YのH : I: S"
+
+#: usr/local/www/diag_confbak.php:51 usr/local/www/diag_confbak.php:51
+msgid "Unable to revert to the selected configuration."
+msgstr "選択された構成に戻すことができません。"
+
+#: usr/local/www/diag_confbak.php:59 usr/local/www/diag_confbak.php:59
+#, php-format
+msgid "Deleted backup with timestamp %1$s and description "%2$s"."
+msgstr "タイムスタンプは%1$sと説明「 %2$s 」で削除されたバックアップ。"
+
+#: usr/local/www/diag_confbak.php:98 usr/local/www/diag_confbak.php:98
+msgid "Configuration History"
+msgstr "構成履歴"
+
+#: usr/local/www/diag_confbak.php:111 usr/local/www/diag_confbak.php:111
+msgid "Configuration diff from"
+msgstr "から設定デフ"
+
+#: usr/local/www/diag_confbak.php:152 usr/local/www/diag_confbak.php:206
+#: usr/local/www/diag_confbak.php:208 usr/local/www/diag_confbak.php:152
+#: usr/local/www/diag_confbak.php:208
+msgid "Diff"
+msgstr "デフ"
+
+#: usr/local/www/diag_confbak.php:153
+#: usr/local/www/system_firmware_restorefullbackup.php:140
+#: usr/local/www/system_firmware_restorefullbackup.php:140
+#: usr/local/www/diag_confbak.php:153
+msgid "Date"
+msgstr "日付"
+
+#: usr/local/www/diag_confbak.php:154 usr/local/www/diag_confbak.php:155
+#: usr/local/www/diag_confbak.php:155
+msgid "Configuration Change"
+msgstr "構成変更"
+
+#: usr/local/www/diag_confbak.php:163 usr/local/www/diag_confbak.php:165
+#: usr/local/www/diag_confbak.php:165
+msgid "Current"
+msgstr "現在の"
+
+#: usr/local/www/diag_confbak.php:171 usr/local/www/diag_confbak.php:173
+#: usr/local/www/widgets/widgets/gateways.widget.php:105
+#: usr/local/www/widgets/widgets/gateways.widget.php:128
+#: usr/local/www/widgets/widgets/gateways.widget.php:129
+#: usr/local/www/widgets/widgets/gateways.widget.php:129
+#: usr/local/www/diag_confbak.php:173
+msgid "Unknown"
+msgstr "不明"
+
+#: usr/local/www/diag_confbak.php:189 usr/local/www/diag_confbak.php:191
+#: usr/local/www/diag_confbak.php:191
+msgid "Revert to this configuration?"
+msgstr "この構成に戻す?"
+
+#: usr/local/www/diag_confbak.php:190 usr/local/www/diag_confbak.php:192
+#: usr/local/www/diag_confbak.php:192
+msgid "Revert to this configuration"
+msgstr "この構成に戻す"
+
+#: usr/local/www/diag_confbak.php:194 usr/local/www/diag_confbak.php:196
+#: usr/local/www/diag_confbak.php:196
+msgid "Delete this configuration backup?"
+msgstr "この構成のバックアップを削除しますか?"
+
+#: usr/local/www/diag_confbak.php:195 usr/local/www/diag_confbak.php:197
+#: usr/local/www/diag_confbak.php:197
+msgid "Remove this backup"
+msgstr "このバックアップを削除"
+
+#: usr/local/www/diag_confbak.php:200 usr/local/www/diag_confbak.php:202
+#: usr/local/www/diag_confbak.php:202
+msgid "Download this backup"
+msgstr "このバックアップをダウンロードする"
+
+#: usr/local/www/diag_confbak.php:212 usr/local/www/diag_confbak.php:214
+#: usr/local/www/diag_confbak.php:214
+msgid "No backups found."
+msgstr "見つかりませバックアップはありません。"
+
+#: usr/local/www/firewall_virtual_ip.php:106
+#: usr/local/www/firewall_virtual_ip.php:103
+#: usr/local/www/firewall_virtual_ip.php:103
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"NAT mapping."
+msgstr "NATのマッピングは「それはまだ少なくとも1によって参照されているため、このエントリは削除できません」 。"
+
+#: usr/local/www/firewall_virtual_ip.php:118
+msgid "This entry cannot be deleted because it is still referenced by CARP"
+msgstr "それはまだCARPによって参照されているため、このエントリは削除できません"
+
+#: usr/local/www/firewall_virtual_ip.php:124
+msgid ""
+"This entry cannot be deleted because it is still referenced by ip alias entry"
+msgstr "それはまだIPエイリアスエントリによって参照されているため、 「このエントリは削除できません"
+
+#: usr/local/www/firewall_virtual_ip.php:149
+#: usr/local/www/firewall_virtual_ip.php:152
+#: usr/local/www/firewall_virtual_ip.php:166
+#: usr/local/www/firewall_virtual_ip.php:189
+#: usr/local/www/firewall_virtual_ip.php:189
+msgid "Virtual IP Addresses"
+msgstr "仮想IPアドレス"
+
+#: usr/local/www/firewall_virtual_ip.php:164
+#: usr/local/www/firewall_virtual_ip.php:167
+#: usr/local/www/firewall_virtual_ip.php:181
+#: usr/local/www/firewall_virtual_ip.php:204
+#: usr/local/www/firewall_virtual_ip.php:204
+msgid "The VIP configuration has been changed."
+msgstr "VIPの構成が変更されています。"
+
+#: usr/local/www/firewall_virtual_ip.php:172 usr/local/www/fbegin.inc:115
+#: usr/local/www/fbegin.inc:132 usr/local/www/fbegin.inc:141
+#: usr/local/www/firewall_virtual_ip.php:175
+#: usr/local/www/firewall_virtual_ip.php:189 usr/local/www/fbegin.inc:133
+#: usr/local/www/firewall_virtual_ip.php:212
+#: usr/local/www/firewall_virtual_ip.php:212 usr/local/www/fbegin.inc:133
+msgid "Virtual IPs"
+msgstr "仮想IP"
+
+#: usr/local/www/firewall_virtual_ip.php:173
+#: usr/local/www/firewall_virtual_ip.php:176
+#: usr/local/www/firewall_virtual_ip.php:190
+#: usr/local/www/firewall_virtual_ip.php:213
+#: usr/local/www/firewall_virtual_ip.php:213
+msgid "CARP Settings"
+msgstr "CARPの設定"
+
+#: usr/local/www/firewall_virtual_ip.php:185
+#: usr/local/www/firewall_virtual_ip.php:188
+#: usr/local/www/firewall_virtual_ip.php:202
+#: usr/local/www/firewall_virtual_ip.php:225
+#: usr/local/www/firewall_virtual_ip.php:225
+msgid "Virtual IP address"
+msgstr "仮想IPアドレス"
+
+#: usr/local/www/firewall_virtual_ip.php:242
+#: usr/local/www/firewall_virtual_ip.php:248
+#: usr/local/www/firewall_virtual_ip.php:268
+#: usr/local/www/firewall_virtual_ip.php:291
+#: usr/local/www/firewall_virtual_ip.php:291
+msgid "The virtual IP addresses defined on this page may be used in"
+msgstr "このページで定義された仮想IPアドレスに使用することができる"
+
+#: usr/local/www/firewall_virtual_ip.php:242
+#: usr/local/www/firewall_virtual_ip.php:248
+#: usr/local/www/firewall_virtual_ip.php:268
+#: usr/local/www/firewall_virtual_ip.php:291
+#: usr/local/www/firewall_virtual_ip.php:291
+msgid "mappings."
+msgstr "マッピング。"
+
+#: usr/local/www/firewall_virtual_ip.php:243
+#: usr/local/www/firewall_virtual_ip.php:249
+#: usr/local/www/firewall_virtual_ip.php:269
+#: usr/local/www/firewall_virtual_ip.php:292
+#: usr/local/www/firewall_virtual_ip.php:292
+msgid "You can check the status of your CARP Virtual IPs and interfaces "
+msgstr "あなたは、CARPの仮想IPとインターフェイスのステータスを確認することができます"
+
+#: usr/local/www/guiconfig.inc:295 usr/local/www/guiconfig.inc:309
+#: usr/local/www/guiconfig.inc:298 usr/local/www/guiconfig.inc:297
+#: usr/local/www/guiconfig.inc:294 usr/local/www/guiconfig.inc:294
+msgid "apply"
+msgstr "適用する"
+
+#: usr/local/www/guiconfig.inc:295 usr/local/www/guiconfig.inc:309
+#: usr/local/www/guiconfig.inc:298 usr/local/www/guiconfig.inc:297
+#: usr/local/www/guiconfig.inc:294 usr/local/www/guiconfig.inc:294
+msgid "save"
+msgstr "保存"
+
+#: usr/local/www/guiconfig.inc:295 usr/local/www/vpn_ipsec_mobile.php:308
+#: usr/local/www/system_certmanager.php:541
+#: usr/local/www/system_certmanager.php:640 usr/local/www/guiconfig.inc:309
+#: usr/local/www/vpn_ipsec_mobile.php:335 usr/local/www/guiconfig.inc:298
+#: usr/local/www/system_certmanager.php:649 usr/local/www/guiconfig.inc:297
+#: usr/local/www/system_certmanager.php:650 usr/local/www/guiconfig.inc:294
+#: usr/local/www/system_certmanager.php:650
+#: usr/local/www/vpn_ipsec_mobile.php:335 usr/local/www/guiconfig.inc:294
+msgid "create"
+msgstr "作る"
+
+#: usr/local/www/halt.php:52 usr/local/www/halt.php:61
+#: usr/local/www/halt.php:61
+msgid "The system is halting now. This may take one minute."
+msgstr "システムが停止される。これは1分かかる場合があります。"
+
+#: usr/local/www/halt.php:59 usr/local/www/halt.php:54
+#: usr/local/www/halt.php:54
+msgid "Halt system"
+msgstr "停止システム"
+
+#: usr/local/www/halt.php:67 usr/local/www/halt.php:67
+msgid "Are you sure you want to halt the system?"
+msgstr "あなたはシステムを停止してもよろしいですか?"
+
+#: usr/local/www/index.php:115 usr/local/www/index.php:126
+#: usr/local/www/index.php:129 usr/local/www/index.php:126
+msgid "Widget configuration has been changed."
+msgstr "ウィジェットの構成が変更されました。"
+
+#: usr/local/www/index.php:172 usr/local/www/index.php:183
+#: usr/local/www/index.php:186 usr/local/www/index.php:183
+#, php-format
+msgid "Welcome to %s!\n"
+msgstr "%sへようこそ ! \n"
+
+#: usr/local/www/index.php:173 usr/local/www/index.php:184
+#: usr/local/www/index.php:187 usr/local/www/index.php:184
+msgid "One moment while we start the initial setup wizard."
+msgstr "一瞬、我々は最初のセットアップウィザードを開始している。"
+
+#: usr/local/www/index.php:174 usr/local/www/index.php:185
+#: usr/local/www/index.php:188 usr/local/www/index.php:185
+msgid ""
+"Embedded platform users: Please be patient, the wizard takes a little longer "
+"to run than the normal GUI."
+msgstr "通常のGUIよりも実行するには、次のように「組込みプラットフォームのユーザーは、しばらくお待ちください、ウィザードは少し時間がかかります」 。"
+
+#: usr/local/www/index.php:175 usr/local/www/index.php:186
+#: usr/local/www/index.php:189 usr/local/www/index.php:186
+#, php-format
+msgid "To bypass the wizard, click on the %s logo on the initial page."
+msgstr "ウィザードをバイパスするには、最初のページにある%sのロゴをクリックしてください。"
+
+#: usr/local/www/index.php:454 usr/local/www/index.php:446
+#: usr/local/www/index.php:463 usr/local/www/index.php:468
+#: usr/local/www/index.php:465 usr/local/www/index.php:465
+msgid "Status: Dashboard"
+msgstr "ステータス:ダッシュボード"
+
+#: usr/local/www/index.php:486 usr/local/www/index.php:478
+#: usr/local/www/index.php:490 usr/local/www/index.php:494
+#: usr/local/www/index.php:491 usr/local/www/index.php:491
+msgid "Available Widgets"
+msgstr "利用可能なウィジェット"
+
+#: usr/local/www/index.php:524 usr/local/www/index.php:516
+#: usr/local/www/index.php:528 usr/local/www/index.php:531
+#: usr/local/www/index.php:528
+msgid "Welcome to the Dashboard page"
+msgstr "ダッシュボードページへようこそ"
+
+#: usr/local/www/index.php:532 usr/local/www/index.php:524
+#: usr/local/www/index.php:536 usr/local/www/index.php:538
+#: usr/local/www/index.php:535 usr/local/www/index.php:535
+msgid ""
+"This page allows you to customize the information you want to be displayed!"
+msgstr ""このページでは、表示したい情報をカスタマイズすることができます !"
+
+#: usr/local/www/index.php:533 usr/local/www/index.php:525
+#: usr/local/www/index.php:537 usr/local/www/index.php:539
+#: usr/local/www/index.php:536 usr/local/www/index.php:536
+msgid "To get started click the"
+msgstr "クリック開始するには"
+
+#: usr/local/www/index.php:533 usr/local/www/index.php:525
+#: usr/local/www/index.php:537 usr/local/www/index.php:539
+#: usr/local/www/index.php:536 usr/local/www/index.php:536
+msgid "icon to add widgets."
+msgstr "ウィジェットを追加するには、アイコンが表示されます。"
+
+#: usr/local/www/index.php:535 usr/local/www/index.php:527
+#: usr/local/www/index.php:539 usr/local/www/index.php:541
+#: usr/local/www/index.php:538 usr/local/www/index.php:538
+msgid "You can move any widget around by clicking and dragging the title."
+msgstr "あなたはタイトルをクリックしてドラッグすることで周りの任意のウィジェットを移動することができます。"
+
+#: usr/local/www/index.php:541 usr/local/www/index.php:534
+#: usr/local/www/index.php:546 usr/local/www/index.php:548
+#: usr/local/www/index.php:545 usr/local/www/index.php:545
+msgid "Click here to add widgets"
+msgstr "ウィジェットを追加するには、ここをクリックしてください"
+
+#: usr/local/www/index.php:543 usr/local/www/index.php:536
+#: usr/local/www/index.php:548 usr/local/www/index.php:550
+#: usr/local/www/index.php:547 usr/local/www/index.php:547
+msgid "Click here for help"
+msgstr "ヘルプはこちらから"
+
+#: usr/local/www/index.php:547 usr/local/www/index.php:540
+#: usr/local/www/index.php:552 usr/local/www/index.php:554
+#: usr/local/www/index.php:551 usr/local/www/index.php:551
+msgid "Save Settings"
+msgstr "設定を保存する"
+
+#: usr/local/www/index.php:699 usr/local/www/index.php:692
+#: usr/local/www/index.php:704 usr/local/www/index.php:701
+#: usr/local/www/index.php:701
+msgid "Loading selected widget"
+msgstr "選択したウィジェットのロード"
+
+#: usr/local/www/interfaces.php:186 usr/local/www/interfaces.php:184
+#: usr/local/www/interfaces.php:185 usr/local/www/interfaces.php:185
+#, php-format
+msgid "Sorry, an alias with the name %s already exists."
+msgstr "申し訳ありませんが、名前%sとの別名がすでに存在しています。"
+
+#: usr/local/www/interfaces.php:327 usr/local/www/interfaces.php:355
+#: usr/local/www/interfaces.php:352 usr/local/www/interfaces.php:350
+#: usr/local/www/interfaces.php:351 usr/local/www/interfaces.php:350
+msgid "You have already applied your settings!"
+msgstr "あなたはすでにあなたの設定を適用した !"
+
+#: usr/local/www/interfaces.php:407 usr/local/www/interfaces.php:443
+#: usr/local/www/interfaces.php:440 usr/local/www/interfaces.php:428
+#: usr/local/www/interfaces.php:433 usr/local/www/interfaces.php:429
+#: usr/local/www/interfaces.php:429
+msgid "An interface with the specified description already exists."
+msgstr "指定された説明とのインタフェースがすでに存在しています。"
+
+#: usr/local/www/interfaces.php:413 usr/local/www/interfaces.php:449
+#: usr/local/www/interfaces.php:446 usr/local/www/interfaces.php:434
+#: usr/local/www/interfaces.php:439 usr/local/www/interfaces.php:435
+#: usr/local/www/interfaces.php:435
+msgid ""
+"The DHCP Server is active on this interface and it can be used only with a "
+"static IP configuration. Please disable the DHCP Server service on this "
+"interface first, then change the interface configuration."
+msgstr "「DHCPサーバは、このインターフェイスでアクティブになっていると、それだけで使用できる「静的IP設定。この「インターフェイス上でDHCPサーバーサービスを無効にしてくださいまず、そのインターフェイスの設定を変更してください。"
+
+#: usr/local/www/interfaces.php:415 usr/local/www/interfaces.php:451
+#: usr/local/www/interfaces.php:448 usr/local/www/interfaces.php:436
+#: usr/local/www/interfaces.php:441 usr/local/www/interfaces.php:437
+#: usr/local/www/interfaces.php:437
+msgid ""
+"The DHCP6 Server is active on this interface and it can be used only with a "
+"static IPv6 configuration. Please disable the DHCPv6 Server service on this "
+"interface first, then change the interface configuration."
+msgstr "「 DHCP6 Serverはこのインターフェイスでアクティブになっていると、それだけで使用できる「静的IPv6設定。この「インターフェイスでDHCPv6サーバサービスを無効にしてくださいまず、そのインターフェイスの設定を変更してください。"
+
+#: usr/local/www/interfaces.php:420 usr/local/www/interfaces.php:1364
+#: usr/local/www/status_interfaces.php:192
+#: usr/local/www/status_interfaces.php:266 usr/local/www/interfaces.php:456
+#: usr/local/www/interfaces.php:1468 usr/local/www/status_interfaces.php:269
+#: usr/local/www/interfaces.php:453 usr/local/www/interfaces.php:1456
+#: usr/local/www/interfaces.php:441 usr/local/www/interfaces.php:1469
+#: usr/local/www/interfaces.php:446 usr/local/www/interfaces.php:1514
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:1508
+#: usr/local/www/status_interfaces.php:269 usr/local/www/interfaces.php:442
+#: usr/local/www/interfaces.php:1508
+msgid "IPv4 address"
+msgstr "IPv4アドレス"
+
+#: usr/local/www/interfaces.php:420 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:456 usr/local/www/interfaces.php:509
+#: usr/local/www/interfaces.php:453 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:441 usr/local/www/interfaces.php:494
+#: usr/local/www/interfaces.php:446 usr/local/www/interfaces.php:499
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:495
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:495
+msgid "Subnet bit count"
+msgstr "サブネットビット数"
+
+#: usr/local/www/interfaces.php:427 usr/local/www/interfaces.php:480
+msgid ""
+"This interface is referenced by VIPs please delete those before setting the "
+"interface to 'none' configuration."
+msgstr "'none'に設定にインターフェイス「このインタフェースは、設定する前に、それらを削除してください要人によって参照されている」 。"
+
+#: usr/local/www/interfaces.php:432 usr/local/www/interfaces.php:485
+#: usr/local/www/interfaces.php:468 usr/local/www/interfaces.php:521
+#: usr/local/www/interfaces.php:531 usr/local/www/interfaces.php:541
+#: usr/local/www/interfaces.php:546 usr/local/www/interfaces.php:465
+#: usr/local/www/interfaces.php:518 usr/local/www/interfaces.php:528
+#: usr/local/www/interfaces.php:538 usr/local/www/interfaces.php:543
+#: usr/local/www/interfaces.php:453 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:516 usr/local/www/interfaces.php:526
+#: usr/local/www/interfaces.php:458 usr/local/www/interfaces.php:511
+#: usr/local/www/interfaces.php:523 usr/local/www/interfaces.php:533
+#: usr/local/www/interfaces.php:454 usr/local/www/interfaces.php:507
+#: usr/local/www/interfaces.php:519 usr/local/www/interfaces.php:529
+#: usr/local/www/interfaces.php:534 usr/local/www/interfaces.php:454
+#: usr/local/www/interfaces.php:507 usr/local/www/interfaces.php:519
+#: usr/local/www/interfaces.php:529 usr/local/www/interfaces.php:534
+#, php-format
+msgid "You have to reassign the interface to be able to configure as %s."
+msgstr "あなたは%s.として設定することができるように、インターフェイスを再割り当てする必要があります"
+
+#: usr/local/www/interfaces.php:436 usr/local/www/interfaces.php:1748
+#: usr/local/www/interfaces.php:472 usr/local/www/interfaces.php:1926
+#: usr/local/www/interfaces.php:469 usr/local/www/interfaces.php:1914
+#: usr/local/www/interfaces.php:457 usr/local/www/interfaces.php:1938
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:1984
+#: usr/local/www/interfaces.php:458 usr/local/www/interfaces.php:1972
+#: usr/local/www/interfaces.php:458 usr/local/www/interfaces.php:1972
+msgid "Modem Port"
+msgstr "モデムポート"
+
+#: usr/local/www/interfaces.php:436 usr/local/www/interfaces.php:1736
+#: usr/local/www/interfaces_ppps_edit.php:182
+#: usr/local/www/interfaces_ppps_edit.php:523 usr/local/www/interfaces.php:472
+#: usr/local/www/interfaces.php:1914
+#: usr/local/www/interfaces_ppps_edit.php:524 usr/local/www/interfaces.php:469
+#: usr/local/www/interfaces.php:1902
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:530 usr/local/www/interfaces.php:457
+#: usr/local/www/interfaces.php:1926 usr/local/www/interfaces.php:462
+#: usr/local/www/interfaces.php:1972
+#: usr/local/www/interfaces_ppps_edit.php:528 usr/local/www/interfaces.php:458
+#: usr/local/www/interfaces.php:1960
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:528 usr/local/www/interfaces.php:458
+#: usr/local/www/interfaces.php:1960
+msgid "Phone Number"
+msgstr "電話番号"
+
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:445
+#: usr/local/www/interfaces.php:478 usr/local/www/interfaces.php:481
+#: usr/local/www/interfaces.php:475 usr/local/www/interfaces.php:463
+#: usr/local/www/interfaces.php:466 usr/local/www/interfaces.php:468
+#: usr/local/www/interfaces.php:471 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:467 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:467
+msgid "PPPoE username"
+msgstr "PPPoEのユーザ名"
+
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:445
+#: usr/local/www/interfaces.php:478 usr/local/www/interfaces.php:481
+#: usr/local/www/interfaces.php:475 usr/local/www/interfaces.php:463
+#: usr/local/www/interfaces.php:466 usr/local/www/interfaces.php:468
+#: usr/local/www/interfaces.php:471 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:467 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:467
+msgid "PPPoE password"
+msgstr "PPPoEのパスワード"
+
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:452
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:1807
+#: usr/local/www/interfaces.php:1926
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:199 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:498
+#: usr/local/www/interfaces.php:1985 usr/local/www/interfaces.php:2104
+#: usr/local/www/interfaces.php:475 usr/local/www/interfaces.php:485
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:1973
+#: usr/local/www/interfaces.php:2092
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:205 usr/local/www/interfaces.php:463
+#: usr/local/www/interfaces.php:473 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:2000 usr/local/www/interfaces.php:2122
+#: usr/local/www/interfaces.php:468 usr/local/www/interfaces.php:2046
+#: usr/local/www/interfaces.php:2168 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:474 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:2035 usr/local/www/interfaces.php:2157
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:205 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:474 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:2035 usr/local/www/interfaces.php:2157
+msgid "Dial on demand"
+msgstr "ダイヤルオンデマンド"
+
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:452
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:199 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:498
+#: usr/local/www/interfaces.php:475 usr/local/www/interfaces.php:485
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:205 usr/local/www/interfaces.php:463
+#: usr/local/www/interfaces.php:473 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:468 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:474 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:205 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:474 usr/local/www/interfaces.php:484
+msgid "Idle timeout value"
+msgstr "アイドルタイムアウト値"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477
+msgid "PPTP username"
+msgstr "PPTPユーザ名"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477
+msgid "PPTP password"
+msgstr "PPTPのパスワード"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477
+msgid "PPTP local IP address"
+msgstr "PPTPローカルIPアドレス"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477
+msgid "PPTP subnet"
+msgstr "PPTPサブネット"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477
+msgid "PPTP remote IP address"
+msgstr "PPTPリモートIPアドレス"
+
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:465
+#: usr/local/www/interfaces.php:498 usr/local/www/interfaces.php:501
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:486 usr/local/www/interfaces.php:488
+#: usr/local/www/interfaces.php:491 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:487 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:487
+msgid "L2TP username"
+msgstr "L2TPのユーザ名"
+
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:465
+#: usr/local/www/interfaces.php:498 usr/local/www/interfaces.php:501
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:486 usr/local/www/interfaces.php:488
+#: usr/local/www/interfaces.php:491 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:487 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:487
+msgid "L2TP password"
+msgstr "L2TPパスワード"
+
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:465
+#: usr/local/www/interfaces.php:498 usr/local/www/interfaces.php:501
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:486 usr/local/www/interfaces.php:488
+#: usr/local/www/interfaces.php:491 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:487 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:487
+msgid "L2TP remote IP address"
+msgstr "L2TPリモートIPアドレス"
+
+#: usr/local/www/interfaces.php:473 usr/local/www/interfaces.php:1470
+#: usr/local/www/status_interfaces.php:216 usr/local/www/diag_ndp.php:129
+#: usr/local/www/services_dhcpv6.php:804
+#: usr/local/www/services_dhcpv6_edit.php:198
+#: usr/local/www/status_dhcpv6_leases.php:359
+#: usr/local/www/services_dhcpv6_edit.php:201
+#: usr/local/www/status_interfaces.php:297
+#: usr/local/www/status_dhcpv6_leases.php:403 usr/local/www/interfaces.php:509
+#: usr/local/www/interfaces.php:1576 usr/local/www/services_dhcpv6.php:899
+#: usr/local/www/services_dhcpv6_edit.php:200
+#: usr/local/www/status_interfaces.php:300
+#: usr/local/www/status_dhcpv6_leases.php:404 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:1564 usr/local/www/services_dhcpv6.php:830
+#: usr/local/www/status_dhcpv6_leases.php:407
+#: usr/local/www/services_dhcpv6_edit.php:203
+#: usr/local/www/services_dhcpv6.php:851 usr/local/www/interfaces.php:494
+#: usr/local/www/interfaces.php:1574 usr/local/www/interfaces.php:499
+#: usr/local/www/interfaces.php:1620 usr/local/www/interfaces.php:495
+#: usr/local/www/interfaces.php:1613 usr/local/www/diag_ndp.php:129
+#: usr/local/www/status_dhcpv6_leases.php:407
+#: usr/local/www/services_dhcpv6_edit.php:203
+#: usr/local/www/status_interfaces.php:300
+#: usr/local/www/services_dhcpv6.php:851 usr/local/www/interfaces.php:495
+#: usr/local/www/interfaces.php:1613
+msgid "IPv6 address"
+msgstr "IPv6アドレス"
+
+#: usr/local/www/interfaces.php:493 usr/local/www/interfaces.php:563
+#: usr/local/www/interfaces.php:560 usr/local/www/interfaces.php:550
+#: usr/local/www/interfaces.php:557 usr/local/www/interfaces.php:553
+#: usr/local/www/interfaces.php:553
+msgid "A valid IPv4 address must be specified."
+msgstr "有効なIPv4アドレスを指定する必要があります。"
+
+#: usr/local/www/interfaces.php:495 usr/local/www/services_dhcpv6_edit.php:123
+#: usr/local/www/services_dhcpv6_edit.php:125 usr/local/www/interfaces.php:565
+#: usr/local/www/interfaces.php:562 usr/local/www/services_dhcpv6_edit.php:128
+#: usr/local/www/interfaces.php:574 usr/local/www/interfaces.php:570
+#: usr/local/www/services_dhcpv6_edit.php:128 usr/local/www/interfaces.php:570
+msgid "A valid IPv6 address must be specified."
+msgstr "有効なIPv6アドレスを指定する必要があります。"
+
+#: usr/local/www/interfaces.php:497 usr/local/www/interfaces.php:499
+#: usr/local/www/interfaces.php:567 usr/local/www/interfaces.php:569
+#: usr/local/www/interfaces.php:564 usr/local/www/interfaces.php:566
+#: usr/local/www/interfaces.php:579 usr/local/www/interfaces.php:581
+#: usr/local/www/interfaces.php:590 usr/local/www/interfaces.php:592
+#: usr/local/www/interfaces.php:586 usr/local/www/interfaces.php:588
+#: usr/local/www/interfaces.php:586 usr/local/www/interfaces.php:588
+msgid "A valid subnet bit count must be specified."
+msgstr "有効なサブネットビット数を指定する必要があります。"
+
+#: usr/local/www/interfaces.php:501 usr/local/www/interfaces.php:571
+#: usr/local/www/interfaces.php:568 usr/local/www/interfaces.php:583
+#: usr/local/www/interfaces.php:594 usr/local/www/interfaces.php:590
+#: usr/local/www/interfaces.php:590
+msgid "A valid alias IP address must be specified."
+msgstr "有効なエイリアスIPアドレスを指定する必要があります。"
+
+#: usr/local/www/interfaces.php:503 usr/local/www/interfaces.php:573
+#: usr/local/www/interfaces.php:570 usr/local/www/interfaces.php:585
+#: usr/local/www/interfaces.php:596 usr/local/www/interfaces.php:592
+#: usr/local/www/interfaces.php:592
+msgid "A valid alias subnet bit count must be specified."
+msgstr "有効なエイリアスサブネットビット数を指定する必要があります。"
+
+#: usr/local/www/interfaces.php:517 usr/local/www/system_routes_edit.php:103
+#: usr/local/www/system_routes_edit.php:104 usr/local/www/interfaces.php:587
+#: usr/local/www/interfaces.php:584 usr/local/www/interfaces.php:599
+#: usr/local/www/system_routes_edit.php:107 usr/local/www/interfaces.php:610
+#: usr/local/www/interfaces.php:606 usr/local/www/system_routes_edit.php:109
+#: usr/local/www/interfaces.php:606
+msgid "A valid gateway must be specified."
+msgstr "有効なゲートウェイを指定する必要があります。"
+
+#: usr/local/www/interfaces.php:521 usr/local/www/interfaces.php:591
+#: usr/local/www/interfaces.php:588 usr/local/www/interfaces.php:603
+#: usr/local/www/interfaces.php:614 usr/local/www/interfaces.php:610
+#: usr/local/www/interfaces.php:610
+msgid "The service name contains invalid characters."
+msgstr "サービス名に無効な文字が含まれています。"
+
+#: usr/local/www/interfaces.php:523 usr/local/www/interfaces.php:539
+#: usr/local/www/interfaces_ppps_edit.php:217 usr/local/www/interfaces.php:593
+#: usr/local/www/interfaces.php:609 usr/local/www/interfaces.php:590
+#: usr/local/www/interfaces.php:606 usr/local/www/interfaces_ppps_edit.php:223
+#: usr/local/www/interfaces.php:605 usr/local/www/interfaces.php:621
+#: usr/local/www/interfaces.php:616 usr/local/www/interfaces.php:632
+#: usr/local/www/interfaces.php:612 usr/local/www/interfaces.php:628
+#: usr/local/www/interfaces_ppps_edit.php:223 usr/local/www/interfaces.php:612
+#: usr/local/www/interfaces.php:628
+msgid "The idle timeout value must be an integer."
+msgstr "アイドルタイムアウト値は整数でなければなりません。"
+
+#: usr/local/www/interfaces.php:526 usr/local/www/interfaces_ppps_edit.php:220
+#: usr/local/www/interfaces.php:596 usr/local/www/interfaces.php:593
+#: usr/local/www/interfaces_ppps_edit.php:226 usr/local/www/interfaces.php:608
+#: usr/local/www/interfaces.php:619 usr/local/www/interfaces.php:615
+#: usr/local/www/interfaces_ppps_edit.php:226 usr/local/www/interfaces.php:615
+msgid "A valid PPPoE reset hour must be specified (0-23)."
+msgstr "有効なPPPoEのリセット時には、 ( 0-23 )を指定する必要があります。"
+
+#: usr/local/www/interfaces.php:529 usr/local/www/interfaces_ppps_edit.php:223
+#: usr/local/www/interfaces.php:599 usr/local/www/interfaces.php:596
+#: usr/local/www/interfaces_ppps_edit.php:229 usr/local/www/interfaces.php:611
+#: usr/local/www/interfaces.php:622 usr/local/www/interfaces.php:618
+#: usr/local/www/interfaces_ppps_edit.php:229 usr/local/www/interfaces.php:618
+msgid "A valid PPPoE reset minute must be specified (0-59)."
+msgstr "有効なPPPoEのリセット分( 0〜59)を指定する必要があります。"
+
+#: usr/local/www/interfaces.php:531 usr/local/www/interfaces_ppps_edit.php:225
+#: usr/local/www/interfaces.php:601 usr/local/www/interfaces.php:598
+#: usr/local/www/interfaces_ppps_edit.php:231 usr/local/www/interfaces.php:613
+#: usr/local/www/interfaces.php:624 usr/local/www/interfaces.php:620
+#: usr/local/www/interfaces_ppps_edit.php:231 usr/local/www/interfaces.php:620
+msgid "A valid PPPoE reset date must be specified (mm/dd/yyyy)."
+msgstr "有効なのPPPoEリセット日は( YYYY / MM / DD )を指定する必要があります。"
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:603
+#: usr/local/www/interfaces.php:600 usr/local/www/interfaces.php:615
+#: usr/local/www/interfaces.php:626 usr/local/www/interfaces.php:622
+#: usr/local/www/interfaces.php:622
+msgid "A valid PPTP local IP address must be specified."
+msgstr "有効なPPTPローカルIPアドレスを指定する必要があります。"
+
+#: usr/local/www/interfaces.php:535 usr/local/www/interfaces.php:605
+#: usr/local/www/interfaces.php:602 usr/local/www/interfaces.php:617
+#: usr/local/www/interfaces.php:628 usr/local/www/interfaces.php:624
+#: usr/local/www/interfaces.php:624
+msgid "A valid PPTP subnet bit count must be specified."
+msgstr "有効なPPTPサブネットビット数を指定する必要があります。"
+
+#: usr/local/www/interfaces.php:537 usr/local/www/interfaces.php:607
+#: usr/local/www/interfaces.php:604 usr/local/www/interfaces.php:619
+#: usr/local/www/interfaces.php:630 usr/local/www/interfaces.php:626
+#: usr/local/www/interfaces.php:626
+msgid "A valid PPTP remote IP address must be specified."
+msgstr "有効なPPTPリモートIPアドレスを指定する必要があります。"
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:613
+#: usr/local/www/interfaces.php:610 usr/local/www/interfaces.php:625
+#: usr/local/www/interfaces.php:637 usr/local/www/interfaces.php:633
+#: usr/local/www/interfaces.php:633
+msgid "The MTU must be greater than 576 bytes."
+msgstr "MTUは、より大きく576バイトでなければなりません。"
+
+#: usr/local/www/interfaces.php:545 usr/local/www/interfaces.php:615
+#: usr/local/www/interfaces.php:612 usr/local/www/interfaces.php:627
+#: usr/local/www/interfaces.php:668 usr/local/www/interfaces.php:664
+#: usr/local/www/interfaces.php:664
+msgid "The MSS must be greater than 576 bytes."
+msgstr "MSSは、より大きく576バイトでなければなりません。"
+
+#: usr/local/www/interfaces.php:549 usr/local/www/interfaces.php:2164
+#: usr/local/www/load_balancer_pool.php:132 usr/local/www/vpn_ipsec.php:283
+#: usr/local/www/vpn_ipsec.php:457 usr/local/www/interfaces_wireless.php:107
+#: usr/local/www/interfaces_wireless_edit.php:84
+#: usr/local/www/interfaces_wireless_edit.php:176
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:187
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/status_lb_pool.php:131 usr/local/www/vpn_ipsec_phase2.php:404
+#: usr/local/www/vpn_ipsec.php:294 usr/local/www/vpn_ipsec.php:468
+#: usr/local/www/system_advanced_misc.php:334
+#: usr/local/www/vpn_ipsec_phase2.php:430 usr/local/www/interfaces.php:619
+#: usr/local/www/interfaces.php:2342
+#: usr/local/www/load_balancer_pool_edit.php:195
+#: usr/local/www/load_balancer_pool.php:133 usr/local/www/vpn_ipsec.php:293
+#: usr/local/www/vpn_ipsec.php:467 usr/local/www/system_advanced_misc.php:353
+#: usr/local/www/interfaces_wireless.php:108
+#: usr/local/www/vpn_ipsec_phase2.php:496 usr/local/www/interfaces.php:616
+#: usr/local/www/interfaces.php:2330
+#: usr/local/www/load_balancer_pool_edit.php:193
+#: usr/local/www/load_balancer_pool.php:131
+#: usr/local/www/interfaces_wireless_edit.php:86
+#: usr/local/www/interfaces_wireless_edit.php:178
+#: usr/local/www/vpn_ipsec.php:299 usr/local/www/vpn_ipsec.php:473
+#: usr/local/www/interfaces_wireless.php:110
+#: usr/local/www/vpn_ipsec_phase2.php:518 usr/local/www/interfaces.php:631
+#: usr/local/www/interfaces.php:2360 usr/local/www/interfaces.php:672
+#: usr/local/www/interfaces.php:2406 usr/local/www/interfaces.php:668
+#: usr/local/www/interfaces.php:2395
+#: usr/local/www/interfaces_wireless_edit.php:86
+#: usr/local/www/interfaces_wireless_edit.php:178
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/vpn_ipsec.php:299 usr/local/www/vpn_ipsec.php:473
+#: usr/local/www/interfaces_wireless.php:110
+#: usr/local/www/status_lb_pool.php:131
+#: usr/local/www/load_balancer_pool.php:131
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:193
+#: usr/local/www/vpn_ipsec_phase2.php:518 usr/local/www/interfaces.php:668
+#: usr/local/www/interfaces.php:2395
+msgid "Mode"
+msgstr "モード"
+
+#: usr/local/www/interfaces.php:549 usr/local/www/interfaces.php:2174
+#: usr/local/www/status_interfaces.php:265
+#: usr/local/www/status_interfaces.php:362 usr/local/www/interfaces.php:622
+#: usr/local/www/interfaces.php:2352 usr/local/www/status_interfaces.php:365
+#: usr/local/www/interfaces.php:619 usr/local/www/interfaces.php:2340
+#: usr/local/www/interfaces.php:634 usr/local/www/interfaces.php:2370
+#: usr/local/www/interfaces.php:675 usr/local/www/interfaces.php:2416
+#: usr/local/www/interfaces.php:671 usr/local/www/interfaces.php:2405
+#: usr/local/www/status_interfaces.php:365 usr/local/www/interfaces.php:671
+#: usr/local/www/interfaces.php:2405
+msgid "SSID"
+msgstr "SSID"
+
+#: usr/local/www/interfaces.php:583 usr/local/www/interfaces.php:657
+#: usr/local/www/interfaces.php:654 usr/local/www/interfaces.php:669
+#: usr/local/www/interfaces.php:710 usr/local/www/interfaces.php:706
+#: usr/local/www/interfaces.php:706
+msgid ""
+"Invalid WEP key size. Sizes should be 40 (64) bit keys or 104 (128) bit."
+msgstr ""無効なWEPキーのサイズ。サイズは40 ( 64 )ビットキー、または104 ( 128 )ビットでなければなりません。"
+
+#: usr/local/www/interfaces.php:591 usr/local/www/interfaces.php:665
+#: usr/local/www/interfaces.php:662 usr/local/www/interfaces.php:677
+#: usr/local/www/interfaces.php:718 usr/local/www/interfaces.php:714
+#: usr/local/www/interfaces.php:714
+msgid "The WPA passphrase must be between 8 and 63 characters long."
+msgstr "パスフレーズの長さは8 〜63文字にする必要があります。"
+
+#: usr/local/www/interfaces.php:659
+#, php-format
+msgid "Interface %s dynamic gateway"
+msgstr "インタフェースは、動的ゲートウェイを%s"
+
+#: usr/local/www/interfaces.php:1004 usr/local/www/interfaces.php:1090
+#: usr/local/www/interfaces.php:1078 usr/local/www/interfaces.php:1092
+#: usr/local/www/interfaces.php:1134 usr/local/www/interfaces.php:1129
+#: usr/local/www/interfaces.php:1129
+#, php-format
+msgid ""
+"Unable to change mode to %s. You may already have the maximum number of "
+"wireless clones supported in this mode."
+msgstr "このモードではサポートされた無線クローン"すでに最大数を持っていることがあり%s.するモードを変更することができません」 。"
+
+#: usr/local/www/interfaces.php:1032 usr/local/www/interfaces.php:1118
+#: usr/local/www/interfaces.php:1106 usr/local/www/interfaces.php:1120
+#: usr/local/www/interfaces.php:1162 usr/local/www/interfaces.php:1157
+#: usr/local/www/interfaces.php:1157
+msgid "Static IPv4"
+msgstr "静的IPv4"
+
+#: usr/local/www/interfaces.php:1032 usr/local/www/vpn_pppoe.php:86
+#: usr/local/www/status_interfaces.php:109
+#: usr/local/www/status_interfaces.php:127 usr/local/www/interfaces.php:1118
+#: usr/local/www/status_interfaces.php:130 usr/local/www/interfaces.php:1106
+#: usr/local/www/vpn_pppoe.php:87 usr/local/www/interfaces.php:1120
+#: usr/local/www/interfaces.php:1162 usr/local/www/interfaces.php:1157
+#: usr/local/www/vpn_pppoe.php:87 usr/local/www/status_interfaces.php:130
+#: usr/local/www/interfaces.php:1157
+msgid "PPPoE"
+msgstr "PPPoEの"
+
+#: usr/local/www/interfaces.php:1032 usr/local/www/status_interfaces.php:124
+#: usr/local/www/fbegin.inc:149 usr/local/www/fbegin.inc:166
+#: usr/local/www/status_interfaces.php:142 usr/local/www/interfaces.php:1118
+#: usr/local/www/fbegin.inc:174 usr/local/www/status_interfaces.php:145
+#: usr/local/www/interfaces.php:1106 usr/local/www/fbegin.inc:165
+#: usr/local/www/interfaces.php:1120 usr/local/www/interfaces.php:1162
+#: usr/local/www/interfaces.php:1157 usr/local/www/status_interfaces.php:145
+#: usr/local/www/fbegin.inc:165 usr/local/www/interfaces.php:1157
+msgid "PPTP"
+msgstr "PPTP"
+
+#: usr/local/www/interfaces.php:1032 usr/local/www/status_interfaces.php:139
+#: usr/local/www/fbegin.inc:150 usr/local/www/vpn_l2tp.php:38
+#: usr/local/www/vpn_l2tp_users.php:38
+#: usr/local/www/vpn_l2tp_users_edit.php:38 usr/local/www/fbegin.inc:167
+#: usr/local/www/status_interfaces.php:157 usr/local/www/interfaces.php:1118
+#: usr/local/www/fbegin.inc:175 usr/local/www/status_interfaces.php:160
+#: usr/local/www/interfaces.php:1106 usr/local/www/fbegin.inc:166
+#: usr/local/www/interfaces.php:1120 usr/local/www/interfaces.php:1162
+#: usr/local/www/interfaces.php:1157 usr/local/www/vpn_l2tp.php:38
+#: usr/local/www/status_interfaces.php:160 usr/local/www/vpn_l2tp_users.php:38
+#: usr/local/www/vpn_l2tp_users_edit.php:38 usr/local/www/fbegin.inc:166
+#: usr/local/www/interfaces.php:1157
+msgid "L2TP"
+msgstr "L2TP"
+
+#: usr/local/www/interfaces.php:1033 usr/local/www/interfaces.php:1119
+#: usr/local/www/interfaces.php:1107 usr/local/www/interfaces.php:1121
+#: usr/local/www/interfaces.php:1163 usr/local/www/interfaces.php:1158
+#: usr/local/www/interfaces.php:1158
+msgid "Static IPv6"
+msgstr "静的IPv6"
+
+#: usr/local/www/interfaces.php:1033 usr/local/www/interfaces.php:1119
+#: usr/local/www/interfaces.php:1107 usr/local/www/interfaces.php:1121
+#: usr/local/www/interfaces.php:1163 usr/local/www/interfaces.php:1158
+#: usr/local/www/interfaces.php:1158
+msgid "DHCP6"
+msgstr "DHCP6"
+
+#: usr/local/www/interfaces.php:1222 usr/local/www/interfaces.php:1326
+#: usr/local/www/interfaces.php:1314 usr/local/www/interfaces.php:1327
+#: usr/local/www/interfaces.php:1369 usr/local/www/interfaces.php:1364
+#: usr/local/www/interfaces.php:1364
+#, php-format
+msgid "The %s configuration has been changed."
+msgstr "%s構成が変更されています。"
+
+#: usr/local/www/interfaces.php:1222 usr/local/www/interfaces.php:1326
+#: usr/local/www/interfaces.php:1314 usr/local/www/interfaces.php:1327
+#: usr/local/www/interfaces.php:1369 usr/local/www/interfaces.php:1364
+#: usr/local/www/interfaces.php:1364
+msgid "Don't forget to adjust the DHCP Server range if needed after applying."
+msgstr "適用した後、必要に応じて、 DHCPサーバーの範囲を調整することを忘れないでください。"
+
+#: usr/local/www/interfaces.php:1231 usr/local/www/interfaces.php:1335
+#: usr/local/www/interfaces.php:1323 usr/local/www/interfaces.php:1336
+#: usr/local/www/interfaces.php:1378 usr/local/www/interfaces.php:1373
+#: usr/local/www/interfaces.php:1373
+msgid "General configuration"
+msgstr "一般的な構成"
+
+#: usr/local/www/interfaces.php:1237 usr/local/www/interfaces.php:1341
+#: usr/local/www/interfaces.php:1329 usr/local/www/interfaces.php:1342
+#: usr/local/www/interfaces.php:1384 usr/local/www/interfaces.php:1379
+#: usr/local/www/interfaces.php:1379
+msgid "Enable Interface"
+msgstr "インターフェイスをイネーブルにします"
+
+#: usr/local/www/interfaces.php:1247 usr/local/www/interfaces.php:1351
+#: usr/local/www/interfaces.php:1339 usr/local/www/interfaces.php:1352
+#: usr/local/www/interfaces.php:1394 usr/local/www/interfaces.php:1389
+#: usr/local/www/interfaces.php:1389
+msgid "Enter a description (name) for the interface here."
+msgstr "ここにインターフェイスの説明(名前)を入力します。"
+
+#: usr/local/www/interfaces.php:1251 usr/local/www/interfaces.php:1355
+#: usr/local/www/interfaces.php:1343 usr/local/www/interfaces.php:1356
+#: usr/local/www/interfaces.php:1398 usr/local/www/interfaces.php:1393
+#: usr/local/www/interfaces.php:1393
+msgid "IPv4 Configuration Type"
+msgstr "IPv4の構成タイプ"
+
+#: usr/local/www/interfaces.php:1267 usr/local/www/interfaces.php:1371
+#: usr/local/www/interfaces.php:1359 usr/local/www/interfaces.php:1372
+#: usr/local/www/interfaces.php:1414 usr/local/www/interfaces.php:1409
+#: usr/local/www/interfaces.php:1409
+msgid "IPv6 Configuration Type"
+msgstr "IPv6の構成タイプ"
+
+#: usr/local/www/interfaces.php:1292 usr/local/www/interfaces.php:1396
+#: usr/local/www/interfaces.php:1384 usr/local/www/interfaces.php:1397
+#: usr/local/www/interfaces.php:1439 usr/local/www/interfaces.php:1434
+#: usr/local/www/interfaces.php:1434
+msgid "Insert my local MAC address"
+msgstr "私の地元のMACアドレスを挿入"
+
+#: usr/local/www/interfaces.php:1295 usr/local/www/interfaces.php:1399
+#: usr/local/www/interfaces.php:1387 usr/local/www/interfaces.php:1400
+#: usr/local/www/interfaces.php:1442 usr/local/www/interfaces.php:1437
+#: usr/local/www/interfaces.php:1437
+msgid ""
+"This field can be used to modify ("spoof") the MAC address of this "
+"interface"
+msgstr "「これのMACアドレス "(なりすまし) 」インターフェースをこのフィールドに変更するために使用することができる""
+
+#: usr/local/www/interfaces.php:1297 usr/local/www/interfaces.php:1401
+#: usr/local/www/interfaces.php:1389 usr/local/www/interfaces.php:1402
+#: usr/local/www/interfaces.php:1444 usr/local/www/interfaces.php:1439
+#: usr/local/www/interfaces.php:1439
+msgid "(may be required with some cable connections)"
+msgstr "(一部のケーブル接続で必要となる場合があります)"
+
+#: usr/local/www/interfaces.php:1298 usr/local/www/interfaces.php:1402
+#: usr/local/www/interfaces.php:1390 usr/local/www/interfaces.php:1403
+#: usr/local/www/interfaces.php:1445 usr/local/www/interfaces.php:1440
+#: usr/local/www/interfaces.php:1440
+msgid ""
+"Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx or leave blank"
+msgstr "XX: XX : XX : XX : XX : XXまたは空白のままに"次の形式でMACアドレスを入力してください"
+
+#: usr/local/www/interfaces.php:1303
+#: usr/local/www/interfaces_ppps_edit.php:757
+#: usr/local/www/interfaces.php:1407
+#: usr/local/www/interfaces_ppps_edit.php:758
+#: usr/local/www/interfaces.php:1395
+#: usr/local/www/interfaces_ppps_edit.php:764
+#: usr/local/www/interfaces.php:1408 usr/local/www/interfaces.php:1450
+#: usr/local/www/interfaces_ppps_edit.php:761
+#: usr/local/www/interfaces.php:1445
+#: usr/local/www/interfaces_ppps_edit.php:761
+#: usr/local/www/interfaces.php:1445
+msgid "MTU"
+msgstr "MTU"
+
+#: usr/local/www/interfaces.php:1307
+msgid ""
+"If you leave this field blank, the adapter's default MTU will be used. This "
+"is typically 1500 bytes but can vary on some hardware."
+msgstr "「このフィールドを空白のままにすると、アダプタのデフォルトのMTUが使用されます。これは、「通常、 1500バイトですが、いくつかのハードウェア上で異なる場合があります。"
+
+#: usr/local/www/interfaces.php:1312 usr/local/www/interfaces.php:1416
+#: usr/local/www/interfaces.php:1404 usr/local/www/interfaces.php:1417
+#: usr/local/www/interfaces.php:1461 usr/local/www/interfaces.php:1456
+#: usr/local/www/interfaces.php:1456
+msgid "MSS"
+msgstr "MSS"
+
+#: usr/local/www/interfaces.php:1316 usr/local/www/interfaces.php:1420
+#: usr/local/www/interfaces.php:1408 usr/local/www/interfaces.php:1421
+#: usr/local/www/interfaces.php:1465 usr/local/www/interfaces.php:1460
+#: usr/local/www/interfaces.php:1460
+msgid ""
+"If you enter a value in this field, then MSS clamping for TCP connections to "
+"the value entered above minus 40 (TCP/IP header size) will be in effect."
+msgstr "マイナス40 ( TCP / IPヘッダのサイズ)の上に入力された値が有効になります"あなたは、このフィールドに値を入力すると、 MSSは、へのTCP接続するためのクランプ」 。"
+
+#: usr/local/www/interfaces.php:1325 usr/local/www/interfaces.php:1429
+#: usr/local/www/interfaces.php:1417 usr/local/www/interfaces.php:1430
+#: usr/local/www/interfaces.php:1474 usr/local/www/interfaces.php:1469
+#: usr/local/www/interfaces.php:1469
+msgid "Speed and duplex"
+msgstr "速度と二重"
+
+#: usr/local/www/interfaces.php:1346 usr/local/www/interfaces.php:1450
+#: usr/local/www/interfaces.php:1438 usr/local/www/interfaces.php:1451
+#: usr/local/www/interfaces.php:1495 usr/local/www/interfaces.php:1490
+#: usr/local/www/interfaces.php:1490
+msgid ""
+"Here you can explicitly set speed and duplex mode for this interface. "
+"WARNING: You MUST leave this set to autoselect (automatically negotiate "
+"speed) unless the port this interface connects to has its speed and duplex "
+"forced."
+msgstr "「ここでは、明示的にこのインターフェイスの速度と二重モードを設定することができます。 "警告:強制"このインタフェースが、その速度とデュプレックスが持っているに接続するポートがない限り(速度を自動的交渉) 」オートセレクトためにこのセットを残しておく必要があります。"
+
+#: usr/local/www/interfaces.php:1361 usr/local/www/interfaces.php:1465
+#: usr/local/www/interfaces.php:1453 usr/local/www/interfaces.php:1466
+#: usr/local/www/interfaces.php:1511 usr/local/www/interfaces.php:1505
+#: usr/local/www/interfaces.php:1505
+msgid "Static IPv4 configuration"
+msgstr "静的IPv4の設定"
+
+#: usr/local/www/interfaces.php:1400 usr/local/www/interfaces.php:1506
+#: usr/local/www/system_routes_edit.php:212
+#: usr/local/www/system_routes_edit.php:244 usr/local/www/interfaces.php:1504
+#: usr/local/www/interfaces.php:1612 usr/local/www/system_routes_edit.php:245
+#: usr/local/www/interfaces.php:1492 usr/local/www/interfaces.php:1600
+#: usr/local/www/interfaces.php:1505 usr/local/www/interfaces.php:1610
+#: usr/local/www/system_routes_edit.php:272 usr/local/www/interfaces.php:1550
+#: usr/local/www/interfaces.php:1656 usr/local/www/system_routes_edit.php:274
+#: usr/local/www/interfaces.php:1544 usr/local/www/interfaces.php:1649
+#: usr/local/www/system_routes_edit.php:268 usr/local/www/interfaces.php:1544
+#: usr/local/www/interfaces.php:1649
+msgid "add a new one."
+msgstr "新しいものを追加してください。"
+
+#: usr/local/www/interfaces.php:1403 usr/local/www/interfaces.php:1507
+#: usr/local/www/interfaces.php:1495 usr/local/www/interfaces.php:1508
+#: usr/local/www/interfaces.php:1553 usr/local/www/interfaces.php:1547
+#: usr/local/www/interfaces.php:1547
+msgid ""
+"If this interface is an Internet connection, select an existing Gateway from "
+"the list or add one using the link above"
+msgstr "リスト「このインタフェースは、インターネット接続の場合は、既存のゲートウェイを選択する」または上記のリンクを使用して1を追加"
+
+#: usr/local/www/interfaces.php:1417 usr/local/www/system_routes_edit.php:224
+#: usr/local/www/system_routes_edit.php:256 usr/local/www/interfaces.php:1521
+#: usr/local/www/system_routes_edit.php:257 usr/local/www/interfaces.php:1509
+#: usr/local/www/interfaces.php:1522 usr/local/www/system_routes_edit.php:283
+#: usr/local/www/interfaces.php:1567 usr/local/www/system_routes_edit.php:287
+#: usr/local/www/interfaces.php:1561 usr/local/www/system_routes_edit.php:281
+#: usr/local/www/interfaces.php:1561
+msgid "Add new gateway:"
+msgstr "新しいゲートウェイを追加します。"
+
+#: usr/local/www/interfaces.php:1425 usr/local/www/interfaces.php:1529
+#: usr/local/www/interfaces.php:1517 usr/local/www/interfaces.php:1530
+#: usr/local/www/interfaces.php:1575 usr/local/www/interfaces.php:1569
+#: usr/local/www/interfaces.php:1569
+msgid "Default gateway:"
+msgstr "デフォルトゲートウェイ:"
+
+#: usr/local/www/interfaces.php:1428 usr/local/www/system_routes_edit.php:240
+#: usr/local/www/system_routes_edit.php:272 usr/local/www/interfaces.php:1532
+#: usr/local/www/system_routes_edit.php:273 usr/local/www/interfaces.php:1520
+#: usr/local/www/interfaces.php:1533 usr/local/www/system_routes_edit.php:299
+#: usr/local/www/interfaces.php:1578 usr/local/www/system_routes_edit.php:305
+#: usr/local/www/interfaces.php:1572 usr/local/www/system_routes_edit.php:299
+#: usr/local/www/interfaces.php:1572
+msgid "Gateway Name:"
+msgstr "ゲートウェイ名:"
+
+#: usr/local/www/interfaces.php:1431 usr/local/www/interfaces.php:1535
+#: usr/local/www/interfaces.php:1523 usr/local/www/interfaces.php:1536
+#: usr/local/www/interfaces.php:1581 usr/local/www/interfaces.php:1575
+#: usr/local/www/interfaces.php:1575
+msgid "Gateway IPv4:"
+msgstr "ゲートウェイのIPv4 :"
+
+#: usr/local/www/interfaces.php:1434 usr/local/www/interfaces.php:1540
+#: usr/local/www/system_routes_edit.php:246
+#: usr/local/www/system_routes_edit.php:278 usr/local/www/interfaces.php:1538
+#: usr/local/www/interfaces.php:1646 usr/local/www/system_routes_edit.php:279
+#: usr/local/www/interfaces.php:1526 usr/local/www/interfaces.php:1634
+#: usr/local/www/interfaces.php:1539 usr/local/www/interfaces.php:1644
+#: usr/local/www/system_routes_edit.php:305 usr/local/www/interfaces.php:1584
+#: usr/local/www/interfaces.php:1690 usr/local/www/system_routes_edit.php:311
+#: usr/local/www/interfaces.php:1578 usr/local/www/interfaces.php:1683
+#: usr/local/www/system_routes_edit.php:305 usr/local/www/interfaces.php:1578
+#: usr/local/www/interfaces.php:1683
+msgid "Description:"
+msgstr "説明:"
+
+#: usr/local/www/interfaces.php:1442 usr/local/www/interfaces.php:1548
+#: usr/local/www/system_routes_edit.php:254
+#: usr/local/www/system_routes_edit.php:286 usr/local/www/interfaces.php:1654
+#: usr/local/www/system_routes_edit.php:287 usr/local/www/interfaces.php:1536
+#: usr/local/www/interfaces.php:1642 usr/local/www/interfaces.php:1546
+#: usr/local/www/interfaces.php:1651 usr/local/www/system_routes_edit.php:312
+#: usr/local/www/interfaces.php:1591 usr/local/www/interfaces.php:1697
+#: usr/local/www/system_routes_edit.php:318 usr/local/www/interfaces.php:1585
+#: usr/local/www/interfaces.php:1690 usr/local/www/system_routes_edit.php:312
+#: usr/local/www/interfaces.php:1585 usr/local/www/interfaces.php:1690
+msgid "Save Gateway"
+msgstr "ゲートウェイに保存"
+
+#: usr/local/www/interfaces.php:1467 usr/local/www/interfaces.php:1573
+#: usr/local/www/interfaces.php:1561 usr/local/www/interfaces.php:1571
+#: usr/local/www/interfaces.php:1617 usr/local/www/interfaces.php:1610
+#: usr/local/www/interfaces.php:1610
+msgid "Static IPv6 configuration"
+msgstr "静的IPv6構成"
+
+#: usr/local/www/interfaces.php:1488 usr/local/www/status_interfaces.php:231
+#: usr/local/www/status_interfaces.php:312 usr/local/www/interfaces.php:1594
+#: usr/local/www/status_interfaces.php:315 usr/local/www/interfaces.php:1582
+#: usr/local/www/interfaces.php:1592 usr/local/www/interfaces.php:1638
+#: usr/local/www/interfaces.php:1631 usr/local/www/status_interfaces.php:315
+#: usr/local/www/interfaces.php:1631
+msgid "Gateway IPv6"
+msgstr "ゲートウェイのIPv6"
+
+#: usr/local/www/interfaces.php:1509 usr/local/www/interfaces.php:1615
+#: usr/local/www/interfaces.php:1603 usr/local/www/interfaces.php:1613
+#: usr/local/www/interfaces.php:1659 usr/local/www/interfaces.php:1652
+#: usr/local/www/interfaces.php:1652
+msgid ""
+"If this interface is an Internet connection, select an existing Gateway from "
+"the list or add a new one using the link above"
+msgstr "リスト「このインタフェースは、インターネット接続の場合は、既存のゲートウェイを選択する」または上記のリンクを使用して、新しい1を追加"
+
+#: usr/local/www/interfaces.php:1523 usr/local/www/interfaces.php:1629
+#: usr/local/www/interfaces.php:1617 usr/local/www/interfaces.php:1627
+#: usr/local/www/interfaces.php:1673 usr/local/www/interfaces.php:1666
+#: usr/local/www/interfaces.php:1666
+msgid "Add new v6 gateway:"
+msgstr "新しいV6ゲートウェイを追加します。"
+
+#: usr/local/www/interfaces.php:1531 usr/local/www/interfaces.php:1637
+#: usr/local/www/interfaces.php:1625 usr/local/www/interfaces.php:1635
+#: usr/local/www/interfaces.php:1681 usr/local/www/interfaces.php:1674
+#: usr/local/www/interfaces.php:1674
+msgid "Default v6 gateway:"
+msgstr "デフォルトV6ゲートウェイ:"
+
+#: usr/local/www/interfaces.php:1534 usr/local/www/interfaces.php:1640
+#: usr/local/www/interfaces.php:1628 usr/local/www/interfaces.php:1638
+#: usr/local/www/interfaces.php:1684 usr/local/www/interfaces.php:1677
+#: usr/local/www/interfaces.php:1677
+msgid "Gateway Name IPv6:"
+msgstr "ゲートウェイ名のIPv6 :"
+
+#: usr/local/www/interfaces.php:1537 usr/local/www/interfaces.php:1643
+#: usr/local/www/interfaces.php:1631 usr/local/www/interfaces.php:1641
+#: usr/local/www/interfaces.php:1687 usr/local/www/interfaces.php:1680
+#: usr/local/www/interfaces.php:1680
+msgid "Gateway IPv6:"
+msgstr "ゲートウェイのIPv6 :"
+
+#: usr/local/www/interfaces.php:1564
+msgid "DHCPv6 Prefix Delegation ID"
+msgstr "DHCPv6のプレフィックス委任ID"
+
+#: usr/local/www/interfaces.php:1588
+msgid ""
+"This ID sets the delegated DHCP-PD prefix number which will be used to setup "
+"the interface."
+msgstr "インターフェース「このIDは、セットアップするために使用される委任DHCP -PDプレフィックス数を設定します」 。"
+
+#: usr/local/www/interfaces.php:1598 usr/local/www/interfaces.php:1676
+#: usr/local/www/interfaces.php:1664 usr/local/www/interfaces.php:1722
+#: usr/local/www/interfaces.php:1714 usr/local/www/interfaces.php:1714
+msgid "DHCP client configuration"
+msgstr "DHCPクライアントの構成"
+
+#: usr/local/www/interfaces.php:1602 usr/local/www/interfaces.php:1680
+#: usr/local/www/interfaces.php:1668 usr/local/www/interfaces.php:1726
+#: usr/local/www/interfaces.php:1718 usr/local/www/interfaces.php:1718
+msgid "Enable DHCP+"
+msgstr "DHCPを有効にする"
+
+#: usr/local/www/interfaces.php:1605 usr/local/www/interfaces.php:1683
+#: usr/local/www/interfaces.php:1671 usr/local/www/interfaces.php:1729
+#: usr/local/www/interfaces.php:1721 usr/local/www/interfaces.php:1721
+msgid "Enable DHCP+L2TP or DHCP+PPTP."
+msgstr "DHCP L2TPまたはDHCP PPTPを有効にします。"
+
+#: usr/local/www/interfaces.php:1607 usr/local/www/interfaces.php:1685
+#: usr/local/www/interfaces.php:1673 usr/local/www/interfaces.php:1731
+#: usr/local/www/interfaces.php:1723 usr/local/www/interfaces.php:1723
+msgid ""
+"Status changes on this interface will trigger reconfiguration (if necessary) "
+"of the associated PPTP/L2TP link."
+msgstr "関連するPPTP/L2TPリンクの「 (必要ならば)このインターフェイスのステータスの変更は、再設定をトリガーします」 。"
+
+#: usr/local/www/interfaces.php:1616 usr/local/www/interfaces.php:1694
+#: usr/local/www/interfaces.php:1682 usr/local/www/interfaces.php:1740
+#: usr/local/www/interfaces.php:1732 usr/local/www/interfaces.php:1732
+msgid ""
+"The value in this field is sent as the DHCP client identifier and hostname "
+"when requesting a DHCP lease. Some ISPs may require this (for client "
+"identification)."
+msgstr "DHCPリースを要求するときに「このフィールドの値は、DHCPクライアント識別子とホスト名として送信されます」 。 ISPによっては、この(クライアントの「識別)を必要とする場合があります。"
+
+#: usr/local/www/interfaces.php:1622 usr/local/www/interfaces.php:1700
+#: usr/local/www/interfaces.php:1688 usr/local/www/interfaces.php:1746
+#: usr/local/www/interfaces.php:1738 usr/local/www/interfaces.php:1738
+msgid "Alias IPv4 address"
+msgstr "別名IPv4アドレス"
+
+#: usr/local/www/interfaces.php:1636 usr/local/www/interfaces.php:1714
+#: usr/local/www/interfaces.php:1702 usr/local/www/interfaces.php:1760
+#: usr/local/www/interfaces.php:1752 usr/local/www/interfaces.php:1752
+msgid ""
+"The value in this field is used as a fixed alias IPv4 address by the DHCP "
+"client."
+msgstr "クライアント「このフィールドの値は、DHCPが固定エイリアスIPv4アドレスとして使用されます」 。"
+
+#: usr/local/www/interfaces.php:1647 usr/local/www/interfaces.php:1725
+#: usr/local/www/interfaces.php:1713 usr/local/www/interfaces.php:1728
+#: usr/local/www/interfaces.php:1774 usr/local/www/interfaces.php:1766
+#: usr/local/www/interfaces.php:1766
+msgid "DHCP6 client configuration"
+msgstr "DHCP6クライアント設定"
+
+#: usr/local/www/interfaces.php:1650 usr/local/www/interfaces.php:1729
+#: usr/local/www/interfaces.php:1717 usr/local/www/interfaces.php:1732
+#: usr/local/www/interfaces.php:1778 usr/local/www/interfaces.php:1770
+#: usr/local/www/interfaces.php:1770
+msgid "DHCPv6 Unique Identifier (DUID)"
+msgstr "DHCPv6の一意識別子( DUID )"
+
+#: usr/local/www/interfaces.php:1654 usr/local/www/interfaces.php:1733
+#: usr/local/www/interfaces.php:1721 usr/local/www/interfaces.php:1736
+#: usr/local/www/interfaces.php:1782 usr/local/www/interfaces.php:1774
+#: usr/local/www/interfaces.php:1774
+msgid ""
+"The value in this field is sent as the DHCPv6 client identifier when "
+"requesting a DHCPv6 lease."
+msgstr "DHCPv6のリースを要求する」と、このフィールドの値は、 DHCPv6クライアント識別子として送信されます」 。"
+
+#: usr/local/www/interfaces.php:1659 usr/local/www/interfaces.php:1738
+#: usr/local/www/interfaces.php:1726 usr/local/www/interfaces.php:1741
+#: usr/local/www/interfaces.php:1787 usr/local/www/interfaces.php:1779
+#: usr/local/www/interfaces.php:1779
+#, php-format
+msgid "The current DUID is: '%s'"
+msgstr "現在のDUIDは、次のとおりです。 「 %s'"
+
+#: usr/local/www/interfaces.php:1665 usr/local/www/interfaces.php:1745
+#: usr/local/www/interfaces.php:1733 usr/local/www/interfaces.php:1748
+#: usr/local/www/interfaces.php:1794 usr/local/www/interfaces.php:1786
+#: usr/local/www/interfaces.php:1786
+msgid "DHCPv6 Prefix Delegation size"
+msgstr "DHCPv6のプレフィックス委任サイズ"
+
+#: usr/local/www/interfaces.php:1678 usr/local/www/interfaces.php:1758
+#: usr/local/www/interfaces.php:1746 usr/local/www/interfaces.php:1761
+#: usr/local/www/interfaces.php:1807 usr/local/www/interfaces.php:1799
+#: usr/local/www/interfaces.php:1799
+msgid ""
+"The value in this field is the delegated prefix length provided by the "
+"DHCPv6 server. Normally specified by the ISP."
+msgstr "DHCPv6サーバ「このフィールドの値はが提供する委任プレフィックス長」です。通常、 ISPによって指定された。"
+
+#: usr/local/www/interfaces.php:1689 usr/local/www/interfaces.php:1867
+#: usr/local/www/interfaces.php:1855 usr/local/www/interfaces.php:1879
+#: usr/local/www/interfaces.php:1925 usr/local/www/interfaces.php:1913
+#: usr/local/www/interfaces.php:1913
+msgid "PPP configuration"
+msgstr "PPP設定"
+
+#: usr/local/www/interfaces.php:1692
+#: usr/local/www/interfaces_ppps_edit.php:478
+#: usr/local/www/interfaces.php:1870
+#: usr/local/www/interfaces_ppps_edit.php:479
+#: usr/local/www/interfaces.php:1858
+#: usr/local/www/interfaces_ppps_edit.php:485
+#: usr/local/www/interfaces.php:1882 usr/local/www/interfaces.php:1928
+#: usr/local/www/interfaces_ppps_edit.php:483
+#: usr/local/www/interfaces.php:1916
+#: usr/local/www/interfaces_ppps_edit.php:483
+#: usr/local/www/interfaces.php:1916
+msgid "Service Provider"
+msgstr "サービスプロバイダー"
+
+#: usr/local/www/interfaces.php:1696
+#: usr/local/www/interfaces_ppps_edit.php:482
+#: usr/local/www/interfaces.php:1874
+#: usr/local/www/interfaces_ppps_edit.php:483
+#: usr/local/www/interfaces.php:1862
+#: usr/local/www/interfaces_ppps_edit.php:489
+#: usr/local/www/interfaces.php:1886 usr/local/www/interfaces.php:1932
+#: usr/local/www/interfaces_ppps_edit.php:487
+#: usr/local/www/interfaces.php:1920
+#: usr/local/www/interfaces_ppps_edit.php:487
+#: usr/local/www/interfaces.php:1920
+msgid "Country:"
+msgstr "国:"
+
+#: usr/local/www/interfaces.php:1704
+#: usr/local/www/interfaces_ppps_edit.php:490
+#: usr/local/www/interfaces.php:1882
+#: usr/local/www/interfaces_ppps_edit.php:491
+#: usr/local/www/interfaces.php:1870
+#: usr/local/www/interfaces_ppps_edit.php:497
+#: usr/local/www/interfaces.php:1894 usr/local/www/interfaces.php:1940
+#: usr/local/www/interfaces_ppps_edit.php:495
+#: usr/local/www/interfaces.php:1928
+#: usr/local/www/interfaces_ppps_edit.php:495
+#: usr/local/www/interfaces.php:1928
+msgid "Provider:"
+msgstr "プロバイダー:"
+
+#: usr/local/www/interfaces.php:1712
+#: usr/local/www/interfaces_ppps_edit.php:498
+#: usr/local/www/interfaces.php:1890
+#: usr/local/www/interfaces_ppps_edit.php:499
+#: usr/local/www/interfaces.php:1878
+#: usr/local/www/interfaces_ppps_edit.php:505
+#: usr/local/www/interfaces.php:1902 usr/local/www/interfaces.php:1948
+#: usr/local/www/interfaces_ppps_edit.php:503
+#: usr/local/www/interfaces.php:1936
+#: usr/local/www/interfaces_ppps_edit.php:503
+#: usr/local/www/interfaces.php:1936
+msgid "Plan:"
+msgstr "プラン:"
+
+#: usr/local/www/interfaces.php:1720
+#: usr/local/www/interfaces_ppps_edit.php:506
+#: usr/local/www/interfaces.php:1898
+#: usr/local/www/interfaces_ppps_edit.php:507
+#: usr/local/www/interfaces.php:1886
+#: usr/local/www/interfaces_ppps_edit.php:513
+#: usr/local/www/interfaces.php:1910 usr/local/www/interfaces.php:1956
+#: usr/local/www/interfaces_ppps_edit.php:511
+#: usr/local/www/interfaces.php:1944
+#: usr/local/www/interfaces_ppps_edit.php:511
+#: usr/local/www/interfaces.php:1944
+msgid "Select to fill in data for your service provider."
+msgstr "サービスプロバイダのためのデータを埋めるために選択します。"
+
+#: usr/local/www/interfaces.php:1742
+#: usr/local/www/interfaces_ppps_edit.php:530
+#: usr/local/www/interfaces.php:1920
+#: usr/local/www/interfaces_ppps_edit.php:531
+#: usr/local/www/interfaces.php:1908
+#: usr/local/www/interfaces_ppps_edit.php:537
+#: usr/local/www/interfaces.php:1932 usr/local/www/interfaces.php:1978
+#: usr/local/www/interfaces_ppps_edit.php:535
+#: usr/local/www/interfaces.php:1966
+#: usr/local/www/interfaces_ppps_edit.php:535
+#: usr/local/www/interfaces.php:1966
+msgid "Access Point Name (APN)"
+msgstr "アクセスポイント名( APN )"
+
+#: usr/local/www/interfaces.php:1766 usr/local/www/interfaces.php:1944
+#: usr/local/www/interfaces.php:1932 usr/local/www/interfaces.php:1956
+#: usr/local/www/interfaces.php:2002 usr/local/www/interfaces.php:1991
+#: usr/local/www/interfaces.php:1991
+msgid "Advanced PPP"
+msgstr "先進的なPPPの"
+
+#: usr/local/www/interfaces.php:1769 usr/local/www/interfaces.php:1774
+#: usr/local/www/interfaces.php:1875 usr/local/www/interfaces.php:1880
+#: usr/local/www/interfaces.php:1943 usr/local/www/interfaces.php:1948
+#: usr/local/www/interfaces.php:1947 usr/local/www/interfaces.php:1952
+#: usr/local/www/interfaces.php:2053 usr/local/www/interfaces.php:2058
+#: usr/local/www/interfaces.php:2121 usr/local/www/interfaces.php:2126
+#: usr/local/www/interfaces.php:1935 usr/local/www/interfaces.php:1940
+#: usr/local/www/interfaces.php:2041 usr/local/www/interfaces.php:2046
+#: usr/local/www/interfaces.php:2109 usr/local/www/interfaces.php:2114
+#: usr/local/www/interfaces.php:1959 usr/local/www/interfaces.php:1964
+#: usr/local/www/interfaces.php:2068 usr/local/www/interfaces.php:2073
+#: usr/local/www/interfaces.php:2139 usr/local/www/interfaces.php:2144
+#: usr/local/www/interfaces.php:2005 usr/local/www/interfaces.php:2010
+#: usr/local/www/interfaces.php:2119 usr/local/www/interfaces.php:2185
+#: usr/local/www/interfaces.php:2190 usr/local/www/interfaces.php:1994
+#: usr/local/www/interfaces.php:1999 usr/local/www/interfaces.php:2103
+#: usr/local/www/interfaces.php:2108 usr/local/www/interfaces.php:2174
+#: usr/local/www/interfaces.php:2179 usr/local/www/interfaces.php:1994
+#: usr/local/www/interfaces.php:1999 usr/local/www/interfaces.php:2103
+#: usr/local/www/interfaces.php:2108 usr/local/www/interfaces.php:2174
+#: usr/local/www/interfaces.php:2179
+msgid "Click here"
+msgstr "こちらをクリックして"
+
+#: usr/local/www/interfaces.php:1770 usr/local/www/interfaces.php:1948
+#: usr/local/www/interfaces.php:1936 usr/local/www/interfaces.php:1960
+#: usr/local/www/interfaces.php:2006 usr/local/www/interfaces.php:1995
+#: usr/local/www/interfaces.php:1995
+msgid "to edit PPP configuration."
+msgstr "PPP設定を編集できます。"
+
+#: usr/local/www/interfaces.php:1775 usr/local/www/interfaces.php:1953
+#: usr/local/www/interfaces.php:1941 usr/local/www/interfaces.php:1965
+#: usr/local/www/interfaces.php:2011 usr/local/www/interfaces.php:2000
+#: usr/local/www/interfaces.php:2000
+msgid "to create a PPP configuration."
+msgstr "PPPの構成を作成するには。"
+
+#: usr/local/www/interfaces.php:1786 usr/local/www/interfaces.php:1964
+#: usr/local/www/interfaces.php:1952 usr/local/www/interfaces.php:1979
+#: usr/local/www/interfaces.php:2025 usr/local/www/interfaces.php:2014
+#: usr/local/www/interfaces.php:2014
+msgid "PPPoE configuration"
+msgstr "PPPoEの設定"
+
+#: usr/local/www/interfaces.php:1801
+#: usr/local/www/interfaces_ppps_edit.php:589
+#: usr/local/www/interfaces.php:1979
+#: usr/local/www/interfaces_ppps_edit.php:590
+#: usr/local/www/interfaces.php:1967
+#: usr/local/www/interfaces_ppps_edit.php:596
+#: usr/local/www/interfaces.php:1994 usr/local/www/interfaces.php:2040
+#: usr/local/www/interfaces_ppps_edit.php:594
+#: usr/local/www/interfaces.php:2029
+#: usr/local/www/interfaces_ppps_edit.php:594
+#: usr/local/www/interfaces.php:2029
+msgid "Service name"
+msgstr "サービス名"
+
+#: usr/local/www/interfaces.php:1803 usr/local/www/interfaces.php:1981
+#: usr/local/www/interfaces.php:1969 usr/local/www/interfaces.php:1996
+#: usr/local/www/interfaces.php:2042 usr/local/www/interfaces.php:2031
+#: usr/local/www/interfaces.php:2031
+msgid "Hint: this field can usually be left empty"
+msgstr "ヒント:このフィールドは通常、空のままにすることができます"
+
+#: usr/local/www/interfaces.php:1810 usr/local/www/interfaces.php:1929
+#: usr/local/www/interfaces.php:1988 usr/local/www/interfaces.php:2107
+#: usr/local/www/interfaces.php:1976 usr/local/www/interfaces.php:2095
+#: usr/local/www/interfaces.php:2003 usr/local/www/interfaces.php:2125
+#: usr/local/www/interfaces.php:2049 usr/local/www/interfaces.php:2171
+#: usr/local/www/interfaces.php:2038 usr/local/www/interfaces.php:2160
+#: usr/local/www/interfaces.php:2038 usr/local/www/interfaces.php:2160
+msgid "Enable Dial-On-Demand mode"
+msgstr "有効ダイヤルオンデマンドモード"
+
+#: usr/local/www/interfaces.php:1811 usr/local/www/interfaces.php:1989
+#: usr/local/www/interfaces.php:1977 usr/local/www/interfaces.php:2004
+#: usr/local/www/interfaces.php:2050 usr/local/www/interfaces.php:2039
+#: usr/local/www/interfaces.php:2039
+msgid ""
+"This option causes the interface to operate in dial-on-demand mode, allowing "
+"you to have a "
+msgstr "あなたが持っている"このオプションは可能ダイヤルオンデマンドモードで動作するようにインターフェイスを引き起こす""
+
+#: usr/local/www/interfaces.php:1811 usr/local/www/interfaces.php:1930
+#: usr/local/www/interfaces.php:1989 usr/local/www/interfaces.php:2108
+#: usr/local/www/interfaces.php:1977 usr/local/www/interfaces.php:2096
+#: usr/local/www/interfaces.php:2004 usr/local/www/interfaces.php:2126
+#: usr/local/www/interfaces.php:2050 usr/local/www/interfaces.php:2172
+#: usr/local/www/interfaces.php:2039 usr/local/www/interfaces.php:2161
+#: usr/local/www/interfaces.php:2039 usr/local/www/interfaces.php:2161
+msgid "virtual full time"
+msgstr "仮想フルタイム"
+
+#: usr/local/www/interfaces.php:1811 usr/local/www/interfaces.php:1930
+#: usr/local/www/interfaces.php:1989 usr/local/www/interfaces.php:2108
+#: usr/local/www/interfaces.php:1977 usr/local/www/interfaces.php:2096
+#: usr/local/www/interfaces.php:2004 usr/local/www/interfaces.php:2126
+#: usr/local/www/interfaces.php:2050 usr/local/www/interfaces.php:2172
+#: usr/local/www/interfaces.php:2039 usr/local/www/interfaces.php:2161
+#: usr/local/www/interfaces.php:2039 usr/local/www/interfaces.php:2161
+msgid ""
+"connection. The interface is configured, but the actual connection of the "
+"link is delayed until qualifying outgoing traffic is detected."
+msgstr "「接続。インタフェースが設定されていますが、実際の接続」のリンクは、送信トラフィックが検出された予選まで遅延される。"
+
+#: usr/local/www/interfaces.php:1815 usr/local/www/interfaces.php:1934
+#: usr/local/www/services_captiveportal.php:465
+#: usr/local/www/services_captiveportal.php:470
+#: usr/local/www/interfaces.php:1993 usr/local/www/interfaces.php:2112
+#: usr/local/www/services_captiveportal.php:468
+#: usr/local/www/interfaces.php:1981 usr/local/www/interfaces.php:2100
+#: usr/local/www/interfaces.php:2008 usr/local/www/interfaces.php:2130
+#: usr/local/www/services_captiveportal.php:486
+#: usr/local/www/interfaces.php:2054 usr/local/www/interfaces.php:2176
+#: usr/local/www/interfaces.php:2043 usr/local/www/interfaces.php:2165
+#: usr/local/www/services_captiveportal.php:486
+#: usr/local/www/interfaces.php:2043 usr/local/www/interfaces.php:2165
+msgid "Idle timeout"
+msgstr "アイドルタイムアウト"
+
+#: usr/local/www/interfaces.php:1817 usr/local/www/interfaces.php:1936
+#: usr/local/www/interfaces.php:1995 usr/local/www/interfaces.php:2114
+#: usr/local/www/interfaces.php:1983 usr/local/www/interfaces.php:2102
+#: usr/local/www/interfaces.php:2010 usr/local/www/interfaces.php:2132
+#: usr/local/www/interfaces.php:2056 usr/local/www/interfaces.php:2178
+#: usr/local/www/interfaces.php:2045 usr/local/www/interfaces.php:2167
+#: usr/local/www/interfaces.php:2045 usr/local/www/interfaces.php:2167
+msgid ""
+"If no qualifying outgoing packets are transmitted for the specified number "
+"of seconds, the connection is brought down. An idle timeout of zero disables "
+"this feature."
+msgstr "秒数」は予選発信パケットが指定した数のために送信されていない場合は、「接続がダウンしている。ゼロのアイドルタイムアウトは、「この機能は無効になります。"
+
+#: usr/local/www/interfaces.php:1821
+#: usr/local/www/interfaces_ppps_edit.php:596
+#: usr/local/www/interfaces.php:1999
+#: usr/local/www/interfaces_ppps_edit.php:597
+#: usr/local/www/interfaces.php:1987
+#: usr/local/www/interfaces_ppps_edit.php:603
+#: usr/local/www/interfaces.php:2014 usr/local/www/interfaces.php:2060
+#: usr/local/www/interfaces_ppps_edit.php:601
+#: usr/local/www/interfaces.php:2049
+#: usr/local/www/interfaces_ppps_edit.php:601
+#: usr/local/www/interfaces.php:2049
+msgid "Periodic reset"
+msgstr "定期的なリセット"
+
+#: usr/local/www/interfaces.php:1829
+#: usr/local/www/interfaces_ppps_edit.php:604
+#: usr/local/www/status_rrd_graph.php:359
+#: usr/local/www/status_rrd_graph_settings.php:158
+#: usr/local/www/status_rrd_graph_settings.php:159
+#: usr/local/www/status_rrd_graph.php:407 usr/local/www/interfaces.php:2007
+#: usr/local/www/interfaces_ppps_edit.php:605
+#: usr/local/www/interfaces.php:1995
+#: usr/local/www/interfaces_ppps_edit.php:611
+#: usr/local/www/status_rrd_graph.php:432 usr/local/www/interfaces.php:2022
+#: usr/local/www/interfaces.php:2068
+#: usr/local/www/interfaces_ppps_edit.php:609
+#: usr/local/www/interfaces.php:2057
+#: usr/local/www/interfaces_ppps_edit.php:609
+#: usr/local/www/status_rrd_graph.php:432
+#: usr/local/www/status_rrd_graph_settings.php:159
+#: usr/local/www/interfaces.php:2057
+msgid "Custom"
+msgstr "カスタム"
+
+#: usr/local/www/interfaces.php:1830
+#: usr/local/www/interfaces_ppps_edit.php:605
+#: usr/local/www/interfaces.php:2008
+#: usr/local/www/interfaces_ppps_edit.php:606
+#: usr/local/www/interfaces.php:1996
+#: usr/local/www/interfaces_ppps_edit.php:612
+#: usr/local/www/interfaces.php:2023 usr/local/www/interfaces.php:2069
+#: usr/local/www/interfaces_ppps_edit.php:610
+#: usr/local/www/interfaces.php:2058
+#: usr/local/www/interfaces_ppps_edit.php:610
+#: usr/local/www/interfaces.php:2058
+msgid "Pre-Set"
+msgstr "事前に設定"
+
+#: usr/local/www/interfaces.php:1831
+#: usr/local/www/interfaces_ppps_edit.php:606
+#: usr/local/www/interfaces.php:2009
+#: usr/local/www/interfaces_ppps_edit.php:607
+#: usr/local/www/interfaces.php:1997
+#: usr/local/www/interfaces_ppps_edit.php:613
+#: usr/local/www/interfaces.php:2024 usr/local/www/interfaces.php:2070
+#: usr/local/www/interfaces_ppps_edit.php:611
+#: usr/local/www/interfaces.php:2059
+#: usr/local/www/interfaces_ppps_edit.php:611
+#: usr/local/www/interfaces.php:2059
+msgid "Select a reset timing type"
+msgstr "リセットタイミングの種類を選択します"
+
+#: usr/local/www/interfaces.php:1839
+#: usr/local/www/interfaces_ppps_edit.php:614
+#: usr/local/www/interfaces.php:2017
+#: usr/local/www/interfaces_ppps_edit.php:615
+#: usr/local/www/interfaces.php:2005
+#: usr/local/www/interfaces_ppps_edit.php:621
+#: usr/local/www/interfaces.php:2032 usr/local/www/interfaces.php:2078
+#: usr/local/www/interfaces_ppps_edit.php:619
+#: usr/local/www/interfaces.php:2067
+#: usr/local/www/interfaces_ppps_edit.php:619
+#: usr/local/www/interfaces.php:2067
+msgid "hour (0-23)"
+msgstr "時間( 0-23 )"
+
+#: usr/local/www/interfaces.php:1841
+#: usr/local/www/interfaces_ppps_edit.php:616
+#: usr/local/www/interfaces.php:2019
+#: usr/local/www/interfaces_ppps_edit.php:617
+#: usr/local/www/interfaces.php:2007
+#: usr/local/www/interfaces_ppps_edit.php:623
+#: usr/local/www/interfaces.php:2034 usr/local/www/interfaces.php:2080
+#: usr/local/www/interfaces_ppps_edit.php:621
+#: usr/local/www/interfaces.php:2069
+#: usr/local/www/interfaces_ppps_edit.php:621
+#: usr/local/www/interfaces.php:2069
+msgid "minute (0-59)"
+msgstr "分(0〜59 )"
+
+#: usr/local/www/interfaces.php:1843
+#: usr/local/www/interfaces_ppps_edit.php:618
+#: usr/local/www/interfaces.php:2021
+#: usr/local/www/interfaces_ppps_edit.php:619
+#: usr/local/www/interfaces.php:2009
+#: usr/local/www/interfaces_ppps_edit.php:625
+#: usr/local/www/interfaces.php:2036 usr/local/www/interfaces.php:2082
+#: usr/local/www/interfaces_ppps_edit.php:623
+#: usr/local/www/interfaces.php:2071
+#: usr/local/www/interfaces_ppps_edit.php:623
+#: usr/local/www/interfaces.php:2071
+msgid "reset at a specific date (mm/dd/yyyy)"
+msgstr "特定の日付にリセット( YYYY / MM / DD )"
+
+#: usr/local/www/interfaces.php:1846
+#: usr/local/www/interfaces_ppps_edit.php:621
+#: usr/local/www/interfaces.php:2024
+#: usr/local/www/interfaces_ppps_edit.php:622
+#: usr/local/www/interfaces.php:2012
+#: usr/local/www/interfaces_ppps_edit.php:628
+#: usr/local/www/interfaces.php:2039 usr/local/www/interfaces.php:2085
+#: usr/local/www/interfaces_ppps_edit.php:626
+#: usr/local/www/interfaces.php:2074
+#: usr/local/www/interfaces_ppps_edit.php:626
+#: usr/local/www/interfaces.php:2074
+msgid ""
+"If you leave the date field empty, the reset will be executed each day at "
+"the time you did specify using the minutes and hour field."
+msgstr "あなたは数分と時間のフィールドを使用して指定した時間が「空の日付フィールドのままにすると、リセットがで毎日実行されます」 。"
+
+#: usr/local/www/interfaces.php:1854
+#: usr/local/www/interfaces_ppps_edit.php:629
+#: usr/local/www/interfaces.php:2032
+#: usr/local/www/interfaces_ppps_edit.php:630
+#: usr/local/www/interfaces.php:2020
+#: usr/local/www/interfaces_ppps_edit.php:636
+#: usr/local/www/interfaces.php:2047 usr/local/www/interfaces.php:2093
+#: usr/local/www/interfaces_ppps_edit.php:634
+#: usr/local/www/interfaces.php:2082
+#: usr/local/www/interfaces_ppps_edit.php:634
+#: usr/local/www/interfaces.php:2082
+msgid "reset at each month ('0 0 1 README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr *')"
+msgstr "各月で('0 0 1 README.txtを_NotesブートCF conf.defaultなどmisc.translateルートsbinにのTMPのUSR *' )をリセット"
+
+#: usr/local/www/interfaces.php:1857
+#: usr/local/www/interfaces_ppps_edit.php:632
+#: usr/local/www/interfaces.php:2035
+#: usr/local/www/interfaces_ppps_edit.php:633
+#: usr/local/www/interfaces.php:2023
+#: usr/local/www/interfaces_ppps_edit.php:639
+#: usr/local/www/interfaces.php:2050 usr/local/www/interfaces.php:2096
+#: usr/local/www/interfaces_ppps_edit.php:637
+#: usr/local/www/interfaces.php:2085
+#: usr/local/www/interfaces_ppps_edit.php:637
+#: usr/local/www/interfaces.php:2085
+msgid "reset at each week ('0 0 README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr 0')"
+msgstr "毎週にリセット( 0 0のREADME.txt _NotesブートCF conf.defaultなどmisc.translateルートsbinにTMP USRのREADME.txt _NotesブートCF conf.defaultなどmisc.translateルートsbinにするのtmp USR 0')"
+
+#: usr/local/www/interfaces.php:1860
+#: usr/local/www/interfaces_ppps_edit.php:635
+#: usr/local/www/interfaces.php:2038
+#: usr/local/www/interfaces_ppps_edit.php:636
+#: usr/local/www/interfaces.php:2026
+#: usr/local/www/interfaces_ppps_edit.php:642
+#: usr/local/www/interfaces.php:2053 usr/local/www/interfaces.php:2099
+#: usr/local/www/interfaces_ppps_edit.php:640
+#: usr/local/www/interfaces.php:2088
+#: usr/local/www/interfaces_ppps_edit.php:640
+#: usr/local/www/interfaces.php:2088
+msgid "reset at each day ('0 0 README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr *')"
+msgstr "毎日で('0 0のREADME.txt _NotesブートCF conf.defaultなどmisc.translateルートsbinにTMP USRのREADME.txt _NotesブートCF conf.defaultなどmisc.translateルートsbinにのTMPのUSR *' )をリセット"
+
+#: usr/local/www/interfaces.php:1863
+#: usr/local/www/interfaces_ppps_edit.php:638
+#: usr/local/www/interfaces.php:2041
+#: usr/local/www/interfaces_ppps_edit.php:639
+#: usr/local/www/interfaces.php:2029
+#: usr/local/www/interfaces_ppps_edit.php:645
+#: usr/local/www/interfaces.php:2056 usr/local/www/interfaces.php:2102
+#: usr/local/www/interfaces_ppps_edit.php:643
+#: usr/local/www/interfaces.php:2091
+#: usr/local/www/interfaces_ppps_edit.php:643
+#: usr/local/www/interfaces.php:2091
+msgid "reset at each hour ('0 README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr *')"
+msgstr "時間ごとにリセット('0のREADME.txt _NotesブートCF conf.defaultなどmisc.translateルートsbinにTMP USRのREADME.txt _NotesブートCF conf.defaultなどmisc.translateルートsbinにTMP USRのREADME.txt _NotesブートCF conf.defaultなどmisc.translateルートsbinにのTMPのUSR *')"
+
+#: usr/local/www/interfaces.php:1872 usr/local/www/interfaces.php:2050
+#: usr/local/www/interfaces.php:2038 usr/local/www/interfaces.php:2065
+#: usr/local/www/interfaces.php:2111 usr/local/www/interfaces.php:2100
+#: usr/local/www/interfaces.php:2100
+msgid "Advanced and MLPPP"
+msgstr "AdvancedおよびMLPPP"
+
+#: usr/local/www/interfaces.php:1876 usr/local/www/interfaces.php:2054
+#: usr/local/www/interfaces.php:2042 usr/local/www/interfaces.php:2069
+#: usr/local/www/interfaces.php:2115 usr/local/www/interfaces.php:2104
+#: usr/local/www/interfaces.php:2104
+msgid ""
+"for additional PPPoE configuration options. Save first if you made changes."
+msgstr "あなたが変更を加えた場合は、「追加のPPPoEの設定オプションのために最初に保存します。"
+
+#: usr/local/www/interfaces.php:1881 usr/local/www/interfaces.php:2059
+#: usr/local/www/interfaces.php:2047 usr/local/www/interfaces.php:2074
+#: usr/local/www/interfaces.php:2120 usr/local/www/interfaces.php:2109
+#: usr/local/www/interfaces.php:2109
+msgid "for advanced PPPoE configuration options and MLPPP configuration."
+msgstr "先進的なPPPoEの設定オプションおよびMLPPPの設定のために。"
+
+#: usr/local/www/interfaces.php:1892 usr/local/www/interfaces.php:2070
+#: usr/local/www/interfaces.php:2058 usr/local/www/interfaces.php:2088
+#: usr/local/www/interfaces.php:2134 usr/local/www/interfaces.php:2123
+#: usr/local/www/interfaces.php:2123
+msgid "PPTP/L2TP configuration"
+msgstr "PPTP/L2TP構成"
+
+#: usr/local/www/interfaces.php:1907
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces.php:2085 usr/local/www/interfaces.php:2073
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces.php:2103 usr/local/www/interfaces.php:2149
+#: usr/local/www/interfaces.php:2138
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces.php:2138
+msgid "Local IP address"
+msgstr "ローカルIPアドレス"
+
+#: usr/local/www/interfaces.php:1920
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces.php:2098 usr/local/www/interfaces.php:2086
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces.php:2116 usr/local/www/interfaces.php:2162
+#: usr/local/www/interfaces.php:2151
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces.php:2151
+msgid "Remote IP address"
+msgstr "リモートIPアドレス"
+
+#: usr/local/www/interfaces.php:1930 usr/local/www/interfaces.php:2108
+#: usr/local/www/interfaces.php:2096 usr/local/www/interfaces.php:2126
+#: usr/local/www/interfaces.php:2172 usr/local/www/interfaces.php:2161
+#: usr/local/www/interfaces.php:2161
+msgid ""
+"This option causes the interface to operate in dial-on-demand mode, allowing "
+"you to have a"
+msgstr "あなたが持っている"このオプションは可能ダイヤルオンデマンドモードで動作するようにインターフェイスを引き起こす""
+
+#: usr/local/www/interfaces.php:1944 usr/local/www/interfaces.php:2122
+#: usr/local/www/interfaces.php:2110 usr/local/www/interfaces.php:2140
+#: usr/local/www/interfaces.php:2186 usr/local/www/interfaces.php:2175
+#: usr/local/www/interfaces.php:2175
+msgid ""
+"for additional PPTP and L2TP configuration options. Save first if you made "
+"changes."
+msgstr "変更を"あなたが行った場合、追加のPPTPとL2TPの設定オプションについて。まず保存」 。"
+
+#: usr/local/www/interfaces.php:1949 usr/local/www/interfaces.php:2127
+#: usr/local/www/interfaces.php:2115 usr/local/www/interfaces.php:2145
+#: usr/local/www/interfaces.php:2191 usr/local/www/interfaces.php:2180
+#: usr/local/www/interfaces.php:2180
+msgid "for advanced PPTP and L2TP configuration options"
+msgstr "高度なPPTPとL2TPの設定オプション用"
+
+#: usr/local/www/interfaces.php:1964 usr/local/www/interfaces.php:2142
+#: usr/local/www/interfaces.php:2130 usr/local/www/interfaces.php:2160
+#: usr/local/www/interfaces.php:2206 usr/local/www/interfaces.php:2195
+#: usr/local/www/interfaces.php:2195
+msgid ""
+"Common wireless configuration - Settings apply to all wireless networks on"
+msgstr "「一般的なワイヤレス設定 - 設定上のすべてのワイヤレスネットワークに適用"
+
+#: usr/local/www/interfaces.php:1967 usr/local/www/interfaces.php:2145
+#: usr/local/www/interfaces.php:2133 usr/local/www/interfaces.php:2163
+#: usr/local/www/interfaces.php:2209 usr/local/www/interfaces.php:2198
+#: usr/local/www/interfaces.php:2198
+msgid "Persist common settings"
+msgstr "共通の設定を永続化"
+
+#: usr/local/www/interfaces.php:1970 usr/local/www/interfaces.php:2148
+#: usr/local/www/interfaces.php:2136 usr/local/www/interfaces.php:2166
+#: usr/local/www/interfaces.php:2212 usr/local/www/interfaces.php:2201
+#: usr/local/www/interfaces.php:2201
+msgid ""
+"Enabling this preserves the common wireless configuration through interface "
+"deletions and reassignments."
+msgstr "欠失および再割り当て"これを有効にすると、インターフェースを介して共通のワイヤレス設定を保存します」 。"
+
+#: usr/local/www/interfaces.php:1974 usr/local/www/interfaces.php:2152
+#: usr/local/www/interfaces.php:2140 usr/local/www/interfaces.php:2170
+#: usr/local/www/interfaces.php:2216 usr/local/www/interfaces.php:2205
+#: usr/local/www/interfaces.php:2205
+msgid "Standard"
+msgstr "標準"
+
+#: usr/local/www/interfaces.php:1990 usr/local/www/interfaces.php:2168
+#: usr/local/www/interfaces.php:2156 usr/local/www/interfaces.php:2186
+#: usr/local/www/interfaces.php:2232 usr/local/www/interfaces.php:2221
+#: usr/local/www/interfaces.php:2221
+msgid "Protection Mode"
+msgstr "保護モード"
+
+#: usr/local/www/interfaces.php:1993 usr/local/www/interfaces.php:2171
+#: usr/local/www/interfaces.php:2159 usr/local/www/interfaces.php:2189
+#: usr/local/www/interfaces.php:2235 usr/local/www/interfaces.php:2224
+#: usr/local/www/interfaces.php:2224
+msgid "Protection mode off"
+msgstr "保護モードをオフ"
+
+#: usr/local/www/interfaces.php:1994 usr/local/www/interfaces.php:2172
+#: usr/local/www/interfaces.php:2160 usr/local/www/interfaces.php:2190
+#: usr/local/www/interfaces.php:2236 usr/local/www/interfaces.php:2225
+#: usr/local/www/interfaces.php:2225
+msgid "Protection mode CTS to self"
+msgstr "自己への保護モードのCTS"
+
+#: usr/local/www/interfaces.php:1995 usr/local/www/interfaces.php:2173
+#: usr/local/www/interfaces.php:2161 usr/local/www/interfaces.php:2191
+#: usr/local/www/interfaces.php:2237 usr/local/www/interfaces.php:2226
+#: usr/local/www/interfaces.php:2226
+msgid "Protection mode RTS and CTS"
+msgstr "保護モードのRTSとCTS"
+
+#: usr/local/www/interfaces.php:1998 usr/local/www/interfaces.php:2176
+#: usr/local/www/interfaces.php:2164 usr/local/www/interfaces.php:2194
+#: usr/local/www/interfaces.php:2240 usr/local/www/interfaces.php:2229
+#: usr/local/www/interfaces.php:2229
+msgid ""
+"For IEEE 802.11g, use the specified technique for protecting OFDM frames in "
+"a mixed 11b/11g network."
+msgstr "混合た11b/11gネットワーク「IEEEの802.11グラムのために、内のOFDMフレームを保護するための指定されたテクニックを使用」 。"
+
+#: usr/local/www/interfaces.php:2006 usr/local/www/interfaces.php:2184
+#: usr/local/www/interfaces.php:2172 usr/local/www/interfaces.php:2202
+#: usr/local/www/interfaces.php:2248 usr/local/www/interfaces.php:2237
+#: usr/local/www/interfaces.php:2237
+msgid "Transmit power"
+msgstr "動力を伝達"
+
+#: usr/local/www/interfaces.php:2019 usr/local/www/interfaces.php:2197
+#: usr/local/www/interfaces.php:2185 usr/local/www/interfaces.php:2215
+#: usr/local/www/interfaces.php:2261 usr/local/www/interfaces.php:2250
+#: usr/local/www/interfaces.php:2250
+msgid ""
+"Note: Typically only a few discreet power settings are available and the "
+"driver will use the setting closest to the specified value. Not all "
+"adapters support changing the transmit power setting."
+msgstr ""注:通常わずか数控えめな電源設定が利用可能であり、 「ドライバーが指定された値に設定し、最も近い使用されます。すべてではない」のアダプタは、送信電力設定の変更をサポート。"
+
+#: usr/local/www/interfaces.php:2023 usr/local/www/status_interfaces.php:258
+#: usr/local/www/status_interfaces.php:355 usr/local/www/interfaces.php:2201
+#: usr/local/www/status_interfaces.php:358 usr/local/www/interfaces.php:2189
+#: usr/local/www/interfaces.php:2219 usr/local/www/interfaces.php:2265
+#: usr/local/www/interfaces.php:2254 usr/local/www/status_interfaces.php:358
+#: usr/local/www/interfaces.php:2254
+msgid "Channel"
+msgstr "チャンネル"
+
+#: usr/local/www/interfaces.php:2026 usr/local/www/interfaces.php:2073
+#: usr/local/www/interfaces.php:2085 usr/local/www/interfaces.php:2204
+#: usr/local/www/interfaces.php:2251 usr/local/www/interfaces.php:2263
+#: usr/local/www/interfaces.php:2192 usr/local/www/interfaces.php:2239
+#: usr/local/www/interfaces.php:2222 usr/local/www/interfaces.php:2269
+#: usr/local/www/interfaces.php:2281 usr/local/www/interfaces.php:2268
+#: usr/local/www/interfaces.php:2315 usr/local/www/interfaces.php:2327
+#: usr/local/www/interfaces.php:2257 usr/local/www/interfaces.php:2304
+#: usr/local/www/interfaces.php:2316 usr/local/www/interfaces.php:2257
+#: usr/local/www/interfaces.php:2304 usr/local/www/interfaces.php:2316
+msgid "Auto"
+msgstr "オート"
+
+#: usr/local/www/interfaces.php:2046 usr/local/www/interfaces.php:2224
+#: usr/local/www/interfaces.php:2212 usr/local/www/interfaces.php:2242
+#: usr/local/www/interfaces.php:2288 usr/local/www/interfaces.php:2277
+#: usr/local/www/interfaces.php:2277
+msgid ""
+"Legend: wireless standards - channel # (frequency @ max TX power / TX power "
+"allowed in reg. domain)"
+msgstr ""伝説:ワイヤレス規格 - チャンネル"
+
+#: usr/local/www/interfaces.php:2048 usr/local/www/interfaces.php:2226
+#: usr/local/www/interfaces.php:2214 usr/local/www/interfaces.php:2244
+#: usr/local/www/interfaces.php:2290 usr/local/www/interfaces.php:2279
+#: usr/local/www/interfaces.php:2279
+msgid ""
+"Note: Not all channels may be supported by your card. Auto may override the "
+"wireless standard selected above."
+msgstr ""注:すべてのチャンネルがあなたのカードでサポートされる場合があり自動上書きすることができます。 "上で選択した無線規格を。"
+
+#: usr/local/www/interfaces.php:2053 usr/local/www/interfaces.php:2231
+#: usr/local/www/interfaces.php:2219 usr/local/www/interfaces.php:2249
+#: usr/local/www/interfaces.php:2295 usr/local/www/interfaces.php:2284
+#: usr/local/www/interfaces.php:2284
+msgid "Antenna settings"
+msgstr "アンテナの設定"
+
+#: usr/local/www/interfaces.php:2059 usr/local/www/interfaces.php:2237
+#: usr/local/www/interfaces.php:2225 usr/local/www/interfaces.php:2255
+#: usr/local/www/interfaces.php:2301 usr/local/www/interfaces.php:2290
+#: usr/local/www/interfaces.php:2290
+msgid "Diversity"
+msgstr "多様性"
+
+#: usr/local/www/interfaces.php:2061 usr/local/www/interfaces.php:2072
+#: usr/local/www/interfaces.php:2084 usr/local/www/interfaces.php:2114
+#: usr/local/www/interfaces.php:2130 usr/local/www/interfaces.php:2146
+#: usr/local/www/interfaces.php:2239 usr/local/www/interfaces.php:2250
+#: usr/local/www/interfaces.php:2262 usr/local/www/interfaces.php:2292
+#: usr/local/www/interfaces.php:2308 usr/local/www/interfaces.php:2324
+#: usr/local/www/interfaces.php:2227 usr/local/www/interfaces.php:2238
+#: usr/local/www/interfaces.php:2280 usr/local/www/interfaces.php:2296
+#: usr/local/www/interfaces.php:2312 usr/local/www/diag_system_pftop.php:135
+#: usr/local/www/interfaces.php:2257 usr/local/www/interfaces.php:2268
+#: usr/local/www/interfaces.php:2310 usr/local/www/interfaces.php:2326
+#: usr/local/www/interfaces.php:2342 usr/local/www/interfaces.php:2303
+#: usr/local/www/interfaces.php:2314 usr/local/www/interfaces.php:2356
+#: usr/local/www/interfaces.php:2372 usr/local/www/interfaces.php:2388
+#: usr/local/www/interfaces.php:2315 usr/local/www/interfaces.php:2345
+#: usr/local/www/interfaces.php:2361 usr/local/www/interfaces.php:2377
+#: usr/local/www/diag_system_pftop.php:135 usr/local/www/interfaces.php:2292
+#: usr/local/www/interfaces.php:2303 usr/local/www/interfaces.php:2315
+#: usr/local/www/interfaces.php:2345 usr/local/www/interfaces.php:2361
+#: usr/local/www/interfaces.php:2377
+msgid "Default"
+msgstr "デフォルト"
+
+#: usr/local/www/interfaces.php:2062 usr/local/www/vpn_pptp.php:314
+#: usr/local/www/vpn_l2tp.php:294 usr/local/www/vpn_pppoe_edit.php:362
+#: usr/local/www/interfaces.php:2240 usr/local/www/vpn_pppoe_edit.php:363
+#: usr/local/www/vpn_pptp.php:316 usr/local/www/interfaces.php:2228
+#: usr/local/www/vpn_l2tp.php:295 usr/local/www/vpn_l2tp.php:298
+#: usr/local/www/vpn_pppoe_edit.php:366 usr/local/www/vpn_pptp.php:319
+#: usr/local/www/interfaces.php:2258 usr/local/www/interfaces.php:2304
+#: usr/local/www/interfaces.php:2293 usr/local/www/vpn_l2tp.php:298
+#: usr/local/www/vpn_pppoe_edit.php:366 usr/local/www/vpn_pptp.php:319
+#: usr/local/www/interfaces.php:2293
+msgid "Off"
+msgstr "オフ"
+
+#: usr/local/www/interfaces.php:2063 usr/local/www/interfaces.php:2241
+#: usr/local/www/interfaces.php:2229 usr/local/www/interfaces.php:2259
+#: usr/local/www/interfaces.php:2305 usr/local/www/interfaces.php:2294
+#: usr/local/www/interfaces.php:2294
+msgid "On"
+msgstr "上の"
+
+#: usr/local/www/interfaces.php:2070 usr/local/www/interfaces.php:2248
+#: usr/local/www/interfaces.php:2236 usr/local/www/interfaces.php:2266
+#: usr/local/www/interfaces.php:2312 usr/local/www/interfaces.php:2301
+#: usr/local/www/interfaces.php:2301
+msgid "Transmit antenna"
+msgstr "アンテナを送信"
+
+#: usr/local/www/interfaces.php:2074 usr/local/www/interfaces.php:2086
+#: usr/local/www/interfaces.php:2252 usr/local/www/interfaces.php:2264
+#: usr/local/www/interfaces.php:2240 usr/local/www/interfaces.php:2270
+#: usr/local/www/interfaces.php:2282 usr/local/www/interfaces.php:2316
+#: usr/local/www/interfaces.php:2328 usr/local/www/interfaces.php:2305
+#: usr/local/www/interfaces.php:2317 usr/local/www/interfaces.php:2305
+#: usr/local/www/interfaces.php:2317
+msgid "#1"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2075 usr/local/www/interfaces.php:2087
+#: usr/local/www/interfaces.php:2253 usr/local/www/interfaces.php:2265
+#: usr/local/www/interfaces.php:2241 usr/local/www/interfaces.php:2271
+#: usr/local/www/interfaces.php:2283 usr/local/www/interfaces.php:2317
+#: usr/local/www/interfaces.php:2329 usr/local/www/interfaces.php:2306
+#: usr/local/www/interfaces.php:2318 usr/local/www/interfaces.php:2306
+#: usr/local/www/interfaces.php:2318
+msgid "#2"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2082 usr/local/www/interfaces.php:2260
+#: usr/local/www/interfaces.php:2248 usr/local/www/interfaces.php:2278
+#: usr/local/www/interfaces.php:2324 usr/local/www/interfaces.php:2313
+#: usr/local/www/interfaces.php:2313
+msgid "Receive antenna"
+msgstr "受信アンテナ"
+
+#: usr/local/www/interfaces.php:2094 usr/local/www/interfaces.php:2272
+#: usr/local/www/interfaces.php:2260 usr/local/www/interfaces.php:2290
+#: usr/local/www/interfaces.php:2336 usr/local/www/interfaces.php:2325
+#: usr/local/www/interfaces.php:2325
+msgid ""
+"Note: The antenna numbers do not always match up with the labels on the card."
+msgstr ""注:アンテナ番号は常にカード上のラベルと一致しません。"
+
+#: usr/local/www/interfaces.php:2100 usr/local/www/interfaces.php:2278
+#: usr/local/www/interfaces.php:2266 usr/local/www/interfaces.php:2296
+#: usr/local/www/interfaces.php:2342 usr/local/www/interfaces.php:2331
+#: usr/local/www/interfaces.php:2331
+msgid "Distance setting"
+msgstr "距離設定"
+
+#: usr/local/www/interfaces.php:2104 usr/local/www/interfaces.php:2282
+#: usr/local/www/interfaces.php:2270 usr/local/www/interfaces.php:2300
+#: usr/local/www/interfaces.php:2346 usr/local/www/interfaces.php:2335
+#: usr/local/www/interfaces.php:2335
+msgid ""
+"Note: This field can be used to tune ACK/CTS timers to fit the distance "
+"between AP and Client"
+msgstr "APとクライアント間の「注意このフィールドには、距離に合わせて調整されたACK / CTSタイマーを使用することができます」"
+
+#: usr/local/www/interfaces.php:2105 usr/local/www/interfaces.php:2283
+#: usr/local/www/interfaces.php:2271 usr/local/www/interfaces.php:2301
+#: usr/local/www/interfaces.php:2347 usr/local/www/interfaces.php:2336
+#: usr/local/www/interfaces.php:2336
+msgid "(measured in meters)"
+msgstr "(メートルで測定し、唯一のAtherosベースのカードのために働く ! )"
+
+#: usr/local/www/interfaces.php:2110 usr/local/www/interfaces.php:2288
+#: usr/local/www/interfaces.php:2276 usr/local/www/interfaces.php:2306
+#: usr/local/www/interfaces.php:2352 usr/local/www/interfaces.php:2341
+#: usr/local/www/interfaces.php:2341
+msgid "Regulatory settings"
+msgstr "規制の設定"
+
+#: usr/local/www/interfaces.php:2112 usr/local/www/interfaces.php:2290
+#: usr/local/www/interfaces.php:2278 usr/local/www/interfaces.php:2308
+#: usr/local/www/interfaces.php:2354 usr/local/www/interfaces.php:2343
+#: usr/local/www/interfaces.php:2343
+msgid "Regulatory domain"
+msgstr "調節領域"
+
+#: usr/local/www/interfaces.php:2126 usr/local/www/interfaces.php:2304
+#: usr/local/www/interfaces.php:2292 usr/local/www/interfaces.php:2322
+#: usr/local/www/interfaces.php:2368 usr/local/www/interfaces.php:2357
+#: usr/local/www/interfaces.php:2357
+msgid ""
+"Note: Some cards have a default that is not recognized and require changing "
+"the regulatory domain to one in this list for the changes to other "
+"regulatory settings to work."
+msgstr ""注:一部のカードが認識され、変更する必要がされていないデフォルトの持っている"動作するように、他の「調節の設定を変更するために、このリストに1への規制区域を。"
+
+#: usr/local/www/interfaces.php:2128 usr/local/www/interfaces.php:2306
+#: usr/local/www/interfaces.php:2294 usr/local/www/interfaces.php:2324
+#: usr/local/www/interfaces.php:2370 usr/local/www/interfaces.php:2359
+#: usr/local/www/interfaces.php:2359
+msgid "Country (listed with country code and regulatory domain)"
+msgstr "国(国コードと調節ドメインと記載されている)"
+
+#: usr/local/www/interfaces.php:2142 usr/local/www/interfaces.php:2320
+#: usr/local/www/interfaces.php:2308 usr/local/www/interfaces.php:2338
+#: usr/local/www/interfaces.php:2384 usr/local/www/interfaces.php:2373
+#: usr/local/www/interfaces.php:2373
+msgid ""
+"Note: Any country setting other than "Default" will override the "
+"regulatory domain setting"
+msgstr ""注:以外の設定すべての国"デフォルトは規制区域の設定」より優先されます」"
+
+#: usr/local/www/interfaces.php:2144 usr/local/www/interfaces.php:2322
+#: usr/local/www/interfaces.php:2310 usr/local/www/interfaces.php:2340
+#: usr/local/www/interfaces.php:2386 usr/local/www/interfaces.php:2375
+#: usr/local/www/interfaces.php:2375
+msgid "Location"
+msgstr "場所"
+
+#: usr/local/www/interfaces.php:2147 usr/local/www/interfaces.php:2325
+#: usr/local/www/interfaces.php:2313 usr/local/www/interfaces.php:2343
+#: usr/local/www/interfaces.php:2389 usr/local/www/interfaces.php:2378
+#: usr/local/www/interfaces.php:2378
+msgid "Indoor"
+msgstr "屋内"
+
+#: usr/local/www/interfaces.php:2148 usr/local/www/interfaces.php:2326
+#: usr/local/www/interfaces.php:2314 usr/local/www/interfaces.php:2344
+#: usr/local/www/interfaces.php:2390 usr/local/www/interfaces.php:2379
+#: usr/local/www/interfaces.php:2379
+msgid "Outdoor"
+msgstr "アウトドア"
+
+#: usr/local/www/interfaces.php:2149 usr/local/www/interfaces.php:2327
+#: usr/local/www/interfaces.php:2315 usr/local/www/interfaces.php:2345
+#: usr/local/www/interfaces.php:2391 usr/local/www/interfaces.php:2380
+#: usr/local/www/interfaces.php:2380
+msgid "Anywhere"
+msgstr "どこでも"
+
+#: usr/local/www/interfaces.php:2152 usr/local/www/interfaces.php:2330
+#: usr/local/www/interfaces.php:2318 usr/local/www/interfaces.php:2348
+#: usr/local/www/interfaces.php:2394 usr/local/www/interfaces.php:2383
+#: usr/local/www/interfaces.php:2383
+msgid ""
+"These settings may affect which channels are available and the maximum "
+"transmit power allowed on those channels. Using the correct settings to "
+"comply with local regulatory requirements is recommended."
+msgstr "送信電力それらのチャネル上で許可"これらの設定は、チャネルが利用可能であり、最大値はどの影響を与える可能性があり」 。 「現地の規制要件に準拠して、正しい設定を使用することはお勧めします。"
+
+#: usr/local/www/interfaces.php:2154 usr/local/www/interfaces.php:2332
+#: usr/local/www/interfaces.php:2320 usr/local/www/interfaces.php:2350
+#: usr/local/www/interfaces.php:2396 usr/local/www/interfaces.php:2385
+#: usr/local/www/interfaces.php:2385
+msgid ""
+"Note: All wireless networks on this interface will be temporarily brought "
+"down when changing regulatory settings. Some of the regulatory domains or "
+"country codes may not be allowed by some cards. These settings may not be "
+"able to add additional channels that are not already supported."
+msgstr ""注:このインタフェースのすべてのワイヤレスネットワークが一時的に提起される「制御の設定を変更するときにダウン。規制区域または一部の「国コードは、一部のカードで許可されないことがあります。これらの設定はないかもしれない」が既にサポートされていない追加のチャネルを追加することができ。"
+
+#: usr/local/www/interfaces.php:2161 usr/local/www/interfaces.php:2339
+#: usr/local/www/interfaces.php:2327 usr/local/www/interfaces.php:2357
+#: usr/local/www/interfaces.php:2403 usr/local/www/interfaces.php:2392
+#: usr/local/www/interfaces.php:2392
+msgid "Network-specific wireless configuration"
+msgstr "ネットワーク固有のワイヤレス設定"
+
+#: usr/local/www/interfaces.php:2167
+#: usr/local/www/interfaces_wireless_edit.php:179
+#: usr/local/www/interfaces.php:2345 usr/local/www/interfaces.php:2333
+#: usr/local/www/interfaces_wireless_edit.php:181
+#: usr/local/www/interfaces.php:2363 usr/local/www/interfaces.php:2409
+#: usr/local/www/interfaces.php:2398
+#: usr/local/www/interfaces_wireless_edit.php:181
+#: usr/local/www/interfaces.php:2398
+msgid "Infrastructure (BSS)"
+msgstr "インフラストラクチャ( BSS)"
+
+#: usr/local/www/interfaces.php:2168
+#: usr/local/www/interfaces_wireless_edit.php:180
+#: usr/local/www/interfaces.php:2346 usr/local/www/interfaces.php:2334
+#: usr/local/www/interfaces_wireless_edit.php:182
+#: usr/local/www/interfaces.php:2364 usr/local/www/interfaces.php:2410
+#: usr/local/www/interfaces.php:2399
+#: usr/local/www/interfaces_wireless_edit.php:182
+#: usr/local/www/interfaces.php:2399
+msgid "Ad-hoc (IBSS)"
+msgstr "アドホック( IBSS )"
+
+#: usr/local/www/interfaces.php:2169
+#: usr/local/www/interfaces_wireless_edit.php:181
+#: usr/local/www/interfaces.php:2347 usr/local/www/interfaces.php:2335
+#: usr/local/www/interfaces_wireless_edit.php:183
+#: usr/local/www/interfaces.php:2365 usr/local/www/interfaces.php:2411
+#: usr/local/www/interfaces.php:2400
+#: usr/local/www/interfaces_wireless_edit.php:183
+#: usr/local/www/interfaces.php:2400
+msgid "Access Point"
+msgstr "アクセスポイント"
+
+#: usr/local/www/interfaces.php:2181 usr/local/www/interfaces.php:2361
+#: usr/local/www/interfaces.php:2349 usr/local/www/interfaces.php:2379
+#: usr/local/www/interfaces.php:2425 usr/local/www/interfaces.php:2414
+#: usr/local/www/interfaces.php:2414
+msgid "Minimum wireless standard"
+msgstr "最小無線規格"
+
+#: usr/local/www/interfaces.php:2184 usr/local/www/interfaces.php:2364
+#: usr/local/www/interfaces.php:2352 usr/local/www/interfaces.php:2382
+#: usr/local/www/interfaces.php:2428 usr/local/www/interfaces.php:2417
+#: usr/local/www/interfaces.php:2417
+msgid "Any"
+msgstr "任意の"
+
+#: usr/local/www/interfaces.php:2186 usr/local/www/interfaces.php:2366
+#: usr/local/www/interfaces.php:2354 usr/local/www/interfaces.php:2384
+#: usr/local/www/interfaces.php:2430 usr/local/www/interfaces.php:2419
+#: usr/local/www/interfaces.php:2419
+msgid "802.11g"
+msgstr "802.11グラム"
+
+#: usr/local/www/interfaces.php:2188 usr/local/www/interfaces.php:2368
+#: usr/local/www/interfaces.php:2356 usr/local/www/interfaces.php:2386
+#: usr/local/www/interfaces.php:2432 usr/local/www/interfaces.php:2421
+#: usr/local/www/interfaces.php:2421
+msgid "802.11n"
+msgstr "802.11nの"
+
+#: usr/local/www/interfaces.php:2191 usr/local/www/interfaces.php:2371
+#: usr/local/www/interfaces.php:2359 usr/local/www/interfaces.php:2389
+#: usr/local/www/interfaces.php:2435 usr/local/www/interfaces.php:2424
+#: usr/local/www/interfaces.php:2424
+msgid ""
+"When operating as an access point, allow only stations capable of the "
+"selected wireless standard to associate (stations not capable are not "
+"permitted to associate)."
+msgstr "選択された無線規格(対応していない局は「関連付けることは許可されていません)に関連付けるために、「アクセスポイントとして動作するとき、することができる唯一の局が許可する」 。"
+
+#: usr/local/www/interfaces.php:2196 usr/local/www/interfaces.php:2376
+#: usr/local/www/interfaces.php:2364 usr/local/www/interfaces.php:2394
+#: usr/local/www/interfaces.php:2440 usr/local/www/interfaces.php:2429
+#: usr/local/www/interfaces.php:2429
+msgid "802.11g only"
+msgstr "802.11グラムのみ"
+
+#: usr/local/www/interfaces.php:2199 usr/local/www/interfaces.php:2379
+#: usr/local/www/interfaces.php:2367 usr/local/www/interfaces.php:2397
+#: usr/local/www/interfaces.php:2443 usr/local/www/interfaces.php:2432
+#: usr/local/www/interfaces.php:2432
+msgid ""
+"When operating as an access point in 802.11g mode, allow only 11g-capable "
+"stations to associate (11b-only stations are not permitted to associate)."
+msgstr "ステーション(11B専用のステーションを関連付けることが許可されていない)に関連付けるために」の802.11gモードでアクセスポイントとして動作する場合、唯一の11グラム対応ができるように」 。"
+
+#: usr/local/www/interfaces.php:2204 usr/local/www/interfaces.php:2384
+#: usr/local/www/interfaces.php:2372 usr/local/www/interfaces.php:2402
+#: usr/local/www/interfaces.php:2448 usr/local/www/interfaces.php:2437
+#: usr/local/www/interfaces.php:2437
+msgid "Allow intra-BSS communication"
+msgstr "内のBSS通信を許可する"
+
+#: usr/local/www/interfaces.php:2208 usr/local/www/interfaces.php:2388
+#: usr/local/www/interfaces.php:2376 usr/local/www/interfaces.php:2406
+#: usr/local/www/interfaces.php:2452 usr/local/www/interfaces.php:2441
+#: usr/local/www/interfaces.php:2441
+msgid ""
+"When operating as an access point, enable this if you want to pass packets "
+"between wireless clients directly."
+msgstr "直接無線クライアントの間に「あなたは、パケットを渡したい場合は、アクセスポイントとして動作している場合、これを可能にする」 。"
+
+#: usr/local/www/interfaces.php:2210 usr/local/www/interfaces.php:2390
+#: usr/local/www/interfaces.php:2378 usr/local/www/interfaces.php:2408
+#: usr/local/www/interfaces.php:2454 usr/local/www/interfaces.php:2443
+#: usr/local/www/interfaces.php:2443
+msgid ""
+"Disabling the internal bridging is useful when traffic is to be processed "
+"with packet filtering."
+msgstr "パケットフィルタリングで「トラフィックが処理されるときに、内部のブリッジを無効にすると便利です」 。"
+
+#: usr/local/www/interfaces.php:2214 usr/local/www/interfaces.php:2394
+#: usr/local/www/interfaces.php:2382 usr/local/www/interfaces.php:2412
+#: usr/local/www/interfaces.php:2458 usr/local/www/interfaces.php:2447
+#: usr/local/www/interfaces.php:2447
+msgid "Enable WME"
+msgstr "WMEを有効にします"
+
+#: usr/local/www/interfaces.php:2217 usr/local/www/interfaces.php:2397
+#: usr/local/www/interfaces.php:2385 usr/local/www/interfaces.php:2415
+#: usr/local/www/interfaces.php:2461 usr/local/www/interfaces.php:2450
+#: usr/local/www/interfaces.php:2450
+msgid "Setting this option will force the card to use WME (wireless QoS)."
+msgstr "このオプションを設定すると、 WME (無線QoS)を使用するようにカードを強制します。"
+
+#: usr/local/www/interfaces.php:2221 usr/local/www/interfaces.php:2401
+#: usr/local/www/interfaces.php:2389 usr/local/www/interfaces.php:2419
+#: usr/local/www/interfaces.php:2465 usr/local/www/interfaces.php:2454
+#: usr/local/www/interfaces.php:2454
+msgid "Enable Hide SSID"
+msgstr "非表示のSSIDを有効にする"
+
+#: usr/local/www/interfaces.php:2225 usr/local/www/interfaces.php:2405
+#: usr/local/www/interfaces.php:2393 usr/local/www/interfaces.php:2423
+#: usr/local/www/interfaces.php:2469 usr/local/www/interfaces.php:2458
+#: usr/local/www/interfaces.php:2458
+msgid "Setting this option will force the card to NOT broadcast its SSID"
+msgstr "このオプションを設定すると、そのSSIDをブロードキャストしないように、カードを強制的に"
+
+#: usr/local/www/interfaces.php:2227 usr/local/www/interfaces.php:2407
+#: usr/local/www/interfaces.php:2395 usr/local/www/interfaces.php:2425
+#: usr/local/www/interfaces.php:2471 usr/local/www/interfaces.php:2460
+#: usr/local/www/interfaces.php:2460
+msgid "(this might create problems for some clients)."
+msgstr "(これはいくつかのクライアントのための問題を作成することができます) 。"
+
+#: usr/local/www/interfaces.php:2231 usr/local/www/interfaces.php:2411
+#: usr/local/www/interfaces.php:2399 usr/local/www/interfaces.php:2429
+#: usr/local/www/interfaces.php:2475 usr/local/www/interfaces.php:2464
+#: usr/local/www/interfaces.php:2464
+msgid "WEP"
+msgstr "WEP"
+
+#: usr/local/www/interfaces.php:2234 usr/local/www/interfaces.php:2414
+#: usr/local/www/interfaces.php:2402 usr/local/www/interfaces.php:2432
+#: usr/local/www/interfaces.php:2478 usr/local/www/interfaces.php:2467
+#: usr/local/www/interfaces.php:2467
+msgid "Enable WEP"
+msgstr "WEPを有効に"
+
+#: usr/local/www/interfaces.php:2239 usr/local/www/interfaces.php:2419
+#: usr/local/www/interfaces.php:2407 usr/local/www/interfaces.php:2437
+#: usr/local/www/interfaces.php:2483 usr/local/www/interfaces.php:2472
+#: usr/local/www/interfaces.php:2472
+msgid "TX key"
+msgstr "TXキー"
+
+#: usr/local/www/interfaces.php:2242 usr/local/www/interfaces.php:2422
+#: usr/local/www/interfaces.php:2410 usr/local/www/interfaces.php:2440
+#: usr/local/www/interfaces.php:2486 usr/local/www/interfaces.php:2475
+#: usr/local/www/interfaces.php:2475
+msgid "Key 1:"
+msgstr "キー1 :"
+
+#: usr/local/www/interfaces.php:2251 usr/local/www/interfaces.php:2431
+#: usr/local/www/interfaces.php:2419 usr/local/www/interfaces.php:2449
+#: usr/local/www/interfaces.php:2495 usr/local/www/interfaces.php:2484
+#: usr/local/www/interfaces.php:2484
+msgid "Key 2:"
+msgstr "キー2 :"
+
+#: usr/local/www/interfaces.php:2260 usr/local/www/interfaces.php:2440
+#: usr/local/www/interfaces.php:2428 usr/local/www/interfaces.php:2458
+#: usr/local/www/interfaces.php:2504 usr/local/www/interfaces.php:2493
+#: usr/local/www/interfaces.php:2493
+msgid "Key 3:"
+msgstr "キー3 :"
+
+#: usr/local/www/interfaces.php:2269 usr/local/www/interfaces.php:2449
+#: usr/local/www/interfaces.php:2437 usr/local/www/interfaces.php:2467
+#: usr/local/www/interfaces.php:2513 usr/local/www/interfaces.php:2502
+#: usr/local/www/interfaces.php:2502
+msgid "Key 4:"
+msgstr "キー4 :"
+
+#: usr/local/www/interfaces.php:2279 usr/local/www/interfaces.php:2459
+#: usr/local/www/interfaces.php:2447 usr/local/www/interfaces.php:2477
+#: usr/local/www/interfaces.php:2523 usr/local/www/interfaces.php:2512
+#: usr/local/www/interfaces.php:2512
+msgid ""
+"40 (64) bit keys may be entered as 5 ASCII characters or 10 hex digits "
+"preceded by '0x'."
+msgstr "'0 Xが前に」」 40 ( 64 )ビットのキーは、 5文字のASCII文字または10桁の16進数で入力してもよい」 。"
+
+#: usr/local/www/interfaces.php:2280 usr/local/www/interfaces.php:2460
+#: usr/local/www/interfaces.php:2448 usr/local/www/interfaces.php:2478
+#: usr/local/www/interfaces.php:2524 usr/local/www/interfaces.php:2513
+#: usr/local/www/interfaces.php:2513
+msgid ""
+"104 (128) bit keys may be entered as 13 ASCII characters or 26 hex digits "
+"preceded by '0x'."
+msgstr "'0 X'の前」 104 ( 128 )ビットのキーは13文字のASCII文字または26桁の16進数で入力してもよい」 。"
+
+#: usr/local/www/interfaces.php:2284 usr/local/www/interfaces.php:2308
+#: usr/local/www/interfaces.php:2464 usr/local/www/interfaces.php:2488
+#: usr/local/www/interfaces.php:2452 usr/local/www/interfaces.php:2476
+#: usr/local/www/interfaces.php:2482 usr/local/www/interfaces.php:2506
+#: usr/local/www/interfaces.php:2528 usr/local/www/interfaces.php:2552
+#: usr/local/www/interfaces.php:2517 usr/local/www/interfaces.php:2541
+#: usr/local/www/interfaces.php:2517 usr/local/www/interfaces.php:2541
+msgid "WPA"
+msgstr "WPA"
+
+#: usr/local/www/interfaces.php:2287 usr/local/www/interfaces.php:2467
+#: usr/local/www/interfaces.php:2455 usr/local/www/interfaces.php:2485
+#: usr/local/www/interfaces.php:2531 usr/local/www/interfaces.php:2520
+#: usr/local/www/interfaces.php:2520
+msgid "Enable WPA"
+msgstr "WPAを有効にします"
+
+#: usr/local/www/interfaces.php:2292 usr/local/www/interfaces.php:2472
+msgid "WPA Pre Shared Key"
+msgstr "WPA事前共有キー"
+
+#: usr/local/www/interfaces.php:2295 usr/local/www/interfaces.php:2475
+#: usr/local/www/interfaces.php:2463 usr/local/www/interfaces.php:2493
+#: usr/local/www/interfaces.php:2539 usr/local/www/interfaces.php:2528
+#: usr/local/www/interfaces.php:2528
+msgid "PSK:"
+msgstr "PSK :"
+
+#: usr/local/www/interfaces.php:2301 usr/local/www/interfaces.php:2481
+#: usr/local/www/interfaces.php:2469 usr/local/www/interfaces.php:2499
+#: usr/local/www/interfaces.php:2545 usr/local/www/interfaces.php:2534
+#: usr/local/www/interfaces.php:2534
+msgid "WPA Passphrase must be between 8 and 63 characters long."
+msgstr "パスフレーズは、8〜 63文字でなければなりません。"
+
+#: usr/local/www/interfaces.php:2305 usr/local/www/interfaces.php:2485
+#: usr/local/www/interfaces.php:2473 usr/local/www/interfaces.php:2503
+#: usr/local/www/interfaces.php:2549 usr/local/www/interfaces.php:2538
+#: usr/local/www/interfaces.php:2538
+msgid "WPA Mode"
+msgstr "WPAモード"
+
+#: usr/local/www/interfaces.php:2309 usr/local/www/interfaces.php:2489
+#: usr/local/www/interfaces.php:2477 usr/local/www/interfaces.php:2507
+#: usr/local/www/interfaces.php:2553 usr/local/www/interfaces.php:2542
+#: usr/local/www/interfaces.php:2542
+msgid "WPA2"
+msgstr "WPA2"
+
+#: usr/local/www/interfaces.php:2310 usr/local/www/interfaces.php:2320
+#: usr/local/www/interfaces.php:2330 usr/local/www/interfaces.php:2339
+#: usr/local/www/services_captiveportal_ip_edit.php:182
+#: usr/local/www/services_captiveportal_hostname_edit.php:164
+#: usr/local/www/interfaces.php:2490 usr/local/www/interfaces.php:2500
+#: usr/local/www/interfaces.php:2510 usr/local/www/interfaces.php:2519
+#: usr/local/www/services_captiveportal_hostname_edit.php:162
+#: usr/local/www/services_captiveportal_ip_edit.php:180
+#: usr/local/www/interfaces.php:2478 usr/local/www/interfaces.php:2488
+#: usr/local/www/interfaces.php:2498 usr/local/www/interfaces.php:2507
+#: usr/local/www/interfaces.php:2508 usr/local/www/interfaces.php:2518
+#: usr/local/www/interfaces.php:2528 usr/local/www/interfaces.php:2537
+#: usr/local/www/interfaces.php:2554 usr/local/www/interfaces.php:2564
+#: usr/local/www/interfaces.php:2574 usr/local/www/interfaces.php:2583
+#: usr/local/www/interfaces.php:2543 usr/local/www/interfaces.php:2553
+#: usr/local/www/interfaces.php:2563 usr/local/www/interfaces.php:2572
+#: usr/local/www/services_captiveportal_hostname_edit.php:164
+#: usr/local/www/interfaces.php:2543 usr/local/www/interfaces.php:2553
+#: usr/local/www/interfaces.php:2563 usr/local/www/interfaces.php:2572
+msgid "Both"
+msgstr "両方"
+
+#: usr/local/www/interfaces.php:2315 usr/local/www/interfaces.php:2495
+#: usr/local/www/interfaces.php:2483 usr/local/www/interfaces.php:2513
+#: usr/local/www/interfaces.php:2559 usr/local/www/interfaces.php:2548
+#: usr/local/www/interfaces.php:2548
+msgid "WPA Key Management Mode"
+msgstr "WPAキー管理モード"
+
+#: usr/local/www/interfaces.php:2318 usr/local/www/interfaces.php:2498
+msgid "Pre Shared Key"
+msgstr "事前共有キー"
+
+#: usr/local/www/interfaces.php:2319 usr/local/www/interfaces.php:2499
+#: usr/local/www/interfaces.php:2487 usr/local/www/interfaces.php:2517
+#: usr/local/www/interfaces.php:2563 usr/local/www/interfaces.php:2552
+#: usr/local/www/interfaces.php:2552
+msgid "Extensible Authentication Protocol"
+msgstr "拡張認証プロトコル"
+
+#: usr/local/www/interfaces.php:2328 usr/local/www/interfaces.php:2508
+#: usr/local/www/interfaces.php:2496 usr/local/www/interfaces.php:2526
+#: usr/local/www/interfaces.php:2572 usr/local/www/interfaces.php:2561
+#: usr/local/www/interfaces.php:2561
+msgid "Open System Authentication"
+msgstr "オープンシステム認証"
+
+#: usr/local/www/interfaces.php:2329 usr/local/www/interfaces.php:2509
+#: usr/local/www/interfaces.php:2497 usr/local/www/interfaces.php:2527
+#: usr/local/www/interfaces.php:2573 usr/local/www/interfaces.php:2562
+#: usr/local/www/interfaces.php:2562
+msgid "Shared Key Authentication"
+msgstr "共有鍵認証"
+
+#: usr/local/www/interfaces.php:2332 usr/local/www/interfaces.php:2512
+#: usr/local/www/interfaces.php:2500 usr/local/www/interfaces.php:2530
+#: usr/local/www/interfaces.php:2576 usr/local/www/interfaces.php:2565
+#: usr/local/www/interfaces.php:2565
+msgid "Note: Shared Key Authentication requires WEP."
+msgstr "注意:共有キー認証がWEPを必要とします。"
+
+#: usr/local/www/interfaces.php:2336 usr/local/www/interfaces.php:2516
+#: usr/local/www/interfaces.php:2504 usr/local/www/interfaces.php:2534
+#: usr/local/www/interfaces.php:2580 usr/local/www/interfaces.php:2569
+#: usr/local/www/interfaces.php:2569
+msgid "WPA Pairwise"
+msgstr "WPAペアワイズ"
+
+#: usr/local/www/interfaces.php:2340 usr/local/www/interfaces.php:2520
+#: usr/local/www/interfaces.php:2508 usr/local/www/interfaces.php:2538
+#: usr/local/www/interfaces.php:2584 usr/local/www/interfaces.php:2573
+#: usr/local/www/interfaces.php:2573
+msgid "AES (recommended)"
+msgstr "AES (推奨)"
+
+#: usr/local/www/interfaces.php:2341 usr/local/www/interfaces.php:2521
+#: usr/local/www/interfaces.php:2509 usr/local/www/interfaces.php:2539
+#: usr/local/www/interfaces.php:2585 usr/local/www/interfaces.php:2574
+#: usr/local/www/interfaces.php:2574
+msgid "TKIP"
+msgstr "TKIP"
+
+#: usr/local/www/interfaces.php:2346 usr/local/www/interfaces.php:2526
+#: usr/local/www/interfaces.php:2514 usr/local/www/interfaces.php:2544
+#: usr/local/www/interfaces.php:2590 usr/local/www/interfaces.php:2579
+#: usr/local/www/interfaces.php:2579
+msgid "Key Rotation"
+msgstr "キーローテーション"
+
+#: usr/local/www/interfaces.php:2349 usr/local/www/interfaces.php:2529
+#: usr/local/www/interfaces.php:2517 usr/local/www/interfaces.php:2547
+#: usr/local/www/interfaces.php:2593 usr/local/www/interfaces.php:2582
+#: usr/local/www/interfaces.php:2582
+msgid ""
+"Allowed values are 1-9999. Must be longer than Master Key "
+"Regeneration time."
+msgstr ""指定できる値は1から9999ですが、マスターキーよりも長くすべきではない」再生時間。"
+
+#: usr/local/www/interfaces.php:2353 usr/local/www/interfaces.php:2533
+#: usr/local/www/interfaces.php:2521 usr/local/www/interfaces.php:2551
+#: usr/local/www/interfaces.php:2597 usr/local/www/interfaces.php:2586
+#: usr/local/www/interfaces.php:2586
+msgid "Master Key Regeneration"
+msgstr "マスターキーの再生成"
+
+#: usr/local/www/interfaces.php:2356 usr/local/www/interfaces.php:2536
+#: usr/local/www/interfaces.php:2524 usr/local/www/interfaces.php:2554
+#: usr/local/www/interfaces.php:2600 usr/local/www/interfaces.php:2589
+#: usr/local/www/interfaces.php:2589
+msgid ""
+"Allowed values are 1-9999. Must be shorter than Key Rotation time."
+msgstr ""指定できる値は1から9999ですが、キーローテーション時間より短くすべきではない。"
+
+#: usr/local/www/interfaces.php:2360 usr/local/www/interfaces.php:2540
+#: usr/local/www/interfaces.php:2528 usr/local/www/interfaces.php:2558
+#: usr/local/www/interfaces.php:2604 usr/local/www/interfaces.php:2593
+#: usr/local/www/interfaces.php:2593
+msgid "Strict Key Regeneration"
+msgstr "厳密なキーの再生成"
+
+#: usr/local/www/interfaces.php:2363 usr/local/www/interfaces.php:2543
+#: usr/local/www/interfaces.php:2531 usr/local/www/interfaces.php:2561
+#: usr/local/www/interfaces.php:2607 usr/local/www/interfaces.php:2596
+#: usr/local/www/interfaces.php:2596
+msgid ""
+"Setting this option will force the AP to rekey whenever a client "
+"disassociates."
+msgstr "関連付けを解除し、 "このオプションを設定すると、クライアントはいつでも再生成するためにAPを強制します」 。"
+
+#: usr/local/www/interfaces.php:2367 usr/local/www/interfaces.php:2547
+#: usr/local/www/interfaces.php:2535 usr/local/www/interfaces.php:2565
+#: usr/local/www/interfaces.php:2611 usr/local/www/interfaces.php:2600
+#: usr/local/www/interfaces.php:2600
+msgid "Enable IEEE802.1X Authentication"
+msgstr "IEEE802.1X認証を有効にします"
+
+#: usr/local/www/interfaces.php:2370 usr/local/www/interfaces.php:2550
+#: usr/local/www/interfaces.php:2538 usr/local/www/interfaces.php:2568
+#: usr/local/www/interfaces.php:2614 usr/local/www/interfaces.php:2603
+#: usr/local/www/interfaces.php:2603
+msgid "Setting this option will enable 802.1X authentication."
+msgstr "このオプションを設定すると、 802.1x認証を有効にします。"
+
+#: usr/local/www/interfaces.php:2371
+#: usr/local/www/load_balancer_pool_edit.php:238
+#: usr/local/www/status_openvpn.php:304 usr/local/www/interfaces.php:2551
+#: usr/local/www/load_balancer_pool_edit.php:255
+#: usr/local/www/status_openvpn.php:307 usr/local/www/interfaces.php:2539
+#: usr/local/www/load_balancer_pool_edit.php:253
+#: usr/local/www/status_openvpn.php:355 usr/local/www/interfaces.php:2569
+#: usr/local/www/status_openvpn.php:385 usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces.php:2604 usr/local/www/status_openvpn.php:385
+#: usr/local/www/load_balancer_pool_edit.php:253
+#: usr/local/www/interfaces.php:2604
+msgid "NOTE"
+msgstr "注"
+
+#: usr/local/www/interfaces.php:2371 usr/local/www/interfaces.php:2551
+#: usr/local/www/interfaces.php:2539 usr/local/www/interfaces.php:2569
+#: usr/local/www/interfaces.php:2615 usr/local/www/interfaces.php:2604
+#: usr/local/www/interfaces.php:2604
+msgid "this option requires checking the "Enable WPA box"."
+msgstr "このオプションでは、 「有効WPAボックス」をチェックする必要があります。"
+
+#: usr/local/www/interfaces.php:2375 usr/local/www/interfaces.php:2555
+#: usr/local/www/interfaces.php:2543 usr/local/www/interfaces.php:2573
+#: usr/local/www/interfaces.php:2619 usr/local/www/interfaces.php:2608
+#: usr/local/www/interfaces.php:2608
+msgid "802.1X Authentication Server IP Address"
+msgstr "802.1X認証サーバーのIPアドレス"
+
+#: usr/local/www/interfaces.php:2378 usr/local/www/interfaces.php:2558
+#: usr/local/www/interfaces.php:2579 usr/local/www/interfaces.php:2546
+#: usr/local/www/interfaces.php:2567 usr/local/www/interfaces.php:2576
+#: usr/local/www/interfaces.php:2597 usr/local/www/interfaces.php:2622
+#: usr/local/www/interfaces.php:2643 usr/local/www/interfaces.php:2611
+#: usr/local/www/interfaces.php:2632 usr/local/www/interfaces.php:2611
+#: usr/local/www/interfaces.php:2632
+msgid ""
+"Enter the IP address of the 802.1X Authentication Server. This is commonly "
+"a Radius server (FreeRadius, Internet Authentication Services, etc.)"
+msgstr "「802.1X認証サーバのIPアドレスを入力します。これは、一般的には「 Radiusサーバ(にFreeRadius 、インターネット認証サービスなど)"
+
+#: usr/local/www/interfaces.php:2382 usr/local/www/interfaces.php:2562
+#: usr/local/www/interfaces.php:2550 usr/local/www/interfaces.php:2580
+#: usr/local/www/interfaces.php:2626 usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces.php:2615
+msgid "802.1X Authentication Server Port"
+msgstr "802.1X認証サーバーポート"
+
+#: usr/local/www/interfaces.php:2385 usr/local/www/interfaces.php:2565
+#: usr/local/www/interfaces.php:2586 usr/local/www/interfaces.php:2553
+#: usr/local/www/interfaces.php:2574 usr/local/www/interfaces.php:2583
+#: usr/local/www/interfaces.php:2604 usr/local/www/interfaces.php:2629
+#: usr/local/www/interfaces.php:2650 usr/local/www/interfaces.php:2618
+#: usr/local/www/interfaces.php:2639 usr/local/www/interfaces.php:2618
+#: usr/local/www/interfaces.php:2639
+msgid "Leave blank for the default port 1812."
+msgstr "デフォルト1812ポートに対しては空白のままにします。"
+
+#: usr/local/www/interfaces.php:2389 usr/local/www/interfaces.php:2569
+#: usr/local/www/interfaces.php:2557 usr/local/www/interfaces.php:2587
+#: usr/local/www/interfaces.php:2633 usr/local/www/interfaces.php:2622
+#: usr/local/www/interfaces.php:2622
+msgid "802.1X Authentication Server Shared Secret"
+msgstr "802.1X認証サーバー共有シークレット"
+
+#: usr/local/www/interfaces.php:2396 usr/local/www/interfaces.php:2597
+#: usr/local/www/interfaces.php:2585 usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces.php:2661 usr/local/www/interfaces.php:2650
+#: usr/local/www/interfaces.php:2650
+msgid "Authentication Roaming Preauth"
+msgstr "認証ローミングPREAUTH"
+
+#: usr/local/www/interfaces.php:2407 usr/local/www/interfaces.php:2608
+#: usr/local/www/interfaces.php:2596 usr/local/www/interfaces.php:2626
+#: usr/local/www/interfaces.php:2672 usr/local/www/interfaces.php:2661
+#: usr/local/www/interfaces.php:2661
+msgid "Private networks"
+msgstr "プライベートネットワーク"
+
+#: usr/local/www/interfaces.php:2415 usr/local/www/interfaces.php:2616
+#: usr/local/www/interfaces.php:2604 usr/local/www/interfaces.php:2634
+#: usr/local/www/interfaces.php:2680 usr/local/www/interfaces.php:2669
+#: usr/local/www/interfaces.php:2669
+msgid ""
+"When set, this option blocks traffic from IP addresses that are reserved for "
+"private networks as per RFC 1918 (10/8, 172.16/12, 192.168/16) as"
+msgstr "「設定した場合、このオプションをブロックトラフィックはのために予約されているIPアドレスからの「 RFC 1918 ( 10月8日、 172.16/12 、 192.168/16 )に従ってプライベートネットワークとして"
+
+#: usr/local/www/interfaces.php:2417 usr/local/www/interfaces.php:2618
+#: usr/local/www/interfaces.php:2606 usr/local/www/interfaces.php:2636
+#: usr/local/www/interfaces.php:2682 usr/local/www/interfaces.php:2671
+#: usr/local/www/interfaces.php:2671
+msgid "well as loopback addresses (127/8)."
+msgstr "だけでなく、ループバックアドレス( 8分の127 ) 。"
+
+#: usr/local/www/interfaces.php:2417 usr/local/www/interfaces.php:2618
+#: usr/local/www/interfaces.php:2606 usr/local/www/interfaces.php:2636
+#: usr/local/www/interfaces.php:2682 usr/local/www/interfaces.php:2671
+#: usr/local/www/interfaces.php:2671
+msgid ""
+"You should generally leave this option turned on, unless your WAN network "
+"lies in such a private address space, too."
+msgstr "このようなプライベートアドレス空間にありすぎて、 「あなたのWANネットワークがない限り、一般的には、オンになって、このオプションを残してください」 。"
+
+#: usr/local/www/interfaces.php:2427 usr/local/www/interfaces.php:2628
+#: usr/local/www/interfaces.php:2616 usr/local/www/interfaces.php:2646
+#: usr/local/www/interfaces.php:2692 usr/local/www/interfaces.php:2681
+#: usr/local/www/interfaces.php:2681
+msgid ""
+"When set, this option blocks traffic from IP addresses that are reserved "
+"(but not RFC 1918) or not yet assigned by IANA."
+msgstr "「設定した場合、このオプションはトラフィックをブロックし、IPアドレスから予約されていること」 (ただし、RFC 1918 )か、まだIANAによって割り当てられていない。"
+
+#: usr/local/www/interfaces.php:2429 usr/local/www/interfaces.php:2630
+#: usr/local/www/interfaces.php:2618 usr/local/www/interfaces.php:2648
+#: usr/local/www/interfaces.php:2694 usr/local/www/interfaces.php:2683
+#: usr/local/www/interfaces.php:2683
+msgid ""
+"Bogons are prefixes that should never appear in the Internet routing table, "
+"and obviously should not appear as the source address in any packets you "
+"receive."
+msgstr "「 Bogonsは、インターネットルーティングテーブルに表示されないようにしてください接頭辞である」と明らかにあなたは、 「受信したすべてのパケットの送信元アドレスとして表示されません。"
+
+#: usr/local/www/interfaces.php:2550 usr/local/www/interfaces.php:2559
+#: usr/local/www/interfaces.php:2752 usr/local/www/interfaces.php:2761
+#: usr/local/www/interfaces.php:2740 usr/local/www/interfaces.php:2749
+#: usr/local/www/interfaces.php:2774 usr/local/www/interfaces.php:2783
+#: usr/local/www/interfaces.php:2820 usr/local/www/interfaces.php:2829
+#: usr/local/www/interfaces.php:2806 usr/local/www/interfaces.php:2815
+#: usr/local/www/interfaces.php:2806 usr/local/www/interfaces.php:2815
+msgid "You can manage Gateways"
+msgstr "あなたは、ゲートウェイを管理できる"
+
+#: usr/local/www/interfaces_assign.php:43
+#: usr/local/www/interfaces_assign.php:43
+msgid "Assign network ports"
+msgstr "ネットワークポートの割り当て"
+
+#: usr/local/www/interfaces_assign.php:194
+#: usr/local/www/interfaces_assign.php:194
+#, php-format
+msgid "Port %1$s was assigned to %2$s interfaces:"
+msgstr "ポートは%1$sは%2$sインタフェースに割り当てられた。"
+
+#: usr/local/www/interfaces_assign.php:262
+#: usr/local/www/interfaces_assign.php:274
+#: usr/local/www/interfaces_assign.php:274
+msgid ""
+"The interface is part of a group. Please remove it from the group to continue"
+msgstr "「インターフェースはグループの一部である。継続してグループから削除してください"
+
+#: usr/local/www/interfaces_assign.php:264
+#: usr/local/www/interfaces_assign.php:276
+#: usr/local/www/interfaces_assign.php:276
+msgid ""
+"The interface is part of a bridge. Please remove it from the bridge to "
+"continue"
+msgstr "「インターフェイスは、ブリッジの一部である。ブリッジからそれを削除してください」継続"
+
+#: usr/local/www/interfaces_assign.php:266
+#: usr/local/www/interfaces_assign.php:278
+#: usr/local/www/interfaces_assign.php:278
+msgid ""
+"The interface is part of a gre tunnel. Please delete the tunnel to continue"
+msgstr "「インターフェースはGREトンネルの一部である。継続してトンネルを削除してください"
+
+#: usr/local/www/interfaces_assign.php:268
+#: usr/local/www/interfaces_assign.php:280
+#: usr/local/www/interfaces_assign.php:280
+msgid ""
+"The interface is part of a gif tunnel. Please delete the tunnel to continue"
+msgstr "「インターフェースは、GIFトンネルの一部である。継続してトンネルを削除してください"
+
+#: usr/local/www/interfaces_assign.php:318
+#: usr/local/www/interfaces_assign.php:312
+#: usr/local/www/interfaces_assign.php:318
+msgid "Interface has been deleted."
+msgstr "インターフェイスは削除されました。"
+
+#: usr/local/www/interfaces_assign.php:325
+#: usr/local/www/interfaces_assign.php:319
+#: usr/local/www/interfaces_assign.php:325
+msgid "lan"
+msgstr "LAN"
+
+#: usr/local/www/interfaces_assign.php:326
+#: usr/local/www/interfaces_assign.php:320
+#: usr/local/www/interfaces_assign.php:326
+msgid "LAN"
+msgstr "LAN"
+
+#: usr/local/www/interfaces_assign.php:366
+#: usr/local/www/interfaces_assign.php:360
+#: usr/local/www/interfaces_assign.php:366
+msgid "Interface has been added."
+msgstr "インタフェースが追加されました。"
+
+#: usr/local/www/interfaces_assign.php:376
+#: usr/local/www/interfaces_assign.php:370
+#: usr/local/www/interfaces_assign.php:376
+msgid "The system is now rebooting. Please wait."
+msgstr "システムがリブートされます。しばらくお待ちください。"
+
+#: usr/local/www/interfaces_assign.php:378
+#: usr/local/www/interfaces_assign.php:372
+#: usr/local/www/interfaces_assign.php:378
+msgid "Reboot is needed. Please apply the settings in order to reboot."
+msgstr "再起動が必要になる。再起動するために設定を適用してください。"
+
+#: usr/local/www/interfaces_assign.php:380
+#: usr/local/www/interfaces_assign.php:374
+#: usr/local/www/interfaces_assign.php:380
+msgid ""
+"Interface mismatch detected. Please resolve the mismatch and click Save. "
+"The firewall will reboot afterwards."
+msgstr "ファイアウォールは、その後再起動します。"
+
+#: usr/local/www/interfaces_assign.php:390
+#: usr/local/www/interfaces_assign.php:384
+#: usr/local/www/interfaces_assign.php:390
+msgid ""
+"The interface configuration has been changed.<br />You must apply the changes "
+"in order for them to take effect."
+msgstr "それらを有効にするために、「インターフェイスの設定が変更されています。検索して、変更を適用する必要があります」 。"
+
+#: usr/local/www/interfaces_assign.php:421
+#: usr/local/www/interfaces_assign.php:415
+#: usr/local/www/interfaces_assign.php:421
+msgid "Network port"
+msgstr "ネットワークポート"
+
+#: usr/local/www/interfaces_assign.php:437
+#: usr/local/www/interfaces_assign.php:431
+#: usr/local/www/interfaces_assign.php:437
+#, php-format
+msgid "VLAN %1$s on %2$s"
+msgstr "%2$sのVLANは%1$s"
+
+#: usr/local/www/interfaces_assign.php:480
+#: usr/local/www/interfaces_assign.php:474
+#: usr/local/www/interfaces_assign.php:480
+msgid "Do you really want to delete this interface?"
+msgstr "あなたは本当に、このインターフェイスを削除しますか?"
+
+#: usr/local/www/interfaces_assign.php:480
+#: usr/local/www/interfaces_assign.php:474
+#: usr/local/www/interfaces_assign.php:480
+msgid "delete interface"
+msgstr "インターフェイスを削除する"
+
+#: usr/local/www/interfaces_assign.php:489
+#: usr/local/www/interfaces_assign.php:483
+#: usr/local/www/interfaces_assign.php:489
+msgid "add interface"
+msgstr "インタフェースを追加"
+
+#: usr/local/www/interfaces_assign.php:506
+#: usr/local/www/interfaces_assign.php:500
+#: usr/local/www/interfaces_assign.php:504
+#: usr/local/www/interfaces_assign.php:504
+msgid ""
+"Interfaces that are configured as members of a lagg(4) interface will not be "
+"shown."
+msgstr "示されている「 laggのメンバーとして構成されたインタフェースは、 ( 4 )インタフェースはなりません」 。"
+
+#: usr/local/www/diag_pf_info.php:46 usr/local/www/diag_pf_info.php:46
+msgid "Diagnostics: pfInfo"
+msgstr "診断: PFINFO"
+
+#: usr/local/www/diag_pf_info.php:106 usr/local/www/diag_pf_info.php:103
+msgid "Gathering PF information, please wait..."
+msgstr "PF情報を収集しています。しばらくお待ちください..."
+
+#: usr/local/www/diag_smart.php:14 usr/local/www/diag_smart.php:14
+msgid "S.M.A.R.T. Monitor Tools"
+msgstr "S.M.A.R.T.ツールを監視"
+
+#: usr/local/www/diag_smart.php:68 usr/local/www/diag_smart.php:73
+#: usr/local/www/diag_smart.php:73
+msgid "PASSED"
+msgstr "PASSED"
+
+#: usr/local/www/diag_smart.php:69 usr/local/www/diag_smart.php:74
+#: usr/local/www/diag_smart.php:74
+msgid "FAILED"
+msgstr "FAILED"
+
+#: usr/local/www/diag_smart.php:70 usr/local/www/diag_smart.php:75
+#: usr/local/www/diag_smart.php:75
+msgid "Warning"
+msgstr "警告"
+
+#: usr/local/www/diag_smart.php:113 usr/local/www/diag_smart.php:413
+#: usr/local/www/diag_smart.php:126 usr/local/www/diag_smart.php:434
+#: usr/local/www/diag_smart.php:126 usr/local/www/diag_smart.php:434
+msgid "Abort"
+msgstr "中止"
+
+#: usr/local/www/diag_smart.php:154 usr/local/www/diag_smart.php:175
+#: usr/local/www/diag_smart.php:175
+#, php-format
+msgid "Email sent to %s"
+msgstr "メール%sに送ら"
+
+#: usr/local/www/diag_smart.php:194 usr/local/www/diag_smart.php:266
+#: usr/local/www/diag_smart.php:215 usr/local/www/diag_smart.php:287
+#: usr/local/www/diag_smart.php:215 usr/local/www/diag_smart.php:287
+msgid "Information/Tests"
+msgstr "情報/テスト"
+
+#: usr/local/www/diag_smart.php:195 usr/local/www/diag_smart.php:206
+#: usr/local/www/diag_smart.php:216 usr/local/www/diag_smart.php:227
+#: usr/local/www/diag_smart.php:216 usr/local/www/diag_smart.php:227
+msgid "Config"
+msgstr "設定"
+
+#: usr/local/www/diag_smart.php:209 usr/local/www/system_camanager.php:524
+#: usr/local/www/system_certmanager.php:617
+#: usr/local/www/system_certmanager.php:720
+#: usr/local/www/system_certmanager.php:733
+#: usr/local/www/system_certmanager.php:886
+#: usr/local/www/system_camanager.php:525
+#: usr/local/www/system_camanager.php:549 usr/local/www/diag_smart.php:230
+#: usr/local/www/system_certmanager.php:758
+#: usr/local/www/system_certmanager.php:928
+#: usr/local/www/system_certmanager.php:759
+#: usr/local/www/system_certmanager.php:932
+#: usr/local/www/system_camanager.php:549 usr/local/www/diag_smart.php:230
+#: usr/local/www/system_certmanager.php:759
+#: usr/local/www/system_certmanager.php:932
+msgid "Email Address"
+msgstr "電子メールアドレス"
+
+#: usr/local/www/diag_smart.php:231 usr/local/www/diag_smart.php:252
+#: usr/local/www/diag_smart.php:252
+msgid "Test email"
+msgstr "テストメール"
+
+#: usr/local/www/diag_smart.php:236 usr/local/www/diag_smart.php:257
+#: usr/local/www/diag_smart.php:257
+#, php-format
+msgid "Send test email to %s"
+msgstr "%sにテストメールを送信"
+
+#: usr/local/www/diag_smart.php:278 usr/local/www/diag_smart.php:283
+#: usr/local/www/diag_smart.php:299 usr/local/www/diag_smart.php:304
+#: usr/local/www/diag_smart.php:299 usr/local/www/diag_smart.php:304
+msgid "Info"
+msgstr "インフォメーション"
+
+#: usr/local/www/diag_smart.php:281 usr/local/www/diag_smart.php:302
+#: usr/local/www/diag_smart.php:302
+msgid "Info type"
+msgstr "情報の種類"
+
+#: usr/local/www/diag_smart.php:284 usr/local/www/diag_smart.php:305
+#: usr/local/www/diag_smart.php:305
+msgid "Health"
+msgstr "健康"
+
+#: usr/local/www/diag_smart.php:285 usr/local/www/diag_smart.php:306
+#: usr/local/www/diag_smart.php:306
+msgid "SMART Capabilities"
+msgstr "SMART機能"
+
+#: usr/local/www/diag_smart.php:286 usr/local/www/diag_smart.php:307
+#: usr/local/www/diag_smart.php:307
+msgid "Attributes"
+msgstr "属性"
+
+#: usr/local/www/diag_smart.php:287 usr/local/www/firewall_aliases.php:179
+#: usr/local/www/diag_smart.php:308 usr/local/www/firewall_aliases.php:177
+#: usr/local/www/firewall_aliases.php:177 usr/local/www/diag_smart.php:308
+msgid "All"
+msgstr "すべて"
+
+#: usr/local/www/diag_smart.php:291 usr/local/www/diag_smart.php:330
+#: usr/local/www/diag_smart.php:367 usr/local/www/diag_smart.php:397
+#: usr/local/www/diag_smart.php:312 usr/local/www/diag_smart.php:351
+#: usr/local/www/diag_smart.php:388 usr/local/www/diag_smart.php:418
+#: usr/local/www/diag_smart.php:312 usr/local/www/diag_smart.php:351
+#: usr/local/www/diag_smart.php:388 usr/local/www/diag_smart.php:418
+msgid "Device: /dev/"
+msgstr "デバイス:は/ dev /"
+
+#: usr/local/www/diag_smart.php:307 usr/local/www/diag_smart.php:383
+#: usr/local/www/diag_smart.php:328 usr/local/www/diag_smart.php:404
+#: usr/local/www/diag_smart.php:328 usr/local/www/diag_smart.php:404
+msgid "View"
+msgstr "ビュー"
+
+#: usr/local/www/diag_smart.php:318
+msgid "Perform Self Tests"
+msgstr "セルフ·テストを実行"
+
+#: usr/local/www/diag_smart.php:321 usr/local/www/diag_smart.php:342
+#: usr/local/www/diag_smart.php:342
+msgid "Test type"
+msgstr "視力検査表"
+
+#: usr/local/www/diag_smart.php:323
+#: usr/local/www/status_gateway_groups.php:123
+#: usr/local/www/status_gateways.php:118
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:60
+#: usr/local/www/status_gateways.php:119
+#: usr/local/www/status_gateway_groups.php:124
+#: usr/local/www/diag_smart.php:344 usr/local/www/diag_smart.php:344
+#: usr/local/www/status_gateway_groups.php:124
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:60
+#: usr/local/www/status_gateways.php:119
+msgid "Offline"
+msgstr "オフラインで"
+
+#: usr/local/www/diag_smart.php:324 usr/local/www/diag_smart.php:345
+#: usr/local/www/diag_smart.php:345
+msgid "Short"
+msgstr "ショート"
+
+#: usr/local/www/diag_smart.php:325 usr/local/www/diag_smart.php:346
+#: usr/local/www/diag_system_pftop.php:137 usr/local/www/diag_smart.php:346
+#: usr/local/www/diag_system_pftop.php:137
+msgid "Long"
+msgstr "ロング"
+
+#: usr/local/www/diag_smart.php:326 usr/local/www/diag_smart.php:347
+#: usr/local/www/diag_smart.php:347
+msgid "Conveyance (ATA Disks Only)"
+msgstr "搬送( ATAディスクのみ)"
+
+#: usr/local/www/diag_smart.php:357 usr/local/www/diag_smart.php:378
+#: usr/local/www/diag_smart.php:378
+msgid "View Logs"
+msgstr "ログを見る"
+
+#: usr/local/www/diag_smart.php:360 usr/local/www/diag_smart.php:381
+#: usr/local/www/diag_smart.php:381
+msgid "Log type"
+msgstr "タイプをログに記録する"
+
+#: usr/local/www/diag_smart.php:362 usr/local/www/diag_smart.php:383
+#: usr/local/www/diag_smart.php:383
+msgid "Error"
+msgstr "エラー"
+
+#: usr/local/www/diag_smart.php:363
+msgid "Self Test"
+msgstr "セルフテスト"
+
+#: usr/local/www/diag_smart.php:394 usr/local/www/diag_smart.php:415
+#: usr/local/www/diag_smart.php:415
+msgid "Abort tests"
+msgstr "テストを中止"
+
+#: usr/local/www/diag_smart.php:413 usr/local/www/diag_smart.php:434
+#: usr/local/www/diag_smart.php:434
+msgid "Do you really want to abort the test?"
+msgstr "あなたは本当に、テストを中止しますか?"
+
+#: usr/local/www/diag_smart.php:428 usr/local/www/diag_smart.php:449
+#: usr/local/www/diag_smart.php:449
+msgid "Back"
+msgstr "バック"
+
+#: usr/local/www/diag_states_summary.php:154
+#: usr/local/www/diag_states_summary.php:143
+#: usr/local/www/diag_states_summary.php:145
+#: usr/local/www/diag_states_summary.php:145
+msgid "Src Ports"
+msgstr "SRCポート"
+
+#: usr/local/www/diag_states_summary.php:155
+#: usr/local/www/diag_states_summary.php:144
+#: usr/local/www/diag_states_summary.php:146
+#: usr/local/www/diag_states_summary.php:146
+msgid "Dst Ports"
+msgstr "DSTポート"
+
+#: usr/local/www/diag_states_summary.php:185
+#: usr/local/www/diag_states_summary.php:174
+#: usr/local/www/diag_states_summary.php:176
+#: usr/local/www/diag_states_summary.php:176
+msgid "State Table Summary"
+msgstr "状態表の概要"
+
+#: usr/local/www/diag_states_summary.php:191
+#: usr/local/www/diag_states_summary.php:180
+#: usr/local/www/diag_states_summary.php:182
+#: usr/local/www/diag_states_summary.php:182
+msgid "By Source IP"
+msgstr "送信元IPによる"
+
+#: usr/local/www/diag_states_summary.php:192
+#: usr/local/www/diag_states_summary.php:181
+#: usr/local/www/diag_states_summary.php:183
+#: usr/local/www/diag_states_summary.php:183
+msgid "By Destination IP"
+msgstr "宛先IPによる"
+
+#: usr/local/www/diag_states_summary.php:193
+#: usr/local/www/diag_states_summary.php:182
+#: usr/local/www/diag_states_summary.php:184
+#: usr/local/www/diag_states_summary.php:184
+msgid "Total per IP"
+msgstr "IPアドレスごとの合計"
+
+#: usr/local/www/diag_states_summary.php:194
+#: usr/local/www/diag_states_summary.php:183
+#: usr/local/www/diag_states_summary.php:185
+#: usr/local/www/diag_states_summary.php:185
+msgid "By IP Pair"
+msgstr "IPペアで"
+
+#: usr/local/www/diag_system_activity.php:46
+#: usr/local/www/diag_system_activity.php:46
+msgid "Diagnostics: System Activity"
+msgstr "診断:システムアクティビティ"
+
+#: usr/local/www/diag_system_activity.php:101
+#: usr/local/www/diag_system_activity.php:101
+msgid "Gathering CPU activity, please wait..."
+msgstr "CPUアクティビティを収集しています。しばらくお待ちください..."
+
+#: usr/local/www/diag_system_pftop.php:45
+#: usr/local/www/diag_system_pftop.php:45
+msgid "Diagnostics: pfTop"
+msgstr "診断: pfTop"
+
+#: usr/local/www/diag_system_pftop.php:51
+#: usr/local/www/diag_system_pftop.php:62
+#: usr/local/www/diag_system_pftop.php:103
+msgid "bytes"
+msgstr "バイト"
+
+#: usr/local/www/diag_system_pftop.php:99
+#: usr/local/www/diag_system_pftop.php:148
+#: usr/local/www/diag_system_pftop.php:148
+msgid "Sort type:"
+msgstr "ソートの種類:"
+
+#: usr/local/www/diag_system_pftop.php:102
+msgid "age"
+msgstr "時代"
+
+#: usr/local/www/diag_system_pftop.php:104
+msgid "dest"
+msgstr "DEST"
+
+#: usr/local/www/diag_system_pftop.php:105
+msgid "dport"
+msgstr "DPORT"
+
+#: usr/local/www/diag_system_pftop.php:106
+msgid "exp"
+msgstr "EXP"
+
+#: usr/local/www/diag_system_pftop.php:108
+msgid "peak"
+msgstr "ピーク"
+
+#: usr/local/www/diag_system_pftop.php:109
+msgid "pkt"
+msgstr "PKT"
+
+#: usr/local/www/diag_system_pftop.php:110
+#: usr/local/www/status_interfaces.php:365
+#: usr/local/www/status_interfaces.php:462
+#: usr/local/www/status_interfaces.php:465
+#: usr/local/www/status_interfaces.php:465
+msgid "rate"
+msgstr "率"
+
+#: usr/local/www/diag_system_pftop.php:111
+msgid "size"
+msgstr "サイズ"
+
+#: usr/local/www/diag_system_pftop.php:112
+msgid "sport"
+msgstr "スポーツ"
+
+#: usr/local/www/diag_system_pftop.php:113
+msgid "src"
+msgstr "SRC"
+
+#: usr/local/www/diag_system_pftop.php:126
+#: usr/local/www/diag_system_pftop.php:187
+#: usr/local/www/diag_system_pftop.php:187
+msgid "Gathering pfTOP activity, please wait..."
+msgstr "pfTOPアクティビティを収集しています。しばらくお待ちください..."
+
+#: usr/local/www/license.php:45 usr/local/www/license.php:45
+msgid "License"
+msgstr "ライセンス"
+
+#: usr/local/www/license.php:47 usr/local/www/license.php:47
+msgid "is Copyright"
+msgstr "著作権は、"
+
+#: usr/local/www/license.php:47 usr/local/www/firewall_rules_edit.php:1585
+#: usr/local/www/firewall_rules_edit.php:1593
+#: usr/local/www/firewall_nat_edit.php:869
+#: usr/local/www/firewall_nat_edit.php:877
+#: usr/local/www/firewall_nat_out_edit.php:684
+#: usr/local/www/firewall_nat_out_edit.php:692
+#: usr/local/www/firewall_rules_edit.php:1596
+#: usr/local/www/firewall_rules_edit.php:1604
+#: usr/local/www/firewall_nat_edit.php:870
+#: usr/local/www/firewall_nat_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:1596
+#: usr/local/www/firewall_rules_edit.php:1604
+#: usr/local/www/firewall_nat_edit.php:870
+#: usr/local/www/firewall_nat_edit.php:878 usr/local/www/license.php:47
+#: usr/local/www/firewall_nat_out_edit.php:684
+#: usr/local/www/firewall_nat_out_edit.php:692
+msgid "by"
+msgstr "バイ"
+
+#: usr/local/www/license.php:48 usr/local/www/license.php:52
+#: usr/local/www/license.php:48 usr/local/www/license.php:52
+msgid "All rights reserved"
+msgstr "無断複写·転載を禁じます"
+
+#: usr/local/www/license.php:50 usr/local/www/license.php:50
+msgid "m0n0wall is Copyright "
+msgstr "m0n0wallの著作権です"
+
+#: usr/local/www/license.php:50 usr/local/www/license.php:50
+msgid "2002-2007 by Manuel Kasper"
+msgstr "マヌエル·カスパーによる2002-2007"
+
+#: usr/local/www/license.php:53 usr/local/www/license.php:53
+msgid "Redistribution and use in source and binary forms, with or without"
+msgstr "再配布の有無にかかわらず、ソースおよびバイナリ形式での使用"
+
+#: usr/local/www/license.php:54 usr/local/www/license.php:54
+msgid ""
+"modification, are permitted provided that the following conditions are met"
+msgstr "「修正は、次の条件を満たす場合に許可され"
+
+#: usr/local/www/license.php:57 usr/local/www/license.php:57
+msgid ""
+"1. Redistributions of source code must retain the above copyright notice,"
+msgstr "「 1 。ソースコードの再配布には、上記の著作権表示を保持しなければならない、"
+
+#: usr/local/www/license.php:59 usr/local/www/license.php:59
+msgid "this list of conditions and the following disclaimer"
+msgstr "この条件リスト、および以下の免責"
+
+#: usr/local/www/license.php:61 usr/local/www/license.php:61
+msgid "2. Redistributions in binary form must reproduce the above copyright"
+msgstr "2 。バイナリ形式で再配布する場合は、上記の著作権を複写しなければなりません"
+
+#: usr/local/www/license.php:62 usr/local/www/license.php:62
+msgid "notice, this list of conditions and the following disclaimer in the"
+msgstr "、この条件リスト、および下記の免責事項に気付く"
+
+#: usr/local/www/license.php:64 usr/local/www/license.php:64
+msgid "documentation and/or other materials provided with the distribution."
+msgstr "ドキュメントおよび/または配布で提供される他の物質。"
+
+#: usr/local/www/license.php:66 usr/local/www/license.php:66
+msgid "THIS SOFTWARE IS PROVIDED "
+msgstr "本ソフトウェアが提供され"
+
+#: usr/local/www/license.php:66 usr/local/www/license.php:66
+msgid "AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,"
+msgstr "現状のまま'' 、いかなる明示または黙示の保証、"
+
+#: usr/local/www/license.php:68 usr/local/www/license.php:68
+msgid ""
+"INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY"
+msgstr "「一切の明示、を含むが、これらに限定されない"
+
+#: usr/local/www/license.php:69 usr/local/www/license.php:69
+msgid ""
+"AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE"
+msgstr "特定の目的に対する"および適合は、いかなる場合も。放棄されSHALL"
+
+#: usr/local/www/license.php:71 usr/local/www/license.php:71
+msgid ""
+"AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,"
+msgstr "「著者はいかなる直接的、間接的、偶発的に対して、一切責任を負わ、特殊、懲戒的、"
+
+#: usr/local/www/license.php:73 usr/local/www/license.php:73
+msgid "OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF"
+msgstr "またはその他を含むではなく、必然的な損害は(TO 、調達の限られた"
+
+#: usr/local/www/license.php:75 usr/local/www/license.php:75
+msgid ""
+"SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS"
+msgstr "「代替商品またはサービス;の喪失、データや利益または事業"
+
+#: usr/local/www/license.php:77 usr/local/www/license.php:77
+msgid "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN"
+msgstr "中断は)いかなる責任、不法INの上の任意の理論"
+
+#: usr/local/www/license.php:79 usr/local/www/license.php:79
+msgid "CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)"
+msgstr "契約、 (過失を含むまたはその他)厳格責任、または不法行為"
+
+#: usr/local/www/license.php:80 usr/local/www/license.php:80
+msgid ""
+"ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE"
+msgstr ""についての通告があった場合でも、本ソフトウェアの使用にどのような方法で起因"
+
+#: usr/local/www/license.php:82 usr/local/www/license.php:82
+msgid "POSSIBILITY OF SUCH DAMAGE"
+msgstr "そのような損害の可能性について"
+
+#: usr/local/www/license.php:84 usr/local/www/license.php:84
+msgid "The following persons have contributed code to m0n0wall"
+msgstr "次の人はm0n0wallのにコードを貢献している"
+
+#: usr/local/www/license.php:86 usr/local/www/license.php:86
+msgid "Diagnostics: Ping function; WLAN channel auto-select; DNS forwarder"
+msgstr "診断: Pingの機能、無線LANチャネルを自動選択、 DNSフォワーダ"
+
+#: usr/local/www/license.php:90 usr/local/www/license.php:90
+msgid "Timezone and NTP client support"
+msgstr "タイムゾーンとNTPクライアントのサポート"
+
+#: usr/local/www/license.php:94 usr/local/www/license.php:94
+msgid ""
+"Remote syslog'ing; some code bits for DHCP server on optional interfaces"
+msgstr "「リモートsyslog'ing 、オプションのインターフェイス上のDHCPサーバのためのいくつかのコードビット"
+
+#: usr/local/www/license.php:98 usr/local/www/license.php:98
+msgid ""
+"Idea/code bits for encrypted webConfigurator passwords; minimalized SNMP "
+"agent"
+msgstr "「暗号化webConfiguratorパスワードのアイデア/コードビット、 minimalized SNMP 」エージェント"
+
+#: usr/local/www/license.php:102 usr/local/www/license.php:102
+msgid "Advanced outbound NAT: destination selection"
+msgstr "高度なアウトバウンドNAT :送信先の選択"
+
+#: usr/local/www/license.php:106 usr/local/www/license.php:106
+msgid "Filtering bridge patches "
+msgstr "フィルタリングブリッジパッチ"
+
+#: usr/local/www/license.php:110 usr/local/www/license.php:110
+msgid ""
+"Filter rule patches (ordering, block/pass, disabled); better status page;"
+msgstr "「フィルタルールのパッチ(オーダリング、ブロック/パス、無効) 、優れたステータスページ;"
+
+#: usr/local/www/license.php:112 usr/local/www/license.php:112
+msgid "webConfigurator assign network ports page "
+msgstr "ネットワークポートのページを割り当てwebConfigurator"
+
+#: usr/local/www/license.php:115 usr/local/www/license.php:115
+msgid "enhanced "
+msgstr "強化された"
+
+#: usr/local/www/license.php:115 usr/local/www/license.php:115
+msgid "execute command"
+msgstr "コマンドを実行する"
+
+#: usr/local/www/license.php:116 usr/local/www/license.php:116
+msgid " page"
+msgstr "ページ"
+
+#: usr/local/www/license.php:119 usr/local/www/license.php:119
+msgid "DHCP client: send hostname patch"
+msgstr "DHCPクライアント:ホスト名パッチを送る"
+
+#: usr/local/www/license.php:122 usr/local/www/license.php:122
+msgid "DHCP lease list page"
+msgstr "DHCPリースリストページ"
+
+#: usr/local/www/license.php:125 usr/local/www/license.php:125
+msgid "type filter rules; dial-on-demand"
+msgstr "フィルタルールを入力し、ダイヤルオンデマンド"
+
+#: usr/local/www/license.php:128 usr/local/www/license.php:128
+msgid "SVG-based traffic grapher"
+msgstr "SVGベースのトラフィックグラファ"
+
+#: usr/local/www/license.php:131 usr/local/www/license.php:131
+msgid "per-user IP address assignments for PPTP VPN"
+msgstr "PPTP VPN用のユーザごとのIPアドレスの割り当て"
+
+#: usr/local/www/license.php:134 usr/local/www/license.php:134
+msgid "NAT on optional interfaces"
+msgstr "オプションのインターフェイス上のNAT"
+
+#: usr/local/www/license.php:137 usr/local/www/license.php:137
+msgid "captive portal: pass-through MAC/IP addresses, RADIUS authentication"
+msgstr "キャプティブポータル:パススルーのMAC / IPアドレス、 RADIUS認証"
+
+#: usr/local/www/license.php:137 usr/local/www/license.php:137
+msgid "accounting;"
+msgstr "会計;"
+
+#: usr/local/www/license.php:138 usr/local/www/license.php:138
+msgid "HTTP server concurrency limit"
+msgstr "HTTPサーバーの同時実行の制限"
+
+#: usr/local/www/license.php:141 usr/local/www/license.php:141
+msgid "traffic shaper TOS matching; magic shaper; DHCP deny unknown clients;"
+msgstr "トラフィックシェーパのToSマッチング、マジックシェイパー、 DHCPが未知のクライアントを否定;"
+
+#: usr/local/www/license.php:142 usr/local/www/license.php:142
+msgid "IPsec user FQDNs; DHCP relay"
+msgstr "IPsecのユーザーのFQDN 、 DHCPリレー"
+
+#: usr/local/www/license.php:145 usr/local/www/license.php:145
+msgid "IDE hard disk standby"
+msgstr "IDEハードディスクのスタンバイ"
+
+#: usr/local/www/license.php:148 usr/local/www/license.php:148
+msgid "CPU/memory usage display"
+msgstr "CPU /メモリ使用量表示"
+
+#: usr/local/www/license.php:151 usr/local/www/license.php:151
+msgid "OpenVPN support"
+msgstr "OpenVPNのサポート"
+
+#: usr/local/www/license.php:153 usr/local/www/license.php:153
+msgid "is based upon/includes various free software packages, listed below."
+msgstr "/下記の様々な無料のソフトウェアパッケージが含まれて基づいている。"
+
+#: usr/local/www/license.php:155 usr/local/www/license.php:155
+#, php-format
+msgid ""
+"The author of %s would like to thank the authors of these software packages "
+"for their efforts"
+msgstr "彼らの努力は、「 %sの著者はこれらのソフトウェアパッケージの作者に感謝したいと思います」"
+
+#: usr/local/www/license.php:158 usr/local/www/license.php:161
+#: usr/local/www/license.php:164 usr/local/www/license.php:168
+#: usr/local/www/license.php:174 usr/local/www/license.php:178
+#: usr/local/www/license.php:181 usr/local/www/license.php:184
+#: usr/local/www/license.php:187 usr/local/www/license.php:191
+#: usr/local/www/license.php:192 usr/local/www/license.php:194
+#: usr/local/www/license.php:200 usr/local/www/license.php:201
+#: usr/local/www/license.php:204 usr/local/www/license.php:211
+#: usr/local/www/license.php:169 usr/local/www/license.php:158
+#: usr/local/www/license.php:161 usr/local/www/license.php:164
+#: usr/local/www/license.php:168 usr/local/www/license.php:169
+#: usr/local/www/license.php:174 usr/local/www/license.php:178
+#: usr/local/www/license.php:181 usr/local/www/license.php:184
+#: usr/local/www/license.php:187 usr/local/www/license.php:191
+#: usr/local/www/license.php:192 usr/local/www/license.php:194
+#: usr/local/www/license.php:200 usr/local/www/license.php:201
+#: usr/local/www/license.php:204 usr/local/www/license.php:211
+msgid "Copyright"
+msgstr "著作権"
+
+#: usr/local/www/license.php:158
+msgid " 1994-2003 FreeBSD, Inc. All rights reserved"
+msgstr "1994-2003のFreeBSD 、株式会社すべての権利を保有"
+
+#: usr/local/www/license.php:160 usr/local/www/license.php:160
+msgid "This product includes PHP, freely available from"
+msgstr "本製品は、から無料で入手PHPを含み"
+
+#: usr/local/www/license.php:161
+msgid "1999 - 2003 The PHP Group. All rights reserved"
+msgstr "1999 - 2003ザ· PHPのグループ。無断複写·転載を禁じます"
+
+#: usr/local/www/license.php:163 usr/local/www/license.php:163
+msgid "LightTPD"
+msgstr "lighttpdの"
+
+#: usr/local/www/license.php:164
+msgid " 2004 by Jan Kneschke "
+msgstr "2004ヤンKneschkeによる"
+
+#: usr/local/www/license.php:165 usr/local/www/license.php:175
+#: usr/local/www/license.php:165 usr/local/www/license.php:175
+msgid "All rights reserved."
+msgstr "無断複写·転載を禁じます。"
+
+#: usr/local/www/license.php:167 usr/local/www/license.php:167
+msgid "ISC DHCP server "
+msgstr "ISC DHCPサーバー"
+
+#: usr/local/www/license.php:168
+msgid "1996-2003 Internet Software Consortium. All rights reserved."
+msgstr "1996-2003 Internet Software Consortiumの。無断複写·転載を禁じます。"
+
+#: usr/local/www/license.php:173 usr/local/www/license.php:173
+msgid "MPD - Multi-link PPP daemon for FreeBSD"
+msgstr "MPD - FreeBSD用のマルチリンクPPPデーモン"
+
+#: usr/local/www/license.php:177 usr/local/www/license.php:177
+msgid "Circular log support for FreeBSD syslogd "
+msgstr "FreeBSDのsyslogdのための循環ログのサポート"
+
+#: usr/local/www/license.php:180 usr/local/www/license.php:180
+msgid "Dnsmasq - a DNS forwarder for NAT firewalls"
+msgstr "DNSMASQ - NATファイアウォールのDNSフォワーダ"
+
+#: usr/local/www/license.php:183 usr/local/www/license.php:183
+msgid "Racoon"
+msgstr "ラクーン"
+
+#: usr/local/www/license.php:184 usr/local/www/license.php:184
+msgid "1995-2002 WIDE Project. All rights reserved."
+msgstr "1995-2002 WIDEプロジェクト。無断複写·転載を禁じます。"
+
+#: usr/local/www/license.php:186 usr/local/www/license.php:186
+msgid "msntp"
+msgstr "msntp"
+
+#: usr/local/www/license.php:187 usr/local/www/license.php:187
+msgid ""
+" 1996, 1997, 2000 N.M. Maclaren, University of Cambridge. All rights "
+"reserved."
+msgstr "「 1996年、 1997年、 2000年メキシコマクラーレン、ケンブリッジ大学。すべての著作権は、 「予約。"
+
+#: usr/local/www/license.php:190 usr/local/www/license.php:190
+msgid "UCD-SNMP"
+msgstr "UCD -SNMP"
+
+#: usr/local/www/license.php:191 usr/local/www/license.php:191
+msgid "1989, 1991, 1992 by Carnegie Mellon University."
+msgstr "1989 、 1991 、 1992カーネギーメロン大学による。"
+
+#: usr/local/www/license.php:192 usr/local/www/license.php:192
+msgid ""
+"1996, 1998-2000 The Regents of the University of California. All rights "
+"reserved"
+msgstr "「 1996年、カリフォルニア大学の1998年から2000年ジェンツ。すべての権利を「予約"
+
+#: usr/local/www/license.php:194 usr/local/www/license.php:194
+msgid "2001-2002, Network Associates Technology, Inc. All rights reserved."
+msgstr "2001-2002 、ネットワークアソシエイツテクノロジー株式会社すべての版権を保有します。"
+
+#: usr/local/www/license.php:196 usr/local/www/license.php:196
+msgid "Portions of this code are copyright"
+msgstr "このコードの一部は、著作権である"
+
+#: usr/local/www/license.php:196 usr/local/www/license.php:196
+msgid "2001-2002, Cambridge Broadband Ltd. All rights reserved."
+msgstr "2001-2002 、ケンブリッジ·ブロードバンド(株)すべての版権を保有します。"
+
+#: usr/local/www/license.php:199 usr/local/www/license.php:199
+msgid "choparp"
+msgstr "choparp"
+
+#: usr/local/www/license.php:203 usr/local/www/license.php:203
+msgid "BPALogin"
+msgstr "BPALogin"
+
+#: usr/local/www/license.php:203 usr/local/www/license.php:203
+msgid "lightweight portable BIDS2 login client"
+msgstr "軽量のポータブルBIDS2のログインクライアント"
+
+#: usr/local/www/license.php:204 usr/local/www/license.php:204
+msgid " 2001-3 Shane Hyde, and others."
+msgstr "2001-3シェーンハイドなどがあります。"
+
+#: usr/local/www/license.php:206 usr/local/www/license.php:206
+msgid "php-radius"
+msgstr "PHP半径"
+
+#: usr/local/www/license.php:207 usr/local/www/license.php:207
+msgid "Copyright 2000, 2001, 2002 by Edwin Groothuis. All rights reserved."
+msgstr "エドウィンGroothuis著作権2000 、 2001 、 2002 。無断複写·転載を禁じます。"
+
+#: usr/local/www/license.php:208 usr/local/www/license.php:208
+msgid "This product includes software developed by Edwin Groothuis."
+msgstr "この製品は、エドウィンGroothuisが開発したソフトウェアが含まれています。"
+
+#: usr/local/www/license.php:210 usr/local/www/license.php:210
+msgid "wol"
+msgstr "WOL"
+
+#: usr/local/www/license.php:214 usr/local/www/license.php:214
+msgid "Copyright (C) 2002-2005 OpenVPN Solutions LLC "
+msgstr "COPYRIGHT(C ) 2002から2005 OpenVPNのソリューションLLC"
+
+#: usr/local/www/load_balancer_pool.php:72
+#: usr/local/www/load_balancer_relay_protocol.php:71
+#: usr/local/www/load_balancer_relay_protocol.php:71
+#: usr/local/www/load_balancer_pool.php:72
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"virtual server."
+msgstr "仮想サーバー」とは、まだ少なくとも1によって参照されているため、このエントリは削除できません」 。"
+
+#: usr/local/www/load_balancer_pool.php:111
+#: usr/local/www/status_lb_pool.php:113
+#: usr/local/www/load_balancer_pool.php:109
+#: usr/local/www/status_lb_pool.php:113
+#: usr/local/www/load_balancer_pool.php:109
+#, php-format
+msgid ""
+"The load balancer configuration has been changed%sYou must apply the changes "
+"in order for them to take effect."
+msgstr "それらを有効にするために「ロードバランサの設定はchanged%sYouが変更を適用する必要がありました」 。"
+
+#: usr/local/www/load_balancer_pool.php:133
+#: usr/local/www/status_lb_pool.php:132 usr/local/www/status_lb_vs.php:79
+#: usr/local/www/system_authservers.php:424
+#: usr/local/www/system_groupmanager.php:243
+#: usr/local/www/system_groupmanager_addprivs.php:171
+#: usr/local/www/system_usermanager.php:443
+#: usr/local/www/system_usermanager_addprivs.php:170
+#: usr/local/www/system_usermanager_settings.php:116
+#: usr/local/www/system_usermanager.php:441
+#: usr/local/www/system_groupmanager_addprivs.php:169
+#: usr/local/www/load_balancer_pool.php:134
+#: usr/local/www/load_balancer_pool.php:132
+#: usr/local/www/system_authservers.php:429
+#: usr/local/www/system_authservers.php:436
+#: usr/local/www/system_usermanager_settings.php:118
+#: usr/local/www/system_groupmanager.php:243
+#: usr/local/www/system_usermanager_addprivs.php:170
+#: usr/local/www/status_lb_pool.php:132
+#: usr/local/www/load_balancer_pool.php:132
+#: usr/local/www/system_authservers.php:436
+#: usr/local/www/system_groupmanager_addprivs.php:169
+#: usr/local/www/system_usermanager_settings.php:118
+#: usr/local/www/system_usermanager.php:441 usr/local/www/status_lb_vs.php:79
+msgid "Servers"
+msgstr "サーバ"
+
+#: usr/local/www/load_balancer_pool.php:135
+#: usr/local/www/load_balancer_monitor.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:223
+#: usr/local/www/status_gateways.php:74 usr/local/www/status_lb_pool.php:133
+#: usr/local/www/load_balancer_pool_edit.php:240
+#: usr/local/www/load_balancer_pool.php:136
+#: usr/local/www/status_gateways.php:75
+#: usr/local/www/load_balancer_pool_edit.php:238
+#: usr/local/www/load_balancer_pool.php:134
+#: usr/local/www/status_lb_pool.php:133
+#: usr/local/www/load_balancer_pool.php:134
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/load_balancer_monitor.php:88
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:238
+#: usr/local/www/status_gateways.php:75
+msgid "Monitor"
+msgstr "モニター"
+
+#: usr/local/www/load_balancer_pool.php:149
+#: usr/local/www/load_balancer_pool.php:150
+#: usr/local/www/load_balancer_pool.php:148
+#: usr/local/www/load_balancer_pool.php:148
+#, php-format
+msgid ""
+"The Load Balancer in %s 2.0 is for server load balancing, not Multi-WAN. For "
+"load balancing or failover for multiple WANs, use "
+msgstr "「 %s 2.0のロードバランサは、サーバーの負荷分散のためであり、ではない複数WAN 。は、「ロード·バランシングやフェイルオーバー、複数のWANため、使用"
+
+#: usr/local/www/load_balancer_pool.php:150
+#: usr/local/www/status_gateway_groups.php:48
+#: usr/local/www/status_gateway_groups.php:52
+#: usr/local/www/status_gateways.php:63
+#: usr/local/www/system_gateway_groups.php:52
+#: usr/local/www/system_gateway_groups.php:88
+#: usr/local/www/status_gateway_groups.php:65
+#: usr/local/www/load_balancer_pool.php:151
+#: usr/local/www/system_gateway_groups.php:89
+#: usr/local/www/status_gateways.php:64
+#: usr/local/www/status_gateway_groups.php:66
+#: usr/local/www/load_balancer_pool.php:149
+#: usr/local/www/system_gateway_groups.php:53
+#: usr/local/www/system_gateway_groups.php:98
+#: usr/local/www/load_balancer_pool.php:149
+#: usr/local/www/status_gateway_groups.php:48
+#: usr/local/www/status_gateway_groups.php:52
+#: usr/local/www/status_gateway_groups.php:66
+#: usr/local/www/status_gateways.php:64
+#: usr/local/www/system_gateway_groups.php:53
+#: usr/local/www/system_gateway_groups.php:98
+msgid "Gateway Groups"
+msgstr "ゲートウェイグループ"
+
+#: usr/local/www/pkg.php:358 usr/local/www/pkg.php:456
+#: usr/local/www/pkg.php:456
+msgid "Do you really want to delete this item?"
+msgstr "あなたは本当に、このアイテムを削除しますか?"
+
+#: usr/local/www/status_wireless.php:83 usr/local/www/status_wireless.php:84
+#: usr/local/www/status_wireless.php:84
+msgid ""
+"Rescan has been initiated in the background. Refresh this page in 10 seconds "
+"to see the results."
+msgstr "「再スキャンはバックグラウンドで開始された。 10秒でこのページを更新し、「結果を確認する。"
+
+#: usr/local/www/status_wireless.php:97 usr/local/www/status_wireless.php:93
+#: usr/local/www/status_wireless.php:94 usr/local/www/status_wireless.php:94
+msgid "Nearby access points or ad-hoc peers"
+msgstr "近くのアクセスポイントやアドホックピア"
+
+#: usr/local/www/status_wireless.php:143 usr/local/www/status_wireless.php:140
+#: usr/local/www/status_wireless.php:141 usr/local/www/status_wireless.php:141
+msgid "Associated or ad-hoc peers"
+msgstr "関連するか、またはアドホックピア"
+
+#: usr/local/www/system.php:118 usr/local/www/system.php:119
+#: usr/local/www/system.php:112 usr/local/www/system.php:112
+msgid "The hostname may only contain the characters a-z, 0-9 and '-'."
+msgstr "' -'ホスト名は0-9と、 AZの文字を含めることができます。"
+
+#: usr/local/www/system.php:121 usr/local/www/system.php:122
+#: usr/local/www/system.php:115 usr/local/www/system.php:115
+msgid "The domain may only contain the characters a-z, 0-9, '-' and '.'."
+msgstr "と' -'ドメインは、 0〜9、A〜Zの文字を含むことができる'。' 。"
+
+#: usr/local/www/system.php:131
+msgid "'."
+msgstr "' 。"
+
+#: usr/local/www/system.php:137 usr/local/www/system.php:143
+#: usr/local/www/system.php:136 usr/local/www/system.php:136
+msgid "A valid TCP/IP port must be specified for the webConfigurator port."
+msgstr "有効なTCP / IPポートはwebConfiguratorポートを指定する必要があります。"
+
+#: usr/local/www/system.php:148 usr/local/www/system.php:154
+#: usr/local/www/system.php:147 usr/local/www/system.php:147
+#, php-format
+msgid ""
+"You can not assign a gateway to DNS '%s' server which is on a directly "
+"connected network."
+msgstr "接続されたネットワーク」は、直接上にあり、DNS' %s'サーバーへのゲートウェイを割り当てることはできません」 。"
+
+#: usr/local/www/system.php:157 usr/local/www/system.php:163
+#: usr/local/www/system.php:156 usr/local/www/system.php:156
+msgid ""
+"The time update interval must be either 0 (disabled) or between 6 and 1440."
+msgstr "「時間の更新間隔は、 0 (無効)または6と1440の間でなければなりません。"
+
+#: usr/local/www/system.php:161 usr/local/www/system.php:167
+#: usr/local/www/system.php:160 usr/local/www/system.php:160
+msgid ""
+"A NTP Time Server name may only contain the characters a-z, 0-9, '-' and '.'."
+msgstr "と' -' "NTPタイムサーバ名は、 0〜9、A〜Zの文字を含むことができる'。' 。"
+
+#: usr/local/www/system.php:231 usr/local/www/fbegin.inc:85
+#: usr/local/www/fbegin.inc:101 usr/local/www/system.php:242
+#: usr/local/www/fbegin.inc:110 usr/local/www/system.php:235
+#: usr/local/www/fbegin.inc:102 usr/local/www/system.php:235
+#: usr/local/www/fbegin.inc:102
+msgid "General Setup"
+msgstr "一般的なセットアップ"
+
+#: usr/local/www/system.php:258 usr/local/www/system.php:269
+#: usr/local/www/system.php:262 usr/local/www/system.php:262
+msgid "Name of the firewall host, without domain part"
+msgstr "ドメイン部分なしで、ファイアウォールのホストの名前"
+
+#: usr/local/www/system.php:269 usr/local/www/system.php:280
+#: usr/local/www/system.php:273 usr/local/www/system.php:273
+msgid ""
+"Do not use 'local' as a domain name. It will cause local hosts running mDNS "
+"(avahi, bonjour, etc.) to be unable to resolve local hosts not running mDNS."
+msgstr "「ドメイン名として「ローカル」は使用しないでください。これは、 mDNSのを実行しているローカルホストの原因となります」のmDNSを実行していないローカルホストを解決することができないように(など、ボンジュール、 avahiの) 。"
+
+#: usr/local/www/system.php:271 usr/local/www/system.php:282
+#: usr/local/www/system.php:275 usr/local/www/system.php:275
+msgid "mycorp.com, home, office, private, etc."
+msgstr "mycorp.com 、家庭、オフィス、プライベートなど"
+
+#: usr/local/www/system.php:276 usr/local/www/services_dhcp.php:647
+#: usr/local/www/vpn_pppoe_edit.php:451 usr/local/www/services_dhcpv6.php:590
+#: usr/local/www/services_dhcp.php:660 usr/local/www/system.php:287
+#: usr/local/www/services_dhcpv6.php:667 usr/local/www/vpn_pppoe_edit.php:452
+#: usr/local/www/services_router_advertisements.php:372
+#: usr/local/www/services_dhcp.php:836 usr/local/www/system.php:280
+#: usr/local/www/services_dhcpv6.php:598
+#: usr/local/www/services_dhcp_edit.php:402
+#: usr/local/www/vpn_pppoe_edit.php:455 usr/local/www/services_dhcp.php:850
+#: usr/local/www/services_dhcpv6.php:615
+#: usr/local/www/services_router_advertisements.php:367
+#: usr/local/www/services_dhcp.php:870
+#: usr/local/www/services_router_advertisements.php:367
+#: usr/local/www/system.php:280 usr/local/www/services_dhcp_edit.php:402
+#: usr/local/www/vpn_pppoe_edit.php:455 usr/local/www/services_dhcp.php:870
+#: usr/local/www/services_dhcpv6.php:615
+msgid "DNS servers"
+msgstr "DNSサーバ"
+
+#: usr/local/www/system.php:281 usr/local/www/system.php:292
+#: usr/local/www/system.php:285 usr/local/www/system.php:285
+msgid "DNS Server"
+msgstr "DNSサーバ"
+
+#: usr/local/www/system.php:283 usr/local/www/system.php:294
+#: usr/local/www/system.php:287 usr/local/www/system.php:287
+msgid "Use gateway"
+msgstr "ゲートウェイを使用"
+
+#: usr/local/www/system.php:331 usr/local/www/system.php:342
+#: usr/local/www/system.php:335 usr/local/www/system.php:334
+#: usr/local/www/system.php:334
+msgid ""
+"Enter IP addresses to by used by the system for DNS resolution.These are "
+"also used for the DHCP service, DNS forwarder and for PPTP VPN clients."
+msgstr "「DNS resolution.Theseためのシステムが使用することで、IPアドレスを入力してはしている」また、 DHCPサービス、 DNSフォワーダのためにとPPTPのVPNクライアントで使用する。"
+
+#: usr/local/www/system.php:336 usr/local/www/system.php:347
+#: usr/local/www/system.php:340 usr/local/www/system.php:339
+#: usr/local/www/system.php:339
+msgid ""
+"In addition, optionally select the gateway for each DNS server. When using "
+"multiple WAN connections there should be at least one unique DNS server per "
+"gateway."
+msgstr "「さらに、必要に応じて、各DNSサーバのゲートウェイを選択します。使用する場合は、「ゲートウェイ」ごとに少なくとも1つの固有のDNSサーバがあるべき複数のWAN接続を。"
+
+#: usr/local/www/system.php:343 usr/local/www/system.php:354
+#: usr/local/www/system.php:347 usr/local/www/system.php:346
+#: usr/local/www/system.php:346
+msgid "Allow DNS server list to be overridden by DHCP/PPP on WAN"
+msgstr "DNSサーバーのリストは、WAN上でDHCP / PPPによって無効にできるようにする"
+
+#: usr/local/www/system.php:346 usr/local/www/system.php:357
+#: usr/local/www/system.php:350 usr/local/www/system.php:349
+#: usr/local/www/system.php:349
+#, php-format
+msgid ""
+"If this option is set, %s will use DNS servers assigned by a DHCP/PPP server "
+"on WAN for its own purposes (including the DNS forwarder). However, they "
+"will not be assigned to DHCP and PPTP VPN clients."
+msgstr "( DNSフォワーダを含む)独自の目的のために、WAN上の「このオプションが設定されている場合は、 %sは、DHCP / PPPサーバによって割り当てられたDNSサーバーを使用します」 。しかし、彼らは "DHCPおよびPPTP VPNクライアントに割り当てることはできません。"
+
+#: usr/local/www/system.php:355 usr/local/www/system.php:366
+#: usr/local/www/system.php:359 usr/local/www/system.php:358
+#: usr/local/www/system.php:358
+msgid "Do not use the DNS Forwarder as a DNS server for the firewall"
+msgstr "ファイアウォールのDNSサーバーとしてのDNSフォワーダを使用しないでください"
+
+#: usr/local/www/system.php:358 usr/local/www/system.php:369
+#: usr/local/www/system.php:362 usr/local/www/system.php:361
+#: usr/local/www/system.php:361
+msgid ""
+"By default localhost (127.0.0.1) will be used as the first DNS server where "
+"the DNS forwarder is enabled, so system can use the DNS forwarder to perform "
+"lookups. Checking this box omits localhost from the list of DNS servers."
+msgstr "DNSフォワーダが有効になっている「既定のローカルホストでは( 127.0.0.1 )最初のDNSサーバーとして使用される"ため、システムは、このボックスは、DNSサーバーのリストから、ローカルホストを省略して確認する。 「ルックアップを実行するためにDNSフォワーダを使用することができます。"
+
+#: usr/local/www/system.php:365 usr/local/www/system.php:376
+#: usr/local/www/system.php:369 usr/local/www/system.php:367
+#: usr/local/www/system.php:367
+msgid "Time zone"
+msgstr "時間帯"
+
+#: usr/local/www/system.php:377 usr/local/www/system.php:388
+#: usr/local/www/system.php:381 usr/local/www/system.php:379
+#: usr/local/www/system.php:379
+msgid "Select the location closest to you"
+msgstr "あなたに最も近い場所を選択します"
+
+#: usr/local/www/system.php:395 usr/local/www/system.php:406
+#: usr/local/www/system.php:399 usr/local/www/system.php:397
+#: usr/local/www/system.php:397
+msgid "NTP time server"
+msgstr "NTPタイムサーバ"
+
+#: usr/local/www/system.php:400 usr/local/www/system.php:411
+#: usr/local/www/system.php:404 usr/local/www/system.php:402
+#: usr/local/www/system.php:402
+msgid ""
+"Use a space to separate multiple hosts (only one required). Remember to set "
+"up at least one DNS server if you enter a host name here!"
+msgstr "「複数のホスト(必須のみ1 )をスペースで区切ります。設定することを忘れないでください"あなたはここにホスト名を入力すると、少なくとも1つのDNSサーバーをバックアップ !"
+
+#: usr/local/www/system.php:411 usr/local/www/system.php:440
+#: usr/local/www/system.php:433 usr/local/www/system.php:431
+#: usr/local/www/system.php:431
+msgid "Theme"
+msgstr "テーマ"
+
+#: usr/local/www/system.php:435 usr/local/www/system.php:464
+#: usr/local/www/system.php:457 usr/local/www/system.php:455
+#: usr/local/www/system.php:455
+msgid "This will change the look and feel of"
+msgstr "これはデザインを変更するなどの感じになります"
+
+#: usr/local/www/interfaces_vlan.php:65 usr/local/www/interfaces_vlan.php:69
+#: usr/local/www/interfaces_vlan.php:69
+msgid ""
+"This VLAN cannot be deleted because it is still being used as an interface."
+msgstr "それでもインターフェイスとして使用されているため、 「このVLANは削除できません。"
+
+#: usr/local/www/interfaces_vlan.php:78
+#: usr/local/www/interfaces_vlan_edit.php:139
+#: usr/local/www/interfaces_vlan_edit.php:142
+#: usr/local/www/interfaces_vlan.php:84
+#: usr/local/www/interfaces_vlan_edit.php:142
+#: usr/local/www/interfaces_vlan.php:84
+msgid "VLAN"
+msgstr "VLAN"
+
+#: usr/local/www/interfaces_vlan.php:109
+#: usr/local/www/interfaces_vlan_edit.php:75
+#: usr/local/www/interfaces_vlan.php:110 usr/local/www/interfaces_vlan.php:116
+#: usr/local/www/interfaces_vlan_edit.php:75
+#: usr/local/www/interfaces_vlan.php:116
+msgid "VLAN tag"
+msgstr "VLANタグ"
+
+#: usr/local/www/interfaces_vlan.php:125 usr/local/www/interfaces_vlan.php:126
+#: usr/local/www/interfaces_vlan.php:132 usr/local/www/interfaces_vlan.php:132
+msgid "Do you really want to delete this VLAN?"
+msgstr "あなたは本当にこのVLANを削除しますか?"
+
+#: usr/local/www/interfaces_vlan.php:136 usr/local/www/interfaces_vlan.php:137
+#: usr/local/www/interfaces_vlan.php:143 usr/local/www/interfaces_vlan.php:143
+#, php-format
+msgid ""
+"Not all drivers/NICs support 802.1Q VLAN tagging properly. On cards that do "
+"not explicitly support it, VLAN tagging will still work, but the reduced MTU "
+"may cause problems. See the %s handbook for information on supported cards."
+msgstr "明示的にサポートしていない"すべてのドライバ/ NICが802.1Q VLANがないカードでは。適切にタグ付けをサポートしない」 、 VLANタギングはまだ動作しますが、縮小MTUは「問題が発生することがあります。サポートされているカードについては、 %sハンドブックを参照してください。"
+
+#: usr/local/www/interfaces_vlan_edit.php:80
+#: usr/local/www/interfaces_vlan_edit.php:80
+msgid "The VLAN tag must be an integer between 1 and 4094."
+msgstr "VLANタグは、 1 〜4094の整数でなければなりません。"
+
+#: usr/local/www/interfaces_vlan_edit.php:88
+#: usr/local/www/interfaces_vlan_edit.php:91
+#: usr/local/www/interfaces_vlan_edit.php:91
+#, php-format
+msgid "A VLAN with the tag %s is already defined on this interface."
+msgstr "タグ%sでVLANがすでにこのインターフェイスで定義されています。"
+
+#: usr/local/www/interfaces_vlan_edit.php:95
+#: usr/local/www/interfaces_vlan_edit.php:98
+#: usr/local/www/interfaces_vlan_edit.php:98
+msgid "A QinQ VLAN exists with this tag please remove it to use this tag with."
+msgstr "QinQのVLANは、このタグに存在し、それがこのタグを使用することを削除してください。"
+
+#: usr/local/www/interfaces_vlan_edit.php:150
+#: usr/local/www/interfaces_vlan_edit.php:151
+#: usr/local/www/interfaces_vlan_edit.php:154
+#: usr/local/www/interfaces_vlan_edit.php:154
+msgid "VLAN configuration"
+msgstr "VLANの設定"
+
+#: usr/local/www/interfaces_vlan_edit.php:169
+#: usr/local/www/interfaces_vlan_edit.php:170
+#: usr/local/www/interfaces_vlan_edit.php:173
+#: usr/local/www/interfaces_vlan_edit.php:173
+msgid "Only VLAN capable interfaces will be shown."
+msgstr "VLANのみが可能なインターフェースが表示されます。"
+
+#: usr/local/www/interfaces_vlan_edit.php:172
+#: usr/local/www/interfaces_vlan_edit.php:173
+#: usr/local/www/interfaces_vlan_edit.php:176
+#: usr/local/www/interfaces_vlan_edit.php:176
+msgid "VLAN tag "
+msgstr "VLANタグ"
+
+#: usr/local/www/interfaces_vlan_edit.php:176
+#: usr/local/www/interfaces_vlan_edit.php:177
+#: usr/local/www/interfaces_vlan_edit.php:180
+#: usr/local/www/interfaces_vlan_edit.php:180
+msgid "802.1Q VLAN tag (between 1 and 4094) "
+msgstr "( 1と4094の間) 802.1Q VLANタグ"
+
+#: usr/local/www/system_firmware.php:82 usr/local/www/system_firmware.php:89
+#: usr/local/www/system_firmware.php:88 usr/local/www/system_firmware.php:88
+msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
+msgstr "アップロードされたファイルは、php.iniのupload_max_filesizeディレクティブの値を超えて"
+
+#: usr/local/www/system_firmware.php:84 usr/local/www/system_firmware.php:91
+#: usr/local/www/system_firmware.php:90 usr/local/www/system_firmware.php:90
+msgid ""
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
+"the HTML form"
+msgstr "HTMLフォーム"アップロードされたファイルで指定されたMAX_FILE_SIZEディレクティブの値を超えて」"
+
+#: usr/local/www/system_firmware.php:86 usr/local/www/system_firmware.php:93
+#: usr/local/www/system_firmware.php:92 usr/local/www/system_firmware.php:92
+msgid "The uploaded file was only partially uploaded"
+msgstr "アップロードされたファイルは、部分的にしかアップロードされました"
+
+#: usr/local/www/system_firmware.php:88 usr/local/www/system_firmware.php:95
+#: usr/local/www/system_firmware.php:94 usr/local/www/system_firmware.php:94
+msgid "No file was uploaded"
+msgstr "ファイルはアップロードされませんでした"
+
+#: usr/local/www/system_firmware.php:90 usr/local/www/system_firmware.php:97
+#: usr/local/www/system_firmware.php:96 usr/local/www/system_firmware.php:96
+msgid "Missing a temporary folder"
+msgstr "一時フォルダが見つかりません"
+
+#: usr/local/www/system_firmware.php:92 usr/local/www/system_firmware.php:99
+#: usr/local/www/system_firmware.php:98 usr/local/www/system_firmware.php:98
+msgid "Failed to write file to disk"
+msgstr "ディスクへのファイルの書き込みに失敗しました"
+
+#: usr/local/www/system_firmware.php:94 usr/local/www/system_firmware.php:101
+#: usr/local/www/system_firmware.php:100 usr/local/www/system_firmware.php:100
+msgid "File upload stopped by extension"
+msgstr "ファイルのアップロードは、拡張子によって停止"
+
+#: usr/local/www/system_firmware.php:96 usr/local/www/system_firmware.php:103
+#: usr/local/www/system_firmware.php:102 usr/local/www/system_firmware.php:102
+msgid "Unknown upload error"
+msgstr "不明のアップロードエラー"
+
+#: usr/local/www/system_firmware.php:102 usr/local/www/system_firmware.php:203
+#: usr/local/www/system_firmware_auto.php:60
+#: usr/local/www/system_firmware_check.php:49
+#: usr/local/www/system_firmware_settings.php:74 usr/local/www/fbegin.inc:84
+#: usr/local/www/fbegin.inc:100 usr/local/www/fbegin.inc:109
+#: usr/local/www/system_firmware.php:109 usr/local/www/system_firmware.php:210
+#: usr/local/www/system_firmware_settings.php:79
+#: usr/local/www/system_firmware.php:108 usr/local/www/fbegin.inc:101
+#: usr/local/www/system_firmware_auto.php:61
+#: usr/local/www/system_firmware.php:108 usr/local/www/system_firmware.php:210
+#: usr/local/www/system_firmware_check.php:49
+#: usr/local/www/system_firmware_settings.php:79
+#: usr/local/www/system_firmware_auto.php:61 usr/local/www/fbegin.inc:101
+msgid "Firmware"
+msgstr "ファームウェア"
+
+#: usr/local/www/system_firmware.php:102 usr/local/www/system_firmware.php:238
+#: usr/local/www/system_firmware_auto.php:79
+#: usr/local/www/system_firmware_check.php:66
+#: usr/local/www/system_firmware_settings.php:110
+#: usr/local/www/system_firmware_restorefullbackup.php:125
+#: usr/local/www/system_firmware.php:109 usr/local/www/system_firmware.php:245
+#: usr/local/www/system_firmware_settings.php:115
+#: usr/local/www/system_firmware.php:108 usr/local/www/system_firmware.php:248
+#: usr/local/www/system_firmware_check.php:64
+#: usr/local/www/system_firmware_settings.php:117
+#: usr/local/www/system_firmware_auto.php:80
+#: usr/local/www/system_firmware.php:108 usr/local/www/system_firmware.php:248
+#: usr/local/www/system_firmware_check.php:64
+#: usr/local/www/system_firmware_settings.php:117
+#: usr/local/www/system_firmware_auto.php:80
+#: usr/local/www/system_firmware_restorefullbackup.php:125
+msgid "Manual Update"
+msgstr "手動更新"
+
+#: usr/local/www/system_firmware.php:107 usr/local/www/system_firmware.php:114
+#: usr/local/www/system_firmware.php:113 usr/local/www/system_firmware.php:113
+msgid ""
+"An upgrade is currently in progress.<p>The firewall will reboot when the "
+"operation is complete."
+msgstr "「アップグレードは現在進行中である。ときu003cPu003eファイアウォールが再起動します」操作が完了した。"
+
+#: usr/local/www/system_firmware.php:135 usr/local/www/system_firmware.php:142
+#: usr/local/www/system_firmware.php:137 usr/local/www/system_firmware.php:137
+msgid "Upgrade"
+msgstr "アップグレード"
+
+#: usr/local/www/system_firmware.php:154 usr/local/www/system_firmware.php:161
+#: usr/local/www/system_firmware.php:156 usr/local/www/system_firmware.php:156
+msgid "The uploaded image file is not for this platform."
+msgstr "アップロードされた画像ファイルは、このプラットフォーム用ではありません。"
+
+#: usr/local/www/system_firmware.php:157 usr/local/www/system_firmware.php:164
+#: usr/local/www/system_firmware.php:159 usr/local/www/system_firmware.php:159
+msgid "Image upload failed (out of memory?)"
+msgstr "画像のアップロードは、 (メモリが不足? )が失敗しました"
+
+#: usr/local/www/system_firmware.php:168
+#: usr/local/www/system_firmware_auto.php:201
+#: usr/local/www/system_firmware.php:175 usr/local/www/system_firmware.php:170
+#: usr/local/www/system_firmware_auto.php:203
+#: usr/local/www/system_firmware_auto.php:199
+#: usr/local/www/system_firmware.php:170
+#: usr/local/www/system_firmware_auto.php:199
+msgid "The digital signature on this image is invalid."
+msgstr "この画像のデジタル署名が無効です。"
+
+#: usr/local/www/system_firmware.php:170
+#: usr/local/www/system_firmware_auto.php:204
+#: usr/local/www/system_firmware.php:177 usr/local/www/system_firmware.php:172
+#: usr/local/www/system_firmware_auto.php:206
+#: usr/local/www/system_firmware_auto.php:202
+#: usr/local/www/system_firmware.php:172
+#: usr/local/www/system_firmware_auto.php:202
+msgid "This image is not digitally signed."
+msgstr "この画像は、デジタル署名されていません。"
+
+#: usr/local/www/system_firmware.php:172
+#: usr/local/www/system_firmware_auto.php:208
+#: usr/local/www/system_firmware.php:179 usr/local/www/system_firmware.php:174
+#: usr/local/www/system_firmware_auto.php:210
+#: usr/local/www/system_firmware_auto.php:206
+#: usr/local/www/system_firmware.php:174
+#: usr/local/www/system_firmware_auto.php:206
+msgid "There has been an error verifying the signature on this image."
+msgstr "この画像に署名を検証エラーが発生しました。"
+
+#: usr/local/www/system_firmware.php:175
+#: usr/local/www/system_firmware_auto.php:223
+#: usr/local/www/system_firmware.php:182 usr/local/www/system_firmware.php:177
+#: usr/local/www/system_firmware_auto.php:225
+#: usr/local/www/system_firmware_auto.php:221
+#: usr/local/www/system_firmware.php:177
+#: usr/local/www/system_firmware_auto.php:221
+msgid "The image file is corrupt."
+msgstr "画像ファイルが壊れています。"
+
+#: usr/local/www/system_firmware.php:188 usr/local/www/system_firmware.php:195
+#: usr/local/www/system_firmware.php:190 usr/local/www/system_firmware.php:190
+msgid ""
+"The firmware is now being updated. The firewall will reboot automatically."
+msgstr "「ファームウェアは現在更新中です。ファイアウォールは自動的に再起動します。"
+
+#: usr/local/www/system_firmware.php:196 usr/local/www/system_firmware.php:203
+#: usr/local/www/system_firmware.php:204 usr/local/www/system_firmware.php:204
+#, php-format
+msgid "Firmware image missing or other error, please try again %s."
+msgstr "ファームウェアイメージ欠落またはその他のエラー、もう一度試してください%s."
+
+#: usr/local/www/system_firmware.php:220 usr/local/www/system_firmware.php:227
+#: usr/local/www/system_firmware.php:230 usr/local/www/system_firmware.php:230
+msgid ""
+"This means that the image you uploaded is not an official/supported image "
+"and may lead to unexpected behavior or security compromises. Only install "
+"images that come from sources that you trust, and make sure that the image "
+"has not been tampered with."
+msgstr "予期しない動作やセキュリティ侵害につながる可能性があり、「これは、アップロードされた画像は、公式/サポートされている画像ではないことを意味します」 。唯一の "あなたが信頼ソースからの画像を、画像があることを確認して「インストール改ざんされていない。"
+
+#: usr/local/www/system_firmware.php:224 usr/local/www/system_firmware.php:231
+#: usr/local/www/system_firmware.php:234 usr/local/www/system_firmware.php:234
+msgid "Do you want to install this image anyway (on your own risk)?"
+msgstr "あなたが(ご自身の責任で)とにかくこのイメージをインストールしますか?を"
+
+#: usr/local/www/system_firmware.php:239
+#: usr/local/www/system_firmware_auto.php:60
+#: usr/local/www/system_firmware_auto.php:80
+#: usr/local/www/system_firmware_check.php:49
+#: usr/local/www/system_firmware_check.php:67
+#: usr/local/www/system_firmware_settings.php:111
+#: usr/local/www/system_firmware_restorefullbackup.php:126
+#: usr/local/www/system_firmware.php:246
+#: usr/local/www/system_firmware_settings.php:116
+#: usr/local/www/system_firmware.php:249
+#: usr/local/www/system_firmware_check.php:65
+#: usr/local/www/system_firmware_settings.php:118
+#: usr/local/www/system_firmware_auto.php:61
+#: usr/local/www/system_firmware_auto.php:81
+#: usr/local/www/system_firmware.php:249
+#: usr/local/www/system_firmware_check.php:49
+#: usr/local/www/system_firmware_check.php:65
+#: usr/local/www/system_firmware_settings.php:118
+#: usr/local/www/system_firmware_auto.php:61
+#: usr/local/www/system_firmware_auto.php:81
+#: usr/local/www/system_firmware_restorefullbackup.php:126
+msgid "Auto Update"
+msgstr "自動更新"
+
+#: usr/local/www/system_firmware.php:240
+#: usr/local/www/system_firmware_auto.php:81
+#: usr/local/www/system_firmware_check.php:68
+#: usr/local/www/system_firmware_settings.php:112
+#: usr/local/www/system_firmware_restorefullbackup.php:127
+#: usr/local/www/system_firmware.php:247
+#: usr/local/www/system_firmware_settings.php:117
+#: usr/local/www/system_firmware.php:250
+#: usr/local/www/system_firmware_check.php:66
+#: usr/local/www/system_firmware_settings.php:119
+#: usr/local/www/system_firmware_auto.php:82
+#: usr/local/www/system_firmware.php:250
+#: usr/local/www/system_firmware_check.php:66
+#: usr/local/www/system_firmware_settings.php:119
+#: usr/local/www/system_firmware_auto.php:82
+#: usr/local/www/system_firmware_restorefullbackup.php:127
+msgid "Updater Settings"
+msgstr "アップデータの設定"
+
+#: usr/local/www/system_firmware.php:242
+#: usr/local/www/system_firmware_auto.php:83
+#: usr/local/www/system_firmware_check.php:70
+#: usr/local/www/system_firmware_settings.php:114
+#: usr/local/www/system_firmware_restorefullbackup.php:129
+#: usr/local/www/system_firmware.php:249
+#: usr/local/www/system_firmware_settings.php:119
+#: usr/local/www/system_firmware.php:252
+#: usr/local/www/system_firmware_check.php:68
+#: usr/local/www/system_firmware_settings.php:121
+#: usr/local/www/system_firmware_auto.php:84
+#: usr/local/www/system_firmware.php:252
+#: usr/local/www/system_firmware_check.php:68
+#: usr/local/www/system_firmware_settings.php:121
+#: usr/local/www/system_firmware_auto.php:84
+#: usr/local/www/system_firmware_restorefullbackup.php:129
+msgid "Restore Full Backup"
+msgstr "フルバックアップを復元"
+
+#: usr/local/www/system_firmware.php:252 usr/local/www/system_firmware.php:259
+#: usr/local/www/system_firmware.php:262 usr/local/www/system_firmware.php:262
+msgid "Invoke"
+msgstr "呼び出す"
+
+#: usr/local/www/system_firmware.php:252 usr/local/www/system_firmware.php:259
+#: usr/local/www/system_firmware.php:262 usr/local/www/system_firmware.php:262
+msgid "Manual Upgrade"
+msgstr "手動アップグレード"
+
+#: usr/local/www/system_firmware.php:259 usr/local/www/system_firmware.php:266
+#: usr/local/www/system_firmware.php:269 usr/local/www/system_firmware.php:269
+msgid "Enable firmware upload"
+msgstr "ファームウェアのアップロードを有効にする"
+
+#: usr/local/www/system_firmware.php:261 usr/local/www/system_firmware.php:268
+#: usr/local/www/system_firmware.php:271 usr/local/www/system_firmware.php:271
+#, php-format
+msgid "Click "Enable firmware upload" to begin."
+msgstr "開始する「ファームウェアのアップロードを有効にする」をクリックします。"
+
+#: usr/local/www/system_firmware.php:264 usr/local/www/system_firmware.php:271
+#: usr/local/www/system_firmware.php:274 usr/local/www/system_firmware.php:274
+msgid "Disable firmware upload"
+msgstr "ファームウェアのアップロードを無効にする"
+
+#: usr/local/www/system_firmware.php:282 usr/local/www/system_firmware.php:289
+#: usr/local/www/system_firmware.php:292 usr/local/www/system_firmware.php:292
+msgid "Please select kernel type"
+msgstr "カーネルの種類を選択してください"
+
+#: usr/local/www/system_firmware.php:284 usr/local/www/system_firmware.php:55
+msgid "Multiprocessor kernel"
+msgstr "マルチプロセッサカーネル"
+
+#: usr/local/www/system_firmware.php:285 usr/local/www/system_firmware.php:56
+msgid "Uniprocessor kernel"
+msgstr "ユニプロセッサカーネル"
+
+#: usr/local/www/system_firmware.php:286 usr/local/www/system_firmware.php:57
+msgid "Embedded kernel"
+msgstr "埋め込まれたカーネル"
+
+#: usr/local/www/system_firmware.php:287 usr/local/www/system_firmware.php:58
+msgid "Developers kernel"
+msgstr "開発者はカーネル"
+
+#: usr/local/www/system_firmware.php:298
+#: usr/local/www/system_firmware_check.php:103
+#: usr/local/www/system_firmware.php:304 usr/local/www/system_firmware.php:303
+#: usr/local/www/system_firmware_check.php:104
+#: usr/local/www/system_firmware_check.php:98
+#: usr/local/www/system_firmware.php:303
+#: usr/local/www/system_firmware_check.php:98
+msgid "Perform full backup prior to upgrade"
+msgstr "前のアップグレードにフルバックアップを実行"
+
+#: usr/local/www/system_firmware.php:300 usr/local/www/system_firmware.php:306
+#: usr/local/www/system_firmware.php:306
+msgid "Upgrade firmware"
+msgstr "ファームウェアをアップグレード"
+
+#: usr/local/www/system_firmware.php:301 usr/local/www/system_firmware.php:307
+#: usr/local/www/system_firmware.php:307
+msgid "Click "Upgrade firmware" to start the upgrade process."
+msgstr "アップグレードプロセスを開始するために「ファームウェアのアップグレード」をクリックしてください。"
+
+#: usr/local/www/system_firmware.php:303 usr/local/www/system_firmware.php:309
+#: usr/local/www/system_firmware.php:309
+msgid "You must reboot the system before you can upgrade the firmware."
+msgstr "ファームウェアをアップグレードする前に、システムを再起動する必要があります。"
+
+#: usr/local/www/system_firmware.php:316 usr/local/www/system_firmware.php:322
+#: usr/local/www/system_firmware.php:320 usr/local/www/system_firmware.php:320
+msgid "Warning:"
+msgstr "警告:"
+
+#: usr/local/www/system_firmware.php:319 usr/local/www/system_firmware.php:325
+#: usr/local/www/system_firmware.php:323 usr/local/www/system_firmware.php:323
+msgid ""
+"DO NOT abort the firmware upgrade once it has started. The firewall will "
+"reboot automatically after storing the new firmware. The configuration will "
+"be maintained."
+msgstr "「それが起動した後は、ファームウェアのアップグレードを中断しないでください。ファイアウォールがします"新しいファームウェアを保存した後、自動的に再起動します。構成は、 「維持される。"
+
+#: usr/local/www/system_firmware_auto.php:115
+#: usr/local/www/system_firmware_auto.php:113
+#: usr/local/www/system_firmware_auto.php:113
+msgid "Beginning firmware upgrade"
+msgstr "ファームウェアのアップグレードを開始"
+
+#: usr/local/www/system_firmware_auto.php:133
+#: usr/local/www/system_firmware_auto.php:135
+#: usr/local/www/system_firmware_auto.php:131
+#: usr/local/www/system_firmware_auto.php:131
+msgid "Downloading current version information"
+msgstr "現在のバージョン情報をダウンロードする"
+
+#: usr/local/www/system_firmware_auto.php:148
+#: usr/local/www/system_firmware_auto.php:157
+#: usr/local/www/system_firmware_check.php:141
+#: usr/local/www/system_firmware_check.php:143
+#: usr/local/www/system_firmware_auto.php:150
+#: usr/local/www/system_firmware_auto.php:159
+#: usr/local/www/system_firmware_check.php:135
+#: usr/local/www/system_firmware_auto.php:146
+#: usr/local/www/system_firmware_auto.php:155
+#: usr/local/www/system_firmware_check.php:135
+#: usr/local/www/system_firmware_auto.php:146
+#: usr/local/www/system_firmware_auto.php:155
+msgid "Unable to check for updates."
+msgstr "更新を確認することができません。"
+
+#: usr/local/www/system_firmware_auto.php:162
+#: usr/local/www/system_firmware_auto.php:164
+#: usr/local/www/system_firmware_auto.php:160
+#: usr/local/www/system_firmware_auto.php:160
+msgid "Downloading updates"
+msgstr "更新をダウンロードする"
+
+#: usr/local/www/system_firmware_auto.php:172
+#: usr/local/www/system_firmware_auto.php:174
+#: usr/local/www/system_firmware_auto.php:170
+#: usr/local/www/system_firmware_auto.php:170
+msgid "download complete."
+msgstr "完全なダウンロードします。"
+
+#: usr/local/www/system_firmware_auto.php:174
+#: usr/local/www/system_firmware_check.php:159
+#: usr/local/www/system_firmware_check.php:161
+#: usr/local/www/system_firmware_auto.php:176
+#: usr/local/www/system_firmware_check.php:153
+#: usr/local/www/system_firmware_auto.php:172
+#: usr/local/www/system_firmware_check.php:153
+#: usr/local/www/system_firmware_auto.php:172
+msgid "You are on the latest version."
+msgstr "最新のバージョンにあります。"
+
+#: usr/local/www/system_firmware_auto.php:214
+#: usr/local/www/system_firmware_auto.php:216
+#: usr/local/www/system_firmware_auto.php:212
+#: usr/local/www/system_firmware_auto.php:212
+msgid ""
+"Update cannot continue. You can disable this check on the Updater Settings "
+"tab."
+msgstr "「アップデートを続行できません。あなたはアップデータ設定では、このチェックを無効にすることができます」タブをクリックします。"
+
+#: usr/local/www/system_firmware_auto.php:219
+#: usr/local/www/system_firmware_auto.php:221
+#: usr/local/www/system_firmware_auto.php:217
+#: usr/local/www/system_firmware_auto.php:217
+msgid ""
+"Upgrade Image does not contain a signature but the system has been "
+"configured to allow unsigned images. One moment please..."
+msgstr "「アップグレードイメージの署名が含まれていませんが、システムがされている「未署名のイメージを許可するように設定。しばらくお待ちください..."
+
+#: usr/local/www/system_firmware_auto.php:224
+#: usr/local/www/system_firmware_auto.php:226
+#: usr/local/www/system_firmware_auto.php:222
+#: usr/local/www/system_firmware_auto.php:222
+msgid "Update cannot continue"
+msgstr "アップデートを続行できません"
+
+#: usr/local/www/system_firmware_auto.php:235
+#: usr/local/www/system_firmware_auto.php:237
+#: usr/local/www/system_firmware_auto.php:233
+#: usr/local/www/system_firmware_auto.php:233
+msgid "Downloading complete but sha256 does not match."
+msgstr "完全なダウンロードはなく、 SHA256一致しません。"
+
+#: usr/local/www/system_firmware_auto.php:236
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:234
+#: usr/local/www/system_firmware_auto.php:234
+msgid "Auto upgrade aborted."
+msgstr "自動アップグレードは中止されました。"
+
+#: usr/local/www/system_firmware_auto.php:236
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:234
+#: usr/local/www/system_firmware_auto.php:234
+msgid "Downloaded SHA256"
+msgstr "ダウンロードされたSHA256"
+
+#: usr/local/www/system_firmware_auto.php:236
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:234
+#: usr/local/www/system_firmware_auto.php:234
+msgid "Needed SHA256"
+msgstr "必要にSHA256"
+
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:240
+#: usr/local/www/system_firmware_auto.php:236
+#: usr/local/www/system_firmware_auto.php:236
+msgid "is now upgrading."
+msgstr "今アップグレードされている。"
+
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:240
+#: usr/local/www/system_firmware_auto.php:236
+#: usr/local/www/system_firmware_auto.php:236
+msgid "The firewall will reboot once the operation is completed."
+msgstr "操作が完了したら、ファイアウォールが再起動します。"
+
+#: usr/local/www/system_firmware_auto.php:256
+#: usr/local/www/system_firmware_auto.php:258
+#: usr/local/www/system_firmware_auto.php:258
+msgid "Auto Update Download Status"
+msgstr "自動更新のダウンロード状況"
+
+#: usr/local/www/system_firmware_auto.php:258
+#: usr/local/www/system_firmware_auto.php:260
+#: usr/local/www/system_firmware_auto.php:260
+msgid "Current Version"
+msgstr "現在のバージョン"
+
+#: usr/local/www/system_firmware_auto.php:259
+#: usr/local/www/system_firmware_auto.php:261
+#: usr/local/www/system_firmware_auto.php:261
+msgid "Latest Version"
+msgstr "最新バージョン"
+
+#: usr/local/www/system_firmware_auto.php:260
+#: usr/local/www/system_firmware_auto.php:262
+#: usr/local/www/system_firmware_auto.php:262
+msgid "File size"
+msgstr "ファイルサイズ"
+
+#: usr/local/www/system_firmware_auto.php:261
+#: usr/local/www/system_firmware_auto.php:263
+#: usr/local/www/system_firmware_auto.php:263
+msgid "Downloaded"
+msgstr "ダウンロードした"
+
+#: usr/local/www/system_firmware_auto.php:262
+#: usr/local/www/system_firmware_auto.php:264
+#: usr/local/www/system_firmware_auto.php:264
+msgid "Percent"
+msgstr "パーセント"
+
+#: usr/local/www/system_firmware_check.php:107
+#: usr/local/www/system_firmware_check.php:109
+#: usr/local/www/system_firmware_check.php:101
+#: usr/local/www/system_firmware_check.php:101
+msgid "Invoke Auto Upgrade"
+msgstr "自動アップグレードを起動する"
+
+#: usr/local/www/system_firmware_check.php:125
+#: usr/local/www/system_firmware_check.php:127
+#: usr/local/www/system_firmware_check.php:119
+#: usr/local/www/system_firmware_check.php:119
+msgid "Downloading new version information..."
+msgstr "新しいバージョン情報をダウンロード..."
+
+#: usr/local/www/system_firmware_check.php:143
+#: usr/local/www/system_firmware_check.php:145
+#: usr/local/www/system_firmware_check.php:137
+#: usr/local/www/system_firmware_check.php:137
+msgid "Could not contact custom update server."
+msgstr "カスタムアップデートサーバに接続できませんでした。"
+
+#: usr/local/www/system_firmware_check.php:145
+#: usr/local/www/system_firmware_check.php:147
+#: usr/local/www/system_firmware_check.php:139
+#: usr/local/www/system_firmware_check.php:139
+#, php-format
+msgid "Could not contact %1$s update server %2$s%3$s"
+msgstr "は%1$sアップデートサーバの%2$s%3$sに接続できませんでした"
+
+#: usr/local/www/system_firmware_check.php:147
+#: usr/local/www/system_firmware_check.php:149
+#: usr/local/www/system_firmware_check.php:141
+#: usr/local/www/system_firmware_check.php:141
+msgid "Obtaining current version information..."
+msgstr "現在のバージョン情報を取得..."
+
+#: usr/local/www/system_firmware_check.php:172
+#: usr/local/www/system_firmware_check.php:174
+#: usr/local/www/system_firmware_check.php:178
+#: usr/local/www/system_firmware_check.php:178
+msgid "A new version is now available"
+msgstr "新しいバージョンが利用可能になりました"
+
+#: usr/local/www/system_firmware_check.php:173
+#: usr/local/www/system_firmware_check.php:175
+#: usr/local/www/system_firmware_check.php:179
+#: usr/local/www/system_firmware_check.php:179
+msgid "Current version"
+msgstr "現バージョン"
+
+#: usr/local/www/system_firmware_check.php:175
+#: usr/local/www/system_firmware_check.php:177
+#: usr/local/www/system_firmware_check.php:181
+#: usr/local/www/system_firmware_check.php:181
+msgid "NanoBSD Size"
+msgstr "NanoBSDのサイズ"
+
+#: usr/local/www/system_firmware_check.php:177
+#: usr/local/www/system_firmware_check.php:179
+#: usr/local/www/system_firmware_check.php:183
+#: usr/local/www/system_firmware_check.php:183
+msgid "Built On"
+msgstr "上に構築された"
+
+#: usr/local/www/system_firmware_check.php:178
+#: usr/local/www/system_firmware_check.php:180
+#: usr/local/www/system_firmware_check.php:184
+#: usr/local/www/system_firmware_check.php:184
+msgid "New version"
+msgstr "新バージョン"
+
+#: usr/local/www/system_firmware_check.php:179
+#: usr/local/www/system_firmware_check.php:181
+#: usr/local/www/system_firmware_check.php:185
+#: usr/local/www/system_firmware_check.php:185
+msgid "Update source"
+msgstr "アップデート元"
+
+#: usr/local/www/system_firmware_settings.php:122
+#: usr/local/www/system_firmware_settings.php:127
+#: usr/local/www/system_firmware_settings.php:129
+#: usr/local/www/system_firmware_settings.php:129
+msgid "Firmware Branch"
+msgstr "ファームウェア支店"
+
+#: usr/local/www/system_firmware_settings.php:126
+#: usr/local/www/system_firmware_settings.php:131
+#: usr/local/www/system_firmware_settings.php:133
+#: usr/local/www/system_firmware_settings.php:133
+msgid "Default Auto Update URLs"
+msgstr "自動更新のURLをデフォルト"
+
+#: usr/local/www/system_firmware_settings.php:142
+#: usr/local/www/system_firmware_settings.php:147
+#: usr/local/www/system_firmware_settings.php:156
+#: usr/local/www/system_firmware_settings.php:158
+#: usr/local/www/system_firmware_settings.php:158
+msgid "Firmware Auto Update URL"
+msgstr "ファームウェアの自動アップデートのURL"
+
+#: usr/local/www/system_firmware_settings.php:144
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/system_firmware_settings.php:158
+#: usr/local/www/system_firmware_settings.php:160
+#: usr/local/www/system_firmware_settings.php:160
+msgid "Use a URL server for firmware upgrades other than"
+msgstr "以外のファームウェアのアップグレードのURLサーバを使用する"
+
+#: usr/local/www/system_firmware_settings.php:146
+#: usr/local/www/pkg_mgr_settings.php:109
+#: usr/local/www/system_firmware_settings.php:151
+#: usr/local/www/system_firmware_settings.php:160
+#: usr/local/www/system_firmware_settings.php:162
+#: usr/local/www/pkg_mgr_settings.php:108
+#: usr/local/www/system_firmware_settings.php:162
+#: usr/local/www/pkg_mgr_settings.php:108
+msgid "Base URL:"
+msgstr "ベースURL :"
+
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/system_firmware_settings.php:154
+#: usr/local/www/system_firmware_settings.php:163
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/system_firmware_settings.php:165
+msgid "This is where"
+msgstr "これはここで"
+
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/system_firmware_settings.php:154
+#: usr/local/www/system_firmware_settings.php:163
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/system_firmware_settings.php:165
+msgid "will check for newer firmware versions when the"
+msgstr "新しいファームウェアのバージョンをチェックしますとき"
+
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/system_firmware_settings.php:154
+#: usr/local/www/system_firmware_settings.php:163
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/system_firmware_settings.php:165
+msgid "System: Firmware: Auto Update"
+msgstr "システム:ファームウェア:自動更新"
+
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/pkg_mgr_settings.php:112
+#: usr/local/www/system_firmware_settings.php:154
+#: usr/local/www/system_firmware_settings.php:163
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/pkg_mgr_settings.php:111
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/pkg_mgr_settings.php:111
+msgid "page is viewed."
+msgstr "ページが見られる。"
+
+#: usr/local/www/system_firmware_settings.php:151
+#: usr/local/www/system_firmware_settings.php:156
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/system_firmware_settings.php:167
+#: usr/local/www/system_firmware_settings.php:167
+#, php-format
+msgid ""
+"When a custom URL is enabled, the system will not verify the digital "
+"signature from %s."
+msgstr "%s.から署名「カスタムURLを有効にすると、システムは、デジタルを検証しません」"
+
+#: usr/local/www/system_firmware_settings.php:159
+#: usr/local/www/system_firmware_settings.php:164
+#: usr/local/www/system_firmware_settings.php:173
+#: usr/local/www/system_firmware_settings.php:175
+#: usr/local/www/system_firmware_settings.php:175
+msgid "Updates"
+msgstr "アップデート"
+
+#: usr/local/www/system_firmware_settings.php:162
+#: usr/local/www/system_firmware_settings.php:167
+#: usr/local/www/system_firmware_settings.php:176
+#: usr/local/www/system_firmware_settings.php:178
+#: usr/local/www/system_firmware_settings.php:178
+msgid "Unsigned images"
+msgstr "符号なしの画像"
+
+#: usr/local/www/system_firmware_settings.php:166
+#: usr/local/www/system_firmware_settings.php:171
+#: usr/local/www/system_firmware_settings.php:180
+#: usr/local/www/system_firmware_settings.php:182
+#: usr/local/www/system_firmware_settings.php:182
+msgid ""
+"Allow auto-update firmware images with a missing or invalid digital "
+"signature to be used."
+msgstr "署名に使用する」がないか、または無効ですデジタルで自動更新ファームウェアイメージを許可する "。"
+
+#: usr/local/www/system_firmware_settings.php:174
+#: usr/local/www/system_firmware_settings.php:187
+#: usr/local/www/system_firmware_settings.php:196
+#: usr/local/www/system_firmware_settings.php:198
+#: usr/local/www/system_firmware_settings.php:198
+msgid "Gitsync"
+msgstr "Gitsync"
+
+#: usr/local/www/system_firmware_settings.php:177
+#: usr/local/www/system_firmware_settings.php:190
+#: usr/local/www/system_firmware_settings.php:199
+#: usr/local/www/system_firmware_settings.php:201
+#: usr/local/www/system_firmware_settings.php:201
+msgid "Auto sync on update"
+msgstr "更新時に自動同期"
+
+#: usr/local/www/system_firmware_settings.php:181
+#: usr/local/www/system_firmware_settings.php:194
+#: usr/local/www/system_firmware_settings.php:203
+#: usr/local/www/system_firmware_settings.php:205
+#: usr/local/www/system_firmware_settings.php:205
+msgid ""
+"After updating, sync with the following repository/branch before reboot."
+msgstr "「更新後、再起動する前に、次のリポジトリ/ブランチと同期。"
+
+#: usr/local/www/system_firmware_settings.php:193
+#: usr/local/www/system_firmware_settings.php:206
+#: usr/local/www/system_firmware_settings.php:215
+#: usr/local/www/system_firmware_settings.php:217
+#: usr/local/www/system_firmware_settings.php:217
+msgid "Repository URL"
+msgstr "リポジトリURL"
+
+#: usr/local/www/system_firmware_settings.php:198
+#: usr/local/www/system_firmware_settings.php:211
+#: usr/local/www/system_firmware_settings.php:220
+#: usr/local/www/system_firmware_settings.php:222
+#: usr/local/www/system_firmware_settings.php:222
+#, php-format
+msgid "The most recently used repository was %s"
+msgstr "最近使用したリポジトリが%sた"
+
+#: usr/local/www/system_firmware_settings.php:200
+#: usr/local/www/system_firmware_settings.php:213
+#: usr/local/www/system_firmware_settings.php:222
+#: usr/local/www/system_firmware_settings.php:224
+#: usr/local/www/system_firmware_settings.php:224
+msgid "This will be used if the field is left blank."
+msgstr "フィールドを空白のままにする場合に使用されます。"
+
+#: usr/local/www/system_firmware_settings.php:219
+#: usr/local/www/system_firmware_settings.php:232
+#: usr/local/www/system_firmware_settings.php:241
+#: usr/local/www/system_firmware_settings.php:243
+#: usr/local/www/system_firmware_settings.php:243
+msgid "Branch name"
+msgstr "支店名"
+
+#: usr/local/www/system_firmware_settings.php:224
+#: usr/local/www/system_firmware_settings.php:237
+#: usr/local/www/system_firmware_settings.php:246
+#: usr/local/www/system_firmware_settings.php:248
+#: usr/local/www/system_firmware_settings.php:248
+#, php-format
+msgid "The most recently used branch was %s"
+msgstr "最近使用したブランチが%sた"
+
+#: usr/local/www/system_firmware_settings.php:227
+#: usr/local/www/system_firmware_settings.php:240
+#: usr/local/www/system_firmware_settings.php:249
+#: usr/local/www/system_firmware_settings.php:251
+#: usr/local/www/system_firmware_settings.php:251
+msgid "Usually the branch name is master"
+msgstr "通常、ブランチ名は、マスターである"
+
+#: usr/local/www/system_firmware_settings.php:230
+#: usr/local/www/system_firmware_settings.php:243
+#: usr/local/www/system_firmware_settings.php:252
+#: usr/local/www/system_firmware_settings.php:254
+#: usr/local/www/system_firmware_settings.php:254
+msgid "Note: Sync will not be performed if a branch is not specified."
+msgstr "注:ブランチが指定されていない場合、同期は実行されません。"
+
+#: usr/local/www/system_routes.php:52 usr/local/www/system_routes.php:94
+#: usr/local/www/system_routes_edit.php:165
+#: usr/local/www/system_routes_edit.php:198 usr/local/www/system_routes.php:98
+#: usr/local/www/system_routes_edit.php:227
+#: usr/local/www/system_routes.php:113
+#: usr/local/www/system_routes_edit.php:229 usr/local/www/system_routes.php:52
+#: usr/local/www/system_routes.php:113
+#: usr/local/www/system_routes_edit.php:223
+msgid "Static Routes"
+msgstr "スタティックルートの"
+
+#: usr/local/www/system_routes.php:83 usr/local/www/system_routes.php:83
+msgid "removed route to"
+msgstr "に取り除かルート"
+
+#: usr/local/www/system_routes.php:107 usr/local/www/system_routes.php:111
+#: usr/local/www/system_routes.php:126 usr/local/www/system_routes.php:126
+#, php-format
+msgid ""
+"The static route configuration has been changed.%sYou must apply the changes "
+"in order for them to take effect."
+msgstr "それらを有効にするために、「スタティックルートの設定はchanged.%sYouが変更を適用する必要がありました」 。"
+
+#: usr/local/www/system_routes.php:115 usr/local/www/fbegin.inc:159
+#: usr/local/www/status_gateway_groups.php:64
+#: usr/local/www/status_gateway_groups.php:75
+#: usr/local/www/status_gateways.php:51 usr/local/www/status_gateways.php:62
+#: usr/local/www/system_gateway_groups.php:108
+#: usr/local/www/system_gateway_groups.php:121
+#: usr/local/www/system_gateway_groups_edit.php:142
+#: usr/local/www/system_gateways.php:120 usr/local/www/system_gateways.php:141
+#: usr/local/www/system_gateways_edit.php:313
+#: usr/local/www/diag_logs_routing.php:83
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/fbegin.inc:176 usr/local/www/diag_logs_resolver.php:97
+#: usr/local/www/diag_logs.php:96 usr/local/www/system_gateways_edit.php:319
+#: usr/local/www/diag_logs_wireless.php:85
+#: usr/local/www/diag_logs_gateways.php:66
+#: usr/local/www/diag_logs_gateways.php:97
+#: usr/local/www/diag_logs_routing.php:84
+#: usr/local/www/system_gateway_groups_edit.php:146
+#: usr/local/www/fbegin.inc:184 usr/local/www/diag_logs_resolver.php:98
+#: usr/local/www/system_gateway_groups.php:109
+#: usr/local/www/system_gateway_groups.php:122
+#: usr/local/www/system_gateways_edit.php:425
+#: usr/local/www/status_gateways.php:63
+#: usr/local/www/diag_logs_wireless.php:86
+#: usr/local/www/diag_logs_gateways.php:98
+#: usr/local/www/status_gateway_groups.php:65
+#: usr/local/www/status_gateway_groups.php:76
+#: usr/local/www/system_routes.php:119 usr/local/www/fbegin.inc:175
+#: usr/local/www/system_gateway_groups_edit.php:150
+#: usr/local/www/system_gateway_groups.php:118
+#: usr/local/www/system_gateway_groups.php:131
+#: usr/local/www/system_gateways_edit.php:455
+#: usr/local/www/system_routes.php:134
+#: usr/local/www/system_gateways_edit.php:455
+#: usr/local/www/diag_logs_routing.php:84 usr/local/www/diag_logs.php:96
+#: usr/local/www/system_routes.php:134 usr/local/www/diag_logs_gateways.php:66
+#: usr/local/www/diag_logs_gateways.php:98
+#: usr/local/www/system_gateway_groups_edit.php:150
+#: usr/local/www/status_gateway_groups.php:65
+#: usr/local/www/status_gateway_groups.php:76 usr/local/www/fbegin.inc:175
+#: usr/local/www/system_gateways.php:120 usr/local/www/system_gateways.php:141
+#: usr/local/www/status_gateways.php:51 usr/local/www/status_gateways.php:63
+#: usr/local/www/diag_logs_wireless.php:86
+#: usr/local/www/system_gateway_groups.php:118
+#: usr/local/www/system_gateway_groups.php:131
+#: usr/local/www/diag_logs_resolver.php:98
+msgid "Gateways"
+msgstr "ゲートウェイ"
+
+#: usr/local/www/system_routes.php:116 usr/local/www/fbegin.inc:204
+#: usr/local/www/system_gateway_groups.php:109
+#: usr/local/www/system_gateways.php:142 usr/local/www/fbegin.inc:222
+#: usr/local/www/fbegin.inc:230 usr/local/www/system_gateway_groups.php:110
+#: usr/local/www/system_routes.php:120
+#: usr/local/www/system_gateway_groups.php:119
+#: usr/local/www/system_routes.php:135 usr/local/www/system_routes.php:135
+#: usr/local/www/fbegin.inc:222 usr/local/www/system_gateways.php:142
+#: usr/local/www/system_gateway_groups.php:119
+msgid "Routes"
+msgstr "ルート"
+
+#: usr/local/www/system_routes.php:161 usr/local/www/system_routes.php:172
+#: usr/local/www/system_routes.php:176 usr/local/www/system_routes.php:192
+#: usr/local/www/system_routes.php:192
+msgid "Do you really want to delete this route?"
+msgstr "あなたは本当にこのルートを削除しますか?"
+
+#: usr/local/www/system_routes.php:188 usr/local/www/system_routes.php:199
+#: usr/local/www/system_routes.php:203 usr/local/www/system_routes.php:219
+#: usr/local/www/system_routes.php:219
+msgid ""
+"Do not enter static routes for networks assigned on any interface of this "
+"firewall. Static routes are only used for networks reachable via a "
+"different router, and not reachable via your default gateway."
+msgstr "ファイアウォール"このいずれかのインターフェイス上で割り当てられたネットワーク用のスタティックルートを入力しないでください」 。スタティックルートは、デフォルトゲートウェイを経由して「別のルータ、および到達できない経由で到達可能なネットワークのためにのみ使用されている。"
+
+#: usr/local/www/system_routes_edit.php:89
+#: usr/local/www/system_routes_edit.php:179
+#: usr/local/www/system_routes_edit.php:90
+#: usr/local/www/system_routes_edit.php:216
+#: usr/local/www/system_routes_edit.php:217
+#: usr/local/www/system_routes_edit.php:93
+#: usr/local/www/system_routes_edit.php:244
+#: usr/local/www/system_routes_edit.php:246
+#: usr/local/www/system_routes_edit.php:95
+#: usr/local/www/system_routes_edit.php:240
+msgid "Destination network"
+msgstr "送信先ネットワーク"
+
+#: usr/local/www/system_routes_edit.php:90
+#: usr/local/www/system_routes_edit.php:91
+#: usr/local/www/system_routes_edit.php:94
+#: usr/local/www/system_routes_edit.php:96
+msgid "Destination network bit count"
+msgstr "宛先ネットワークビット数"
+
+#: usr/local/www/system_routes_edit.php:96
+#: usr/local/www/system_routes_edit.php:97
+#: usr/local/www/system_routes_edit.php:100
+#: usr/local/www/system_routes_edit.php:102
+msgid "A valid IPv4 or IPv6 destination network must be specified."
+msgstr "有効なIPv4またはIPv6宛先ネットワークを指定する必要があります。"
+
+#: usr/local/www/system_routes_edit.php:99
+#: usr/local/www/system_routes_edit.php:100
+#: usr/local/www/system_routes_edit.php:103
+#: usr/local/www/system_routes_edit.php:105
+msgid "A valid destination network bit count must be specified."
+msgstr "有効な宛先ネットワークビット数を指定する必要があります。"
+
+#: usr/local/www/system_routes_edit.php:114
+#: usr/local/www/system_routes_edit.php:118
+#: usr/local/www/system_routes_edit.php:121
+#: usr/local/www/system_routes_edit.php:123
+msgid "A IPv4 subnet can not be over 32 bits."
+msgstr "IPv4サブネットは32ビットを超えることはできません。"
+
+#: usr/local/www/system_routes_edit.php:123
+msgid "A route to this destination network already exists."
+msgstr "この宛先ネットワークへのルートがすでに存在しています。"
+
+#: usr/local/www/system_routes_edit.php:165
+#: usr/local/www/system_routes_edit.php:198
+#: usr/local/www/system_routes_edit.php:227
+#: usr/local/www/system_routes_edit.php:229
+#: usr/local/www/system_routes_edit.php:223
+msgid "Edit route"
+msgstr "編集ルート"
+
+#: usr/local/www/system_routes_edit.php:176
+#: usr/local/www/system_routes_edit.php:213
+#: usr/local/www/system_routes_edit.php:214
+#: usr/local/www/system_routes_edit.php:241
+#: usr/local/www/system_routes_edit.php:243
+#: usr/local/www/system_routes_edit.php:237
+msgid "Edit route entry"
+msgstr "編集ルートエントリ"
+
+#: usr/local/www/system_routes_edit.php:196
+#: usr/local/www/system_routes_edit.php:228
+#: usr/local/www/system_routes_edit.php:229
+#: usr/local/www/system_routes_edit.php:256
+#: usr/local/www/system_routes_edit.php:257
+#: usr/local/www/system_routes_edit.php:251
+msgid "Destination network for this static route"
+msgstr "この静的ルートの宛先ネットワーク"
+
+#: usr/local/www/system_routes_edit.php:212
+#: usr/local/www/system_routes_edit.php:244
+#: usr/local/www/system_routes_edit.php:245
+#: usr/local/www/system_routes_edit.php:272
+#: usr/local/www/system_routes_edit.php:274
+#: usr/local/www/system_routes_edit.php:268
+msgid "Choose which gateway this route applies to or"
+msgstr "このルートは、ORに適用されているゲートウェイを選択する"
+
+#: usr/local/www/system_routes_edit.php:228
+#: usr/local/www/system_routes_edit.php:260
+#: usr/local/www/system_routes_edit.php:261
+#: usr/local/www/system_routes_edit.php:287
+#: usr/local/www/system_routes_edit.php:291
+#: usr/local/www/system_routes_edit.php:285
+msgid "Default gateway:"
+msgstr "デフォルトゲートウェイ:"
+
+#: usr/local/www/system_routes_edit.php:231
+#: usr/local/www/system_routes_edit.php:263
+#: usr/local/www/system_routes_edit.php:264
+#: usr/local/www/system_routes_edit.php:290
+#: usr/local/www/system_routes_edit.php:294
+#: usr/local/www/system_routes_edit.php:288
+msgid "Interface:"
+msgstr "インターフェース:"
+
+#: usr/local/www/system_routes_edit.php:243
+#: usr/local/www/system_routes_edit.php:275
+#: usr/local/www/system_routes_edit.php:276
+#: usr/local/www/system_routes_edit.php:302
+#: usr/local/www/system_routes_edit.php:308
+#: usr/local/www/system_routes_edit.php:302
+msgid "Gateway IP:"
+msgstr "ゲートウェイIP :"
+
+#: usr/local/www/system_routes_edit.php:334
+#: usr/local/www/system_routes_edit.php:374
+#: usr/local/www/system_routes_edit.php:375
+#: usr/local/www/system_routes_edit.php:399
+#: usr/local/www/system_routes_edit.php:409
+#: usr/local/www/system_routes_edit.php:403
+#, php-format
+msgid "You can manage Gateways %shere%s."
+msgstr "あなたは、ゲートウェイ%shere%sを管理することができます。"
+
+#: usr/local/www/system_routes_edit.php:337
+#: usr/local/www/system_routes_edit.php:377
+#: usr/local/www/system_routes_edit.php:378
+#: usr/local/www/system_routes_edit.php:402
+#: usr/local/www/system_routes_edit.php:412
+#: usr/local/www/system_routes_edit.php:406
+msgid "Sorry, we could not create your gateway at this time."
+msgstr "申し訳ありませんが、この時点でゲートウェイを作成できませんでした。"
+
+#: usr/local/www/diag_logs_filter_summary.php:34
+#: usr/local/www/diag_logs_filter_summary.php:34
+msgid "Firewall Log Summary"
+msgstr "ファイアウォールのログの概要"
+
+#: usr/local/www/diag_logs_filter_summary.php:45
+#: usr/local/www/load_balancer_relay_protocol_edit.php:230
+#: usr/local/www/load_balancer_relay_protocol_edit.php:228
+#: usr/local/www/diag_logs_filter_summary.php:46
+#: usr/local/www/load_balancer_relay_protocol_edit.php:228
+#: usr/local/www/diag_logs_filter_summary.php:46
+msgid "Actions"
+msgstr "アクション"
+
+#: usr/local/www/diag_logs_filter_summary.php:47
+#: usr/local/www/diag_logs_filter_summary.php:48
+#: usr/local/www/diag_logs_filter_summary.php:48
+msgid "Protocols"
+msgstr "プロトコル"
+
+#: usr/local/www/diag_logs_filter_summary.php:48
+#: usr/local/www/diag_logs_filter_summary.php:49
+#: usr/local/www/diag_logs_filter_summary.php:49
+msgid "Source IPs"
+msgstr "送信元IP"
+
+#: usr/local/www/diag_logs_filter_summary.php:49
+#: usr/local/www/diag_logs_filter_summary.php:50
+#: usr/local/www/diag_logs_filter_summary.php:50
+msgid "Destination IPs"
+msgstr "送信先IPアドレス"
+
+#: usr/local/www/diag_logs_filter_summary.php:50
+#: usr/local/www/diag_logs_filter_summary.php:51
+#: usr/local/www/diag_logs_filter_summary.php:51
+msgid "Source Ports"
+msgstr "送信元ポート"
+
+#: usr/local/www/diag_logs_filter_summary.php:51
+#: usr/local/www/diag_logs_filter_summary.php:52
+#: usr/local/www/diag_logs_filter_summary.php:52
+msgid "Destination Ports"
+msgstr "宛先ポート"
+
+#: usr/local/www/diag_logs_filter_summary.php:71
+#: usr/local/www/diag_logs_filter_summary.php:72
+#: usr/local/www/diag_logs_filter_summary.php:72
+msgid "data"
+msgstr "データ"
+
+#: usr/local/www/diag_logs_filter_summary.php:208
+#: usr/local/www/diag_logs_filter_summary.php:207
+#: usr/local/www/diag_logs_filter_summary.php:208
+#, php-format
+msgid ""
+"This is a firewall log summary, of the last %1$s lines of the firewall log "
+"(Max %2$s)."
+msgstr "(最大%2$s ) "これは、ファイアウォールのログの最後は%1$s線から、ファイアウォールのログをまとめたものです」 。"
+
+#: usr/local/www/diag_logs_filter_summary.php:209
+#: usr/local/www/diag_logs_filter_summary.php:208
+#: usr/local/www/diag_logs_filter_summary.php:209
+msgid "NOTE: IE8 users must enable compatibility view."
+msgstr "注: IE8のユーザーが互換表示を有効にする必要があります。"
+
+#: usr/local/www/uploadconfig.php:48 usr/local/www/uploadconfig.php:48
+msgid "ERR Could not save configuration."
+msgstr "ERR設定を保存できませんでした。"
+
+#: usr/local/www/uploadconfig.php:54 usr/local/www/uploadconfig.php:54
+msgid "OK"
+msgstr "[OK]"
+
+#: usr/local/www/uploadconfig.php:57 usr/local/www/uploadconfig.php:57
+msgid "ERR Could not install configuration."
+msgstr "ERR設定をインストールできませんでした。"
+
+#: usr/local/www/uploadconfig.php:60 usr/local/www/uploadconfig.php:60
+msgid "ERR Invalid configuration received."
+msgstr "ERR無効な設定を受信しました。"
+
+#: usr/local/www/vpn_ipsec.php:134 usr/local/www/vpn_ipsec_keys.php:86
+#: usr/local/www/vpn_ipsec_mobile.php:303 usr/local/www/vpn_ipsec.php:133
+#: usr/local/www/vpn_ipsec_mobile.php:330 usr/local/www/vpn_ipsec_keys.php:85
+#: usr/local/www/vpn_ipsec.php:139 usr/local/www/vpn_ipsec.php:139
+#: usr/local/www/vpn_ipsec_mobile.php:330 usr/local/www/vpn_ipsec_keys.php:85
+msgid "The IPsec tunnel configuration has been changed"
+msgstr "IPsecトンネルの設定が変更されました"
+
+#: usr/local/www/vpn_ipsec.php:141 usr/local/www/vpn_ipsec_keys.php:93
+#: usr/local/www/vpn_ipsec_mobile.php:318
+#: usr/local/www/vpn_ipsec_phase1.php:497
+#: usr/local/www/vpn_ipsec_phase2.php:381
+#: usr/local/www/vpn_ipsec_phase2.php:407 usr/local/www/vpn_ipsec.php:140
+#: usr/local/www/vpn_ipsec_mobile.php:345 usr/local/www/vpn_ipsec_keys.php:92
+#: usr/local/www/vpn_ipsec_phase2.php:473
+#: usr/local/www/vpn_ipsec_phase1.php:496 usr/local/www/vpn_ipsec.php:146
+#: usr/local/www/vpn_ipsec_phase1.php:517
+#: usr/local/www/vpn_ipsec_phase2.php:495 usr/local/www/vpn_ipsec.php:146
+#: usr/local/www/vpn_ipsec_phase1.php:517
+#: usr/local/www/vpn_ipsec_mobile.php:345 usr/local/www/vpn_ipsec_keys.php:92
+#: usr/local/www/vpn_ipsec_phase2.php:495
+msgid "Tunnels"
+msgstr "トンネル"
+
+#: usr/local/www/vpn_ipsec.php:142 usr/local/www/vpn_ipsec_keys.php:94
+#: usr/local/www/vpn_ipsec_mobile.php:319
+#: usr/local/www/vpn_ipsec_phase1.php:498
+#: usr/local/www/vpn_ipsec_phase2.php:382
+#: usr/local/www/vpn_ipsec_phase2.php:408 usr/local/www/vpn_ipsec.php:141
+#: usr/local/www/vpn_ipsec_mobile.php:346 usr/local/www/vpn_ipsec_keys.php:93
+#: usr/local/www/vpn_ipsec_phase2.php:474
+#: usr/local/www/vpn_ipsec_phase1.php:497 usr/local/www/vpn_ipsec.php:147
+#: usr/local/www/vpn_ipsec_phase1.php:518
+#: usr/local/www/vpn_ipsec_phase2.php:496 usr/local/www/vpn_ipsec.php:147
+#: usr/local/www/vpn_ipsec_phase1.php:518
+#: usr/local/www/vpn_ipsec_mobile.php:346 usr/local/www/vpn_ipsec_keys.php:93
+#: usr/local/www/vpn_ipsec_phase2.php:496
+msgid "Mobile clients"
+msgstr "モバイルクライアント"
+
+#: usr/local/www/vpn_ipsec.php:143 usr/local/www/vpn_ipsec_keys.php:95
+#: usr/local/www/vpn_ipsec_mobile.php:320
+#: usr/local/www/vpn_ipsec_phase1.php:499
+#: usr/local/www/vpn_ipsec_phase2.php:383
+#: usr/local/www/vpn_ipsec_phase2.php:409
+msgid "Pre-shared keys"
+msgstr "事前共有鍵"
+
+#: usr/local/www/vpn_ipsec.php:160 usr/local/www/vpn_ipsec.php:159
+#: usr/local/www/vpn_ipsec.php:165 usr/local/www/vpn_ipsec.php:165
+msgid "Enable IPsec"
+msgstr "IPsecのを可能にする"
+
+#: usr/local/www/vpn_ipsec.php:221 usr/local/www/vpn_ipsec.php:351
+#: usr/local/www/vpn_ipsec_phase2.php:552 usr/local/www/vpn_ipsec.php:232
+#: usr/local/www/vpn_ipsec.php:362 usr/local/www/vpn_ipsec_phase2.php:578
+#: usr/local/www/vpn_ipsec.php:231 usr/local/www/vpn_ipsec.php:361
+#: usr/local/www/vpn_ipsec_phase2.php:680 usr/local/www/vpn_ipsec.php:237
+#: usr/local/www/vpn_ipsec.php:367 usr/local/www/vpn_ipsec_phase2.php:701
+#: usr/local/www/vpn_ipsec.php:237 usr/local/www/vpn_ipsec.php:367
+#: usr/local/www/vpn_ipsec_phase2.php:701
+msgid "auto"
+msgstr "オート"
+
+#: usr/local/www/vpn_ipsec.php:223 usr/local/www/vpn_ipsec.php:353
+#: usr/local/www/system_camanager.php:465
+#: usr/local/www/system_certmanager.php:578
+#: usr/local/www/vpn_ipsec_phase2.php:563
+#: usr/local/www/vpn_openvpn_server.php:864 usr/local/www/vpn_ipsec.php:234
+#: usr/local/www/vpn_ipsec.php:364 usr/local/www/system_certmanager.php:677
+#: usr/local/www/vpn_openvpn_server.php:937
+#: usr/local/www/system_camanager.php:466
+#: usr/local/www/vpn_ipsec_phase2.php:589 usr/local/www/vpn_ipsec.php:233
+#: usr/local/www/vpn_ipsec.php:363 usr/local/www/vpn_openvpn_server.php:965
+#: usr/local/www/vpn_ipsec_phase2.php:691
+#: usr/local/www/system_camanager.php:473 usr/local/www/vpn_ipsec.php:239
+#: usr/local/www/vpn_ipsec.php:369 usr/local/www/system_certmanager.php:686
+#: usr/local/www/vpn_openvpn_server.php:992
+#: usr/local/www/vpn_ipsec_phase2.php:712
+#: usr/local/www/system_certmanager.php:687
+#: usr/local/www/system_camanager.php:473 usr/local/www/vpn_ipsec.php:239
+#: usr/local/www/vpn_ipsec.php:369 usr/local/www/system_certmanager.php:687
+#: usr/local/www/vpn_openvpn_server.php:992
+#: usr/local/www/vpn_ipsec_phase2.php:712
+msgid "bits"
+msgstr "ビット"
+
+#: usr/local/www/vpn_ipsec.php:243 usr/local/www/vpn_ipsec.php:254
+#: usr/local/www/vpn_ipsec.php:253 usr/local/www/vpn_ipsec.php:259
+#: usr/local/www/vpn_ipsec.php:259
+msgid "edit phase1 entry"
+msgstr "フェーズ1のエントリを編集"
+
+#: usr/local/www/vpn_ipsec.php:247 usr/local/www/vpn_ipsec.php:258
+#: usr/local/www/vpn_ipsec.php:257 usr/local/www/vpn_ipsec.php:263
+#: usr/local/www/vpn_ipsec.php:263
+msgid ""
+"Do you really want to delete this phase1 and all associated phase2 entries?"
+msgstr "「あなたは本当にこのフェーズ1および関連するすべてのフェーズ2のエントリを削除しますか?"
+
+#: usr/local/www/vpn_ipsec.php:248 usr/local/www/vpn_ipsec.php:259
+#: usr/local/www/vpn_ipsec.php:258 usr/local/www/vpn_ipsec.php:264
+#: usr/local/www/vpn_ipsec.php:264
+msgid "delete phase1 entry"
+msgstr "フェーズ1のエントリを削除"
+
+#: usr/local/www/vpn_ipsec.php:258 usr/local/www/vpn_ipsec.php:269
+#: usr/local/www/vpn_ipsec.php:268 usr/local/www/vpn_ipsec.php:274
+#: usr/local/www/vpn_ipsec.php:274
+msgid "copy phase1 entry"
+msgstr "コピーフェーズ1エントリ"
+
+#: usr/local/www/vpn_ipsec.php:279 usr/local/www/vpn_ipsec.php:290
+#: usr/local/www/vpn_ipsec.php:289 usr/local/www/vpn_ipsec.php:295
+#: usr/local/www/vpn_ipsec.php:295
+#, php-format
+msgid "Show %s Phase-2 entries"
+msgstr "%sフェーズ2のエントリを表示する"
+
+#: usr/local/www/vpn_ipsec.php:285 usr/local/www/vpn_ipsec.php:296
+#: usr/local/www/vpn_ipsec.php:295 usr/local/www/vpn_ipsec.php:301
+#: usr/local/www/vpn_ipsec.php:301
+msgid "Local Subnet"
+msgstr "ローカルサブネット"
+
+#: usr/local/www/vpn_ipsec.php:286 usr/local/www/vpn_ipsec.php:297
+#: usr/local/www/vpn_ipsec.php:296 usr/local/www/vpn_ipsec.php:302
+#: usr/local/www/vpn_ipsec.php:302
+msgid "Remote Subnet"
+msgstr "リモートサブネット"
+
+#: usr/local/www/vpn_ipsec.php:288 usr/local/www/vpn_ipsec.php:299
+#: usr/local/www/vpn_ipsec.php:298 usr/local/www/vpn_ipsec.php:304
+#: usr/local/www/vpn_ipsec.php:304
+msgid "P2 Protocol"
+msgstr "P2プロトコル"
+
+#: usr/local/www/vpn_ipsec.php:289 usr/local/www/vpn_ipsec.php:300
+#: usr/local/www/vpn_ipsec.php:299 usr/local/www/vpn_ipsec.php:305
+#: usr/local/www/vpn_ipsec.php:305
+msgid "P2 Transforms"
+msgstr "P2変換"
+
+#: usr/local/www/vpn_ipsec.php:290 usr/local/www/vpn_ipsec.php:301
+#: usr/local/www/vpn_ipsec.php:300 usr/local/www/vpn_ipsec.php:306
+#: usr/local/www/vpn_ipsec.php:306
+msgid "P2 Auth Methods"
+msgstr "P2は認証方法"
+
+#: usr/local/www/vpn_ipsec.php:293 usr/local/www/vpn_ipsec.php:304
+#: usr/local/www/vpn_ipsec.php:303 usr/local/www/vpn_ipsec.php:309
+#: usr/local/www/vpn_ipsec.php:309
+msgid "add phase2 entry"
+msgstr "フェーズ2のエントリを追加"
+
+#: usr/local/www/vpn_ipsec.php:373 usr/local/www/vpn_ipsec.php:384
+#: usr/local/www/vpn_ipsec.php:383 usr/local/www/vpn_ipsec.php:389
+#: usr/local/www/vpn_ipsec.php:389
+msgid "edit phase2 entry"
+msgstr "フェーズ2のエントリを編集"
+
+#: usr/local/www/vpn_ipsec.php:375 usr/local/www/vpn_ipsec.php:386
+#: usr/local/www/vpn_ipsec.php:385 usr/local/www/vpn_ipsec.php:391
+#: usr/local/www/vpn_ipsec.php:391
+msgid "Do you really want to delete this phase2 entry?"
+msgstr "あなたは本当に、このフェーズ2のエントリを削除しますか?"
+
+#: usr/local/www/vpn_ipsec.php:376 usr/local/www/vpn_ipsec.php:387
+#: usr/local/www/vpn_ipsec.php:386 usr/local/www/vpn_ipsec.php:392
+#: usr/local/www/vpn_ipsec.php:392
+msgid "delete phase2 entry"
+msgstr "フェーズ2のエントリを削除"
+
+#: usr/local/www/vpn_ipsec.php:379 usr/local/www/vpn_ipsec.php:390
+#: usr/local/www/vpn_ipsec.php:389 usr/local/www/vpn_ipsec.php:395
+#: usr/local/www/vpn_ipsec.php:395
+msgid "add a new Phase 2 based on this one"
+msgstr "この1に基づいて、新しいフェーズ2を追加"
+
+#: usr/local/www/vpn_ipsec.php:410 usr/local/www/vpn_ipsec.php:421
+#: usr/local/www/vpn_ipsec.php:420 usr/local/www/vpn_ipsec.php:426
+#: usr/local/www/vpn_ipsec.php:426
+msgid "add phase1 entry"
+msgstr "フェーズ1のエントリを追加"
+
+#: usr/local/www/vpn_ipsec.php:424 usr/local/www/vpn_ipsec.php:435
+#: usr/local/www/vpn_ipsec.php:434 usr/local/www/vpn_ipsec.php:440
+#: usr/local/www/vpn_ipsec.php:440
+msgid "You can check your IPsec status at"
+msgstr "あなたがであなたのIPsecの状態を確認することができます"
+
+#: usr/local/www/vpn_ipsec.php:424 usr/local/www/vpn_ipsec.php:435
+#: usr/local/www/vpn_ipsec.php:434 usr/local/www/vpn_ipsec.php:440
+#: usr/local/www/vpn_ipsec.php:440
+msgid "Status:IPsec"
+msgstr "ステータス: IPsecの"
+
+#: usr/local/www/vpn_ipsec.php:425 usr/local/www/vpn_ipsec.php:436
+#: usr/local/www/vpn_ipsec.php:435 usr/local/www/vpn_ipsec.php:441
+#: usr/local/www/vpn_ipsec.php:441
+msgid "IPsec Debug Mode can be enabled at"
+msgstr "IPsecのデバッグモードを有効にすることができます"
+
+#: usr/local/www/vpn_ipsec.php:425 usr/local/www/vpn_ipsec.php:426
+#: usr/local/www/vpn_ipsec.php:436 usr/local/www/vpn_ipsec.php:437
+#: usr/local/www/vpn_ipsec.php:435 usr/local/www/vpn_ipsec.php:441
+#: usr/local/www/vpn_ipsec.php:442 usr/local/www/vpn_ipsec.php:441
+#: usr/local/www/vpn_ipsec.php:442
+msgid "System:Advanced:Miscellaneous"
+msgstr "システム:高度:その他"
+
+#: usr/local/www/vpn_ipsec.php:426 usr/local/www/vpn_ipsec.php:437
+#: usr/local/www/vpn_ipsec.php:436 usr/local/www/vpn_ipsec.php:442
+#: usr/local/www/vpn_ipsec.php:442
+msgid "IPsec can be set to prefer older SAs at"
+msgstr "IPsecは、古いSAの時を好むように設定することができます"
+
+#: usr/local/www/vpn_ipsec.php:456 usr/local/www/vpn_ipsec.php:467
+#: usr/local/www/vpn_ipsec.php:466 usr/local/www/vpn_ipsec.php:472
+#: usr/local/www/vpn_ipsec.php:472
+msgid "Remote Gateway"
+msgstr "リモートゲートウェイ"
+
+#: usr/local/www/vpn_ipsec.php:458 usr/local/www/vpn_ipsec.php:469
+#: usr/local/www/vpn_ipsec.php:468 usr/local/www/vpn_ipsec.php:474
+#: usr/local/www/vpn_ipsec.php:474
+msgid "P1 Protocol"
+msgstr "P1プロトコル"
+
+#: usr/local/www/vpn_ipsec.php:459 usr/local/www/vpn_ipsec.php:470
+#: usr/local/www/vpn_ipsec.php:469 usr/local/www/vpn_ipsec.php:475
+#: usr/local/www/vpn_ipsec.php:475
+msgid "P1 Transforms"
+msgstr "P1変換"
+
+#: usr/local/www/vpn_ipsec.php:460 usr/local/www/vpn_ipsec.php:471
+#: usr/local/www/vpn_ipsec.php:470 usr/local/www/vpn_ipsec.php:476
+#: usr/local/www/vpn_ipsec.php:476
+msgid "P1 Description"
+msgstr "P1の説明"
+
+#: usr/local/www/diag_logs_ppp.php:91 usr/local/www/diag_logs_ppp.php:90
+#: usr/local/www/diag_logs_ppp.php:88 usr/local/www/diag_logs_ppp.php:88
+#, php-format
+msgid "Last %s PPP log entries"
+msgstr "最後%sのPPPログエントリ"
+
+#: usr/local/www/diag_logs_relayd.php:87 usr/local/www/diag_logs_relayd.php:86
+#: usr/local/www/diag_logs_relayd.php:87
+#, php-format
+msgid "Last %s Load Balancer log entries"
+msgstr "最後%sロードバランサのログエントリ"
+
+#: usr/local/www/graph.php:112 usr/local/www/graph.php:112
+msgid "In"
+msgstr "で"
+
+#: usr/local/www/graph.php:113 usr/local/www/graph.php:113
+msgid "Out"
+msgstr "アウト"
+
+#: usr/local/www/graph.php:117 usr/local/www/graph.php:117
+msgid "Switch to bytes/s"
+msgstr "バイト/秒に切り替える"
+
+#: usr/local/www/graph.php:118 usr/local/www/graph.php:118
+msgid "AutoScale"
+msgstr "オートスケール"
+
+#: usr/local/www/graph.php:120 usr/local/www/graph.php:120
+msgid "Graph shows last"
+msgstr "グラフは、最後に示し"
+
+#: usr/local/www/graph.php:195 usr/local/www/graph.php:195
+msgid "Switch to"
+msgstr "切り替える"
+
+#: usr/local/www/graph.php:201 usr/local/www/graph.php:201
+msgid "follow"
+msgstr "フォロー"
+
+#: usr/local/www/graph.php:361 usr/local/www/graph.php:361
+msgid "Kbps"
+msgstr "kbpsの"
+
+#: usr/local/www/graph.php:363 usr/local/www/graph.php:363
+msgid "Mbps"
+msgstr "Mbpsの"
+
+#: usr/local/www/graph.php:365 usr/local/www/graph.php:365
+msgid "Gbps"
+msgstr "Gbpsの"
+
+#: usr/local/www/graph.php:371 usr/local/www/graph.php:371
+msgid "KB/s"
+msgstr "キロバイト/秒"
+
+#: usr/local/www/graph.php:373 usr/local/www/graph.php:373
+msgid "MB/s"
+msgstr "MB /秒"
+
+#: usr/local/www/graph.php:375 usr/local/www/graph.php:375
+msgid "GB/s"
+msgstr "GB /秒"
+
+#: usr/local/www/diag_patterns.php:43
+#: usr/local/www/services_captiveportal_filemanager.php:195
+#: usr/local/www/exec.php:290 usr/local/www/exec.php:300
+#: usr/local/www/exec.php:292 usr/local/www/exec.php:302
+#: usr/local/www/services_captiveportal_filemanager.php:192
+#: usr/local/www/exec.php:292 usr/local/www/exec.php:302
+#: usr/local/www/services_captiveportal_filemanager.php:192
+msgid "Upload"
+msgstr "アップロード"
+
+#: usr/local/www/diag_patterns.php:46 usr/local/www/diag_patterns.php:46
+msgid "Uploaded file to"
+msgstr "アップロードされたファイルへの"
+
+#: usr/local/www/diag_patterns.php:49 usr/local/www/diag_patterns.php:49
+msgid "Warning: You must upload a file with .pat extension."
+msgstr "警告:あなたはパットの拡張子を持つファイルをアップロードする必要があります。"
+
+#: usr/local/www/diag_patterns.php:58 usr/local/www/diag_patterns.php:58
+msgid "Add layer7 pattern"
+msgstr "レイヤ7パターンを追加"
+
+#: usr/local/www/diag_patterns.php:69 usr/local/www/diag_patterns.php:69
+msgid "Upload layer7 pattern file"
+msgstr "レイヤ7のパターンファイルをアップロード"
+
+#: usr/local/www/diag_patterns.php:72 usr/local/www/diag_patterns.php:72
+msgid "File to upload:"
+msgstr "アップロードするファイル:"
+
+#: usr/local/www/diag_patterns.php:80 usr/local/www/diag_patterns.php:43
+#: usr/local/www/diag_patterns.php:43 usr/local/www/diag_patterns.php:80
+msgid "Upload Pattern file"
+msgstr "パターンファイルをアップロード"
+
+#: usr/local/www/vpn_ipsec_keys.php:64 usr/local/www/vpn_ipsec_keys.php:64
+msgid "Deleted IPsec Pre-Shared Key"
+msgstr "削除されたIPsecの事前共有キー"
+
+#: usr/local/www/vpn_ipsec_keys.php:71 usr/local/www/vpn_ipsec_keys.php:71
+msgid "VPN: IPsec: Keys"
+msgstr "VPN : IPsecの:キー"
+
+#: usr/local/www/vpn_ipsec_keys.php:104
+#: usr/local/www/vpn_ipsec_keys_edit.php:69
+#: usr/local/www/vpn_ipsec_keys_edit.php:128
+#: usr/local/www/vpn_ipsec_keys.php:103
+#: usr/local/www/vpn_ipsec_keys_edit.php:127
+#: usr/local/www/vpn_ipsec_keys_edit.php:69
+#: usr/local/www/vpn_ipsec_keys_edit.php:127
+#: usr/local/www/vpn_ipsec_keys.php:103
+msgid "Identifier"
+msgstr "識別子"
+
+#: usr/local/www/vpn_ipsec_keys.php:105
+#: usr/local/www/vpn_ipsec_keys_edit.php:69
+#: usr/local/www/vpn_ipsec_keys_edit.php:136
+msgid "Pre-shared key"
+msgstr "事前共有鍵"
+
+#: usr/local/www/vpn_ipsec_keys.php:110 usr/local/www/vpn_ipsec_keys.php:146
+#: usr/local/www/vpn_ipsec_keys.php:109 usr/local/www/vpn_ipsec_keys.php:145
+#: usr/local/www/vpn_ipsec_keys.php:109 usr/local/www/vpn_ipsec_keys.php:145
+msgid "add key"
+msgstr "キーを追加"
+
+#: usr/local/www/vpn_ipsec_keys.php:123 usr/local/www/vpn_ipsec_keys.php:136
+#: usr/local/www/vpn_ipsec_keys.php:122 usr/local/www/vpn_ipsec_keys.php:135
+#: usr/local/www/vpn_ipsec_keys.php:122 usr/local/www/vpn_ipsec_keys.php:135
+msgid "edit key"
+msgstr "EDITキー"
+
+#: usr/local/www/vpn_ipsec_keys.php:137
+msgid "Do you really want to delete this pre-shared key?"
+msgstr "あなたは本当に、この事前共有キーを削除しますか?"
+
+#: usr/local/www/vpn_ipsec_keys.php:137 usr/local/www/vpn_ipsec_keys.php:136
+#: usr/local/www/vpn_ipsec_keys.php:136
+msgid "delete key"
+msgstr "削除キー"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:74
+#: usr/local/www/vpn_ipsec_keys_edit.php:74
+msgid "The identifier contains invalid characters."
+msgstr "識別子は無効な文字が含まれています。"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:77
+#: usr/local/www/vpn_ipsec_keys_edit.php:77
+msgid "A user with this name already exists. Add the key to the user instead."
+msgstr "この名前のユーザーがすでに存在しています。代わりに、ユーザーにキーを追加します。"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:83
+#: usr/local/www/vpn_ipsec_keys_edit.php:83
+msgid "Another entry with the same identifier already exists."
+msgstr "同じ識別子を持つ別のエントリがすでに存在しています。"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:100
+#: usr/local/www/vpn_ipsec_keys_edit.php:100
+msgid "Edited"
+msgstr "編集済みの"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:103
+#: usr/local/www/vpn_ipsec_keys_edit.php:103
+msgid "Added"
+msgstr "追加された"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:114
+msgid "VPN: IPsec: Edit pre-shared key"
+msgstr "VPN : IPsecの編集:事前共有キー"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:132
+#: usr/local/www/vpn_ipsec_keys_edit.php:131
+#: usr/local/www/vpn_ipsec_keys_edit.php:131
+msgid ""
+"This can be either an IP address, fully qualified domain name or an e-mail "
+"address"
+msgstr "アドレス「これは、IPアドレス、完全修飾ドメイン名または電子メールのいずれかになります」"
+
+#: usr/local/www/vpn_ipsec_mobile.php:128
+#: usr/local/www/vpn_ipsec_mobile.php:132
+#: usr/local/www/vpn_ipsec_mobile.php:132
+msgid "User Authentication Source"
+msgstr "ユーザー認証元"
+
+#: usr/local/www/vpn_ipsec_mobile.php:128
+#: usr/local/www/vpn_ipsec_mobile.php:132
+#: usr/local/www/vpn_ipsec_mobile.php:132
+msgid "Group Authentication Source"
+msgstr "グループ認証元"
+
+#: usr/local/www/vpn_ipsec_mobile.php:134
+#: usr/local/www/vpn_ipsec_mobile.php:138
+#: usr/local/www/vpn_ipsec_mobile.php:138
+msgid ""
+"A valid IP address for 'Virtual Address Pool Network' must be specified."
+msgstr "「「仮想アドレスプールのネットワーク'の有効なIPアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:138
+#: usr/local/www/vpn_ipsec_mobile.php:142
+#: usr/local/www/vpn_ipsec_mobile.php:142
+msgid "A valid value for 'DNS Default Domain' must be specified."
+msgstr "「 DNSのデフォルトドメイン」の有効な値を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:143
+#: usr/local/www/vpn_ipsec_mobile.php:159
+#: usr/local/www/vpn_ipsec_mobile.php:159
+msgid ""
+"At least one DNS server must be specified to enable the DNS Server option."
+msgstr "At least one DNS server must be specified to enable the DNS Server option."
+
+#: usr/local/www/vpn_ipsec_mobile.php:145
+#: usr/local/www/vpn_ipsec_mobile.php:161
+#: usr/local/www/vpn_ipsec_mobile.php:161
+msgid "A valid IP address for 'DNS Server #1' must be specified."
+msgstr "「 DNSサーバーの有効なIPアドレス"
+
+#: usr/local/www/vpn_ipsec_mobile.php:147
+#: usr/local/www/vpn_ipsec_mobile.php:163
+#: usr/local/www/vpn_ipsec_mobile.php:163
+msgid "A valid IP address for 'DNS Server #2' must be specified."
+msgstr "「 DNSサーバーの有効なIPアドレス"
+
+#: usr/local/www/vpn_ipsec_mobile.php:149
+#: usr/local/www/vpn_ipsec_mobile.php:165
+#: usr/local/www/vpn_ipsec_mobile.php:165
+msgid "A valid IP address for 'DNS Server #3' must be specified."
+msgstr "「 DNSサーバーの有効なIPアドレス"
+
+#: usr/local/www/vpn_ipsec_mobile.php:151
+#: usr/local/www/vpn_ipsec_mobile.php:167
+#: usr/local/www/vpn_ipsec_mobile.php:167
+msgid "A valid IP address for 'DNS Server #4' must be specified."
+msgstr "「 DNSサーバーの有効なIPアドレス"
+
+#: usr/local/www/vpn_ipsec_mobile.php:156
+#: usr/local/www/vpn_ipsec_mobile.php:172
+#: usr/local/www/vpn_ipsec_mobile.php:172
+msgid ""
+"At least one WINS server must be specified to enable the DNS Server option."
+msgstr "少なくとも1 WINSサーバは、DNSサーバー]オプションを有効にするために指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:158
+#: usr/local/www/vpn_ipsec_mobile.php:174
+#: usr/local/www/vpn_ipsec_mobile.php:174
+msgid "A valid IP address for 'WINS Server #1' must be specified."
+msgstr "の有効なIPアドレスは、 「 WINSサーバー"
+
+#: usr/local/www/vpn_ipsec_mobile.php:160
+#: usr/local/www/vpn_ipsec_mobile.php:176
+#: usr/local/www/vpn_ipsec_mobile.php:176
+msgid "A valid IP address for 'WINS Server #2' must be specified."
+msgstr "の有効なIPアドレスは、 「 WINSサーバー"
+
+#: usr/local/www/vpn_ipsec_mobile.php:165
+#: usr/local/www/vpn_ipsec_mobile.php:181
+#: usr/local/www/vpn_ipsec_mobile.php:181
+msgid "A valid value for 'Login Banner' must be specified."
+msgstr "「ログインバナー」の有効な値を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:220
+#: usr/local/www/vpn_ipsec_mobile.php:240
+#: usr/local/www/vpn_ipsec_mobile.php:240
+msgid "Mobile"
+msgstr "携帯電話"
+
+#: usr/local/www/vpn_ipsec_mobile.php:308
+#: usr/local/www/vpn_ipsec_mobile.php:335
+#: usr/local/www/vpn_ipsec_mobile.php:335
+msgid ""
+"Support for IPsec Mobile clients is enabled but a Phase1 definition was not "
+"found"
+msgstr "「 IPsecのモバイル·クライアントのサポートが有効になっていますが、フェーズ1の定義はされませんでした"が見つかり"
+
+#: usr/local/www/vpn_ipsec_mobile.php:308
+#: usr/local/www/vpn_ipsec_mobile.php:335
+#: usr/local/www/vpn_ipsec_mobile.php:335
+msgid "Please click Create to define one."
+msgstr "これらのいずれかを定義するために作成]をクリックしてください。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:308
+#: usr/local/www/vpn_ipsec_mobile.php:335
+#: usr/local/www/vpn_ipsec_mobile.php:335
+msgid "Create Phase1"
+msgstr "フェーズ1を作成します。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:330
+#: usr/local/www/vpn_ipsec_mobile.php:357
+#: usr/local/www/vpn_ipsec_mobile.php:357
+msgid "IKE Extensions"
+msgstr "IKEの拡張機能"
+
+#: usr/local/www/vpn_ipsec_mobile.php:339
+#: usr/local/www/vpn_ipsec_mobile.php:366
+#: usr/local/www/vpn_ipsec_mobile.php:366
+msgid "Enable IPsec Mobile Client Support"
+msgstr "IPsecのモバイル·クライアントのサポートを有効にする"
+
+#: usr/local/www/vpn_ipsec_mobile.php:350
+#: usr/local/www/vpn_ipsec_mobile.php:377
+#: usr/local/www/vpn_ipsec_mobile.php:377
+msgid "Extended Authentication (Xauth)"
+msgstr "拡張認証( Xauthの)"
+
+#: usr/local/www/vpn_ipsec_mobile.php:354
+#: usr/local/www/vpn_ipsec_mobile.php:381
+#: usr/local/www/vpn_ipsec_mobile.php:381
+msgid "User Authentication"
+msgstr "ユーザー認証"
+
+#: usr/local/www/vpn_ipsec_mobile.php:358
+#: usr/local/www/vpn_ipsec_mobile.php:379
+#: usr/local/www/vpn_ipsec_mobile.php:404
+#: usr/local/www/vpn_ipsec_mobile.php:404
+msgid "system"
+msgstr "システム"
+
+#: usr/local/www/vpn_ipsec_mobile.php:375
+#: usr/local/www/vpn_ipsec_mobile.php:399
+#: usr/local/www/vpn_ipsec_mobile.php:399
+msgid "Group Authentication"
+msgstr "グループ認証"
+
+#: usr/local/www/vpn_ipsec_mobile.php:388
+#: usr/local/www/vpn_ipsec_mobile.php:413
+#: usr/local/www/vpn_ipsec_mobile.php:413
+msgid "Client Configuration (mode-cfg)"
+msgstr "クライアント構成(モードCFG )"
+
+#: usr/local/www/vpn_ipsec_mobile.php:392
+#: usr/local/www/vpn_ipsec_mobile.php:417
+#: usr/local/www/vpn_ipsec_mobile.php:417
+msgid "Virtual Address Pool"
+msgstr "仮想アドレスプール"
+
+#: usr/local/www/vpn_ipsec_mobile.php:401
+#: usr/local/www/vpn_ipsec_mobile.php:426
+#: usr/local/www/vpn_ipsec_mobile.php:426
+msgid "Provide a virtual IP address to clients"
+msgstr "クライアントに仮想IPアドレスを提供する"
+
+#: usr/local/www/vpn_ipsec_mobile.php:424
+#: usr/local/www/vpn_ipsec_mobile.php:449
+#: usr/local/www/vpn_ipsec_mobile.php:449
+msgid "Network List"
+msgstr "ネットワークリスト"
+
+#: usr/local/www/vpn_ipsec_mobile.php:433
+#: usr/local/www/vpn_ipsec_mobile.php:458
+#: usr/local/www/vpn_ipsec_mobile.php:458
+msgid "Provide a list of accessible networks to clients"
+msgstr "クライアントにアクセス可能なネットワークのリストを提供"
+
+#: usr/local/www/vpn_ipsec_mobile.php:440
+#: usr/local/www/vpn_ipsec_mobile.php:465
+#: usr/local/www/vpn_ipsec_mobile.php:465
+msgid "Save Xauth Password"
+msgstr "Xauthのパスワードを保存する"
+
+#: usr/local/www/vpn_ipsec_mobile.php:449
+#: usr/local/www/vpn_ipsec_mobile.php:474
+#: usr/local/www/vpn_ipsec_mobile.php:474
+msgid "Allow clients to save Xauth passwords (Cisco VPN client only)."
+msgstr "クライアントがXauthのパスワードを保存することができます(Cisco VPNクライアントのみ) 。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:450
+#: usr/local/www/vpn_ipsec_mobile.php:475
+#: usr/local/www/vpn_ipsec_mobile.php:475
+msgid ""
+"NOTE: With iPhone clients, this does not work when deployed via the iPhone "
+"configuration utility, only by manual entry."
+msgstr ""注: iPhone経由で展開されたとき、iPhoneのクライアントと、これが動作しない」だけ手入力によって、コンフィギュレーションユーティリティ。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:457
+#: usr/local/www/vpn_openvpn_csc.php:433
+#: usr/local/www/vpn_openvpn_server.php:1194
+#: usr/local/www/vpn_openvpn_server.php:1336
+#: usr/local/www/vpn_ipsec_mobile.php:482
+#: usr/local/www/vpn_openvpn_csc.php:432
+#: usr/local/www/vpn_openvpn_server.php:1378
+#: usr/local/www/vpn_openvpn_server.php:1430
+#: usr/local/www/vpn_openvpn_csc.php:432
+#: usr/local/www/vpn_ipsec_mobile.php:482
+#: usr/local/www/vpn_openvpn_server.php:1430
+msgid "DNS Default Domain"
+msgstr "DNSのデフォルトドメイン"
+
+#: usr/local/www/vpn_ipsec_mobile.php:466
+#: usr/local/www/vpn_openvpn_csc.php:443
+#: usr/local/www/vpn_openvpn_server.php:1204
+#: usr/local/www/vpn_openvpn_server.php:1346
+#: usr/local/www/vpn_ipsec_mobile.php:491
+#: usr/local/www/vpn_openvpn_csc.php:442
+#: usr/local/www/vpn_openvpn_server.php:1388
+#: usr/local/www/vpn_openvpn_server.php:1440
+#: usr/local/www/vpn_openvpn_csc.php:442
+#: usr/local/www/vpn_ipsec_mobile.php:491
+#: usr/local/www/vpn_openvpn_server.php:1440
+msgid "Provide a default domain name to clients"
+msgstr "クライアントにデフォルトのドメイン名を提供"
+
+#: usr/local/www/vpn_ipsec_mobile.php:480
+#: usr/local/www/vpn_openvpn_csc.php:458
+#: usr/local/www/vpn_openvpn_server.php:1219
+#: usr/local/www/vpn_openvpn_server.php:1361
+#: usr/local/www/vpn_ipsec_mobile.php:529
+#: usr/local/www/vpn_openvpn_csc.php:457
+#: usr/local/www/vpn_openvpn_server.php:1403
+#: usr/local/www/vpn_openvpn_server.php:1455
+#: usr/local/www/vpn_openvpn_csc.php:457
+#: usr/local/www/vpn_ipsec_mobile.php:529
+#: usr/local/www/vpn_openvpn_server.php:1455
+msgid "DNS Servers"
+msgstr "DNSサーバー"
+
+#: usr/local/www/vpn_ipsec_mobile.php:489
+#: usr/local/www/vpn_openvpn_csc.php:468
+#: usr/local/www/vpn_openvpn_server.php:1229
+#: usr/local/www/vpn_openvpn_server.php:1371
+#: usr/local/www/vpn_ipsec_mobile.php:538
+#: usr/local/www/vpn_openvpn_csc.php:467
+#: usr/local/www/vpn_openvpn_server.php:1413
+#: usr/local/www/vpn_openvpn_server.php:1465
+#: usr/local/www/vpn_openvpn_csc.php:467
+#: usr/local/www/vpn_ipsec_mobile.php:538
+#: usr/local/www/vpn_openvpn_server.php:1465
+msgid "Provide a DNS server list to clients"
+msgstr "クライアントに、DNSサーバリストを提供"
+
+#: usr/local/www/vpn_ipsec_mobile.php:522
+#: usr/local/www/vpn_openvpn_csc.php:606
+#: usr/local/www/vpn_openvpn_server.php:1367
+#: usr/local/www/vpn_openvpn_server.php:1509
+#: usr/local/www/vpn_ipsec_mobile.php:571
+#: usr/local/www/vpn_openvpn_csc.php:605
+#: usr/local/www/vpn_openvpn_server.php:1551
+#: usr/local/www/vpn_openvpn_server.php:1603
+#: usr/local/www/vpn_openvpn_csc.php:605
+#: usr/local/www/vpn_ipsec_mobile.php:571
+#: usr/local/www/vpn_openvpn_server.php:1603
+msgid "WINS Servers"
+msgstr "WINSサーバー"
+
+#: usr/local/www/vpn_ipsec_mobile.php:531
+#: usr/local/www/vpn_openvpn_csc.php:616
+#: usr/local/www/vpn_openvpn_server.php:1377
+#: usr/local/www/vpn_openvpn_server.php:1519
+#: usr/local/www/vpn_ipsec_mobile.php:580
+#: usr/local/www/vpn_openvpn_csc.php:615
+#: usr/local/www/vpn_openvpn_server.php:1561
+#: usr/local/www/vpn_openvpn_server.php:1613
+#: usr/local/www/vpn_openvpn_csc.php:615
+#: usr/local/www/vpn_ipsec_mobile.php:580
+#: usr/local/www/vpn_openvpn_server.php:1613
+msgid "Provide a WINS server list to clients"
+msgstr "クライアントに、WINSサーバーの一覧を提供"
+
+#: usr/local/www/vpn_ipsec_mobile.php:552
+#: usr/local/www/vpn_ipsec_mobile.php:601
+#: usr/local/www/vpn_ipsec_mobile.php:601
+msgid "Phase2 PFS Group"
+msgstr "フェーズ2 PFSグループ"
+
+#: usr/local/www/vpn_ipsec_mobile.php:561
+#: usr/local/www/vpn_ipsec_mobile.php:610
+#: usr/local/www/vpn_ipsec_mobile.php:610
+msgid ""
+"Provide the Phase2 PFS group to clients ( overrides all mobile phase2 "
+"settings )"
+msgstr "「 (設定クライアントへのフェーズ2 PFSグループを提供するすべてのモバイル·フェーズ2を上書きします")"
+
+#: usr/local/www/vpn_ipsec_mobile.php:568
+#: usr/local/www/system_groupmanager.php:71
+#: usr/local/www/vpn_ipsec_mobile.php:617
+#: usr/local/www/system_groupmanager.php:71
+#: usr/local/www/vpn_ipsec_mobile.php:617
+msgid "Group"
+msgstr "グループ"
+
+#: usr/local/www/vpn_ipsec_mobile.php:582
+#: usr/local/www/vpn_ipsec_mobile.php:631
+#: usr/local/www/vpn_ipsec_mobile.php:631
+msgid "Login Banner"
+msgstr "ログインバナー"
+
+#: usr/local/www/vpn_ipsec_mobile.php:591
+#: usr/local/www/vpn_ipsec_mobile.php:640
+#: usr/local/www/vpn_ipsec_mobile.php:640
+msgid "Provide a login banner to clients"
+msgstr "クライアントへのログインバナーを提供"
+
+#: usr/local/www/interfaces_lagg.php:70 usr/local/www/interfaces_lagg.php:74
+#: usr/local/www/interfaces_lagg.php:74
+msgid "This LAGG interface cannot be deleted because it is still being used."
+msgstr "それはまだ使用されているため、このLAGGインターフェイスを削除することはできません。"
+
+#: usr/local/www/interfaces_lagg.php:140 usr/local/www/interfaces_lagg.php:141
+#: usr/local/www/interfaces_lagg.php:145 usr/local/www/interfaces_lagg.php:145
+msgid ""
+"LAGG allows for link aggregation, bonding and fault tolerance. Only "
+"unassigned interfaces can be added to LAGG."
+msgstr "「 LAGG 、リンクアグリゲーション、ボンディングおよび耐障害性を可能にします。のみ"未割り当てのインターフェースはLAGGに追加することができます。"
+
+#: usr/local/www/interfaces_lagg_edit.php:86
+#: usr/local/www/interfaces_lagg_edit.php:88
+#: usr/local/www/interfaces_lagg_edit.php:88
+msgid "Lagg protocol"
+msgstr "Laggプロトコル"
+
+#: usr/local/www/interfaces_lagg_edit.php:131
+#: usr/local/www/interfaces_lagg_edit.php:132
+#: usr/local/www/interfaces_lagg_edit.php:145
+#: usr/local/www/interfaces_lagg_edit.php:145
+msgid "LAGG configuration"
+msgstr "LAGG構成"
+
+#: usr/local/www/interfaces_lagg_edit.php:149
+#: usr/local/www/interfaces_lagg_edit.php:150
+#: usr/local/www/interfaces_lagg_edit.php:163
+#: usr/local/www/interfaces_lagg_edit.php:163
+msgid "Choose the members that will be used for the link aggregation"
+msgstr "リンクアグリゲーションのために使用されるメンバーを選択してください"
+
+#: usr/local/www/interfaces_lagg_edit.php:152
+#: usr/local/www/interfaces_lagg_edit.php:153
+#: usr/local/www/interfaces_lagg_edit.php:166
+#: usr/local/www/interfaces_lagg_edit.php:166
+msgid "Lag proto"
+msgstr "原始遅れ"
+
+#: usr/local/www/interfaces_lagg_edit.php:168
+#: usr/local/www/interfaces_lagg_edit.php:169
+#: usr/local/www/interfaces_lagg_edit.php:182
+#: usr/local/www/interfaces_lagg_edit.php:181
+#: usr/local/www/interfaces_lagg_edit.php:181
+msgid "failover"
+msgstr "フェイルオーバー"
+
+#: usr/local/www/interfaces_lagg_edit.php:169
+#: usr/local/www/interfaces_lagg_edit.php:170
+#: usr/local/www/interfaces_lagg_edit.php:183
+#: usr/local/www/interfaces_lagg_edit.php:182
+#: usr/local/www/interfaces_lagg_edit.php:182
+msgid ""
+"Sends and receives traffic only through the master port. If the master port "
+"becomes unavailable, the next active port is used. The first interface "
+"added is the master port; any interfaces added after that are used as "
+"failover devices."
+msgstr "「送信のみマスタポートを介してトラフィックを受信します。マスタポートがあれば「使用不可能になった、次のアクティブポートが使用されている。最初のインターフェイス」を追加は、マスタポートであり、すなわち後に追加されたインタフェースは、次のように使用されている「フェイルオーバーデバイス。"
+
+#: usr/local/www/interfaces_lagg_edit.php:174
+#: usr/local/www/interfaces_lagg_edit.php:175
+#: usr/local/www/interfaces_lagg_edit.php:188
+#: usr/local/www/interfaces_lagg_edit.php:187
+#: usr/local/www/interfaces_lagg_edit.php:187
+msgid "fec"
+msgstr "FEC"
+
+#: usr/local/www/interfaces_lagg_edit.php:174
+#: usr/local/www/interfaces_lagg_edit.php:175
+#: usr/local/www/interfaces_lagg_edit.php:188
+#: usr/local/www/interfaces_lagg_edit.php:187
+#: usr/local/www/interfaces_lagg_edit.php:187
+msgid ""
+"Supports Cisco EtherChannel. This is a static setup and does not negotiate "
+"aggregation with the peer or exchange frames to monitor the link."
+msgstr "「シスコのEtherChannelがサポートされています。これは、静的なセットアップで、交渉していない"のリンクを監視するためのピアまたは交換フレームで凝集を。"
+
+#: usr/local/www/interfaces_lagg_edit.php:178
+#: usr/local/www/interfaces_lagg_edit.php:179
+#: usr/local/www/interfaces_lagg_edit.php:192
+#: usr/local/www/interfaces_lagg_edit.php:191
+#: usr/local/www/interfaces_lagg_edit.php:191
+msgid "lacp"
+msgstr "LACP"
+
+#: usr/local/www/interfaces_lagg_edit.php:178
+#: usr/local/www/interfaces_lagg_edit.php:179
+#: usr/local/www/interfaces_lagg_edit.php:192
+#: usr/local/www/interfaces_lagg_edit.php:191
+#: usr/local/www/interfaces_lagg_edit.php:191
+msgid ""
+"Supports the IEEE 802.3ad Link Aggregation Control Protocol (LACP) and the "
+"Marker Protocol. LACP will negotiate a set of aggregable links with the "
+"peer in to one or more Link Aggregated Groups. Each LAG is composed of "
+"ports of the same speed, set to full-duplex operation. The traffic will be "
+"balanced across the ports in the LAG with the greatest total speed, in most "
+"cases there will only be one LAG which contains all ports. In the event of "
+"changes in physical connectivity, Link Aggregation will quickly converge to "
+"a new configuration."
+msgstr "」をサポートし、IEEE 802.3adリンクアグリゲーション制御プロトコル( LACP)や「マーカープロトコル。 LACPは、と一つにまとめられる一連のリンク交渉する」 1つ以上のリンク集約グループへのピアを各LAGが構成されている「全二重動作に設定されて同じ速度のポート。トラフィックは例だけ、すべてのポートが含まれている1 LAGがあるだろう」ほとんどで、最大の合計速度が、LAGポート間でバランスのとれた」となります。が発生した場合に、新しいコンフィギュレーション」は、物理的接続の変更、リンクアグリゲーションは急速に収束する」 。"
+
+#: usr/local/www/interfaces_lagg_edit.php:189
+#: usr/local/www/interfaces_lagg_edit.php:190
+#: usr/local/www/interfaces_lagg_edit.php:203
+#: usr/local/www/interfaces_lagg_edit.php:202
+#: usr/local/www/interfaces_lagg_edit.php:202
+msgid "loadbalance"
+msgstr "ロードバランス"
+
+#: usr/local/www/interfaces_lagg_edit.php:189
+#: usr/local/www/interfaces_lagg_edit.php:190
+#: usr/local/www/interfaces_lagg_edit.php:203
+#: usr/local/www/interfaces_lagg_edit.php:202
+#: usr/local/www/interfaces_lagg_edit.php:202
+msgid ""
+"Balances outgoing traffic across the active ports based on hashed protocol "
+"header information and accepts incoming traffic from any active port. This "
+"is a static setup and does not negotiate aggregation with the peer or "
+"exchange frames to monitor the link. The hash includes the Ethernet source "
+"and destination address, and, if available, the VLAN tag, and the IP source "
+"and destination address"
+msgstr "ヘッダ情報と任意のアクティブポートから着信トラフィックを受け付け、 「ハッシュ化されたプロトコルに基づいて、アクティブなポート間残高発信トラフィックを」 。これは「静的設定で、ピアまたはとの凝集をネゴシエートしません」のリンクを監視するための交換フレーム。ハッシュは、イーサネットソース」や宛先アドレス、および、可能な場合、 VLANタグ、およびIPソース」および宛先アドレスを含む"
+
+#: usr/local/www/interfaces_lagg_edit.php:197
+#: usr/local/www/interfaces_lagg_edit.php:198
+#: usr/local/www/interfaces_lagg_edit.php:211
+#: usr/local/www/interfaces_lagg_edit.php:210
+#: usr/local/www/interfaces_lagg_edit.php:210
+msgid "roundrobin"
+msgstr "ラウンドロビン"
+
+#: usr/local/www/interfaces_lagg_edit.php:197
+#: usr/local/www/interfaces_lagg_edit.php:198
+#: usr/local/www/interfaces_lagg_edit.php:211
+#: usr/local/www/interfaces_lagg_edit.php:210
+#: usr/local/www/interfaces_lagg_edit.php:210
+msgid ""
+"Distributes outgoing traffic using a round-robin scheduler through all "
+"active ports and accepts incoming traffic from any active port"
+msgstr "アクティブポート「すべてを通じて、ラウンドロビンスケジューラを使用して、発信トラフィックを分散」し、任意のアクティブポートから着信トラフィックを受け付けます"
+
+#: usr/local/www/interfaces_lagg_edit.php:201
+#: usr/local/www/interfaces_lagg_edit.php:202
+#: usr/local/www/interfaces_lagg_edit.php:215
+#: usr/local/www/interfaces_lagg_edit.php:214
+#: usr/local/www/interfaces_lagg_edit.php:214
+msgid ""
+"This protocol is intended to do nothing: it disables any traffic without "
+"disabling the lagg interface itself"
+msgstr "「このプロトコルは、何もしないことを意図している:それはせずにトラフィックを無効にします」 laggインタフェース自体を無効にする"
+
+#: usr/local/www/interfaces_ppps.php:62 usr/local/www/interfaces_ppps.php:62
+msgid ""
+"This point-to-point link cannot be deleted because it is still being used as "
+"an interface."
+msgstr "インターフェース「それでもとして使用されているので、このポイントツーポイントリンクを削除することはできません」 。"
+
+#: usr/local/www/interfaces_ppps.php:78 usr/local/www/interfaces_ppps.php:78
+msgid "Interfaces: PPPs"
+msgstr "インターフェース:購買力平価"
+
+#: usr/local/www/interfaces_ppps.php:109 usr/local/www/interfaces_ppps.php:110
+#: usr/local/www/interfaces_ppps.php:110
+msgid "Interface(s)/Port(s)"
+msgstr "インターフェイス(複数可) /ポート(複数可)"
+
+#: usr/local/www/interfaces_ppps.php:132 usr/local/www/interfaces_ppps.php:133
+#: usr/local/www/interfaces_ppps.php:133
+msgid "Do you really want to delete this PPP interface?"
+msgstr "あなたは本当に、このPPPインタフェースを削除しますか?"
+
+#: usr/local/www/interfaces_ppps_edit.php:182
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:191
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:197
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:197
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+msgid "Link Interface(s)"
+msgstr "リンク·インターフェース( S )"
+
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/services_dhcp.php:587 usr/local/www/services_dhcpv6.php:522
+#: usr/local/www/services_dhcp.php:600 usr/local/www/services_dhcpv6.php:596
+#: usr/local/www/services_dhcp.php:710 usr/local/www/services_dhcpv6.php:527
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/services_dhcp.php:720 usr/local/www/services_dhcpv6.php:542
+#: usr/local/www/services_dhcp.php:740
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/services_dhcp.php:740 usr/local/www/services_dhcpv6.php:542
+msgid "Subnet"
+msgstr "サブネット"
+
+#: usr/local/www/interfaces_ppps_edit.php:207
+#: usr/local/www/interfaces_ppps_edit.php:213
+#: usr/local/www/interfaces_ppps_edit.php:213
+msgid "Please choose a Link Type."
+msgstr "リンクタイプをお選び下さい。"
+
+#: usr/local/www/interfaces_ppps_edit.php:211
+#: usr/local/www/interfaces_ppps_edit.php:217
+#: usr/local/www/interfaces_ppps_edit.php:217
+msgid ""
+"Multilink connections (MLPPP) using the PPP link type is not currently "
+"supported. Please select only one Link Interface."
+msgstr "「 PPPリンクの種類を使用してマルチリンク接続( MLPPP )は現在していない」がサポート。唯一の1 Linkインタフェースを選択してください。"
+
+#: usr/local/www/interfaces_ppps_edit.php:213
+#: usr/local/www/interfaces_ppps_edit.php:219
+#: usr/local/www/interfaces_ppps_edit.php:219
+msgid "The Service name contains invalid characters."
+msgstr "サービス名に無効な文字が含まれています。"
+
+#: usr/local/www/interfaces_ppps_edit.php:215
+#: usr/local/www/interfaces_ppps_edit.php:221
+#: usr/local/www/interfaces_ppps_edit.php:221
+msgid "Do not specify both a Service name and a NULL Service name."
+msgstr "サービス名とNULLのサービス名の両方を指定しないでください。"
+
+#: usr/local/www/interfaces_ppps_edit.php:229
+#: usr/local/www/interfaces_ppps_edit.php:235
+#: usr/local/www/interfaces_ppps_edit.php:235
+msgid ""
+"A valid PPPoE reset month must be specified (1-12) in the Custom PPPoE "
+"Periodic reset fields."
+msgstr "定期的なリセットのフィールド"は有効なのPPPoEリセット月はカスタムのPPPoEで( 1〜12)を指定しなければなりません」 。"
+
+#: usr/local/www/interfaces_ppps_edit.php:231
+#: usr/local/www/interfaces_ppps_edit.php:237
+#: usr/local/www/interfaces_ppps_edit.php:237
+msgid ""
+"A valid PPPoE reset day of month must be specified (1-31) in the Custom "
+"PPPoE Periodic reset fields. No checks are done on valid # of days per month"
+msgstr "「月の有効なPPPoEのリセット日はカスタムで( 1月31日)を指定しなければなりません」のPPPoE定期フィールドをリセットします。いいえチェックは有効なで行われていません"
+
+#: usr/local/www/interfaces_ppps_edit.php:233
+#: usr/local/www/interfaces_ppps_edit.php:239
+#: usr/local/www/interfaces_ppps_edit.php:239
+msgid ""
+"A valid PPPoE reset year must be specified. Don't select a year in the past!"
+msgstr "「有効なPPPoEのリセットの年を指定する必要があります。過去のの年を選択しないでください!"
+
+#: usr/local/www/interfaces_ppps_edit.php:238
+#: usr/local/www/interfaces_ppps_edit.php:244
+#: usr/local/www/interfaces_ppps_edit.php:244
+#, php-format
+msgid "A valid local IP address must be specified for %s."
+msgstr "有効なローカルIPアドレスは、 %s.を指定する必要があります"
+
+#: usr/local/www/interfaces_ppps_edit.php:240
+#: usr/local/www/interfaces_ppps_edit.php:246
+#: usr/local/www/interfaces_ppps_edit.php:246
+#, php-format
+msgid "A valid gateway IP address OR hostname must be specified for %s."
+msgstr "有効なゲートウェイIPアドレスまたはホスト名が%s.を指定する必要があります"
+
+#: usr/local/www/interfaces_ppps_edit.php:242
+#: usr/local/www/interfaces_ppps_edit.php:248
+#: usr/local/www/interfaces_ppps_edit.php:248
+#, php-format
+msgid "The bandwidth value for %s must be an integer."
+msgstr "%sための帯域幅の値は整数でなければなりません。"
+
+#: usr/local/www/interfaces_ppps_edit.php:244
+#: usr/local/www/interfaces_ppps_edit.php:250
+#: usr/local/www/interfaces_ppps_edit.php:250
+#, php-format
+msgid "The MTU for %s must be greater than 576 bytes."
+msgstr "%sのMTUを超える576バイトでなければなりません。"
+
+#: usr/local/www/interfaces_ppps_edit.php:246
+#: usr/local/www/interfaces_ppps_edit.php:252
+#: usr/local/www/interfaces_ppps_edit.php:252
+#, php-format
+msgid "The MRU for %s must be greater than 576 bytes."
+msgstr "%sのためのMRUを超える576バイトでなければなりません。"
+
+#: usr/local/www/interfaces_ppps_edit.php:381
+#: usr/local/www/system_authservers.php:577
+#: usr/local/www/interfaces_ppps_edit.php:382
+#: usr/local/www/system_authservers.php:582
+#: usr/local/www/interfaces_ppps_edit.php:388
+#: usr/local/www/system_authservers.php:589
+#: usr/local/www/interfaces_ppps_edit.php:388
+#: usr/local/www/system_authservers.php:589
+msgid "Select"
+msgstr "選択する"
+
+#: usr/local/www/interfaces_ppps_edit.php:398
+#: usr/local/www/interfaces_ppps_edit.php:399
+#: usr/local/www/interfaces_ppps_edit.php:405
+#: usr/local/www/interfaces_ppps_edit.php:405
+msgid "PPPs configuration"
+msgstr "購買力平価の設定"
+
+#: usr/local/www/interfaces_ppps_edit.php:401
+#: usr/local/www/interfaces_ppps_edit.php:402
+#: usr/local/www/interfaces_ppps_edit.php:408
+#: usr/local/www/interfaces_ppps_edit.php:408
+msgid "Link Type"
+msgstr "リンク型"
+
+#: usr/local/www/interfaces_ppps_edit.php:416
+#: usr/local/www/interfaces_ppps_edit.php:417
+#: usr/local/www/interfaces_ppps_edit.php:423
+#: usr/local/www/interfaces_ppps_edit.php:423
+msgid "Link interface(s)"
+msgstr "Linkインタフェース( S )"
+
+#: usr/local/www/interfaces_ppps_edit.php:422
+#: usr/local/www/interfaces_ppps_edit.php:423
+#: usr/local/www/interfaces_ppps_edit.php:429
+#: usr/local/www/interfaces_ppps_edit.php:429
+msgid "Select at least two interfaces for Multilink (MLPPP) connections."
+msgstr "マルチリンク( MLPPP )接続のために少なくとも2つのインタフェースを選択します。"
+
+#: usr/local/www/interfaces_ppps_edit.php:470
+#: usr/local/www/interfaces_ppps_edit.php:471
+#: usr/local/www/interfaces_ppps_edit.php:477
+#: usr/local/www/interfaces_ppps_edit.php:477
+msgid ""
+"You may enter a description here for your reference. Description will appear "
+"in the "Interfaces Assign" select lists."
+msgstr ""ここに参照用の説明文を入力することもできます。"説明「インターフェイスは、割り当て」選択リストに表示されます。"
+
+#: usr/local/www/interfaces_ppps_edit.php:526
+#: usr/local/www/interfaces_ppps_edit.php:527
+#: usr/local/www/interfaces_ppps_edit.php:533
+#: usr/local/www/interfaces_ppps_edit.php:531
+#: usr/local/www/interfaces_ppps_edit.php:531
+msgid "Note: Typically *99# for GSM networks and #777 for CDMA networks"
+msgstr "注意:GSMネットワークとCDMAネットワークのための#777ため通常*99"
+
+#: usr/local/www/interfaces_ppps_edit.php:540
+#: usr/local/www/interfaces_ppps_edit.php:541
+#: usr/local/www/interfaces_ppps_edit.php:547
+#: usr/local/www/interfaces_ppps_edit.php:545
+#: usr/local/www/interfaces_ppps_edit.php:545
+msgid "APN number (optional)"
+msgstr "APN番号(オプション)"
+
+#: usr/local/www/interfaces_ppps_edit.php:543
+#: usr/local/www/interfaces_ppps_edit.php:544
+#: usr/local/www/interfaces_ppps_edit.php:550
+#: usr/local/www/interfaces_ppps_edit.php:548
+#: usr/local/www/interfaces_ppps_edit.php:548
+msgid ""
+"Note: Defaults to 1 if you set APN above. Ignored if you set no APN above."
+msgstr ""注: 1デフォルトは上記のAPNを設定した場合、上記のないAPNを設定しない場合は無視されます。"
+
+#: usr/local/www/interfaces_ppps_edit.php:547
+#: usr/local/www/interfaces_ppps_edit.php:548
+#: usr/local/www/interfaces_ppps_edit.php:554
+#: usr/local/www/interfaces_ppps_edit.php:552
+#: usr/local/www/interfaces_ppps_edit.php:552
+msgid "SIM PIN"
+msgstr "SIMカードのPIN"
+
+#: usr/local/www/interfaces_ppps_edit.php:554
+#: usr/local/www/interfaces_ppps_edit.php:555
+#: usr/local/www/interfaces_ppps_edit.php:561
+#: usr/local/www/interfaces_ppps_edit.php:559
+#: usr/local/www/interfaces_ppps_edit.php:559
+msgid "SIM PIN wait"
+msgstr "のSIM端子ウェイト"
+
+#: usr/local/www/interfaces_ppps_edit.php:557
+#: usr/local/www/interfaces_ppps_edit.php:558
+#: usr/local/www/interfaces_ppps_edit.php:564
+#: usr/local/www/interfaces_ppps_edit.php:562
+#: usr/local/www/interfaces_ppps_edit.php:562
+msgid ""
+"Note: Time to wait for SIM to discover network after PIN is sent to SIM "
+"(seconds)."
+msgstr ""注: SIMはPINの後にネットワークを検出するのを待つ時間がSIMに送信されます」 (秒) 。"
+
+#: usr/local/www/interfaces_ppps_edit.php:561
+#: usr/local/www/interfaces_ppps_edit.php:562
+#: usr/local/www/interfaces_ppps_edit.php:568
+#: usr/local/www/interfaces_ppps_edit.php:566
+#: usr/local/www/interfaces_ppps_edit.php:566
+msgid "Init String"
+msgstr "INIT文字列"
+
+#: usr/local/www/interfaces_ppps_edit.php:564
+#: usr/local/www/interfaces_ppps_edit.php:565
+#: usr/local/www/interfaces_ppps_edit.php:571
+#: usr/local/www/interfaces_ppps_edit.php:569
+#: usr/local/www/interfaces_ppps_edit.php:569
+msgid ""
+"Note: Enter the modem initialization string here. Do NOT include the "AT" "
+"string at the beginning of the command. Many modern USB 3G modems don't need "
+"an initialization string."
+msgstr ""注意:ここでのモデムの初期化文字列を入力して含まれていません。 」コマンドの先頭にAT」 "という文字列を。多くの現代のUSB 3Gモデムは、 「初期化文字列は必要ありません。"
+
+#: usr/local/www/interfaces_ppps_edit.php:569
+#: usr/local/www/interfaces_ppps_edit.php:570
+#: usr/local/www/interfaces_ppps_edit.php:576
+#: usr/local/www/interfaces_ppps_edit.php:574
+#: usr/local/www/interfaces_ppps_edit.php:574
+msgid "Connection Timeout"
+msgstr "接続タイムアウト"
+
+#: usr/local/www/interfaces_ppps_edit.php:572
+#: usr/local/www/interfaces_ppps_edit.php:573
+#: usr/local/www/interfaces_ppps_edit.php:579
+#: usr/local/www/interfaces_ppps_edit.php:577
+#: usr/local/www/interfaces_ppps_edit.php:577
+msgid ""
+"Note: Enter timeout in seconds for connection to be established (sec.) "
+"Default is 45 sec."
+msgstr ""注:確立する接続のタイムアウトを秒単位で入力します(秒) 」のデフォルトは45秒です。"
+
+#: usr/local/www/interfaces_ppps_edit.php:576
+#: usr/local/www/interfaces_ppps_edit.php:577
+#: usr/local/www/interfaces_ppps_edit.php:583
+#: usr/local/www/interfaces_ppps_edit.php:581
+#: usr/local/www/interfaces_ppps_edit.php:581
+msgid "Uptime Logging"
+msgstr "稼働時間のログ"
+
+#: usr/local/www/interfaces_ppps_edit.php:578
+#: usr/local/www/interfaces_ppps_edit.php:579
+#: usr/local/www/interfaces_ppps_edit.php:585
+#: usr/local/www/interfaces_ppps_edit.php:583
+#: usr/local/www/interfaces_ppps_edit.php:583
+msgid "Enable persistent logging of connection uptime."
+msgstr "接続のアップタイムの永続的なログを有効にします。"
+
+#: usr/local/www/interfaces_ppps_edit.php:579
+#: usr/local/www/interfaces_ppps_edit.php:580
+#: usr/local/www/interfaces_ppps_edit.php:586
+#: usr/local/www/interfaces_ppps_edit.php:584
+#: usr/local/www/interfaces_ppps_edit.php:584
+msgid ""
+"This option causes cumulative uptime to be recorded and displayed on the "
+"Status Interfaces page."
+msgstr "ステータスInterfacesページ"このオプションを記録しに表示される累積稼働時間の原因となる」 。"
+
+#: usr/local/www/interfaces_ppps_edit.php:591
+#: usr/local/www/interfaces_ppps_edit.php:592
+#: usr/local/www/interfaces_ppps_edit.php:598
+#: usr/local/www/interfaces_ppps_edit.php:596
+#: usr/local/www/interfaces_ppps_edit.php:596
+msgid "Configure a NULL Service name"
+msgstr "NULLのサービス名を設定する"
+
+#: usr/local/www/interfaces_ppps_edit.php:592
+#: usr/local/www/interfaces_ppps_edit.php:593
+#: usr/local/www/interfaces_ppps_edit.php:599
+#: usr/local/www/interfaces_ppps_edit.php:597
+#: usr/local/www/interfaces_ppps_edit.php:597
+msgid ""
+"Hint: this field can usually be left empty. Service name will not be "
+"configured if this field is empty. Check the "Configure NULL" box to "
+"configure a blank Service name."
+msgstr ""ヒント:このフィールドは通常、空のままにすることができるサービス名はされません。 「このフィールドが空の場合は設定されています。 「ブランクサービス名を設定するには、 「設定NULL」チェックボックスをオンにします。"
+
+#: usr/local/www/interfaces_ppps_edit.php:652 usr/local/www/vpn_pppoe.php:102
+#: usr/local/www/diag_ipsec.php:91 usr/local/www/diag_ipsec.php:102
+#: usr/local/www/vpn_pppoe.php:103 usr/local/www/diag_ipsec.php:103
+#: usr/local/www/interfaces_ppps_edit.php:653 usr/local/www/vpn_pppoe.php:104
+#: usr/local/www/interfaces_ppps_edit.php:659 usr/local/www/diag_ipsec.php:105
+#: usr/local/www/interfaces_ppps_edit.php:657 usr/local/www/vpn_pppoe.php:104
+#: usr/local/www/interfaces_ppps_edit.php:657 usr/local/www/diag_ipsec.php:105
+msgid "Local IP"
+msgstr "ローカルIP"
+
+#: usr/local/www/interfaces_ppps_edit.php:667
+#: usr/local/www/interfaces_ppps_edit.php:668
+#: usr/local/www/interfaces_ppps_edit.php:674
+#: usr/local/www/interfaces_ppps_edit.php:672
+#: usr/local/www/interfaces_ppps_edit.php:672
+msgid "IP Address OR Hostname"
+msgstr "IPアドレスまたはホスト名"
+
+#: usr/local/www/interfaces_ppps_edit.php:678
+#: usr/local/www/interfaces_ppps_edit.php:679
+#: usr/local/www/interfaces_ppps_edit.php:685
+#: usr/local/www/interfaces_ppps_edit.php:683
+#: usr/local/www/interfaces_ppps_edit.php:683
+msgid "Dial On Demand"
+msgstr "ダイヤルオンデマンド"
+
+#: usr/local/www/interfaces_ppps_edit.php:680
+#: usr/local/www/interfaces_ppps_edit.php:681
+#: usr/local/www/interfaces_ppps_edit.php:687
+#: usr/local/www/interfaces_ppps_edit.php:685
+#: usr/local/www/interfaces_ppps_edit.php:685
+msgid "Enable Dial-on-Demand mode"
+msgstr "ダイヤルオンデマンドモードを有効にする"
+
+#: usr/local/www/interfaces_ppps_edit.php:681
+#: usr/local/www/interfaces_ppps_edit.php:682
+#: usr/local/www/interfaces_ppps_edit.php:688
+#: usr/local/www/interfaces_ppps_edit.php:686
+#: usr/local/www/interfaces_ppps_edit.php:686
+msgid ""
+"This option causes the interface to operate in dial-on-demand mode. Do NOT "
+"enable if you want your link to be always up. The interface is configured, "
+"but the actual connection of the link is delayed until qualifying outgoing "
+"traffic is detected."
+msgstr ""このオプションは、インターフェイスがダイヤルオンデマンドモードで動作するようになります。ない」あなたのリンクは常に最新にしたい場合は、有効にします。インターフェイスは、設定されている」が、リンクの実際の接続は、発信予選まで遅延される「トラフィックが検出された。"
+
+#: usr/local/www/interfaces_ppps_edit.php:686
+#: usr/local/www/interfaces_ppps_edit.php:687
+#: usr/local/www/interfaces_ppps_edit.php:693
+#: usr/local/www/interfaces_ppps_edit.php:691
+#: usr/local/www/interfaces_ppps_edit.php:691
+msgid "Idle Timeout"
+msgstr "アイドルタイムアウト"
+
+#: usr/local/www/interfaces_ppps_edit.php:688
+#: usr/local/www/interfaces_ppps_edit.php:689
+#: usr/local/www/interfaces_ppps_edit.php:695
+#: usr/local/www/interfaces_ppps_edit.php:693
+#: usr/local/www/interfaces_ppps_edit.php:693
+msgid "(seconds) Default is 0, which disables the timeout feature."
+msgstr "(秒)デフォルトは、タイムアウト機能を無効にし、 0である。"
+
+#: usr/local/www/interfaces_ppps_edit.php:689
+#: usr/local/www/interfaces_ppps_edit.php:690
+#: usr/local/www/interfaces_ppps_edit.php:696
+#: usr/local/www/interfaces_ppps_edit.php:694
+#: usr/local/www/interfaces_ppps_edit.php:694
+msgid ""
+"If no incoming or outgoing packets are transmitted for the entered number of "
+"seconds the connection is brought down."
+msgstr "秒」着信または発信パケットが入力した数値のために送信されていない場合は「接続がダウンしている。"
+
+#: usr/local/www/interfaces_ppps_edit.php:690
+#: usr/local/www/interfaces_ppps_edit.php:691
+#: usr/local/www/interfaces_ppps_edit.php:697
+#: usr/local/www/interfaces_ppps_edit.php:695
+#: usr/local/www/interfaces_ppps_edit.php:695
+msgid ""
+"When the idle timeout occurs, if the dial-on-demand option is enabled, mpd "
+"goes back into dial-on-demand mode. Otherwise, the interface is brought down "
+"and all associated routes removed."
+msgstr "「アイドルタイムアウトが発生するとダイヤルオンデマンドオプションが有効になっている場合、 MPDは「バックダイヤルオンデマンドモードになります。それ以外の場合は、インターフェイスがダウンし、 "および関連するすべてのルートが削除されます。"
+
+#: usr/local/www/interfaces_ppps_edit.php:694
+#: usr/local/www/vpn_openvpn_client.php:787
+#: usr/local/www/vpn_openvpn_server.php:1077
+#: usr/local/www/vpn_openvpn_server.php:1219
+#: usr/local/www/vpn_openvpn_client.php:792
+#: usr/local/www/interfaces_ppps_edit.php:695
+#: usr/local/www/vpn_openvpn_server.php:1261
+#: usr/local/www/vpn_openvpn_client.php:838
+#: usr/local/www/vpn_openvpn_client.php:857
+#: usr/local/www/interfaces_ppps_edit.php:701
+#: usr/local/www/vpn_openvpn_server.php:1288
+#: usr/local/www/interfaces_ppps_edit.php:699
+#: usr/local/www/vpn_openvpn_client.php:857
+#: usr/local/www/interfaces_ppps_edit.php:699
+#: usr/local/www/vpn_openvpn_server.php:1288
+msgid "Compression"
+msgstr "圧縮"
+
+#: usr/local/www/interfaces_ppps_edit.php:696
+#: usr/local/www/interfaces_ppps_edit.php:697
+#: usr/local/www/interfaces_ppps_edit.php:703
+#: usr/local/www/interfaces_ppps_edit.php:701
+#: usr/local/www/interfaces_ppps_edit.php:701
+msgid "Disable vjcomp(compression) (auto-negotiated by default)."
+msgstr "VJCOMP (圧縮) (デフォルトではオートネゴシエーション)を無効にします。"
+
+#: usr/local/www/interfaces_ppps_edit.php:697
+#: usr/local/www/interfaces_ppps_edit.php:698
+#: usr/local/www/interfaces_ppps_edit.php:704
+#: usr/local/www/interfaces_ppps_edit.php:702
+#: usr/local/www/interfaces_ppps_edit.php:702
+msgid ""
+"This option enables Van Jacobson TCP header compression, which saves several "
+"bytes per TCP data packet. You almost always want this option. This "
+"compression ineffective for TCP connections with enabled modern extensions "
+"like time stamping or SACK, which modify TCP options between sequential "
+"packets."
+msgstr "バイトあたりのTCPデータパケット」このオプションは、いくつかが保存されますヴァンヤコブソンTCPヘッダー圧縮を可能に」 。あなたは、ほとんどの場合、このオプションが欲しい。シーケンシャル「パケット間のTCPオプションを変更し、タイムスタンプやSACKのように、この「有効現代の拡張子を持つTCP接続の非効率圧縮」 、 。"
+
+#: usr/local/www/interfaces_ppps_edit.php:703
+#: usr/local/www/interfaces_ppps_edit.php:704
+#: usr/local/www/interfaces_ppps_edit.php:710
+#: usr/local/www/interfaces_ppps_edit.php:708
+#: usr/local/www/interfaces_ppps_edit.php:708
+msgid "TCPmssFix"
+msgstr "TCPmssFix"
+
+#: usr/local/www/interfaces_ppps_edit.php:705
+#: usr/local/www/interfaces_ppps_edit.php:706
+#: usr/local/www/interfaces_ppps_edit.php:712
+#: usr/local/www/interfaces_ppps_edit.php:710
+#: usr/local/www/interfaces_ppps_edit.php:710
+msgid "Disable tcpmssfix (enabled by default)."
+msgstr "(デフォルトで有効)を無効tcpmssfix 。"
+
+#: usr/local/www/interfaces_ppps_edit.php:706
+#: usr/local/www/interfaces_ppps_edit.php:707
+#: usr/local/www/interfaces_ppps_edit.php:713
+#: usr/local/www/interfaces_ppps_edit.php:711
+#: usr/local/www/interfaces_ppps_edit.php:711
+msgid ""
+"This option causes mpd to adjust incoming and outgoing TCP SYN segments so "
+"that the requested maximum segment size is not greater than the amount "
+"allowed by the interface MTU. This is necessary in many setups to avoid "
+"problems caused by routers that drop ICMP Datagram Too Big messages. Without "
+"these messages, the originating machine sends data, it passes the rogue "
+"router then hits a machine that has an MTU that is not big enough for the "
+"data. Because the IP Don't Fragment option is set, this machine sends an "
+"ICMP Datagram Too Big message back to the originator and drops the packet. "
+"The rogue router drops the ICMP message and the originator never gets to "
+"discover that it must reduce the fragment size or drop the IP Don't Fragment "
+"option from its outgoing data."
+msgstr "「これは避けるために、多くのセットアップで必要となるインターフェイスのMTUで許可されている「要求された最大セグメントサイズは、量よりも大きくないと、ICMPをドロップし、ルータによる問題を"このオプションはとても着信および発信TCP SYNセグメントを調整するためにMPDを起こす」データグラムToo Bigメッセージ。せずに、IPフラグメントオプションが設定されていないため、ルータし、「データのための十分な大きさではありませんMTUを持つマシンを打つ」これらのメッセージは、発信機がデータを送信し、それが不正に合格」 、このマシンは送信します「ICMPデータグラム過大バック発信へのメッセージとはパケットをドロップします。 「不正なルータは、 ICMPメッセージを削除し、発信者はことを得ることはありません"それはフラグメントサイズを減らすか、またはIPがその発信データから"オプションを断片化しないでください削除する必要があることを発見。"
+
+#: usr/local/www/interfaces_ppps_edit.php:714
+#: usr/local/www/interfaces_ppps_edit.php:715
+#: usr/local/www/interfaces_ppps_edit.php:721
+#: usr/local/www/interfaces_ppps_edit.php:719
+#: usr/local/www/interfaces_ppps_edit.php:719
+msgid "ShortSeq"
+msgstr "ShortSeq"
+
+#: usr/local/www/interfaces_ppps_edit.php:716
+#: usr/local/www/interfaces_ppps_edit.php:717
+#: usr/local/www/interfaces_ppps_edit.php:723
+#: usr/local/www/interfaces_ppps_edit.php:721
+#: usr/local/www/interfaces_ppps_edit.php:721
+msgid "Disable shortseq (auto-negotiated by default)."
+msgstr "shortseqを(デフォルトではオートネゴシエーション)無効にします。"
+
+#: usr/local/www/interfaces_ppps_edit.php:717
+#: usr/local/www/interfaces_ppps_edit.php:718
+#: usr/local/www/interfaces_ppps_edit.php:724
+#: usr/local/www/interfaces_ppps_edit.php:722
+#: usr/local/www/interfaces_ppps_edit.php:722
+msgid ""
+"This option is only meaningful if multi-link PPP is negotiated. It "
+"proscribes shorter multi-link fragment headers, saving two bytes on every "
+"frame. It is not necessary to disable this for connections that are not "
+"multi-link."
+msgstr "「マルチリンクPPPがネゴシエートされている場合、このオプションは意味があります。それは "すべての上の2バイト節約短いマルチリンクフラグメントヘッダをも禁止」のフレームを。それはない接続のためにこれを無効にする必要はありません"マルチリンク。"
+
+#: usr/local/www/interfaces_ppps_edit.php:722
+#: usr/local/www/interfaces_ppps_edit.php:723
+#: usr/local/www/interfaces_ppps_edit.php:729
+#: usr/local/www/interfaces_ppps_edit.php:727
+#: usr/local/www/interfaces_ppps_edit.php:727
+msgid "ACFComp"
+msgstr "ACFComp"
+
+#: usr/local/www/interfaces_ppps_edit.php:724
+#: usr/local/www/interfaces_ppps_edit.php:725
+#: usr/local/www/interfaces_ppps_edit.php:731
+#: usr/local/www/interfaces_ppps_edit.php:729
+#: usr/local/www/interfaces_ppps_edit.php:729
+msgid "Disable acfcomp (compression) (auto-negotiated by default)."
+msgstr "acfcomp (圧縮) (デフォルトではオートネゴシエーション)を無効にします。"
+
+#: usr/local/www/interfaces_ppps_edit.php:725
+#: usr/local/www/interfaces_ppps_edit.php:726
+#: usr/local/www/interfaces_ppps_edit.php:732
+#: usr/local/www/interfaces_ppps_edit.php:730
+#: usr/local/www/interfaces_ppps_edit.php:730
+msgid ""
+"Address and control field compression. This option only applies to "
+"asynchronous link types. It saves two bytes per frame."
+msgstr "「アドレスおよび制御フィールドの圧縮。このオプションは、に適用され、「非同期リンクタイプ。これは、フレームあたり2バイトを保存します。"
+
+#: usr/local/www/interfaces_ppps_edit.php:729
+#: usr/local/www/interfaces_ppps_edit.php:730
+#: usr/local/www/interfaces_ppps_edit.php:736
+#: usr/local/www/interfaces_ppps_edit.php:734
+#: usr/local/www/interfaces_ppps_edit.php:734
+msgid "ProtoComp"
+msgstr "ProtoComp"
+
+#: usr/local/www/interfaces_ppps_edit.php:731
+#: usr/local/www/interfaces_ppps_edit.php:732
+#: usr/local/www/interfaces_ppps_edit.php:738
+#: usr/local/www/interfaces_ppps_edit.php:736
+#: usr/local/www/interfaces_ppps_edit.php:736
+msgid "Disable protocomp (compression) (auto-negotiated by default)."
+msgstr "protocomp (圧縮) (デフォルトではオートネゴシエーション)を無効にします。"
+
+#: usr/local/www/interfaces_ppps_edit.php:732
+#: usr/local/www/interfaces_ppps_edit.php:733
+#: usr/local/www/interfaces_ppps_edit.php:739
+#: usr/local/www/interfaces_ppps_edit.php:737
+#: usr/local/www/interfaces_ppps_edit.php:737
+msgid ""
+"Protocol field compression. This option saves one byte per frame for most "
+"frames."
+msgstr "フレーム「プロトコルフィールド圧縮。このオプションは、ほとんどのフレームあたり1バイトを節約できます」 。"
+
+#: usr/local/www/interfaces_ppps_edit.php:746
+#: usr/local/www/interfaces_ppps_edit.php:747
+#: usr/local/www/interfaces_ppps_edit.php:753
+#: usr/local/www/interfaces_ppps_edit.php:750
+#: usr/local/www/interfaces_ppps_edit.php:750
+msgid "Link Parameters"
+msgstr "リンク·パラメータ"
+
+#: usr/local/www/interfaces_ppps_edit.php:753
+#: usr/local/www/interfaces_ppps_edit.php:754
+#: usr/local/www/interfaces_ppps_edit.php:760
+#: usr/local/www/interfaces_ppps_edit.php:757
+#: usr/local/www/interfaces_ppps_edit.php:757
+msgid ""
+"Set ONLY for MLPPP connections and ONLY when links have different bandwidths."
+msgstr "「 MLPPP接続にのみ設定し、リンクは異なる帯域幅を持っている場合のみです。"
+
+#: usr/local/www/interfaces_ppps_edit.php:760
+#: usr/local/www/interfaces_ppps_edit.php:761
+#: usr/local/www/interfaces_ppps_edit.php:767
+#: usr/local/www/interfaces_ppps_edit.php:764
+#: usr/local/www/interfaces_ppps_edit.php:764
+msgid "MTU will default to 1492."
+msgstr "MTUは1492にデフォルト設定されます。"
+
+#: usr/local/www/interfaces_ppps_edit.php:764
+#: usr/local/www/interfaces_ppps_edit.php:765
+#: usr/local/www/interfaces_ppps_edit.php:771
+#: usr/local/www/interfaces_ppps_edit.php:768
+#: usr/local/www/interfaces_ppps_edit.php:768
+msgid "MRU"
+msgstr "MRU"
+
+#: usr/local/www/interfaces_ppps_edit.php:767
+#: usr/local/www/interfaces_ppps_edit.php:774
+#: usr/local/www/interfaces_ppps_edit.php:768
+#: usr/local/www/interfaces_ppps_edit.php:775
+#: usr/local/www/interfaces_ppps_edit.php:781
+#: usr/local/www/interfaces_ppps_edit.php:771
+#: usr/local/www/interfaces_ppps_edit.php:778
+#: usr/local/www/interfaces_ppps_edit.php:771
+#: usr/local/www/interfaces_ppps_edit.php:778
+msgid "will be auto-negotiated by default."
+msgstr "オートネゴシエーションはデフォルトでとなります。"
+
+#: usr/local/www/interfaces_ppps_edit.php:771
+#: usr/local/www/interfaces_ppps_edit.php:772
+#: usr/local/www/interfaces_ppps_edit.php:778
+#: usr/local/www/interfaces_ppps_edit.php:775
+#: usr/local/www/interfaces_ppps_edit.php:775
+msgid "MRRU"
+msgstr "MRRU"
+
+#: usr/local/www/interfaces_ppps_edit.php:774
+#: usr/local/www/interfaces_ppps_edit.php:775
+#: usr/local/www/interfaces_ppps_edit.php:781
+#: usr/local/www/interfaces_ppps_edit.php:778
+#: usr/local/www/interfaces_ppps_edit.php:778
+msgid "Set ONLY for MLPPP connections."
+msgstr "ONLY MLPPP接続に設定します。"
+
+#: usr/local/www/interfaces_qinq.php:64 usr/local/www/interfaces_qinq.php:66
+#: usr/local/www/interfaces_qinq.php:66
+msgid ""
+"This QinQ cannot be deleted because it is still being used as an interface."
+msgstr "それはまだインターフェイスとして使用されているため、 「これのQinQを削除することはできません。"
+
+#: usr/local/www/interfaces_qinq.php:86
+#: usr/local/www/interfaces_qinq_edit.php:39
+#: usr/local/www/interfaces_qinq.php:89 usr/local/www/interfaces_qinq.php:89
+#: usr/local/www/interfaces_qinq_edit.php:39
+msgid "QinQ"
+msgstr "のQinQ"
+
+#: usr/local/www/interfaces_qinq.php:117
+#: usr/local/www/interfaces_qinq_edit.php:356
+#: usr/local/www/interfaces_qinq_edit.php:357
+#: usr/local/www/interfaces_qinq.php:118 usr/local/www/interfaces_qinq.php:121
+#: usr/local/www/interfaces_qinq_edit.php:360
+#: usr/local/www/interfaces_qinq.php:121
+#: usr/local/www/interfaces_qinq_edit.php:360
+msgid "Tag"
+msgstr "タグ"
+
+#: usr/local/www/interfaces_qinq.php:118 usr/local/www/interfaces_qinq.php:119
+#: usr/local/www/interfaces_qinq.php:122 usr/local/www/interfaces_qinq.php:122
+msgid "QinQ members"
+msgstr "QinQのメンバー"
+
+#: usr/local/www/interfaces_qinq.php:142 usr/local/www/interfaces_qinq.php:143
+#: usr/local/www/interfaces_qinq.php:146 usr/local/www/interfaces_qinq.php:146
+msgid "Do you really want to delete this QinQ?"
+msgstr "あなたは本当にこのQinQのを削除しますか?"
+
+#: usr/local/www/interfaces_qinq.php:153 usr/local/www/interfaces_qinq.php:154
+#: usr/local/www/interfaces_qinq.php:157 usr/local/www/interfaces_qinq.php:157
+#, php-format
+msgid ""
+"Not all drivers/NICs support 802.1Q QinQ tagging properly. On cards that do "
+"not explicitly support it, QinQ tagging will still work, but the reduced MTU "
+"may cause problems. See the %s handbook for information on supported cards."
+msgstr "明示的にサポートしていない"すべてのドライバ/ NICが802.1Q QinQのがないカードでは。適切にタグ付けをサポートしない」 、のQinQタギングはまだ動作しますが、縮小MTUは「問題が発生することがあります。サポートされているカードについては、 %sハンドブックを参照してください。"
+
+#: usr/local/www/interfaces_qinq_edit.php:84
+#: usr/local/www/interfaces_qinq_edit.php:85
+#: usr/local/www/interfaces_qinq_edit.php:85
+msgid "First level tag cannot be empty."
+msgstr "最初のレベルのタグは空にすることはできません。"
+
+#: usr/local/www/interfaces_qinq_edit.php:86
+#: usr/local/www/interfaces_qinq_edit.php:87
+#: usr/local/www/interfaces_qinq_edit.php:87
+msgid ""
+"You are editing an existing entry and modifying the first level tag is not "
+"allowed."
+msgstr "「既存のエントリを編集し、最初のレベルのタグがされていない変更している」ことができました。"
+
+#: usr/local/www/interfaces_qinq_edit.php:88
+#: usr/local/www/interfaces_qinq_edit.php:89
+#: usr/local/www/interfaces_qinq_edit.php:89
+msgid ""
+"You are editing an existing entry and modifying the interface is not allowed."
+msgstr "「あなたは、既存のエントリを編集して、インターフェイスが許可されていない変更している。"
+
+#: usr/local/www/interfaces_qinq_edit.php:92
+#: usr/local/www/interfaces_qinq_edit.php:93
+#: usr/local/www/interfaces_qinq_edit.php:93
+msgid "QinQ level already exists for this interface, edit it!"
+msgstr "このインターフェイスは、それを編集するためにQinQのレベルがすでに存在しています!"
+
+#: usr/local/www/interfaces_qinq_edit.php:96
+#: usr/local/www/interfaces_qinq_edit.php:97
+#: usr/local/www/interfaces_qinq_edit.php:97
+msgid ""
+"A normal VLAN exists with this tag please remove it to use this tag for QinQ "
+"first level."
+msgstr "最初のレベル「正常なVLANは、このタグに存在し、それがQinQのために、このタグを使用するために削除してください」 。"
+
+#: usr/local/www/interfaces_qinq_edit.php:123
+#: usr/local/www/interfaces_qinq_edit.php:133
+#: usr/local/www/interfaces_qinq_edit.php:124
+#: usr/local/www/interfaces_qinq_edit.php:134
+#: usr/local/www/interfaces_qinq_edit.php:124
+#: usr/local/www/interfaces_qinq_edit.php:134
+msgid "Tags can contain only numbers or a range in format #-#."
+msgstr "タグは、数字や形式の範囲を含めることができます"
+
+#: usr/local/www/interfaces_qinq_edit.php:193
+#: usr/local/www/interfaces_qinq_edit.php:194
+#: usr/local/www/interfaces_qinq_edit.php:197
+#: usr/local/www/interfaces_qinq_edit.php:197
+msgid "QinQ VLANs group"
+msgstr "QinQのVLANのグループ"
+
+#: usr/local/www/interfaces_qinq_edit.php:269
+#: usr/local/www/interfaces_qinq_edit.php:270
+#: usr/local/www/interfaces_qinq_edit.php:273
+#: usr/local/www/interfaces_qinq_edit.php:272
+#: usr/local/www/interfaces_qinq_edit.php:272
+msgid "members"
+msgstr "メンバー"
+
+#: usr/local/www/interfaces_qinq_edit.php:273
+#: usr/local/www/interfaces_qinq_edit.php:274
+#: usr/local/www/interfaces_qinq_edit.php:277
+#: usr/local/www/interfaces_qinq_edit.php:276
+#: usr/local/www/interfaces_qinq_edit.php:276
+msgid "detail"
+msgstr "詳細"
+
+#: usr/local/www/interfaces_qinq_edit.php:285
+#: usr/local/www/interfaces_qinq_edit.php:286
+#: usr/local/www/interfaces_qinq_edit.php:289
+#: usr/local/www/interfaces_qinq_edit.php:289
+msgid "Interface QinQ Edit"
+msgstr "インタフェースのQinQ編集"
+
+#: usr/local/www/interfaces_qinq_edit.php:305
+#: usr/local/www/interfaces_qinq_edit.php:306
+#: usr/local/www/interfaces_qinq_edit.php:309
+#: usr/local/www/interfaces_qinq_edit.php:309
+msgid "Only QinQ capable interfaces will be shown."
+msgstr "唯一のQinQが可能なインターフェースが表示されます。"
+
+#: usr/local/www/interfaces_qinq_edit.php:308
+#: usr/local/www/interfaces_qinq_edit.php:309
+#: usr/local/www/interfaces_qinq_edit.php:312
+#: usr/local/www/interfaces_qinq_edit.php:312
+msgid "First level tag"
+msgstr "最初のレベルのタグ"
+
+#: usr/local/www/interfaces_qinq_edit.php:313
+#: usr/local/www/interfaces_qinq_edit.php:314
+#: usr/local/www/interfaces_qinq_edit.php:317
+#: usr/local/www/interfaces_qinq_edit.php:317
+msgid ""
+"This is the first level VLAN tag. On top of this are stacked the member "
+"VLANs defined below."
+msgstr "「これは最初のレベルのVLANタグです。その上に積層されたメンバーで「 VLANが以下に定義。"
+
+#: usr/local/www/interfaces_qinq_edit.php:333
+#: usr/local/www/interfaces_qinq_edit.php:334
+#: usr/local/www/interfaces_qinq_edit.php:337
+#: usr/local/www/interfaces_qinq_edit.php:337
+msgid ""
+"Adds interface to QinQ interface groups so you can write filter rules easily."
+msgstr "あなたが簡単にフィルタルールを作成することができますので、 「 QinQサブインターフェイスグループにインターフェイスを追加します。"
+
+#: usr/local/www/interfaces_qinq_edit.php:350
+#: usr/local/www/interfaces_qinq_edit.php:351
+#: usr/local/www/interfaces_qinq_edit.php:354
+#: usr/local/www/interfaces_qinq_edit.php:354
+msgid ""
+"You can specify ranges in the input below. The format is pretty simple i.e "
+"9-100 or 10.20..."
+msgstr "「あなたは、以下の入力で範囲を指定することができます。形式、すなわち非常に簡単です」 9から100または10.20を..."
+
+#: usr/local/www/interfaces_wireless.php:63
+#: usr/local/www/interfaces_wireless.php:65
+#: usr/local/www/interfaces_wireless.php:65
+msgid ""
+"This wireless clone cannot be deleted because it is assigned as an interface."
+msgstr "それはインターフェイスとして割り当てられているので、「このワイヤレスクローンは削除できません。"
+
+#: usr/local/www/interfaces_wireless.php:124
+#: usr/local/www/interfaces_wireless.php:125
+#: usr/local/www/interfaces_wireless.php:127
+#: usr/local/www/interfaces_wireless.php:127
+msgid "Do you really want to delete this wireless clone?"
+msgstr "あなたは本当にこのワイヤレスクローンを削除しますか?"
+
+#: usr/local/www/interfaces_wireless.php:135
+#: usr/local/www/interfaces_wireless.php:136
+#: usr/local/www/interfaces_wireless.php:138
+#: usr/local/www/interfaces_wireless.php:138
+msgid ""
+"Here you can configure clones of wireless interfaces, which can be assigned "
+"as separate independent interfaces. Only available on wireless chipsets that "
+"support this, with limitations on the number that can be created in each "
+"mode."
+msgstr "別々の独立したインターフェイスとして「ここでは、割り当て可能な無線インタフェースのクローンを、設定することができます」 。モード」それぞれに作成できる数には制限付きで、これをサポートする」と無線チップセットでのみ使用できます。"
+
+#: usr/local/www/interfaces_wireless_edit.php:116
+#: usr/local/www/interfaces_wireless_edit.php:118
+#: usr/local/www/interfaces_wireless_edit.php:118
+msgid ""
+"This wireless clone cannot be modified because it is still assigned as an "
+"interface."
+msgstr "インターフェース「それはまだとして割り当てられているため、この無線クローンは変更できません」 。"
+
+#: usr/local/www/interfaces_wireless_edit.php:118
+#: usr/local/www/interfaces_wireless_edit.php:120
+#: usr/local/www/interfaces_wireless_edit.php:120
+msgid ""
+"Use the configuration page for the assigned interface to change the mode."
+msgstr "」モードを変更するには、割り当てられたインターフェイスの設定ページを使用します。"
+
+#: usr/local/www/interfaces_wireless_edit.php:123
+#: usr/local/www/interfaces_wireless_edit.php:125
+#: usr/local/www/interfaces_wireless_edit.php:125
+#, php-format
+msgid ""
+"Error creating interface with mode %1$s. The %2$s interface may not support "
+"creating more clones with the selected mode."
+msgstr "選択したモードでより多くのクローンを作成する」モードは%1$sとのインタフェースを作成するにエラーが発生しました。 %2$sインタフェースはサポートしていない可能性が」 。"
+
+#: usr/local/www/interfaces_wireless_edit.php:128
+#: usr/local/www/interfaces_wireless_edit.php:130
+#: usr/local/www/interfaces_wireless_edit.php:130
+#, php-format
+msgid "Created with id %s"
+msgstr "IDの%sを使用して作成"
+
+#: usr/local/www/interfaces_wireless_edit.php:131
+#: usr/local/www/interfaces_wireless_edit.php:133
+#: usr/local/www/interfaces_wireless_edit.php:133
+msgid "Created without id"
+msgstr "IDなしで作成"
+
+#: usr/local/www/interfaces_wireless_edit.php:156
+#: usr/local/www/interfaces_wireless_edit.php:158
+#: usr/local/www/interfaces_wireless_edit.php:158
+msgid "Wireless clone configuration"
+msgstr "無線クローン構成"
+
+#: usr/local/www/load_balancer_monitor.php:72
+#: usr/local/www/load_balancer_monitor.php:72
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"pool."
+msgstr "プール「それはまだ少なくとも1によって参照されているため、このエントリは削除できません」 。"
+
+#: usr/local/www/load_balancer_monitor.php:102
+#: usr/local/www/load_balancer_relay_protocol.php:114
+#: usr/local/www/load_balancer_setting.php:111
+#: usr/local/www/load_balancer_setting.php:110
+#: usr/local/www/load_balancer_monitor.php:100
+#: usr/local/www/load_balancer_relay_protocol.php:112
+#: usr/local/www/load_balancer_relay_protocol.php:112
+#: usr/local/www/load_balancer_setting.php:110
+#: usr/local/www/load_balancer_monitor.php:100
+msgid "The load balancer configuration has been changed"
+msgstr "ロードバランサ設定が変更されました"
+
+#: usr/local/www/vpn_pppoe.php:96 usr/local/www/vpn_pppoe.php:97
+#: usr/local/www/vpn_pppoe.php:98 usr/local/www/vpn_pppoe.php:98
+msgid "The PPPoE entry list has been changed"
+msgstr "PPPoEのエントリーリストが変更されました"
+
+#: usr/local/www/vpn_pppoe.php:103
+#: usr/local/www/services_captiveportal_zones.php:54
+#: usr/local/www/vpn_pppoe.php:104
+#: usr/local/www/services_captiveportal_zones.php:55
+#: usr/local/www/vpn_pppoe.php:105 usr/local/www/vpn_pppoe.php:105
+#: usr/local/www/services_captiveportal_zones.php:55
+msgid "Number of users"
+msgstr "ユーザー数"
+
+#: usr/local/www/vpn_pppoe.php:109 usr/local/www/vpn_pppoe.php:144
+#: usr/local/www/vpn_pppoe.php:110 usr/local/www/vpn_pppoe.php:145
+#: usr/local/www/vpn_pppoe.php:111 usr/local/www/vpn_pppoe.php:146
+#: usr/local/www/vpn_pppoe.php:111 usr/local/www/vpn_pppoe.php:146
+msgid "add a new pppoe instance"
+msgstr "新しいのPPPoEインスタンスを追加"
+
+#: usr/local/www/vpn_pppoe.php:131 usr/local/www/vpn_pppoe.php:132
+#: usr/local/www/vpn_pppoe.php:133 usr/local/www/vpn_pppoe.php:133
+msgid "edit PPPoE instance"
+msgstr "編集のPPPoEインスタンス"
+
+#: usr/local/www/vpn_pppoe.php:132 usr/local/www/vpn_pppoe.php:133
+#: usr/local/www/vpn_pppoe.php:134 usr/local/www/vpn_pppoe.php:134
+msgid ""
+"Do you really want to delete this entry? All elements that still use it will "
+"become invalid (e.g. filter rules)!"
+msgstr " (例えばフィルタルール)が無効になる「本当に?まだそれを使用するすべての要素がします、このエントリを削除しますか"!"
+
+#: usr/local/www/vpn_pppoe.php:132 usr/local/www/vpn_pppoe.php:133
+#: usr/local/www/vpn_pppoe.php:134 usr/local/www/vpn_pppoe.php:134
+msgid "delete pppoe instance"
+msgstr "のPPPoEインスタンスを削除"
+
+#: usr/local/www/load_balancer_monitor_edit.php:66
+#: usr/local/www/load_balancer_monitor_edit.php:66
+msgid "Load Balancer: Monitor:"
+msgstr "ロード·バランサ:モニタ:"
+
+#: usr/local/www/load_balancer_monitor_edit.php:95
+#: usr/local/www/load_balancer_monitor_edit.php:95
+msgid "This monitor name has already been used. Monitor names must be unique."
+msgstr "このモニタ名が既に使用されています。モニター名は一意でなければなりません。"
+
+#: usr/local/www/load_balancer_monitor_edit.php:98
+#: usr/local/www/load_balancer_pool_edit.php:86
+#: usr/local/www/load_balancer_virtual_server_edit.php:89
+#: usr/local/www/load_balancer_relay_action_edit.php:127
+#: usr/local/www/load_balancer_relay_protocol_edit.php:89
+#: usr/local/www/load_balancer_relay_protocol_edit.php:89
+#: usr/local/www/load_balancer_relay_action_edit.php:127
+#: usr/local/www/load_balancer_monitor_edit.php:98
+#: usr/local/www/load_balancer_pool_edit.php:86
+msgid "You cannot use spaces in the 'name' field."
+msgstr "あなたは、 「名前」欄にスペースを使用することはできません。"
+
+#: usr/local/www/load_balancer_monitor_edit.php:112
+#: usr/local/www/services_dhcp_edit.php:118
+#: usr/local/www/services_dnsmasq_edit.php:85
+#: usr/local/www/services_dhcpv6_edit.php:115
+#: usr/local/www/services_dnsmasq_edit.php:86
+#: usr/local/www/services_dhcpv6_edit.php:117
+#: usr/local/www/services_dhcp_edit.php:120
+#: usr/local/www/services_dhcpv6_edit.php:120
+#: usr/local/www/services_dhcp_edit.php:154
+#: usr/local/www/services_dhcpv6_edit.php:120
+#: usr/local/www/services_dhcp_edit.php:154
+#: usr/local/www/load_balancer_monitor_edit.php:112
+#: usr/local/www/services_dnsmasq_edit.php:86
+msgid "The hostname can only contain the characters A-Z, 0-9 and '-'."
+msgstr "' -'ホスト名は文字だけ、A〜Z、0〜9とを含むことができます。"
+
+#: usr/local/www/load_balancer_monitor_edit.php:118
+#: usr/local/www/load_balancer_monitor_edit.php:118
+msgid "HTTP(s) codes must be from RFC2616."
+msgstr "HTTP(S )コードはRFC2616からのものでなければなりません。"
+
+#: usr/local/www/load_balancer_monitor_edit.php:122
+#: usr/local/www/load_balancer_monitor_edit.php:122
+msgid "The path to monitor must be set."
+msgstr "監視するためのパスを設定する必要があります。"
+
+#: usr/local/www/load_balancer_monitor_edit.php:145
+#: usr/local/www/load_balancer_monitor_edit.php:145
+#, php-format
+msgid "modified '%s' monitor:"
+msgstr "修正された「 %s'モニター:"
+
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:197
+msgid "ICMP"
+msgstr "ICMP"
+
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_monitor_edit.php:268
+#: usr/local/www/load_balancer_relay_action_edit.php:186
+#: usr/local/www/load_balancer_relay_protocol_edit.php:144
+#: usr/local/www/system_advanced_admin.php:311
+#: usr/local/www/load_balancer_relay_protocol_edit.php:142
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:266
+#: usr/local/www/load_balancer_relay_protocol_edit.php:142
+#: usr/local/www/system_advanced_admin.php:311
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:266
+msgid "HTTP"
+msgstr "HTTP"
+
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_monitor_edit.php:301
+#: usr/local/www/system_advanced_admin.php:314
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:299
+#: usr/local/www/system_advanced_admin.php:314
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:299
+msgid "HTTPS"
+msgstr "HTTPS"
+
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_monitor_edit.php:335
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:333
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:333
+msgid "Send/Expect"
+msgstr "センド/期待"
+
+#: usr/local/www/load_balancer_monitor_edit.php:232
+#: usr/local/www/load_balancer_monitor_edit.php:230
+#: usr/local/www/load_balancer_monitor_edit.php:230
+msgid "Edit Load Balancer - Monitor entry"
+msgstr "編集ロードバランサ - エントリを監視"
+
+#: usr/local/www/load_balancer_monitor_edit.php:272
+#: usr/local/www/load_balancer_monitor_edit.php:305
+#: usr/local/www/load_balancer_monitor_edit.php:270
+#: usr/local/www/load_balancer_monitor_edit.php:303
+#: usr/local/www/load_balancer_monitor_edit.php:270
+#: usr/local/www/load_balancer_monitor_edit.php:303
+msgid "Path"
+msgstr "パス"
+
+#: usr/local/www/load_balancer_monitor_edit.php:278
+#: usr/local/www/load_balancer_monitor_edit.php:311
+#: usr/local/www/diag_ping.php:55 usr/local/www/diag_ping.php:90
+#: usr/local/www/services_dnsmasq.php:243
+#: usr/local/www/services_dnsmasq_edit.php:141
+#: usr/local/www/diag_traceroute.php:62 usr/local/www/diag_traceroute.php:89
+#: usr/local/www/services_rfc2136_edit.php:169
+#: usr/local/www/services_dnsmasq_edit.php:196
+#: usr/local/www/services_dnsmasq_edit.php:237
+#: usr/local/www/services_unbound.php:279
+#: usr/local/www/services_dnsmasq.php:244
+#: usr/local/www/services_dnsmasq_edit.php:197
+#: usr/local/www/services_dnsmasq_edit.php:238
+#: usr/local/www/load_balancer_monitor_edit.php:276
+#: usr/local/www/load_balancer_monitor_edit.php:309
+#: usr/local/www/diag_testport.php:60 usr/local/www/diag_testport.php:117
+#: usr/local/www/diag_traceroute.php:93 usr/local/www/services_dnsmasq.php:269
+#: usr/local/www/diag_traceroute.php:63 usr/local/www/diag_traceroute.php:99
+#: usr/local/www/diag_ping.php:57 usr/local/www/diag_ping.php:97
+#: usr/local/www/services_dnsmasq.php:282
+#: usr/local/www/services_dnsmasq.php:346 usr/local/www/diag_testport.php:60
+#: usr/local/www/diag_testport.php:117 usr/local/www/diag_traceroute.php:63
+#: usr/local/www/diag_traceroute.php:99
+#: usr/local/www/load_balancer_monitor_edit.php:276
+#: usr/local/www/load_balancer_monitor_edit.php:309
+#: usr/local/www/diag_ping.php:57 usr/local/www/diag_ping.php:97
+#: usr/local/www/services_dnsmasq_edit.php:197
+#: usr/local/www/services_dnsmasq_edit.php:238
+#: usr/local/www/services_rfc2136_edit.php:169
+#: usr/local/www/services_dnsmasq.php:346
+msgid "Host"
+msgstr "ホスト"
+
+#: usr/local/www/load_balancer_monitor_edit.php:280
+#: usr/local/www/load_balancer_monitor_edit.php:313
+#: usr/local/www/load_balancer_monitor_edit.php:278
+#: usr/local/www/load_balancer_monitor_edit.php:311
+#: usr/local/www/load_balancer_monitor_edit.php:278
+#: usr/local/www/load_balancer_monitor_edit.php:311
+msgid "Hostname for Host: header if needed."
+msgstr "ホストのホスト名:ヘッダを必要に応じて。"
+
+#: usr/local/www/load_balancer_monitor_edit.php:284
+#: usr/local/www/load_balancer_monitor_edit.php:317
+#: usr/local/www/load_balancer_monitor_edit.php:282
+#: usr/local/www/load_balancer_monitor_edit.php:315
+#: usr/local/www/load_balancer_monitor_edit.php:282
+#: usr/local/www/load_balancer_monitor_edit.php:315
+msgid "HTTP Code"
+msgstr "HTTPコード"
+
+#: usr/local/www/load_balancer_monitor_edit.php:339
+#: usr/local/www/load_balancer_monitor_edit.php:337
+#: usr/local/www/load_balancer_monitor_edit.php:337
+msgid "Send string"
+msgstr "文字列を送信"
+
+#: usr/local/www/load_balancer_monitor_edit.php:345
+#: usr/local/www/load_balancer_monitor_edit.php:343
+#: usr/local/www/load_balancer_monitor_edit.php:343
+msgid "Expect string"
+msgstr "文字列を期待する"
+
+#: usr/local/www/load_balancer_pool_edit.php:65
+#: usr/local/www/load_balancer_pool_edit.php:65
+msgid "Load Balancer: Pool:"
+msgstr "ロード·バランサ:プール:"
+
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:76
+msgid "Server List"
+msgstr "サーバーリスト"
+
+#: usr/local/www/load_balancer_pool_edit.php:83
+#: usr/local/www/load_balancer_pool_edit.php:83
+msgid "This pool name has already been used. Pool names must be unique."
+msgstr "このプール名が既に使用されています。プール名は一意でなければなりません。"
+
+#: usr/local/www/load_balancer_pool_edit.php:89
+#: usr/local/www/load_balancer_virtual_server_edit.php:92
+msgid "The port must be an integer between 1 and 65535."
+msgstr "ポートは1 〜65535の間の整数でなければなりません。"
+
+#: usr/local/www/load_balancer_pool_edit.php:93
+#: usr/local/www/load_balancer_pool_edit.php:93
+msgid "The retry value must be an integer between 1 and 65535."
+msgstr "再試行値は1 〜65535の間の整数でなければなりません。"
+
+#: usr/local/www/load_balancer_pool_edit.php:98
+#, php-format
+msgid "%s is not a valid IP address (in "enabled" list)."
+msgstr "%sは( 「有効」リスト中の)有効なIPアドレスではありません。"
+
+#: usr/local/www/load_balancer_pool_edit.php:105
+#, php-format
+msgid "%s is not a valid IP address (in "disabled" list)."
+msgstr "%sは( 「無効」リスト中の)有効なIPアドレスではありません。"
+
+#: usr/local/www/load_balancer_pool_edit.php:114
+#: usr/local/www/load_balancer_pool_edit.php:120
+#: usr/local/www/load_balancer_pool_edit.php:120
+msgid "Invalid monitor chosen."
+msgstr "無効なモニタが選択した。"
+
+#: usr/local/www/load_balancer_pool_edit.php:121
+#: usr/local/www/load_balancer_pool_edit.php:127
+#: usr/local/www/load_balancer_pool_edit.php:127
+#, php-format
+msgid " modified '%s' pool:"
+msgstr "修正された「 %s'プール:"
+
+#: usr/local/www/load_balancer_pool_edit.php:178
+#: usr/local/www/load_balancer_pool_edit.php:186
+#: usr/local/www/load_balancer_pool_edit.php:184
+#: usr/local/www/load_balancer_pool_edit.php:184
+msgid "Add/edit Load Balancer - Pool entry"
+msgstr "追加/編集ロードバランサ - プールエントリ"
+
+#: usr/local/www/load_balancer_pool_edit.php:190
+#: usr/local/www/load_balancer_pool_edit.php:198
+#: usr/local/www/load_balancer_pool_edit.php:196
+#: usr/local/www/load_balancer_pool_edit.php:196
+msgid "Load Balance"
+msgstr "負荷平衡"
+
+#: usr/local/www/load_balancer_pool_edit.php:191
+#: usr/local/www/load_balancer_pool_edit.php:199
+#: usr/local/www/load_balancer_pool_edit.php:197
+#: usr/local/www/load_balancer_pool_edit.php:197
+msgid "Manual Failover"
+msgstr "手動フェイルオーバー"
+
+#: usr/local/www/load_balancer_pool_edit.php:206
+#: usr/local/www/load_balancer_pool_edit.php:215
+#: usr/local/www/load_balancer_pool_edit.php:213
+#: usr/local/www/load_balancer_pool_edit.php:213
+msgid "This is the port your servers are listening on."
+msgstr "これは、サーバーがリッスンしているポートです。"
+
+#: usr/local/www/load_balancer_pool_edit.php:210
+#: usr/local/www/load_balancer_pool_edit.php:227
+#: usr/local/www/load_balancer_pool_edit.php:225
+#: usr/local/www/load_balancer_pool_edit.php:225
+msgid "Retry"
+msgstr "リトライ"
+
+#: usr/local/www/load_balancer_pool_edit.php:213
+#: usr/local/www/load_balancer_pool_edit.php:230
+#: usr/local/www/load_balancer_pool_edit.php:228
+#: usr/local/www/load_balancer_pool_edit.php:228
+msgid ""
+"Optionally specify how many times to retry checking a server before "
+"declaring it down."
+msgstr "それを宣言する"オプションで前にサーバーをチェックし再試行する回数を指定」 。"
+
+#: usr/local/www/load_balancer_pool_edit.php:220
+#: usr/local/www/load_balancer_pool_edit.php:237
+#: usr/local/www/load_balancer_pool_edit.php:235
+#: usr/local/www/load_balancer_pool_edit.php:235
+msgid "Add item to pool"
+msgstr "プールに項目を追加する"
+
+#: usr/local/www/load_balancer_pool_edit.php:238
+#: usr/local/www/load_balancer_pool_edit.php:255
+#: usr/local/www/load_balancer_pool_edit.php:253
+#: usr/local/www/load_balancer_pool_edit.php:253
+msgid ""
+"Please add a monitor IP address on the monitors tab if you wish to use this "
+"feature."
+msgstr "この機能を使用する場合のモニタ]タブで監視IPアドレスを追加してください。"
+
+#: usr/local/www/load_balancer_pool_edit.php:244
+#: usr/local/www/load_balancer_pool_edit.php:261
+#: usr/local/www/load_balancer_pool_edit.php:259
+#: usr/local/www/load_balancer_pool_edit.php:259
+msgid "Server IP Address"
+msgstr "サーバのIPアドレス"
+
+#: usr/local/www/load_balancer_pool_edit.php:247
+#: usr/local/www/load_balancer_pool_edit.php:264
+#: usr/local/www/load_balancer_pool_edit.php:262
+#: usr/local/www/load_balancer_pool_edit.php:262
+msgid "Add to pool"
+msgstr "プールに追加"
+
+#: usr/local/www/load_balancer_pool_edit.php:254
+#: usr/local/www/load_balancer_pool_edit.php:271
+#: usr/local/www/load_balancer_pool_edit.php:269
+#: usr/local/www/load_balancer_pool_edit.php:269
+msgid "Current Pool Members"
+msgstr "現在のプールメンバー"
+
+#: usr/local/www/load_balancer_pool_edit.php:264
+#: usr/local/www/load_balancer_pool_edit.php:281
+#: usr/local/www/load_balancer_pool_edit.php:279
+#: usr/local/www/load_balancer_pool_edit.php:279
+msgid "Pool Disabled"
+msgstr "プールバリアフリー"
+
+#: usr/local/www/load_balancer_pool_edit.php:277
+#: usr/local/www/load_balancer_pool_edit.php:300
+#: usr/local/www/load_balancer_relay_protocol_edit.php:253
+#: usr/local/www/load_balancer_pool_edit.php:294
+#: usr/local/www/load_balancer_pool_edit.php:317
+#: usr/local/www/load_balancer_relay_protocol_edit.php:251
+#: usr/local/www/load_balancer_pool_edit.php:292
+#: usr/local/www/load_balancer_pool_edit.php:315
+#: usr/local/www/load_balancer_relay_protocol_edit.php:251
+#: usr/local/www/load_balancer_pool_edit.php:292
+#: usr/local/www/load_balancer_pool_edit.php:315
+msgid "Remove"
+msgstr "削除する"
+
+#: usr/local/www/load_balancer_pool_edit.php:287
+#: usr/local/www/load_balancer_pool_edit.php:304
+#: usr/local/www/load_balancer_pool_edit.php:302
+#: usr/local/www/load_balancer_pool_edit.php:302
+msgid "Enabled (default)"
+msgstr "有効(デフォルト)"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:61
+#: usr/local/www/load_balancer_virtual_server_edit.php:61
+msgid "Load Balancer: Virtual Server:"
+msgstr "ロード·バランサ:仮想サーバー:"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:261
+#: usr/local/www/load_balancer_relay_protocol.php:100
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/load_balancer_virtual_server_edit.php:250
+#: usr/local/www/load_balancer_virtual_server_edit.php:248
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:248
+#: usr/local/www/load_balancer_relay_protocol.php:100
+msgid "Relay Protocol"
+msgstr "リレー·プロトコル"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:86
+#: usr/local/www/load_balancer_virtual_server_edit.php:86
+msgid ""
+"This virtual server name has already been used. Virtual server names must "
+"be unique."
+msgstr "「この仮想サーバー名はすでに使用されています。仮想サーバー名がなければなりません」で一意である。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:95
+#, php-format
+msgid "%s is not a valid IP address."
+msgstr "%sは有効なIPアドレスではありません。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:102
+#: usr/local/www/load_balancer_virtual_server_edit.php:104
+#: usr/local/www/load_balancer_virtual_server_edit.php:104
+#, php-format
+msgid "modified '%s' vs:"
+msgstr ": VS修正' %s'"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:104
+#: usr/local/www/load_balancer_virtual_server_edit.php:106
+#: usr/local/www/load_balancer_virtual_server_edit.php:106
+#, php-format
+msgid "created '%s' vs:"
+msgstr "VS作成' %s 」 :"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:134
+#: usr/local/www/status_lb_vs.php:56
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/status_lb_vs.php:56
+msgid "Virtual Server"
+msgstr "仮想サーバ"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:180
+#: usr/local/www/load_balancer_virtual_server_edit.php:154
+#: usr/local/www/load_balancer_virtual_server_edit.php:152
+#: usr/local/www/load_balancer_virtual_server_edit.php:152
+msgid "Edit Load Balancer - Virtual Server entry"
+msgstr "編集ロードバランサ - 仮想サーバーのエントリ"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:198
+#: usr/local/www/load_balancer_virtual_server_edit.php:172
+#: usr/local/www/load_balancer_virtual_server_edit.php:170
+#: usr/local/www/load_balancer_virtual_server_edit.php:170
+msgid ""
+"This is normally the WAN IP address that you would like the server to listen "
+"on. All connections to this IP and port will be forwarded to the pool "
+"cluster."
+msgstr "の「これは通常、サーバーが待機するようにしたいWAN IPアドレス」です。このIPとポートへのすべての接続プール」クラスタに転送されます。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:205
+#: usr/local/www/load_balancer_virtual_server_edit.php:186
+#: usr/local/www/load_balancer_virtual_server_edit.php:184
+#: usr/local/www/load_balancer_virtual_server_edit.php:184
+msgid ""
+"This is the port that the clients will connect to. All connections to this "
+"port will be forwarded to the pool cluster."
+msgstr "「これは、クライアントが接続するポートです。このへのすべての接続」ポートは、プールのクラスタに転送されます。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:209
+#: usr/local/www/load_balancer_virtual_server_edit.php:198
+#: usr/local/www/load_balancer_virtual_server_edit.php:196
+#: usr/local/www/load_balancer_virtual_server_edit.php:196
+msgid "Virtual Server Pool"
+msgstr "仮想サーバー·プール"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:212
+#: usr/local/www/load_balancer_virtual_server_edit.php:231
+#: usr/local/www/load_balancer_virtual_server_edit.php:201
+#: usr/local/www/load_balancer_virtual_server_edit.php:220
+#: usr/local/www/load_balancer_virtual_server_edit.php:199
+#: usr/local/www/load_balancer_virtual_server_edit.php:218
+#: usr/local/www/load_balancer_virtual_server_edit.php:199
+#: usr/local/www/load_balancer_virtual_server_edit.php:218
+msgid "Please add a pool on the Pools tab to use this feature."
+msgstr "この機能を使用するには、プール]タブの[プールを追加してください。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:244
+#: usr/local/www/load_balancer_virtual_server_edit.php:233
+#: usr/local/www/load_balancer_virtual_server_edit.php:231
+#: usr/local/www/load_balancer_virtual_server_edit.php:231
+msgid ""
+"This is the server that clients will be redirected to if *ALL* servers in "
+"the pool are offline."
+msgstr "プールオフラインになっている"これは、クライアントが*での* ALLのサーバーがあればにリダイレクトされ、サーバーである「 。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:279
+#: usr/local/www/status_captiveportal_test.php:92
+#: usr/local/www/load_balancer_virtual_server_edit.php:268
+#: usr/local/www/status_captiveportal_test.php:93
+#: usr/local/www/load_balancer_virtual_server_edit.php:266
+#: usr/local/www/status_captiveportal_expire.php:92
+#: usr/local/www/status_captiveportal_test.php:94
+#: usr/local/www/load_balancer_virtual_server_edit.php:266
+#: usr/local/www/status_captiveportal_expire.php:92
+#: usr/local/www/status_captiveportal_test.php:94
+msgid "Submit"
+msgstr "提出する"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:289
+#: usr/local/www/load_balancer_virtual_server_edit.php:278
+#: usr/local/www/load_balancer_virtual_server_edit.php:276
+#: usr/local/www/load_balancer_virtual_server_edit.php:276
+msgid ""
+"Don't forget to add a firewall rule for the virtual server/pool after you're "
+"finished setting it up."
+msgstr "それを設定終え「あなたがしているの後に、仮想サーバー/プールのファイアウォールルールを追加することを忘れないでください」 。"
+
+#: usr/local/www/pkg_mgr.php:70 usr/local/www/pkg_mgr.php:82
+#: usr/local/www/pkg_mgr.php:89
+#, php-format
+msgid "Unable to retrieve package info from %s. Cached data will be used."
+msgstr "%s.からパッケージ情報を取得できませんキャッシュされたデータが使用される。"
+
+#: usr/local/www/pkg_mgr.php:73 usr/local/www/pkg_mgr.php:85
+#: usr/local/www/pkg_mgr.php:92
+#, php-format
+msgid ""
+"Unable to communicate with %1$s. Please verify DNS and interface "
+"configuration, and that %2$s has functional Internet connectivity."
+msgstr "設定」は%1$sと通信できません。 DNSとのインタフェースを確認してください」 、およびその%2$s 、機能、インターネット接続を持っています。"
+
+#: usr/local/www/pkg_mgr.php:122 usr/local/www/pkg_mgr.php:216
+#: usr/local/www/pkg_mgr.php:137 usr/local/www/pkg_mgr.php:243
+#: usr/local/www/pkg_mgr.php:246 usr/local/www/pkg_mgr.php:140
+#: usr/local/www/pkg_mgr.php:249 usr/local/www/pkg_mgr.php:187
+#: usr/local/www/pkg_mgr.php:253
+msgid "There are currently no packages available for installation."
+msgstr "インストールのために利用可能なパッケージがありません。"
+
+#: usr/local/www/pkg_mgr.php:192 usr/local/www/pkg_mgr.php:228
+#: usr/local/www/pkg_mgr.php:231 usr/local/www/pkg_mgr.php:235
+msgid "platform"
+msgstr "プラットフォーム"
+
+#: usr/local/www/pkg_mgr.php:210
+msgid "Do you really want to install this package?"
+msgstr "あなたは本当にこのパッケージをインストールしますか?"
+
+#: usr/local/www/pkg_mgr_install.php:57 usr/local/www/pkg_mgr_install.php:55
+#: usr/local/www/pkg_mgr_install.php:55
+msgid "Install Package"
+msgstr "パッケージのインストール"
+
+#: usr/local/www/pkg_mgr_install.php:72 usr/local/www/pkg_mgr_install.php:70
+#: usr/local/www/pkg_mgr_install.php:70
+msgid "Available packages"
+msgstr "利用可能なパッケージ"
+
+#: usr/local/www/pkg_mgr_install.php:75 usr/local/www/pkg_mgr_install.php:73
+#: usr/local/www/pkg_mgr_install.php:73
+msgid "Installed packages"
+msgstr "インストールされたパッケージ"
+
+#: usr/local/www/pkg_mgr_install.php:76 usr/local/www/pkg_mgr_install.php:74
+#: usr/local/www/pkg_mgr_install.php:74
+msgid "Package Installer"
+msgstr "パッケージインストーラ"
+
+#: usr/local/www/pkg_mgr_install.php:124 usr/local/www/pkg_mgr_install.php:134
+#: usr/local/www/pkg_mgr_install.php:132 usr/local/www/pkg_mgr_install.php:128
+#: usr/local/www/pkg_mgr_install.php:128
+msgid "Creating restore point before package installation."
+msgstr "パッケージのインストール前に復元ポイントを作成する。"
+
+#: usr/local/www/pkg_mgr_install.php:132 usr/local/www/pkg_mgr_install.php:133
+#: usr/local/www/pkg_mgr_install.php:141 usr/local/www/pkg_mgr_install.php:142
+#: usr/local/www/pkg_mgr_install.php:139 usr/local/www/pkg_mgr_install.php:140
+#: usr/local/www/pkg_mgr_install.php:135 usr/local/www/pkg_mgr_install.php:136
+#: usr/local/www/pkg_mgr_install.php:135 usr/local/www/pkg_mgr_install.php:136
+msgid "Package deleted."
+msgstr "パッケージが削除された。"
+
+#: usr/local/www/pkg_mgr_install.php:147 usr/local/www/pkg_mgr_install.php:148
+#: usr/local/www/pkg_mgr_install.php:156 usr/local/www/pkg_mgr_install.php:157
+#: usr/local/www/pkg_mgr_install.php:154 usr/local/www/pkg_mgr_install.php:155
+#: usr/local/www/pkg_mgr_install.php:150 usr/local/www/pkg_mgr_install.php:151
+#: usr/local/www/pkg_mgr_install.php:150 usr/local/www/pkg_mgr_install.php:151
+msgid "Package reinstallation failed."
+msgstr "パッケージの再インストールに失敗しました。"
+
+#: usr/local/www/pkg_mgr_install.php:151 usr/local/www/pkg_mgr_install.php:152
+#: usr/local/www/pkg_mgr_install.php:160 usr/local/www/pkg_mgr_install.php:161
+#: usr/local/www/pkg_mgr_install.php:158 usr/local/www/pkg_mgr_install.php:159
+#: usr/local/www/pkg_mgr_install.php:154 usr/local/www/pkg_mgr_install.php:155
+#: usr/local/www/pkg_mgr_install.php:154 usr/local/www/pkg_mgr_install.php:155
+msgid "Package reinstalled."
+msgstr "パッケージには、再インストールしました。"
+
+#: usr/local/www/pkg_mgr_install.php:163 usr/local/www/pkg_mgr_install.php:172
+#: usr/local/www/pkg_mgr_install.php:170 usr/local/www/pkg_mgr_install.php:166
+#: usr/local/www/pkg_mgr_install.php:166
+msgid "installation completed."
+msgstr "インストールが完了しました。"
+
+#: usr/local/www/pkg_mgr_install.php:166 usr/local/www/pkg_mgr_install.php:175
+#: usr/local/www/pkg_mgr_install.php:173 usr/local/www/pkg_mgr_install.php:169
+#: usr/local/www/pkg_mgr_install.php:169
+#, php-format
+msgid "Could not find %s."
+msgstr "%s.が見つかりませんでした"
+
+#: usr/local/www/pkg_mgr_install.php:182 usr/local/www/pkg_mgr_install.php:183
+#: usr/local/www/pkg_mgr_install.php:191 usr/local/www/pkg_mgr_install.php:192
+#: usr/local/www/pkg_mgr_install.php:188 usr/local/www/pkg_mgr_install.php:189
+#: usr/local/www/pkg_mgr_install.php:184 usr/local/www/pkg_mgr_install.php:185
+#: usr/local/www/pkg_mgr_install.php:184 usr/local/www/pkg_mgr_install.php:185
+msgid "All packages reinstalled."
+msgstr "すべてのパッケージは、再インストールしました。"
+
+#: usr/local/www/pkg_mgr_install.php:190 usr/local/www/pkg_mgr_install.php:194
+#: usr/local/www/pkg_mgr_install.php:200 usr/local/www/pkg_mgr_install.php:204
+#: usr/local/www/pkg_mgr_install.php:199 usr/local/www/pkg_mgr_install.php:203
+#: usr/local/www/pkg_mgr_install.php:195 usr/local/www/pkg_mgr_install.php:195
+#: usr/local/www/pkg_mgr_install.php:199
+msgid "Installation of"
+msgstr "の設置"
+
+#: usr/local/www/pkg_mgr_install.php:190 usr/local/www/pkg_mgr_install.php:200
+#: usr/local/www/pkg_mgr_install.php:199 usr/local/www/pkg_mgr_install.php:195
+#: usr/local/www/pkg_mgr_install.php:195
+msgid "FAILED!"
+msgstr "FAILED !"
+
+#: usr/local/www/pkg_mgr_install.php:191 usr/local/www/pkg_mgr_install.php:201
+#: usr/local/www/pkg_mgr_install.php:200 usr/local/www/pkg_mgr_install.php:196
+#: usr/local/www/pkg_mgr_install.php:196
+msgid "Installation halted."
+msgstr "インストールが停止した。"
+
+#: usr/local/www/pkg_mgr_install.php:194 usr/local/www/pkg_mgr_install.php:204
+#: usr/local/www/pkg_mgr_install.php:203 usr/local/www/pkg_mgr_install.php:199
+#: usr/local/www/pkg_mgr_install.php:199
+msgid "completed."
+msgstr "完了しました。"
+
+#: usr/local/www/pkg_mgr_install.php:198 usr/local/www/pkg_mgr_install.php:208
+#: usr/local/www/pkg_mgr_install.php:207 usr/local/www/pkg_mgr_install.php:203
+#: usr/local/www/pkg_mgr_install.php:203
+msgid "Installation completed."
+msgstr "インストールが完了しました。"
+
+#: usr/local/www/pkg_mgr_install.php:198 usr/local/www/pkg_mgr_install.php:208
+#: usr/local/www/pkg_mgr_install.php:207 usr/local/www/pkg_mgr_install.php:203
+#: usr/local/www/pkg_mgr_install.php:203
+msgid "setup instructions"
+msgstr "セットアップ手順"
+
+#: usr/local/www/pkg_mgr_install.php:200 usr/local/www/pkg_mgr_install.php:210
+#: usr/local/www/pkg_mgr_install.php:209 usr/local/www/pkg_mgr_install.php:205
+#: usr/local/www/pkg_mgr_install.php:205
+msgid ""
+"Installation completed. Please check to make sure that the package is "
+"configured from the respective menu then start the package."
+msgstr "それぞれのメニューから構成された「インストール完了しました。パッケージがされていることを確認するためにチェックしてください」 、パッケージを起動します。"
+
+#: usr/local/www/preload.php:6
+msgid "You are not allowed to access this page."
+msgstr "あなたは、このページにアクセスすることはできません。"
+
+#: usr/local/www/progress.php:25 usr/local/www/progress.php:22
+msgid "Invalid Meter ID"
+msgstr "無効なメーター番号"
+
+#: usr/local/www/progress.php:46 usr/local/www/progress.php:43
+msgid "UPLOAD completed"
+msgstr "アップロード完了"
+
+#: usr/local/www/progress.php:58 usr/local/www/progress.php:55
+msgid "Uploading Files... Please wait..."
+msgstr "ファイルのアップロード...しばらくお待ちください..."
+
+#: usr/local/www/progress.php:68 usr/local/www/progress.php:65
+msgid "Uploading files..."
+msgstr "ファイルのアップロード..."
+
+#: usr/local/www/progress.php:87 usr/local/www/progress.php:84
+msgid "Time Remaining:"
+msgstr "残り時間:"
+
+#: usr/local/www/progress.php:88 usr/local/www/progress.php:85
+msgid "Speed:"
+msgstr "スピード:"
+
+#: usr/local/www/progress.php:88 usr/local/www/progress.php:85
+msgid "KB/sec"
+msgstr "KB /秒"
+
+#: usr/local/www/progress.php:92 usr/local/www/progress.php:89
+msgid "Uploaded:"
+msgstr "アップした人:"
+
+#: usr/local/www/progress.php:93 usr/local/www/progress.php:90
+msgid "File Size:"
+msgstr "ファイルサイズ:"
+
+#: usr/local/www/progress.php:97 usr/local/www/progress.php:94
+msgid "Completed:"
+msgstr "完成:"
+
+#: usr/local/www/diag_dns.php:34 usr/local/www/diag_dns.php:250
+#: usr/local/www/fbegin.inc:192 usr/local/www/fbegin.inc:210
+#: usr/local/www/diag_dns.php:249 usr/local/www/fbegin.inc:218
+#: usr/local/www/fbegin.inc:209 usr/local/www/diag_dns.php:266
+#: usr/local/www/diag_dns.php:34 usr/local/www/diag_dns.php:266
+#: usr/local/www/fbegin.inc:209
+msgid "DNS Lookup"
+msgstr "DNSルックアップ"
+
+#: usr/local/www/diag_dns.php:100 usr/local/www/diag_dns.php:100
+msgid "Host must be a valid hostname or IP address."
+msgstr "ホストは、有効なホスト名またはIPアドレスでなければなりません。"
+
+#: usr/local/www/diag_dns.php:110 usr/local/www/diag_dns.php:109
+#: usr/local/www/diag_dns.php:109
+msgid "No response"
+msgstr "応答なし"
+
+#: usr/local/www/diag_dns.php:143 usr/local/www/diag_dns.php:142
+#: usr/local/www/diag_dns.php:142
+msgid "No record found"
+msgstr "見つからレコードません"
+
+#: usr/local/www/diag_dns.php:158 usr/local/www/diag_dns.php:157
+#: usr/local/www/diag_dns.php:174 usr/local/www/diag_dns.php:174
+msgid "Resolve DNS hostname or IP"
+msgstr "DNSホスト名またはIPアドレスを解決する"
+
+#: usr/local/www/diag_dns.php:161 usr/local/www/system_authservers.php:162
+#: usr/local/www/system_authservers.php:185 usr/local/www/diag_dns.php:160
+#: usr/local/www/system_authservers.php:163
+#: usr/local/www/system_authservers.php:186
+#: usr/local/www/system_authservers.php:164
+#: usr/local/www/system_authservers.php:187 usr/local/www/diag_dns.php:177
+#: usr/local/www/system_authservers.php:164
+#: usr/local/www/system_authservers.php:187 usr/local/www/diag_dns.php:177
+msgid "Hostname or IP"
+msgstr "ホスト名またはIP"
+
+#: usr/local/www/diag_dns.php:203 usr/local/www/diag_dns.php:202
+#: usr/local/www/diag_dns.php:219 usr/local/www/diag_dns.php:219
+msgid "Resolution time per server"
+msgstr "サーバあたりの解決時間"
+
+#: usr/local/www/diag_dns.php:211 usr/local/www/diag_dns.php:210
+#: usr/local/www/diag_dns.php:227 usr/local/www/diag_dns.php:227
+msgid "Query time"
+msgstr "クエリ時間"
+
+#: usr/local/www/diag_dns.php:235 usr/local/www/diag_dns.php:234
+#: usr/local/www/diag_dns.php:251 usr/local/www/diag_dns.php:251
+msgid "More Information:"
+msgstr "その他の情報:"
+
+#: usr/local/www/diag_dns.php:237 usr/local/www/diag_ping.php:43
+#: usr/local/www/diag_ping.php:87 usr/local/www/diag_ping.php:119
+#: usr/local/www/fbegin.inc:200 usr/local/www/fbegin.inc:218
+#: usr/local/www/diag_dns.php:236 usr/local/www/fbegin.inc:226
+#: usr/local/www/fbegin.inc:217 usr/local/www/diag_ping.php:44
+#: usr/local/www/diag_ping.php:94 usr/local/www/diag_ping.php:141
+#: usr/local/www/diag_dns.php:253 usr/local/www/diag_ping.php:44
+#: usr/local/www/diag_ping.php:94 usr/local/www/diag_ping.php:141
+#: usr/local/www/diag_dns.php:253 usr/local/www/fbegin.inc:217
+msgid "Ping"
+msgstr "ピン"
+
+#: usr/local/www/diag_dns.php:238 usr/local/www/diag_traceroute.php:45
+#: usr/local/www/diag_traceroute.php:86 usr/local/www/diag_traceroute.php:112
+#: usr/local/www/fbegin.inc:209 usr/local/www/fbegin.inc:227
+#: usr/local/www/diag_dns.php:237 usr/local/www/fbegin.inc:236
+#: usr/local/www/diag_traceroute.php:90 usr/local/www/diag_traceroute.php:136
+#: usr/local/www/fbegin.inc:228 usr/local/www/diag_traceroute.php:46
+#: usr/local/www/diag_traceroute.php:96 usr/local/www/diag_traceroute.php:155
+#: usr/local/www/diag_dns.php:254 usr/local/www/diag_traceroute.php:46
+#: usr/local/www/diag_traceroute.php:96 usr/local/www/diag_traceroute.php:155
+#: usr/local/www/diag_dns.php:254 usr/local/www/fbegin.inc:228
+msgid "Traceroute"
+msgstr "トレースルート"
+
+#: usr/local/www/diag_dns.php:240 usr/local/www/diag_dns.php:239
+#: usr/local/www/diag_dns.php:256 usr/local/www/diag_dns.php:256
+msgid ""
+"NOTE: The following links are to external services, so their reliability "
+"cannot be guaranteed."
+msgstr ""注:以下のリンクは外部のサービスにあるため、その信頼性」は保証できません。"
+
+#: usr/local/www/diag_dns.php:241 usr/local/www/diag_dns.php:240
+#: usr/local/www/diag_dns.php:257 usr/local/www/diag_dns.php:257
+msgid "IP WHOIS @ DNS Stuff"
+msgstr "DNSのスタッフ@のIP WHOIS"
+
+#: usr/local/www/diag_dns.php:242 usr/local/www/diag_dns.php:241
+#: usr/local/www/diag_dns.php:258 usr/local/www/diag_dns.php:258
+msgid "IP Info @ DNS Stuff"
+msgstr "IP情報@ DNSのスタッフ"
+
+#: usr/local/www/reboot.php:44
+msgid " Yes "
+msgstr "はい"
+
+#: usr/local/www/reboot.php:45 usr/local/www/reboot.php:76
+#: usr/local/www/reboot.php:56 usr/local/www/reboot.php:56
+msgid "The system is rebooting now. This may take one minute."
+msgstr "システムがリブートされます。これは1分かかる場合があります。"
+
+#: usr/local/www/reboot.php:51 usr/local/www/reboot.php:48
+#: usr/local/www/reboot.php:48
+msgid "Reboot System"
+msgstr "システムを再起動"
+
+#: usr/local/www/reboot.php:59 usr/local/www/reboot.php:62
+#: usr/local/www/reboot.php:62
+msgid "Are you sure you want to reboot the system?"
+msgstr "あなたは、システムを再起動してもよろしいですか?"
+
+#: usr/local/www/restart_httpd.php:42 usr/local/www/restart_httpd.php:42
+msgid "Restarting httpd"
+msgstr "httpdのを再起動する"
+
+#: usr/local/www/restart_httpd.php:50 usr/local/www/restart_httpd.php:50
+msgid "Mounting file systems read/write"
+msgstr "ファイルシステムのマウントは読み取り/書き込み"
+
+#: usr/local/www/restart_httpd.php:53 usr/local/www/restart_httpd.php:53
+msgid "Forcing all PHP file permissions to 0755"
+msgstr "0755へのすべてのPHPファイルのパーミッションを強制的に"
+
+#: usr/local/www/restart_httpd.php:56 usr/local/www/restart_httpd.php:56
+msgid "Mounting file systems read only"
+msgstr "ファイルシステムのマウントは読み取り専用"
+
+#: usr/local/www/restart_httpd.php:59 usr/local/www/restart_httpd.php:59
+msgid "Restarting mini_httpd"
+msgstr "mini_httpdを再起動する"
+
+#: usr/local/www/edit.php:39 usr/local/www/edit.php:42
+#: usr/local/www/edit.php:41 usr/local/www/edit.php:41
+msgid "Edit file"
+msgstr "編集ファイル"
+
+#: usr/local/www/edit.php:46 usr/local/www/edit.php:62
+#: usr/local/www/edit.php:49 usr/local/www/edit.php:65
+#: usr/local/www/edit.php:48 usr/local/www/edit.php:48
+#: usr/local/www/edit.php:65
+msgid "No file name specified"
+msgstr "指定したファイル名ない"
+
+#: usr/local/www/edit.php:48 usr/local/www/edit.php:51
+#: usr/local/www/edit.php:50 usr/local/www/edit.php:50
+msgid "Loading a directory is not supported"
+msgstr "ディレクトリの読み込みはサポートされていません"
+
+#: usr/local/www/edit.php:50 usr/local/www/edit.php:53
+#: usr/local/www/edit.php:52 usr/local/www/edit.php:52
+msgid "File does not exist or is not a regular file"
+msgstr "ファイルが存在しないか、定期的なファイルではない。"
+
+#: usr/local/www/edit.php:54 usr/local/www/edit.php:57
+#: usr/local/www/edit.php:56 usr/local/www/edit.php:56
+msgid "Failed to read file"
+msgstr "ファイルの読み込みに失敗しました"
+
+#: usr/local/www/edit.php:74 usr/local/www/edit.php:77
+#: usr/local/www/edit.php:77
+msgid "Failed to write file"
+msgstr "ファイルの書き込みに失敗しました"
+
+#: usr/local/www/edit.php:76 usr/local/www/edit.php:79
+#: usr/local/www/edit.php:79
+msgid "Error while writing file"
+msgstr "エラーファイルの書き込み中に"
+
+#: usr/local/www/edit.php:78 usr/local/www/edit.php:81
+#: usr/local/www/edit.php:81
+msgid "File successfully saved"
+msgstr "保存されたファイルを正常"
+
+#: usr/local/www/edit.php:98 usr/local/www/edit.php:101
+#: usr/local/www/edit.php:101
+msgid "Loading file"
+msgstr "ロードファイル"
+
+#: usr/local/www/edit.php:117 usr/local/www/edit.php:120
+#: usr/local/www/edit.php:121 usr/local/www/edit.php:121
+msgid "File successfully loaded"
+msgstr "ロードファイルを正常"
+
+#: usr/local/www/edit.php:140 usr/local/www/edit.php:143
+#: usr/local/www/edit.php:144 usr/local/www/edit.php:144
+msgid "Saving file"
+msgstr "ファイルの保存"
+
+#: usr/local/www/edit.php:177 usr/local/www/edit.php:180
+#: usr/local/www/edit.php:181 usr/local/www/edit.php:181
+msgid "Save / Load from path"
+msgstr "パスからセーブ/ロード"
+
+#: usr/local/www/edit.php:179 usr/local/www/edit.php:182
+#: usr/local/www/edit.php:183 usr/local/www/edit.php:183
+msgid "Load"
+msgstr "ロード"
+
+#: usr/local/www/edit.php:180 usr/local/www/edit.php:183
+#: usr/local/www/edit.php:184 usr/local/www/edit.php:184
+msgid "Browse"
+msgstr "ブラウズ"
+
+#: usr/local/www/services_captiveportal.php:63
+#: usr/local/www/services_captiveportal_filemanager.php:75
+#: usr/local/www/services_captiveportal_filemanager.php:150
+#: usr/local/www/services_captiveportal_ip.php:64
+#: usr/local/www/services_captiveportal_ip.php:104
+#: usr/local/www/services_captiveportal_ip_edit.php:63
+#: usr/local/www/services_captiveportal_mac.php:63
+#: usr/local/www/services_captiveportal_mac.php:154
+#: usr/local/www/services_captiveportal_mac_edit.php:60
+#: usr/local/www/services_captiveportal_hostname.php:66
+#: usr/local/www/services_captiveportal_hostname.php:109
+#: usr/local/www/services_captiveportal_hostname_edit.php:62
+#: usr/local/www/services_captiveportal_vouchers.php:85
+#: usr/local/www/services_captiveportal_vouchers.php:403
+#: usr/local/www/services_captiveportal_vouchers_edit.php:48
+#: usr/local/www/status_captiveportal_test.php:58
+#: usr/local/www/status_captiveportal_voucher_rolls.php:57
+#: usr/local/www/status_captiveportal_vouchers.php:57
+#: usr/local/www/services_captiveportal_zones_edit.php:48
+#: usr/local/www/services_captiveportal_vouchers.php:410
+#: usr/local/www/services_captiveportal_vouchers.php:82
+#: usr/local/www/services_captiveportal_vouchers.php:423
+#: usr/local/www/services_captiveportal_vouchers_edit.php:45
+#: usr/local/www/services_captiveportal_ip.php:61
+#: usr/local/www/services_captiveportal_ip.php:102
+#: usr/local/www/services_captiveportal_hostname_edit.php:59
+#: usr/local/www/services_captiveportal_mac.php:60
+#: usr/local/www/services_captiveportal_mac.php:152
+#: usr/local/www/services_captiveportal_mac_edit.php:57
+#: usr/local/www/services_captiveportal_hostname.php:63
+#: usr/local/www/services_captiveportal_hostname.php:107
+#: usr/local/www/services_captiveportal.php:60
+#: usr/local/www/services_captiveportal_filemanager.php:71
+#: usr/local/www/services_captiveportal_filemanager.php:147
+#: usr/local/www/services_captiveportal_ip_edit.php:60
+#: usr/local/www/services_captiveportal_zones_edit.php:45
+#: usr/local/www/status_captiveportal_expire.php:58
+#: usr/local/www/services_captiveportal_vouchers.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:432
+#: usr/local/www/services_captiveportal_mac.php:162
+#: usr/local/www/services_captiveportal_ip_edit.php:60
+#: usr/local/www/services_captiveportal_zones_edit.php:45
+#: usr/local/www/services_captiveportal_ip.php:61
+#: usr/local/www/services_captiveportal_ip.php:102
+#: usr/local/www/status_captiveportal_expire.php:58
+#: usr/local/www/services_captiveportal_hostname_edit.php:59
+#: usr/local/www/services_captiveportal_vouchers.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:437
+#: usr/local/www/services_captiveportal_vouchers_edit.php:45
+#: usr/local/www/services_captiveportal_mac_edit.php:57
+#: usr/local/www/status_captiveportal_vouchers.php:57
+#: usr/local/www/services_captiveportal_hostname.php:63
+#: usr/local/www/services_captiveportal_hostname.php:107
+#: usr/local/www/services_captiveportal_filemanager.php:71
+#: usr/local/www/services_captiveportal_filemanager.php:147
+#: usr/local/www/status_captiveportal_test.php:58
+#: usr/local/www/services_captiveportal.php:60
+#: usr/local/www/services_captiveportal_mac.php:60
+#: usr/local/www/services_captiveportal_mac.php:162
+#: usr/local/www/status_captiveportal_voucher_rolls.php:57
+msgid "Captive portal"
+msgstr "キャプティブポータル"
+
+#: usr/local/www/services_captiveportal.php:146
+#: usr/local/www/services_captiveportal_zones_edit.php:61
+#: usr/local/www/services_captiveportal_zones_edit.php:99
+#: usr/local/www/services_captiveportal.php:147
+#: usr/local/www/services_captiveportal.php:153
+#: usr/local/www/services_captiveportal_zones_edit.php:59
+#: usr/local/www/services_captiveportal_zones_edit.php:101
+#: usr/local/www/services_captiveportal_zones_edit.php:97
+#: usr/local/www/services_captiveportal.php:155
+#: usr/local/www/services_captiveportal_zones_edit.php:59
+#: usr/local/www/services_captiveportal_zones_edit.php:97
+#: usr/local/www/services_captiveportal.php:155
+msgid "Zone name"
+msgstr "ゾーン名"
+
+#: usr/local/www/services_captiveportal.php:154
+#: usr/local/www/services_captiveportal.php:155
+#: usr/local/www/services_captiveportal.php:161
+#: usr/local/www/services_captiveportal.php:163
+#: usr/local/www/services_captiveportal.php:163
+#, php-format
+msgid ""
+"The captive portal cannot be used on interface %s since it is part of a "
+"bridge."
+msgstr "橋"それはの一部であるためキャプティブポータルは、インタフェース%sで使用することはできません」 。"
+
+#: usr/local/www/services_captiveportal.php:158
+#: usr/local/www/services_captiveportal.php:159
+#: usr/local/www/services_captiveportal.php:165
+#: usr/local/www/services_captiveportal.php:167
+#: usr/local/www/services_captiveportal.php:167
+#, php-format
+msgid ""
+"The captive portal cannot be used on interface %s since it is used already "
+"on %s instance."
+msgstr "%sインスタンス上で「それが既に使用されているので、キャプティブポータルは、インターフェイス%sで使用することはできません」 。"
+
+#: usr/local/www/services_captiveportal.php:166
+#: usr/local/www/services_captiveportal.php:167
+msgid "Certificate and key must be specified for HTTPS login."
+msgstr "証明書とキーは、HTTPSのログインを指定する必要があります。"
+
+#: usr/local/www/services_captiveportal.php:169
+#: usr/local/www/system_camanager.php:168
+#: usr/local/www/system_certmanager.php:168
+#: usr/local/www/system_certmanager.php:196
+#: usr/local/www/services_captiveportal.php:170
+#: usr/local/www/system_camanager.php:170
+#: usr/local/www/system_certmanager.php:199
+#: usr/local/www/system_camanager.php:170
+#: usr/local/www/system_certmanager.php:199
+msgid "This certificate does not appear to be valid."
+msgstr "この証明書は有効であると表示されません。"
+
+#: usr/local/www/services_captiveportal.php:171
+#: usr/local/www/services_captiveportal.php:172
+msgid "This intermmediate certificate does not appear to be valid."
+msgstr "このintermmediate証明書が有効であると表示されません。"
+
+#: usr/local/www/services_captiveportal.php:173
+#: usr/local/www/services_captiveportal.php:174
+msgid "This key does not appear to be valid."
+msgstr "このキーは有効であると表示されません。"
+
+#: usr/local/www/services_captiveportal.php:177
+#: usr/local/www/services_captiveportal.php:178
+#: usr/local/www/services_captiveportal.php:176
+#: usr/local/www/services_captiveportal.php:178
+msgid "The HTTPS server name must be specified for HTTPS login."
+msgstr "HTTPSサーバ名は、HTTPSのログインを指定する必要があります。"
+
+#: usr/local/www/services_captiveportal.php:183
+#: usr/local/www/services_captiveportal.php:184
+#: usr/local/www/services_captiveportal.php:182
+#: usr/local/www/services_captiveportal.php:185
+#: usr/local/www/services_captiveportal.php:185
+msgid "The timeout must be at least 1 minute."
+msgstr "タイムアウトは1分以上にする必要があります。"
+
+#: usr/local/www/services_captiveportal.php:186
+#: usr/local/www/services_captiveportal.php:187
+#: usr/local/www/services_captiveportal.php:185
+#: usr/local/www/services_captiveportal.php:203
+#: usr/local/www/services_captiveportal.php:203
+msgid "The idle timeout must be at least 1 minute."
+msgstr "アイドルタイムアウトは1分以上にする必要があります。"
+
+#: usr/local/www/services_captiveportal.php:189
+#: usr/local/www/services_captiveportal.php:190
+#: usr/local/www/services_captiveportal.php:188
+#: usr/local/www/services_captiveportal.php:206
+#: usr/local/www/services_captiveportal.php:206
+msgid "The pass-through credit count must be a number or left blank."
+msgstr "パススルークレジット数は、番号または左空白にする必要があります。"
+
+#: usr/local/www/services_captiveportal.php:192
+#: usr/local/www/services_captiveportal.php:193
+#: usr/local/www/services_captiveportal.php:191
+#: usr/local/www/services_captiveportal.php:209
+#: usr/local/www/services_captiveportal.php:209
+msgid ""
+"The waiting period to restore pass-through credits must be above 0 hours."
+msgstr "「パススルークレジットを復元するために待機期間が0時間以上でなければなりません。"
+
+#: usr/local/www/services_captiveportal.php:196
+#: usr/local/www/services_captiveportal.php:199
+#: usr/local/www/services_captiveportal.php:202
+#: usr/local/www/services_captiveportal.php:205
+#: usr/local/www/services_captiveportal_ip_edit.php:107
+#: usr/local/www/services_captiveportal.php:197
+#: usr/local/www/services_captiveportal.php:200
+#: usr/local/www/services_captiveportal.php:203
+#: usr/local/www/services_captiveportal.php:206
+#: usr/local/www/services_captiveportal.php:195
+#: usr/local/www/services_captiveportal.php:198
+#: usr/local/www/services_captiveportal.php:201
+#: usr/local/www/services_captiveportal.php:204
+#: usr/local/www/services_captiveportal_ip_edit.php:105
+#: usr/local/www/services_captiveportal_ip_edit.php:104
+#: usr/local/www/services_captiveportal.php:213
+#: usr/local/www/services_captiveportal.php:216
+#: usr/local/www/services_captiveportal.php:219
+#: usr/local/www/services_captiveportal.php:222
+#: usr/local/www/services_captiveportal_ip_edit.php:104
+#: usr/local/www/services_captiveportal.php:213
+#: usr/local/www/services_captiveportal.php:216
+#: usr/local/www/services_captiveportal.php:219
+#: usr/local/www/services_captiveportal.php:222
+#, php-format
+msgid "A valid IP address must be specified. [%s]"
+msgstr "有効なIPアドレスを指定する必要があります。 ( ( %s ) )"
+
+#: usr/local/www/services_captiveportal.php:208
+#: usr/local/www/services_captiveportal.php:211
+#: usr/local/www/services_captiveportal.php:214
+#: usr/local/www/services_captiveportal.php:217
+#: usr/local/www/services_captiveportal.php:220
+#: usr/local/www/services_captiveportal.php:209
+#: usr/local/www/services_captiveportal.php:212
+#: usr/local/www/services_captiveportal.php:215
+#: usr/local/www/services_captiveportal.php:218
+#: usr/local/www/services_captiveportal.php:221
+#: usr/local/www/services_captiveportal.php:207
+#: usr/local/www/services_captiveportal.php:210
+#: usr/local/www/services_captiveportal.php:213
+#: usr/local/www/services_captiveportal.php:216
+#: usr/local/www/services_captiveportal.php:219
+#: usr/local/www/services_captiveportal.php:225
+#: usr/local/www/services_captiveportal.php:228
+#: usr/local/www/services_captiveportal.php:231
+#: usr/local/www/services_captiveportal.php:234
+#: usr/local/www/services_captiveportal.php:237
+#: usr/local/www/services_captiveportal.php:225
+#: usr/local/www/services_captiveportal.php:228
+#: usr/local/www/services_captiveportal.php:231
+#: usr/local/www/services_captiveportal.php:234
+#: usr/local/www/services_captiveportal.php:237
+#, php-format
+msgid "A valid port number must be specified. [%s]"
+msgstr "有効なポート番号を指定する必要があります。 ( ( %s ) )"
+
+#: usr/local/www/services_captiveportal.php:223
+#: usr/local/www/services_captiveportal.php:224
+#: usr/local/www/services_captiveportal.php:222
+#: usr/local/www/services_captiveportal.php:240
+#: usr/local/www/services_captiveportal.php:240
+msgid ""
+"The maximum number of concurrent connections per client IP address may not "
+"be larger than the global maximum."
+msgstr "「クライアントIPアドレスごとの同時接続の最大数がないことが、「世界的な最大値よりも大きくなる。"
+
+#: usr/local/www/services_captiveportal.php:421
+#: usr/local/www/services_captiveportal.php:425
+#: usr/local/www/services_captiveportal.php:423
+#: usr/local/www/services_captiveportal.php:441
+#: usr/local/www/services_captiveportal.php:441
+msgid "Captive portal(s)"
+msgstr "キャプティブポータル( S )"
+
+#: usr/local/www/services_captiveportal.php:422
+#: usr/local/www/services_captiveportal_filemanager.php:151
+#: usr/local/www/services_captiveportal_ip.php:105
+#: usr/local/www/services_captiveportal_mac.php:155
+#: usr/local/www/services_captiveportal_hostname.php:110
+#: usr/local/www/services_captiveportal_vouchers.php:404
+#: usr/local/www/services_captiveportal_vouchers.php:411
+#: usr/local/www/services_captiveportal.php:426
+#: usr/local/www/services_captiveportal_vouchers.php:424
+#: usr/local/www/services_captiveportal_ip.php:103
+#: usr/local/www/services_captiveportal_mac.php:153
+#: usr/local/www/services_captiveportal_hostname.php:108
+#: usr/local/www/services_captiveportal.php:424
+#: usr/local/www/services_captiveportal_filemanager.php:148
+#: usr/local/www/services_captiveportal_vouchers.php:433
+#: usr/local/www/services_captiveportal_mac.php:163
+#: usr/local/www/services_captiveportal.php:442
+#: usr/local/www/services_captiveportal_ip.php:103
+#: usr/local/www/services_captiveportal_vouchers.php:438
+#: usr/local/www/services_captiveportal_hostname.php:108
+#: usr/local/www/services_captiveportal_filemanager.php:148
+#: usr/local/www/services_captiveportal.php:442
+#: usr/local/www/services_captiveportal_mac.php:163
+msgid "Pass-through MAC"
+msgstr "パススルーMAC"
+
+#: usr/local/www/services_captiveportal.php:423
+#: usr/local/www/services_captiveportal_filemanager.php:152
+#: usr/local/www/services_captiveportal_ip.php:106
+#: usr/local/www/services_captiveportal_mac.php:156
+#: usr/local/www/services_captiveportal_vouchers.php:405
+#: usr/local/www/services_captiveportal_vouchers.php:412
+#: usr/local/www/services_captiveportal.php:427
+#: usr/local/www/services_captiveportal_vouchers.php:425
+#: usr/local/www/services_captiveportal_ip.php:104
+#: usr/local/www/services_captiveportal_mac.php:154
+#: usr/local/www/services_captiveportal.php:425
+#: usr/local/www/services_captiveportal_filemanager.php:149
+#: usr/local/www/services_captiveportal_vouchers.php:434
+#: usr/local/www/services_captiveportal_mac.php:164
+#: usr/local/www/services_captiveportal.php:443
+#: usr/local/www/services_captiveportal_ip.php:104
+#: usr/local/www/services_captiveportal_vouchers.php:439
+#: usr/local/www/services_captiveportal_filemanager.php:149
+#: usr/local/www/services_captiveportal.php:443
+#: usr/local/www/services_captiveportal_mac.php:164
+msgid "Allowed IP addresses"
+msgstr "許可するIPアドレス"
+
+#: usr/local/www/services_captiveportal.php:424
+#: usr/local/www/services_captiveportal_filemanager.php:153
+#: usr/local/www/services_captiveportal_ip.php:107
+#: usr/local/www/services_captiveportal_mac.php:157
+#: usr/local/www/services_captiveportal_hostname.php:112
+#: usr/local/www/services_captiveportal_vouchers.php:406
+#: usr/local/www/services_captiveportal_vouchers.php:413
+#: usr/local/www/services_captiveportal.php:428
+#: usr/local/www/services_captiveportal_vouchers.php:426
+#: usr/local/www/services_captiveportal_ip.php:105
+#: usr/local/www/services_captiveportal_mac.php:155
+#: usr/local/www/services_captiveportal_hostname.php:110
+#: usr/local/www/services_captiveportal.php:426
+#: usr/local/www/services_captiveportal_filemanager.php:150
+#: usr/local/www/services_captiveportal_vouchers.php:435
+#: usr/local/www/services_captiveportal_mac.php:165
+#: usr/local/www/services_captiveportal.php:444
+#: usr/local/www/services_captiveportal_ip.php:105
+#: usr/local/www/services_captiveportal_vouchers.php:440
+#: usr/local/www/services_captiveportal_hostname.php:110
+#: usr/local/www/services_captiveportal_filemanager.php:150
+#: usr/local/www/services_captiveportal.php:444
+#: usr/local/www/services_captiveportal_mac.php:165
+msgid "Allowed Hostnames"
+msgstr "許可されたホスト名"
+
+#: usr/local/www/services_captiveportal.php:425
+#: usr/local/www/services_captiveportal.php:587
+#: usr/local/www/services_captiveportal_filemanager.php:154
+#: usr/local/www/services_captiveportal_ip.php:108
+#: usr/local/www/services_captiveportal_mac.php:158
+#: usr/local/www/services_captiveportal_hostname.php:113
+#: usr/local/www/services_captiveportal_vouchers.php:85
+#: usr/local/www/services_captiveportal_vouchers.php:407
+#: usr/local/www/status_captiveportal_vouchers.php:57
+#: usr/local/www/services_captiveportal_vouchers.php:414
+#: usr/local/www/services_captiveportal.php:429
+#: usr/local/www/services_captiveportal.php:592
+#: usr/local/www/services_captiveportal_vouchers.php:82
+#: usr/local/www/services_captiveportal_vouchers.php:427
+#: usr/local/www/services_captiveportal_ip.php:106
+#: usr/local/www/services_captiveportal_mac.php:156
+#: usr/local/www/services_captiveportal_hostname.php:111
+#: usr/local/www/services_captiveportal.php:427
+#: usr/local/www/services_captiveportal.php:590
+#: usr/local/www/services_captiveportal_filemanager.php:151
+#: usr/local/www/services_captiveportal_vouchers.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:436
+#: usr/local/www/services_captiveportal.php:584
+#: usr/local/www/services_captiveportal_mac.php:166
+#: usr/local/www/services_captiveportal.php:445
+#: usr/local/www/services_captiveportal.php:600
+#: usr/local/www/services_captiveportal_ip.php:106
+#: usr/local/www/services_captiveportal_vouchers.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:441
+#: usr/local/www/status_captiveportal_vouchers.php:57
+#: usr/local/www/services_captiveportal_hostname.php:111
+#: usr/local/www/services_captiveportal_filemanager.php:151
+#: usr/local/www/services_captiveportal.php:445
+#: usr/local/www/services_captiveportal.php:600
+#: usr/local/www/services_captiveportal_mac.php:166
+msgid "Vouchers"
+msgstr "バウチャー"
+
+#: usr/local/www/services_captiveportal.php:426
+#: usr/local/www/services_captiveportal_filemanager.php:155
+#: usr/local/www/services_captiveportal_ip.php:109
+#: usr/local/www/services_captiveportal_mac.php:159
+#: usr/local/www/services_captiveportal_hostname.php:114
+#: usr/local/www/services_captiveportal_vouchers.php:408
+#: usr/local/www/services_captiveportal_vouchers.php:415
+#: usr/local/www/services_captiveportal.php:430
+#: usr/local/www/services_captiveportal_vouchers.php:428
+#: usr/local/www/services_captiveportal_ip.php:107
+#: usr/local/www/services_captiveportal_mac.php:157
+#: usr/local/www/services_captiveportal_hostname.php:112
+#: usr/local/www/services_captiveportal.php:428
+#: usr/local/www/services_captiveportal_filemanager.php:152
+#: usr/local/www/services_captiveportal_vouchers.php:437
+#: usr/local/www/services_captiveportal_mac.php:167
+#: usr/local/www/services_captiveportal.php:446
+#: usr/local/www/services_captiveportal_ip.php:107
+#: usr/local/www/services_captiveportal_vouchers.php:442
+#: usr/local/www/services_captiveportal_hostname.php:112
+#: usr/local/www/services_captiveportal_filemanager.php:152
+#: usr/local/www/services_captiveportal.php:446
+#: usr/local/www/services_captiveportal_mac.php:167
+msgid "File Manager"
+msgstr "ファイルマネージャー"
+
+#: usr/local/www/services_captiveportal.php:436
+#: usr/local/www/services_captiveportal.php:440
+#: usr/local/www/services_captiveportal.php:438
+#: usr/local/www/services_captiveportal.php:456
+#: usr/local/www/services_captiveportal.php:456
+msgid "Enable captive portal"
+msgstr "キャプティブポータルを有効にする"
+
+#: usr/local/www/services_captiveportal.php:450
+#: usr/local/www/services_captiveportal.php:455
+#: usr/local/www/services_captiveportal.php:453
+#: usr/local/www/services_captiveportal.php:471
+#: usr/local/www/services_captiveportal.php:471
+msgid "Select the interface(s) to enable for captive portal."
+msgstr "キャプティブポータルのために有効にインターフェイスを選択します。"
+
+#: usr/local/www/services_captiveportal.php:453
+#: usr/local/www/services_captiveportal.php:458
+#: usr/local/www/services_captiveportal.php:456
+#: usr/local/www/services_captiveportal.php:474
+#: usr/local/www/services_captiveportal.php:474
+msgid "Maximum concurrent connections"
+msgstr "最大同時接続"
+
+#: usr/local/www/services_captiveportal.php:457
+#: usr/local/www/services_captiveportal.php:462
+#: usr/local/www/services_captiveportal.php:460
+#: usr/local/www/services_captiveportal.php:478
+#: usr/local/www/services_captiveportal.php:478
+msgid "per client IP address (0 = no limit)"
+msgstr "クライアントのIPアドレスごとに( 0 =制限なし)"
+
+#: usr/local/www/services_captiveportal.php:460
+msgid ""
+"This setting limits the number of concurrent connections to the captive "
+"portal HTTP(S) server. This does not set how many users can be logged in to "
+"the captive portal, but rather how many users can load the portal page or "
+"authenticate at the same time! Default is 4 connections per client IP "
+"address, with a total maximum of 16 connections."
+msgstr "ポータルHTTP(S )サーバ「この設定では、キャプティブへの同時接続数を制限します」 。これはにログインできるユーザー数は設定しません」キャプティブポータルのではなく、どのように多くのユーザーがポータル·ページをロードしたりすることができ、「同じ時間に で認証!デフォルトは16接続の合計、最大、クライアントのIP "アドレスあたり4接続です。"
+
+#: usr/local/www/services_captiveportal.php:468
+#: usr/local/www/services_captiveportal.php:475
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/system_advanced_misc.php:426
+#: usr/local/www/system_advanced_misc.php:469
+#: usr/local/www/services_captiveportal.php:473
+#: usr/local/www/services_captiveportal.php:480
+#: usr/local/www/services_captiveportal_vouchers_edit.php:92
+#: usr/local/www/system_advanced_misc.php:518
+#: usr/local/www/services_captiveportal.php:471
+#: usr/local/www/services_captiveportal.php:478
+#: usr/local/www/system_advanced_misc.php:530
+#: usr/local/www/system_advanced_misc.php:651
+#: usr/local/www/services_captiveportal.php:489
+#: usr/local/www/services_captiveportal.php:496
+#: usr/local/www/services_captiveportal_vouchers_edit.php:92
+#: usr/local/www/system_advanced_misc.php:651
+#: usr/local/www/services_captiveportal.php:489
+#: usr/local/www/services_captiveportal.php:496
+msgid "minutes"
+msgstr "分"
+
+#: usr/local/www/services_captiveportal.php:469
+#: usr/local/www/services_captiveportal.php:474
+#: usr/local/www/services_captiveportal.php:472
+#: usr/local/www/services_captiveportal.php:490
+#: usr/local/www/services_captiveportal.php:490
+msgid ""
+"Clients will be disconnected after this amount of inactivity. They may log "
+"in again immediately, though. Leave this field blank for no idle timeout."
+msgstr "「クライアントが非アクティブな状態がこの量の後に切断されます。彼らが記録されることがあり、「しかし、すぐに再度。なしアイドルタイムアウトのために、このフィールドは空白のままにします。"
+
+#: usr/local/www/services_captiveportal.php:472
+#: usr/local/www/services_captiveportal.php:477
+#: usr/local/www/services_captiveportal.php:475
+#: usr/local/www/services_captiveportal.php:493
+#: usr/local/www/services_captiveportal.php:493
+msgid "Hard timeout"
+msgstr "ハードタイムアウト"
+
+#: usr/local/www/services_captiveportal.php:476
+#: usr/local/www/services_captiveportal.php:481
+#: usr/local/www/services_captiveportal.php:479
+#: usr/local/www/services_captiveportal.php:497
+#: usr/local/www/services_captiveportal.php:497
+msgid ""
+"Clients will be disconnected after this amount of time, regardless of "
+"activity. They may log in again immediately, though. Leave this field blank "
+"for no hard timeout (not recommended unless an idle timeout is set)."
+msgstr "活性」クライアントは関係なく、この時間後に切断されます」 。彼らは、しかし、すぐに再度ログインすることができる。なしハードタイムアウトのため、このフィールドを空白にして」のままに(アイドルタイムアウトが設定されていない限りお勧めしません) 。"
+
+#: usr/local/www/services_captiveportal.php:479
+#: usr/local/www/services_captiveportal.php:484
+#: usr/local/www/services_captiveportal.php:482
+#: usr/local/www/services_captiveportal.php:500
+#: usr/local/www/services_captiveportal.php:500
+msgid "Pass-through credits allowed per MAC address"
+msgstr "MACアドレスごとに許可されるパススルークレジット"
+
+#: usr/local/www/services_captiveportal.php:482
+#: usr/local/www/services_captiveportal.php:487
+#: usr/local/www/services_captiveportal.php:485
+#: usr/local/www/services_captiveportal.php:503
+#: usr/local/www/services_captiveportal.php:503
+msgid "per client MAC address (0 or blank = none)"
+msgstr "クライアントのMACアドレスごと( 0または空白=なし)"
+
+#: usr/local/www/services_captiveportal.php:483
+#: usr/local/www/services_captiveportal.php:488
+#: usr/local/www/services_captiveportal.php:486
+#: usr/local/www/services_captiveportal.php:504
+#: usr/local/www/services_captiveportal.php:504
+msgid ""
+"This setting allows passing through the captive portal without "
+"authentication a limited number of times per MAC address. Once used up, the "
+"client can only log in with valid credentials until the waiting period "
+"specified below has expired. Recommended to set a hard timeout and/or idle "
+"timeout when using this for it to be effective."
+msgstr "認証、MACアドレスごとに限られた回数を"この設定はせずにキャプティブポータルを通過することができます」 。以下に指定の有効期限が切れた後は使い切って、 「待機期間がするまで、クライアントは、有効な資格情報を使ってログインすることができます」 。それを有効にするには、これを使用する際にハードタイムアウトおよび/またはアイドル"タイムアウトを設定することをお勧めします。"
+
+#: usr/local/www/services_captiveportal.php:486
+#: usr/local/www/services_captiveportal.php:491
+#: usr/local/www/services_captiveportal.php:489
+#: usr/local/www/services_captiveportal.php:507
+#: usr/local/www/services_captiveportal.php:507
+msgid "Waiting period to restore pass-through credits"
+msgstr "パススルークレジットを復元するために時間を待っている"
+
+#: usr/local/www/services_captiveportal.php:489
+#: usr/local/www/services_captiveportal.php:494
+#: usr/local/www/services_captiveportal.php:492
+#: usr/local/www/services_captiveportal.php:510
+#: usr/local/www/services_captiveportal.php:510
+msgid "hours"
+msgstr "営業時間"
+
+#: usr/local/www/services_captiveportal.php:490
+#: usr/local/www/services_captiveportal.php:495
+#: usr/local/www/services_captiveportal.php:493
+#: usr/local/www/services_captiveportal.php:511
+#: usr/local/www/services_captiveportal.php:511
+msgid ""
+"Clients will have their available pass-through credits restored to the "
+"original count after this amount of time since using the first one. This "
+"must be above 0 hours if pass-through credits are enabled."
+msgstr "最初のものを使用しているので、この時間後に元の数」クライアントは、利用可能なパススルークレジットに復元されます」 。パススルークレジットが有効になっている場合、これは「 0時間以上でなければなりません。"
+
+#: usr/local/www/services_captiveportal.php:493
+#: usr/local/www/services_captiveportal.php:498
+#: usr/local/www/services_captiveportal.php:496
+#: usr/local/www/services_captiveportal.php:514
+#: usr/local/www/services_captiveportal.php:514
+msgid "Reset waiting period on attempted access"
+msgstr "試みられたアクセスに時間を待ってリセット"
+
+#: usr/local/www/services_captiveportal.php:496
+#: usr/local/www/services_captiveportal.php:501
+#: usr/local/www/services_captiveportal.php:499
+#: usr/local/www/services_captiveportal.php:517
+#: usr/local/www/services_captiveportal.php:517
+msgid "Enable waiting period reset on attempted access"
+msgstr "試みられたアクセスに期間のリセットを待って有効にします"
+
+#: usr/local/www/services_captiveportal.php:497
+#: usr/local/www/services_captiveportal.php:502
+#: usr/local/www/services_captiveportal.php:500
+#: usr/local/www/services_captiveportal.php:518
+#: usr/local/www/services_captiveportal.php:518
+msgid ""
+"If enabled, the waiting period is reset to the original duration if access "
+"is attempted when all pass-through credits have already been exhausted."
+msgstr "すべてのパススルークレジットが既に尽きた時に試行されている「アクセスがあれば有効にした場合、待機期間は、元の継続時間にリセットされます」 。"
+
+#: usr/local/www/services_captiveportal.php:500
+#: usr/local/www/services_captiveportal.php:505
+#: usr/local/www/services_captiveportal.php:503
+#: usr/local/www/services_captiveportal.php:521
+#: usr/local/www/services_captiveportal.php:521
+msgid "Logout popup window"
+msgstr "ログアウトポップアップウィンドウ"
+
+#: usr/local/www/services_captiveportal.php:503
+#: usr/local/www/services_captiveportal.php:508
+#: usr/local/www/services_captiveportal.php:506
+#: usr/local/www/services_captiveportal.php:524
+#: usr/local/www/services_captiveportal.php:524
+msgid "Enable logout popup window"
+msgstr "ログアウトポップアップウィンドウを有効にする"
+
+#: usr/local/www/services_captiveportal.php:504
+#: usr/local/www/services_captiveportal.php:509
+#: usr/local/www/services_captiveportal.php:507
+#: usr/local/www/services_captiveportal.php:525
+#: usr/local/www/services_captiveportal.php:525
+msgid ""
+"If enabled, a popup window will appear when clients are allowed through the "
+"captive portal. This allows clients to explicitly disconnect themselves "
+"before the idle or hard timeout occurs."
+msgstr "キャプティブポータル「クライアントが通過を許可している場合に有効にした場合、ポップアップウィンドウが表示されます」 。これはアイドル状態またはハードタイムアウトが発生する前に、クライアントが明示的に「自分自身を切断することができます。"
+
+#: usr/local/www/services_captiveportal.php:507
+#: usr/local/www/services_captiveportal.php:512
+#: usr/local/www/services_captiveportal.php:510
+#: usr/local/www/services_captiveportal.php:528
+#: usr/local/www/services_captiveportal.php:528
+msgid "Pre-authentication redirect URL"
+msgstr "事前認証のリダイレクトURL"
+
+#: usr/local/www/services_captiveportal.php:510
+#: usr/local/www/services_captiveportal.php:515
+#: usr/local/www/services_captiveportal.php:513
+#: usr/local/www/services_captiveportal.php:531
+#: usr/local/www/services_captiveportal.php:531
+#, php-format
+msgid ""
+"Use this field to set $PORTAL_REDIRURL$ variable which can be accessed using "
+"your custom captive portal index.php page or error pages."
+msgstr "カスタムキャプティブポータルindex.phpページまたはエラーページ」を使用してアクセスすることができます $ PORTAL_REDIRURL $変数セットこのフィールドを使用する」 。"
+
+#: usr/local/www/services_captiveportal.php:514
+#: usr/local/www/services_captiveportal.php:519
+#: usr/local/www/services_captiveportal.php:517
+#: usr/local/www/services_captiveportal.php:535
+#: usr/local/www/services_captiveportal.php:535
+msgid "After authentication Redirection URL"
+msgstr "後に認証リダイレクトURL"
+
+#: usr/local/www/services_captiveportal.php:518
+#: usr/local/www/services_captiveportal.php:523
+#: usr/local/www/services_captiveportal.php:521
+#: usr/local/www/services_captiveportal.php:539
+#: usr/local/www/services_captiveportal.php:539
+msgid ""
+"If you provide a URL here, clients will be redirected to that URL instead of "
+"the one they initially tried to access after they've authenticated."
+msgstr "彼らが認証された後にアクセスするために、彼らが最初に試した1 "あなたはここにURLを指定した場合、クライアントは代わりにそのURLにリダイレクトされます」 。"
+
+#: usr/local/www/services_captiveportal.php:522
+#: usr/local/www/services_captiveportal.php:527
+#: usr/local/www/services_captiveportal.php:525
+#: usr/local/www/services_captiveportal.php:543
+#: usr/local/www/services_captiveportal.php:543
+msgid "Concurrent user logins"
+msgstr "同時ユーザログイン"
+
+#: usr/local/www/services_captiveportal.php:525
+#: usr/local/www/services_captiveportal.php:530
+#: usr/local/www/services_captiveportal.php:528
+#: usr/local/www/services_captiveportal.php:546
+#: usr/local/www/services_captiveportal.php:546
+msgid "Disable concurrent logins"
+msgstr "同時ログインを無効にする"
+
+#: usr/local/www/services_captiveportal.php:526
+#: usr/local/www/services_captiveportal.php:531
+#: usr/local/www/services_captiveportal.php:529
+#: usr/local/www/services_captiveportal.php:547
+#: usr/local/www/services_captiveportal.php:547
+msgid ""
+"If this option is set, only the most recent login per username will be "
+"active. Subsequent logins will cause machines previously logged in with the "
+"same username to be disconnected."
+msgstr "アクティブ"このオプションが設定されている場合は、ユーザー名ごとに最終ログインはなります」 。以降のログインではマシンが以前に切断される「同じユーザ名でログインが発生します。"
+
+#: usr/local/www/services_captiveportal.php:529
+#: usr/local/www/services_captiveportal.php:534
+#: usr/local/www/services_captiveportal.php:532
+#: usr/local/www/services_captiveportal.php:550
+#: usr/local/www/services_captiveportal.php:550
+msgid "MAC filtering"
+msgstr "MACフィルタリング"
+
+#: usr/local/www/services_captiveportal.php:532
+#: usr/local/www/services_captiveportal.php:537
+#: usr/local/www/services_captiveportal.php:535
+#: usr/local/www/services_captiveportal.php:553
+#: usr/local/www/services_captiveportal.php:553
+msgid "Disable MAC filtering"
+msgstr "無効にするMACフィルタリング"
+
+#: usr/local/www/services_captiveportal.php:533
+#: usr/local/www/services_captiveportal.php:538
+#: usr/local/www/services_captiveportal.php:536
+#: usr/local/www/services_captiveportal.php:554
+#: usr/local/www/services_captiveportal.php:554
+msgid ""
+"If this option is set, no attempts will be made to ensure that the MAC "
+"address of clients stays the same while they're logged in.This is required "
+"when the MAC address of the client cannot be determined (usually because "
+"there are routers between"
+msgstr "彼らはin.Thisが必要とされるログに記録している間にクライアントのアドレス同じまま"このオプションが設定されている場合、試みはMACがあることを確認するために行われることはありません""クライアントのMACアドレスを決定することができない場合(通常のため」が間のルータがあります"
+
+#: usr/local/www/services_captiveportal.php:534
+#: usr/local/www/services_captiveportal.php:539
+#: usr/local/www/services_captiveportal.php:537
+#: usr/local/www/services_captiveportal.php:555
+#: usr/local/www/services_captiveportal.php:555
+msgid "and the clients)."
+msgstr "およびクライアント) 。"
+
+#: usr/local/www/services_captiveportal.php:535
+#: usr/local/www/services_captiveportal.php:540
+#: usr/local/www/services_captiveportal.php:538
+#: usr/local/www/services_captiveportal.php:556
+#: usr/local/www/services_captiveportal.php:556
+msgid "If this is enabled, RADIUS MAC authentication cannot be used."
+msgstr "これが有効になっている場合、 RADIUS MAC認証が使用できない。"
+
+#: usr/local/www/services_captiveportal.php:538
+#: usr/local/www/services_captiveportal.php:543
+#: usr/local/www/services_captiveportal.php:541
+#: usr/local/www/services_captiveportal.php:559
+#: usr/local/www/services_captiveportal.php:559
+msgid "Pass-through MAC Auto Entry"
+msgstr "パススルーMAC自動エントリー"
+
+#: usr/local/www/services_captiveportal.php:541
+#: usr/local/www/services_captiveportal.php:546
+#: usr/local/www/services_captiveportal.php:544
+#: usr/local/www/services_captiveportal.php:562
+#: usr/local/www/services_captiveportal.php:562
+msgid "Enable Pass-through MAC automatic additions"
+msgstr "パススルーMAC自動追加を有効にする"
+
+#: usr/local/www/services_captiveportal.php:542
+#: usr/local/www/services_captiveportal.php:547
+#: usr/local/www/services_captiveportal.php:545
+#: usr/local/www/services_captiveportal.php:563
+#: usr/local/www/services_captiveportal.php:563
+msgid ""
+"If this option is set, a MAC passthrough entry is automatically added after "
+"the user has successfully authenticated. Users of that MAC address will "
+"never have to authenticate again."
+msgstr "ユーザーが正常に認証された」には、このオプションが設定されている場合、 MACパススルーエントリが後に自動的に追加されます」 。そのMACアドレスのユーザーは、 「再度認証する必要はありません。"
+
+#: usr/local/www/services_captiveportal.php:543
+#: usr/local/www/services_captiveportal.php:549
+#: usr/local/www/services_captiveportal.php:548
+#: usr/local/www/services_captiveportal.php:554
+#: usr/local/www/services_captiveportal.php:546
+#: usr/local/www/services_captiveportal.php:552
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:570
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:570
+msgid ""
+"To remove the passthrough MAC entry you either have to log in and remove it "
+"manually from the"
+msgstr "から手動で「パススルーMACエントリを削除するには、ログインして、それを削除する必要がいずれか""
+
+#: usr/local/www/services_captiveportal.php:543
+#: usr/local/www/services_captiveportal.php:549
+#: usr/local/www/services_captiveportal.php:548
+#: usr/local/www/services_captiveportal.php:554
+#: usr/local/www/services_captiveportal.php:546
+#: usr/local/www/services_captiveportal.php:552
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:570
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:570
+msgid "Pass-through MAC tab"
+msgstr "パススルーのMACタブ"
+
+#: usr/local/www/services_captiveportal.php:543
+#: usr/local/www/services_captiveportal.php:549
+#: usr/local/www/services_captiveportal.php:548
+#: usr/local/www/services_captiveportal.php:554
+#: usr/local/www/services_captiveportal.php:546
+#: usr/local/www/services_captiveportal.php:552
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:570
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:570
+msgid "or send a POST from another system to remove it."
+msgstr "またはそれを削除するには、別のシステムからのPOSTを送信します。"
+
+#: usr/local/www/services_captiveportal.php:544
+#: usr/local/www/services_captiveportal.php:549
+#: usr/local/www/services_captiveportal.php:547
+#: usr/local/www/services_captiveportal.php:565
+#: usr/local/www/services_captiveportal.php:565
+msgid ""
+"If this is enabled, RADIUS MAC authentication cannot be used. Also, the "
+"logout window will not be shown."
+msgstr "「これが有効になっている場合は、 RADIUS MAC認証を使用することはできません。また、「ログアウトウィンドウが表示されません。"
+
+#: usr/local/www/services_captiveportal.php:547
+#: usr/local/www/services_captiveportal.php:552
+#: usr/local/www/services_captiveportal.php:550
+#: usr/local/www/services_captiveportal.php:568
+#: usr/local/www/services_captiveportal.php:568
+msgid "Enable Pass-through MAC automatic addition with username"
+msgstr "パススルーMACのユーザー名で自動追加を有効にする"
+
+#: usr/local/www/services_captiveportal.php:548
+#: usr/local/www/services_captiveportal.php:553
+#: usr/local/www/services_captiveportal.php:551
+#: usr/local/www/services_captiveportal.php:569
+#: usr/local/www/services_captiveportal.php:569
+msgid ""
+"If this option is set, with the automatically MAC passthrough entry created "
+"the username, used during authentication, will be saved."
+msgstr "認証時に使用するユーザー名、 「このオプションは自動的に作成されたMACパススルーエントリと、設定されている場合は、「保存されます。"
+
+#: usr/local/www/services_captiveportal.php:553
+#: usr/local/www/services_captiveportal.php:558
+#: usr/local/www/services_captiveportal.php:556
+#: usr/local/www/services_captiveportal.php:574
+#: usr/local/www/services_captiveportal.php:574
+msgid "Per-user bandwidth restriction"
+msgstr "ユーザごとの帯域幅の制限"
+
+#: usr/local/www/services_captiveportal.php:556
+#: usr/local/www/services_captiveportal.php:561
+#: usr/local/www/services_captiveportal.php:559
+#: usr/local/www/services_captiveportal.php:577
+#: usr/local/www/services_captiveportal.php:577
+msgid "Enable per-user bandwidth restriction"
+msgstr "ユーザごとの帯域幅の制限を有効にする"
+
+#: usr/local/www/services_captiveportal.php:559
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:562
+#: usr/local/www/services_captiveportal.php:580
+#: usr/local/www/services_captiveportal.php:580
+msgid "Default download"
+msgstr "デフォルトのダウンロード"
+
+#: usr/local/www/services_captiveportal.php:563
+#: usr/local/www/services_captiveportal.php:568
+#: usr/local/www/services_captiveportal.php:566
+#: usr/local/www/services_captiveportal.php:584
+#: usr/local/www/services_captiveportal.php:584
+msgid "Default upload"
+msgstr "デフォルトのアップロード"
+
+#: usr/local/www/services_captiveportal.php:567
+#: usr/local/www/services_captiveportal.php:572
+#: usr/local/www/services_captiveportal.php:570
+#: usr/local/www/services_captiveportal.php:588
+#: usr/local/www/services_captiveportal.php:588
+msgid ""
+"If this option is set, the captive portal will restrict each user who logs "
+"in to the specified default bandwidth. RADIUS can override the default "
+"settings. Leave empty or set to 0 for no limit."
+msgstr "指定されたデフォルトの帯域幅には「このオプションが設定されている場合は、キャプティブポータルはログオンするユーザーごとに制限します」 。 RADIUSはデフォルトの "設定を上書きすることができます。制限なしに空または0のままにしておいてください。"
+
+#: usr/local/www/services_captiveportal.php:570
+#: usr/local/www/services_captiveportal.php:575
+#: usr/local/www/services_captiveportal.php:573
+msgid "PMS authentication"
+msgstr "PMS認証"
+
+#: usr/local/www/services_captiveportal.php:573
+#: usr/local/www/services_captiveportal.php:578
+#: usr/local/www/services_captiveportal.php:576
+msgid "Enable PMS authentication"
+msgstr "PMS認証を有効にする"
+
+#: usr/local/www/services_captiveportal.php:574
+#: usr/local/www/services_captiveportal.php:579
+#: usr/local/www/services_captiveportal.php:577
+msgid ""
+"If this option is set, users will be authenticated through the PMS backend "
+"if they fill the necessary information in the login page."
+msgstr "彼らは、ログインページに必要事項を記入した場合」には、このオプションが設定されている場合、ユーザーは、PMSのバックエンドを使用して認証されます」 。"
+
+#: usr/local/www/services_captiveportal.php:583
+#: usr/local/www/services_captiveportal.php:588
+#: usr/local/www/services_captiveportal.php:586
+#: usr/local/www/services_captiveportal.php:580
+#: usr/local/www/services_captiveportal.php:596
+#: usr/local/www/services_captiveportal.php:596
+msgid "No Authentication"
+msgstr "認証なし"
+
+#: usr/local/www/services_captiveportal.php:587
+#: usr/local/www/diag_ipsec.php:194
+#: usr/local/www/services_captiveportal.php:592
+#: usr/local/www/diag_ipsec.php:195
+#: usr/local/www/services_captiveportal.php:590
+#: usr/local/www/diag_ipsec.php:196
+#: usr/local/www/services_captiveportal.php:584
+#: usr/local/www/services_captiveportal.php:600
+#: usr/local/www/diag_ipsec.php:196
+#: usr/local/www/services_captiveportal.php:600
+msgid "Local"
+msgstr "ローカル"
+
+#: usr/local/www/services_captiveportal.php:587 usr/local/www/fbegin.inc:93
+#: usr/local/www/fbegin.inc:95 usr/local/www/system_usermanager.php:54
+#: usr/local/www/fbegin.inc:110 usr/local/www/fbegin.inc:112
+#: usr/local/www/services_captiveportal.php:592 usr/local/www/fbegin.inc:119
+#: usr/local/www/fbegin.inc:121 usr/local/www/services_captiveportal.php:590
+#: usr/local/www/services_captiveportal.php:584 usr/local/www/fbegin.inc:111
+#: usr/local/www/fbegin.inc:113 usr/local/www/services_captiveportal.php:600
+#: usr/local/www/services_captiveportal.php:600 usr/local/www/fbegin.inc:111
+#: usr/local/www/fbegin.inc:113 usr/local/www/system_usermanager.php:54
+msgid "User Manager"
+msgstr "ユーザーマネージャ"
+
+#: usr/local/www/services_captiveportal.php:591
+#: usr/local/www/services_captiveportal.php:596
+#: usr/local/www/services_captiveportal.php:594
+#: usr/local/www/services_captiveportal.php:612
+#: usr/local/www/services_captiveportal.php:612
+msgid "RADIUS Authentication"
+msgstr "RADIUS認証"
+
+#: usr/local/www/services_captiveportal.php:599
+#: usr/local/www/services_captiveportal.php:635
+#: usr/local/www/services_captiveportal.php:678
+#: usr/local/www/services_captiveportal.php:633
+#: usr/local/www/services_captiveportal.php:676
+#: usr/local/www/services_captiveportal.php:634
+#: usr/local/www/services_captiveportal.php:677
+#: usr/local/www/services_captiveportal.php:650
+#: usr/local/www/services_captiveportal.php:693
+#: usr/local/www/services_captiveportal.php:650
+#: usr/local/www/services_captiveportal.php:693
+msgid "Primary RADIUS server"
+msgstr "プライマリRADIUSサーバー"
+
+#: usr/local/www/services_captiveportal.php:604
+#: usr/local/www/services_captiveportal.php:640
+#: usr/local/www/services_captiveportal.php:638
+#: usr/local/www/services_captiveportal.php:639
+#: usr/local/www/services_captiveportal.php:655
+#: usr/local/www/services_captiveportal.php:655
+msgid ""
+"Enter the IP address of the RADIUS server which users of the captive portal "
+"have to authenticate against."
+msgstr "に対して認証する必要がある」キャプティブポータルのユーザーは、 RADIUSサーバのIPアドレスを入力してください "。"
+
+#: usr/local/www/services_captiveportal.php:609
+#: usr/local/www/services_captiveportal.php:645
+#: usr/local/www/services_captiveportal.php:643
+#: usr/local/www/services_captiveportal.php:644
+#: usr/local/www/services_captiveportal.php:660
+#: usr/local/www/services_captiveportal.php:660
+msgid "Leave this field blank to use the default port (1812)."
+msgstr "デフォルトポート( 1812 )を使用するには、このフィールドを空白のままにしておきます。"
+
+#: usr/local/www/services_captiveportal.php:612
+#: usr/local/www/services_captiveportal.php:632
+#: usr/local/www/services_captiveportal.php:651
+#: usr/local/www/services_captiveportal.php:670
+#: usr/local/www/services_captiveportal.php:725
+#: usr/local/www/services_captiveportal.php:648
+#: usr/local/www/services_captiveportal.php:668
+#: usr/local/www/services_captiveportal.php:690
+#: usr/local/www/services_captiveportal.php:709
+#: usr/local/www/services_captiveportal.php:767
+#: usr/local/www/services_captiveportal.php:646
+#: usr/local/www/services_captiveportal.php:666
+#: usr/local/www/services_captiveportal.php:688
+#: usr/local/www/services_captiveportal.php:707
+#: usr/local/www/services_captiveportal.php:765
+#: usr/local/www/services_captiveportal.php:647
+#: usr/local/www/services_captiveportal.php:667
+#: usr/local/www/services_captiveportal.php:689
+#: usr/local/www/services_captiveportal.php:708
+#: usr/local/www/services_captiveportal.php:663
+#: usr/local/www/services_captiveportal.php:683
+#: usr/local/www/services_captiveportal.php:705
+#: usr/local/www/services_captiveportal.php:724
+#: usr/local/www/services_captiveportal.php:663
+#: usr/local/www/services_captiveportal.php:683
+#: usr/local/www/services_captiveportal.php:705
+#: usr/local/www/services_captiveportal.php:724
+msgid "Shared secret"
+msgstr "共有秘密鍵"
+
+#: usr/local/www/services_captiveportal.php:614
+#: usr/local/www/services_captiveportal.php:650
+#: usr/local/www/services_captiveportal.php:648
+#: usr/local/www/services_captiveportal.php:649
+#: usr/local/www/services_captiveportal.php:665
+#: usr/local/www/services_captiveportal.php:665
+msgid ""
+"Leave this field blank to not use a RADIUS shared secret (not recommended)."
+msgstr "「RADIUS共有シークレットを使用しないように、このフィールドを空白のままにします(推奨されません) 。"
+
+#: usr/local/www/services_captiveportal.php:620 usr/local/www/vpn_pptp.php:440
+#: usr/local/www/services_captiveportal.php:656
+#: usr/local/www/services_captiveportal.php:697 usr/local/www/vpn_pptp.php:442
+#: usr/local/www/services_captiveportal.php:654
+#: usr/local/www/services_captiveportal.php:695
+#: usr/local/www/services_captiveportal.php:655
+#: usr/local/www/services_captiveportal.php:696 usr/local/www/vpn_pptp.php:445
+#: usr/local/www/services_captiveportal.php:671
+#: usr/local/www/services_captiveportal.php:712
+#: usr/local/www/services_captiveportal.php:671
+#: usr/local/www/services_captiveportal.php:712 usr/local/www/vpn_pptp.php:445
+msgid "Secondary RADIUS server"
+msgstr "セカンダリRADIUSサーバ"
+
+#: usr/local/www/services_captiveportal.php:625
+#: usr/local/www/services_captiveportal.php:661
+#: usr/local/www/services_captiveportal.php:659
+#: usr/local/www/services_captiveportal.php:660
+#: usr/local/www/services_captiveportal.php:676
+#: usr/local/www/services_captiveportal.php:676
+msgid ""
+"If you have a second RADIUS server, you can activate it by entering its IP "
+"address here."
+msgstr "ここでアドレス "2台目のRADIUSサーバがある場合は、そのIPアドレスを入力してアクティブにすることができます」 。"
+
+#: usr/local/www/services_captiveportal.php:639
+msgid "Tertiary RADIUS server"
+msgstr "三次RADIUSサーバー"
+
+#: usr/local/www/services_captiveportal.php:644
+#: usr/local/www/services_captiveportal.php:683
+#: usr/local/www/services_captiveportal.php:681
+#: usr/local/www/services_captiveportal.php:682
+#: usr/local/www/services_captiveportal.php:698
+#: usr/local/www/services_captiveportal.php:698
+msgid ""
+"If you have a third RADIUS server, you can activate it by entering its IP "
+"address here."
+msgstr "ここでアドレス "サードRADIUSサーバがある場合は、そのIPアドレスを入力してアクティブにすることができます」 。"
+
+#: usr/local/www/services_captiveportal.php:658
+msgid "Quaternary RADIUS server"
+msgstr "第四紀のRADIUSサーバ"
+
+#: usr/local/www/services_captiveportal.php:663
+#: usr/local/www/services_captiveportal.php:702
+#: usr/local/www/services_captiveportal.php:700
+#: usr/local/www/services_captiveportal.php:701
+#: usr/local/www/services_captiveportal.php:717
+#: usr/local/www/services_captiveportal.php:717
+msgid ""
+"If you have a fourth RADIUS server, you can activate it by entering its IP "
+"address here."
+msgstr "ここでアドレス "4番目のRADIUSサーバがある場合は、そのIPアドレスを入力してアクティブにすることができます」 。"
+
+#: usr/local/www/services_captiveportal.php:677
+#: usr/local/www/services_captiveportal.php:719
+#: usr/local/www/services_captiveportal.php:717
+#: usr/local/www/services_captiveportal.php:715
+#: usr/local/www/services_captiveportal.php:731
+#: usr/local/www/services_captiveportal.php:731
+msgid "Accounting"
+msgstr "会計"
+
+#: usr/local/www/services_captiveportal.php:682
+#: usr/local/www/services_captiveportal.php:724
+#: usr/local/www/services_captiveportal.php:722
+#: usr/local/www/services_captiveportal.php:720
+#: usr/local/www/services_captiveportal.php:736
+#: usr/local/www/services_captiveportal.php:736
+msgid "send RADIUS accounting packets"
+msgstr "RADIUSアカウンティングパケットを送信"
+
+#: usr/local/www/services_captiveportal.php:683
+#: usr/local/www/services_captiveportal.php:725
+#: usr/local/www/services_captiveportal.php:723
+#: usr/local/www/services_captiveportal.php:721
+#: usr/local/www/services_captiveportal.php:737
+#: usr/local/www/services_captiveportal.php:737
+msgid ""
+"If this is enabled, RADIUS accounting packets will be sent to the primary "
+"RADIUS server."
+msgstr "RADIUSサーバは「これが有効になっている場合は、 RADIUSアカウンティングパケットがプライマリーに送信されます」 。"
+
+#: usr/local/www/services_captiveportal.php:686
+#: usr/local/www/services_captiveportal.php:728
+#: usr/local/www/services_captiveportal.php:726
+#: usr/local/www/services_captiveportal.php:724
+#: usr/local/www/services_captiveportal.php:740
+#: usr/local/www/services_captiveportal.php:740
+msgid "Accounting port"
+msgstr "アカウンティングポート"
+
+#: usr/local/www/services_captiveportal.php:688
+#: usr/local/www/services_captiveportal.php:730
+#: usr/local/www/services_captiveportal.php:728
+#: usr/local/www/services_captiveportal.php:726
+#: usr/local/www/services_captiveportal.php:742
+#: usr/local/www/services_captiveportal.php:742
+msgid "Leave blank to use the default port (1813)."
+msgstr "デフォルトのポート( 1813 )を使用するように空白のままにします。"
+
+#: usr/local/www/services_captiveportal.php:694
+#: usr/local/www/services_captiveportal.php:736
+#: usr/local/www/services_captiveportal.php:734
+#: usr/local/www/services_captiveportal.php:746
+#: usr/local/www/services_captiveportal.php:762
+#: usr/local/www/services_captiveportal.php:762
+msgid "Reauthentication"
+msgstr "再認証"
+
+#: usr/local/www/services_captiveportal.php:699
+#: usr/local/www/services_captiveportal.php:741
+#: usr/local/www/services_captiveportal.php:739
+#: usr/local/www/services_captiveportal.php:748
+#: usr/local/www/services_captiveportal.php:764
+#: usr/local/www/services_captiveportal.php:764
+msgid "Reauthenticate connected users every minute"
+msgstr "接続中のユーザ毎分再認証"
+
+#: usr/local/www/services_captiveportal.php:700
+#: usr/local/www/services_captiveportal.php:742
+#: usr/local/www/services_captiveportal.php:740
+#: usr/local/www/services_captiveportal.php:749
+#: usr/local/www/services_captiveportal.php:765
+#: usr/local/www/services_captiveportal.php:765
+msgid ""
+"If reauthentication is enabled, Access-Requests will be sent to the RADIUS "
+"server for each user that is logged in every minute. If an Access-Reject is "
+"received for a user, that user is disconnected from the captive portal "
+"immediately."
+msgstr "毎分ログインしているユーザーごとにサーバー"再認証が有効になっている場合は、Access -要求は、RADIUSに送信されます」 。アクセス拒否された場合、すぐに「利用者のために受信すると、そのユーザーは、キャプティブポータルから切断されている」 。"
+
+#: usr/local/www/services_captiveportal.php:704
+#: usr/local/www/services_captiveportal.php:746
+#: usr/local/www/services_captiveportal.php:744
+#: usr/local/www/services_captiveportal.php:732
+#: usr/local/www/services_captiveportal.php:748
+#: usr/local/www/services_captiveportal.php:748
+msgid "Accounting updates"
+msgstr "会計のアップデート"
+
+#: usr/local/www/services_captiveportal.php:706
+#: usr/local/www/services_captiveportal.php:748
+#: usr/local/www/services_captiveportal.php:746
+#: usr/local/www/services_captiveportal.php:734
+#: usr/local/www/services_captiveportal.php:750
+#: usr/local/www/services_captiveportal.php:750
+msgid "no accounting updates"
+msgstr "アカウンティングアップデートません"
+
+#: usr/local/www/services_captiveportal.php:707
+#: usr/local/www/services_captiveportal.php:749
+#: usr/local/www/services_captiveportal.php:747
+#: usr/local/www/services_captiveportal.php:735
+#: usr/local/www/services_captiveportal.php:751
+#: usr/local/www/services_captiveportal.php:751
+msgid "stop/start accounting"
+msgstr "停止/アカウンティング開始"
+
+#: usr/local/www/services_captiveportal.php:708
+#: usr/local/www/services_captiveportal.php:750
+#: usr/local/www/services_captiveportal.php:748
+#: usr/local/www/services_captiveportal.php:736
+#: usr/local/www/services_captiveportal.php:752
+#: usr/local/www/services_captiveportal.php:752
+msgid "interim update"
+msgstr "中間更新"
+
+#: usr/local/www/services_captiveportal.php:715
+#: usr/local/www/services_captiveportal.php:757
+#: usr/local/www/services_captiveportal.php:755
+#: usr/local/www/services_captiveportal.php:753
+#: usr/local/www/services_captiveportal.php:769
+#: usr/local/www/services_captiveportal.php:769
+msgid "RADIUS MAC authentication"
+msgstr "RADIUS MAC認証"
+
+#: usr/local/www/services_captiveportal.php:720
+#: usr/local/www/services_captiveportal.php:762
+#: usr/local/www/services_captiveportal.php:760
+#: usr/local/www/services_captiveportal.php:755
+#: usr/local/www/services_captiveportal.php:771
+#: usr/local/www/services_captiveportal.php:771
+msgid "Enable RADIUS MAC authentication"
+msgstr "RADIUS MAC認証を有効にする"
+
+#: usr/local/www/services_captiveportal.php:721
+#: usr/local/www/services_captiveportal.php:763
+#: usr/local/www/services_captiveportal.php:761
+#: usr/local/www/services_captiveportal.php:756
+#: usr/local/www/services_captiveportal.php:772
+#: usr/local/www/services_captiveportal.php:772
+msgid ""
+"If this option is enabled, the captive portal will try to authenticate users "
+"by sending their MAC address as the username and the password entered below "
+"to the RADIUS server."
+msgstr "ユーザ名とRADIUSサーバに「下の入力されたパスワードなどのMACアドレスを送信することで、 "このオプションを有効にすると、キャプティブポータルはユーザーを認証しようとします」 。"
+
+#: usr/local/www/services_captiveportal.php:732
+#: usr/local/www/services_captiveportal.php:774
+#: usr/local/www/services_captiveportal.php:772
+#: usr/local/www/services_captiveportal.php:743
+#: usr/local/www/services_captiveportal.php:759
+#: usr/local/www/services_captiveportal.php:759
+msgid "RADIUS options"
+msgstr "RADIUSのオプション"
+
+#: usr/local/www/services_captiveportal.php:736
+#: usr/local/www/services_captiveportal.php:778
+#: usr/local/www/services_captiveportal.php:776
+#: usr/local/www/services_captiveportal.php:764
+#: usr/local/www/services_captiveportal.php:780
+#: usr/local/www/services_captiveportal.php:780
+msgid "RADIUS NAS IP attribute"
+msgstr "RADIUSのNAS IPアトリビュート"
+
+#: usr/local/www/services_captiveportal.php:766
+#: usr/local/www/services_captiveportal.php:808
+#: usr/local/www/services_captiveportal.php:806
+#: usr/local/www/services_captiveportal.php:794
+#: usr/local/www/services_captiveportal.php:810
+#: usr/local/www/services_captiveportal.php:810
+msgid "Choose the IP to use for calling station attribute."
+msgstr "駅属性を呼び出すために使用するIPを選択します。"
+
+#: usr/local/www/services_captiveportal.php:771
+#: usr/local/www/services_captiveportal.php:813
+#: usr/local/www/services_captiveportal.php:811
+#: usr/local/www/services_captiveportal.php:799
+#: usr/local/www/services_captiveportal.php:815
+#: usr/local/www/services_captiveportal.php:815
+msgid "Session-Timeout"
+msgstr "セッションタイムアウト"
+
+#: usr/local/www/services_captiveportal.php:772
+#: usr/local/www/services_captiveportal.php:814
+#: usr/local/www/services_captiveportal.php:812
+#: usr/local/www/services_captiveportal.php:800
+#: usr/local/www/services_captiveportal.php:816
+#: usr/local/www/services_captiveportal.php:816
+msgid "Use RADIUS Session-Timeout attributes"
+msgstr "RADIUSを使用セッションタイムアウト属性"
+
+#: usr/local/www/services_captiveportal.php:773
+#: usr/local/www/services_captiveportal.php:815
+#: usr/local/www/services_captiveportal.php:813
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:817
+#: usr/local/www/services_captiveportal.php:817
+msgid ""
+"When this is enabled, clients will be disconnected after the amount of time "
+"retrieved from the RADIUS Session-Timeout attribute."
+msgstr "RADIUSセッションタイムアウト属性から取得した「これを有効にすると、クライアントは、時間の経過後に切断されます」 。"
+
+#: usr/local/www/services_captiveportal.php:789
+#: usr/local/www/services_captiveportal.php:831
+#: usr/local/www/services_captiveportal.php:829
+#: usr/local/www/services_captiveportal.php:817
+#: usr/local/www/services_captiveportal.php:833
+#: usr/local/www/services_captiveportal.php:833
+#, php-format
+msgid ""
+"If RADIUS type is set to Cisco, in Access-Requests the value of Calling-"
+"Station-Id will be set to the client's IP address and the Called-Station-Id "
+"to the client's MAC address. Default behavior is Calling-Station-Id = "
+"client's MAC address and Called-Station-Id = %s's WAN IP address."
+msgstr "「RADIUSタイプはアクセス·リクエストの値に、シスコに設定されている場合は呼び出し - 「ステーションIDは、クライアントのIPアドレスと呼ばれ駅のイド」は、クライアントのMACアドレスに設定されます。デフォルトの動作は、発呼局であり、 -ID = "クライアントのMACアドレスと呼ばれ駅のイド= %sのWAN IPアドレス。"
+
+#: usr/local/www/services_captiveportal.php:796
+#: usr/local/www/services_captiveportal.php:838
+#: usr/local/www/services_captiveportal.php:836
+#: usr/local/www/services_captiveportal.php:834
+#: usr/local/www/services_captiveportal.php:850
+#: usr/local/www/services_captiveportal.php:850
+msgid "MAC address format"
+msgstr "MACアドレス形式"
+
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:843
+msgid "singledash"
+msgstr "singledash"
+
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:843
+msgid "ietf"
+msgstr "IETF"
+
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:843
+msgid "cisco"
+msgstr "シスコ"
+
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:843
+msgid "unformatted"
+msgstr "未フォーマットの"
+
+#: usr/local/www/services_captiveportal.php:810
+#: usr/local/www/services_captiveportal.php:852
+#: usr/local/www/services_captiveportal.php:850
+#: usr/local/www/services_captiveportal.php:849
+#: usr/local/www/services_captiveportal.php:865
+#: usr/local/www/services_captiveportal.php:865
+msgid ""
+"This option changes the MAC address format used in the whole RADIUS system. "
+"Change this if you also"
+msgstr ""このオプションは、全体のRADIUSシステムで使用されるMACアドレス形式が変更されます。 「あなたもあれば、これを変更する"
+
+#: usr/local/www/services_captiveportal.php:811
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/services_captiveportal.php:851
+#: usr/local/www/services_captiveportal.php:850
+#: usr/local/www/services_captiveportal.php:866
+#: usr/local/www/services_captiveportal.php:866
+msgid "need to change the username format for RADIUS MAC authentication."
+msgstr "RADIUS MAC認証用のユーザー名の形式を変更する必要があります。"
+
+#: usr/local/www/services_captiveportal.php:812
+#: usr/local/www/services_captiveportal.php:854
+#: usr/local/www/services_captiveportal.php:852
+#: usr/local/www/services_captiveportal.php:851
+#: usr/local/www/services_captiveportal.php:867
+#: usr/local/www/services_captiveportal.php:867
+msgid "default:"
+msgstr "デフォルト:"
+
+#: usr/local/www/services_captiveportal.php:813
+#: usr/local/www/services_captiveportal.php:855
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/services_captiveportal.php:852
+#: usr/local/www/services_captiveportal.php:868
+#: usr/local/www/services_captiveportal.php:868
+msgid "singledash:"
+msgstr "singledash :"
+
+#: usr/local/www/services_captiveportal.php:814
+#: usr/local/www/services_captiveportal.php:856
+#: usr/local/www/services_captiveportal.php:854
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/services_captiveportal.php:869
+#: usr/local/www/services_captiveportal.php:869
+msgid "ietf:"
+msgstr "IETF :"
+
+#: usr/local/www/services_captiveportal.php:815
+#: usr/local/www/services_captiveportal.php:857
+#: usr/local/www/services_captiveportal.php:855
+#: usr/local/www/services_captiveportal.php:854
+#: usr/local/www/services_captiveportal.php:870
+#: usr/local/www/services_captiveportal.php:870
+msgid "cisco:"
+msgstr "シスコ:"
+
+#: usr/local/www/services_captiveportal.php:816
+#: usr/local/www/services_captiveportal.php:858
+#: usr/local/www/services_captiveportal.php:856
+#: usr/local/www/services_captiveportal.php:855
+#: usr/local/www/services_captiveportal.php:871
+#: usr/local/www/services_captiveportal.php:871
+msgid "unformatted:"
+msgstr "フォーマットされていない:"
+
+#: usr/local/www/services_captiveportal.php:819
+#: usr/local/www/services_captiveportal.php:861
+#: usr/local/www/services_captiveportal.php:859
+#: usr/local/www/services_captiveportal.php:877
+#: usr/local/www/services_captiveportal.php:877
+msgid "HTTPS login"
+msgstr "HTTPSのログイン"
+
+#: usr/local/www/services_captiveportal.php:822
+#: usr/local/www/services_captiveportal.php:864
+#: usr/local/www/services_captiveportal.php:862
+#: usr/local/www/services_captiveportal.php:880
+#: usr/local/www/services_captiveportal.php:880
+msgid "Enable HTTPS login"
+msgstr "HTTPSのログインを可能にする"
+
+#: usr/local/www/services_captiveportal.php:823
+#: usr/local/www/services_captiveportal.php:865
+msgid ""
+"If enabled, the username and password will be transmitted over an HTTPS "
+"connection to protect against eavesdroppers. A server name, certificate and "
+"matching private key must also be specified below."
+msgstr "盗聴者から保護するための接続」を有効にすると、ユーザー名とパスワードは、HTTPSを介して送信されます」 。サーバー名、証明書と「一致する秘密鍵は、以下に指定する必要があります。"
+
+#: usr/local/www/services_captiveportal.php:826
+#: usr/local/www/services_captiveportal.php:868
+#: usr/local/www/services_captiveportal.php:866
+#: usr/local/www/services_captiveportal.php:884
+#: usr/local/www/services_captiveportal.php:884
+msgid "HTTPS server name"
+msgstr "HTTPSサーバ名"
+
+#: usr/local/www/services_captiveportal.php:829
+#: usr/local/www/services_captiveportal.php:871
+#: usr/local/www/services_captiveportal.php:869
+#: usr/local/www/services_captiveportal.php:887
+#: usr/local/www/services_captiveportal.php:887
+#, php-format
+msgid ""
+"This name will be used in the form action for the HTTPS POST and should "
+"match the Common Name (CN) in your certificate (otherwise, the client "
+"browser will most likely display a security warning). Make sure captive "
+"portal clients can resolve this name in DNS and verify on the client that "
+"the IP resolves to the correct interface IP on %s."
+msgstr "「この名前は、HTTPS POSTのフォームアクションで使用され、必要があります"あなたの証明書の共通名(CN )と一致する(そうでなければ、クライアントの「ブラウザ最も可能性の高いセキュリティ警告が表示されます) 。必ず虜」ポータルのクライアントをすることができDNSにこの名前を解決し、 IPが%s.上の正しいインターフェイスIPに解決される」ことをクライアントに確認してください"
+
+#: usr/local/www/services_captiveportal.php:832
+#: usr/local/www/services_captiveportal.php:874
+msgid "HTTPS certificate"
+msgstr "HTTPS証明書"
+
+#: usr/local/www/services_captiveportal.php:836
+#: usr/local/www/services_captiveportal.php:878
+msgid "Paste a signed certificate in X.509 PEM format here."
+msgstr "ここで、X.509 PEM形式の署名付き証明書を貼り付けます。"
+
+#: usr/local/www/services_captiveportal.php:839
+#: usr/local/www/services_captiveportal.php:881
+msgid "HTTPS private key"
+msgstr "HTTPSの秘密鍵"
+
+#: usr/local/www/services_captiveportal.php:843
+#: usr/local/www/services_captiveportal.php:885
+msgid "Paste an RSA private key in PEM format here."
+msgstr "ここにPEM形式のRSA秘密鍵を貼り付けます。"
+
+#: usr/local/www/services_captiveportal.php:846
+#: usr/local/www/services_captiveportal.php:888
+msgid "HTTPS intermediate certificate"
+msgstr "HTTPSの中間証明書"
+
+#: usr/local/www/services_captiveportal.php:850
+#: usr/local/www/system_camanager.php:406
+#: usr/local/www/system_certmanager.php:515
+#: usr/local/www/system_certmanager.php:614
+#: usr/local/www/services_captiveportal.php:892
+#: usr/local/www/system_camanager.php:413
+#: usr/local/www/system_certmanager.php:623
+#: usr/local/www/system_certmanager.php:624
+#: usr/local/www/system_camanager.php:413
+#: usr/local/www/system_certmanager.php:624
+msgid "Paste a certificate in X.509 PEM format here."
+msgstr "ここで、X.509 PEM形式の証明書を貼り付けます。"
+
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/services_captiveportal.php:895
+#: usr/local/www/services_captiveportal.php:891
+#: usr/local/www/services_captiveportal.php:893
+#: usr/local/www/services_captiveportal.php:909
+#: usr/local/www/services_captiveportal.php:909
+msgid "Portal page contents"
+msgstr "ポータルページの内容"
+
+#: usr/local/www/services_captiveportal.php:865
+#: usr/local/www/services_captiveportal.php:899
+#: usr/local/www/services_captiveportal.php:913
+#: usr/local/www/services_captiveportal.php:910
+#: usr/local/www/services_captiveportal.php:944
+#: usr/local/www/services_captiveportal.php:958
+#: usr/local/www/services_captiveportal.php:906
+#: usr/local/www/services_captiveportal.php:940
+#: usr/local/www/services_captiveportal.php:954
+#: usr/local/www/services_captiveportal.php:908
+#: usr/local/www/services_captiveportal.php:942
+#: usr/local/www/services_captiveportal.php:956
+#: usr/local/www/services_captiveportal.php:924
+#: usr/local/www/services_captiveportal.php:972
+#: usr/local/www/services_captiveportal.php:924
+#: usr/local/www/services_captiveportal.php:958
+#: usr/local/www/services_captiveportal.php:972
+msgid "View current page"
+msgstr "現在のページを表示"
+
+#: usr/local/www/services_captiveportal.php:871
+#: usr/local/www/services_captiveportal.php:916
+#: usr/local/www/services_captiveportal.php:912
+#: usr/local/www/services_captiveportal.php:914
+#: usr/local/www/services_captiveportal.php:930
+#: usr/local/www/services_captiveportal.php:930
+#, php-format
+msgid ""
+"Upload an HTML/PHP file for the portal page here (leave blank to keep the "
+"current one). Make sure to include a form (POST to %1$s) with a submit "
+"button (%2$s) and a hidden field with %3$s and %4$s. Include the %5$s and "
+"%6$s and/or %7$s input fields if authentication is enabled, otherwise it "
+"will always fail."
+msgstr "「 (現在の1に保つために、空白のままに)ここで、ポータル·ページのHTML / PHPファイルのアップロード」 。送信」ボタン( %2$s )を持つフォーム(は%1$sに対してPOST )と $ S %3$sおよび% 4で隠しフィールドが含まれていることを確認しますが。 $ S % 5が含まれており、 "認証が有効になっている場合は、% 6 $ sおよび/または% 7 $ sの入力フィールド 、それ以外の場合は、「常に失敗します。"
+
+#: usr/local/www/services_captiveportal.php:882
+#: usr/local/www/services_captiveportal.php:927
+#: usr/local/www/services_captiveportal.php:923
+#: usr/local/www/services_captiveportal.php:925
+#: usr/local/www/services_captiveportal.php:941
+#: usr/local/www/services_captiveportal.php:941
+msgid "Example code for the form:"
+msgstr "フォームのサンプルコード:"
+
+#: usr/local/www/services_captiveportal.php:894
+#: usr/local/www/services_captiveportal.php:939
+#: usr/local/www/services_captiveportal.php:935
+#: usr/local/www/services_captiveportal.php:937
+#: usr/local/www/services_captiveportal.php:953
+#: usr/local/www/services_captiveportal.php:953
+msgid "error page"
+msgstr "エラーページ"
+
+#: usr/local/www/services_captiveportal.php:895
+#: usr/local/www/services_captiveportal.php:909
+#: usr/local/www/services_captiveportal.php:940
+#: usr/local/www/services_captiveportal.php:954
+#: usr/local/www/services_captiveportal.php:936
+#: usr/local/www/services_captiveportal.php:950
+#: usr/local/www/services_captiveportal.php:938
+#: usr/local/www/services_captiveportal.php:952
+#: usr/local/www/services_captiveportal.php:968
+#: usr/local/www/services_captiveportal.php:954
+#: usr/local/www/services_captiveportal.php:968
+msgid "contents"
+msgstr "中身"
+
+#: usr/local/www/services_captiveportal.php:903
+#: usr/local/www/services_captiveportal.php:948
+#: usr/local/www/services_captiveportal.php:944
+#: usr/local/www/services_captiveportal.php:946
+#: usr/local/www/services_captiveportal.php:962
+#: usr/local/www/services_captiveportal.php:962
+msgid ""
+"The contents of the HTML/PHP file that you upload here are displayed when an "
+"authentication error occurs. You may include"
+msgstr "認証エラーが発生」したときに、ここでアップロードしたHTML / PHPファイルの内容が表示されます」 。あなたが含まれる"
+
+#: usr/local/www/services_captiveportal.php:904
+#: usr/local/www/services_captiveportal.php:949
+#: usr/local/www/services_captiveportal.php:945
+#: usr/local/www/services_captiveportal.php:947
+#: usr/local/www/services_captiveportal.php:963
+#: usr/local/www/services_captiveportal.php:963
+msgid ""
+"which will be replaced by the error or reply messages from the RADIUS "
+"server, if any."
+msgstr ""どのエラーに置き換えられますかRADIUSからのメッセージの返信」があれば、サーバ。"
+
+#: usr/local/www/services_captiveportal.php:907 usr/local/www/fbegin.inc:86
+#: usr/local/www/fbegin.inc:103 usr/local/www/services_captiveportal.php:952
+#: usr/local/www/fbegin.inc:112 usr/local/www/services_captiveportal.php:948
+#: usr/local/www/services_captiveportal.php:950 usr/local/www/fbegin.inc:104
+#: usr/local/www/services_captiveportal.php:966
+#: usr/local/www/services_captiveportal.php:966 usr/local/www/fbegin.inc:104
+msgid "Logout"
+msgstr "ログアウト"
+
+#: usr/local/www/services_captiveportal.php:917
+#: usr/local/www/services_captiveportal.php:962
+#: usr/local/www/services_captiveportal.php:958
+#: usr/local/www/services_captiveportal.php:960
+#: usr/local/www/services_captiveportal.php:976
+#: usr/local/www/services_captiveportal.php:976
+msgid ""
+"The contents of the HTML/PHP file that you upload here are displayed on "
+"authentication success when the logout popup is enabled."
+msgstr "ログアウトポップアップが有効な場合に認証成功」は、ここでアップロードしたHTML / PHPファイルの内容が上に表示される"。"
+
+#: usr/local/www/services_captiveportal.php:930
+#: usr/local/www/services_captiveportal.php:975
+#: usr/local/www/services_captiveportal.php:971
+#: usr/local/www/services_captiveportal.php:973
+#: usr/local/www/services_captiveportal.php:989
+#: usr/local/www/services_captiveportal.php:989
+msgid ""
+"Changing any settings on this page will disconnect all clients! Don't forget "
+"to enable the DHCP server on your captive portal interface! Make sure that "
+"the default/maximum DHCP lease time is higher than the timeout entered on "
+"this page. Also, the DNS forwarder needs to be enabled for DNS lookups by "
+"unauthenticated clients to work."
+msgstr "「このページの設定を変更すると、すべてのクライアントが切断されます。 !忘れてはいけない"あなたのキャプティブポータルインタフェース 上のDHCPサーバを有効にするために!このページの「デフォルト/最大DHCPリース時間がで入力されたタイムアウトよりも高くなっている」ことを確認してください。また、 DNSフォワーダが動作するように認証されていないクライアント」でDNSルックアップを有効にする必要があります。"
+
+#: usr/local/www/services_captiveportal_filemanager.php:101
+#: usr/local/www/services_captiveportal_filemanager.php:98
+#: usr/local/www/services_captiveportal_filemanager.php:98
+#, php-format
+msgid "A file with the name '%s' already exists."
+msgstr "名' %s'を持つファイルがすでに存在しています。"
+
+#: usr/local/www/services_captiveportal_filemanager.php:108
+#: usr/local/www/services_captiveportal_filemanager.php:105
+#: usr/local/www/services_captiveportal_filemanager.php:105
+msgid "The total size of all files uploaded may not exceed "
+msgstr "アップロードされたすべてのファイルの合計サイズが超えてはならない"
+
+#: usr/local/www/services_captiveportal_filemanager.php:163
+#: usr/local/www/system_firmware_restorefullbackup.php:141
+#: usr/local/www/services_captiveportal_filemanager.php:160
+#: usr/local/www/diag_system_pftop.php:140
+#: usr/local/www/diag_system_pftop.php:159
+#: usr/local/www/diag_system_pftop.php:140
+#: usr/local/www/diag_system_pftop.php:159
+#: usr/local/www/services_captiveportal_filemanager.php:160
+#: usr/local/www/system_firmware_restorefullbackup.php:141
+msgid "Size"
+msgstr "サイズ"
+
+#: usr/local/www/services_captiveportal_filemanager.php:168
+#: usr/local/www/services_captiveportal_filemanager.php:207
+#: usr/local/www/services_captiveportal_filemanager.php:165
+#: usr/local/www/services_captiveportal_filemanager.php:204
+#: usr/local/www/services_captiveportal_filemanager.php:165
+#: usr/local/www/services_captiveportal_filemanager.php:204
+msgid "add file"
+msgstr "ファイルを追加"
+
+#: usr/local/www/services_captiveportal_filemanager.php:179
+#: usr/local/www/services_captiveportal_filemanager.php:176
+#: usr/local/www/services_captiveportal_filemanager.php:176
+msgid "Do you really want to delete this file?"
+msgstr "あなたは本当にこのファイルを削除しますか?"
+
+#: usr/local/www/services_captiveportal_filemanager.php:179
+#: usr/local/www/services_captiveportal_filemanager.php:176
+#: usr/local/www/services_captiveportal_filemanager.php:176
+msgid "delete file"
+msgstr "ファイルを削除する"
+
+#: usr/local/www/services_captiveportal_filemanager.php:186
+#: usr/local/www/services_captiveportal_filemanager.php:183
+#: usr/local/www/services_captiveportal_filemanager.php:183
+msgid "TOTAL"
+msgstr "合計"
+
+#: usr/local/www/services_captiveportal_filemanager.php:197
+#: usr/local/www/services_captiveportal_filemanager.php:194
+#: usr/local/www/services_captiveportal_filemanager.php:194
+msgid "cancel"
+msgstr "キャンセル"
+
+#: usr/local/www/services_captiveportal_filemanager.php:217
+#: usr/local/www/services_captiveportal_filemanager.php:214
+#: usr/local/www/services_captiveportal_filemanager.php:214
+msgid ""
+"Any files that you upload here with the filename prefix of captiveportal- "
+"will be made available in the root directory of the captive portal HTTP(S) "
+"server. You may reference them directly from your portal page HTML code "
+"using relative paths. Example: you've uploaded an image with the name "
+"'captiveportal-test.jpg' using the file manager. Then you can include it in "
+"your portal page like this:"
+msgstr "「あなたがファイル名の接頭辞で、ここでアップロードしたすべてのファイルcaptiveportal -」は「 。サーバーは、ポータルページのHTMLコードから直接参照することができる「キャプティブポータルHTTP(S)のルートディレクトリに使用できるようになります相対パスを使用した。例:名前の画像アップロードしたこのようなポータル·ページ「ファイルマネージャを使って' captiveportal - test.jpgというの'次に、それを含めることができます。 」 :"
+
+#: usr/local/www/services_captiveportal_filemanager.php:224
+#: usr/local/www/services_captiveportal_filemanager.php:221
+#: usr/local/www/services_captiveportal_filemanager.php:221
+msgid ""
+"In addition, you can also upload .php files for execution. You can pass the "
+"filename to your custom page from the initial page by using text similar to:"
+msgstr "「加えて、またアップロードできるPHPファイルを実行するためにあなたが渡すことができます。 」のようなテキストを使って、最初のページからカスタムページにファイル名を。"
+
+#: usr/local/www/services_captiveportal_filemanager.php:227
+#: usr/local/www/services_captiveportal_filemanager.php:224
+#: usr/local/www/services_captiveportal_filemanager.php:224
+msgid "Acceptable usage policy"
+msgstr "許容可能な使用ポリシー"
+
+#: usr/local/www/services_captiveportal_filemanager.php:229
+#: usr/local/www/services_captiveportal_filemanager.php:226
+#: usr/local/www/services_captiveportal_filemanager.php:226
+#, php-format
+msgid "The total size limit for all files is %s."
+msgstr "すべてのファイルの合計サイズの制限は%s.です"
+
+#: usr/local/www/diag_limiter_info.php:46
+#: usr/local/www/diag_limiter_info.php:46
+msgid "Diagnostics: Limiter Info"
+msgstr "診断:リミッター情報"
+
+#: usr/local/www/diag_limiter_info.php:108
+#: usr/local/www/diag_limiter_info.php:109
+#: usr/local/www/diag_limiter_info.php:109
+msgid "Gathering Limiter information, please wait..."
+msgstr "リミッター情報を収集しています。しばらくお待ちください..."
+
+#: usr/local/www/firewall_nat.php:197 usr/local/www/firewall_nat.php:202
+#: usr/local/www/firewall_nat.php:205 usr/local/www/firewall_nat.php:205
+msgid "Src. addr"
+msgstr "SRC 。 ADDR"
+
+#: usr/local/www/firewall_nat.php:198 usr/local/www/firewall_nat.php:203
+#: usr/local/www/firewall_nat.php:206 usr/local/www/firewall_nat.php:206
+msgid "Src. ports"
+msgstr "SRC 。ポート"
+
+#: usr/local/www/firewall_nat.php:199 usr/local/www/firewall_nat.php:204
+#: usr/local/www/firewall_nat.php:207 usr/local/www/firewall_nat.php:207
+msgid "Dest. addr"
+msgstr "DEST 。 ADDR"
+
+#: usr/local/www/firewall_nat.php:200 usr/local/www/firewall_nat.php:205
+#: usr/local/www/firewall_nat.php:208 usr/local/www/firewall_nat.php:208
+msgid "Dest. ports"
+msgstr "DEST 。ポート"
+
+#: usr/local/www/firewall_nat.php:201 usr/local/www/firewall_nat.php:206
+#: usr/local/www/firewall_nat.php:209 usr/local/www/firewall_nat.php:209
+msgid "NAT IP"
+msgstr "NAT IP"
+
+#: usr/local/www/firewall_nat.php:202 usr/local/www/firewall_nat.php:207
+#: usr/local/www/firewall_nat.php:210 usr/local/www/firewall_nat.php:210
+msgid "NAT Ports"
+msgstr "NATのポート"
+
+#: usr/local/www/firewall_nat.php:252 usr/local/www/firewall_nat.php:265
+#: usr/local/www/firewall_nat.php:268 usr/local/www/firewall_nat.php:268
+msgid "All traffic matching this NAT entry is passed"
+msgstr "このNATエントリに一致するすべてのトラフィックが渡されます"
+
+#: usr/local/www/firewall_nat.php:254 usr/local/www/firewall_nat.php:267
+#: usr/local/www/firewall_nat.php:270 usr/local/www/firewall_nat.php:270
+msgid "Firewall rule ID"
+msgstr "ファイアウォールのルールID"
+
+#: usr/local/www/firewall_nat.php:254 usr/local/www/firewall_nat.php:267
+#: usr/local/www/firewall_nat.php:270 usr/local/www/firewall_nat.php:270
+msgid "is managed with this rule"
+msgstr "このルールで管理されている"
+
+#: usr/local/www/firewall_nat.php:313 usr/local/www/firewall_nat_out.php:450
+#: usr/local/www/firewall_nat_out.php:451 usr/local/www/firewall_nat.php:326
+#: usr/local/www/firewall_nat_out.php:448
+#: usr/local/www/firewall_nat_out.php:455 usr/local/www/firewall_nat.php:329
+#: usr/local/www/firewall_nat_out.php:454 usr/local/www/firewall_nat.php:329
+#: usr/local/www/firewall_nat_out.php:454
+msgid "Do you really want to delete this rule?"
+msgstr "あなたは本当に、このルールを削除しますか?"
+
+#: usr/local/www/firewall_nat.php:349 usr/local/www/firewall_nat.php:362
+#: usr/local/www/firewall_nat.php:365 usr/local/www/firewall_nat.php:365
+msgid "linked rule"
+msgstr "リンクされたルール"
+
+#: usr/local/www/diag_ipsec.php:78 usr/local/www/diag_ipsec_sad.php:73
+#: usr/local/www/diag_ipsec_spd.php:72 usr/local/www/diag_ipsec.php:88
+#: usr/local/www/diag_ipsec.php:89 usr/local/www/diag_ipsec_sad.php:74
+#: usr/local/www/diag_ipsec_spd.php:73 usr/local/www/diag_ipsec.php:91
+#: usr/local/www/diag_ipsec.php:91 usr/local/www/diag_ipsec_spd.php:73
+#: usr/local/www/diag_ipsec_sad.php:74
+msgid "Overview"
+msgstr "概要"
+
+#: usr/local/www/diag_ipsec.php:79 usr/local/www/diag_ipsec_sad.php:49
+#: usr/local/www/diag_ipsec_sad.php:74 usr/local/www/diag_ipsec_spd.php:73
+#: usr/local/www/diag_ipsec.php:89 usr/local/www/diag_ipsec.php:90
+#: usr/local/www/diag_ipsec_sad.php:75 usr/local/www/diag_ipsec_spd.php:74
+#: usr/local/www/diag_ipsec.php:92 usr/local/www/diag_ipsec.php:92
+#: usr/local/www/diag_ipsec_spd.php:74 usr/local/www/diag_ipsec_sad.php:49
+#: usr/local/www/diag_ipsec_sad.php:75
+msgid "SAD"
+msgstr "SAD"
+
+#: usr/local/www/diag_ipsec.php:80 usr/local/www/diag_ipsec_sad.php:75
+#: usr/local/www/diag_ipsec_spd.php:49 usr/local/www/diag_ipsec_spd.php:74
+#: usr/local/www/diag_ipsec.php:90 usr/local/www/diag_ipsec.php:91
+#: usr/local/www/diag_ipsec_sad.php:76 usr/local/www/diag_ipsec_spd.php:75
+#: usr/local/www/diag_ipsec.php:93 usr/local/www/diag_ipsec.php:93
+#: usr/local/www/diag_ipsec_spd.php:49 usr/local/www/diag_ipsec_spd.php:75
+#: usr/local/www/diag_ipsec_sad.php:76
+msgid "SPD"
+msgstr "SPD"
+
+#: usr/local/www/diag_ipsec.php:81 usr/local/www/diag_ipsec_sad.php:76
+#: usr/local/www/diag_ipsec_spd.php:75 usr/local/www/diag_ipsec.php:91
+#: usr/local/www/diag_ipsec.php:92 usr/local/www/diag_ipsec_sad.php:77
+#: usr/local/www/diag_ipsec_spd.php:76 usr/local/www/diag_ipsec.php:94
+#: usr/local/www/diag_ipsec.php:94 usr/local/www/diag_ipsec_spd.php:76
+#: usr/local/www/diag_ipsec_sad.php:77
+msgid "Logs"
+msgstr "ログ"
+
+#: usr/local/www/diag_ipsec.php:92 usr/local/www/diag_ipsec.php:103
+#: usr/local/www/diag_ipsec.php:104 usr/local/www/diag_ipsec.php:106
+#: usr/local/www/diag_ipsec.php:106
+msgid "Remote IP"
+msgstr "リモートIP"
+
+#: usr/local/www/diag_ipsec.php:93 usr/local/www/vpn_ipsec_phase2.php:419
+#: usr/local/www/diag_ipsec.php:104 usr/local/www/vpn_ipsec_phase2.php:445
+#: usr/local/www/diag_ipsec.php:105 usr/local/www/vpn_ipsec_phase2.php:511
+#: usr/local/www/diag_ipsec.php:107 usr/local/www/vpn_ipsec_phase2.php:533
+#: usr/local/www/diag_ipsec.php:107 usr/local/www/vpn_ipsec_phase2.php:533
+msgid "Local Network"
+msgstr "ローカルネットワーク"
+
+#: usr/local/www/diag_ipsec.php:94 usr/local/www/vpn_ipsec_phase2.php:461
+#: usr/local/www/vpn_openvpn_client.php:762
+#: usr/local/www/vpn_openvpn_server.php:1055 usr/local/www/diag_ipsec.php:105
+#: usr/local/www/vpn_openvpn_server.php:1197
+#: usr/local/www/vpn_ipsec_phase2.php:487
+#: usr/local/www/vpn_openvpn_client.php:767 usr/local/www/diag_ipsec.php:106
+#: usr/local/www/vpn_ipsec_phase2.php:589 usr/local/www/diag_ipsec.php:108
+#: usr/local/www/vpn_ipsec_phase2.php:610 usr/local/www/diag_ipsec.php:108
+#: usr/local/www/vpn_ipsec_phase2.php:610
+msgid "Remote Network"
+msgstr "遠隔ネットワーク"
+
+#: usr/local/www/diag_ipsec.php:165 usr/local/www/diag_ipsec_sad.php:135
+#: usr/local/www/diag_ipsec_spd.php:144 usr/local/www/diag_ipsec_sad.php:136
+#: usr/local/www/diag_ipsec_spd.php:145 usr/local/www/diag_ipsec_spd.php:145
+#: usr/local/www/diag_ipsec_sad.php:136
+msgid "You can configure your IPsec"
+msgstr "あなたのIPsecを設定することができます"
+
+#: usr/local/www/diag_ipsec_sad.php:90 usr/local/www/diag_ipsec_sad.php:91
+#: usr/local/www/diag_ipsec_sad.php:91
+msgid "SPI"
+msgstr "SPI"
+
+#: usr/local/www/diag_ipsec_sad.php:91 usr/local/www/diag_ipsec_sad.php:92
+#: usr/local/www/diag_ipsec_sad.php:92
+msgid "Enc. alg."
+msgstr "ENC 。 ALG 。"
+
+#: usr/local/www/diag_ipsec_sad.php:92 usr/local/www/diag_ipsec_sad.php:93
+#: usr/local/www/diag_ipsec_sad.php:93
+msgid "Auth. alg."
+msgstr "認証。 ALG 。"
+
+#: usr/local/www/diag_ipsec_sad.php:93 usr/local/www/diag_ipsec_sad.php:94
+#: usr/local/www/diag_ipsec_sad.php:94
+msgid "Data"
+msgstr "データ"
+
+#: usr/local/www/diag_ipsec_sad.php:112 usr/local/www/diag_ipsec_sad.php:113
+#: usr/local/www/diag_ipsec_sad.php:113
+msgid "Do you really want to delete this security association?"
+msgstr "あなたは本当に、このセキュリティアソシエーションを削除しますか?"
+
+#: usr/local/www/diag_ipsec_sad.php:121 usr/local/www/diag_ipsec_sad.php:122
+#: usr/local/www/diag_ipsec_sad.php:122
+msgid "No IPsec security associations."
+msgstr "いいえIPsecセキュリティアソシエーションはありません。"
+
+#: usr/local/www/services_captiveportal_ip.php:123
+#: usr/local/www/services_captiveportal_ip.php:163
+#: usr/local/www/services_captiveportal_hostname.php:128
+#: usr/local/www/services_captiveportal_hostname.php:164
+#: usr/local/www/services_captiveportal_ip.php:121
+#: usr/local/www/services_captiveportal_ip.php:161
+#: usr/local/www/services_captiveportal_hostname.php:126
+#: usr/local/www/services_captiveportal_hostname.php:162
+#: usr/local/www/services_captiveportal_ip.php:121
+#: usr/local/www/services_captiveportal_ip.php:161
+#: usr/local/www/services_captiveportal_hostname.php:126
+#: usr/local/www/services_captiveportal_hostname.php:162
+msgid "add address"
+msgstr "アドレスを追加"
+
+#: usr/local/www/services_captiveportal_ip.php:153
+#: usr/local/www/services_captiveportal_hostname.php:154
+#: usr/local/www/services_captiveportal_ip.php:151
+#: usr/local/www/services_captiveportal_hostname.php:152
+#: usr/local/www/services_captiveportal_ip.php:151
+#: usr/local/www/services_captiveportal_hostname.php:152
+msgid "edit address"
+msgstr "編集アドレス"
+
+#: usr/local/www/services_captiveportal_ip.php:154
+#: usr/local/www/services_captiveportal_hostname.php:155
+#: usr/local/www/services_captiveportal_ip.php:152
+#: usr/local/www/services_captiveportal_hostname.php:153
+#: usr/local/www/services_captiveportal_ip.php:152
+#: usr/local/www/services_captiveportal_hostname.php:153
+msgid "Do you really want to delete this address?"
+msgstr "あなたは本当にこのアドレスを削除しますか?"
+
+#: usr/local/www/services_captiveportal_ip.php:154
+#: usr/local/www/services_captiveportal_hostname.php:155
+#: usr/local/www/services_captiveportal_ip.php:152
+#: usr/local/www/services_captiveportal_hostname.php:153
+#: usr/local/www/services_captiveportal_ip.php:152
+#: usr/local/www/services_captiveportal_hostname.php:153
+msgid "delete address"
+msgstr "アドレスを削除"
+
+#: usr/local/www/services_captiveportal_ip.php:172
+#: usr/local/www/services_captiveportal_ip.php:170
+#: usr/local/www/services_captiveportal_ip.php:170
+msgid ""
+"Adding allowed IP addresses will allow IP access to/from these addresses "
+"through the captive portal without being taken to the portal page. This can "
+"be used for a web server serving images for the portal page or a DNS server "
+"on another network, for example. By specifying <em>from</em> addresses, it "
+"may be used to always allow pass-through access from a client behind the "
+"captive portal."
+msgstr "ポータルページに連れて行かれることなく、キャプティブポータルを介して「許可するIPアドレスを追加すると、する/これらのアドレスからのIPアクセスを許可します」 。これは、例えば、別のネットワーク上の「 WebサーバーがポータルページまたはDNSサーバー用の画像を提供するために使用する"ことができます。 u003c/ emu003eのアドレスからのu003cemu003e指定することで、キャプティブポータル」は、常に背後にあるクライアントからのパススルーのアクセスを許可するために用いることができる」 。"
+
+#: usr/local/www/services_captiveportal_ip.php:176
+#: usr/local/www/services_captiveportal_ip.php:183
+#: usr/local/www/services_captiveportal_hostname.php:177
+#: usr/local/www/services_captiveportal_hostname.php:184
+#: usr/local/www/services_captiveportal_ip.php:174
+#: usr/local/www/services_captiveportal_ip.php:181
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/services_captiveportal_hostname.php:182
+#: usr/local/www/services_captiveportal_ip.php:174
+#: usr/local/www/services_captiveportal_ip.php:181
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/services_captiveportal_hostname.php:182
+msgid "All connections"
+msgstr "すべての接続"
+
+#: usr/local/www/services_captiveportal_ip.php:176
+#: usr/local/www/services_captiveportal_ip.php:183
+#: usr/local/www/services_captiveportal_ip.php:174
+#: usr/local/www/services_captiveportal_ip.php:181
+#: usr/local/www/services_captiveportal_ip.php:174
+#: usr/local/www/services_captiveportal_ip.php:181
+msgid "the IP address are allowed"
+msgstr "IPアドレスは許可されてい"
+
+#: usr/local/www/services_captiveportal_ip.php:183
+#: usr/local/www/services_captiveportal_hostname.php:184
+#: usr/local/www/services_captiveportal_ip.php:181
+#: usr/local/www/services_captiveportal_hostname.php:182
+#: usr/local/www/services_captiveportal_ip.php:181
+#: usr/local/www/services_captiveportal_hostname.php:182
+msgid "from"
+msgstr "から"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:63
+#: usr/local/www/services_captiveportal_ip_edit.php:60
+#: usr/local/www/services_captiveportal_ip_edit.php:60
+msgid "Edit allowed IP address"
+msgstr "編集は許可されたIPアドレス"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:102
+#: usr/local/www/services_captiveportal_ip_edit.php:100
+#: usr/local/www/services_captiveportal_ip_edit.php:99
+#: usr/local/www/services_captiveportal_ip_edit.php:99
+msgid "Allowed IP address"
+msgstr "許可されたIPアドレス"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:110
+#: usr/local/www/services_captiveportal_mac_edit.php:108
+#: usr/local/www/services_captiveportal_hostname_edit.php:110
+#: usr/local/www/services_captiveportal_hostname_edit.php:108
+#: usr/local/www/services_captiveportal_mac_edit.php:106
+#: usr/local/www/services_captiveportal_ip_edit.php:108
+#: usr/local/www/services_captiveportal_ip_edit.php:110
+#: usr/local/www/services_captiveportal_hostname_edit.php:108
+#: usr/local/www/services_captiveportal_mac_edit.php:106
+msgid "Upload speed needs to be an integer"
+msgstr "アップロード速度は、整数である必要がある"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:113
+#: usr/local/www/services_captiveportal_mac_edit.php:110
+#: usr/local/www/services_captiveportal_hostname_edit.php:112
+#: usr/local/www/services_captiveportal_hostname_edit.php:110
+#: usr/local/www/services_captiveportal_mac_edit.php:108
+#: usr/local/www/services_captiveportal_ip_edit.php:111
+#: usr/local/www/services_captiveportal_ip_edit.php:113
+#: usr/local/www/services_captiveportal_hostname_edit.php:110
+#: usr/local/www/services_captiveportal_mac_edit.php:108
+msgid "Download speed needs to be an integer"
+msgstr "ダウンロード速度は、整数である必要がある"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:120
+#: usr/local/www/services_captiveportal_mac_edit.php:117
+#: usr/local/www/services_captiveportal_hostname_edit.php:119
+#: usr/local/www/services_captiveportal_hostname_edit.php:117
+#: usr/local/www/services_captiveportal_mac_edit.php:115
+#: usr/local/www/services_captiveportal_ip_edit.php:118
+#: usr/local/www/services_captiveportal_ip_edit.php:120
+#: usr/local/www/services_captiveportal_hostname_edit.php:117
+#: usr/local/www/services_captiveportal_mac_edit.php:115
+msgid "already allowed"
+msgstr "既に許可された"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:175
+#: usr/local/www/services_captiveportal_ip_edit.php:173
+#: usr/local/www/services_captiveportal_ip_edit.php:184
+#: usr/local/www/services_captiveportal_ip_edit.php:184
+msgid "Edit allowed ip rule"
+msgstr "編集は、IPルールを許可"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:182
+#: usr/local/www/services_captiveportal_ip_edit.php:191
+#: usr/local/www/services_captiveportal_hostname_edit.php:164
+#: usr/local/www/services_captiveportal_hostname_edit.php:172
+#: usr/local/www/system_gateways_edit.php:442
+#: usr/local/www/system_gateways_edit.php:454
+#: usr/local/www/system_gateways_edit.php:463
+#: usr/local/www/system_gateways_edit.php:475
+#: usr/local/www/services_captiveportal_hostname_edit.php:162
+#: usr/local/www/services_captiveportal_hostname_edit.php:170
+#: usr/local/www/system_gateways_edit.php:569
+#: usr/local/www/system_gateways_edit.php:581
+#: usr/local/www/services_captiveportal_ip_edit.php:180
+#: usr/local/www/services_captiveportal_ip_edit.php:189
+#: usr/local/www/system_gateways_edit.php:573
+#: usr/local/www/system_gateways_edit.php:585
+#: usr/local/www/system_gateways_edit.php:575
+#: usr/local/www/system_gateways_edit.php:587
+#: usr/local/www/system_gateways_edit.php:605
+#: usr/local/www/system_gateways_edit.php:617
+#: usr/local/www/system_gateways_edit.php:605
+#: usr/local/www/system_gateways_edit.php:617
+#: usr/local/www/services_captiveportal_hostname_edit.php:164
+#: usr/local/www/services_captiveportal_hostname_edit.php:172
+msgid "From"
+msgstr "から"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:182
+#: usr/local/www/services_captiveportal_ip_edit.php:192
+#: usr/local/www/services_captiveportal_hostname_edit.php:164
+#: usr/local/www/services_captiveportal_hostname_edit.php:173
+#: usr/local/www/system_gateways_edit.php:445
+#: usr/local/www/system_gateways_edit.php:457
+#: usr/local/www/system_gateways_edit.php:466
+#: usr/local/www/system_gateways_edit.php:478
+#: usr/local/www/services_captiveportal_hostname_edit.php:162
+#: usr/local/www/services_captiveportal_hostname_edit.php:171
+#: usr/local/www/system_gateways_edit.php:572
+#: usr/local/www/system_gateways_edit.php:584
+#: usr/local/www/services_captiveportal_ip_edit.php:180
+#: usr/local/www/services_captiveportal_ip_edit.php:190
+#: usr/local/www/system_gateways_edit.php:576
+#: usr/local/www/system_gateways_edit.php:588
+#: usr/local/www/system_gateways_edit.php:578
+#: usr/local/www/system_gateways_edit.php:590
+#: usr/local/www/system_gateways_edit.php:608
+#: usr/local/www/system_gateways_edit.php:620
+#: usr/local/www/system_gateways_edit.php:608
+#: usr/local/www/system_gateways_edit.php:620
+#: usr/local/www/services_captiveportal_hostname_edit.php:164
+#: usr/local/www/services_captiveportal_hostname_edit.php:173
+msgid "To"
+msgstr "へ"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:191
+#: usr/local/www/services_captiveportal_ip_edit.php:192
+#: usr/local/www/services_captiveportal_hostname_edit.php:172
+#: usr/local/www/services_captiveportal_hostname_edit.php:173
+#: usr/local/www/services_captiveportal_hostname_edit.php:170
+#: usr/local/www/services_captiveportal_hostname_edit.php:171
+#: usr/local/www/services_captiveportal_ip_edit.php:189
+#: usr/local/www/services_captiveportal_ip_edit.php:190
+#: usr/local/www/services_captiveportal_hostname_edit.php:172
+#: usr/local/www/services_captiveportal_hostname_edit.php:173
+msgid "Use"
+msgstr "使用"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:191
+#: usr/local/www/services_captiveportal_ip_edit.php:189
+msgid ""
+"to always allow an IP address through the captive portal (without "
+"authentication)"
+msgstr "「 (認証常時ずに)キャプティブポータルを使用して、IPアドレスを許可するには、「"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:192
+#: usr/local/www/services_captiveportal_ip_edit.php:190
+msgid ""
+"to allow access from all clients (even non-authenticated ones) behind the "
+"portal to this IP address"
+msgstr "このIPアドレスにポータル」の背後にあるすべてのクライアント(たとえ非認証のもの)からのアクセスを許可するように」"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:204
+#: usr/local/www/services_captiveportal_ip_edit.php:202
+#: usr/local/www/services_captiveportal_ip_edit.php:196
+#: usr/local/www/services_captiveportal_ip_edit.php:196
+msgid "IP address and subnet mask. Use /32 for a single IP"
+msgstr "IPアドレスとサブネットマスク。単一のIPのために/ 32を使用してください"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:215
+#: usr/local/www/services_captiveportal_mac_edit.php:189
+#: usr/local/www/services_captiveportal_hostname_edit.php:189
+#: usr/local/www/services_captiveportal_hostname_edit.php:187
+#: usr/local/www/services_captiveportal_mac_edit.php:187
+#: usr/local/www/services_captiveportal_ip_edit.php:213
+#: usr/local/www/services_captiveportal_ip_edit.php:207
+#: usr/local/www/services_captiveportal_mac_edit.php:200
+#: usr/local/www/services_captiveportal_ip_edit.php:207
+#: usr/local/www/services_captiveportal_hostname_edit.php:189
+#: usr/local/www/services_captiveportal_mac_edit.php:200
+msgid "Bandwidth up"
+msgstr "最大帯域幅"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:218
+#: usr/local/www/services_captiveportal_ip_edit.php:216
+#: usr/local/www/services_captiveportal_ip_edit.php:210
+#: usr/local/www/services_captiveportal_ip_edit.php:210
+msgid "Enter a upload limit to be enforced on this IP address in Kbit/s"
+msgstr "キロビット/秒で、このIPアドレスに適用されるアップロード制限を入力してください"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:222
+#: usr/local/www/services_captiveportal_mac_edit.php:195
+#: usr/local/www/services_captiveportal_hostname_edit.php:195
+#: usr/local/www/services_captiveportal_hostname_edit.php:193
+#: usr/local/www/services_captiveportal_mac_edit.php:193
+#: usr/local/www/services_captiveportal_ip_edit.php:220
+#: usr/local/www/services_captiveportal_ip_edit.php:214
+#: usr/local/www/services_captiveportal_mac_edit.php:206
+#: usr/local/www/services_captiveportal_ip_edit.php:214
+#: usr/local/www/services_captiveportal_hostname_edit.php:195
+#: usr/local/www/services_captiveportal_mac_edit.php:206
+msgid "Bandwidth down"
+msgstr "ダウン帯域幅"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:225
+#: usr/local/www/services_captiveportal_ip_edit.php:223
+#: usr/local/www/services_captiveportal_ip_edit.php:217
+#: usr/local/www/services_captiveportal_ip_edit.php:217
+msgid "Enter a download limit to be enforced on this IP address in Kbit/s"
+msgstr "キロビット/秒でのこのIPアドレスに施行されるようにダウンロード制限を入力してください"
+
+#: usr/local/www/services_captiveportal_mac.php:80
+#: usr/local/www/services_captiveportal_mac.php:78
+#: usr/local/www/services_captiveportal_mac.php:78
+msgid "No entry exists yet!"
+msgstr "エントリがまだ存在しません !"
+
+#: usr/local/www/services_captiveportal_mac.php:84
+#: usr/local/www/services_captiveportal_mac.php:82
+#: usr/local/www/services_captiveportal_mac.php:82
+msgid "Please set the zone on which the operation should be allowed"
+msgstr "操作が許可されるべきかにゾーンを設定してください"
+
+#: usr/local/www/services_captiveportal_mac.php:96
+#: usr/local/www/services_captiveportal_mac.php:94
+#: usr/local/www/services_captiveportal_mac.php:94
+msgid "No entry exists for this username:"
+msgstr "エントリがこのユーザ名は存在しません。"
+
+#: usr/local/www/services_captiveportal_mac.php:115
+#: usr/local/www/services_captiveportal_mac.php:113
+#: usr/local/www/services_captiveportal_mac.php:118
+#: usr/local/www/services_captiveportal_mac.php:118
+msgid "The entry was sucessfully deleted"
+msgstr "エントリはsucessfully削除された"
+
+#: usr/local/www/services_captiveportal_mac.php:117
+#: usr/local/www/services_captiveportal_mac.php:115
+#: usr/local/www/services_captiveportal_mac.php:120
+#: usr/local/www/services_captiveportal_mac.php:120
+msgid "No entry exists for this mac address:"
+msgstr "エントリがこのMACアドレスは存在しません。"
+
+#: usr/local/www/services_captiveportal_mac.php:148
+#: usr/local/www/services_captiveportal_mac.php:146
+#: usr/local/www/services_captiveportal_mac.php:156
+#: usr/local/www/services_captiveportal_mac.php:156
+msgid ""
+"The captive portal MAC address configuration has been changed.<br />You must "
+"apply the changes in order for them to take effect."
+msgstr "「キャプティブポータルのMACアドレスの設定が変更されています。あなたがしなければならないポスター「それらを有効にするために変更を適用します。"
+
+#: usr/local/www/services_captiveportal_mac.php:180
+#: usr/local/www/services_captiveportal_mac.php:178
+#: usr/local/www/services_captiveportal_mac.php:188
+#: usr/local/www/services_captiveportal_mac.php:188
+msgid "edit host"
+msgstr "編集ホスト"
+
+#: usr/local/www/services_captiveportal_mac.php:181
+#: usr/local/www/services_dnsmasq.php:276
+#: usr/local/www/services_unbound.php:312
+#: usr/local/www/services_dnsmasq.php:277
+#: usr/local/www/services_captiveportal_mac.php:179
+#: usr/local/www/services_dnsmasq.php:302
+#: usr/local/www/services_captiveportal_mac.php:189
+#: usr/local/www/services_dnsmasq.php:315
+#: usr/local/www/services_dnsmasq.php:379
+#: usr/local/www/services_dnsmasq.php:379
+#: usr/local/www/services_captiveportal_mac.php:189
+msgid "Do you really want to delete this host?"
+msgstr "あなたは本当にこのホストを削除しますか?"
+
+#: usr/local/www/services_captiveportal_mac.php:181
+#: usr/local/www/services_captiveportal_mac.php:179
+#: usr/local/www/services_captiveportal_mac.php:189
+#: usr/local/www/services_captiveportal_mac.php:189
+msgid "delete host"
+msgstr "ホストを削除する"
+
+#: usr/local/www/services_captiveportal_mac.php:186
+#: usr/local/www/services_captiveportal_mac.php:184
+#: usr/local/www/services_captiveportal_mac.php:194
+#: usr/local/www/services_captiveportal_mac.php:194
+msgid "add host"
+msgstr "ホストを追加"
+
+#: usr/local/www/services_captiveportal_mac.php:192
+#: usr/local/www/services_captiveportal_mac.php:190
+#: usr/local/www/services_captiveportal_mac.php:200
+#: usr/local/www/services_captiveportal_mac.php:200
+msgid ""
+"Adding MAC addresses as pass-through MACs allows them access through the "
+"captive portal automatically without being taken to the portal page."
+msgstr "ポータルページに連れて行かれることなく、自動的にキャプティブポータル「通過のMACはを通して彼らにアクセスすることができますようにMACアドレスを追加」を参照してください。"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:60
+#: usr/local/www/services_captiveportal_mac_edit.php:57
+#: usr/local/www/services_captiveportal_mac_edit.php:57
+msgid "Edit pass-through MAC address"
+msgstr "パススルーのMACアドレスを編集"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:105
+#: usr/local/www/services_captiveportal_mac_edit.php:103
+#: usr/local/www/services_captiveportal_mac_edit.php:103
+msgid "A valid MAC address must be specified"
+msgstr "有効なMACアドレスを指定する必要があります"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:172
+#: usr/local/www/services_captiveportal_mac_edit.php:170
+#: usr/local/www/services_captiveportal_mac_edit.php:177
+#: usr/local/www/services_captiveportal_mac_edit.php:177
+msgid "Edit Pass-through MAC address"
+msgstr "編集パススルーMACアドレス"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:179
+#: usr/local/www/services_captiveportal_mac_edit.php:177
+#: usr/local/www/services_captiveportal_mac_edit.php:190
+#: usr/local/www/services_captiveportal_mac_edit.php:190
+msgid "MAC address (6 hex octets separated by colons)"
+msgstr "MACアドレス( 6進オクテットコロンで区切られた)"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:192
+#: usr/local/www/services_captiveportal_mac_edit.php:190
+#: usr/local/www/services_captiveportal_mac_edit.php:203
+#: usr/local/www/services_captiveportal_mac_edit.php:203
+msgid "Enter a upload limit to be enforced on this MAC address in Kbit/s"
+msgstr "キロビット/秒で、このMACアドレスに施行されるようにアップロード制限を入力してください"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:198
+#: usr/local/www/services_captiveportal_mac_edit.php:196
+#: usr/local/www/services_captiveportal_mac_edit.php:209
+#: usr/local/www/services_captiveportal_mac_edit.php:209
+msgid "Enter a download limit to be enforced on this MAC address in Kbit/s"
+msgstr "キロビット/秒で、このMACアドレスに施行されるようにダウンロード制限を入力してください"
+
+#: usr/local/www/diag_ipsec_spd.php:90 usr/local/www/diag_ipsec_spd.php:91
+#: usr/local/www/diag_ipsec_spd.php:91
+msgid "Tunnel endpoints"
+msgstr "トンネルのエンドポイント"
+
+#: usr/local/www/diag_ipsec_spd.php:108 usr/local/www/diag_ipsec_spd.php:109
+#: usr/local/www/diag_ipsec_spd.php:109
+msgid "Do you really want to delete this security policy?"
+msgstr "あなたは本当に、このセキュリティポリシーを削除しますか?"
+
+#: usr/local/www/diag_ipsec_spd.php:119 usr/local/www/diag_ipsec_spd.php:120
+#: usr/local/www/diag_ipsec_spd.php:120
+msgid "incoming (as seen by firewall)"
+msgstr "入ってくる(ファイアウォールで見られるように)"
+
+#: usr/local/www/diag_ipsec_spd.php:126 usr/local/www/diag_ipsec_spd.php:127
+#: usr/local/www/diag_ipsec_spd.php:127
+msgid "outgoing (as seen by firewall)"
+msgstr "発信(ファイアウォールで見られるように)"
+
+#: usr/local/www/diag_ipsec_spd.php:131 usr/local/www/diag_ipsec_spd.php:132
+#: usr/local/www/diag_ipsec_spd.php:132
+msgid "No IPsec security policies."
+msgstr "いいえIPsecセキュリティポリシーん。"
+
+#: usr/local/www/diag_ping.php:59 usr/local/www/diag_ping.php:61
+#: usr/local/www/diag_ping.php:61
+#, php-format
+msgid "Count must be between 1 and %s"
+msgstr "カウントは1と%sの間でなければなりません"
+
+#: usr/local/www/diag_ping.php:126 usr/local/www/diag_ping.php:148
+#: usr/local/www/diag_ping.php:148
+msgid "Ping output"
+msgstr "pingの出力"
+
+#: usr/local/www/services_dhcp.php:111 usr/local/www/services_dhcp.php:111
+msgid ""
+"The DHCP Server can only be enabled on interfaces configured with static IP "
+"addresses"
+msgstr "アドレス「DHCPサーバーは、静的IPアドレスで設定されたインターフェイス上で有効にすることができます」"
+
+#: usr/local/www/services_dhcp.php:111 usr/local/www/services_dhcpv6.php:74
+#: usr/local/www/services_router_advertisements.php:75
+#: usr/local/www/services_dhcpv6.php:75
+#: usr/local/www/services_router_advertisements.php:75
+#: usr/local/www/services_dhcp.php:111 usr/local/www/services_dhcpv6.php:75
+msgid "Only interfaces configured with a static IP will be shown"
+msgstr "静的IPで設定インターフェイスだけが表示されます"
+
+#: usr/local/www/services_dhcp.php:207 usr/local/www/services_dhcpv6.php:177
+#: usr/local/www/services_dhcp.php:208 usr/local/www/services_dhcpv6.php:189
+#: usr/local/www/services_dhcp.php:254 usr/local/www/services_dhcpv6.php:174
+#: usr/local/www/services_dhcp.php:235 usr/local/www/services_dhcpv6.php:168
+#: usr/local/www/services_dhcp.php:235 usr/local/www/services_dhcpv6.php:168
+msgid "Range begin"
+msgstr "範囲の開始"
+
+#: usr/local/www/services_dhcp.php:207 usr/local/www/services_dhcpv6.php:177
+#: usr/local/www/services_dhcp.php:208 usr/local/www/services_dhcpv6.php:189
+#: usr/local/www/services_dhcp.php:254 usr/local/www/services_dhcpv6.php:174
+#: usr/local/www/services_dhcp.php:235 usr/local/www/services_dhcpv6.php:168
+#: usr/local/www/services_dhcp.php:235 usr/local/www/services_dhcpv6.php:168
+msgid "Range end"
+msgstr "範囲終了"
+
+#: usr/local/www/services_dhcp.php:212 usr/local/www/services_dhcp.php:214
+#: usr/local/www/services_dhcpv6.php:182 usr/local/www/services_dhcpv6.php:186
+#: usr/local/www/services_dhcpv6.php:188 usr/local/www/services_dhcp.php:213
+#: usr/local/www/services_dhcp.php:215 usr/local/www/services_dhcpv6.php:194
+#: usr/local/www/services_dhcpv6.php:198 usr/local/www/services_dhcpv6.php:200
+#: usr/local/www/services_dhcp.php:259 usr/local/www/services_dhcp.php:261
+#: usr/local/www/services_dhcpv6.php:179 usr/local/www/services_dhcpv6.php:183
+#: usr/local/www/services_dhcpv6.php:185 usr/local/www/services_dhcp.php:240
+#: usr/local/www/services_dhcp.php:242 usr/local/www/services_dhcpv6.php:173
+#: usr/local/www/services_dhcpv6.php:177 usr/local/www/services_dhcp.php:240
+#: usr/local/www/services_dhcp.php:242 usr/local/www/services_dhcpv6.php:173
+#: usr/local/www/services_dhcpv6.php:177 usr/local/www/services_dhcpv6.php:179
+msgid "A valid range must be specified."
+msgstr "有効な範囲を指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:216 usr/local/www/services_dhcp.php:217
+#: usr/local/www/services_dhcp.php:263
+#: usr/local/www/services_dhcp_edit.php:207
+#: usr/local/www/services_dhcp.php:244
+#: usr/local/www/services_dhcp_edit.php:207
+#: usr/local/www/services_dhcp.php:244
+msgid "A valid IP address must be specified for the gateway."
+msgstr "有効なIPアドレスは、ゲートウェイを指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:218 usr/local/www/services_dhcp.php:219
+#: usr/local/www/services_dhcp.php:265
+#: usr/local/www/services_dhcp_edit.php:209
+#: usr/local/www/services_dhcp.php:246
+#: usr/local/www/services_dhcp_edit.php:209
+#: usr/local/www/services_dhcp.php:246
+msgid ""
+"A valid IP address must be specified for the primary/secondary WINS servers."
+msgstr "「有効なIPアドレスは、プライマリ/セカンダリWINSサーバを指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:223 usr/local/www/services_dhcp.php:224
+#: usr/local/www/services_dhcp.php:270
+#: usr/local/www/services_dhcp_edit.php:215
+#: usr/local/www/services_dhcp.php:251
+#: usr/local/www/services_dhcp_edit.php:215
+#: usr/local/www/services_dhcp.php:251
+#, php-format
+msgid ""
+"The gateway address %s does not lie within the chosen interface's subnet."
+msgstr "「ゲートウェイアドレス%sは、選択されたインターフェイスのサブネット内にない。"
+
+#: usr/local/www/services_dhcp.php:226 usr/local/www/services_dhcp.php:227
+#: usr/local/www/services_dhcp.php:273
+#: usr/local/www/services_dhcp_edit.php:218
+#: usr/local/www/services_dhcp.php:254
+#: usr/local/www/services_dhcp_edit.php:218
+#: usr/local/www/services_dhcp.php:254
+msgid ""
+"A valid IP address must be specified for the primary/secondary DNS servers."
+msgstr "「有効なIPアドレスは、プライマリ/セカンダリDNSサーバを指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:229 usr/local/www/services_dhcpv6.php:195
+#: usr/local/www/services_dhcp.php:230 usr/local/www/services_dhcpv6.php:207
+#: usr/local/www/services_dhcp.php:276 usr/local/www/services_dhcpv6.php:192
+#: usr/local/www/services_dhcp_edit.php:221
+#: usr/local/www/services_dhcp.php:257 usr/local/www/services_dhcpv6.php:186
+#: usr/local/www/services_dhcp_edit.php:221
+#: usr/local/www/services_dhcp.php:257 usr/local/www/services_dhcpv6.php:186
+msgid "The default lease time must be at least 60 seconds."
+msgstr "デフォルトのリース時間は60秒以上でなければなりません。"
+
+#: usr/local/www/services_dhcp.php:231 usr/local/www/services_dhcpv6.php:197
+#: usr/local/www/services_dhcp.php:232 usr/local/www/services_dhcpv6.php:209
+#: usr/local/www/services_dhcp.php:278 usr/local/www/services_dhcpv6.php:194
+#: usr/local/www/services_dhcp_edit.php:223
+#: usr/local/www/services_dhcp.php:259 usr/local/www/services_dhcpv6.php:188
+#: usr/local/www/services_dhcp.php:279
+#: usr/local/www/services_dhcp_edit.php:223
+#: usr/local/www/services_dhcp.php:279 usr/local/www/services_dhcpv6.php:188
+msgid ""
+"The maximum lease time must be at least 60 seconds and higher than the "
+"default lease time."
+msgstr "デフォルトのリース時間"最大リース時間は少なくとも60秒よりも高くなければならない」 。"
+
+#: usr/local/www/services_dhcp.php:233 usr/local/www/services_dhcpv6.php:199
+#: usr/local/www/services_dhcp.php:234 usr/local/www/services_dhcpv6.php:211
+#: usr/local/www/services_dhcp.php:280 usr/local/www/services_dhcpv6.php:196
+#: usr/local/www/services_dhcp_edit.php:225
+#: usr/local/www/services_dhcp.php:261 usr/local/www/services_dhcpv6.php:190
+#: usr/local/www/services_dhcp.php:281
+#: usr/local/www/services_dhcp_edit.php:225
+#: usr/local/www/services_dhcp.php:281 usr/local/www/services_dhcpv6.php:190
+msgid "A valid domain name must be specified for the dynamic DNS registration."
+msgstr "有効なドメイン名は、動的DNS登録を指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:235 usr/local/www/services_dhcp.php:246
+#: usr/local/www/services_dhcp.php:298
+#: usr/local/www/services_dhcp_edit.php:237
+#: usr/local/www/services_dhcp.php:279 usr/local/www/services_dhcp.php:299
+#: usr/local/www/services_dhcp_edit.php:237
+#: usr/local/www/services_dhcp.php:299
+msgid ""
+"A valid IP address must be specified for the primary/secondary NTP servers."
+msgstr "「有効なIPアドレスは、プライマリ/セカンダリのNTPサーバーを指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:237 usr/local/www/services_dhcpv6.php:203
+#: usr/local/www/services_dhcp.php:248 usr/local/www/services_dhcpv6.php:225
+#: usr/local/www/services_dhcp.php:300 usr/local/www/services_dhcpv6.php:210
+#: usr/local/www/services_dhcp.php:281 usr/local/www/services_dhcpv6.php:204
+#: usr/local/www/services_dhcp.php:301 usr/local/www/services_dhcp.php:301
+#: usr/local/www/services_dhcpv6.php:204
+msgid "A valid domain name must be specified for the DNS domain."
+msgstr "有効なドメイン名は、 DNSドメインを指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:239 usr/local/www/services_dhcp.php:250
+#: usr/local/www/services_dhcp.php:302
+#: usr/local/www/services_dhcp_edit.php:239
+#: usr/local/www/services_dhcp.php:283 usr/local/www/services_dhcp.php:303
+#: usr/local/www/services_dhcp_edit.php:239
+#: usr/local/www/services_dhcp.php:303
+msgid "A valid IP address or hostname must be specified for the TFTP server."
+msgstr "有効なIPアドレスまたはホスト名は、TFTPサーバを指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:241 usr/local/www/services_dhcp.php:252
+#: usr/local/www/services_dhcp.php:304
+#: usr/local/www/services_dhcp_edit.php:241
+#: usr/local/www/services_dhcp.php:285 usr/local/www/services_dhcp.php:305
+#: usr/local/www/services_dhcp_edit.php:241
+#: usr/local/www/services_dhcp.php:305
+msgid "A valid IP address must be specified for the network boot server."
+msgstr "有効なIPアドレスは、ネットワークブートサーバーを指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:244 usr/local/www/services_dhcp.php:255
+#: usr/local/www/services_dhcp.php:307 usr/local/www/services_dhcp.php:288
+#: usr/local/www/services_dhcp.php:308 usr/local/www/services_dhcp.php:308
+msgid "You cannot use the network address in the starting subnet range."
+msgstr "あなたが始まるサブネット範囲内のネットワークアドレスを使用することはできません。"
+
+#: usr/local/www/services_dhcp.php:246 usr/local/www/services_dhcp.php:257
+#: usr/local/www/services_dhcp.php:309 usr/local/www/services_dhcp.php:290
+#: usr/local/www/services_dhcp.php:310 usr/local/www/services_dhcp.php:310
+msgid "You cannot use the broadcast address in the ending subnet range."
+msgstr "あなたが終わるサブネット範囲内のブロードキャストアドレスを使用することはできません。"
+
+#: usr/local/www/services_dhcp.php:253 usr/local/www/services_dhcp.php:264
+#: usr/local/www/services_dhcp.php:316 usr/local/www/services_dhcp.php:297
+#: usr/local/www/services_dhcp.php:317 usr/local/www/services_dhcp.php:317
+#, php-format
+msgid "The subnet range cannot overlap with virtual IP address %s."
+msgstr "サブネット範囲は、仮想IPアドレスと重複しない%s.ができ"
+
+#: usr/local/www/services_dhcp.php:268 usr/local/www/services_dhcp.php:279
+#: usr/local/www/services_dhcp.php:331 usr/local/www/services_dhcp.php:312
+#: usr/local/www/services_dhcp.php:332 usr/local/www/services_dhcp.php:332
+msgid "Text type cannot include quotation marks."
+msgstr "テキストタイプは、引用符を含めることはできません。"
+
+#: usr/local/www/services_dhcp.php:270 usr/local/www/services_dhcp.php:281
+#: usr/local/www/services_dhcp.php:333 usr/local/www/services_dhcp.php:314
+#: usr/local/www/services_dhcp.php:334 usr/local/www/services_dhcp.php:334
+msgid ""
+"String type must be enclosed in quotes like "this" or must be a series of "
+"octets specified in hexadecimal, separated by colons, like 01:23:45:67:89:ab:"
+"cd:ef"
+msgstr "この「文字列型のように引用符で囲む必要があります」 」や、一連のでなければなりません "01:23:45:67:89のようなコロンで区切られた16進数で指定オクテット、 、 : AB : "CD: EF"
+
+#: usr/local/www/services_dhcp.php:272 usr/local/www/services_dhcp.php:283
+#: usr/local/www/services_dhcp.php:335 usr/local/www/services_dhcp.php:316
+#: usr/local/www/services_dhcp.php:336 usr/local/www/services_dhcp.php:336
+msgid "Boolean type must be true, false, on, or off."
+msgstr "boolean型は、オン、またはオフ偽、真でなければなりません。"
+
+#: usr/local/www/services_dhcp.php:274 usr/local/www/services_dhcp.php:285
+#: usr/local/www/services_dhcp.php:337 usr/local/www/services_dhcp.php:318
+#: usr/local/www/services_dhcp.php:338 usr/local/www/services_dhcp.php:338
+msgid "Unsigned 8-bit integer type must be a number in the range 0 to 255."
+msgstr "符号なし8ビット整数型は、 255の範囲は0の数字でなければなりません。"
+
+#: usr/local/www/services_dhcp.php:276 usr/local/www/services_dhcp.php:287
+#: usr/local/www/services_dhcp.php:339 usr/local/www/services_dhcp.php:320
+#: usr/local/www/services_dhcp.php:340 usr/local/www/services_dhcp.php:340
+msgid "Unsigned 16-bit integer type must be a number in the range 0 to 65535."
+msgstr "符号なしの16ビット整数型65535の範囲は0の数字でなければなりません。"
+
+#: usr/local/www/services_dhcp.php:278 usr/local/www/services_dhcp.php:289
+#: usr/local/www/services_dhcp.php:341 usr/local/www/services_dhcp.php:322
+#: usr/local/www/services_dhcp.php:342 usr/local/www/services_dhcp.php:342
+msgid ""
+"Unsigned 32-bit integer type must be a number in the range 0 to 4294967295."
+msgstr "「符号なし32ビット整数型が4294967295の範囲は0の数字でなければなりません。"
+
+#: usr/local/www/services_dhcp.php:280 usr/local/www/services_dhcp.php:291
+#: usr/local/www/services_dhcp.php:343 usr/local/www/services_dhcp.php:324
+#: usr/local/www/services_dhcp.php:344 usr/local/www/services_dhcp.php:344
+msgid "Signed 8-bit integer type must be a number in the range -128 to 127."
+msgstr "符号付き8ビット整数型は範囲-128〜127の数値でなければなりません。"
+
+#: usr/local/www/services_dhcp.php:282 usr/local/www/services_dhcp.php:293
+#: usr/local/www/services_dhcp.php:345 usr/local/www/services_dhcp.php:326
+#: usr/local/www/services_dhcp.php:346 usr/local/www/services_dhcp.php:346
+msgid ""
+"Signed 16-bit integer type must be a number in the range -32768 to 32767."
+msgstr "「符号付き16ビット整数型の範囲-32768〜32767の数字でなければなりません。"
+
+#: usr/local/www/services_dhcp.php:284 usr/local/www/services_dhcp.php:295
+#: usr/local/www/services_dhcp.php:347 usr/local/www/services_dhcp.php:328
+#: usr/local/www/services_dhcp.php:348 usr/local/www/services_dhcp.php:348
+msgid ""
+"Signed 32-bit integer type must be a number in the range -2147483648 to "
+"2147483647."
+msgstr "2147483647 「符号付き32ビット整数型は-2147483648に内数でなければなりません」 。"
+
+#: usr/local/www/services_dhcp.php:286 usr/local/www/services_dhcp.php:297
+#: usr/local/www/services_dhcp.php:349 usr/local/www/services_dhcp.php:330
+#: usr/local/www/services_dhcp.php:350 usr/local/www/services_dhcp.php:350
+msgid "IP address or host type must be an IP address or host name."
+msgstr "IPアドレスまたはホストタイプは、IPアドレスまたはホスト名でなければなりません。"
+
+#: usr/local/www/services_dhcp.php:297 usr/local/www/services_dhcpv6.php:230
+#: usr/local/www/services_dhcp.php:308 usr/local/www/services_dhcpv6.php:252
+#: usr/local/www/services_dhcp.php:360 usr/local/www/services_dhcpv6.php:237
+#: usr/local/www/services_dhcp.php:341 usr/local/www/services_dhcpv6.php:232
+#: usr/local/www/services_dhcp.php:361 usr/local/www/services_dhcp.php:361
+#: usr/local/www/services_dhcpv6.php:232
+msgid "The specified range lies outside of the current subnet."
+msgstr "指定された範囲は、現在のサブネットの外側にある。"
+
+#: usr/local/www/services_dhcp.php:301 usr/local/www/services_dhcp.php:312
+#: usr/local/www/services_dhcpv6.php:257 usr/local/www/services_dhcp.php:364
+#: usr/local/www/services_dhcpv6.php:242 usr/local/www/services_dhcp.php:345
+#: usr/local/www/services_dhcpv6.php:237 usr/local/www/services_dhcp.php:365
+#: usr/local/www/services_dhcp.php:365 usr/local/www/services_dhcpv6.php:237
+msgid "The range is invalid (first element higher than second element)."
+msgstr "範囲は、 (第2要素よりも、最初の要素が高い)が無効です。"
+
+#: usr/local/www/services_dhcp.php:305 usr/local/www/services_dhcpv6.php:240
+#: usr/local/www/services_dhcp.php:316 usr/local/www/services_dhcpv6.php:261
+#: usr/local/www/services_dhcp.php:372 usr/local/www/services_dhcpv6.php:246
+#: usr/local/www/services_dhcp.php:368 usr/local/www/services_dhcpv6.php:241
+#: usr/local/www/services_dhcp.php:388 usr/local/www/services_dhcp.php:388
+#: usr/local/www/services_dhcpv6.php:241
+#, php-format
+msgid ""
+"You must disable the DHCP relay on the %s interface before enabling the DHCP "
+"server."
+msgstr "サーバ」は、DHCPを有効にする前に%sインターフェイス上でDHCPリレーを無効にする必要があります」 。"
+
+#: usr/local/www/services_dhcp.php:315 usr/local/www/services_dhcp.php:326
+#: usr/local/www/services_dhcpv6.php:276 usr/local/www/services_dhcp.php:382
+#: usr/local/www/services_dhcpv6.php:261 usr/local/www/services_dhcp.php:378
+#: usr/local/www/services_dhcpv6.php:256 usr/local/www/services_dhcp.php:398
+#: usr/local/www/services_dhcp.php:398 usr/local/www/services_dhcpv6.php:256
+#, php-format
+msgid "The DHCP range cannot overlap any static DHCP mappings."
+msgstr "DHCP範囲は、静的DHCPマッピングをオーバーラップすることはできません。"
+
+#: usr/local/www/services_dhcp.php:421 usr/local/www/services_dhcp.php:433
+#: usr/local/www/services_dhcp.php:527 usr/local/www/services_dhcp.php:526
+#: usr/local/www/services_dhcp.php:546 usr/local/www/services_dhcp.php:546
+msgid "DHCP server"
+msgstr "DHCPサーバ"
+
+#: usr/local/www/services_dhcp.php:435 usr/local/www/services_dhcp.php:447
+#: usr/local/www/services_dhcp.php:540 usr/local/www/services_dhcp.php:539
+#: usr/local/www/services_dhcp.php:559 usr/local/www/services_dhcp.php:559
+msgid "Text"
+msgstr "テキスト"
+
+#: usr/local/www/services_dhcp.php:435 usr/local/www/services_dhcp.php:447
+#: usr/local/www/services_dhcp.php:540 usr/local/www/services_dhcp.php:539
+#: usr/local/www/services_dhcp.php:559 usr/local/www/services_dhcp.php:559
+msgid "String"
+msgstr "文字列"
+
+#: usr/local/www/services_dhcp.php:435 usr/local/www/services_dhcp.php:447
+#: usr/local/www/services_dhcp.php:540 usr/local/www/services_dhcp.php:539
+#: usr/local/www/services_dhcp.php:559 usr/local/www/services_dhcp.php:559
+msgid "Boolean"
+msgstr "ブーリアン"
+
+#: usr/local/www/services_dhcp.php:436 usr/local/www/services_dhcp.php:448
+#: usr/local/www/services_dhcp.php:541 usr/local/www/services_dhcp.php:540
+#: usr/local/www/services_dhcp.php:560 usr/local/www/services_dhcp.php:560
+msgid "Unsigned 8-bit integer"
+msgstr "符号なし8ビット整数"
+
+#: usr/local/www/services_dhcp.php:436 usr/local/www/services_dhcp.php:448
+#: usr/local/www/services_dhcp.php:541 usr/local/www/services_dhcp.php:540
+#: usr/local/www/services_dhcp.php:560 usr/local/www/services_dhcp.php:560
+msgid "Unsigned 16-bit integer"
+msgstr "符号なしの16ビット整数"
+
+#: usr/local/www/services_dhcp.php:436 usr/local/www/services_dhcp.php:448
+#: usr/local/www/services_dhcp.php:541 usr/local/www/services_dhcp.php:540
+#: usr/local/www/services_dhcp.php:560 usr/local/www/services_dhcp.php:560
+msgid "Unsigned 32-bit integer"
+msgstr "符号なしの32ビット整数"
+
+#: usr/local/www/services_dhcp.php:437 usr/local/www/services_dhcp.php:449
+#: usr/local/www/services_dhcp.php:542 usr/local/www/services_dhcp.php:541
+#: usr/local/www/services_dhcp.php:561 usr/local/www/services_dhcp.php:561
+msgid "Signed 8-bit integer"
+msgstr "符号付き8ビット整数"
+
+#: usr/local/www/services_dhcp.php:437 usr/local/www/services_dhcp.php:449
+#: usr/local/www/services_dhcp.php:542 usr/local/www/services_dhcp.php:541
+#: usr/local/www/services_dhcp.php:561 usr/local/www/services_dhcp.php:561
+msgid "Signed 16-bit integer"
+msgstr "符号付き16ビット整数"
+
+#: usr/local/www/services_dhcp.php:437 usr/local/www/services_dhcp.php:449
+#: usr/local/www/services_dhcp.php:542 usr/local/www/services_dhcp.php:541
+#: usr/local/www/services_dhcp.php:561 usr/local/www/services_dhcp.php:561
+msgid "Signed 32-bit integer"
+msgstr "符号付き32ビット整数"
+
+#: usr/local/www/services_dhcp.php:437 usr/local/www/services_dhcp.php:449
+#: usr/local/www/services_dhcp.php:542 usr/local/www/services_dhcp.php:541
+#: usr/local/www/services_dhcp.php:561 usr/local/www/services_dhcp.php:561
+msgid "IP address or host"
+msgstr "IPアドレスまたはホスト"
+
+#: usr/local/www/services_dhcp.php:528 usr/local/www/services_dhcpv6.php:453
+#: usr/local/www/services_dhcp.php:541 usr/local/www/services_dhcpv6.php:480
+#: usr/local/www/services_dhcp.php:645 usr/local/www/services_dhcpv6.php:460
+#: usr/local/www/services_dhcp.php:647 usr/local/www/services_dhcpv6.php:455
+#: usr/local/www/services_dhcp.php:667 usr/local/www/services_dhcp.php:667
+#: usr/local/www/services_dhcpv6.php:455
+msgid ""
+"DHCP Relay is currently enabled. Cannot enable the DHCP Server service while "
+"the DHCP Relay is enabled on any interface."
+msgstr "「 DHCPリレーは、現在有効になっています。ながら、 DHCPサーバーサービスを有効にできません」 DHCPリレーは、どのインターフェイスで有効になっています。"
+
+#: usr/local/www/services_dhcp.php:536 usr/local/www/services_dhcpv6.php:461
+#: usr/local/www/services_dhcp.php:549 usr/local/www/services_dhcpv6.php:488
+#: usr/local/www/services_dhcp.php:653 usr/local/www/services_dhcpv6.php:468
+#: usr/local/www/services_dhcp.php:655 usr/local/www/services_dhcpv6.php:463
+#: usr/local/www/services_dhcp.php:675 usr/local/www/services_dhcp.php:675
+#: usr/local/www/services_dhcpv6.php:463
+msgid "The static mapping configuration has been changed"
+msgstr "静的なマッピング構成が変更された"
+
+#: usr/local/www/services_dhcp.php:575 usr/local/www/services_dhcp.php:588
+#: usr/local/www/services_dhcp.php:693 usr/local/www/services_dhcp.php:695
+#: usr/local/www/services_dhcp.php:715 usr/local/www/services_dhcp.php:715
+#, php-format
+msgid "Enable DHCP server on %s interface"
+msgstr "%sインターフェイス上でDHCPサーバを有効にする"
+
+#: usr/local/www/services_dhcp.php:583 usr/local/www/services_dhcpv6.php:518
+#: usr/local/www/services_dhcp.php:596 usr/local/www/services_dhcpv6.php:592
+#: usr/local/www/services_dhcp.php:706 usr/local/www/services_dhcpv6.php:523
+#: usr/local/www/services_dhcp.php:708 usr/local/www/services_dhcpv6.php:534
+#: usr/local/www/services_dhcp.php:728 usr/local/www/services_dhcp.php:728
+#: usr/local/www/services_dhcpv6.php:534
+msgid "Deny unknown clients"
+msgstr "不明なクライアントを否定"
+
+#: usr/local/www/services_dhcp.php:584 usr/local/www/services_dhcpv6.php:519
+#: usr/local/www/services_dhcp.php:597 usr/local/www/services_dhcpv6.php:593
+#: usr/local/www/services_dhcp.php:707 usr/local/www/services_dhcpv6.php:524
+#: usr/local/www/services_dhcp.php:709 usr/local/www/services_dhcpv6.php:535
+#: usr/local/www/services_dhcp.php:729 usr/local/www/services_dhcp.php:729
+#: usr/local/www/services_dhcpv6.php:535
+msgid ""
+"If this is checked, only the clients defined below will get DHCP leases from "
+"this server. "
+msgstr "このサーバー"チェックすると、以下に定義されている唯一のクライアントからのDHCPリースを取得します」 。"
+
+#: usr/local/www/services_dhcp.php:593 usr/local/www/services_dhcpv6.php:528
+#: usr/local/www/services_dhcp.php:606 usr/local/www/services_dhcpv6.php:602
+#: usr/local/www/services_dhcp.php:716 usr/local/www/services_dhcpv6.php:533
+#: usr/local/www/services_captiveportal_ip_edit.php:99
+#: usr/local/www/services_dhcp.php:726 usr/local/www/services_dhcpv6.php:548
+#: usr/local/www/services_dhcp.php:746
+#: usr/local/www/services_captiveportal_ip_edit.php:99
+#: usr/local/www/services_dhcp.php:746 usr/local/www/services_dhcpv6.php:548
+msgid "Subnet mask"
+msgstr "サブネットマスク"
+
+#: usr/local/www/services_dhcp.php:599 usr/local/www/services_dhcpv6.php:534
+#: usr/local/www/services_dhcp.php:612 usr/local/www/services_dhcpv6.php:608
+#: usr/local/www/services_dhcp.php:722 usr/local/www/services_dhcpv6.php:539
+#: usr/local/www/services_dhcp.php:732 usr/local/www/services_dhcpv6.php:554
+#: usr/local/www/services_dhcp.php:752 usr/local/www/services_dhcp.php:752
+#: usr/local/www/services_dhcpv6.php:554
+msgid "Available range"
+msgstr "利用可能な範囲"
+
+#: usr/local/www/services_dhcp.php:616 usr/local/www/services_dhcpv6.php:552
+#: usr/local/www/services_dhcp.php:629 usr/local/www/services_dhcpv6.php:625
+#: usr/local/www/services_dhcp.php:750 usr/local/www/vpn_l2tp.php:342
+#: usr/local/www/services_dhcpv6.php:556 usr/local/www/vpn_l2tp.php:345
+#: usr/local/www/services_dhcp.php:760 usr/local/www/services_dhcpv6.php:573
+#: usr/local/www/services_dhcp.php:780 usr/local/www/vpn_l2tp.php:345
+#: usr/local/www/services_dhcp.php:780 usr/local/www/services_dhcpv6.php:573
+msgid "Subnet Mask"
+msgstr "サブネットマスク"
+
+#: usr/local/www/services_dhcp.php:633 usr/local/www/services_dhcpv6.php:569
+#: usr/local/www/services_dhcp.php:646 usr/local/www/services_dhcpv6.php:642
+#: usr/local/www/services_dhcp.php:767 usr/local/www/services_dhcpv6.php:573
+#: usr/local/www/services_dhcp.php:777 usr/local/www/services_dhcpv6.php:590
+#: usr/local/www/services_dhcp.php:797 usr/local/www/services_dhcp.php:797
+#: usr/local/www/services_dhcpv6.php:590
+msgid "Range"
+msgstr "レンジ"
+
+#: usr/local/www/services_dhcp.php:640 usr/local/www/services_dhcp.php:653
+#: usr/local/www/services_dhcp.php:829
+#: usr/local/www/services_dhcp_edit.php:395
+#: usr/local/www/services_dhcp.php:843 usr/local/www/services_dhcp.php:863
+#: usr/local/www/services_dhcp_edit.php:395
+#: usr/local/www/services_dhcp.php:863
+msgid "WINS servers"
+msgstr "WINSサーバー"
+
+#: usr/local/www/services_dhcp.php:651 usr/local/www/services_dhcpv6.php:594
+#: usr/local/www/services_dhcp.php:664 usr/local/www/services_dhcpv6.php:671
+#: usr/local/www/services_router_advertisements.php:376
+#: usr/local/www/services_dhcp.php:840 usr/local/www/services_dhcpv6.php:602
+#: usr/local/www/services_dhcp_edit.php:406
+#: usr/local/www/services_dhcp.php:854 usr/local/www/services_dhcpv6.php:619
+#: usr/local/www/services_router_advertisements.php:371
+#: usr/local/www/services_dhcp.php:874
+#: usr/local/www/services_router_advertisements.php:371
+#: usr/local/www/services_dhcp_edit.php:406
+#: usr/local/www/services_dhcp.php:874 usr/local/www/services_dhcpv6.php:619
+msgid ""
+"NOTE: leave blank to use the system default DNS servers - this interface's "
+"IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the "
+"General page."
+msgstr ""注:システムのデフォルトのDNSサーバーを使用する場合は、空白のままに - このインタフェースの「 DNSフォワーダが有効になっている場合は、IP 、そうでないサーバは「一般的なページで設定。"
+
+#: usr/local/www/services_dhcp.php:658 usr/local/www/services_dhcpv6.php:602
+#: usr/local/www/services_dhcp.php:671 usr/local/www/services_dhcp.php:847
+#: usr/local/www/services_dhcp_edit.php:413
+#: usr/local/www/services_dhcp.php:861 usr/local/www/services_dhcp.php:881
+#: usr/local/www/services_dhcp_edit.php:413
+#: usr/local/www/services_dhcp.php:881
+msgid ""
+"The default is to use the IP on this interface of the firewall as the "
+"gateway. Specify an alternate gateway here if this is not the correct "
+"gateway for your network."
+msgstr "ゲートウェイは「デフォルトでは、ファイアウォールのこのインターフェイスでIPを使用することです」 。これがネットワークに適して「ゲートウェイでない場合は、ここで別のゲートウェイを指定します。"
+
+#: usr/local/www/services_dhcp.php:662 usr/local/www/services_dhcpv6.php:607
+#: usr/local/www/services_dhcp.php:675 usr/local/www/services_dhcpv6.php:675
+#: usr/local/www/services_dhcp.php:851 usr/local/www/services_dhcpv6.php:606
+#: usr/local/www/services_dhcp_edit.php:417
+#: usr/local/www/services_dhcp.php:865 usr/local/www/services_dhcpv6.php:623
+#: usr/local/www/services_dhcp.php:885
+#: usr/local/www/services_dhcp_edit.php:417
+#: usr/local/www/services_dhcp.php:885 usr/local/www/services_dhcpv6.php:623
+msgid "Domain name"
+msgstr "ドメイン名"
+
+#: usr/local/www/services_dhcp.php:665 usr/local/www/services_dhcpv6.php:610
+#: usr/local/www/services_dhcp.php:678 usr/local/www/services_dhcpv6.php:678
+#: usr/local/www/services_dhcp.php:854 usr/local/www/services_dhcpv6.php:609
+#: usr/local/www/services_dhcp_edit.php:420
+#: usr/local/www/services_dhcp.php:868 usr/local/www/services_dhcpv6.php:626
+#: usr/local/www/services_dhcp.php:888
+#: usr/local/www/services_dhcp_edit.php:420
+#: usr/local/www/services_dhcp.php:888 usr/local/www/services_dhcpv6.php:626
+msgid ""
+"The default is to use the domain name of this system as the default domain "
+"name provided by DHCP. You may specify an alternate domain name here."
+msgstr "DHCPによって提供された名前「デフォルトでは、デフォルトのドメインとして、このシステムのドメイン名を使用することです」 。あなたがここに代替ドメイン名を指定することもできます。"
+
+#: usr/local/www/services_dhcp.php:669 usr/local/www/services_dhcpv6.php:614
+#: usr/local/www/services_dhcp.php:682 usr/local/www/services_dhcpv6.php:682
+#: usr/local/www/services_router_advertisements.php:381
+#: usr/local/www/services_dhcp.php:858 usr/local/www/services_dhcpv6.php:613
+#: usr/local/www/services_dhcp_edit.php:424
+#: usr/local/www/services_dhcp.php:872 usr/local/www/services_dhcpv6.php:630
+#: usr/local/www/services_router_advertisements.php:376
+#: usr/local/www/services_dhcp.php:892
+#: usr/local/www/services_router_advertisements.php:376
+#: usr/local/www/services_dhcp_edit.php:424
+#: usr/local/www/services_dhcp.php:892 usr/local/www/services_dhcpv6.php:630
+msgid "Domain search list"
+msgstr "ドメインサーチリスト"
+
+#: usr/local/www/services_dhcp.php:672 usr/local/www/services_dhcpv6.php:617
+msgid "The DHCP server can optionally provide a domain search list."
+msgstr "DHCPサーバは、必要に応じて、ドメイン検索リストを提供することができる。"
+
+#: usr/local/www/services_dhcp.php:676 usr/local/www/services_dhcpv6.php:621
+#: usr/local/www/services_dhcp.php:689 usr/local/www/services_dhcpv6.php:689
+#: usr/local/www/services_dhcp.php:865 usr/local/www/services_dhcpv6.php:620
+#: usr/local/www/services_dhcp_edit.php:431
+#: usr/local/www/services_dhcp.php:879 usr/local/www/services_dhcpv6.php:637
+#: usr/local/www/services_dhcp.php:899
+#: usr/local/www/services_dhcp_edit.php:431
+#: usr/local/www/services_dhcp.php:899 usr/local/www/services_dhcpv6.php:637
+msgid "Default lease time"
+msgstr "デフォルトのリース時間"
+
+#: usr/local/www/services_dhcp.php:680 usr/local/www/services_dhcpv6.php:625
+#: usr/local/www/services_dhcp.php:693 usr/local/www/services_dhcpv6.php:693
+#: usr/local/www/services_dhcp.php:869 usr/local/www/services_dhcpv6.php:624
+#: usr/local/www/services_dhcp_edit.php:435
+#: usr/local/www/services_dhcp.php:883 usr/local/www/services_dhcpv6.php:641
+#: usr/local/www/services_dhcp.php:903
+#: usr/local/www/services_dhcp_edit.php:435
+#: usr/local/www/services_dhcp.php:903 usr/local/www/services_dhcpv6.php:641
+msgid ""
+"This is used for clients that do not ask for a specific expiration time."
+msgstr "「これは、特定の有効期限は求めないクライアントのために使用されます。"
+
+#: usr/local/www/services_dhcp.php:682 usr/local/www/services_dhcpv6.php:627
+#: usr/local/www/services_dhcp.php:695 usr/local/www/services_dhcpv6.php:695
+#: usr/local/www/services_dhcp.php:871 usr/local/www/services_dhcpv6.php:626
+#: usr/local/www/services_dhcp_edit.php:437
+#: usr/local/www/services_dhcp.php:885 usr/local/www/services_dhcpv6.php:643
+#: usr/local/www/services_dhcp.php:905
+#: usr/local/www/services_dhcp_edit.php:437
+#: usr/local/www/services_dhcp.php:905 usr/local/www/services_dhcpv6.php:643
+msgid "The default is 7200 seconds."
+msgstr "デフォルトは7200秒です。"
+
+#: usr/local/www/services_dhcp.php:686 usr/local/www/services_dhcpv6.php:631
+#: usr/local/www/services_dhcp.php:699 usr/local/www/services_dhcpv6.php:699
+#: usr/local/www/services_dhcp.php:875 usr/local/www/services_dhcpv6.php:630
+#: usr/local/www/services_dhcp_edit.php:441
+#: usr/local/www/services_dhcp.php:889 usr/local/www/services_dhcpv6.php:647
+#: usr/local/www/services_dhcp.php:909
+#: usr/local/www/services_dhcp_edit.php:441
+#: usr/local/www/services_dhcp.php:909 usr/local/www/services_dhcpv6.php:647
+msgid "Maximum lease time"
+msgstr "最大リース時間"
+
+#: usr/local/www/services_dhcp.php:690 usr/local/www/services_dhcpv6.php:635
+#: usr/local/www/services_dhcp.php:703 usr/local/www/services_dhcpv6.php:703
+#: usr/local/www/services_dhcp.php:879 usr/local/www/services_dhcpv6.php:634
+#: usr/local/www/services_dhcp_edit.php:445
+#: usr/local/www/services_dhcp.php:893 usr/local/www/services_dhcpv6.php:651
+#: usr/local/www/services_dhcp.php:913
+#: usr/local/www/services_dhcp_edit.php:445
+#: usr/local/www/services_dhcp.php:913 usr/local/www/services_dhcpv6.php:651
+msgid ""
+"This is the maximum lease time for clients that ask for a specific "
+"expiration time."
+msgstr "有効期限は「これは、特定を求めるクライアントの最大リース時間です」 。"
+
+#: usr/local/www/services_dhcp.php:692 usr/local/www/services_dhcpv6.php:637
+#: usr/local/www/services_dhcp.php:705 usr/local/www/services_dhcpv6.php:705
+#: usr/local/www/services_dhcp.php:881 usr/local/www/services_dhcpv6.php:636
+#: usr/local/www/services_dhcp_edit.php:447
+#: usr/local/www/services_dhcp.php:895 usr/local/www/services_dhcpv6.php:653
+#: usr/local/www/services_dhcp.php:915
+#: usr/local/www/services_dhcp_edit.php:447
+#: usr/local/www/services_dhcp.php:915 usr/local/www/services_dhcpv6.php:653
+msgid "The default is 86400 seconds."
+msgstr "デフォルトは86400秒です。"
+
+#: usr/local/www/services_dhcp.php:696 usr/local/www/services_dhcpv6.php:641
+#: usr/local/www/services_dhcp.php:709 usr/local/www/services_dhcpv6.php:709
+#: usr/local/www/services_dhcp.php:886 usr/local/www/services_dhcpv6.php:640
+#: usr/local/www/services_dhcp.php:900 usr/local/www/services_dhcpv6.php:657
+#: usr/local/www/services_dhcp.php:920 usr/local/www/services_dhcp.php:920
+#: usr/local/www/services_dhcpv6.php:657
+msgid "Failover peer IP:"
+msgstr "フェールオーバーピアのIPアドレス:"
+
+#: usr/local/www/services_dhcp.php:699 usr/local/www/services_dhcpv6.php:644
+#: usr/local/www/services_dhcp.php:712 usr/local/www/services_dhcpv6.php:712
+#: usr/local/www/services_dhcp.php:889 usr/local/www/services_dhcpv6.php:643
+#: usr/local/www/services_dhcpv6.php:660 usr/local/www/services_dhcpv6.php:660
+msgid ""
+"Leave blank to disable. Enter the interface IP address of the other "
+"machine. Machines must be using CARP."
+msgstr "「無効にする場合は空白のままにしておきます。他のインターフェイスIPアドレスを入力し、 "マシンを。マシンは、CARPを使用する必要があります。"
+
+#: usr/local/www/services_dhcp.php:703 usr/local/www/services_dhcp.php:716
+#: usr/local/www/services_dhcp.php:895 usr/local/www/services_dhcp.php:909
+#: usr/local/www/services_dhcp.php:1150 usr/local/www/services_dhcp.php:929
+#: usr/local/www/services_dhcp.php:1170 usr/local/www/services_dhcp.php:929
+#: usr/local/www/services_dhcp.php:1170
+msgid "Static ARP"
+msgstr "スタティックARP"
+
+#: usr/local/www/services_dhcp.php:710 usr/local/www/services_dhcp.php:723
+#: usr/local/www/services_dhcp.php:902 usr/local/www/services_dhcp.php:916
+#: usr/local/www/services_dhcp.php:936 usr/local/www/services_dhcp.php:936
+msgid "Enable Static ARP entries"
+msgstr "スタティックARPエントリを有効にする"
+
+#: usr/local/www/services_dhcp.php:715 usr/local/www/services_dhcp.php:728
+#: usr/local/www/services_dhcp.php:907 usr/local/www/services_dhcp.php:921
+#: usr/local/www/services_dhcp.php:941
+msgid ""
+"Only the machines listed below will be able to communicate with the firewall "
+"on this NIC."
+msgstr "このNICは、「以下に示すだけのマシンがファイアウォールと通信できるようになります」 。"
+
+#: usr/local/www/services_dhcp.php:725 usr/local/www/services_dhcpv6.php:651
+#: usr/local/www/services_dhcp.php:763 usr/local/www/services_dhcpv6.php:744
+#: usr/local/www/services_dhcp.php:945 usr/local/www/services_dhcpv6.php:675
+#: usr/local/www/services_dhcp_edit.php:454
+#: usr/local/www/services_dhcp.php:958 usr/local/www/services_dhcpv6.php:692
+#: usr/local/www/services_dhcp.php:978
+#: usr/local/www/services_dhcp_edit.php:454
+#: usr/local/www/services_dhcp.php:978 usr/local/www/services_dhcpv6.php:692
+msgid "Show Dynamic DNS"
+msgstr "ダイナミックDNSを表示"
+
+#: usr/local/www/services_dhcp.php:729 usr/local/www/services_dhcpv6.php:655
+#: usr/local/www/services_dhcp.php:767 usr/local/www/services_dhcpv6.php:748
+#: usr/local/www/services_dhcp.php:949 usr/local/www/services_dhcpv6.php:679
+#: usr/local/www/services_dhcp_edit.php:458
+#: usr/local/www/services_dhcp.php:962 usr/local/www/services_dhcpv6.php:696
+#: usr/local/www/services_dhcp.php:982
+#: usr/local/www/services_dhcp_edit.php:458
+#: usr/local/www/services_dhcp.php:982 usr/local/www/services_dhcpv6.php:696
+msgid "Enable registration of DHCP client names in DNS."
+msgstr "DNSにDHCPクライアント名の登録を有効にします。"
+
+#: usr/local/www/services_dhcp.php:732 usr/local/www/services_dhcpv6.php:658
+#: usr/local/www/services_dhcp.php:770 usr/local/www/services_dhcpv6.php:751
+#: usr/local/www/services_dhcp.php:952 usr/local/www/services_dhcpv6.php:682
+#: usr/local/www/services_dhcp_edit.php:461
+#: usr/local/www/services_dhcp.php:965 usr/local/www/services_dhcpv6.php:699
+#: usr/local/www/services_dhcp.php:985
+#: usr/local/www/services_dhcp_edit.php:461
+#: usr/local/www/services_dhcp.php:985 usr/local/www/services_dhcpv6.php:699
+msgid "Note: Leave blank to disable dynamic DNS registration."
+msgstr "注:動的DNS登録を無効にするには空白のままにします。"
+
+#: usr/local/www/services_dhcp.php:733 usr/local/www/services_dhcpv6.php:659
+#: usr/local/www/services_dhcp.php:771 usr/local/www/services_dhcpv6.php:752
+#: usr/local/www/services_dhcp.php:953 usr/local/www/services_dhcpv6.php:683
+#: usr/local/www/services_dhcp_edit.php:462
+#: usr/local/www/services_dhcp.php:966 usr/local/www/services_dhcpv6.php:700
+#: usr/local/www/services_dhcp.php:986
+#: usr/local/www/services_dhcp_edit.php:462
+#: usr/local/www/services_dhcp.php:986 usr/local/www/services_dhcpv6.php:700
+msgid ""
+"Enter the dynamic DNS domain which will be used to register client names in "
+"the DNS server."
+msgstr "DNSサーバ」で、クライアント名を登録するために使用されるダイナミックDNSドメインを入力してください "。"
+
+#: usr/local/www/services_dhcp.php:738 usr/local/www/services_dhcpv6.php:664
+#: usr/local/www/services_dhcp.php:776 usr/local/www/services_dhcpv6.php:757
+#: usr/local/www/services_dhcp.php:972 usr/local/www/services_dhcpv6.php:688
+#: usr/local/www/services_dhcp_edit.php:467
+#: usr/local/www/services_dhcp.php:985 usr/local/www/services_dhcpv6.php:705
+#: usr/local/www/services_dhcp.php:1005
+#: usr/local/www/services_dhcp_edit.php:467
+#: usr/local/www/services_dhcp.php:1005 usr/local/www/services_dhcpv6.php:705
+msgid "NTP servers"
+msgstr "NTPサーバー"
+
+#: usr/local/www/services_dhcp.php:741 usr/local/www/services_dhcpv6.php:667
+#: usr/local/www/services_dhcp.php:779 usr/local/www/services_dhcpv6.php:760
+#: usr/local/www/services_dhcp.php:975 usr/local/www/services_dhcpv6.php:691
+#: usr/local/www/services_dhcp_edit.php:470
+#: usr/local/www/services_dhcp.php:988 usr/local/www/services_dhcpv6.php:708
+#: usr/local/www/services_dhcp.php:1008
+#: usr/local/www/services_dhcp_edit.php:470
+#: usr/local/www/services_dhcp.php:1008 usr/local/www/services_dhcpv6.php:708
+msgid "Show NTP configuration"
+msgstr "表示NTP設定"
+
+#: usr/local/www/services_dhcp.php:750 usr/local/www/services_dhcpv6.php:676
+#: usr/local/www/services_dhcp.php:788 usr/local/www/services_dhcpv6.php:770
+#: usr/local/www/services_dhcp.php:984 usr/local/www/services_dhcpv6.php:701
+#: usr/local/www/services_dhcp_edit.php:479
+#: usr/local/www/services_dhcp.php:997 usr/local/www/services_dhcpv6.php:718
+#: usr/local/www/services_dhcp.php:1017
+#: usr/local/www/services_dhcp_edit.php:479
+#: usr/local/www/services_dhcp.php:1017 usr/local/www/services_dhcpv6.php:718
+msgid "TFTP server"
+msgstr "TFTPサーバ"
+
+#: usr/local/www/services_dhcp.php:753 usr/local/www/services_dhcpv6.php:679
+#: usr/local/www/services_dhcp.php:791 usr/local/www/services_dhcpv6.php:773
+#: usr/local/www/services_dhcp.php:987 usr/local/www/services_dhcpv6.php:704
+#: usr/local/www/services_dhcp_edit.php:482
+#: usr/local/www/services_dhcp.php:1000 usr/local/www/services_dhcpv6.php:721
+#: usr/local/www/services_dhcp.php:1020
+#: usr/local/www/services_dhcp_edit.php:482
+#: usr/local/www/services_dhcp.php:1020 usr/local/www/services_dhcpv6.php:721
+msgid "Show TFTP configuration"
+msgstr "TFTP設定を表示します"
+
+#: usr/local/www/services_dhcp.php:757 usr/local/www/services_dhcpv6.php:683
+#: usr/local/www/services_dhcp.php:795 usr/local/www/services_dhcpv6.php:777
+#: usr/local/www/services_dhcp.php:991 usr/local/www/services_dhcpv6.php:708
+#: usr/local/www/services_dhcp_edit.php:486
+#: usr/local/www/services_dhcp.php:1004 usr/local/www/services_dhcpv6.php:725
+#: usr/local/www/services_dhcp.php:1024
+#: usr/local/www/services_dhcp_edit.php:486
+#: usr/local/www/services_dhcp.php:1024 usr/local/www/services_dhcpv6.php:725
+msgid ""
+"Leave blank to disable. Enter a full hostname or IP for the TFTP server."
+msgstr "「無効にする場合は空白のままに。 TFTPサーバの完全なホスト名またはIPアドレスを入力してください。"
+
+#: usr/local/www/services_dhcp.php:762 usr/local/www/services_dhcpv6.php:688
+#: usr/local/www/services_dhcp.php:800 usr/local/www/services_dhcpv6.php:783
+#: usr/local/www/services_dhcp.php:996 usr/local/www/services_dhcpv6.php:714
+#: usr/local/www/services_dhcp.php:1009 usr/local/www/services_dhcpv6.php:731
+#: usr/local/www/services_dhcp.php:1029 usr/local/www/services_dhcp.php:1029
+#: usr/local/www/services_dhcpv6.php:731
+msgid "LDAP URI"
+msgstr "LDAPのURI"
+
+#: usr/local/www/services_dhcp.php:765 usr/local/www/services_dhcpv6.php:691
+#: usr/local/www/services_dhcp.php:803 usr/local/www/services_dhcpv6.php:786
+#: usr/local/www/services_dhcp.php:999 usr/local/www/services_dhcpv6.php:717
+#: usr/local/www/services_dhcp.php:1012 usr/local/www/services_dhcpv6.php:734
+#: usr/local/www/services_dhcp.php:1032 usr/local/www/services_dhcp.php:1032
+#: usr/local/www/services_dhcpv6.php:734
+msgid "Show LDAP configuration"
+msgstr "LDAP設定を表示する"
+
+#: usr/local/www/services_dhcp.php:769 usr/local/www/services_dhcpv6.php:695
+#: usr/local/www/services_dhcp.php:807 usr/local/www/services_dhcpv6.php:790
+#: usr/local/www/services_dhcp.php:1003 usr/local/www/services_dhcpv6.php:721
+#: usr/local/www/services_dhcp.php:1016 usr/local/www/services_dhcpv6.php:738
+#: usr/local/www/services_dhcp.php:1036 usr/local/www/services_dhcp.php:1036
+#: usr/local/www/services_dhcpv6.php:738
+msgid ""
+"Leave blank to disable. Enter a full URI for the LDAP server in the form "
+"ldap://ldap.example.com/dc=example,dc=com"
+msgstr "「無効にする場合は空白のままに。形式でLDAPサーバの完全なURIを入力してください "LDAP:/ / ldap.example.com / dc = example、dc = comの"
+
+#: usr/local/www/services_dhcp.php:774 usr/local/www/services_dhcpv6.php:700
+#: usr/local/www/services_dhcp.php:812 usr/local/www/services_dhcpv6.php:795
+#: usr/local/www/services_dhcp.php:1008 usr/local/www/services_dhcpv6.php:726
+#: usr/local/www/services_dhcp.php:1021 usr/local/www/services_dhcpv6.php:743
+#: usr/local/www/services_dhcp.php:1041 usr/local/www/services_dhcp.php:1041
+#: usr/local/www/services_dhcpv6.php:743
+msgid "Enable network booting"
+msgstr "ネットワークブートを有効にする"
+
+#: usr/local/www/services_dhcp.php:777 usr/local/www/services_dhcpv6.php:703
+#: usr/local/www/services_dhcp.php:815 usr/local/www/services_dhcpv6.php:798
+#: usr/local/www/services_dhcp.php:1011 usr/local/www/services_dhcpv6.php:729
+#: usr/local/www/services_dhcp.php:1024 usr/local/www/services_dhcpv6.php:746
+#: usr/local/www/services_dhcp.php:1044 usr/local/www/services_dhcp.php:1044
+#: usr/local/www/services_dhcpv6.php:746
+msgid "Show Network booting"
+msgstr "表示ネットワーク起動"
+
+#: usr/local/www/services_dhcp.php:781 usr/local/www/services_dhcpv6.php:707
+#: usr/local/www/services_dhcp.php:819 usr/local/www/services_dhcpv6.php:802
+#: usr/local/www/services_dhcp.php:1015 usr/local/www/services_dhcpv6.php:733
+#: usr/local/www/services_dhcp.php:1028 usr/local/www/services_dhcpv6.php:750
+#: usr/local/www/services_dhcp.php:1048 usr/local/www/services_dhcp.php:1048
+#: usr/local/www/services_dhcpv6.php:750
+msgid "Enables network booting."
+msgstr "ネットワークブートを有効にします。"
+
+#: usr/local/www/services_dhcp.php:783 usr/local/www/services_dhcpv6.php:709
+#: usr/local/www/services_dhcp.php:821 usr/local/www/services_dhcpv6.php:804
+#: usr/local/www/services_dhcp.php:1017 usr/local/www/services_dhcpv6.php:735
+#: usr/local/www/services_dhcp.php:1030 usr/local/www/services_dhcpv6.php:752
+#: usr/local/www/services_dhcp.php:1050 usr/local/www/services_dhcp.php:1050
+#: usr/local/www/services_dhcpv6.php:752
+msgid "Enter the IP of the"
+msgstr "のIPアドレスを入力してください"
+
+#: usr/local/www/services_dhcp.php:783 usr/local/www/services_dhcpv6.php:709
+#: usr/local/www/services_dhcp.php:821 usr/local/www/services_dhcpv6.php:804
+#: usr/local/www/services_dhcp.php:1017 usr/local/www/services_dhcpv6.php:735
+#: usr/local/www/services_dhcp.php:1030 usr/local/www/services_dhcpv6.php:752
+#: usr/local/www/services_dhcp.php:1050 usr/local/www/services_dhcp.php:1050
+#: usr/local/www/services_dhcpv6.php:752
+msgid "next-server"
+msgstr "次世代サーバー"
+
+#: usr/local/www/services_dhcp.php:785 usr/local/www/services_dhcpv6.php:711
+#: usr/local/www/services_dhcp.php:823 usr/local/www/services_dhcpv6.php:806
+#: usr/local/www/services_dhcp.php:1019 usr/local/www/services_dhcpv6.php:737
+#: usr/local/www/services_dhcp.php:1032 usr/local/www/services_dhcpv6.php:754
+#: usr/local/www/services_dhcp.php:1052 usr/local/www/services_dhcp.php:1052
+#: usr/local/www/services_dhcpv6.php:754
+msgid "and the filename"
+msgstr "とファイル名"
+
+#: usr/local/www/services_dhcp.php:787 usr/local/www/services_dhcpv6.php:713
+#: usr/local/www/services_dhcp.php:825 usr/local/www/services_dhcpv6.php:808
+#: usr/local/www/services_dhcp.php:1021 usr/local/www/services_dhcpv6.php:739
+#: usr/local/www/services_dhcp.php:1034 usr/local/www/services_dhcpv6.php:756
+#: usr/local/www/services_dhcp.php:1054 usr/local/www/services_dhcp.php:1054
+#: usr/local/www/services_dhcpv6.php:756
+msgid ""
+"Note: You need both a filename and a boot server configured for this to work!"
+msgstr ""注意:あなたは仕事にファイル名と、このために設定されているブート·サーバの両方が必要 !"
+
+#: usr/local/www/services_dhcp.php:789 usr/local/www/services_dhcpv6.php:715
+#: usr/local/www/services_dhcpv6_edit.php:224
+#: usr/local/www/services_dhcp.php:827
+#: usr/local/www/services_dhcp_edit.php:247
+#: usr/local/www/services_dhcpv6.php:810
+#: usr/local/www/services_dhcpv6_edit.php:226
+#: usr/local/www/services_dhcp.php:1023
+#: usr/local/www/services_dhcp_edit.php:249
+#: usr/local/www/services_dhcpv6.php:741
+#: usr/local/www/services_dhcpv6_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:377
+#: usr/local/www/services_dhcp.php:1036 usr/local/www/services_dhcpv6.php:758
+#: usr/local/www/services_dhcp.php:1056
+#: usr/local/www/services_dhcpv6_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:377
+#: usr/local/www/services_dhcp.php:1056 usr/local/www/services_dhcpv6.php:758
+msgid "Enter the"
+msgstr "入力する"
+
+#: usr/local/www/services_dhcp.php:789 usr/local/www/services_dhcpv6.php:715
+#: usr/local/www/services_dhcpv6_edit.php:224
+#: usr/local/www/services_dhcp.php:827
+#: usr/local/www/services_dhcp_edit.php:247
+#: usr/local/www/services_dhcpv6.php:810
+#: usr/local/www/services_dhcpv6_edit.php:226
+#: usr/local/www/services_dhcp.php:1023
+#: usr/local/www/services_dhcp_edit.php:249
+#: usr/local/www/services_dhcpv6.php:741
+#: usr/local/www/services_dhcpv6_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:377
+#: usr/local/www/services_dhcp.php:1036 usr/local/www/services_dhcpv6.php:758
+#: usr/local/www/services_dhcp.php:1056
+#: usr/local/www/services_dhcpv6_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:377
+#: usr/local/www/services_dhcp.php:1056 usr/local/www/services_dhcpv6.php:758
+msgid "root-path"
+msgstr "ルート·パス"
+
+#: usr/local/www/services_dhcp.php:789 usr/local/www/services_dhcpv6.php:715
+#: usr/local/www/services_dhcpv6_edit.php:224
+#: usr/local/www/services_dhcp.php:827
+#: usr/local/www/services_dhcp_edit.php:247
+#: usr/local/www/services_dhcpv6.php:810
+#: usr/local/www/services_dhcpv6_edit.php:226
+#: usr/local/www/services_dhcp.php:1023
+#: usr/local/www/services_dhcp_edit.php:249
+#: usr/local/www/services_dhcpv6.php:741
+#: usr/local/www/services_dhcpv6_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:377
+#: usr/local/www/services_dhcp.php:1036 usr/local/www/services_dhcpv6.php:758
+#: usr/local/www/services_dhcp.php:1056
+#: usr/local/www/services_dhcpv6_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:377
+#: usr/local/www/services_dhcp.php:1056 usr/local/www/services_dhcpv6.php:758
+msgid "string"
+msgstr "文字列"
+
+#: usr/local/www/services_dhcp.php:791 usr/local/www/services_dhcpv6.php:717
+#: usr/local/www/services_dhcp.php:829 usr/local/www/services_dhcpv6.php:812
+#: usr/local/www/services_dhcp.php:1025 usr/local/www/services_dhcpv6.php:743
+#: usr/local/www/services_dhcp.php:1038 usr/local/www/services_dhcpv6.php:760
+#: usr/local/www/services_dhcp.php:1058 usr/local/www/services_dhcp.php:1058
+#: usr/local/www/services_dhcpv6.php:760
+msgid ""
+"Note: string-format: iscsi:(servername):(protocol):(port):(LUN):targetname"
+msgstr ""注:文字列形式: iSCSIイニシエータ: (サーバー名) : (プロトコル) : (ポート) : ( LUN ) :ターゲット名"
+
+#: usr/local/www/services_dhcp.php:796 usr/local/www/services_dhcpv6.php:722
+#: usr/local/www/services_dhcp.php:834 usr/local/www/services_dhcpv6.php:817
+#: usr/local/www/services_dhcp.php:1031 usr/local/www/services_dhcpv6.php:748
+#: usr/local/www/services_dhcp.php:1044 usr/local/www/services_dhcpv6.php:765
+#: usr/local/www/services_dhcp.php:1064 usr/local/www/services_dhcp.php:1064
+#: usr/local/www/services_dhcpv6.php:765
+msgid "Additional BOOTP/DHCP Options"
+msgstr "追加のBOOTP / DHCPオプション"
+
+#: usr/local/www/services_dhcp.php:799 usr/local/www/services_dhcpv6.php:725
+#: usr/local/www/services_dhcp.php:837 usr/local/www/services_dhcpv6.php:820
+#: usr/local/www/services_dhcp.php:1034 usr/local/www/services_dhcpv6.php:751
+#: usr/local/www/services_dhcp.php:1047 usr/local/www/services_dhcpv6.php:768
+#: usr/local/www/services_dhcp.php:1067 usr/local/www/services_dhcp.php:1067
+#: usr/local/www/services_dhcpv6.php:768
+msgid "Show Additional BOOTP/DHCP Options"
+msgstr "追加のBOOTP / DHCPオプションを表示する"
+
+#: usr/local/www/services_dhcp.php:807 usr/local/www/services_dhcpv6.php:733
+#: usr/local/www/services_dhcp.php:845 usr/local/www/services_dhcpv6.php:828
+#: usr/local/www/services_dhcp.php:1042 usr/local/www/services_dhcpv6.php:759
+#: usr/local/www/services_dhcp.php:1055 usr/local/www/services_dhcpv6.php:776
+#: usr/local/www/services_dhcp.php:1075 usr/local/www/services_dhcp.php:1075
+#: usr/local/www/services_dhcpv6.php:776
+msgid ""
+"Enter the DHCP option number and the value for each item you would like to "
+"include in the DHCP lease information. For a list of available options "
+"please visit this"
+msgstr "DHCPリース情報に含まれる「 DHCPオプション番号、あなたがしたい項目ごとに値を入力してください」 。使用可能なオプションのリストについては、 「これをご覧ください。"
+
+#: usr/local/www/services_dhcp.php:812
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/services_dhcpv6.php:738 usr/local/www/services_dhcp.php:850
+#: usr/local/www/services_dhcpv6.php:833
+#: usr/local/www/services_captiveportal_vouchers_edit.php:92
+#: usr/local/www/services_dhcp.php:1047 usr/local/www/services_dhcpv6.php:764
+#: usr/local/www/services_dhcp.php:1060 usr/local/www/services_dhcpv6.php:781
+#: usr/local/www/services_dhcp.php:1080 usr/local/www/services_dhcp.php:1080
+#: usr/local/www/services_captiveportal_vouchers_edit.php:92
+#: usr/local/www/services_dhcpv6.php:781
+msgid "Number"
+msgstr "数"
+
+#: usr/local/www/services_dhcp.php:814
+#: usr/local/www/load_balancer_relay_action_edit.php:506
+#: usr/local/www/system_advanced_sysctl.php:173
+#: usr/local/www/system_advanced_sysctl.php:249
+#: usr/local/www/services_dhcpv6.php:739
+#: usr/local/www/system_certmanager.php:763
+#: usr/local/www/load_balancer_relay_action_edit.php:505
+#: usr/local/www/services_dhcp.php:852 usr/local/www/services_dhcpv6.php:834
+#: usr/local/www/load_balancer_relay_action_edit.php:503
+#: usr/local/www/services_dhcp.php:1049 usr/local/www/services_dhcpv6.php:765
+#: usr/local/www/services_dhcp.php:1062
+#: usr/local/www/system_certmanager.php:788
+#: usr/local/www/services_dhcpv6.php:782 usr/local/www/services_dhcp.php:1082
+#: usr/local/www/system_certmanager.php:789
+#: usr/local/www/services_dhcp.php:1082
+#: usr/local/www/system_certmanager.php:789
+#: usr/local/www/load_balancer_relay_action_edit.php:503
+#: usr/local/www/services_dhcpv6.php:782
+#: usr/local/www/system_advanced_sysctl.php:173
+#: usr/local/www/system_advanced_sysctl.php:249
+msgid "Value"
+msgstr "値"
+
+#: usr/local/www/services_dhcp.php:877 usr/local/www/services_dhcpv6.php:790
+#: usr/local/www/services_dhcp.php:915 usr/local/www/services_dhcpv6.php:885
+#: usr/local/www/services_dhcp.php:1119 usr/local/www/services_dhcpv6.php:816
+#: usr/local/www/services_dhcp.php:1132 usr/local/www/services_dhcpv6.php:833
+#: usr/local/www/services_dhcp.php:1152 usr/local/www/services_dhcp.php:1152
+#: usr/local/www/services_dhcpv6.php:833
+msgid "The DNS servers entered in"
+msgstr "に入力されたDNSサーバ"
+
+#: usr/local/www/services_dhcp.php:877 usr/local/www/services_dhcpv6.php:790
+#: usr/local/www/services_dhcp.php:915 usr/local/www/services_dhcpv6.php:885
+#: usr/local/www/services_dhcp.php:1119 usr/local/www/services_dhcpv6.php:816
+#: usr/local/www/services_dhcp.php:1132 usr/local/www/services_dhcpv6.php:833
+#: usr/local/www/services_dhcp.php:1152 usr/local/www/services_dhcp.php:1152
+#: usr/local/www/services_dhcpv6.php:833
+msgid "System: General setup"
+msgstr "システム:一般的なセットアップ"
+
+#: usr/local/www/services_dhcp.php:878 usr/local/www/services_dhcpv6.php:791
+#: usr/local/www/services_dhcp.php:916 usr/local/www/services_dhcpv6.php:886
+#: usr/local/www/services_dhcp.php:1120 usr/local/www/services_dhcpv6.php:817
+#: usr/local/www/services_dhcp.php:1133 usr/local/www/services_dhcpv6.php:834
+#: usr/local/www/services_dhcp.php:1153 usr/local/www/services_dhcp.php:1153
+#: usr/local/www/services_dhcpv6.php:834
+msgid "(or the"
+msgstr "(または"
+
+#: usr/local/www/services_dhcp.php:879 usr/local/www/services_dhcpv6.php:792
+#: usr/local/www/services_dhcp.php:917 usr/local/www/services_dhcpv6.php:887
+#: usr/local/www/services_dhcp.php:1121 usr/local/www/services_dhcpv6.php:818
+#: usr/local/www/services_dhcp.php:1134 usr/local/www/services_dhcpv6.php:835
+#: usr/local/www/services_dhcp.php:1154 usr/local/www/services_dhcp.php:1154
+#: usr/local/www/services_dhcpv6.php:835
+msgid "if enabled)"
+msgstr "有効な場合)"
+
+#: usr/local/www/services_dhcp.php:879 usr/local/www/services_dhcpv6.php:792
+#: usr/local/www/services_dhcp.php:917 usr/local/www/services_dhcpv6.php:887
+#: usr/local/www/services_dhcp.php:1121 usr/local/www/services_dhcpv6.php:818
+#: usr/local/www/services_dhcp.php:1134 usr/local/www/services_dhcpv6.php:835
+#: usr/local/www/services_dhcp.php:1154 usr/local/www/services_dhcp.php:1154
+#: usr/local/www/services_dhcpv6.php:835
+msgid "will be assigned to clients by the DHCP server."
+msgstr "DHCPサーバによってクライアントに割り当てられる。"
+
+#: usr/local/www/services_dhcp.php:882 usr/local/www/services_dhcpv6.php:795
+#: usr/local/www/services_dhcp.php:920 usr/local/www/services_dhcpv6.php:890
+#: usr/local/www/services_dhcp.php:1124 usr/local/www/services_dhcpv6.php:821
+#: usr/local/www/services_dhcp.php:1137 usr/local/www/services_dhcpv6.php:838
+#: usr/local/www/services_dhcp.php:1157 usr/local/www/services_dhcp.php:1157
+#: usr/local/www/services_dhcpv6.php:838
+msgid "The DHCP lease table can be viewed on the"
+msgstr "DHCPリーステーブルには、上で閲覧することができます"
+
+#: usr/local/www/services_dhcp.php:882 usr/local/www/services_dhcpv6.php:795
+#: usr/local/www/services_dhcp.php:920 usr/local/www/services_dhcpv6.php:890
+#: usr/local/www/services_dhcp.php:1124 usr/local/www/services_dhcp.php:1137
+#: usr/local/www/services_dhcp.php:1157 usr/local/www/services_dhcp.php:1157
+msgid "Status: DHCP leases"
+msgstr "ステータス: DHCPリース"
+
+#: usr/local/www/services_dhcp.php:883 usr/local/www/services_dhcpv6.php:796
+#: usr/local/www/services_dhcp.php:921 usr/local/www/services_dhcpv6.php:891
+#: usr/local/www/services_dhcp.php:1125 usr/local/www/services_dhcpv6.php:822
+#: usr/local/www/services_dhcp.php:1138 usr/local/www/services_dhcpv6.php:839
+#: usr/local/www/services_dhcp.php:1158 usr/local/www/services_dhcp.php:1158
+#: usr/local/www/services_dhcpv6.php:839
+msgid "page."
+msgstr "ページ。"
+
+#: usr/local/www/services_dhcp_edit.php:116
+#: usr/local/www/services_dhcpv6_edit.php:113
+#: usr/local/www/services_dhcpv6_edit.php:115
+#: usr/local/www/services_dhcp_edit.php:118
+#: usr/local/www/services_dhcpv6_edit.php:118
+#: usr/local/www/services_dhcp_edit.php:152
+#: usr/local/www/services_dhcpv6_edit.php:118
+#: usr/local/www/services_dhcp_edit.php:152
+msgid "The hostname cannot end with a hyphen according to RFC952"
+msgstr "ホスト名は、 RFC952に従ってハイフンで終了することはできません"
+
+#: usr/local/www/services_dhcp_edit.php:121
+#: usr/local/www/services_dhcpv6_edit.php:118
+#: usr/local/www/services_dhcpv6_edit.php:120
+#: usr/local/www/services_dhcp_edit.php:123
+#: usr/local/www/services_dhcpv6_edit.php:123
+#: usr/local/www/services_dhcp_edit.php:157
+#: usr/local/www/services_dhcpv6_edit.php:123
+#: usr/local/www/services_dhcp_edit.php:157
+msgid ""
+"A valid hostname is specified, but the domain name part should be omitted"
+msgstr "「有効なホスト名が指定されているが、ドメイン名の部分は省略されるべき"
+
+#: usr/local/www/services_dhcp_edit.php:132
+#: usr/local/www/services_dhcp_edit.php:134
+#: usr/local/www/services_dhcp_edit.php:168
+#: usr/local/www/services_dhcp_edit.php:168
+msgid "Static ARP is enabled. You must specify an IP address."
+msgstr "スタティックARPが有効になっています。あなたは、 IPアドレスを指定する必要があります。"
+
+#: usr/local/www/services_dhcp_edit.php:141
+#: usr/local/www/services_dhcp_edit.php:143
+#: usr/local/www/services_dhcp_edit.php:177
+#: usr/local/www/services_dhcp_edit.php:177
+msgid "This Hostname, IP or MAC address already exists."
+msgstr "このホスト名、 IPアドレスまたはMACアドレスがすでに存在しています。"
+
+#: usr/local/www/services_dhcp_edit.php:152
+#: usr/local/www/services_dhcp_edit.php:154
+#: usr/local/www/services_dhcp_edit.php:188
+#: usr/local/www/services_dhcp_edit.php:188
+#, php-format
+msgid "The IP address must not be within the DHCP range for this interface."
+msgstr "IPアドレスは、このインターフェイスのDHCP範囲内にあってはならない。"
+
+#: usr/local/www/services_dhcp_edit.php:159
+#: usr/local/www/services_dhcp_edit.php:161
+#: usr/local/www/services_dhcp_edit.php:202
+#: usr/local/www/services_dhcp_edit.php:202
+#, php-format
+msgid "The IP address must lie in the %s subnet."
+msgstr "IPアドレスは、 %sサブネット内になければなりません。"
+
+#: usr/local/www/services_dhcp_edit.php:190
+#: usr/local/www/services_dhcpv6_edit.php:172
+#: usr/local/www/services_dhcpv6_edit.php:175
+#: usr/local/www/services_dhcp_edit.php:193
+#: usr/local/www/services_dhcpv6_edit.php:178
+#: usr/local/www/services_dhcp_edit.php:301
+#: usr/local/www/services_dhcpv6_edit.php:178
+#: usr/local/www/services_dhcp_edit.php:301
+msgid "Edit static mapping"
+msgstr "静的マッピングを編集"
+
+#: usr/local/www/services_dhcp_edit.php:204
+#: usr/local/www/services_dhcp_edit.php:207
+#: usr/local/www/services_dhcp_edit.php:206
+#: usr/local/www/services_dhcp_edit.php:334
+#: usr/local/www/services_dhcp_edit.php:334
+msgid "Static DHCP Mapping"
+msgstr "静的DHCPマッピング"
+
+#: usr/local/www/services_dhcp_edit.php:215
+#: usr/local/www/services_dhcp_edit.php:218
+#: usr/local/www/services_dhcp_edit.php:217
+#: usr/local/www/services_dhcp_edit.php:345
+#: usr/local/www/services_captiveportal_mac_edit.php:188
+#: usr/local/www/services_dhcp_edit.php:345
+#: usr/local/www/services_captiveportal_mac_edit.php:188
+msgid "Copy my MAC address"
+msgstr "私のMACアドレスをコピーします。"
+
+#: usr/local/www/services_dhcp_edit.php:217
+#: usr/local/www/services_dhcp_edit.php:220
+#: usr/local/www/services_dhcp_edit.php:219
+#: usr/local/www/services_dhcp_edit.php:347
+#: usr/local/www/services_dhcp_edit.php:347
+msgid "Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx"
+msgstr "次の形式でMACアドレスを入力してください: XX : XX : XX : XX : XX : XX"
+
+#: usr/local/www/services_dhcp_edit.php:225
+#: usr/local/www/services_dhcp_edit.php:228
+msgid ""
+"If no IP address is given, one will be dynamically allocated from the pool."
+msgstr "IPアドレスが指定されていない場合」 、 1は、動的にプールから割り当てられます。"
+
+#: usr/local/www/services_dhcp_edit.php:231
+#: usr/local/www/services_dhcpv6_edit.php:208
+#: usr/local/www/services_dhcpv6_edit.php:211
+#: usr/local/www/services_dhcp_edit.php:234
+#: usr/local/www/services_dhcpv6_edit.php:213
+#: usr/local/www/services_dhcp_edit.php:236
+#: usr/local/www/services_dhcpv6_edit.php:216
+#: usr/local/www/services_dhcp_edit.php:364
+#: usr/local/www/services_dhcpv6_edit.php:216
+#: usr/local/www/services_dhcp_edit.php:364
+msgid "Name of the host, without domain part."
+msgstr "ドメイン部分なしで、ホストの名前。"
+
+#: usr/local/www/services_dhcp_relay.php:72
+#: usr/local/www/services_dhcpv6_relay.php:73
+#: usr/local/www/services_dhcpv6_relay.php:73
+#: usr/local/www/services_dhcp_relay.php:72
+msgid "Destination Server"
+msgstr "先サーバ"
+
+#: usr/local/www/services_dhcp_relay.php:80
+msgid "A valid Destination Server IP address must be specified."
+msgstr "有効な宛先サーバのIPアドレスを指定する必要があります。"
+
+#: usr/local/www/services_dhcp_relay.php:100 usr/local/www/fbegin.inc:122
+#: usr/local/www/status_services.php:295
+#: usr/local/www/widgets/widgets/services_status.widget.php:100
+#: usr/local/www/fbegin.inc:139 etc/inc/service-utils.inc:278
+#: usr/local/www/fbegin.inc:148 usr/local/www/fbegin.inc:140
+#: etc/inc/service-utils.inc:277 etc/inc/service-utils.inc:294
+#: usr/local/www/fbegin.inc:140 usr/local/www/services_dhcp_relay.php:100
+#: etc/inc/service-utils.inc:294
+msgid "DHCP Relay"
+msgstr "DHCPリレー"
+
+#: usr/local/www/services_dhcp_relay.php:144
+#: usr/local/www/services_dhcp_relay.php:145
+#: usr/local/www/services_dhcp_relay.php:145
+msgid "DHCP Relay configuration"
+msgstr "DHCPリレーの設定"
+
+#: usr/local/www/services_dhcp_relay.php:150
+#: usr/local/www/services_dhcp_relay.php:151
+#: usr/local/www/services_dhcp_relay.php:151
+#, php-format
+msgid "Enable DHCP relay on interface"
+msgstr "インターフェイス上でDHCPリレーを有効にする"
+
+#: usr/local/www/services_dhcp_relay.php:175
+#: usr/local/www/services_dhcpv6_relay.php:176
+#: usr/local/www/services_dhcp_relay.php:176
+#: usr/local/www/services_dhcpv6_relay.php:177
+#: usr/local/www/services_dhcpv6_relay.php:177
+#: usr/local/www/services_dhcp_relay.php:176
+msgid "Append circuit ID and agent ID to requests"
+msgstr "要求に回線IDおよびエージェントIDを追加"
+
+#: usr/local/www/services_dhcp_relay.php:176
+#: usr/local/www/services_dhcp_relay.php:177
+#: usr/local/www/services_dhcp_relay.php:177
+#, php-format
+msgid ""
+"If this is checked, the DHCP relay will append the circuit ID (%s interface "
+"number) and the agent ID to the DHCP request."
+msgstr "DHCP要求に"(番号とエージェントIDチェックすると、 DHCPリレーは、回線ID %sインターフェース)を追加します」 。"
+
+#: usr/local/www/services_dhcp_relay.php:179
+#: usr/local/www/services_dhcpv6_relay.php:180
+#: usr/local/www/services_dhcp_relay.php:180
+#: usr/local/www/services_dhcpv6_relay.php:181
+#: usr/local/www/services_dhcpv6_relay.php:181
+#: usr/local/www/services_dhcp_relay.php:180
+msgid "Destination server"
+msgstr "送信先サーバー"
+
+#: usr/local/www/services_dhcp_relay.php:183
+#: usr/local/www/services_dhcp_relay.php:184
+#: usr/local/www/services_dhcp_relay.php:184
+msgid ""
+"This is the IP address of the server to which DHCP requests are relayed. You "
+"can enter multiple server IP addresses, separated by commas. Select "Proxy "
+"requests to DHCP server on WAN subnet" to relay DHCP packets to the server "
+"that was used on the WAN interface."
+msgstr "「これはDHCP要求を中継先のサーバーのIPアドレスです。あなたは "カンマで区切って複数のサーバーのIPアドレスを、入力することができます。 WANインターフェイス上で使用された「サーバにDHCPパケットを中継する「WANサブネット上のDHCPサーバーを「プロキシ」の要求を選択します。"
+
+#: usr/local/www/services_dnsmasq.php:80 usr/local/www/services_dnsmasq.php:84
+#: usr/local/www/services_dnsmasq.php:86
+#: usr/local/www/services_dnsmasq.php:107
+#: usr/local/www/services_dnsmasq.php:107
+msgid "Invalid custom options"
+msgstr "無効なカスタムオプション"
+
+#: usr/local/www/services_dnsmasq.php:147
+#: usr/local/www/services_dnsmasq.php:148
+#: usr/local/www/services_dnsmasq.php:152
+#: usr/local/www/services_dnsmasq.php:154
+#: usr/local/www/services_dnsmasq.php:175
+#: usr/local/www/services_dnsmasq.php:175
+msgid "The DNS forwarder configuration has been changed"
+msgstr "DNSフォワーダの設定が変更されました"
+
+#: usr/local/www/services_dnsmasq.php:151
+#: usr/local/www/services_dnsmasq.php:152
+#: usr/local/www/services_dnsmasq.php:156
+#: usr/local/www/services_dnsmasq.php:158
+#: usr/local/www/services_dnsmasq.php:179
+#: usr/local/www/services_dnsmasq.php:179
+msgid "General DNS Forwarder Options"
+msgstr "一般的なDNSのフォワーダオプション"
+
+#: usr/local/www/services_dnsmasq.php:157
+#: usr/local/www/services_dnsmasq.php:158
+#: usr/local/www/services_dnsmasq.php:162
+#: usr/local/www/services_dnsmasq.php:164
+#: usr/local/www/services_dnsmasq.php:185
+#: usr/local/www/services_dnsmasq.php:185
+msgid "Enable DNS forwarder"
+msgstr "DNSフォワーダを有効にする"
+
+#: usr/local/www/services_dnsmasq.php:161
+#: usr/local/www/services_unbound.php:211
+#: usr/local/www/services_dnsmasq.php:162
+#: usr/local/www/services_dnsmasq.php:166
+#: usr/local/www/services_dnsmasq.php:168
+#: usr/local/www/services_dnsmasq.php:189
+#: usr/local/www/services_dnsmasq.php:189
+msgid "DHCP Registration"
+msgstr "DHCP登録"
+
+#: usr/local/www/services_dnsmasq.php:164
+#: usr/local/www/services_dnsmasq.php:165
+#: usr/local/www/services_dnsmasq.php:169
+#: usr/local/www/services_dnsmasq.php:171
+#: usr/local/www/services_dnsmasq.php:192
+#: usr/local/www/services_dnsmasq.php:192
+msgid "Register DHCP leases in DNS forwarder"
+msgstr "レジスタDHCPはDNSフォワーダ内のリース"
+
+#: usr/local/www/services_dnsmasq.php:165
+#: usr/local/www/services_dnsmasq.php:166
+#: usr/local/www/services_dnsmasq.php:170
+#: usr/local/www/services_dnsmasq.php:172
+#: usr/local/www/services_dnsmasq.php:193
+#: usr/local/www/services_dnsmasq.php:193
+#, php-format
+msgid ""
+"If this option is set, then machines that specify their hostname when "
+"requesting a DHCP lease will be registered in the DNS forwarder, so that "
+"their name can be resolved. You should also set the domain in %sSystem: "
+"General setup%s to the proper value."
+msgstr "「このオプションが設定されている場合は、とき彼らのホスト名を指定してマシン""自分の名前を入手し%sSystemドメインを設定する必要が解決することができます。 : "ようにDHCPリースを要求するには、 DNSフォワーダに登録されます一般setup%sを。適切な値にね。"
+
+#: usr/local/www/services_dnsmasq.php:173
+#: usr/local/www/services_unbound.php:223
+#: usr/local/www/services_dnsmasq.php:174
+#: usr/local/www/services_dnsmasq.php:178
+#: usr/local/www/services_dnsmasq.php:180
+#: usr/local/www/services_dnsmasq.php:201
+#: usr/local/www/services_dnsmasq.php:201
+msgid "Static DHCP"
+msgstr "静的DHCP"
+
+#: usr/local/www/services_dnsmasq.php:176
+#: usr/local/www/services_dnsmasq.php:177
+#: usr/local/www/services_dnsmasq.php:181
+#: usr/local/www/services_dnsmasq.php:183
+#: usr/local/www/services_dnsmasq.php:204
+#: usr/local/www/services_dnsmasq.php:204
+msgid "Register DHCP static mappings in DNS forwarder"
+msgstr "DNSフォワーダでDHCPの静的マッピングを登録"
+
+#: usr/local/www/services_dnsmasq.php:177
+#: usr/local/www/services_dnsmasq.php:178
+#: usr/local/www/services_dnsmasq.php:182
+#: usr/local/www/services_dnsmasq.php:184
+#: usr/local/www/services_dnsmasq.php:205
+#: usr/local/www/services_dnsmasq.php:205
+#, php-format
+msgid ""
+"If this option is set, then DHCP static mappings will be registered in the "
+"DNS forwarder, so that their name can be resolved. You should also set the "
+"domain in %sSystem: General setup%s to the proper value."
+msgstr "その名前が解決できるように、 DNSフォワーダ」このオプションが設定されている場合、 DHCPの静的マッピングラーニング登録される」 。一般setup%s適正値に:また%sSystemの「ドメインを設定する必要があります。"
+
+#: usr/local/www/services_dnsmasq.php:184
+#: usr/local/www/services_unbound.php:234
+#: usr/local/www/services_dnsmasq.php:185
+#: usr/local/www/services_dnsmasq.php:189
+#: usr/local/www/services_dnsmasq.php:191
+#: usr/local/www/services_dnsmasq.php:212
+#: usr/local/www/services_dnsmasq.php:212
+msgid "Prefer DHCP"
+msgstr "DHCPを好む"
+
+#: usr/local/www/services_dnsmasq.php:187
+#: usr/local/www/services_unbound.php:237
+#: usr/local/www/services_dnsmasq.php:188
+#: usr/local/www/services_dnsmasq.php:192
+#: usr/local/www/services_dnsmasq.php:194
+#: usr/local/www/services_dnsmasq.php:215
+#: usr/local/www/services_dnsmasq.php:215
+msgid "Resolve DHCP mappings first"
+msgstr "最初のDHCPマッピングを解決する"
+
+#: usr/local/www/services_dnsmasq.php:188
+#: usr/local/www/services_unbound.php:238
+#: usr/local/www/services_dnsmasq.php:189
+#: usr/local/www/services_dnsmasq.php:193
+#: usr/local/www/services_dnsmasq.php:195
+#: usr/local/www/services_dnsmasq.php:216
+#: usr/local/www/services_dnsmasq.php:216
+#, php-format
+msgid ""
+"If this option is set, then DHCP mappings will be resolved before the manual "
+"list of names below. This only affects the name given for a reverse lookup "
+"(PTR)."
+msgstr "下の名前のリスト」には、このオプションが設定されている場合は、 DHCPのマッピングは、マニュアルの前に解決されます」 。これは、逆引き」 ( PTR )に指定された名前に影響を与えます。"
+
+#: usr/local/www/services_dnsmasq.php:202
+#: usr/local/www/services_dnsmasq.php:203
+#: usr/local/www/services_dnsmasq.php:228
+#: usr/local/www/services_dnsmasq.php:241
+#: usr/local/www/services_dnsmasq.php:305
+#: usr/local/www/services_dnsmasq.php:305
+msgid ""
+"Enter any additional options you would like to add to the dnsmasq "
+"configuration here, separated by a space or newline"
+msgstr "以下に設定、空白や改行で区切られた「あなたがDNSMASQに追加する追加オプションを入力してください ""
+
+#: usr/local/www/services_dnsmasq.php:215
+#: usr/local/www/services_dnsmasq.php:216
+#: usr/local/www/services_dnsmasq.php:241
+#: usr/local/www/services_dnsmasq.php:254
+#: usr/local/www/services_dnsmasq.php:318
+#: usr/local/www/services_dnsmasq.php:318
+#, php-format
+msgid ""
+"If the DNS forwarder is enabled, the DHCP service (if enabled) will "
+"automatically serve the LAN IP address as a DNS server to DHCP clients so "
+"they will use the forwarder. The DNS forwarder will use the DNS servers "
+"entered in %sSystem: General setup%s or those obtained via DHCP or PPP on "
+"WAN if the &quot;Allow DNS server list to be overridden by DHCP/PPP on "
+"WAN&quot; is checked. If you don't use that option (or if you use a static "
+"IP address on WAN), you must manually specify at least one DNS server on the "
+"%sSystem:General setup%s page."
+msgstr "「 DNSフォワーダが有効になっている場合は、 DHCPサービス(有効な場合)がします」が自動的ので、「彼らはフォワーダを使用します。 DNSフォワーダは、 DNSサーバーを使用します"DHCPクライアントにDNSサーバーとしてLAN IPアドレスを提供するの%sに入力された。 ■システム:一般setup%sまたは許可されているDNSサーバリスト「WAN」でのDHCP / PPPによって無効にされるように「IF WAN 」がチェックされている上でのDHCPやPPPを介して得られたもの。あなたはそのオプションを使用しない(または静的使用する場合%sSystem 「WAN上のIPアドレス)は、手動で少なくとも1つのDNSサーバを指定する必要があります」とします。全般setup%sページ。"
+
+#: usr/local/www/services_dnsmasq.php:231
+#: usr/local/www/services_unbound.php:267
+#: usr/local/www/services_dnsmasq.php:232
+#: usr/local/www/services_dnsmasq.php:257
+#: usr/local/www/services_dnsmasq.php:270
+#: usr/local/www/services_dnsmasq.php:334
+#: usr/local/www/services_dnsmasq.php:334
+msgid "Host Overrides"
+msgstr "オーバーライドをホストする"
+
+#: usr/local/www/services_dnsmasq.php:235
+#: usr/local/www/services_unbound.php:271
+#: usr/local/www/services_dnsmasq.php:236
+#: usr/local/www/services_dnsmasq.php:261
+#: usr/local/www/services_dnsmasq.php:274
+#: usr/local/www/services_dnsmasq.php:338
+#: usr/local/www/services_dnsmasq.php:338
+msgid ""
+"Entries in this section override individual results from the forwarders."
+msgstr "「このセクションのエントリは、フォワーダーからの個々の結果を上書きします。"
+
+#: usr/local/www/services_dnsmasq.php:236
+#: usr/local/www/services_unbound.php:272
+#: usr/local/www/services_dnsmasq.php:237
+#: usr/local/www/services_dnsmasq.php:262
+#: usr/local/www/services_dnsmasq.php:275
+#: usr/local/www/services_dnsmasq.php:339
+#: usr/local/www/services_dnsmasq.php:339
+msgid "Use these for changing DNS results or for adding custom DNS records."
+msgstr "DNSの結果を​​変更するため、またはカスタムDNSレコードを追加するためにこれらを使用してください。"
+
+#: usr/local/www/services_dnsmasq.php:299
+#: usr/local/www/services_dnsmasq.php:320
+#: usr/local/www/services_unbound.php:335
+#: usr/local/www/services_dnsmasq.php:321
+#: usr/local/www/services_dnsmasq.php:346
+#: usr/local/www/services_dnsmasq.php:359
+#: usr/local/www/services_dnsmasq.php:423
+#: usr/local/www/services_dnsmasq.php:423
+msgid "Domain Overrides"
+msgstr "ドメインオーバーライド"
+
+#: usr/local/www/services_dnsmasq.php:303
+#: usr/local/www/services_dnsmasq.php:324
+#: usr/local/www/services_unbound.php:339
+#: usr/local/www/services_dnsmasq.php:325
+#: usr/local/www/services_dnsmasq.php:350
+#: usr/local/www/services_dnsmasq.php:363
+#: usr/local/www/services_dnsmasq.php:427
+#: usr/local/www/services_dnsmasq.php:427
+msgid ""
+"Entries in this area override an entire domain by specifying an "
+"authoritative DNS server to be queried for that domain."
+msgstr "そのドメインを照会する権限を持つDNSサーバー」 、このエリア内のエントリは、指定することで、ドメイン全体を上書きする」 。"
+
+#: usr/local/www/services_dnsmasq.php:337
+#: usr/local/www/services_dnsmasq.php:358
+#: usr/local/www/services_unbound.php:373
+#: usr/local/www/services_dnsmasq.php:359
+#: usr/local/www/services_dnsmasq.php:384
+#: usr/local/www/services_dnsmasq.php:397
+#: usr/local/www/services_dnsmasq.php:461
+#: usr/local/www/services_dnsmasq.php:461
+msgid "Do you really want to delete this domain override?"
+msgstr "あなたは本当に、このドメインのオーバーライドを削除しますか?"
+
+#: usr/local/www/services_dnsmasq_edit.php:100
+#: usr/local/www/services_dnsmasq_edit.php:138
+#: usr/local/www/services_dnsmasq_edit.php:138
+msgid "This host/domain already exists."
+msgstr "このホスト/ドメインがすでに存在しています。"
+
+#: usr/local/www/services_dnsmasq_edit.php:127
+#: usr/local/www/services_dnsmasq_edit.php:166
+#: usr/local/www/services_dnsmasq_edit.php:166
+msgid "Edit host"
+msgstr "編集ホスト"
+
+#: usr/local/www/services_dnsmasq_edit.php:138
+#: usr/local/www/services_dnsmasq_edit.php:193
+#: usr/local/www/services_dnsmasq_edit.php:194
+#: usr/local/www/services_dnsmasq_edit.php:194
+msgid "Edit DNS Forwarder entry"
+msgstr "編集のDNSフォワーダエントリ"
+
+#: usr/local/www/services_dnsmasq_edit.php:144
+#: usr/local/www/services_dnsmasq_edit.php:199
+#: usr/local/www/services_dnsmasq_edit.php:200
+#: usr/local/www/services_dnsmasq_edit.php:200
+msgid "Name of the host, without domain part"
+msgstr "ドメイン部分なしで、ホストの名前"
+
+#: usr/local/www/services_dnsmasq_edit.php:146
+#: usr/local/www/services_dnsmasq_edit.php:201
+#: usr/local/www/services_dnsmasq_edit.php:202
+#: usr/local/www/services_dnsmasq_edit.php:202
+msgid "myhost"
+msgstr "myhostに"
+
+#: usr/local/www/services_dnsmasq_edit.php:152
+#: usr/local/www/services_dnsmasq_edit.php:207
+#: usr/local/www/services_dnsmasq_edit.php:208
+#: usr/local/www/services_dnsmasq_edit.php:208
+msgid "Domain of the host"
+msgstr "ホストのドメイン"
+
+#: usr/local/www/services_dnsmasq_edit.php:153
+#: usr/local/www/services_dnsmasq_edit.php:208
+#: usr/local/www/services_dnsmasq_edit.php:209
+#: usr/local/www/services_dnsmasq_edit.php:209
+msgid "example.com"
+msgstr "example.com"
+
+#: usr/local/www/services_dnsmasq_edit.php:159
+#: usr/local/www/services_dnsmasq_edit.php:214
+#: usr/local/www/services_dnsmasq_edit.php:215
+#: usr/local/www/services_dnsmasq_edit.php:215
+msgid "IP address of the host"
+msgstr "ホストのIPアドレス"
+
+#: usr/local/www/diag_pkglogs.php:81 usr/local/www/diag_pkglogs.php:81
+msgid "Package logs"
+msgstr "パッケージログ"
+
+#: usr/local/www/diag_pkglogs.php:92 usr/local/www/diag_pkglogs.php:92
+msgid "No packages with logging facilities are currently installed."
+msgstr "ロギング機能とのパッケージは現在インストールされていません。"
+
+#: usr/local/www/diag_pkglogs.php:103 usr/local/www/diag_pkglogs.php:105
+#: usr/local/www/diag_pkglogs.php:103 usr/local/www/diag_pkglogs.php:105
+#, php-format
+msgid "%s"
+msgstr "%s"
+
+#: usr/local/www/diag_pkglogs.php:118 usr/local/www/diag_pkglogs.php:118
+#, php-format
+msgid "Last %1$s %2$s log entries"
+msgstr "最後は%1$s %2$sログエントリ"
+
+#: usr/local/www/status.php:110 usr/local/www/status.php:111
+#: usr/local/www/status.php:111
+msgid "This status page includes the following information"
+msgstr "このステータス·ページには、以下の情報が含まれています"
+
+#: usr/local/www/status.php:225 usr/local/www/status.php:226
+#: usr/local/www/status.php:230 usr/local/www/status.php:230
+msgid ""
+"Note: make sure to remove any sensitive information (passwords, maybe also "
+"IP addresses) before posting information from this page in public places "
+"(like mailing lists)"
+msgstr "(メーリングリストのような) 「公共の場で、このページからの情報を投稿する前に「 ( IPアドレス注機密情報、パスワード、多分も)を除去することを確認してください」"
+
+#: usr/local/www/status.php:228 usr/local/www/status.php:229
+#: usr/local/www/status.php:233 usr/local/www/status.php:233
+msgid "Passwords in config.xml have been automatically removed"
+msgstr "config.xml内のパスワードは自動的に削除されました"
+
+#: usr/local/www/bandwidth_by_ip.php:54 usr/local/www/bandwidth_by_ip.php:67
+#: usr/local/www/bandwidth_by_ip.php:61 usr/local/www/bandwidth_by_ip.php:103
+#: usr/local/www/bandwidth_by_ip.php:103
+msgid "no info"
+msgstr "情報なし"
+
+#: usr/local/www/vpn_pptp.php:82 usr/local/www/vpn_pptp.php:353
+#: usr/local/www/vpn_l2tp.php:73 usr/local/www/vpn_l2tp.php:321
+#: usr/local/www/vpn_pppoe_edit.php:112 usr/local/www/vpn_pppoe_edit.php:424
+#: usr/local/www/vpn_pppoe_edit.php:425 usr/local/www/vpn_pptp.php:355
+#: usr/local/www/vpn_l2tp.php:74 usr/local/www/vpn_pppoe_edit.php:428
+#: usr/local/www/vpn_pptp.php:358 usr/local/www/vpn_l2tp.php:74
+#: usr/local/www/vpn_pppoe_edit.php:112 usr/local/www/vpn_pppoe_edit.php:428
+#: usr/local/www/vpn_pptp.php:82 usr/local/www/vpn_pptp.php:358
+msgid "Server address"
+msgstr "サーバーのアドレス"
+
+#: usr/local/www/vpn_pptp.php:82 usr/local/www/vpn_l2tp.php:73
+#: usr/local/www/vpn_pppoe_edit.php:112 usr/local/www/vpn_l2tp.php:74
+#: usr/local/www/vpn_l2tp.php:74 usr/local/www/vpn_pppoe_edit.php:112
+#: usr/local/www/vpn_pptp.php:82
+msgid "Remote start address"
+msgstr "リモートスタートアドレス"
+
+#: usr/local/www/vpn_pptp.php:87 usr/local/www/vpn_l2tp.php:78
+#: usr/local/www/vpn_pppoe_edit.php:117 usr/local/www/vpn_l2tp.php:79
+#: usr/local/www/vpn_l2tp.php:79 usr/local/www/vpn_pppoe_edit.php:117
+#: usr/local/www/vpn_pptp.php:87
+msgid "RADIUS server address"
+msgstr "RADIUSサーバのIPアドレス"
+
+#: usr/local/www/vpn_pptp.php:87 usr/local/www/vpn_pptp.php:432
+#: usr/local/www/vpn_l2tp.php:78 usr/local/www/vpn_l2tp.php:428
+#: usr/local/www/vpn_pppoe_edit.php:117 usr/local/www/vpn_pptp.php:434
+#: usr/local/www/vpn_l2tp.php:79 usr/local/www/vpn_pptp.php:437
+#: usr/local/www/vpn_l2tp.php:79 usr/local/www/vpn_pppoe_edit.php:117
+#: usr/local/www/vpn_pptp.php:87 usr/local/www/vpn_pptp.php:437
+msgid "RADIUS shared secret"
+msgstr "RADIUSの共有シークレット"
+
+#: usr/local/www/vpn_pptp.php:93 usr/local/www/vpn_l2tp.php:84
+#: usr/local/www/vpn_pppoe_edit.php:123 usr/local/www/vpn_l2tp.php:85
+#: usr/local/www/vpn_l2tp.php:85 usr/local/www/vpn_pppoe_edit.php:123
+#: usr/local/www/vpn_pptp.php:93
+msgid "A valid server address must be specified."
+msgstr "有効なサーバーアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_pptp.php:96 usr/local/www/vpn_l2tp.php:87
+#: usr/local/www/vpn_pppoe_edit.php:125 usr/local/www/vpn_l2tp.php:88
+#: usr/local/www/vpn_l2tp.php:91 usr/local/www/vpn_pptp.php:99
+#: usr/local/www/vpn_l2tp.php:91 usr/local/www/vpn_pppoe_edit.php:125
+#: usr/local/www/vpn_pptp.php:99
+msgid "A valid remote start address must be specified."
+msgstr "有効なリモートスタートアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_pptp.php:99 usr/local/www/vpn_l2tp.php:90
+#: usr/local/www/vpn_pppoe_edit.php:127 usr/local/www/vpn_l2tp.php:91
+#: usr/local/www/vpn_l2tp.php:94 usr/local/www/vpn_pptp.php:102
+#: usr/local/www/vpn_l2tp.php:94 usr/local/www/vpn_pppoe_edit.php:127
+#: usr/local/www/vpn_pptp.php:102
+msgid "A valid RADIUS server address must be specified."
+msgstr "有効なRADIUSサーバのIPアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_pptp.php:108 usr/local/www/vpn_l2tp.php:106
+#: usr/local/www/vpn_pppoe_edit.php:134 usr/local/www/vpn_l2tp.php:107
+#: usr/local/www/vpn_l2tp.php:110 usr/local/www/vpn_pptp.php:111
+#: usr/local/www/vpn_l2tp.php:110 usr/local/www/vpn_pppoe_edit.php:134
+#: usr/local/www/vpn_pptp.php:111
+msgid "The specified server address lies in the remote subnet."
+msgstr "指定されたサーバーアドレスは、リモートサブネットにある。"
+
+#: usr/local/www/vpn_pptp.php:112 usr/local/www/vpn_l2tp.php:109
+#: usr/local/www/vpn_l2tp.php:110 usr/local/www/vpn_l2tp.php:113
+#: usr/local/www/vpn_pptp.php:115 usr/local/www/vpn_l2tp.php:113
+#: usr/local/www/vpn_pptp.php:115
+msgid "The specified server address is equal to the LAN interface address."
+msgstr "指定されたサーバのアドレスは、LANインターフェイスのアドレスと同じである。"
+
+#: usr/local/www/vpn_pptp.php:117 usr/local/www/vpn_pptp.php:120
+#: usr/local/www/vpn_pptp.php:120
+msgid "PPTP redirection target address"
+msgstr "PPTPリダイレクト先のアドレス"
+
+#: usr/local/www/vpn_pptp.php:122 usr/local/www/vpn_pptp.php:125
+#: usr/local/www/vpn_pptp.php:125
+msgid "A valid target address must be specified."
+msgstr "有効なターゲットアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_pptp.php:193 usr/local/www/vpn_pptp_users.php:71
+#: usr/local/www/vpn_pptp_users_edit.php:135 usr/local/www/vpn_pptp.php:196
+#: usr/local/www/vpn_pptp_users.php:71 usr/local/www/vpn_pptp.php:196
+#: usr/local/www/vpn_pptp_users_edit.php:135
+msgid "VPN PPTP"
+msgstr "のVPN 、PPTP"
+
+#: usr/local/www/vpn_pptp.php:300 usr/local/www/vpn_pptp_users.php:89
+#: usr/local/www/vpn_l2tp.php:280 usr/local/www/vpn_l2tp_users.php:92
+#: usr/local/www/vpn_pptp.php:302 usr/local/www/vpn_l2tp_users.php:93
+#: usr/local/www/vpn_l2tp.php:281 usr/local/www/vpn_pptp_users.php:90
+#: usr/local/www/vpn_l2tp.php:284 usr/local/www/vpn_pptp.php:305
+#: usr/local/www/vpn_l2tp.php:284 usr/local/www/vpn_pptp_users.php:90
+#: usr/local/www/vpn_l2tp_users.php:93 usr/local/www/vpn_pptp.php:305
+msgid "Configuration"
+msgstr "設定"
+
+#: usr/local/www/vpn_pptp.php:301 usr/local/www/vpn_pptp_users.php:71
+#: usr/local/www/vpn_pptp_users.php:90
+#: usr/local/www/system_authservers.php:421
+#: usr/local/www/system_groupmanager.php:240
+#: usr/local/www/system_groupmanager_addprivs.php:168
+#: usr/local/www/system_usermanager.php:440
+#: usr/local/www/system_usermanager_addprivs.php:167
+#: usr/local/www/system_usermanager_settings.php:113
+#: usr/local/www/vpn_l2tp.php:281 usr/local/www/vpn_l2tp_users.php:38
+#: usr/local/www/vpn_l2tp_users.php:93
+#: usr/local/www/system_usermanager.php:438
+#: usr/local/www/system_groupmanager_addprivs.php:166
+#: usr/local/www/vpn_pptp.php:303 usr/local/www/vpn_l2tp_users.php:94
+#: usr/local/www/vpn_l2tp.php:282 usr/local/www/vpn_pptp_users.php:91
+#: usr/local/www/system_authservers.php:426 usr/local/www/vpn_l2tp.php:285
+#: usr/local/www/system_authservers.php:433 usr/local/www/vpn_pptp.php:306
+#: usr/local/www/system_usermanager_settings.php:115
+#: usr/local/www/vpn_l2tp.php:285 usr/local/www/system_groupmanager.php:240
+#: usr/local/www/vpn_pptp_users.php:71 usr/local/www/vpn_pptp_users.php:91
+#: usr/local/www/system_usermanager_addprivs.php:167
+#: usr/local/www/vpn_l2tp_users.php:38 usr/local/www/vpn_l2tp_users.php:94
+#: usr/local/www/system_authservers.php:433
+#: usr/local/www/system_groupmanager_addprivs.php:166
+#: usr/local/www/vpn_pptp.php:306
+#: usr/local/www/system_usermanager_settings.php:115
+#: usr/local/www/system_usermanager.php:438
+msgid "Users"
+msgstr "ユーザー"
+
+#: usr/local/www/vpn_pptp.php:320 usr/local/www/vpn_pptp.php:322
+#: usr/local/www/vpn_pptp.php:325 usr/local/www/vpn_pptp.php:325
+msgid "Redirect incoming PPTP connections to"
+msgstr "への着信PPTP接続をリダイレクト"
+
+#: usr/local/www/vpn_pptp.php:322 usr/local/www/vpn_pptp.php:324
+#: usr/local/www/vpn_pptp.php:327 usr/local/www/vpn_pptp.php:327
+msgid "PPTP redirection"
+msgstr "PPTPのリダイレクト"
+
+#: usr/local/www/vpn_pptp.php:326 usr/local/www/vpn_pptp.php:328
+#: usr/local/www/vpn_pptp.php:331 usr/local/www/vpn_pptp.php:331
+msgid ""
+"Enter the IP address of a host which will accept incoming PPTP connections"
+msgstr "「着信PPTP接続を受け入れるホストのIPアドレスを入力してください"
+
+#: usr/local/www/vpn_pptp.php:332 usr/local/www/vpn_pptp.php:334
+#: usr/local/www/vpn_pptp.php:337 usr/local/www/vpn_pptp.php:337
+msgid "Enable PPTP server"
+msgstr "PPTPサーバーを有効にする"
+
+#: usr/local/www/vpn_pptp.php:335 usr/local/www/vpn_pptp.php:337
+#: usr/local/www/vpn_pptp.php:340 usr/local/www/vpn_pptp.php:340
+msgid "No. PPTP users"
+msgstr "番号PPTPユーザー"
+
+#: usr/local/www/vpn_pptp.php:349 usr/local/www/vpn_pptp.php:351
+#: usr/local/www/vpn_pptp.php:354 usr/local/www/vpn_pptp.php:354
+msgid "Hint: 10 is ten PPTP clients"
+msgstr "ヒント:10 10 PPTPクライアントである"
+
+#: usr/local/www/vpn_pptp.php:357 usr/local/www/vpn_pptp.php:359
+#: usr/local/www/vpn_pptp.php:362 usr/local/www/vpn_pptp.php:362
+msgid ""
+"Enter the IP address the PPTP server should give to clients for use as their "
+""gateway""
+msgstr "「 「ゲートウェイ」のIPアドレスを入力してPPTPサーバーは、そのとして使用するためにクライアントに与える必要があります」"
+
+#: usr/local/www/vpn_pptp.php:359 usr/local/www/vpn_l2tp.php:327
+#: usr/local/www/vpn_pppoe_edit.php:430 usr/local/www/vpn_pppoe_edit.php:431
+#: usr/local/www/vpn_pptp.php:361 usr/local/www/vpn_l2tp.php:328
+#: usr/local/www/vpn_l2tp.php:331 usr/local/www/vpn_pppoe_edit.php:434
+#: usr/local/www/vpn_pptp.php:364 usr/local/www/vpn_l2tp.php:331
+#: usr/local/www/vpn_pppoe_edit.php:434 usr/local/www/vpn_pptp.php:364
+msgid "Typically this is set to an unused IP just outside of the client range"
+msgstr "一般的に、これは単なるクライアント範囲外の未使用のIPに設定されています"
+
+#: usr/local/www/vpn_pptp.php:362 usr/local/www/vpn_l2tp.php:330
+#: usr/local/www/vpn_pppoe_edit.php:433 usr/local/www/vpn_pppoe_edit.php:434
+#: usr/local/www/vpn_pptp.php:364 usr/local/www/vpn_l2tp.php:331
+#: usr/local/www/vpn_l2tp.php:334 usr/local/www/vpn_pppoe_edit.php:437
+#: usr/local/www/vpn_pptp.php:367 usr/local/www/vpn_l2tp.php:334
+#: usr/local/www/vpn_pppoe_edit.php:437 usr/local/www/vpn_pptp.php:367
+msgid ""
+"NOTE: This should NOT be set to any IP address currently in use on this "
+"firewall"
+msgstr ""注:これは、この上で現在使用中の任意のIPアドレスに設定しないでください」ファイアウォール"
+
+#: usr/local/www/vpn_pptp.php:365 usr/local/www/vpn_l2tp.php:333
+#: usr/local/www/vpn_pppoe_edit.php:436 usr/local/www/vpn_pppoe_edit.php:437
+#: usr/local/www/vpn_pptp.php:367 usr/local/www/vpn_pppoe_edit.php:440
+#: usr/local/www/vpn_pptp.php:370 usr/local/www/vpn_pppoe_edit.php:440
+#: usr/local/www/vpn_pptp.php:370
+msgid "Remote address range"
+msgstr "リモートアドレス範囲"
+
+#: usr/local/www/vpn_pptp.php:370 usr/local/www/vpn_pptp.php:372
+#: usr/local/www/vpn_pptp.php:375 usr/local/www/vpn_pptp.php:375
+msgid "Specify the starting address for the client IP subnet"
+msgstr "クライアントIPサブネットの開始アドレスを指定する"
+
+#: usr/local/www/vpn_pptp.php:373 usr/local/www/vpn_pptp.php:375
+#: usr/local/www/vpn_pptp.php:378 usr/local/www/vpn_pptp.php:378
+msgid "PPTP DNS Servers"
+msgstr "PPTP DNSサーバ"
+
+#: usr/local/www/vpn_pptp.php:379 usr/local/www/vpn_pptp.php:381
+#: usr/local/www/vpn_pptp.php:384 usr/local/www/vpn_pptp.php:384
+msgid "primary and secondary DNS servers assigned to PPTP clients"
+msgstr "PPTPクライアントに割り当てられたプライマリおよびセカンダリDNSサーバ"
+
+#: usr/local/www/vpn_pptp.php:382 usr/local/www/vpn_l2tp.php:404
+#: usr/local/www/vpn_pptp.php:384 usr/local/www/vpn_l2tp.php:405
+#: usr/local/www/vpn_l2tp.php:408 usr/local/www/vpn_pptp.php:387
+#: usr/local/www/vpn_l2tp.php:408 usr/local/www/vpn_pptp.php:387
+msgid "WINS Server"
+msgstr "WINSサーバー"
+
+#: usr/local/www/vpn_pptp.php:388 usr/local/www/vpn_l2tp.php:410
+#: usr/local/www/vpn_pppoe_edit.php:461 usr/local/www/vpn_pppoe_edit.php:462
+#: usr/local/www/vpn_pptp.php:390 usr/local/www/vpn_l2tp.php:411
+#: usr/local/www/vpn_l2tp.php:414 usr/local/www/vpn_pppoe_edit.php:465
+#: usr/local/www/vpn_pptp.php:393 usr/local/www/vpn_l2tp.php:414
+#: usr/local/www/vpn_pppoe_edit.php:465 usr/local/www/vpn_pptp.php:393
+msgid "RADIUS"
+msgstr "RADIUS"
+
+#: usr/local/www/vpn_pptp.php:391 usr/local/www/vpn_l2tp.php:413
+#: usr/local/www/vpn_pppoe_edit.php:464 usr/local/www/vpn_pppoe_edit.php:465
+#: usr/local/www/vpn_pptp.php:393 usr/local/www/vpn_l2tp.php:414
+#: usr/local/www/vpn_l2tp.php:417 usr/local/www/vpn_pppoe_edit.php:468
+#: usr/local/www/vpn_pptp.php:396 usr/local/www/vpn_l2tp.php:417
+#: usr/local/www/vpn_pppoe_edit.php:468 usr/local/www/vpn_pptp.php:396
+msgid "Use a RADIUS server for authentication"
+msgstr "認証用のRADIUSサーバを使用"
+
+#: usr/local/www/vpn_pptp.php:392 usr/local/www/vpn_pppoe_edit.php:465
+#: usr/local/www/vpn_pppoe_edit.php:466 usr/local/www/vpn_pptp.php:394
+#: usr/local/www/vpn_pppoe_edit.php:469 usr/local/www/vpn_pptp.php:397
+#: usr/local/www/vpn_pppoe_edit.php:469 usr/local/www/vpn_pptp.php:397
+msgid ""
+"When set, all users will be authenticated using the RADIUS server specified "
+"below. The local user database will not be used"
+msgstr "下の「設定すると、すべてのユーザーが指定されたRADIUSサーバを使用して認証されます」 。ローカルユーザデータベースが使用されることはありません"
+
+#: usr/local/www/vpn_pptp.php:397 usr/local/www/vpn_l2tp.php:417
+#: usr/local/www/vpn_pppoe_edit.php:470 usr/local/www/vpn_pppoe_edit.php:471
+#: usr/local/www/vpn_pptp.php:399 usr/local/www/vpn_l2tp.php:418
+#: usr/local/www/vpn_l2tp.php:421 usr/local/www/vpn_pppoe_edit.php:474
+#: usr/local/www/vpn_pptp.php:402 usr/local/www/vpn_l2tp.php:421
+#: usr/local/www/vpn_pppoe_edit.php:474 usr/local/www/vpn_pptp.php:402
+msgid "Enable RADIUS accounting"
+msgstr "RADIUSアカウンティングを有効にする"
+
+#: usr/local/www/vpn_pptp.php:398 usr/local/www/vpn_pppoe_edit.php:472
+#: usr/local/www/vpn_pppoe_edit.php:473 usr/local/www/vpn_pptp.php:400
+#: usr/local/www/vpn_pppoe_edit.php:476 usr/local/www/vpn_pptp.php:403
+#: usr/local/www/vpn_pppoe_edit.php:476 usr/local/www/vpn_pptp.php:403
+msgid "Sends accounting packets to the RADIUS server"
+msgstr "RADIUSサーバにアカウンティングパケットを送信します"
+
+#: usr/local/www/vpn_pptp.php:401 usr/local/www/vpn_pptp.php:403
+#: usr/local/www/vpn_pptp.php:406 usr/local/www/vpn_pptp.php:406
+msgid "Secondary RADIUS server for failover authentication"
+msgstr "フェイルオーバー認証のためのセカンダリRADIUSサーバ"
+
+#: usr/local/www/vpn_pptp.php:402 usr/local/www/vpn_pptp.php:404
+#: usr/local/www/vpn_pptp.php:407 usr/local/www/vpn_pptp.php:407
+msgid ""
+"When set, all requests will go to the secondary server when primary fails"
+msgstr "設定すると、プライマリに障害が発生した場合」 、すべてのリクエストはセカンダリサーバに移動します"
+
+#: usr/local/www/vpn_pptp.php:405 usr/local/www/vpn_pppoe_edit.php:492
+#: usr/local/www/vpn_pppoe_edit.php:493 usr/local/www/vpn_pptp.php:407
+#: usr/local/www/vpn_pppoe_edit.php:496 usr/local/www/vpn_pptp.php:410
+#: usr/local/www/vpn_pppoe_edit.php:496 usr/local/www/vpn_pptp.php:410
+msgid "RADIUS issued IPs"
+msgstr "RADIUSは、 IPを発行"
+
+#: usr/local/www/vpn_pptp.php:406 usr/local/www/vpn_pptp.php:408
+#: usr/local/www/vpn_pptp.php:411 usr/local/www/vpn_pptp.php:411
+msgid "Issue IP addresses via RADIUS server"
+msgstr "RADIUSサーバーを経由して発行するIPアドレス"
+
+#: usr/local/www/vpn_pptp.php:411 usr/local/www/vpn_pptp.php:413
+#: usr/local/www/vpn_pptp.php:416 usr/local/www/vpn_pptp.php:416
+msgid "RADIUS NAS IP"
+msgstr "RADIUSのNAS IP"
+
+#: usr/local/www/vpn_pptp.php:417 usr/local/www/vpn_pppoe_edit.php:485
+#: usr/local/www/vpn_pppoe_edit.php:486 usr/local/www/vpn_pptp.php:419
+#: usr/local/www/vpn_pppoe_edit.php:489 usr/local/www/vpn_pptp.php:422
+#: usr/local/www/vpn_pppoe_edit.php:489 usr/local/www/vpn_pptp.php:422
+msgid "RADIUS Accounting Update"
+msgstr "RADIUSアカウンティングアップデート"
+
+#: usr/local/www/vpn_pptp.php:423 usr/local/www/vpn_pptp.php:425
+#: usr/local/www/vpn_l2tp.php:422 usr/local/www/vpn_l2tp.php:425
+#: usr/local/www/vpn_pptp.php:428 usr/local/www/vpn_l2tp.php:425
+#: usr/local/www/vpn_pptp.php:428
+msgid "RADIUS Server"
+msgstr "RADIUSサーバ"
+
+#: usr/local/www/vpn_pptp.php:429 usr/local/www/vpn_pptp.php:446
+#: usr/local/www/vpn_pptp.php:431 usr/local/www/vpn_pptp.php:448
+#: usr/local/www/vpn_pptp.php:434 usr/local/www/vpn_pptp.php:451
+#: usr/local/www/vpn_pptp.php:434 usr/local/www/vpn_pptp.php:451
+msgid ""
+"Enter the IP address, RADIUS port, and RADIUS accounting port of the RADIUS "
+"server"
+msgstr "サーバー「RADIUSのアカウンティングポート、IPアドレス、 RADIUSポート、およびRADIUSを入力してください ""
+
+#: usr/local/www/vpn_pptp.php:436 usr/local/www/vpn_pppoe_edit.php:510
+#: usr/local/www/vpn_pppoe_edit.php:527 usr/local/www/vpn_pppoe_edit.php:511
+#: usr/local/www/vpn_pppoe_edit.php:528 usr/local/www/vpn_pptp.php:438
+#: usr/local/www/vpn_pppoe_edit.php:514 usr/local/www/vpn_pppoe_edit.php:531
+#: usr/local/www/vpn_pptp.php:441 usr/local/www/vpn_pppoe_edit.php:514
+#: usr/local/www/vpn_pppoe_edit.php:531 usr/local/www/vpn_pptp.php:441
+msgid ""
+"Enter the shared secret that will be used to authenticate to the RADIUS "
+"server"
+msgstr "サーバー「RADIUSへの認証に使用される共有秘密を入力してください ""
+
+#: usr/local/www/vpn_pptp.php:449 usr/local/www/vpn_pptp.php:451
+#: usr/local/www/vpn_pptp.php:454 usr/local/www/vpn_pptp.php:454
+msgid "Secondary RADIUS shared secret"
+msgstr "セカンダリRADIUS共有シークレット"
+
+#: usr/local/www/vpn_pptp.php:453 usr/local/www/vpn_pptp.php:455
+#: usr/local/www/vpn_pptp.php:458 usr/local/www/vpn_pptp.php:458
+msgid ""
+"Enter the shared secret that will be used to authenticate to the secondary "
+"RADIUS server"
+msgstr "RADIUSサーバ「二次への認証に使用される共有秘密を入力してください ""
+
+#: usr/local/www/vpn_pptp.php:463 usr/local/www/vpn_pptp.php:465
+#: usr/local/www/vpn_pptp.php:468 usr/local/www/vpn_pptp.php:468
+msgid "Require 128-bit encryption"
+msgstr "128ビット暗号化を要求"
+
+#: usr/local/www/vpn_pptp.php:464 usr/local/www/vpn_pptp.php:466
+#: usr/local/www/vpn_pptp.php:469 usr/local/www/vpn_pptp.php:469
+msgid ""
+"When set, only 128-bit encryption will be accepted. Otherwise 40-bit and 56-"
+"bit encryption will be accepted as well. Note that encryption will always be "
+"forced on PPTP connections (i.e. unencrypted connections will not be "
+"accepted)"
+msgstr "「設定した場合、唯一の128ビット暗号化を受け入れられるそうでない場合は40ビットおよび56 - 。 "ビットの暗号化が同様に受け入れられます。暗号化は、常に「 (受け入れすなわち暗号化されていない接続はされません) PPTP接続に強制"されることに注意してください"
+
+#: usr/local/www/vpn_pptp.php:478 usr/local/www/vpn_pptp.php:480
+#: usr/local/www/vpn_pptp.php:483 usr/local/www/vpn_pptp.php:483
+msgid "don't forget to "
+msgstr "ことを忘れないでください"
+
+#: usr/local/www/vpn_pptp.php:478 usr/local/www/vpn_pptp.php:480
+#: usr/local/www/vpn_pptp.php:483 usr/local/www/vpn_pptp.php:483
+msgid "add a firewall rule"
+msgstr "ファイアウォールルールを追加"
+
+#: usr/local/www/vpn_pptp.php:478 usr/local/www/vpn_pptp.php:480
+#: usr/local/www/vpn_pptp.php:483 usr/local/www/vpn_pptp.php:483
+msgid "to permit traffic from PPTP clients"
+msgstr "PPTPクライアントからのトラフィックを許可する"
+
+#: usr/local/www/vpn_pptp_users.php:81 usr/local/www/vpn_l2tp_users.php:84
+#: usr/local/www/vpn_l2tp_users.php:85 usr/local/www/vpn_pptp_users.php:82
+#: usr/local/www/vpn_pptp_users.php:82 usr/local/www/vpn_l2tp_users.php:85
+msgid "Warning: RADIUS is enabled. The local user database will not be used."
+msgstr "警告: RADIUSが有効になっている。ローカルユーザデータベースは使用されません。"
+
+#: usr/local/www/vpn_pptp_users.php:83 usr/local/www/vpn_pptp_users.php:84
+#: usr/local/www/vpn_pptp_users.php:84
+msgid "The PPTP user list has been modified"
+msgstr "PPTPユーザリストが変更されている"
+
+#: usr/local/www/vpn_pptp_users.php:83 usr/local/www/vpn_l2tp_users.php:86
+#: usr/local/www/vpn_l2tp_users.php:87 usr/local/www/vpn_pptp_users.php:84
+#: usr/local/www/vpn_pptp_users.php:84 usr/local/www/vpn_l2tp_users.php:87
+msgid "You must apply the changes in order for them to take effect"
+msgstr "それらを有効にするには、順序の変更を適用する必要があります"
+
+#: usr/local/www/vpn_pptp_users.php:83 usr/local/www/vpn_pptp_users.php:84
+#: usr/local/www/vpn_pptp_users.php:84
+msgid "Warning: this will terminate all current PPTP sessions"
+msgstr "警告:これは現在のすべてのPPTPセッションを終了します"
+
+#: usr/local/www/vpn_pptp_users.php:104 usr/local/www/vpn_pptp_users.php:127
+#: usr/local/www/system_usermanager.php:842
+#: usr/local/www/vpn_l2tp_users.php:120
+#: usr/local/www/system_usermanager.php:840
+#: usr/local/www/system_usermanager.php:845
+#: usr/local/www/vpn_l2tp_users.php:121 usr/local/www/vpn_pptp_users.php:105
+#: usr/local/www/vpn_pptp_users.php:128
+#: usr/local/www/system_usermanager.php:798
+#: usr/local/www/vpn_pptp_users.php:105 usr/local/www/vpn_pptp_users.php:128
+#: usr/local/www/vpn_l2tp_users.php:121
+#: usr/local/www/system_usermanager.php:798
+msgid "add user"
+msgstr "ユーザーを追加"
+
+#: usr/local/www/vpn_pptp_users.php:117
+#: usr/local/www/system_usermanager.php:824
+#: usr/local/www/system_usermanager.php:822
+#: usr/local/www/system_usermanager.php:825
+#: usr/local/www/vpn_pptp_users.php:118
+#: usr/local/www/system_usermanager.php:848
+#: usr/local/www/vpn_pptp_users.php:118
+#: usr/local/www/system_usermanager.php:848
+msgid "edit user"
+msgstr "ユーザーの編集"
+
+#: usr/local/www/vpn_pptp_users.php:118 usr/local/www/vpn_l2tp_users.php:115
+#: usr/local/www/vpn_l2tp_users.php:116 usr/local/www/vpn_pptp_users.php:119
+#: usr/local/www/vpn_pptp_users.php:119 usr/local/www/vpn_l2tp_users.php:116
+msgid "Do you really want to delete this user?"
+msgstr "あなたは本当にこのユーザを削除しますか?"
+
+#: usr/local/www/vpn_pptp_users.php:118
+#: usr/local/www/system_usermanager.php:829
+#: usr/local/www/vpn_l2tp_users.php:115
+#: usr/local/www/system_usermanager.php:827
+#: usr/local/www/system_usermanager.php:830
+#: usr/local/www/vpn_l2tp_users.php:116 usr/local/www/vpn_pptp_users.php:119
+#: usr/local/www/system_usermanager.php:853
+#: usr/local/www/vpn_pptp_users.php:119 usr/local/www/vpn_l2tp_users.php:116
+#: usr/local/www/system_usermanager.php:853
+msgid "delete user"
+msgstr "ユーザーを削除する"
+
+#: usr/local/www/vpn_pptp_users_edit.php:85
+#: usr/local/www/services_dyndns_edit.php:94
+#: usr/local/www/system_usermanager.php:199
+#: usr/local/www/vpn_l2tp_users_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:110
+#: usr/local/www/vpn_l2tp_users_edit.php:88
+#: usr/local/www/services_dyndns_edit.php:111
+#: usr/local/www/services_dyndns_edit.php:111
+#: usr/local/www/vpn_l2tp_users_edit.php:88
+#: usr/local/www/vpn_pptp_users_edit.php:85
+#: usr/local/www/system_usermanager.php:199
+msgid "The username contains invalid characters."
+msgstr "ユーザー名に無効な文字が含まれています。"
+
+#: usr/local/www/vpn_pptp_users_edit.php:88
+#: usr/local/www/vpn_pptp_users_edit.php:88
+msgid "The password cannot start with '!'."
+msgstr "パスワードは' !'で始めることはできません。"
+
+#: usr/local/www/vpn_pptp_users_edit.php:91
+#: usr/local/www/vpn_l2tp_users_edit.php:90
+#: usr/local/www/vpn_l2tp_users_edit.php:91
+#: usr/local/www/vpn_l2tp_users_edit.php:91
+#: usr/local/www/vpn_pptp_users_edit.php:91
+msgid "The password contains invalid characters."
+msgstr "パスワードに無効な文字が含まれています。"
+
+#: usr/local/www/vpn_pptp_users_edit.php:94
+#: usr/local/www/system_usermanager.php:205
+#: usr/local/www/system_usermanager_passwordmg.php:54
+#: usr/local/www/vpn_l2tp_users_edit.php:93
+#: usr/local/www/vpn_l2tp_users_edit.php:94
+#: usr/local/www/system_usermanager_passwordmg.php:54
+#: usr/local/www/vpn_l2tp_users_edit.php:94
+#: usr/local/www/vpn_pptp_users_edit.php:94
+#: usr/local/www/system_usermanager.php:205
+msgid "The passwords do not match."
+msgstr "パスワードが一致しません。"
+
+#: usr/local/www/vpn_pptp_users_edit.php:97
+#: usr/local/www/vpn_l2tp_users_edit.php:96
+#: usr/local/www/vpn_l2tp_users_edit.php:97
+#: usr/local/www/vpn_l2tp_users_edit.php:97
+#: usr/local/www/vpn_pptp_users_edit.php:97
+msgid "The IP address entered is not valid."
+msgstr "入力したIPアドレスが有効ではありません。"
+
+#: usr/local/www/vpn_pptp_users_edit.php:104
+#: usr/local/www/system_usermanager.php:215
+#: usr/local/www/vpn_l2tp_users_edit.php:103
+#: usr/local/www/vpn_l2tp_users_edit.php:104
+#: usr/local/www/vpn_l2tp_users_edit.php:104
+#: usr/local/www/vpn_pptp_users_edit.php:104
+#: usr/local/www/system_usermanager.php:215
+msgid "Another entry with the same username already exists."
+msgstr "同じユーザ名の別のエントリがすでに存在しています。"
+
+#: usr/local/www/vpn_pptp_users_edit.php:155
+#: usr/local/www/vpn_l2tp_users_edit.php:163
+#: usr/local/www/vpn_pptp_users_edit.php:156
+#: usr/local/www/vpn_l2tp_users_edit.php:164
+#: usr/local/www/vpn_l2tp_users_edit.php:164
+#: usr/local/www/vpn_pptp_users_edit.php:156
+msgid "confirmation"
+msgstr "確認"
+
+#: usr/local/www/vpn_pptp_users_edit.php:156
+#: usr/local/www/vpn_pptp_users_edit.php:157
+#: usr/local/www/vpn_pptp_users_edit.php:157
+msgid "If you want to change the users' password, enter it here twice."
+msgstr "あなたは、ユーザーのパスワードを変更したい場合は、二度ここに入力します。"
+
+#: usr/local/www/vpn_pptp_users_edit.php:163
+#: usr/local/www/vpn_l2tp_users_edit.php:171
+#: usr/local/www/vpn_pptp_users_edit.php:164
+#: usr/local/www/vpn_l2tp_users_edit.php:172
+#: usr/local/www/vpn_l2tp_users_edit.php:172
+#: usr/local/www/vpn_pptp_users_edit.php:164
+msgid ""
+"If you want the user to be assigned a specific IP address, enter it here."
+msgstr "あなたは、ユーザーが特定のIPアドレスを割り当てることがしたい場合は"、ここに入力します。"
+
+#: usr/local/www/wizard.php:65 usr/local/www/wizard.php:71
+#: usr/local/www/wizard.php:65 usr/local/www/wizard.php:71
+#, php-format
+msgid "ERROR: Could not open %s."
+msgstr "ERROR : %s.を開けませんでした"
+
+#: usr/local/www/wizard.php:77 usr/local/www/wizard.php:77
+#, php-format
+msgid "ERROR: Could not parse %s/wizards/%s file."
+msgstr "ERROR : %s /ウィザード/ %sファイルを解析できませんでした。"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:65
+#: usr/local/www/load_balancer_relay_action_edit.php:65
+msgid "Load Balancer: Relay Action:"
+msgstr "ロード·バランサ:リレー動作:"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:124
+#: usr/local/www/load_balancer_relay_action_edit.php:124
+msgid "This action name has already been used. Action names must be unique."
+msgstr "このアクション名は既に使用されている。アクション名は一意でなければなりません。"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:134
+#: usr/local/www/load_balancer_relay_action_edit.php:134
+#, php-format
+msgid "modified '%s' action:"
+msgstr "修正された「 %s'アクション:"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:186
+#: usr/local/www/load_balancer_relay_protocol_edit.php:144
+#: usr/local/www/load_balancer_relay_protocol_edit.php:142
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_relay_protocol_edit.php:142
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+msgid "DNS"
+msgstr "DNS"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:408
+#: usr/local/www/load_balancer_relay_action_edit.php:407
+#: usr/local/www/load_balancer_relay_action_edit.php:405
+#: usr/local/www/load_balancer_relay_action_edit.php:405
+msgid "Edit Load Balancer - Relay Action entry"
+msgstr "編集ロードバランサ - リレーactionエントリ"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:508
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:173
+#: usr/local/www/load_balancer_relay_action_edit.php:507
+#: usr/local/www/load_balancer_relay_action_edit.php:505
+#: usr/local/www/load_balancer_relay_action_edit.php:505
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:173
+msgid "Key"
+msgstr "キー"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:517
+#: usr/local/www/load_balancer_relay_action_edit.php:537
+#: usr/local/www/load_balancer_relay_action_edit.php:516
+#: usr/local/www/load_balancer_relay_action_edit.php:536
+#: usr/local/www/load_balancer_relay_action_edit.php:514
+#: usr/local/www/load_balancer_relay_action_edit.php:534
+#: usr/local/www/load_balancer_relay_action_edit.php:514
+#: usr/local/www/load_balancer_relay_action_edit.php:534
+msgid "TODO"
+msgstr "TODO"
+
+#: usr/local/www/xmlrpc.php:58 usr/local/www/xmlrpc.php:54
+msgid "Disallowing CARP sync loop."
+msgstr "CARP同期ループを許可しない。"
+
+#: usr/local/www/xmlrpc.php:67 usr/local/www/xmlrpc.php:63
+#: usr/local/www/xmlrpc.php:67
+msgid "Authentication failed"
+msgstr "認証に失敗しました"
+
+#: usr/local/www/xmlrpc.php:78 usr/local/www/xmlrpc.php:74
+#: usr/local/www/xmlrpc.php:78
+msgid ""
+"XMLRPC wrapper for eval(). This method must be called with two parameters: a "
+"string containing the local system's password followed by the PHP code to "
+"evaluate."
+msgstr "「評価するために、PHPコードが続くローカルシステム'sのパスワードを含む文字列: "eval.().ためのXMLRPCラッパーはこのメソッドは、2つのパラメータで呼び出さなければなりません」 。"
+
+#: usr/local/www/xmlrpc.php:109 usr/local/www/xmlrpc.php:105
+#: usr/local/www/xmlrpc.php:109
+msgid ""
+"XMLRPC wrapper for mwexec(). This method must be called with two parameters: "
+"a string containing the local system's password followed by an shell "
+"command to execute."
+msgstr "」 。 mwexec.()ためのXMLRPCラッパーはこのメソッドは、2つのパラメータで呼び出されなければなりません。「ローカルシステム'sのパスワードを含む文字列を実行するためのシェル」コマンドが続く。"
+
+#: usr/local/www/xmlrpc.php:133 usr/local/www/xmlrpc.php:129
+#: usr/local/www/xmlrpc.php:133
+msgid ""
+"XMLRPC wrapper for backup_config_section. This method must be called with "
+"two parameters: a string containing the local system's password followed "
+"by an array containing the keys to be backed up."
+msgstr "バックアップ対象のキーを含む配列によって"に続く、ローカルシステム'sのパスワードを含む文字列: 2パラメータ」を参照してください。 backup_config_sectionのためのXMLRPCラッパーはこのメソッドでは、使用して呼び出されなければならない」 。"
+
+#: usr/local/www/xmlrpc.php:156 usr/local/www/xmlrpc.php:152
+#: usr/local/www/xmlrpc.php:159 usr/local/www/xmlrpc.php:159
+msgid ""
+"XMLRPC wrapper for restore_config_section. This method must be called with "
+"two parameters: a string containing the local system's password and an "
+"array to merge into the system's config. This function returns true upon "
+"completion."
+msgstr "「 restore_config_section用XMLRPCラッパーこのメソッドは、呼び出す必要があります。 「 2パラメータ:ローカルシステム'sのパスワードと「 SYSTEM にマージする配列」を含む文字列を完成。の設定をこの関数は、上にtrueを返します」 。"
+
+#: usr/local/www/xmlrpc.php:203 usr/local/www/xmlrpc.php:282
+#: usr/local/www/xmlrpc.php:307 usr/local/www/xmlrpc.php:212
+#: usr/local/www/xmlrpc.php:291 usr/local/www/xmlrpc.php:316
+#: usr/local/www/xmlrpc.php:288 usr/local/www/xmlrpc.php:313
+#: usr/local/www/xmlrpc.php:224 usr/local/www/xmlrpc.php:308
+#: usr/local/www/xmlrpc.php:337 usr/local/www/xmlrpc.php:224
+#: usr/local/www/xmlrpc.php:308 usr/local/www/xmlrpc.php:337
+#, php-format
+msgid "Merged in config (%s sections) from XMLRPC client."
+msgstr "XMLRPCクライアントから(セクション%s )設定に合併しました。"
+
+#: usr/local/www/xmlrpc.php:263 usr/local/www/xmlrpc.php:272
+#: usr/local/www/xmlrpc.php:269 usr/local/www/xmlrpc.php:286
+#: usr/local/www/xmlrpc.php:286
+msgid ""
+"XMLRPC wrapper for merging package sections. This method must be called with "
+"two parameters: a string containing the local system's password and an "
+"array to merge into the system's config. This function returns true upon "
+"completion."
+msgstr "「パッケージのセクションをマージするためのXMLRPCラッパーこのメソッドは、呼び出す必要があります。 「 2パラメータ:ローカルシステム'sのパスワードと「 SYSTEM にマージする配列」を含む文字列を完成。の設定をこの関数は、上にtrueを返します」 。"
+
+#: usr/local/www/xmlrpc.php:288 usr/local/www/xmlrpc.php:297
+#: usr/local/www/xmlrpc.php:294 usr/local/www/xmlrpc.php:314
+#: usr/local/www/xmlrpc.php:314
+msgid ""
+"XMLRPC wrapper for merge_config_section. This method must be called with two "
+"parameters: a string containing the local system's password and an array "
+"to merge into the system's config. This function returns true upon "
+"completion."
+msgstr "パラメータ"merge_config_sectionためXMLRPCラッパーはこのメソッドは、 2と呼ばれなければなりません。 」 :ローカルシステム'sのパスワードとアレイ」 SYSTEM にマージする」を含む文字列を完成。の設定をこの関数は、上にtrueを返します」 。"
+
+#: usr/local/www/xmlrpc.php:312 usr/local/www/xmlrpc.php:321
+#: usr/local/www/xmlrpc.php:318 usr/local/www/xmlrpc.php:342
+#: usr/local/www/xmlrpc.php:342
+msgid ""
+"Basic XMLRPC wrapper for filter_configure. This method must be called with "
+"one paramater: a string containing the local system's password. This "
+"function returns true upon completion."
+msgstr "ローカルシステム'sのパスワードを含む文字列: 1のparamater "。 filter_configureのための基本的なXMLRPCラッパーはこのメソッドでは、使用して呼び出されなければならない」 。この「機能が完了した時点でtrueを返します。"
+
+#: usr/local/www/xmlrpc.php:342 usr/local/www/xmlrpc.php:351
+#: usr/local/www/xmlrpc.php:348 usr/local/www/xmlrpc.php:372
+#: usr/local/www/xmlrpc.php:372
+msgid "Basic XMLRPC wrapper for configuring CARP interfaces."
+msgstr "CARPインタフェースを設定するための基本的なXMLRPCラッパー。"
+
+#: usr/local/www/xmlrpc.php:364 usr/local/www/xmlrpc.php:385
+#: usr/local/www/xmlrpc.php:373 usr/local/www/xmlrpc.php:394
+#: usr/local/www/xmlrpc.php:370 usr/local/www/xmlrpc.php:391
+#: usr/local/www/xmlrpc.php:397 usr/local/www/xmlrpc.php:418
+#: usr/local/www/xmlrpc.php:397 usr/local/www/xmlrpc.php:418
+msgid ""
+"Basic XMLRPC wrapper for check_firmware_version. This function will return "
+"the output of check_firmware_version upon completion."
+msgstr "完了時にcheck_firmware_versionの出力を"check_firmware_versionための基本XMLRPCラッパー。この関数は戻ります」 。"
+
+#: usr/local/www/xmlrpc.php:406 usr/local/www/xmlrpc.php:415
+#: usr/local/www/xmlrpc.php:412 usr/local/www/xmlrpc.php:439
+#: usr/local/www/xmlrpc.php:439
+msgid "Basic XMLRPC wrapper for rc.reboot."
+msgstr "rc.rebootための基本的なXMLRPCラッパー。"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:65
+#: usr/local/www/load_balancer_relay_protocol_edit.php:65
+msgid "Load Balancer: Relay Protocol:"
+msgstr "ロード·バランサ:リレープロトコル:"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:86
+#: usr/local/www/load_balancer_relay_protocol_edit.php:86
+msgid ""
+"This protocol name has already been used. Protocol names must be unique."
+msgstr "「このプロトコル名が既に使用されています。プロトコル名は一意でなければなりません。"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:105
+#: usr/local/www/load_balancer_relay_protocol_edit.php:105
+#, php-format
+msgid "modified '%s' load balancing protocol:"
+msgstr "修正された「 %s 「ロード·バランシング·プロトコル:"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:107
+#: usr/local/www/load_balancer_relay_protocol_edit.php:107
+msgid "name"
+msgstr "名前"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:108
+#: usr/local/www/load_balancer_relay_protocol_edit.php:110
+#: usr/local/www/load_balancer_relay_protocol_edit.php:108
+#: usr/local/www/load_balancer_relay_protocol_edit.php:110
+msgid "type"
+msgstr "タイプ"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:109
+#: usr/local/www/load_balancer_relay_protocol_edit.php:109
+msgid "description"
+msgstr "説明"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:111
+#: usr/local/www/load_balancer_relay_protocol_edit.php:111
+msgid "action"
+msgstr "アクション"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:192
+#: usr/local/www/load_balancer_relay_protocol_edit.php:190
+#: usr/local/www/load_balancer_relay_protocol_edit.php:190
+msgid "Edit Load Balancer - Relay Protocol entry"
+msgstr "編集ロードバランサ - リレープロトコルエントリ"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:227
+#: usr/local/www/load_balancer_relay_protocol_edit.php:225
+#: usr/local/www/load_balancer_relay_protocol_edit.php:225
+msgid "Add / remove available actions"
+msgstr "追加/使用可能なアクションを削除"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:237
+#: usr/local/www/load_balancer_relay_protocol_edit.php:235
+#: usr/local/www/load_balancer_relay_protocol_edit.php:235
+msgid "Available Actions"
+msgstr "使用可能なアクション"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:252
+#: usr/local/www/system_crlmanager.php:474
+#: usr/local/www/load_balancer_relay_protocol_edit.php:250
+#: usr/local/www/system_crlmanager.php:507
+#: usr/local/www/load_balancer_relay_protocol_edit.php:250
+#: usr/local/www/system_crlmanager.php:507
+msgid "Add"
+msgstr "加える"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:259
+#: usr/local/www/load_balancer_relay_protocol_edit.php:257
+#: usr/local/www/load_balancer_relay_protocol_edit.php:257
+msgid "Enabled Actions"
+msgstr "有効にアクション"
+
+#: usr/local/www/pkg_mgr_settings.php:62 usr/local/www/pkg_mgr_settings.php:94
+#: usr/local/www/pkg_mgr_settings.php:93 usr/local/www/pkg_mgr_settings.php:62
+#: usr/local/www/pkg_mgr_settings.php:93
+msgid "Package Settings"
+msgstr "パッケージ設定"
+
+#: usr/local/www/pkg_mgr_settings.php:92 usr/local/www/pkg_mgr_settings.php:91
+#: usr/local/www/pkg_mgr_settings.php:91
+#, php-format
+msgid "%s packages"
+msgstr "%sパッケージ"
+
+#: usr/local/www/pkg_mgr_settings.php:102
+#: usr/local/www/pkg_mgr_settings.php:105
+#: usr/local/www/pkg_mgr_settings.php:101
+#: usr/local/www/pkg_mgr_settings.php:104
+#: usr/local/www/pkg_mgr_settings.php:101
+#: usr/local/www/pkg_mgr_settings.php:104
+msgid "Package Repository URL"
+msgstr "パッケージリポジトリのURL"
+
+#: usr/local/www/pkg_mgr_settings.php:107
+#: usr/local/www/pkg_mgr_settings.php:106
+#: usr/local/www/pkg_mgr_settings.php:106
+msgid "Use a different URL server for packages other than"
+msgstr "以外のパッケージに別のURLサーバを使用して、"
+
+#: usr/local/www/pkg_mgr_settings.php:112
+#: usr/local/www/pkg_mgr_settings.php:111
+#: usr/local/www/pkg_mgr_settings.php:111
+#, php-format
+msgid "This is where %s will check for packages when the"
+msgstr "%sパッケージをチェックする場所ですとき"
+
+#: usr/local/www/pkg_mgr_settings.php:112
+#: usr/local/www/pkg_mgr_settings.php:111
+#: usr/local/www/pkg_mgr_settings.php:111
+msgid "System: Packages"
+msgstr "システム:パッケージ"
+
+#: usr/local/www/services_captiveportal_hostname.php:111
+#: usr/local/www/services_captiveportal_hostname.php:109
+#: usr/local/www/services_captiveportal_hostname.php:109
+msgid "Allowed IP Addresses"
+msgstr "許可するIPアドレス"
+
+#: usr/local/www/services_captiveportal_hostname.php:173
+#: usr/local/www/services_captiveportal_hostname.php:171
+#: usr/local/www/services_captiveportal_hostname.php:171
+msgid ""
+"Adding allowed Hostnames will allow a DNS hostname access to/from access "
+"through the captive portal without being taken to the portal page. This can "
+"be used for a web server serving images for the portal page or a DNS server "
+"on another network, for example. By specifying <em>from</em> addresses, it "
+"may be used to always allow pass-through access from a client behind the "
+"captive portal."
+msgstr "ポータルページに連れて行かれることなく、キャプティブポータルを介して「許可されたホスト名を追加すると、アクセスへの/からのDNSホスト名へのアクセスを許可します」 。これは、例えば、別のネットワーク上の「 WebサーバーがポータルページまたはDNSサーバー用の画像を提供するために使用する"ことができます。 u003c/ emu003eのアドレスからのu003cemu003e指定することで、キャプティブポータル」は、常に背後にあるクライアントからのパススルーのアクセスを許可するために用いることができる」 。"
+
+#: usr/local/www/services_captiveportal_hostname.php:177
+#: usr/local/www/services_captiveportal_hostname.php:184
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/services_captiveportal_hostname.php:182
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/services_captiveportal_hostname.php:182
+msgid "the Hostname are allowed"
+msgstr "ホスト名が許可されてい"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:62
+#: usr/local/www/services_captiveportal_hostname_edit.php:59
+#: usr/local/www/services_captiveportal_hostname_edit.php:59
+msgid "Edit allowed Hostname"
+msgstr "編集許可ホスト名"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:102
+#: usr/local/www/services_captiveportal_hostname_edit.php:100
+#: usr/local/www/services_captiveportal_hostname_edit.php:100
+msgid "Allowed Hostname"
+msgstr "許可されたホスト名"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:107
+#: usr/local/www/services_captiveportal_hostname_edit.php:105
+#: usr/local/www/services_captiveportal_hostname_edit.php:105
+#, php-format
+msgid "A valid Hostname must be specified. [%s]"
+msgstr "有効なホスト名を指定する必要があります。 ( ( %s ) )"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:172
+#: usr/local/www/services_captiveportal_hostname_edit.php:170
+#: usr/local/www/services_captiveportal_hostname_edit.php:172
+msgid ""
+"to always allow an Hostname through the captive portal (without "
+"authentication)"
+msgstr "「 (認証常時ずに)キャプティブポータルを介してホスト名を許可するには、「"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:173
+#: usr/local/www/services_captiveportal_hostname_edit.php:171
+#: usr/local/www/services_captiveportal_hostname_edit.php:173
+msgid ""
+"to allow access from all clients (even non-authenticated ones) behind the "
+"portal to this Hostname"
+msgstr "このホスト名へのポータル」の後ろに(も含めて非認証) 、すべてのクライアントからのアクセスを許可するには、「"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:192
+#: usr/local/www/services_captiveportal_hostname_edit.php:190
+#: usr/local/www/services_captiveportal_hostname_edit.php:192
+msgid "Enter a upload limit to be enforced on this Hostname in Kbit/s"
+msgstr "キロビット/秒で、このホスト名に施行されるようにアップロード制限を入力してください"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:198
+#: usr/local/www/services_captiveportal_hostname_edit.php:196
+#: usr/local/www/services_captiveportal_hostname_edit.php:198
+msgid "Enter a download limit to be enforced on this Hostname in Kbit/s"
+msgstr "キロビット/秒で、このホスト名に施行されるようにダウンロード制限を入力してください"
+
+#: usr/local/www/services_captiveportal_vouchers.php:67
+#: usr/local/www/services_captiveportal_vouchers.php:64
+#: usr/local/www/services_captiveportal_vouchers.php:64
+msgid ""
+"You will need to recreate any existing Voucher Rolls due to the public and "
+"private key changes. Click cancel if you do not wish to recreate the "
+"vouchers."
+msgstr "あなたは、公開鍵と秘密鍵の変更による既存のバウチャーロールを再作成する必要があります。あなたが伝票を再作成したくない場合は、[キャンセル]をクリックします。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:114
+#: usr/local/www/services_captiveportal_vouchers.php:123
+#: usr/local/www/services_captiveportal_vouchers.php:130
+#: usr/local/www/services_captiveportal_vouchers.php:130
+msgid "Voucher invalid"
+msgstr "バウチャー無効"
+
+#: usr/local/www/services_captiveportal_vouchers.php:116
+#: usr/local/www/services_captiveportal_vouchers.php:125
+#: usr/local/www/services_captiveportal_vouchers.php:132
+#: usr/local/www/services_captiveportal_vouchers.php:132
+msgid "Voucher expired"
+msgstr "バウチャーの有効期限が切れ"
+
+#: usr/local/www/services_captiveportal_vouchers.php:139
+#: usr/local/www/services_captiveportal_vouchers.php:148
+#: usr/local/www/services_captiveportal_vouchers.php:155
+#: usr/local/www/services_captiveportal_vouchers.php:155
+msgid "Cannot write private key file"
+msgstr "秘密鍵ファイルを書き込むことができません"
+
+#: usr/local/www/services_captiveportal_vouchers.php:157
+#: usr/local/www/services_captiveportal_vouchers.php:166
+#: usr/local/www/services_captiveportal_vouchers.php:175
+#: usr/local/www/services_captiveportal_vouchers.php:175
+msgid "Need private RSA key to print vouchers"
+msgstr "バウチャーを印刷するRSA秘密鍵を必要とする"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "charset"
+msgstr "文字セット"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "rollbits"
+msgstr "rollbits"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "ticketbits"
+msgstr "ticketbits"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "checksumbits"
+msgstr "checksumbits"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "publickey"
+msgstr "公開鍵"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "magic"
+msgstr "マジック"
+
+#: usr/local/www/services_captiveportal_vouchers.php:194
+#: usr/local/www/services_captiveportal_vouchers.php:565
+#: usr/local/www/services_captiveportal_vouchers.php:572
+#: usr/local/www/services_captiveportal_vouchers.php:204
+#: usr/local/www/services_captiveportal_vouchers.php:585
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:594
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:599
+msgid "Synchronize Voucher Database IP"
+msgstr "バウチャーデータベースのIPアドレスを同期させる"
+
+#: usr/local/www/services_captiveportal_vouchers.php:194
+#: usr/local/www/services_captiveportal_vouchers.php:204
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "Sync port"
+msgstr "同期ポート"
+
+#: usr/local/www/services_captiveportal_vouchers.php:194
+#: usr/local/www/services_captiveportal_vouchers.php:204
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "Sync password"
+msgstr "同期パスワード"
+
+#: usr/local/www/services_captiveportal_vouchers.php:194
+#: usr/local/www/services_captiveportal_vouchers.php:204
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "Sync username"
+msgstr "同期ユーザ名"
+
+#: usr/local/www/services_captiveportal_vouchers.php:203
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:222
+#: usr/local/www/services_captiveportal_vouchers.php:222
+msgid "Need at least 2 characters to create vouchers."
+msgstr "伝票を作成するには、少なくとも2文字を必要としています。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:205
+#: usr/local/www/services_captiveportal_vouchers.php:215
+#: usr/local/www/services_captiveportal_vouchers.php:224
+#: usr/local/www/services_captiveportal_vouchers.php:224
+msgid "Double quotes aren't allowed."
+msgstr "二重引用符は使用できません。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:207
+#: usr/local/www/services_captiveportal_vouchers.php:217
+#: usr/local/www/services_captiveportal_vouchers.php:226
+#: usr/local/www/services_captiveportal_vouchers.php:226
+msgid "aren't allowed."
+msgstr "許可されていません。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:209
+#: usr/local/www/services_captiveportal_vouchers.php:219
+#: usr/local/www/services_captiveportal_vouchers.php:228
+#: usr/local/www/services_captiveportal_vouchers.php:228
+msgid "# of Bits to store Roll Id needs to be between 1..31."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:211
+#: usr/local/www/services_captiveportal_vouchers.php:221
+#: usr/local/www/services_captiveportal_vouchers.php:230
+#: usr/local/www/services_captiveportal_vouchers.php:230
+msgid "# of Bits to store Ticket Id needs to be between 1..16."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:223
+#: usr/local/www/services_captiveportal_vouchers.php:232
+#: usr/local/www/services_captiveportal_vouchers.php:232
+msgid "# of Bits to store checksum needs to be between 1..31."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_vouchers.php:215
+#: usr/local/www/services_captiveportal_vouchers.php:225
+#: usr/local/www/services_captiveportal_vouchers.php:234
+#: usr/local/www/services_captiveportal_vouchers.php:234
+msgid "This doesn't look like an RSA Public key."
+msgstr "これは、RSA公開鍵のようにしていません。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:217
+#: usr/local/www/services_captiveportal_vouchers.php:227
+#: usr/local/www/services_captiveportal_vouchers.php:236
+#: usr/local/www/services_captiveportal_vouchers.php:236
+msgid "This doesn't look like an RSA Private key."
+msgstr "これはRSA秘密鍵のようにしていません。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:219
+#: usr/local/www/services_captiveportal_vouchers.php:229
+#: usr/local/www/services_captiveportal_vouchers.php:238
+#: usr/local/www/services_captiveportal_vouchers.php:238
+msgid "You cannot sync the voucher database to this host (itself)."
+msgstr "あなたはこのホスト(自体)にクーポンデータベースを同期できません。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:421
+#: usr/local/www/services_captiveportal_vouchers.php:428
+#: usr/local/www/services_captiveportal_vouchers.php:441
+#: usr/local/www/services_captiveportal_vouchers.php:450
+#: usr/local/www/services_captiveportal_vouchers.php:455
+msgid "Enable Vouchers"
+msgstr "バウチャーを有効にする"
+
+#: usr/local/www/services_captiveportal_vouchers.php:435
+#: usr/local/www/services_captiveportal_vouchers_edit.php:173
+#: usr/local/www/status_captiveportal_vouchers.php:116
+#: usr/local/www/services_captiveportal_vouchers.php:442
+#: usr/local/www/status_captiveportal_vouchers.php:117
+#: usr/local/www/services_captiveportal_vouchers.php:455
+#: usr/local/www/services_captiveportal_vouchers_edit.php:171
+#: usr/local/www/services_captiveportal_vouchers.php:464
+#: usr/local/www/status_captiveportal_vouchers.php:122
+#: usr/local/www/services_captiveportal_vouchers.php:469
+#: usr/local/www/services_captiveportal_vouchers_edit.php:171
+#: usr/local/www/status_captiveportal_vouchers.php:122
+msgid "Roll"
+msgstr "ロール"
+
+#: usr/local/www/services_captiveportal_vouchers.php:436
+#: usr/local/www/status_captiveportal_voucher_rolls.php:86
+#: usr/local/www/services_captiveportal_vouchers.php:443
+#: usr/local/www/services_captiveportal_vouchers.php:456
+#: usr/local/www/status_captiveportal_voucher_rolls.php:87
+#: usr/local/www/services_captiveportal_vouchers.php:465
+#: usr/local/www/status_captiveportal_voucher_rolls.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:470
+#: usr/local/www/status_captiveportal_voucher_rolls.php:89
+msgid "Minutes/Ticket"
+msgstr "分/チケット"
+
+#: usr/local/www/services_captiveportal_vouchers.php:437
+#: usr/local/www/services_captiveportal_vouchers.php:444
+#: usr/local/www/services_captiveportal_vouchers.php:457
+#: usr/local/www/services_captiveportal_vouchers.php:466
+#: usr/local/www/services_captiveportal_vouchers.php:471
+msgid "of Tickets"
+msgstr "チケット"
+
+#: usr/local/www/services_captiveportal_vouchers.php:438
+#: usr/local/www/services_captiveportal_vouchers_edit.php:197
+#: usr/local/www/status_captiveportal_voucher_rolls.php:88
+#: usr/local/www/services_captiveportal_vouchers.php:445
+#: usr/local/www/services_captiveportal_vouchers.php:458
+#: usr/local/www/services_captiveportal_vouchers_edit.php:195
+#: usr/local/www/status_captiveportal_voucher_rolls.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:467
+#: usr/local/www/status_captiveportal_voucher_rolls.php:91
+#: usr/local/www/services_captiveportal_vouchers.php:472
+#: usr/local/www/services_captiveportal_vouchers_edit.php:195
+#: usr/local/www/status_captiveportal_voucher_rolls.php:91
+msgid "Comment"
+msgstr "コメント"
+
+#: usr/local/www/services_captiveportal_vouchers.php:458
+#: usr/local/www/services_captiveportal_vouchers.php:465
+#: usr/local/www/services_captiveportal_vouchers.php:478
+#: usr/local/www/services_captiveportal_vouchers.php:487
+#: usr/local/www/services_captiveportal_vouchers.php:492
+msgid "edit voucher"
+msgstr "編集バウチャー"
+
+#: usr/local/www/services_captiveportal_vouchers.php:459
+#: usr/local/www/services_captiveportal_vouchers.php:466
+#: usr/local/www/services_captiveportal_vouchers.php:479
+#: usr/local/www/services_captiveportal_vouchers.php:488
+#: usr/local/www/services_captiveportal_vouchers.php:493
+msgid ""
+"Do you really want to delete this voucher? This makes all vouchers from this "
+"roll invalid"
+msgstr "ロール無効"本当にこのバウチャーを削除しますか?これは、このからのすべてのバウチャーが作る""
+
+#: usr/local/www/services_captiveportal_vouchers.php:459
+#: usr/local/www/services_captiveportal_vouchers.php:466
+#: usr/local/www/services_captiveportal_vouchers.php:479
+#: usr/local/www/services_captiveportal_vouchers.php:488
+#: usr/local/www/services_captiveportal_vouchers.php:493
+msgid "delete vouchers"
+msgstr "バウチャーを削除"
+
+#: usr/local/www/services_captiveportal_vouchers.php:460
+#: usr/local/www/services_captiveportal_vouchers.php:467
+#: usr/local/www/services_captiveportal_vouchers.php:480
+#: usr/local/www/services_captiveportal_vouchers.php:489
+#: usr/local/www/services_captiveportal_vouchers.php:494
+msgid "generate vouchers for this roll to CSV file"
+msgstr "CSVファイルへのこのロールのためのバウチャーを生成"
+
+#: usr/local/www/services_captiveportal_vouchers.php:470
+#: usr/local/www/services_captiveportal_vouchers.php:477
+#: usr/local/www/services_captiveportal_vouchers.php:490
+#: usr/local/www/services_captiveportal_vouchers.php:499
+#: usr/local/www/services_captiveportal_vouchers.php:504
+msgid "add voucher"
+msgstr "バウチャーを追加"
+
+#: usr/local/www/services_captiveportal_vouchers.php:475
+#: usr/local/www/services_captiveportal_vouchers.php:482
+#: usr/local/www/services_captiveportal_vouchers.php:495
+#: usr/local/www/services_captiveportal_vouchers.php:504
+#: usr/local/www/services_captiveportal_vouchers.php:509
+msgid ""
+"Create, generate and activate Rolls with Vouchers that allow access through "
+"the captive portal for the configured time. Once a voucher is activated, its "
+"clock is started and runs uninterrupted until it expires. During that time, "
+"the voucher can be re-used from the same or a different computer. If the "
+"voucher is used again from another computer, the previous session is stopped."
+msgstr "「作成生成し、経由でアクセスできるようバウチャーとロールをアクティブに」設定された時間のためのキャプティブポータル。バウチャーが起動されると、その「クロックが開始され、それはその間、期限切れになるまで中断せずに実行「バウチャーは、同一または異なるコンピュータから再使用することができる。 「バウチャーは、別のコンピュータから再度使用される場合、以前のセッションを停止する。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:481
+#: usr/local/www/services_captiveportal_vouchers.php:488
+#: usr/local/www/services_captiveportal_vouchers.php:501
+#: usr/local/www/services_captiveportal_vouchers.php:510
+#: usr/local/www/services_captiveportal_vouchers.php:515
+msgid ""
+"Enable Voucher support first using the checkbox above and hit Save at the "
+"bottom."
+msgstr "「最初に、上記のチェックボックスを使用してクーポンのサポートを有効にして、で、保存を打つ「ボトム。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:486
+#: usr/local/www/services_captiveportal_vouchers.php:493
+#: usr/local/www/services_captiveportal_vouchers.php:506
+#: usr/local/www/services_captiveportal_vouchers.php:515
+#: usr/local/www/services_captiveportal_vouchers.php:520
+msgid "Voucher public key"
+msgstr "バウチャー公開鍵"
+
+#: usr/local/www/services_captiveportal_vouchers.php:491
+#: usr/local/www/services_captiveportal_vouchers.php:498
+#: usr/local/www/services_captiveportal_vouchers.php:511
+#: usr/local/www/services_captiveportal_vouchers.php:520
+#: usr/local/www/services_captiveportal_vouchers.php:525
+msgid ""
+"Paste an RSA public key (64 Bit or smaller) in PEM format here. This key is "
+"used to decrypt vouchers."
+msgstr "バウチャーを復号化するために使用される「 RSA公開鍵ここにPEM形式の( 64ビットまたはそれ以下) 。このキーはされて貼り付け」 。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:491
+#: usr/local/www/services_captiveportal_vouchers.php:498
+#: usr/local/www/services_captiveportal_vouchers.php:505
+#: usr/local/www/services_captiveportal_vouchers.php:511
+#: usr/local/www/services_captiveportal_vouchers.php:518
+#: usr/local/www/services_captiveportal_vouchers.php:520
+#: usr/local/www/services_captiveportal_vouchers.php:527
+#: usr/local/www/services_captiveportal_vouchers.php:525
+#: usr/local/www/services_captiveportal_vouchers.php:532
+msgid "Generate"
+msgstr "生成する"
+
+#: usr/local/www/services_captiveportal_vouchers.php:491
+#: usr/local/www/services_captiveportal_vouchers.php:498
+#: usr/local/www/services_captiveportal_vouchers.php:505
+#: usr/local/www/services_captiveportal_vouchers.php:511
+#: usr/local/www/services_captiveportal_vouchers.php:518
+#: usr/local/www/services_captiveportal_vouchers.php:520
+#: usr/local/www/services_captiveportal_vouchers.php:527
+#: usr/local/www/services_captiveportal_vouchers.php:525
+#: usr/local/www/services_captiveportal_vouchers.php:532
+msgid "new key"
+msgstr "新しいキー"
+
+#: usr/local/www/services_captiveportal_vouchers.php:494
+#: usr/local/www/services_captiveportal_vouchers.php:501
+#: usr/local/www/services_captiveportal_vouchers.php:514
+#: usr/local/www/services_captiveportal_vouchers.php:523
+#: usr/local/www/services_captiveportal_vouchers.php:528
+msgid "Voucher private key"
+msgstr "バウチャー秘密鍵"
+
+#: usr/local/www/services_captiveportal_vouchers.php:498
+#: usr/local/www/services_captiveportal_vouchers.php:505
+#: usr/local/www/services_captiveportal_vouchers.php:518
+#: usr/local/www/services_captiveportal_vouchers.php:527
+#: usr/local/www/services_captiveportal_vouchers.php:532
+msgid ""
+"Paste an RSA private key (64 Bit or smaller) in PEM format here. This key is "
+"only used to generate encrypted vouchers and doesn't need to be available if "
+"the vouchers have been generated offline."
+msgstr "「 RSA秘密鍵ここにPEM形式の( 64ビットまたはそれ以下) 。このキーが貼り付け」のみ、暗号化された伝票を生成し、伝票をオフラインで生成された」場合に使用可能である必要はありません使用。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:502
+#: usr/local/www/services_captiveportal_vouchers.php:509
+#: usr/local/www/services_captiveportal_vouchers.php:522
+#: usr/local/www/services_captiveportal_vouchers.php:531
+#: usr/local/www/services_captiveportal_vouchers.php:536
+msgid "Character set"
+msgstr "文字セット"
+
+#: usr/local/www/services_captiveportal_vouchers.php:506
+#: usr/local/www/services_captiveportal_vouchers.php:513
+#: usr/local/www/services_captiveportal_vouchers.php:526
+#: usr/local/www/services_captiveportal_vouchers.php:535
+#: usr/local/www/services_captiveportal_vouchers.php:540
+msgid ""
+"Tickets are generated with the specified character set. It should contain "
+"printable characters (numbers, lower case and upper case letters) that are "
+"hard to confuse with others. Avoid e.g. 0/O and l/1."
+msgstr "「チケットは指定された文字セットで生成されます。これは、含まれている必要があります」 「他の人と混同しにくい印刷可能な文字(数字、小文字のと大文字を) 。例えば、0 / OとL / 1を避けてください。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:510
+#: usr/local/www/services_captiveportal_vouchers.php:517
+#: usr/local/www/services_captiveportal_vouchers.php:530
+#: usr/local/www/services_captiveportal_vouchers.php:539
+#: usr/local/www/services_captiveportal_vouchers.php:544
+msgid "of Roll Bits"
+msgstr "ロールビットの"
+
+#: usr/local/www/services_captiveportal_vouchers.php:514
+#: usr/local/www/services_captiveportal_vouchers.php:521
+#: usr/local/www/services_captiveportal_vouchers.php:534
+#: usr/local/www/services_captiveportal_vouchers.php:543
+#: usr/local/www/services_captiveportal_vouchers.php:548
+msgid ""
+"Reserves a range in each voucher to store the Roll # it belongs to. Allowed "
+"range: 1..31. Sum of Roll+Ticket+Checksum bits must be one Bit less than the "
+"RSA key size."
+msgstr "「ロールを格納するために、各バウチャーに範囲を予約"
+
+#: usr/local/www/services_captiveportal_vouchers.php:518
+#: usr/local/www/services_captiveportal_vouchers.php:525
+#: usr/local/www/services_captiveportal_vouchers.php:538
+#: usr/local/www/services_captiveportal_vouchers.php:547
+#: usr/local/www/services_captiveportal_vouchers.php:552
+msgid "of Ticket Bits"
+msgstr "チケットのビット数"
+
+#: usr/local/www/services_captiveportal_vouchers.php:522
+#: usr/local/www/services_captiveportal_vouchers.php:529
+#: usr/local/www/services_captiveportal_vouchers.php:542
+#: usr/local/www/services_captiveportal_vouchers.php:551
+#: usr/local/www/services_captiveportal_vouchers.php:556
+msgid ""
+"Reserves a range in each voucher to store the Ticket# it belongs to. Allowed "
+"range: 1..16. Using 16 bits allows a roll to have up to 65535 vouchers. A "
+"bit array, stored in RAM and in the config, is used to mark if a voucher has "
+"been used. A bit array for 65535 vouchers requires 8 KB of storage."
+msgstr "「チケットを保存するために、各バウチャーに範囲を予約"
+
+#: usr/local/www/services_captiveportal_vouchers.php:526
+#: usr/local/www/services_captiveportal_vouchers.php:533
+#: usr/local/www/services_captiveportal_vouchers.php:546
+#: usr/local/www/services_captiveportal_vouchers.php:555
+#: usr/local/www/services_captiveportal_vouchers.php:560
+msgid "of Checksum Bits"
+msgstr "チェックサムのビット数"
+
+#: usr/local/www/services_captiveportal_vouchers.php:530
+#: usr/local/www/services_captiveportal_vouchers.php:537
+#: usr/local/www/services_captiveportal_vouchers.php:550
+#: usr/local/www/services_captiveportal_vouchers.php:559
+#: usr/local/www/services_captiveportal_vouchers.php:564
+msgid ""
+"Reserves a range in each voucher to store a simple checksum over Roll # and "
+"Ticket#. Allowed range is 0..31."
+msgstr "「ロールに対する単純なチェックサムを保存するために、各バウチャーでの範囲を予約"
+
+#: usr/local/www/services_captiveportal_vouchers.php:534
+#: usr/local/www/services_captiveportal_vouchers.php:541
+#: usr/local/www/services_captiveportal_vouchers.php:554
+#: usr/local/www/services_captiveportal_vouchers.php:563
+#: usr/local/www/services_captiveportal_vouchers.php:568
+msgid "Magic Number"
+msgstr "マジックナンバー"
+
+#: usr/local/www/services_captiveportal_vouchers.php:538
+#: usr/local/www/services_captiveportal_vouchers.php:545
+#: usr/local/www/services_captiveportal_vouchers.php:558
+#: usr/local/www/services_captiveportal_vouchers.php:567
+#: usr/local/www/services_captiveportal_vouchers.php:572
+msgid ""
+"Magic number stored in every voucher. Verified during voucher check. Size "
+"depends on how many bits are left by Roll+Ticket+Checksum bits. If all bits "
+"are used, no magic number will be used and checked."
+msgstr "「バウチャーチェック。広さごとに伝票が検証済みに格納されているマジックナンバーは「ロールチケットチェックサムビットだけ残っているビット数に依存します。すべてのビットが「使用されている場合は、マジックナンバーは使用されず、チェックされます。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:542
+#: usr/local/www/services_captiveportal_vouchers.php:549
+#: usr/local/www/services_captiveportal_vouchers.php:562
+#: usr/local/www/services_captiveportal_vouchers.php:571
+#: usr/local/www/services_captiveportal_vouchers.php:576
+msgid "Invalid Voucher Message"
+msgstr "無効なバウチャーメッセージ"
+
+#: usr/local/www/services_captiveportal_vouchers.php:545
+#: usr/local/www/services_captiveportal_vouchers.php:552
+#: usr/local/www/services_captiveportal_vouchers.php:565
+#: usr/local/www/services_captiveportal_vouchers.php:574
+#: usr/local/www/services_captiveportal_vouchers.php:579
+msgid ""
+"Error message displayed for invalid vouchers on captive portal error page"
+msgstr "キャプティブポータルエラーページで無効なクーポンに表示される"エラーメッセージ"
+
+#: usr/local/www/services_captiveportal_vouchers.php:549
+#: usr/local/www/services_captiveportal_vouchers.php:556
+#: usr/local/www/services_captiveportal_vouchers.php:569
+#: usr/local/www/services_captiveportal_vouchers.php:578
+#: usr/local/www/services_captiveportal_vouchers.php:583
+msgid "Expired Voucher Message"
+msgstr "期限切れのクーポンのメッセージ"
+
+#: usr/local/www/services_captiveportal_vouchers.php:552
+#: usr/local/www/services_captiveportal_vouchers.php:559
+#: usr/local/www/services_captiveportal_vouchers.php:572
+#: usr/local/www/services_captiveportal_vouchers.php:581
+#: usr/local/www/services_captiveportal_vouchers.php:586
+msgid ""
+"Error message displayed for expired vouchers on captive portal error page"
+msgstr "キャプティブポータルエラーページ上の期限切れのクーポンに表示される"エラーメッセージ"
+
+#: usr/local/www/services_captiveportal_vouchers.php:562
+#: usr/local/www/services_captiveportal_vouchers.php:569
+#: usr/local/www/services_captiveportal_vouchers.php:582
+#: usr/local/www/services_captiveportal_vouchers.php:591
+#: usr/local/www/services_captiveportal_vouchers.php:596
+msgid "Voucher database synchronization"
+msgstr "バウチャーデータベースの同期"
+
+#: usr/local/www/services_captiveportal_vouchers.php:568
+#: usr/local/www/services_captiveportal_vouchers.php:575
+#: usr/local/www/services_captiveportal_vouchers.php:588
+#: usr/local/www/services_captiveportal_vouchers.php:597
+#: usr/local/www/services_captiveportal_vouchers.php:602
+msgid ""
+"IP address of master nodes webConfigurator to synchronize voucher database "
+"and used vouchers from."
+msgstr "「IPバウチャーデータベースを同期するには、マスターノードwebConfiguratorのアドレス」との使用のバウチャー。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:569
+#: usr/local/www/services_captiveportal_vouchers.php:576
+#: usr/local/www/services_captiveportal_vouchers.php:589
+#: usr/local/www/services_captiveportal_vouchers.php:598
+#: usr/local/www/services_captiveportal_vouchers.php:603
+msgid "NOTE: this should be setup on the slave nodes and not the primary node!"
+msgstr "注:これは、スレーブノードのセットアップとプライマリノードではないはず!"
+
+#: usr/local/www/services_captiveportal_vouchers.php:573
+#: usr/local/www/services_captiveportal_vouchers.php:580
+#: usr/local/www/services_captiveportal_vouchers.php:593
+#: usr/local/www/services_captiveportal_vouchers.php:602
+#: usr/local/www/services_captiveportal_vouchers.php:607
+msgid "Voucher sync port"
+msgstr "バウチャー同期ポート"
+
+#: usr/local/www/services_captiveportal_vouchers.php:576
+#: usr/local/www/services_captiveportal_vouchers.php:583
+#: usr/local/www/services_captiveportal_vouchers.php:596
+#: usr/local/www/services_captiveportal_vouchers.php:605
+#: usr/local/www/services_captiveportal_vouchers.php:610
+msgid ""
+"This is the port of the master voucher nodes webConfigurator. Example: 443"
+msgstr "「これは、マスターバウチャーノードwebConfiguratorのポートです例: 443"
+
+#: usr/local/www/services_captiveportal_vouchers.php:580
+#: usr/local/www/services_captiveportal_vouchers.php:587
+#: usr/local/www/services_captiveportal_vouchers.php:600
+#: usr/local/www/services_captiveportal_vouchers.php:609
+#: usr/local/www/services_captiveportal_vouchers.php:614
+msgid "Voucher sync username"
+msgstr "バウチャー同期ユーザ名"
+
+#: usr/local/www/services_captiveportal_vouchers.php:583
+#: usr/local/www/services_captiveportal_vouchers.php:590
+#: usr/local/www/services_captiveportal_vouchers.php:603
+#: usr/local/www/services_captiveportal_vouchers.php:612
+#: usr/local/www/services_captiveportal_vouchers.php:617
+msgid "This is the username of the master voucher nodes webConfigurator."
+msgstr "これは、マスターバウチャーノードwebConfiguratorのユーザー名です。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:587
+#: usr/local/www/services_captiveportal_vouchers.php:594
+#: usr/local/www/services_captiveportal_vouchers.php:607
+#: usr/local/www/services_captiveportal_vouchers.php:616
+#: usr/local/www/services_captiveportal_vouchers.php:621
+msgid "Voucher sync password"
+msgstr "バウチャー同期パスワード"
+
+#: usr/local/www/services_captiveportal_vouchers.php:590
+#: usr/local/www/services_captiveportal_vouchers.php:597
+#: usr/local/www/services_captiveportal_vouchers.php:610
+#: usr/local/www/services_captiveportal_vouchers.php:619
+#: usr/local/www/services_captiveportal_vouchers.php:624
+msgid "This is the password of the master voucher nodes webConfigurator."
+msgstr "これは、マスターバウチャーノードwebConfiguratorのパスワードです。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:604
+#: usr/local/www/services_captiveportal_vouchers.php:611
+#: usr/local/www/services_captiveportal_vouchers.php:625
+#: usr/local/www/services_captiveportal_vouchers.php:634
+#: usr/local/www/services_captiveportal_vouchers.php:639
+msgid ""
+"Changing any Voucher parameter (apart from managing the list of Rolls) on "
+"this page will render existing vouchers useless if they were generated with "
+"different settings."
+msgstr "彼らは異なる設定」で生成された場合は、このページ"に(離れてロールのリストを管理するから)任意のバウチャーパラメータを変更すると、 「既存の商品券が無駄にレンダリングされます。"
+
+#: usr/local/www/services_captiveportal_vouchers.php:606
+#: usr/local/www/services_captiveportal_vouchers.php:613
+#: usr/local/www/services_captiveportal_vouchers.php:627
+#: usr/local/www/services_captiveportal_vouchers.php:636
+#: usr/local/www/services_captiveportal_vouchers.php:641
+msgid ""
+"Specifying the Voucher Database Synchronization options will not record any "
+"other value from the other options. They will be retrieved/synced from the "
+"master."
+msgstr "他のオプションから別の値「クーポンのデータベース同期オプションを指定すると、いずれも記録されません」 。彼らは、 「マスターから同期/取得されます。"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:48
+#: usr/local/www/services_captiveportal_vouchers_edit.php:45
+#: usr/local/www/services_captiveportal_vouchers_edit.php:45
+msgid "Edit Voucher Rolls"
+msgstr "編集バウチャーロールスロイス"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:101
+#: usr/local/www/services_captiveportal_vouchers_edit.php:99
+#: usr/local/www/services_captiveportal_vouchers_edit.php:99
+#, php-format
+msgid "Roll number %s already exists."
+msgstr "ロール番号の%sはすでに存在します。"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:107
+#: usr/local/www/services_captiveportal_vouchers_edit.php:105
+#: usr/local/www/services_captiveportal_vouchers_edit.php:105
+#, php-format
+msgid "Roll number must be numeric and less than %s"
+msgstr "ロール番号は、数値や%s未満でなければなりません"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:110
+#: usr/local/www/services_captiveportal_vouchers_edit.php:108
+#: usr/local/www/services_captiveportal_vouchers_edit.php:108
+#, php-format
+msgid "A roll has at least one voucher and less than %s."
+msgstr "ロールは、少なくとも一つのバウチャーと%s.未満を有する"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:113
+#: usr/local/www/services_captiveportal_vouchers_edit.php:111
+#: usr/local/www/services_captiveportal_vouchers_edit.php:111
+msgid "Each voucher must be good for at least 1 minute."
+msgstr "各バウチャーは1分以上良好でなければならない。"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:134
+#: usr/local/www/services_captiveportal_vouchers_edit.php:132
+#: usr/local/www/services_captiveportal_vouchers_edit.php:132
+#, php-format
+msgid "All %1$s vouchers from Roll %2$s marked unused"
+msgstr "ロール%2$sからすべては%1$s券は未使用とマーク"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:177
+#: usr/local/www/services_captiveportal_vouchers_edit.php:175
+#: usr/local/www/services_captiveportal_vouchers_edit.php:175
+msgid "Enter the Roll"
+msgstr "ロールを入力してください"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:177
+#: usr/local/www/services_captiveportal_vouchers_edit.php:175
+#: usr/local/www/services_captiveportal_vouchers_edit.php:175
+msgid "found on top of the generated/printed vouchers"
+msgstr "生成された/印刷された伝票の上に発見"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:181
+#: usr/local/www/services_captiveportal_vouchers_edit.php:179
+#: usr/local/www/services_captiveportal_vouchers_edit.php:179
+msgid "Minutes per Ticket"
+msgstr "チケットごとの分"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:185
+#: usr/local/www/services_captiveportal_vouchers_edit.php:183
+#: usr/local/www/services_captiveportal_vouchers_edit.php:183
+msgid ""
+"Defines the time in minutes that a user is allowed access. The clock starts "
+"ticking the first time a voucher is used for authentication"
+msgstr "「ユーザーがアクセス許可されている時間を分単位で定義します。クロック開始」バウチャーが認証に使用されている最初に刻む"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:193
+#: usr/local/www/services_captiveportal_vouchers_edit.php:191
+#: usr/local/www/services_captiveportal_vouchers_edit.php:191
+msgid "Enter the number of vouchers"
+msgstr "伝票の番号を入力してください"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:193
+#: usr/local/www/services_captiveportal_vouchers_edit.php:191
+#: usr/local/www/services_captiveportal_vouchers_edit.php:191
+msgid ""
+"found on top of the generated/printed vouchers. WARNING: Changing this "
+"number for an existing Roll will mark all vouchers as unused again"
+msgstr "「生成された/印刷された伝票の上に見られる警告:この変更」を、既存のロールの番号が再び使用されていないなど、すべてのバウチャーをマークします"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:201
+#: usr/local/www/services_captiveportal_vouchers_edit.php:199
+#: usr/local/www/services_captiveportal_vouchers_edit.php:199
+msgid "Can be used to further identify this roll. Ignored by the system"
+msgstr "さらに、このロールを識別するために使用することができます。システムでは無視"
+
+#: usr/local/www/diag_resetstate.php:54 usr/local/www/diag_resetstate.php:54
+msgid "The state table has been flushed successfully."
+msgstr "状態テーブルは正常にフラッシュされている。"
+
+#: usr/local/www/diag_resetstate.php:60 usr/local/www/diag_resetstate.php:60
+msgid "The source tracking table has been flushed successfully."
+msgstr "ソース追跡テーブルは正常にフラッシュされている。"
+
+#: usr/local/www/diag_resetstate.php:64 usr/local/www/diag_resetstate.php:64
+msgid "Reset state"
+msgstr "リセット状態"
+
+#: usr/local/www/diag_resetstate.php:91 usr/local/www/diag_resetstate.php:91
+msgid "Firewall state table"
+msgstr "ファイアウォール状態テーブル"
+
+#: usr/local/www/diag_resetstate.php:93 usr/local/www/diag_resetstate.php:93
+msgid ""
+"Resetting the state tables will remove all entries from the corresponding "
+"tables. This means that all open connections will be broken and will have to "
+"be re-established. This may be necessary after making substantial changes to "
+"the firewall and/or NAT rules, especially if there are IP protocol mappings "
+"(e.g. for PPTP or IPv6) with open connections."
+msgstr "テーブル"状態テーブルをリセットすると、対応するからすべてのエントリを削除します」 。これは、開いているすべての接続が切断され、しなければならないことを意味します( PPTP用などまたは「 IPプロトコルマッピングがある場合は特に、ファイアウォールおよび/またはNATのルール「再確立する。これは大幅に変更を加えた後必要な場合があります」オープン接続とIPv6)の。"
+
+#: usr/local/www/diag_resetstate.php:100 usr/local/www/diag_resetstate.php:100
+msgid ""
+"The firewall will normally leave the state tables intact when changing rules."
+msgstr "ルールを変更するときに「ファイアウォールは、通常はそのままの状態テーブルを残す。"
+
+#: usr/local/www/diag_resetstate.php:103 usr/local/www/diag_resetstate.php:103
+msgid ""
+"NOTE: If you reset the firewall state table, the browser session may appear "
+"to be hung after clicking &quot;Reset&quot;. Simply refresh the page to "
+"continue."
+msgstr "「リセット」をクリックした後にハングアップしているように、「注ファイアウォール状態テーブルをリセットすると、ブラウザセッションが表示されることがあります」 。単に「継続してページを更新します。"
+
+#: usr/local/www/diag_resetstate.php:113 usr/local/www/diag_resetstate.php:113
+msgid "Firewall Source Tracking"
+msgstr "ファイアウォールソースの追跡"
+
+#: usr/local/www/diag_resetstate.php:115 usr/local/www/diag_resetstate.php:115
+msgid ""
+"Resetting the source tracking table will remove all source/destination "
+"associations. This means that the "sticky" source/destination association "
+"will be cleared for all clients."
+msgstr "団体「ソース追跡テーブルをリセットすると、すべての送信元/送信先を削除します」 。これは「粘着性」 、送信元/宛先協会は「すべてのクライアントのためにクリアされることを意味します。"
+
+#: usr/local/www/diag_resetstate.php:119 usr/local/www/diag_resetstate.php:119
+msgid "This does not clear active connection states, only source tracking."
+msgstr "これははっきりしないアクティブな接続状態、唯一のソースの追跡を行います。"
+
+#: usr/local/www/diag_resetstate.php:127 usr/local/www/status_lb_pool.php:218
+#: usr/local/www/status_lb_pool.php:218 usr/local/www/diag_resetstate.php:127
+msgid "Reset"
+msgstr "リセット"
+
+#: usr/local/www/status_filter_reload.php:44
+#: usr/local/www/status_filter_reload.php:44
+msgid "Filter Reload Status"
+msgstr "フィルタリロードステータス"
+
+#: usr/local/www/status_filter_reload.php:88
+#: usr/local/www/status_filter_reload.php:89
+#: usr/local/www/status_filter_reload.php:89
+msgid ""
+"This page will automatically refresh every 3 seconds until the filter is "
+"done reloading"
+msgstr "リロード完了」フィルタがされるまで、このページは自動的に3秒ごとに更新されます」"
+
+#: usr/local/www/diag_routes.php:45 usr/local/www/diag_routes.php:45
+msgid "Routing tables"
+msgstr "ルーティングテーブル"
+
+#: usr/local/www/diag_routes.php:58 usr/local/www/diag_routes.php:59
+#: usr/local/www/diag_routes.php:59
+msgid "Name resolution"
+msgstr "の名前解決"
+
+#: usr/local/www/diag_routes.php:62 usr/local/www/diag_routes.php:63
+#: usr/local/www/diag_routes.php:63
+msgid "Enable this to attempt to resolve names when displaying the tables."
+msgstr "テーブルを表示するときに名前を解決しようとするために、これを有効にします。"
+
+#: usr/local/www/diag_routes.php:69 usr/local/www/diag_routes.php:70
+#: usr/local/www/diag_routes.php:70
+msgid "Show"
+msgstr "ショー"
+
+#: usr/local/www/diag_routes.php:72
+msgid ""
+"By enabling name resolution, the query should take a bit longer. You can "
+"stop it at any time by clicking the Stop button in your browser"
+msgstr "名前解決を可能にすることにより、クエリは少し時間がかかるはずです。お使いのブラウザで、[停止]ボタンをクリックすると、いつでもそれを停止することができます"
+
+#: usr/local/www/diag_traceroute.php:62 usr/local/www/diag_traceroute.php:63
+#: usr/local/www/diag_traceroute.php:63
+msgid "ttl"
+msgstr "ttl"
+
+#: usr/local/www/diag_traceroute.php:66 usr/local/www/diag_traceroute.php:67
+#: usr/local/www/diag_traceroute.php:67
+#, php-format
+msgid "Maximum number of hops must be between 1 and %s"
+msgstr "最大ホップ数は1と%sの間でなければなりません"
+
+#: usr/local/www/diag_traceroute.php:94 usr/local/www/diag_traceroute.php:112
+#: usr/local/www/diag_traceroute.php:131 usr/local/www/diag_traceroute.php:131
+msgid "Maximum number of hops"
+msgstr "ホップの最大数"
+
+#: usr/local/www/diag_traceroute.php:104 usr/local/www/diag_traceroute.php:128
+#: usr/local/www/diag_traceroute.php:147 usr/local/www/diag_traceroute.php:147
+msgid "Use ICMP"
+msgstr "使用ICMP"
+
+#: usr/local/www/diag_traceroute.php:117 usr/local/www/diag_traceroute.php:141
+#: usr/local/www/diag_traceroute.php:162 usr/local/www/diag_traceroute.php:162
+msgid ""
+"Traceroute may take a while to complete. You may hit the Stop button on your "
+"browser at any time to see the progress of failed traceroutes."
+msgstr "tracerouteは、完了に時間がかかる場合があります。あなたが失敗したトレースルートの進行状況を確認するために、いつでもお使いのブラウザの[停止]ボタンを押すことがあります。"
+
+#: usr/local/www/diag_traceroute.php:120 usr/local/www/diag_traceroute.php:144
+#: usr/local/www/diag_traceroute.php:173 usr/local/www/diag_traceroute.php:173
+msgid "Traceroute output:"
+msgstr "tracerouteの出力:"
+
+#: usr/local/www/diag_traceroute.php:137
+msgid "Multi-wan is not supported from this utility currently."
+msgstr "マルチWANは現在、このユーティリティからはサポートされません。"
+
+#: usr/local/www/status_graph.php:85 usr/local/www/fbegin.inc:173
+#: usr/local/www/fbegin.inc:191 usr/local/www/fbegin.inc:199
+#: usr/local/www/status_graph.php:90 usr/local/www/status_graph.php:101
+#: usr/local/www/fbegin.inc:190 usr/local/www/status_graph.php:111
+#: usr/local/www/status_graph.php:111 usr/local/www/fbegin.inc:190
+msgid "Traffic Graph"
+msgstr "トラフィックグラフ"
+
+#: usr/local/www/status_graph.php:197
+msgid ""
+"Your browser does not support the type SVG! You need to either use Firefox "
+"or download the Adobe SVG plugin"
+msgstr "またはAdobeのSVGプラグインをダウンロード"あなたのブラウザはタイプのSVG をサポートしていません !あなたがFirefoxを使用するか必要がある」"
+
+#: usr/local/www/status_graph.php:203 usr/local/www/status_graph.php:198
+#: usr/local/www/status_graph.php:209 usr/local/www/status_graph.php:220
+#: usr/local/www/status_graph.php:242 usr/local/www/status_graph.php:242
+msgid "Host IP"
+msgstr "IPをホストする"
+
+#: usr/local/www/status_graph.php:204 usr/local/www/status_graph.php:199
+#: usr/local/www/status_graph.php:210 usr/local/www/status_graph.php:221
+#: usr/local/www/status_graph.php:243 usr/local/www/status_graph.php:243
+msgid "Bandwidth In"
+msgstr "帯域幅"
+
+#: usr/local/www/status_graph.php:205 usr/local/www/status_graph.php:200
+#: usr/local/www/status_graph.php:211 usr/local/www/status_graph.php:222
+#: usr/local/www/status_graph.php:244 usr/local/www/status_graph.php:244
+msgid "Bandwidth Out"
+msgstr "帯域幅アウト"
+
+#: usr/local/www/status_graph.php:291 usr/local/www/status_graph.php:286
+#: usr/local/www/status_graph.php:297 usr/local/www/status_graph.php:308
+#: usr/local/www/status_graph.php:330 usr/local/www/status_graph.php:330
+msgid "the"
+msgstr "ザ·"
+
+#: usr/local/www/status_graph.php:291 usr/local/www/status_graph.php:286
+#: usr/local/www/status_graph.php:297 usr/local/www/status_graph.php:308
+#: usr/local/www/status_graph.php:330 usr/local/www/status_graph.php:330
+msgid "Adobe SVG Viewer"
+msgstr "アドビSVGビューアー"
+
+#: usr/local/www/status_graph.php:291 usr/local/www/status_graph.php:286
+#: usr/local/www/status_graph.php:297 usr/local/www/status_graph.php:308
+#: usr/local/www/status_graph.php:330 usr/local/www/status_graph.php:330
+msgid ""
+"Firefox 1.5 or later or other browser supporting SVG is required to view the "
+"graph"
+msgstr "グラフ"のFirefox 1.5以降、または他のブラウザをサポートするSVGを表示するために必要です」"
+
+#: usr/local/www/carp_status.php:71 usr/local/www/carp_status.php:67
+#: usr/local/www/carp_status.php:67
+#, php-format
+msgid ""
+"%s IPs have been disabled. Please note that disabling does not survive a "
+"reboot."
+msgstr "再起動"%s IPが無効になっています。その無効化が生存しませんのでご注意ください」 。"
+
+#: usr/local/www/carp_status.php:73 usr/local/www/carp_status.php:69
+#: usr/local/www/carp_status.php:69
+msgid "CARP has been enabled."
+msgstr "CARPは有効になっている。"
+
+#: usr/local/www/carp_status.php:127 usr/local/www/carp_status.php:120
+#: usr/local/www/carp_status.php:120
+msgid "Enable Carp"
+msgstr "カープを有効にします"
+
+#: usr/local/www/carp_status.php:130 usr/local/www/carp_status.php:123
+#: usr/local/www/carp_status.php:123
+msgid "Disable Carp"
+msgstr "カープを無効にする"
+
+#: usr/local/www/carp_status.php:138 usr/local/www/carp_status.php:131
+#: usr/local/www/carp_status.php:131
+msgid "CARP Interface"
+msgstr "CARPインタフェース"
+
+#: usr/local/www/carp_status.php:144 usr/local/www/carp_status.php:137
+#: usr/local/www/carp_status.php:137
+msgid "Could not locate any defined CARP interfaces."
+msgstr "定義された任意のCARPインタフェースを見つけることができませんでした。"
+
+#: usr/local/www/carp_status.php:196
+msgid "You can configure CARP settings"
+msgstr "あなたは、 CARPの設定を行うことができます"
+
+#: usr/local/www/carp_status.php:202 usr/local/www/carp_status.php:195
+#: usr/local/www/carp_status.php:195
+msgid "pfSync nodes"
+msgstr "PFSYNC節"
+
+#: usr/local/www/status_interfaces.php:81
+#: usr/local/www/status_interfaces.php:84
+#: usr/local/www/status_interfaces.php:84
+msgid "interface"
+msgstr "インターフェース"
+
+#: usr/local/www/status_interfaces.php:99
+#: usr/local/www/status_interfaces.php:117
+#: usr/local/www/status_interfaces.php:102
+#: usr/local/www/status_interfaces.php:120
+#: usr/local/www/status_interfaces.php:102
+#: usr/local/www/status_interfaces.php:120
+msgid "Release"
+msgstr "リリース"
+
+#: usr/local/www/status_interfaces.php:102
+#: usr/local/www/status_interfaces.php:120
+#: usr/local/www/status_interfaces.php:105
+#: usr/local/www/status_interfaces.php:123
+#: usr/local/www/status_interfaces.php:105
+#: usr/local/www/status_interfaces.php:123
+msgid "Renew"
+msgstr "更新する"
+
+#: usr/local/www/status_interfaces.php:117
+#: usr/local/www/status_interfaces.php:132
+#: usr/local/www/status_interfaces.php:147
+#: usr/local/www/status_interfaces.php:163
+#: usr/local/www/status_interfaces.php:135
+#: usr/local/www/status_interfaces.php:150
+#: usr/local/www/status_interfaces.php:165
+#: usr/local/www/status_interfaces.php:181
+#: usr/local/www/status_interfaces.php:138
+#: usr/local/www/status_interfaces.php:153
+#: usr/local/www/status_interfaces.php:168
+#: usr/local/www/status_interfaces.php:184
+#: usr/local/www/status_interfaces.php:138
+#: usr/local/www/status_interfaces.php:153
+#: usr/local/www/status_interfaces.php:168
+#: usr/local/www/status_interfaces.php:184
+msgid "Connect"
+msgstr "接続する"
+
+#: usr/local/www/status_interfaces.php:171
+#: usr/local/www/status_interfaces.php:189
+#: usr/local/www/status_interfaces.php:192
+#: usr/local/www/status_interfaces.php:192
+msgid "Uptime "
+msgstr "稼働時間"
+
+#: usr/local/www/status_interfaces.php:200
+#: usr/local/www/status_interfaces.php:274
+#: usr/local/www/status_interfaces.php:277
+#: usr/local/www/status_interfaces.php:277
+msgid "Subnet mask IPv4"
+msgstr "サブネットマスクはIPv4"
+
+#: usr/local/www/status_interfaces.php:207
+#: usr/local/www/status_interfaces.php:281
+#: usr/local/www/status_interfaces.php:284
+#: usr/local/www/status_interfaces.php:284
+msgid "Gateway IPv4"
+msgstr "ゲートウェイのIPv4"
+
+#: usr/local/www/status_interfaces.php:224
+#: usr/local/www/status_interfaces.php:305
+#: usr/local/www/status_interfaces.php:308
+#: usr/local/www/status_interfaces.php:308
+msgid "Subnet mask IPv6"
+msgstr "サブネットマスクのIPv6"
+
+#: usr/local/www/status_interfaces.php:239
+#: usr/local/www/status_interfaces.php:320
+#: usr/local/www/status_interfaces.php:323
+#: usr/local/www/status_interfaces.php:323
+msgid "ISP DNS servers"
+msgstr "ISPのDNSサーバ"
+
+#: usr/local/www/status_interfaces.php:251
+#: usr/local/www/status_interfaces.php:332
+#: usr/local/www/status_interfaces.php:335
+#: usr/local/www/status_interfaces.php:335
+msgid "Media"
+msgstr "メディア"
+
+#: usr/local/www/status_interfaces.php:272
+#: usr/local/www/status_interfaces.php:369
+#: usr/local/www/status_interfaces.php:372
+#: usr/local/www/status_interfaces.php:372
+msgid "BSSID"
+msgstr "BSSID"
+
+#: usr/local/www/status_interfaces.php:279
+#: usr/local/www/diag_dump_states_sources.php:148
+#: usr/local/www/status_interfaces.php:376
+#: usr/local/www/status_interfaces.php:379
+#: usr/local/www/diag_dump_states_sources.php:147
+#: usr/local/www/diag_system_pftop.php:158
+#: usr/local/www/diag_dump_states_sources.php:147
+#: usr/local/www/status_interfaces.php:379
+#: usr/local/www/diag_system_pftop.php:158
+msgid "Rate"
+msgstr "率"
+
+#: usr/local/www/status_interfaces.php:286
+#: usr/local/www/status_interfaces.php:383
+#: usr/local/www/status_interfaces.php:386
+#: usr/local/www/status_interfaces.php:386
+msgid "RSSI"
+msgstr "RSSI"
+
+#: usr/local/www/status_interfaces.php:293
+#: usr/local/www/status_interfaces.php:390
+#: usr/local/www/status_interfaces.php:393
+#: usr/local/www/status_interfaces.php:393
+msgid "In/out packets"
+msgstr "IN / OUTパケット"
+
+#: usr/local/www/status_interfaces.php:302
+#: usr/local/www/status_interfaces.php:399
+#: usr/local/www/status_interfaces.php:402
+#: usr/local/www/status_interfaces.php:402
+msgid "In/out packets (pass)"
+msgstr "IN / OUTパケット( PASS)"
+
+#: usr/local/www/status_interfaces.php:311
+#: usr/local/www/status_interfaces.php:408
+#: usr/local/www/status_interfaces.php:411
+#: usr/local/www/status_interfaces.php:411
+msgid "In/out packets (block)"
+msgstr "IN / OUTパケット(ブロック)"
+
+#: usr/local/www/status_interfaces.php:321
+#: usr/local/www/status_interfaces.php:418
+#: usr/local/www/status_interfaces.php:421
+#: usr/local/www/status_interfaces.php:421
+msgid "In/out errors"
+msgstr "IN / OUTの誤差"
+
+#: usr/local/www/status_interfaces.php:329
+#: usr/local/www/status_interfaces.php:426
+#: usr/local/www/status_interfaces.php:429
+#: usr/local/www/status_interfaces.php:429
+msgid "Collisions"
+msgstr "衝突"
+
+#: usr/local/www/status_interfaces.php:338
+#: usr/local/www/status_interfaces.php:435
+#: usr/local/www/status_interfaces.php:438
+#: usr/local/www/status_interfaces.php:438
+#, php-format
+msgid "Bridge (%s)"
+msgstr "ブリッジ (%s)"
+
+#: usr/local/www/status_interfaces.php:360
+#: usr/local/www/status_interfaces.php:457
+#: usr/local/www/status_interfaces.php:460
+#: usr/local/www/status_interfaces.php:460
+msgid "Interrupts/Second"
+msgstr "割り込み/秒"
+
+#: usr/local/www/status_interfaces.php:363
+#: usr/local/www/status_interfaces.php:460
+#: usr/local/www/status_interfaces.php:463
+#: usr/local/www/status_interfaces.php:463
+msgid "total"
+msgstr "総計"
+
+#: usr/local/www/status_interfaces.php:376
+#: usr/local/www/status_interfaces.php:473
+#: usr/local/www/status_interfaces.php:476
+#: usr/local/www/status_interfaces.php:476
+#, php-format
+msgid ""
+"Using dial-on-demand will bring the connection up again if any packet "
+"triggers it. To substantiate this point: disconnecting manually will %snot%s "
+"prevent dial-on-demand from making connections to the outside! Don't use "
+"dial-on-demand if you want to make sure that the line is kept disconnected."
+msgstr "それをトリガー」のいずれかのパケットがあればダイヤルオンデマンド使用すると、再接続が表示されます」 。この点を実証するには、次のように手動で切断すると、ダイヤルオンデマンドますことを確認するかどうかのラインが保たれている「 !ダイヤルオンデマンド外部への接続を行うと、 は使用しないでください防ぐ」 %snot%sます切断。"
+
+#: usr/local/www/exec.php:91 usr/local/www/exec.php:93
+#: usr/local/www/exec.php:93
+msgid "Execute command"
+msgstr "コマンドを実行"
+
+#: usr/local/www/exec.php:153 usr/local/www/exec.php:155
+#: usr/local/www/exec.php:155
+msgid "Nothing to recall"
+msgstr "なし"
+
+#: usr/local/www/exec.php:222 usr/local/www/exec.php:224
+#: usr/local/www/exec.php:224
+msgid "Note: this function is unsupported. Use it on your own risk"
+msgstr "注意: この機能は、サポートされていません。個人の責任でご使用ください。"
+
+#: usr/local/www/exec.php:253 usr/local/www/exec.php:255
+#: usr/local/www/exec.php:255
+msgid "Execute Shell command"
+msgstr "シェルコマンドを実行します。"
+
+#: usr/local/www/exec.php:256 usr/local/www/exec.php:309
+#: usr/local/www/exec.php:258 usr/local/www/exec.php:311
+#: usr/local/www/exec.php:258 usr/local/www/exec.php:311
+msgid "Command"
+msgstr "コマンド"
+
+#: usr/local/www/exec.php:264 usr/local/www/exec.php:315
+#: usr/local/www/exec.php:266 usr/local/www/exec.php:317
+#: usr/local/www/exec.php:266 usr/local/www/exec.php:317
+msgid "Execute"
+msgstr "実行"
+
+#: usr/local/www/exec.php:266 usr/local/www/status_upnp.php:77
+#: usr/local/www/exec.php:268 usr/local/www/status_upnp.php:78
+#: usr/local/www/exec.php:268 usr/local/www/status_upnp.php:78
+msgid "Clear"
+msgstr "クリアー"
+
+#: usr/local/www/exec.php:276 usr/local/www/exec.php:278
+#: usr/local/www/exec.php:278
+msgid "File to download"
+msgstr "ダウンロードするファイル"
+
+#: usr/local/www/exec.php:293 usr/local/www/exec.php:295
+#: usr/local/www/exec.php:295
+msgid "File to upload"
+msgstr "アップロードするファイル"
+
+#: usr/local/www/exec.php:306 usr/local/www/exec.php:308
+#: usr/local/www/exec.php:308
+msgid "PHP Execute"
+msgstr "PHP実行"
+
+#: usr/local/www/exec.php:317 usr/local/www/exec.php:319
+#: usr/local/www/exec.php:319
+msgid "Example"
+msgstr "例"
+
+#: usr/local/www/exec_raw.php:47
+msgid "Nothing specified. Cannot continue."
+msgstr "指定された何もない。続行できません。"
+
+#: usr/local/www/fbegin.inc:88 usr/local/www/fbegin.inc:105
+#: usr/local/www/fbegin.inc:114 usr/local/www/fbegin.inc:106
+#: usr/local/www/fbegin.inc:106
+msgid "Packages"
+msgstr "パッケージ"
+
+#: usr/local/www/fbegin.inc:89 usr/local/www/fbegin.inc:106
+#: usr/local/www/fbegin.inc:115 usr/local/www/fbegin.inc:107
+#: usr/local/www/fbegin.inc:107
+msgid "Setup Wizard"
+msgstr "セットアップウィザード"
+
+#: usr/local/www/fbegin.inc:90 usr/local/www/diag_logs_routing.php:54
+#: usr/local/www/diag_logs_routing.php:84 usr/local/www/fbegin.inc:107
+#: usr/local/www/diag_logs_resolver.php:98 usr/local/www/diag_logs.php:97
+#: usr/local/www/diag_logs_wireless.php:86
+#: usr/local/www/diag_logs_gateways.php:98
+#: usr/local/www/diag_logs_routing.php:85 usr/local/www/fbegin.inc:116
+#: usr/local/www/diag_logs_resolver.php:99
+#: usr/local/www/diag_logs_wireless.php:87
+#: usr/local/www/diag_logs_gateways.php:99 usr/local/www/fbegin.inc:108
+#: usr/local/www/diag_logs_routing.php:54
+#: usr/local/www/diag_logs_routing.php:85 usr/local/www/diag_logs.php:97
+#: usr/local/www/diag_logs_gateways.php:99 usr/local/www/fbegin.inc:108
+#: usr/local/www/diag_logs_wireless.php:87
+#: usr/local/www/diag_logs_resolver.php:99
+msgid "Routing"
+msgstr "ルーティング"
+
+#: usr/local/www/fbegin.inc:91 usr/local/www/fbegin.inc:108
+#: usr/local/www/fbegin.inc:117 usr/local/www/fbegin.inc:109
+#: usr/local/www/fbegin.inc:109
+msgid "Cert Manager"
+msgstr "サティフィケートマネージャー"
+
+#: usr/local/www/fbegin.inc:123 usr/local/www/services_dhcpv6_relay.php:101
+#: usr/local/www/fbegin.inc:140 usr/local/www/fbegin.inc:149
+#: usr/local/www/fbegin.inc:141 usr/local/www/services_dhcpv6_relay.php:101
+#: usr/local/www/fbegin.inc:141
+msgid "DHCPv6 Relay"
+msgstr "DHCPv6 リレー"
+
+#: usr/local/www/fbegin.inc:126 usr/local/www/fbegin.inc:143
+#: usr/local/www/services_dhcpv6.php:581
+#: usr/local/www/services_router_advertisements.php:260
+#: usr/local/www/services_dhcpv6.php:502 usr/local/www/services_dhcpv6.php:512
+#: usr/local/www/services_dhcpv6.php:513 usr/local/www/services_dhcpv6.php:523
+#: usr/local/www/services_router_advertisements.php:255
+#: usr/local/www/services_router_advertisements.php:255
+#: usr/local/www/services_dhcpv6.php:513 usr/local/www/services_dhcpv6.php:523
+msgid "DHCPv6 Server"
+msgstr "DHCPv6 サーバー"
+
+#: usr/local/www/fbegin.inc:129 usr/local/www/status_services.php:316
+#: usr/local/www/widgets/widgets/services_status.widget.php:121
+#: usr/local/www/fbegin.inc:146 etc/inc/service-utils.inc:299
+#: usr/local/www/fbegin.inc:155 usr/local/www/fbegin.inc:147
+#: etc/inc/service-utils.inc:298 etc/inc/service-utils.inc:315
+#: usr/local/www/fbegin.inc:147 etc/inc/service-utils.inc:315
+msgid "IGMP proxy"
+msgstr "IGMP プロキシ"
+
+#: usr/local/www/fbegin.inc:131 usr/local/www/fbegin.inc:149
+msgid "OLSR"
+msgstr "OSLR"
+
+#: usr/local/www/fbegin.inc:132 usr/local/www/vpn_pppoe_edit.php:234
+#: usr/local/www/fbegin.inc:150 usr/local/www/fbegin.inc:158
+#: usr/local/www/vpn_pppoe_edit.php:237 usr/local/www/vpn_pppoe_edit.php:237
+#: usr/local/www/fbegin.inc:150
+msgid "PPPoE Server"
+msgstr "PPPoE サーバー"
+
+#: usr/local/www/fbegin.inc:133 usr/local/www/fbegin.inc:151
+#: usr/local/www/fbegin.inc:159
+msgid "RIP"
+msgstr "RIP"
+
+#: usr/local/www/fbegin.inc:139 usr/local/www/fbegin.inc:175
+#: usr/local/www/fbegin.inc:157 usr/local/www/fbegin.inc:193
+#: usr/local/www/fbegin.inc:165 usr/local/www/fbegin.inc:201
+#: usr/local/www/fbegin.inc:156 usr/local/www/fbegin.inc:192
+#: usr/local/www/fbegin.inc:156 usr/local/www/fbegin.inc:192
+msgid "UPnP &amp; NAT-PMP"
+msgstr "UPnP &amp; NAT-PMP"
+
+#: usr/local/www/fbegin.inc:157 usr/local/www/fbegin.inc:174
+#: usr/local/www/fbegin.inc:182 usr/local/www/fbegin.inc:173
+#: usr/local/www/fbegin.inc:173
+msgid "CARP (failover)"
+msgstr "CARP (フェイルオーバー)"
+
+#: usr/local/www/fbegin.inc:158 usr/local/www/fbegin.inc:175
+#: usr/local/www/fbegin.inc:183 usr/local/www/fbegin.inc:174
+#: usr/local/www/fbegin.inc:174
+msgid "Dashboard"
+msgstr "ダッシュボード"
+
+#: usr/local/www/fbegin.inc:160 usr/local/www/fbegin.inc:177
+#: usr/local/www/fbegin.inc:185 usr/local/www/fbegin.inc:176
+#: usr/local/www/fbegin.inc:176
+msgid "DHCP Leases"
+msgstr "DHCP リース"
+
+#: usr/local/www/fbegin.inc:161 usr/local/www/fbegin.inc:178
+#: usr/local/www/fbegin.inc:186 usr/local/www/fbegin.inc:177
+#: usr/local/www/fbegin.inc:177
+msgid "DHCPv6 Leases"
+msgstr "DHCPv6 リース"
+
+#: usr/local/www/fbegin.inc:162 usr/local/www/fbegin.inc:179
+#: usr/local/www/fbegin.inc:187 usr/local/www/fbegin.inc:178
+#: usr/local/www/fbegin.inc:178
+msgid "Filter Reload"
+msgstr "リロードを絞り込む"
+
+#: usr/local/www/fbegin.inc:168 usr/local/www/fbegin.inc:186
+#: usr/local/www/fbegin.inc:194 usr/local/www/fbegin.inc:185
+#: usr/local/www/fbegin.inc:185
+msgid "Package Logs"
+msgstr "パッケージログ"
+
+#: usr/local/www/fbegin.inc:169 usr/local/www/status_queues.php:98
+#: usr/local/www/status_rrd_graph.php:338
+#: usr/local/www/status_rrd_graph_settings.php:57
+#: usr/local/www/status_rrd_graph_settings.php:137
+#: usr/local/www/fbegin.inc:187
+#: usr/local/www/status_rrd_graph_settings.php:138
+#: usr/local/www/status_queues.php:101 usr/local/www/status_rrd_graph.php:386
+#: usr/local/www/fbegin.inc:195 usr/local/www/status_rrd_graph.php:411
+#: usr/local/www/status_queues.php:109 usr/local/www/fbegin.inc:186
+#: usr/local/www/status_rrd_graph.php:411
+#: usr/local/www/status_rrd_graph_settings.php:57
+#: usr/local/www/status_rrd_graph_settings.php:138
+#: usr/local/www/status_queues.php:109 usr/local/www/fbegin.inc:186
+msgid "Queues"
+msgstr "キュー"
+
+#: usr/local/www/fbegin.inc:170 usr/local/www/status_rrd_graph.php:224
+#: usr/local/www/status_rrd_graph_img.php:41
+#: usr/local/www/status_rrd_graph_settings.php:113
+#: usr/local/www/status_rrd_graph_settings.php:171
+#: usr/local/www/fbegin.inc:188
+#: usr/local/www/status_rrd_graph_settings.php:114
+#: usr/local/www/status_rrd_graph_settings.php:172
+#: usr/local/www/status_rrd_graph.php:244 usr/local/www/fbegin.inc:196
+#: usr/local/www/status_rrd_graph_img.php:43
+#: usr/local/www/status_rrd_graph.php:248 usr/local/www/fbegin.inc:187
+#: usr/local/www/status_rrd_graph_img.php:43
+#: usr/local/www/status_rrd_graph.php:248
+#: usr/local/www/status_rrd_graph_settings.php:114
+#: usr/local/www/status_rrd_graph_settings.php:172
+#: usr/local/www/fbegin.inc:187
+msgid "RRD Graphs"
+msgstr "RRDグラフ"
+
+#: usr/local/www/fbegin.inc:172 usr/local/www/fbegin.inc:190
+#: usr/local/www/fbegin.inc:198 usr/local/www/fbegin.inc:189
+#: usr/local/www/fbegin.inc:189
+msgid "System Logs"
+msgstr "システムログ"
+
+#: usr/local/www/fbegin.inc:188
+msgid "ARP Tables"
+msgstr "ARPテーブル"
+
+#: usr/local/www/fbegin.inc:191 usr/local/www/fbegin.inc:209
+#: usr/local/www/fbegin.inc:217 usr/local/www/fbegin.inc:208
+#: usr/local/www/fbegin.inc:208
+msgid "Command Prompt"
+msgstr "コマンドプロンプト"
+
+#: usr/local/www/fbegin.inc:193 usr/local/www/fbegin.inc:211
+#: usr/local/www/fbegin.inc:219 usr/local/www/fbegin.inc:210
+#: usr/local/www/fbegin.inc:210
+msgid "Edit File"
+msgstr "ファイルの編集"
+
+#: usr/local/www/fbegin.inc:194 usr/local/www/fbegin.inc:212
+#: usr/local/www/fbegin.inc:220 usr/local/www/fbegin.inc:211
+#: usr/local/www/fbegin.inc:211
+msgid "Factory Defaults"
+msgstr "工場出荷時のデフォルト"
+
+#: usr/local/www/fbegin.inc:195 usr/local/www/fbegin.inc:213
+#: usr/local/www/fbegin.inc:221 usr/local/www/fbegin.inc:212
+#: usr/local/www/fbegin.inc:212
+msgid "Halt System"
+msgstr "停止システム"
+
+#: usr/local/www/fbegin.inc:196 usr/local/www/fbegin.inc:214
+#: usr/local/www/fbegin.inc:222 usr/local/www/fbegin.inc:213
+#: usr/local/www/fbegin.inc:213
+msgid "Limiter Info"
+msgstr "リミッタ情報"
+
+#: usr/local/www/fbegin.inc:197 usr/local/www/diag_ndp.php:103
+#: usr/local/www/fbegin.inc:215 usr/local/www/fbegin.inc:223
+#: usr/local/www/fbegin.inc:214 usr/local/www/diag_ndp.php:103
+#: usr/local/www/fbegin.inc:214
+msgid "NDP Table"
+msgstr "NDP表"
+
+#: usr/local/www/fbegin.inc:201 usr/local/www/fbegin.inc:219
+#: usr/local/www/fbegin.inc:227 usr/local/www/fbegin.inc:219
+msgid "pfInfo"
+msgstr "PFINFO"
+
+#: usr/local/www/fbegin.inc:202 usr/local/www/fbegin.inc:220
+#: usr/local/www/fbegin.inc:228 usr/local/www/fbegin.inc:220
+msgid "pfTop"
+msgstr "pfTop"
+
+#: usr/local/www/fbegin.inc:203 usr/local/www/fbegin.inc:221
+#: usr/local/www/fbegin.inc:229 usr/local/www/fbegin.inc:221
+msgid "Reboot"
+msgstr "再起動"
+
+#: usr/local/www/fbegin.inc:205 usr/local/www/fbegin.inc:223
+#: usr/local/www/widgets/widgets/smart_status.widget.php:38
+#: usr/local/www/fbegin.inc:231
+#: usr/local/www/widgets/widgets/smart_status.widget.php:39
+#: usr/local/www/fbegin.inc:223
+#: usr/local/www/widgets/widgets/smart_status.widget.php:39
+msgid "SMART Status"
+msgstr "SMARTステータス"
+
+#: usr/local/www/fbegin.inc:207 usr/local/www/fbegin.inc:225
+#: usr/local/www/fbegin.inc:234 usr/local/www/fbegin.inc:226
+#: usr/local/www/fbegin.inc:226
+msgid "States Summary"
+msgstr "米国のまとめ"
+
+#: usr/local/www/fbegin.inc:208 usr/local/www/fbegin.inc:226
+#: usr/local/www/fbegin.inc:235 usr/local/www/fbegin.inc:227
+#: usr/local/www/fbegin.inc:227
+msgid "System Activity"
+msgstr "システム活動"
+
+#: usr/local/www/fbegin.inc:216 usr/local/www/fbegin.inc:233
+#: usr/local/www/fbegin.inc:242 usr/local/www/fbegin.inc:234
+#: usr/local/www/fbegin.inc:234
+msgid "Restart HTTPD"
+msgstr "リスタートHTTPD"
+
+#: usr/local/www/fbegin.inc:222 usr/local/www/fbegin.inc:240
+#: usr/local/www/fbegin.inc:249 usr/local/www/fbegin.inc:241
+#: usr/local/www/fbegin.inc:241
+msgid "About this Page"
+msgstr "このページについて"
+
+#: usr/local/www/fbegin.inc:224 usr/local/www/fbegin.inc:242
+#: usr/local/www/fbegin.inc:251 usr/local/www/fbegin.inc:243
+#: usr/local/www/fbegin.inc:243
+msgid "Bug Database"
+msgstr "バグデータベース"
+
+#: usr/local/www/fbegin.inc:225 usr/local/www/fbegin.inc:243
+#: usr/local/www/fbegin.inc:252 usr/local/www/fbegin.inc:244
+#: usr/local/www/fbegin.inc:244
+msgid "User Forum"
+msgstr "ユーザーフォーラム"
+
+#: usr/local/www/fbegin.inc:226 usr/local/www/fbegin.inc:244
+#: usr/local/www/fbegin.inc:253 usr/local/www/fbegin.inc:245
+#: usr/local/www/fbegin.inc:245
+msgid "Documentation"
+msgstr "ドキュメンテーション"
+
+#: usr/local/www/fbegin.inc:227 usr/local/www/fbegin.inc:245
+#: usr/local/www/fbegin.inc:254 usr/local/www/fbegin.inc:246
+#: usr/local/www/fbegin.inc:246
+msgid "Developers Wiki"
+msgstr "開発者はウィキ"
+
+#: usr/local/www/fbegin.inc:228 usr/local/www/fbegin.inc:246
+#: usr/local/www/fbegin.inc:255 usr/local/www/fbegin.inc:247
+#: usr/local/www/fbegin.inc:247
+msgid "Paid Support"
+msgstr "有償サポート"
+
+#: usr/local/www/fbegin.inc:229 usr/local/www/fbegin.inc:247
+#: usr/local/www/fbegin.inc:256 usr/local/www/fbegin.inc:248
+#: usr/local/www/fbegin.inc:248
+msgid "pfSense Book"
+msgstr "pfSenseブック"
+
+#: usr/local/www/fbegin.inc:230 usr/local/www/fbegin.inc:248
+#: usr/local/www/fbegin.inc:257 usr/local/www/fbegin.inc:249
+#: usr/local/www/fbegin.inc:249
+msgid "Search portal"
+msgstr "検索ポータル"
+
+#: usr/local/www/fbegin.inc:231 usr/local/www/fbegin.inc:249
+#: usr/local/www/fbegin.inc:258 usr/local/www/fbegin.inc:250
+#: usr/local/www/fbegin.inc:250
+msgid "FreeBSD Handbook"
+msgstr "FreeBSDハンドブック"
+
+#: usr/local/www/fbegin.inc:376 usr/local/www/fbegin.inc:394
+#: usr/local/www/fbegin.inc:340 usr/local/www/fbegin.inc:332
+#: usr/local/www/fbegin.inc:332
+msgid "Help"
+msgstr "助け"
+
+#: usr/local/www/fbegin.inc:425 usr/local/www/fbegin.inc:443
+msgid "Status of items on this page."
+msgstr "このページの項目のステータス。"
+
+#: usr/local/www/fbegin.inc:428 usr/local/www/fbegin.inc:446
+msgid "Log entries for items on this page."
+msgstr "このページの項目のエントリをログに記録します。"
+
+#: usr/local/www/fbegin.inc:431 usr/local/www/fbegin.inc:449
+msgid "Help for items on this page."
+msgstr "このページの項目のヘルプを表示します。"
+
+#: usr/local/www/fbegin.inc:441 usr/local/www/fbegin.inc:459
+#: usr/local/www/fbegin.inc:429 usr/local/www/fbegin.inc:421
+#: usr/local/www/fbegin.inc:421
+msgid ""
+"Packages are currently being reinstalled in the background.<p>Do not make "
+"changes in the GUI until this is complete."
+msgstr "「パッケージは現在、バックグラウンドで再インストールされている。 u003cPu003eはしないでください」これが完了するまで、GUIの変更を。"
+
+#: usr/local/www/status_queues.php:98 usr/local/www/status_queues.php:101
+#: usr/local/www/status_queues.php:109 usr/local/www/status_queues.php:109
+msgid "Traffic shaper"
+msgstr "トラフィックシェー"
+
+#: usr/local/www/status_queues.php:107 usr/local/www/status_queues.php:110
+#: usr/local/www/status_queues.php:111 usr/local/www/status_queues.php:117
+#: usr/local/www/status_queues.php:117
+msgid "Traffic shaping is not configured."
+msgstr "トラフィックシェーピングが設定されていません。"
+
+#: usr/local/www/status_queues.php:136 usr/local/www/status_queues.php:143
+#: usr/local/www/status_queues.php:144 usr/local/www/status_queues.php:149
+#: usr/local/www/status_queues.php:149
+msgid "Statistics"
+msgstr "統計"
+
+#: usr/local/www/status_queues.php:158 usr/local/www/status_queues.php:165
+#: usr/local/www/status_queues.php:166 usr/local/www/status_queues.php:223
+#: usr/local/www/status_queues.php:224 usr/local/www/status_queues.php:224
+msgid "Loading"
+msgstr "荷重"
+
+#: usr/local/www/status_queues.php:173 usr/local/www/status_queues.php:181
+#: usr/local/www/status_queues.php:182 usr/local/www/status_queues.php:164
+#: usr/local/www/status_queues.php:164
+msgid "Queue graphs take 5 seconds to sample data"
+msgstr "キュー·グラフは、データをサンプリングするために5秒を要する"
+
+#: usr/local/www/status_queues.php:174 usr/local/www/status_queues.php:182
+#: usr/local/www/status_queues.php:183 usr/local/www/status_queues.php:165
+#: usr/local/www/status_queues.php:165
+msgid "You can configure the Traffic Shaper"
+msgstr "あなたは、トラフィック·シェイパーを設定することができます"
+
+#: usr/local/www/status_rrd_graph.php:211
+#: usr/local/www/status_rrd_graph_settings.php:59
+#: usr/local/www/status_rrd_graph.php:174
+#: usr/local/www/status_rrd_graph.php:179
+#: usr/local/www/status_rrd_graph.php:179
+#: usr/local/www/status_rrd_graph_settings.php:59
+msgid "Inverse"
+msgstr "逆数"
+
+#: usr/local/www/status_rrd_graph.php:212
+#: usr/local/www/status_rrd_graph_settings.php:60
+#: usr/local/www/status_rrd_graph.php:175
+#: usr/local/www/status_rrd_graph.php:180
+#: usr/local/www/status_rrd_graph.php:180
+#: usr/local/www/status_rrd_graph_settings.php:60
+msgid "Absolute"
+msgstr "絶対的な"
+
+#: usr/local/www/status_rrd_graph.php:214
+#: usr/local/www/status_rrd_graph_settings.php:61
+#: usr/local/www/status_rrd_graph.php:234
+#: usr/local/www/status_rrd_graph.php:238
+#: usr/local/www/status_rrd_graph.php:238
+#: usr/local/www/status_rrd_graph_settings.php:61
+msgid "Absolute Timespans"
+msgstr "絶対タイムスパン"
+
+#: usr/local/www/status_rrd_graph.php:214
+#: usr/local/www/status_rrd_graph_settings.php:62
+#: usr/local/www/status_rrd_graph.php:234
+#: usr/local/www/status_rrd_graph.php:238
+#: usr/local/www/status_rrd_graph.php:238
+#: usr/local/www/status_rrd_graph_settings.php:62
+msgid "Current Period"
+msgstr "当期"
+
+#: usr/local/www/status_rrd_graph.php:214
+#: usr/local/www/status_rrd_graph_settings.php:63
+#: usr/local/www/status_rrd_graph.php:234
+#: usr/local/www/status_rrd_graph.php:238
+#: usr/local/www/status_rrd_graph.php:238
+#: usr/local/www/status_rrd_graph_settings.php:63
+msgid "Previous Period"
+msgstr "前期"
+
+#: usr/local/www/status_rrd_graph.php:331
+#: usr/local/www/status_rrd_graph_settings.php:54
+#: usr/local/www/status_rrd_graph_settings.php:130
+#: usr/local/www/status_rrd_graph_settings.php:131
+#: usr/local/www/status_rrd_graph.php:379
+#: usr/local/www/status_rrd_graph.php:404
+#: usr/local/www/status_rrd_graph.php:404
+#: usr/local/www/status_rrd_graph_settings.php:54
+#: usr/local/www/status_rrd_graph_settings.php:131
+msgid "Traffic"
+msgstr "トラフィック"
+
+#: usr/local/www/status_rrd_graph.php:333
+#: usr/local/www/status_rrd_graph_settings.php:55
+#: usr/local/www/status_rrd_graph_settings.php:132
+#: usr/local/www/status_rrd_graph_settings.php:133
+#: usr/local/www/status_rrd_graph.php:381
+#: usr/local/www/status_rrd_graph.php:406
+#: usr/local/www/status_rrd_graph.php:406
+#: usr/local/www/status_rrd_graph_settings.php:55
+#: usr/local/www/status_rrd_graph_settings.php:133
+msgid "Packets"
+msgstr "パケット"
+
+#: usr/local/www/status_rrd_graph.php:335
+#: usr/local/www/status_rrd_graph_settings.php:56
+#: usr/local/www/status_rrd_graph_settings.php:134
+#: usr/local/www/status_rrd_graph_settings.php:135
+#: usr/local/www/status_rrd_graph.php:383
+#: usr/local/www/status_rrd_graph.php:408
+#: usr/local/www/status_rrd_graph.php:408
+#: usr/local/www/status_rrd_graph_settings.php:56
+#: usr/local/www/status_rrd_graph_settings.php:135
+msgid "Quality"
+msgstr "品質"
+
+#: usr/local/www/status_rrd_graph.php:340
+#: usr/local/www/status_rrd_graph_settings.php:139
+#: usr/local/www/status_rrd_graph_settings.php:140
+#: usr/local/www/status_rrd_graph.php:388
+#: usr/local/www/status_rrd_graph.php:413
+#: usr/local/www/status_rrd_graph.php:413
+#: usr/local/www/status_rrd_graph_settings.php:140
+msgid "QueueDrops"
+msgstr "QueueDrops"
+
+#: usr/local/www/status_rrd_graph.php:348
+#: usr/local/www/status_rrd_graph_settings.php:147
+#: usr/local/www/status_rrd_graph_settings.php:148
+#: usr/local/www/status_rrd_graph.php:396
+#: usr/local/www/status_rrd_graph.php:421
+#: usr/local/www/status_rrd_graph.php:421
+#: usr/local/www/status_rrd_graph_settings.php:148
+msgid "Cellular"
+msgstr "細胞の"
+
+#: usr/local/www/status_rrd_graph.php:371
+#: usr/local/www/status_rrd_graph.php:419
+#: usr/local/www/status_rrd_graph.php:451
+#: usr/local/www/status_rrd_graph.php:451
+msgid ""
+"Note: Change of color and/or style may not take effect until the next refresh"
+msgstr ""注:色および/またはスタイルの変更は、次回の更新までは有効になりません"
+
+#: usr/local/www/status_rrd_graph.php:375
+#: usr/local/www/status_rrd_graph.php:423
+#: usr/local/www/status_rrd_graph.php:455
+#: usr/local/www/status_rrd_graph.php:455
+msgid "Graphs:"
+msgstr "グラフ:"
+
+#: usr/local/www/status_rrd_graph.php:432
+#: usr/local/www/status_rrd_graph.php:480
+#: usr/local/www/status_rrd_graph.php:515
+#: usr/local/www/status_rrd_graph.php:515
+msgid "Style:"
+msgstr "スタイル:"
+
+#: usr/local/www/status_rrd_graph.php:446
+#: usr/local/www/status_rrd_graph.php:494
+#: usr/local/www/status_rrd_graph.php:529
+#: usr/local/www/status_rrd_graph.php:529
+msgid "Period:"
+msgstr "期間:"
+
+#: usr/local/www/status_rrd_graph.php:461
+#: usr/local/www/status_rrd_graph.php:513
+#: usr/local/www/status_rrd_graph.php:548
+#: usr/local/www/status_rrd_graph.php:548
+msgid "Start:"
+msgstr "起動します。"
+
+#: usr/local/www/status_rrd_graph.php:463
+#: usr/local/www/status_rrd_graph.php:515
+#: usr/local/www/status_rrd_graph.php:550
+#: usr/local/www/status_rrd_graph.php:550
+msgid "End:"
+msgstr "終了:"
+
+#: usr/local/www/status_rrd_graph.php:465
+#: usr/local/www/status_rrd_graph.php:517
+#: usr/local/www/status_rrd_graph.php:552
+#: usr/local/www/status_rrd_graph.php:552
+msgid "Go"
+msgstr "行く"
+
+#: usr/local/www/status_rrd_graph_img.php:41
+#: usr/local/www/status_rrd_graph_img.php:43
+#: usr/local/www/status_rrd_graph_img.php:43
+msgid "Image viewer"
+msgstr "画像ビューアー"
+
+#: usr/local/www/status_rrd_graph_img.php:216
+#: usr/local/www/status_rrd_graph_img.php:221
+#: usr/local/www/status_rrd_graph_img.php:221
+#, php-format
+msgid "rrdcolors.inc.php for theme %s does not exist, using defaults!"
+msgstr "テーマ%s用rrdcolors.inc.phpはデフォルトを使用して、存在しません !"
+
+#: usr/local/www/status_rrd_graph_img.php:1095
+#: usr/local/www/status_rrd_graph_img.php:1088
+#: usr/local/www/status_rrd_graph_img.php:1093
+#: usr/local/www/status_rrd_graph_img.php:1093
+#, php-format
+msgid "Sorry we do not have data to graph for %s"
+msgstr "申し訳ありませんが、我々は%sため、グラフにデータを持っていない"
+
+#: usr/local/www/status_rrd_graph_img.php:1115
+#: usr/local/www/status_rrd_graph_img.php:1108
+#: usr/local/www/status_rrd_graph_img.php:1113
+#: usr/local/www/status_rrd_graph_img.php:1113
+#, php-format
+msgid "Failed to create graph with error code %1$s, the error is: %2$s"
+msgstr "エラーコードは%1$sでグラフの作成に失敗しました、エラー: %2$s"
+
+#: usr/local/www/status_rrd_graph_img.php:1117
+#: usr/local/www/status_rrd_graph_img.php:1124
+#: usr/local/www/status_rrd_graph_img.php:1110
+#: usr/local/www/status_rrd_graph_img.php:1115
+#: usr/local/www/status_rrd_graph_img.php:1122
+#: usr/local/www/status_rrd_graph_img.php:1115
+#: usr/local/www/status_rrd_graph_img.php:1122
+#, php-format
+msgid "failed to create graph from %s%s, removing database"
+msgstr "データベースを削除、 %s%sからグラフを作成できませんでした"
+
+#: usr/local/www/status_rrd_graph_settings.php:174
+#: usr/local/www/status_rrd_graph_settings.php:175
+#: usr/local/www/status_rrd_graph_settings.php:175
+msgid "Enables the RRD graphing backend."
+msgstr "のRRDグラフのバックエンドを有効にします。"
+
+#: usr/local/www/status_rrd_graph_settings.php:178
+#: usr/local/www/status_rrd_graph_settings.php:179
+#: usr/local/www/status_rrd_graph_settings.php:179
+msgid "Default category"
+msgstr "デフォルトのカテゴリ"
+
+#: usr/local/www/status_rrd_graph_settings.php:189
+#: usr/local/www/status_rrd_graph_settings.php:190
+#: usr/local/www/status_rrd_graph_settings.php:190
+msgid "This selects default category."
+msgstr "これはデフォルトのカテゴリを選択する。"
+
+#: usr/local/www/status_rrd_graph_settings.php:193
+#: usr/local/www/status_rrd_graph_settings.php:194
+#: usr/local/www/status_rrd_graph_settings.php:194
+msgid "Default style"
+msgstr "デフォルトのスタイル"
+
+#: usr/local/www/status_rrd_graph_settings.php:204
+#: usr/local/www/status_rrd_graph_settings.php:205
+#: usr/local/www/status_rrd_graph_settings.php:205
+msgid "This selects the default style."
+msgstr "これがデフォルトのスタイルを選択します。"
+
+#: usr/local/www/status_rrd_graph_settings.php:208
+#: usr/local/www/status_rrd_graph_settings.php:209
+#: usr/local/www/status_rrd_graph_settings.php:209
+msgid "Default period"
+msgstr "デフォルトの期間"
+
+#: usr/local/www/status_rrd_graph_settings.php:219
+#: usr/local/www/status_rrd_graph_settings.php:220
+#: usr/local/www/status_rrd_graph_settings.php:220
+msgid "This selects the default period."
+msgstr "これはデフォルトの期間を選択します。"
+
+#: usr/local/www/status_rrd_graph_settings.php:231
+#: usr/local/www/status_rrd_graph_settings.php:232
+#: usr/local/www/status_rrd_graph_settings.php:232
+msgid "Reset RRD Data"
+msgstr "RRDデータをリセットする"
+
+#: usr/local/www/status_rrd_graph_settings.php:231
+#: usr/local/www/status_rrd_graph_settings.php:232
+#: usr/local/www/status_rrd_graph_settings.php:232
+msgid ""
+"Do you really want to reset the RRD graphs? This will erase all graph data."
+msgstr ""本当にRRDグラフをリセットしますか?これは、すべてのグラフのデータが消去されます。"
+
+#: usr/local/www/status_rrd_graph_settings.php:237
+#: usr/local/www/status_rrd_graph_settings.php:238
+#: usr/local/www/status_rrd_graph_settings.php:238
+msgid ""
+"Graphs will not be allowed to be recreated within a 1 minute interval, "
+"please take this into account after changing the style."
+msgstr "「グラフは1分間隔内で再作成することは許されないだろう」と、スタイルを変更した後、これを考慮に入れてください。"
+
+#: usr/local/www/status_services.php:60
+#: usr/local/www/widgets/widgets/services_status.widget.php:54
+#: etc/inc/service-utils.inc:387 etc/inc/service-utils.inc:386
+#: etc/inc/service-utils.inc:403 etc/inc/service-utils.inc:403
+msgid "Not available."
+msgstr "は利用できません。"
+
+#: usr/local/www/status_services.php:112 usr/local/www/status_services.php:100
+#: usr/local/www/status_services.php:98 etc/inc/service-utils.inc:657
+#: etc/inc/service-utils.inc:660 etc/inc/service-utils.inc:660
+#, php-format
+msgid "%s has been restarted."
+msgstr "%sが再起動されました。"
+
+#: usr/local/www/status_services.php:159 usr/local/www/status_services.php:151
+#: usr/local/www/status_services.php:149 etc/inc/service-utils.inc:544
+#: etc/inc/service-utils.inc:547 etc/inc/service-utils.inc:547
+#, php-format
+msgid "%s has been started."
+msgstr "%sが開始されている。"
+
+#: usr/local/www/status_services.php:218 usr/local/www/status_services.php:214
+#: usr/local/www/status_services.php:212 etc/inc/service-utils.inc:605
+#: etc/inc/service-utils.inc:608 etc/inc/service-utils.inc:608
+#, php-format
+msgid "%s has been stopped."
+msgstr "%sが停止されました。"
+
+#: usr/local/www/status_services.php:269
+#: usr/local/www/widgets/widgets/services_status.widget.php:74
+#: etc/inc/service-utils.inc:247 etc/inc/service-utils.inc:246
+#: etc/inc/service-utils.inc:263 etc/inc/service-utils.inc:263
+msgid "NTP clock sync"
+msgstr "NTPクロック同期"
+
+#: usr/local/www/status_services.php:302
+#: usr/local/www/widgets/widgets/services_status.widget.php:107
+#: etc/inc/service-utils.inc:285 etc/inc/service-utils.inc:284
+#: etc/inc/service-utils.inc:301 etc/inc/service-utils.inc:301
+msgid "DHCP Service"
+msgstr "DHCPサービス"
+
+#: usr/local/www/status_services.php:309
+#: usr/local/www/widgets/widgets/services_status.widget.php:114
+#: etc/inc/service-utils.inc:292 etc/inc/service-utils.inc:291
+#: etc/inc/service-utils.inc:308 etc/inc/service-utils.inc:308
+msgid "SNMP Service"
+msgstr "SNMPサービス"
+
+#: usr/local/www/status_services.php:323
+#: usr/local/www/widgets/widgets/services_status.widget.php:128
+#: etc/inc/service-utils.inc:306 etc/inc/service-utils.inc:305
+#: etc/inc/service-utils.inc:322 etc/inc/service-utils.inc:322
+msgid "UPnP Service"
+msgstr "UPnPのサービス"
+
+#: usr/local/www/status_services.php:353
+#: usr/local/www/widgets/widgets/services_status.widget.php:158
+#: etc/inc/service-utils.inc:343 etc/inc/service-utils.inc:342
+#: etc/inc/service-utils.inc:359 etc/inc/service-utils.inc:359
+msgid "Server load balancing daemon"
+msgstr "サーバ負荷分散デーモン"
+
+#: usr/local/www/status_services.php:380
+#: usr/local/www/widgets/widgets/services_status.widget.php:210
+#: etc/inc/service-utils.inc:411 etc/inc/service-utils.inc:410
+#: etc/inc/service-utils.inc:427 etc/inc/service-utils.inc:430
+#: etc/inc/service-utils.inc:430
+msgid "Running"
+msgstr "ランニング"
+
+#: usr/local/www/status_services.php:383
+#: usr/local/www/widgets/widgets/services_status.widget.php:213
+#: etc/inc/service-utils.inc:420 etc/inc/service-utils.inc:419
+#: etc/inc/service-utils.inc:437 etc/inc/service-utils.inc:440
+#: etc/inc/service-utils.inc:440
+msgid "Stopped"
+msgstr "停止"
+
+#: usr/local/www/status_services.php:392
+#: usr/local/www/widgets/widgets/services_status.widget.php:222
+msgid "Restart Service"
+msgstr "再起動のサービス"
+
+#: usr/local/www/status_services.php:398
+#: usr/local/www/widgets/widgets/services_status.widget.php:228
+msgid "Stop Service"
+msgstr "サービスを停止します"
+
+#: usr/local/www/status_services.php:407
+#: usr/local/www/widgets/widgets/services_status.widget.php:237
+msgid "Start Service"
+msgstr "サービスを開始"
+
+#: usr/local/www/status_services.php:412
+#: usr/local/www/widgets/widgets/services_status.widget.php:242
+#: usr/local/www/status_services.php:271
+#: usr/local/www/widgets/widgets/services_status.widget.php:83
+#: usr/local/www/status_services.php:269 usr/local/www/status_services.php:110
+#: usr/local/www/widgets/widgets/services_status.widget.php:84
+#: usr/local/www/status_services.php:110
+#: usr/local/www/widgets/widgets/services_status.widget.php:84
+msgid "No services found"
+msgstr "見つかりませんサービス"
+
+#: usr/local/www/status_upnp.php:48 usr/local/www/status_upnp.php:48
+msgid "Rules have been cleared and the daemon restarted"
+msgstr "ルールがクリアされたとデーモンを再起動"
+
+#: usr/local/www/status_upnp.php:58 usr/local/www/status_upnp.php:58
+msgid "UPnP &amp; NAT-PMP Status"
+msgstr "UPnPの& NAT -PMPの状況"
+
+#: usr/local/www/status_upnp.php:67 usr/local/www/status_upnp.php:68
+#: usr/local/www/status_upnp.php:68
+msgid "UPnP is currently disabled."
+msgstr "UPnPのは現在無効になっています。"
+
+#: usr/local/www/status_upnp.php:77 usr/local/www/status_upnp.php:78
+#: usr/local/www/status_upnp.php:78
+msgid "all currently connected sessions"
+msgstr "すべての現在接続しているセッション"
+
+#: usr/local/www/diag_arp.php:261 usr/local/www/fbegin.inc:206
+#: usr/local/www/fbegin.inc:214 usr/local/www/fbegin.inc:205
+#: usr/local/www/diag_arp.php:261 usr/local/www/fbegin.inc:205
+msgid "ARP Table"
+msgstr "ARPテーブル"
+
+#: usr/local/www/diag_arp.php:271 usr/local/www/diag_ndp.php:113
+#: usr/local/www/diag_ndp.php:113 usr/local/www/diag_arp.php:271
+msgid "Loading, please wait..."
+msgstr "読み込み中、しばらくお待ちください..."
+
+#: usr/local/www/services_dyndns_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:158
+#: usr/local/www/services_dyndns_edit.php:92
+#: usr/local/www/services_dyndns_edit.php:216
+#: usr/local/www/services_dyndns_edit.php:220
+#: usr/local/www/services_dyndns_edit.php:93
+#: usr/local/www/services_dyndns_edit.php:222
+#: usr/local/www/services_dyndns_edit.php:93
+#: usr/local/www/services_dyndns_edit.php:222
+msgid "Service type"
+msgstr "サービスの種類"
+
+#: usr/local/www/services_dyndns_edit.php:92
+#: usr/local/www/services_dyndns_edit.php:108
+#: usr/local/www/services_dyndns_edit.php:109
+#: usr/local/www/services_dyndns_edit.php:109
+msgid "The MX contains invalid characters."
+msgstr "MXは無効な文字が含まれています。"
+
+#: usr/local/www/services_dyndns_edit.php:133
+#: usr/local/www/services_dyndns_edit.php:147
+#: usr/local/www/services_dyndns_edit.php:156
+#: usr/local/www/services_dyndns_edit.php:205
+#: usr/local/www/services_dyndns_edit.php:160
+#: usr/local/www/services_dyndns_edit.php:209
+#: usr/local/www/services_dyndns_edit.php:162
+#: usr/local/www/services_dyndns_edit.php:211
+#: usr/local/www/services_dyndns_edit.php:162
+#: usr/local/www/services_dyndns_edit.php:211
+msgid "Dynamic DNS client"
+msgstr "ダイナミックDNSクライアント"
+
+#: usr/local/www/services_dyndns_edit.php:154
+#: usr/local/www/services_rfc2136_edit.php:188
+#: usr/local/www/services_dyndns_edit.php:212
+#: usr/local/www/services_dyndns_edit.php:216
+#: usr/local/www/services_dyndns_edit.php:218
+#: usr/local/www/services_dyndns_edit.php:218
+#: usr/local/www/services_rfc2136_edit.php:188
+msgid "yes"
+msgstr "はい"
+
+#: usr/local/www/services_dyndns_edit.php:172
+#: usr/local/www/services_rfc2136_edit.php:134
+#: usr/local/www/services_dyndns_edit.php:230
+#: usr/local/www/services_dyndns_edit.php:234
+#: usr/local/www/services_dyndns_edit.php:236
+#: usr/local/www/services_dyndns_edit.php:236
+#: usr/local/www/services_rfc2136_edit.php:134
+msgid "Interface to monitor"
+msgstr "監視するためのインタフェース"
+
+#: usr/local/www/services_dyndns_edit.php:191
+#: usr/local/www/services_dyndns_edit.php:274
+#: usr/local/www/services_dyndns_edit.php:278
+#: usr/local/www/services_dyndns_edit.php:280
+#: usr/local/www/services_dyndns_edit.php:280
+msgid "Enter the complete host/domain name. example: myhost.dyndns.org"
+msgstr "完全なホスト/ドメイン名を入力します。例: myhost.dyndns.org"
+
+#: usr/local/www/services_dyndns_edit.php:192
+#: usr/local/www/services_dyndns_edit.php:275
+#: usr/local/www/services_dyndns_edit.php:279
+#: usr/local/www/services_dyndns_edit.php:281
+#: usr/local/www/services_dyndns_edit.php:281
+msgid "For he.net tunnelbroker, enter your tunnel ID"
+msgstr "he.netのtunnelbrokerは、お使いのトンネルIDを入力"
+
+#: usr/local/www/services_dyndns_edit.php:197
+#: usr/local/www/services_dyndns_edit.php:280
+#: usr/local/www/services_dyndns_edit.php:284
+#: usr/local/www/services_dyndns_edit.php:286
+#: usr/local/www/services_dyndns_edit.php:286
+msgid "MX"
+msgstr "MX"
+
+#: usr/local/www/services_dyndns_edit.php:201
+#: usr/local/www/services_dyndns_edit.php:284
+#: usr/local/www/services_dyndns_edit.php:288
+#: usr/local/www/services_dyndns_edit.php:290
+#: usr/local/www/services_dyndns_edit.php:290
+msgid ""
+"Note: With DynDNS service you can only use a hostname, not an IP address."
+msgstr ""注:ダイナミックDNSサービスを使用すると、ホスト名だけでなく、 IPアドレスを使用することができます。"
+
+#: usr/local/www/services_dyndns_edit.php:203
+#: usr/local/www/services_dyndns_edit.php:286
+#: usr/local/www/services_dyndns_edit.php:290
+#: usr/local/www/services_dyndns_edit.php:292
+#: usr/local/www/services_dyndns_edit.php:292
+msgid ""
+"Set this option only if you need a special MX record. Not all services "
+"support this."
+msgstr ""あなたは特別なMXレコードが必要な場合にのみ、このオプションを設定します。すべてのサービスがない」 、これをサポートしています。"
+
+#: usr/local/www/services_dyndns_edit.php:207
+#: usr/local/www/services_dyndns_edit.php:290
+#: usr/local/www/services_dyndns_edit.php:294
+#: usr/local/www/services_dyndns_edit.php:296
+#: usr/local/www/services_dyndns_edit.php:296
+msgid "Wildcards"
+msgstr "ワイルドカード"
+
+#: usr/local/www/services_dyndns_edit.php:210
+#: usr/local/www/services_dyndns_edit.php:293
+#: usr/local/www/services_dyndns_edit.php:297
+#: usr/local/www/services_dyndns_edit.php:299
+#: usr/local/www/services_dyndns_edit.php:305
+#: usr/local/www/services_dyndns_edit.php:299
+#: usr/local/www/services_dyndns_edit.php:305
+msgid "Enable "
+msgstr "有効にする"
+
+#: usr/local/www/services_dyndns_edit.php:210
+#: usr/local/www/services_dyndns_edit.php:293
+#: usr/local/www/services_dyndns_edit.php:297
+#: usr/local/www/services_dyndns_edit.php:299
+#: usr/local/www/services_dyndns_edit.php:299
+msgid "Wildcard"
+msgstr "ワイルドカード"
+
+#: usr/local/www/services_dyndns_edit.php:216
+msgid "Username is required for all types except Namecheap and FreeDNS."
+msgstr "ユーザ名はNamecheapとFreeDNSを除くすべてのタイプのために必要とされている。"
+
+#: usr/local/www/services_dyndns_edit.php:224
+#: usr/local/www/services_dyndns_edit.php:309
+#: usr/local/www/services_dyndns_edit.php:313
+#: usr/local/www/services_dyndns_edit.php:321
+#: usr/local/www/services_dyndns_edit.php:321
+msgid ""
+"FreeDNS (freedns.afraid.org): Enter your "Authentication Token" provided "
+"by FreeDNS."
+msgstr "「 FreeDNS ( freedns.afraid.org ) :あなたの入力してください "認証トークンはFreeDNSによって「提供」 。"
+
+#: usr/local/www/services_dyndns_edit.php:246
+#: usr/local/www/services_dyndns_edit.php:377
+#: usr/local/www/services_dyndns_edit.php:381
+#: usr/local/www/services_dyndns_edit.php:389
+#: usr/local/www/services_dyndns_edit.php:389
+#, php-format
+msgid ""
+"You must configure a DNS server in %sSystem:\n"
+" General setup%s or allow the DNS server list to be "
+"overridden\n"
+" by DHCP/PPP on WAN for dynamic DNS updates to work."
+msgstr ""あなたは%sSystemでDNSサーバーを設定する必要があります。 \n 「一般的setup%sまたはDNSサーバのリストが動的DNS更新が機能するために、WAN上のDHCP / PPPによる「 overridden\n 」であることを可能にする。"
+
+#: usr/local/www/services_igmpproxy.php:80
+#: usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/services_igmpproxy.php:80
+msgid "IGMP Proxy"
+msgstr "IGMPプロキシ"
+
+#: usr/local/www/services_igmpproxy.php:90
+#: usr/local/www/services_igmpproxy.php:90
+msgid "The IGMP entry list has been changed"
+msgstr "IGMPエントリリストが変更されました"
+
+#: usr/local/www/services_igmpproxy.php:103
+#: usr/local/www/services_igmpproxy.php:146
+#: usr/local/www/services_igmpproxy.php:103
+#: usr/local/www/services_igmpproxy.php:146
+msgid "add a new igmpentry"
+msgstr "新しいigmpentryを追加"
+
+#: usr/local/www/services_igmpproxy.php:133
+#: usr/local/www/services_igmpproxy.php:133
+msgid "edit igmpentry"
+msgstr "編集igmpentry"
+
+#: usr/local/www/services_igmpproxy.php:134
+#: usr/local/www/services_igmpproxy.php:134
+msgid ""
+"Do you really want to delete this igmpentry? All elements that still use it "
+"will become invalid (e.g. filter rules)!"
+msgstr "「本当にこのigmpentryを削除しますか?まだそれが使用するすべての要素が" (例えばフィルタルール)は無効になります!"
+
+#: usr/local/www/services_igmpproxy.php:134
+#: usr/local/www/services_igmpproxy.php:134
+msgid "delete igmpentry"
+msgstr "igmpentryを削除"
+
+#: usr/local/www/services_igmpproxy.php:161
+#: usr/local/www/services_igmpproxy.php:161
+msgid ""
+"Please add the interface for upstream, the allowed subnets, and the "
+"downstream interfaces you would like the proxy to allow. Only one 'upstream' "
+"interface can be configured."
+msgstr "「上流、許可されたサブネットのためのインタフェースを追加し、してください「ダウンストリームインターフェイスは、あなたができるように、プロキシをしたいと思います。一つだけ'上流」 「インタフェースが設定することができます。"
+
+#: usr/local/www/services_igmpproxy_edit.php:79
+#: usr/local/www/services_igmpproxy_edit.php:79
+msgid "Only one 'upstream' interface can be configured."
+msgstr "一つだけ'上流'インタフェースが設定することができます。"
+
+#: usr/local/www/services_igmpproxy_edit.php:158
+#: usr/local/www/services_igmpproxy_edit.php:160
+#: usr/local/www/services_igmpproxy_edit.php:160
+msgid "IGMP Proxy Edit"
+msgstr "IGMPプロキシ編集"
+
+#: usr/local/www/services_igmpproxy_edit.php:188
+#: usr/local/www/services_igmpproxy_edit.php:190
+#: usr/local/www/services_igmpproxy_edit.php:190
+msgid "Upstream Interface"
+msgstr "アップストリームインターフェイス"
+
+#: usr/local/www/services_igmpproxy_edit.php:189
+#: usr/local/www/services_igmpproxy_edit.php:191
+#: usr/local/www/services_igmpproxy_edit.php:191
+msgid "Downstream Interface"
+msgstr "ダウンストリームインターフェイス"
+
+#: usr/local/www/services_igmpproxy_edit.php:193
+#: usr/local/www/services_igmpproxy_edit.php:195
+#: usr/local/www/services_igmpproxy_edit.php:195
+msgid ""
+"The <b>upstream</b> network interface is the outgoing interface which is "
+"responsible for communicating to available multicast data sources. There can "
+"only be one upstream interface."
+msgstr "利用可能なマルチキャスト·データ·ソースとの通信を担当する「 u003cBu003e上流u003c / B u003eネットワークインタフェースがある発信インターフェイスである」 。 「オンリーワンアップストリームインターフェイスがある場合もあります。"
+
+#: usr/local/www/services_igmpproxy_edit.php:199
+#: usr/local/www/services_igmpproxy_edit.php:201
+#: usr/local/www/services_igmpproxy_edit.php:201
+msgid "Downstream"
+msgstr "下流"
+
+#: usr/local/www/services_igmpproxy_edit.php:199
+#: usr/local/www/services_igmpproxy_edit.php:201
+#: usr/local/www/services_igmpproxy_edit.php:201
+msgid ""
+"network interfaces are the distribution interfaces to the destination "
+"networks, where multicast clients can join groups and receive multicast "
+"data. One or more downstream interfaces must be configured."
+msgstr "マルチキャストクライアントがグループに参加し、マルチキャスト、「データ1つまたは複数のダウンストリームインターフェイスを構成する必要がありますを受け取ることができ、ネットワーク、 「ネットワーク·インタフェースは、目的地への配布インターフェイスです」 。"
+
+#: usr/local/www/services_igmpproxy_edit.php:206
+#: usr/local/www/services_igmpproxy_edit.php:208
+#: usr/local/www/services_igmpproxy_edit.php:208
+msgid "Threshold"
+msgstr "しきい値"
+
+#: usr/local/www/services_igmpproxy_edit.php:211
+#: usr/local/www/services_igmpproxy_edit.php:213
+#: usr/local/www/services_igmpproxy_edit.php:213
+msgid ""
+"Defines the TTL threshold for the network interface. Packets with a "
+"lower TTL than the threshold value will be ignored. This setting is "
+"optional, and by default the threshold is 1."
+msgstr "「ネットワーク·インタフェースのTTLしきい値を定義します。持つパケット」 threshols値よりも低いTTLは無視されます。この設定は、 「オプションで、デフォルトでは、しきい値は1です。"
+
+#: usr/local/www/services_igmpproxy_edit.php:218
+#: usr/local/www/services_igmpproxy_edit.php:220
+#: usr/local/www/services_igmpproxy_edit.php:220
+msgid "Network (s)"
+msgstr "ネットワーク(単数または複数)"
+
+#: usr/local/www/services_rfc2136.php:55 usr/local/www/services_rfc2136.php:55
+msgid "RFC 2136 clients"
+msgstr "RFC 2136のクライアント"
+
+#: usr/local/www/services_rfc2136.php:99
+#: usr/local/www/vpn_openvpn_client.php:894
+#: usr/local/www/vpn_openvpn_client.php:899
+#: usr/local/www/vpn_openvpn_client.php:952
+#: usr/local/www/services_rfc2136.php:118
+#: usr/local/www/vpn_openvpn_client.php:971
+#: usr/local/www/services_rfc2136.php:118
+#: usr/local/www/vpn_openvpn_client.php:971
+msgid "Do you really want to delete this client?"
+msgstr "あなたは本当に、このクライアントを削除しますか?"
+
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:153
+#: usr/local/www/services_dyndns_edit.php:348
+#: usr/local/www/services_dyndns_edit.php:352
+#: usr/local/www/services_dyndns_edit.php:360
+#: usr/local/www/services_dyndns_edit.php:360
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:153
+msgid "TTL"
+msgstr "TTL"
+
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:159
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:159
+msgid "Key name"
+msgstr "キー名"
+
+#: usr/local/www/services_rfc2136_edit.php:76
+#: usr/local/www/services_rfc2136_edit.php:76
+msgid "The DNS update host name contains invalid characters."
+msgstr "DNS更新のホスト名が無効な文字が含まれています。"
+
+#: usr/local/www/services_rfc2136_edit.php:78
+#: usr/local/www/services_rfc2136_edit.php:78
+msgid "The DNS update TTL must be an integer."
+msgstr "DNS更新TTLは整数でなければなりません。"
+
+#: usr/local/www/services_rfc2136_edit.php:80
+#: usr/local/www/services_rfc2136_edit.php:80
+msgid "The DNS update key name contains invalid characters."
+msgstr "DNS更新キー名に無効な文字が含まれています。"
+
+#: usr/local/www/services_rfc2136_edit.php:100
+#: usr/local/www/services_rfc2136_edit.php:100
+msgid "New/Edited RFC2136 dnsupdate entry was posted."
+msgstr "新規/編集RFC2136のdnsupdateエントリが投稿されました。"
+
+#: usr/local/www/services_rfc2136_edit.php:109
+#: usr/local/www/services_rfc2136_edit.php:123
+#: usr/local/www/services_rfc2136_edit.php:109
+#: usr/local/www/services_rfc2136_edit.php:123
+msgid "RFC 2136 client"
+msgstr "RFC 2136クライアント"
+
+#: usr/local/www/services_rfc2136_edit.php:163
+#: usr/local/www/services_rfc2136_edit.php:163
+msgid "This must match the setting on the DNS server."
+msgstr "これは、DNSサーバーの設定と一致する必要があります。"
+
+#: usr/local/www/services_rfc2136_edit.php:166
+#: usr/local/www/services_rfc2136_edit.php:166
+msgid "Key type"
+msgstr "キータイプ"
+
+#: usr/local/www/services_rfc2136_edit.php:168
+#: usr/local/www/services_captiveportal_zones.php:52
+#: usr/local/www/services_captiveportal_zones.php:53
+#: usr/local/www/services_captiveportal_zones.php:53
+#: usr/local/www/services_rfc2136_edit.php:168
+msgid "Zone"
+msgstr "ゾーン"
+
+#: usr/local/www/services_rfc2136_edit.php:170
+#: usr/local/www/services_rfc2136_edit.php:170
+msgid " User"
+msgstr "ユーザー"
+
+#: usr/local/www/services_rfc2136_edit.php:177
+#: usr/local/www/services_rfc2136_edit.php:177
+msgid "Paste an HMAC-MD5 key here."
+msgstr "ここにHMAC- MD5キーを貼り付けます。"
+
+#: usr/local/www/services_rfc2136_edit.php:189
+#: usr/local/www/services_rfc2136_edit.php:189
+msgid "Use TCP instead of UDP"
+msgstr "UDPではなくTCPを使用する"
+
+#: usr/local/www/services_rfc2136_edit.php:210
+#: usr/local/www/services_rfc2136_edit.php:210
+#, php-format
+msgid ""
+"You must configure a DNS server in %sSystem: General setup %sor allow the "
+"DNS server list to be overridden by DHCP/PPP on WAN for dynamic DNS updates "
+"to work."
+msgstr ""あなたは%sSystemにDNSサーバを設定する必要があります:一般的なセットアップ%sor許可」のDNSサーバリストを機能させるには、「ダイナミックDNS更新のために、WAN上のDHCP / PPPによって無効にされるように。"
+
+#: usr/local/www/status_captiveportal_test.php:82
+#: usr/local/www/status_captiveportal_test.php:83
+#: usr/local/www/status_captiveportal_expire.php:82
+#: usr/local/www/status_captiveportal_test.php:84
+#: usr/local/www/status_captiveportal_expire.php:82
+#: usr/local/www/status_captiveportal_test.php:84
+msgid "Voucher(s)"
+msgstr "バウチャー( S )"
+
+#: usr/local/www/status_captiveportal_test.php:86
+#: usr/local/www/status_captiveportal_test.php:87
+#: usr/local/www/status_captiveportal_test.php:88
+#: usr/local/www/status_captiveportal_test.php:88
+msgid ""
+"Enter multiple vouchers separated by space or newline. The remaining time, "
+"if valid, will be shown for each voucher"
+msgstr "「空白や改行で区切られた複数の伝票を入力してください。残り時間を、 「有効であれば、それぞれのクーポンのために表示されます"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:85
+#: usr/local/www/status_captiveportal_voucher_rolls.php:86
+#: usr/local/www/status_captiveportal_voucher_rolls.php:88
+#: usr/local/www/status_captiveportal_voucher_rolls.php:88
+msgid "Roll#"
+msgstr "ロール"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:87
+#: usr/local/www/status_captiveportal_voucher_rolls.php:88
+#: usr/local/www/status_captiveportal_voucher_rolls.php:90
+#: usr/local/www/status_captiveportal_voucher_rolls.php:90
+msgid "# of Tickets"
+msgstr ""
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:89
+#: usr/local/www/status_captiveportal_voucher_rolls.php:90
+#: usr/local/www/status_captiveportal_voucher_rolls.php:92
+#: usr/local/www/status_captiveportal_voucher_rolls.php:92
+msgid "used"
+msgstr "使用された"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:90
+#: usr/local/www/status_captiveportal_voucher_rolls.php:91
+#: usr/local/www/status_captiveportal_voucher_rolls.php:93
+#: usr/local/www/status_captiveportal_voucher_rolls.php:93
+msgid "active"
+msgstr "アクティブ"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:91
+#: usr/local/www/status_captiveportal_voucher_rolls.php:92
+#: usr/local/www/status_captiveportal_voucher_rolls.php:94
+#: usr/local/www/status_captiveportal_voucher_rolls.php:94
+msgid "ready"
+msgstr "レディー"
+
+#: usr/local/www/status_captiveportal_vouchers.php:115
+#: usr/local/www/status_captiveportal_vouchers.php:116
+#: usr/local/www/status_captiveportal_vouchers.php:121
+#: usr/local/www/status_captiveportal_vouchers.php:121
+msgid "Voucher"
+msgstr "バウチャー"
+
+#: usr/local/www/status_captiveportal_vouchers.php:117
+#: usr/local/www/status_captiveportal_vouchers.php:118
+#: usr/local/www/status_captiveportal_vouchers.php:123
+#: usr/local/www/status_captiveportal_vouchers.php:123
+msgid "Activated at"
+msgstr "で活性化"
+
+#: usr/local/www/status_captiveportal_vouchers.php:118
+#: usr/local/www/status_captiveportal_vouchers.php:119
+#: usr/local/www/status_captiveportal_vouchers.php:124
+#: usr/local/www/status_captiveportal_vouchers.php:124
+msgid "Expires in"
+msgstr "に失効"
+
+#: usr/local/www/status_captiveportal_vouchers.php:119
+#: usr/local/www/status_captiveportal_vouchers.php:120
+#: usr/local/www/status_captiveportal_vouchers.php:125
+#: usr/local/www/status_captiveportal_vouchers.php:125
+msgid "Expires at"
+msgstr "で有効期限が切れる"
+
+#: usr/local/www/status_captiveportal_vouchers.php:127
+#: usr/local/www/status_captiveportal_vouchers.php:128
+#: usr/local/www/status_captiveportal_vouchers.php:133
+#: usr/local/www/status_captiveportal_vouchers.php:133
+msgid "min"
+msgstr "分"
+
+#: usr/local/www/status_dhcp_leases.php:48
+#: usr/local/www/status_dhcp_leases.php:49
+#: usr/local/www/status_dhcp_leases.php:49
+msgid "DHCP leases"
+msgstr "DHCPリース"
+
+#: usr/local/www/status_dhcp_leases.php:287
+#: usr/local/www/status_dhcpv6_leases.php:328
+#: usr/local/www/status_dhcpv6_leases.php:372
+#: usr/local/www/status_dhcp_leases.php:308
+#: usr/local/www/status_dhcpv6_leases.php:373
+#: usr/local/www/status_dhcp_leases.php:310
+#: usr/local/www/status_dhcpv6_leases.php:376
+#: usr/local/www/status_dhcpv6_leases.php:376
+#: usr/local/www/status_dhcp_leases.php:310
+msgid "Failover Group"
+msgstr "フェイルオーバーグループ"
+
+#: usr/local/www/status_dhcp_leases.php:288
+#: usr/local/www/status_dhcpv6_leases.php:329
+#: usr/local/www/status_dhcpv6_leases.php:373
+#: usr/local/www/status_dhcp_leases.php:309
+#: usr/local/www/status_dhcpv6_leases.php:374
+#: usr/local/www/status_dhcp_leases.php:311
+#: usr/local/www/status_dhcpv6_leases.php:377
+#: usr/local/www/status_dhcpv6_leases.php:377
+#: usr/local/www/status_dhcp_leases.php:311
+msgid "My State"
+msgstr "私の状態"
+
+#: usr/local/www/status_dhcp_leases.php:289
+#: usr/local/www/status_dhcp_leases.php:291
+#: usr/local/www/status_dhcpv6_leases.php:330
+#: usr/local/www/status_dhcpv6_leases.php:332
+#: usr/local/www/status_dhcpv6_leases.php:374
+#: usr/local/www/status_dhcpv6_leases.php:376
+#: usr/local/www/status_dhcp_leases.php:310
+#: usr/local/www/status_dhcp_leases.php:312
+#: usr/local/www/status_dhcpv6_leases.php:375
+#: usr/local/www/status_dhcpv6_leases.php:377
+#: usr/local/www/status_dhcp_leases.php:314
+#: usr/local/www/status_dhcpv6_leases.php:378
+#: usr/local/www/status_dhcpv6_leases.php:380
+#: usr/local/www/status_dhcpv6_leases.php:378
+#: usr/local/www/status_dhcpv6_leases.php:380
+#: usr/local/www/status_dhcp_leases.php:312
+#: usr/local/www/status_dhcp_leases.php:314
+msgid "Since"
+msgstr "から"
+
+#: usr/local/www/status_dhcp_leases.php:290
+#: usr/local/www/status_dhcpv6_leases.php:331
+#: usr/local/www/status_dhcpv6_leases.php:375
+#: usr/local/www/status_dhcp_leases.php:311
+#: usr/local/www/status_dhcpv6_leases.php:376
+#: usr/local/www/status_dhcp_leases.php:313
+#: usr/local/www/status_dhcpv6_leases.php:379
+#: usr/local/www/status_dhcpv6_leases.php:379
+#: usr/local/www/status_dhcp_leases.php:313
+msgid "Peer State"
+msgstr "ピア状態"
+
+#: usr/local/www/status_dhcp_leases.php:322
+#: usr/local/www/status_dhcpv6_leases.php:364
+#: usr/local/www/status_dhcpv6_leases.php:408
+#: usr/local/www/status_dhcpv6_leases.php:485
+#: usr/local/www/status_dhcp_leases.php:343
+#: usr/local/www/status_dhcpv6_leases.php:409
+#: usr/local/www/status_dhcpv6_leases.php:486
+#: usr/local/www/status_dhcp_leases.php:345
+#: usr/local/www/status_dhcpv6_leases.php:412
+#: usr/local/www/status_dhcpv6_leases.php:489
+#: usr/local/www/status_dhcpv6_leases.php:412
+#: usr/local/www/status_dhcpv6_leases.php:489
+#: usr/local/www/status_dhcp_leases.php:345
+msgid "End"
+msgstr "終わり"
+
+#: usr/local/www/status_dhcp_leases.php:323
+#: usr/local/www/status_gateway_groups.php:132
+#: usr/local/www/status_gateways.php:127 usr/local/www/status_gateways.php:131
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:57
+#: usr/local/www/status_dhcpv6_leases.php:365
+#: usr/local/www/status_dhcpv6_leases.php:409
+#: usr/local/www/status_dhcp_leases.php:344
+#: usr/local/www/status_dhcpv6_leases.php:410
+#: usr/local/www/status_gateways.php:128 usr/local/www/status_gateways.php:132
+#: usr/local/www/status_dhcp_leases.php:346
+#: usr/local/www/status_gateway_groups.php:133
+#: usr/local/www/status_dhcpv6_leases.php:413
+#: usr/local/www/status_dhcpv6_leases.php:413
+#: usr/local/www/status_dhcp_leases.php:346
+#: usr/local/www/status_gateway_groups.php:133
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:57
+#: usr/local/www/status_gateways.php:128 usr/local/www/status_gateways.php:132
+msgid "Online"
+msgstr "オンライン"
+
+#: usr/local/www/status_dhcp_leases.php:324
+#: usr/local/www/status_dhcpv6_leases.php:366
+#: usr/local/www/status_dhcpv6_leases.php:410
+#: usr/local/www/status_dhcp_leases.php:345
+#: usr/local/www/status_dhcpv6_leases.php:411
+#: usr/local/www/status_dhcp_leases.php:347
+#: usr/local/www/status_dhcpv6_leases.php:414
+#: usr/local/www/status_dhcpv6_leases.php:414
+#: usr/local/www/status_dhcp_leases.php:347
+msgid "Lease Type"
+msgstr "リースの種類"
+
+#: usr/local/www/status_dhcp_leases.php:368
+#: usr/local/www/status_dhcp_leases.php:389
+#: usr/local/www/status_dhcp_leases.php:393
+#: usr/local/www/status_dhcp_leases.php:393
+msgid "send Wake on LAN packet to this MAC address"
+msgstr "このMACアドレスにWake on LANパケットを送信"
+
+#: usr/local/www/status_dhcp_leases.php:390
+#: usr/local/www/status_dhcpv6_leases.php:417
+#: usr/local/www/status_dhcpv6_leases.php:461
+#: usr/local/www/status_dhcp_leases.php:411
+#: usr/local/www/status_dhcpv6_leases.php:462
+#: usr/local/www/status_dhcp_leases.php:415
+#: usr/local/www/status_dhcpv6_leases.php:465
+#: usr/local/www/status_dhcpv6_leases.php:465
+#: usr/local/www/status_dhcp_leases.php:415
+msgid "add a static mapping for this MAC address"
+msgstr "このMACアドレスの静的マッピングを追加"
+
+#: usr/local/www/status_dhcp_leases.php:397
+#: usr/local/www/status_dhcp_leases.php:418
+#: usr/local/www/status_dhcp_leases.php:422
+#: usr/local/www/status_dhcp_leases.php:422
+msgid "add a Wake on LAN mapping for this MAC address"
+msgstr "このMACアドレス用のLANマッピングにコールを追加"
+
+#: usr/local/www/status_dhcp_leases.php:402
+#: usr/local/www/status_dhcpv6_leases.php:426
+#: usr/local/www/status_dhcpv6_leases.php:470
+#: usr/local/www/status_dhcp_leases.php:423
+#: usr/local/www/status_dhcpv6_leases.php:471
+#: usr/local/www/status_dhcp_leases.php:427
+#: usr/local/www/status_dhcpv6_leases.php:474
+#: usr/local/www/status_dhcpv6_leases.php:474
+#: usr/local/www/status_dhcp_leases.php:427
+msgid "delete this DHCP lease"
+msgstr "このDHCPリースを削除"
+
+#: usr/local/www/status_dhcp_leases.php:415
+#: usr/local/www/status_dhcpv6_leases.php:439
+#: usr/local/www/status_dhcpv6_leases.php:540
+#: usr/local/www/status_dhcp_leases.php:436
+#: usr/local/www/status_dhcpv6_leases.php:541
+#: usr/local/www/status_dhcp_leases.php:440
+#: usr/local/www/status_dhcpv6_leases.php:544
+#: usr/local/www/status_dhcpv6_leases.php:544
+#: usr/local/www/status_dhcp_leases.php:440
+msgid "Show active and static leases only"
+msgstr "アクティブおよびスタティックリースを表示するだけ"
+
+#: usr/local/www/status_dhcp_leases.php:418
+#: usr/local/www/status_dhcpv6_leases.php:442
+#: usr/local/www/status_dhcpv6_leases.php:543
+#: usr/local/www/status_dhcp_leases.php:439
+#: usr/local/www/status_dhcpv6_leases.php:544
+#: usr/local/www/status_dhcp_leases.php:443
+#: usr/local/www/status_dhcpv6_leases.php:547
+#: usr/local/www/status_dhcpv6_leases.php:547
+#: usr/local/www/status_dhcp_leases.php:443
+msgid "Show all configured leases"
+msgstr "設定されているすべてのリースを表示する"
+
+#: usr/local/www/status_dhcp_leases.php:422
+#: usr/local/www/status_dhcpv6_leases.php:446
+#: usr/local/www/status_dhcpv6_leases.php:547
+#: usr/local/www/status_dhcp_leases.php:443
+#: usr/local/www/status_dhcpv6_leases.php:548
+#: usr/local/www/status_dhcp_leases.php:447
+#: usr/local/www/status_dhcpv6_leases.php:551
+#: usr/local/www/status_dhcpv6_leases.php:551
+#: usr/local/www/status_dhcp_leases.php:447
+msgid "No leases file found. Is the DHCP server active"
+msgstr "リースファイルが見つかりませんでした。 DHCPサーバがアクティブになっている"
+
+#: usr/local/www/status_gateway_groups.php:100
+#: usr/local/www/status_gateway_groups.php:101
+#: usr/local/www/status_gateway_groups.php:101
+#, php-format
+msgid "Tier %s"
+msgstr "ティア%s"
+
+#: usr/local/www/status_gateway_groups.php:126
+#: usr/local/www/status_gateways.php:121 usr/local/www/status_gateways.php:122
+#: usr/local/www/status_gateway_groups.php:127
+#: usr/local/www/status_gateway_groups.php:127
+#: usr/local/www/status_gateways.php:122
+msgid "Warning, Packetloss"
+msgstr "警告、パケットロス"
+
+#: usr/local/www/status_gateway_groups.php:129
+#: usr/local/www/status_gateways.php:124 usr/local/www/status_gateways.php:125
+#: usr/local/www/status_gateway_groups.php:130
+#: usr/local/www/status_gateway_groups.php:130
+#: usr/local/www/status_gateways.php:125
+msgid "Warning, Latency"
+msgstr "警告、レイテンシー"
+
+#: usr/local/www/status_gateway_groups.php:135
+#: usr/local/www/status_gateways.php:100 usr/local/www/status_gateways.php:108
+#: usr/local/www/status_gateways.php:134
+#: usr/local/www/widgets/widgets/gateways.widget.php:69
+#: usr/local/www/widgets/widgets/gateways.widget.php:77
+#: usr/local/www/widgets/widgets/gateways.widget.php:98
+#: usr/local/www/status_gateway_groups.php:136
+#: usr/local/www/status_gateway_groups.php:136
+msgid "Gathering data"
+msgstr "データの収集"
+
+#: usr/local/www/status_gateways.php:75 usr/local/www/status_gateways.php:76
+#: usr/local/www/status_gateways.php:76
+msgid "RTT"
+msgstr "RTT"
+
+#: usr/local/www/status_gateways.php:76 usr/local/www/status_gateways.php:77
+#: usr/local/www/status_gateways.php:77
+msgid "Loss"
+msgstr "損失"
+
+#: usr/local/www/status_gateways.php:144
+#, php-format
+msgid "Last check %s"
+msgstr "最後のチェックの%s"
+
+#: usr/local/www/status_graph_cpu.php:41 usr/local/www/status_graph_cpu.php:41
+msgid "CPU load"
+msgstr "CPU負荷"
+
+#: usr/local/www/status_graph_cpu.php:46 usr/local/www/status_graph_cpu.php:46
+msgid "Status: CPU Graph"
+msgstr "ステータス: CPUのグラフ"
+
+#: usr/local/www/status_graph_cpu.php:53 usr/local/www/status_graph_cpu.php:53
+msgid "if you can't see the graph, you may have to install the"
+msgstr "グラフを見ることができない場合は、インストールする必要があります"
+
+#: usr/local/www/status_graph_cpu.php:53 usr/local/www/status_graph_cpu.php:53
+msgid "Adobe SVG viewer"
+msgstr "アドビSVGビューア"
+
+#: usr/local/www/status_lb_vs.php:78 usr/local/www/vpn_ipsec_phase2.php:427
+#: usr/local/www/vpn_ipsec_phase2.php:469
+#: usr/local/www/vpn_ipsec_phase2.php:475
+#: usr/local/www/vpn_ipsec_phase2.php:453
+#: usr/local/www/vpn_ipsec_phase2.php:495
+#: usr/local/www/vpn_ipsec_phase2.php:501
+#: usr/local/www/vpn_ipsec_phase2.php:519
+#: usr/local/www/vpn_ipsec_phase2.php:555
+#: usr/local/www/vpn_ipsec_phase2.php:597
+#: usr/local/www/vpn_ipsec_phase2.php:603
+#: usr/local/www/vpn_ipsec_phase2.php:541
+#: usr/local/www/vpn_ipsec_phase2.php:576
+#: usr/local/www/vpn_ipsec_phase2.php:618
+#: usr/local/www/vpn_ipsec_phase2.php:624 usr/local/www/status_lb_vs.php:78
+#: usr/local/www/vpn_ipsec_phase2.php:541
+#: usr/local/www/vpn_ipsec_phase2.php:576
+#: usr/local/www/vpn_ipsec_phase2.php:618
+#: usr/local/www/vpn_ipsec_phase2.php:624
+msgid "Address"
+msgstr "アドレス"
+
+#: usr/local/www/status_openvpn.php:145 usr/local/www/status_openvpn.php:146
+#: usr/local/www/status_openvpn.php:147 usr/local/www/status_openvpn.php:147
+msgid "Client connections"
+msgstr "クライアント接続"
+
+#: usr/local/www/status_openvpn.php:152 usr/local/www/system_camanager.php:534
+#: usr/local/www/system_certmanager.php:627
+#: usr/local/www/system_certmanager.php:730
+#: usr/local/www/vpn_openvpn_csc.php:673
+#: usr/local/www/system_certmanager.php:743
+#: usr/local/www/system_certmanager.php:896
+#: usr/local/www/system_camanager.php:535 usr/local/www/status_openvpn.php:153
+#: usr/local/www/vpn_openvpn_csc.php:672
+#: usr/local/www/system_camanager.php:559 usr/local/www/status_openvpn.php:214
+#: usr/local/www/system_certmanager.php:768
+#: usr/local/www/system_certmanager.php:938
+#: usr/local/www/status_openvpn.php:154 usr/local/www/status_openvpn.php:224
+#: usr/local/www/system_certmanager.php:769
+#: usr/local/www/system_certmanager.php:942
+#: usr/local/www/system_camanager.php:559 usr/local/www/status_openvpn.php:154
+#: usr/local/www/status_openvpn.php:224 usr/local/www/vpn_openvpn_csc.php:672
+#: usr/local/www/system_certmanager.php:769
+#: usr/local/www/system_certmanager.php:942
+msgid "Common Name"
+msgstr "コモンネーム"
+
+#: usr/local/www/status_openvpn.php:153 usr/local/www/status_openvpn.php:154
+#: usr/local/www/status_openvpn.php:215 usr/local/www/status_openvpn.php:155
+#: usr/local/www/status_openvpn.php:225 usr/local/www/status_openvpn.php:155
+#: usr/local/www/status_openvpn.php:225
+msgid "Real Address"
+msgstr "実アドレス"
+
+#: usr/local/www/status_openvpn.php:154 usr/local/www/status_openvpn.php:155
+#: usr/local/www/status_openvpn.php:156 usr/local/www/status_openvpn.php:156
+msgid "Virtual Address"
+msgstr "仮想アドレス"
+
+#: usr/local/www/status_openvpn.php:155 usr/local/www/status_openvpn.php:213
+#: usr/local/www/status_openvpn.php:264 usr/local/www/status_openvpn.php:156
+#: usr/local/www/status_openvpn.php:216 usr/local/www/status_openvpn.php:267
+#: usr/local/www/status_openvpn.php:315 usr/local/www/status_openvpn.php:157
+#: usr/local/www/status_openvpn.php:274 usr/local/www/status_openvpn.php:335
+#: usr/local/www/status_openvpn.php:157 usr/local/www/status_openvpn.php:274
+#: usr/local/www/status_openvpn.php:335
+msgid "Connected Since"
+msgstr "以来接続"
+
+#: usr/local/www/status_openvpn.php:156 usr/local/www/status_openvpn.php:216
+#: usr/local/www/status_openvpn.php:267 usr/local/www/status_openvpn.php:157
+#: usr/local/www/status_openvpn.php:219 usr/local/www/status_openvpn.php:270
+#: usr/local/www/status_openvpn.php:318 usr/local/www/status_openvpn.php:158
+#: usr/local/www/status_openvpn.php:277 usr/local/www/status_openvpn.php:338
+#: usr/local/www/status_openvpn.php:158 usr/local/www/status_openvpn.php:277
+#: usr/local/www/status_openvpn.php:338
+msgid "Bytes Sent"
+msgstr "送信されたバイト"
+
+#: usr/local/www/status_openvpn.php:157 usr/local/www/status_openvpn.php:217
+#: usr/local/www/status_openvpn.php:268 usr/local/www/status_openvpn.php:158
+#: usr/local/www/status_openvpn.php:220 usr/local/www/status_openvpn.php:271
+#: usr/local/www/status_openvpn.php:319 usr/local/www/status_openvpn.php:159
+#: usr/local/www/status_openvpn.php:159
+msgid "Bytes Received"
+msgstr "受信バイト"
+
+#: usr/local/www/status_openvpn.php:184 usr/local/www/status_openvpn.php:185
+#: usr/local/www/status_openvpn.php:186 usr/local/www/status_openvpn.php:186
+msgid "Kill client connection from"
+msgstr "からクライアント接続を強制終了"
+
+#: usr/local/www/status_openvpn.php:205 usr/local/www/status_openvpn.php:208
+#: usr/local/www/status_openvpn.php:256 usr/local/www/status_openvpn.php:266
+#: usr/local/www/status_openvpn.php:266
+msgid "Peer to Peer Server Instance Statistics"
+msgstr "サーバーインスタンス統計(ピアツーピア)"
+
+#: usr/local/www/status_openvpn.php:214 usr/local/www/status_openvpn.php:265
+#: usr/local/www/status_openvpn.php:217 usr/local/www/status_openvpn.php:268
+#: usr/local/www/status_openvpn.php:316 usr/local/www/status_openvpn.php:275
+#: usr/local/www/status_openvpn.php:336 usr/local/www/status_openvpn.php:275
+#: usr/local/www/status_openvpn.php:336
+msgid "Virtual Addr"
+msgstr "仮想アドレス"
+
+#: usr/local/www/status_openvpn.php:215 usr/local/www/status_openvpn.php:266
+#: usr/local/www/status_openvpn.php:218 usr/local/www/status_openvpn.php:269
+#: usr/local/www/status_openvpn.php:317 usr/local/www/status_openvpn.php:276
+#: usr/local/www/status_openvpn.php:337 usr/local/www/status_openvpn.php:276
+#: usr/local/www/status_openvpn.php:337
+msgid "Remote Host"
+msgstr "リモートホスト"
+
+#: usr/local/www/status_openvpn.php:256 usr/local/www/status_openvpn.php:259
+#: usr/local/www/status_openvpn.php:307 usr/local/www/status_openvpn.php:327
+#: usr/local/www/status_openvpn.php:327
+msgid "Client Instance Statistics"
+msgstr "クライアントインスタンス統計"
+
+#: usr/local/www/status_openvpn.php:304 usr/local/www/status_openvpn.php:307
+#: usr/local/www/status_openvpn.php:355
+msgid ""
+"You need to bind each OpenVPN client to enable its management daemon: use "
+"'Local port' setting in the OpenVPN client screen"
+msgstr ""あなたは、その管理デーモンを有効にするために、各OpenVPNクライアントをバインドする必要があります。使用"OpenVPNクライアント画面で設定「ローカルポート」を"
+
+#: usr/local/www/status_openvpn.php:308 usr/local/www/status_openvpn.php:311
+#: usr/local/www/status_openvpn.php:359 usr/local/www/status_openvpn.php:389
+#: usr/local/www/status_openvpn.php:389
+msgid "No OpenVPN instances defined"
+msgstr "定義されたのOpenVPNインスタンスません"
+
+#: usr/local/www/system_advanced_admin.php:87
+#: usr/local/www/system_advanced_admin.php:87
+msgid "You must specify a valid webConfigurator port number"
+msgstr "有効なwebConfiguratorポート番号を指定する必要があります。"
+
+#: usr/local/www/system_advanced_admin.php:91
+#: usr/local/www/system_advanced_admin.php:91
+msgid "Max Processes must be a number 1 or greater"
+msgstr "最大プロセスは数1以上でなければなりません"
+
+#: usr/local/www/system_advanced_admin.php:97
+#: usr/local/www/system_advanced_admin.php:97
+#, php-format
+msgid "Alternate hostname %s is not a valid hostname."
+msgstr "代替ホスト名%sは有効なホスト名ではありません。"
+
+#: usr/local/www/system_advanced_admin.php:102
+#: usr/local/www/services_dnsmasq.php:92
+#: usr/local/www/system_advanced_admin.php:102
+#: usr/local/www/services_dnsmasq.php:92
+msgid "You must specify a valid port number"
+msgstr "有効なポート番号を指定する必要があります"
+
+#: usr/local/www/system_advanced_admin.php:232
+#: usr/local/www/system_advanced_admin.php:232
+#, php-format
+msgid "One moment...redirecting to %s in 20 seconds."
+msgstr "一つの瞬間が··· 20秒で%sにリダイレクトする。"
+
+#: usr/local/www/system_advanced_admin.php:242
+#: usr/local/www/system_advanced_admin.php:242
+msgid "Advanced: Admin Access"
+msgstr "アドバンスト:管理アクセス"
+
+#: usr/local/www/system_advanced_admin.php:274
+#: usr/local/www/system_advanced_firewall.php:215
+#: usr/local/www/system_advanced_misc.php:206
+#: usr/local/www/system_advanced_network.php:182
+#: usr/local/www/system_advanced_notifications.php:151
+#: usr/local/www/system_advanced_sysctl.php:147
+#: usr/local/www/system_advanced_firewall.php:229
+#: usr/local/www/system_advanced_notifications.php:160
+#: usr/local/www/system_advanced_misc.php:232
+#: usr/local/www/system_advanced_misc.php:251
+#: usr/local/www/system_advanced_misc.php:255
+#: usr/local/www/system_advanced_firewall.php:258
+#: usr/local/www/system_advanced_misc.php:302
+#: usr/local/www/system_advanced_admin.php:274
+#: usr/local/www/system_advanced_misc.php:302
+#: usr/local/www/system_advanced_firewall.php:258
+#: usr/local/www/system_advanced_notifications.php:160
+#: usr/local/www/system_advanced_network.php:182
+#: usr/local/www/system_advanced_sysctl.php:147
+msgid "Admin Access"
+msgstr "管理者のアクセス"
+
+#: usr/local/www/system_advanced_admin.php:275
+#: usr/local/www/system_advanced_firewall.php:216
+#: usr/local/www/system_advanced_misc.php:207
+#: usr/local/www/system_advanced_network.php:183
+#: usr/local/www/system_advanced_notifications.php:152
+#: usr/local/www/system_advanced_sysctl.php:148
+#: usr/local/www/system_advanced_firewall.php:230
+#: usr/local/www/system_advanced_notifications.php:161
+#: usr/local/www/system_advanced_misc.php:233
+#: usr/local/www/system_advanced_misc.php:252
+#: usr/local/www/system_advanced_misc.php:256
+#: usr/local/www/system_advanced_firewall.php:259
+#: usr/local/www/system_advanced_misc.php:303
+#: usr/local/www/system_advanced_admin.php:275
+#: usr/local/www/system_advanced_misc.php:303
+#: usr/local/www/system_advanced_firewall.php:259
+#: usr/local/www/system_advanced_notifications.php:161
+#: usr/local/www/system_advanced_network.php:183
+#: usr/local/www/system_advanced_sysctl.php:148
+msgid "Firewall / NAT"
+msgstr "ファイアウォール/ NAT"
+
+#: usr/local/www/system_advanced_admin.php:276
+#: usr/local/www/system_advanced_firewall.php:217
+#: usr/local/www/system_advanced_misc.php:208
+#: usr/local/www/system_advanced_network.php:184
+#: usr/local/www/system_advanced_notifications.php:153
+#: usr/local/www/system_advanced_sysctl.php:149
+#: usr/local/www/system_advanced_firewall.php:231
+#: usr/local/www/system_advanced_notifications.php:162
+#: usr/local/www/system_advanced_misc.php:234
+#: usr/local/www/system_advanced_misc.php:253
+#: usr/local/www/system_advanced_misc.php:257
+#: usr/local/www/system_advanced_firewall.php:260
+#: usr/local/www/system_advanced_misc.php:304
+#: usr/local/www/system_advanced_admin.php:276
+#: usr/local/www/system_advanced_misc.php:304
+#: usr/local/www/system_advanced_firewall.php:260
+#: usr/local/www/system_advanced_notifications.php:162
+#: usr/local/www/system_advanced_network.php:184
+#: usr/local/www/system_advanced_sysctl.php:149
+msgid "Networking"
+msgstr "ネットワーキング"
+
+#: usr/local/www/system_advanced_admin.php:277
+#: usr/local/www/system_advanced_firewall.php:218
+#: usr/local/www/system_advanced_misc.php:209
+#: usr/local/www/system_advanced_network.php:185
+#: usr/local/www/system_advanced_notifications.php:154
+#: usr/local/www/system_advanced_sysctl.php:150
+#: usr/local/www/system_advanced_firewall.php:232
+#: usr/local/www/system_advanced_notifications.php:163
+#: usr/local/www/system_advanced_misc.php:235
+#: usr/local/www/system_advanced_misc.php:254
+#: usr/local/www/system_advanced_misc.php:258
+#: usr/local/www/system_advanced_firewall.php:261
+#: usr/local/www/system_advanced_misc.php:305
+#: usr/local/www/system_advanced_admin.php:277
+#: usr/local/www/system_advanced_misc.php:305
+#: usr/local/www/system_advanced_firewall.php:261
+#: usr/local/www/system_advanced_notifications.php:163
+#: usr/local/www/system_advanced_network.php:185
+#: usr/local/www/system_advanced_sysctl.php:150
+msgid "Miscellaneous"
+msgstr "雑多"
+
+#: usr/local/www/system_advanced_admin.php:278
+#: usr/local/www/system_advanced_firewall.php:219
+#: usr/local/www/system_advanced_misc.php:210
+#: usr/local/www/system_advanced_network.php:186
+#: usr/local/www/system_advanced_notifications.php:155
+#: usr/local/www/system_advanced_sysctl.php:151
+#: usr/local/www/system_advanced_firewall.php:233
+#: usr/local/www/system_advanced_notifications.php:164
+#: usr/local/www/system_advanced_misc.php:236
+#: usr/local/www/system_advanced_misc.php:255
+#: usr/local/www/system_advanced_misc.php:259
+#: usr/local/www/system_advanced_firewall.php:262
+#: usr/local/www/system_advanced_misc.php:306
+#: usr/local/www/system_advanced_admin.php:278
+#: usr/local/www/system_advanced_misc.php:306
+#: usr/local/www/system_advanced_firewall.php:262
+#: usr/local/www/system_advanced_notifications.php:164
+#: usr/local/www/system_advanced_network.php:186
+#: usr/local/www/system_advanced_sysctl.php:151
+msgid "System Tunables"
+msgstr "システムのチューニング可能パラメータ"
+
+#: usr/local/www/system_advanced_admin.php:279
+#: usr/local/www/system_advanced_firewall.php:220
+#: usr/local/www/system_advanced_misc.php:211
+#: usr/local/www/system_advanced_network.php:187
+#: usr/local/www/system_advanced_notifications.php:156
+#: usr/local/www/system_advanced_sysctl.php:152
+#: usr/local/www/system_advanced_firewall.php:234
+#: usr/local/www/system_advanced_notifications.php:165
+#: usr/local/www/system_advanced_misc.php:237
+#: usr/local/www/system_advanced_misc.php:256
+#: usr/local/www/system_advanced_misc.php:260
+#: usr/local/www/system_advanced_firewall.php:263
+#: usr/local/www/system_advanced_misc.php:307
+#: usr/local/www/system_advanced_admin.php:279
+#: usr/local/www/system_advanced_misc.php:307
+#: usr/local/www/system_advanced_firewall.php:263
+#: usr/local/www/system_advanced_notifications.php:165
+#: usr/local/www/system_advanced_network.php:187
+#: usr/local/www/system_advanced_sysctl.php:152
+msgid "Notifications"
+msgstr "お知らせメール"
+
+#: usr/local/www/system_advanced_admin.php:297
+#: usr/local/www/system_advanced_admin.php:297
+msgid "webConfigurator"
+msgstr "webConfigurator"
+
+#: usr/local/www/system_advanced_admin.php:317
+#: usr/local/www/system_advanced_admin.php:317
+msgid "No Certificates have been defined. You must"
+msgstr "なし証明書は、定義されていません。作業を行う必要があります"
+
+#: usr/local/www/system_advanced_admin.php:318
+#: usr/local/www/system_advanced_admin.php:318
+msgid "Create or Import"
+msgstr "作成またはインポート"
+
+#: usr/local/www/system_advanced_admin.php:319
+#: usr/local/www/system_advanced_admin.php:319
+msgid "a Certificate before SSL can be enabled."
+msgstr "SSL前に証明書を有効にすることができます。"
+
+#: usr/local/www/system_advanced_admin.php:324
+#: usr/local/www/services_captiveportal.php:872
+#: usr/local/www/services_captiveportal.php:874
+#: usr/local/www/services_captiveportal.php:890
+#: usr/local/www/system_advanced_admin.php:324
+#: usr/local/www/services_captiveportal.php:890
+msgid "SSL Certificate"
+msgstr "SSL証明書"
+
+#: usr/local/www/system_advanced_admin.php:339
+#: usr/local/www/system_advanced_admin.php:339
+msgid "TCP port"
+msgstr "TCPポート"
+
+#: usr/local/www/system_advanced_admin.php:344
+#: usr/local/www/system_advanced_admin.php:344
+msgid ""
+"Enter a custom port number for the webConfigurator above if you want to "
+"override the default (80 for HTTP, 443 for HTTPS). Changes will take effect "
+"immediately after save."
+msgstr "( 、 HTTPにHTTPSの443を80に)デフォルトを上書き"あなたがしたい場合は、上記のwebConfigurator用のカスタムポート番号を入力してください」 。変更は後に保存、すぐに「有効になります。"
+
+#: usr/local/www/system_advanced_admin.php:351
+#: usr/local/www/system_advanced_admin.php:351
+msgid "Max Processes"
+msgstr "最大プロセス"
+
+#: usr/local/www/system_advanced_admin.php:356
+#: usr/local/www/system_advanced_admin.php:356
+msgid ""
+"Enter the number of webConfigurator processes you want to run. This defaults "
+"to 2. Increasing this will allow more users/browsers to access the GUI "
+"concurrently."
+msgstr "2に「あなたはこのデフォルトを実行したいwebConfiguratorプロセスの数を入力してください」 。これを大きくすると、より多くのユーザー/ブラウザが同時にGUI 」にアクセスできるようになります。"
+
+#: usr/local/www/system_advanced_admin.php:363
+#: usr/local/www/system_advanced_admin.php:363
+msgid "WebGUI redirect"
+msgstr "WebGUIのリダイレクト"
+
+#: usr/local/www/system_advanced_admin.php:366
+#: usr/local/www/system_advanced_admin.php:366
+msgid "Disable webConfigurator redirect rule"
+msgstr "webConfiguratorのリダイレクトルールを無効にする"
+
+#: usr/local/www/system_advanced_admin.php:368
+#: usr/local/www/system_advanced_admin.php:368
+msgid ""
+"When this is unchecked, access to the webConfigurator is always permitted "
+"even on port 80, regardless of the listening port configured. Check this box "
+"to disable this automatically added redirect rule. "
+msgstr "設定に関係なくリスニングポートの、でも、ポート80上で「これをオフにすると、 webConfiguratorへのアクセスは常に許可されている」 。この自動的に追加されたリダイレクトルールを無効にするには、このボックス」を確認します。"
+
+#: usr/local/www/system_advanced_admin.php:375
+#: usr/local/www/system_advanced_admin.php:375
+msgid "WebGUI Login Autocomplete"
+msgstr "WebGUIのログインオートコンプリート"
+
+#: usr/local/www/system_advanced_admin.php:378
+#: usr/local/www/system_advanced_admin.php:378
+msgid "Disable webConfigurator login autocomplete"
+msgstr "webConfiguratorログインオートコンプリートを無効にする"
+
+#: usr/local/www/system_advanced_admin.php:380
+#: usr/local/www/system_advanced_admin.php:380
+msgid ""
+"When this is unchecked, login credentials for the webConfigurator may be "
+"saved by the browser. While convenient, some security standards require this "
+"to be disabled. Check this box to disable autocomplete on the login form so "
+"that browsers will not prompt to save credentials (NOTE: Some browsers do "
+"not respect this option). "
+msgstr "「これをオフにすると、 webConfiguratorのログイン認証情報とすることができる「ブラウザによって保存された。便利な一方で、いくつかのセキュリティ標準は「無効にするログインフォームに自動補完を無効にするには、このチェックボックスをオンにしますので、 "これを必要とするブラウザが認証情報保存するよう求められないこと(注:一部のブラウザでは、 "このオプションを尊重しないでください) ​​。"
+
+#: usr/local/www/system_advanced_admin.php:387
+#: usr/local/www/system_advanced_admin.php:387
+msgid "WebGUI login messages"
+msgstr "WebGUIのログインメッセージ"
+
+#: usr/local/www/system_advanced_admin.php:390
+#: usr/local/www/system_advanced_admin.php:390
+msgid "Disable logging of webConfigurator successful logins"
+msgstr "webConfigurator成功したログインのログを無効にする"
+
+#: usr/local/www/system_advanced_admin.php:392
+#: usr/local/www/system_advanced_admin.php:392
+msgid ""
+"When this is checked, successful logins to the webConfigurator will not be "
+"logged."
+msgstr "「これをチェックすると、 webConfiguratorに成功したログインができません」ログイン。"
+
+#: usr/local/www/system_advanced_admin.php:398
+#: usr/local/www/system_advanced_admin.php:398
+msgid "Anti-lockout"
+msgstr "アンチロックアウト"
+
+#: usr/local/www/system_advanced_admin.php:407
+#: usr/local/www/system_advanced_admin.php:407
+msgid "Disable webConfigurator anti-lockout rule"
+msgstr "webConfiguratorアンチロックアウトルールを無効に"
+
+#: usr/local/www/system_advanced_admin.php:409
+#: usr/local/www/system_advanced_admin.php:409
+#, php-format
+msgid ""
+"When this is unchecked, access to the webConfigurator on the %s interface is "
+"always permitted, regardless of the user-defined firewall rule set. Check "
+"this box to disable this automatically added rule, so access to the "
+"webConfigurator is controlled by the user-defined firewall rules (ensure you "
+"have a firewall rule in place that allows you in, or you will lock yourself "
+"out!)"
+msgstr "「これをオフにすると、 %sインターフェイス上webConfiguratorへのアクセスがされている」に関係なく、常に設定され、ユーザ定義のファイアウォールルールを、許可した。チェック「この本が自動的に追加ルールを無効にするボックスなので、へのアクセスを「 webConfiguratorは(あなたが "あなたの中で可能にする場所にファイアウォールルールを持っている、またはあなた自身をロックします」を確認し外のユーザー定義ファイアウォールルールによって制御されます ! )"
+
+#: usr/local/www/system_advanced_admin.php:415
+#: usr/local/www/system_advanced_admin.php:415
+msgid ""
+"Hint: the &quot;Set interface(s) IP address&quot; option in the console menu "
+"resets this setting as well."
+msgstr "「ヒント: 」を設定し、インターフェイス(S )のIPアドレス「コンソールメニューのオプションは、 "だけでなく、この設定をリセットします。"
+
+#: usr/local/www/system_advanced_admin.php:419
+#: usr/local/www/system_advanced_admin.php:419
+msgid "DNS Rebind Check"
+msgstr "DNSの再バインドを確認"
+
+#: usr/local/www/system_advanced_admin.php:422
+#: usr/local/www/system_advanced_admin.php:422
+msgid "Disable DNS Rebinding Checks"
+msgstr "DNSリバインディングチェックを無効に"
+
+#: usr/local/www/system_advanced_admin.php:424
+#: usr/local/www/system_advanced_admin.php:424
+msgid ""
+"When this is unchecked, your system is protected against <a href="http://en."
+"wikipedia.org/wiki/DNS_rebinding">DNS Rebinding attacks</a>. This blocks "
+"private IP responses from your configured DNS servers. Check this box to "
+"disable this protection if it interferes with webConfigurator access or name "
+"resolution in your environment. "
+msgstr "「これをオフにすると、お使いのシステムは、もし、 href="http://en."wikipedia.org/wiki/DNS_rebinding"u003e DNSの再バインド攻撃u003c / au003eで保護されています。このブロックは、それがあなたの環境でwebConfiguratorアクセスまたは名前「解像度と干渉する場合は、この保護を無効にする"あなたの設定されたDNSサーバからプライベートIP応答が。するには、このボックスをチェックしてください」 。"
+
+#: usr/local/www/system_advanced_admin.php:431
+#: usr/local/www/system_advanced_admin.php:431
+msgid "Alternate Hostnames"
+msgstr "代替ホスト名"
+
+#: usr/local/www/system_advanced_admin.php:435
+#: usr/local/www/system_advanced_admin.php:435
+msgid "Alternate Hostnames for DNS Rebinding and HTTP_REFERER Checks"
+msgstr "DNSリバインディングとHTTP_REFERERチェックのための代替ホスト名"
+
+#: usr/local/www/system_advanced_admin.php:437
+#: usr/local/www/system_advanced_admin.php:437
+msgid ""
+"Here you can specify alternate hostnames by which the router may be queried, "
+"to bypass the DNS Rebinding Attack checks. Separate hostnames with spaces."
+msgstr "DNSの再バインド攻撃チェックを回避するために"ここでは、ルータが照会されるかもしれない別のホスト名を指定することができます」 。スペースで区切りのホスト名。"
+
+#: usr/local/www/system_advanced_admin.php:442
+#: usr/local/www/system_advanced_admin.php:442
+msgid "Browser HTTP_REFERER enforcement"
+msgstr "ブラウザのHTTP_REFERERの施行"
+
+#: usr/local/www/system_advanced_admin.php:445
+#: usr/local/www/system_advanced_admin.php:445
+msgid "Disable HTTP_REFERER enforcement check"
+msgstr "HTTP_REFERER執行のチェックを無効にする"
+
+#: usr/local/www/system_advanced_admin.php:447
+msgid ""
+"When this is unchecked, access to the webConfigurator is protected against "
+"HTTP_REFERER redirection attempts. Check this box to disable this protection "
+"if you find that it interferes with webConfigurator access in certain corner "
+"cases such as using external scripts to interact with this system. More "
+"information on HTTP_REFERER is available from <a target='_new' href='http://"
+"en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."
+msgstr "HTTP_REFERERリダイレクトしようと「これをオフにすると、 webConfiguratorへのアクセスがから保護されています」 。このような、このシステムと対話する外部スクリプトを使用するなどのケース"あなたはそれが特定の隅にwebConfiguratorアクセスを妨害することを発見した場合、「この保護を無効にするには、このチェックボックスをオンにします。 HTTP_REFERERの詳細」の情報は、 u003ca target='_new' href='http://"en.wikipedia.org/wiki/HTTP_referrer'u003eウィキペディアu003c/ A u003eから入手できます。"
+
+#: usr/local/www/system_advanced_admin.php:457
+#: usr/local/www/system_advanced_admin.php:457
+msgid "Secure Shell"
+msgstr "セキュアシェル"
+
+#: usr/local/www/system_advanced_admin.php:460
+#: usr/local/www/system_advanced_admin.php:460
+msgid "Secure Shell Server"
+msgstr "セキュアシェルサーバー"
+
+#: usr/local/www/system_advanced_admin.php:463
+#: usr/local/www/system_advanced_admin.php:463
+msgid "Enable Secure Shell"
+msgstr "セキュアシェルを有効にする"
+
+#: usr/local/www/system_advanced_admin.php:467
+#: usr/local/www/system_advanced_admin.php:467
+msgid "Authentication Method"
+msgstr "認証方法"
+
+#: usr/local/www/system_advanced_admin.php:470
+msgid "Disable password login for Secure Shell (RSA key only)"
+msgstr "セキュアシェルのパスワードログインを無効にする( RSA鍵のみ)"
+
+#: usr/local/www/system_advanced_admin.php:472
+#: usr/local/www/system_advanced_admin.php:472
+msgid "When enabled, authorized keys need to be configured for each"
+msgstr "有効にすると、認証済みのキーは、それぞれのために設定される必要がある"
+
+#: usr/local/www/system_advanced_admin.php:473
+#: usr/local/www/system_advanced_admin.php:473
+msgid "user"
+msgstr "ユーザー"
+
+#: usr/local/www/system_advanced_admin.php:474
+#: usr/local/www/system_advanced_admin.php:474
+msgid "that has been granted secure shell access."
+msgstr "つまり、セキュアシェルアクセスを許可されています。"
+
+#: usr/local/www/system_advanced_admin.php:478
+#: usr/local/www/system_advanced_admin.php:478
+msgid "SSH port"
+msgstr "SSHポート"
+
+#: usr/local/www/system_advanced_admin.php:482
+#: usr/local/www/system_advanced_admin.php:482
+msgid "Note: Leave this blank for the default of 22."
+msgstr "注: 22のデフォルトは、この空白のままにします。"
+
+#: usr/local/www/system_advanced_admin.php:489
+#: usr/local/www/system_advanced_admin.php:489
+msgid "Serial Communcations"
+msgstr "シリアルCommuncations"
+
+#: usr/local/www/system_advanced_admin.php:493
+#: usr/local/www/system_advanced_admin.php:493
+msgid "Serial Terminal"
+msgstr "シリアル端末"
+
+#: usr/local/www/system_advanced_admin.php:496
+#: usr/local/www/system_advanced_admin.php:496
+msgid ""
+"Enables the first serial port with 9600/8/N/1 by default, or another speed "
+"selectable below."
+msgstr "以下の選択可能な「デフォルトで9600/8/N/1で最初のシリアルポート、または別の速度を可能にします」 。"
+
+#: usr/local/www/system_advanced_admin.php:497
+#: usr/local/www/system_advanced_admin.php:497
+msgid ""
+"Note: This will redirect the console output and messages to the serial "
+"port. You can still access the console menu from the internal video card/"
+"keyboard. A <b>null modem</b> serial cable or adapter is required to use the "
+"serial console."
+msgstr ""注:これは、シリアルコンソール出力やメッセージをリダイレクトします」ポート。あなたはまだ、内部ビデオカード/からコンソールメニューにアクセスすることができる「キーボード。 A u003cBu003eヌルモデムu003c / B u003eシリアルケーブルやアダプタが使用するために必要です"シリアルコンソールを。"
+
+#: usr/local/www/system_advanced_admin.php:502
+#: usr/local/www/system_advanced_admin.php:502
+msgid "Serial Speed"
+msgstr "シリアルポートの速度"
+
+#: usr/local/www/system_advanced_admin.php:512
+#: usr/local/www/system_advanced_admin.php:512
+msgid "Allows selection of different speeds for the serial console port."
+msgstr "シリアルコンソールポート、異なる速度の選択ができます。"
+
+#: usr/local/www/system_advanced_admin.php:519
+#: usr/local/www/system_advanced_admin.php:519
+msgid "Console Options"
+msgstr "コンソールオプション"
+
+#: usr/local/www/system_advanced_admin.php:522
+#: usr/local/www/system_advanced_admin.php:522
+msgid "Console menu"
+msgstr "[コンソール]メニュー"
+
+#: usr/local/www/system_advanced_admin.php:525
+#: usr/local/www/system_advanced_admin.php:525
+msgid "Password protect the console menu"
+msgstr "パスワードは、コンソールメニューを保護"
+
+#: usr/local/www/system_advanced_admin.php:527
+#: usr/local/www/system_advanced_admin.php:527
+msgid "Changes to this option will take effect after a reboot."
+msgstr "このオプションへの変更は、再起動後に有効になります。"
+
+#: usr/local/www/system_advanced_admin.php:564
+#: usr/local/www/system_advanced_admin.php:564
+msgid "secure shell configuration has changed. Stopping sshd."
+msgstr "セキュアシェルの構成が変更されました。 sshdを停止。"
+
+#: usr/local/www/system_advanced_admin.php:567
+#: usr/local/www/system_advanced_admin.php:567
+msgid "secure shell configuration has changed. Restarting sshd."
+msgstr "セキュアシェルの構成が変更されました。 sshdを再起動。"
+
+#: usr/local/www/system_advanced_admin.php:574
+#: usr/local/www/system_advanced_admin.php:574
+msgid "webConfigurator configuration has changed. Restarting webConfigurator."
+msgstr "webConfigurator構成が変更されました。 webConfiguratorを再起動する。"
+
+#: usr/local/www/system_advanced_firewall.php:78
+#: usr/local/www/system_advanced_firewall.php:77
+#: usr/local/www/system_advanced_firewall.php:88
+#: usr/local/www/system_advanced_firewall.php:88
+msgid "The Firewall Maximum States value must be an integer."
+msgstr "ファイアウォールの最大状態の値は整数でなければなりません。"
+
+#: usr/local/www/system_advanced_firewall.php:81
+#: usr/local/www/system_advanced_firewall.php:83
+#: usr/local/www/system_advanced_firewall.php:94
+#: usr/local/www/system_advanced_firewall.php:94
+msgid "The Firewall Maximum Table Entries value must be an integer."
+msgstr "ファイアウォールの最大テーブルエントリの値は整数でなければなりません。"
+
+#: usr/local/www/system_advanced_firewall.php:84
+#: usr/local/www/system_advanced_firewall.php:86
+#: usr/local/www/system_advanced_firewall.php:97
+#: usr/local/www/system_advanced_firewall.php:97
+msgid "The TCP idle timeout must be an integer."
+msgstr "TCPアイドルタイムアウトは整数でなければなりません。"
+
+#: usr/local/www/system_advanced_firewall.php:87
+#: usr/local/www/system_advanced_firewall.php:89
+#: usr/local/www/system_advanced_firewall.php:100
+#: usr/local/www/system_advanced_firewall.php:100
+msgid "The Reflection timeout must be an integer."
+msgstr "リフレクションタイムアウトは整数でなければなりません。"
+
+#: usr/local/www/system_advanced_firewall.php:178
+#: usr/local/www/system_advanced_firewall.php:192
+#: usr/local/www/system_advanced_firewall.php:221
+#: usr/local/www/system_advanced_firewall.php:221
+msgid "Advanced: Firewall and NAT"
+msgstr "アドバンスト:ファイアウォールとNAT"
+
+#: usr/local/www/system_advanced_firewall.php:190
+#: usr/local/www/system_advanced_firewall.php:204
+#: usr/local/www/system_advanced_firewall.php:233
+#: usr/local/www/system_advanced_firewall.php:233
+msgid "as the name says, it's the normal optimization algorithm"
+msgstr "名前が言うように、それは通常の最適化アルゴリズムです"
+
+#: usr/local/www/system_advanced_firewall.php:191
+#: usr/local/www/system_advanced_firewall.php:205
+#: usr/local/www/system_advanced_firewall.php:234
+#: usr/local/www/system_advanced_firewall.php:234
+msgid ""
+"used for high latency links, such as satellite links. Expires idle "
+"connections later than default"
+msgstr "後でデフォルト以外の接続」とは、衛星リンクなどの高遅延リンクのために使用される。アイドルのExpires 」"
+
+#: usr/local/www/system_advanced_firewall.php:192
+#: usr/local/www/system_advanced_firewall.php:206
+msgid ""
+"expires idle connections quicker. More efficient use of CPU and memory but "
+"can drop legitimate connections"
+msgstr "「迅速アイドル状態の接続を期限切れにします。 CPUとメモリが、より効率的に使用」とは、正当な接続をドロップすることができます"
+
+#: usr/local/www/system_advanced_firewall.php:193
+#: usr/local/www/system_advanced_firewall.php:207
+msgid ""
+"tries to avoid dropping any legitimate connections at the expense of "
+"increased memory usage and CPU utilization."
+msgstr "メモリ使用量の増加やCPU使用率」を犠牲にして正当な接続を落とさないようにしようとします」 。"
+
+#: usr/local/www/system_advanced_firewall.php:239
+#: usr/local/www/system_advanced_firewall.php:253
+#: usr/local/www/system_advanced_firewall.php:282
+#: usr/local/www/system_advanced_firewall.php:281
+#: usr/local/www/system_advanced_firewall.php:281
+msgid "Firewall Advanced"
+msgstr "ファイアウォールアドバンス"
+
+#: usr/local/www/system_advanced_firewall.php:242
+#: usr/local/www/system_advanced_firewall.php:256
+#: usr/local/www/system_advanced_firewall.php:285
+#: usr/local/www/system_advanced_firewall.php:284
+#: usr/local/www/system_advanced_firewall.php:284
+msgid "IP Do-Not-Fragment compatibility"
+msgstr "IPドゥ-NOT-フラグメントの互換性"
+
+#: usr/local/www/system_advanced_firewall.php:245
+#: usr/local/www/system_advanced_firewall.php:259
+#: usr/local/www/system_advanced_firewall.php:288
+#: usr/local/www/system_advanced_firewall.php:287
+#: usr/local/www/system_advanced_firewall.php:287
+msgid "Clear invalid DF bits instead of dropping the packets"
+msgstr "代わりに、パケットをドロップする明確な無効のDFビット"
+
+#: usr/local/www/system_advanced_firewall.php:246
+#: usr/local/www/system_advanced_firewall.php:260
+#: usr/local/www/system_advanced_firewall.php:289
+#: usr/local/www/system_advanced_firewall.php:288
+#: usr/local/www/system_advanced_firewall.php:288
+msgid ""
+"This allows for communications with hosts that generate fragmented packets "
+"with the don't fragment (DF) bit set. Linux NFS is known to do this. This "
+"will cause the filter to not drop such packets but instead clear the don't "
+"fragment bit."
+msgstr "断片化しない( DF )で「これは断片化されたパケットを生成したホストとの通信を可能にし、「設定ビット。 LinuxのNFSは、この操作を行うことが知られている。これは、 "フィルタは、このようなパケットをドロップしないようになりますが、代わりに明確なインクルードしておりませ「フラグメントビット。"
+
+#: usr/local/www/system_advanced_firewall.php:253
+#: usr/local/www/system_advanced_firewall.php:267
+#: usr/local/www/system_advanced_firewall.php:296
+#: usr/local/www/system_advanced_firewall.php:295
+#: usr/local/www/system_advanced_firewall.php:295
+msgid "IP Random id generation"
+msgstr "IPランダムIDの生成"
+
+#: usr/local/www/system_advanced_firewall.php:256
+#: usr/local/www/system_advanced_firewall.php:270
+#: usr/local/www/system_advanced_firewall.php:299
+#: usr/local/www/system_advanced_firewall.php:298
+#: usr/local/www/system_advanced_firewall.php:298
+msgid ""
+"Insert a stronger id into IP header of packets passing through the filter."
+msgstr "「フィルターを通過するパケットのIPヘッダに強いIDを挿入します。"
+
+#: usr/local/www/system_advanced_firewall.php:257
+#: usr/local/www/system_advanced_firewall.php:271
+#: usr/local/www/system_advanced_firewall.php:300
+#: usr/local/www/system_advanced_firewall.php:299
+#: usr/local/www/system_advanced_firewall.php:299
+msgid ""
+"Replaces the IP identification field of packets with random values to "
+"compensate for operating systems that use predictable values. This option "
+"only applies to packets that are not fragmented after the optional packet "
+"reassembly."
+msgstr "予測可能な値を使用するオペレーティングシステムを補う」ためにランダムな値を持つパケットのIP識別フィールドを置き換え」 。このオプションは、再構築」 、オプションのパケットの後に断片化されていないパケットに適用されます」 。"
+
+#: usr/local/www/system_advanced_firewall.php:264
+#: usr/local/www/system_advanced_firewall.php:278
+#: usr/local/www/system_advanced_firewall.php:307
+#: usr/local/www/system_advanced_firewall.php:306
+#: usr/local/www/system_advanced_firewall.php:306
+msgid "Firewall Optimization Options"
+msgstr "ファイアウォール最適化オプション"
+
+#: usr/local/www/system_advanced_firewall.php:267
+#: usr/local/www/system_advanced_firewall.php:281
+#: usr/local/www/system_advanced_firewall.php:310
+#: usr/local/www/system_advanced_firewall.php:309
+#: usr/local/www/system_advanced_firewall.php:309
+msgid "normal"
+msgstr "ノーマル"
+
+#: usr/local/www/system_advanced_firewall.php:268
+#: usr/local/www/system_advanced_firewall.php:282
+#: usr/local/www/system_advanced_firewall.php:311
+#: usr/local/www/system_advanced_firewall.php:310
+#: usr/local/www/system_advanced_firewall.php:310
+msgid "high-latency"
+msgstr "高レイテンシ"
+
+#: usr/local/www/system_advanced_firewall.php:269
+#: usr/local/www/system_advanced_firewall.php:283
+#: usr/local/www/system_advanced_firewall.php:312
+#: usr/local/www/system_advanced_firewall.php:311
+#: usr/local/www/system_advanced_firewall.php:311
+msgid "aggressive"
+msgstr "積極的な"
+
+#: usr/local/www/system_advanced_firewall.php:270
+#: usr/local/www/system_advanced_firewall.php:284
+#: usr/local/www/system_advanced_firewall.php:313
+#: usr/local/www/system_advanced_firewall.php:312
+#: usr/local/www/system_advanced_firewall.php:312
+msgid "conservative"
+msgstr "保守的"
+
+#: usr/local/www/system_advanced_firewall.php:278
+#: usr/local/www/system_advanced_firewall.php:292
+#: usr/local/www/system_advanced_firewall.php:321
+#: usr/local/www/system_advanced_firewall.php:322
+#: usr/local/www/system_advanced_firewall.php:322
+msgid "Select the type of state table optimization to use"
+msgstr "使用する状態テーブルの最適化の種類を選択します"
+
+#: usr/local/www/system_advanced_firewall.php:282
+#: usr/local/www/system_advanced_firewall.php:296
+#: usr/local/www/system_advanced_firewall.php:325
+#: usr/local/www/system_advanced_firewall.php:326
+#: usr/local/www/system_advanced_firewall.php:326
+msgid "Disable Firewall"
+msgstr "ファイアウォールを無効にする"
+
+#: usr/local/www/system_advanced_firewall.php:285
+#: usr/local/www/system_advanced_firewall.php:299
+#: usr/local/www/system_advanced_firewall.php:328
+#: usr/local/www/system_advanced_firewall.php:329
+#: usr/local/www/system_advanced_firewall.php:329
+msgid "Disable all packet filtering."
+msgstr "すべてのパケットフィルタリングを無効にします。"
+
+#: usr/local/www/system_advanced_firewall.php:287
+#: usr/local/www/system_advanced_firewall.php:301
+#: usr/local/www/system_advanced_firewall.php:330
+#: usr/local/www/system_advanced_firewall.php:331
+#: usr/local/www/system_advanced_firewall.php:331
+#, php-format
+msgid "Note: This converts %s into a routing only platform!"
+msgstr "注意:これは、ルーティングのみ、プラットフォームのに%sに変換!"
+
+#: usr/local/www/system_advanced_firewall.php:288
+#: usr/local/www/system_advanced_firewall.php:302
+#: usr/local/www/system_advanced_firewall.php:331
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/system_advanced_firewall.php:332
+msgid "Note: This will also turn off NAT!"
+msgstr "注意:これはまた、NAT をオフにします!"
+
+#: usr/local/www/system_advanced_firewall.php:289
+#: usr/local/www/system_advanced_firewall.php:303
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/system_advanced_firewall.php:333
+#: usr/local/www/system_advanced_firewall.php:333
+msgid "If you only want to disable NAT, and not firewall rules, visit the"
+msgstr "あなただけのNATはなく、ファイアウォールのルールを無効にする場合は、訪問"
+
+#: usr/local/www/system_advanced_firewall.php:289
+#: usr/local/www/system_advanced_firewall.php:303
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/system_advanced_firewall.php:333
+#: usr/local/www/system_advanced_firewall.php:333
+msgid "Outbound NAT"
+msgstr "アウトバウンドのNAT"
+
+#: usr/local/www/system_advanced_firewall.php:294
+#: usr/local/www/system_advanced_firewall.php:308
+#: usr/local/www/system_advanced_firewall.php:337
+#: usr/local/www/system_advanced_firewall.php:338
+#: usr/local/www/system_advanced_firewall.php:338
+msgid "Disable Firewall Scrub"
+msgstr "ファイアウォールスクラブを無効にする"
+
+#: usr/local/www/system_advanced_firewall.php:297
+#: usr/local/www/system_advanced_firewall.php:311
+#: usr/local/www/system_advanced_firewall.php:340
+#: usr/local/www/system_advanced_firewall.php:341
+#: usr/local/www/system_advanced_firewall.php:341
+msgid ""
+"Disables the PF scrubbing option which can sometimes interfere with NFS and "
+"PPTP traffic."
+msgstr "PPTPトラフィック」時にはNFSとを妨害する可能性がPFスクラブオプションを無効にします」 。"
+
+#: usr/local/www/system_advanced_firewall.php:302
+#: usr/local/www/system_advanced_firewall.php:316
+#: usr/local/www/system_advanced_firewall.php:360
+#: usr/local/www/system_advanced_firewall.php:361
+#: usr/local/www/system_advanced_firewall.php:361
+msgid "Firewall Maximum States"
+msgstr "ファイアウォールの最大状態"
+
+#: usr/local/www/system_advanced_firewall.php:306
+#: usr/local/www/system_advanced_firewall.php:320
+#: usr/local/www/system_advanced_firewall.php:364
+#: usr/local/www/system_advanced_firewall.php:365
+#: usr/local/www/system_advanced_firewall.php:365
+msgid "Maximum number of connections to hold in the firewall state table."
+msgstr "ファイアウォールの状態テーブルに保持する接続の最大数。"
+
+#: usr/local/www/system_advanced_firewall.php:308
+#: usr/local/www/system_advanced_firewall.php:322
+#: usr/local/www/system_advanced_firewall.php:366
+#: usr/local/www/system_advanced_firewall.php:367
+#: usr/local/www/system_advanced_firewall.php:367
+msgid ""
+"Note: Leave this blank for the default. On your system the default size is:"
+msgstr ""注:デフォルトは、この空白のままにしておき、システム上のデフォルトのサイズは、次のとおりです。"
+
+#: usr/local/www/system_advanced_firewall.php:312
+#: usr/local/www/system_advanced_firewall.php:342
+#: usr/local/www/system_advanced_firewall.php:386
+#: usr/local/www/system_advanced_firewall.php:387
+#: usr/local/www/system_advanced_firewall.php:387
+msgid "Firewall Maximum Table Entries"
+msgstr "ファイアウォールの最大テーブルエントリ"
+
+#: usr/local/www/system_advanced_firewall.php:316
+#: usr/local/www/system_advanced_firewall.php:346
+#: usr/local/www/system_advanced_firewall.php:390
+#: usr/local/www/system_advanced_firewall.php:391
+#: usr/local/www/system_advanced_firewall.php:391
+msgid ""
+"Maximum number of table entries for systems such as aliases, sshlockout, "
+"snort, etc, combined."
+msgstr "組み合わせなどSnortの、 「このようなエイリアス、 sshlockout 、などのシステム用のテーブルエントリの最大数」 。"
+
+#: usr/local/www/system_advanced_firewall.php:319
+#: usr/local/www/system_advanced_firewall.php:334
+#: usr/local/www/system_advanced_firewall.php:349
+#: usr/local/www/system_advanced_firewall.php:378
+#: usr/local/www/system_advanced_firewall.php:393
+#: usr/local/www/system_advanced_firewall.php:379
+#: usr/local/www/system_advanced_firewall.php:394
+#: usr/local/www/system_advanced_firewall.php:379
+#: usr/local/www/system_advanced_firewall.php:394
+msgid "Note: Leave this blank for the default."
+msgstr "注:デフォルトは、この空白のままにします。"
+
+#: usr/local/www/system_advanced_firewall.php:321
+#: usr/local/www/system_advanced_firewall.php:336
+#: usr/local/www/system_advanced_firewall.php:351
+#: usr/local/www/system_advanced_firewall.php:380
+#: usr/local/www/system_advanced_firewall.php:395
+#: usr/local/www/system_advanced_firewall.php:381
+#: usr/local/www/system_advanced_firewall.php:396
+#: usr/local/www/system_advanced_firewall.php:381
+#: usr/local/www/system_advanced_firewall.php:396
+msgid "On your system the default size is:"
+msgstr "システムのデフォルトのサイズは、次のとおりです。"
+
+#: usr/local/www/system_advanced_firewall.php:327
+#: usr/local/www/system_advanced_firewall.php:357
+#: usr/local/www/system_advanced_firewall.php:401
+#: usr/local/www/system_advanced_firewall.php:402
+#: usr/local/www/system_advanced_firewall.php:402
+msgid "Static route filtering"
+msgstr "スタティックルートフィルタリング"
+
+#: usr/local/www/system_advanced_firewall.php:330
+#: usr/local/www/system_advanced_firewall.php:360
+#: usr/local/www/system_advanced_firewall.php:404
+#: usr/local/www/system_advanced_firewall.php:405
+#: usr/local/www/system_advanced_firewall.php:405
+msgid "Bypass firewall rules for traffic on the same interface"
+msgstr "同じインターフェイス上のトラフィックのためのバイパスファイアウォールルール"
+
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/system_advanced_firewall.php:362
+#: usr/local/www/system_advanced_firewall.php:406
+#: usr/local/www/system_advanced_firewall.php:407
+#: usr/local/www/system_advanced_firewall.php:407
+msgid ""
+"This option only applies if you have defined one or more static routes. If "
+"it is enabled, traffic that enters and leaves through the same interface "
+"will not be checked by the firewall. This may be desirable in some "
+"situations where multiple subnets are connected to the same interface."
+msgstr ""あなたは1つ以上の静的ルートを定義している場合は、このオプションは適用されます。場合」が有効になっている、入って、同じインターフェイスを介して葉のトラフィックが状況複数のサブネット「ファイアウォールによってチェックされません。これは、いくつかの中で望ましいことがある」同じインターフェースに接続されている。"
+
+#: usr/local/www/system_advanced_firewall.php:342
+#: usr/local/www/system_advanced_firewall.php:372
+#: usr/local/www/system_advanced_firewall.php:416
+#: usr/local/www/system_advanced_firewall.php:417
+#: usr/local/www/system_advanced_firewall.php:417
+msgid "Disable all auto-added VPN rules."
+msgstr "すべての自動追加のVPNルールを無効にします。"
+
+#: usr/local/www/system_advanced_firewall.php:344
+#: usr/local/www/system_advanced_firewall.php:374
+#: usr/local/www/system_advanced_firewall.php:418
+#: usr/local/www/system_advanced_firewall.php:419
+#: usr/local/www/system_advanced_firewall.php:419
+msgid "Note: This disables automatically added rules for IPsec, PPTP."
+msgstr "注:これはIPsecの、 PPTPのために自動的に追加されたルールを無効にします。"
+
+#: usr/local/www/system_advanced_firewall.php:352
+#: usr/local/www/system_advanced_firewall.php:382
+#: usr/local/www/system_advanced_firewall.php:426
+#: usr/local/www/system_advanced_firewall.php:427
+#: usr/local/www/system_advanced_firewall.php:427
+msgid "Disable reply-to on WAN rules"
+msgstr "WANのルールに返信するを無効にする"
+
+#: usr/local/www/system_advanced_firewall.php:354
+#: usr/local/www/system_advanced_firewall.php:384
+#: usr/local/www/system_advanced_firewall.php:428
+#: usr/local/www/system_advanced_firewall.php:429
+#: usr/local/www/system_advanced_firewall.php:429
+msgid ""
+"With Multi-WAN you generally want to ensure traffic leaves the same "
+"interface it arrives on, hence reply-to is added automatically by default. "
+"When using bridging, you must disable this behavior if the WAN gateway IP is "
+"different from the gateway IP of the hosts behind the bridged interface."
+msgstr "「マルチWANを使用すると、一般的には、トラフィックの葉を確認したい、同じ"、それが到着したインタフェースゆえ返信先は、デフォルトで自動的に追加されます。ブリッジドインターフェイスの背後にあるホストのゲートウェイIPアドレスとは別の「ブリッジングを使用する場合はWANゲートウェイIPがある場合は、この動作を無効にする必要があります」 。"
+
+#: usr/local/www/system_advanced_firewall.php:364
+#: usr/local/www/system_advanced_firewall.php:404
+#: usr/local/www/system_advanced_firewall.php:466
+#: usr/local/www/system_advanced_firewall.php:467
+#: usr/local/www/system_advanced_firewall.php:467
+msgid "Network Address Translation"
+msgstr "ネットワークアドレス変換"
+
+#: usr/local/www/system_advanced_firewall.php:367
+msgid "Disable NAT Reflection for port forwards"
+msgstr "ポートに転送するためのNATリフレクションをディセーブル"
+
+#: usr/local/www/system_advanced_firewall.php:370
+msgid ""
+"Disables the automatic creation of additional NAT redirect rules for access "
+"to port forwards on your external IP addresses from within your internal "
+"networks. Note: Reflection for port forward entries is skipped for ranges "
+"larger than 500 ports."
+msgstr "内部内から外部IPアドレス上のポートに転送する」のアクセスのための規則をリダイレクトの追加のNATの自動作成を無効にします""ネットワークに注意してください。ポートフォワードエントリの反射は範囲についてはスキップされ、「より大きく500ポート。"
+
+#: usr/local/www/system_advanced_firewall.php:374
+#: usr/local/www/system_advanced_firewall.php:425
+#: usr/local/www/system_advanced_firewall.php:487
+#: usr/local/www/system_advanced_firewall.php:488
+#: usr/local/www/system_advanced_firewall.php:488
+msgid "Reflection Timeout"
+msgstr "反射タイムアウト"
+
+#: usr/local/www/system_advanced_firewall.php:377
+msgid ""
+"Enter value for Reflection timeout in seconds. Note: Only applies to "
+"Reflection on port forwards."
+msgstr "「秒における反射タイムアウトの値を入力します(注) 。にのみ適用され、「ポートに転送上のリフレクション。"
+
+#: usr/local/www/system_advanced_firewall.php:381
+msgid "Disable NAT Reflection for 1:1 NAT"
+msgstr "1時01分、NATのNATリフレクションをディセーブル"
+
+#: usr/local/www/system_advanced_firewall.php:384
+msgid ""
+"Disables the automatic creation of additional NAT 1:1 mappings for access to "
+"1:1 mappings of your external IP addresses from within your internal "
+"networks. Note: Reflection for 1:1 NAT might not fully work in certain "
+"complex routing scenarios."
+msgstr "内部内から外部IPアドレスの1:1のマッピング」にアクセスするための他のNAT 1時01分のマッピングを自動的に作成無効に」 :複雑なルーティングのシナリオ」ネットワークに注意してください。 1時01 NATのリフレクションが完全に特定のでは動作しない可能性があります」 。"
+
+#: usr/local/www/system_advanced_firewall.php:391
+#: usr/local/www/system_advanced_firewall.php:448
+#: usr/local/www/system_advanced_firewall.php:510
+#: usr/local/www/system_advanced_firewall.php:511
+#: usr/local/www/system_advanced_firewall.php:511
+msgid ""
+"Automatically create outbound NAT rules which assist inbound NAT rules that "
+"direct traffic back out to the same subnet it originated from."
+msgstr "直接的なトラフィックが同じサブネットに外にそれが由来する「自動的に着信NATルールを支援アウトバウンドNATルールを作成する」 。"
+
+#: usr/local/www/system_advanced_firewall.php:393
+msgid ""
+"Currently only applies to 1:1 NAT rules. Required for full functionality of "
+"NAT Reflection for 1:1 NAT."
+msgstr "「現在は、 1時01 NATルールに適用されます。のすべての機能に必要な「1:1 NATのNATリフレクション。"
+
+#: usr/local/www/system_advanced_firewall.php:397
+#: usr/local/www/system_advanced_firewall.php:456
+#: usr/local/www/system_advanced_firewall.php:518
+#: usr/local/www/system_advanced_firewall.php:519
+#: usr/local/www/system_advanced_firewall.php:519
+msgid "TFTP Proxy"
+msgstr "TFTPプロキシ"
+
+#: usr/local/www/system_advanced_firewall.php:407
+#: usr/local/www/system_advanced_firewall.php:466
+#: usr/local/www/system_advanced_firewall.php:528
+#: usr/local/www/system_advanced_firewall.php:529
+#: usr/local/www/system_advanced_firewall.php:529
+msgid "Choose the interfaces where you want TFTP proxy helper to be enabled."
+msgstr "あなたは、TFTPプロキシヘルパーを有効にしたいインターフェースを選択します。"
+
+#: usr/local/www/system_advanced_misc.php:179
+#: usr/local/www/system_advanced_misc.php:199
+#: usr/local/www/system_advanced_misc.php:218
+#: usr/local/www/system_advanced_misc.php:222
+#: usr/local/www/system_advanced_misc.php:254
+#: usr/local/www/system_advanced_misc.php:254
+msgid "Advanced: Miscellaneous"
+msgstr "アドバンスト:その他"
+
+#: usr/local/www/system_advanced_misc.php:229
+#: usr/local/www/system_advanced_misc.php:255
+#: usr/local/www/system_advanced_misc.php:274
+#: usr/local/www/system_advanced_misc.php:278
+#: usr/local/www/system_advanced_misc.php:325
+#: usr/local/www/system_advanced_misc.php:325
+msgid "Proxy support"
+msgstr "プロキシのサポート"
+
+#: usr/local/www/system_advanced_misc.php:232
+#: usr/local/www/system_advanced_misc.php:258
+#: usr/local/www/system_advanced_misc.php:277
+#: usr/local/www/system_advanced_misc.php:281
+#: usr/local/www/system_advanced_misc.php:328
+#: usr/local/www/system_advanced_misc.php:328
+msgid "Proxy URL"
+msgstr "プロキシのURL"
+
+#: usr/local/www/system_advanced_misc.php:236
+#: usr/local/www/system_advanced_misc.php:262
+#: usr/local/www/system_advanced_misc.php:281
+#: usr/local/www/system_advanced_misc.php:285
+#: usr/local/www/system_advanced_misc.php:332
+#: usr/local/www/system_advanced_misc.php:332
+#, php-format
+msgid "Proxy url for allowing %s to use this proxy to connect outside."
+msgstr "%s外接続するには、このプロキシを使用できるようにするためのプロキシURL 。"
+
+#: usr/local/www/system_advanced_misc.php:240
+#: usr/local/www/system_advanced_misc.php:266
+#: usr/local/www/system_advanced_misc.php:285
+#: usr/local/www/system_advanced_misc.php:289
+#: usr/local/www/system_advanced_misc.php:336
+#: usr/local/www/system_advanced_misc.php:336
+msgid "Proxy Port"
+msgstr "プロキシポート"
+
+#: usr/local/www/system_advanced_misc.php:244
+#: usr/local/www/system_advanced_misc.php:270
+#: usr/local/www/system_advanced_misc.php:289
+#: usr/local/www/system_advanced_misc.php:293
+#: usr/local/www/system_advanced_misc.php:340
+#: usr/local/www/system_advanced_misc.php:340
+#, php-format
+msgid ""
+"Proxy port to use when %s connects to the proxy URL configured above. "
+"Default is 8080 for http protocol or 443 for ssl."
+msgstr "デフォルト "%sプロキシURLに上記のように構成されています。接続するときに使用するプロキシポートは、 「SSLのHTTPプロトコルまたは443のために8080です。"
+
+#: usr/local/www/system_advanced_misc.php:248
+#: usr/local/www/system_advanced_misc.php:274
+#: usr/local/www/system_advanced_misc.php:293
+#: usr/local/www/system_advanced_misc.php:297
+#: usr/local/www/system_advanced_misc.php:344
+#: usr/local/www/system_advanced_misc.php:344
+msgid "Proxy Username"
+msgstr "[プロキシユーザー名"
+
+#: usr/local/www/system_advanced_misc.php:252
+#: usr/local/www/system_advanced_misc.php:278
+#: usr/local/www/system_advanced_misc.php:297
+#: usr/local/www/system_advanced_misc.php:301
+#: usr/local/www/system_advanced_misc.php:348
+#: usr/local/www/system_advanced_misc.php:348
+#, php-format
+msgid "Proxy username for allowing %s to use this proxy to connect outside"
+msgstr "%s外接続するには、このプロキシを使用できるようにするためのプロキシのユーザー名"
+
+#: usr/local/www/system_advanced_misc.php:256
+#: usr/local/www/system_advanced_misc.php:282
+#: usr/local/www/system_advanced_misc.php:301
+#: usr/local/www/system_advanced_misc.php:305
+#: usr/local/www/system_advanced_misc.php:352
+#: usr/local/www/system_advanced_misc.php:352
+msgid "Proxy Pass"
+msgstr "プロキシパス"
+
+#: usr/local/www/system_advanced_misc.php:260
+#: usr/local/www/system_advanced_misc.php:286
+#: usr/local/www/system_advanced_misc.php:305
+#: usr/local/www/system_advanced_misc.php:309
+#: usr/local/www/system_advanced_misc.php:356
+#: usr/local/www/system_advanced_misc.php:356
+#, php-format
+msgid "Proxy password for allowing %s to use this proxy to connect outside"
+msgstr "%s外接続するには、このプロキシを使用できるようにするためのプロキシパスワード"
+
+#: usr/local/www/system_advanced_misc.php:264
+#: usr/local/www/system_advanced_misc.php:267
+#: usr/local/www/system_advanced_misc.php:282
+#: usr/local/www/system_advanced_misc.php:290
+#: usr/local/www/system_advanced_misc.php:293
+#: usr/local/www/system_advanced_misc.php:314
+#: usr/local/www/system_advanced_misc.php:309
+#: usr/local/www/system_advanced_misc.php:312
+#: usr/local/www/system_advanced_misc.php:333
+#: usr/local/www/system_advanced_misc.php:313
+#: usr/local/www/system_advanced_misc.php:316
+#: usr/local/www/system_advanced_misc.php:337
+#: usr/local/www/system_advanced_misc.php:360
+#: usr/local/www/system_advanced_misc.php:363
+#: usr/local/www/system_advanced_misc.php:384
+#: usr/local/www/system_advanced_misc.php:360
+#: usr/local/www/system_advanced_misc.php:363
+#: usr/local/www/system_advanced_misc.php:384
+msgid "Load Balancing"
+msgstr "ロードバランシング"
+
+#: usr/local/www/system_advanced_misc.php:270
+#: usr/local/www/system_advanced_misc.php:296
+#: usr/local/www/system_advanced_misc.php:315
+#: usr/local/www/system_advanced_misc.php:319
+#: usr/local/www/system_advanced_misc.php:366
+#: usr/local/www/system_advanced_misc.php:366
+msgid "Use sticky connections"
+msgstr "スティッキー接続を使用"
+
+#: usr/local/www/system_advanced_misc.php:271
+msgid ""
+"Successive connections will be redirected to the servers in a round-robin "
+"manner with connections from the same source being sent to the same web "
+"server. This 'sticky connection' will exist as long as there are states that "
+"refer to this connection. Once the states expire, so will the sticky "
+"connection. Further connections from that host will be redirected to the "
+"next web server in the round robin."
+msgstr "同じWebに送信され、同じ送信元からの接続を持つ方法「連続接続はラウンドロビンのサーバにリダイレクトされ、「この接続を参照して、「サーバ。この「スティッキー接続は、 「限りという状態があるように存在することになる」 。状態は有効期限が切れると、そのスティッキラウンドロビンの次のWebサーバ」接続。そのホストからのさらなる接続はにリダイレクトされます」になります。"
+
+#: usr/local/www/system_advanced_misc.php:285
+#: usr/local/www/system_advanced_misc.php:317
+#: usr/local/www/system_advanced_misc.php:336
+#: usr/local/www/system_advanced_misc.php:340
+#: usr/local/www/system_advanced_misc.php:387
+#: usr/local/www/system_advanced_misc.php:387
+msgid "Allow default gateway switching"
+msgstr "デフォルトゲートウェイの切り替えを許可する"
+
+#: usr/local/www/system_advanced_misc.php:286
+#: usr/local/www/system_advanced_misc.php:318
+#: usr/local/www/system_advanced_misc.php:337
+#: usr/local/www/system_advanced_misc.php:341
+#: usr/local/www/system_advanced_misc.php:388
+#: usr/local/www/system_advanced_misc.php:388
+msgid ""
+"If the link where the default gateway resides fails switch the default "
+"gateway to another available one."
+msgstr "別の利用可能な1へのゲートウェイ」 、デフォルトゲートウェイが存在するリンクは、デフォルトを切り替えるに失敗した場合」 。"
+
+#: usr/local/www/system_advanced_misc.php:294
+#: usr/local/www/system_advanced_misc.php:326
+#: usr/local/www/system_advanced_misc.php:345
+#: usr/local/www/system_advanced_misc.php:349
+#: usr/local/www/system_advanced_misc.php:396
+#: usr/local/www/system_advanced_misc.php:396
+msgid "Power savings"
+msgstr "電力の節約"
+
+#: usr/local/www/system_advanced_misc.php:297
+#: usr/local/www/system_advanced_misc.php:329
+#: usr/local/www/system_advanced_misc.php:348
+#: usr/local/www/system_advanced_misc.php:352
+#: usr/local/www/system_advanced_misc.php:399
+#: usr/local/www/system_advanced_misc.php:399
+msgid "PowerD"
+msgstr "パワード"
+
+#: usr/local/www/system_advanced_misc.php:300
+#: usr/local/www/system_advanced_misc.php:332
+#: usr/local/www/system_advanced_misc.php:351
+#: usr/local/www/system_advanced_misc.php:355
+#: usr/local/www/system_advanced_misc.php:402
+#: usr/local/www/system_advanced_misc.php:402
+msgid "Use PowerD"
+msgstr "パワードを使う"
+
+#: usr/local/www/system_advanced_misc.php:302
+msgid ""
+"The powerd utility monitors the system state and sets various power control "
+"options accordingly. It offers three modes (maximum, minimum, and adaptive) "
+"that can be individually selected while on AC power or batteries. The modes "
+"maximum, minimum, and adaptive may be abbreviated max, min, adp. Maximum "
+"mode chooses the highest performance values. Minimum mode selects the "
+"lowest performance values to get the most power savings. Adaptive mode "
+"attempts to strike a balance by degrading performance when the system "
+"appears idle and increasing it when the system is busy. It offers a good "
+"balance between a small performance loss for greatly "
+msgstr "「パワードユーティリティは、システムの状態を監視し、様々な電力制御に設定」は、それに応じてオプションを。それは三つのモード(最大値、最小値、および適応)提供しています」個別のAC電源または電池でいる間に選択することができます。モード」 、最大値、最小値、および適応が最大、最小、 ADPを省略することができる。最大」モードは、最高のパフォーマンス値を選択します。最小モードが選択され、「最も節電効果を得るために、最も低いパフォーマンス値を。適応モードでは、アイドル表示され、システムがビジー状態のときにそれを増やす」システムがときのパフォーマンスを低下させることでバランスを取るしようとします」 。それが大幅用の小さなパフォーマンスの低下との間に良好な「バランスを提供しています"
+
+#: usr/local/www/system_advanced_misc.php:318
+#: usr/local/www/system_advanced_misc.php:361
+msgid "glxsb Crypto Acceleration"
+msgstr "glxsb暗号化アクセラレーション"
+
+#: usr/local/www/system_advanced_misc.php:321
+#: usr/local/www/system_advanced_misc.php:364
+msgid "glxsb"
+msgstr "glxsb"
+
+#: usr/local/www/system_advanced_misc.php:324
+#: usr/local/www/system_advanced_misc.php:367
+msgid "Use glxsb"
+msgstr "glxsbを使う"
+
+#: usr/local/www/system_advanced_misc.php:326
+#: usr/local/www/system_advanced_misc.php:369
+msgid ""
+"The AMD Geode LX Security Block will accelerate some cryptographic functions "
+"on systems which have the chip. Do not enable this option if you have a Hifn "
+"cryptographic acceleration card, as this will take precedence and the Hifn "
+"card will not be used. Acceleration should be automatic for IPsec when using "
+"Rijndael (AES). OpenVPN should be set for AES-128-CBC."
+msgstr "チップを持つシステムでは「AMDのGeode LXセキュリティブロックは、いくつかの暗号機能を加速していきます」 。あなたはHifnのある場合は、「暗号化アクセラレータカードを、これが優先されますし、 Hifnのように、 「カードが使用されない場合は、このオプションを有効にしないでください。 「ラインダール( AES)を使用した場合、加速がIPsecの自動にする必要があります。 OpenVPNのは、AES - 128 -CBCのために設定する必要があります。"
+
+#: usr/local/www/system_advanced_misc.php:332
+#: usr/local/www/system_advanced_misc.php:375
+msgid ""
+"If you do not have a glxsb chip in your system, this option will have no "
+"effect. To unload the module, uncheck this option and then reboot."
+msgstr "効果」を使用しているシステムでglxsbチップを持っていない場合、このオプションはあります」 。モジュールをアンロードするには、このオプションをオフにしてから再起動します。"
+
+#: usr/local/www/system_advanced_misc.php:340
+#: usr/local/www/system_advanced_misc.php:383
+#: usr/local/www/system_advanced_misc.php:432
+#: usr/local/www/system_advanced_misc.php:444
+#: usr/local/www/system_advanced_misc.php:491
+#: usr/local/www/system_advanced_misc.php:491
+msgid "IP Security"
+msgstr "IPセキュリティ"
+
+#: usr/local/www/system_advanced_misc.php:343
+#: usr/local/www/system_advanced_misc.php:386
+#: usr/local/www/system_advanced_misc.php:435
+#: usr/local/www/system_advanced_misc.php:447
+#: usr/local/www/system_advanced_misc.php:494
+#: usr/local/www/system_advanced_misc.php:494
+msgid "Security Associations"
+msgstr "セキュリティアソシエーション"
+
+#: usr/local/www/system_advanced_misc.php:346
+#: usr/local/www/system_advanced_misc.php:389
+#: usr/local/www/system_advanced_misc.php:438
+#: usr/local/www/system_advanced_misc.php:450
+#: usr/local/www/system_advanced_misc.php:497
+#: usr/local/www/system_advanced_misc.php:497
+msgid "Prefer older IPsec SAs"
+msgstr "古いIPsec SAのを好む"
+
+#: usr/local/www/system_advanced_misc.php:348
+#: usr/local/www/system_advanced_misc.php:391
+#: usr/local/www/system_advanced_misc.php:440
+#: usr/local/www/system_advanced_misc.php:452
+#: usr/local/www/system_advanced_misc.php:499
+#: usr/local/www/system_advanced_misc.php:499
+msgid ""
+"By default, if several SAs match, the newest one is preferred if it's at "
+"least 30 seconds old. Select this option to always prefer old SAs over new "
+"ones."
+msgstr "30秒以上古い "それはATの場合、デフォルトでは、いくつかのSAが一致する場合、最新の1が好ましい」 。常に新しい「ものより古いSAを好む場合は、このオプションを選択します。"
+
+#: usr/local/www/system_advanced_misc.php:354
+#: usr/local/www/system_advanced_misc.php:397
+#: usr/local/www/system_advanced_misc.php:446
+#: usr/local/www/system_advanced_misc.php:458
+#: usr/local/www/system_advanced_misc.php:505
+#: usr/local/www/system_advanced_misc.php:505
+msgid "IPsec Debug"
+msgstr "IPsecのデバッグ"
+
+#: usr/local/www/system_advanced_misc.php:357
+#: usr/local/www/system_advanced_misc.php:400
+#: usr/local/www/system_advanced_misc.php:449
+#: usr/local/www/system_advanced_misc.php:461
+#: usr/local/www/system_advanced_misc.php:508
+#: usr/local/www/system_advanced_misc.php:508
+msgid "Start racoon in debug mode"
+msgstr "デバッグモードでアライグマを起動します。"
+
+#: usr/local/www/system_advanced_misc.php:359
+#: usr/local/www/system_advanced_misc.php:402
+#: usr/local/www/system_advanced_misc.php:451
+#: usr/local/www/system_advanced_misc.php:463
+#: usr/local/www/system_advanced_misc.php:510
+#: usr/local/www/system_advanced_misc.php:510
+msgid ""
+"Launches racoon in debug mode so that more verbose logs will be generated to "
+"aid in troubleshooting."
+msgstr "トラブルシューティングを支援"より冗長なログが生成されたされるように、デバッグモードでアライグマを起動します」 。"
+
+#: usr/local/www/system_advanced_misc.php:361
+#: usr/local/www/system_advanced_misc.php:404
+#: usr/local/www/system_advanced_misc.php:453
+#: usr/local/www/system_advanced_misc.php:465
+#: usr/local/www/system_advanced_misc.php:512
+#: usr/local/www/system_advanced_misc.php:512
+msgid "NOTE: Changing this setting will restart racoon."
+msgstr "注:この設定を変更すると、アライグマを再起動します。"
+
+#: usr/local/www/system_advanced_misc.php:365
+#: usr/local/www/system_advanced_misc.php:408
+#: usr/local/www/system_advanced_misc.php:457
+#: usr/local/www/system_advanced_misc.php:469
+#: usr/local/www/system_advanced_misc.php:516
+#: usr/local/www/system_advanced_misc.php:516
+msgid "Maximum MSS"
+msgstr "最大MSS"
+
+#: usr/local/www/system_advanced_misc.php:368
+#: usr/local/www/system_advanced_misc.php:411
+#: usr/local/www/system_advanced_misc.php:460
+#: usr/local/www/system_advanced_misc.php:472
+#: usr/local/www/system_advanced_misc.php:519
+#: usr/local/www/system_advanced_misc.php:519
+msgid "Enable MSS clamping on VPN traffic"
+msgstr "MSSは、VPNトラフィックにクランプ可能にする"
+
+#: usr/local/www/system_advanced_misc.php:372
+#: usr/local/www/system_advanced_misc.php:415
+#: usr/local/www/system_advanced_misc.php:464
+#: usr/local/www/system_advanced_misc.php:476
+#: usr/local/www/system_advanced_misc.php:523
+#: usr/local/www/system_advanced_misc.php:523
+msgid ""
+"Enable MSS clamping on TCP flows over VPN. This helps overcome problems with "
+"PMTUD on IPsec VPN links. If left blank, the default value is 1400 bytes. "
+msgstr "IPsec VPNのリンク上でPMTUD 「VPN上を流れるTCP上でクランプするMSSを有効にします。これはの問題を克服するのに役立ちます」 。空白の場合、デフォルト値は1400バイトです。"
+
+#: usr/local/www/system_advanced_misc.php:383
+#: usr/local/www/system_advanced_misc.php:426
+#: usr/local/www/system_advanced_misc.php:475
+#: usr/local/www/system_advanced_misc.php:487
+#: usr/local/www/system_advanced_misc.php:534
+#: usr/local/www/system_advanced_misc.php:534
+msgid "Schedule States"
+msgstr "スケジュール状態"
+
+#: usr/local/www/system_advanced_misc.php:387
+#: usr/local/www/system_advanced_misc.php:430
+#: usr/local/www/system_advanced_misc.php:479
+#: usr/local/www/system_advanced_misc.php:491
+#: usr/local/www/system_advanced_misc.php:538
+#: usr/local/www/system_advanced_misc.php:538
+msgid ""
+"By default schedules clear the states of existing connections when the "
+"expiration time has come. This option overrides that behavior by not "
+"clearing states for existing connections."
+msgstr "有効期限が到来した」ときに、デフォルトのスケジュールでは既存の接続の状態をオフにします」 。このオプションでは、 「既存の接続のための状態をクリアしていないことで、その動作を無効にします。"
+
+#: usr/local/www/system_advanced_misc.php:395
+#: usr/local/www/system_advanced_misc.php:438
+#: usr/local/www/system_advanced_misc.php:487
+#: usr/local/www/system_advanced_misc.php:499
+#: usr/local/www/system_advanced_misc.php:546
+#: usr/local/www/system_advanced_misc.php:546
+msgid "Gateway Monitoring"
+msgstr "ゲートウェイの監視"
+
+#: usr/local/www/system_advanced_misc.php:402
+#: usr/local/www/system_advanced_misc.php:445
+#: usr/local/www/system_advanced_misc.php:494
+#: usr/local/www/system_advanced_misc.php:506
+#: usr/local/www/system_advanced_misc.php:553
+#: usr/local/www/system_advanced_misc.php:553
+msgid ""
+"By default the monitoring process will flush states for a gateway that goes "
+"down. This option overrides that behavior by not clearing states for "
+"existing connections."
+msgstr "ダウン "デフォルトでは、監視プロセスが行くゲートウェイの状態をフラッシュします」 。このオプションでは、既存の接続」の状態をクリアしていないことによって、その動作を無効にします。"
+
+#: usr/local/www/system_advanced_misc.php:411
+#: usr/local/www/system_advanced_misc.php:454
+#: usr/local/www/system_advanced_misc.php:503
+#: usr/local/www/system_advanced_misc.php:515
+#: usr/local/www/system_advanced_misc.php:636
+#: usr/local/www/system_advanced_misc.php:636
+msgid "Hardware Settings"
+msgstr "ハードウェア設定"
+
+#: usr/local/www/system_advanced_misc.php:414
+#: usr/local/www/system_advanced_misc.php:457
+#: usr/local/www/system_advanced_misc.php:506
+#: usr/local/www/system_advanced_misc.php:518
+#: usr/local/www/system_advanced_misc.php:639
+#: usr/local/www/system_advanced_misc.php:639
+msgid "Hard disk standby time "
+msgstr "ハードディスク待機時間"
+
+#: usr/local/www/system_advanced_misc.php:421
+#: usr/local/www/system_advanced_misc.php:464
+#: usr/local/www/system_advanced_misc.php:513
+#: usr/local/www/system_advanced_misc.php:525
+#: usr/local/www/system_advanced_misc.php:646
+#: usr/local/www/system_advanced_misc.php:646
+msgid "Always on"
+msgstr "常にオン"
+
+#: usr/local/www/system_advanced_misc.php:430
+#: usr/local/www/system_advanced_misc.php:473
+#: usr/local/www/system_advanced_misc.php:522
+#: usr/local/www/system_advanced_misc.php:534
+#: usr/local/www/system_advanced_misc.php:655
+#: usr/local/www/system_advanced_misc.php:655
+msgid ""
+"Puts the hard disk into standby mode when the selected amount of time after "
+"the last access has elapsed."
+msgstr "最終アクセス経過した」後の時間の選択された量は、スタンバイモードにハードディスクを置きます」 。"
+
+#: usr/local/www/system_advanced_misc.php:431
+#: usr/local/www/system_advanced_misc.php:474
+#: usr/local/www/system_advanced_misc.php:523
+#: usr/local/www/system_advanced_misc.php:535
+#: usr/local/www/system_advanced_misc.php:656
+#: usr/local/www/system_advanced_misc.php:656
+msgid "Do not set this for CF cards."
+msgstr "CFカードのためにこれを設定しないでください。"
+
+#: usr/local/www/system_advanced_network.php:68
+#: usr/local/www/system_advanced_network.php:68
+msgid "You must specify an IP address to NAT IPv6 packets."
+msgstr "あなたは、NAT 、IPv6パケットにIPアドレスを指定する必要があります。"
+
+#: usr/local/www/system_advanced_network.php:148
+#: usr/local/www/system_advanced_network.php:148
+msgid "Advanced: Networking"
+msgstr "アドバンスト:ネットワーキング"
+
+#: usr/local/www/system_advanced_network.php:205
+#: usr/local/www/system_advanced_network.php:205
+msgid "IPv6 Options"
+msgstr "IPv6のオプション"
+
+#: usr/local/www/system_advanced_network.php:208
+#: usr/local/www/system_advanced_network.php:211
+#: usr/local/www/system_advanced_network.php:208
+#: usr/local/www/system_advanced_network.php:211
+msgid "Allow IPv6"
+msgstr "IPv6のを許容"
+
+#: usr/local/www/system_advanced_network.php:212
+msgid "All IPv6 will be blocked unless this box is checked."
+msgstr "このボックスがチェックされていない限り、すべてのIPv6がブロックされます。"
+
+#: usr/local/www/system_advanced_network.php:217
+#: usr/local/www/system_advanced_network.php:218
+#: usr/local/www/system_advanced_network.php:218
+msgid "IPv6 over IPv4 Tunneling"
+msgstr "IPv4のトンネリング上のIPv6"
+
+#: usr/local/www/system_advanced_network.php:220
+#: usr/local/www/system_advanced_network.php:221
+#: usr/local/www/system_advanced_network.php:221
+msgid "Enable IPv4 NAT encapsulation of IPv6 packets"
+msgstr "IPv6パケットのIPv4のNATのカプセル化を可能にする"
+
+#: usr/local/www/system_advanced_network.php:221
+#: usr/local/www/system_advanced_network.php:222
+#: usr/local/www/system_advanced_network.php:222
+msgid ""
+"This provides an RFC 2893 compatibility mechanism that can be used to "
+"tunneling IPv6 packets over IPv4 routing infrastructures. If enabled, don't "
+"forget to add a firewall rule to permit IPv6 packets."
+msgstr "IPv4ルーティングインフラ上でIPv6パケットをトンネリング"これはするために使用することができ、RFC 2893互換性のメカニズムを提供します」 。有効にすると、 「 IPv6パケットを許可するファイアウォールルールを追加することを忘れないでください。"
+
+#: usr/local/www/system_advanced_network.php:234
+#: usr/local/www/system_advanced_network.php:235
+#: usr/local/www/system_advanced_network.php:235
+msgid "Network Interfaces"
+msgstr "ネットワーク·インタフェース"
+
+#: usr/local/www/system_advanced_network.php:237
+#: usr/local/www/system_advanced_network.php:238
+#: usr/local/www/system_advanced_network.php:238
+msgid "Device polling"
+msgstr "デバイスのポーリング"
+
+#: usr/local/www/system_advanced_network.php:240
+#: usr/local/www/system_advanced_network.php:241
+#: usr/local/www/system_advanced_network.php:241
+msgid "Enable device polling"
+msgstr "デバイスのポーリングを有効にする"
+
+#: usr/local/www/system_advanced_network.php:241
+#: usr/local/www/system_advanced_network.php:242
+#: usr/local/www/system_advanced_network.php:242
+#, php-format
+msgid ""
+"Device polling is a technique that lets the system periodically poll network "
+"devices for new data instead of relying on interrupts. This prevents your "
+"webConfigurator, SSH, etc. from being inaccessible due to interrupt floods "
+"when under extreme load. Generally this is not recommended. Not all NICs "
+"support polling; see the %s homepage for a list of supported cards."
+msgstr "代わりに、割り込みに依存するので新しいデータのためのデバイスは、「デバイスのポーリングは、システムが定期的にネットワークをポーリングすることができます技術です」 。これは時に極端な負荷の下で"洪水を中断することがアクセス不能のためであることからwebConfigurator 、 SSHなど「あなたのを防ぐことができます。一般に、これはお勧めできません。すべてのNICは「ポーリングをサポートし、サポートされているカードのリストについては、 %sホームページを参照してください。"
+
+#: usr/local/www/system_advanced_network.php:245
+#: usr/local/www/system_advanced_network.php:246
+#: usr/local/www/system_advanced_network.php:246
+msgid "Hardware Checksum Offloading"
+msgstr "ハードウェアのチェックサムオフロード"
+
+#: usr/local/www/system_advanced_network.php:248
+#: usr/local/www/system_advanced_network.php:249
+#: usr/local/www/system_advanced_network.php:249
+msgid "Disable hardware checksum offload"
+msgstr "ハードウェアチェックサムオフロードを無効にする"
+
+#: usr/local/www/system_advanced_network.php:249
+#: usr/local/www/system_advanced_network.php:250
+#: usr/local/www/system_advanced_network.php:250
+msgid ""
+"Checking this option will disable hardware checksum offloading. Checksum "
+"offloading is broken in some hardware, particularly some Realtek cards. "
+"Rarely, drivers may have problems with checksum offloading and some specific "
+"NICs."
+msgstr ""このオプションをチェックすると、ハードウェアチェックサムオフロードを無効にします。チェックサム"オフロードは、一部のハードウェア、特にいくつかのRealtekのカードに分割されます。 NICは「まれに、ドライバがチェックサムオフロードと、いくつかの特定の問題を有していなくてもよい」 。"
+
+#: usr/local/www/system_advanced_network.php:253
+#: usr/local/www/system_advanced_network.php:254
+#: usr/local/www/system_advanced_network.php:254
+msgid "Hardware TCP Segmentation Offloading"
+msgstr "ハードウェアのTCPセグメンテーションオフロード"
+
+#: usr/local/www/system_advanced_network.php:256
+#: usr/local/www/system_advanced_network.php:257
+#: usr/local/www/system_advanced_network.php:257
+msgid "Disable hardware TCP segmentation offload"
+msgstr "ハードウェア、TCPセグメンテーションオフロードを無効に"
+
+#: usr/local/www/system_advanced_network.php:257
+#: usr/local/www/system_advanced_network.php:258
+#: usr/local/www/system_advanced_network.php:258
+msgid ""
+"Checking this option will disable hardware TCP segmentation offloading (TSO, "
+"TSO4, TSO6). This offloading is broken in some hardware drivers, and may "
+"impact performance with some specific NICs."
+msgstr "」 ( TSO4 、 TSO6このオプションをオンにすると、ハードウェアTCPセグメンテーションオフロードTSOを)無効になります」 。このオフロードは、一部のハードウェアのドライバに分割され、 「いくつかの特定のNICのパフォーマンスに影響を与える可能性がある。"
+
+#: usr/local/www/system_advanced_network.php:261
+#: usr/local/www/system_advanced_network.php:262
+#: usr/local/www/system_advanced_network.php:262
+msgid "Hardware Large Receive Offloading"
+msgstr "ハードウェア大きなオフロードを受信"
+
+#: usr/local/www/system_advanced_network.php:264
+#: usr/local/www/system_advanced_network.php:265
+#: usr/local/www/system_advanced_network.php:265
+msgid "Disable hardware large receive offload"
+msgstr "ハードウェアに大きな受信オフロードを無効にする"
+
+#: usr/local/www/system_advanced_network.php:265
+#: usr/local/www/system_advanced_network.php:266
+#: usr/local/www/system_advanced_network.php:266
+msgid ""
+"Checking this option will disable hardware large receive offloading (LRO). "
+"This offloading is broken in some hardware drivers, and may impact "
+"performance with some specific NICs."
+msgstr ""このオプションをオンにすると、無効になり、ハードウェアの大。 ( LRO )のオフロード受信」このオフロードは、一部のハードウェアのドライバに分割され、いくつかの特定のNICを「パフォーマンスに影響する可能性があります。"
+
+#: usr/local/www/system_advanced_network.php:269
+#: usr/local/www/system_advanced_network.php:270
+#: usr/local/www/system_advanced_network.php:270
+msgid "ARP Handling"
+msgstr "ARPの取り扱い"
+
+#: usr/local/www/system_advanced_network.php:272
+#: usr/local/www/system_advanced_network.php:273
+#: usr/local/www/system_advanced_network.php:273
+msgid "Suppress ARP messages"
+msgstr "ARPメッセージを抑制する"
+
+#: usr/local/www/system_advanced_network.php:273
+#: usr/local/www/system_advanced_network.php:274
+#: usr/local/www/system_advanced_network.php:274
+msgid ""
+"This option will suppress ARP log messages when multiple interfaces reside "
+"on the same broadcast domain"
+msgstr "同じブロードキャストドメインに「複数のインターフェイスが存在する場合、このオプションは、ARP 、ログメッセージが表示されなくなります」"
+
+#: usr/local/www/system_advanced_notifications.php:118
+#: usr/local/www/system_advanced_notifications.php:124
+#: usr/local/www/system_advanced_notifications.php:127
+#: usr/local/www/system_advanced_notifications.php:133
+#: usr/local/www/system_advanced_notifications.php:127
+#: usr/local/www/system_advanced_notifications.php:133
+#, php-format
+msgid "This is a test message from %s. It is safe to ignore this message."
+msgstr "これは%s.からのテスト·メッセージですそれは、このメッセージを無視しても安全です。"
+
+#: usr/local/www/system_advanced_notifications.php:131
+#: usr/local/www/system_advanced_notifications.php:140
+#: usr/local/www/system_advanced_notifications.php:140
+msgid "Advanced: Notifications"
+msgstr "アドバンスト:通知"
+
+#: usr/local/www/system_advanced_notifications.php:168
+#: usr/local/www/system_advanced_notifications.php:177
+#: usr/local/www/system_advanced_notifications.php:177
+msgid "Growl"
+msgstr "うなり声"
+
+#: usr/local/www/system_advanced_notifications.php:171
+#: usr/local/www/system_advanced_notifications.php:180
+#: usr/local/www/system_advanced_notifications.php:180
+msgid "Registration Name"
+msgstr "登録名"
+
+#: usr/local/www/system_advanced_notifications.php:174
+#: usr/local/www/system_advanced_notifications.php:183
+#: usr/local/www/system_advanced_notifications.php:183
+msgid "Enter the name to register with the Growl server (default: PHP-Growl)."
+msgstr "Growlのサーバ( : PHP- Growlのデフォルト)に登録する名前を入力します。"
+
+#: usr/local/www/system_advanced_notifications.php:178
+#: usr/local/www/system_advanced_notifications.php:187
+#: usr/local/www/system_advanced_notifications.php:187
+msgid "Notification Name"
+msgstr "通知名"
+
+#: usr/local/www/system_advanced_notifications.php:181
+#: usr/local/www/system_advanced_notifications.php:190
+#: usr/local/www/system_advanced_notifications.php:190
+#, php-format
+msgid "Enter a name for the Growl notifications (default: %s growl alert)."
+msgstr "Growl通知( : %sうなり声アラートデフォルト)の名前を入力します。"
+
+#: usr/local/www/system_advanced_notifications.php:188
+#: usr/local/www/system_advanced_notifications.php:197
+#: usr/local/www/system_advanced_notifications.php:197
+msgid ""
+"This is the IP address that you would like to send growl notifications to."
+msgstr ""これはあなたがにGrowl通知を送信したいIPアドレスです。"
+
+#: usr/local/www/system_advanced_notifications.php:195
+#: usr/local/www/system_advanced_notifications.php:204
+#: usr/local/www/system_advanced_notifications.php:204
+msgid "Enter the password of the remote growl notification device."
+msgstr "リモートうなり声の通知デバイスのパスワードを入力します。"
+
+#: usr/local/www/system_advanced_notifications.php:203
+#: usr/local/www/system_advanced_notifications.php:212
+#: usr/local/www/system_advanced_notifications.php:212
+msgid "SMTP E-Mail"
+msgstr "SMTP電子メール"
+
+#: usr/local/www/system_advanced_notifications.php:206
+#: usr/local/www/system_advanced_notifications.php:215
+#: usr/local/www/system_advanced_notifications.php:215
+msgid "E-Mail server"
+msgstr "電子メールサーバー"
+
+#: usr/local/www/system_advanced_notifications.php:209
+#: usr/local/www/system_advanced_notifications.php:218
+#: usr/local/www/system_advanced_notifications.php:218
+msgid ""
+"This is the FQDN or IP address of the SMTP E-Mail server to which "
+"notifications will be sent."
+msgstr "通知が送信されます"これはするSMTP電子メールサーバのFQDNまたはIPアドレスです」 。"
+
+#: usr/local/www/system_advanced_notifications.php:213
+#: usr/local/www/system_advanced_notifications.php:222
+#: usr/local/www/system_advanced_notifications.php:222
+msgid "SMTP Port of E-Mail server"
+msgstr "電子メールサーバのSMTPポート"
+
+#: usr/local/www/system_advanced_notifications.php:217
+#: usr/local/www/system_advanced_notifications.php:226
+#: usr/local/www/system_advanced_notifications.php:226
+msgid ""
+"This is the port of the SMTP E-Mail server, typically 25, 587 (submission) "
+"or 465 (smtps, tick ssl/tls checkbox)"
+msgstr "または465 ( SMTPS 、ダニSSL / TLSチェックボックス) "これは、SMTP電子メールサーバーのポート、通常は25 、 587 (サブミッション)である""
+
+#: usr/local/www/system_advanced_notifications.php:221
+#: usr/local/www/system_advanced_notifications.php:230
+#: usr/local/www/system_advanced_notifications.php:230
+msgid "From e-mail address"
+msgstr "Eメールアドレスから"
+
+#: usr/local/www/system_advanced_notifications.php:224
+#: usr/local/www/system_advanced_notifications.php:233
+#: usr/local/www/system_advanced_notifications.php:233
+msgid "This is the e-mail address that will appear in the from field."
+msgstr "これはからのフィールドに表示される電子メールアドレスです。"
+
+#: usr/local/www/system_advanced_notifications.php:228
+#: usr/local/www/system_advanced_notifications.php:237
+#: usr/local/www/system_advanced_notifications.php:237
+msgid "Notification E-Mail address"
+msgstr "通知の電子メールアドレス"
+
+#: usr/local/www/system_advanced_notifications.php:231
+#: usr/local/www/system_advanced_notifications.php:240
+#: usr/local/www/system_advanced_notifications.php:240
+msgid ""
+"Enter the e-mail address that you would like email notifications sent to."
+msgstr "「あなたはに送られた電子メール通知をご希望のメールアドレスを入力してください。"
+
+#: usr/local/www/system_advanced_notifications.php:235
+#: usr/local/www/system_advanced_notifications.php:244
+#: usr/local/www/system_advanced_notifications.php:244
+msgid "Notification E-Mail auth username (optional)"
+msgstr "通知メールの認証のユーザ名(オプション)"
+
+#: usr/local/www/system_advanced_notifications.php:238
+#: usr/local/www/system_advanced_notifications.php:247
+#: usr/local/www/system_advanced_notifications.php:247
+msgid "Enter the e-mail address username for SMTP authentication."
+msgstr "SMTP認証用の電子メールアドレスのユーザー名を入力してください。"
+
+#: usr/local/www/system_advanced_notifications.php:242
+#: usr/local/www/system_advanced_notifications.php:251
+#: usr/local/www/system_advanced_notifications.php:251
+msgid "Notification E-Mail auth password"
+msgstr "通知メールの認証パスワード"
+
+#: usr/local/www/system_advanced_notifications.php:245
+#: usr/local/www/system_advanced_notifications.php:254
+#: usr/local/www/system_advanced_notifications.php:254
+msgid "Enter the e-mail address password for SMTP authentication."
+msgstr "SMTP認証用の電子メールアドレスのパスワードを入力します。"
+
+#: usr/local/www/system_advanced_sysctl.php:125
+#: usr/local/www/system_advanced_sysctl.php:125
+msgid "Advanced: System Tunables"
+msgstr "アドバンスト:システムチューニング可能"
+
+#: usr/local/www/system_advanced_sysctl.php:139
+#: usr/local/www/system_advanced_sysctl.php:139
+msgid ""
+"The firewall tunables have changed. You must apply the configuration to "
+"take affect."
+msgstr "「ファイアウォールの調整パラメータが変更されています。あなたがに設定を適用しなければならない」有効になります。"
+
+#: usr/local/www/system_advanced_sysctl.php:171
+#: usr/local/www/system_advanced_sysctl.php:171
+msgid "Tunable Name"
+msgstr "調整可能な名前"
+
+#: usr/local/www/system_advanced_sysctl.php:234
+#: usr/local/www/system_advanced_sysctl.php:234
+msgid "Edit system tunable"
+msgstr "編集システム調整"
+
+#: usr/local/www/system_advanced_sysctl.php:237
+#: usr/local/www/system_advanced_sysctl.php:237
+msgid "Tunable"
+msgstr "調節可能な"
+
+#: usr/local/www/system_authservers.php:44
+#: usr/local/www/system_authservers.php:44
+msgid "Authentication Servers"
+msgstr "認証サーバー"
+
+#: usr/local/www/system_authservers.php:83
+#: usr/local/www/system_authservers.php:84
+#: usr/local/www/system_authservers.php:84
+msgid "deleted"
+msgstr "削除された"
+
+#: usr/local/www/system_authservers.php:160
+#: usr/local/www/system_authservers.php:183
+#: usr/local/www/system_authservers.php:438
+#: usr/local/www/system_camanager.php:165
+#: usr/local/www/system_camanager.php:177
+#: usr/local/www/system_camanager.php:192
+#: usr/local/www/system_camanager.php:369
+#: usr/local/www/system_certmanager.php:164
+#: usr/local/www/system_certmanager.php:176
+#: usr/local/www/system_certmanager.php:193
+#: usr/local/www/system_certmanager.php:307
+#: usr/local/www/system_certmanager.php:495
+#: usr/local/www/system_certmanager.php:801
+#: usr/local/www/system_crlmanager.php:193
+#: usr/local/www/system_crlmanager.php:200
+#: usr/local/www/system_crlmanager.php:318
+#: usr/local/www/system_usermanager.php:189
+#: usr/local/www/system_usermanager.php:705
+#: usr/local/www/system_certmanager.php:192
+#: usr/local/www/system_certmanager.php:204
+#: usr/local/www/system_certmanager.php:222
+#: usr/local/www/system_certmanager.php:394
+#: usr/local/www/system_certmanager.php:594
+#: usr/local/www/system_certmanager.php:967
+#: usr/local/www/system_usermanager.php:703
+#: usr/local/www/system_crlmanager.php:192
+#: usr/local/www/system_crlmanager.php:199
+#: usr/local/www/system_crlmanager.php:319
+#: usr/local/www/system_crlmanager.php:404
+#: usr/local/www/system_authservers.php:161
+#: usr/local/www/system_authservers.php:184
+#: usr/local/www/system_authservers.php:443
+#: usr/local/www/system_camanager.php:167
+#: usr/local/www/system_camanager.php:179
+#: usr/local/www/system_camanager.php:194
+#: usr/local/www/system_camanager.php:376
+#: usr/local/www/system_certmanager.php:195
+#: usr/local/www/system_certmanager.php:207
+#: usr/local/www/system_certmanager.php:225
+#: usr/local/www/system_certmanager.php:403
+#: usr/local/www/system_certmanager.php:603
+#: usr/local/www/system_certmanager.php:1009
+#: usr/local/www/system_authservers.php:162
+#: usr/local/www/system_authservers.php:185
+#: usr/local/www/system_authservers.php:450
+#: usr/local/www/system_certmanager.php:604
+#: usr/local/www/system_certmanager.php:1013
+#: usr/local/www/system_camanager.php:167
+#: usr/local/www/system_camanager.php:179
+#: usr/local/www/system_camanager.php:194
+#: usr/local/www/system_camanager.php:376
+#: usr/local/www/system_certmanager.php:195
+#: usr/local/www/system_certmanager.php:207
+#: usr/local/www/system_certmanager.php:225
+#: usr/local/www/system_certmanager.php:403
+#: usr/local/www/system_certmanager.php:604
+#: usr/local/www/system_certmanager.php:1013
+#: usr/local/www/system_crlmanager.php:192
+#: usr/local/www/system_crlmanager.php:199
+#: usr/local/www/system_crlmanager.php:319
+#: usr/local/www/system_crlmanager.php:404
+#: usr/local/www/system_authservers.php:162
+#: usr/local/www/system_authservers.php:185
+#: usr/local/www/system_authservers.php:450
+#: usr/local/www/system_usermanager.php:189
+#: usr/local/www/system_usermanager.php:703
+msgid "Descriptive name"
+msgstr "記述名"
+
+#: usr/local/www/system_authservers.php:163
+#: usr/local/www/system_authservers.php:484
+#: usr/local/www/system_authservers.php:164
+#: usr/local/www/system_authservers.php:489
+#: usr/local/www/system_authservers.php:165
+#: usr/local/www/system_authservers.php:496
+#: usr/local/www/system_authservers.php:165
+#: usr/local/www/system_authservers.php:496
+msgid "Port value"
+msgstr "ポート値"
+
+#: usr/local/www/system_authservers.php:164
+#: usr/local/www/system_authservers.php:490
+#: usr/local/www/system_authservers.php:165
+#: usr/local/www/system_authservers.php:495
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:502
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:502
+msgid "Transport"
+msgstr "輸送"
+
+#: usr/local/www/system_authservers.php:165
+#: usr/local/www/system_authservers.php:526
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:531
+#: usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:538
+#: usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:538
+msgid "Protocol version"
+msgstr "プロトコルバージョン"
+
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:168
+#: usr/local/www/system_authservers.php:168
+msgid "Search level"
+msgstr "検索レベル"
+
+#: usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:168
+#: usr/local/www/system_authservers.php:169
+#: usr/local/www/system_authservers.php:169
+msgid "User naming Attribute"
+msgstr "ユーザーネーミング属性"
+
+#: usr/local/www/system_authservers.php:168
+#: usr/local/www/system_authservers.php:169
+#: usr/local/www/system_authservers.php:170
+#: usr/local/www/system_authservers.php:170
+msgid "Group naming Attribute"
+msgstr "グループのネーミング属性"
+
+#: usr/local/www/system_authservers.php:169
+#: usr/local/www/system_authservers.php:665
+#: usr/local/www/system_authservers.php:170
+#: usr/local/www/system_authservers.php:670
+#: usr/local/www/system_authservers.php:171
+#: usr/local/www/system_authservers.php:677
+#: usr/local/www/system_authservers.php:171
+#: usr/local/www/system_authservers.php:677
+msgid "Group member attribute"
+msgstr "グループメンバー属性"
+
+#: usr/local/www/system_authservers.php:170
+#: usr/local/www/system_authservers.php:171
+#: usr/local/www/system_authservers.php:172
+#: usr/local/www/system_authservers.php:172
+msgid "Authentication container"
+msgstr "認証コンテナ"
+
+#: usr/local/www/system_authservers.php:175
+#: usr/local/www/system_authservers.php:176
+#: usr/local/www/system_authservers.php:177
+#: usr/local/www/system_authservers.php:177
+msgid "Bind user DN"
+msgstr "バインドユーザーのDN"
+
+#: usr/local/www/system_authservers.php:176
+#: usr/local/www/system_authservers.php:177
+#: usr/local/www/system_authservers.php:178
+#: usr/local/www/system_authservers.php:178
+msgid "Bind Password"
+msgstr "バインドパスワード"
+
+#: usr/local/www/system_authservers.php:191
+#: usr/local/www/system_authservers.php:707
+#: usr/local/www/system_authservers.php:192
+#: usr/local/www/system_authservers.php:712
+#: usr/local/www/system_authservers.php:193
+#: usr/local/www/system_authservers.php:719
+#: usr/local/www/system_authservers.php:193
+#: usr/local/www/system_authservers.php:719
+msgid "Authentication port value"
+msgstr "認証ポートの値"
+
+#: usr/local/www/system_authservers.php:197
+#: usr/local/www/system_authservers.php:713
+#: usr/local/www/system_authservers.php:198
+#: usr/local/www/system_authservers.php:718
+#: usr/local/www/system_authservers.php:199
+#: usr/local/www/system_authservers.php:725
+#: usr/local/www/system_authservers.php:199
+#: usr/local/www/system_authservers.php:725
+msgid "Accounting port value"
+msgstr "会計ポート値"
+
+#: usr/local/www/system_authservers.php:202
+#: usr/local/www/system_authservers.php:686
+#: usr/local/www/system_authservers.php:203
+#: usr/local/www/system_authservers.php:691
+#: usr/local/www/system_authservers.php:204
+#: usr/local/www/system_authservers.php:698
+#: usr/local/www/system_authservers.php:204
+#: usr/local/www/system_authservers.php:698
+msgid "Shared Secret"
+msgstr "共有秘密鍵"
+
+#: usr/local/www/system_authservers.php:209
+#: usr/local/www/system_authservers.php:210
+#: usr/local/www/system_authservers.php:211
+#: usr/local/www/system_authservers.php:211
+msgid "The host name contains invalid characters."
+msgstr "ホスト名が無効な文字が含まれています。"
+
+#: usr/local/www/system_authservers.php:212
+#: usr/local/www/system_authservers.php:213
+#: usr/local/www/system_authservers.php:214
+#: usr/local/www/system_authservers.php:214
+msgid "An authentication server with the same name already exists."
+msgstr "同じ名前の認証サーバがすでに存在しています。"
+
+#: usr/local/www/system_authservers.php:382
+#: usr/local/www/system_authservers.php:383
+#: usr/local/www/system_authservers.php:390
+#: usr/local/www/system_authservers.php:390
+msgid "Please fill the required values."
+msgstr "必要な値を入力してください。"
+
+#: usr/local/www/system_authservers.php:388
+#: usr/local/www/system_authservers.php:389
+#: usr/local/www/system_authservers.php:396
+#: usr/local/www/system_authservers.php:396
+msgid "Please fill the bind username/password."
+msgstr "バインドユーザー名/パスワードを入力してください。"
+
+#: usr/local/www/system_authservers.php:406
+#: usr/local/www/system_usermanager_settings.php:103
+#: usr/local/www/system_authservers.php:411
+#: usr/local/www/system_authservers.php:418
+#: usr/local/www/system_usermanager_settings.php:104
+#: usr/local/www/system_authservers.php:418
+#: usr/local/www/system_usermanager_settings.php:104
+msgid "Popup blocker detected. Action aborted."
+msgstr "ポップアップブロッカーが検出されました。アクションが中止されました。"
+
+#: usr/local/www/system_authservers.php:475
+#: usr/local/www/system_authservers.php:480
+#: usr/local/www/system_authservers.php:487
+#: usr/local/www/system_authservers.php:487
+msgid "LDAP Server Settings"
+msgstr "LDAPサーバーの設定"
+
+#: usr/local/www/system_authservers.php:478
+#: usr/local/www/system_authservers.php:680
+#: usr/local/www/system_authservers.php:483
+#: usr/local/www/system_authservers.php:685
+#: usr/local/www/system_authservers.php:490
+#: usr/local/www/system_authservers.php:692
+#: usr/local/www/system_authservers.php:490
+#: usr/local/www/system_authservers.php:692
+msgid "Hostname or IP address"
+msgstr "ホスト名またはIPアドレス"
+
+#: usr/local/www/system_authservers.php:505
+#: usr/local/www/vpn_openvpn_client.php:629
+#: usr/local/www/vpn_openvpn_server.php:778
+#: usr/local/www/vpn_openvpn_server.php:851
+#: usr/local/www/vpn_openvpn_client.php:634
+#: usr/local/www/vpn_openvpn_server.php:879
+#: usr/local/www/vpn_openvpn_client.php:652
+#: usr/local/www/system_authservers.php:510
+#: usr/local/www/vpn_openvpn_client.php:671
+#: usr/local/www/system_authservers.php:517
+#: usr/local/www/vpn_openvpn_server.php:906
+#: usr/local/www/vpn_openvpn_client.php:671
+#: usr/local/www/system_authservers.php:517
+#: usr/local/www/vpn_openvpn_server.php:906
+msgid "Peer Certificate Authority"
+msgstr "認証局のピア"
+
+#: usr/local/www/system_authservers.php:518
+#: usr/local/www/system_authservers.php:523
+#: usr/local/www/system_authservers.php:530
+#: usr/local/www/system_authservers.php:530
+msgid "This option is used if 'SSL Encrypted' option is choosen."
+msgstr "「 SSL暗号化」オプションが選択済みされている場合、このオプションが使用されます。"
+
+#: usr/local/www/system_authservers.php:519
+#: usr/local/www/system_authservers.php:524
+#: usr/local/www/system_authservers.php:531
+#: usr/local/www/system_authservers.php:531
+msgid "It must match with the CA in the AD otherwise problems will arise."
+msgstr "そうでなければ、問題が発生します、ADにおけるCAと一致している必要があります。"
+
+#: usr/local/www/system_authservers.php:541
+#: usr/local/www/system_authservers.php:546
+#: usr/local/www/system_authservers.php:553
+#: usr/local/www/system_authservers.php:553
+msgid "Search scope"
+msgstr "検索範囲"
+
+#: usr/local/www/system_authservers.php:545
+#: usr/local/www/system_authservers.php:550
+#: usr/local/www/system_authservers.php:557
+#: usr/local/www/system_authservers.php:557
+msgid "Level:"
+msgstr "レベル:"
+
+#: usr/local/www/system_authservers.php:560
+#: usr/local/www/system_authservers.php:565
+#: usr/local/www/system_authservers.php:572
+#: usr/local/www/system_authservers.php:572
+msgid "Base DN:"
+msgstr "ベースDN :"
+
+#: usr/local/www/system_authservers.php:570
+#: usr/local/www/system_authservers.php:575
+#: usr/local/www/system_authservers.php:582
+#: usr/local/www/system_authservers.php:582
+msgid "Authentication containers"
+msgstr "認証コンテナ"
+
+#: usr/local/www/system_authservers.php:574
+#: usr/local/www/system_authservers.php:579
+#: usr/local/www/system_authservers.php:586
+#: usr/local/www/system_authservers.php:586
+msgid "Containers:"
+msgstr "コンテナ:"
+
+#: usr/local/www/system_authservers.php:578
+#: usr/local/www/system_authservers.php:583
+#: usr/local/www/system_authservers.php:590
+#: usr/local/www/system_authservers.php:590
+msgid ""
+"Note: Semi-Colon separated. This will be prepended to the search base dn "
+"above or you can specify full container path."
+msgstr ""注:セミコロン区切りこれは、検索ベースDNの前に追加されます。 「上や、フルコンテナのパスを指定することができます。"
+
+#: usr/local/www/system_authservers.php:579
+#: usr/local/www/system_authservers.php:584
+#: usr/local/www/system_authservers.php:591
+#: usr/local/www/system_authservers.php:591
+msgid "Example: CN=Users;DC=example"
+msgstr "例: CNは=ユーザー、 DC =例"
+
+#: usr/local/www/system_authservers.php:580
+#: usr/local/www/system_authservers.php:585
+#: usr/local/www/system_authservers.php:592
+#: usr/local/www/system_authservers.php:592
+msgid "Example: CN=Users,DC=example,DC=com;OU=OtherUsers,DC=example,DC=com "
+msgstr "例: CN =ユーザー、 DC =例、 DC = comの、 OU = OtherUsers 、 DC =例、 DC = comの"
+
+#: usr/local/www/system_authservers.php:587
+#: usr/local/www/system_authservers.php:592
+#: usr/local/www/system_authservers.php:599
+#: usr/local/www/system_authservers.php:599
+msgid "Extended Query"
+msgstr "拡張問い合わせ"
+
+#: usr/local/www/system_authservers.php:597
+#: usr/local/www/system_authservers.php:602
+#: usr/local/www/system_authservers.php:609
+#: usr/local/www/system_authservers.php:609
+msgid ""
+"Example: CN=Groupname,OU=MyGroups,DC=example,DC=com;OU=OtherUsers,DC=example,"
+"DC=com "
+msgstr "「例: CN =グループ名、 OU = MyGroups 、 DC =例、 DC = comの、 OU = OtherUsers 、 DC =例、 「DC = comの"
+
+#: usr/local/www/system_authservers.php:604
+#: usr/local/www/system_authservers.php:609
+#: usr/local/www/system_authservers.php:616
+#: usr/local/www/system_authservers.php:616
+msgid "Bind credentials"
+msgstr "資格をバインド"
+
+#: usr/local/www/system_authservers.php:612
+#: usr/local/www/system_authservers.php:617
+#: usr/local/www/system_authservers.php:624
+#: usr/local/www/system_authservers.php:624
+msgid "Use anonymous binds to resolve distinguished names"
+msgstr "識別名を解決するために匿名バインドを使用して、"
+
+#: usr/local/www/system_authservers.php:621
+#: usr/local/www/system_authservers.php:626
+#: usr/local/www/system_authservers.php:633
+#: usr/local/www/system_authservers.php:633
+msgid "User DN:"
+msgstr "ユーザーDN :"
+
+#: usr/local/www/system_authservers.php:637
+#: usr/local/www/system_authservers.php:642
+#: usr/local/www/system_authservers.php:649
+#: usr/local/www/system_authservers.php:649
+msgid "Initial Template"
+msgstr "初期テンプレート"
+
+#: usr/local/www/system_authservers.php:653
+#: usr/local/www/system_authservers.php:658
+#: usr/local/www/system_authservers.php:665
+#: usr/local/www/system_authservers.php:665
+msgid "User naming attribute"
+msgstr "ユーザーネーミング属性"
+
+#: usr/local/www/system_authservers.php:659
+#: usr/local/www/system_authservers.php:664
+#: usr/local/www/system_authservers.php:671
+#: usr/local/www/system_authservers.php:671
+msgid "Group naming attribute"
+msgstr "グループのネーミング属性"
+
+#: usr/local/www/system_authservers.php:677
+#: usr/local/www/system_authservers.php:682
+#: usr/local/www/system_authservers.php:689
+#: usr/local/www/system_authservers.php:689
+msgid "Radius Server Settings"
+msgstr "RADIUSサーバの設定"
+
+#: usr/local/www/system_authservers.php:692
+#: usr/local/www/system_authservers.php:697
+#: usr/local/www/system_authservers.php:704
+#: usr/local/www/system_authservers.php:704
+msgid "Services offered"
+msgstr "提供するサービス"
+
+#: usr/local/www/system_authservers.php:737
+#: usr/local/www/system_authservers.php:743
+#: usr/local/www/system_authservers.php:759
+#: usr/local/www/system_authservers.php:759
+msgid "Server Name"
+msgstr "サーバー名"
+
+#: usr/local/www/system_authservers.php:739
+#: usr/local/www/system_authservers.php:745
+#: usr/local/www/system_authservers.php:761 usr/local/www/diag_dns.php:154
+#: usr/local/www/system_authservers.php:761 usr/local/www/diag_dns.php:154
+msgid "Host Name"
+msgstr "ホスト名"
+
+#: usr/local/www/system_authservers.php:756
+#: usr/local/www/vpn_openvpn_server.php:1479
+#: usr/local/www/vpn_openvpn_server.php:1621
+#: usr/local/www/vpn_openvpn_server.php:1662
+#: usr/local/www/system_authservers.php:764
+#: usr/local/www/system_authservers.php:780
+#: usr/local/www/vpn_openvpn_server.php:1714
+#: usr/local/www/system_authservers.php:797
+#: usr/local/www/system_authservers.php:797
+#: usr/local/www/vpn_openvpn_server.php:1714
+msgid "edit server"
+msgstr "サーバーの編集"
+
+#: usr/local/www/system_authservers.php:759
+#: usr/local/www/system_authservers.php:767
+#: usr/local/www/system_authservers.php:783
+#: usr/local/www/system_authservers.php:800
+#: usr/local/www/system_authservers.php:800
+msgid "Do you really want to delete this Server?"
+msgstr "あなたは本当に、このサーバを削除しますか?"
+
+#: usr/local/www/system_authservers.php:760
+#: usr/local/www/vpn_openvpn_server.php:1483
+#: usr/local/www/vpn_openvpn_server.php:1625
+#: usr/local/www/vpn_openvpn_server.php:1666
+#: usr/local/www/system_authservers.php:768
+#: usr/local/www/system_authservers.php:784
+#: usr/local/www/vpn_openvpn_server.php:1718
+#: usr/local/www/system_authservers.php:801
+#: usr/local/www/system_authservers.php:801
+#: usr/local/www/vpn_openvpn_server.php:1718
+msgid "delete server"
+msgstr "サーバを削除"
+
+#: usr/local/www/system_authservers.php:772
+#: usr/local/www/vpn_openvpn_server.php:1496
+#: usr/local/www/vpn_openvpn_server.php:1638
+#: usr/local/www/vpn_openvpn_server.php:1679
+#: usr/local/www/system_authservers.php:782
+#: usr/local/www/system_authservers.php:798
+#: usr/local/www/vpn_openvpn_server.php:1731
+#: usr/local/www/system_authservers.php:770
+#: usr/local/www/system_authservers.php:770
+#: usr/local/www/vpn_openvpn_server.php:1731
+msgid "add server"
+msgstr "サーバーを追加"
+
+#: usr/local/www/system_authservers.php:779
+#: usr/local/www/system_authservers.php:789
+#: usr/local/www/system_authservers.php:805
+#: usr/local/www/system_authservers.php:777
+#: usr/local/www/system_authservers.php:777
+msgid "Additional authentication servers can be added here."
+msgstr "追加の認証サーバは、ここで追加することができる。"
+
+#: usr/local/www/system_camanager.php:44 usr/local/www/system_camanager.php:44
+msgid "Import an existing Certificate Authority"
+msgstr "既存の認証局をインポートする"
+
+#: usr/local/www/system_camanager.php:45 usr/local/www/system_camanager.php:45
+msgid "Create an internal Certificate Authority"
+msgstr "内部認証局を作成する"
+
+#: usr/local/www/system_camanager.php:46 usr/local/www/system_camanager.php:46
+msgid "Create an intermediate Certificate Authority"
+msgstr "中間認証局を作成する"
+
+#: usr/local/www/system_camanager.php:50 usr/local/www/system_camanager.php:51
+#: usr/local/www/system_camanager.php:51
+msgid "Certificate Authority Manager"
+msgstr "認証局マネージャー"
+
+#: usr/local/www/system_camanager.php:95 usr/local/www/system_camanager.php:96
+#: usr/local/www/system_camanager.php:96
+#, php-format
+msgid "Certificate Authority %s and its CRLs (if any) successfully deleted"
+msgstr "認証局は%sとそのCRLは、 (もしあれば)正常に削除"
+
+#: usr/local/www/system_camanager.php:166
+#: usr/local/www/system_camanager.php:402
+#: usr/local/www/system_certmanager.php:165
+#: usr/local/www/system_certmanager.php:511
+#: usr/local/www/system_certmanager.php:193
+#: usr/local/www/system_certmanager.php:610
+#: usr/local/www/system_camanager.php:168
+#: usr/local/www/system_camanager.php:409
+#: usr/local/www/system_certmanager.php:196
+#: usr/local/www/system_certmanager.php:619
+#: usr/local/www/system_certmanager.php:620
+#: usr/local/www/system_camanager.php:168
+#: usr/local/www/system_camanager.php:409
+#: usr/local/www/system_certmanager.php:196
+#: usr/local/www/system_certmanager.php:620
+msgid "Certificate data"
+msgstr "証明書データ"
+
+#: usr/local/www/system_camanager.php:170
+#: usr/local/www/system_camanager.php:172
+#: usr/local/www/system_camanager.php:172
+msgid "Encrypted private keys are not yet supported."
+msgstr "暗号化された秘密鍵は、まだサポートされていません。"
+
+#: usr/local/www/system_camanager.php:178
+#: usr/local/www/system_camanager.php:194
+#: usr/local/www/system_camanager.php:453
+#: usr/local/www/system_certmanager.php:178
+#: usr/local/www/system_certmanager.php:194
+#: usr/local/www/system_certmanager.php:566
+#: usr/local/www/system_certmanager.php:656
+#: usr/local/www/system_usermanager.php:191
+#: usr/local/www/system_usermanager.php:725
+#: usr/local/www/system_certmanager.php:206
+#: usr/local/www/system_certmanager.php:223
+#: usr/local/www/system_certmanager.php:665
+#: usr/local/www/system_certmanager.php:820
+#: usr/local/www/system_usermanager.php:723
+#: usr/local/www/system_camanager.php:454
+#: usr/local/www/system_camanager.php:180
+#: usr/local/www/system_camanager.php:196
+#: usr/local/www/system_camanager.php:461
+#: usr/local/www/system_certmanager.php:209
+#: usr/local/www/system_certmanager.php:226
+#: usr/local/www/system_certmanager.php:674
+#: usr/local/www/system_certmanager.php:845
+#: usr/local/www/system_certmanager.php:675
+#: usr/local/www/system_certmanager.php:849
+#: usr/local/www/system_camanager.php:180
+#: usr/local/www/system_camanager.php:196
+#: usr/local/www/system_camanager.php:461
+#: usr/local/www/system_certmanager.php:209
+#: usr/local/www/system_certmanager.php:226
+#: usr/local/www/system_certmanager.php:675
+#: usr/local/www/system_certmanager.php:849
+#: usr/local/www/system_usermanager.php:191
+#: usr/local/www/system_usermanager.php:723
+msgid "Key length"
+msgstr "キーの長さ"
+
+#: usr/local/www/system_camanager.php:179
+#: usr/local/www/system_camanager.php:195
+#: usr/local/www/system_camanager.php:469
+#: usr/local/www/system_certmanager.php:179
+#: usr/local/www/system_certmanager.php:582
+#: usr/local/www/system_crlmanager.php:366
+#: usr/local/www/system_usermanager.php:192
+#: usr/local/www/system_usermanager.php:739
+#: usr/local/www/vpn_ipsec_phase1.php:758
+#: usr/local/www/vpn_ipsec_phase2.php:619
+#: usr/local/www/system_certmanager.php:208
+#: usr/local/www/system_certmanager.php:698
+#: usr/local/www/system_usermanager.php:737
+#: usr/local/www/system_camanager.php:470
+#: usr/local/www/vpn_ipsec_phase2.php:645
+#: usr/local/www/vpn_ipsec_phase1.php:771
+#: usr/local/www/system_crlmanager.php:367
+#: usr/local/www/vpn_ipsec_phase2.php:741
+#: usr/local/www/vpn_ipsec_phase1.php:768
+#: usr/local/www/system_camanager.php:181
+#: usr/local/www/system_camanager.php:197
+#: usr/local/www/system_camanager.php:493
+#: usr/local/www/system_certmanager.php:211
+#: usr/local/www/system_certmanager.php:723
+#: usr/local/www/vpn_ipsec_phase1.php:789
+#: usr/local/www/vpn_ipsec_phase2.php:762
+#: usr/local/www/system_certmanager.php:724
+#: usr/local/www/system_camanager.php:181
+#: usr/local/www/system_camanager.php:197
+#: usr/local/www/system_camanager.php:493
+#: usr/local/www/system_certmanager.php:211
+#: usr/local/www/system_certmanager.php:724
+#: usr/local/www/system_crlmanager.php:367
+#: usr/local/www/vpn_ipsec_phase1.php:789
+#: usr/local/www/system_usermanager.php:192
+#: usr/local/www/system_usermanager.php:737
+#: usr/local/www/vpn_ipsec_phase2.php:762
+msgid "Lifetime"
+msgstr "一生"
+
+#: usr/local/www/system_camanager.php:180
+#: usr/local/www/system_camanager.php:196
+#: usr/local/www/system_certmanager.php:180
+#: usr/local/www/system_certmanager.php:195
+#: usr/local/www/system_certmanager.php:209
+#: usr/local/www/system_certmanager.php:224
+#: usr/local/www/system_camanager.php:182
+#: usr/local/www/system_camanager.php:198
+#: usr/local/www/system_certmanager.php:212
+#: usr/local/www/system_certmanager.php:227
+#: usr/local/www/system_camanager.php:182
+#: usr/local/www/system_camanager.php:198
+#: usr/local/www/system_certmanager.php:212
+#: usr/local/www/system_certmanager.php:227
+msgid "Distinguished name Country Code"
+msgstr "識別名の国コード"
+
+#: usr/local/www/system_camanager.php:181
+#: usr/local/www/system_camanager.php:197
+#: usr/local/www/system_certmanager.php:181
+#: usr/local/www/system_certmanager.php:196
+#: usr/local/www/system_certmanager.php:210
+#: usr/local/www/system_certmanager.php:225
+#: usr/local/www/system_camanager.php:183
+#: usr/local/www/system_camanager.php:199
+#: usr/local/www/system_certmanager.php:213
+#: usr/local/www/system_certmanager.php:228
+#: usr/local/www/system_camanager.php:183
+#: usr/local/www/system_camanager.php:199
+#: usr/local/www/system_certmanager.php:213
+#: usr/local/www/system_certmanager.php:228
+msgid "Distinguished name State or Province"
+msgstr "識別名の都道府県"
+
+#: usr/local/www/system_camanager.php:182
+#: usr/local/www/system_camanager.php:198
+#: usr/local/www/system_certmanager.php:182
+#: usr/local/www/system_certmanager.php:197
+#: usr/local/www/system_certmanager.php:211
+#: usr/local/www/system_certmanager.php:226
+#: usr/local/www/system_camanager.php:184
+#: usr/local/www/system_camanager.php:200
+#: usr/local/www/system_certmanager.php:214
+#: usr/local/www/system_certmanager.php:229
+#: usr/local/www/system_camanager.php:184
+#: usr/local/www/system_camanager.php:200
+#: usr/local/www/system_certmanager.php:214
+#: usr/local/www/system_certmanager.php:229
+msgid "Distinguished name City"
+msgstr "識別名市"
+
+#: usr/local/www/system_camanager.php:183
+#: usr/local/www/system_camanager.php:199
+#: usr/local/www/system_certmanager.php:183
+#: usr/local/www/system_certmanager.php:198
+#: usr/local/www/system_certmanager.php:212
+#: usr/local/www/system_certmanager.php:227
+#: usr/local/www/system_camanager.php:185
+#: usr/local/www/system_camanager.php:201
+#: usr/local/www/system_certmanager.php:215
+#: usr/local/www/system_certmanager.php:230
+#: usr/local/www/system_camanager.php:185
+#: usr/local/www/system_camanager.php:201
+#: usr/local/www/system_certmanager.php:215
+#: usr/local/www/system_certmanager.php:230
+msgid "Distinguished name Organization"
+msgstr "識別名組織"
+
+#: usr/local/www/system_camanager.php:184
+#: usr/local/www/system_camanager.php:200
+#: usr/local/www/system_certmanager.php:184
+#: usr/local/www/system_certmanager.php:199
+#: usr/local/www/system_certmanager.php:213
+#: usr/local/www/system_certmanager.php:228
+#: usr/local/www/system_camanager.php:186
+#: usr/local/www/system_camanager.php:202
+#: usr/local/www/system_certmanager.php:216
+#: usr/local/www/system_certmanager.php:231
+#: usr/local/www/system_camanager.php:186
+#: usr/local/www/system_camanager.php:202
+#: usr/local/www/system_certmanager.php:216
+#: usr/local/www/system_certmanager.php:231
+msgid "Distinguished name Email Address"
+msgstr "識別名のメールアドレス"
+
+#: usr/local/www/system_camanager.php:185
+#: usr/local/www/system_camanager.php:201
+#: usr/local/www/system_certmanager.php:185
+#: usr/local/www/system_certmanager.php:200
+#: usr/local/www/system_certmanager.php:214
+#: usr/local/www/system_certmanager.php:229
+#: usr/local/www/system_camanager.php:187
+#: usr/local/www/system_camanager.php:203
+#: usr/local/www/system_certmanager.php:217
+#: usr/local/www/system_certmanager.php:232
+#: usr/local/www/system_camanager.php:187
+#: usr/local/www/system_camanager.php:203
+#: usr/local/www/system_certmanager.php:217
+#: usr/local/www/system_certmanager.php:232
+msgid "Distinguished name Common Name"
+msgstr "識別名共通名"
+
+#: usr/local/www/system_camanager.php:193
+#: usr/local/www/system_camanager.php:436
+#: usr/local/www/system_camanager.php:437
+#: usr/local/www/system_camanager.php:195
+#: usr/local/www/system_camanager.php:444
+#: usr/local/www/system_camanager.php:195
+#: usr/local/www/system_camanager.php:444
+msgid "Signing Certificate Authority"
+msgstr "認証局の署名"
+
+#: usr/local/www/system_camanager.php:348
+#: usr/local/www/system_certmanager.php:458
+#: usr/local/www/system_crlmanager.php:283
+#: usr/local/www/system_certmanager.php:557
+#: usr/local/www/system_crlmanager.php:284
+#: usr/local/www/system_camanager.php:355
+#: usr/local/www/system_certmanager.php:566
+#: usr/local/www/system_certmanager.php:567
+#: usr/local/www/system_camanager.php:355
+#: usr/local/www/system_certmanager.php:567
+#: usr/local/www/system_crlmanager.php:284
+msgid "CAs"
+msgstr "CAは"
+
+#: usr/local/www/system_camanager.php:349
+#: usr/local/www/system_camanager.php:568
+#: usr/local/www/system_certmanager.php:459
+#: usr/local/www/system_crlmanager.php:284
+#: usr/local/www/system_crlmanager.php:489
+#: usr/local/www/system_certmanager.php:558
+#: usr/local/www/system_camanager.php:569
+#: usr/local/www/system_crlmanager.php:285
+#: usr/local/www/system_crlmanager.php:522
+#: usr/local/www/system_camanager.php:356
+#: usr/local/www/system_camanager.php:593
+#: usr/local/www/system_certmanager.php:567
+#: usr/local/www/system_certmanager.php:568
+#: usr/local/www/system_camanager.php:356
+#: usr/local/www/system_camanager.php:593
+#: usr/local/www/system_certmanager.php:568
+#: usr/local/www/system_crlmanager.php:285
+#: usr/local/www/system_crlmanager.php:522
+msgid "Certificates"
+msgstr "証明書"
+
+#: usr/local/www/system_camanager.php:350
+#: usr/local/www/system_certmanager.php:460
+#: usr/local/www/system_crlmanager.php:285
+#: usr/local/www/system_certmanager.php:559
+#: usr/local/www/system_crlmanager.php:286
+#: usr/local/www/system_camanager.php:357
+#: usr/local/www/system_certmanager.php:568
+#: usr/local/www/system_certmanager.php:569
+#: usr/local/www/system_camanager.php:357
+#: usr/local/www/system_certmanager.php:569
+#: usr/local/www/system_crlmanager.php:286
+msgid "Certificate Revocation"
+msgstr "証明書失効"
+
+#: usr/local/www/system_camanager.php:376
+#: usr/local/www/system_certmanager.php:475
+#: usr/local/www/system_crlmanager.php:300
+#: usr/local/www/system_certmanager.php:574
+#: usr/local/www/system_crlmanager.php:301
+#: usr/local/www/system_camanager.php:383
+#: usr/local/www/system_certmanager.php:583
+#: usr/local/www/system_certmanager.php:584
+#: usr/local/www/system_camanager.php:383
+#: usr/local/www/system_certmanager.php:584
+#: usr/local/www/system_crlmanager.php:301
+msgid "Method"
+msgstr "方法"
+
+#: usr/local/www/system_camanager.php:398
+#: usr/local/www/system_camanager.php:405
+#: usr/local/www/system_camanager.php:405
+msgid "Existing Certificate Authority"
+msgstr "既存の認証局"
+
+#: usr/local/www/system_camanager.php:410
+#: usr/local/www/system_camanager.php:417
+#: usr/local/www/system_camanager.php:417
+msgid "Certificate Private Key"
+msgstr "証明書の秘密鍵"
+
+#: usr/local/www/system_camanager.php:410
+#: usr/local/www/system_camanager.php:417
+#: usr/local/www/system_camanager.php:417
+msgid "(optional)"
+msgstr "(オプション)"
+
+#: usr/local/www/system_camanager.php:414
+#: usr/local/www/system_camanager.php:421
+#: usr/local/www/system_camanager.php:421
+msgid ""
+"Paste the private key for the above certificate here. This is optional in "
+"most cases, but required if you need to generate a Certificate Revocation "
+"List (CRL)."
+msgstr "ほとんどの場合、「ここに上記の証明書の秘密鍵をペーストします。これは、オプションのある「しかし、あなたが証明書失効」リスト( CRL)を生成する必要がある場合に必要。"
+
+#: usr/local/www/system_camanager.php:420
+#: usr/local/www/system_crlmanager.php:374
+#: usr/local/www/system_crlmanager.php:375
+#: usr/local/www/system_crlmanager.php:375
+msgid "Serial"
+msgstr "シリアル"
+
+#: usr/local/www/system_camanager.php:433
+#: usr/local/www/system_camanager.php:434
+#: usr/local/www/system_camanager.php:441
+#: usr/local/www/system_camanager.php:441
+msgid "Internal Certificate Authority"
+msgstr "内部認証局"
+
+#: usr/local/www/system_camanager.php:472
+#: usr/local/www/system_certmanager.php:585
+#: usr/local/www/system_crlmanager.php:369
+#: usr/local/www/system_certmanager.php:701
+#: usr/local/www/system_camanager.php:473
+#: usr/local/www/system_crlmanager.php:370
+#: usr/local/www/system_camanager.php:496
+#: usr/local/www/system_certmanager.php:726
+#: usr/local/www/system_certmanager.php:727
+#: usr/local/www/system_camanager.php:496
+#: usr/local/www/system_certmanager.php:727
+#: usr/local/www/system_crlmanager.php:370
+msgid "days"
+msgstr "日"
+
+#: usr/local/www/system_camanager.php:480
+#: usr/local/www/system_certmanager.php:593
+#: usr/local/www/system_certmanager.php:676
+#: usr/local/www/system_certmanager.php:709
+#: usr/local/www/system_certmanager.php:842
+#: usr/local/www/system_camanager.php:481
+#: usr/local/www/system_camanager.php:504
+#: usr/local/www/system_certmanager.php:734
+#: usr/local/www/system_certmanager.php:883
+#: usr/local/www/system_certmanager.php:735
+#: usr/local/www/system_certmanager.php:887
+#: usr/local/www/system_camanager.php:504
+#: usr/local/www/system_certmanager.php:735
+#: usr/local/www/system_certmanager.php:887
+msgid "Country Code"
+msgstr "国コード"
+
+#: usr/local/www/system_camanager.php:494
+#: usr/local/www/system_certmanager.php:599
+#: usr/local/www/system_certmanager.php:690
+#: usr/local/www/system_certmanager.php:715
+#: usr/local/www/system_certmanager.php:856
+#: usr/local/www/system_camanager.php:495
+#: usr/local/www/system_camanager.php:519
+#: usr/local/www/system_certmanager.php:740
+#: usr/local/www/system_certmanager.php:898
+#: usr/local/www/system_certmanager.php:741
+#: usr/local/www/system_certmanager.php:902
+#: usr/local/www/system_camanager.php:519
+#: usr/local/www/system_certmanager.php:741
+#: usr/local/www/system_certmanager.php:902
+msgid "State or Province"
+msgstr "州または県"
+
+#: usr/local/www/system_camanager.php:498
+#: usr/local/www/system_camanager.php:508
+#: usr/local/www/system_camanager.php:518
+#: usr/local/www/system_camanager.php:528
+#: usr/local/www/system_camanager.php:538
+#: usr/local/www/system_camanager.php:499
+#: usr/local/www/system_camanager.php:509
+#: usr/local/www/system_camanager.php:519
+#: usr/local/www/system_camanager.php:529
+#: usr/local/www/system_camanager.php:539
+#: usr/local/www/system_camanager.php:523
+#: usr/local/www/system_camanager.php:533
+#: usr/local/www/system_camanager.php:543
+#: usr/local/www/system_camanager.php:553
+#: usr/local/www/system_camanager.php:563
+#: usr/local/www/system_camanager.php:523
+#: usr/local/www/system_camanager.php:533
+#: usr/local/www/system_camanager.php:543
+#: usr/local/www/system_camanager.php:553
+#: usr/local/www/system_camanager.php:563
+msgid "ex:"
+msgstr "例:"
+
+#: usr/local/www/system_camanager.php:500
+#: usr/local/www/system_certmanager.php:696
+#: usr/local/www/system_certmanager.php:862
+#: usr/local/www/system_camanager.php:501
+#: usr/local/www/system_camanager.php:525
+#: usr/local/www/system_certmanager.php:904
+#: usr/local/www/system_certmanager.php:908
+#: usr/local/www/system_camanager.php:525
+#: usr/local/www/system_certmanager.php:908
+msgid "Texas"
+msgstr "テキサス州"
+
+#: usr/local/www/system_camanager.php:504
+#: usr/local/www/system_certmanager.php:605
+#: usr/local/www/system_certmanager.php:700
+#: usr/local/www/system_certmanager.php:721
+#: usr/local/www/system_certmanager.php:866
+#: usr/local/www/system_camanager.php:505
+#: usr/local/www/system_camanager.php:529
+#: usr/local/www/system_certmanager.php:746
+#: usr/local/www/system_certmanager.php:908
+#: usr/local/www/system_certmanager.php:747
+#: usr/local/www/system_certmanager.php:912
+#: usr/local/www/system_camanager.php:529
+#: usr/local/www/system_certmanager.php:747
+#: usr/local/www/system_certmanager.php:912
+msgid "City"
+msgstr "都市"
+
+#: usr/local/www/system_camanager.php:510
+#: usr/local/www/system_certmanager.php:706
+#: usr/local/www/system_certmanager.php:872
+#: usr/local/www/system_camanager.php:511
+#: usr/local/www/system_camanager.php:535
+#: usr/local/www/system_certmanager.php:914
+#: usr/local/www/system_certmanager.php:918
+#: usr/local/www/system_camanager.php:535
+#: usr/local/www/system_certmanager.php:918
+msgid "Austin"
+msgstr "オースティン"
+
+#: usr/local/www/system_camanager.php:514
+#: usr/local/www/system_certmanager.php:611
+#: usr/local/www/system_certmanager.php:710
+#: usr/local/www/system_certmanager.php:727
+#: usr/local/www/system_certmanager.php:876
+#: usr/local/www/system_camanager.php:515
+#: usr/local/www/system_camanager.php:539
+#: usr/local/www/system_certmanager.php:752
+#: usr/local/www/system_certmanager.php:918
+#: usr/local/www/system_certmanager.php:753
+#: usr/local/www/system_certmanager.php:922
+#: usr/local/www/system_camanager.php:539
+#: usr/local/www/system_certmanager.php:753
+#: usr/local/www/system_certmanager.php:922
+msgid "Organization"
+msgstr "組織"
+
+#: usr/local/www/system_camanager.php:520
+#: usr/local/www/system_certmanager.php:716
+#: usr/local/www/system_certmanager.php:882
+#: usr/local/www/system_camanager.php:521
+#: usr/local/www/system_camanager.php:545
+#: usr/local/www/system_certmanager.php:924
+#: usr/local/www/system_certmanager.php:928
+#: usr/local/www/system_camanager.php:545
+#: usr/local/www/system_certmanager.php:928
+msgid "My Company Inc."
+msgstr "私の会社(株)"
+
+#: usr/local/www/system_camanager.php:530
+#: usr/local/www/system_camanager.php:531
+#: usr/local/www/system_camanager.php:555
+#: usr/local/www/system_camanager.php:555
+msgid "admin@mycompany.com"
+msgstr "admin@mycompany.com"
+
+#: usr/local/www/system_camanager.php:540
+#: usr/local/www/system_camanager.php:541
+#: usr/local/www/system_camanager.php:565
+#: usr/local/www/system_camanager.php:565
+msgid "internal-ca"
+msgstr "内部CA"
+
+#: usr/local/www/system_camanager.php:566
+#: usr/local/www/system_crlmanager.php:488
+#: usr/local/www/system_camanager.php:567
+#: usr/local/www/system_crlmanager.php:521
+#: usr/local/www/system_camanager.php:591
+#: usr/local/www/system_camanager.php:591
+#: usr/local/www/system_crlmanager.php:521
+msgid "Internal"
+msgstr "内部"
+
+#: usr/local/www/system_camanager.php:567
+#: usr/local/www/system_certmanager.php:855
+#: usr/local/www/system_certmanager.php:1021
+#: usr/local/www/system_camanager.php:568
+#: usr/local/www/system_camanager.php:592
+#: usr/local/www/system_certmanager.php:1063
+#: usr/local/www/system_certmanager.php:1067
+#: usr/local/www/system_camanager.php:592
+#: usr/local/www/system_certmanager.php:1067
+msgid "Issuer"
+msgstr "発行者"
+
+#: usr/local/www/system_camanager.php:569
+#: usr/local/www/system_certmanager.php:856
+#: usr/local/www/system_certmanager.php:1022
+#: usr/local/www/system_camanager.php:570
+#: usr/local/www/system_camanager.php:594
+#: usr/local/www/system_certmanager.php:1064
+#: usr/local/www/system_certmanager.php:1068
+#: usr/local/www/system_camanager.php:594
+#: usr/local/www/system_certmanager.php:1068
+msgid "Distinguished Name"
+msgstr "識別名"
+
+#: usr/local/www/system_camanager.php:579
+#: usr/local/www/system_certmanager.php:869
+#: usr/local/www/system_certmanager.php:1036
+#: usr/local/www/system_camanager.php:580
+#: usr/local/www/system_camanager.php:605
+#: usr/local/www/system_certmanager.php:1079
+#: usr/local/www/system_certmanager.php:1083
+#: usr/local/www/system_camanager.php:605
+#: usr/local/www/system_certmanager.php:1083
+msgid "self-signed"
+msgstr "自己署名"
+
+#: usr/local/www/system_camanager.php:581
+#: usr/local/www/system_certmanager.php:871
+#: usr/local/www/system_certmanager.php:1038
+#: usr/local/www/system_camanager.php:582
+#: usr/local/www/system_camanager.php:607
+#: usr/local/www/system_certmanager.php:1081
+#: usr/local/www/system_certmanager.php:1085
+#: usr/local/www/system_camanager.php:607
+#: usr/local/www/system_certmanager.php:1085
+msgid "external"
+msgstr "外部"
+
+#: usr/local/www/system_camanager.php:626
+#: usr/local/www/system_camanager.php:627
+#: usr/local/www/system_camanager.php:665
+#: usr/local/www/system_camanager.php:665
+msgid "edit CA"
+msgstr "カリフォルニア州の編集"
+
+#: usr/local/www/system_camanager.php:629
+#: usr/local/www/system_camanager.php:630
+#: usr/local/www/system_camanager.php:668
+#: usr/local/www/system_camanager.php:668
+msgid "export CA cert"
+msgstr "輸出CA証明書"
+
+#: usr/local/www/system_camanager.php:633
+#: usr/local/www/system_camanager.php:634
+#: usr/local/www/system_camanager.php:672
+#: usr/local/www/system_camanager.php:672
+msgid "export CA private key"
+msgstr "輸出CA秘密鍵"
+
+#: usr/local/www/system_camanager.php:636
+#: usr/local/www/system_camanager.php:637
+#: usr/local/www/system_camanager.php:675
+#: usr/local/www/system_camanager.php:675
+msgid ""
+"Do you really want to delete this Certificate Authority and its CRLs, and "
+"unreference any associated certificates?"
+msgstr "「あなたは本当にこの認証局とそのCRLを削除したい、とない "任意の関連の証明書非参照?"
+
+#: usr/local/www/system_camanager.php:637
+#: usr/local/www/system_camanager.php:638
+#: usr/local/www/system_camanager.php:676
+#: usr/local/www/system_camanager.php:676
+msgid "delete ca"
+msgstr "CAを削除"
+
+#: usr/local/www/system_camanager.php:649
+#: usr/local/www/system_certmanager.php:952
+#: usr/local/www/system_certmanager.php:1132
+#: usr/local/www/system_camanager.php:650
+#: usr/local/www/system_certmanager.php:1135
+#: usr/local/www/system_camanager.php:688
+#: usr/local/www/system_certmanager.php:1191
+#: usr/local/www/system_certmanager.php:1195
+#: usr/local/www/system_camanager.php:688
+#: usr/local/www/system_certmanager.php:1195
+msgid "add or import ca"
+msgstr "CAを追加またはインポートする"
+
+#: usr/local/www/system_camanager.php:649
+#: usr/local/www/system_certmanager.php:952
+#: usr/local/www/system_certmanager.php:1132
+#: usr/local/www/system_camanager.php:650
+#: usr/local/www/system_certmanager.php:1135
+#: usr/local/www/system_camanager.php:688
+#: usr/local/www/system_certmanager.php:1191
+#: usr/local/www/system_certmanager.php:1195
+#: usr/local/www/system_camanager.php:688
+#: usr/local/www/system_certmanager.php:1195
+msgid "add ca"
+msgstr "CAを追加"
+
+#: usr/local/www/system_camanager.php:656
+#: usr/local/www/system_camanager.php:657
+#: usr/local/www/system_camanager.php:695
+#: usr/local/www/system_camanager.php:695
+msgid "Additional trusted Certificate Authorities can be added here."
+msgstr "追加の信頼できる認証局は、ここで追加することができます。"
+
+#: usr/local/www/system_certmanager.php:44
+#: usr/local/www/system_certmanager.php:44
+msgid "Import an existing Certificate"
+msgstr "既存の証明書をインポートする"
+
+#: usr/local/www/system_certmanager.php:45
+#: usr/local/www/system_certmanager.php:45
+msgid "Create an internal Certificate"
+msgstr "内部証明書を作成します。"
+
+#: usr/local/www/system_certmanager.php:46
+#: usr/local/www/system_certmanager.php:46
+msgid "Create a Certificate Signing Request"
+msgstr "証明書署名要求を作成します。"
+
+#: usr/local/www/system_certmanager.php:51
+#: usr/local/www/system_certmanager.php:56
+#: usr/local/www/system_certmanager.php:57
+#: usr/local/www/system_certmanager.php:57
+msgid "Certificate Manager"
+msgstr "証明書マネージャ"
+
+#: usr/local/www/system_certmanager.php:57
+#: usr/local/www/system_certmanager.php:62
+#: usr/local/www/system_certmanager.php:63
+#: usr/local/www/system_certmanager.php:63
+msgid "Choose an existing certificate"
+msgstr "既存の証明書を選択してください"
+
+#: usr/local/www/system_certmanager.php:96
+#: usr/local/www/system_certmanager.php:101
+#: usr/local/www/system_certmanager.php:102
+#: usr/local/www/system_certmanager.php:102
+#, php-format
+msgid "Certificate %s successfully deleted"
+msgstr "正常に削除された証明書%s"
+
+#: usr/local/www/system_certmanager.php:166
+#: usr/local/www/system_certmanager.php:194
+#: usr/local/www/system_certmanager.php:197
+#: usr/local/www/system_certmanager.php:197
+msgid "Key data"
+msgstr "重要なデータ"
+
+#: usr/local/www/system_certmanager.php:177
+#: usr/local/www/system_certmanager.php:549
+#: usr/local/www/system_usermanager.php:190
+#: usr/local/www/system_usermanager.php:711
+#: usr/local/www/system_certmanager.php:205
+#: usr/local/www/system_certmanager.php:648
+#: usr/local/www/system_usermanager.php:709
+#: usr/local/www/system_certmanager.php:208
+#: usr/local/www/system_certmanager.php:657
+#: usr/local/www/system_certmanager.php:658
+#: usr/local/www/system_certmanager.php:208
+#: usr/local/www/system_certmanager.php:658
+#: usr/local/www/system_usermanager.php:190
+#: usr/local/www/system_usermanager.php:709
+msgid "Certificate authority"
+msgstr "認証局"
+
+#: usr/local/www/system_certmanager.php:205
+#: usr/local/www/system_certmanager.php:234
+#: usr/local/www/system_certmanager.php:237
+#: usr/local/www/system_certmanager.php:237
+msgid "Existing Certificate Choice"
+msgstr "既存の証明書の選択"
+
+#: usr/local/www/system_certmanager.php:300
+#: usr/local/www/system_certmanager.php:796
+#: usr/local/www/system_certmanager.php:840
+#: usr/local/www/system_certmanager.php:387
+#: usr/local/www/system_certmanager.php:962
+#: usr/local/www/system_certmanager.php:1006
+#: usr/local/www/system_certmanager.php:396
+#: usr/local/www/system_certmanager.php:1004
+#: usr/local/www/system_certmanager.php:1048
+#: usr/local/www/system_certmanager.php:1008
+#: usr/local/www/system_certmanager.php:1052
+#: usr/local/www/system_certmanager.php:396
+#: usr/local/www/system_certmanager.php:1008
+#: usr/local/www/system_certmanager.php:1052
+msgid "Update"
+msgstr "アップデート"
+
+#: usr/local/www/system_certmanager.php:308
+#: usr/local/www/system_certmanager.php:822
+#: usr/local/www/system_certmanager.php:395
+#: usr/local/www/system_certmanager.php:988
+#: usr/local/www/system_certmanager.php:404
+#: usr/local/www/system_certmanager.php:1030
+#: usr/local/www/system_certmanager.php:404
+msgid "Final Certificate data"
+msgstr "最終的な証明書データ"
+
+#: usr/local/www/system_certmanager.php:328
+#: usr/local/www/system_certmanager.php:415
+#: usr/local/www/system_certmanager.php:424
+#: usr/local/www/system_certmanager.php:424
+#, php-format
+msgid "The certificate modulus does not match the signing request modulus."
+msgstr "証明書の弾性率は、署名要求弾性率と一致しない。"
+
+#: usr/local/www/system_certmanager.php:507
+#: usr/local/www/system_certmanager.php:606
+#: usr/local/www/system_certmanager.php:615
+#: usr/local/www/system_certmanager.php:616
+#: usr/local/www/system_certmanager.php:616
+msgid "Import Certificate"
+msgstr "証明書のインポート"
+
+#: usr/local/www/system_certmanager.php:519
+#: usr/local/www/system_certmanager.php:618
+#: usr/local/www/system_certmanager.php:627
+#: usr/local/www/system_certmanager.php:628
+#: usr/local/www/system_certmanager.php:628
+msgid "Private key data"
+msgstr "秘密鍵データ"
+
+#: usr/local/www/system_certmanager.php:523
+#: usr/local/www/system_certmanager.php:622
+#: usr/local/www/system_certmanager.php:631
+#: usr/local/www/system_certmanager.php:632
+#: usr/local/www/system_certmanager.php:632
+msgid "Paste a private key in X.509 PEM format here."
+msgstr "ここで、X.509 PEM形式の秘密鍵を貼り付けます。"
+
+#: usr/local/www/system_certmanager.php:533
+#: usr/local/www/system_certmanager.php:632
+#: usr/local/www/system_certmanager.php:641
+#: usr/local/www/system_certmanager.php:642
+#: usr/local/www/system_certmanager.php:642
+msgid "Internal Certificate"
+msgstr "内部認証"
+
+#: usr/local/www/system_certmanager.php:540
+#: usr/local/www/system_certmanager.php:639
+#: usr/local/www/system_certmanager.php:648
+#: usr/local/www/system_certmanager.php:649
+#: usr/local/www/system_certmanager.php:649
+msgid "No internal Certificate Authorities have been defined. You must"
+msgstr "は内部認証局が定義されていません。作業を行う必要があります"
+
+#: usr/local/www/system_certmanager.php:542
+#: usr/local/www/system_certmanager.php:641
+#: usr/local/www/system_certmanager.php:650
+#: usr/local/www/system_certmanager.php:651
+#: usr/local/www/system_certmanager.php:651
+msgid "an internal CA before creating an internal certificate."
+msgstr "内部証明書を作成する前に、内部CA 。"
+
+#: usr/local/www/system_certmanager.php:623
+#: usr/local/www/system_certmanager.php:726
+#: usr/local/www/system_certmanager.php:739
+#: usr/local/www/system_certmanager.php:892
+#: usr/local/www/system_certmanager.php:764
+#: usr/local/www/system_certmanager.php:934
+#: usr/local/www/system_certmanager.php:765
+#: usr/local/www/system_certmanager.php:938
+#: usr/local/www/system_certmanager.php:765
+#: usr/local/www/system_certmanager.php:938
+msgid "webadmin@mycompany.com"
+msgstr "webadmin@mycompany.com"
+
+#: usr/local/www/system_certmanager.php:637
+#: usr/local/www/system_certmanager.php:736
+#: usr/local/www/system_certmanager.php:753
+#: usr/local/www/system_certmanager.php:902
+#: usr/local/www/system_certmanager.php:778
+#: usr/local/www/system_certmanager.php:944
+#: usr/local/www/system_certmanager.php:779
+#: usr/local/www/system_certmanager.php:948
+#: usr/local/www/system_certmanager.php:779
+#: usr/local/www/system_certmanager.php:948
+msgid "www.example.com"
+msgstr "www.example.com"
+
+#: usr/local/www/system_certmanager.php:653
+#: usr/local/www/system_certmanager.php:817
+#: usr/local/www/system_certmanager.php:842
+#: usr/local/www/system_certmanager.php:846
+#: usr/local/www/system_certmanager.php:846
+msgid "External Signing Request"
+msgstr "外部署名要求"
+
+#: usr/local/www/system_certmanager.php:749
+#: usr/local/www/system_certmanager.php:915
+#: usr/local/www/system_certmanager.php:957
+#: usr/local/www/system_certmanager.php:961
+#: usr/local/www/system_certmanager.php:961
+msgid "Choose an Existing Certificate"
+msgstr "既存の証明書を選択する"
+
+#: usr/local/www/system_certmanager.php:752
+#: usr/local/www/system_certmanager.php:918
+#: usr/local/www/system_certmanager.php:960
+#: usr/local/www/system_certmanager.php:964
+#: usr/local/www/system_certmanager.php:964
+msgid "Existing Certificates"
+msgstr "既存の証明書"
+
+#: usr/local/www/system_certmanager.php:810
+#: usr/local/www/system_certmanager.php:976
+#: usr/local/www/system_certmanager.php:1018
+#: usr/local/www/system_certmanager.php:1022
+#: usr/local/www/system_certmanager.php:1022
+msgid "Complete Signing Request"
+msgstr "完全な署名リクエスト"
+
+#: usr/local/www/system_certmanager.php:814
+#: usr/local/www/system_certmanager.php:980
+#: usr/local/www/system_certmanager.php:1022
+msgid "Signing Request data"
+msgstr "署名要求データ"
+
+#: usr/local/www/system_certmanager.php:818
+#: usr/local/www/system_certmanager.php:984
+#: usr/local/www/system_certmanager.php:1026
+#: usr/local/www/system_certmanager.php:1030
+#: usr/local/www/system_certmanager.php:1030
+msgid ""
+"Copy the certificate signing data from here and forward it to your "
+"certificate authority for signing."
+msgstr "「ここから証明書署名データをコピーして、それを転送する」に署名するための認証局。"
+
+#: usr/local/www/system_certmanager.php:826
+#: usr/local/www/system_certmanager.php:992
+#: usr/local/www/system_certmanager.php:1034
+#: usr/local/www/system_certmanager.php:1038
+#: usr/local/www/system_certmanager.php:1038
+msgid "Paste the certificate received from your certificate authority here."
+msgstr "ここにあなたの認証局から受け取った証明書を貼り付けます。"
+
+#: usr/local/www/system_certmanager.php:857
+#: usr/local/www/system_crlmanager.php:490
+#: usr/local/www/system_certmanager.php:1023
+#: usr/local/www/system_crlmanager.php:523
+#: usr/local/www/system_certmanager.php:1065
+#: usr/local/www/system_certmanager.php:1069
+#: usr/local/www/system_certmanager.php:1069
+#: usr/local/www/system_crlmanager.php:523
+msgid "In Use"
+msgstr "使用中"
+
+#: usr/local/www/system_certmanager.php:877
+#: usr/local/www/system_certmanager.php:1044
+#: usr/local/www/system_certmanager.php:1087
+#: usr/local/www/system_certmanager.php:1091
+#: usr/local/www/system_certmanager.php:1091
+msgid "external - signature pending"
+msgstr "外部 - 署名申請中"
+
+#: usr/local/www/system_certmanager.php:926
+#: usr/local/www/system_usermanager.php:658
+#: usr/local/www/system_certmanager.php:1103
+#: usr/local/www/system_usermanager.php:656
+#: usr/local/www/system_certmanager.php:1106
+#: usr/local/www/system_certmanager.php:1162
+#: usr/local/www/system_certmanager.php:1166
+#: usr/local/www/system_certmanager.php:1166
+#: usr/local/www/system_usermanager.php:656
+msgid "export cert"
+msgstr "輸出証明書"
+
+#: usr/local/www/system_certmanager.php:926
+#: usr/local/www/system_certmanager.php:929
+#: usr/local/www/system_certmanager.php:1103
+#: usr/local/www/system_certmanager.php:1106
+#: usr/local/www/system_certmanager.php:1109
+#: usr/local/www/system_certmanager.php:1162
+#: usr/local/www/system_certmanager.php:1165
+#: usr/local/www/system_certmanager.php:1166
+#: usr/local/www/system_certmanager.php:1169
+#: usr/local/www/system_certmanager.php:1166
+#: usr/local/www/system_certmanager.php:1169
+msgid "export ca"
+msgstr "輸出CA"
+
+#: usr/local/www/system_certmanager.php:929
+#: usr/local/www/system_certmanager.php:1106
+#: usr/local/www/system_certmanager.php:1109
+#: usr/local/www/system_certmanager.php:1165
+#: usr/local/www/system_certmanager.php:1169
+#: usr/local/www/system_certmanager.php:1169
+msgid "export key"
+msgstr "輸出キー"
+
+#: usr/local/www/system_certmanager.php:932
+#: usr/local/www/system_certmanager.php:1112
+#: usr/local/www/system_certmanager.php:1115
+#: usr/local/www/system_certmanager.php:1171
+#: usr/local/www/system_certmanager.php:1175
+#: usr/local/www/system_certmanager.php:1175
+msgid "Do you really want to delete this Certificate?"
+msgstr "あなたは本当にこの証明書を削除しますか?"
+
+#: usr/local/www/system_certmanager.php:933
+#: usr/local/www/system_usermanager.php:661
+#: usr/local/www/system_certmanager.php:1113
+#: usr/local/www/system_usermanager.php:659
+#: usr/local/www/system_certmanager.php:1116
+#: usr/local/www/system_certmanager.php:1172
+#: usr/local/www/system_certmanager.php:1176
+#: usr/local/www/system_certmanager.php:1176
+#: usr/local/www/system_usermanager.php:659
+msgid "delete cert"
+msgstr "証明書を削除する"
+
+#: usr/local/www/system_certmanager.php:939
+#: usr/local/www/system_certmanager.php:1119
+#: usr/local/www/system_certmanager.php:1122
+#: usr/local/www/system_certmanager.php:1178
+#: usr/local/www/system_certmanager.php:1182
+#: usr/local/www/system_certmanager.php:1182
+msgid "update csr"
+msgstr "更新CSR"
+
+#: usr/local/www/system_certmanager.php:958
+#: usr/local/www/system_certmanager.php:1138
+#: usr/local/www/system_certmanager.php:1141
+#: usr/local/www/system_certmanager.php:1197
+#: usr/local/www/system_certmanager.php:1201
+#: usr/local/www/system_certmanager.php:1201
+msgid "Note: You can only delete a certificate if it is not currently in use."
+msgstr "注意:現在使用されていない場合にのみ、証明書を削除することができます。"
+
+#: usr/local/www/system_crlmanager.php:46
+#: usr/local/www/system_crlmanager.php:46
+msgid "Certificate Revocation List Manager"
+msgstr "証明書失効リストマネージャ"
+
+#: usr/local/www/system_crlmanager.php:49
+#: usr/local/www/system_crlmanager.php:49
+msgid "Create an internal Certificate Revocation List"
+msgstr "内部証明書失効リストを作成します。"
+
+#: usr/local/www/system_crlmanager.php:50
+#: usr/local/www/system_crlmanager.php:50
+msgid "Import an existing Certificate Revocation List"
+msgstr "既存の証明書失効リストをインポート"
+
+#: usr/local/www/system_crlmanager.php:86
+#: usr/local/www/system_crlmanager.php:86
+msgid "Invalid CRL reference."
+msgstr "無効なCRLの参照。"
+
+#: usr/local/www/system_crlmanager.php:92
+#: usr/local/www/system_crlmanager.php:92
+#, php-format
+msgid "Certificate Revocation List %s is in use and cannot be deleted"
+msgstr "証明書失効リストの%sが使用され、削除することはできません"
+
+#: usr/local/www/system_crlmanager.php:98
+#: usr/local/www/system_crlmanager.php:98
+#, php-format
+msgid "Certificate Revocation List %s successfully deleted"
+msgstr "証明書失効リストが正常に削除され%s"
+
+#: usr/local/www/system_crlmanager.php:136
+#: usr/local/www/system_crlmanager.php:136
+msgid "Both the Certificate and CRL must be specified."
+msgstr "証明書とCRLの両方を指定する必要があります。"
+
+#: usr/local/www/system_crlmanager.php:140
+#: usr/local/www/system_crlmanager.php:140
+msgid "CA mismatch between the Certificate and CRL. Unable to Revoke."
+msgstr "証明書とCRLの間のCAが一致しません。取り消しすることができません。"
+
+#: usr/local/www/system_crlmanager.php:143
+#: usr/local/www/system_crlmanager.php:143
+msgid "Cannot revoke certificates for an imported/external CRL."
+msgstr "インポートされた外部/ CRLの証明書を失効することはできません。"
+
+#: usr/local/www/system_crlmanager.php:175
+#: usr/local/www/system_crlmanager.php:177
+#: usr/local/www/system_crlmanager.php:175
+#: usr/local/www/system_crlmanager.php:177
+#, php-format
+msgid "Deleted Certificate %s from CRL %s"
+msgstr "CRLの%sから削除された証明書の%s"
+
+#: usr/local/www/system_crlmanager.php:179
+#: usr/local/www/system_crlmanager.php:179
+#, php-format
+msgid "Failed to delete Certificate %s from CRL %s"
+msgstr "CRLの%sから証明書%sの削除に失敗しました"
+
+#: usr/local/www/system_crlmanager.php:194
+#: usr/local/www/system_crlmanager.php:193
+#: usr/local/www/system_crlmanager.php:193
+msgid "Certificate Revocation List data"
+msgstr "証明書失効リストデータ"
+
+#: usr/local/www/system_crlmanager.php:201
+#: usr/local/www/system_crlmanager.php:324
+#: usr/local/www/vpn_ipsec_phase1.php:166
+#: usr/local/www/vpn_openvpn_client.php:210
+#: usr/local/www/vpn_openvpn_server.php:282
+#: usr/local/www/vpn_openvpn_server.php:287
+#: usr/local/www/vpn_openvpn_client.php:214
+#: usr/local/www/system_crlmanager.php:200
+#: usr/local/www/system_crlmanager.php:325
+#: usr/local/www/vpn_openvpn_server.php:288
+#: usr/local/www/vpn_openvpn_client.php:220
+#: usr/local/www/vpn_openvpn_client.php:238
+#: usr/local/www/vpn_openvpn_server.php:309
+#: usr/local/www/vpn_openvpn_client.php:238
+#: usr/local/www/system_crlmanager.php:200
+#: usr/local/www/system_crlmanager.php:325
+#: usr/local/www/vpn_ipsec_phase1.php:166
+#: usr/local/www/vpn_openvpn_server.php:309
+msgid "Certificate Authority"
+msgstr "認証局"
+
+#: usr/local/www/system_crlmanager.php:345
+#: usr/local/www/system_crlmanager.php:346
+#: usr/local/www/system_crlmanager.php:346
+msgid "Existing Certificate Revocation List"
+msgstr "既存の証明書失効リスト"
+
+#: usr/local/www/system_crlmanager.php:349
+#: usr/local/www/system_crlmanager.php:350
+#: usr/local/www/system_crlmanager.php:410
+#: usr/local/www/system_crlmanager.php:350
+#: usr/local/www/system_crlmanager.php:410
+msgid "CRL data"
+msgstr "CRLのデータ"
+
+#: usr/local/www/system_crlmanager.php:353
+#: usr/local/www/system_crlmanager.php:354
+#: usr/local/www/system_crlmanager.php:414
+#: usr/local/www/system_crlmanager.php:354
+#: usr/local/www/system_crlmanager.php:414
+msgid "Paste a Certificate Revocation List in X.509 CRL format here."
+msgstr "ここで、X.509 CRLの形式で証明書失効リストを貼り付けます。"
+
+#: usr/local/www/system_crlmanager.php:363
+#: usr/local/www/system_crlmanager.php:364
+#: usr/local/www/system_crlmanager.php:364
+msgid "Internal Certificate Revocation List"
+msgstr "内部証明書失効リスト"
+
+#: usr/local/www/system_crlmanager.php:370
+#: usr/local/www/system_crlmanager.php:371
+#: usr/local/www/system_crlmanager.php:371
+msgid "Default: 9999"
+msgstr "デフォルト: 9999"
+
+#: usr/local/www/system_crlmanager.php:378
+#: usr/local/www/system_crlmanager.php:379
+#: usr/local/www/system_crlmanager.php:379
+msgid "Default: 0"
+msgstr "デフォルト: 0"
+
+#: usr/local/www/system_crlmanager.php:401
+#: usr/local/www/system_crlmanager.php:434
+#: usr/local/www/system_crlmanager.php:434
+msgid "Currently Revoked Certificates for CRL"
+msgstr "CRLの現在失効した証明書"
+
+#: usr/local/www/system_crlmanager.php:405
+#: usr/local/www/system_crlmanager.php:438
+#: usr/local/www/system_crlmanager.php:438
+msgid "Certificate Name"
+msgstr "証明書の名前"
+
+#: usr/local/www/system_crlmanager.php:406
+#: usr/local/www/system_crlmanager.php:439
+#: usr/local/www/system_crlmanager.php:439
+msgid "Revocation Reason"
+msgstr "失効理由"
+
+#: usr/local/www/system_crlmanager.php:407
+#: usr/local/www/system_crlmanager.php:440
+#: usr/local/www/system_crlmanager.php:440
+msgid "Revoked At"
+msgstr "でも取り消す"
+
+#: usr/local/www/system_crlmanager.php:416
+#: usr/local/www/system_crlmanager.php:449
+#: usr/local/www/system_crlmanager.php:449
+msgid "No Certificates Found for this CRL."
+msgstr "このCRLが見つかりませ証明書はありません。"
+
+#: usr/local/www/system_crlmanager.php:435
+#: usr/local/www/system_crlmanager.php:468
+#: usr/local/www/system_crlmanager.php:468
+msgid "Do you really want to delete this Certificate from the CRL?"
+msgstr "あなたは本当に、CRLからこの証明書を削除しますか?"
+
+#: usr/local/www/system_crlmanager.php:436
+#: usr/local/www/system_crlmanager.php:469
+#: usr/local/www/system_crlmanager.php:469
+msgid "Delete this certificate from the CRL "
+msgstr "CRLからこの証明書を削除する"
+
+#: usr/local/www/system_crlmanager.php:453
+#: usr/local/www/system_crlmanager.php:486
+#: usr/local/www/system_crlmanager.php:486
+msgid "No Certificates Found for this CA."
+msgstr "このCAが見つかりませ証明書はありません。"
+
+#: usr/local/www/system_crlmanager.php:460
+#: usr/local/www/system_crlmanager.php:493
+#: usr/local/www/system_crlmanager.php:493
+msgid "Choose a Certificate to Revoke"
+msgstr "取り消すには、証明書を選択してください"
+
+#: usr/local/www/system_crlmanager.php:465
+#: usr/local/www/system_crlmanager.php:498
+#: usr/local/www/system_crlmanager.php:498
+msgid "Reason"
+msgstr "理由"
+
+#: usr/local/www/system_crlmanager.php:527
+#: usr/local/www/system_crlmanager.php:560
+#: usr/local/www/system_crlmanager.php:568
+#: usr/local/www/system_crlmanager.php:568
+#, php-format
+msgid "Add or Import CRL for %s"
+msgstr "%sために追加またはインポート、CRL"
+
+#: usr/local/www/system_crlmanager.php:527
+#: usr/local/www/system_crlmanager.php:531
+#: usr/local/www/system_crlmanager.php:560
+#: usr/local/www/system_crlmanager.php:564
+#: usr/local/www/system_crlmanager.php:568
+#: usr/local/www/system_crlmanager.php:572
+#: usr/local/www/system_crlmanager.php:568
+#: usr/local/www/system_crlmanager.php:572
+msgid "add crl"
+msgstr "CRLを追加"
+
+#: usr/local/www/system_crlmanager.php:531
+#: usr/local/www/system_crlmanager.php:564
+#: usr/local/www/system_crlmanager.php:572
+#: usr/local/www/system_crlmanager.php:572
+#, php-format
+msgid "Import CRL for %s"
+msgstr "%sのインポートCRL"
+
+#: usr/local/www/system_crlmanager.php:552
+#: usr/local/www/system_crlmanager.php:585
+#: usr/local/www/system_crlmanager.php:593
+#: usr/local/www/system_crlmanager.php:593
+msgid "Export CRL"
+msgstr "輸出CRL"
+
+#: usr/local/www/system_crlmanager.php:557
+#: usr/local/www/system_crlmanager.php:590
+#: usr/local/www/system_crlmanager.php:594
+#: usr/local/www/system_crlmanager.php:598
+#: usr/local/www/system_crlmanager.php:602
+#: usr/local/www/system_crlmanager.php:598
+#: usr/local/www/system_crlmanager.php:602
+msgid "Edit CRL"
+msgstr "編集CRL"
+
+#: usr/local/www/system_crlmanager.php:561
+#: usr/local/www/system_crlmanager.php:598
+#: usr/local/www/system_crlmanager.php:606
+#: usr/local/www/system_crlmanager.php:606
+msgid "Do you really want to delete this Certificate Revocation List?"
+msgstr "あなたは本当にこの証明書失効リストを削除しますか?"
+
+#: usr/local/www/system_crlmanager.php:562
+#: usr/local/www/system_crlmanager.php:599
+#: usr/local/www/system_crlmanager.php:607
+#: usr/local/www/system_crlmanager.php:607
+msgid "Delete CRL"
+msgstr "CRLを削除"
+
+#: usr/local/www/system_crlmanager.php:582
+#: usr/local/www/system_crlmanager.php:619
+#: usr/local/www/system_crlmanager.php:531
+#: usr/local/www/system_crlmanager.php:531
+msgid "Additional Certificate Revocation Lists can be added here."
+msgstr "追加の証明書失効リストはここで追加することができます。"
+
+#: usr/local/www/system_gateway_groups.php:75
+#: usr/local/www/system_gateway_groups.php:76
+#: usr/local/www/system_gateway_groups.php:85
+#: usr/local/www/system_gateway_groups.php:85
+msgid "removed gateway group"
+msgstr "削除ゲートウェイ·グループ"
+
+#: usr/local/www/system_gateway_groups.php:101
+#: usr/local/www/system_gateway_groups.php:102
+#: usr/local/www/system_gateway_groups.php:111
+#: usr/local/www/system_gateway_groups.php:111
+#, php-format
+msgid ""
+"The gateway configuration has been changed.%sYou must apply the changes in "
+"order for them to take effect."
+msgstr "それらを有効にするため「ゲートウェイ設定はchanged.%sYouがで変更を適用する必要がありました」 。"
+
+#: usr/local/www/system_gateway_groups.php:165
+#: usr/local/www/system_gateway_groups.php:166
+#: usr/local/www/system_gateway_groups.php:187
+#: usr/local/www/system_gateway_groups.php:187
+msgid "Do you really want to delete this gateway group?"
+msgstr "あなたは本当にこのゲートウェイ·グループを削除しますか?"
+
+#: usr/local/www/system_gateway_groups.php:195
+#: usr/local/www/system_gateway_groups.php:196
+#: usr/local/www/system_gateway_groups.php:205
+#: usr/local/www/system_gateway_groups.php:205
+msgid ""
+"Remember to use these Gateway Groups in firewall rules in order to enable "
+"load balancing, failover, or policy-based routing. Without rules directing "
+"traffic into the Gateway Groups, they will not be used."
+msgstr "ロードバランシング、フェイルオーバー、またはポリシーベースルーティング」を有効にするために、ファイアウォールのルールでこれらのゲートウェイグループを使用することを忘れないでください」 。ゲートウェイグループに「トラフィックを導くルールがなければ、それらは使用されません。"
+
+#: usr/local/www/system_gateway_groups_edit.php:50
+#: usr/local/www/system_gateway_groups_edit.php:53
+#: usr/local/www/system_gateway_groups_edit.php:53
+msgid "Member Down"
+msgstr "メンバーダウン"
+
+#: usr/local/www/system_gateway_groups_edit.php:51
+#: usr/local/www/system_gateway_groups_edit.php:54
+#: usr/local/www/system_gateway_groups_edit.php:54
+msgid "Packet Loss"
+msgstr "パケットロス"
+
+#: usr/local/www/system_gateway_groups_edit.php:52
+#: usr/local/www/system_gateway_groups_edit.php:55
+#: usr/local/www/system_gateway_groups_edit.php:55
+msgid "High Latency"
+msgstr "高遅延"
+
+#: usr/local/www/system_gateway_groups_edit.php:53
+#: usr/local/www/system_gateway_groups_edit.php:56
+#: usr/local/www/system_gateway_groups_edit.php:56
+msgid "Packet Loss or High Latency"
+msgstr "パケット損失または高いレイテンシ"
+
+#: usr/local/www/system_gateway_groups_edit.php:85
+#: usr/local/www/system_gateway_groups_edit.php:88
+#: usr/local/www/system_gateway_groups_edit.php:88
+msgid "A valid gateway group name must be specified."
+msgstr "有効なゲートウェイ·グループ名を指定する必要があります。"
+
+#: usr/local/www/system_gateway_groups_edit.php:88
+#: usr/local/www/system_gateways_edit.php:106
+#: usr/local/www/system_gateway_groups_edit.php:91
+#: usr/local/www/system_gateways_edit.php:107
+#: usr/local/www/system_gateways_edit.php:108
+#: usr/local/www/system_gateways_edit.php:108
+#: usr/local/www/system_gateway_groups_edit.php:91
+msgid "The gateway name must not contain invalid characters."
+msgstr "ゲートウェイ名に無効な文字が含まれていなければなりません。"
+
+#: usr/local/www/system_gateway_groups_edit.php:99
+#: usr/local/www/system_gateway_groups_edit.php:102
+#: usr/local/www/system_gateway_groups_edit.php:105
+#: usr/local/www/system_gateway_groups_edit.php:105
+#, php-format
+msgid "A gateway group with this name "%s" already exists."
+msgstr "この名前「 %s 」と、ゲートウェイ·グループがすでに存在しています。"
+
+#: usr/local/www/system_gateway_groups_edit.php:115
+#: usr/local/www/system_gateway_groups_edit.php:119
+#: usr/local/www/system_gateway_groups_edit.php:122
+#: usr/local/www/system_gateway_groups_edit.php:122
+#, php-format
+msgid ""
+"A gateway group cannot have the same name with a gateway "%s" please "
+"choose another name."
+msgstr "「ゲートウェイ·グループは、ゲートウェイと同じ名前を持つことはできません""ください」別の名前を選択し%s 。"
+
+#: usr/local/www/system_gateway_groups_edit.php:119
+#: usr/local/www/system_gateway_groups_edit.php:123
+#: usr/local/www/system_gateway_groups_edit.php:126
+#: usr/local/www/system_gateway_groups_edit.php:126
+msgid "No gateway(s) have been selected to be used in this group"
+msgstr "まだゲートウェイ(複数可)は、このグループ内で使用するために選択されていない"
+
+#: usr/local/www/system_gateway_groups_edit.php:142
+#: usr/local/www/system_gateways_edit.php:313
+#: usr/local/www/system_gateways_edit.php:344
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/system_gateways_edit.php:319
+#: usr/local/www/system_gateways_edit.php:350
+#: usr/local/www/system_gateway_groups_edit.php:146
+#: usr/local/www/system_gateways_edit.php:425
+#: usr/local/www/system_gateways_edit.php:456
+#: usr/local/www/system_gateways_edit.php:458
+#: usr/local/www/system_gateways_edit.php:455
+#: usr/local/www/system_gateways_edit.php:488
+#: usr/local/www/system_gateways_edit.php:455
+#: usr/local/www/system_gateways_edit.php:488
+msgid "Edit gateway"
+msgstr "編集ゲートウェイ"
+
+#: usr/local/www/system_gateway_groups_edit.php:155
+#: usr/local/www/system_gateway_groups_edit.php:166
+#: usr/local/www/system_gateway_groups_edit.php:225
+msgid "Edit gateway entry"
+msgstr "編集ゲートウェイエントリ"
+
+#: usr/local/www/system_gateway_groups_edit.php:164
+#: usr/local/www/system_gateway_groups_edit.php:175
+#: usr/local/www/system_gateway_groups_edit.php:234
+#: usr/local/www/system_gateway_groups_edit.php:238
+#: usr/local/www/system_gateway_groups_edit.php:238
+msgid "Gateway Priority"
+msgstr "ゲートウェイの優先順位"
+
+#: usr/local/www/system_gateway_groups_edit.php:185
+#: usr/local/www/system_gateway_groups_edit.php:208
+#: usr/local/www/system_gateway_groups_edit.php:268
+#: usr/local/www/system_gateway_groups_edit.php:272
+#: usr/local/www/system_gateway_groups_edit.php:272
+msgid "Never"
+msgstr "決して"
+
+#: usr/local/www/system_gateway_groups_edit.php:186
+#: usr/local/www/system_gateway_groups_edit.php:209
+#: usr/local/www/system_gateway_groups_edit.php:269
+#: usr/local/www/system_gateway_groups_edit.php:273
+#: usr/local/www/system_gateway_groups_edit.php:273
+msgid "Tier 1"
+msgstr "ティア1"
+
+#: usr/local/www/system_gateway_groups_edit.php:187
+#: usr/local/www/system_gateway_groups_edit.php:210
+#: usr/local/www/system_gateway_groups_edit.php:270
+#: usr/local/www/system_gateway_groups_edit.php:274
+#: usr/local/www/system_gateway_groups_edit.php:274
+msgid "Tier 2"
+msgstr "ティア2"
+
+#: usr/local/www/system_gateway_groups_edit.php:188
+#: usr/local/www/system_gateway_groups_edit.php:211
+#: usr/local/www/system_gateway_groups_edit.php:271
+#: usr/local/www/system_gateway_groups_edit.php:275
+#: usr/local/www/system_gateway_groups_edit.php:275
+msgid "Tier 3"
+msgstr "ティア3"
+
+#: usr/local/www/system_gateway_groups_edit.php:189
+#: usr/local/www/system_gateway_groups_edit.php:212
+#: usr/local/www/system_gateway_groups_edit.php:272
+#: usr/local/www/system_gateway_groups_edit.php:276
+#: usr/local/www/system_gateway_groups_edit.php:276
+msgid "Tier 4"
+msgstr "ティア4"
+
+#: usr/local/www/system_gateway_groups_edit.php:190
+#: usr/local/www/system_gateway_groups_edit.php:213
+#: usr/local/www/system_gateway_groups_edit.php:273
+#: usr/local/www/system_gateway_groups_edit.php:277
+#: usr/local/www/system_gateway_groups_edit.php:277
+msgid "Tier 5"
+msgstr "ティア5"
+
+#: usr/local/www/system_gateway_groups_edit.php:195
+#: usr/local/www/system_gateway_groups_edit.php:247
+#: usr/local/www/system_gateway_groups_edit.php:307
+#: usr/local/www/system_gateway_groups_edit.php:311
+#: usr/local/www/system_gateway_groups_edit.php:311
+msgid "Link Priority"
+msgstr "リンク優先順位"
+
+#: usr/local/www/system_gateway_groups_edit.php:196
+#: usr/local/www/system_gateway_groups_edit.php:248
+#: usr/local/www/system_gateway_groups_edit.php:308
+#: usr/local/www/system_gateway_groups_edit.php:312
+#: usr/local/www/system_gateway_groups_edit.php:312
+msgid ""
+"The priority selected here defines in what order failover and balancing of "
+"links will be done. Multiple links of the same priority will balance "
+"connections until all links in the priority will be exhausted. If all links "
+"in a priority level are exhausted we will use the next available link(s) in "
+"the next priority level."
+msgstr "リンクが行われます"ここで選択の優先順位はどのような順序フェイルオーバーとのバランスで定義する「 。 「優先内のすべてのリンクが枯渇するまで、接続を。すべてのリンクが「同じ優先順位の複数のリンクがバランスさ優先レベルのが、我々は次の優先度レベル」内の次に使用可能なリンク( S )を使用します排気される。"
+
+#: usr/local/www/system_gateway_groups_edit.php:205
+#: usr/local/www/system_gateway_groups_edit.php:260
+#: usr/local/www/system_gateway_groups_edit.php:320
+#: usr/local/www/system_gateway_groups_edit.php:322
+#: usr/local/www/system_gateway_groups_edit.php:322
+msgid "Trigger Level"
+msgstr "トリガレベル"
+
+#: usr/local/www/system_gateway_groups_edit.php:216
+#: usr/local/www/system_gateway_groups_edit.php:271
+#: usr/local/www/system_gateway_groups_edit.php:331
+#: usr/local/www/system_gateway_groups_edit.php:333
+#: usr/local/www/system_gateway_groups_edit.php:333
+msgid "When to trigger exclusion of a member"
+msgstr "メンバーの除外をトリガーするタイミング"
+
+#: usr/local/www/system_gateways.php:134 usr/local/www/system_gateways.php:134
+msgid "The gateway configuration has been changed."
+msgstr "ゲートウェイの設定が変更されました。"
+
+#: usr/local/www/system_gateways.php:155
+#: usr/local/www/system_gateways_edit.php:398
+#: usr/local/www/system_gateways_edit.php:419
+#: usr/local/www/system_gateways_edit.php:525
+#: usr/local/www/system_gateways_edit.php:529
+#: usr/local/www/system_gateways_edit.php:531
+#: usr/local/www/system_gateways_edit.php:561
+#: usr/local/www/system_gateways_edit.php:561
+#: usr/local/www/system_gateways.php:155
+msgid "Monitor IP"
+msgstr "監視IP"
+
+#: usr/local/www/system_gateways.php:205 usr/local/www/system_gateways.php:205
+msgid "Do you really want to delete this gateway?"
+msgstr "あなたは本当にこのゲートウェイを削除しますか?"
+
+#: usr/local/www/system_gateways_edit.php:110
+#: usr/local/www/system_gateways_edit.php:111
+#: usr/local/www/system_gateways_edit.php:112
+#: usr/local/www/system_gateways_edit.php:112
+msgid "A valid gateway IP address must be specified."
+msgstr "有効なゲートウェイIPアドレスを指定する必要があります。"
+
+#: usr/local/www/system_gateways_edit.php:118
+#: usr/local/www/system_gateways_edit.php:119
+#: usr/local/www/system_gateways_edit.php:120
+#: usr/local/www/system_gateways_edit.php:133
+#: usr/local/www/system_gateways_edit.php:148
+#: usr/local/www/system_gateways_edit.php:148
+msgid "You can not use a IPv6 Gateway Address on a IPv4 only interface."
+msgstr "あなたは、IPv4のみインターフェイス上でIPv6ゲートウェイアドレスを使用することはできません。"
+
+#: usr/local/www/system_gateways_edit.php:122
+#: usr/local/www/system_gateways_edit.php:133
+#: usr/local/www/system_gateways_edit.php:123
+#: usr/local/www/system_gateways_edit.php:136
+#: usr/local/www/system_gateways_edit.php:124
+#: usr/local/www/system_gateways_edit.php:137
+#, php-format
+msgid ""
+"The gateway address %1$s does not lie within the chosen interface's subnet "
+"'%2$s'."
+msgstr "「 %2$s 」 「ゲートウェイアドレスは%1$sは、選択されたインターフェイスのサブネット内にない」 。"
+
+#: usr/local/www/system_gateways_edit.php:129
+#: usr/local/www/system_gateways_edit.php:132
+#: usr/local/www/system_gateways_edit.php:133
+#: usr/local/www/system_gateways_edit.php:120
+#: usr/local/www/system_gateways_edit.php:120
+msgid "You can not use a IPv4 Gateway Address on a IPv6 only interface."
+msgstr "あなたは、IPv6のみのインターフェイス上でIPv4ゲートウェイアドレスを使用することはできません。"
+
+#: usr/local/www/system_gateways_edit.php:139
+#: usr/local/www/system_gateways_edit.php:143
+#: usr/local/www/system_gateways_edit.php:144
+#: usr/local/www/system_gateways_edit.php:174
+#: usr/local/www/system_gateways_edit.php:174
+msgid ""
+"Dynamic gateway values cannot be specified for interfaces with a static IPv4 "
+"configuration."
+msgstr "構成の「動的ゲートウェイ値は、静的IPv4とのインタフェースを指定することはできません」 。"
+
+#: usr/local/www/system_gateways_edit.php:143
+#: usr/local/www/system_gateways_edit.php:147
+#: usr/local/www/system_gateways_edit.php:148
+#: usr/local/www/system_gateways_edit.php:178
+#: usr/local/www/system_gateways_edit.php:178
+msgid ""
+"Dynamic gateway values cannot be specified for interfaces with a static IPv6 "
+"configuration."
+msgstr "構成の「動的ゲートウェイ値は、静的IPv6とのインタフェースを指定することはできません」 。"
+
+#: usr/local/www/system_gateways_edit.php:147
+#: usr/local/www/system_gateways_edit.php:151
+#: usr/local/www/system_gateways_edit.php:152
+#: usr/local/www/system_gateways_edit.php:182
+#: usr/local/www/system_gateways_edit.php:182
+msgid "A valid monitor IP address must be specified."
+msgstr "有効な監視IPアドレスを指定する必要があります。"
+
+#: usr/local/www/system_gateways_edit.php:160
+#: usr/local/www/system_gateways_edit.php:168
+#: usr/local/www/system_gateways_edit.php:178
+#: usr/local/www/system_gateways_edit.php:208
+#: usr/local/www/system_gateways_edit.php:208
+msgid "Changing name on a gateway is not allowed."
+msgstr "ゲートウェイ上の変更名が許可されていません。"
+
+#: usr/local/www/system_gateways_edit.php:165
+#: usr/local/www/system_gateways_edit.php:173
+#: usr/local/www/system_gateways_edit.php:183
+#: usr/local/www/system_gateways_edit.php:213
+#: usr/local/www/system_gateways_edit.php:213
+#, php-format
+msgid "The gateway name "%s" already exists."
+msgstr "ゲートウェイ名」 %s "はすでに存在しています。"
+
+#: usr/local/www/system_gateways_edit.php:171
+#: usr/local/www/system_gateways_edit.php:179
+#: usr/local/www/system_gateways_edit.php:189
+#: usr/local/www/system_gateways_edit.php:219
+#: usr/local/www/system_gateways_edit.php:219
+#, php-format
+msgid "The gateway IP address "%s" already exists."
+msgstr "ゲートウェイIPアドレス」 %s "はすでに存在しています。"
+
+#: usr/local/www/system_gateways_edit.php:177
+#: usr/local/www/system_gateways_edit.php:185
+#: usr/local/www/system_gateways_edit.php:195
+#: usr/local/www/system_gateways_edit.php:225
+#: usr/local/www/system_gateways_edit.php:225
+#, php-format
+msgid ""
+"The monitor IP address "%s" is already in use. You must choose a different "
+"monitor IP."
+msgstr "「モニタIPアドレス "%sは「既に使用されている。別の選択しなければなりません"監視IPを。"
+
+#: usr/local/www/system_gateways_edit.php:187
+#: usr/local/www/system_gateways_edit.php:220
+#: usr/local/www/system_gateways_edit.php:195
+#: usr/local/www/system_gateways_edit.php:228
+msgid "The low latency watermark needs to be a numeric value."
+msgstr "低遅延透かしは数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:193
+#: usr/local/www/system_gateways_edit.php:201
+msgid "The high latency watermark needs to be a numeric value."
+msgstr "高遅延透かしは数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:198
+#: usr/local/www/system_gateways_edit.php:206
+msgid "The low loss watermark needs to be a numeric value."
+msgstr "低損失透かしは数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:203
+#: usr/local/www/system_gateways_edit.php:211
+msgid "The high loss watermark needs to be a numeric value."
+msgstr "高損失透かしは数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:209
+#: usr/local/www/system_gateways_edit.php:217
+msgid ""
+"The High latency watermark needs to be higher then the low latency watermark"
+msgstr "「高レイテンシの透かしは、低レイテンシ·ウォーターマークより高いことが必要である"
+
+#: usr/local/www/system_gateways_edit.php:215
+#: usr/local/www/system_gateways_edit.php:223
+msgid ""
+"The High packet loss watermark needs to be higher then the low packet loss "
+"watermark"
+msgstr "透かしを​​「高パケット損失の透かしは、低パケット損失より高いことが必要である""
+
+#: usr/local/www/system_gateways_edit.php:363
+#: usr/local/www/system_gateways_edit.php:369
+#: usr/local/www/system_gateways_edit.php:475
+#: usr/local/www/system_gateways_edit.php:474
+#: usr/local/www/system_gateways_edit.php:476
+#: usr/local/www/system_gateways_edit.php:506
+#: usr/local/www/system_gateways_edit.php:506
+msgid "Use BGPD"
+msgstr "bgpdをを使用してください"
+
+#: usr/local/www/system_gateways_edit.php:367
+#: usr/local/www/system_gateways_edit.php:373
+#: usr/local/www/system_gateways_edit.php:479
+#: usr/local/www/system_gateways_edit.php:478
+#: usr/local/www/system_gateways_edit.php:480
+#: usr/local/www/system_gateways_edit.php:510
+#: usr/local/www/system_gateways_edit.php:510
+msgid "Choose which interface this gateway applies to."
+msgstr "選択しているインターフェイスこのゲートウェイが適用される。"
+
+#: usr/local/www/system_gateways_edit.php:373
+#: usr/local/www/system_gateways_edit.php:394
+#: usr/local/www/system_gateways_edit.php:500
+#: usr/local/www/system_gateways_edit.php:502
+#: usr/local/www/system_gateways_edit.php:504
+#: usr/local/www/system_gateways_edit.php:534
+#: usr/local/www/system_gateways_edit.php:534
+msgid "Gateway name"
+msgstr "ゲートウェイ名"
+
+#: usr/local/www/system_gateways_edit.php:379
+#: usr/local/www/system_gateways_edit.php:400
+#: usr/local/www/system_gateways_edit.php:506
+#: usr/local/www/system_gateways_edit.php:509
+#: usr/local/www/system_gateways_edit.php:511
+#: usr/local/www/system_gateways_edit.php:541
+#: usr/local/www/system_gateways_edit.php:541
+msgid "Gateway IP address"
+msgstr "ゲートウェイIPアドレス"
+
+#: usr/local/www/system_gateways_edit.php:382
+#: usr/local/www/system_gateways_edit.php:385
+#: usr/local/www/system_gateways_edit.php:403
+#: usr/local/www/system_gateways_edit.php:406
+#: usr/local/www/system_gateways_edit.php:509
+#: usr/local/www/system_gateways_edit.php:512
+#: usr/local/www/system_gateways_edit.php:513
+#: usr/local/www/system_gateways_edit.php:516
+#: usr/local/www/system_gateways_edit.php:515
+#: usr/local/www/system_gateways_edit.php:518
+#: usr/local/www/system_gateways_edit.php:545
+#: usr/local/www/system_gateways_edit.php:548
+#: usr/local/www/system_gateways_edit.php:545
+#: usr/local/www/system_gateways_edit.php:548
+msgid "Default Gateway"
+msgstr "デフォルトゲートウェイ"
+
+#: usr/local/www/system_gateways_edit.php:386
+#: usr/local/www/system_gateways_edit.php:407
+#: usr/local/www/system_gateways_edit.php:513
+#: usr/local/www/system_gateways_edit.php:517
+#: usr/local/www/system_gateways_edit.php:519
+#: usr/local/www/system_gateways_edit.php:549
+#: usr/local/www/system_gateways_edit.php:549
+msgid "This will select the above gateway as the default gateway"
+msgstr "これがデフォルトゲートウェイとして上記のゲートウェイを選択します"
+
+#: usr/local/www/system_gateways_edit.php:390
+#: usr/local/www/system_gateways_edit.php:393
+#: usr/local/www/system_gateways_edit.php:411
+#: usr/local/www/system_gateways_edit.php:414
+#: usr/local/www/system_gateways_edit.php:517
+#: usr/local/www/system_gateways_edit.php:520
+#: usr/local/www/system_gateways_edit.php:521
+#: usr/local/www/system_gateways_edit.php:524
+#: usr/local/www/system_gateways_edit.php:523
+#: usr/local/www/system_gateways_edit.php:526
+#: usr/local/www/system_gateways_edit.php:553
+#: usr/local/www/system_gateways_edit.php:556
+#: usr/local/www/system_gateways_edit.php:553
+#: usr/local/www/system_gateways_edit.php:556
+msgid "Disable Gateway Monitoring"
+msgstr "ゲートウェイの監視を無効に"
+
+#: usr/local/www/system_gateways_edit.php:394
+#: usr/local/www/system_gateways_edit.php:415
+#: usr/local/www/system_gateways_edit.php:521
+#: usr/local/www/system_gateways_edit.php:525
+#: usr/local/www/system_gateways_edit.php:527
+#: usr/local/www/system_gateways_edit.php:557
+#: usr/local/www/system_gateways_edit.php:557
+msgid "This will consider this gateway as always being up"
+msgstr "これは、常に、最大であるとしてこのゲートウェイを検討します"
+
+#: usr/local/www/system_gateways_edit.php:407
+#: usr/local/www/system_gateways_edit.php:428
+#: usr/local/www/system_gateways_edit.php:534
+#: usr/local/www/system_gateways_edit.php:538
+#: usr/local/www/system_gateways_edit.php:540
+#: usr/local/www/system_gateways_edit.php:570
+#: usr/local/www/system_gateways_edit.php:570
+msgid "Alternative monitor IP"
+msgstr "代替監視IP"
+
+#: usr/local/www/system_gateways_edit.php:408
+#: usr/local/www/system_gateways_edit.php:429
+#: usr/local/www/system_gateways_edit.php:535
+#: usr/local/www/system_gateways_edit.php:539
+#: usr/local/www/system_gateways_edit.php:541
+#: usr/local/www/system_gateways_edit.php:571
+#: usr/local/www/system_gateways_edit.php:571
+msgid ""
+"Enter an alternative address here to be used to monitor the link. This is "
+"used for the quality RRD graphs as well as the load balancer entries. Use "
+"this if the gateway does not respond to ICMP echo requests (pings)"
+msgstr "「リンクを監視するために使用するためにここに代替アドレスを入力してください。これがされている「品質のRRDグラフだけでなく、ロードバランサのエントリに使用。ゲートウェイがICMPエコー要求に応答しない場合は、「これを使用(のping )"
+
+#: usr/local/www/system_gateways_edit.php:436
+#: usr/local/www/system_gateways_edit.php:457
+#: usr/local/www/system_gateways_edit.php:563
+#: usr/local/www/system_gateways_edit.php:567
+#: usr/local/www/system_gateways_edit.php:569
+#: usr/local/www/system_gateways_edit.php:599
+#: usr/local/www/system_gateways_edit.php:599
+msgid "Weight for this gateway when used in a Gateway Group."
+msgstr "このゲートウェイの重みゲートウェイ·グループで使用される。"
+
+#: usr/local/www/system_gateways_edit.php:440
+#: usr/local/www/system_gateways_edit.php:461
+#: usr/local/www/system_gateways_edit.php:567
+#: usr/local/www/system_gateways_edit.php:571
+#: usr/local/www/system_gateways_edit.php:573
+#: usr/local/www/system_gateways_edit.php:603
+#: usr/local/www/system_gateways_edit.php:603
+msgid "Latency thresholds"
+msgstr "待ち時間のしきい値"
+
+#: usr/local/www/system_gateways_edit.php:448
+#: usr/local/www/system_gateways_edit.php:469
+msgid ""
+"These define the low and high water marks for latency in milliseconds. "
+"Default is 100/200."
+msgstr "「これらはミリ秒のレイテンシのためのローとハイウォーターマークを定義します。 「デフォルトは100/200です。"
+
+#: usr/local/www/system_gateways_edit.php:452
+#: usr/local/www/system_gateways_edit.php:473
+#: usr/local/www/system_gateways_edit.php:579
+#: usr/local/www/system_gateways_edit.php:583
+#: usr/local/www/system_gateways_edit.php:585
+#: usr/local/www/system_gateways_edit.php:615
+#: usr/local/www/system_gateways_edit.php:615
+msgid "Packet Loss thresholds"
+msgstr "パケット損失のしきい値"
+
+#: usr/local/www/system_gateways_edit.php:460
+#: usr/local/www/system_gateways_edit.php:481
+msgid ""
+"These define the low and high water marks for packet loss in %. Default is "
+"10/20."
+msgstr "「これらは%でパケット損失の低域と高ウォーターマークを定義します。デフォルトは "10/20 。"
+
+#: usr/local/www/system_gateways_edit.php:464
+#: usr/local/www/system_gateways_edit.php:496
+#: usr/local/www/system_gateways_edit.php:602
+#: usr/local/www/system_gateways_edit.php:606
+#: usr/local/www/system_gateways_edit.php:608
+#: usr/local/www/system_gateways_edit.php:638
+#: usr/local/www/system_gateways_edit.php:638
+msgid "Down"
+msgstr "ダウン"
+
+#: usr/local/www/system_gateways_edit.php:468
+msgid ""
+"This defines the down time for the alarm to fire in seconds. Default is 10."
+msgstr "「これは、秒単位で発射するアラームの停止時間を定義します。デフォルトは10です。"
+
+#: usr/local/www/system_gateways_edit.php:472
+#: usr/local/www/system_gateways_edit.php:485
+#: usr/local/www/system_gateways_edit.php:591
+#: usr/local/www/system_gateways_edit.php:595
+#: usr/local/www/system_gateways_edit.php:597
+#: usr/local/www/system_gateways_edit.php:627
+#: usr/local/www/system_gateways_edit.php:627
+msgid "Frequency Probe"
+msgstr "高周波プローブ"
+
+#: usr/local/www/system_gateways_edit.php:476
+msgid ""
+"This defines the frequency that an icmp probe will be sent in seconds. "
+"Default is 1."
+msgstr "「これは、ICMPプローブは数秒で送信される頻度を定義します。 「デフォルトは1です。"
+
+#: usr/local/www/system_groupmanager.php:49
+#: usr/local/www/system_groupmanager_addprivs.php:56
+#: usr/local/www/system_groupmanager.php:49
+#: usr/local/www/system_groupmanager_addprivs.php:56
+msgid "Group manager"
+msgstr "グループマネージャー"
+
+#: usr/local/www/system_groupmanager.php:72
+#: usr/local/www/system_groupmanager.php:96
+#: usr/local/www/system_usermanager.php:90
+#: usr/local/www/system_usermanager.php:105
+#: usr/local/www/system_groupmanager.php:72
+#: usr/local/www/system_groupmanager.php:96
+#: usr/local/www/system_usermanager.php:90
+#: usr/local/www/system_usermanager.php:105
+msgid "successfully deleted"
+msgstr "正常に削除"
+
+#: usr/local/www/system_groupmanager.php:95
+#: usr/local/www/system_usermanager.php:104
+#: usr/local/www/system_groupmanager.php:95
+#: usr/local/www/system_usermanager.php:104
+msgid "Privilege"
+msgstr "特権"
+
+#: usr/local/www/system_groupmanager.php:122
+#: usr/local/www/system_groupmanager.php:122
+msgid "The group name contains invalid characters."
+msgstr "グループ名は無効な文字が含まれています。"
+
+#: usr/local/www/system_groupmanager.php:128
+#: usr/local/www/system_groupmanager.php:128
+msgid "Another entry with the same group name already exists."
+msgstr "同じグループ名を持つ別のエントリがすでに存在しています。"
+
+#: usr/local/www/system_groupmanager.php:262
+#: usr/local/www/system_usermanager.php:462
+#: usr/local/www/system_usermanager.php:460
+#: usr/local/www/system_groupmanager.php:262
+#: usr/local/www/system_usermanager.php:460
+msgid "Defined by"
+msgstr "で定義された"
+
+#: usr/local/www/system_groupmanager.php:269
+#: usr/local/www/system_groupmanager.php:404
+#: usr/local/www/system_groupmanager.php:405
+#: usr/local/www/system_groupmanager.php:269
+#: usr/local/www/system_groupmanager.php:405
+msgid "Group name"
+msgstr "グループ名"
+
+#: usr/local/www/system_groupmanager.php:279
+#: usr/local/www/system_groupmanager.php:279
+msgid "Group description, for your own information only"
+msgstr "あなた自身の情報のみのグループの説明、"
+
+#: usr/local/www/system_groupmanager.php:286
+#: usr/local/www/system_usermanager.php:511
+#: usr/local/www/system_usermanager.php:509
+#: usr/local/www/system_groupmanager.php:286
+#: usr/local/www/system_usermanager.php:509
+msgid "Group Memberships"
+msgstr "グループメンバーシップ"
+
+#: usr/local/www/system_groupmanager.php:291
+#: usr/local/www/system_groupmanager.php:291
+msgid "Not Members"
+msgstr "いないメンバー"
+
+#: usr/local/www/system_groupmanager.php:309
+#: usr/local/www/system_groupmanager.php:309
+msgid "Add Members"
+msgstr "メンバーを追加"
+
+#: usr/local/www/system_groupmanager.php:313
+#: usr/local/www/system_groupmanager.php:313
+msgid "Remove Members"
+msgstr "メンバーを削除"
+
+#: usr/local/www/system_groupmanager.php:334
+#: usr/local/www/system_groupmanager_addprivs.php:196
+#: usr/local/www/system_usermanager.php:565
+#: usr/local/www/system_usermanager_addprivs.php:193
+#: usr/local/www/system_usermanager.php:563
+#: usr/local/www/system_groupmanager_addprivs.php:194
+#: usr/local/www/system_groupmanager.php:334
+#: usr/local/www/system_usermanager_addprivs.php:193
+#: usr/local/www/system_groupmanager_addprivs.php:194
+#: usr/local/www/system_usermanager.php:563
+msgid "Hold down CTRL (pc)/COMMAND (mac) key to select multiple items"
+msgstr "複数の項目を選択するには、CTRL ( PC ) / Commandキー(Mac )キーを押したまま"
+
+#: usr/local/www/system_groupmanager.php:342
+#: usr/local/www/system_groupmanager.php:342
+msgid "Assigned Privileges"
+msgstr "割り当てられた権限"
+
+#: usr/local/www/system_groupmanager.php:363
+#: usr/local/www/system_usermanager.php:601
+#: usr/local/www/system_usermanager.php:599
+#: usr/local/www/system_groupmanager.php:363
+#: usr/local/www/system_usermanager.php:599
+msgid "Do you really want to delete this privilege?"
+msgstr "あなたは本当に、この権限を削除しますか?"
+
+#: usr/local/www/system_groupmanager.php:406
+#: usr/local/www/system_groupmanager.php:407
+#: usr/local/www/system_groupmanager.php:407
+msgid "Member Count"
+msgstr "メンバー数"
+
+#: usr/local/www/system_groupmanager.php:447
+#: usr/local/www/system_groupmanager.php:450
+#: usr/local/www/system_groupmanager.php:468
+#: usr/local/www/system_groupmanager.php:468
+msgid "Do you really want to delete this group?"
+msgstr "あなたは本当にこのグループを削除しますか?"
+
+#: usr/local/www/system_groupmanager.php:448
+#: usr/local/www/system_groupmanager.php:451
+#: usr/local/www/system_groupmanager.php:469
+#: usr/local/www/system_groupmanager.php:469
+msgid "delete group"
+msgstr "グループを削除"
+
+#: usr/local/www/system_groupmanager.php:460
+#: usr/local/www/system_groupmanager.php:465
+#: usr/local/www/system_groupmanager.php:415
+#: usr/local/www/system_groupmanager.php:415
+msgid "add group"
+msgstr "グループを追加"
+
+#: usr/local/www/system_groupmanager.php:467
+msgid ""
+"Additional webConfigurator groups can be added here. \n"
+"ttttttttGroup permissions can be assigned which are inherited by "
+"users who are members of the group.\n"
+"ttttttttAn icon that appears grey indicates that it is a system "
+"defined object.\n"
+"ttttttttSome system object properties can be modified but they "
+"cannot be deleted."
+msgstr "「追加webConfiguratorグループは、ここで追加することができます。 \n 」 ttttttttGroup許可が灰色、それがシステム」に定義されたオブジェクトであることを示して表示されttttttttAnアイコン」 group.\nのメンバーであるユーザー」に継承されて割り当てることができます。 \n 「 ttttttttSomeシステムオブジェクトのプロパティを変更できますが、それらは「削除できません。"
+
+#: usr/local/www/system_groupmanager_addprivs.php:56
+#: usr/local/www/system_groupmanager_addprivs.php:56
+msgid "Add privileges"
+msgstr "特権を追加"
+
+#: usr/local/www/system_groupmanager_addprivs.php:79
+#: usr/local/www/system_usermanager_addprivs.php:84
+#: usr/local/www/system_usermanager_addprivs.php:84
+#: usr/local/www/system_groupmanager_addprivs.php:79
+msgid "Selected priveleges"
+msgstr "選択したpriveleges"
+
+#: usr/local/www/system_groupmanager_addprivs.php:182
+#: usr/local/www/system_usermanager_addprivs.php:181
+#: usr/local/www/system_groupmanager_addprivs.php:180
+#: usr/local/www/system_usermanager_addprivs.php:181
+#: usr/local/www/system_groupmanager_addprivs.php:180
+msgid "System Privileges"
+msgstr "システム権限"
+
+#: usr/local/www/system_groupmanager_addprivs.php:218
+#: usr/local/www/system_usermanager_addprivs.php:199
+#: usr/local/www/system_groupmanager_addprivs.php:216
+#: usr/local/www/system_usermanager_addprivs.php:199
+#: usr/local/www/system_groupmanager_addprivs.php:218
+msgid "Select a privilege from the list above for a description"
+msgstr "説明については、上記のリストから権限を選択"
+
+#: usr/local/www/system_usermanager.php:157
+#: usr/local/www/system_usermanager.php:692
+#: usr/local/www/system_usermanager.php:701
+#: usr/local/www/vpn_ipsec_phase1.php:166
+#: usr/local/www/vpn_openvpn_client.php:210
+#: usr/local/www/vpn_openvpn_server.php:282
+#: usr/local/www/system_usermanager.php:690
+#: usr/local/www/system_usermanager.php:699
+#: usr/local/www/vpn_openvpn_server.php:287
+#: usr/local/www/vpn_openvpn_client.php:214
+#: usr/local/www/vpn_openvpn_server.php:288
+#: usr/local/www/vpn_openvpn_client.php:220
+#: usr/local/www/vpn_openvpn_client.php:238
+#: usr/local/www/vpn_openvpn_server.php:309
+#: usr/local/www/vpn_openvpn_client.php:238
+#: usr/local/www/vpn_ipsec_phase1.php:166
+#: usr/local/www/system_usermanager.php:157
+#: usr/local/www/system_usermanager.php:690
+#: usr/local/www/system_usermanager.php:699
+#: usr/local/www/vpn_openvpn_server.php:309
+msgid "Certificate"
+msgstr "証明書"
+
+#: usr/local/www/system_usermanager.php:158
+#: usr/local/www/system_usermanager.php:158
+msgid "association removed."
+msgstr "関連付けは削除されます。"
+
+#: usr/local/www/system_usermanager.php:202
+#: usr/local/www/system_usermanager.php:202
+msgid "The username is longer than 16 characters."
+msgstr "ユーザー名は16文字を超えている。"
+
+#: usr/local/www/system_usermanager.php:226
+#: usr/local/www/system_usermanager.php:226
+msgid "That username is reserved by the system."
+msgstr "そのユーザー名は、システムによって予約されています。"
+
+#: usr/local/www/system_usermanager.php:250
+#: usr/local/www/system_usermanager.php:246
+#: usr/local/www/system_usermanager.php:246
+msgid "Invalid expiration date format; use MM/DD/YYYY instead."
+msgstr "無効な有効期限の日付フォーマット、代わりに、MM / DD / YYYYを使用しています。"
+
+#: usr/local/www/system_usermanager.php:257
+#: usr/local/www/system_usermanager.php:253
+#: usr/local/www/system_usermanager.php:253
+msgid "Invalid internal Certificate Authority"
+msgstr "無効な内部認証局"
+
+#: usr/local/www/system_usermanager.php:489
+#: usr/local/www/system_usermanager_passwordmg.php:109
+#: usr/local/www/system_usermanager.php:487
+#: usr/local/www/system_usermanager_passwordmg.php:110
+#: usr/local/www/system_usermanager_passwordmg.php:115
+#: usr/local/www/system_usermanager_passwordmg.php:115
+#: usr/local/www/system_usermanager.php:487
+msgid "(confirmation)"
+msgstr "(確認)"
+
+#: usr/local/www/system_usermanager.php:493
+#: usr/local/www/system_usermanager.php:788
+#: usr/local/www/system_usermanager.php:491
+#: usr/local/www/system_usermanager.php:786
+#: usr/local/www/system_usermanager.php:787
+#: usr/local/www/system_usermanager.php:491
+#: usr/local/www/system_usermanager.php:787
+msgid "Full name"
+msgstr "フルネーム"
+
+#: usr/local/www/system_usermanager.php:497
+#: usr/local/www/system_usermanager.php:495
+#: usr/local/www/system_usermanager.php:495
+msgid "User's full name, for your own information only"
+msgstr "あなた自身の情報のみのためにユーザーの氏名、"
+
+#: usr/local/www/system_usermanager.php:501
+#: usr/local/www/system_usermanager.php:499
+#: usr/local/www/system_usermanager.php:499
+msgid "Expiration date"
+msgstr "有効期限"
+
+#: usr/local/www/system_usermanager.php:505
+#: usr/local/www/system_usermanager.php:503
+#: usr/local/www/system_usermanager.php:503
+msgid "Pick a date"
+msgstr "日付を選択する"
+
+#: usr/local/www/system_usermanager.php:508
+#: usr/local/www/system_usermanager.php:506
+#: usr/local/www/system_usermanager.php:506
+msgid ""
+"Leave blank if the account shouldn't expire, otherwise enter the expiration "
+"date in the following format: mm/dd/yyyy"
+msgstr "次の形式で日付"アカウントの有効期限が切れていないかどうかそうでない有効期限を入力し、空白のままにします」 : MM / DD / YYYY"
+
+#: usr/local/www/system_usermanager.php:516
+#: usr/local/www/system_usermanager.php:514
+#: usr/local/www/system_usermanager.php:514
+msgid "Not Member Of"
+msgstr "のメンバーじゃないの"
+
+#: usr/local/www/system_usermanager.php:536
+#: usr/local/www/system_usermanager.php:534
+#: usr/local/www/system_usermanager.php:534
+msgid "Add Groups"
+msgstr "グループの追加"
+
+#: usr/local/www/system_usermanager.php:540
+#: usr/local/www/system_usermanager.php:538
+#: usr/local/www/system_usermanager.php:538
+msgid "Remove Groups"
+msgstr "グループを削除する"
+
+#: usr/local/www/system_usermanager.php:544
+#: usr/local/www/system_usermanager.php:542
+#: usr/local/www/system_usermanager.php:542
+msgid "Member Of"
+msgstr "メンバーの"
+
+#: usr/local/www/system_usermanager.php:572
+#: usr/local/www/system_usermanager.php:570
+#: usr/local/www/system_usermanager.php:570
+msgid "Effective Privileges"
+msgstr "効果的な権限"
+
+#: usr/local/www/system_usermanager.php:576
+#: usr/local/www/system_usermanager.php:574
+#: usr/local/www/system_usermanager.php:574
+msgid "Inherited From"
+msgstr "から継承されています"
+
+#: usr/local/www/system_usermanager.php:626
+#: usr/local/www/system_usermanager.php:624
+#: usr/local/www/system_usermanager.php:624
+msgid "User Certificates"
+msgstr "ユーザー証明書"
+
+#: usr/local/www/system_usermanager.php:631
+#: usr/local/www/system_usermanager.php:629
+#: usr/local/www/system_usermanager.php:629
+msgid "CA"
+msgstr "カリフォルニア州"
+
+#: usr/local/www/system_usermanager.php:655
+#: usr/local/www/system_usermanager.php:653
+#: usr/local/www/system_usermanager.php:653
+msgid "export private key"
+msgstr "[秘密キーのエクスポート"
+
+#: usr/local/www/system_usermanager.php:660
+#: usr/local/www/system_usermanager.php:658
+#: usr/local/www/system_usermanager.php:658
+msgid "Do you really want to remove this certificate association?"
+msgstr "あなたは本当にこの証明書の関連付けを削除しますか?"
+
+#: usr/local/www/system_usermanager.php:660
+#: usr/local/www/system_usermanager.php:658
+#: usr/local/www/system_usermanager.php:658
+msgid "(Certificate will not be deleted)"
+msgstr "(証明書は削除されません)"
+
+#: usr/local/www/system_usermanager.php:694
+#: usr/local/www/system_usermanager.php:692
+#: usr/local/www/system_usermanager.php:692
+msgid "Click to create a user certificate."
+msgstr "ユーザー証明書を作成する場合にクリックします。"
+
+#: usr/local/www/system_usermanager.php:752
+#: usr/local/www/system_usermanager.php:758
+#: usr/local/www/system_usermanager.php:750
+#: usr/local/www/system_usermanager.php:756
+#: usr/local/www/system_usermanager.php:750
+#: usr/local/www/system_usermanager.php:756
+msgid "Authorized keys"
+msgstr "認証キー"
+
+#: usr/local/www/system_usermanager.php:754
+#: usr/local/www/system_usermanager.php:752
+#: usr/local/www/system_usermanager.php:752
+msgid "Click to paste an authorized key."
+msgstr "許可されたキーを貼り付け]をクリックします。"
+
+#: usr/local/www/system_usermanager.php:762
+#: usr/local/www/system_usermanager.php:760
+#: usr/local/www/system_usermanager.php:760
+msgid "Paste an authorized keys file here."
+msgstr "認証キーは、ここでファイルを貼り付けます。"
+
+#: usr/local/www/system_usermanager.php:766
+#: usr/local/www/system_usermanager.php:764
+#: usr/local/www/system_usermanager.php:764
+msgid "IPsec Pre-Shared Key"
+msgstr "IPsecの事前共有キー"
+
+#: usr/local/www/system_usermanager.php:828
+#: usr/local/www/system_usermanager.php:826
+#: usr/local/www/system_usermanager.php:829
+#: usr/local/www/system_usermanager.php:852
+#: usr/local/www/system_usermanager.php:852
+msgid "Do you really want to delete this User?"
+msgstr "あなたは本当にこのユーザを削除しますか?"
+
+#: usr/local/www/system_usermanager.php:849
+#: usr/local/www/system_usermanager.php:847
+#: usr/local/www/system_usermanager.php:852
+#: usr/local/www/system_usermanager.php:805
+#: usr/local/www/system_usermanager.php:805
+msgid ""
+"Additional users can be added here. User permissions for accessing the "
+"webConfigurator can be assigned directly or inherited from group "
+"memberships. An icon that appears grey indicates that it is a system defined "
+"object. Some system object properties can be modified but they cannot be "
+"deleted."
+msgstr "「追加ユーザーは、ここで追加することができます。アクセスするためのユーザー権限」 webConfiguratorが直接割り当てたり、グループから継承することができ、「メンバーシップ。グレーに表示されるアイコンは、それが定義されたシステムであることを示している"オブジェクト。いくつかのシステムオブジェクトのプロパティを変更することができますが、 「削除できません。"
+
+#: usr/local/www/system_usermanager.php:854
+#: usr/local/www/system_usermanager.php:852
+#: usr/local/www/system_usermanager.php:857
+#: usr/local/www/system_usermanager.php:810
+#: usr/local/www/system_usermanager.php:810
+msgid ""
+"Accounts created here are also used for other parts of the system such as "
+"OpenVPN, IPsec, and Captive Portal."
+msgstr "OpenVPNは、 IPsec、およびキャプティブポータル「ここで作成したアカウントはまた、などのシステムの他の部分に使用されます」 。"
+
+#: usr/local/www/system_usermanager_passwordmg.php:43
+#: usr/local/www/system_usermanager_passwordmg.php:43
+msgid "User Password"
+msgstr "利用者パスワード"
+
+#: usr/local/www/system_usermanager_passwordmg.php:63
+#: usr/local/www/system_usermanager_passwordmg.php:63
+msgid "Password successfully changed"
+msgstr "パスワードは正常に変更された"
+
+#: usr/local/www/system_usermanager_passwordmg.php:86
+#: usr/local/www/system_usermanager_passwordmg.php:87
+#: usr/local/www/system_usermanager_passwordmg.php:92
+#: usr/local/www/system_usermanager_passwordmg.php:92
+msgid "Sorry, you cannot change the password for a non-local user."
+msgstr "申し訳ありませんが、あなたが非ローカルユーザーのパスワードを変更することはできません。"
+
+#: usr/local/www/system_usermanager_passwordmg.php:112
+#: usr/local/www/system_usermanager_passwordmg.php:113
+#: usr/local/www/system_usermanager_passwordmg.php:118
+#: usr/local/www/system_usermanager_passwordmg.php:118
+msgid "Select a new password"
+msgstr "新しいパスワードを選択する"
+
+#: usr/local/www/system_usermanager_settings.php:51
+#: usr/local/www/system_usermanager_settings.php:51
+msgid "User manager settings"
+msgstr "ユーザーマネージャの設定"
+
+#: usr/local/www/system_usermanager_settings.php:61
+#: usr/local/www/system_usermanager_settings.php:61
+msgid "Session timeout must be an integer value."
+msgstr "セッションタイムアウトは整数値でなければなりません。"
+
+#: usr/local/www/system_usermanager_settings.php:71
+#: usr/local/www/system_usermanager_settings.php:71
+msgid ""
+"The test was not performed because it is supported only for ldap based "
+"backends."
+msgstr "バックエンド"それが唯一のLDAPベースではサポートされているため、テストは実行されませんでした」 。"
+
+#: usr/local/www/system_usermanager_settings.php:131
+#: usr/local/www/system_usermanager_settings.php:134
+#: usr/local/www/system_usermanager_settings.php:134
+msgid "Session Timeout"
+msgstr "セッションタイムアウト"
+
+#: usr/local/www/system_usermanager_settings.php:135
+#: usr/local/www/system_usermanager_settings.php:138
+#: usr/local/www/system_usermanager_settings.php:138
+msgid ""
+"Time in minutes to expire idle management sessions. The default is 4 hours "
+"(240 minutes)."
+msgstr "「時間は分単位でアイドルの管理セッションを期限切れにする。デフォルトは4時間です」 ( 240分) 。"
+
+#: usr/local/www/system_usermanager_settings.php:136
+#: usr/local/www/system_usermanager_settings.php:139
+#: usr/local/www/system_usermanager_settings.php:139
+msgid "Enter 0 to never expire sessions. NOTE: This is a security risk!"
+msgstr "セッションを無期限にするには、0を入力してください。注:これは、セキュリティリスクのです!"
+
+#: usr/local/www/system_usermanager_settings.php:162
+#: usr/local/www/system_usermanager_settings.php:165
+#: usr/local/www/system_usermanager_settings.php:165
+msgid "Save and Test"
+msgstr "保存してテスト"
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:97
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:97
+msgid ""
+"Could not connect to the LDAP server. Please check your LDAP configuration."
+msgstr "「 LDAPサーバーに接続できませんでした。あなたのLDAP設定を確認してください。"
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:98
+#: usr/local/www/system_usermanager_settings_test.php:119
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:98
+#: usr/local/www/system_usermanager_settings_test.php:119
+msgid "Close"
+msgstr "クローズ"
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:100
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:100
+msgid "Please select which containers to Authenticate against:"
+msgstr "に対して認証をどのコンテナを選択してください:"
+
+#: usr/local/www/system_usermanager_settings_test.php:76
+#: usr/local/www/system_usermanager_settings_test.php:76
+#, php-format
+msgid "Could not find settings for %s%s"
+msgstr "%s%sの設定を見つけることができませんでした"
+
+#: usr/local/www/system_usermanager_settings_test.php:78
+msgid "Testing pfSense LDAP settings... One moment please..."
+msgstr "テストpfSenseのLDAP設定...しばらくお待ちください..."
+
+#: usr/local/www/system_usermanager_settings_test.php:82
+#: usr/local/www/system_usermanager_settings_test.php:82
+msgid "Attempting connection to"
+msgstr "への接続を試みる"
+
+#: usr/local/www/system_usermanager_settings_test.php:86
+#: usr/local/www/system_usermanager_settings_test.php:86
+msgid "Attempting bind to"
+msgstr "にバインドを試みる"
+
+#: usr/local/www/system_usermanager_settings_test.php:90
+#: usr/local/www/system_usermanager_settings_test.php:90
+msgid "Attempting to fetch Organizational Units from"
+msgstr "から組織単位を取得しようとすると、"
+
+#: usr/local/www/system_usermanager_settings_test.php:96
+#: usr/local/www/system_usermanager_settings_test.php:96
+msgid "Organization units found"
+msgstr "見つかった組織単位"
+
+#: usr/local/www/system_usermanager_settings_test.php:103
+#: usr/local/www/system_usermanager_settings_test.php:108
+#: usr/local/www/system_usermanager_settings_test.php:112
+#: usr/local/www/system_usermanager_settings_test.php:103
+#: usr/local/www/system_usermanager_settings_test.php:108
+#: usr/local/www/system_usermanager_settings_test.php:112
+msgid "failed"
+msgstr "失敗した"
+
+#: usr/local/www/upload_progress.php:44
+msgid "Sorry, we could not find an uploadid code."
+msgstr "申し訳ありませんが、我々はuploadidコードを見つけることができませんでした。"
+
+#: usr/local/www/upload_progress.php:86
+msgid "Uploading Files"
+msgstr "ファイルのアップロード"
+
+#: usr/local/www/upload_progress.php:86
+msgid "Please wait"
+msgstr "しばらくお待ちください"
+
+#: usr/local/www/upload_progress.php:95
+msgid "Uploading file"
+msgstr "ファイルのアップロード"
+
+#: usr/local/www/upload_progress.php:123
+msgid "Uploaded"
+msgstr "アップロードされた"
+
+#: usr/local/www/upload_progress.php:133
+msgid "File Size"
+msgstr "ファイルサイズ"
+
+#: usr/local/www/upload_progress.php:145
+msgid "Completed"
+msgstr "完成した"
+
+#: usr/local/www/upload_progress.php:155
+msgid "Estimated"
+msgstr "推定"
+
+#: usr/local/www/vpn_ipsec_phase1.php:160
+#: usr/local/www/vpn_ipsec_phase1.php:662
+#: usr/local/www/vpn_ipsec_phase1.php:675
+#: usr/local/www/vpn_ipsec_mobile.php:347 usr/local/www/vpn_ipsec_keys.php:104
+#: usr/local/www/vpn_ipsec_keys_edit.php:69
+#: usr/local/www/vpn_ipsec_keys_edit.php:135 usr/local/www/interfaces.php:2486
+#: usr/local/www/vpn_ipsec_phase1.php:674
+#: usr/local/www/vpn_ipsec_phase1.php:695 usr/local/www/interfaces.php:2516
+#: usr/local/www/interfaces.php:2562 usr/local/www/interfaces.php:2551
+#: usr/local/www/vpn_ipsec_keys_edit.php:69
+#: usr/local/www/vpn_ipsec_keys_edit.php:135
+#: usr/local/www/vpn_ipsec_phase1.php:160
+#: usr/local/www/vpn_ipsec_phase1.php:695
+#: usr/local/www/vpn_ipsec_mobile.php:347 usr/local/www/vpn_ipsec_keys.php:104
+#: usr/local/www/interfaces.php:2551
+msgid "Pre-Shared Key"
+msgstr "事前共有鍵"
+
+#: usr/local/www/vpn_ipsec_phase1.php:171
+#: usr/local/www/vpn_ipsec_phase1.php:564
+#: usr/local/www/vpn_ipsec_phase1.php:577
+#: usr/local/www/vpn_ipsec_phase1.php:576
+#: usr/local/www/vpn_ipsec_phase1.php:597
+#: usr/local/www/vpn_ipsec_phase1.php:171
+#: usr/local/www/vpn_ipsec_phase1.php:597
+msgid "Remote gateway"
+msgstr "リモートゲートウェイ"
+
+#: usr/local/www/vpn_ipsec_phase1.php:177
+#: usr/local/www/vpn_ipsec_phase1.php:177
+msgid "The P1 lifetime must be an integer."
+msgstr "P1は寿命が整数でなければなりません。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:180
+#: usr/local/www/vpn_ipsec_phase1.php:181
+#: usr/local/www/vpn_ipsec_phase1.php:181
+msgid "A valid remote gateway address or host name must be specified."
+msgstr "有効なリモートゲートウェイアドレスまたはホスト名を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:188
+#: usr/local/www/vpn_ipsec_phase1.php:194
+#: usr/local/www/vpn_ipsec_phase1.php:194
+#, php-format
+msgid "The remote gateway "%1$s" is already used by phase1 "%2$s"."
+msgstr "リモートゲートウェイ」は%1$s "はすでにフェーズ1 」 %2$s 」で使用されます。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:201
+#: usr/local/www/vpn_ipsec_phase1.php:222
+#: usr/local/www/vpn_ipsec_phase1.php:222
+msgid "Please enter an address for 'My Identifier'"
+msgstr "「私の識別子'のアドレスを入力してください。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:204
+#: usr/local/www/vpn_ipsec_phase1.php:225
+#: usr/local/www/vpn_ipsec_phase1.php:225
+msgid "Please enter a keyid tag for 'My Identifier'"
+msgstr "「私の識別子'のための鍵IDタグを入力してください"
+
+#: usr/local/www/vpn_ipsec_phase1.php:207
+#: usr/local/www/vpn_ipsec_phase1.php:228
+#: usr/local/www/vpn_ipsec_phase1.php:228
+msgid "Please enter a fully qualified domain name for 'My Identifier'"
+msgstr "「私の識別子'の完全修飾ドメイン名を入力してください"
+
+#: usr/local/www/vpn_ipsec_phase1.php:210
+#: usr/local/www/vpn_ipsec_phase1.php:231
+#: usr/local/www/vpn_ipsec_phase1.php:231
+msgid "Please enter a user and fully qualified domain name for 'My Identifier'"
+msgstr "「私の識別子'のユーザーと完全修飾ドメイン名を入力してください"
+
+#: usr/local/www/vpn_ipsec_phase1.php:213
+#: usr/local/www/vpn_ipsec_phase1.php:234
+#: usr/local/www/vpn_ipsec_phase1.php:234
+msgid "Please enter a dynamic domain name for 'My Identifier'"
+msgstr "「私の識別子'の動的なドメイン名を入力してください"
+
+#: usr/local/www/vpn_ipsec_phase1.php:216
+#: usr/local/www/vpn_ipsec_phase1.php:237
+#: usr/local/www/vpn_ipsec_phase1.php:237
+msgid "A valid IP address for 'My identifier' must be specified."
+msgstr "「私の識別子'の有効なIPアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:219
+#: usr/local/www/vpn_ipsec_phase1.php:240
+#: usr/local/www/vpn_ipsec_phase1.php:240
+msgid "A valid domain name for 'My identifier' must be specified."
+msgstr "「私の識別子'のための有効なドメイン名を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:223
+#: usr/local/www/vpn_ipsec_phase1.php:244
+#: usr/local/www/vpn_ipsec_phase1.php:244
+msgid "A valid FQDN for 'My identifier' must be specified."
+msgstr "「私の識別子'の有効なFQDNは指定しなければなりません。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:228
+#: usr/local/www/vpn_ipsec_phase1.php:249
+#: usr/local/www/vpn_ipsec_phase1.php:249
+msgid ""
+"A valid User FQDN in the form of user@my.domain.com for 'My identifier' must "
+"be specified."
+msgstr "「「私の識別子'のuser@my.domain.comの形で有効なユーザFQDNはなりません」指定され。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:233
+#: usr/local/www/vpn_ipsec_phase1.php:254
+#: usr/local/www/vpn_ipsec_phase1.php:254
+msgid "A valid Dynamic DNS address for 'My identifier' must be specified."
+msgstr "「私の識別子'の有効なダイナミックDNSアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:243
+#: usr/local/www/vpn_ipsec_phase1.php:264
+#: usr/local/www/vpn_ipsec_phase1.php:264
+msgid "Please enter an address for 'Peer Identifier'"
+msgstr "「ピア識別子'のアドレスを入力してください。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:246
+#: usr/local/www/vpn_ipsec_phase1.php:267
+#: usr/local/www/vpn_ipsec_phase1.php:267
+msgid "Please enter a keyid tag for 'Peer Identifier'"
+msgstr "「ピア識別子'の鍵IDタグを入力してください"
+
+#: usr/local/www/vpn_ipsec_phase1.php:249
+#: usr/local/www/vpn_ipsec_phase1.php:270
+#: usr/local/www/vpn_ipsec_phase1.php:270
+msgid "Please enter a fully qualified domain name for 'Peer Identifier'"
+msgstr "「ピア識別子'の完全修飾ドメイン名を入力してください"
+
+#: usr/local/www/vpn_ipsec_phase1.php:252
+#: usr/local/www/vpn_ipsec_phase1.php:273
+#: usr/local/www/vpn_ipsec_phase1.php:273
+msgid ""
+"Please enter a user and fully qualified domain name for 'Peer Identifier'"
+msgstr "「「ピア識別子'のユーザーと完全修飾ドメイン名を入力してください"
+
+#: usr/local/www/vpn_ipsec_phase1.php:255
+#: usr/local/www/vpn_ipsec_phase1.php:276
+#: usr/local/www/vpn_ipsec_phase1.php:276
+msgid "A valid IP address for 'Peer identifier' must be specified."
+msgstr "「ピア識別子'の有効なIPアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:258
+#: usr/local/www/vpn_ipsec_phase1.php:279
+#: usr/local/www/vpn_ipsec_phase1.php:279
+msgid "A valid domain name for 'Peer identifier' must be specified."
+msgstr "「ピア識別子'の有効なドメイン名を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:262
+#: usr/local/www/vpn_ipsec_phase1.php:283
+#: usr/local/www/vpn_ipsec_phase1.php:283
+msgid "A valid FQDN for 'Peer identifier' must be specified."
+msgstr "「ピア識別子'の有効なFQDNは指定しなければなりません。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:267
+#: usr/local/www/vpn_ipsec_phase1.php:288
+#: usr/local/www/vpn_ipsec_phase1.php:288
+msgid ""
+"A valid User FQDN in the form of user@my.domain.com for 'Peer identifier' "
+"must be specified."
+msgstr "「「ピア識別子'のuser@my.domain.comの形で有効なユーザFQDNは「指定しなければなりません。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:273
+#: usr/local/www/vpn_ipsec_phase1.php:294
+#: usr/local/www/vpn_ipsec_phase1.php:294
+msgid "A numeric value must be specified for DPD delay."
+msgstr "数値は、DPD遅延を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:276
+#: usr/local/www/vpn_ipsec_phase1.php:297
+#: usr/local/www/vpn_ipsec_phase1.php:297
+msgid "A numeric value must be specified for DPD retries."
+msgstr "数値は、DPD再試行を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:358
+#: usr/local/www/vpn_ipsec_phase1.php:360
+#: usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase1.php:381
+#: usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase1.php:381
+msgid "Edit Phase 1"
+msgstr "編集フェーズ1"
+
+#: usr/local/www/vpn_ipsec_phase1.php:509
+#: usr/local/www/vpn_openvpn_client.php:383
+#: usr/local/www/vpn_openvpn_csc.php:311
+#: usr/local/www/vpn_openvpn_server.php:601
+#: usr/local/www/vpn_openvpn_server.php:674
+#: usr/local/www/vpn_openvpn_client.php:388
+#: usr/local/www/vpn_openvpn_csc.php:310
+#: usr/local/www/vpn_openvpn_server.php:692
+#: usr/local/www/vpn_openvpn_client.php:396
+#: usr/local/www/vpn_ipsec_phase1.php:508
+#: usr/local/www/vpn_openvpn_client.php:414
+#: usr/local/www/vpn_ipsec_phase1.php:529
+#: usr/local/www/vpn_openvpn_server.php:718
+#: usr/local/www/vpn_openvpn_client.php:414
+#: usr/local/www/vpn_openvpn_csc.php:310
+#: usr/local/www/vpn_ipsec_phase1.php:529
+#: usr/local/www/vpn_openvpn_server.php:718
+msgid "General information"
+msgstr "一般的な情報"
+
+#: usr/local/www/vpn_ipsec_phase1.php:515
+#: usr/local/www/vpn_ipsec_phase1.php:514
+#: usr/local/www/vpn_ipsec_phase1.php:535
+#: usr/local/www/vpn_ipsec_phase1.php:535
+msgid "Disable this phase1 entry"
+msgstr "このフェーズ1のエントリを無効化"
+
+#: usr/local/www/vpn_ipsec_phase1.php:517
+#: usr/local/www/vpn_ipsec_phase1.php:516
+#: usr/local/www/vpn_ipsec_phase1.php:537
+#: usr/local/www/vpn_ipsec_phase1.php:537
+msgid ""
+"Set this option to disable this phase1 without removing it from the list"
+msgstr "「リストから削除せずに、このフェーズ1を無効にするには、このオプションを設定"
+
+#: usr/local/www/vpn_ipsec_phase1.php:523
+#: usr/local/www/vpn_ipsec_phase1.php:522
+#: usr/local/www/vpn_ipsec_phase1.php:543
+#: usr/local/www/vpn_ipsec_phase1.php:543
+msgid "Internet Protocol"
+msgstr "インターネットプロトコル"
+
+#: usr/local/www/vpn_ipsec_phase1.php:534
+#: usr/local/www/vpn_ipsec_phase1.php:533
+#: usr/local/www/vpn_ipsec_phase1.php:554
+#: usr/local/www/vpn_ipsec_phase1.php:554
+msgid "Select the Internet Protocol family from this dropdown"
+msgstr "このドロップダウンから、インターネットプロトコルファミリを選択"
+
+#: usr/local/www/vpn_ipsec_phase1.php:557
+#: usr/local/www/vpn_ipsec_phase1.php:570
+#: usr/local/www/vpn_ipsec_phase1.php:569
+#: usr/local/www/vpn_ipsec_phase1.php:590
+#: usr/local/www/vpn_ipsec_phase1.php:590
+msgid "Select the interface for the local endpoint of this phase1 entry"
+msgstr "このフェーズ1エントリのローカルエンドポイントのためのインターフェイスを選択し"
+
+#: usr/local/www/vpn_ipsec_phase1.php:568
+#: usr/local/www/vpn_ipsec_phase1.php:581
+#: usr/local/www/vpn_ipsec_phase1.php:580
+#: usr/local/www/vpn_ipsec_phase1.php:601
+#: usr/local/www/vpn_ipsec_phase1.php:601
+msgid "Enter the public IP address or host name of the remote gateway"
+msgstr "パブリックIPアドレスまたはリモートゲートウェイのホスト名を入力してください"
+
+#: usr/local/www/vpn_ipsec_phase1.php:590
+#: usr/local/www/vpn_ipsec_phase1.php:603
+#: usr/local/www/vpn_ipsec_phase1.php:602
+#: usr/local/www/vpn_ipsec_phase1.php:623
+#: usr/local/www/vpn_ipsec_phase1.php:623
+msgid "Phase 1 proposal (Authentication)"
+msgstr "フェーズ1プロポーザル(認証)"
+
+#: usr/local/www/vpn_ipsec_phase1.php:594
+#: usr/local/www/vpn_openvpn_client.php:514
+#: usr/local/www/vpn_openvpn_client.php:519
+#: usr/local/www/vpn_ipsec_phase1.php:607
+#: usr/local/www/vpn_openvpn_client.php:537
+#: usr/local/www/vpn_ipsec_phase1.php:606
+#: usr/local/www/vpn_openvpn_client.php:556
+#: usr/local/www/vpn_ipsec_phase1.php:627
+#: usr/local/www/vpn_openvpn_client.php:556
+#: usr/local/www/vpn_ipsec_phase1.php:627
+msgid "Authentication method"
+msgstr "認証方法"
+
+#: usr/local/www/vpn_ipsec_phase1.php:609
+#: usr/local/www/vpn_ipsec_phase1.php:735
+#: usr/local/www/vpn_ipsec_phase1.php:753
+#: usr/local/www/vpn_ipsec_phase1.php:622
+#: usr/local/www/vpn_ipsec_phase1.php:748
+#: usr/local/www/vpn_ipsec_phase1.php:766
+#: usr/local/www/vpn_ipsec_phase1.php:621
+#: usr/local/www/vpn_ipsec_phase1.php:747
+#: usr/local/www/vpn_ipsec_phase1.php:763
+#: usr/local/www/vpn_ipsec_phase1.php:642
+#: usr/local/www/vpn_ipsec_phase1.php:768
+#: usr/local/www/vpn_ipsec_phase1.php:784
+#: usr/local/www/vpn_ipsec_phase1.php:642
+#: usr/local/www/vpn_ipsec_phase1.php:768
+#: usr/local/www/vpn_ipsec_phase1.php:784
+msgid "Must match the setting chosen on the remote side"
+msgstr "リモート側で選択した設定と一致する必要があります"
+
+#: usr/local/www/vpn_ipsec_phase1.php:614
+#: usr/local/www/vpn_ipsec_phase1.php:627
+#: usr/local/www/vpn_ipsec_phase1.php:626
+#: usr/local/www/vpn_ipsec_phase1.php:647
+#: usr/local/www/vpn_ipsec_phase1.php:647
+msgid "Negotiation mode"
+msgstr "ネゴシエーションモード"
+
+#: usr/local/www/vpn_ipsec_phase1.php:625
+#: usr/local/www/vpn_ipsec_phase1.php:638
+#: usr/local/www/vpn_ipsec_phase1.php:637
+#: usr/local/www/vpn_ipsec_phase1.php:658
+#: usr/local/www/vpn_ipsec_phase1.php:658
+msgid "Aggressive is more flexible, but less secure"
+msgstr "攻撃的な、より柔軟な、しかし安全性が低くなります"
+
+#: usr/local/www/vpn_ipsec_phase1.php:629
+#: usr/local/www/vpn_ipsec_phase1.php:642
+#: usr/local/www/vpn_ipsec_phase1.php:641
+#: usr/local/www/vpn_ipsec_phase1.php:662
+#: usr/local/www/vpn_ipsec_phase1.php:662
+msgid "My identifier"
+msgstr "私の識別子"
+
+#: usr/local/www/vpn_ipsec_phase1.php:642
+#: usr/local/www/vpn_ipsec_phase1.php:655
+#: usr/local/www/vpn_ipsec_phase1.php:654
+#: usr/local/www/vpn_ipsec_phase1.php:675
+#: usr/local/www/vpn_ipsec_phase1.php:675
+msgid "Peer identifier"
+msgstr "ピア識別子"
+
+#: usr/local/www/vpn_ipsec_phase1.php:657
+#: usr/local/www/vpn_ipsec_phase1.php:670
+#: usr/local/www/vpn_ipsec_phase1.php:669
+#: usr/local/www/vpn_ipsec_phase1.php:690
+#: usr/local/www/vpn_ipsec_phase1.php:690
+msgid ""
+"NOTE: This is known as the "group" setting on some VPN client "
+"implementations"
+msgstr ""注:これはとして知られている"の実装、 "一部のVPNクライアントの設定」グループ"
+
+#: usr/local/www/vpn_ipsec_phase1.php:668
+#: usr/local/www/vpn_ipsec_phase1.php:681
+msgid "Input your pre-shared key string"
+msgstr "入力あなたの事前共有キーの文字列"
+
+#: usr/local/www/vpn_ipsec_phase1.php:673
+#: usr/local/www/vpn_ipsec_phase1.php:686
+#: usr/local/www/vpn_ipsec_phase1.php:685
+#: usr/local/www/vpn_ipsec_phase1.php:706
+#: usr/local/www/vpn_ipsec_phase1.php:706
+msgid "Policy Generation"
+msgstr "ポリシー生成"
+
+#: usr/local/www/vpn_ipsec_phase1.php:684
+#: usr/local/www/vpn_ipsec_phase1.php:697
+#: usr/local/www/vpn_ipsec_phase1.php:696
+#: usr/local/www/vpn_ipsec_phase1.php:717
+#: usr/local/www/vpn_ipsec_phase1.php:717
+msgid ""
+"When working as a responder (as with mobile clients), this controls how "
+"policies are generated based on SA proposals."
+msgstr "ポリシーは、SAの提案に基づいて生成された」 (モバイルクライアントと同様に)応答者として働いていたときに、これはどのように制御する「 。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:689
+#: usr/local/www/vpn_ipsec_phase1.php:702
+#: usr/local/www/vpn_ipsec_phase1.php:701
+#: usr/local/www/vpn_ipsec_phase1.php:722
+#: usr/local/www/vpn_ipsec_phase1.php:722
+msgid "Proposal Checking"
+msgstr "プロポーザルのチェック"
+
+#: usr/local/www/vpn_ipsec_phase1.php:700
+#: usr/local/www/vpn_ipsec_phase1.php:713
+#: usr/local/www/vpn_ipsec_phase1.php:712
+#: usr/local/www/vpn_ipsec_phase1.php:733
+#: usr/local/www/vpn_ipsec_phase1.php:733
+msgid ""
+"Specifies the action of lifetime length, key length, and PFS of the phase 2 "
+"selection on the responder side, and the action of lifetime check in phase 1."
+msgstr "「寿命の長さ、キーの長さのアクションを指定し、フェーズ2のPFS 「応答者側の選択、およびフェーズ1での寿命確認の作用。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:705
+#: usr/local/www/vpn_openvpn_client.php:706
+#: usr/local/www/vpn_openvpn_server.php:898
+#: usr/local/www/vpn_openvpn_server.php:971
+#: usr/local/www/vpn_openvpn_client.php:711
+#: usr/local/www/vpn_ipsec_phase1.php:718
+#: usr/local/www/vpn_openvpn_server.php:999
+#: usr/local/www/vpn_openvpn_client.php:729
+#: usr/local/www/vpn_ipsec_phase1.php:717
+#: usr/local/www/vpn_openvpn_client.php:748
+#: usr/local/www/vpn_ipsec_phase1.php:738
+#: usr/local/www/vpn_openvpn_server.php:1026
+#: usr/local/www/vpn_openvpn_client.php:748
+#: usr/local/www/vpn_ipsec_phase1.php:738
+#: usr/local/www/vpn_openvpn_server.php:1026
+msgid "Encryption algorithm"
+msgstr "暗号化アルゴリズム"
+
+#: usr/local/www/vpn_ipsec_phase1.php:724
+#: usr/local/www/vpn_ipsec_phase1.php:737
+#: usr/local/www/vpn_ipsec_phase1.php:736
+#: usr/local/www/vpn_ipsec_phase1.php:757
+#: usr/local/www/vpn_ipsec_phase1.php:757
+msgid "Hash algorithm"
+msgstr "ハッシュアルゴリズム"
+
+#: usr/local/www/vpn_ipsec_phase1.php:740
+#: usr/local/www/vpn_ipsec_phase1.php:753
+#: usr/local/www/vpn_ipsec_phase1.php:752
+#: usr/local/www/vpn_ipsec_phase1.php:773
+#: usr/local/www/vpn_ipsec_phase1.php:773
+msgid "DH key group"
+msgstr "DH鍵グループ"
+
+#: usr/local/www/vpn_ipsec_phase1.php:751
+#: usr/local/www/vpn_ipsec_phase2.php:603
+#: usr/local/www/vpn_ipsec_phase2.php:629
+#: usr/local/www/vpn_ipsec_phase1.php:764
+msgid "1 = 768 bit, 2 = 1024 bit, 5 = 1536 bit"
+msgstr "1 = 768ビット、 2 = 1024ビット、 5 = 1536ビット"
+
+#: usr/local/www/vpn_ipsec_phase1.php:765
+#: usr/local/www/vpn_ipsec_phase1.php:778
+#: usr/local/www/vpn_ipsec_phase1.php:775
+#: usr/local/www/vpn_ipsec_phase1.php:796
+#: usr/local/www/vpn_ipsec_phase1.php:796
+msgid "My Certificate"
+msgstr "私の証明書"
+
+#: usr/local/www/vpn_ipsec_phase1.php:779
+#: usr/local/www/vpn_ipsec_phase1.php:792
+#: usr/local/www/vpn_ipsec_phase1.php:789
+#: usr/local/www/vpn_ipsec_phase1.php:810
+#: usr/local/www/vpn_ipsec_phase1.php:810
+msgid "Select a certificate previously configured in the Certificate Manager"
+msgstr "以前に証明書マネージャで設定された証明書を選択します"
+
+#: usr/local/www/vpn_ipsec_phase1.php:784
+#: usr/local/www/vpn_ipsec_phase1.php:797
+#: usr/local/www/vpn_ipsec_phase1.php:794
+#: usr/local/www/vpn_ipsec_phase1.php:815
+#: usr/local/www/vpn_ipsec_phase1.php:815
+msgid "My Certificate Authority"
+msgstr "私の認証局"
+
+#: usr/local/www/vpn_ipsec_phase1.php:798
+#: usr/local/www/vpn_ipsec_phase1.php:811
+#: usr/local/www/vpn_ipsec_phase1.php:808
+#: usr/local/www/vpn_ipsec_phase1.php:829
+#: usr/local/www/vpn_ipsec_phase1.php:829
+msgid ""
+"Select a certificate authority previously configured in the Certificate "
+"Manager"
+msgstr "Manager」の以前の証明書で構成された認証局を選択して""
+
+#: usr/local/www/vpn_ipsec_phase1.php:809
+#: usr/local/www/vpn_ipsec_phase1.php:822
+#: usr/local/www/vpn_ipsec_phase1.php:819
+#: usr/local/www/vpn_ipsec_phase1.php:840
+#: usr/local/www/vpn_ipsec_phase1.php:840
+msgid "NAT Traversal"
+msgstr "NATトラバーサル"
+
+#: usr/local/www/vpn_ipsec_phase1.php:814
+#: usr/local/www/vpn_ipsec_phase1.php:827
+#: usr/local/www/vpn_ipsec_phase1.php:824
+#: usr/local/www/vpn_ipsec_phase1.php:845
+#: usr/local/www/vpn_ipsec_phase1.php:845
+msgid "Force"
+msgstr "力"
+
+#: usr/local/www/vpn_ipsec_phase1.php:818
+#: usr/local/www/vpn_ipsec_phase1.php:831
+#: usr/local/www/vpn_ipsec_phase1.php:828
+#: usr/local/www/vpn_ipsec_phase1.php:849
+#: usr/local/www/vpn_ipsec_phase1.php:849
+msgid ""
+"Set this option to enable the use of NAT-T (i.e. the encapsulation of ESP in "
+"UDP packets) if needed, which can help with clients that are behind "
+"restrictive firewalls"
+msgstr "必要に応じて、 「制限的ファイヤーウォールの内側にあるクライアントを支援することができている」 ( UDPパケット内のESPのカプセルIE) NAT-Tの使用を有効にするには、このオプションを設定する」"
+
+#: usr/local/www/vpn_ipsec_phase1.php:824
+#: usr/local/www/vpn_ipsec_phase1.php:837
+#: usr/local/www/vpn_ipsec_phase1.php:834
+#: usr/local/www/vpn_ipsec_phase1.php:855
+#: usr/local/www/vpn_ipsec_phase1.php:855
+msgid "Dead Peer Detection"
+msgstr "デッドピア検知"
+
+#: usr/local/www/vpn_ipsec_phase1.php:827
+#: usr/local/www/vpn_ipsec_phase1.php:840
+#: usr/local/www/vpn_ipsec_phase1.php:837
+#: usr/local/www/vpn_ipsec_phase1.php:858
+#: usr/local/www/vpn_ipsec_phase1.php:858
+msgid "Enable DPD"
+msgstr "DPDを有効にします"
+
+#: usr/local/www/vpn_ipsec_phase1.php:833
+#: usr/local/www/vpn_ipsec_phase1.php:846
+#: usr/local/www/vpn_ipsec_phase1.php:843
+#: usr/local/www/vpn_ipsec_phase1.php:864
+#: usr/local/www/vpn_ipsec_phase1.php:864
+msgid "Delay between requesting peer acknowledgement"
+msgstr "ピアの確認応答を要求間の遅延"
+
+#: usr/local/www/vpn_ipsec_phase1.php:837
+#: usr/local/www/vpn_ipsec_phase1.php:850
+#: usr/local/www/vpn_ipsec_phase1.php:847
+#: usr/local/www/vpn_ipsec_phase1.php:868
+#: usr/local/www/vpn_ipsec_phase1.php:868
+msgid "retries"
+msgstr "リトライ"
+
+#: usr/local/www/vpn_ipsec_phase1.php:839
+#: usr/local/www/vpn_ipsec_phase1.php:852
+#: usr/local/www/vpn_ipsec_phase1.php:849
+#: usr/local/www/vpn_ipsec_phase1.php:870
+#: usr/local/www/vpn_ipsec_phase1.php:870
+msgid "Number of consecutive failures allowed before disconnect"
+msgstr "切断する前に許可された連続失敗回数"
+
+#: usr/local/www/vpn_ipsec_phase2.php:109
+#: usr/local/www/vpn_ipsec_phase2.php:111
+#: usr/local/www/vpn_ipsec_phase2.php:111
+msgid "A valid ikeid must be specified."
+msgstr "有効なikeidを指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:113
+#: usr/local/www/vpn_ipsec_phase2.php:115
+#: usr/local/www/vpn_ipsec_phase2.php:115
+msgid "Local network type"
+msgstr "ローカルネットワークの種類"
+
+#: usr/local/www/vpn_ipsec_phase2.php:113
+#: usr/local/www/vpn_ipsec_phase2.php:115
+#: usr/local/www/vpn_ipsec_phase2.php:115
+msgid "P2 Hash Algorithms"
+msgstr "P2はハッシュアルゴリズム"
+
+#: usr/local/www/vpn_ipsec_phase2.php:116
+#: usr/local/www/vpn_ipsec_phase2.php:118
+#: usr/local/www/vpn_ipsec_phase2.php:118
+msgid "Remote network type"
+msgstr "リモートネットワークの種類"
+
+#: usr/local/www/vpn_ipsec_phase2.php:126
+#: usr/local/www/vpn_ipsec_phase2.php:128
+#: usr/local/www/vpn_ipsec_phase2.php:128
+msgid "A valid local network bit count must be specified."
+msgstr "有効なローカルネットワークビット数を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:129
+#: usr/local/www/vpn_ipsec_phase2.php:131
+#: usr/local/www/vpn_ipsec_phase2.php:131
+msgid "A valid local network IP address must be specified."
+msgstr "有効なローカルネットワークIPアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:136
+#: usr/local/www/vpn_ipsec_phase2.php:146
+#: usr/local/www/vpn_ipsec_phase2.php:170
+#: usr/local/www/vpn_ipsec_phase2.php:178
+#: usr/local/www/vpn_ipsec_phase2.php:178
+msgid "A valid remote network bit count must be specified."
+msgstr "有効なリモートネットワークビット数を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:139
+#: usr/local/www/vpn_ipsec_phase2.php:149
+#: usr/local/www/vpn_ipsec_phase2.php:173
+#: usr/local/www/vpn_ipsec_phase2.php:181
+#: usr/local/www/vpn_ipsec_phase2.php:181
+msgid "A valid remote network IP address must be specified."
+msgstr "有効なリモートネットワークのIPアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:158
+#: usr/local/www/vpn_ipsec_phase2.php:162
+#: usr/local/www/vpn_ipsec_phase2.php:168
+#: usr/local/www/vpn_ipsec_phase2.php:172
+#: usr/local/www/vpn_ipsec_phase2.php:192
+#: usr/local/www/vpn_ipsec_phase2.php:196
+#: usr/local/www/vpn_ipsec_phase2.php:206
+#: usr/local/www/vpn_ipsec_phase2.php:210
+#: usr/local/www/vpn_ipsec_phase2.php:206
+#: usr/local/www/vpn_ipsec_phase2.php:210
+msgid "Phase2 with this Local Network is already defined for mobile clients."
+msgstr "このローカルネットワークとのフェーズ2は、すでにモバイルクライアントのために定義されています。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:189
+#: usr/local/www/vpn_ipsec_phase2.php:193
+#: usr/local/www/vpn_ipsec_phase2.php:199
+#: usr/local/www/vpn_ipsec_phase2.php:203
+#: usr/local/www/vpn_ipsec_phase2.php:223
+#: usr/local/www/vpn_ipsec_phase2.php:227
+#: usr/local/www/vpn_ipsec_phase2.php:237
+#: usr/local/www/vpn_ipsec_phase2.php:241
+#: usr/local/www/vpn_ipsec_phase2.php:237
+#: usr/local/www/vpn_ipsec_phase2.php:241
+msgid ""
+"Phase2 with this Local/Remote networks combination is already defined for "
+"this Phase1."
+msgstr "このフェーズ1 "このローカル/リモートネットワークの組み合わせでフェーズ2が既にのために定義されている」 。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:204
+#: usr/local/www/vpn_ipsec_phase2.php:216
+#: usr/local/www/vpn_ipsec_phase2.php:240
+#: usr/local/www/vpn_ipsec_phase2.php:254
+#: usr/local/www/vpn_ipsec_phase2.php:254
+msgid "At least one encryption algorithm must be selected."
+msgstr "少なくとも1暗号化アルゴリズムを選択する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:207
+#: usr/local/www/vpn_ipsec_phase2.php:220
+#: usr/local/www/vpn_ipsec_phase2.php:244
+#: usr/local/www/vpn_ipsec_phase2.php:258
+#: usr/local/www/vpn_ipsec_phase2.php:258
+msgid "The P2 lifetime must be an integer."
+msgstr "P2は寿命が整数でなければなりません。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:255
+#: usr/local/www/vpn_ipsec_phase2.php:257
+#: usr/local/www/vpn_ipsec_phase2.php:268
+#: usr/local/www/vpn_ipsec_phase2.php:270
+#: usr/local/www/vpn_ipsec_phase2.php:294
+#: usr/local/www/vpn_ipsec_phase2.php:296
+#: usr/local/www/vpn_ipsec_phase2.php:316
+#: usr/local/www/vpn_ipsec_phase2.php:318
+#: usr/local/www/vpn_ipsec_phase2.php:316
+#: usr/local/www/vpn_ipsec_phase2.php:318
+msgid "Edit Phase 2"
+msgstr "編集フェーズ2"
+
+#: usr/local/www/vpn_ipsec_phase2.php:396
+#: usr/local/www/vpn_ipsec_phase2.php:422
+#: usr/local/www/vpn_ipsec_phase2.php:488
+#: usr/local/www/vpn_ipsec_phase2.php:510
+#: usr/local/www/vpn_ipsec_phase2.php:510
+msgid "Disable this phase2 entry"
+msgstr "このフェーズ2のエントリを無効化"
+
+#: usr/local/www/vpn_ipsec_phase2.php:398
+#: usr/local/www/vpn_ipsec_phase2.php:424
+#: usr/local/www/vpn_ipsec_phase2.php:490
+#: usr/local/www/vpn_ipsec_phase2.php:512
+#: usr/local/www/vpn_ipsec_phase2.php:512
+msgid ""
+"Set this option to disable this phase2 entry without removing it from the "
+"list"
+msgstr "リスト」から削除せずに、このフェーズ2のエントリを無効にするには、このオプションを設定する」"
+
+#: usr/local/www/vpn_ipsec_phase2.php:433
+#: usr/local/www/vpn_ipsec_phase2.php:459
+#: usr/local/www/vpn_ipsec_phase2.php:525
+#: usr/local/www/vpn_ipsec_phase2.php:561
+#: usr/local/www/vpn_ipsec_phase2.php:547
+#: usr/local/www/vpn_ipsec_phase2.php:582
+#: usr/local/www/vpn_ipsec_phase2.php:547
+#: usr/local/www/vpn_ipsec_phase2.php:582
+#, php-format
+msgid "%s subnet"
+msgstr "%sサブネット"
+
+#: usr/local/www/vpn_ipsec_phase2.php:512
+#: usr/local/www/vpn_ipsec_phase2.php:538
+#: usr/local/www/vpn_ipsec_phase2.php:640
+#: usr/local/www/vpn_ipsec_phase2.php:661
+#: usr/local/www/vpn_ipsec_phase2.php:661
+msgid "Phase 2 proposal (SA/Key Exchange)"
+msgstr "フェーズ2の提案( SA /鍵交換)"
+
+#: usr/local/www/vpn_ipsec_phase2.php:527
+#: usr/local/www/vpn_ipsec_phase2.php:553
+#: usr/local/www/vpn_ipsec_phase2.php:655
+#: usr/local/www/vpn_ipsec_phase2.php:676
+#: usr/local/www/vpn_ipsec_phase2.php:676
+msgid "ESP is encryption, AH is authentication only"
+msgstr "ESPは暗号化され、 AHは認証のみです"
+
+#: usr/local/www/vpn_ipsec_phase2.php:532
+#: usr/local/www/vpn_ipsec_phase2.php:558
+#: usr/local/www/vpn_ipsec_phase2.php:660
+#: usr/local/www/vpn_ipsec_phase2.php:681
+#: usr/local/www/vpn_ipsec_phase2.php:681
+msgid "Encryption algorithms"
+msgstr "暗号化アルゴリズム"
+
+#: usr/local/www/vpn_ipsec_phase2.php:574
+#: usr/local/www/vpn_ipsec_phase2.php:600
+#: usr/local/www/vpn_ipsec_phase2.php:702
+#: usr/local/www/vpn_ipsec_phase2.php:723
+#: usr/local/www/vpn_ipsec_phase2.php:723
+msgid ""
+"Hint: use 3DES for best compatibility or if you have a hardware crypto "
+"accelerator card. Blowfish is usually the fastest in software encryption"
+msgstr ""ヒント:最高の互換性のために、またはあなたがハードウェア暗号がある場合は3DESを使用する「アクセラレータカードを。フグは通常、ソフトウェア暗号化で最速である"
+
+#: usr/local/www/vpn_ipsec_phase2.php:580
+#: usr/local/www/vpn_ipsec_phase2.php:606
+#: usr/local/www/vpn_ipsec_phase2.php:708
+#: usr/local/www/vpn_ipsec_phase2.php:729
+#: usr/local/www/vpn_ipsec_phase2.php:729
+msgid "Hash algorithms"
+msgstr "ハッシュアルゴリズム"
+
+#: usr/local/www/vpn_ipsec_phase2.php:590
+#: usr/local/www/vpn_ipsec_phase2.php:616
+#: usr/local/www/vpn_ipsec_phase2.php:718
+#: usr/local/www/vpn_ipsec_phase2.php:739
+#: usr/local/www/vpn_ipsec_phase2.php:739
+msgid "PFS key group"
+msgstr "PFSキー群"
+
+#: usr/local/www/vpn_ipsec_phase2.php:614
+#: usr/local/www/vpn_ipsec_phase2.php:640
+#: usr/local/www/vpn_ipsec_phase2.php:736
+#: usr/local/www/vpn_ipsec_phase2.php:757
+#: usr/local/www/vpn_ipsec_phase2.php:757
+msgid "Set globally in mobile client options"
+msgstr "モバイルクライアントオプションでグローバルに設定"
+
+#: usr/local/www/vpn_ipsec_phase2.php:632
+#: usr/local/www/vpn_ipsec_phase2.php:658
+#: usr/local/www/vpn_ipsec_phase2.php:754
+#: usr/local/www/vpn_ipsec_phase2.php:775
+#: usr/local/www/vpn_ipsec_phase2.php:775
+msgid "Automatically ping host"
+msgstr "自動的にpingをホスト"
+
+#: usr/local/www/vpn_l2tp.php:300
+msgid "Enable l2tp server"
+msgstr "L2TPサーバを有効にする"
+
+#: usr/local/www/vpn_l2tp.php:325 usr/local/www/vpn_l2tp.php:326
+#: usr/local/www/vpn_l2tp.php:329 usr/local/www/vpn_l2tp.php:329
+msgid ""
+"Enter the IP address the L2TP server should give to clients for use as their "
+""gateway""
+msgstr "「 「ゲートウェイ」 L2TPサーバとして使用するために顧客に彼らのを与える必要があり、IPアドレスを入力してください ""
+
+#: usr/local/www/vpn_l2tp.php:337 usr/local/www/vpn_l2tp.php:338
+#: usr/local/www/vpn_l2tp.php:341 usr/local/www/vpn_l2tp.php:341
+msgid "Specify the starting address for the client IP address subnet."
+msgstr "クライアントのIPアドレス、サブネットの開始アドレスを指定します。"
+
+#: usr/local/www/vpn_l2tp.php:341 usr/local/www/vpn_pppoe_edit.php:390
+#: usr/local/www/vpn_pppoe_edit.php:391 usr/local/www/vpn_pppoe_edit.php:394
+#: usr/local/www/vpn_pppoe_edit.php:394
+msgid "Subnet netmask"
+msgstr "サブネットマスク"
+
+#: usr/local/www/vpn_l2tp.php:354 usr/local/www/vpn_pppoe_edit.php:403
+#: usr/local/www/vpn_pppoe_edit.php:404 usr/local/www/vpn_l2tp.php:355
+#: usr/local/www/vpn_l2tp.php:358 usr/local/www/vpn_pppoe_edit.php:407
+#: usr/local/www/vpn_l2tp.php:358 usr/local/www/vpn_pppoe_edit.php:407
+msgid "is"
+msgstr "です"
+
+#: usr/local/www/vpn_l2tp.php:358 usr/local/www/vpn_l2tp.php:359
+#: usr/local/www/vpn_l2tp.php:362 usr/local/www/vpn_l2tp.php:362
+msgid "Number of L2TP users"
+msgstr "L2TPユーザーの数"
+
+#: usr/local/www/vpn_l2tp.php:371 usr/local/www/vpn_l2tp.php:372
+#: usr/local/www/vpn_l2tp.php:375 usr/local/www/vpn_l2tp.php:375
+msgid "is ten L2TP clients"
+msgstr "10 L2TPクライアントである"
+
+#: usr/local/www/vpn_l2tp.php:375 usr/local/www/vpn_l2tp.php:376
+#: usr/local/www/vpn_l2tp.php:379 usr/local/www/vpn_l2tp.php:379
+msgid "Secret"
+msgstr "秘密"
+
+#: usr/local/www/vpn_l2tp.php:379 usr/local/www/vpn_l2tp.php:380
+#: usr/local/www/vpn_l2tp.php:383 usr/local/www/vpn_l2tp.php:383
+msgid ""
+"Specify optional secret shared between peers. Required on some devices/"
+"setups."
+msgstr "「ピア間で共有され、オプションの秘密を指定します。一部のデバイス/上で必要な"セットアップ。"
+
+#: usr/local/www/vpn_l2tp.php:383
+msgid "Encryption type"
+msgstr "暗号化の種類"
+
+#: usr/local/www/vpn_l2tp.php:386 usr/local/www/vpn_l2tp.php:387
+#: usr/local/www/vpn_l2tp.php:390 usr/local/www/vpn_l2tp.php:390
+msgid "CHAP"
+msgstr "CHAP"
+
+#: usr/local/www/vpn_l2tp.php:387 usr/local/www/services_captiveportal.php:607
+#: usr/local/www/services_captiveportal.php:605 usr/local/www/vpn_l2tp.php:388
+#: usr/local/www/vpn_l2tp.php:391 usr/local/www/services_captiveportal.php:606
+#: usr/local/www/services_captiveportal.php:622 usr/local/www/vpn_l2tp.php:391
+#: usr/local/www/services_captiveportal.php:622
+msgid "PAP"
+msgstr "PAP"
+
+#: usr/local/www/vpn_l2tp.php:390 usr/local/www/vpn_l2tp.php:391
+#: usr/local/www/vpn_l2tp.php:394 usr/local/www/vpn_l2tp.php:394
+msgid "Specifies which protocol to use for authentication."
+msgstr "認証に使用するプロトコルを指定します。"
+
+#: usr/local/www/vpn_l2tp.php:394 usr/local/www/vpn_l2tp.php:395
+#: usr/local/www/vpn_l2tp.php:398 usr/local/www/vpn_l2tp.php:398
+msgid "L2TP DNS Servers"
+msgstr "L2TP DNSサーバ"
+
+#: usr/local/www/vpn_l2tp.php:400 usr/local/www/vpn_l2tp.php:401
+#: usr/local/www/vpn_l2tp.php:404 usr/local/www/vpn_l2tp.php:404
+msgid "primary and secondary DNS servers assigned to L2TP clients"
+msgstr "L2TPクライアントに割り当てられたプライマリおよびセカンダリDNSサーバ"
+
+#: usr/local/www/vpn_l2tp.php:414 usr/local/www/vpn_l2tp.php:415
+#: usr/local/www/vpn_l2tp.php:418 usr/local/www/vpn_l2tp.php:418
+msgid ""
+"When set, all users will be authenticated using the RADIUS server specified "
+"below. The local user database will not be used."
+msgstr "下の「設定すると、すべてのユーザーが指定されたRADIUSサーバを使用して認証されます」 。ローカルユーザデータベースは使用されません。"
+
+#: usr/local/www/vpn_l2tp.php:418 usr/local/www/vpn_l2tp.php:419
+#: usr/local/www/vpn_l2tp.php:422 usr/local/www/vpn_l2tp.php:422
+msgid "Sends accounting packets to the RADIUS server."
+msgstr "RADIUSサーバにアカウンティングパケットを送信します。"
+
+#: usr/local/www/vpn_l2tp.php:421
+msgid "RADIUS server"
+msgstr "RADIUSサーバー"
+
+#: usr/local/www/vpn_l2tp.php:425 usr/local/www/vpn_l2tp.php:426
+#: usr/local/www/vpn_l2tp.php:429 usr/local/www/vpn_l2tp.php:429
+msgid "Enter the IP address of the RADIUS server."
+msgstr "RADIUSサーバのIPアドレスを入力します。"
+
+#: usr/local/www/vpn_l2tp.php:432 usr/local/www/vpn_l2tp.php:433
+#: usr/local/www/vpn_l2tp.php:436 usr/local/www/vpn_l2tp.php:436
+msgid ""
+"Enter the shared secret that will be used to authenticate to the RADIUS "
+"server."
+msgstr "サーバー「RADIUSへの認証に使用される共有秘密を入力してください "。"
+
+#: usr/local/www/vpn_l2tp.php:435
+msgid "RADIUS issued IP's"
+msgstr "RADIUSは、IPのを発行しました"
+
+#: usr/local/www/vpn_l2tp.php:439 usr/local/www/vpn_l2tp.php:440
+#: usr/local/www/vpn_l2tp.php:443 usr/local/www/vpn_l2tp.php:443
+msgid "Issue IP Addresses via RADIUS server."
+msgstr "問題のIPは、RADIUSサーバを経由して解決。"
+
+#: usr/local/www/vpn_l2tp.php:452 usr/local/www/vpn_l2tp.php:453
+#: usr/local/www/vpn_l2tp.php:456 usr/local/www/vpn_l2tp.php:456
+msgid ""
+"Don't forget to add a firewall rule to permit traffic from L2TP clients!"
+msgstr "「 L2TPクライアントからのトラフィックを許可するファイアウォールルールを追加することを忘れないでください !"
+
+#: usr/local/www/vpn_l2tp_users.php:86 usr/local/www/vpn_l2tp_users.php:87
+#: usr/local/www/vpn_l2tp_users.php:87
+msgid "The l2tp user list has been modified"
+msgstr "L2TPユーザリストが変更されている"
+
+#: usr/local/www/vpn_l2tp_users.php:86 usr/local/www/vpn_l2tp_users.php:87
+#: usr/local/www/vpn_l2tp_users.php:87
+msgid "Warning: this will terminate all current l2tp sessions!"
+msgstr "警告:これは現在のすべてのL2TPセッションを終了します !"
+
+#: usr/local/www/vpn_l2tp_users_edit.php:164
+#: usr/local/www/vpn_l2tp_users_edit.php:165
+#: usr/local/www/vpn_l2tp_users_edit.php:165
+msgid "If you want to change the users password, enter it here twice."
+msgstr "あなたは、ユーザーのパスワードを変更する場合は、二度ここに入力します。"
+
+#: usr/local/www/vpn_openvpn_client.php:40
+#: usr/local/www/vpn_openvpn_client.php:366
+#: usr/local/www/vpn_openvpn_csc.php:294
+#: usr/local/www/vpn_openvpn_server.php:584
+#: usr/local/www/vpn_openvpn_server.php:657
+#: usr/local/www/vpn_openvpn_client.php:371
+#: usr/local/www/vpn_openvpn_csc.php:293
+#: usr/local/www/vpn_openvpn_server.php:675
+#: usr/local/www/vpn_openvpn_client.php:379
+#: usr/local/www/vpn_openvpn_client.php:397
+#: usr/local/www/vpn_openvpn_server.php:701
+#: usr/local/www/vpn_openvpn_client.php:40
+#: usr/local/www/vpn_openvpn_client.php:397
+#: usr/local/www/vpn_openvpn_csc.php:293
+#: usr/local/www/vpn_openvpn_server.php:701
+msgid "Client"
+msgstr "クライアント"
+
+#: usr/local/www/vpn_openvpn_client.php:82
+#: usr/local/www/vpn_openvpn_client.php:86
+#: usr/local/www/vpn_openvpn_client.php:86
+msgid "Client successfully deleted"
+msgstr "クライアント正常に削除"
+
+#: usr/local/www/vpn_openvpn_client.php:164
+#: usr/local/www/vpn_openvpn_server.php:227
+#: usr/local/www/vpn_openvpn_server.php:232
+#: usr/local/www/vpn_openvpn_client.php:165
+#: usr/local/www/vpn_openvpn_server.php:233
+#: usr/local/www/vpn_openvpn_client.php:171
+#: usr/local/www/vpn_openvpn_client.php:182
+#: usr/local/www/vpn_openvpn_server.php:254
+#: usr/local/www/vpn_openvpn_client.php:182
+#: usr/local/www/vpn_openvpn_server.php:254
+msgid "The specified 'Local port' is in use. Please select another value"
+msgstr "指定された'ローカルポートは「使用中です。別の値を選択してください"
+
+#: usr/local/www/vpn_openvpn_client.php:183
+#: usr/local/www/vpn_openvpn_client.php:184
+#: usr/local/www/vpn_openvpn_client.php:190
+#: usr/local/www/vpn_openvpn_client.php:201
+#: usr/local/www/vpn_openvpn_client.php:201
+msgid "User name and password are required for proxy with authentication."
+msgstr "ユーザー名とパスワードは、認証付きプロキシのために必要とされる。"
+
+#: usr/local/www/vpn_openvpn_client.php:200
+#: usr/local/www/vpn_openvpn_server.php:235
+#: usr/local/www/vpn_openvpn_server.php:240
+#: usr/local/www/vpn_openvpn_client.php:204
+#: usr/local/www/vpn_openvpn_server.php:241
+#: usr/local/www/vpn_openvpn_client.php:210
+#: usr/local/www/vpn_openvpn_client.php:228
+#: usr/local/www/vpn_openvpn_server.php:262
+#: usr/local/www/vpn_openvpn_client.php:228
+#: usr/local/www/vpn_openvpn_server.php:262
+msgid "The field 'Shared Key' does not appear to be valid"
+msgstr "フィールド'共有キー'は有効ではないようです"
+
+#: usr/local/www/vpn_openvpn_client.php:205
+#: usr/local/www/vpn_openvpn_server.php:240
+#: usr/local/www/vpn_openvpn_server.php:245
+#: usr/local/www/vpn_openvpn_client.php:209
+#: usr/local/www/vpn_openvpn_server.php:246
+#: usr/local/www/vpn_openvpn_client.php:215
+#: usr/local/www/vpn_openvpn_client.php:233
+#: usr/local/www/vpn_openvpn_server.php:267
+#: usr/local/www/vpn_openvpn_client.php:233
+#: usr/local/www/vpn_openvpn_server.php:267
+msgid "The field 'TLS Authentication Key' does not appear to be valid"
+msgstr "フィールド' TLS認証キー'は有効ではないようです"
+
+#: usr/local/www/vpn_openvpn_client.php:214
+#: usr/local/www/vpn_openvpn_server.php:286
+#: usr/local/www/vpn_openvpn_server.php:291
+#: usr/local/www/vpn_openvpn_client.php:218
+#: usr/local/www/vpn_openvpn_server.php:292
+#: usr/local/www/vpn_openvpn_client.php:224
+#: usr/local/www/vpn_openvpn_client.php:242
+#: usr/local/www/vpn_openvpn_server.php:313
+#: usr/local/www/vpn_openvpn_client.php:242
+#: usr/local/www/vpn_openvpn_server.php:313
+msgid "Shared key"
+msgstr "共有鍵"
+
+#: usr/local/www/vpn_openvpn_client.php:367
+#: usr/local/www/vpn_openvpn_csc.php:295
+#: usr/local/www/vpn_openvpn_server.php:585
+#: usr/local/www/vpn_openvpn_server.php:658
+#: usr/local/www/vpn_openvpn_client.php:372
+#: usr/local/www/vpn_openvpn_csc.php:294
+#: usr/local/www/vpn_openvpn_server.php:676
+#: usr/local/www/vpn_openvpn_client.php:380
+#: usr/local/www/vpn_openvpn_client.php:398
+#: usr/local/www/vpn_openvpn_server.php:702
+#: usr/local/www/vpn_openvpn_client.php:398
+#: usr/local/www/vpn_openvpn_csc.php:294
+#: usr/local/www/vpn_openvpn_server.php:702
+msgid "Client Specific Overrides"
+msgstr "クライアント固有のオーバーライド"
+
+#: usr/local/www/vpn_openvpn_client.php:397
+#: usr/local/www/vpn_openvpn_client.php:402
+#: usr/local/www/vpn_openvpn_client.php:410
+#: usr/local/www/vpn_openvpn_client.php:428
+#: usr/local/www/vpn_openvpn_client.php:428
+msgid "Disable this client"
+msgstr "このクライアントを無効にする"
+
+#: usr/local/www/vpn_openvpn_client.php:402
+#: usr/local/www/vpn_openvpn_client.php:407
+#: usr/local/www/vpn_openvpn_client.php:415
+#: usr/local/www/vpn_openvpn_client.php:433
+#: usr/local/www/vpn_openvpn_client.php:433
+msgid ""
+"Set this option to disable this client without removing it from the list"
+msgstr "「リストから削除せずにこのクライアントを無効にするには、このオプションを設定"
+
+#: usr/local/www/vpn_openvpn_client.php:406
+#: usr/local/www/vpn_openvpn_server.php:624
+#: usr/local/www/vpn_openvpn_server.php:697
+#: usr/local/www/vpn_openvpn_client.php:411
+#: usr/local/www/vpn_openvpn_server.php:715
+#: usr/local/www/vpn_openvpn_client.php:419
+#: usr/local/www/vpn_openvpn_client.php:437
+#: usr/local/www/vpn_openvpn_server.php:741
+#: usr/local/www/vpn_openvpn_client.php:437
+#: usr/local/www/vpn_openvpn_server.php:741
+msgid "Server Mode"
+msgstr "サーバモード"
+
+#: usr/local/www/vpn_openvpn_client.php:436
+#: usr/local/www/vpn_openvpn_client.php:441
+#: usr/local/www/vpn_openvpn_client.php:449
+#: usr/local/www/vpn_openvpn_client.php:467
+#: usr/local/www/vpn_openvpn_client.php:467
+msgid "Device mode"
+msgstr "デバイスモード"
+
+#: usr/local/www/vpn_openvpn_client.php:476
+#: usr/local/www/vpn_openvpn_server.php:716
+#: usr/local/www/vpn_openvpn_server.php:789
+#: usr/local/www/vpn_openvpn_client.php:481
+#: usr/local/www/vpn_openvpn_server.php:817
+#: usr/local/www/vpn_openvpn_client.php:499
+#: usr/local/www/vpn_openvpn_client.php:518
+#: usr/local/www/vpn_openvpn_server.php:844
+#: usr/local/www/vpn_openvpn_client.php:518
+#: usr/local/www/vpn_openvpn_server.php:844
+msgid "Local port"
+msgstr "ローカルポート"
+
+#: usr/local/www/vpn_openvpn_client.php:480
+#: usr/local/www/vpn_openvpn_client.php:485
+#: usr/local/www/vpn_openvpn_client.php:503
+#: usr/local/www/vpn_openvpn_client.php:522
+#: usr/local/www/vpn_openvpn_client.php:522
+msgid ""
+"Set this option if you would like to bind to a specific port. Leave this "
+"blank or enter 0 for a random dynamic port."
+msgstr "「あなたは、特定のポートにバインドする場合は、このオプションを設定します。このまま「ブランクまたはランダム動的ポートに0を入力してください。"
+
+#: usr/local/www/vpn_openvpn_client.php:484
+#: usr/local/www/vpn_openvpn_client.php:489
+#: usr/local/www/vpn_openvpn_client.php:507
+#: usr/local/www/vpn_openvpn_client.php:526
+#: usr/local/www/vpn_openvpn_client.php:526
+msgid "Server host or address"
+msgstr "Serverホストまたはアドレス"
+
+#: usr/local/www/vpn_openvpn_client.php:490
+#: usr/local/www/vpn_openvpn_client.php:495
+#: usr/local/www/vpn_openvpn_client.php:513
+#: usr/local/www/vpn_openvpn_client.php:532
+#: usr/local/www/vpn_openvpn_client.php:532
+msgid "Server port"
+msgstr "サーバポート"
+
+#: usr/local/www/vpn_openvpn_client.php:496
+#: usr/local/www/vpn_openvpn_client.php:501
+#: usr/local/www/vpn_openvpn_client.php:519
+#: usr/local/www/vpn_openvpn_client.php:538
+#: usr/local/www/vpn_openvpn_client.php:538
+msgid "Proxy host or address"
+msgstr "プロキシのホストまたはアドレス"
+
+#: usr/local/www/vpn_openvpn_client.php:502
+#: usr/local/www/vpn_openvpn_client.php:507
+#: usr/local/www/vpn_openvpn_client.php:525
+#: usr/local/www/vpn_openvpn_client.php:544
+#: usr/local/www/vpn_openvpn_client.php:544
+msgid "Proxy port"
+msgstr "プロキシポート"
+
+#: usr/local/www/vpn_openvpn_client.php:508
+#: usr/local/www/vpn_openvpn_client.php:513
+#: usr/local/www/vpn_openvpn_client.php:531
+#: usr/local/www/vpn_openvpn_client.php:550
+#: usr/local/www/vpn_openvpn_client.php:550
+msgid "Proxy authentication extra options"
+msgstr "プロキシ認証の余分なオプション"
+
+#: usr/local/www/vpn_openvpn_client.php:520
+#: usr/local/www/vpn_openvpn_client.php:525
+#: usr/local/www/vpn_openvpn_client.php:543
+#: usr/local/www/vpn_openvpn_client.php:562
+#: usr/local/www/vpn_openvpn_client.php:562
+msgid "basic"
+msgstr "基本"
+
+#: usr/local/www/vpn_openvpn_client.php:521
+#: usr/local/www/vpn_openvpn_client.php:526
+#: usr/local/www/vpn_openvpn_client.php:544
+#: usr/local/www/vpn_openvpn_client.php:563
+#: usr/local/www/vpn_openvpn_client.php:563
+msgid "ntlm"
+msgstr "NTLM"
+
+#: usr/local/www/vpn_openvpn_client.php:552
+#: usr/local/www/vpn_openvpn_client.php:557
+#: usr/local/www/vpn_openvpn_client.php:575
+#: usr/local/www/vpn_openvpn_client.php:594
+#: usr/local/www/vpn_openvpn_client.php:594
+msgid "Server host name resolution"
+msgstr "サーバーのホスト名解決"
+
+#: usr/local/www/vpn_openvpn_client.php:562
+#: usr/local/www/vpn_openvpn_client.php:567
+#: usr/local/www/vpn_openvpn_client.php:585
+#: usr/local/www/vpn_openvpn_client.php:604
+#: usr/local/www/vpn_openvpn_client.php:604
+msgid "Infinitely resolve server"
+msgstr "無限に解決サーバ"
+
+#: usr/local/www/vpn_openvpn_client.php:567
+#: usr/local/www/vpn_openvpn_client.php:572
+#: usr/local/www/vpn_openvpn_client.php:590
+#: usr/local/www/vpn_openvpn_client.php:609
+#: usr/local/www/vpn_openvpn_client.php:609
+msgid ""
+"Continuously attempt to resolve the server host name. Useful when "
+"communicating with a server that is not permanently connected to the Internet"
+msgstr "「継続的にサーバのホスト名を解決しよう。ときに便利」インターネットに常時接続されていないサーバーとの通信"
+
+#: usr/local/www/vpn_openvpn_client.php:584
+#: usr/local/www/vpn_openvpn_server.php:733
+#: usr/local/www/vpn_openvpn_server.php:806
+#: usr/local/www/vpn_openvpn_client.php:589
+#: usr/local/www/vpn_openvpn_server.php:834
+#: usr/local/www/vpn_openvpn_client.php:607
+#: usr/local/www/vpn_openvpn_client.php:626
+#: usr/local/www/vpn_openvpn_server.php:861
+#: usr/local/www/vpn_openvpn_client.php:626
+#: usr/local/www/vpn_openvpn_server.php:861
+msgid "Cryptographic Settings"
+msgstr "暗号化設定"
+
+#: usr/local/www/vpn_openvpn_client.php:587
+#: usr/local/www/vpn_openvpn_server.php:736
+#: usr/local/www/vpn_openvpn_server.php:809
+#: usr/local/www/vpn_openvpn_client.php:592
+#: usr/local/www/vpn_openvpn_server.php:837
+#: usr/local/www/vpn_openvpn_client.php:610
+#: usr/local/www/vpn_openvpn_client.php:629
+#: usr/local/www/vpn_openvpn_server.php:864
+#: usr/local/www/vpn_openvpn_client.php:629
+#: usr/local/www/vpn_openvpn_server.php:864
+msgid "TLS Authentication"
+msgstr "TLS認証"
+
+#: usr/local/www/vpn_openvpn_client.php:597
+#: usr/local/www/vpn_openvpn_server.php:746
+#: usr/local/www/vpn_openvpn_server.php:819
+#: usr/local/www/vpn_openvpn_client.php:602
+#: usr/local/www/vpn_openvpn_server.php:847
+#: usr/local/www/vpn_openvpn_client.php:620
+#: usr/local/www/vpn_openvpn_client.php:639
+#: usr/local/www/vpn_openvpn_server.php:874
+#: usr/local/www/vpn_openvpn_client.php:639
+#: usr/local/www/vpn_openvpn_server.php:874
+msgid "Enable authentication of TLS packets"
+msgstr "TLSパケットの認証を有効にする"
+
+#: usr/local/www/vpn_openvpn_client.php:611
+#: usr/local/www/vpn_openvpn_server.php:760
+#: usr/local/www/vpn_openvpn_server.php:833
+#: usr/local/www/vpn_openvpn_client.php:616
+#: usr/local/www/vpn_openvpn_server.php:861
+#: usr/local/www/vpn_openvpn_client.php:634
+#: usr/local/www/vpn_openvpn_client.php:653
+#: usr/local/www/vpn_openvpn_server.php:888
+#: usr/local/www/vpn_openvpn_client.php:653
+#: usr/local/www/vpn_openvpn_server.php:888
+msgid "Automatically generate a shared TLS authentication key"
+msgstr "自動的に共有TLS認証キーを生成"
+
+#: usr/local/www/vpn_openvpn_client.php:622
+#: usr/local/www/vpn_openvpn_client.php:699
+#: usr/local/www/vpn_openvpn_server.php:771
+#: usr/local/www/vpn_openvpn_server.php:891
+#: usr/local/www/vpn_openvpn_server.php:844
+#: usr/local/www/vpn_openvpn_server.php:964
+#: usr/local/www/vpn_openvpn_client.php:627
+#: usr/local/www/vpn_openvpn_client.php:704
+#: usr/local/www/vpn_openvpn_server.php:872
+#: usr/local/www/vpn_openvpn_server.php:992
+#: usr/local/www/vpn_openvpn_client.php:645
+#: usr/local/www/vpn_openvpn_client.php:722
+#: usr/local/www/vpn_openvpn_client.php:664
+#: usr/local/www/vpn_openvpn_client.php:741
+#: usr/local/www/vpn_openvpn_server.php:899
+#: usr/local/www/vpn_openvpn_server.php:1019
+#: usr/local/www/vpn_openvpn_client.php:664
+#: usr/local/www/vpn_openvpn_client.php:741
+#: usr/local/www/vpn_openvpn_server.php:899
+#: usr/local/www/vpn_openvpn_server.php:1019
+msgid "Paste your shared key here"
+msgstr "ここにあなたの共有キーを貼り付ける"
+
+#: usr/local/www/vpn_openvpn_client.php:648
+#: usr/local/www/vpn_openvpn_client.php:653
+#: usr/local/www/vpn_openvpn_client.php:671
+#: usr/local/www/vpn_openvpn_client.php:690
+#: usr/local/www/vpn_openvpn_client.php:690
+msgid "Client Certificate"
+msgstr "クライアント証明書"
+
+#: usr/local/www/vpn_openvpn_client.php:677
+#: usr/local/www/vpn_openvpn_server.php:869
+#: usr/local/www/vpn_openvpn_server.php:942
+#: usr/local/www/vpn_openvpn_client.php:682
+#: usr/local/www/vpn_openvpn_server.php:970
+#: usr/local/www/vpn_openvpn_client.php:700
+#: usr/local/www/vpn_openvpn_client.php:719
+#: usr/local/www/vpn_openvpn_server.php:997
+#: usr/local/www/vpn_openvpn_client.php:719
+#: usr/local/www/vpn_openvpn_server.php:997
+msgid "Shared Key"
+msgstr "共有鍵"
+
+#: usr/local/www/vpn_openvpn_client.php:688
+#: usr/local/www/vpn_openvpn_server.php:880
+#: usr/local/www/vpn_openvpn_server.php:953
+#: usr/local/www/vpn_openvpn_client.php:693
+#: usr/local/www/vpn_openvpn_server.php:981
+#: usr/local/www/vpn_openvpn_client.php:711
+#: usr/local/www/vpn_openvpn_client.php:730
+#: usr/local/www/vpn_openvpn_server.php:1008
+#: usr/local/www/vpn_openvpn_client.php:730
+#: usr/local/www/vpn_openvpn_server.php:1008
+msgid "Automatically generate a shared key"
+msgstr "自動的に共有鍵を生成する"
+
+#: usr/local/www/vpn_openvpn_client.php:724
+#: usr/local/www/vpn_openvpn_server.php:916
+#: usr/local/www/vpn_openvpn_server.php:989
+#: usr/local/www/vpn_openvpn_client.php:729
+#: usr/local/www/vpn_openvpn_server.php:1017
+#: usr/local/www/vpn_openvpn_client.php:747
+#: usr/local/www/vpn_openvpn_client.php:766
+#: usr/local/www/vpn_openvpn_server.php:1044
+#: usr/local/www/vpn_openvpn_client.php:766
+#: usr/local/www/vpn_openvpn_server.php:1044
+msgid "Hardware Crypto"
+msgstr "ハードウェア暗号"
+
+#: usr/local/www/vpn_openvpn_client.php:745
+#: usr/local/www/vpn_openvpn_csc.php:374
+#: usr/local/www/vpn_openvpn_server.php:980
+#: usr/local/www/vpn_openvpn_server.php:1053
+#: usr/local/www/vpn_openvpn_client.php:750
+#: usr/local/www/vpn_openvpn_csc.php:373
+#: usr/local/www/vpn_openvpn_server.php:1081
+#: usr/local/www/vpn_openvpn_client.php:768
+#: usr/local/www/vpn_openvpn_client.php:787
+#: usr/local/www/vpn_openvpn_server.php:1108
+#: usr/local/www/vpn_openvpn_client.php:787
+#: usr/local/www/vpn_openvpn_csc.php:373
+#: usr/local/www/vpn_openvpn_server.php:1108
+msgid "Tunnel Settings"
+msgstr "トンネル設定"
+
+#: usr/local/www/vpn_openvpn_client.php:748
+#: usr/local/www/vpn_openvpn_csc.php:377
+#: usr/local/www/vpn_openvpn_server.php:1450
+#: usr/local/www/vpn_openvpn_server.php:1592
+#: usr/local/www/vpn_openvpn_client.php:753
+#: usr/local/www/vpn_openvpn_csc.php:376
+#: usr/local/www/vpn_openvpn_server.php:1633
+#: usr/local/www/vpn_openvpn_server.php:1685
+#: usr/local/www/vpn_openvpn_csc.php:376
+#: usr/local/www/vpn_openvpn_server.php:1685
+msgid "Tunnel Network"
+msgstr "トンネルネットワーク"
+
+#: usr/local/www/vpn_openvpn_client.php:752
+#: usr/local/www/vpn_openvpn_csc.php:381
+#: usr/local/www/vpn_openvpn_client.php:757
+#: usr/local/www/vpn_openvpn_csc.php:380
+#: usr/local/www/vpn_openvpn_client.php:775
+#: usr/local/www/vpn_openvpn_client.php:794
+#: usr/local/www/vpn_openvpn_client.php:794
+#: usr/local/www/vpn_openvpn_csc.php:380
+msgid ""
+"This is the virtual network used for private communications between this "
+"client and the server expressed using CIDR (eg. 10.0.8.0/24). The first "
+"network address is assumed to be the server address and the second network "
+"address will be assigned to the client virtual interface"
+msgstr "クライアントとサーバーの「これは、この間のプライベート通信に使用される仮想ネットワークである「 CIDR (例: 10.0.8.0/24 )を使用して表現。最初の「ネットワークアドレスは、サーバのアドレスであるとみなされ、第二のネットワーク"アドレスは、クライアントの仮想インターフェイスに割り当てられます"
+
+#: usr/local/www/vpn_openvpn_client.php:766
+#: usr/local/www/vpn_openvpn_client.php:771
+msgid ""
+"This is a network that will be routed through the tunnel, so that a site-to-"
+"site VPN can be established without manually changing the routing tables. "
+"Expressed as a CIDR range. If this is a site-to-site VPN, enter here the "
+"remote LAN here. You may leave this blank to only communicate with other "
+"clients"
+msgstr "「これはトンネルを経由してルーティングされるネットワークである、その結果、サイトツー」サイトVPNを手動でルーティングテーブルを変更せずに設定することができる。 「 CIDRの範囲として表さ。これは、サイト間VPNの場合は、ここで入力した「ここにリモートLAN 。あなただけの他の「クライアントと通信するために、この空白を残すことが"
+
+#: usr/local/www/vpn_openvpn_client.php:776
+#: usr/local/www/vpn_openvpn_client.php:781
+#: usr/local/www/vpn_openvpn_client.php:827
+#: usr/local/www/vpn_openvpn_client.php:846
+#: usr/local/www/vpn_openvpn_client.php:846
+msgid "Limit outgoing bandwidth"
+msgstr "発信帯域幅を制限"
+
+#: usr/local/www/vpn_openvpn_client.php:780
+#: usr/local/www/vpn_openvpn_client.php:785
+#: usr/local/www/vpn_openvpn_client.php:831
+#: usr/local/www/vpn_openvpn_client.php:850
+#: usr/local/www/vpn_openvpn_client.php:850
+msgid ""
+"Maximum outgoing bandwidth for this tunnel. Leave empty for no limit. The "
+"input value has to be something between 100 bytes/sec and 100 Mbytes/sec "
+"(entered as bytes per second)"
+msgstr "「このトンネルの最大送信帯域幅は制限なしに空のままにします。 「入力値が100バイト/秒と100Mバイト/秒の間に何かある必要があります」 (バイト/秒で入力)"
+
+#: usr/local/www/vpn_openvpn_client.php:797
+#: usr/local/www/vpn_openvpn_server.php:1087
+#: usr/local/www/vpn_openvpn_server.php:1229
+#: usr/local/www/vpn_openvpn_client.php:802
+#: usr/local/www/vpn_openvpn_server.php:1271
+#: usr/local/www/vpn_openvpn_client.php:848
+#: usr/local/www/vpn_openvpn_client.php:867
+#: usr/local/www/vpn_openvpn_server.php:1298
+#: usr/local/www/vpn_openvpn_client.php:867
+#: usr/local/www/vpn_openvpn_server.php:1298
+msgid "Compress tunnel packets using the LZO algorithm"
+msgstr "LZOアルゴリズムを使用して、トンネルパケットを圧縮"
+
+#: usr/local/www/vpn_openvpn_client.php:805
+#: usr/local/www/vpn_openvpn_server.php:1095
+#: usr/local/www/vpn_openvpn_server.php:1237
+#: usr/local/www/vpn_openvpn_client.php:810
+#: usr/local/www/vpn_openvpn_server.php:1279
+#: usr/local/www/vpn_openvpn_client.php:856
+#: usr/local/www/vpn_openvpn_client.php:875
+#: usr/local/www/vpn_openvpn_server.php:1306
+#: usr/local/www/vpn_openvpn_client.php:875
+#: usr/local/www/vpn_openvpn_server.php:1306
+msgid "Type-of-Service"
+msgstr "サービスタイプ"
+
+#: usr/local/www/vpn_openvpn_client.php:815
+#: usr/local/www/vpn_openvpn_server.php:1105
+#: usr/local/www/vpn_openvpn_server.php:1247
+#: usr/local/www/vpn_openvpn_client.php:820
+#: usr/local/www/vpn_openvpn_server.php:1289
+#: usr/local/www/vpn_openvpn_client.php:866
+#: usr/local/www/vpn_openvpn_client.php:885
+#: usr/local/www/vpn_openvpn_server.php:1316
+#: usr/local/www/vpn_openvpn_client.php:885
+#: usr/local/www/vpn_openvpn_server.php:1316
+msgid ""
+"Set the TOS IP header value of tunnel packets to match the encapsulated "
+"packet value"
+msgstr "パケット値「カプセル化に合わせて、トンネルパケットのTOS IPヘッダーの値を設定します""
+
+#: usr/local/www/vpn_openvpn_client.php:826
+#: usr/local/www/vpn_openvpn_server.php:1409
+#: usr/local/www/vpn_openvpn_server.php:1551
+#: usr/local/www/vpn_openvpn_client.php:831
+#: usr/local/www/vpn_openvpn_server.php:1593
+#: usr/local/www/vpn_openvpn_client.php:880
+#: usr/local/www/vpn_openvpn_client.php:899
+#: usr/local/www/vpn_openvpn_server.php:1645
+#: usr/local/www/vpn_openvpn_client.php:899
+#: usr/local/www/vpn_openvpn_server.php:1645
+msgid "Advanced configuration"
+msgstr "高度な設定"
+
+#: usr/local/www/vpn_openvpn_client.php:835
+#: usr/local/www/vpn_openvpn_client.php:840
+#: usr/local/www/vpn_openvpn_client.php:889
+#: usr/local/www/vpn_openvpn_client.php:908
+#: usr/local/www/vpn_openvpn_client.php:908
+msgid ""
+"Enter any additional options you would like to add to the OpenVPN client "
+"configuration here, separated by a semicolon"
+msgstr "セミコロンで区切られ、以下に設定」では、 OpenVPNクライアントに追加する追加オプションを入力してください ""
+
+#: usr/local/www/vpn_openvpn_client.php:836
+#: usr/local/www/vpn_openvpn_client.php:841
+#: usr/local/www/vpn_openvpn_client.php:890
+msgid "EXAMPLE: route 10.0.0.0 255.255.255.0;"
+msgstr "例:ルート10.0.0.0 255.255.255.0;"
+
+#: usr/local/www/vpn_openvpn_client.php:891
+#: usr/local/www/vpn_openvpn_client.php:896
+#: usr/local/www/vpn_openvpn_client.php:949
+#: usr/local/www/vpn_openvpn_client.php:968
+#: usr/local/www/vpn_openvpn_client.php:968
+msgid "edit client"
+msgstr "編集クライアント"
+
+#: usr/local/www/vpn_openvpn_client.php:895
+#: usr/local/www/vpn_openvpn_client.php:900
+#: usr/local/www/vpn_openvpn_client.php:953
+#: usr/local/www/vpn_openvpn_client.php:972
+#: usr/local/www/vpn_openvpn_client.php:972
+msgid "delete client"
+msgstr "クライアントを削除する"
+
+#: usr/local/www/vpn_openvpn_client.php:908
+#: usr/local/www/vpn_openvpn_client.php:913
+#: usr/local/www/vpn_openvpn_client.php:966
+#: usr/local/www/vpn_openvpn_client.php:985
+#: usr/local/www/vpn_openvpn_client.php:985
+msgid "add client"
+msgstr "クライアントを追加"
+
+#: usr/local/www/vpn_openvpn_client.php:915
+#: usr/local/www/vpn_openvpn_client.php:920
+#: usr/local/www/vpn_openvpn_client.php:973
+#: usr/local/www/vpn_openvpn_client.php:992
+#: usr/local/www/vpn_openvpn_client.php:992
+msgid "Additional OpenVPN clients can be added here."
+msgstr "追加のOpenVPNのクライアントは、ここで追加することができます。"
+
+#: usr/local/www/vpn_openvpn_csc.php:40 usr/local/www/vpn_openvpn_csc.php:40
+msgid "Client Specific Override"
+msgstr "クライアント固有のオーバーライド"
+
+#: usr/local/www/vpn_openvpn_csc.php:67 usr/local/www/vpn_openvpn_csc.php:66
+#: usr/local/www/vpn_openvpn_csc.php:66
+msgid "Client Specific Override successfully deleted"
+msgstr "クライアント固有のオーバーライドが正常に削除"
+
+#: usr/local/www/vpn_openvpn_csc.php:131
+#: usr/local/www/vpn_openvpn_server.php:244
+#: usr/local/www/vpn_openvpn_server.php:249
+#: usr/local/www/vpn_openvpn_csc.php:130
+#: usr/local/www/vpn_openvpn_server.php:250
+#: usr/local/www/vpn_openvpn_server.php:271
+#: usr/local/www/vpn_openvpn_csc.php:130
+#: usr/local/www/vpn_openvpn_server.php:271
+msgid "The field 'DNS Server #1' must contain a valid IP address"
+msgstr "フィールドのDNSサーバー"
+
+#: usr/local/www/vpn_openvpn_csc.php:133
+#: usr/local/www/vpn_openvpn_server.php:246
+#: usr/local/www/vpn_openvpn_server.php:251
+#: usr/local/www/vpn_openvpn_csc.php:132
+#: usr/local/www/vpn_openvpn_server.php:252
+#: usr/local/www/vpn_openvpn_server.php:273
+#: usr/local/www/vpn_openvpn_csc.php:132
+#: usr/local/www/vpn_openvpn_server.php:273
+msgid "The field 'DNS Server #2' must contain a valid IP address"
+msgstr "フィールドのDNSサーバー"
+
+#: usr/local/www/vpn_openvpn_csc.php:135
+#: usr/local/www/vpn_openvpn_server.php:248
+#: usr/local/www/vpn_openvpn_server.php:253
+#: usr/local/www/vpn_openvpn_csc.php:134
+#: usr/local/www/vpn_openvpn_server.php:254
+#: usr/local/www/vpn_openvpn_server.php:275
+#: usr/local/www/vpn_openvpn_csc.php:134
+#: usr/local/www/vpn_openvpn_server.php:275
+msgid "The field 'DNS Server #3' must contain a valid IP address"
+msgstr "フィールドのDNSサーバー"
+
+#: usr/local/www/vpn_openvpn_csc.php:137
+#: usr/local/www/vpn_openvpn_server.php:250
+#: usr/local/www/vpn_openvpn_server.php:255
+#: usr/local/www/vpn_openvpn_csc.php:136
+#: usr/local/www/vpn_openvpn_server.php:256
+#: usr/local/www/vpn_openvpn_server.php:277
+#: usr/local/www/vpn_openvpn_csc.php:136
+#: usr/local/www/vpn_openvpn_server.php:277
+msgid "The field 'DNS Server #4' must contain a valid IP address"
+msgstr "フィールドのDNSサーバー"
+
+#: usr/local/www/vpn_openvpn_csc.php:142
+#: usr/local/www/vpn_openvpn_server.php:255
+#: usr/local/www/vpn_openvpn_server.php:260
+#: usr/local/www/vpn_openvpn_csc.php:141
+#: usr/local/www/vpn_openvpn_server.php:261
+#: usr/local/www/vpn_openvpn_server.php:282
+#: usr/local/www/vpn_openvpn_csc.php:141
+#: usr/local/www/vpn_openvpn_server.php:282
+msgid "The field 'NTP Server #1' must contain a valid IP address"
+msgstr "フィールド「 NTPサーバ"
+
+#: usr/local/www/vpn_openvpn_csc.php:144
+#: usr/local/www/vpn_openvpn_server.php:257
+#: usr/local/www/vpn_openvpn_server.php:262
+#: usr/local/www/vpn_openvpn_csc.php:143
+#: usr/local/www/vpn_openvpn_server.php:263
+#: usr/local/www/vpn_openvpn_server.php:284
+#: usr/local/www/vpn_openvpn_csc.php:143
+#: usr/local/www/vpn_openvpn_server.php:284
+msgid "The field 'NTP Server #2' must contain a valid IP address"
+msgstr "フィールド「 NTPサーバ"
+
+#: usr/local/www/vpn_openvpn_csc.php:146
+#: usr/local/www/vpn_openvpn_server.php:259
+#: usr/local/www/vpn_openvpn_server.php:264
+#: usr/local/www/vpn_openvpn_csc.php:145
+#: usr/local/www/vpn_openvpn_server.php:265
+#: usr/local/www/vpn_openvpn_server.php:286
+#: usr/local/www/vpn_openvpn_csc.php:145
+#: usr/local/www/vpn_openvpn_server.php:286
+msgid "The field 'NTP Server #3' must contain a valid IP address"
+msgstr "フィールド「 NTPサーバ"
+
+#: usr/local/www/vpn_openvpn_csc.php:148
+#: usr/local/www/vpn_openvpn_server.php:261
+#: usr/local/www/vpn_openvpn_server.php:266
+#: usr/local/www/vpn_openvpn_csc.php:147
+#: usr/local/www/vpn_openvpn_server.php:267
+#: usr/local/www/vpn_openvpn_server.php:288
+#: usr/local/www/vpn_openvpn_csc.php:147
+#: usr/local/www/vpn_openvpn_server.php:288
+msgid "The field 'NTP Server #4' must contain a valid IP address"
+msgstr "フィールド「 NTPサーバ"
+
+#: usr/local/www/vpn_openvpn_csc.php:154
+#: usr/local/www/vpn_openvpn_server.php:267
+#: usr/local/www/vpn_openvpn_server.php:272
+#: usr/local/www/vpn_openvpn_csc.php:153
+#: usr/local/www/vpn_openvpn_server.php:273
+#: usr/local/www/vpn_openvpn_server.php:294
+#: usr/local/www/vpn_openvpn_csc.php:153
+#: usr/local/www/vpn_openvpn_server.php:294
+msgid "The field 'WINS Server #1' must contain a valid IP address"
+msgstr "フィールドには、 「 WINSサーバー"
+
+#: usr/local/www/vpn_openvpn_csc.php:156
+#: usr/local/www/vpn_openvpn_server.php:269
+#: usr/local/www/vpn_openvpn_server.php:274
+#: usr/local/www/vpn_openvpn_csc.php:155
+#: usr/local/www/vpn_openvpn_server.php:275
+#: usr/local/www/vpn_openvpn_server.php:296
+#: usr/local/www/vpn_openvpn_csc.php:155
+#: usr/local/www/vpn_openvpn_server.php:296
+msgid "The field 'WINS Server #2' must contain a valid IP address"
+msgstr "フィールドには、 「 WINSサーバー"
+
+#: usr/local/www/vpn_openvpn_csc.php:160
+#: usr/local/www/vpn_openvpn_server.php:273
+#: usr/local/www/vpn_openvpn_server.php:278
+#: usr/local/www/vpn_openvpn_csc.php:159
+#: usr/local/www/vpn_openvpn_server.php:279
+#: usr/local/www/vpn_openvpn_server.php:300
+#: usr/local/www/vpn_openvpn_csc.php:159
+#: usr/local/www/vpn_openvpn_server.php:300
+msgid ""
+"The field 'NetBIOS Data Distribution Server #1' must contain a valid IP "
+"address"
+msgstr "「フィールド」のNetBIOSデータ配信サーバ"
+
+#: usr/local/www/vpn_openvpn_csc.php:325 usr/local/www/vpn_openvpn_csc.php:324
+#: usr/local/www/vpn_openvpn_csc.php:324
+msgid "Disable this override"
+msgstr "このオーバーライドを無効にする"
+
+#: usr/local/www/vpn_openvpn_csc.php:330 usr/local/www/vpn_openvpn_csc.php:329
+#: usr/local/www/vpn_openvpn_csc.php:329
+msgid ""
+"Set this option to disable this client-specific override without removing it "
+"from the list"
+msgstr "リストから「削除せずに、このクライアント固有のオーバーライドを無効にするには、このオプションを設定する」"
+
+#: usr/local/www/vpn_openvpn_csc.php:334 usr/local/www/vpn_openvpn_csc.php:333
+#: usr/local/www/vpn_openvpn_csc.php:333
+msgid "Common name"
+msgstr "共通名"
+
+#: usr/local/www/vpn_openvpn_csc.php:338 usr/local/www/vpn_openvpn_csc.php:337
+#: usr/local/www/vpn_openvpn_csc.php:337
+msgid "Enter the client's X.509 common name here"
+msgstr "ここでクライアントのX.509共通名を入力してください"
+
+#: usr/local/www/vpn_openvpn_csc.php:350 usr/local/www/vpn_openvpn_csc.php:349
+#: usr/local/www/vpn_openvpn_csc.php:349
+msgid "Connection blocking"
+msgstr "接続ブロック"
+
+#: usr/local/www/vpn_openvpn_csc.php:360 usr/local/www/vpn_openvpn_csc.php:359
+#: usr/local/www/vpn_openvpn_csc.php:359
+msgid "Block this client connection based on its common name"
+msgstr "その共通の名前に基づいて、このクライアント接続をブロックする"
+
+#: usr/local/www/vpn_openvpn_csc.php:365 usr/local/www/vpn_openvpn_csc.php:364
+#: usr/local/www/vpn_openvpn_csc.php:364
+msgid ""
+"Don't use this option to permanently disable a client due to a compromised "
+"key or password. Use a CRL (certificate revocation list) instead"
+msgstr "キーまたはパスワード「永久に起因する侵害にクライアントを無効にするには、このオプションを使用しないでください」 。代わりに、CRL (証明書失効リスト)を使用"
+
+#: usr/local/www/vpn_openvpn_csc.php:391
+#: usr/local/www/vpn_openvpn_server.php:1011
+#: usr/local/www/vpn_openvpn_server.php:1153
+#: usr/local/www/vpn_openvpn_csc.php:390
+#: usr/local/www/vpn_openvpn_server.php:1181
+#: usr/local/www/vpn_openvpn_server.php:1208
+#: usr/local/www/vpn_openvpn_csc.php:390
+#: usr/local/www/vpn_openvpn_server.php:1208
+msgid "Redirect Gateway"
+msgstr "ゲートウェイにリダイレクト"
+
+#: usr/local/www/vpn_openvpn_csc.php:401
+#: usr/local/www/vpn_openvpn_server.php:1021
+#: usr/local/www/vpn_openvpn_server.php:1163
+#: usr/local/www/vpn_openvpn_csc.php:400
+#: usr/local/www/vpn_openvpn_server.php:1191
+#: usr/local/www/vpn_openvpn_server.php:1218
+#: usr/local/www/vpn_openvpn_csc.php:400
+#: usr/local/www/vpn_openvpn_server.php:1218
+msgid "Force all client generated traffic through the tunnel"
+msgstr "トンネルを介してすべてのクライアント生成されたトラフィックを強制的に"
+
+#: usr/local/www/vpn_openvpn_csc.php:412
+#: usr/local/www/vpn_openvpn_server.php:1155
+#: usr/local/www/vpn_openvpn_server.php:1297
+#: usr/local/www/vpn_openvpn_csc.php:411
+#: usr/local/www/vpn_openvpn_server.php:1339
+#: usr/local/www/vpn_openvpn_server.php:1366
+#: usr/local/www/vpn_openvpn_csc.php:411
+#: usr/local/www/vpn_openvpn_server.php:1366
+msgid "Client Settings"
+msgstr "クライアント設定"
+
+#: usr/local/www/vpn_openvpn_csc.php:415 usr/local/www/vpn_openvpn_csc.php:414
+#: usr/local/www/vpn_openvpn_csc.php:414
+msgid "Server Definitions"
+msgstr "サーバー定義"
+
+#: usr/local/www/vpn_openvpn_csc.php:425 usr/local/www/vpn_openvpn_csc.php:424
+#: usr/local/www/vpn_openvpn_csc.php:424
+msgid "Prevent this client from receiving any server-defined client settings"
+msgstr "任意のサーバーに定義されたクライアントの設定を受けてから、このクライアントを防ぐ"
+
+#: usr/local/www/vpn_openvpn_csc.php:510
+#: usr/local/www/vpn_openvpn_server.php:1271
+#: usr/local/www/vpn_openvpn_server.php:1413
+#: usr/local/www/vpn_openvpn_csc.php:509
+#: usr/local/www/vpn_openvpn_server.php:1455
+#: usr/local/www/vpn_openvpn_server.php:1507
+#: usr/local/www/vpn_openvpn_csc.php:509
+#: usr/local/www/vpn_openvpn_server.php:1507
+msgid "NTP Servers"
+msgstr "NTPサーバー"
+
+#: usr/local/www/vpn_openvpn_csc.php:520
+#: usr/local/www/vpn_openvpn_server.php:1281
+#: usr/local/www/vpn_openvpn_server.php:1423
+#: usr/local/www/vpn_openvpn_csc.php:519
+#: usr/local/www/vpn_openvpn_server.php:1465
+#: usr/local/www/vpn_openvpn_server.php:1517
+#: usr/local/www/vpn_openvpn_csc.php:519
+#: usr/local/www/vpn_openvpn_server.php:1517
+msgid "Provide a NTP server list to clients"
+msgstr "クライアントにNTPサーバーのリストを提供"
+
+#: usr/local/www/vpn_openvpn_csc.php:546
+#: usr/local/www/vpn_openvpn_server.php:1307
+#: usr/local/www/vpn_openvpn_server.php:1449
+#: usr/local/www/vpn_openvpn_csc.php:545
+#: usr/local/www/vpn_openvpn_server.php:1491
+#: usr/local/www/vpn_openvpn_server.php:1543
+#: usr/local/www/vpn_openvpn_csc.php:545
+#: usr/local/www/vpn_openvpn_server.php:1543
+msgid "NetBIOS Options"
+msgstr "NetBIOSのオプション"
+
+#: usr/local/www/vpn_openvpn_csc.php:556
+#: usr/local/www/vpn_openvpn_server.php:1317
+#: usr/local/www/vpn_openvpn_server.php:1459
+#: usr/local/www/vpn_openvpn_csc.php:555
+#: usr/local/www/vpn_openvpn_server.php:1501
+#: usr/local/www/vpn_openvpn_server.php:1553
+#: usr/local/www/vpn_openvpn_csc.php:555
+#: usr/local/www/vpn_openvpn_server.php:1553
+msgid "Enable NetBIOS over TCP/IP"
+msgstr "NetBIOS over TCP / IPを有効にする"
+
+#: usr/local/www/vpn_openvpn_csc.php:561
+msgid ""
+"If this option is not set, all NetBIOS-over-TCP/IP options (includeing WINS) "
+"will be disabled"
+msgstr ""このオプションが設定されていない場合、すべてのNetBIOS-over-TCP/IPオプション( WINSを内蔵してい) 」は無効になります"
+
+#: usr/local/www/vpn_openvpn_csc.php:568
+#: usr/local/www/vpn_openvpn_server.php:1329
+#: usr/local/www/vpn_openvpn_server.php:1471
+#: usr/local/www/vpn_openvpn_csc.php:567
+#: usr/local/www/vpn_openvpn_server.php:1513
+#: usr/local/www/vpn_openvpn_server.php:1565
+#: usr/local/www/vpn_openvpn_csc.php:567
+#: usr/local/www/vpn_openvpn_server.php:1565
+msgid "Node Type"
+msgstr "ノード種別"
+
+#: usr/local/www/vpn_openvpn_csc.php:581
+#: usr/local/www/vpn_openvpn_server.php:1342
+#: usr/local/www/vpn_openvpn_server.php:1484
+#: usr/local/www/vpn_openvpn_csc.php:580
+#: usr/local/www/vpn_openvpn_server.php:1526
+#: usr/local/www/vpn_openvpn_server.php:1578
+#: usr/local/www/vpn_openvpn_csc.php:580
+#: usr/local/www/vpn_openvpn_server.php:1578
+msgid ""
+"Possible options: b-node (broadcasts), p-node (point-to-point name queries "
+"to a WINS server), m-node (broadcast then query name server), and h-node "
+"(query name server, then broadcast)"
+msgstr "「可能なオプション:B-ノード(ブロードキャスト) 、 Pノード(ポイント·ツー·ポイントの名前照会」 、 WINSサーバーに) 、 Mノード(ネームサーバに照会し、ブロードキャスト) 、およびhノード」 (クエリーネームサーバその後ブロードキャスト)"
+
+#: usr/local/www/vpn_openvpn_csc.php:595
+#: usr/local/www/vpn_openvpn_server.php:1356
+#: usr/local/www/vpn_openvpn_server.php:1498
+#: usr/local/www/vpn_openvpn_csc.php:594
+#: usr/local/www/vpn_openvpn_server.php:1540
+#: usr/local/www/vpn_openvpn_server.php:1592
+#: usr/local/www/vpn_openvpn_csc.php:594
+#: usr/local/www/vpn_openvpn_server.php:1592
+msgid ""
+"A NetBIOS ScopetID provides an extended naming service fortNetBIOS over "
+"TCP/IP. The NetBIOS scope ID isolates NetBIOS traffic on a single network to "
+"only those nodes with the same NetBIOS scope ID"
+msgstr "TCP / IP」のNetBIOS ScopetID過剰拡張ネーミングサービスfortNetBIOSを提供しています」 。 NetBIOSスコープIDは、単一のネットワーク上でNetBIOSトラフィックを分離する」とは、同じNetBIOSスコープIDを持つノードのみ"
+
+#: usr/local/www/vpn_openvpn_csc.php:648 usr/local/www/vpn_openvpn_csc.php:647
+#: usr/local/www/vpn_openvpn_csc.php:647
+msgid ""
+"Enter any additional options you would like to add for this client specific "
+"override, separated by a semicolon"
+msgstr "オーバーライド、セミコロンで区切られた「あなたはこのクライアントの特定のために追加したい任意の追加のオプションを入力してください ""
+
+#: usr/local/www/vpn_openvpn_csc.php:649
+#: usr/local/www/vpn_openvpn_server.php:1419
+#: usr/local/www/vpn_openvpn_server.php:1561
+#: usr/local/www/vpn_openvpn_csc.php:648
+#: usr/local/www/vpn_openvpn_server.php:1603
+#: usr/local/www/vpn_openvpn_server.php:1655
+#: usr/local/www/vpn_openvpn_csc.php:648
+#: usr/local/www/vpn_openvpn_server.php:1655
+msgid "EXAMPLE: push "route 10.0.0.0 255.255.255.0""
+msgstr "例:プッシュ」ルート10.0.0.0 255.255.255.0 ""
+
+#: usr/local/www/vpn_openvpn_csc.php:696 usr/local/www/vpn_openvpn_csc.php:695
+#: usr/local/www/vpn_openvpn_csc.php:695
+msgid "edit csc"
+msgstr "編集CSC"
+
+#: usr/local/www/vpn_openvpn_csc.php:699 usr/local/www/vpn_openvpn_csc.php:698
+#: usr/local/www/vpn_openvpn_csc.php:698
+msgid "Do you really want to delete this csc?"
+msgstr "あなたは本当にこのCSCを削除しますか?"
+
+#: usr/local/www/vpn_openvpn_csc.php:700 usr/local/www/vpn_openvpn_csc.php:699
+#: usr/local/www/vpn_openvpn_csc.php:699
+msgid "delete csc"
+msgstr "CSCを削除"
+
+#: usr/local/www/vpn_openvpn_csc.php:711 usr/local/www/vpn_openvpn_csc.php:710
+#: usr/local/www/vpn_openvpn_csc.php:710
+msgid "add csc"
+msgstr "CSCを追加"
+
+#: usr/local/www/vpn_openvpn_csc.php:718 usr/local/www/vpn_openvpn_csc.php:717
+#: usr/local/www/vpn_openvpn_csc.php:717
+msgid "Additional OpenVPN client specific overrides can be added here."
+msgstr "追加のOpenVPNクライアント固有のオーバーライドをここに追加することができます。"
+
+#: usr/local/www/vpn_openvpn_server.php:86
+#: usr/local/www/vpn_openvpn_server.php:87
+#: usr/local/www/vpn_openvpn_server.php:87
+msgid "Server successfully deleted"
+msgstr "サーバーを正常に削除"
+
+#: usr/local/www/vpn_openvpn_server.php:210
+#: usr/local/www/vpn_openvpn_server.php:215
+#: usr/local/www/vpn_openvpn_server.php:216
+#: usr/local/www/vpn_openvpn_server.php:228
+#: usr/local/www/vpn_openvpn_server.php:228
+msgid ""
+"You must select a Backend for Authentication if the server mode requires "
+"User Auth."
+msgstr "ユーザー認証を「サーバー·モードが必要な場合は、認証のためのバックエンドを選択する必要があります」 。"
+
+#: usr/local/www/vpn_openvpn_server.php:277
+#: usr/local/www/vpn_openvpn_server.php:282
+#: usr/local/www/vpn_openvpn_server.php:283
+#: usr/local/www/vpn_openvpn_server.php:304
+#: usr/local/www/vpn_openvpn_server.php:304
+msgid "The field 'Concurrent connections' must be numeric."
+msgstr "フィールド「同時接続」は数値でなければなりません。"
+
+#: usr/local/www/vpn_openvpn_server.php:290
+#: usr/local/www/vpn_openvpn_server.php:296
+#: usr/local/www/vpn_openvpn_server.php:297
+#: usr/local/www/vpn_openvpn_server.php:318
+#: usr/local/www/vpn_openvpn_server.php:318
+msgid "Tunnel network"
+msgstr "トンネルネットワーク"
+
+#: usr/local/www/vpn_openvpn_server.php:615
+#: usr/local/www/vpn_openvpn_server.php:688
+#: usr/local/www/vpn_openvpn_server.php:706
+#: usr/local/www/vpn_openvpn_server.php:732
+#: usr/local/www/vpn_openvpn_server.php:732
+msgid "Disable this server"
+msgstr "このサーバーを使用不可に"
+
+#: usr/local/www/vpn_openvpn_server.php:620
+#: usr/local/www/vpn_openvpn_server.php:693
+#: usr/local/www/vpn_openvpn_server.php:711
+#: usr/local/www/vpn_openvpn_server.php:737
+#: usr/local/www/vpn_openvpn_server.php:737
+msgid ""
+"Set this option to disable this server without removing it from the list"
+msgstr "「リストから削除せずに、このサーバーを無効にするには、このオプションを設定"
+
+#: usr/local/www/vpn_openvpn_server.php:639
+#: usr/local/www/vpn_openvpn_server.php:712
+#: usr/local/www/vpn_openvpn_server.php:730
+#: usr/local/www/vpn_openvpn_server.php:756
+#: usr/local/www/vpn_openvpn_server.php:756
+msgid "Backend for authentication"
+msgstr "認証のためにバックエンド"
+
+#: usr/local/www/vpn_openvpn_server.php:671
+#: usr/local/www/vpn_openvpn_server.php:744
+#: usr/local/www/vpn_openvpn_server.php:762
+#: usr/local/www/vpn_openvpn_server.php:788
+#: usr/local/www/vpn_openvpn_server.php:788
+msgid "Device Mode"
+msgstr "デバイスモード"
+
+#: usr/local/www/vpn_openvpn_server.php:797
+#: usr/local/www/vpn_openvpn_server.php:870
+#: usr/local/www/vpn_openvpn_server.php:898
+#: usr/local/www/vpn_openvpn_server.php:925
+#: usr/local/www/vpn_openvpn_server.php:925
+msgid "Peer Certificate Revocation List"
+msgstr "証明書失効リストピア"
+
+#: usr/local/www/vpn_openvpn_server.php:822
+#: usr/local/www/vpn_openvpn_server.php:895
+#: usr/local/www/vpn_openvpn_server.php:923
+#: usr/local/www/vpn_openvpn_server.php:950
+#: usr/local/www/vpn_openvpn_server.php:950
+msgid "Server Certificate"
+msgstr "サーバー証明書"
+
+#: usr/local/www/vpn_openvpn_server.php:851
+#: usr/local/www/vpn_openvpn_server.php:924
+#: usr/local/www/vpn_openvpn_server.php:952
+#: usr/local/www/vpn_openvpn_server.php:979
+#: usr/local/www/vpn_openvpn_server.php:979
+msgid "DH Parameters Length"
+msgstr "DHパラメータ長"
+
+#: usr/local/www/vpn_openvpn_server.php:934
+#: usr/local/www/vpn_openvpn_server.php:1007
+#: usr/local/www/vpn_openvpn_server.php:1035
+#: usr/local/www/vpn_openvpn_server.php:1062
+#: usr/local/www/vpn_openvpn_server.php:1062
+msgid "Certificate Depth"
+msgstr "証明書の深さ"
+
+#: usr/local/www/vpn_openvpn_server.php:952
+#: usr/local/www/vpn_openvpn_server.php:1025
+#: usr/local/www/vpn_openvpn_server.php:1053
+#: usr/local/www/vpn_openvpn_server.php:1080
+#: usr/local/www/vpn_openvpn_server.php:1080
+msgid ""
+"When a certificate-based client logs in, do not accept certificates below "
+"this depth. Useful for denying certificates made with intermediate CAs "
+"generated from the same CA as the server."
+msgstr "この深さ」の証明書ベースのクライアントがログインすると、以下の証明書を受け入れない」 。サーバと同じCAから生成された中間CA 」で作られた証明書を否定するのに便利です。"
+
+#: usr/local/www/vpn_openvpn_server.php:959
+#: usr/local/www/vpn_openvpn_server.php:1032
+#: usr/local/www/vpn_openvpn_server.php:1060
+#: usr/local/www/vpn_openvpn_server.php:1087
+#: usr/local/www/vpn_openvpn_server.php:1087
+msgid "Strict User/CN Matching"
+msgstr "厳格なユーザー/ CNマッチング"
+
+#: usr/local/www/vpn_openvpn_server.php:969
+#: usr/local/www/vpn_openvpn_server.php:1042
+#: usr/local/www/vpn_openvpn_server.php:1070
+#: usr/local/www/vpn_openvpn_server.php:1097
+#: usr/local/www/vpn_openvpn_server.php:1097
+msgid ""
+"When authenticating users, enforce a match between the common name of the "
+"client certificate and the username given at login."
+msgstr "クライアント証明書と、ログイン時に指定されたユーザー名」ユーザを認証するときの一般的な名前との間の一致を強制する」 。"
+
+#: usr/local/www/vpn_openvpn_server.php:983
+#: usr/local/www/vpn_openvpn_server.php:1056
+#: usr/local/www/vpn_openvpn_server.php:1084
+#: usr/local/www/vpn_openvpn_client.php:771
+#: usr/local/www/vpn_openvpn_client.php:790
+#: usr/local/www/vpn_openvpn_server.php:1111
+#: usr/local/www/vpn_openvpn_client.php:790
+#: usr/local/www/vpn_openvpn_server.php:1111
+msgid "IPv4 Tunnel Network"
+msgstr "IPv4のトンネルネットワーク"
+
+#: usr/local/www/vpn_openvpn_server.php:987
+#: usr/local/www/vpn_openvpn_server.php:1060
+#: usr/local/www/vpn_openvpn_server.php:1088
+#: usr/local/www/vpn_openvpn_server.php:1115
+#: usr/local/www/vpn_openvpn_server.php:1115
+msgid ""
+"This is the IPv4 virtual network used for private communications between "
+"this server and client hosts expressed using CIDR (eg. 10.0.8.0/24). The "
+"first network address will be assigned to thetserver virtual interface. The "
+"remaining network addresses can optionally be assigned to connecting "
+"clients. (see Address Pool)"
+msgstr "このサーバーとクライアントホスト「これは間のプライベート通信に使用されるIPv4の仮想ネットワークである「 CIDR (例: 10.0.8.0/24 )を使用して表現。 「最初のネットワークアドレスがthetserver仮想インターフェイスに割り当てられます。 「残りのネットワークアドレスは、必要に応じて「クライアントの接続に割り当てることができます。 (アドレスプールを参照してください)"
+
+#: usr/local/www/vpn_openvpn_server.php:997
+#: usr/local/www/vpn_openvpn_server.php:1070
+#: usr/local/www/vpn_openvpn_server.php:1098
+#: usr/local/www/vpn_openvpn_client.php:785
+#: usr/local/www/vpn_openvpn_client.php:804
+#: usr/local/www/vpn_openvpn_server.php:1125
+#: usr/local/www/vpn_openvpn_client.php:804
+#: usr/local/www/vpn_openvpn_server.php:1125
+msgid "IPv6 Tunnel Network"
+msgstr "IPv6トンネルネットワーク"
+
+#: usr/local/www/vpn_openvpn_server.php:1001
+#: usr/local/www/vpn_openvpn_server.php:1074
+msgid ""
+"This is the IPv6 virtual network used for private communications between "
+"this server and client hosts expressed using CIDR (eg. fe80::/64). The first "
+"network address will be assigned to thetserver virtual interface. The "
+"remaining network addresses can optionally be assigned to connecting "
+"clients. (see Address Pool)"
+msgstr "このサーバーとクライアントホスト「これは間のプライベート通信に使用されるIPv6の仮想ネットワークである"(例: FE80:: / 64 ) 、CIDRを使用して表現。最初の「ネットワークアドレスはthetserver仮想インターフェイスに割り当てられます。 「残りのネットワークアドレスは、必要に応じて「クライアントの接続に割り当てることができます。 (アドレスプールを参照してください)"
+
+#: usr/local/www/vpn_openvpn_server.php:1029
+#: usr/local/www/vpn_openvpn_server.php:1171
+#: usr/local/www/vpn_openvpn_server.php:1199
+msgid "IPv4 Local Network"
+msgstr "IPv4のローカルネットワーク"
+
+#: usr/local/www/vpn_openvpn_server.php:1033
+#: usr/local/www/vpn_openvpn_server.php:1175
+#: usr/local/www/vpn_openvpn_server.php:1203
+msgid ""
+"This is the network that will be accessible from the remote endpoint. "
+"Expressed as a CIDR range. You may leave this blank if you don't want to add "
+"a route to the local network through this tunnel on the remote machine. This "
+"is generally set to your LAN network"
+msgstr ""これは、リモートエンドポイントからアクセスされるネットワークである。 」のCIDR範囲として表さ。あなたが追加したくない場合は、この空白のままにも"リモートマシン上でこのトンネルを介してローカルネットワークへのルートを。これは、 「一般的に、あなたのLANネットワークに設定されている"
+
+#: usr/local/www/vpn_openvpn_server.php:1042
+#: usr/local/www/vpn_openvpn_server.php:1184
+#: usr/local/www/vpn_openvpn_server.php:1212
+msgid "IPv6 Local Network"
+msgstr "IPv6ローカルネットワーク"
+
+#: usr/local/www/vpn_openvpn_server.php:1046
+#: usr/local/www/vpn_openvpn_server.php:1188
+#: usr/local/www/vpn_openvpn_server.php:1216
+msgid ""
+"This is the IPv6 network that will be accessible from the remote endpoint. "
+"Expressed as a CIDR range. You may leave this blank if you don't want to add "
+"a route to the local network through this tunnel on the remote machine. This "
+"is generally set to your LAN network"
+msgstr "「これは、リモートエンドポイントからアクセスできるようになり、IPv6ネットワークである。 」のCIDR範囲として表さ。あなたが追加したくない場合は、この空白のままにも"リモートマシン上でこのトンネルを介してローカルネットワークへのルートを。これは、 「一般的に、あなたのLANネットワークに設定されている"
+
+#: usr/local/www/vpn_openvpn_server.php:1059
+#: usr/local/www/vpn_openvpn_server.php:1201
+msgid ""
+"This is a network that will be routed through the tunnel, so that a site-to-"
+"site VPN can be established without manually changing the routing tables. "
+"Expressed as a CIDR range. If this is a site-to-site VPN, enter here the "
+"remote LAN here. You may leave this blank if you don't want a site-to-site "
+"VPN"
+msgstr "「これはトンネルを経由してルーティングされるネットワークである、その結果、サイトツー」サイトVPNを手動でルーティングテーブルを変更せずに設定することができる。 「 CIDRの範囲として表さ。これは、サイト間VPNの場合は、ここで入力した「ここにリモートLAN 。サイトツーサイト「VPNを使用しない場合は、この空白を残すことが"
+
+#: usr/local/www/vpn_openvpn_server.php:1069
+#: usr/local/www/vpn_openvpn_server.php:1211
+#: usr/local/www/vpn_openvpn_server.php:1253
+#: usr/local/www/vpn_openvpn_server.php:1280
+#: usr/local/www/vpn_openvpn_server.php:1280
+msgid "Concurrent connections"
+msgstr "同時接続"
+
+#: usr/local/www/vpn_openvpn_server.php:1073
+#: usr/local/www/vpn_openvpn_server.php:1215
+#: usr/local/www/vpn_openvpn_server.php:1257
+#: usr/local/www/vpn_openvpn_server.php:1284
+#: usr/local/www/vpn_openvpn_server.php:1284
+msgid ""
+"Specify the maximum number of clients allowed to concurrently connect to "
+"this server"
+msgstr "このサーバー「同時にへの接続を許可するクライアントの最大数を指定する」"
+
+#: usr/local/www/vpn_openvpn_server.php:1113
+#: usr/local/www/vpn_openvpn_server.php:1255
+#: usr/local/www/vpn_openvpn_server.php:1297
+#: usr/local/www/vpn_openvpn_server.php:1324
+#: usr/local/www/vpn_openvpn_server.php:1324
+msgid "Inter-client communication"
+msgstr "クライアント間通信"
+
+#: usr/local/www/vpn_openvpn_server.php:1123
+#: usr/local/www/vpn_openvpn_server.php:1265
+#: usr/local/www/vpn_openvpn_server.php:1307
+#: usr/local/www/vpn_openvpn_server.php:1334
+#: usr/local/www/vpn_openvpn_server.php:1334
+msgid "Allow communication between clients connected to this server"
+msgstr "このサーバーに接続しているクライアント間の通信を可能に"
+
+#: usr/local/www/vpn_openvpn_server.php:1131
+#: usr/local/www/vpn_openvpn_server.php:1273
+#: usr/local/www/vpn_openvpn_server.php:1315
+#: usr/local/www/vpn_openvpn_server.php:1342
+#: usr/local/www/vpn_openvpn_server.php:1342
+msgid "Duplicate Connections"
+msgstr "接続を復元"
+
+#: usr/local/www/vpn_openvpn_server.php:1141
+#: usr/local/www/vpn_openvpn_server.php:1283
+#: usr/local/www/vpn_openvpn_server.php:1325
+#: usr/local/www/vpn_openvpn_server.php:1352
+#: usr/local/www/vpn_openvpn_server.php:1352
+msgid ""
+"Allow multiple concurrent connections from clients using the same Common "
+"Name.<br />NOTE: This is not generally recommended, but may be needed for "
+"some scenarios."
+msgstr "Name.<br />NOTE 「同じ共通使用してクライアントからの複数の同時接続を許可する」 :これは、一般的にはお勧めしませんが、いくつかのシナリオ」のために必要な場合があります。"
+
+#: usr/local/www/vpn_openvpn_server.php:1158
+#: usr/local/www/vpn_openvpn_server.php:1300
+#: usr/local/www/vpn_openvpn_server.php:1342
+#: usr/local/www/vpn_openvpn_server.php:1369
+#: usr/local/www/vpn_openvpn_server.php:1369
+msgid "Dynamic IP"
+msgstr "動的IP"
+
+#: usr/local/www/vpn_openvpn_server.php:1168
+#: usr/local/www/vpn_openvpn_server.php:1310
+#: usr/local/www/vpn_openvpn_server.php:1352
+#: usr/local/www/vpn_openvpn_server.php:1379
+#: usr/local/www/vpn_openvpn_server.php:1379
+msgid ""
+"Allow connected clients to retain their connections if their IP address "
+"changes"
+msgstr "「接続されたクライアントが接続を維持できるようにし、そのIPアドレスがあれば「変化"
+
+#: usr/local/www/vpn_openvpn_server.php:1176
+#: usr/local/www/vpn_openvpn_server.php:1318
+#: usr/local/www/vpn_openvpn_server.php:1360
+#: usr/local/www/vpn_openvpn_server.php:1387
+#: usr/local/www/vpn_openvpn_server.php:1387
+msgid "Address Pool"
+msgstr "アドレスプール"
+
+#: usr/local/www/vpn_openvpn_server.php:1186
+#: usr/local/www/vpn_openvpn_server.php:1328
+#: usr/local/www/vpn_openvpn_server.php:1370
+#: usr/local/www/vpn_openvpn_server.php:1397
+#: usr/local/www/vpn_openvpn_server.php:1397
+msgid "Provide a virtual adapter IP address to clients (see Tunnel Network)"
+msgstr "クライアントに仮想アダプタのIPアドレスを指定します(トンネル·ネットワーク)"
+
+#: usr/local/www/vpn_openvpn_server.php:1322
+#: usr/local/www/vpn_openvpn_server.php:1464
+#: usr/local/www/vpn_openvpn_csc.php:560
+#: usr/local/www/vpn_openvpn_server.php:1506
+#: usr/local/www/vpn_openvpn_server.php:1558
+#: usr/local/www/vpn_openvpn_csc.php:560
+#: usr/local/www/vpn_openvpn_server.php:1558
+msgid ""
+"If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) "
+"will be disabled"
+msgstr ""このオプションが設定されていない場合、 ( WINSを含む)すべてのNetBIOS-over-TCP/IPオプションが「無効になります"
+
+#: usr/local/www/vpn_openvpn_server.php:1352
+#: usr/local/www/vpn_openvpn_server.php:1494
+#: usr/local/www/vpn_openvpn_server.php:1536
+#: usr/local/www/vpn_openvpn_server.php:1588
+#: usr/local/www/vpn_openvpn_server.php:1588
+msgid "Scope ID"
+msgstr "スコープID"
+
+#: usr/local/www/vpn_openvpn_server.php:1418
+#: usr/local/www/vpn_openvpn_server.php:1560
+#: usr/local/www/vpn_openvpn_server.php:1602
+#: usr/local/www/vpn_openvpn_server.php:1654
+#: usr/local/www/vpn_openvpn_server.php:1654
+msgid ""
+"Enter any additional options you would like to add to the OpenVPN server "
+"configuration here, separated by a semicolon"
+msgstr "セミコロンで区切られ、以下に設定」では、 OpenVPNのサーバーに追加する追加オプションを入力してください ""
+
+#: usr/local/www/vpn_openvpn_server.php:1449
+#: usr/local/www/vpn_openvpn_server.php:1591
+#: usr/local/www/vpn_openvpn_server.php:1632
+#: usr/local/www/vpn_openvpn_server.php:1684
+#: usr/local/www/vpn_openvpn_server.php:1684
+msgid "Protocol / Port"
+msgstr "プロトコル/ポート"
+
+#: usr/local/www/vpn_openvpn_server.php:1482
+#: usr/local/www/vpn_openvpn_server.php:1624
+#: usr/local/www/vpn_openvpn_server.php:1665
+#: usr/local/www/vpn_openvpn_server.php:1717
+#: usr/local/www/vpn_openvpn_server.php:1717
+msgid "Do you really want to delete this server?"
+msgstr "あなたは本当に、このサーバーを削除しますか?"
+
+#: usr/local/www/vpn_openvpn_server.php:1503
+#: usr/local/www/vpn_openvpn_server.php:1645
+#: usr/local/www/vpn_openvpn_server.php:1686
+#: usr/local/www/vpn_openvpn_server.php:1738
+#: usr/local/www/vpn_openvpn_server.php:1738
+msgid "Additional OpenVPN servers can be added here."
+msgstr "追加のOpenVPNのサーバがここに添加することができる。"
+
+#: usr/local/www/vpn_pppoe_edit.php:136 usr/local/www/vpn_pppoe_edit.php:136
+msgid "The specified server address is equal to an interface ip address."
+msgstr "指定されたサーバーアドレスは、インターフェイスIPアドレスと同じである。"
+
+#: usr/local/www/vpn_pppoe_edit.php:141 usr/local/www/vpn_pppoe_edit.php:141
+#, php-format
+msgid "No password specified for username %s"
+msgstr "ユーザー名%sに指定したパスワードません"
+
+#: usr/local/www/vpn_pppoe_edit.php:143 usr/local/www/vpn_pppoe_edit.php:143
+#, php-format
+msgid "Incorrect ip address specified for username %s"
+msgstr "ユーザー名%sに指定され、誤ったIPアドレス"
+
+#: usr/local/www/vpn_pppoe_edit.php:355 usr/local/www/vpn_pppoe_edit.php:356
+#: usr/local/www/vpn_pppoe_edit.php:359 usr/local/www/vpn_pppoe_edit.php:359
+msgid "PPPoE server configuration"
+msgstr "PPPoEサーバの設定"
+
+#: usr/local/www/vpn_pppoe_edit.php:368 usr/local/www/vpn_pppoe_edit.php:369
+#: usr/local/www/vpn_pppoe_edit.php:372 usr/local/www/vpn_pppoe_edit.php:372
+msgid "Enable PPPoE server"
+msgstr "PPPoEサーバを有効にします"
+
+#: usr/local/www/vpn_pppoe_edit.php:403 usr/local/www/vpn_pppoe_edit.php:404
+#: usr/local/www/vpn_pppoe_edit.php:407 usr/local/www/vpn_pppoe_edit.php:407
+msgid "Hint"
+msgstr "ヒント"
+
+#: usr/local/www/vpn_pppoe_edit.php:407 usr/local/www/vpn_pppoe_edit.php:408
+#: usr/local/www/vpn_pppoe_edit.php:411 usr/local/www/vpn_pppoe_edit.php:411
+msgid "No. PPPoE users"
+msgstr "いいえPPPoEのユーザー"
+
+#: usr/local/www/vpn_pppoe_edit.php:420 usr/local/www/vpn_pppoe_edit.php:421
+#: usr/local/www/vpn_pppoe_edit.php:424 usr/local/www/vpn_pppoe_edit.php:424
+msgid "Hint: 10 is ten PPPoE clients"
+msgstr "ヒント:10 10 PPPoEクライアントです"
+
+#: usr/local/www/vpn_pppoe_edit.php:428 usr/local/www/vpn_pppoe_edit.php:429
+#: usr/local/www/vpn_pppoe_edit.php:432 usr/local/www/vpn_pppoe_edit.php:432
+msgid ""
+"Enter the IP address the PPPoE server should give to clients for use as "
+"their "gateway""
+msgstr "彼らの「ゲートウェイ」 「 IPアドレスを入力してPPPoEサーバとして使用するためには、クライアントに与える必要があります」"
+
+#: usr/local/www/vpn_pppoe_edit.php:440 usr/local/www/vpn_pppoe_edit.php:441
+#: usr/local/www/vpn_pppoe_edit.php:444 usr/local/www/vpn_pppoe_edit.php:444
+msgid "Specify the starting address for the client IP address subnet"
+msgstr "クライアントのIPアドレス、サブネットの開始アドレスを指定"
+
+#: usr/local/www/vpn_pppoe_edit.php:457 usr/local/www/vpn_pppoe_edit.php:458
+#: usr/local/www/vpn_pppoe_edit.php:461 usr/local/www/vpn_pppoe_edit.php:461
+msgid ""
+"If entered they will be given to all PPPoE clients, else LAN DNS and one WAN "
+"DNS will go to all clients"
+msgstr "「入力した場合、それらはすべてのPPPoEクライアントに与えられます、他のLAN DNSと1 WAN」 DNSは、すべてのクライアントに行く"
+
+#: usr/local/www/vpn_pppoe_edit.php:474 usr/local/www/vpn_pppoe_edit.php:475
+#: usr/local/www/vpn_pppoe_edit.php:478 usr/local/www/vpn_pppoe_edit.php:478
+msgid "Use Backup RADIUS Server"
+msgstr "バックアップRADIUSサーバを使用"
+
+#: usr/local/www/vpn_pppoe_edit.php:475 usr/local/www/vpn_pppoe_edit.php:476
+#: usr/local/www/vpn_pppoe_edit.php:479 usr/local/www/vpn_pppoe_edit.php:479
+msgid ""
+"When set, if primary server fails all requests will be sent via backup server"
+msgstr "」に設定すると、プライマリサーバがすべての要求を失敗した場合にバックアップサーバを経由して送信されます"
+
+#: usr/local/www/vpn_pppoe_edit.php:478 usr/local/www/vpn_pppoe_edit.php:479
+#: usr/local/www/vpn_pppoe_edit.php:482 usr/local/www/vpn_pppoe_edit.php:482
+msgid "NAS IP Address"
+msgstr "NASのIPアドレス"
+
+#: usr/local/www/vpn_pppoe_edit.php:481 usr/local/www/vpn_pppoe_edit.php:482
+#: usr/local/www/vpn_pppoe_edit.php:485 usr/local/www/vpn_pppoe_edit.php:485
+msgid "RADIUS server NAS IP Address"
+msgstr "RADIUSサーバのNASのIPアドレス"
+
+#: usr/local/www/vpn_pppoe_edit.php:488 usr/local/www/vpn_pppoe_edit.php:489
+#: usr/local/www/vpn_pppoe_edit.php:492 usr/local/www/vpn_pppoe_edit.php:492
+msgid "RADIUS accounting update period in seconds"
+msgstr "秒単位のRADIUSアカウンティング更新期間"
+
+#: usr/local/www/vpn_pppoe_edit.php:495 usr/local/www/vpn_pppoe_edit.php:496
+#: usr/local/www/vpn_pppoe_edit.php:499 usr/local/www/vpn_pppoe_edit.php:499
+msgid "Issue IP Addresses via RADIUS server"
+msgstr "RADIUSサーバーを経由して発行するIPアドレス"
+
+#: usr/local/www/vpn_pppoe_edit.php:498 usr/local/www/vpn_pppoe_edit.php:499
+#: usr/local/www/vpn_pppoe_edit.php:502 usr/local/www/vpn_pppoe_edit.php:502
+msgid "RADIUS server Primary"
+msgstr "RADIUSサーバのプライマリ"
+
+#: usr/local/www/vpn_pppoe_edit.php:503 usr/local/www/vpn_pppoe_edit.php:504
+#: usr/local/www/vpn_pppoe_edit.php:507 usr/local/www/vpn_pppoe_edit.php:507
+msgid ""
+"Enter the IP address, authentication port and accounting port (optional) of "
+"the RADIUS server."
+msgstr "RADIUSサーバ」のIPアドレス、認証ポートとアカウンティングポートを入力します(オプション) 」 。"
+
+#: usr/local/www/vpn_pppoe_edit.php:504 usr/local/www/vpn_pppoe_edit.php:520
+#: usr/local/www/vpn_pppoe_edit.php:505 usr/local/www/vpn_pppoe_edit.php:521
+#: usr/local/www/vpn_pppoe_edit.php:508 usr/local/www/vpn_pppoe_edit.php:524
+#: usr/local/www/vpn_pppoe_edit.php:508 usr/local/www/vpn_pppoe_edit.php:524
+msgid "standard port 1812 and 1813 accounting"
+msgstr "標準のポート1812および1813会計"
+
+#: usr/local/www/vpn_pppoe_edit.php:507 usr/local/www/vpn_pppoe_edit.php:508
+#: usr/local/www/vpn_pppoe_edit.php:511 usr/local/www/vpn_pppoe_edit.php:511
+msgid "RADIUS primary shared secret"
+msgstr "RADIUSプライマリ共有シークレット"
+
+#: usr/local/www/vpn_pppoe_edit.php:514 usr/local/www/vpn_pppoe_edit.php:515
+#: usr/local/www/vpn_pppoe_edit.php:518 usr/local/www/vpn_pppoe_edit.php:518
+msgid "RADIUS server Secondary"
+msgstr "RADIUSサーバのセカンダリ"
+
+#: usr/local/www/vpn_pppoe_edit.php:519 usr/local/www/vpn_pppoe_edit.php:520
+#: usr/local/www/vpn_pppoe_edit.php:523 usr/local/www/vpn_pppoe_edit.php:523
+msgid ""
+"Enter the IP address, authentication port and accounting port (optional) of "
+"the backup RADIUS server."
+msgstr "バックアップRADIUSサーバ」のIPアドレス、認証ポートとアカウンティングポートを入力します(オプション) 」 。"
+
+#: usr/local/www/vpn_pppoe_edit.php:523 usr/local/www/vpn_pppoe_edit.php:524
+#: usr/local/www/vpn_pppoe_edit.php:527 usr/local/www/vpn_pppoe_edit.php:527
+msgid "RADIUS secondary shared secret"
+msgstr "RADIUSセカンダリ共有秘密"
+
+#: usr/local/www/vpn_pppoe_edit.php:531 usr/local/www/vpn_pppoe_edit.php:532
+#: usr/local/www/vpn_pppoe_edit.php:535 usr/local/www/vpn_pppoe_edit.php:535
+msgid "User (s)"
+msgstr "ユーザ(複数可)"
+
+#: usr/local/www/vpn_pppoe_edit.php:596 usr/local/www/vpn_pppoe_edit.php:597
+#: usr/local/www/vpn_pppoe_edit.php:600 usr/local/www/vpn_pppoe_edit.php:600
+msgid ""
+"don't forget to add a firewall rule to permit traffic from PPPoE clients"
+msgstr "「 PPPoEクライアントからのトラフィックを許可するファイアウォールルールを追加することを忘れないでください"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:37
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:37
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:37
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:37
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:37
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:37
+msgid "You need to specify the number of connections."
+msgstr "あなたは、接続の数を指定する必要があります。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:42
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:42
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:43
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:43
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:42
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:42
+msgid "The number of connections should be greater than 1."
+msgstr "接続数は1より大きくなければなりません。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:65
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:63
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:64
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:71
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:63
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:64
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:71
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:63
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:63
+msgid "You have less interfaces than number of connections!"
+msgstr "あなたは、接続の数よりも少ないインタフェースを持っている !"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:445
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:518
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:459
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:551
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:489
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:586
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:293
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:372
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:588
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:443
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:516
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:489
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:588
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:459
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:551
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:443
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:516
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:293
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:372
+msgid ""
+"Address must be a valid IP address or Firewall Alias. Please correct this "
+"value to continue."
+msgstr "「アドレスが有効なIPアドレスまたはファイアウォールエイリアスでなければなりません。この修正してください」を継続する価値。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:505
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:536
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:539
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:568
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:574
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:601
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:358
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:392
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:576
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:603
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:503
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:534
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:576
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:603
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:539
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:568
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:503
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:534
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:358
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:392
+msgid "Only percentage bandwidth specification is allowed."
+msgstr "唯一の帯域幅の割合(%)の指定が許可されます。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:695
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1044
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:722
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1106
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:756
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1154
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:542
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:930
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:758
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1156
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:693
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1042
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:758
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1156
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:722
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1106
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:693
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1042
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:542
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:930
+msgid ""
+"Custom Bandwidths are greater than 30%. Please lower them for the wizard to "
+"continue."
+msgstr "「カスタム帯域幅が30%を超えています。ウィザードのためにそれらを下げてください」継続。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1346
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1408
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1462
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1205
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1464
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1344
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1464
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1408
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1344
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1205
+msgid "Penalty Box"
+msgstr "ペナルティーボックス"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1366
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1427
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1482
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1225
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1484
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1364
+msgid "VOIP Adapter"
+msgstr "VOIPアダプタ"
+
+#: usr/local/www/wizards/openvpn_wizard.inc:602
+#: usr/local/www/wizards/openvpn_wizard.inc:618
+#: usr/local/www/wizards/openvpn_wizard.inc:619
+#: usr/local/www/wizards/openvpn_wizard.inc:602
+#: usr/local/www/wizards/openvpn_wizard.inc:619
+#, php-format
+msgid "OpenVPN %s wizard"
+msgstr "OpenVPNの%sウィザード"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:268
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:268
+msgid "You cannot specify bandwidth smaller than 1!"
+msgstr "あなたは1 よりも小さい帯域幅を指定することはできません!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:278
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:288
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:288
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:278
+msgid "You cannot select the same interface for local and outside."
+msgstr "あなたが外で、ローカルおよびのための同じインターフェイスを選択することはできません。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:276
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:276
+msgid "You cannot specify 0 bandwidth!"
+msgstr "あなたが0の帯域幅を指定することはできません!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:297
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:297
+msgid "You cannot select the same interface twice on local interfaces."
+msgstr "あなたは、ローカルインターフェイス上で二度同じインターフェイスを選択することはできません。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:37
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:37
+msgid "You need to specify the number of local interfaces connected."
+msgstr "あなたが接続されているローカルインターフェイスの数を指定する必要があります。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:41
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:41
+msgid "The number of local connection needs to be greater than 1."
+msgstr "ローカル接続の数が1より大きくする必要がある。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:240
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:240
+msgid "Upload bandwidth of connection is not valid."
+msgstr "コネクションのアップロード帯域幅が有効ではありません。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:245
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:245
+msgid "Download bandwidth of connection is not valid."
+msgstr "接続のダウンロード帯域幅が有効ではありません。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:252
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:252
+msgid "You cannot specify bandwidth less than 1!"
+msgstr "あなたは、帯域幅が1未満を指定することはできません!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:257
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:262
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:257
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:262
+msgid "We do not support Bandwidths smaller than 128Kbit/s for CBQ scheduler."
+msgstr "我々は128Kbit / sのCBQスケジューラ用よりも小さい帯域幅をサポートしていません。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:300
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:300
+msgid "Upload or download bandwidth is not valid."
+msgstr "アップロードまたはダウンロードの帯域幅が有効ではありません。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:317
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:317
+#, php-format
+msgid ""
+"You cannot set the VoIP upload bandwidth on WAN connection higher than "
+"80% of the connection."
+msgstr "接続の80% 「あなたがより高いWAN接続上でのVoIPのアップロードの帯域幅を設定することはできません」 。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:324
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:334
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:324
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:334
+#, php-format
+msgid ""
+"You cannot set the VoIP download bandwidth on connection higher than 80% of "
+"the connection."
+msgstr "コネクション"あなたは80%よりも高い接続でのVoIPダウンロード帯域幅を設定することはできません」 。"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:162
+#: usr/local/www/widgets/widgets/system_information.widget.php:153
+#: usr/local/www/widgets/widgets/system_information.widget.php:159
+#: usr/local/www/widgets/widgets/system_information.widget.php:160
+#: usr/local/www/widgets/widgets/system_information.widget.php:158
+#: usr/local/www/widgets/widgets/system_information.widget.php:160
+msgid "Current date/time"
+msgstr "現在の日付/時刻"
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:41
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:41
+msgid "Computer / Device"
+msgstr "コンピュータ/デバイス"
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:67
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:67
+msgid "Wake Up"
+msgstr "目を覚ます"
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:72
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:72
+msgid "No saved WoL addresses"
+msgstr "は保存されないのWOLアドレス"
+
+#: usr/local/www/firewall_nat_npt.php:105
+#: usr/local/www/firewall_nat_npt.php:105
+msgid "External Prefix"
+msgstr "外部プレフィックス"
+
+#: usr/local/www/firewall_nat_npt.php:106
+#: usr/local/www/firewall_nat_npt.php:106
+msgid "Internal prefix"
+msgstr "内部接頭"
+
+#: usr/local/www/firewall_nat_npt_edit.php:106
+#: usr/local/www/firewall_nat_npt_edit.php:106
+msgid "Source prefix"
+msgstr "元プレフィクス"
+
+#: usr/local/www/firewall_nat_npt_edit.php:108
+#: usr/local/www/firewall_nat_npt_edit.php:108
+msgid "Destination prefix"
+msgstr "宛先プレフィックス"
+
+#: usr/local/www/firewall_nat_npt_edit.php:156
+#: usr/local/www/firewall_nat_npt_edit.php:161
+#: usr/local/www/firewall_nat_npt_edit.php:160
+#: usr/local/www/firewall_nat_npt_edit.php:158
+#: usr/local/www/firewall_nat_npt_edit.php:158
+msgid "Edit NAT NPt entry"
+msgstr "編集NAT NPTエントリー"
+
+#: usr/local/www/firewall_nat_npt_edit.php:206
+#: usr/local/www/firewall_nat_npt_edit.php:211
+#: usr/local/www/firewall_nat_npt_edit.php:210
+#: usr/local/www/firewall_nat_npt_edit.php:209
+#: usr/local/www/firewall_nat_npt_edit.php:209
+msgid "Internal IPv6 Prefix"
+msgstr "内部のIPv6プレフィックス"
+
+#: usr/local/www/firewall_nat_npt_edit.php:228
+#: usr/local/www/firewall_nat_npt_edit.php:233
+#: usr/local/www/firewall_nat_npt_edit.php:232
+#: usr/local/www/firewall_nat_npt_edit.php:231
+#: usr/local/www/firewall_nat_npt_edit.php:231
+msgid ""
+"Enter the internal (LAN) ULA IPv6 Prefix for the Network Prefix translation. "
+"The prefix size specified for the internal IPv6 prefix will be applied to "
+"the \n"
+"external prefix."
+msgstr "「ネットワークプレフィックスの翻訳のための内部( LAN) ULAのIPv6プレフィックスを入力します。 「内部IPv6プレフィックスに指定されたプレフィックスサイズが「 \n 「外部プレフィックスに適用されます。"
+
+#: usr/local/www/firewall_nat_npt_edit.php:234
+#: usr/local/www/firewall_nat_npt_edit.php:239
+#: usr/local/www/firewall_nat_npt_edit.php:238
+#: usr/local/www/firewall_nat_npt_edit.php:237
+#: usr/local/www/firewall_nat_npt_edit.php:237
+msgid "Destination IPv6 Prefix"
+msgstr "先のIPv6プレフィックス"
+
+#: usr/local/www/firewall_nat_npt_edit.php:258
+#: usr/local/www/firewall_nat_npt_edit.php:263
+#: usr/local/www/firewall_nat_npt_edit.php:262
+#: usr/local/www/firewall_nat_npt_edit.php:261
+#: usr/local/www/firewall_nat_npt_edit.php:261
+msgid "Enter the Global Unicast routable IPv6 prefix here"
+msgstr "ここでグローバルユニキャストルーティング可能なIPv6プレフィックスを入力してください"
+
+#: usr/local/www/services_dhcpv6.php:74
+#: usr/local/www/services_router_advertisements.php:74
+#: usr/local/www/services_router_advertisements.php:74
+#: usr/local/www/services_dhcpv6.php:74
+msgid ""
+"The DHCPv6 Server can only be enabled on interfaces configured with static "
+"IP addresses"
+msgstr "IPアドレスの「 DHCPv6サーバは、静的に設定されたインターフェイス上で有効にすることができます」"
+
+#: usr/local/www/services_dhcpv6.php:184 usr/local/www/services_dhcpv6.php:196
+#: usr/local/www/services_dhcpv6.php:181 usr/local/www/services_dhcpv6.php:175
+#: usr/local/www/services_dhcpv6.php:175
+msgid "A valid prefix range must be specified."
+msgstr "有効なプレフィックス範囲を指定する必要があります。"
+
+#: usr/local/www/services_dhcpv6.php:190 usr/local/www/services_dhcpv6.php:202
+#: usr/local/www/services_dhcpv6.php:187 usr/local/www/services_dhcpv6.php:181
+#: usr/local/www/services_dhcpv6.php:181
+msgid "A valid IPv6 address must be specified for the gateway."
+msgstr "有効なIPv6アドレスは、ゲートウェイを指定する必要があります。"
+
+#: usr/local/www/services_dhcpv6.php:192 usr/local/www/services_dhcpv6.php:204
+#: usr/local/www/services_router_advertisements.php:154
+#: usr/local/www/services_dhcpv6.php:189 usr/local/www/services_dhcpv6.php:183
+#: usr/local/www/services_router_advertisements.php:149
+#: usr/local/www/services_router_advertisements.php:149
+#: usr/local/www/services_dhcpv6.php:183
+msgid ""
+"A valid IPv6 address must be specified for the primary/secondary DNS servers."
+msgstr "「有効なIPv6アドレスは、プライマリ/セカンダリDNSサーバを指定する必要があります。"
+
+#: usr/local/www/services_dhcpv6.php:201 usr/local/www/services_dhcpv6.php:223
+#: usr/local/www/services_dhcpv6.php:208 usr/local/www/services_dhcpv6.php:202
+#: usr/local/www/services_dhcpv6.php:202
+msgid ""
+"A valid IPv6 address must be specified for the primary/secondary NTP servers."
+msgstr "「有効なIPv6アドレスは、プライマリ/セカンダリのNTPサーバーを指定する必要があります。"
+
+#: usr/local/www/services_dhcpv6.php:205 usr/local/www/services_dhcpv6.php:227
+#: usr/local/www/services_dhcpv6.php:212 usr/local/www/services_dhcpv6.php:206
+#: usr/local/www/services_dhcpv6.php:206
+msgid "A valid IPv6 address or hostname must be specified for the TFTP server."
+msgstr "有効なIPv6アドレスまたはホスト名は、TFTPサーバを指定する必要があります。"
+
+#: usr/local/www/services_dhcpv6.php:207 usr/local/www/services_dhcpv6.php:229
+#: usr/local/www/services_dhcpv6.php:214 usr/local/www/services_dhcpv6.php:208
+#: usr/local/www/services_dhcpv6.php:208
+msgid "A valid IPv6 address must be specified for the network boot server."
+msgstr "有効なIPv6アドレスは、ネットワークブートサーバーを指定する必要があります。"
+
+#: usr/local/www/services_dhcpv6.php:214 usr/local/www/services_dhcpv6.php:236
+#: usr/local/www/services_dhcpv6.php:221 usr/local/www/services_dhcpv6.php:215
+#: usr/local/www/services_dhcpv6.php:215
+#, php-format
+msgid "The subnet range cannot overlap with virtual IPv6 address %s."
+msgstr "サブネット範囲は、仮想IPv6アドレス%s.と重複することはできません"
+
+#: usr/local/www/services_dhcpv6.php:359 usr/local/www/services_dhcpv6.php:386
+#: usr/local/www/services_dhcpv6.php:367 usr/local/www/services_dhcpv6.php:362
+#: usr/local/www/services_dhcpv6.php:362
+msgid "DHCPv6 server"
+msgstr "DHCPv6サーバ"
+
+#: usr/local/www/services_dhcpv6.php:497 usr/local/www/services_dhcpv6.php:524
+#: usr/local/www/services_router_advertisements.php:261
+#: usr/local/www/services_router_advertisements.php:270
+#: usr/local/www/services_dhcpv6.php:503 usr/local/www/services_dhcpv6.php:514
+#: usr/local/www/services_router_advertisements.php:256
+#: usr/local/www/services_router_advertisements.php:265
+#: usr/local/www/services_router_advertisements.php:256
+#: usr/local/www/services_router_advertisements.php:265
+#: usr/local/www/services_dhcpv6.php:514
+msgid "Router Advertisements"
+msgstr "ルーター通知"
+
+#: usr/local/www/services_dhcpv6.php:504
+#, php-format
+msgid ""
+"Select the Operating Mode for the router advertisement Daemon. Use "Router "
+"Only" to only advertise the router, "Unmanaged" for Router Advertising "
+"with Stateless Autoconfig, "Managed" for DHCPv6 only with router "
+"advertisements, "Assisted" for DHCPv6 Combined with Stateless Autoconfig"
+msgstr "「ルータ広告デーモンのための動作モードを選択します。使用して「ルータ広告のための「管理対象外」 、ルータを宣伝"のみ"のみへのルータの「ステートレス自動設定で、 「管理」 DHCPv6の場合は、ルータと"広告、 DHCPv6のための「支援」ステートレス自動設定と組み合わせる"
+
+#: usr/local/www/services_dhcpv6.php:510 usr/local/www/services_dhcpv6.php:584
+#: usr/local/www/services_dhcpv6.php:515 usr/local/www/services_dhcpv6.php:526
+#: usr/local/www/services_dhcpv6.php:526
+#, php-format
+msgid "Enable DHCPv6 server on %s interface"
+msgstr "%sインターフェイス上のDHCPv6サーバを有効にする"
+
+#: usr/local/www/services_dhcpv6.php:576 usr/local/www/services_dhcpv6.php:649
+#: usr/local/www/services_dhcpv6.php:580 usr/local/www/services_dhcpv6.php:597
+#: usr/local/www/services_dhcpv6.php:597
+msgid "Prefix Delegation Range"
+msgstr "接頭委任範囲"
+
+#: usr/local/www/services_dhcpv6.php:580
+msgid "prefix length"
+msgstr "プレフィックス長"
+
+#: usr/local/www/services_dhcpv6.php:585
+msgid ""
+"You can define a Prefix range here for DHCP Prefix Delegation. This allows "
+"for \n"
+"tttttassigning networks to subrouters"
+msgstr "subroutersに\nための「 tttttassigningネットワーク」は、DHCPプレフィックス委任のためにここプレフィックス範囲を定義することができます。これが可能に」"
+
+#: usr/local/www/services_dhcpv6.php:803
+#: usr/local/www/status_dhcpv6_leases.php:361
+#: usr/local/www/status_dhcpv6_leases.php:405
+#: usr/local/www/status_dhcpv6_leases.php:483
+#: usr/local/www/services_dhcpv6.php:898
+#: usr/local/www/status_dhcpv6_leases.php:406
+#: usr/local/www/status_dhcpv6_leases.php:484
+#: usr/local/www/services_dhcpv6.php:829
+#: usr/local/www/status_dhcpv6_leases.php:409
+#: usr/local/www/status_dhcpv6_leases.php:487
+#: usr/local/www/services_dhcpv6.php:850
+#: usr/local/www/status_dhcpv6_leases.php:409
+#: usr/local/www/status_dhcpv6_leases.php:487
+#: usr/local/www/services_dhcpv6.php:850
+msgid "DUID"
+msgstr "DUID"
+
+#: usr/local/www/services_dhcpv6_edit.php:106
+#: usr/local/www/services_dhcpv6_edit.php:189
+#: usr/local/www/services_dhcpv6_edit.php:108
+#: usr/local/www/services_dhcpv6_edit.php:192
+#: usr/local/www/services_dhcpv6_edit.php:191
+#: usr/local/www/services_dhcpv6_edit.php:111
+#: usr/local/www/services_dhcpv6_edit.php:194
+#: usr/local/www/services_dhcpv6_edit.php:111
+#: usr/local/www/services_dhcpv6_edit.php:194
+msgid "DUID Identifier"
+msgstr "DUID識別子"
+
+#: usr/local/www/services_dhcpv6_edit.php:126
+#: usr/local/www/services_dhcpv6_edit.php:128
+#: usr/local/www/services_dhcpv6_edit.php:131
+#: usr/local/www/services_dhcpv6_edit.php:131
+msgid "A valid DUID Identifier must be specified."
+msgstr "有効なDUID識別子を指定する必要があります。"
+
+#: usr/local/www/services_dhcpv6_edit.php:135
+#: usr/local/www/services_dhcpv6_edit.php:137
+#: usr/local/www/services_dhcpv6_edit.php:140
+#: usr/local/www/services_dhcpv6_edit.php:140
+msgid "This Hostname, IP or DUID Identifier already exists."
+msgstr "このホスト名は、 IPまたはDUID識別子はすでに存在しています。"
+
+#: usr/local/www/services_dhcpv6_edit.php:172
+#: usr/local/www/services_dhcpv6_edit.php:175
+#: usr/local/www/services_dhcpv6_edit.php:178
+#: usr/local/www/services_dhcpv6_edit.php:178
+msgid "DHCPv6"
+msgstr "DHCPv6の"
+
+#: usr/local/www/services_dhcpv6_edit.php:186
+#: usr/local/www/services_dhcpv6_edit.php:189
+#: usr/local/www/services_dhcpv6_edit.php:188
+#: usr/local/www/services_dhcpv6_edit.php:191
+#: usr/local/www/services_dhcpv6_edit.php:191
+msgid "Static DHCPv6 Mapping"
+msgstr "静的DHCPv6のマッピング"
+
+#: usr/local/www/services_dhcpv6_edit.php:193
+#: usr/local/www/services_dhcpv6_edit.php:196
+#: usr/local/www/services_dhcpv6_edit.php:195
+#: usr/local/www/services_dhcpv6_edit.php:198
+#: usr/local/www/services_dhcpv6_edit.php:198
+msgid "Enter a DUID Identifier in the following format: "
+msgstr "次の形式でDUID識別子を入力してください:"
+
+#: usr/local/www/services_dhcpv6_edit.php:202
+#: usr/local/www/services_dhcpv6_edit.php:205
+msgid ""
+"If no IPv6 address is given, one will be dynamically allocated from the "
+"pool."
+msgstr "プール」は、IPv6アドレスが指定されていない場合、 1が動的に割り当てられます」 。"
+
+#: usr/local/www/services_dhcpv6_relay.php:81
+#: usr/local/www/services_dhcpv6_relay.php:81
+msgid "A valid Destination Server IPv6 address must be specified."
+msgstr "有効な宛先サーバのIPv6アドレスを指定する必要があります。"
+
+#: usr/local/www/services_dhcpv6_relay.php:145
+#: usr/local/www/services_dhcpv6_relay.php:146
+#: usr/local/www/services_dhcpv6_relay.php:146
+msgid "DHCPv6 Relay configuration"
+msgstr "DHCPv6リレーの設定"
+
+#: usr/local/www/services_dhcpv6_relay.php:151
+#: usr/local/www/services_dhcpv6_relay.php:152
+#: usr/local/www/services_dhcpv6_relay.php:152
+#, php-format
+msgid "Enable DHCPv6 relay on interface"
+msgstr "インターフェイス上のDHCPv6リレーを有効にする"
+
+#: usr/local/www/services_dhcpv6_relay.php:169
+#: usr/local/www/services_dhcpv6_relay.php:170
+#: usr/local/www/services_dhcpv6_relay.php:170
+msgid "Interfaces without an IPv6 address will not be shown."
+msgstr "IPv6アドレスのないインターフェースは表示されません。"
+
+#: usr/local/www/services_dhcpv6_relay.php:177
+#: usr/local/www/services_dhcpv6_relay.php:178
+#: usr/local/www/services_dhcpv6_relay.php:178
+#, php-format
+msgid ""
+"If this is checked, the DHCPv6 relay will append the circuit ID (%s "
+"interface number) and the agent ID to the DHCPv6 request."
+msgstr "DHCPv6の要求に「 (インターフェイス番号とエージェントIDチェックすると、 DHCPv6リレーは回線ID %s )を追加します」 。"
+
+#: usr/local/www/services_dhcpv6_relay.php:184
+#: usr/local/www/services_dhcpv6_relay.php:185
+#: usr/local/www/services_dhcpv6_relay.php:185
+msgid ""
+"This is the IPv6 address of the server to which DHCPv6 requests are relayed. "
+"You can enter multiple server IPv6 addresses, separated by commas. Select "
+""Proxy requests to DHCPv6 server on WAN subnet" to relay DHCPv6 packets to "
+"the server that was used on the WAN interface."
+msgstr "「これは、DHCPv6要求が中継されるようにサーバのIPv6アドレスです。 "あなたはカンマで区切って複数のサーバのIPv6アドレスを入力することができます。 「 WANインターフェイス上で使用された「サーバへのDHCPv6パケットを中継する「WANサブネット上のDHCPv6サーバへのプロキシの要求」を選択します。"
+
+#: usr/local/www/status_dhcpv6_leases.php:49
+#: usr/local/www/status_dhcpv6_leases.php:50
+#: usr/local/www/status_dhcpv6_leases.php:50
+msgid "DHCPv6 leases"
+msgstr "DHCPv6のリース"
+
+#: usr/local/www/status_dhcpv6_leases.php:360
+#: usr/local/www/status_dhcpv6_leases.php:404
+#: usr/local/www/status_dhcpv6_leases.php:482
+#: usr/local/www/status_dhcpv6_leases.php:405
+#: usr/local/www/status_dhcpv6_leases.php:483
+#: usr/local/www/status_dhcpv6_leases.php:408
+#: usr/local/www/status_dhcpv6_leases.php:486
+#: usr/local/www/status_dhcpv6_leases.php:408
+#: usr/local/www/status_dhcpv6_leases.php:486
+msgid "IAID"
+msgstr "IAID"
+
+#: usr/local/www/status_dhcpv6_leases.php:362
+#: usr/local/www/status_dhcpv6_leases.php:406
+#: usr/local/www/status_dhcpv6_leases.php:407
+#: usr/local/www/status_dhcpv6_leases.php:410
+#: usr/local/www/status_dhcpv6_leases.php:410
+msgid "Hostname/MAC"
+msgstr "ホスト名/ MAC"
+
+#: usr/local/www/diag_logs_wireless.php:88
+#: usr/local/www/diag_logs_wireless.php:99
+#: usr/local/www/diag_logs_wireless.php:100
+#: usr/local/www/diag_logs_wireless.php:100
+#, php-format
+msgid "Wireless (hostapd) log entries"
+msgstr "ワイヤレス( hostapdの)ログエントリ"
+
+#: usr/local/www/services_captiveportal_zones.php:37
+#: usr/local/www/services_captiveportal_zones.php:37
+msgid "Captive Portal"
+msgstr "Captive Portal"
+
+#: usr/local/www/services_captiveportal_zones.php:37
+#: usr/local/www/services_captiveportal_zones.php:37
+msgid "Zones"
+msgstr "ゾーン"
+
+#: usr/local/www/services_captiveportal_zones.php:47
+#: usr/local/www/services_captiveportal_zones.php:48
+#: usr/local/www/services_captiveportal_zones.php:48
+msgid "The CaptivePortal entry list has been changed"
+msgstr "CaptivePortalのエントリーリストが変更されました"
+
+#: usr/local/www/services_captiveportal_zones.php:60
+#: usr/local/www/services_captiveportal_zones.php:101
+#: usr/local/www/services_captiveportal_zones.php:61
+#: usr/local/www/services_captiveportal_zones.php:102
+#: usr/local/www/services_captiveportal_zones.php:61
+#: usr/local/www/services_captiveportal_zones.php:102
+msgid "add a new captiveportal instance"
+msgstr "新しいcaptiveportalインスタンスを追加"
+
+#: usr/local/www/services_captiveportal_zones.php:88
+#: usr/local/www/services_captiveportal_zones.php:89
+#: usr/local/www/services_captiveportal_zones.php:89
+msgid "edit captiveportal instance"
+msgstr "captiveportalインスタンスを編集"
+
+#: usr/local/www/services_captiveportal_zones.php:89
+#: usr/local/www/services_captiveportal_zones.php:90
+#: usr/local/www/services_captiveportal_zones.php:90
+msgid "delete captiveportal instance"
+msgstr "captiveportalインスタンスを削除"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:48
+#: usr/local/www/services_captiveportal_zones_edit.php:45
+#: usr/local/www/services_captiveportal_zones_edit.php:45
+msgid "Edit Zones"
+msgstr "編集ゾーン"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:67
+#: usr/local/www/services_captiveportal_zones_edit.php:69
+#: usr/local/www/services_captiveportal_zones_edit.php:69
+msgid "already exists"
+msgstr "すでに存在しています"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:96
+#: usr/local/www/services_captiveportal_zones_edit.php:98
+#: usr/local/www/services_captiveportal_zones_edit.php:94
+#: usr/local/www/services_captiveportal_zones_edit.php:94
+msgid "Edit Captive Portal Zones"
+msgstr "編集Captive Portalゾーン"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:103
+msgid "Zone name. Cannot contain spaces."
+msgstr "ゾーン名。スペースを含めることはできません。"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:104
+#: usr/local/www/system_firmware_restorefullbackup.php:104
+msgid "Restore full backup"
+msgstr "フルバックアップを復元"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:139
+#: usr/local/www/system_firmware_restorefullbackup.php:139
+msgid "Filename"
+msgstr "ファイル名"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:162
+#: usr/local/www/system_firmware_restorefullbackup.php:162
+msgid "Do you really want to delete this backup?"
+msgstr "あなたは本当にこのバックアップを削除しますか?"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:174
+msgid "<center>Could not locate any previous backups.</center>"
+msgstr "u003cCENTERu003eは以前のバックアップが見つかりませんでした。 u003c /センターu003e"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:184
+#: usr/local/www/system_firmware_restorefullbackup.php:184
+msgid "Restore"
+msgstr "復元する"
+
+#: usr/local/www/diag_dump_states_sources.php:65
+#: usr/local/www/diag_dump_states_sources.php:65
+msgid "Show Source Tracking"
+msgstr "表示するソースの追跡"
+
+#: usr/local/www/diag_dump_states_sources.php:145
+#: usr/local/www/diag_dump_states_sources.php:144
+#: usr/local/www/diag_dump_states_sources.php:144
+msgid "Source -> Destination"
+msgstr "ソース - u003eすべての市町村"
+
+#: usr/local/www/diag_dump_states_sources.php:146
+#: usr/local/www/diag_dump_states_sources.php:145
+#: usr/local/www/diag_dump_states_sources.php:145
+msgid "# States"
+msgstr ""
+
+#: usr/local/www/diag_dump_states_sources.php:147
+#: usr/local/www/diag_dump_states_sources.php:146
+#: usr/local/www/diag_dump_states_sources.php:146
+msgid "# Connections"
+msgstr ""
+
+#: usr/local/www/diag_dump_states_sources.php:180
+#: usr/local/www/diag_dump_states_sources.php:179
+#: usr/local/www/diag_dump_states_sources.php:179
+msgid "Remove all source tracking entries from"
+msgstr "からすべてのソースの追跡エントリを削除"
+
+#: usr/local/www/diag_dump_states_sources.php:190
+#: usr/local/www/diag_dump_states_sources.php:189
+#: usr/local/www/diag_dump_states_sources.php:189
+msgid "No source tracking entries were found."
+msgstr "ソースなしの追跡エントリが見つかりませんでした。"
+
+#: etc/inc/system.inc:418 etc/inc/system.inc:425 etc/inc/system.inc:426
+#, php-format
+msgid "Not adding default route because OLSR dynamic gateway is enabled."
+msgstr "OLSRダイナミックゲートウェイが有効になっているため、デフォルトルートを追加しない。"
+
+#: etc/inc/priv.defs.inc:118 etc/inc/priv.defs.inc:124
+#: etc/inc/priv.defs.inc:124
+msgid "WebCfg - Diagnostics: Logs: Gateways page"
+msgstr "WebCfg - 診断:ログ:ゲートウェイページ"
+
+#: etc/inc/priv.defs.inc:119 etc/inc/priv.defs.inc:125
+#: etc/inc/priv.defs.inc:125
+msgid "Allow access to the 'Diagnostics: Logs: System: Gateways' page."
+msgstr "ページ' :ログ:システムゲートウェイ診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:124 etc/inc/priv.defs.inc:130
+#: etc/inc/priv.defs.inc:130
+msgid "WebCfg - Diagnostics: Logs: Resolver page"
+msgstr "WebCfg - 診断:ログ:レゾルバページ"
+
+#: etc/inc/priv.defs.inc:125 etc/inc/priv.defs.inc:131
+#: etc/inc/priv.defs.inc:131
+msgid "Allow access to the 'Diagnostics: Logs: System: Resolver' page."
+msgstr "ページ' :ログ:システムリゾルバ診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:130 etc/inc/priv.defs.inc:136
+#: etc/inc/priv.defs.inc:136
+msgid "WebCfg - Diagnostics: Logs: Wireless page"
+msgstr "WebCfg - 診断:ログ:ワイヤレスページ"
+
+#: etc/inc/priv.defs.inc:131 etc/inc/priv.defs.inc:137
+#: etc/inc/priv.defs.inc:137
+msgid "Allow access to the 'Diagnostics: Logs: System: Wireless' page."
+msgstr "ページ' :ログ:システムワイヤレス診断」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:148 etc/inc/priv.defs.inc:154
+#: etc/inc/priv.defs.inc:154
+msgid "WebCfg - Status: System logs: NTP page"
+msgstr "WebCfg - ステータス:システムログ: NTPのページ"
+
+#: etc/inc/priv.defs.inc:149 etc/inc/priv.defs.inc:155
+#: etc/inc/priv.defs.inc:155
+msgid "Allow access to the 'Status: System logs: NTP' page."
+msgstr "ページ':システムログのNTPステータス'へのアクセスを許可します。"
+
+#: etc/inc/pfsense-utils.inc:2377 etc/inc/pfsense-utils.inc:2468
+#: etc/inc/pfsense-utils.inc:2521 etc/inc/pfsense-utils.inc:2528
+#: etc/inc/pfsense-utils.inc:2535 etc/inc/pfsense-utils.inc:2539
+#: etc/inc/pfsense-utils.inc:2581
+msgid "English"
+msgstr "英語"
+
+#: etc/inc/pfsense-utils.inc:2378 etc/inc/pfsense-utils.inc:2469
+#: etc/inc/pfsense-utils.inc:2522 etc/inc/pfsense-utils.inc:2529
+#: etc/inc/pfsense-utils.inc:2536 etc/inc/pfsense-utils.inc:2540
+#: etc/inc/pfsense-utils.inc:2593
+msgid "Portuguese (Brazil)"
+msgstr "ポルトガル語(ブラジル)"
+
+#: etc/inc/interfaces.inc:251 etc/inc/interfaces.inc:250
+#: etc/inc/interfaces.inc:248 etc/inc/interfaces.inc:248
+msgid "interface_vlan_configure called with if undefined."
+msgstr "interface_vlan_configureに定義されていない場合に呼び出される。"
+
+#: etc/inc/interfaces.inc:292 etc/inc/interfaces.inc:291
+#: etc/inc/interfaces.inc:289 etc/inc/interfaces.inc:289
+#, php-format
+msgid "interface_qinq_configure called with if undefined.%s"
+msgstr "interface_qinq_configureで呼び出された場合undefined.%s"
+
+#: etc/inc/interfaces.inc:377 etc/inc/interfaces.inc:376
+#: etc/inc/interfaces.inc:380 etc/inc/interfaces.inc:380
+#, php-format
+msgid "interface_qinq2_configure called with if undefined.%s"
+msgstr "interface_qinq2_configureで呼び出された場合undefined.%s"
+
+#: etc/inc/interfaces.inc:2152
+#, php-format
+msgid ""
+"Error: cannot open dhclient_%s.conf in interface_carpdev_configure() for "
+"writing.%s"
+msgstr "writing.%s : 「エラーのためinterface_carpdev_configure.()にdhclient_%s.conf開くことができません」"
+
+#: etc/inc/interfaces.inc:2995
+msgid "Could not bring wanif up in interface_carpdev_dhcp_configure()"
+msgstr "interface_carpdev_dhcp_configure.()にwanifを持ち出すことができませんでした"
+
+#: etc/inc/interfaces.inc:3500 etc/inc/interfaces.inc:3360
+#: etc/inc/interfaces.inc:3453 etc/inc/interfaces.inc:3580
+#: etc/inc/interfaces.inc:3525 etc/inc/interfaces.inc:3525
+#, php-format
+msgid ""
+"Error: cannot open dhclient_%s.conf in interface_dhcp_configure() for "
+"writing.%s"
+msgstr "writing.%s : 「エラーのためinterface_dhcp_configure.()にdhclient_%s.conf開くことができません」"
+
+#: etc/inc/services.inc:1085 etc/inc/services.inc:1217
+#: etc/inc/services.inc:1211 etc/inc/services.inc:1218
+#: etc/inc/services.inc:1270
+msgid "Started IGMP proxy service."
+msgstr "はじめに、IGMPプロキシサービス。"
+
+#: usr/local/www/diag_logs_routing.php:74
+#: usr/local/www/diag_logs_settings.php:224 usr/local/www/fbegin.inc:148
+#: usr/local/www/fbegin.inc:183 usr/local/www/diag_logs_relayd.php:75
+#: usr/local/www/diag_logs_auth.php:74 usr/local/www/diag_logs_ipsec.php:111
+#: usr/local/www/diag_logs_vpn.php:135 usr/local/www/diag_logs_ppp.php:79
+#: usr/local/www/diag_logs_resolver.php:87 usr/local/www/diag_logs_ntpd.php:54
+#: usr/local/www/diag_logs_ntpd.php:74 usr/local/www/diag_logs.php:86
+#: usr/local/www/status_ntpd.php:94 usr/local/www/diag_logs_dhcp.php:79
+#: usr/local/www/diag_logs_wireless.php:76
+#: usr/local/www/diag_logs_filter_summary.php:193
+#: usr/local/www/services_ntpd.php:71 usr/local/www/diag_logs_gateways.php:87
+#: usr/local/www/diag_logs_openvpn.php:78
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_filter.php:110
+#: usr/local/www/diag_logs_routing.php:75
+#: usr/local/www/diag_logs_settings.php:231 usr/local/www/fbegin.inc:157
+#: usr/local/www/fbegin.inc:191 usr/local/www/diag_logs_relayd.php:76
+#: usr/local/www/diag_logs_auth.php:75 usr/local/www/diag_logs_ipsec.php:112
+#: usr/local/www/diag_logs_resolver.php:88 usr/local/www/diag_logs_ntpd.php:75
+#: usr/local/www/status_ntpd.php:109 usr/local/www/diag_logs_dhcp.php:80
+#: usr/local/www/diag_logs_wireless.php:77
+#: usr/local/www/diag_logs_filter_summary.php:194
+#: usr/local/www/services_ntpd.php:76 usr/local/www/diag_logs_gateways.php:88
+#: usr/local/www/diag_logs_openvpn.php:79
+#: usr/local/www/diag_logs_filter_dynamic.php:108
+#: usr/local/www/diag_logs_filter.php:100
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: usr/local/www/diag_logs_ppp.php:77 usr/local/www/fbegin.inc:149
+#: usr/local/www/fbegin.inc:182 usr/local/www/diag_logs_filter.php:130
+#: usr/local/www/status_ntpd.php:115 usr/local/www/diag_logs_auth.php:75
+#: usr/local/www/diag_logs_settings.php:231
+#: usr/local/www/diag_logs_filter.php:130
+#: usr/local/www/diag_logs_routing.php:75 usr/local/www/diag_logs_dhcp.php:80
+#: usr/local/www/services_ntpd.php:76 usr/local/www/diag_logs.php:86
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: usr/local/www/diag_logs_ntpd.php:54 usr/local/www/diag_logs_ntpd.php:75
+#: usr/local/www/diag_logs_openvpn.php:79 usr/local/www/diag_logs_ppp.php:77
+#: usr/local/www/status_ntpd.php:115 usr/local/www/diag_logs_gateways.php:88
+#: usr/local/www/fbegin.inc:149 usr/local/www/fbegin.inc:182
+#: usr/local/www/diag_logs_relayd.php:76 usr/local/www/diag_logs_vpn.php:135
+#: usr/local/www/diag_logs_ipsec.php:112
+#: usr/local/www/diag_logs_wireless.php:77
+#: usr/local/www/diag_logs_resolver.php:88
+#: usr/local/www/diag_logs_filter_summary.php:194
+msgid "NTP"
+msgstr "NTP"
+
+#: usr/local/www/diag_logs_routing.php:82
+#: usr/local/www/diag_logs_resolver.php:96 usr/local/www/diag_logs.php:65
+#: usr/local/www/diag_logs.php:95 usr/local/www/diag_logs_wireless.php:84
+#: usr/local/www/diag_logs_gateways.php:96
+#: usr/local/www/diag_logs_routing.php:83
+#: usr/local/www/diag_logs_resolver.php:97
+#: usr/local/www/diag_logs_wireless.php:85
+#: usr/local/www/diag_logs_gateways.php:97
+#: usr/local/www/diag_logs_routing.php:83 usr/local/www/diag_logs.php:65
+#: usr/local/www/diag_logs.php:95 usr/local/www/diag_logs_gateways.php:97
+#: usr/local/www/diag_logs_wireless.php:85
+#: usr/local/www/diag_logs_resolver.php:97
+msgid "General"
+msgstr "一般"
+
+#: usr/local/www/diag_logs_routing.php:85
+#: usr/local/www/diag_logs_resolver.php:66
+#: usr/local/www/diag_logs_resolver.php:99 usr/local/www/diag_logs.php:98
+#: usr/local/www/diag_logs_wireless.php:87
+#: usr/local/www/diag_logs_gateways.php:99
+#: usr/local/www/diag_logs_routing.php:86
+#: usr/local/www/diag_logs_resolver.php:100
+#: usr/local/www/diag_logs_wireless.php:88
+#: usr/local/www/diag_logs_gateways.php:100
+#: usr/local/www/diag_logs_routing.php:86 usr/local/www/diag_logs.php:98
+#: usr/local/www/diag_logs_gateways.php:100
+#: usr/local/www/diag_logs_wireless.php:88
+#: usr/local/www/diag_logs_resolver.php:66
+#: usr/local/www/diag_logs_resolver.php:100
+msgid "Resolver"
+msgstr "リゾルバ"
+
+#: usr/local/www/diag_logs_routing.php:97
+#: usr/local/www/diag_logs_routing.php:98
+#: usr/local/www/diag_logs_routing.php:98
+#, php-format
+msgid "Routing daemon log entries"
+msgstr "デーモンログエントリをルーティング"
+
+#: usr/local/www/system_routes_edit.php:158
+#: usr/local/www/system_routes_edit.php:169
+#: usr/local/www/system_routes_edit.php:171
+#: usr/local/www/system_routes_edit.php:165
+msgid "A route to these destination networks already exists"
+msgstr "これらの宛先ネットワークへのルートがすでに存在しています"
+
+#: usr/local/www/system_routes_edit.php:302
+#: usr/local/www/system_routes_edit.php:303
+#: usr/local/www/system_routes_edit.php:326
+#: usr/local/www/system_routes_edit.php:335
+#: usr/local/www/system_routes_edit.php:329
+msgid "Disable this static route"
+msgstr "このスタティックルートを無効にする"
+
+#: usr/local/www/system_routes_edit.php:303
+#: usr/local/www/system_routes_edit.php:304
+#: usr/local/www/system_routes_edit.php:327
+#: usr/local/www/system_routes_edit.php:336
+#: usr/local/www/system_routes_edit.php:330
+msgid ""
+"Set this option to disable this static route without removing it from the "
+"list."
+msgstr "リスト」から削除せずに、このスタティックルートを無効にするには、このオプションを設定する」 。"
+
+#: usr/local/www/pkg_mgr.php:185 usr/local/www/pkg_mgr_installed.php:178
+#: usr/local/www/pkg_mgr_installed.php:180 usr/local/www/pkg_mgr.php:188
+#: usr/local/www/pkg_mgr_installed.php:180 usr/local/www/pkg_mgr.php:205
+msgid "Package info"
+msgstr "パッケージ情報"
+
+#: usr/local/www/pkg_mgr.php:189 usr/local/www/pkg_mgr_installed.php:182
+#: usr/local/www/pkg_mgr_installed.php:184 usr/local/www/pkg_mgr.php:192
+#: usr/local/www/pkg_mgr_installed.php:184 usr/local/www/pkg_mgr.php:208
+msgid "No package info, check the forum"
+msgstr "いいえパッケージ情報は、フォーラムをチェックしていません"
+
+#: usr/local/www/pkg_mgr.php:193
+msgid "Click on package name to access it's website."
+msgstr "それは、ウェブサイトのアクセスするために、パッケージ名をクリックします。"
+
+#: usr/local/www/pkg_mgr.php:217 usr/local/www/pkg_mgr.php:220
+#: usr/local/www/pkg_mgr.php:223
+msgid "Click "
+msgstr "クリック"
+
+#: usr/local/www/pkg_mgr.php:232 usr/local/www/pkg_mgr_installed.php:199
+#: usr/local/www/pkg_mgr_installed.php:201 usr/local/www/pkg_mgr.php:235
+#: usr/local/www/pkg_mgr_installed.php:201 usr/local/www/pkg_mgr.php:239
+msgid "Click package info for more details about "
+msgstr "の詳細については、パッケージ情報]をクリックします "
+
+#: usr/local/www/pkg_mgr.php:237 usr/local/www/pkg_mgr.php:240
+#: usr/local/www/pkg_mgr.php:243 usr/local/www/pkg_mgr.php:247
+msgid "Do you really want to install "
+msgstr "あなたが本当にインストールしますか"
+
+#: usr/local/www/pkg_mgr.php:237 usr/local/www/pkg_mgr.php:240
+#: usr/local/www/pkg_mgr.php:243 usr/local/www/pkg_mgr.php:247
+msgid "Install "
+msgstr "インストール"
+
+#: usr/local/www/services_unbound_acls.php:57
+msgid "Access List successfully deleted"
+msgstr "正常に削除アクセスリスト"
+
+#: usr/local/www/services_unbound_acls.php:173
+msgid ""
+"The settings for the DNS Resolver have changed. You must apply the "
+"configuration to take affect."
+msgstr "「 DNSリゾルバの設定が変更されています。あなたが適用しなければなりません"有効にするに設定を。"
+
+#: usr/local/www/services_unbound_acls.php:181
+msgid "General Settings"
+msgstr "一般設定"
+
+#: usr/local/www/services_unbound_acls.php:182
+#: usr/local/www/services_unbound.php:137
+#: usr/local/www/services_unbound_advanced.php:124
+msgid "Advanced settings"
+msgstr "[詳細設定]"
+
+#: usr/local/www/services_unbound_acls.php:183
+#: usr/local/www/services_unbound.php:138
+#: usr/local/www/services_unbound_advanced.php:125
+msgid "Access Lists"
+msgstr "アクセスリスト"
+
+#: usr/local/www/services_unbound_acls.php:200
+#, php-format
+msgid "%s Access List"
+msgstr "%sアクセスリスト"
+
+#: usr/local/www/services_unbound_acls.php:203
+msgid "Access List name"
+msgstr "アクセスリスト名"
+
+#: usr/local/www/services_unbound_acls.php:207
+msgid "Provide an Access List name."
+msgstr "アクセスリスト名を指定します。"
+
+#: usr/local/www/services_unbound_acls.php:222
+msgid ""
+"Choose what to do with DNS requests that match the criteria specified below."
+msgstr "「下の指定された条件に一致するDNS要求をどうするかを選択します。"
+
+#: usr/local/www/services_unbound_acls.php:223
+msgid ""
+"<b>Deny:</b> This action stops queries from hosts within the netblock "
+"defined below."
+msgstr "「拒否u003cbu003eキーワード: u003c/ B u003eこのアクションは、ネットブロック内のホストからのクエリを停止し、「以下に定義する。"
+
+#: usr/local/www/services_unbound_acls.php:224
+msgid ""
+"<b>Refuse:</b> This action also stops queries from hosts within the netblock "
+"defined below, but sends a DNS rcode REFUSED error message back to the "
+"client."
+msgstr "「拒否u003cbu003eキーワード: u003c/ B u003eこのアクションには、ネットブロック内のホストからのクエリを停止し、「以下に定義しますが、 DNSのRCODEが戻って「クライアントにエラーメッセージが拒否送信します。"
+
+#: usr/local/www/services_unbound_acls.php:225
+msgid ""
+"<b>Allow:</b> This action allows queries from hosts within the netblock "
+"defined below."
+msgstr "「許可u003cbu003eキーワード: u003c/ B u003eこのアクションは、ネットブロック内のホストからの照会ができます」以下に定義。"
+
+#: usr/local/www/services_unbound_acls.php:226
+msgid ""
+"<b>Allow Snoop:</b> This action allows recursive and nonrecursive access "
+"from hosts within the netblock defined below. Used for cache snooping and "
+"ideally should only be configured for your administrative host."
+msgstr "「許可u003cbu003eキーワードのスヌープ: u003c/ B u003eこのアクションは、再帰と非再帰アクセス可能にする」以下に定義ネットブロック内のホストを購入する。キャッシュスヌーピングのために使用し、 「理想的にのみ管理者のホスト用に構成する必要があります。"
+
+#: usr/local/www/services_unbound_acls.php:231
+msgid "Networks"
+msgstr "ネットワークス"
+
+#: usr/local/www/services_unbound_acls.php:317
+msgid "Access List Name"
+msgstr "アクセスリスト名"
+
+#: usr/local/www/services_unbound_acls.php:340
+msgid "edit access list"
+msgstr "編集アクセスリスト"
+
+#: usr/local/www/services_unbound_acls.php:343
+msgid "Do you really want to delete this access list?"
+msgstr "あなたは本当にこのアクセスリストを削除しますか?"
+
+#: usr/local/www/services_unbound_acls.php:344
+msgid "delete access list"
+msgstr "アクセスリストを削除する"
+
+#: usr/local/www/services_unbound_acls.php:357
+msgid "Add new Access List"
+msgstr "新しいアクセスリストを追加"
+
+#: usr/local/www/services_unbound_acls.php:364
+msgid "Access Lists to control access to the DNS Resolver can be defined here."
+msgstr "DNSリゾルバへのアクセスを制御するアクセスリストは、ここで定義することができます。"
+
+#: usr/local/www/diag_logs_settings.php:86
+#: usr/local/www/diag_logs_settings.php:87
+#: usr/local/www/diag_logs_settings.php:87
+msgid ""
+"A valid IP address/hosname or IP/hostname:port must be specified for remote "
+"syslog server #1."
+msgstr "syslogサーバ: 「有効なIPアドレス/ hosnameまたはIP /ホスト名、ポート、リモートのために指定しなければなりません」"
+
+#: usr/local/www/diag_logs_settings.php:89
+#: usr/local/www/diag_logs_settings.php:90
+#: usr/local/www/diag_logs_settings.php:90
+msgid ""
+"A valid IP address/hosname or IP/hostname:port must be specified for remote "
+"syslog server #2."
+msgstr "syslogサーバ: 「有効なIPアドレス/ hosnameまたはIP /ホスト名、ポート、リモートのために指定しなければなりません」"
+
+#: usr/local/www/diag_logs_settings.php:92
+#: usr/local/www/diag_logs_settings.php:93
+#: usr/local/www/diag_logs_settings.php:93
+msgid ""
+"A valid IP address/hosname or IP/hostname:port must be specified for remote "
+"syslog server #3."
+msgstr "syslogサーバ: 「有効なIPアドレス/ hosnameまたはIP /ホスト名、ポート、リモートのために指定しなければなりません」"
+
+#: usr/local/www/diag_logs_settings.php:234
+#: usr/local/www/diag_logs_settings.php:241
+#: usr/local/www/diag_logs_settings.php:241
+msgid "General Logging Options"
+msgstr "一般的なログオプション"
+
+#: usr/local/www/diag_logs_settings.php:245
+#: usr/local/www/diag_logs_settings.php:252
+#: usr/local/www/diag_logs_settings.php:252
+msgid ""
+"Hint: This is only the number of log entries displayed in the GUI. It does "
+"not affect how many entries are contained in the actual log files."
+msgstr ""ヒント:これは、 GUIに表示するログエントリの数だけでそれがない。 」は、実際のログファイルに含まれているエントリの数には影響しません。"
+
+#: usr/local/www/diag_logs_settings.php:251
+#: usr/local/www/diag_logs_settings.php:258
+#: usr/local/www/diag_logs_settings.php:258
+msgid ""
+"Hint: packets that are blocked by the implicit default block rule will not "
+"be logged if you uncheck this option. Per-rule logging options are still "
+"respected."
+msgstr ""ヒント:暗黙のデフォルトのブロックルールによってブロックされたパケットがない」このオプションをオフにした場合記録される。ルールごとのログ記録オプションは、依然として「尊重されている。"
+
+#: usr/local/www/diag_logs_settings.php:259
+#: usr/local/www/diag_logs_settings.php:266
+#: usr/local/www/diag_logs_settings.php:266
+msgid ""
+"Hint: If this is checked, filter logs are shown as generated by the packet "
+"filter, without any formatting. This will reveal more detailed information, "
+"but it is more difficult to read."
+msgstr ""ヒント:これをチェックすると、パケットによって生成されるように、フィルタログが表示されます"をフォーマットせずに、フィルタ。これは、より詳細な情報を明らかにする」が、それは読むことが困難である。"
+
+#: usr/local/www/diag_logs_settings.php:265
+#: usr/local/www/diag_logs_settings.php:285
+#: usr/local/www/diag_logs_settings.php:285
+msgid "Disable writing log files to the local disk"
+msgstr "ローカルディスクへの書き込みのログファイルを無効にする"
+
+#: usr/local/www/diag_logs_settings.php:274
+#: usr/local/www/diag_logs_settings.php:294
+#: usr/local/www/diag_logs_settings.php:294
+msgid "Remote Logging Options"
+msgstr "リモートロギングオプション"
+
+#: usr/local/www/diag_logs_settings.php:277
+#: usr/local/www/diag_logs_settings.php:297
+#: usr/local/www/diag_logs_settings.php:297
+msgid "Enable Remote Logging"
+msgstr "リモートロギングを有効にする"
+
+#: usr/local/www/diag_logs_settings.php:279
+#: usr/local/www/diag_logs_settings.php:299
+#: usr/local/www/diag_logs_settings.php:299
+msgid "Send log messages to remote syslog server"
+msgstr "リモートsyslogサーバにログメッセージを送信"
+
+#: usr/local/www/diag_logs_settings.php:282
+#: usr/local/www/diag_logs_settings.php:302
+#: usr/local/www/diag_logs_settings.php:302
+msgid "Remote Syslog Servers"
+msgstr "リモートsyslogサーバ"
+
+#: usr/local/www/diag_logs_settings.php:299
+#: usr/local/www/diag_logs_settings.php:319
+#: usr/local/www/diag_logs_settings.php:319
+msgid "IP addresses of remote syslog servers, or an IP:port."
+msgstr "リモートsyslogサーバ、またはIPのIPアドレス:ポート。"
+
+#: usr/local/www/diag_logs_settings.php:304
+#: usr/local/www/diag_logs_settings.php:324
+#: usr/local/www/diag_logs_settings.php:324
+msgid "Remote Syslog Contents"
+msgstr "リモートsyslogの内容"
+
+#: usr/local/www/diag_logs_settings.php:334
+#: usr/local/www/diag_logs_settings.php:354
+#: usr/local/www/diag_logs_settings.php:354
+msgid ""
+"syslog sends UDP datagrams to port 514 on the specified remote syslog "
+"server, unless another port is specified. Be sure to set syslogd on the "
+"remote server to accept syslog messages from"
+msgstr "別のポートを指定しない限り、サーバ「 syslogが指定されたリモートのsyslogのポート514にUDPデータグラムを送信します」 。からのsyslogメッセージを受け入れるために「リモートサーバ上のsyslogd設定してください"
+
+#: usr/local/www/system_gateway_groups_edit.php:229
+#: usr/local/www/system_gateway_groups_edit.php:289
+#: usr/local/www/system_gateway_groups_edit.php:293
+#: usr/local/www/system_gateway_groups_edit.php:293
+msgid "Interface Address"
+msgstr "インターフェース·アドレス"
+
+#: usr/local/www/system_gateway_groups_edit.php:253
+#: usr/local/www/system_gateway_groups_edit.php:313
+msgid ""
+"The virtual IP field selects what (virtual) IP should be used when this "
+"group applies to a local Dyndns, IPsec or openvpn endpoint"
+msgstr "グループローカルDynDNSの、 IPsecやOpenVPNのエンドポイントに適用され、「仮想IPフィールドは、これがとき(仮想) IPが使用すべきか選択""
+
+#: usr/local/www/services_dyndns_edit.php:102
+#: usr/local/www/services_dyndns_edit.php:322
+#: usr/local/www/services_dyndns_edit.php:326
+#: usr/local/www/services_dyndns_edit.php:103
+#: usr/local/www/services_dyndns_edit.php:334
+#: usr/local/www/services_dyndns_edit.php:103
+#: usr/local/www/services_dyndns_edit.php:334
+msgid "Update URL"
+msgstr "更新URL"
+
+#: usr/local/www/services_dyndns_edit.php:254
+#: usr/local/www/services_dyndns_edit.php:258
+#: usr/local/www/services_dyndns_edit.php:260
+#: usr/local/www/services_dyndns_edit.php:260
+msgid "Interface to send update from"
+msgstr "から更新を送信するためのインタフェース"
+
+#: usr/local/www/services_dyndns_edit.php:262
+#: usr/local/www/services_dyndns_edit.php:266
+#: usr/local/www/services_dyndns_edit.php:268
+#: usr/local/www/services_dyndns_edit.php:268
+msgid "Note: This is almost always the same as the Interface to Monitor."
+msgstr "注意:これはほとんどの場合、モニターへのインターフェースと同じです。"
+
+#: usr/local/www/services_dyndns_edit.php:299
+#: usr/local/www/services_dyndns_edit.php:303
+#: usr/local/www/services_dyndns_edit.php:311
+#: usr/local/www/services_dyndns_edit.php:311
+msgid ""
+"Username is required for all types except Namecheap, FreeDNS and Custom "
+"Entries."
+msgstr "エントリ"ユーザー名はNamecheap 、 FreeDNSとカスタムを除くすべてのタイプのために必要とされる」 。"
+
+#: usr/local/www/services_dyndns_edit.php:300
+#: usr/local/www/services_dyndns_edit.php:304
+#: usr/local/www/services_dyndns_edit.php:312
+#: usr/local/www/services_dyndns_edit.php:312
+msgid "Route 53: Enter your Access Key ID."
+msgstr "ルート53 :あなたのアクセスキーIDを入力します。"
+
+#: usr/local/www/services_dyndns_edit.php:301
+#: usr/local/www/services_dyndns_edit.php:305
+#: usr/local/www/services_dyndns_edit.php:313
+#: usr/local/www/services_dyndns_edit.php:313
+msgid ""
+"For Custom Entries, Username and Password represent HTTP Authentication "
+"username and passwords."
+msgstr "ユーザ名とパスワードの「カスタムエントリの場合、ユーザー名とパスワードはHTTP認証を表す"。"
+
+#: usr/local/www/services_dyndns_edit.php:310
+#: usr/local/www/services_dyndns_edit.php:314
+#: usr/local/www/services_dyndns_edit.php:322
+#: usr/local/www/services_dyndns_edit.php:322
+msgid "Route 53: Enter your Secret Access Key."
+msgstr "ルート53 :あなたの秘密アクセスキーを入力してください。"
+
+#: usr/local/www/services_dyndns_edit.php:315
+#: usr/local/www/services_dyndns_edit.php:319
+#: usr/local/www/services_dyndns_edit.php:327
+#: usr/local/www/services_dyndns_edit.php:327
+msgid "Zone ID"
+msgstr "ゾーンID"
+
+#: usr/local/www/services_dyndns_edit.php:318
+#: usr/local/www/services_dyndns_edit.php:322
+#: usr/local/www/services_dyndns_edit.php:330
+#: usr/local/www/services_dyndns_edit.php:330
+msgid ""
+"Enter Zone ID that you received when you created your domain in Route 53."
+msgstr ""あなたはルート53にドメインを作成したときに受け取ったゾーンIDを入力してください。"
+
+#: usr/local/www/services_dyndns_edit.php:325
+#: usr/local/www/services_dyndns_edit.php:329
+#: usr/local/www/services_dyndns_edit.php:337
+#: usr/local/www/services_dyndns_edit.php:337
+msgid ""
+"This is the only field required by for Custom Dynamic DNS, and is only used "
+"by Custom Entries."
+msgstr "「これは、カスタムダイナミックDNS用が必要とする唯一のフィールドであり、唯一使用されている「カスタムエントリによって。"
+
+#: usr/local/www/services_dyndns_edit.php:327
+#: usr/local/www/services_dyndns_edit.php:338
+#: usr/local/www/services_dyndns_edit.php:331
+#: usr/local/www/services_dyndns_edit.php:342
+#: usr/local/www/services_dyndns_edit.php:339
+#: usr/local/www/services_dyndns_edit.php:350
+#: usr/local/www/services_dyndns_edit.php:339
+#: usr/local/www/services_dyndns_edit.php:350
+msgid ""
+"If you need the new IP to be included in the request, put %IP% in its place."
+msgstr "「あなたは、要求に含まれるように新しいIPが必要な場合は、その場所で%のIP %を置く。"
+
+#: usr/local/www/services_dyndns_edit.php:331
+#: usr/local/www/services_dyndns_edit.php:335
+#: usr/local/www/services_dyndns_edit.php:343
+#: usr/local/www/services_dyndns_edit.php:343
+msgid "Result Match"
+msgstr "結果マッチ"
+
+#: usr/local/www/services_dyndns_edit.php:334
+#: usr/local/www/services_dyndns_edit.php:338
+#: usr/local/www/services_dyndns_edit.php:346
+#: usr/local/www/services_dyndns_edit.php:346
+msgid "This field is only used by Custom Dynamic DNS Entries."
+msgstr "このフィールドは、カスタム·ダイナミックDNSのエントリで使用されます。"
+
+#: usr/local/www/services_dyndns_edit.php:336
+#: usr/local/www/services_dyndns_edit.php:340
+#: usr/local/www/services_dyndns_edit.php:348
+#: usr/local/www/services_dyndns_edit.php:348
+msgid ""
+"This field should be identical to what your DDNS Provider will return if the "
+"update succeeds, leave it blank to disable checking of returned results."
+msgstr "更新成功、返される結果のチェックを無効にするには、空白のまま"このフィールドには、 DDNSプロバイダの場合に返されるかと同一である必要があります」 。"
+
+#: usr/local/www/services_dyndns_edit.php:340
+#: usr/local/www/services_dyndns_edit.php:344
+#: usr/local/www/services_dyndns_edit.php:352
+#: usr/local/www/services_dyndns_edit.php:352
+msgid ""
+"If you need to include multiple possible values, sperate them with a |. If "
+"your provider includes a |, escape it with |"
+msgstr "「あなたは、複数の可能な値を含める必要がある場合は、それらをsperate | 。場合は"| でエスケーププロバイダが含まれてい|"
+
+#: usr/local/www/services_dyndns_edit.php:342
+#: usr/local/www/services_dyndns_edit.php:346
+#: usr/local/www/services_dyndns_edit.php:354
+#: usr/local/www/services_dyndns_edit.php:354
+msgid ""
+"Tabs (t), newlines (\n) and carriage returns (r) at the beginning or "
+"end of the returned results are removed before comparison."
+msgstr "返される結果の末尾「最初かのタブ( t)は、改行( \n )とキャリッジリターン( r)は「比較の前に削除されます。"
+
+#: usr/local/www/services_dyndns_edit.php:351
+#: usr/local/www/services_dyndns_edit.php:355
+#: usr/local/www/services_dyndns_edit.php:363
+#: usr/local/www/services_dyndns_edit.php:363
+msgid "Choose TTL for your dns record."
+msgstr "あなたのDNSレコードのTTLを選択してください。"
+
+#: usr/local/www/services_dyndns_edit.php:370
+#: usr/local/www/services_dyndns_edit.php:374
+#: usr/local/www/services_dyndns_edit.php:382
+#: usr/local/www/services_dyndns_edit.php:382
+msgid "Save & Force Update"
+msgstr "保存して強制アップデート"
+
+#: usr/local/www/fbegin.inc:102 usr/local/www/fbegin.inc:111
+#: usr/local/www/fbegin.inc:103 usr/local/www/fbegin.inc:103
+msgid "High Avail. Sync"
+msgstr "高空き有り同期する"
+
+#: usr/local/www/services_dnsmasq_edit.php:119
+#: usr/local/www/services_dnsmasq_edit.php:119
+msgid "Alias Domain"
+msgstr "エイリアスドメイン"
+
+#: usr/local/www/services_dnsmasq_edit.php:124
+#: usr/local/www/services_dnsmasq_edit.php:124
+msgid ""
+"Hostnames in alias list can only contain the characters A-Z, 0-9 and '-'."
+msgstr "' -' "エイリアスリスト内のホスト名は文字だけ、A〜Z、0〜9とを含むことができます。"
+
+#: usr/local/www/services_dnsmasq_edit.php:127
+#: usr/local/www/services_dnsmasq_edit.php:127
+msgid "A valid domain must be specified in alias list."
+msgstr "有効なドメインは、別名リストで指定する必要があります。"
+
+#: usr/local/www/services_dnsmasq_edit.php:232
+#: usr/local/www/services_dnsmasq_edit.php:233
+#: usr/local/www/services_dnsmasq_edit.php:233
+msgid "Enter additional names for this host."
+msgstr "このホストの追加の名前を入力します。"
+
+#: usr/local/www/pkg.php:238 usr/local/www/pkg.php:186
+#: usr/local/www/pkg.php:186
+msgid "Saving changes..."
+msgstr "変更を保存..."
+
+#: usr/local/www/pkg.php:239 usr/local/www/pkg.php:187
+#: usr/local/www/pkg.php:187
+msgid "Do you really want to save changes?"
+msgstr "あなたは本当に、変更を保存しますか?"
+
+#: usr/local/www/status_interfaces.php:196
+#: usr/local/www/status_interfaces.php:199
+#: usr/local/www/status_interfaces.php:199
+msgid "Cell Signal (RSSI)"
+msgstr "細胞シグナル( RSSI )"
+
+#: usr/local/www/status_interfaces.php:203
+#: usr/local/www/status_interfaces.php:206
+#: usr/local/www/status_interfaces.php:206
+msgid "Cell Mode"
+msgstr "セルモード"
+
+#: usr/local/www/status_interfaces.php:210
+#: usr/local/www/status_interfaces.php:213
+#: usr/local/www/status_interfaces.php:213
+msgid "Cell SIM State"
+msgstr "セルのSIM状態"
+
+#: usr/local/www/status_interfaces.php:217
+#: usr/local/www/status_interfaces.php:220
+#: usr/local/www/status_interfaces.php:220
+msgid "Cell Service"
+msgstr "セルサービス"
+
+#: usr/local/www/status_interfaces.php:224
+#: usr/local/www/status_interfaces.php:227
+#: usr/local/www/status_interfaces.php:227
+msgid "Cell Upstream"
+msgstr "セル上流"
+
+#: usr/local/www/status_interfaces.php:231
+#: usr/local/www/status_interfaces.php:234
+#: usr/local/www/status_interfaces.php:234
+msgid "Cell Downstream"
+msgstr "セルダウンストリーム"
+
+#: usr/local/www/status_interfaces.php:238
+#: usr/local/www/status_interfaces.php:241
+#: usr/local/www/status_interfaces.php:241
+msgid "Cell Current Up"
+msgstr "セル電流アップ"
+
+#: usr/local/www/status_interfaces.php:245
+#: usr/local/www/status_interfaces.php:248
+#: usr/local/www/status_interfaces.php:248
+msgid "Cell Current Down"
+msgstr "セル電流ダウン"
+
+#: usr/local/www/status_interfaces.php:289
+#: usr/local/www/status_interfaces.php:292
+#: usr/local/www/status_interfaces.php:292
+msgid "IPv6 Link Local"
+msgstr "IPv6のリンクローカル"
+
+#: usr/local/www/status_interfaces.php:339
+#: usr/local/www/status_interfaces.php:342
+#: usr/local/www/status_interfaces.php:342
+msgid "LAGG Protocol"
+msgstr "LAGGプロトコル"
+
+#: usr/local/www/status_interfaces.php:346
+#: usr/local/www/status_interfaces.php:349
+#: usr/local/www/status_interfaces.php:349
+msgid "LAGG Ports"
+msgstr "LAGGポート"
+
+#: usr/local/www/diag_defaults.php:51 usr/local/www/diag_defaults.php:61
+#: usr/local/www/diag_defaults.php:61
+msgid ""
+"The system has been reset to factory defaults and is now rebooting. This may "
+"take a few minutes, depending on your hardware."
+msgstr "「システムは工場出荷時の設定にリセットされ、現在、再起動されている。これは可能性」は、ハードウェアに応じて、数分かかる。"
+
+#: usr/local/www/carp_status.php:196 usr/local/www/carp_status.php:189
+#: usr/local/www/carp_status.php:189
+msgid "You can configure high availability sync settings"
+msgstr "あなたは、高可用性同期設定を行うことができます"
+
+#: usr/local/www/load_balancer_setting.php:69
+#: usr/local/www/load_balancer_setting.php:69
+msgid "Timeout must be a numeric value"
+msgstr "タイムアウトは数値である必要があります"
+
+#: usr/local/www/load_balancer_setting.php:73
+#: usr/local/www/load_balancer_setting.php:73
+msgid "Interval must be a numeric value"
+msgstr "間隔は数値である必要があります"
+
+#: usr/local/www/load_balancer_setting.php:78
+#: usr/local/www/load_balancer_setting.php:78
+msgid "Prefork must be a numeric value"
+msgstr "preforkのは、数値でなければなりません"
+
+#: usr/local/www/load_balancer_setting.php:81
+#: usr/local/www/load_balancer_setting.php:81
+msgid "Prefork value must be between 1 and 32"
+msgstr "preforkの値は1と32の間でなければなりません"
+
+#: usr/local/www/load_balancer_setting.php:132
+#: usr/local/www/load_balancer_setting.php:131
+#: usr/local/www/load_balancer_setting.php:131
+msgid "Relayd global settings"
+msgstr "Relaydグローバル設定"
+
+#: usr/local/www/load_balancer_setting.php:135
+#: usr/local/www/load_balancer_setting.php:134
+#: usr/local/www/load_balancer_setting.php:134
+msgid "timeout"
+msgstr "タイムアウト"
+
+#: usr/local/www/load_balancer_setting.php:139
+#: usr/local/www/load_balancer_setting.php:138
+#: usr/local/www/load_balancer_setting.php:138
+msgid ""
+"Set the global timeout in milliseconds for checks. Leave blank to use the "
+"default value of 1000 ms "
+msgstr "「チェックのためのミリ秒単位でグローバルタイムアウトを設定します。使用するには、空白のままにします」 1000年、MSのデフォルト値を"
+
+#: usr/local/www/load_balancer_setting.php:143
+#: usr/local/www/load_balancer_setting.php:142
+#: usr/local/www/load_balancer_setting.php:142
+msgid "interval"
+msgstr "インターバル"
+
+#: usr/local/www/load_balancer_setting.php:147
+#: usr/local/www/load_balancer_setting.php:146
+#: usr/local/www/load_balancer_setting.php:146
+msgid ""
+"Set the interval in seconds at which the member of a pool will be checked. "
+"Leave blank to use the default interval of 10 seconds"
+msgstr "「プールのメンバーがチェックされる間隔を秒単位で設定します。 "10秒のデフォルト間隔を使用するには、空白のままにします"
+
+#: usr/local/www/load_balancer_setting.php:151
+#: usr/local/www/load_balancer_setting.php:150
+#: usr/local/www/load_balancer_setting.php:150
+msgid "prefork"
+msgstr "preforkの"
+
+#: usr/local/www/load_balancer_setting.php:155
+#: usr/local/www/load_balancer_setting.php:154
+#: usr/local/www/load_balancer_setting.php:154
+msgid ""
+"Number of processes used by relayd. Leave blank to use the default value of "
+"5 processes"
+msgstr "5プロセス」 relaydが使用するプロセスの数は、デフォルト値を使用するには、空白のままにします」"
+
+#: usr/local/www/services_dhcp_relay.php:80
+#: usr/local/www/services_dhcp_relay.php:80
+msgid "A valid Destination Server IP address must be specified."
+msgstr "有効な宛先サーバのIPアドレスを指定する必要があります。"
+
+#: usr/local/www/diag_ipsec.php:65 usr/local/www/diag_ipsec.php:66
+#: usr/local/www/diag_ipsec.php:68 usr/local/www/diag_ipsec.php:68
+msgid "Disconnected user"
+msgstr "切断されたユーザ"
+
+#: usr/local/www/diag_ipsec.php:192 usr/local/www/diag_ipsec.php:193
+#: usr/local/www/diag_ipsec.php:194 usr/local/www/diag_ipsec.php:194
+msgid "Mobile User"
+msgstr "モバイルユーザー"
+
+#: usr/local/www/diag_ipsec.php:193 usr/local/www/diag_ipsec.php:194
+#: usr/local/www/diag_ipsec.php:195 usr/local/www/diag_ipsec.php:195
+msgid "Login Time"
+msgstr "ログイン時刻"
+
+#: usr/local/www/diag_ipsec.php:195 usr/local/www/diag_ipsec.php:196
+#: usr/local/www/diag_ipsec.php:197 usr/local/www/diag_ipsec.php:197
+msgid "Remote"
+msgstr "リモート"
+
+#: usr/local/www/diag_ipsec.php:223 usr/local/www/diag_ipsec.php:224
+#: usr/local/www/diag_ipsec.php:225 usr/local/www/diag_ipsec.php:225
+msgid "You can configure IPsec"
+msgstr "あなたは、IPsecを構成することができます"
+
+#: usr/local/www/system_certmanager.php:207
+#: usr/local/www/system_certmanager.php:681
+#: usr/local/www/system_certmanager.php:210
+#: usr/local/www/system_certmanager.php:706
+#: usr/local/www/system_certmanager.php:707
+#: usr/local/www/system_certmanager.php:210
+#: usr/local/www/system_certmanager.php:707
+msgid "Certificate Type"
+msgstr "証明書の種類"
+
+#: usr/local/www/system_certmanager.php:694
+#: usr/local/www/system_certmanager.php:719
+#: usr/local/www/system_certmanager.php:720
+#: usr/local/www/system_certmanager.php:720
+msgid ""
+"Type of certificate to generate. Used for placing restrictions on the usage "
+"of the generated certificate."
+msgstr "」を生成する証明書の種類。使用方法に制限を配置するために使用される「生成された証明書の。"
+
+#: usr/local/www/system_certmanager.php:757
+#: usr/local/www/system_certmanager.php:782
+#: usr/local/www/system_certmanager.php:783
+#: usr/local/www/system_certmanager.php:783
+msgid "Alternative Names"
+msgstr "代替名"
+
+#: usr/local/www/system_certmanager.php:1109
+#: usr/local/www/system_certmanager.php:1112
+#: usr/local/www/system_certmanager.php:1168
+#: usr/local/www/system_certmanager.php:1172
+#: usr/local/www/system_certmanager.php:1172
+msgid "export cert+key in .p12"
+msgstr "。 P12の輸出証明書のキー"
+
+#: usr/local/www/diag_backup.php:192 usr/local/www/diag_backup.php:192
+msgid "RRD Data"
+msgstr "RRDデータ"
+
+#: usr/local/www/firewall_rules_edit.php:224
+#: usr/local/www/firewall_rules_edit.php:237
+#: usr/local/www/firewall_rules_edit.php:222
+#: usr/local/www/firewall_rules_edit.php:236
+#: usr/local/www/firewall_rules_edit.php:219
+#: usr/local/www/firewall_rules_edit.php:233
+#: usr/local/www/firewall_rules_edit.php:225
+#: usr/local/www/firewall_rules_edit.php:239
+#: usr/local/www/firewall_rules_edit.php:225
+#: usr/local/www/firewall_rules_edit.php:239
+msgid "You can not assign a gateway to a rule that applies to IPv4 and IPv6"
+msgstr "あなたは、IPv4およびIPv6に適用するルールへのゲートウェイを割り当てることはできません"
+
+#: usr/local/www/firewall_rules_edit.php:249
+#: usr/local/www/firewall_rules_edit.php:248
+#: usr/local/www/firewall_rules_edit.php:245
+#: usr/local/www/firewall_rules_edit.php:251
+#: usr/local/www/firewall_rules_edit.php:251
+msgid ""
+"You can not assign a protocol other then ICMP, TCP, UDP or TCP/UDP to a rule "
+"that applies to IPv4 and IPv6"
+msgstr "「あなたは、他のプロトコルを割り当てることはできません規則、その後ICMP、TCP 、 UDPまたはTCP / UDP 」 IPv4およびIPv6にも適用され"
+
+#: usr/local/www/firewall_rules_edit.php:253
+#: usr/local/www/firewall_rules_edit.php:252
+#: usr/local/www/firewall_rules_edit.php:249
+#: usr/local/www/firewall_rules_edit.php:255
+#: usr/local/www/firewall_rules_edit.php:255
+msgid "You can not assign a ICMP type to a rule that applies to IPv4 and IPv6"
+msgstr "あなたは、IPv4およびIPv6に適用するルールにICMPタイプを割り当てることはできません"
+
+#: usr/local/www/firewall_rules_edit.php:416
+#: usr/local/www/firewall_rules_edit.php:415
+#: usr/local/www/firewall_rules_edit.php:418
+#: usr/local/www/firewall_rules_edit.php:424
+#: usr/local/www/firewall_rules_edit.php:424
+msgid "You can not use a IPv4 or IPv6 address in combined IPv4 + IPv6 rules."
+msgstr "あなたが組み合わされたIPv4のIPv6ルールでIPv4またはIPv6アドレスを使用することはできません。"
+
+#: usr/local/www/firewall_rules_edit.php:1285
+#: usr/local/www/firewall_rules_edit.php:1300
+#: usr/local/www/firewall_rules_edit.php:1307
+#: usr/local/www/firewall_rules_edit.php:1306
+#: usr/local/www/firewall_rules_edit.php:1306
+msgid "802.1p"
+msgstr "802.1pの"
+
+#: usr/local/www/firewall_rules_edit.php:1308
+#: usr/local/www/firewall_rules_edit.php:1323
+#: usr/local/www/firewall_rules_edit.php:1330
+#: usr/local/www/firewall_rules_edit.php:1341
+#: usr/local/www/firewall_rules_edit.php:1341
+msgid "Choose 802.1p priority to match on"
+msgstr "上と一致するように802.1pプライオリティを選択してください"
+
+#: usr/local/www/firewall_rules_edit.php:1312
+#: usr/local/www/firewall_rules_edit.php:1327
+#: usr/local/www/firewall_rules_edit.php:1334
+#: usr/local/www/firewall_rules_edit.php:1345
+#: usr/local/www/firewall_rules_edit.php:1345
+msgid "Choose 802.1p priority to apply"
+msgstr "適用する802.1pプライオリティを選択してください"
+
+#: usr/local/www/services_unbound.php:102
+#: usr/local/www/services_unbound_advanced.php:88
+msgid "DNS Resolver"
+msgstr "DNSリゾルバ"
+
+#: usr/local/www/services_unbound.php:129
+msgid "The configuration for the DNS Resolver, has been changed"
+msgstr "DNSリゾルバの設定は、変更された"
+
+#: usr/local/www/services_unbound.php:136
+#: usr/local/www/services_unbound_advanced.php:123
+msgid "General settings"
+msgstr "一般的な設定"
+
+#: usr/local/www/services_unbound.php:147
+msgid "General DNS Resolver Options"
+msgstr "一般的なDNSリゾルバのオプション"
+
+#: usr/local/www/services_unbound.php:153
+msgid "Enable DNS Resolver"
+msgstr "DNSリゾルバを有効にします"
+
+#: usr/local/www/services_unbound.php:157
+msgid "Network interfaces"
+msgstr "ネットワーク·インタフェース"
+
+#: usr/local/www/services_unbound.php:172
+msgid ""
+"The DNS Resolver Server will listen on the selected interfaces. To add an "
+"interface click inside the interface box and select the interface from the "
+"drop down."
+msgstr "「 DNSリゾルバサーバが選択したインターフェイス上で待機します。追加するには、「インターフェースボックス内部インターフェイスをクリックしてと "ドロップダウンメニューからインターフェースを選択します。"
+
+#: usr/local/www/services_unbound.php:177
+msgid "Outgoing interfaces"
+msgstr "発信インターフェイス"
+
+#: usr/local/www/services_unbound.php:192
+msgid ""
+"Utilize different network interface(s) that the DNS Resolver will use to "
+"send queries to authoritative servers and receive their replies. By default "
+"all interfaces are used."
+msgstr "その返信を権威サーバにクエリーを送信し、受信」 DNSリゾルバがするために使用する別のネットワーク·インタフェース(S )を利用」 。デフォルトでは「すべてのインターフェイスが使用されます。"
+
+#: usr/local/www/services_unbound.php:197
+msgid "DNSSEC"
+msgstr "DNSSEC"
+
+#: usr/local/www/services_unbound.php:200
+msgid "Enable DNSSEC Support"
+msgstr "DNSSECサポートを有効にする"
+
+#: usr/local/www/services_unbound.php:204
+msgid "Forwarding"
+msgstr "転送"
+
+#: usr/local/www/services_unbound.php:207
+msgid "Enable Forwarding Mode"
+msgstr "転送モードを有効にする"
+
+#: usr/local/www/services_unbound.php:214
+msgid "Register DHCP leases in the DNS Resolver"
+msgstr "レジスタDHCPはDNSリゾルバ内のリース"
+
+#: usr/local/www/services_unbound.php:215
+#, php-format
+msgid ""
+"If this option is set, then machines that specify their hostname when "
+"requesting a DHCP lease will be registered in the DNS Resolver, so that "
+"their name can be resolved. You should also set the domain in %sSystem: "
+"General setup%s to the proper value."
+msgstr "「このオプションが設定されている場合は、とき彼らのホスト名を指定してマシン""自分の名前を入手し%sSystemドメインを設定する必要が解決することができます。 : "ようにDHCPリースを要求するには、 DNSリゾルバに登録されます一般setup%sを。適切な値にね。"
+
+#: usr/local/www/services_unbound.php:226
+msgid "Register DHCP static mappings in the DNS Resolver"
+msgstr "DNSリゾルバのレジスタのDHCP静的マッピング"
+
+#: usr/local/www/services_unbound.php:227
+#, php-format
+msgid ""
+"If this option is set, then DHCP static mappings will be registered in the "
+"DNS Resolver, so that their name can be resolved. You should also set the "
+"domain in %sSystem: General setup%s to the proper value."
+msgstr "その名前が解決できるように、 DNSリゾルバ「このオプションが設定されている場合、 DHCPの静的マッピングラーニング登録される」 。一般setup%s適正値に:また%sSystemの「ドメインを設定する必要があります。"
+
+#: usr/local/www/services_unbound.php:254
+#, php-format
+msgid ""
+"If the DNS Resolver is enabled, the DHCP service (if enabled) will "
+"automatically serve the LAN IP address as a DNS server to DHCP clients so "
+"they will use the DNS Resolver. If Forwarding, is enabled, the DNS Resolver "
+"will use the DNS servers entered in %sSystem: General setup%s or those "
+"obtained via DHCP or PPP on WAN if the &quot;Allow DNS server list to be "
+"overridden by DHCP/PPP on WAN&quot; is checked."
+msgstr "「 DNSリゾルバが有効になっている場合は、 DHCPサービス(有効な場合)がします」が自動的にDHCPクライアントにDNSサーバーとしてLANのIPアドレスを提供するので、 "彼らは、DNSリゾルバを使用します。転送が、有効になっている場合は、 DNSリゾルバは、 "意志一般setup%sまたはDNSサーバーリスト」とは、WAN上でDHCP / PPPによって無効にする」ことができるようにするチェックされている」場合には、WAN上でのDHCPやPPPを介して取得した「もの: DNSの%sSystemに入力されたサーバを使用しています。"
+
+#: usr/local/www/services_unbound_advanced.php:116
+msgid "The configuration of the DNS Resolver, has been changed"
+msgstr "DNSリゾルバの設定は、変更された"
+
+#: usr/local/www/services_unbound_advanced.php:134
+msgid "Advanced Resolver Options"
+msgstr "高度なレゾルバオプション"
+
+#: usr/local/www/services_unbound_advanced.php:137
+msgid "Hide Identity"
+msgstr "隠すアイデンティティ"
+
+#: usr/local/www/services_unbound_advanced.php:140
+msgid "If enabled, id.server and hostname.bind queries are refused."
+msgstr "有効にすると、 id.serverとhostname.bindクエリが拒否されます。"
+
+#: usr/local/www/services_unbound_advanced.php:144
+msgid "Hide Version"
+msgstr "バージョンを隠す"
+
+#: usr/local/www/services_unbound_advanced.php:147
+msgid "If enabled, version.server and version.bind queries are refused."
+msgstr "有効にすると、 version.serverとクエリversion.bindが拒否されます。"
+
+#: usr/local/www/services_unbound_advanced.php:151
+msgid "Prefetch Support"
+msgstr "プリフェッチのサポート"
+
+#: usr/local/www/services_unbound_advanced.php:154
+msgid ""
+"Message cache elements are prefetched before they expire to help keep the "
+"cache up to date. When enabled, this option can cause an increase of around "
+"10% more DNS traffic and load on the server, but frequently requested items "
+"will not expire from the cache."
+msgstr "最新でキャッシュ「彼らが保つために有効期限が切れる前に、メッセージキャッシュ要素がプリフェッチされる」 。有効にすると、このオプションは周りの増加原因となります」 10パーセント以上のDNSトラフィックとサーバーの負荷が、しかし頻繁に要求される項目は、 「キャッシュから有効期限はありません。"
+
+#: usr/local/www/services_unbound_advanced.php:158
+msgid "Prefetch DNS Key Support"
+msgstr "プリフェッチDNSキーのサポート"
+
+#: usr/local/www/services_unbound_advanced.php:161
+#, php-format
+msgid ""
+"DNSKEY's are fetched earlier in the validation process when a %sDelegation "
+"signer%s is encountered. This helps lower the latency of requests but does "
+"utilize a little more CPU."
+msgstr "signer%s遭遇した"DNSKEYのは、以前の検証プロセスにおける%sDelegationが時にフェッチされる」 。これはリクエストのレイテンシを下げることができますが、 "もう少しのCPUを利用していない。"
+
+#: usr/local/www/services_unbound_advanced.php:165
+msgid "Harden Glue"
+msgstr "ハーデングルー"
+
+#: usr/local/www/services_unbound_advanced.php:168
+msgid "Only trust glue if it is within the servers authority."
+msgstr "それはサーバの権限の範囲内である場合にのみ接着剤を信頼しています。"
+
+#: usr/local/www/services_unbound_advanced.php:172
+msgid "Harden DNSSEC data"
+msgstr "ハーデンDNSSECデータ"
+
+#: usr/local/www/services_unbound_advanced.php:175
+msgid ""
+"DNSSEC data is required for trust-anchored zones. If such data is absent, "
+"the zone becomes bogus. If this is disabled and no DNSSEC data is received, "
+"then the zone is made insecure."
+msgstr "「 DNSSECデータが信頼アンカーゾーンに必要とされる。このようなデータが存在しない場合は、「ゾーンが偽となる。これは無効で、 DNSSECデータが受信されない場合、 「次にゾーンが安全で行われる。"
+
+#: usr/local/www/services_unbound_advanced.php:179
+msgid "Message Cache Size"
+msgstr "メッセージキャッシュサイズ"
+
+#: usr/local/www/services_unbound_advanced.php:190
+msgid ""
+"Size of the message cache. The message cache stores DNS rcodes and "
+"validation statuses. The RRSet cache will automatically be set to twice this "
+"amount. The RRSet cache contains the actual RR data. The default is 4 "
+"megabytes."
+msgstr "「メッセージ·キャッシュのサイズ。メッセージキャッシュを格納するDNS rcodesと「検証ステータス。資源レコード集合キャッシュは自動的に2回に設定されます」量。資源レコード集合キャッシュは、実際のRRデータが含まれています。デフォルトは4です」メガバイト。"
+
+#: usr/local/www/services_unbound_advanced.php:194
+msgid "Outgoing TCP Buffers"
+msgstr "発信TCPバッファ"
+
+#: usr/local/www/services_unbound_advanced.php:204
+msgid ""
+"The number of outgoing TCP buffers to allocate per thread. The default value "
+"is 10. If 0 is selected then no TCP queries, to authoritative servers, are "
+"done."
+msgstr "「スレッドごとに割り当てるための発信TCPバッファの数。デフォルト値は「 10です。 0は権威サーバには、何のTCPクエリを選択されていない場合は、 「実行されます。"
+
+#: usr/local/www/services_unbound_advanced.php:208
+msgid "Incoming TCP Buffers"
+msgstr "着信TCPバッファ"
+
+#: usr/local/www/services_unbound_advanced.php:218
+msgid ""
+"The number of incoming TCP buffers to allocate per thread. The default value "
+"is 10. If 0 is selected then no TCP queries, from clients, are accepted."
+msgstr "「スレッドごとに割り当てるための着信TCPバッファの数。デフォルト値は「 10です。 0はクライアントからのその後のTCPクエリーを、選択されていない場合は、受け入れられています。"
+
+#: usr/local/www/services_unbound_advanced.php:222
+msgid "EDNS Buffer Size"
+msgstr "EDNSバッファサイズ"
+
+#: usr/local/www/services_unbound_advanced.php:229
+msgid ""
+"Number of bytes size to advertise as the EDNS reassembly buffer size. This "
+"is the value that is used in UDP datagrams sent to peers. RFC recommendation "
+"is 4096 (which is the default). If you have fragmentation reassemble "
+"problems, usually seen as timeouts, then a value of 1480 should help. The "
+"512 value bypasses most MTU path problems, but it can generate an excessive "
+"amount of TCP fallback."
+msgstr "「 EDNS組立バッファサイズとしてアドバタイズするバイトサイズの数。これは、 "ピアに送信されるUDPデータグラムで使用される値です。 RFC勧告は通常、タイムアウトと見られた問題を、そして1480年の値は役立つはず"あなたは断片化が再構成している場合。 (デフォルト) 4096 」です。 「 512の値は、ほとんどのMTUパスの問題を迂回するが、それは、過剰な生成することができ、「TCPフォールバックの量を。"
+
+#: usr/local/www/services_unbound_advanced.php:233
+msgid "Number of queries per thread"
+msgstr "スレッドあたりのクエリ数"
+
+#: usr/local/www/services_unbound_advanced.php:240
+msgid ""
+"The number of queries that every thread will service simultaneously. If more "
+"queries arrive that need to be serviced, and no queries can be jostled, then "
+"these queries are dropped."
+msgstr "クエリサービスを受けるためにその必要性を着けないクエリはもまできない」よりは場合、すべてのスレッドが同時にサービスするクエリの数は。 」 、そして「これらのクエリは削除されます。"
+
+#: usr/local/www/services_unbound_advanced.php:244
+msgid "Jostle Timeout"
+msgstr "モーターボータイムアウト"
+
+#: usr/local/www/services_unbound_advanced.php:252
+msgid ""
+"This timeout is used for when the server is very busy. This protects against "
+"denial of service by slow queries or high query rates. The default value is "
+"200 milliseconds."
+msgstr "「このタイムアウトは、サーバーが非常にビジーであるときに使用されます。これはから保護「スロークエリまたは高いクエリな料金でサービス拒否。デフォルト値は「200ミリ秒である。"
+
+#: usr/local/www/services_unbound_advanced.php:256
+msgid "Maximum TTL for RRsets and messages"
+msgstr "RRセットおよびメッセージの最大のTTL"
+
+#: usr/local/www/services_unbound_advanced.php:259
+msgid ""
+"Configure a maximum Time to live for RRsets and messages in the cache. The "
+"default is 86400 seconds (1 day). When the internal TTL expires the cache "
+"item is expired. This can be configured to force the resolver to query for "
+"data more often and not trust (very large) TTL values."
+msgstr "「キャッシュ内のRRセットおよびメッセージのために生きるの最大時間を設定します。 「デフォルトは86400秒( 1日)です。内部のTTLは、キャッシュの有効期限が切れると、データをより頻繁ではなく、信頼(非常に大きい) TTL値」の項目の有効期限が切れている。これは照会するために、リゾルバを強制的に設定することができます」 。"
+
+#: usr/local/www/services_unbound_advanced.php:263
+msgid "Minimum TTL for RRsets and messages"
+msgstr "RRセットおよびメッセージの最小のTTL"
+
+#: usr/local/www/services_unbound_advanced.php:266
+msgid ""
+"Configure a minimum Time to live for RRsets and messages in the cache. The "
+"default is 0 seconds. If the minimum value kicks in, the data is cached for "
+"longer than the domain owner intended, and thus less queries are made to "
+"look up the data. The 0 value ensures the data in the cache is as the domain "
+"owner intended. High values can lead to trouble as the data in the cache "
+"might not match up with the actual data anymore."
+msgstr "「キャッシュ内のRRセットおよびメッセージのために生きるの最小時間を設定します。 「デフォルト値は0秒です。最小値は中のキックと、データがキャッシュされ、「意図したドメインオーナーよりも長いため、少ないクエリがするために行われる「データを検索します。 0値は、ドメイン「所有者が意図した。高い値は、キャッシュ内のデータのように、トラブルにつながる可能性」と、キャッシュ内のデータはもう実際のデータと一致しない場合がありますが保証されます。"
+
+#: usr/local/www/services_unbound_advanced.php:270
+msgid "TTL for Host cache entries"
+msgstr "ホストキャッシュエントリのTTL"
+
+#: usr/local/www/services_unbound_advanced.php:279
+msgid ""
+"Time to live for entries in the host cache. The host cache contains "
+"roundtrip timing and EDNS support information. The default is 15 minutes."
+msgstr "往復のタイミングとEDNSサポート情報を「ホストキャッシュ内のエントリの存続時間は、ホスト·キャッシュが含まれています」 。デフォルトは15分です。"
+
+#: usr/local/www/services_unbound_advanced.php:283
+msgid "TTL for lame delegation"
+msgstr "不完全な委任のTTL"
+
+#: usr/local/www/services_unbound_advanced.php:292
+msgid ""
+"Time to live for when a delegation is considered to be lame. The default is "
+"15 minutes."
+msgstr "15分「委任がラメであるとみなされたときのために生きる時間。デフォルトは「。"
+
+#: usr/local/www/services_unbound_advanced.php:296
+msgid "Number of Hosts to cache"
+msgstr "キャッシュにホストの数"
+
+#: usr/local/www/services_unbound_advanced.php:305
+msgid "Number of hosts for which information is cached. The default is 10,000."
+msgstr "情報がキャッシュされているホストの数。デフォルトは10,000です。"
+
+#: usr/local/www/services_unbound_advanced.php:309
+msgid "Unwanted Reply Threshold"
+msgstr "不要な返信しきい値"
+
+#: usr/local/www/services_unbound_advanced.php:319
+msgid ""
+"If enabled, a total number of unwanted replies is kept track of in every "
+"thread. When it reaches the threshold, a defensive action is taken and a "
+"warning is printed to the log file. This defensive action is to clear the "
+"RRSet and message caches, hopefully flushing away any poison. The default is "
+"disabled, but if enabled a a value of 10 million is suggested."
+msgstr "スレッド「有効にすると、不必要な回答の合計数は、すべての内のトラックを保たれている」 。それがしきい値に達すると、防御的な行動がとられており、うまくいけばどんな毒を洗い流す、 RRSetに、メッセージキャッシュ」警告がログファイルに出力されます。この防御的なアクションは、オフにしています」 。デフォルトは「無効になっていますが、千万の有効にした場合、AAの値が提案されている。"
+
+#: usr/local/www/services_unbound_advanced.php:323
+msgid "Log level verbosity"
+msgstr "レベルの冗長性をログに記録"
+
+#: usr/local/www/services_unbound_advanced.php:333
+msgid "Select the log verbosity."
+msgstr "ログの詳細度を選択します。"
+
+#: usr/local/www/system_advanced_firewall.php:80
+#: usr/local/www/system_advanced_firewall.php:91
+#: usr/local/www/system_advanced_firewall.php:91
+msgid "The Firewall Maximum Tables value must be an integer."
+msgstr "ファイアウォールの最大テーブルの値は整数でなければなりません。"
+
+#: usr/local/www/system_advanced_firewall.php:326
+#: usr/local/www/system_advanced_firewall.php:370
+#: usr/local/www/system_advanced_firewall.php:371
+#: usr/local/www/system_advanced_firewall.php:371
+msgid "Firewall Maximum Tables"
+msgstr "ファイアウォールの最大表"
+
+#: usr/local/www/system_advanced_firewall.php:330
+#: usr/local/www/system_advanced_firewall.php:374
+#: usr/local/www/system_advanced_firewall.php:375
+#: usr/local/www/system_advanced_firewall.php:375
+msgid ""
+"Maximum number of tables for systems such as aliases, sshlockout, snort, "
+"etc, combined."
+msgstr "など、合わせて「このようなエイリアス、 sshlockout 、 Snortのようなシステムのためのテーブルの最大数」 。"
+
+#: usr/local/www/system_advanced_firewall.php:331
+#: usr/local/www/system_advanced_firewall.php:375
+#: usr/local/www/system_advanced_firewall.php:376
+#: usr/local/www/system_advanced_firewall.php:376
+msgid ""
+"This is the actual number of tables, not the number of entries inside the "
+"tables (see below)"
+msgstr "テーブル(下記参照) 」これは、テーブルの実際の数ではなく、内部のエントリの数である""
+
+#: usr/local/www/system_advanced_firewall.php:393
+#: usr/local/www/system_advanced_firewall.php:437
+#: usr/local/www/system_advanced_firewall.php:438
+#: usr/local/www/system_advanced_firewall.php:438
+msgid "Disable Negate rule on policy routing rules"
+msgstr "ポリシールーティングルールに否定のルールを無効に"
+
+#: usr/local/www/system_advanced_firewall.php:395
+#: usr/local/www/system_advanced_firewall.php:439
+#: usr/local/www/system_advanced_firewall.php:440
+#: usr/local/www/system_advanced_firewall.php:440
+msgid ""
+"With Multi-WAN you generally want to ensure traffic reaches directly "
+"connected networks and VPN networks when using policy routing. You can "
+"disable this for special purposes but it requires manually creating rules "
+"for these networks"
+msgstr "ポリシールーティングを使用する場合は、接続されたネットワークとVPNネットワークを「マルチWANを使用すると、一般的には、トラフィックが直接到達したことを確認したい」 。あなたは "特別な目的のためにこれを無効にするが、それは、手動でルールを作成する必要」ができ、これらのネットワークのために"
+
+#: usr/local/www/system_advanced_firewall.php:407
+#: usr/local/www/system_advanced_firewall.php:469
+#: usr/local/www/system_advanced_firewall.php:470
+#: usr/local/www/system_advanced_firewall.php:470
+msgid "NAT Reflection mode for port forwards"
+msgstr "ポートに転送するため、NAT反射モード"
+
+#: usr/local/www/system_advanced_firewall.php:411
+#: usr/local/www/firewall_nat_edit.php:794
+#: usr/local/www/firewall_nat_edit.php:793
+#: usr/local/www/firewall_nat_edit.php:788
+#: usr/local/www/system_advanced_firewall.php:473
+#: usr/local/www/firewall_nat_edit.php:800
+#: usr/local/www/system_advanced_firewall.php:474
+#: usr/local/www/firewall_nat_edit.php:801
+#: usr/local/www/firewall_nat_edit.php:801
+#: usr/local/www/system_advanced_firewall.php:474
+msgid "Enable (NAT + Proxy)"
+msgstr "イネーブル( NATプロキシ)"
+
+#: usr/local/www/system_advanced_firewall.php:412
+#: usr/local/www/firewall_nat_edit.php:795
+#: usr/local/www/firewall_nat_edit.php:794
+#: usr/local/www/firewall_nat_edit.php:789
+#: usr/local/www/system_advanced_firewall.php:474
+#: usr/local/www/firewall_nat_edit.php:801
+#: usr/local/www/system_advanced_firewall.php:475
+#: usr/local/www/firewall_nat_edit.php:802
+#: usr/local/www/firewall_nat_edit.php:802
+#: usr/local/www/system_advanced_firewall.php:475
+msgid "Enable (Pure NAT)"
+msgstr "イネーブル(ピュアNAT)"
+
+#: usr/local/www/system_advanced_firewall.php:415
+#: usr/local/www/system_advanced_firewall.php:477
+#: usr/local/www/system_advanced_firewall.php:478
+#: usr/local/www/system_advanced_firewall.php:478
+msgid ""
+"When enabled, this automatically creates additional NAT redirect rules for "
+"access to port forwards on your external IP addresses from within your "
+"internal networks."
+msgstr "あなたの「内部ネットワーク内から外部IPアドレスのポートに転送へのアクセス」を有効にすると、これは自動的に追加のNATがためのルールを作成するリダイレクト」 。"
+
+#: usr/local/www/system_advanced_firewall.php:417
+#: usr/local/www/system_advanced_firewall.php:479
+#: usr/local/www/system_advanced_firewall.php:480
+#: usr/local/www/system_advanced_firewall.php:480
+msgid ""
+"The NAT + proxy mode uses a helper program to send packets to the target of "
+"the port forward. It is useful in setups where the interface and/or gateway "
+"IP used for communication with the target cannot be accurately determined at "
+"the time the rules are loaded. Reflection rules are not created for ranges "
+"larger than 500 ports and will not be used for more than 1000 ports total "
+"between all port forwards. Only TCP and UDP protocols are supported."
+msgstr "ポートフォワード「NATプロキシモードでは、目標にパケットを送信するためにヘルパープログラムを使用しています」 。それは、インターフェイスおよび/またはゲートウェイのルールがロードされている時間」 、ターゲットとの通信に使用するIPを正確に決定することができない」のセットアップに便利です。反射ルールは範囲のために作成されていない」を超える500ポートと合計1000以上のポートに使用されることはありません"すべてのポートに転送間。だけTCPおよびUDPプロトコルがサポートされています。"
+
+#: usr/local/www/system_advanced_firewall.php:419
+#: usr/local/www/system_advanced_firewall.php:481
+#: usr/local/www/system_advanced_firewall.php:482
+#: usr/local/www/system_advanced_firewall.php:482
+msgid ""
+"The pure NAT mode uses a set of NAT rules to direct packets to the target of "
+"the port forward. It has better scalability, but it must be possible to "
+"accurately determine the interface and gateway IP used for communication "
+"with the target at the time the rules are loaded. There are no inherent "
+"limits to the number of ports other than the limits of the protocols. All "
+"protocols available for port forwards are supported."
+msgstr "ポートフォワード「純粋なNATモードでは、目標への直接のパケットにNAT規則のセットを使用しています」 。それは、より良いスケーラビリティを持っていますが、それはルールがロードされた時点で、対象との「正確通信に使用するインターフェイスおよびゲートウェイIPを決定」することが可能でなければなりません。は固有の「プロトコルの制限よりも、他のポートの数には限界が。すべて」が存在しないポートに転送に利用可能なプロトコルがサポートされています。"
+
+#: usr/local/www/system_advanced_firewall.php:421
+#: usr/local/www/system_advanced_firewall.php:441
+#: usr/local/www/system_advanced_firewall.php:483
+#: usr/local/www/system_advanced_firewall.php:503
+#: usr/local/www/system_advanced_firewall.php:484
+#: usr/local/www/system_advanced_firewall.php:504
+#: usr/local/www/system_advanced_firewall.php:484
+#: usr/local/www/system_advanced_firewall.php:504
+msgid ""
+"Individual rules may be configured to override this system setting on a per-"
+"rule basis."
+msgstr "ルールベース」個々のルールごとの上でこのシステム設定を上書きするように構成することができる」 。"
+
+#: usr/local/www/system_advanced_firewall.php:428
+#: usr/local/www/system_advanced_firewall.php:490
+#: usr/local/www/system_advanced_firewall.php:491
+#: usr/local/www/system_advanced_firewall.php:491
+msgid "Enter value for Reflection timeout in seconds."
+msgstr "秒単位でリフレクションのタイムアウトの値を入力します。"
+
+#: usr/local/www/system_advanced_firewall.php:430
+#: usr/local/www/system_advanced_firewall.php:492
+#: usr/local/www/system_advanced_firewall.php:493
+#: usr/local/www/system_advanced_firewall.php:493
+msgid "Note: Only applies to Reflection on port forwards in NAT + proxy mode."
+msgstr "注:のみ、NATプロキシモードのポートを転送での反射にも適用されます。"
+
+#: usr/local/www/system_advanced_firewall.php:434
+#: usr/local/www/system_advanced_firewall.php:496
+#: usr/local/www/system_advanced_firewall.php:497
+#: usr/local/www/system_advanced_firewall.php:497
+msgid "Enable NAT Reflection for 1:1 NAT"
+msgstr "1時01分、NATのNATリフレクションを有効にする"
+
+#: usr/local/www/system_advanced_firewall.php:437
+#: usr/local/www/system_advanced_firewall.php:499
+#: usr/local/www/system_advanced_firewall.php:500
+#: usr/local/www/system_advanced_firewall.php:500
+msgid ""
+"Enables the automatic creation of additional NAT redirect rules for access "
+"to 1:1 mappings of your external IP addresses from within your internal "
+"networks."
+msgstr "内部」ネットワーク内から外部IPアドレスの1:1マッピングに「アクセスするためのルールをリダイレクトの追加のNATの自動作成を可能にします」 。"
+
+#: usr/local/www/system_advanced_firewall.php:439
+#: usr/local/www/system_advanced_firewall.php:501
+#: usr/local/www/system_advanced_firewall.php:502
+#: usr/local/www/system_advanced_firewall.php:502
+msgid ""
+"Note: Reflection on 1:1 mappings is only for the inbound component of the "
+"1:1 mappings. This functions the same as the pure NAT mode for port "
+"forwards. For more details, refer to the pure NAT mode description above."
+msgstr ""注1:1マッピングのリフレクションのみのインバウンドコンポーネントにある「1:1マッピング。これは、ポート"を転送するための純粋なNATモードと同じように機能します。詳細は、上記の純粋なNATモードの説明を参照してください。"
+
+#: usr/local/www/system_advanced_firewall.php:445
+#: usr/local/www/system_advanced_firewall.php:507
+#: usr/local/www/system_advanced_firewall.php:508
+#: usr/local/www/system_advanced_firewall.php:508
+msgid "Enable automatic outbound NAT for Reflection"
+msgstr "リフレクションの自動発信NATを有効にする"
+
+#: usr/local/www/system_advanced_firewall.php:450
+#: usr/local/www/system_advanced_firewall.php:512
+#: usr/local/www/system_advanced_firewall.php:513
+#: usr/local/www/system_advanced_firewall.php:513
+msgid ""
+"Required for full functionality of the pure NAT mode of NAT Reflection for "
+"port forwards or NAT Reflection for 1:1 NAT."
+msgstr "ポートに転送または1:1 NAT用のNAT反射」のNATリフレクションの純粋なNATモードの全機能に必要な"。"
+
+#: usr/local/www/system_advanced_firewall.php:452
+#: usr/local/www/system_advanced_firewall.php:514
+#: usr/local/www/system_advanced_firewall.php:515
+#: usr/local/www/system_advanced_firewall.php:515
+msgid ""
+"Note: This only works for assigned interfaces. Other interfaces require "
+"manually creating the outbound NAT rules that direct the reply packets back "
+"through the router."
+msgstr "手動で応答がルータを介して「連続パケット直接アウトバウンドNATルールの作成:「注意してください。割り当てられたインターフェイス用のみ動作その他のインターフェイスが必要です」 。"
+
+#: usr/local/www/diag_logs_ntpd.php:85 usr/local/www/diag_logs_ntpd.php:86
+#: usr/local/www/diag_logs_ntpd.php:86
+#, php-format
+msgid "Last %s NTP log entries"
+msgstr "最後%sのNTPログエントリ"
+
+#: usr/local/www/firewall_aliases_edit.php:468
+#: usr/local/www/firewall_aliases_edit.php:470
+#: usr/local/www/firewall_aliases_edit.php:492
+#: usr/local/www/firewall_aliases_edit.php:478
+msgid ""
+"Enter as many hosts as you would like. Hosts must be specified by their IP "
+"address or fully qualified domain name (FQDN). FQDN hostnames are "
+"periodically re-resolved and updated. If multiple IPs are returned by a DNS "
+"query, all are used."
+msgstr "「あなたが望んでいるほど多くのホストを入力します。ホストがIPアドレスで指定する必要があります」アドレスまたは完全修飾ドメイン名(FQDN ) 。 FQDNホスト名は、クエリ、すべてが使用されている「定期的に複数のIPアドレスがDNSによって返された場合。再解決され、更新される」 。"
+
+#: usr/local/www/firewall_aliases_edit.php:590
+#: usr/local/www/firewall_aliases_edit.php:593
+#: usr/local/www/firewall_aliases_edit.php:624
+#: usr/local/www/firewall_aliases_edit.php:610
+msgid ""
+"The name of the alias may only consist of the characters "a-z, A-Z, 0-9 and "
+"_"."
+msgstr "AZ 、 AZ,0-9、および"_""エイリアスの名前が文字のみで構成することができる」 。"
+
+#: usr/local/www/system_advanced_admin.php:470
+#: usr/local/www/system_advanced_admin.php:470
+msgid "Disable password login for Secure Shell (RSA/DSA key only)"
+msgstr "セキュアシェルのパスワードログインを無効(RSA / DSA鍵の場合のみ)"
+
+#: usr/local/www/pkg_mgr_installed.php:113 usr/local/www/diag_confbak.php:154
+#: usr/local/www/pkg_mgr_installed.php:115
+#: usr/local/www/pkg_mgr_installed.php:115
+#: usr/local/www/widgets/widgets/system_information.widget.php:92
+#: usr/local/www/diag_confbak.php:154
+msgid "Version"
+msgstr "バージョン"
+
+#: usr/local/www/pkg_mgr_installed.php:197
+#: usr/local/www/pkg_mgr_installed.php:199
+#: usr/local/www/pkg_mgr_installed.php:199
+msgid "Click on "
+msgstr "をクリックします"
+
+#: usr/local/www/pkg_mgr_installed.php:205
+#: usr/local/www/pkg_mgr_installed.php:208
+#: usr/local/www/pkg_mgr_installed.php:210
+#: usr/local/www/pkg_mgr_installed.php:210
+msgid "Remove "
+msgstr "削除する"
+
+#: usr/local/www/pkg_mgr_installed.php:209
+#: usr/local/www/pkg_mgr_installed.php:212
+#: usr/local/www/pkg_mgr_installed.php:215
+#: usr/local/www/pkg_mgr_installed.php:214
+#: usr/local/www/pkg_mgr_installed.php:217
+#: usr/local/www/pkg_mgr_installed.php:214
+#: usr/local/www/pkg_mgr_installed.php:217
+msgid "Reinstall "
+msgstr "再インストールする"
+
+#: usr/local/www/system_advanced_notifications.php:262
+#: usr/local/www/system_advanced_notifications.php:262
+msgid "System Sounds"
+msgstr "システムサウンド"
+
+#: usr/local/www/system_advanced_notifications.php:265
+#: usr/local/www/system_advanced_notifications.php:265
+msgid "Startup/Shutdown Sound"
+msgstr "起動/停止音"
+
+#: usr/local/www/system_advanced_notifications.php:268
+#: usr/local/www/system_advanced_notifications.php:268
+msgid "Disable the startup/shutdown beep"
+msgstr "起動/停止ビープ音を無効にする"
+
+#: usr/local/www/system_advanced_notifications.php:270
+#: usr/local/www/system_advanced_notifications.php:270
+msgid "When this is checked, startup and shutdown sounds will no longer play."
+msgstr "これをチェックすると、起動とシャットダウンの音は、もはや再生されません。"
+
+#: usr/local/www/status_rrd_graph.php:146
+#: usr/local/www/status_rrd_graph.php:151
+#: usr/local/www/status_rrd_graph.php:151
+msgid "Invalid start date/time:"
+msgstr "無効な開始日/時間:"
+
+#: usr/local/www/status_rrd_graph.php:159
+#: usr/local/www/status_rrd_graph.php:164
+#: usr/local/www/status_rrd_graph.php:164
+msgid "Invalid end date/time:"
+msgstr "無効な終了日/時間:"
+
+#: usr/local/www/status_rrd_graph.php:509
+#: usr/local/www/status_rrd_graph.php:544
+#: usr/local/www/status_rrd_graph.php:544
+msgid "Enter date and/or time. Current timezone:"
+msgstr "日付および/または時刻を入力します。現在のタイムゾーン:"
+
+#: usr/local/www/status_ntpd.php:109 usr/local/www/status_ntpd.php:125
+#: usr/local/www/status_ntpd.php:131 usr/local/www/status_ntpd.php:131
+msgid "Ref ID"
+msgstr "REF ID"
+
+#: usr/local/www/status_ntpd.php:110 usr/local/www/status_ntpd.php:126
+#: usr/local/www/status_ntpd.php:132 usr/local/www/status_ntpd.php:132
+msgid "Stratum"
+msgstr "地層"
+
+#: usr/local/www/status_ntpd.php:112 usr/local/www/status_ntpd.php:128
+#: usr/local/www/status_ntpd.php:134 usr/local/www/status_ntpd.php:134
+msgid "When"
+msgstr "時"
+
+#: usr/local/www/status_ntpd.php:113 usr/local/www/status_ntpd.php:129
+#: usr/local/www/status_ntpd.php:135 usr/local/www/status_ntpd.php:135
+msgid "Poll"
+msgstr "世論調査"
+
+#: usr/local/www/status_ntpd.php:114 usr/local/www/status_ntpd.php:130
+#: usr/local/www/status_ntpd.php:136 usr/local/www/status_ntpd.php:136
+msgid "Reach"
+msgstr "リーチ"
+
+#: usr/local/www/status_ntpd.php:116 usr/local/www/status_ntpd.php:132
+#: usr/local/www/status_ntpd.php:138 usr/local/www/status_ntpd.php:138
+msgid "Offset"
+msgstr "オフセット"
+
+#: usr/local/www/status_ntpd.php:117 usr/local/www/status_ntpd.php:133
+#: usr/local/www/status_ntpd.php:139 usr/local/www/status_ntpd.php:139
+msgid "Jitter"
+msgstr "ジッタ"
+
+#: usr/local/www/firewall_rules.php:790 usr/local/www/firewall_rules.php:783
+#: usr/local/www/firewall_rules.php:784 usr/local/www/firewall_rules.php:784
+msgid "No floating rules are currently defined."
+msgstr "いいえ浮動ルールは、現在定義されていません。"
+
+#: usr/local/www/system_advanced_misc.php:297
+#: usr/local/www/system_advanced_misc.php:316
+#: usr/local/www/system_advanced_misc.php:320
+#: usr/local/www/system_advanced_misc.php:367
+#: usr/local/www/system_advanced_misc.php:367
+msgid ""
+"Successive connections will be redirected to the servers in a round-robin "
+"manner with connections from the same source being sent to the same web "
+"server. This 'sticky connection' will exist as long as there are states that "
+"refer to this connection. Once the states expire, so will the sticky "
+"connection. Further connections from that host will be redirected to the "
+"next web server in the round robin. Changing this option will restart the "
+"Load Balancing service."
+msgstr "同じWebに送信され、同じ送信元からの接続を持つ方法「連続接続はラウンドロビンのサーバにリダイレクトされ、「この接続を参照して、「サーバ。この「スティッキー接続は、 「限りという状態があるように存在することになる」 。状態は有効期限が切れると、そのスティッキラウンドロビンの次のWebサーバ」接続。そのホストからのさらなる接続はにリダイレクトされます」になります。このオプションを変更すると、 「ロードバランシングサービスを再起動します。"
+
+#: usr/local/www/system_advanced_misc.php:308
+#: usr/local/www/system_advanced_misc.php:327
+#: usr/local/www/system_advanced_misc.php:331
+#: usr/local/www/system_advanced_misc.php:378
+#: usr/local/www/system_advanced_misc.php:378
+msgid ""
+"Set the source tracking timeout for sticky connections. By default this is "
+"0, so source tracking is removed as soon as the state expires. Setting this "
+"timeout higher will cause the source/destination relationship to persist for "
+"longer periods of time."
+msgstr "「スティッキー接続の送信元の追跡のタイムアウトを設定します。デフォルトでは、これは「 0ため、ソースの追跡とすぐ状態が期限切れになったとして除去される。この設定は、より長い期間「タイムアウト高くして送信元/送信先の関係が持続することになります」 。"
+
+#: usr/local/www/system_advanced_misc.php:336
+#: usr/local/www/system_advanced_misc.php:355
+#: usr/local/www/system_advanced_misc.php:359
+#: usr/local/www/system_advanced_misc.php:367
+#: usr/local/www/system_advanced_misc.php:406
+#: usr/local/www/system_advanced_misc.php:414
+#: usr/local/www/system_advanced_misc.php:406
+#: usr/local/www/system_advanced_misc.php:414
+msgid "Hiadaptive"
+msgstr "Hiadaptive"
+
+#: usr/local/www/system_advanced_misc.php:337
+#: usr/local/www/system_advanced_misc.php:356
+#: usr/local/www/system_advanced_misc.php:360
+#: usr/local/www/system_advanced_misc.php:368
+#: usr/local/www/system_advanced_misc.php:407
+#: usr/local/www/system_advanced_misc.php:415
+#: usr/local/www/system_advanced_misc.php:407
+#: usr/local/www/system_advanced_misc.php:415
+msgid "Adaptive"
+msgstr "適応型"
+
+#: usr/local/www/system_advanced_misc.php:338
+#: usr/local/www/system_advanced_misc.php:357
+#: usr/local/www/system_advanced_misc.php:361
+#: usr/local/www/system_advanced_misc.php:369
+#: usr/local/www/system_advanced_misc.php:408
+#: usr/local/www/system_advanced_misc.php:416
+#: usr/local/www/system_advanced_misc.php:408
+#: usr/local/www/system_advanced_misc.php:416
+msgid "Minimum"
+msgstr "最小"
+
+#: usr/local/www/system_advanced_misc.php:339
+#: usr/local/www/system_advanced_misc.php:358
+#: usr/local/www/system_advanced_misc.php:362
+#: usr/local/www/system_advanced_misc.php:370
+#: usr/local/www/system_advanced_misc.php:409
+#: usr/local/www/system_advanced_misc.php:417
+#: usr/local/www/system_advanced_misc.php:409
+#: usr/local/www/system_advanced_misc.php:417
+msgid "Maximum"
+msgstr "最大"
+
+#: usr/local/www/system_advanced_misc.php:342
+#: usr/local/www/system_advanced_misc.php:361
+#: usr/local/www/system_advanced_misc.php:373
+#: usr/local/www/system_advanced_misc.php:420
+#: usr/local/www/system_advanced_misc.php:420
+msgid ""
+"The powerd utility monitors the system state and sets various power control "
+"options accordingly. It offers four modes (maximum, minimum, adaptive and "
+"hiadaptive) that can be individually selected while on AC power or "
+"batteries. The modes maximum, minimum, adaptive and hiadaptive may be "
+"abbreviated max, min, adp, hadp. Maximum mode chooses the highest "
+"performance values. Minimum mode selects the lowest performance values to "
+"get the most power savings. Adaptive mode attempts to strike a balance by "
+"degrading performance when the system appears idle and increasing it when "
+"the system is busy. It offers a good balance between a small performance "
+"loss for greatly increased power savings. Hiadaptive mode is alike adaptive "
+"mode, but tuned for systems where performance and interactivity are more "
+"importantthan power consumption. It rises frequency faster, drops slower "
+"andkeeps twice lower CPU load."
+msgstr "「パワードユーティリティは、システムの状態を監視し、様々な電力制御に設定」は、それに応じてオプションを。これは、バッテリー「個別のAC電源またはオンしながら、選択することができます( hiadaptive 4つのモード、最大値、最小値、適応と)」を提供しています。モード最大値、最小値、適応とhiadaptiveは「最大、最小、 ADP 、 hadpを短縮。最大モードは最高選ぶ」ことがパフォーマンス値を。最小モードが「最も節電効果が得られます。適応モードがでバランスを取るしようとした」に、最も低いパフォーマンス値を選択して、システムがアイドル状態の表示されたときにパフォーマンスを低下させると、システムがビジー状態のときに「それが大きくなる。これは、小さなパフォーマンスの間の良好なバランスを提供しています大幅に増加し、電力の節約のため」の損失。 Hiadaptiveモードを問わず、適応型」モードが、パフォーマンスとインタラクティブ性をよりアールシステム用に調整された」であるimportantthan消費電力。それは、周波数速く上昇し、遅くなる」 andkeeps倍低いCPU負荷が低下します。"
+
+#: usr/local/www/firewall_shaper_vinterface.php:204
+#: usr/local/www/firewall_shaper_vinterface.php:228
+#: usr/local/www/firewall_shaper_vinterface.php:205
+#: usr/local/www/firewall_shaper_vinterface.php:230
+#: usr/local/www/firewall_shaper_vinterface.php:205
+#: usr/local/www/firewall_shaper_vinterface.php:230
+msgid "You cannot name a child queue with the same name as a parent limiter"
+msgstr "あなたは、親リミッタと同じ名前の子キューに名前を付けることはできません"
+
+#: usr/local/www/diag_routes.php:72 usr/local/www/diag_routes.php:73
+#: usr/local/www/diag_routes.php:73
+msgid ""
+"By enabling name resolution, the query should take a bit longer. You can "
+"stop it at any time by clicking the Stop button in your browser."
+msgstr "名前解決を可能にすることにより、クエリは少し時間がかかるはずです。お使いのブラウザで、[停止]ボタンをクリックすると、いつでもそれを停止することができます。"
+
+#: usr/local/www/status_dhcpv6_leases.php:481
+#: usr/local/www/status_dhcpv6_leases.php:482
+#: usr/local/www/status_dhcpv6_leases.php:485
+#: usr/local/www/status_dhcpv6_leases.php:485
+msgid "IPv6 Prefix"
+msgstr "IPv6のプレフィックス"
+
+#: usr/local/www/services_captiveportal.php:465
+#: usr/local/www/services_captiveportal.php:463
+#: usr/local/www/services_captiveportal.php:481
+#: usr/local/www/services_captiveportal.php:481
+msgid ""
+"This setting limits the number of concurrent connections to the captive "
+"portal HTTP(S) server. This does not set how many users can be logged in to "
+"the captive portal, but rather how many users can load the portal page or "
+"authenticate at the same time! Possible setting allowed is: minimum 4 "
+"connections per client IP address, with a total maximum of 100 connections."
+msgstr "ポータルHTTP(S )サーバ「この設定では、キャプティブへの同時接続数を制限します」 。これはにログインできるユーザー数は設定しません」キャプティブポータルのではなく、どのように多くのユーザーがポータル·ページをロードしたりすることができ、「同じ時間に で認証!許可された可能性の設定は、次のとおりです。クライアントのIPアドレスごとに最小4 "の接続、 100接続の合計、最大。"
+
+#: usr/local/www/services_captiveportal.php:602
+#: usr/local/www/services_captiveportal.php:600
+#: usr/local/www/services_captiveportal.php:601
+#: usr/local/www/services_captiveportal.php:617
+#: usr/local/www/services_captiveportal.php:617
+msgid "RADIUS Protocol"
+msgstr "半径プロトコル"
+
+#: usr/local/www/services_captiveportal.php:611
+#: usr/local/www/services_captiveportal.php:609
+#: usr/local/www/services_captiveportal.php:610
+#: usr/local/www/services_captiveportal.php:626
+#: usr/local/www/services_captiveportal.php:626
+msgid "CHAP_MD5"
+msgstr "CHAP_MD5"
+
+#: usr/local/www/services_captiveportal.php:615
+#: usr/local/www/services_captiveportal.php:613
+#: usr/local/www/services_captiveportal.php:614
+#: usr/local/www/services_captiveportal.php:630
+#: usr/local/www/services_captiveportal.php:630
+msgid "MSCHAPv1"
+msgstr "MSCHAPv1の"
+
+#: usr/local/www/services_captiveportal.php:619
+#: usr/local/www/services_captiveportal.php:617
+#: usr/local/www/services_captiveportal.php:618
+#: usr/local/www/services_captiveportal.php:634
+#: usr/local/www/services_captiveportal.php:634
+msgid "MSCHAPv2"
+msgstr "MSCHAPv2の"
+
+#: usr/local/www/system_gateways_edit.php:389
+#: usr/local/www/system_gateways_edit.php:495
+#: usr/local/www/system_gateways_edit.php:497
+#: usr/local/www/system_gateways_edit.php:527
+#: usr/local/www/system_gateways_edit.php:527
+msgid "Choose the Internet Protocol this gateway uses."
+msgstr "このゲートウェイが使用するインターネットプロトコルを選択します。"
+
+#: usr/local/www/system_gateways_edit.php:490
+msgid ""
+"This defines how often that an icmp probe will be sent in seconds. Default "
+"is 1."
+msgstr "1である"これはどのくらいの頻度で、ICMPプローブは数秒で送信されることで、デフォルト定義」 。"
+
+#: usr/local/www/system_gateways_edit.php:491
+#: usr/local/www/system_gateways_edit.php:597
+#: usr/local/www/system_gateways_edit.php:601
+#: usr/local/www/system_gateways_edit.php:603
+#: usr/local/www/system_gateways_edit.php:633
+#: usr/local/www/system_gateways_edit.php:633
+msgid ""
+"NOTE: The quality graph is averaged over seconds, not intervals, so as the "
+"frequency probe is increased the accuracy of the quality graph is decreased."
+msgstr ""注:なるように品質のグラフは、秒ではなく、間隔にわたって平均化され、「高周波プローブ、品質グラフの精度を増加さが減少する。"
+
+#: usr/local/www/system_gateways_edit.php:500
+msgid ""
+"This defines the number of bad probes before the alarm will fire. Default is "
+"10."
+msgstr "「アラームが起動される前に、これは悪いプローブの数を定義します。デフォルトは "10 。"
+
+#: usr/local/www/system_gateways_edit.php:505
+msgid ""
+"NOTE: The total time before a gateway is down is the product of the "
+"Frequency Probe and the Down fields. By default this is 1*10=10 seconds."
+msgstr ""注:ゲートウェイの前に合計時間がダウンしているの産物である「高周波プローブと下のフィールド。デフォルトでは、 1 README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr 10 = 10秒です。"
+
+#: usr/local/www/status_gateways.php:100 usr/local/www/status_gateways.php:108
+#: usr/local/www/status_gateways.php:134
+#: usr/local/www/widgets/widgets/gateways.widget.php:73
+#: usr/local/www/widgets/widgets/gateways.widget.php:81
+#: usr/local/www/status_gateways.php:101 usr/local/www/status_gateways.php:109
+#: usr/local/www/status_gateways.php:135
+#: usr/local/www/widgets/widgets/gateways.widget.php:94
+#: usr/local/www/widgets/widgets/gateways.widget.php:103
+#: usr/local/www/widgets/widgets/gateways.widget.php:95
+#: usr/local/www/widgets/widgets/gateways.widget.php:104
+#: usr/local/www/widgets/widgets/gateways.widget.php:95
+#: usr/local/www/widgets/widgets/gateways.widget.php:104
+#: usr/local/www/status_gateways.php:101 usr/local/www/status_gateways.php:109
+#: usr/local/www/status_gateways.php:135
+msgid "Pending"
+msgstr "ペンディング"
+
+#: usr/local/www/status_gateways.php:140 usr/local/www/status_gateways.php:141
+#: usr/local/www/status_gateways.php:141
+msgid "Last check:"
+msgstr "最後のチェック:"
+
+#: usr/local/www/diag_dump_states.php:145
+#: usr/local/www/diag_dump_states.php:144
+msgid "Current state count"
+msgstr "現在の状態カウント"
+
+#: usr/local/www/diag_dump_states.php:147
+#: usr/local/www/diag_dump_states.php:146
+msgid "Matching filter"
+msgstr "マッチングフィルタ"
+
+#: usr/local/www/diag_dump_states.php:155
+#: usr/local/www/diag_dump_states.php:154
+#: usr/local/www/diag_dump_states.php:143
+#: usr/local/www/diag_dump_states.php:143
+msgid "Kill"
+msgstr "殺す"
+
+#: usr/local/www/services_dyndns.php:184 usr/local/www/services_dyndns.php:180
+#: usr/local/www/services_dyndns.php:180
+msgid ""
+"You can force an update for an IP address on the edit page for that service."
+msgstr "「あなたは、そのサービスの編集ページ上のIPアドレスの更新を強制することができます。"
+
+#: usr/local/www/vpn_openvpn_server.php:299
+#: usr/local/www/vpn_openvpn_server.php:300
+#: usr/local/www/vpn_openvpn_server.php:321
+#: usr/local/www/vpn_openvpn_server.php:321
+msgid ""
+"Using a tunnel network and server bridge settings together is not allowed."
+msgstr "「一緒にトンネルのネットワークとサーバのブリッジ設定を使用することは許可されていません。"
+
+#: usr/local/www/vpn_openvpn_server.php:302
+#: usr/local/www/vpn_openvpn_server.php:303
+#: usr/local/www/vpn_openvpn_server.php:324
+#: usr/local/www/vpn_openvpn_server.php:324
+msgid "Server Bridge DHCP Start and End must both be empty, or defined."
+msgstr "サーバー橋DHCP開始と終了の両方の空、または定義する必要があります。"
+
+#: usr/local/www/vpn_openvpn_server.php:304
+#: usr/local/www/vpn_openvpn_server.php:305
+#: usr/local/www/vpn_openvpn_server.php:326
+#: usr/local/www/vpn_openvpn_server.php:326
+msgid "Server Bridge DHCP Start must be an IPv4 address."
+msgstr "サーバー·ブリッジのDHCPの開始は、IPv4アドレスである必要があります。"
+
+#: usr/local/www/vpn_openvpn_server.php:306
+#: usr/local/www/vpn_openvpn_server.php:307
+#: usr/local/www/vpn_openvpn_server.php:328
+#: usr/local/www/vpn_openvpn_server.php:328
+msgid "Server Bridge DHCP End must be an IPv4 address."
+msgstr "サーバー·ブリッジのDHCPエンドは、IPv4アドレスである必要があります。"
+
+#: usr/local/www/vpn_openvpn_server.php:308
+#: usr/local/www/vpn_openvpn_server.php:309
+#: usr/local/www/vpn_openvpn_server.php:330
+#: usr/local/www/vpn_openvpn_server.php:330
+msgid "The Server Bridge DHCP range is invalid (start higher than end)."
+msgstr "サーバーブリッジDHCP範囲は(端部よりも高い開始)は無効です。"
+
+#: usr/local/www/vpn_openvpn_server.php:1084
+#: usr/local/www/vpn_openvpn_server.php:1112
+#: usr/local/www/vpn_openvpn_server.php:1139
+#: usr/local/www/vpn_openvpn_server.php:1139
+msgid "Bridge DHCP"
+msgstr "ブリッジDHCP"
+
+#: usr/local/www/vpn_openvpn_server.php:1094
+#: usr/local/www/vpn_openvpn_server.php:1122
+#: usr/local/www/vpn_openvpn_server.php:1149
+#: usr/local/www/vpn_openvpn_server.php:1149
+msgid "Allow clients on the bridge to obtain DHCP."
+msgstr "橋の上のクライアントがDHCPを取得することができます。"
+
+#: usr/local/www/vpn_openvpn_server.php:1102
+#: usr/local/www/vpn_openvpn_server.php:1130
+#: usr/local/www/vpn_openvpn_server.php:1157
+#: usr/local/www/vpn_openvpn_server.php:1157
+msgid "Bridge Interface"
+msgstr "ブリッジインターフェース"
+
+#: usr/local/www/vpn_openvpn_server.php:1124
+msgid ""
+"The interface to which this tap instance will be, bridged. This is not done "
+"automatically. You must assign this interface and create the bridge "
+"separately. This setting controls which existing IP address and subnet mask "
+"are used by OpenVPN for the bridge. Setting this to 'none' will cause the "
+"Server Bridge DHCP settings below to be ignored."
+msgstr "自動的に「このタップインスタンスが先となるインタフェースが、これは行われません架橋」 。あなたは、このインターフェイスを割り当て、 「別途既存のIPアドレスとサブネットマスクは、この設定を制御し「ブリッジ用のOpenVPNで使用されているが、ブリッジを作成する必要があります。' none'に、これを設定すると、以下の「サーバー·ブリッジDHCP設定が無視されるようになります。"
+
+#: usr/local/www/vpn_openvpn_server.php:1133
+#: usr/local/www/vpn_openvpn_server.php:1161
+#: usr/local/www/vpn_openvpn_server.php:1188
+#: usr/local/www/vpn_openvpn_server.php:1188
+msgid "Server Bridge DHCP Start"
+msgstr "サーバー·ブリッジのDHCPスタート"
+
+#: usr/local/www/vpn_openvpn_server.php:1137
+msgid ""
+"When using tap mode as multi-point server, you may optionally supply a DHCP "
+"range to use on the interface to which this tap instance is bridged. If "
+"these settings are left blank, DHCP will be passed through to the LAN, and "
+"the interface setting above will be ignored."
+msgstr "このタップインスタンスが架橋されているようにインターフェイス上で使用する範囲「マルチポイントサーバーとしてタップ·モードを使用するときは、必要に応じて、DHCPを供給することができる」 。場合は"これらの設定は空白のままに、 DHCPがLANに通過され、 「上記の設定インターフェイスは無視されます。"
+
+#: usr/local/www/vpn_openvpn_server.php:1146
+#: usr/local/www/vpn_openvpn_server.php:1174
+#: usr/local/www/vpn_openvpn_server.php:1201
+#: usr/local/www/vpn_openvpn_server.php:1201
+msgid "Server Bridge DHCP End"
+msgstr "サーバー·ブリッジのDHCP終了"
+
+#: usr/local/www/services_dhcp.php:239 usr/local/www/services_dhcpv6.php:216
+#: usr/local/www/services_router_advertisements.php:159
+#: usr/local/www/services_dhcp.php:285 usr/local/www/services_dhcpv6.php:201
+#: usr/local/www/services_dhcp_edit.php:230
+#: usr/local/www/services_dhcp.php:266 usr/local/www/services_dhcpv6.php:195
+#: usr/local/www/services_router_advertisements.php:154
+#: usr/local/www/services_dhcp.php:286
+#: usr/local/www/services_router_advertisements.php:154
+#: usr/local/www/services_dhcp_edit.php:230
+#: usr/local/www/services_dhcp.php:286 usr/local/www/services_dhcpv6.php:195
+msgid "A valid domain search list must be specified."
+msgstr "有効なドメイン検索リストを指定する必要があります。"
+
+#: usr/local/www/services_dhcp.php:685 usr/local/www/services_dhcp.php:861
+#: usr/local/www/services_dhcp_edit.php:427
+#: usr/local/www/services_dhcp.php:875 usr/local/www/services_dhcp.php:895
+#: usr/local/www/services_dhcp_edit.php:427
+#: usr/local/www/services_dhcp.php:895
+msgid ""
+"The DHCP server can optionally provide a domain search list. Use the "
+"semicolon character as seperator "
+msgstr "「 DHCPサーバは、必要に応じてドメイン検索リストを提供することができます。使用する」 SEPERATORとしてセミコロンを"
+
+#: usr/local/www/services_dhcp.php:735 usr/local/www/services_dhcpv6.php:716
+#: usr/local/www/services_dhcp.php:916 usr/local/www/services_dhcpv6.php:647
+#: usr/local/www/services_dhcp.php:930 usr/local/www/services_dhcpv6.php:664
+#: usr/local/www/services_dhcp.php:950 usr/local/www/services_dhcp.php:950
+#: usr/local/www/services_dhcpv6.php:664
+msgid "Time format change"
+msgstr "時刻形式の変更"
+
+#: usr/local/www/services_dhcp.php:744 usr/local/www/services_dhcp.php:925
+#: usr/local/www/services_dhcp.php:939 usr/local/www/services_dhcp.php:959
+#: usr/local/www/services_dhcp.php:959
+msgid "Change DHCP display lease time from UTC to local time."
+msgstr "UTCから現地時刻に、DHCPの表示リース時間を変更します。"
+
+#: usr/local/www/services_dhcp.php:751 usr/local/www/services_dhcp.php:932
+msgid ""
+"By default DHCP leases are displayed in UTC time. By checking this \n"
+"ttttttbox DHCP lease time will be displayed in local time and set to "
+"time zone selected. This will be used for all DHCP interfaces lease time."
+msgstr "「デフォルトのDHCPでリースはUTC時間で表示されます。この\nをチェックすることで「 ttttttboxのDHCPリース時間は、選択したタイムゾーン」を現地時間で表示され、設定されます。これは、すべてのDHCPインターフェイスのリース時間のために使用されます。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:92
+#: usr/local/www/load_balancer_virtual_server_edit.php:92
+msgid ""
+"The port must be an integer between 1 and 65535, a port alias, or left blank."
+msgstr "「ポートは1 〜65535の整数、ポートエイリアス、または左空白にする必要があります。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:95
+#: usr/local/www/load_balancer_virtual_server_edit.php:95
+#, php-format
+msgid "%s is not a valid IP address, IPv4 subnet, or alias."
+msgstr "%sは有効なIPアドレス、 IPv4サブネット、またはエイリアスではありません。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:97
+#: usr/local/www/load_balancer_virtual_server_edit.php:97
+#, php-format
+msgid "%s is a subnet containing more than 64 IP addresses."
+msgstr "%sは64以上のIPアドレスを含むサブネットです。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:173
+#: usr/local/www/load_balancer_virtual_server_edit.php:171
+#: usr/local/www/load_balancer_virtual_server_edit.php:171
+msgid ""
+"You may also specify a host alias listed in Firewall -&gt; Aliases here."
+msgstr "こちらu003eエイリアス - "あなたは、ファイアウォールに記載されているホストのエイリアスを指定することもできます。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:187
+#: usr/local/www/load_balancer_virtual_server_edit.php:185
+#: usr/local/www/load_balancer_virtual_server_edit.php:185
+msgid "If left blank, listening ports from the pool will be used."
+msgstr "プールからのポートが使用されます聞いて、空白のままにした場合。"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:188
+#: usr/local/www/load_balancer_pool_edit.php:216
+#: usr/local/www/load_balancer_virtual_server_edit.php:186
+#: usr/local/www/load_balancer_pool_edit.php:214
+#: usr/local/www/load_balancer_virtual_server_edit.php:186
+#: usr/local/www/load_balancer_pool_edit.php:214
+msgid ""
+"You may also specify a port alias listed in Firewall -&gt; Aliases here."
+msgstr "こちらu003eエイリアス - "あなたは、ファイアウォールに記載されているポートエイリアスを指定することもできます。"
+
+#: usr/local/www/system_hasync.php:96 usr/local/www/system_hasync.php:97
+#: usr/local/www/system_hasync.php:97
+msgid "High Availability Sync"
+msgstr "高可用性同期"
+
+#: usr/local/www/services_ntpd.php:86 usr/local/www/services_ntpd.php:92
+#: usr/local/www/services_ntpd.php:92
+msgid "NTP Server Configuration"
+msgstr "NTPサーバの設定"
+
+#: usr/local/www/interfaces_bridge_edit.php:391
+#: usr/local/www/interfaces_bridge_edit.php:392
+#: usr/local/www/interfaces_bridge_edit.php:393
+#: usr/local/www/interfaces_bridge_edit.php:396
+#: usr/local/www/interfaces_bridge_edit.php:396
+msgid ""
+"Set the Spanning Tree priority of interface to value. The default is 128. "
+"The minimum is 0 and the maximum is 240. Increments of 16."
+msgstr "「値へのインターフェイスのスパニングツリー優先度を設定します。デフォルトは128です。 「最小値は0で、最大値は240です。 16ずつ増加。"
+
+#: usr/local/www/diag_packet_capture.php:172
+#: usr/local/www/diag_packet_capture.php:219
+#: usr/local/www/diag_packet_capture.php:235
+#: usr/local/www/diag_packet_capture.php:235
+msgid "Select the protocol to capture, or Any."
+msgstr "キャプチャするプロトコル、またはすべてを選択します。"
+
+#: usr/local/www/diag_packet_capture.php:245
+#: usr/local/www/diag_packet_capture.php:292
+#: usr/local/www/diag_packet_capture.php:310
+#: usr/local/www/diag_packet_capture.php:310
+msgid "View Capture"
+msgstr "ビューキャプチャー"
+
+#: usr/local/www/system_camanager.php:420
+#: usr/local/www/system_camanager.php:427
+#: usr/local/www/system_camanager.php:427
+msgid "Serial for next certificate"
+msgstr "次の証明書のシリアル"
+
+#: usr/local/www/system_camanager.php:423
+#: usr/local/www/system_camanager.php:430
+#: usr/local/www/system_camanager.php:430
+msgid ""
+"Enter a decimal number to be used as the serial number for the next "
+"certificate to be created using this CA."
+msgstr "このCAを使用して作成される証明書の「次のシリアル番号として使用される進数を入力してください」 。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:140
+#: usr/local/www/vpn_ipsec_phase2.php:141
+#: usr/local/www/vpn_ipsec_phase2.php:163
+#: usr/local/www/vpn_ipsec_phase2.php:145
+#: usr/local/www/vpn_ipsec_phase2.php:171
+#: usr/local/www/vpn_ipsec_phase2.php:145
+#: usr/local/www/vpn_ipsec_phase2.php:171
+msgid "Invalid Local Network."
+msgstr "無効なローカルネットワーク。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:140
+#: usr/local/www/vpn_ipsec_phase2.php:141
+#: usr/local/www/vpn_ipsec_phase2.php:163
+#: usr/local/www/vpn_ipsec_phase2.php:145
+#: usr/local/www/vpn_ipsec_phase2.php:171
+#: usr/local/www/vpn_ipsec_phase2.php:145
+#: usr/local/www/vpn_ipsec_phase2.php:171
+msgid "has no subnet."
+msgstr "何のサブネットがありません。"
+
+#: usr/local/www/firewall_nat_edit.php:233
+#: usr/local/www/firewall_nat_edit.php:238
+#: usr/local/www/firewall_nat_edit.php:243
+#: usr/local/www/firewall_nat_edit.php:243
+#, php-format
+msgid ""
+"A valid local port must be specified. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr "「有効なローカルポートを指定する必要があります。これは、ポートエイリアスまたは整数でなければなりません "1 〜65535の間。"
+
+#: usr/local/www/firewall_nat_edit.php:793
+#: usr/local/www/firewall_nat_edit.php:792
+#: usr/local/www/firewall_nat_edit.php:787
+#: usr/local/www/firewall_nat_edit.php:799
+#: usr/local/www/firewall_nat_edit.php:800
+#: usr/local/www/firewall_nat_edit.php:800
+msgid "Use system default"
+msgstr "システムのデフォルトを使用します。"
+
+#: usr/local/www/interfaces.php:463 usr/local/www/interfaces.php:460
+#: usr/local/www/interfaces.php:448 usr/local/www/interfaces.php:453
+#: usr/local/www/interfaces.php:449 usr/local/www/interfaces.php:449
+msgid ""
+"This interface is referenced by IPv4 VIPs. Please delete those before "
+"setting the interface to 'none' configuration."
+msgstr "「このインタフェースは、IPv4のVIPから参照されている。前に、これらを削除してください"'none'に設定にインターフェイスを設定する。"
+
+#: usr/local/www/interfaces.php:516 usr/local/www/interfaces.php:513
+#: usr/local/www/interfaces.php:501 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:502 usr/local/www/interfaces.php:502
+msgid ""
+"This interface is referenced by IPv6 VIPs. Please delete those before "
+"setting the interface to 'none' configuration."
+msgstr "「このインタフェースは、IPv6のVIPから参照されている。前に、これらを削除してください"'none'に設定にインターフェイスを設定する。"
+
+#: usr/local/www/interfaces.php:526 usr/local/www/interfaces.php:523
+#: usr/local/www/interfaces.php:511
+#, php-format
+msgid "You can only have one interface configured as %s or 6to4."
+msgstr "あなただけの1インタフェースが%sや6to4のように構成することができます。"
+
+#: usr/local/www/interfaces.php:536 usr/local/www/interfaces.php:533
+#: usr/local/www/interfaces.php:521
+#, php-format
+msgid "You can only have one interface configured as %s or 6rd."
+msgstr "あなただけの1インタフェースが%sまたは6RDとして設定することができます。"
+
+#: usr/local/www/interfaces.php:549 usr/local/www/interfaces.php:546
+#: usr/local/www/interfaces.php:534 usr/local/www/interfaces.php:541
+#: usr/local/www/interfaces.php:537 usr/local/www/interfaces.php:537
+msgid "You must enter a valid hexadecimal number for the IPv6 prefix ID."
+msgstr "あなたは、 IPv6プレフィックスIDに対して有効な16進数を入力する必要があります。"
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:550
+#: usr/local/www/interfaces.php:538 usr/local/www/interfaces.php:545
+#: usr/local/www/interfaces.php:541 usr/local/www/interfaces.php:541
+msgid "You specified an IPv6 prefix ID that is out of range."
+msgstr "あなたが範囲外ですIPv6プレフィックスIDを指定。"
+
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1107
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1158 usr/local/www/interfaces.php:1158
+msgid "SLAAC"
+msgstr "SLAAC"
+
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1107
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1158 usr/local/www/interfaces.php:1158
+msgid "6rd Tunnel"
+msgstr "6RDトンネル"
+
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1107
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1158 usr/local/www/interfaces.php:1158
+msgid "6to4 Tunnel"
+msgstr "の6to4トンネル"
+
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1107
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1158 usr/local/www/interfaces.php:1158
+msgid "Track Interface"
+msgstr "トラックインターフェイス"
+
+#: usr/local/www/interfaces.php:1411 usr/local/www/interfaces.php:1399
+#: usr/local/www/interfaces.php:1412 usr/local/www/interfaces.php:1455
+#: usr/local/www/interfaces.php:1450 usr/local/www/interfaces.php:1450
+msgid ""
+"If you leave this field blank, the adapter's default MTU will be used. This "
+"is typically 1500 bytes but can vary in some circumstances."
+msgstr "「このフィールドを空白のままにすると、アダプタのデフォルトのMTUが使用されます。これは、「通常、 1500バイトですが、いくつかの状況で変化することができる。"
+
+#: usr/local/www/interfaces.php:1768 usr/local/www/interfaces.php:1756
+#: usr/local/www/interfaces.php:1774 usr/local/www/interfaces.php:1820
+#: usr/local/www/interfaces.php:1812 usr/local/www/interfaces.php:1812
+msgid "6RD Configuration"
+msgstr "6RDのRapid Deployment"
+
+#: usr/local/www/interfaces.php:1771 usr/local/www/interfaces.php:1759
+#: usr/local/www/interfaces.php:1777 usr/local/www/interfaces.php:1823
+#: usr/local/www/interfaces.php:1815 usr/local/www/interfaces.php:1815
+msgid "6RD prefix"
+msgstr "6RDプレフィックス"
+
+#: usr/local/www/interfaces.php:1775 usr/local/www/interfaces.php:1763
+#: usr/local/www/interfaces.php:1781 usr/local/www/interfaces.php:1827
+#: usr/local/www/interfaces.php:1819 usr/local/www/interfaces.php:1819
+msgid ""
+"The value in this field is the 6RD IPv6 prefix assigned by your ISP. e.g. "
+"'2001:db8::/32'"
+msgstr ""このフィールドの値は、 ISPから割り当てられた6RD IPv6プレフィックスであるなど。 「'2001 : DB8:: / 32 」"
+
+#: usr/local/www/interfaces.php:1779 usr/local/www/interfaces.php:1767
+#: usr/local/www/interfaces.php:1785 usr/local/www/interfaces.php:1831
+#: usr/local/www/interfaces.php:1823 usr/local/www/interfaces.php:1823
+msgid "6RD Border Relay"
+msgstr "6RDボーダーリレー"
+
+#: usr/local/www/interfaces.php:1783 usr/local/www/interfaces.php:1771
+#: usr/local/www/interfaces.php:1789 usr/local/www/interfaces.php:1835
+#: usr/local/www/interfaces.php:1827 usr/local/www/interfaces.php:1827
+msgid ""
+"The value in this field is 6RD IPv4 gateway address assigned by your ISP"
+msgstr ""このフィールドの値は、 ISPから割り当てられた6RD IPv4ゲートウェイアドレスです"
+
+#: usr/local/www/interfaces.php:1787 usr/local/www/interfaces.php:1775
+#: usr/local/www/interfaces.php:1793 usr/local/www/interfaces.php:1839
+#: usr/local/www/interfaces.php:1831 usr/local/www/interfaces.php:1831
+msgid "6RD IPv4 Prefix length"
+msgstr "6RD IPv4のプレフィックス長"
+
+#: usr/local/www/interfaces.php:1799 usr/local/www/interfaces.php:1787
+#: usr/local/www/interfaces.php:1805 usr/local/www/interfaces.php:1851
+#: usr/local/www/interfaces.php:1843 usr/local/www/interfaces.php:1843
+msgid ""
+"The value in this field is the 6RD IPv4 prefix length. Normally specified by "
+"the ISP. A value of 0 means we embed the entire IPv4 address in the 6RD "
+"prefix."
+msgstr ""このフィールドの値は6RDのIPv4プレフィックス長である。通常で指定された「ISP 。 0の値は、我々が6RD "接頭全体のIPv4アドレスを埋め込むことを意味します。"
+
+#: usr/local/www/interfaces.php:1809 usr/local/www/interfaces.php:1797
+#: usr/local/www/interfaces.php:1818 usr/local/www/interfaces.php:1864
+#: usr/local/www/interfaces.php:1856 usr/local/www/interfaces.php:1856
+msgid "Track IPv6 Interface"
+msgstr "トラックIPv6インタフェース"
+
+#: usr/local/www/interfaces.php:1812 usr/local/www/interfaces.php:1800
+#: usr/local/www/interfaces.php:1821 usr/local/www/interfaces.php:1867
+#: usr/local/www/interfaces.php:1859 usr/local/www/interfaces.php:1859
+msgid "IPv6 Interface"
+msgstr "IPv6インタフェース"
+
+#: usr/local/www/interfaces.php:1838 usr/local/www/interfaces.php:1826
+#: usr/local/www/interfaces.php:1847 usr/local/www/interfaces.php:1893
+#: usr/local/www/interfaces.php:1885 usr/local/www/interfaces.php:1885
+msgid "This selects the dynamic IPv6 WAN interface to track for configuration"
+msgstr "これは、構成のために追跡するために、動的なIPv6のWANインターフェイスを選択し、"
+
+#: usr/local/www/interfaces.php:1842 usr/local/www/interfaces.php:1830
+#: usr/local/www/interfaces.php:1851 usr/local/www/interfaces.php:1897
+#: usr/local/www/interfaces.php:1889 usr/local/www/interfaces.php:1889
+msgid "IPv6 Prefix ID"
+msgstr "IPv6のプレフィックス番号"
+
+#: usr/local/www/interfaces.php:1853 usr/local/www/interfaces.php:1841
+#: usr/local/www/interfaces.php:1862 usr/local/www/interfaces.php:1908
+#: usr/local/www/interfaces.php:1898 usr/local/www/interfaces.php:1898
+msgid ""
+"The value in this field is the (Delegated) IPv6 prefix ID. This determines "
+"the configurable network ID based on the dynamic IPv6 connection"
+msgstr ""このフィールドの値は、 (委任) IPv6プレフィックスIDです。これが決定「動的なIPv6接続に基づいて構成可能なネットワークIDを"
+
+#: usr/local/www/interfaces.php:1855 usr/local/www/interfaces.php:1843
+#: usr/local/www/interfaces.php:1864 usr/local/www/interfaces.php:1910
+#, php-format
+msgid ""
+"Enter a <b>hexadecimal</b> value between %x and %x here, or leave blank."
+msgstr ""% xと% Xここ間u003cBu003e進u003c / bu003eの値を入力するか、空白のままにします。"
+
+#: usr/local/www/interfaces.php:2356 usr/local/www/interfaces.php:2344
+#: usr/local/www/interfaces.php:2374 usr/local/www/interfaces.php:2420
+#: usr/local/www/interfaces.php:2409 usr/local/www/interfaces.php:2409
+msgid ""
+"Note: Only required in Access Point mode. If left blank in Ad-hoc or "
+"Infrastructure mode, this interface will connect to any available SSID"
+msgstr "「注:専用アクセスポイントモードで必要とアドホックまたはに空白のままにした場合、「インフラストラクチャモードでは、このインタフェースが利用可能な任意のSSIDに接続します"
+
+#: usr/local/www/interfaces.php:2576 usr/local/www/interfaces.php:2564
+#: usr/local/www/interfaces.php:2594 usr/local/www/interfaces.php:2640
+#: usr/local/www/interfaces.php:2629 usr/local/www/interfaces.php:2629
+msgid "Secondary 802.1X Authentication Server IP Address"
+msgstr "二次802.1X認証サーバーのIPアドレス"
+
+#: usr/local/www/interfaces.php:2583 usr/local/www/interfaces.php:2571
+#: usr/local/www/interfaces.php:2601 usr/local/www/interfaces.php:2647
+#: usr/local/www/interfaces.php:2636 usr/local/www/interfaces.php:2636
+msgid "Secondary 802.1X Authentication Server Port"
+msgstr "二次802.1X認証サーバーポート"
+
+#: usr/local/www/interfaces.php:2590 usr/local/www/interfaces.php:2578
+#: usr/local/www/interfaces.php:2608 usr/local/www/interfaces.php:2654
+#: usr/local/www/interfaces.php:2643 usr/local/www/interfaces.php:2643
+msgid "Secondary 802.1X Authentication Server Shared Secret"
+msgstr "二次802.1X認証サーバー共有シークレット"
+
+#: usr/local/www/vpn_openvpn_client.php:196
+#: usr/local/www/vpn_openvpn_client.php:202
+#: usr/local/www/vpn_openvpn_client.php:220
+#: usr/local/www/vpn_openvpn_client.php:220
+msgid "The bandwidth limit must be a positive numeric value."
+msgstr "帯域幅の制限は、正の数値でなければなりません。"
+
+#: usr/local/www/load_balancer_pool_edit.php:89
+#: usr/local/www/load_balancer_pool_edit.php:89
+msgid "The port must be an integer between 1 and 65535, or a port alias."
+msgstr "ポートは1 〜65535の整数、またはポートエイリアスでなければなりません。"
+
+#: usr/local/www/load_balancer_pool_edit.php:98
+#: usr/local/www/load_balancer_pool_edit.php:98
+#, php-format
+msgid "%s is not a valid IP address or IPv4 subnet (in "enabled" list)."
+msgstr "%sは( 「有効」リスト中の)有効なIPアドレスまたはIPv4サブネットではありません。"
+
+#: usr/local/www/load_balancer_pool_edit.php:101
+#: usr/local/www/load_balancer_pool_edit.php:101
+#, php-format
+msgid ""
+"%s is a subnet containing more than 64 IP addresses (in "enabled" list)."
+msgstr ""(許可」リスト%sは中) 64以上のIPアドレスを含むサブネットである」 。"
+
+#: usr/local/www/load_balancer_pool_edit.php:108
+#: usr/local/www/load_balancer_pool_edit.php:108
+#, php-format
+msgid "%s is not a valid IP address or IPv4 subnet (in "disabled" list)."
+msgstr "%sは( 「無効」リスト中の)有効なIPアドレスまたはIPv4サブネットではありません。"
+
+#: usr/local/www/load_balancer_pool_edit.php:111
+#: usr/local/www/load_balancer_pool_edit.php:111
+#, php-format
+msgid ""
+"%s is a subnet containing more than 64 IP addresses (in "disabled" list)."
+msgstr ""(禁止」リスト%sは中) 64以上のIPアドレスを含むサブネットである」 。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:153
+#: usr/local/www/firewall_virtual_ip_edit.php:152
+#: usr/local/www/firewall_virtual_ip_edit.php:144
+#: usr/local/www/firewall_virtual_ip_edit.php:160
+#: usr/local/www/firewall_virtual_ip_edit.php:160
+#, php-format
+msgid ""
+"VHID %s is already in use on interface %s. Pick a unique number on this "
+"interface."
+msgstr "インターフェース「 VHIDの%sがインターフェイス上ですでに使用中は、この上で一意の番号を選んで%s. 」 。"
+
+#: usr/local/www/services_snmp.php:391 usr/local/www/services_snmp.php:392
+#: usr/local/www/services_snmp.php:407 usr/local/www/services_snmp.php:407
+msgid "Interface Binding"
+msgstr "インターフェイスのバインド"
+
+#: usr/local/www/services_snmp.php:396 usr/local/www/services_snmp.php:397
+#: usr/local/www/services_snmp.php:412 usr/local/www/services_snmp.php:412
+msgid "Bind Interface"
+msgstr "バインドインターフェイス"
+
+#: usr/local/www/widgets/widgets/smart_status.widget.php:36
+#: usr/local/www/widgets/widgets/smart_status.widget.php:37
+#: usr/local/www/widgets/widgets/smart_status.widget.php:37
+msgid "Drive"
+msgstr "ドライブ"
+
+#: usr/local/www/widgets/widgets/smart_status.widget.php:37
+#: usr/local/www/widgets/widgets/smart_status.widget.php:38
+#: usr/local/www/widgets/widgets/smart_status.widget.php:38
+msgid "Ident"
+msgstr "IDENT"
+
+#: usr/local/www/system.php:418 usr/local/www/system.php:411
+#: usr/local/www/system.php:409 usr/local/www/system.php:409
+msgid "Language"
+msgstr "言語"
+
+#: usr/local/www/system.php:431 usr/local/www/system.php:424
+#: usr/local/www/system.php:422 usr/local/www/system.php:422
+msgid "Choose a language for the webConfigurator"
+msgstr "webConfiguratorの言語を選択"
+
+#: usr/local/www/firewall_virtual_ip.php:118
+#: usr/local/www/firewall_virtual_ip.php:115
+#: usr/local/www/firewall_virtual_ip.php:127
+#: usr/local/www/firewall_virtual_ip.php:150
+#: usr/local/www/firewall_virtual_ip.php:150
+msgid ""
+"This entry cannot be deleted because it is still referenced by a CARP IP "
+"with the description"
+msgstr "説明に「それはまだCARP IPによって参照されているため、このエントリは削除できません」"
+
+#: usr/local/www/firewall_virtual_ip.php:124
+#: usr/local/www/firewall_virtual_ip.php:121
+#: usr/local/www/firewall_virtual_ip.php:132
+#: usr/local/www/firewall_virtual_ip.php:155
+#: usr/local/www/firewall_virtual_ip.php:155
+msgid ""
+"This entry cannot be deleted because it is still referenced by an IP alias "
+"entry with the description"
+msgstr "記述のエントリ「それはまだIPエイリアスによって参照されているため、このエントリは削除できません」"
+
+#: usr/local/www/services_dhcpv6.php:531
+#: usr/local/www/services_router_advertisements.php:277
+#: usr/local/www/services_router_advertisements.php:272
+#: usr/local/www/services_router_advertisements.php:272
+#, php-format
+msgid "Select the Operating Mode for the Router Advertisement (RA) Daemon."
+msgstr "ルーター通知(RA )デーモンのための動作モードを選択します。"
+
+#: usr/local/www/services_dhcpv6.php:532
+#: usr/local/www/services_router_advertisements.php:278
+#: usr/local/www/services_router_advertisements.php:273
+#: usr/local/www/services_router_advertisements.php:273
+#, php-format
+msgid ""
+"Use "Router Only" to only advertise this router, "Unmanaged" for Router "
+"Advertising with Stateless Autoconfig, "Managed" for assignment through "
+"(a) DHCPv6 Server, "Assisted" for DHCPv6 Server assignment combined with "
+"Stateless Autoconfig"
+msgstr "を通じて割り当てに「管理」 、ステートレス自動設定と広告「ルータのために」 」 、宣伝だけに、このルータを「ステートレス自動設定」と組み合わせたDHCPv6サーバの割り当てのための「支援」 ( A ) DHCPv6サーバを、 「管理対象外のルータ"を使用」"
+
+#: usr/local/www/services_dhcpv6.php:533
+#: usr/local/www/services_router_advertisements.php:279
+#: usr/local/www/services_router_advertisements.php:274
+#: usr/local/www/services_router_advertisements.php:274
+#, php-format
+msgid ""
+"It is not required to activate this DHCPv6 server when set to "Managed", "
+"this can be another host on the network"
+msgstr "マネージド」に設定すると、このDHCPv6サーバを活性化するために必要とされていない""、 "これは、ネットワーク上の別のホストになることができます"
+
+#: usr/local/www/services_dhcpv6.php:537
+#: usr/local/www/services_router_advertisements.php:283
+#: usr/local/www/services_router_advertisements.php:278
+#: usr/local/www/services_router_advertisements.php:278
+msgid "Router Priority"
+msgstr "ルータプライオリティ"
+
+#: usr/local/www/services_dhcpv6.php:544
+#: usr/local/www/services_router_advertisements.php:290
+#: usr/local/www/services_router_advertisements.php:285
+#: usr/local/www/services_router_advertisements.php:285
+#, php-format
+msgid "Select the Priority for the Router Advertisement (RA) Daemon."
+msgstr "ルーター通知(RA )デーモンのための優先度を選択します。"
+
+#: usr/local/www/services_dhcpv6.php:558
+#: usr/local/www/services_router_advertisements.php:304
+#: usr/local/www/services_router_advertisements.php:299
+#: usr/local/www/services_router_advertisements.php:299
+msgid "RA Interface"
+msgstr "RAインタフェース"
+
+#: usr/local/www/services_dhcpv6.php:566
+#: usr/local/www/services_router_advertisements.php:312
+#: usr/local/www/services_router_advertisements.php:307
+#: usr/local/www/services_router_advertisements.php:307
+#, php-format
+msgid "Select the Interface for the Router Advertisement (RA) Daemon."
+msgstr "ルーター通知(RA )デーモンのためのインターフェイスを選択します。"
+
+#: usr/local/www/services_dhcpv6.php:653 usr/local/www/services_dhcpv6.php:584
+msgid "prefix delegation size"
+msgstr "接頭語委譲サイズ"
+
+#: usr/local/www/services_dhcpv6.php:662 usr/local/www/services_dhcpv6.php:593
+#: usr/local/www/services_dhcpv6.php:610 usr/local/www/services_dhcpv6.php:610
+msgid ""
+"You can define a Prefix range here for DHCP Prefix Delegation. This allows "
+"for \n"
+"tttttassigning networks to subrouters. The start and end of the range "
+"must end on boundaries of the prefix delegation size."
+msgstr "\nは、「あなたは、DHCPプレフィックス委任のためにここプレフィックス範囲を定義することができます。これができる「 」 subroutersにtttttassigningネットワーク。範囲​​の始めと終わりは「プレフィックス委任サイズの境界で終わっていなければなりません。"
+
+#: usr/local/www/services_dhcpv6.php:685 usr/local/www/services_dhcpv6.php:616
+#: usr/local/www/services_dhcpv6.php:633 usr/local/www/services_dhcpv6.php:633
+msgid ""
+"The DHCP server can optionally provide a domain search list. Use the "
+"semicolon character as seperator"
+msgstr "「 DHCPサーバは、必要に応じてドメイン検索リストを提供することができます。使用する」 SEPERATORとしてセミコロンを"
+
+#: usr/local/www/services_dhcpv6.php:725 usr/local/www/services_dhcpv6.php:656
+#: usr/local/www/services_dhcpv6.php:673 usr/local/www/services_dhcpv6.php:673
+msgid "Change DHCPv6 display lease time from UTC to local time."
+msgstr "UTCから現地時刻にDHCPv6の表示リース時間を変更します。"
+
+#: usr/local/www/services_dhcpv6.php:732 usr/local/www/services_dhcpv6.php:663
+#: usr/local/www/services_dhcpv6.php:680 usr/local/www/services_dhcpv6.php:680
+msgid ""
+"By default DHCPv6 leases are displayed in UTC time. By checking this \n"
+"ttttttbox DHCPv6 lease time will be displayed in local time and set to "
+"time zone selected. This will be used for all DHCPv6 interfaces lease time."
+msgstr "「デフォルトでのDHCPv6リースはUTC時間で表示されます。この\nをチェックすることで「 ttttttboxのDHCPv6のリース時間は現地時間で表示され、選択された "タイムゾーンに設定されます。これは、すべてのDHCPv6インターフェイスのリース時間のために使用されます。"
+
+#: etc/inc/priv.defs.inc:64 etc/inc/priv.defs.inc:64
+msgid "WebCfg - Diagnostics: Sockets page"
+msgstr "WebCfg - 診断:ソケットページ"
+
+#: etc/inc/priv.defs.inc:65 etc/inc/priv.defs.inc:65
+msgid "Allow access to the 'Diagnostics: Sockets' page."
+msgstr "ページ:'ソケットの診断」へのアクセスを許可します。"
+
+#: etc/inc/config.console.inc:263 etc/inc/config.console.inc:263
+#, php-format
+msgid ""
+"%sEnter the Optional %s interface name or 'a' for auto-detection%s(or "
+"nothing if finished):%s"
+msgstr "「 (何も終わっている場合オプション%sインターフェイス名または''自動detection%sまたは) %sEnter ": %s"
+
+#: etc/inc/shaper.inc:2909 etc/inc/shaper.inc:2910 etc/inc/shaper.inc:2915
+#: etc/inc/shaper.inc:2983 etc/inc/shaper.inc:3041
+#, php-format
+msgid "Bandwidth for schedule %s must be an integer."
+msgstr "スケジュール%sのための帯域幅は、整数でなければなりません。"
+
+#: etc/inc/shaper.inc:2915 etc/inc/shaper.inc:2916 etc/inc/shaper.inc:2921
+#: etc/inc/shaper.inc:2989 etc/inc/shaper.inc:3047
+msgid "You need to specify a schedule for every additional entry"
+msgstr "あなたはすべての追加のエントリのスケジュールを指定する必要があります"
+
+#: etc/inc/shaper.inc:2917 etc/inc/shaper.inc:2918 etc/inc/shaper.inc:2923
+#: etc/inc/shaper.inc:2991 etc/inc/shaper.inc:3049
+msgid "If more than one bandwidth configured all schedules need to be selected"
+msgstr "複数の帯域幅が設定されている場合、すべてのスケジュールを選択する必要が"
+
+#: etc/inc/shaper.inc:2919 etc/inc/shaper.inc:2920 etc/inc/shaper.inc:2925
+#: etc/inc/shaper.inc:2993 etc/inc/shaper.inc:3051
+msgid "At least one bw specification is necessary"
+msgstr "少なくとも一つの体重仕様が必要である"
+
+#: etc/inc/shaper.inc:3200 etc/inc/shaper.inc:3201 etc/inc/shaper.inc:3208
+#: etc/inc/shaper.inc:3276 etc/inc/shaper.inc:3332
+msgid "add another schedule"
+msgstr "他のスケジュールを追加"
+
+#: etc/inc/functions.inc:94 etc/inc/functions.inc:94
+msgid "Acknowledge All Notices"
+msgstr "すべての通知を認める"
+
+#: etc/inc/functions.inc:95 etc/inc/functions.inc:95
+msgid "Click to Acknowledge"
+msgstr "確認する]をクリックします"
+
+#: etc/inc/functions.inc:113 etc/inc/functions.inc:113
+msgid "unread notice"
+msgstr "未読の通知"
+
+#: etc/inc/functions.inc:115 etc/inc/functions.inc:115
+msgid "unread notices"
+msgstr "未読の通知"
+
+#: etc/inc/service-utils.inc:234 etc/inc/service-utils.inc:233
+#: etc/inc/service-utils.inc:250 etc/inc/service-utils.inc:250
+msgid "Router Advertisement Daemon"
+msgstr "ルータ通知デーモン"
+
+#: etc/inc/service-utils.inc:313 etc/inc/service-utils.inc:312
+#: etc/inc/service-utils.inc:329 etc/inc/service-utils.inc:329
+msgid "RIP Daemon"
+msgstr "RIPデーモン"
+
+#: etc/inc/service-utils.inc:413 etc/inc/service-utils.inc:422
+#: etc/inc/service-utils.inc:412 etc/inc/service-utils.inc:421
+#: etc/inc/service-utils.inc:429 etc/inc/service-utils.inc:439
+#: etc/inc/service-utils.inc:432 etc/inc/service-utils.inc:442
+#: etc/inc/service-utils.inc:432 etc/inc/service-utils.inc:442
+#, php-format
+msgid "%s Service is"
+msgstr "%sサービスです"
+
+#: etc/inc/service-utils.inc:447 etc/inc/service-utils.inc:446
+#: etc/inc/service-utils.inc:464 etc/inc/service-utils.inc:467
+#: etc/inc/service-utils.inc:467
+#, php-format
+msgid "Restart %sService"
+msgstr "リスタート%sService"
+
+#: etc/inc/service-utils.inc:458 etc/inc/service-utils.inc:457
+#: etc/inc/service-utils.inc:475 etc/inc/service-utils.inc:478
+#: etc/inc/service-utils.inc:478
+#, php-format
+msgid "Stop %sService"
+msgstr "ストップ%sService"
+
+#: etc/inc/service-utils.inc:471 etc/inc/service-utils.inc:470
+#: etc/inc/service-utils.inc:491 etc/inc/service-utils.inc:494
+#: etc/inc/service-utils.inc:494
+#, php-format
+msgid "Start %sService"
+msgstr "%sServiceを開始"
+
+#: etc/inc/filter.inc:2993 etc/inc/filter.inc:3079 etc/inc/filter.inc:3103
+#: etc/inc/filter.inc:3108 etc/inc/filter.inc:3103
+msgid "Removed 15 minute filter reload for Time Based Rules"
+msgstr "時間ベースのルールのために取り外さ15分のフィルターリロード"
+
+#: usr/local/www/pkg_mgr.php:193 usr/local/www/pkg_mgr.php:196
+#: usr/local/www/pkg_mgr.php:212
+msgid "Click on package name to access its website."
+msgstr "同社のウェブサイトにアクセスするには、パッケージ名をクリックします。"
+
+#: usr/local/www/diag_logs_settings.php:276
+#: usr/local/www/diag_logs_settings.php:276
+msgid "Show the applied rule description below or in the firewall log rows."
+msgstr "ファイアウォールのログの行の下または中の適用ルールの説明を表示します。"
+
+#: usr/local/www/diag_logs_settings.php:278
+#: usr/local/www/diag_logs_settings.php:278
+msgid ""
+"Displaying rule descriptions for all lines in the log might affect "
+"performance with large rulessets."
+msgstr "大rulessetsによるパフォーマンスの「ログ内のすべての行のルールの説明を表示すると、影響を与える可能性があります」 。"
+
+#: usr/local/www/fbegin.inc:152 usr/local/www/fbegin.inc:144
+#: usr/local/www/fbegin.inc:144
+msgid "DHCPv6 Server/RA"
+msgstr "DHCPv6サーバ/ RA"
+
+#: usr/local/www/fbegin.inc:232 usr/local/www/diag_sockets.php:44
+#: usr/local/www/fbegin.inc:224 usr/local/www/fbegin.inc:224
+#: usr/local/www/diag_sockets.php:44
+msgid "Sockets"
+msgstr "ソケット"
+
+#: usr/local/www/fbegin.inc:419 usr/local/www/fbegin.inc:411
+#: usr/local/www/fbegin.inc:411
+msgid "Help for items on this page"
+msgstr "このページの項目のヘルプ"
+
+#: usr/local/www/system_groupmanager.php:472
+#: usr/local/www/system_groupmanager.php:422
+#: usr/local/www/system_groupmanager.php:422
+msgid ""
+"Additional webConfigurator groups can be added here. \n"
+"tttttttttGroup permissions can be assigned which are inherited by "
+"users who are members of the group.\n"
+"tttttttttAn icon that appears grey indicates that it is a system "
+"defined object.\n"
+"tttttttttSome system object properties can be modified but they "
+"cannot be deleted."
+msgstr "「追加webConfiguratorグループは、ここで追加することができます。 \n 」 tttttttttGroup許可が灰色、それがシステム」に定義されたオブジェクトであることを示して表示されtttttttttAnアイコン」 group.\nのメンバーであるユーザー」に継承されて割り当てることができます。 \n 「 tttttttttSomeシステムオブジェクトのプロパティを変更できますが、それらは「削除できません。"
+
+#: usr/local/www/services_dnsmasq_edit.php:216
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+#: usr/local/www/services_dnsmasq_edit.php:216
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+msgid "or"
+msgstr "または"
+
+#: usr/local/www/services_dhcpv6_edit.php:204
+#: usr/local/www/services_dhcpv6_edit.php:207
+#: usr/local/www/services_dhcpv6_edit.php:207
+msgid "If an IPv6 address is entered, the address must be outside of the pool."
+msgstr "IPv6アドレスを入力すると、アドレスはプールの外にあることが必要です。"
+
+#: usr/local/www/services_dhcpv6_edit.php:206
+#: usr/local/www/services_dhcpv6_edit.php:209
+#: usr/local/www/services_dhcpv6_edit.php:209
+msgid ""
+"If no IPv6 address is given, one will be dynamically allocated from the pool."
+msgstr "ないIPv6アドレスが指定されていない場合」 、 1は、動的にプールから割り当てられます。"
+
+#: usr/local/www/services_router_advertisements.php:118
+#: usr/local/www/services_router_advertisements.php:117
+#: usr/local/www/services_router_advertisements.php:117
+msgid ""
+"Subnets are specified in CIDR format. Select the CIDR mask that pertains to "
+"each entry. /128 specifies a single IPv6 host; /64 specifies a normal IPv6 "
+"network; etc. If no subnets are specified here, the Router Advertisement "
+"(RA) Daemon will advertise to the subnet to which the router's interface is "
+"assigned."
+msgstr "「サブネットはCIDR形式で指定されています。に関連するCIDRマスクの選択」の各項目を。 / 128は、単一のIPv6ホストを指定し、 / 64は、通常のIPv6を指定する「ネットワーク;などなくサブネットが、ここで指定されていない場合は、ルーター広告」 ( RA )デーモンはルータのインタフェースが"割り当てられているサブネットにアドバタイズします。"
+
+#: usr/local/www/services_router_advertisements.php:149
+#: usr/local/www/services_router_advertisements.php:144
+#: usr/local/www/services_router_advertisements.php:144
+#, php-format
+msgid "An invalid subnet or alias was specified. [%s/%s]"
+msgstr "無効なサブネットまたは別名が指定されました。 ( ( %s / %s ) )"
+
+#: usr/local/www/services_router_advertisements.php:194
+#: usr/local/www/services_router_advertisements.php:189
+#: usr/local/www/services_router_advertisements.php:189
+msgid "Router advertisements"
+msgstr "ルータ通知"
+
+#: usr/local/www/services_router_advertisements.php:318
+#: usr/local/www/services_router_advertisements.php:313
+#: usr/local/www/services_router_advertisements.php:313
+msgid "RA Subnet(s)"
+msgstr "RAのサブネット( S )"
+
+#: usr/local/www/services_router_advertisements.php:384
+#: usr/local/www/services_router_advertisements.php:379
+#: usr/local/www/services_router_advertisements.php:379
+msgid ""
+"The RA server can optionally provide a domain search list. Use the semicolon "
+"character as seperator"
+msgstr "「 RAサーバは、必要に応じてドメイン検索リストを提供することができます。セミコロンの使用」 SEPERATORなどの文字を"
+
+#: usr/local/www/services_router_advertisements.php:392
+#: usr/local/www/services_router_advertisements.php:387
+#: usr/local/www/services_router_advertisements.php:387
+msgid "Use same settings as DHCPv6 server"
+msgstr "DHCPv6サーバと同じ設定を使用する"
+
+#: usr/local/www/vpn_ipsec.php:142 usr/local/www/vpn_ipsec_keys.php:94
+#: usr/local/www/vpn_ipsec_phase2.php:475
+#: usr/local/www/vpn_ipsec_phase1.php:498 usr/local/www/vpn_ipsec.php:148
+#: usr/local/www/vpn_ipsec_phase1.php:519
+#: usr/local/www/vpn_ipsec_phase2.php:497 usr/local/www/vpn_ipsec.php:148
+#: usr/local/www/vpn_ipsec_phase1.php:519 usr/local/www/vpn_ipsec_keys.php:94
+#: usr/local/www/vpn_ipsec_phase2.php:497
+msgid "Pre-Shared Keys"
+msgstr "事前共有キー"
+
+#: usr/local/www/system_usermanager_settings_test.php:78
+#: usr/local/www/system_usermanager_settings_test.php:78
+#, php-format
+msgid "Testing %s LDAP settings... One moment please..."
+msgstr "テストでは、 LDAP設定を%s...しばらくお待ちください..."
+
+#: usr/local/www/vpn_ipsec_mobile.php:149
+#: usr/local/www/vpn_ipsec_mobile.php:149
+msgid "A valid split DNS domain list must be specified."
+msgstr "有効なスプリットDNSドメインリストを指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:505
+#: usr/local/www/vpn_ipsec_mobile.php:505
+msgid "Split DNS"
+msgstr "スプリットDNS"
+
+#: usr/local/www/vpn_ipsec_mobile.php:514
+#: usr/local/www/vpn_ipsec_mobile.php:514
+msgid ""
+"Provide a list of split DNS domain names to clients. Enter a comma separated "
+"list."
+msgstr "「クライアントへのスプリットDNSドメイン名のリストを提供します。コンマで区切っ入力」リスト。"
+
+#: usr/local/www/vpn_ipsec_mobile.php:515
+#: usr/local/www/vpn_ipsec_mobile.php:515
+msgid ""
+"NOTE: If left blank, and a default domain is set, it will be used for this "
+"value."
+msgstr ""注:空白のままにし、デフォルトのドメインが設定されている場合、それはこのために使用される"値。"
+
+#: usr/local/www/firewall_shaper.php:131
+#: usr/local/www/firewall_shaper_vinterface.php:146
+#: usr/local/www/firewall_shaper.php:131
+#: usr/local/www/firewall_shaper_vinterface.php:146
+msgid "Unable to write config.xml (Access Denied?)"
+msgstr "config.xmlのを書き込むことができません(アクセスが拒否されました?)"
+
+#: usr/local/www/firewall_rules_edit.php:455
+#: usr/local/www/firewall_rules_edit.php:458
+#: usr/local/www/firewall_rules_edit.php:464
+#: usr/local/www/firewall_rules_edit.php:464
+msgid ""
+"Please select a gateway, normaly the interface selected gateway, so the "
+"limiters work correctly"
+msgstr "「ゲートウェイ、普通は以下のインターフェース選択されたゲートウェイを選択して、そのようにしてください」リミッターが正常に動作"
+
+#: usr/local/www/vpn_ipsec_keys.php:136 usr/local/www/vpn_ipsec_keys.php:136
+msgid "Do you really want to delete this Pre-Shared Key?"
+msgstr "あなたは本当に、この事前共有キーを削除しますか?"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:83
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:83
+msgid "A valid domain must be specified after _msdcs."
+msgstr "有効なドメインは_msdcsの後に指定しなければなりません。"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:93
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:93
+msgid "An interface IP address must be specified for the DNS query source."
+msgstr "インターフェイスのIPアドレスは、 DNSクエリのソースを指定する必要があります。"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:144
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:144
+msgid "Source IP"
+msgstr "送信元IP"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:147
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:147
+msgid ""
+"Source IP address for queries to the DNS server for the override domain."
+msgstr "オーバーライドドメインのDNSサーバへのクエリのための「送信元IPアドレス。"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:148
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:148
+msgid "Leave blank unless your DNS server is accessed through a VPN tunnel."
+msgstr "DNSサーバは、 VPNトンネルを介してアクセスされていない限り、空白のままにします。"
+
+#: usr/local/www/system_crlmanager.php:401
+#: usr/local/www/system_crlmanager.php:401
+msgid "Edit Imported Certificate Revocation List"
+msgstr "編集インポートした証明書失効リスト"
+
+#: usr/local/www/system_advanced_firewall.php:206
+#: usr/local/www/system_advanced_firewall.php:235
+#: usr/local/www/system_advanced_firewall.php:235
+msgid ""
+"expires idle connections quicker. More efficient use of CPU and memory but "
+"can drop legitimate idle connections"
+msgstr "「迅速アイドル状態の接続を期限切れにします。 CPUとメモリが、より効率的に使用「合法的なアイドル接続をドロップすることができます"
+
+#: usr/local/www/system_advanced_firewall.php:207
+#: usr/local/www/system_advanced_firewall.php:236
+#: usr/local/www/system_advanced_firewall.php:236
+msgid ""
+"tries to avoid dropping any legitimate idle connections at the expense of "
+"increased memory usage and CPU utilization."
+msgstr "メモリ使用量の増加やCPU使用率」を犠牲にして正当なアイドル状態の接続を落とさないようにしようとします」 。"
+
+#: usr/local/www/vpn_pptp.php:297 usr/local/www/vpn_pptp.php:300
+#: usr/local/www/vpn_pptp.php:300
+msgid ""
+"PPTP is no longer considered a secure VPN technology because it relies upon "
+"MS-CHAPv2 which has been compromised. If you continue to use PPTP be aware "
+"that intercepted traffic can be decrypted by a third party, so it should be "
+"considered unencrypted. We advise migrating to another VPN type such as "
+"OpenVPN or IPsec.<br /><br /><a href="https://isc.sans.edu/diary/End+of+Days"
+"+for+MS-CHAPv2/13807">Read More</a>"
+msgstr "侵害されたMS - CHAPv2を「それが依存しているので、PPTPはもはや安全なVPN技術と見なされていない」 。あなたは、PPTPを意識する使用し続ける場合は、「トラフィックは、第三者によって解読することができます傍受することなので、すべきである」 、暗号化されていないと考えた。私たちは、このような詳細MS-CHAPv2/13807"u003e読むための「 OpenVPNのかDays"のIPsec.<br /><br />もし、ごhref="https://isc.sans.edu/diary/Endとして別のVPNタイプに移行助言するu003c/ A u003e"
+
+#: usr/local/www/status_ntpd.php:185 usr/local/www/status_ntpd.php:191
+#: usr/local/www/status_ntpd.php:191
+msgid "Clock Latitude"
+msgstr "クロック緯度"
+
+#: usr/local/www/status_ntpd.php:186 usr/local/www/status_ntpd.php:192
+#: usr/local/www/status_ntpd.php:192
+msgid "Clock Longitude"
+msgstr "クロック経度"
+
+#: usr/local/www/system_advanced_misc.php:77
+#: usr/local/www/system_advanced_misc.php:80
+#: usr/local/www/system_advanced_misc.php:84
+#: usr/local/www/system_advanced_misc.php:84
+msgid "AMD Geode LX Security Block"
+msgstr "AMDのGeode LXセキュリティブロック"
+
+#: usr/local/www/system_advanced_misc.php:78
+#: usr/local/www/system_advanced_misc.php:81
+#: usr/local/www/system_advanced_misc.php:85
+#: usr/local/www/system_advanced_misc.php:85
+msgid "AES-NI CPU-based Acceleration"
+msgstr "AES- NIのCPUベースのアクセラレーション"
+
+#: usr/local/www/system_advanced_misc.php:80
+#: usr/local/www/system_advanced_misc.php:83
+#: usr/local/www/system_advanced_misc.php:87
+#: usr/local/www/system_advanced_misc.php:87
+msgid "Intel Core* CPU on-die thermal sensor"
+msgstr "インテルCore README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr CPUオンダイ熱センサ"
+
+#: usr/local/www/system_advanced_misc.php:81
+#: usr/local/www/system_advanced_misc.php:84
+#: usr/local/www/system_advanced_misc.php:88
+#: usr/local/www/system_advanced_misc.php:88
+msgid "AMD K8, K10 and K11 CPU on-die thermal sensor"
+msgstr "AMD K8 、 K10およびK11 CPUが熱センサをオンダイ"
+
+#: usr/local/www/system_advanced_misc.php:92
+#: usr/local/www/system_advanced_misc.php:95
+#: usr/local/www/system_advanced_misc.php:99
+#: usr/local/www/system_advanced_misc.php:99
+msgid "Please select a valid Cryptographic Accelerator."
+msgstr "有効な暗号化アクセラレータを選択してください。"
+
+#: usr/local/www/system_advanced_misc.php:95
+#: usr/local/www/system_advanced_misc.php:98
+#: usr/local/www/system_advanced_misc.php:102
+#: usr/local/www/system_advanced_misc.php:102
+msgid "Please select a valid Thermal Hardware Sensor."
+msgstr "有効な熱ハードウェアセンサーを選択してください。"
+
+#: usr/local/www/system_advanced_misc.php:380
+#: usr/local/www/system_advanced_misc.php:392
+#: usr/local/www/system_advanced_misc.php:439
+#: usr/local/www/system_advanced_misc.php:439
+msgid "Cryptographic Hardware Acceleration"
+msgstr "暗号ハードウェアアクセラレーション"
+
+#: usr/local/www/system_advanced_misc.php:383
+#: usr/local/www/system_advanced_misc.php:395
+#: usr/local/www/system_advanced_misc.php:442
+#: usr/local/www/system_advanced_misc.php:442
+msgid "Cryptographic Hardware"
+msgstr "暗号ハードウェア"
+
+#: usr/local/www/system_advanced_misc.php:392
+#: usr/local/www/system_advanced_misc.php:404
+#: usr/local/www/system_advanced_misc.php:451
+#: usr/local/www/system_advanced_misc.php:451
+msgid ""
+"A cryptographic accelerator module will use hardware support to speed up "
+"some cryptographic functions on systems which have the chip. Do not enable "
+"this option if you have a Hifn cryptographic acceleration card, as this will "
+"take precedence and the Hifn card will not be used. Acceleration should be "
+"automatic for IPsec when using a cipher supported by your chip, such as "
+"AES-128. OpenVPN should be set for AES-128-CBC and have cryptodev enabled "
+"for hardware acceleration."
+msgstr "チップを持っているシステムでは、いくつかの暗号機能を「暗号化アクセラレータモジュールは、高速化するハードウェア·サポートを使用します」 。優先され、 hIFNポリカードは使用されません」これはようには、 Hifnの暗号化アクセラレータカードを使用している場合は、このオプションを"有効にしないでください。 AES- 128 」など、お使いのチップでサポートされている暗号を使用する場合は、 IPsecのための自動「加速がなければならない。 OpenVPNのは、AES - 128 -CBCに設定する必要があり、 cryptodevはハードウェアアクセラレーションのための「有効にしている。"
+
+#: usr/local/www/system_advanced_misc.php:400
+#: usr/local/www/system_advanced_misc.php:412
+#: usr/local/www/system_advanced_misc.php:459
+#: usr/local/www/system_advanced_misc.php:459
+msgid ""
+"If you do not have a crypto chip in your system, this option will have no "
+"effect. To unload the selected module, set this option to 'none' and then "
+"reboot."
+msgstr "効果」を使用しているシステムで暗号チップを持っていない場合、このオプションはあります」 。選択したモジュールをアンロードするには、 「再起動し、' none'には、このオプションを設定します。"
+
+#: usr/local/www/system_advanced_misc.php:408
+#: usr/local/www/system_advanced_misc.php:411
+#: usr/local/www/system_advanced_misc.php:420
+#: usr/local/www/system_advanced_misc.php:423
+#: usr/local/www/system_advanced_misc.php:467
+#: usr/local/www/system_advanced_misc.php:470
+#: usr/local/www/system_advanced_misc.php:467
+#: usr/local/www/system_advanced_misc.php:470
+msgid "Thermal Sensors"
+msgstr "温度センサ"
+
+#: usr/local/www/system_advanced_misc.php:414
+#: usr/local/www/system_advanced_misc.php:426
+#: usr/local/www/system_advanced_misc.php:473
+#: usr/local/www/system_advanced_misc.php:473
+msgid "None/ACPI"
+msgstr "なし/ ACPI"
+
+#: usr/local/www/system_advanced_misc.php:420
+#: usr/local/www/system_advanced_misc.php:432
+#: usr/local/www/system_advanced_misc.php:479
+#: usr/local/www/system_advanced_misc.php:479
+msgid ""
+"If you have a supported CPU, selecting a themal sensor will load the "
+"appropriate driver to read its temperature. Setting this to 'None' will "
+"attempt to read the temperature from an ACPI-compliant motherboard sensor "
+"instead, if one is present."
+msgstr "その温度を読むために適切なドライバ」は、サポートされているCPUを使用している場合は、 themalセンサーを選択すると、ロードされます」 。 1が存在する場合は「なし」に設定すると、代わりに「 ACPI準拠のマザーボードセンサーからの温度を読み取ろうと」します。"
+
+#: usr/local/www/system_advanced_misc.php:424
+#: usr/local/www/system_advanced_misc.php:436
+#: usr/local/www/system_advanced_misc.php:483
+#: usr/local/www/system_advanced_misc.php:483
+msgid ""
+"If you do not have a supported thermal sensor chip in your system, this "
+"option will have no effect. To unload the selected module, set this option "
+"to 'none' and then reboot."
+msgstr "「お使いのシステムでサポートされている温度センサーチップを持っていない場合は、この"オプションは無効になります。選択したモジュールをアンロードするには、' none'に"このオプションを設定して再起動。"
+
+#: usr/local/www/services_captiveportal.php:173
+#: usr/local/www/services_captiveportal.php:175
+#: usr/local/www/services_captiveportal.php:175
+msgid "Certificate must be specified for HTTPS login."
+msgstr "証明書は、HTTPSのログインを指定する必要があります。"
+
+#: usr/local/www/services_captiveportal.php:863
+#: usr/local/www/services_captiveportal.php:865
+#: usr/local/www/services_captiveportal.php:881
+#: usr/local/www/services_captiveportal.php:881
+msgid ""
+"If enabled, the username and password will be transmitted over an HTTPS "
+"connection to protect against eavesdroppers. A server name and certificate "
+"must also be specified below."
+msgstr "盗聴者から保護するための接続」を有効にすると、ユーザー名とパスワードは、HTTPSを介して送信されます」 。サーバー名と証明書」も、以下に指定する必要があります。"
+
+#: usr/local/www/services_captiveportal.php:886
+#: usr/local/www/services_captiveportal.php:888
+#: usr/local/www/services_captiveportal.php:904
+#: usr/local/www/services_captiveportal.php:904
+msgid "No Certificates defined."
+msgstr "定義されない証明書はありません。"
+
+#: usr/local/www/system_gateways_edit.php:205
+#: usr/local/www/system_gateways_edit.php:235
+#: usr/local/www/system_gateways_edit.php:235
+msgid "The low latency threshold needs to be a numeric value."
+msgstr "低レイテンシのしきい値は、数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:208
+#: usr/local/www/system_gateways_edit.php:238
+#: usr/local/www/system_gateways_edit.php:238
+msgid "The low latency threshold needs to be positive."
+msgstr "低レイテンシのしきい値は正である必要があります。"
+
+#: usr/local/www/system_gateways_edit.php:215
+#: usr/local/www/system_gateways_edit.php:245
+#: usr/local/www/system_gateways_edit.php:245
+msgid "The high latency threshold needs to be a numeric value."
+msgstr "高遅延しきい値は、数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:218
+#: usr/local/www/system_gateways_edit.php:248
+#: usr/local/www/system_gateways_edit.php:248
+msgid "The high latency threshold needs to be positive."
+msgstr "高遅延しきい値が陽性であることが必要である。"
+
+#: usr/local/www/system_gateways_edit.php:225
+#: usr/local/www/system_gateways_edit.php:255
+#: usr/local/www/system_gateways_edit.php:255
+msgid "The low Packet Loss threshold needs to be a numeric value."
+msgstr "低パケット損失のしきい値は数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:228
+#: usr/local/www/system_gateways_edit.php:258
+#: usr/local/www/system_gateways_edit.php:258
+msgid "The low Packet Loss threshold needs to be positive."
+msgstr "低パケット損失のしきい値は正である必要があります。"
+
+#: usr/local/www/system_gateways_edit.php:231
+#: usr/local/www/system_gateways_edit.php:261
+#: usr/local/www/system_gateways_edit.php:261
+msgid "The low Packet Loss threshold needs to be less than 100."
+msgstr "低パケット損失閾値は、 100未満である必要がある。"
+
+#: usr/local/www/system_gateways_edit.php:238
+#: usr/local/www/system_gateways_edit.php:268
+#: usr/local/www/system_gateways_edit.php:268
+msgid "The high Packet Loss threshold needs to be a numeric value."
+msgstr "高いパケット損失しきい値は、数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:241
+#: usr/local/www/system_gateways_edit.php:271
+#: usr/local/www/system_gateways_edit.php:271
+msgid "The high Packet Loss threshold needs to be positive."
+msgstr "高いパケット損失しきい値は正である必要があります。"
+
+#: usr/local/www/system_gateways_edit.php:244
+#: usr/local/www/system_gateways_edit.php:274
+#: usr/local/www/system_gateways_edit.php:274
+msgid "The high Packet Loss threshold needs to be 100 or less."
+msgstr "高パケット損失閾値は100以下であることが必要である。"
+
+#: usr/local/www/system_gateways_edit.php:252
+#: usr/local/www/system_gateways_edit.php:282
+#: usr/local/www/system_gateways_edit.php:282
+msgid ""
+"The high latency threshold needs to be higher than the low latency threshold"
+msgstr "「高遅延しきい値は、低レイテンシー閾値よりも高いことが必要である"
+
+#: usr/local/www/system_gateways_edit.php:275
+#: usr/local/www/system_gateways_edit.php:305
+#: usr/local/www/system_gateways_edit.php:305
+msgid ""
+"The high Packet Loss threshold needs to be higher than the low Packet Loss "
+"threshold"
+msgstr "閾値「高パケット損失閾値が低いパケット損失よりも高くする必要がある""
+
+#: usr/local/www/system_gateways_edit.php:297
+#: usr/local/www/system_gateways_edit.php:327
+#: usr/local/www/system_gateways_edit.php:327
+msgid "The frequency probe interval needs to be a numeric value."
+msgstr "高周波プローブ間隔は数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:300
+#: usr/local/www/system_gateways_edit.php:330
+#: usr/local/www/system_gateways_edit.php:330
+msgid "The frequency probe interval needs to be positive."
+msgstr "高周波プローブ間隔は正である必要がある。"
+
+#: usr/local/www/system_gateways_edit.php:307
+#: usr/local/www/system_gateways_edit.php:337
+#: usr/local/www/system_gateways_edit.php:337
+msgid "The down time setting needs to be a numeric value."
+msgstr "ダウンタイムの設定は数値でなければなりません。"
+
+#: usr/local/www/system_gateways_edit.php:310
+#: usr/local/www/system_gateways_edit.php:340
+#: usr/local/www/system_gateways_edit.php:340
+msgid "The down time setting needs to be positive."
+msgstr "停止時間の設定が正である必要がある。"
+
+#: usr/local/www/system_gateways_edit.php:318
+#: usr/local/www/system_gateways_edit.php:348
+#: usr/local/www/system_gateways_edit.php:348
+msgid ""
+"The Frequency Probe interval needs to be less than the down time setting."
+msgstr "「周波数プローブ間隔は、ダウン時間設定未満である必要がある。"
+
+#: usr/local/www/system_gateways_edit.php:611
+#: usr/local/www/system_gateways_edit.php:615
+#: usr/local/www/system_gateways_edit.php:617
+#: usr/local/www/system_gateways_edit.php:647
+msgid ""
+"NOTE: The Frequency Probe interval must be less than the Down time, "
+"otherwise the gateway will seem to go down then come up again at the next "
+"probe."
+msgstr ""注:高周波プローブ間隔はダウンタイムよりも小さくなければなりません、 「そうでないゲートウェイは、次の「プローブで再び出てくるし、下に行くように見えるでしょう。"
+
+#: usr/local/www/shortcuts.inc:96 usr/local/www/shortcuts.inc:96
+msgid "Main page for this section"
+msgstr "このセクションのメインページ"
+
+#: usr/local/www/shortcuts.inc:120 usr/local/www/shortcuts.inc:120
+msgid "Status of items on this page"
+msgstr "このページの項目のステータス"
+
+#: usr/local/www/shortcuts.inc:127 usr/local/www/shortcuts.inc:127
+msgid "Log entries for items on this page"
+msgstr "このページ上のアイテムのログエントリを"
+
+#: usr/local/www/vpn_openvpn_server.php:1102
+#: usr/local/www/vpn_openvpn_server.php:1129
+#: usr/local/www/vpn_openvpn_server.php:1129
+msgid ""
+"This is the IPv6 virtual network used for private communications between "
+"this server and client hosts expressed using CIDR (eg. fe80::/64). The first "
+"network address will be assigned to the server virtual interface. The "
+"remaining network addresses can optionally be assigned to connecting "
+"clients. (see Address Pool)"
+msgstr "このサーバーとクライアントホスト「これは間のプライベート通信に使用されるIPv6の仮想ネットワークである"(例: FE80:: / 64 ) 、CIDRを使用して表現。最初の「ネットワークアドレスは、サーバの仮想インターフェイスに割り当てられます。 「残りのネットワークアドレスは、必要に応じて「クライアントの接続に割り当てることができます。 (アドレスプールを参照してください)"
+
+#: usr/local/www/vpn_openvpn_server.php:1152
+#: usr/local/www/vpn_openvpn_server.php:1179
+#: usr/local/www/vpn_openvpn_server.php:1179
+msgid ""
+"The interface to which this tap instance will be bridged. This is not done "
+"automatically. You must assign this interface and create the bridge "
+"separately. This setting controls which existing IP address and subnet mask "
+"are used by OpenVPN for the bridge. Setting this to 'none' will cause the "
+"Server Bridge DHCP settings below to be ignored."
+msgstr "自動的に「このタップインスタンスをブリッジ先となるインタフェースが、これは行われていません」 。あなたは、このインターフェイスを割り当て、 「別途既存のIPアドレスとサブネットマスクは、この設定を制御し「ブリッジ用のOpenVPNで使用されているが、ブリッジを作成する必要があります。' none'に、これを設定すると、以下の「サーバー·ブリッジDHCP設定が無視されるようになります。"
+
+#: usr/local/www/vpn_openvpn_server.php:1165
+#: usr/local/www/vpn_openvpn_server.php:1192
+#: usr/local/www/vpn_openvpn_server.php:1192
+msgid ""
+"When using tap mode as a multi-point server, you may optionally supply a "
+"DHCP range to use on the interface to which this tap instance is bridged. If "
+"these settings are left blank, DHCP will be passed through to the LAN, and "
+"the interface setting above will be ignored."
+msgstr "このタップインスタンスがブリッジされたインターフェイス上で使用するようにDHCP範囲「マルチポイントサーバーとしてタップ·モードを使用するときは、必要に応じて供給することができる」 。場合は"これらの設定は空白のままに、 DHCPがLANに通過され、 「上記の設定インターフェイスは無視されます。"
+
+#: usr/local/www/vpn_openvpn_server.php:1225
+#: usr/local/www/vpn_openvpn_client.php:799
+msgid "IPv4 Remote Network"
+msgstr "IPv4のリモートネットワーク"
+
+#: usr/local/www/vpn_openvpn_server.php:1229
+msgid ""
+"This is a network that will be routed through the tunnel, so that a site-to-"
+"site VPN can be established without manually changing the routing tables. "
+"Expressed as a CIDR range. If this is a site-to-site VPN, enter the remote "
+"LAN here. You may leave this blank if you don't want a site-to-site VPN"
+msgstr "「これはトンネルを経由してルーティングされるネットワークである、その結果、サイトツー」サイトVPNを手動でルーティングテーブルを変更せずに設定することができる。 「 CIDRの範囲として表さ。これは、サイト間VPNの場合は、リモート入力し「ここにLANの。あなたはサイト間VPNを使用しない場合は、この空白を残すことが"
+
+#: usr/local/www/vpn_openvpn_server.php:1239
+#: usr/local/www/vpn_openvpn_client.php:813
+msgid "IPv6 Remote Network"
+msgstr "IPv6のリモートネットワーク"
+
+#: usr/local/www/vpn_openvpn_server.php:1243
+msgid ""
+"This is an IPv6 network that will be routed through the tunnel, so that a "
+"site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as an IP/PREFIX. If this is a site-to-site VPN, enter the "
+"remote LAN here. You may leave this blank if you don't want a site-to-site "
+"VPN"
+msgstr ""これは、トンネルを介してルーティングされ、IPv6ネットワークであるように、「サイト間VPNを手動で「ルーティングテーブルを変更せずに確立することができます。 IP /プレフィックスとして表されます。これがあれば、サイトツーサイト間VPNは、ここでは、「リモートLANを入力してください。サイトツーサイト「VPNを使用しない場合は、この空白を残すことが"
+
+#: usr/local/www/services_dhcp.php:293 usr/local/www/services_dhcp.php:274
+#: usr/local/www/services_dhcp.php:294 usr/local/www/services_dhcp.php:294
+msgid ""
+"If you specify a mac allow list, it must contain only valid partial MAC "
+"addresses."
+msgstr "アドレスは「あなたがMacは許可リストを指定すると、それが唯一の有効な部分的なMACが含まれている必要があります」 。"
+
+#: usr/local/www/services_dhcp.php:295 usr/local/www/services_dhcp.php:276
+#: usr/local/www/services_dhcp.php:296 usr/local/www/services_dhcp.php:296
+msgid ""
+"If you specify a mac deny list, it must contain only valid partial MAC "
+"addresses."
+msgstr "アドレスは「あなたはMacが拒否リストを指定すると、それが唯一の有効な部分的なMACが含まれている必要があります」 。"
+
+#: usr/local/www/services_dhcp.php:699 usr/local/www/services_dhcp.php:701
+#: usr/local/www/services_dhcp.php:721 usr/local/www/services_dhcp.php:721
+msgid ""
+"Editing Pool-Specific Options. To return to the Interface, click its tab "
+"above."
+msgstr "プール固有のオプションを編集。インターフェイスに戻るには、上記のタブをクリックします。"
+
+#: usr/local/www/services_dhcp.php:775 usr/local/www/services_dhcp.php:785
+#: usr/local/www/services_dhcp.php:805 usr/local/www/services_dhcp.php:805
+msgid "Additional Pools"
+msgstr "追加のプール"
+
+#: usr/local/www/services_dhcp.php:777 usr/local/www/services_dhcp.php:787
+#: usr/local/www/services_dhcp.php:807 usr/local/www/services_dhcp.php:807
+msgid ""
+"If you need additional pools of addresses inside of this subnet outside the "
+"above Range, they may be specified here."
+msgstr "範囲を超える、彼らがここで指定することができます"あなたが外でこのサブネット内のアドレスの追加のプールが必要な場合は「 。"
+
+#: usr/local/www/services_dhcp.php:780 usr/local/www/services_dhcp.php:790
+#: usr/local/www/services_dhcp.php:810 usr/local/www/services_dhcp.php:810
+msgid "Pool Start"
+msgstr "プールスタート"
+
+#: usr/local/www/services_dhcp.php:781 usr/local/www/services_dhcp.php:791
+#: usr/local/www/services_dhcp.php:811 usr/local/www/services_dhcp.php:811
+msgid "Pool End"
+msgstr "プール終了"
+
+#: usr/local/www/services_dhcp.php:805 usr/local/www/services_dhcp.php:819
+#: usr/local/www/services_dhcp.php:839 usr/local/www/services_dhcp.php:839
+msgid "Do you really want to delete this pool?"
+msgstr "あなたは本当にこのプールを削除しますか?"
+
+#: usr/local/www/services_dhcp.php:958 usr/local/www/services_dhcp.php:971
+#: usr/local/www/services_dhcp.php:991 usr/local/www/services_dhcp.php:991
+msgid "MAC Address Control"
+msgstr "MACアドレス管理"
+
+#: usr/local/www/services_dhcp.php:961 usr/local/www/services_dhcp.php:974
+#: usr/local/www/services_dhcp.php:994 usr/local/www/services_dhcp.php:994
+msgid "Show MAC Address Control"
+msgstr "ショーのMACアドレス制御"
+
+#: usr/local/www/services_dhcp.php:965 usr/local/www/services_dhcp.php:978
+#: usr/local/www/services_dhcp.php:998 usr/local/www/services_dhcp.php:998
+msgid ""
+"Enter a list of partial MAC addresses to allow, comma separated, no spaces, "
+"such as "
+msgstr "のような「部分的MACアドレスのリストを入力すると、カンマ区切り、スペースなしに、許可しないように対処する」"
+
+#: usr/local/www/services_dhcp.php:967 usr/local/www/services_dhcp.php:980
+#: usr/local/www/services_dhcp.php:1000 usr/local/www/services_dhcp.php:1000
+msgid ""
+"Enter a list of partial MAC addresses to deny access, comma separated, no "
+"spaces, such as "
+msgstr "「部分的なMACアドレスのリストを入力すると、アクセスを拒否するアドレス、カンマで区切られ、 NO」のような空間を、"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:89
+#: usr/local/www/load_balancer_virtual_server_edit.php:89
+msgid "You cannot use spaces or slashes in the 'name' field."
+msgstr "あなたは、 「名前」フィールドに、スペースやスラッシュを使用することはできません。"
+
+#: usr/local/www/guiconfig.inc:1009 usr/local/www/guiconfig.inc:1024
+#: usr/local/www/guiconfig.inc:1021 usr/local/www/guiconfig.inc:1021
+msgid "move mouse out this alias to hide"
+msgstr "非表示にするには、この別名からマウスを移動"
+
+#: usr/local/www/guiconfig.inc:1066 usr/local/www/guiconfig.inc:1081
+#: usr/local/www/guiconfig.inc:1078 usr/local/www/guiconfig.inc:1078
+msgid "edit this alias"
+msgstr "このエイリアスを編集"
+
+#: usr/local/www/guiconfig.inc:1077 usr/local/www/guiconfig.inc:1089
+#: usr/local/www/guiconfig.inc:1092 usr/local/www/guiconfig.inc:1104
+#: usr/local/www/guiconfig.inc:1101 usr/local/www/guiconfig.inc:1089
+#: usr/local/www/guiconfig.inc:1101
+msgid "loading..."
+msgstr "読み込んでいます..."
+
+#: usr/local/www/system_firmware_settings.php:175
+#: usr/local/www/system_firmware_settings.php:184
+#: usr/local/www/system_firmware_settings.php:186
+#: usr/local/www/system_firmware_settings.php:186
+msgid "Dashboard check"
+msgstr "ダッシュボードのチェック"
+
+#: usr/local/www/system_firmware_settings.php:179
+#: usr/local/www/system_firmware_settings.php:188
+#: usr/local/www/system_firmware_settings.php:190
+#: usr/local/www/system_firmware_settings.php:190
+msgid "Disable the automatic dashboard auto-update check."
+msgstr "自動ダッシュボードの自動更新チェックを無効にします。"
+
+#: usr/local/www/services_ntpd.php:119 usr/local/www/services_ntpd.php:119
+msgid "Interfaces without an IP address will not be shown."
+msgstr "IPアドレスを持たないインタフェースは表示されません。"
+
+#: usr/local/www/services_ntpd.php:121 usr/local/www/services_ntpd.php:121
+msgid "Selecting no interfaces will listen on all interfaces with a wildcard."
+msgstr "何のインターフェイスを選択しないと、ワイルドカードを持つすべてのインターフェイス上で待機します。"
+
+#: usr/local/www/services_ntpd.php:122 usr/local/www/services_ntpd.php:122
+msgid ""
+"Selecting all interfaces will explicitly listen on only the interfaces/IPs "
+"specified."
+msgstr "指定された「すべてのインターフェイスを選択すると、明示的にインターフェースのみ/ IPS上で待機します」 。"
+
+#: usr/local/www/services_ntpd.php:140 usr/local/www/services_ntpd.php:140
+msgid "The GPS must provide NMEA format output!"
+msgstr "GPSはNMEA形式の出力を提供しなければならない!"
+
+#: usr/local/www/services_ntpd.php:142 usr/local/www/services_ntpd.php:142
+msgid ""
+"All serial ports are listed, be sure to pick only the port with the GPS "
+"attached."
+msgstr "添付の「すべてのシリアルポートが、リストされているGPSを専用ポートを選択してください」 。"
+
+#: usr/local/www/services_ntpd.php:144 usr/local/www/services_ntpd.php:144
+msgid "It is best to configure at least 2 servers under"
+msgstr "それが下に少なくとも2サーバを設定するのが最適です"
+
+#: usr/local/www/services_ntpd.php:144 usr/local/www/services_ntpd.php:144
+msgid "System > General"
+msgstr "システムu003e一般"
+
+#: usr/local/www/services_ntpd.php:144 usr/local/www/services_ntpd.php:144
+msgid ""
+"to avoid loss of sync if the GPS data is not valid over time. Otherwise ntpd "
+"may only use values from the unsynchronized local clock when providing time "
+"to clients."
+msgstr "「 GPSデータが時間をかけて有効でない場合、同期の損失を回避します。そうでない場合はntpdは「クライアントへの時間」を提供する場合にのみ、非同期のローカルクロックの値を使用することができます。"
+
+#: usr/local/www/firewall_aliases.php:177
+#: usr/local/www/firewall_aliases.php:175
+#: usr/local/www/firewall_aliases.php:175
+msgid "Ports"
+msgstr "ポート"
+
+#: usr/local/www/firewall_aliases.php:178
+#: usr/local/www/firewall_aliases.php:176
+#: usr/local/www/firewall_aliases.php:176
+msgid "Urls"
+msgstr "URLは"
+
+#: usr/local/www/firewall_aliases.php:195
+#: usr/local/www/firewall_aliases.php:272
+#: usr/local/www/firewall_aliases.php:274
+#: usr/local/www/firewall_aliases.php:275
+#: usr/local/www/firewall_aliases.php:195
+#: usr/local/www/firewall_aliases.php:275
+msgid "Add a new alias"
+msgstr "新しいエイリアスを追加します。"
+
+#: usr/local/www/firewall_aliases.php:255
+#: usr/local/www/firewall_aliases.php:256
+#: usr/local/www/firewall_aliases.php:257
+#: usr/local/www/firewall_aliases.php:257
+msgid "Edit alias"
+msgstr "編集別名"
+
+#: usr/local/www/firewall_aliases.php:256
+#: usr/local/www/firewall_aliases.php:257
+#: usr/local/www/firewall_aliases.php:258
+#: usr/local/www/firewall_aliases.php:258
+msgid "Delete alias"
+msgstr "エイリアスを削除"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:64
+#: usr/local/www/services_captiveportal_zones_edit.php:64
+msgid "The zone name can only contain letters, digits, and underscores (_)."
+msgstr "ゾーン名には、文字、数字、アンダースコア( _)を含めることができます。"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:105
+#: usr/local/www/services_captiveportal_zones_edit.php:101
+#: usr/local/www/services_captiveportal_zones_edit.php:101
+msgid "Zone name. Can only contain letters, digits, and underscores (_)."
+msgstr "ゾーン名。文字、数字、アンダースコア( _)を含めることができます。"
+
+#: usr/local/www/diag_packet_capture.php:81
+#: usr/local/www/diag_packet_capture.php:81
+msgid "Invalid interface."
+msgstr "無効なインタフェース。"
+
+#: usr/local/www/diag_packet_capture.php:84
+#: usr/local/www/diag_packet_capture.php:84
+msgid "Invalid address family."
+msgstr "無効なアドレスファミリ。"
+
+#: usr/local/www/diag_packet_capture.php:87
+#: usr/local/www/diag_packet_capture.php:87
+msgid "Invalid protocol."
+msgstr "無効なプロトコル。"
+
+#: usr/local/www/diag_packet_capture.php:92
+#: usr/local/www/diag_packet_capture.php:92
+#, php-format
+msgid "A valid IP address or CIDR block must be specified. [%s]"
+msgstr "有効なIPアドレスまたはCIDRブロックを指定する必要があります。 ( ( %s ) )"
+
+#: usr/local/www/diag_packet_capture.php:97
+#: usr/local/www/diag_packet_capture.php:97
+msgid "Invalid value specified for port."
+msgstr "ポートに指定された値が無効です。"
+
+#: usr/local/www/diag_packet_capture.php:104
+#: usr/local/www/diag_packet_capture.php:104
+msgid "Invalid value specified for packet length."
+msgstr "パケット長に指定された値が無効です。"
+
+#: usr/local/www/diag_packet_capture.php:111
+#: usr/local/www/diag_packet_capture.php:111
+msgid "Invalid value specified for packet count."
+msgstr "パケット数に指定された値が無効です。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:148
+#: usr/local/www/vpn_ipsec_phase2.php:152
+#: usr/local/www/vpn_ipsec_phase2.php:152
+msgid "A valid NAT local network bit count must be specified."
+msgstr "有効なNATのローカルネットワークビット数を指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:150
+#: usr/local/www/vpn_ipsec_phase2.php:154
+#: usr/local/www/vpn_ipsec_phase2.php:154
+msgid ""
+"You cannot configure a network type address for NAT while only an address "
+"type is selected for local source."
+msgstr "タイプローカルソースを選択した"あなただけのアドレスは、一方NATのためのネットワーク型アドレスを設定することはできません」 。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:153
+#: usr/local/www/vpn_ipsec_phase2.php:157
+#: usr/local/www/vpn_ipsec_phase2.php:157
+msgid "A valid NAT local network IP address must be specified."
+msgstr "有効なNATのローカルネットワークIPアドレスを指定する必要があります。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:548
+#: usr/local/www/vpn_ipsec_phase2.php:569
+#: usr/local/www/vpn_ipsec_phase2.php:569
+msgid ""
+"In case you need NAT/BINAT on this network specify the address to be "
+"translated"
+msgstr "翻訳"ケースでは、対象のアドレスを指定し、このネットワーク上でNAT /のbinatが必要です」"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:114
+#: usr/local/www/vpn_ipsec_keys_edit.php:114
+msgid "VPN: IPsec: Edit Pre-Shared Key"
+msgstr "VPN : IPsecの編集:事前共有キー"
+
+#: usr/local/www/services_dhcp_edit.php:227
+#: usr/local/www/services_dhcp_edit.php:355
+#: usr/local/www/services_dhcp_edit.php:355
+msgid "If an IPv4 address is entered, the address must be outside of the pool."
+msgstr "IPv4アドレスを入力すると、アドレスはプールの外にあることが必要です。"
+
+#: usr/local/www/services_dhcp_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:357
+#: usr/local/www/services_dhcp_edit.php:357
+msgid ""
+"If no IPv4 address is given, one will be dynamically allocated from the pool."
+msgstr "ないIPv4アドレスが指定されていない場合」 、 1は、動的にプールから割り当てられます。"
+
+#: usr/local/www/interfaces.php:2460 usr/local/www/interfaces.php:2490
+#: usr/local/www/interfaces.php:2536 usr/local/www/interfaces.php:2525
+#: usr/local/www/interfaces.php:2525
+msgid "WPA Pre-Shared Key"
+msgstr "WPA事前共有キー"
+
+#: usr/local/www/vpn_openvpn_client.php:789
+#: usr/local/www/vpn_openvpn_client.php:808
+#: usr/local/www/vpn_openvpn_client.php:808
+msgid ""
+"This is the IPv6 virtual network used for private communications between "
+"this client and the server expressed using CIDR (eg. fe80::/64). The first "
+"network address is assumed to be the server address and the second network "
+"address will be assigned to the client virtual interface"
+msgstr "このクライアントとサーバーの「これは間のプライベート通信に使用されるIPv6の仮想ネットワークである"(例: FE80:: / 64 ) 、CIDRを使用して表現。最初の「ネットワークアドレスは、サーバのアドレスであるとみなされ、第二のネットワーク"アドレスは、クライアントの仮想インターフェイスに割り当てられます"
+
+#: usr/local/www/vpn_openvpn_client.php:803
+msgid ""
+"This is a network that will be routed through the tunnel, so that a site-to-"
+"site VPN can be established without manually changing the routing tables. "
+"Expressed as a CIDR range. If this is a site-to-site VPN, enter the remote "
+"LAN here. You may leave this blank to only communicate with other clients"
+msgstr "「これはトンネルを経由してルーティングされるネットワークである、その結果、サイトツー」サイトVPNを手動でルーティングテーブルを変更せずに設定することができる。 「 CIDRの範囲として表さ。これは、サイト間VPNの場合は、リモート入力し「ここにLANの。あなただけの他のクライアントと通信するために、この空白を残すことが"
+
+#: usr/local/www/vpn_openvpn_client.php:817
+msgid ""
+"This is an IPv6 network that will be routed through the tunnel, so that a "
+"site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as an IP/PREFIX. If this is a site-to-site VPN, enter the "
+"remote LAN here. You may leave this blank to only communicate with other "
+"clients"
+msgstr ""これは、トンネルを介してルーティングされ、IPv6ネットワークであるように、「サイト間VPNを手動で「ルーティングテーブルを変更せずに確立することができます。 IP /プレフィックスとして表されます。これがあれば、サイトツーサイト間VPNは、ここでは、「リモートLANを入力してください。あなただけの他の「クライアントと通信するために、この空白を残すことが"
+
+#: usr/local/www/vpn_l2tp.php:301 usr/local/www/vpn_l2tp.php:304
+#: usr/local/www/vpn_l2tp.php:304
+msgid "Enable L2TP server"
+msgstr "L2TPサーバを有効にする"
+
+#: usr/local/www/vpn_l2tp.php:322 usr/local/www/vpn_l2tp.php:325
+#: usr/local/www/vpn_l2tp.php:325
+msgid "Server Address"
+msgstr "サーバーのアドレス"
+
+#: usr/local/www/vpn_l2tp.php:334 usr/local/www/vpn_l2tp.php:337
+#: usr/local/www/vpn_l2tp.php:337
+msgid "Remote Address Range"
+msgstr "リモートアドレス範囲"
+
+#: usr/local/www/vpn_l2tp.php:384 usr/local/www/vpn_l2tp.php:387
+#: usr/local/www/vpn_l2tp.php:387
+msgid "Authentication Type"
+msgstr "認証タイプ"
+
+#: usr/local/www/vpn_l2tp.php:429 usr/local/www/vpn_l2tp.php:432
+#: usr/local/www/vpn_l2tp.php:432
+msgid "RADIUS Shared Secret"
+msgstr "RADIUS共有シークレット"
+
+#: usr/local/www/vpn_l2tp.php:436 usr/local/www/vpn_l2tp.php:439
+#: usr/local/www/vpn_l2tp.php:439
+msgid "RADIUS Issued IP's"
+msgstr "RADIUSは、IPの発行"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:126
+#: usr/local/www/firewall_virtual_ip_edit.php:128
+#: usr/local/www/firewall_virtual_ip_edit.php:128
+msgid "The /31 and /32 subnet mask are invalid for CARP IPs."
+msgstr "/ 31および/ 32サブネットマスクは、CARPのIPアドレスは無効です。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:130
+#: usr/local/www/firewall_virtual_ip_edit.php:132
+#: usr/local/www/firewall_virtual_ip_edit.php:132
+msgid "The /127 and /128 subnet mask are invalid for CARP IPs."
+msgstr "/ 127および/ 128サブネットマスクは、CARPのIPアドレスは無効です。"
+
+#: usr/local/www/interfaces_gif.php:137 usr/local/www/interfaces_gif.php:141
+#: usr/local/www/interfaces_gif.php:141
+msgid ""
+"If you are using a GIF tunnel to connect to a Hurricane Electric (he.net) "
+"Tunnel Broker on a WAN with a dynamic IP, you may want to add a"
+msgstr "動的IPとWAN上のトンネルブローカー」では、ハリケーン·エレクトリック( he.net )に接続するために、GIFトンネルを使用している場合」には、追加したいこと"
+
+#: usr/local/www/interfaces_gif.php:137 usr/local/www/interfaces_gif.php:141
+#: usr/local/www/interfaces_gif.php:141
+msgid "HE.net Tunnelbroker type DynDNS Entry"
+msgstr "HE.net TunnelbrokerタイプダイナミックDNSエントリー"
+
+#: usr/local/www/interfaces_gif.php:137 usr/local/www/interfaces_gif.php:141
+#: usr/local/www/interfaces_gif.php:141
+msgid "to keep your tunnel functional when your IP changes."
+msgstr "あなたのIPの変更時に機能的な、あなたのトンネルを維持する。"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:102
+#: usr/local/www/widgets/widgets/system_information.widget.php:103
+#: usr/local/www/widgets/widgets/system_information.widget.php:101
+#: usr/local/www/widgets/widgets/system_information.widget.php:103
+msgid "Obtaining update status"
+msgstr "更新ステータスの取得"
+
+#: usr/local/www/vpn_ipsec_phase1.php:680
+#: usr/local/www/vpn_ipsec_phase1.php:701
+#: usr/local/www/vpn_ipsec_phase1.php:701
+msgid "Input your Pre-Shared Key string"
+msgstr "入力あなたの事前共有鍵の文字列"
+
+#: usr/local/www/diag_nanobsd.php:179 usr/local/www/diag_nanobsd.php:170
+#: usr/local/www/diag_nanobsd.php:170
+msgid "Media Read/Write Status"
+msgstr "メディア読み取り/書き込みステータス"
+
+#: usr/local/www/diag_nanobsd.php:192 usr/local/www/diag_nanobsd.php:183
+#: usr/local/www/diag_nanobsd.php:183
+msgid "Read/Write"
+msgstr "読み書き"
+
+#: usr/local/www/diag_nanobsd.php:194 usr/local/www/diag_nanobsd.php:185
+#: usr/local/www/diag_nanobsd.php:185
+msgid "Switch to Read-Only"
+msgstr "読み取り専用に切り替え"
+
+#: usr/local/www/diag_nanobsd.php:196 usr/local/www/diag_nanobsd.php:187
+#: usr/local/www/diag_nanobsd.php:187
+msgid "Read-Only"
+msgstr "リードオンリー"
+
+#: usr/local/www/diag_nanobsd.php:198 usr/local/www/diag_nanobsd.php:189
+#: usr/local/www/diag_nanobsd.php:189
+msgid "Switch to Read/Write"
+msgstr "読み取り/書き込みに切り替え"
+
+#: usr/local/www/diag_nanobsd.php:201 usr/local/www/diag_nanobsd.php:192
+#: usr/local/www/diag_nanobsd.php:192
+msgid ""
+"NOTE: This setting is only temporary, and can be switched dynamically in the "
+"background."
+msgstr ""注:この設定は一時的なものであり、動的に切り替えることができます」背景。"
+
+#: usr/local/www/diag_nanobsd.php:208 usr/local/www/diag_nanobsd.php:199
+#: usr/local/www/diag_nanobsd.php:199
+msgid "Keep media mounted read/write at all times."
+msgstr "維持培地は、常に読み取り/書き込み取り付けられている。"
+
+#: usr/local/www/services_dhcpv6.php:821 usr/local/www/services_dhcpv6.php:838
+#: usr/local/www/services_dhcpv6.php:838
+msgid "Status: DHCPv6 leases"
+msgstr "ステータス: DHCPv6のリース"
+
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:307
+#: usr/local/www/diag_logs_filter.php:307
+msgid "Rule"
+msgstr "ルール"
+
+#: usr/local/www/system_firmware.php:55 usr/local/www/system_firmware.php:55
+msgid "Standard Kernel"
+msgstr "標準カーネル"
+
+#: usr/local/www/system_firmware.php:56 usr/local/www/system_firmware.php:56
+msgid "Embedded Kernel"
+msgstr "埋め込まれたカーネル"
+
+#: usr/local/www/vpn_l2tp.php:88 usr/local/www/vpn_pptp.php:96
+#: usr/local/www/vpn_l2tp.php:88 usr/local/www/vpn_pptp.php:96
+msgid ""
+"'Server address' parameter should NOT be set to any IP address currently in "
+"use on this firewall."
+msgstr "このファイアウォールで使用する「「サーバーアドレス」パラメータは、現在の任意のIPアドレスに設定しないでください」 。"
+
+#: usr/local/www/system_camanager.php:220
+#: usr/local/www/system_certmanager.php:299
+#: usr/local/www/system_certmanager.php:301
+#: usr/local/www/system_camanager.php:220
+#: usr/local/www/system_certmanager.php:299
+#: usr/local/www/system_certmanager.php:301
+msgid "Please select a valid Key Length."
+msgstr "有効なキーの長さを選択してください。"
+
+#: usr/local/www/system_camanager.php:222
+#: usr/local/www/system_certmanager.php:303
+#: usr/local/www/system_camanager.php:222
+#: usr/local/www/system_certmanager.php:303
+msgid "Please select a valid Digest Algorithm."
+msgstr "有効なダイジェストアルゴリズムを選択してください。"
+
+#: usr/local/www/system_camanager.php:477
+#: usr/local/www/system_certmanager.php:690
+#: usr/local/www/system_certmanager.php:863
+#: usr/local/www/system_certmanager.php:691
+#: usr/local/www/system_certmanager.php:867
+#: usr/local/www/system_camanager.php:477
+#: usr/local/www/system_certmanager.php:691
+#: usr/local/www/system_certmanager.php:867
+msgid "Digest Algorithm"
+msgstr "ダイジェストアルゴリズム"
+
+#: usr/local/www/system_camanager.php:489
+#: usr/local/www/system_certmanager.php:702
+#: usr/local/www/system_certmanager.php:875
+#: usr/local/www/system_certmanager.php:703
+#: usr/local/www/system_certmanager.php:879
+#: usr/local/www/system_camanager.php:489
+#: usr/local/www/system_certmanager.php:703
+#: usr/local/www/system_certmanager.php:879
+msgid ""
+"NOTE: It is recommended to use an algorithm stronger than SHA1 when possible."
+msgstr ""注:これは、可能な場合はSHA1より強いアルゴリズムを使用することをお勧めします。"
+
+#: usr/local/www/system_camanager.php:653
+#: usr/local/www/system_certmanager.php:1127
+#: usr/local/www/system_certmanager.php:1131
+#: usr/local/www/system_camanager.php:653
+#: usr/local/www/system_certmanager.php:1131
+msgid "Valid From"
+msgstr "から有効"
+
+#: usr/local/www/system_camanager.php:658
+#: usr/local/www/system_certmanager.php:1132
+#: usr/local/www/system_certmanager.php:1136
+#: usr/local/www/system_camanager.php:658
+#: usr/local/www/system_certmanager.php:1136
+msgid "Valid Until"
+msgstr "まで有効"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:107
+#: usr/local/www/services_captiveportal_ip_edit.php:107
+msgid "A valid subnet mask must be specified"
+msgstr "有効なサブネットマスクを指定する必要があります"
+
+#: usr/local/www/vpn_openvpn_client.php:160
+#: usr/local/www/vpn_openvpn_server.php:213
+#: usr/local/www/vpn_openvpn_client.php:160
+#: usr/local/www/vpn_openvpn_server.php:213
+msgid ""
+"Protocol and IP address families do not match. You cannot select an IPv6 "
+"protocol and an IPv4 IP address."
+msgstr "プロトコルとIPv4のIPアドレス "プロトコルとIPアドレスファミリーはIPv6を選択することはできません。一致していません」 。"
+
+#: usr/local/www/vpn_openvpn_client.php:162
+#: usr/local/www/vpn_openvpn_server.php:215
+#: usr/local/www/vpn_openvpn_client.php:162
+#: usr/local/www/vpn_openvpn_server.php:215
+msgid ""
+"Protocol and IP address families do not match. You cannot select an IPv4 "
+"protocol and an IPv6 IP address."
+msgstr "プロトコルとIPv6のIPアドレス "プロトコルとIPアドレスファミリーは、あなたがIPv4を選択することはできません。一致していません」 。"
+
+#: usr/local/www/vpn_openvpn_client.php:164
+#: usr/local/www/vpn_openvpn_server.php:217
+#: usr/local/www/vpn_openvpn_client.php:164
+#: usr/local/www/vpn_openvpn_server.php:217
+msgid ""
+"An IPv4 protocol was selected, but the selected interface has no IPv4 "
+"address."
+msgstr "「 IPv4のプロトコルが選択されるが、選択したインターフェイスにはIPv4アドレスがありませんでした」アドレスを。"
+
+#: usr/local/www/vpn_openvpn_client.php:166
+#: usr/local/www/vpn_openvpn_server.php:219
+#: usr/local/www/vpn_openvpn_client.php:166
+#: usr/local/www/vpn_openvpn_server.php:219
+msgid ""
+"An IPv6 protocol was selected, but the selected interface has no IPv6 "
+"address."
+msgstr "「 IPv6プロトコルを選択しますが、選択されたインタフェースにはIPv6を持っていませんし、「アドレスを。"
+
+#: usr/local/www/vpn_openvpn_client.php:818
+#: usr/local/www/vpn_openvpn_server.php:1252
+#: usr/local/www/vpn_openvpn_client.php:818
+#: usr/local/www/vpn_openvpn_server.php:1252
+msgid "IPv4 Remote Network/s"
+msgstr "IPv4のリモートネットワーク/ S"
+
+#: usr/local/www/vpn_openvpn_client.php:822
+#: usr/local/www/vpn_openvpn_client.php:822
+msgid ""
+"These are the IPv4 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more CIDR ranges. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank to only communicate with other clients"
+msgstr "サイト間VPNを手動でルーティング」のテーブルを変更せずに確立できる」ように、これらは、トンネルを介してルーティングされたIPv4ネットワークである」 。 1つ以上のCIDRのコンマ区切りのリストとして表現します。範囲「このように入力し、サイト間VPNでLANが/ここのリモート。あなただけの他のクライアントと通信するために、この「空白のままに可能性"
+
+#: usr/local/www/vpn_openvpn_client.php:832
+#: usr/local/www/vpn_openvpn_server.php:1266
+#: usr/local/www/vpn_openvpn_client.php:832
+#: usr/local/www/vpn_openvpn_server.php:1266
+msgid "IPv6 Remote Network/s"
+msgstr "IPv6リモートネットワーク/ S"
+
+#: usr/local/www/vpn_openvpn_client.php:836
+#: usr/local/www/vpn_openvpn_client.php:836
+msgid ""
+"These are the IPv6 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more IP/PREFIX. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank to only communicate with other clients"
+msgstr "サイト間VPNを手動でルーティング」のテーブルを変更せずに設定することができる。 1または複数のIP /プレフィックスをカンマで区切ったリストとして発現された」これらはように、トンネルを介してルーティングされたIPv6ネットワークである」 。これはサイト間VPNである」場合には、リモートLANに入る/ sこちら。あなただけの他のクライアントと通信するために、この「空白のままに可能性"
+
+#: usr/local/www/vpn_openvpn_client.php:909
+#: usr/local/www/vpn_openvpn_client.php:909
+msgid "EXAMPLE:"
+msgstr "例:"
+
+#: usr/local/www/status_openvpn.php:201 usr/local/www/status_openvpn.php:211
+#: usr/local/www/status_openvpn.php:211
+msgid "Show Routing Table"
+msgstr "ショールーティングテーブル"
+
+#: usr/local/www/status_openvpn.php:201 usr/local/www/status_openvpn.php:211
+#: usr/local/www/status_openvpn.php:211
+msgid "Display OpenVPN's internal routing table for this server."
+msgstr "このサーバーのOpenVPNの内部のルーティングテーブルを表示します。"
+
+#: usr/local/www/status_openvpn.php:207 usr/local/www/status_openvpn.php:217
+#: usr/local/www/status_openvpn.php:217
+msgid "Routing Table"
+msgstr "経路指定テーブル"
+
+#: usr/local/www/status_openvpn.php:216 usr/local/www/status_openvpn.php:226
+#: usr/local/www/status_openvpn.php:226
+msgid "Target Network"
+msgstr "ターゲットネットワーク"
+
+#: usr/local/www/status_openvpn.php:217 usr/local/www/status_openvpn.php:227
+#: usr/local/www/status_openvpn.php:227
+msgid "Last Used"
+msgstr "最後に使用した"
+
+#: usr/local/www/status_openvpn.php:239 usr/local/www/status_openvpn.php:249
+#: usr/local/www/status_openvpn.php:249
+msgid ""
+"An IP address followed by C indicates a host currently connected through the "
+"VPN."
+msgstr "VPN "Cに続くIPアドレスは、現在を介して接続されたホストを示す「 。"
+
+#: usr/local/www/diag_testport.php:49 usr/local/www/diag_testport.php:114
+#: usr/local/www/fbegin.inc:218 usr/local/www/diag_testport.php:49
+#: usr/local/www/diag_testport.php:114 usr/local/www/fbegin.inc:218
+msgid "Test Port"
+msgstr "テストポート"
+
+#: usr/local/www/diag_testport.php:64 usr/local/www/diag_testport.php:64
+msgid "Please enter a valid IP or hostname."
+msgstr "有効なIPまたはホスト名を入力してください。"
+
+#: usr/local/www/diag_testport.php:68 usr/local/www/diag_testport.php:68
+msgid "Please enter a valid port number."
+msgstr "有効なポート番号を入力してください。"
+
+#: usr/local/www/diag_testport.php:72 usr/local/www/diag_testport.php:72
+msgid "Please enter a valid source port number, or leave the field blank."
+msgstr "有効な送信元ポート番号を入力するか、フィールドを空白のままにしてください。"
+
+#: usr/local/www/diag_testport.php:76 usr/local/www/diag_testport.php:76
+msgid "You cannot connect to an IPv4 address using IPv6."
+msgstr "あなたは、 IPv6を使用して、IPv4アドレスに接続することはできません。"
+
+#: usr/local/www/diag_testport.php:79 usr/local/www/diag_testport.php:79
+msgid "You cannot connect to an IPv6 address using IPv4."
+msgstr "あなたはIPv4を使用してIPv6アドレスに接続することはできません。"
+
+#: usr/local/www/diag_testport.php:106 usr/local/www/diag_testport.php:106
+msgid ""
+"This page allows you to perform a simple TCP connection test to determine if "
+"a host is up and accepting connections on a given port. This test does not "
+"function for UDP since there is no way to reliably determine if a UDP port "
+"accepts connections in this manner."
+msgstr "ホストが起動して指定されたポートで接続を受け入れている」このページでは、かどうかを判断するために、単純なTCP接続テストを実行することができます」 。このテストでは、このように接続を受け付ける「UDPのための機能は、UDPポートがあれば、確実に判別する方法がないので、 「ありません。"
+
+#: usr/local/www/diag_testport.php:108 usr/local/www/diag_testport.php:108
+msgid ""
+"No data is transmitted to the remote host during this test, it will only "
+"attempt to open a connection and optionally display the data sent back from "
+"the server."
+msgstr "「データは、この試験中にリモートホストに送信されていない、それだけに "接続を開き、必要に応じてサーバ」から返信データを表示しよう。"
+
+#: usr/local/www/diag_testport.php:132 usr/local/www/diag_testport.php:132
+msgid "This should typically be left blank."
+msgstr "これは通常、空白のままにしてください。"
+
+#: usr/local/www/diag_testport.php:136 usr/local/www/diag_testport.php:136
+msgid "Show Remote Text"
+msgstr "リモートテキストを表示"
+
+#: usr/local/www/diag_testport.php:139 usr/local/www/diag_testport.php:139
+msgid ""
+"Shows the text given by the server when connecting to the port. Will take "
+"10+ seconds to display if checked."
+msgstr "チェックすると表示するように10秒"ポートに接続した場合、サーバーによって指定されたテキストは連れて行ってくれません示しています」 。"
+
+#: usr/local/www/diag_testport.php:159 usr/local/www/diag_testport.php:161
+#: usr/local/www/diag_traceroute.php:104 usr/local/www/diag_ping.php:102
+#: usr/local/www/diag_testport.php:161 usr/local/www/diag_traceroute.php:104
+#: usr/local/www/diag_ping.php:102
+msgid "IP Protocol"
+msgstr "IPプロトコル"
+
+#: usr/local/www/diag_testport.php:166 usr/local/www/diag_testport.php:168
+#: usr/local/www/diag_testport.php:168
+msgid "IPv4"
+msgstr "IPv4の"
+
+#: usr/local/www/diag_testport.php:169 usr/local/www/diag_testport.php:171
+#: usr/local/www/diag_testport.php:171
+msgid "IPv6"
+msgstr "IPv6の"
+
+#: usr/local/www/diag_testport.php:173 usr/local/www/diag_testport.php:175
+#: usr/local/www/diag_testport.php:175
+msgid ""
+"If you force IPv4 or IPv6 and use a hostname that does not contain a result "
+"using that protocol, it will result in an error. For example if you force "
+"IPv4 and use a hostname that only returns an AAAA IPv6 IP address, it will "
+"not work."
+msgstr ""あなたはIPv4またはIPv6を強制し、その結果が含まれていないホスト名を使用する場合、「そのプロトコルを使用して、エラーになります。あなたが強制的にたとえば「 IPv4のが唯一AAAA IPv6のIPアドレスを返すホスト名を使用し、それがします」は動作しませ。"
+
+#: usr/local/www/diag_testport.php:186 usr/local/www/diag_testport.php:188
+#: usr/local/www/diag_testport.php:188
+msgid "Port Test Results"
+msgstr "ポートテスト結果"
+
+#: usr/local/www/diag_testport.php:246 usr/local/www/diag_testport.php:248
+#: usr/local/www/diag_testport.php:248
+msgid ""
+"No output received, or connection failed. Try with "Show Remote Text" "
+"unchecked first."
+msgstr "「何も出力が受信されない、または接続に失敗しました。で試してみてください」の表示リモートテキスト""チェックしない第一。"
+
+#: usr/local/www/diag_testport.php:248 usr/local/www/diag_testport.php:250
+#: usr/local/www/diag_testport.php:250
+msgid "Connection failed (Refused/Timeout)"
+msgstr "接続は(拒否/タイムアウト)に失敗しました"
+
+#: usr/local/www/firewall_rules_edit.php:1295
+#: usr/local/www/firewall_nat_edit.php:780
+#: usr/local/www/firewall_nat_out_edit.php:647
+#: usr/local/www/firewall_rules_edit.php:1302
+#: usr/local/www/firewall_nat_edit.php:792
+#: usr/local/www/firewall_nat_out_edit.php:659
+#: usr/local/www/firewall_rules_edit.php:1301
+#: usr/local/www/firewall_nat_edit.php:793
+#: usr/local/www/firewall_rules_edit.php:1301
+#: usr/local/www/firewall_nat_edit.php:793
+#: usr/local/www/firewall_nat_out_edit.php:659
+msgid ""
+"Hint: This prevents the rule on Master from automatically syncing to other "
+"CARP members. This does NOT prevent the rule from being overwritten on Slave."
+msgstr ""ヒント:これは、自動的に他のと同期からマスターにルールを防ぐ「 CARPのメンバー。これはスレーブで上書きされないルールを防ぐことはできません。"
+
+#: usr/local/www/interfaces_qinq.php:68 usr/local/www/interfaces_qinq.php:68
+msgid "QinQ interface does not exist"
+msgstr "QinQのインタフェースは存在しません"
+
+#: usr/local/www/interfaces_vlan_edit.php:84
+#: usr/local/www/interfaces_vlan_edit.php:84
+msgid "Interface supplied as parent is invalid"
+msgstr "親として付属のインターフェースが無効です"
+
+#: usr/local/www/system_firmware_settings.php:151
+#: usr/local/www/system_firmware_settings.php:153
+#: usr/local/www/system_firmware_settings.php:153
+#, php-format
+msgid ""
+"Entries denoted by "Current architecture" match the architecture of your "
+"current installation, such as %s. Changing architectures during an upgrade "
+"is not recommended, and may require a manual reboot after the update "
+"completes."
+msgstr "現在のアーキテクチャ」で示すエントリは」など%s.などの現在のインストール、 「あなたのアーキテクチャと一致」アップグレード中にアーキテクチャを変更しても、 「推奨されておらず、更新後手動で再起動が必要な場合があり、「完了する。"
+
+#: usr/local/www/interfaces_lagg_edit.php:95
+#: usr/local/www/interfaces_lagg_edit.php:98
+#: usr/local/www/interfaces_lagg_edit.php:95
+#: usr/local/www/interfaces_lagg_edit.php:98
+msgid "Interface supplied as member is invalid"
+msgstr "メンバーとして付属のインターフェースが無効です"
+
+#: usr/local/www/interfaces_lagg_edit.php:101
+#: usr/local/www/interfaces_lagg_edit.php:101
+msgid "Protocol supplied is invalid"
+msgstr "付属議定書は無効である"
+
+#: usr/local/www/status_captiveportal_expire.php:58
+#: usr/local/www/status_captiveportal_expire.php:73
+#: usr/local/www/status_captiveportal_vouchers.php:112
+#: usr/local/www/status_captiveportal.php:110
+#: usr/local/www/status_captiveportal_test.php:75
+#: usr/local/www/status_captiveportal_voucher_rolls.php:79
+#: usr/local/www/status_captiveportal_expire.php:58
+#: usr/local/www/status_captiveportal_expire.php:73
+#: usr/local/www/status_captiveportal_vouchers.php:112
+#: usr/local/www/status_captiveportal.php:110
+#: usr/local/www/status_captiveportal_test.php:75
+#: usr/local/www/status_captiveportal_voucher_rolls.php:79
+msgid "Expire Vouchers"
+msgstr "バウチャーの有効期限"
+
+#: usr/local/www/status_captiveportal_expire.php:86
+#: usr/local/www/status_captiveportal_expire.php:86
+msgid ""
+"Enter multiple vouchers separated by space or newline. All valid vouchers "
+"will be marked as expired"
+msgstr "「空白や改行で区切られた複数の伝票を入力します。すべての有効なクーポン」は有効期限が切れとしてマークされます"
+
+#: usr/local/www/firewall_nat_edit.php:835
+#: usr/local/www/firewall_nat_edit.php:847
+#: usr/local/www/firewall_nat_edit.php:848
+#: usr/local/www/firewall_nat_edit.php:848
+msgid ""
+"NOTE: The "pass" selection does not work properly with Multi-WAN. It will "
+"only work on an interface containing the default gateway."
+msgstr ""注: 「合格」の選択は、複数WANで正しく動作しないことがします。 」だけデフォルトゲートウェイを含む、インターフェイス上で動作する。"
+
+#: usr/local/www/interfaces_vlan.php:71 usr/local/www/interfaces_vlan.php:71
+msgid "Invalid VLAN interface."
+msgstr "無効なVLANインターフェイス。"
+
+#: usr/local/www/interfaces_gif_edit.php:87
+#: usr/local/www/interfaces_gif_edit.php:87
+msgid ""
+"The alias IP address family has to match the family of the remote peer "
+"address."
+msgstr "アドレス「エイリアスIPアドレスファミリーは、リモートピアの家族を一致する必要があります」 。"
+
+#: usr/local/www/services_dhcp_edit.php:193
+#: usr/local/www/services_dhcp_edit.php:193
+msgid ""
+"The IP address must not be within the range configured on a DHCP pool for "
+"this interface."
+msgstr "このインターフェースの「IPアドレスが用DHCPプールに設定された範囲内であってはならない」 。"
+
+#: usr/local/www/services_dhcp_edit.php:388
+#: usr/local/www/services_dhcp_edit.php:388
+msgid "ARP Table Static Entry"
+msgstr "ARPテーブルスタティックエントリ"
+
+#: usr/local/www/services_dhcp_edit.php:391
+#: usr/local/www/services_dhcp_edit.php:391
+msgid "Create an ARP Table Static Entry for this MAC & IP Address pair. "
+msgstr "このMAC & IPアドレスのペアのためのARPテーブルのスタティックエントリを作成します。"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:117
+#: usr/local/www/firewall_virtual_ip_edit.php:117
+msgid "This IP address is being used by another interface or VIP."
+msgstr "このIPアドレスは別のインターフェイスまたはVIPで使用されています。"
+
+#: usr/local/www/diag_traceroute.php:122 usr/local/www/diag_traceroute.php:141
+#: usr/local/www/diag_traceroute.php:141
+msgid "Reverse Address Lookup"
+msgstr "逆アドレス検索"
+
+#: usr/local/www/interfaces_bridge.php:70
+#: usr/local/www/interfaces_bridge.php:70
+msgid "Invalid bridge interface."
+msgstr "無効なブリッジ·インターフェース。"
+
+#: usr/local/www/diag_smart.php:339 usr/local/www/diag_smart.php:339
+msgid "Perform Self-tests"
+msgstr "セルフテストを実行する"
+
+#: usr/local/www/diag_smart.php:384 usr/local/www/diag_smart.php:384
+msgid "Self-test"
+msgstr "セルフテスト"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1484
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1427
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1364
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1225
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1485
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1428
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1365
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1226
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1484
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1427
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1364
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1225
+msgid "Connections From Upstream SIP Server"
+msgstr "上流のSIPサーバからの接続"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1497
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1440
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1377
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1238
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1499
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1442
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1379
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1240
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1498
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1441
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1378
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1239
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1498
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1441
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1378
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1239
+msgid "Connections To Upstream SIP Server"
+msgstr "上流SIPサーバーへの接続"
+
+#: usr/local/www/vpn_pppoe_edit.php:149 usr/local/www/vpn_pppoe_edit.php:149
+msgid "Wrong data submitted"
+msgstr "提出され、誤ったデータ"
+
+#: usr/local/www/license.php:158 usr/local/www/license.php:158
+msgid "1992-2012 The FreeBSD Project. All rights reserved"
+msgstr "1992-2012ザ· FreeBSDプロジェクト。無断複写·転載を禁じます"
+
+#: usr/local/www/license.php:161 usr/local/www/license.php:161
+msgid "1999-2010 The PHP Group. All rights reserved."
+msgstr "1999-2010ザ· PHPグループ。無断複写·転載を禁じます。"
+
+#: usr/local/www/license.php:164 usr/local/www/license.php:164
+msgid "2004, Jan Knescke, incremental"
+msgstr "2004 、ヤンKnescke 、インクリメンタル"
+
+#: usr/local/www/license.php:168 usr/local/www/license.php:168
+msgid "2004-2012 Internet Software Consortium, Inc."
+msgstr "2004-2012 Internet Software Consortiumの株式会社"
+
+#: usr/local/www/license.php:169 usr/local/www/license.php:169
+msgid "1995-2003 Internet Software Consortium"
+msgstr "1995-2003 Internet Software Consortiumの"
+
+#: usr/local/www/services_dhcp.php:352 usr/local/www/services_dhcp.php:372
+#: usr/local/www/services_dhcp.php:372
+msgid ""
+"The specified range must not be within the DHCP range for this interface."
+msgstr "「指定された範囲は、このインターフェイスのDHCP範囲内にあってはならない。"
+
+#: usr/local/www/services_dhcp.php:361 usr/local/www/services_dhcp.php:381
+#: usr/local/www/services_dhcp.php:381
+msgid ""
+"The specified range must not be within the range configured on a DHCP pool "
+"for this interface."
+msgstr "このインタフェースの「指定された範囲は、 DHCPプールに設定された範囲内であってはならない」 。"
+
+#: usr/local/www/services_dhcp.php:713 usr/local/www/services_dhcp.php:733
+#: usr/local/www/services_dhcp.php:733
+msgid "Pool Description"
+msgstr "プールの説明"
+
+#: usr/local/www/services_dhcp.php:903 usr/local/www/services_dhcp.php:923
+#: usr/local/www/services_dhcp.php:923
+msgid ""
+"Leave blank to disable. Enter the interface IP address of the other "
+"machine. Machines must be using CARP. Interface's advskew determines "
+"whether the DHCPd process is Primary or Secondary. Ensure one machine's "
+"advskew<20 (and the other is >20)."
+msgstr "「無効にする場合は空白のままにしておきます。他のインターフェイスIPアドレスを入力し、 "マシンを。マシンは、CARPを使用する必要があります。インタフェースのadvskewは「のdhcpdプロセスがプライマリまたはセカンダリであるかどうか。 1マシンの確認」を決定advskew u003c 20 (他方はu003e 20) 。"
+
+#: usr/local/www/services_dhcp.php:946 usr/local/www/services_dhcp.php:966
+#: usr/local/www/services_dhcp.php:966
+msgid ""
+"By default DHCP leases are displayed in UTC time. By checking this\n"
+"ttttttbox DHCP lease time will be displayed in local time and set to "
+"time zone selected. This will be used for all DHCP interfaces lease time."
+msgstr "「デフォルトのDHCPでリースはUTC時間で表示されます。チェックすることでthis\n 「 ttttttbox DHCPリース時間は現地時間で表示され、選択したタイムゾーン」に設定されます。これは、すべてのDHCPインターフェイスのリース時間のために使用されます。"
+
+#: usr/local/www/services_dhcp.php:1146 usr/local/www/services_dhcp.php:1166
+#: usr/local/www/services_dhcp.php:1166
+msgid "DHCP Static Mappings for this interface."
+msgstr "このインターフェイスのDHCP静的マッピング。"
+
+#: usr/local/www/diag_system_pftop.php:133
+#: usr/local/www/diag_system_pftop.php:133
+msgid "View type:"
+msgstr "ビューの種類:"
+
+#: usr/local/www/diag_system_pftop.php:136
+#: usr/local/www/diag_system_pftop.php:136
+msgid "Label"
+msgstr "ラベル"
+
+#: usr/local/www/diag_system_pftop.php:141
+#: usr/local/www/diag_system_pftop.php:141
+msgid "Speed"
+msgstr "スピード"
+
+#: usr/local/www/diag_system_pftop.php:150
+#: usr/local/www/diag_system_pftop.php:150
+msgid "Age"
+msgstr "時代"
+
+#: usr/local/www/diag_system_pftop.php:151
+#: usr/local/www/diag_system_pftop.php:151
+msgid "Bytes"
+msgstr "バイト"
+
+#: usr/local/www/diag_system_pftop.php:152
+#: usr/local/www/diag_system_pftop.php:152
+msgid "Destination Address"
+msgstr "宛先アドレス"
+
+#: usr/local/www/diag_system_pftop.php:154
+#: usr/local/www/diag_system_pftop.php:154
+msgid "Expiry"
+msgstr "満了"
+
+#: usr/local/www/diag_system_pftop.php:156
+#: usr/local/www/diag_system_pftop.php:156
+msgid "Peak"
+msgstr "ピーク"
+
+#: usr/local/www/diag_system_pftop.php:157
+#: usr/local/www/diag_system_pftop.php:157
+msgid "Packet"
+msgstr "パケット"
+
+#: usr/local/www/diag_system_pftop.php:161 usr/local/www/diag_testport.php:143
+#: usr/local/www/diag_traceroute.php:113 usr/local/www/diag_ping.php:111
+#: usr/local/www/diag_testport.php:143 usr/local/www/diag_traceroute.php:113
+#: usr/local/www/diag_system_pftop.php:161 usr/local/www/diag_ping.php:111
+msgid "Source Address"
+msgstr "送信元アドレス"
+
+#: usr/local/www/diag_system_pftop.php:166
+#: usr/local/www/diag_system_pftop.php:166
+msgid "Number of States:"
+msgstr "状態の数:"
+
+#: usr/local/www/system_advanced_misc.php:357
+#: usr/local/www/system_advanced_misc.php:404
+#: usr/local/www/system_advanced_misc.php:404
+msgid "On AC Power Mode"
+msgstr "AC電源モードオン"
+
+#: usr/local/www/system_advanced_misc.php:365
+#: usr/local/www/system_advanced_misc.php:412
+#: usr/local/www/system_advanced_misc.php:412
+msgid "On Battery Power Mode"
+msgstr "バッテリ電源モードオン"
+
+#: usr/local/www/bandwidth_by_ip.php:24 usr/local/www/bandwidth_by_ip.php:24
+msgid "Wrong Interface"
+msgstr "誤ったインターフェイス"
+
+#: usr/local/www/services_dhcpv6.php:601 usr/local/www/services_dhcpv6.php:601
+msgid "Prefix Delegation Size"
+msgstr "接頭委任サイズ"
+
+#: usr/local/www/services_dhcpv6.php:846 usr/local/www/services_dhcpv6.php:846
+msgid "DHCPv6 Static Mappings for this interface."
+msgstr "このインタフェースのDHCPv6の静的マッピング。"
+
+#: usr/local/www/system_authservers.php:217
+#: usr/local/www/system_authservers.php:217
+msgid "RADIUS Timeout value must be numeric and positive."
+msgstr "RADIUSのタイムアウト値は、数値、正でなければなりません。"
+
+#: usr/local/www/system_authservers.php:731
+#: usr/local/www/system_authservers.php:731
+msgid "Authentication Timeout"
+msgstr "認証タイムアウト"
+
+#: usr/local/www/system_authservers.php:734
+#: usr/local/www/system_authservers.php:734
+msgid ""
+"This value controls how long, in seconds, that the RADIUS server may take to "
+"respond to an authentication request."
+msgstr "認証要求に応答し、「 RADIUSサーバにかかる場合があること秒この値は、コントロールのどのくらい、 、 」 。"
+
+#: usr/local/www/system_authservers.php:735
+#: usr/local/www/system_authservers.php:735
+msgid "If left blank, the default value is 5 seconds."
+msgstr "空白の場合、デフォルト値は5秒です。"
+
+#: usr/local/www/system_authservers.php:736
+#: usr/local/www/system_authservers.php:736
+msgid ""
+"NOTE: If you are using an interactive two-factor authentication system, "
+"increase this timeout to account for how long it will take the user to "
+"receive and enter a token."
+msgstr ""注:対話型の2要素認証システムを使用している場合は、 「それは"受信したトークンを入力するようにユーザにかかる時間を考慮して、このタイムアウトを増やす。"
+
+#: usr/local/www/system_advanced_firewall.php:80
+#: usr/local/www/system_advanced_firewall.php:80
+msgid "The Firewall Adaptive values must be set together."
+msgstr "ファイアウォール適応値を一緒に設定する必要があります。"
+
+#: usr/local/www/system_advanced_firewall.php:82
+#: usr/local/www/system_advanced_firewall.php:82
+msgid "The Firewall Adaptive Start value must be an integer."
+msgstr "ファイアウォール適応Start値は整数でなければなりません。"
+
+#: usr/local/www/system_advanced_firewall.php:85
+#: usr/local/www/system_advanced_firewall.php:85
+msgid "The Firewall Adaptive End value must be an integer."
+msgstr "ファイアウォール適応終了値は整数でなければなりません。"
+
+#: usr/local/www/system_advanced_firewall.php:345
+#: usr/local/www/system_advanced_firewall.php:346
+#: usr/local/www/system_advanced_firewall.php:346
+msgid "Firewall Adaptive Timeouts"
+msgstr "ファイアウォールアダプティブタイムアウト"
+
+#: usr/local/www/system_advanced_firewall.php:347
+#: usr/local/www/system_advanced_firewall.php:348
+#: usr/local/www/system_advanced_firewall.php:348
+msgid ""
+"Timeouts for states can be scaled adaptively as the number of state table "
+"entries grows."
+msgstr "成長のエントリ"状態のタイムアウトは、状態テーブルの数が適応的にスケーリングすることができます」 。"
+
+#: usr/local/www/system_advanced_firewall.php:350
+#: usr/local/www/system_advanced_firewall.php:351
+#: usr/local/www/system_advanced_firewall.php:351
+msgid ""
+"When the number of state entries exceeds this value, adaptive scaling "
+"begins. All timeout values are scaled linearly with factor (adaptive.end - "
+"number of states) / (adaptive.end - adaptive.start)."
+msgstr "「状態エントリの数がこの値を超えると、適応スケーリング」は始まる。 / ( adaptive.end - adaptive.start ) - すべてのタイムアウト値は、因子(「状態数adaptive.end )と直線的にスケールされます。"
+
+#: usr/local/www/system_advanced_firewall.php:354
+#: usr/local/www/system_advanced_firewall.php:355
+#: usr/local/www/system_advanced_firewall.php:355
+msgid ""
+"When reaching this number of state entries, all timeout values become zero, "
+"effectively purging all state entries immediately. This value is used to "
+"define the scale factor, it should not actually be reached (set a lower "
+"state limit, see below)."
+msgstr "事実上、すぐにすべての状態の項目をパージする」状態エントリのこの数に達する場合は、すべてのタイムアウト値は、ゼロになる」 。この値は、するために使用される"(下記参照、状態制限スケールファクタを定義するが、実際にはより低いセット)に到達すべきではない」 。"
+
+#: usr/local/www/system_advanced_firewall.php:356
+#: usr/local/www/system_advanced_firewall.php:357
+#: usr/local/www/system_advanced_firewall.php:357
+msgid "Note: Leave this blank for the default(0)."
+msgstr "注:デフォルトは、この空白のままにしておきます( 0 ) 。"
+
+#: usr/local/www/system_advanced_firewall.php:447
+#: usr/local/www/system_advanced_firewall.php:448
+#: usr/local/www/system_advanced_firewall.php:448
+msgid "Bogon Networks"
+msgstr "Bogonネットワーク"
+
+#: usr/local/www/system_advanced_firewall.php:450
+#: usr/local/www/system_advanced_firewall.php:451
+#: usr/local/www/system_advanced_firewall.php:451
+msgid "Update Frequency"
+msgstr "更新頻度"
+
+#: usr/local/www/system_advanced_firewall.php:453
+#: usr/local/www/system_advanced_firewall.php:454
+#: usr/local/www/system_advanced_firewall.php:454
+msgid "Monthly"
+msgstr "毎月"
+
+#: usr/local/www/system_advanced_firewall.php:454
+#: usr/local/www/system_advanced_firewall.php:455
+#: usr/local/www/system_advanced_firewall.php:455
+msgid "Weekly"
+msgstr "毎週"
+
+#: usr/local/www/system_advanced_firewall.php:455
+#: usr/local/www/system_advanced_firewall.php:456
+#: usr/local/www/system_advanced_firewall.php:456
+msgid "Daily"
+msgstr "日々"
+
+#: usr/local/www/system_advanced_firewall.php:458
+#: usr/local/www/system_advanced_firewall.php:459
+#: usr/local/www/system_advanced_firewall.php:459
+msgid ""
+"The frequency of updating the lists of IP addresses that are reserved (but "
+"not RFC 1918) or not yet assigned by IANA."
+msgstr "「 ( 1918年のRFCではないか、まだIANAによって割り当てられていない予約済みますが)されているIPアドレスのリストを更新する頻度」 。"
+
+#: usr/local/www/services_captiveportal.php:227
+#: usr/local/www/services_captiveportal.php:243
+#: usr/local/www/services_captiveportal.php:243
+msgid ""
+"The NAS-Identifier must be 3-253 characters long and should only contain "
+"ASCII characters."
+msgstr "ASCII文字を「NAS-識別子は3から253文字の長さでなければならず、唯一の含まれている必要があります」 。"
+
+#: usr/local/www/services_captiveportal.php:593
+#: usr/local/www/services_captiveportal.php:609
+#: usr/local/www/services_captiveportal.php:609
+msgid "Allow only users/groups with 'Captive portal login' privilege set"
+msgstr "「キャプティブポータルのログイン」の権限が設定されている唯一のユーザー/グループを許可"
+
+#: usr/local/www/services_captiveportal.php:760
+#: usr/local/www/services_captiveportal.php:776
+#: usr/local/www/services_captiveportal.php:776
+msgid "MAC authentication secret"
+msgstr "MAC認証の秘密"
+
+#: usr/local/www/services_captiveportal.php:823
+#: usr/local/www/services_captiveportal.php:839
+#: usr/local/www/services_captiveportal.php:839
+msgid "Accounting Style"
+msgstr "会計スタイル"
+
+#: usr/local/www/services_captiveportal.php:824
+#: usr/local/www/services_captiveportal.php:840
+#: usr/local/www/services_captiveportal.php:840
+msgid "Invert Acct-Input-Octets and Acct-Output-Octets"
+msgstr "反転ACCT-入力·オクテットおよびacct -出力 - オクテット"
+
+#: usr/local/www/services_captiveportal.php:825
+#: usr/local/www/services_captiveportal.php:841
+#: usr/local/www/services_captiveportal.php:841
+msgid ""
+"When this is enabled, data counts for RADIUS accounting packets will be "
+"taken from the client perspective, not the NAS. Acct-Input-Octets will "
+"represent download, and Acct-Output-Octets will represent upload."
+msgstr "「これを有効にすると、 RADIUSアカウンティングパケットのデータ数がされ、「クライアントの観点ではなく、NASから撮影。 ACCT-入力·オクテットは「ダウンロードを表現し、 ACCT-出力 - オクテットは、アップロードを表します。"
+
+#: usr/local/www/services_captiveportal.php:829
+#: usr/local/www/services_captiveportal.php:845
+#: usr/local/www/services_captiveportal.php:845
+msgid "NAS Identifier"
+msgstr "NASの識別子"
+
+#: usr/local/www/services_captiveportal.php:831
+#: usr/local/www/services_captiveportal.php:847
+#: usr/local/www/services_captiveportal.php:847
+msgid "Specify a NAS identifier to override the default value"
+msgstr "デフォルト値を上書きするために、NAS識別子を指定する"
+
+#: usr/local/www/pkg_mgr_install.php:193 usr/local/www/pkg_mgr_install.php:189
+#: usr/local/www/pkg_mgr_install.php:189
+msgid "No packages are installed."
+msgstr "何のパッケージがインストールされていません。"
+
+#: usr/local/www/interfaces_bridge_edit.php:154
+#: usr/local/www/interfaces_bridge_edit.php:154
+msgid "A member interface passed does not exist in configuration"
+msgstr "渡されたメンバーインターフェイスは、コンフィギュレーションに存在しない"
+
+#: usr/local/www/status_queues.php:150 usr/local/www/status_queues.php:150
+msgid "PPS"
+msgstr "PPS"
+
+#: usr/local/www/status_queues.php:152 usr/local/www/status_queues.php:152
+msgid "Borrows"
+msgstr "借用"
+
+#: usr/local/www/status_queues.php:153 usr/local/www/status_queues.php:153
+msgid "Suspends"
+msgstr "を中断"
+
+#: usr/local/www/status_queues.php:154 usr/local/www/status_queues.php:154
+msgid "Drops"
+msgstr "ドロップス"
+
+#: usr/local/www/status_queues.php:155 usr/local/www/status_queues.php:155
+msgid "Length"
+msgstr "長さ"
+
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:51
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:78
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:78
+msgid "Int."
+msgstr "int型。"
+
+#: usr/local/www/widgets/widgets/log.widget.php:164
+#: usr/local/www/widgets/widgets/log.widget.php:168
+#: usr/local/www/widgets/widgets/log.widget.php:176
+msgid "IF"
+msgstr "IF"
+
+#: usr/local/www/widgets/widgets/log.widget.php:167
+#: usr/local/www/widgets/widgets/log.widget.php:171
+msgid "Prot"
+msgstr "PROT"
+
+#: usr/local/www/services_dnsmasq.php:199
+#: usr/local/www/services_dnsmasq.php:201
+#: usr/local/www/services_dnsmasq.php:222
+#: usr/local/www/services_dnsmasq.php:222
+msgid "DNS Query Forwarding"
+msgstr "DNSクエリ転送"
+
+#: usr/local/www/services_dnsmasq.php:202
+#: usr/local/www/services_dnsmasq.php:204
+#: usr/local/www/services_dnsmasq.php:225
+#: usr/local/www/services_dnsmasq.php:225
+msgid "Query DNS servers sequentially"
+msgstr "クエリのDNSサーバーが順次"
+
+#: usr/local/www/services_dnsmasq.php:203
+#: usr/local/www/services_dnsmasq.php:205
+#: usr/local/www/services_dnsmasq.php:226
+#: usr/local/www/services_dnsmasq.php:226
+#, php-format
+msgid ""
+"If this option is set, %s DNS Forwarder (dnsmasq) will query the DNS servers "
+"sequentially in the order specified (<i>System - General Setup - DNS "
+"Servers</i>), rather than all at once in parallel. "
+msgstr "むしろ、一度のすべてのより - ( - 一般設定のDNS 「サーバーu003c/ I u003eシステムu003cIu003e )指定された順に「このオプションが設定されている場合、DNSフォワーダ( DNSMASQ )がDNSサーバに問い合わせを行い%s "平行である。"
+
+#: usr/local/www/services_dnsmasq.php:212
+#: usr/local/www/services_dnsmasq.php:214
+#: usr/local/www/services_dnsmasq.php:235
+#: usr/local/www/services_dnsmasq.php:235
+msgid "Require domain"
+msgstr "ドメインを必要とする"
+
+#: usr/local/www/services_dnsmasq.php:213
+#: usr/local/www/services_dnsmasq.php:215
+#: usr/local/www/services_dnsmasq.php:236
+#: usr/local/www/services_dnsmasq.php:236
+#, php-format
+msgid ""
+"If this option is set, %s DNS Forwarder (dnsmasq) will not forward A or AAAA "
+"queries for plain names, without dots or domain parts, to upstream name "
+"servers. If the name is not known from /etc/hosts or DHCP then a "not found"
+"" answer is returned. "
+msgstr "名前「サーバーの上流、ドットまたはドメインの部分なしで、プレーンな名前の照会」このオプションが設定されている場合、DNSフォワーダは転送しませんAまたはAAAA ( DNSMASQ ) %s 」 。名前は/ etc / hostsファイルから知られていない場合またはDHCPはその後、 "見つかりません""答えが返されます。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:183
+#: usr/local/www/vpn_ipsec_phase1.php:183
+msgid ""
+"A valid remote gateway IPv4 address must be specified or you need to change "
+"protocol to IPv6"
+msgstr "「有効なリモートゲートウェイIPv4アドレスを指定する必要があります。または、変更する必要がある」 IPv6へのプロトコルを"
+
+#: usr/local/www/vpn_ipsec_phase1.php:185
+#: usr/local/www/vpn_ipsec_phase1.php:185
+msgid ""
+"A valid remote gateway IPv6 address must be specified or you need to change "
+"protocol to IPv4"
+msgstr "「有効なリモートゲートウェイのIPv6アドレスを指定する必要があります。または、変更する必要がある」 IPv4にプロトコルを"
+
+#: usr/local/www/vpn_ipsec_phase1.php:205
+#: usr/local/www/vpn_ipsec_phase1.php:205
+msgid "There is a Phase 2 using IPv6, you cannot use IPv4."
+msgstr "IPv6を使用して、フェーズ2がありますが、あなたは、IPv4を使用することはできません。"
+
+#: usr/local/www/vpn_ipsec_phase1.php:209
+#: usr/local/www/vpn_ipsec_phase1.php:209
+msgid "There is a Phase 2 using IPv4, you cannot use IPv6."
+msgstr "IPv4を使用して、フェーズ2がありますが、あなたは、IPv6を使用することはできません。"
+
+#: usr/local/www/vpn_openvpn_server.php:1226
+#: usr/local/www/vpn_openvpn_server.php:1226
+msgid "IPv4 Local Network/s"
+msgstr "IPv4のローカルネットワーク/ S"
+
+#: usr/local/www/vpn_openvpn_server.php:1230
+#: usr/local/www/vpn_openvpn_server.php:1230
+msgid ""
+"These are the IPv4 networks that will be accessible from the remote "
+"endpoint. Expressed as a comma-separated list of one or more CIDR ranges. "
+"You may leave this blank if you don't want to add a route to the local "
+"network through this tunnel on the remote machine. This is generally set to "
+"your LAN network"
+msgstr "エンドポイントは"これらは、リモートからアクセスできるようになり、IPv4ネットワークである」 。 1つ以上のCIDR範囲をカンマで区切ったリストとして表現。リモートマシン上でこのトンネルを経由してネットワーク」は、ローカルへのルートを追加したくない場合は、この空白を残すこと」 。これは一般に「 LANネットワークに設定されている"
+
+#: usr/local/www/vpn_openvpn_server.php:1239
+#: usr/local/www/vpn_openvpn_server.php:1239
+msgid "IPv6 Local Network/s"
+msgstr "IPv6ローカルネットワーク/ S"
+
+#: usr/local/www/vpn_openvpn_server.php:1243
+#: usr/local/www/vpn_openvpn_server.php:1243
+msgid ""
+"These are the IPv6 networks that will be accessible from the remote "
+"endpoint. Expressed as a comma-separated list of one or more IP/PREFIX. You "
+"may leave this blank if you don't want to add a route to the local network "
+"through this tunnel on the remote machine. This is generally set to your LAN "
+"network"
+msgstr "エンドポイントは"これらは、リモートからアクセスできるようになり、IPv6ネットワークである」 。 1または複数のIP /プレフィックスをカンマで区切ったリストとして表現。リモートマシン上でこのトンネルを通過して、 「ローカルネットワークへのルートを追加しない場合は空白のままにあり」 。これは、一般にLAN 」のネットワークに設定されている"
+
+#: usr/local/www/vpn_openvpn_server.php:1256
+#: usr/local/www/vpn_openvpn_server.php:1256
+msgid ""
+"These are the IPv4 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more CIDR ranges. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank if you don't want a site-to-site VPN"
+msgstr "サイト間VPNを手動でルーティング」のテーブルを変更せずに確立できる」ように、これらは、トンネルを介してルーティングされたIPv4ネットワークである」 。 1つ以上のCIDRのコンマ区切りのリストとして表現します。範囲「このように入力し、サイト間VPNでLANが/ここのリモート。あなたはサイト間VPNを使用しない場合は、この「空白のままに可能性"
+
+#: usr/local/www/vpn_openvpn_server.php:1270
+#: usr/local/www/vpn_openvpn_server.php:1270
+msgid ""
+"These are the IPv6 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more IP/PREFIX. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank if you don't want a site-to-site VPN"
+msgstr "サイト間VPNを手動でルーティング」のテーブルを変更せずに設定することができる。 1または複数のIP /プレフィックスをカンマで区切ったリストとして発現された」これらはように、トンネルを介してルーティングされたIPv6ネットワークである」 。これはサイト間VPNである」場合には、リモートLANに入る/ sこちら。あなたはサイト間VPNを使用しない場合は、この「空白のままに可能性"
+
+#: usr/local/www/vpn_openvpn_server.php:1405
+#: usr/local/www/vpn_openvpn_server.php:1405
+msgid "Topology"
+msgstr "トポロジー"
+
+#: usr/local/www/vpn_openvpn_server.php:1415
+#: usr/local/www/vpn_openvpn_server.php:1415
+msgid ""
+"Allocate only one IP per client (topology subnet), rather than an isolated "
+"subnet per client (topology net30)."
+msgstr "クライアントごとにサブネット(トポロジーnet30 ) 」のみ1クライアントごとにIP(トポロジのサブネット)のではなく、孤立を割り当てる」 。"
+
+#: usr/local/www/vpn_openvpn_server.php:1422
+#: usr/local/www/vpn_openvpn_server.php:1422
+msgid ""
+"Relevant when supplying a virtual adapter IP address to clients when using "
+"tun mode on IPv4."
+msgstr "「関連する使用時にクライアントに仮想アダプタのIPアドレスを供給する際に、「 IPv4の上TUNモードを。"
+
+#: usr/local/www/vpn_openvpn_server.php:1423
+#: usr/local/www/vpn_openvpn_server.php:1423
+msgid ""
+"Some clients may require this even for IPv6, such as OpenVPN Connect (iOS/"
+"Android). Others may break if it is present, such as older versions of "
+"OpenVPN or clients such as Yealink phones."
+msgstr "「 ( Androidの一部のクライアントでも、このようなOpenVPNの接続のiOS / )などのIPv6のためにこれを必要とすること」 。それはそのような "OpenVPNのかなYealink電話などのクライアントの旧バージョンなど、存在する場合、他に破損する可能性があります。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:133
+#: usr/local/www/vpn_ipsec_phase2.php:133
+msgid ""
+"A valid local network IPv4 address must be specified or you need to change "
+"Mode to IPv6"
+msgstr "「有効なローカルネットワークのIPv4アドレスを指定する必要があります。または、変更する必要があるの「IPv6モードに"
+
+#: usr/local/www/vpn_ipsec_phase2.php:135
+#: usr/local/www/vpn_ipsec_phase2.php:135
+msgid ""
+"A valid local network IPv6 address must be specified or you need to change "
+"Mode to IPv4"
+msgstr "「有効なローカルネットワークのIPv6アドレスを指定する必要があります。または、変更する必要がある」はIPv4モードに"
+
+#: usr/local/www/vpn_ipsec_phase2.php:159
+#: usr/local/www/vpn_ipsec_phase2.php:159
+msgid ""
+"A valid NAT local network IPv4 address must be specified or you need to "
+"change Mode to IPv6"
+msgstr "「有効なNATのローカルネットワークのIPv4アドレスを指定する必要がありますまたは次のことを行う必要があり、「 IPv6への変更モード"
+
+#: usr/local/www/vpn_ipsec_phase2.php:161
+#: usr/local/www/vpn_ipsec_phase2.php:161
+msgid ""
+"A valid NAT local network IPv6 address must be specified or you need to "
+"change Mode to IPv4"
+msgstr "「有効なNATのローカルネットワークのIPv6アドレスを指定する必要がありますまたは次のことを行う必要があり、 "IPv4に変更モード"
+
+#: usr/local/www/vpn_ipsec_phase2.php:183
+#: usr/local/www/vpn_ipsec_phase2.php:183
+msgid ""
+"A valid remote network IPv4 address must be specified or you need to change "
+"Mode to IPv6"
+msgstr "「有効なリモートネットワークのIPv4アドレスを指定する必要があります。または、変更する必要があるの「IPv6モードに"
+
+#: usr/local/www/vpn_ipsec_phase2.php:185
+#: usr/local/www/vpn_ipsec_phase2.php:185
+msgid ""
+"A valid remote network IPv6 address must be specified or you need to change "
+"Mode to IPv4"
+msgstr "「有効なリモートネットワークのIPv6アドレスを指定する必要があります。または、変更する必要がある」はIPv4モードに"
+
+#: usr/local/www/vpn_ipsec_phase2.php:192
+#: usr/local/www/vpn_ipsec_phase2.php:192
+msgid "Mobile IPsec only supports Tunnel mode."
+msgstr "モバイルIPsecはトンネルモードのみをサポートしています。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:287
+#: usr/local/www/vpn_ipsec_phase2.php:287
+msgid "Phase 1 is using IPv4. You cannot use Tunnel IPv6 on Phase 2."
+msgstr "フェーズ1は、IPv4を使用しています。あなたは、フェーズ2のトンネルにIPv6を使用することはできません。"
+
+#: usr/local/www/vpn_ipsec_phase2.php:289
+#: usr/local/www/vpn_ipsec_phase2.php:289
+msgid "Phase 1 is using IPv6. You cannot use Tunnel IPv4 on Phase 2."
+msgstr "フェーズ1は、IPv6を使用しています。あなたは、フェーズ2のトンネルはIPv4を使用することはできません。"
+
+#: usr/local/www/interfaces_assign.php:210
+#: usr/local/www/interfaces_assign.php:210
+#, php-format
+msgid ""
+"You cannot set port %s to interface %s because this interface is a member of "
+"%s."
+msgstr "%s. 「このインタフェースがメンバーとなっているためです%sのインタフェースにポート%sを設定することはできません」"
+
+#: usr/local/www/services_snmp.php:395 usr/local/www/services_snmp.php:395
+msgid "UCD"
+msgstr "UCD"
+
+#: usr/local/www/services_snmp.php:397 usr/local/www/services_snmp.php:397
+msgid "Regex"
+msgstr "正規表現"
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:560
+#: usr/local/www/interfaces.php:556 usr/local/www/interfaces.php:556
+msgid "This IPv4 address is being used by another interface or VIP."
+msgstr "このIPv4アドレスは、別のインターフェイスまたはVIPで使用されています。"
+
+#: usr/local/www/interfaces.php:557 usr/local/www/interfaces.php:565
+#: usr/local/www/interfaces.php:561 usr/local/www/interfaces.php:561
+msgid "This IPv4 address conflicts with a Static Route."
+msgstr "スタティックルートでこのIPv4アドレスが競合しています。"
+
+#: usr/local/www/interfaces.php:568 usr/local/www/interfaces.php:577
+#: usr/local/www/interfaces.php:573 usr/local/www/interfaces.php:573
+msgid "This IPv6 address is being used by another interface or VIP."
+msgstr "このIPv6アドレスは、別のインターフェイスまたはVIPで使用されています。"
+
+#: usr/local/www/interfaces.php:572 usr/local/www/interfaces.php:582
+#: usr/local/www/interfaces.php:578 usr/local/www/interfaces.php:578
+msgid "This IPv6 address conflicts with a Static Route."
+msgstr "スタティックルートにこのIPv6アドレスは競合しています。"
+
+#: usr/local/www/interfaces.php:2651 usr/local/www/interfaces.php:2697
+#: usr/local/www/interfaces.php:2686 usr/local/www/interfaces.php:2686
+msgid ""
+"Note: The update frequency can be changed under System->Advanced Firewall/"
+"NAT settings."
+msgstr ""注:更新頻度は、System -u003e高度なファイアウォール/の下に変更することができ、「 NATの設定を行います。"
+
+#: etc/inc/priv/user.priv.inc:6 etc/inc/priv/user.priv.inc:6
+msgid "User - Services - Captive portal login"
+msgstr "ユーザー - サービス - キャプティブポータルのログイン"
+
+#: etc/inc/priv/user.priv.inc:7 etc/inc/priv/user.priv.inc:7
+msgid "Indicates whether the user is able to login on the captive portal."
+msgstr "利用者がキャプティブポータルにログインできるかどうかを示します。"
+
+#: etc/inc/pkg-utils.inc:617 etc/inc/pkg-utils.inc:618
+#: etc/inc/pkg-utils.inc:617 etc/inc/pkg-utils.inc:618
+#, php-format
+msgid "Package %s is not supported on this version."
+msgstr "パッケージ%sは、このバージョンではサポートされません。"
+
+#: etc/inc/priv.defs.inc:732 etc/inc/priv.defs.inc:732
+msgid "WebCfg - Services: Captive portal: Allowed Hostnames page"
+msgstr "WebCfg - サービス:キャプティブポータル:可ホスト名ページ"
+
+#: etc/inc/priv.defs.inc:733 etc/inc/priv.defs.inc:739
+#: etc/inc/priv.defs.inc:733 etc/inc/priv.defs.inc:739
+msgid "Allow access to the 'Services: Captive portal: Allowed Hostnames' page."
+msgstr "ページ':キャプティブポータルホスト名可サービス」へのアクセスを許可します。"
+
+#: etc/inc/priv.defs.inc:738 etc/inc/priv.defs.inc:738
+msgid "WebCfg - Services: Captive portal: Edit Allowed Hostnames page"
+msgstr "WebCfg - サービス:キャプティブポータル:編集可ホスト名ページ"
+
+#: etc/inc/priv.defs.inc:1136 etc/inc/priv.defs.inc:1136
+msgid "WebCfg - System: User Manager: settings page"
+msgstr "WebCfg - システム:ユーザーマネージャ:設定ページ"
+
+#: etc/inc/priv.defs.inc:1137 etc/inc/priv.defs.inc:1137
+msgid "Allow access to the 'System: User Manager: settings' page."
+msgstr "ページ':ユーザーマネージャの設定システム」へのアクセスを許可します。"
+
+#: etc/inc/interfaces.inc:294 etc/inc/interfaces.inc:294
+#, php-format
+msgid "interface_qinq_configure called with invalid if.%s"
+msgstr "interface_qinq_configure無効if.%sと呼ばれる"
+
+#: etc/inc/interfaces.inc:401 etc/inc/interfaces.inc:401
+msgid "Creating wireless clone interfaces..."
+msgstr "ワイヤレスクローン·インターフェースを作成しています..."
+
+#: etc/inc/interfaces.inc:1139 etc/inc/interfaces.inc:1141
+#: etc/inc/interfaces.inc:1141
+msgid "Wrong parameters used during interface_bring_down"
+msgstr "interface_bring_down中に使用され、間違ったパラメータ"
+
+#: etc/inc/services.inc:2013 etc/inc/services.inc:2053
+#: etc/inc/services.inc:2084 etc/inc/services.inc:2148
+#, php-format
+msgid "Removed cron job for %s"
+msgstr "%sために取り外さcronジョブ"
+
+#: etc/inc/openvpn.inc:257 etc/inc/openvpn.inc:257
+#, php-format
+msgid "The field '%s' must contain a single valid %s CIDR range."
+msgstr "フィールド' %s 」は、単一の%s有効なCIDR範囲が含まれている必要があります。"
+
+#: etc/inc/openvpn.inc:269 etc/inc/openvpn.inc:269
+#, php-format
+msgid ""
+"The field '%s' must contain only valid %s CIDR range(s) separated by commas."
+msgstr "「フィールド' %sは「唯一の有効なカンマで区切って、CIDR範囲(複数可)を%s含まれている必要があります。"
+
+#: etc/inc/vpn.inc:1780 etc/inc/vpn.inc:1793 etc/inc/vpn.inc:1790
+#, php-format
+msgid ""
+"Removing SPDs from tunnel gw '%1$s'. Local Subnet '%2$s' and Remote Subnet "
+"'%3$s'. Reloading policy"
+msgstr "「トンネルGW 」は%1$s'からのSPDを削除する。ローカルサブネットを「 %2$s 」とリモートサブネット」 「 %3$s 」 。ポリシーの再ロード"
+
+#: etc/inc/pfsense-utils.inc:938 etc/inc/pfsense-utils.inc:938
+msgid "Disabling auto login was not possible."
+msgstr "自動ログインを無効にすると、可能ではなかった。"
+
+#: etc/inc/pfsense-utils.inc:956 etc/inc/pfsense-utils.inc:956
+msgid "Enabled console auto login, console menu is NOT password protected."
+msgstr "有効にコンソールの自動ログインは、コンソールメニューは、パスワードで保護されていません。"
+
+#: etc/inc/pfsense-utils.inc:958 etc/inc/pfsense-utils.inc:958
+msgid "Disabled console auto login, console menu is password protected."
+msgstr "[無効]コンソールの自動ログイン、コンソールメニューのパスワードは保護されています。"
+
+#: usr/local/www/system_gateways_edit.php:552
+#: usr/local/www/system_gateways_edit.php:582
+#: usr/local/www/system_gateways_edit.php:582
+msgid " - Show advanced option"
+msgstr " - 表示する高度なオプション"
+
+#: usr/local/www/services_dyndns_edit.php:302
+#: usr/local/www/services_dyndns_edit.php:302
+msgid "Verbose logging"
+msgstr "詳細ログ"
+
+#: usr/local/www/services_dyndns_edit.php:305
+#: usr/local/www/services_dyndns_edit.php:305
+msgid "verbose logging"
+msgstr "詳細ログ"
+
+#: usr/local/www/status_openvpn.php:278 usr/local/www/status_openvpn.php:339
+#: usr/local/www/status_openvpn.php:278 usr/local/www/status_openvpn.php:339
+msgid "Bytes Rcvd"
+msgstr "バイト受信数"
+
+#: usr/local/www/status_openvpn.php:385 usr/local/www/status_openvpn.php:385
+msgid ""
+"If you have custom options that override the management features of OpenVPN "
+"on a client or server, they will cause that OpenVPN instance to not work "
+"correctly with this status page."
+msgstr "クライアントまたはサーバー上で「あなたがOpenVPNのの管理機能をオーバーライドするカスタムオプションを使用している場合」 、彼らはOpenVPNのインスタンスがこのステータスページでは正しく「動作しないことが発生します。"
+
+#: usr/local/www/firewall_rules_edit.php:1579
+#: usr/local/www/firewall_nat_edit.php:863
+#: usr/local/www/firewall_nat_out_edit.php:678
+#: usr/local/www/firewall_rules_edit.php:1590
+#: usr/local/www/firewall_nat_edit.php:864
+#: usr/local/www/firewall_rules_edit.php:1590
+#: usr/local/www/firewall_nat_edit.php:864
+#: usr/local/www/firewall_nat_out_edit.php:678
+msgid "Rule Information"
+msgstr "情報ルール"
+
+#: usr/local/www/firewall_rules_edit.php:1583
+#: usr/local/www/firewall_nat_edit.php:867
+#: usr/local/www/firewall_nat_out_edit.php:682
+#: usr/local/www/firewall_rules_edit.php:1594
+#: usr/local/www/firewall_nat_edit.php:868
+#: usr/local/www/firewall_rules_edit.php:1594
+#: usr/local/www/firewall_nat_edit.php:868
+#: usr/local/www/firewall_nat_out_edit.php:682
+msgid "Created"
+msgstr "作成"
+
+#: usr/local/www/firewall_rules_edit.php:1591
+#: usr/local/www/firewall_nat_edit.php:875
+#: usr/local/www/firewall_nat_out_edit.php:690
+#: usr/local/www/firewall_rules_edit.php:1602
+#: usr/local/www/firewall_nat_edit.php:876
+#: usr/local/www/firewall_rules_edit.php:1602
+#: usr/local/www/firewall_nat_edit.php:876
+#: usr/local/www/firewall_nat_out_edit.php:690
+msgid "Updated"
+msgstr "更新した"
+
+#: usr/local/www/diag_logs_filter.php:163
+#: usr/local/www/diag_logs_filter.php:163
+msgid "Source IP Address"
+msgstr "送信元IPアドレス"
+
+#: usr/local/www/diag_logs_filter.php:175
+#: usr/local/www/diag_logs_filter.php:255
+#: usr/local/www/diag_logs_filter.php:175
+#: usr/local/www/diag_logs_filter.php:255
+msgid "Quantity"
+msgstr "数量"
+
+#: usr/local/www/diag_logs_filter.php:185
+#: usr/local/www/diag_logs_filter.php:185
+msgid "Destination IP Address"
+msgstr "宛先IPアドレス"
+
+#: usr/local/www/diag_logs_filter.php:193
+#: usr/local/www/diag_logs_filter.php:193
+msgid "Protocol Flags"
+msgstr "プロトコルフラグ"
+
+#: usr/local/www/diag_logs_filter.php:203
+#: usr/local/www/diag_logs_filter.php:266
+#: usr/local/www/diag_logs_filter.php:203
+#: usr/local/www/diag_logs_filter.php:266
+#, php-format
+msgid "Matches %1$s regular expression%2$s."
+msgstr "試合は、通常のexpression%2$sをは%1$s 。"
+
+#: usr/local/www/diag_logs_filter.php:204
+#: usr/local/www/diag_logs_filter.php:204
+msgid "Precede with exclamation (!) as first character to exclude match."
+msgstr "マッチを除外した最初の文字として感嘆符( !)に先行する。"
+
+#: usr/local/www/diag_logs_filter.php:251
+#: usr/local/www/diag_logs_filter.php:251
+msgid "Filter expresion"
+msgstr "フィルタEXPRESION"
+
+#: usr/local/www/diag_dump_states.php:136
+#: usr/local/www/diag_dump_states.php:136
+msgid "Current total state count"
+msgstr "現在の総状態数"
+
+#: usr/local/www/diag_dump_states.php:218
+#: usr/local/www/diag_dump_states.php:218
+msgid "States matching current filter"
+msgstr "現在のフィルタに一致する状態"
+
+#: usr/local/www/firewall_nat_edit.php:417
+#: usr/local/www/firewall_nat_edit.php:417
+msgid "NAT Port Forward"
+msgstr "NATのポートフォワード"
+
+#: usr/local/www/status_graph.php:242 usr/local/www/status_graph.php:242
+msgid "Host Name or IP"
+msgstr "ホスト名またはIP"
+
+#: usr/local/www/interfaces_gif_edit.php:210
+#: usr/local/www/interfaces_gif_edit.php:210
+msgid "ECN friendly behavior"
+msgstr "電子証券取引ネットワークにやさしい行動"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:146
+#: usr/local/www/firewall_virtual_ip_edit.php:146
+msgid "You cannot use the network address for this VIP"
+msgstr "このVIPのためのネットワーク·アドレスを使用することはできません"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:148
+#: usr/local/www/firewall_virtual_ip_edit.php:148
+msgid "You cannot use the broadcast address for this VIP"
+msgstr "このVIPのためにブロードキャストアドレスを使用することはできません"
+
+#: usr/local/www/diag_packet_capture.php:204
+#: usr/local/www/diag_packet_capture.php:204
+msgid "Promiscuous"
+msgstr "無差別"
+
+#: usr/local/www/diag_packet_capture.php:207
+#: usr/local/www/diag_packet_capture.php:207
+msgid "If checked, the"
+msgstr "チェックすると、"
+
+#: usr/local/www/diag_packet_capture.php:207
+#: usr/local/www/diag_packet_capture.php:207
+msgid "packet capture"
+msgstr "パケットキャプチャ"
+
+#: usr/local/www/diag_packet_capture.php:207
+#: usr/local/www/diag_packet_capture.php:207
+msgid "will be performed using promiscuous mode."
+msgstr "プロミスキャスモードを使用して実行されます。"
+
+#: usr/local/www/diag_packet_capture.php:208
+#: usr/local/www/diag_packet_capture.php:208
+msgid "Some network adapters do not support or work well in promiscuous mode."
+msgstr "一部のネットワークアダプタをサポートまたは無差別モードで正常に動作しません。"
+
+#: usr/local/www/diag_traceroute.php:72 usr/local/www/diag_ping.php:67
+#: usr/local/www/diag_traceroute.php:72 usr/local/www/diag_ping.php:67
+msgid "When using IPv4, the target host must be an IPv4 address or hostname."
+msgstr "IPv4を使用する場合は、ターゲットホストは、IPv4アドレスまたはホスト名でなければなりません。"
+
+#: usr/local/www/diag_traceroute.php:74 usr/local/www/diag_ping.php:69
+#: usr/local/www/diag_traceroute.php:74 usr/local/www/diag_ping.php:69
+msgid "When using IPv6, the target host must be an IPv6 address or hostname."
+msgstr "IPv6を使用する場合は、ターゲットホストは、IPv6アドレスまたはホスト名でなければなりません。"
+
+#: usr/local/www/diag_traceroute.php:164 usr/local/www/diag_traceroute.php:164
+msgid ""
+"Using a source interface/IP address that does not match selected type (IPv4, "
+"IPv6) will result in an error or empty output."
+msgstr "「 ( IPv6の選択したタイプのIPv4など)と一致しない送信元インターフェイス/ IPアドレスを使用すると、 「エラーまたは空の出力になります。"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1472
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1493
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1507
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1524
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1543
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1567
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1594
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1647
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1416
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1436
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1450
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1467
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1486
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1510
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1589
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1352
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1373
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1387
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1403
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1422
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1446
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1473
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1526
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1213
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1234
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1248
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1265
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1284
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1308
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1335
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1388
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1471
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1492
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1506
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1523
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1542
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1566
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1593
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1646
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1415
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1435
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1449
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1466
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1485
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1509
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1588
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1351
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1372
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1386
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1402
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1421
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1445
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1472
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1525
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1212
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1233
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1247
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1264
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1283
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1307
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1334
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1387
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1471
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1492
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1506
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1523
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1542
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1566
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1593
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1646
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1415
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1435
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1449
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1466
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1485
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1509
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1588
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1351
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1372
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1386
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1402
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1421
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1445
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1472
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1525
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1212
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1233
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1247
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1264
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1283
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1307
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1334
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1387
+msgid "Traffic Shaper Wizard"
+msgstr "トラフィックシェーパーウィザード"
+
+#: usr/local/www/wizards/openvpn_wizard.inc:614
+#: usr/local/www/wizards/openvpn_wizard.inc:629
+#: usr/local/www/wizards/openvpn_wizard.inc:614
+#: usr/local/www/wizards/openvpn_wizard.inc:629
+msgid "OpenVPN Wizard"
+msgstr "OpenVPNのウィザード"
+
+#: usr/local/www/services_dhcp.php:274 usr/local/www/services_dhcp.php:274
+#, php-format
+msgid ""
+"The Captive Portal zone '%s' has Hard Timeout parameter set to a value "
+"bigger than Default lease time (%s)."
+msgstr "デフォルトのリース時間( %s )よりも大きい「キャプティブポータルゾーンの%sは'の値に設定ハードタイムアウトパラメータを持つ」 。"
+
+#: usr/local/www/system_certmanager.php:1026
+#: usr/local/www/system_certmanager.php:1026
+msgid "Signing request data"
+msgstr "署名要求データ"
+
+#: usr/local/www/system_certmanager.php:1034
+#: usr/local/www/system_certmanager.php:1034
+msgid "Final certificate data"
+msgstr "最終的な証明書データ"
+
+#: usr/local/www/system_advanced_admin.php:447
+#: usr/local/www/system_advanced_admin.php:447
+msgid ""
+"When this is unchecked, access to the webConfigurator is protected against "
+"HTTP_REFERER redirection attempts. Check this box to disable this protection "
+"if you find that it interferes with webConfigurator access in certain corner "
+"cases such as using external scripts to interact with this system. More "
+"information on HTTP_REFERER is available from <a target='_blank' "
+"href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."
+msgstr "HTTP_REFERERリダイレクトしようと「これをオフにすると、 webConfiguratorへのアクセスがから保護されています」 。このような、このシステムと対話する外部スクリプトを使用するなどのケース"あなたはそれが特定の隅にwebConfiguratorアクセスを妨害することを発見した場合、「この保護を無効にするには、このチェックボックスをオンにします。 HTTP_REFERERの詳細」の情報は、 u003ca target='_blank' "href='http://en.wikipedia.org/wiki/HTTP_referrer'u003eウィキペディアu003c/ A u003eから入手できます。"
+
+#: usr/local/www/system_advanced_misc.php:105
+#: usr/local/www/system_advanced_misc.php:105
+msgid "/tmp Size must be numeric and should not be less than 40MB."
+msgstr "/ tmpのサイズは数値でなければならず、 40MBを下回ってはいけません。"
+
+#: usr/local/www/system_advanced_misc.php:108
+#: usr/local/www/system_advanced_misc.php:108
+msgid "/var Size must be numeric and should not be less than 60MB."
+msgstr "/ VARサイズは数値でなければならず、 60MBを下回ってはいけません。"
+
+#: usr/local/www/system_advanced_misc.php:558
+#: usr/local/www/system_advanced_misc.php:558
+msgid "Skip rules when gateway is down"
+msgstr "ゲートウェイがダウンしているときのルールをスキップ"
+
+#: usr/local/www/system_advanced_misc.php:562
+#: usr/local/www/system_advanced_misc.php:562
+msgid ""
+"By default, when a rule has a specific gateway set, and this gateway is "
+"down, rule is created and traffic is sent to default gateway.This option "
+"overrides that behavior and the rule is not created when gateway is down"
+msgstr "「ルールは特定のゲートウェイが設定されており、このゲートウェイである場合、デフォルトで、 「ダウン、ルールが作成され、トラフィックがgateway.Thisオプションをデフォルトに送信されます」という行動やゲートウェイがダウンしているとき、ルールが作成されていないよりも優先されます"
+
+#: usr/local/www/system_advanced_misc.php:568
+#: usr/local/www/system_advanced_misc.php:568
+msgid "RAM Disk Settings (Reboot to Apply Changes)"
+msgstr "RAMディスク設定(変更を適用するために再起動します)"
+
+#: usr/local/www/system_advanced_misc.php:572
+#: usr/local/www/system_advanced_misc.php:572
+msgid "Use RAM Disks"
+msgstr "RAMディスクを使用して、"
+
+#: usr/local/www/system_advanced_misc.php:575
+#: usr/local/www/system_advanced_misc.php:575
+msgid "Use memory file system for /tmp and /var"
+msgstr "のために/ tmpと/ varメモリファイルシステムを使用して、"
+
+#: usr/local/www/system_advanced_misc.php:576
+#: usr/local/www/system_advanced_misc.php:576
+msgid ""
+"Set this if you wish to use /tmp and /var as RAM disks (memory file system "
+"disks) on a full install rather than use the hard disk. Setting this will "
+"cause the data in /tmp and /var to be lost at reboot, including log data. "
+"RRD and DHCP Leases will be retained."
+msgstr "フルインストールの「 (ディスクではなくハードディスクを使用してRAMディスクメモリファイルシステム)として/ tmpディレクトリと/ varを使用したい場合は、これを設定する」 。これを設定すると、 「 / tmpにログデータを含めて、再起動時に失われることを/ var内のデータが発生します。 」になるRRDとDHCPリースは保持されます。"
+
+#: usr/local/www/system_advanced_misc.php:582
+#: usr/local/www/system_advanced_misc.php:582
+msgid "/tmp RAM Disk Size"
+msgstr "/ tmpにRAMディスクサイズ"
+
+#: usr/local/www/system_advanced_misc.php:586
+#: usr/local/www/system_advanced_misc.php:586
+msgid ""
+"Set the size, in MB, for the /tmp RAM disk. Leave blank for 40MB. Do not set "
+"lower than 40."
+msgstr ""の/ tmp RAMディスクは。 40MBのために空白のままにするために、 MB単位でサイズを設定します。設定しないでください」 40よりも低い。"
+
+#: usr/local/www/system_advanced_misc.php:591
+#: usr/local/www/system_advanced_misc.php:591
+msgid "/var RAM Disk Size"
+msgstr "の/ var RAMディスクのサイズ"
+
+#: usr/local/www/system_advanced_misc.php:595
+#: usr/local/www/system_advanced_misc.php:595
+msgid ""
+"Set the size, in MB, for the /var RAM disk. Leave blank for 60MB. Do not set "
+"lower than 60."
+msgstr "「 / varの各RAMディスクは。 60MBのために空白のままにするために、 MB単位でサイズを設定します。設定しないでください」 60よりも低い。"
+
+#: usr/local/www/system_advanced_misc.php:600
+#: usr/local/www/system_advanced_misc.php:600
+msgid "Periodic RRD Backup"
+msgstr "定期的なRRDバックアップ"
+
+#: usr/local/www/system_advanced_misc.php:616
+#: usr/local/www/system_advanced_misc.php:616
+msgid "Periodic DHCP Leases Backup"
+msgstr "定期的なDHCPはバックアップのリース"
+
+#: usr/local/www/system_routes_edit.php:132
+#, php-format
+msgid ""
+"The alias (%s) has one or more FQDNs configured and cannot be used to "
+"configure a static route."
+msgstr "「エイリアス( %s )が構成された1つ以上のFQDNがあり、使用することはできません"スタティックルートを設定する。"
+
+#: usr/local/www/system_routes_edit.php:179
+#: usr/local/www/system_routes_edit.php:186
+#: usr/local/www/system_routes_edit.php:181
+#: usr/local/www/system_routes_edit.php:188
+#: usr/local/www/system_routes_edit.php:175
+#: usr/local/www/system_routes_edit.php:182
+#, php-format
+msgid "This network conflicts with address configured on interface %s."
+msgstr "アドレスがこのネットワークの競合は、インタフェース%s.上で設定"
+
+#: usr/local/www/firewall_nat_out.php:117
+#: usr/local/www/firewall_nat_out.php:128
+#: usr/local/www/firewall_nat_out.php:141
+#: usr/local/www/firewall_nat_out.php:157
+#: usr/local/www/firewall_nat_out.php:178
+#: usr/local/www/firewall_nat_out.php:199
+#: usr/local/www/firewall_nat_out.php:214
+#: usr/local/www/firewall_nat_out.php:117
+#: usr/local/www/firewall_nat_out.php:128
+#: usr/local/www/firewall_nat_out.php:141
+#: usr/local/www/firewall_nat_out.php:157
+#: usr/local/www/firewall_nat_out.php:178
+#: usr/local/www/firewall_nat_out.php:199
+#: usr/local/www/firewall_nat_out.php:214
+msgid "Manual Outbound NAT Switch"
+msgstr "手動アウトバウンドのNATスイッチ"
+
+#: usr/local/www/firewall_rules.php:311 usr/local/www/firewall_rules.php:313
+#: usr/local/www/firewall_rules.php:311 usr/local/www/firewall_rules.php:313
+msgid ""
+"The firewall rule configuration has been changed.<br />You must apply the "
+"changes in order for them to take effect."
+msgstr "それらを有効にするための変更」ファイアウォールルールの設定はchanged.<br />Youが適用しなければなりませんでした」 。"
+
+#: usr/local/www/system_gateway_groups_edit.php:100
+#: usr/local/www/system_gateway_groups_edit.php:100
+msgid "Changing name on a gateway group is not allowed."
+msgstr "ゲートウェイ·グループに変更する場合は使用できません。"
+
+#: usr/local/www/system_gateway_groups_edit.php:150
+#: usr/local/www/system_gateway_groups_edit.php:150
+msgid "Edit gateway group"
+msgstr "編集ゲートウェイ·グループ"
+
+#: usr/local/www/system_gateway_groups_edit.php:229
+#: usr/local/www/system_gateway_groups_edit.php:229
+msgid "Edit gateway group entry"
+msgstr "編集ゲートウェイグループエントリ"
+
+#: usr/local/www/system_gateway_groups_edit.php:317
+#: usr/local/www/system_gateway_groups_edit.php:317
+msgid ""
+"The virtual IP field selects what (virtual) IP should be used when this "
+"group applies to a local Dynamic DNS, IPsec or OpenVPN endpoint"
+msgstr "グループのローカルダイナミックDNS 、 IPsecやOpenVPNのエンドポイントに適用され、「仮想IPフィールドは、これがとき(仮想) IPが使用すべきか選択""
+
+#: usr/local/www/services_captiveportal.php:198
+#: usr/local/www/services_captiveportal.php:198
+msgid ""
+"Hard timeout must be less or equal Default lease time set on DHCP Server"
+msgstr "「ハードタイムアウトは以下でなければなりませんか等しいデフォルトのリース時間は、DHCPサーバーに設定"
+
+#: usr/local/www/firewall_aliases_edit.php:245
+#: usr/local/www/firewall_aliases_edit.php:245
+#, php-format
+msgid "You must provide a valid URL. Could not fetch usable data from '%s'."
+msgstr "有効なURLを指定する必要があります。 「 %s 」から使用可能なデータを取得できませんでした。"
+
+#: usr/local/www/firewall_aliases_edit.php:250
+#: usr/local/www/firewall_aliases_edit.php:250
+#, php-format
+msgid "URL '%s' is not valid."
+msgstr "URLは「 %s'は有効ではありません。"
+
+#: usr/local/www/firewall_aliases_edit.php:288
+msgid "This alias is used on a static route and cannot contain FQDNs."
+msgstr "このエイリアスは、スタティックルートに使用され、 FQDNを含めることはできません。"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:174
+#: usr/local/www/system_firmware_restorefullbackup.php:174
+msgid "Could not locate any previous backups."
+msgstr "以前のバックアップを見つけることができませんでした。"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:182
+#: usr/local/www/system_firmware_restorefullbackup.php:182
+msgid "do not restore config.xml."
+msgstr "config.xmlには復元されません。"
+
+#: usr/local/www/diag_dns.php:156 usr/local/www/diag_dns.php:156
+msgid "Query Time"
+msgstr "クエリ時間"
+
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:131
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:131
+msgid "Checking ..."
+msgstr "確認しています..."
+
+#: usr/local/www/services_dnsmasq.php:224
+#: usr/local/www/services_dnsmasq.php:245
+#: usr/local/www/services_dnsmasq.php:245
+msgid "Do not forward private reverse lookups"
+msgstr "プライベートの逆引きを転送しないでください"
+
+#: usr/local/www/services_dnsmasq.php:225
+#: usr/local/www/services_dnsmasq.php:246
+#: usr/local/www/services_dnsmasq.php:246
+#, php-format
+msgid ""
+"If this option is set, %s DNS Forwarder (dnsmasq) will not forward reverse "
+"DNS lookups (PTR) for private addresses (RFC 1918) to upstream name "
+"servers. Any entries in the Domain Overrides section forwarding private "n."
+"n.n.in-addr.arpa" names to a specific server are still forwarded. If the IP "
+"to name is not known from /etc/hosts, DHCP or a specific domain override "
+"then a "not found" answer is immediately returned. "
+msgstr "名前上流プライベートアドレス(RFC 1918)のDNSルックアップ( PTR )」を、このオプションが設定されている場合、DNSフォワーダは正逆転しません( DNSMASQ ) %s ""サーバをプライベート転送ドメインをオーバーライドセクションのすべてのエントリ「 nが。特定のサーバーに「 NNIN - addr.arpa 」の名前は、まだ転送されます。 IP」の名前には、 etc / hostsに、 DHCPまたは特定のドメインの上書き/から知られていない」場合には、その答えはすぐに返されます"が見つかりません」 。"
+
+#: usr/local/www/system_advanced_network.php:212
+#: usr/local/www/system_advanced_network.php:212
+msgid ""
+"All IPv6 traffic will be blocked by the firewall unless this box is checked."
+msgstr "このボックスがチェックされていない限り、 「すべてのIPv6トラフィックはファイアウォールによってブロックされます。"
+
+#: usr/local/www/system_advanced_network.php:213
+#: usr/local/www/system_advanced_network.php:213
+msgid ""
+"NOTE: This does not disable any IPv6 features on the firewall, it only "
+"blocks traffic."
+msgstr ""注:これは、ファイアウォール上で任意のIPv6機能を無効にしない、それが唯一の"トラフィックをブロックします。"
+
+#: usr/local/www/diag_nanobsd.php:234 usr/local/www/diag_nanobsd.php:234
+msgid "RRD/DHCP Backup"
+msgstr "RRD / DHCPのバックアップ"
+
+#: usr/local/www/diag_nanobsd.php:236 usr/local/www/diag_nanobsd.php:236
+msgid "These options have been relocated to"
+msgstr "これらのオプションはに移転してきた"
+
+#: usr/local/www/diag_nanobsd.php:236 usr/local/www/diag_nanobsd.php:236
+msgid "System > Advanced, Miscellaneous tab"
+msgstr "[システム]> [詳細設定、[その他]タブ"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:90
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:90
+msgid ""
+"A valid IP address must be specified, or # for an exclusion or ! to not "
+"forward at all."
+msgstr "「有効なIPアドレスが指定された、またはする必要があります"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+msgid ""
+"Or enter ! for lookups for this host/subdomain to NOT be forwarded anywhere."
+msgstr ""またはEnter !このホスト/サブドメインの検索に任意の場所に転送されないように。"
+
+#: usr/local/www/interfaces.php:517 usr/local/www/interfaces.php:513
+#: usr/local/www/interfaces.php:513
+msgid "You can only have one interface configured in 6rd with same prefix."
+msgstr "あなただけの1インタフェースは同じプレフィックスを持つ6RDで設定することができます。"
+
+#: usr/local/www/interfaces.php:528 usr/local/www/interfaces.php:524
+#: usr/local/www/interfaces.php:524
+#, php-format
+msgid "You can only have one interface configured as 6to4."
+msgstr "あなただけの1インタフェースは6to4のように設定されていることができます。"
+
+#: usr/local/www/interfaces.php:648 usr/local/www/interfaces.php:644
+#: usr/local/www/interfaces.php:644
+msgid "The MTU of a VLAN cannot be greater than that of its parent interface."
+msgstr "VLANのMTUは、親インターフェイスよりも大きくすべきではない。"
+
+#: usr/local/www/interfaces.php:663 usr/local/www/interfaces.php:659
+#: usr/local/www/interfaces.php:659
+#, php-format
+msgid "Interface %s (VLAN) has MTU set to a bigger value"
+msgstr "インタフェース%s ( VLAN )は、 MTUは大きな値に設定されています"
+
+#: etc/inc/easyrule.inc:118 etc/inc/easyrule.inc:301 etc/inc/easyrule.inc:118
+#: etc/inc/easyrule.inc:301
+msgid "Easy Rule"
+msgstr "簡単なルール"
+
+#: etc/inc/vpn.inc:1015 etc/inc/vpn.inc:1014
+#, php-format
+msgid ""
+"Ignoring IPsec racoon daemon reload since there are no tunnels on interface "
+"%s"
+msgstr "%s 「インターフェイスにはトンネルが存在しないため、 IPsecのracoonデーモンの再ロードを無視」"
+
+#: etc/inc/auth.inc:1127 etc/inc/auth.inc:1127
+#, php-format
+msgid "ERROR! Could not login to server %1$s as user %2$s: %3$s"
+msgstr "エラー !ユーザー%2$sとしてサーバは%1$sにログインできませんでした: %3$s"
+
+#: usr/local/www/system_gateways_edit.php:139
+#: usr/local/www/system_gateways_edit.php:167
+#: usr/local/www/system_gateways_edit.php:139
+#: usr/local/www/system_gateways_edit.php:167
+#, php-format
+msgid ""
+"The gateway address %1$s does not lie within one of the chosen interface's "
+"subnets."
+msgstr "サブネット「ゲートウェイアドレスは%1$sは、選択されたインタフェースの1の内にない」 。"
+
+#: usr/local/www/diag_arp.php:342 usr/local/www/diag_arp.php:342
+msgid "NOTE: Local IPv6 peers use"
+msgstr "注:ローカルIPv6ピアは使用"
+
+#: usr/local/www/diag_arp.php:342 usr/local/www/diag_arp.php:342
+msgid "NDP"
+msgstr "NDP"
+
+#: usr/local/www/diag_arp.php:342 usr/local/www/diag_arp.php:342
+msgid "instead of ARP"
+msgstr "代わりに、ARPの"
+
+#: usr/local/www/firewall_virtual_ip.php:128
+#: usr/local/www/firewall_virtual_ip.php:128
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"Gateway."
+msgstr "ゲートウェイ」それはまだ少なくとも1によって参照されているため、このエントリは削除できません」 。"
+
+#: usr/local/www/interfaces_gif_edit.php:169
+#: usr/local/www/interfaces_gif_edit.php:169
+msgid ""
+"The interface here serves as the local address to be used for the gif tunnel."
+msgstr "「ここのインタフェースは、GIFトンネルに使用するローカルアドレスとして機能します。"
+
+#: usr/local/www/services_dhcp.php:941 usr/local/www/services_dhcp.php:941
+msgid ""
+"This option persists even if DHCP server is disabled. Only the machines "
+"listed below will be able to communicate with the firewall on this NIC."
+msgstr "下記のこのNICのファイアウォールと通信できるようになります」このオプションは、 DHCPサーバーが無効になっている場合も同様です。マシンだけが解決しない」 。"
+
+#: usr/local/www/interfaces_bridge_edit.php:381
+#: usr/local/www/interfaces_bridge_edit.php:381
+msgid ""
+"Set the transmit hold count for Spanning Tree. This is the number of "
+"packets transmitted before being rate limited. The default is 6. The "
+"minimum is 1 and the maximum is 10."
+msgstr "レート制限される前に送信されたパケット」スパニングツリーの送信ホールドカウントを設定します。これは数がある」 。デフォルトは6です。 「最小値は1で、最大値は10です。"
+
+#: usr/local/www/services_dnsmasq.php:254
+#: usr/local/www/services_dnsmasq.php:254
+msgid "Listen Port"
+msgstr "ポートを聞く"
+
+#: usr/local/www/services_dnsmasq.php:258
+#: usr/local/www/services_dnsmasq.php:258
+msgid ""
+"The port used for responding to DNS queries. It should normally be left "
+"blank unless another service needs to bind to TCP/UDP port 53."
+msgstr "他のサービスは、TCP / UDPポート53にバインドする必要がない限り、空白の「 DNSクエリに応答するために使用されるポートは、それは通常のままにしてください」 。"
+
+#: usr/local/www/services_dnsmasq.php:268
+#: usr/local/www/services_dnsmasq.php:268
+msgid ""
+"Interface IPs used by the DNS Forwarder for responding to queries from "
+"clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries "
+"to other interface IPs not selected below are discarded. The default "
+"behavior is to respond to queries on every available IPv4 and IPv6 address."
+msgstr "クライアント」からのクエリに応答するため、DNSフォワーダが使用するインターフェイスのIPアドレス」 。インターフェイスはIPv4とIPv6のIPアドレスの両方がある場合、両方が使用される。クエリ動作は、すべての利用可能なIPv4アドレスとIPv6アドレスでの質問に答えることです」下の選択されていない他のインタフェースIPには、デフォルトでは。破棄されます」 。"
+
+#: usr/local/www/services_dnsmasq.php:288
+#: usr/local/www/services_dnsmasq.php:288
+msgid "Strict Interface Binding"
+msgstr "厳格なインターフェイスのバインド"
+
+#: usr/local/www/services_dnsmasq.php:290
+#: usr/local/www/services_dnsmasq.php:290
+msgid ""
+"If this option is set, the DNS forwarder will only bind to the interfaces "
+"containing the IP addresses selected above, rather than binding to all "
+"interfaces and discarding queries to other addresses."
+msgstr "むしろすべての "インターフェイスに結合し、他のアドレスにクエリーを破棄するよりも、上で選択したIPアドレスを含む"このオプションが設定されている場合、 DNSフォワーダは、インターフェイスにバインドされます」 。"
+
+#: usr/local/www/services_dnsmasq.php:292
+#: usr/local/www/services_dnsmasq.php:292
+msgid ""
+"NOTE: This option does NOT work with IPv6. If set, dnsmasq will not bind to "
+"IPv6 addresses."
+msgstr ""注:このオプションは、IPv6で動作しない設定した場合、 DNSMASQがバインドされません。 」のIPv6アドレス。"
+
+#: usr/local/www/firewall_nat_out_edit.php:523
+#: usr/local/www/firewall_nat_out_edit.php:561
+#: usr/local/www/firewall_nat_out_edit.php:523
+#: usr/local/www/firewall_nat_out_edit.php:561
+msgid "(leave blank for any)"
+msgstr "(いずれかの空白のままにします)"
+
+#: usr/local/www/interfaces.php:1900 usr/local/www/interfaces.php:1900
+#, php-format
+msgid ""
+"Enter a <b>hexadecimal</b> value between %x and %x here, default value is 0."
+msgstr ""% xと% Xここ間u003cBu003e進u003c / bu003eの値を入力し、デフォルト値は0である。"
+
+#: etc/inc/shaper.inc:1232 etc/inc/shaper.inc:1232
+msgid "Codel Active Queue"
+msgstr "CODELアクティブキュー"
+
+#: etc/inc/pfsense-utils.inc:2537 etc/inc/pfsense-utils.inc:2541
+#: etc/inc/pfsense-utils.inc:2598
+msgid "Turkish"
+msgstr "トルコ語"
+
+#: usr/local/www/system_gateways_edit.php:647
+msgid ""
+"The Frequency Probe interval must be less than the Down time, otherwise the "
+"gateway will seem to go down then come up again at the next probe."
+msgstr "ゲートウェイ次のプローブで再び出てくるし、下に行くように見えます」高周波プローブ間隔が、それ以外の場合は、ダウンタイムよりも小さくなければなりません」 。"
+
+#: usr/local/www/system_gateways_edit.php:648
+msgid ""
+"The total time before a gateway is down is the product of the Frequency "
+"Probe and the Down fields. By default this is 1*10=10 seconds."
+msgstr "「ゲートウェイ前の総時間は、ダウンしている周波数に、 「プローブと下のフィールド。デフォルトでは、 1 README.txt _notes boot cf conf.default etc misc.translate root sbin tmp usr 10 = 10秒です。"
+
+#: usr/local/www/pkg_mgr.php:169
+msgid "Other Categories"
+msgstr "その他のカテゴリー"
+
+#: usr/local/www/pkg_mgr.php:223
+msgid " version to check its change log."
+msgstr "その変更ログをチェックするバージョン。"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:109
+msgid "Platform"
+msgstr "プラットフォーム"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:127
+msgid "NanoBSD Boot Slice"
+msgstr "NanoBSDのブートスライス"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:138
+msgid "CPU Type"
+msgstr "CPUタイプ"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:151
+msgid "Hardware crypto"
+msgstr "ハードウェア暗号"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:156
+msgid "Uptime"
+msgstr "稼働時間"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:166
+msgid "DNS server(s)"
+msgstr "DNSサーバ(複数可)"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:178
+msgid "Last config change"
+msgstr "最後の設定変更"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:183
+msgid "State table size"
+msgstr "状態テーブルサイズ"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:187
+msgid "Show states"
+msgstr "状態を表示する"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:191
+msgid "MBUF Usage"
+msgstr "MBUF使用量"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:202
+msgid "Temperature"
+msgstr "温度"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:212
+msgid "Load average"
+msgstr "ロードアベレージ"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:218
+msgid "CPU usage"
+msgstr "CPU使用率"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:227
+msgid "Memory usage"
+msgstr "メモリ使用量"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:237
+msgid "SWAP usage"
+msgstr "スワップの使用状況"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:247
+msgid "Disk usage"
+msgstr "ディスクの使用状況"
+
+#: etc/inc/shaper.inc:2904
+msgid "IPV4 bit mask must be blank or numeric value between 1 and 32."
+msgstr "IPV4のビットマスクは、 1と32の間に空白または数値である必要があります。"
+
+#: etc/inc/shaper.inc:2907
+msgid "IPV6 bit mask must be blank or numeric value between 1 and 128."
+msgstr "IPV6ビットマスクは1と128の間に空白または数値である必要があります。"
+
+#: etc/inc/shaper.inc:3352 etc/inc/shaper.inc:3625
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"a dynamic pipe with the bandwidth, delay, packet loss and queue size given "
+"above will \n"
+"be created for each source/destination IP address encountered, \n"
+"respectively. This makes it possible to easily specify bandwidth \n"
+"limits per host."
+msgstr "「「ソース」または「宛先」スロットが選択される場合、 \n 「遭遇各送信元/宛先IPアドレスのために作成することが「上\nを「所与の帯域幅、遅延、パケット損失、およびキュー·サイズが動的パイプ\nホストごとの制限」であった。これにより、容易に帯域幅\nを指定することができます」 。"
+
+#: etc/inc/shaper.inc:3373
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"leaving the mask bits blank will create one pipe per host. Otherwise "
+"specify \n"
+"the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+"per pipe."
+msgstr "空白のマスクビットを残す」 「ソース」や「目的地」のスロットを選択した場合、 \nは「ホストごとに1つのパイプを作成します。そうでない場合は、パイプごとに「グループ複数のホストに使用するサブネットマスクで「 1 」のビット数を\n 」 \nを指定」 。"
+
+#: etc/inc/shaper.inc:3646
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"leaving the mask bits blank will create one pipe per host. Otherwise "
+"specify \n"
+"the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+"per queue."
+msgstr "空白のマスクビットを残す」 「ソース」や「目的地」のスロットを選択した場合、 \nは「ホストごとに1つのパイプを作成します。そうでない場合は、キューごとに「グループ複数のホストに使用するサブネットマスクで「 1 」のビット数を\n 」 \nを指定」 。"
+
+#: etc/inc/pfsense-utils.inc:2575
+msgid "Albanian"
+msgstr "アルバニア人"
+
+#: etc/inc/pfsense-utils.inc:2576
+msgid "Bulgarian"
+msgstr "ブルガリア語"
+
+#: etc/inc/pfsense-utils.inc:2577
+msgid "Chinese (Simplified)"
+msgstr "中国語(簡体字)"
+
+#: etc/inc/pfsense-utils.inc:2578
+msgid "Chinese (Traditional)"
+msgstr "中国語(繁体字)"
+
+#: etc/inc/pfsense-utils.inc:2579
+msgid "Dutch"
+msgstr "オランダ語"
+
+#: etc/inc/pfsense-utils.inc:2580
+msgid "Danish"
+msgstr "デンマーク語"
+
+#: etc/inc/pfsense-utils.inc:2582
+msgid "Finnish"
+msgstr "フィンランド語"
+
+#: etc/inc/pfsense-utils.inc:2583
+msgid "French"
+msgstr "フランス語"
+
+#: etc/inc/pfsense-utils.inc:2584
+msgid "German"
+msgstr "ドイツ語"
+
+#: etc/inc/pfsense-utils.inc:2585
+msgid "Greek"
+msgstr "ギリシャ語"
+
+#: etc/inc/pfsense-utils.inc:2586
+msgid "Hungarian"
+msgstr "ハンガリー語"
+
+#: etc/inc/pfsense-utils.inc:2587
+msgid "Italian"
+msgstr "イタリア語"
+
+#: etc/inc/pfsense-utils.inc:2588
+msgid "Japanese"
+msgstr "日本語"
+
+#: etc/inc/pfsense-utils.inc:2589
+msgid "Korean"
+msgstr "韓国語"
+
+#: etc/inc/pfsense-utils.inc:2590
+msgid "Latvian"
+msgstr "ラトビア語"
+
+#: etc/inc/pfsense-utils.inc:2591
+msgid "Norwegian (Bokmal)"
+msgstr "ノルウェー語(ブークモール)"
+
+#: etc/inc/pfsense-utils.inc:2592
+msgid "Polish"
+msgstr "ポーランド語"
+
+#: etc/inc/pfsense-utils.inc:2594
+msgid "Portuguese (Portugal)"
+msgstr "ポルトガル語(ポルトガル)"
+
+#: etc/inc/pfsense-utils.inc:2595
+msgid "Romanian"
+msgstr "ルーマニア語"
+
+#: etc/inc/pfsense-utils.inc:2596
+msgid "Russian"
+msgstr "ロシア語"
+
+#: etc/inc/pfsense-utils.inc:2597
+msgid "Slovenian"
+msgstr "スロベニア語"
+
+#: etc/inc/pfsense-utils.inc:2599
+msgid "Spanish"
+msgstr "スペイン語"
+
+#: etc/inc/pfsense-utils.inc:2600
+msgid "Swedish"
+msgstr "スウェーデン語"
+
+#: etc/inc/pfsense-utils.inc:2601
+msgid "Slovak"
+msgstr "スロバキア語"
+
+#: etc/inc/pfsense-utils.inc:2602
+msgid "Czech"
+msgstr "チェコ語"
diff --git a/src/usr/local/share/locale/pt_BR/LC_MESSAGES/pfSense.mo b/src/usr/local/share/locale/pt_BR/LC_MESSAGES/pfSense.mo
new file mode 100644
index 0000000..c2da72c
--- /dev/null
+++ b/src/usr/local/share/locale/pt_BR/LC_MESSAGES/pfSense.mo
Binary files differ
diff --git a/src/usr/local/share/locale/pt_BR/LC_MESSAGES/pfSense.po b/src/usr/local/share/locale/pt_BR/LC_MESSAGES/pfSense.po
new file mode 100644
index 0000000..a4f299d
--- /dev/null
+++ b/src/usr/local/share/locale/pt_BR/LC_MESSAGES/pfSense.po
@@ -0,0 +1,41314 @@
+# Language translation for pfSense project.
+# Copyright (C) 2011-2015 Electric Sheep Fencing LLC
+# This file is distributed under the same license as the pfSense package.
+# Vinicius Coque <vcoque@gmail.com>, 2011.
+# Luiz Gustavo <luizgustavo@luizgustavo.pro>, 2014 Powered by: TrustUX Network (www.trustux.com)
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-29 09:27-0300\n"
+"PO-Revision-Date: 2014-02-28 14:46-0300\n"
+"Last-Translator: Luiz Gustavo <luizgustavo@luizgustavo.pro.br>\n"
+"Language-Team: Powered By: TrustUX Network <www.trustux.com>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 1.6.4\n"
+
+#: etc/inc/PEAR.inc:161
+#, php-format
+msgid "PEAR constructor called, class=%s\n"
+msgstr "Construtor PEAR chamado, class=%s\n"
+
+#: etc/inc/PEAR.inc:198
+#, php-format
+msgid "PEAR destructor called, class=%s\n"
+msgstr "Destrutor PEAR chamado, classe=%s\n"
+
+#: etc/inc/PEAR.inc:337 etc/inc/PEAR.inc:595 etc/inc/PEAR.inc:632
+msgid "invalid error callback"
+msgstr "retorno de chamada de erro inválida"
+
+#: etc/inc/PEAR.inc:342 etc/inc/PEAR.inc:600 etc/inc/PEAR.inc:637
+msgid "invalid error mode"
+msgstr "modo de erro inválido"
+
+#: etc/inc/PEAR.inc:445 etc/inc/PEAR.inc:451
+msgid "The expected error you submitted does not exist"
+msgstr "O erro esperado que você enviou não existe"
+
+#: etc/inc/PEAR.inc:455
+msgid "The expected error you submitted is empty"
+msgstr "O erro esperado que você enviou está vazio"
+
+#: etc/inc/PEAR.inc:866
+msgid "PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_ErrorStack for exceptions"
+msgstr "PEAR_ERROR_EXCEPTION está obsoleto, use a classe PEAR_ErrorStack para exceções"
+
+#: etc/inc/PEAR.inc:1023
+#, php-format
+msgid "[%s: message=\"%s\" code=%d mode=callback callback=%s prefix=\"%s\" info=\"%s\"]"
+msgstr "[%s: message=\"%s\" code=%d mode=callback callback=%s prefix=\"%s\" info=\"%s\"]"
+
+#: etc/inc/PEAR.inc:1041
+#, php-format
+msgid "[%s: message=\"%s\" code=%d mode=%s level=%s prefix=\"%s\" info=\"%s\"]"
+msgstr "[%s: message=\"%s\" code=%d mode=%s level=%s prefix=\"%s\" info=\"%s\"]"
+
+#: etc/inc/array_intersect_key.inc:37
+msgid "Wrong parameter count for array_intersect_key()"
+msgstr "Quantidade de parâmetros errada para array_intersect_key()"
+
+#: etc/inc/array_intersect_key.inc:45
+msgid "array_intersect_key() Argument #"
+msgstr "array_intersect_key() Argumento #"
+
+#: etc/inc/array_intersect_key.inc:46
+msgid " is not an array"
+msgstr "não é um array"
+
+# só se usa "ao invés", para coisas contrárias. "Dentro ao invés de fora."
+#: etc/inc/auth.inc:100 etc/inc/auth.inc:107
+msgid "Potential DNS Rebind attack detected, see http://en.wikipedia.org/wiki/DNS_rebinding<br/>Try accessing the router by IP address instead of by hostname."
+msgstr "Potencial ataque DNS Rebind detectado, veja http://en.wikipedia.org/wiki/DNS_rebinding<br/> Tente acessar o roteador pelo endereço de IP em lugar do hostname."
+
+#: etc/inc/auth.inc:115 etc/inc/auth.inc:122
+msgid "Redirecting..."
+msgstr "Redirecionando..."
+
+#: etc/inc/auth.inc:115 etc/inc/auth.inc:122
+msgid "Redirecting to the dashboard..."
+msgstr "Redirecionando para ao dashboard..."
+
+#: etc/inc/auth.inc:315 etc/inc/auth.inc:335 etc/inc/auth.inc:406
+#: etc/inc/auth.inc:433 etc/inc/auth.inc:478 etc/inc/auth.inc:609
+#: etc/inc/auth.inc:621 etc/inc/auth.inc:311 etc/inc/auth.inc:331
+#: etc/inc/auth.inc:402 etc/inc/auth.inc:431 etc/inc/auth.inc:487
+#: etc/inc/auth.inc:618 etc/inc/auth.inc:630 etc/inc/auth.inc:334
+#: etc/inc/auth.inc:354 etc/inc/auth.inc:425 etc/inc/auth.inc:454
+#: etc/inc/auth.inc:510 etc/inc/auth.inc:641 etc/inc/auth.inc:653
+#, php-format
+msgid "Running: %s"
+msgstr "Executando: %s"
+
+#: etc/inc/auth.inc:656 etc/inc/auth.inc:728 etc/inc/auth.inc:796
+#: etc/inc/auth.inc:1040 etc/inc/auth.inc:665 etc/inc/auth.inc:737
+#: etc/inc/auth.inc:805 etc/inc/auth.inc:1049 etc/inc/auth.inc:1053
+#: etc/inc/auth.inc:806 etc/inc/auth.inc:1057 etc/inc/auth.inc:688
+#: etc/inc/auth.inc:760 etc/inc/auth.inc:831 etc/inc/auth.inc:1086
+#, php-format
+msgid "ERROR! Could not connect to server %s."
+msgstr "ERRO! Não foi possível conectar-se ao servidor %s."
+
+#: etc/inc/auth.inc:674 etc/inc/auth.inc:683 etc/inc/auth.inc:706
+#, php-format
+msgid "LDAP: Could not lookup CA by reference for host %s."
+msgstr "LDAP: Não foi possível encontrar a CA referenciada pelo host %s."
+
+#: etc/inc/auth.inc:783 etc/inc/auth.inc:792 etc/inc/auth.inc:793
+#: etc/inc/auth.inc:818
+msgid "ERROR! ldap_get_user_ous() backed selected with no LDAP authentication server defined."
+msgstr "ERRO! ldap_get_user_ous() selecionado sem servidor de autenticação LDAP definido."
+
+#: etc/inc/auth.inc:807 etc/inc/auth.inc:816 etc/inc/auth.inc:818
+#: etc/inc/auth.inc:845
+#, php-format
+msgid "ERROR! ldap_get_user_ous() could not bind anonymously to server %s."
+msgstr "ERRO! ldap_get_user_ous() não foi possível vincular anonimamente ao servidor %s."
+
+#: etc/inc/auth.inc:812 etc/inc/auth.inc:821 etc/inc/auth.inc:823
+#: etc/inc/auth.inc:850
+#, php-format
+msgid "ERROR! ldap_get_user_ous() could not bind to server %s."
+msgstr "ERRO! ldap_get_user_ous() não pôde vincular ao servidor %s."
+
+#: etc/inc/auth.inc:908 etc/inc/auth.inc:917 etc/inc/auth.inc:919
+#: etc/inc/auth.inc:946
+#, php-format
+msgid "ERROR! ldap_get_groups() Could not connect to server %s."
+msgstr "ERRO! ldap_get_groups() Não foi possível conectar ao servidor %s."
+
+#: etc/inc/auth.inc:918 etc/inc/auth.inc:927 etc/inc/auth.inc:930
+#: etc/inc/auth.inc:959
+#, php-format
+msgid "ERROR! ldap_get_groups() could not bind anonymously to server %s."
+msgstr "ERRO! ldap_get_groups() não foi possível vincular anonimamente ao servidor %s."
+
+#: etc/inc/auth.inc:923 etc/inc/auth.inc:932 etc/inc/auth.inc:935
+#: etc/inc/auth.inc:964
+#, php-format
+msgid "ERROR! ldap_get_groups() could not bind to server %s."
+msgstr "ERRO! ldap_get_groups() não foi possível vincular ao servidor %s."
+
+#: etc/inc/auth.inc:1020 etc/inc/auth.inc:1029 etc/inc/auth.inc:1033
+#: etc/inc/auth.inc:1036 etc/inc/auth.inc:1065
+msgid "ERROR! ldap_backed() called with no LDAP authentication server defined. Defaulting to local user database. Visit System -> User Manager."
+msgstr "ERRO! ldap_backed() nenhum chamado com servidor de autenticação LDAP foi definido. Padronizando o banco de dados do usuário local. Visite Sistema -> Gerenciador de Usuário."
+
+#: etc/inc/auth.inc:1023 etc/inc/auth.inc:1032 etc/inc/auth.inc:1036
+#: etc/inc/auth.inc:1039 etc/inc/auth.inc:1068
+msgid "ERROR! ldap_backed() called with no LDAP authentication server defined."
+msgstr "ERRO! ldap_backed() nenhum chamado com servidor de autenticação LDAP foi definido."
+
+#: etc/inc/auth.inc:1054 etc/inc/auth.inc:1063 etc/inc/auth.inc:1067
+#: etc/inc/auth.inc:1071 etc/inc/auth.inc:1102
+#, php-format
+msgid "ERROR! Could not bind to server %s."
+msgstr "ERRO! Não foi possível vincular ao servidor %s."
+
+#: etc/inc/auth.inc:1071 etc/inc/auth.inc:1080 etc/inc/auth.inc:1084
+#: etc/inc/auth.inc:1085 etc/inc/auth.inc:1089 etc/inc/auth.inc:1120
+#, php-format
+msgid "Now Searching for %s in directory."
+msgstr "Buscando agora por %s no diretório."
+
+#: etc/inc/auth.inc:1075 etc/inc/auth.inc:1084 etc/inc/auth.inc:1088
+#: etc/inc/auth.inc:1090 etc/inc/auth.inc:1094 etc/inc/auth.inc:1128
+#, php-format
+msgid "Now Searching in server %1$s, container %2$s with filter %3$s."
+msgstr "Agora pesquisando no servidor %1$s, recipiente %2$s com filtro %3$s."
+
+#: etc/inc/auth.inc:1086 etc/inc/auth.inc:1095 etc/inc/auth.inc:1099
+#: etc/inc/auth.inc:1101 etc/inc/auth.inc:1105 etc/inc/auth.inc:1139
+#, php-format
+msgid "Search resulted in error: %s"
+msgstr "A busca resultou em erro: %s"
+
+#: etc/inc/auth.inc:1102 etc/inc/auth.inc:1111 etc/inc/auth.inc:1115
+#: etc/inc/auth.inc:1117 etc/inc/auth.inc:1121 etc/inc/auth.inc:1155
+msgid "ERROR! Either LDAP search failed, or multiple users were found."
+msgstr "ERRO! Ou a busca LDAP falhou, ou múltiplos usuários foram encontrados."
+
+#: etc/inc/auth.inc:1108 etc/inc/auth.inc:1117 etc/inc/auth.inc:1121
+#: etc/inc/auth.inc:1123
+#, php-format
+msgid "ERROR! Could not login to server %1$s as user %2$s."
+msgstr "ERRO! Não foi possível logar no servidor %1$s como usuário %2$s."
+
+#: etc/inc/auth.inc:1113 etc/inc/auth.inc:1122 etc/inc/auth.inc:1126
+#: etc/inc/auth.inc:1129 etc/inc/auth.inc:1133 etc/inc/auth.inc:1169
+#, php-format
+msgid "Logged in successfully as %1$s via LDAP server %2$s with DN = %3$s."
+msgstr "Autenticado com sucesso como %1$s via servidor LDAP %2$s com DN = %3$s."
+
+#: etc/inc/auth.inc:1144 etc/inc/auth.inc:1153 etc/inc/auth.inc:1157
+#: etc/inc/auth.inc:1163 etc/inc/auth.inc:1167 etc/inc/auth.inc:1204
+#, php-format
+msgid "Radius start: %s<br>\n"
+msgstr "Início do Radius: %s<br>\n"
+
+#: etc/inc/auth.inc:1155 etc/inc/auth.inc:1164 etc/inc/auth.inc:1168
+#: etc/inc/auth.inc:1174 etc/inc/auth.inc:1178 etc/inc/auth.inc:1215
+#, php-format
+msgid "Radius send failed: %s<br>\n"
+msgstr "Envio do Radius falhou: %s<br>\n"
+
+#: etc/inc/auth.inc:1159 etc/inc/auth.inc:1170 etc/inc/auth.inc:1174
+#: etc/inc/auth.inc:1180 etc/inc/auth.inc:1184 etc/inc/auth.inc:1221
+#, php-format
+msgid "Radius Auth succeeded"
+msgstr "Autenticação do Radius bem sucedida"
+
+#: etc/inc/auth.inc:1164 etc/inc/auth.inc:1175 etc/inc/auth.inc:1179
+#: etc/inc/auth.inc:1185 etc/inc/auth.inc:1189 etc/inc/auth.inc:1226
+#, php-format
+msgid "Radius Auth rejected"
+msgstr "Autenticação do Radius rejeitada"
+
+#: etc/inc/auth.inc:1207 etc/inc/auth.inc:1222 etc/inc/auth.inc:1218
+#: etc/inc/auth.inc:1233 etc/inc/auth.inc:1237 etc/inc/auth.inc:1228
+#: etc/inc/auth.inc:1243 etc/inc/auth.inc:1232 etc/inc/auth.inc:1247
+#: etc/inc/auth.inc:1269 etc/inc/auth.inc:1284
+msgid "Local Database"
+msgstr "Banco de Dados Local"
+
+#: etc/inc/auth.inc:1207 etc/inc/auth.inc:1222 etc/inc/auth.inc:1218
+#: etc/inc/auth.inc:1233 etc/inc/auth.inc:1237
+msgid "Local Auth"
+msgstr "Autenticação Local"
+
+#: etc/inc/auth.inc:1293 etc/inc/auth.inc:1317 etc/inc/auth.inc:1321
+#: etc/inc/auth.inc:1327 etc/inc/auth.inc:1331 etc/inc/auth.inc:1368
+#, php-format
+msgid "Successful login for user '%1$s' from: %2$s"
+msgstr "Login bem sucedido para o usuário '%1$s' de: %2$s"
+
+#: etc/inc/auth.inc:1347 etc/inc/auth.inc:1371 etc/inc/auth.inc:1375
+#: etc/inc/auth.inc:1381 etc/inc/auth.inc:1385 etc/inc/auth.inc:1422
+#, php-format
+msgid "Session timed out for user '%1$s' from: %2$s"
+msgstr "Sessão expirada para usuário '%1$s' de: %2$s"
+
+#: etc/inc/auth.inc:1349 etc/inc/auth.inc:1373 etc/inc/auth.inc:1377
+#: etc/inc/auth.inc:1383 etc/inc/auth.inc:1387 etc/inc/auth.inc:1424
+#, php-format
+msgid "User logged out for user '%1$s' from: %2$s"
+msgstr "Usuário desconectado para '%1$s' de: %2$s"
+
+#: etc/inc/captiveportal.inc:1374 etc/inc/captiveportal.inc:1383
+#: etc/inc/captiveportal.inc:1420 etc/inc/captiveportal.inc:1335
+#: etc/inc/captiveportal.inc:1338 etc/inc/captiveportal.inc:1334
+#, php-format
+msgid "Error: cannot open '%s' in captiveportal_write_elements()%s"
+msgstr "Erro: não pôde abrir '%s' em captiveportal_write_elements()%s"
+
+#: etc/inc/config.inc:100
+msgid "Upgrading m0n0wall configuration to pfSense... "
+msgstr "Atualizando configuração do m0n0wall para o pfSense..."
+
+#: etc/inc/config.inc:103
+msgid "ERROR! Could not convert m0n0wall -> pfsense in config.xml"
+msgstr "ERRO! Não pôde converter m0n0wall -> pfsense no config.xml"
+
+#: etc/inc/config.inc:133
+msgid "CDROM build"
+msgstr "Construção de CDROM"
+
+#: etc/inc/config.inc:134 etc/inc/config.inc:135
+msgid "CFG:"
+msgstr "CFG:"
+
+#: etc/inc/config.inc:136
+msgid "TYPE:"
+msgstr "TIPO:"
+
+#: etc/inc/config.inc:151 etc/inc/config.inc:166
+#, php-format
+msgid "Found configuration on %s.%s"
+msgstr "Encontrada configuração em %s.%s"
+
+#: etc/inc/config.inc:180 etc/inc/config.inc:181 etc/inc/config.lib.inc:105
+#: etc/inc/config.lib.inc:106 etc/inc/config.lib.inc:245
+#: etc/inc/config.lib.inc:266 etc/inc/config.lib.inc:267
+msgid "No config.xml found, attempting last known config restore."
+msgstr "Nenhum config.xml encontrado, tentando última restauração conhecida do config."
+
+#: etc/inc/config.inc:184
+msgid "No config.xml or config backups found, resetting to factory defaults."
+msgstr "Nenhum config.xml ou backups encontrados, reconfigurando para padrões de fábrica."
+
+#: etc/inc/filter.inc:197 etc/inc/filter.inc:194 etc/inc/filter.inc:193
+#: etc/inc/filter.inc:168 etc/inc/filter.inc:183
+msgid "Initializing"
+msgstr "Inicializando"
+
+#: etc/inc/filter.inc:209 etc/inc/filter.inc:206 etc/inc/filter.inc:205
+#: etc/inc/filter.inc:180 etc/inc/filter.inc:195
+msgid "Configuring firewall"
+msgstr "Configurando firewall"
+
+#: etc/inc/filter.inc:214 etc/inc/filter.inc:211 etc/inc/filter.inc:210
+#: etc/inc/filter.inc:185 etc/inc/filter.inc:200
+msgid "Creating aliases"
+msgstr "Criando aliases"
+
+#: etc/inc/filter.inc:219 etc/inc/filter.inc:218 etc/inc/filter.inc:193
+#: etc/inc/filter.inc:208
+msgid "Generating NAT rules"
+msgstr "Gerando regras NAT"
+
+#: etc/inc/filter.inc:224 etc/inc/filter.inc:223 etc/inc/filter.inc:198
+#: etc/inc/filter.inc:213
+msgid "Generating filter rules"
+msgstr "Gerando regras de filtro"
+
+#: etc/inc/filter.inc:230 etc/inc/filter.inc:229 etc/inc/filter.inc:204
+#: etc/inc/filter.inc:219
+msgid "Generating ALTQ queues"
+msgstr "Gerando filas ALTQ"
+
+#: etc/inc/filter.inc:232 etc/inc/filter.inc:216 etc/inc/filter.inc:215
+#: etc/inc/filter.inc:190 etc/inc/filter.inc:205
+msgid "Generating Limiter rules"
+msgstr "Gerando regras Limiter"
+
+#: etc/inc/filter.inc:234 etc/inc/filter.inc:232 etc/inc/filter.inc:231
+#: etc/inc/filter.inc:206 etc/inc/filter.inc:221
+msgid "Generating Layer7 rules"
+msgstr "Gerando regras Layer7"
+
+#: etc/inc/filter.inc:238 etc/inc/filter.inc:236 etc/inc/filter.inc:235
+#: etc/inc/filter.inc:210 etc/inc/filter.inc:225
+msgid "Loading filter rules"
+msgstr "Carregando regras de filtro"
+
+#: etc/inc/filter.inc:245 etc/inc/filter.inc:243 etc/inc/filter.inc:242
+#: etc/inc/filter.inc:217 etc/inc/filter.inc:232
+msgid "Filter is disabled. Not loading rules."
+msgstr "Filtro estático desabilitado. Não carregando regras."
+
+#: etc/inc/filter.inc:247 etc/inc/filter.inc:418 etc/inc/interfaces.inc:217
+#: etc/inc/interfaces.inc:234 etc/inc/interfaces.inc:360
+#: etc/inc/interfaces.inc:410 etc/inc/interfaces.inc:664
+#: etc/inc/interfaces.inc:924 etc/inc/interfaces.inc:964
+#: etc/inc/interfaces.inc:979 etc/inc/interfaces.inc:1780
+#: etc/inc/pkg-utils.inc:586 etc/inc/pkg-utils.inc:596
+#: etc/inc/pkg-utils.inc:619 etc/inc/pkg-utils.inc:696
+#: etc/inc/pkg-utils.inc:711 etc/inc/pkg-utils.inc:755
+#: etc/inc/pkg-utils.inc:786 etc/inc/pkg-utils.inc:805
+#: etc/inc/pkg-utils.inc:812 etc/inc/pkg-utils.inc:829
+#: etc/inc/pkg-utils.inc:845 etc/inc/pkg-utils.inc:861
+#: etc/inc/pkg-utils.inc:967 etc/inc/pkg-utils.inc:984
+#: etc/inc/pkg-utils.inc:1009 etc/inc/pkg-utils.inc:1054
+#: etc/inc/pkg-utils.inc:1063 etc/inc/pkg-utils.inc:1073
+#: etc/inc/pkg-utils.inc:1088 etc/inc/pkg-utils.inc:1095
+#: etc/inc/pkg-utils.inc:1114 etc/inc/services.inc:899
+#: etc/inc/services.inc:1234 etc/inc/services.inc:1297
+#: etc/inc/services.inc:1477 etc/inc/system.inc:651 etc/inc/system.inc:674
+#: etc/inc/system.inc:759 etc/inc/system.inc:1197 etc/inc/system.inc:1278
+#: etc/inc/system.inc:1409 etc/inc/rrd.inc:782 etc/inc/system.inc:699
+#: etc/inc/system.inc:722 etc/inc/system.inc:806 etc/inc/system.inc:1249
+#: etc/inc/system.inc:1334 etc/inc/system.inc:1466 etc/inc/pkg-utils.inc:612
+#: etc/inc/pkg-utils.inc:622 etc/inc/pkg-utils.inc:645
+#: etc/inc/pkg-utils.inc:722 etc/inc/pkg-utils.inc:737
+#: etc/inc/pkg-utils.inc:781 etc/inc/pkg-utils.inc:841
+#: etc/inc/pkg-utils.inc:848 etc/inc/pkg-utils.inc:865
+#: etc/inc/pkg-utils.inc:881 etc/inc/pkg-utils.inc:897
+#: etc/inc/pkg-utils.inc:1004 etc/inc/pkg-utils.inc:1021
+#: etc/inc/pkg-utils.inc:1046 etc/inc/pkg-utils.inc:1091
+#: etc/inc/pkg-utils.inc:1100 etc/inc/pkg-utils.inc:1110
+#: etc/inc/pkg-utils.inc:1125 etc/inc/pkg-utils.inc:1132
+#: etc/inc/pkg-utils.inc:1151 etc/inc/interfaces.inc:219
+#: etc/inc/interfaces.inc:236 etc/inc/interfaces.inc:362
+#: etc/inc/interfaces.inc:412 etc/inc/interfaces.inc:671
+#: etc/inc/interfaces.inc:951 etc/inc/interfaces.inc:991
+#: etc/inc/interfaces.inc:1006 etc/inc/interfaces.inc:1845 etc/inc/rrd.inc:806
+#: etc/inc/services.inc:1028 etc/inc/services.inc:1370
+#: etc/inc/services.inc:1434 etc/inc/services.inc:1669 etc/inc/filter.inc:245
+#: etc/inc/filter.inc:420 etc/inc/system.inc:703 etc/inc/system.inc:726
+#: etc/inc/system.inc:804 etc/inc/system.inc:1229 etc/inc/system.inc:1376
+#: etc/inc/system.inc:1508 etc/inc/pkg-utils.inc:394 etc/inc/pkg-utils.inc:613
+#: etc/inc/pkg-utils.inc:623 etc/inc/pkg-utils.inc:646
+#: etc/inc/pkg-utils.inc:723 etc/inc/pkg-utils.inc:738
+#: etc/inc/pkg-utils.inc:782 etc/inc/pkg-utils.inc:813
+#: etc/inc/pkg-utils.inc:842 etc/inc/pkg-utils.inc:849
+#: etc/inc/pkg-utils.inc:866 etc/inc/pkg-utils.inc:882
+#: etc/inc/pkg-utils.inc:898 etc/inc/pkg-utils.inc:1005
+#: etc/inc/pkg-utils.inc:1022 etc/inc/pkg-utils.inc:1047
+#: etc/inc/pkg-utils.inc:1092 etc/inc/pkg-utils.inc:1101
+#: etc/inc/pkg-utils.inc:1111 etc/inc/pkg-utils.inc:1126
+#: etc/inc/pkg-utils.inc:1133 etc/inc/pkg-utils.inc:1152
+#: etc/inc/interfaces.inc:218 etc/inc/interfaces.inc:235
+#: etc/inc/interfaces.inc:361 etc/inc/interfaces.inc:411
+#: etc/inc/interfaces.inc:670 etc/inc/interfaces.inc:950
+#: etc/inc/interfaces.inc:990 etc/inc/interfaces.inc:1005
+#: etc/inc/interfaces.inc:1849 etc/inc/services.inc:1160
+#: etc/inc/services.inc:1509 etc/inc/services.inc:1573
+#: etc/inc/services.inc:1808 etc/inc/filter.inc:244 etc/inc/filter.inc:423
+#: etc/inc/filter.inc:219 etc/inc/filter.inc:395 etc/inc/pkg-utils.inc:411
+#: etc/inc/pkg-utils.inc:648 etc/inc/pkg-utils.inc:658
+#: etc/inc/pkg-utils.inc:681 etc/inc/pkg-utils.inc:758
+#: etc/inc/pkg-utils.inc:773 etc/inc/pkg-utils.inc:817
+#: etc/inc/pkg-utils.inc:877 etc/inc/pkg-utils.inc:884
+#: etc/inc/pkg-utils.inc:901 etc/inc/pkg-utils.inc:917
+#: etc/inc/pkg-utils.inc:933 etc/inc/pkg-utils.inc:1040
+#: etc/inc/pkg-utils.inc:1057 etc/inc/pkg-utils.inc:1082
+#: etc/inc/pkg-utils.inc:1127 etc/inc/pkg-utils.inc:1136
+#: etc/inc/pkg-utils.inc:1146 etc/inc/pkg-utils.inc:1161
+#: etc/inc/pkg-utils.inc:1168 etc/inc/pkg-utils.inc:1187
+#: etc/inc/interfaces.inc:216 etc/inc/interfaces.inc:233
+#: etc/inc/interfaces.inc:365 etc/inc/interfaces.inc:422
+#: etc/inc/interfaces.inc:697 etc/inc/interfaces.inc:1033
+#: etc/inc/interfaces.inc:1054 etc/inc/interfaces.inc:1069
+#: etc/inc/interfaces.inc:1889 etc/inc/services.inc:1154
+#: etc/inc/services.inc:1499 etc/inc/services.inc:1596
+#: etc/inc/services.inc:1797 etc/inc/system.inc:712 etc/inc/system.inc:735
+#: etc/inc/system.inc:815 etc/inc/system.inc:1178 etc/inc/system.inc:1318
+#: etc/inc/system.inc:1457 etc/inc/rrd.inc:829 etc/inc/filter.inc:399
+#: etc/inc/interfaces.inc:1894 etc/inc/services.inc:1516
+#: etc/inc/services.inc:1628 etc/inc/services.inc:1837 etc/inc/rrd.inc:831
+#: etc/inc/services.inc:1659 etc/inc/services.inc:1868 etc/inc/rrd.inc:834
+#: etc/inc/services.inc:1212 etc/inc/services.inc:1568
+#: etc/inc/services.inc:1723 etc/inc/services.inc:1932 etc/inc/filter.inc:234
+#: etc/inc/services.inc:1210 etc/inc/services.inc:1566
+#: etc/inc/services.inc:1721 etc/inc/services.inc:1930 etc/inc/system.inc:1205
+#: etc/inc/system.inc:1345 etc/inc/system.inc:1484 etc/inc/rrd.inc:873
+msgid "done."
+msgstr "pronto."
+
+#: etc/inc/filter.inc:259 etc/inc/filter.inc:265 etc/inc/filter.inc:289
+#: etc/inc/filter.inc:269 etc/inc/filter.inc:284
+msgid "Setting up logging information"
+msgstr "Configurando informação de log"
+
+#: etc/inc/filter.inc:290 etc/inc/filter.inc:294 etc/inc/filter.inc:274
+#: etc/inc/filter.inc:289
+msgid "Setting up SCRUB information"
+msgstr "Configurando informação de SCRUB"
+
+#: etc/inc/filter.inc:336 etc/inc/filter.inc:338 etc/inc/filter.inc:341
+#: etc/inc/filter.inc:313 etc/inc/filter.inc:328
+#, php-format
+msgid "The line in question reads [%1$d]: %2$s"
+msgstr "A linha em questão lida [%1$d]: %2$s"
+
+#: etc/inc/filter.inc:338 etc/inc/filter.inc:340 etc/inc/filter.inc:342
+#: etc/inc/filter.inc:343 etc/inc/filter.inc:345 etc/inc/filter.inc:316
+#: etc/inc/filter.inc:317 etc/inc/filter.inc:331 etc/inc/filter.inc:332
+#, php-format
+msgid "There were error(s) loading the rules: %1$s - %2$s"
+msgstr "Houve erro(s) carregando as regras: %1$s - %2$s"
+
+#: etc/inc/filter.inc:349 etc/inc/filter.inc:351 etc/inc/filter.inc:354
+#: etc/inc/filter.inc:324 etc/inc/filter.inc:339
+msgid "PF was wedged/busy and has been reset."
+msgstr "PF estava travado/ocupado e foi reiniciado."
+
+#: etc/inc/filter.inc:355 etc/inc/filter.inc:357 etc/inc/filter.inc:360
+#: etc/inc/filter.inc:329 etc/inc/filter.inc:333 etc/inc/filter.inc:348
+msgid "Starting up layer7 daemon"
+msgstr "Iniciando daemon layer7"
+
+#: etc/inc/filter.inc:403 etc/inc/filter.inc:405 etc/inc/filter.inc:408
+#: etc/inc/filter.inc:380 etc/inc/filter.inc:384
+msgid "Processing down interface states"
+msgstr "Processando estados de interface"
+
+#: etc/inc/filter.inc:407 etc/inc/filter.inc:409 etc/inc/filter.inc:412
+#: etc/inc/filter.inc:384 etc/inc/filter.inc:388
+msgid "Running plugins"
+msgstr "Executando plugins"
+
+#: etc/inc/filter.inc:411 etc/inc/filter.inc:413 etc/inc/filter.inc:416
+#: etc/inc/filter.inc:388 etc/inc/filter.inc:392
+msgid "Running plugins (pf)"
+msgstr "Executando plugins (pf)"
+
+#: etc/inc/filter.inc:413 etc/inc/filter.inc:415 etc/inc/filter.inc:418
+#: etc/inc/filter.inc:390 etc/inc/filter.inc:394
+msgid "Plugins completed."
+msgstr "Plugins finalizados."
+
+#: etc/inc/filter.inc:416 usr/local/www/restart_httpd.php:52
+#: usr/local/www/restart_httpd.php:55 usr/local/www/restart_httpd.php:58
+#: usr/local/www/restart_httpd.php:61 etc/inc/filter.inc:418
+#: etc/inc/filter.inc:421 etc/inc/filter.inc:393 etc/inc/filter.inc:397
+msgid "Done"
+msgstr "Pronto"
+
+#: etc/inc/filter.inc:636 etc/inc/filter.inc:649 etc/inc/filter.inc:652
+#: etc/inc/filter.inc:641 etc/inc/filter.inc:657 etc/inc/filter.inc:671
+msgid "Creating gateway group item..."
+msgstr "Criando um item de grupo de gateway..."
+
+#: etc/inc/filter.inc:666 etc/inc/filter.inc:681 etc/inc/filter.inc:684
+#: etc/inc/filter.inc:673 etc/inc/filter.inc:687 etc/inc/filter.inc:692
+#: etc/inc/filter.inc:706
+#, php-format
+msgid "Setting up route with %1$s on %2$s"
+msgstr "Configurando rota com %1$s em %2$s"
+
+#: etc/inc/filter.inc:673 etc/inc/filter.inc:688 etc/inc/filter.inc:691
+#: etc/inc/filter.inc:680 etc/inc/filter.inc:694 etc/inc/filter.inc:699
+#: etc/inc/filter.inc:713
+#, php-format
+msgid "An error occurred while trying to find the interface got %s . The rule has not been added."
+msgstr "Um erro ocorreu na tentativa de se encontrar a interface obtida %s. A regra não foi adicionada."
+
+#: etc/inc/filter.inc:937 etc/inc/filter.inc:987 etc/inc/filter.inc:975
+#: etc/inc/filter.inc:1009 etc/inc/filter.inc:1027 etc/inc/filter.inc:1032
+#: etc/inc/filter.inc:1046
+#, php-format
+msgid "Creating reflection NAT rule for %s..."
+msgstr "Criando regra de reflexão NAT para %s..."
+
+#: etc/inc/filter.inc:991 etc/inc/filter.inc:1076 etc/inc/filter.inc:1064
+#: etc/inc/filter.inc:1098 etc/inc/filter.inc:1116 etc/inc/filter.inc:1121
+#: etc/inc/filter.inc:1135
+#, php-format
+msgid "Creating reflection rule for %s..."
+msgstr "Criando regra de reflexão para %s..."
+
+#: etc/inc/filter.inc:1251 etc/inc/filter.inc:1338 etc/inc/filter.inc:1326
+#: etc/inc/filter.inc:1360 etc/inc/filter.inc:1378 etc/inc/filter.inc:1383
+#: etc/inc/filter.inc:1398
+msgid "Creating 1:1 rules..."
+msgstr "Criando regras 1:1..."
+
+#: etc/inc/filter.inc:1350 etc/inc/filter.inc:1437 etc/inc/filter.inc:1454
+#: etc/inc/filter.inc:1501 etc/inc/filter.inc:1519 etc/inc/filter.inc:1524
+#: etc/inc/filter.inc:1539
+#, php-format
+msgid "Creating advanced outbound rule %s"
+msgstr "Criando regra de saída avançada %s"
+
+#: etc/inc/filter.inc:1386 etc/inc/filter.inc:1473 etc/inc/filter.inc:1490
+#: etc/inc/filter.inc:1533 etc/inc/filter.inc:1551 etc/inc/filter.inc:1556
+#: etc/inc/filter.inc:1571
+msgid "Creating outbound NAT rules"
+msgstr "Criando regras NAT de outbound"
+
+#: etc/inc/filter.inc:1481 etc/inc/filter.inc:1566 etc/inc/filter.inc:1583
+#: etc/inc/filter.inc:1626 etc/inc/filter.inc:1644 etc/inc/filter.inc:1649
+#: etc/inc/filter.inc:1664
+#, php-format
+msgid "Creating outbound rules %1$s - (%2$s)"
+msgstr "Criando regras de saída %1$s - (%2$s)"
+
+#: etc/inc/filter.inc:1499 etc/inc/filter.inc:1584 etc/inc/filter.inc:1601
+#: etc/inc/filter.inc:1644 etc/inc/filter.inc:1662 etc/inc/filter.inc:1667
+#: etc/inc/filter.inc:1682
+msgid "Setting up TFTP helper"
+msgstr "Configurando ajuda do TFTP"
+
+#: etc/inc/filter.inc:1545 etc/inc/filter.inc:1630 etc/inc/filter.inc:1644
+#: etc/inc/filter.inc:1676 etc/inc/filter.inc:1694 etc/inc/filter.inc:1699
+#: etc/inc/filter.inc:1714
+#, php-format
+msgid "Creating NAT rule %s"
+msgstr "Criando regra NAT %s"
+
+#: etc/inc/filter.inc:1689 etc/inc/filter.inc:1837 etc/inc/filter.inc:1850
+#: etc/inc/filter.inc:1882 etc/inc/filter.inc:1900 etc/inc/filter.inc:1905
+#: etc/inc/filter.inc:1921
+#, php-format
+msgid "Creating filter rule %s ..."
+msgstr "Criando regra de filtro %s ..."
+
+#: etc/inc/filter.inc:1827 etc/inc/filter.inc:1975 etc/inc/filter.inc:1988
+#: etc/inc/filter.inc:2024 etc/inc/filter.inc:2054 etc/inc/filter.inc:2059
+#: etc/inc/filter.inc:2075
+#, php-format
+msgid "filter_generate_address: %s is not a valid source port."
+msgstr "filter_generate_address: %s não é uma porta de origem válida."
+
+#: etc/inc/filter.inc:1943 etc/inc/filter.inc:2094 etc/inc/filter.inc:2107
+#: etc/inc/filter.inc:2142 etc/inc/filter.inc:2172 etc/inc/filter.inc:2177
+#: etc/inc/filter.inc:2193
+#, php-format
+msgid "Setting up pass/block rules %s"
+msgstr "Configurando regras de liberação/bloqueio %s"
+
+#: etc/inc/filter.inc:1962 etc/inc/filter.inc:2113 etc/inc/filter.inc:2126
+#: etc/inc/filter.inc:2157 etc/inc/filter.inc:2187 etc/inc/filter.inc:2192
+#: etc/inc/filter.inc:2208
+#, php-format
+msgid "Could not find IPv4 gateway for interface (%s)."
+msgstr "Não é possível encontrar gateway IPv4 para interface (%s)."
+
+#: etc/inc/filter.inc:1989 etc/inc/filter.inc:2140 etc/inc/filter.inc:2153
+#: etc/inc/filter.inc:2182 etc/inc/filter.inc:2214 etc/inc/filter.inc:2219
+#: etc/inc/filter.inc:2235
+#, php-format
+msgid "Creating rule %s"
+msgstr "Criando regra %s"
+
+#: etc/inc/filter.inc:2198 etc/inc/filter.inc:2355 etc/inc/filter.inc:2378
+#: etc/inc/filter.inc:2407 etc/inc/filter.inc:2439 etc/inc/filter.inc:2444
+#: etc/inc/filter.inc:2474
+msgid "Creating default rules"
+msgstr "Criando regras padrão"
+
+#: etc/inc/filter.inc:2649 etc/inc/filter.inc:2862 etc/inc/filter.inc:2887
+#: etc/inc/filter.inc:2976 etc/inc/filter.inc:3000 etc/inc/filter.inc:3005
+#: etc/inc/filter.inc:3028
+msgid "Creating IPsec rules..."
+msgstr "Criando regras IPsec..."
+
+#: etc/inc/filter.inc:2702 etc/inc/filter.inc:2915 etc/inc/filter.inc:2940
+#: etc/inc/filter.inc:3026 etc/inc/filter.inc:3050 etc/inc/filter.inc:3055
+#: etc/inc/filter.inc:3078
+msgid "Please use filter_tdr_install_cron() function tdr_install_cron will be deprecated!"
+msgstr "Por favor, use a função filter_tdr_install_cron(). A função tdr_install_cron se tornará obsoleta!"
+
+#: etc/inc/filter.inc:2747 etc/inc/filter.inc:2960 etc/inc/filter.inc:2986
+#: etc/inc/filter.inc:3072 etc/inc/filter.inc:3096 etc/inc/filter.inc:3101
+#: etc/inc/filter.inc:3124
+msgid "Installed 15 minute filter reload for Time Based Rules"
+msgstr "Instalado filtro de recarregamento de 15 minutos para Tempo de Regras Baseadas"
+
+#: etc/inc/filter.inc:3102 etc/inc/filter.inc:3313 etc/inc/filter.inc:3293
+#: etc/inc/filter.inc:3389 etc/inc/filter.inc:3413 etc/inc/filter.inc:3418
+#: etc/inc/filter.inc:3412 etc/inc/filter.inc:3440
+#, php-format
+msgid "Checking for %1$s PF hooks in package %2$s"
+msgstr "Checando para %1$s saltos PF no pacote %2$s"
+
+#: etc/inc/filter.inc:3107 etc/inc/filter.inc:3318 etc/inc/filter.inc:3299
+#: etc/inc/filter.inc:3395 etc/inc/filter.inc:3419 etc/inc/filter.inc:3424
+#: etc/inc/filter.inc:3418 etc/inc/filter.inc:3446
+#, php-format
+msgid "Processing early %1$s rules for package %2$s"
+msgstr "Processando %1$s regras iniciais para o pacote %2$s"
+
+#: etc/inc/filter.inc:3112 etc/inc/filter.inc:3323 etc/inc/filter.inc:3304
+#: etc/inc/filter.inc:3400 etc/inc/filter.inc:3424 etc/inc/filter.inc:3429
+#: etc/inc/filter.inc:3423 etc/inc/filter.inc:3451
+#, php-format
+msgid "There was an error while parsing the package filter rules for %s."
+msgstr "Houve um erro ao analisar as regras de filtro do pacote para %s."
+
+#: etc/inc/interfaces.inc:51 etc/inc/interfaces.inc:53
+msgid "interfaces_bring_up() was called but no variable defined."
+msgstr "interfaces_bring_up() foi chamada mas nenhuma variável foi definida."
+
+#: etc/inc/interfaces.inc:213 etc/inc/interfaces.inc:215
+#: etc/inc/interfaces.inc:214 etc/inc/interfaces.inc:212
+msgid "Configuring loopback interface..."
+msgstr "Configurando interface de loopback..."
+
+#: etc/inc/interfaces.inc:224 etc/inc/interfaces.inc:226
+#: etc/inc/interfaces.inc:225 etc/inc/interfaces.inc:223
+msgid "Configuring VLAN interfaces..."
+msgstr "Configurando interfaces VLAN..."
+
+#: etc/inc/interfaces.inc:241 etc/inc/interfaces.inc:243
+#: etc/inc/interfaces.inc:242 etc/inc/interfaces.inc:240
+msgid "VLAN: called with wrong options. Problems with config!"
+msgstr "VLAN: chamada com as opções erradas. Problemas com configuração!"
+
+#: etc/inc/interfaces.inc:249
+msgid "interface_vlan_confgure called with if undefined."
+msgstr "interface_vlan_confgure chamada com if indefinido."
+
+#: etc/inc/interfaces.inc:283 etc/inc/interfaces.inc:367
+#: etc/inc/interfaces.inc:285 etc/inc/interfaces.inc:369
+#: etc/inc/interfaces.inc:284 etc/inc/interfaces.inc:368
+#: etc/inc/interfaces.inc:282 etc/inc/interfaces.inc:372
+#, php-format
+msgid "QinQ compat VLAN: called with wrong options. Problems with config!%s"
+msgstr "QinQ compacta VLAN: chamada com opções erradas. Problemas com config!%s"
+
+#: etc/inc/interfaces.inc:290 etc/inc/interfaces.inc:375
+#, php-format
+msgid "interface_qinq_confgure called with if undefined.%s"
+msgstr "interface_qinq_confgure chamada com if indefinido.%s"
+
+#: etc/inc/interfaces.inc:352 etc/inc/interfaces.inc:354
+#: etc/inc/interfaces.inc:353 etc/inc/interfaces.inc:357
+msgid "Configuring QinQ interfaces..."
+msgstr "Configurando interfaces QinQ..."
+
+#: etc/inc/interfaces.inc:396 etc/inc/interfaces.inc:398
+#: etc/inc/interfaces.inc:397
+msgid "Creating other wireless clone interfaces..."
+msgstr "Criando outras interfaces clones sem fio..."
+
+#: etc/inc/interfaces.inc:439 etc/inc/interfaces.inc:438
+#: etc/inc/interfaces.inc:437 etc/inc/interfaces.inc:466
+#, php-format
+msgid "No members found on %s"
+msgstr "Nenhum membro encontrado em %s"
+
+#: etc/inc/interfaces.inc:505 etc/inc/interfaces.inc:512
+#: etc/inc/interfaces.inc:511 etc/inc/interfaces.inc:541
+msgid "realif not defined in interfaces bridge - up"
+msgstr "realif não definido em interfaces bridge - up"
+
+#: etc/inc/interfaces.inc:618 etc/inc/interfaces.inc:625
+#: etc/inc/interfaces.inc:624 etc/inc/interfaces.inc:654
+msgid "bridgeif not defined -- could not bring interface up"
+msgstr "bridgeif não definido -- não pôde iniciar a interface"
+
+#: etc/inc/interfaces.inc:652 etc/inc/interfaces.inc:659
+#: etc/inc/interfaces.inc:658 etc/inc/interfaces.inc:685
+msgid "Configuring LAGG interfaces..."
+msgstr "Configurando interfaces LAGG..."
+
+#: etc/inc/interfaces.inc:790 etc/inc/interfaces.inc:801
+#: etc/inc/interfaces.inc:800 etc/inc/interfaces.inc:835
+msgid "Could not bring greif up -- variable not defined."
+msgstr "Não pôde iniciar greif -- variável não definida."
+
+#: etc/inc/interfaces.inc:833 etc/inc/interfaces.inc:851
+#: etc/inc/interfaces.inc:850 etc/inc/interfaces.inc:899
+msgid "could not bring realif up -- variable not defined -- interface_gif_configure()"
+msgstr "O realif não pôde ser iniciado -- variável não definida -- interface_gif_configure()"
+
+#: etc/inc/interfaces.inc:856 etc/inc/interfaces.inc:874
+#: etc/inc/interfaces.inc:873 etc/inc/interfaces.inc:922
+msgid "could not bring gifif up -- variable not defined"
+msgstr "O gifif não pôde ser iniciado -- variável não definida"
+
+#: etc/inc/interfaces.inc:919 etc/inc/interfaces.inc:957
+#: etc/inc/interfaces.inc:972 etc/inc/interfaces.inc:945
+#: etc/inc/interfaces.inc:984 etc/inc/interfaces.inc:999
+#: etc/inc/interfaces.inc:944 etc/inc/interfaces.inc:983
+#: etc/inc/interfaces.inc:998 etc/inc/interfaces.inc:1026
+#: etc/inc/interfaces.inc:1047 etc/inc/interfaces.inc:1062
+#, php-format
+msgid "Configuring %s interface..."
+msgstr "Configurando interface %s..."
+
+#: etc/inc/interfaces.inc:921 etc/inc/interfaces.inc:959
+#: etc/inc/interfaces.inc:974 etc/inc/interfaces.inc:948
+#: etc/inc/interfaces.inc:986 etc/inc/interfaces.inc:1001
+#: etc/inc/interfaces.inc:947 etc/inc/interfaces.inc:985
+#: etc/inc/interfaces.inc:1000 etc/inc/interfaces.inc:1002
+#: etc/inc/interfaces.inc:1028 etc/inc/interfaces.inc:1049
+#: etc/inc/interfaces.inc:1064
+#, php-format
+msgid "Configuring %s"
+msgstr "Configurando %s"
+
+#: etc/inc/interfaces.inc:1299 etc/inc/interfaces.inc:1339
+#: etc/inc/interfaces.inc:1338 etc/inc/interfaces.inc:1407
+#: etc/inc/interfaces.inc:1412
+#, php-format
+msgid "Can't find PPP config for %s in interface_ppps_configure()."
+msgstr "O PPP config não pôde ser encontrado para %s em interface_ppps_configure()."
+
+#: etc/inc/interfaces.inc:1362 etc/inc/interfaces.inc:1402
+#: etc/inc/interfaces.inc:1401 etc/inc/interfaces.inc:1464
+#: etc/inc/interfaces.inc:1469
+#, php-format
+msgid "Could not get a PPTP/L2TP Remote IP address from %1$s for %2$s in interfaces_ppps_configure."
+msgstr "Não pôde obter um endereço de IP remoto PPTP/L2TP de %1$s para %2$s em interfaces_ppps_configure."
+
+#: etc/inc/interfaces.inc:1369 etc/inc/interfaces.inc:1409
+#: etc/inc/interfaces.inc:1408 etc/inc/interfaces.inc:1471
+#: etc/inc/interfaces.inc:1476
+#, php-format
+msgid "Device %s does not exist. PPP link cannot start without the modem device."
+msgstr "Dispositivo %s não existe. Link PPP não pode iniciar sem o dispositivo de modem."
+
+#: etc/inc/interfaces.inc:1374 etc/inc/interfaces.inc:1414
+#: etc/inc/interfaces.inc:1413 etc/inc/interfaces.inc:1476
+#: etc/inc/interfaces.inc:1481
+#, php-format
+msgid "Unkown %s configured as ppp interface."
+msgstr "%s desconhecido configurado como uma interface ppp."
+
+#: etc/inc/interfaces.inc:1641 etc/inc/interfaces.inc:1686
+#: etc/inc/interfaces.inc:1685 etc/inc/interfaces.inc:1748
+#: etc/inc/interfaces.inc:1753
+#, php-format
+msgid "Error: cannot open mpd_%s.conf in interface_ppps_configure().%s"
+msgstr "Erro: mpd_%s.conf não pôde ser aberto em interface_ppps_configure().%s"
+
+#: etc/inc/interfaces.inc:1702 etc/inc/interfaces.inc:1771
+#: etc/inc/interfaces.inc:1770 etc/inc/interfaces.inc:1828
+#: etc/inc/interfaces.inc:1833
+msgid "Configuring CARP settings..."
+msgstr "Configurando CARP..."
+
+#: etc/inc/interfaces.inc:1723 etc/inc/interfaces.inc:1788
+#: etc/inc/interfaces.inc:1787
+msgid "Enable CARP ARP-balancing"
+msgstr "Habilitar CARP ARP-balancing"
+
+#: etc/inc/interfaces.inc:1724 etc/inc/interfaces.inc:1789
+#: etc/inc/interfaces.inc:1788
+msgid "Disallow CARP preemption"
+msgstr "Desabilitar preempção do CARP"
+
+#: etc/inc/interfaces.inc:1726 etc/inc/interfaces.inc:1791
+#: etc/inc/interfaces.inc:1790
+msgid "Enable CARP preemption"
+msgstr "Habilitar preempção do CARP"
+
+#: etc/inc/interfaces.inc:1728 etc/inc/interfaces.inc:1793
+#: etc/inc/interfaces.inc:1792
+msgid "Enable CARP logging"
+msgstr "Habilitar log do CARP"
+
+#: etc/inc/interfaces.inc:1744 etc/inc/interfaces.inc:1809
+#: etc/inc/interfaces.inc:1808
+msgid "Could not create rules.boot file!"
+msgstr "Não pôde criar arquivo rules.boot!"
+
+#: etc/inc/interfaces.inc:1750 etc/inc/interfaces.inc:1815
+#: etc/inc/interfaces.inc:1814
+msgid "Bring up pfsync0 syncpeer"
+msgstr "Levantando pfsync0 syncpeer"
+
+#: etc/inc/interfaces.inc:1752 etc/inc/interfaces.inc:1817
+#: etc/inc/interfaces.inc:1816
+msgid "Bring up pfsync0 syncdev"
+msgstr "Levantando pfsync0 syncdev"
+
+#: etc/inc/interfaces.inc:1754 etc/inc/interfaces.inc:1819
+#: etc/inc/interfaces.inc:1818
+msgid "Bring up pfsync0"
+msgstr "Levantando pfsync0"
+
+#: etc/inc/interfaces.inc:1768 etc/inc/interfaces.inc:1833
+#: etc/inc/interfaces.inc:1837
+msgid "Allow CARP."
+msgstr "Permitir CARP."
+
+#: etc/inc/interfaces.inc:1770 etc/inc/interfaces.inc:1835
+#: etc/inc/interfaces.inc:1839
+msgid "Disallow CARP."
+msgstr "Desabilitar CARP."
+
+#: etc/inc/interfaces.inc:1963 etc/inc/interfaces.inc:2038
+#: etc/inc/interfaces.inc:2020 etc/inc/interfaces.inc:2099
+#: etc/inc/interfaces.inc:2016 etc/inc/interfaces.inc:2056
+#: etc/inc/interfaces.inc:2061 etc/inc/interfaces.inc:2076
+#, php-format
+msgid "Interface specified for the virtual IP address %s does not exist. Skipping this VIP."
+msgstr "Interface especificada para o endereço de IP virtual %s não existe. Pulando esse IP virtual."
+
+#: etc/inc/interfaces.inc:1972 etc/inc/interfaces.inc:2029
+#: etc/inc/interfaces.inc:2025 etc/inc/interfaces.inc:2065
+#: etc/inc/interfaces.inc:2070 etc/inc/interfaces.inc:2085
+#, php-format
+msgid "Sorry but we could not find a matching real interface subnet for the virtual IP address %s."
+msgstr "Desculpe, mas não pudemos encontrar uma subrede em uma interface real correspondente ao endereço de IP virtual %s."
+
+#: etc/inc/interfaces.inc:1981 etc/inc/interfaces.inc:2038
+#: etc/inc/interfaces.inc:2034 etc/inc/interfaces.inc:2074
+#: etc/inc/interfaces.inc:2079 etc/inc/interfaces.inc:2094
+#, php-format
+msgid "Sorry but we could not find a matching real interface subnet for the virtual IPv6 address %s."
+msgstr "Lamento, mas não foi possível encontrar uma subrede em uma interface real correspondente ao endereço de IPv6 virtual %s."
+
+#: etc/inc/interfaces.inc:2084
+#, php-format
+msgid "Error: cannot open dhclient_%s.conf in interfaces_carpdev_configure() for writing.%s"
+msgstr "Erro: dhclient_%s.conf não pôde ser aberto em interfaces_carpdev_configure() para escrita.%s"
+
+#: etc/inc/interfaces.inc:2117 etc/inc/interfaces.inc:2185
+#: etc/inc/interfaces.inc:2104 etc/inc/interfaces.inc:2144
+#: etc/inc/interfaces.inc:2149 etc/inc/interfaces.inc:2164
+#, php-format
+msgid "Interface %s changed to hostap mode"
+msgstr "Interface %s modificada para modo hostap"
+
+#: etc/inc/interfaces.inc:2121 etc/inc/interfaces.inc:2189
+#: etc/inc/interfaces.inc:2108 etc/inc/interfaces.inc:2148
+#: etc/inc/interfaces.inc:2153 etc/inc/interfaces.inc:2168
+#, php-format
+msgid "Interface %s changed to adhoc mode"
+msgstr "Interface %s modificada para modo adhoc"
+
+#: etc/inc/interfaces.inc:2125 etc/inc/interfaces.inc:2193
+#: etc/inc/interfaces.inc:2112 etc/inc/interfaces.inc:2152
+#: etc/inc/interfaces.inc:2157 etc/inc/interfaces.inc:2172
+#, php-format
+msgid "Interface %s changed to infrastructure mode"
+msgstr "Interface %s modificada para modo de infraestrutura"
+
+#: etc/inc/interfaces.inc:2137 etc/inc/interfaces.inc:2205
+#: etc/inc/interfaces.inc:2124 etc/inc/interfaces.inc:2164
+#: etc/inc/interfaces.inc:2169 etc/inc/interfaces.inc:2184
+#, php-format
+msgid "Cloning new wireless interface %s"
+msgstr "Clonando nova interface sem fio %s"
+
+#: etc/inc/interfaces.inc:2142 etc/inc/interfaces.inc:2210
+#: etc/inc/interfaces.inc:2129 etc/inc/interfaces.inc:2169
+#: etc/inc/interfaces.inc:2174 etc/inc/interfaces.inc:2189
+#, php-format
+msgid "Failed to clone interface %1$s with error code %2$s, output %3$s"
+msgstr "Falha ao clonar interface %1$s com código de erro %2$s, saída %3$s"
+
+#: etc/inc/interfaces.inc:2715 etc/inc/interfaces.inc:2790
+#: etc/inc/interfaces.inc:2709 etc/inc/interfaces.inc:2761
+#: etc/inc/interfaces.inc:2784 etc/inc/interfaces.inc:2799
+msgid "Generating new MAC address."
+msgstr "Gerando novo endereço MAC."
+
+#: etc/inc/interfaces.inc:2721 etc/inc/interfaces.inc:2796
+#: etc/inc/interfaces.inc:2715 etc/inc/interfaces.inc:2767
+#: etc/inc/interfaces.inc:2790 etc/inc/interfaces.inc:2805
+#, php-format
+msgid "The INVALID MAC address (ff:ff:ff:ff:ff:ff) on interface %1$s has been automatically replaced with %2$s"
+msgstr "O endereço MAC INVÁLIDO (ff:ff:ff:ff:ff:ff) na interface %1$s foi automaticamente substituído por %2$s"
+
+#: etc/inc/interfaces.inc:2910
+msgid "Could not bring wanif up in terface_carpdev_dhcp_configure()"
+msgstr "wanif não pôde ser iniciado em terface_carpdev_dhcp_configure()"
+
+#: etc/inc/interfaces.inc:3016
+#, php-format
+msgid "Error: cannot open dhclient_%s.conf in interfaces_wan_dhcp_configure() for writing.%s"
+msgstr "Erro: dhclient_%s.conf não pôde ser aberto em interfaces_wan_dhcp_configure() para escrita.%s"
+
+#: etc/inc/interfaces.inc:3029 etc/inc/interfaces.inc:3513
+#: etc/inc/interfaces.inc:3373 etc/inc/interfaces.inc:3466
+#: etc/inc/interfaces.inc:3593 etc/inc/interfaces.inc:3538
+#: etc/inc/interfaces.inc:3560
+#, php-format
+msgid "Invalid interface \"%s\" in interface_dhcp_configure()"
+msgstr "Interface inválida \"%s\" em interface_dhcp_configure()"
+
+#: etc/inc/interfaces.inc:3064 etc/inc/interfaces.inc:3548
+#: etc/inc/interfaces.inc:3408 etc/inc/interfaces.inc:3501
+#: etc/inc/interfaces.inc:3628 etc/inc/interfaces.inc:3573
+#: etc/inc/interfaces.inc:3605
+#, php-format
+msgid "Could not bring up %s interface in interface_dhcp_configure()"
+msgstr "A interface %s não pôde ser iniciada em interface_dhcp_configure()"
+
+#: etc/inc/notices.inc:76
+#, php-format
+msgid "Could not open %s for writing"
+msgstr "%s não pôde ser aberto para escrita"
+
+#: etc/inc/notices.inc:327 etc/inc/notices.inc:336
+#, php-format
+msgid "Message sent to %s OK"
+msgstr "Mensagem enviada para %s OK"
+
+#: etc/inc/notices.inc:330 etc/inc/notices.inc:331 etc/inc/notices.inc:339
+#: etc/inc/notices.inc:340
+#, php-format
+msgid "Could not send the message to %1$s -- Error: %2$s"
+msgstr "A mensagem não pôde ser enviada para %1$s -- Erro: %2$s"
+
+#: etc/inc/openvpn.inc:83 etc/inc/openvpn.inc:90 etc/inc/openvpn.inc:81
+#: etc/inc/openvpn.inc:88
+msgid "Peer to Peer ( SSL/TLS )"
+msgstr "Ponto a Ponto ( SSL/TLS )"
+
+#: etc/inc/openvpn.inc:84 etc/inc/openvpn.inc:91 etc/inc/openvpn.inc:82
+#: etc/inc/openvpn.inc:89
+msgid "Peer to Peer ( Shared Key )"
+msgstr "Ponto a Ponto ( Chave compartilhada )"
+
+#: etc/inc/openvpn.inc:85 etc/inc/openvpn.inc:83
+msgid "Remote Access ( SSL/TLS )"
+msgstr "Acesso Remoto ( SSL/TLS )"
+
+#: etc/inc/openvpn.inc:86 etc/inc/openvpn.inc:84
+msgid "Remote Access ( User Auth )"
+msgstr "Acesso Remoto ( Autenticação de Usuário)"
+
+#: etc/inc/openvpn.inc:87 etc/inc/openvpn.inc:85
+msgid "Remote Access ( SSL/TLS + User Auth )"
+msgstr "Acesso Remoto ( SSL/TLS + Autenticação de Usuário )"
+
+#: etc/inc/openvpn.inc:179 etc/inc/openvpn.inc:177 etc/inc/openvpn.inc:195
+msgid "None (No Encryption)"
+msgstr "Nenhum (Sem criptografia)"
+
+#: etc/inc/openvpn.inc:203 etc/inc/openvpn.inc:201 etc/inc/openvpn.inc:238
+#, php-format
+msgid "The field '%s' must contain a valid IP address or domain name."
+msgstr "O campo '%s' deve conter um endereço de IP ou nome de domínio válido."
+
+#: etc/inc/openvpn.inc:210 etc/inc/openvpn.inc:208 etc/inc/openvpn.inc:245
+#, php-format
+msgid "The field '%s' must contain a valid port, ranging from 0 to 65535."
+msgstr "O campo '%s' deve conter uma porta válida, variando entre 0 e 65535."
+
+#: etc/inc/openvpn.inc:219 etc/inc/openvpn.inc:217
+#, php-format
+msgid "The field '%s' must contain a valid CIDR range."
+msgstr "O campo '%s' deve conter um intervalo CIDR válido."
+
+#: etc/inc/pfsense-utils.inc:345 etc/inc/pfsense-utils.inc:330
+msgid "MASTER"
+msgstr "MASTER"
+
+#: etc/inc/pfsense-utils.inc:347 etc/inc/pfsense-utils.inc:332
+msgid "BACKUP"
+msgstr "BACKUP"
+
+#: etc/inc/pfsense-utils.inc:349 etc/inc/pfsense-utils.inc:334
+msgid "INIT"
+msgstr "INIT"
+
+#: etc/inc/pfsense-utils.inc:417 etc/inc/pfsense-utils.inc:402
+msgid "After synch increase advertising skew"
+msgstr "Após sincronização, aumentar o advertising skew"
+
+#: etc/inc/pfsense-utils.inc:462 etc/inc/pfsense-utils.inc:447
+msgid "Error creating socket!"
+msgstr "Erro criando socket!"
+
+#: etc/inc/pfsense-utils.inc:463 etc/inc/pfsense-utils.inc:448
+#, php-format
+msgid "Error code is '%1$s' - %2$s"
+msgstr "Código do erro é '%1$s' - %2$s"
+
+#: etc/inc/pfsense-utils.inc:468 etc/inc/pfsense-utils.inc:453
+#, php-format
+msgid "setsockopt() failed, error: %s"
+msgstr "setsockopt() falhou, erro: %s"
+
+#: etc/inc/pfsense-utils.inc:471 etc/inc/pfsense-utils.inc:456
+#, php-format
+msgid "Magic Packet sent (%1$s) to {%2$s} MAC=%3$s"
+msgstr "Pacote Mágico enviado (%1$s) para {%2$s} MAC=%3$s"
+
+#: etc/inc/pfsense-utils.inc:518 etc/inc/pfsense-utils.inc:540
+#: etc/inc/pfsense-utils.inc:533 etc/inc/pfsense-utils.inc:555
+#, php-format
+msgid "Restored %s of config file (maybe from CARP partner)"
+msgstr "Restaurado %s do arquivo de configuração (talvez do parceiro do CARP)"
+
+#: etc/inc/pfsense-utils.inc:699 etc/inc/pfsense-utils.inc:714
+#, php-format
+msgid "XMLRPC communication error: %s"
+msgstr "Erro de comunicação XMLRPC: %s"
+
+#: etc/inc/pfsense-utils.inc:702 etc/inc/pfsense-utils.inc:717
+#, php-format
+msgid "XMLRPC request failed with error %1$s: %2$s"
+msgstr "Requisição XMLRPC falhou com o erro %1$s: %2$s"
+
+#: etc/inc/pfsense-utils.inc:795 etc/inc/pfsense-utils.inc:810
+msgid "reload_interfaces_sync() is starting."
+msgstr "reload_interfaces_sync() está iniciando."
+
+#: etc/inc/pfsense-utils.inc:803 etc/inc/pfsense-utils.inc:818
+msgid "Enabling system routing"
+msgstr "Habilitando roteamento do sistema"
+
+#: etc/inc/pfsense-utils.inc:806 etc/inc/pfsense-utils.inc:821
+msgid "Cleaning up Interfaces"
+msgstr "Limpando Interfaces"
+
+#: etc/inc/pfsense-utils.inc:912 etc/inc/pfsense-utils.inc:927
+#: etc/inc/pfsense-utils.inc:936
+msgid "Enabling auto login was not possible."
+msgstr "Não foi possível habilitar o auto login."
+
+#: etc/inc/pfsense-utils.inc:1100 etc/inc/pfsense-utils.inc:1137
+#: etc/inc/pfsense-utils.inc:1191 etc/inc/pfsense-utils.inc:1196
+msgid "No history data found!"
+msgstr "Nenhum dado de histórico encontrado!"
+
+#: etc/inc/pfsense-utils.inc:1222 etc/inc/pfsense-utils.inc:1260
+#: etc/inc/pfsense-utils.inc:1313 etc/inc/pfsense-utils.inc:1318
+msgid "device not present! Is the modem attached to the system?"
+msgstr "o dispositivo não está presente! O modem está acoplado ao sistema?"
+
+#: etc/inc/pfsense-utils.inc:1262 etc/inc/pfsense-utils.inc:1327
+#: etc/inc/pfsense-utils.inc:1380 etc/inc/pfsense-utils.inc:1385
+msgid "running"
+msgstr "executando"
+
+#: etc/inc/pfsense-utils.inc:1263 usr/local/www/graph.php:201
+#: etc/inc/pfsense-utils.inc:1328 etc/inc/pfsense-utils.inc:1381
+#: etc/inc/pfsense-utils.inc:1386
+msgid "up"
+msgstr "para cima"
+
+#: etc/inc/pfsense-utils.inc:1300 etc/inc/pfsense-utils.inc:1371
+#: etc/inc/pfsense-utils.inc:1424 etc/inc/pfsense-utils.inc:1429
+msgid "blocking"
+msgstr "bloqueando"
+
+#: etc/inc/pfsense-utils.inc:1300 etc/inc/pfsense-utils.inc:1371
+#: etc/inc/pfsense-utils.inc:1424 etc/inc/pfsense-utils.inc:1429
+msgid "check for ethernet loops"
+msgstr "verificar loops ethernet"
+
+#: etc/inc/pfsense-utils.inc:1303 etc/inc/pfsense-utils.inc:1374
+#: etc/inc/pfsense-utils.inc:1427 etc/inc/pfsense-utils.inc:1432
+msgid "learning"
+msgstr "aprendendo"
+
+#: etc/inc/pfsense-utils.inc:1306 etc/inc/pfsense-utils.inc:1377
+#: etc/inc/pfsense-utils.inc:1430 etc/inc/pfsense-utils.inc:1435
+msgid "forwarding"
+msgstr "encaminhando"
+
+#: etc/inc/pfsense-utils.inc:1417 etc/inc/pfsense-utils.inc:1493
+#: etc/inc/pfsense-utils.inc:1546 etc/inc/pfsense-utils.inc:1551
+#, php-format
+msgid "DNSCACHE: Found old IP %1$s and new IP %2$s"
+msgstr "DNSCACHE: Encontrado IP antigo %1$s e novo IP %2$s"
+
+#: etc/inc/pkg-utils.inc:211 etc/inc/pkg-utils.inc:226
+#: etc/inc/pkg-utils.inc:244
+msgid "Resyncing configuration for all packages."
+msgstr "Ressincronizando configurações para todos os pacotes."
+
+#: etc/inc/pkg-utils.inc:231 etc/inc/pkg-utils.inc:246
+#: etc/inc/pkg-utils.inc:264
+msgid "Syncing packages:"
+msgstr "Sincronizando pacotes:"
+
+#: etc/inc/pkg-utils.inc:273 etc/inc/pkg-utils.inc:288
+#: etc/inc/pkg-utils.inc:306
+#, php-format
+msgid "The %1$s package is missing required dependencies and must be reinstalled. %2$s"
+msgstr "O pacote %1$s possui dependências necessárias faltando e precisa ser reinstalado. %2$s"
+
+#: etc/inc/pkg-utils.inc:297 etc/inc/pkg-utils.inc:437
+#: etc/inc/pkg-utils.inc:312 etc/inc/pkg-utils.inc:462
+#: etc/inc/pkg-utils.inc:464 etc/inc/pkg-utils.inc:330
+#: etc/inc/pkg-utils.inc:481
+#, php-format
+msgid "The %s package is missing required dependencies and must be reinstalled."
+msgstr "As dependências requeridas pelo pacote %s estão faltando e o pacote deve ser reinstalado."
+
+#: etc/inc/pkg-utils.inc:404 etc/inc/pkg-utils.inc:429
+#: etc/inc/pkg-utils.inc:431 etc/inc/pkg-utils.inc:448
+#, php-format
+msgid "The %s package is missing its configuration file and must be reinstalled."
+msgstr "O arquivo de configuração do pacote %s não foi encontrado e o pacote deve ser reinstalado."
+
+#: etc/inc/pkg-utils.inc:563 usr/local/www/pkg_mgr_install.php:101
+#: etc/inc/pkg-utils.inc:589 etc/inc/pkg-utils.inc:590
+#: usr/local/www/pkg_mgr_install.php:99 etc/inc/pkg-utils.inc:625
+#: usr/local/www/pkg_mgr_install.php:97
+msgid "Beginning package installation."
+msgstr "Iniciando instalação de pacote."
+
+#: etc/inc/pkg-utils.inc:564 etc/inc/pkg-utils.inc:565
+#: etc/inc/pkg-utils.inc:590 etc/inc/pkg-utils.inc:591
+#: etc/inc/pkg-utils.inc:592 etc/inc/pkg-utils.inc:626
+#: etc/inc/pkg-utils.inc:627
+#, php-format
+msgid "Beginning package installation for %s ."
+msgstr "Iniciando instalação do pacote para %s ."
+
+#: etc/inc/pkg-utils.inc:569 etc/inc/pkg-utils.inc:595
+#: etc/inc/pkg-utils.inc:596 etc/inc/pkg-utils.inc:631
+msgid "Downloading package configuration file... "
+msgstr "Download de arquivo de configuração de pacote..."
+
+#: etc/inc/pkg-utils.inc:571 etc/inc/pkg-utils.inc:597
+#: etc/inc/pkg-utils.inc:598 etc/inc/pkg-utils.inc:633
+msgid "Downloading package configuration file..."
+msgstr "Download do arquivo de configuração de pacote..."
+
+#: etc/inc/pkg-utils.inc:575 etc/inc/pkg-utils.inc:601
+#: etc/inc/pkg-utils.inc:602 etc/inc/pkg-utils.inc:637
+msgid "ERROR! Unable to fetch package configuration file. Aborting installation."
+msgstr "ERRO! Não foi possível buscar o arquivo de configuração de pacote. Abortando instalação."
+
+#: etc/inc/pkg-utils.inc:577 etc/inc/pkg-utils.inc:603
+#: etc/inc/pkg-utils.inc:604 etc/inc/pkg-utils.inc:639
+msgid "ERROR! Unable to fetch package configuration file. Aborting package installation."
+msgstr "ERRO! Não foi possível buscar o arquivo de configuração de pacote. Abortando instalação de pacote."
+
+#: etc/inc/pkg-utils.inc:579 etc/inc/pkg-utils.inc:605
+#: etc/inc/pkg-utils.inc:606 etc/inc/pkg-utils.inc:641
+msgid ""
+"failed!\n"
+"\n"
+"Installation aborted.\n"
+msgstr ""
+"falhou!\n"
+"\n"
+"Instalação abortada.\n"
+
+#: etc/inc/pkg-utils.inc:591 etc/inc/pkg-utils.inc:617
+#: etc/inc/pkg-utils.inc:618 etc/inc/pkg-utils.inc:653
+msgid "Saving updated package information..."
+msgstr "Salvando informações atualizadas do pacote..."
+
+#: etc/inc/pkg-utils.inc:595 etc/inc/pkg-utils.inc:621
+#: etc/inc/pkg-utils.inc:622 etc/inc/pkg-utils.inc:657
+#, php-format
+msgid "Installed %s package."
+msgstr "Pacote %s instalado."
+
+#: etc/inc/pkg-utils.inc:599 etc/inc/pkg-utils.inc:625
+#: etc/inc/pkg-utils.inc:626 etc/inc/pkg-utils.inc:661
+#, php-format
+msgid "Overwrote previous installation of %s."
+msgstr "Sobrescreveu instalação anterior de %s."
+
+#: etc/inc/pkg-utils.inc:600 etc/inc/pkg-utils.inc:626
+#: etc/inc/pkg-utils.inc:627 etc/inc/pkg-utils.inc:662
+msgid "overwrite!"
+msgstr "sobrescreva!"
+
+#: etc/inc/pkg-utils.inc:612 etc/inc/pkg-utils.inc:638
+#: etc/inc/pkg-utils.inc:639 etc/inc/pkg-utils.inc:674
+msgid "Failed to install package."
+msgstr "Falha ao instalar pacote."
+
+#: etc/inc/pkg-utils.inc:616 etc/inc/pkg-utils.inc:642
+#: etc/inc/pkg-utils.inc:643 etc/inc/pkg-utils.inc:678
+msgid "Writing configuration... "
+msgstr "Escrevendo a configuração..."
+
+#: etc/inc/pkg-utils.inc:652 etc/inc/pkg-utils.inc:678
+#: etc/inc/pkg-utils.inc:679 etc/inc/pkg-utils.inc:714
+#, php-format
+msgid "The %s package is not installed.%sInstallation aborted."
+msgstr "O pacote %s não está instalado.%sInstalação abortada."
+
+#: etc/inc/pkg-utils.inc:667 etc/inc/pkg-utils.inc:693
+#: etc/inc/pkg-utils.inc:694 etc/inc/pkg-utils.inc:729
+msgid "Installing"
+msgstr "Instalando"
+
+#: etc/inc/pkg-utils.inc:667 etc/inc/pkg-utils.inc:693
+#: etc/inc/pkg-utils.inc:694 etc/inc/pkg-utils.inc:729
+msgid "and its dependencies."
+msgstr "e suas dependências."
+
+#: etc/inc/pkg-utils.inc:668 etc/inc/pkg-utils.inc:694
+#: etc/inc/pkg-utils.inc:695 etc/inc/pkg-utils.inc:730
+msgid "Downloading"
+msgstr "Fazendo download"
+
+#: etc/inc/pkg-utils.inc:668 etc/inc/pkg-utils.inc:694
+#: etc/inc/pkg-utils.inc:695 etc/inc/pkg-utils.inc:730
+msgid "and its dependencies... "
+msgstr "e suas dependências..."
+
+#: etc/inc/pkg-utils.inc:680 etc/inc/pkg-utils.inc:706
+#: etc/inc/pkg-utils.inc:707 etc/inc/pkg-utils.inc:742
+msgid "Package WAS NOT installed properly."
+msgstr "O pacote NÃO FOI instalado apropriadamente."
+
+#: etc/inc/pkg-utils.inc:693 etc/inc/pkg-utils.inc:719
+#: etc/inc/pkg-utils.inc:720 etc/inc/pkg-utils.inc:755
+msgid "Loading package configuration... "
+msgstr "Carregando configuração de pacote... "
+
+#: etc/inc/pkg-utils.inc:698 etc/inc/pkg-utils.inc:724
+#: etc/inc/pkg-utils.inc:725 etc/inc/pkg-utils.inc:760
+msgid "Configuring package components...\n"
+msgstr "Configurando componentes do pacote...\n"
+
+#: etc/inc/pkg-utils.inc:704 etc/inc/pkg-utils.inc:1049
+#: etc/inc/pkg-utils.inc:730 etc/inc/pkg-utils.inc:1086
+#: etc/inc/pkg-utils.inc:731 etc/inc/pkg-utils.inc:1087
+#: etc/inc/pkg-utils.inc:766 etc/inc/pkg-utils.inc:1122
+msgid "System files... "
+msgstr "Sistema de arquivos..."
+
+#: etc/inc/pkg-utils.inc:716 etc/inc/pkg-utils.inc:742
+#: etc/inc/pkg-utils.inc:743 etc/inc/pkg-utils.inc:778
+msgid "Additional files... "
+msgstr "Arquivos adicionais..."
+
+#: etc/inc/pkg-utils.inc:742 etc/inc/pkg-utils.inc:768
+#: etc/inc/pkg-utils.inc:769 etc/inc/pkg-utils.inc:804
+msgid "Extracting tarball to -C for "
+msgstr "Extraindo tarball para -C para"
+
+#: etc/inc/pkg-utils.inc:748 etc/inc/pkg-utils.inc:774
+#: etc/inc/pkg-utils.inc:775 etc/inc/pkg-utils.inc:810
+#, php-format
+msgid "Changing file mode to %1$s for %2$s%3$s%4$s"
+msgstr "Alterando modo de arquivo de %1$s para %2$s%3$s%4$s"
+
+#: etc/inc/pkg-utils.inc:764 etc/inc/pkg-utils.inc:1025
+#: etc/inc/pkg-utils.inc:790 etc/inc/pkg-utils.inc:1062
+#: etc/inc/pkg-utils.inc:791 etc/inc/pkg-utils.inc:1063
+#: etc/inc/pkg-utils.inc:826 etc/inc/pkg-utils.inc:1098
+msgid "Loading package instructions..."
+msgstr "Carregando instruções de pacote..."
+
+#: etc/inc/pkg-utils.inc:779 etc/inc/pkg-utils.inc:805
+#: etc/inc/pkg-utils.inc:806 etc/inc/pkg-utils.inc:841
+msgid "Custom commands..."
+msgstr "Comandos personalizados..."
+
+#: etc/inc/pkg-utils.inc:783 etc/inc/pkg-utils.inc:809
+#: etc/inc/pkg-utils.inc:810 etc/inc/pkg-utils.inc:845
+msgid "Executing custom_php_global_functions()..."
+msgstr "Executando custom_php_global_functions()..."
+
+#: etc/inc/pkg-utils.inc:790 etc/inc/pkg-utils.inc:816
+#: etc/inc/pkg-utils.inc:817 etc/inc/pkg-utils.inc:852
+msgid "Executing custom_php_install_command()..."
+msgstr "Executando custom_php_install_command()..."
+
+#: etc/inc/pkg-utils.inc:809 etc/inc/pkg-utils.inc:845
+#: etc/inc/pkg-utils.inc:846 etc/inc/pkg-utils.inc:881
+msgid "Executing custom_php_resync_config_command()..."
+msgstr "Executando custom_php_resync_config_command()..."
+
+#: etc/inc/pkg-utils.inc:818 etc/inc/pkg-utils.inc:972
+#: etc/inc/pkg-utils.inc:854 etc/inc/pkg-utils.inc:1009
+#: etc/inc/pkg-utils.inc:855 etc/inc/pkg-utils.inc:1010
+#: etc/inc/pkg-utils.inc:890 etc/inc/pkg-utils.inc:1045
+msgid "Menu items... "
+msgstr "Items de menu..."
+
+#: etc/inc/pkg-utils.inc:834 etc/inc/pkg-utils.inc:870
+#: etc/inc/pkg-utils.inc:871 etc/inc/pkg-utils.inc:906
+msgid "Integrated Tab items... "
+msgstr "Itens de abas integrados..."
+
+#: etc/inc/pkg-utils.inc:850 etc/inc/pkg-utils.inc:989
+#: etc/inc/pkg-utils.inc:886 etc/inc/pkg-utils.inc:1026
+#: etc/inc/pkg-utils.inc:887 etc/inc/pkg-utils.inc:1027
+#: etc/inc/pkg-utils.inc:922 etc/inc/pkg-utils.inc:1062
+msgid "Services... "
+msgstr "Serviços... "
+
+#: etc/inc/pkg-utils.inc:865 etc/inc/pkg-utils.inc:901
+#: etc/inc/pkg-utils.inc:902 etc/inc/pkg-utils.inc:937
+msgid "Loading package configuration... failed!"
+msgstr "Carregando configuração de pacote... falhou!"
+
+#: etc/inc/pkg-utils.inc:865 etc/inc/pkg-utils.inc:901
+#: etc/inc/pkg-utils.inc:902 etc/inc/pkg-utils.inc:937
+msgid "Installation aborted."
+msgstr "Instalação abortada."
+
+#: etc/inc/pkg-utils.inc:867 etc/inc/pkg-utils.inc:903
+#: etc/inc/pkg-utils.inc:904 etc/inc/pkg-utils.inc:939
+msgid "Unable to load package configuration. Installation aborted."
+msgstr "Não foi possível carregar a configuração do pacote. Instalação abortada."
+
+#: etc/inc/pkg-utils.inc:911 etc/inc/pkg-utils.inc:948
+#: etc/inc/pkg-utils.inc:949 etc/inc/pkg-utils.inc:984
+#, php-format
+msgid "Starting package deletion for %s..."
+msgstr "Iniciando remoção do pacote para %s..."
+
+#: etc/inc/pkg-utils.inc:931 etc/inc/pkg-utils.inc:968
+#: etc/inc/pkg-utils.inc:969 etc/inc/pkg-utils.inc:1004
+#, php-format
+msgid "The %s package is not installed.%sDeletion aborted."
+msgstr "O pacote %s não está instalado.%sRemoção abortada."
+
+#: etc/inc/pkg-utils.inc:942 etc/inc/pkg-utils.inc:979
+#: etc/inc/pkg-utils.inc:980 etc/inc/pkg-utils.inc:1015
+#, php-format
+msgid "Removing %s package... "
+msgstr "Removendo pacote %s..."
+
+#: etc/inc/pkg-utils.inc:943 etc/inc/pkg-utils.inc:980
+#: etc/inc/pkg-utils.inc:981 etc/inc/pkg-utils.inc:1016
+#, php-format
+msgid "Removing %s components..."
+msgstr "Removendo componentes %s..."
+
+#: etc/inc/pkg-utils.inc:955 etc/inc/pkg-utils.inc:992
+#: etc/inc/pkg-utils.inc:993 etc/inc/pkg-utils.inc:1028
+msgid "Tabs items... "
+msgstr "Itens de abas..."
+
+#: etc/inc/pkg-utils.inc:1059 etc/inc/pkg-utils.inc:1096
+#: etc/inc/pkg-utils.inc:1097 etc/inc/pkg-utils.inc:1132
+msgid "Deinstall commands... "
+msgstr "Desinstalar comandos..."
+
+#: etc/inc/pkg-utils.inc:1069 etc/inc/pkg-utils.inc:1106
+#: etc/inc/pkg-utils.inc:1107 etc/inc/pkg-utils.inc:1142
+msgid "Removing package instructions..."
+msgstr "Removendo instruções de pacote..."
+
+#: etc/inc/pkg-utils.inc:1071 etc/inc/pkg-utils.inc:1108
+#: etc/inc/pkg-utils.inc:1109 etc/inc/pkg-utils.inc:1144
+#, php-format
+msgid "Remove '%s'"
+msgstr "Remover '%s'"
+
+#: etc/inc/pkg-utils.inc:1078 etc/inc/pkg-utils.inc:1115
+#: etc/inc/pkg-utils.inc:1116 etc/inc/pkg-utils.inc:1151
+msgid "Auxiliary files... "
+msgstr "Arquivos auxiliares..."
+
+#: etc/inc/pkg-utils.inc:1092 etc/inc/pkg-utils.inc:1129
+#: etc/inc/pkg-utils.inc:1130 etc/inc/pkg-utils.inc:1165
+msgid "Package XML... "
+msgstr "Empacotar XML..."
+
+#: etc/inc/pkg-utils.inc:1111 etc/inc/pkg-utils.inc:1148
+#: etc/inc/pkg-utils.inc:1149 etc/inc/pkg-utils.inc:1184
+msgid "Configuration... "
+msgstr "Configuração..."
+
+#: etc/inc/pkg-utils.inc:1205 etc/inc/pkg-utils.inc:1242
+#: etc/inc/pkg-utils.inc:1243 etc/inc/pkg-utils.inc:1274
+#: etc/inc/pkg-utils.inc:1275
+#, php-format
+msgid " >>> Unable to communicate with %1$s. Please verify DNS and interface configuration, and that %2$s has functional Internet connectivity."
+msgstr ">>> Incapaz de comunicar-se com %1$s. Por favor, verifique o DNS a configuração de interface, e se %2$s tem conectividade com a Internet funcional."
+
+#: etc/inc/radius.inc:404 etc/inc/radius.inc:406
+msgid "Error sending request:"
+msgstr "Erro enviando a requisição:"
+
+#: etc/inc/radius.inc:410 etc/inc/radius.inc:412
+msgid "RADIUS_ACCESS_ACCEPT is unexpected for accounting"
+msgstr "RADIUS_ACCESS_ACCEPT é esperado para accounting"
+
+#: etc/inc/radius.inc:419 etc/inc/radius.inc:421
+msgid "RADIUS_ACCOUNTING_RESPONSE is unexpected for authentication"
+msgstr "RADIUS_ACCOUNTING_RESPONSE é esperado para a autenticação"
+
+#: etc/inc/radius.inc:424 etc/inc/radius.inc:426
+#, php-format
+msgid "Unexpected return value: %s"
+msgstr "Valor de retorno inesperado: %s"
+
+#: etc/inc/services.inc:262 etc/inc/services.inc:333 etc/inc/services.inc:360
+#: etc/inc/services.inc:369 etc/inc/services.inc:371 etc/inc/services.inc:373
+#: etc/inc/services.inc:366
+#, php-format
+msgid "DHCP leases restore failed exited with %1$s, the error is: %2$s%3$s"
+msgstr "Restauração de concessões DHCP falhou ao sair com %1$s, o erro é: %2$s%3$s"
+
+#: etc/inc/services.inc:275 etc/inc/services.inc:346 etc/inc/services.inc:373
+#: etc/inc/services.inc:382 etc/inc/services.inc:387 etc/inc/services.inc:389
+msgid "Starting DHCP service..."
+msgstr "Iniciando serviço DHCP..."
+
+#: etc/inc/services.inc:282 etc/inc/services.inc:353 etc/inc/services.inc:380
+#: etc/inc/services.inc:820 etc/inc/services.inc:825 etc/inc/services.inc:877
+#: etc/inc/services.inc:874
+#, php-format
+msgid "Error: cannot open dhcpd.conf in services_dhcpdv4_configure().%s"
+msgstr "Erro: não foi possível abrir dhcp.conf em services_dhcpdv4_configure().%s"
+
+#: etc/inc/services.inc:353 etc/inc/services.inc:434 etc/inc/services.inc:461
+#: etc/inc/services.inc:463 etc/inc/services.inc:468 etc/inc/services.inc:469
+msgid "Warning! DHCP Failover setup and no CARP virtual IP's defined!"
+msgstr "Atenção! Instalação de DHCP falhou e nenhum IP virtual do CARP definido!"
+
+#: etc/inc/services.inc:949 etc/inc/services.inc:1078
+#: etc/inc/services.inc:1210 etc/inc/services.inc:1203
+#: etc/inc/services.inc:1209 etc/inc/services.inc:1261
+#: etc/inc/services.inc:1259
+msgid "Could not write Igmpproxy configuration file!"
+msgstr "O arquivo de configuração do Igmpproxy não pôde ser escrito!"
+
+#: etc/inc/services.inc:956
+msgid "Started Igmpproxy service sucsesfully."
+msgstr "Serviço Igmpproxy iniciado com sucesso."
+
+#: etc/inc/services.inc:980 etc/inc/services.inc:1109
+#: etc/inc/services.inc:1241 etc/inc/services.inc:1235
+#: etc/inc/services.inc:1242 etc/inc/services.inc:1294
+#: etc/inc/services.inc:1292
+msgid "Starting DHCP relay service..."
+msgstr "Iniciando serviço de retransmição DHCP..."
+
+#: etc/inc/services.inc:1096 etc/inc/services.inc:1223
+#: etc/inc/services.inc:1355 etc/inc/services.inc:1350
+#: etc/inc/services.inc:1365 etc/inc/services.inc:1417
+#: etc/inc/services.inc:1415
+msgid "Starting DHCPv6 relay service..."
+msgstr "Iniciando serviço de retransmissão DHCPv6..."
+
+#: etc/inc/services.inc:1222 etc/inc/services.inc:1358
+#: etc/inc/services.inc:1493 etc/inc/services.inc:1489
+#: etc/inc/services.inc:1505 etc/inc/services.inc:1557
+#: etc/inc/services.inc:1555
+msgid "Starting DynDNS clients..."
+msgstr "Iniciando clientes DynDNS..."
+
+#: etc/inc/services.inc:1255 etc/inc/services.inc:1392
+#: etc/inc/services.inc:1531 etc/inc/services.inc:1545
+#: etc/inc/services.inc:1562 etc/inc/services.inc:1622
+#: etc/inc/services.inc:1620
+msgid "Starting DNS forwarder..."
+msgstr "Iniciando encaminhadores DNS..."
+
+#: etc/inc/services.inc:1324 etc/inc/services.inc:1507
+#: etc/inc/services.inc:1646 etc/inc/services.inc:1623
+#: etc/inc/services.inc:1655 etc/inc/services.inc:1686
+#: etc/inc/services.inc:1750 etc/inc/services.inc:1748
+msgid "Starting SNMP daemon... "
+msgstr "Iniciando daemon SNMP... "
+
+#: etc/inc/services.inc:1329 etc/inc/services.inc:1512
+#: etc/inc/services.inc:1651 etc/inc/services.inc:1628
+#: etc/inc/services.inc:1660 etc/inc/services.inc:1691
+#: etc/inc/services.inc:1755 etc/inc/services.inc:1753
+#, php-format
+msgid "Error: cannot open snmpd.conf in services_snmpd_configure().%s"
+msgstr "Erro: snmpd.conf não pôde ser aberto em services_snmpd_configure().%s"
+
+#: etc/inc/services.inc:1875 etc/inc/services.inc:2067
+#: etc/inc/services.inc:1919 etc/inc/services.inc:1908
+#: etc/inc/services.inc:1948 etc/inc/services.inc:1979
+#: etc/inc/services.inc:2043 etc/inc/services.inc:2093
+msgid "pfSense specific crontab entries"
+msgstr "Entradas do crontab específicas do pfSense"
+
+#: etc/inc/services.inc:1876 etc/inc/services.inc:2068
+#: etc/inc/services.inc:1920 etc/inc/services.inc:1909
+#: etc/inc/services.inc:1949 etc/inc/services.inc:1980
+#: etc/inc/services.inc:2044 etc/inc/services.inc:2094
+msgid "Created:"
+msgstr "Criado:"
+
+#: etc/inc/services.inc:1890 etc/inc/services.inc:2082
+#: etc/inc/services.inc:1934 etc/inc/services.inc:1923
+#: etc/inc/services.inc:1963 etc/inc/services.inc:1994
+#: etc/inc/services.inc:2058 etc/inc/services.inc:2108
+msgid "If possible do not add items to this file manually."
+msgstr "Se possível não adicione itens a esse arquivo manualmente."
+
+#: etc/inc/services.inc:1891 etc/inc/services.inc:2083
+#: etc/inc/services.inc:1935 etc/inc/services.inc:1924
+#: etc/inc/services.inc:1964 etc/inc/services.inc:1995
+#: etc/inc/services.inc:2059 etc/inc/services.inc:2109
+msgid "If you do so, this file must be terminated with a blank line (e.g. new line)"
+msgstr "Se você o fizer, o arquivo deve ser finalizado com uma linha em branco (e.g nova linha)"
+
+#: etc/inc/services.inc:1934 etc/inc/services.inc:2126
+#: etc/inc/services.inc:1978 etc/inc/services.inc:1968
+#: etc/inc/services.inc:2008 etc/inc/services.inc:2039
+#: etc/inc/services.inc:2103 etc/inc/services.inc:2153
+msgid "Starting UPnP service... "
+msgstr "Iniciando serviço UPnP..."
+
+#: etc/inc/services.inc:1969 etc/inc/services.inc:2161
+#: etc/inc/services.inc:2013 etc/inc/services.inc:2005
+#: etc/inc/services.inc:2045 etc/inc/services.inc:2076
+#: etc/inc/services.inc:2140 etc/inc/services.inc:2190
+#, php-format
+msgid "Installed cron job for %s"
+msgstr "Instalado serviço cron para %s"
+
+#: etc/inc/services.inc:1972 etc/inc/services.inc:2164
+#: etc/inc/services.inc:2016 etc/inc/services.inc:2008
+#: etc/inc/services.inc:2048 etc/inc/services.inc:2079
+#: etc/inc/services.inc:2143 etc/inc/services.inc:2193
+#, php-format
+msgid "Updated cron job for %s"
+msgstr "Atualizado serviço cron para %s"
+
+#: etc/inc/services.inc:1977 etc/inc/services.inc:2169
+#: etc/inc/services.inc:2021
+#, php-format
+msgid "Remvoed cron job for %s"
+msgstr "Removido serviço cron para %s"
+
+#: etc/inc/shaper.inc:189 etc/inc/shaper.inc:190
+#, php-format
+msgid "The field '%s' contains invalid characters."
+msgstr "O campo '%s' contém caracteres inválidos."
+
+#: etc/inc/shaper.inc:195 etc/inc/shaper.inc:196
+#, php-format
+msgid "The field '%s' is required."
+msgstr "O campo '%s' é requerido."
+
+#: etc/inc/shaper.inc:317 etc/inc/shaper.inc:651 etc/inc/shaper.inc:1544
+#: etc/inc/shaper.inc:1850 etc/inc/shaper.inc:2192 etc/inc/shaper.inc:2327
+#: etc/inc/shaper.inc:2467 etc/inc/shaper.inc:2593 etc/inc/shaper.inc:2787
+#: etc/inc/shaper.inc:3023 usr/local/www/interfaces_ppps_edit.php:750
+#: etc/inc/shaper.inc:318 etc/inc/shaper.inc:652 etc/inc/shaper.inc:1546
+#: etc/inc/shaper.inc:1852 etc/inc/shaper.inc:2194 etc/inc/shaper.inc:2329
+#: etc/inc/shaper.inc:2469 etc/inc/shaper.inc:2595 etc/inc/shaper.inc:2789
+#: etc/inc/shaper.inc:3031 etc/inc/shaper.inc:3161
+#: usr/local/www/interfaces_ppps_edit.php:751
+#: usr/local/www/interfaces_ppps_edit.php:757
+#: usr/local/www/status_queues.php:151 etc/inc/shaper.inc:1547
+#: etc/inc/shaper.inc:1853 etc/inc/shaper.inc:2195 etc/inc/shaper.inc:2330
+#: etc/inc/shaper.inc:2470 etc/inc/shaper.inc:2596 etc/inc/shaper.inc:2790
+#: etc/inc/shaper.inc:3162 etc/inc/shaper.inc:654 etc/inc/shaper.inc:1550
+#: etc/inc/shaper.inc:1858 etc/inc/shaper.inc:2200 etc/inc/shaper.inc:2335
+#: etc/inc/shaper.inc:2475 etc/inc/shaper.inc:2601 etc/inc/shaper.inc:2795
+#: etc/inc/shaper.inc:3169 usr/local/www/interfaces_ppps_edit.php:754
+#: etc/inc/shaper.inc:321 etc/inc/shaper.inc:678 etc/inc/shaper.inc:1601
+#: etc/inc/shaper.inc:1916 etc/inc/shaper.inc:2258 etc/inc/shaper.inc:2398
+#: etc/inc/shaper.inc:2538 etc/inc/shaper.inc:2669 etc/inc/shaper.inc:2863
+#: etc/inc/shaper.inc:3237 etc/inc/shaper.inc:2882 etc/inc/shaper.inc:3293
+#: usr/local/www/status_queues.php:173 etc/inc/shaper.inc:3315
+msgid "Bandwidth"
+msgstr "Largura de banda"
+
+#: etc/inc/shaper.inc:319 etc/inc/shaper.inc:1546 etc/inc/shaper.inc:2194
+#: etc/inc/shaper.inc:2469 etc/inc/shaper.inc:2789 etc/inc/shaper.inc:320
+#: etc/inc/shaper.inc:1548 etc/inc/shaper.inc:2196 etc/inc/shaper.inc:2471
+#: etc/inc/shaper.inc:2791 etc/inc/shaper.inc:1549 etc/inc/shaper.inc:2197
+#: etc/inc/shaper.inc:2472 etc/inc/shaper.inc:2792 etc/inc/shaper.inc:1552
+#: etc/inc/shaper.inc:2202 etc/inc/shaper.inc:2477 etc/inc/shaper.inc:2797
+#: etc/inc/shaper.inc:323 etc/inc/shaper.inc:1603 etc/inc/shaper.inc:2260
+#: etc/inc/shaper.inc:2540 etc/inc/shaper.inc:2865 etc/inc/shaper.inc:2884
+#: etc/inc/shaper.inc:2886
+msgid "Bandwidthtype"
+msgstr "Tipo de largura de banda"
+
+#: etc/inc/shaper.inc:324 etc/inc/shaper.inc:1552 etc/inc/shaper.inc:2199
+#: etc/inc/shaper.inc:2474 etc/inc/shaper.inc:2900 etc/inc/shaper.inc:325
+#: etc/inc/shaper.inc:1554 etc/inc/shaper.inc:2201 etc/inc/shaper.inc:2476
+#: etc/inc/shaper.inc:2904 etc/inc/shaper.inc:1555 etc/inc/shaper.inc:2202
+#: etc/inc/shaper.inc:2477 etc/inc/shaper.inc:1558 etc/inc/shaper.inc:2207
+#: etc/inc/shaper.inc:2482 etc/inc/shaper.inc:328 etc/inc/shaper.inc:1609
+#: etc/inc/shaper.inc:2265 etc/inc/shaper.inc:2545
+msgid "Bandwidth must be an integer."
+msgstr "Largura de banda deve ser um inteiro."
+
+#: etc/inc/shaper.inc:326 etc/inc/shaper.inc:1555 etc/inc/shaper.inc:2203
+#: etc/inc/shaper.inc:2478 etc/inc/shaper.inc:327 etc/inc/shaper.inc:1557
+#: etc/inc/shaper.inc:2205 etc/inc/shaper.inc:2480 etc/inc/shaper.inc:1558
+#: etc/inc/shaper.inc:2206 etc/inc/shaper.inc:2481 etc/inc/shaper.inc:1561
+#: etc/inc/shaper.inc:2211 etc/inc/shaper.inc:2486 etc/inc/shaper.inc:330
+#: etc/inc/shaper.inc:1612 etc/inc/shaper.inc:2269 etc/inc/shaper.inc:2549
+msgid "Bandwidth cannot be negative."
+msgstr "A largura de banda não pode ser negativa."
+
+#: etc/inc/shaper.inc:328 etc/inc/shaper.inc:329 etc/inc/shaper.inc:332
+msgid "Qlimit must be an integer."
+msgstr "Qlimit deve ser um inteiro."
+
+#: etc/inc/shaper.inc:330 etc/inc/shaper.inc:331 etc/inc/shaper.inc:334
+msgid "Qlimit must be an positive."
+msgstr "Qlimit deve ser positivo."
+
+#: etc/inc/shaper.inc:332 etc/inc/shaper.inc:333 etc/inc/shaper.inc:336
+msgid "Tbrsize must be an integer."
+msgstr "Tbrsize deve ser um inteiro."
+
+#: etc/inc/shaper.inc:334 etc/inc/shaper.inc:335 etc/inc/shaper.inc:338
+msgid "Tbrsize must be an positive."
+msgstr "Tbrsize deve ser positivo."
+
+#: etc/inc/shaper.inc:614 etc/inc/shaper.inc:1120 etc/inc/shaper.inc:3269
+#: etc/inc/shaper.inc:3488 etc/inc/shaper.inc:615 etc/inc/shaper.inc:1121
+#: etc/inc/shaper.inc:3277 etc/inc/shaper.inc:3500 etc/inc/shaper.inc:3432
+#: etc/inc/shaper.inc:3655 etc/inc/shaper.inc:1122 etc/inc/shaper.inc:3433
+#: etc/inc/shaper.inc:3656 etc/inc/shaper.inc:617 etc/inc/shaper.inc:1126
+#: etc/inc/shaper.inc:3440 etc/inc/shaper.inc:3663 etc/inc/shaper.inc:637
+#: etc/inc/shaper.inc:1169 etc/inc/shaper.inc:3508 etc/inc/shaper.inc:3731
+#: etc/inc/shaper.inc:3589 etc/inc/shaper.inc:3836 etc/inc/shaper.inc:3615
+#: etc/inc/shaper.inc:3862
+msgid "Enable/Disable"
+msgstr "Habilitar/Desabilitar"
+
+#: etc/inc/shaper.inc:619 etc/inc/shaper.inc:620 etc/inc/shaper.inc:622
+#: etc/inc/shaper.inc:642
+msgid "Enable/disable discipline and its children"
+msgstr "Habilitar/Desabilitar disciplina e suas filhas"
+
+#: etc/inc/shaper.inc:621 etc/inc/shaper.inc:965 etc/inc/shaper.inc:2791
+#: etc/inc/shaper.inc:3016 etc/inc/shaper.inc:3276 etc/inc/shaper.inc:3496
+#: etc/inc/shaper.inc:3568 usr/local/www/load_balancer_virtual_server.php:128
+#: usr/local/www/firewall_aliases_import.php:59
+#: usr/local/www/load_balancer_relay_action.php:140
+#: usr/local/www/interfaces_groups.php:94
+#: usr/local/www/firewall_aliases.php:165
+#: usr/local/www/firewall_aliases_edit.php:134
+#: usr/local/www/firewall_aliases_edit.php:576
+#: usr/local/www/firewall_schedule.php:96
+#: usr/local/www/load_balancer_pool.php:131
+#: usr/local/www/load_balancer_monitor.php:122
+#: usr/local/www/load_balancer_monitor_edit.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:235
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:181
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:183
+#: usr/local/www/services_captiveportal_filemanager.php:162
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:411
+#: usr/local/www/load_balancer_relay_protocol.php:134
+#: usr/local/www/load_balancer_relay_protocol_edit.php:79
+#: usr/local/www/load_balancer_relay_protocol_edit.php:195
+#: usr/local/www/services_igmpproxy.php:95
+#: usr/local/www/status_gateways.php:72 usr/local/www/status_lb_pool.php:130
+#: usr/local/www/status_lb_vs.php:77 usr/local/www/status_openvpn.php:211
+#: usr/local/www/status_openvpn.php:262 usr/local/www/system_camanager.php:565
+#: usr/local/www/system_certmanager.php:854
+#: usr/local/www/system_crlmanager.php:487
+#: usr/local/www/system_gateways.php:152
+#: usr/local/www/system_gateways_edit.php:98
+#: usr/local/www/system_gateways_edit.php:370
+#: usr/local/www/system_groupmanager.php:346
+#: usr/local/www/system_usermanager.php:577
+#: usr/local/www/system_usermanager.php:630 etc/inc/shaper.inc:622
+#: etc/inc/shaper.inc:966 etc/inc/shaper.inc:2793 etc/inc/shaper.inc:3020
+#: etc/inc/shaper.inc:3284 etc/inc/shaper.inc:3508 etc/inc/shaper.inc:3580
+#: usr/local/www/pkg_mgr.php:129 usr/local/www/system_certmanager.php:1020
+#: usr/local/www/load_balancer_relay_action_edit.php:410
+#: usr/local/www/system_usermanager.php:575
+#: usr/local/www/system_usermanager.php:628
+#: usr/local/www/firewall_aliases_edit.php:581
+#: usr/local/www/pkg_mgr_installed.php:111
+#: usr/local/www/load_balancer_virtual_server.php:129
+#: usr/local/www/system_gateways_edit.php:99
+#: usr/local/www/system_gateways_edit.php:391
+#: usr/local/www/load_balancer_monitor.php:123
+#: usr/local/www/load_balancer_virtual_server_edit.php:157
+#: usr/local/www/firewall_aliases.php:168
+#: usr/local/www/system_camanager.php:566
+#: usr/local/www/load_balancer_pool_edit.php:189
+#: usr/local/www/load_balancer_pool.php:132 etc/inc/shaper.inc:3150
+#: etc/inc/shaper.inc:3439 etc/inc/shaper.inc:3663 etc/inc/shaper.inc:3735
+#: usr/local/www/status_openvpn.php:214 usr/local/www/status_openvpn.php:265
+#: usr/local/www/load_balancer_relay_protocol_edit.php:193
+#: usr/local/www/interfaces_groups.php:95
+#: usr/local/www/load_balancer_relay_action_edit.php:408
+#: usr/local/www/load_balancer_monitor_edit.php:233
+#: usr/local/www/system_crlmanager.php:520
+#: usr/local/www/firewall_aliases_edit.php:584
+#: usr/local/www/load_balancer_virtual_server.php:127
+#: usr/local/www/system_gateways_edit.php:100
+#: usr/local/www/system_gateways_edit.php:497
+#: usr/local/www/status_gateways.php:73
+#: usr/local/www/services_captiveportal_filemanager.php:159
+#: usr/local/www/load_balancer_monitor.php:121
+#: usr/local/www/load_balancer_relay_protocol.php:132
+#: usr/local/www/load_balancer_virtual_server_edit.php:155
+#: usr/local/www/firewall_aliases.php:188
+#: usr/local/www/load_balancer_relay_action.php:138
+#: usr/local/www/load_balancer_pool_edit.php:187
+#: usr/local/www/load_balancer_pool.php:130
+#: usr/local/www/system_gateways_edit.php:499
+#: usr/local/www/system_camanager.php:590 usr/local/www/status_openvpn.php:313
+#: usr/local/www/system_certmanager.php:1062 etc/inc/shaper.inc:2794
+#: etc/inc/shaper.inc:3151 etc/inc/shaper.inc:3440 etc/inc/shaper.inc:3664
+#: etc/inc/shaper.inc:3736 usr/local/www/system_gateways_edit.php:501
+#: usr/local/www/status_openvpn.php:272 usr/local/www/status_openvpn.php:333
+#: usr/local/www/pkg_mgr_installed.php:113
+#: usr/local/www/system_certmanager.php:1066 usr/local/www/pkg_mgr.php:132
+#: usr/local/www/firewall_aliases_edit.php:128
+#: usr/local/www/firewall_aliases_edit.php:615 etc/inc/shaper.inc:624
+#: etc/inc/shaper.inc:970 etc/inc/shaper.inc:2799 etc/inc/shaper.inc:3158
+#: etc/inc/shaper.inc:3447 etc/inc/shaper.inc:3671 etc/inc/shaper.inc:3743
+#: usr/local/www/system_gateways_edit.php:531 etc/inc/shaper.inc:644
+#: etc/inc/shaper.inc:1002 etc/inc/shaper.inc:2867 etc/inc/shaper.inc:3226
+#: etc/inc/shaper.inc:3515 etc/inc/shaper.inc:3739 etc/inc/shaper.inc:3811
+#: etc/inc/shaper.inc:2886 etc/inc/shaper.inc:3282 etc/inc/shaper.inc:3596
+#: etc/inc/shaper.inc:3844 etc/inc/shaper.inc:3916
+#: usr/local/www/system_groupmanager.php:349
+#: usr/local/www/firewall_aliases_edit.php:614 etc/inc/shaper.inc:2888
+#: etc/inc/shaper.inc:3304 etc/inc/shaper.inc:3622 etc/inc/shaper.inc:3870
+#: etc/inc/shaper.inc:3942
+msgid "Name"
+msgstr "Nome"
+
+#: etc/inc/shaper.inc:625 etc/inc/shaper.inc:626 etc/inc/shaper.inc:628
+#: etc/inc/shaper.inc:648
+msgid "Scheduler Type "
+msgstr "Tipo de Agendador"
+
+#: etc/inc/shaper.inc:647 etc/inc/shaper.inc:648 etc/inc/shaper.inc:650
+#: etc/inc/shaper.inc:674
+msgid "NOTE: Changing this changes all child queues!"
+msgstr "NOTA: Alterando isso, afetará todas as filas filhas!"
+
+#: etc/inc/shaper.inc:648 etc/inc/shaper.inc:649 etc/inc/shaper.inc:651
+#: etc/inc/shaper.inc:675
+msgid " Beware you can lose information."
+msgstr " Cuidado, você pode perder informações."
+
+#: etc/inc/shaper.inc:686 etc/inc/shaper.inc:687 etc/inc/shaper.inc:689
+#: etc/inc/shaper.inc:713
+msgid "Adjusts the size, in bytes, of the token bucket regulator. If not specified, heuristics based on the interface bandwidth are used to determine the size."
+msgstr "Ajuste o tamanho, em bytes, do token buket regulator. Se não especificado, heurísticas baseadas no tamanho da banda da interface são usadas para determinar o tamanho."
+
+#: etc/inc/shaper.inc:978 etc/inc/shaper.inc:979 etc/inc/shaper.inc:983
+#: etc/inc/shaper.inc:1015
+msgid "The priority must be an integer between 1 and 15."
+msgstr "A prioridade deve ser um inteiro entre 1 e 15."
+
+#: etc/inc/shaper.inc:981 etc/inc/shaper.inc:2802 etc/inc/shaper.inc:982
+#: etc/inc/shaper.inc:2804 etc/inc/shaper.inc:2805 etc/inc/shaper.inc:986
+#: etc/inc/shaper.inc:2810 etc/inc/shaper.inc:1018 etc/inc/shaper.inc:2878
+#: etc/inc/shaper.inc:2897 etc/inc/shaper.inc:2899
+msgid "Queue limit must be an integer"
+msgstr "Limite da fila deve ser um inteiro"
+
+#: etc/inc/shaper.inc:983 etc/inc/shaper.inc:984 etc/inc/shaper.inc:988
+#: etc/inc/shaper.inc:1020
+msgid "Queue limit must be positive"
+msgstr "Limite da fila deve ser positivo"
+
+#: etc/inc/shaper.inc:985 etc/inc/shaper.inc:987 etc/inc/shaper.inc:2804
+#: etc/inc/shaper.inc:2806 etc/inc/shaper.inc:3573 etc/inc/shaper.inc:986
+#: etc/inc/shaper.inc:988 etc/inc/shaper.inc:2808 etc/inc/shaper.inc:3585
+#: etc/inc/shaper.inc:3740 etc/inc/shaper.inc:2807 etc/inc/shaper.inc:2809
+#: etc/inc/shaper.inc:3741 etc/inc/shaper.inc:990 etc/inc/shaper.inc:992
+#: etc/inc/shaper.inc:2812 etc/inc/shaper.inc:2814 etc/inc/shaper.inc:3748
+#: etc/inc/shaper.inc:1022 etc/inc/shaper.inc:1024 etc/inc/shaper.inc:2880
+#: etc/inc/shaper.inc:2882 etc/inc/shaper.inc:3816 etc/inc/shaper.inc:2899
+#: etc/inc/shaper.inc:2901 etc/inc/shaper.inc:3921 etc/inc/shaper.inc:2903
+#: etc/inc/shaper.inc:3947
+msgid "Queue names must be alphanumeric and _ or - only."
+msgstr "Nomes de filas devem ser alfanuméricos, _ ou - somente."
+
+#: etc/inc/shaper.inc:989 etc/inc/shaper.inc:990 etc/inc/shaper.inc:991
+#: etc/inc/shaper.inc:995 etc/inc/shaper.inc:1027
+msgid "Only one default queue per interface is allowed."
+msgstr "Apenas uma fila padrão é permitida por interface."
+
+#: etc/inc/shaper.inc:1125 etc/inc/shaper.inc:1126 etc/inc/shaper.inc:1127
+#: etc/inc/shaper.inc:1131 etc/inc/shaper.inc:1174
+msgid "Enable/Disable queue and its children"
+msgstr "Habilitar/Desabilitar fila e suas filhas"
+
+#: etc/inc/shaper.inc:1129 etc/inc/shaper.inc:1130 etc/inc/shaper.inc:1131
+#: etc/inc/shaper.inc:1135 etc/inc/shaper.inc:1178
+msgid "Queue Name"
+msgstr "Nome da Fila"
+
+#: etc/inc/shaper.inc:1136 etc/inc/shaper.inc:1137 etc/inc/shaper.inc:1138
+#: etc/inc/shaper.inc:1142 etc/inc/shaper.inc:1185
+msgid "Enter the name of the queue here. Do not use spaces and limit the size to 15 characters."
+msgstr "Informe o nome da fila aqui. Não use espaços e limite o tamanho para 15 caracteres."
+
+#: etc/inc/shaper.inc:1139 usr/local/www/interfaces_bridge_edit.php:354
+#: usr/local/www/interfaces_bridge_edit.php:373
+#: usr/local/www/system_gateway_groups.php:122 etc/inc/shaper.inc:1140
+#: usr/local/www/interfaces_bridge_edit.php:363
+#: usr/local/www/interfaces_bridge_edit.php:382
+#: usr/local/www/system_gateway_groups.php:123
+#: usr/local/www/interfaces_bridge_edit.php:364
+#: usr/local/www/interfaces_bridge_edit.php:383
+#: usr/local/www/interfaces_bridge_edit.php:365
+#: usr/local/www/interfaces_bridge_edit.php:384 etc/inc/shaper.inc:1141
+#: usr/local/www/system_gateway_groups.php:132 etc/inc/shaper.inc:1145
+#: usr/local/www/interfaces_bridge_edit.php:367
+#: usr/local/www/interfaces_bridge_edit.php:386 etc/inc/shaper.inc:1188
+msgid "Priority"
+msgstr "Prioridade"
+
+#: etc/inc/shaper.inc:1143 etc/inc/shaper.inc:1144 etc/inc/shaper.inc:1145
+#: etc/inc/shaper.inc:1149 etc/inc/shaper.inc:1192
+msgid "For hfsc, the range is 0 to 7. The default is 1. Hfsc queues with a higher priority are preferred in the case of overload."
+msgstr "Para hfsc, o intervalo é de 0 a 7. O padrão é 1. Filas Hfsc com maior prioridade são preferidas no caso de sobrecarga."
+
+#: etc/inc/shaper.inc:1146 etc/inc/shaper.inc:1147 etc/inc/shaper.inc:1148
+#: etc/inc/shaper.inc:1152 etc/inc/shaper.inc:1195
+msgid "Queue limit"
+msgstr "Limite da Fila"
+
+#: etc/inc/shaper.inc:1150 etc/inc/shaper.inc:1151 etc/inc/shaper.inc:1152
+#: etc/inc/shaper.inc:1156 etc/inc/shaper.inc:1199
+msgid "Queue limit in packets per second."
+msgstr "Limite da Fila em pacotes por segundo."
+
+#: etc/inc/shaper.inc:1153 etc/inc/shaper.inc:1154 etc/inc/shaper.inc:1155
+#: etc/inc/shaper.inc:1159 etc/inc/shaper.inc:1202
+msgid "Scheduler options"
+msgstr "Opções do agendador"
+
+#: etc/inc/shaper.inc:1158 etc/inc/shaper.inc:1161 etc/inc/shaper.inc:1159
+#: etc/inc/shaper.inc:1162 etc/inc/shaper.inc:1160 etc/inc/shaper.inc:1163
+#: etc/inc/shaper.inc:1164 etc/inc/shaper.inc:1167 etc/inc/shaper.inc:1207
+#: etc/inc/shaper.inc:1210
+msgid "Default queue"
+msgstr "Fila padrão"
+
+#: etc/inc/shaper.inc:1168 etc/inc/shaper.inc:1169 etc/inc/shaper.inc:1170
+#: etc/inc/shaper.inc:1174 etc/inc/shaper.inc:1217
+msgid "Random Early Detection"
+msgstr "Detecção Antecipada Aleatória"
+
+#: etc/inc/shaper.inc:1173 etc/inc/shaper.inc:1174 etc/inc/shaper.inc:1175
+#: etc/inc/shaper.inc:1179 etc/inc/shaper.inc:1222
+msgid "Random Early Detection In and Out"
+msgstr "Detecção Randômica Recente de Entrada e Saída"
+
+#: etc/inc/shaper.inc:1178 etc/inc/shaper.inc:1179 etc/inc/shaper.inc:1180
+#: etc/inc/shaper.inc:1184 etc/inc/shaper.inc:1227
+msgid "Explicit Congestion Notification"
+msgstr "Notificação de Congestionamento Explícita"
+
+#: etc/inc/shaper.inc:1179 etc/inc/shaper.inc:1180 etc/inc/shaper.inc:1181
+#: etc/inc/shaper.inc:1185 etc/inc/shaper.inc:1233
+msgid "Select options for this queue"
+msgstr "Selecione opções para essa fila"
+
+#: etc/inc/shaper.inc:1181 etc/inc/shaper.inc:3069 etc/inc/shaper.inc:3501
+#: usr/local/www/load_balancer_virtual_server.php:134
+#: usr/local/www/pkg_mgr_installed.php:94
+#: usr/local/www/firewall_aliases_import.php:140
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:121
+#: usr/local/www/firewall_virtual_ip_edit.php:538
+#: usr/local/www/load_balancer_relay_action.php:143
+#: usr/local/www/services_dyndns.php:103 usr/local/www/services_wol.php:163
+#: usr/local/www/services_wol_edit.php:148
+#: usr/local/www/interfaces_bridge.php:109
+#: usr/local/www/interfaces_bridge_edit.php:273
+#: usr/local/www/interfaces_gif.php:108
+#: usr/local/www/interfaces_gif_edit.php:208
+#: usr/local/www/interfaces_gre.php:109
+#: usr/local/www/interfaces_gre_edit.php:219
+#: usr/local/www/interfaces_groups.php:96
+#: usr/local/www/interfaces_groups_edit.php:259
+#: usr/local/www/firewall_aliases.php:167
+#: usr/local/www/firewall_aliases_edit.php:455
+#: usr/local/www/firewall_aliases_edit.php:591
+#: usr/local/www/firewall_aliases_edit.php:626
+#: usr/local/www/firewall_nat_1to1.php:108
+#: usr/local/www/firewall_nat_1to1_edit.php:440
+#: usr/local/www/firewall_nat_edit.php:769
+#: usr/local/www/firewall_nat_out.php:349
+#: usr/local/www/firewall_nat_out_edit.php:636
+#: usr/local/www/firewall_rules.php:374
+#: usr/local/www/firewall_rules_edit.php:1053
+#: usr/local/www/firewall_schedule.php:98
+#: usr/local/www/firewall_schedule_edit.php:793
+#: usr/local/www/firewall_schedule_edit.php:998
+#: usr/local/www/firewall_virtual_ip.php:187 usr/local/www/interfaces.php:1244
+#: usr/local/www/load_balancer_pool.php:136
+#: usr/local/www/interfaces_vlan.php:110
+#: usr/local/www/interfaces_vlan_edit.php:179
+#: usr/local/www/system_routes.php:129
+#: usr/local/www/system_routes_edit.php:267
+#: usr/local/www/interfaces_lagg.php:114
+#: usr/local/www/interfaces_lagg_edit.php:208
+#: usr/local/www/interfaces_ppps.php:110
+#: usr/local/www/interfaces_ppps_edit.php:467
+#: usr/local/www/interfaces_qinq.php:119
+#: usr/local/www/interfaces_qinq_edit.php:337
+#: usr/local/www/interfaces_wireless.php:108
+#: usr/local/www/interfaces_wireless_edit.php:185
+#: usr/local/www/load_balancer_monitor.php:124 usr/local/www/vpn_pppoe.php:104
+#: usr/local/www/load_balancer_monitor_edit.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:241
+#: usr/local/www/load_balancer_pool_edit.php:196
+#: usr/local/www/load_balancer_virtual_server_edit.php:189
+#: usr/local/www/pkg_mgr.php:118 usr/local/www/firewall_nat.php:203
+#: usr/local/www/diag_ipsec.php:95
+#: usr/local/www/services_captiveportal_ip.php:118
+#: usr/local/www/services_captiveportal_ip_edit.php:208
+#: usr/local/www/services_captiveportal_mac.php:168
+#: usr/local/www/services_captiveportal_mac_edit.php:182
+#: usr/local/www/services_dhcp.php:893
+#: usr/local/www/services_dhcp_edit.php:242
+#: usr/local/www/services_dnsmasq.php:246
+#: usr/local/www/services_dnsmasq.php:313
+#: usr/local/www/services_dnsmasq_edit.php:163
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:417
+#: usr/local/www/load_balancer_relay_protocol.php:137
+#: usr/local/www/load_balancer_relay_protocol_edit.php:79
+#: usr/local/www/load_balancer_relay_protocol_edit.php:218
+#: usr/local/www/services_captiveportal_hostname.php:123
+#: usr/local/www/services_captiveportal_hostname_edit.php:183
+#: usr/local/www/status_services.php:245 usr/local/www/status_upnp.php:88
+#: usr/local/www/services_dyndns_edit.php:228
+#: usr/local/www/services_igmpproxy.php:98
+#: usr/local/www/services_igmpproxy_edit.php:175
+#: usr/local/www/services_rfc2136.php:80
+#: usr/local/www/services_rfc2136_edit.php:192
+#: usr/local/www/status_gateway_groups.php:76
+#: usr/local/www/status_gateways.php:78 usr/local/www/status_lb_pool.php:134
+#: usr/local/www/status_lb_vs.php:81
+#: usr/local/www/system_advanced_sysctl.php:172
+#: usr/local/www/system_advanced_sysctl.php:243
+#: usr/local/www/system_gateway_groups.php:123
+#: usr/local/www/system_gateway_groups_edit.php:219
+#: usr/local/www/system_gateways.php:156
+#: usr/local/www/system_gateways_edit.php:484
+#: usr/local/www/system_groupmanager.php:275
+#: usr/local/www/system_groupmanager.php:347
+#: usr/local/www/system_groupmanager.php:405
+#: usr/local/www/system_groupmanager_addprivs.php:216
+#: usr/local/www/system_usermanager.php:578
+#: usr/local/www/system_usermanager_addprivs.php:197
+#: usr/local/www/vpn_ipsec_phase1.php:575
+#: usr/local/www/vpn_ipsec_phase2.php:497
+#: usr/local/www/vpn_openvpn_client.php:573
+#: usr/local/www/vpn_openvpn_client.php:863
+#: usr/local/www/vpn_openvpn_csc.php:342 usr/local/www/vpn_openvpn_csc.php:674
+#: usr/local/www/vpn_openvpn_server.php:722
+#: usr/local/www/vpn_openvpn_server.php:1451
+#: usr/local/www/vpn_pppoe_edit.php:444 usr/local/www/firewall_nat_npt.php:107
+#: usr/local/www/firewall_nat_npt_edit.php:261
+#: usr/local/www/services_dhcpv6.php:806
+#: usr/local/www/services_dhcpv6_edit.php:219
+#: usr/local/www/services_captiveportal_zones.php:55
+#: usr/local/www/services_captiveportal_zones_edit.php:106
+#: etc/inc/shaper.inc:1182 etc/inc/shaper.inc:3077 etc/inc/shaper.inc:3513
+#: usr/local/www/system_routes_edit.php:307 usr/local/www/pkg_mgr.php:132
+#: usr/local/www/services_unbound_acls.php:238
+#: usr/local/www/services_unbound_acls.php:292
+#: usr/local/www/services_unbound_acls.php:319
+#: usr/local/www/system_gateway_groups_edit.php:274
+#: usr/local/www/services_dnsmasq.php:334
+#: usr/local/www/services_dyndns_edit.php:358
+#: usr/local/www/firewall_nat_out.php:359
+#: usr/local/www/services_dnsmasq_edit.php:218
+#: usr/local/www/services_dnsmasq_edit.php:239
+#: usr/local/www/firewall_nat_1to1_edit.php:447
+#: usr/local/www/services_dhcpv6_edit.php:228
+#: usr/local/www/firewall_nat_npt_edit.php:266
+#: usr/local/www/firewall_nat_out_edit.php:649
+#: usr/local/www/diag_ipsec.php:106
+#: usr/local/www/load_balancer_relay_action_edit.php:416
+#: usr/local/www/firewall_rules_edit.php:1088
+#: usr/local/www/services_unbound.php:282
+#: usr/local/www/services_unbound.php:349
+#: usr/local/www/system_usermanager.php:576
+#: usr/local/www/services_igmpproxy_edit.php:177
+#: usr/local/www/firewall_aliases_edit.php:458
+#: usr/local/www/firewall_aliases_edit.php:596
+#: usr/local/www/firewall_aliases_edit.php:631
+#: usr/local/www/pkg_mgr_installed.php:114
+#: usr/local/www/firewall_rules.php:378
+#: usr/local/www/load_balancer_virtual_server.php:135
+#: usr/local/www/system_groupmanager_addprivs.php:214
+#: usr/local/www/system_gateways_edit.php:519
+#: usr/local/www/load_balancer_monitor.php:125
+#: usr/local/www/services_dyndns.php:112
+#: usr/local/www/vpn_openvpn_server.php:795
+#: usr/local/www/vpn_openvpn_server.php:1593
+#: usr/local/www/services_dhcp.php:931
+#: usr/local/www/load_balancer_virtual_server_edit.php:163
+#: usr/local/www/interfaces_bridge_edit.php:282
+#: usr/local/www/firewall_aliases.php:170
+#: usr/local/www/vpn_ipsec_phase2.php:523
+#: usr/local/www/firewall_nat_edit.php:776
+#: usr/local/www/services_dhcp_edit.php:251 usr/local/www/interfaces.php:1348
+#: usr/local/www/vpn_openvpn_client.php:578
+#: usr/local/www/vpn_openvpn_client.php:868
+#: usr/local/www/load_balancer_pool_edit.php:204
+#: usr/local/www/firewall_virtual_ip_edit.php:526
+#: usr/local/www/interfaces_gre_edit.php:218
+#: usr/local/www/load_balancer_pool.php:137
+#: usr/local/www/vpn_ipsec_phase1.php:588
+#: usr/local/www/services_dhcpv6.php:901 etc/inc/shaper.inc:3225
+#: etc/inc/shaper.inc:3668 usr/local/www/vpn_pppoe_edit.php:445
+#: usr/local/www/system_routes_edit.php:308
+#: usr/local/www/system_gateway_groups_edit.php:334
+#: usr/local/www/interfaces_vlan_edit.php:180
+#: usr/local/www/services_dnsmasq.php:247
+#: usr/local/www/services_dnsmasq.php:335
+#: usr/local/www/firewall_nat_out.php:360
+#: usr/local/www/system_groupmanager.php:406
+#: usr/local/www/services_dnsmasq_edit.php:219
+#: usr/local/www/services_dnsmasq_edit.php:240
+#: usr/local/www/load_balancer_relay_protocol_edit.php:216
+#: usr/local/www/firewall_nat_1to1_edit.php:445
+#: usr/local/www/services_dhcpv6_edit.php:230
+#: usr/local/www/services_captiveportal_ip.php:116
+#: usr/local/www/firewall_nat_npt_edit.php:265 usr/local/www/vpn_pppoe.php:105
+#: usr/local/www/interfaces_groups.php:97
+#: usr/local/www/services_captiveportal_hostname_edit.php:181
+#: usr/local/www/interfaces_qinq_edit.php:338
+#: usr/local/www/interfaces_gif_edit.php:209 usr/local/www/diag_ipsec.php:107
+#: usr/local/www/firewall_nat.php:208 usr/local/www/interfaces_qinq.php:120
+#: usr/local/www/load_balancer_relay_action_edit.php:414
+#: usr/local/www/interfaces_ppps.php:111
+#: usr/local/www/load_balancer_monitor_edit.php:239
+#: usr/local/www/services_captiveportal_mac.php:166
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:151
+#: usr/local/www/services_captiveportal_mac_edit.php:180
+#: usr/local/www/firewall_schedule_edit.php:792
+#: usr/local/www/firewall_schedule_edit.php:997
+#: usr/local/www/interfaces_bridge.php:110
+#: usr/local/www/interfaces_ppps_edit.php:468
+#: usr/local/www/interfaces_lagg.php:115
+#: usr/local/www/firewall_aliases_edit.php:460
+#: usr/local/www/firewall_aliases_edit.php:599
+#: usr/local/www/firewall_aliases_edit.php:634
+#: usr/local/www/interfaces_lagg_edit.php:209
+#: usr/local/www/vpn_openvpn_csc.php:341 usr/local/www/vpn_openvpn_csc.php:673
+#: usr/local/www/services_captiveportal_hostname.php:121
+#: usr/local/www/firewall_rules.php:371 usr/local/www/interfaces_gre.php:110
+#: usr/local/www/load_balancer_virtual_server.php:133
+#: usr/local/www/interfaces_wireless.php:109
+#: usr/local/www/system_gateway_groups.php:124
+#: usr/local/www/status_services.php:241
+#: usr/local/www/system_gateways_edit.php:619
+#: usr/local/www/status_gateways.php:79
+#: usr/local/www/load_balancer_monitor.php:123
+#: usr/local/www/services_captiveportal_ip_edit.php:206
+#: usr/local/www/load_balancer_relay_protocol.php:135
+#: usr/local/www/vpn_openvpn_server.php:823
+#: usr/local/www/vpn_openvpn_server.php:1634 usr/local/www/status_upnp.php:89
+#: usr/local/www/services_dhcp.php:1135
+#: usr/local/www/load_balancer_virtual_server_edit.php:161
+#: usr/local/www/interfaces_bridge_edit.php:283
+#: usr/local/www/firewall_aliases.php:190
+#: usr/local/www/load_balancer_relay_action.php:141
+#: usr/local/www/interfaces_groups_edit.php:260
+#: usr/local/www/services_captiveportal_zones_edit.php:108
+#: usr/local/www/vpn_ipsec_phase2.php:625
+#: usr/local/www/interfaces_vlan.php:111
+#: usr/local/www/firewall_nat_edit.php:775
+#: usr/local/www/services_dhcp_edit.php:253 usr/local/www/interfaces.php:1336
+#: usr/local/www/services_captiveportal_zones.php:56
+#: usr/local/www/vpn_openvpn_client.php:596
+#: usr/local/www/vpn_openvpn_client.php:921
+#: usr/local/www/status_gateway_groups.php:77
+#: usr/local/www/load_balancer_pool_edit.php:202
+#: usr/local/www/firewall_virtual_ip_edit.php:471
+#: usr/local/www/interfaces_gif.php:109
+#: usr/local/www/load_balancer_pool.php:135
+#: usr/local/www/firewall_virtual_ip.php:191
+#: usr/local/www/vpn_ipsec_phase1.php:587
+#: usr/local/www/services_dhcpv6.php:832 usr/local/www/services_rfc2136.php:81
+#: usr/local/www/status_services.php:239
+#: usr/local/www/system_gateways_edit.php:623
+#: usr/local/www/services_captiveportal_ip_edit.php:200
+#: usr/local/www/vpn_pppoe.php:106
+#: usr/local/www/interfaces_wireless_edit.php:187
+#: usr/local/www/services_captiveportal_zones_edit.php:105
+#: usr/local/www/vpn_openvpn_client.php:615
+#: usr/local/www/vpn_openvpn_client.php:940
+#: usr/local/www/services_dhcpv6_edit.php:233
+#: usr/local/www/services_dyndns_edit.php:362
+#: usr/local/www/firewall_rules_edit.php:1103
+#: usr/local/www/interfaces_qinq.php:123
+#: usr/local/www/interfaces_vlan_edit.php:183
+#: usr/local/www/interfaces_ppps_edit.php:474
+#: usr/local/www/firewall_virtual_ip.php:205
+#: usr/local/www/interfaces_lagg_edit.php:222
+#: usr/local/www/firewall_nat_edit.php:770
+#: usr/local/www/interfaces_lagg.php:119 usr/local/www/interfaces_vlan.php:117
+#: usr/local/www/interfaces_gif_edit.php:220
+#: usr/local/www/services_dhcp_edit.php:381
+#: usr/local/www/firewall_virtual_ip_edit.php:463
+#: usr/local/www/diag_ipsec.php:109 usr/local/www/interfaces_bridge.php:116
+#: usr/local/www/interfaces_wireless.php:111
+#: usr/local/www/system_routes.php:133 usr/local/www/vpn_pppoe_edit.php:448
+#: usr/local/www/services_dhcp.php:792 usr/local/www/services_dhcp.php:1154
+#: usr/local/www/services_captiveportal_mac_edit.php:193
+#: usr/local/www/services_dhcpv6.php:853
+#: usr/local/www/interfaces_bridge_edit.php:284
+#: usr/local/www/services_dnsmasq.php:272
+#: usr/local/www/services_dnsmasq.php:360
+#: usr/local/www/services_captiveportal_mac.php:176
+#: usr/local/www/vpn_ipsec_phase1.php:608 usr/local/www/interfaces_gre.php:114
+#: usr/local/www/firewall_nat_out_edit.php:651
+#: usr/local/www/vpn_openvpn_server.php:850
+#: usr/local/www/vpn_openvpn_server.php:1686
+#: usr/local/www/vpn_ipsec_phase2.php:646 usr/local/www/services_dyndns.php:93
+#: usr/local/www/interfaces_gif.php:113
+#: usr/local/www/interfaces_qinq_edit.php:341
+#: usr/local/www/interfaces.php:1349 etc/inc/shaper.inc:1183
+#: etc/inc/shaper.inc:3226 etc/inc/shaper.inc:3669
+#: usr/local/www/status_services.php:80
+#: usr/local/www/system_gateways_edit.php:625
+#: usr/local/www/services_dyndns_edit.php:370
+#: usr/local/www/firewall_rules_edit.php:1116
+#: usr/local/www/firewall_nat_edit.php:782
+#: usr/local/www/firewall_virtual_ip_edit.php:483
+#: usr/local/www/pkg_mgr_installed.php:116 usr/local/www/services_dhcp.php:812
+#: usr/local/www/services_dhcp.php:1174 usr/local/www/pkg_mgr.php:135
+#: usr/local/www/system_routes_edit.php:331
+#: usr/local/www/firewall_nat_out.php:367 usr/local/www/firewall_rules.php:369
+#: usr/local/www/system_gateway_groups_edit.php:336
+#: usr/local/www/firewall_aliases_edit.php:482
+#: usr/local/www/firewall_aliases_edit.php:630
+#: usr/local/www/firewall_aliases_edit.php:665
+#: usr/local/www/services_dnsmasq.php:285
+#: usr/local/www/services_dnsmasq.php:373
+#: usr/local/www/firewall_nat_out_edit.php:663
+#: usr/local/www/services_dyndns.php:89
+#: usr/local/www/system_gateway_groups.php:133
+#: usr/local/www/interfaces.php:1391 etc/inc/shaper.inc:1187
+#: etc/inc/shaper.inc:3233 etc/inc/shaper.inc:3481 etc/inc/shaper.inc:3676
+#: usr/local/www/system_gateways_edit.php:655
+#: usr/local/www/firewall_rules_edit.php:1115
+#: usr/local/www/firewall_virtual_ip.php:228
+#: usr/local/www/interfaces_lagg_edit.php:221
+#: usr/local/www/firewall_nat_edit.php:783 usr/local/www/system_routes.php:149
+#: usr/local/www/firewall_nat.php:211 usr/local/www/system_routes_edit.php:340
+#: usr/local/www/firewall_nat_out.php:366
+#: usr/local/www/interfaces_bridge_edit.php:286
+#: usr/local/www/services_dnsmasq.php:349
+#: usr/local/www/services_dnsmasq.php:437 usr/local/www/interfaces.php:1386
+#: etc/inc/shaper.inc:1235 etc/inc/shaper.inc:3301 etc/inc/shaper.inc:3549
+#: etc/inc/shaper.inc:3744 usr/local/www/system_gateways_edit.php:656
+#: usr/local/www/system_routes_edit.php:342 etc/inc/shaper.inc:3378
+#: etc/inc/shaper.inc:3651 etc/inc/shaper.inc:3849
+#: usr/local/www/services_rfc2136.php:83
+#: usr/local/www/system_groupmanager.php:278
+#: usr/local/www/system_groupmanager.php:350
+#: usr/local/www/system_groupmanager.php:409
+#: usr/local/www/services_dyndns_edit.php:371
+#: usr/local/www/firewall_rules_edit.php:1163
+#: usr/local/www/firewall_virtual_ip.php:235
+#: usr/local/www/firewall_virtual_ip_edit.php:488
+#: usr/local/www/services_dhcp.php:824 usr/local/www/services_dhcp.php:1186
+#: usr/local/www/firewall_aliases_edit.php:481
+#: usr/local/www/firewall_aliases_edit.php:629
+#: usr/local/www/firewall_aliases_edit.php:664
+#: usr/local/www/services_rfc2136_edit.php:204
+#: usr/local/www/interfaces.php:1399 etc/inc/shaper.inc:3404
+#: etc/inc/shaper.inc:3677 etc/inc/shaper.inc:3875
+msgid "Description"
+msgstr "Descrição"
+
+#: etc/inc/shaper.inc:1207 etc/inc/shaper.inc:1209 etc/inc/shaper.inc:1210
+#: etc/inc/shaper.inc:1214 etc/inc/shaper.inc:1262
+msgid "Bandwidth:"
+msgstr "Largura de banda:"
+
+#: etc/inc/shaper.inc:1212 etc/inc/shaper.inc:1214 etc/inc/shaper.inc:1215
+#: etc/inc/shaper.inc:1218 etc/inc/shaper.inc:1266
+msgid "Priority: on"
+msgstr "Prioridade: ligada"
+
+#: etc/inc/shaper.inc:1215 etc/inc/shaper.inc:1217 etc/inc/shaper.inc:1218
+#: etc/inc/shaper.inc:1221 etc/inc/shaper.inc:1269
+msgid "Default: on"
+msgstr "Padrão: ligado"
+
+#: etc/inc/shaper.inc:1222 etc/inc/shaper.inc:1223 etc/inc/shaper.inc:1224
+#: etc/inc/shaper.inc:1225 etc/inc/shaper.inc:1226 etc/inc/shaper.inc:1228
+#: etc/inc/shaper.inc:1229 etc/inc/shaper.inc:1276 etc/inc/shaper.inc:1277
+msgid "Delete queue from interface"
+msgstr "Apagar fila da interface"
+
+#: etc/inc/shaper.inc:1559 etc/inc/shaper.inc:2207 etc/inc/shaper.inc:2483
+#: etc/inc/shaper.inc:1561 etc/inc/shaper.inc:2209 etc/inc/shaper.inc:2485
+#: etc/inc/shaper.inc:1562 etc/inc/shaper.inc:2210 etc/inc/shaper.inc:2486
+#: etc/inc/shaper.inc:1565 etc/inc/shaper.inc:2215 etc/inc/shaper.inc:2491
+#: etc/inc/shaper.inc:1616 etc/inc/shaper.inc:2273 etc/inc/shaper.inc:2554
+msgid "Bandwidth in percentage should be between 1 and 100 bounds."
+msgstr "Tamanho de banda em porcentagem deve ser limitado de 1 a 100."
+
+#: etc/inc/shaper.inc:1576 etc/inc/shaper.inc:1578 etc/inc/shaper.inc:1579
+#: etc/inc/shaper.inc:1582 etc/inc/shaper.inc:1633
+msgid "upperlimit service curve defined but missing (d) value"
+msgstr "curva de serviço upperlimit definido mas o valor (d) está faltando"
+
+#: etc/inc/shaper.inc:1578 etc/inc/shaper.inc:1580 etc/inc/shaper.inc:1581
+#: etc/inc/shaper.inc:1584 etc/inc/shaper.inc:1635
+msgid "upperlimit service curve defined but missing initial bandwidth (m1) value"
+msgstr "curva de serviço upperlimit definido mas o valor do tamanho de banda inicial (m1) está faltando"
+
+#: etc/inc/shaper.inc:1580 etc/inc/shaper.inc:1582 etc/inc/shaper.inc:1583
+#: etc/inc/shaper.inc:1586 etc/inc/shaper.inc:1637
+msgid "upperlimit m1 value needs to be Kb, Mb, Gb, or %"
+msgstr "o valor m1 do upperlimit precisa ser Kb, Gb, ou %"
+
+#: etc/inc/shaper.inc:1582 etc/inc/shaper.inc:1584 etc/inc/shaper.inc:1585
+#: etc/inc/shaper.inc:1588 etc/inc/shaper.inc:1639
+msgid "upperlimit d value needs to be numeric"
+msgstr "o valor d do upperlimit precisa ser numérico"
+
+#: etc/inc/shaper.inc:1584 etc/inc/shaper.inc:1586 etc/inc/shaper.inc:1587
+#: etc/inc/shaper.inc:1590 etc/inc/shaper.inc:1641
+msgid "upperlimit m2 value needs to be Kb, Mb, Gb, or %"
+msgstr "valor m2 de upperlimit precisa ser Kb, Mb, Gb, ou %"
+
+#: etc/inc/shaper.inc:1598 etc/inc/shaper.inc:1600 etc/inc/shaper.inc:1601
+#: etc/inc/shaper.inc:1604 etc/inc/shaper.inc:1655
+msgid "linkshare service curve defined but missing (d) value"
+msgstr "curva de serviço linkshare definida mas o valor (d) está faltando"
+
+#: etc/inc/shaper.inc:1600 etc/inc/shaper.inc:1602 etc/inc/shaper.inc:1603
+#: etc/inc/shaper.inc:1606 etc/inc/shaper.inc:1657
+msgid "linkshare service curve defined but missing initial bandwidth (m1) value"
+msgstr "curva de serviço linkshare definida mas o valor da largura de banda inicial (m1) está faltando"
+
+#: etc/inc/shaper.inc:1602 etc/inc/shaper.inc:1604 etc/inc/shaper.inc:1605
+#: etc/inc/shaper.inc:1608 etc/inc/shaper.inc:1659
+msgid "linkshare m1 value needs to be Kb, Mb, Gb, or %"
+msgstr "O valor m1 de linkshare precisa ser Kb, Mb, Gb, ou %"
+
+#: etc/inc/shaper.inc:1604 etc/inc/shaper.inc:1606 etc/inc/shaper.inc:1607
+#: etc/inc/shaper.inc:1610 etc/inc/shaper.inc:1661
+msgid "linkshare d value needs to be numeric"
+msgstr "o valor d de linkshare precisa ser numérico"
+
+#: etc/inc/shaper.inc:1606 etc/inc/shaper.inc:1608 etc/inc/shaper.inc:1609
+#: etc/inc/shaper.inc:1612 etc/inc/shaper.inc:1663
+msgid "linkshare m2 value needs to be Kb, Mb, Gb, or %"
+msgstr "o valor m2 de linkshare precisa ser Kb, Mb, Gb, ou %"
+
+#: etc/inc/shaper.inc:1608 etc/inc/shaper.inc:1610 etc/inc/shaper.inc:1611
+#: etc/inc/shaper.inc:1614 etc/inc/shaper.inc:1665
+msgid "realtime service curve defined but missing (d) value"
+msgstr "curva de serviço realtime definida mas o valor (d) está faltando"
+
+#: etc/inc/shaper.inc:1610 etc/inc/shaper.inc:1612 etc/inc/shaper.inc:1613
+#: etc/inc/shaper.inc:1616 etc/inc/shaper.inc:1667
+msgid "realtime service curve defined but missing initial bandwidth (m1) value"
+msgstr "curva de serviço realtime definida mas o valor da largura de banda inicial (m1) está faltando"
+
+#: etc/inc/shaper.inc:1625 etc/inc/shaper.inc:1627 etc/inc/shaper.inc:1628
+#: etc/inc/shaper.inc:1631 etc/inc/shaper.inc:1682
+msgid "realtime m1 value needs to be Kb, Mb, Gb, or %"
+msgstr "o valor m1 de realtime precisa ser Kb, Mb, Gb, ou %"
+
+#: etc/inc/shaper.inc:1627 etc/inc/shaper.inc:1629 etc/inc/shaper.inc:1630
+#: etc/inc/shaper.inc:1633 etc/inc/shaper.inc:1684
+msgid "realtime d value needs to be numeric"
+msgstr "o valor d de realtime precisa ser numérico"
+
+#: etc/inc/shaper.inc:1629 etc/inc/shaper.inc:1631 etc/inc/shaper.inc:1632
+#: etc/inc/shaper.inc:1635 etc/inc/shaper.inc:1686
+msgid "realtime m2 value needs to be Kb, Mb, Gb, or %"
+msgstr "o valor m2 de realtime precisa ser Kb, Mb, Gb, ou %"
+
+#: etc/inc/shaper.inc:1858 etc/inc/shaper.inc:2336 etc/inc/shaper.inc:2602
+#: etc/inc/shaper.inc:3039 etc/inc/shaper.inc:1860 etc/inc/shaper.inc:2338
+#: etc/inc/shaper.inc:2604 etc/inc/shaper.inc:3047 etc/inc/shaper.inc:1861
+#: etc/inc/shaper.inc:2339 etc/inc/shaper.inc:2605 etc/inc/shaper.inc:1866
+#: etc/inc/shaper.inc:2344 etc/inc/shaper.inc:2610 etc/inc/shaper.inc:1924
+#: etc/inc/shaper.inc:2407 etc/inc/shaper.inc:2678
+msgid "Gbit/s"
+msgstr "Gbits/s"
+
+#: etc/inc/shaper.inc:1862 etc/inc/shaper.inc:2340 etc/inc/shaper.inc:2606
+#: etc/inc/shaper.inc:3035 etc/inc/shaper.inc:1864 etc/inc/shaper.inc:2342
+#: etc/inc/shaper.inc:2608 etc/inc/shaper.inc:3043 etc/inc/shaper.inc:1865
+#: etc/inc/shaper.inc:2343 etc/inc/shaper.inc:2609 etc/inc/shaper.inc:1870
+#: etc/inc/shaper.inc:2348 etc/inc/shaper.inc:2614 etc/inc/shaper.inc:1928
+#: etc/inc/shaper.inc:2411 etc/inc/shaper.inc:2682
+msgid "Mbit/s"
+msgstr "Mbit/s"
+
+#: etc/inc/shaper.inc:1866 etc/inc/shaper.inc:2344 etc/inc/shaper.inc:2610
+#: etc/inc/shaper.inc:3031 usr/local/www/services_captiveportal.php:560
+#: usr/local/www/services_captiveportal.php:564 etc/inc/shaper.inc:1868
+#: etc/inc/shaper.inc:2346 etc/inc/shaper.inc:2612 etc/inc/shaper.inc:3039
+#: usr/local/www/services_captiveportal.php:565
+#: usr/local/www/services_captiveportal.php:569
+#: usr/local/www/services_captiveportal.php:563
+#: usr/local/www/services_captiveportal.php:567 etc/inc/shaper.inc:1869
+#: etc/inc/shaper.inc:2347 etc/inc/shaper.inc:2613
+#: usr/local/www/services_captiveportal.php:581
+#: usr/local/www/services_captiveportal.php:585 etc/inc/shaper.inc:1874
+#: etc/inc/shaper.inc:2352 etc/inc/shaper.inc:2618 etc/inc/shaper.inc:1932
+#: etc/inc/shaper.inc:2415 etc/inc/shaper.inc:2686
+msgid "Kbit/s"
+msgstr "Kbit/s"
+
+#: etc/inc/shaper.inc:1870 etc/inc/shaper.inc:2348 etc/inc/shaper.inc:2614
+#: etc/inc/shaper.inc:3043 etc/inc/shaper.inc:1872 etc/inc/shaper.inc:2350
+#: etc/inc/shaper.inc:2616 etc/inc/shaper.inc:3051 etc/inc/shaper.inc:1873
+#: etc/inc/shaper.inc:2351 etc/inc/shaper.inc:2617 etc/inc/shaper.inc:1878
+#: etc/inc/shaper.inc:2356 etc/inc/shaper.inc:2622 etc/inc/shaper.inc:1936
+#: etc/inc/shaper.inc:2419 etc/inc/shaper.inc:2690
+msgid "Bit/s"
+msgstr "Bit/s"
+
+#: etc/inc/shaper.inc:1876 etc/inc/shaper.inc:2354 etc/inc/shaper.inc:2620
+#: etc/inc/shaper.inc:1878 etc/inc/shaper.inc:2356 etc/inc/shaper.inc:2622
+#: etc/inc/shaper.inc:1879 etc/inc/shaper.inc:2357 etc/inc/shaper.inc:2623
+#: etc/inc/shaper.inc:1884 etc/inc/shaper.inc:2362 etc/inc/shaper.inc:2628
+#: etc/inc/shaper.inc:1942 etc/inc/shaper.inc:2425 etc/inc/shaper.inc:2696
+msgid "Choose the amount of bandwidth for this queue"
+msgstr "Escolha a largura de banda total para essa fila"
+
+#: etc/inc/shaper.inc:1879 etc/inc/shaper.inc:1881 etc/inc/shaper.inc:1882
+#: etc/inc/shaper.inc:1887 etc/inc/shaper.inc:1945
+msgid "Service Curve (sc)"
+msgstr "Curva de Serviço (sc)"
+
+#: etc/inc/shaper.inc:1886 etc/inc/shaper.inc:1888 etc/inc/shaper.inc:1889
+#: etc/inc/shaper.inc:1894 etc/inc/shaper.inc:1952
+msgid "Upperlimit:"
+msgstr "Upperlimit:"
+
+#: etc/inc/shaper.inc:1901 etc/inc/shaper.inc:1903 etc/inc/shaper.inc:1904
+#: etc/inc/shaper.inc:1909 etc/inc/shaper.inc:1967
+msgid "The maximum allowed bandwidth for the queue."
+msgstr "A de largura de banda máxima permitida para esta fila."
+
+#: etc/inc/shaper.inc:1905 etc/inc/shaper.inc:1907 etc/inc/shaper.inc:1908
+#: etc/inc/shaper.inc:1913 etc/inc/shaper.inc:1971
+msgid "Real time:"
+msgstr "Tempo real:"
+
+#: etc/inc/shaper.inc:1920 etc/inc/shaper.inc:1922 etc/inc/shaper.inc:1923
+#: etc/inc/shaper.inc:1928 etc/inc/shaper.inc:1986
+msgid "The minimum required bandwidth for the queue."
+msgstr "A largura de banda mínima requerida para esta fila."
+
+#: etc/inc/shaper.inc:1924 etc/inc/shaper.inc:1926 etc/inc/shaper.inc:1927
+#: etc/inc/shaper.inc:1932 etc/inc/shaper.inc:1990
+msgid "Link share:"
+msgstr "Compartilhar Link:"
+
+#: etc/inc/shaper.inc:1939 etc/inc/shaper.inc:1941 etc/inc/shaper.inc:1942
+#: etc/inc/shaper.inc:1947 etc/inc/shaper.inc:2005
+msgid "The bandwidth share of a backlogged queue - this overrides priority."
+msgstr "A largura de banda compartilhada de uma fila de backlog - isso substitui a prioridade."
+
+#: etc/inc/shaper.inc:1941 etc/inc/shaper.inc:1943 etc/inc/shaper.inc:1944
+#: etc/inc/shaper.inc:1949 etc/inc/shaper.inc:2007
+msgid "The format for service curve specifications is (m1, d, m2). m2 controls the bandwidth assigned to the queue. m1 and d are optional and can be used to control the initial bandwidth assignment. For the first d milliseconds the queue gets the bandwidth given as m1, afterwards the value given in m2."
+msgstr "O formato para as especificações de curva de serviço é (m1, d, m2). m2 controla o tamanho da banda atribuída para a fila. m1 e d são opcionais e podem ser usados para controlar quantidade de banda inicial atribuida. Para os primeiros d milisegundos a fila obtém a largura de banda dado como m1, depois o valor dado em m2."
+
+#: etc/inc/shaper.inc:2190 etc/inc/shaper.inc:2192 etc/inc/shaper.inc:2193
+#: etc/inc/shaper.inc:2198 etc/inc/shaper.inc:2256
+msgid "Priority must be an integer between 1 and 7."
+msgstr "A prioridade deve ser um inteiro entre 1 e 7."
+
+#: etc/inc/shaper.inc:2356 etc/inc/shaper.inc:2622 etc/inc/shaper.inc:2358
+#: etc/inc/shaper.inc:2624 etc/inc/shaper.inc:2359 etc/inc/shaper.inc:2625
+#: etc/inc/shaper.inc:2364 etc/inc/shaper.inc:2630 etc/inc/shaper.inc:2427
+#: etc/inc/shaper.inc:2698
+msgid "Scheduler specific options"
+msgstr "Opções específicas do Agendador"
+
+#: etc/inc/shaper.inc:2360 etc/inc/shaper.inc:2362 etc/inc/shaper.inc:2363
+#: etc/inc/shaper.inc:2368 etc/inc/shaper.inc:2431
+msgid "Borrow from other queues when available"
+msgstr "Emprestar de outras filas quando disponíveis"
+
+#: etc/inc/shaper.inc:2465 etc/inc/shaper.inc:2467 etc/inc/shaper.inc:2468
+#: etc/inc/shaper.inc:2473 etc/inc/shaper.inc:2536
+msgid "Priority must be an integer between 1 and 255."
+msgstr "Prioridade deve ser um inteiro entre 1 e 255."
+
+#: etc/inc/shaper.inc:2628 etc/inc/shaper.inc:2630 etc/inc/shaper.inc:2631
+#: etc/inc/shaper.inc:2636 etc/inc/shaper.inc:2704
+msgid "Number of buckets available."
+msgstr "Número de buckets disponíveis."
+
+#: etc/inc/shaper.inc:2633 etc/inc/shaper.inc:2635 etc/inc/shaper.inc:2636
+#: etc/inc/shaper.inc:2641 etc/inc/shaper.inc:2709
+msgid "Bandwidth limit for hosts to not saturate link."
+msgstr "Limite da largura de banda para hosts não saturarem o link."
+
+#: etc/inc/shaper.inc:2797 etc/inc/shaper.inc:2799 etc/inc/shaper.inc:2800
+#: etc/inc/shaper.inc:2805 etc/inc/shaper.inc:2873 etc/inc/shaper.inc:2892
+msgid "Plr must be an integer between 1 and 100."
+msgstr "Plr deve ser um inteiro entre 1 e 100."
+
+#: etc/inc/shaper.inc:2800 etc/inc/shaper.inc:2802 etc/inc/shaper.inc:2803
+#: etc/inc/shaper.inc:2808 etc/inc/shaper.inc:2876 etc/inc/shaper.inc:2895
+#: etc/inc/shaper.inc:2897
+msgid "Buckets must be an integer between 16 and 65535."
+msgstr "Buckets deve ser um inteiro entre 16 e 65535."
+
+#: etc/inc/shaper.inc:2902 etc/inc/shaper.inc:2906 etc/inc/shaper.inc:2921
+#: etc/inc/shaper.inc:2922 etc/inc/shaper.inc:2927 etc/inc/shaper.inc:2995
+#: etc/inc/shaper.inc:3053 etc/inc/shaper.inc:3063
+msgid "Delay must be an integer."
+msgstr "Espera deve ser um inteiro."
+
+#: etc/inc/shaper.inc:3009 usr/local/www/services_snmp.php:276
+#: usr/local/www/services_snmp.php:336 usr/local/www/interfaces.php:1234
+#: usr/local/www/system_firmware.php:131
+#: usr/local/www/services_dnsmasq.php:154 usr/local/www/diag_routes.php:60
+#: usr/local/www/services_rfc2136_edit.php:128
+#: usr/local/www/vpn_ipsec_phase1.php:813 etc/inc/shaper.inc:3013
+#: usr/local/www/services_unbound.php:150 usr/local/www/interfaces.php:1338
+#: usr/local/www/services_snmp.php:274 usr/local/www/services_snmp.php:334
+#: usr/local/www/vpn_ipsec_phase1.php:826 etc/inc/shaper.inc:3143
+#: usr/local/www/services_dnsmasq.php:155 usr/local/www/diag_routes.php:61
+#: usr/local/www/system_firmware.php:138 usr/local/www/interfaces.php:1326
+#: usr/local/www/services_snmp.php:275 usr/local/www/services_snmp.php:335
+#: usr/local/www/vpn_ipsec_phase1.php:823
+#: usr/local/www/system_firmware.php:133
+#: usr/local/www/services_dnsmasq.php:159
+#: usr/local/www/vpn_ipsec_phase1.php:844 usr/local/www/services_snmp.php:285
+#: usr/local/www/services_snmp.php:345 usr/local/www/interfaces.php:1339
+#: etc/inc/shaper.inc:3144 usr/local/www/services_dnsmasq.php:161
+#: usr/local/www/interfaces.php:1381 etc/inc/shaper.inc:3151
+#: usr/local/www/services_dnsmasq.php:182 usr/local/www/interfaces.php:1376
+#: etc/inc/shaper.inc:3219 etc/inc/shaper.inc:3275
+#: usr/local/www/services_rfc2136_edit.php:133
+#: usr/local/www/interfaces.php:1389 etc/inc/shaper.inc:3297
+msgid "Enable"
+msgstr "Habilitar"
+
+#: etc/inc/shaper.inc:3014 etc/inc/shaper.inc:3018 etc/inc/shaper.inc:3148
+#: etc/inc/shaper.inc:3149 etc/inc/shaper.inc:3156 etc/inc/shaper.inc:3224
+#: etc/inc/shaper.inc:3280 etc/inc/shaper.inc:3302
+msgid "Enable limiter and its children"
+msgstr "Habilitar/Desabilitar limitador e seus dependentes"
+
+#: etc/inc/shaper.inc:3046 etc/inc/shaper.inc:3283 etc/inc/shaper.inc:3054
+#: etc/inc/shaper.inc:3295 etc/inc/shaper.inc:3202 etc/inc/shaper.inc:3450
+#: etc/inc/shaper.inc:3203 etc/inc/shaper.inc:3451 etc/inc/shaper.inc:3210
+#: etc/inc/shaper.inc:3458 etc/inc/shaper.inc:3278 etc/inc/shaper.inc:3526
+#: etc/inc/shaper.inc:3334 etc/inc/shaper.inc:3607 etc/inc/shaper.inc:3360
+#: etc/inc/shaper.inc:3633
+msgid "Mask"
+msgstr "Máscara"
+
+#: etc/inc/shaper.inc:3056 etc/inc/shaper.inc:3293 etc/inc/shaper.inc:3064
+#: etc/inc/shaper.inc:3305 etc/inc/shaper.inc:3212 etc/inc/shaper.inc:3460
+#: etc/inc/shaper.inc:3213 etc/inc/shaper.inc:3461 etc/inc/shaper.inc:3220
+#: etc/inc/shaper.inc:3468 etc/inc/shaper.inc:3288 etc/inc/shaper.inc:3536
+#: etc/inc/shaper.inc:3345 etc/inc/shaper.inc:3618 etc/inc/shaper.inc:3371
+#: etc/inc/shaper.inc:3644
+msgid "Source addresses"
+msgstr "Endereços fonte"
+
+#: etc/inc/shaper.inc:3060 etc/inc/shaper.inc:3297 etc/inc/shaper.inc:3068
+#: etc/inc/shaper.inc:3309 etc/inc/shaper.inc:3216 etc/inc/shaper.inc:3464
+#: etc/inc/shaper.inc:3217 etc/inc/shaper.inc:3465 etc/inc/shaper.inc:3224
+#: etc/inc/shaper.inc:3472 etc/inc/shaper.inc:3292 etc/inc/shaper.inc:3540
+#: etc/inc/shaper.inc:3349 etc/inc/shaper.inc:3622 etc/inc/shaper.inc:3375
+#: etc/inc/shaper.inc:3648
+msgid "Destination addresses"
+msgstr "Endereços de destino"
+
+#: etc/inc/shaper.inc:3063 etc/inc/shaper.inc:3300 etc/inc/shaper.inc:3071
+#: etc/inc/shaper.inc:3312 etc/inc/shaper.inc:3219 etc/inc/shaper.inc:3467
+#: etc/inc/shaper.inc:3220 etc/inc/shaper.inc:3468 etc/inc/shaper.inc:3227
+#: etc/inc/shaper.inc:3475 etc/inc/shaper.inc:3295 etc/inc/shaper.inc:3543
+msgid ""
+"If 'source' or 'destination' is chosen, \n"
+"a dynamic pipe with the bandwidth, delay, packet loss and queue size given above will \n"
+"be created for each source/destination IP address encountered, \n"
+"respectively. This makes it possible to easily specify bandwidth \n"
+"limits per host."
+msgstr ""
+"Se 'origem' ou 'destino' é escolhido, \n"
+"um pipe dinâmico com o tamanho de banda, atraso, perda de pacote e tamanho de fila dado acima serão \n"
+"criados para cada endereço IP de origem/destino encontrado, \n"
+"respectivamente. Isso faz com que seja possível especificar facilmente os limites de \n"
+"tamanho de banda por host."
+
+#: etc/inc/shaper.inc:3075 etc/inc/shaper.inc:3312 etc/inc/shaper.inc:3507
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:124
+#: usr/local/www/firewall_virtual_ip_edit.php:541
+#: usr/local/www/services_wol_edit.php:151
+#: usr/local/www/interfaces_gif_edit.php:211
+#: usr/local/www/interfaces_gre_edit.php:222
+#: usr/local/www/interfaces_groups_edit.php:264
+#: usr/local/www/firewall_aliases_edit.php:596
+#: usr/local/www/firewall_nat_1to1_edit.php:443
+#: usr/local/www/firewall_nat_edit.php:772
+#: usr/local/www/firewall_nat_out_edit.php:639
+#: usr/local/www/firewall_schedule_edit.php:796
+#: usr/local/www/firewall_schedule_edit.php:970
+#: usr/local/www/interfaces_vlan_edit.php:182
+#: usr/local/www/system_routes_edit.php:270
+#: usr/local/www/interfaces_qinq_edit.php:342
+#: usr/local/www/interfaces_wireless_edit.php:188
+#: usr/local/www/services_dhcp_edit.php:245
+#: usr/local/www/services_dnsmasq_edit.php:166
+#: usr/local/www/services_igmpproxy_edit.php:180
+#: usr/local/www/system_gateway_groups_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:264
+#: usr/local/www/services_dhcpv6_edit.php:222 etc/inc/shaper.inc:3083
+#: etc/inc/shaper.inc:3324 etc/inc/shaper.inc:3519
+#: usr/local/www/system_routes_edit.php:310
+#: usr/local/www/system_gateway_groups_edit.php:278
+#: usr/local/www/services_dnsmasq_edit.php:221
+#: usr/local/www/firewall_nat_1to1_edit.php:450
+#: usr/local/www/services_dhcpv6_edit.php:231
+#: usr/local/www/firewall_nat_npt_edit.php:269
+#: usr/local/www/firewall_nat_out_edit.php:652
+#: usr/local/www/services_igmpproxy_edit.php:182
+#: usr/local/www/firewall_aliases_edit.php:601
+#: usr/local/www/firewall_nat_edit.php:779
+#: usr/local/www/services_dhcp_edit.php:254
+#: usr/local/www/firewall_virtual_ip_edit.php:529
+#: usr/local/www/interfaces_gre_edit.php:221 etc/inc/shaper.inc:3231
+#: etc/inc/shaper.inc:3479 etc/inc/shaper.inc:3674
+#: usr/local/www/system_routes_edit.php:311
+#: usr/local/www/system_gateway_groups_edit.php:338
+#: usr/local/www/interfaces_vlan_edit.php:183
+#: usr/local/www/services_dnsmasq_edit.php:222
+#: usr/local/www/firewall_nat_1to1_edit.php:448
+#: usr/local/www/services_dhcpv6_edit.php:233
+#: usr/local/www/firewall_nat_npt_edit.php:268
+#: usr/local/www/interfaces_qinq_edit.php:343
+#: usr/local/www/interfaces_gif_edit.php:212
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:154
+#: usr/local/www/firewall_schedule_edit.php:795
+#: usr/local/www/firewall_schedule_edit.php:969
+#: usr/local/www/firewall_aliases_edit.php:604
+#: usr/local/www/interfaces_groups_edit.php:265
+#: usr/local/www/firewall_nat_edit.php:778
+#: usr/local/www/services_dhcp_edit.php:256
+#: usr/local/www/firewall_virtual_ip_edit.php:474
+#: usr/local/www/interfaces_wireless_edit.php:190
+#: usr/local/www/services_dhcpv6_edit.php:236
+#: usr/local/www/interfaces_vlan_edit.php:186
+#: usr/local/www/firewall_nat_edit.php:773
+#: usr/local/www/interfaces_gif_edit.php:223
+#: usr/local/www/services_dhcp_edit.php:384
+#: usr/local/www/firewall_virtual_ip_edit.php:466
+#: usr/local/www/firewall_nat_out_edit.php:654
+#: usr/local/www/interfaces_qinq_edit.php:346 etc/inc/shaper.inc:3232
+#: etc/inc/shaper.inc:3480 etc/inc/shaper.inc:3675
+#: usr/local/www/firewall_nat_edit.php:785
+#: usr/local/www/firewall_virtual_ip_edit.php:486
+#: usr/local/www/system_routes_edit.php:334
+#: usr/local/www/system_gateway_groups_edit.php:339
+#: usr/local/www/firewall_aliases_edit.php:635
+#: usr/local/www/firewall_nat_out_edit.php:666 etc/inc/shaper.inc:3239
+#: etc/inc/shaper.inc:3487 etc/inc/shaper.inc:3682
+#: usr/local/www/firewall_nat_edit.php:786
+#: usr/local/www/system_routes_edit.php:343 etc/inc/shaper.inc:3307
+#: etc/inc/shaper.inc:3555 etc/inc/shaper.inc:3750
+#: usr/local/www/system_routes_edit.php:345 etc/inc/shaper.inc:3384
+#: etc/inc/shaper.inc:3657 etc/inc/shaper.inc:3855
+#: usr/local/www/firewall_virtual_ip_edit.php:491
+#: usr/local/www/firewall_aliases_edit.php:634 etc/inc/shaper.inc:3410
+#: etc/inc/shaper.inc:3683 etc/inc/shaper.inc:3881
+msgid "You may enter a description here for your reference (not parsed)."
+msgstr "Você pode inserir uma descrição aqui para sua referência (não analisado)."
+
+#: etc/inc/shaper.inc:3081 etc/inc/shaper.inc:3318
+#: usr/local/www/interfaces_bridge_edit.php:281
+#: usr/local/www/interfaces_ppps_edit.php:738 etc/inc/shaper.inc:3089
+#: etc/inc/shaper.inc:3330 usr/local/www/interfaces_bridge_edit.php:290
+#: etc/inc/shaper.inc:3237 etc/inc/shaper.inc:3485
+#: usr/local/www/interfaces_ppps_edit.php:739
+#: usr/local/www/interfaces_bridge_edit.php:291
+#: usr/local/www/interfaces_ppps_edit.php:745
+#: usr/local/www/interfaces_bridge_edit.php:292 etc/inc/shaper.inc:3238
+#: etc/inc/shaper.inc:3486 etc/inc/shaper.inc:3245 etc/inc/shaper.inc:3493
+#: usr/local/www/interfaces_ppps_edit.php:743
+#: usr/local/www/interfaces_bridge_edit.php:294 etc/inc/shaper.inc:3313
+#: etc/inc/shaper.inc:3561 etc/inc/shaper.inc:3390 etc/inc/shaper.inc:3663
+#: etc/inc/shaper.inc:3416 etc/inc/shaper.inc:3689
+msgid "Show advanced options"
+msgstr "Exibir opções avançadas"
+
+#: etc/inc/shaper.inc:3085 etc/inc/shaper.inc:3093
+#: usr/local/www/status_ntpd.php:115 etc/inc/shaper.inc:3241
+#: usr/local/www/status_ntpd.php:131 etc/inc/shaper.inc:3242
+#: usr/local/www/status_ntpd.php:137 etc/inc/shaper.inc:3249
+#: etc/inc/shaper.inc:3317 etc/inc/shaper.inc:3394 etc/inc/shaper.inc:3420
+msgid "Delay"
+msgstr "Atraso"
+
+#: etc/inc/shaper.inc:3089 etc/inc/shaper.inc:3097 etc/inc/shaper.inc:3245
+#: etc/inc/shaper.inc:3246 etc/inc/shaper.inc:3253 etc/inc/shaper.inc:3321
+#: etc/inc/shaper.inc:3398 etc/inc/shaper.inc:3424
+msgid "Hint: in most cases, you should specify 0 here (or leave the field empty)"
+msgstr "Dica: na maioria dos casos, você deve especificar 0 aqui (ou deixe o campo vazio)"
+
+#: etc/inc/shaper.inc:3093 etc/inc/shaper.inc:3329 etc/inc/shaper.inc:3101
+#: etc/inc/shaper.inc:3341 etc/inc/shaper.inc:3249 etc/inc/shaper.inc:3496
+#: etc/inc/shaper.inc:3250 etc/inc/shaper.inc:3497 etc/inc/shaper.inc:3257
+#: etc/inc/shaper.inc:3504 etc/inc/shaper.inc:3325 etc/inc/shaper.inc:3572
+#: etc/inc/shaper.inc:3402 etc/inc/shaper.inc:3674 etc/inc/shaper.inc:3428
+#: etc/inc/shaper.inc:3700
+msgid "Packet loss rate"
+msgstr "Taxa de perda de pacote"
+
+#: etc/inc/shaper.inc:3097 etc/inc/shaper.inc:3333 etc/inc/shaper.inc:3105
+#: etc/inc/shaper.inc:3345 etc/inc/shaper.inc:3253 etc/inc/shaper.inc:3500
+#: etc/inc/shaper.inc:3254 etc/inc/shaper.inc:3501 etc/inc/shaper.inc:3261
+#: etc/inc/shaper.inc:3508 etc/inc/shaper.inc:3329 etc/inc/shaper.inc:3576
+#: etc/inc/shaper.inc:3406 etc/inc/shaper.inc:3678 etc/inc/shaper.inc:3432
+#: etc/inc/shaper.inc:3704
+msgid "Hint: in most cases, you should specify 0 here (or leave the field empty). A value of 0.001 means one packet in 1000 gets dropped"
+msgstr "Dica: na maioria dos casos, você deve especificar 0 aqui (ou deixe o campo vazio). Um valor de 0.001 significa um pacote em 1000 é descartado"
+
+#: etc/inc/shaper.inc:3102 etc/inc/shaper.inc:3338 etc/inc/shaper.inc:3110
+#: etc/inc/shaper.inc:3350 etc/inc/shaper.inc:3258 etc/inc/shaper.inc:3505
+#: etc/inc/shaper.inc:3259 etc/inc/shaper.inc:3506 etc/inc/shaper.inc:3266
+#: etc/inc/shaper.inc:3513 etc/inc/shaper.inc:3334 etc/inc/shaper.inc:3581
+#: etc/inc/shaper.inc:3411 etc/inc/shaper.inc:3683 etc/inc/shaper.inc:3437
+#: etc/inc/shaper.inc:3709
+msgid "Queue Size"
+msgstr "Tamanho da Fila"
+
+#: etc/inc/shaper.inc:3107 etc/inc/shaper.inc:3343 etc/inc/shaper.inc:3115
+#: etc/inc/shaper.inc:3355 etc/inc/shaper.inc:3263 etc/inc/shaper.inc:3510
+#: etc/inc/shaper.inc:3264 etc/inc/shaper.inc:3511 etc/inc/shaper.inc:3271
+#: etc/inc/shaper.inc:3518 etc/inc/shaper.inc:3339 etc/inc/shaper.inc:3586
+#: etc/inc/shaper.inc:3416 etc/inc/shaper.inc:3688 etc/inc/shaper.inc:3442
+#: etc/inc/shaper.inc:3714
+msgid "Hint: in most cases, you should leave the field empty. All packets in this pipe are placed into a fixed-size queue first, then they are delayed by value specified in the Delay field, and then they are delivered to their destination."
+msgstr "Dica: na maioria dos casos, você deve deixar o campo vazio. Todos os pacotes nesse pipe são colocados em uma lista de tamanho fixo primeiro, então eles são atrasados com o valor especificado no campo Atraso, e então eles são entregues aos seus destinos."
+
+#: etc/inc/shaper.inc:3113 etc/inc/shaper.inc:3349 etc/inc/shaper.inc:3121
+#: etc/inc/shaper.inc:3361 etc/inc/shaper.inc:3269 etc/inc/shaper.inc:3516
+#: etc/inc/shaper.inc:3270 etc/inc/shaper.inc:3517 etc/inc/shaper.inc:3277
+#: etc/inc/shaper.inc:3524 etc/inc/shaper.inc:3345 etc/inc/shaper.inc:3592
+#: etc/inc/shaper.inc:3422 etc/inc/shaper.inc:3694 etc/inc/shaper.inc:3448
+#: etc/inc/shaper.inc:3720
+msgid "Bucket Size"
+msgstr "Tamanho do bucket"
+
+#: etc/inc/shaper.inc:3118 etc/inc/shaper.inc:3354 etc/inc/shaper.inc:3126
+#: etc/inc/shaper.inc:3366 etc/inc/shaper.inc:3274 etc/inc/shaper.inc:3521
+#: etc/inc/shaper.inc:3275 etc/inc/shaper.inc:3522 etc/inc/shaper.inc:3282
+#: etc/inc/shaper.inc:3529 etc/inc/shaper.inc:3350 etc/inc/shaper.inc:3597
+#: etc/inc/shaper.inc:3427 etc/inc/shaper.inc:3699 etc/inc/shaper.inc:3453
+#: etc/inc/shaper.inc:3725
+msgid "Hint: in most cases, you should leave the field empty. It increases the hash size set."
+msgstr "Dica: na maioria dos casos, você deve deixar o campo vazio. Ele aumenta o conjunto de tamanhos de hash."
+
+#: etc/inc/shaper.inc:3176 etc/inc/shaper.inc:3184 etc/inc/shaper.inc:3339
+#: etc/inc/shaper.inc:3340 etc/inc/shaper.inc:3347 etc/inc/shaper.inc:3415
+#: etc/inc/shaper.inc:3495 etc/inc/shaper.inc:3521
+msgid "Weight must be an integer between 1 and 100."
+msgstr "Peso deve ser um inteiro entre 1 e 100."
+
+#: etc/inc/shaper.inc:3274 etc/inc/shaper.inc:3282 etc/inc/shaper.inc:3437
+#: etc/inc/shaper.inc:3438 etc/inc/shaper.inc:3445 etc/inc/shaper.inc:3513
+#: etc/inc/shaper.inc:3594 etc/inc/shaper.inc:3620
+msgid "Enable/Disable queue"
+msgstr "Habilita/Desabilita fila"
+
+#: etc/inc/shaper.inc:3289 usr/local/www/firewall_rules.php:760
+#: usr/local/www/firewall_rules_edit.php:1224
+#: usr/local/www/firewall_rules_edit.php:1231
+#: usr/local/www/diag_system_pftop.php:107
+#: usr/local/www/interfaces_lagg_edit.php:201
+#: usr/local/www/load_balancer_virtual_server_edit.php:234
+#: usr/local/www/vpn_openvpn_client.php:519 etc/inc/shaper.inc:3301
+#: usr/local/www/firewall_rules_edit.php:1259
+#: usr/local/www/firewall_rules_edit.php:1266
+#: usr/local/www/firewall_rules.php:757
+#: usr/local/www/load_balancer_virtual_server_edit.php:223
+#: usr/local/www/vpn_openvpn_client.php:524 etc/inc/shaper.inc:3456
+#: usr/local/www/vpn_ipsec_mobile.php:403
+#: usr/local/www/interfaces_lagg_edit.php:202
+#: usr/local/www/firewall_rules.php:750
+#: usr/local/www/load_balancer_virtual_server_edit.php:221
+#: usr/local/www/vpn_openvpn_client.php:542
+#: usr/local/www/vpn_openvpn_client.php:561
+#: usr/local/www/firewall_rules_edit.php:1274
+#: usr/local/www/firewall_rules_edit.php:1281
+#: usr/local/www/interfaces_lagg_edit.php:215 etc/inc/shaper.inc:3457
+#: usr/local/www/firewall_rules_edit.php:1283
+#: usr/local/www/firewall_rules_edit.php:1289
+#: usr/local/www/firewall_rules.php:749 etc/inc/shaper.inc:3464
+#: usr/local/www/firewall_rules_edit.php:1282
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/interfaces_lagg_edit.php:214 etc/inc/shaper.inc:3532
+#: etc/inc/shaper.inc:3614 usr/local/www/firewall_rules_edit.php:1330
+#: usr/local/www/firewall_rules_edit.php:1336 etc/inc/shaper.inc:3640
+msgid "none"
+msgstr "nenhum"
+
+#: etc/inc/shaper.inc:3321 usr/local/www/system_gateways_edit.php:424
+#: etc/inc/shaper.inc:3333 usr/local/www/system_gateways_edit.php:445
+#: etc/inc/shaper.inc:3488 usr/local/www/system_gateways_edit.php:551
+#: usr/local/www/system_gateways_edit.php:555 etc/inc/shaper.inc:3489
+#: usr/local/www/system_gateways_edit.php:557 etc/inc/shaper.inc:3496
+#: usr/local/www/system_gateways_edit.php:587 etc/inc/shaper.inc:3564
+#: etc/inc/shaper.inc:3666 etc/inc/shaper.inc:3692
+msgid "Weight"
+msgstr "Peso"
+
+#: etc/inc/shaper.inc:3325 etc/inc/shaper.inc:3337 etc/inc/shaper.inc:3492
+#: etc/inc/shaper.inc:3493 etc/inc/shaper.inc:3500 etc/inc/shaper.inc:3568
+#: etc/inc/shaper.inc:3670 etc/inc/shaper.inc:3696
+msgid "Hint: For queues under the same parent this specifies the share that a queue gets(values range from 1 to 100, you can leave it blank otherwise)"
+msgstr "Dica: Para filas abaixo do mesmo pai, isso especifica o compartilhamento que a fila obtém (o intervalo de valores é de 1 a 100, do contrário, você pode deixá-lo em branco)"
+
+#: etc/inc/shaper.inc:3353 etc/inc/shaper.inc:3365 etc/inc/shaper.inc:3520
+#: etc/inc/shaper.inc:3521 etc/inc/shaper.inc:3528 etc/inc/shaper.inc:3596
+#: etc/inc/shaper.inc:3698 etc/inc/shaper.inc:3724
+msgid "slots"
+msgstr "slots"
+
+#: etc/inc/shaper.inc:3494 etc/inc/shaper.inc:3506 etc/inc/shaper.inc:3661
+#: etc/inc/shaper.inc:3662 etc/inc/shaper.inc:3669 etc/inc/shaper.inc:3737
+#: etc/inc/shaper.inc:3842 etc/inc/shaper.inc:3868
+msgid "Enable/Disable layer7 Container"
+msgstr "Habilitar/Desabilitar Contêiner de layer7"
+
+#: etc/inc/shaper.inc:3744 etc/inc/shaper.inc:3756 etc/inc/shaper.inc:3911
+#: etc/inc/shaper.inc:3912 etc/inc/shaper.inc:3919 etc/inc/shaper.inc:3987
+#: etc/inc/shaper.inc:4092 etc/inc/shaper.inc:4118
+#, php-format
+msgid "Sending HUP signal to %s"
+msgstr "Enviando sinal HUP para %s"
+
+#: etc/inc/shaper.inc:4052 etc/inc/shaper.inc:4112 etc/inc/shaper.inc:4269
+#: etc/inc/shaper.inc:4270 etc/inc/shaper.inc:4277 etc/inc/shaper.inc:4345
+#: etc/inc/shaper.inc:4450 etc/inc/shaper.inc:4476
+msgid " Clone shaper/queue on this interface"
+msgstr " Modelador/fila de clone nessa interface"
+
+#: etc/inc/shaper.inc:4060 etc/inc/shaper.inc:4067 etc/inc/shaper.inc:4120
+#: etc/inc/shaper.inc:4127 etc/inc/shaper.inc:4277 etc/inc/shaper.inc:4284
+#: etc/inc/shaper.inc:4278 etc/inc/shaper.inc:4285 etc/inc/shaper.inc:4292
+#: etc/inc/shaper.inc:4353 etc/inc/shaper.inc:4360 etc/inc/shaper.inc:4458
+#: etc/inc/shaper.inc:4465 etc/inc/shaper.inc:4484 etc/inc/shaper.inc:4491
+#, php-format
+msgid "Welcome to the %s Traffic Shaper."
+msgstr "Bem-vindo ao Traffic Shaper %s."
+
+#: etc/inc/shaper.inc:4061 etc/inc/shaper.inc:4068 etc/inc/shaper.inc:4121
+#: etc/inc/shaper.inc:4128 etc/inc/shaper.inc:4278 etc/inc/shaper.inc:4285
+#: etc/inc/shaper.inc:4279 etc/inc/shaper.inc:4286 etc/inc/shaper.inc:4293
+#: etc/inc/shaper.inc:4354 etc/inc/shaper.inc:4361 etc/inc/shaper.inc:4459
+#: etc/inc/shaper.inc:4466 etc/inc/shaper.inc:4485 etc/inc/shaper.inc:4492
+msgid "The tree on the left helps you navigate through the queues <br />buttons at the bottom represent queue actions and are activated accordingly."
+msgstr "A árvore do lado esquerdo ajuda-o a navegar através das filas <br /> botões no rodapé representam ações de filas e são ativados de acordo com as filas."
+
+#: etc/inc/system.inc:430 etc/inc/system.inc:449 etc/inc/system.inc:457
+#, php-format
+msgid "Static Routes: Gateway IP could not be found for %s"
+msgstr "Rotas estáticas: IP do Gateway não pôde ser encontrado para %s"
+
+#: etc/inc/system.inc:497 etc/inc/system.inc:529 etc/inc/system.inc:533
+#: etc/inc/system.inc:547
+msgid "Starting syslog..."
+msgstr "Iniciando syslog..."
+
+#: etc/inc/system.inc:536 etc/inc/system.inc:568 etc/inc/system.inc:572
+#: etc/inc/system.inc:695
+#, php-format
+msgid "Error: cannot open syslog.conf in system_syslogd_start().%s"
+msgstr "Erro: Não pôde abrir syslog.conf em system_syslogd_start().%s"
+
+#: etc/inc/system.inc:664 etc/inc/system.inc:712 etc/inc/system.inc:716
+#: etc/inc/system.inc:725
+msgid "Initializing PCMCIA..."
+msgstr "Inicializando PCMCIA..."
+
+#: etc/inc/system.inc:676 etc/inc/system.inc:761 etc/inc/system.inc:1412
+#: etc/inc/system.inc:1415 etc/inc/system.inc:724 etc/inc/system.inc:808
+#: etc/inc/system.inc:1469 etc/inc/system.inc:1472 etc/inc/system.inc:728
+#: etc/inc/system.inc:806 etc/inc/system.inc:1511 etc/inc/system.inc:1514
+#: etc/inc/system.inc:737 etc/inc/system.inc:817 etc/inc/system.inc:1460
+#: etc/inc/system.inc:1463 etc/inc/system.inc:1487 etc/inc/system.inc:1490
+msgid "failed!"
+msgstr "falhou!"
+
+#: etc/inc/system.inc:687 etc/inc/system.inc:735 etc/inc/system.inc:739
+#: etc/inc/system.inc:748
+msgid "Starting webConfigurator..."
+msgstr "Iniciando webConfigurator..."
+
+#: etc/inc/system.inc:719 etc/inc/system.inc:767 etc/inc/system.inc:771
+#: etc/inc/system.inc:775
+msgid "webConfigurator default"
+msgstr "webConfigurator padrão"
+
+#: etc/inc/system.inc:729 etc/inc/system.inc:777 etc/inc/system.inc:781
+#: etc/inc/system.inc:785
+msgid "Importing HTTPS certificate"
+msgstr "Importar certificados HTTPS"
+
+#: etc/inc/system.inc:1115 etc/inc/system.inc:1167 etc/inc/system.inc:1147
+#: etc/inc/system.inc:1096 etc/inc/system.inc:1103
+#, php-format
+msgid "Error: cannot open cert.pem in system_webgui_start().%s"
+msgstr "Erro: não pôde abrir cert.pem em system_webgui_start().%s"
+
+#: etc/inc/system.inc:1126 etc/inc/system.inc:1178 etc/inc/system.inc:1158
+#: etc/inc/system.inc:1107 etc/inc/system.inc:1114
+#, php-format
+msgid "Error: cannot open ca.pem in system_webgui_start().%s"
+msgstr "Erro: não pôde abrir ca.pem em system_webgui_start().%s"
+
+#: etc/inc/system.inc:1134 etc/inc/system.inc:1186 etc/inc/system.inc:1166
+#: etc/inc/system.inc:1115 etc/inc/system.inc:1122
+msgid "ssl configuration"
+msgstr "configuração ssl"
+
+#: etc/inc/system.inc:1161 etc/inc/system.inc:1213 etc/inc/system.inc:1193
+#: etc/inc/system.inc:1142 etc/inc/system.inc:1169
+#, php-format
+msgid "Error: cannot open %s in system_generate_lighty_config().%s"
+msgstr "Erro: não pôde abrir %s em system_generate_lighty_config().%s"
+
+#: etc/inc/system.inc:1181 etc/inc/system.inc:1233 etc/inc/system.inc:1213
+#: etc/inc/system.inc:1162 etc/inc/system.inc:1189
+msgid "Setting timezone..."
+msgstr "Configurando fuso horário..."
+
+#: etc/inc/system.inc:1270 etc/inc/system.inc:1326 etc/inc/system.inc:1368
+#: etc/inc/system.inc:1310 etc/inc/system.inc:1337
+msgid "Syncing system time before startup..."
+msgstr "Sincronizando horário do sistema antes de iniciar..."
+
+#: etc/inc/system.inc:1376 etc/inc/system.inc:1433 etc/inc/system.inc:1475
+#: etc/inc/system.inc:1424 etc/inc/system.inc:1451
+#, php-format
+msgid "Error: cannot open dmesg.boot in system_dmesg_save().%s"
+msgstr "Erro: não pôde abrir dmesg.boot em system_dmesg_save().%s"
+
+#: etc/inc/system.inc:1397 etc/inc/system.inc:1454 etc/inc/system.inc:1496
+#: etc/inc/system.inc:1445 etc/inc/system.inc:1472
+msgid "Setting hard disk standby... "
+msgstr "Configurando modo de espera do disco rígido..."
+
+#: etc/inc/system.inc:1514 etc/inc/system.inc:1571 etc/inc/system.inc:1613
+#: etc/inc/system.inc:1562 etc/inc/system.inc:1589
+msgid "Generic PC"
+msgstr "PC Genérico"
+
+#: etc/inc/system.inc:1517 etc/inc/system.inc:1574 etc/inc/system.inc:1616
+#: etc/inc/system.inc:1565 etc/inc/system.inc:1592
+msgid "Generic PC (CD-ROM)"
+msgstr "PC Genérico (CD-ROM)"
+
+# Trata-se de um modelo de RouterBoard, acho válido preservar o modelo.
+#: etc/inc/system.inc:1526 etc/inc/system.inc:1583 etc/inc/system.inc:1625
+#: etc/inc/system.inc:1574 etc/inc/system.inc:1601
+msgid "PC Engines WRAP"
+msgstr "PC Engines WRAP"
+
+# Trata-se de um modelo de RouterBoard, acho prudente preservar o modelo.
+#: etc/inc/system.inc:1529 etc/inc/system.inc:1586 etc/inc/system.inc:1628
+#: etc/inc/system.inc:1577 etc/inc/system.inc:1604
+msgid "PC Engines ALIX"
+msgstr "Pc Engines ALIX"
+
+#: etc/inc/system.inc:1541 etc/inc/system.inc:1598 etc/inc/system.inc:1640
+#: etc/inc/system.inc:1589 etc/inc/system.inc:1616
+msgid "embedded (unknown)"
+msgstr "embarcado (desconhecido)"
+
+#: etc/inc/util.inc:99 etc/inc/util.inc:101
+#, php-format
+msgid "WARNING: Could not mark subsystem: %s dirty"
+msgstr "ADVERTÊNCIA: Não pôde marcar subsistema: %s sujo"
+
+#: etc/inc/util.inc:119 etc/inc/util.inc:121
+msgid "WARNING: You must give a name as parameter to lock() function."
+msgstr "ADVERTÊNCIA: Você deve dar um nome como parâmetro para a função lock()."
+
+#: etc/inc/util.inc:213 etc/inc/util.inc:208 etc/inc/util.inc:238
+#: etc/inc/util.inc:240
+#, php-format
+msgid "Reference %s is going negative, not doing unreference."
+msgstr "Referência %s está se tornando negavita, não desreferenciando."
+
+#: etc/inc/util.inc:980 etc/inc/util.inc:981 etc/inc/util.inc:1026
+#: etc/inc/util.inc:1076 etc/inc/util.inc:1080 etc/inc/util.inc:1084
+#, php-format
+msgid "The command '%1$s' returned exit code '%2$d', the output was '%3$s' "
+msgstr "O comando '%1$s' retornou o código de saída '%2$d', a saída foi '%3$s' "
+
+#: etc/inc/vpn.inc:126 etc/inc/vpn.inc:134 etc/inc/vpn.inc:133
+#: etc/inc/vpn.inc:135
+msgid "Configuring IPsec VPN... "
+msgstr "Configurando VPN do IPsec..."
+
+#: etc/inc/vpn.inc:229 etc/inc/vpn.inc:228 etc/inc/vpn.inc:238
+#: etc/inc/vpn.inc:237 etc/inc/vpn.inc:236
+#, php-format
+msgid "Error: Invalid certificate info for %s"
+msgstr "Erro: Info de certificado inválido para %s"
+
+#: etc/inc/vpn.inc:235 etc/inc/vpn.inc:234 etc/inc/vpn.inc:244
+#: etc/inc/vpn.inc:243 etc/inc/vpn.inc:242
+#, php-format
+msgid "Error: Invalid certificate hash info for %s"
+msgstr "Erro: Info de hash de certificado inválido para %s"
+
+#: etc/inc/vpn.inc:240 etc/inc/vpn.inc:239 etc/inc/vpn.inc:249
+#: etc/inc/vpn.inc:248 etc/inc/vpn.inc:247
+#, php-format
+msgid "Error: Cannot write IPsec CA file for %s"
+msgstr "Erro: Não pode escrever arquivo de IPsec CA para %s"
+
+#: etc/inc/vpn.inc:249 etc/inc/vpn.inc:248
+#, php-format
+msgid "Error: cannot open psk.txt in vpn_ipsec_configure()."
+msgstr "Erro: não pode abrir psk.txt em vpn_ipsec_configure()."
+
+#: etc/inc/vpn.inc:312 etc/inc/vpn.inc:311
+#, php-format
+msgid "Error: cannot open racoon.conf in vpn_ipsec_configure()."
+msgstr "Erro: não pode abrir racoon.conf em vpn_ipsec_configure()."
+
+#: etc/inc/vpn.inc:404 etc/inc/vpn.inc:403
+#, php-format
+msgid "Error: cannot open server %s in vpn.\n"
+msgstr "Erro: não foi possível abrir servidor %s na vpn.\n"
+
+#: etc/inc/vpn.inc:560 etc/inc/vpn.inc:559 etc/inc/vpn.inc:546
+#: etc/inc/vpn.inc:549 etc/inc/vpn.inc:548 etc/inc/vpn.inc:550
+#, php-format
+msgid "Error: Invalid phase1 certificate reference for %s"
+msgstr "Erro: Referência de certificado da fase1 inválida para %s"
+
+#: etc/inc/vpn.inc:569 etc/inc/vpn.inc:568 etc/inc/vpn.inc:555
+#: etc/inc/vpn.inc:558 etc/inc/vpn.inc:557 etc/inc/vpn.inc:559
+#, php-format
+msgid "Error: Cannot write phase1 certificate file for %s"
+msgstr "Erro: Não pode escrever arquivo de certificado da fase1 para %s"
+
+#: etc/inc/vpn.inc:580 etc/inc/vpn.inc:579 etc/inc/vpn.inc:566
+#: etc/inc/vpn.inc:569 etc/inc/vpn.inc:568 etc/inc/vpn.inc:570
+#, php-format
+msgid "Error: Cannot write phase1 key file for %s"
+msgstr "Erro: Não pode escrever arquivo de chave da fase1 para %s"
+
+#: etc/inc/vpn.inc:593 etc/inc/vpn.inc:592 etc/inc/vpn.inc:579
+#: etc/inc/vpn.inc:582 etc/inc/vpn.inc:581 etc/inc/vpn.inc:583
+#, php-format
+msgid "Error: Cannot write phase1 CA certificate file for %s"
+msgstr "Erro: não foi possível escrever o arquivo certificado CA phase1 para %s "
+
+#: etc/inc/vpn.inc:826 etc/inc/vpn.inc:829
+#, php-format
+msgid "Error: cannot open spd.conf in vpn_ipsec_configure()."
+msgstr "Erro: não foi possível abrir spd.conf na vpn_ipsec_configure()."
+
+#: etc/inc/vpn.inc:1008 etc/inc/vpn.inc:1014 etc/inc/vpn.inc:1013
+#: etc/inc/vpn.inc:1022 etc/inc/vpn.inc:1035 etc/inc/vpn.inc:1034
+#: etc/inc/vpn.inc:1036
+msgid "Forcefully reloading IPsec racoon daemon"
+msgstr "Recarga forçada do processo IPsec racoon"
+
+#: etc/inc/vpn.inc:1052 etc/inc/vpn.inc:1058 etc/inc/vpn.inc:1056
+#: etc/inc/vpn.inc:1065 etc/inc/vpn.inc:1078 etc/inc/vpn.inc:1077
+#: etc/inc/vpn.inc:1079
+msgid "Configuring PPTP VPN service... "
+msgstr "Configurando o serviço PPTP VPN..."
+
+#: etc/inc/vpn.inc:1062 etc/inc/vpn.inc:1068 etc/inc/vpn.inc:1066
+#: etc/inc/vpn.inc:1075 etc/inc/vpn.inc:1088 etc/inc/vpn.inc:1087
+#: etc/inc/vpn.inc:1089
+msgid "Could not kill mpd within 3 seconds. Trying again."
+msgstr "Não foi possível matar mpd em 3 segundos. Tente novamente."
+
+#: etc/inc/vpn.inc:1085 etc/inc/vpn.inc:1091 etc/inc/vpn.inc:1089
+#: etc/inc/vpn.inc:1098 etc/inc/vpn.inc:1111 etc/inc/vpn.inc:1110
+#: etc/inc/vpn.inc:1112
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_pptpd_configure()."
+msgstr "Erro: não pôde abrir mdp.conf em vpn_pptpd_configure()."
+
+#: etc/inc/vpn.inc:1198 etc/inc/vpn.inc:1204 etc/inc/vpn.inc:1202
+#: etc/inc/vpn.inc:1212 etc/inc/vpn.inc:1225 etc/inc/vpn.inc:1224
+#: etc/inc/vpn.inc:1226
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_pptpd_configure()."
+msgstr "Erro: não pôde abrir mpd.links em vpn_pptpd_configure()."
+
+#: etc/inc/vpn.inc:1222 etc/inc/vpn.inc:1228 etc/inc/vpn.inc:1226
+#: etc/inc/vpn.inc:1237 etc/inc/vpn.inc:1250 etc/inc/vpn.inc:1249
+#: etc/inc/vpn.inc:1251
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_pptpd_configure()."
+msgstr "Erro: não pôde abrir mpd.secret em vpn_pptpd_configure()."
+
+#: etc/inc/vpn.inc:1279 etc/inc/vpn.inc:1285 etc/inc/vpn.inc:1283
+#: etc/inc/vpn.inc:1295 etc/inc/vpn.inc:1308 etc/inc/vpn.inc:1307
+#: etc/inc/vpn.inc:1309
+msgid "Configuring PPPoE Server service... "
+msgstr "Configurando serviço PPPoE da VPN..."
+
+#: etc/inc/vpn.inc:1303 etc/inc/vpn.inc:1309 etc/inc/vpn.inc:1307
+#: etc/inc/vpn.inc:1319 etc/inc/vpn.inc:1332 etc/inc/vpn.inc:1331
+#: etc/inc/vpn.inc:1333
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_pppoe_configure()."
+msgstr "Erro: não se pode abrir mpd.conf em vpn_pppoe_configure()."
+
+#: etc/inc/vpn.inc:1406 etc/inc/vpn.inc:1412 etc/inc/vpn.inc:1410
+#: etc/inc/vpn.inc:1423 etc/inc/vpn.inc:1436 etc/inc/vpn.inc:1435
+#: etc/inc/vpn.inc:1437
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_pppoe_configure()."
+msgstr "Erro: não se pode abrir mpd.links em vpn_pppoe_configure()."
+
+#: etc/inc/vpn.inc:1432 etc/inc/vpn.inc:1438 etc/inc/vpn.inc:1436
+#: etc/inc/vpn.inc:1450 etc/inc/vpn.inc:1463 etc/inc/vpn.inc:1462
+#: etc/inc/vpn.inc:1464
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_pppoe_configure()."
+msgstr "Erro: não se pode abrir mpd.secret em vpn_pppoe_configure()."
+
+#: etc/inc/vpn.inc:1460 usr/local/www/system_firmware_check.php:139
+#: etc/inc/vpn.inc:1470 etc/inc/vpn.inc:1468
+#: usr/local/www/system_firmware_check.php:141 etc/inc/vpn.inc:1483
+#: usr/local/www/system_firmware_check.php:133 etc/inc/vpn.inc:1496
+#: etc/inc/vpn.inc:1495 etc/inc/vpn.inc:1497
+msgid "done"
+msgstr "feito"
+
+#: etc/inc/vpn.inc:1479 etc/inc/vpn.inc:1489 etc/inc/vpn.inc:1487
+#: etc/inc/vpn.inc:1502 etc/inc/vpn.inc:1515 etc/inc/vpn.inc:1514
+#: etc/inc/vpn.inc:1516
+msgid "Configuring l2tp VPN service... "
+msgstr "Configurando o serviço VPN l2tp..."
+
+#: etc/inc/vpn.inc:1504 etc/inc/vpn.inc:1514 etc/inc/vpn.inc:1512
+#: etc/inc/vpn.inc:1527 etc/inc/vpn.inc:1540 etc/inc/vpn.inc:1539
+#: etc/inc/vpn.inc:1541
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_l2tp_configure()."
+msgstr "Erro: não se pode abrir mpd.conf em vpn_l2tp_configure()."
+
+#: etc/inc/vpn.inc:1597 etc/inc/vpn.inc:1607 etc/inc/vpn.inc:1605
+#: etc/inc/vpn.inc:1621 etc/inc/vpn.inc:1634 etc/inc/vpn.inc:1633
+#: etc/inc/vpn.inc:1635
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_l2tp_configure()."
+msgstr "Erro: não se pode abrir mpd.links em vpn_l2tp_configure()."
+
+#: etc/inc/vpn.inc:1622 etc/inc/vpn.inc:1632 etc/inc/vpn.inc:1630
+#: etc/inc/vpn.inc:1647 etc/inc/vpn.inc:1660 etc/inc/vpn.inc:1659
+#: etc/inc/vpn.inc:1661
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_l2tp_configure()."
+msgstr "Erro: não se pode abrir mpd.secret em vpn_l2tp_configure()."
+
+#: etc/inc/vpn.inc:1769 etc/inc/vpn.inc:1779 etc/inc/vpn.inc:1764
+#: etc/inc/vpn.inc:1836 etc/inc/vpn.inc:1849 etc/inc/vpn.inc:1846
+#: etc/inc/vpn.inc:1848
+#, php-format
+msgid "Could not determine VPN endpoint for '%s'"
+msgstr "Não foi possível determinar o ponto final da VPN para '%s'"
+
+#: etc/inc/vpn.inc:1774 etc/inc/vpn.inc:1784 etc/inc/vpn.inc:1769
+#: etc/inc/vpn.inc:1841 etc/inc/vpn.inc:1854 etc/inc/vpn.inc:1851
+#: etc/inc/vpn.inc:1853
+#, php-format
+msgid "IPSEC: ERROR: One of the endpoints is not a IP address. Old EP '%1$s' new EP '%2$s'"
+msgstr "IPSEC: ERRO: Um dos endpoints não é um endereço IP. EP antigo '%1$s' EP novo '%2$s'"
+
+#: etc/inc/vpn.inc:1777 etc/inc/vpn.inc:1787 etc/inc/vpn.inc:1772
+#: etc/inc/vpn.inc:1844 etc/inc/vpn.inc:1857 etc/inc/vpn.inc:1854
+#: etc/inc/vpn.inc:1856
+#, php-format
+msgid "IPSEC: ERROR: One of the remote endpoints is not a IP address. Old RG '%1$s' new RG '%2$s'"
+msgstr "IPSEC: ERRO: Um dos endpoints remotos não é um endereço IP. RG antigo '%1$s' novo RG '%2$s'"
+
+#: etc/inc/vpn.inc:1833 etc/inc/vpn.inc:1843 etc/inc/vpn.inc:1835
+#: etc/inc/vpn.inc:1907 etc/inc/vpn.inc:1920 etc/inc/vpn.inc:1917
+#: etc/inc/vpn.inc:1919
+#, php-format
+msgid "Reloading IPsec tunnel '%1$s'. Previous IP '%2$s', current IP '%3$s'. Reloading policy"
+msgstr "Recarregando túnel IPsec '%1$s'. IP anterior '%2$s', IP atual '%3$s'. Recarregando política"
+
+#: etc/inc/xmlparse.inc:85 etc/inc/xmlparse_attr.inc:78
+#, php-format
+msgid "XML error: %1$s at line %2$d cannot occur more than once"
+msgstr "Erro de XML: %1$s na linha %2$d não pode aparecer mais de uma vez"
+
+#: etc/inc/xmlparse.inc:176 etc/inc/xmlparse_attr.inc:187
+msgid "Error: could not open XML input"
+msgstr "Erro: não foi possível abrir a entrada XML"
+
+#: etc/inc/xmlparse.inc:182
+#, php-format
+msgid "XML error: %1$s at line %2$d in %3$s"
+msgstr "Erro de XML: %1$s na linha %2$d em %3$s"
+
+#: etc/inc/xmlparse.inc:198 etc/inc/xmlparse_attr.inc:210
+#: etc/inc/xmlparse.inc:199
+#, php-format
+msgid "XML error: no %s object found!"
+msgstr "Erro XML: objeto %s não encontrado!"
+
+#: etc/inc/xmlrpc_client.inc:152
+msgid "Unknown method"
+msgstr "Método desconhecido"
+
+#: etc/inc/xmlrpc_client.inc:153
+msgid "Invalid return payload: enable debugging to examine incoming payload"
+msgstr "Carga inválida retornada: habilite o debugging para examinar a carga de entrada"
+
+#: etc/inc/xmlrpc_client.inc:154
+msgid "Incorrect parameters passed to method"
+msgstr "Parâmetros incorretos passados ao método"
+
+#: etc/inc/xmlrpc_client.inc:155
+msgid "Can't introspect: method unknown"
+msgstr "Não foi possível analisar: método indefinido"
+
+#: etc/inc/xmlrpc_client.inc:156
+msgid "Didn't receive 200 OK from remote server."
+msgstr "Não foi recebido 200 OK do servidor remoto."
+
+#: etc/inc/xmlrpc_client.inc:157
+msgid "The requested method didn't return an XML_RPC_Response object."
+msgstr "O método solicitado não retorna um objeto XML_RPC_Response."
+
+#: etc/inc/xmlrpc_client.inc:158
+msgid "Invalid request payload"
+msgstr "Carga solicitada inválida"
+
+#: etc/inc/xmlrpc_client.inc:260
+msgid "missing top level xmlrpc element"
+msgstr "falta elemento de nível superior xmlrpc"
+
+#: etc/inc/xmlrpc_client.inc:268
+#, php-format
+msgid "xmlrpc element %1$s cannot be child of %2$s"
+msgstr "elemento xmlrpc %1$s não pode ser filho de %2$s"
+
+#: etc/inc/xmlrpc_client.inc:431
+msgid "Non-numeric value received in INT or DOUBLE"
+msgstr "Recebido um valor não numérico em INT ou DOUBLE "
+
+#: etc/inc/xmlrpc_client.inc:860
+#, php-format
+msgid "send()'s %s parameter must be an XML_RPC_Message object."
+msgstr "send()'s %s parametro pode ser um objeto XML_RPC_Message."
+
+#: etc/inc/xmlrpc_client.inc:951
+#, php-format
+msgid ""
+"Connection to proxy server \n"
+" %1$s:%2$s failed. %3$s"
+msgstr ""
+"Conexão com servidor proxy \n"
+"%1$s:%2$s falhou. %3$s"
+
+#: etc/inc/xmlrpc_client.inc:957
+#, php-format
+msgid ""
+"Connection to RPC server \n"
+" %1$s:%2$s failed. %3$s"
+msgstr ""
+"Conexão com servidor RPC \n"
+"%1$s:%2$s falhou. %3$s"
+
+#: etc/inc/xmlrpc_client.inc:1330
+msgid "The submitted request did not contain this parameter"
+msgstr "A requisição submetida não contêm esse parâmetro"
+
+#: etc/inc/xmlrpc_client.inc:1361
+msgid "mb_convert_encoding() is not available"
+msgstr "mb_convert_enconding() não está disponível"
+
+#: etc/inc/xmlrpc_client.inc:1470
+#, php-format
+msgid "HTTP error, got response: %s"
+msgstr "Erro de HTTP, obteve resposta: %s"
+
+#: etc/inc/xmlrpc_client.inc:1496
+msgid "XML error at line 1, check URL"
+msgstr "Erro de XML na linha 1, verificar URL"
+
+#: etc/inc/xmlrpc_client.inc:1591 etc/inc/xmlrpc_client.inc:1593
+msgid "Scalar can have only one value"
+msgstr "Escalar pode ter apenas um valor"
+
+#: etc/inc/xmlrpc_client.inc:1598 etc/inc/xmlrpc_client.inc:1600
+#, php-format
+msgid "Not a scalar type (%s)"
+msgstr "Não é um tipo escalar (%s)"
+
+#: etc/inc/xmlrpc_client.inc:1634 etc/inc/xmlrpc_client.inc:1650
+#: etc/inc/xmlrpc_client.inc:1636 etc/inc/xmlrpc_client.inc:1652
+#, php-format
+msgid "Already initialized as a [%s]"
+msgstr "Já inicializado como um [%s]"
+
+#: etc/inc/xmlrpc_server.inc:48
+msgid "This method lists all the methods that the XML-RPC server knows how to dispatch"
+msgstr "Esse método lista todos os métodos que o servidor XML-RPC sabe como enviar"
+
+#: etc/inc/xmlrpc_server.inc:66
+msgid "Returns an array of known signatures (an array of arrays) for the method name passed. If no signatures are known, returns a none-array (test for type != array to detect missing signature)"
+msgstr "Retorna um matriz de assinaturas conhecidas (uma matriz de matrizes) para o nome do método apresentado. Se não houver assinaturas conhecidas, retorna uma matriz vazia (tipo de teste != matriz para detectar assinaturas perdidas) "
+
+#: etc/inc/xmlrpc_server.inc:86
+msgid "Returns help text if defined for the method passed, otherwise returns an empty string"
+msgstr "Retorna o texto de ajuda se definido no método passado, senão retorna uma string vazia"
+
+#: etc/inc/authgui.inc:73
+msgid "No page assigned to this user! Click here to logout."
+msgstr "Nenhuma página atribuída à este usuário! Clique aqui para fazer logout."
+
+#: etc/inc/authgui.inc:97 etc/inc/authgui.inc:103
+#, php-format
+msgid "Error: %1$s Description: %2$s"
+msgstr "Erro: %1$s Descrição: %2$s"
+
+#: etc/inc/authgui.inc:160 etc/inc/authgui.inc:159 etc/inc/authgui.inc:165
+msgid "unknown reason"
+msgstr "razão desconhecida"
+
+#: etc/inc/authgui.inc:161 etc/inc/authgui.inc:160 etc/inc/authgui.inc:166
+#, php-format
+msgid "Invalid login (%s)."
+msgstr "Login inválido (%s)."
+
+#: etc/inc/authgui.inc:166 etc/inc/authgui.inc:165 etc/inc/authgui.inc:171
+#, php-format
+msgid "This device is currently being maintained by: %s."
+msgstr "O dispositivo atual esta sendo mantido por: %s."
+
+#: etc/inc/authgui.inc:214 etc/inc/authgui.inc:277 etc/inc/authgui.inc:212
+#: etc/inc/authgui.inc:275 etc/inc/authgui.inc:235 etc/inc/authgui.inc:298
+msgid "Login"
+msgstr "Login"
+
+#: etc/inc/authgui.inc:242 etc/inc/authgui.inc:240 etc/inc/authgui.inc:263
+msgid "You are accessing this router by an IP address not configured locally, which may be forwarded by NAT or other means. <br/><br/>If you did not setup this forwarding, you may be the target of a man-in-the-middle attack."
+msgstr "Você está acessando este roteador através de um endereço IP não configurado localmente, que pode ser encaminhado pelo NAT ou outros meios. <br/><br/>Se você não instalou este encaminhando, você pode estar sendo alvo de um ataque."
+
+#: etc/inc/authgui.inc:251 etc/inc/authgui.inc:249 etc/inc/authgui.inc:272
+msgid "Username:"
+msgstr "Usuário:"
+
+#: etc/inc/authgui.inc:258 usr/local/www/diag_backup.php:597
+#: usr/local/www/system_authservers.php:627 etc/inc/authgui.inc:256
+#: usr/local/www/diag_backup.php:676 usr/local/www/system_authservers.php:632
+#: usr/local/www/system_authservers.php:639 usr/local/www/diag_backup.php:681
+#: etc/inc/authgui.inc:279 usr/local/www/system_authservers.php:651
+#: usr/local/www/diag_backup.php:682
+msgid "Password:"
+msgstr "Senha:"
+
+#: etc/inc/authgui.inc:265 etc/inc/authgui.inc:263 etc/inc/authgui.inc:286
+msgid "Enter username and password to login."
+msgstr "Digite usuário e senha para entrar."
+
+#: etc/inc/authgui.inc:271 etc/inc/authgui.inc:269 etc/inc/authgui.inc:292
+msgid "Your browser must support cookies to login."
+msgstr "Seu browser precisa suportar cookies para logar."
+
+#: etc/inc/cmd_chain.inc:101
+#, php-format
+msgid "CmdCHAIN is executing -> %1$s - %2$s"
+msgstr "CmdCHAIN está sendo executado -> %1$s - %2$s"
+
+#: etc/inc/cmd_chain.inc:109 etc/inc/cmd_chain.inc:111
+#, php-format
+msgid "%1$s failed with return code -> %2$s. The command was %3$s"
+msgstr "%1$s falhou com código de retorno -> %2$s. O comando foi %3$s"
+
+#: etc/inc/config.console.inc:58
+msgid "DANGER! WARNING! ACHTUNG!"
+msgstr "PERIGO! ADVERTÊNCIA! ACHTUNG!"
+
+#: etc/inc/config.console.inc:59
+#, php-format
+msgid "%s requires *AT LEAST* %s RAM to function correctly.%s"
+msgstr "%s requer *PELO MENOS* %s de RAM para funcionar corretamente.%s"
+
+#: etc/inc/config.console.inc:60
+#, php-format
+msgid "Only (%s) MB RAM has been detected.%s"
+msgstr "Somente (%s) MB de RAM foi detectado.%s"
+
+#: etc/inc/config.console.inc:61
+msgid "Press ENTER to continue."
+msgstr "Pressione ENTER para continuar."
+
+#: etc/inc/config.console.inc:83 etc/inc/config.console.inc:495
+#: etc/inc/config.console.inc:497
+msgid "No interfaces found!"
+msgstr "Nenhuma interface encontrada!"
+
+#: etc/inc/config.console.inc:181
+msgid "VLAN interfaces:"
+msgstr "Interfaces VLAN:"
+
+#: etc/inc/config.console.inc:207
+msgid "Enter the WAN interface name or 'a' for auto-detection:"
+msgstr "Informe o nome da interface WAN ou 'uma' para auto-detecção:"
+
+#: etc/inc/config.console.inc:215 etc/inc/config.console.inc:276
+#: etc/inc/config.console.inc:518 etc/inc/config.console.inc:520
+#: etc/inc/config.console.inc:244
+#, php-format
+msgid "%sInvalid interface name '%s'%s"
+msgstr "%sNome de interface inválido '%s'%s"
+
+#: etc/inc/config.console.inc:222
+#, php-format
+msgid "%sEnter the LAN interface name or 'a' for auto-detection %sNOTE: this enables full Firewalling/NAT mode.%s(or nothing if finished):%s"
+msgstr "%sInforme o nome da interface LAN ou 'uma' para auto-detecção %sNOTA: isso habilita o modo Firewalling/NAT completo.%s(ou nada, se finalizado):%s"
+
+#: etc/inc/config.console.inc:244
+#, php-format
+msgid "%sInvalid interface name '%s'%s)"
+msgstr "%snome de interface inválido '%s'%s)"
+
+#: etc/inc/config.console.inc:261
+#, php-format
+msgid "%sOptional interface %s description found: %s"
+msgstr "Descrição de %s interface opcional %s encontrada: %s"
+
+#: etc/inc/config.console.inc:264
+#, php-format
+msgid "(or nothing if finished):%s"
+msgstr "(ou nada é finalizado):%s"
+
+#: etc/inc/config.console.inc:270
+msgid "Optional"
+msgstr "Opcional"
+
+#: etc/inc/config.console.inc:304
+msgid "The interfaces will be assigned as follows:"
+msgstr "As interfaces serão atribuídas conforme segue:"
+
+#: etc/inc/config.console.inc:416 etc/inc/config.console.inc:418
+#, php-format
+msgid "%sWriting configuration..."
+msgstr "%sEscrevendo configuração..."
+
+#: etc/inc/config.console.inc:418 etc/inc/config.console.inc:420
+#, php-format
+msgid "done.%s"
+msgstr "pronto.%s"
+
+#: etc/inc/config.console.inc:425 etc/inc/config.console.inc:427
+msgid "One moment while we reload the settings..."
+msgstr "Um momento enquanto recarregamos as configurações..."
+
+#: etc/inc/config.console.inc:429 etc/inc/config.console.inc:431
+msgid " done!"
+msgstr "pronto!"
+
+#: etc/inc/config.console.inc:449 etc/inc/config.console.inc:451
+#, php-format
+msgid "Detected link-up on interface %s.%s"
+msgstr "Detectado link-up na interface %s.%s"
+
+#: etc/inc/config.console.inc:454 etc/inc/config.console.inc:456
+#, php-format
+msgid "No link-up detected.%s"
+msgstr "Nenhum link-up detectado.%s"
+
+#: etc/inc/config.console.inc:493 etc/inc/config.console.inc:495
+msgid "VLAN Capable interfaces:"
+msgstr "Interfaces que suportam VLAN:"
+
+#: etc/inc/config.console.inc:508 etc/inc/config.console.inc:510
+msgid "No VLAN capable interfaces detected."
+msgstr "Nenhum interface que suporta VLAN detectada."
+
+#: etc/inc/config.console.inc:512 etc/inc/config.console.inc:514
+msgid "Enter the parent interface name for the new VLAN (or nothing if finished):"
+msgstr "Informe o nome da interface pai para a nova VLAN (ou nada se finalizado):"
+
+#: etc/inc/config.console.inc:525 etc/inc/config.console.inc:527
+msgid "Enter the VLAN tag (1-4094):"
+msgstr "Informe a tag da VLAN (1-4094):"
+
+#: etc/inc/config.console.inc:529 etc/inc/config.console.inc:531
+#, php-format
+msgid "%sInvalid VLAN tag '%s'%s"
+msgstr "%sTag de VLAN inválida '%s'%s"
+
+#: etc/inc/config.lib.inc:79
+msgid "Config.xml unlocked."
+msgstr "Config.xml desbloqueado."
+
+#: etc/inc/config.lib.inc:82
+msgid "Invalid password entered. Please try again."
+msgstr "Senha inválida informada. Por favor, tente novamente."
+
+#: etc/inc/config.lib.inc:110 etc/inc/config.lib.inc:140
+#: etc/inc/config.lib.inc:271
+msgid "Config.xml is corrupted and is 0 bytes. Could not restore a previous backup."
+msgstr "Config.xml está corrompido e possui 0 bytes. Não pôde restaurar um backup anterior."
+
+#: etc/inc/config.lib.inc:138 etc/inc/config.lib.inc:149
+#: etc/inc/config.lib.inc:552 etc/inc/config.lib.inc:560
+#: etc/inc/config.lib.inc:577 etc/inc/config.lib.inc:555
+msgid "Could not restore config.xml."
+msgstr "Não pôde restaurar config.xml."
+
+#: etc/inc/config.lib.inc:210 etc/inc/config.lib.inc:211
+#, php-format
+msgid "%1$s is restoring the configuration %2$s"
+msgstr "%1$s está restaurando a configuração %2$s"
+
+#: etc/inc/config.lib.inc:233
+msgid "Resetting factory defaults..."
+msgstr "Reconfigurando padrões de fábrica..."
+
+#: etc/inc/config.lib.inc:236
+msgid ""
+"No XML configuration file found - using factory defaults.\n"
+"Make sure that the configuration floppy disk with the conf/config.xml\n"
+"file is inserted. If it isn't, your configuration changes will be lost\n"
+"on reboot.\n"
+msgstr ""
+"Nenhuma configuração XML encontrada - usando configurações de fábrica.\n"
+"Tenha certeza de que a configuração conf/config.xml do disquete está inserida. Se não, suas configurações modificadas serão perdidas\n"
+"ao reiniciar.\n"
+
+#: etc/inc/config.lib.inc:249
+#, php-format
+msgid "XML configuration file not found. %s cannot continue booting."
+msgstr "Arquivo XML de configuração não encontrado. %s nãoo pode continuar iniciando."
+
+#: etc/inc/config.lib.inc:255
+msgid "Last known config found and restored. Please double check your configuration file for accuracy."
+msgstr "Última configuração conhecida encontrada e restaurada. Por favor, cheque duas vezes seu arquivo de configuração por precaução."
+
+#: etc/inc/config.lib.inc:317 etc/inc/config.lib.inc:320
+msgid "Disk is dirty. Running fsck -y"
+msgstr "O disco está sujo. Executando fsck -y"
+
+#: etc/inc/config.lib.inc:328 etc/inc/config.lib.inc:331
+msgid "File system is dirty. Launching FSCK for /"
+msgstr "O sistema de arquivos está sujo. Abrindo FSCK para /"
+
+#: etc/inc/config.lib.inc:379 etc/inc/config.lib.inc:382
+#, php-format
+msgid "Start Configuration upgrade at %s, set execution timeout to 15 minutes"
+msgstr "Iniciar atualização de Configuração em %s, configure tempo de execução para 15 minutos"
+
+#: etc/inc/config.lib.inc:389 etc/inc/config.lib.inc:390
+#: etc/inc/config.lib.inc:392 etc/inc/config.lib.inc:393
+msgid "Updated bogon update frequency to 3am"
+msgstr "Atualizada frequência de atualização bogon para 3 da manhã"
+
+#: etc/inc/config.lib.inc:420 etc/inc/config.lib.inc:423
+#, php-format
+msgid "Ended Configuration upgrade at %s"
+msgstr "Atualização de Configuração finalizada às %s"
+
+#: etc/inc/config.lib.inc:423 etc/inc/config.lib.inc:426
+#, php-format
+msgid "Upgraded config version level from %1$s to %2$s"
+msgstr "Atualizada versão config de nível %1$s para %2$s"
+
+#: etc/inc/config.lib.inc:512 etc/inc/config.lib.inc:520
+#: etc/inc/config.lib.inc:537 etc/inc/config.lib.inc:903
+#, php-format
+msgid "%s made unknown change"
+msgstr "%s fez mudança desconhecida"
+
+#: etc/inc/config.lib.inc:525 etc/inc/config.lib.inc:533
+#: etc/inc/config.lib.inc:550 etc/inc/config.lib.inc:528
+msgid "WARNING: Config contents could not be save. Could not open file!"
+msgstr "ADVERTÊNCIA: Conteúdo de config não pôde ser salvo. Não pôde abrir arquivo!"
+
+#: etc/inc/config.lib.inc:527 etc/inc/config.lib.inc:535
+#: etc/inc/config.lib.inc:552 etc/inc/config.lib.inc:530
+#, php-format
+msgid "Unable to open %s/config.xml for writing in write_config()%s"
+msgstr "Incapaz de abrir %s/config.cml para escrita em write_config()%s"
+
+#: etc/inc/config.lib.inc:636 etc/inc/config.lib.inc:644
+#: etc/inc/config.lib.inc:661 etc/inc/config.lib.inc:639
+msgid "Reverted to"
+msgstr "Revertido para"
+
+#: etc/inc/config.lib.inc:651 etc/inc/config.lib.inc:659
+#: etc/inc/config.lib.inc:676 etc/inc/config.lib.inc:654
+msgid "Installing configuration..."
+msgstr "Instalando configuração..."
+
+#: etc/inc/config.lib.inc:653 etc/inc/config.lib.inc:661
+#: etc/inc/config.lib.inc:678 etc/inc/config.lib.inc:656
+msgid "Installing configuration ...."
+msgstr "Instalando configuração ...."
+
+#: etc/inc/config.lib.inc:704 etc/inc/config.lib.inc:712
+#: etc/inc/config.lib.inc:729 etc/inc/config.lib.inc:707
+msgid "XML error: unable to open file"
+msgstr "Erro de XML: incapaz de abrir arquivo"
+
+#: etc/inc/config.lib.inc:710 etc/inc/config.lib.inc:718
+#: etc/inc/config.lib.inc:735 etc/inc/config.lib.inc:713
+#, php-format
+msgid "%1$s at line %2$d"
+msgstr "%1$s na linha %2$d"
+
+#: etc/inc/config.lib.inc:756 etc/inc/config.lib.inc:758
+#: etc/inc/config.lib.inc:764 etc/inc/config.lib.inc:766
+#: etc/inc/config.lib.inc:781 etc/inc/config.lib.inc:783
+#: etc/inc/config.lib.inc:759 etc/inc/config.lib.inc:761
+#, php-format
+msgid "The backup cache file %s is corrupted. Unlinking."
+msgstr "O arquivo de backup de cache %s está corrompido. Desvinculando."
+
+#: etc/inc/easyrule.inc:116 etc/inc/easyrule.inc:117
+msgid "Easy Rule: Blocked from Firewall Log View"
+msgstr "Regra Fácil: Bloqueado da Visualização de Log do Firewall"
+
+#: etc/inc/easyrule.inc:165 etc/inc/easyrule.inc:173 etc/inc/easyrule.inc:181
+#: etc/inc/easyrule.inc:177 etc/inc/easyrule.inc:185 etc/inc/easyrule.inc:178
+#: etc/inc/easyrule.inc:186
+msgid "Entry added"
+msgstr "Entrada adicionada"
+
+#: etc/inc/easyrule.inc:170 etc/inc/easyrule.inc:178 etc/inc/easyrule.inc:182
+#: etc/inc/easyrule.inc:183
+msgid "Hosts blocked from Firewall Log view"
+msgstr "Hosts bloqueados da Visualização de Log do Firewall"
+
+#: etc/inc/easyrule.inc:249 etc/inc/easyrule.inc:257 etc/inc/easyrule.inc:262
+#: etc/inc/easyrule.inc:263
+msgid "Easy Rule: Passed from Firewall Log View"
+msgstr "Regra Fácil: Liberado pela Visualização de Log do Firewall"
+
+#: etc/inc/easyrule.inc:280 etc/inc/easyrule.inc:303 etc/inc/easyrule.inc:309
+#: etc/inc/easyrule.inc:313 etc/inc/easyrule.inc:318
+msgid "Tried to block invalid IP:"
+msgstr "Tentou bloquear IP inválido:"
+
+#: etc/inc/easyrule.inc:284 etc/inc/easyrule.inc:307 etc/inc/easyrule.inc:313
+#: etc/inc/easyrule.inc:317 etc/inc/easyrule.inc:322
+msgid "Invalid interface for block rule:"
+msgstr "Interface inválida para regra de bloqueio:"
+
+#: etc/inc/easyrule.inc:287 etc/inc/easyrule.inc:310 etc/inc/easyrule.inc:316
+#: etc/inc/easyrule.inc:320 etc/inc/easyrule.inc:325
+msgid "Host added successfully"
+msgstr "Host adicionado com sucesso"
+
+#: etc/inc/easyrule.inc:289 etc/inc/easyrule.inc:312 etc/inc/easyrule.inc:318
+#: etc/inc/easyrule.inc:322 etc/inc/easyrule.inc:327
+msgid "Failed to create block rule, alias, or add host."
+msgstr "Falhou ao criar regra de bloqueio, alias, ou ao adicionar um host."
+
+#: etc/inc/easyrule.inc:292 etc/inc/easyrule.inc:315 etc/inc/easyrule.inc:321
+#: etc/inc/easyrule.inc:325 etc/inc/easyrule.inc:330
+msgid "Tried to block but had no host IP or interface"
+msgstr "Tentou bloquear, mas não possuía nenhum IP de host ou interface"
+
+#: etc/inc/easyrule.inc:294 etc/inc/easyrule.inc:317 etc/inc/easyrule.inc:323
+#: etc/inc/easyrule.inc:327 etc/inc/easyrule.inc:332
+msgid "Unknown block error."
+msgstr "Erro desconhecido de bloqueio."
+
+#: etc/inc/easyrule.inc:303 etc/inc/easyrule.inc:326 etc/inc/easyrule.inc:334
+#: etc/inc/easyrule.inc:338 etc/inc/easyrule.inc:343
+msgid "Invalid interface for pass rule:"
+msgstr "Interface inválida para regra de liberação:"
+
+#: etc/inc/easyrule.inc:306 etc/inc/easyrule.inc:329 etc/inc/easyrule.inc:337
+#: etc/inc/easyrule.inc:341 etc/inc/easyrule.inc:346
+msgid "Invalid protocol for pass rule:"
+msgstr "Protocolo inválido para regra de liberação:"
+
+#: etc/inc/easyrule.inc:309 etc/inc/easyrule.inc:332 etc/inc/easyrule.inc:340
+#: etc/inc/easyrule.inc:344 etc/inc/easyrule.inc:349
+msgid "Tried to pass invalid source IP:"
+msgstr "Tentou passar um IP fonte inválido:"
+
+#: etc/inc/easyrule.inc:312 etc/inc/easyrule.inc:335 etc/inc/easyrule.inc:343
+#: etc/inc/easyrule.inc:347 etc/inc/easyrule.inc:352
+msgid "Tried to pass invalid destination IP:"
+msgstr "Tentou passar um IP de destino inválido:"
+
+#: etc/inc/easyrule.inc:316 etc/inc/easyrule.inc:339 etc/inc/easyrule.inc:347
+#: etc/inc/easyrule.inc:351 etc/inc/easyrule.inc:356
+msgid "Missing destination port:"
+msgstr "Porta de destino faltando:"
+
+#: etc/inc/easyrule.inc:319 etc/inc/easyrule.inc:342 etc/inc/easyrule.inc:350
+#: etc/inc/easyrule.inc:354 etc/inc/easyrule.inc:359
+msgid "Tried to pass invalid destination port:"
+msgstr "Tentou passar uma porta de destino inválida:"
+
+#: etc/inc/easyrule.inc:326 etc/inc/easyrule.inc:349 etc/inc/easyrule.inc:357
+#: etc/inc/easyrule.inc:361 etc/inc/easyrule.inc:366
+msgid "Successfully added pass rule!"
+msgstr "Adicionou regra de liberação com sucesso!"
+
+#: etc/inc/easyrule.inc:328 etc/inc/easyrule.inc:351 etc/inc/easyrule.inc:359
+#: etc/inc/easyrule.inc:363 etc/inc/easyrule.inc:368
+msgid "Failed to add pass rule."
+msgstr "Falhou ao adicionar regra de passe."
+
+#: etc/inc/easyrule.inc:331 etc/inc/easyrule.inc:354 etc/inc/easyrule.inc:362
+#: etc/inc/easyrule.inc:366 etc/inc/easyrule.inc:371
+msgid "Missing parameters for pass rule."
+msgstr "Parâmetros faltando para regra de liberação."
+
+#: etc/inc/easyrule.inc:333 etc/inc/easyrule.inc:356 etc/inc/easyrule.inc:364
+#: etc/inc/easyrule.inc:368 etc/inc/easyrule.inc:373
+msgid "Unknown pass error."
+msgstr "Erro de liberação desconhecido."
+
+#: etc/inc/filter_log.inc:164 etc/inc/filter_log.inc:167
+#: etc/inc/filter_log.inc:191 etc/inc/filter_log.inc:201
+#, php-format
+msgid "There was a error parsing rule: %s. Please report to mailing list or forum."
+msgstr "Houve um erro ao fazer parse de regra: %s. Por favor reporte esse erro em lista de e-mails ou fórum."
+
+#: etc/inc/filter_log.inc:208 etc/inc/filter_log.inc:210
+#: etc/inc/filter_log.inc:213 etc/inc/filter_log.inc:237
+#: etc/inc/filter_log.inc:247
+#, php-format
+msgid "Service %1$s/%2$s: %3$s"
+msgstr "Serviço %1$s/%2$s: %3$s"
+
+#: etc/inc/gwlb.inc:230 etc/inc/gwlb.inc:237 etc/inc/gwlb.inc:242
+#: etc/inc/gwlb.inc:244
+#, php-format
+msgid "Removing static route for monitor %1$s and adding a new route through %2$s"
+msgstr "Removendo regras estáticas para monitor %1$s e adicionando nova rota através %2$s"
+
+#: etc/inc/gwlb.inc:501 etc/inc/gwlb.inc:727 etc/inc/gwlb.inc:750
+#, php-format
+msgid "MONITOR: %s is down, omitting from routing group"
+msgstr "MONITOR: %s não responde, removendo do grupo de roteamento"
+
+#: etc/inc/gwlb.inc:505 etc/inc/gwlb.inc:731 etc/inc/gwlb.inc:754
+#, php-format
+msgid "MONITOR: %s has packet loss, omitting from routing group"
+msgstr "MONITOR: %s tem perda de pacote, removendo de grupo de roteamento"
+
+#: etc/inc/gwlb.inc:509 etc/inc/gwlb.inc:735 etc/inc/gwlb.inc:758
+#, php-format
+msgid "MONITOR: %s has high latency, omitting from routing group"
+msgstr "MONITOR: %s tem alta latência, removendo de grupo de roteamento"
+
+#: etc/inc/gwlb.inc:526 etc/inc/gwlb.inc:752 etc/inc/gwlb.inc:775
+msgid "Gateways status could not be determined, considering all as up/active."
+msgstr "Status de gateways não pôde ser determinado, considerando todos como up/ativo."
+
+#: etc/inc/gwlb.inc:580 etc/inc/gwlb.inc:809 etc/inc/gwlb.inc:835
+#: etc/inc/gwlb.inc:844 etc/inc/gwlb.inc:823 etc/inc/gwlb.inc:807
+#: etc/inc/gwlb.inc:791
+#, php-format
+msgid "Updating gateway group gateway for %1$s - new gateway is %2$s"
+msgstr "Atualizando grupo de gateway para %1$s - novo gateway é %2$s"
+
+#: etc/inc/ipsec.inc:39
+msgid "My IP address"
+msgstr "Meu endereço IP"
+
+#: etc/inc/ipsec.inc:40 etc/inc/ipsec.inc:49
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:65
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:114
+#: usr/local/www/diag_logs_vpn.php:178
+#: usr/local/www/status_captiveportal.php:160
+#: usr/local/www/services_captiveportal.php:602
+#: usr/local/www/services_captiveportal.php:623
+#: usr/local/www/services_captiveportal.php:642
+#: usr/local/www/services_captiveportal.php:661
+#: usr/local/www/services_captiveportal_ip.php:117
+#: usr/local/www/services_captiveportal_ip_edit.php:195
+#: usr/local/www/services_dhcp.php:891
+#: usr/local/www/services_dhcp_edit.php:221
+#: usr/local/www/services_dnsmasq_edit.php:80
+#: usr/local/www/services_dnsmasq_edit.php:156
+#: usr/local/www/vpn_pptp_users.php:99
+#: usr/local/www/vpn_pptp_users_edit.php:160 usr/local/www/diag_arp.php:313
+#: usr/local/www/status_dhcp_leases.php:318
+#: usr/local/www/system_advanced_network.php:226
+#: usr/local/www/vpn_ipsec_phase2.php:635 usr/local/www/vpn_l2tp_users.php:102
+#: usr/local/www/vpn_l2tp_users_edit.php:168
+#: usr/local/www/services_dnsmasq_edit.php:81
+#: usr/local/www/services_dnsmasq_edit.php:211
+#: usr/local/www/diag_logs_vpn.php:177
+#: usr/local/www/services_captiveportal.php:638
+#: usr/local/www/services_captiveportal.php:659
+#: usr/local/www/services_captiveportal.php:681
+#: usr/local/www/services_captiveportal.php:700
+#: usr/local/www/status_dhcp_leases.php:339
+#: usr/local/www/services_dhcp.php:929 usr/local/www/vpn_ipsec_phase2.php:661
+#: usr/local/www/services_dhcp_edit.php:224
+#: usr/local/www/services_dnsmasq_edit.php:212
+#: usr/local/www/services_captiveportal_ip.php:115
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:72
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:137
+#: usr/local/www/vpn_l2tp_users.php:103
+#: usr/local/www/services_captiveportal.php:636
+#: usr/local/www/services_captiveportal.php:657
+#: usr/local/www/services_captiveportal.php:679
+#: usr/local/www/services_captiveportal.php:698
+#: usr/local/www/status_dhcp_leases.php:341
+#: usr/local/www/services_captiveportal_ip_edit.php:193
+#: usr/local/www/services_dhcp.php:1133 usr/local/www/vpn_ipsec_phase2.php:757
+#: usr/local/www/vpn_pptp_users_edit.php:161
+#: usr/local/www/services_dhcp_edit.php:223
+#: usr/local/www/vpn_l2tp_users_edit.php:169
+#: usr/local/www/vpn_pptp_users.php:100
+#: usr/local/www/services_captiveportal_ip_edit.php:187
+#: usr/local/www/services_dhcp_edit.php:351
+#: usr/local/www/services_dhcp.php:1152
+#: usr/local/www/status_captiveportal.php:146
+#: usr/local/www/services_captiveportal.php:637
+#: usr/local/www/services_captiveportal.php:658
+#: usr/local/www/services_captiveportal.php:680
+#: usr/local/www/services_captiveportal.php:699
+#: usr/local/www/vpn_ipsec_phase2.php:778 usr/local/www/services_dhcp.php:1172
+#: usr/local/www/services_captiveportal.php:653
+#: usr/local/www/services_captiveportal.php:674
+#: usr/local/www/services_captiveportal.php:696
+#: usr/local/www/services_captiveportal.php:715
+#: usr/local/www/system_advanced_network.php:227
+#: usr/local/www/services_dhcp.php:1184
+#: usr/local/www/status_dhcp_leases.php:342
+msgid "IP address"
+msgstr "Endereço IP"
+
+#: etc/inc/ipsec.inc:41 etc/inc/ipsec.inc:50
+#: usr/local/www/system_camanager.php:476
+#: usr/local/www/system_certmanager.php:589
+#: usr/local/www/system_certmanager.php:672
+#: usr/local/www/system_certmanager.php:705
+#: usr/local/www/system_certmanager.php:838
+#: usr/local/www/system_camanager.php:477
+#: usr/local/www/system_camanager.php:500
+#: usr/local/www/system_certmanager.php:730
+#: usr/local/www/system_certmanager.php:879
+#: usr/local/www/system_certmanager.php:731
+#: usr/local/www/system_certmanager.php:883
+msgid "Distinguished name"
+msgstr "Nome distinto"
+
+#: etc/inc/ipsec.inc:42 etc/inc/ipsec.inc:51
+msgid "User distinguished name"
+msgstr "Nome de usuário distinto"
+
+#: etc/inc/ipsec.inc:43 etc/inc/ipsec.inc:52
+msgid "ASN.1 distinguished Name"
+msgstr "Nome de ASN.1 distinto"
+
+#: etc/inc/ipsec.inc:44 etc/inc/ipsec.inc:53
+msgid "KeyID tag"
+msgstr "Tag KeyID"
+
+#: etc/inc/ipsec.inc:45 usr/local/www/services_dhcp.php:722
+#: usr/local/www/fbegin.inc:128 usr/local/www/services_dhcpv6.php:648
+#: usr/local/www/fbegin.inc:145 usr/local/www/services_dhcp.php:760
+#: usr/local/www/services_dhcpv6.php:741 usr/local/www/fbegin.inc:154
+#: usr/local/www/services_dhcp.php:942 usr/local/www/services_dhcpv6.php:672
+#: usr/local/www/services_dhcp_edit.php:451
+#: usr/local/www/services_dhcp.php:955 usr/local/www/services_dhcpv6.php:689
+#: usr/local/www/fbegin.inc:146 usr/local/www/services_dhcp.php:975
+#: usr/local/www/services_dhcp.php:987
+msgid "Dynamic DNS"
+msgstr "DNS dinâmico"
+
+#: etc/inc/ipsec.inc:48
+msgid "Peer IP address"
+msgstr "Endereço IP do Peer"
+
+#: etc/inc/ipsec.inc:256 usr/local/www/vpn_ipsec.php:206
+#: usr/local/www/vpn_ipsec_phase1.php:358
+#: usr/local/www/vpn_ipsec_phase2.php:255 usr/local/www/vpn_ipsec.php:217
+#: usr/local/www/vpn_ipsec_phase2.php:268 etc/inc/ipsec.inc:281
+#: usr/local/www/vpn_ipsec.php:216 usr/local/www/vpn_ipsec_phase2.php:294
+#: usr/local/www/vpn_ipsec.php:222 usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase2.php:316 etc/inc/ipsec.inc:289
+msgid "Mobile Client"
+msgstr "Cliente Móvel"
+
+#: etc/inc/ipsec.inc:258 usr/local/www/interfaces_bridge_edit.php:428
+#: usr/local/www/firewall_nat_edit.php:797
+#: usr/local/www/firewall_nat_edit.php:828 usr/local/www/interfaces.php:1032
+#: usr/local/www/interfaces.php:1033 usr/local/www/interfaces.php:1385
+#: usr/local/www/interfaces.php:1491 usr/local/www/interfaces.php:1567
+#: usr/local/www/vpn_ipsec_phase2.php:435
+#: usr/local/www/interfaces_bridge_edit.php:437
+#: usr/local/www/vpn_ipsec_phase2.php:461
+#: usr/local/www/firewall_nat_edit.php:805
+#: usr/local/www/firewall_nat_edit.php:836 usr/local/www/interfaces.php:1118
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1489
+#: usr/local/www/interfaces.php:1597 etc/inc/ipsec.inc:283
+#: usr/local/www/system_advanced_misc.php:386
+#: usr/local/www/interfaces_bridge_edit.php:438
+#: usr/local/www/vpn_ipsec_phase2.php:527
+#: usr/local/www/vpn_ipsec_phase2.php:563
+#: usr/local/www/firewall_nat_edit.php:804
+#: usr/local/www/firewall_nat_edit.php:835 usr/local/www/interfaces.php:1106
+#: usr/local/www/interfaces.php:1107 usr/local/www/interfaces.php:1477
+#: usr/local/www/interfaces.php:1585 usr/local/www/firewall_nat_edit.php:799
+#: usr/local/www/firewall_nat_edit.php:830
+#: usr/local/www/diag_system_pftop.php:155
+#: usr/local/www/system_advanced_misc.php:398
+#: usr/local/www/interfaces_bridge_edit.php:439
+#: usr/local/www/vpn_ipsec_phase2.php:584 usr/local/www/interfaces.php:1120
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1490
+#: usr/local/www/interfaces.php:1595 etc/inc/ipsec.inc:292
+#: usr/local/www/firewall_nat_edit.php:811
+#: usr/local/www/firewall_nat_edit.php:842
+#: usr/local/www/system_advanced_misc.php:445
+#: usr/local/www/interfaces.php:1162 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1535 usr/local/www/interfaces.php:1641
+#: usr/local/www/firewall_nat_edit.php:812
+#: usr/local/www/firewall_nat_edit.php:843
+#: usr/local/www/interfaces_bridge_edit.php:443
+#: usr/local/www/interfaces.php:1157 usr/local/www/interfaces.php:1158
+#: usr/local/www/interfaces.php:1529 usr/local/www/interfaces.php:1634
+#: usr/local/www/system_advanced_misc.php:451
+#: usr/local/www/interfaces.php:1170 usr/local/www/interfaces.php:1171
+#: usr/local/www/interfaces.php:1542 usr/local/www/interfaces.php:1647
+msgid "None"
+msgstr "Nenhum"
+
+#: etc/inc/meta.inc:68
+#, php-format
+msgid "list_phpfiles: unable to examine path %s\n"
+msgstr "list_phpfiles: impossibilitado de examinar o caminho %s\n"
+
+#: etc/inc/meta.inc:99
+#, php-format
+msgid "unable to read %s\n"
+msgstr "impossibilitado de ler %s\n"
+
+#: etc/inc/meta.inc:132
+#, php-format
+msgid "error: tag mismatch ( %1$s != %2$s ) in '%3$s'%4$s"
+msgstr "erro: tag incompatível ( %1$s != %2$s ) em '%3$s'%4$s"
+
+#: etc/inc/meta.inc:143
+#, php-format
+msgid "warning: tag %1$s has no data in '%2$s'%3$s"
+msgstr "aviso: a tag %1$s não possui dados em '%2$s'%3$s"
+
+#: etc/inc/meta.inc:163
+#, php-format
+msgid "warning: tag %1$s has malformed data in '%2$s'%3$s"
+msgstr "aviso: a tag %1$s tem dados malformados em '%2$s'%3$s"
+
+#: etc/inc/meta.inc:185
+#, php-format
+msgid "warning: tag %1$s has invalid data in '%2$s'%3$s"
+msgstr "aviso: a tag %1$s tem dados inválidos em '%2$s'%3$s"
+
+#: etc/inc/priv.defs.inc:10
+msgid "WebCfg - All pages"
+msgstr "WebCfg - Todas as páginas"
+
+#: etc/inc/priv.defs.inc:11
+msgid "Allow access to all pages"
+msgstr "Permitir acesso a todas as páginas"
+
+#: etc/inc/priv.defs.inc:16
+msgid "WebCfg - Status: CARP page"
+msgstr "WebCfg - Página Status: CARP"
+
+#: etc/inc/priv.defs.inc:17
+msgid "Allow access to the 'Status: CARP' page."
+msgstr "Permitir acesso à página 'Status: CARP'."
+
+#: etc/inc/priv.defs.inc:22
+msgid "WebCfg - Crash reporter"
+msgstr "WebCfg - Relatório de falhas"
+
+#: etc/inc/priv.defs.inc:23
+msgid "Uploads crash reports to pfSense and or deletes crash reports."
+msgstr "Envie os relatórios de falha para o pfSense e/ou exclua-os."
+
+#: etc/inc/priv.defs.inc:28
+msgid "WebCfg - Diagnostics: ARP Table page"
+msgstr "WebCfg - Página Diagnóstico: Tabela ARP"
+
+#: etc/inc/priv.defs.inc:29
+msgid "Allow access to the 'Diagnostics: ARP Table' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Tabela ARP'."
+
+#: etc/inc/priv.defs.inc:34
+msgid "WebCfg - Diagnostics: Authentication page"
+msgstr "WebCfg - Diagnósticos: Página de Autenticação"
+
+#: etc/inc/priv.defs.inc:35
+msgid "Allow access to the 'Diagnostics: Authentication' page."
+msgstr "Permite acesso à 'Diagnóstico: Página de Autenticação'."
+
+#: etc/inc/priv.defs.inc:40
+msgid "WebCfg - Diagnostics: Backup/restore page"
+msgstr "WebCfg - Página Diagnóstico: Backup/Restaurar"
+
+#: etc/inc/priv.defs.inc:41
+msgid "Allow access to the 'Diagnostics: Backup/restore' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Backup/Restaurar'."
+
+#: etc/inc/priv.defs.inc:46
+msgid "WebCfg - Diagnostics: Configuration History page"
+msgstr "WebCfg - Página Diagnóstico: Histórico de Configuração"
+
+#: etc/inc/priv.defs.inc:47
+msgid "Allow access to the 'Diagnostics: Configuration History' page."
+msgstr "Permitir acesso à página 'Diagnósticos: Histórico de Configuração'."
+
+#: etc/inc/priv.defs.inc:52
+msgid "WebCfg - Diagnostics: Factory defaults page"
+msgstr "WebCfg - Página Diagnóstico: Padrões de fábrica"
+
+#: etc/inc/priv.defs.inc:53
+msgid "Allow access to the 'Diagnostics: Factory defaults' page."
+msgstr "Permitir acesso á  página 'Diagnóstico: Padrões de fábrica'."
+
+#: etc/inc/priv.defs.inc:58
+msgid "WebCfg - Diagnostics: Show States page"
+msgstr "WebCfg - Página Diagnóstico: Exibir Estados"
+
+#: etc/inc/priv.defs.inc:59
+msgid "Allow access to the 'Diagnostics: Show States' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Exibir Estados'."
+
+#: etc/inc/priv.defs.inc:64 etc/inc/priv.defs.inc:70
+msgid "WebCfg - Status: IPsec page"
+msgstr "WebCfg - Página Status: IPsec"
+
+#: etc/inc/priv.defs.inc:65 etc/inc/priv.defs.inc:71
+msgid "Allow access to the 'Status: IPsec' page."
+msgstr "Permitir acesso à  página 'Status: IPsec'."
+
+#: etc/inc/priv.defs.inc:70 etc/inc/priv.defs.inc:76
+msgid "WebCfg - Status: IPsec: SAD page"
+msgstr "WebCfg - Página Status: Ipsec: SAD"
+
+#: etc/inc/priv.defs.inc:71 etc/inc/priv.defs.inc:77
+msgid "Allow access to the 'Status: IPsec: SAD' page."
+msgstr "Permitir acesso à  página 'Status: Ipsec: SAD'."
+
+#: etc/inc/priv.defs.inc:76 etc/inc/priv.defs.inc:82
+msgid "WebCfg - Status: IPsec: SPD page"
+msgstr "WebCfg - Página Status: Ipsec: SPD"
+
+#: etc/inc/priv.defs.inc:77 etc/inc/priv.defs.inc:83
+msgid "Allow access to the 'Status: IPsec: SPD' page."
+msgstr "Permitir acesso à  página 'Status: Ipsec: SPD'."
+
+#: etc/inc/priv.defs.inc:82 etc/inc/priv.defs.inc:88
+msgid "WebCfg - Diag IPsec XML page"
+msgstr "WebCfg - Página de Diagnóstico IPsec XML"
+
+#: etc/inc/priv.defs.inc:83 etc/inc/priv.defs.inc:89
+msgid "Allow access to the 'Diag IPsec XML' page."
+msgstr "Permitir acesso à página 'Diag IPsec XML'."
+
+#: etc/inc/priv.defs.inc:88 etc/inc/priv.defs.inc:184
+#: etc/inc/priv.defs.inc:220 etc/inc/priv.defs.inc:226
+#: etc/inc/priv.defs.inc:202 etc/inc/priv.defs.inc:238
+#: etc/inc/priv.defs.inc:244 etc/inc/priv.defs.inc:94
+#: etc/inc/priv.defs.inc:208 etc/inc/priv.defs.inc:250
+msgid "WebCfg - Diagnostics: System Activity"
+msgstr "WebCfg - Página Diagnóstico: Atividade do Sistema"
+
+#: etc/inc/priv.defs.inc:89 etc/inc/priv.defs.inc:185
+#: etc/inc/priv.defs.inc:221 etc/inc/priv.defs.inc:227
+#: etc/inc/priv.defs.inc:203 etc/inc/priv.defs.inc:239
+#: etc/inc/priv.defs.inc:245 etc/inc/priv.defs.inc:95
+#: etc/inc/priv.defs.inc:209 etc/inc/priv.defs.inc:251
+msgid "Allows access to the 'Diagnostics: System Activity' page"
+msgstr "Permitir acesso à página 'Diagnósticos: Atividade do Sistema'"
+
+#: etc/inc/priv.defs.inc:94 etc/inc/priv.defs.inc:100
+msgid "WebCfg - Diagnostics: Logs: System page"
+msgstr "WebCfg - Página Diagnóstico: Logs: Sistema"
+
+#: etc/inc/priv.defs.inc:95 etc/inc/priv.defs.inc:101
+msgid "Allow access to the 'Diagnostics: Logs: System' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Logs: Sistema'."
+
+#: etc/inc/priv.defs.inc:100 etc/inc/priv.defs.inc:106
+msgid "WebCfg - Status: System logs: Portal Auth page"
+msgstr "WebCfg - Página Status: Logs de distema: Portal de Autenticação"
+
+#: etc/inc/priv.defs.inc:101 etc/inc/priv.defs.inc:107
+msgid "Allow access to the 'Status: System logs: Portal Auth' page."
+msgstr "Permitir acesso à  página 'Status: Logs de distema: Portal de Autenticação'."
+
+#: etc/inc/priv.defs.inc:106 etc/inc/priv.defs.inc:112
+msgid "WebCfg - Diagnostics: Logs: DHCP page"
+msgstr "WebCfg - Página Diagnóstico: Logs: DHCP"
+
+#: etc/inc/priv.defs.inc:107 etc/inc/priv.defs.inc:113
+msgid "Allow access to the 'Diagnostics: Logs: DHCP' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Logs: DHCP'."
+
+#: etc/inc/priv.defs.inc:112 etc/inc/priv.defs.inc:118
+msgid "WebCfg - Diagnostics: Logs: Firewall page"
+msgstr "WebCfg - Página Diagnóstico: Logs: Firewall"
+
+#: etc/inc/priv.defs.inc:113 etc/inc/priv.defs.inc:119
+msgid "Allow access to the 'Diagnostics: Logs: Firewall' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Logs: Firewall'."
+
+#: etc/inc/priv.defs.inc:118 etc/inc/priv.defs.inc:136
+#: etc/inc/priv.defs.inc:142
+msgid "WebCfg - Hidden: No longer included page"
+msgstr "WebCfg - Página Omitidas: Página não mais inclusa"
+
+#: etc/inc/priv.defs.inc:119 etc/inc/priv.defs.inc:137
+#: etc/inc/priv.defs.inc:143
+msgid "Allow access to the 'Hidden: No longer included' page."
+msgstr "Permitir acesso à  página 'Omitidas: Página não mais inclusa'."
+
+#: etc/inc/priv.defs.inc:124 etc/inc/priv.defs.inc:142
+#: etc/inc/priv.defs.inc:160 etc/inc/priv.defs.inc:148
+#: etc/inc/priv.defs.inc:166
+msgid "WebCfg - Status: System logs: IPsec VPN page"
+msgstr "WebCfg - Página Status: Logs do Sistema: IPsec"
+
+#: etc/inc/priv.defs.inc:125 etc/inc/priv.defs.inc:143
+#: etc/inc/priv.defs.inc:161 etc/inc/priv.defs.inc:149
+#: etc/inc/priv.defs.inc:167
+msgid "Allow access to the 'Status: System logs: IPsec VPN' page."
+msgstr "WebCfg - Página 'Status: Logs do Sistema: IPsec'."
+
+#: etc/inc/priv.defs.inc:130
+msgid "WebCfg - Status: System logs: OpenNTPD page"
+msgstr "WebCfg - Página Status: Logs do Sistema: OpenNTPD"
+
+#: etc/inc/priv.defs.inc:131
+msgid "Allow access to the 'Status: System logs: OpenNTPD' page."
+msgstr "Permitir acesso à  página 'Status: Logs do Sistema: OpenNTPD'."
+
+#: etc/inc/priv.defs.inc:136 etc/inc/priv.defs.inc:154
+#: etc/inc/priv.defs.inc:160
+msgid "WebCfg - Status: System logs: OpenVPN page"
+msgstr "WebCfg - Página Status: Logs do Sistema: OpenVPN"
+
+#: etc/inc/priv.defs.inc:137 etc/inc/priv.defs.inc:155
+#: etc/inc/priv.defs.inc:161
+msgid "Allow access to the 'Status: System logs: OpenVPN' page."
+msgstr "Permitir acesso à  página 'Status: Logs do Sistema: OpenVPN'."
+
+#: etc/inc/priv.defs.inc:148 etc/inc/priv.defs.inc:166
+#: etc/inc/priv.defs.inc:172
+msgid "WebCfg - Status: System logs: Load Balancer page"
+msgstr "WebCfg - Página Status: Logs do Sistema: Balanceador de Carga"
+
+#: etc/inc/priv.defs.inc:149 etc/inc/priv.defs.inc:167
+#: etc/inc/priv.defs.inc:173
+msgid "Allow access to the 'Status: System logs: Load Balancer' page."
+msgstr "Permitir acesso à  página 'Status: Logs do Sistema: Balanceador de Carga'."
+
+#: etc/inc/priv.defs.inc:154 etc/inc/priv.defs.inc:172
+#: etc/inc/priv.defs.inc:178
+msgid "WebCfg - Diagnostics: Logs: Settings page"
+msgstr "WebCfg - Página Status: Logs do Sistema: Configurações"
+
+#: etc/inc/priv.defs.inc:155 etc/inc/priv.defs.inc:173
+#: etc/inc/priv.defs.inc:179
+msgid "Allow access to the 'Diagnostics: Logs: Settings' page."
+msgstr "Permitir acesso à  página 'Status: Logs do Sistema: Configurações'."
+
+#: etc/inc/priv.defs.inc:160 etc/inc/priv.defs.inc:178
+#: etc/inc/priv.defs.inc:184
+msgid "WebCfg - Diagnostics: Logs: VPN page"
+msgstr "WebCfg - Página Diagnóstico: Logs: VPN"
+
+#: etc/inc/priv.defs.inc:161 etc/inc/priv.defs.inc:179
+#: etc/inc/priv.defs.inc:185
+msgid "Allow access to the 'Diagnostics: Logs: VPN' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Logs: VPN'."
+
+#: etc/inc/priv.defs.inc:166 etc/inc/priv.defs.inc:184
+#: etc/inc/priv.defs.inc:190
+msgid "WebCfg - Diagnostics: NanoBSD"
+msgstr "WebCfg - Página Diagnóstico: NanoBSD"
+
+#: etc/inc/priv.defs.inc:167 etc/inc/priv.defs.inc:185
+#: etc/inc/priv.defs.inc:191
+msgid "Allow access to the 'Diagnostics: NanoBSD' page."
+msgstr "Permitir acesso à página 'Diagnóstico: NanoBSD'."
+
+#: etc/inc/priv.defs.inc:172 etc/inc/priv.defs.inc:190
+#: etc/inc/priv.defs.inc:196
+msgid "WebCfg - Diagnostics: Packet Capture page"
+msgstr "WebCfg - Página Diagnóstico: Captura de Pacotes"
+
+#: etc/inc/priv.defs.inc:173 etc/inc/priv.defs.inc:191
+#: etc/inc/priv.defs.inc:197
+msgid "Allow access to the 'Diagnostics: Packet Capture' page."
+msgstr "Permitir acesso à  'Página Diagnóstico: Captura de Pacotes'."
+
+#: etc/inc/priv.defs.inc:178 etc/inc/priv.defs.inc:196
+#: etc/inc/priv.defs.inc:202
+msgid "WebCfg - Diagnostics: Patterns page"
+msgstr "WebCfg - Página Diagnóstico: Modelos"
+
+#: etc/inc/priv.defs.inc:179 etc/inc/priv.defs.inc:197
+#: etc/inc/priv.defs.inc:203
+msgid "Allow access to the 'Diagnostics: Patterns' page."
+msgstr "Permitir acesso à 'Página Diagnóstico: Modelos'."
+
+#: etc/inc/priv.defs.inc:190 etc/inc/priv.defs.inc:208
+#: etc/inc/priv.defs.inc:214
+msgid "WebCfg - Diagnostics: Ping page"
+msgstr "WebCfg - Página Diagnóstico: Ping"
+
+#: etc/inc/priv.defs.inc:191 etc/inc/priv.defs.inc:209
+#: etc/inc/priv.defs.inc:215
+msgid "Allow access to the 'Diagnostics: Ping' page."
+msgstr "Permitir acesso à 'Página Diagnóstico: Ping'."
+
+#: etc/inc/priv.defs.inc:196 etc/inc/priv.defs.inc:214
+#: etc/inc/priv.defs.inc:220
+msgid "WebCfg - Status: Package logs page"
+msgstr "WebCfg - Página Status: Logs de Pacotes"
+
+#: etc/inc/priv.defs.inc:197 etc/inc/priv.defs.inc:215
+#: etc/inc/priv.defs.inc:221
+msgid "Allow access to the 'Status: Package logs' page."
+msgstr "Permitir acesso à página 'Status: Logs de Pacotes'."
+
+#: etc/inc/priv.defs.inc:202 etc/inc/priv.defs.inc:220
+#: etc/inc/priv.defs.inc:226
+msgid "WebCfg - Diagnostics: Reset state page"
+msgstr "WebCfg - Página Diagnóstico: Estado Inicial"
+
+#: etc/inc/priv.defs.inc:203 etc/inc/priv.defs.inc:221
+#: etc/inc/priv.defs.inc:227
+msgid "Allow access to the 'Diagnostics: Reset state' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Estado Inicial'."
+
+#: etc/inc/priv.defs.inc:208 etc/inc/priv.defs.inc:226
+#: etc/inc/priv.defs.inc:232
+msgid "WebCfg - Diagnostics: Routing tables page"
+msgstr "WebCfg - Página Diagnóstico: Tabelas de roteamento"
+
+#: etc/inc/priv.defs.inc:209 etc/inc/priv.defs.inc:227
+#: etc/inc/priv.defs.inc:233
+msgid "Allow access to the 'Diagnostics: Routing tables' page."
+msgstr "Permitir acesso à página 'Diagnóstico: Tabelas de roteamento'."
+
+#: etc/inc/priv.defs.inc:214 etc/inc/priv.defs.inc:232
+#: etc/inc/priv.defs.inc:238
+msgid "WebCfg - Diagnostics: States Summary page"
+msgstr "WebCfg - Diagnósticos: Página de Resumo de Estados"
+
+#: etc/inc/priv.defs.inc:215 etc/inc/priv.defs.inc:233
+#: etc/inc/priv.defs.inc:239
+msgid "Allow access to the 'Diagnostics: States Summary' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Resumo de Estados'."
+
+#: etc/inc/priv.defs.inc:232 etc/inc/priv.defs.inc:250
+#: etc/inc/priv.defs.inc:256
+msgid "WebCfg - Diagnostics: PF Table IP addresses"
+msgstr "WebCfg - Diagnósticos: Tabela PF de Endereços IP"
+
+#: etc/inc/priv.defs.inc:233 etc/inc/priv.defs.inc:251
+#: etc/inc/priv.defs.inc:257
+msgid "Allow access to the 'Diagnostics: Tables' page."
+msgstr "Permitir acesso à  página 'Diagnósticos: Tabelas'."
+
+#: etc/inc/priv.defs.inc:238 etc/inc/priv.defs.inc:256
+#: etc/inc/priv.defs.inc:262
+msgid "WebCfg - Diagnostics: Traceroute page"
+msgstr "WebCfg - Página Diagnóstico: Traceroute"
+
+#: etc/inc/priv.defs.inc:239 etc/inc/priv.defs.inc:257
+#: etc/inc/priv.defs.inc:263
+msgid "Allow access to the 'Diagnostics: Traceroute' page."
+msgstr "Permitir acesso à página 'Diagnóstico: Traceroute'."
+
+#: etc/inc/priv.defs.inc:244 etc/inc/priv.defs.inc:262
+#: etc/inc/priv.defs.inc:268
+msgid "WebCfg - Diagnostics: Edit FIle"
+msgstr "WebCfg - Diagnósticos: Editar arquivo"
+
+#: etc/inc/priv.defs.inc:245 etc/inc/priv.defs.inc:263
+#: etc/inc/priv.defs.inc:269
+msgid "Allow access to the 'Diagnostics: Edit File' page."
+msgstr "Permitir acesso à página 'Diagnósticos: Editar arquivo'."
+
+#: etc/inc/priv.defs.inc:250 etc/inc/priv.defs.inc:268
+#: etc/inc/priv.defs.inc:274 etc/inc/priv.defs.inc:276
+msgid "WebCfg - Diagnostics: Command page"
+msgstr "WebCfg - Página Diagnóstico: Comando"
+
+#: etc/inc/priv.defs.inc:251 etc/inc/priv.defs.inc:269
+#: etc/inc/priv.defs.inc:275 etc/inc/priv.defs.inc:277
+msgid "Allow access to the 'Diagnostics: Command' page."
+msgstr "Permitir acesso à página 'Diagnóstico: Comando'."
+
+#: etc/inc/priv.defs.inc:256 etc/inc/priv.defs.inc:274
+#: etc/inc/priv.defs.inc:280
+msgid "WebCfg - Hidden: Exec Raw page"
+msgstr "WebCfg - Página Escondida: Exec Raw"
+
+#: etc/inc/priv.defs.inc:257 etc/inc/priv.defs.inc:275
+#: etc/inc/priv.defs.inc:281
+msgid "Allow access to the 'Hidden: Exec Raw' page."
+msgstr "Permitir acesso à página 'Escondida: Exec Raw'."
+
+#: etc/inc/priv.defs.inc:262 etc/inc/priv.defs.inc:280
+#: etc/inc/priv.defs.inc:286 etc/inc/priv.defs.inc:282
+msgid "WebCfg - Firewall: Aliases page"
+msgstr "WebCfg - Página Firewall: Aliases"
+
+#: etc/inc/priv.defs.inc:263 etc/inc/priv.defs.inc:281
+#: etc/inc/priv.defs.inc:287 etc/inc/priv.defs.inc:283
+msgid "Allow access to the 'Firewall: Aliases' page."
+msgstr "Permitir acesso à página 'Firewall: Aliases'."
+
+#: etc/inc/priv.defs.inc:268 etc/inc/priv.defs.inc:286
+#: etc/inc/priv.defs.inc:292 etc/inc/priv.defs.inc:288
+msgid "WebCfg - Firewall: Alias: Edit page"
+msgstr "WebCfg - Página Firewall: Alias: Editar"
+
+#: etc/inc/priv.defs.inc:269 etc/inc/priv.defs.inc:287
+#: etc/inc/priv.defs.inc:293 etc/inc/priv.defs.inc:289
+msgid "Allow access to the 'Firewall: Alias: Edit' page."
+msgstr "Permitir acesso à página 'Firewall: Alias: Editar'."
+
+#: etc/inc/priv.defs.inc:274 etc/inc/priv.defs.inc:292
+#: etc/inc/priv.defs.inc:298 etc/inc/priv.defs.inc:294
+msgid "WebCfg - Firewall: Alias: Import page"
+msgstr "WebCfg - Página Firewall: Alias: Importação"
+
+#: etc/inc/priv.defs.inc:275 etc/inc/priv.defs.inc:293
+#: etc/inc/priv.defs.inc:299 etc/inc/priv.defs.inc:295
+msgid "Allow access to the 'Firewall: Alias: Import' page."
+msgstr "Permitir acesso à página 'Firewall: Alias: Importação'."
+
+#: etc/inc/priv.defs.inc:280 etc/inc/priv.defs.inc:298
+#: etc/inc/priv.defs.inc:304 etc/inc/priv.defs.inc:300
+msgid "WebCfg - Firewall: NAT: Port Forward page"
+msgstr "WebCfg - Página Firewall: NAT: Encaminhamento de Porta"
+
+#: etc/inc/priv.defs.inc:281 etc/inc/priv.defs.inc:299
+#: etc/inc/priv.defs.inc:305 etc/inc/priv.defs.inc:301
+msgid "Allow access to the 'Firewall: NAT: Port Forward' page."
+msgstr "Permitir acesso à  página 'Firewall: NAT: Encaminhamento de Porta'."
+
+#: etc/inc/priv.defs.inc:286 etc/inc/priv.defs.inc:304
+#: etc/inc/priv.defs.inc:310 etc/inc/priv.defs.inc:306
+msgid "WebCfg - Firewall: NAT: 1:1 page"
+msgstr "WebCfg - Página Firewall: NAT: 1:1"
+
+#: etc/inc/priv.defs.inc:287 etc/inc/priv.defs.inc:305
+#: etc/inc/priv.defs.inc:311 etc/inc/priv.defs.inc:307
+msgid "Allow access to the 'Firewall: NAT: 1:1' page."
+msgstr "Permitir acesso à página 'Firewall: NAT: 1:1'."
+
+#: etc/inc/priv.defs.inc:292 etc/inc/priv.defs.inc:310
+#: etc/inc/priv.defs.inc:316 etc/inc/priv.defs.inc:312
+msgid "WebCfg - Firewall: NAT: 1:1: Edit page"
+msgstr "WebCfg - Página Firewall: NAT: 1:1: Editar"
+
+#: etc/inc/priv.defs.inc:293 etc/inc/priv.defs.inc:311
+#: etc/inc/priv.defs.inc:317 etc/inc/priv.defs.inc:313
+msgid "Allow access to the 'Firewall: NAT: 1:1: Edit' page."
+msgstr "Permitir acesso à página 'Firewall: NAT: 1:1: Editar'."
+
+#: etc/inc/priv.defs.inc:298 etc/inc/priv.defs.inc:316
+#: etc/inc/priv.defs.inc:322 etc/inc/priv.defs.inc:318
+msgid "WebCfg - Firewall: NAT: Port Forward: Edit page"
+msgstr "WebCfg - Página Firewall: NAT: Encaminhamento de Porta"
+
+#: etc/inc/priv.defs.inc:299 etc/inc/priv.defs.inc:317
+#: etc/inc/priv.defs.inc:323 etc/inc/priv.defs.inc:319
+msgid "Allow access to the 'Firewall: NAT: Port Forward: Edit' page."
+msgstr "Permitir acesso à página 'Firewall: NAT: Encaminhamento de Porta'."
+
+#: etc/inc/priv.defs.inc:304 etc/inc/priv.defs.inc:322
+#: etc/inc/priv.defs.inc:328 etc/inc/priv.defs.inc:324
+msgid "WebCfg - Firewall: NAT: Outbound page"
+msgstr "WebCfg - Página Firewall: NAT: Outbound"
+
+#: etc/inc/priv.defs.inc:305 etc/inc/priv.defs.inc:323
+#: etc/inc/priv.defs.inc:329 etc/inc/priv.defs.inc:325
+msgid "Allow access to the 'Firewall: NAT: Outbound' page."
+msgstr "Permitir acesso à página 'Firewall: NAT: Outbound'."
+
+#: etc/inc/priv.defs.inc:310 etc/inc/priv.defs.inc:328
+#: etc/inc/priv.defs.inc:334 etc/inc/priv.defs.inc:330
+msgid "WebCfg - Firewall: NAT: Outbound: Edit page"
+msgstr "WebCfg - Página Firewall: NAT: Outbound: Editar"
+
+#: etc/inc/priv.defs.inc:311 etc/inc/priv.defs.inc:329
+#: etc/inc/priv.defs.inc:335 etc/inc/priv.defs.inc:331
+msgid "Allow access to the 'Firewall: NAT: Outbound: Edit' page."
+msgstr "Permitir acesso à página 'Firewall: NAT: Outbound: Editar'."
+
+#: etc/inc/priv.defs.inc:316 etc/inc/priv.defs.inc:334
+#: etc/inc/priv.defs.inc:340 etc/inc/priv.defs.inc:336
+msgid "WebCfg - Firewall: Rules page"
+msgstr "WebCfg - Página Firewall: Regras"
+
+#: etc/inc/priv.defs.inc:317 etc/inc/priv.defs.inc:335
+#: etc/inc/priv.defs.inc:341 etc/inc/priv.defs.inc:337
+msgid "Allow access to the 'Firewall: Rules' page."
+msgstr "Permitir acesso à página 'Firewall: Regras'."
+
+#: etc/inc/priv.defs.inc:322 etc/inc/priv.defs.inc:340
+#: etc/inc/priv.defs.inc:346 etc/inc/priv.defs.inc:342
+msgid "WebCfg - Firewall: Rules: Edit page"
+msgstr "WebCfg - Página Firewall: Regras: Editar"
+
+#: etc/inc/priv.defs.inc:323 etc/inc/priv.defs.inc:341
+#: etc/inc/priv.defs.inc:347 etc/inc/priv.defs.inc:343
+msgid "Allow access to the 'Firewall: Rules: Edit' page."
+msgstr "Permitir acesso à página 'Firewall: Regras: Editar'."
+
+#: etc/inc/priv.defs.inc:328 etc/inc/priv.defs.inc:346
+#: etc/inc/priv.defs.inc:352 etc/inc/priv.defs.inc:348
+msgid "WebCfg - Firewall: Schedules page"
+msgstr "WebCfg - Página Firewall: Agendas"
+
+#: etc/inc/priv.defs.inc:329 etc/inc/priv.defs.inc:347
+#: etc/inc/priv.defs.inc:353 etc/inc/priv.defs.inc:349
+msgid "Allow access to the 'Firewall: Schedules' page."
+msgstr "Permitir acesso à página 'Firewall: Agendas'."
+
+#: etc/inc/priv.defs.inc:334 etc/inc/priv.defs.inc:352
+#: etc/inc/priv.defs.inc:358 etc/inc/priv.defs.inc:354
+msgid "WebCfg - Firewall: Schedules: Edit page"
+msgstr "WebCfg - Página Firewall: Agendas: Editar"
+
+#: etc/inc/priv.defs.inc:335 etc/inc/priv.defs.inc:353
+#: etc/inc/priv.defs.inc:359 etc/inc/priv.defs.inc:355
+msgid "Allow access to the 'Firewall: Schedules: Edit' page."
+msgstr "Permitir acesso à página 'Firewall: Agendas: Editar'."
+
+#: etc/inc/priv.defs.inc:340 etc/inc/priv.defs.inc:358
+#: etc/inc/priv.defs.inc:364 etc/inc/priv.defs.inc:360
+msgid "WebCfg - Firewall: Traffic Shaper page"
+msgstr "WebCfg - Página Firewall: Traffic Shaper"
+
+#: etc/inc/priv.defs.inc:341 etc/inc/priv.defs.inc:359
+#: etc/inc/priv.defs.inc:365 etc/inc/priv.defs.inc:361
+msgid "Allow access to the 'Firewall: Traffic Shaper' page."
+msgstr "Permitir acesso à página 'Firewall: Traffic Shaper'."
+
+#: etc/inc/priv.defs.inc:346 etc/inc/priv.defs.inc:364
+#: etc/inc/priv.defs.inc:370 etc/inc/priv.defs.inc:366
+msgid "WebCfg - Firewall: Traffic Shaper: Layer7 page"
+msgstr "WebCfg - Página Firewall: Traffic Shaper: Layer7"
+
+#: etc/inc/priv.defs.inc:347 etc/inc/priv.defs.inc:365
+#: etc/inc/priv.defs.inc:371 etc/inc/priv.defs.inc:367
+msgid "Allow access to the 'Firewall: Traffic Shaper: Layer7' page."
+msgstr "Permitir acesso à página 'Firewall: Traffic Shaper: Layer7'."
+
+#: etc/inc/priv.defs.inc:352 etc/inc/priv.defs.inc:370
+#: etc/inc/priv.defs.inc:376 etc/inc/priv.defs.inc:372
+msgid "WebCfg - Firewall: Traffic Shaper: Queues page"
+msgstr "WebCfg - Página Firewall: Traffic Shaper: Filas"
+
+#: etc/inc/priv.defs.inc:353 etc/inc/priv.defs.inc:371
+#: etc/inc/priv.defs.inc:377 etc/inc/priv.defs.inc:373
+msgid "Allow access to the 'Firewall: Traffic Shaper: Queues' page."
+msgstr "Permitir acesso à página 'Firewall: Traffic Shaper: Filas'."
+
+#: etc/inc/priv.defs.inc:358 etc/inc/priv.defs.inc:376
+#: etc/inc/priv.defs.inc:382 etc/inc/priv.defs.inc:378
+msgid "WebCfg - Firewall: Traffic Shaper: Limiter page"
+msgstr "WebCfg - Página Firewall: Traffic Shaper: Limitador"
+
+#: etc/inc/priv.defs.inc:359 etc/inc/priv.defs.inc:377
+#: etc/inc/priv.defs.inc:383 etc/inc/priv.defs.inc:379
+msgid "Allow access to the 'Firewall: Traffic Shaper: Limiter' page."
+msgstr "Permitir acesso à página 'Firewall: Traffic Shaper: Limitador'."
+
+#: etc/inc/priv.defs.inc:364 etc/inc/priv.defs.inc:382
+#: etc/inc/priv.defs.inc:388 etc/inc/priv.defs.inc:384
+msgid "WebCfg - Firewall: Traffic Shaper: Wizard page"
+msgstr "WebCfg - Página Firewall: Traffic Shaper: Wizard"
+
+#: etc/inc/priv.defs.inc:365 etc/inc/priv.defs.inc:383
+#: etc/inc/priv.defs.inc:389 etc/inc/priv.defs.inc:385
+msgid "Allow access to the 'Firewall: Traffic Shaper: Wizard' page."
+msgstr "Permitir acesso à página 'Firewall: Traffic Shaper: Wizard'."
+
+#: etc/inc/priv.defs.inc:370 etc/inc/priv.defs.inc:388
+#: etc/inc/priv.defs.inc:394 etc/inc/priv.defs.inc:390
+msgid "WebCfg - Firewall: Virtual IP Addresses page"
+msgstr "WebCfg - Página Firewall: Endereços IP Virtuais"
+
+#: etc/inc/priv.defs.inc:371 etc/inc/priv.defs.inc:389
+#: etc/inc/priv.defs.inc:395 etc/inc/priv.defs.inc:391
+msgid "Allow access to the 'Firewall: Virtual IP Addresses' page."
+msgstr "Permitir acesso à Página 'Firewall: Endereços IP Virtuais'."
+
+#: etc/inc/priv.defs.inc:376 etc/inc/priv.defs.inc:394
+#: etc/inc/priv.defs.inc:400 etc/inc/priv.defs.inc:396
+msgid "WebCfg - Firewall: Virtual IP Address: Edit page"
+msgstr "WebCfg - Página Firewall: Endereços IP Virtuais: Editar"
+
+#: etc/inc/priv.defs.inc:377 etc/inc/priv.defs.inc:395
+#: etc/inc/priv.defs.inc:401 etc/inc/priv.defs.inc:397
+msgid "Allow access to the 'Firewall: Virtual IP Address: Edit' page."
+msgstr "Permitir acesso à página 'Firewall: Endereços IP Virtuais: Editar'."
+
+#: etc/inc/priv.defs.inc:382 etc/inc/priv.defs.inc:400
+#: etc/inc/priv.defs.inc:406 etc/inc/priv.defs.inc:402
+msgid "WebCfg - AJAX: Get Service Providers"
+msgstr "WebCfg - AJAX: Obter Provedores de Serviço"
+
+#: etc/inc/priv.defs.inc:383 etc/inc/priv.defs.inc:401
+#: etc/inc/priv.defs.inc:407 etc/inc/priv.defs.inc:403
+msgid "Allow access to the 'AJAX: Service Providers' page."
+msgstr "Permitir acesso à página 'AJAX: Provedores de Serviço'."
+
+#: etc/inc/priv.defs.inc:388 etc/inc/priv.defs.inc:406
+#: etc/inc/priv.defs.inc:412 etc/inc/priv.defs.inc:408
+msgid "WebCfg - AJAX: Get Stats"
+msgstr "WebCfg - Página AJAX: Obter Status"
+
+#: etc/inc/priv.defs.inc:389 etc/inc/priv.defs.inc:407
+#: etc/inc/priv.defs.inc:413 etc/inc/priv.defs.inc:409
+msgid "Allow access to the 'AJAX: Get Stats' page."
+msgstr "Permitir acesso à página 'AJAX: Obter Status'."
+
+#: etc/inc/priv.defs.inc:394 etc/inc/priv.defs.inc:412
+#: etc/inc/priv.defs.inc:418 etc/inc/priv.defs.inc:414
+msgid "WebCfg - Diagnostics: Interface Traffic page"
+msgstr "WebCfg - Página Diagnóstico: Tráfego de Interface"
+
+#: etc/inc/priv.defs.inc:395 etc/inc/priv.defs.inc:413
+#: etc/inc/priv.defs.inc:419 etc/inc/priv.defs.inc:415
+msgid "Allow access to the 'Diagnostics: Interface Traffic' page."
+msgstr "Permitir acesso à página 'Diagnóstico: Tráfego de Interface'."
+
+#: etc/inc/priv.defs.inc:400 etc/inc/priv.defs.inc:814
+#: etc/inc/priv.defs.inc:418 etc/inc/priv.defs.inc:832
+#: etc/inc/priv.defs.inc:424 etc/inc/priv.defs.inc:838
+#: etc/inc/priv.defs.inc:420 etc/inc/priv.defs.inc:846
+msgid "WebCfg - Diagnostics: CPU Utilization page"
+msgstr "WebCfg - Página Diagnóstico: Utilização de CPU"
+
+#: etc/inc/priv.defs.inc:401 etc/inc/priv.defs.inc:815
+#: etc/inc/priv.defs.inc:419 etc/inc/priv.defs.inc:833
+#: etc/inc/priv.defs.inc:425 etc/inc/priv.defs.inc:839
+#: etc/inc/priv.defs.inc:421 etc/inc/priv.defs.inc:847
+msgid "Allow access to the 'Diagnostics: CPU Utilization' page."
+msgstr "Permitir acesso à Página 'Diagnóstico: Utilização de CPU'."
+
+#: etc/inc/priv.defs.inc:406 etc/inc/priv.defs.inc:424
+#: etc/inc/priv.defs.inc:430 etc/inc/priv.defs.inc:426
+msgid "WebCfg - Diagnostics: Halt system page"
+msgstr "WebCfg - Página Diagnóstico: Desligar sistema"
+
+#: etc/inc/priv.defs.inc:407 etc/inc/priv.defs.inc:425
+#: etc/inc/priv.defs.inc:431 etc/inc/priv.defs.inc:427
+msgid "Allow access to the 'Diagnostics: Halt system' page."
+msgstr "Permitir acesso à página 'Diagnóstico: Desligar sistema'."
+
+#: etc/inc/priv.defs.inc:412 etc/inc/priv.defs.inc:430
+#: etc/inc/priv.defs.inc:436 etc/inc/priv.defs.inc:432
+msgid "WebCfg - Required for javascript page"
+msgstr "WebCfg - Página Requerido por javascript"
+
+#: etc/inc/priv.defs.inc:413 etc/inc/priv.defs.inc:431
+#: etc/inc/priv.defs.inc:437 etc/inc/priv.defs.inc:433
+msgid "Allow access to the 'Required for javascript' page."
+msgstr "Permitir acesso à página 'Requerido por javascript'."
+
+#: etc/inc/priv.defs.inc:418 etc/inc/priv.defs.inc:436
+#: etc/inc/priv.defs.inc:442 etc/inc/priv.defs.inc:438
+msgid "WebCfg - XMLRPC Interface Stats page"
+msgstr "WebCfg - Página Estatísticas de Interface XMLRPC"
+
+#: etc/inc/priv.defs.inc:419 etc/inc/priv.defs.inc:437
+#: etc/inc/priv.defs.inc:443 etc/inc/priv.defs.inc:439
+msgid "Allow access to the 'XMLRPC Interface Stats' page."
+msgstr "Permitir acesso à página 'Estatísticas de Interface XMLRPC'."
+
+#: etc/inc/priv.defs.inc:424 etc/inc/priv.defs.inc:442
+#: etc/inc/priv.defs.inc:448 etc/inc/priv.defs.inc:444
+msgid "WebCfg - System: Login / Logout page / Dashboard"
+msgstr "WebCfg - Sistema: Login / Página de Logout / Dashboard"
+
+#: etc/inc/priv.defs.inc:425 etc/inc/priv.defs.inc:443
+#: etc/inc/priv.defs.inc:449 etc/inc/priv.defs.inc:445
+msgid "Allow access to the 'System: Login / Logout' page and Dashboard."
+msgstr "Permitir acesso à página 'Sistema: Login / Logout' e Dashboard."
+
+#: etc/inc/priv.defs.inc:430 etc/inc/priv.defs.inc:448
+#: etc/inc/priv.defs.inc:454 etc/inc/priv.defs.inc:450
+msgid "WebCfg - Interfaces: WAN page"
+msgstr "WebCfg - Página Interfaces: WAN"
+
+#: etc/inc/priv.defs.inc:431 etc/inc/priv.defs.inc:449
+#: etc/inc/priv.defs.inc:455 etc/inc/priv.defs.inc:451
+msgid "Allow access to the 'Interfaces' page."
+msgstr "Permitir acesso à página 'Interfaces'."
+
+#: etc/inc/priv.defs.inc:436 etc/inc/priv.defs.inc:454
+#: etc/inc/priv.defs.inc:460 etc/inc/priv.defs.inc:456
+msgid "WebCfg - Interfaces: Assign network ports page"
+msgstr "WebCfg - Página Interfaces: Atribuir portas de rede"
+
+#: etc/inc/priv.defs.inc:437 etc/inc/priv.defs.inc:455
+#: etc/inc/priv.defs.inc:461 etc/inc/priv.defs.inc:457
+msgid "Allow access to the 'Interfaces: Assign network ports' page."
+msgstr "Permitir acesso à página 'Interfaces: Atribuir portas de rede'."
+
+#: etc/inc/priv.defs.inc:442 etc/inc/priv.defs.inc:460
+#: etc/inc/priv.defs.inc:466 etc/inc/priv.defs.inc:462
+msgid "WebCfg - Interfaces: Bridge page"
+msgstr "WebCfg - Página Interfaces: Ponte"
+
+#: etc/inc/priv.defs.inc:443 etc/inc/priv.defs.inc:461
+#: etc/inc/priv.defs.inc:467 etc/inc/priv.defs.inc:463
+msgid "Allow access to the 'Interfaces: Bridge' page."
+msgstr "Permitir acesso à página 'Interfaces: Ponte'."
+
+#: etc/inc/priv.defs.inc:448 etc/inc/priv.defs.inc:466
+#: etc/inc/priv.defs.inc:472 etc/inc/priv.defs.inc:468
+msgid "WebCfg - Interfaces: Bridge edit page"
+msgstr "WebCfg - Página Interfaces: Editar Ponte"
+
+#: etc/inc/priv.defs.inc:449 etc/inc/priv.defs.inc:467
+#: etc/inc/priv.defs.inc:473 etc/inc/priv.defs.inc:469
+msgid "Allow access to the 'Interfaces: Bridge : Edit' page."
+msgstr "Permitir acesso à página 'Interfaces: Editar Ponte'."
+
+#: etc/inc/priv.defs.inc:454 etc/inc/priv.defs.inc:472
+#: etc/inc/priv.defs.inc:478 etc/inc/priv.defs.inc:474
+msgid "WebCfg - Interfaces: GIF page"
+msgstr "WebCfg - Página Interfaces: GIF"
+
+#: etc/inc/priv.defs.inc:455 etc/inc/priv.defs.inc:473
+#: etc/inc/priv.defs.inc:479 etc/inc/priv.defs.inc:475
+msgid "Allow access to the 'Interfaces: GIF' page."
+msgstr "Permitir acesso à página 'Interfaces: GIF'."
+
+#: etc/inc/priv.defs.inc:460 etc/inc/priv.defs.inc:478
+#: etc/inc/priv.defs.inc:484 etc/inc/priv.defs.inc:480
+msgid "WebCfg - Interfaces: GIF: Edit page"
+msgstr "WebCfg - Página Interfaces: GIF: Editar"
+
+#: etc/inc/priv.defs.inc:461 etc/inc/priv.defs.inc:479
+#: etc/inc/priv.defs.inc:485 etc/inc/priv.defs.inc:481
+msgid "Allow access to the 'Interfaces: GIF: Edit' page."
+msgstr "Permitir acesso à página 'Interfaces: GIF: Editar'."
+
+#: etc/inc/priv.defs.inc:466 etc/inc/priv.defs.inc:484
+#: etc/inc/priv.defs.inc:490 etc/inc/priv.defs.inc:486
+msgid "WebCfg - Interfaces: GRE page"
+msgstr "WebCfg - Página Interfaces: GRE"
+
+#: etc/inc/priv.defs.inc:467 etc/inc/priv.defs.inc:485
+#: etc/inc/priv.defs.inc:491 etc/inc/priv.defs.inc:487
+msgid "Allow access to the 'Interfaces: GRE' page."
+msgstr "Permitir acesso à página 'Interfaces: GRE'."
+
+#: etc/inc/priv.defs.inc:472 etc/inc/priv.defs.inc:490
+#: etc/inc/priv.defs.inc:496 etc/inc/priv.defs.inc:492
+msgid "WebCfg - Interfaces: GRE: Edit page"
+msgstr "WebCfg - Página Interfaces: GRE: Editar"
+
+#: etc/inc/priv.defs.inc:473 etc/inc/priv.defs.inc:491
+#: etc/inc/priv.defs.inc:497 etc/inc/priv.defs.inc:493
+msgid "Allow access to the 'Interfaces: GRE: Edit' page."
+msgstr "Permitir acesso à página 'Interfaces: GRE: Editar'."
+
+#: etc/inc/priv.defs.inc:478 etc/inc/priv.defs.inc:496
+#: etc/inc/priv.defs.inc:502 etc/inc/priv.defs.inc:498
+msgid "WebCfg - Interfaces: Groups page"
+msgstr "WebCfg - Página Interfaces: Grupos"
+
+#: etc/inc/priv.defs.inc:479 etc/inc/priv.defs.inc:497
+#: etc/inc/priv.defs.inc:503 etc/inc/priv.defs.inc:499
+msgid "Create interface groups"
+msgstr "Criar grupos de interface"
+
+#: etc/inc/priv.defs.inc:484 etc/inc/priv.defs.inc:502
+#: etc/inc/priv.defs.inc:508 etc/inc/priv.defs.inc:504
+msgid "WebCfg - Interfaces: Groups: Edit page"
+msgstr "WebCfg - Página Interfaces: Grupos: Editar"
+
+#: etc/inc/priv.defs.inc:485 etc/inc/priv.defs.inc:503
+#: etc/inc/priv.defs.inc:509 etc/inc/priv.defs.inc:505
+msgid "Edit Interface groups"
+msgstr "Editar grupos de Interface"
+
+#: etc/inc/priv.defs.inc:490 etc/inc/priv.defs.inc:508
+#: etc/inc/priv.defs.inc:514 etc/inc/priv.defs.inc:510
+msgid "WebCfg - Interfaces: LAGG: page"
+msgstr "WebCfg - Página Interfaces: LAGG"
+
+#: etc/inc/priv.defs.inc:491 etc/inc/priv.defs.inc:497
+#: etc/inc/priv.defs.inc:509 etc/inc/priv.defs.inc:515
+#: etc/inc/priv.defs.inc:521 etc/inc/priv.defs.inc:511
+#: etc/inc/priv.defs.inc:517
+msgid "Edit Interface LAGG"
+msgstr "Editar LAGG da Interface"
+
+#: etc/inc/priv.defs.inc:496 etc/inc/priv.defs.inc:514
+#: etc/inc/priv.defs.inc:520 etc/inc/priv.defs.inc:516
+msgid "WebCfg - Interfaces: LAGG: Edit page"
+msgstr "WebCfg - Página Interfaces: LAGG: Editar"
+
+#: etc/inc/priv.defs.inc:502 etc/inc/priv.defs.inc:520
+#: etc/inc/priv.defs.inc:526 etc/inc/priv.defs.inc:522
+msgid "WebCfg - Interfaces: ppps page"
+msgstr "WebCfg - Interfaces: Página PPPs"
+
+#: etc/inc/priv.defs.inc:503 etc/inc/priv.defs.inc:521
+#: etc/inc/priv.defs.inc:527 etc/inc/priv.defs.inc:523
+msgid "Allow access to the 'Interfaces: ppps' page."
+msgstr "Permitir acesso à página 'Interfaces: PPPs'."
+
+#: etc/inc/priv.defs.inc:508 etc/inc/priv.defs.inc:526
+#: etc/inc/priv.defs.inc:532 etc/inc/priv.defs.inc:528
+msgid "WebCfg - Interfaces: PPPs: Edit page"
+msgstr "WebCfg - Interfaces: PPPs: Editar página"
+
+#: etc/inc/priv.defs.inc:509 etc/inc/priv.defs.inc:527
+#: etc/inc/priv.defs.inc:533 etc/inc/priv.defs.inc:529
+msgid "Allow access to the 'Interfaces: PPPs: Edit' page."
+msgstr "Permitir acesso à página 'Interfaces: PPPs: Editar página'."
+
+#: etc/inc/priv.defs.inc:514 etc/inc/priv.defs.inc:532
+#: etc/inc/priv.defs.inc:538 etc/inc/priv.defs.inc:534
+msgid "WebCfg - Interfaces: QinQ page"
+msgstr "WebCfg - Página Interfaces: QinQ"
+
+#: etc/inc/priv.defs.inc:515 etc/inc/priv.defs.inc:533
+#: etc/inc/priv.defs.inc:539 etc/inc/priv.defs.inc:535
+msgid "Allow access to the 'Interfaces: QinQ' page."
+msgstr "Permitir acesso à página 'Interfaces: QinQ'."
+
+#: etc/inc/priv.defs.inc:520 etc/inc/priv.defs.inc:538
+#: etc/inc/priv.defs.inc:544 etc/inc/priv.defs.inc:540
+msgid "WebCfg - Interfaces: QinQ: Edit page"
+msgstr "WebCfg - Página Interfaces: QinQ: Editar"
+
+#: etc/inc/priv.defs.inc:521 etc/inc/priv.defs.inc:539
+#: etc/inc/priv.defs.inc:545 etc/inc/priv.defs.inc:541
+msgid "Edit Interface qinq"
+msgstr "Editar Qinq da Interface"
+
+#: etc/inc/priv.defs.inc:526 etc/inc/priv.defs.inc:544
+#: etc/inc/priv.defs.inc:550 etc/inc/priv.defs.inc:546
+msgid "WebCfg - Interfaces: VLAN page"
+msgstr "WebCfg - Página Interfaces: VLAN"
+
+#: etc/inc/priv.defs.inc:527 etc/inc/priv.defs.inc:545
+#: etc/inc/priv.defs.inc:551 etc/inc/priv.defs.inc:547
+msgid "Allow access to the 'Interfaces: VLAN' page."
+msgstr "Permitir acesso à página 'Interfaces: VLAN'."
+
+#: etc/inc/priv.defs.inc:532 etc/inc/priv.defs.inc:550
+#: etc/inc/priv.defs.inc:556 etc/inc/priv.defs.inc:552
+msgid "WebCfg - Interfaces: VLAN: Edit page"
+msgstr "WebCfg - Página Interfaces: VLAN: Editar"
+
+#: etc/inc/priv.defs.inc:533 etc/inc/priv.defs.inc:551
+#: etc/inc/priv.defs.inc:557 etc/inc/priv.defs.inc:553
+msgid "Allow access to the 'Interfaces: VLAN: Edit' page."
+msgstr "Permitir acesso à página 'Interfaces: VLAN'."
+
+#: etc/inc/priv.defs.inc:538 etc/inc/priv.defs.inc:556
+#: etc/inc/priv.defs.inc:562 etc/inc/priv.defs.inc:558
+msgid "WebCfg - Interfaces: Wireless page"
+msgstr "WebCfg - Página Interfaces: Sem fio"
+
+#: etc/inc/priv.defs.inc:539 etc/inc/priv.defs.inc:557
+#: etc/inc/priv.defs.inc:563 etc/inc/priv.defs.inc:559
+msgid "Allow access to the 'Interfaces: Wireless' page."
+msgstr "Permitir acesso à página 'Interfaces: Sem fio'."
+
+#: etc/inc/priv.defs.inc:544 etc/inc/priv.defs.inc:562
+#: etc/inc/priv.defs.inc:568 etc/inc/priv.defs.inc:564
+msgid "WebCfg - Interfaces: Wireless edit page"
+msgstr "WebCfg - Página Interfaces: Editar Sem fio"
+
+#: etc/inc/priv.defs.inc:545 etc/inc/priv.defs.inc:563
+#: etc/inc/priv.defs.inc:569 etc/inc/priv.defs.inc:565
+msgid "Allow access to the 'Interfaces: Wireless : Edit' page."
+msgstr "WebCfg - Página 'Interfaces: Editar Sem fio'."
+
+#: etc/inc/priv.defs.inc:550 etc/inc/priv.defs.inc:568
+#: etc/inc/priv.defs.inc:574 etc/inc/priv.defs.inc:570
+msgid "WebCfg - System: License page"
+msgstr "WebCfg - Página Sistema: Licença"
+
+#: etc/inc/priv.defs.inc:551 etc/inc/priv.defs.inc:569
+#: etc/inc/priv.defs.inc:575 etc/inc/priv.defs.inc:571
+msgid "Allow access to the 'System: License' page."
+msgstr "Permitir acesso à página 'Sistema: Licença'."
+
+#: etc/inc/priv.defs.inc:556 etc/inc/priv.defs.inc:574
+#: etc/inc/priv.defs.inc:580 etc/inc/priv.defs.inc:576
+msgid "WebCfg - Services: Load Balancer: Monitors page"
+msgstr "WebCfg - Página Serviços: Balanceador de Carga: Monitores"
+
+#: etc/inc/priv.defs.inc:557 etc/inc/priv.defs.inc:575
+#: etc/inc/priv.defs.inc:581 etc/inc/priv.defs.inc:577
+msgid "Allow access to the 'Services: Load Balancer: Monitors' page."
+msgstr "Permitir acesso à página 'Serviços: Balanceador de Carga: Monitores'."
+
+#: etc/inc/priv.defs.inc:562 etc/inc/priv.defs.inc:580
+#: etc/inc/priv.defs.inc:586 etc/inc/priv.defs.inc:582
+msgid "WebCfg - Services: Load Balancer: Monitor: Edit page"
+msgstr "WebCfg - Página Serviços: Balanceador de Carga: Monitores: Editar"
+
+#: etc/inc/priv.defs.inc:563 etc/inc/priv.defs.inc:581
+#: etc/inc/priv.defs.inc:587 etc/inc/priv.defs.inc:583
+msgid "Allow access to the 'Services: Load Balancer: Monitor: Edit' page."
+msgstr "Permitir acesso à página 'Serviços: Balanceador de Carga: Monitores: Editar'."
+
+#: etc/inc/priv.defs.inc:568 etc/inc/priv.defs.inc:586
+#: etc/inc/priv.defs.inc:592 etc/inc/priv.defs.inc:588
+msgid "WebCfg - Load Balancer: Pool page"
+msgstr "WebCfg - Página Balanceador de Carga: Pool"
+
+#: etc/inc/priv.defs.inc:569 etc/inc/priv.defs.inc:587
+#: etc/inc/priv.defs.inc:593 etc/inc/priv.defs.inc:589
+msgid "Allow access to the 'Load Balancer: Pool' page."
+msgstr "Permitir acesso à página 'Balanceador de Carga: Pool'."
+
+#: etc/inc/priv.defs.inc:574 etc/inc/priv.defs.inc:592
+#: etc/inc/priv.defs.inc:598 etc/inc/priv.defs.inc:594
+msgid "WebCfg - Load Balancer: Pool: Edit page"
+msgstr "WebCfg - Página Balanceador de Carga: Pool: Editar"
+
+#: etc/inc/priv.defs.inc:575 etc/inc/priv.defs.inc:593
+#: etc/inc/priv.defs.inc:599 etc/inc/priv.defs.inc:595
+msgid "Allow access to the 'Load Balancer: Pool: Edit' page."
+msgstr "Permitir acesso à página 'Balanceador de Carga: Pool: Editar'."
+
+#: etc/inc/priv.defs.inc:580 etc/inc/priv.defs.inc:598
+#: etc/inc/priv.defs.inc:604 etc/inc/priv.defs.inc:600
+msgid "WebCfg - Services: Load Balancer: Relay Actions page"
+msgstr "WebCfg - Página Serviços: Balanceador de Carga: Ações de Relay"
+
+#: etc/inc/priv.defs.inc:581 etc/inc/priv.defs.inc:599
+#: etc/inc/priv.defs.inc:605 etc/inc/priv.defs.inc:601
+msgid "Allow access to the 'Services: Load Balancer: Relay Actions' page."
+msgstr "Permitir acesso à página 'Página Serviços: Balanceador de Carga: Ações de Relay'."
+
+#: etc/inc/priv.defs.inc:586 etc/inc/priv.defs.inc:604
+#: etc/inc/priv.defs.inc:610 etc/inc/priv.defs.inc:606
+msgid "WebCfg - Services: Load Balancer: Relay Action: Edit page"
+msgstr "WebCfg - Serviços: Balanceador de Carga: Ações de Relay: Página Editar"
+
+#: etc/inc/priv.defs.inc:587 etc/inc/priv.defs.inc:605
+#: etc/inc/priv.defs.inc:611 etc/inc/priv.defs.inc:607
+msgid "Allow access to the 'Services: Load Balancer: Relay Action: Edit' page."
+msgstr "Permitir acesso à página 'Página Serviços: Balanceador de Carga: Ações de Relay: Editar'."
+
+#: etc/inc/priv.defs.inc:592 etc/inc/priv.defs.inc:610
+#: etc/inc/priv.defs.inc:616 etc/inc/priv.defs.inc:612
+msgid "WebCfg - Services: Load Balancer: Relay Protocols page"
+msgstr "WebCfg - Página Serviços: Balanceador de Carga: Protocolos Relay"
+
+#: etc/inc/priv.defs.inc:593 etc/inc/priv.defs.inc:611
+#: etc/inc/priv.defs.inc:617 etc/inc/priv.defs.inc:613
+msgid "Allow access to the 'Services: Load Balancer: Relay Protocols' page."
+msgstr "Permitir acesso à página 'Serviços: Balanceador de Carga: Protocolos Relay'."
+
+#: etc/inc/priv.defs.inc:598 etc/inc/priv.defs.inc:616
+#: etc/inc/priv.defs.inc:622 etc/inc/priv.defs.inc:618
+msgid "WebCfg - Services: Load Balancer: Relay Protocol: Edit page"
+msgstr "WebCfg - Página Serviços: Balanceador de Carga: Protocolo Relay: Editar"
+
+#: etc/inc/priv.defs.inc:599 etc/inc/priv.defs.inc:617
+#: etc/inc/priv.defs.inc:623 etc/inc/priv.defs.inc:619
+msgid "Allow access to the 'Services: Load Balancer: Relay Protocol: Edit' page."
+msgstr "Permitir acesso à  página 'Serviços: Balanceador de Carga: Protocolo Relay: Editar'."
+
+#: etc/inc/priv.defs.inc:604 etc/inc/priv.defs.inc:622
+#: etc/inc/priv.defs.inc:628 etc/inc/priv.defs.inc:624
+msgid "WebCfg - Services: Load Balancer: Virtual Servers page"
+msgstr "WebCfg - Página Serviços: Balanceador de Carga: Servidores Virtuais"
+
+#: etc/inc/priv.defs.inc:605 etc/inc/priv.defs.inc:623
+#: etc/inc/priv.defs.inc:629 etc/inc/priv.defs.inc:625
+msgid "Allow access to the 'Services: Load Balancer: Virtual Servers' page."
+msgstr "Permitir acesso à página 'Serviços: Balanceador de Carga: Servidores Virtuais'."
+
+#: etc/inc/priv.defs.inc:610 etc/inc/priv.defs.inc:628
+#: etc/inc/priv.defs.inc:634 etc/inc/priv.defs.inc:630
+msgid "WebCfg - Load Balancer: Virtual Server: Edit page"
+msgstr "WebCfg - Página Balanceador de Carga: Servidor Virtual: Editar"
+
+#: etc/inc/priv.defs.inc:611 etc/inc/priv.defs.inc:629
+#: etc/inc/priv.defs.inc:635 etc/inc/priv.defs.inc:631
+msgid "Allow access to the 'Load Balancer: Virtual Server: Edit' page."
+msgstr "Permitir acesso à página 'Balanceador de Carga: Servidor Virtual: Editar'."
+
+#: etc/inc/priv.defs.inc:616 etc/inc/priv.defs.inc:634
+#: etc/inc/priv.defs.inc:640 etc/inc/priv.defs.inc:636
+msgid "WebCfg - Package: Settings page"
+msgstr "WebCfg - Página Pacote: Configurações"
+
+#: etc/inc/priv.defs.inc:617 etc/inc/priv.defs.inc:635
+#: etc/inc/priv.defs.inc:641 etc/inc/priv.defs.inc:637
+msgid "Allow access to the 'Package: Settings' page."
+msgstr "Permitir acesso à página 'Pacote: Configurações'."
+
+#: etc/inc/priv.defs.inc:622 etc/inc/priv.defs.inc:640
+#: etc/inc/priv.defs.inc:646 etc/inc/priv.defs.inc:642
+msgid "WebCfg - Package: Edit page"
+msgstr "WebCfg - Página Pacote: Editar"
+
+#: etc/inc/priv.defs.inc:623 etc/inc/priv.defs.inc:641
+#: etc/inc/priv.defs.inc:647 etc/inc/priv.defs.inc:643
+msgid "Allow access to the 'Package: Edit' page."
+msgstr "Permitir acesso à página 'Pacote: Editar'."
+
+#: etc/inc/priv.defs.inc:628 etc/inc/priv.defs.inc:646
+#: etc/inc/priv.defs.inc:652 etc/inc/priv.defs.inc:648
+msgid "WebCfg - System: Package Manager page"
+msgstr "WebCfg - Página Sistema: Gerenciador de Pacote"
+
+#: etc/inc/priv.defs.inc:629 etc/inc/priv.defs.inc:647
+#: etc/inc/priv.defs.inc:653 etc/inc/priv.defs.inc:649
+msgid "Allow access to the 'System: Package Manager' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de Pacote'."
+
+#: etc/inc/priv.defs.inc:634 etc/inc/priv.defs.inc:652
+#: etc/inc/priv.defs.inc:658 etc/inc/priv.defs.inc:654
+msgid "WebCfg - System: Package Manager: Install Package page"
+msgstr "WebCfg - Página Sistema: Gerenciador de Pacote: Instalar Pacote"
+
+#: etc/inc/priv.defs.inc:635 etc/inc/priv.defs.inc:653
+#: etc/inc/priv.defs.inc:659 etc/inc/priv.defs.inc:655
+msgid "Allow access to the 'System: Package Manager: Install Package' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de Pacote: Instalar Pacote'."
+
+#: etc/inc/priv.defs.inc:640 etc/inc/priv.defs.inc:658
+#: etc/inc/priv.defs.inc:664 etc/inc/priv.defs.inc:660
+msgid "WebCfg - System: Package Manager: Installed page"
+msgstr "WebCfg - Página Sistema: Gerenciador de Pacote: Instalado"
+
+#: etc/inc/priv.defs.inc:641 etc/inc/priv.defs.inc:659
+#: etc/inc/priv.defs.inc:665 etc/inc/priv.defs.inc:661
+msgid "Allow access to the 'System: Package Manager: Installed' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de Pacote: Instalado'."
+
+#: etc/inc/priv.defs.inc:646 etc/inc/priv.defs.inc:664
+#: etc/inc/priv.defs.inc:670 etc/inc/priv.defs.inc:666
+msgid "WebCfg - Packages: Settings page"
+msgstr "WebCfg - Página Pacotes: Configurações"
+
+#: etc/inc/priv.defs.inc:647 etc/inc/priv.defs.inc:665
+#: etc/inc/priv.defs.inc:671 etc/inc/priv.defs.inc:667
+msgid "Allow access to the 'Packages: Settings' page."
+msgstr "Permitir acesso à página 'Pacotes: Configurações'."
+
+#: etc/inc/priv.defs.inc:652 etc/inc/priv.defs.inc:670
+#: etc/inc/priv.defs.inc:676 etc/inc/priv.defs.inc:672
+msgid "WebCfg - Diagnostics: Reboot System page"
+msgstr "WebCfg - Página Diagnóstico: Reiniciar Sistema"
+
+#: etc/inc/priv.defs.inc:653 etc/inc/priv.defs.inc:671
+#: etc/inc/priv.defs.inc:677 etc/inc/priv.defs.inc:673
+msgid "Allow access to the 'Diagnostics: Reboot System' page."
+msgstr "Permitir acesso à página 'Diagnóstico: Reiniciar Sistema'."
+
+#: etc/inc/priv.defs.inc:658 etc/inc/priv.defs.inc:676
+#: etc/inc/priv.defs.inc:682 etc/inc/priv.defs.inc:678
+msgid "WebCfg - Diagnostics: Restart HTTPD : System page"
+msgstr "WebCfg - Página Diagnóstico: Reiniciar HTTPD: Sistema"
+
+#: etc/inc/priv.defs.inc:659 etc/inc/priv.defs.inc:677
+#: etc/inc/priv.defs.inc:683 etc/inc/priv.defs.inc:679
+msgid "Allow access to the 'Diagnostics: Restart HTTPD: System' page."
+msgstr "Permitir acesso à página 'Diagnóstico: Reiniciar HTTPD: Sistema'."
+
+#: etc/inc/priv.defs.inc:664 etc/inc/priv.defs.inc:682
+#: etc/inc/priv.defs.inc:688 etc/inc/priv.defs.inc:684
+msgid "WebCfg - Services: Captive portal page"
+msgstr "WebCfg - Página Serviços: Portal Captive"
+
+#: etc/inc/priv.defs.inc:665 etc/inc/priv.defs.inc:683
+#: etc/inc/priv.defs.inc:689 etc/inc/priv.defs.inc:685
+msgid "Allow access to the 'Services: Captive portal' page."
+msgstr "Permitir acesso à página 'Serviços: Portal Captive'."
+
+#: etc/inc/priv.defs.inc:670 etc/inc/priv.defs.inc:688
+#: etc/inc/priv.defs.inc:694 etc/inc/priv.defs.inc:690
+msgid "WebCfg - Services: Captive portal: File Manager page"
+msgstr "WebCfg - Página Serviços: Portal Captive: Gerenciador de Arquivo"
+
+#: etc/inc/priv.defs.inc:671 etc/inc/priv.defs.inc:689
+#: etc/inc/priv.defs.inc:695 etc/inc/priv.defs.inc:691
+msgid "Allow access to the 'Services: Captive portal: File Manager' page."
+msgstr "Permitir acesso à página 'Serviços: Portal Captive: Gerenciador de Arquivo'."
+
+#: etc/inc/priv.defs.inc:676 etc/inc/priv.defs.inc:688
+#: etc/inc/priv.defs.inc:694 etc/inc/priv.defs.inc:706
+#: etc/inc/priv.defs.inc:700 etc/inc/priv.defs.inc:712
+#: etc/inc/priv.defs.inc:696 etc/inc/priv.defs.inc:708
+msgid "WebCfg - Services: Captive portal: Allowed IPs page"
+msgstr "WebCfg - Página Sistema: Portal Captive: IPs permitidos"
+
+#: etc/inc/priv.defs.inc:677 etc/inc/priv.defs.inc:689
+#: etc/inc/priv.defs.inc:695 etc/inc/priv.defs.inc:707
+#: etc/inc/priv.defs.inc:701 etc/inc/priv.defs.inc:713
+#: etc/inc/priv.defs.inc:697 etc/inc/priv.defs.inc:709
+msgid "Allow access to the 'Services: Captive portal: Allowed IPs' page."
+msgstr "Permitir acesso à página 'Serviços: Portal Captive: IPs Permitidos'."
+
+#: etc/inc/priv.defs.inc:682 etc/inc/priv.defs.inc:694
+#: etc/inc/priv.defs.inc:700 etc/inc/priv.defs.inc:712
+#: etc/inc/priv.defs.inc:706 etc/inc/priv.defs.inc:718
+#: etc/inc/priv.defs.inc:702 etc/inc/priv.defs.inc:714
+msgid "WebCfg - Services: Captive portal: Edit Allowed IPs page"
+msgstr "WebCfg - Página Serviços: Portal Captive: Editar IPs Permitidos"
+
+#: etc/inc/priv.defs.inc:683 etc/inc/priv.defs.inc:695
+#: etc/inc/priv.defs.inc:701 etc/inc/priv.defs.inc:713
+#: etc/inc/priv.defs.inc:707 etc/inc/priv.defs.inc:719
+#: etc/inc/priv.defs.inc:703 etc/inc/priv.defs.inc:715
+msgid "Allow access to the 'Services: Captive portal: Edit Allowed IPs' page."
+msgstr "Permitir acesso à página 'Serviços: Portal Captive: Editar IPs Permitidos'."
+
+#: etc/inc/priv.defs.inc:700 etc/inc/priv.defs.inc:718
+#: etc/inc/priv.defs.inc:724 etc/inc/priv.defs.inc:720
+msgid "WebCfg - Services: Captive portal: Mac Addresses page"
+msgstr "WebCfg - Página Serviços: Portal Captive: Endereços MAC"
+
+#: etc/inc/priv.defs.inc:701 etc/inc/priv.defs.inc:719
+#: etc/inc/priv.defs.inc:725 etc/inc/priv.defs.inc:721
+msgid "Allow access to the 'Services: Captive portal: Mac Addresses' page."
+msgstr "Permitir acesso à página 'Serviços: Portal Captive: Endereços MAC'."
+
+#: etc/inc/priv.defs.inc:706 etc/inc/priv.defs.inc:724
+#: etc/inc/priv.defs.inc:730 etc/inc/priv.defs.inc:726
+msgid "WebCfg - Services: Captive portal: Edit MAC Addresses page"
+msgstr "WebCfg - Página Serviços: Portal Captive: Editar Endereços MAC"
+
+#: etc/inc/priv.defs.inc:707 etc/inc/priv.defs.inc:725
+#: etc/inc/priv.defs.inc:731 etc/inc/priv.defs.inc:727
+msgid "Allow access to the 'Services: Captive portal: Edit MAC Addresses' page."
+msgstr "Permitir acesso à página 'Serviços: Portal Captive: Endereços MAC'."
+
+#: etc/inc/priv.defs.inc:712 etc/inc/priv.defs.inc:730
+#: etc/inc/priv.defs.inc:736 etc/inc/priv.defs.inc:744
+msgid "WebCfg - Services: Captive portal Vouchers page"
+msgstr "WebCfg - Página Serviços: Vouchers do portal Captive"
+
+#: etc/inc/priv.defs.inc:713 etc/inc/priv.defs.inc:731
+#: etc/inc/priv.defs.inc:737 etc/inc/priv.defs.inc:745
+msgid "Allow access to the 'Services: Captive portal Vouchers' page."
+msgstr "Permitir acesso à página 'Serviços: Vouchers do portal Captive'."
+
+#: etc/inc/priv.defs.inc:724 etc/inc/priv.defs.inc:742
+#: etc/inc/priv.defs.inc:748 etc/inc/priv.defs.inc:756
+msgid "WebCfg - Services: DHCP server page"
+msgstr "WebCfg - Página Serviços: Servidor DHCP"
+
+#: etc/inc/priv.defs.inc:725 etc/inc/priv.defs.inc:743
+#: etc/inc/priv.defs.inc:749 etc/inc/priv.defs.inc:757
+msgid "Allow access to the 'Services: DHCP server' page."
+msgstr "Permitir acesso à página 'Serviços: Servidor DHCP'."
+
+#: etc/inc/priv.defs.inc:730 etc/inc/priv.defs.inc:748
+#: etc/inc/priv.defs.inc:754 etc/inc/priv.defs.inc:762
+msgid "WebCfg - Services: DHCP Server : Edit static mapping page"
+msgstr "WebCfg - Página Serviços: Servidor DHCP: Editar mapeamento estático"
+
+#: etc/inc/priv.defs.inc:731 etc/inc/priv.defs.inc:749
+#: etc/inc/priv.defs.inc:755 etc/inc/priv.defs.inc:763
+msgid "Allow access to the 'Services: DHCP Server : Edit static mapping' page."
+msgstr "Permitir acesso à página 'Serviços: Servidor DHCP: Editar mapeamento estático'."
+
+#: etc/inc/priv.defs.inc:736 etc/inc/priv.defs.inc:754
+#: etc/inc/priv.defs.inc:760 etc/inc/priv.defs.inc:768
+msgid "WebCfg - Services: DHCP Relay page"
+msgstr "WebCfg - Página Serviços: DHCP Relay"
+
+#: etc/inc/priv.defs.inc:737 etc/inc/priv.defs.inc:755
+#: etc/inc/priv.defs.inc:761 etc/inc/priv.defs.inc:769
+msgid "Allow access to the 'Services: DHCP Relay' page."
+msgstr "Permitir acesso à página 'Serviços: DHCP Relay'."
+
+#: etc/inc/priv.defs.inc:742 etc/inc/priv.defs.inc:760
+#: etc/inc/priv.defs.inc:766 etc/inc/priv.defs.inc:774
+msgid "WebCfg - Services: DHCPv6 Relay page"
+msgstr "WebCfg - Serviços: Página DHCPv6 Relay"
+
+#: etc/inc/priv.defs.inc:743 etc/inc/priv.defs.inc:761
+#: etc/inc/priv.defs.inc:767 etc/inc/priv.defs.inc:775
+msgid "Allow access to the 'Services: DHCPv6 Relay' page."
+msgstr "Permitir acesso à página 'Serviços: DHCPv6 Relay'."
+
+#: etc/inc/priv.defs.inc:748 etc/inc/priv.defs.inc:766
+#: etc/inc/priv.defs.inc:772 etc/inc/priv.defs.inc:780
+msgid "WebCfg - Services: DNS Forwarder page"
+msgstr "WebCfg - Página Serviços: DNS Forwarder"
+
+#: etc/inc/priv.defs.inc:749 etc/inc/priv.defs.inc:767
+#: etc/inc/priv.defs.inc:773 etc/inc/priv.defs.inc:781
+msgid "Allow access to the 'Services: DNS Forwarder' page."
+msgstr "Permitir acesso à página 'Serviços: DNS Forwarder'."
+
+#: etc/inc/priv.defs.inc:754 etc/inc/priv.defs.inc:772
+#: etc/inc/priv.defs.inc:778 etc/inc/priv.defs.inc:786
+msgid "WebCfg - Services: DNS Forwarder: Edit Domain Override page"
+msgstr "WebCfg - Página Serviços: DNS Forwarder: Editar Substituição de Domínio"
+
+#: etc/inc/priv.defs.inc:755 etc/inc/priv.defs.inc:773
+#: etc/inc/priv.defs.inc:779 etc/inc/priv.defs.inc:787
+msgid "Allow access to the 'Services: DNS Forwarder: Edit Domain Override' page."
+msgstr "Permitir acesso à página 'Serviços: DNS Forwarder: Editar Substituição de Domínio'."
+
+#: etc/inc/priv.defs.inc:760 etc/inc/priv.defs.inc:778
+#: etc/inc/priv.defs.inc:784 etc/inc/priv.defs.inc:792
+msgid "WebCfg - Services: DNS Forwarder: Edit host page"
+msgstr "WebCfg - Página Serviços: DNS Forwarder: Editar"
+
+#: etc/inc/priv.defs.inc:761 etc/inc/priv.defs.inc:779
+#: etc/inc/priv.defs.inc:785 etc/inc/priv.defs.inc:793
+msgid "Allow access to the 'Services: DNS Forwarder: Edit host' page."
+msgstr "Permitir acesso à página 'Serviços: DNS Forwarder: Editar'."
+
+#: etc/inc/priv.defs.inc:766 etc/inc/priv.defs.inc:784
+#: etc/inc/priv.defs.inc:790 etc/inc/priv.defs.inc:798
+msgid "WebCfg - Services: Dynamic DNS clients page"
+msgstr "WebCfg - Página Serviços: Clientes DNS Dinâmico"
+
+#: etc/inc/priv.defs.inc:767 etc/inc/priv.defs.inc:785
+#: etc/inc/priv.defs.inc:791 etc/inc/priv.defs.inc:799
+msgid "Allow access to the 'Services: Dynamic DNS clients' page."
+msgstr "Permitir acesso à página 'Serviços: Clientes DNS Dinâmico'."
+
+#: etc/inc/priv.defs.inc:772 etc/inc/priv.defs.inc:790
+#: etc/inc/priv.defs.inc:796 etc/inc/priv.defs.inc:804
+msgid "WebCfg - Services: Dynamic DNS client page"
+msgstr "WebCfg - Página Serviços: Cliente DNS Dinâmico"
+
+#: etc/inc/priv.defs.inc:773 etc/inc/priv.defs.inc:791
+#: etc/inc/priv.defs.inc:797 etc/inc/priv.defs.inc:805
+msgid "Allow access to the 'Services: Dynamic DNS client' page."
+msgstr "Permitir acesso à página 'Serviços: Cliente DNS Dinâmico'."
+
+#: etc/inc/priv.defs.inc:778 etc/inc/priv.defs.inc:796
+#: etc/inc/priv.defs.inc:802 etc/inc/priv.defs.inc:810
+msgid "WebCfg - Services: Igmpproxy page"
+msgstr "WebCfg - Página Serviços: Igmpproxy"
+
+#: etc/inc/priv.defs.inc:779 etc/inc/priv.defs.inc:797
+#: etc/inc/priv.defs.inc:803 etc/inc/priv.defs.inc:811
+msgid "Allow access to the 'Services: Igmpproxy' page."
+msgstr "Permitir acesso à página 'Serviços: Igmpproxy'."
+
+#: etc/inc/priv.defs.inc:784 etc/inc/priv.defs.inc:802
+#: etc/inc/priv.defs.inc:808 etc/inc/priv.defs.inc:816
+msgid "WebCfg - Firewall: Igmpproxy: Edit page"
+msgstr "WebCfg - Página Firewall: Igmpproxy: Editar"
+
+#: etc/inc/priv.defs.inc:785 etc/inc/priv.defs.inc:803
+#: etc/inc/priv.defs.inc:809 etc/inc/priv.defs.inc:817
+msgid "Allow access to the 'Firewall: Igmpproxy' page."
+msgstr "Permitir acesso à página 'Firewall: Igmpproxy:'."
+
+#: etc/inc/priv.defs.inc:790 etc/inc/priv.defs.inc:808
+#: etc/inc/priv.defs.inc:814 etc/inc/priv.defs.inc:822
+msgid "WebCfg - Services: RFC 2136 clients page"
+msgstr "WebCfg - Página Serviços: Clientes de RFC 2136"
+
+#: etc/inc/priv.defs.inc:791 etc/inc/priv.defs.inc:809
+#: etc/inc/priv.defs.inc:815 etc/inc/priv.defs.inc:823
+msgid "Allow access to the 'Services: RFC 2136 clients' page."
+msgstr "Permitir acesso à página 'Serviços: Clientes de RFC 2136'."
+
+#: etc/inc/priv.defs.inc:796 etc/inc/priv.defs.inc:814
+#: etc/inc/priv.defs.inc:820 etc/inc/priv.defs.inc:828
+msgid "WebCfg - Services: SNMP page"
+msgstr "WebCfg - Página Serviços: SNMP"
+
+#: etc/inc/priv.defs.inc:797 etc/inc/priv.defs.inc:815
+#: etc/inc/priv.defs.inc:821 etc/inc/priv.defs.inc:829
+msgid "Allow access to the 'Services: SNMP' page."
+msgstr "Permitir acesso à página 'Serviços: SNMP'."
+
+#: etc/inc/priv.defs.inc:802 etc/inc/priv.defs.inc:820
+#: etc/inc/priv.defs.inc:826 etc/inc/priv.defs.inc:834
+msgid "WebCfg - Services: Wake on LAN page"
+msgstr "WebCfg - Página Serviços: Wake on LAN"
+
+#: etc/inc/priv.defs.inc:803 etc/inc/priv.defs.inc:821
+#: etc/inc/priv.defs.inc:827 etc/inc/priv.defs.inc:835
+msgid "Allow access to the 'Services: Wake on LAN' page."
+msgstr "Permitir acesso à página 'Serviços: Wake on LAN'."
+
+#: etc/inc/priv.defs.inc:808 etc/inc/priv.defs.inc:826
+#: etc/inc/priv.defs.inc:832 etc/inc/priv.defs.inc:840
+msgid "WebCfg - Services: Wake on LAN: Edit page"
+msgstr "WebCfg - Página Serviços: Wake on LAN: Editar"
+
+#: etc/inc/priv.defs.inc:809 etc/inc/priv.defs.inc:827
+#: etc/inc/priv.defs.inc:833 etc/inc/priv.defs.inc:841
+msgid "Allow access to the 'Services: Wake on LAN: Edit' page."
+msgstr "Permitir acesso à página 'Serviços: Wake on LAN: Editar'."
+
+#: etc/inc/priv.defs.inc:820 etc/inc/priv.defs.inc:838
+#: etc/inc/priv.defs.inc:844 etc/inc/priv.defs.inc:852
+msgid "WebCfg - Hidden: Detailed Status page"
+msgstr "WebCfg - Página Omitida: Status Detalhado"
+
+#: etc/inc/priv.defs.inc:821 etc/inc/priv.defs.inc:839
+#: etc/inc/priv.defs.inc:845 etc/inc/priv.defs.inc:853
+msgid "Allow access to the 'Hidden: Detailed Status' page."
+msgstr "Permitir acesso à página 'Omitida: Status Detalhado'."
+
+#: etc/inc/priv.defs.inc:826 etc/inc/priv.defs.inc:844
+#: etc/inc/priv.defs.inc:850 etc/inc/priv.defs.inc:858
+msgid "WebCfg - Status: Captive portal page"
+msgstr "WebCfg - Página Status: Portal Captive"
+
+#: etc/inc/priv.defs.inc:827 etc/inc/priv.defs.inc:845
+#: etc/inc/priv.defs.inc:851 etc/inc/priv.defs.inc:859
+msgid "Allow access to the 'Status: Captive portal' page."
+msgstr "Permitir acesso à página 'Status: Portal Captive'."
+
+#: etc/inc/priv.defs.inc:832 etc/inc/priv.defs.inc:850
+#: etc/inc/priv.defs.inc:856 etc/inc/priv.defs.inc:864
+msgid "WebCfg - Status: Captive portal test Vouchers page"
+msgstr "WebCfg - Página Status: Vouchers de teste do portal Captive"
+
+#: etc/inc/priv.defs.inc:833 etc/inc/priv.defs.inc:851
+#: etc/inc/priv.defs.inc:857 etc/inc/priv.defs.inc:865
+msgid "Allow access to the 'Status: Captive portal Test Vouchers' page."
+msgstr "Permitir acesso à página 'Status: Vouchers de teste do portal Captive'."
+
+#: etc/inc/priv.defs.inc:838 etc/inc/priv.defs.inc:856
+#: etc/inc/priv.defs.inc:862 etc/inc/priv.defs.inc:870
+msgid "WebCfg - Status: Captive portal Voucher Rolls page"
+msgstr "WebCfg - Página Status: Listas de Vouchers do portal Captive"
+
+#: etc/inc/priv.defs.inc:839 etc/inc/priv.defs.inc:857
+#: etc/inc/priv.defs.inc:863 etc/inc/priv.defs.inc:871
+msgid "Allow access to the 'Status: Captive portal Voucher Rolls' page."
+msgstr "Permitir acesso à página 'Status: Listas de Vouchers do portal Captive'."
+
+#: etc/inc/priv.defs.inc:844 etc/inc/priv.defs.inc:862
+#: etc/inc/priv.defs.inc:868 etc/inc/priv.defs.inc:876
+msgid "WebCfg - Status: Captive portal Vouchers page"
+msgstr "WebCfg - Página Status: Vouchers do portal Captive"
+
+#: etc/inc/priv.defs.inc:845 etc/inc/priv.defs.inc:863
+#: etc/inc/priv.defs.inc:869 etc/inc/priv.defs.inc:877
+msgid "Allow access to the 'Status: Captive portal Vouchers' page."
+msgstr "Permitir acesso à página 'Status: Vouchers do portal Captive'."
+
+#: etc/inc/priv.defs.inc:850 etc/inc/priv.defs.inc:868
+#: etc/inc/priv.defs.inc:874 etc/inc/priv.defs.inc:882
+msgid "WebCfg - Status: DHCP leases page"
+msgstr "WebCfg - Página Status: Concessões DHCP"
+
+#: etc/inc/priv.defs.inc:851 etc/inc/priv.defs.inc:869
+#: etc/inc/priv.defs.inc:875 etc/inc/priv.defs.inc:883
+msgid "Allow access to the 'Status: DHCP leases' page."
+msgstr "Permitir acesso à  página 'Status: Concessões DHCP'."
+
+#: etc/inc/priv.defs.inc:856 etc/inc/priv.defs.inc:874
+#: etc/inc/priv.defs.inc:880 etc/inc/priv.defs.inc:888
+msgid "WebCfg - Status: Filter Reload Status page"
+msgstr "WebCfg - Página Status: Status do Filtro"
+
+#: etc/inc/priv.defs.inc:857 etc/inc/priv.defs.inc:875
+#: etc/inc/priv.defs.inc:881 etc/inc/priv.defs.inc:889
+msgid "Allow access to the 'Status: Filter Reload Status' page."
+msgstr "Permitir acesso à página 'Status: Status do Filtro'."
+
+#: etc/inc/priv.defs.inc:862 etc/inc/priv.defs.inc:880
+#: etc/inc/priv.defs.inc:886 etc/inc/priv.defs.inc:894
+msgid "WebCfg - Status: Gateway Groups page"
+msgstr "WebCfg - Página Status: Grupos de Gateway"
+
+#: etc/inc/priv.defs.inc:863 etc/inc/priv.defs.inc:881
+#: etc/inc/priv.defs.inc:887 etc/inc/priv.defs.inc:895
+msgid "Allow access to the 'Status: Gateway Groups' page."
+msgstr "Permitir acesso à página 'Status: Grupos de Gateway'."
+
+#: etc/inc/priv.defs.inc:868 etc/inc/priv.defs.inc:886
+#: etc/inc/priv.defs.inc:892 etc/inc/priv.defs.inc:900
+msgid "WebCfg - Status: Gateways page"
+msgstr "WebCfg - Página Status: Gateways"
+
+#: etc/inc/priv.defs.inc:869 etc/inc/priv.defs.inc:887
+#: etc/inc/priv.defs.inc:893 etc/inc/priv.defs.inc:901
+msgid "Allow access to the 'Status: Gateways' page."
+msgstr "Permitir acesso à página 'Status: Gateways'."
+
+#: etc/inc/priv.defs.inc:874 etc/inc/priv.defs.inc:892
+#: etc/inc/priv.defs.inc:898 etc/inc/priv.defs.inc:906
+msgid "WebCfg - Status: Traffic Graph page"
+msgstr "WebCfg - Página Status: Gráfico de Tráfego"
+
+#: etc/inc/priv.defs.inc:875 etc/inc/priv.defs.inc:893
+#: etc/inc/priv.defs.inc:899 etc/inc/priv.defs.inc:907
+msgid "Allow access to the 'Status: Traffic Graph' page."
+msgstr "Permitir acesso à página 'Status: Gráfico de Tráfego'."
+
+#: etc/inc/priv.defs.inc:881 etc/inc/priv.defs.inc:899
+#: etc/inc/priv.defs.inc:905 etc/inc/priv.defs.inc:913
+msgid "WebCfg - Status: CPU load page"
+msgstr "WebCfg - Página Status: Carregamento de CPU"
+
+#: etc/inc/priv.defs.inc:882 etc/inc/priv.defs.inc:900
+#: etc/inc/priv.defs.inc:906 etc/inc/priv.defs.inc:914
+msgid "Allow access to the 'Status: CPU load' page."
+msgstr "Permitir acesso à página 'Status: Carregamento de CPU'."
+
+#: etc/inc/priv.defs.inc:887 etc/inc/priv.defs.inc:905
+#: etc/inc/priv.defs.inc:911 etc/inc/priv.defs.inc:919
+msgid "WebCfg - Status: Interfaces page"
+msgstr "WebCfg - Página Status: Interfaces"
+
+#: etc/inc/priv.defs.inc:888 etc/inc/priv.defs.inc:906
+#: etc/inc/priv.defs.inc:912 etc/inc/priv.defs.inc:920
+msgid "Allow access to the 'Status: Interfaces' page."
+msgstr "Permitir acesso à página 'Status: Interfaces'."
+
+#: etc/inc/priv.defs.inc:893 etc/inc/priv.defs.inc:911
+#: etc/inc/priv.defs.inc:917 etc/inc/priv.defs.inc:925
+msgid "WebCfg - Status: Load Balancer: Pool page"
+msgstr "WebCfg - Página Status: Balanceador de Carga: Pool"
+
+#: etc/inc/priv.defs.inc:894 etc/inc/priv.defs.inc:912
+#: etc/inc/priv.defs.inc:918 etc/inc/priv.defs.inc:926
+msgid "Allow access to the 'Status: Load Balancer: Pool' page."
+msgstr "Permitir acesso à  página 'Status: Balanceador de Carga: Pool'."
+
+#: etc/inc/priv.defs.inc:899 etc/inc/priv.defs.inc:917
+#: etc/inc/priv.defs.inc:923 etc/inc/priv.defs.inc:931
+msgid "WebCfg - Status: Load Balancer: Virtual Server page"
+msgstr "WebCfg - Página Status: Balanceador de Carga: Servidor Virtual"
+
+#: etc/inc/priv.defs.inc:900 etc/inc/priv.defs.inc:918
+#: etc/inc/priv.defs.inc:924 etc/inc/priv.defs.inc:932
+msgid "Allow access to the 'Status: Load Balancer: Virtual Server' page."
+msgstr "Permitir acesso à página 'Status: Balanceador de Carga: Servidor Virtual'."
+
+#: etc/inc/priv.defs.inc:905 etc/inc/priv.defs.inc:923
+#: etc/inc/priv.defs.inc:929 etc/inc/priv.defs.inc:937
+msgid "WebCfg - Status: OpenVPN page"
+msgstr "WebCfg - Página Status: OpenVPN"
+
+#: etc/inc/priv.defs.inc:906 etc/inc/priv.defs.inc:924
+#: etc/inc/priv.defs.inc:930 etc/inc/priv.defs.inc:938
+msgid "Allow access to the 'Status: OpenVPN' page."
+msgstr "Permitir acesso à página 'Status: OpenVPN'."
+
+#: etc/inc/priv.defs.inc:911 etc/inc/priv.defs.inc:929
+#: etc/inc/priv.defs.inc:935 etc/inc/priv.defs.inc:943
+msgid "WebCfg - Status: Traffic shaper: Queues page"
+msgstr "WebCfg - Página Status: Traffic Shaper: Filas"
+
+#: etc/inc/priv.defs.inc:912 etc/inc/priv.defs.inc:930
+#: etc/inc/priv.defs.inc:936 etc/inc/priv.defs.inc:944
+msgid "Allow access to the 'Status: Traffic shaper: Queues' page."
+msgstr "Permitir acesso à página 'Status: Traffic Shaper: Filas'."
+
+#: etc/inc/priv.defs.inc:917 etc/inc/priv.defs.inc:935
+#: etc/inc/priv.defs.inc:941 etc/inc/priv.defs.inc:949
+msgid "WebCfg - Status: RRD Graphs page"
+msgstr "WebCfg - Página Status: Gráficos de RRD"
+
+#: etc/inc/priv.defs.inc:918 etc/inc/priv.defs.inc:936
+#: etc/inc/priv.defs.inc:942 etc/inc/priv.defs.inc:950
+msgid "Allow access to the 'Status: RRD Graphs' page."
+msgstr "Permitir acesso à página 'Status: Gráficos de RRD'."
+
+#: etc/inc/priv.defs.inc:924 etc/inc/priv.defs.inc:942
+#: etc/inc/priv.defs.inc:948 etc/inc/priv.defs.inc:956
+msgid "WebCfg - Status: RRD Graphs settings page"
+msgstr "WebCfg - Página Status: Configurações de Gráficos de RRD"
+
+#: etc/inc/priv.defs.inc:925 etc/inc/priv.defs.inc:943
+#: etc/inc/priv.defs.inc:949 etc/inc/priv.defs.inc:957
+msgid "Allow access to the 'Status: RRD Graphs: settings' page."
+msgstr "Permitir acesso à página 'Status: Configurações de Gráficos de RRD'."
+
+#: etc/inc/priv.defs.inc:930 etc/inc/priv.defs.inc:948
+#: etc/inc/priv.defs.inc:954 etc/inc/priv.defs.inc:962
+msgid "WebCfg - Status: Services page"
+msgstr "WebCfg - Página Status: Serviços"
+
+#: etc/inc/priv.defs.inc:931 etc/inc/priv.defs.inc:949
+#: etc/inc/priv.defs.inc:955 etc/inc/priv.defs.inc:963
+msgid "Allow access to the 'Status: Services' page."
+msgstr "Permitir acesso à página 'Status: Serviços'."
+
+#: etc/inc/priv.defs.inc:936 etc/inc/priv.defs.inc:954
+#: etc/inc/priv.defs.inc:960 etc/inc/priv.defs.inc:968
+msgid "WebCfg - Status: UPnP Status page"
+msgstr "WebCfg - Página Status: Status UPnP"
+
+#: etc/inc/priv.defs.inc:937 etc/inc/priv.defs.inc:955
+#: etc/inc/priv.defs.inc:961 etc/inc/priv.defs.inc:969
+msgid "Allow access to the 'Status: UPnP Status' page."
+msgstr "Permitir acesso à página 'Status: Status UPnP'."
+
+#: etc/inc/priv.defs.inc:942 etc/inc/priv.defs.inc:960
+#: etc/inc/priv.defs.inc:966 etc/inc/priv.defs.inc:974
+msgid "WebCfg - Status: Wireless page"
+msgstr "WebCfg - Página Status: Conexão sem fio"
+
+#: etc/inc/priv.defs.inc:943 etc/inc/priv.defs.inc:961
+#: etc/inc/priv.defs.inc:967 etc/inc/priv.defs.inc:975
+msgid "Allow access to the 'Status: Wireless' page."
+msgstr "Permitir acesso à página 'Status: Conexão sem fio'."
+
+#: etc/inc/priv.defs.inc:948 etc/inc/priv.defs.inc:966
+#: etc/inc/priv.defs.inc:972 etc/inc/priv.defs.inc:980
+msgid "WebCfg - System: General Setup page"
+msgstr "WebCfg - Sistema: Configuração Geral"
+
+#: etc/inc/priv.defs.inc:949 etc/inc/priv.defs.inc:967
+#: etc/inc/priv.defs.inc:973 etc/inc/priv.defs.inc:981
+msgid "Allow access to the 'System: General Setup' page."
+msgstr "Permitir acesso à página 'Sistema: Configurações Gerais'."
+
+#: etc/inc/priv.defs.inc:954 etc/inc/priv.defs.inc:972
+#: etc/inc/priv.defs.inc:978 etc/inc/priv.defs.inc:986
+msgid "WebCfg - System: Advanced: Admin Access Page"
+msgstr "WebCfg - Página Sistema: Avançado: Acesso de Administrador"
+
+#: etc/inc/priv.defs.inc:955 etc/inc/priv.defs.inc:973
+#: etc/inc/priv.defs.inc:979 etc/inc/priv.defs.inc:987
+msgid "Allow access to the 'System: Advanced: Admin Access' page."
+msgstr "Permitir acesso à página 'Sistema: Avançado: Acesso de Administrador'."
+
+#: etc/inc/priv.defs.inc:960 etc/inc/priv.defs.inc:978
+#: etc/inc/priv.defs.inc:984 etc/inc/priv.defs.inc:992
+msgid "WebCfg - System: Advanced: Firewall and NAT page"
+msgstr "WebCfg - Página Sistema: Avançado: Firewall e NAT"
+
+#: etc/inc/priv.defs.inc:961 etc/inc/priv.defs.inc:979
+#: etc/inc/priv.defs.inc:985 etc/inc/priv.defs.inc:993
+msgid "Allow access to the 'System: Advanced: Firewall and NAT' page."
+msgstr "Permitir acesso à página 'Sistema: Avançado: Firewall e NAT'."
+
+#: etc/inc/priv.defs.inc:966 etc/inc/priv.defs.inc:984
+#: etc/inc/priv.defs.inc:990 etc/inc/priv.defs.inc:998
+msgid "WebCfg - System: Advanced: Miscellaneous page"
+msgstr "WebCfg - Página Sistema: Avançado: Variados"
+
+#: etc/inc/priv.defs.inc:967 etc/inc/priv.defs.inc:985
+#: etc/inc/priv.defs.inc:991 etc/inc/priv.defs.inc:999
+msgid "Allow access to the 'System: Advanced: Miscellaneous' page."
+msgstr "Permitir acesso à página 'Sistema: Avançado: Variados'."
+
+#: etc/inc/priv.defs.inc:972 etc/inc/priv.defs.inc:990
+#: etc/inc/priv.defs.inc:996 etc/inc/priv.defs.inc:1004
+msgid "WebCfg - System: Advanced: Network page"
+msgstr "WebCfg - Página Sistema: Avançado: Rede"
+
+#: etc/inc/priv.defs.inc:973 etc/inc/priv.defs.inc:991
+#: etc/inc/priv.defs.inc:997 etc/inc/priv.defs.inc:1005
+msgid "Allow access to the 'System: Advanced: Networking' page."
+msgstr "Permitir acesso à página 'Sistema: Avançado: Rede'."
+
+#: etc/inc/priv.defs.inc:978 etc/inc/priv.defs.inc:984
+#: etc/inc/priv.defs.inc:996 etc/inc/priv.defs.inc:1002
+#: etc/inc/priv.defs.inc:1008 etc/inc/priv.defs.inc:1010
+#: etc/inc/priv.defs.inc:1016
+msgid "WebCfg - System: Advanced: Tunables page"
+msgstr "WebCfg - Página Sistema: Avançado: Ajustes"
+
+#: etc/inc/priv.defs.inc:979 etc/inc/priv.defs.inc:985
+#: etc/inc/priv.defs.inc:997 etc/inc/priv.defs.inc:1003
+#: etc/inc/priv.defs.inc:1009 etc/inc/priv.defs.inc:1011
+#: etc/inc/priv.defs.inc:1017
+msgid "Allow access to the 'System: Advanced: Tunables' page."
+msgstr "Permitir acesso à página 'Sistema: Avançado: Ajustes'."
+
+#: etc/inc/priv.defs.inc:990 etc/inc/priv.defs.inc:1008
+#: etc/inc/priv.defs.inc:1014 etc/inc/priv.defs.inc:1022
+msgid "WebCfg - System: Authentication Servers"
+msgstr "WebCfg - Página Sistema: Servidores de Autenticação"
+
+#: etc/inc/priv.defs.inc:991 etc/inc/priv.defs.inc:1009
+#: etc/inc/priv.defs.inc:1015 etc/inc/priv.defs.inc:1023
+msgid "Allow access to the 'System: Authentication Servers' page."
+msgstr "Permitir acesso à página 'Sistema: Servidores de Autenticação'."
+
+#: etc/inc/priv.defs.inc:996 etc/inc/priv.defs.inc:1014
+#: etc/inc/priv.defs.inc:1020 etc/inc/priv.defs.inc:1028
+msgid "WebCfg - System: CA Manager"
+msgstr "WebCfg - Sistema: Gerenciador CA"
+
+#: etc/inc/priv.defs.inc:997 etc/inc/priv.defs.inc:1015
+#: etc/inc/priv.defs.inc:1021 etc/inc/priv.defs.inc:1029
+msgid "Allow access to the 'System: CA Manager' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador CA'."
+
+#: etc/inc/priv.defs.inc:1002 etc/inc/priv.defs.inc:1020
+#: etc/inc/priv.defs.inc:1026 etc/inc/priv.defs.inc:1034
+msgid "WebCfg - System: Certificate Manager"
+msgstr "WebCfg - Sistema: Gerenciador de Certificado"
+
+#: etc/inc/priv.defs.inc:1003 etc/inc/priv.defs.inc:1021
+#: etc/inc/priv.defs.inc:1027 etc/inc/priv.defs.inc:1035
+msgid "Allow access to the 'System: Certificate Manager' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciados de Certificado'."
+
+#: etc/inc/priv.defs.inc:1008 etc/inc/priv.defs.inc:1026
+#: etc/inc/priv.defs.inc:1032 etc/inc/priv.defs.inc:1040
+msgid "WebCfg - System: CRL Manager"
+msgstr "WebCfg - Sistema: Gerenciador CRL"
+
+#: etc/inc/priv.defs.inc:1009 etc/inc/priv.defs.inc:1027
+#: etc/inc/priv.defs.inc:1033 etc/inc/priv.defs.inc:1041
+msgid "Allow access to the 'System: CRL Manager' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador CRL'."
+
+#: etc/inc/priv.defs.inc:1014 etc/inc/priv.defs.inc:1032
+#: etc/inc/priv.defs.inc:1038 etc/inc/priv.defs.inc:1046
+msgid "WebCfg - System: Firmware: Manual Update page"
+msgstr "WebCfg - Página Sistema: Firmware: Atualização Manual"
+
+#: etc/inc/priv.defs.inc:1015 etc/inc/priv.defs.inc:1033
+#: etc/inc/priv.defs.inc:1039 etc/inc/priv.defs.inc:1047
+msgid "Allow access to the 'System: Firmware: Manual Update' page."
+msgstr "Permitir acesso à  página 'Sistema: Firmware: Atualização Manual'."
+
+#: etc/inc/priv.defs.inc:1020 etc/inc/priv.defs.inc:1038
+#: etc/inc/priv.defs.inc:1044 etc/inc/priv.defs.inc:1052
+msgid "WebCfg - System: Firmware: Check For Update page"
+msgstr "WebCfg - Página Sistema: Firmware: Verificar por Atualização"
+
+#: etc/inc/priv.defs.inc:1021 etc/inc/priv.defs.inc:1039
+#: etc/inc/priv.defs.inc:1045 etc/inc/priv.defs.inc:1053
+msgid "Allow access to the 'System: Firmware: Check For Update' page."
+msgstr "Permitir acesso à página 'Sistema: Firmware: Verificar por Atualização'."
+
+#: etc/inc/priv.defs.inc:1026 etc/inc/priv.defs.inc:1044
+#: etc/inc/priv.defs.inc:1050 etc/inc/priv.defs.inc:1058
+msgid "WebCfg - System: Firmware: Auto Update page"
+msgstr "WebCfg - Página Sistema: Firmware: Auto Atualização"
+
+#: etc/inc/priv.defs.inc:1027 etc/inc/priv.defs.inc:1045
+#: etc/inc/priv.defs.inc:1051 etc/inc/priv.defs.inc:1059
+msgid "Allow access to the 'System: Firmware: Auto Update' page."
+msgstr "Permitir acesso à página 'Sistema: Firmware: Página de Auto Atualização'."
+
+#: etc/inc/priv.defs.inc:1032 etc/inc/priv.defs.inc:1050
+#: etc/inc/priv.defs.inc:1056 etc/inc/priv.defs.inc:1064
+msgid "WebCfg - System: Firmware: Settings page"
+msgstr "WebCfg - Página Sistema: Firmware: Configurações"
+
+#: etc/inc/priv.defs.inc:1033 etc/inc/priv.defs.inc:1051
+#: etc/inc/priv.defs.inc:1057 etc/inc/priv.defs.inc:1065
+msgid "Allow access to the 'System: Firmware: Settings' page."
+msgstr "Permitir acesso à página 'Sistema: Firmware: Configurações'."
+
+#: etc/inc/priv.defs.inc:1038 etc/inc/priv.defs.inc:1056
+#: etc/inc/priv.defs.inc:1062 etc/inc/priv.defs.inc:1070
+msgid "WebCfg - System: Gateway Groups page"
+msgstr "WebCfg - Página Sistema: Grupos de Gateway"
+
+#: etc/inc/priv.defs.inc:1039 etc/inc/priv.defs.inc:1057
+#: etc/inc/priv.defs.inc:1063 etc/inc/priv.defs.inc:1071
+msgid "Allow access to the 'System: Gateway Groups' page."
+msgstr "Permitir acesso à página 'Sistema: Grupos de Gateway'."
+
+#: etc/inc/priv.defs.inc:1044 etc/inc/priv.defs.inc:1062
+#: etc/inc/priv.defs.inc:1068 etc/inc/priv.defs.inc:1076
+msgid "WebCfg - System: Gateways: Edit Gateway Groups page"
+msgstr "WebCfg - Página Sistema: Gateways: Editar Grupos de Gateways"
+
+#: etc/inc/priv.defs.inc:1045 etc/inc/priv.defs.inc:1063
+#: etc/inc/priv.defs.inc:1069 etc/inc/priv.defs.inc:1077
+msgid "Allow access to the 'System: Gateways: Edit Gateway Groups' page."
+msgstr "Permitir acesso à página 'Sistema: Gateways: Editar Grupos de Gateways'."
+
+#: etc/inc/priv.defs.inc:1050 etc/inc/priv.defs.inc:1068
+#: etc/inc/priv.defs.inc:1074 etc/inc/priv.defs.inc:1082
+msgid "WebCfg - System: Gateways page"
+msgstr "WebCfg - Página Sistema: Gateways"
+
+#: etc/inc/priv.defs.inc:1051 etc/inc/priv.defs.inc:1069
+#: etc/inc/priv.defs.inc:1075 etc/inc/priv.defs.inc:1083
+msgid "Allow access to the 'System: Gateways' page."
+msgstr "Permitir acesso à página 'Sistema: Gateways'."
+
+#: etc/inc/priv.defs.inc:1056 etc/inc/priv.defs.inc:1074
+#: etc/inc/priv.defs.inc:1080 etc/inc/priv.defs.inc:1088
+msgid "WebCfg - System: Gateways: Edit Gateway page"
+msgstr "WebCfg - Página Sistema: Gateway: Editar Gateway"
+
+#: etc/inc/priv.defs.inc:1057 etc/inc/priv.defs.inc:1075
+#: etc/inc/priv.defs.inc:1081 etc/inc/priv.defs.inc:1089
+msgid "Allow access to the 'System: Gateways: Edit Gateway' page."
+msgstr "Permitir acesso à página 'Sistema: Gateway: Editar Gateway'."
+
+#: etc/inc/priv.defs.inc:1062 etc/inc/priv.defs.inc:1080
+#: etc/inc/priv.defs.inc:1086 etc/inc/priv.defs.inc:1094
+msgid "WebCfg - System: Group manager page"
+msgstr "WebCfg - Página Sistema: Gerenciador de Grupo"
+
+#: etc/inc/priv.defs.inc:1063 etc/inc/priv.defs.inc:1081
+#: etc/inc/priv.defs.inc:1087 etc/inc/priv.defs.inc:1095
+msgid "Allow access to the 'System: Group manager' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de Grupo'."
+
+#: etc/inc/priv.defs.inc:1068 etc/inc/priv.defs.inc:1086
+#: etc/inc/priv.defs.inc:1092 etc/inc/priv.defs.inc:1100
+msgid "WebCfg - System: Group Manager: Add Privileges page"
+msgstr "WebCfg - Página Sistema: Gerenciador de Grupo: Adicionar Priviégios"
+
+#: etc/inc/priv.defs.inc:1069 etc/inc/priv.defs.inc:1087
+#: etc/inc/priv.defs.inc:1093 etc/inc/priv.defs.inc:1101
+msgid "Allow access to the 'System: Group Manager: Add Privileges' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de Grupo: Adicionar Privilégios'."
+
+#: etc/inc/priv.defs.inc:1074 etc/inc/priv.defs.inc:1092
+#: etc/inc/priv.defs.inc:1098 etc/inc/priv.defs.inc:1106
+msgid "WebCfg - System: Static Routes page"
+msgstr "WebCfg - Página Sistema: Rotas Estáticas"
+
+#: etc/inc/priv.defs.inc:1075 etc/inc/priv.defs.inc:1093
+#: etc/inc/priv.defs.inc:1099 etc/inc/priv.defs.inc:1107
+msgid "Allow access to the 'System: Static Routes' page."
+msgstr "Permitir acesso à página 'Sistema: Rotas Estáticas'."
+
+#: etc/inc/priv.defs.inc:1080 etc/inc/priv.defs.inc:1098
+#: etc/inc/priv.defs.inc:1104 etc/inc/priv.defs.inc:1112
+msgid "WebCfg - System: Static Routes: Edit route page"
+msgstr "WebCfg - Página Sistema: Rotas Estáticas: Editar rota"
+
+#: etc/inc/priv.defs.inc:1081 etc/inc/priv.defs.inc:1099
+#: etc/inc/priv.defs.inc:1105 etc/inc/priv.defs.inc:1113
+msgid "Allow access to the 'System: Static Routes: Edit route' page."
+msgstr "Permitir acesso à página 'Sistema: Rotas Estáticas: Editar rota'."
+
+#: etc/inc/priv.defs.inc:1086 etc/inc/priv.defs.inc:1104
+#: etc/inc/priv.defs.inc:1110 etc/inc/priv.defs.inc:1118
+msgid "WebCfg - System: User Manager page"
+msgstr "WebCfg - Página Sistema: Gerenciador de Usuários"
+
+#: etc/inc/priv.defs.inc:1087 etc/inc/priv.defs.inc:1105
+#: etc/inc/priv.defs.inc:1111 etc/inc/priv.defs.inc:1119
+msgid "Allow access to the 'System: User Manager' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de Usuários'."
+
+#: etc/inc/priv.defs.inc:1092 etc/inc/priv.defs.inc:1110
+#: etc/inc/priv.defs.inc:1116 etc/inc/priv.defs.inc:1124
+msgid "WebCfg - System: User Manager: Add Privileges page"
+msgstr "WebCfg - Página Sistema: Gerenciador de Usuários: Adicionar Privilégios"
+
+#: etc/inc/priv.defs.inc:1093 etc/inc/priv.defs.inc:1111
+#: etc/inc/priv.defs.inc:1117 etc/inc/priv.defs.inc:1125
+msgid "Allow access to the 'System: User Manager: Add Privileges' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de Usuários: Adicionar Privilégios'."
+
+#: etc/inc/priv.defs.inc:1098 etc/inc/priv.defs.inc:1116
+#: etc/inc/priv.defs.inc:1122 etc/inc/priv.defs.inc:1130
+msgid "WebCfg - System: User Password Manager page"
+msgstr "WebCfg - Sistema: Página Gerenciador de Senha de Usuários"
+
+#: etc/inc/priv.defs.inc:1099 etc/inc/priv.defs.inc:1117
+#: etc/inc/priv.defs.inc:1123 etc/inc/priv.defs.inc:1131
+msgid "Allow access to the 'System: User Password Manager' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de Senha de Usuários'."
+
+#: etc/inc/priv.defs.inc:1104 etc/inc/priv.defs.inc:1122
+#: etc/inc/priv.defs.inc:1128
+msgid "WebCfg - System: User manager: settings page"
+msgstr "WebCfg - Sistema: Gerenciador de Usuários: Página de Configurações"
+
+#: etc/inc/priv.defs.inc:1105 etc/inc/priv.defs.inc:1123
+#: etc/inc/priv.defs.inc:1129
+msgid "Allow access to the 'System: User manager: settings' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de usuários: Página deConfigurações'."
+
+#: etc/inc/priv.defs.inc:1110 etc/inc/priv.defs.inc:1128
+#: etc/inc/priv.defs.inc:1134 etc/inc/priv.defs.inc:1142
+msgid "WebCfg - System: User Manager: Settings: Test LDAP page"
+msgstr "WebCfg - Página Sistema: Gerenciador de Usuários: Configurações: Testar LDAP"
+
+#: etc/inc/priv.defs.inc:1111 etc/inc/priv.defs.inc:1129
+#: etc/inc/priv.defs.inc:1135 etc/inc/priv.defs.inc:1143
+msgid "Allow access to the 'System: User Manager: Settings: Test LDAP' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de Usuário: Configurações: Testar LDAP'."
+
+#: etc/inc/priv.defs.inc:1116 etc/inc/priv.defs.inc:1134
+#: etc/inc/priv.defs.inc:1140 etc/inc/priv.defs.inc:1148
+msgid "WebCfg - System: Firmware: Manual Update page (progress bar)"
+msgstr "WebCfg - Página Sistema: Firmware: Atualização Manual (barra de progresso)"
+
+#: etc/inc/priv.defs.inc:1117 etc/inc/priv.defs.inc:1135
+#: etc/inc/priv.defs.inc:1141 etc/inc/priv.defs.inc:1149
+msgid "Allow access to the 'System: Firmware: Manual Update: Progress bar' page."
+msgstr "Permitir acesso à página 'Sistema: Firmware: Atualização Manual: Barra de progresso'."
+
+#: etc/inc/priv.defs.inc:1122 etc/inc/priv.defs.inc:1140
+#: etc/inc/priv.defs.inc:1146 etc/inc/priv.defs.inc:1154
+msgid "WebCfg - Hidden: Upload Configuration page"
+msgstr "WebCfg - Página Omitidos: Configuração de Carregamento"
+
+#: etc/inc/priv.defs.inc:1123 etc/inc/priv.defs.inc:1141
+#: etc/inc/priv.defs.inc:1147 etc/inc/priv.defs.inc:1155
+msgid "Allow access to the 'Hidden: Upload Configuration' page."
+msgstr "Permitir acesso à página 'Omitidos: Configuração de Carregamento'."
+
+#: etc/inc/priv.defs.inc:1128 etc/inc/priv.defs.inc:1146
+#: etc/inc/priv.defs.inc:1152 etc/inc/priv.defs.inc:1160
+msgid "WebCfg - VPN: IPsec page"
+msgstr "WebCfg - Página VPN: IPsec"
+
+#: etc/inc/priv.defs.inc:1129 etc/inc/priv.defs.inc:1147
+#: etc/inc/priv.defs.inc:1153 etc/inc/priv.defs.inc:1161
+msgid "Allow access to the 'VPN: IPsec' page."
+msgstr "Permitir acesso à página 'VPN: IPsec'."
+
+#: etc/inc/priv.defs.inc:1134 etc/inc/priv.defs.inc:1152
+#: etc/inc/priv.defs.inc:1158 etc/inc/priv.defs.inc:1166
+msgid "WebCfg - VPN: IPsec: Pre-Shared Keys List"
+msgstr "WebCfg - VPN: IPsec: Lista de chaves pré-compartilhadas"
+
+#: etc/inc/priv.defs.inc:1135 etc/inc/priv.defs.inc:1153
+#: etc/inc/priv.defs.inc:1159 etc/inc/priv.defs.inc:1167
+msgid "Allow access to the 'VPN: IPsec: Pre-Shared Keys List' page."
+msgstr "Permitir acesso à página 'VPN: IPsec: Lista de chaves pré-compartilhadas'."
+
+#: etc/inc/priv.defs.inc:1140 etc/inc/priv.defs.inc:1158
+#: etc/inc/priv.defs.inc:1164 etc/inc/priv.defs.inc:1172
+msgid "WebCfg - VPN: IPsec: Edit Pre-Shared Keys"
+msgstr "WebCfg - VPN: IPsec: Editar chaves pré-compartilhadas"
+
+#: etc/inc/priv.defs.inc:1141 etc/inc/priv.defs.inc:1159
+#: etc/inc/priv.defs.inc:1165 etc/inc/priv.defs.inc:1173
+msgid "Allow access to the 'VPN: IPsec: Edit Pre-Shared Keys' page."
+msgstr "Permitir acesso à página 'VPN: IPsec: Editar chaves pré-compartilhadas'."
+
+#: etc/inc/priv.defs.inc:1146 etc/inc/priv.defs.inc:1164
+#: etc/inc/priv.defs.inc:1170 etc/inc/priv.defs.inc:1178
+msgid "WebCfg - VPN: IPsec: Mobile page"
+msgstr "WebCfg - Página VPN: IPsec: Móvel"
+
+#: etc/inc/priv.defs.inc:1147 etc/inc/priv.defs.inc:1165
+#: etc/inc/priv.defs.inc:1171 etc/inc/priv.defs.inc:1179
+msgid "Allow access to the 'VPN: IPsec: Mobile' page."
+msgstr "Permitir acesso à página 'VPN: IPsec: Móvel'."
+
+#: etc/inc/priv.defs.inc:1152 etc/inc/priv.defs.inc:1170
+#: etc/inc/priv.defs.inc:1176 etc/inc/priv.defs.inc:1184
+msgid "WebCfg - VPN: IPsec: Edit Phase 1 page"
+msgstr "WebCfg - Página VPN: IPsec: Editar Fase 1"
+
+#: etc/inc/priv.defs.inc:1153 etc/inc/priv.defs.inc:1171
+#: etc/inc/priv.defs.inc:1177 etc/inc/priv.defs.inc:1185
+msgid "Allow access to the 'VPN: IPsec: Edit Phase 1' page."
+msgstr "Permitir acesso à página 'VPN: IPsec: Editar Fase 1'."
+
+#: etc/inc/priv.defs.inc:1158 etc/inc/priv.defs.inc:1176
+#: etc/inc/priv.defs.inc:1182 etc/inc/priv.defs.inc:1190
+msgid "WebCfg - VPN: IPsec: Edit Phase 2 page"
+msgstr "WebCfg - Página VPN: IPsec: Editar Fase 2"
+
+#: etc/inc/priv.defs.inc:1159 etc/inc/priv.defs.inc:1177
+#: etc/inc/priv.defs.inc:1183 etc/inc/priv.defs.inc:1191
+msgid "Allow access to the 'VPN: IPsec: Edit Phase 2' page."
+msgstr "Permitir acesso à página 'VPN: IPsec: Editar Fase 2'."
+
+#: etc/inc/priv.defs.inc:1164 etc/inc/priv.defs.inc:1182
+#: etc/inc/priv.defs.inc:1188 etc/inc/priv.defs.inc:1196
+msgid "WebCfg - VPN: VPN L2TP page"
+msgstr "WebCfg - Página VPN: L2TP da VPN"
+
+#: etc/inc/priv.defs.inc:1165 etc/inc/priv.defs.inc:1183
+#: etc/inc/priv.defs.inc:1189 etc/inc/priv.defs.inc:1197
+msgid "Allow access to the 'VPN: VPN L2TP' page."
+msgstr "Permitir acesso à página 'VPN: L2TP da VPN'."
+
+#: etc/inc/priv.defs.inc:1170 etc/inc/priv.defs.inc:1188
+#: etc/inc/priv.defs.inc:1194 etc/inc/priv.defs.inc:1202
+msgid "WebCfg - VPN: VPN L2TP : Users page"
+msgstr "WebCfg - Página VPN: L2TP da VPN: Usuários"
+
+#: etc/inc/priv.defs.inc:1171 etc/inc/priv.defs.inc:1189
+#: etc/inc/priv.defs.inc:1195 etc/inc/priv.defs.inc:1203
+msgid "Allow access to the 'VPN: VPN L2TP : Users' page."
+msgstr "Permitir acesso à página 'VPN: L2TP da VPN: Usuários'."
+
+#: etc/inc/priv.defs.inc:1176 etc/inc/priv.defs.inc:1194
+#: etc/inc/priv.defs.inc:1200 etc/inc/priv.defs.inc:1208
+msgid "WebCfg - VPN: VPN L2TP : Users : Edit page"
+msgstr "WebCfg - Página VPN: L2TP da VPN: Usuários: Editar"
+
+#: etc/inc/priv.defs.inc:1177 etc/inc/priv.defs.inc:1195
+#: etc/inc/priv.defs.inc:1201 etc/inc/priv.defs.inc:1209
+msgid "Allow access to the 'VPN: VPN L2TP : Users : Edit' page."
+msgstr "Permitir acesso à página 'VPN: L2TP da VPN: Usuários: Editar'."
+
+#: etc/inc/priv.defs.inc:1182 etc/inc/priv.defs.inc:1200
+#: etc/inc/priv.defs.inc:1206 etc/inc/priv.defs.inc:1214
+msgid "WebCfg - OpenVPN: Client page"
+msgstr "WebCfg - Página OpenVPN: Cliente"
+
+#: etc/inc/priv.defs.inc:1183 etc/inc/priv.defs.inc:1201
+#: etc/inc/priv.defs.inc:1207 etc/inc/priv.defs.inc:1215
+msgid "Allow access to the 'OpenVPN: Client' page."
+msgstr "Permitir acesso à página 'OpenVPN: Cliente'."
+
+#: etc/inc/priv.defs.inc:1188 etc/inc/priv.defs.inc:1206
+#: etc/inc/priv.defs.inc:1212 etc/inc/priv.defs.inc:1220
+msgid "WebCfg - OpenVPN: Client Specific Override page"
+msgstr "WebCfg - Página OpenVPN: Substituição Específica de Cliente"
+
+#: etc/inc/priv.defs.inc:1189 etc/inc/priv.defs.inc:1207
+#: etc/inc/priv.defs.inc:1213 etc/inc/priv.defs.inc:1221
+msgid "Allow access to the 'OpenVPN: Client Specific Override' page."
+msgstr "Permitir acesso à página 'OpenVPN: Substituição Específica de Cliente'."
+
+#: etc/inc/priv.defs.inc:1194 etc/inc/priv.defs.inc:1212
+#: etc/inc/priv.defs.inc:1218 etc/inc/priv.defs.inc:1226
+msgid "WebCfg - OpenVPN: Server page"
+msgstr "WebCfg - Página OpenVPN: Servidor"
+
+#: etc/inc/priv.defs.inc:1195 etc/inc/priv.defs.inc:1213
+#: etc/inc/priv.defs.inc:1219 etc/inc/priv.defs.inc:1227
+msgid "Allow access to the 'OpenVPN: Server' page."
+msgstr "Permitir acesso à página 'OpenVPN: Servidor'."
+
+#: etc/inc/priv.defs.inc:1200 etc/inc/priv.defs.inc:1218
+#: etc/inc/priv.defs.inc:1224 etc/inc/priv.defs.inc:1232
+msgid "WebCfg - Services: PPPoE Server page"
+msgstr "WebCfg - Página Serviços: Servidor PPPoE"
+
+#: etc/inc/priv.defs.inc:1201 etc/inc/priv.defs.inc:1219
+#: etc/inc/priv.defs.inc:1225 etc/inc/priv.defs.inc:1233
+msgid "Allow access to the 'Services: PPPoE Server' page."
+msgstr "Permitir acesso à página 'Serviços: Servidor PPPoE'."
+
+#: etc/inc/priv.defs.inc:1206 etc/inc/priv.defs.inc:1224
+#: etc/inc/priv.defs.inc:1230 etc/inc/priv.defs.inc:1238
+msgid "WebCfg - Services: PPPoE Server: Edit page"
+msgstr "WebCfg - Serviços: Servidor PPPoE: Página Editar"
+
+#: etc/inc/priv.defs.inc:1207 etc/inc/priv.defs.inc:1225
+#: etc/inc/priv.defs.inc:1231 etc/inc/priv.defs.inc:1239
+msgid "Allow access to the 'Services: PPPoE Server: Edit' page."
+msgstr "Permitir acesso à página 'Serviços: Servidor PPPoE: Editar'."
+
+#: etc/inc/priv.defs.inc:1212 etc/inc/priv.defs.inc:1230
+#: etc/inc/priv.defs.inc:1236 etc/inc/priv.defs.inc:1244
+msgid "WebCfg - VPN: VPN PPTP page"
+msgstr "WebCfg - Página VPN: PPTP da VPN"
+
+#: etc/inc/priv.defs.inc:1213 etc/inc/priv.defs.inc:1231
+#: etc/inc/priv.defs.inc:1237 etc/inc/priv.defs.inc:1245
+msgid "Allow access to the 'VPN: VPN PPTP' page."
+msgstr "Permitir acesso à página 'VPN: PPTP da VPN'."
+
+#: etc/inc/priv.defs.inc:1218 etc/inc/priv.defs.inc:1236
+#: etc/inc/priv.defs.inc:1242 etc/inc/priv.defs.inc:1250
+msgid "WebCfg - VPN: VPN PPTP: Users page"
+msgstr "WebCfg - Página VPN: PPTP da VPN: Usuários"
+
+#: etc/inc/priv.defs.inc:1219 etc/inc/priv.defs.inc:1237
+#: etc/inc/priv.defs.inc:1243 etc/inc/priv.defs.inc:1251
+msgid "Allow access to the 'VPN: VPN PPTP: Users' page."
+msgstr "Permitir acesso à página 'VPN: PPTP da VPN: Usuários'."
+
+#: etc/inc/priv.defs.inc:1224 etc/inc/priv.defs.inc:1242
+#: etc/inc/priv.defs.inc:1248 etc/inc/priv.defs.inc:1256
+msgid "WebCfg - VPN: VPN PPTP: User: Edit page"
+msgstr "WebCfg - Página VPN: PPTP da VPN: Usuários: Editar"
+
+#: etc/inc/priv.defs.inc:1225 etc/inc/priv.defs.inc:1243
+#: etc/inc/priv.defs.inc:1249 etc/inc/priv.defs.inc:1257
+msgid "Allow access to the 'VPN: VPN PPTP: User: Edit' page."
+msgstr "Permitir acesso à página 'VPN: PPTP da VPN: Usuários: Editar'."
+
+#: etc/inc/priv.defs.inc:1230 etc/inc/priv.defs.inc:1248
+#: etc/inc/priv.defs.inc:1254 etc/inc/priv.defs.inc:1262
+msgid "WebCfg - pfSense wizard subsystem page"
+msgstr "WebCfg - Página Subsistema de wizard do pfSense"
+
+#: etc/inc/priv.defs.inc:1231 etc/inc/priv.defs.inc:1249
+#: etc/inc/priv.defs.inc:1255 etc/inc/priv.defs.inc:1263
+msgid "Allow access to the 'pfSense wizard subsystem' page."
+msgstr "Permitir acesso à página 'Subsistema de wizard do pfSense'."
+
+#: etc/inc/priv.defs.inc:1236 etc/inc/priv.defs.inc:1254
+#: etc/inc/priv.defs.inc:1260 etc/inc/priv.defs.inc:1268
+msgid "WebCfg - XMLRPC Library page"
+msgstr "WebCfg - Página Biblioteca XMLRPC"
+
+#: etc/inc/priv.defs.inc:1237 etc/inc/priv.defs.inc:1255
+#: etc/inc/priv.defs.inc:1261 etc/inc/priv.defs.inc:1269
+msgid "Allow access to the 'XMLRPC Library' page."
+msgstr "Permitir acesso à página 'Biblioteca XMLRPC'."
+
+#: etc/inc/rrd.inc:45
+#, php-format
+msgid "RRD dump failed exited with %1$s, the error is: %2$s"
+msgstr "RRD dump falhou ao sair com %1$s, o erro é: %2$s"
+
+#: etc/inc/rrd.inc:56 etc/inc/rrd.inc:92 etc/inc/rrd.inc:96 etc/inc/rrd.inc:98
+#, php-format
+msgid "RRD create failed exited with %1$s, the error is: %2$s"
+msgstr "RRD create falhou ao sair com %1$s, o erro é: %2$s"
+
+#: etc/inc/rrd.inc:70 etc/inc/rrd.inc:106 etc/inc/rrd.inc:110
+#: etc/inc/rrd.inc:113
+#, php-format
+msgid "Import RRD has %1$s DS values and %2$s RRA databases, new format RRD has %3$s DS values and %4$s RRA databases"
+msgstr "Import RRD tem %1$s valores DS e %2$s base de dados RRA, novo formato RRD tem %3$s valores DS e %4$s base de dados RRA"
+
+#: etc/inc/rrd.inc:154 etc/inc/rrd.inc:190 etc/inc/rrd.inc:194
+#: etc/inc/rrd.inc:197
+#, php-format
+msgid "The new RRD now has %1$s DS values and %2$s RRA databases"
+msgstr "O novo RRD agora tem %1$s valores DS e %2$s databases RRA"
+
+#: etc/inc/rrd.inc:162 etc/inc/rrd.inc:198 etc/inc/rrd.inc:202
+#: etc/inc/rrd.inc:205
+msgid "Generating RRD graphs..."
+msgstr "Gerando gráficos RRD..."
+
+#: etc/inc/rrd.inc:247
+#, php-format
+msgid "RRD restore failed exited with %1$s, the error is: %2$s%3$s"
+msgstr "RRD restore falhou ao sair com %1$s, o erro é: %2$s%3$s"
+
+#: etc/inc/rrd.inc:758 etc/inc/rrd.inc:782 etc/inc/rrd.inc:803
+#: etc/inc/rrd.inc:805 etc/inc/rrd.inc:808 etc/inc/rrd.inc:847
+msgid "Creating rrd update script"
+msgstr "Criando script de atualização rrd"
+
+#: etc/inc/smtp.inc:92
+msgid ": data access time out"
+msgstr ": tempo de expiração de acesso a dados"
+
+#: etc/inc/smtp.inc:95
+msgid ": the server disconnected"
+msgstr ": o servidor desconectou"
+
+#: etc/inc/smtp.inc:107
+msgid "reached the end of data while reading from the SMTP server conection"
+msgstr "atingiu o fim dos dados enquanto lendo da conexão do servidor SMTP"
+
+#: etc/inc/smtp.inc:113
+msgid "it was not possible to read line from the SMTP server"
+msgstr "não foi possível ler linhas do servidor SMTP"
+
+#: etc/inc/smtp.inc:135
+msgid "it was not possible to send a line to the SMTP server"
+msgstr "não foi possível enviar uma linha para o servidor SMTP"
+
+#: etc/inc/smtp.inc:149
+msgid "it was not possible to send data to the SMTP server"
+msgstr "não foi possível enviar dados ao servidor SMTP"
+
+#: etc/inc/smtp.inc:221
+msgid "establishing SSL connections requires at least PHP version 4.3.0"
+msgstr "estabelecer conexões SSL requere pelo menos a versão 4.3.0 do PHP"
+
+#: etc/inc/smtp.inc:224
+msgid "establishing SSL connections requires the OpenSSL extension enabled"
+msgstr "estabelecer conexões SSL requere que a extensão OpenSSL esteja habilitada"
+
+#: etc/inc/smtp.inc:233
+#, php-format
+msgid "could not resolve host \"%s\""
+msgstr "não pôde resolver o host \"%s\""
+
+#: etc/inc/smtp.inc:237
+#, php-format
+msgid "domain \"%s\" resolved to an address excluded to be valid"
+msgstr "domínio \"%s\" resolvido para um endereço excluído de ser válido"
+
+#: etc/inc/smtp.inc:239
+#, php-format
+msgid "Connecting to host address \"%1$s\" port %2$s..."
+msgstr "Conectando ao endereço de host \"%1$s\" porta %2$s..."
+
+#: etc/inc/smtp.inc:246
+msgid "-3 socket could not be created"
+msgstr "-3 socket não pôde ser criado"
+
+#: etc/inc/smtp.inc:248
+#, php-format
+msgid "-4 dns lookup on hostname \"%s\" failed"
+msgstr "-4 dns lookup em nome de host \"%s\" falhou"
+
+#: etc/inc/smtp.inc:250
+msgid "-5 connection refused or timed out"
+msgstr "-5 conexão refugada ou expirada"
+
+#: etc/inc/smtp.inc:252
+msgid "-6 fdopen() call failed"
+msgstr "-6 chamada de fdopen() falhou"
+
+#: etc/inc/smtp.inc:254
+msgid "-7 setvbuf() call failed"
+msgstr "-7 chamada de setvbuf() falhou"
+
+#: etc/inc/smtp.inc:256
+#, php-format
+msgid "could not connect to the host \"%1$s\": %2$s"
+msgstr "não pôde conectar ao host \"%1$s\": %2$s"
+
+#: etc/inc/smtp.inc:265
+msgid "it is not possible to authenticate using the specified mechanism because the SASL library class is not loaded"
+msgstr "não foi possível autenticar usando o mecanismo especificado porque a classe da biblioteca SASL não foi carregada"
+
+#: etc/inc/smtp.inc:289
+#, php-format
+msgid "authenticated mechanism %1$s may not be used: %2$s"
+msgstr "mecanismo autenticado %1$s pode não ser usado: %2$s"
+
+#: etc/inc/smtp.inc:294
+msgid "Could not start the SASL authentication client:"
+msgstr "Não pôde iniciar o cliente de autenticação SASL:"
+
+#: etc/inc/smtp.inc:301
+msgid "Could not send the AUTH command"
+msgstr "Não pôde enviar o comando de Autenticação"
+
+#: etc/inc/smtp.inc:316 etc/inc/smtp.inc:346
+msgid "Authentication error:"
+msgstr "Erro de autenticação:"
+
+#: etc/inc/smtp.inc:331
+msgid "Could not send the authentication step message"
+msgstr "Não pôde enviar a mensagem de passos de autenticação"
+
+#: etc/inc/smtp.inc:351
+msgid "Could not process the SASL authentication step:"
+msgstr "Não pôde processar o passo de autenticação SASL:"
+
+#: etc/inc/smtp.inc:365
+msgid "connection is already established"
+msgstr "conexão já está estabelecida"
+
+#: etc/inc/smtp.inc:403
+msgid "it was not specified the POP3 authentication user"
+msgstr "não foi especificado o usuário de autenticação POP3"
+
+#: etc/inc/smtp.inc:409
+msgid "it was not specified the POP3 authentication password"
+msgstr "não foi especificada a senha de autenticação POP3"
+
+#: etc/inc/smtp.inc:413
+#, php-format
+msgid "Resolving POP3 authentication host \"%s\"..."
+msgstr "Resolvendo host de autenticação POP3 \"%s\"..."
+
+#: etc/inc/smtp.inc:420
+msgid "POP3 authentication server greeting was not found"
+msgstr "Cumprimentos do servidor de autenticação POP3 não foi encontrado"
+
+#: etc/inc/smtp.inc:428
+msgid "POP3 authentication user was not accepted:"
+msgstr "Usuário de autenticação POP3 não foi aceito:"
+
+#: etc/inc/smtp.inc:436
+msgid "POP3 authentication password was not accepted:"
+msgstr "Senha de autenticação POP3 não foi aceita:"
+
+#: etc/inc/smtp.inc:445
+msgid "could not determine the SMTP to connect"
+msgstr "não pôde determinar o SMTP para conectar"
+
+#: etc/inc/smtp.inc:451
+#, php-format
+msgid "Resolving SMTP server domain \"%s\"..."
+msgstr "Resolvendo o domínio do servidor SMTP \"%s\"..."
+
+#: etc/inc/smtp.inc:463
+#, php-format
+msgid "Connected to SMTP server \"%s\"."
+msgstr "Conectado ao servidor SMTP \"%s\"."
+
+#: etc/inc/smtp.inc:517 etc/inc/smtp.inc:519
+msgid "server does not require authentication"
+msgstr "servidor não requere autenticação"
+
+#: etc/inc/smtp.inc:581 etc/inc/smtp.inc:583
+msgid "it is not supported any of the authentication mechanisms required by the server"
+msgstr "não é suportado por nenhum mecanismo de autenticação requerido pelo servidor"
+
+#: etc/inc/smtp.inc:613 etc/inc/smtp.inc:615
+msgid "direct delivery connection is already established and sender is already set"
+msgstr "conexão de entrega direta já está estabelecida e quem envia já esta configurado"
+
+#: etc/inc/smtp.inc:621 etc/inc/smtp.inc:623
+msgid "connection is not in the initial state"
+msgstr "conexão não está no seu estado inicial"
+
+#: etc/inc/smtp.inc:643 etc/inc/smtp.inc:645
+msgid "it was not specified a valid direct recipient"
+msgstr "um destinatário direto válido não foi especificado"
+
+#: etc/inc/smtp.inc:662 etc/inc/smtp.inc:664
+msgid "it is not possible to deliver directly to recipients of different domains"
+msgstr "não foi possível entregar diretamente para destinatários de diferentes domínios"
+
+#: etc/inc/smtp.inc:667 etc/inc/smtp.inc:669
+msgid "connection is already established and the recipient is already set"
+msgstr "conexão já está estabelecida e o destinatário já está configurado"
+
+#: etc/inc/smtp.inc:679 etc/inc/smtp.inc:681
+msgid "connection is not in the recipient setting state"
+msgstr "conexão não está no estado de configuração do destinatário"
+
+#: etc/inc/smtp.inc:708 etc/inc/smtp.inc:710
+msgid "connection is not in the start sending data state"
+msgstr "conexão não está no estado inicial de envio de dados"
+
+#: etc/inc/smtp.inc:738 etc/inc/smtp.inc:749 etc/inc/smtp.inc:740
+#: etc/inc/smtp.inc:751
+msgid "connection is not in the sending data state"
+msgstr "conexão não está no estado de envio de dados"
+
+#: etc/inc/smtp.inc:785 etc/inc/smtp.inc:787
+msgid "it was not previously established a SMTP connection"
+msgstr "não foi previamente estabelecida uma conexão SMTP"
+
+#: etc/inc/upgrade_config.inc:113
+#, php-format
+msgid "%sWarning: filter rule removed (interface '%s' does not exist anymore)."
+msgstr "%sADVERTÊNCIA: regra de filtro removida (interface '%s' não existe mais)."
+
+#: etc/inc/upgrade_config.inc:125
+#, php-format
+msgid "%sWarning: filter rule removed (source network '%s' does not exist anymore)."
+msgstr "%sADVERTÊNCIA: regra de filtro removida (rede fonte '%s' não existe mais)."
+
+#: etc/inc/upgrade_config.inc:138
+#, php-format
+msgid "%sWarning: filter rule removed (destination network '%s' does not exist anymore)."
+msgstr "%sADVERTÊNCIA: regra de filtro removida (rede de destino '%s' não existe mais)."
+
+#: etc/inc/upgrade_config.inc:158
+#, php-format
+msgid "%sWarning: traffic shaper rule removed (interface '%s' does not exist anymore)."
+msgstr "%sADVERTÊNCIA: regra do Traffic Shaper removida (interface '%s' não existe mais)."
+
+#: etc/inc/upgrade_config.inc:170
+#, php-format
+msgid "%sWarning: traffic shaper rule removed (source network '%s' does not exist anymore)."
+msgstr "%sADVERTÊNCIA: regra do Traffic Shaper removida (rede fonte '%s' não existe mais)."
+
+#: etc/inc/upgrade_config.inc:183
+#, php-format
+msgid "%sWarning: traffic shaper rule removed (destination network '%s' does not exist anymore)."
+msgstr "%sADVERTÊNCIA: regra do Traffic Shaper removida (rede de destino '%s' não existe mais)."
+
+#: etc/inc/upgrade_config.inc:333
+#, php-format
+msgid "CARP vhid %s"
+msgstr "CARP vhid %s"
+
+#: etc/inc/upgrade_config.inc:510
+msgid "Permit IPsec traffic."
+msgstr "Tráfego IPsec permitido."
+
+#: etc/inc/upgrade_config.inc:585
+msgid "System Administrators"
+msgstr "Administradores do Sistema"
+
+#: etc/inc/upgrade_config.inc:604
+msgid "Indicates whether this user will lock access to the webConfigurator for other users."
+msgstr "Indica se esse usuário irá bloquear acesso ao webConfigurator para outros usuários."
+
+#: etc/inc/upgrade_config.inc:607
+msgid "Indicates whether this user will lock individual HTML pages after having accessed a particular page (the lock will be freed if the user leaves or saves the page form)."
+msgstr "Indica se esse usuário irá bloquear páginas HTMl individuais após acessar uma página em particular (o bloqueio será liberado se o usuário sair ou salvar o formulário da página)."
+
+#: etc/inc/upgrade_config.inc:610
+msgid "Indicates whether this user is able to login for example via SSH."
+msgstr "Indica se esse usuário pode fazer login, por exemplo, via SSH."
+
+#: etc/inc/upgrade_config.inc:613
+#, php-format
+msgid "Indicates whether this user is allowed to copy files onto the %s appliance via SCP/SFTP. If you are going to use this privilege, you must install scponly on the appliance (Hint: pkg_add -r scponly)."
+msgstr "Indica se esse usuário tem permissão de copiar arquivos no aparelho %s via SCP/SFTP. Se você vai usar esse privilégio, você deve instalar scponly no aparelho (Dica: pkg_add -r scponly)."
+
+#: etc/inc/upgrade_config.inc:616
+msgid "This user is associated with the UNIX root user (you should associate this privilege only with one single user)."
+msgstr "Esse usuário é associado ao usuário root do UNIX (você deve associar esse privilégio somente a um único usuário)."
+
+#: etc/inc/upgrade_config.inc:633
+msgid "Drop packets to closed TCP ports without returning a RST"
+msgstr "Descarta pacotes para portas TCP fechadas sem retornar um RST"
+
+#: etc/inc/upgrade_config.inc:637
+msgid "Do not send ICMP port unreachable messages for closed UDP ports"
+msgstr "Não envie à porta ICMP mensagens inalcansáveis para portas UCP fechadas"
+
+#: etc/inc/upgrade_config.inc:641
+msgid "Randomize the ID field in IP packets (default is 0: sequential IP IDs)"
+msgstr "Randomize o campo ID em pacotes (o padrão é 0: IDs de IP sequenciais)"
+
+#: etc/inc/upgrade_config.inc:645
+msgid "Drop SYN-FIN packets (breaks RFC1379, but nobody uses it anyway)"
+msgstr "Descartar pacotes SYN-FIN (falha com a RFC1379, mas, de qualquer maneira, ninguém a usa)"
+
+#: etc/inc/upgrade_config.inc:649
+msgid "Sending of IPv4 ICMP redirects"
+msgstr "Envio de redirecionamentos ICMP de IPv4"
+
+#: etc/inc/upgrade_config.inc:653
+msgid "Sending of IPv6 ICMP redirects"
+msgstr "Envio de redirecionamentos ICMP de IPv6"
+
+#: etc/inc/upgrade_config.inc:657
+msgid "Generate SYN cookies for outbound SYN-ACK packets"
+msgstr "Gerar cookies SYN para pacotes SYN-ACK de outbound"
+
+#: etc/inc/upgrade_config.inc:661
+msgid "Maximum incoming TCP datagram size"
+msgstr "Tamanho máximo de datagrama TCP de entrada"
+
+#: etc/inc/upgrade_config.inc:665
+msgid "Maximum outgoing TCP datagram size"
+msgstr "Tamanho máximo de datagrama TCP de saída"
+
+#: etc/inc/upgrade_config.inc:669
+msgid "Fastforwarding (see http://lists.freebsd.org/pipermail/freebsd-net/2004-January/002534.html)"
+msgstr "Fastforwarding (veja http://lists.freebsd.org/pipermail/freebsd-net/2004-January/002534.html)"
+
+#: etc/inc/upgrade_config.inc:673
+msgid "Do not delay ACK to try and piggyback it onto a data packet"
+msgstr "Não atrase o ACK para tentar e fazer pingback no pacote de dados"
+
+#: etc/inc/upgrade_config.inc:677
+msgid "Maximum outgoing UDP datagram size"
+msgstr "Tamanho máximo de datagrama UDP de saída"
+
+#: etc/inc/upgrade_config.inc:681
+msgid "Handling of non-IP packets which are not passed to pfil (see if_bridge(4))"
+msgstr "Tratando de pacotes não-IP que não são passados para o pfil (veja if_bridge(4))"
+
+#: etc/inc/upgrade_config.inc:685
+msgid "Allow unprivileged access to tap(4) device nodes"
+msgstr "Permitir acesso sem privilégios a nós de dispositivo tap(4)"
+
+#: etc/inc/upgrade_config.inc:689
+msgid "Randomize PID's (see src/sys/kern/kern_fork.c: sysctl_kern_randompid())"
+msgstr "Randomizar PID's (veja src/sys/kern/kern_fork.c: sysctl_kern_randompid())"
+
+#: etc/inc/upgrade_config.inc:693
+msgid "The system will attempt to calculate the bandwidth delay product for each connection and limit the amount of data queued to the network to just the amount required to maintain optimum throughput. "
+msgstr "O sistema tentará calcular o produto do atraso da largura de banda para cada conexão e limitar a quantidade de dados enfileirados para a rede para apenas a quantidade necessária para manter o throughput."
+
+#: etc/inc/upgrade_config.inc:697
+msgid "Set ICMP Limits"
+msgstr "Configurar Limites ICMP"
+
+#: etc/inc/upgrade_config.inc:701
+msgid "TCP Offload engine"
+msgstr "Mecanismo TCP Offload"
+
+#: etc/inc/upgrade_config.inc:742
+#, php-format
+msgid "Interface %s Static Gateway"
+msgstr "Interface %s Gateway Estático"
+
+#: etc/inc/upgrade_config.inc:745
+#, php-format
+msgid "Interface %s Dynamic Gateway"
+msgstr "Interface %s Gateway Dinâmico"
+
+#: etc/inc/upgrade_config.inc:810 etc/inc/upgrade_config.inc:811
+#, php-format
+msgid "Upgraded static route for %s"
+msgstr "Atualizar rota estática para %s"
+
+#: etc/inc/upgrade_config.inc:907 etc/inc/upgrade_config.inc:908
+#, php-format
+msgid "Sitedown pool for VS: %s"
+msgstr "Pool de sites indisponíveis para Servidor Virtual: %s"
+
+#: etc/inc/upgrade_config.inc:1060 etc/inc/upgrade_config.inc:1062
+#: etc/inc/upgrade_config.inc:1063
+#, php-format
+msgid "phase2 for %s"
+msgstr "fase2 para %s"
+
+#: etc/inc/upgrade_config.inc:1287 etc/inc/upgrade_config.inc:1289
+#: etc/inc/upgrade_config.inc:1290
+#, php-format
+msgid "Upgraded Dyndns %s"
+msgstr "Atualizar DNS Dinâmico %s"
+
+#: etc/inc/upgrade_config.inc:1339 etc/inc/upgrade_config.inc:1341
+#: etc/inc/upgrade_config.inc:1342
+msgid "All Users"
+msgstr "Todos Usuários"
+
+#: etc/inc/upgrade_config.inc:1471 etc/inc/upgrade_config.inc:1473
+#: etc/inc/upgrade_config.inc:1474
+#, php-format
+msgid "Converted bridged %s"
+msgstr "Converted bridged %s"
+
+#: etc/inc/upgrade_config.inc:1797 etc/inc/upgrade_config.inc:1845
+#: etc/inc/upgrade_config.inc:1847 etc/inc/upgrade_config.inc:1848
+msgid "Auto added OpenVPN rule from config upgrade."
+msgstr "Regra de OpenVPN auto adicionada pela atualização de config."
+
+#: etc/inc/voucher.inc:364 etc/inc/voucher.inc:367 etc/inc/voucher.inc:382
+#, php-format
+msgid "%1$s (%2$s/%3$s) active and good for %4$d Minutes"
+msgstr "%1$s (%2$s/%3$s) ativo e válido por %4$d Minutos"
+
+#: etc/inc/voucher.inc:401 etc/inc/voucher.inc:404 etc/inc/voucher.inc:419
+msgid "Access denied!"
+msgstr "Acesso negado!"
+
+#: etc/inc/voucher.inc:403 etc/inc/voucher.inc:406 etc/inc/voucher.inc:421
+#, php-format
+msgid "Access granted for %d Minutes in total."
+msgstr "Acesso garantido por %d minutos no total."
+
+#: etc/inc/voucher.inc:466 etc/inc/voucher.inc:469 etc/inc/voucher.inc:484
+msgid "Enabling voucher support... "
+msgstr "Habilitando suporte a voucher..."
+
+#: etc/inc/voucher.inc:505 etc/inc/voucher.inc:508 etc/inc/voucher.inc:523
+#, php-format
+msgid "Error: cannot write voucher.cfg"
+msgstr "Erro: não pode escrever voicher.cfg"
+
+#: etc/inc/voucher.inc:556 etc/inc/voucher.inc:559 etc/inc/voucher.inc:574
+#, php-format
+msgid "cant write %1$s/voucher_%s_used_%2$s.db"
+msgstr "não pode gravar em %1$s/voucher_%s_used_%2$s.db"
+
+#: etc/inc/voucher.inc:635 etc/inc/voucher.inc:638 etc/inc/voucher.inc:653
+#, php-format
+msgid "cant read %1$s/voucher_%s_used_%2$s.db"
+msgstr "não pode ler %1$s/voucher_%s_used_%2$s.db"
+
+#: etc/inc/voucher.inc:653 etc/inc/voucher.inc:652 etc/inc/voucher.inc:655
+#: etc/inc/voucher.inc:670
+#, php-format
+msgid "Voucher: %s"
+msgstr "Voucher: %s"
+
+#: etc/inc/xmlparse_attr.inc:197
+#, php-format
+msgid "XML error: %1$s at line %2$d"
+msgstr "Erro de XML: %1$s na linha %2$d"
+
+#: etc/inc/xmlreader.inc:129
+#, php-format
+msgid "Error returned while trying to parse %s"
+msgstr "Erro retornado quando tentava analisar %s"
+
+#: etc/inc/zeromq.inc:225 etc/inc/zeromq.inc:236
+#, php-format
+msgid "Merged in config (%s sections) from ZeroMQ client."
+msgstr "Mesclado em config (seções %s) do cliente ZeroMQ."
+
+#: usr/local/www/load_balancer_virtual_server.php:94
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:96
+#: usr/local/www/load_balancer_relay_action.php:104
+#: usr/local/www/services_dyndns.php:76 usr/local/www/services_snmp.php:159
+#: usr/local/www/services_wol.php:115 usr/local/www/services_wol_edit.php:112
+#: usr/local/www/load_balancer_pool.php:97
+#: usr/local/www/load_balancer_monitor.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:153
+#: usr/local/www/load_balancer_virtual_server_edit.php:134
+#: usr/local/www/services_captiveportal.php:63
+#: usr/local/www/services_captiveportal_filemanager.php:75
+#: usr/local/www/services_captiveportal_ip.php:64
+#: usr/local/www/services_captiveportal_ip_edit.php:63
+#: usr/local/www/services_captiveportal_mac.php:63
+#: usr/local/www/services_captiveportal_mac_edit.php:60
+#: usr/local/www/services_dhcp.php:421
+#: usr/local/www/services_dhcp_edit.php:190
+#: usr/local/www/services_dhcp_relay.php:100
+#: usr/local/www/services_dnsmasq.php:119
+#: usr/local/www/services_dnsmasq_edit.php:127
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/load_balancer_relay_protocol.php:100
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/services_captiveportal_hostname.php:66
+#: usr/local/www/services_captiveportal_hostname_edit.php:62
+#: usr/local/www/services_captiveportal_vouchers.php:85
+#: usr/local/www/services_captiveportal_vouchers_edit.php:48
+#: usr/local/www/fbegin.inc:171 usr/local/www/fbegin.inc:343
+#: usr/local/www/status_services.php:226
+#: usr/local/www/services_dyndns_edit.php:133
+#: usr/local/www/services_igmpproxy.php:80
+#: usr/local/www/services_rfc2136.php:55
+#: usr/local/www/services_rfc2136_edit.php:109
+#: usr/local/www/system_authservers.php:186
+#: usr/local/www/vpn_pppoe_edit.php:234 usr/local/www/services_dhcpv6.php:359
+#: usr/local/www/services_dhcpv6_edit.php:172
+#: usr/local/www/services_dhcpv6_relay.php:101
+#: usr/local/www/services_captiveportal_zones_edit.php:48
+#: usr/local/www/services_dyndns_edit.php:156 usr/local/www/fbegin.inc:189
+#: usr/local/www/fbegin.inc:361 usr/local/www/services_dnsmasq_edit.php:166
+#: usr/local/www/services_dhcpv6_edit.php:175
+#: usr/local/www/load_balancer_setting.php:98
+#: usr/local/www/services_unbound.php:102
+#: usr/local/www/services_unbound_advanced.php:88
+#: usr/local/www/services_dyndns.php:85 usr/local/www/services_dhcp.php:433
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/services_ntpd.php:71 usr/local/www/services_dhcp_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/services_dhcpv6.php:386
+#: usr/local/www/services_captiveportal_vouchers.php:82
+#: usr/local/www/fbegin.inc:197 usr/local/www/fbegin.inc:307
+#: usr/local/www/services_captiveportal_vouchers_edit.php:45
+#: usr/local/www/services_router_advertisements.php:194
+#: usr/local/www/services_captiveportal_ip.php:61
+#: usr/local/www/services_captiveportal_hostname_edit.php:59
+#: usr/local/www/services_captiveportal_mac.php:60
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/services_captiveportal_mac_edit.php:57
+#: usr/local/www/services_captiveportal_hostname.php:63
+#: usr/local/www/status_services.php:222
+#: usr/local/www/services_captiveportal.php:60
+#: usr/local/www/services_captiveportal_filemanager.php:71
+#: usr/local/www/services_captiveportal_ip_edit.php:60
+#: usr/local/www/services_dhcp.php:527 usr/local/www/services_ntpd.php:76
+#: usr/local/www/services_captiveportal_zones_edit.php:45
+#: usr/local/www/services_dhcpv6.php:367
+#: usr/local/www/system_authservers.php:187
+#: usr/local/www/status_services.php:220
+#: usr/local/www/services_dhcpv6_edit.php:178
+#: usr/local/www/services_dyndns_edit.php:160
+#: usr/local/www/services_dhcp_edit.php:301
+#: usr/local/www/services_captiveportal_vouchers.php:89
+#: usr/local/www/vpn_pppoe_edit.php:237 usr/local/www/services_dhcp.php:526
+#: usr/local/www/services_dhcpv6.php:362
+#: usr/local/www/system_authservers.php:188 usr/local/www/fbegin.inc:188
+#: usr/local/www/fbegin.inc:299 usr/local/www/services_dnsmasq.php:123
+#: usr/local/www/services_dyndns.php:64 usr/local/www/services_snmp.php:165
+#: usr/local/www/status_services.php:63
+#: usr/local/www/services_router_advertisements.php:189
+#: usr/local/www/services_dyndns_edit.php:162
+#: usr/local/www/services_dhcp.php:546 usr/local/www/services_dnsmasq.php:125
+#: usr/local/www/services_dyndns.php:60 usr/local/www/services_dnsmasq.php:146
+#: usr/local/www/services_dhcp.php:558
+#: usr/local/www/system_authservers.php:190
+#: usr/local/www/services_rfc2136_edit.php:114
+msgid "Services"
+msgstr "Serviços"
+
+#: usr/local/www/load_balancer_virtual_server.php:94
+#: usr/local/www/load_balancer_relay_action.php:104
+#: usr/local/www/diag_logs.php:84 usr/local/www/diag_logs_auth.php:72
+#: usr/local/www/diag_logs_dhcp.php:77 usr/local/www/diag_logs_filter.php:108
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_ipsec.php:109 usr/local/www/diag_logs_ntpd.php:72
+#: usr/local/www/diag_logs_openvpn.php:76
+#: usr/local/www/diag_logs_settings.php:217
+#: usr/local/www/diag_logs_vpn.php:133 usr/local/www/load_balancer_pool.php:97
+#: usr/local/www/diag_logs_filter_summary.php:191
+#: usr/local/www/diag_logs_ppp.php:77 usr/local/www/diag_logs_relayd.php:55
+#: usr/local/www/diag_logs_relayd.php:73
+#: usr/local/www/load_balancer_monitor.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:153
+#: usr/local/www/load_balancer_virtual_server_edit.php:134
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/load_balancer_relay_protocol.php:100
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/fbegin.inc:130 usr/local/www/fbegin.inc:165
+#: usr/local/www/status_lb_pool.php:62 usr/local/www/status_lb_vs.php:56
+#: usr/local/www/diag_logs_wireless.php:74
+#: usr/local/www/diag_logs_routing.php:72
+#: usr/local/www/diag_logs_settings.php:222 usr/local/www/fbegin.inc:147
+#: usr/local/www/fbegin.inc:182 usr/local/www/load_balancer_setting.php:98
+#: usr/local/www/diag_logs_resolver.php:85
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/diag_logs_gateways.php:85
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_routing.php:73
+#: usr/local/www/diag_logs_settings.php:229 usr/local/www/fbegin.inc:156
+#: usr/local/www/fbegin.inc:190 usr/local/www/diag_logs_relayd.php:74
+#: usr/local/www/diag_logs_auth.php:73 usr/local/www/diag_logs_ipsec.php:110
+#: usr/local/www/diag_logs_resolver.php:86 usr/local/www/diag_logs_ntpd.php:73
+#: usr/local/www/diag_logs_dhcp.php:78 usr/local/www/diag_logs_wireless.php:75
+#: usr/local/www/diag_logs_filter_summary.php:192
+#: usr/local/www/diag_logs_gateways.php:86
+#: usr/local/www/diag_logs_openvpn.php:77
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: usr/local/www/diag_logs_filter.php:98
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_ppp.php:75 usr/local/www/fbegin.inc:148
+#: usr/local/www/fbegin.inc:181 usr/local/www/diag_logs_filter.php:128
+#: usr/local/www/diag_logs_settings.php:248
+msgid "Load Balancer"
+msgstr "Balanc. Carga"
+
+#: usr/local/www/load_balancer_virtual_server.php:94
+#: usr/local/www/load_balancer_virtual_server.php:116
+#: usr/local/www/load_balancer_relay_action.php:127
+#: usr/local/www/load_balancer_pool.php:119
+#: usr/local/www/load_balancer_monitor.php:110
+#: usr/local/www/load_balancer_relay_protocol.php:123
+#: usr/local/www/status_lb_pool.php:121 usr/local/www/status_lb_vs.php:68
+#: usr/local/www/load_balancer_setting.php:120
+#: usr/local/www/load_balancer_setting.php:119
+#: usr/local/www/load_balancer_virtual_server.php:114
+#: usr/local/www/load_balancer_monitor.php:108
+#: usr/local/www/load_balancer_relay_protocol.php:121
+#: usr/local/www/load_balancer_relay_action.php:125
+#: usr/local/www/load_balancer_pool.php:117
+msgid "Virtual Servers"
+msgstr "Servidores Virtuais"
+
+#: usr/local/www/load_balancer_virtual_server.php:108
+#: usr/local/www/load_balancer_virtual_server.php:106
+msgid "The virtual server configuration has been changed"
+msgstr "A configuração do servidor virtual foi modificada"
+
+#: usr/local/www/load_balancer_virtual_server.php:108
+#: usr/local/www/firewall_shaper_layer7.php:401
+#: usr/local/www/firewall_shaper_vinterface.php:366
+#: usr/local/www/firewall_shaper_wizards.php:96
+#: usr/local/www/firewall_aliases.php:160
+#: usr/local/www/firewall_nat_1to1.php:87
+#: usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_shaper.php:403
+#: usr/local/www/firewall_shaper_queues.php:187
+#: usr/local/www/firewall_virtual_ip.php:164 usr/local/www/interfaces.php:1222
+#: usr/local/www/vpn_ipsec.php:134 usr/local/www/vpn_ipsec_keys.php:86
+#: usr/local/www/vpn_ipsec_mobile.php:303
+#: usr/local/www/load_balancer_monitor.php:102 usr/local/www/vpn_pppoe.php:96
+#: usr/local/www/firewall_nat.php:175 usr/local/www/services_dhcp.php:536
+#: usr/local/www/services_dnsmasq.php:147
+#: usr/local/www/load_balancer_relay_protocol.php:114
+#: usr/local/www/services_igmpproxy.php:90
+#: usr/local/www/system_gateways.php:134 usr/local/www/firewall_nat_npt.php:87
+#: usr/local/www/services_dhcpv6.php:461
+#: usr/local/www/services_captiveportal_zones.php:47
+#: usr/local/www/firewall_nat_out.php:304
+#: usr/local/www/load_balancer_setting.php:111
+#: usr/local/www/services_unbound.php:129
+#: usr/local/www/services_unbound_advanced.php:116
+#: usr/local/www/firewall_shaper_vinterface.php:376
+#: usr/local/www/services_dhcp.php:549 usr/local/www/firewall_aliases.php:163
+#: usr/local/www/interfaces.php:1326 usr/local/www/services_dhcpv6.php:488
+#: usr/local/www/services_dnsmasq.php:148
+#: usr/local/www/firewall_nat_out.php:305
+#: usr/local/www/load_balancer_setting.php:110 usr/local/www/vpn_pppoe.php:97
+#: usr/local/www/vpn_ipsec.php:133 usr/local/www/vpn_ipsec_mobile.php:330
+#: usr/local/www/firewall_nat.php:180 usr/local/www/firewall_shaper.php:404
+#: usr/local/www/vpn_ipsec_keys.php:85
+#: usr/local/www/firewall_shaper_vinterface.php:383
+#: usr/local/www/load_balancer_virtual_server.php:106
+#: usr/local/www/load_balancer_monitor.php:100
+#: usr/local/www/load_balancer_relay_protocol.php:112
+#: usr/local/www/services_dhcp.php:653 usr/local/www/firewall_aliases.php:167
+#: usr/local/www/interfaces.php:1314
+#: usr/local/www/services_captiveportal_zones.php:48
+#: usr/local/www/firewall_virtual_ip.php:167
+#: usr/local/www/services_dhcpv6.php:468 usr/local/www/vpn_pppoe.php:98
+#: usr/local/www/vpn_ipsec.php:139 usr/local/www/firewall_virtual_ip.php:181
+#: usr/local/www/services_dhcp.php:655 usr/local/www/services_dhcpv6.php:463
+#: usr/local/www/services_dnsmasq.php:152 usr/local/www/interfaces.php:1327
+#: usr/local/www/firewall_shaper.php:405
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/firewall_shaper_queues.php:188
+#: usr/local/www/firewall_aliases.php:166
+#: usr/local/www/firewall_shaper_wizards.php:97
+#: usr/local/www/services_dhcp.php:675 usr/local/www/firewall_nat_out.php:312
+#: usr/local/www/services_dnsmasq.php:154 usr/local/www/interfaces.php:1369
+#: usr/local/www/firewall_virtual_ip.php:204
+#: usr/local/www/firewall_nat.php:183 usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/services_dnsmasq.php:175 usr/local/www/interfaces.php:1364
+#: usr/local/www/firewall_virtual_ip.php:211
+#: usr/local/www/services_dhcp.php:687 usr/local/www/interfaces.php:1377
+msgid "You must apply the changes in order for them to take effect."
+msgstr "Você deve aplicar as mudanças para que elas tenham efeito."
+
+#: usr/local/www/load_balancer_virtual_server.php:115
+#: usr/local/www/load_balancer_relay_action.php:126
+#: usr/local/www/load_balancer_pool.php:118
+#: usr/local/www/load_balancer_monitor.php:109
+#: usr/local/www/load_balancer_relay_protocol.php:122
+#: usr/local/www/status_lb_pool.php:120 usr/local/www/status_lb_vs.php:67
+#: usr/local/www/load_balancer_setting.php:119
+#: usr/local/www/load_balancer_setting.php:118
+#: usr/local/www/load_balancer_virtual_server.php:113
+#: usr/local/www/load_balancer_monitor.php:107
+#: usr/local/www/load_balancer_relay_protocol.php:120
+#: usr/local/www/load_balancer_relay_action.php:124
+#: usr/local/www/load_balancer_pool.php:116
+msgid "Pools"
+msgstr "Pools"
+
+#: usr/local/www/load_balancer_virtual_server.php:117
+#: usr/local/www/load_balancer_relay_action.php:125
+#: usr/local/www/load_balancer_pool.php:120
+#: usr/local/www/load_balancer_monitor.php:111
+#: usr/local/www/load_balancer_relay_protocol.php:121
+#: usr/local/www/load_balancer_setting.php:121
+#: usr/local/www/load_balancer_setting.php:120
+#: usr/local/www/load_balancer_virtual_server.php:115
+#: usr/local/www/load_balancer_monitor.php:109
+#: usr/local/www/load_balancer_relay_protocol.php:119
+#: usr/local/www/load_balancer_relay_action.php:123
+#: usr/local/www/load_balancer_pool.php:118
+msgid "Monitors"
+msgstr "Monitores"
+
+#: usr/local/www/load_balancer_virtual_server.php:129
+#: usr/local/www/firewall_shaper_layer7.php:466
+#: usr/local/www/interfaces_bridge_edit.php:291
+#: usr/local/www/firewall_nat_edit.php:182
+#: usr/local/www/firewall_nat_edit.php:185
+#: usr/local/www/firewall_nat_edit.php:518
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:456
+#: usr/local/www/firewall_rules_edit.php:808
+#: usr/local/www/diag_ipsec_sad.php:89 usr/local/www/diag_ipsec_spd.php:89
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:424
+#: usr/local/www/status_upnp.php:86
+#: usr/local/www/services_rfc2136_edit.php:186
+#: usr/local/www/system_advanced_admin.php:300
+#: usr/local/www/vpn_ipsec_phase2.php:516
+#: usr/local/www/vpn_openvpn_client.php:421
+#: usr/local/www/vpn_openvpn_client.php:861
+#: usr/local/www/vpn_openvpn_server.php:656
+#: usr/local/www/firewall_nat_out_edit.php:469
+#: usr/local/www/load_balancer_relay_action_edit.php:423
+#: usr/local/www/firewall_rules_edit.php:843
+#: usr/local/www/load_balancer_virtual_server.php:130
+#: usr/local/www/vpn_openvpn_server.php:729
+#: usr/local/www/interfaces_bridge_edit.php:300
+#: usr/local/www/diag_packet_capture.php:160
+#: usr/local/www/vpn_ipsec_phase2.php:542
+#: usr/local/www/firewall_nat_edit.php:525
+#: usr/local/www/vpn_openvpn_client.php:426
+#: usr/local/www/vpn_openvpn_client.php:866
+#: usr/local/www/load_balancer_relay_action_edit.php:421
+#: usr/local/www/diag_ipsec_sad.php:90
+#: usr/local/www/load_balancer_virtual_server.php:128
+#: usr/local/www/vpn_openvpn_server.php:747 usr/local/www/status_upnp.php:87
+#: usr/local/www/interfaces_bridge_edit.php:301
+#: usr/local/www/diag_packet_capture.php:207
+#: usr/local/www/vpn_ipsec_phase2.php:644
+#: usr/local/www/firewall_nat_edit.php:524
+#: usr/local/www/vpn_openvpn_client.php:434
+#: usr/local/www/vpn_openvpn_client.php:919
+#: usr/local/www/diag_ipsec_spd.php:90
+#: usr/local/www/vpn_openvpn_client.php:452
+#: usr/local/www/vpn_openvpn_client.php:938
+#: usr/local/www/firewall_rules_edit.php:846
+#: usr/local/www/firewall_nat_edit.php:187
+#: usr/local/www/firewall_nat_edit.php:190
+#: usr/local/www/firewall_nat_edit.php:519
+#: usr/local/www/interfaces_bridge_edit.php:302
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:473
+#: usr/local/www/vpn_openvpn_server.php:773
+#: usr/local/www/vpn_ipsec_phase2.php:665
+#: usr/local/www/firewall_rules_edit.php:858
+#: usr/local/www/diag_logs_filter.php:171
+#: usr/local/www/firewall_nat_edit.php:192
+#: usr/local/www/firewall_nat_edit.php:195
+#: usr/local/www/firewall_nat_edit.php:531
+#: usr/local/www/diag_packet_capture.php:223
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:485
+#: usr/local/www/firewall_rules_edit.php:857
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/interfaces_bridge_edit.php:304
+#: usr/local/www/firewall_rules_edit.php:905
+#: usr/local/www/system_advanced_admin.php:321
+#: usr/local/www/services_rfc2136_edit.php:191
+msgid "Protocol"
+msgstr "Protocolo"
+
+#: usr/local/www/load_balancer_virtual_server.php:130
+#: usr/local/www/diag_tables.php:133
+#: usr/local/www/interfaces_ppps_edit.php:660
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:195
+#: usr/local/www/system_advanced_notifications.php:185
+#: usr/local/www/diag_tables.php:132
+#: usr/local/www/system_advanced_notifications.php:194
+#: usr/local/www/load_balancer_virtual_server.php:131
+#: usr/local/www/load_balancer_virtual_server_edit.php:169
+#: usr/local/www/interfaces_ppps_edit.php:661
+#: usr/local/www/load_balancer_virtual_server.php:129
+#: usr/local/www/load_balancer_virtual_server_edit.php:167
+#: usr/local/www/interfaces_ppps_edit.php:667 usr/local/www/diag_dns.php:153
+#: usr/local/www/interfaces_ppps_edit.php:665
+#: usr/local/www/system_advanced_notifications.php:216
+msgid "IP Address"
+msgstr "Endereço IP"
+
+#: usr/local/www/load_balancer_virtual_server.php:131
+#: usr/local/www/diag_packet_capture.php:165
+#: usr/local/www/firewall_aliases_edit.php:459
+#: usr/local/www/firewall_rules.php:365 usr/local/www/firewall_rules.php:367
+#: usr/local/www/load_balancer_pool.php:134
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:203
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:202
+#: usr/local/www/services_captiveportal.php:607
+#: usr/local/www/services_captiveportal.php:628
+#: usr/local/www/services_captiveportal.php:647
+#: usr/local/www/services_captiveportal.php:666
+#: usr/local/www/status_upnp.php:85
+#: usr/local/www/firewall_aliases_edit.php:462
+#: usr/local/www/firewall_rules.php:369 usr/local/www/firewall_rules.php:371
+#: usr/local/www/load_balancer_virtual_server.php:132
+#: usr/local/www/services_captiveportal.php:643
+#: usr/local/www/services_captiveportal.php:664
+#: usr/local/www/services_captiveportal.php:686
+#: usr/local/www/services_captiveportal.php:705
+#: usr/local/www/load_balancer_virtual_server_edit.php:183
+#: usr/local/www/diag_packet_capture.php:185
+#: usr/local/www/load_balancer_pool_edit.php:211
+#: usr/local/www/load_balancer_pool.php:135
+#: usr/local/www/firewall_aliases_edit.php:464
+#: usr/local/www/firewall_rules.php:362 usr/local/www/firewall_rules.php:364
+#: usr/local/www/load_balancer_virtual_server.php:130
+#: usr/local/www/services_captiveportal.php:641
+#: usr/local/www/services_captiveportal.php:662
+#: usr/local/www/services_captiveportal.php:684
+#: usr/local/www/services_captiveportal.php:703
+#: usr/local/www/status_upnp.php:86
+#: usr/local/www/load_balancer_virtual_server_edit.php:181
+#: usr/local/www/diag_packet_capture.php:232
+#: usr/local/www/load_balancer_pool_edit.php:209
+#: usr/local/www/load_balancer_pool.php:133 usr/local/www/diag_testport.php:60
+#: usr/local/www/diag_testport.php:123
+#: usr/local/www/services_captiveportal.php:642
+#: usr/local/www/services_captiveportal.php:663
+#: usr/local/www/services_captiveportal.php:685
+#: usr/local/www/services_captiveportal.php:704
+#: usr/local/www/diag_packet_capture.php:248
+#: usr/local/www/firewall_rules.php:360
+#: usr/local/www/services_captiveportal.php:658
+#: usr/local/www/services_captiveportal.php:679
+#: usr/local/www/services_captiveportal.php:701
+#: usr/local/www/services_captiveportal.php:720
+#: usr/local/www/firewall_aliases_edit.php:486
+#: usr/local/www/firewall_aliases_edit.php:485
+msgid "Port"
+msgstr "Porta"
+
+#: usr/local/www/load_balancer_virtual_server.php:132
+#: usr/local/www/load_balancer_pool.php:97
+#: usr/local/www/load_balancer_pool_edit.php:153
+#: usr/local/www/status_lb_pool.php:62
+#: usr/local/www/load_balancer_virtual_server.php:133
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/load_balancer_virtual_server.php:131
+msgid "Pool"
+msgstr "Pool"
+
+#: usr/local/www/load_balancer_virtual_server.php:133
+#: usr/local/www/load_balancer_virtual_server_edit.php:228
+#: usr/local/www/load_balancer_virtual_server.php:134
+#: usr/local/www/load_balancer_virtual_server_edit.php:217
+#: usr/local/www/load_balancer_virtual_server.php:132
+#: usr/local/www/load_balancer_virtual_server_edit.php:215
+msgid "Fall Back Pool"
+msgstr "Pool de Fall Back"
+
+#: usr/local/www/diag_tables.php:44 usr/local/www/diag_defaults.php:58
+#: usr/local/www/diag_dump_states.php:65 usr/local/www/diag_nanobsd.php:49
+#: usr/local/www/diag_packet_capture.php:41
+#: usr/local/www/crash_reporter.php:82
+#: usr/local/www/diag_authentication.php:69 usr/local/www/diag_backup.php:499
+#: usr/local/www/diag_confbak.php:98 usr/local/www/halt.php:59
+#: usr/local/www/diag_smart.php:14 usr/local/www/diag_states_summary.php:185
+#: usr/local/www/system_firmware_auto.php:60
+#: usr/local/www/diag_patterns.php:58 usr/local/www/diag_dns.php:34
+#: usr/local/www/reboot.php:51 usr/local/www/edit.php:39
+#: usr/local/www/diag_ping.php:43 usr/local/www/diag_resetstate.php:64
+#: usr/local/www/diag_routes.php:45 usr/local/www/diag_traceroute.php:45
+#: usr/local/www/exec.php:91 usr/local/www/fbegin.inc:367
+#: usr/local/www/diag_arp.php:261 usr/local/www/diag_ndp.php:103
+#: usr/local/www/system_firmware_restorefullbackup.php:104
+#: usr/local/www/diag_dump_states_sources.php:65 usr/local/www/fbegin.inc:385
+#: usr/local/www/diag_backup.php:576 usr/local/www/reboot.php:48
+#: usr/local/www/edit.php:42 usr/local/www/diag_dump_states.php:75
+#: usr/local/www/halt.php:54 usr/local/www/diag_states_summary.php:174
+#: usr/local/www/fbegin.inc:331 usr/local/www/diag_sockets.php:44
+#: usr/local/www/exec.php:93 usr/local/www/diag_packet_capture.php:43
+#: usr/local/www/diag_states_summary.php:176
+#: usr/local/www/diag_testport.php:49 usr/local/www/diag_defaults.php:52
+#: usr/local/www/diag_backup.php:581 usr/local/www/edit.php:41
+#: usr/local/www/fbegin.inc:323 usr/local/www/diag_dump_states.php:67
+#: usr/local/www/system_firmware_auto.php:61
+#: usr/local/www/diag_traceroute.php:46 usr/local/www/diag_ping.php:44
+#: usr/local/www/diag_backup.php:582
+msgid "Diagnostics"
+msgstr "Diagnósticos"
+
+#: usr/local/www/diag_tables.php:44 usr/local/www/fbegin.inc:199
+#: usr/local/www/fbegin.inc:217 usr/local/www/fbegin.inc:225
+#: usr/local/www/fbegin.inc:216
+msgid "Tables"
+msgstr "Tabelas"
+
+#: usr/local/www/diag_tables.php:86 usr/local/www/diag_tables.php:87
+msgid "The bogons database has been updated."
+msgstr "O banco de dados bogons foi atualizado."
+
+#: usr/local/www/diag_tables.php:118 usr/local/www/diag_tables.php:117
+msgid "Table:"
+msgstr "Tabela:"
+
+#: usr/local/www/diag_tables.php:152 usr/local/www/diag_tables.php:151
+#: usr/local/www/diag_tables.php:153 usr/local/www/diag_tables.php:155
+msgid "No entries exist in this table."
+msgstr "Não existe entradas nesta tabela."
+
+#: usr/local/www/diag_tables.php:160 usr/local/www/diag_backup.php:163
+#: usr/local/www/exec.php:273 usr/local/www/exec.php:283
+#: usr/local/www/system_firmware_restorefullbackup.php:166
+#: usr/local/www/diag_tables.php:159 usr/local/www/diag_backup.php:250
+#: usr/local/www/exec.php:275 usr/local/www/exec.php:285
+#: usr/local/www/diag_tables.php:153 usr/local/www/diag_tables.php:162
+#: usr/local/www/diag_backup.php:251
+msgid "Download"
+msgstr "Download"
+
+#: usr/local/www/diag_tables.php:160 usr/local/www/diag_tables.php:159
+#: usr/local/www/diag_tables.php:153 usr/local/www/diag_tables.php:162
+msgid " the latest bogon data."
+msgstr " dados de bogon mais recente."
+
+#: usr/local/www/diag_tables.php:162
+#: usr/local/www/firewall_shaper_layer7.php:576
+#: usr/local/www/services_dhcpv6.php:758
+#: usr/local/www/system_firmware_restorefullbackup.php:163
+#: usr/local/www/diag_tables.php:161 usr/local/www/services_dhcpv6.php:853
+#: usr/local/www/services_dhcpv6.php:784 usr/local/www/diag_tables.php:165
+#: usr/local/www/services_dhcpv6.php:801
+#: usr/local/www/firewall_shaper_layer7.php:571
+msgid "Delete"
+msgstr "Excluir"
+
+#: usr/local/www/diag_tables.php:162 usr/local/www/diag_tables.php:161
+#: usr/local/www/diag_tables.php:165
+msgid "all"
+msgstr "todos"
+
+#: usr/local/www/diag_tables.php:162 usr/local/www/diag_tables.php:161
+#: usr/local/www/diag_tables.php:165
+msgid "entries in this table."
+msgstr "entradas nesta tabela."
+
+#: usr/local/www/pkg_edit.php:61 usr/local/www/pkg.php:51
+#: usr/local/www/pkg.php:55 usr/local/www/pkg_edit.php:69
+msgid "ERROR: No package defined."
+msgstr "ERRO: Nenhum pacote definido."
+
+#: usr/local/www/pkg_edit.php:256
+#: usr/local/www/firewall_virtual_ip_edit.php:281
+#: usr/local/www/services_wol_edit.php:112
+#: usr/local/www/interfaces_bridge_edit.php:226
+#: usr/local/www/interfaces_gif_edit.php:125
+#: usr/local/www/interfaces_gre_edit.php:127
+#: usr/local/www/interfaces_groups_edit.php:44
+#: usr/local/www/firewall_aliases_edit.php:56
+#: usr/local/www/firewall_nat_1to1_edit.php:216
+#: usr/local/www/firewall_nat_edit.php:438
+#: usr/local/www/firewall_nat_out_edit.php:300
+#: usr/local/www/firewall_rules_edit.php:628
+#: usr/local/www/firewall_schedule_edit.php:61
+#: usr/local/www/interfaces_vlan_edit.php:139
+#: usr/local/www/interfaces_lagg_edit.php:120
+#: usr/local/www/interfaces_ppps_edit.php:378
+#: usr/local/www/interfaces_qinq_edit.php:39
+#: usr/local/www/interfaces_wireless_edit.php:145
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:153
+#: usr/local/www/load_balancer_virtual_server_edit.php:134
+#: usr/local/www/vpn_pptp_users_edit.php:135
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/services_rfc2136_edit.php:109
+#: usr/local/www/vpn_l2tp_users_edit.php:38
+#: usr/local/www/vpn_pppoe_edit.php:234
+#: usr/local/www/firewall_nat_npt_edit.php:140
+#: usr/local/www/firewall_nat_1to1_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:145 usr/local/www/pkg_edit.php:251
+#: usr/local/www/firewall_nat_out_edit.php:313
+#: usr/local/www/firewall_rules_edit.php:660
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+#: usr/local/www/interfaces_bridge_edit.php:235
+#: usr/local/www/firewall_nat_edit.php:445
+#: usr/local/www/load_balancer_pool_edit.php:159
+#: usr/local/www/firewall_virtual_ip_edit.php:268
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+#: usr/local/www/firewall_nat_npt_edit.php:144 usr/local/www/pkg_edit.php:254
+#: usr/local/www/firewall_rules_edit.php:661
+#: usr/local/www/firewall_nat_edit.php:444
+#: usr/local/www/firewall_virtual_ip_edit.php:261
+#: usr/local/www/interfaces_wireless_edit.php:147
+#: usr/local/www/firewall_rules_edit.php:664
+#: usr/local/www/interfaces_vlan_edit.php:142
+#: usr/local/www/interfaces_ppps_edit.php:384
+#: usr/local/www/interfaces_lagg_edit.php:133
+#: usr/local/www/firewall_nat_edit.php:439
+#: usr/local/www/interfaces_gif_edit.php:133
+#: usr/local/www/firewall_virtual_ip_edit.php:253
+#: usr/local/www/vpn_pppoe_edit.php:237
+#: usr/local/www/interfaces_bridge_edit.php:236
+#: usr/local/www/firewall_nat_out_edit.php:317
+#: usr/local/www/firewall_rules_edit.php:676
+#: usr/local/www/firewall_nat_edit.php:451
+#: usr/local/www/firewall_virtual_ip_edit.php:273
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/firewall_nat_edit.php:452
+#: usr/local/www/firewall_rules_edit.php:724
+#: usr/local/www/firewall_virtual_ip_edit.php:277
+#: usr/local/www/services_rfc2136_edit.php:114
+msgid "Edit"
+msgstr "Editar"
+
+#: usr/local/www/pkg_edit.php:260 usr/local/www/pkg_edit.php:255
+#: usr/local/www/pkg_edit.php:258
+msgid "Package Editor"
+msgstr "Editor de Pacote"
+
+#: usr/local/www/pkg_edit.php:405
+#: usr/local/www/firewall_aliases_import.php:154
+#: usr/local/www/firewall_shaper_layer7.php:569
+#: usr/local/www/firewall_shaper_vinterface.php:307
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:130
+#: usr/local/www/firewall_virtual_ip_edit.php:546
+#: usr/local/www/diag_logs_settings.php:321 usr/local/www/diag_nanobsd.php:219
+#: usr/local/www/services_snmp.php:400 usr/local/www/services_wol_edit.php:157
+#: usr/local/www/interfaces_bridge_edit.php:583
+#: usr/local/www/interfaces_gif_edit.php:218
+#: usr/local/www/interfaces_gre_edit.php:229
+#: usr/local/www/interfaces_groups_edit.php:322
+#: usr/local/www/firewall_aliases_edit.php:686
+#: usr/local/www/firewall_nat_1to1_edit.php:459
+#: usr/local/www/firewall_nat_edit.php:846
+#: usr/local/www/firewall_nat_out.php:320
+#: usr/local/www/firewall_nat_out_edit.php:649
+#: usr/local/www/firewall_rules_edit.php:1065
+#: usr/local/www/firewall_rules_edit.php:1480
+#: usr/local/www/firewall_schedule_edit.php:1156
+#: usr/local/www/firewall_shaper.php:349 usr/local/www/interfaces.php:2443
+#: usr/local/www/interfaces_assign.php:501 usr/local/www/diag_smart.php:219
+#: usr/local/www/system.php:447 usr/local/www/interfaces_vlan_edit.php:189
+#: usr/local/www/system_firmware_settings.php:238
+#: usr/local/www/system_routes_edit.php:275 usr/local/www/vpn_ipsec.php:168
+#: usr/local/www/vpn_ipsec_keys_edit.php:144
+#: usr/local/www/vpn_ipsec_mobile.php:608
+#: usr/local/www/interfaces_lagg_edit.php:218
+#: usr/local/www/interfaces_ppps_edit.php:783
+#: usr/local/www/interfaces_qinq_edit.php:394
+#: usr/local/www/interfaces_wireless_edit.php:195
+#: usr/local/www/load_balancer_monitor_edit.php:356
+#: usr/local/www/load_balancer_pool_edit.php:311 usr/local/www/edit.php:181
+#: usr/local/www/services_captiveportal.php:923
+#: usr/local/www/services_captiveportal_ip_edit.php:231
+#: usr/local/www/services_captiveportal_mac_edit.php:203
+#: usr/local/www/services_dhcp.php:871
+#: usr/local/www/services_dhcp_edit.php:251
+#: usr/local/www/services_dhcp_relay.php:189
+#: usr/local/www/services_dnsmasq.php:209
+#: usr/local/www/services_dnsmasq_edit.php:172 usr/local/www/vpn_pptp.php:472
+#: usr/local/www/vpn_pptp_users_edit.php:168
+#: usr/local/www/load_balancer_relay_action_edit.php:557
+#: usr/local/www/load_balancer_relay_protocol_edit.php:280
+#: usr/local/www/pkg_mgr_settings.php:120
+#: usr/local/www/services_captiveportal_hostname_edit.php:203
+#: usr/local/www/services_captiveportal_vouchers.php:597
+#: usr/local/www/services_captiveportal_vouchers_edit.php:207
+#: usr/local/www/status_rrd_graph_settings.php:225
+#: usr/local/www/services_dyndns_edit.php:236
+#: usr/local/www/services_igmpproxy.php:155
+#: usr/local/www/services_igmpproxy_edit.php:280
+#: usr/local/www/services_rfc2136_edit.php:200
+#: usr/local/www/status_lb_pool.php:217
+#: usr/local/www/system_advanced_admin.php:535
+#: usr/local/www/system_advanced_firewall.php:416
+#: usr/local/www/system_advanced_misc.php:442
+#: usr/local/www/system_advanced_network.php:304
+#: usr/local/www/system_advanced_notifications.php:93
+#: usr/local/www/system_advanced_notifications.php:254
+#: usr/local/www/system_advanced_sysctl.php:104
+#: usr/local/www/system_advanced_sysctl.php:257
+#: usr/local/www/system_authservers.php:724
+#: usr/local/www/system_camanager.php:359
+#: usr/local/www/system_camanager.php:552
+#: usr/local/www/system_certmanager.php:155
+#: usr/local/www/system_certmanager.php:469
+#: usr/local/www/system_certmanager.php:787
+#: usr/local/www/system_crlmanager.php:294
+#: usr/local/www/system_crlmanager.php:387
+#: usr/local/www/system_gateway_groups_edit.php:228
+#: usr/local/www/system_gateways_edit.php:492
+#: usr/local/www/system_groupmanager.php:390
+#: usr/local/www/system_groupmanager_addprivs.php:224
+#: usr/local/www/system_usermanager.php:774
+#: usr/local/www/system_usermanager_addprivs.php:205
+#: usr/local/www/system_usermanager_passwordmg.php:119
+#: usr/local/www/system_usermanager_settings.php:161
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:124
+#: usr/local/www/vpn_ipsec_phase1.php:855
+#: usr/local/www/vpn_ipsec_phase2.php:648 usr/local/www/vpn_l2tp.php:445
+#: usr/local/www/vpn_l2tp_users_edit.php:176
+#: usr/local/www/vpn_openvpn_client.php:845
+#: usr/local/www/vpn_openvpn_csc.php:658
+#: usr/local/www/vpn_openvpn_server.php:1433
+#: usr/local/www/vpn_pppoe_edit.php:589
+#: usr/local/www/firewall_nat_npt_edit.php:270
+#: usr/local/www/services_dhcpv6.php:784
+#: usr/local/www/services_dhcpv6_edit.php:228
+#: usr/local/www/services_dhcpv6_relay.php:190
+#: usr/local/www/system_routes_edit.php:315
+#: usr/local/www/services_unbound_acls.php:101
+#: usr/local/www/services_unbound_acls.php:306
+#: usr/local/www/diag_logs_settings.php:328
+#: usr/local/www/system_gateway_groups_edit.php:283
+#: usr/local/www/services_captiveportal_vouchers.php:604
+#: usr/local/www/services_dyndns_edit.php:366
+#: usr/local/www/firewall_nat_out.php:330
+#: usr/local/www/services_dnsmasq_edit.php:284
+#: usr/local/www/firewall_nat_1to1_edit.php:466
+#: usr/local/www/services_dhcpv6_edit.php:237
+#: usr/local/www/firewall_nat_npt_edit.php:275
+#: usr/local/www/load_balancer_setting.php:161
+#: usr/local/www/status_rrd_graph_settings.php:226
+#: usr/local/www/pkg_edit.php:413 usr/local/www/firewall_nat_out_edit.php:662
+#: usr/local/www/system_certmanager.php:183
+#: usr/local/www/system_certmanager.php:568
+#: usr/local/www/system_certmanager.php:953
+#: usr/local/www/load_balancer_relay_action_edit.php:556
+#: usr/local/www/firewall_rules_edit.php:1100
+#: usr/local/www/firewall_rules_edit.php:1551
+#: usr/local/www/services_unbound.php:245
+#: usr/local/www/system_usermanager.php:772
+#: usr/local/www/services_igmpproxy_edit.php:282
+#: usr/local/www/system_advanced_firewall.php:475
+#: usr/local/www/firewall_aliases_edit.php:691
+#: usr/local/www/system_advanced_notifications.php:96
+#: usr/local/www/system_advanced_notifications.php:281
+#: usr/local/www/system_advanced_misc.php:485
+#: usr/local/www/firewall_shaper_vinterface.php:317
+#: usr/local/www/system_groupmanager_addprivs.php:222
+#: usr/local/www/edit.php:184 usr/local/www/services_captiveportal.php:968
+#: usr/local/www/system_gateways_edit.php:527
+#: usr/local/www/vpn_openvpn_server.php:1575
+#: usr/local/www/services_dhcp.php:909 usr/local/www/services_ntpd.php:121
+#: usr/local/www/interfaces_bridge_edit.php:592
+#: usr/local/www/system_camanager.php:553
+#: usr/local/www/vpn_ipsec_phase2.php:674
+#: usr/local/www/firewall_nat_edit.php:854
+#: usr/local/www/services_dhcp_edit.php:260 usr/local/www/interfaces.php:2644
+#: usr/local/www/vpn_openvpn_client.php:850
+#: usr/local/www/load_balancer_pool_edit.php:328
+#: usr/local/www/firewall_virtual_ip_edit.php:534
+#: usr/local/www/services_snmp.php:414 usr/local/www/system.php:476
+#: usr/local/www/interfaces_gre_edit.php:228
+#: usr/local/www/vpn_ipsec_phase1.php:868 usr/local/www/diag_nanobsd.php:218
+#: usr/local/www/services_dhcpv6.php:574 usr/local/www/services_dhcpv6.php:879
+#: usr/local/www/vpn_pppoe_edit.php:590
+#: usr/local/www/system_routes_edit.php:316
+#: usr/local/www/diag_logs_settings.php:348
+#: usr/local/www/system_gateway_groups_edit.php:343
+#: usr/local/www/interfaces_vlan_edit.php:190
+#: usr/local/www/services_dnsmasq.php:210
+#: usr/local/www/services_captiveportal_vouchers.php:618
+#: usr/local/www/firewall_nat_out.php:331
+#: usr/local/www/services_dnsmasq_edit.php:285
+#: usr/local/www/load_balancer_relay_protocol_edit.php:278
+#: usr/local/www/services_captiveportal_vouchers_edit.php:205
+#: usr/local/www/firewall_nat_1to1_edit.php:464
+#: usr/local/www/services_dhcpv6_edit.php:239
+#: usr/local/www/services_router_advertisements.php:400
+#: usr/local/www/firewall_nat_npt_edit.php:274
+#: usr/local/www/load_balancer_setting.php:160 usr/local/www/vpn_ipsec.php:167
+#: usr/local/www/services_dhcp_relay.php:190
+#: usr/local/www/services_captiveportal_hostname_edit.php:201
+#: usr/local/www/vpn_ipsec_mobile.php:657 usr/local/www/pkg_edit.php:416
+#: usr/local/www/interfaces_qinq_edit.php:395
+#: usr/local/www/interfaces_gif_edit.php:219
+#: usr/local/www/firewall_shaper.php:350
+#: usr/local/www/load_balancer_relay_action_edit.php:554
+#: usr/local/www/load_balancer_monitor_edit.php:354
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:160
+#: usr/local/www/services_captiveportal_mac_edit.php:201
+#: usr/local/www/firewall_schedule_edit.php:1155
+#: usr/local/www/interfaces_ppps_edit.php:784
+#: usr/local/www/system_crlmanager.php:295
+#: usr/local/www/system_crlmanager.php:388
+#: usr/local/www/system_crlmanager.php:420
+#: usr/local/www/firewall_aliases_edit.php:694 usr/local/www/vpn_pptp.php:474
+#: usr/local/www/interfaces_lagg_edit.php:219
+#: usr/local/www/vpn_openvpn_csc.php:657
+#: usr/local/www/system_advanced_misc.php:534
+#: usr/local/www/firewall_shaper_vinterface.php:319
+#: usr/local/www/services_captiveportal.php:964
+#: usr/local/www/system_gateways_edit.php:627
+#: usr/local/www/services_dhcpv6_relay.php:191
+#: usr/local/www/system_usermanager_passwordmg.php:120
+#: usr/local/www/interfaces_assign.php:495
+#: usr/local/www/services_captiveportal_ip_edit.php:229
+#: usr/local/www/vpn_openvpn_server.php:1616
+#: usr/local/www/services_dhcp.php:1113
+#: usr/local/www/system_firmware_settings.php:251
+#: usr/local/www/services_ntpd.php:151
+#: usr/local/www/interfaces_bridge_edit.php:593
+#: usr/local/www/interfaces_groups_edit.php:323
+#: usr/local/www/vpn_ipsec_phase2.php:770
+#: usr/local/www/firewall_nat_edit.php:853
+#: usr/local/www/vpn_pptp_users_edit.php:169
+#: usr/local/www/vpn_ipsec_keys_edit.php:143
+#: usr/local/www/services_dhcp_edit.php:262 usr/local/www/interfaces.php:2632
+#: usr/local/www/vpn_openvpn_client.php:903
+#: usr/local/www/load_balancer_pool_edit.php:326
+#: usr/local/www/vpn_l2tp_users_edit.php:177 usr/local/www/vpn_l2tp.php:446
+#: usr/local/www/firewall_virtual_ip_edit.php:479
+#: usr/local/www/services_snmp.php:415 usr/local/www/system.php:469
+#: usr/local/www/vpn_ipsec_phase1.php:865 usr/local/www/diag_nanobsd.php:209
+#: usr/local/www/diag_nanobsd.php:277 usr/local/www/services_dhcpv6.php:810
+#: usr/local/www/system_authservers.php:729 usr/local/www/vpn_l2tp.php:449
+#: usr/local/www/system_gateways_edit.php:632
+#: usr/local/www/system_camanager.php:366
+#: usr/local/www/system_camanager.php:577
+#: usr/local/www/services_captiveportal_ip_edit.php:223
+#: usr/local/www/interfaces_wireless_edit.php:197
+#: usr/local/www/vpn_openvpn_client.php:922
+#: usr/local/www/services_dhcpv6_edit.php:242
+#: usr/local/www/services_dyndns_edit.php:370
+#: usr/local/www/firewall_rules_edit.php:1115
+#: usr/local/www/firewall_rules_edit.php:1566
+#: usr/local/www/interfaces_vlan_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:790 usr/local/www/vpn_ipsec.php:173
+#: usr/local/www/system_firmware_settings.php:260
+#: usr/local/www/interfaces_lagg_edit.php:232
+#: usr/local/www/firewall_nat_edit.php:849
+#: usr/local/www/interfaces_gif_edit.php:230
+#: usr/local/www/services_dhcp_edit.php:494
+#: usr/local/www/firewall_virtual_ip_edit.php:471
+#: usr/local/www/diag_smart.php:240
+#: usr/local/www/services_captiveportal_vouchers.php:627
+#: usr/local/www/vpn_pppoe_edit.php:593 usr/local/www/services_dhcp.php:1126
+#: usr/local/www/system_certmanager.php:186
+#: usr/local/www/system_certmanager.php:577
+#: usr/local/www/system_certmanager.php:995
+#: usr/local/www/system_advanced_misc.php:546
+#: usr/local/www/services_captiveportal_mac_edit.php:214
+#: usr/local/www/services_dhcpv6.php:827
+#: usr/local/www/system_usermanager_passwordmg.php:125
+#: usr/local/www/system_authservers.php:745
+#: usr/local/www/system_advanced_firewall.php:537
+#: usr/local/www/services_captiveportal.php:966 usr/local/www/vpn_pptp.php:477
+#: usr/local/www/pkg_edit.php:420 usr/local/www/edit.php:185
+#: usr/local/www/interfaces_bridge_edit.php:594
+#: usr/local/www/services_dnsmasq.php:235
+#: usr/local/www/vpn_ipsec_phase1.php:886
+#: usr/local/www/firewall_nat_out_edit.php:664
+#: usr/local/www/vpn_openvpn_server.php:1668
+#: usr/local/www/vpn_ipsec_phase2.php:791 usr/local/www/services_snmp.php:430
+#: usr/local/www/interfaces_qinq_edit.php:398
+#: usr/local/www/interfaces.php:2664
+#: usr/local/www/firewall_shaper_layer7.php:565
+#: usr/local/www/services_router_advertisements.php:395
+#: usr/local/www/system_gateways_edit.php:634
+#: usr/local/www/services_dyndns_edit.php:378
+#: usr/local/www/firewall_rules_edit.php:1128
+#: usr/local/www/firewall_rules_edit.php:1602
+#: usr/local/www/system_firmware_settings.php:266 usr/local/www/system.php:467
+#: usr/local/www/firewall_nat_edit.php:889
+#: usr/local/www/firewall_virtual_ip_edit.php:491
+#: usr/local/www/services_dhcp.php:1146
+#: usr/local/www/system_certmanager.php:578
+#: usr/local/www/system_certmanager.php:999
+#: usr/local/www/system_advanced_misc.php:667
+#: usr/local/www/system_routes_edit.php:339
+#: usr/local/www/firewall_nat_out.php:338
+#: usr/local/www/system_gateway_groups_edit.php:344
+#: usr/local/www/system_advanced_firewall.php:538
+#: usr/local/www/services_captiveportal.php:982
+#: usr/local/www/firewall_aliases_edit.php:725
+#: usr/local/www/pkg_mgr_settings.php:123
+#: usr/local/www/system_usermanager_settings.php:164
+#: usr/local/www/services_dnsmasq.php:248
+#: usr/local/www/system_advanced_network.php:305
+#: usr/local/www/firewall_nat_out_edit.php:704
+#: usr/local/www/diag_nanobsd.php:200 usr/local/www/interfaces.php:2710
+#: usr/local/www/system_gateways_edit.php:664
+#: usr/local/www/firewall_rules_edit.php:1127
+#: usr/local/www/firewall_rules_edit.php:1613
+#: usr/local/www/interfaces_ppps_edit.php:787
+#: usr/local/www/interfaces_lagg_edit.php:231
+#: usr/local/www/firewall_nat_edit.php:890
+#: usr/local/www/system_routes_edit.php:349
+#: usr/local/www/firewall_nat_out.php:337
+#: usr/local/www/interfaces_groups_edit.php:320 usr/local/www/pkg_edit.php:422
+#: usr/local/www/interfaces_bridge_edit.php:598
+#: usr/local/www/services_dnsmasq.php:312 usr/local/www/interfaces.php:2699
+#: usr/local/www/system_gateways_edit.php:665
+#: usr/local/www/services_captiveportal_vouchers.php:632
+#: usr/local/www/system_routes_edit.php:351
+#: usr/local/www/system_groupmanager.php:393
+#: usr/local/www/diag_logs_settings.php:379
+#: usr/local/www/services_dyndns_edit.php:379
+#: usr/local/www/firewall_rules_edit.php:1175
+#: usr/local/www/firewall_rules_edit.php:1661
+#: usr/local/www/firewall_virtual_ip_edit.php:496
+#: usr/local/www/services_dhcp.php:1158
+#: usr/local/www/system_advanced_admin.php:572
+#: usr/local/www/system_advanced_misc.php:685
+#: usr/local/www/system_authservers.php:787
+#: usr/local/www/system_advanced_firewall.php:559
+#: usr/local/www/firewall_aliases_edit.php:724
+#: usr/local/www/system_advanced_notifications.php:98
+#: usr/local/www/system_advanced_notifications.php:328
+#: usr/local/www/services_rfc2136_edit.php:212
+#: usr/local/www/interfaces.php:2735
+msgid "Save"
+msgstr "Salvar"
+
+#: usr/local/www/pkg_edit.php:415 usr/local/www/firewall_rules_edit.php:1077
+#: usr/local/www/pkg_edit.php:424 usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/pkg_edit.php:427 usr/local/www/firewall_rules_edit.php:1127
+#: usr/local/www/pkg_edit.php:431 usr/local/www/firewall_rules_edit.php:1140
+#: usr/local/www/firewall_rules_edit.php:1139 usr/local/www/pkg_edit.php:433
+#: usr/local/www/firewall_rules_edit.php:1187
+msgid "Advanced features"
+msgstr "Recursos avançados"
+
+#: usr/local/www/pkg_edit.php:817 usr/local/www/firewall_shaper_layer7.php:65
+#: usr/local/www/diag_packet_capture.php:203 usr/local/www/vpn_ipsec.php:422
+#: usr/local/www/interfaces_wireless.php:133 usr/local/www/vpn_pptp.php:477
+#: usr/local/www/status_graph.php:291 usr/local/www/carp_status.php:194
+#: usr/local/www/status_queues.php:172 usr/local/www/status_graph_cpu.php:53
+#: usr/local/www/vpn_pppoe_edit.php:595 usr/local/www/vpn_ipsec.php:433
+#: usr/local/www/status_graph.php:286 usr/local/www/pkg_edit.php:864
+#: usr/local/www/status_queues.php:180
+#: usr/local/www/diag_packet_capture.php:223
+#: usr/local/www/vpn_pppoe_edit.php:596 usr/local/www/carp_status.php:187
+#: usr/local/www/vpn_ipsec.php:432 usr/local/www/status_graph.php:297
+#: usr/local/www/pkg_edit.php:873 usr/local/www/status_queues.php:181
+#: usr/local/www/vpn_pptp.php:479 usr/local/www/interfaces_wireless.php:134
+#: usr/local/www/diag_packet_capture.php:270 usr/local/www/vpn_ipsec.php:438
+#: usr/local/www/status_graph.php:308
+#: usr/local/www/interfaces_wireless.php:136
+#: usr/local/www/vpn_pppoe_edit.php:599 usr/local/www/vpn_pptp.php:482
+#: usr/local/www/pkg_edit.php:917 usr/local/www/status_queues.php:163
+#: usr/local/www/status_graph.php:330
+#: usr/local/www/diag_packet_capture.php:208
+#: usr/local/www/diag_packet_capture.php:288 usr/local/www/pkg_edit.php:921
+#: usr/local/www/status_queues.php:185
+msgid "Note"
+msgstr "Nota"
+
+#: usr/local/www/pkg_edit.php:823 usr/local/www/pkg_edit.php:835
+#: usr/local/www/firewall_aliases_import.php:155
+#: usr/local/www/firewall_shaper_layer7.php:573
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:130
+#: usr/local/www/firewall_virtual_ip_edit.php:546
+#: usr/local/www/services_wol_edit.php:157
+#: usr/local/www/interfaces_bridge_edit.php:583
+#: usr/local/www/interfaces_gif_edit.php:218
+#: usr/local/www/interfaces_gre_edit.php:229
+#: usr/local/www/interfaces_groups_edit.php:323
+#: usr/local/www/firewall_aliases_edit.php:687
+#: usr/local/www/firewall_nat_1to1_edit.php:459
+#: usr/local/www/firewall_nat_edit.php:846
+#: usr/local/www/firewall_nat_out_edit.php:649
+#: usr/local/www/firewall_rules_edit.php:1065
+#: usr/local/www/firewall_rules_edit.php:1480
+#: usr/local/www/firewall_schedule_edit.php:1157
+#: usr/local/www/interfaces.php:1443 usr/local/www/interfaces.php:1549
+#: usr/local/www/interfaces.php:2444
+#: usr/local/www/interfaces_vlan_edit.php:189
+#: usr/local/www/system_routes_edit.php:255
+#: usr/local/www/system_routes_edit.php:275
+#: usr/local/www/interfaces_lagg_edit.php:218
+#: usr/local/www/interfaces_ppps_edit.php:784
+#: usr/local/www/interfaces_qinq_edit.php:395
+#: usr/local/www/interfaces_wireless_edit.php:195
+#: usr/local/www/load_balancer_monitor_edit.php:356
+#: usr/local/www/load_balancer_pool_edit.php:312
+#: usr/local/www/load_balancer_virtual_server_edit.php:280
+#: usr/local/www/services_captiveportal.php:924
+#: usr/local/www/services_dhcp_edit.php:251
+#: usr/local/www/services_dnsmasq_edit.php:172
+#: usr/local/www/load_balancer_relay_action_edit.php:557
+#: usr/local/www/load_balancer_relay_protocol_edit.php:280
+#: usr/local/www/services_captiveportal_vouchers.php:598
+#: usr/local/www/services_dyndns_edit.php:237
+#: usr/local/www/services_igmpproxy_edit.php:281
+#: usr/local/www/services_rfc2136_edit.php:201
+#: usr/local/www/system_advanced_sysctl.php:258
+#: usr/local/www/system_gateway_groups_edit.php:228
+#: usr/local/www/system_gateways_edit.php:492
+#: usr/local/www/system_groupmanager_addprivs.php:225
+#: usr/local/www/system_usermanager_addprivs.php:206
+#: usr/local/www/vpn_l2tp_users_edit.php:177
+#: usr/local/www/vpn_pppoe_edit.php:590
+#: usr/local/www/firewall_nat_npt_edit.php:270
+#: usr/local/www/services_dhcpv6_edit.php:228
+#: usr/local/www/system_routes_edit.php:287
+#: usr/local/www/system_routes_edit.php:315
+#: usr/local/www/services_unbound_acls.php:306
+#: usr/local/www/system_gateway_groups_edit.php:283
+#: usr/local/www/services_captiveportal_vouchers.php:605
+#: usr/local/www/services_dyndns_edit.php:367
+#: usr/local/www/services_dnsmasq_edit.php:284
+#: usr/local/www/firewall_nat_1to1_edit.php:466
+#: usr/local/www/services_dhcpv6_edit.php:237
+#: usr/local/www/firewall_nat_npt_edit.php:275 usr/local/www/pkg_edit.php:870
+#: usr/local/www/firewall_nat_out_edit.php:662
+#: usr/local/www/load_balancer_relay_action_edit.php:556
+#: usr/local/www/firewall_rules_edit.php:1100
+#: usr/local/www/firewall_rules_edit.php:1551
+#: usr/local/www/services_igmpproxy_edit.php:283
+#: usr/local/www/firewall_aliases_edit.php:692
+#: usr/local/www/system_groupmanager_addprivs.php:223
+#: usr/local/www/services_captiveportal.php:969
+#: usr/local/www/system_gateways_edit.php:527
+#: usr/local/www/load_balancer_virtual_server_edit.php:269
+#: usr/local/www/interfaces_bridge_edit.php:592
+#: usr/local/www/firewall_nat_edit.php:854
+#: usr/local/www/services_dhcp_edit.php:260 usr/local/www/interfaces.php:1655
+#: usr/local/www/interfaces.php:2645
+#: usr/local/www/load_balancer_pool_edit.php:329
+#: usr/local/www/firewall_virtual_ip_edit.php:534
+#: usr/local/www/interfaces_gre_edit.php:228
+#: usr/local/www/vpn_pppoe_edit.php:591
+#: usr/local/www/system_routes_edit.php:288
+#: usr/local/www/system_routes_edit.php:316
+#: usr/local/www/system_gateway_groups_edit.php:343
+#: usr/local/www/interfaces_vlan_edit.php:190
+#: usr/local/www/services_captiveportal_vouchers.php:619
+#: usr/local/www/services_dnsmasq_edit.php:285
+#: usr/local/www/load_balancer_relay_protocol_edit.php:278
+#: usr/local/www/firewall_nat_1to1_edit.php:464
+#: usr/local/www/services_dhcpv6_edit.php:239
+#: usr/local/www/firewall_nat_npt_edit.php:274 usr/local/www/pkg_edit.php:879
+#: usr/local/www/interfaces_qinq_edit.php:396
+#: usr/local/www/interfaces_gif_edit.php:219
+#: usr/local/www/load_balancer_relay_action_edit.php:554
+#: usr/local/www/load_balancer_monitor_edit.php:354
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:160
+#: usr/local/www/firewall_schedule_edit.php:1156
+#: usr/local/www/interfaces_ppps_edit.php:785
+#: usr/local/www/firewall_aliases_edit.php:695
+#: usr/local/www/interfaces_lagg_edit.php:219
+#: usr/local/www/services_captiveportal.php:965
+#: usr/local/www/system_gateways_edit.php:627
+#: usr/local/www/load_balancer_virtual_server_edit.php:267
+#: usr/local/www/interfaces_bridge_edit.php:593
+#: usr/local/www/interfaces_groups_edit.php:324
+#: usr/local/www/firewall_nat_edit.php:853
+#: usr/local/www/services_dhcp_edit.php:262 usr/local/www/interfaces.php:1537
+#: usr/local/www/interfaces.php:1643 usr/local/www/interfaces.php:2633
+#: usr/local/www/load_balancer_pool_edit.php:327
+#: usr/local/www/vpn_l2tp_users_edit.php:178
+#: usr/local/www/firewall_virtual_ip_edit.php:479
+#: usr/local/www/system_gateways_edit.php:632
+#: usr/local/www/interfaces_wireless_edit.php:197
+#: usr/local/www/services_dhcpv6_edit.php:242
+#: usr/local/www/services_dyndns_edit.php:371
+#: usr/local/www/firewall_rules_edit.php:1115
+#: usr/local/www/firewall_rules_edit.php:1566
+#: usr/local/www/interfaces_vlan_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:791
+#: usr/local/www/interfaces_lagg_edit.php:232
+#: usr/local/www/firewall_nat_edit.php:849
+#: usr/local/www/interfaces_gif_edit.php:230
+#: usr/local/www/services_dhcp_edit.php:494
+#: usr/local/www/firewall_virtual_ip_edit.php:471
+#: usr/local/www/services_captiveportal_vouchers.php:628
+#: usr/local/www/vpn_pppoe_edit.php:594
+#: usr/local/www/services_captiveportal.php:967 usr/local/www/pkg_edit.php:923
+#: usr/local/www/interfaces_bridge_edit.php:594
+#: usr/local/www/firewall_nat_out_edit.php:664
+#: usr/local/www/interfaces_qinq_edit.php:399
+#: usr/local/www/interfaces.php:1547 usr/local/www/interfaces.php:1652
+#: usr/local/www/interfaces.php:2665
+#: usr/local/www/firewall_shaper_layer7.php:568
+#: usr/local/www/system_gateways_edit.php:634
+#: usr/local/www/services_dyndns_edit.php:379
+#: usr/local/www/firewall_rules_edit.php:1128
+#: usr/local/www/firewall_rules_edit.php:1602
+#: usr/local/www/firewall_nat_edit.php:889
+#: usr/local/www/firewall_virtual_ip_edit.php:491
+#: usr/local/www/system_routes_edit.php:313
+#: usr/local/www/system_routes_edit.php:339
+#: usr/local/www/system_gateway_groups_edit.php:344
+#: usr/local/www/services_captiveportal.php:983
+#: usr/local/www/firewall_aliases_edit.php:726
+#: usr/local/www/firewall_nat_out_edit.php:704
+#: usr/local/www/interfaces.php:1592 usr/local/www/interfaces.php:1698
+#: usr/local/www/interfaces.php:2711
+#: usr/local/www/system_gateways_edit.php:664
+#: usr/local/www/firewall_rules_edit.php:1127
+#: usr/local/www/firewall_rules_edit.php:1613
+#: usr/local/www/interfaces_ppps_edit.php:788
+#: usr/local/www/interfaces_lagg_edit.php:231
+#: usr/local/www/firewall_nat_edit.php:890
+#: usr/local/www/system_routes_edit.php:319
+#: usr/local/www/system_routes_edit.php:349
+#: usr/local/www/interfaces_groups_edit.php:321 usr/local/www/pkg_edit.php:927
+#: usr/local/www/interfaces_bridge_edit.php:598
+#: usr/local/www/interfaces.php:1586 usr/local/www/interfaces.php:1691
+#: usr/local/www/interfaces.php:2700
+#: usr/local/www/system_gateways_edit.php:665
+#: usr/local/www/services_captiveportal_vouchers.php:633
+#: usr/local/www/system_routes_edit.php:321
+#: usr/local/www/system_routes_edit.php:351
+#: usr/local/www/services_dyndns_edit.php:380
+#: usr/local/www/firewall_rules_edit.php:1175
+#: usr/local/www/firewall_rules_edit.php:1661
+#: usr/local/www/firewall_virtual_ip_edit.php:496
+#: usr/local/www/firewall_aliases_edit.php:725
+#: usr/local/www/services_rfc2136_edit.php:213
+#: usr/local/www/interfaces.php:1599 usr/local/www/interfaces.php:1704
+#: usr/local/www/interfaces.php:2736
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: usr/local/www/pkg_edit.php:1037 usr/local/www/firewall_nat_edit.php:531
+#: usr/local/www/firewall_rules_edit.php:908
+#: usr/local/www/firewall_rules_edit.php:1083
+#: usr/local/www/firewall_rules_edit.php:1117
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1175
+#: usr/local/www/firewall_rules_edit.php:1217
+#: usr/local/www/firewall_rules_edit.php:1241
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1291
+#: usr/local/www/firewall_rules_edit.php:1342
+#: usr/local/www/firewall_rules_edit.php:1392
+#: usr/local/www/firewall_rules_edit.php:1446
+#: usr/local/www/interfaces.php:1330 usr/local/www/interfaces.php:1940
+#: usr/local/www/services_dhcp.php:725 usr/local/www/services_dhcp.php:741
+#: usr/local/www/services_dhcp.php:753 usr/local/www/services_dhcp.php:765
+#: usr/local/www/services_dhcp.php:777 usr/local/www/services_dhcp.php:799
+#: usr/local/www/services_dnsmasq.php:194
+#: usr/local/www/services_dnsmasq.php:197
+#: usr/local/www/services_dnsmasq.php:200 usr/local/www/fbegin.inc:83
+#: usr/local/www/system_gateways_edit.php:415
+#: usr/local/www/vpn_openvpn_client.php:829
+#: usr/local/www/vpn_openvpn_csc.php:642
+#: usr/local/www/vpn_openvpn_server.php:1412
+#: usr/local/www/services_dhcpv6.php:651 usr/local/www/services_dhcpv6.php:667
+#: usr/local/www/services_dhcpv6.php:679 usr/local/www/services_dhcpv6.php:691
+#: usr/local/www/services_dhcpv6.php:703 usr/local/www/services_dhcpv6.php:725
+#: usr/local/www/fbegin.inc:99 usr/local/www/pkg_edit.php:1052
+#: usr/local/www/firewall_rules_edit.php:943
+#: usr/local/www/firewall_rules_edit.php:1118
+#: usr/local/www/firewall_rules_edit.php:1152
+#: usr/local/www/firewall_rules_edit.php:1168
+#: usr/local/www/firewall_rules_edit.php:1210
+#: usr/local/www/firewall_rules_edit.php:1252
+#: usr/local/www/firewall_rules_edit.php:1276
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1331
+#: usr/local/www/firewall_rules_edit.php:1358
+#: usr/local/www/firewall_rules_edit.php:1413
+#: usr/local/www/firewall_rules_edit.php:1463
+#: usr/local/www/firewall_rules_edit.php:1517
+#: usr/local/www/services_unbound_advanced.php:88
+#: usr/local/www/system_gateways_edit.php:436
+#: usr/local/www/vpn_openvpn_server.php:1554
+#: usr/local/www/services_dhcp.php:763 usr/local/www/services_dhcp.php:779
+#: usr/local/www/services_dhcp.php:791 usr/local/www/services_dhcp.php:803
+#: usr/local/www/services_dhcp.php:815 usr/local/www/services_dhcp.php:837
+#: usr/local/www/firewall_nat_edit.php:538 usr/local/www/interfaces.php:1434
+#: usr/local/www/interfaces.php:2118 usr/local/www/vpn_openvpn_client.php:834
+#: usr/local/www/services_dhcpv6.php:744 usr/local/www/services_dhcpv6.php:760
+#: usr/local/www/services_dhcpv6.php:773 usr/local/www/services_dhcpv6.php:786
+#: usr/local/www/services_dhcpv6.php:798 usr/local/www/services_dhcpv6.php:820
+#: usr/local/www/services_dnsmasq.php:195
+#: usr/local/www/services_dnsmasq.php:198
+#: usr/local/www/services_dnsmasq.php:201 usr/local/www/fbegin.inc:108
+#: usr/local/www/pkg_edit.php:1063 usr/local/www/vpn_openvpn_csc.php:641
+#: usr/local/www/system_gateways_edit.php:542
+#: usr/local/www/vpn_openvpn_server.php:1596
+#: usr/local/www/services_dhcp.php:945 usr/local/www/services_dhcp.php:961
+#: usr/local/www/services_dhcp.php:975 usr/local/www/services_dhcp.php:987
+#: usr/local/www/services_dhcp.php:999 usr/local/www/services_dhcp.php:1011
+#: usr/local/www/services_dhcp.php:1034
+#: usr/local/www/firewall_nat_edit.php:537 usr/local/www/interfaces.php:1422
+#: usr/local/www/interfaces.php:2106 usr/local/www/vpn_openvpn_client.php:883
+#: usr/local/www/services_dhcpv6.php:675 usr/local/www/services_dhcpv6.php:704
+#: usr/local/www/services_dhcpv6.php:717 usr/local/www/services_dhcpv6.php:729
+#: usr/local/www/services_dhcpv6.php:751
+#: usr/local/www/system_gateways_edit.php:546
+#: usr/local/www/vpn_openvpn_client.php:902
+#: usr/local/www/firewall_rules_edit.php:952
+#: usr/local/www/firewall_rules_edit.php:1167
+#: usr/local/www/firewall_rules_edit.php:1183
+#: usr/local/www/firewall_rules_edit.php:1225
+#: usr/local/www/firewall_rules_edit.php:1267
+#: usr/local/www/firewall_rules_edit.php:1303
+#: usr/local/www/firewall_rules_edit.php:1346
+#: usr/local/www/firewall_rules_edit.php:1373
+#: usr/local/www/firewall_rules_edit.php:1428
+#: usr/local/www/firewall_rules_edit.php:1478
+#: usr/local/www/firewall_rules_edit.php:1532
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/services_dhcp_edit.php:454
+#: usr/local/www/services_dhcp_edit.php:470
+#: usr/local/www/services_dhcp_edit.php:482
+#: usr/local/www/services_dhcp.php:958 usr/local/www/services_dhcp.php:974
+#: usr/local/www/services_dhcp.php:988 usr/local/www/services_dhcp.php:1000
+#: usr/local/www/services_dhcp.php:1012 usr/local/www/services_dhcp.php:1024
+#: usr/local/www/services_dhcp.php:1047 usr/local/www/services_dhcpv6.php:692
+#: usr/local/www/services_dhcpv6.php:708 usr/local/www/services_dhcpv6.php:721
+#: usr/local/www/services_dhcpv6.php:734 usr/local/www/services_dhcpv6.php:746
+#: usr/local/www/services_dhcpv6.php:768 usr/local/www/pkg_edit.php:1107
+#: usr/local/www/fbegin.inc:100 usr/local/www/services_dnsmasq.php:220
+#: usr/local/www/services_dnsmasq.php:223
+#: usr/local/www/services_dnsmasq.php:226
+#: usr/local/www/vpn_openvpn_server.php:1648 usr/local/www/interfaces.php:1435
+#: usr/local/www/interfaces.php:2136
+#: usr/local/www/system_gateways_edit.php:548
+#: usr/local/www/firewall_rules_edit.php:964
+#: usr/local/www/firewall_rules_edit.php:1146
+#: usr/local/www/firewall_rules_edit.php:1180
+#: usr/local/www/firewall_rules_edit.php:1196
+#: usr/local/www/firewall_rules_edit.php:1236
+#: usr/local/www/firewall_rules_edit.php:1298
+#: usr/local/www/firewall_rules_edit.php:1310
+#: usr/local/www/firewall_rules_edit.php:1353
+#: usr/local/www/firewall_rules_edit.php:1380
+#: usr/local/www/firewall_rules_edit.php:1435
+#: usr/local/www/firewall_rules_edit.php:1485
+#: usr/local/www/firewall_rules_edit.php:1540
+#: usr/local/www/firewall_nat_edit.php:544 usr/local/www/services_dhcp.php:978
+#: usr/local/www/services_dhcp.php:994 usr/local/www/services_dhcp.php:1008
+#: usr/local/www/services_dhcp.php:1020 usr/local/www/services_dhcp.php:1032
+#: usr/local/www/services_dhcp.php:1044 usr/local/www/services_dhcp.php:1067
+#: usr/local/www/services_dnsmasq.php:233
+#: usr/local/www/services_dnsmasq.php:236
+#: usr/local/www/services_dnsmasq.php:239 usr/local/www/interfaces.php:1479
+#: usr/local/www/interfaces.php:2182
+#: usr/local/www/system_gateways_edit.php:578
+#: usr/local/www/firewall_rules_edit.php:963
+#: usr/local/www/firewall_rules_edit.php:1145
+#: usr/local/www/firewall_rules_edit.php:1179
+#: usr/local/www/firewall_rules_edit.php:1195
+#: usr/local/www/firewall_rules_edit.php:1235
+#: usr/local/www/firewall_rules_edit.php:1275
+#: usr/local/www/firewall_rules_edit.php:1297
+#: usr/local/www/firewall_rules_edit.php:1309
+#: usr/local/www/firewall_rules_edit.php:1364
+#: usr/local/www/firewall_rules_edit.php:1391
+#: usr/local/www/firewall_rules_edit.php:1496
+#: usr/local/www/firewall_rules_edit.php:1551
+#: usr/local/www/firewall_nat_edit.php:545 usr/local/www/pkg_edit.php:1114
+#: usr/local/www/services_dnsmasq.php:297
+#: usr/local/www/services_dnsmasq.php:300
+#: usr/local/www/services_dnsmasq.php:303 usr/local/www/interfaces.php:1474
+#: usr/local/www/interfaces.php:2171
+#: usr/local/www/firewall_rules_edit.php:1011
+#: usr/local/www/firewall_rules_edit.php:1193
+#: usr/local/www/firewall_rules_edit.php:1227
+#: usr/local/www/firewall_rules_edit.php:1243
+#: usr/local/www/firewall_rules_edit.php:1283
+#: usr/local/www/firewall_rules_edit.php:1323
+#: usr/local/www/firewall_rules_edit.php:1345
+#: usr/local/www/firewall_rules_edit.php:1357
+#: usr/local/www/firewall_rules_edit.php:1412
+#: usr/local/www/firewall_rules_edit.php:1439
+#: usr/local/www/firewall_rules_edit.php:1494
+#: usr/local/www/firewall_rules_edit.php:1544
+#: usr/local/www/firewall_rules_edit.php:1599
+#: usr/local/www/services_dhcp.php:990 usr/local/www/services_dhcp.php:1006
+#: usr/local/www/services_dhcp.php:1056 usr/local/www/services_dhcp.php:1079
+#: usr/local/www/interfaces.php:1487 usr/local/www/interfaces.php:2207
+msgid "Advanced"
+msgstr "Avançado"
+
+#: usr/local/www/pkg_edit.php:1037 usr/local/www/firewall_rules_edit.php:1083
+#: usr/local/www/firewall_rules_edit.php:1117
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1175
+#: usr/local/www/firewall_rules_edit.php:1217
+#: usr/local/www/firewall_rules_edit.php:1241
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1291
+#: usr/local/www/firewall_rules_edit.php:1342
+#: usr/local/www/firewall_rules_edit.php:1392
+#: usr/local/www/firewall_rules_edit.php:1446
+#: usr/local/www/interfaces.php:1330 usr/local/www/services_dnsmasq.php:197
+#: usr/local/www/pkg_edit.php:1052 usr/local/www/firewall_rules_edit.php:1118
+#: usr/local/www/firewall_rules_edit.php:1152
+#: usr/local/www/firewall_rules_edit.php:1168
+#: usr/local/www/firewall_rules_edit.php:1210
+#: usr/local/www/firewall_rules_edit.php:1252
+#: usr/local/www/firewall_rules_edit.php:1276
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1331
+#: usr/local/www/firewall_rules_edit.php:1358
+#: usr/local/www/firewall_rules_edit.php:1413
+#: usr/local/www/firewall_rules_edit.php:1463
+#: usr/local/www/firewall_rules_edit.php:1517
+#: usr/local/www/interfaces.php:1434 usr/local/www/services_dnsmasq.php:198
+#: usr/local/www/pkg_edit.php:1063 usr/local/www/interfaces.php:1422
+#: usr/local/www/firewall_rules_edit.php:1167
+#: usr/local/www/firewall_rules_edit.php:1183
+#: usr/local/www/firewall_rules_edit.php:1225
+#: usr/local/www/firewall_rules_edit.php:1267
+#: usr/local/www/firewall_rules_edit.php:1303
+#: usr/local/www/firewall_rules_edit.php:1346
+#: usr/local/www/firewall_rules_edit.php:1373
+#: usr/local/www/firewall_rules_edit.php:1428
+#: usr/local/www/firewall_rules_edit.php:1478
+#: usr/local/www/firewall_rules_edit.php:1532 usr/local/www/pkg_edit.php:1107
+#: usr/local/www/services_dnsmasq.php:223 usr/local/www/interfaces.php:1435
+#: usr/local/www/firewall_rules_edit.php:1146
+#: usr/local/www/firewall_rules_edit.php:1180
+#: usr/local/www/firewall_rules_edit.php:1196
+#: usr/local/www/firewall_rules_edit.php:1236
+#: usr/local/www/firewall_rules_edit.php:1298
+#: usr/local/www/firewall_rules_edit.php:1310
+#: usr/local/www/firewall_rules_edit.php:1353
+#: usr/local/www/firewall_rules_edit.php:1380
+#: usr/local/www/firewall_rules_edit.php:1435
+#: usr/local/www/firewall_rules_edit.php:1485
+#: usr/local/www/firewall_rules_edit.php:1540
+#: usr/local/www/services_dnsmasq.php:236 usr/local/www/interfaces.php:1479
+#: usr/local/www/firewall_rules_edit.php:1145
+#: usr/local/www/firewall_rules_edit.php:1179
+#: usr/local/www/firewall_rules_edit.php:1195
+#: usr/local/www/firewall_rules_edit.php:1235
+#: usr/local/www/firewall_rules_edit.php:1275
+#: usr/local/www/firewall_rules_edit.php:1297
+#: usr/local/www/firewall_rules_edit.php:1309
+#: usr/local/www/firewall_rules_edit.php:1364
+#: usr/local/www/firewall_rules_edit.php:1391
+#: usr/local/www/firewall_rules_edit.php:1496
+#: usr/local/www/firewall_rules_edit.php:1551 usr/local/www/pkg_edit.php:1114
+#: usr/local/www/services_dnsmasq.php:300 usr/local/www/interfaces.php:1474
+#: usr/local/www/firewall_rules_edit.php:1193
+#: usr/local/www/firewall_rules_edit.php:1227
+#: usr/local/www/firewall_rules_edit.php:1243
+#: usr/local/www/firewall_rules_edit.php:1283
+#: usr/local/www/firewall_rules_edit.php:1323
+#: usr/local/www/firewall_rules_edit.php:1345
+#: usr/local/www/firewall_rules_edit.php:1357
+#: usr/local/www/firewall_rules_edit.php:1412
+#: usr/local/www/firewall_rules_edit.php:1439
+#: usr/local/www/firewall_rules_edit.php:1494
+#: usr/local/www/firewall_rules_edit.php:1544
+#: usr/local/www/firewall_rules_edit.php:1599
+#: usr/local/www/interfaces.php:1487
+msgid "Show advanced option"
+msgstr "Mostrar opções avançadas"
+
+#: usr/local/www/pkg_mgr_installed.php:45
+#: usr/local/www/pkg_mgr_installed.php:63 usr/local/www/diag_logs.php:65
+#: usr/local/www/diag_logs.php:77 usr/local/www/diag_logs_auth.php:65
+#: usr/local/www/diag_logs_dhcp.php:70 usr/local/www/diag_logs_filter.php:101
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/diag_logs_ipsec.php:102 usr/local/www/diag_logs_ntpd.php:65
+#: usr/local/www/diag_logs_openvpn.php:69
+#: usr/local/www/diag_logs_settings.php:210
+#: usr/local/www/diag_logs_vpn.php:126 usr/local/www/diag_backup.php:117
+#: usr/local/www/system.php:74 usr/local/www/system.php:231
+#: usr/local/www/system.php:251 usr/local/www/system_firmware.php:102
+#: usr/local/www/system_firmware.php:203
+#: usr/local/www/system_firmware_check.php:49
+#: usr/local/www/system_firmware_settings.php:74
+#: usr/local/www/system_routes.php:94 usr/local/www/system_routes_edit.php:165
+#: usr/local/www/diag_logs_filter_summary.php:184
+#: usr/local/www/diag_logs_ppp.php:70 usr/local/www/diag_logs_relayd.php:66
+#: usr/local/www/pkg_mgr.php:49 usr/local/www/pkg_mgr.php:81
+#: usr/local/www/pkg_mgr_install.php:57 usr/local/www/pkg_mgr_settings.php:62
+#: usr/local/www/fbegin.inc:319 usr/local/www/fbegin.inc:440
+#: usr/local/www/status_rrd_graph.php:329
+#: usr/local/www/status_rrd_graph_img.php:41
+#: usr/local/www/status_rrd_graph_settings.php:53
+#: usr/local/www/status_rrd_graph_settings.php:128
+#: usr/local/www/system_advanced_admin.php:242
+#: usr/local/www/system_advanced_firewall.php:178
+#: usr/local/www/system_advanced_misc.php:179
+#: usr/local/www/system_advanced_network.php:148
+#: usr/local/www/system_advanced_notifications.php:131
+#: usr/local/www/system_advanced_sysctl.php:125
+#: usr/local/www/system_authservers.php:44
+#: usr/local/www/system_camanager.php:50
+#: usr/local/www/system_certmanager.php:51
+#: usr/local/www/system_crlmanager.php:46
+#: usr/local/www/system_gateway_groups.php:88
+#: usr/local/www/system_gateway_groups_edit.php:142
+#: usr/local/www/system_gateways.php:120
+#: usr/local/www/system_gateways_edit.php:313
+#: usr/local/www/system_groupmanager.php:49
+#: usr/local/www/system_groupmanager_addprivs.php:56
+#: usr/local/www/system_usermanager.php:54
+#: usr/local/www/system_usermanager_passwordmg.php:43
+#: usr/local/www/system_usermanager_settings.php:51
+#: usr/local/www/diag_logs_wireless.php:67
+#: usr/local/www/diag_logs_routing.php:65
+#: usr/local/www/system_routes_edit.php:198 usr/local/www/pkg_mgr.php:55
+#: usr/local/www/pkg_mgr.php:93 usr/local/www/diag_logs_settings.php:215
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/fbegin.inc:337 usr/local/www/fbegin.inc:458
+#: usr/local/www/status_rrd_graph_settings.php:129
+#: usr/local/www/system_certmanager.php:56 usr/local/www/diag_backup.php:195
+#: usr/local/www/diag_logs_resolver.php:78
+#: usr/local/www/system_advanced_firewall.php:192
+#: usr/local/www/pkg_mgr_installed.php:51
+#: usr/local/www/pkg_mgr_installed.php:80
+#: usr/local/www/system_advanced_notifications.php:140
+#: usr/local/www/status_rrd_graph.php:377
+#: usr/local/www/system_advanced_misc.php:199
+#: usr/local/www/system_gateways_edit.php:319
+#: usr/local/www/system_hasync.php:96 usr/local/www/diag_logs_gateways.php:78
+#: usr/local/www/diag_logs_filter_dynamic.php:98 usr/local/www/system.php:75
+#: usr/local/www/system.php:242 usr/local/www/system.php:262
+#: usr/local/www/diag_logs_routing.php:66
+#: usr/local/www/diag_logs_settings.php:222
+#: usr/local/www/system_gateway_groups_edit.php:146
+#: usr/local/www/fbegin.inc:283 usr/local/www/fbegin.inc:428
+#: usr/local/www/diag_logs_relayd.php:67 usr/local/www/diag_logs_auth.php:66
+#: usr/local/www/diag_logs_ipsec.php:103
+#: usr/local/www/diag_logs_resolver.php:79 usr/local/www/diag_logs_ntpd.php:66
+#: usr/local/www/system_advanced_misc.php:218
+#: usr/local/www/diag_logs_dhcp.php:71
+#: usr/local/www/system_gateway_groups.php:89
+#: usr/local/www/system_gateways_edit.php:425
+#: usr/local/www/diag_logs_wireless.php:68
+#: usr/local/www/system_firmware.php:109 usr/local/www/system_firmware.php:210
+#: usr/local/www/diag_logs_filter_summary.php:185
+#: usr/local/www/system_firmware_settings.php:79
+#: usr/local/www/diag_logs_gateways.php:79
+#: usr/local/www/diag_logs_openvpn.php:70
+#: usr/local/www/diag_logs_filter_dynamic.php:99 usr/local/www/system.php:235
+#: usr/local/www/system.php:255 usr/local/www/diag_logs_filter.php:91
+#: usr/local/www/system_firmware.php:108 usr/local/www/system_camanager.php:51
+#: usr/local/www/status_rrd_graph_img.php:43
+#: usr/local/www/status_rrd_graph.php:402
+#: usr/local/www/diag_logs_filter_dynamic.php:97
+#: usr/local/www/system_routes.php:98 usr/local/www/system_hasync.php:97
+#: usr/local/www/system_certmanager.php:57
+#: usr/local/www/system_advanced_misc.php:222
+#: usr/local/www/diag_logs_ppp.php:68
+#: usr/local/www/system_advanced_firewall.php:221
+#: usr/local/www/pkg_mgr_install.php:55 usr/local/www/fbegin.inc:275
+#: usr/local/www/fbegin.inc:420 usr/local/www/diag_logs_filter.php:121
+#: usr/local/www/system_advanced_misc.php:254 usr/local/www/pkg_mgr.php:94
+#: usr/local/www/system_routes_edit.php:227
+#: usr/local/www/system_gateway_groups_edit.php:150
+#: usr/local/www/system_gateway_groups.php:98
+#: usr/local/www/system_gateways_edit.php:455
+#: usr/local/www/system_routes.php:113
+#: usr/local/www/system_routes_edit.php:229
+#: usr/local/www/system_routes_edit.php:231
+#: usr/local/www/diag_logs_settings.php:241 usr/local/www/system_hasync.php:98
+#: usr/local/www/system_advanced_admin.php:263
+#: usr/local/www/system_advanced_misc.php:260
+#: usr/local/www/system_advanced_firewall.php:232
+#: usr/local/www/diag_backup.php:196
+#: usr/local/www/system_advanced_notifications.php:155
+#: usr/local/www/system_advanced_network.php:147
+msgid "System"
+msgstr "Sistema"
+
+#: usr/local/www/pkg_mgr_installed.php:45
+#: usr/local/www/pkg_mgr_installed.php:63 usr/local/www/diag_backup.php:113
+#: usr/local/www/pkg_mgr.php:49 usr/local/www/pkg_mgr.php:81
+#: usr/local/www/pkg_mgr_install.php:57 usr/local/www/fbegin.inc:440
+#: usr/local/www/pkg_mgr.php:55 usr/local/www/pkg_mgr.php:93
+#: usr/local/www/fbegin.inc:458 usr/local/www/diag_backup.php:190
+#: usr/local/www/pkg_mgr_installed.php:51
+#: usr/local/www/pkg_mgr_installed.php:80 usr/local/www/fbegin.inc:428
+#: usr/local/www/pkg_mgr_install.php:55 usr/local/www/fbegin.inc:420
+#: usr/local/www/pkg_mgr.php:94 usr/local/www/diag_backup.php:191
+msgid "Package Manager"
+msgstr "Gerenciador de Pacotes"
+
+#: usr/local/www/pkg_mgr_installed.php:76 usr/local/www/pkg_mgr.php:99
+#: usr/local/www/pkg_mgr.php:115 usr/local/www/pkg_mgr_installed.php:97
+#: usr/local/www/pkg_mgr_installed.php:99 usr/local/www/pkg_mgr.php:118
+msgid "Available Packages"
+msgstr "Pacotes disponíveis"
+
+#: usr/local/www/pkg_mgr_installed.php:80 usr/local/www/pkg_mgr.php:103
+#: usr/local/www/pkg_mgr_settings.php:93 usr/local/www/pkg_mgr.php:119
+#: usr/local/www/pkg_mgr_installed.php:101
+#: usr/local/www/pkg_mgr_installed.php:103 usr/local/www/pkg_mgr.php:122
+#: usr/local/www/pkg_mgr_settings.php:92
+msgid "Installed Packages"
+msgstr "Pacotes Instalados"
+
+#: usr/local/www/pkg_mgr_installed.php:90 usr/local/www/pkg_mgr.php:113
+msgid "Package Name"
+msgstr "Nome do Pacote"
+
+#: usr/local/www/pkg_mgr_installed.php:91 usr/local/www/pkg_mgr.php:114
+#: usr/local/www/pkg_mgr.php:130 usr/local/www/pkg_mgr_installed.php:112
+#: usr/local/www/pkg_mgr_installed.php:114 usr/local/www/pkg_mgr.php:133
+msgid "Category"
+msgstr "Categoria"
+
+#: usr/local/www/pkg_mgr_installed.php:92
+#: usr/local/www/pkg_mgr_installed.php:150 usr/local/www/pkg_mgr.php:117
+#: usr/local/www/pkg_mgr.php:200
+msgid "Package Info"
+msgstr "Info do Pacote"
+
+#: usr/local/www/pkg_mgr_installed.php:93
+msgid "Package Version"
+msgstr "Versão do Pacote"
+
+#: usr/local/www/pkg_mgr_installed.php:116
+#: usr/local/www/pkg_mgr_installed.php:122
+#: usr/local/www/pkg_mgr_installed.php:142
+#: usr/local/www/pkg_mgr_installed.php:144
+#: usr/local/www/pkg_mgr_installed.php:151
+#: usr/local/www/pkg_mgr_installed.php:153
+#: usr/local/www/pkg_mgr_installed.php:146
+#: usr/local/www/pkg_mgr_installed.php:155
+msgid "Available"
+msgstr "Disponível"
+
+#: usr/local/www/pkg_mgr_installed.php:117
+#: usr/local/www/pkg_mgr_installed.php:123
+#: usr/local/www/pkg_mgr_installed.php:145
+#: usr/local/www/pkg_mgr_installed.php:154
+#: usr/local/www/pkg_mgr_installed.php:147
+#: usr/local/www/pkg_mgr_installed.php:156
+msgid "Installed"
+msgstr "Instalado"
+
+#: usr/local/www/pkg_mgr_installed.php:152 usr/local/www/pkg_mgr.php:202
+msgid "No info, check the"
+msgstr "Sem info, verifique o"
+
+#: usr/local/www/pkg_mgr_installed.php:152 usr/local/www/pkg_mgr.php:202
+msgid "forum"
+msgstr "fórum"
+
+#: usr/local/www/pkg_mgr_installed.php:163
+msgid "Do you really want to remove this package?"
+msgstr "Você realmente deseja remover esse pacote?"
+
+#: usr/local/www/pkg_mgr_installed.php:164
+msgid "Remove this package."
+msgstr "Remova esse pacote."
+
+#: usr/local/www/pkg_mgr_installed.php:168
+msgid "Reinstall this package."
+msgstr "Reinstalar esse pacote."
+
+#: usr/local/www/pkg_mgr_installed.php:171
+msgid "Reinstall this package's GUI components."
+msgstr "Reinstalar os componentes GUI desse pacote."
+
+#: usr/local/www/pkg_mgr_installed.php:181
+#: usr/local/www/pkg_mgr_installed.php:222
+#: usr/local/www/pkg_mgr_installed.php:225
+#: usr/local/www/pkg_mgr_installed.php:227
+msgid "There are no packages currently installed."
+msgstr "Não há pacotes instalados atualmente."
+
+#: usr/local/www/easyrule.php:34
+msgid "Status : EasyRule"
+msgstr "Status: EasyRule"
+
+#: usr/local/www/easyrule.php:69
+msgid "Message"
+msgstr "Mensagem"
+
+#: usr/local/www/easyrule.php:72
+msgid "This is the Easy Rule status page, mainly used to display errors when adding rules. If you are seeing this, there apparently was not an error, and you navigated to the page directly without telling it what to do"
+msgstr "Esta é a página de status do EasyRule, principalmente usada para mostrar erros quando regras são adicionadas. Se você está vendo isto, este aparentemente não foi um erro e você navegou direto para a página sem dizer a ela o que fazer"
+
+#: usr/local/www/easyrule.php:75
+msgid "This page is meant to be called from the block/pass buttons on the Firewall Logs page"
+msgstr "Esta página destina-se a ser chama pelos botões bloquear/liberar na página de logs do Firewall"
+
+#: usr/local/www/easyrule.php:75 usr/local/www/diag_logs.php:65
+#: usr/local/www/diag_logs_auth.php:54 usr/local/www/diag_logs_dhcp.php:59
+#: usr/local/www/diag_logs_filter.php:90
+#: usr/local/www/diag_logs_filter_dynamic.php:61
+#: usr/local/www/diag_logs_ipsec.php:91 usr/local/www/diag_logs_ntpd.php:54
+#: usr/local/www/diag_logs_openvpn.php:45
+#: usr/local/www/diag_logs_settings.php:132 usr/local/www/diag_logs_vpn.php:44
+#: usr/local/www/status_wireless.php:41 usr/local/www/status_wireless.php:77
+#: usr/local/www/diag_logs_filter_summary.php:34
+#: usr/local/www/diag_logs_ppp.php:59 usr/local/www/diag_logs_relayd.php:55
+#: usr/local/www/pkg_mgr.php:116 usr/local/www/diag_ipsec.php:48
+#: usr/local/www/diag_ipsec.php:96 usr/local/www/diag_ipsec_sad.php:49
+#: usr/local/www/diag_ipsec_spd.php:49 usr/local/www/diag_pkglogs.php:81
+#: usr/local/www/status_filter_reload.php:44 usr/local/www/status_graph.php:85
+#: usr/local/www/carp_status.php:100 usr/local/www/carp_status.php:140
+#: usr/local/www/status_interfaces.php:58
+#: usr/local/www/status_interfaces.php:85 usr/local/www/fbegin.inc:359
+#: usr/local/www/status_queues.php:98 usr/local/www/status_rrd_graph.php:224
+#: usr/local/www/status_rrd_graph_settings.php:113
+#: usr/local/www/status_services.php:226 usr/local/www/status_services.php:246
+#: usr/local/www/status_upnp.php:58
+#: usr/local/www/status_captiveportal_test.php:58
+#: usr/local/www/status_captiveportal_voucher_rolls.php:57
+#: usr/local/www/status_captiveportal_vouchers.php:57
+#: usr/local/www/status_dhcp_leases.php:48
+#: usr/local/www/status_gateway_groups.php:52
+#: usr/local/www/status_gateways.php:51 usr/local/www/status_gateways.php:77
+#: usr/local/www/status_graph_cpu.php:41 usr/local/www/status_lb_pool.php:62
+#: usr/local/www/status_lb_vs.php:56 usr/local/www/status_lb_vs.php:80
+#: usr/local/www/status_openvpn.php:46 usr/local/www/status_openvpn.php:212
+#: usr/local/www/status_openvpn.php:263
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:43
+#: usr/local/www/status_dhcpv6_leases.php:49
+#: usr/local/www/diag_logs_wireless.php:56
+#: usr/local/www/diag_logs_routing.php:54 usr/local/www/pkg_mgr.php:131
+#: usr/local/www/diag_logs_settings.php:136 usr/local/www/fbegin.inc:377
+#: usr/local/www/status_rrd_graph_settings.php:114
+#: usr/local/www/status_queues.php:101 usr/local/www/diag_ipsec.php:107
+#: usr/local/www/diag_logs_resolver.php:66
+#: usr/local/www/status_rrd_graph.php:244 usr/local/www/status_ntpd.php:94
+#: usr/local/www/status_ntpd.php:107 usr/local/www/status_dhcpv6_leases.php:50
+#: usr/local/www/status_dhcp_leases.php:49
+#: usr/local/www/diag_logs_gateways.php:66
+#: usr/local/www/status_openvpn.php:215 usr/local/www/status_openvpn.php:266
+#: usr/local/www/diag_logs_settings.php:143 usr/local/www/fbegin.inc:323
+#: usr/local/www/status_interfaces.php:60
+#: usr/local/www/status_interfaces.php:88 usr/local/www/carp_status.php:92
+#: usr/local/www/carp_status.php:133 usr/local/www/status_graph.php:90
+#: usr/local/www/diag_ipsec.php:108 usr/local/www/status_wireless.php:78
+#: usr/local/www/status_ntpd.php:109 usr/local/www/status_ntpd.php:123
+#: usr/local/www/status_services.php:222 usr/local/www/status_services.php:242
+#: usr/local/www/status_gateways.php:78 usr/local/www/diag_logs_filter.php:79
+#: usr/local/www/status_services.php:220 usr/local/www/status_services.php:240
+#: usr/local/www/status_openvpn.php:314
+#: usr/local/www/status_captiveportal_expire.php:58
+#: usr/local/www/status_graph.php:101 usr/local/www/diag_ipsec.php:110
+#: usr/local/www/status_rrd_graph.php:248 usr/local/www/diag_logs_ppp.php:57
+#: usr/local/www/status_queues.php:109 usr/local/www/fbegin.inc:315
+#: usr/local/www/status_services.php:63 usr/local/www/status_services.php:81
+#: usr/local/www/status_openvpn.php:273 usr/local/www/status_openvpn.php:334
+#: usr/local/www/diag_logs_filter.php:109 usr/local/www/status_graph.php:111
+#: usr/local/www/pkg_mgr.php:134 usr/local/www/status_ntpd.php:115
+#: usr/local/www/status_ntpd.php:129 usr/local/www/diag_logs_settings.php:162
+#: usr/local/www/status_queues.php:123
+msgid "Status"
+msgstr "Status"
+
+#: usr/local/www/easyrule.php:75
+msgid "System Logs, Firewall Tab"
+msgstr "Logs de Sistema, Firewall Tab"
+
+#: usr/local/www/firewall_aliases_import.php:48
+#: usr/local/www/firewall_shaper_layer7.php:59
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_wizards.php:73
+#: usr/local/www/firewall_virtual_ip_edit.php:281
+#: usr/local/www/diag_logs.php:78 usr/local/www/diag_logs_auth.php:66
+#: usr/local/www/diag_logs_dhcp.php:71 usr/local/www/diag_logs_filter.php:90
+#: usr/local/www/diag_logs_filter.php:102
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_ipsec.php:103 usr/local/www/diag_logs_ntpd.php:66
+#: usr/local/www/diag_logs_openvpn.php:70
+#: usr/local/www/diag_logs_settings.php:211
+#: usr/local/www/diag_logs_vpn.php:127 usr/local/www/firewall_aliases.php:150
+#: usr/local/www/firewall_aliases_edit.php:56
+#: usr/local/www/firewall_nat_1to1.php:78
+#: usr/local/www/firewall_nat_1to1_edit.php:216
+#: usr/local/www/firewall_nat_edit.php:438
+#: usr/local/www/firewall_nat_out.php:283
+#: usr/local/www/firewall_nat_out_edit.php:300
+#: usr/local/www/firewall_rules.php:52
+#: usr/local/www/firewall_rules_edit.php:628
+#: usr/local/www/firewall_schedule.php:50
+#: usr/local/www/firewall_schedule_edit.php:61
+#: usr/local/www/firewall_shaper.php:54
+#: usr/local/www/firewall_virtual_ip.php:149
+#: usr/local/www/diag_logs_filter_summary.php:185
+#: usr/local/www/diag_logs_ppp.php:71 usr/local/www/diag_logs_relayd.php:67
+#: usr/local/www/firewall_nat.php:160 usr/local/www/fbegin.inc:335
+#: usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/firewall_nat_npt.php:78
+#: usr/local/www/firewall_nat_npt_edit.php:140
+#: usr/local/www/diag_logs_wireless.php:68
+#: usr/local/www/diag_logs_routing.php:66
+#: usr/local/www/diag_logs_settings.php:216 usr/local/www/fbegin.inc:353
+#: usr/local/www/firewall_nat_out.php:293
+#: usr/local/www/firewall_nat_1to1_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:145
+#: usr/local/www/firewall_nat_out_edit.php:313
+#: usr/local/www/firewall_rules_edit.php:660
+#: usr/local/www/diag_logs_resolver.php:79
+#: usr/local/www/firewall_aliases.php:153
+#: usr/local/www/diag_logs_gateways.php:79
+#: usr/local/www/firewall_nat_edit.php:445
+#: usr/local/www/firewall_virtual_ip_edit.php:268
+#: usr/local/www/diag_logs_filter_dynamic.php:99
+#: usr/local/www/diag_logs_routing.php:67
+#: usr/local/www/diag_logs_settings.php:223 usr/local/www/fbegin.inc:299
+#: usr/local/www/diag_logs_relayd.php:68
+#: usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+#: usr/local/www/firewall_nat_npt_edit.php:144
+#: usr/local/www/firewall_nat.php:165 usr/local/www/diag_logs_auth.php:67
+#: usr/local/www/firewall_rules_edit.php:661
+#: usr/local/www/diag_logs_ipsec.php:104
+#: usr/local/www/diag_logs_resolver.php:80 usr/local/www/diag_logs_ntpd.php:67
+#: usr/local/www/firewall_rules.php:49 usr/local/www/diag_logs_dhcp.php:72
+#: usr/local/www/diag_logs_wireless.php:69
+#: usr/local/www/diag_logs_filter_summary.php:186
+#: usr/local/www/firewall_aliases.php:155
+#: usr/local/www/diag_logs_gateways.php:80
+#: usr/local/www/firewall_nat_edit.php:444
+#: usr/local/www/diag_logs_openvpn.php:71
+#: usr/local/www/firewall_virtual_ip_edit.php:261
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/firewall_virtual_ip.php:152
+#: usr/local/www/diag_logs_filter.php:79 usr/local/www/diag_logs_filter.php:92
+#: usr/local/www/firewall_rules_edit.php:664
+#: usr/local/www/firewall_virtual_ip.php:166
+#: usr/local/www/firewall_nat_edit.php:439
+#: usr/local/www/firewall_virtual_ip_edit.php:253
+#: usr/local/www/diag_logs_filter_dynamic.php:98
+#: usr/local/www/diag_logs_ppp.php:69 usr/local/www/fbegin.inc:291
+#: usr/local/www/firewall_nat_out_edit.php:317
+#: usr/local/www/firewall_rules_edit.php:676
+#: usr/local/www/diag_logs_filter.php:109
+#: usr/local/www/diag_logs_filter.php:122
+#: usr/local/www/firewall_nat_edit.php:451
+#: usr/local/www/firewall_aliases.php:154
+#: usr/local/www/firewall_virtual_ip_edit.php:273
+#: usr/local/www/firewall_nat_out.php:301
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/firewall_virtual_ip.php:189
+#: usr/local/www/firewall_nat_edit.php:452 usr/local/www/firewall_nat.php:166
+#: usr/local/www/diag_logs_settings.php:242
+#: usr/local/www/firewall_rules_edit.php:724
+#: usr/local/www/firewall_virtual_ip.php:196
+#: usr/local/www/firewall_virtual_ip_edit.php:277
+msgid "Firewall"
+msgstr "Firewall"
+
+#: usr/local/www/firewall_aliases_import.php:48
+#: usr/local/www/firewall_aliases_import.php:59
+#: usr/local/www/firewall_aliases.php:150
+#: usr/local/www/firewall_aliases_edit.php:56
+#: usr/local/www/diag_backup.php:103 usr/local/www/fbegin.inc:110
+#: usr/local/www/fbegin.inc:127 usr/local/www/services_dnsmasq_edit.php:225
+#: usr/local/www/diag_backup.php:180 usr/local/www/firewall_aliases.php:153
+#: usr/local/www/fbegin.inc:136 usr/local/www/services_dnsmasq_edit.php:226
+#: usr/local/www/firewall_aliases.php:155 usr/local/www/fbegin.inc:128
+#: usr/local/www/firewall_aliases.php:154
+msgid "Aliases"
+msgstr "Aliases"
+
+#: usr/local/www/firewall_aliases_import.php:48
+msgid "Bulk import"
+msgstr "Importação em massa"
+
+#: usr/local/www/firewall_aliases_import.php:64
+msgid "The alias name may only consist of the characters"
+msgstr "O nome de alias deve conter somente caracteres"
+
+#: usr/local/www/firewall_aliases_import.php:68
+#: usr/local/www/firewall_aliases_edit.php:151
+#: usr/local/www/firewall_aliases_edit.php:145
+msgid "An alias with this name already exists."
+msgstr "Já existe um alias com esse nome."
+
+#: usr/local/www/firewall_aliases_import.php:74
+#: usr/local/www/firewall_aliases_edit.php:160
+#: usr/local/www/firewall_aliases_edit.php:154
+#, php-format
+msgid "Cannot use a reserved keyword as alias name %s"
+msgstr "Não pode usar uma palavra reservada como nome de alias %s"
+
+#: usr/local/www/firewall_aliases_import.php:79
+#: usr/local/www/firewall_aliases_edit.php:165
+#: usr/local/www/firewall_aliases_edit.php:159
+msgid "An interface description with this name already exists."
+msgstr "Já existe uma descrição de interface com esse nome."
+
+#: usr/local/www/firewall_aliases_import.php:94
+#, php-format
+msgid "%s is not an IP address. Please correct the error to continue"
+msgstr "%s não é um endereço IP. Por favor corrija o erro para continuar"
+
+#: usr/local/www/firewall_aliases_import.php:131
+msgid "Alias Import"
+msgstr "Importação de Alias"
+
+#: usr/local/www/firewall_aliases_import.php:134
+msgid "Alias Name"
+msgstr "Nome Alias"
+
+#: usr/local/www/firewall_aliases_import.php:137
+#: usr/local/www/firewall_aliases_edit.php:585
+msgid "The name of the alias may only consist of the characters \"a-z, A-Z and 0-9\"."
+msgstr "O nome do alias deve consistir apenas de caracteres \"a-z, A-Z e 0-9\"."
+
+#: usr/local/www/firewall_aliases_import.php:142
+#: usr/local/www/interfaces_lagg_edit.php:211
+#: usr/local/www/services_captiveportal_ip_edit.php:211
+#: usr/local/www/services_captiveportal_mac_edit.php:185
+#: usr/local/www/services_captiveportal_hostname_edit.php:186
+#: usr/local/www/system_gateways_edit.php:487
+#: usr/local/www/vpn_ipsec_phase1.php:580
+#: usr/local/www/vpn_ipsec_phase2.php:502
+#: usr/local/www/vpn_openvpn_client.php:577
+#: usr/local/www/vpn_openvpn_csc.php:346
+#: usr/local/www/vpn_openvpn_server.php:726
+#: usr/local/www/services_captiveportal_zones_edit.php:109
+#: usr/local/www/system_gateways_edit.php:522
+#: usr/local/www/vpn_openvpn_server.php:799
+#: usr/local/www/vpn_ipsec_phase2.php:528
+#: usr/local/www/vpn_openvpn_client.php:582
+#: usr/local/www/vpn_ipsec_phase1.php:593
+#: usr/local/www/services_captiveportal_hostname_edit.php:184
+#: usr/local/www/services_captiveportal_mac_edit.php:183
+#: usr/local/www/interfaces_lagg_edit.php:212
+#: usr/local/www/vpn_openvpn_csc.php:345
+#: usr/local/www/system_gateways_edit.php:622
+#: usr/local/www/services_captiveportal_ip_edit.php:209
+#: usr/local/www/vpn_openvpn_server.php:827
+#: usr/local/www/services_captiveportal_zones_edit.php:111
+#: usr/local/www/vpn_ipsec_phase2.php:630
+#: usr/local/www/vpn_openvpn_client.php:600
+#: usr/local/www/vpn_ipsec_phase1.php:592
+#: usr/local/www/system_gateways_edit.php:626
+#: usr/local/www/services_captiveportal_ip_edit.php:203
+#: usr/local/www/vpn_openvpn_client.php:619
+#: usr/local/www/interfaces_lagg_edit.php:225
+#: usr/local/www/services_captiveportal_mac_edit.php:196
+#: usr/local/www/vpn_ipsec_phase1.php:613
+#: usr/local/www/vpn_openvpn_server.php:854
+#: usr/local/www/vpn_ipsec_phase2.php:651
+#: usr/local/www/system_gateways_edit.php:628
+#: usr/local/www/system_gateways_edit.php:658
+#: usr/local/www/interfaces_lagg_edit.php:224
+#: usr/local/www/system_gateways_edit.php:659
+msgid "You may enter a description here for your reference (not parsed)"
+msgstr "Você pode inserir uma descrição aqui para sua referência (não analisado)"
+
+#: usr/local/www/firewall_aliases_import.php:146
+msgid "Aliases to import"
+msgstr "Aliases para importar"
+
+#: usr/local/www/firewall_aliases_import.php:148
+msgid "Paste in the aliases to import separated by a carriage return. Common examples are lists of IPs, networks, blacklists, etc."
+msgstr "Cole nos alias para importar separada por retorno de carro. Exemplos comuns são listas de IP, redes, listas negras, etc."
+
+#: usr/local/www/firewall_aliases_import.php:149
+msgid "The list may contain only IP addresses."
+msgstr "Esta lista pode conter apenas endereços IP."
+
+#: usr/local/www/firewall_shaper_layer7.php:59
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_wizards.php:73
+#: usr/local/www/firewall_shaper.php:54 usr/local/www/diag_backup.php:121
+#: usr/local/www/fbegin.inc:114 usr/local/www/fbegin.inc:131
+#: usr/local/www/diag_backup.php:199 usr/local/www/fbegin.inc:140
+#: usr/local/www/fbegin.inc:132 usr/local/www/diag_backup.php:200
+msgid "Traffic Shaper"
+msgstr "Traffic Shaper"
+
+#: usr/local/www/firewall_shaper_layer7.php:59
+#: usr/local/www/firewall_shaper_layer7.php:410
+#: usr/local/www/firewall_shaper_vinterface.php:375
+#: usr/local/www/firewall_shaper_wizards.php:105
+#: usr/local/www/firewall_rules_edit.php:1443
+#: usr/local/www/firewall_shaper.php:412
+#: usr/local/www/firewall_shaper_queues.php:196
+#: usr/local/www/firewall_rules_edit.php:1514
+#: usr/local/www/firewall_shaper_vinterface.php:385
+#: usr/local/www/firewall_shaper.php:413
+#: usr/local/www/firewall_shaper_vinterface.php:392
+#: usr/local/www/firewall_rules_edit.php:1529
+#: usr/local/www/firewall_shaper.php:414
+#: usr/local/www/firewall_shaper_vinterface.php:395
+#: usr/local/www/firewall_rules_edit.php:1537
+#: usr/local/www/firewall_shaper_queues.php:197
+#: usr/local/www/firewall_shaper_wizards.php:106
+#: usr/local/www/firewall_rules_edit.php:1548
+#: usr/local/www/firewall_rules_edit.php:1596
+msgid "Layer7"
+msgstr "Layer7"
+
+#: usr/local/www/firewall_shaper_layer7.php:66
+msgid "You can add new layer7 protocol patterns by simply uploading the file"
+msgstr "Você pode adicionar um novo padrão de protocolo layer7 simplesmente carregando o arquivo"
+
+#: usr/local/www/firewall_shaper_layer7.php:66
+#: usr/local/www/firewall_virtual_ip.php:243 usr/local/www/interfaces.php:2550
+#: usr/local/www/interfaces.php:2559 usr/local/www/carp_status.php:196
+#: usr/local/www/status_queues.php:174 usr/local/www/status_queues.php:182
+#: usr/local/www/interfaces.php:2752 usr/local/www/interfaces.php:2761
+#: usr/local/www/carp_status.php:189 usr/local/www/status_queues.php:183
+#: usr/local/www/interfaces.php:2740 usr/local/www/interfaces.php:2749
+#: usr/local/www/firewall_virtual_ip.php:249
+#: usr/local/www/firewall_virtual_ip.php:269
+#: usr/local/www/status_queues.php:165 usr/local/www/interfaces.php:2774
+#: usr/local/www/interfaces.php:2783 usr/local/www/interfaces.php:2820
+#: usr/local/www/interfaces.php:2829 usr/local/www/firewall_virtual_ip.php:292
+#: usr/local/www/interfaces.php:2806 usr/local/www/interfaces.php:2815
+#: usr/local/www/firewall_virtual_ip.php:300
+#: usr/local/www/status_queues.php:187 usr/local/www/interfaces.php:2842
+#: usr/local/www/interfaces.php:2851
+msgid "here"
+msgstr "aqui"
+
+#: usr/local/www/firewall_shaper_layer7.php:111
+msgid "Layer7 Rules Container not found!"
+msgstr "Contâiner de Regras Layer7 não encontrado!"
+
+#: usr/local/www/firewall_shaper_layer7.php:161
+msgid "Found the following repeated protocol definitions"
+msgstr "Encontradas as seguintes definições de protocolo repetidas"
+
+#: usr/local/www/firewall_shaper_layer7.php:401
+#: usr/local/www/firewall_shaper_queues.php:187
+#: usr/local/www/firewall_shaper_queues.php:188
+msgid "The traffic shaper configuration has been changed"
+msgstr "A configuração do traffic shaper foi modificada"
+
+#: usr/local/www/firewall_shaper_layer7.php:407
+#: usr/local/www/firewall_shaper_vinterface.php:372
+#: usr/local/www/firewall_shaper_wizards.php:102
+#: usr/local/www/firewall_shaper.php:409
+#: usr/local/www/firewall_shaper_queues.php:193
+#: usr/local/www/firewall_shaper_vinterface.php:382
+#: usr/local/www/firewall_shaper.php:410
+#: usr/local/www/firewall_shaper_vinterface.php:389
+#: usr/local/www/firewall_shaper.php:411
+#: usr/local/www/firewall_shaper_vinterface.php:392
+#: usr/local/www/firewall_shaper_queues.php:194
+#: usr/local/www/firewall_shaper_wizards.php:103
+msgid "By Interface"
+msgstr "Por Interface"
+
+#: usr/local/www/firewall_shaper_layer7.php:408
+#: usr/local/www/firewall_shaper_vinterface.php:373
+#: usr/local/www/firewall_shaper_wizards.php:103
+#: usr/local/www/firewall_shaper.php:410
+#: usr/local/www/firewall_shaper_queues.php:194
+#: usr/local/www/firewall_shaper_vinterface.php:383
+#: usr/local/www/firewall_shaper.php:411
+#: usr/local/www/firewall_shaper_vinterface.php:390
+#: usr/local/www/firewall_shaper.php:412
+#: usr/local/www/firewall_shaper_vinterface.php:393
+#: usr/local/www/firewall_shaper_queues.php:195
+#: usr/local/www/firewall_shaper_wizards.php:104
+msgid "By Queue"
+msgstr "Por Fila"
+
+#: usr/local/www/firewall_shaper_layer7.php:409
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_vinterface.php:374
+#: usr/local/www/firewall_shaper_wizards.php:104
+#: usr/local/www/firewall_shaper.php:411
+#: usr/local/www/firewall_shaper_queues.php:195
+#: usr/local/www/firewall_shaper_vinterface.php:384
+#: usr/local/www/firewall_shaper.php:412
+#: usr/local/www/firewall_shaper_vinterface.php:391
+#: usr/local/www/firewall_shaper.php:413
+#: usr/local/www/firewall_shaper_vinterface.php:394
+#: usr/local/www/firewall_shaper_queues.php:196
+#: usr/local/www/firewall_shaper_wizards.php:105
+msgid "Limiter"
+msgstr "Limitador"
+
+#: usr/local/www/firewall_shaper_layer7.php:411
+#: usr/local/www/firewall_shaper_vinterface.php:376
+#: usr/local/www/firewall_shaper_wizards.php:73
+#: usr/local/www/firewall_shaper_wizards.php:106
+#: usr/local/www/firewall_shaper.php:413
+#: usr/local/www/firewall_shaper_queues.php:197
+#: usr/local/www/vpn_openvpn_client.php:368
+#: usr/local/www/vpn_openvpn_csc.php:296
+#: usr/local/www/vpn_openvpn_server.php:586
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/vpn_openvpn_server.php:659
+#: usr/local/www/vpn_openvpn_client.php:373
+#: usr/local/www/firewall_shaper.php:414 usr/local/www/vpn_openvpn_csc.php:295
+#: usr/local/www/firewall_shaper_vinterface.php:393
+#: usr/local/www/vpn_openvpn_server.php:677
+#: usr/local/www/vpn_openvpn_client.php:381
+#: usr/local/www/vpn_openvpn_client.php:399
+#: usr/local/www/vpn_openvpn_server.php:703
+#: usr/local/www/firewall_shaper.php:415
+#: usr/local/www/firewall_shaper_vinterface.php:396
+#: usr/local/www/firewall_shaper_queues.php:198
+#: usr/local/www/firewall_shaper_wizards.php:107
+msgid "Wizards"
+msgstr "Wizards"
+
+#: usr/local/www/firewall_shaper_layer7.php:432
+msgid "Create new l7 rules group"
+msgstr "Criar um novo grupo de regras l7"
+
+#: usr/local/www/firewall_shaper_layer7.php:445
+msgid "Rule(s)"
+msgstr "Regra(s)"
+
+#: usr/local/www/firewall_shaper_layer7.php:457
+msgid "Add one or more rules"
+msgstr "Adicionar uma ou mais regras"
+
+#: usr/local/www/firewall_shaper_layer7.php:473
+msgid "Structure"
+msgstr "Estrutura"
+
+#: usr/local/www/firewall_shaper_layer7.php:480
+msgid "Behaviour"
+msgstr "Comportamento"
+
+#: usr/local/www/firewall_shaper_layer7.php:558
+#: usr/local/www/interfaces_groups_edit.php:315
+#: usr/local/www/firewall_aliases_edit.php:680
+#: usr/local/www/interfaces_qinq_edit.php:387
+#: usr/local/www/services_dhcp.php:855
+#: usr/local/www/services_igmpproxy_edit.php:273
+#: usr/local/www/vpn_pppoe_edit.php:573 usr/local/www/services_dhcpv6.php:768
+#: usr/local/www/services_unbound_acls.php:279
+#: usr/local/www/services_dnsmasq_edit.php:271
+#: usr/local/www/system_certmanager.php:793
+#: usr/local/www/services_igmpproxy_edit.php:275
+#: usr/local/www/firewall_aliases_edit.php:685
+#: usr/local/www/services_dhcp.php:893 usr/local/www/services_dhcpv6.php:863
+#: usr/local/www/vpn_pppoe_edit.php:574
+#: usr/local/www/services_dnsmasq_edit.php:272
+#: usr/local/www/services_router_advertisements.php:358
+#: usr/local/www/interfaces_qinq_edit.php:388
+#: usr/local/www/firewall_aliases_edit.php:688
+#: usr/local/www/services_dhcp.php:1090
+#: usr/local/www/interfaces_groups_edit.php:316
+#: usr/local/www/services_dhcpv6.php:794 usr/local/www/vpn_pppoe_edit.php:577
+#: usr/local/www/services_dhcp.php:1103
+#: usr/local/www/system_certmanager.php:818
+#: usr/local/www/services_dhcpv6.php:811
+#: usr/local/www/interfaces_qinq_edit.php:391
+#: usr/local/www/firewall_shaper_layer7.php:555
+#: usr/local/www/services_router_advertisements.php:353
+#: usr/local/www/services_dhcp.php:1123
+#: usr/local/www/system_certmanager.php:820
+#: usr/local/www/firewall_aliases_edit.php:717
+#: usr/local/www/interfaces_groups_edit.php:313
+#: usr/local/www/services_dhcp.php:1135
+#: usr/local/www/firewall_aliases_edit.php:716
+msgid "add another entry"
+msgstr "adicionar outra entrada"
+
+#: usr/local/www/firewall_shaper_vinterface.php:102
+msgid ""
+"This pipe/queue is referenced in filter rules, please remove references from "
+"there before deleteing."
+msgstr ""
+"O pipe/fila é referenciado em regras de firewall, por favor remova estas "
+"referências antes de apagar."
+
+#: usr/local/www/firewall_shaper_vinterface.php:114
+#, php-format
+msgid "No queue with name %s was found!"
+msgstr "Nenhuma fila com o nome %s foi encontrada!"
+
+#: usr/local/www/firewall_shaper_vinterface.php:160
+#: usr/local/www/firewall_shaper.php:159 usr/local/www/firewall_shaper.php:160
+msgid "Could not create new queue/discipline!"
+msgstr "Não pôde criar uma nova fila/disciplina!"
+
+#: usr/local/www/firewall_shaper_vinterface.php:172
+#: usr/local/www/firewall_shaper_vinterface.php:181
+#: usr/local/www/firewall_shaper_vinterface.php:190
+#: usr/local/www/firewall_shaper.php:175 usr/local/www/firewall_shaper.php:184
+#: usr/local/www/firewall_shaper.php:193
+#: usr/local/www/firewall_shaper_vinterface.php:182
+#: usr/local/www/firewall_shaper_vinterface.php:192
+#: usr/local/www/firewall_shaper.php:176 usr/local/www/firewall_shaper.php:185
+#: usr/local/www/firewall_shaper.php:194
+#: usr/local/www/firewall_shaper_vinterface.php:173
+#: usr/local/www/firewall_shaper_vinterface.php:183
+#: usr/local/www/firewall_shaper_vinterface.php:193
+msgid "Queue not found!"
+msgstr "Fila não encontrada!"
+
+#: usr/local/www/firewall_shaper_vinterface.php:235
+#: usr/local/www/firewall_shaper.php:270
+#: usr/local/www/firewall_shaper_vinterface.php:245
+#: usr/local/www/firewall_shaper.php:271
+#: usr/local/www/firewall_shaper_vinterface.php:247
+msgid "Could not add new queue."
+msgstr "Não pôde adicionar uma nova fila."
+
+#: usr/local/www/firewall_shaper_vinterface.php:304
+#: usr/local/www/firewall_shaper.php:346
+#: usr/local/www/firewall_shaper_vinterface.php:314
+#: usr/local/www/firewall_shaper.php:347
+#: usr/local/www/firewall_shaper_vinterface.php:316
+msgid "Queue Actions"
+msgstr "Ações de Fila"
+
+#: usr/local/www/firewall_shaper_vinterface.php:315
+#: usr/local/www/firewall_shaper.php:357
+#: usr/local/www/firewall_shaper_vinterface.php:325
+#: usr/local/www/firewall_shaper.php:358
+#: usr/local/www/firewall_shaper_vinterface.php:327
+msgid "Add new queue"
+msgstr "Adicionar nova fila"
+
+#: usr/local/www/firewall_shaper_vinterface.php:326
+#: usr/local/www/firewall_shaper.php:367
+#: usr/local/www/firewall_shaper_vinterface.php:336
+#: usr/local/www/firewall_shaper.php:368
+#: usr/local/www/firewall_shaper_vinterface.php:338
+#: usr/local/www/firewall_shaper.php:369
+msgid "Delete this queue"
+msgstr "Apagar essa fila"
+
+#: usr/local/www/firewall_shaper_vinterface.php:328
+#: usr/local/www/firewall_shaper_vinterface.php:338
+#: usr/local/www/firewall_shaper_vinterface.php:340
+msgid "Delete virtual interface"
+msgstr "Apagar interface virtual"
+
+#: usr/local/www/firewall_shaper_vinterface.php:366
+#: usr/local/www/firewall_shaper_wizards.php:96
+#: usr/local/www/firewall_shaper.php:403
+#: usr/local/www/firewall_shaper_vinterface.php:376
+#: usr/local/www/firewall_shaper.php:404
+#: usr/local/www/firewall_shaper_vinterface.php:383
+#: usr/local/www/firewall_shaper.php:405
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/firewall_shaper_wizards.php:97
+msgid "The traffic shaper configuration has been changed."
+msgstr "A configuração do traffic shaper foi modificada."
+
+#: usr/local/www/firewall_shaper_vinterface.php:395
+#: usr/local/www/firewall_shaper_vinterface.php:405
+#: usr/local/www/firewall_shaper_vinterface.php:412
+#: usr/local/www/firewall_shaper_vinterface.php:415
+msgid "Create new limiter"
+msgstr "Criar novo limitador"
+
+#: usr/local/www/firewall_shaper_wizards.php:76
+msgid "Single Lan multi Wan"
+msgstr "Lan única Wan múltipla"
+
+#: usr/local/www/firewall_shaper_wizards.php:77
+msgid "Single Wan multi Lan"
+msgstr "Wan única Lan múltipla"
+
+#: usr/local/www/firewall_shaper_wizards.php:78
+msgid "Multiple Lan/Wan"
+msgstr "Lan/Wan Múltiplas"
+
+#: usr/local/www/firewall_shaper_wizards.php:79
+msgid "Dedicated Links"
+msgstr "Links dedicados"
+
+#: usr/local/www/firewall_shaper_wizards.php:115
+#: usr/local/www/firewall_shaper_wizards.php:116
+msgid "Wizard function"
+msgstr "Função do Wizard"
+
+#: usr/local/www/firewall_shaper_wizards.php:116
+#: usr/local/www/firewall_shaper_wizards.php:117
+msgid "Wizard Link"
+msgstr "Link do Wizard"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:65
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:107
+#: usr/local/www/system.php:113 usr/local/www/system.php:265
+#: usr/local/www/services_dnsmasq.php:244
+#: usr/local/www/services_dnsmasq.php:311
+#: usr/local/www/services_dnsmasq_edit.php:80
+#: usr/local/www/services_dnsmasq_edit.php:149
+#: usr/local/www/services_dnsmasq.php:332
+#: usr/local/www/services_dnsmasq_edit.php:81
+#: usr/local/www/services_dnsmasq_edit.php:204
+#: usr/local/www/services_dnsmasq_edit.php:238
+#: usr/local/www/services_unbound.php:280
+#: usr/local/www/services_unbound.php:347 usr/local/www/system.php:114
+#: usr/local/www/system.php:276 usr/local/www/services_dnsmasq.php:245
+#: usr/local/www/services_dnsmasq.php:333
+#: usr/local/www/services_dnsmasq_edit.php:205
+#: usr/local/www/services_dnsmasq_edit.php:239
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:72
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:130
+#: usr/local/www/system.php:107 usr/local/www/system.php:269
+#: usr/local/www/services_dnsmasq.php:270
+#: usr/local/www/services_dnsmasq.php:358
+#: usr/local/www/services_dnsmasq.php:283
+#: usr/local/www/services_dnsmasq.php:371
+#: usr/local/www/services_dnsmasq.php:347
+#: usr/local/www/services_dnsmasq.php:435
+msgid "Domain"
+msgstr "Domínio"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:70
+#: usr/local/www/services_dnsmasq_edit.php:88
+#: usr/local/www/services_dnsmasq_edit.php:89
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:87
+msgid "A valid domain must be specified."
+msgstr "Um domínio válido deve ser especificado."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:73
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:90
+msgid "A valid IP address must be specified, or # for an exclusion."
+msgstr "Um endereço IP válido deve ser especificado, ou # para uma exclusão."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:96
+#: usr/local/www/services_dhcp.php:878 usr/local/www/services_dnsmasq.php:119
+#: usr/local/www/services_dnsmasq_edit.php:127
+#: usr/local/www/services_dhcpv6.php:791
+#: usr/local/www/services_dnsmasq_edit.php:166
+#: usr/local/www/services_dhcp.php:916 usr/local/www/services_dhcpv6.php:886
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/services_dhcp.php:1120 usr/local/www/services_dhcpv6.php:817
+#: usr/local/www/services_dhcp.php:1133 usr/local/www/services_dhcpv6.php:834
+#: usr/local/www/services_dnsmasq.php:123 usr/local/www/services_dhcp.php:1153
+#: usr/local/www/services_dnsmasq.php:125
+#: usr/local/www/services_dnsmasq.php:146 usr/local/www/services_dhcp.php:1165
+msgid "DNS forwarder"
+msgstr "DNS forwarder"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:96
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+msgid "Edit Domain Override"
+msgstr "Editar Sobrescrita de domínio"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:110
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:133
+msgid "Domain to override (NOTE: this does not have to be a valid TLD!)"
+msgstr "Domínio para sobrescrever (NOTA: isso não precisa ser um TLD válido!)"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:111
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/firewall_nat_edit.php:745 usr/local/www/system.php:260
+#: usr/local/www/system.php:271 usr/local/www/services_dnsmasq_edit.php:146
+#: usr/local/www/services_dnsmasq_edit.php:153
+#: usr/local/www/services_dnsmasq_edit.php:160
+#: usr/local/www/services_dnsmasq_edit.php:201
+#: usr/local/www/services_dnsmasq_edit.php:208
+#: usr/local/www/services_dnsmasq_edit.php:215
+#: usr/local/www/firewall_nat_edit.php:752 usr/local/www/system.php:282
+#: usr/local/www/services_dnsmasq_edit.php:202
+#: usr/local/www/services_dnsmasq_edit.php:209
+#: usr/local/www/services_dnsmasq_edit.php:216
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+#: usr/local/www/firewall_nat_edit.php:751 usr/local/www/system.php:264
+#: usr/local/www/system.php:275 usr/local/www/firewall_nat_edit.php:746
+#: usr/local/www/firewall_nat_edit.php:758
+#: usr/local/www/firewall_nat_edit.php:759
+msgid "e.g."
+msgstr "ex."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:111
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+msgid "test"
+msgstr "teste"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:117
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:140
+msgid "IP address of the authoritative DNS server for this domain"
+msgstr "Endereço IP do servidor DNS oficial para esse domínio"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:118
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+msgid "Or enter # for an exclusion to pass through this host/subdomain to standard nameservers instead of a previous override."
+msgstr "Ou entre com # para remover a passagem através de host/sub-domínio para nameservers padrões, ao invés de substituir o anterior."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:106
+#: usr/local/www/firewall_virtual_ip_edit.php:415
+#: usr/local/www/load_balancer_relay_action.php:141
+#: usr/local/www/firewall_aliases_edit.php:601
+#: usr/local/www/firewall_virtual_ip.php:186
+#: usr/local/www/load_balancer_monitor.php:123
+#: usr/local/www/load_balancer_monitor_edit.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:247
+#: usr/local/www/services_captiveportal.php:777
+#: usr/local/www/services_dhcp.php:813
+#: usr/local/www/load_balancer_relay_action_edit.php:463
+#: usr/local/www/load_balancer_relay_protocol.php:135
+#: usr/local/www/load_balancer_relay_protocol_edit.php:79
+#: usr/local/www/load_balancer_relay_protocol_edit.php:201
+#: usr/local/www/services_igmpproxy.php:96
+#: usr/local/www/services_igmpproxy_edit.php:185
+#: usr/local/www/system_authservers.php:161
+#: usr/local/www/system_authservers.php:184
+#: usr/local/www/system_authservers.php:449
+#: usr/local/www/system_authservers.php:738
+#: usr/local/www/vpn_ipsec_phase2.php:423
+#: usr/local/www/vpn_ipsec_phase2.php:465
+#: usr/local/www/system_certmanager.php:762
+#: usr/local/www/load_balancer_relay_action_edit.php:462
+#: usr/local/www/services_igmpproxy_edit.php:187
+#: usr/local/www/firewall_aliases_edit.php:606
+#: usr/local/www/status_ntpd.php:111
+#: usr/local/www/services_captiveportal.php:819
+#: usr/local/www/load_balancer_monitor.php:124
+#: usr/local/www/services_dhcp.php:851 usr/local/www/vpn_ipsec_phase2.php:449
+#: usr/local/www/vpn_ipsec_phase2.php:491
+#: usr/local/www/firewall_virtual_ip_edit.php:403
+#: usr/local/www/load_balancer_relay_protocol_edit.php:199
+#: usr/local/www/load_balancer_relay_action_edit.php:460
+#: usr/local/www/load_balancer_monitor_edit.php:245
+#: usr/local/www/firewall_aliases_edit.php:609
+#: usr/local/www/status_ntpd.php:127
+#: usr/local/www/services_captiveportal.php:817
+#: usr/local/www/load_balancer_monitor.php:122
+#: usr/local/www/load_balancer_relay_protocol.php:133
+#: usr/local/www/services_dhcp.php:1048
+#: usr/local/www/load_balancer_relay_action.php:139
+#: usr/local/www/vpn_ipsec_phase2.php:515
+#: usr/local/www/vpn_ipsec_phase2.php:551
+#: usr/local/www/vpn_ipsec_phase2.php:593
+#: usr/local/www/firewall_virtual_ip_edit.php:355
+#: usr/local/www/firewall_virtual_ip.php:190
+#: usr/local/www/system_authservers.php:162
+#: usr/local/www/system_authservers.php:185
+#: usr/local/www/system_authservers.php:454
+#: usr/local/www/system_authservers.php:744
+#: usr/local/www/firewall_virtual_ip.php:204
+#: usr/local/www/firewall_virtual_ip_edit.php:347
+#: usr/local/www/services_dhcp.php:1061
+#: usr/local/www/system_certmanager.php:787
+#: usr/local/www/system_authservers.php:163
+#: usr/local/www/system_authservers.php:186
+#: usr/local/www/system_authservers.php:461
+#: usr/local/www/system_authservers.php:760
+#: usr/local/www/services_captiveportal.php:805
+#: usr/local/www/vpn_ipsec_phase2.php:537
+#: usr/local/www/vpn_ipsec_phase2.php:572
+#: usr/local/www/vpn_ipsec_phase2.php:614
+#: usr/local/www/firewall_virtual_ip_edit.php:367
+#: usr/local/www/services_dhcp.php:1081
+#: usr/local/www/system_certmanager.php:788 usr/local/www/status_ntpd.php:133
+#: usr/local/www/services_captiveportal.php:821
+#: usr/local/www/firewall_aliases_edit.php:640
+#: usr/local/www/firewall_virtual_ip.php:227
+#: usr/local/www/firewall_virtual_ip.php:234
+#: usr/local/www/firewall_virtual_ip_edit.php:371
+#: usr/local/www/services_dhcp.php:1093
+#: usr/local/www/system_authservers.php:165
+#: usr/local/www/system_authservers.php:188
+#: usr/local/www/system_authservers.php:472
+#: usr/local/www/system_authservers.php:802
+#: usr/local/www/firewall_aliases_edit.php:639
+msgid "Type"
+msgstr "Tipo"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:111
+#: usr/local/www/diag_logs_settings.php:88
+#: usr/local/www/services_dhcp_edit.php:126
+#: usr/local/www/services_dnsmasq_edit.php:91
+#: usr/local/www/services_dnsmasq_edit.php:92
+#: usr/local/www/services_dhcp_edit.php:128
+#: usr/local/www/firewall_virtual_ip_edit.php:114
+#: usr/local/www/services_dhcp_edit.php:162
+#: usr/local/www/firewall_virtual_ip_edit.php:115
+msgid "A valid IP address must be specified."
+msgstr "Um endereço de IP válido de ser especificado."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:116
+#: usr/local/www/firewall_virtual_ip_edit.php:119
+#: usr/local/www/firewall_virtual_ip_edit.php:123
+msgid "The interface chosen for the VIP has no IPv4 or IPv6 address configured so it cannot be used as a parent for the VIP."
+msgstr "A interface escolhida para o VIP não possui IPv4 ou IPv6 configurado, portanto não pode ser usado como um pai para o VIP."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:118
+#: usr/local/www/firewall_virtual_ip_edit.php:121
+#, php-format
+msgid "The %s IP address may not be used in a virtual entry."
+msgstr "O endereço de IP %s não deve ser usado em uma entrada virtual."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:123
+#: usr/local/www/firewall_virtual_ip_edit.php:126
+msgid "The /32 subnet mask is invalid for CARP IPs."
+msgstr "A máscara de subrede /32 é inválida para IPs CARP."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:127
+#: usr/local/www/firewall_virtual_ip_edit.php:130
+msgid "The /128 subnet mask is invalid for CARP IPs."
+msgstr "A máscara de rede /128 é inválida para IPs CARP."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:135
+#: usr/local/www/firewall_virtual_ip_edit.php:138
+msgid "There is already a virtual IP entry for the specified IP address."
+msgstr "Já existe uma entrada de IP virtual para o endereço de IP especificado."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:150
+#, php-format
+msgid "VHID %s is already in use. Pick a unique number."
+msgstr "VHID %s já está em uso. Escolha um número único."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:154
+#: usr/local/www/firewall_virtual_ip_edit.php:157
+#: usr/local/www/firewall_virtual_ip_edit.php:156
+#: usr/local/www/firewall_virtual_ip_edit.php:148
+#: usr/local/www/firewall_virtual_ip_edit.php:164
+msgid "You must specify a CARP password that is shared between the two VHID members."
+msgstr "Você deve especificar uma senha CARP que é compartilhada entre os dois membros VHID."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:161
+#: usr/local/www/firewall_virtual_ip_edit.php:170
+#: usr/local/www/firewall_virtual_ip_edit.php:182
+#: usr/local/www/firewall_virtual_ip_edit.php:164
+#: usr/local/www/firewall_virtual_ip_edit.php:173
+#: usr/local/www/firewall_virtual_ip_edit.php:185
+#: usr/local/www/firewall_virtual_ip_edit.php:163
+#: usr/local/www/firewall_virtual_ip_edit.php:172
+#: usr/local/www/firewall_virtual_ip_edit.php:184
+#: usr/local/www/firewall_virtual_ip_edit.php:155
+#: usr/local/www/firewall_virtual_ip_edit.php:176
+#: usr/local/www/firewall_virtual_ip_edit.php:178
+#: usr/local/www/firewall_virtual_ip_edit.php:197
+#: usr/local/www/firewall_virtual_ip_edit.php:199
+#, php-format
+msgid "Sorry, we could not locate an interface with a matching subnet for %s. Please add an IP alias in this subnet on this interface."
+msgstr "Lamento, não podemos localizar uma interface com uma subrede correspondente a %s. Por favor, adicione um alias de IP nessa subrede nessa interface."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:174
+#: usr/local/www/firewall_virtual_ip_edit.php:177
+#: usr/local/www/firewall_virtual_ip_edit.php:176
+#: usr/local/www/firewall_virtual_ip_edit.php:168
+#: usr/local/www/firewall_virtual_ip_edit.php:182
+#: usr/local/www/firewall_virtual_ip_edit.php:184
+msgid "A CARP parent interface can only be used with IP Alias type Virtual IPs."
+msgstr "Para este tipo de VIP, um carp pai não é permitido."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:188
+#: usr/local/www/firewall_virtual_ip_edit.php:191
+#: usr/local/www/firewall_virtual_ip_edit.php:190
+#: usr/local/www/firewall_virtual_ip_edit.php:182
+#: usr/local/www/firewall_virtual_ip_edit.php:203
+#: usr/local/www/firewall_virtual_ip_edit.php:207
+msgid "For this type of VIP, a CARP parent is not allowed."
+msgstr "Para este tipo de VIP, um CARP pai não é permitido."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:202
+msgid "This entry cannot be modified because it is still referenced by CARP"
+msgstr "Essa entrada não pode ser modificada porque ela ainda é referenciada pela CARP"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:281
+#: usr/local/www/firewall_virtual_ip_edit.php:268
+#: usr/local/www/firewall_virtual_ip_edit.php:261
+#: usr/local/www/firewall_virtual_ip_edit.php:253
+#: usr/local/www/firewall_virtual_ip_edit.php:273
+#: usr/local/www/firewall_virtual_ip_edit.php:277
+msgid "Virtual IP Address"
+msgstr "Endereços de IP Virtuais"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:300
+#: usr/local/www/firewall_virtual_ip_edit.php:302
+#: usr/local/www/firewall_virtual_ip_edit.php:288
+#: usr/local/www/firewall_virtual_ip_edit.php:290
+#: usr/local/www/firewall_virtual_ip_edit.php:287
+#: usr/local/www/firewall_virtual_ip_edit.php:289
+#: usr/local/www/firewall_virtual_ip_edit.php:279
+#: usr/local/www/firewall_virtual_ip_edit.php:281
+#: usr/local/www/firewall_virtual_ip_edit.php:299
+#: usr/local/www/firewall_virtual_ip_edit.php:301
+#: usr/local/www/firewall_virtual_ip_edit.php:303
+#: usr/local/www/firewall_virtual_ip_edit.php:305
+msgid "This must be the network's subnet mask. It does not specify a CIDR range."
+msgstr "Essa deve ser a máscara de subrede da rede. Ela não especifica um intervalo CIDR."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:301
+#: usr/local/www/firewall_virtual_ip_edit.php:289
+#: usr/local/www/firewall_virtual_ip_edit.php:288
+#: usr/local/www/firewall_virtual_ip_edit.php:280
+#: usr/local/www/firewall_virtual_ip_edit.php:300
+#: usr/local/www/firewall_virtual_ip_edit.php:304
+msgid "This is a CIDR block of proxy ARP addresses."
+msgstr "Esse é um bloqueio CIDR de endereços Proxy ARP."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:412
+#: usr/local/www/firewall_virtual_ip_edit.php:400
+#: usr/local/www/firewall_virtual_ip_edit.php:352
+#: usr/local/www/firewall_virtual_ip_edit.php:344
+#: usr/local/www/firewall_virtual_ip_edit.php:364
+#: usr/local/www/firewall_virtual_ip_edit.php:368
+msgid "Edit Virtual IP"
+msgstr "Editar IP Virtual"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:418
+#: usr/local/www/firewall_virtual_ip_edit.php:406
+#: usr/local/www/firewall_virtual_ip_edit.php:362
+#: usr/local/www/firewall_virtual_ip_edit.php:354
+#: usr/local/www/firewall_virtual_ip_edit.php:374
+#: usr/local/www/firewall_virtual_ip_edit.php:378
+msgid "Proxy ARP"
+msgstr "Proxy ARP"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:420
+#: usr/local/www/carp_status.php:100
+#: usr/local/www/firewall_virtual_ip_edit.php:408
+#: usr/local/www/carp_status.php:92
+#: usr/local/www/firewall_virtual_ip_edit.php:360
+#: usr/local/www/firewall_virtual_ip_edit.php:352
+#: usr/local/www/firewall_virtual_ip_edit.php:372
+#: usr/local/www/firewall_virtual_ip_edit.php:376
+msgid "CARP"
+msgstr "CARP"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:422
+#: usr/local/www/firewall_virtual_ip_edit.php:410
+#: usr/local/www/firewall_virtual_ip_edit.php:364
+#: usr/local/www/firewall_virtual_ip_edit.php:356
+#: usr/local/www/firewall_virtual_ip_edit.php:376
+#: usr/local/www/firewall_virtual_ip_edit.php:380
+msgid "Other"
+msgstr "Outro"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:424
+#: usr/local/www/firewall_virtual_ip_edit.php:412
+#: usr/local/www/firewall_virtual_ip_edit.php:358
+#: usr/local/www/firewall_virtual_ip_edit.php:350
+#: usr/local/www/firewall_virtual_ip_edit.php:370
+#: usr/local/www/firewall_virtual_ip_edit.php:374
+msgid "IP Alias"
+msgstr "Alias do IP"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:435
+#: usr/local/www/diag_packet_capture.php:119
+#: usr/local/www/services_wol.php:130 usr/local/www/services_wol.php:161
+#: usr/local/www/services_wol_edit.php:82
+#: usr/local/www/services_wol_edit.php:126
+#: usr/local/www/interfaces_bridge.php:107
+#: usr/local/www/interfaces_gif.php:106 usr/local/www/interfaces_gre.php:107
+#: usr/local/www/interfaces_groups_edit.php:274
+#: usr/local/www/firewall_nat_1to1.php:104
+#: usr/local/www/firewall_nat_1to1_edit.php:114
+#: usr/local/www/firewall_nat_1to1_edit.php:280
+#: usr/local/www/firewall_nat_edit.php:182
+#: usr/local/www/firewall_nat_edit.php:185
+#: usr/local/www/firewall_nat_edit.php:476
+#: usr/local/www/firewall_nat_out.php:341
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:417
+#: usr/local/www/firewall_rules_edit.php:727
+#: usr/local/www/interfaces_assign.php:420
+#: usr/local/www/interfaces_vlan.php:108 usr/local/www/system_routes.php:128
+#: usr/local/www/interfaces_lagg.php:112 usr/local/www/interfaces_ppps.php:108
+#: usr/local/www/interfaces_qinq.php:116
+#: usr/local/www/interfaces_wireless.php:106 usr/local/www/vpn_pppoe.php:101
+#: usr/local/www/services_captiveportal.php:146 usr/local/www/diag_ping.php:95
+#: usr/local/www/services_dhcp_relay.php:72 usr/local/www/status_graph.php:179
+#: usr/local/www/diag_arp.php:316
+#: usr/local/www/services_igmpproxy_edit.php:161
+#: usr/local/www/system_gateways.php:153
+#: usr/local/www/system_gateways_edit.php:98
+#: usr/local/www/system_gateways_edit.php:347
+#: usr/local/www/vpn_ipsec_phase1.php:538 usr/local/www/vpn_l2tp.php:304
+#: usr/local/www/vpn_openvpn_client.php:451
+#: usr/local/www/vpn_openvpn_server.php:691
+#: usr/local/www/vpn_pppoe_edit.php:372
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:42
+#: usr/local/www/diag_ndp.php:132 usr/local/www/firewall_nat_npt.php:104
+#: usr/local/www/firewall_nat_npt_edit.php:104
+#: usr/local/www/firewall_nat_npt_edit.php:166
+#: usr/local/www/services_dhcpv6_relay.php:73
+#: usr/local/www/firewall_nat_out.php:351
+#: usr/local/www/firewall_nat_1to1_edit.php:287
+#: usr/local/www/firewall_nat_npt_edit.php:171
+#: usr/local/www/status_graph.php:177
+#: usr/local/www/firewall_nat_out_edit.php:430
+#: usr/local/www/firewall_rules_edit.php:760
+#: usr/local/www/services_igmpproxy_edit.php:163
+#: usr/local/www/services_captiveportal.php:147
+#: usr/local/www/system_gateways_edit.php:99
+#: usr/local/www/system_gateways_edit.php:353
+#: usr/local/www/services_dyndns.php:108
+#: usr/local/www/vpn_openvpn_server.php:764
+#: usr/local/www/diag_packet_capture.php:123
+#: usr/local/www/firewall_nat_edit.php:483
+#: usr/local/www/vpn_openvpn_client.php:456
+#: usr/local/www/firewall_virtual_ip_edit.php:423
+#: usr/local/www/vpn_pppoe_edit.php:373 usr/local/www/firewall_nat_out.php:352
+#: usr/local/www/firewall_nat_1to1_edit.php:285
+#: usr/local/www/firewall_nat_npt_edit.php:170 usr/local/www/vpn_pppoe.php:102
+#: usr/local/www/status_graph.php:183 usr/local/www/interfaces_qinq.php:117
+#: usr/local/www/interfaces_ppps.php:109
+#: usr/local/www/interfaces_bridge.php:108
+#: usr/local/www/interfaces_lagg.php:113 usr/local/www/interfaces_gre.php:108
+#: usr/local/www/interfaces_wireless.php:107
+#: usr/local/www/services_captiveportal.php:153
+#: usr/local/www/system_gateways_edit.php:100
+#: usr/local/www/system_gateways_edit.php:459
+#: usr/local/www/interfaces_assign.php:414
+#: usr/local/www/vpn_openvpn_server.php:782
+#: usr/local/www/interfaces_groups_edit.php:275
+#: usr/local/www/diag_packet_capture.php:181
+#: usr/local/www/interfaces_vlan.php:109
+#: usr/local/www/firewall_nat_edit.php:482
+#: usr/local/www/vpn_openvpn_client.php:464 usr/local/www/vpn_l2tp.php:305
+#: usr/local/www/firewall_virtual_ip_edit.php:368
+#: usr/local/www/interfaces_gif.php:107
+#: usr/local/www/firewall_virtual_ip.php:189
+#: usr/local/www/vpn_ipsec_phase1.php:537 usr/local/www/vpn_l2tp.php:308
+#: usr/local/www/vpn_pppoe.php:103 usr/local/www/vpn_openvpn_client.php:482
+#: usr/local/www/diag_testport.php:143
+#: usr/local/www/firewall_rules_edit.php:763
+#: usr/local/www/interfaces_qinq.php:120
+#: usr/local/www/firewall_virtual_ip.php:203
+#: usr/local/www/firewall_nat_edit.php:187
+#: usr/local/www/firewall_nat_edit.php:190
+#: usr/local/www/firewall_nat_edit.php:477 usr/local/www/status_graph.php:196
+#: usr/local/www/interfaces_lagg.php:117 usr/local/www/interfaces_vlan.php:115
+#: usr/local/www/firewall_virtual_ip_edit.php:360
+#: usr/local/www/interfaces_bridge.php:114
+#: usr/local/www/interfaces_wireless.php:109
+#: usr/local/www/system_routes.php:132 usr/local/www/vpn_pppoe_edit.php:376
+#: usr/local/www/services_captiveportal.php:155
+#: usr/local/www/vpn_ipsec_phase1.php:558 usr/local/www/interfaces_gre.php:112
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:434
+#: usr/local/www/vpn_openvpn_server.php:808
+#: usr/local/www/services_dyndns.php:89 usr/local/www/interfaces_gif.php:111
+#: usr/local/www/system_gateways_edit.php:461
+#: usr/local/www/firewall_rules_edit.php:775
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:215
+#: usr/local/www/firewall_nat_edit.php:192
+#: usr/local/www/firewall_nat_edit.php:195
+#: usr/local/www/firewall_nat_edit.php:489 usr/local/www/status_graph.php:206
+#: usr/local/www/firewall_virtual_ip_edit.php:380
+#: usr/local/www/diag_packet_capture.php:189
+#: usr/local/www/firewall_nat_out.php:359
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:446
+#: usr/local/www/services_dyndns.php:85
+#: usr/local/www/system_gateways_edit.php:491
+#: usr/local/www/firewall_virtual_ip.php:226
+#: usr/local/www/firewall_nat_edit.php:490 usr/local/www/system_routes.php:148
+#: usr/local/www/firewall_nat_out.php:358
+#: usr/local/www/firewall_nat_npt_edit.php:169
+#: usr/local/www/firewall_nat_1to1_edit.php:286
+#: usr/local/www/firewall_rules_edit.php:823
+#: usr/local/www/firewall_virtual_ip.php:233
+#: usr/local/www/firewall_virtual_ip_edit.php:384
+msgid "Interface"
+msgstr "Interface"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:452
+#: usr/local/www/firewall_virtual_ip_edit.php:440
+#: usr/local/www/firewall_virtual_ip_edit.php:385
+#: usr/local/www/firewall_virtual_ip_edit.php:377
+#: usr/local/www/firewall_virtual_ip_edit.php:397
+#: usr/local/www/firewall_virtual_ip_edit.php:402
+msgid "IP Address(es)"
+msgstr "Endereço(s) IP"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:456
+#: usr/local/www/firewall_nat_1to1_edit.php:338
+#: usr/local/www/firewall_nat_1to1_edit.php:393
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_out_edit.php:472
+#: usr/local/www/firewall_nat_out_edit.php:506
+#: usr/local/www/firewall_rules_edit.php:865
+#: usr/local/www/firewall_rules_edit.php:958
+#: usr/local/www/firewall_nat_1to1_edit.php:345
+#: usr/local/www/firewall_nat_1to1_edit.php:400
+#: usr/local/www/firewall_nat_out_edit.php:485
+#: usr/local/www/firewall_nat_out_edit.php:519
+#: usr/local/www/firewall_rules_edit.php:900
+#: usr/local/www/firewall_rules_edit.php:993
+#: usr/local/www/firewall_nat_edit.php:552
+#: usr/local/www/firewall_nat_edit.php:641
+#: usr/local/www/firewall_virtual_ip_edit.php:444
+#: usr/local/www/firewall_nat_1to1_edit.php:343
+#: usr/local/www/firewall_nat_1to1_edit.php:398
+#: usr/local/www/firewall_nat_edit.php:551
+#: usr/local/www/firewall_nat_edit.php:640
+#: usr/local/www/firewall_virtual_ip_edit.php:389
+#: usr/local/www/firewall_rules_edit.php:903
+#: usr/local/www/firewall_rules_edit.php:1002
+#: usr/local/www/firewall_nat_edit.php:546
+#: usr/local/www/firewall_nat_edit.php:635
+#: usr/local/www/firewall_virtual_ip_edit.php:381
+#: usr/local/www/firewall_nat_out_edit.php:489
+#: usr/local/www/firewall_nat_out_edit.php:523
+#: usr/local/www/firewall_rules_edit.php:915
+#: usr/local/www/firewall_rules_edit.php:1015
+#: usr/local/www/firewall_nat_edit.php:558
+#: usr/local/www/firewall_nat_edit.php:647
+#: usr/local/www/firewall_virtual_ip_edit.php:401
+#: usr/local/www/firewall_nat_out_edit.php:501
+#: usr/local/www/firewall_nat_out_edit.php:535
+#: usr/local/www/firewall_rules_edit.php:914
+#: usr/local/www/firewall_rules_edit.php:1014
+#: usr/local/www/firewall_nat_edit.php:559
+#: usr/local/www/firewall_nat_edit.php:648
+#: usr/local/www/firewall_nat_1to1_edit.php:344
+#: usr/local/www/firewall_nat_1to1_edit.php:399
+#: usr/local/www/firewall_nat_out_edit.php:536
+#: usr/local/www/firewall_rules_edit.php:962
+#: usr/local/www/firewall_rules_edit.php:1062
+#: usr/local/www/firewall_virtual_ip_edit.php:406
+msgid "Type:"
+msgstr "Tipo:"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:459
+#: usr/local/www/firewall_virtual_ip_edit.php:447
+#: usr/local/www/firewall_virtual_ip_edit.php:392
+#: usr/local/www/firewall_virtual_ip_edit.php:384
+#: usr/local/www/firewall_virtual_ip_edit.php:404
+#: usr/local/www/firewall_virtual_ip_edit.php:409
+msgid "Single address"
+msgstr "Endereço único"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:461
+#: usr/local/www/firewall_aliases_edit.php:452
+#: usr/local/www/firewall_aliases_edit.php:624
+#: usr/local/www/firewall_nat_1to1_edit.php:345
+#: usr/local/www/firewall_nat_1to1_edit.php:400
+#: usr/local/www/firewall_nat_edit.php:552
+#: usr/local/www/firewall_nat_edit.php:641
+#: usr/local/www/firewall_nat_out_edit.php:476
+#: usr/local/www/firewall_nat_out_edit.php:511
+#: usr/local/www/firewall_rules_edit.php:872
+#: usr/local/www/firewall_rules_edit.php:965
+#: usr/local/www/system_routes.php:126 usr/local/www/vpn_ipsec_mobile.php:408
+#: usr/local/www/services_igmpproxy_edit.php:223
+#: usr/local/www/vpn_ipsec_phase2.php:428
+#: usr/local/www/vpn_ipsec_phase2.php:470
+#: usr/local/www/services_unbound_acls.php:236
+#: usr/local/www/firewall_nat_1to1_edit.php:352
+#: usr/local/www/firewall_nat_1to1_edit.php:407
+#: usr/local/www/firewall_nat_out_edit.php:489
+#: usr/local/www/firewall_nat_out_edit.php:524
+#: usr/local/www/firewall_rules_edit.php:907
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/services_igmpproxy_edit.php:225
+#: usr/local/www/firewall_aliases_edit.php:455
+#: usr/local/www/firewall_aliases_edit.php:629
+#: usr/local/www/vpn_ipsec_phase2.php:454
+#: usr/local/www/vpn_ipsec_phase2.php:496
+#: usr/local/www/firewall_nat_edit.php:559
+#: usr/local/www/firewall_nat_edit.php:648
+#: usr/local/www/firewall_virtual_ip_edit.php:449
+#: usr/local/www/firewall_nat_1to1_edit.php:350
+#: usr/local/www/firewall_nat_1to1_edit.php:405
+#: usr/local/www/vpn_ipsec_mobile.php:433
+#: usr/local/www/firewall_aliases_edit.php:457
+#: usr/local/www/firewall_aliases_edit.php:632
+#: usr/local/www/vpn_ipsec_phase2.php:520
+#: usr/local/www/vpn_ipsec_phase2.php:556
+#: usr/local/www/vpn_ipsec_phase2.php:598
+#: usr/local/www/firewall_nat_edit.php:558
+#: usr/local/www/firewall_nat_edit.php:647
+#: usr/local/www/firewall_virtual_ip_edit.php:394
+#: usr/local/www/firewall_rules_edit.php:916
+#: usr/local/www/firewall_rules_edit.php:1015
+#: usr/local/www/firewall_nat_edit.php:553
+#: usr/local/www/firewall_nat_edit.php:642
+#: usr/local/www/firewall_virtual_ip_edit.php:386
+#: usr/local/www/system_routes.php:130
+#: usr/local/www/firewall_nat_out_edit.php:493
+#: usr/local/www/firewall_nat_out_edit.php:528
+#: usr/local/www/vpn_ipsec_phase2.php:542
+#: usr/local/www/vpn_ipsec_phase2.php:577
+#: usr/local/www/vpn_ipsec_phase2.php:619
+#: usr/local/www/firewall_rules_edit.php:928
+#: usr/local/www/firewall_rules_edit.php:1028
+#: usr/local/www/firewall_nat_edit.php:565
+#: usr/local/www/firewall_nat_edit.php:654
+#: usr/local/www/firewall_virtual_ip_edit.php:406
+#: usr/local/www/firewall_aliases_edit.php:479
+#: usr/local/www/firewall_aliases_edit.php:663
+#: usr/local/www/firewall_nat_out_edit.php:505
+#: usr/local/www/firewall_nat_out_edit.php:540
+#: usr/local/www/firewall_rules_edit.php:927
+#: usr/local/www/firewall_rules_edit.php:1027
+#: usr/local/www/firewall_nat_edit.php:566
+#: usr/local/www/firewall_nat_edit.php:655 usr/local/www/system_routes.php:146
+#: usr/local/www/firewall_nat_1to1_edit.php:351
+#: usr/local/www/firewall_nat_1to1_edit.php:406
+#: usr/local/www/firewall_nat_out_edit.php:541
+#: usr/local/www/firewall_rules_edit.php:975
+#: usr/local/www/firewall_rules_edit.php:1075
+#: usr/local/www/firewall_virtual_ip_edit.php:411
+#: usr/local/www/firewall_aliases_edit.php:478
+#: usr/local/www/firewall_aliases_edit.php:662
+msgid "Network"
+msgstr "Rede"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:467
+#: usr/local/www/firewall_nat_1to1_edit.php:367
+#: usr/local/www/firewall_nat_1to1_edit.php:422
+#: usr/local/www/firewall_nat_edit.php:575
+#: usr/local/www/firewall_nat_edit.php:685
+#: usr/local/www/firewall_nat_out_edit.php:479
+#: usr/local/www/firewall_nat_out_edit.php:515
+#: usr/local/www/firewall_nat_out_edit.php:542
+#: usr/local/www/firewall_rules_edit.php:895
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/vpn_ipsec_phase2.php:440
+#: usr/local/www/firewall_nat_npt_edit.php:216
+#: usr/local/www/firewall_nat_npt_edit.php:244
+#: usr/local/www/firewall_nat_1to1_edit.php:374
+#: usr/local/www/firewall_nat_1to1_edit.php:429
+#: usr/local/www/firewall_nat_npt_edit.php:221
+#: usr/local/www/firewall_nat_npt_edit.php:249
+#: usr/local/www/firewall_nat_out_edit.php:492
+#: usr/local/www/firewall_nat_out_edit.php:528
+#: usr/local/www/firewall_nat_out_edit.php:555
+#: usr/local/www/firewall_rules_edit.php:930
+#: usr/local/www/firewall_rules_edit.php:1023
+#: usr/local/www/vpn_ipsec_phase2.php:466
+#: usr/local/www/firewall_nat_edit.php:582
+#: usr/local/www/firewall_nat_edit.php:692
+#: usr/local/www/firewall_virtual_ip_edit.php:455
+#: usr/local/www/firewall_nat_1to1_edit.php:372
+#: usr/local/www/firewall_nat_1to1_edit.php:427
+#: usr/local/www/firewall_nat_npt_edit.php:220
+#: usr/local/www/firewall_nat_npt_edit.php:248
+#: usr/local/www/vpn_ipsec_phase2.php:532
+#: usr/local/www/vpn_ipsec_phase2.php:568
+#: usr/local/www/firewall_nat_edit.php:581
+#: usr/local/www/firewall_nat_edit.php:691
+#: usr/local/www/firewall_virtual_ip_edit.php:400
+#: usr/local/www/firewall_rules_edit.php:939
+#: usr/local/www/firewall_rules_edit.php:1038
+#: usr/local/www/firewall_nat_edit.php:576
+#: usr/local/www/firewall_nat_edit.php:686
+#: usr/local/www/firewall_virtual_ip_edit.php:392
+#: usr/local/www/firewall_nat_out_edit.php:496
+#: usr/local/www/firewall_nat_out_edit.php:532
+#: usr/local/www/firewall_nat_out_edit.php:559
+#: usr/local/www/vpn_ipsec_phase2.php:553
+#: usr/local/www/vpn_ipsec_phase2.php:589
+#: usr/local/www/firewall_rules_edit.php:951
+#: usr/local/www/firewall_rules_edit.php:1051
+#: usr/local/www/firewall_nat_edit.php:588
+#: usr/local/www/firewall_nat_edit.php:698
+#: usr/local/www/firewall_virtual_ip_edit.php:412
+#: usr/local/www/firewall_nat_out_edit.php:508
+#: usr/local/www/firewall_nat_out_edit.php:544
+#: usr/local/www/firewall_nat_out_edit.php:571
+#: usr/local/www/firewall_rules_edit.php:950
+#: usr/local/www/firewall_rules_edit.php:1050
+#: usr/local/www/firewall_nat_edit.php:589
+#: usr/local/www/firewall_nat_edit.php:699
+#: usr/local/www/firewall_nat_npt_edit.php:219
+#: usr/local/www/firewall_nat_npt_edit.php:247
+#: usr/local/www/firewall_nat_1to1_edit.php:373
+#: usr/local/www/firewall_nat_1to1_edit.php:428
+#: usr/local/www/firewall_nat_out_edit.php:510
+#: usr/local/www/firewall_nat_out_edit.php:545
+#: usr/local/www/firewall_rules_edit.php:998
+#: usr/local/www/firewall_rules_edit.php:1098
+#: usr/local/www/firewall_virtual_ip_edit.php:417
+msgid "Address:"
+msgstr "Endereço:"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:479
+#: usr/local/www/firewall_virtual_ip_edit.php:467
+#: usr/local/www/firewall_virtual_ip_edit.php:412
+#: usr/local/www/firewall_virtual_ip_edit.php:404
+#: usr/local/www/firewall_virtual_ip_edit.php:424
+#: usr/local/www/firewall_virtual_ip_edit.php:429
+msgid "Expansion:"
+msgstr "Expansão:"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:499
+#: usr/local/www/firewall_virtual_ip_edit.php:487
+#: usr/local/www/firewall_virtual_ip_edit.php:432
+#: usr/local/www/firewall_virtual_ip_edit.php:424
+#: usr/local/www/firewall_virtual_ip_edit.php:444
+#: usr/local/www/firewall_virtual_ip_edit.php:449
+msgid "Virtual IP Password"
+msgstr "Senha de IP Virtual"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:501
+#: usr/local/www/firewall_virtual_ip_edit.php:489
+#: usr/local/www/firewall_virtual_ip_edit.php:434
+#: usr/local/www/firewall_virtual_ip_edit.php:426
+#: usr/local/www/firewall_virtual_ip_edit.php:446
+#: usr/local/www/firewall_virtual_ip_edit.php:451
+msgid "Enter the VHID group password."
+msgstr "Informe a senha de grupo VHID."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:505
+#: usr/local/www/firewall_virtual_ip_edit.php:493
+#: usr/local/www/firewall_virtual_ip_edit.php:438
+#: usr/local/www/firewall_virtual_ip_edit.php:430
+#: usr/local/www/firewall_virtual_ip_edit.php:450
+#: usr/local/www/firewall_virtual_ip_edit.php:455
+msgid "VHID Group"
+msgstr "Grupo VHID"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:513
+#: usr/local/www/firewall_virtual_ip_edit.php:501
+#: usr/local/www/firewall_virtual_ip_edit.php:446
+#: usr/local/www/firewall_virtual_ip_edit.php:438
+#: usr/local/www/firewall_virtual_ip_edit.php:458
+#: usr/local/www/firewall_virtual_ip_edit.php:463
+msgid "Enter the VHID group that the machines will share"
+msgstr "Informe o grupo VHID que a máquina irá compartilhar"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:517
+#: usr/local/www/firewall_virtual_ip_edit.php:505
+#: usr/local/www/firewall_virtual_ip_edit.php:450
+#: usr/local/www/firewall_virtual_ip_edit.php:442
+#: usr/local/www/firewall_virtual_ip_edit.php:462
+#: usr/local/www/firewall_virtual_ip_edit.php:467
+msgid "Advertising Frequency"
+msgstr "Frequência de anúncio"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:534
+#: usr/local/www/firewall_virtual_ip_edit.php:522
+#: usr/local/www/firewall_virtual_ip_edit.php:467
+#: usr/local/www/firewall_virtual_ip_edit.php:459
+#: usr/local/www/firewall_virtual_ip_edit.php:479
+#: usr/local/www/firewall_virtual_ip_edit.php:484
+msgid "The frequency that this machine will advertise. 0 means usually master. Otherwise the lowest combination of both values in the cluster determines the master."
+msgstr "A frequência em que essa máquina irá anunciar. 0 normalmente significa master. Caso contrário, a menor combinação dos dois valores no cluster determinará o master."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:557
+#: usr/local/www/diag_logs_settings.php:326
+#: usr/local/www/diag_packet_capture.php:195
+#: usr/local/www/services_dyndns.php:160 usr/local/www/services_wol.php:210
+#: usr/local/www/interfaces_bridge.php:144
+#: usr/local/www/interfaces_bridge_edit.php:446
+#: usr/local/www/interfaces_bridge_edit.php:490
+#: usr/local/www/interfaces_bridge_edit.php:534
+#: usr/local/www/interfaces_gif.php:132 usr/local/www/interfaces_gre.php:133
+#: usr/local/www/interfaces_groups.php:148
+#: usr/local/www/firewall_aliases.php:229
+#: usr/local/www/firewall_nat_1to1.php:179
+#: usr/local/www/firewall_nat_out.php:459
+#: usr/local/www/firewall_schedule.php:240 usr/local/www/diag_backup.php:655
+#: usr/local/www/firewall_virtual_ip.php:241 usr/local/www/interfaces.php:1845
+#: usr/local/www/interfaces_vlan.php:134 usr/local/www/system_routes.php:188
+#: usr/local/www/interfaces_lagg.php:138
+#: usr/local/www/interfaces_ppps_edit.php:620
+#: usr/local/www/interfaces_qinq.php:151
+#: usr/local/www/load_balancer_virtual_server_edit.php:289
+#: usr/local/www/services_captiveportal.php:929
+#: usr/local/www/services_captiveportal_filemanager.php:215
+#: usr/local/www/diag_ipsec.php:163 usr/local/www/diag_ipsec_sad.php:134
+#: usr/local/www/services_captiveportal_ip.php:170
+#: usr/local/www/services_captiveportal_mac.php:190
+#: usr/local/www/diag_ipsec_spd.php:143 usr/local/www/services_dhcp.php:715
+#: usr/local/www/services_dhcp.php:876 usr/local/www/services_dnsmasq.php:214
+#: usr/local/www/services_captiveportal_hostname.php:171
+#: usr/local/www/services_captiveportal_vouchers.php:603
+#: usr/local/www/diag_routes.php:72
+#: usr/local/www/status_rrd_graph_settings.php:236
+#: usr/local/www/services_dyndns_edit.php:189
+#: usr/local/www/services_dyndns_edit.php:245
+#: usr/local/www/services_igmpproxy.php:161
+#: usr/local/www/services_rfc2136_edit.php:209
+#: usr/local/www/system_advanced_admin.php:289
+#: usr/local/www/system_gateway_groups.php:195 usr/local/www/vpn_l2tp.php:451
+#: usr/local/www/services_dhcpv6.php:789
+#: usr/local/www/diag_logs_settings.php:333
+#: usr/local/www/services_captiveportal_vouchers.php:610
+#: usr/local/www/services_dyndns_edit.php:272
+#: usr/local/www/services_dyndns_edit.php:376
+#: usr/local/www/firewall_nat_out.php:470 usr/local/www/system_routes.php:199
+#: usr/local/www/status_rrd_graph_settings.php:237
+#: usr/local/www/diag_ipsec.php:221 usr/local/www/diag_backup.php:736
+#: usr/local/www/services_unbound.php:253
+#: usr/local/www/services_captiveportal.php:974
+#: usr/local/www/services_dyndns.php:181 usr/local/www/services_dhcp.php:728
+#: usr/local/www/services_dhcp.php:751 usr/local/www/services_dhcp.php:914
+#: usr/local/www/load_balancer_virtual_server_edit.php:278
+#: usr/local/www/interfaces_bridge_edit.php:455
+#: usr/local/www/interfaces_bridge_edit.php:499
+#: usr/local/www/interfaces_bridge_edit.php:543
+#: usr/local/www/firewall_aliases.php:232
+#: usr/local/www/diag_packet_capture.php:215 usr/local/www/interfaces.php:2023
+#: usr/local/www/firewall_virtual_ip_edit.php:545
+#: usr/local/www/services_dhcpv6.php:732 usr/local/www/services_dhcpv6.php:884
+#: usr/local/www/diag_logs_settings.php:353
+#: usr/local/www/services_dnsmasq.php:215
+#: usr/local/www/services_captiveportal_vouchers.php:624
+#: usr/local/www/firewall_nat_out.php:471
+#: usr/local/www/services_captiveportal_ip.php:168
+#: usr/local/www/interfaces_groups.php:149 usr/local/www/diag_ipsec.php:222
+#: usr/local/www/interfaces_qinq.php:152 usr/local/www/diag_ipsec_sad.php:135
+#: usr/local/www/services_captiveportal_mac.php:188
+#: usr/local/www/interfaces_bridge.php:145
+#: usr/local/www/interfaces_ppps_edit.php:621
+#: usr/local/www/interfaces_lagg.php:139
+#: usr/local/www/services_captiveportal_hostname.php:169
+#: usr/local/www/interfaces_gre.php:134 usr/local/www/diag_routes.php:73
+#: usr/local/www/system_gateway_groups.php:196
+#: usr/local/www/services_captiveportal.php:970
+#: usr/local/www/services_captiveportal_filemanager.php:212
+#: usr/local/www/services_dhcp.php:907 usr/local/www/services_dhcp.php:932
+#: usr/local/www/services_dhcp.php:1118
+#: usr/local/www/load_balancer_virtual_server_edit.php:276
+#: usr/local/www/interfaces_bridge_edit.php:456
+#: usr/local/www/interfaces_bridge_edit.php:500
+#: usr/local/www/interfaces_bridge_edit.php:544
+#: usr/local/www/firewall_aliases.php:284
+#: usr/local/www/diag_packet_capture.php:262
+#: usr/local/www/interfaces_vlan.php:135 usr/local/www/interfaces.php:2011
+#: usr/local/www/vpn_l2tp.php:452
+#: usr/local/www/firewall_virtual_ip_edit.php:490
+#: usr/local/www/interfaces_gif.php:133 usr/local/www/diag_ipsec_spd.php:144
+#: usr/local/www/firewall_virtual_ip.php:247
+#: usr/local/www/services_dhcpv6.php:663 usr/local/www/services_dhcpv6.php:815
+#: usr/local/www/vpn_l2tp.php:455 usr/local/www/services_dyndns_edit.php:276
+#: usr/local/www/services_dyndns_edit.php:380
+#: usr/local/www/interfaces_qinq.php:155
+#: usr/local/www/interfaces_ppps_edit.php:627
+#: usr/local/www/firewall_virtual_ip.php:267
+#: usr/local/www/interfaces_lagg.php:143 usr/local/www/interfaces_vlan.php:141
+#: usr/local/www/firewall_virtual_ip_edit.php:482
+#: usr/local/www/diag_ipsec.php:223 usr/local/www/interfaces_bridge.php:151
+#: usr/local/www/services_captiveportal_vouchers.php:633
+#: usr/local/www/system_routes.php:203 usr/local/www/services_dhcp.php:921
+#: usr/local/www/services_dhcp.php:946 usr/local/www/services_dhcp.php:1131
+#: usr/local/www/services_dhcpv6.php:680 usr/local/www/services_dhcpv6.php:832
+#: usr/local/www/firewall_nat_out.php:468
+#: usr/local/www/services_captiveportal.php:972
+#: usr/local/www/diag_backup.php:741
+#: usr/local/www/interfaces_bridge_edit.php:457
+#: usr/local/www/interfaces_bridge_edit.php:501
+#: usr/local/www/interfaces_bridge_edit.php:545
+#: usr/local/www/services_dnsmasq.php:240
+#: usr/local/www/services_captiveportal_mac.php:198
+#: usr/local/www/interfaces_gre.php:138 usr/local/www/interfaces_gif.php:137
+#: usr/local/www/interfaces.php:2038
+#: usr/local/www/services_dyndns_edit.php:278
+#: usr/local/www/services_dyndns_edit.php:388
+#: usr/local/www/firewall_aliases.php:287
+#: usr/local/www/firewall_virtual_ip_edit.php:501
+#: usr/local/www/diag_packet_capture.php:279
+#: usr/local/www/services_dhcp.php:941 usr/local/www/services_dhcp.php:966
+#: usr/local/www/services_dhcp.php:1151 usr/local/www/firewall_nat_out.php:475
+#: usr/local/www/services_captiveportal.php:988
+#: usr/local/www/services_dnsmasq.php:253
+#: usr/local/www/services_dyndns.php:177
+#: usr/local/www/system_gateway_groups.php:205
+#: usr/local/www/interfaces.php:2084
+#: usr/local/www/interfaces_ppps_edit.php:625
+#: usr/local/www/firewall_virtual_ip.php:290
+#: usr/local/www/firewall_aliases.php:288 usr/local/www/system_routes.php:219
+#: usr/local/www/firewall_nat_out.php:474
+#: usr/local/www/interfaces_bridge_edit.php:461
+#: usr/local/www/interfaces_bridge_edit.php:505
+#: usr/local/www/interfaces_bridge_edit.php:549
+#: usr/local/www/services_dnsmasq.php:317 usr/local/www/interfaces.php:2073
+#: usr/local/www/services_captiveportal_vouchers.php:638
+#: usr/local/www/diag_logs_settings.php:384
+#: usr/local/www/services_dyndns_edit.php:279
+#: usr/local/www/services_dyndns_edit.php:389
+#: usr/local/www/firewall_virtual_ip.php:298
+#: usr/local/www/firewall_virtual_ip_edit.php:506
+#: usr/local/www/services_dhcp.php:953 usr/local/www/services_dhcp.php:978
+#: usr/local/www/services_dhcp.php:1163 usr/local/www/diag_backup.php:742
+#: usr/local/www/services_rfc2136_edit.php:222
+#: usr/local/www/services_dyndns.php:188 usr/local/www/interfaces.php:2109
+msgid "Note:"
+msgstr "Nota:"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:559
+#: usr/local/www/firewall_virtual_ip_edit.php:547
+#: usr/local/www/firewall_virtual_ip_edit.php:492
+#: usr/local/www/firewall_virtual_ip_edit.php:484
+#: usr/local/www/firewall_virtual_ip_edit.php:503
+#: usr/local/www/firewall_virtual_ip_edit.php:508
+msgid "Proxy ARP and Other type Virtual IPs cannot be bound to by anything running on the firewall, such as IPsec, OpenVPN, etc. Use a CARP or IP Alias type address for these cases."
+msgstr "IPs virtuais do tipo Proxy ARP e Outros não podem ser vinculados a nada rodando no firewall, como IPsec, OpenVPN, etc. Utilize endereços do tipo CARP ou Alis de IP para estes casos."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:560
+#: usr/local/www/firewall_virtual_ip_edit.php:548
+#: usr/local/www/firewall_virtual_ip_edit.php:493
+#: usr/local/www/firewall_virtual_ip_edit.php:485
+#: usr/local/www/firewall_virtual_ip_edit.php:504
+#: usr/local/www/firewall_virtual_ip_edit.php:509
+msgid "For more information on CARP and the above values, visit the OpenBSD "
+msgstr "Para mais informações sobre CARP e os valores acima, visite o OpenBSD "
+
+#: usr/local/www/firewall_virtual_ip_edit.php:560
+#: usr/local/www/firewall_virtual_ip_edit.php:548
+#: usr/local/www/firewall_virtual_ip_edit.php:493
+#: usr/local/www/firewall_virtual_ip_edit.php:485
+#: usr/local/www/firewall_virtual_ip_edit.php:504
+#: usr/local/www/firewall_virtual_ip_edit.php:509
+msgid "CARP FAQ"
+msgstr "FAQ do CARP"
+
+#: usr/local/www/load_balancer_relay_action.php:74
+msgid "This entry cannot be deleted because it is still referenced by at least one relay protocol."
+msgstr "Essa entrada não pode ser apagada porque ela ainda é referenciada por pelo menos um protocolo relay."
+
+#: usr/local/www/load_balancer_relay_action.php:104
+#: usr/local/www/load_balancer_relay_action_edit.php:180
+msgid "Relay Action"
+msgstr "Ação Relay"
+
+#: usr/local/www/load_balancer_relay_action.php:118
+#: usr/local/www/load_balancer_relay_action.php:116
+msgid "The load balancer configuration has been changed.<br>You must apply the changes in order for them to take effect."
+msgstr "A configuração do balanceador de carga foi modificada.<br>Você deve aplicar as mudanças para que elas tenham efeito."
+
+#: usr/local/www/load_balancer_relay_action.php:128
+#: usr/local/www/load_balancer_relay_action.php:126
+msgid "Relay Actions"
+msgstr "Ações Relay"
+
+#: usr/local/www/load_balancer_relay_action.php:129
+#: usr/local/www/load_balancer_relay_action.php:127
+msgid "Relay Protocols"
+msgstr "Protocolos Relay"
+
+#: usr/local/www/load_balancer_relay_action.php:142
+#: usr/local/www/interfaces_qinq_edit.php:318
+#: usr/local/www/load_balancer_relay_action_edit.php:515
+#: usr/local/www/load_balancer_relay_action_edit.php:535
+#: usr/local/www/load_balancer_relay_protocol.php:136
+#: usr/local/www/load_balancer_relay_action_edit.php:514
+#: usr/local/www/load_balancer_relay_action_edit.php:534
+#: usr/local/www/interfaces_qinq_edit.php:319
+#: usr/local/www/load_balancer_relay_action_edit.php:512
+#: usr/local/www/load_balancer_relay_action_edit.php:532
+#: usr/local/www/load_balancer_relay_protocol.php:134
+#: usr/local/www/load_balancer_relay_action.php:140
+#: usr/local/www/interfaces_qinq_edit.php:322
+msgid "Options"
+msgstr "Opções"
+
+#: usr/local/www/diag_defaults.php:51
+msgid "The system has been reset to factory defaults and is now rebooting. This may take one minute."
+msgstr "O sistema foi restaurado para o padrão de fabrica e está sendo reiniciado agora. Isto pode levar uns minutos."
+
+#: usr/local/www/diag_defaults.php:58 usr/local/www/diag_defaults.php:52
+msgid "Factory defaults"
+msgstr "Padrão de fábrica"
+
+#: usr/local/www/diag_defaults.php:67 usr/local/www/diag_defaults.php:70
+msgid "If you click"
+msgstr "Se você clicar"
+
+#: usr/local/www/diag_defaults.php:67 usr/local/www/diag_defaults.php:81
+#: usr/local/www/crash_reporter.php:76 usr/local/www/halt.php:69
+#: usr/local/www/pkg.php:342 usr/local/www/system_firmware.php:229
+#: usr/local/www/reboot.php:61 usr/local/www/reboot.php:72
+#: usr/local/www/pkg.php:424 usr/local/www/reboot.php:53
+#: usr/local/www/reboot.php:64 usr/local/www/halt.php:60
+#: usr/local/www/system_firmware.php:236 usr/local/www/system_firmware.php:239
+#: usr/local/www/diag_defaults.php:60 usr/local/www/diag_defaults.php:70
+#: usr/local/www/diag_defaults.php:82
+msgid "Yes"
+msgstr "Sim"
+
+#: usr/local/www/diag_defaults.php:67 usr/local/www/diag_defaults.php:70
+msgid "the firewall will:"
+msgstr "o firewall irá:"
+
+#: usr/local/www/diag_defaults.php:70 usr/local/www/diag_defaults.php:72
+msgid "Reset to factory defaults"
+msgstr "Restaurar o padrão de fábrica"
+
+#: usr/local/www/diag_defaults.php:71 usr/local/www/diag_defaults.php:73
+msgid "LAN IP address will be reset to 192.168.1.1"
+msgstr "Endereço IP da LAN será redefinido para 192.168.1.1"
+
+#: usr/local/www/diag_defaults.php:72 usr/local/www/diag_defaults.php:74
+msgid "System will be configured as a DHCP server on the default LAN interface"
+msgstr "O sistema será configurado como um servidor DHCP na interface LAN padrão"
+
+#: usr/local/www/diag_defaults.php:73 usr/local/www/diag_defaults.php:75
+msgid "Reboot after changes are installed"
+msgstr "Reiniciar após instalar alterações"
+
+#: usr/local/www/diag_defaults.php:74 usr/local/www/diag_defaults.php:76
+msgid "WAN interface will be set to obtain an address automatically from a DHCP server"
+msgstr "Interface WAN será definida para obter um endereço automaticamente de um servidor DHCP"
+
+#: usr/local/www/diag_defaults.php:75 usr/local/www/diag_defaults.php:77
+msgid "webConfigurator admin username will be reset to 'admin'"
+msgstr "Usuário admin do webConfigurator será redefinido para 'admin'"
+
+#: usr/local/www/diag_defaults.php:76 usr/local/www/diag_defaults.php:78
+msgid "webConfigurator admin password will be reset to"
+msgstr "Senha para webConfigurator admin será redefinida para"
+
+#: usr/local/www/diag_defaults.php:79 usr/local/www/diag_defaults.php:80
+msgid "Are you sure you want to proceed?"
+msgstr "Você tem certeza que deseja prosseguir?"
+
+#: usr/local/www/diag_defaults.php:82 usr/local/www/crash_reporter.php:77
+#: usr/local/www/halt.php:70 usr/local/www/pkg.php:340
+#: usr/local/www/system_firmware.php:230 usr/local/www/reboot.php:62
+#: usr/local/www/pkg.php:422 usr/local/www/reboot.php:43
+#: usr/local/www/reboot.php:65 usr/local/www/halt.php:49
+#: usr/local/www/system_firmware.php:237 usr/local/www/system_firmware.php:240
+#: usr/local/www/diag_defaults.php:47 usr/local/www/diag_defaults.php:83
+msgid "No"
+msgstr "Não"
+
+#: usr/local/www/diag_logs.php:65 usr/local/www/diag_logs_auth.php:54
+#: usr/local/www/diag_logs_dhcp.php:59 usr/local/www/diag_logs_filter.php:90
+#: usr/local/www/diag_logs_filter_dynamic.php:61
+#: usr/local/www/diag_logs_ipsec.php:91 usr/local/www/diag_logs_ntpd.php:54
+#: usr/local/www/diag_logs_openvpn.php:45
+#: usr/local/www/diag_logs_settings.php:132 usr/local/www/diag_logs_vpn.php:44
+#: usr/local/www/diag_logs_filter_summary.php:34
+#: usr/local/www/diag_logs_ppp.php:59 usr/local/www/diag_logs_relayd.php:55
+#: usr/local/www/diag_logs_wireless.php:56
+#: usr/local/www/diag_logs_routing.php:54
+#: usr/local/www/diag_logs_settings.php:136
+#: usr/local/www/diag_logs_resolver.php:66
+#: usr/local/www/diag_logs_gateways.php:66
+#: usr/local/www/diag_logs_settings.php:143
+#: usr/local/www/diag_logs_filter.php:79 usr/local/www/diag_logs_ppp.php:57
+#: usr/local/www/diag_logs_filter.php:109
+#: usr/local/www/diag_logs_settings.php:162
+msgid "System logs"
+msgstr "Registros do sistema"
+
+#: usr/local/www/diag_logs.php:79 usr/local/www/diag_logs_auth.php:67
+#: usr/local/www/diag_logs_dhcp.php:59 usr/local/www/diag_logs_dhcp.php:72
+#: usr/local/www/diag_logs_filter.php:103
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_ipsec.php:104 usr/local/www/diag_logs_ntpd.php:67
+#: usr/local/www/diag_logs_openvpn.php:71
+#: usr/local/www/diag_logs_settings.php:212
+#: usr/local/www/diag_logs_vpn.php:128 usr/local/www/interfaces.php:1032
+#: usr/local/www/diag_logs_filter_summary.php:186
+#: usr/local/www/diag_logs_ppp.php:72 usr/local/www/diag_logs_relayd.php:68
+#: usr/local/www/services_dhcp_edit.php:190
+#: usr/local/www/diag_logs_wireless.php:69
+#: usr/local/www/diag_logs_routing.php:67
+#: usr/local/www/diag_logs_settings.php:217
+#: usr/local/www/diag_logs_resolver.php:80
+#: usr/local/www/diag_logs_gateways.php:80
+#: usr/local/www/services_dhcp_edit.php:193 usr/local/www/interfaces.php:1118
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/diag_logs_routing.php:68
+#: usr/local/www/diag_logs_settings.php:224
+#: usr/local/www/diag_logs_relayd.php:69 usr/local/www/diag_logs_auth.php:68
+#: usr/local/www/diag_logs_ipsec.php:105
+#: usr/local/www/diag_logs_resolver.php:81 usr/local/www/diag_logs_ntpd.php:68
+#: usr/local/www/diag_logs_dhcp.php:73 usr/local/www/diag_logs_wireless.php:70
+#: usr/local/www/diag_logs_filter_summary.php:187
+#: usr/local/www/diag_logs_gateways.php:81
+#: usr/local/www/diag_logs_openvpn.php:72 usr/local/www/interfaces.php:1106
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_filter.php:93
+#: usr/local/www/services_dhcp_edit.php:301
+#: usr/local/www/diag_logs_filter_dynamic.php:99
+#: usr/local/www/diag_logs_ppp.php:70 usr/local/www/interfaces.php:1120
+#: usr/local/www/diag_logs_filter.php:123 usr/local/www/interfaces.php:1162
+#: usr/local/www/interfaces.php:1157 usr/local/www/diag_logs_settings.php:243
+#: usr/local/www/interfaces.php:1170
+msgid "DHCP"
+msgstr "DHCP"
+
+#: usr/local/www/diag_logs.php:80 usr/local/www/diag_logs_auth.php:54
+#: usr/local/www/diag_logs_auth.php:68 usr/local/www/diag_logs_dhcp.php:73
+#: usr/local/www/diag_logs_filter.php:104
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_ipsec.php:105 usr/local/www/diag_logs_ntpd.php:68
+#: usr/local/www/diag_logs_openvpn.php:72
+#: usr/local/www/diag_logs_settings.php:213
+#: usr/local/www/diag_logs_vpn.php:129
+#: usr/local/www/diag_logs_filter_summary.php:187
+#: usr/local/www/diag_logs_ppp.php:73 usr/local/www/diag_logs_relayd.php:69
+#: usr/local/www/diag_logs_wireless.php:70
+#: usr/local/www/diag_logs_routing.php:68
+#: usr/local/www/diag_logs_settings.php:218
+#: usr/local/www/diag_logs_resolver.php:81
+#: usr/local/www/diag_logs_gateways.php:81
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_routing.php:69
+#: usr/local/www/diag_logs_settings.php:225
+#: usr/local/www/diag_logs_relayd.php:70 usr/local/www/diag_logs_auth.php:69
+#: usr/local/www/diag_logs_ipsec.php:106
+#: usr/local/www/diag_logs_resolver.php:82 usr/local/www/diag_logs_ntpd.php:69
+#: usr/local/www/diag_logs_dhcp.php:74 usr/local/www/diag_logs_wireless.php:71
+#: usr/local/www/diag_logs_filter_summary.php:188
+#: usr/local/www/diag_logs_gateways.php:82
+#: usr/local/www/diag_logs_openvpn.php:73
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_filter.php:94
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/diag_logs_ppp.php:71 usr/local/www/diag_logs_filter.php:124
+#: usr/local/www/diag_logs_settings.php:244
+msgid "Portal Auth"
+msgstr "Portal Autorização"
+
+#: usr/local/www/diag_logs.php:81 usr/local/www/diag_logs_auth.php:69
+#: usr/local/www/diag_logs_dhcp.php:74 usr/local/www/diag_logs_filter.php:105
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_ipsec.php:106 usr/local/www/diag_logs_ntpd.php:69
+#: usr/local/www/diag_logs_openvpn.php:73
+#: usr/local/www/diag_logs_settings.php:214
+#: usr/local/www/diag_logs_vpn.php:130
+#: usr/local/www/diag_logs_filter_summary.php:188
+#: usr/local/www/vpn_ipsec.php:119 usr/local/www/diag_logs_ppp.php:74
+#: usr/local/www/diag_logs_relayd.php:70
+#: usr/local/www/vpn_ipsec_mobile.php:220 usr/local/www/diag_ipsec.php:48
+#: usr/local/www/diag_ipsec_sad.php:49 usr/local/www/diag_ipsec_spd.php:49
+#: usr/local/www/fbegin.inc:147 usr/local/www/fbegin.inc:164
+#: usr/local/www/vpn_ipsec_phase1.php:358
+#: usr/local/www/vpn_ipsec_phase1.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:255
+#: usr/local/www/vpn_ipsec_phase2.php:257
+#: usr/local/www/diag_logs_wireless.php:71
+#: usr/local/www/diag_logs_routing.php:69
+#: usr/local/www/diag_logs_settings.php:219 usr/local/www/fbegin.inc:181
+#: usr/local/www/diag_logs_resolver.php:82
+#: usr/local/www/vpn_ipsec_phase2.php:268
+#: usr/local/www/vpn_ipsec_phase2.php:270
+#: usr/local/www/diag_logs_gateways.php:82
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_routing.php:70
+#: usr/local/www/diag_logs_settings.php:226 usr/local/www/fbegin.inc:172
+#: usr/local/www/fbegin.inc:189 usr/local/www/diag_logs_relayd.php:71
+#: usr/local/www/vpn_ipsec_mobile.php:240 usr/local/www/diag_logs_auth.php:70
+#: usr/local/www/diag_logs_ipsec.php:107
+#: usr/local/www/diag_logs_resolver.php:83 usr/local/www/diag_logs_ntpd.php:70
+#: usr/local/www/diag_logs_dhcp.php:75 usr/local/www/diag_logs_wireless.php:72
+#: usr/local/www/diag_logs_filter_summary.php:189
+#: usr/local/www/vpn_ipsec_phase2.php:294
+#: usr/local/www/vpn_ipsec_phase2.php:296
+#: usr/local/www/diag_logs_gateways.php:83
+#: usr/local/www/diag_logs_openvpn.php:74
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_filter.php:95 usr/local/www/vpn_ipsec.php:125
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_ppp.php:72 usr/local/www/fbegin.inc:163
+#: usr/local/www/fbegin.inc:180 usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase1.php:381
+#: usr/local/www/vpn_ipsec_phase2.php:316
+#: usr/local/www/vpn_ipsec_phase2.php:318
+#: usr/local/www/diag_logs_filter.php:125
+#: usr/local/www/diag_logs_settings.php:245
+msgid "IPsec"
+msgstr "IPsec"
+
+#: usr/local/www/diag_logs.php:82 usr/local/www/diag_logs_auth.php:70
+#: usr/local/www/diag_logs_dhcp.php:75 usr/local/www/diag_logs_filter.php:106
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_ipsec.php:107 usr/local/www/diag_logs_ntpd.php:70
+#: usr/local/www/diag_logs_openvpn.php:74
+#: usr/local/www/diag_logs_settings.php:215
+#: usr/local/www/diag_logs_vpn.php:131 usr/local/www/interfaces.php:1032
+#: usr/local/www/diag_logs_filter_summary.php:189
+#: usr/local/www/diag_logs_ppp.php:59 usr/local/www/diag_logs_ppp.php:75
+#: usr/local/www/diag_logs_relayd.php:71
+#: usr/local/www/status_interfaces.php:154
+#: usr/local/www/diag_logs_wireless.php:72
+#: usr/local/www/diag_logs_routing.php:70
+#: usr/local/www/diag_logs_settings.php:220
+#: usr/local/www/status_interfaces.php:172
+#: usr/local/www/diag_logs_resolver.php:83
+#: usr/local/www/diag_logs_gateways.php:83 usr/local/www/interfaces.php:1118
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_routing.php:71
+#: usr/local/www/diag_logs_settings.php:227
+#: usr/local/www/diag_logs_relayd.php:72
+#: usr/local/www/status_interfaces.php:175 usr/local/www/diag_logs_auth.php:71
+#: usr/local/www/diag_logs_ipsec.php:108
+#: usr/local/www/diag_logs_resolver.php:84 usr/local/www/diag_logs_ntpd.php:71
+#: usr/local/www/diag_logs_dhcp.php:76 usr/local/www/diag_logs_wireless.php:73
+#: usr/local/www/diag_logs_filter_summary.php:190
+#: usr/local/www/diag_logs_gateways.php:84
+#: usr/local/www/diag_logs_openvpn.php:75 usr/local/www/interfaces.php:1106
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_filter.php:96
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_ppp.php:57 usr/local/www/diag_logs_ppp.php:73
+#: usr/local/www/interfaces.php:1120 usr/local/www/diag_logs_filter.php:126
+#: usr/local/www/interfaces.php:1162 usr/local/www/interfaces.php:1157
+#: usr/local/www/diag_logs_settings.php:246 usr/local/www/interfaces.php:1170
+msgid "PPP"
+msgstr "PPP"
+
+#: usr/local/www/diag_logs.php:83 usr/local/www/diag_logs_auth.php:71
+#: usr/local/www/diag_logs_dhcp.php:76 usr/local/www/diag_logs_filter.php:107
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: usr/local/www/diag_logs_ipsec.php:108 usr/local/www/diag_logs_ntpd.php:71
+#: usr/local/www/diag_logs_openvpn.php:75
+#: usr/local/www/diag_logs_settings.php:216 usr/local/www/diag_logs_vpn.php:44
+#: usr/local/www/diag_logs_vpn.php:132
+#: usr/local/www/diag_logs_filter_summary.php:190
+#: usr/local/www/vpn_ipsec.php:119 usr/local/www/diag_logs_ppp.php:76
+#: usr/local/www/diag_logs_relayd.php:72
+#: usr/local/www/vpn_ipsec_mobile.php:220 usr/local/www/vpn_pppoe.php:86
+#: usr/local/www/vpn_pptp.php:193 usr/local/www/vpn_pptp_users.php:71
+#: usr/local/www/vpn_pptp_users_edit.php:135 usr/local/www/fbegin.inc:351
+#: usr/local/www/status_rrd_graph_settings.php:151
+#: usr/local/www/vpn_ipsec_phase1.php:358
+#: usr/local/www/vpn_ipsec_phase1.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:255
+#: usr/local/www/vpn_ipsec_phase2.php:257 usr/local/www/vpn_l2tp.php:38
+#: usr/local/www/vpn_l2tp_users.php:38
+#: usr/local/www/vpn_l2tp_users_edit.php:38
+#: usr/local/www/diag_logs_wireless.php:73
+#: usr/local/www/diag_logs_routing.php:71
+#: usr/local/www/diag_logs_settings.php:221 usr/local/www/fbegin.inc:369
+#: usr/local/www/status_rrd_graph_settings.php:152
+#: usr/local/www/diag_logs_resolver.php:84
+#: usr/local/www/vpn_ipsec_phase2.php:268
+#: usr/local/www/vpn_ipsec_phase2.php:270
+#: usr/local/www/diag_logs_gateways.php:84
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_routing.php:72
+#: usr/local/www/diag_logs_settings.php:228 usr/local/www/fbegin.inc:315
+#: usr/local/www/diag_logs_relayd.php:73
+#: usr/local/www/vpn_ipsec_mobile.php:240 usr/local/www/diag_logs_auth.php:72
+#: usr/local/www/diag_logs_ipsec.php:109
+#: usr/local/www/diag_logs_resolver.php:85 usr/local/www/diag_logs_ntpd.php:72
+#: usr/local/www/diag_logs_dhcp.php:77 usr/local/www/diag_logs_wireless.php:74
+#: usr/local/www/diag_logs_filter_summary.php:191
+#: usr/local/www/vpn_ipsec_phase2.php:294
+#: usr/local/www/vpn_ipsec_phase2.php:296
+#: usr/local/www/diag_logs_gateways.php:85
+#: usr/local/www/diag_logs_openvpn.php:76
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_filter.php:97 usr/local/www/vpn_pppoe.php:87
+#: usr/local/www/vpn_ipsec.php:125
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_ppp.php:74 usr/local/www/vpn_pptp.php:196
+#: usr/local/www/fbegin.inc:307 usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase1.php:381
+#: usr/local/www/vpn_ipsec_phase2.php:316
+#: usr/local/www/vpn_ipsec_phase2.php:318
+#: usr/local/www/diag_logs_filter.php:127
+#: usr/local/www/diag_logs_settings.php:247
+msgid "VPN"
+msgstr "VPN"
+
+#: usr/local/www/diag_logs.php:85 usr/local/www/diag_logs_auth.php:73
+#: usr/local/www/diag_logs_dhcp.php:78 usr/local/www/diag_logs_filter.php:109
+#: usr/local/www/diag_logs_filter_dynamic.php:108
+#: usr/local/www/diag_logs_ipsec.php:110 usr/local/www/diag_logs_ntpd.php:73
+#: usr/local/www/diag_logs_openvpn.php:45
+#: usr/local/www/diag_logs_openvpn.php:77
+#: usr/local/www/diag_logs_settings.php:218
+#: usr/local/www/diag_logs_vpn.php:134
+#: usr/local/www/diag_packet_capture.php:130 usr/local/www/diag_backup.php:112
+#: usr/local/www/license.php:213
+#: usr/local/www/diag_logs_filter_summary.php:192
+#: usr/local/www/diag_logs_ppp.php:78 usr/local/www/diag_logs_relayd.php:74
+#: usr/local/www/status_graph.php:66 usr/local/www/fbegin.inc:148
+#: usr/local/www/fbegin.inc:166 usr/local/www/status_services.php:343
+#: usr/local/www/status_openvpn.php:46 usr/local/www/vpn_openvpn_client.php:40
+#: usr/local/www/vpn_openvpn_csc.php:40
+#: usr/local/www/vpn_openvpn_server.php:40
+#: usr/local/www/widgets/widgets/services_status.widget.php:148
+#: usr/local/www/diag_logs_wireless.php:75
+#: usr/local/www/diag_logs_routing.php:73
+#: usr/local/www/diag_logs_settings.php:223 usr/local/www/fbegin.inc:165
+#: usr/local/www/fbegin.inc:184 usr/local/www/diag_backup.php:189
+#: usr/local/www/diag_logs_resolver.php:86
+#: usr/local/www/diag_packet_capture.php:134
+#: usr/local/www/diag_logs_gateways.php:86
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: etc/inc/service-utils.inc:333 usr/local/www/diag_logs_routing.php:74
+#: usr/local/www/diag_logs_settings.php:230 usr/local/www/fbegin.inc:173
+#: usr/local/www/fbegin.inc:192 usr/local/www/diag_logs_relayd.php:75
+#: usr/local/www/diag_logs_auth.php:74 usr/local/www/diag_logs_ipsec.php:111
+#: usr/local/www/diag_logs_resolver.php:87 usr/local/www/diag_logs_ntpd.php:74
+#: usr/local/www/diag_logs_dhcp.php:79 usr/local/www/diag_logs_wireless.php:76
+#: usr/local/www/vpn_openvpn_server.php:423
+#: usr/local/www/diag_logs_filter_summary.php:193
+#: usr/local/www/diag_packet_capture.php:64
+#: usr/local/www/diag_logs_gateways.php:87
+#: usr/local/www/diag_logs_openvpn.php:78
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_filter.php:99
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_ppp.php:76 usr/local/www/fbegin.inc:164
+#: usr/local/www/fbegin.inc:183 usr/local/www/vpn_openvpn_server.php:445
+#: etc/inc/service-utils.inc:332 usr/local/www/diag_logs_filter.php:129
+#: etc/inc/system.inc:1627 etc/inc/service-utils.inc:349
+#: etc/inc/system.inc:1635 usr/local/www/diag_logs_settings.php:249
+#: usr/local/www/diag_backup.php:190 etc/inc/system.inc:1662
+#: etc/inc/service-utils.inc:351
+msgid "OpenVPN"
+msgstr "OpenVPN"
+
+#: usr/local/www/diag_logs.php:86 usr/local/www/diag_logs_auth.php:74
+#: usr/local/www/diag_logs_dhcp.php:79 usr/local/www/diag_logs_filter.php:110
+#: usr/local/www/diag_logs_filter_dynamic.php:109
+#: usr/local/www/diag_logs_ipsec.php:111 usr/local/www/diag_logs_ntpd.php:54
+#: usr/local/www/diag_logs_ntpd.php:74 usr/local/www/diag_logs_openvpn.php:78
+#: usr/local/www/diag_logs_settings.php:219
+#: usr/local/www/diag_logs_vpn.php:135
+#: usr/local/www/diag_logs_filter_summary.php:193
+#: usr/local/www/diag_logs_ppp.php:79 usr/local/www/diag_logs_relayd.php:75
+#: usr/local/www/fbegin.inc:141 usr/local/www/diag_logs_wireless.php:76
+msgid "OpenNTPD"
+msgstr "OpenNTPD"
+
+#: usr/local/www/diag_logs.php:87 usr/local/www/diag_logs_auth.php:75
+#: usr/local/www/diag_logs_dhcp.php:80 usr/local/www/diag_logs_filter.php:111
+#: usr/local/www/diag_logs_filter_dynamic.php:110
+#: usr/local/www/diag_logs_ipsec.php:112 usr/local/www/diag_logs_ntpd.php:75
+#: usr/local/www/diag_logs_openvpn.php:79
+#: usr/local/www/diag_logs_settings.php:220
+#: usr/local/www/diag_logs_vpn.php:136 usr/local/www/interfaces_bridge.php:91
+#: usr/local/www/interfaces_gif.php:90 usr/local/www/interfaces_gre.php:91
+#: usr/local/www/interfaces_groups.php:77
+#: usr/local/www/interfaces_assign.php:404
+#: usr/local/www/status_wireless.php:41 usr/local/www/interfaces_vlan.php:92
+#: usr/local/www/diag_logs_filter_summary.php:194
+#: usr/local/www/diag_logs_ppp.php:80 usr/local/www/diag_logs_relayd.php:76
+#: usr/local/www/interfaces_lagg.php:96 usr/local/www/interfaces_ppps.php:92
+#: usr/local/www/interfaces_qinq.php:100
+#: usr/local/www/interfaces_wireless.php:76
+#: usr/local/www/interfaces_wireless.php:90
+#: usr/local/www/interfaces_wireless_edit.php:145 usr/local/www/fbegin.inc:183
+#: usr/local/www/status_rrd_graph.php:344
+#: usr/local/www/status_rrd_graph_settings.php:143
+#: usr/local/www/diag_logs_wireless.php:56
+#: usr/local/www/diag_logs_wireless.php:77
+#: usr/local/www/diag_logs_routing.php:86 usr/local/www/fbegin.inc:201
+#: usr/local/www/status_rrd_graph_settings.php:144
+#: usr/local/www/diag_logs_resolver.php:100 usr/local/www/diag_logs.php:99
+#: usr/local/www/status_rrd_graph.php:392
+#: usr/local/www/diag_logs_wireless.php:88
+#: usr/local/www/diag_logs_gateways.php:100
+#: usr/local/www/diag_logs_filter_dynamic.php:108
+#: usr/local/www/diag_logs_routing.php:87 usr/local/www/fbegin.inc:209
+#: usr/local/www/interfaces_groups.php:78
+#: usr/local/www/interfaces_qinq.php:101 usr/local/www/interfaces_ppps.php:93
+#: usr/local/www/interfaces_bridge.php:92
+#: usr/local/www/diag_logs_resolver.php:101
+#: usr/local/www/interfaces_lagg.php:97 usr/local/www/interfaces_gre.php:92
+#: usr/local/www/interfaces_wireless.php:91
+#: usr/local/www/diag_logs_wireless.php:89
+#: usr/local/www/interfaces_assign.php:398
+#: usr/local/www/diag_logs_gateways.php:101
+#: usr/local/www/interfaces_vlan.php:93
+#: usr/local/www/diag_logs_filter_dynamic.php:109
+#: usr/local/www/interfaces_gif.php:91
+#: usr/local/www/interfaces_wireless_edit.php:147
+#: usr/local/www/interfaces_qinq.php:104 usr/local/www/interfaces_lagg.php:101
+#: usr/local/www/interfaces_vlan.php:99 usr/local/www/status_rrd_graph.php:417
+#: usr/local/www/interfaces_bridge.php:98
+#: usr/local/www/interfaces_wireless.php:78
+#: usr/local/www/interfaces_wireless.php:93 usr/local/www/fbegin.inc:200
+#: usr/local/www/interfaces_gre.php:96 usr/local/www/interfaces_gif.php:95
+msgid "Wireless"
+msgstr "Sem fio"
+
+#: usr/local/www/diag_logs.php:88 usr/local/www/diag_logs_auth.php:76
+#: usr/local/www/diag_logs_dhcp.php:81 usr/local/www/diag_logs_filter.php:112
+#: usr/local/www/diag_logs_filter_dynamic.php:111
+#: usr/local/www/diag_logs_ipsec.php:113 usr/local/www/diag_logs_ntpd.php:76
+#: usr/local/www/diag_logs_openvpn.php:80
+#: usr/local/www/diag_logs_settings.php:132
+#: usr/local/www/diag_logs_settings.php:221
+#: usr/local/www/diag_logs_vpn.php:137
+#: usr/local/www/system_firmware_settings.php:74
+#: usr/local/www/diag_logs_filter_summary.php:195
+#: usr/local/www/diag_logs_ppp.php:81 usr/local/www/diag_logs_relayd.php:77
+#: usr/local/www/status_rrd_graph.php:361
+#: usr/local/www/status_rrd_graph_settings.php:160
+#: usr/local/www/system_authservers.php:423
+#: usr/local/www/system_groupmanager.php:242
+#: usr/local/www/system_groupmanager_addprivs.php:170
+#: usr/local/www/system_usermanager.php:442
+#: usr/local/www/system_usermanager_addprivs.php:169
+#: usr/local/www/system_usermanager_settings.php:115
+#: usr/local/www/diag_logs_wireless.php:78
+#: usr/local/www/diag_logs_routing.php:75
+#: usr/local/www/diag_logs_settings.php:136
+#: usr/local/www/diag_logs_settings.php:225
+#: usr/local/www/diag_logs_relayd.php:76
+#: usr/local/www/load_balancer_setting.php:98
+#: usr/local/www/load_balancer_setting.php:122
+#: usr/local/www/status_rrd_graph_settings.php:161
+#: usr/local/www/diag_logs_auth.php:75 usr/local/www/diag_logs_ipsec.php:112
+#: usr/local/www/system_usermanager.php:440
+#: usr/local/www/diag_logs_vpn.php:136 usr/local/www/diag_logs_ppp.php:80
+#: usr/local/www/diag_logs_resolver.php:88 usr/local/www/diag_logs_ntpd.php:75
+#: usr/local/www/diag_logs.php:87 usr/local/www/status_rrd_graph.php:409
+#: usr/local/www/load_balancer_virtual_server.php:118
+#: usr/local/www/system_groupmanager_addprivs.php:168
+#: usr/local/www/diag_logs_dhcp.php:80 usr/local/www/diag_logs_wireless.php:77
+#: usr/local/www/load_balancer_monitor.php:112
+#: usr/local/www/diag_logs_filter_summary.php:194
+#: usr/local/www/diag_logs_gateways.php:88
+#: usr/local/www/diag_logs_openvpn.php:79
+#: usr/local/www/diag_logs_filter_dynamic.php:109
+#: usr/local/www/load_balancer_pool.php:121
+#: usr/local/www/diag_logs_filter.php:111
+#: usr/local/www/diag_logs_routing.php:76
+#: usr/local/www/diag_logs_settings.php:143
+#: usr/local/www/diag_logs_settings.php:232
+#: usr/local/www/load_balancer_setting.php:121
+#: usr/local/www/diag_logs_resolver.php:89
+#: usr/local/www/load_balancer_virtual_server.php:116
+#: usr/local/www/load_balancer_monitor.php:110
+#: usr/local/www/system_firmware_settings.php:79
+#: usr/local/www/diag_logs_gateways.php:89
+#: usr/local/www/diag_logs_filter_dynamic.php:110
+#: usr/local/www/load_balancer_pool.php:119
+#: usr/local/www/system_authservers.php:428
+#: usr/local/www/diag_logs_filter.php:101
+#: usr/local/www/status_rrd_graph.php:434
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_ppp.php:78 usr/local/www/system_authservers.php:435
+#: usr/local/www/diag_logs_filter.php:131
+#: usr/local/www/system_usermanager_settings.php:117
+#: usr/local/www/system_groupmanager.php:245
+#: usr/local/www/diag_logs_settings.php:162
+#: usr/local/www/diag_logs_settings.php:251
+#: usr/local/www/system_authservers.php:446
+msgid "Settings"
+msgstr "Configurações"
+
+#: usr/local/www/diag_logs.php:98 usr/local/www/diag_logs_resolver.php:110
+#: usr/local/www/diag_logs.php:109 usr/local/www/diag_logs_gateways.php:110
+#: usr/local/www/diag_logs_resolver.php:111
+#: usr/local/www/diag_logs_gateways.php:111
+#, php-format
+msgid "Last %s system log entries"
+msgstr "Últimas %s entradas de evento no sistema"
+
+#: usr/local/www/diag_logs.php:109 usr/local/www/diag_logs_auth.php:90
+#: usr/local/www/diag_logs_dhcp.php:95 usr/local/www/diag_logs_filter.php:208
+#: usr/local/www/diag_logs_ipsec.php:150 usr/local/www/diag_logs_ntpd.php:91
+#: usr/local/www/diag_logs_openvpn.php:97 usr/local/www/diag_logs_vpn.php:188
+#: usr/local/www/diag_logs_ppp.php:114 usr/local/www/diag_logs_relayd.php:91
+#: usr/local/www/diag_logs_wireless.php:92
+#: usr/local/www/diag_logs_routing.php:101
+#: usr/local/www/diag_logs_relayd.php:90 usr/local/www/diag_logs_auth.php:89
+#: usr/local/www/diag_logs_ipsec.php:149 usr/local/www/diag_logs_vpn.php:187
+#: usr/local/www/diag_logs_ppp.php:113
+#: usr/local/www/diag_logs_resolver.php:121
+#: usr/local/www/diag_logs_ntpd.php:90 usr/local/www/diag_logs.php:120
+#: usr/local/www/diag_logs_dhcp.php:94
+#: usr/local/www/diag_logs_wireless.php:103
+#: usr/local/www/diag_logs_gateways.php:121
+#: usr/local/www/diag_logs_openvpn.php:96
+#: usr/local/www/diag_logs_filter.php:205
+#: usr/local/www/diag_logs_routing.php:102
+#: usr/local/www/diag_logs_resolver.php:122
+#: usr/local/www/diag_logs_wireless.php:104
+#: usr/local/www/diag_logs_gateways.php:122
+#: usr/local/www/diag_logs_filter.php:264 usr/local/www/diag_logs_ppp.php:95
+#: usr/local/www/diag_logs_ipsec.php:151
+#: usr/local/www/diag_logs_filter.php:398
+msgid "Clear log"
+msgstr "Limpar log"
+
+#: usr/local/www/diag_logs.php:115 usr/local/www/diag_logs_filter.php:128
+#: usr/local/www/diag_dump_states.php:138
+#: usr/local/www/diag_dump_states_sources.php:133
+#: usr/local/www/diag_logs_resolver.php:127 usr/local/www/diag_logs.php:126
+#: usr/local/www/diag_dump_states.php:153
+#: usr/local/www/diag_logs_gateways.php:127
+#: usr/local/www/diag_logs_filter.php:127
+#: usr/local/www/diag_logs_resolver.php:128
+#: usr/local/www/diag_dump_states_sources.php:132
+#: usr/local/www/diag_dump_states.php:152
+#: usr/local/www/diag_logs_gateways.php:128
+#: usr/local/www/diag_logs_filter.php:147
+#: usr/local/www/diag_logs_filter.php:197
+#: usr/local/www/diag_logs_filter.php:260
+#: usr/local/www/diag_dump_states.php:141
+msgid "Filter"
+msgstr "Filtro"
+
+#: usr/local/www/diag_logs_auth.php:86 usr/local/www/diag_logs_auth.php:85
+#, php-format
+msgid "Last %s Portal Auth log entries"
+msgstr "Último %s evento de entrada no Portal de autenticação"
+
+#: usr/local/www/diag_logs_dhcp.php:91 usr/local/www/diag_logs_dhcp.php:90
+#, php-format
+msgid "Last %s DHCP service log entries"
+msgstr "Últimos %s logs de entrada do serviço DHCP"
+
+#: usr/local/www/diag_logs_filter.php:56 usr/local/www/diag_logs_filter.php:63
+msgid "The rule that triggered this action is"
+msgstr "A regra que desencadeou esta ação é"
+
+#: usr/local/www/diag_logs_filter.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:119
+#: usr/local/www/diag_logs_filter_summary.php:204
+#: usr/local/www/diag_logs_filter_summary.php:203
+#: usr/local/www/diag_logs_filter_dynamic.php:117
+#: usr/local/www/diag_logs_filter.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter.php:152
+#: usr/local/www/diag_logs_filter.php:274
+msgid "Normal View"
+msgstr "Visão Normal"
+
+#: usr/local/www/diag_logs_filter.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:119
+#: usr/local/www/diag_logs_filter_summary.php:204
+#: usr/local/www/diag_logs_filter_summary.php:203
+#: usr/local/www/diag_logs_filter_dynamic.php:117
+#: usr/local/www/diag_logs_filter.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter.php:152
+#: usr/local/www/diag_logs_filter.php:274
+msgid "Dynamic View"
+msgstr "Visão Dinâmica"
+
+#: usr/local/www/diag_logs_filter.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:119
+#: usr/local/www/diag_logs_filter_summary.php:204
+#: usr/local/www/diag_logs_filter_summary.php:203
+#: usr/local/www/diag_logs_filter_dynamic.php:117
+#: usr/local/www/diag_logs_filter.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter.php:152
+#: usr/local/www/diag_logs_filter.php:274
+msgid "Summary View"
+msgstr "Ver resumo"
+
+#: usr/local/www/diag_logs_filter.php:139
+#: usr/local/www/diag_logs_filter.php:138
+#: usr/local/www/diag_logs_filter.php:170
+#: usr/local/www/diag_logs_filter.php:296
+#, php-format
+msgid "Last %s firewall log entries."
+msgstr "Últimos %s logs de entrada do firewall."
+
+#: usr/local/www/diag_logs_filter.php:141
+#: usr/local/www/diag_logs_filter.php:140
+#: usr/local/www/diag_logs_filter.php:172
+#: usr/local/www/diag_logs_filter.php:298
+msgid "matched log entries."
+msgstr "entradas de log encontradas."
+
+#: usr/local/www/diag_logs_filter.php:143
+#: usr/local/www/diag_logs_filter.php:142
+#: usr/local/www/diag_logs_filter.php:173
+#: usr/local/www/diag_logs_filter.php:299
+#, php-format
+msgid "Max(%s)"
+msgstr "Máximo(%s)"
+
+#: usr/local/www/diag_logs_filter.php:146
+#: usr/local/www/diag_logs_filter_dynamic.php:126
+#: usr/local/www/diag_logs_filter_dynamic.php:124
+#: usr/local/www/diag_logs_filter.php:145
+#: usr/local/www/diag_logs_filter_dynamic.php:125
+#: usr/local/www/diag_logs_filter.php:177
+#: usr/local/www/diag_logs_filter_dynamic.php:128
+#: usr/local/www/widgets/widgets/log.widget.php:163
+#: usr/local/www/diag_logs_filter.php:303
+#: usr/local/www/widgets/widgets/log.widget.php:167
+msgid "Act"
+msgstr "Ação"
+
+#: usr/local/www/diag_logs_filter.php:147
+#: usr/local/www/diag_logs_filter_dynamic.php:127
+#: usr/local/www/diag_logs_vpn.php:175
+#: usr/local/www/firewall_schedule_edit.php:910
+#: usr/local/www/diag_logs_vpn.php:174
+#: usr/local/www/diag_logs_filter_dynamic.php:125
+#: usr/local/www/diag_logs_filter.php:146
+#: usr/local/www/firewall_schedule_edit.php:909
+#: usr/local/www/diag_logs_filter_dynamic.php:126
+#: usr/local/www/diag_logs_filter.php:178
+#: usr/local/www/diag_logs_filter_dynamic.php:129
+#: usr/local/www/diag_system_pftop.php:143
+#: usr/local/www/diag_logs_filter.php:159
+#: usr/local/www/diag_logs_filter.php:304
+#: usr/local/www/widgets/widgets/log.widget.php:168
+msgid "Time"
+msgstr "Tempo"
+
+#: usr/local/www/diag_logs_filter.php:148
+#: usr/local/www/diag_logs_filter_dynamic.php:128
+#: usr/local/www/firewall_nat.php:195
+#: usr/local/www/diag_logs_filter_dynamic.php:126
+#: usr/local/www/diag_logs_filter.php:147 usr/local/www/firewall_nat.php:200
+#: usr/local/www/diag_logs_filter_dynamic.php:127
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter_dynamic.php:130
+#: usr/local/www/diag_logs_filter.php:305 usr/local/www/firewall_nat.php:203
+#: usr/local/www/services_rfc2136.php:79
+msgid "If"
+msgstr "Se"
+
+#: usr/local/www/diag_logs_filter.php:149
+#: usr/local/www/diag_logs_filter_dynamic.php:129
+#: usr/local/www/firewall_nat_edit.php:529
+#: usr/local/www/firewall_nat_edit.php:535
+#: usr/local/www/firewall_nat_out.php:342
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:468
+#: usr/local/www/firewall_rules.php:364
+#: usr/local/www/firewall_rules_edit.php:855
+#: usr/local/www/vpn_ipsec_mobile.php:356
+#: usr/local/www/vpn_ipsec_mobile.php:377 usr/local/www/diag_ipsec_sad.php:87
+#: usr/local/www/diag_ipsec_spd.php:86 usr/local/www/firewall_nat_out.php:352
+#: usr/local/www/firewall_nat_out_edit.php:481
+#: usr/local/www/firewall_rules_edit.php:890
+#: usr/local/www/firewall_rules.php:368
+#: usr/local/www/firewall_nat_edit.php:536
+#: usr/local/www/firewall_nat_edit.php:542
+#: usr/local/www/diag_logs_filter_dynamic.php:127
+#: usr/local/www/diag_logs_filter.php:148
+#: usr/local/www/firewall_nat_out.php:353
+#: usr/local/www/vpn_ipsec_mobile.php:383
+#: usr/local/www/vpn_ipsec_mobile.php:401 usr/local/www/diag_ipsec_sad.php:88
+#: usr/local/www/firewall_rules.php:361
+#: usr/local/www/firewall_nat_edit.php:541
+#: usr/local/www/diag_logs_filter_dynamic.php:128
+#: usr/local/www/diag_ipsec_spd.php:87 usr/local/www/diag_logs_filter.php:183
+#: usr/local/www/firewall_rules_edit.php:893
+#: usr/local/www/firewall_nat_edit.php:530
+#: usr/local/www/diag_logs_filter_dynamic.php:131
+#: usr/local/www/widgets/widgets/log.widget.php:165
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:485
+#: usr/local/www/firewall_rules_edit.php:905
+#: usr/local/www/diag_logs_filter.php:309
+#: usr/local/www/firewall_nat_edit.php:548
+#: usr/local/www/firewall_nat_out.php:360 usr/local/www/firewall_rules.php:359
+#: usr/local/www/widgets/widgets/log.widget.php:169
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:497
+#: usr/local/www/firewall_rules_edit.php:904
+#: usr/local/www/firewall_nat_edit.php:543
+#: usr/local/www/firewall_nat_edit.php:549
+#: usr/local/www/firewall_nat_out.php:359
+#: usr/local/www/widgets/widgets/log.widget.php:170
+#: usr/local/www/firewall_rules_edit.php:952
+msgid "Source"
+msgstr "Origem"
+
+#: usr/local/www/diag_logs_filter.php:150
+#: usr/local/www/diag_logs_filter_dynamic.php:130
+#: usr/local/www/firewall_nat_1to1_edit.php:383
+#: usr/local/www/firewall_nat_edit.php:624
+#: usr/local/www/firewall_nat_out.php:344
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:498
+#: usr/local/www/firewall_rules.php:366
+#: usr/local/www/firewall_rules_edit.php:948
+#: usr/local/www/diag_ipsec_sad.php:88 usr/local/www/diag_ipsec_spd.php:87
+#: usr/local/www/firewall_nat_out.php:354
+#: usr/local/www/firewall_nat_1to1_edit.php:390
+#: usr/local/www/firewall_nat_out_edit.php:511
+#: usr/local/www/firewall_rules_edit.php:983
+#: usr/local/www/firewall_rules.php:370
+#: usr/local/www/firewall_nat_edit.php:631
+#: usr/local/www/diag_logs_filter_dynamic.php:128
+#: usr/local/www/diag_logs_filter.php:149
+#: usr/local/www/firewall_nat_out.php:355
+#: usr/local/www/firewall_nat_1to1_edit.php:388
+#: usr/local/www/diag_ipsec_sad.php:89 usr/local/www/firewall_rules.php:363
+#: usr/local/www/firewall_nat_edit.php:630
+#: usr/local/www/diag_logs_filter_dynamic.php:129
+#: usr/local/www/diag_ipsec_spd.php:88 usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/firewall_rules_edit.php:992
+#: usr/local/www/firewall_nat_edit.php:625
+#: usr/local/www/diag_logs_filter_dynamic.php:132
+#: usr/local/www/widgets/widgets/log.widget.php:166
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:515
+#: usr/local/www/firewall_rules_edit.php:1005
+#: usr/local/www/diag_logs_filter.php:310
+#: usr/local/www/firewall_nat_edit.php:637
+#: usr/local/www/firewall_nat_out.php:362 usr/local/www/firewall_rules.php:361
+#: usr/local/www/widgets/widgets/log.widget.php:170
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:527
+#: usr/local/www/firewall_rules_edit.php:1004
+#: usr/local/www/firewall_nat_edit.php:638
+#: usr/local/www/firewall_nat_out.php:361
+#: usr/local/www/firewall_nat_1to1_edit.php:389
+#: usr/local/www/firewall_nat_out_edit.php:528
+#: usr/local/www/widgets/widgets/log.widget.php:171
+#: usr/local/www/firewall_rules_edit.php:1052
+msgid "Destination"
+msgstr "Destino"
+
+#: usr/local/www/diag_logs_filter.php:151
+#: usr/local/www/diag_logs_filter_dynamic.php:131
+#: usr/local/www/diag_dump_states.php:150 usr/local/www/firewall_rules.php:363
+#: usr/local/www/diag_states_summary.php:152
+#: usr/local/www/firewall_nat.php:196 usr/local/www/firewall_rules.php:367
+#: usr/local/www/diag_dump_states.php:168
+#: usr/local/www/diag_logs_filter_dynamic.php:129
+#: usr/local/www/diag_states_summary.php:141
+#: usr/local/www/diag_logs_filter.php:150 usr/local/www/firewall_nat.php:201
+#: usr/local/www/firewall_rules.php:360 usr/local/www/diag_dump_states.php:167
+#: usr/local/www/diag_logs_filter_dynamic.php:130
+#: usr/local/www/diag_states_summary.php:143
+#: usr/local/www/diag_logs_filter.php:185
+#: usr/local/www/diag_logs_filter_dynamic.php:133
+#: usr/local/www/diag_logs_filter.php:311
+#: usr/local/www/diag_dump_states.php:156 usr/local/www/firewall_rules.php:358
+#: usr/local/www/firewall_nat.php:204
+msgid "Proto"
+msgstr "Proto"
+
+#: usr/local/www/diag_logs_filter.php:178
+#: usr/local/www/diag_logs_filter.php:183
+#: usr/local/www/diag_logs_filter_summary.php:81
+#: usr/local/www/diag_logs_filter.php:175
+#: usr/local/www/diag_logs_filter.php:180
+#: usr/local/www/diag_logs_filter_summary.php:82
+#: usr/local/www/diag_logs_filter.php:221
+#: usr/local/www/diag_logs_filter.php:228
+#: usr/local/www/diag_logs_filter.php:351
+#: usr/local/www/diag_logs_filter.php:353
+#: usr/local/www/diag_logs_filter.php:360
+#: usr/local/www/diag_logs_filter.php:362
+#: usr/local/www/widgets/widgets/log.widget.php:189
+#: usr/local/www/widgets/widgets/log.widget.php:192
+#: usr/local/www/widgets/widgets/log.widget.php:190
+#: usr/local/www/widgets/widgets/log.widget.php:193
+msgid "Reverse Resolve with DNS"
+msgstr "Solução reversa com DNS"
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:355
+msgid "Easy Rule: Add to Block List"
+msgstr "Easy Rule: Adicione para a lista de bloqueados"
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:355
+msgid "Do you really want to add this BLOCK rule?"
+msgstr "Você realmente quer adicionar essa regra de BLOQUEIO?"
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Easy Rule is still experimental."
+msgstr "Easy Rule é experimental ainda."
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Continue at risk of your own peril."
+msgstr "Continuar por sua conta e risco."
+
+#: usr/local/www/diag_logs_filter.php:179
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:176
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:223
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:355
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Backups are also nice."
+msgstr "Backups também são bons."
+
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Easy Rule: Pass this traffic"
+msgstr "Easy Rule: liberar esse tráfego"
+
+#: usr/local/www/diag_logs_filter.php:184
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:230
+#: usr/local/www/diag_logs_filter.php:364
+msgid "Do you really want to add this PASS rule?"
+msgstr "Você realmente quer adicionar essa regra de liberação?"
+
+#: usr/local/www/diag_logs_filter.php:196
+#: usr/local/www/diag_logs_filter.php:193
+#: usr/local/www/diag_logs_filter.php:251
+#: usr/local/www/diag_logs_filter.php:385
+#, php-format
+msgid "Last %s firewall log entries"
+msgstr "Últimos %s logs de entrada do firewall"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:61
+msgid "Firewall (Dynamic View)"
+msgstr "Firewall (Visão Dinâmica)"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:120
+#: usr/local/www/diag_logs_filter_dynamic.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:124
+#, php-format
+msgid "Last %s records"
+msgstr "Últimos %s registros"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:122
+#: usr/local/www/diag_logs_filter_dynamic.php:120
+#: usr/local/www/diag_logs_filter_dynamic.php:121
+#: usr/local/www/diag_logs_filter_dynamic.php:124
+msgid "Pause:"
+msgstr "Pausa:"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:153
+#: usr/local/www/diag_logs_filter_dynamic.php:151
+#: usr/local/www/diag_logs_filter_dynamic.php:152
+#: usr/local/www/diag_logs_filter_dynamic.php:165
+msgid "TCP Flags"
+msgstr "Flags de TCP"
+
+#: usr/local/www/diag_logs_ipsec.php:91 usr/local/www/status_services.php:330
+#: usr/local/www/widgets/widgets/services_status.widget.php:135
+#: etc/inc/service-utils.inc:320 etc/inc/service-utils.inc:319
+#: etc/inc/service-utils.inc:336 etc/inc/service-utils.inc:338
+msgid "IPsec VPN"
+msgstr "IPsec VPN"
+
+#: usr/local/www/diag_logs_ipsec.php:123 usr/local/www/diag_logs_ipsec.php:122
+#, php-format
+msgid "Last %s IPsec log entries"
+msgstr "Últimos %s logs de entrada do IPsec"
+
+#: usr/local/www/diag_logs_ipsec.php:135 usr/local/www/diag_logs_ppp.php:99
+#: usr/local/www/diag_logs_ipsec.php:134 usr/local/www/diag_logs_ppp.php:98
+#: usr/local/www/diag_logs_ipsec.php:136
+msgid "Unknown Gateway/Dynamic"
+msgstr "Gateway/Dinâmico desconhecido"
+
+#: usr/local/www/diag_logs_ntpd.php:86
+#, php-format
+msgid "Last %s OpenNTPD log entries"
+msgstr "Últimas %s entradas de evento do OpenNTPD"
+
+#: usr/local/www/diag_logs_openvpn.php:90
+#: usr/local/www/diag_logs_openvpn.php:89
+#, php-format
+msgid "Last %s OpenVPN log entries"
+msgstr "Últimas %s entradas de log do OpenVPN"
+
+#: usr/local/www/diag_dump_states.php:51 usr/local/www/status_openvpn.php:59
+#: usr/local/www/widgets/widgets/openvpn.widget.php:16
+#: usr/local/www/diag_dump_states_sources.php:51
+#: usr/local/www/widgets/widgets/openvpn.widget.php:17
+#: usr/local/www/status_openvpn.php:61 usr/local/www/status_openvpn.php:62
+msgid "invalid input"
+msgstr "entrada inválida"
+
+#: usr/local/www/diag_dump_states.php:65 usr/local/www/diag_dump_states.php:75
+#: usr/local/www/diag_dump_states.php:67
+msgid "Show States"
+msgstr "Mostrar Estados"
+
+#: usr/local/www/diag_dump_states.php:95 usr/local/www/status_openvpn.php:130
+#: usr/local/www/widgets/widgets/openvpn.widget.php:84
+#: usr/local/www/diag_dump_states_sources.php:95
+#: usr/local/www/diag_dump_states.php:105
+#: usr/local/www/widgets/widgets/openvpn.widget.php:85
+#: usr/local/www/status_openvpn.php:131
+#: usr/local/www/diag_dump_states_sources.php:94
+#: usr/local/www/diag_dump_states.php:104 usr/local/www/status_openvpn.php:132
+#: usr/local/www/diag_dump_states.php:96
+msgid "An error occurred."
+msgstr "Ocorreu um erro."
+
+#: usr/local/www/diag_dump_states.php:110
+#: usr/local/www/diag_states_summary.php:151
+#: usr/local/www/diag_states_summary.php:153
+#: usr/local/www/diag_resetstate.php:77 usr/local/www/fbegin.inc:206
+#: usr/local/www/system_advanced_misc.php:398
+#: usr/local/www/diag_dump_states_sources.php:110 usr/local/www/fbegin.inc:224
+#: usr/local/www/system_advanced_misc.php:441
+#: usr/local/www/diag_dump_states.php:120
+#: usr/local/www/diag_states_summary.php:140
+#: usr/local/www/diag_states_summary.php:142 usr/local/www/fbegin.inc:233
+#: usr/local/www/system_advanced_misc.php:490
+#: usr/local/www/diag_dump_states_sources.php:109
+#: usr/local/www/diag_dump_states.php:119
+#: usr/local/www/diag_states_summary.php:144
+#: usr/local/www/system_advanced_misc.php:502 usr/local/www/fbegin.inc:225
+#: usr/local/www/diag_dump_states.php:111
+#: usr/local/www/system_advanced_misc.php:549
+#: usr/local/www/system_advanced_misc.php:567
+msgid "States"
+msgstr "Estados"
+
+#: usr/local/www/diag_dump_states.php:112 usr/local/www/diag_resetstate.php:79
+#: usr/local/www/diag_dump_states_sources.php:111
+#: usr/local/www/diag_dump_states.php:122
+#: usr/local/www/diag_dump_states_sources.php:110
+#: usr/local/www/diag_dump_states.php:121
+#: usr/local/www/diag_dump_states.php:113
+msgid "Source Tracking"
+msgstr "Rastreamento de Origem"
+
+#: usr/local/www/diag_dump_states.php:113 usr/local/www/diag_resetstate.php:80
+#: usr/local/www/diag_dump_states_sources.php:112
+#: usr/local/www/diag_dump_states.php:123
+#: usr/local/www/diag_dump_states_sources.php:111
+#: usr/local/www/diag_dump_states.php:122
+#: usr/local/www/diag_dump_states.php:114
+msgid "Reset States"
+msgstr "Reiniciar Estados"
+
+#: usr/local/www/diag_dump_states.php:134
+msgid "Current state count:"
+msgstr "Contagem de estado atual:"
+
+#: usr/local/www/diag_dump_states.php:136
+#: usr/local/www/diag_dump_states_sources.php:131
+#: usr/local/www/diag_dump_states.php:151
+#: usr/local/www/diag_dump_states_sources.php:130
+#: usr/local/www/diag_dump_states.php:150
+#: usr/local/www/diag_dump_states.php:139
+msgid "Filter expression:"
+msgstr "Expressão de filtro:"
+
+#: usr/local/www/diag_dump_states.php:151
+#: usr/local/www/diag_dump_states.php:169
+#: usr/local/www/diag_dump_states.php:168
+#: usr/local/www/diag_dump_states.php:157
+msgid "Source -> Router -> Destination"
+msgstr "Origem -> Roteador -> Destino"
+
+#: usr/local/www/diag_dump_states.php:152
+#: usr/local/www/status_dhcpv6_leases.php:486
+#: usr/local/www/diag_dump_states.php:170
+#: usr/local/www/status_dhcpv6_leases.php:487
+#: usr/local/www/diag_dump_states.php:169
+#: usr/local/www/status_dhcpv6_leases.php:490
+#: usr/local/www/diag_system_pftop.php:142
+#: usr/local/www/diag_dump_states.php:158
+msgid "State"
+msgstr "Estado"
+
+#: usr/local/www/diag_dump_states.php:185
+#: usr/local/www/diag_dump_states.php:203
+#: usr/local/www/diag_dump_states.php:202
+#: usr/local/www/diag_dump_states.php:194
+msgid "Remove all state entries from"
+msgstr "Remove todas as entradas de estado de"
+
+#: usr/local/www/diag_dump_states.php:185
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:735 usr/local/www/diag_confbak.php:111
+#: usr/local/www/services_captiveportal_ip.php:176
+#: usr/local/www/services_dhcp.php:636
+#: usr/local/www/services_captiveportal_hostname.php:177
+#: usr/local/www/services_dhcpv6.php:572 usr/local/www/services_dhcpv6.php:579
+#: usr/local/www/diag_dump_states_sources.php:180
+#: usr/local/www/diag_dump_states.php:203 usr/local/www/services_dhcp.php:649
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:742
+#: usr/local/www/services_dhcpv6.php:645 usr/local/www/services_dhcpv6.php:652
+#: usr/local/www/services_captiveportal_ip.php:174
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/diag_dump_states_sources.php:179
+#: usr/local/www/diag_dump_states.php:202 usr/local/www/services_dhcp.php:770
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/services_dhcpv6.php:576 usr/local/www/services_dhcpv6.php:583
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_nat_edit.php:736 usr/local/www/services_dhcp.php:780
+#: usr/local/www/services_dhcpv6.php:593 usr/local/www/services_dhcpv6.php:600
+#: usr/local/www/diag_dump_states.php:194
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_nat_edit.php:748 usr/local/www/services_dhcp.php:800
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_edit.php:749 usr/local/www/services_dhcp.php:812
+msgid "to"
+msgstr "para"
+
+#: usr/local/www/diag_dump_states.php:194
+#: usr/local/www/diag_dump_states.php:212
+#: usr/local/www/diag_dump_states.php:211
+#: usr/local/www/diag_dump_states.php:205
+msgid "No states were found."
+msgstr "Nenhum estado foi encontrado."
+
+#: usr/local/www/diag_logs_settings.php:79
+msgid "A valid IP address must be specified for remote syslog server #1."
+msgstr "Um endereço de IP válido de ser especificado para o servidor syslog remoto #1."
+
+#: usr/local/www/diag_logs_settings.php:82
+msgid "A valid IP address must be specified for remote syslog server #2."
+msgstr "Um endereço de IP válido de ser especificado para o servidor syslog remoto #2."
+
+#: usr/local/www/diag_logs_settings.php:85
+msgid "A valid IP address must be specified for remote syslog server #3."
+msgstr "Um endereço de IP válido de ser especificado para o servidor syslog remoto #3."
+
+#: usr/local/www/diag_logs_settings.php:92
+#: usr/local/www/diag_logs_settings.php:96
+#: usr/local/www/diag_logs_settings.php:97
+#: usr/local/www/diag_logs_settings.php:100
+msgid "Number of log entries to show must be between 5 and 2000."
+msgstr "O número de logs de entrada para mostra deve estar entre 5 e 2000."
+
+#: usr/local/www/diag_logs_settings.php:232
+#: usr/local/www/diag_logs_settings.php:239
+#: usr/local/www/diag_logs_settings.php:246
+#: usr/local/www/diag_logs_settings.php:265
+msgid "Show log entries in reverse order (newest entries on top)"
+msgstr "Mostrar logs de entrada em ordem reversa (entradas mais recentes no topo)"
+
+#: usr/local/www/diag_logs_settings.php:236
+msgid "Number of log entries to show:"
+msgstr "Número de logs de entrada para mostra:"
+
+#: usr/local/www/diag_logs_settings.php:242
+#: usr/local/www/diag_logs_settings.php:250
+#: usr/local/www/diag_logs_settings.php:257
+#: usr/local/www/diag_logs_settings.php:277
+msgid "Log packets blocked by the default rule"
+msgstr "Pacotes de log bloqueados pela regra padrão"
+
+#: usr/local/www/diag_logs_settings.php:243
+msgid "Hint: packets that are blocked by the implicit default block rule will not be logged anymore if you uncheck this option. Per-rule logging options are not affected."
+msgstr "Dica: pacotes que são bloqueados pelo regra implícita de bloqueio padrão não serão mais registrados se você desmarcar essa opção. Por regra as opções de registro não são afetadas."
+
+#: usr/local/www/diag_logs_settings.php:250
+#: usr/local/www/diag_logs_settings.php:258
+#: usr/local/www/diag_logs_settings.php:265
+#: usr/local/www/diag_logs_settings.php:296
+msgid "Show raw filter logs"
+msgstr "Mostrar filtros de log base"
+
+#: usr/local/www/diag_logs_settings.php:251
+msgid "Hint: If this is checked, filter logs are shown as generated by the packet filter, without any formatting. This will reveal more detailed information."
+msgstr "Dica: Se isto for marcado, logs do filtro são mostrados como gerados pelo filtro de pacotes, sem qualquer formatação. Isto irá revelar informações mais detalhadas."
+
+#: usr/local/www/diag_logs_settings.php:256
+#: usr/local/www/diag_logs_settings.php:267
+#: usr/local/www/diag_logs_settings.php:287
+#: usr/local/www/diag_logs_settings.php:318
+msgid "Disable writing log files to the local RAM disk"
+msgstr "Desabilitar gravação de arquivos de log no RAM disk local"
+
+#: usr/local/www/diag_logs_settings.php:261
+msgid "Enable syslog'ing to remote syslog server"
+msgstr "Habilitar envio de logs para servidor syslog remoto"
+
+#: usr/local/www/diag_logs_settings.php:264
+msgid "Remote syslog servers"
+msgstr "Servidores syslog remotos"
+
+#: usr/local/www/diag_logs_settings.php:269
+#: usr/local/www/diag_logs_settings.php:277
+#: usr/local/www/diag_logs_settings.php:285
+#: usr/local/www/vpn_ipsec_mobile.php:496
+#: usr/local/www/vpn_ipsec_mobile.php:502
+#: usr/local/www/vpn_ipsec_mobile.php:508
+#: usr/local/www/vpn_ipsec_mobile.php:514
+#: usr/local/www/vpn_ipsec_mobile.php:538
+#: usr/local/www/vpn_ipsec_mobile.php:544 usr/local/www/diag_dns.php:208
+#: usr/local/www/services_rfc2136_edit.php:180
+#: usr/local/www/vpn_openvpn_client.php:365
+#: usr/local/www/vpn_openvpn_client.php:862
+#: usr/local/www/vpn_openvpn_csc.php:293 usr/local/www/vpn_openvpn_csc.php:477
+#: usr/local/www/vpn_openvpn_csc.php:485 usr/local/www/vpn_openvpn_csc.php:493
+#: usr/local/www/vpn_openvpn_csc.php:501 usr/local/www/vpn_openvpn_csc.php:529
+#: usr/local/www/vpn_openvpn_csc.php:537 usr/local/www/vpn_openvpn_csc.php:625
+#: usr/local/www/vpn_openvpn_csc.php:633
+#: usr/local/www/vpn_openvpn_server.php:40
+#: usr/local/www/vpn_openvpn_server.php:583
+#: usr/local/www/vpn_openvpn_server.php:1238
+#: usr/local/www/vpn_openvpn_server.php:1246
+#: usr/local/www/vpn_openvpn_server.php:1254
+#: usr/local/www/vpn_openvpn_server.php:1262
+#: usr/local/www/vpn_openvpn_server.php:1290
+#: usr/local/www/vpn_openvpn_server.php:1298
+#: usr/local/www/vpn_openvpn_server.php:1386
+#: usr/local/www/vpn_openvpn_server.php:1394
+#: usr/local/www/diag_logs_settings.php:286
+#: usr/local/www/diag_logs_settings.php:290
+#: usr/local/www/diag_logs_settings.php:294 usr/local/www/status_ntpd.php:108
+#: usr/local/www/diag_dns.php:207 usr/local/www/vpn_openvpn_server.php:656
+#: usr/local/www/vpn_openvpn_server.php:1380
+#: usr/local/www/vpn_openvpn_server.php:1388
+#: usr/local/www/vpn_openvpn_server.php:1396
+#: usr/local/www/vpn_openvpn_server.php:1404
+#: usr/local/www/vpn_openvpn_server.php:1432
+#: usr/local/www/vpn_openvpn_server.php:1440
+#: usr/local/www/vpn_openvpn_server.php:1528
+#: usr/local/www/vpn_openvpn_server.php:1536
+#: usr/local/www/vpn_openvpn_client.php:370
+#: usr/local/www/vpn_openvpn_client.php:867
+#: usr/local/www/diag_logs_settings.php:306
+#: usr/local/www/diag_logs_settings.php:310
+#: usr/local/www/diag_logs_settings.php:314
+#: usr/local/www/vpn_ipsec_mobile.php:545
+#: usr/local/www/vpn_ipsec_mobile.php:551
+#: usr/local/www/vpn_ipsec_mobile.php:557
+#: usr/local/www/vpn_ipsec_mobile.php:563
+#: usr/local/www/vpn_ipsec_mobile.php:587
+#: usr/local/www/vpn_ipsec_mobile.php:593
+#: usr/local/www/vpn_openvpn_csc.php:292 usr/local/www/vpn_openvpn_csc.php:476
+#: usr/local/www/vpn_openvpn_csc.php:484 usr/local/www/vpn_openvpn_csc.php:492
+#: usr/local/www/vpn_openvpn_csc.php:500 usr/local/www/vpn_openvpn_csc.php:528
+#: usr/local/www/vpn_openvpn_csc.php:536 usr/local/www/vpn_openvpn_csc.php:624
+#: usr/local/www/vpn_openvpn_csc.php:632 usr/local/www/status_ntpd.php:124
+#: usr/local/www/vpn_openvpn_server.php:423
+#: usr/local/www/vpn_openvpn_server.php:674
+#: usr/local/www/vpn_openvpn_server.php:1422
+#: usr/local/www/vpn_openvpn_server.php:1430
+#: usr/local/www/vpn_openvpn_server.php:1438
+#: usr/local/www/vpn_openvpn_server.php:1446
+#: usr/local/www/vpn_openvpn_server.php:1474
+#: usr/local/www/vpn_openvpn_server.php:1482
+#: usr/local/www/vpn_openvpn_server.php:1570
+#: usr/local/www/vpn_openvpn_server.php:1578
+#: usr/local/www/vpn_openvpn_client.php:378
+#: usr/local/www/vpn_openvpn_client.php:920
+#: usr/local/www/vpn_openvpn_client.php:396
+#: usr/local/www/vpn_openvpn_client.php:939
+#: usr/local/www/vpn_openvpn_server.php:445
+#: usr/local/www/vpn_openvpn_server.php:700
+#: usr/local/www/vpn_openvpn_server.php:1490
+#: usr/local/www/vpn_openvpn_server.php:1498
+#: usr/local/www/vpn_openvpn_server.php:1526
+#: usr/local/www/vpn_openvpn_server.php:1534
+#: usr/local/www/vpn_openvpn_server.php:1622
+#: usr/local/www/vpn_openvpn_server.php:1630 usr/local/www/status_ntpd.php:130
+#: usr/local/www/diag_dns.php:156 usr/local/www/diag_dns.php:224
+#: usr/local/www/services_rfc2136.php:80
+#: usr/local/www/diag_logs_settings.php:337
+#: usr/local/www/diag_logs_settings.php:341
+#: usr/local/www/diag_logs_settings.php:345
+#: usr/local/www/services_rfc2136_edit.php:185
+msgid "Server"
+msgstr "Servidor"
+
+#: usr/local/www/diag_logs_settings.php:296
+msgid "IP addresses of remote syslog servers"
+msgstr "Endereços IP de servidores syslog remotos"
+
+#: usr/local/www/diag_logs_settings.php:300
+#: usr/local/www/diag_logs_settings.php:309
+#: usr/local/www/diag_logs_settings.php:329
+#: usr/local/www/diag_logs_settings.php:360
+msgid "System events"
+msgstr "Eventos do sistema"
+
+#: usr/local/www/diag_logs_settings.php:302
+#: usr/local/www/diag_logs_settings.php:311
+#: usr/local/www/diag_logs_settings.php:331
+#: usr/local/www/diag_logs_settings.php:362
+msgid "Firewall events"
+msgstr "Eventos do firewall"
+
+#: usr/local/www/diag_logs_settings.php:304
+#: usr/local/www/diag_logs_settings.php:313
+#: usr/local/www/diag_logs_settings.php:333
+#: usr/local/www/diag_logs_settings.php:364
+msgid "DHCP service events"
+msgstr "eventos do serviço DHCP"
+
+#: usr/local/www/diag_logs_settings.php:306
+#: usr/local/www/diag_logs_settings.php:315
+#: usr/local/www/diag_logs_settings.php:335
+#: usr/local/www/diag_logs_settings.php:366
+msgid "Portal Auth events"
+msgstr "Eventos de autenticação do portal"
+
+#: usr/local/www/diag_logs_settings.php:308
+#: usr/local/www/diag_logs_settings.php:317
+#: usr/local/www/diag_logs_settings.php:337
+#: usr/local/www/diag_logs_settings.php:368
+msgid "VPN (PPTP, IPsec, OpenVPN) events"
+msgstr "Eventos VPN (PPTP, IPsec, OpenVPN)"
+
+#: usr/local/www/diag_logs_settings.php:310
+#: usr/local/www/diag_logs_settings.php:319
+#: usr/local/www/diag_logs_settings.php:339
+#: usr/local/www/diag_logs_settings.php:370
+msgid "Gateway Monitor events"
+msgstr "Eventos do Monitor de Gateway"
+
+#: usr/local/www/diag_logs_settings.php:312
+#: usr/local/www/diag_logs_settings.php:321
+#: usr/local/www/diag_logs_settings.php:341
+#: usr/local/www/diag_logs_settings.php:372
+msgid "Server Load Balancer events"
+msgstr "Eventos do Servidor Load Balancer"
+
+#: usr/local/www/diag_logs_settings.php:314
+#: usr/local/www/diag_logs_settings.php:323
+#: usr/local/www/diag_logs_settings.php:343
+#: usr/local/www/diag_logs_settings.php:374
+msgid "Wireless events"
+msgstr "Eventos Wireless"
+
+#: usr/local/www/diag_logs_settings.php:316
+#: usr/local/www/diag_logs_settings.php:307
+#: usr/local/www/diag_logs_settings.php:327
+#: usr/local/www/diag_logs_settings.php:358
+msgid "Everything"
+msgstr "Tudo"
+
+#: usr/local/www/diag_logs_settings.php:327
+msgid "syslog sends UDP datagrams to port 514 on the specified remote syslog server. Be sure to set syslogd on the remote server to accept syslog messages from"
+msgstr "syslog envia datagramas UDP para a porta 514 no servidor syslog remoto especificado. Certifique-se de definir o syslogd no servidor remoto para aceitar mensagens syslog de"
+
+#: usr/local/www/diag_logs_vpn.php:144 usr/local/www/diag_logs_vpn.php:143
+msgid "PPTP Logins"
+msgstr "PPTP Logins"
+
+#: usr/local/www/diag_logs_vpn.php:147 usr/local/www/diag_logs_vpn.php:146
+msgid "PPTP Raw"
+msgstr "PPTP Raw"
+
+#: usr/local/www/diag_logs_vpn.php:150 usr/local/www/diag_logs_vpn.php:149
+msgid "PPPoE Logins"
+msgstr "PPPoE Logins"
+
+#: usr/local/www/diag_logs_vpn.php:153 usr/local/www/diag_logs_vpn.php:152
+msgid "PPPoE Raw"
+msgstr "PPPoE Raw"
+
+#: usr/local/www/diag_logs_vpn.php:156 usr/local/www/diag_logs_vpn.php:155
+msgid "L2TP Logins"
+msgstr "L2TP Logins"
+
+#: usr/local/www/diag_logs_vpn.php:159 usr/local/www/diag_logs_vpn.php:158
+msgid "L2TP Raw"
+msgstr "L2TP Raw"
+
+#: usr/local/www/diag_logs_vpn.php:171 usr/local/www/diag_logs_vpn.php:170
+#, php-format
+msgid "Last %1$s %2$s VPN log entries"
+msgstr "Últimos %1$s %2$s logs de entrada VPN"
+
+#: usr/local/www/diag_logs_vpn.php:176
+#: usr/local/www/firewall_rules_edit.php:659
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:484
+#: usr/local/www/services_unbound_acls.php:211
+#: usr/local/www/services_unbound_acls.php:318
+#: usr/local/www/load_balancer_relay_action_edit.php:483
+#: usr/local/www/firewall_rules_edit.php:692
+#: usr/local/www/diag_logs_vpn.php:175
+#: usr/local/www/load_balancer_relay_action_edit.php:481
+#: usr/local/www/firewall_rules_edit.php:695
+#: usr/local/www/firewall_rules_edit.php:707
+#: usr/local/www/diag_logs_filter.php:151
+#: usr/local/www/firewall_rules_edit.php:755
+msgid "Action"
+msgstr "Ação"
+
+#: usr/local/www/diag_logs_vpn.php:177
+#: usr/local/www/diag_authentication.php:59
+#: usr/local/www/vpn_pptp_users_edit.php:135
+#: usr/local/www/system_groupmanager.php:426
+#: usr/local/www/system_usermanager.php:89
+#: usr/local/www/system_usermanager.php:808
+#: usr/local/www/vpn_l2tp_users_edit.php:38
+#: usr/local/www/system_usermanager.php:806
+#: usr/local/www/diag_logs_vpn.php:176
+#: usr/local/www/system_groupmanager.php:429
+#: usr/local/www/system_usermanager.php:809
+#: usr/local/www/system_groupmanager.php:448
+#: usr/local/www/system_usermanager.php:832
+#: usr/local/www/system_groupmanager.php:451
+msgid "User"
+msgstr "Usuário"
+
+#: usr/local/www/diag_nanobsd.php:49 usr/local/www/fbegin.inc:212
+#: usr/local/www/fbegin.inc:230 usr/local/www/fbegin.inc:239
+#: usr/local/www/fbegin.inc:231
+msgid "NanoBSD"
+msgstr "NanoBSD"
+
+#: usr/local/www/diag_nanobsd.php:70 usr/local/www/diag_nanobsd.php:69
+msgid "Setting slice information, please wait..."
+msgstr "Definindo informações da fatia, por favor aguarde..."
+
+#: usr/local/www/diag_nanobsd.php:79 usr/local/www/diag_nanobsd.php:78
+msgid "The boot slice has been set to"
+msgstr "O boot slice foi definido como"
+
+#: usr/local/www/diag_nanobsd.php:86 usr/local/www/diag_nanobsd.php:85
+msgid "Duplicating slice. Please wait, this will take a moment..."
+msgstr "Duplicando slice. Por favor aguarde, isto vai levar um momento..."
+
+#: usr/local/www/diag_nanobsd.php:95 usr/local/www/diag_nanobsd.php:94
+msgid "The slice has been duplicated."
+msgstr "O slice foi duplicado."
+
+#: usr/local/www/diag_nanobsd.php:95 usr/local/www/diag_nanobsd.php:94
+msgid "If you would like to boot from this newly duplicated slice please set it using the bootup information area."
+msgstr "Se você gostaria de fazer boot neste novo slice duplicado, por favor defina isto utilizando a área de informação de boot."
+
+#: usr/local/www/diag_nanobsd.php:97 usr/local/www/diag_nanobsd.php:96
+msgid "There was an error while duplicating the slice. Operation aborted."
+msgstr "Ocorreu um erro durante a duplicação do slice. Operação abortada."
+
+#: usr/local/www/diag_nanobsd.php:128 usr/local/www/interfaces.php:2550
+#: usr/local/www/interfaces.php:2559
+#: usr/local/www/system_firmware_settings.php:151
+#: usr/local/www/system_routes_edit.php:334
+#: usr/local/www/load_balancer_virtual_server_edit.php:212
+#: usr/local/www/load_balancer_virtual_server_edit.php:231
+#: usr/local/www/load_balancer_virtual_server_edit.php:244
+#: usr/local/www/system_advanced_firewall.php:231
+#: usr/local/www/system_advanced_misc.php:221
+#: usr/local/www/system_advanced_network.php:197
+#: usr/local/www/system_advanced_sysctl.php:163
+#: usr/local/www/system_routes_edit.php:374
+#: usr/local/www/system_advanced_firewall.php:245
+#: usr/local/www/system_advanced_admin.php:289
+#: usr/local/www/system_advanced_misc.php:247
+#: usr/local/www/load_balancer_virtual_server_edit.php:201
+#: usr/local/www/load_balancer_virtual_server_edit.php:220
+#: usr/local/www/load_balancer_virtual_server_edit.php:233
+#: usr/local/www/interfaces.php:2752 usr/local/www/interfaces.php:2761
+#: usr/local/www/diag_nanobsd.php:127 usr/local/www/system_routes_edit.php:375
+#: usr/local/www/system_advanced_misc.php:266
+#: usr/local/www/load_balancer_virtual_server_edit.php:199
+#: usr/local/www/load_balancer_virtual_server_edit.php:218
+#: usr/local/www/system_firmware_settings.php:156
+#: usr/local/www/interfaces.php:2740 usr/local/www/interfaces.php:2749
+#: usr/local/www/diag_nanobsd.php:148
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/system_advanced_misc.php:270
+#: usr/local/www/system_advanced_firewall.php:274
+#: usr/local/www/interfaces.php:2774 usr/local/www/interfaces.php:2783
+#: usr/local/www/system_firmware_settings.php:167
+#: usr/local/www/system_advanced_misc.php:317
+#: usr/local/www/system_routes_edit.php:399
+#: usr/local/www/system_advanced_firewall.php:273
+#: usr/local/www/diag_nanobsd.php:139 usr/local/www/interfaces.php:2820
+#: usr/local/www/interfaces.php:2829 usr/local/www/system_routes_edit.php:409
+#: usr/local/www/interfaces.php:2806 usr/local/www/interfaces.php:2815
+#: usr/local/www/system_routes_edit.php:411
+#: usr/local/www/system_advanced_admin.php:310
+#: usr/local/www/system_advanced_misc.php:323
+#: usr/local/www/system_advanced_firewall.php:284
+#: usr/local/www/system_advanced_network.php:196
+#: usr/local/www/interfaces.php:2842 usr/local/www/interfaces.php:2851
+msgid "NOTE:"
+msgstr "NOTA:"
+
+#: usr/local/www/diag_nanobsd.php:130
+#: usr/local/www/system_advanced_admin.php:291
+#: usr/local/www/system_advanced_firewall.php:233
+#: usr/local/www/system_advanced_misc.php:223
+#: usr/local/www/system_advanced_network.php:199
+#: usr/local/www/system_advanced_sysctl.php:165
+#: usr/local/www/system_advanced_firewall.php:247
+#: usr/local/www/system_advanced_misc.php:249
+#: usr/local/www/diag_nanobsd.php:129
+#: usr/local/www/system_advanced_misc.php:268
+#: usr/local/www/diag_nanobsd.php:150
+#: usr/local/www/system_advanced_misc.php:272
+#: usr/local/www/system_advanced_firewall.php:276
+#: usr/local/www/system_advanced_misc.php:319
+#: usr/local/www/system_advanced_firewall.php:275
+#: usr/local/www/diag_nanobsd.php:141
+#: usr/local/www/system_advanced_admin.php:312
+#: usr/local/www/system_advanced_misc.php:325
+#: usr/local/www/system_advanced_firewall.php:286
+#: usr/local/www/system_advanced_network.php:198
+msgid "The options on this page are intended for use by advanced users only."
+msgstr "As opções nesta página são destinados somente para o uso de usuários avançados."
+
+#: usr/local/www/diag_nanobsd.php:136 usr/local/www/diag_nanobsd.php:135
+#: usr/local/www/diag_nanobsd.php:156 usr/local/www/diag_nanobsd.php:147
+msgid "Bootup information"
+msgstr "Informação de boot"
+
+#: usr/local/www/diag_nanobsd.php:139 usr/local/www/diag_nanobsd.php:138
+#: usr/local/www/diag_nanobsd.php:159 usr/local/www/diag_nanobsd.php:150
+msgid "NanoBSD Image size"
+msgstr "Tamanho da imagem NanoBSD"
+
+#: usr/local/www/diag_nanobsd.php:145 usr/local/www/diag_nanobsd.php:144
+#: usr/local/www/diag_nanobsd.php:165 usr/local/www/diag_nanobsd.php:156
+msgid "Bootup"
+msgstr "Bootup"
+
+#: usr/local/www/diag_nanobsd.php:148 usr/local/www/diag_nanobsd.php:147
+#: usr/local/www/diag_nanobsd.php:168 usr/local/www/diag_nanobsd.php:159
+msgid "Bootup slice is currently:"
+msgstr "Bootup slice atualmente é:"
+
+#: usr/local/www/diag_nanobsd.php:149 usr/local/www/diag_nanobsd.php:148
+#: usr/local/www/diag_nanobsd.php:169 usr/local/www/diag_nanobsd.php:160
+msgid "This will switch the bootup slice to the alternate slice."
+msgstr "Isto irá trocar o boot slice para o slice substituto."
+
+#: usr/local/www/diag_nanobsd.php:159 usr/local/www/diag_nanobsd.php:158
+#: usr/local/www/diag_nanobsd.php:217 usr/local/www/diag_nanobsd.php:208
+msgid "Duplicate bootup slice to alternate"
+msgstr "Duplicar bootup slice para alternar"
+
+#: usr/local/www/diag_nanobsd.php:162 usr/local/www/diag_nanobsd.php:161
+#: usr/local/www/diag_nanobsd.php:220 usr/local/www/diag_nanobsd.php:211
+msgid "Duplicate bootup slice"
+msgstr "Duplicar bootup slice"
+
+#: usr/local/www/diag_nanobsd.php:165 usr/local/www/diag_nanobsd.php:164
+#: usr/local/www/diag_nanobsd.php:223 usr/local/www/diag_nanobsd.php:214
+msgid "Destination slice:"
+msgstr "Fatia de destino:"
+
+#: usr/local/www/diag_nanobsd.php:172 usr/local/www/diag_nanobsd.php:171
+#: usr/local/www/diag_nanobsd.php:230 usr/local/www/diag_nanobsd.php:221
+msgid "This will duplicate the bootup slice to the alternate slice. Use this if you would like to duplicate the known good working boot partition to the alternate."
+msgstr "Isso irá duplicar a fatia de bootup para a alternativa. Use isso se gostaria de duplicar a partição de boot em bom funcionamento conhecida para a alternativa."
+
+#: usr/local/www/diag_nanobsd.php:182 usr/local/www/diag_nanobsd.php:181
+#: usr/local/www/diag_nanobsd.php:240 usr/local/www/diag_nanobsd.php:231
+msgid "Periodic Data Backup"
+msgstr "Cópia de dados periódica"
+
+#: usr/local/www/diag_nanobsd.php:185 usr/local/www/diag_nanobsd.php:184
+#: usr/local/www/diag_nanobsd.php:243
+msgid "RRD Backup"
+msgstr "RRD Backup"
+
+#: usr/local/www/diag_nanobsd.php:188 usr/local/www/diag_nanobsd.php:205
+#: usr/local/www/diag_nanobsd.php:187 usr/local/www/diag_nanobsd.php:204
+#: usr/local/www/diag_nanobsd.php:246 usr/local/www/diag_nanobsd.php:263
+#: usr/local/www/system_advanced_misc.php:602
+#: usr/local/www/system_advanced_misc.php:618
+#: usr/local/www/system_advanced_misc.php:620
+#: usr/local/www/system_advanced_misc.php:636
+msgid "Frequency:"
+msgstr "Frequência:"
+
+#: usr/local/www/diag_nanobsd.php:190 usr/local/www/diag_nanobsd.php:207
+#: usr/local/www/system_firmware.php:133
+#: usr/local/www/services_dyndns_edit.php:152
+#: usr/local/www/vpn_ipsec_phase1.php:812
+#: usr/local/www/services_dyndns_edit.php:210
+#: usr/local/www/system_advanced_firewall.php:410
+#: usr/local/www/firewall_nat_edit.php:796
+#: usr/local/www/vpn_ipsec_phase1.php:825 usr/local/www/diag_nanobsd.php:189
+#: usr/local/www/diag_nanobsd.php:206 usr/local/www/system_firmware.php:140
+#: usr/local/www/firewall_nat_edit.php:795
+#: usr/local/www/vpn_ipsec_phase1.php:822 usr/local/www/diag_nanobsd.php:248
+#: usr/local/www/diag_nanobsd.php:265 usr/local/www/system_firmware.php:135
+#: usr/local/www/services_dyndns_edit.php:214
+#: usr/local/www/firewall_nat_edit.php:790
+#: usr/local/www/system_advanced_firewall.php:472
+#: usr/local/www/vpn_ipsec_phase1.php:843
+#: usr/local/www/services_dyndns_edit.php:216
+#: usr/local/www/firewall_nat_edit.php:802
+#: usr/local/www/system_advanced_misc.php:604
+#: usr/local/www/system_advanced_misc.php:620
+#: usr/local/www/system_advanced_firewall.php:473
+#: usr/local/www/firewall_nat_edit.php:803
+#: usr/local/www/services_dyndns_edit.php:217
+#: usr/local/www/system_advanced_misc.php:622
+#: usr/local/www/system_advanced_misc.php:638
+#: usr/local/www/system_advanced_firewall.php:494
+msgid "Disable"
+msgstr "Desabilitar"
+
+#: usr/local/www/diag_nanobsd.php:192 usr/local/www/diag_nanobsd.php:209
+#: usr/local/www/diag_nanobsd.php:191 usr/local/www/diag_nanobsd.php:208
+#: usr/local/www/diag_nanobsd.php:250 usr/local/www/diag_nanobsd.php:267
+#: usr/local/www/system_advanced_misc.php:606
+#: usr/local/www/system_advanced_misc.php:622
+#: usr/local/www/system_advanced_misc.php:624
+#: usr/local/www/system_advanced_misc.php:640
+msgid "hour"
+msgstr "hora"
+
+#: usr/local/www/diag_nanobsd.php:196 usr/local/www/diag_nanobsd.php:195
+#: usr/local/www/diag_nanobsd.php:254
+#: usr/local/www/system_advanced_misc.php:610
+#: usr/local/www/system_advanced_misc.php:628
+msgid "This will periodically backup the RRD data so it can be restored automatically on the next boot. Keep in mind that the more frequent the backup, the more writes will happen to your media."
+msgstr "Isto irá, periodicamente, fazer backup dos dados RRD, então eles pode ser restaurados automaticamente no próximo boot. Tenha em mente que quanto mais frequente o backup, mais escritas serão feitas na midia."
+
+#: usr/local/www/diag_nanobsd.php:202 usr/local/www/diag_nanobsd.php:201
+#: usr/local/www/diag_nanobsd.php:260
+msgid "DHCP Leases Backup"
+msgstr "Backup de Concessões DHCP"
+
+#: usr/local/www/diag_nanobsd.php:213 usr/local/www/diag_nanobsd.php:212
+#: usr/local/www/diag_nanobsd.php:271
+#: usr/local/www/system_advanced_misc.php:626
+#: usr/local/www/system_advanced_misc.php:644
+msgid "This will periodically backup the DHCP leases data so it can be restored automatically on the next boot. Keep in mind that the more frequent the backup, the more writes will happen to your media."
+msgstr "Isto irá, periodicamente, fazer backup dos dados de concessões DHCP, então eles podem ser restaurados automaticamente no próximo boot. Tenha em mente que quanto mais frequente o backup, mais escritas irão ocorrer na midia."
+
+#: usr/local/www/diag_nanobsd.php:226 usr/local/www/diag_nanobsd.php:225
+#: usr/local/www/diag_nanobsd.php:284 usr/local/www/diag_nanobsd.php:244
+msgid "View upgrade log"
+msgstr "Ver log de upgrade"
+
+#: usr/local/www/diag_nanobsd.php:229 usr/local/www/diag_nanobsd.php:228
+#: usr/local/www/diag_nanobsd.php:287 usr/local/www/diag_nanobsd.php:247
+msgid "View previous upgrade log"
+msgstr "Ver log de upgrade anterior"
+
+#: usr/local/www/diag_packet_capture.php:38
+#: usr/local/www/diag_packet_capture.php:225
+#: usr/local/www/diag_packet_capture.php:246
+#: usr/local/www/diag_packet_capture.php:40
+#: usr/local/www/diag_packet_capture.php:293
+#: usr/local/www/diag_packet_capture.php:311
+msgid "Download Capture"
+msgstr "Baixar captura"
+
+#: usr/local/www/diag_packet_capture.php:41 usr/local/www/fbegin.inc:210
+#: usr/local/www/fbegin.inc:228 usr/local/www/fbegin.inc:237
+#: usr/local/www/diag_packet_capture.php:43 usr/local/www/fbegin.inc:229
+msgid "Packet Capture"
+msgstr "Captura de pacotes"
+
+#: usr/local/www/diag_packet_capture.php:71
+#: usr/local/www/diag_packet_capture.php:220
+#: usr/local/www/diag_packet_capture.php:265
+#: usr/local/www/status_dhcp_leases.php:321
+#: usr/local/www/status_dhcpv6_leases.php:363
+#: usr/local/www/status_dhcpv6_leases.php:407
+#: usr/local/www/status_dhcpv6_leases.php:484
+#: usr/local/www/status_dhcp_leases.php:342
+#: usr/local/www/diag_packet_capture.php:75
+#: usr/local/www/diag_packet_capture.php:240
+#: usr/local/www/diag_packet_capture.php:294
+#: usr/local/www/status_dhcpv6_leases.php:408
+#: usr/local/www/status_dhcpv6_leases.php:485
+#: usr/local/www/status_dhcp_leases.php:344
+#: usr/local/www/diag_packet_capture.php:129
+#: usr/local/www/diag_packet_capture.php:287
+#: usr/local/www/diag_packet_capture.php:341
+#: usr/local/www/status_dhcpv6_leases.php:411
+#: usr/local/www/status_dhcpv6_leases.php:488
+#: usr/local/www/diag_packet_capture.php:137
+#: usr/local/www/diag_packet_capture.php:305
+#: usr/local/www/diag_packet_capture.php:359
+#: usr/local/www/status_dhcp_leases.php:345
+msgid "Start"
+msgstr "Iniciar"
+
+#: usr/local/www/diag_packet_capture.php:78
+#: usr/local/www/diag_packet_capture.php:219
+#: usr/local/www/diag_packet_capture.php:222
+#: usr/local/www/diag_packet_capture.php:82
+#: usr/local/www/diag_packet_capture.php:239
+#: usr/local/www/diag_packet_capture.php:242
+#: usr/local/www/diag_packet_capture.php:136
+#: usr/local/www/diag_packet_capture.php:286
+#: usr/local/www/diag_packet_capture.php:289
+#: usr/local/www/diag_packet_capture.php:144
+#: usr/local/www/diag_packet_capture.php:304
+#: usr/local/www/diag_packet_capture.php:307
+msgid "Stop"
+msgstr "Parar"
+
+#: usr/local/www/diag_packet_capture.php:116
+#: usr/local/www/diag_packet_capture.php:120
+#: usr/local/www/diag_packet_capture.php:178
+#: usr/local/www/diag_packet_capture.php:186
+msgid "Packet capture"
+msgstr "Captura de pacotes"
+
+#: usr/local/www/diag_packet_capture.php:141
+#: usr/local/www/diag_packet_capture.php:145
+#: usr/local/www/diag_packet_capture.php:192
+#: usr/local/www/diag_packet_capture.php:200
+msgid "Select the interface on which to capture traffic."
+msgstr "Selecione a interface onde capturar o tráfego."
+
+#: usr/local/www/diag_packet_capture.php:145
+#: usr/local/www/system_gateways_edit.php:376
+#: usr/local/www/diag_packet_capture.php:149
+#: usr/local/www/system_gateways_edit.php:482
+#: usr/local/www/diag_packet_capture.php:196
+#: usr/local/www/system_gateways_edit.php:484
+#: usr/local/www/diag_packet_capture.php:212
+#: usr/local/www/system_gateways_edit.php:514
+msgid "Address Family"
+msgstr "Família de Endereços"
+
+#: usr/local/www/diag_packet_capture.php:152
+#: usr/local/www/diag_packet_capture.php:156
+#: usr/local/www/diag_packet_capture.php:203
+#: usr/local/www/diag_packet_capture.php:219
+msgid "Select the type of traffic to be captured, either Any, IPv4 only or IPv6 only."
+msgstr "Selecione o tipo de tráfego a ser capturado, Qualquer um, IPv4 apenas ou IPv6 apenas."
+
+#: usr/local/www/diag_packet_capture.php:156
+#: usr/local/www/diag_packet_capture.php:176
+#: usr/local/www/diag_packet_capture.php:223
+#: usr/local/www/diag_packet_capture.php:239
+msgid "Host Address"
+msgstr "Endereço do Host"
+
+#: usr/local/www/diag_packet_capture.php:159
+#: usr/local/www/diag_packet_capture.php:179
+#: usr/local/www/diag_packet_capture.php:226
+#: usr/local/www/diag_packet_capture.php:242
+msgid "This value is either the Source or Destination IP address or subnet in CIDR notation. The packet capture will look for this address in either field."
+msgstr "Este campo é o endereço IP tanto de Origem como Destino ou subrede na notação CIDR. A captura de pacotes irá observar os dois campos por este endereço."
+
+#: usr/local/www/diag_packet_capture.php:160
+#: usr/local/www/diag_packet_capture.php:180
+#: usr/local/www/diag_packet_capture.php:227
+#: usr/local/www/diag_packet_capture.php:243
+msgid "This value can be a domain name or IP address, or subnet in CIDR notation."
+msgstr "Este valor pode ser um nome de domínio, um endereço IP ou uma subrede no formato CIDR."
+
+#: usr/local/www/diag_packet_capture.php:161
+#: usr/local/www/diag_packet_capture.php:181
+#: usr/local/www/diag_packet_capture.php:228
+#: usr/local/www/diag_packet_capture.php:244
+msgid "If you leave this field blank, all packets on the specified interface will be captured."
+msgstr "Se você deixar esse campo em branco, todos os pacotes na interface especificada serão capturados."
+
+#: usr/local/www/diag_packet_capture.php:168
+#: usr/local/www/diag_packet_capture.php:188
+#: usr/local/www/diag_packet_capture.php:235
+#: usr/local/www/diag_packet_capture.php:251
+msgid "The port can be either the source or destination port. The packet capture will look for this port in either field."
+msgstr "A porta pode ser também a porta de destino ou origem. A captura de pacotes irá procurar por essa porta em qualquer campo."
+
+#: usr/local/www/diag_packet_capture.php:169
+#: usr/local/www/diag_packet_capture.php:189
+#: usr/local/www/diag_packet_capture.php:236
+#: usr/local/www/diag_packet_capture.php:252
+msgid "Leave blank if you do not want to filter by port."
+msgstr "Deixe em branco se você não desejar filtrar por porta."
+
+#: usr/local/www/diag_packet_capture.php:173
+#: usr/local/www/diag_packet_capture.php:193
+#: usr/local/www/diag_packet_capture.php:240
+#: usr/local/www/diag_packet_capture.php:256
+msgid "Packet Length"
+msgstr "Tamanho do Pacote"
+
+#: usr/local/www/diag_packet_capture.php:176
+#: usr/local/www/diag_packet_capture.php:196
+#: usr/local/www/diag_packet_capture.php:243
+#: usr/local/www/diag_packet_capture.php:259
+msgid "The Packet length is the number of bytes of each packet that will be captured. Default value is 0, which will capture the entire frame regardless of its size."
+msgstr "O tamanho do pacote é o número de bytes de cada pacote que será capturado. O valor padrão é 0, o qual irá capturar todo o quadro independentemente do seu tamanho."
+
+#: usr/local/www/diag_packet_capture.php:180 usr/local/www/diag_ping.php:55
+#: usr/local/www/diag_ping.php:108
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/services_captiveportal_vouchers_edit.php:189
+#: usr/local/www/diag_packet_capture.php:200
+#: usr/local/www/services_captiveportal_vouchers_edit.php:92
+#: usr/local/www/services_captiveportal_vouchers_edit.php:187
+#: usr/local/www/diag_packet_capture.php:247
+#: usr/local/www/diag_packet_capture.php:263 usr/local/www/diag_ping.php:57
+#: usr/local/www/diag_ping.php:129
+msgid "Count"
+msgstr "Contagem"
+
+#: usr/local/www/diag_packet_capture.php:183
+#: usr/local/www/diag_packet_capture.php:203
+#: usr/local/www/diag_packet_capture.php:250
+#: usr/local/www/diag_packet_capture.php:266
+msgid "This is the number of packets the packet capture will grab. Default value is 100."
+msgstr "Esse é o número de pacotes que a captura de pacotes irá pegar. O valor padrão é 100."
+
+#: usr/local/www/diag_packet_capture.php:183
+#: usr/local/www/diag_packet_capture.php:203
+#: usr/local/www/diag_packet_capture.php:250
+#: usr/local/www/diag_packet_capture.php:266
+msgid "Enter 0 (zero) for no count limit."
+msgstr "Digite 0 (zero) para não ter limite de contagem."
+
+#: usr/local/www/diag_packet_capture.php:186
+#: usr/local/www/diag_packet_capture.php:206
+#: usr/local/www/diag_packet_capture.php:253
+#: usr/local/www/diag_packet_capture.php:270
+msgid "Level of Detail"
+msgstr "Nível de detalhe"
+
+#: usr/local/www/diag_packet_capture.php:189
+#: usr/local/www/diag_packet_capture.php:209
+#: usr/local/www/diag_packet_capture.php:256
+#: usr/local/www/diag_packet_capture.php:273
+msgid "Normal"
+msgstr "Normal"
+
+#: usr/local/www/diag_packet_capture.php:190
+#: usr/local/www/diag_packet_capture.php:210
+#: usr/local/www/diag_packet_capture.php:257
+#: usr/local/www/diag_packet_capture.php:274
+msgid "Medium"
+msgstr "Médio"
+
+#: usr/local/www/diag_packet_capture.php:191
+#: usr/local/www/diag_packet_capture.php:211
+#: usr/local/www/diag_packet_capture.php:258
+#: usr/local/www/diag_packet_capture.php:275
+msgid "High"
+msgstr "Alto"
+
+#: usr/local/www/diag_packet_capture.php:192
+#: usr/local/www/diag_packet_capture.php:212
+#: usr/local/www/diag_packet_capture.php:259
+#: usr/local/www/diag_packet_capture.php:276
+msgid "Full"
+msgstr "Total"
+
+#: usr/local/www/diag_packet_capture.php:194
+#: usr/local/www/diag_packet_capture.php:214
+#: usr/local/www/diag_packet_capture.php:261
+#: usr/local/www/diag_packet_capture.php:278
+msgid "This is the level of detail that will be displayed after hitting 'Stop' when the packets have been captured."
+msgstr "Este é o nível de detalhes que será exibido após apertar 'Stop', quando os pacotes forem capturados."
+
+#: usr/local/www/diag_packet_capture.php:196
+#: usr/local/www/diag_packet_capture.php:216
+#: usr/local/www/diag_packet_capture.php:263
+#: usr/local/www/diag_packet_capture.php:280
+msgid "This option does not affect the level of detail when downloading the packet capture."
+msgstr "Essa opção não afeta o nível de detalhe quando baixar a captura de pacote."
+
+#: usr/local/www/diag_packet_capture.php:199
+#: usr/local/www/diag_packet_capture.php:219
+#: usr/local/www/diag_packet_capture.php:266
+#: usr/local/www/diag_packet_capture.php:284
+msgid "Reverse DNS Lookup"
+msgstr "DNS Lookup Reverso"
+
+#: usr/local/www/diag_packet_capture.php:202
+#: usr/local/www/diag_packet_capture.php:222
+#: usr/local/www/diag_packet_capture.php:269
+#: usr/local/www/diag_packet_capture.php:287
+msgid "This check box will cause the packet capture to perform a reverse DNS lookup associated with all IP addresses."
+msgstr "Essa caixa de seleção irá fazer com que a captura de pacote realize um consulta de DNS reversa associada com todos os endereços IP."
+
+#: usr/local/www/diag_packet_capture.php:203
+#: usr/local/www/diag_packet_capture.php:223
+#: usr/local/www/diag_packet_capture.php:270
+#: usr/local/www/diag_packet_capture.php:288
+msgid "This option can cause delays for large packet captures."
+msgstr "Esta opção pode causar atrasos na captura de grandes pacotes."
+
+#: usr/local/www/diag_packet_capture.php:226
+#: usr/local/www/diag_packet_capture.php:247
+#: usr/local/www/diag_packet_capture.php:294
+#: usr/local/www/diag_packet_capture.php:312
+msgid "The packet capture file was last updated:"
+msgstr "A última atualização da captura de pacotes foi:"
+
+#: usr/local/www/diag_packet_capture.php:239
+#: usr/local/www/diag_packet_capture.php:267
+#: usr/local/www/diag_packet_capture.php:260
+#: usr/local/www/diag_packet_capture.php:296
+#: usr/local/www/diag_packet_capture.php:307
+#: usr/local/www/diag_packet_capture.php:343
+#: usr/local/www/diag_packet_capture.php:325
+#: usr/local/www/diag_packet_capture.php:361
+msgid "Packet Capture is running."
+msgstr "Captura de pacotes está em execução."
+
+#: usr/local/www/diag_packet_capture.php:272
+#: usr/local/www/diag_packet_capture.php:301
+#: usr/local/www/diag_packet_capture.php:347
+#: usr/local/www/diag_packet_capture.php:365
+msgid "Packet Capture stopped."
+msgstr "Captura de pacotes parado."
+
+#: usr/local/www/diag_packet_capture.php:272
+#: usr/local/www/diag_packet_capture.php:301
+#: usr/local/www/diag_packet_capture.php:347
+#: usr/local/www/diag_packet_capture.php:365
+msgid "Packets Captured:"
+msgstr "Pacotes capturados:"
+
+#: usr/local/www/crash_reporter.php:68
+msgid "Unfortunately we have detected a programming bug."
+msgstr "Infelizmente nós detectamos um erro de programação."
+
+#: usr/local/www/crash_reporter.php:69
+msgid "Would you like to submit the programming debug logs to the pfSense developers for inspection?"
+msgstr "Você gostaria de enviar os logs de depuração de programação para os desenvolvedores do pfSense para inspeção?"
+
+#: usr/local/www/crash_reporter.php:71
+msgid "Please double check the contents to ensure you are comfortable sending this information before clicking Yes."
+msgstr "Por favor, verifique novamente o conteúdo para garantir que você está confortável enviando estas informações antes de clicar Sim."
+
+#: usr/local/www/crash_reporter.php:73
+msgid "Contents of crash reports"
+msgstr "Conteúdo dos relatórios de falhas"
+
+#: usr/local/www/crash_reporter.php:76
+msgid " - Submit this to the developers for inspection"
+msgstr "- Enviar isto para os desenvolvedores inspecionarem"
+
+#: usr/local/www/crash_reporter.php:77
+msgid " - Just delete the crash report and take me back to the Dashboard"
+msgstr "- Apenas apague o relatório de falhas e me mande de volta para o Dashboard"
+
+#: usr/local/www/crash_reporter.php:82
+msgid "Crash reporter"
+msgstr "Relator de falhas"
+
+#: usr/local/www/crash_reporter.php:101 usr/local/www/crash_reporter.php:103
+msgid "Processing..."
+msgstr "Processando..."
+
+#: usr/local/www/crash_reporter.php:108 usr/local/www/crash_reporter.php:110
+#: usr/local/www/crash_reporter.php:112
+msgid "Uploading..."
+msgstr "Enviando..."
+
+#: usr/local/www/crash_reporter.php:116
+#: usr/local/www/services_captiveportal_zones_edit.php:115
+#: usr/local/www/crash_reporter.php:120
+#: usr/local/www/services_captiveportal_zones_edit.php:117
+#: usr/local/www/crash_reporter.php:122
+msgid "Continue"
+msgstr "Continue"
+
+#: usr/local/www/crash_reporter.php:116 usr/local/www/crash_reporter.php:120
+#: usr/local/www/crash_reporter.php:122
+msgid " and delete crash report files from local disk."
+msgstr "e apagar relatório do disco local."
+
+#: usr/local/www/diag_authentication.php:52
+msgid "is not a valid authentication server"
+msgstr "não é um servidor de autenticação válido"
+
+#: usr/local/www/diag_authentication.php:55
+msgid "A username and password must be specified."
+msgstr "Um nome de usuário e senha devem ser especificados."
+
+#: usr/local/www/diag_authentication.php:59
+msgid "authenticated successfully."
+msgstr "autenticado com sucesso."
+
+#: usr/local/www/diag_authentication.php:61
+msgid "This user is a member of these groups"
+msgstr "Este usuário é um membro destes grupos"
+
+#: usr/local/www/diag_authentication.php:65
+msgid "Authentication failed."
+msgstr "Autenticação falhou."
+
+#: usr/local/www/diag_authentication.php:69 usr/local/www/interfaces.php:2325
+#: usr/local/www/services_captiveportal.php:578
+#: usr/local/www/services_captiveportal.php:893 usr/local/www/fbegin.inc:189
+#: usr/local/www/fbegin.inc:207 usr/local/www/services_captiveportal.php:583
+#: usr/local/www/services_captiveportal.php:938
+#: usr/local/www/interfaces.php:2505 usr/local/www/fbegin.inc:215
+#: usr/local/www/services_captiveportal.php:581
+#: usr/local/www/services_captiveportal.php:934
+#: usr/local/www/interfaces.php:2493
+#: usr/local/www/services_captiveportal.php:575
+#: usr/local/www/services_captiveportal.php:936 usr/local/www/fbegin.inc:206
+#: usr/local/www/interfaces.php:2523
+#: usr/local/www/services_captiveportal.php:591
+#: usr/local/www/services_captiveportal.php:952
+#: usr/local/www/interfaces.php:2569 usr/local/www/interfaces.php:2558
+#: usr/local/www/interfaces.php:2594
+msgid "Authentication"
+msgstr "Autenticação"
+
+#: usr/local/www/diag_authentication.php:90
+#: usr/local/www/system_authservers.php:82
+#: usr/local/www/system_usermanager_settings.php:140
+#: usr/local/www/diag_authentication.php:91
+#: usr/local/www/system_authservers.php:83
+#: usr/local/www/system_usermanager_settings.php:143
+msgid "Authentication Server"
+msgstr "Servidor de autenticação"
+
+#: usr/local/www/diag_authentication.php:106
+#: usr/local/www/status_captiveportal.php:162
+#: usr/local/www/firewall_aliases_edit.php:470
+#: usr/local/www/interfaces.php:1724 usr/local/www/interfaces.php:1789
+#: usr/local/www/interfaces.php:1895
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:191
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:510
+#: usr/local/www/vpn_pptp_users.php:98
+#: usr/local/www/vpn_pptp_users_edit.php:76
+#: usr/local/www/vpn_pptp_users_edit.php:79
+#: usr/local/www/vpn_pptp_users_edit.php:146
+#: usr/local/www/services_dyndns_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:213
+#: usr/local/www/system_usermanager.php:177
+#: usr/local/www/system_usermanager.php:182
+#: usr/local/www/system_usermanager.php:187
+#: usr/local/www/system_usermanager.php:475
+#: usr/local/www/system_usermanager.php:787
+#: usr/local/www/vpn_l2tp_users.php:101
+#: usr/local/www/vpn_l2tp_users_edit.php:78
+#: usr/local/www/vpn_l2tp_users_edit.php:81
+#: usr/local/www/vpn_l2tp_users_edit.php:154
+#: usr/local/www/vpn_openvpn_client.php:531
+#: usr/local/www/vpn_pppoe_edit.php:536
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:95
+#: usr/local/www/services_dyndns_edit.php:99
+#: usr/local/www/services_dyndns_edit.php:296
+#: usr/local/www/system_usermanager.php:473
+#: usr/local/www/system_usermanager.php:785
+#: usr/local/www/firewall_aliases_edit.php:473
+#: usr/local/www/interfaces.php:1902 usr/local/www/interfaces.php:1967
+#: usr/local/www/interfaces.php:2073 usr/local/www/vpn_openvpn_client.php:536
+#: usr/local/www/vpn_pppoe_edit.php:537
+#: usr/local/www/system_usermanager.php:786
+#: usr/local/www/interfaces_ppps_edit.php:511
+#: usr/local/www/firewall_aliases_edit.php:475
+#: usr/local/www/vpn_l2tp_users.php:102
+#: usr/local/www/diag_authentication.php:107
+#: usr/local/www/vpn_pptp_users_edit.php:147 usr/local/www/interfaces.php:1890
+#: usr/local/www/interfaces.php:1955 usr/local/www/interfaces.php:2061
+#: usr/local/www/vpn_openvpn_client.php:554
+#: usr/local/www/vpn_l2tp_users_edit.php:79
+#: usr/local/www/vpn_l2tp_users_edit.php:82
+#: usr/local/www/vpn_l2tp_users_edit.php:155
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:97
+#: usr/local/www/vpn_pptp_users.php:99
+#: usr/local/www/vpn_openvpn_client.php:573
+#: usr/local/www/services_dyndns_edit.php:300
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:197
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces_ppps_edit.php:517
+#: usr/local/www/vpn_pppoe_edit.php:540
+#: usr/local/www/status_captiveportal.php:148
+#: usr/local/www/interfaces.php:1914 usr/local/www/interfaces.php:1982
+#: usr/local/www/interfaces.php:2091
+#: usr/local/www/services_dyndns_edit.php:100
+#: usr/local/www/services_dyndns_edit.php:308
+#: usr/local/www/firewall_aliases_edit.php:497
+#: usr/local/www/interfaces.php:1960 usr/local/www/interfaces.php:2028
+#: usr/local/www/interfaces.php:2137
+#: usr/local/www/interfaces_ppps_edit.php:515
+#: usr/local/www/interfaces.php:1948 usr/local/www/interfaces.php:2017
+#: usr/local/www/interfaces.php:2126
+#: usr/local/www/services_dyndns_edit.php:309
+#: usr/local/www/firewall_aliases_edit.php:496
+#: usr/local/www/interfaces.php:1984 usr/local/www/interfaces.php:2053
+#: usr/local/www/interfaces.php:2162
+msgid "Username"
+msgstr "Usuário"
+
+#: usr/local/www/diag_authentication.php:112 usr/local/www/interfaces.php:1730
+#: usr/local/www/interfaces.php:1795 usr/local/www/interfaces.php:1901
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:191
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:516
+#: usr/local/www/vpn_pptp_users_edit.php:79
+#: usr/local/www/vpn_pptp_users_edit.php:151
+#: usr/local/www/services_dyndns_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:220
+#: usr/local/www/system_advanced_notifications.php:192
+#: usr/local/www/system_usermanager.php:183
+#: usr/local/www/system_usermanager.php:188
+#: usr/local/www/system_usermanager.php:482
+#: usr/local/www/system_usermanager_passwordmg.php:50
+#: usr/local/www/system_usermanager_passwordmg.php:98
+#: usr/local/www/system_usermanager_passwordmg.php:101
+#: usr/local/www/vpn_l2tp_users_edit.php:81
+#: usr/local/www/vpn_l2tp_users_edit.php:159
+#: usr/local/www/vpn_openvpn_client.php:541
+#: usr/local/www/vpn_pppoe_edit.php:537
+#: usr/local/www/services_dyndns_edit.php:97
+#: usr/local/www/services_dyndns_edit.php:305
+#: usr/local/www/system_usermanager.php:480
+#: usr/local/www/system_advanced_notifications.php:201
+#: usr/local/www/interfaces.php:1908 usr/local/www/interfaces.php:1973
+#: usr/local/www/interfaces.php:2079 usr/local/www/vpn_openvpn_client.php:546
+#: usr/local/www/vpn_pppoe_edit.php:538
+#: usr/local/www/interfaces_ppps_edit.php:517
+#: usr/local/www/system_usermanager_passwordmg.php:99
+#: usr/local/www/system_usermanager_passwordmg.php:102
+#: usr/local/www/diag_authentication.php:113
+#: usr/local/www/vpn_pptp_users_edit.php:152 usr/local/www/interfaces.php:1896
+#: usr/local/www/interfaces.php:1961 usr/local/www/interfaces.php:2067
+#: usr/local/www/vpn_openvpn_client.php:564
+#: usr/local/www/vpn_l2tp_users_edit.php:82
+#: usr/local/www/vpn_l2tp_users_edit.php:160
+#: usr/local/www/vpn_openvpn_client.php:583
+#: usr/local/www/services_dyndns_edit.php:309
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:197
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces_ppps_edit.php:523
+#: usr/local/www/vpn_pppoe_edit.php:541
+#: usr/local/www/system_usermanager_passwordmg.php:104
+#: usr/local/www/system_usermanager_passwordmg.php:107
+#: usr/local/www/interfaces.php:1920 usr/local/www/interfaces.php:1988
+#: usr/local/www/interfaces.php:2097 usr/local/www/services_dyndns_edit.php:98
+#: usr/local/www/services_dyndns_edit.php:317
+#: usr/local/www/interfaces.php:1966 usr/local/www/interfaces.php:2034
+#: usr/local/www/interfaces.php:2143
+#: usr/local/www/interfaces_ppps_edit.php:521
+#: usr/local/www/interfaces.php:1954 usr/local/www/interfaces.php:2023
+#: usr/local/www/interfaces.php:2132
+#: usr/local/www/services_dyndns_edit.php:318
+#: usr/local/www/system_advanced_notifications.php:223
+#: usr/local/www/interfaces.php:1990 usr/local/www/interfaces.php:2059
+#: usr/local/www/interfaces.php:2168
+msgid "Password"
+msgstr "Senha"
+
+#: usr/local/www/diag_authentication.php:120 usr/local/www/diag_smart.php:346
+#: usr/local/www/diag_authentication.php:121
+#: usr/local/www/diag_testport.php:179 usr/local/www/diag_smart.php:367
+#: usr/local/www/diag_testport.php:181
+msgid "Test"
+msgstr "Teste"
+
+#: usr/local/www/services_dyndns.php:76 usr/local/www/services_dyndns.php:85
+#: usr/local/www/services_dyndns.php:64 usr/local/www/services_dyndns.php:60
+msgid "Dynamic DNS clients"
+msgstr "Clientes DNS dinâmicos"
+
+#: usr/local/www/services_dyndns.php:89 usr/local/www/services_rfc2136.php:68
+#: usr/local/www/services_dyndns.php:98 usr/local/www/services_dyndns.php:78
+#: usr/local/www/services_dyndns.php:74
+msgid "DynDns"
+msgstr "DNS Dinâmico"
+
+#: usr/local/www/services_dyndns.php:90 usr/local/www/services_rfc2136.php:69
+#: usr/local/www/services_dyndns.php:99 usr/local/www/services_dyndns.php:79
+#: usr/local/www/services_dyndns.php:75
+msgid "RFC 2136"
+msgstr "RFC 2136"
+
+#: usr/local/www/services_dyndns.php:100 usr/local/www/status_services.php:244
+#: usr/local/www/services_dyndns.php:109 usr/local/www/status_services.php:240
+#: usr/local/www/status_services.php:238
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:52
+#: usr/local/www/services_dyndns.php:90 usr/local/www/status_services.php:79
+#: usr/local/www/status_openvpn.php:279 usr/local/www/status_openvpn.php:340
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:79
+#: usr/local/www/services_dyndns.php:86
+msgid "Service"
+msgstr "Serviço"
+
+#: usr/local/www/services_dyndns.php:101 usr/local/www/interfaces.php:1612
+#: usr/local/www/system.php:113 usr/local/www/system.php:254
+#: usr/local/www/services_dhcp.php:892
+#: usr/local/www/services_dhcp_edit.php:228
+#: usr/local/www/services_captiveportal_hostname.php:122
+#: usr/local/www/services_captiveportal_hostname_edit.php:176
+#: usr/local/www/services_captiveportal_hostname_edit.php:180
+#: usr/local/www/diag_arp.php:315 usr/local/www/services_dyndns_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:184
+#: usr/local/www/services_rfc2136.php:79
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:146
+#: usr/local/www/status_dhcp_leases.php:320 usr/local/www/diag_ndp.php:131
+#: usr/local/www/services_dhcpv6.php:805
+#: usr/local/www/services_dhcpv6_edit.php:205
+#: usr/local/www/services_dyndns_edit.php:95
+#: usr/local/www/services_dyndns_edit.php:267
+#: usr/local/www/services_dhcpv6_edit.php:208
+#: usr/local/www/status_dhcp_leases.php:341
+#: usr/local/www/services_dyndns.php:110 usr/local/www/services_dhcp.php:930
+#: usr/local/www/services_dhcp_edit.php:231 usr/local/www/interfaces.php:1690
+#: usr/local/www/system.php:114 usr/local/www/system.php:265
+#: usr/local/www/services_dhcpv6.php:900
+#: usr/local/www/services_dhcpv6_edit.php:210
+#: usr/local/www/services_captiveportal_hostname_edit.php:174
+#: usr/local/www/services_captiveportal_hostname_edit.php:178
+#: usr/local/www/services_captiveportal_hostname.php:120
+#: usr/local/www/status_dhcp_leases.php:343
+#: usr/local/www/services_dhcp.php:1134
+#: usr/local/www/services_dhcp_edit.php:233 usr/local/www/interfaces.php:1678
+#: usr/local/www/system.php:107 usr/local/www/system.php:258
+#: usr/local/www/services_dhcpv6.php:831 usr/local/www/services_rfc2136.php:80
+#: usr/local/www/services_dhcpv6_edit.php:213
+#: usr/local/www/services_dyndns_edit.php:271
+#: usr/local/www/services_dhcp_edit.php:361
+#: usr/local/www/services_dhcp.php:1153 usr/local/www/services_dhcpv6.php:852
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:53
+#: usr/local/www/services_dyndns.php:91
+#: usr/local/www/services_dyndns_edit.php:96
+#: usr/local/www/services_dyndns_edit.php:273
+#: usr/local/www/services_dhcp.php:1173
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:80
+#: usr/local/www/services_dyndns.php:87 usr/local/www/interfaces.php:1736
+#: usr/local/www/interfaces.php:1728 usr/local/www/services_rfc2136.php:81
+#: usr/local/www/services_dyndns_edit.php:274
+#: usr/local/www/services_dhcp.php:1185
+#: usr/local/www/status_dhcp_leases.php:344
+#: usr/local/www/services_rfc2136_edit.php:72
+#: usr/local/www/services_rfc2136_edit.php:151
+#: usr/local/www/interfaces.php:1741
+msgid "Hostname"
+msgstr "Hostname"
+
+#: usr/local/www/services_dyndns.php:102 usr/local/www/services_dyndns.php:111
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:54
+#: usr/local/www/services_dyndns.php:92
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:81
+#: usr/local/www/services_dyndns.php:88 usr/local/www/services_rfc2136.php:82
+msgid "Cached IP"
+msgstr "IP em cache"
+
+#: usr/local/www/services_dyndns.php:151 usr/local/www/services_wol.php:188
+#: usr/local/www/firewall_virtual_ip.php:221
+#: usr/local/www/system_advanced_sysctl.php:199
+#: usr/local/www/services_captiveportal_zones.php:89
+#: usr/local/www/services_dyndns.php:172
+#: usr/local/www/services_captiveportal_zones.php:90
+#: usr/local/www/firewall_virtual_ip.php:227
+#: usr/local/www/firewall_virtual_ip.php:247
+#: usr/local/www/services_dyndns.php:171 usr/local/www/services_dyndns.php:167
+#: usr/local/www/firewall_virtual_ip.php:270
+#: usr/local/www/firewall_virtual_ip.php:278
+#: usr/local/www/services_dyndns.php:178
+msgid "Do you really want to delete this entry?"
+msgstr "Você realmente quer apagar essa entrada?"
+
+#: usr/local/www/services_dyndns.php:162 usr/local/www/services_dyndns.php:183
+#: usr/local/www/services_dyndns.php:179 usr/local/www/services_dyndns.php:190
+msgid "IP addresses appearing in green are up to date with Dynamic DNS provider."
+msgstr "Endereços IP que aparecem em verde estão atualizados com o fornecedor de DNS Dinâmico."
+
+#: usr/local/www/graph_cpu.php:83
+msgid "Cannot get CPU load"
+msgstr "Não pôde obter carregamento de CPU"
+
+#: usr/local/www/graph_cpu.php:84 usr/local/www/graph.php:123
+msgid "Collecting initial data, please wait"
+msgstr "Coletando dados iniciais, por favor aguarde"
+
+#: usr/local/www/graph_cpu.php:96 usr/local/www/graph.php:135
+msgid "No URL for getURL"
+msgstr "Nenhuma URL para getURL"
+
+#: usr/local/www/graph_cpu.php:103 usr/local/www/graph.php:142
+msgid "No callback function for getURL"
+msgstr "Nenhuma função de callback para getURL"
+
+#: usr/local/www/graph_cpu.php:119 usr/local/www/graph.php:158
+msgid "Both getURL and XMLHttpRequest are undefined"
+msgstr "Ambas getURL e XMLHttpRequest estão indefinidas"
+
+#: usr/local/www/services_snmp.php:87 usr/local/www/services_snmp.php:91
+msgid "Invalid character '#' in system location"
+msgstr "Caractere '#' inválido no local do sistema"
+
+#: usr/local/www/services_snmp.php:88 usr/local/www/services_snmp.php:92
+msgid "Invalid character '#' in system contact"
+msgstr "Caractere '#' inválido no contato do sistema"
+
+#: usr/local/www/services_snmp.php:89 usr/local/www/services_snmp.php:93
+msgid "Invalid character '#' in read community string"
+msgstr "Caractere inválido '#' em ler string da comunidade"
+
+#: usr/local/www/services_snmp.php:92 usr/local/www/services_snmp.php:96
+msgid "Community"
+msgstr "Comunidade"
+
+#: usr/local/www/services_snmp.php:96 usr/local/www/services_snmp.php:100
+msgid "Polling Port"
+msgstr "Porta de Polling"
+
+#: usr/local/www/services_snmp.php:103 usr/local/www/services_snmp.php:107
+msgid "Invalid character '#' in SNMP trap string"
+msgstr "Caractere inválido '#' na string de SNMP trap"
+
+#: usr/local/www/services_snmp.php:106 usr/local/www/services_snmp.php:342
+#: usr/local/www/services_snmp.php:340 usr/local/www/services_snmp.php:341
+#: usr/local/www/services_snmp.php:110 usr/local/www/services_snmp.php:351
+msgid "Trap server"
+msgstr "Servidor Trap"
+
+#: usr/local/www/services_snmp.php:110 usr/local/www/services_snmp.php:114
+msgid "Trap server port"
+msgstr "Porta do servidor Trap"
+
+#: usr/local/www/services_snmp.php:114 usr/local/www/services_snmp.php:361
+#: usr/local/www/services_snmp.php:359 usr/local/www/services_snmp.php:360
+#: usr/local/www/services_snmp.php:118 usr/local/www/services_snmp.php:370
+msgid "Trap string"
+msgstr "String do Trap"
+
+#: usr/local/www/services_snmp.php:159 usr/local/www/fbegin.inc:134
+#: usr/local/www/fbegin.inc:152 usr/local/www/fbegin.inc:160
+#: usr/local/www/fbegin.inc:151 usr/local/www/services_snmp.php:165
+msgid "SNMP"
+msgstr "SNMP"
+
+#: usr/local/www/services_snmp.php:275 usr/local/www/services_snmp.php:273
+#: usr/local/www/services_snmp.php:274 usr/local/www/services_snmp.php:284
+msgid "SNMP Daemon"
+msgstr "Daemon SNMP"
+
+#: usr/local/www/services_snmp.php:281 usr/local/www/services_snmp.php:279
+#: usr/local/www/services_snmp.php:280 usr/local/www/services_snmp.php:290
+msgid "Polling Port "
+msgstr "Porta de Polling"
+
+#: usr/local/www/services_snmp.php:284 usr/local/www/services_snmp.php:282
+#: usr/local/www/services_snmp.php:283 usr/local/www/services_snmp.php:293
+msgid "Enter the port to accept polling events on (default 161)"
+msgstr "Informe a porta para aceitar eventos de polling (padrão 161)"
+
+#: usr/local/www/services_snmp.php:289 usr/local/www/services_snmp.php:287
+#: usr/local/www/services_snmp.php:288 usr/local/www/services_snmp.php:298
+msgid "System location"
+msgstr "Localização do sistema"
+
+#: usr/local/www/services_snmp.php:296 usr/local/www/services_snmp.php:294
+#: usr/local/www/services_snmp.php:295 usr/local/www/services_snmp.php:305
+msgid "System contact"
+msgstr "Contato do sistema"
+
+#: usr/local/www/services_snmp.php:303 usr/local/www/services_snmp.php:301
+#: usr/local/www/services_snmp.php:302 usr/local/www/services_snmp.php:312
+msgid "Read Community String"
+msgstr "Ler string de comunidade"
+
+#: usr/local/www/services_snmp.php:306 usr/local/www/services_snmp.php:304
+#: usr/local/www/services_snmp.php:305 usr/local/www/services_snmp.php:315
+msgid "The community string is like a password, restricting access to querying SNMP to hosts knowing the community string. Use a strong value here to protect from unauthorized information disclosure."
+msgstr "A string de comunidade é como uma senha, restringe acesso a SNMP em fila para hosts que conhecem a string de comunidade. Use um valor forte aqui para proteger-se contra divulgação de informações não autorizada."
+
+#: usr/local/www/services_snmp.php:335 usr/local/www/services_snmp.php:333
+#: usr/local/www/services_snmp.php:334 usr/local/www/services_snmp.php:344
+msgid "SNMP Traps"
+msgstr "Traps SNMP"
+
+#: usr/local/www/services_snmp.php:345 usr/local/www/services_snmp.php:343
+#: usr/local/www/services_snmp.php:344 usr/local/www/services_snmp.php:354
+msgid "Enter trap server name"
+msgstr "Informe o nome do servidor Trap"
+
+#: usr/local/www/services_snmp.php:350 usr/local/www/services_snmp.php:348
+#: usr/local/www/services_snmp.php:349 usr/local/www/services_snmp.php:359
+msgid "Trap server port "
+msgstr "Porta de Servidor Trap"
+
+#: usr/local/www/services_snmp.php:353 usr/local/www/services_snmp.php:351
+#: usr/local/www/services_snmp.php:352 usr/local/www/services_snmp.php:362
+msgid "Enter the port to send the traps to (default 162)"
+msgstr "Informe a porta para a qual enviar traps (padrão 162)"
+
+#: usr/local/www/services_snmp.php:358 usr/local/www/services_snmp.php:356
+#: usr/local/www/services_snmp.php:357 usr/local/www/services_snmp.php:367
+msgid "Enter the SNMP trap string"
+msgstr "Informe a string de Trap SNMP"
+
+#: usr/local/www/services_snmp.php:370 usr/local/www/services_snmp.php:368
+#: usr/local/www/services_snmp.php:369 usr/local/www/services_snmp.php:379
+msgid "Modules"
+msgstr "Módulos"
+
+#: usr/local/www/services_snmp.php:376 usr/local/www/services_snmp.php:374
+#: usr/local/www/services_snmp.php:375 usr/local/www/services_snmp.php:385
+msgid "SNMP Modules"
+msgstr "Módulos SNMP"
+
+#: usr/local/www/services_snmp.php:378 usr/local/www/services_snmp.php:376
+#: usr/local/www/services_snmp.php:377 usr/local/www/services_snmp.php:387
+msgid "MibII"
+msgstr "MibII"
+
+#: usr/local/www/services_snmp.php:380 usr/local/www/services_snmp.php:378
+#: usr/local/www/services_snmp.php:379 usr/local/www/services_snmp.php:389
+msgid "Netgraph"
+msgstr "Netgraph"
+
+#: usr/local/www/services_snmp.php:382 usr/local/www/license.php:171
+#: usr/local/www/services_snmp.php:380 usr/local/www/services_snmp.php:381
+#: usr/local/www/services_snmp.php:391
+msgid "PF"
+msgstr "PF"
+
+#: usr/local/www/services_snmp.php:384 usr/local/www/services_snmp.php:382
+#: usr/local/www/services_snmp.php:383 usr/local/www/services_snmp.php:393
+msgid "Host Resources (Requires MibII)"
+msgstr "Recursos de Host (Requer Mibll)"
+
+#: usr/local/www/services_snmp.php:391
+msgid "Bind to LAN interface only"
+msgstr "Vincular com interfaces LAN somente"
+
+#: usr/local/www/services_snmp.php:393
+msgid "This option can be useful when trying to access the SNMP agent by the LAN interface's IP address through a VPN tunnel terminated on the WAN interface."
+msgstr "Essa opção pode ser útil ao tentar acesso ao agente SNMP através do endereço IP da interface da LAN através o túnel VPN limitado à interface WAN."
+
+#: usr/local/www/headjs.php:143 usr/local/www/firewall_rules.php:315
+#: usr/local/www/firewall_rules.php:319 usr/local/www/guiconfig.inc:302
+#: usr/local/www/firewall_rules.php:312 usr/local/www/guiconfig.inc:291
+#: usr/local/www/guiconfig.inc:290 usr/local/www/headjs.php:146
+#: usr/local/www/firewall_rules.php:311 usr/local/www/guiconfig.inc:287
+#: usr/local/www/guiconfig.inc:294
+msgid "Apply changes"
+msgstr "Aplicar modificações"
+
+#: usr/local/www/services_wol.php:63
+#, php-format
+msgid "Sent magic packet to %1$s (%2$s)%3$s"
+msgstr "Enviar pacote mágico para %1$s (%2$s)%3$s"
+
+#: usr/local/www/services_wol.php:65
+#, php-format
+msgid "Please check the %1$ssystem log%2$s, the wol command for %3$s (%4$s) did not complete successfully%5$s"
+msgstr "Por favor, verifique o %1$slog de sistema%2$s, o comando wol para %3$s (%4$s) não finalizou com sucesso%5$s"
+
+#: usr/local/www/services_wol.php:86 usr/local/www/services_wol_edit.php:90
+#: usr/local/www/interfaces.php:541 usr/local/www/services_dhcp_edit.php:129
+#: usr/local/www/services_dhcp_edit.php:131 usr/local/www/interfaces.php:611
+#: usr/local/www/interfaces.php:608 usr/local/www/services_dhcp_edit.php:165
+#: usr/local/www/interfaces.php:623 usr/local/www/interfaces.php:634
+#: usr/local/www/interfaces.php:630 usr/local/www/interfaces.php:635
+msgid "A valid MAC address must be specified."
+msgstr "Um endereço MAC válido deve ser especificado."
+
+#: usr/local/www/services_wol.php:88
+msgid "A valid interface must be specified."
+msgstr "Uma interface válida deve ser especificada."
+
+#: usr/local/www/services_wol.php:94
+msgid "A valid ip could not be found!"
+msgstr "Não foi possível encontrar um ip válido!"
+
+#: usr/local/www/services_wol.php:99
+#, php-format
+msgid "Sent magic packet to %s."
+msgstr "Enviar pacote mágico para %s."
+
+#: usr/local/www/services_wol.php:101
+#, php-format
+msgid "Please check the %1$ssystem log%2$s, the wol command for %3$s did not complete successfully%4$s"
+msgstr "Por favor, verifique o %1$slog de sistema%2$s, o comando wol para %3$s não finalizou com sucesso%4$s"
+
+#: usr/local/www/services_wol.php:115 usr/local/www/services_wol.php:127
+#: usr/local/www/services_wol_edit.php:112 usr/local/www/diag_backup.php:123
+#: usr/local/www/fbegin.inc:142 usr/local/www/fbegin.inc:159
+#: usr/local/www/diag_backup.php:201 usr/local/www/fbegin.inc:167
+#: usr/local/www/fbegin.inc:158 usr/local/www/diag_backup.php:202
+msgid "Wake on LAN"
+msgstr "Wake on LAN"
+
+#: usr/local/www/services_wol.php:141
+msgid "Choose which interface the host to be woken up is connected to."
+msgstr "Escolha em qual interface o host a ser ligado está conectado."
+
+#: usr/local/www/services_wol.php:144 usr/local/www/services_wol.php:162
+#: usr/local/www/services_wol_edit.php:82
+#: usr/local/www/services_wol_edit.php:140
+#: usr/local/www/status_captiveportal.php:161
+#: usr/local/www/interfaces.php:1283
+#: usr/local/www/services_captiveportal_mac.php:167
+#: usr/local/www/services_captiveportal_mac_edit.php:98
+#: usr/local/www/services_captiveportal_mac_edit.php:175
+#: usr/local/www/services_dhcp.php:890
+#: usr/local/www/services_dhcp_edit.php:106
+#: usr/local/www/services_dhcp_edit.php:207
+#: usr/local/www/status_interfaces.php:178 usr/local/www/diag_arp.php:314
+#: usr/local/www/status_dhcp_leases.php:319 usr/local/www/diag_ndp.php:130
+#: usr/local/www/status_interfaces.php:252
+#: usr/local/www/status_dhcp_leases.php:340
+#: usr/local/www/services_dhcp.php:928
+#: usr/local/www/services_dhcp_edit.php:108
+#: usr/local/www/services_dhcp_edit.php:210 usr/local/www/interfaces.php:1387
+#: usr/local/www/status_interfaces.php:255
+#: usr/local/www/services_captiveportal_mac.php:165
+#: usr/local/www/services_captiveportal_mac_edit.php:96
+#: usr/local/www/services_captiveportal_mac_edit.php:173
+#: usr/local/www/status_dhcp_leases.php:342
+#: usr/local/www/services_dhcp.php:1132
+#: usr/local/www/services_dhcp_edit.php:209 usr/local/www/interfaces.php:1375
+#: usr/local/www/services_dhcp_edit.php:142
+#: usr/local/www/services_dhcp_edit.php:337
+#: usr/local/www/services_dhcp.php:1151
+#: usr/local/www/services_captiveportal_mac_edit.php:180
+#: usr/local/www/status_captiveportal.php:147
+#: usr/local/www/services_captiveportal_mac.php:175
+#: usr/local/www/interfaces.php:1388 usr/local/www/services_dhcp.php:1171
+#: usr/local/www/interfaces.php:1430 usr/local/www/interfaces.php:1425
+#: usr/local/www/services_dhcp.php:1183
+#: usr/local/www/status_dhcp_leases.php:343 usr/local/www/interfaces.php:1438
+msgid "MAC address"
+msgstr "Endereço MAC"
+
+#: usr/local/www/services_wol.php:148
+msgid "Enter a MAC address "
+msgstr "Informe o endereço MAC"
+
+#: usr/local/www/services_wol.php:148
+msgid "in the following format: xx:xx:xx:xx:xx:xx"
+msgstr "no seguinte formato: xx:xx:xx:xx:xx:xx"
+
+#: usr/local/www/services_wol.php:152 usr/local/www/diag_smart.php:244
+#: usr/local/www/diag_smart.php:265
+msgid "Send"
+msgstr "Enviar"
+
+#: usr/local/www/services_wol.php:157
+msgid "Wake all clients at once: "
+msgstr "Ligar todos os clientes ao mesmo tempo: "
+
+#: usr/local/www/services_wol.php:158
+msgid "Or Click the MAC address to wake up an individual device:"
+msgstr "Ou clique no endereço MAC para ligar um dispositivo individual:"
+
+#: usr/local/www/services_wol.php:212
+msgid "This service can be used to wake up (power on) computers by sending special"
+msgstr "Esse serviço pode ser usado para acordar (ligar) computadores enviando um especial"
+
+#: usr/local/www/services_wol.php:212
+msgid "Magic Packets"
+msgstr "Pacotes Mágicos"
+
+#: usr/local/www/services_wol.php:212
+msgid "The NIC in the computer that is to be woken up must support Wake on LAN and has to be configured properly (WOL cable, BIOS settings). "
+msgstr "O NIC no computador que seja ligado deve suportar Wake on LAN e tem que estar configurado apropriadamente (cabo WOL, configurações de BIOS). "
+
+#: usr/local/www/services_wol_edit.php:123
+msgid "Edit WOL entry"
+msgstr "Editar entrada WOL"
+
+#: usr/local/www/services_wol_edit.php:137
+msgid "Choose which interface this host is connected to."
+msgstr "Escolha em qual interface esse host está conectado."
+
+#: usr/local/www/services_wol_edit.php:144
+msgid "Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx"
+msgstr "Informe um endereço MAC no seguinte formato: xx:xx:xx:xx:xx:xx"
+
+#: usr/local/www/status_captiveportal.php:58
+msgid "Status: Captive portal"
+msgstr "Status: Portal Captive"
+
+#: usr/local/www/status_captiveportal.php:121
+#: usr/local/www/status_captiveportal_test.php:70
+#: usr/local/www/status_captiveportal_voucher_rolls.php:73
+#: usr/local/www/status_captiveportal_vouchers.php:103
+#: usr/local/www/status_captiveportal_vouchers.php:104
+#: usr/local/www/status_captiveportal_test.php:71
+#: usr/local/www/status_captiveportal_voucher_rolls.php:74
+#: usr/local/www/status_captiveportal_expire.php:69
+#: usr/local/www/status_captiveportal_vouchers.php:108
+#: usr/local/www/status_captiveportal.php:106
+#: usr/local/www/status_captiveportal_voucher_rolls.php:75
+msgid "Active Users"
+msgstr "Usuários ativos"
+
+#: usr/local/www/status_captiveportal.php:122
+#: usr/local/www/status_captiveportal_test.php:71
+#: usr/local/www/status_captiveportal_voucher_rolls.php:74
+#: usr/local/www/status_captiveportal_vouchers.php:104
+#: usr/local/www/status_captiveportal_vouchers.php:105
+#: usr/local/www/status_captiveportal_test.php:72
+#: usr/local/www/status_captiveportal_voucher_rolls.php:75
+#: usr/local/www/status_captiveportal_expire.php:70
+#: usr/local/www/status_captiveportal_vouchers.php:109
+#: usr/local/www/status_captiveportal.php:107
+#: usr/local/www/status_captiveportal_voucher_rolls.php:76
+msgid "Active Vouchers"
+msgstr "Vouchers ativos"
+
+#: usr/local/www/status_captiveportal.php:123
+#: usr/local/www/services_captiveportal_vouchers.php:426
+#: usr/local/www/status_captiveportal_test.php:72
+#: usr/local/www/status_captiveportal_voucher_rolls.php:57
+#: usr/local/www/status_captiveportal_voucher_rolls.php:75
+#: usr/local/www/status_captiveportal_vouchers.php:105
+#: usr/local/www/services_captiveportal_vouchers.php:433
+#: usr/local/www/status_captiveportal_vouchers.php:106
+#: usr/local/www/services_captiveportal_vouchers.php:446
+#: usr/local/www/status_captiveportal_test.php:73
+#: usr/local/www/status_captiveportal_voucher_rolls.php:76
+#: usr/local/www/status_captiveportal_expire.php:71
+#: usr/local/www/services_captiveportal_vouchers.php:455
+#: usr/local/www/status_captiveportal_vouchers.php:110
+#: usr/local/www/status_captiveportal.php:108
+#: usr/local/www/status_captiveportal_voucher_rolls.php:77
+#: usr/local/www/services_captiveportal_vouchers.php:460
+msgid "Voucher Rolls"
+msgstr "Listas de Voucher"
+
+#: usr/local/www/status_captiveportal.php:124
+#: usr/local/www/status_captiveportal_test.php:58
+#: usr/local/www/status_captiveportal_test.php:73
+#: usr/local/www/status_captiveportal_voucher_rolls.php:76
+#: usr/local/www/status_captiveportal_vouchers.php:106
+#: usr/local/www/status_captiveportal_vouchers.php:107
+#: usr/local/www/status_captiveportal_test.php:74
+#: usr/local/www/status_captiveportal_voucher_rolls.php:77
+#: usr/local/www/status_captiveportal_expire.php:72
+#: usr/local/www/status_captiveportal_vouchers.php:111
+#: usr/local/www/status_captiveportal.php:109
+#: usr/local/www/status_captiveportal_voucher_rolls.php:78
+msgid "Test Vouchers"
+msgstr "Vouchers de teste"
+
+#: usr/local/www/status_captiveportal.php:135
+#: usr/local/www/status_captiveportal.php:121
+msgid "Captive Portal Zone"
+msgstr "Zona Captive Portal"
+
+#: usr/local/www/status_captiveportal.php:157
+#: usr/local/www/status_captiveportal.php:143
+msgid "Captive Portal status"
+msgstr "Status Captive Portal"
+
+#: usr/local/www/status_captiveportal.php:164
+#: usr/local/www/status_captiveportal.php:167
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:97
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:99
+#: usr/local/www/status_captiveportal.php:150
+#: usr/local/www/status_captiveportal.php:153
+msgid "Session start"
+msgstr "Início de sessão"
+
+#: usr/local/www/status_captiveportal.php:165
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:98
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:100
+#: usr/local/www/status_captiveportal.php:151
+msgid "Last activity"
+msgstr "Última atividade"
+
+#: usr/local/www/status_captiveportal.php:181
+#: usr/local/www/status_captiveportal.php:168
+msgid "Do you really want to disconnect this client?"
+msgstr "Você realmente deseja desconectar esse cliente?"
+
+#: usr/local/www/status_captiveportal.php:181
+#: usr/local/www/status_interfaces.php:114
+#: usr/local/www/status_interfaces.php:129
+#: usr/local/www/status_interfaces.php:144
+#: usr/local/www/status_interfaces.php:159
+#: usr/local/www/status_interfaces.php:132
+#: usr/local/www/status_interfaces.php:147
+#: usr/local/www/status_interfaces.php:162
+#: usr/local/www/status_interfaces.php:177
+#: usr/local/www/status_interfaces.php:135
+#: usr/local/www/status_interfaces.php:150
+#: usr/local/www/status_interfaces.php:165
+#: usr/local/www/status_interfaces.php:180
+#: usr/local/www/status_captiveportal.php:168
+msgid "Disconnect"
+msgstr "Desconectar"
+
+#: usr/local/www/status_captiveportal.php:198
+#: usr/local/www/status_captiveportal.php:185
+msgid "Don't show last activity"
+msgstr "Não exibir a última atividade"
+
+#: usr/local/www/status_captiveportal.php:201
+#: usr/local/www/status_captiveportal.php:188
+msgid "Show last activity"
+msgstr "Exibir última atividade"
+
+#: usr/local/www/installer/installer.php:186
+msgid "Could not open /tmp/installer.sh for writing"
+msgstr "Não pôde abrir /tmp/installer.sh para escrita"
+
+#: usr/local/www/installer/installer.php:360
+#: usr/local/www/installer/installer.php:361
+#, php-format
+msgid "Beginning installation on disk %s."
+msgstr "Iniciando instalação no disco %s."
+
+#: usr/local/www/installer/installer.php:409
+#: usr/local/www/installer/installer.php:410
+msgid "Installer"
+msgstr "Instalador"
+
+#: usr/local/www/installer/installer.php:916
+#: usr/local/www/installer/installer.php:1104
+#: usr/local/www/installer/installer.php:917
+#: usr/local/www/installer/installer.php:1105
+msgid "ERROR: Could not find any suitable disks for installation."
+msgstr "ERRO: Não pôde encontrar um disco apropriado para instalação."
+
+#: usr/local/www/interfaces_bridge.php:64
+#: usr/local/www/interfaces_bridge.php:68
+msgid "This bridge cannot be deleted because it is assigned as an interface."
+msgstr "Essa ponte não pode ser removida porque ela está atribuída como uma interface."
+
+#: usr/local/www/interfaces_bridge.php:77
+#: usr/local/www/interfaces_bridge_edit.php:226
+#: usr/local/www/interfaces_gif.php:76
+#: usr/local/www/interfaces_gif_edit.php:125
+#: usr/local/www/interfaces_gre.php:77
+#: usr/local/www/interfaces_gre_edit.php:127
+#: usr/local/www/interfaces_groups.php:63
+#: usr/local/www/interfaces_groups_edit.php:44
+#: usr/local/www/diag_backup.php:109 usr/local/www/interfaces.php:1027
+#: usr/local/www/interfaces_assign.php:43 usr/local/www/interfaces_vlan.php:78
+#: usr/local/www/interfaces_vlan_edit.php:139
+#: usr/local/www/diag_logs_filter_summary.php:46
+#: usr/local/www/interfaces_lagg.php:82
+#: usr/local/www/interfaces_lagg_edit.php:120
+#: usr/local/www/interfaces_ppps_edit.php:378
+#: usr/local/www/interfaces_qinq.php:86
+#: usr/local/www/interfaces_qinq_edit.php:39
+#: usr/local/www/interfaces_wireless.php:76
+#: usr/local/www/interfaces_wireless_edit.php:145
+#: usr/local/www/services_captiveportal.php:439
+#: usr/local/www/status_interfaces.php:58 usr/local/www/fbegin.inc:163
+#: usr/local/www/fbegin.inc:327
+#: usr/local/www/services_captiveportal_zones.php:53
+#: usr/local/www/fbegin.inc:180 usr/local/www/fbegin.inc:345
+#: usr/local/www/diag_backup.php:186
+#: usr/local/www/services_captiveportal.php:443
+#: usr/local/www/interfaces_bridge_edit.php:235
+#: usr/local/www/interfaces.php:1113 usr/local/www/fbegin.inc:188
+#: usr/local/www/fbegin.inc:291 usr/local/www/status_interfaces.php:60
+#: usr/local/www/services_captiveportal.php:441
+#: usr/local/www/diag_logs_filter_summary.php:47
+#: usr/local/www/interfaces.php:1101
+#: usr/local/www/services_captiveportal_zones.php:54
+#: usr/local/www/interfaces_wireless_edit.php:147
+#: usr/local/www/interfaces_qinq.php:89
+#: usr/local/www/interfaces_vlan_edit.php:142
+#: usr/local/www/interfaces_ppps_edit.php:384
+#: usr/local/www/interfaces_lagg_edit.php:133
+#: usr/local/www/interfaces_lagg.php:86 usr/local/www/interfaces_vlan.php:84
+#: usr/local/www/interfaces_gif_edit.php:133
+#: usr/local/www/interfaces_bridge.php:83
+#: usr/local/www/interfaces_wireless.php:78
+#: usr/local/www/interfaces_bridge_edit.php:236 usr/local/www/fbegin.inc:179
+#: usr/local/www/fbegin.inc:283 usr/local/www/interfaces_gre.php:81
+#: usr/local/www/interfaces_gif.php:80 usr/local/www/interfaces.php:1115
+#: usr/local/www/services_captiveportal.php:459
+#: usr/local/www/interfaces.php:1157 usr/local/www/services_dnsmasq.php:262
+#: usr/local/www/interfaces.php:1152 usr/local/www/diag_backup.php:187
+#: usr/local/www/interfaces.php:1165
+msgid "Interfaces"
+msgstr "Interfaces"
+
+#: usr/local/www/interfaces_bridge.php:77
+#: usr/local/www/interfaces_bridge_edit.php:226
+#: usr/local/www/interfaces_bridge_edit.php:235
+#: usr/local/www/interfaces_bridge.php:83
+#: usr/local/www/interfaces_bridge_edit.php:236
+msgid "Bridge"
+msgstr "Ponte"
+
+#: usr/local/www/interfaces_bridge.php:89 usr/local/www/interfaces_gif.php:88
+#: usr/local/www/interfaces_gre.php:89 usr/local/www/interfaces_groups.php:75
+#: usr/local/www/interfaces_assign.php:402
+#: usr/local/www/interfaces_vlan.php:90 usr/local/www/interfaces_lagg.php:94
+#: usr/local/www/interfaces_ppps.php:90 usr/local/www/interfaces_qinq.php:98
+#: usr/local/www/interfaces_wireless.php:88
+#: usr/local/www/interfaces_groups.php:76 usr/local/www/interfaces_qinq.php:99
+#: usr/local/www/interfaces_ppps.php:91 usr/local/www/interfaces_bridge.php:90
+#: usr/local/www/interfaces_lagg.php:95 usr/local/www/interfaces_gre.php:90
+#: usr/local/www/interfaces_wireless.php:89
+#: usr/local/www/interfaces_assign.php:396
+#: usr/local/www/interfaces_vlan.php:91 usr/local/www/interfaces_gif.php:89
+#: usr/local/www/interfaces_qinq.php:102 usr/local/www/interfaces_lagg.php:99
+#: usr/local/www/interfaces_vlan.php:97 usr/local/www/interfaces_bridge.php:96
+#: usr/local/www/interfaces_wireless.php:91
+#: usr/local/www/interfaces_gre.php:94 usr/local/www/interfaces_gif.php:93
+msgid "Interface assignments"
+msgstr "Atribuições de interface"
+
+#: usr/local/www/interfaces_bridge.php:90 usr/local/www/interfaces_gif.php:89
+#: usr/local/www/interfaces_gre.php:90 usr/local/www/interfaces_groups.php:76
+#: usr/local/www/interfaces_assign.php:403
+#: usr/local/www/interfaces_vlan.php:91 usr/local/www/interfaces_lagg.php:95
+#: usr/local/www/interfaces_ppps.php:91 usr/local/www/interfaces_qinq.php:99
+#: usr/local/www/interfaces_wireless.php:89
+#: usr/local/www/interfaces_groups.php:77
+#: usr/local/www/interfaces_qinq.php:100 usr/local/www/interfaces_ppps.php:92
+#: usr/local/www/interfaces_bridge.php:91 usr/local/www/interfaces_lagg.php:96
+#: usr/local/www/interfaces_gre.php:91
+#: usr/local/www/interfaces_wireless.php:90
+#: usr/local/www/interfaces_assign.php:397
+#: usr/local/www/interfaces_vlan.php:92 usr/local/www/interfaces_gif.php:90
+#: usr/local/www/interfaces_qinq.php:103 usr/local/www/interfaces_lagg.php:100
+#: usr/local/www/interfaces_vlan.php:98 usr/local/www/interfaces_bridge.php:97
+#: usr/local/www/interfaces_wireless.php:92
+#: usr/local/www/interfaces_gre.php:95 usr/local/www/interfaces_gif.php:94
+msgid "Interface Groups"
+msgstr "Grupos de Interface"
+
+#: usr/local/www/interfaces_bridge.php:92 usr/local/www/interfaces_gif.php:91
+#: usr/local/www/interfaces_gre.php:92 usr/local/www/interfaces_groups.php:78
+#: usr/local/www/interfaces_assign.php:405
+#: usr/local/www/interfaces_vlan.php:93 usr/local/www/interfaces_lagg.php:97
+#: usr/local/www/interfaces_ppps.php:93 usr/local/www/interfaces_qinq.php:101
+#: usr/local/www/interfaces_wireless.php:91
+#: usr/local/www/interfaces_groups.php:79
+#: usr/local/www/interfaces_qinq.php:102 usr/local/www/interfaces_ppps.php:94
+#: usr/local/www/interfaces_bridge.php:93 usr/local/www/interfaces_lagg.php:98
+#: usr/local/www/interfaces_gre.php:93
+#: usr/local/www/interfaces_wireless.php:92
+#: usr/local/www/interfaces_assign.php:399
+#: usr/local/www/interfaces_vlan.php:94 usr/local/www/interfaces_gif.php:92
+#: usr/local/www/interfaces_qinq.php:105 usr/local/www/interfaces_lagg.php:102
+#: usr/local/www/interfaces_vlan.php:100
+#: usr/local/www/interfaces_bridge.php:99
+#: usr/local/www/interfaces_wireless.php:94
+#: usr/local/www/interfaces_gre.php:97 usr/local/www/interfaces_gif.php:96
+msgid "VLANs"
+msgstr "VLANs"
+
+#: usr/local/www/interfaces_bridge.php:93 usr/local/www/interfaces_gif.php:92
+#: usr/local/www/interfaces_gre.php:93 usr/local/www/interfaces_groups.php:79
+#: usr/local/www/interfaces_assign.php:406
+#: usr/local/www/interfaces_vlan.php:94 usr/local/www/interfaces_lagg.php:98
+#: usr/local/www/interfaces_ppps.php:94 usr/local/www/interfaces_qinq.php:102
+#: usr/local/www/interfaces_wireless.php:92
+#: usr/local/www/interfaces_groups.php:80
+#: usr/local/www/interfaces_qinq.php:103 usr/local/www/interfaces_ppps.php:95
+#: usr/local/www/interfaces_bridge.php:94 usr/local/www/interfaces_lagg.php:99
+#: usr/local/www/interfaces_gre.php:94
+#: usr/local/www/interfaces_wireless.php:93
+#: usr/local/www/interfaces_assign.php:400
+#: usr/local/www/interfaces_vlan.php:95 usr/local/www/interfaces_gif.php:93
+#: usr/local/www/interfaces_qinq.php:106 usr/local/www/interfaces_lagg.php:103
+#: usr/local/www/interfaces_vlan.php:101
+#: usr/local/www/interfaces_bridge.php:100
+#: usr/local/www/interfaces_wireless.php:95
+#: usr/local/www/interfaces_gre.php:98 usr/local/www/interfaces_gif.php:97
+msgid "QinQs"
+msgstr "QinQs"
+
+#: usr/local/www/interfaces_bridge.php:94 usr/local/www/interfaces_gif.php:93
+#: usr/local/www/interfaces_gre.php:94 usr/local/www/interfaces_groups.php:80
+#: usr/local/www/interfaces_assign.php:407
+#: usr/local/www/interfaces_vlan.php:95 usr/local/www/interfaces_lagg.php:99
+#: usr/local/www/interfaces_ppps.php:95
+#: usr/local/www/interfaces_ppps_edit.php:378
+#: usr/local/www/interfaces_qinq.php:103
+#: usr/local/www/interfaces_wireless.php:93
+#: usr/local/www/interfaces_groups.php:81
+#: usr/local/www/interfaces_qinq.php:104 usr/local/www/interfaces_ppps.php:96
+#: usr/local/www/interfaces_bridge.php:95
+#: usr/local/www/interfaces_lagg.php:100 usr/local/www/interfaces_gre.php:95
+#: usr/local/www/interfaces_wireless.php:94
+#: usr/local/www/interfaces_assign.php:401
+#: usr/local/www/interfaces_vlan.php:96 usr/local/www/interfaces_gif.php:94
+#: usr/local/www/interfaces_qinq.php:107
+#: usr/local/www/interfaces_ppps_edit.php:384
+#: usr/local/www/interfaces_lagg.php:104 usr/local/www/interfaces_vlan.php:102
+#: usr/local/www/interfaces_bridge.php:101
+#: usr/local/www/interfaces_wireless.php:96
+#: usr/local/www/interfaces_gre.php:99 usr/local/www/interfaces_gif.php:98
+msgid "PPPs"
+msgstr "PPPs"
+
+#: usr/local/www/interfaces_bridge.php:95 usr/local/www/interfaces_gif.php:94
+#: usr/local/www/interfaces_gre.php:77 usr/local/www/interfaces_gre.php:95
+#: usr/local/www/interfaces_gre_edit.php:127
+#: usr/local/www/interfaces_groups.php:81
+#: usr/local/www/interfaces_assign.php:408
+#: usr/local/www/interfaces_vlan.php:96 usr/local/www/interfaces_lagg.php:100
+#: usr/local/www/interfaces_ppps.php:96 usr/local/www/interfaces_qinq.php:104
+#: usr/local/www/interfaces_wireless.php:94
+#: usr/local/www/interfaces_groups.php:82
+#: usr/local/www/interfaces_qinq.php:105 usr/local/www/interfaces_ppps.php:97
+#: usr/local/www/interfaces_bridge.php:96
+#: usr/local/www/interfaces_lagg.php:101 usr/local/www/interfaces_gre.php:96
+#: usr/local/www/interfaces_wireless.php:95
+#: usr/local/www/interfaces_assign.php:402
+#: usr/local/www/interfaces_vlan.php:97 usr/local/www/interfaces_gif.php:95
+#: usr/local/www/interfaces_qinq.php:108 usr/local/www/interfaces_lagg.php:105
+#: usr/local/www/interfaces_vlan.php:103
+#: usr/local/www/interfaces_bridge.php:102
+#: usr/local/www/interfaces_wireless.php:97
+#: usr/local/www/interfaces_gre.php:81 usr/local/www/interfaces_gre.php:100
+#: usr/local/www/interfaces_gif.php:99
+msgid "GRE"
+msgstr "GRE"
+
+#: usr/local/www/interfaces_bridge.php:96 usr/local/www/interfaces_gif.php:76
+#: usr/local/www/interfaces_gif.php:95
+#: usr/local/www/interfaces_gif_edit.php:125
+#: usr/local/www/interfaces_gre.php:96 usr/local/www/interfaces_groups.php:82
+#: usr/local/www/interfaces_assign.php:409
+#: usr/local/www/interfaces_vlan.php:97 usr/local/www/interfaces_lagg.php:101
+#: usr/local/www/interfaces_ppps.php:97 usr/local/www/interfaces_qinq.php:105
+#: usr/local/www/interfaces_wireless.php:95
+#: usr/local/www/interfaces_groups.php:83
+#: usr/local/www/interfaces_qinq.php:106 usr/local/www/interfaces_ppps.php:98
+#: usr/local/www/interfaces_bridge.php:97
+#: usr/local/www/interfaces_lagg.php:102 usr/local/www/interfaces_gre.php:97
+#: usr/local/www/interfaces_wireless.php:96
+#: usr/local/www/interfaces_assign.php:403
+#: usr/local/www/interfaces_vlan.php:98 usr/local/www/interfaces_gif.php:96
+#: usr/local/www/interfaces_qinq.php:109 usr/local/www/interfaces_lagg.php:106
+#: usr/local/www/interfaces_vlan.php:104
+#: usr/local/www/interfaces_gif_edit.php:133
+#: usr/local/www/interfaces_bridge.php:103
+#: usr/local/www/interfaces_wireless.php:98
+#: usr/local/www/interfaces_gre.php:101 usr/local/www/interfaces_gif.php:80
+#: usr/local/www/interfaces_gif.php:100
+msgid "GIF"
+msgstr "GIF"
+
+#: usr/local/www/interfaces_bridge.php:97 usr/local/www/interfaces_gif.php:96
+#: usr/local/www/interfaces_gre.php:97 usr/local/www/interfaces_groups.php:83
+#: usr/local/www/interfaces_assign.php:410
+#: usr/local/www/interfaces_vlan.php:98 usr/local/www/interfaces_lagg.php:102
+#: usr/local/www/interfaces_ppps.php:98 usr/local/www/interfaces_qinq.php:106
+#: usr/local/www/interfaces_wireless.php:96
+#: usr/local/www/interfaces_groups.php:84
+#: usr/local/www/interfaces_qinq.php:107 usr/local/www/interfaces_ppps.php:99
+#: usr/local/www/interfaces_bridge.php:98
+#: usr/local/www/interfaces_lagg.php:103 usr/local/www/interfaces_gre.php:98
+#: usr/local/www/interfaces_wireless.php:97
+#: usr/local/www/interfaces_assign.php:404
+#: usr/local/www/interfaces_vlan.php:99 usr/local/www/interfaces_gif.php:97
+#: usr/local/www/interfaces_qinq.php:110 usr/local/www/interfaces_lagg.php:107
+#: usr/local/www/interfaces_vlan.php:105
+#: usr/local/www/interfaces_bridge.php:104
+#: usr/local/www/interfaces_wireless.php:99
+#: usr/local/www/interfaces_gre.php:102 usr/local/www/interfaces_gif.php:101
+msgid "Bridges"
+msgstr "Pontes"
+
+#: usr/local/www/interfaces_bridge.php:98 usr/local/www/interfaces_gif.php:97
+#: usr/local/www/interfaces_gre.php:98 usr/local/www/interfaces_groups.php:84
+#: usr/local/www/interfaces_assign.php:411
+#: usr/local/www/interfaces_vlan.php:99 usr/local/www/interfaces_lagg.php:82
+#: usr/local/www/interfaces_lagg.php:103
+#: usr/local/www/interfaces_lagg_edit.php:120
+#: usr/local/www/interfaces_ppps.php:99 usr/local/www/interfaces_qinq.php:107
+#: usr/local/www/interfaces_wireless.php:97
+#: usr/local/www/interfaces_groups.php:85
+#: usr/local/www/interfaces_qinq.php:108 usr/local/www/interfaces_ppps.php:100
+#: usr/local/www/interfaces_bridge.php:99
+#: usr/local/www/interfaces_lagg.php:104 usr/local/www/interfaces_gre.php:99
+#: usr/local/www/interfaces_wireless.php:98
+#: usr/local/www/interfaces_assign.php:405
+#: usr/local/www/interfaces_vlan.php:100 usr/local/www/interfaces_gif.php:98
+#: usr/local/www/interfaces_qinq.php:111
+#: usr/local/www/interfaces_lagg_edit.php:133
+#: usr/local/www/interfaces_lagg.php:86 usr/local/www/interfaces_lagg.php:108
+#: usr/local/www/interfaces_vlan.php:106
+#: usr/local/www/interfaces_bridge.php:105
+#: usr/local/www/interfaces_wireless.php:100
+#: usr/local/www/interfaces_gre.php:103 usr/local/www/interfaces_gif.php:102
+msgid "LAGG"
+msgstr "LAGG"
+
+#: usr/local/www/interfaces_bridge.php:108
+#: usr/local/www/interfaces_groups.php:95
+#: usr/local/www/interfaces_lagg.php:113
+#: usr/local/www/load_balancer_pool_edit.php:257
+#: usr/local/www/system_groupmanager.php:317
+#: usr/local/www/load_balancer_pool_edit.php:274
+#: usr/local/www/interfaces_groups.php:96
+#: usr/local/www/interfaces_bridge.php:109
+#: usr/local/www/interfaces_lagg.php:114
+#: usr/local/www/load_balancer_pool_edit.php:272
+#: usr/local/www/interfaces_lagg.php:118
+#: usr/local/www/interfaces_bridge.php:115
+#: usr/local/www/system_groupmanager.php:320
+msgid "Members"
+msgstr "Membros"
+
+#: usr/local/www/interfaces_bridge.php:135
+#: usr/local/www/interfaces_bridge.php:136
+#: usr/local/www/interfaces_bridge.php:142
+msgid "Do you really want to delete this bridge?"
+msgstr "Você realmente quer apagar essa ponte?"
+
+#: usr/local/www/interfaces_bridge.php:146
+#: usr/local/www/interfaces_bridge.php:147
+#: usr/local/www/interfaces_bridge.php:153
+msgid "Here you can configure bridging of interfaces."
+msgstr "Aqui você pode configurar as pontes de interfaces."
+
+#: usr/local/www/interfaces_bridge_edit.php:111
+#: usr/local/www/interfaces_bridge_edit.php:119
+msgid "Member Interfaces"
+msgstr "Interfaces Membros"
+
+#: usr/local/www/interfaces_bridge_edit.php:116
+#: usr/local/www/interfaces_bridge_edit.php:124
+msgid "Maxage needs to be an integer between 6 and 40."
+msgstr "Idade Máx precida ser um inteiro entre 6 e 40."
+
+#: usr/local/www/interfaces_bridge_edit.php:118
+#: usr/local/www/interfaces_bridge_edit.php:126
+msgid "Maxaddr needs to be an integer."
+msgstr "Endereços Máx. precisa ser um inteiro."
+
+#: usr/local/www/interfaces_bridge_edit.php:120
+#: usr/local/www/interfaces_bridge_edit.php:128
+msgid "Timeout needs to be an integer."
+msgstr "Tempo de espera precisa ser um inteiro."
+
+#: usr/local/www/interfaces_bridge_edit.php:122
+#: usr/local/www/interfaces_bridge_edit.php:130
+msgid "Forward Delay needs to be an integer between 4 and 30."
+msgstr "Tempo de reenvio precisa ser um inteiro entre 4 e 30."
+
+#: usr/local/www/interfaces_bridge_edit.php:124
+#: usr/local/www/interfaces_bridge_edit.php:132
+msgid "Hello time for STP needs to be an integer between 1 and 2."
+msgstr "Tempo de Hello para STP precisa ser um inteiro entre 1 e 2."
+
+#: usr/local/www/interfaces_bridge_edit.php:126
+#: usr/local/www/interfaces_bridge_edit.php:134
+msgid "Priority for STP needs to be an integer between 0 and 61440."
+msgstr "Prioridade para STP precisa ser um inteiro entre 0 e 61440."
+
+#: usr/local/www/interfaces_bridge_edit.php:128
+#: usr/local/www/interfaces_bridge_edit.php:136
+msgid "Transmit Hold Count for STP needs to be an integer between 1 and 10."
+msgstr "Contagem de espera de transmissão para STP precisa ser um inteiro entre 1 e 10."
+
+#: usr/local/www/interfaces_bridge_edit.php:131
+#: usr/local/www/interfaces_bridge_edit.php:139
+msgid "interface priority for STP needs to be an integer between 0 and 240."
+msgstr "prioridade de interface para STP precisa ser um inteiro entre 0 e 240."
+
+#: usr/local/www/interfaces_bridge_edit.php:136
+#: usr/local/www/interfaces_bridge_edit.php:144
+msgid "interface path cost for STP needs to be an integer between 1 and 200000000."
+msgstr "custo de caminho de interface para STP precisa ser um inteiro entre 1 e 200000000."
+
+#: usr/local/www/interfaces_bridge_edit.php:141
+#: usr/local/www/interfaces_bridge_edit.php:149
+msgid "You must select at least 2 member interfaces for a bridge."
+msgstr "Você deve selecionar pelo menos 2 interfaces membro para uma ponte."
+
+#: usr/local/www/interfaces_bridge_edit.php:147
+#: usr/local/www/interfaces_bridge_edit.php:155
+#: usr/local/www/interfaces_bridge_edit.php:157
+msgid "Bridging a wireless interface is only possible in hostap mode."
+msgstr "Fazer uma ponte com uma interface sem fio somente é possível no modo hostap."
+
+#: usr/local/www/interfaces_bridge_edit.php:149
+#: usr/local/www/interfaces_bridge_edit.php:157
+#: usr/local/www/interfaces_bridge_edit.php:159
+msgid "Span interface cannot be part of the bridge. Remove the span interface from bridge members to continue."
+msgstr "Interface Span não pode ser parte de uma ponte. Remova a interface span dos membros da ponte para continuar."
+
+#: usr/local/www/interfaces_bridge_edit.php:206
+#: usr/local/www/interfaces_gif_edit.php:106
+#: usr/local/www/interfaces_gre_edit.php:108
+#: usr/local/www/interfaces_vlan_edit.php:121
+#: usr/local/www/interfaces_lagg_edit.php:101
+#: usr/local/www/interfaces_bridge_edit.php:215
+#: usr/local/www/interfaces_vlan_edit.php:124
+#: usr/local/www/interfaces_lagg_edit.php:114
+#: usr/local/www/interfaces_gif_edit.php:114
+#: usr/local/www/interfaces_bridge_edit.php:217
+msgid "Error occurred creating interface, please retry."
+msgstr "Um erro ocorreu ao criar a interface. Por favor, tente novamente."
+
+#: usr/local/www/interfaces_bridge_edit.php:253
+#: usr/local/www/interfaces_bridge_edit.php:262
+#: usr/local/www/interfaces_bridge_edit.php:263
+#: usr/local/www/interfaces_bridge_edit.php:264
+#: usr/local/www/interfaces_bridge_edit.php:266
+msgid "Bridge configuration"
+msgstr "Configuração de ponte"
+
+#: usr/local/www/interfaces_bridge_edit.php:256
+#: usr/local/www/interfaces_lagg_edit.php:86
+#: usr/local/www/interfaces_bridge_edit.php:265
+#: usr/local/www/interfaces_bridge_edit.php:266
+#: usr/local/www/interfaces_lagg_edit.php:88
+#: usr/local/www/interfaces_bridge_edit.php:267
+#: usr/local/www/interfaces_bridge_edit.php:269
+msgid "Member interfaces"
+msgstr "Interfaces membro"
+
+#: usr/local/www/interfaces_bridge_edit.php:269
+#: usr/local/www/interfaces_bridge_edit.php:278
+#: usr/local/www/interfaces_bridge_edit.php:279
+#: usr/local/www/interfaces_bridge_edit.php:280
+#: usr/local/www/interfaces_bridge_edit.php:282
+msgid "Interfaces participating in the bridge."
+msgstr "Interfaces participando da ponte."
+
+#: usr/local/www/interfaces_bridge_edit.php:285
+#: usr/local/www/interfaces_bridge_edit.php:294
+#: usr/local/www/interfaces_bridge_edit.php:295
+#: usr/local/www/interfaces_bridge_edit.php:296
+#: usr/local/www/interfaces_bridge_edit.php:298
+msgid "RSTP/STP"
+msgstr "RSTP/STP"
+
+#: usr/local/www/interfaces_bridge_edit.php:288
+#: usr/local/www/interfaces_bridge_edit.php:297
+#: usr/local/www/interfaces_bridge_edit.php:298
+#: usr/local/www/interfaces_bridge_edit.php:299
+#: usr/local/www/interfaces_bridge_edit.php:301
+msgid "Enable spanning tree options for this bridge."
+msgstr "Habilitar opções de árvore expansível para essa ponte."
+
+#: usr/local/www/interfaces_bridge_edit.php:304
+#: usr/local/www/interfaces_bridge_edit.php:313
+#: usr/local/www/interfaces_bridge_edit.php:314
+#: usr/local/www/interfaces_bridge_edit.php:315
+#: usr/local/www/interfaces_bridge_edit.php:317
+msgid "Protocol used for spanning tree."
+msgstr "Protocolo usado para árvore expansível."
+
+#: usr/local/www/interfaces_bridge_edit.php:306
+#: usr/local/www/interfaces_bridge_edit.php:315
+#: usr/local/www/interfaces_bridge_edit.php:316
+#: usr/local/www/interfaces_bridge_edit.php:317
+#: usr/local/www/interfaces_bridge_edit.php:319
+msgid "STP interfaces"
+msgstr "Interfaces STP"
+
+#: usr/local/www/interfaces_bridge_edit.php:320
+#: usr/local/www/interfaces_bridge_edit.php:329
+#: usr/local/www/interfaces_bridge_edit.php:330
+#: usr/local/www/interfaces_bridge_edit.php:331
+#: usr/local/www/interfaces_bridge_edit.php:333
+msgid "Enable Spanning Tree Protocol on interface. The if_bridge(4) driver has support for the IEEE 802.1D Spanning Tree Protocol (STP). STP is used to detect and remove loops in a network topology."
+msgstr "Habilitar Protocolo de Árvore Expansível na interface. O driver if_bridge(4) possui suporte para o Protocolo de Árvore Expansível (STP) IEEE 802.1D. STP é usado para detectar e remover loops em uma topologia de rede."
+
+#: usr/local/www/interfaces_bridge_edit.php:326
+#: usr/local/www/interfaces_bridge_edit.php:335
+#: usr/local/www/interfaces_bridge_edit.php:336
+#: usr/local/www/interfaces_bridge_edit.php:337
+#: usr/local/www/interfaces_bridge_edit.php:339
+msgid "Valid time"
+msgstr "Tempo válido"
+
+#: usr/local/www/interfaces_bridge_edit.php:328
+#: usr/local/www/interfaces_bridge_edit.php:338
+#: usr/local/www/interfaces_bridge_edit.php:347
+#: usr/local/www/interfaces_bridge_edit.php:416
+#: usr/local/www/interfaces.php:1817 usr/local/www/interfaces.php:1936
+#: usr/local/www/graph.php:120 usr/local/www/services_dhcp.php:679
+#: usr/local/www/services_dhcp.php:689
+#: usr/local/www/services_rfc2136_edit.php:156
+#: usr/local/www/vpn_ipsec_phase1.php:761
+#: usr/local/www/vpn_ipsec_phase1.php:831
+#: usr/local/www/vpn_ipsec_phase2.php:622
+#: usr/local/www/services_dhcpv6.php:624 usr/local/www/services_dhcpv6.php:634
+#: usr/local/www/services_dhcp.php:692 usr/local/www/services_dhcp.php:702
+#: usr/local/www/interfaces_bridge_edit.php:337
+#: usr/local/www/interfaces_bridge_edit.php:356
+#: usr/local/www/interfaces_bridge_edit.php:425
+#: usr/local/www/vpn_ipsec_phase2.php:648 usr/local/www/interfaces.php:1995
+#: usr/local/www/interfaces.php:2114 usr/local/www/vpn_ipsec_phase1.php:774
+#: usr/local/www/vpn_ipsec_phase1.php:844
+#: usr/local/www/services_dhcpv6.php:692 usr/local/www/services_dhcpv6.php:702
+#: usr/local/www/services_dhcp.php:868 usr/local/www/services_dhcp.php:878
+#: usr/local/www/interfaces_bridge_edit.php:348
+#: usr/local/www/interfaces_bridge_edit.php:357
+#: usr/local/www/interfaces_bridge_edit.php:426
+#: usr/local/www/vpn_ipsec_phase2.php:744 usr/local/www/interfaces.php:1983
+#: usr/local/www/interfaces.php:2102 usr/local/www/vpn_ipsec_phase1.php:771
+#: usr/local/www/vpn_ipsec_phase1.php:841
+#: usr/local/www/services_dhcpv6.php:623 usr/local/www/services_dhcpv6.php:633
+#: usr/local/www/services_dhcp_edit.php:434
+#: usr/local/www/services_dhcp_edit.php:444
+#: usr/local/www/services_dhcp.php:882 usr/local/www/services_dhcp.php:892
+#: usr/local/www/services_dhcpv6.php:640 usr/local/www/services_dhcpv6.php:650
+#: usr/local/www/interfaces_bridge_edit.php:339
+#: usr/local/www/interfaces_bridge_edit.php:349
+#: usr/local/www/interfaces_bridge_edit.php:358
+#: usr/local/www/interfaces_bridge_edit.php:427
+#: usr/local/www/vpn_ipsec_phase1.php:792
+#: usr/local/www/vpn_ipsec_phase1.php:862
+#: usr/local/www/vpn_ipsec_phase2.php:765 usr/local/www/interfaces.php:2010
+#: usr/local/www/interfaces.php:2132 usr/local/www/services_dhcp.php:902
+#: usr/local/www/services_dhcp.php:912 usr/local/www/interfaces.php:2056
+#: usr/local/www/interfaces.php:2178
+#: usr/local/www/interfaces_bridge_edit.php:341
+#: usr/local/www/interfaces_bridge_edit.php:351
+#: usr/local/www/interfaces_bridge_edit.php:360
+#: usr/local/www/interfaces_bridge_edit.php:431
+#: usr/local/www/interfaces.php:2045 usr/local/www/interfaces.php:2167
+#: usr/local/www/services_dhcp.php:914 usr/local/www/services_dhcp.php:924
+#: usr/local/www/services_rfc2136_edit.php:161
+#: usr/local/www/interfaces.php:2081 usr/local/www/interfaces.php:2203
+msgid "seconds"
+msgstr "segundos"
+
+#: usr/local/www/interfaces_bridge_edit.php:331
+#: usr/local/www/interfaces_bridge_edit.php:340
+#: usr/local/www/interfaces_bridge_edit.php:341
+#: usr/local/www/interfaces_bridge_edit.php:342
+#: usr/local/www/interfaces_bridge_edit.php:344
+msgid "Set the time that a Spanning Tree Protocol configuration is valid. The default is 20 seconds. The minimum is 6 seconds and the maximum is 40 seconds."
+msgstr "Configurar o tempo que uma configuração STP é válida. O padrão é 20 segundos. O mínimo é 6 segundos e o máximo e 40 segundos."
+
+#: usr/local/www/interfaces_bridge_edit.php:336
+#: usr/local/www/interfaces_bridge_edit.php:345
+#: usr/local/www/interfaces_bridge_edit.php:346
+#: usr/local/www/interfaces_bridge_edit.php:347
+#: usr/local/www/interfaces_bridge_edit.php:349
+msgid "Forward time"
+msgstr "Tempo de reenvio"
+
+#: usr/local/www/interfaces_bridge_edit.php:341
+#: usr/local/www/interfaces_bridge_edit.php:350
+#: usr/local/www/interfaces_bridge_edit.php:351
+#: usr/local/www/interfaces_bridge_edit.php:352
+#: usr/local/www/interfaces_bridge_edit.php:354
+msgid "Set the time that must pass before an interface begins forwarding packets when Spanning Tree is enabled. The default is 15 seconds. The minimum is 4 seconds and the maximum is 30 seconds."
+msgstr "Configure o tempo que deve passar antes que uma interface comece a reenviar pacotes quando o Spanning Tree está habilitado. O padrão é 15 segundos. O mínimo é 4 segundos e o máximo é 30 segundos."
+
+#: usr/local/www/interfaces_bridge_edit.php:345
+#: usr/local/www/interfaces_bridge_edit.php:354
+#: usr/local/www/interfaces_bridge_edit.php:355
+#: usr/local/www/interfaces_bridge_edit.php:356
+#: usr/local/www/interfaces_bridge_edit.php:358
+msgid "Hello time"
+msgstr "Hello time"
+
+#: usr/local/www/interfaces_bridge_edit.php:350
+#: usr/local/www/interfaces_bridge_edit.php:359
+#: usr/local/www/interfaces_bridge_edit.php:360
+#: usr/local/www/interfaces_bridge_edit.php:361
+#: usr/local/www/interfaces_bridge_edit.php:363
+msgid "Set the time between broadcasting of Spanning Tree Protocol configuration messages. The hello time may only be changed when operating in legacy STP mode. The default is 2 seconds. The minimum is 1 second and the maximum is 2 seconds."
+msgstr "Configure o tempo entre os broadcasts de mensagems de configuração de Protocolo de Árvore Expansível. O tempo de hello somente pode ser modificado quando operando no modo legado do STP. O padrão é 2 segundos. O mínimo é 1 segundo e o máximo é 2 segundos."
+
+#: usr/local/www/interfaces_bridge_edit.php:359
+#: usr/local/www/interfaces_bridge_edit.php:368
+#: usr/local/www/interfaces_bridge_edit.php:369
+#: usr/local/www/interfaces_bridge_edit.php:370
+#: usr/local/www/interfaces_bridge_edit.php:372
+msgid "Set the bridge priority for Spanning Tree. The default is 32768. The minimum is 0 and the maximum is 61440."
+msgstr "Configure a prioridade da ponte para Árvore Expansível. O padrão é 32768. O mínimo é 0 e o máximo é 61440."
+
+#: usr/local/www/interfaces_bridge_edit.php:363
+#: usr/local/www/interfaces_bridge_edit.php:372
+#: usr/local/www/interfaces_bridge_edit.php:373
+#: usr/local/www/interfaces_bridge_edit.php:374
+#: usr/local/www/interfaces_bridge_edit.php:376
+msgid "Hold count"
+msgstr "Contagem de espera"
+
+#: usr/local/www/interfaces_bridge_edit.php:368
+#: usr/local/www/interfaces_bridge_edit.php:377
+#: usr/local/www/interfaces_bridge_edit.php:378
+#: usr/local/www/interfaces_bridge_edit.php:379
+msgid "Set the transmit hold count for Spanning Tree. This is the num- ber of packets transmitted before being rate limited. The default is 6. The minimum is 1 and the maximum is 10."
+msgstr "Configure a contagem de espera de transmissão para a Árvore Expansível. Esse é o número de pacotes transmitidos antes que seja limitado a uma taxa. O padrão é 6. O mínimo é 1 e o máximo é 10."
+
+#: usr/local/www/interfaces_bridge_edit.php:382
+msgid "Set the Spanning Tree priority of interface to value. The default is 128. The minimum is 0 and the maximum is 240."
+msgstr "Configure a prioridade da Árvore Expansível de uma interface para um valor. O padrão é 128. O mínimo é 0 e o máximo é 240."
+
+#: usr/local/www/interfaces_bridge_edit.php:386
+#: usr/local/www/interfaces_bridge_edit.php:395
+#: usr/local/www/interfaces_bridge_edit.php:396
+#: usr/local/www/interfaces_bridge_edit.php:397
+#: usr/local/www/interfaces_bridge_edit.php:400
+msgid "Path cost"
+msgstr "Custo do caminho"
+
+#: usr/local/www/interfaces_bridge_edit.php:395
+#: usr/local/www/interfaces_bridge_edit.php:404
+#: usr/local/www/interfaces_bridge_edit.php:405
+#: usr/local/www/interfaces_bridge_edit.php:406
+#: usr/local/www/interfaces_bridge_edit.php:410
+msgid "Set the Spanning Tree path cost of interface to value. The default is calculated from the link speed. To change a previously selected path cost back to automatic, set the cost to 0. The minimum is 1 and the maximum is 200000000."
+msgstr "Configure o custo do caminho da Árvore Expansível de uma interface para um valor. O padrão é calculado com base na velocidade do link. Para modificar um custo selecionado anteriormente para automático, configure o custo como 0. O mínimo e 1 e o máximo é 200000000."
+
+#: usr/local/www/interfaces_bridge_edit.php:404
+#: usr/local/www/interfaces_bridge_edit.php:413
+#: usr/local/www/interfaces_bridge_edit.php:414
+#: usr/local/www/interfaces_bridge_edit.php:415
+#: usr/local/www/interfaces_bridge_edit.php:419
+msgid "Cache size"
+msgstr "Tamanho do Cache"
+
+#: usr/local/www/interfaces_bridge_edit.php:406
+#: usr/local/www/interfaces_bridge_edit.php:415
+#: usr/local/www/interfaces_bridge_edit.php:416
+#: usr/local/www/interfaces_bridge_edit.php:417
+#: usr/local/www/interfaces_bridge_edit.php:421
+msgid "entries"
+msgstr "entradas"
+
+#: usr/local/www/interfaces_bridge_edit.php:408
+#: usr/local/www/interfaces_bridge_edit.php:417
+#: usr/local/www/interfaces_bridge_edit.php:418
+#: usr/local/www/interfaces_bridge_edit.php:419
+#: usr/local/www/interfaces_bridge_edit.php:423
+msgid "Set the size of the bridge address cache to size.\tThe default is .100 entries."
+msgstr "Configure o tamanho do endereço de cache da ponte para um tamanho.\tO padrão é 100 entradas."
+
+#: usr/local/www/interfaces_bridge_edit.php:414
+#: usr/local/www/interfaces_bridge_edit.php:423
+#: usr/local/www/interfaces_bridge_edit.php:424
+#: usr/local/www/interfaces_bridge_edit.php:425
+#: usr/local/www/interfaces_bridge_edit.php:429
+msgid "Cache entry expire time"
+msgstr "Tempo de expiração de entrada do Cache"
+
+#: usr/local/www/interfaces_bridge_edit.php:418
+#: usr/local/www/interfaces_bridge_edit.php:427
+#: usr/local/www/interfaces_bridge_edit.php:428
+#: usr/local/www/interfaces_bridge_edit.php:429
+#: usr/local/www/interfaces_bridge_edit.php:433
+msgid "Set the timeout of address cache entries to this number of seconds. If seconds is zero, then address cache entries will not be expired. The default is 240 seconds."
+msgstr "Configure o tempo de expiração de entradas do Cache para esse número em segundos. Se for zero, então as entradas de endereço de cache não expirarão. O padrão é 240 segundos."
+
+#: usr/local/www/interfaces_bridge_edit.php:425
+#: usr/local/www/interfaces_bridge_edit.php:434
+#: usr/local/www/interfaces_bridge_edit.php:435
+#: usr/local/www/interfaces_bridge_edit.php:436
+#: usr/local/www/interfaces_bridge_edit.php:440
+msgid "Span port"
+msgstr "Porta Span"
+
+#: usr/local/www/interfaces_bridge_edit.php:439
+#: usr/local/www/interfaces_bridge_edit.php:448
+#: usr/local/www/interfaces_bridge_edit.php:449
+#: usr/local/www/interfaces_bridge_edit.php:450
+#: usr/local/www/interfaces_bridge_edit.php:454
+msgid "Add the interface named by interface as a span port on the bridge. Span ports transmit a copy of every frame received by the bridge. This is most useful for snooping a bridged network passively on another host connected to one of the span ports of the bridge."
+msgstr "Adicione a interface nomeada pela interface como uma porta span na ponte. Portas Span transmitem uma cópia de cada frame recebido pela ponte. Esse é muito útil para fazer snooping em uma rede com ponte de modo passivo em outro host conectado a uma das portas span da ponte."
+
+#: usr/local/www/interfaces_bridge_edit.php:448
+#: usr/local/www/interfaces_bridge_edit.php:457
+#: usr/local/www/interfaces_bridge_edit.php:458
+#: usr/local/www/interfaces_bridge_edit.php:459
+#: usr/local/www/interfaces_bridge_edit.php:463
+msgid "The span interface cannot be part of the bridge member interfaces."
+msgstr "A interface span não pode ser parte das interfaces membros da ponte."
+
+#: usr/local/www/interfaces_bridge_edit.php:453
+#: usr/local/www/interfaces_bridge_edit.php:462
+#: usr/local/www/interfaces_bridge_edit.php:463
+#: usr/local/www/interfaces_bridge_edit.php:464
+#: usr/local/www/interfaces_bridge_edit.php:468
+msgid "Edge ports"
+msgstr "Portas Edge"
+
+#: usr/local/www/interfaces_bridge_edit.php:467
+#: usr/local/www/interfaces_bridge_edit.php:476
+#: usr/local/www/interfaces_bridge_edit.php:477
+#: usr/local/www/interfaces_bridge_edit.php:478
+#: usr/local/www/interfaces_bridge_edit.php:482
+msgid "Set interface as an edge port. An edge port connects directly to end stations and cannot create bridging loops in the network; this allows it to transition straight to forwarding."
+msgstr "Configura interface como uma porta edge. Uma porta edge conecta-se diretamente com estações fim e não pode criar loops de pontes na rede; isso a permite transicionar diretamente para reenvio."
+
+#: usr/local/www/interfaces_bridge_edit.php:473
+#: usr/local/www/interfaces_bridge_edit.php:482
+#: usr/local/www/interfaces_bridge_edit.php:483
+#: usr/local/www/interfaces_bridge_edit.php:484
+#: usr/local/www/interfaces_bridge_edit.php:488
+msgid "Auto Edge ports"
+msgstr "Portas Edge Auto"
+
+#: usr/local/www/interfaces_bridge_edit.php:487
+#: usr/local/www/interfaces_bridge_edit.php:496
+#: usr/local/www/interfaces_bridge_edit.php:497
+#: usr/local/www/interfaces_bridge_edit.php:498
+#: usr/local/www/interfaces_bridge_edit.php:502
+msgid "Allow interface to automatically detect edge status. This is the default for all interfaces added to a bridge."
+msgstr "Permite uma interface detectar automaticamente o status de edge. Esse é o padrão para todas as interfaces adicionadas à ponte."
+
+#: usr/local/www/interfaces_bridge_edit.php:492
+#: usr/local/www/interfaces_bridge_edit.php:501
+#: usr/local/www/interfaces_bridge_edit.php:502
+#: usr/local/www/interfaces_bridge_edit.php:503
+#: usr/local/www/interfaces_bridge_edit.php:507
+msgid "This will disable the autoedge status of interfaces."
+msgstr "Isso irá desabilitar o status edge automático das interfaces."
+
+#: usr/local/www/interfaces_bridge_edit.php:496
+#: usr/local/www/interfaces_bridge_edit.php:505
+#: usr/local/www/interfaces_bridge_edit.php:506
+#: usr/local/www/interfaces_bridge_edit.php:507
+#: usr/local/www/interfaces_bridge_edit.php:511
+msgid "PTP ports"
+msgstr "Portas PTP"
+
+#: usr/local/www/interfaces_bridge_edit.php:510
+#: usr/local/www/interfaces_bridge_edit.php:519
+#: usr/local/www/interfaces_bridge_edit.php:520
+#: usr/local/www/interfaces_bridge_edit.php:521
+#: usr/local/www/interfaces_bridge_edit.php:525
+msgid "Set the interface as a point-to-point link. This is required for straight transitions to forwarding and should be enabled on a direct link to another RSTP-capable switch."
+msgstr "Configura a interface como um link ponto-a-ponto. Ele é requisitado para encaminhar transições para reenvio e deve ser habilitado em um link direto para outro switch RSTP."
+
+#: usr/local/www/interfaces_bridge_edit.php:516
+#: usr/local/www/interfaces_bridge_edit.php:525
+#: usr/local/www/interfaces_bridge_edit.php:526
+#: usr/local/www/interfaces_bridge_edit.php:527
+#: usr/local/www/interfaces_bridge_edit.php:531
+msgid "Auto PTP ports"
+msgstr "Portas PTP Auto"
+
+#: usr/local/www/interfaces_bridge_edit.php:530
+#: usr/local/www/interfaces_bridge_edit.php:539
+#: usr/local/www/interfaces_bridge_edit.php:540
+#: usr/local/www/interfaces_bridge_edit.php:541
+#: usr/local/www/interfaces_bridge_edit.php:545
+msgid "Automatically detect the point-to-point status on interface by checking the full duplex link status. This is the default for interfaces added to the bridge."
+msgstr "Detecta automaticamente o status ponto-a-ponto na interface ao checar o status full duples do link. Esse é o padrão para interfaces adicionadas à ponte."
+
+#: usr/local/www/interfaces_bridge_edit.php:536
+#: usr/local/www/interfaces_bridge_edit.php:545
+#: usr/local/www/interfaces_bridge_edit.php:546
+#: usr/local/www/interfaces_bridge_edit.php:547
+#: usr/local/www/interfaces_bridge_edit.php:551
+msgid "The interfaces selected here will be removed from default autoedge status."
+msgstr "As interfaces selecionadas aqui serão removidas do status edge automático padrão."
+
+#: usr/local/www/interfaces_bridge_edit.php:540
+#: usr/local/www/interfaces_bridge_edit.php:549
+#: usr/local/www/interfaces_bridge_edit.php:550
+#: usr/local/www/interfaces_bridge_edit.php:551
+#: usr/local/www/interfaces_bridge_edit.php:555
+msgid "Sticky ports"
+msgstr "Portas Sticky"
+
+#: usr/local/www/interfaces_bridge_edit.php:554
+#: usr/local/www/interfaces_bridge_edit.php:563
+#: usr/local/www/interfaces_bridge_edit.php:564
+#: usr/local/www/interfaces_bridge_edit.php:565
+#: usr/local/www/interfaces_bridge_edit.php:569
+msgid "Mark an interface as a \"sticky\" interface. Dynamically learned address entries are treated as static once entered into the cache. Sticky entries are never aged out of the cache or replaced, even if the address is seen on a different interface."
+msgstr "Marca uma interface como \"sticky\". Entradas de endereços assimilados dinamicamente são tratados como estáticos uma vez que entram no cache. Entradas Sticky nunca não descartadas do cache ou substituídas, mesmo que o endereço for encontrado em uma interface diferente."
+
+#: usr/local/www/interfaces_bridge_edit.php:561
+#: usr/local/www/interfaces_bridge_edit.php:570
+#: usr/local/www/interfaces_bridge_edit.php:571
+#: usr/local/www/interfaces_bridge_edit.php:572
+#: usr/local/www/interfaces_bridge_edit.php:576
+msgid "Private ports"
+msgstr "Portas privadas"
+
+#: usr/local/www/interfaces_bridge_edit.php:575
+#: usr/local/www/interfaces_bridge_edit.php:584
+#: usr/local/www/interfaces_bridge_edit.php:585
+#: usr/local/www/interfaces_bridge_edit.php:586
+#: usr/local/www/interfaces_bridge_edit.php:590
+msgid "Mark an interface as a \"private\" interface. A private interface does not forward any traffic to any other port that is also a private interface."
+msgstr "Marca uma interface como \"privada\". A interface privada não encaminha nenhum tráfego para nenhuma outra porta que também é uma interface privada."
+
+#: usr/local/www/interfaces_gif.php:64 usr/local/www/interfaces_gif.php:68
+msgid "This gif TUNNEL cannot be deleted because it is still being used as an interface."
+msgstr "Esse TÚNEL gif não pode ser apagado porque ele ainda é usado como uma interface."
+
+#: usr/local/www/interfaces_gif.php:107 usr/local/www/interfaces_gre.php:108
+#: usr/local/www/interfaces_gre.php:109 usr/local/www/interfaces_gif.php:108
+#: usr/local/www/interfaces_gre.php:113 usr/local/www/interfaces_gif.php:112
+msgid "Tunnel to..."
+msgstr "Túnel para..."
+
+#: usr/local/www/interfaces_gif.php:123 usr/local/www/interfaces_gif.php:124
+#: usr/local/www/interfaces_gif.php:128
+msgid "Do you really want to delete this gif tunnel?"
+msgstr "Você realmente quer apagar esse túnel gif?"
+
+#: usr/local/www/interfaces_gif.php:134 usr/local/www/interfaces_gif.php:135
+#: usr/local/www/interfaces_gif.php:139
+msgid "GIF tunnels are configured here."
+msgstr "Túneis GIF são configurados aqui."
+
+#: usr/local/www/interfaces_gif_edit.php:72
+#: usr/local/www/interfaces_gif_edit.php:75
+msgid "Parent interface,Local address, Remote tunnel address, Remote tunnel network, Local tunnel address"
+msgstr "Interface pai, endereço local, endereço de túnel remoto, rede de túnel remoto, endereço de túnel local"
+
+#: usr/local/www/interfaces_gif_edit.php:78
+#: usr/local/www/interfaces_gre_edit.php:80
+#: usr/local/www/interfaces_gif_edit.php:81
+msgid "The tunnel local and tunnel remote fields must have valid IP addresses."
+msgstr "Os campos túnel local e remoto devem conter endereços IP válidos."
+
+#: usr/local/www/interfaces_gif_edit.php:87
+#: usr/local/www/interfaces_gif_edit.php:95
+#, php-format
+msgid "A gif with the network %s is already defined."
+msgstr "Um gif com a rede %s já foi definido."
+
+#: usr/local/www/interfaces_gif_edit.php:136
+#: usr/local/www/interfaces_gif_edit.php:137
+#: usr/local/www/interfaces_gif_edit.php:138
+#: usr/local/www/interfaces_gif_edit.php:146
+msgid "GIF configuration"
+msgstr "Configuração GIF"
+
+#: usr/local/www/interfaces_gif_edit.php:139
+#: usr/local/www/interfaces_gre_edit.php:74
+#: usr/local/www/interfaces_gre_edit.php:141
+#: usr/local/www/interfaces_vlan_edit.php:75
+#: usr/local/www/interfaces_vlan_edit.php:153
+#: usr/local/www/interfaces_lagg_edit.php:134
+#: usr/local/www/interfaces_qinq_edit.php:288
+#: usr/local/www/interfaces_wireless_edit.php:84
+#: usr/local/www/interfaces_wireless_edit.php:159
+#: usr/local/www/interfaces_gif_edit.php:140
+#: usr/local/www/interfaces_vlan_edit.php:154
+#: usr/local/www/interfaces_qinq_edit.php:289
+#: usr/local/www/interfaces_gif_edit.php:141
+#: usr/local/www/interfaces_lagg_edit.php:135
+#: usr/local/www/interfaces_gre_edit.php:142
+#: usr/local/www/interfaces_wireless_edit.php:86
+#: usr/local/www/interfaces_wireless_edit.php:161
+#: usr/local/www/interfaces_vlan_edit.php:157
+#: usr/local/www/interfaces_lagg_edit.php:148
+#: usr/local/www/interfaces_gif_edit.php:149
+#: usr/local/www/interfaces_qinq_edit.php:292
+msgid "Parent interface"
+msgstr "Interface pai"
+
+#: usr/local/www/interfaces_gif_edit.php:156
+#: usr/local/www/interfaces_gif_edit.php:157
+#: usr/local/www/interfaces_gif_edit.php:158
+#: usr/local/www/interfaces_gif_edit.php:169
+msgid "The interface here servers as the local address to be used for the gif tunnel."
+msgstr "A interface aqui serve como endereço local para ser usada pelo túnel gif."
+
+#: usr/local/www/interfaces_gif_edit.php:159
+#: usr/local/www/interfaces_gif_edit.php:160
+#: usr/local/www/interfaces_gif_edit.php:161
+#: usr/local/www/interfaces_gif_edit.php:172
+msgid "gif remote address"
+msgstr "endereço gif remoto"
+
+#: usr/local/www/interfaces_gif_edit.php:163
+#: usr/local/www/interfaces_gif_edit.php:164
+#: usr/local/www/interfaces_gif_edit.php:165
+#: usr/local/www/interfaces_gif_edit.php:176
+msgid "Peer address where encapsulated gif packets will be sent. "
+msgstr "Endereços peer onde pacotes gif encapsulados serão enviados."
+
+#: usr/local/www/interfaces_gif_edit.php:166
+#: usr/local/www/interfaces_gif_edit.php:167
+#: usr/local/www/interfaces_gif_edit.php:168
+#: usr/local/www/interfaces_gif_edit.php:179
+msgid "gif tunnel local address"
+msgstr "endereço local do túnel gif"
+
+#: usr/local/www/interfaces_gif_edit.php:170
+#: usr/local/www/interfaces_gif_edit.php:171
+#: usr/local/www/interfaces_gif_edit.php:172
+#: usr/local/www/interfaces_gif_edit.php:183
+msgid "Local gif tunnel endpoint"
+msgstr "Ponto final de túnel gif local"
+
+#: usr/local/www/interfaces_gif_edit.php:173
+#: usr/local/www/interfaces_gif_edit.php:174
+#: usr/local/www/interfaces_gif_edit.php:175
+#: usr/local/www/interfaces_gif_edit.php:186
+msgid "gif tunnel remote address "
+msgstr "endereço remoto de túnel gif "
+
+#: usr/local/www/interfaces_gif_edit.php:188
+#: usr/local/www/interfaces_gif_edit.php:189
+#: usr/local/www/interfaces_gif_edit.php:200
+msgid "Remote gif address endpoint. The subnet part is used for determining the network that is tunnelled."
+msgstr "Ponto final de endereço gif remoto. A parte da subrede é usada para determinar a rede que está sendo usada no túnel."
+
+#: usr/local/www/interfaces_gif_edit.php:191
+#: usr/local/www/interfaces_gif_edit.php:192
+#: usr/local/www/interfaces_gif_edit.php:203
+msgid "Route caching "
+msgstr "Cache de rota"
+
+#: usr/local/www/interfaces_gif_edit.php:195
+#: usr/local/www/interfaces_gif_edit.php:196
+#: usr/local/www/interfaces_gif_edit.php:207
+msgid "Specify if route caching can be enabled. Be careful with these settings on dynamic networks. "
+msgstr "Especifique se a rota de cache pode ser habilitada. Seja cuidadoso com essas configurações em redes dinâmicas."
+
+#: usr/local/www/interfaces_gif_edit.php:198
+#: usr/local/www/interfaces_gif_edit.php:199
+#: usr/local/www/interfaces_gif_edit.php:210
+msgid "ECN friendly behaviour"
+msgstr "Comportamento amigável ECN"
+
+#: usr/local/www/interfaces_gif_edit.php:203
+#: usr/local/www/interfaces_gif_edit.php:204
+#: usr/local/www/interfaces_gif_edit.php:215
+msgid "Note that the ECN friendly behavior violates RFC2893. This should be used in mutual agreement with the peer."
+msgstr "Note que o comportamento amigável ECN viola a RFC2893. Isso deve ser usado em comum acordo com o peer."
+
+#: usr/local/www/interfaces_gre.php:65 usr/local/www/interfaces_gre.php:69
+msgid "This GRE tunnel cannot be deleted because it is still being used as an interface."
+msgstr "Esse túbel GRE não pode ser apagado porque ele ainda está sendo usado como uma interface."
+
+#: usr/local/www/interfaces_gre.php:124 usr/local/www/interfaces_gre.php:125
+#: usr/local/www/interfaces_gre.php:129
+msgid "Do you really want to delete this GRE tunnel?"
+msgstr "Você realmente quer apagar esse túnel GRE?"
+
+#: usr/local/www/interfaces_gre.php:133 usr/local/www/interfaces_gre.php:134
+#: usr/local/www/interfaces_gre.php:138
+msgid "Here you can configure Generic Routing Encapsulation (GRE - RFC 2784) tunnels."
+msgstr "Aqui você pode configurar os túneis de Encapsulamento de Rota Genérico (GRE - RFC 2784)."
+
+#: usr/local/www/interfaces_gre_edit.php:74
+msgid "Local address"
+msgstr "Endereço local"
+
+#: usr/local/www/interfaces_gre_edit.php:74
+msgid "Remote tunnel address"
+msgstr "Endereço de túnel remoto"
+
+#: usr/local/www/interfaces_gre_edit.php:74
+msgid "Remote tunnel network"
+msgstr "Rede de túnel remota"
+
+#: usr/local/www/interfaces_gre_edit.php:74
+msgid "Local tunnel address"
+msgstr "Endereço de túnel remoto"
+
+#: usr/local/www/interfaces_gre_edit.php:88
+#, php-format
+msgid "A GRE tunnel with the network %s is already defined."
+msgstr "Uma GRE com a rede %s já foi definida."
+
+#: usr/local/www/interfaces_gre_edit.php:138
+#: usr/local/www/interfaces_gre_edit.php:139
+msgid "GRE configuration"
+msgstr "Configuração GRE"
+
+#: usr/local/www/interfaces_gre_edit.php:158
+#: usr/local/www/interfaces_gre_edit.php:159
+msgid "The interface here serves as the local address to be used for the GRE tunnel."
+msgstr "A interface aqui serve como o endereço local para ser usado para o túnel GRE."
+
+#: usr/local/www/interfaces_gre_edit.php:161
+#: usr/local/www/interfaces_gre_edit.php:162
+msgid "GRE remote address"
+msgstr "Endereço remoto GRE"
+
+#: usr/local/www/interfaces_gre_edit.php:165
+#: usr/local/www/interfaces_gre_edit.php:166
+msgid "Peer address where encapsulated GRE packets will be sent "
+msgstr "Endereço peer onde os pacotes GRE encapsulados serão enviados "
+
+#: usr/local/www/interfaces_gre_edit.php:168
+#: usr/local/www/interfaces_gre_edit.php:169
+msgid "GRE tunnel local address "
+msgstr "Endereço local de túnel GRE"
+
+#: usr/local/www/interfaces_gre_edit.php:172
+#: usr/local/www/interfaces_gre_edit.php:173
+msgid "Local GRE tunnel endpoint"
+msgstr "Ponta fim de túnel GRE local"
+
+#: usr/local/www/interfaces_gre_edit.php:175
+#: usr/local/www/interfaces_gre_edit.php:176
+msgid "GRE tunnel remote address "
+msgstr "Endereço remoto de túnel GRE "
+
+#: usr/local/www/interfaces_gre_edit.php:190
+#: usr/local/www/interfaces_gre_edit.php:189
+msgid "Remote GRE address endpoint. The subnet part is used for the determining the network that is tunneled."
+msgstr "Ponta final de endereço GRE remoto. A parte da subrede é usada para determinar a rede que está sendo usada no túnel."
+
+#: usr/local/www/interfaces_gre_edit.php:193
+#: usr/local/www/interfaces_gre_edit.php:192
+msgid "Mobile tunnel"
+msgstr "Túnel móvel"
+
+#: usr/local/www/interfaces_gre_edit.php:197
+#: usr/local/www/interfaces_gre_edit.php:196
+msgid "Specify which encapsulation method the tunnel should use. "
+msgstr "Especificar qual método de encapsulamento o túnel deve usar."
+
+#: usr/local/www/interfaces_gre_edit.php:200
+#: usr/local/www/interfaces_gre_edit.php:199
+msgid "Route search type"
+msgstr "Tipo de busca de rota"
+
+#: usr/local/www/interfaces_gre_edit.php:205
+#: usr/local/www/interfaces_gre_edit.php:204
+msgid "For correct operation, the GRE device needs a route to the destination that is less specific than the one over the tunnel. (Basically, there needs to be a route to the decapsulating host that does not run over the tunnel, as this would be a loop."
+msgstr "Para operação correta, o dispositivo GRE necessita de uma rota para o destino que é menos específica que aquela sobre o túnel. (Basicamente, é necessária uma rota para o host desencapsulado que não roda sobre o túnel, pois isso seria um loop."
+
+#: usr/local/www/interfaces_gre_edit.php:212
+#: usr/local/www/interfaces_gre_edit.php:211
+msgid "WCCP version"
+msgstr "Versão do WCCP"
+
+#: usr/local/www/interfaces_gre_edit.php:216
+#: usr/local/www/interfaces_gre_edit.php:215
+msgid "Specify which WCCP encapsulation(version 1 or 2) method the tunnel should use"
+msgstr "Especifique qual método de encapsulamento WCCP (versão 1 ou 2) o túnel deve usar"
+
+#: usr/local/www/interfaces_groups.php:63
+#: usr/local/www/interfaces_groups_edit.php:44
+#: usr/local/www/system_routes.php:117
+#: usr/local/www/status_gateway_groups.php:65
+#: usr/local/www/system_authservers.php:422
+#: usr/local/www/system_gateway_groups.php:110
+#: usr/local/www/system_gateways.php:143
+#: usr/local/www/system_groupmanager.php:241
+#: usr/local/www/system_groupmanager_addprivs.php:169
+#: usr/local/www/system_usermanager.php:441
+#: usr/local/www/system_usermanager.php:790
+#: usr/local/www/system_usermanager_addprivs.php:168
+#: usr/local/www/system_usermanager_settings.php:114
+#: usr/local/www/system_usermanager.php:439
+#: usr/local/www/system_usermanager.php:788
+#: usr/local/www/system_groupmanager_addprivs.php:167
+#: usr/local/www/system_usermanager.php:789
+#: usr/local/www/system_gateway_groups.php:111
+#: usr/local/www/system_authservers.php:427
+#: usr/local/www/system_routes.php:121
+#: usr/local/www/system_authservers.php:434
+#: usr/local/www/system_usermanager_settings.php:116
+#: usr/local/www/system_gateway_groups.php:120
+#: usr/local/www/system_routes.php:136
+#: usr/local/www/system_groupmanager.php:244
+#: usr/local/www/system_authservers.php:445
+msgid "Groups"
+msgstr "Grupos"
+
+#: usr/local/www/interfaces_groups.php:127
+#: usr/local/www/system_groupmanager.php:443
+#: usr/local/www/system_groupmanager.php:446
+#: usr/local/www/interfaces_groups.php:128
+#: usr/local/www/system_groupmanager.php:464
+#: usr/local/www/system_groupmanager.php:467
+msgid "edit group"
+msgstr "editar grupo"
+
+#: usr/local/www/interfaces_groups.php:128
+#: usr/local/www/interfaces_groups.php:129
+msgid "Do you really want to delete this group? All elements that still use it will become invalid (e.g. filter rules)!"
+msgstr "Você realmente uer apagar esse grupo? Todos os elementos que ainda o usam serão invalidados (e.g. regras de filtro)!"
+
+#: usr/local/www/interfaces_groups.php:128
+#: usr/local/www/interfaces_groups.php:129
+msgid "delete ifgroupentry"
+msgstr "apagar ifgroupentry"
+
+#: usr/local/www/interfaces_groups.php:140
+#: usr/local/www/interfaces_groups.php:141
+msgid "add a new group"
+msgstr "adicionar novo grupo"
+
+#: usr/local/www/interfaces_groups.php:148
+#: usr/local/www/interfaces_groups.php:149
+msgid "Interface Groups allow you to create rules that apply to multiple interfaces without duplicating the rules. If you remove members from an interface group, the group rules no longer apply to that interface."
+msgstr "Grupos de Interface permite que você crie regras que se aplicam a múltiplas interfaces sem duplicar as regras. Se você remover membros de um grupo de interface, as regras do grupo não mais serão aplicadas àquela interface."
+
+#: usr/local/www/interfaces_groups_edit.php:71
+#: usr/local/www/interfaces_groups_edit.php:72
+msgid "Group name already exists!"
+msgstr "Nome do grupo já existe!"
+
+#: usr/local/www/interfaces_groups_edit.php:74
+#: usr/local/www/interfaces_groups_edit.php:75
+msgid "Only letters A-Z are allowed as the group name."
+msgstr "Somente as letras de A-Z são permitidas como nome do grupo."
+
+#: usr/local/www/interfaces_groups_edit.php:248
+#: usr/local/www/interfaces_groups_edit.php:249
+msgid "Interface Groups Edit"
+msgstr "Edição de Grupos de Interface"
+
+#: usr/local/www/interfaces_groups_edit.php:251
+#: usr/local/www/status_gateway_groups.php:74
+#: usr/local/www/system_gateway_groups.php:120
+#: usr/local/www/system_gateway_groups_edit.php:158
+#: usr/local/www/system_gateway_groups_edit.php:161
+#: usr/local/www/system_groupmanager.php:117
+#: usr/local/www/system_gateway_groups_edit.php:169
+#: usr/local/www/system_gateway_groups_edit.php:172
+#: usr/local/www/system_gateway_groups_edit.php:228
+#: usr/local/www/system_gateway_groups_edit.php:231
+#: usr/local/www/system_gateway_groups.php:121
+#: usr/local/www/interfaces_groups_edit.php:252
+#: usr/local/www/status_gateway_groups.php:75
+#: usr/local/www/system_gateway_groups_edit.php:232
+#: usr/local/www/system_gateway_groups_edit.php:235
+#: usr/local/www/system_gateway_groups.php:130
+msgid "Group Name"
+msgstr "Nome do Grupo"
+
+#: usr/local/www/interfaces_groups_edit.php:255
+#: usr/local/www/interfaces_groups_edit.php:256
+msgid "No numbers or spaces are allowed. Only characters in a-zA-Z"
+msgstr "Não são permitidos números e espaços. Somente caracteres de a-z, A-Z"
+
+#: usr/local/www/interfaces_groups_edit.php:269
+#: usr/local/www/interfaces_qinq_edit.php:347
+#: usr/local/www/interfaces_qinq_edit.php:348
+#: usr/local/www/interfaces_groups_edit.php:270
+#: usr/local/www/interfaces_qinq_edit.php:351
+msgid "Member (s)"
+msgstr "Membro(s)"
+
+#: usr/local/www/firewall_aliases.php:103
+#: usr/local/www/firewall_aliases.php:106
+#: usr/local/www/firewall_aliases.php:107
+#, php-format
+msgid "Cannot delete alias. Currently in use by %s"
+msgstr "Não é possível excluir este alias. Atualmente em uso por %s"
+
+#: usr/local/www/firewall_aliases.php:160
+#: usr/local/www/firewall_aliases.php:163
+#: usr/local/www/firewall_aliases.php:167
+#: usr/local/www/firewall_aliases.php:166
+msgid "The alias list has been changed."
+msgstr "A lista de alias foi alterada."
+
+#: usr/local/www/firewall_aliases.php:166
+#: usr/local/www/services_igmpproxy.php:97
+#: usr/local/www/firewall_aliases.php:169
+#: usr/local/www/firewall_aliases.php:189
+msgid "Values"
+msgstr "Valores"
+
+#: usr/local/www/firewall_aliases.php:172
+#: usr/local/www/firewall_aliases.php:218
+#: usr/local/www/firewall_aliases.php:175
+#: usr/local/www/firewall_aliases.php:221
+msgid "add a new alias"
+msgstr "adicionar novo alias"
+
+#: usr/local/www/firewall_aliases.php:204
+#: usr/local/www/firewall_schedule.php:220
+#: usr/local/www/firewall_aliases.php:207
+msgid "edit alias"
+msgstr "editar alias"
+
+#: usr/local/www/firewall_aliases.php:205
+#: usr/local/www/firewall_aliases.php:208
+#: usr/local/www/firewall_aliases.php:256
+#: usr/local/www/firewall_aliases.php:257
+#: usr/local/www/firewall_aliases.php:258
+msgid "Do you really want to delete this alias? All elements that still use it will become invalid (e.g. filter rules)!"
+msgstr "Você realmente deseja excluir este alias? Todos os elementos que continuam a utiliza-lo irão se tornar inválidos. (ex. regras de filtro)!"
+
+#: usr/local/www/firewall_aliases.php:205
+#: usr/local/www/firewall_schedule.php:221
+#: usr/local/www/firewall_aliases.php:208
+msgid "delete alias"
+msgstr "excluir alias"
+
+#: usr/local/www/firewall_aliases.php:221
+#: usr/local/www/firewall_aliases.php:224
+#: usr/local/www/firewall_aliases.php:275
+#: usr/local/www/firewall_aliases.php:277
+#: usr/local/www/firewall_aliases.php:278
+msgid "Bulk import aliases from list"
+msgstr "Importação em massa de alias da lista"
+
+#: usr/local/www/firewall_aliases.php:229
+#: usr/local/www/firewall_aliases.php:232
+#: usr/local/www/firewall_aliases.php:284
+#: usr/local/www/firewall_aliases.php:287
+#: usr/local/www/firewall_aliases.php:288
+msgid "Aliases act as placeholders for real hosts, networks or ports. They can be used to minimize the number of changes that have to be made if a host, network or port changes. You can enter the name of an alias instead of the host, network or port in all fields that have a red background. The alias will be resolved according to the list above. If an alias cannot be resolved (e.g. because you deleted it), the corresponding element (e.g. filter/NAT/shaper rule) will be considered invalid and skipped."
+msgstr "Aliases atuam como espaços reservados para hosts, redes e portas reais. Eles podem ser usados para minimizar o número de alterações que devem ser feitas se um host, rede ou porta mudar. Você pode inserir o nome de um alias ao invés do host rede ou porta em todos os campos que possuem fundo vermelho. O alias irá ser resolvido de acordo com a lista acima. Se um alias não pode ser resolvido (ex. porque você o excluiu), o elemento correspondente (ex. regra de filtro/NAT/shaper) será considerada inválida e ignorada."
+
+#: usr/local/www/firewall_aliases_edit.php:105
+#: usr/local/www/firewall_aliases_edit.php:107
+#, php-format
+msgid "Sorry, an interface is already named %s."
+msgstr "Desculpe, uma interface já está nomeada %s."
+
+#: usr/local/www/firewall_aliases_edit.php:140
+#: usr/local/www/firewall_aliases_edit.php:142
+#: usr/local/www/firewall_aliases_edit.php:134
+#: usr/local/www/firewall_aliases_edit.php:136
+msgid "Reserved word used for alias name."
+msgstr "Palavra reservada usada para nome de alias."
+
+#: usr/local/www/firewall_aliases_edit.php:145
+#: usr/local/www/firewall_aliases_edit.php:139
+msgid "The alias name must be less than 32 characters long, may not consist of only numbers, and may only contain the following characters"
+msgstr "O nome de alias deve conter menos de 32 caracteres e deve consistir apenas de caracteres"
+
+#: usr/local/www/firewall_aliases_edit.php:187
+#: usr/local/www/firewall_aliases_edit.php:242
+#: usr/local/www/firewall_aliases_edit.php:188
+#: usr/local/www/firewall_aliases_edit.php:244
+#: usr/local/www/firewall_aliases_edit.php:182
+msgid "You must provide a valid URL."
+msgstr "Você deve fornecer uma URL válida."
+
+#: usr/local/www/firewall_aliases_edit.php:190
+#: usr/local/www/firewall_aliases_edit.php:191
+#: usr/local/www/firewall_aliases_edit.php:185
+msgid "Unable to fetch usable data."
+msgstr "Não foi possível obter dados úteis."
+
+#: usr/local/www/firewall_aliases_edit.php:235
+#: usr/local/www/firewall_aliases_edit.php:237
+msgid "You must provide a valid URL. Could not fetch usable data."
+msgstr "Você deve fornecer uma URL válida. Não foi possível obter dados úteis."
+
+#: usr/local/www/firewall_aliases_edit.php:261
+#: usr/local/www/firewall_aliases_edit.php:264
+#: usr/local/www/firewall_aliases_edit.php:278
+#: usr/local/www/firewall_aliases_edit.php:277
+msgid "is not a valid port or alias."
+msgstr "não é uma porta válida ou um alias."
+
+#: usr/local/www/firewall_aliases_edit.php:266
+#: usr/local/www/firewall_aliases_edit.php:269
+#: usr/local/www/firewall_aliases_edit.php:283
+#: usr/local/www/firewall_aliases_edit.php:282
+#, php-format
+msgid "%1$s is not a valid %2$s alias."
+msgstr "%1$s não é um válido %2$s alias."
+
+#: usr/local/www/firewall_aliases_edit.php:281
+#: usr/local/www/firewall_aliases_edit.php:284
+#: usr/local/www/firewall_aliases_edit.php:191
+#: usr/local/www/firewall_aliases_edit.php:221
+#: usr/local/www/firewall_aliases_edit.php:303
+#: usr/local/www/firewall_aliases_edit.php:220
+#: usr/local/www/firewall_aliases_edit.php:302
+#, php-format
+msgid "Entry added %s"
+msgstr "Entrada adicionada %s"
+
+#: usr/local/www/firewall_aliases_edit.php:285
+#: usr/local/www/firewall_aliases_edit.php:288
+#: usr/local/www/firewall_aliases_edit.php:307
+#: usr/local/www/firewall_aliases_edit.php:306
+#, php-format
+msgid "The alias(es): %s cannot be nested because they are not of the same type."
+msgstr "O(s) alias(es): %s não podem ser aninhados, porque não são do mesmo tipo."
+
+#: usr/local/www/firewall_aliases_edit.php:453
+#: usr/local/www/firewall_aliases_edit.php:605
+#: usr/local/www/firewall_aliases_edit.php:456
+#: usr/local/www/firewall_aliases_edit.php:610
+#: usr/local/www/firewall_aliases_edit.php:458
+#: usr/local/www/firewall_aliases_edit.php:613
+#: usr/local/www/firewall_aliases_edit.php:480
+#: usr/local/www/firewall_aliases_edit.php:644
+#: usr/local/www/firewall_aliases_edit.php:479
+#: usr/local/www/firewall_aliases_edit.php:643
+msgid "Network(s)"
+msgstr "Rede(s)"
+
+#: usr/local/www/firewall_aliases_edit.php:454
+#: usr/local/www/services_igmpproxy_edit.php:224
+#: usr/local/www/services_unbound_acls.php:237
+#: usr/local/www/services_igmpproxy_edit.php:226
+#: usr/local/www/firewall_aliases_edit.php:457
+#: usr/local/www/firewall_aliases_edit.php:459
+#: usr/local/www/firewall_aliases_edit.php:481
+#: usr/local/www/firewall_aliases_edit.php:480
+msgid "CIDR"
+msgstr "CIDR"
+
+#: usr/local/www/firewall_aliases_edit.php:456
+#: usr/local/www/firewall_aliases_edit.php:604
+#: usr/local/www/firewall_aliases_edit.php:614
+#: usr/local/www/firewall_aliases_edit.php:459
+#: usr/local/www/firewall_aliases_edit.php:609
+#: usr/local/www/firewall_aliases_edit.php:619
+#: usr/local/www/firewall_aliases_edit.php:461
+#: usr/local/www/firewall_aliases_edit.php:612
+#: usr/local/www/firewall_aliases_edit.php:622
+#: usr/local/www/firewall_aliases_edit.php:483
+#: usr/local/www/firewall_aliases_edit.php:643
+#: usr/local/www/firewall_aliases_edit.php:653
+#: usr/local/www/firewall_aliases_edit.php:482
+#: usr/local/www/firewall_aliases_edit.php:642
+#: usr/local/www/firewall_aliases_edit.php:652
+msgid "Host(s)"
+msgstr "Host(s)"
+
+#: usr/local/www/firewall_aliases_edit.php:457
+#: usr/local/www/diag_states_summary.php:150
+#: usr/local/www/services_dnsmasq.php:245
+#: usr/local/www/services_dnsmasq.php:312 usr/local/www/vpn_pppoe_edit.php:538
+#: usr/local/www/services_dnsmasq.php:333
+#: usr/local/www/services_unbound.php:281
+#: usr/local/www/services_unbound.php:348
+#: usr/local/www/firewall_aliases_edit.php:460
+#: usr/local/www/diag_states_summary.php:139
+#: usr/local/www/vpn_pppoe_edit.php:539 usr/local/www/services_dnsmasq.php:246
+#: usr/local/www/services_dnsmasq.php:334
+#: usr/local/www/firewall_aliases_edit.php:462
+#: usr/local/www/firewall_aliases.php:176
+#: usr/local/www/diag_states_summary.php:141
+#: usr/local/www/vpn_pppoe_edit.php:542 usr/local/www/services_dnsmasq.php:271
+#: usr/local/www/services_dnsmasq.php:359
+#: usr/local/www/firewall_aliases.php:174
+#: usr/local/www/firewall_aliases_edit.php:484
+#: usr/local/www/services_dnsmasq.php:284
+#: usr/local/www/services_dnsmasq.php:372
+#: usr/local/www/services_dnsmasq.php:348
+#: usr/local/www/services_dnsmasq.php:436
+#: usr/local/www/firewall_aliases_edit.php:483
+msgid "IP"
+msgstr "IP"
+
+#: usr/local/www/firewall_aliases_edit.php:458
+#: usr/local/www/firewall_aliases_edit.php:606
+#: usr/local/www/firewall_aliases_edit.php:461
+#: usr/local/www/firewall_aliases_edit.php:611
+#: usr/local/www/firewall_aliases_edit.php:463
+#: usr/local/www/firewall_aliases_edit.php:614
+#: usr/local/www/firewall_aliases_edit.php:485
+#: usr/local/www/firewall_aliases_edit.php:645
+#: usr/local/www/firewall_aliases_edit.php:484
+#: usr/local/www/firewall_aliases_edit.php:644
+msgid "Port(s)"
+msgstr "Porta(s)"
+
+#: usr/local/www/firewall_aliases_edit.php:460
+#: usr/local/www/firewall_aliases_edit.php:608
+#: usr/local/www/services_dhcp.php:807 usr/local/www/services_dhcpv6.php:733
+#: usr/local/www/firewall_aliases_edit.php:463
+#: usr/local/www/firewall_aliases_edit.php:613
+#: usr/local/www/services_dhcp.php:845 usr/local/www/services_dhcpv6.php:828
+#: usr/local/www/firewall_aliases_edit.php:465
+#: usr/local/www/firewall_aliases_edit.php:616
+#: usr/local/www/services_dhcp.php:1042 usr/local/www/services_dhcpv6.php:759
+#: usr/local/www/services_dhcp.php:1055 usr/local/www/services_dhcpv6.php:776
+#: usr/local/www/services_dhcp.php:1075
+#: usr/local/www/firewall_aliases_edit.php:487
+#: usr/local/www/firewall_aliases_edit.php:647
+#: usr/local/www/services_dhcp.php:1087
+#: usr/local/www/firewall_aliases_edit.php:486
+#: usr/local/www/firewall_aliases_edit.php:646
+msgid "URL"
+msgstr "URL"
+
+#: usr/local/www/firewall_aliases_edit.php:461
+#: usr/local/www/firewall_aliases_edit.php:609
+#: usr/local/www/firewall_aliases_edit.php:464
+#: usr/local/www/firewall_aliases_edit.php:614
+#: usr/local/www/firewall_aliases_edit.php:466
+#: usr/local/www/firewall_aliases_edit.php:617
+#: usr/local/www/firewall_aliases_edit.php:488
+#: usr/local/www/firewall_aliases_edit.php:648
+#: usr/local/www/firewall_aliases_edit.php:487
+#: usr/local/www/firewall_aliases_edit.php:647
+msgid "URL Table"
+msgstr "Tabela URL"
+
+#: usr/local/www/firewall_aliases_edit.php:462
+#: usr/local/www/firewall_aliases_edit.php:465
+#: usr/local/www/firewall_aliases_edit.php:467
+#: usr/local/www/firewall_aliases_edit.php:489
+#: usr/local/www/firewall_aliases_edit.php:488
+msgid "Update Freq."
+msgstr "Atualizar Freq."
+
+#: usr/local/www/firewall_aliases_edit.php:464
+#: usr/local/www/firewall_aliases_edit.php:467
+#: usr/local/www/firewall_aliases_edit.php:469
+#: usr/local/www/firewall_aliases_edit.php:491
+#: usr/local/www/firewall_aliases_edit.php:490
+msgid "Networks are specified in CIDR format. Select the CIDR mask that pertains to each entry. /32 specifies a single IPv4 host, /128 specifies a single IPv6 host, /24 specifies 255.255.255.0, /64 specifies a normal IPv6 network, etc. Hostnames (FQDNs) may also be specified, using a /32 mask for IPv4 or /128 for IPv6. You may also enter an IP range such as 192.168.1.1-192.168.1.254 and a list of CIDR networks will be derived to fill the range."
+msgstr "Redes são especificadas no formato CIDR. Selecione a máscara CIDR que pertence a cada entrada. /32 especifica um único host IPv4, /128 especifica um único host IPv6, /24 especifica 255.255.255.0, /64 especifica uma rede IPv6 normal, etc. Hostnames (FQDNs) também podem ser especificados, usando uma máscara /32 para IPv4 e /128 para IPv6. Você também pode inserir um intervalo de IPs como 192.168.1.1-192.168.1.254 e uma lista de redes CIDR será liberada para preencher o intervalo."
+
+#: usr/local/www/firewall_aliases_edit.php:465
+msgid "Enter as many hosts as you would like. Hosts must be specified by their IP address."
+msgstr "Insira quantos hosts você desejar. Hosts precisam ser especificados pelo seu endereço IP."
+
+#: usr/local/www/firewall_aliases_edit.php:466
+#: usr/local/www/firewall_aliases_edit.php:469
+#: usr/local/www/firewall_aliases_edit.php:471
+#: usr/local/www/firewall_aliases_edit.php:493
+msgid "Enter as many ports as you wish. Port ranges can be expressed by seperating with a colon."
+msgstr "Insira quantas portas você desejar. Intervalos de portas podem ser especificados utilizando dois pontos."
+
+#: usr/local/www/firewall_aliases_edit.php:467
+#: usr/local/www/firewall_aliases_edit.php:470
+#: usr/local/www/firewall_aliases_edit.php:472
+#: usr/local/www/firewall_aliases_edit.php:494
+#: usr/local/www/firewall_aliases_edit.php:493
+#, php-format
+msgid "Enter as many URLs as you wish. After saving %s will download the URL and import the items into the alias. Use only with small sets of IP addresses (less than 3000)."
+msgstr "Insira quantas URLs desejar. Depois de salvar %s irá fazer o download da URL e importar os itens para o alias. Use apenas com pequenos conjuntos do IPs (menos de 3000)."
+
+#: usr/local/www/firewall_aliases_edit.php:468
+#: usr/local/www/firewall_aliases_edit.php:471
+#: usr/local/www/firewall_aliases_edit.php:473
+#: usr/local/www/firewall_aliases_edit.php:495
+#: usr/local/www/firewall_aliases_edit.php:494
+#, php-format
+msgid "Enter a single URL containing a large number of IPs and/or Subnets. After saving %s will download the URL and create a table file containing these addresses. This will work with large numbers of addresses (30,000+) or small numbers."
+msgstr "Insira uma única URL contendo um grande número de IPs e/ou subredes. Depois de salvar %s vai baixar a URL e criar uma tabela de arquivos contendo estes endereços. Isto irá trabalhar com grandes números de endereços (30.000+) ou pequenos números."
+
+#: usr/local/www/firewall_aliases_edit.php:471
+#: usr/local/www/firewall_aliases_edit.php:607
+#: usr/local/www/firewall_aliases_edit.php:474
+#: usr/local/www/firewall_aliases_edit.php:612
+#: usr/local/www/firewall_aliases_edit.php:476
+#: usr/local/www/firewall_aliases_edit.php:615
+#: usr/local/www/firewall_aliases_edit.php:498
+#: usr/local/www/firewall_aliases_edit.php:646
+#: usr/local/www/firewall_aliases_edit.php:497
+#: usr/local/www/firewall_aliases_edit.php:645
+msgid "OpenVPN Users"
+msgstr "Usuários OpenVPN"
+
+#: usr/local/www/firewall_aliases_edit.php:472
+#: usr/local/www/firewall_aliases_edit.php:475
+#: usr/local/www/firewall_aliases_edit.php:477
+#: usr/local/www/firewall_aliases_edit.php:499
+#: usr/local/www/firewall_aliases_edit.php:498
+msgid "Enter as many usernames as you wish."
+msgstr "Insira quantos usuários você desejar."
+
+#: usr/local/www/firewall_aliases_edit.php:573
+#: usr/local/www/firewall_aliases_edit.php:578
+#: usr/local/www/firewall_aliases_edit.php:581
+#: usr/local/www/firewall_aliases_edit.php:612
+#: usr/local/www/firewall_aliases_edit.php:611
+msgid "Alias Edit"
+msgstr "Editar Alias"
+
+#: usr/local/www/firewall_aliases_edit.php:620
+#: usr/local/www/firewall_aliases_edit.php:625
+#: usr/local/www/firewall_aliases_edit.php:628
+#: usr/local/www/firewall_aliases_edit.php:659
+#: usr/local/www/firewall_aliases_edit.php:658
+msgid "Item information"
+msgstr "Informações do Item"
+
+#: usr/local/www/firewall_aliases_edit.php:665
+#: usr/local/www/services_dnsmasq_edit.php:260
+#: usr/local/www/system_certmanager.php:782
+#: usr/local/www/firewall_aliases_edit.php:670
+#: usr/local/www/services_dnsmasq_edit.php:261
+#: usr/local/www/services_router_advertisements.php:343
+#: usr/local/www/firewall_aliases_edit.php:673
+#: usr/local/www/system_certmanager.php:807
+#: usr/local/www/services_router_advertisements.php:338
+#: usr/local/www/system_certmanager.php:808
+#: usr/local/www/firewall_aliases_edit.php:704
+#: usr/local/www/firewall_aliases_edit.php:703
+msgid "remove this entry"
+msgstr "remova essa entrada"
+
+#: usr/local/www/firewall_nat_1to1.php:78
+#: usr/local/www/firewall_nat_1to1_edit.php:216
+#: usr/local/www/firewall_nat_edit.php:438
+#: usr/local/www/firewall_nat_out.php:283
+#: usr/local/www/firewall_nat_out_edit.php:300
+#: usr/local/www/diag_backup.php:111 usr/local/www/firewall_virtual_ip.php:242
+#: usr/local/www/firewall_nat.php:160 usr/local/www/fbegin.inc:111
+#: usr/local/www/firewall_nat_npt.php:78
+#: usr/local/www/firewall_nat_npt_edit.php:140 usr/local/www/fbegin.inc:128
+#: usr/local/www/firewall_nat_out.php:293
+#: usr/local/www/firewall_nat_1to1_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:145
+#: usr/local/www/firewall_nat_out_edit.php:313
+#: usr/local/www/diag_backup.php:188 usr/local/www/firewall_nat_edit.php:445
+#: usr/local/www/fbegin.inc:137 usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+#: usr/local/www/firewall_nat_npt_edit.php:144
+#: usr/local/www/firewall_nat.php:165 usr/local/www/firewall_nat_edit.php:444
+#: usr/local/www/firewall_virtual_ip.php:248
+#: usr/local/www/firewall_virtual_ip.php:268
+#: usr/local/www/firewall_nat_edit.php:439 usr/local/www/fbegin.inc:129
+#: usr/local/www/firewall_nat_out_edit.php:317
+#: usr/local/www/firewall_nat_edit.php:451
+#: usr/local/www/firewall_nat_out.php:301
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/firewall_virtual_ip.php:291
+#: usr/local/www/firewall_nat_edit.php:452 usr/local/www/firewall_nat.php:166
+#: usr/local/www/firewall_virtual_ip.php:299 usr/local/www/diag_backup.php:189
+msgid "NAT"
+msgstr "NAT"
+
+#: usr/local/www/firewall_nat_1to1.php:78
+#: usr/local/www/firewall_nat_1to1.php:93
+#: usr/local/www/firewall_nat_1to1_edit.php:216
+#: usr/local/www/firewall_nat_out.php:300 usr/local/www/firewall_nat.php:182
+#: usr/local/www/firewall_nat_npt.php:93
+#: usr/local/www/firewall_nat_out.php:310
+#: usr/local/www/firewall_nat_1to1_edit.php:223
+#: usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/firewall_nat_1to1_edit.php:221
+#: usr/local/www/firewall_nat.php:187 usr/local/www/firewall_nat_out.php:318
+#: usr/local/www/firewall_nat.php:190 usr/local/www/firewall_nat_out.php:317
+msgid "1:1"
+msgstr "1:1"
+
+#: usr/local/www/firewall_nat_1to1.php:87 usr/local/www/firewall_nat.php:175
+#: usr/local/www/firewall_nat_npt.php:87 usr/local/www/firewall_nat.php:180
+#: usr/local/www/firewall_nat.php:183
+msgid "The NAT configuration has been changed"
+msgstr "A configuração NAT foi modificada"
+
+#: usr/local/www/firewall_nat_1to1.php:92
+#: usr/local/www/firewall_nat_edit.php:438
+#: usr/local/www/firewall_nat_out.php:299 usr/local/www/firewall_nat.php:160
+#: usr/local/www/firewall_nat.php:181 usr/local/www/firewall_nat_npt.php:92
+#: usr/local/www/firewall_nat_out.php:309
+#: usr/local/www/firewall_nat_edit.php:445
+#: usr/local/www/firewall_nat_out.php:310 usr/local/www/firewall_nat.php:165
+#: usr/local/www/firewall_nat.php:186 usr/local/www/firewall_nat_edit.php:444
+#: usr/local/www/firewall_nat_edit.php:439
+#: usr/local/www/firewall_nat_edit.php:451
+#: usr/local/www/firewall_nat_out.php:317
+#: usr/local/www/firewall_nat_edit.php:452 usr/local/www/firewall_nat.php:166
+#: usr/local/www/firewall_nat.php:189 usr/local/www/firewall_nat_out.php:316
+msgid "Port Forward"
+msgstr "Encaminhamento de Portas"
+
+#: usr/local/www/firewall_nat_1to1.php:94
+#: usr/local/www/firewall_nat_out.php:283
+#: usr/local/www/firewall_nat_out.php:301
+#: usr/local/www/firewall_nat_out_edit.php:300
+#: usr/local/www/firewall_nat.php:183 usr/local/www/firewall_nat_npt.php:94
+#: usr/local/www/firewall_nat_out.php:293
+#: usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/firewall_nat_out_edit.php:313
+#: usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_nat_out.php:312 usr/local/www/firewall_nat.php:188
+#: usr/local/www/firewall_nat_out_edit.php:317
+#: usr/local/www/firewall_nat_out.php:319
+#: usr/local/www/firewall_nat_out_edit.php:329
+#: usr/local/www/firewall_nat.php:191 usr/local/www/firewall_nat_out.php:318
+msgid "Outbound"
+msgstr "Saída"
+
+#: usr/local/www/firewall_nat_1to1.php:95
+#: usr/local/www/firewall_nat_out.php:302 usr/local/www/firewall_nat.php:184
+#: usr/local/www/firewall_nat_npt.php:78 usr/local/www/firewall_nat_npt.php:95
+#: usr/local/www/firewall_nat_npt_edit.php:140
+#: usr/local/www/firewall_nat_out.php:312
+#: usr/local/www/firewall_nat_npt_edit.php:145
+#: usr/local/www/firewall_nat_out.php:313
+#: usr/local/www/firewall_nat_npt_edit.php:144
+#: usr/local/www/firewall_nat.php:189 usr/local/www/firewall_nat_out.php:320
+#: usr/local/www/firewall_nat.php:192 usr/local/www/firewall_nat_out.php:319
+msgid "NPt"
+msgstr "NPt"
+
+#: usr/local/www/firewall_nat_1to1.php:105
+msgid "External IP"
+msgstr "IP externo"
+
+#: usr/local/www/firewall_nat_1to1.php:106
+#: usr/local/www/firewall_nat_1to1_edit.php:328
+#: usr/local/www/status_upnp.php:87
+#: usr/local/www/firewall_nat_1to1_edit.php:335
+#: usr/local/www/firewall_nat_1to1_edit.php:333
+#: usr/local/www/status_upnp.php:88
+#: usr/local/www/firewall_nat_1to1_edit.php:334
+msgid "Internal IP"
+msgstr "IP interno"
+
+#: usr/local/www/firewall_nat_1to1.php:107
+msgid "Destination IP"
+msgstr "IP de Destino"
+
+#: usr/local/www/firewall_nat_1to1.php:113
+#: usr/local/www/firewall_nat_1to1.php:172
+#: usr/local/www/firewall_nat_npt.php:112
+#: usr/local/www/firewall_nat_npt.php:170
+msgid "add rule"
+msgstr "adicionar regra"
+
+#: usr/local/www/firewall_nat_1to1.php:159
+#: usr/local/www/firewall_rules.php:436 usr/local/www/firewall_rules.php:465
+#: usr/local/www/firewall_rules.php:493 usr/local/www/firewall_rules.php:776
+#: usr/local/www/firewall_nat.php:310 usr/local/www/firewall_nat_npt.php:157
+#: usr/local/www/firewall_rules.php:430 usr/local/www/firewall_rules.php:459
+#: usr/local/www/firewall_rules.php:487 usr/local/www/firewall_rules.php:773
+#: usr/local/www/firewall_nat.php:323 usr/local/www/firewall_rules.php:423
+#: usr/local/www/firewall_rules.php:452 usr/local/www/firewall_rules.php:480
+#: usr/local/www/firewall_rules.php:766 usr/local/www/firewall_rules.php:422
+#: usr/local/www/firewall_rules.php:451 usr/local/www/firewall_rules.php:479
+#: usr/local/www/firewall_nat.php:326
+msgid "edit rule"
+msgstr "editar regra"
+
+#: usr/local/www/firewall_nat_1to1.php:160 usr/local/www/services_dhcp.php:923
+#: usr/local/www/firewall_nat_npt.php:158
+#: usr/local/www/services_dhcpv6.php:836 usr/local/www/services_dhcp.php:961
+#: usr/local/www/services_dhcpv6.php:931 usr/local/www/services_dhcp.php:1165
+#: usr/local/www/services_dhcpv6.php:862 usr/local/www/services_dhcp.php:1189
+#: usr/local/www/services_dhcpv6.php:883 usr/local/www/services_dhcp.php:1209
+#: usr/local/www/services_dhcp.php:1221
+msgid "Do you really want to delete this mapping?"
+msgstr "Você realmente deseja remover este mapeamento?"
+
+#: usr/local/www/firewall_nat_1to1.php:160
+#: usr/local/www/firewall_rules.php:779 usr/local/www/firewall_nat.php:313
+#: usr/local/www/firewall_nat_npt.php:158
+#: usr/local/www/firewall_nat_out.php:450 usr/local/www/firewall_rules.php:776
+#: usr/local/www/firewall_nat_out.php:451 usr/local/www/firewall_nat.php:326
+#: usr/local/www/firewall_rules.php:769 usr/local/www/firewall_nat_out.php:448
+#: usr/local/www/firewall_nat_out.php:455 usr/local/www/firewall_nat.php:329
+#: usr/local/www/firewall_nat_out.php:454
+msgid "delete rule"
+msgstr "excluir regra"
+
+#: usr/local/www/firewall_nat_1to1.php:180
+msgid "Depending on the way your WAN connection is setup, you may also need a"
+msgstr "Dependendo da forma como sua conexão WAN foi configurada, você pode precisar de um"
+
+#: usr/local/www/firewall_nat_1to1.php:180
+msgid "Virtual IP."
+msgstr "IP virtual."
+
+#: usr/local/www/firewall_nat_1to1.php:181
+msgid "If you add a 1:1 NAT entry for any of the interface IPs on this system, it will make this system inaccessible on that IP address. i.e. if you use your WAN IP address, any services on this system (IPsec, OpenVPN server, etc.) using the WAN IP address will no longer function."
+msgstr "Se você adicionar uma entrada NAT 1:1 para qualquer uma das interfaces IP no sistema, isto irá tornar o sistema inacessível naquele endereço IP. Ex.: se você usar seu endereço IP WAN, qualquer serviço neste sistema (IPsec, servidor OpenVPN, etc) utilizando o endereço IP WAN deixará de funcionar."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:109
+#: usr/local/www/firewall_nat_out_edit.php:125
+#: usr/local/www/firewall_nat_out_edit.php:129
+#: usr/local/www/firewall_nat_out_edit.php:135
+#, php-format
+msgid "Invalid characters detected (%s). Please remove invalid characters and save again."
+msgstr "Caracteres inválidos detectados (%s). Por favor, remova os caracteres inválidos e salve novamente."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:114
+msgid "External subnet"
+msgstr "Sub-rede externa"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:117
+#: usr/local/www/firewall_nat_edit.php:190
+#: usr/local/www/firewall_nat_edit.php:195
+#: usr/local/www/firewall_nat_edit.php:200
+msgid "Source address"
+msgstr "Endereço de origem"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:121
+#: usr/local/www/firewall_nat_edit.php:194
+#: usr/local/www/firewall_nat_edit.php:199
+#: usr/local/www/firewall_nat_edit.php:204
+msgid "Destination address"
+msgstr "Endereço de destino"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:145
+#: usr/local/www/firewall_nat_1to1_edit.php:152
+msgid "A valid external subnet must be specified."
+msgstr "Uma sub-rede externa válida deve ser especificada."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:149
+#: usr/local/www/firewall_nat_edit.php:232
+#: usr/local/www/firewall_rules_edit.php:356
+#: usr/local/www/firewall_rules_edit.php:360
+#: usr/local/www/firewall_nat_1to1_edit.php:156
+#: usr/local/www/firewall_rules_edit.php:385
+#: usr/local/www/firewall_rules_edit.php:389
+#: usr/local/www/firewall_nat_edit.php:239
+#: usr/local/www/firewall_rules_edit.php:384
+#: usr/local/www/firewall_rules_edit.php:388
+#: usr/local/www/firewall_rules_edit.php:387
+#: usr/local/www/firewall_rules_edit.php:391
+#: usr/local/www/firewall_nat_edit.php:244
+#: usr/local/www/firewall_rules_edit.php:393
+#: usr/local/www/firewall_rules_edit.php:397
+#: usr/local/www/firewall_nat_edit.php:249
+msgid "You must specify single host or alias for alias entries."
+msgstr "Você deve especificar um único host ou alias para entradas de alias."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:154
+#: usr/local/www/firewall_nat_1to1_edit.php:161
+#, php-format
+msgid "%s is not a valid internal IP address."
+msgstr "%s não é um endereço IP válido."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:157
+#: usr/local/www/firewall_nat_1to1_edit.php:164
+msgid "A valid internal bit count must be specified."
+msgstr "Uma sub-rede interna válida deve ser especificada."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:164
+#: usr/local/www/firewall_nat_edit.php:245
+#: usr/local/www/firewall_rules_edit.php:373
+#: usr/local/www/firewall_nat_1to1_edit.php:171
+#: usr/local/www/firewall_rules_edit.php:402
+#: usr/local/www/firewall_nat_edit.php:252
+#: usr/local/www/firewall_rules_edit.php:401
+#: usr/local/www/firewall_rules_edit.php:404
+#: usr/local/www/firewall_nat_edit.php:257
+#: usr/local/www/firewall_rules_edit.php:410
+#: usr/local/www/firewall_nat_edit.php:262
+#, php-format
+msgid "%s is not a valid destination IP address or alias."
+msgstr "%s não é um endereço IP de destino válido."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:167
+#: usr/local/www/firewall_nat_edit.php:248
+#: usr/local/www/firewall_nat_out_edit.php:159
+#: usr/local/www/firewall_rules_edit.php:376
+#: usr/local/www/firewall_nat_1to1_edit.php:174
+#: usr/local/www/firewall_nat_out_edit.php:172
+#: usr/local/www/firewall_rules_edit.php:405
+#: usr/local/www/firewall_nat_edit.php:255
+#: usr/local/www/firewall_rules_edit.php:404
+#: usr/local/www/firewall_rules_edit.php:407
+#: usr/local/www/firewall_nat_edit.php:260
+#: usr/local/www/firewall_nat_out_edit.php:176
+#: usr/local/www/firewall_rules_edit.php:413
+#: usr/local/www/firewall_nat_edit.php:265
+#: usr/local/www/firewall_nat_out_edit.php:182
+msgid "A valid destination bit count must be specified."
+msgstr "Um bit count de destino válido deve ser especificado."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:270
+#: usr/local/www/firewall_nat_1to1_edit.php:277
+#: usr/local/www/firewall_nat_1to1_edit.php:275
+msgid "Edit NAT 1:1 entry"
+msgstr "Editar entrada NAT 1:1"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:273
+#: usr/local/www/firewall_nat_edit.php:460
+#: usr/local/www/firewall_rules_edit.php:679 usr/local/www/interfaces.php:1828
+#: usr/local/www/interfaces_ppps_edit.php:603
+#: usr/local/www/system_usermanager.php:469
+#: usr/local/www/system_usermanager.php:789
+#: usr/local/www/vpn_ipsec_phase1.php:512
+#: usr/local/www/vpn_ipsec_phase2.php:393
+#: usr/local/www/vpn_openvpn_client.php:386
+#: usr/local/www/vpn_openvpn_client.php:860
+#: usr/local/www/vpn_openvpn_csc.php:314 usr/local/www/vpn_openvpn_csc.php:672
+#: usr/local/www/vpn_openvpn_server.php:604
+#: usr/local/www/vpn_openvpn_server.php:1448
+#: usr/local/www/firewall_nat_npt_edit.php:159
+#: usr/local/www/system_routes_edit.php:299
+#: usr/local/www/firewall_nat_1to1_edit.php:280
+#: usr/local/www/firewall_nat_npt_edit.php:164
+#: usr/local/www/firewall_rules_edit.php:712
+#: usr/local/www/system_usermanager.php:467
+#: usr/local/www/system_usermanager.php:787
+#: usr/local/www/vpn_openvpn_server.php:677
+#: usr/local/www/vpn_openvpn_server.php:1590
+#: usr/local/www/vpn_ipsec_phase2.php:419
+#: usr/local/www/firewall_nat_edit.php:467 usr/local/www/interfaces.php:2006
+#: usr/local/www/vpn_openvpn_client.php:391
+#: usr/local/www/vpn_openvpn_client.php:865
+#: usr/local/www/system_routes_edit.php:300
+#: usr/local/www/firewall_nat_1to1_edit.php:278
+#: usr/local/www/firewall_nat_npt_edit.php:163
+#: usr/local/www/system_usermanager.php:788
+#: usr/local/www/interfaces_ppps_edit.php:604
+#: usr/local/www/vpn_openvpn_csc.php:313 usr/local/www/vpn_openvpn_csc.php:671
+#: usr/local/www/vpn_openvpn_server.php:695
+#: usr/local/www/vpn_openvpn_server.php:1631
+#: usr/local/www/vpn_ipsec_phase2.php:485
+#: usr/local/www/firewall_nat_edit.php:466 usr/local/www/interfaces.php:1994
+#: usr/local/www/vpn_openvpn_client.php:399
+#: usr/local/www/vpn_openvpn_client.php:918
+#: usr/local/www/vpn_ipsec_phase1.php:511
+#: usr/local/www/vpn_openvpn_client.php:417
+#: usr/local/www/vpn_openvpn_client.php:937
+#: usr/local/www/firewall_rules_edit.php:715
+#: usr/local/www/interfaces_ppps_edit.php:610
+#: usr/local/www/firewall_nat_edit.php:461
+#: usr/local/www/vpn_ipsec_phase1.php:532
+#: usr/local/www/vpn_openvpn_server.php:721
+#: usr/local/www/vpn_openvpn_server.php:1683
+#: usr/local/www/vpn_ipsec_phase2.php:507 usr/local/www/interfaces.php:2021
+#: usr/local/www/firewall_rules_edit.php:727
+#: usr/local/www/firewall_nat_edit.php:473
+#: usr/local/www/system_routes_edit.php:323 usr/local/www/interfaces.php:2067
+#: etc/inc/service-utils.inc:437 usr/local/www/interfaces_ppps_edit.php:608
+#: usr/local/www/firewall_nat_edit.php:474
+#: usr/local/www/system_routes_edit.php:332
+#: usr/local/www/firewall_nat_npt_edit.php:161
+#: usr/local/www/interfaces.php:2056 etc/inc/service-utils.inc:440
+#: usr/local/www/system_routes_edit.php:334
+#: usr/local/www/firewall_rules_edit.php:775 usr/local/www/interfaces.php:2092
+#: etc/inc/service-utils.inc:445
+msgid "Disabled"
+msgstr "Desabilitado"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:276
+#: usr/local/www/firewall_nat_edit.php:463
+#: usr/local/www/firewall_rules_edit.php:682
+#: usr/local/www/firewall_nat_npt_edit.php:162
+#: usr/local/www/firewall_nat_1to1_edit.php:283
+#: usr/local/www/firewall_nat_npt_edit.php:167
+#: usr/local/www/firewall_rules_edit.php:715
+#: usr/local/www/firewall_nat_edit.php:470
+#: usr/local/www/firewall_nat_1to1_edit.php:281
+#: usr/local/www/firewall_nat_npt_edit.php:166
+#: usr/local/www/firewall_nat_edit.php:469
+#: usr/local/www/firewall_rules_edit.php:718
+#: usr/local/www/firewall_nat_edit.php:464
+#: usr/local/www/firewall_rules_edit.php:730
+#: usr/local/www/firewall_nat_edit.php:476
+#: usr/local/www/firewall_nat_edit.php:477
+#: usr/local/www/firewall_nat_npt_edit.php:164
+#: usr/local/www/firewall_rules_edit.php:778
+msgid "Disable this rule"
+msgstr "Desabilita essa regra"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:277
+#: usr/local/www/firewall_nat_edit.php:464
+#: usr/local/www/firewall_rules_edit.php:683
+#: usr/local/www/firewall_nat_npt_edit.php:163
+#: usr/local/www/firewall_nat_1to1_edit.php:284
+#: usr/local/www/firewall_nat_npt_edit.php:168
+#: usr/local/www/firewall_rules_edit.php:716
+#: usr/local/www/firewall_nat_edit.php:471
+#: usr/local/www/firewall_nat_1to1_edit.php:282
+#: usr/local/www/firewall_nat_npt_edit.php:167
+#: usr/local/www/firewall_nat_edit.php:470
+#: usr/local/www/firewall_rules_edit.php:719
+#: usr/local/www/firewall_nat_edit.php:465
+#: usr/local/www/firewall_rules_edit.php:731
+#: usr/local/www/firewall_nat_edit.php:477
+#: usr/local/www/firewall_nat_edit.php:478
+#: usr/local/www/firewall_nat_npt_edit.php:165
+#: usr/local/www/firewall_rules_edit.php:779
+msgid "Set this option to disable this rule without removing it from the list."
+msgstr "Defina esta opção para desativar esta regra sem removê-la da lista."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:315
+#: usr/local/www/firewall_nat_npt_edit.php:202
+#: usr/local/www/firewall_nat_1to1_edit.php:322
+#: usr/local/www/firewall_nat_npt_edit.php:207
+#: usr/local/www/firewall_nat_1to1_edit.php:320
+#: usr/local/www/firewall_nat_npt_edit.php:206
+#: usr/local/www/firewall_nat_npt_edit.php:205
+#: usr/local/www/firewall_nat_1to1_edit.php:321
+msgid "Choose which interface this rule applies to"
+msgstr "Escolha a qual interface esta regra se aplica"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:316
+#: usr/local/www/firewall_nat_npt_edit.php:203
+#: usr/local/www/firewall_nat_1to1_edit.php:323
+#: usr/local/www/firewall_nat_npt_edit.php:208
+#: usr/local/www/firewall_nat_1to1_edit.php:321
+#: usr/local/www/firewall_nat_npt_edit.php:207
+#: usr/local/www/firewall_nat_npt_edit.php:206
+#: usr/local/www/firewall_nat_1to1_edit.php:322
+msgid "Hint: in most cases, you'll want to use WAN here"
+msgstr "Sugestão: na maioria dos casos, você vai querer utilizar WAN aqui"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:319
+#: usr/local/www/firewall_nat_1to1_edit.php:326
+#: usr/local/www/firewall_nat_1to1_edit.php:324
+#: usr/local/www/firewall_nat_1to1_edit.php:325
+msgid "External subnet IP"
+msgstr "IP de subrede externa"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:323
+#: usr/local/www/firewall_nat_1to1_edit.php:330
+#: usr/local/www/firewall_nat_1to1_edit.php:328
+#: usr/local/www/firewall_nat_1to1_edit.php:329
+msgid "Enter the external (usually on a WAN) subnet's starting address for the 1:1 mapping. The subnet mask from the internal address below will be applied to this IP address."
+msgstr "Informe um endereço de início da subrede externa (normalmente em uma WAN) para o mapeamento 1:1. A máscara de subnet do endereço fonte abaixo será aplicada para esse endereço IP."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:324
+#: usr/local/www/firewall_nat_1to1_edit.php:331
+#: usr/local/www/firewall_nat_1to1_edit.php:329
+#: usr/local/www/firewall_nat_1to1_edit.php:330
+msgid "Hint: this is generally an address owned by the router itself on the selected interface."
+msgstr "Dica: isso é geralmente um endereço propriedade do roteador na interface selecionada."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:331
+#: usr/local/www/firewall_nat_1to1_edit.php:386
+#: usr/local/www/firewall_nat_edit.php:538
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_out_edit.php:501
+#: usr/local/www/firewall_rules_edit.php:858
+#: usr/local/www/firewall_rules_edit.php:951
+#: usr/local/www/firewall_nat_npt_edit.php:209
+#: usr/local/www/firewall_nat_npt_edit.php:237
+#: usr/local/www/firewall_nat_1to1_edit.php:338
+#: usr/local/www/firewall_nat_1to1_edit.php:393
+#: usr/local/www/firewall_nat_npt_edit.php:214
+#: usr/local/www/firewall_nat_npt_edit.php:242
+#: usr/local/www/firewall_nat_out_edit.php:514
+#: usr/local/www/firewall_rules_edit.php:893
+#: usr/local/www/firewall_rules_edit.php:986
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_1to1_edit.php:336
+#: usr/local/www/firewall_nat_1to1_edit.php:391
+#: usr/local/www/firewall_nat_npt_edit.php:213
+#: usr/local/www/firewall_nat_npt_edit.php:241
+#: usr/local/www/firewall_nat_edit.php:544
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_rules_edit.php:896
+#: usr/local/www/firewall_rules_edit.php:995
+#: usr/local/www/firewall_nat_edit.php:539
+#: usr/local/www/firewall_nat_edit.php:628
+#: usr/local/www/firewall_nat_out_edit.php:518
+#: usr/local/www/firewall_rules_edit.php:908
+#: usr/local/www/firewall_rules_edit.php:1008
+#: usr/local/www/firewall_nat_edit.php:551
+#: usr/local/www/firewall_nat_edit.php:640
+#: usr/local/www/firewall_nat_out_edit.php:530
+#: usr/local/www/firewall_rules_edit.php:907
+#: usr/local/www/firewall_rules_edit.php:1007
+#: usr/local/www/firewall_nat_edit.php:552
+#: usr/local/www/firewall_nat_edit.php:641
+#: usr/local/www/firewall_nat_npt_edit.php:212
+#: usr/local/www/firewall_nat_npt_edit.php:240
+#: usr/local/www/firewall_nat_1to1_edit.php:337
+#: usr/local/www/firewall_nat_1to1_edit.php:392
+#: usr/local/www/firewall_nat_out_edit.php:531
+#: usr/local/www/firewall_rules_edit.php:955
+#: usr/local/www/firewall_rules_edit.php:1055
+msgid "not"
+msgstr "não"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:333
+#: usr/local/www/firewall_nat_1to1_edit.php:388
+#: usr/local/www/firewall_nat_edit.php:540
+#: usr/local/www/firewall_nat_edit.php:629
+#: usr/local/www/firewall_nat_out_edit.php:502
+#: usr/local/www/firewall_rules_edit.php:860
+#: usr/local/www/firewall_rules_edit.php:953
+#: usr/local/www/firewall_nat_npt_edit.php:211
+#: usr/local/www/firewall_nat_npt_edit.php:239
+#: usr/local/www/firewall_nat_1to1_edit.php:340
+#: usr/local/www/firewall_nat_1to1_edit.php:395
+#: usr/local/www/firewall_nat_npt_edit.php:216
+#: usr/local/www/firewall_nat_npt_edit.php:244
+#: usr/local/www/firewall_nat_out_edit.php:515
+#: usr/local/www/firewall_rules_edit.php:895
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_nat_edit.php:547
+#: usr/local/www/firewall_nat_edit.php:636
+#: usr/local/www/firewall_nat_1to1_edit.php:338
+#: usr/local/www/firewall_nat_1to1_edit.php:393
+#: usr/local/www/firewall_nat_npt_edit.php:215
+#: usr/local/www/firewall_nat_npt_edit.php:243
+#: usr/local/www/firewall_nat_edit.php:546
+#: usr/local/www/firewall_nat_edit.php:635
+#: usr/local/www/firewall_rules_edit.php:898
+#: usr/local/www/firewall_rules_edit.php:997
+#: usr/local/www/firewall_nat_edit.php:541
+#: usr/local/www/firewall_nat_edit.php:630
+#: usr/local/www/firewall_nat_out_edit.php:519
+#: usr/local/www/firewall_rules_edit.php:910
+#: usr/local/www/firewall_rules_edit.php:1010
+#: usr/local/www/firewall_nat_edit.php:553
+#: usr/local/www/firewall_nat_edit.php:642
+#: usr/local/www/firewall_nat_out_edit.php:531
+#: usr/local/www/firewall_rules_edit.php:909
+#: usr/local/www/firewall_rules_edit.php:1009
+#: usr/local/www/firewall_nat_edit.php:554
+#: usr/local/www/firewall_nat_edit.php:643
+#: usr/local/www/firewall_nat_npt_edit.php:214
+#: usr/local/www/firewall_nat_npt_edit.php:242
+#: usr/local/www/firewall_nat_1to1_edit.php:339
+#: usr/local/www/firewall_nat_1to1_edit.php:394
+#: usr/local/www/firewall_nat_out_edit.php:532
+#: usr/local/www/firewall_rules_edit.php:957
+#: usr/local/www/firewall_rules_edit.php:1057
+msgid "Use this option to invert the sense of the match."
+msgstr "Use essa opção para inverter o sentido da correspondência."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:343
+#: usr/local/www/firewall_nat_1to1_edit.php:398
+#: usr/local/www/firewall_nat_edit.php:550
+#: usr/local/www/firewall_nat_edit.php:597
+#: usr/local/www/firewall_nat_edit.php:610
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_nat_out_edit.php:475
+#: usr/local/www/firewall_nat_out_edit.php:509
+#: usr/local/www/firewall_nat_out_edit.php:569
+#: usr/local/www/firewall_rules.php:128
+#: usr/local/www/firewall_rules_edit.php:827
+#: usr/local/www/firewall_rules_edit.php:870
+#: usr/local/www/firewall_rules_edit.php:921
+#: usr/local/www/firewall_rules_edit.php:934
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:963
+#: usr/local/www/firewall_rules_edit.php:1013
+#: usr/local/www/firewall_rules_edit.php:1026
+#: usr/local/www/firewall_rules_edit.php:1090
+#: usr/local/www/services_captiveportal_ip.php:175
+#: usr/local/www/services_captiveportal_ip.php:182
+#: usr/local/www/services_captiveportal_hostname.php:176
+#: usr/local/www/services_captiveportal_hostname.php:183
+#: usr/local/www/firewall_nat_1to1_edit.php:350
+#: usr/local/www/firewall_nat_1to1_edit.php:405
+#: usr/local/www/firewall_nat_out_edit.php:488
+#: usr/local/www/firewall_nat_out_edit.php:522
+#: usr/local/www/firewall_nat_out_edit.php:582
+#: usr/local/www/firewall_rules_edit.php:862
+#: usr/local/www/firewall_rules_edit.php:905
+#: usr/local/www/firewall_rules_edit.php:956
+#: usr/local/www/firewall_rules_edit.php:969
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:998
+#: usr/local/www/firewall_rules_edit.php:1048
+#: usr/local/www/firewall_rules_edit.php:1061
+#: usr/local/www/firewall_rules_edit.php:1125
+#: usr/local/www/firewall_nat_edit.php:557
+#: usr/local/www/firewall_nat_edit.php:604
+#: usr/local/www/firewall_nat_edit.php:617
+#: usr/local/www/firewall_nat_edit.php:646
+#: usr/local/www/firewall_nat_1to1_edit.php:348
+#: usr/local/www/firewall_nat_1to1_edit.php:403
+#: usr/local/www/services_captiveportal_ip.php:173
+#: usr/local/www/services_captiveportal_ip.php:180
+#: usr/local/www/services_captiveportal_hostname.php:174
+#: usr/local/www/services_captiveportal_hostname.php:181
+#: usr/local/www/firewall_rules.php:126
+#: usr/local/www/firewall_nat_edit.php:556
+#: usr/local/www/firewall_nat_edit.php:603
+#: usr/local/www/firewall_nat_edit.php:616
+#: usr/local/www/firewall_nat_edit.php:645
+#: usr/local/www/firewall_rules_edit.php:865
+#: usr/local/www/firewall_rules_edit.php:908
+#: usr/local/www/firewall_rules_edit.php:965
+#: usr/local/www/firewall_rules_edit.php:978
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1007
+#: usr/local/www/firewall_rules_edit.php:1063
+#: usr/local/www/firewall_rules_edit.php:1076
+#: usr/local/www/firewall_rules_edit.php:1140
+#: usr/local/www/firewall_nat_edit.php:551
+#: usr/local/www/firewall_nat_edit.php:598
+#: usr/local/www/firewall_nat_edit.php:611
+#: usr/local/www/firewall_nat_edit.php:640
+#: usr/local/www/firewall_nat_out_edit.php:492
+#: usr/local/www/firewall_nat_out_edit.php:526
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules_edit.php:920
+#: usr/local/www/firewall_rules_edit.php:991
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1020
+#: usr/local/www/firewall_rules_edit.php:1089
+#: usr/local/www/firewall_rules_edit.php:1153
+#: usr/local/www/firewall_nat_edit.php:563
+#: usr/local/www/firewall_nat_edit.php:623
+#: usr/local/www/firewall_nat_edit.php:652
+#: usr/local/www/firewall_nat_out_edit.php:504
+#: usr/local/www/firewall_nat_out_edit.php:538
+#: usr/local/www/firewall_rules_edit.php:876
+#: usr/local/www/firewall_rules_edit.php:919
+#: usr/local/www/firewall_rules_edit.php:977
+#: usr/local/www/firewall_rules_edit.php:990
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1019
+#: usr/local/www/firewall_rules_edit.php:1075
+#: usr/local/www/firewall_rules_edit.php:1088
+#: usr/local/www/firewall_rules_edit.php:1152
+#: usr/local/www/firewall_nat_edit.php:564
+#: usr/local/www/firewall_nat_edit.php:624
+#: usr/local/www/firewall_nat_edit.php:653
+#: usr/local/www/firewall_nat_1to1_edit.php:349
+#: usr/local/www/firewall_nat_1to1_edit.php:404
+#: usr/local/www/firewall_nat_out_edit.php:539
+#: usr/local/www/firewall_rules_edit.php:924
+#: usr/local/www/firewall_rules_edit.php:967
+#: usr/local/www/firewall_rules_edit.php:1025
+#: usr/local/www/firewall_rules_edit.php:1038
+#: usr/local/www/firewall_rules_edit.php:1067
+#: usr/local/www/firewall_rules_edit.php:1123
+#: usr/local/www/firewall_rules_edit.php:1136
+#: usr/local/www/firewall_rules_edit.php:1200
+msgid "any"
+msgstr "qualquer"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:344
+#: usr/local/www/firewall_nat_1to1_edit.php:351
+#: usr/local/www/firewall_nat_1to1_edit.php:349
+#: usr/local/www/firewall_nat_1to1_edit.php:350
+msgid "Single host"
+msgstr "Host único"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:347
+#: usr/local/www/firewall_nat_1to1_edit.php:402
+#: usr/local/www/firewall_nat_edit.php:554
+#: usr/local/www/firewall_nat_edit.php:643
+#: usr/local/www/firewall_rules_edit.php:874
+#: usr/local/www/firewall_rules_edit.php:967
+#: usr/local/www/firewall_nat_1to1_edit.php:354
+#: usr/local/www/firewall_nat_1to1_edit.php:409
+#: usr/local/www/firewall_rules_edit.php:909
+#: usr/local/www/firewall_rules_edit.php:1002
+#: usr/local/www/firewall_nat_edit.php:561
+#: usr/local/www/firewall_nat_edit.php:650
+#: usr/local/www/firewall_nat_1to1_edit.php:352
+#: usr/local/www/firewall_nat_1to1_edit.php:407
+#: usr/local/www/firewall_nat_edit.php:560
+#: usr/local/www/firewall_nat_edit.php:649
+#: usr/local/www/firewall_rules_edit.php:918
+#: usr/local/www/firewall_rules_edit.php:1017
+#: usr/local/www/firewall_nat_edit.php:555
+#: usr/local/www/firewall_nat_edit.php:644
+#: usr/local/www/firewall_rules_edit.php:930
+#: usr/local/www/firewall_rules_edit.php:1030
+#: usr/local/www/firewall_nat_edit.php:567
+#: usr/local/www/firewall_nat_edit.php:656
+#: usr/local/www/firewall_rules_edit.php:929
+#: usr/local/www/firewall_rules_edit.php:1029
+#: usr/local/www/firewall_nat_edit.php:568
+#: usr/local/www/firewall_nat_edit.php:657
+#: usr/local/www/firewall_nat_1to1_edit.php:353
+#: usr/local/www/firewall_nat_1to1_edit.php:408
+#: usr/local/www/firewall_rules_edit.php:977
+#: usr/local/www/firewall_rules_edit.php:1077
+msgid "PPTP clients"
+msgstr "Cliente PPTP"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:350
+#: usr/local/www/firewall_nat_1to1_edit.php:405
+#: usr/local/www/firewall_nat_edit.php:557
+#: usr/local/www/firewall_nat_edit.php:646
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules_edit.php:970
+#: usr/local/www/firewall_nat_1to1_edit.php:357
+#: usr/local/www/firewall_nat_1to1_edit.php:412
+#: usr/local/www/firewall_rules_edit.php:912
+#: usr/local/www/firewall_rules_edit.php:1005
+#: usr/local/www/firewall_nat_edit.php:564
+#: usr/local/www/firewall_nat_edit.php:653
+#: usr/local/www/firewall_nat_1to1_edit.php:355
+#: usr/local/www/firewall_nat_1to1_edit.php:410
+#: usr/local/www/firewall_nat_edit.php:563
+#: usr/local/www/firewall_nat_edit.php:652
+#: usr/local/www/firewall_rules_edit.php:921
+#: usr/local/www/firewall_rules_edit.php:1020
+#: usr/local/www/firewall_nat_edit.php:558
+#: usr/local/www/firewall_nat_edit.php:647
+#: usr/local/www/firewall_rules_edit.php:933
+#: usr/local/www/firewall_rules_edit.php:1033
+#: usr/local/www/firewall_nat_edit.php:570
+#: usr/local/www/firewall_nat_edit.php:659
+#: usr/local/www/firewall_rules_edit.php:932
+#: usr/local/www/firewall_rules_edit.php:1032
+#: usr/local/www/firewall_nat_edit.php:571
+#: usr/local/www/firewall_nat_edit.php:660
+#: usr/local/www/firewall_nat_1to1_edit.php:356
+#: usr/local/www/firewall_nat_1to1_edit.php:411
+#: usr/local/www/firewall_rules_edit.php:980
+#: usr/local/www/firewall_rules_edit.php:1080
+msgid "PPPoE clients"
+msgstr "Cliente PPPoE"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:353
+#: usr/local/www/firewall_nat_1to1_edit.php:408
+#: usr/local/www/firewall_nat_edit.php:560
+#: usr/local/www/firewall_nat_edit.php:649
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/firewall_rules_edit.php:973
+#: usr/local/www/firewall_nat_1to1_edit.php:360
+#: usr/local/www/firewall_nat_1to1_edit.php:415
+#: usr/local/www/firewall_rules_edit.php:915
+#: usr/local/www/firewall_rules_edit.php:1008
+#: usr/local/www/firewall_nat_edit.php:567
+#: usr/local/www/firewall_nat_edit.php:656
+#: usr/local/www/firewall_nat_1to1_edit.php:358
+#: usr/local/www/firewall_nat_1to1_edit.php:413
+#: usr/local/www/firewall_nat_edit.php:566
+#: usr/local/www/firewall_nat_edit.php:655
+#: usr/local/www/firewall_rules_edit.php:924
+#: usr/local/www/firewall_rules_edit.php:1023
+#: usr/local/www/firewall_nat_edit.php:561
+#: usr/local/www/firewall_nat_edit.php:650
+#: usr/local/www/firewall_rules_edit.php:936
+#: usr/local/www/firewall_rules_edit.php:1036
+#: usr/local/www/firewall_nat_edit.php:573
+#: usr/local/www/firewall_nat_edit.php:662
+#: usr/local/www/firewall_rules_edit.php:935
+#: usr/local/www/firewall_rules_edit.php:1035
+#: usr/local/www/firewall_nat_edit.php:574
+#: usr/local/www/firewall_nat_edit.php:663
+#: usr/local/www/firewall_nat_1to1_edit.php:359
+#: usr/local/www/firewall_nat_1to1_edit.php:414
+#: usr/local/www/firewall_rules_edit.php:983
+#: usr/local/www/firewall_rules_edit.php:1083
+msgid "L2TP clients"
+msgstr "Cliente L2TP"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:358
+#: usr/local/www/firewall_nat_1to1_edit.php:413
+#: usr/local/www/firewall_nat_edit.php:565
+#: usr/local/www/firewall_nat_edit.php:654
+#: usr/local/www/firewall_rules_edit.php:978
+#: usr/local/www/firewall_nat_1to1_edit.php:365
+#: usr/local/www/firewall_nat_1to1_edit.php:420
+#: usr/local/www/firewall_rules_edit.php:1013
+#: usr/local/www/firewall_nat_edit.php:572
+#: usr/local/www/firewall_nat_edit.php:661
+#: usr/local/www/firewall_nat_1to1_edit.php:363
+#: usr/local/www/firewall_nat_1to1_edit.php:418
+#: usr/local/www/firewall_nat_edit.php:571
+#: usr/local/www/firewall_nat_edit.php:660
+#: usr/local/www/firewall_rules_edit.php:1028
+#: usr/local/www/firewall_nat_edit.php:566
+#: usr/local/www/firewall_nat_edit.php:655
+#: usr/local/www/firewall_rules_edit.php:1041
+#: usr/local/www/firewall_nat_edit.php:578
+#: usr/local/www/firewall_nat_edit.php:667
+#: usr/local/www/firewall_rules_edit.php:1040
+#: usr/local/www/firewall_nat_edit.php:579
+#: usr/local/www/firewall_nat_edit.php:668
+#: usr/local/www/firewall_nat_1to1_edit.php:364
+#: usr/local/www/firewall_nat_1to1_edit.php:419
+#: usr/local/www/firewall_rules_edit.php:1088
+msgid "subnet"
+msgstr "sub-rede"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:360
+#: usr/local/www/firewall_nat_1to1_edit.php:415
+#: usr/local/www/firewall_nat_edit.php:567
+#: usr/local/www/firewall_nat_edit.php:656
+#: usr/local/www/firewall_rules_edit.php:887
+#: usr/local/www/firewall_rules_edit.php:980
+#: usr/local/www/firewall_nat_1to1_edit.php:367
+#: usr/local/www/firewall_nat_1to1_edit.php:422
+#: usr/local/www/firewall_rules_edit.php:922
+#: usr/local/www/firewall_rules_edit.php:1015
+#: usr/local/www/firewall_nat_edit.php:574
+#: usr/local/www/firewall_nat_edit.php:663
+#: usr/local/www/firewall_nat_1to1_edit.php:365
+#: usr/local/www/firewall_nat_1to1_edit.php:420
+#: usr/local/www/firewall_nat_edit.php:573
+#: usr/local/www/firewall_nat_edit.php:662
+#: usr/local/www/firewall_rules_edit.php:931
+#: usr/local/www/firewall_rules_edit.php:1030
+#: usr/local/www/firewall_nat_edit.php:568
+#: usr/local/www/firewall_nat_edit.php:657
+#: usr/local/www/firewall_rules_edit.php:943
+#: usr/local/www/firewall_rules_edit.php:1043
+#: usr/local/www/firewall_nat_edit.php:580
+#: usr/local/www/firewall_nat_edit.php:669
+#: usr/local/www/firewall_rules_edit.php:942
+#: usr/local/www/firewall_rules_edit.php:1042
+#: usr/local/www/firewall_nat_edit.php:581
+#: usr/local/www/firewall_nat_edit.php:670
+#: usr/local/www/firewall_nat_1to1_edit.php:366
+#: usr/local/www/firewall_nat_1to1_edit.php:421
+#: usr/local/www/firewall_rules_edit.php:990
+#: usr/local/www/firewall_rules_edit.php:1090
+msgid "address"
+msgstr "endereço"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:379
+#: usr/local/www/firewall_nat_1to1_edit.php:386
+#: usr/local/www/firewall_nat_1to1_edit.php:384
+#: usr/local/www/firewall_nat_1to1_edit.php:385
+msgid "Enter the internal (LAN) subnet for the 1:1 mapping. The subnet size specified for the internal subnet will be applied to the external subnet."
+msgstr "Insira a subrede (LAN) interna para o mapeamento 1:1. O tamanho da subrede especificado para a subrede externa também se aplica para a subrede interna."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:399
+#: usr/local/www/firewall_nat_edit.php:551
+#: usr/local/www/firewall_nat_edit.php:640
+#: usr/local/www/firewall_rules_edit.php:871
+#: usr/local/www/firewall_rules_edit.php:964
+#: usr/local/www/firewall_nat_1to1_edit.php:406
+#: usr/local/www/firewall_rules_edit.php:906
+#: usr/local/www/firewall_rules_edit.php:999
+#: usr/local/www/firewall_nat_edit.php:558
+#: usr/local/www/firewall_nat_edit.php:647
+#: usr/local/www/firewall_nat_1to1_edit.php:404
+#: usr/local/www/firewall_nat_edit.php:557
+#: usr/local/www/firewall_nat_edit.php:646
+#: usr/local/www/firewall_rules_edit.php:915
+#: usr/local/www/firewall_rules_edit.php:1014
+#: usr/local/www/firewall_nat_edit.php:552
+#: usr/local/www/firewall_nat_edit.php:641
+#: usr/local/www/firewall_rules_edit.php:927
+#: usr/local/www/firewall_rules_edit.php:1027
+#: usr/local/www/firewall_nat_edit.php:564
+#: usr/local/www/firewall_nat_edit.php:653
+#: usr/local/www/firewall_rules_edit.php:926
+#: usr/local/www/firewall_rules_edit.php:1026
+#: usr/local/www/firewall_nat_edit.php:565
+#: usr/local/www/firewall_nat_edit.php:654
+#: usr/local/www/firewall_nat_1to1_edit.php:405
+#: usr/local/www/firewall_rules_edit.php:974
+#: usr/local/www/firewall_rules_edit.php:1074
+msgid "Single host or alias"
+msgstr "Host único ou alias"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:436
+#: usr/local/www/firewall_nat_1to1_edit.php:443
+#: usr/local/www/firewall_nat_1to1_edit.php:441
+#: usr/local/www/firewall_nat_1to1_edit.php:442
+msgid "The 1:1 mapping will only be used for connections to or from the specified destination."
+msgstr "O mapeamento 1:1 será usado para conexões para ou de um destino específico."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:437
+#: usr/local/www/firewall_nat_1to1_edit.php:444
+#: usr/local/www/firewall_nat_1to1_edit.php:442
+#: usr/local/www/firewall_nat_1to1_edit.php:443
+msgid "Hint: this is usually 'any'."
+msgstr "Dica: isso é normalmente 'qualquer'."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:447
+#: usr/local/www/firewall_nat_edit.php:783
+#: usr/local/www/firewall_nat_1to1_edit.php:454
+#: usr/local/www/firewall_nat_edit.php:790
+#: usr/local/www/firewall_nat_1to1_edit.php:452
+#: usr/local/www/firewall_nat_edit.php:789
+#: usr/local/www/firewall_nat_edit.php:784
+#: usr/local/www/firewall_nat_edit.php:796
+#: usr/local/www/firewall_nat_edit.php:797
+msgid "NAT reflection"
+msgstr "Reflexão NAT"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:450
+#: usr/local/www/firewall_nat_edit.php:786
+#: usr/local/www/firewall_nat_1to1_edit.php:457
+#: usr/local/www/firewall_nat_1to1_edit.php:455
+msgid "use system default"
+msgstr "usar padrão do sistema"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:451
+#: usr/local/www/firewall_nat_edit.php:787
+#: usr/local/www/firewall_nat_1to1_edit.php:458
+#: usr/local/www/firewall_nat_1to1_edit.php:456
+msgid "enable"
+msgstr "habilitar"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:452
+#: usr/local/www/firewall_nat_edit.php:788
+#: usr/local/www/firewall_nat_1to1_edit.php:459
+#: usr/local/www/firewall_nat_1to1_edit.php:457
+msgid "disable"
+msgstr "desabilitar"
+
+#: usr/local/www/firewall_nat_edit.php:109
+#: usr/local/www/firewall_nat_edit.php:114
+#: usr/local/www/firewall_nat_edit.php:119
+#, php-format
+msgid "Invalid characters detected %s. Please remove invalid characters and save again."
+msgstr "Caracteres inválidos detectados %s. Por favor, remova os caracteres inválidos e salve novamente."
+
+#: usr/local/www/firewall_nat_edit.php:182
+#: usr/local/www/firewall_nat_edit.php:187
+#: usr/local/www/firewall_nat_edit.php:192
+msgid "Destination port from"
+msgstr "Porta de destino de"
+
+#: usr/local/www/firewall_nat_edit.php:182
+#: usr/local/www/firewall_nat_edit.php:187
+#: usr/local/www/firewall_nat_edit.php:192
+msgid "Destination port to"
+msgstr "Porta de destino até"
+
+#: usr/local/www/firewall_nat_edit.php:198
+#: usr/local/www/firewall_nat_edit.php:740
+#: usr/local/www/firewall_nat_edit.php:747
+#: usr/local/www/firewall_nat_edit.php:746
+#: usr/local/www/firewall_nat_edit.php:203
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/firewall_nat_edit.php:208
+#: usr/local/www/firewall_nat_edit.php:753
+#: usr/local/www/firewall_nat_edit.php:754
+msgid "Redirect target IP"
+msgstr "Redirecionar IP de destino"
+
+#: usr/local/www/firewall_nat_edit.php:213
+#: usr/local/www/firewall_nat_edit.php:220
+#: usr/local/www/firewall_nat_edit.php:225
+#: usr/local/www/firewall_nat_edit.php:230
+#, php-format
+msgid "\"%s\" is not a valid redirect target IP address or host alias."
+msgstr "\"%s\" não é um endereço IP alvo válido ou um alias de host."
+
+#: usr/local/www/firewall_nat_edit.php:217
+#: usr/local/www/firewall_rules_edit.php:325
+#: usr/local/www/firewall_rules_edit.php:349
+#: usr/local/www/firewall_nat_edit.php:224
+#: usr/local/www/firewall_rules_edit.php:348
+#: usr/local/www/firewall_rules_edit.php:351
+#: usr/local/www/firewall_nat_edit.php:229
+#: usr/local/www/firewall_rules_edit.php:357
+#: usr/local/www/firewall_nat_edit.php:234
+#, php-format
+msgid "%s is not a valid start source port. It must be a port alias or integer between 1 and 65535."
+msgstr "%s não é um inicio de porta de origem válido. Deve ser um alias de porta ou um inteiro entre 1 e 65535."
+
+#: usr/local/www/firewall_nat_edit.php:219
+#: usr/local/www/firewall_nat_edit.php:226
+#: usr/local/www/firewall_nat_edit.php:231
+#: usr/local/www/firewall_nat_edit.php:236
+#, php-format
+msgid "%s is not a valid end source port. It must be a port alias or integer between 1 and 65535."
+msgstr "%s não é um fim de porta de origem válido. Deve ser um alias de porta ou um inteiro entre 1 e 65535."
+
+#: usr/local/www/firewall_nat_edit.php:221
+#: usr/local/www/firewall_rules_edit.php:329
+#: usr/local/www/firewall_rules_edit.php:353
+#: usr/local/www/firewall_nat_edit.php:228
+#: usr/local/www/firewall_rules_edit.php:352
+#: usr/local/www/firewall_rules_edit.php:355
+#: usr/local/www/firewall_nat_edit.php:233
+#: usr/local/www/firewall_rules_edit.php:361
+#: usr/local/www/firewall_nat_edit.php:238
+#, php-format
+msgid "%s is not a valid start destination port. It must be a port alias or integer between 1 and 65535."
+msgstr "%s não é um inicio de porta de destino válido. Deve ser um alias de porta ou um inteiro entre 1 e 65535."
+
+#: usr/local/www/firewall_nat_edit.php:223
+#: usr/local/www/firewall_rules_edit.php:331
+#: usr/local/www/firewall_rules_edit.php:355
+#: usr/local/www/firewall_nat_edit.php:230
+#: usr/local/www/firewall_rules_edit.php:354
+#: usr/local/www/firewall_rules_edit.php:357
+#: usr/local/www/firewall_nat_edit.php:235
+#: usr/local/www/firewall_rules_edit.php:363
+#: usr/local/www/firewall_nat_edit.php:240
+#, php-format
+msgid "%s is not a valid end destination port. It must be a port alias or integer between 1 and 65535."
+msgstr "%s não é um fim de porta de destino válido. Deve ser um alias de porta ou um inteiro entre 1 e 65535."
+
+#: usr/local/www/firewall_nat_edit.php:226
+#, php-format
+msgid "%s is not a valid local port. It must be a port alias or integer between 1 and 65535."
+msgstr "%s não é uma porta local válida. Deve ser um alias de porta ou um inteiro entre 1 e 65535."
+
+#: usr/local/www/firewall_nat_edit.php:237
+#: usr/local/www/firewall_rules_edit.php:365
+#: usr/local/www/firewall_rules_edit.php:394
+#: usr/local/www/firewall_nat_edit.php:244
+#: usr/local/www/firewall_rules_edit.php:393
+#: usr/local/www/firewall_rules_edit.php:396
+#: usr/local/www/firewall_nat_edit.php:249
+#: usr/local/www/firewall_rules_edit.php:402
+#: usr/local/www/firewall_nat_edit.php:254
+#, php-format
+msgid "%s is not a valid source IP address or alias."
+msgstr "%s não é um endereço IP válido ou alias."
+
+#: usr/local/www/firewall_nat_edit.php:240
+#: usr/local/www/firewall_nat_out_edit.php:151
+#: usr/local/www/firewall_rules_edit.php:368
+#: usr/local/www/firewall_nat_out_edit.php:164
+#: usr/local/www/firewall_rules_edit.php:397
+#: usr/local/www/firewall_nat_edit.php:247
+#: usr/local/www/firewall_rules_edit.php:396
+#: usr/local/www/firewall_rules_edit.php:399
+#: usr/local/www/firewall_nat_edit.php:252
+#: usr/local/www/firewall_nat_out_edit.php:168
+#: usr/local/www/firewall_rules_edit.php:405
+#: usr/local/www/firewall_nat_edit.php:257
+#: usr/local/www/firewall_nat_out_edit.php:174
+msgid "A valid source bit count must be specified."
+msgstr "Um bit count de origem válido deve ser especificado."
+
+#: usr/local/www/firewall_nat_edit.php:267
+#: usr/local/www/firewall_nat_edit.php:274
+#: usr/local/www/firewall_nat_edit.php:279
+#: usr/local/www/firewall_nat_edit.php:284
+msgid "The target port range must be an integer between 1 and 65535."
+msgstr "O intervalo de porta de destino deve ser um inteiro entre 1 e 65535."
+
+#: usr/local/www/firewall_nat_edit.php:288
+#: usr/local/www/firewall_nat_edit.php:295
+#: usr/local/www/firewall_nat_edit.php:300
+#: usr/local/www/firewall_nat_edit.php:305
+msgid "The destination port range overlaps with an existing entry."
+msgstr "O intervalo de porta de destino sobrepõe uma entrada existente."
+
+#: usr/local/www/firewall_nat_edit.php:453
+#: usr/local/www/firewall_nat_edit.php:460
+#: usr/local/www/firewall_nat_edit.php:459
+#: usr/local/www/firewall_nat_edit.php:454
+#: usr/local/www/firewall_nat_edit.php:466
+#: usr/local/www/firewall_nat_edit.php:467
+msgid "Edit Redirect entry"
+msgstr "Editar entrada de redirecionamento"
+
+#: usr/local/www/firewall_nat_edit.php:468
+#: usr/local/www/firewall_nat_edit.php:475
+#: usr/local/www/firewall_nat_edit.php:474
+#: usr/local/www/firewall_nat_edit.php:469
+#: usr/local/www/firewall_nat_edit.php:481
+#: usr/local/www/firewall_nat_edit.php:482
+msgid "No RDR (NOT)"
+msgstr "Sem RDR (NÃO)"
+
+#: usr/local/www/firewall_nat_edit.php:471
+#: usr/local/www/firewall_nat_edit.php:478
+#: usr/local/www/firewall_nat_edit.php:477
+#: usr/local/www/firewall_nat_edit.php:472
+#: usr/local/www/firewall_nat_edit.php:484
+#: usr/local/www/firewall_nat_edit.php:485
+msgid "Enabling this option will disable redirection for traffic matching this rule."
+msgstr "Ativando esta opção irá desativar o redirecionamento do tráfego correspondente a esta regra."
+
+#: usr/local/www/firewall_nat_edit.php:472
+#: usr/local/www/firewall_nat_edit.php:479
+#: usr/local/www/firewall_nat_edit.php:478
+#: usr/local/www/firewall_nat_edit.php:473
+#: usr/local/www/firewall_nat_edit.php:485
+#: usr/local/www/firewall_nat_edit.php:486
+msgid "Hint: this option is rarely needed, don't use this unless you know what you're doing."
+msgstr "Dica: essa opção raramente é necessária, não use-a a menos que você saiba o que está fazendo."
+
+#: usr/local/www/firewall_nat_edit.php:514
+#: usr/local/www/firewall_nat_out_edit.php:452
+#: usr/local/www/firewall_nat_out_edit.php:465
+#: usr/local/www/firewall_nat_edit.php:521
+#: usr/local/www/firewall_nat_edit.php:520
+#: usr/local/www/firewall_nat_edit.php:515
+#: usr/local/www/firewall_nat_out_edit.php:469
+#: usr/local/www/firewall_nat_edit.php:527
+#: usr/local/www/firewall_nat_out_edit.php:481
+#: usr/local/www/firewall_nat_edit.php:528
+msgid "Choose which interface this rule applies to."
+msgstr "Escolha qual interface esta regra se aplica."
+
+#: usr/local/www/firewall_nat_edit.php:515
+#: usr/local/www/firewall_nat_out_edit.php:453
+#: usr/local/www/firewall_nat_out_edit.php:466
+#: usr/local/www/firewall_nat_edit.php:522
+#: usr/local/www/firewall_nat_edit.php:521
+#: usr/local/www/firewall_nat_edit.php:516
+#: usr/local/www/firewall_nat_out_edit.php:470
+#: usr/local/www/firewall_nat_edit.php:528
+#: usr/local/www/firewall_nat_out_edit.php:482
+#: usr/local/www/firewall_nat_edit.php:529
+msgid "Hint: in most cases, you'll want to use WAN here."
+msgstr "Dica: na maioria dos casos, você vai querer usar WAN aqui."
+
+#: usr/local/www/firewall_nat_edit.php:524
+#: usr/local/www/firewall_rules_edit.php:818
+#: usr/local/www/firewall_rules_edit.php:853
+#: usr/local/www/firewall_nat_edit.php:531
+#: usr/local/www/firewall_nat_edit.php:530
+#: usr/local/www/firewall_rules_edit.php:856
+#: usr/local/www/firewall_nat_edit.php:525
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_nat_edit.php:537
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_nat_edit.php:538
+#: usr/local/www/firewall_rules_edit.php:915
+msgid "Choose which IP protocol this rule should match."
+msgstr "Escolha qual protocolo IP essa regra deve corresponder."
+
+#: usr/local/www/firewall_nat_edit.php:526
+#: usr/local/www/firewall_nat_edit.php:533
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/firewall_nat_edit.php:527
+#: usr/local/www/firewall_nat_edit.php:539
+#: usr/local/www/firewall_nat_edit.php:540
+msgid "Hint: in most cases, you should specify"
+msgstr "Dica: na maioria dos casos, você deve especificar"
+
+#: usr/local/www/firewall_nat_edit.php:526
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_relay_action_edit.php:186
+#: usr/local/www/load_balancer_relay_protocol_edit.php:144
+#: usr/local/www/firewall_nat_edit.php:533
+#: usr/local/www/load_balancer_relay_protocol_edit.php:142
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/firewall_nat_edit.php:527
+#: usr/local/www/firewall_nat_edit.php:539
+#: usr/local/www/firewall_nat_edit.php:540
+msgid "TCP"
+msgstr "TCP"
+
+#: usr/local/www/firewall_nat_edit.php:526
+#: usr/local/www/firewall_rules_edit.php:818
+#: usr/local/www/diag_ipsec_sad.php:135 usr/local/www/diag_ipsec_spd.php:144
+#: usr/local/www/firewall_rules_edit.php:853
+#: usr/local/www/firewall_nat_edit.php:533
+#: usr/local/www/diag_ipsec_sad.php:136
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/diag_ipsec_spd.php:145
+#: usr/local/www/firewall_rules_edit.php:856
+#: usr/local/www/firewall_nat_edit.php:527
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_nat_edit.php:539
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_nat_edit.php:540
+#: usr/local/www/firewall_rules_edit.php:915
+msgid "here."
+msgstr "aqui."
+
+#: usr/local/www/firewall_nat_edit.php:531
+#: usr/local/www/firewall_nat_edit.php:538
+#: usr/local/www/firewall_nat_edit.php:537
+#: usr/local/www/firewall_nat_edit.php:532
+#: usr/local/www/firewall_nat_edit.php:544
+#: usr/local/www/firewall_nat_edit.php:545
+msgid "Show source address and port range"
+msgstr "Mostrar endereço de origem e intervalo de portas"
+
+#: usr/local/www/firewall_nat_edit.php:589
+#: usr/local/www/firewall_rules_edit.php:913
+#: usr/local/www/firewall_rules_edit.php:948
+#: usr/local/www/firewall_nat_edit.php:596
+#: usr/local/www/firewall_nat_edit.php:595
+#: usr/local/www/firewall_rules_edit.php:957
+#: usr/local/www/firewall_nat_edit.php:590
+#: usr/local/www/firewall_rules_edit.php:970
+#: usr/local/www/firewall_nat_edit.php:602
+#: usr/local/www/firewall_rules_edit.php:969
+#: usr/local/www/firewall_nat_edit.php:603
+#: usr/local/www/firewall_rules_edit.php:1017
+msgid "Source port range"
+msgstr "Intervalo da porta de origem"
+
+#: usr/local/www/firewall_nat_edit.php:593
+#: usr/local/www/firewall_nat_edit.php:705
+#: usr/local/www/firewall_rules_edit.php:917
+#: usr/local/www/firewall_rules_edit.php:1009
+#: usr/local/www/firewall_rules_edit.php:952
+#: usr/local/www/firewall_rules_edit.php:1044
+#: usr/local/www/firewall_nat_edit.php:600
+#: usr/local/www/firewall_nat_edit.php:712
+#: usr/local/www/firewall_nat_edit.php:599
+#: usr/local/www/firewall_nat_edit.php:711
+#: usr/local/www/firewall_rules_edit.php:961
+#: usr/local/www/firewall_rules_edit.php:1059
+#: usr/local/www/firewall_nat_edit.php:594
+#: usr/local/www/firewall_nat_edit.php:706
+#: usr/local/www/firewall_rules_edit.php:974
+#: usr/local/www/firewall_rules_edit.php:1072
+#: usr/local/www/firewall_nat_edit.php:606
+#: usr/local/www/firewall_nat_edit.php:718
+#: usr/local/www/firewall_rules_edit.php:973
+#: usr/local/www/firewall_rules_edit.php:1071
+#: usr/local/www/firewall_nat_edit.php:607
+#: usr/local/www/firewall_nat_edit.php:719
+#: usr/local/www/firewall_rules_edit.php:1021
+#: usr/local/www/firewall_rules_edit.php:1119
+msgid "from:"
+msgstr "a partir de:"
+
+#: usr/local/www/firewall_nat_edit.php:596
+#: usr/local/www/firewall_nat_edit.php:609
+#: usr/local/www/firewall_nat_edit.php:708
+#: usr/local/www/firewall_nat_edit.php:721
+#: usr/local/www/firewall_nat_edit.php:751
+#: usr/local/www/firewall_rules_edit.php:920
+#: usr/local/www/firewall_rules_edit.php:933
+#: usr/local/www/firewall_rules_edit.php:1012
+#: usr/local/www/firewall_rules_edit.php:1025
+#: usr/local/www/firewall_rules_edit.php:955
+#: usr/local/www/firewall_rules_edit.php:968
+#: usr/local/www/firewall_rules_edit.php:1047
+#: usr/local/www/firewall_rules_edit.php:1060
+#: usr/local/www/firewall_nat_edit.php:603
+#: usr/local/www/firewall_nat_edit.php:616
+#: usr/local/www/firewall_nat_edit.php:715
+#: usr/local/www/firewall_nat_edit.php:728
+#: usr/local/www/firewall_nat_edit.php:758
+#: usr/local/www/firewall_nat_edit.php:602
+#: usr/local/www/firewall_nat_edit.php:615
+#: usr/local/www/firewall_nat_edit.php:714
+#: usr/local/www/firewall_nat_edit.php:727
+#: usr/local/www/firewall_nat_edit.php:757
+#: usr/local/www/firewall_rules_edit.php:964
+#: usr/local/www/firewall_rules_edit.php:977
+#: usr/local/www/firewall_rules_edit.php:1062
+#: usr/local/www/firewall_rules_edit.php:1075
+#: usr/local/www/firewall_nat_edit.php:597
+#: usr/local/www/firewall_nat_edit.php:610
+#: usr/local/www/firewall_nat_edit.php:709
+#: usr/local/www/firewall_nat_edit.php:722
+#: usr/local/www/firewall_nat_edit.php:752
+#: usr/local/www/firewall_rules_edit.php:990
+#: usr/local/www/firewall_rules_edit.php:1088
+#: usr/local/www/firewall_nat_edit.php:622
+#: usr/local/www/firewall_nat_edit.php:734
+#: usr/local/www/firewall_nat_edit.php:764
+#: usr/local/www/firewall_rules_edit.php:976
+#: usr/local/www/firewall_rules_edit.php:989
+#: usr/local/www/firewall_rules_edit.php:1074
+#: usr/local/www/firewall_rules_edit.php:1087
+#: usr/local/www/firewall_nat_edit.php:623
+#: usr/local/www/firewall_nat_edit.php:735
+#: usr/local/www/firewall_nat_edit.php:765
+#: usr/local/www/firewall_rules_edit.php:1024
+#: usr/local/www/firewall_rules_edit.php:1037
+#: usr/local/www/firewall_rules_edit.php:1122
+#: usr/local/www/firewall_rules_edit.php:1135
+msgid "other"
+msgstr "outros"
+
+#: usr/local/www/firewall_nat_edit.php:606
+#: usr/local/www/firewall_nat_edit.php:718
+#: usr/local/www/firewall_rules_edit.php:930
+#: usr/local/www/firewall_rules_edit.php:1022
+#: usr/local/www/firewall_rules_edit.php:965
+#: usr/local/www/firewall_rules_edit.php:1057
+#: usr/local/www/firewall_nat_edit.php:613
+#: usr/local/www/firewall_nat_edit.php:725
+#: usr/local/www/firewall_nat_edit.php:612
+#: usr/local/www/firewall_nat_edit.php:724
+#: usr/local/www/firewall_rules_edit.php:974
+#: usr/local/www/firewall_rules_edit.php:1072
+#: usr/local/www/firewall_nat_edit.php:607
+#: usr/local/www/firewall_nat_edit.php:719
+#: usr/local/www/firewall_rules_edit.php:987
+#: usr/local/www/firewall_rules_edit.php:1085
+#: usr/local/www/firewall_nat_edit.php:619
+#: usr/local/www/firewall_nat_edit.php:731
+#: usr/local/www/firewall_rules_edit.php:986
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:732
+#: usr/local/www/firewall_rules_edit.php:1034
+#: usr/local/www/firewall_rules_edit.php:1132
+msgid "to:"
+msgstr "para:"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_nat_edit.php:634
+msgid "Specify the source port or port range for this rule"
+msgstr "Especifique a porta de origem ou intervalo de portas para esta regra"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_rules_edit.php:1048
+msgid "This is usually"
+msgstr "Isto normalmente é"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_rules_edit.php:1048
+msgid "random"
+msgstr "aleatório"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_nat_edit.php:634
+msgid "and almost never equal to the destination port range (and should usually be 'any')"
+msgstr "e quase nunca é igual ao intervalo de porta de destino (e geralmente deve ser 'qualquer')"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_nat_edit.php:735
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:1039
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:1074
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:742
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1089
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_nat_edit.php:736
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1102
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_nat_edit.php:748
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1101
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_nat_edit.php:749
+#: usr/local/www/firewall_rules_edit.php:1048
+#: usr/local/www/firewall_rules_edit.php:1149
+msgid "Hint: you can leave the"
+msgstr "Dica: você pode deixar o"
+
+#: usr/local/www/firewall_nat_edit.php:620
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_nat_edit.php:627
+#: usr/local/www/firewall_nat_edit.php:626
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_nat_edit.php:621
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_nat_edit.php:633
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_nat_edit.php:634
+#: usr/local/www/firewall_rules_edit.php:1048
+msgid "field empty if you only want to filter a single port."
+msgstr "campo vazio se você apenas deseja filtrar uma única porta."
+
+#: usr/local/www/firewall_nat_edit.php:701
+#: usr/local/www/firewall_nat_edit.php:708
+#: usr/local/www/firewall_nat_edit.php:707
+#: usr/local/www/firewall_nat_edit.php:702
+#: usr/local/www/firewall_nat_edit.php:714
+#: usr/local/www/firewall_nat_edit.php:715
+msgid "Destination port range"
+msgstr "Destino intervalo de portas"
+
+#: usr/local/www/firewall_nat_edit.php:733
+#: usr/local/www/firewall_nat_edit.php:740
+#: usr/local/www/firewall_nat_edit.php:739
+#: usr/local/www/firewall_nat_edit.php:734
+#: usr/local/www/firewall_nat_edit.php:746
+#: usr/local/www/firewall_nat_edit.php:747
+msgid "Specify the port or port range for the destination of the packet for this mapping."
+msgstr "Especifique o intervalo de porta ou porta de destino do pacote para esse mapeamento."
+
+#: usr/local/www/firewall_nat_edit.php:735
+#: usr/local/www/firewall_nat_edit.php:742
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/firewall_nat_edit.php:736
+#: usr/local/www/firewall_nat_edit.php:748
+#: usr/local/www/firewall_nat_edit.php:749
+msgid "field empty if you only want to map a single port"
+msgstr "campo vazio se você apenas deseja mapear uma única porta"
+
+#: usr/local/www/firewall_nat_edit.php:743
+#: usr/local/www/firewall_nat_edit.php:750
+#: usr/local/www/firewall_nat_edit.php:749
+#: usr/local/www/firewall_nat_edit.php:744
+#: usr/local/www/firewall_nat_edit.php:756
+#: usr/local/www/firewall_nat_edit.php:757
+msgid "Enter the internal IP address of the server on which you want to map the ports."
+msgstr "Digite o endereço IP interno do servidor no qual pretende mapear as portas."
+
+#: usr/local/www/firewall_nat_edit.php:748
+#: usr/local/www/firewall_nat_edit.php:755
+#: usr/local/www/firewall_nat_edit.php:754
+#: usr/local/www/firewall_nat_edit.php:749
+#: usr/local/www/firewall_nat_edit.php:761
+#: usr/local/www/firewall_nat_edit.php:762
+msgid "Redirect target port"
+msgstr "Redirecionar porta de destino"
+
+#: usr/local/www/firewall_nat_edit.php:762
+#: usr/local/www/firewall_nat_edit.php:769
+#: usr/local/www/firewall_nat_edit.php:768
+#: usr/local/www/firewall_nat_edit.php:763
+#: usr/local/www/firewall_nat_edit.php:775
+#: usr/local/www/firewall_nat_edit.php:776
+msgid "Specify the port on the machine with the IP address entered above. In case of a port range, specify the beginning port of the range (the end port will be calculated automatically)."
+msgstr "Especificar a porta da máquina com o endereço IP digitado acima. No caso de uma porta, especifique a porta início do intervalo (a porta final será calculado automaticamente)."
+
+#: usr/local/www/firewall_nat_edit.php:766
+#: usr/local/www/firewall_nat_edit.php:773
+#: usr/local/www/firewall_nat_edit.php:772
+#: usr/local/www/firewall_nat_edit.php:767
+#: usr/local/www/firewall_nat_edit.php:779
+#: usr/local/www/firewall_nat_edit.php:780
+msgid "Hint: this is usually identical to the 'from' port above"
+msgstr "Dica: isso normalmente é identico à porta 'De' acima"
+
+#: usr/local/www/firewall_nat_edit.php:776
+#: usr/local/www/firewall_nat_out_edit.php:629
+#: usr/local/www/firewall_rules_edit.php:1238
+#: usr/local/www/firewall_nat_out_edit.php:642
+#: usr/local/www/firewall_rules_edit.php:1273
+#: usr/local/www/firewall_nat_edit.php:783
+#: usr/local/www/firewall_nat_edit.php:782
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_nat_edit.php:777
+#: usr/local/www/firewall_nat_out_edit.php:644
+#: usr/local/www/firewall_rules_edit.php:1295
+#: usr/local/www/firewall_nat_edit.php:789
+#: usr/local/www/firewall_nat_out_edit.php:656
+#: usr/local/www/firewall_rules_edit.php:1294
+#: usr/local/www/firewall_nat_edit.php:790
+#: usr/local/www/firewall_rules_edit.php:1342
+msgid "No XMLRPC Sync"
+msgstr "Sem XMLRPC Sync"
+
+#: usr/local/www/firewall_nat_edit.php:779
+#: usr/local/www/firewall_nat_edit.php:786
+#: usr/local/www/firewall_nat_edit.php:785
+msgid "HINT: This prevents the rule from automatically syncing to other CARP members"
+msgstr "DICA: Isso impede que a regra automaticamente a sincronização com outros membros CARP"
+
+#: usr/local/www/firewall_nat_edit.php:794
+#: usr/local/www/firewall_nat_edit.php:825
+#: usr/local/www/firewall_nat_edit.php:802
+#: usr/local/www/firewall_nat_edit.php:833
+#: usr/local/www/firewall_nat_edit.php:801
+#: usr/local/www/firewall_nat_edit.php:832
+#: usr/local/www/firewall_nat_edit.php:796
+#: usr/local/www/firewall_nat_edit.php:827
+#: usr/local/www/firewall_nat_edit.php:808
+#: usr/local/www/firewall_nat_edit.php:839
+#: usr/local/www/firewall_nat_edit.php:809
+#: usr/local/www/firewall_nat_edit.php:840
+msgid "Filter rule association"
+msgstr "Associação de regra de filtro"
+
+#: usr/local/www/firewall_nat_edit.php:798
+#: usr/local/www/firewall_nat_edit.php:831
+#: usr/local/www/firewall_nat_edit.php:806
+#: usr/local/www/firewall_nat_edit.php:839
+#: usr/local/www/firewall_nat_edit.php:805
+#: usr/local/www/firewall_nat_edit.php:838
+#: usr/local/www/firewall_nat_edit.php:800
+#: usr/local/www/firewall_nat_edit.php:833
+#: usr/local/www/firewall_nat_edit.php:812
+#: usr/local/www/firewall_nat_edit.php:845
+#: usr/local/www/firewall_nat_edit.php:813
+#: usr/local/www/firewall_nat_edit.php:846
+msgid "Pass"
+msgstr "Liberar"
+
+#: usr/local/www/firewall_nat_edit.php:808
+#: usr/local/www/firewall_nat_edit.php:816
+#: usr/local/www/firewall_nat_edit.php:815
+#: usr/local/www/firewall_nat_edit.php:810
+#: usr/local/www/firewall_nat_edit.php:822
+#: usr/local/www/firewall_nat_edit.php:823
+msgid "View the filter rule"
+msgstr "Ver regra do filtro"
+
+#: usr/local/www/firewall_nat_edit.php:816
+#: usr/local/www/firewall_nat_edit.php:824
+#: usr/local/www/firewall_nat_edit.php:823
+#: usr/local/www/firewall_nat_edit.php:818
+#: usr/local/www/firewall_nat_edit.php:830
+#: usr/local/www/firewall_nat_edit.php:831
+msgid "Create new associated filter rule"
+msgstr "Criar nova regra de filtro associada"
+
+#: usr/local/www/firewall_nat_edit.php:829
+#: usr/local/www/firewall_nat_edit.php:837
+#: usr/local/www/firewall_nat_edit.php:836
+#: usr/local/www/firewall_nat_edit.php:831
+#: usr/local/www/firewall_nat_edit.php:843
+#: usr/local/www/firewall_nat_edit.php:844
+msgid "Add associated filter rule"
+msgstr "Adicionar regra de filtro associada"
+
+#: usr/local/www/firewall_nat_edit.php:830
+#: usr/local/www/firewall_nat_edit.php:838
+#: usr/local/www/firewall_nat_edit.php:837
+#: usr/local/www/firewall_nat_edit.php:832
+#: usr/local/www/firewall_nat_edit.php:844
+#: usr/local/www/firewall_nat_edit.php:845
+msgid "Add unassociated filter rule"
+msgstr "Adicionar regra de filtro não associada"
+
+#: usr/local/www/firewall_nat_out.php:111
+#: usr/local/www/firewall_nat_out.php:112
+#, php-format
+msgid "Auto created rule for ISAKMP - %1$s to %2$s"
+msgstr "Regra criada automaticamente para ISAKMP - %1$s para %2$s"
+
+#: usr/local/www/firewall_nat_out.php:121
+#: usr/local/www/firewall_nat_out.php:123
+#, php-format
+msgid "Auto created rule for %1$s to %2$s"
+msgstr "Regra criada automaticamente para %1$s para %2$s"
+
+#: usr/local/www/firewall_nat_out.php:131
+#: usr/local/www/firewall_nat_out.php:135
+#, php-format
+msgid "Auto created rule for localhost to %1$s"
+msgstr "Regra criada automaticamente para %1$s"
+
+#: usr/local/www/firewall_nat_out.php:147
+#: usr/local/www/firewall_nat_out.php:148
+#: usr/local/www/firewall_nat_out.php:152
+msgid "Auto created rule for PPTP server"
+msgstr "Regra criada automaticamente para servidor PPTP"
+
+#: usr/local/www/firewall_nat_out.php:167
+#: usr/local/www/firewall_nat_out.php:168
+#: usr/local/www/firewall_nat_out.php:173
+msgid "Auto created rule for PPPoE server"
+msgstr "Regra criada automaticamente para servidor PPPoE"
+
+#: usr/local/www/firewall_nat_out.php:187
+#: usr/local/www/firewall_nat_out.php:188
+#: usr/local/www/firewall_nat_out.php:194
+msgid "Auto created rule for L2TP server"
+msgstr "Regra criada automaticamente para servidor L2TP"
+
+#: usr/local/www/firewall_nat_out.php:201
+#: usr/local/www/firewall_nat_out.php:202
+#: usr/local/www/firewall_nat_out.php:209
+msgid "Auto created rule for OpenVPN server"
+msgstr "Regra criada automaticamente para servidor OpenVPN"
+
+#: usr/local/www/firewall_nat_out.php:212
+#: usr/local/www/firewall_nat_out.php:213
+#: usr/local/www/firewall_nat_out.php:220
+msgid "Default rules for each interface have been created."
+msgstr "Regras padrão para cada interface foram criadas."
+
+#: usr/local/www/firewall_nat_out.php:294
+#: usr/local/www/firewall_nat_out.php:304
+#: usr/local/www/firewall_nat_out.php:305
+#: usr/local/www/firewall_nat_out.php:312
+#: usr/local/www/firewall_nat_out.php:311
+msgid "The NAT configuration has been changed."
+msgstr "Configuração de NAT foi alterado."
+
+#: usr/local/www/firewall_nat_out.php:310
+#: usr/local/www/firewall_nat_out.php:320
+#: usr/local/www/firewall_nat_out.php:321
+#: usr/local/www/firewall_nat_out.php:328
+#: usr/local/www/firewall_nat_out.php:327
+msgid "Mode:"
+msgstr "Modo:"
+
+#: usr/local/www/firewall_nat_out.php:313
+#: usr/local/www/firewall_nat_out.php:323
+#: usr/local/www/firewall_nat_out.php:324
+#: usr/local/www/firewall_nat_out.php:331
+#: usr/local/www/firewall_nat_out.php:330
+msgid "Automatic outbound NAT rule generation"
+msgstr "Geração de regras automáticas de outbound NAT"
+
+#: usr/local/www/firewall_nat_out.php:313
+#: usr/local/www/firewall_nat_out.php:323
+#: usr/local/www/firewall_nat_out.php:324
+#: usr/local/www/firewall_nat_out.php:331
+#: usr/local/www/firewall_nat_out.php:330
+msgid "(IPsec passthrough included)"
+msgstr "(IPsex passthrough incluso)"
+
+#: usr/local/www/firewall_nat_out.php:318
+#: usr/local/www/firewall_nat_out.php:328
+#: usr/local/www/firewall_nat_out.php:329
+#: usr/local/www/firewall_nat_out.php:336
+#: usr/local/www/firewall_nat_out.php:335
+msgid "Manual Outbound NAT rule generation"
+msgstr "Geração manual de regra de Outbound NAT"
+
+#: usr/local/www/firewall_nat_out.php:318
+#: usr/local/www/firewall_nat_out.php:328
+#: usr/local/www/firewall_nat_out.php:329
+#: usr/local/www/firewall_nat_out.php:336
+#: usr/local/www/firewall_nat_out.php:335
+msgid "(AON - Advanced Outbound NAT)"
+msgstr "(AON - Outbound NAT Avançado)"
+
+#: usr/local/www/firewall_nat_out.php:336
+#: usr/local/www/firewall_nat_out.php:346
+#: usr/local/www/firewall_nat_out.php:347
+#: usr/local/www/firewall_nat_out.php:354
+#: usr/local/www/firewall_nat_out.php:353
+msgid "Mappings:"
+msgstr "Mapeamentos:"
+
+#: usr/local/www/firewall_nat_out.php:343
+#: usr/local/www/firewall_nat_out.php:353
+#: usr/local/www/firewall_nat_out.php:354 usr/local/www/diag_testport.php:129
+#: usr/local/www/diag_system_pftop.php:160
+#: usr/local/www/diag_logs_filter.php:167
+#: usr/local/www/firewall_nat_out.php:361
+#: usr/local/www/firewall_nat_out.php:360
+msgid "Source Port"
+msgstr "Porta de Origem"
+
+#: usr/local/www/firewall_nat_out.php:345
+#: usr/local/www/firewall_nat_out.php:355
+#: usr/local/www/firewall_nat_out.php:356
+#: usr/local/www/diag_system_pftop.php:153
+#: usr/local/www/diag_logs_filter.php:189
+#: usr/local/www/firewall_nat_out.php:363
+#: usr/local/www/firewall_nat_out.php:362
+msgid "Destination Port"
+msgstr "Porta de destino"
+
+#: usr/local/www/firewall_nat_out.php:346
+#: usr/local/www/firewall_nat_out.php:356
+#: usr/local/www/firewall_nat_out.php:357
+#: usr/local/www/firewall_nat_out.php:364
+#: usr/local/www/firewall_nat_out.php:363
+msgid "NAT Address"
+msgstr "Endereço NAT"
+
+#: usr/local/www/firewall_nat_out.php:347
+#: usr/local/www/firewall_nat_out.php:357
+#: usr/local/www/firewall_nat_out.php:358
+#: usr/local/www/firewall_nat_out.php:365
+#: usr/local/www/firewall_nat_out.php:364
+msgid "NAT Port"
+msgstr "Porta NAT"
+
+#: usr/local/www/firewall_nat_out.php:348
+#: usr/local/www/firewall_nat_out.php:358
+#: usr/local/www/firewall_nat_out.php:359
+#: usr/local/www/firewall_nat_out.php:366
+#: usr/local/www/firewall_nat_out.php:365
+msgid "Static Port"
+msgstr "Porta estática"
+
+#: usr/local/www/firewall_nat_out.php:354
+#: usr/local/www/firewall_nat_out.php:450
+#: usr/local/www/firewall_nat_out.php:364
+#: usr/local/www/firewall_nat_out.php:461
+#: usr/local/www/firewall_nat_out.php:365
+#: usr/local/www/firewall_nat_out.php:462
+#: usr/local/www/firewall_nat_out.php:459
+#: usr/local/www/firewall_nat_out.php:372
+#: usr/local/www/firewall_nat_out.php:466
+#: usr/local/www/firewall_nat_out.php:371
+#: usr/local/www/firewall_nat_out.php:465
+msgid "add new mapping"
+msgstr "adicionar nova mapeamento"
+
+#: usr/local/www/firewall_nat_out.php:425
+#: usr/local/www/firewall_nat_out.php:435
+#: usr/local/www/firewall_nat_out.php:436
+#: usr/local/www/firewall_nat_out.php:433
+#: usr/local/www/firewall_nat_out.php:440
+#: usr/local/www/firewall_nat_out.php:439
+msgid "YES"
+msgstr "SIM"
+
+#: usr/local/www/firewall_nat_out.php:427
+#: usr/local/www/firewall_nat_out.php:437
+#: usr/local/www/firewall_nat_out.php:438
+#: usr/local/www/firewall_nat_out.php:435
+#: usr/local/www/firewall_nat_out.php:442
+#: usr/local/www/firewall_nat_out.php:441
+msgid "NO"
+msgstr "Não"
+
+#: usr/local/www/firewall_nat_out.php:436
+#: usr/local/www/firewall_nat_out.php:447
+#: usr/local/www/firewall_nat_out.php:448
+#: usr/local/www/firewall_nat_out.php:445
+#: usr/local/www/firewall_nat_out.php:452
+#: usr/local/www/firewall_nat_out.php:451
+msgid "edit mapping"
+msgstr "editar mapeamento"
+
+#: usr/local/www/firewall_nat_out.php:439 usr/local/www/firewall_rules.php:435
+#: usr/local/www/firewall_rules.php:464 usr/local/www/firewall_rules.php:492
+#: usr/local/www/firewall_rules.php:775 usr/local/www/firewall_nat.php:309
+#: usr/local/www/firewall_nat_out.php:446 usr/local/www/firewall_rules.php:429
+#: usr/local/www/firewall_rules.php:458 usr/local/www/firewall_rules.php:486
+#: usr/local/www/firewall_rules.php:772 usr/local/www/firewall_nat_out.php:447
+#: usr/local/www/firewall_nat.php:322 usr/local/www/firewall_rules.php:422
+#: usr/local/www/firewall_rules.php:451 usr/local/www/firewall_rules.php:479
+#: usr/local/www/firewall_rules.php:765 usr/local/www/firewall_nat_out.php:444
+#: usr/local/www/firewall_nat_out.php:451 usr/local/www/firewall_rules.php:421
+#: usr/local/www/firewall_rules.php:450 usr/local/www/firewall_rules.php:478
+#: usr/local/www/firewall_nat.php:325 usr/local/www/firewall_nat_out.php:450
+msgid "move selected rules before this rule"
+msgstr "mover as regras selecionada para antes desta regra"
+
+#: usr/local/www/firewall_nat_out.php:440 usr/local/www/firewall_nat.php:314
+#: usr/local/www/firewall_nat_out.php:451
+#: usr/local/www/firewall_nat_out.php:452 usr/local/www/firewall_nat.php:327
+#: usr/local/www/firewall_nat_out.php:449
+#: usr/local/www/firewall_nat_out.php:456 usr/local/www/firewall_nat.php:330
+#: usr/local/www/firewall_nat_out.php:455
+msgid "add a new NAT based on this one"
+msgstr "adicionar um nova regra de NAT baseada nesta"
+
+#: usr/local/www/firewall_nat_out.php:449
+#: usr/local/www/firewall_nat_out.php:460
+#: usr/local/www/firewall_nat_out.php:461
+#: usr/local/www/firewall_nat_out.php:458
+#: usr/local/www/firewall_nat_out.php:465
+#: usr/local/www/firewall_nat_out.php:464
+msgid "move selected mappings to end"
+msgstr "mover os mapeamentos selecionados para final"
+
+#: usr/local/www/firewall_nat_out.php:453 usr/local/www/firewall_rules.php:391
+#: usr/local/www/firewall_rules.php:392 usr/local/www/firewall_rules.php:823
+#: usr/local/www/firewall_rules.php:824 usr/local/www/firewall_nat.php:209
+#: usr/local/www/firewall_nat.php:211 usr/local/www/firewall_nat.php:332
+#: usr/local/www/firewall_nat.php:334 usr/local/www/firewall_nat_out.php:464
+#: usr/local/www/firewall_rules.php:395 usr/local/www/firewall_rules.php:396
+#: usr/local/www/firewall_rules.php:825 usr/local/www/firewall_nat_out.php:465
+#: usr/local/www/firewall_nat.php:214 usr/local/www/firewall_nat.php:216
+#: usr/local/www/firewall_nat.php:345 usr/local/www/firewall_nat.php:347
+#: usr/local/www/firewall_rules.php:388 usr/local/www/firewall_rules.php:389
+#: usr/local/www/firewall_rules.php:817 usr/local/www/firewall_rules.php:818
+#: usr/local/www/firewall_nat_out.php:462
+#: usr/local/www/firewall_nat_out.php:469 usr/local/www/firewall_rules.php:386
+#: usr/local/www/firewall_rules.php:387 usr/local/www/firewall_rules.php:819
+#: usr/local/www/firewall_rules.php:820 usr/local/www/firewall_nat.php:217
+#: usr/local/www/firewall_nat.php:219 usr/local/www/firewall_nat.php:348
+#: usr/local/www/firewall_nat.php:350 usr/local/www/firewall_nat_out.php:468
+msgid "delete selected rules"
+msgstr "excluir regras selecionadas"
+
+#: usr/local/www/firewall_nat_out.php:453
+#: usr/local/www/firewall_nat_out.php:464
+#: usr/local/www/firewall_nat_out.php:465
+#: usr/local/www/firewall_nat_out.php:462
+#: usr/local/www/firewall_nat_out.php:469
+#: usr/local/www/firewall_nat_out.php:468
+msgid "delete selected mappings"
+msgstr "excluir mapeamentos selecionados"
+
+#: usr/local/www/firewall_nat_out.php:453
+#: usr/local/www/firewall_nat_out.php:464
+#: usr/local/www/firewall_nat_out.php:465
+#: usr/local/www/firewall_nat_out.php:462
+#: usr/local/www/firewall_nat_out.php:469
+#: usr/local/www/firewall_nat_out.php:468
+msgid "Do you really want to delete the selected mappings?"
+msgstr "Você realmente deseja excluir os mapeamentos selecionados?"
+
+#: usr/local/www/firewall_nat_out.php:461
+#: usr/local/www/firewall_nat_out.php:472
+#: usr/local/www/firewall_nat_out.php:473
+#: usr/local/www/firewall_nat_out.php:470
+#: usr/local/www/firewall_nat_out.php:477
+#: usr/local/www/firewall_nat_out.php:476
+msgid "With automatic outbound NAT enabled, a mapping is automatically created for each interface's subnet (except WAN-type connections) and the rules on this page are ignored.<br/><br/> If manual outbound NAT is enabled, outbound NAT rules will not be automatically generated and only the mappings you specify on this page will be used. <br/><br/> If a target address other than an interface's IP address is used, then depending on the way the WAN connection is setup, a "
+msgstr "Com regras automáticas de saída NAT habilitadas, um mapeamento é automaticamente criado para a subrede de cada interface (exceto conexões WAN) e as regras nesta página são ignoradas.<br/><br/> Se geração manual de regras de saída NAT estiver habilitado, regras de saída NAT não serão geradas automaticamente e apenas os mapeamentos nesta página serão utilizados. <br/><br/> Se um endereço alvo diferente de endereços IP WAN são utilizados. dependendo de como a conexão WAN está configurada, um"
+
+#: usr/local/www/firewall_nat_out.php:469
+#: usr/local/www/firewall_nat_out_edit.php:588
+#: usr/local/www/carp_status.php:139
+#: usr/local/www/system_gateway_groups_edit.php:252
+#: usr/local/www/firewall_nat_out.php:480
+#: usr/local/www/firewall_nat_out_edit.php:601
+#: usr/local/www/system_gateway_groups_edit.php:312
+#: usr/local/www/firewall_nat_out.php:481 usr/local/www/carp_status.php:132
+#: usr/local/www/firewall_nat_out.php:478
+#: usr/local/www/firewall_nat_out_edit.php:604
+#: usr/local/www/firewall_nat_out.php:485
+#: usr/local/www/system_gateway_groups_edit.php:316
+#: usr/local/www/firewall_nat_out_edit.php:616
+#: usr/local/www/firewall_nat_out.php:484
+msgid "Virtual IP"
+msgstr "IP Virtual"
+
+#: usr/local/www/firewall_nat_out.php:470
+#: usr/local/www/firewall_nat_out.php:481
+#: usr/local/www/firewall_nat_out.php:482
+#: usr/local/www/firewall_nat_out.php:479
+#: usr/local/www/firewall_nat_out.php:486
+#: usr/local/www/firewall_nat_out.php:485
+msgid " may also be required."
+msgstr "pode ser necessário."
+
+#: usr/local/www/firewall_nat_out.php:472
+#: usr/local/www/firewall_nat_out.php:483
+#: usr/local/www/firewall_nat_out.php:484
+#: usr/local/www/firewall_nat_out.php:481
+#: usr/local/www/firewall_nat_out.php:488
+#: usr/local/www/firewall_nat_out.php:487
+msgid "To completely disable outbound NAT, switch to Manual Outbound NAT then delete any NAT rules that appear in the list."
+msgstr "Para desativar completamente o NAT de saída, mude para NAT de saída Manual e então exclua qualquer regra NAT que apareça na lista."
+
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_nat_out_edit.php:140
+msgid "Source bit count"
+msgstr "Contagem de bits de origem"
+
+#: usr/local/www/firewall_nat_out_edit.php:130
+#: usr/local/www/firewall_rules_edit.php:310
+#: usr/local/www/firewall_rules_edit.php:334
+#: usr/local/www/firewall_rules_edit.php:333
+#: usr/local/www/firewall_rules_edit.php:336
+#: usr/local/www/firewall_nat_out_edit.php:134
+#: usr/local/www/firewall_rules_edit.php:342
+#: usr/local/www/firewall_nat_out_edit.php:140
+msgid "Destination bit count"
+msgstr "Contagem de bits de destino"
+
+#: usr/local/www/firewall_nat_out_edit.php:137
+#: usr/local/www/firewall_nat_out_edit.php:150
+#: usr/local/www/firewall_nat_out_edit.php:154
+#: usr/local/www/firewall_nat_out_edit.php:160
+msgid "You must supply either a valid port or port alias for the source port entry."
+msgstr "Você deve fornecer uma porta válida ou um alias de porta para a entrada da porta de origem."
+
+#: usr/local/www/firewall_nat_out_edit.php:140
+#: usr/local/www/firewall_nat_out_edit.php:153
+#: usr/local/www/firewall_nat_out_edit.php:157
+#: usr/local/www/firewall_nat_out_edit.php:163
+msgid "You must supply either a valid port or port alias for the destination port entry."
+msgstr "Você deve fornecer uma porta válida ou um alias de porta para a entrada porta de destino."
+
+#: usr/local/www/firewall_nat_out_edit.php:143
+#: usr/local/www/firewall_nat_out_edit.php:156
+#: usr/local/www/firewall_nat_out_edit.php:160
+#: usr/local/www/firewall_nat_out_edit.php:166
+msgid "You must supply a valid port for the NAT port entry."
+msgstr "Você deve fornecer uma porta válida para a entrada porta NAT."
+
+#: usr/local/www/firewall_nat_out_edit.php:147
+#: usr/local/www/firewall_nat_out_edit.php:160
+#: usr/local/www/firewall_nat_out_edit.php:164
+#: usr/local/www/firewall_nat_out_edit.php:170
+msgid "A valid source must be specified."
+msgstr "Uma fonte válida deve ser especificada."
+
+#: usr/local/www/firewall_nat_out_edit.php:155
+#: usr/local/www/firewall_nat_out_edit.php:168
+#: usr/local/www/firewall_nat_out_edit.php:172
+#: usr/local/www/firewall_nat_out_edit.php:178
+msgid "A valid destination must be specified."
+msgstr "Um destino válido deve ser especificado."
+
+#: usr/local/www/firewall_nat_out_edit.php:163
+#: usr/local/www/firewall_nat_out_edit.php:176
+#: usr/local/www/firewall_nat_out_edit.php:180
+#: usr/local/www/firewall_nat_out_edit.php:186
+msgid "Negating destination address of \"any\" is invalid."
+msgstr "Negando o endereço de destino de \"qualquer\" é inválido."
+
+#: usr/local/www/firewall_nat_out_edit.php:168
+#: usr/local/www/firewall_nat_out_edit.php:181
+#: usr/local/www/firewall_nat_out_edit.php:185
+#: usr/local/www/firewall_nat_out_edit.php:191
+msgid "A valid target IP address must be specified."
+msgstr "Endereço de IP de destino deve ser especificado."
+
+#: usr/local/www/firewall_nat_out_edit.php:173
+#: usr/local/www/firewall_nat_out_edit.php:186
+#: usr/local/www/firewall_nat_out_edit.php:190
+#: usr/local/www/firewall_nat_out_edit.php:196
+msgid "A valid target IP must be specified when using the 'Other Subnet' type."
+msgstr "Um endereço IP válido deve ser especificado quando usado 'Outros tipos de Sub-rede'."
+
+#: usr/local/www/firewall_nat_out_edit.php:176
+#: usr/local/www/firewall_nat_out_edit.php:189
+#: usr/local/www/firewall_nat_out_edit.php:193
+#: usr/local/www/firewall_nat_out_edit.php:199
+msgid "A valid target bit count must be specified when using the 'Other Subnet' type."
+msgstr "Um contador de bit válido de subrede deve ser especificado quando usado 'Outros tipos de Sub-rede'."
+
+#: usr/local/www/firewall_nat_out_edit.php:189
+#: usr/local/www/firewall_nat_out_edit.php:202
+#: usr/local/www/firewall_nat_out_edit.php:206
+#: usr/local/www/firewall_nat_out_edit.php:212
+msgid "Only Round Robin pool options may be chosen when selecting an alias."
+msgstr "Somente opções de pool Round Robin podem ser escolhidos quando selecionado um alias. "
+
+#: usr/local/www/firewall_nat_out_edit.php:403
+#: usr/local/www/firewall_nat_out_edit.php:416
+#: usr/local/www/firewall_nat_out_edit.php:420
+#: usr/local/www/firewall_nat_out_edit.php:432
+msgid "Edit Advanced Outbound NAT entry"
+msgstr "Editar entradas avançadas de Outbound NAT"
+
+#: usr/local/www/firewall_nat_out_edit.php:410
+#: usr/local/www/firewall_nat_out_edit.php:423
+#: usr/local/www/firewall_nat_out_edit.php:427
+#: usr/local/www/firewall_nat_out_edit.php:439
+msgid "Do not NAT"
+msgstr "Não faça NAT"
+
+#: usr/local/www/firewall_nat_out_edit.php:413
+#: usr/local/www/firewall_nat_out_edit.php:426
+#: usr/local/www/firewall_nat_out_edit.php:430
+#: usr/local/www/firewall_nat_out_edit.php:442
+msgid "Enabling this option will disable NAT for traffic matching this rule and stop processing Outbound NAT rules."
+msgstr "Habilitando essa opção, o NAT será desabilitado para tráfego que corresponda a essa regra e irá parar o processamento de regras Outbound NAT."
+
+#: usr/local/www/firewall_nat_out_edit.php:414
+#: usr/local/www/firewall_nat_out_edit.php:427
+#: usr/local/www/firewall_nat_out_edit.php:431
+#: usr/local/www/firewall_nat_out_edit.php:443
+msgid "Hint: in most cases, you won't use this option."
+msgstr "Dica: na maioria dos casos, você não vai usar esta opção."
+
+#: usr/local/www/firewall_nat_out_edit.php:463
+#: usr/local/www/firewall_nat_out_edit.php:476
+#: usr/local/www/firewall_nat_out_edit.php:480
+#: usr/local/www/firewall_nat_out_edit.php:492
+msgid "Choose which protocol this rule should match."
+msgstr "Escolha qual protocolo essa regra deve corresponder."
+
+#: usr/local/www/firewall_nat_out_edit.php:464
+#: usr/local/www/firewall_nat_out_edit.php:477
+#: usr/local/www/firewall_nat_out_edit.php:481
+#: usr/local/www/firewall_nat_out_edit.php:493
+#, php-format
+msgid "Hint: in most cases, you should specify %s any %s here."
+msgstr "Dica: na maioria dos casos, você deve especificar %s qualquer um %s aqui."
+
+#: usr/local/www/firewall_nat_out_edit.php:488
+#: usr/local/www/firewall_nat_out_edit.php:501
+#: usr/local/www/firewall_nat_out_edit.php:505
+#: usr/local/www/firewall_nat_out_edit.php:517
+#: usr/local/www/firewall_nat_out_edit.php:519
+msgid "Enter the source network for the outbound NAT mapping."
+msgstr "Informe a porta de origem para o mapeamento outbound NAT."
+
+#: usr/local/www/firewall_nat_out_edit.php:491
+#: usr/local/www/firewall_nat_out_edit.php:504
+#: usr/local/www/firewall_nat_out_edit.php:508
+#: usr/local/www/firewall_nat_out_edit.php:520
+#: usr/local/www/firewall_nat_out_edit.php:522
+msgid "Source port:"
+msgstr "Porta de origem:"
+
+#: usr/local/www/firewall_nat_out_edit.php:492
+#: usr/local/www/firewall_nat_out_edit.php:505
+#: usr/local/www/firewall_nat_out_edit.php:509
+#: usr/local/www/firewall_nat_out_edit.php:521
+msgid ""
+"(leave \n"
+"blank for any)"
+msgstr ""
+"(deixar \n"
+"em branco para qualquer um)"
+
+#: usr/local/www/firewall_nat_out_edit.php:526
+#: usr/local/www/firewall_nat_out_edit.php:539
+#: usr/local/www/firewall_nat_out_edit.php:543
+#: usr/local/www/firewall_nat_out_edit.php:555
+#: usr/local/www/firewall_nat_out_edit.php:556
+msgid "Enter the destination network for the outbound NAT mapping."
+msgstr "Digite a rede de destino para o mapeamento NAT de saída."
+
+#: usr/local/www/firewall_nat_out_edit.php:530
+#: usr/local/www/firewall_nat_out_edit.php:543
+#: usr/local/www/firewall_nat_out_edit.php:547
+#: usr/local/www/firewall_nat_out_edit.php:559
+#: usr/local/www/firewall_nat_out_edit.php:560
+msgid "Destination port:"
+msgstr "Porta de destino:"
+
+#: usr/local/www/firewall_nat_out_edit.php:531
+#: usr/local/www/firewall_nat_out_edit.php:544
+#: usr/local/www/firewall_nat_out_edit.php:548
+#: usr/local/www/firewall_nat_out_edit.php:560
+msgid ""
+"(leave blank for \n"
+"any)"
+msgstr ""
+"(deixe em branco \n"
+"para qualquer um)"
+
+#: usr/local/www/firewall_nat_out_edit.php:538
+#: usr/local/www/firewall_nat_out_edit.php:551
+#: usr/local/www/firewall_nat_out_edit.php:555
+#: usr/local/www/firewall_nat_out_edit.php:567
+msgid "Translation"
+msgstr "Tradução"
+
+#: usr/local/www/firewall_nat_out_edit.php:544
+#: usr/local/www/firewall_nat_out_edit.php:557
+#: usr/local/www/firewall_nat_out_edit.php:561
+#: usr/local/www/firewall_nat_out_edit.php:573
+msgid "Interface address"
+msgstr "Endereço da Interface"
+
+#: usr/local/www/firewall_nat_out_edit.php:568
+#: usr/local/www/firewall_nat_out_edit.php:581
+#: usr/local/www/firewall_nat_out_edit.php:585
+#: usr/local/www/firewall_nat_out_edit.php:597
+msgid "Other Subnet (Enter Below)"
+msgstr "Outra Sub-rede (Digite abaixo)"
+
+#: usr/local/www/firewall_nat_out_edit.php:575
+#: usr/local/www/firewall_nat_out_edit.php:588
+#: usr/local/www/firewall_nat_out_edit.php:591
+#: usr/local/www/firewall_nat_out_edit.php:603
+msgid "Other Subnet:"
+msgstr "Outra Sub-rede:"
+
+#: usr/local/www/firewall_nat_out_edit.php:586
+#: usr/local/www/firewall_nat_out_edit.php:599
+#: usr/local/www/firewall_nat_out_edit.php:602
+#: usr/local/www/firewall_nat_out_edit.php:614
+msgid "Packets matching this rule will be mapped to the IP address given here."
+msgstr "Pacotes que correspondam a essa regra serão mapeados para o endereço IP dado aqui."
+
+#: usr/local/www/firewall_nat_out_edit.php:587
+#: usr/local/www/firewall_nat_out_edit.php:600
+#: usr/local/www/firewall_nat_out_edit.php:603
+#: usr/local/www/firewall_nat_out_edit.php:615
+msgid "If you want this rule to apply to another IP address rather than the IP address of the interface chosen above, select it here (you will need to define "
+msgstr "Se você deseja que essa regra se aplique a um outro endereço IP ao invés do endereço IP da interface escolhida acima, selecione-o aqui (é necessário definir"
+
+#: usr/local/www/firewall_nat_out_edit.php:588
+#: usr/local/www/firewall_nat_out_edit.php:601
+#: usr/local/www/firewall_nat_out_edit.php:604
+#: usr/local/www/firewall_nat_out_edit.php:616
+msgid "addresses on the interface first)."
+msgstr "endereço na interface primeiro)."
+
+#: usr/local/www/firewall_nat_out_edit.php:589
+#: usr/local/www/firewall_nat_out_edit.php:602
+msgid "Also note that if you are trying to redirect connections on the LAN select the \"any\" option."
+msgstr "Também note que se você está tentando redirecionar as conexões da LAN selecione a opção \"nenhum\"."
+
+#: usr/local/www/firewall_nat_out_edit.php:605
+#: usr/local/www/firewall_nat_out_edit.php:618
+#: usr/local/www/firewall_nat_out_edit.php:620
+#: usr/local/www/firewall_nat_out_edit.php:632
+msgid "Only Round Robin types work with Host Aliases. Any type can be used with a Subnet."
+msgstr "Somente tipos Roun Robin funcionam com Host Aliases. Quanquer tipo pode ser usado com a Sub-rede."
+
+#: usr/local/www/firewall_nat_out_edit.php:606
+#: usr/local/www/firewall_nat_out_edit.php:619
+#: usr/local/www/firewall_nat_out_edit.php:621
+#: usr/local/www/firewall_nat_out_edit.php:633
+msgid "Round Robin: Loops through the translation addresses."
+msgstr "Round Robin: Loops através de tradução de endereços."
+
+#: usr/local/www/firewall_nat_out_edit.php:607
+#: usr/local/www/firewall_nat_out_edit.php:620
+#: usr/local/www/firewall_nat_out_edit.php:622
+#: usr/local/www/firewall_nat_out_edit.php:634
+msgid "Random: Selects an address from the translation address pool at random."
+msgstr "Randômico: Seleciona um endereço para traduzir ao pool."
+
+#: usr/local/www/firewall_nat_out_edit.php:608
+#: usr/local/www/firewall_nat_out_edit.php:621
+#: usr/local/www/firewall_nat_out_edit.php:623
+#: usr/local/www/firewall_nat_out_edit.php:635
+msgid "Source Hash: Uses a hash of the source address to determine the translation address, ensuring that the redirection address is always the same for a given source."
+msgstr "Fonte Hash: Use uma fonte hash para o endereço de origem para determinar a tradução do endereço, certificando que o redirecionamento do mesmo sempre será o mesmo para dada origem."
+
+#: usr/local/www/firewall_nat_out_edit.php:609
+#: usr/local/www/firewall_nat_out_edit.php:622
+#: usr/local/www/firewall_nat_out_edit.php:624
+#: usr/local/www/firewall_nat_out_edit.php:636
+msgid "Bitmask: Applies the subnet mask and keeps the last portion identical; 10.0.1.50 -&gt; x.x.x.50."
+msgstr "BItmask: Aplica a máscara de sub-rede e mantém a última parte idêntica; 10.0.1.50 -&gt; x.x.x.50."
+
+#: usr/local/www/firewall_nat_out_edit.php:610
+#: usr/local/www/firewall_nat_out_edit.php:623
+#: usr/local/www/firewall_nat_out_edit.php:625
+#: usr/local/www/firewall_nat_out_edit.php:637
+msgid "Sticky Address: The Sticky Address option can be used with the Random and Round Robin pool types to ensure that a particular source address is always mapped to the same translation address."
+msgstr "Endereço Stick: A opção de Endereço Stick pode ser usada com o modo Randômico ou Round Robin para garantir que um determinado endereço de origem é sempre mapeado para o endereço mesma tradução."
+
+#: usr/local/www/firewall_nat_out_edit.php:615
+#: usr/local/www/firewall_nat_out_edit.php:628
+#: usr/local/www/firewall_nat_out_edit.php:630
+#: usr/local/www/firewall_nat_out_edit.php:642
+msgid "Port:"
+msgstr "Porta:"
+
+#: usr/local/www/firewall_nat_out_edit.php:619
+#: usr/local/www/firewall_nat_out_edit.php:632
+#: usr/local/www/firewall_nat_out_edit.php:634
+#: usr/local/www/firewall_nat_out_edit.php:646
+msgid "Enter the source port for the outbound NAT mapping."
+msgstr "Informe a porta de origem para o mapeamento outbound NAT."
+
+#: usr/local/www/firewall_nat_out_edit.php:622
+#: usr/local/www/firewall_nat_out_edit.php:635
+#: usr/local/www/firewall_nat_out_edit.php:637
+#: usr/local/www/firewall_nat_out_edit.php:649
+msgid "Static-port:"
+msgstr "Porta-estática:"
+
+#: usr/local/www/firewall_nat_out_edit.php:632
+#: usr/local/www/firewall_nat_out_edit.php:645
+msgid "HINT: This prevents the rule from automatically syncing to other CARP members."
+msgstr "Dica: Isso previne a regra de sincronizar automaticamente com outros membros CARP."
+
+#: usr/local/www/firewall_rules.php:52
+#: usr/local/www/firewall_rules_edit.php:628 usr/local/www/fbegin.inc:112
+#: usr/local/www/fbegin.inc:129 usr/local/www/firewall_rules_edit.php:660
+#: usr/local/www/fbegin.inc:138 usr/local/www/firewall_rules_edit.php:661
+#: usr/local/www/firewall_rules.php:49
+#: usr/local/www/firewall_rules_edit.php:664
+#: usr/local/www/diag_system_pftop.php:139 usr/local/www/fbegin.inc:130
+#: usr/local/www/firewall_rules_edit.php:676
+#: usr/local/www/firewall_rules_edit.php:724
+msgid "Rules"
+msgstr "Regras"
+
+#: usr/local/www/firewall_rules.php:129
+#: usr/local/www/firewall_rules_edit.php:828
+#: usr/local/www/firewall_rules_edit.php:863
+#: usr/local/www/firewall_rules.php:127
+#: usr/local/www/firewall_rules_edit.php:866
+#: usr/local/www/firewall_rules_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules_edit.php:925
+msgid "Echo request"
+msgstr "Requisição Echo"
+
+#: usr/local/www/firewall_rules.php:130
+#: usr/local/www/firewall_rules_edit.php:829
+#: usr/local/www/firewall_rules_edit.php:864
+#: usr/local/www/firewall_rules.php:128
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_rules_edit.php:879
+#: usr/local/www/firewall_rules_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:926
+msgid "Echo reply"
+msgstr "Resposta Echo"
+
+#: usr/local/www/firewall_rules.php:131
+#: usr/local/www/firewall_rules_edit.php:830
+#: usr/local/www/firewall_rules_edit.php:865
+#: usr/local/www/firewall_rules.php:129
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/firewall_rules_edit.php:879
+#: usr/local/www/firewall_rules_edit.php:927
+msgid "Destination unreachable"
+msgstr "Destino inalcansável"
+
+#: usr/local/www/firewall_rules.php:132
+#: usr/local/www/firewall_rules_edit.php:831
+#: usr/local/www/firewall_rules_edit.php:866
+#: usr/local/www/firewall_rules.php:130
+#: usr/local/www/firewall_rules_edit.php:869
+#: usr/local/www/firewall_rules_edit.php:881
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/firewall_rules_edit.php:928
+msgid "Source quench"
+msgstr "Source quench"
+
+#: usr/local/www/firewall_rules.php:133
+#: usr/local/www/firewall_rules_edit.php:832
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_rules.php:131
+#: usr/local/www/firewall_rules_edit.php:870
+#: usr/local/www/firewall_rules_edit.php:882
+#: usr/local/www/firewall_rules_edit.php:881
+#: usr/local/www/firewall_rules_edit.php:929
+msgid "Redirect"
+msgstr "Redirecionamento"
+
+#: usr/local/www/firewall_rules.php:134
+#: usr/local/www/firewall_rules_edit.php:833
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_rules.php:132
+#: usr/local/www/firewall_rules_edit.php:871
+#: usr/local/www/firewall_rules_edit.php:883
+#: usr/local/www/firewall_rules_edit.php:882
+#: usr/local/www/firewall_rules_edit.php:930
+msgid "Alternate Host"
+msgstr "Host alternativo"
+
+#: usr/local/www/firewall_rules.php:135
+#: usr/local/www/firewall_rules_edit.php:834
+#: usr/local/www/firewall_rules_edit.php:869
+#: usr/local/www/firewall_rules.php:133
+#: usr/local/www/firewall_rules_edit.php:872
+#: usr/local/www/firewall_rules_edit.php:884
+#: usr/local/www/firewall_rules_edit.php:883
+#: usr/local/www/firewall_rules_edit.php:931
+msgid "Router advertisement"
+msgstr "Router advertisement"
+
+#: usr/local/www/firewall_rules.php:136
+#: usr/local/www/firewall_rules_edit.php:835
+#: usr/local/www/firewall_rules_edit.php:870
+#: usr/local/www/firewall_rules.php:134
+#: usr/local/www/firewall_rules_edit.php:873
+#: usr/local/www/firewall_rules_edit.php:885
+#: usr/local/www/firewall_rules_edit.php:884
+#: usr/local/www/firewall_rules_edit.php:932
+msgid "Router solicitation"
+msgstr "Solicitação do roteador"
+
+#: usr/local/www/firewall_rules.php:137
+#: usr/local/www/firewall_rules_edit.php:836
+#: usr/local/www/firewall_rules_edit.php:871
+#: usr/local/www/firewall_rules.php:135
+#: usr/local/www/firewall_rules_edit.php:874
+#: usr/local/www/firewall_rules_edit.php:886
+#: usr/local/www/firewall_rules_edit.php:885
+#: usr/local/www/firewall_rules_edit.php:933
+msgid "Time exceeded"
+msgstr "Tempo excedido"
+
+#: usr/local/www/firewall_rules.php:138
+#: usr/local/www/firewall_rules_edit.php:837
+#: usr/local/www/firewall_rules_edit.php:872
+#: usr/local/www/firewall_rules.php:136
+#: usr/local/www/firewall_rules_edit.php:875
+#: usr/local/www/firewall_rules_edit.php:887
+#: usr/local/www/firewall_rules_edit.php:886
+#: usr/local/www/firewall_rules_edit.php:934
+msgid "Invalid IP header"
+msgstr "Cabeçalho de IP inválido"
+
+#: usr/local/www/firewall_rules.php:139
+#: usr/local/www/firewall_rules_edit.php:838
+#: usr/local/www/firewall_rules_edit.php:873
+#: usr/local/www/firewall_rules.php:137
+#: usr/local/www/firewall_rules_edit.php:876
+#: usr/local/www/firewall_rules_edit.php:888
+#: usr/local/www/firewall_rules_edit.php:887
+#: usr/local/www/firewall_rules_edit.php:935
+msgid "Timestamp"
+msgstr "Timestamp"
+
+#: usr/local/www/firewall_rules.php:140
+#: usr/local/www/firewall_rules_edit.php:839
+#: usr/local/www/firewall_rules_edit.php:874
+#: usr/local/www/firewall_rules.php:138
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules_edit.php:889
+#: usr/local/www/firewall_rules_edit.php:888
+#: usr/local/www/firewall_rules_edit.php:936
+msgid "Timestamp reply"
+msgstr "Resposta de timestamp"
+
+#: usr/local/www/firewall_rules.php:141
+#: usr/local/www/firewall_rules_edit.php:840
+#: usr/local/www/firewall_rules_edit.php:875
+#: usr/local/www/firewall_rules.php:139
+#: usr/local/www/firewall_rules_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:890
+#: usr/local/www/firewall_rules_edit.php:889
+#: usr/local/www/firewall_rules_edit.php:937
+msgid "Information request"
+msgstr "Requisição de informação"
+
+#: usr/local/www/firewall_rules.php:142
+#: usr/local/www/firewall_rules_edit.php:841
+#: usr/local/www/firewall_rules_edit.php:876
+#: usr/local/www/firewall_rules.php:140
+#: usr/local/www/firewall_rules_edit.php:879
+#: usr/local/www/firewall_rules_edit.php:891
+#: usr/local/www/firewall_rules_edit.php:890
+#: usr/local/www/firewall_rules_edit.php:938
+msgid "Information reply"
+msgstr "Resposta de informação"
+
+#: usr/local/www/firewall_rules.php:143
+#: usr/local/www/firewall_rules_edit.php:842
+#: usr/local/www/firewall_rules_edit.php:877
+#: usr/local/www/firewall_rules.php:141
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/firewall_rules_edit.php:892
+#: usr/local/www/firewall_rules_edit.php:891
+#: usr/local/www/firewall_rules_edit.php:939
+msgid "Address mask request"
+msgstr "Requisição de máscara de endereço"
+
+#: usr/local/www/firewall_rules.php:144
+#: usr/local/www/firewall_rules_edit.php:843
+#: usr/local/www/firewall_rules_edit.php:878
+#: usr/local/www/firewall_rules.php:142
+#: usr/local/www/firewall_rules_edit.php:881
+#: usr/local/www/firewall_rules_edit.php:893
+#: usr/local/www/firewall_rules_edit.php:892
+#: usr/local/www/firewall_rules_edit.php:940
+msgid "Address mask reply"
+msgstr "Resposta de máscara de endereço"
+
+#: usr/local/www/firewall_rules.php:201 usr/local/www/firewall_rules.php:205
+#: usr/local/www/firewall_rules.php:203
+#, php-format
+msgid "The settings have been applied. The firewall rules are now reloading in the background.<br/>You can also %s monitor %s the reload progress"
+msgstr "As configurações foram aplicadas. As regras de firewall estão recarregando em background agora. <br/>Você também pode %s monitorar %s o progresso."
+
+#: usr/local/www/firewall_rules.php:315 usr/local/www/firewall_rules.php:317
+#: usr/local/www/firewall_rules.php:319 usr/local/www/firewall_rules.php:321
+#: usr/local/www/firewall_rules.php:312 usr/local/www/firewall_rules.php:314
+msgid "The firewall rule configuration has been changed.<br/>You must apply the changes in order for them to take effect."
+msgstr "A configuração de regra do firewall foi modificada.<br/>Você deve aplicar as modificações para que elas tenham efeito."
+
+#: usr/local/www/firewall_rules.php:338 usr/local/www/firewall_rules.php:342
+#: usr/local/www/firewall_rules.php:335 usr/local/www/firewall_rules.php:334
+msgid "Floating"
+msgstr "Flutuante"
+
+#: usr/local/www/firewall_rules.php:359
+#: usr/local/www/load_balancer_relay_action_edit.php:510
+#: usr/local/www/load_balancer_relay_action_edit.php:509
+#: usr/local/www/firewall_rules.php:363
+#: usr/local/www/load_balancer_relay_action_edit.php:507
+#: usr/local/www/firewall_rules.php:356 usr/local/www/firewall_rules.php:354
+msgid "ID"
+msgstr "ID"
+
+#: usr/local/www/firewall_rules.php:368
+#: usr/local/www/firewall_rules_edit.php:1288 usr/local/www/interfaces.php:420
+#: usr/local/www/interfaces.php:473 usr/local/www/interfaces.php:1382
+#: usr/local/www/system_routes.php:127 usr/local/www/system_routes_edit.php:91
+#: usr/local/www/system_routes_edit.php:199
+#: usr/local/www/services_dhcp.php:655 usr/local/www/status_gateways.php:73
+#: usr/local/www/system_gateways.php:154
+#: usr/local/www/system_gateways_edit.php:376
+#: usr/local/www/services_dhcpv6.php:599
+#: usr/local/www/system_routes_edit.php:92
+#: usr/local/www/system_routes_edit.php:231
+#: usr/local/www/firewall_rules_edit.php:1355
+#: usr/local/www/firewall_rules.php:372
+#: usr/local/www/system_gateways_edit.php:397
+#: usr/local/www/services_dhcp.php:668 usr/local/www/interfaces.php:456
+#: usr/local/www/interfaces.php:509 usr/local/www/interfaces.php:1486
+#: usr/local/www/system_routes_edit.php:232
+#: usr/local/www/firewall_rules.php:365
+#: usr/local/www/system_gateways_edit.php:503
+#: usr/local/www/status_gateways.php:74 usr/local/www/services_dhcp.php:844
+#: usr/local/www/interfaces.php:453 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:1474
+#: usr/local/www/system_gateways_edit.php:506
+#: usr/local/www/firewall_rules_edit.php:1370
+#: usr/local/www/services_dhcp_edit.php:410
+#: usr/local/www/diag_traceroute.php:98 usr/local/www/system_routes.php:131
+#: usr/local/www/services_dhcp.php:858 usr/local/www/interfaces.php:441
+#: usr/local/www/interfaces.php:494 usr/local/www/interfaces.php:1487
+#: usr/local/www/system_gateways_edit.php:508
+#: usr/local/www/firewall_rules_edit.php:1377
+#: usr/local/www/services_dhcp.php:878 usr/local/www/system_routes_edit.php:95
+#: usr/local/www/system_routes_edit.php:259
+#: usr/local/www/firewall_rules.php:363 usr/local/www/interfaces.php:446
+#: usr/local/www/interfaces.php:499 usr/local/www/interfaces.php:1532
+#: usr/local/www/system_gateways_edit.php:538
+#: usr/local/www/firewall_rules_edit.php:1388
+#: usr/local/www/system_routes.php:147
+#: usr/local/www/system_routes_edit.php:261 usr/local/www/interfaces.php:442
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:1526
+#: usr/local/www/system_routes_edit.php:97
+#: usr/local/www/system_routes_edit.php:263
+#: usr/local/www/firewall_rules_edit.php:1436
+#: usr/local/www/services_dhcp.php:890 usr/local/www/interfaces.php:445
+#: usr/local/www/interfaces.php:498 usr/local/www/interfaces.php:1539
+msgid "Gateway"
+msgstr "Gateway"
+
+#: usr/local/www/firewall_rules.php:369 usr/local/www/status_queues.php:135
+#: usr/local/www/status_queues.php:142 usr/local/www/firewall_rules.php:373
+#: usr/local/www/status_queues.php:143 usr/local/www/firewall_rules.php:366
+#: usr/local/www/diag_system_pftop.php:138 usr/local/www/status_queues.php:148
+#: usr/local/www/firewall_rules.php:364 usr/local/www/status_queues.php:164
+msgid "Queue"
+msgstr "FILA"
+
+#: usr/local/www/firewall_rules.php:370
+#: usr/local/www/firewall_rules_edit.php:1261
+#: usr/local/www/firewall_rules_edit.php:1328
+#: usr/local/www/firewall_rules.php:374 usr/local/www/firewall_rules.php:367
+#: usr/local/www/firewall_rules_edit.php:1343
+#: usr/local/www/firewall_rules_edit.php:1350
+#: usr/local/www/firewall_rules.php:365
+#: usr/local/www/firewall_rules_edit.php:1361
+#: usr/local/www/firewall_rules_edit.php:1409
+msgid "Schedule"
+msgstr "Agenda"
+
+#: usr/local/www/firewall_rules.php:392 usr/local/www/firewall_rules.php:824
+#: usr/local/www/firewall_nat.php:211 usr/local/www/firewall_nat.php:334
+#: usr/local/www/firewall_rules.php:396 usr/local/www/firewall_rules.php:825
+#: usr/local/www/firewall_nat.php:216 usr/local/www/firewall_nat.php:347
+#: usr/local/www/firewall_rules.php:389 usr/local/www/firewall_rules.php:818
+#: usr/local/www/firewall_rules.php:387 usr/local/www/firewall_rules.php:820
+#: usr/local/www/firewall_nat.php:219 usr/local/www/firewall_nat.php:350
+msgid "Do you really want to delete the selected rules?"
+msgstr "Você realmente quer apagar as regras selecionadas?"
+
+#: usr/local/www/firewall_rules.php:394 usr/local/www/firewall_rules.php:794
+#: usr/local/www/firewall_rules.php:826 usr/local/www/firewall_rules.php:398
+#: usr/local/www/firewall_rules.php:795 usr/local/www/firewall_rules.php:827
+#: usr/local/www/firewall_rules.php:391 usr/local/www/firewall_rules.php:788
+#: usr/local/www/firewall_rules.php:820 usr/local/www/firewall_rules.php:390
+#: usr/local/www/firewall_rules.php:789 usr/local/www/firewall_rules.php:823
+msgid "add new rule"
+msgstr "adicionar nova regra"
+
+#: usr/local/www/firewall_rules.php:431 usr/local/www/firewall_rules.php:425
+#: usr/local/www/firewall_rules.php:418 usr/local/www/firewall_rules.php:417
+msgid "Anti-Lockout Rule"
+msgstr "Regra Anti-Lockout"
+
+#: usr/local/www/firewall_rules.php:440 usr/local/www/firewall_rules.php:469
+#: usr/local/www/firewall_rules.php:497 usr/local/www/firewall_rules.php:780
+#: usr/local/www/firewall_rules.php:434 usr/local/www/firewall_rules.php:463
+#: usr/local/www/firewall_rules.php:491 usr/local/www/firewall_rules.php:777
+#: usr/local/www/firewall_rules.php:427 usr/local/www/firewall_rules.php:456
+#: usr/local/www/firewall_rules.php:484 usr/local/www/firewall_rules.php:770
+#: usr/local/www/firewall_rules.php:426 usr/local/www/firewall_rules.php:455
+#: usr/local/www/firewall_rules.php:483
+msgid "add a new rule based on this one"
+msgstr "adicionar uma nova regra baseada nesta"
+
+#: usr/local/www/firewall_rules.php:453 usr/local/www/firewall_rules.php:447
+#: usr/local/www/firewall_rules.php:440 usr/local/www/firewall_rules.php:439
+msgid "RFC 1918 networks"
+msgstr "Redes RFC 1918"
+
+#: usr/local/www/firewall_rules.php:460 usr/local/www/interfaces.php:2414
+#: usr/local/www/firewall_rules.php:454 usr/local/www/interfaces.php:2615
+#: usr/local/www/firewall_rules.php:447 usr/local/www/interfaces.php:2603
+#: usr/local/www/interfaces.php:2633 usr/local/www/firewall_rules.php:446
+#: usr/local/www/interfaces.php:2679 usr/local/www/interfaces.php:2668
+#: usr/local/www/interfaces.php:2704
+msgid "Block private networks"
+msgstr "Bloquear redes privadas"
+
+#: usr/local/www/firewall_rules.php:481 usr/local/www/firewall_rules.php:475
+#: usr/local/www/firewall_rules.php:468 usr/local/www/firewall_rules.php:467
+msgid "Reserved/not assigned by IANA"
+msgstr "Reservado/não atribuído por IANA"
+
+#: usr/local/www/firewall_rules.php:488 usr/local/www/interfaces.php:2426
+#: usr/local/www/firewall_rules.php:482 usr/local/www/interfaces.php:2627
+#: usr/local/www/firewall_rules.php:475 usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces.php:2645 usr/local/www/firewall_rules.php:474
+#: usr/local/www/interfaces.php:2691 usr/local/www/interfaces.php:2680
+#: usr/local/www/interfaces.php:2716
+msgid "Block bogon networks"
+msgstr "Bloquear redes bogon"
+
+#: usr/local/www/firewall_rules.php:513 usr/local/www/firewall_rules.php:507
+#: usr/local/www/firewall_rules.php:500 usr/local/www/firewall_rules.php:499
+msgid "advanced settings set"
+msgstr "conjunto de configurações avançadas"
+
+#: usr/local/www/firewall_rules.php:537 usr/local/www/firewall_rules.php:531
+#: usr/local/www/firewall_rules.php:524
+msgid "click to toggle enabled/disabled status"
+msgstr "clique para alternar o status entre habilitado/desabilitado"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:846
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:845
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+msgid "Mon"
+msgstr "Seg"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_rules.php:567 usr/local/www/firewall_rules.php:560
+#: usr/local/www/firewall_rules.php:561
+msgid "Tues"
+msgstr "Ter"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:848
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:847
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+msgid "Wed"
+msgstr "Qua"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_rules.php:567 usr/local/www/firewall_rules.php:560
+#: usr/local/www/firewall_rules.php:561
+msgid "Thur"
+msgstr "Qui"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:850
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:849
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+msgid "Fri"
+msgstr "Sex"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:851
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:850
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+msgid "Sat"
+msgstr "Sab"
+
+#: usr/local/www/firewall_rules.php:573 usr/local/www/firewall_schedule.php:43
+#: usr/local/www/firewall_schedule_edit.php:69
+#: usr/local/www/firewall_schedule_edit.php:852
+#: usr/local/www/firewall_rules.php:567
+#: usr/local/www/firewall_schedule_edit.php:851
+#: usr/local/www/firewall_rules.php:560 usr/local/www/firewall_rules.php:561
+msgid "Sun"
+msgstr "Dom"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "January"
+msgstr "Janeiro"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "February"
+msgstr "Fevereiro"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "March"
+msgstr "Março"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "April"
+msgstr "Abril"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "May"
+msgstr "Maio"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "June"
+msgstr "Junho"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "July"
+msgstr "Julho"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "August"
+msgstr "Agosto"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "September"
+msgstr "Setembro"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "October"
+msgstr "Outubro"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "November"
+msgstr "Novembro"
+
+#: usr/local/www/firewall_rules.php:574 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:70
+#: usr/local/www/firewall_rules.php:568 usr/local/www/firewall_rules.php:561
+#: usr/local/www/firewall_rules.php:562
+msgid "December"
+msgstr "Dezembro"
+
+#: usr/local/www/firewall_rules.php:685 usr/local/www/firewall_rules.php:679
+#: usr/local/www/firewall_rules.php:672 usr/local/www/firewall_rules.php:671
+msgid "Traffic matching this rule is currently being denied"
+msgstr "Tráfego correspondente a essa regra está atualmente sendo negado"
+
+#: usr/local/www/firewall_rules.php:690 usr/local/www/firewall_rules.php:684
+#: usr/local/www/firewall_rules.php:677 usr/local/www/firewall_rules.php:674
+msgid "Traffic matching this rule is currently being allowed"
+msgstr "Tráfego correspondente a essa regra está sendo atualmente permitido"
+
+#: usr/local/www/firewall_rules.php:700 usr/local/www/firewall_rules.php:694
+#: usr/local/www/firewall_rules.php:687 usr/local/www/firewall_rules.php:682
+msgid "This rule is not currently active because its period has expired"
+msgstr "Essa regra não está ativa no momento porque seu período expirou"
+
+#: usr/local/www/firewall_rules.php:792 usr/local/www/firewall_rules.php:785
+#: usr/local/www/firewall_rules.php:786
+msgid "No rules are currently defined for this interface"
+msgstr "Nenhuma regra está definida para essa interface atualmente"
+
+#: usr/local/www/firewall_rules.php:793 usr/local/www/firewall_rules.php:786
+#: usr/local/www/firewall_rules.php:787
+msgid "All incoming connections on this interface will be blocked until you add pass rules."
+msgstr "Todas as conexões de entrada nessa interface serão bloqueadas até que você adicione regras de liberação."
+
+#: usr/local/www/firewall_rules.php:794 usr/local/www/firewall_rules.php:795
+#: usr/local/www/firewall_rules.php:788 usr/local/www/firewall_rules.php:789
+msgid "Click the"
+msgstr "Clique em"
+
+#: usr/local/www/firewall_rules.php:794 usr/local/www/firewall_rules.php:795
+#: usr/local/www/firewall_rules.php:788 usr/local/www/firewall_rules.php:789
+msgid " button to add a new rule."
+msgstr " para adicionar uma nova regra."
+
+#: usr/local/www/firewall_rules.php:817 usr/local/www/firewall_nat.php:327
+#: usr/local/www/firewall_rules.php:818 usr/local/www/firewall_nat.php:340
+#: usr/local/www/firewall_rules.php:811 usr/local/www/firewall_rules.php:813
+#: usr/local/www/firewall_nat.php:343
+msgid "move selected rules to end"
+msgstr "mover regras selecionadas para o fim"
+
+#: usr/local/www/firewall_rules.php:835 usr/local/www/firewall_nat.php:345
+#: usr/local/www/firewall_rules.php:836 usr/local/www/firewall_nat.php:358
+#: usr/local/www/firewall_rules.php:829 usr/local/www/firewall_rules.php:832
+#: usr/local/www/firewall_nat.php:361
+msgid "pass"
+msgstr "liberar"
+
+#: usr/local/www/firewall_rules.php:838 usr/local/www/firewall_rules.php:839
+#: usr/local/www/firewall_rules.php:832 usr/local/www/firewall_rules.php:835
+msgid "block"
+msgstr "bloquear"
+
+#: usr/local/www/firewall_rules.php:841 usr/local/www/license.php:125
+#: usr/local/www/firewall_rules.php:842 usr/local/www/firewall_rules.php:835
+#: usr/local/www/firewall_rules.php:838
+msgid "reject"
+msgstr "rejeitar"
+
+#: usr/local/www/firewall_rules.php:844 usr/local/www/firewall_rules.php:845
+#: usr/local/www/firewall_rules.php:838 usr/local/www/firewall_rules.php:841
+msgid "log"
+msgstr "log"
+
+#: usr/local/www/firewall_rules.php:848 usr/local/www/firewall_rules.php:849
+#: usr/local/www/firewall_rules.php:842 usr/local/www/firewall_rules.php:845
+msgid "pass (disabled)"
+msgstr "liberação (desabilitado)"
+
+#: usr/local/www/firewall_rules.php:851 usr/local/www/firewall_rules.php:852
+#: usr/local/www/firewall_rules.php:845 usr/local/www/firewall_rules.php:848
+msgid "block (disabled)"
+msgstr "bloqueio (desabilitado)"
+
+#: usr/local/www/firewall_rules.php:854 usr/local/www/firewall_rules.php:855
+#: usr/local/www/firewall_rules.php:848 usr/local/www/firewall_rules.php:851
+msgid "reject (disabled)"
+msgstr "rejeitado (desabilitado)"
+
+#: usr/local/www/firewall_rules.php:857 usr/local/www/firewall_rules.php:858
+#: usr/local/www/firewall_rules.php:851 usr/local/www/firewall_rules.php:854
+msgid "log (disabled)"
+msgstr "log (desabilitado)"
+
+#: usr/local/www/firewall_rules.php:863
+#: usr/local/www/load_balancer_pool.php:148 usr/local/www/vpn_l2tp.php:354
+#: usr/local/www/vpn_l2tp.php:371 usr/local/www/firewall_rules.php:864
+#: usr/local/www/load_balancer_pool.php:149
+#: usr/local/www/firewall_rules.php:857 usr/local/www/vpn_l2tp.php:355
+#: usr/local/www/vpn_l2tp.php:372 usr/local/www/load_balancer_pool.php:147
+#: usr/local/www/vpn_l2tp.php:358 usr/local/www/vpn_l2tp.php:375
+#: usr/local/www/firewall_rules.php:860
+msgid "Hint:"
+msgstr "Dica:"
+
+#: usr/local/www/firewall_rules.php:867 usr/local/www/firewall_rules.php:868
+#: usr/local/www/firewall_rules.php:861 usr/local/www/firewall_rules.php:864
+msgid "Rules are evaluated on a first-match basis (i.e. the action of the first rule to match a packet will be executed). This means that if you use block rules, you'll have to pay attention to the rule order. Everything that isn't explicitly passed is blocked by default. "
+msgstr "Regras são avaliadas na primeira correspondência (i.e. a ação da primeira regra que corresponder a um pacote será executada). Isso significa que se você usar regras de bloquei, você terá que prestar atenção da ordem das regras. Tudo que não estiver explícitamente liberado é bloqueado por padrão."
+
+#: usr/local/www/firewall_rules.php:874 usr/local/www/firewall_rules.php:875
+#: usr/local/www/firewall_rules.php:868 usr/local/www/firewall_rules.php:871
+msgid "Floating rules are evaluated on a first-match basis (i.e. the action of the first rule to match a packet will be executed) only if the 'quick' option is checked on a rule. Otherwise they will only apply if no other rules match. Pay close attention to the rule order and options chosen. If no rule here matches, the per-interface or default rules are used. "
+msgstr "Regras flutuantes são avaliadas com base no first-match (ex.: a ação da primeira regra que corresponder a um pacote será executada) apenas se a opção 'quick' estiver marcada em uma regra. Caso contrário elas serão aplicadas apenas se nenhuma outra regra corresponder. Preste muita atenção na ordem das regras e opções escolhidas. Se nenhuma regra corresponder, as regras por interface ou padrão serão usadas."
+
+#: usr/local/www/firewall_rules_edit.php:201
+#: usr/local/www/firewall_rules_edit.php:210
+msgid "Reject type rules only works when the protocol is set to TCP."
+msgstr "Tipo de regras rejeitadas somente funcionam quando o protocolo é configurado para TCP."
+
+#: usr/local/www/firewall_rules_edit.php:204
+#: usr/local/www/firewall_rules_edit.php:213
+#: usr/local/www/firewall_rules_edit.php:210
+msgid "Queue type rules only work with queues."
+msgstr "Regras do tipo fila só funcionam com filas."
+
+#: usr/local/www/firewall_rules_edit.php:212
+#: usr/local/www/firewall_rules_edit.php:227
+#: usr/local/www/firewall_rules_edit.php:225
+#: usr/local/www/firewall_rules_edit.php:222
+#: usr/local/www/firewall_rules_edit.php:228
+msgid "You can not assign a IPv4 gateway group on IPv6 Address Family rule"
+msgstr "Você não pode associar um grupo de gateways IPv4 a um endereço da família IPv6"
+
+#: usr/local/www/firewall_rules_edit.php:215
+#: usr/local/www/firewall_rules_edit.php:230
+#: usr/local/www/firewall_rules_edit.php:228
+#: usr/local/www/firewall_rules_edit.php:225
+#: usr/local/www/firewall_rules_edit.php:231
+msgid "You can not assign a IPv6 gateway group on IPv4 Address Family rule"
+msgstr "Você não pode associar um grupo de gateways IPv6 a um endereço da família IPv4"
+
+#: usr/local/www/firewall_rules_edit.php:222
+#: usr/local/www/firewall_rules_edit.php:240
+#: usr/local/www/firewall_rules_edit.php:239
+#: usr/local/www/firewall_rules_edit.php:236
+#: usr/local/www/firewall_rules_edit.php:242
+msgid "You can not assign the IPv4 Gateway to a IPv6 Filter rule"
+msgstr "Você não pode associar um gateway IPv4 a uma regra de filtro IPv6"
+
+#: usr/local/www/firewall_rules_edit.php:225
+#: usr/local/www/firewall_rules_edit.php:243
+#: usr/local/www/firewall_rules_edit.php:242
+#: usr/local/www/firewall_rules_edit.php:239
+#: usr/local/www/firewall_rules_edit.php:245
+msgid "You can not assign the IPv6 Gateway to a IPv4 Filter rule"
+msgstr "Você não pode associar um gateway IPv6 a uma regra de filtro IPv4"
+
+#: usr/local/www/firewall_rules_edit.php:297
+#: usr/local/www/firewall_rules_edit.php:321
+#: usr/local/www/firewall_rules_edit.php:320
+#: usr/local/www/firewall_rules_edit.php:323
+#: usr/local/www/firewall_rules_edit.php:329
+#, php-format
+msgid "%s is only valid with protocol TCP."
+msgstr "%s é válido somente com o protocolo TCP."
+
+#: usr/local/www/firewall_rules_edit.php:299
+#: usr/local/www/firewall_rules_edit.php:323
+#: usr/local/www/firewall_rules_edit.php:322
+#: usr/local/www/firewall_rules_edit.php:325
+#: usr/local/www/firewall_rules_edit.php:331
+#, php-format
+msgid "%s is only valid if the gateway is set to 'default'."
+msgstr "%s somente é valido se o gateway estiver configurado para 'padrão'."
+
+#: usr/local/www/firewall_rules_edit.php:327
+#: usr/local/www/firewall_rules_edit.php:351
+#: usr/local/www/firewall_rules_edit.php:350
+#: usr/local/www/firewall_rules_edit.php:353
+#: usr/local/www/firewall_rules_edit.php:359
+#, php-format
+msgid "%s is not a valid end source port. It must be a port alias or integer between 1 and 65535."
+msgstr "%s não é um fim de porta de origem válido. Ele deve ser um alias de porta ou um inteiro entre 1 e 65535."
+
+#: usr/local/www/firewall_rules_edit.php:381
+#: usr/local/www/firewall_rules_edit.php:410
+#: usr/local/www/firewall_rules_edit.php:409
+#: usr/local/www/firewall_rules_edit.php:412
+#: usr/local/www/firewall_rules_edit.php:418
+#, php-format
+msgid "The Source IP address %s Address Family differs from the destination %s."
+msgstr "A família do endereço IP de origem %s defere do destino %s."
+
+#: usr/local/www/firewall_rules_edit.php:383
+#: usr/local/www/firewall_rules_edit.php:412
+#: usr/local/www/firewall_rules_edit.php:411
+#: usr/local/www/firewall_rules_edit.php:414
+#: usr/local/www/firewall_rules_edit.php:420
+msgid "You can not use IPv6 addresses in IPv4 rules."
+msgstr "Você não pode usar endereços IPv6 em regras IPv4."
+
+#: usr/local/www/firewall_rules_edit.php:385
+#: usr/local/www/firewall_rules_edit.php:414
+#: usr/local/www/firewall_rules_edit.php:413
+#: usr/local/www/firewall_rules_edit.php:416
+#: usr/local/www/firewall_rules_edit.php:422
+msgid "You can not use IPv4 addresses in IPv6 rules."
+msgstr "Você não pode utilizar endereços IPv4 em regras IPv6."
+
+#: usr/local/www/firewall_rules_edit.php:402
+#: usr/local/www/firewall_rules_edit.php:434
+#: usr/local/www/firewall_rules_edit.php:433
+#: usr/local/www/firewall_rules_edit.php:436
+#: usr/local/www/firewall_rules_edit.php:442
+msgid "OS detection is only valid with protocol TCP."
+msgstr "Detecção de OS somente é válida com o protocolo tcp."
+
+#: usr/local/www/firewall_rules_edit.php:406
+#: usr/local/www/firewall_rules_edit.php:438
+#: usr/local/www/firewall_rules_edit.php:437
+#: usr/local/www/firewall_rules_edit.php:440
+#: usr/local/www/firewall_rules_edit.php:446
+msgid "You have to select a queue when you select an acknowledge queue too."
+msgstr "Você selecionou uma fila quando selecionou uma fila de reconhecimento também."
+
+#: usr/local/www/firewall_rules_edit.php:408
+#: usr/local/www/firewall_rules_edit.php:440
+#: usr/local/www/firewall_rules_edit.php:439
+#: usr/local/www/firewall_rules_edit.php:442
+#: usr/local/www/firewall_rules_edit.php:448
+msgid "Acknowledge queue and Queue cannot be the same."
+msgstr "Fila de reconhecimento e a Fila não podem ser a mesma."
+
+#: usr/local/www/firewall_rules_edit.php:411
+#: usr/local/www/firewall_rules_edit.php:443
+#: usr/local/www/firewall_rules_edit.php:442
+#: usr/local/www/firewall_rules_edit.php:445
+#: usr/local/www/firewall_rules_edit.php:451
+msgid "You can not use limiters in Floating rules without choosing a direction."
+msgstr "Você não pode usar limites em regras Flutuantes sem escolher uma direção."
+
+#: usr/local/www/firewall_rules_edit.php:413
+#: usr/local/www/firewall_rules_edit.php:445
+#: usr/local/www/firewall_rules_edit.php:444
+#: usr/local/www/firewall_rules_edit.php:447
+#: usr/local/www/firewall_rules_edit.php:453
+msgid "You can not use gateways in Floating rules without choosing a direction."
+msgstr "Você não pode usar gateways em regras Flutuantes sem escolher uma direção."
+
+#: usr/local/www/firewall_rules_edit.php:416
+#: usr/local/www/firewall_rules_edit.php:448
+#: usr/local/www/firewall_rules_edit.php:447
+#: usr/local/www/firewall_rules_edit.php:450
+#: usr/local/www/firewall_rules_edit.php:456
+msgid "You must select a queue for the In direction before selecting one for Out too."
+msgstr "Você deve selecionar uma fila para a direção de Dentro antes de selecionar para Fora também."
+
+#: usr/local/www/firewall_rules_edit.php:418
+#: usr/local/www/firewall_rules_edit.php:450
+#: usr/local/www/firewall_rules_edit.php:449
+#: usr/local/www/firewall_rules_edit.php:452
+#: usr/local/www/firewall_rules_edit.php:458
+msgid "In and Out Queue cannot be the same."
+msgstr "Filas para Dentro e Fora não podem ser a mesma."
+
+#: usr/local/www/firewall_rules_edit.php:420
+#: usr/local/www/firewall_rules_edit.php:422
+#: usr/local/www/firewall_rules_edit.php:452
+#: usr/local/www/firewall_rules_edit.php:454
+#: usr/local/www/firewall_rules_edit.php:451
+#: usr/local/www/firewall_rules_edit.php:453
+#: usr/local/www/firewall_rules_edit.php:456
+#: usr/local/www/firewall_rules_edit.php:460
+#: usr/local/www/firewall_rules_edit.php:462
+msgid "You cannot select one queue and one virtual interface for IN and Out. both must be from the same type."
+msgstr "Você não pode selecionar uma fila e uma interface virtual para Entrada e Saída. As duas devem ser do mesmo tipo."
+
+#: usr/local/www/firewall_rules_edit.php:425
+#: usr/local/www/firewall_rules_edit.php:457
+#: usr/local/www/firewall_rules_edit.php:458
+#: usr/local/www/firewall_rules_edit.php:461
+#: usr/local/www/firewall_rules_edit.php:467
+msgid "ID must be an integer"
+msgstr "ID deve ser um inteiro"
+
+#: usr/local/www/firewall_rules_edit.php:428
+#: usr/local/www/firewall_rules_edit.php:460
+#: usr/local/www/firewall_rules_edit.php:461
+#: usr/local/www/firewall_rules_edit.php:464
+#: usr/local/www/firewall_rules_edit.php:470
+msgid "You can only select a layer7 container for TCP and/or UDP protocols"
+msgstr "Você somente pode selecionar um conteiner layer7 para TCP e/ou protocolos UDP"
+
+#: usr/local/www/firewall_rules_edit.php:430
+#: usr/local/www/firewall_rules_edit.php:462
+#: usr/local/www/firewall_rules_edit.php:463
+#: usr/local/www/firewall_rules_edit.php:466
+#: usr/local/www/firewall_rules_edit.php:472
+msgid "You can only select a layer7 container for Pass type rules."
+msgstr "Você somente pode selecionar um conteiner layer7 para regras de tipo Liberação."
+
+#: usr/local/www/firewall_rules_edit.php:443
+#: usr/local/www/firewall_rules_edit.php:475
+#: usr/local/www/firewall_rules_edit.php:476
+#: usr/local/www/firewall_rules_edit.php:479
+#: usr/local/www/firewall_rules_edit.php:485
+#: usr/local/www/firewall_rules_edit.php:533
+msgid "If you specify TCP flags that should be set you should specify out of which flags as well."
+msgstr "Se você especificar flags TCP que devem ser configurados, você deve especificar de quaisflags também."
+
+#: usr/local/www/firewall_rules_edit.php:652
+#: usr/local/www/firewall_rules_edit.php:685
+#: usr/local/www/firewall_rules_edit.php:688
+#: usr/local/www/firewall_rules_edit.php:700
+#: usr/local/www/firewall_rules_edit.php:748
+msgid "Edit Firewall rule"
+msgstr "Editar regras de Firewall"
+
+#: usr/local/www/firewall_rules_edit.php:673
+#: usr/local/www/firewall_rules_edit.php:706
+#: usr/local/www/firewall_rules_edit.php:709
+#: usr/local/www/firewall_rules_edit.php:721
+#: usr/local/www/firewall_rules_edit.php:769
+msgid "Choose what to do with packets that match the criteria specified below."
+msgstr "Escolha o que fazer com os pacotes que correspondem aos critérios especificados abaixo."
+
+#: usr/local/www/firewall_rules_edit.php:674
+#: usr/local/www/firewall_rules_edit.php:707
+#: usr/local/www/firewall_rules_edit.php:710
+#: usr/local/www/firewall_rules_edit.php:722
+#: usr/local/www/firewall_rules_edit.php:770
+msgid "Hint: the difference between block and reject is that with reject, a packet (TCP RST or ICMP port unreachable for UDP) is returned to the sender, whereas with block the packet is dropped silently. In either case, the original packet is discarded."
+msgstr "Dica: a diferença entre bloqueado e rejeitado é que com rejeitado, um pacote (TCP RST ou porta ICMP inalcansável para UDP) é retornada para quem enviou, enquanto que com bloqueado, o pacote é descartado silenciosamente. Em qualquer um dos casos, o pacote original é descartado."
+
+#: usr/local/www/firewall_rules_edit.php:689
+#: usr/local/www/firewall_rules_edit.php:722
+#: usr/local/www/firewall_rules_edit.php:725
+#: usr/local/www/firewall_rules_edit.php:737
+#: usr/local/www/firewall_rules_edit.php:785
+msgid "Quick"
+msgstr "Rápido"
+
+#: usr/local/www/firewall_rules_edit.php:693
+#: usr/local/www/firewall_rules_edit.php:726
+#: usr/local/www/firewall_rules_edit.php:729
+#: usr/local/www/firewall_rules_edit.php:741
+#: usr/local/www/firewall_rules_edit.php:789
+msgid "Apply the action immediately on match."
+msgstr "Aplicar a ação imediatamente após correspondência."
+
+#: usr/local/www/firewall_rules_edit.php:694
+#: usr/local/www/firewall_rules_edit.php:727
+#: usr/local/www/firewall_rules_edit.php:730
+#: usr/local/www/firewall_rules_edit.php:742
+#: usr/local/www/firewall_rules_edit.php:790
+msgid "Set this option if you need to apply this action to traffic that matches this rule immediately."
+msgstr "Configure essa opção se precisar aplicar essa ação ao tráfego que corresponder imediatamente a essa regra."
+
+#: usr/local/www/firewall_rules_edit.php:701
+#: usr/local/www/firewall_rules_edit.php:734
+#: usr/local/www/firewall_rules_edit.php:737
+#: usr/local/www/firewall_rules_edit.php:749
+#: usr/local/www/firewall_rules_edit.php:797
+msgid "Associated filter rule"
+msgstr "Regra de filtro associada"
+
+#: usr/local/www/firewall_rules_edit.php:703
+#: usr/local/www/diag_traceroute.php:117 usr/local/www/diag_traceroute.php:137
+#: usr/local/www/firewall_rules_edit.php:736
+#: usr/local/www/firewall_rules_edit.php:739
+#: usr/local/www/diag_traceroute.php:141
+#: usr/local/www/firewall_rules_edit.php:751
+#: usr/local/www/diag_traceroute.php:161
+#: usr/local/www/firewall_rules_edit.php:799
+msgid "Note: "
+msgstr "Nota:"
+
+#: usr/local/www/firewall_rules_edit.php:703
+#: usr/local/www/firewall_rules_edit.php:736
+#: usr/local/www/firewall_rules_edit.php:739
+#: usr/local/www/firewall_rules_edit.php:751
+#: usr/local/www/firewall_rules_edit.php:799
+msgid "This is associated to a NAT rule."
+msgstr "Isto está associado à regra NAT."
+
+#: usr/local/www/firewall_rules_edit.php:704
+#: usr/local/www/firewall_rules_edit.php:737
+#: usr/local/www/firewall_rules_edit.php:740
+#: usr/local/www/firewall_rules_edit.php:752
+#: usr/local/www/firewall_rules_edit.php:800
+msgid "You cannot edit the interface, protocol, source, or destination of associated filter rules."
+msgstr "Você não pode editar a interface, protocolo, fonte ou destino de regras de filtro associadas."
+
+#: usr/local/www/firewall_rules_edit.php:711
+#: usr/local/www/firewall_rules_edit.php:744
+#: usr/local/www/firewall_rules_edit.php:747
+#: usr/local/www/firewall_rules_edit.php:759
+#: usr/local/www/firewall_rules_edit.php:807
+msgid "View the NAT rule"
+msgstr "Veja a regra NAT"
+
+#: usr/local/www/firewall_rules_edit.php:768
+#: usr/local/www/firewall_rules_edit.php:803
+#: usr/local/www/firewall_rules_edit.php:806
+#: usr/local/www/firewall_rules_edit.php:818
+#: usr/local/www/firewall_rules_edit.php:817
+#: usr/local/www/firewall_rules_edit.php:865
+msgid "Choose on which interface packets must come in to match this rule."
+msgstr "Escolha quais pacotes de interface devem entrar para corresponder a essa regra."
+
+#: usr/local/www/firewall_rules_edit.php:774
+#: usr/local/www/services_captiveportal_ip_edit.php:178
+#: usr/local/www/diag_ipsec_spd.php:88
+#: usr/local/www/load_balancer_relay_action_edit.php:117
+#: usr/local/www/load_balancer_relay_action_edit.php:443
+#: usr/local/www/services_captiveportal_hostname_edit.php:160
+#: usr/local/www/load_balancer_relay_action_edit.php:442
+#: usr/local/www/firewall_rules_edit.php:809
+#: usr/local/www/services_captiveportal_hostname_edit.php:158
+#: usr/local/www/load_balancer_relay_action_edit.php:440
+#: usr/local/www/services_captiveportal_ip_edit.php:176
+#: usr/local/www/diag_ipsec_spd.php:89
+#: usr/local/www/firewall_rules_edit.php:812
+#: usr/local/www/firewall_rules_edit.php:824
+#: usr/local/www/firewall_rules_edit.php:823
+#: usr/local/www/firewall_rules_edit.php:871
+msgid "Direction"
+msgstr "Direção"
+
+#: usr/local/www/firewall_rules_edit.php:792
+#: usr/local/www/firewall_rules_edit.php:827
+#: usr/local/www/firewall_rules_edit.php:830
+#: usr/local/www/firewall_rules_edit.php:842
+#: usr/local/www/firewall_rules_edit.php:841
+#: usr/local/www/firewall_rules_edit.php:889
+msgid "TCP/IP Version"
+msgstr "Versão TCP/IP"
+
+#: usr/local/www/firewall_rules_edit.php:804
+#: usr/local/www/firewall_rules_edit.php:839
+#: usr/local/www/firewall_rules_edit.php:842
+#: usr/local/www/firewall_rules_edit.php:854
+#: usr/local/www/firewall_rules_edit.php:853
+#: usr/local/www/firewall_rules_edit.php:901
+msgid "Select the Internet Protocol version this rule applies to"
+msgstr "Selecione a versão do Internet Protocol a qual esta regra se aplica"
+
+#: usr/local/www/firewall_rules_edit.php:818
+#: usr/local/www/firewall_rules_edit.php:853
+#: usr/local/www/firewall_rules_edit.php:856
+#: usr/local/www/firewall_rules_edit.php:868
+#: usr/local/www/firewall_rules_edit.php:867
+#: usr/local/www/firewall_rules_edit.php:915
+msgid "Hint: in most cases, you should specify "
+msgstr "Dica: na maioria dos casos, você deve especificar "
+
+#: usr/local/www/firewall_rules_edit.php:822
+#: usr/local/www/firewall_rules_edit.php:857
+#: usr/local/www/firewall_rules_edit.php:860
+#: usr/local/www/firewall_rules_edit.php:872
+#: usr/local/www/firewall_rules_edit.php:871
+#: usr/local/www/firewall_rules_edit.php:919
+msgid "ICMP type"
+msgstr "Tipo ICMP"
+
+#: usr/local/www/firewall_rules_edit.php:851
+#: usr/local/www/firewall_rules_edit.php:886
+#: usr/local/www/firewall_rules_edit.php:889
+#: usr/local/www/firewall_rules_edit.php:901
+#: usr/local/www/firewall_rules_edit.php:900
+#: usr/local/www/firewall_rules_edit.php:948
+msgid "If you selected ICMP for the protocol above, you may specify an ICMP type here."
+msgstr "Se você selecionar ICMP para o protocolo acima, você deve especificar um tipo ICMP aqui."
+
+#: usr/local/www/firewall_rules_edit.php:885
+#: usr/local/www/firewall_rules_edit.php:920
+#: usr/local/www/firewall_rules_edit.php:929
+#: usr/local/www/firewall_rules_edit.php:941
+#: usr/local/www/firewall_rules_edit.php:940
+#: usr/local/www/firewall_rules_edit.php:988
+msgid " subnet"
+msgstr " subrede"
+
+#: usr/local/www/firewall_rules_edit.php:908
+#: usr/local/www/firewall_rules_edit.php:943
+#: usr/local/www/firewall_rules_edit.php:952
+#: usr/local/www/firewall_rules_edit.php:964
+#: usr/local/www/firewall_rules_edit.php:963
+#: usr/local/www/firewall_rules_edit.php:1011
+msgid "Show source port range"
+msgstr "Mostrar intervalo de porta de origem"
+
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1048
+msgid "Specify the source port or port range for this rule."
+msgstr "Especificar a porta de origem ou o intervalo de porta para essa regra."
+
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1048
+msgid "and almost never equal to the destination port range (and should usually be"
+msgstr "e quase nunca igual ao intervalo de porta de destino (e deve normalmente ser"
+
+#: usr/local/www/firewall_rules_edit.php:944
+#: usr/local/www/firewall_rules_edit.php:1039
+#: usr/local/www/firewall_rules_edit.php:979
+#: usr/local/www/firewall_rules_edit.php:1074
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_rules_edit.php:1089
+#: usr/local/www/firewall_rules_edit.php:1001
+#: usr/local/www/firewall_rules_edit.php:1102
+#: usr/local/www/firewall_rules_edit.php:1000
+#: usr/local/www/firewall_rules_edit.php:1101
+#: usr/local/www/firewall_rules_edit.php:1048
+#: usr/local/www/firewall_rules_edit.php:1149
+msgid "'to'"
+msgstr "'para'"
+
+#: usr/local/www/firewall_rules_edit.php:1005
+#: usr/local/www/firewall_rules_edit.php:1040
+#: usr/local/www/firewall_rules_edit.php:1055
+#: usr/local/www/firewall_rules_edit.php:1068
+#: usr/local/www/firewall_rules_edit.php:1067
+#: usr/local/www/firewall_rules_edit.php:1115
+msgid "Destination port range "
+msgstr "Intervalo de porta de destino "
+
+#: usr/local/www/firewall_rules_edit.php:1037
+#: usr/local/www/firewall_rules_edit.php:1072
+#: usr/local/www/firewall_rules_edit.php:1087
+#: usr/local/www/firewall_rules_edit.php:1100
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/firewall_rules_edit.php:1147
+msgid "Specify the port or port range for the destination of the packet for this rule."
+msgstr "Especifique a porta ou o intervalo de portas para o destino do pacote para essa regra."
+
+#: usr/local/www/firewall_rules_edit.php:1039
+#: usr/local/www/firewall_rules_edit.php:1074
+#: usr/local/www/firewall_rules_edit.php:1089
+#: usr/local/www/firewall_rules_edit.php:1102
+#: usr/local/www/firewall_rules_edit.php:1101
+#: usr/local/www/firewall_rules_edit.php:1149
+msgid "field empty if you only want to filter a single port"
+msgstr "campo vazio se você somente quiser filtrar uma única porta"
+
+#: usr/local/www/firewall_rules_edit.php:1044
+#: usr/local/www/firewall_rules_edit.php:1079
+#: usr/local/www/firewall_rules_edit.php:1094
+#: usr/local/www/firewall_rules_edit.php:1107
+#: usr/local/www/firewall_rules_edit.php:1106
+#: usr/local/www/firewall_rules_edit.php:1154
+msgid "Log"
+msgstr "Log"
+
+#: usr/local/www/firewall_rules_edit.php:1047
+#: usr/local/www/firewall_rules_edit.php:1082
+#: usr/local/www/firewall_rules_edit.php:1097
+#: usr/local/www/firewall_rules_edit.php:1110
+#: usr/local/www/firewall_rules_edit.php:1109
+#: usr/local/www/firewall_rules_edit.php:1157
+msgid "Log packets that are handled by this rule"
+msgstr "Pacotes de log que são tratados por essa regra"
+
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/firewall_rules_edit.php:1111
+#: usr/local/www/firewall_rules_edit.php:1159
+msgid "Hint: the firewall has limited local log space. Don't turn on logging for everything. If you want to do a lot of logging, consider using a remote syslog server"
+msgstr "Dica: o firewall tem um espaço limitado para log. Não habilite os logs para tudo. Se você quiser fazer muito log, considere usar um servidor syslog remoto"
+
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/firewall_rules_edit.php:1111
+#: usr/local/www/firewall_rules_edit.php:1159
+msgid "see the"
+msgstr "veja o"
+
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/firewall_rules_edit.php:1111
+#: usr/local/www/firewall_rules_edit.php:1159
+msgid "Diagnostics: System logs: Settings"
+msgstr "Diagnóstico: Logs de sistema: Configurações"
+
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/services_captiveportal.php:908
+#: usr/local/www/system_advanced_firewall.php:289
+#: usr/local/www/firewall_rules_edit.php:1084
+#: usr/local/www/system_advanced_firewall.php:303
+#: usr/local/www/services_captiveportal.php:953
+#: usr/local/www/services_captiveportal.php:949
+#: usr/local/www/firewall_rules_edit.php:1099
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/services_captiveportal.php:951
+#: usr/local/www/firewall_rules_edit.php:1112
+#: usr/local/www/system_advanced_firewall.php:333
+#: usr/local/www/services_captiveportal.php:967
+#: usr/local/www/firewall_rules_edit.php:1111
+#: usr/local/www/firewall_rules_edit.php:1159
+#: usr/local/www/system_advanced_firewall.php:344
+msgid "page"
+msgstr "página"
+
+#: usr/local/www/firewall_rules_edit.php:1057
+#: usr/local/www/services_unbound_acls.php:296
+#: usr/local/www/firewall_rules_edit.php:1092
+#: usr/local/www/firewall_rules_edit.php:1107
+#: usr/local/www/firewall_rules_edit.php:1120
+#: usr/local/www/firewall_rules_edit.php:1119
+#: usr/local/www/firewall_rules_edit.php:1167
+msgid "You may enter a description here for your reference."
+msgstr "Você deve informar com uma descrição para sua referência."
+
+#: usr/local/www/firewall_rules_edit.php:1080
+#: usr/local/www/firewall_rules_edit.php:1115
+#: usr/local/www/firewall_rules_edit.php:1130
+#: usr/local/www/firewall_rules_edit.php:1143
+#: usr/local/www/firewall_rules_edit.php:1142
+#: usr/local/www/firewall_rules_edit.php:1190
+msgid "Source OS"
+msgstr "Fonte OS"
+
+#: usr/local/www/firewall_rules_edit.php:1086
+#: usr/local/www/firewall_rules_edit.php:1121
+#: usr/local/www/firewall_rules_edit.php:1136
+#: usr/local/www/firewall_rules_edit.php:1149
+#: usr/local/www/firewall_rules_edit.php:1148
+#: usr/local/www/firewall_rules_edit.php:1196
+msgid "OS Type:"
+msgstr "Tipo OS:"
+
+#: usr/local/www/firewall_rules_edit.php:1109
+#: usr/local/www/firewall_rules_edit.php:1144
+#: usr/local/www/firewall_rules_edit.php:1159
+#: usr/local/www/firewall_rules_edit.php:1172
+#: usr/local/www/firewall_rules_edit.php:1171
+#: usr/local/www/firewall_rules_edit.php:1219
+msgid "Note: this only works for TCP rules"
+msgstr "Nota: isso somente funciona para regras TCP"
+
+#: usr/local/www/firewall_rules_edit.php:1114
+#: usr/local/www/firewall_rules_edit.php:1149
+#: usr/local/www/firewall_rules_edit.php:1164
+#: usr/local/www/firewall_rules_edit.php:1177
+#: usr/local/www/firewall_rules_edit.php:1176
+#: usr/local/www/firewall_rules_edit.php:1224
+msgid "Diffserv Code Point"
+msgstr "Diff Code Point"
+
+#: usr/local/www/firewall_rules_edit.php:1130
+#: usr/local/www/interfaces_ppps_edit.php:675
+#: usr/local/www/vpn_ipsec_phase1.php:806
+#: usr/local/www/vpn_ipsec_phase2.php:629
+#: usr/local/www/firewall_rules_edit.php:1165
+#: usr/local/www/vpn_ipsec_phase2.php:655
+#: usr/local/www/vpn_ipsec_phase1.php:819
+#: usr/local/www/interfaces_ppps_edit.php:676
+#: usr/local/www/vpn_ipsec_phase2.php:751
+#: usr/local/www/vpn_ipsec_phase1.php:816
+#: usr/local/www/firewall_rules_edit.php:1180
+#: usr/local/www/interfaces_ppps_edit.php:682
+#: usr/local/www/vpn_ipsec_phase1.php:837
+#: usr/local/www/vpn_ipsec_phase2.php:772
+#: usr/local/www/firewall_rules_edit.php:1193
+#: usr/local/www/firewall_rules_edit.php:1192
+#: usr/local/www/interfaces_ppps_edit.php:680
+#: usr/local/www/firewall_rules_edit.php:1240
+msgid "Advanced Options"
+msgstr "Opções Avançadas"
+
+#: usr/local/www/firewall_rules_edit.php:1137
+#: usr/local/www/firewall_rules_edit.php:1172
+#: usr/local/www/firewall_rules_edit.php:1187
+#: usr/local/www/firewall_rules_edit.php:1200
+#: usr/local/www/firewall_rules_edit.php:1199
+#: usr/local/www/firewall_rules_edit.php:1247
+msgid "This allows packets with IP options to pass. Otherwise they are blocked by default. This is usually only seen with multicast traffic."
+msgstr "Isso permite que pacotes com opções de IP passem. Do contrário eles são bloqueados por padrão. Isso normalmente somente é visto com tráfego multicast."
+
+#: usr/local/www/firewall_rules_edit.php:1140
+#: usr/local/www/firewall_rules_edit.php:1175
+#: usr/local/www/firewall_rules_edit.php:1190
+#: usr/local/www/firewall_rules_edit.php:1203
+#: usr/local/www/firewall_rules_edit.php:1202
+#: usr/local/www/firewall_rules_edit.php:1250
+msgid "This will disable auto generated reply-to for this rule."
+msgstr "Isso irá desabilitar auto geração de respostas para essa regra."
+
+#: usr/local/www/firewall_rules_edit.php:1143
+#: usr/local/www/firewall_rules_edit.php:1178
+#: usr/local/www/firewall_rules_edit.php:1193
+#: usr/local/www/firewall_rules_edit.php:1206
+#: usr/local/www/firewall_rules_edit.php:1205
+#: usr/local/www/firewall_rules_edit.php:1253
+msgid "You can mark a packet matching this rule and use this mark to match on other NAT/filter rules. It is called"
+msgstr "Você pode marcar um pacote que corresponda a essa regra e use essa marca para corresponder a outras regras NAT/filtros. Chama-se"
+
+#: usr/local/www/firewall_rules_edit.php:1143
+#: usr/local/www/firewall_rules_edit.php:1178
+#: usr/local/www/firewall_rules_edit.php:1193
+#: usr/local/www/firewall_rules_edit.php:1206
+#: usr/local/www/firewall_rules_edit.php:1205
+#: usr/local/www/firewall_rules_edit.php:1253
+msgid "Policy filtering"
+msgstr "Política de filtro"
+
+#: usr/local/www/firewall_rules_edit.php:1146
+#: usr/local/www/firewall_rules_edit.php:1181
+#: usr/local/www/firewall_rules_edit.php:1196
+#: usr/local/www/firewall_rules_edit.php:1209
+#: usr/local/www/firewall_rules_edit.php:1208
+#: usr/local/www/firewall_rules_edit.php:1256
+msgid "You can match packet on a mark placed before on another rule."
+msgstr "Você pode combinar pacotes com uma marca colocada antes em outra regra."
+
+#: usr/local/www/firewall_rules_edit.php:1148
+#: usr/local/www/firewall_rules_edit.php:1183
+#: usr/local/www/firewall_rules_edit.php:1198
+#: usr/local/www/firewall_rules_edit.php:1211
+#: usr/local/www/firewall_rules_edit.php:1210
+msgid " Maximum state entries this rule can create"
+msgstr " Máximo de entradas de estado que essa regra pode criar"
+
+#: usr/local/www/firewall_rules_edit.php:1149
+#: usr/local/www/firewall_rules_edit.php:1184
+#: usr/local/www/firewall_rules_edit.php:1199
+#: usr/local/www/firewall_rules_edit.php:1212
+#: usr/local/www/firewall_rules_edit.php:1211
+msgid " Maximum number of unique source hosts"
+msgstr " Número máximo de hosts fonte únicos"
+
+#: usr/local/www/firewall_rules_edit.php:1150
+#: usr/local/www/firewall_rules_edit.php:1185
+#: usr/local/www/firewall_rules_edit.php:1200
+#: usr/local/www/firewall_rules_edit.php:1213
+#: usr/local/www/firewall_rules_edit.php:1212
+msgid " Maximum number of established connections per host"
+msgstr " Número máximo de conexões estabelecidas por host"
+
+#: usr/local/www/firewall_rules_edit.php:1151
+#: usr/local/www/firewall_rules_edit.php:1186
+#: usr/local/www/firewall_rules_edit.php:1201
+#: usr/local/www/firewall_rules_edit.php:1214
+#: usr/local/www/firewall_rules_edit.php:1213
+msgid " Maximum state entries per host"
+msgstr " Máximo de entradas de estado por host"
+
+#: usr/local/www/firewall_rules_edit.php:1160
+#: usr/local/www/firewall_rules_edit.php:1195
+#: usr/local/www/firewall_rules_edit.php:1210
+#: usr/local/www/firewall_rules_edit.php:1223
+#: usr/local/www/firewall_rules_edit.php:1222
+msgid "Maximum new connections / per second(s)"
+msgstr "Máximo de novas conexões / por segundo(s)"
+
+#: usr/local/www/firewall_rules_edit.php:1164
+#: usr/local/www/firewall_rules_edit.php:1199
+#: usr/local/www/firewall_rules_edit.php:1214
+#: usr/local/www/firewall_rules_edit.php:1226
+#: usr/local/www/firewall_rules_edit.php:1225
+msgid "State Timeout in seconds"
+msgstr "Tempo de espera de estado em segundos"
+
+#: usr/local/www/firewall_rules_edit.php:1167
+#: usr/local/www/firewall_rules_edit.php:1202
+#: usr/local/www/firewall_rules_edit.php:1217
+#: usr/local/www/firewall_rules_edit.php:1228
+#: usr/local/www/firewall_rules_edit.php:1227
+#: usr/local/www/firewall_rules_edit.php:1275
+msgid "Note: Leave fields blank to disable that feature."
+msgstr "Nota: Deixe os campos em branco para desabilitar essa função."
+
+#: usr/local/www/firewall_rules_edit.php:1172
+#: usr/local/www/firewall_rules_edit.php:1207
+#: usr/local/www/firewall_rules_edit.php:1222
+#: usr/local/www/firewall_rules_edit.php:1233
+#: usr/local/www/firewall_rules_edit.php:1232
+#: usr/local/www/firewall_rules_edit.php:1280
+msgid "TCP flags"
+msgstr "TCP flags"
+
+#: usr/local/www/firewall_rules_edit.php:1206
+#: usr/local/www/firewall_rules_edit.php:1241
+#: usr/local/www/firewall_rules_edit.php:1256
+#: usr/local/www/firewall_rules_edit.php:1265
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1312
+msgid "Any flags."
+msgstr "Qualquer flag."
+
+#: usr/local/www/firewall_rules_edit.php:1208
+#: usr/local/www/firewall_rules_edit.php:1243
+#: usr/local/www/firewall_rules_edit.php:1258
+#: usr/local/www/firewall_rules_edit.php:1267
+#: usr/local/www/firewall_rules_edit.php:1266
+#: usr/local/www/firewall_rules_edit.php:1314
+msgid "Use this to choose TCP flags that must be set or cleared for this rule to match."
+msgstr "Use isto para escolher as flags TCP que precisam estar definidas ou apuradas para esta regra corresponder."
+
+#: usr/local/www/firewall_rules_edit.php:1214
+#: usr/local/www/firewall_rules_edit.php:1249
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1273
+#: usr/local/www/firewall_rules_edit.php:1272
+#: usr/local/www/firewall_rules_edit.php:1320
+msgid "State Type"
+msgstr "Tipo de Estado"
+
+#: usr/local/www/firewall_rules_edit.php:1221
+#: usr/local/www/firewall_rules_edit.php:1228
+#: usr/local/www/firewall_rules_edit.php:1256
+#: usr/local/www/firewall_rules_edit.php:1263
+#: usr/local/www/firewall_rules_edit.php:1271
+#: usr/local/www/firewall_rules_edit.php:1278
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1286
+#: usr/local/www/firewall_rules_edit.php:1279
+#: usr/local/www/firewall_rules_edit.php:1285
+#: usr/local/www/firewall_rules_edit.php:1327
+#: usr/local/www/firewall_rules_edit.php:1333
+msgid "keep state"
+msgstr "manter estado"
+
+#: usr/local/www/firewall_rules_edit.php:1222
+#: usr/local/www/firewall_rules_edit.php:1229
+#: usr/local/www/firewall_rules_edit.php:1257
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1272
+#: usr/local/www/firewall_rules_edit.php:1279
+#: usr/local/www/firewall_rules_edit.php:1281
+#: usr/local/www/firewall_rules_edit.php:1287
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1286
+#: usr/local/www/firewall_rules_edit.php:1328
+#: usr/local/www/firewall_rules_edit.php:1334
+msgid "sloppy state"
+msgstr "estado sloppy"
+
+#: usr/local/www/firewall_rules_edit.php:1223
+#: usr/local/www/firewall_rules_edit.php:1230
+#: usr/local/www/firewall_rules_edit.php:1258
+#: usr/local/www/firewall_rules_edit.php:1265
+#: usr/local/www/firewall_rules_edit.php:1273
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1282
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1281
+#: usr/local/www/firewall_rules_edit.php:1287
+#: usr/local/www/firewall_rules_edit.php:1329
+#: usr/local/www/firewall_rules_edit.php:1335
+msgid "synproxy state"
+msgstr "estado synproxy"
+
+#: usr/local/www/firewall_rules_edit.php:1225
+#: usr/local/www/firewall_rules_edit.php:1260
+#: usr/local/www/firewall_rules_edit.php:1275
+#: usr/local/www/firewall_rules_edit.php:1284
+#: usr/local/www/firewall_rules_edit.php:1283
+#: usr/local/www/firewall_rules_edit.php:1331
+msgid "Hint: Select which type of state tracking mechanism you would like to use. If in doubt, use keep state."
+msgstr "Dica: Selecione qual o tipo de mecanismo de rastreamento você gostaria de utilizar. Se estiver em dúvida, use keep state."
+
+#: usr/local/www/firewall_rules_edit.php:1228
+#: usr/local/www/firewall_rules_edit.php:1229
+#: usr/local/www/firewall_rules_edit.php:1263
+#: usr/local/www/firewall_rules_edit.php:1264
+#: usr/local/www/firewall_rules_edit.php:1278
+#: usr/local/www/firewall_rules_edit.php:1279
+#: usr/local/www/firewall_rules_edit.php:1286
+#: usr/local/www/firewall_rules_edit.php:1287
+#: usr/local/www/firewall_rules_edit.php:1285
+#: usr/local/www/firewall_rules_edit.php:1333
+#: usr/local/www/firewall_rules_edit.php:1334
+msgid "Works with all IP protocols."
+msgstr "Funciona com todos os protocolos IP."
+
+#: usr/local/www/firewall_rules_edit.php:1230
+#: usr/local/www/firewall_rules_edit.php:1265
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1287
+#: usr/local/www/firewall_rules_edit.php:1335
+msgid "Proxies incoming TCP connections to help protect servers from spoofed TCP SYN floods. This option includes the functionality of keep state and modulate state combined."
+msgstr "Faz proxy de conexões TCP de entrada para ajudar a proteger servidores de inundações de spoofed TCP SYN. Essa opção inclui a funcionalidade de manter o estado e modular estado combinado."
+
+#: usr/local/www/firewall_rules_edit.php:1231
+#: usr/local/www/firewall_rules_edit.php:1266
+#: usr/local/www/firewall_rules_edit.php:1281
+#: usr/local/www/firewall_rules_edit.php:1289
+#: usr/local/www/firewall_rules_edit.php:1288
+#: usr/local/www/firewall_rules_edit.php:1336
+msgid "Do not use state mechanisms to keep track. This is only useful if you're doing advanced queueing in certain situations. Please check the documentation."
+msgstr "Não use mecanismos de estado para rastrear. Isso somente é útil se você estiver fazendo filas avançadas em determinadas situações. Por favor verifique a documentação."
+
+#: usr/local/www/firewall_rules_edit.php:1245
+#: usr/local/www/firewall_rules_edit.php:1280
+msgid "Hint: This prevents the rule from automatically syncing to other CARP members."
+msgstr "Dica: Isso previne a regra de sincronizar automaticamente com outros membros CARP."
+
+#: usr/local/www/firewall_rules_edit.php:1283
+#: usr/local/www/firewall_rules_edit.php:1350
+#: usr/local/www/firewall_rules_edit.php:1365
+#: usr/local/www/firewall_rules_edit.php:1372
+#: usr/local/www/firewall_rules_edit.php:1383
+#: usr/local/www/firewall_rules_edit.php:1431
+msgid "Leave as 'none' to leave the rule enabled all the time."
+msgstr "Deixa como 'nenhum' para deixar a regra habilitada o tempo todo."
+
+#: usr/local/www/firewall_rules_edit.php:1295
+#: usr/local/www/services_captiveportal.php:779
+#: usr/local/www/services_captiveportal.php:799
+#: usr/local/www/firewall_rules_edit.php:1362
+#: usr/local/www/services_captiveportal.php:821
+#: usr/local/www/services_captiveportal.php:841
+#: usr/local/www/services_captiveportal.php:819
+#: usr/local/www/services_captiveportal.php:839
+#: usr/local/www/firewall_rules_edit.php:1377
+#: usr/local/www/services_captiveportal.php:807
+#: usr/local/www/services_captiveportal.php:837
+#: usr/local/www/firewall_rules_edit.php:1384
+#: usr/local/www/services_captiveportal.php:823
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/firewall_rules_edit.php:1395
+#: usr/local/www/firewall_rules_edit.php:1443
+msgid "default"
+msgstr "padrão"
+
+#: usr/local/www/firewall_rules_edit.php:1334
+#: usr/local/www/firewall_rules_edit.php:1405
+#: usr/local/www/firewall_rules_edit.php:1420
+#: usr/local/www/firewall_rules_edit.php:1427
+#: usr/local/www/firewall_rules_edit.php:1438
+#: usr/local/www/firewall_rules_edit.php:1486
+msgid "Leave as 'default' to use the system routing table. Or choose a gateway to utilize policy based routing."
+msgstr "Deixe como 'padrão' para usar a tabela de roteamento do sistema ou escolha um gateway para utilizar roteamento baseado em políticas."
+
+#: usr/local/www/firewall_rules_edit.php:1339
+#: usr/local/www/firewall_rules_edit.php:1410
+#: usr/local/www/firewall_rules_edit.php:1425
+#: usr/local/www/firewall_rules_edit.php:1432
+#: usr/local/www/firewall_rules_edit.php:1443
+#: usr/local/www/firewall_rules_edit.php:1491
+msgid "In/Out"
+msgstr "Entrada/Saída"
+
+#: usr/local/www/firewall_rules_edit.php:1383
+#: usr/local/www/firewall_rules_edit.php:1454
+#: usr/local/www/firewall_rules_edit.php:1469
+#: usr/local/www/firewall_rules_edit.php:1476
+#: usr/local/www/firewall_rules_edit.php:1487
+#: usr/local/www/firewall_rules_edit.php:1535
+msgid "Choose the Out queue/Virtual interface only if you have also selected In."
+msgstr "Escolha a interface de fila de saída/virtual somente se você selecionou a de Entrada também."
+
+#: usr/local/www/firewall_rules_edit.php:1383
+#: usr/local/www/firewall_rules_edit.php:1454
+#: usr/local/www/firewall_rules_edit.php:1469
+#: usr/local/www/firewall_rules_edit.php:1476
+#: usr/local/www/firewall_rules_edit.php:1487
+#: usr/local/www/firewall_rules_edit.php:1535
+msgid "The Out selection is applied to traffic leaving the interface where the rule is created, In is applied to traffic coming into the chosen interface."
+msgstr "A seleção de Saída é aplicada ao tráfego que estiver saindo da interface em que a regra foi criada a Entrada é a aplicada ao tráfego chegando na interface selecionada."
+
+#: usr/local/www/firewall_rules_edit.php:1383
+#: usr/local/www/firewall_rules_edit.php:1454
+#: usr/local/www/firewall_rules_edit.php:1469
+#: usr/local/www/firewall_rules_edit.php:1476
+#: usr/local/www/firewall_rules_edit.php:1487
+#: usr/local/www/firewall_rules_edit.php:1535
+msgid "If you are creating a floating rule, if the direction is In then the same rules apply, if the direction is out the selections are reverted Out is for incoming and In is for outgoing."
+msgstr "Se você estiver criando uma regra na aba Flotação, se a direção é de Entrada, então as mesmas regras se aplicam. Se a direção foi de Saída, as seleções são revertidas:Saída é para entradas e Entrada é para saídas. E se você não selecionar nenhuma direção, use somente a Entrada, já que a seleção de Saída não faz sentido, de modo a evitar confusões."
+
+#: usr/local/www/firewall_rules_edit.php:1389
+#: usr/local/www/firewall_rules_edit.php:1460
+#: usr/local/www/firewall_rules_edit.php:1475
+#: usr/local/www/firewall_rules_edit.php:1482
+#: usr/local/www/firewall_rules_edit.php:1493
+#: usr/local/www/firewall_rules_edit.php:1541
+msgid "Ackqueue/Queue"
+msgstr "Reconhecimento/Fila"
+
+#: usr/local/www/firewall_rules_edit.php:1439
+#: usr/local/www/firewall_rules_edit.php:1510
+#: usr/local/www/firewall_rules_edit.php:1525
+#: usr/local/www/firewall_rules_edit.php:1532
+#: usr/local/www/firewall_rules_edit.php:1543
+#: usr/local/www/firewall_rules_edit.php:1591
+msgid "Choose the Acknowledge Queue only if you have selected Queue."
+msgstr "Escolha a Fila de Acordo somente se você selecionou Fila."
+
+#: usr/local/www/firewall_rules_edit.php:1466
+#: usr/local/www/firewall_rules_edit.php:1537
+#: usr/local/www/firewall_rules_edit.php:1552
+#: usr/local/www/firewall_rules_edit.php:1560
+#: usr/local/www/firewall_rules_edit.php:1571
+#: usr/local/www/firewall_rules_edit.php:1619
+msgid "Choose a Layer7 container to apply application protocol inspection rules. These are valid for TCP and UDP protocols only."
+msgstr "Escolha o contâiner Layer7 para aplicar regras de inspeção de protocolo de aplicação. Essas são válidas somente para protocolos TCP e UDP."
+
+#: usr/local/www/firewall_schedule.php:50
+#: usr/local/www/firewall_schedule_edit.php:61 usr/local/www/fbegin.inc:113
+#: usr/local/www/system_advanced_misc.php:380 usr/local/www/fbegin.inc:130
+#: usr/local/www/system_advanced_misc.php:423 usr/local/www/fbegin.inc:139
+#: usr/local/www/system_advanced_misc.php:472
+#: usr/local/www/system_advanced_misc.php:484 usr/local/www/fbegin.inc:131
+#: usr/local/www/system_advanced_misc.php:531
+#: usr/local/www/system_advanced_misc.php:549
+msgid "Schedules"
+msgstr "Agendas"
+
+#: usr/local/www/firewall_schedule.php:77
+#, php-format
+msgid "Cannot delete Schedule. Currently in use by %s"
+msgstr "Não pode apagar a Agenda. Ela está atualmente em uso por %s"
+
+#: usr/local/www/firewall_schedule.php:97
+msgid "Time Range(s)"
+msgstr "Intervalo(s) de tempo"
+
+#: usr/local/www/firewall_schedule.php:103
+#: usr/local/www/firewall_schedule.php:233
+msgid "add a new schedule"
+msgstr "adicionar uma nova agenda"
+
+#: usr/local/www/firewall_schedule.php:115
+msgid "Schedule is currently active"
+msgstr "Agenda está atualmente ativa"
+
+#: usr/local/www/firewall_schedule.php:221
+msgid "Do you really want to delete this schedule?"
+msgstr "Você realmente quer apagar essa agenda?"
+
+#: usr/local/www/firewall_schedule.php:240
+msgid "Schedules act as placeholders for time ranges to be used in Firewall Rules."
+msgstr "Agendas atuam como placeholders para intervalos de tempo para serem usadas pelas Regras do Firewall."
+
+#: usr/local/www/firewall_schedule_edit.php:93
+msgid "Schedule may not be named LAN."
+msgstr "Agenda não pode ser nomeada LAN."
+
+#: usr/local/www/firewall_schedule_edit.php:95
+msgid "Schedule may not be named WAN."
+msgstr "Agenda não pode ser nomeada WAN."
+
+#: usr/local/www/firewall_schedule_edit.php:97
+msgid "Schedule name cannot be blank."
+msgstr "Nome da agenda não pode ser deixado em branco."
+
+#: usr/local/www/firewall_schedule_edit.php:101
+msgid "Reserved word used for schedule name."
+msgstr "Palavra reservada usada para nome de agenda."
+
+#: usr/local/www/firewall_schedule_edit.php:104
+msgid "The schedule name may only consist of the characters a-z, A-Z, 0-9"
+msgstr "O nome da agenda somente deve consistir dos caracteres de a-z, A-Z, 0-9"
+
+#: usr/local/www/firewall_schedule_edit.php:113
+msgid "A Schedule with this name already exists."
+msgstr "Uma Agenda com esse nome já existe."
+
+#: usr/local/www/firewall_schedule_edit.php:170
+msgid "The schedule must have at least one time range configured."
+msgstr "A agenda deve ter, pelo menos, um intervalo de tempo configurado."
+
+#: usr/local/www/firewall_schedule_edit.php:770
+#: usr/local/www/firewall_schedule_edit.php:769
+msgid "Schedule information"
+msgstr "Informação da agenda"
+
+#: usr/local/www/firewall_schedule_edit.php:776
+#: usr/local/www/firewall_schedule_edit.php:775
+msgid "Schedule Name"
+msgstr "Nome da agenda"
+
+#: usr/local/www/firewall_schedule_edit.php:782
+#: usr/local/www/firewall_schedule_edit.php:781
+msgid "NOTE: This schedule is in use so the name may not be modified!"
+msgstr "NOTA: Essa agenda está em uso e, portanto, o nome não pode ser modificado!"
+
+#: usr/local/www/firewall_schedule_edit.php:787
+#: usr/local/www/firewall_schedule_edit.php:786
+msgid "The name of the alias may only consist of the characters a-z, A-Z and 0-9"
+msgstr "O nome do alias somente deve consistir nos caracteres de a-z, A-Z e 0-9"
+
+#: usr/local/www/firewall_schedule_edit.php:804
+#: usr/local/www/firewall_schedule_edit.php:803
+msgid "Month"
+msgstr "Mês"
+
+#: usr/local/www/firewall_schedule_edit.php:847
+#: usr/local/www/firewall_schedule_edit.php:846
+msgid "Tue"
+msgstr "Ter"
+
+#: usr/local/www/firewall_schedule_edit.php:849
+#: usr/local/www/firewall_schedule_edit.php:848
+msgid "Thu"
+msgstr "Qui"
+
+#: usr/local/www/firewall_schedule_edit.php:906
+#: usr/local/www/firewall_schedule_edit.php:905
+msgid "Click individual date to select that date only. Click the appropriate weekday Header to select all occurences of that weekday."
+msgstr "Clique em data individual para selecionar somente a data. Clique no cabeçalho do dia da semana apropriado para selecionar todas as ocorrências daquele dia da semana."
+
+#: usr/local/www/firewall_schedule_edit.php:914
+#: usr/local/www/firewall_schedule_edit.php:996
+#: usr/local/www/firewall_schedule_edit.php:913
+#: usr/local/www/firewall_schedule_edit.php:995
+msgid "Start Time"
+msgstr "Hora de início"
+
+#: usr/local/www/firewall_schedule_edit.php:914
+#: usr/local/www/firewall_schedule_edit.php:997
+#: usr/local/www/firewall_schedule_edit.php:913
+#: usr/local/www/firewall_schedule_edit.php:996
+msgid "Stop Time"
+msgstr "Hora de término"
+
+#: usr/local/www/firewall_schedule_edit.php:927
+#: usr/local/www/firewall_schedule_edit.php:952
+#: usr/local/www/firewall_schedule_edit.php:926
+#: usr/local/www/firewall_schedule_edit.php:951
+msgid "Hr"
+msgstr "Hr"
+
+#: usr/local/www/firewall_schedule_edit.php:934
+#: usr/local/www/firewall_schedule_edit.php:959
+#: usr/local/www/firewall_schedule_edit.php:933
+#: usr/local/www/firewall_schedule_edit.php:958
+msgid "Min"
+msgstr "Min"
+
+#: usr/local/www/firewall_schedule_edit.php:963
+#: usr/local/www/firewall_schedule_edit.php:962
+msgid "Select the time range for the day(s) selected on the Month(s) above. A full day is 0:00-23:59."
+msgstr "Selecione o intervalo de tempo para o(s) dia(s) selecionados no(s) Mes(es) acima. Um dia completo é 0:00-23:59."
+
+#: usr/local/www/firewall_schedule_edit.php:967
+#: usr/local/www/firewall_schedule_edit.php:966
+msgid "Time Range Description"
+msgstr "Descrição do Intervalo de Tempo"
+
+#: usr/local/www/firewall_schedule_edit.php:977
+#: usr/local/www/firewall_schedule_edit.php:976
+msgid "Add Time"
+msgstr "Adicionar Tempo"
+
+#: usr/local/www/firewall_schedule_edit.php:978
+#: usr/local/www/firewall_schedule_edit.php:977
+msgid "Clear Selection"
+msgstr "Limpar seleção"
+
+#: usr/local/www/firewall_schedule_edit.php:987
+#: usr/local/www/firewall_schedule_edit.php:986
+msgid "Schedule repeat"
+msgstr "Repetição de agenda"
+
+#: usr/local/www/firewall_schedule_edit.php:990
+#: usr/local/www/firewall_schedule_edit.php:989
+msgid "Configured Ranges"
+msgstr "Intervalos configurados"
+
+#: usr/local/www/firewall_schedule_edit.php:995
+#: usr/local/www/firewall_schedule_edit.php:994
+msgid "Day(s)"
+msgstr "Dia(s)"
+
+#: usr/local/www/firewall_shaper.php:369 usr/local/www/firewall_shaper.php:370
+#: usr/local/www/firewall_shaper.php:371
+msgid "Disable shaper on interface"
+msgstr "Desabilitar modelador na interface"
+
+#: usr/local/www/firewall_shaper.php:424 usr/local/www/firewall_shaper.php:425
+#: usr/local/www/firewall_shaper.php:426
+msgid "Remove Shaper"
+msgstr "Remover Modelador"
+
+#: usr/local/www/diag_backup.php:84 usr/local/www/diag_backup.php:161
+msgid "Restored base_package menus after configuration restore."
+msgstr "Restaurado menu base_package após restauração da configuração."
+
+#: usr/local/www/diag_backup.php:104 usr/local/www/fbegin.inc:120
+#: usr/local/www/fbegin.inc:156 usr/local/www/status_rrd_graph_settings.php:58
+#: usr/local/www/status_rrd_graph_settings.php:155
+#: usr/local/www/status_services.php:275
+#: usr/local/www/widgets/widgets/services_status.widget.php:80
+#: usr/local/www/fbegin.inc:137 usr/local/www/fbegin.inc:173
+#: usr/local/www/status_rrd_graph_settings.php:156
+#: usr/local/www/diag_backup.php:181 etc/inc/service-utils.inc:256
+#: usr/local/www/fbegin.inc:146 usr/local/www/fbegin.inc:181
+#: usr/local/www/fbegin.inc:138 usr/local/www/fbegin.inc:172
+#: etc/inc/service-utils.inc:255 etc/inc/service-utils.inc:272
+msgid "Captive Portal"
+msgstr "Portal Captive"
+
+#: usr/local/www/diag_backup.php:105 usr/local/www/diag_backup.php:182
+msgid "Captive Portal Vouchers"
+msgstr "Vouchers do Portal Captive"
+
+#: usr/local/www/diag_backup.php:106 usr/local/www/fbegin.inc:121
+#: usr/local/www/status_services.php:263
+#: usr/local/www/widgets/widgets/services_status.widget.php:68
+#: usr/local/www/fbegin.inc:138 usr/local/www/diag_backup.php:183
+#: etc/inc/service-utils.inc:241 usr/local/www/fbegin.inc:147
+#: usr/local/www/fbegin.inc:139 etc/inc/service-utils.inc:240
+#: etc/inc/service-utils.inc:257
+msgid "DNS Forwarder"
+msgstr "DNS Forwarder"
+
+#: usr/local/www/diag_backup.php:107 usr/local/www/fbegin.inc:125
+#: usr/local/www/fbegin.inc:142 usr/local/www/diag_backup.php:184
+#: usr/local/www/fbegin.inc:151 usr/local/www/fbegin.inc:143
+msgid "DHCP Server"
+msgstr "Servidor DHCP"
+
+#: usr/local/www/diag_backup.php:108 usr/local/www/diag_backup.php:185
+#: usr/local/www/diag_backup.php:186
+msgid "Firewall Rules"
+msgstr "Regras de firewall"
+
+#: usr/local/www/diag_backup.php:110 usr/local/www/diag_backup.php:187
+#: usr/local/www/diag_backup.php:188
+msgid "IPSEC"
+msgstr "IPSEC"
+
+#: usr/local/www/diag_backup.php:114 usr/local/www/diag_backup.php:191
+#: usr/local/www/diag_backup.php:192
+msgid "PPTP Server"
+msgstr "Servidor PPTP"
+
+#: usr/local/www/diag_backup.php:115 usr/local/www/diag_backup.php:193
+#: usr/local/www/diag_backup.php:194
+msgid "Scheduled Tasks"
+msgstr "Tarefas Agendadas"
+
+#: usr/local/www/diag_backup.php:116 usr/local/www/diag_backup.php:194
+#: usr/local/www/diag_backup.php:195
+msgid "Syslog"
+msgstr "Syslog"
+
+#: usr/local/www/diag_backup.php:118 usr/local/www/diag_backup.php:196
+#: usr/local/www/diag_backup.php:197
+msgid "Static routes"
+msgstr "Rotas estáticas"
+
+#: usr/local/www/diag_backup.php:119 usr/local/www/diag_backup.php:197
+#: usr/local/www/diag_backup.php:198
+msgid "System tunables"
+msgstr "Ajustes de sistema"
+
+#: usr/local/www/diag_backup.php:120 usr/local/www/diag_backup.php:198
+#: usr/local/www/diag_backup.php:199
+msgid "SNMP Server"
+msgstr "Servidor SNMP"
+
+#: usr/local/www/diag_backup.php:122 usr/local/www/diag_backup.php:200
+#: usr/local/www/diag_backup.php:201
+msgid "VLANS"
+msgstr "VLANS"
+
+#: usr/local/www/diag_backup.php:130 usr/local/www/diag_backup.php:205
+#: usr/local/www/diag_backup.php:206
+msgid "ALL"
+msgstr "TODOS"
+
+#: usr/local/www/diag_backup.php:157 usr/local/www/diag_backup.php:619
+#: usr/local/www/diag_backup.php:654 usr/local/www/diag_backup.php:244
+#: usr/local/www/diag_backup.php:698 usr/local/www/diag_backup.php:735
+#: usr/local/www/diag_backup.php:703 usr/local/www/diag_backup.php:740
+#: usr/local/www/diag_backup.php:245 usr/local/www/diag_backup.php:704
+#: usr/local/www/diag_backup.php:741
+msgid "Restore configuration"
+msgstr "Restaurar configuração"
+
+#: usr/local/www/diag_backup.php:159 usr/local/www/diag_backup.php:246
+#: usr/local/www/diag_backup.php:247
+msgid "Reinstall"
+msgstr "Reinstalar"
+
+#: usr/local/www/diag_backup.php:161 usr/local/www/diag_backup.php:673
+#: usr/local/www/diag_backup.php:248 usr/local/www/diag_backup.php:754
+#: usr/local/www/diag_backup.php:762 usr/local/www/diag_backup.php:249
+#: usr/local/www/diag_backup.php:763
+msgid "Clear Package Lock"
+msgstr "Limpar trava de Pacotes"
+
+#: usr/local/www/diag_backup.php:165 usr/local/www/diag_backup.php:252
+#: usr/local/www/diag_backup.php:253
+msgid "Restore version"
+msgstr "Restaurar versão"
+
+#: usr/local/www/diag_backup.php:180 usr/local/www/diag_backup.php:267
+#: usr/local/www/diag_backup.php:268
+msgid "You must supply and confirm the password for encryption."
+msgstr "Você precisa fornecer e confirmar a senha para criptografia."
+
+#: usr/local/www/diag_backup.php:182 usr/local/www/diag_backup.php:268
+#: usr/local/www/diag_backup.php:269 usr/local/www/diag_backup.php:346
+#: usr/local/www/diag_backup.php:270 usr/local/www/diag_backup.php:347
+msgid "The supplied 'Password' and 'Confirm' field values must match."
+msgstr "Os campos 'Senha' e 'Confirmar' fornecidos devem ser iguais."
+
+#: usr/local/www/diag_backup.php:266 usr/local/www/diag_backup.php:344
+#: usr/local/www/diag_backup.php:345
+msgid "You must supply and confirm the password for decryption."
+msgstr "Você deve fornecer e confirmar a senha para descriptografia."
+
+#: usr/local/www/diag_backup.php:278 usr/local/www/diag_backup.php:356
+#: usr/local/www/diag_backup.php:357
+#, php-format
+msgid "Warning, could not read file %s"
+msgstr "Aviso, não é possível ler o arquivo %s"
+
+#: usr/local/www/diag_backup.php:284 usr/local/www/diag_backup.php:362
+#: usr/local/www/diag_backup.php:363
+msgid "The uploaded file does not appear to contain an encrypted pfsense configuration."
+msgstr "O arquivo enviado não parece conter uma configuração pfSense criptografada."
+
+#: usr/local/www/diag_backup.php:291 usr/local/www/diag_backup.php:369
+#: usr/local/www/diag_backup.php:370
+msgid "Upgrading m0n0wall configuration to pfsense."
+msgstr "Atualizando configuração do m0n0wall para pfSense."
+
+#: usr/local/www/diag_backup.php:299 usr/local/www/diag_backup.php:377
+#: usr/local/www/diag_backup.php:380 usr/local/www/diag_backup.php:378
+#: usr/local/www/diag_backup.php:381
+msgid "You have selected to restore an area but we could not locate the correct xml tag."
+msgstr "Você selecionou uma área para restaurar, mas não conseguimos localizar a tag XML correta."
+
+#: usr/local/www/diag_backup.php:303 usr/local/www/diag_backup.php:392
+#: usr/local/www/diag_backup.php:393
+msgid "The configuration area has been restored. You may need to reboot the firewall."
+msgstr "A área de configuração foi restaurada. Você pode precisar reiniciar o firewall."
+
+#: usr/local/www/diag_backup.php:307 usr/local/www/diag_backup.php:397
+#: usr/local/www/diag_backup.php:398
+#, php-format
+msgid "You have selected to restore the full configuration but we could not locate a %s tag."
+msgstr "Você selecionou restaurar a configuração completa, mas não podemos localizar uma tag %s."
+
+#: usr/local/www/diag_backup.php:438 usr/local/www/diag_backup.php:515
+#: usr/local/www/diag_backup.php:516
+msgid "The m0n0wall configuration has been restored and upgraded to pfSense."
+msgstr "A configuração m0n0wall foi restaurada e atualizada para pfSense."
+
+#: usr/local/www/diag_backup.php:461 usr/local/www/diag_backup.php:485
+#: usr/local/www/diag_backup.php:538 usr/local/www/diag_backup.php:562
+#: usr/local/www/diag_backup.php:543 usr/local/www/diag_backup.php:567
+#: usr/local/www/diag_backup.php:544 usr/local/www/diag_backup.php:568
+msgid "The configuration could not be restored."
+msgstr "A configuração não poderá ser restaurada."
+
+#: usr/local/www/diag_backup.php:466 usr/local/www/diag_backup.php:543
+#: usr/local/www/diag_backup.php:548 usr/local/www/diag_backup.php:549
+msgid "The configuration could not be restored (file upload error)."
+msgstr "A configuração não pode ser restaurada (erro de carregamento de arquivo)."
+
+#: usr/local/www/diag_backup.php:479 usr/local/www/diag_backup.php:556
+#: usr/local/www/diag_backup.php:561 usr/local/www/diag_backup.php:562
+msgid "XXX - this feature may hose your config (do NOT backrev configs!) - billm"
+msgstr "XXX - está funcionalidade pode estragar suas configurações (NÃO retorne a versão de suas configurações!) - billm"
+
+#: usr/local/www/diag_backup.php:488 usr/local/www/diag_backup.php:565
+#: usr/local/www/diag_backup.php:570 usr/local/www/diag_backup.php:571
+msgid "No version selected."
+msgstr "Nenhuma versão selecionada."
+
+#: usr/local/www/diag_backup.php:499 usr/local/www/diag_backup.php:576
+#: usr/local/www/diag_backup.php:581 usr/local/www/diag_backup.php:582
+msgid "Backup/restore"
+msgstr "Backup/restauração"
+
+#: usr/local/www/diag_backup.php:540
+#: usr/local/www/system_firmware_restorefullbackup.php:116
+#: usr/local/www/diag_backup.php:619 usr/local/www/diag_backup.php:624
+#: usr/local/www/diag_backup.php:625
+msgid "The firewall configuration has been changed."
+msgstr "A configuração do firewall foi alterada."
+
+#: usr/local/www/diag_backup.php:540
+#: usr/local/www/system_firmware_restorefullbackup.php:116
+#: usr/local/www/diag_backup.php:619 usr/local/www/diag_backup.php:624
+#: usr/local/www/diag_backup.php:625
+msgid "The firewall is now rebooting."
+msgstr "O firewall está reiniciando agora."
+
+#: usr/local/www/diag_backup.php:549 usr/local/www/diag_confbak.php:139
+#: usr/local/www/diag_backup.php:628 usr/local/www/diag_backup.php:633
+#: usr/local/www/diag_backup.php:634
+msgid "Config History"
+msgstr "Histórico de configuração"
+
+#: usr/local/www/diag_backup.php:550 usr/local/www/diag_confbak.php:140
+#: usr/local/www/fbegin.inc:190 usr/local/www/fbegin.inc:208
+#: usr/local/www/diag_backup.php:629 usr/local/www/fbegin.inc:216
+#: usr/local/www/diag_backup.php:634 usr/local/www/fbegin.inc:207
+#: usr/local/www/diag_backup.php:635
+msgid "Backup/Restore"
+msgstr "Backup/Restauração"
+
+#: usr/local/www/diag_backup.php:560 usr/local/www/diag_backup.php:639
+#: usr/local/www/diag_backup.php:644 usr/local/www/diag_backup.php:645
+msgid "Backup configuration"
+msgstr "Configuração do backup"
+
+#: usr/local/www/diag_backup.php:565 usr/local/www/diag_backup.php:644
+#: usr/local/www/diag_backup.php:649 usr/local/www/diag_backup.php:650
+msgid "Click this button to download the system configuration in XML format."
+msgstr "Clique neste botão para fazer download da configuração do sistema em formato XML."
+
+#: usr/local/www/diag_backup.php:565 usr/local/www/diag_backup.php:644
+#: usr/local/www/diag_backup.php:649 usr/local/www/diag_backup.php:650
+msgid "Backup area:"
+msgstr "Área de backup:"
+
+#: usr/local/www/diag_backup.php:572 usr/local/www/diag_backup.php:651
+#: usr/local/www/diag_backup.php:656 usr/local/www/diag_backup.php:657
+msgid "Do not backup package information."
+msgstr "Não fazer backup de informações de pacotes."
+
+#: usr/local/www/diag_backup.php:582 usr/local/www/diag_backup.php:661
+#: usr/local/www/diag_backup.php:666 usr/local/www/diag_backup.php:667
+msgid "Encrypt this configuration file."
+msgstr "Criptografar este arquivo de configuração."
+
+#: usr/local/www/diag_backup.php:590 usr/local/www/diag_backup.php:669
+#: usr/local/www/diag_backup.php:674 usr/local/www/diag_backup.php:675
+msgid "Do not backup RRD data (NOTE: RRD Data can consume 4+ megabytes of config.xml space!)"
+msgstr "Não fazer backup dos dados RRD (Nota: dados RRD podem consumir 4+ megabytes de espaço no config.xml!)"
+
+#: usr/local/www/diag_backup.php:605 usr/local/www/diag_backup.php:684
+#: usr/local/www/diag_backup.php:689 usr/local/www/diag_backup.php:690
+msgid "confirm:"
+msgstr "confirmar:"
+
+#: usr/local/www/diag_backup.php:612 usr/local/www/diag_backup.php:691
+#: usr/local/www/diag_backup.php:696 usr/local/www/diag_backup.php:697
+msgid "Download configuration"
+msgstr "Download da configuração"
+
+#: usr/local/www/diag_backup.php:624 usr/local/www/diag_backup.php:703
+#: usr/local/www/diag_backup.php:708 usr/local/www/diag_backup.php:709
+msgid "Open a"
+msgstr "Abra um"
+
+#: usr/local/www/diag_backup.php:624 usr/local/www/diag_backup.php:703
+#: usr/local/www/diag_backup.php:708 usr/local/www/diag_backup.php:709
+msgid "configuration XML file and click the button below to restore the configuration."
+msgstr "arquivo de configuração XML e clique no botão abaixo para restaurar a configuração."
+
+#: usr/local/www/diag_backup.php:624 usr/local/www/diag_backup.php:705
+#: usr/local/www/diag_backup.php:710 usr/local/www/diag_backup.php:711
+msgid "Restore area:"
+msgstr "Área de restauração:"
+
+#: usr/local/www/diag_backup.php:632 usr/local/www/diag_backup.php:713
+#: usr/local/www/diag_backup.php:718 usr/local/www/diag_backup.php:719
+msgid "Configuration file is encrypted."
+msgstr "O arquivo de configuração está criptografado."
+
+#: usr/local/www/diag_backup.php:639 usr/local/www/diag_backup.php:720
+#: usr/local/www/diag_backup.php:725 usr/local/www/diag_backup.php:726
+msgid "Password :"
+msgstr "Senha :"
+
+#: usr/local/www/diag_backup.php:647 usr/local/www/diag_backup.php:728
+#: usr/local/www/diag_backup.php:733 usr/local/www/diag_backup.php:734
+msgid "confirm :"
+msgstr "confirmar:"
+
+#: usr/local/www/diag_backup.php:655 usr/local/www/diag_backup.php:736
+#: usr/local/www/diag_backup.php:741 usr/local/www/diag_backup.php:742
+msgid "The firewall will reboot after restoring the configuration."
+msgstr "O firewall irá reiniciar após restaurar a configuração."
+
+#: usr/local/www/diag_backup.php:663 usr/local/www/diag_backup.php:744
+#: usr/local/www/diag_backup.php:749 usr/local/www/diag_backup.php:750
+msgid "Package Functions"
+msgstr "Funções de Pacotes"
+
+#: usr/local/www/diag_backup.php:668 usr/local/www/diag_backup.php:749
+#: usr/local/www/diag_backup.php:755 usr/local/www/diag_backup.php:756
+msgid "Click this button to reinstall all system packages. This may take a while."
+msgstr "Clique neste botão para reinstalar todos os pacotes de sistema. Isto pode demorar um pouco."
+
+#: usr/local/www/diag_backup.php:669 usr/local/www/diag_backup.php:750
+#: usr/local/www/diag_backup.php:756 usr/local/www/diag_backup.php:757
+msgid "Reinstall packages"
+msgstr "Reinstalar pacotes"
+
+#: usr/local/www/diag_backup.php:672 usr/local/www/diag_backup.php:753
+#: usr/local/www/diag_backup.php:761 usr/local/www/diag_backup.php:762
+msgid "Click this button to clear the package lock if a package fails to reinstall properly after an upgrade."
+msgstr "Clique neste botão para limpar a trava de pacotes se um pacote falhou em reinstalar corretamente depois de uma atualização."
+
+#: usr/local/www/firewall_shaper_queues.php:172
+msgid "Firewall: Shaper: By Queues View"
+msgstr "Firewall: Modelador: Por Visualização de Filas"
+
+#: usr/local/www/diag_confbak.php:49
+#, php-format
+msgid "Successfully reverted to timestamp %1$s with description \"%2$s\"."
+msgstr "Sucesso ao reverter o timestamp %1$s com descrição \"%2$s\"."
+
+#: usr/local/www/diag_confbak.php:49 usr/local/www/diag_confbak.php:59
+#: usr/local/www/diag_confbak.php:111 usr/local/www/diag_confbak.php:161
+#: usr/local/www/diag_confbak.php:169 usr/local/www/diag_confbak.php:162
+#: usr/local/www/diag_confbak.php:171
+#: usr/local/www/firewall_rules_edit.php:1585
+#: usr/local/www/firewall_rules_edit.php:1593
+#: usr/local/www/firewall_nat_edit.php:869
+#: usr/local/www/firewall_nat_edit.php:877
+#: usr/local/www/firewall_nat_out_edit.php:684
+#: usr/local/www/firewall_nat_out_edit.php:692
+#: usr/local/www/firewall_rules_edit.php:1596
+#: usr/local/www/firewall_rules_edit.php:1604
+#: usr/local/www/firewall_nat_edit.php:870
+#: usr/local/www/firewall_nat_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:1644
+#: usr/local/www/firewall_rules_edit.php:1652
+msgid "n/j/y H:i:s"
+msgstr "j/n/y H:i:s"
+
+#: usr/local/www/diag_confbak.php:51
+msgid "Unable to revert to the selected configuration."
+msgstr "Incapaz de reverter a configuração selecionada."
+
+#: usr/local/www/diag_confbak.php:59
+#, php-format
+msgid "Deleted backup with timestamp %1$s and description \"%2$s\"."
+msgstr "Backup excluído com timestamp %1$s e descrição \"%2$s\"."
+
+#: usr/local/www/diag_confbak.php:98
+msgid "Configuration History"
+msgstr "Histórico de Configuração"
+
+#: usr/local/www/diag_confbak.php:111
+msgid "Configuration diff from"
+msgstr "Diferença de Configuração de"
+
+#: usr/local/www/diag_confbak.php:152 usr/local/www/diag_confbak.php:206
+#: usr/local/www/diag_confbak.php:208
+msgid "Diff"
+msgstr "Diff"
+
+#: usr/local/www/diag_confbak.php:153
+#: usr/local/www/system_firmware_restorefullbackup.php:140
+msgid "Date"
+msgstr "Data"
+
+#: usr/local/www/diag_confbak.php:154 usr/local/www/diag_confbak.php:155
+msgid "Configuration Change"
+msgstr "Alteração na configuração"
+
+#: usr/local/www/diag_confbak.php:163 usr/local/www/diag_confbak.php:165
+msgid "Current"
+msgstr "Atual"
+
+#: usr/local/www/diag_confbak.php:171 usr/local/www/diag_confbak.php:173
+#: usr/local/www/widgets/widgets/gateways.widget.php:105
+#: usr/local/www/widgets/widgets/gateways.widget.php:128
+#: usr/local/www/widgets/widgets/gateways.widget.php:129
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: usr/local/www/diag_confbak.php:189 usr/local/www/diag_confbak.php:191
+msgid "Revert to this configuration?"
+msgstr "Reverter para essa configuração?"
+
+#: usr/local/www/diag_confbak.php:190 usr/local/www/diag_confbak.php:192
+msgid "Revert to this configuration"
+msgstr "Reverter para esta configuração"
+
+#: usr/local/www/diag_confbak.php:194 usr/local/www/diag_confbak.php:196
+msgid "Delete this configuration backup?"
+msgstr "Excluir este backup de configuração?"
+
+#: usr/local/www/diag_confbak.php:195 usr/local/www/diag_confbak.php:197
+msgid "Remove this backup"
+msgstr "Remover este backup"
+
+#: usr/local/www/diag_confbak.php:200 usr/local/www/diag_confbak.php:202
+msgid "Download this backup"
+msgstr "Download deste backup"
+
+#: usr/local/www/diag_confbak.php:212 usr/local/www/diag_confbak.php:214
+msgid "No backups found."
+msgstr "Nenhum backup foi encontrado."
+
+#: usr/local/www/firewall_virtual_ip.php:106
+#: usr/local/www/firewall_virtual_ip.php:103
+msgid "This entry cannot be deleted because it is still referenced by at least one NAT mapping."
+msgstr "Essa entrada não pode ser apagada porque ela ainda é referenciada por pelo menos um mapeamento NAT."
+
+#: usr/local/www/firewall_virtual_ip.php:118
+msgid "This entry cannot be deleted because it is still referenced by CARP"
+msgstr "Essa entrada não pode ser removida porque ela ainda é referenciada pelo CARP"
+
+#: usr/local/www/firewall_virtual_ip.php:124
+msgid "This entry cannot be deleted because it is still referenced by ip alias entry"
+msgstr "Essa entrada não pode ser removida porque ela ainda é referenciada pelo CARP"
+
+#: usr/local/www/firewall_virtual_ip.php:149
+#: usr/local/www/firewall_virtual_ip.php:152
+#: usr/local/www/firewall_virtual_ip.php:166
+#: usr/local/www/firewall_virtual_ip.php:189
+#: usr/local/www/firewall_virtual_ip.php:196
+msgid "Virtual IP Addresses"
+msgstr "Endereços IP Virtuais"
+
+#: usr/local/www/firewall_virtual_ip.php:164
+#: usr/local/www/firewall_virtual_ip.php:167
+#: usr/local/www/firewall_virtual_ip.php:181
+#: usr/local/www/firewall_virtual_ip.php:204
+#: usr/local/www/firewall_virtual_ip.php:211
+msgid "The VIP configuration has been changed."
+msgstr "A configuração de Endereços IP Virtuais foi modificada."
+
+#: usr/local/www/firewall_virtual_ip.php:172 usr/local/www/fbegin.inc:115
+#: usr/local/www/fbegin.inc:132 usr/local/www/fbegin.inc:141
+#: usr/local/www/firewall_virtual_ip.php:175
+#: usr/local/www/firewall_virtual_ip.php:189 usr/local/www/fbegin.inc:133
+#: usr/local/www/firewall_virtual_ip.php:212
+#: usr/local/www/firewall_virtual_ip.php:219
+msgid "Virtual IPs"
+msgstr "IPs Virtuais"
+
+#: usr/local/www/firewall_virtual_ip.php:173
+#: usr/local/www/firewall_virtual_ip.php:176
+#: usr/local/www/firewall_virtual_ip.php:190
+#: usr/local/www/firewall_virtual_ip.php:213
+#: usr/local/www/firewall_virtual_ip.php:220
+msgid "CARP Settings"
+msgstr "Configurações do CARP"
+
+#: usr/local/www/firewall_virtual_ip.php:185
+#: usr/local/www/firewall_virtual_ip.php:188
+#: usr/local/www/firewall_virtual_ip.php:202
+#: usr/local/www/firewall_virtual_ip.php:225
+#: usr/local/www/firewall_virtual_ip.php:232
+msgid "Virtual IP address"
+msgstr "Endereços IP Virtuais"
+
+#: usr/local/www/firewall_virtual_ip.php:242
+#: usr/local/www/firewall_virtual_ip.php:248
+#: usr/local/www/firewall_virtual_ip.php:268
+#: usr/local/www/firewall_virtual_ip.php:291
+#: usr/local/www/firewall_virtual_ip.php:299
+msgid "The virtual IP addresses defined on this page may be used in"
+msgstr "Os endereços IP virtuais definidos nessa página podem ser usados em"
+
+#: usr/local/www/firewall_virtual_ip.php:242
+#: usr/local/www/firewall_virtual_ip.php:248
+#: usr/local/www/firewall_virtual_ip.php:268
+#: usr/local/www/firewall_virtual_ip.php:291
+#: usr/local/www/firewall_virtual_ip.php:299
+msgid "mappings."
+msgstr "mapeamentos."
+
+#: usr/local/www/firewall_virtual_ip.php:243
+#: usr/local/www/firewall_virtual_ip.php:249
+#: usr/local/www/firewall_virtual_ip.php:269
+#: usr/local/www/firewall_virtual_ip.php:292
+#: usr/local/www/firewall_virtual_ip.php:300
+msgid "You can check the status of your CARP Virtual IPs and interfaces "
+msgstr "Você pode verificar o status de seus IPs Virtuais CARP e interfaces "
+
+#: usr/local/www/guiconfig.inc:295 usr/local/www/guiconfig.inc:309
+#: usr/local/www/guiconfig.inc:298 usr/local/www/guiconfig.inc:297
+#: usr/local/www/guiconfig.inc:294 usr/local/www/guiconfig.inc:301
+msgid "apply"
+msgstr "aplicar"
+
+#: usr/local/www/guiconfig.inc:295 usr/local/www/guiconfig.inc:309
+#: usr/local/www/guiconfig.inc:298 usr/local/www/guiconfig.inc:297
+#: usr/local/www/guiconfig.inc:294 usr/local/www/guiconfig.inc:301
+msgid "save"
+msgstr "salvar"
+
+#: usr/local/www/guiconfig.inc:295 usr/local/www/vpn_ipsec_mobile.php:308
+#: usr/local/www/system_certmanager.php:541
+#: usr/local/www/system_certmanager.php:640 usr/local/www/guiconfig.inc:309
+#: usr/local/www/vpn_ipsec_mobile.php:335 usr/local/www/guiconfig.inc:298
+#: usr/local/www/system_certmanager.php:649 usr/local/www/guiconfig.inc:297
+#: usr/local/www/system_certmanager.php:650 usr/local/www/guiconfig.inc:294
+#: usr/local/www/guiconfig.inc:301
+msgid "create"
+msgstr "crie"
+
+#: usr/local/www/halt.php:52 usr/local/www/halt.php:61
+msgid "The system is halting now. This may take one minute."
+msgstr "O sistema está desligando agora. Isso pode levar um minuto."
+
+#: usr/local/www/halt.php:59 usr/local/www/halt.php:54
+msgid "Halt system"
+msgstr "Desligar sistema"
+
+#: usr/local/www/halt.php:67
+msgid "Are you sure you want to halt the system?"
+msgstr "Você tem certeza que deseja desligar o sistema?"
+
+#: usr/local/www/index.php:115 usr/local/www/index.php:126
+#: usr/local/www/index.php:129
+msgid "Widget configuration has been changed."
+msgstr "Configuração de componente foi modificada."
+
+#: usr/local/www/index.php:172 usr/local/www/index.php:183
+#: usr/local/www/index.php:186
+#, php-format
+msgid "Welcome to %s!\n"
+msgstr "Bem-vindo ao %s!\n"
+
+#: usr/local/www/index.php:173 usr/local/www/index.php:184
+#: usr/local/www/index.php:187
+msgid "One moment while we start the initial setup wizard."
+msgstr "Um minuto enquanto iniciamos o wizard de instalação inicial."
+
+#: usr/local/www/index.php:174 usr/local/www/index.php:185
+#: usr/local/www/index.php:188
+msgid "Embedded platform users: Please be patient, the wizard takes a little longer to run than the normal GUI."
+msgstr "Usuários de plataformas embutidas: Por favor, seja paciente, o wizard leva um tempo a maior para executar do que uma GUI normal."
+
+#: usr/local/www/index.php:175 usr/local/www/index.php:186
+#: usr/local/www/index.php:189
+#, php-format
+msgid "To bypass the wizard, click on the %s logo on the initial page."
+msgstr "Para evitar o wizard, clique no logo %s na página inicial."
+
+#: usr/local/www/index.php:454 usr/local/www/index.php:446
+#: usr/local/www/index.php:463 usr/local/www/index.php:468
+#: usr/local/www/index.php:465
+msgid "Status: Dashboard"
+msgstr "Status: Dashboard"
+
+#: usr/local/www/index.php:486 usr/local/www/index.php:478
+#: usr/local/www/index.php:490 usr/local/www/index.php:494
+#: usr/local/www/index.php:491
+msgid "Available Widgets"
+msgstr "Componentes Disponíveis"
+
+#: usr/local/www/index.php:524 usr/local/www/index.php:516
+#: usr/local/www/index.php:528 usr/local/www/index.php:531
+msgid "Welcome to the Dashboard page"
+msgstr "Bem-vindo à página do Painel"
+
+#: usr/local/www/index.php:532 usr/local/www/index.php:524
+#: usr/local/www/index.php:536 usr/local/www/index.php:538
+#: usr/local/www/index.php:535
+msgid "This page allows you to customize the information you want to be displayed!"
+msgstr "Essa página permite que você customize a informação que você quer exibir!"
+
+#: usr/local/www/index.php:533 usr/local/www/index.php:525
+#: usr/local/www/index.php:537 usr/local/www/index.php:539
+#: usr/local/www/index.php:536
+msgid "To get started click the"
+msgstr "Para iniciar, clique no"
+
+#: usr/local/www/index.php:533 usr/local/www/index.php:525
+#: usr/local/www/index.php:537 usr/local/www/index.php:539
+#: usr/local/www/index.php:536
+msgid "icon to add widgets."
+msgstr "para adicionar componentes."
+
+#: usr/local/www/index.php:535 usr/local/www/index.php:527
+#: usr/local/www/index.php:539 usr/local/www/index.php:541
+#: usr/local/www/index.php:538
+msgid "You can move any widget around by clicking and dragging the title."
+msgstr "Você pode mover qualquer componente clicando e arrastando o seu título."
+
+#: usr/local/www/index.php:541 usr/local/www/index.php:534
+#: usr/local/www/index.php:546 usr/local/www/index.php:548
+#: usr/local/www/index.php:545
+msgid "Click here to add widgets"
+msgstr "Clique aqui para adicionar componentes"
+
+#: usr/local/www/index.php:543 usr/local/www/index.php:536
+#: usr/local/www/index.php:548 usr/local/www/index.php:550
+#: usr/local/www/index.php:547
+msgid "Click here for help"
+msgstr "Clique aqui para receber ajuda"
+
+#: usr/local/www/index.php:547 usr/local/www/index.php:540
+#: usr/local/www/index.php:552 usr/local/www/index.php:554
+#: usr/local/www/index.php:551
+msgid "Save Settings"
+msgstr "Salvar Configurações"
+
+#: usr/local/www/index.php:699 usr/local/www/index.php:692
+#: usr/local/www/index.php:704 usr/local/www/index.php:701
+msgid "Loading selected widget"
+msgstr "Carregando componente selecionado"
+
+#: usr/local/www/interfaces.php:186 usr/local/www/interfaces.php:184
+#: usr/local/www/interfaces.php:185
+#, php-format
+msgid "Sorry, an alias with the name %s already exists."
+msgstr "Lamento, um alias com o nome %s já existe."
+
+#: usr/local/www/interfaces.php:327 usr/local/www/interfaces.php:355
+#: usr/local/www/interfaces.php:352 usr/local/www/interfaces.php:350
+#: usr/local/www/interfaces.php:351 usr/local/www/interfaces.php:353
+msgid "You have already applied your settings!"
+msgstr "Você já aplicou suas configurações!"
+
+#: usr/local/www/interfaces.php:407 usr/local/www/interfaces.php:443
+#: usr/local/www/interfaces.php:440 usr/local/www/interfaces.php:428
+#: usr/local/www/interfaces.php:433 usr/local/www/interfaces.php:429
+#: usr/local/www/interfaces.php:432
+msgid "An interface with the specified description already exists."
+msgstr "Uma interface com a descrição especificada já existe."
+
+#: usr/local/www/interfaces.php:413 usr/local/www/interfaces.php:449
+#: usr/local/www/interfaces.php:446 usr/local/www/interfaces.php:434
+#: usr/local/www/interfaces.php:439 usr/local/www/interfaces.php:435
+#: usr/local/www/interfaces.php:438
+msgid "The DHCP Server is active on this interface and it can be used only with a static IP configuration. Please disable the DHCP Server service on this interface first, then change the interface configuration."
+msgstr "O Servidor DHCP está ativo nessa interface e pode ser usado somente com uma configuração de IP estática. Por favor, desabilite o serviço do Servidor DHCP nessa interface primeiro, então modifique a configuração de interface."
+
+#: usr/local/www/interfaces.php:415 usr/local/www/interfaces.php:451
+#: usr/local/www/interfaces.php:448 usr/local/www/interfaces.php:436
+#: usr/local/www/interfaces.php:441 usr/local/www/interfaces.php:437
+#: usr/local/www/interfaces.php:440
+msgid "The DHCP6 Server is active on this interface and it can be used only with a static IPv6 configuration. Please disable the DHCPv6 Server service on this interface first, then change the interface configuration."
+msgstr "O Servidor DHCP6 está ativo nessa interface e pode ser usado somente com uma configuração de IPv6 estática. Por favor, desabilite o serviço do Servidor DHCPv6 nessa interface primeiro, então modifique a configuração de interface."
+
+#: usr/local/www/interfaces.php:420 usr/local/www/interfaces.php:1364
+#: usr/local/www/status_interfaces.php:192
+#: usr/local/www/status_interfaces.php:266 usr/local/www/interfaces.php:456
+#: usr/local/www/interfaces.php:1468 usr/local/www/status_interfaces.php:269
+#: usr/local/www/interfaces.php:453 usr/local/www/interfaces.php:1456
+#: usr/local/www/interfaces.php:441 usr/local/www/interfaces.php:1469
+#: usr/local/www/interfaces.php:446 usr/local/www/interfaces.php:1514
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:1508
+#: usr/local/www/interfaces.php:445 usr/local/www/interfaces.php:1521
+msgid "IPv4 address"
+msgstr "Endereço IPv4"
+
+#: usr/local/www/interfaces.php:420 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:456 usr/local/www/interfaces.php:509
+#: usr/local/www/interfaces.php:453 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:441 usr/local/www/interfaces.php:494
+#: usr/local/www/interfaces.php:446 usr/local/www/interfaces.php:499
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:495
+#: usr/local/www/interfaces.php:445 usr/local/www/interfaces.php:498
+msgid "Subnet bit count"
+msgstr "Contador de bit de subrede"
+
+#: usr/local/www/interfaces.php:427 usr/local/www/interfaces.php:480
+msgid "This interface is referenced by VIPs please delete those before setting the interface to 'none' configuration."
+msgstr "Essa interface é referenciada por VIPs, por favor apague-os antes de configurar a interface para 'nenhuma' configuração."
+
+#: usr/local/www/interfaces.php:432 usr/local/www/interfaces.php:485
+#: usr/local/www/interfaces.php:468 usr/local/www/interfaces.php:521
+#: usr/local/www/interfaces.php:531 usr/local/www/interfaces.php:541
+#: usr/local/www/interfaces.php:546 usr/local/www/interfaces.php:465
+#: usr/local/www/interfaces.php:518 usr/local/www/interfaces.php:528
+#: usr/local/www/interfaces.php:538 usr/local/www/interfaces.php:543
+#: usr/local/www/interfaces.php:453 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:516 usr/local/www/interfaces.php:526
+#: usr/local/www/interfaces.php:458 usr/local/www/interfaces.php:511
+#: usr/local/www/interfaces.php:523 usr/local/www/interfaces.php:533
+#: usr/local/www/interfaces.php:454 usr/local/www/interfaces.php:507
+#: usr/local/www/interfaces.php:519 usr/local/www/interfaces.php:529
+#: usr/local/www/interfaces.php:534 usr/local/www/interfaces.php:457
+#: usr/local/www/interfaces.php:510 usr/local/www/interfaces.php:522
+#: usr/local/www/interfaces.php:532 usr/local/www/interfaces.php:537
+#, php-format
+msgid "You have to reassign the interface to be able to configure as %s."
+msgstr "Você precisa reassociar a interface para ser capaz de configurar como %s."
+
+#: usr/local/www/interfaces.php:436 usr/local/www/interfaces.php:1748
+#: usr/local/www/interfaces.php:472 usr/local/www/interfaces.php:1926
+#: usr/local/www/interfaces.php:469 usr/local/www/interfaces.php:1914
+#: usr/local/www/interfaces.php:457 usr/local/www/interfaces.php:1938
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:1984
+#: usr/local/www/interfaces.php:458 usr/local/www/interfaces.php:1972
+#: usr/local/www/interfaces.php:461 usr/local/www/interfaces.php:2008
+msgid "Modem Port"
+msgstr "Porta do Modem"
+
+#: usr/local/www/interfaces.php:436 usr/local/www/interfaces.php:1736
+#: usr/local/www/interfaces_ppps_edit.php:182
+#: usr/local/www/interfaces_ppps_edit.php:523 usr/local/www/interfaces.php:472
+#: usr/local/www/interfaces.php:1914
+#: usr/local/www/interfaces_ppps_edit.php:524 usr/local/www/interfaces.php:469
+#: usr/local/www/interfaces.php:1902
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:530 usr/local/www/interfaces.php:457
+#: usr/local/www/interfaces.php:1926 usr/local/www/interfaces.php:462
+#: usr/local/www/interfaces.php:1972
+#: usr/local/www/interfaces_ppps_edit.php:528 usr/local/www/interfaces.php:458
+#: usr/local/www/interfaces.php:1960 usr/local/www/interfaces.php:461
+#: usr/local/www/interfaces.php:1996
+msgid "Phone Number"
+msgstr "Número de Telefone"
+
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:445
+#: usr/local/www/interfaces.php:478 usr/local/www/interfaces.php:481
+#: usr/local/www/interfaces.php:475 usr/local/www/interfaces.php:463
+#: usr/local/www/interfaces.php:466 usr/local/www/interfaces.php:468
+#: usr/local/www/interfaces.php:471 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:467 usr/local/www/interfaces.php:470
+msgid "PPPoE username"
+msgstr "Nome do Usuário PPPoE"
+
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:445
+#: usr/local/www/interfaces.php:478 usr/local/www/interfaces.php:481
+#: usr/local/www/interfaces.php:475 usr/local/www/interfaces.php:463
+#: usr/local/www/interfaces.php:466 usr/local/www/interfaces.php:468
+#: usr/local/www/interfaces.php:471 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:467 usr/local/www/interfaces.php:470
+msgid "PPPoE password"
+msgstr "Senha PPPoE"
+
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:452
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:1807
+#: usr/local/www/interfaces.php:1926
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:199 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:498
+#: usr/local/www/interfaces.php:1985 usr/local/www/interfaces.php:2104
+#: usr/local/www/interfaces.php:475 usr/local/www/interfaces.php:485
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:1973
+#: usr/local/www/interfaces.php:2092
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:205 usr/local/www/interfaces.php:463
+#: usr/local/www/interfaces.php:473 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:2000 usr/local/www/interfaces.php:2122
+#: usr/local/www/interfaces.php:468 usr/local/www/interfaces.php:2046
+#: usr/local/www/interfaces.php:2168 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:474 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:2035 usr/local/www/interfaces.php:2157
+#: usr/local/www/interfaces.php:467 usr/local/www/interfaces.php:477
+#: usr/local/www/interfaces.php:487 usr/local/www/interfaces.php:2071
+#: usr/local/www/interfaces.php:2193
+msgid "Dial on demand"
+msgstr "Discar sob demanda"
+
+#: usr/local/www/interfaces.php:442 usr/local/www/interfaces.php:452
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:199 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:498
+#: usr/local/www/interfaces.php:475 usr/local/www/interfaces.php:485
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:205 usr/local/www/interfaces.php:463
+#: usr/local/www/interfaces.php:473 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:468 usr/local/www/interfaces.php:464
+#: usr/local/www/interfaces.php:474 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:467 usr/local/www/interfaces.php:477
+#: usr/local/www/interfaces.php:487
+msgid "Idle timeout value"
+msgstr "Valor de tempo ocioso"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:480
+msgid "PPTP username"
+msgstr "Nome do Usuário PPTP"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:480
+msgid "PPTP password"
+msgstr "Senha PPTP"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:480
+msgid "PPTP local IP address"
+msgstr "Endereço IP local PPTP"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:480
+msgid "PPTP subnet"
+msgstr "Subrede PPTP"
+
+#: usr/local/www/interfaces.php:452 usr/local/www/interfaces.php:455
+#: usr/local/www/interfaces.php:488 usr/local/www/interfaces.php:491
+#: usr/local/www/interfaces.php:485 usr/local/www/interfaces.php:473
+#: usr/local/www/interfaces.php:476 usr/local/www/interfaces.php:478
+#: usr/local/www/interfaces.php:481 usr/local/www/interfaces.php:474
+#: usr/local/www/interfaces.php:477 usr/local/www/interfaces.php:480
+msgid "PPTP remote IP address"
+msgstr "Endereço IP remoto PPTP"
+
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:465
+#: usr/local/www/interfaces.php:498 usr/local/www/interfaces.php:501
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:486 usr/local/www/interfaces.php:488
+#: usr/local/www/interfaces.php:491 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:487 usr/local/www/interfaces.php:490
+msgid "L2TP username"
+msgstr "Nome do Usuário L2TP"
+
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:465
+#: usr/local/www/interfaces.php:498 usr/local/www/interfaces.php:501
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:486 usr/local/www/interfaces.php:488
+#: usr/local/www/interfaces.php:491 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:487 usr/local/www/interfaces.php:490
+msgid "L2TP password"
+msgstr "Senha L2TP"
+
+#: usr/local/www/interfaces.php:462 usr/local/www/interfaces.php:465
+#: usr/local/www/interfaces.php:498 usr/local/www/interfaces.php:501
+#: usr/local/www/interfaces.php:495 usr/local/www/interfaces.php:483
+#: usr/local/www/interfaces.php:486 usr/local/www/interfaces.php:488
+#: usr/local/www/interfaces.php:491 usr/local/www/interfaces.php:484
+#: usr/local/www/interfaces.php:487 usr/local/www/interfaces.php:490
+msgid "L2TP remote IP address"
+msgstr "Endereço IP remoto L2TP"
+
+#: usr/local/www/interfaces.php:473 usr/local/www/interfaces.php:1470
+#: usr/local/www/status_interfaces.php:216 usr/local/www/diag_ndp.php:129
+#: usr/local/www/services_dhcpv6.php:804
+#: usr/local/www/services_dhcpv6_edit.php:198
+#: usr/local/www/status_dhcpv6_leases.php:359
+#: usr/local/www/services_dhcpv6_edit.php:201
+#: usr/local/www/status_interfaces.php:297
+#: usr/local/www/status_dhcpv6_leases.php:403 usr/local/www/interfaces.php:509
+#: usr/local/www/interfaces.php:1576 usr/local/www/services_dhcpv6.php:899
+#: usr/local/www/services_dhcpv6_edit.php:200
+#: usr/local/www/status_interfaces.php:300
+#: usr/local/www/status_dhcpv6_leases.php:404 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:1564 usr/local/www/services_dhcpv6.php:830
+#: usr/local/www/status_dhcpv6_leases.php:407
+#: usr/local/www/services_dhcpv6_edit.php:203
+#: usr/local/www/services_dhcpv6.php:851 usr/local/www/interfaces.php:494
+#: usr/local/www/interfaces.php:1574 usr/local/www/interfaces.php:499
+#: usr/local/www/interfaces.php:1620 usr/local/www/interfaces.php:495
+#: usr/local/www/interfaces.php:1613 usr/local/www/interfaces.php:498
+#: usr/local/www/interfaces.php:1626
+msgid "IPv6 address"
+msgstr "Endereço IPv6"
+
+#: usr/local/www/interfaces.php:493 usr/local/www/interfaces.php:563
+#: usr/local/www/interfaces.php:560 usr/local/www/interfaces.php:550
+#: usr/local/www/interfaces.php:557 usr/local/www/interfaces.php:553
+#: usr/local/www/interfaces.php:556
+msgid "A valid IPv4 address must be specified."
+msgstr "Um endereço de IPv4 válido de ser especificado."
+
+#: usr/local/www/interfaces.php:495 usr/local/www/services_dhcpv6_edit.php:123
+#: usr/local/www/services_dhcpv6_edit.php:125 usr/local/www/interfaces.php:565
+#: usr/local/www/interfaces.php:562 usr/local/www/services_dhcpv6_edit.php:128
+#: usr/local/www/interfaces.php:574 usr/local/www/interfaces.php:570
+#: usr/local/www/interfaces.php:573
+msgid "A valid IPv6 address must be specified."
+msgstr "Um endereço de IPv6 válido de ser especificado."
+
+#: usr/local/www/interfaces.php:497 usr/local/www/interfaces.php:499
+#: usr/local/www/interfaces.php:567 usr/local/www/interfaces.php:569
+#: usr/local/www/interfaces.php:564 usr/local/www/interfaces.php:566
+#: usr/local/www/interfaces.php:579 usr/local/www/interfaces.php:581
+#: usr/local/www/interfaces.php:590 usr/local/www/interfaces.php:592
+#: usr/local/www/interfaces.php:586 usr/local/www/interfaces.php:588
+#: usr/local/www/interfaces.php:589 usr/local/www/interfaces.php:591
+msgid "A valid subnet bit count must be specified."
+msgstr "Um contador de bit de subrede válido deve ser especificado."
+
+#: usr/local/www/interfaces.php:501 usr/local/www/interfaces.php:571
+#: usr/local/www/interfaces.php:568 usr/local/www/interfaces.php:583
+#: usr/local/www/interfaces.php:594 usr/local/www/interfaces.php:590
+#: usr/local/www/interfaces.php:593
+msgid "A valid alias IP address must be specified."
+msgstr "Um alias de endereço IP válido deve ser especificado."
+
+#: usr/local/www/interfaces.php:503 usr/local/www/interfaces.php:573
+#: usr/local/www/interfaces.php:570 usr/local/www/interfaces.php:585
+#: usr/local/www/interfaces.php:596 usr/local/www/interfaces.php:592
+#: usr/local/www/interfaces.php:595
+msgid "A valid alias subnet bit count must be specified."
+msgstr "Um alias de contador de bit de subrede válido deve ser especificado."
+
+#: usr/local/www/interfaces.php:517 usr/local/www/system_routes_edit.php:103
+#: usr/local/www/system_routes_edit.php:104 usr/local/www/interfaces.php:587
+#: usr/local/www/interfaces.php:584 usr/local/www/interfaces.php:599
+#: usr/local/www/system_routes_edit.php:107 usr/local/www/interfaces.php:610
+#: usr/local/www/interfaces.php:606 usr/local/www/system_routes_edit.php:109
+#: usr/local/www/interfaces.php:611
+msgid "A valid gateway must be specified."
+msgstr "Um gateway válido deve ser especificado."
+
+#: usr/local/www/interfaces.php:521 usr/local/www/interfaces.php:591
+#: usr/local/www/interfaces.php:588 usr/local/www/interfaces.php:603
+#: usr/local/www/interfaces.php:614 usr/local/www/interfaces.php:610
+#: usr/local/www/interfaces.php:615
+msgid "The service name contains invalid characters."
+msgstr "O nome do serviço contém caracteres inválidos."
+
+#: usr/local/www/interfaces.php:523 usr/local/www/interfaces.php:539
+#: usr/local/www/interfaces_ppps_edit.php:217 usr/local/www/interfaces.php:593
+#: usr/local/www/interfaces.php:609 usr/local/www/interfaces.php:590
+#: usr/local/www/interfaces.php:606 usr/local/www/interfaces_ppps_edit.php:223
+#: usr/local/www/interfaces.php:605 usr/local/www/interfaces.php:621
+#: usr/local/www/interfaces.php:616 usr/local/www/interfaces.php:632
+#: usr/local/www/interfaces.php:612 usr/local/www/interfaces.php:628
+#: usr/local/www/interfaces.php:617 usr/local/www/interfaces.php:633
+msgid "The idle timeout value must be an integer."
+msgstr "O valor do tempo ocioso deve ser um inteiro."
+
+#: usr/local/www/interfaces.php:526 usr/local/www/interfaces_ppps_edit.php:220
+#: usr/local/www/interfaces.php:596 usr/local/www/interfaces.php:593
+#: usr/local/www/interfaces_ppps_edit.php:226 usr/local/www/interfaces.php:608
+#: usr/local/www/interfaces.php:619 usr/local/www/interfaces.php:615
+#: usr/local/www/interfaces.php:620
+msgid "A valid PPPoE reset hour must be specified (0-23)."
+msgstr "Uma hora de reinicialização do PPPoE válida deve ser especificada (0-23)."
+
+#: usr/local/www/interfaces.php:529 usr/local/www/interfaces_ppps_edit.php:223
+#: usr/local/www/interfaces.php:599 usr/local/www/interfaces.php:596
+#: usr/local/www/interfaces_ppps_edit.php:229 usr/local/www/interfaces.php:611
+#: usr/local/www/interfaces.php:622 usr/local/www/interfaces.php:618
+#: usr/local/www/interfaces.php:623
+msgid "A valid PPPoE reset minute must be specified (0-59)."
+msgstr "Minutos de reinicialização do PPPoE válidos deve ser especificado (0-59)."
+
+#: usr/local/www/interfaces.php:531 usr/local/www/interfaces_ppps_edit.php:225
+#: usr/local/www/interfaces.php:601 usr/local/www/interfaces.php:598
+#: usr/local/www/interfaces_ppps_edit.php:231 usr/local/www/interfaces.php:613
+#: usr/local/www/interfaces.php:624 usr/local/www/interfaces.php:620
+#: usr/local/www/interfaces.php:625
+msgid "A valid PPPoE reset date must be specified (mm/dd/yyyy)."
+msgstr "Uma data de reinicialização do PPPoE válida deve ser especificada (mm/dd/yyyy)."
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:603
+#: usr/local/www/interfaces.php:600 usr/local/www/interfaces.php:615
+#: usr/local/www/interfaces.php:626 usr/local/www/interfaces.php:622
+#: usr/local/www/interfaces.php:627
+msgid "A valid PPTP local IP address must be specified."
+msgstr "Um endereço de IP local PPTP válido deve ser especificado."
+
+#: usr/local/www/interfaces.php:535 usr/local/www/interfaces.php:605
+#: usr/local/www/interfaces.php:602 usr/local/www/interfaces.php:617
+#: usr/local/www/interfaces.php:628 usr/local/www/interfaces.php:624
+#: usr/local/www/interfaces.php:629
+msgid "A valid PPTP subnet bit count must be specified."
+msgstr "Um contador de bit de subrede PPTP deve ser especificado."
+
+#: usr/local/www/interfaces.php:537 usr/local/www/interfaces.php:607
+#: usr/local/www/interfaces.php:604 usr/local/www/interfaces.php:619
+#: usr/local/www/interfaces.php:630 usr/local/www/interfaces.php:626
+#: usr/local/www/interfaces.php:631
+msgid "A valid PPTP remote IP address must be specified."
+msgstr "Um endereço IP remoto PPTP válido deve ser especificado."
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:613
+#: usr/local/www/interfaces.php:610 usr/local/www/interfaces.php:625
+#: usr/local/www/interfaces.php:637 usr/local/www/interfaces.php:633
+#: usr/local/www/interfaces.php:638
+msgid "The MTU must be greater than 576 bytes."
+msgstr "O MTU deve ser maior que 576 bytes."
+
+#: usr/local/www/interfaces.php:545 usr/local/www/interfaces.php:615
+#: usr/local/www/interfaces.php:612 usr/local/www/interfaces.php:627
+#: usr/local/www/interfaces.php:668 usr/local/www/interfaces.php:664
+#: usr/local/www/interfaces.php:669
+msgid "The MSS must be greater than 576 bytes."
+msgstr "O MSS deve ser maior que 576 bytes."
+
+#: usr/local/www/interfaces.php:549 usr/local/www/interfaces.php:2164
+#: usr/local/www/load_balancer_pool.php:132 usr/local/www/vpn_ipsec.php:283
+#: usr/local/www/vpn_ipsec.php:457 usr/local/www/interfaces_wireless.php:107
+#: usr/local/www/interfaces_wireless_edit.php:84
+#: usr/local/www/interfaces_wireless_edit.php:176
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:187
+#: usr/local/www/load_balancer_virtual_server_edit.php:72
+#: usr/local/www/status_lb_pool.php:131 usr/local/www/vpn_ipsec_phase2.php:404
+#: usr/local/www/vpn_ipsec.php:294 usr/local/www/vpn_ipsec.php:468
+#: usr/local/www/system_advanced_misc.php:334
+#: usr/local/www/vpn_ipsec_phase2.php:430 usr/local/www/interfaces.php:619
+#: usr/local/www/interfaces.php:2342
+#: usr/local/www/load_balancer_pool_edit.php:195
+#: usr/local/www/load_balancer_pool.php:133 usr/local/www/vpn_ipsec.php:293
+#: usr/local/www/vpn_ipsec.php:467 usr/local/www/system_advanced_misc.php:353
+#: usr/local/www/interfaces_wireless.php:108
+#: usr/local/www/vpn_ipsec_phase2.php:496 usr/local/www/interfaces.php:616
+#: usr/local/www/interfaces.php:2330
+#: usr/local/www/load_balancer_pool_edit.php:193
+#: usr/local/www/load_balancer_pool.php:131
+#: usr/local/www/interfaces_wireless_edit.php:86
+#: usr/local/www/interfaces_wireless_edit.php:178
+#: usr/local/www/vpn_ipsec.php:299 usr/local/www/vpn_ipsec.php:473
+#: usr/local/www/interfaces_wireless.php:110
+#: usr/local/www/vpn_ipsec_phase2.php:518 usr/local/www/interfaces.php:631
+#: usr/local/www/interfaces.php:2360 usr/local/www/interfaces.php:672
+#: usr/local/www/interfaces.php:2406 usr/local/www/interfaces.php:668
+#: usr/local/www/interfaces.php:2395 usr/local/www/interfaces.php:673
+#: usr/local/www/interfaces.php:2431
+msgid "Mode"
+msgstr "Modo"
+
+#: usr/local/www/interfaces.php:549 usr/local/www/interfaces.php:2174
+#: usr/local/www/status_interfaces.php:265
+#: usr/local/www/status_interfaces.php:362 usr/local/www/interfaces.php:622
+#: usr/local/www/interfaces.php:2352 usr/local/www/status_interfaces.php:365
+#: usr/local/www/interfaces.php:619 usr/local/www/interfaces.php:2340
+#: usr/local/www/interfaces.php:634 usr/local/www/interfaces.php:2370
+#: usr/local/www/interfaces.php:675 usr/local/www/interfaces.php:2416
+#: usr/local/www/interfaces.php:671 usr/local/www/interfaces.php:2405
+#: usr/local/www/interfaces.php:676 usr/local/www/interfaces.php:2441
+msgid "SSID"
+msgstr "SSID"
+
+#: usr/local/www/interfaces.php:583 usr/local/www/interfaces.php:657
+#: usr/local/www/interfaces.php:654 usr/local/www/interfaces.php:669
+#: usr/local/www/interfaces.php:710 usr/local/www/interfaces.php:706
+#: usr/local/www/interfaces.php:711
+msgid "Invalid WEP key. Enter a valid 40, 64, 104 or 128 bit WEP key."
+msgstr "Tamanho de chave WEP inválido. Tamanhos devem ser de 40 (64) chaves de bit ou 104 (128) bits."
+
+#: usr/local/www/interfaces.php:591 usr/local/www/interfaces.php:665
+#: usr/local/www/interfaces.php:662 usr/local/www/interfaces.php:677
+#: usr/local/www/interfaces.php:718 usr/local/www/interfaces.php:714
+#: usr/local/www/interfaces.php:719
+msgid "The WPA passphrase must be between 8 and 63 characters long."
+msgstr "O tamanho da frase secreta deve ser entre 8 e 63 caracteres."
+
+#: usr/local/www/interfaces.php:659
+#, php-format
+msgid "Interface %s dynamic gateway"
+msgstr "Interface %s gateway dinâmico"
+
+#: usr/local/www/interfaces.php:1004 usr/local/www/interfaces.php:1090
+#: usr/local/www/interfaces.php:1078 usr/local/www/interfaces.php:1092
+#: usr/local/www/interfaces.php:1134 usr/local/www/interfaces.php:1129
+#: usr/local/www/interfaces.php:1142
+#, php-format
+msgid "Unable to change mode to %s. You may already have the maximum number of wireless clones supported in this mode."
+msgstr "Incapaz de mudar o modo para %s. Você já deve ter o número máximo de clones sem fio suportados para esse modo."
+
+#: usr/local/www/interfaces.php:1032 usr/local/www/interfaces.php:1118
+#: usr/local/www/interfaces.php:1106 usr/local/www/interfaces.php:1120
+#: usr/local/www/interfaces.php:1162 usr/local/www/interfaces.php:1157
+#: usr/local/www/interfaces.php:1170
+msgid "Static IPv4"
+msgstr "IPv4 Estático"
+
+#: usr/local/www/interfaces.php:1032 usr/local/www/vpn_pppoe.php:86
+#: usr/local/www/status_interfaces.php:109
+#: usr/local/www/status_interfaces.php:127 usr/local/www/interfaces.php:1118
+#: usr/local/www/status_interfaces.php:130 usr/local/www/interfaces.php:1106
+#: usr/local/www/vpn_pppoe.php:87 usr/local/www/interfaces.php:1120
+#: usr/local/www/interfaces.php:1162 usr/local/www/interfaces.php:1157
+#: usr/local/www/interfaces.php:1170
+msgid "PPPoE"
+msgstr "PPPoE"
+
+#: usr/local/www/interfaces.php:1032 usr/local/www/status_interfaces.php:124
+#: usr/local/www/fbegin.inc:149 usr/local/www/fbegin.inc:166
+#: usr/local/www/status_interfaces.php:142 usr/local/www/interfaces.php:1118
+#: usr/local/www/fbegin.inc:174 usr/local/www/status_interfaces.php:145
+#: usr/local/www/interfaces.php:1106 usr/local/www/fbegin.inc:165
+#: usr/local/www/interfaces.php:1120 usr/local/www/interfaces.php:1162
+#: usr/local/www/interfaces.php:1157 usr/local/www/interfaces.php:1170
+msgid "PPTP"
+msgstr "PPTP"
+
+#: usr/local/www/interfaces.php:1032 usr/local/www/status_interfaces.php:139
+#: usr/local/www/fbegin.inc:150 usr/local/www/vpn_l2tp.php:38
+#: usr/local/www/vpn_l2tp_users.php:38
+#: usr/local/www/vpn_l2tp_users_edit.php:38 usr/local/www/fbegin.inc:167
+#: usr/local/www/status_interfaces.php:157 usr/local/www/interfaces.php:1118
+#: usr/local/www/fbegin.inc:175 usr/local/www/status_interfaces.php:160
+#: usr/local/www/interfaces.php:1106 usr/local/www/fbegin.inc:166
+#: usr/local/www/interfaces.php:1120 usr/local/www/interfaces.php:1162
+#: usr/local/www/interfaces.php:1157 usr/local/www/interfaces.php:1170
+msgid "L2TP"
+msgstr "L2TP"
+
+#: usr/local/www/interfaces.php:1033 usr/local/www/interfaces.php:1119
+#: usr/local/www/interfaces.php:1107 usr/local/www/interfaces.php:1121
+#: usr/local/www/interfaces.php:1163 usr/local/www/interfaces.php:1158
+#: usr/local/www/interfaces.php:1171
+msgid "Static IPv6"
+msgstr "IPv6 Estático"
+
+#: usr/local/www/interfaces.php:1033 usr/local/www/interfaces.php:1119
+#: usr/local/www/interfaces.php:1107 usr/local/www/interfaces.php:1121
+#: usr/local/www/interfaces.php:1163 usr/local/www/interfaces.php:1158
+#: usr/local/www/interfaces.php:1171
+msgid "DHCP6"
+msgstr "DHCP6"
+
+#: usr/local/www/interfaces.php:1222 usr/local/www/interfaces.php:1326
+#: usr/local/www/interfaces.php:1314 usr/local/www/interfaces.php:1327
+#: usr/local/www/interfaces.php:1369 usr/local/www/interfaces.php:1364
+#: usr/local/www/interfaces.php:1377
+#, php-format
+msgid "The %s configuration has been changed."
+msgstr "A configuração %s foi modificada."
+
+#: usr/local/www/interfaces.php:1222 usr/local/www/interfaces.php:1326
+#: usr/local/www/interfaces.php:1314 usr/local/www/interfaces.php:1327
+#: usr/local/www/interfaces.php:1369 usr/local/www/interfaces.php:1364
+#: usr/local/www/interfaces.php:1377
+msgid "Don't forget to adjust the DHCP Server range if needed after applying."
+msgstr "Não esqueça de ajustar o intervalo do Servidor DHCP se necessário após aplicação."
+
+#: usr/local/www/interfaces.php:1231 usr/local/www/interfaces.php:1335
+#: usr/local/www/interfaces.php:1323 usr/local/www/interfaces.php:1336
+#: usr/local/www/interfaces.php:1378 usr/local/www/interfaces.php:1373
+#: usr/local/www/interfaces.php:1386
+msgid "General configuration"
+msgstr "Configuração Geral"
+
+#: usr/local/www/interfaces.php:1237 usr/local/www/interfaces.php:1341
+#: usr/local/www/interfaces.php:1329 usr/local/www/interfaces.php:1342
+#: usr/local/www/interfaces.php:1384 usr/local/www/interfaces.php:1379
+#: usr/local/www/interfaces.php:1392
+msgid "Enable Interface"
+msgstr "Habilitar Interface"
+
+#: usr/local/www/interfaces.php:1247 usr/local/www/interfaces.php:1351
+#: usr/local/www/interfaces.php:1339 usr/local/www/interfaces.php:1352
+#: usr/local/www/interfaces.php:1394 usr/local/www/interfaces.php:1389
+#: usr/local/www/interfaces.php:1402
+msgid "Enter a description (name) for the interface here."
+msgstr "Informe a descrição (nome) para a interface aqui."
+
+#: usr/local/www/interfaces.php:1251 usr/local/www/interfaces.php:1355
+#: usr/local/www/interfaces.php:1343 usr/local/www/interfaces.php:1356
+#: usr/local/www/interfaces.php:1398 usr/local/www/interfaces.php:1393
+#: usr/local/www/interfaces.php:1406
+msgid "IPv4 Configuration Type"
+msgstr "Tipo de Configuração IPv4"
+
+#: usr/local/www/interfaces.php:1267 usr/local/www/interfaces.php:1371
+#: usr/local/www/interfaces.php:1359 usr/local/www/interfaces.php:1372
+#: usr/local/www/interfaces.php:1414 usr/local/www/interfaces.php:1409
+#: usr/local/www/interfaces.php:1422
+msgid "IPv6 Configuration Type"
+msgstr "Tipo de Configuração IPv6"
+
+#: usr/local/www/interfaces.php:1292 usr/local/www/interfaces.php:1396
+#: usr/local/www/interfaces.php:1384 usr/local/www/interfaces.php:1397
+#: usr/local/www/interfaces.php:1439 usr/local/www/interfaces.php:1434
+#: usr/local/www/interfaces.php:1447
+msgid "Insert my local MAC address"
+msgstr "Insira meu endereço MAC local"
+
+#: usr/local/www/interfaces.php:1295 usr/local/www/interfaces.php:1399
+#: usr/local/www/interfaces.php:1387 usr/local/www/interfaces.php:1400
+#: usr/local/www/interfaces.php:1442 usr/local/www/interfaces.php:1437
+#: usr/local/www/interfaces.php:1450
+msgid "This field can be used to modify (\"spoof\") the MAC address of this interface"
+msgstr "Esse campo pode ser usado para modificar (\"spoof\") o endereço MAC da interface WAN"
+
+#: usr/local/www/interfaces.php:1297 usr/local/www/interfaces.php:1401
+#: usr/local/www/interfaces.php:1389 usr/local/www/interfaces.php:1402
+#: usr/local/www/interfaces.php:1444 usr/local/www/interfaces.php:1439
+#: usr/local/www/interfaces.php:1452
+msgid "(may be required with some cable connections)"
+msgstr "(pode ser requerido em algumas conexões a cabo)"
+
+#: usr/local/www/interfaces.php:1298 usr/local/www/interfaces.php:1402
+#: usr/local/www/interfaces.php:1390 usr/local/www/interfaces.php:1403
+#: usr/local/www/interfaces.php:1445 usr/local/www/interfaces.php:1440
+#: usr/local/www/interfaces.php:1453
+msgid "Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx or leave blank"
+msgstr "Informe o endereço MAC no seguinte formato: xx:xx:xx:xx:xx:xx ou deixe em branco"
+
+#: usr/local/www/interfaces.php:1303
+#: usr/local/www/interfaces_ppps_edit.php:757
+#: usr/local/www/interfaces.php:1407
+#: usr/local/www/interfaces_ppps_edit.php:758
+#: usr/local/www/interfaces.php:1395
+#: usr/local/www/interfaces_ppps_edit.php:764
+#: usr/local/www/interfaces.php:1408 usr/local/www/interfaces.php:1450
+#: usr/local/www/interfaces_ppps_edit.php:761
+#: usr/local/www/interfaces.php:1445 usr/local/www/interfaces.php:1458
+msgid "MTU"
+msgstr "MTU"
+
+#: usr/local/www/interfaces.php:1307
+msgid "If you leave this field blank, the adapter's default MTU will be used. This is typically 1500 bytes but can vary on some hardware."
+msgstr "Se você deixar essa campo em branco, o MTU padrão do adaptador será usado. Isso tem normalmente 1500 bytes, mas pode variar em alguns hardwares."
+
+#: usr/local/www/interfaces.php:1312 usr/local/www/interfaces.php:1416
+#: usr/local/www/interfaces.php:1404 usr/local/www/interfaces.php:1417
+#: usr/local/www/interfaces.php:1461 usr/local/www/interfaces.php:1456
+#: usr/local/www/interfaces.php:1469
+msgid "MSS"
+msgstr "MSS"
+
+#: usr/local/www/interfaces.php:1316 usr/local/www/interfaces.php:1420
+#: usr/local/www/interfaces.php:1408 usr/local/www/interfaces.php:1421
+#: usr/local/www/interfaces.php:1465 usr/local/www/interfaces.php:1460
+#: usr/local/www/interfaces.php:1473
+msgid "If you enter a value in this field, then MSS clamping for TCP connections to the value entered above minus 40 (TCP/IP header size) will be in effect."
+msgstr "Se você informar um valor nesse campo, então o MSS clamping para as conexões TCP para o valor informado acima menos 40 (tamanho do cabeçalho TCP/IP) terá efeito."
+
+#: usr/local/www/interfaces.php:1325 usr/local/www/interfaces.php:1429
+#: usr/local/www/interfaces.php:1417 usr/local/www/interfaces.php:1430
+#: usr/local/www/interfaces.php:1474 usr/local/www/interfaces.php:1469
+#: usr/local/www/interfaces.php:1482
+msgid "Speed and duplex"
+msgstr "Protocolo Speed e Duplex"
+
+#: usr/local/www/interfaces.php:1346 usr/local/www/interfaces.php:1450
+#: usr/local/www/interfaces.php:1438 usr/local/www/interfaces.php:1451
+#: usr/local/www/interfaces.php:1495 usr/local/www/interfaces.php:1490
+#: usr/local/www/interfaces.php:1503
+msgid "Here you can explicitly set speed and duplex mode for this interface. WARNING: You MUST leave this set to autoselect (automatically negotiate speed) unless the port this interface connects to has its speed and duplex forced."
+msgstr "Aqui voce pode definir explicitamente o modo que a placa irá trabalhar, Speed ou Duplex. Aviso: Caso deixe a opção autoselect(a negociação será feita automaticamente) ao menos que a porta onde se conecta a interfece tenha o Speed e Duplex forçado."
+
+#: usr/local/www/interfaces.php:1361 usr/local/www/interfaces.php:1465
+#: usr/local/www/interfaces.php:1453 usr/local/www/interfaces.php:1466
+#: usr/local/www/interfaces.php:1511 usr/local/www/interfaces.php:1505
+#: usr/local/www/interfaces.php:1518
+msgid "Static IPv4 configuration"
+msgstr "Configuração IPv4 estático"
+
+#: usr/local/www/interfaces.php:1400 usr/local/www/interfaces.php:1506
+#: usr/local/www/system_routes_edit.php:212
+#: usr/local/www/system_routes_edit.php:244 usr/local/www/interfaces.php:1504
+#: usr/local/www/interfaces.php:1612 usr/local/www/system_routes_edit.php:245
+#: usr/local/www/interfaces.php:1492 usr/local/www/interfaces.php:1600
+#: usr/local/www/interfaces.php:1505 usr/local/www/interfaces.php:1610
+#: usr/local/www/system_routes_edit.php:272 usr/local/www/interfaces.php:1550
+#: usr/local/www/interfaces.php:1656 usr/local/www/system_routes_edit.php:274
+#: usr/local/www/interfaces.php:1544 usr/local/www/interfaces.php:1649
+#: usr/local/www/system_routes_edit.php:276 usr/local/www/interfaces.php:1557
+#: usr/local/www/interfaces.php:1662
+msgid "add a new one."
+msgstr "adicionar uma nova."
+
+#: usr/local/www/interfaces.php:1403 usr/local/www/interfaces.php:1507
+#: usr/local/www/interfaces.php:1495 usr/local/www/interfaces.php:1508
+#: usr/local/www/interfaces.php:1553 usr/local/www/interfaces.php:1547
+#: usr/local/www/interfaces.php:1560
+msgid "If this interface is an Internet connection, select an existing Gateway from the list or add one using the link above"
+msgstr "Se essa interface é uma conexão com Internet, selecione um Gateway existente da lista ou adicione um link abaixo"
+
+#: usr/local/www/interfaces.php:1417 usr/local/www/system_routes_edit.php:224
+#: usr/local/www/system_routes_edit.php:256 usr/local/www/interfaces.php:1521
+#: usr/local/www/system_routes_edit.php:257 usr/local/www/interfaces.php:1509
+#: usr/local/www/interfaces.php:1522 usr/local/www/system_routes_edit.php:283
+#: usr/local/www/interfaces.php:1567 usr/local/www/system_routes_edit.php:287
+#: usr/local/www/interfaces.php:1561 usr/local/www/system_routes_edit.php:289
+#: usr/local/www/interfaces.php:1574
+msgid "Add new gateway:"
+msgstr "Adicionar novo gateway:"
+
+#: usr/local/www/interfaces.php:1425 usr/local/www/interfaces.php:1529
+#: usr/local/www/interfaces.php:1517 usr/local/www/interfaces.php:1530
+#: usr/local/www/interfaces.php:1575 usr/local/www/interfaces.php:1569
+#: usr/local/www/interfaces.php:1582
+msgid "Default gateway:"
+msgstr "Gateway padrão:"
+
+#: usr/local/www/interfaces.php:1428 usr/local/www/system_routes_edit.php:240
+#: usr/local/www/system_routes_edit.php:272 usr/local/www/interfaces.php:1532
+#: usr/local/www/system_routes_edit.php:273 usr/local/www/interfaces.php:1520
+#: usr/local/www/interfaces.php:1533 usr/local/www/system_routes_edit.php:299
+#: usr/local/www/interfaces.php:1578 usr/local/www/system_routes_edit.php:305
+#: usr/local/www/interfaces.php:1572 usr/local/www/system_routes_edit.php:307
+#: usr/local/www/interfaces.php:1585
+msgid "Gateway Name:"
+msgstr "Nome do Gateway:"
+
+#: usr/local/www/interfaces.php:1431 usr/local/www/interfaces.php:1535
+#: usr/local/www/interfaces.php:1523 usr/local/www/interfaces.php:1536
+#: usr/local/www/interfaces.php:1581 usr/local/www/interfaces.php:1575
+#: usr/local/www/interfaces.php:1588
+msgid "Gateway IPv4:"
+msgstr "IPv4 do Gateway:"
+
+#: usr/local/www/interfaces.php:1434 usr/local/www/interfaces.php:1540
+#: usr/local/www/system_routes_edit.php:246
+#: usr/local/www/system_routes_edit.php:278 usr/local/www/interfaces.php:1538
+#: usr/local/www/interfaces.php:1646 usr/local/www/system_routes_edit.php:279
+#: usr/local/www/interfaces.php:1526 usr/local/www/interfaces.php:1634
+#: usr/local/www/interfaces.php:1539 usr/local/www/interfaces.php:1644
+#: usr/local/www/system_routes_edit.php:305 usr/local/www/interfaces.php:1584
+#: usr/local/www/interfaces.php:1690 usr/local/www/system_routes_edit.php:311
+#: usr/local/www/interfaces.php:1578 usr/local/www/interfaces.php:1683
+#: usr/local/www/system_routes_edit.php:313 usr/local/www/interfaces.php:1591
+#: usr/local/www/interfaces.php:1696
+msgid "Description:"
+msgstr "Descrição:"
+
+#: usr/local/www/interfaces.php:1442 usr/local/www/interfaces.php:1548
+#: usr/local/www/system_routes_edit.php:254
+#: usr/local/www/system_routes_edit.php:286 usr/local/www/interfaces.php:1654
+#: usr/local/www/system_routes_edit.php:287 usr/local/www/interfaces.php:1536
+#: usr/local/www/interfaces.php:1642 usr/local/www/interfaces.php:1546
+#: usr/local/www/interfaces.php:1651 usr/local/www/system_routes_edit.php:312
+#: usr/local/www/interfaces.php:1591 usr/local/www/interfaces.php:1697
+#: usr/local/www/system_routes_edit.php:318 usr/local/www/interfaces.php:1585
+#: usr/local/www/interfaces.php:1690 usr/local/www/system_routes_edit.php:320
+#: usr/local/www/interfaces.php:1598 usr/local/www/interfaces.php:1703
+msgid "Save Gateway"
+msgstr "Salvar Gateway"
+
+#: usr/local/www/interfaces.php:1467 usr/local/www/interfaces.php:1573
+#: usr/local/www/interfaces.php:1561 usr/local/www/interfaces.php:1571
+#: usr/local/www/interfaces.php:1617 usr/local/www/interfaces.php:1610
+#: usr/local/www/interfaces.php:1623
+msgid "Static IPv6 configuration"
+msgstr "Configuração IPv6 estático"
+
+#: usr/local/www/interfaces.php:1488 usr/local/www/status_interfaces.php:231
+#: usr/local/www/status_interfaces.php:312 usr/local/www/interfaces.php:1594
+#: usr/local/www/status_interfaces.php:315 usr/local/www/interfaces.php:1582
+#: usr/local/www/interfaces.php:1592 usr/local/www/interfaces.php:1638
+#: usr/local/www/interfaces.php:1631 usr/local/www/interfaces.php:1644
+msgid "Gateway IPv6"
+msgstr "IPv6 do Gateway"
+
+#: usr/local/www/interfaces.php:1509 usr/local/www/interfaces.php:1615
+#: usr/local/www/interfaces.php:1603 usr/local/www/interfaces.php:1613
+#: usr/local/www/interfaces.php:1659 usr/local/www/interfaces.php:1652
+#: usr/local/www/interfaces.php:1665
+msgid "If this interface is an Internet connection, select an existing Gateway from the list or add a new one using the link above"
+msgstr "Se essa interface é uma conexão com Internet, selecione um Gateway existente da lista ou adicione um novo na linha abaixo"
+
+#: usr/local/www/interfaces.php:1523 usr/local/www/interfaces.php:1629
+#: usr/local/www/interfaces.php:1617 usr/local/www/interfaces.php:1627
+#: usr/local/www/interfaces.php:1673 usr/local/www/interfaces.php:1666
+#: usr/local/www/interfaces.php:1679
+msgid "Add new v6 gateway:"
+msgstr "Adicionar novo v6 gateway:"
+
+#: usr/local/www/interfaces.php:1531 usr/local/www/interfaces.php:1637
+#: usr/local/www/interfaces.php:1625 usr/local/www/interfaces.php:1635
+#: usr/local/www/interfaces.php:1681 usr/local/www/interfaces.php:1674
+#: usr/local/www/interfaces.php:1687
+msgid "Default v6 gateway:"
+msgstr "Gateway v6 padrão:"
+
+#: usr/local/www/interfaces.php:1534 usr/local/www/interfaces.php:1640
+#: usr/local/www/interfaces.php:1628 usr/local/www/interfaces.php:1638
+#: usr/local/www/interfaces.php:1684 usr/local/www/interfaces.php:1677
+#: usr/local/www/interfaces.php:1690
+msgid "Gateway Name IPv6:"
+msgstr "Nome do Gateway IPv6:"
+
+#: usr/local/www/interfaces.php:1537 usr/local/www/interfaces.php:1643
+#: usr/local/www/interfaces.php:1631 usr/local/www/interfaces.php:1641
+#: usr/local/www/interfaces.php:1687 usr/local/www/interfaces.php:1680
+#: usr/local/www/interfaces.php:1693
+msgid "Gateway IPv6:"
+msgstr "IPv6 do Gateway:"
+
+#: usr/local/www/interfaces.php:1564
+msgid "DHCPv6 Prefix Delegation ID"
+msgstr "ID da Delegação de Prefixo DHCPv6"
+
+#: usr/local/www/interfaces.php:1588
+msgid "This ID sets the delegated DHCP-PD prefix number which will be used to setup the interface."
+msgstr "Este ID define o numero da delegação DHCP-PD que será usada para configurar a interface."
+
+#: usr/local/www/interfaces.php:1598 usr/local/www/interfaces.php:1676
+#: usr/local/www/interfaces.php:1664 usr/local/www/interfaces.php:1722
+#: usr/local/www/interfaces.php:1714 usr/local/www/interfaces.php:1727
+msgid "DHCP client configuration"
+msgstr "Configuração do cliente DHCP"
+
+#: usr/local/www/interfaces.php:1602 usr/local/www/interfaces.php:1680
+#: usr/local/www/interfaces.php:1668 usr/local/www/interfaces.php:1726
+#: usr/local/www/interfaces.php:1718 usr/local/www/interfaces.php:1731
+msgid "Enable DHCP+"
+msgstr "Habilitar DHCP+"
+
+#: usr/local/www/interfaces.php:1605 usr/local/www/interfaces.php:1683
+#: usr/local/www/interfaces.php:1671 usr/local/www/interfaces.php:1729
+#: usr/local/www/interfaces.php:1721 usr/local/www/interfaces.php:1734
+msgid "Enable DHCP+L2TP or DHCP+PPTP."
+msgstr "Habilitar DHCP+L2TP ou DHCP+PPTP."
+
+#: usr/local/www/interfaces.php:1607 usr/local/www/interfaces.php:1685
+#: usr/local/www/interfaces.php:1673 usr/local/www/interfaces.php:1731
+#: usr/local/www/interfaces.php:1723 usr/local/www/interfaces.php:1736
+msgid "Status changes on this interface will trigger reconfiguration (if necessary) of the associated PPTP/L2TP link."
+msgstr "Mudanças de status nesta interface irão disparar a reconfiguração (se necessário) do link PPTP/L2TP associado."
+
+#: usr/local/www/interfaces.php:1616 usr/local/www/interfaces.php:1694
+#: usr/local/www/interfaces.php:1682 usr/local/www/interfaces.php:1740
+#: usr/local/www/interfaces.php:1732 usr/local/www/interfaces.php:1745
+msgid "The value in this field is sent as the DHCP client identifier and hostname when requesting a DHCP lease. Some ISPs may require this (for client identification)."
+msgstr "O valor desse campo é enviado como o identificador e nome de host do cliente DHCP quando requisitar uma concessão DHCP. Alguns ISPs podem requerer isso (para identificação do cliente)."
+
+#: usr/local/www/interfaces.php:1622 usr/local/www/interfaces.php:1700
+#: usr/local/www/interfaces.php:1688 usr/local/www/interfaces.php:1746
+#: usr/local/www/interfaces.php:1738 usr/local/www/interfaces.php:1751
+msgid "Alias IPv4 address"
+msgstr "Alias de Endereço IPv4"
+
+#: usr/local/www/interfaces.php:1636 usr/local/www/interfaces.php:1714
+#: usr/local/www/interfaces.php:1702 usr/local/www/interfaces.php:1760
+#: usr/local/www/interfaces.php:1752 usr/local/www/interfaces.php:1765
+msgid "The value in this field is used as a fixed alias IPv4 address by the DHCP client."
+msgstr "O valor desse campo é usado como um alias de endereço IPv4 fixo pelo cliente DHCP."
+
+#: usr/local/www/interfaces.php:1647 usr/local/www/interfaces.php:1725
+#: usr/local/www/interfaces.php:1713 usr/local/www/interfaces.php:1728
+#: usr/local/www/interfaces.php:1774 usr/local/www/interfaces.php:1766
+#: usr/local/www/interfaces.php:1788
+msgid "DHCP6 client configuration"
+msgstr "Configuração do cliente DHCPv6"
+
+#: usr/local/www/interfaces.php:1650 usr/local/www/interfaces.php:1729
+#: usr/local/www/interfaces.php:1717 usr/local/www/interfaces.php:1732
+#: usr/local/www/interfaces.php:1778 usr/local/www/interfaces.php:1770
+#: usr/local/www/interfaces.php:1792
+msgid "DHCPv6 Unique Identifier (DUID)"
+msgstr "Identificador Unico do DHCPv6 (DUID)"
+
+#: usr/local/www/interfaces.php:1654 usr/local/www/interfaces.php:1733
+#: usr/local/www/interfaces.php:1721 usr/local/www/interfaces.php:1736
+#: usr/local/www/interfaces.php:1782 usr/local/www/interfaces.php:1774
+#: usr/local/www/interfaces.php:1796
+msgid "The value in this field is sent as the DHCPv6 client identifier when requesting a DHCPv6 lease."
+msgstr "O valor neste campo é enviado como o identificador de cliente DHCPv6 ao solicitar um DHCPv6 lease."
+
+#: usr/local/www/interfaces.php:1659 usr/local/www/interfaces.php:1738
+#: usr/local/www/interfaces.php:1726 usr/local/www/interfaces.php:1741
+#: usr/local/www/interfaces.php:1787 usr/local/www/interfaces.php:1779
+#: usr/local/www/interfaces.php:1801
+#, php-format
+msgid "The current DUID is: '%s'"
+msgstr "O DUID atual é: '%s'"
+
+#: usr/local/www/interfaces.php:1665 usr/local/www/interfaces.php:1745
+#: usr/local/www/interfaces.php:1733 usr/local/www/interfaces.php:1748
+#: usr/local/www/interfaces.php:1794 usr/local/www/interfaces.php:1786
+#: usr/local/www/interfaces.php:1822
+msgid "DHCPv6 Prefix Delegation size"
+msgstr "Tamanho do Prefixo DHCPv6 delegado"
+
+#: usr/local/www/interfaces.php:1678 usr/local/www/interfaces.php:1758
+#: usr/local/www/interfaces.php:1746 usr/local/www/interfaces.php:1761
+#: usr/local/www/interfaces.php:1807 usr/local/www/interfaces.php:1799
+#: usr/local/www/interfaces.php:1835
+msgid "The value in this field is the delegated prefix length provided by the DHCPv6 server. Normally specified by the ISP."
+msgstr "O valor neste campo é o comprimento do prefixo delegada fornecidos pelo servidor DHCPv6. Normalmente especificado pelo ISP."
+
+#: usr/local/www/interfaces.php:1689 usr/local/www/interfaces.php:1867
+#: usr/local/www/interfaces.php:1855 usr/local/www/interfaces.php:1879
+#: usr/local/www/interfaces.php:1925 usr/local/www/interfaces.php:1913
+#: usr/local/www/interfaces.php:1949
+msgid "PPP configuration"
+msgstr "Configuração PPP"
+
+#: usr/local/www/interfaces.php:1692
+#: usr/local/www/interfaces_ppps_edit.php:478
+#: usr/local/www/interfaces.php:1870
+#: usr/local/www/interfaces_ppps_edit.php:479
+#: usr/local/www/interfaces.php:1858
+#: usr/local/www/interfaces_ppps_edit.php:485
+#: usr/local/www/interfaces.php:1882 usr/local/www/interfaces.php:1928
+#: usr/local/www/interfaces_ppps_edit.php:483
+#: usr/local/www/interfaces.php:1916 usr/local/www/interfaces.php:1952
+msgid "Service Provider"
+msgstr "Fornecedor de Serviço"
+
+#: usr/local/www/interfaces.php:1696
+#: usr/local/www/interfaces_ppps_edit.php:482
+#: usr/local/www/interfaces.php:1874
+#: usr/local/www/interfaces_ppps_edit.php:483
+#: usr/local/www/interfaces.php:1862
+#: usr/local/www/interfaces_ppps_edit.php:489
+#: usr/local/www/interfaces.php:1886 usr/local/www/interfaces.php:1932
+#: usr/local/www/interfaces_ppps_edit.php:487
+#: usr/local/www/interfaces.php:1920 usr/local/www/interfaces.php:1956
+msgid "Country:"
+msgstr "País:"
+
+#: usr/local/www/interfaces.php:1704
+#: usr/local/www/interfaces_ppps_edit.php:490
+#: usr/local/www/interfaces.php:1882
+#: usr/local/www/interfaces_ppps_edit.php:491
+#: usr/local/www/interfaces.php:1870
+#: usr/local/www/interfaces_ppps_edit.php:497
+#: usr/local/www/interfaces.php:1894 usr/local/www/interfaces.php:1940
+#: usr/local/www/interfaces_ppps_edit.php:495
+#: usr/local/www/interfaces.php:1928 usr/local/www/interfaces.php:1964
+msgid "Provider:"
+msgstr "Fornecedor:"
+
+#: usr/local/www/interfaces.php:1712
+#: usr/local/www/interfaces_ppps_edit.php:498
+#: usr/local/www/interfaces.php:1890
+#: usr/local/www/interfaces_ppps_edit.php:499
+#: usr/local/www/interfaces.php:1878
+#: usr/local/www/interfaces_ppps_edit.php:505
+#: usr/local/www/interfaces.php:1902 usr/local/www/interfaces.php:1948
+#: usr/local/www/interfaces_ppps_edit.php:503
+#: usr/local/www/interfaces.php:1936 usr/local/www/interfaces.php:1972
+msgid "Plan:"
+msgstr "Plano:"
+
+#: usr/local/www/interfaces.php:1720
+#: usr/local/www/interfaces_ppps_edit.php:506
+#: usr/local/www/interfaces.php:1898
+#: usr/local/www/interfaces_ppps_edit.php:507
+#: usr/local/www/interfaces.php:1886
+#: usr/local/www/interfaces_ppps_edit.php:513
+#: usr/local/www/interfaces.php:1910 usr/local/www/interfaces.php:1956
+#: usr/local/www/interfaces_ppps_edit.php:511
+#: usr/local/www/interfaces.php:1944 usr/local/www/interfaces.php:1980
+msgid "Select to fill in data for your service provider."
+msgstr "Selecione para preencher dados para seu fornecedor de serviços."
+
+#: usr/local/www/interfaces.php:1742
+#: usr/local/www/interfaces_ppps_edit.php:530
+#: usr/local/www/interfaces.php:1920
+#: usr/local/www/interfaces_ppps_edit.php:531
+#: usr/local/www/interfaces.php:1908
+#: usr/local/www/interfaces_ppps_edit.php:537
+#: usr/local/www/interfaces.php:1932 usr/local/www/interfaces.php:1978
+#: usr/local/www/interfaces_ppps_edit.php:535
+#: usr/local/www/interfaces.php:1966 usr/local/www/interfaces.php:2002
+msgid "Access Point Name (APN)"
+msgstr "Nome do Ponto de Acesso (APN)"
+
+#: usr/local/www/interfaces.php:1766 usr/local/www/interfaces.php:1944
+#: usr/local/www/interfaces.php:1932 usr/local/www/interfaces.php:1956
+#: usr/local/www/interfaces.php:2002 usr/local/www/interfaces.php:1991
+#: usr/local/www/interfaces.php:2027
+msgid "Advanced PPP"
+msgstr "PPP Avançado"
+
+#: usr/local/www/interfaces.php:1769 usr/local/www/interfaces.php:1774
+#: usr/local/www/interfaces.php:1875 usr/local/www/interfaces.php:1880
+#: usr/local/www/interfaces.php:1943 usr/local/www/interfaces.php:1948
+#: usr/local/www/interfaces.php:1947 usr/local/www/interfaces.php:1952
+#: usr/local/www/interfaces.php:2053 usr/local/www/interfaces.php:2058
+#: usr/local/www/interfaces.php:2121 usr/local/www/interfaces.php:2126
+#: usr/local/www/interfaces.php:1935 usr/local/www/interfaces.php:1940
+#: usr/local/www/interfaces.php:2041 usr/local/www/interfaces.php:2046
+#: usr/local/www/interfaces.php:2109 usr/local/www/interfaces.php:2114
+#: usr/local/www/interfaces.php:1959 usr/local/www/interfaces.php:1964
+#: usr/local/www/interfaces.php:2068 usr/local/www/interfaces.php:2073
+#: usr/local/www/interfaces.php:2139 usr/local/www/interfaces.php:2144
+#: usr/local/www/interfaces.php:2005 usr/local/www/interfaces.php:2010
+#: usr/local/www/interfaces.php:2119 usr/local/www/interfaces.php:2185
+#: usr/local/www/interfaces.php:2190 usr/local/www/interfaces.php:1994
+#: usr/local/www/interfaces.php:1999 usr/local/www/interfaces.php:2103
+#: usr/local/www/interfaces.php:2108 usr/local/www/interfaces.php:2174
+#: usr/local/www/interfaces.php:2179 usr/local/www/interfaces.php:2030
+#: usr/local/www/interfaces.php:2035 usr/local/www/interfaces.php:2210
+#: usr/local/www/interfaces.php:2215
+msgid "Click here"
+msgstr "Clique aqui"
+
+#: usr/local/www/interfaces.php:1770 usr/local/www/interfaces.php:1948
+#: usr/local/www/interfaces.php:1936 usr/local/www/interfaces.php:1960
+#: usr/local/www/interfaces.php:2006 usr/local/www/interfaces.php:1995
+#: usr/local/www/interfaces.php:2031
+msgid "to edit PPP configuration."
+msgstr "para editar configurações PPP."
+
+#: usr/local/www/interfaces.php:1775 usr/local/www/interfaces.php:1953
+#: usr/local/www/interfaces.php:1941 usr/local/www/interfaces.php:1965
+#: usr/local/www/interfaces.php:2011 usr/local/www/interfaces.php:2000
+#: usr/local/www/interfaces.php:2036
+msgid "to create a PPP configuration."
+msgstr "para criar uma configuração PPP."
+
+#: usr/local/www/interfaces.php:1786 usr/local/www/interfaces.php:1964
+#: usr/local/www/interfaces.php:1952 usr/local/www/interfaces.php:1979
+#: usr/local/www/interfaces.php:2025 usr/local/www/interfaces.php:2014
+#: usr/local/www/interfaces.php:2050
+msgid "PPPoE configuration"
+msgstr "Configuração PPPoE"
+
+#: usr/local/www/interfaces.php:1801
+#: usr/local/www/interfaces_ppps_edit.php:589
+#: usr/local/www/interfaces.php:1979
+#: usr/local/www/interfaces_ppps_edit.php:590
+#: usr/local/www/interfaces.php:1967
+#: usr/local/www/interfaces_ppps_edit.php:596
+#: usr/local/www/interfaces.php:1994 usr/local/www/interfaces.php:2040
+#: usr/local/www/interfaces_ppps_edit.php:594
+#: usr/local/www/interfaces.php:2029 usr/local/www/interfaces.php:2065
+msgid "Service name"
+msgstr "Nome do serviço"
+
+#: usr/local/www/interfaces.php:1803 usr/local/www/interfaces.php:1981
+#: usr/local/www/interfaces.php:1969 usr/local/www/interfaces.php:1996
+#: usr/local/www/interfaces.php:2042 usr/local/www/interfaces.php:2031
+#: usr/local/www/interfaces.php:2067
+msgid "Hint: this field can usually be left empty"
+msgstr "Dica: esse campo é normalmente deixado vazio"
+
+#: usr/local/www/interfaces.php:1810 usr/local/www/interfaces.php:1929
+#: usr/local/www/interfaces.php:1988 usr/local/www/interfaces.php:2107
+#: usr/local/www/interfaces.php:1976 usr/local/www/interfaces.php:2095
+#: usr/local/www/interfaces.php:2003 usr/local/www/interfaces.php:2125
+#: usr/local/www/interfaces.php:2049 usr/local/www/interfaces.php:2171
+#: usr/local/www/interfaces.php:2038 usr/local/www/interfaces.php:2160
+#: usr/local/www/interfaces.php:2074 usr/local/www/interfaces.php:2196
+msgid "Enable Dial-On-Demand mode"
+msgstr "Habilitar modo de Discagem Sob Demanda"
+
+#: usr/local/www/interfaces.php:1811 usr/local/www/interfaces.php:1989
+#: usr/local/www/interfaces.php:1977 usr/local/www/interfaces.php:2004
+#: usr/local/www/interfaces.php:2050 usr/local/www/interfaces.php:2039
+#: usr/local/www/interfaces.php:2075
+msgid "This option causes the interface to operate in dial-on-demand mode, allowing you to have a "
+msgstr "Essa opção faz com que a interface opere em modo de Discagem Sob Demanda, permitindo que você tenha uma "
+
+#: usr/local/www/interfaces.php:1811 usr/local/www/interfaces.php:1930
+#: usr/local/www/interfaces.php:1989 usr/local/www/interfaces.php:2108
+#: usr/local/www/interfaces.php:1977 usr/local/www/interfaces.php:2096
+#: usr/local/www/interfaces.php:2004 usr/local/www/interfaces.php:2126
+#: usr/local/www/interfaces.php:2050 usr/local/www/interfaces.php:2172
+#: usr/local/www/interfaces.php:2039 usr/local/www/interfaces.php:2161
+#: usr/local/www/interfaces.php:2075 usr/local/www/interfaces.php:2197
+msgid "virtual full time"
+msgstr "tempo virtual completo"
+
+#: usr/local/www/interfaces.php:1811 usr/local/www/interfaces.php:1930
+#: usr/local/www/interfaces.php:1989 usr/local/www/interfaces.php:2108
+#: usr/local/www/interfaces.php:1977 usr/local/www/interfaces.php:2096
+#: usr/local/www/interfaces.php:2004 usr/local/www/interfaces.php:2126
+#: usr/local/www/interfaces.php:2050 usr/local/www/interfaces.php:2172
+#: usr/local/www/interfaces.php:2039 usr/local/www/interfaces.php:2161
+#: usr/local/www/interfaces.php:2075 usr/local/www/interfaces.php:2197
+msgid "connection. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected."
+msgstr "conexão. A interface é configurada, mas a conexão atual do link é atrasada até que tráfego de saída qualificado seja detectado."
+
+#: usr/local/www/interfaces.php:1815 usr/local/www/interfaces.php:1934
+#: usr/local/www/services_captiveportal.php:465
+#: usr/local/www/services_captiveportal.php:470
+#: usr/local/www/interfaces.php:1993 usr/local/www/interfaces.php:2112
+#: usr/local/www/services_captiveportal.php:468
+#: usr/local/www/interfaces.php:1981 usr/local/www/interfaces.php:2100
+#: usr/local/www/interfaces.php:2008 usr/local/www/interfaces.php:2130
+#: usr/local/www/services_captiveportal.php:486
+#: usr/local/www/interfaces.php:2054 usr/local/www/interfaces.php:2176
+#: usr/local/www/interfaces.php:2043 usr/local/www/interfaces.php:2165
+#: usr/local/www/interfaces.php:2079 usr/local/www/interfaces.php:2201
+msgid "Idle timeout"
+msgstr "Tempo ocioso"
+
+#: usr/local/www/interfaces.php:1817 usr/local/www/interfaces.php:1936
+#: usr/local/www/interfaces.php:1995 usr/local/www/interfaces.php:2114
+#: usr/local/www/interfaces.php:1983 usr/local/www/interfaces.php:2102
+#: usr/local/www/interfaces.php:2010 usr/local/www/interfaces.php:2132
+#: usr/local/www/interfaces.php:2056 usr/local/www/interfaces.php:2178
+#: usr/local/www/interfaces.php:2045 usr/local/www/interfaces.php:2167
+#: usr/local/www/interfaces.php:2081 usr/local/www/interfaces.php:2203
+msgid "If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. An idle timeout of zero disables this feature."
+msgstr "Se nenhum pacote de saída qualificado for transmitido no número de segundos especificado, a conexão é cancelada. Um valor de tempo de ocioso igual a zero desabilita essa funcionalidade."
+
+#: usr/local/www/interfaces.php:1821
+#: usr/local/www/interfaces_ppps_edit.php:596
+#: usr/local/www/interfaces.php:1999
+#: usr/local/www/interfaces_ppps_edit.php:597
+#: usr/local/www/interfaces.php:1987
+#: usr/local/www/interfaces_ppps_edit.php:603
+#: usr/local/www/interfaces.php:2014 usr/local/www/interfaces.php:2060
+#: usr/local/www/interfaces_ppps_edit.php:601
+#: usr/local/www/interfaces.php:2049 usr/local/www/interfaces.php:2085
+msgid "Periodic reset"
+msgstr "Reinicialização periódica"
+
+#: usr/local/www/interfaces.php:1829
+#: usr/local/www/interfaces_ppps_edit.php:604
+#: usr/local/www/status_rrd_graph.php:359
+#: usr/local/www/status_rrd_graph_settings.php:158
+#: usr/local/www/status_rrd_graph_settings.php:159
+#: usr/local/www/status_rrd_graph.php:407 usr/local/www/interfaces.php:2007
+#: usr/local/www/interfaces_ppps_edit.php:605
+#: usr/local/www/interfaces.php:1995
+#: usr/local/www/interfaces_ppps_edit.php:611
+#: usr/local/www/status_rrd_graph.php:432 usr/local/www/interfaces.php:2022
+#: usr/local/www/interfaces.php:2068
+#: usr/local/www/interfaces_ppps_edit.php:609
+#: usr/local/www/interfaces.php:2057 usr/local/www/interfaces.php:2093
+msgid "Custom"
+msgstr "Personalizar"
+
+#: usr/local/www/interfaces.php:1830
+#: usr/local/www/interfaces_ppps_edit.php:605
+#: usr/local/www/interfaces.php:2008
+#: usr/local/www/interfaces_ppps_edit.php:606
+#: usr/local/www/interfaces.php:1996
+#: usr/local/www/interfaces_ppps_edit.php:612
+#: usr/local/www/interfaces.php:2023 usr/local/www/interfaces.php:2069
+#: usr/local/www/interfaces_ppps_edit.php:610
+#: usr/local/www/interfaces.php:2058 usr/local/www/interfaces.php:2094
+msgid "Pre-Set"
+msgstr "Pre-Config"
+
+#: usr/local/www/interfaces.php:1831
+#: usr/local/www/interfaces_ppps_edit.php:606
+#: usr/local/www/interfaces.php:2009
+#: usr/local/www/interfaces_ppps_edit.php:607
+#: usr/local/www/interfaces.php:1997
+#: usr/local/www/interfaces_ppps_edit.php:613
+#: usr/local/www/interfaces.php:2024 usr/local/www/interfaces.php:2070
+#: usr/local/www/interfaces_ppps_edit.php:611
+#: usr/local/www/interfaces.php:2059 usr/local/www/interfaces.php:2095
+msgid "Select a reset timing type"
+msgstr "Selecione o tipo de tempo de reinicialização"
+
+#: usr/local/www/interfaces.php:1839
+#: usr/local/www/interfaces_ppps_edit.php:614
+#: usr/local/www/interfaces.php:2017
+#: usr/local/www/interfaces_ppps_edit.php:615
+#: usr/local/www/interfaces.php:2005
+#: usr/local/www/interfaces_ppps_edit.php:621
+#: usr/local/www/interfaces.php:2032 usr/local/www/interfaces.php:2078
+#: usr/local/www/interfaces_ppps_edit.php:619
+#: usr/local/www/interfaces.php:2067 usr/local/www/interfaces.php:2103
+msgid "hour (0-23)"
+msgstr "hora (0-23)"
+
+#: usr/local/www/interfaces.php:1841
+#: usr/local/www/interfaces_ppps_edit.php:616
+#: usr/local/www/interfaces.php:2019
+#: usr/local/www/interfaces_ppps_edit.php:617
+#: usr/local/www/interfaces.php:2007
+#: usr/local/www/interfaces_ppps_edit.php:623
+#: usr/local/www/interfaces.php:2034 usr/local/www/interfaces.php:2080
+#: usr/local/www/interfaces_ppps_edit.php:621
+#: usr/local/www/interfaces.php:2069 usr/local/www/interfaces.php:2105
+msgid "minute (0-59)"
+msgstr "minutos (0-59)"
+
+#: usr/local/www/interfaces.php:1843
+#: usr/local/www/interfaces_ppps_edit.php:618
+#: usr/local/www/interfaces.php:2021
+#: usr/local/www/interfaces_ppps_edit.php:619
+#: usr/local/www/interfaces.php:2009
+#: usr/local/www/interfaces_ppps_edit.php:625
+#: usr/local/www/interfaces.php:2036 usr/local/www/interfaces.php:2082
+#: usr/local/www/interfaces_ppps_edit.php:623
+#: usr/local/www/interfaces.php:2071 usr/local/www/interfaces.php:2107
+msgid "reset at a specific date (mm/dd/yyyy)"
+msgstr "reinicie em uma data específica (mm/dd/yyyy)"
+
+#: usr/local/www/interfaces.php:1846
+#: usr/local/www/interfaces_ppps_edit.php:621
+#: usr/local/www/interfaces.php:2024
+#: usr/local/www/interfaces_ppps_edit.php:622
+#: usr/local/www/interfaces.php:2012
+#: usr/local/www/interfaces_ppps_edit.php:628
+#: usr/local/www/interfaces.php:2039 usr/local/www/interfaces.php:2085
+#: usr/local/www/interfaces_ppps_edit.php:626
+#: usr/local/www/interfaces.php:2074 usr/local/www/interfaces.php:2110
+msgid "If you leave the date field empty, the reset will be executed each day at the time you did specify using the minutes and hour field."
+msgstr "Se você deixar o campo de data vazio, a reinicialização será executada todos os dias no horário que especificou usando os campos de minutos e hora."
+
+#: usr/local/www/interfaces.php:1854
+#: usr/local/www/interfaces_ppps_edit.php:629
+#: usr/local/www/interfaces.php:2032
+#: usr/local/www/interfaces_ppps_edit.php:630
+#: usr/local/www/interfaces.php:2020
+#: usr/local/www/interfaces_ppps_edit.php:636
+#: usr/local/www/interfaces.php:2047 usr/local/www/interfaces.php:2093
+#: usr/local/www/interfaces_ppps_edit.php:634
+#: usr/local/www/interfaces.php:2082 usr/local/www/interfaces.php:2118
+msgid "reset at each month ('0 0 1 * *')"
+msgstr "reiniciar a cada mês ('0 0 1 * *')"
+
+#: usr/local/www/interfaces.php:1857
+#: usr/local/www/interfaces_ppps_edit.php:632
+#: usr/local/www/interfaces.php:2035
+#: usr/local/www/interfaces_ppps_edit.php:633
+#: usr/local/www/interfaces.php:2023
+#: usr/local/www/interfaces_ppps_edit.php:639
+#: usr/local/www/interfaces.php:2050 usr/local/www/interfaces.php:2096
+#: usr/local/www/interfaces_ppps_edit.php:637
+#: usr/local/www/interfaces.php:2085 usr/local/www/interfaces.php:2121
+msgid "reset at each week ('0 0 * * 0')"
+msgstr "reiniciar a cada semana ('0 0 * * 0')"
+
+#: usr/local/www/interfaces.php:1860
+#: usr/local/www/interfaces_ppps_edit.php:635
+#: usr/local/www/interfaces.php:2038
+#: usr/local/www/interfaces_ppps_edit.php:636
+#: usr/local/www/interfaces.php:2026
+#: usr/local/www/interfaces_ppps_edit.php:642
+#: usr/local/www/interfaces.php:2053 usr/local/www/interfaces.php:2099
+#: usr/local/www/interfaces_ppps_edit.php:640
+#: usr/local/www/interfaces.php:2088 usr/local/www/interfaces.php:2124
+msgid "reset at each day ('0 0 * * *')"
+msgstr "reiniciar a cada dia ('0 0 * * *')"
+
+#: usr/local/www/interfaces.php:1863
+#: usr/local/www/interfaces_ppps_edit.php:638
+#: usr/local/www/interfaces.php:2041
+#: usr/local/www/interfaces_ppps_edit.php:639
+#: usr/local/www/interfaces.php:2029
+#: usr/local/www/interfaces_ppps_edit.php:645
+#: usr/local/www/interfaces.php:2056 usr/local/www/interfaces.php:2102
+#: usr/local/www/interfaces_ppps_edit.php:643
+#: usr/local/www/interfaces.php:2091 usr/local/www/interfaces.php:2127
+msgid "reset at each hour ('0 * * * *')"
+msgstr "reiniciar a cada hora ('0 * * * *')"
+
+#: usr/local/www/interfaces.php:1872 usr/local/www/interfaces.php:2050
+#: usr/local/www/interfaces.php:2038 usr/local/www/interfaces.php:2065
+#: usr/local/www/interfaces.php:2111 usr/local/www/interfaces.php:2100
+#: usr/local/www/interfaces.php:2136
+msgid "Advanced and MLPPP"
+msgstr "Avançado e MLPPP"
+
+#: usr/local/www/interfaces.php:1876 usr/local/www/interfaces.php:2054
+#: usr/local/www/interfaces.php:2042 usr/local/www/interfaces.php:2069
+#: usr/local/www/interfaces.php:2115 usr/local/www/interfaces.php:2104
+#: usr/local/www/interfaces.php:2140
+msgid "for additional PPPoE configuration options. Save first if you made changes."
+msgstr "para opções de configuração PPPoE adicionais. Salve primeiro se você realizou mudanças."
+
+#: usr/local/www/interfaces.php:1881 usr/local/www/interfaces.php:2059
+#: usr/local/www/interfaces.php:2047 usr/local/www/interfaces.php:2074
+#: usr/local/www/interfaces.php:2120 usr/local/www/interfaces.php:2109
+#: usr/local/www/interfaces.php:2145
+msgid "for advanced PPPoE configuration options and MLPPP configuration."
+msgstr "para opções de configuração PPPoE avançadas e configurações MLPPP."
+
+#: usr/local/www/interfaces.php:1892 usr/local/www/interfaces.php:2070
+#: usr/local/www/interfaces.php:2058 usr/local/www/interfaces.php:2088
+#: usr/local/www/interfaces.php:2134 usr/local/www/interfaces.php:2123
+#: usr/local/www/interfaces.php:2159
+msgid "PPTP/L2TP configuration"
+msgstr "Configuração PPTP/L2TP"
+
+#: usr/local/www/interfaces.php:1907
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces.php:2085 usr/local/www/interfaces.php:2073
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces.php:2103 usr/local/www/interfaces.php:2149
+#: usr/local/www/interfaces.php:2138 usr/local/www/interfaces.php:2174
+msgid "Local IP address"
+msgstr "Endereço IP Local"
+
+#: usr/local/www/interfaces.php:1920
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces.php:2098 usr/local/www/interfaces.php:2086
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/interfaces.php:2116 usr/local/www/interfaces.php:2162
+#: usr/local/www/interfaces.php:2151 usr/local/www/interfaces.php:2187
+msgid "Remote IP address"
+msgstr "Endereço IP Remoto"
+
+#: usr/local/www/interfaces.php:1930 usr/local/www/interfaces.php:2108
+#: usr/local/www/interfaces.php:2096 usr/local/www/interfaces.php:2126
+#: usr/local/www/interfaces.php:2172 usr/local/www/interfaces.php:2161
+#: usr/local/www/interfaces.php:2197
+msgid "This option causes the interface to operate in dial-on-demand mode, allowing you to have a"
+msgstr "Essa opção faz com que a interface opere no modo discagem sob demanda, permitindo que você tenha uma"
+
+#: usr/local/www/interfaces.php:1944 usr/local/www/interfaces.php:2122
+#: usr/local/www/interfaces.php:2110 usr/local/www/interfaces.php:2140
+#: usr/local/www/interfaces.php:2186 usr/local/www/interfaces.php:2175
+#: usr/local/www/interfaces.php:2211
+msgid "for additional PPTP and L2TP configuration options. Save first if you made changes."
+msgstr "para opções de configuração de PPTP e L2TP adicionais. Salve primeiro se você fez alterações."
+
+#: usr/local/www/interfaces.php:1949 usr/local/www/interfaces.php:2127
+#: usr/local/www/interfaces.php:2115 usr/local/www/interfaces.php:2145
+#: usr/local/www/interfaces.php:2191 usr/local/www/interfaces.php:2180
+#: usr/local/www/interfaces.php:2216
+msgid "for advanced PPTP and L2TP configuration options"
+msgstr "para opções de configuração de PPTP e L2TP avançadas"
+
+#: usr/local/www/interfaces.php:1964 usr/local/www/interfaces.php:2142
+#: usr/local/www/interfaces.php:2130 usr/local/www/interfaces.php:2160
+#: usr/local/www/interfaces.php:2206 usr/local/www/interfaces.php:2195
+#: usr/local/www/interfaces.php:2231
+msgid "Common wireless configuration - Settings apply to all wireless networks on"
+msgstr "Configurações sem fio comuns - Configurações aplicam-se para todas as redes sem fio em"
+
+#: usr/local/www/interfaces.php:1967 usr/local/www/interfaces.php:2145
+#: usr/local/www/interfaces.php:2133 usr/local/www/interfaces.php:2163
+#: usr/local/www/interfaces.php:2209 usr/local/www/interfaces.php:2198
+#: usr/local/www/interfaces.php:2234
+msgid "Persist common settings"
+msgstr "Persistir configurações comuns"
+
+#: usr/local/www/interfaces.php:1970 usr/local/www/interfaces.php:2148
+#: usr/local/www/interfaces.php:2136 usr/local/www/interfaces.php:2166
+#: usr/local/www/interfaces.php:2212 usr/local/www/interfaces.php:2201
+#: usr/local/www/interfaces.php:2237
+msgid "Enabling this preserves the common wireless configuration through interface deletions and reassignments."
+msgstr "Habilitando isso preserva-se as configurações sem fio comuns durante remoções e atribuições de interface."
+
+#: usr/local/www/interfaces.php:1974 usr/local/www/interfaces.php:2152
+#: usr/local/www/interfaces.php:2140 usr/local/www/interfaces.php:2170
+#: usr/local/www/interfaces.php:2216 usr/local/www/interfaces.php:2205
+#: usr/local/www/interfaces.php:2241
+msgid "Standard"
+msgstr "Padrão"
+
+#: usr/local/www/interfaces.php:1990 usr/local/www/interfaces.php:2168
+#: usr/local/www/interfaces.php:2156 usr/local/www/interfaces.php:2186
+#: usr/local/www/interfaces.php:2232 usr/local/www/interfaces.php:2221
+#: usr/local/www/interfaces.php:2257
+msgid "Protection Mode"
+msgstr "Modo de Proteção"
+
+#: usr/local/www/interfaces.php:1993 usr/local/www/interfaces.php:2171
+#: usr/local/www/interfaces.php:2159 usr/local/www/interfaces.php:2189
+#: usr/local/www/interfaces.php:2235 usr/local/www/interfaces.php:2224
+#: usr/local/www/interfaces.php:2260
+msgid "Protection mode off"
+msgstr "Modo de Proteção desligado"
+
+#: usr/local/www/interfaces.php:1994 usr/local/www/interfaces.php:2172
+#: usr/local/www/interfaces.php:2160 usr/local/www/interfaces.php:2190
+#: usr/local/www/interfaces.php:2236 usr/local/www/interfaces.php:2225
+#: usr/local/www/interfaces.php:2261
+msgid "Protection mode CTS to self"
+msgstr "Modo de Proteção CTS para si mesmo"
+
+#: usr/local/www/interfaces.php:1995 usr/local/www/interfaces.php:2173
+#: usr/local/www/interfaces.php:2161 usr/local/www/interfaces.php:2191
+#: usr/local/www/interfaces.php:2237 usr/local/www/interfaces.php:2226
+#: usr/local/www/interfaces.php:2262
+msgid "Protection mode RTS and CTS"
+msgstr "Modo de Proteção RTS e CTS"
+
+#: usr/local/www/interfaces.php:1998 usr/local/www/interfaces.php:2176
+#: usr/local/www/interfaces.php:2164 usr/local/www/interfaces.php:2194
+#: usr/local/www/interfaces.php:2240 usr/local/www/interfaces.php:2229
+#: usr/local/www/interfaces.php:2265
+msgid "For IEEE 802.11g, use the specified technique for protecting OFDM frames in a mixed 11b/11g network."
+msgstr "Para IEEE 802.11g, use a técnica especificada para proteger frames OFDM em uma rede 11b/11g."
+
+#: usr/local/www/interfaces.php:2006 usr/local/www/interfaces.php:2184
+#: usr/local/www/interfaces.php:2172 usr/local/www/interfaces.php:2202
+#: usr/local/www/interfaces.php:2248 usr/local/www/interfaces.php:2237
+#: usr/local/www/interfaces.php:2273
+msgid "Transmit power"
+msgstr "Transmitir energia"
+
+#: usr/local/www/interfaces.php:2019 usr/local/www/interfaces.php:2197
+#: usr/local/www/interfaces.php:2185 usr/local/www/interfaces.php:2215
+#: usr/local/www/interfaces.php:2261 usr/local/www/interfaces.php:2250
+#: usr/local/www/interfaces.php:2286
+msgid "Note: Typically only a few discreet power settings are available and the driver will use the setting closest to the specified value. Not all adapters support changing the transmit power setting."
+msgstr "Nota: Tipicamente somente poucas configurações discretas de energia estão disponíveis e o driver irá usar as configurações mais próximas ao valor especificado. Nem todos os adaptadores suportam mudanças nas configurações de transmissão de energia."
+
+#: usr/local/www/interfaces.php:2023 usr/local/www/status_interfaces.php:258
+#: usr/local/www/status_interfaces.php:355 usr/local/www/interfaces.php:2201
+#: usr/local/www/status_interfaces.php:358 usr/local/www/interfaces.php:2189
+#: usr/local/www/interfaces.php:2219 usr/local/www/interfaces.php:2265
+#: usr/local/www/interfaces.php:2254 usr/local/www/interfaces.php:2290
+msgid "Channel"
+msgstr "Canal"
+
+#: usr/local/www/interfaces.php:2026 usr/local/www/interfaces.php:2073
+#: usr/local/www/interfaces.php:2085 usr/local/www/interfaces.php:2204
+#: usr/local/www/interfaces.php:2251 usr/local/www/interfaces.php:2263
+#: usr/local/www/interfaces.php:2192 usr/local/www/interfaces.php:2239
+#: usr/local/www/interfaces.php:2222 usr/local/www/interfaces.php:2269
+#: usr/local/www/interfaces.php:2281 usr/local/www/interfaces.php:2268
+#: usr/local/www/interfaces.php:2315 usr/local/www/interfaces.php:2327
+#: usr/local/www/interfaces.php:2257 usr/local/www/interfaces.php:2304
+#: usr/local/www/interfaces.php:2316 usr/local/www/interfaces.php:2293
+#: usr/local/www/interfaces.php:2340 usr/local/www/interfaces.php:2352
+msgid "Auto"
+msgstr "Auto"
+
+#: usr/local/www/interfaces.php:2046 usr/local/www/interfaces.php:2224
+#: usr/local/www/interfaces.php:2212 usr/local/www/interfaces.php:2242
+#: usr/local/www/interfaces.php:2288 usr/local/www/interfaces.php:2277
+#: usr/local/www/interfaces.php:2313
+msgid "Legend: wireless standards - channel # (frequency @ max TX power / TX power allowed in reg. domain)"
+msgstr "Legenda: padrões sem fio - canal # (frequência @ max TX power / TX power permitidos no domínio registrado)"
+
+#: usr/local/www/interfaces.php:2048 usr/local/www/interfaces.php:2226
+#: usr/local/www/interfaces.php:2214 usr/local/www/interfaces.php:2244
+#: usr/local/www/interfaces.php:2290 usr/local/www/interfaces.php:2279
+#: usr/local/www/interfaces.php:2315
+msgid "Note: Not all channels may be supported by your card. Auto may override the wireless standard selected above."
+msgstr "Nota: Nem todos os canais podem ser suportados pelo seu cartão. Auto pode sobrescrever os padrões sem fio selecionados acima."
+
+#: usr/local/www/interfaces.php:2053 usr/local/www/interfaces.php:2231
+#: usr/local/www/interfaces.php:2219 usr/local/www/interfaces.php:2249
+#: usr/local/www/interfaces.php:2295 usr/local/www/interfaces.php:2284
+#: usr/local/www/interfaces.php:2320
+msgid "Antenna settings"
+msgstr "Configurações de Antena"
+
+#: usr/local/www/interfaces.php:2059 usr/local/www/interfaces.php:2237
+#: usr/local/www/interfaces.php:2225 usr/local/www/interfaces.php:2255
+#: usr/local/www/interfaces.php:2301 usr/local/www/interfaces.php:2290
+#: usr/local/www/interfaces.php:2326
+msgid "Diversity"
+msgstr "Diversidade"
+
+#: usr/local/www/interfaces.php:2061 usr/local/www/interfaces.php:2072
+#: usr/local/www/interfaces.php:2084 usr/local/www/interfaces.php:2114
+#: usr/local/www/interfaces.php:2130 usr/local/www/interfaces.php:2146
+#: usr/local/www/interfaces.php:2239 usr/local/www/interfaces.php:2250
+#: usr/local/www/interfaces.php:2262 usr/local/www/interfaces.php:2292
+#: usr/local/www/interfaces.php:2308 usr/local/www/interfaces.php:2324
+#: usr/local/www/interfaces.php:2227 usr/local/www/interfaces.php:2238
+#: usr/local/www/interfaces.php:2280 usr/local/www/interfaces.php:2296
+#: usr/local/www/interfaces.php:2312 usr/local/www/diag_system_pftop.php:135
+#: usr/local/www/interfaces.php:2257 usr/local/www/interfaces.php:2268
+#: usr/local/www/interfaces.php:2310 usr/local/www/interfaces.php:2326
+#: usr/local/www/interfaces.php:2342 usr/local/www/interfaces.php:2303
+#: usr/local/www/interfaces.php:2314 usr/local/www/interfaces.php:2356
+#: usr/local/www/interfaces.php:2372 usr/local/www/interfaces.php:2388
+#: usr/local/www/interfaces.php:2315 usr/local/www/interfaces.php:2345
+#: usr/local/www/interfaces.php:2361 usr/local/www/interfaces.php:2377
+#: usr/local/www/interfaces.php:2328 usr/local/www/interfaces.php:2339
+#: usr/local/www/interfaces.php:2351 usr/local/www/interfaces.php:2381
+#: usr/local/www/interfaces.php:2397 usr/local/www/interfaces.php:2413
+msgid "Default"
+msgstr "Padrão"
+
+#: usr/local/www/interfaces.php:2062 usr/local/www/vpn_pptp.php:314
+#: usr/local/www/vpn_l2tp.php:294 usr/local/www/vpn_pppoe_edit.php:362
+#: usr/local/www/interfaces.php:2240 usr/local/www/vpn_pppoe_edit.php:363
+#: usr/local/www/vpn_pptp.php:316 usr/local/www/interfaces.php:2228
+#: usr/local/www/vpn_l2tp.php:295 usr/local/www/vpn_l2tp.php:298
+#: usr/local/www/vpn_pppoe_edit.php:366 usr/local/www/vpn_pptp.php:319
+#: usr/local/www/interfaces.php:2258 usr/local/www/interfaces.php:2304
+#: usr/local/www/interfaces.php:2293 usr/local/www/interfaces.php:2329
+msgid "Off"
+msgstr "Desligado"
+
+#: usr/local/www/interfaces.php:2063 usr/local/www/interfaces.php:2241
+#: usr/local/www/interfaces.php:2229 usr/local/www/interfaces.php:2259
+#: usr/local/www/interfaces.php:2305 usr/local/www/interfaces.php:2294
+#: usr/local/www/interfaces.php:2330
+msgid "On"
+msgstr "Ligado"
+
+#: usr/local/www/interfaces.php:2070 usr/local/www/interfaces.php:2248
+#: usr/local/www/interfaces.php:2236 usr/local/www/interfaces.php:2266
+#: usr/local/www/interfaces.php:2312 usr/local/www/interfaces.php:2301
+#: usr/local/www/interfaces.php:2337
+msgid "Transmit antenna"
+msgstr "Antena de transmissão"
+
+#: usr/local/www/interfaces.php:2074 usr/local/www/interfaces.php:2086
+#: usr/local/www/interfaces.php:2252 usr/local/www/interfaces.php:2264
+#: usr/local/www/interfaces.php:2240 usr/local/www/interfaces.php:2270
+#: usr/local/www/interfaces.php:2282 usr/local/www/interfaces.php:2316
+#: usr/local/www/interfaces.php:2328 usr/local/www/interfaces.php:2305
+#: usr/local/www/interfaces.php:2317 usr/local/www/interfaces.php:2341
+#: usr/local/www/interfaces.php:2353
+msgid "#1"
+msgstr "#1"
+
+#: usr/local/www/interfaces.php:2075 usr/local/www/interfaces.php:2087
+#: usr/local/www/interfaces.php:2253 usr/local/www/interfaces.php:2265
+#: usr/local/www/interfaces.php:2241 usr/local/www/interfaces.php:2271
+#: usr/local/www/interfaces.php:2283 usr/local/www/interfaces.php:2317
+#: usr/local/www/interfaces.php:2329 usr/local/www/interfaces.php:2306
+#: usr/local/www/interfaces.php:2318 usr/local/www/interfaces.php:2342
+#: usr/local/www/interfaces.php:2354
+msgid "#2"
+msgstr "#2"
+
+#: usr/local/www/interfaces.php:2082 usr/local/www/interfaces.php:2260
+#: usr/local/www/interfaces.php:2248 usr/local/www/interfaces.php:2278
+#: usr/local/www/interfaces.php:2324 usr/local/www/interfaces.php:2313
+#: usr/local/www/interfaces.php:2349
+msgid "Receive antenna"
+msgstr "Antena de recepção"
+
+#: usr/local/www/interfaces.php:2094 usr/local/www/interfaces.php:2272
+#: usr/local/www/interfaces.php:2260 usr/local/www/interfaces.php:2290
+#: usr/local/www/interfaces.php:2336 usr/local/www/interfaces.php:2325
+#: usr/local/www/interfaces.php:2361
+msgid "Note: The antenna numbers do not always match up with the labels on the card."
+msgstr "Nota: O número de antenas nem sempre correspondem com os rótulos no cartão."
+
+#: usr/local/www/interfaces.php:2100 usr/local/www/interfaces.php:2278
+#: usr/local/www/interfaces.php:2266 usr/local/www/interfaces.php:2296
+#: usr/local/www/interfaces.php:2342 usr/local/www/interfaces.php:2331
+#: usr/local/www/interfaces.php:2367
+msgid "Distance setting"
+msgstr "Configuração de distância"
+
+#: usr/local/www/interfaces.php:2104 usr/local/www/interfaces.php:2282
+#: usr/local/www/interfaces.php:2270 usr/local/www/interfaces.php:2300
+#: usr/local/www/interfaces.php:2346 usr/local/www/interfaces.php:2335
+#: usr/local/www/interfaces.php:2371
+msgid "Note: This field can be used to tune ACK/CTS timers to fit the distance between AP and Client"
+msgstr "Nota: Esse campo pode ser usado para afinar os temporizadores ACK/CTS para ajustá-los à distância entre AP e o Cliente"
+
+#: usr/local/www/interfaces.php:2105 usr/local/www/interfaces.php:2283
+#: usr/local/www/interfaces.php:2271 usr/local/www/interfaces.php:2301
+#: usr/local/www/interfaces.php:2347 usr/local/www/interfaces.php:2336
+#: usr/local/www/interfaces.php:2372
+msgid "(measured in meters)"
+msgstr "(medido em Metros e funciona somente com cartões baseados em Atheros!)"
+
+#: usr/local/www/interfaces.php:2110 usr/local/www/interfaces.php:2288
+#: usr/local/www/interfaces.php:2276 usr/local/www/interfaces.php:2306
+#: usr/local/www/interfaces.php:2352 usr/local/www/interfaces.php:2341
+#: usr/local/www/interfaces.php:2377
+msgid "Regulatory settings"
+msgstr "Configurações Regulatórias"
+
+#: usr/local/www/interfaces.php:2112 usr/local/www/interfaces.php:2290
+#: usr/local/www/interfaces.php:2278 usr/local/www/interfaces.php:2308
+#: usr/local/www/interfaces.php:2354 usr/local/www/interfaces.php:2343
+#: usr/local/www/interfaces.php:2379
+msgid "Regulatory domain"
+msgstr "Domínio regulatório"
+
+#: usr/local/www/interfaces.php:2126 usr/local/www/interfaces.php:2304
+#: usr/local/www/interfaces.php:2292 usr/local/www/interfaces.php:2322
+#: usr/local/www/interfaces.php:2368 usr/local/www/interfaces.php:2357
+#: usr/local/www/interfaces.php:2393
+msgid "Note: Some cards have a default that is not recognized and require changing the regulatory domain to one in this list for the changes to other regulatory settings to work."
+msgstr "Nota: Alguns cartões tem um padrão que não é reconhecido e requerem mudanças no domínio regulatório para um dessa lista de modo que funcione."
+
+#: usr/local/www/interfaces.php:2128 usr/local/www/interfaces.php:2306
+#: usr/local/www/interfaces.php:2294 usr/local/www/interfaces.php:2324
+#: usr/local/www/interfaces.php:2370 usr/local/www/interfaces.php:2359
+#: usr/local/www/interfaces.php:2395
+msgid "Country (listed with country code and regulatory domain)"
+msgstr "País (listado com código de país e domínio regulatório)"
+
+#: usr/local/www/interfaces.php:2142 usr/local/www/interfaces.php:2320
+#: usr/local/www/interfaces.php:2308 usr/local/www/interfaces.php:2338
+#: usr/local/www/interfaces.php:2384 usr/local/www/interfaces.php:2373
+#: usr/local/www/interfaces.php:2409
+msgid "Note: Any country setting other than \"Default\" will override the regulatory domain setting"
+msgstr "Nota: Qualquer configuração de país que não seja a \"Padrão\" irá sobrescrever a configuração de domínio regulatório"
+
+#: usr/local/www/interfaces.php:2144 usr/local/www/interfaces.php:2322
+#: usr/local/www/interfaces.php:2310 usr/local/www/interfaces.php:2340
+#: usr/local/www/interfaces.php:2386 usr/local/www/interfaces.php:2375
+#: usr/local/www/interfaces.php:2411
+msgid "Location"
+msgstr "Localização"
+
+#: usr/local/www/interfaces.php:2147 usr/local/www/interfaces.php:2325
+#: usr/local/www/interfaces.php:2313 usr/local/www/interfaces.php:2343
+#: usr/local/www/interfaces.php:2389 usr/local/www/interfaces.php:2378
+#: usr/local/www/interfaces.php:2414
+msgid "Indoor"
+msgstr "Interior"
+
+#: usr/local/www/interfaces.php:2148 usr/local/www/interfaces.php:2326
+#: usr/local/www/interfaces.php:2314 usr/local/www/interfaces.php:2344
+#: usr/local/www/interfaces.php:2390 usr/local/www/interfaces.php:2379
+#: usr/local/www/interfaces.php:2415
+msgid "Outdoor"
+msgstr "Exterior"
+
+#: usr/local/www/interfaces.php:2149 usr/local/www/interfaces.php:2327
+#: usr/local/www/interfaces.php:2315 usr/local/www/interfaces.php:2345
+#: usr/local/www/interfaces.php:2391 usr/local/www/interfaces.php:2380
+#: usr/local/www/interfaces.php:2416
+msgid "Anywhere"
+msgstr "Qualquer lugar"
+
+#: usr/local/www/interfaces.php:2152 usr/local/www/interfaces.php:2330
+#: usr/local/www/interfaces.php:2318 usr/local/www/interfaces.php:2348
+#: usr/local/www/interfaces.php:2394 usr/local/www/interfaces.php:2383
+#: usr/local/www/interfaces.php:2419
+msgid "These settings may affect which channels are available and the maximum transmit power allowed on those channels. Using the correct settings to comply with local regulatory requirements is recommended."
+msgstr "Essas configurações devem afetar os canais que estiverem disponíveis e o máximo de energia de transmissão permitido para tais canais. Usando as configurações corretas para estar de acordo com os requisitos regulatórios locais é recomendado."
+
+#: usr/local/www/interfaces.php:2154 usr/local/www/interfaces.php:2332
+#: usr/local/www/interfaces.php:2320 usr/local/www/interfaces.php:2350
+#: usr/local/www/interfaces.php:2396 usr/local/www/interfaces.php:2385
+#: usr/local/www/interfaces.php:2421
+msgid "Note: All wireless networks on this interface will be temporarily brought down when changing regulatory settings. Some of the regulatory domains or country codes may not be allowed by some cards. These settings may not be able to add additional channels that are not already supported."
+msgstr "Nota: Todas as redes sem fio nessa interface serão temporariamente desligadas quando houver mudanças das configurações regulatórias. Alguns domínios regulatórios ou códigos de países podem não ser permitidos em alguns cartões. Essas configuraçõe podem não ser capazes de adicionar canais adicionais que ainda não são suportados."
+
+#: usr/local/www/interfaces.php:2161 usr/local/www/interfaces.php:2339
+#: usr/local/www/interfaces.php:2327 usr/local/www/interfaces.php:2357
+#: usr/local/www/interfaces.php:2403 usr/local/www/interfaces.php:2392
+#: usr/local/www/interfaces.php:2428
+msgid "Network-specific wireless configuration"
+msgstr "Configuração sem fio de rede específica"
+
+#: usr/local/www/interfaces.php:2167
+#: usr/local/www/interfaces_wireless_edit.php:179
+#: usr/local/www/interfaces.php:2345 usr/local/www/interfaces.php:2333
+#: usr/local/www/interfaces_wireless_edit.php:181
+#: usr/local/www/interfaces.php:2363 usr/local/www/interfaces.php:2409
+#: usr/local/www/interfaces.php:2398 usr/local/www/interfaces.php:2434
+msgid "Infrastructure (BSS)"
+msgstr "Infraestrutura (BSS)"
+
+#: usr/local/www/interfaces.php:2168
+#: usr/local/www/interfaces_wireless_edit.php:180
+#: usr/local/www/interfaces.php:2346 usr/local/www/interfaces.php:2334
+#: usr/local/www/interfaces_wireless_edit.php:182
+#: usr/local/www/interfaces.php:2364 usr/local/www/interfaces.php:2410
+#: usr/local/www/interfaces.php:2399 usr/local/www/interfaces.php:2435
+msgid "Ad-hoc (IBSS)"
+msgstr "Ad-hoc (IBSS)"
+
+#: usr/local/www/interfaces.php:2169
+#: usr/local/www/interfaces_wireless_edit.php:181
+#: usr/local/www/interfaces.php:2347 usr/local/www/interfaces.php:2335
+#: usr/local/www/interfaces_wireless_edit.php:183
+#: usr/local/www/interfaces.php:2365 usr/local/www/interfaces.php:2411
+#: usr/local/www/interfaces.php:2400 usr/local/www/interfaces.php:2436
+msgid "Access Point"
+msgstr "Ponto de Acesso"
+
+#: usr/local/www/interfaces.php:2181 usr/local/www/interfaces.php:2361
+#: usr/local/www/interfaces.php:2349 usr/local/www/interfaces.php:2379
+#: usr/local/www/interfaces.php:2425 usr/local/www/interfaces.php:2414
+#: usr/local/www/interfaces.php:2450
+msgid "Minimum wireless standard"
+msgstr "Padrão mínimo sem fio"
+
+#: usr/local/www/interfaces.php:2184 usr/local/www/interfaces.php:2364
+#: usr/local/www/interfaces.php:2352 usr/local/www/interfaces.php:2382
+#: usr/local/www/interfaces.php:2428 usr/local/www/interfaces.php:2417
+#: usr/local/www/interfaces.php:2453
+msgid "Any"
+msgstr "Qualquer"
+
+#: usr/local/www/interfaces.php:2186 usr/local/www/interfaces.php:2366
+#: usr/local/www/interfaces.php:2354 usr/local/www/interfaces.php:2384
+#: usr/local/www/interfaces.php:2430 usr/local/www/interfaces.php:2419
+#: usr/local/www/interfaces.php:2455
+msgid "802.11g"
+msgstr "802.11g"
+
+#: usr/local/www/interfaces.php:2188 usr/local/www/interfaces.php:2368
+#: usr/local/www/interfaces.php:2356 usr/local/www/interfaces.php:2386
+#: usr/local/www/interfaces.php:2432 usr/local/www/interfaces.php:2421
+#: usr/local/www/interfaces.php:2457
+msgid "802.11n"
+msgstr "802.11n"
+
+#: usr/local/www/interfaces.php:2191 usr/local/www/interfaces.php:2371
+#: usr/local/www/interfaces.php:2359 usr/local/www/interfaces.php:2389
+#: usr/local/www/interfaces.php:2435 usr/local/www/interfaces.php:2424
+#: usr/local/www/interfaces.php:2460
+msgid "When operating as an access point, allow only stations capable of the selected wireless standard to associate (stations not capable are not permitted to associate)."
+msgstr "Quando operando como um ponto de acesso, permitir somente que estações capazes de operar nos padrões sem fio selecionados se associem (estações não capazes não tem permissão de se associarem)."
+
+#: usr/local/www/interfaces.php:2196 usr/local/www/interfaces.php:2376
+#: usr/local/www/interfaces.php:2364 usr/local/www/interfaces.php:2394
+#: usr/local/www/interfaces.php:2440 usr/local/www/interfaces.php:2429
+#: usr/local/www/interfaces.php:2465
+msgid "802.11g only"
+msgstr "802.11g somente"
+
+#: usr/local/www/interfaces.php:2199 usr/local/www/interfaces.php:2379
+#: usr/local/www/interfaces.php:2367 usr/local/www/interfaces.php:2397
+#: usr/local/www/interfaces.php:2443 usr/local/www/interfaces.php:2432
+#: usr/local/www/interfaces.php:2468
+msgid "When operating as an access point in 802.11g mode, allow only 11g-capable stations to associate (11b-only stations are not permitted to associate)."
+msgstr "Quando operando como um ponto de acesso em modo 802.11g, permitir somente que estações que suportam 11g se associem (estações somente 11b não tem permissão de se associarem)."
+
+#: usr/local/www/interfaces.php:2204 usr/local/www/interfaces.php:2384
+#: usr/local/www/interfaces.php:2372 usr/local/www/interfaces.php:2402
+#: usr/local/www/interfaces.php:2448 usr/local/www/interfaces.php:2437
+#: usr/local/www/interfaces.php:2473
+msgid "Allow intra-BSS communication"
+msgstr "Permitir comunicação intra-BSS"
+
+#: usr/local/www/interfaces.php:2208 usr/local/www/interfaces.php:2388
+#: usr/local/www/interfaces.php:2376 usr/local/www/interfaces.php:2406
+#: usr/local/www/interfaces.php:2452 usr/local/www/interfaces.php:2441
+#: usr/local/www/interfaces.php:2477
+msgid "When operating as an access point, enable this if you want to pass packets between wireless clients directly."
+msgstr "Quando operando como um ponto de acesso, habilitar isso se você desejar liberar pacotes entre clientes sem fio diretamente."
+
+#: usr/local/www/interfaces.php:2210 usr/local/www/interfaces.php:2390
+#: usr/local/www/interfaces.php:2378 usr/local/www/interfaces.php:2408
+#: usr/local/www/interfaces.php:2454 usr/local/www/interfaces.php:2443
+#: usr/local/www/interfaces.php:2479
+msgid "Disabling the internal bridging is useful when traffic is to be processed with packet filtering."
+msgstr "Desabilitar a criação de pontes internas é útil quando o tráfego é processado com filtro de pacote."
+
+#: usr/local/www/interfaces.php:2214 usr/local/www/interfaces.php:2394
+#: usr/local/www/interfaces.php:2382 usr/local/www/interfaces.php:2412
+#: usr/local/www/interfaces.php:2458 usr/local/www/interfaces.php:2447
+#: usr/local/www/interfaces.php:2483
+msgid "Enable WME"
+msgstr "Habilitar WME"
+
+#: usr/local/www/interfaces.php:2217 usr/local/www/interfaces.php:2397
+#: usr/local/www/interfaces.php:2385 usr/local/www/interfaces.php:2415
+#: usr/local/www/interfaces.php:2461 usr/local/www/interfaces.php:2450
+#: usr/local/www/interfaces.php:2486
+msgid "Setting this option will force the card to use WME (wireless QoS)."
+msgstr "Configurar essa opção irá forçar o cartão a usar WME (QoS sem fio)."
+
+#: usr/local/www/interfaces.php:2221 usr/local/www/interfaces.php:2401
+#: usr/local/www/interfaces.php:2389 usr/local/www/interfaces.php:2419
+#: usr/local/www/interfaces.php:2465 usr/local/www/interfaces.php:2454
+#: usr/local/www/interfaces.php:2490
+msgid "Enable Hide SSID"
+msgstr "Habilitar Hide SSID"
+
+#: usr/local/www/interfaces.php:2225 usr/local/www/interfaces.php:2405
+#: usr/local/www/interfaces.php:2393 usr/local/www/interfaces.php:2423
+#: usr/local/www/interfaces.php:2469 usr/local/www/interfaces.php:2458
+#: usr/local/www/interfaces.php:2494
+msgid "Setting this option will force the card to NOT broadcast its SSID"
+msgstr "Configurar essa opção irá forçar o cartão a NÃO enviar seu SSID em broadcast"
+
+#: usr/local/www/interfaces.php:2227 usr/local/www/interfaces.php:2407
+#: usr/local/www/interfaces.php:2395 usr/local/www/interfaces.php:2425
+#: usr/local/www/interfaces.php:2471 usr/local/www/interfaces.php:2460
+#: usr/local/www/interfaces.php:2496
+msgid "(this might create problems for some clients)."
+msgstr "(isso deve criar problemas para alguns clientes)."
+
+#: usr/local/www/interfaces.php:2231 usr/local/www/interfaces.php:2411
+#: usr/local/www/interfaces.php:2399 usr/local/www/interfaces.php:2429
+#: usr/local/www/interfaces.php:2475 usr/local/www/interfaces.php:2464
+#: usr/local/www/interfaces.php:2500
+msgid "WEP"
+msgstr "WEP"
+
+#: usr/local/www/interfaces.php:2234 usr/local/www/interfaces.php:2414
+#: usr/local/www/interfaces.php:2402 usr/local/www/interfaces.php:2432
+#: usr/local/www/interfaces.php:2478 usr/local/www/interfaces.php:2467
+#: usr/local/www/interfaces.php:2503
+msgid "Enable WEP"
+msgstr "Habilitar WEP"
+
+#: usr/local/www/interfaces.php:2239 usr/local/www/interfaces.php:2419
+#: usr/local/www/interfaces.php:2407 usr/local/www/interfaces.php:2437
+#: usr/local/www/interfaces.php:2483 usr/local/www/interfaces.php:2472
+#: usr/local/www/interfaces.php:2508
+msgid "TX key"
+msgstr "Chave TX"
+
+#: usr/local/www/interfaces.php:2242 usr/local/www/interfaces.php:2422
+#: usr/local/www/interfaces.php:2410 usr/local/www/interfaces.php:2440
+#: usr/local/www/interfaces.php:2486 usr/local/www/interfaces.php:2475
+#: usr/local/www/interfaces.php:2511
+msgid "Key 1:"
+msgstr "Chave 1:"
+
+#: usr/local/www/interfaces.php:2251 usr/local/www/interfaces.php:2431
+#: usr/local/www/interfaces.php:2419 usr/local/www/interfaces.php:2449
+#: usr/local/www/interfaces.php:2495 usr/local/www/interfaces.php:2484
+#: usr/local/www/interfaces.php:2520
+msgid "Key 2:"
+msgstr "Chave 2:"
+
+#: usr/local/www/interfaces.php:2260 usr/local/www/interfaces.php:2440
+#: usr/local/www/interfaces.php:2428 usr/local/www/interfaces.php:2458
+#: usr/local/www/interfaces.php:2504 usr/local/www/interfaces.php:2493
+#: usr/local/www/interfaces.php:2529
+msgid "Key 3:"
+msgstr "Chave 3:"
+
+#: usr/local/www/interfaces.php:2269 usr/local/www/interfaces.php:2449
+#: usr/local/www/interfaces.php:2437 usr/local/www/interfaces.php:2467
+#: usr/local/www/interfaces.php:2513 usr/local/www/interfaces.php:2502
+#: usr/local/www/interfaces.php:2538
+msgid "Key 4:"
+msgstr "Chave 4:"
+
+#: usr/local/www/interfaces.php:2279 usr/local/www/interfaces.php:2459
+#: usr/local/www/interfaces.php:2447 usr/local/www/interfaces.php:2477
+#: usr/local/www/interfaces.php:2523 usr/local/www/interfaces.php:2512
+#: usr/local/www/interfaces.php:2548
+msgid "40 (64) bit keys may be entered as 5 ASCII characters or 10 hex digits preceded by '0x'."
+msgstr "Chaves de 40 (64) bits devem ser informadas como 5 caracteres ASCII ou 10 dígitos hex precedidos por '0x'."
+
+#: usr/local/www/interfaces.php:2280 usr/local/www/interfaces.php:2460
+#: usr/local/www/interfaces.php:2448 usr/local/www/interfaces.php:2478
+#: usr/local/www/interfaces.php:2524 usr/local/www/interfaces.php:2513
+#: usr/local/www/interfaces.php:2549
+msgid "104 (128) bit keys may be entered as 13 ASCII characters or 26 hex digits preceded by '0x'."
+msgstr "Chaves de 104 (128) bits devem ser informadas como 13 caracteres ASCII ou 26 dígitos hex precedidos por '0x'."
+
+#: usr/local/www/interfaces.php:2284 usr/local/www/interfaces.php:2308
+#: usr/local/www/interfaces.php:2464 usr/local/www/interfaces.php:2488
+#: usr/local/www/interfaces.php:2452 usr/local/www/interfaces.php:2476
+#: usr/local/www/interfaces.php:2482 usr/local/www/interfaces.php:2506
+#: usr/local/www/interfaces.php:2528 usr/local/www/interfaces.php:2552
+#: usr/local/www/interfaces.php:2517 usr/local/www/interfaces.php:2541
+#: usr/local/www/interfaces.php:2553 usr/local/www/interfaces.php:2577
+msgid "WPA"
+msgstr "WPA"
+
+#: usr/local/www/interfaces.php:2287 usr/local/www/interfaces.php:2467
+#: usr/local/www/interfaces.php:2455 usr/local/www/interfaces.php:2485
+#: usr/local/www/interfaces.php:2531 usr/local/www/interfaces.php:2520
+#: usr/local/www/interfaces.php:2556
+msgid "Enable WPA"
+msgstr "Habilitar WPA"
+
+#: usr/local/www/interfaces.php:2292 usr/local/www/interfaces.php:2472
+msgid "WPA Pre Shared Key"
+msgstr "Chave Pre-Compartilhada WPA"
+
+#: usr/local/www/interfaces.php:2295 usr/local/www/interfaces.php:2475
+#: usr/local/www/interfaces.php:2463 usr/local/www/interfaces.php:2493
+#: usr/local/www/interfaces.php:2539 usr/local/www/interfaces.php:2528
+#: usr/local/www/interfaces.php:2564
+msgid "PSK:"
+msgstr "PSK:"
+
+#: usr/local/www/interfaces.php:2301 usr/local/www/interfaces.php:2481
+#: usr/local/www/interfaces.php:2469 usr/local/www/interfaces.php:2499
+#: usr/local/www/interfaces.php:2545 usr/local/www/interfaces.php:2534
+#: usr/local/www/interfaces.php:2570
+msgid "WPA Passphrase must be between 8 and 63 characters long."
+msgstr "Frase secreta deve ter de 8 a 63 caracteres."
+
+#: usr/local/www/interfaces.php:2305 usr/local/www/interfaces.php:2485
+#: usr/local/www/interfaces.php:2473 usr/local/www/interfaces.php:2503
+#: usr/local/www/interfaces.php:2549 usr/local/www/interfaces.php:2538
+#: usr/local/www/interfaces.php:2574
+msgid "WPA Mode"
+msgstr "Modo WPA"
+
+#: usr/local/www/interfaces.php:2309 usr/local/www/interfaces.php:2489
+#: usr/local/www/interfaces.php:2477 usr/local/www/interfaces.php:2507
+#: usr/local/www/interfaces.php:2553 usr/local/www/interfaces.php:2542
+#: usr/local/www/interfaces.php:2578
+msgid "WPA2"
+msgstr "WPA2"
+
+#: usr/local/www/interfaces.php:2310 usr/local/www/interfaces.php:2320
+#: usr/local/www/interfaces.php:2330 usr/local/www/interfaces.php:2339
+#: usr/local/www/services_captiveportal_ip_edit.php:182
+#: usr/local/www/services_captiveportal_hostname_edit.php:164
+#: usr/local/www/interfaces.php:2490 usr/local/www/interfaces.php:2500
+#: usr/local/www/interfaces.php:2510 usr/local/www/interfaces.php:2519
+#: usr/local/www/services_captiveportal_hostname_edit.php:162
+#: usr/local/www/services_captiveportal_ip_edit.php:180
+#: usr/local/www/interfaces.php:2478 usr/local/www/interfaces.php:2488
+#: usr/local/www/interfaces.php:2498 usr/local/www/interfaces.php:2507
+#: usr/local/www/interfaces.php:2508 usr/local/www/interfaces.php:2518
+#: usr/local/www/interfaces.php:2528 usr/local/www/interfaces.php:2537
+#: usr/local/www/interfaces.php:2554 usr/local/www/interfaces.php:2564
+#: usr/local/www/interfaces.php:2574 usr/local/www/interfaces.php:2583
+#: usr/local/www/interfaces.php:2543 usr/local/www/interfaces.php:2553
+#: usr/local/www/interfaces.php:2563 usr/local/www/interfaces.php:2572
+#: usr/local/www/interfaces.php:2579 usr/local/www/interfaces.php:2589
+#: usr/local/www/interfaces.php:2599 usr/local/www/interfaces.php:2608
+msgid "Both"
+msgstr "Ambos"
+
+#: usr/local/www/interfaces.php:2315 usr/local/www/interfaces.php:2495
+#: usr/local/www/interfaces.php:2483 usr/local/www/interfaces.php:2513
+#: usr/local/www/interfaces.php:2559 usr/local/www/interfaces.php:2548
+#: usr/local/www/interfaces.php:2584
+msgid "WPA Key Management Mode"
+msgstr "Modo de Gerenciamento de Chave WPA"
+
+#: usr/local/www/interfaces.php:2318 usr/local/www/interfaces.php:2498
+msgid "Pre Shared Key"
+msgstr "Chave Pre-compartilhada"
+
+#: usr/local/www/interfaces.php:2319 usr/local/www/interfaces.php:2499
+#: usr/local/www/interfaces.php:2487 usr/local/www/interfaces.php:2517
+#: usr/local/www/interfaces.php:2563 usr/local/www/interfaces.php:2552
+#: usr/local/www/interfaces.php:2588
+msgid "Extensible Authentication Protocol"
+msgstr "Protocolo de Autenticação Extensível"
+
+#: usr/local/www/interfaces.php:2328 usr/local/www/interfaces.php:2508
+#: usr/local/www/interfaces.php:2496 usr/local/www/interfaces.php:2526
+#: usr/local/www/interfaces.php:2572 usr/local/www/interfaces.php:2561
+#: usr/local/www/interfaces.php:2597
+msgid "Open System Authentication"
+msgstr "Autenticação de Sistema Aberto"
+
+#: usr/local/www/interfaces.php:2329 usr/local/www/interfaces.php:2509
+#: usr/local/www/interfaces.php:2497 usr/local/www/interfaces.php:2527
+#: usr/local/www/interfaces.php:2573 usr/local/www/interfaces.php:2562
+#: usr/local/www/interfaces.php:2598
+msgid "Shared Key Authentication"
+msgstr "Autenticação de Chave Compartilhada"
+
+#: usr/local/www/interfaces.php:2332 usr/local/www/interfaces.php:2512
+#: usr/local/www/interfaces.php:2500 usr/local/www/interfaces.php:2530
+#: usr/local/www/interfaces.php:2576 usr/local/www/interfaces.php:2565
+#: usr/local/www/interfaces.php:2601
+msgid "Note: Shared Key Authentication requires WEP."
+msgstr "Nota: Autenticação de Chave Compartilhada requere WEP."
+
+#: usr/local/www/interfaces.php:2336 usr/local/www/interfaces.php:2516
+#: usr/local/www/interfaces.php:2504 usr/local/www/interfaces.php:2534
+#: usr/local/www/interfaces.php:2580 usr/local/www/interfaces.php:2569
+#: usr/local/www/interfaces.php:2605
+msgid "WPA Pairwise"
+msgstr "WPA Pairwise"
+
+#: usr/local/www/interfaces.php:2340 usr/local/www/interfaces.php:2520
+#: usr/local/www/interfaces.php:2508 usr/local/www/interfaces.php:2538
+#: usr/local/www/interfaces.php:2584 usr/local/www/interfaces.php:2573
+#: usr/local/www/interfaces.php:2609
+msgid "AES (recommended)"
+msgstr "AES (recomendado)"
+
+#: usr/local/www/interfaces.php:2341 usr/local/www/interfaces.php:2521
+#: usr/local/www/interfaces.php:2509 usr/local/www/interfaces.php:2539
+#: usr/local/www/interfaces.php:2585 usr/local/www/interfaces.php:2574
+#: usr/local/www/interfaces.php:2610
+msgid "TKIP"
+msgstr "TKIP"
+
+#: usr/local/www/interfaces.php:2346 usr/local/www/interfaces.php:2526
+#: usr/local/www/interfaces.php:2514 usr/local/www/interfaces.php:2544
+#: usr/local/www/interfaces.php:2590 usr/local/www/interfaces.php:2579
+#: usr/local/www/interfaces.php:2615
+msgid "Key Rotation"
+msgstr "Rotação de Chave"
+
+#: usr/local/www/interfaces.php:2349 usr/local/www/interfaces.php:2529
+#: usr/local/www/interfaces.php:2517 usr/local/www/interfaces.php:2547
+#: usr/local/www/interfaces.php:2593 usr/local/www/interfaces.php:2582
+#: usr/local/www/interfaces.php:2618
+msgid "Allowed values are 1-9999. Must be longer than Master Key Regeneration time."
+msgstr "Os valores permitidos são 1-9999 mas não devem ser mais longos que o tempo de Regeneração da Chave Master."
+
+#: usr/local/www/interfaces.php:2353 usr/local/www/interfaces.php:2533
+#: usr/local/www/interfaces.php:2521 usr/local/www/interfaces.php:2551
+#: usr/local/www/interfaces.php:2597 usr/local/www/interfaces.php:2586
+#: usr/local/www/interfaces.php:2622
+msgid "Master Key Regeneration"
+msgstr "Regeneração da Chave Master"
+
+#: usr/local/www/interfaces.php:2356 usr/local/www/interfaces.php:2536
+#: usr/local/www/interfaces.php:2524 usr/local/www/interfaces.php:2554
+#: usr/local/www/interfaces.php:2600 usr/local/www/interfaces.php:2589
+#: usr/local/www/interfaces.php:2625
+msgid "Allowed values are 1-9999. Must be shorter than Key Rotation time."
+msgstr "Os valores permitidos são 1-9999 mas devem ser menores que o tempo de Rotação da Chave."
+
+#: usr/local/www/interfaces.php:2360 usr/local/www/interfaces.php:2540
+#: usr/local/www/interfaces.php:2528 usr/local/www/interfaces.php:2558
+#: usr/local/www/interfaces.php:2604 usr/local/www/interfaces.php:2593
+#: usr/local/www/interfaces.php:2629
+msgid "Strict Key Regeneration"
+msgstr "Regeneração de Chave Estrita"
+
+#: usr/local/www/interfaces.php:2363 usr/local/www/interfaces.php:2543
+#: usr/local/www/interfaces.php:2531 usr/local/www/interfaces.php:2561
+#: usr/local/www/interfaces.php:2607 usr/local/www/interfaces.php:2596
+#: usr/local/www/interfaces.php:2632
+msgid "Setting this option will force the AP to rekey whenever a client disassociates."
+msgstr "Configurando essa opção forçará o AP a rechavear sempre que um cliente desassociar-se."
+
+#: usr/local/www/interfaces.php:2367 usr/local/www/interfaces.php:2547
+#: usr/local/www/interfaces.php:2535 usr/local/www/interfaces.php:2565
+#: usr/local/www/interfaces.php:2611 usr/local/www/interfaces.php:2600
+#: usr/local/www/interfaces.php:2636
+msgid "Enable IEEE802.1X Authentication"
+msgstr "Habilita Autenticação IEEE802.1X"
+
+#: usr/local/www/interfaces.php:2370 usr/local/www/interfaces.php:2550
+#: usr/local/www/interfaces.php:2538 usr/local/www/interfaces.php:2568
+#: usr/local/www/interfaces.php:2614 usr/local/www/interfaces.php:2603
+#: usr/local/www/interfaces.php:2639
+msgid "Setting this option will enable 802.1X authentication."
+msgstr "Configurando essa opção habilitará a autenticação 802.1x."
+
+#: usr/local/www/interfaces.php:2371
+#: usr/local/www/load_balancer_pool_edit.php:238
+#: usr/local/www/status_openvpn.php:304 usr/local/www/interfaces.php:2551
+#: usr/local/www/load_balancer_pool_edit.php:255
+#: usr/local/www/status_openvpn.php:307 usr/local/www/interfaces.php:2539
+#: usr/local/www/load_balancer_pool_edit.php:253
+#: usr/local/www/status_openvpn.php:355 usr/local/www/interfaces.php:2569
+#: usr/local/www/status_openvpn.php:385 usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces.php:2604 usr/local/www/interfaces.php:2640
+msgid "NOTE"
+msgstr "NOTA"
+
+#: usr/local/www/interfaces.php:2371 usr/local/www/interfaces.php:2551
+#: usr/local/www/interfaces.php:2539 usr/local/www/interfaces.php:2569
+#: usr/local/www/interfaces.php:2615 usr/local/www/interfaces.php:2604
+#: usr/local/www/interfaces.php:2640
+msgid "this option requires checking the \"Enable WPA box\"."
+msgstr "essa opção requer verificação da \"Caixa de Habilitar WPA\"."
+
+#: usr/local/www/interfaces.php:2375 usr/local/www/interfaces.php:2555
+#: usr/local/www/interfaces.php:2543 usr/local/www/interfaces.php:2573
+#: usr/local/www/interfaces.php:2619 usr/local/www/interfaces.php:2608
+#: usr/local/www/interfaces.php:2644
+msgid "802.1X Authentication Server IP Address"
+msgstr "Endereço IP de Servidor de Autenticação 802.1X"
+
+#: usr/local/www/interfaces.php:2378 usr/local/www/interfaces.php:2558
+#: usr/local/www/interfaces.php:2579 usr/local/www/interfaces.php:2546
+#: usr/local/www/interfaces.php:2567 usr/local/www/interfaces.php:2576
+#: usr/local/www/interfaces.php:2597 usr/local/www/interfaces.php:2622
+#: usr/local/www/interfaces.php:2643 usr/local/www/interfaces.php:2611
+#: usr/local/www/interfaces.php:2632 usr/local/www/interfaces.php:2647
+#: usr/local/www/interfaces.php:2668
+msgid "Enter the IP address of the 802.1X Authentication Server. This is commonly a Radius server (FreeRadius, Internet Authentication Services, etc.)"
+msgstr "Informe o endereço IP do Servidor de Autenticação 802.1X. Esse é, comumente, um servidor Radius (FreeRadius, Serviços de Autenticação de Internet, etc.)"
+
+#: usr/local/www/interfaces.php:2382 usr/local/www/interfaces.php:2562
+#: usr/local/www/interfaces.php:2550 usr/local/www/interfaces.php:2580
+#: usr/local/www/interfaces.php:2626 usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces.php:2651
+msgid "802.1X Authentication Server Port"
+msgstr "Porta do Servidor de Autenticação 802.1X"
+
+#: usr/local/www/interfaces.php:2385 usr/local/www/interfaces.php:2565
+#: usr/local/www/interfaces.php:2586 usr/local/www/interfaces.php:2553
+#: usr/local/www/interfaces.php:2574 usr/local/www/interfaces.php:2583
+#: usr/local/www/interfaces.php:2604 usr/local/www/interfaces.php:2629
+#: usr/local/www/interfaces.php:2650 usr/local/www/interfaces.php:2618
+#: usr/local/www/interfaces.php:2639 usr/local/www/interfaces.php:2654
+#: usr/local/www/interfaces.php:2675
+msgid "Leave blank for the default port 1812."
+msgstr "Deixe em branco para usar a porta padrão 1812."
+
+#: usr/local/www/interfaces.php:2389 usr/local/www/interfaces.php:2569
+#: usr/local/www/interfaces.php:2557 usr/local/www/interfaces.php:2587
+#: usr/local/www/interfaces.php:2633 usr/local/www/interfaces.php:2622
+#: usr/local/www/interfaces.php:2658
+msgid "802.1X Authentication Server Shared Secret"
+msgstr "Segredo Compartilhado do Servidor de Autenticação 802.1X"
+
+#: usr/local/www/interfaces.php:2396 usr/local/www/interfaces.php:2597
+#: usr/local/www/interfaces.php:2585 usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces.php:2661 usr/local/www/interfaces.php:2650
+#: usr/local/www/interfaces.php:2686
+msgid "Authentication Roaming Preauth"
+msgstr "Pre-Autenticação de Roaming de Autenticação"
+
+#: usr/local/www/interfaces.php:2407 usr/local/www/interfaces.php:2608
+#: usr/local/www/interfaces.php:2596 usr/local/www/interfaces.php:2626
+#: usr/local/www/interfaces.php:2672 usr/local/www/interfaces.php:2661
+#: usr/local/www/interfaces.php:2697
+msgid "Private networks"
+msgstr "Redes privadas"
+
+#: usr/local/www/interfaces.php:2415 usr/local/www/interfaces.php:2616
+#: usr/local/www/interfaces.php:2604 usr/local/www/interfaces.php:2634
+#: usr/local/www/interfaces.php:2680 usr/local/www/interfaces.php:2669
+#: usr/local/www/interfaces.php:2705
+msgid "When set, this option blocks traffic from IP addresses that are reserved for private networks as per RFC 1918 (10/8, 172.16/12, 192.168/16) as"
+msgstr "Quando configurada, essa opção bloqueia o tráfego dos endereços IP que estão reservados para redes privadas como peer RFC 1918 (10/8, 172.16/12, 192.168/16) como"
+
+#: usr/local/www/interfaces.php:2417 usr/local/www/interfaces.php:2618
+#: usr/local/www/interfaces.php:2606 usr/local/www/interfaces.php:2636
+#: usr/local/www/interfaces.php:2682 usr/local/www/interfaces.php:2671
+#: usr/local/www/interfaces.php:2707
+msgid "well as loopback addresses (127/8)."
+msgstr "endereços de retorno (127/8)."
+
+#: usr/local/www/interfaces.php:2417 usr/local/www/interfaces.php:2618
+#: usr/local/www/interfaces.php:2606 usr/local/www/interfaces.php:2636
+#: usr/local/www/interfaces.php:2682 usr/local/www/interfaces.php:2671
+#: usr/local/www/interfaces.php:2707
+msgid "You should generally leave this option turned on, unless your WAN network lies in such a private address space, too."
+msgstr "Você deve deixar essa opção normalmente ligada, a menos que sua rede WAN também estiver no mesmo espaço do endereço privado."
+
+#: usr/local/www/interfaces.php:2427 usr/local/www/interfaces.php:2628
+#: usr/local/www/interfaces.php:2616 usr/local/www/interfaces.php:2646
+#: usr/local/www/interfaces.php:2692 usr/local/www/interfaces.php:2681
+#: usr/local/www/interfaces.php:2717
+msgid "When set, this option blocks traffic from IP addresses that are reserved (but not RFC 1918) or not yet assigned by IANA."
+msgstr "Quando configurada, essa opção bloqueia o tráfego dos endereços IP que está reservados (mas não na RFC1918) ou ainda não foram atribuídas por IANA."
+
+#: usr/local/www/interfaces.php:2429 usr/local/www/interfaces.php:2630
+#: usr/local/www/interfaces.php:2618 usr/local/www/interfaces.php:2648
+#: usr/local/www/interfaces.php:2694 usr/local/www/interfaces.php:2683
+#: usr/local/www/interfaces.php:2719
+msgid "Bogons are prefixes that should never appear in the Internet routing table, and obviously should not appear as the source address in any packets you receive."
+msgstr "Bogons são prefixos que nunca devem aparecer na tabela de roteamento da Internet, e obviamente não devem aparecer como os endereços fonte de nenhum pacote que receber."
+
+#: usr/local/www/interfaces.php:2550 usr/local/www/interfaces.php:2559
+#: usr/local/www/interfaces.php:2752 usr/local/www/interfaces.php:2761
+#: usr/local/www/interfaces.php:2740 usr/local/www/interfaces.php:2749
+#: usr/local/www/interfaces.php:2774 usr/local/www/interfaces.php:2783
+#: usr/local/www/interfaces.php:2820 usr/local/www/interfaces.php:2829
+#: usr/local/www/interfaces.php:2806 usr/local/www/interfaces.php:2815
+#: usr/local/www/interfaces.php:2842 usr/local/www/interfaces.php:2851
+msgid "You can manage Gateways"
+msgstr "Você pode gerenciar Gateways"
+
+#: usr/local/www/interfaces_assign.php:43
+msgid "Assign network ports"
+msgstr "Atribuir portas de rede"
+
+#: usr/local/www/interfaces_assign.php:194
+#, php-format
+msgid "Port %1$s was assigned to %2$s interfaces:"
+msgstr "Porta %1$s foi atribuída para as interfaces %2$s:"
+
+#: usr/local/www/interfaces_assign.php:262
+#: usr/local/www/interfaces_assign.php:274
+msgid "The interface is part of a group. Please remove it from the group to continue"
+msgstr "A interface é parte de um grupo. Por favor, remova-a do grupo para continuar"
+
+#: usr/local/www/interfaces_assign.php:264
+#: usr/local/www/interfaces_assign.php:276
+msgid "The interface is part of a bridge. Please remove it from the bridge to continue"
+msgstr "A interface é parte de uma ponte. Por favor, remova-a da ponte para continuar"
+
+#: usr/local/www/interfaces_assign.php:266
+#: usr/local/www/interfaces_assign.php:278
+msgid "The interface is part of a gre tunnel. Please delete the tunnel to continue"
+msgstr "A interface é parte de um túnel gre. Por favor, remova o túnel para continuar"
+
+#: usr/local/www/interfaces_assign.php:268
+#: usr/local/www/interfaces_assign.php:280
+msgid "The interface is part of a gif tunnel. Please delete the tunnel to continue"
+msgstr "A interface é parte de um túnel gif. Por favor, remova o túnel para continuar"
+
+#: usr/local/www/interfaces_assign.php:318
+#: usr/local/www/interfaces_assign.php:312
+msgid "Interface has been deleted."
+msgstr "A Interface foi apagada."
+
+#: usr/local/www/interfaces_assign.php:325
+#: usr/local/www/interfaces_assign.php:319
+msgid "lan"
+msgstr "lan"
+
+#: usr/local/www/interfaces_assign.php:326
+#: usr/local/www/interfaces_assign.php:320
+msgid "LAN"
+msgstr "LAN"
+
+#: usr/local/www/interfaces_assign.php:366
+#: usr/local/www/interfaces_assign.php:360
+msgid "Interface has been added."
+msgstr "Uma Interface foi adicionada."
+
+#: usr/local/www/interfaces_assign.php:376
+#: usr/local/www/interfaces_assign.php:370
+msgid "The system is now rebooting. Please wait."
+msgstr "O sistema está reiniciando agora. Por favor, aguarde."
+
+#: usr/local/www/interfaces_assign.php:378
+#: usr/local/www/interfaces_assign.php:372
+msgid "Reboot is needed. Please apply the settings in order to reboot."
+msgstr "É necessário reiniciar. Por favor, aplique as configurações para reiniciar."
+
+#: usr/local/www/interfaces_assign.php:380
+#: usr/local/www/interfaces_assign.php:374
+msgid "Interface mismatch detected. Please resolve the mismatch and click Save. The firewall will reboot afterwards."
+msgstr "Detectado não correspondência de Interface. Por favor, resolva o problema e clique em Salvar. O firewall irá reiniciar em seguida."
+
+#: usr/local/www/interfaces_assign.php:390
+#: usr/local/www/interfaces_assign.php:384
+msgid "The interface configuration has been changed.<br>You must apply the changes in order for them to take effect."
+msgstr "A configuração da interface foi modificada.<br>Você deve aplicar as alterações para que elas tenham efeito."
+
+#: usr/local/www/interfaces_assign.php:421
+#: usr/local/www/interfaces_assign.php:415
+msgid "Network port"
+msgstr "Porta de rede"
+
+#: usr/local/www/interfaces_assign.php:437
+#: usr/local/www/interfaces_assign.php:431
+#, php-format
+msgid "VLAN %1$s on %2$s"
+msgstr "VLAN %1$s em %2$s"
+
+#: usr/local/www/interfaces_assign.php:480
+#: usr/local/www/interfaces_assign.php:474
+msgid "Do you really want to delete this interface?"
+msgstr "Você realmente deseja remover essa interface PPP?"
+
+#: usr/local/www/interfaces_assign.php:480
+#: usr/local/www/interfaces_assign.php:474
+msgid "delete interface"
+msgstr "remover interface"
+
+#: usr/local/www/interfaces_assign.php:489
+#: usr/local/www/interfaces_assign.php:483
+msgid "add interface"
+msgstr "adicionar interface"
+
+#: usr/local/www/interfaces_assign.php:506
+#: usr/local/www/interfaces_assign.php:500
+#: usr/local/www/interfaces_assign.php:504
+msgid "Interfaces that are configured as members of a lagg(4) interface will not be shown."
+msgstr "Interfaces que são configuradas como membros de uma interface lagg(4) não serão exibidos."
+
+#: usr/local/www/diag_pf_info.php:46
+msgid "Diagnostics: pfInfo"
+msgstr "Diagnósticos: pfInfo"
+
+#: usr/local/www/diag_pf_info.php:106 usr/local/www/diag_pf_info.php:103
+msgid "Gathering PF information, please wait..."
+msgstr "Coletando informações do PF, por favor aguarde..."
+
+#: usr/local/www/diag_smart.php:14
+msgid "S.M.A.R.T. Monitor Tools"
+msgstr "S.M.A.R.T. Ferramentas do monitor"
+
+#: usr/local/www/diag_smart.php:68 usr/local/www/diag_smart.php:73
+msgid "PASSED"
+msgstr "PERMITIDO"
+
+#: usr/local/www/diag_smart.php:69 usr/local/www/diag_smart.php:74
+msgid "FAILED"
+msgstr "FALHA"
+
+#: usr/local/www/diag_smart.php:70 usr/local/www/diag_smart.php:75
+msgid "Warning"
+msgstr "Atenção"
+
+#: usr/local/www/diag_smart.php:113 usr/local/www/diag_smart.php:413
+#: usr/local/www/diag_smart.php:126 usr/local/www/diag_smart.php:434
+msgid "Abort"
+msgstr "Abortar"
+
+#: usr/local/www/diag_smart.php:154 usr/local/www/diag_smart.php:175
+#, php-format
+msgid "Email sent to %s"
+msgstr "Email enviado para %s"
+
+#: usr/local/www/diag_smart.php:194 usr/local/www/diag_smart.php:266
+#: usr/local/www/diag_smart.php:215 usr/local/www/diag_smart.php:287
+msgid "Information/Tests"
+msgstr "Informação/Teste"
+
+#: usr/local/www/diag_smart.php:195 usr/local/www/diag_smart.php:206
+#: usr/local/www/diag_smart.php:216 usr/local/www/diag_smart.php:227
+msgid "Config"
+msgstr "Config"
+
+#: usr/local/www/diag_smart.php:209 usr/local/www/system_camanager.php:524
+#: usr/local/www/system_certmanager.php:617
+#: usr/local/www/system_certmanager.php:720
+#: usr/local/www/system_certmanager.php:733
+#: usr/local/www/system_certmanager.php:886
+#: usr/local/www/system_camanager.php:525
+#: usr/local/www/system_camanager.php:549 usr/local/www/diag_smart.php:230
+#: usr/local/www/system_certmanager.php:758
+#: usr/local/www/system_certmanager.php:928
+#: usr/local/www/system_certmanager.php:759
+#: usr/local/www/system_certmanager.php:932
+msgid "Email Address"
+msgstr "Endereço de email"
+
+#: usr/local/www/diag_smart.php:231 usr/local/www/diag_smart.php:252
+msgid "Test email"
+msgstr "Email teste"
+
+#: usr/local/www/diag_smart.php:236 usr/local/www/diag_smart.php:257
+#, php-format
+msgid "Send test email to %s"
+msgstr "Enviar email teste para %s"
+
+#: usr/local/www/diag_smart.php:278 usr/local/www/diag_smart.php:283
+#: usr/local/www/diag_smart.php:299 usr/local/www/diag_smart.php:304
+msgid "Info"
+msgstr "Informação"
+
+#: usr/local/www/diag_smart.php:281 usr/local/www/diag_smart.php:302
+msgid "Info type"
+msgstr "Tipo informação"
+
+#: usr/local/www/diag_smart.php:284 usr/local/www/diag_smart.php:305
+msgid "Health"
+msgstr "Saúde"
+
+#: usr/local/www/diag_smart.php:285 usr/local/www/diag_smart.php:306
+msgid "SMART Capabilities"
+msgstr "Capacidades do SMART"
+
+#: usr/local/www/diag_smart.php:286 usr/local/www/diag_smart.php:307
+msgid "Attributes"
+msgstr "Atributos"
+
+#: usr/local/www/diag_smart.php:287 usr/local/www/firewall_aliases.php:179
+#: usr/local/www/diag_smart.php:308 usr/local/www/firewall_aliases.php:177
+msgid "All"
+msgstr "Todos"
+
+#: usr/local/www/diag_smart.php:291 usr/local/www/diag_smart.php:330
+#: usr/local/www/diag_smart.php:367 usr/local/www/diag_smart.php:397
+#: usr/local/www/diag_smart.php:312 usr/local/www/diag_smart.php:351
+#: usr/local/www/diag_smart.php:388 usr/local/www/diag_smart.php:418
+msgid "Device: /dev/"
+msgstr "Serviço: /dev/"
+
+#: usr/local/www/diag_smart.php:307 usr/local/www/diag_smart.php:383
+#: usr/local/www/diag_smart.php:328 usr/local/www/diag_smart.php:404
+msgid "View"
+msgstr "Visualização"
+
+#: usr/local/www/diag_smart.php:318
+msgid "Perform Self Tests"
+msgstr "Realizar auto-testes"
+
+#: usr/local/www/diag_smart.php:321 usr/local/www/diag_smart.php:342
+msgid "Test type"
+msgstr "Tipo de teste"
+
+#: usr/local/www/diag_smart.php:323
+#: usr/local/www/status_gateway_groups.php:123
+#: usr/local/www/status_gateways.php:118
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:60
+#: usr/local/www/status_gateways.php:119
+#: usr/local/www/status_gateway_groups.php:124
+#: usr/local/www/diag_smart.php:344
+msgid "Offline"
+msgstr "Desconectado"
+
+#: usr/local/www/diag_smart.php:324 usr/local/www/diag_smart.php:345
+msgid "Short"
+msgstr "Curto"
+
+#: usr/local/www/diag_smart.php:325 usr/local/www/diag_smart.php:346
+#: usr/local/www/diag_system_pftop.php:137
+msgid "Long"
+msgstr "Longo"
+
+#: usr/local/www/diag_smart.php:326 usr/local/www/diag_smart.php:347
+msgid "Conveyance (ATA Disks Only)"
+msgstr "Transporte (Somente Discos ATA)"
+
+#: usr/local/www/diag_smart.php:357 usr/local/www/diag_smart.php:378
+msgid "View Logs"
+msgstr "Visualizar Logs"
+
+#: usr/local/www/diag_smart.php:360 usr/local/www/diag_smart.php:381
+msgid "Log type"
+msgstr "Tipo de Log"
+
+#: usr/local/www/diag_smart.php:362 usr/local/www/diag_smart.php:383
+msgid "Error"
+msgstr "Erro"
+
+#: usr/local/www/diag_smart.php:363
+msgid "Self Test"
+msgstr "Auto-teste"
+
+#: usr/local/www/diag_smart.php:394 usr/local/www/diag_smart.php:415
+msgid "Abort tests"
+msgstr "Abortar testes"
+
+#: usr/local/www/diag_smart.php:413 usr/local/www/diag_smart.php:434
+msgid "Do you really want to abort the test?"
+msgstr "Você realmente deseja abortar o teste?"
+
+#: usr/local/www/diag_smart.php:428 usr/local/www/diag_smart.php:449
+msgid "Back"
+msgstr "Voltar"
+
+#: usr/local/www/diag_states_summary.php:154
+#: usr/local/www/diag_states_summary.php:143
+#: usr/local/www/diag_states_summary.php:145
+msgid "Src Ports"
+msgstr "Portas Src"
+
+#: usr/local/www/diag_states_summary.php:155
+#: usr/local/www/diag_states_summary.php:144
+#: usr/local/www/diag_states_summary.php:146
+msgid "Dst Ports"
+msgstr "Portas Dst"
+
+#: usr/local/www/diag_states_summary.php:185
+#: usr/local/www/diag_states_summary.php:174
+#: usr/local/www/diag_states_summary.php:176
+msgid "State Table Summary"
+msgstr "Resumo da Tabela de Estados"
+
+#: usr/local/www/diag_states_summary.php:191
+#: usr/local/www/diag_states_summary.php:180
+#: usr/local/www/diag_states_summary.php:182
+msgid "By Source IP"
+msgstr "Por IP de Origem"
+
+#: usr/local/www/diag_states_summary.php:192
+#: usr/local/www/diag_states_summary.php:181
+#: usr/local/www/diag_states_summary.php:183
+msgid "By Destination IP"
+msgstr "Por IP de Destino"
+
+#: usr/local/www/diag_states_summary.php:193
+#: usr/local/www/diag_states_summary.php:182
+#: usr/local/www/diag_states_summary.php:184
+msgid "Total per IP"
+msgstr "Total por IP"
+
+#: usr/local/www/diag_states_summary.php:194
+#: usr/local/www/diag_states_summary.php:183
+#: usr/local/www/diag_states_summary.php:185
+msgid "By IP Pair"
+msgstr "Por par de IP"
+
+#: usr/local/www/diag_system_activity.php:46
+msgid "Diagnostics: System Activity"
+msgstr "Diagnósticos: Atividade do Sistema"
+
+#: usr/local/www/diag_system_activity.php:101
+msgid "Gathering CPU activity, please wait..."
+msgstr "Coletando a atividade da CPU, por favor aguarde..."
+
+#: usr/local/www/diag_system_pftop.php:45
+msgid "Diagnostics: pfTop"
+msgstr "Diagnósticos: pfTop"
+
+#: usr/local/www/diag_system_pftop.php:51
+#: usr/local/www/diag_system_pftop.php:62
+#: usr/local/www/diag_system_pftop.php:103
+msgid "bytes"
+msgstr "bytes"
+
+#: usr/local/www/diag_system_pftop.php:99
+#: usr/local/www/diag_system_pftop.php:148
+msgid "Sort type:"
+msgstr "Tipo de classificação:"
+
+#: usr/local/www/diag_system_pftop.php:102
+msgid "age"
+msgstr "idade"
+
+#: usr/local/www/diag_system_pftop.php:104
+msgid "dest"
+msgstr "dest"
+
+#: usr/local/www/diag_system_pftop.php:105
+msgid "dport"
+msgstr "dport"
+
+#: usr/local/www/diag_system_pftop.php:106
+msgid "exp"
+msgstr "exp"
+
+#: usr/local/www/diag_system_pftop.php:108
+msgid "peak"
+msgstr "pico"
+
+#: usr/local/www/diag_system_pftop.php:109
+msgid "pkt"
+msgstr "pct"
+
+#: usr/local/www/diag_system_pftop.php:110
+#: usr/local/www/status_interfaces.php:365
+#: usr/local/www/status_interfaces.php:462
+#: usr/local/www/status_interfaces.php:465
+msgid "rate"
+msgstr "taxa"
+
+#: usr/local/www/diag_system_pftop.php:111
+msgid "size"
+msgstr "tamanho"
+
+#: usr/local/www/diag_system_pftop.php:112
+msgid "sport"
+msgstr "sport"
+
+#: usr/local/www/diag_system_pftop.php:113
+msgid "src"
+msgstr "src"
+
+#: usr/local/www/diag_system_pftop.php:126
+#: usr/local/www/diag_system_pftop.php:187
+msgid "Gathering pfTOP activity, please wait..."
+msgstr "Coletando atividade pfTOP, por favor aguarde..."
+
+#: usr/local/www/license.php:45
+msgid "License"
+msgstr "Licença"
+
+#: usr/local/www/license.php:47
+msgid "is Copyright"
+msgstr "tem Direito de Cópia"
+
+#: usr/local/www/license.php:47 usr/local/www/firewall_rules_edit.php:1585
+#: usr/local/www/firewall_rules_edit.php:1593
+#: usr/local/www/firewall_nat_edit.php:869
+#: usr/local/www/firewall_nat_edit.php:877
+#: usr/local/www/firewall_nat_out_edit.php:684
+#: usr/local/www/firewall_nat_out_edit.php:692
+#: usr/local/www/firewall_rules_edit.php:1596
+#: usr/local/www/firewall_rules_edit.php:1604
+#: usr/local/www/firewall_nat_edit.php:870
+#: usr/local/www/firewall_nat_edit.php:878
+#: usr/local/www/firewall_rules_edit.php:1644
+#: usr/local/www/firewall_rules_edit.php:1652
+msgid "by"
+msgstr "por"
+
+#: usr/local/www/license.php:48 usr/local/www/license.php:52
+msgid "All rights reserved"
+msgstr "Todos os direitos reservados"
+
+#: usr/local/www/license.php:50
+msgid "m0n0wall is Copyright "
+msgstr "m0n0wall is Copyright "
+
+#: usr/local/www/license.php:50
+msgid "2002-2007 by Manuel Kasper"
+msgstr "2002-2007 por Manuel Kasper"
+
+#: usr/local/www/license.php:53
+msgid "Redistribution and use in source and binary forms, with or without"
+msgstr "Redistribuição e uso em forma de fonte e binários, com ou sem "
+
+#: usr/local/www/license.php:54
+msgid "modification, are permitted provided that the following conditions are met"
+msgstr "modificação, são permitidos desde que as seguintes condições sejam encontradas"
+
+#: usr/local/www/license.php:57
+msgid "1. Redistributions of source code must retain the above copyright notice,"
+msgstr "1. Redistribuições de código fonte devem conter a notificação de direitos de cópia acima, "
+
+#: usr/local/www/license.php:59
+msgid "this list of conditions and the following disclaimer"
+msgstr "essa lista de condições e os seguintes avisos legais"
+
+#: usr/local/www/license.php:61
+msgid "2. Redistributions in binary form must reproduce the above copyright"
+msgstr "2. Redistribuições em formato binário devem reproduzir a notificação de direitos"
+
+#: usr/local/www/license.php:62
+msgid "notice, this list of conditions and the following disclaimer in the"
+msgstr "de cópia acima, a lista de condições e os seguintes avisos legais na"
+
+#: usr/local/www/license.php:64
+msgid "documentation and/or other materials provided with the distribution."
+msgstr "documentação e/ou outros materiais fornecidos com a distribuição."
+
+#: usr/local/www/license.php:66
+msgid "THIS SOFTWARE IS PROVIDED "
+msgstr "ESSE SOFTWARE É FORNECIDO "
+
+#: usr/local/www/license.php:66
+msgid "AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,"
+msgstr "COMO APRESENTADO'' E QUALQUER GARANTIA EXPRESSA OU IMPLÍCITA,"
+
+#: usr/local/www/license.php:68
+msgid "INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY"
+msgstr "INCLUINDO, MAS NÃO LIMITADO A, GARANTIAS IMPLÍCITAS DE COMÉRCIO"
+
+#: usr/local/www/license.php:69
+msgid "AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE"
+msgstr "E ADEQUAÇÃO PARA UM PROPÓSITO PARTICULAR SÃO REJEITADOS. EM NENHUM CASO O AUTOR"
+
+#: usr/local/www/license.php:71
+msgid "AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,"
+msgstr "É RESPONSÁVEL POR QUALQUER DANO DIRETO, INDIRETO, INCIDENTAL, ESPECIAL, EXEMPLAR,"
+
+#: usr/local/www/license.php:73
+msgid "OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF"
+msgstr "OR POR CONSEQUÊNCIA (INCLUINDO, MAS NÃO LIMITADO A, PROCURAÇÃO PARA "
+
+#: usr/local/www/license.php:75
+msgid "SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS"
+msgstr "SUBSTITUIÇÃO DE BENS E SERVIÇOS; PERDA DE USO, DADOS, OU LUCROS; OU INTERRUPÇÃO"
+
+#: usr/local/www/license.php:77
+msgid "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN"
+msgstr "DO NEGÓCIO) NO ENTANTO CAUSADO E A NENHUMA TEORIA DE RESPONSABILIDADE, QUER SEJA"
+
+#: usr/local/www/license.php:79
+msgid "CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)"
+msgstr "EM CONTRATO, RESPONSABILITADE ESTRITA, OU AGRAVO (INCLUINDO NEGLIGÊNCIA OU DE OUTRA MANEIRA)"
+
+#: usr/local/www/license.php:80
+msgid "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE"
+msgstr "DECORRENTE DE QUALQUER USO DESSE SOFTWARE, MESMO SE ACONSELHADO"
+
+#: usr/local/www/license.php:82
+msgid "POSSIBILITY OF SUCH DAMAGE"
+msgstr "SOBRE A POSSIBILIDADE DE TAL DANO"
+
+#: usr/local/www/license.php:84
+msgid "The following persons have contributed code to m0n0wall"
+msgstr "As seguintes pessoas tem código contribuído no m0n0wall"
+
+#: usr/local/www/license.php:86
+msgid "Diagnostics: Ping function; WLAN channel auto-select; DNS forwarder"
+msgstr "Diagnóstico: Função Ping; canal WLAN auto-selecionado; DNS forwarder"
+
+#: usr/local/www/license.php:90
+msgid "Timezone and NTP client support"
+msgstr "Fuso horário e suport a cliente NTP"
+
+#: usr/local/www/license.php:94
+msgid "Remote syslog'ing; some code bits for DHCP server on optional interfaces"
+msgstr "Geração de syslog remoto; alguns bits de código para servidor DHCP em interfaces opcionais"
+
+#: usr/local/www/license.php:98
+msgid "Idea/code bits for encrypted webConfigurator passwords; minimalized SNMP agent"
+msgstr "Idéia/bits de código para senhas criptografadas do webConfigurator; agente SNMP minimizado"
+
+#: usr/local/www/license.php:102
+msgid "Advanced outbound NAT: destination selection"
+msgstr "Outbound NAT avançado: seleção de destino"
+
+#: usr/local/www/license.php:106
+msgid "Filtering bridge patches "
+msgstr "Patch de ponte de filtro"
+
+#: usr/local/www/license.php:110
+msgid "Filter rule patches (ordering, block/pass, disabled); better status page;"
+msgstr "Patches de regras de filtro (ordenação, bloqueio/liberação, desabilitado); melhor página de status;"
+
+#: usr/local/www/license.php:112
+msgid "webConfigurator assign network ports page "
+msgstr "webConfigurator atribui página de portas de rede "
+
+#: usr/local/www/license.php:115
+msgid "enhanced "
+msgstr "melhorado"
+
+#: usr/local/www/license.php:115
+msgid "execute command"
+msgstr "executar comando"
+
+#: usr/local/www/license.php:116
+msgid " page"
+msgstr " página"
+
+#: usr/local/www/license.php:119
+msgid "DHCP client: send hostname patch"
+msgstr "Cliente DHCP: envia patch de nome de host"
+
+#: usr/local/www/license.php:122
+msgid "DHCP lease list page"
+msgstr "Página de lista de concessões do DHCP"
+
+#: usr/local/www/license.php:125
+msgid "type filter rules; dial-on-demand"
+msgstr "digite regras de filtro; disque sob demanda"
+
+#: usr/local/www/license.php:128
+msgid "SVG-based traffic grapher"
+msgstr "Grafo de tráfego baseado em SVG"
+
+#: usr/local/www/license.php:131
+msgid "per-user IP address assignments for PPTP VPN"
+msgstr "endereços IP por usuário atribuídos para a VPN PPTP"
+
+#: usr/local/www/license.php:134
+msgid "NAT on optional interfaces"
+msgstr "NAT em interfaces opcionais"
+
+#: usr/local/www/license.php:137
+msgid "captive portal: pass-through MAC/IP addresses, RADIUS authentication"
+msgstr "portal captive: endereços MAC/IP pass-through, autenticação RADIUS"
+
+#: usr/local/www/license.php:137
+msgid "accounting;"
+msgstr "contabilitade;"
+
+#: usr/local/www/license.php:138
+msgid "HTTP server concurrency limit"
+msgstr "Limite de concorrência de servidor HTTP"
+
+#: usr/local/www/license.php:141
+msgid "traffic shaper TOS matching; magic shaper; DHCP deny unknown clients;"
+msgstr "correspondência do Traffic Shaper TOS; magic shaper; DHCP nega clientes desconhecidos;"
+
+#: usr/local/www/license.php:142
+msgid "IPsec user FQDNs; DHCP relay"
+msgstr "IPsec usuário FQDNs; DHCP relay"
+
+#: usr/local/www/license.php:145
+msgid "IDE hard disk standby"
+msgstr "Espera de disco rígido IDE"
+
+#: usr/local/www/license.php:148
+msgid "CPU/memory usage display"
+msgstr "Exibição de uso de CPU/memória"
+
+#: usr/local/www/license.php:151
+msgid "OpenVPN support"
+msgstr "Suporte a OpenVPN"
+
+#: usr/local/www/license.php:153
+msgid "is based upon/includes various free software packages, listed below."
+msgstr "é baseado em/inclui vários pacotes de software livres, listados abaixo."
+
+#: usr/local/www/license.php:155
+#, php-format
+msgid "The author of %s would like to thank the authors of these software packages for their efforts"
+msgstr "O autor de %s gostaria de agradecer aos autores desses pacotes de software pelo seu esforço"
+
+#: usr/local/www/license.php:158 usr/local/www/license.php:161
+#: usr/local/www/license.php:164 usr/local/www/license.php:168
+#: usr/local/www/license.php:174 usr/local/www/license.php:178
+#: usr/local/www/license.php:181 usr/local/www/license.php:184
+#: usr/local/www/license.php:187 usr/local/www/license.php:191
+#: usr/local/www/license.php:192 usr/local/www/license.php:194
+#: usr/local/www/license.php:200 usr/local/www/license.php:201
+#: usr/local/www/license.php:204 usr/local/www/license.php:211
+#: usr/local/www/license.php:169
+msgid "Copyright"
+msgstr "Direito de cópia"
+
+#: usr/local/www/license.php:158
+msgid " 1994-2003 FreeBSD, Inc. All rights reserved"
+msgstr " 1994-2003 FreeBSD, Inc. Todos os direitos reservados"
+
+#: usr/local/www/license.php:160
+msgid "This product includes PHP, freely available from"
+msgstr "Esse produto inclui PHP, disponível de graça por"
+
+#: usr/local/www/license.php:161
+msgid "1999 - 2003 The PHP Group. All rights reserved"
+msgstr "1999 - 2003 The PHP Group. Todos os direitos reservados"
+
+#: usr/local/www/license.php:163
+msgid "LightTPD"
+msgstr "LightTPD"
+
+#: usr/local/www/license.php:164
+msgid " 2004 by Jan Kneschke "
+msgstr " 2004 por Jan Kneschke "
+
+#: usr/local/www/license.php:165 usr/local/www/license.php:175
+msgid "All rights reserved."
+msgstr "Todos os direitos reservados."
+
+#: usr/local/www/license.php:167
+msgid "ISC DHCP server "
+msgstr "Servidor ISC DHCP "
+
+#: usr/local/www/license.php:168
+msgid "1996-2003 Internet Software Consortium. All rights reserved."
+msgstr "1996-2003 Internet Software Consortium. Todos os direitos reservados."
+
+#: usr/local/www/license.php:173
+msgid "MPD - Multi-link PPP daemon for FreeBSD"
+msgstr "MDP - daemon PPP Multi-link para FreeBSSD"
+
+#: usr/local/www/license.php:177
+msgid "Circular log support for FreeBSD syslogd "
+msgstr "Suporte de log circular para syslodg do FreeBSD"
+
+#: usr/local/www/license.php:180
+msgid "Dnsmasq - a DNS forwarder for NAT firewalls"
+msgstr "Dnsmasq - um DNS forwarder para firewalls NAT"
+
+#: usr/local/www/license.php:183
+msgid "Racoon"
+msgstr "Racoon"
+
+#: usr/local/www/license.php:184
+msgid "1995-2002 WIDE Project. All rights reserved."
+msgstr "1995-2002 WIDE Project. Todos os direitos reservados."
+
+#: usr/local/www/license.php:186
+msgid "msntp"
+msgstr "msntp"
+
+#: usr/local/www/license.php:187
+msgid " 1996, 1997, 2000 N.M. Maclaren, University of Cambridge. All rights reserved."
+msgstr " 1996, 1997, 2000 N.M. Maclaren, University of Cambridge. Todos os direitos reservados."
+
+#: usr/local/www/license.php:190
+msgid "UCD-SNMP"
+msgstr "UCD-SNMP"
+
+#: usr/local/www/license.php:191
+msgid "1989, 1991, 1992 by Carnegie Mellon University."
+msgstr "1989, 1991, 1992 by Carnegie Mellon University."
+
+#: usr/local/www/license.php:192
+msgid "1996, 1998-2000 The Regents of the University of California. All rights reserved"
+msgstr "1996, 1998-2000 The Regents of the University of California. Todos os direitos reservados"
+
+#: usr/local/www/license.php:194
+msgid "2001-2002, Network Associates Technology, Inc. All rights reserved."
+msgstr "2001-2002, Network Associates Technology, Inc. Todos os direitos reservados."
+
+#: usr/local/www/license.php:196
+msgid "Portions of this code are copyright"
+msgstr "Porções desse código tem direitos de cópia"
+
+#: usr/local/www/license.php:196
+msgid "2001-2002, Cambridge Broadband Ltd. All rights reserved."
+msgstr "2001-2002, Cambridge Broadband Ltd. Todos os direitos reservados."
+
+#: usr/local/www/license.php:199
+msgid "choparp"
+msgstr "choparp"
+
+#: usr/local/www/license.php:203
+msgid "BPALogin"
+msgstr "BPALogin"
+
+#: usr/local/www/license.php:203
+msgid "lightweight portable BIDS2 login client"
+msgstr "cliente de login BIDS2 leve e portável"
+
+#: usr/local/www/license.php:204
+msgid " 2001-3 Shane Hyde, and others."
+msgstr " 2001-3 Shane Hyde, e outros."
+
+#: usr/local/www/license.php:206
+msgid "php-radius"
+msgstr "php-radius"
+
+#: usr/local/www/license.php:207
+msgid "Copyright 2000, 2001, 2002 by Edwin Groothuis. All rights reserved."
+msgstr "Direito de cópia 2000, 2001, 2002 por Edwin Groothuis. Todos os direitos reservados."
+
+#: usr/local/www/license.php:208
+msgid "This product includes software developed by Edwin Groothuis."
+msgstr "Esse produto inclui software desenvolvido por Edwin Groothuis."
+
+#: usr/local/www/license.php:210
+msgid "wol"
+msgstr "wol"
+
+#: usr/local/www/license.php:214
+msgid "Copyright (C) 2002-2005 OpenVPN Solutions LLC "
+msgstr "Direito de cópia (C) 2002-2005 OpenVPN Solutions LLC "
+
+#: usr/local/www/load_balancer_pool.php:72
+#: usr/local/www/load_balancer_relay_protocol.php:71
+msgid "This entry cannot be deleted because it is still referenced by at least one virtual server."
+msgstr "Essa entrada não pode ser apagada porque ela ainda é referenciada por pelo menos um servidor virtual."
+
+#: usr/local/www/load_balancer_pool.php:111
+#: usr/local/www/status_lb_pool.php:113
+#: usr/local/www/load_balancer_pool.php:109
+#, php-format
+msgid "The load balancer configuration has been changed%sYou must apply the changes in order for them to take effect."
+msgstr "A configuração do balanceador de carga foi modificada%sVocê deve aplicar as mudanças para que elas tenham efeito."
+
+#: usr/local/www/load_balancer_pool.php:133
+#: usr/local/www/status_lb_pool.php:132 usr/local/www/status_lb_vs.php:79
+#: usr/local/www/system_authservers.php:424
+#: usr/local/www/system_groupmanager.php:243
+#: usr/local/www/system_groupmanager_addprivs.php:171
+#: usr/local/www/system_usermanager.php:443
+#: usr/local/www/system_usermanager_addprivs.php:170
+#: usr/local/www/system_usermanager_settings.php:116
+#: usr/local/www/system_usermanager.php:441
+#: usr/local/www/system_groupmanager_addprivs.php:169
+#: usr/local/www/load_balancer_pool.php:134
+#: usr/local/www/load_balancer_pool.php:132
+#: usr/local/www/system_authservers.php:429
+#: usr/local/www/system_authservers.php:436
+#: usr/local/www/system_usermanager_settings.php:118
+#: usr/local/www/system_groupmanager.php:246
+#: usr/local/www/system_authservers.php:447
+msgid "Servers"
+msgstr "Servidores"
+
+#: usr/local/www/load_balancer_pool.php:135
+#: usr/local/www/load_balancer_monitor.php:88
+#: usr/local/www/load_balancer_monitor_edit.php:193
+#: usr/local/www/load_balancer_pool_edit.php:76
+#: usr/local/www/load_balancer_pool_edit.php:223
+#: usr/local/www/status_gateways.php:74 usr/local/www/status_lb_pool.php:133
+#: usr/local/www/load_balancer_pool_edit.php:240
+#: usr/local/www/load_balancer_pool.php:136
+#: usr/local/www/status_gateways.php:75
+#: usr/local/www/load_balancer_pool_edit.php:238
+#: usr/local/www/load_balancer_pool.php:134
+msgid "Monitor"
+msgstr "Monitor"
+
+#: usr/local/www/load_balancer_pool.php:149
+#: usr/local/www/load_balancer_pool.php:150
+#: usr/local/www/load_balancer_pool.php:148
+#, php-format
+msgid "The Load Balancer in %s 2.0 is for server load balancing, not Multi-WAN. For load balancing or failover for multiple WANs, use "
+msgstr "O Load Balancer em %s 2.0 é para balanceamento de carga do servidor, não Multi-WAN. Para balanceamento de carga ou failover para WANs múltiplas, use"
+
+#: usr/local/www/load_balancer_pool.php:150
+#: usr/local/www/status_gateway_groups.php:48
+#: usr/local/www/status_gateway_groups.php:52
+#: usr/local/www/status_gateways.php:63
+#: usr/local/www/system_gateway_groups.php:52
+#: usr/local/www/system_gateway_groups.php:88
+#: usr/local/www/status_gateway_groups.php:65
+#: usr/local/www/load_balancer_pool.php:151
+#: usr/local/www/system_gateway_groups.php:89
+#: usr/local/www/status_gateways.php:64
+#: usr/local/www/status_gateway_groups.php:66
+#: usr/local/www/load_balancer_pool.php:149
+#: usr/local/www/system_gateway_groups.php:53
+#: usr/local/www/system_gateway_groups.php:98
+msgid "Gateway Groups"
+msgstr "Grupos de Gateway"
+
+#: usr/local/www/pkg.php:358 usr/local/www/pkg.php:456
+msgid "Do you really want to delete this item?"
+msgstr "Você realmente deseja apagar esse item?"
+
+#: usr/local/www/status_wireless.php:83 usr/local/www/status_wireless.php:84
+msgid "Rescan has been initiated in the background. Refresh this page in 10 seconds to see the results."
+msgstr "Rescan foi iniciado em background. Atualize essa página em 10 segundos para ver os resultados."
+
+#: usr/local/www/status_wireless.php:97 usr/local/www/status_wireless.php:93
+#: usr/local/www/status_wireless.php:94
+msgid "Nearby access points or ad-hoc peers"
+msgstr "Pontos de acesso próximos ou peers ad-hoc"
+
+#: usr/local/www/status_wireless.php:143 usr/local/www/status_wireless.php:140
+#: usr/local/www/status_wireless.php:141
+msgid "Associated or ad-hoc peers"
+msgstr "Associados ou peers ad-hoc"
+
+#: usr/local/www/system.php:118 usr/local/www/system.php:119
+#: usr/local/www/system.php:112
+msgid "The hostname may only contain the characters a-z, 0-9 and '-'."
+msgstr "O nome do host somente pode conter os caracteres de a-z, 0-9 e '-'."
+
+#: usr/local/www/system.php:121 usr/local/www/system.php:122
+#: usr/local/www/system.php:115
+msgid "The domain may only contain the characters a-z, 0-9, '-' and '.'."
+msgstr "O domínio somente pode conter os caracteres de a-z, 0-9, '-' e '.'."
+
+#: usr/local/www/system.php:131
+msgid "'."
+msgstr "'."
+
+#: usr/local/www/system.php:137 usr/local/www/system.php:143
+#: usr/local/www/system.php:136
+msgid "A valid TCP/IP port must be specified for the webConfigurator port."
+msgstr "Uma porta TCP/IP válida deve ser especificada com a porta do webConfigurator."
+
+#: usr/local/www/system.php:148 usr/local/www/system.php:154
+#: usr/local/www/system.php:147
+#, php-format
+msgid "You can not assign a gateway to DNS '%s' server which is on a directly connected network."
+msgstr "Você não pode atribuir um gateway para o servidor DNS '%s' que está em uma rede diretamente conectada."
+
+#: usr/local/www/system.php:157 usr/local/www/system.php:163
+#: usr/local/www/system.php:156
+msgid "The time update interval must be either 0 (disabled) or between 6 and 1440."
+msgstr "O intervalo de atualização deve ser 0 (desabilitado) ou entre 6 e 1440."
+
+#: usr/local/www/system.php:161 usr/local/www/system.php:167
+#: usr/local/www/system.php:160
+msgid "A NTP Time Server name may only contain the characters a-z, 0-9, '-' and '.'."
+msgstr "O nome do Servidor de Tempo NTP somente pode conter caracteres de a-z, 0-9, '-' e '.'."
+
+#: usr/local/www/system.php:231 usr/local/www/fbegin.inc:85
+#: usr/local/www/fbegin.inc:101 usr/local/www/system.php:242
+#: usr/local/www/fbegin.inc:110 usr/local/www/system.php:235
+#: usr/local/www/fbegin.inc:102
+msgid "General Setup"
+msgstr "Configuração Geral"
+
+#: usr/local/www/system.php:258 usr/local/www/system.php:269
+#: usr/local/www/system.php:262
+msgid "Name of the firewall host, without domain part"
+msgstr "Nome do host do firewall, sem a parte de domínio"
+
+#: usr/local/www/system.php:269 usr/local/www/system.php:280
+#: usr/local/www/system.php:273
+msgid "Do not use 'local' as a domain name. It will cause local hosts running mDNS (avahi, bonjour, etc.) to be unable to resolve local hosts not running mDNS."
+msgstr "Não use 'local' como um nome de domínio. Isso fará com que host locais que executam mDNS (avahi, bonjour, etc.) fiquem impossibilitados de resolver hosts locais que não executam mDNS."
+
+#: usr/local/www/system.php:271 usr/local/www/system.php:282
+#: usr/local/www/system.php:275
+msgid "mycorp.com, home, office, private, etc."
+msgstr "mycorp.com, casa, escritório, casa, etc."
+
+#: usr/local/www/system.php:276 usr/local/www/services_dhcp.php:647
+#: usr/local/www/vpn_pppoe_edit.php:451 usr/local/www/services_dhcpv6.php:590
+#: usr/local/www/services_dhcp.php:660 usr/local/www/system.php:287
+#: usr/local/www/services_dhcpv6.php:667 usr/local/www/vpn_pppoe_edit.php:452
+#: usr/local/www/services_router_advertisements.php:372
+#: usr/local/www/services_dhcp.php:836 usr/local/www/system.php:280
+#: usr/local/www/services_dhcpv6.php:598
+#: usr/local/www/services_dhcp_edit.php:402
+#: usr/local/www/vpn_pppoe_edit.php:455 usr/local/www/services_dhcp.php:850
+#: usr/local/www/services_dhcpv6.php:615
+#: usr/local/www/services_router_advertisements.php:367
+#: usr/local/www/services_dhcp.php:870 usr/local/www/services_dhcp.php:882
+msgid "DNS servers"
+msgstr "Servidores DNS"
+
+#: usr/local/www/system.php:281 usr/local/www/system.php:292
+#: usr/local/www/system.php:285
+msgid "DNS Server"
+msgstr "Servidor DNS"
+
+#: usr/local/www/system.php:283 usr/local/www/system.php:294
+#: usr/local/www/system.php:287
+msgid "Use gateway"
+msgstr "Usar gateway"
+
+#: usr/local/www/system.php:331 usr/local/www/system.php:342
+#: usr/local/www/system.php:335 usr/local/www/system.php:334
+msgid "Enter IP addresses to by used by the system for DNS resolution.These are also used for the DHCP service, DNS forwarder and for PPTP VPN clients."
+msgstr "Digite os endereços IP usados pelo sistema para resolução de DNS. Eles também são usados para o serviço de DHCP, DNS Forwarder e para clientes VPN PPTP."
+
+#: usr/local/www/system.php:336 usr/local/www/system.php:347
+#: usr/local/www/system.php:340 usr/local/www/system.php:339
+msgid "In addition, optionally select the gateway for each DNS server. When using multiple WAN connections there should be at least one unique DNS server per gateway."
+msgstr "Além disso, opcionalmente selecione o gateway para cada servidor DNS. Quando usando múltiplas conexões WAN deverá haver pelo menos um único servidor DNS por gateway."
+
+#: usr/local/www/system.php:343 usr/local/www/system.php:354
+#: usr/local/www/system.php:347 usr/local/www/system.php:346
+msgid "Allow DNS server list to be overridden by DHCP/PPP on WAN"
+msgstr "Permite que a lista de servidores DNS seja substituída pelo DHCP/PPP na WAN"
+
+#: usr/local/www/system.php:346 usr/local/www/system.php:357
+#: usr/local/www/system.php:350 usr/local/www/system.php:349
+#, php-format
+msgid "If this option is set, %s will use DNS servers assigned by a DHCP/PPP server on WAN for its own purposes (including the DNS forwarder). However, they will not be assigned to DHCP and PPTP VPN clients."
+msgstr "Se essa opção estiver configurada, %s irá usar servidores DNS atribuídos para um servidor DHCP/PPP na WAN para seus próprios propósitos (incluindo o DNS forwarder). No entanto, eles serão atribuídos a clientes DHCP e PPTP VPN."
+
+#: usr/local/www/system.php:355 usr/local/www/system.php:366
+#: usr/local/www/system.php:359 usr/local/www/system.php:358
+msgid "Do not use the DNS Forwarder as a DNS server for the firewall"
+msgstr "Não utilize o DNS Forwarder como um servidor DNS para o firewall"
+
+#: usr/local/www/system.php:358 usr/local/www/system.php:369
+#: usr/local/www/system.php:362 usr/local/www/system.php:361
+msgid "By default localhost (127.0.0.1) will be used as the first DNS server where the DNS forwarder is enabled, so system can use the DNS forwarder to perform lookups. Checking this box omits localhost from the list of DNS servers."
+msgstr "Por padrão localhost (127.0.0.1) será usado como o primeiro servidor DNS onde o encaminhador DNS está habilitado, então o sistema pode usar o encaminhador DNS para fazer buscas. Marcar essa opção omite o localhost da lista de servidores DNS."
+
+#: usr/local/www/system.php:365 usr/local/www/system.php:376
+#: usr/local/www/system.php:369 usr/local/www/system.php:367
+msgid "Time zone"
+msgstr "Fuso horário"
+
+#: usr/local/www/system.php:377 usr/local/www/system.php:388
+#: usr/local/www/system.php:381 usr/local/www/system.php:379
+msgid "Select the location closest to you"
+msgstr "Selecione a localização mais próxima de você"
+
+#: usr/local/www/system.php:395 usr/local/www/system.php:406
+#: usr/local/www/system.php:399 usr/local/www/system.php:397
+msgid "NTP time server"
+msgstr "Servidor NTP"
+
+#: usr/local/www/system.php:400 usr/local/www/system.php:411
+#: usr/local/www/system.php:404 usr/local/www/system.php:402
+msgid "Use a space to separate multiple hosts (only one required). Remember to set up at least one DNS server if you enter a host name here!"
+msgstr "Use um espaço para separar múltiplos hosts (somente um é necessário). Lembre-se de configurar pelo menos um servidor DNS se você informar um nome de host aqui!"
+
+#: usr/local/www/system.php:411 usr/local/www/system.php:440
+#: usr/local/www/system.php:433 usr/local/www/system.php:431
+msgid "Theme"
+msgstr "Tema"
+
+#: usr/local/www/system.php:435 usr/local/www/system.php:464
+#: usr/local/www/system.php:457 usr/local/www/system.php:455
+msgid "This will change the look and feel of"
+msgstr "Isso irá modificar a aparência de "
+
+#: usr/local/www/interfaces_vlan.php:65 usr/local/www/interfaces_vlan.php:69
+msgid "This VLAN cannot be deleted because it is still being used as an interface."
+msgstr "Essa VLAN não pode ser apagada porque ela ainda está sendo usada como uma interface."
+
+#: usr/local/www/interfaces_vlan.php:78
+#: usr/local/www/interfaces_vlan_edit.php:139
+#: usr/local/www/interfaces_vlan_edit.php:142
+#: usr/local/www/interfaces_vlan.php:84
+msgid "VLAN"
+msgstr "VLAN"
+
+#: usr/local/www/interfaces_vlan.php:109
+#: usr/local/www/interfaces_vlan_edit.php:75
+#: usr/local/www/interfaces_vlan.php:110 usr/local/www/interfaces_vlan.php:116
+msgid "VLAN tag"
+msgstr "Tag VLAN"
+
+#: usr/local/www/interfaces_vlan.php:125 usr/local/www/interfaces_vlan.php:126
+#: usr/local/www/interfaces_vlan.php:132
+msgid "Do you really want to delete this VLAN?"
+msgstr "Você realmente deseja apagar essa VLAN?"
+
+#: usr/local/www/interfaces_vlan.php:136 usr/local/www/interfaces_vlan.php:137
+#: usr/local/www/interfaces_vlan.php:143
+#, php-format
+msgid "Not all drivers/NICs support 802.1Q VLAN tagging properly. On cards that do not explicitly support it, VLAN tagging will still work, but the reduced MTU may cause problems. See the %s handbook for information on supported cards."
+msgstr "Nem todos os drivers/NICs suportam tags 802.1Q apropriadamente. Em cartões que não explicitam que a suportam, tags VLAN ainda funcionarão, mas um MTU reduzido pode causar problemas. Veja o livro %s para informações sobre cartões que oferecem este tipo de suporte."
+
+#: usr/local/www/interfaces_vlan_edit.php:80
+msgid "The VLAN tag must be an integer between 1 and 4094."
+msgstr "A tag VLAN deve ser um inteiro entre 1 e 4094."
+
+#: usr/local/www/interfaces_vlan_edit.php:88
+#: usr/local/www/interfaces_vlan_edit.php:91
+#, php-format
+msgid "A VLAN with the tag %s is already defined on this interface."
+msgstr "A VLAN com a tag %s já foi definida nessa interface."
+
+#: usr/local/www/interfaces_vlan_edit.php:95
+#: usr/local/www/interfaces_vlan_edit.php:98
+msgid "A QinQ VLAN exists with this tag please remove it to use this tag with."
+msgstr "Uma VLAN QinQ existe com essa tag, por favor, remova-a para usar essa tag."
+
+#: usr/local/www/interfaces_vlan_edit.php:150
+#: usr/local/www/interfaces_vlan_edit.php:151
+#: usr/local/www/interfaces_vlan_edit.php:154
+msgid "VLAN configuration"
+msgstr "Configuração VLAN"
+
+#: usr/local/www/interfaces_vlan_edit.php:169
+#: usr/local/www/interfaces_vlan_edit.php:170
+#: usr/local/www/interfaces_vlan_edit.php:173
+msgid "Only VLAN capable interfaces will be shown."
+msgstr "Somente interfaces que suportam VLAN serão exibidas."
+
+#: usr/local/www/interfaces_vlan_edit.php:172
+#: usr/local/www/interfaces_vlan_edit.php:173
+#: usr/local/www/interfaces_vlan_edit.php:176
+msgid "VLAN tag "
+msgstr "Tag VLAN"
+
+#: usr/local/www/interfaces_vlan_edit.php:176
+#: usr/local/www/interfaces_vlan_edit.php:177
+#: usr/local/www/interfaces_vlan_edit.php:180
+msgid "802.1Q VLAN tag (between 1 and 4094) "
+msgstr "Tag VLAN 802.1Q (entre 1 e 4094)"
+
+#: usr/local/www/system_firmware.php:82 usr/local/www/system_firmware.php:89
+#: usr/local/www/system_firmware.php:88
+msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
+msgstr "O arquivo carregado excede a diretiva upload_max_filesize em php.ini"
+
+#: usr/local/www/system_firmware.php:84 usr/local/www/system_firmware.php:91
+#: usr/local/www/system_firmware.php:90
+msgid "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"
+msgstr "O arquivo carregado excede a diretiva MAX_FILE_SIZE que foi especificado no formulário HTML"
+
+#: usr/local/www/system_firmware.php:86 usr/local/www/system_firmware.php:93
+#: usr/local/www/system_firmware.php:92
+msgid "The uploaded file was only partially uploaded"
+msgstr "O arquivo carregado foi somente carregado parcialmente"
+
+#: usr/local/www/system_firmware.php:88 usr/local/www/system_firmware.php:95
+#: usr/local/www/system_firmware.php:94
+msgid "No file was uploaded"
+msgstr "Nenhum arquivo foi carregado"
+
+#: usr/local/www/system_firmware.php:90 usr/local/www/system_firmware.php:97
+#: usr/local/www/system_firmware.php:96
+msgid "Missing a temporary folder"
+msgstr "Uma pasta temporária está faltando"
+
+#: usr/local/www/system_firmware.php:92 usr/local/www/system_firmware.php:99
+#: usr/local/www/system_firmware.php:98
+msgid "Failed to write file to disk"
+msgstr "Falhou ao escrever um arquivo no disco"
+
+#: usr/local/www/system_firmware.php:94 usr/local/www/system_firmware.php:101
+#: usr/local/www/system_firmware.php:100
+msgid "File upload stopped by extension"
+msgstr "Carregamento de arquivo interrompido pela extensão"
+
+#: usr/local/www/system_firmware.php:96 usr/local/www/system_firmware.php:103
+#: usr/local/www/system_firmware.php:102
+msgid "Unknown upload error"
+msgstr "Erro de carregamento desconhecido"
+
+#: usr/local/www/system_firmware.php:102 usr/local/www/system_firmware.php:203
+#: usr/local/www/system_firmware_auto.php:60
+#: usr/local/www/system_firmware_check.php:49
+#: usr/local/www/system_firmware_settings.php:74 usr/local/www/fbegin.inc:84
+#: usr/local/www/fbegin.inc:100 usr/local/www/fbegin.inc:109
+#: usr/local/www/system_firmware.php:109 usr/local/www/system_firmware.php:210
+#: usr/local/www/system_firmware_settings.php:79
+#: usr/local/www/system_firmware.php:108 usr/local/www/fbegin.inc:101
+#: usr/local/www/system_firmware_auto.php:61
+msgid "Firmware"
+msgstr "Firmware"
+
+#: usr/local/www/system_firmware.php:102 usr/local/www/system_firmware.php:238
+#: usr/local/www/system_firmware_auto.php:79
+#: usr/local/www/system_firmware_check.php:66
+#: usr/local/www/system_firmware_settings.php:110
+#: usr/local/www/system_firmware_restorefullbackup.php:125
+#: usr/local/www/system_firmware.php:109 usr/local/www/system_firmware.php:245
+#: usr/local/www/system_firmware_settings.php:115
+#: usr/local/www/system_firmware.php:108 usr/local/www/system_firmware.php:248
+#: usr/local/www/system_firmware_check.php:64
+#: usr/local/www/system_firmware_settings.php:117
+#: usr/local/www/system_firmware_auto.php:80
+msgid "Manual Update"
+msgstr "Atualização Manual"
+
+#: usr/local/www/system_firmware.php:107 usr/local/www/system_firmware.php:114
+#: usr/local/www/system_firmware.php:113
+msgid "An upgrade is currently in progress.<p>The firewall will reboot when the operation is complete."
+msgstr "Uma atualização está atualmente em progresso.<p>O firewall irá reiniciar quando a operação for completada."
+
+#: usr/local/www/system_firmware.php:135 usr/local/www/system_firmware.php:142
+#: usr/local/www/system_firmware.php:137
+msgid "Upgrade"
+msgstr "Atualização"
+
+#: usr/local/www/system_firmware.php:154 usr/local/www/system_firmware.php:161
+#: usr/local/www/system_firmware.php:156
+msgid "The uploaded image file is not for this platform."
+msgstr "O arquivo de imagem carregado não é dessa plataforma."
+
+#: usr/local/www/system_firmware.php:157 usr/local/www/system_firmware.php:164
+#: usr/local/www/system_firmware.php:159
+msgid "Image upload failed (out of memory?)"
+msgstr "Carregamento de imagem falhou (falta de memória?)"
+
+#: usr/local/www/system_firmware.php:168
+#: usr/local/www/system_firmware_auto.php:201
+#: usr/local/www/system_firmware.php:175 usr/local/www/system_firmware.php:170
+#: usr/local/www/system_firmware_auto.php:203
+#: usr/local/www/system_firmware_auto.php:199
+msgid "The digital signature on this image is invalid."
+msgstr "A assinatura digital nessa imagem é inválida."
+
+#: usr/local/www/system_firmware.php:170
+#: usr/local/www/system_firmware_auto.php:204
+#: usr/local/www/system_firmware.php:177 usr/local/www/system_firmware.php:172
+#: usr/local/www/system_firmware_auto.php:206
+#: usr/local/www/system_firmware_auto.php:202
+msgid "This image is not digitally signed."
+msgstr "Essa imagem não está assinada digitalmente."
+
+#: usr/local/www/system_firmware.php:172
+#: usr/local/www/system_firmware_auto.php:208
+#: usr/local/www/system_firmware.php:179 usr/local/www/system_firmware.php:174
+#: usr/local/www/system_firmware_auto.php:210
+#: usr/local/www/system_firmware_auto.php:206
+msgid "There has been an error verifying the signature on this image."
+msgstr "Ocorreu um erro verificando a assinatura nessa imagem."
+
+#: usr/local/www/system_firmware.php:175
+#: usr/local/www/system_firmware_auto.php:223
+#: usr/local/www/system_firmware.php:182 usr/local/www/system_firmware.php:177
+#: usr/local/www/system_firmware_auto.php:225
+#: usr/local/www/system_firmware_auto.php:221
+msgid "The image file is corrupt."
+msgstr "O arquivo de imagem está corrompido."
+
+#: usr/local/www/system_firmware.php:188 usr/local/www/system_firmware.php:195
+#: usr/local/www/system_firmware.php:190
+msgid "The firmware is now being updated. The firewall will reboot automatically."
+msgstr "O firmware está sendo atualizado. O firewall irá reiniciar automaticamente."
+
+#: usr/local/www/system_firmware.php:196 usr/local/www/system_firmware.php:203
+#: usr/local/www/system_firmware.php:204
+#, php-format
+msgid "Firmware image missing or other error, please try again %s."
+msgstr "A imagem de firmware não foi encontrada ou trata-se de outro erro; por favor, tente novamente %s."
+
+#: usr/local/www/system_firmware.php:220 usr/local/www/system_firmware.php:227
+#: usr/local/www/system_firmware.php:230
+msgid "This means that the image you uploaded is not an official/supported image and may lead to unexpected behavior or security compromises. Only install images that come from sources that you trust, and make sure that the image has not been tampered with."
+msgstr "Isso significa que a imagem que você carregou não é uma imagem oficial/suportada e mode levar a um comportamento inesperado ou comprometimento de segurança. Somente instale imagens que vem de fontes que você confia, e tenha certeza de que a imagem não foi adulterada."
+
+#: usr/local/www/system_firmware.php:224 usr/local/www/system_firmware.php:231
+#: usr/local/www/system_firmware.php:234
+msgid "Do you want to install this image anyway (on your own risk)?"
+msgstr "Você deseja instalar essa imagem mesmo assim (por sua conta e risco)?"
+
+#: usr/local/www/system_firmware.php:239
+#: usr/local/www/system_firmware_auto.php:60
+#: usr/local/www/system_firmware_auto.php:80
+#: usr/local/www/system_firmware_check.php:49
+#: usr/local/www/system_firmware_check.php:67
+#: usr/local/www/system_firmware_settings.php:111
+#: usr/local/www/system_firmware_restorefullbackup.php:126
+#: usr/local/www/system_firmware.php:246
+#: usr/local/www/system_firmware_settings.php:116
+#: usr/local/www/system_firmware.php:249
+#: usr/local/www/system_firmware_check.php:65
+#: usr/local/www/system_firmware_settings.php:118
+#: usr/local/www/system_firmware_auto.php:61
+#: usr/local/www/system_firmware_auto.php:81
+msgid "Auto Update"
+msgstr "Auto-Atualização"
+
+#: usr/local/www/system_firmware.php:240
+#: usr/local/www/system_firmware_auto.php:81
+#: usr/local/www/system_firmware_check.php:68
+#: usr/local/www/system_firmware_settings.php:112
+#: usr/local/www/system_firmware_restorefullbackup.php:127
+#: usr/local/www/system_firmware.php:247
+#: usr/local/www/system_firmware_settings.php:117
+#: usr/local/www/system_firmware.php:250
+#: usr/local/www/system_firmware_check.php:66
+#: usr/local/www/system_firmware_settings.php:119
+#: usr/local/www/system_firmware_auto.php:82
+msgid "Updater Settings"
+msgstr "Configurações de Atualizador"
+
+#: usr/local/www/system_firmware.php:242
+#: usr/local/www/system_firmware_auto.php:83
+#: usr/local/www/system_firmware_check.php:70
+#: usr/local/www/system_firmware_settings.php:114
+#: usr/local/www/system_firmware_restorefullbackup.php:129
+#: usr/local/www/system_firmware.php:249
+#: usr/local/www/system_firmware_settings.php:119
+#: usr/local/www/system_firmware.php:252
+#: usr/local/www/system_firmware_check.php:68
+#: usr/local/www/system_firmware_settings.php:121
+#: usr/local/www/system_firmware_auto.php:84
+msgid "Restore Full Backup"
+msgstr "Restaura o backup compelto"
+
+#: usr/local/www/system_firmware.php:252 usr/local/www/system_firmware.php:259
+#: usr/local/www/system_firmware.php:262
+msgid "Invoke"
+msgstr "Invocar"
+
+#: usr/local/www/system_firmware.php:252 usr/local/www/system_firmware.php:259
+#: usr/local/www/system_firmware.php:262
+msgid "Manual Upgrade"
+msgstr "Atualização Manual"
+
+#: usr/local/www/system_firmware.php:259 usr/local/www/system_firmware.php:266
+#: usr/local/www/system_firmware.php:269
+msgid "Enable firmware upload"
+msgstr "Habilitar carregamento de firmware"
+
+#: usr/local/www/system_firmware.php:261 usr/local/www/system_firmware.php:268
+#: usr/local/www/system_firmware.php:271
+#, php-format
+msgid "Click \"Enable firmware upload\" to begin."
+msgstr "Clique em \"Habilitar atualização de firmware\" para começar."
+
+#: usr/local/www/system_firmware.php:264 usr/local/www/system_firmware.php:271
+#: usr/local/www/system_firmware.php:274
+msgid "Disable firmware upload"
+msgstr "Desabilitar carregamento de firmware"
+
+#: usr/local/www/system_firmware.php:282 usr/local/www/system_firmware.php:289
+#: usr/local/www/system_firmware.php:292
+msgid "Please select kernel type"
+msgstr "Por favor, selecione o tipo de kernel"
+
+#: usr/local/www/system_firmware.php:284 usr/local/www/system_firmware.php:55
+msgid "Multiprocessor kernel"
+msgstr "Kernel Multiprocessador"
+
+#: usr/local/www/system_firmware.php:285 usr/local/www/system_firmware.php:56
+msgid "Uniprocessor kernel"
+msgstr "Kernel Uniprocessador"
+
+#: usr/local/www/system_firmware.php:286 usr/local/www/system_firmware.php:57
+msgid "Embedded kernel"
+msgstr "Kernel embutido"
+
+#: usr/local/www/system_firmware.php:287 usr/local/www/system_firmware.php:58
+msgid "Developers kernel"
+msgstr "Kernel de desenvolvedores"
+
+#: usr/local/www/system_firmware.php:298
+#: usr/local/www/system_firmware_check.php:103
+#: usr/local/www/system_firmware.php:304 usr/local/www/system_firmware.php:303
+#: usr/local/www/system_firmware_check.php:104
+#: usr/local/www/system_firmware_check.php:98
+msgid "Perform full backup prior to upgrade"
+msgstr "Realizar backup completo antes da atualização"
+
+#: usr/local/www/system_firmware.php:300 usr/local/www/system_firmware.php:306
+msgid "Upgrade firmware"
+msgstr "Atualizar firmware"
+
+#: usr/local/www/system_firmware.php:301 usr/local/www/system_firmware.php:307
+msgid "Click \"Upgrade firmware\" to start the upgrade process."
+msgstr "Clique em \"Atualizar firmware\" para iniciar o processo de atualização."
+
+#: usr/local/www/system_firmware.php:303 usr/local/www/system_firmware.php:309
+msgid "You must reboot the system before you can upgrade the firmware."
+msgstr "Você deve reiniciar o sistema antes que possa atualizar o firmware."
+
+#: usr/local/www/system_firmware.php:316 usr/local/www/system_firmware.php:322
+#: usr/local/www/system_firmware.php:320
+msgid "Warning:"
+msgstr "Advertência:"
+
+#: usr/local/www/system_firmware.php:319 usr/local/www/system_firmware.php:325
+#: usr/local/www/system_firmware.php:323
+msgid "DO NOT abort the firmware upgrade once it has started. The firewall will reboot automatically after storing the new firmware. The configuration will be maintained."
+msgstr "NÃO aborde a atualização do firmware uma vez que a iniciou. O firewall irá reiniciar automaticamente após armazenar um novo firmware. A configuração será mantida."
+
+#: usr/local/www/system_firmware_auto.php:115
+#: usr/local/www/system_firmware_auto.php:113
+msgid "Beginning firmware upgrade"
+msgstr "Iniciando atualização de firmware"
+
+#: usr/local/www/system_firmware_auto.php:133
+#: usr/local/www/system_firmware_auto.php:135
+#: usr/local/www/system_firmware_auto.php:131
+msgid "Downloading current version information"
+msgstr "Fazendo download de informações da versão atual"
+
+#: usr/local/www/system_firmware_auto.php:148
+#: usr/local/www/system_firmware_auto.php:157
+#: usr/local/www/system_firmware_check.php:141
+#: usr/local/www/system_firmware_check.php:143
+#: usr/local/www/system_firmware_auto.php:150
+#: usr/local/www/system_firmware_auto.php:159
+#: usr/local/www/system_firmware_check.php:135
+#: usr/local/www/system_firmware_auto.php:146
+#: usr/local/www/system_firmware_auto.php:155
+msgid "Unable to check for updates."
+msgstr "Desabilitar verificações por atualizações."
+
+#: usr/local/www/system_firmware_auto.php:162
+#: usr/local/www/system_firmware_auto.php:164
+#: usr/local/www/system_firmware_auto.php:160
+msgid "Downloading updates"
+msgstr "Baixando atualizações"
+
+#: usr/local/www/system_firmware_auto.php:172
+#: usr/local/www/system_firmware_auto.php:174
+#: usr/local/www/system_firmware_auto.php:170
+msgid "download complete."
+msgstr "download completo."
+
+#: usr/local/www/system_firmware_auto.php:174
+#: usr/local/www/system_firmware_check.php:159
+#: usr/local/www/system_firmware_check.php:161
+#: usr/local/www/system_firmware_auto.php:176
+#: usr/local/www/system_firmware_check.php:153
+#: usr/local/www/system_firmware_auto.php:172
+msgid "You are on the latest version."
+msgstr "Você possui a última versão."
+
+#: usr/local/www/system_firmware_auto.php:214
+#: usr/local/www/system_firmware_auto.php:216
+#: usr/local/www/system_firmware_auto.php:212
+msgid "Update cannot continue. You can disable this check on the Updater Settings tab."
+msgstr "A atualização não pode continuar. Você pode desabilitar esta verificação na aba Configurações de Atualização. "
+
+#: usr/local/www/system_firmware_auto.php:219
+#: usr/local/www/system_firmware_auto.php:221
+#: usr/local/www/system_firmware_auto.php:217
+msgid "Upgrade Image does not contain a signature but the system has been configured to allow unsigned images. One moment please..."
+msgstr "A imagem de atualização não possui uma assinatura, porém o sistema pode ser configurado para permiti-las. Um momento por favor..."
+
+#: usr/local/www/system_firmware_auto.php:224
+#: usr/local/www/system_firmware_auto.php:226
+#: usr/local/www/system_firmware_auto.php:222
+msgid "Update cannot continue"
+msgstr "Atualização não pode continuar"
+
+#: usr/local/www/system_firmware_auto.php:235
+#: usr/local/www/system_firmware_auto.php:237
+#: usr/local/www/system_firmware_auto.php:233
+msgid "Downloading complete but sha256 does not match."
+msgstr "Download completo mas sha256 não corresponde."
+
+#: usr/local/www/system_firmware_auto.php:236
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:234
+msgid "Auto upgrade aborted."
+msgstr "Auto-atualização abortada."
+
+#: usr/local/www/system_firmware_auto.php:236
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:234
+msgid "Downloaded SHA256"
+msgstr "Download de SHA256 feito"
+
+#: usr/local/www/system_firmware_auto.php:236
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:234
+msgid "Needed SHA256"
+msgstr "SHA256 necessário"
+
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:240
+#: usr/local/www/system_firmware_auto.php:236
+msgid "is now upgrading."
+msgstr "está agora atualizando."
+
+#: usr/local/www/system_firmware_auto.php:238
+#: usr/local/www/system_firmware_auto.php:240
+#: usr/local/www/system_firmware_auto.php:236
+msgid "The firewall will reboot once the operation is completed."
+msgstr "O firewall irá reiniciar uma vez que a operação estiver completa."
+
+#: usr/local/www/system_firmware_auto.php:256
+#: usr/local/www/system_firmware_auto.php:258
+msgid "Auto Update Download Status"
+msgstr "Status de Download de Auto-Atualização"
+
+#: usr/local/www/system_firmware_auto.php:258
+#: usr/local/www/system_firmware_auto.php:260
+msgid "Current Version"
+msgstr "Versão Atual"
+
+#: usr/local/www/system_firmware_auto.php:259
+#: usr/local/www/system_firmware_auto.php:261
+msgid "Latest Version"
+msgstr "Última Versão"
+
+#: usr/local/www/system_firmware_auto.php:260
+#: usr/local/www/system_firmware_auto.php:262
+msgid "File size"
+msgstr "Tamanho do arquivo"
+
+#: usr/local/www/system_firmware_auto.php:261
+#: usr/local/www/system_firmware_auto.php:263
+msgid "Downloaded"
+msgstr "Baixado"
+
+#: usr/local/www/system_firmware_auto.php:262
+#: usr/local/www/system_firmware_auto.php:264
+msgid "Percent"
+msgstr "Por cento"
+
+#: usr/local/www/system_firmware_check.php:107
+#: usr/local/www/system_firmware_check.php:109
+#: usr/local/www/system_firmware_check.php:101
+msgid "Invoke Auto Upgrade"
+msgstr "Invocar Auto-Atualização"
+
+#: usr/local/www/system_firmware_check.php:125
+#: usr/local/www/system_firmware_check.php:127
+#: usr/local/www/system_firmware_check.php:119
+msgid "Downloading new version information..."
+msgstr "Fazendo download de informações de nova versão..."
+
+#: usr/local/www/system_firmware_check.php:143
+#: usr/local/www/system_firmware_check.php:145
+#: usr/local/www/system_firmware_check.php:137
+msgid "Could not contact custom update server."
+msgstr "Não pode contactar servidor de atualização personalizado."
+
+#: usr/local/www/system_firmware_check.php:145
+#: usr/local/www/system_firmware_check.php:147
+#: usr/local/www/system_firmware_check.php:139
+#, php-format
+msgid "Could not contact %1$s update server %2$s%3$s"
+msgstr "Não pode contactar o servidor de atualização %1$s %2$s%3$s"
+
+#: usr/local/www/system_firmware_check.php:147
+#: usr/local/www/system_firmware_check.php:149
+#: usr/local/www/system_firmware_check.php:141
+msgid "Obtaining current version information..."
+msgstr "Obtendo informações da versão atual..."
+
+#: usr/local/www/system_firmware_check.php:172
+#: usr/local/www/system_firmware_check.php:174
+#: usr/local/www/system_firmware_check.php:178
+msgid "A new version is now available"
+msgstr "Uma nova versão está disponível agora"
+
+#: usr/local/www/system_firmware_check.php:173
+#: usr/local/www/system_firmware_check.php:175
+#: usr/local/www/system_firmware_check.php:179
+msgid "Current version"
+msgstr "Versão atual"
+
+#: usr/local/www/system_firmware_check.php:175
+#: usr/local/www/system_firmware_check.php:177
+#: usr/local/www/system_firmware_check.php:181
+msgid "NanoBSD Size"
+msgstr "Tamanho do NanoBSD"
+
+#: usr/local/www/system_firmware_check.php:177
+#: usr/local/www/system_firmware_check.php:179
+#: usr/local/www/system_firmware_check.php:183
+msgid "Built On"
+msgstr "Construído em"
+
+#: usr/local/www/system_firmware_check.php:178
+#: usr/local/www/system_firmware_check.php:180
+#: usr/local/www/system_firmware_check.php:184
+msgid "New version"
+msgstr "Nova versão"
+
+#: usr/local/www/system_firmware_check.php:179
+#: usr/local/www/system_firmware_check.php:181
+#: usr/local/www/system_firmware_check.php:185
+msgid "Update source"
+msgstr "Fonte de atualização"
+
+#: usr/local/www/system_firmware_settings.php:122
+#: usr/local/www/system_firmware_settings.php:127
+#: usr/local/www/system_firmware_settings.php:129
+msgid "Firmware Branch"
+msgstr "Firmware Branch"
+
+#: usr/local/www/system_firmware_settings.php:126
+#: usr/local/www/system_firmware_settings.php:131
+#: usr/local/www/system_firmware_settings.php:133
+msgid "Default Auto Update URLs"
+msgstr "URLs de Auto Atualização Padrão"
+
+#: usr/local/www/system_firmware_settings.php:142
+#: usr/local/www/system_firmware_settings.php:147
+#: usr/local/www/system_firmware_settings.php:156
+#: usr/local/www/system_firmware_settings.php:158
+msgid "Firmware Auto Update URL"
+msgstr "URL de Auto Atualização de Firmware"
+
+#: usr/local/www/system_firmware_settings.php:144
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/system_firmware_settings.php:158
+#: usr/local/www/system_firmware_settings.php:160
+msgid "Use a URL server for firmware upgrades other than"
+msgstr "Use um servidor de URL para atualização de firmware que não "
+
+#: usr/local/www/system_firmware_settings.php:146
+#: usr/local/www/pkg_mgr_settings.php:109
+#: usr/local/www/system_firmware_settings.php:151
+#: usr/local/www/system_firmware_settings.php:160
+#: usr/local/www/system_firmware_settings.php:162
+#: usr/local/www/pkg_mgr_settings.php:108
+msgid "Base URL:"
+msgstr "URL Base:"
+
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/system_firmware_settings.php:154
+#: usr/local/www/system_firmware_settings.php:163
+#: usr/local/www/system_firmware_settings.php:165
+msgid "This is where"
+msgstr "Isso é onde"
+
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/system_firmware_settings.php:154
+#: usr/local/www/system_firmware_settings.php:163
+#: usr/local/www/system_firmware_settings.php:165
+msgid "will check for newer firmware versions when the"
+msgstr "irá verificar versões mais novas de firmware quando o "
+
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/system_firmware_settings.php:154
+#: usr/local/www/system_firmware_settings.php:163
+#: usr/local/www/system_firmware_settings.php:165
+msgid "System: Firmware: Auto Update"
+msgstr "Sistema: Firmware: Auto-Atualização"
+
+#: usr/local/www/system_firmware_settings.php:149
+#: usr/local/www/pkg_mgr_settings.php:112
+#: usr/local/www/system_firmware_settings.php:154
+#: usr/local/www/system_firmware_settings.php:163
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/pkg_mgr_settings.php:111
+msgid "page is viewed."
+msgstr "página é visualizada."
+
+#: usr/local/www/system_firmware_settings.php:151
+#: usr/local/www/system_firmware_settings.php:156
+#: usr/local/www/system_firmware_settings.php:165
+#: usr/local/www/system_firmware_settings.php:167
+#, php-format
+msgid "When a custom URL is enabled, the system will not verify the digital signature from %s."
+msgstr "Quando uma URL personalizada estiver habilitada, o sistema não verificará a assinatura digital de %s."
+
+#: usr/local/www/system_firmware_settings.php:159
+#: usr/local/www/system_firmware_settings.php:164
+#: usr/local/www/system_firmware_settings.php:173
+#: usr/local/www/system_firmware_settings.php:175
+msgid "Updates"
+msgstr "Atualizações"
+
+#: usr/local/www/system_firmware_settings.php:162
+#: usr/local/www/system_firmware_settings.php:167
+#: usr/local/www/system_firmware_settings.php:176
+#: usr/local/www/system_firmware_settings.php:178
+msgid "Unsigned images"
+msgstr "Imagens não assinadas"
+
+#: usr/local/www/system_firmware_settings.php:166
+#: usr/local/www/system_firmware_settings.php:171
+#: usr/local/www/system_firmware_settings.php:180
+#: usr/local/www/system_firmware_settings.php:182
+msgid "Allow auto-update firmware images with a missing or invalid digital signature to be used."
+msgstr "Permitir atualizar automaticamente imagens de firmware sem assinatura digital ou com assinatura inválida."
+
+#: usr/local/www/system_firmware_settings.php:174
+#: usr/local/www/system_firmware_settings.php:187
+#: usr/local/www/system_firmware_settings.php:196
+#: usr/local/www/system_firmware_settings.php:198
+msgid "Gitsync"
+msgstr "Gitsync"
+
+#: usr/local/www/system_firmware_settings.php:177
+#: usr/local/www/system_firmware_settings.php:190
+#: usr/local/www/system_firmware_settings.php:199
+#: usr/local/www/system_firmware_settings.php:201
+msgid "Auto sync on update"
+msgstr "Auto sincronização na atualização"
+
+#: usr/local/www/system_firmware_settings.php:181
+#: usr/local/www/system_firmware_settings.php:194
+#: usr/local/www/system_firmware_settings.php:203
+#: usr/local/www/system_firmware_settings.php:205
+msgid "After updating, sync with the following repository/branch before reboot."
+msgstr "Após atualizar, sincronize com o seguinte repositório/ramo antes de reiniciar."
+
+#: usr/local/www/system_firmware_settings.php:193
+#: usr/local/www/system_firmware_settings.php:206
+#: usr/local/www/system_firmware_settings.php:215
+#: usr/local/www/system_firmware_settings.php:217
+msgid "Repository URL"
+msgstr "URL do repositório"
+
+#: usr/local/www/system_firmware_settings.php:198
+#: usr/local/www/system_firmware_settings.php:211
+#: usr/local/www/system_firmware_settings.php:220
+#: usr/local/www/system_firmware_settings.php:222
+#, php-format
+msgid "The most recently used repository was %s"
+msgstr "O repositório mais recentemente utilizado foi %s"
+
+#: usr/local/www/system_firmware_settings.php:200
+#: usr/local/www/system_firmware_settings.php:213
+#: usr/local/www/system_firmware_settings.php:222
+#: usr/local/www/system_firmware_settings.php:224
+msgid "This will be used if the field is left blank."
+msgstr "Isto será usado se o campo for deixado em branco."
+
+#: usr/local/www/system_firmware_settings.php:219
+#: usr/local/www/system_firmware_settings.php:232
+#: usr/local/www/system_firmware_settings.php:241
+#: usr/local/www/system_firmware_settings.php:243
+msgid "Branch name"
+msgstr "Nome do ramo"
+
+#: usr/local/www/system_firmware_settings.php:224
+#: usr/local/www/system_firmware_settings.php:237
+#: usr/local/www/system_firmware_settings.php:246
+#: usr/local/www/system_firmware_settings.php:248
+#, php-format
+msgid "The most recently used branch was %s"
+msgstr "O branch mais recentemente utilizado foi %s"
+
+#: usr/local/www/system_firmware_settings.php:227
+#: usr/local/www/system_firmware_settings.php:240
+#: usr/local/www/system_firmware_settings.php:249
+#: usr/local/www/system_firmware_settings.php:251
+msgid "Usually the branch name is master"
+msgstr "Normalmente o nome do branch é master"
+
+#: usr/local/www/system_firmware_settings.php:230
+#: usr/local/www/system_firmware_settings.php:243
+#: usr/local/www/system_firmware_settings.php:252
+#: usr/local/www/system_firmware_settings.php:254
+msgid "Note: Sync will not be performed if a branch is not specified."
+msgstr "Nota: A sincronização não será realizada se um branch não for especificado."
+
+#: usr/local/www/system_routes.php:52 usr/local/www/system_routes.php:94
+#: usr/local/www/system_routes_edit.php:165
+#: usr/local/www/system_routes_edit.php:198 usr/local/www/system_routes.php:98
+#: usr/local/www/system_routes_edit.php:227
+#: usr/local/www/system_routes.php:113
+#: usr/local/www/system_routes_edit.php:229
+#: usr/local/www/system_routes_edit.php:231
+msgid "Static Routes"
+msgstr "Rotas Estáticas"
+
+#: usr/local/www/system_routes.php:83
+msgid "removed route to"
+msgstr "removida a rota para"
+
+#: usr/local/www/system_routes.php:107 usr/local/www/system_routes.php:111
+#: usr/local/www/system_routes.php:126
+#, php-format
+msgid "The static route configuration has been changed.%sYou must apply the changes in order for them to take effect."
+msgstr "A configuração da rota estática foi modificada.%sVocê deve aplicar as mudanças para que tenham efeito."
+
+#: usr/local/www/system_routes.php:115 usr/local/www/fbegin.inc:159
+#: usr/local/www/status_gateway_groups.php:64
+#: usr/local/www/status_gateway_groups.php:75
+#: usr/local/www/status_gateways.php:51 usr/local/www/status_gateways.php:62
+#: usr/local/www/system_gateway_groups.php:108
+#: usr/local/www/system_gateway_groups.php:121
+#: usr/local/www/system_gateway_groups_edit.php:142
+#: usr/local/www/system_gateways.php:120 usr/local/www/system_gateways.php:141
+#: usr/local/www/system_gateways_edit.php:313
+#: usr/local/www/diag_logs_routing.php:83
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/fbegin.inc:176 usr/local/www/diag_logs_resolver.php:97
+#: usr/local/www/diag_logs.php:96 usr/local/www/system_gateways_edit.php:319
+#: usr/local/www/diag_logs_wireless.php:85
+#: usr/local/www/diag_logs_gateways.php:66
+#: usr/local/www/diag_logs_gateways.php:97
+#: usr/local/www/diag_logs_routing.php:84
+#: usr/local/www/system_gateway_groups_edit.php:146
+#: usr/local/www/fbegin.inc:184 usr/local/www/diag_logs_resolver.php:98
+#: usr/local/www/system_gateway_groups.php:109
+#: usr/local/www/system_gateway_groups.php:122
+#: usr/local/www/system_gateways_edit.php:425
+#: usr/local/www/status_gateways.php:63
+#: usr/local/www/diag_logs_wireless.php:86
+#: usr/local/www/diag_logs_gateways.php:98
+#: usr/local/www/status_gateway_groups.php:65
+#: usr/local/www/status_gateway_groups.php:76
+#: usr/local/www/system_routes.php:119 usr/local/www/fbegin.inc:175
+#: usr/local/www/system_gateway_groups_edit.php:150
+#: usr/local/www/system_gateway_groups.php:118
+#: usr/local/www/system_gateway_groups.php:131
+#: usr/local/www/system_gateways_edit.php:455
+#: usr/local/www/system_routes.php:134
+msgid "Gateways"
+msgstr "Gateways"
+
+#: usr/local/www/system_routes.php:116 usr/local/www/fbegin.inc:204
+#: usr/local/www/system_gateway_groups.php:109
+#: usr/local/www/system_gateways.php:142 usr/local/www/fbegin.inc:222
+#: usr/local/www/fbegin.inc:230 usr/local/www/system_gateway_groups.php:110
+#: usr/local/www/system_routes.php:120
+#: usr/local/www/system_gateway_groups.php:119
+#: usr/local/www/system_routes.php:135
+msgid "Routes"
+msgstr "Rotas"
+
+#: usr/local/www/system_routes.php:161 usr/local/www/system_routes.php:172
+#: usr/local/www/system_routes.php:176 usr/local/www/system_routes.php:192
+msgid "Do you really want to delete this route?"
+msgstr "Você realmente deseja apagar essa rota?"
+
+#: usr/local/www/system_routes.php:188 usr/local/www/system_routes.php:199
+#: usr/local/www/system_routes.php:203 usr/local/www/system_routes.php:219
+msgid "Do not enter static routes for networks assigned on any interface of this firewall. Static routes are only used for networks reachable via a different router, and not reachable via your default gateway."
+msgstr "Não informe rotas estáticas para redes atribuídas a qualquer interface desse firewall. Rotas estáticas são somente usadas em redes alcançáveis através de um roteador diferente, e não alcançáveis através de seu gateway padrão."
+
+#: usr/local/www/system_routes_edit.php:89
+#: usr/local/www/system_routes_edit.php:179
+#: usr/local/www/system_routes_edit.php:90
+#: usr/local/www/system_routes_edit.php:216
+#: usr/local/www/system_routes_edit.php:217
+#: usr/local/www/system_routes_edit.php:93
+#: usr/local/www/system_routes_edit.php:244
+#: usr/local/www/system_routes_edit.php:246
+#: usr/local/www/system_routes_edit.php:95
+#: usr/local/www/system_routes_edit.php:248
+msgid "Destination network"
+msgstr "Rede de destino"
+
+#: usr/local/www/system_routes_edit.php:90
+#: usr/local/www/system_routes_edit.php:91
+#: usr/local/www/system_routes_edit.php:94
+#: usr/local/www/system_routes_edit.php:96
+msgid "Destination network bit count"
+msgstr "Contagem de bits de rede de destino"
+
+#: usr/local/www/system_routes_edit.php:96
+#: usr/local/www/system_routes_edit.php:97
+#: usr/local/www/system_routes_edit.php:100
+#: usr/local/www/system_routes_edit.php:102
+msgid "A valid IPv4 or IPv6 destination network must be specified."
+msgstr "Uma rede de destino IPV4 ou IPV6 válida deve ser especificada."
+
+#: usr/local/www/system_routes_edit.php:99
+#: usr/local/www/system_routes_edit.php:100
+#: usr/local/www/system_routes_edit.php:103
+#: usr/local/www/system_routes_edit.php:105
+msgid "A valid destination network bit count must be specified."
+msgstr "Um contador de bits de rede de destino deve ser especificado."
+
+#: usr/local/www/system_routes_edit.php:114
+#: usr/local/www/system_routes_edit.php:118
+#: usr/local/www/system_routes_edit.php:121
+#: usr/local/www/system_routes_edit.php:123
+msgid "A IPv4 subnet can not be over 32 bits."
+msgstr "Uma subrede IPv4 não pode ser superior a 32bits."
+
+#: usr/local/www/system_routes_edit.php:123
+msgid "A route to this destination network already exists."
+msgstr "Uma rota para essa rede de destino já existe."
+
+#: usr/local/www/system_routes_edit.php:165
+#: usr/local/www/system_routes_edit.php:198
+#: usr/local/www/system_routes_edit.php:227
+#: usr/local/www/system_routes_edit.php:229
+#: usr/local/www/system_routes_edit.php:231
+msgid "Edit route"
+msgstr "Editar rota"
+
+#: usr/local/www/system_routes_edit.php:176
+#: usr/local/www/system_routes_edit.php:213
+#: usr/local/www/system_routes_edit.php:214
+#: usr/local/www/system_routes_edit.php:241
+#: usr/local/www/system_routes_edit.php:243
+#: usr/local/www/system_routes_edit.php:245
+msgid "Edit route entry"
+msgstr "Editar entrada de rota"
+
+#: usr/local/www/system_routes_edit.php:196
+#: usr/local/www/system_routes_edit.php:228
+#: usr/local/www/system_routes_edit.php:229
+#: usr/local/www/system_routes_edit.php:256
+#: usr/local/www/system_routes_edit.php:257
+#: usr/local/www/system_routes_edit.php:259
+msgid "Destination network for this static route"
+msgstr "Rede de destino para essa rota estática"
+
+#: usr/local/www/system_routes_edit.php:212
+#: usr/local/www/system_routes_edit.php:244
+#: usr/local/www/system_routes_edit.php:245
+#: usr/local/www/system_routes_edit.php:272
+#: usr/local/www/system_routes_edit.php:274
+#: usr/local/www/system_routes_edit.php:276
+msgid "Choose which gateway this route applies to or"
+msgstr "Escolha em qual gateway essa rota se aplica ou "
+
+#: usr/local/www/system_routes_edit.php:228
+#: usr/local/www/system_routes_edit.php:260
+#: usr/local/www/system_routes_edit.php:261
+#: usr/local/www/system_routes_edit.php:287
+#: usr/local/www/system_routes_edit.php:291
+#: usr/local/www/system_routes_edit.php:293
+msgid "Default gateway:"
+msgstr "Gateway padrão:"
+
+#: usr/local/www/system_routes_edit.php:231
+#: usr/local/www/system_routes_edit.php:263
+#: usr/local/www/system_routes_edit.php:264
+#: usr/local/www/system_routes_edit.php:290
+#: usr/local/www/system_routes_edit.php:294
+#: usr/local/www/system_routes_edit.php:296
+msgid "Interface:"
+msgstr "Interface:"
+
+#: usr/local/www/system_routes_edit.php:243
+#: usr/local/www/system_routes_edit.php:275
+#: usr/local/www/system_routes_edit.php:276
+#: usr/local/www/system_routes_edit.php:302
+#: usr/local/www/system_routes_edit.php:308
+#: usr/local/www/system_routes_edit.php:310
+msgid "Gateway IP:"
+msgstr "IP do Gateway:"
+
+#: usr/local/www/system_routes_edit.php:334
+#: usr/local/www/system_routes_edit.php:374
+#: usr/local/www/system_routes_edit.php:375
+#: usr/local/www/system_routes_edit.php:399
+#: usr/local/www/system_routes_edit.php:409
+#: usr/local/www/system_routes_edit.php:411
+#, php-format
+msgid "You can manage Gateways %shere%s."
+msgstr "Você pode gerenciar Gateways %saqui%s."
+
+#: usr/local/www/system_routes_edit.php:337
+#: usr/local/www/system_routes_edit.php:377
+#: usr/local/www/system_routes_edit.php:378
+#: usr/local/www/system_routes_edit.php:402
+#: usr/local/www/system_routes_edit.php:412
+#: usr/local/www/system_routes_edit.php:414
+msgid "Sorry, we could not create your gateway at this time."
+msgstr "Lamento, não pudemos criar seu gateway dessa vez."
+
+#: usr/local/www/diag_logs_filter_summary.php:34
+msgid "Firewall Log Summary"
+msgstr "Resumo de Log do Firewall"
+
+#: usr/local/www/diag_logs_filter_summary.php:45
+#: usr/local/www/load_balancer_relay_protocol_edit.php:230
+#: usr/local/www/load_balancer_relay_protocol_edit.php:228
+#: usr/local/www/diag_logs_filter_summary.php:46
+msgid "Actions"
+msgstr "Ações"
+
+#: usr/local/www/diag_logs_filter_summary.php:47
+#: usr/local/www/diag_logs_filter_summary.php:48
+msgid "Protocols"
+msgstr "Protocolos"
+
+#: usr/local/www/diag_logs_filter_summary.php:48
+#: usr/local/www/diag_logs_filter_summary.php:49
+msgid "Source IPs"
+msgstr "IPs de Origem"
+
+#: usr/local/www/diag_logs_filter_summary.php:49
+#: usr/local/www/diag_logs_filter_summary.php:50
+msgid "Destination IPs"
+msgstr "IPs de Destino"
+
+#: usr/local/www/diag_logs_filter_summary.php:50
+#: usr/local/www/diag_logs_filter_summary.php:51
+msgid "Source Ports"
+msgstr "Portas de Origem"
+
+#: usr/local/www/diag_logs_filter_summary.php:51
+#: usr/local/www/diag_logs_filter_summary.php:52
+msgid "Destination Ports"
+msgstr "Portas de Destino"
+
+#: usr/local/www/diag_logs_filter_summary.php:71
+#: usr/local/www/diag_logs_filter_summary.php:72
+msgid "data"
+msgstr "dados"
+
+#: usr/local/www/diag_logs_filter_summary.php:208
+#: usr/local/www/diag_logs_filter_summary.php:207
+#, php-format
+msgid "This is a firewall log summary, of the last %1$s lines of the firewall log (Max %2$s)."
+msgstr "Esse é um sumário do log do firewall, das últimas %1$s linhas do log do firewall (Max %2$s)."
+
+#: usr/local/www/diag_logs_filter_summary.php:209
+#: usr/local/www/diag_logs_filter_summary.php:208
+msgid "NOTE: IE8 users must enable compatibility view."
+msgstr "Nota: Usuários do IE8 precisam habilitar o modo de compatibilidade."
+
+#: usr/local/www/uploadconfig.php:48
+msgid "ERR Could not save configuration."
+msgstr "ERRO Não pôde salvar configuração."
+
+#: usr/local/www/uploadconfig.php:54
+msgid "OK"
+msgstr "OK"
+
+#: usr/local/www/uploadconfig.php:57
+msgid "ERR Could not install configuration."
+msgstr "ERRO: Não pôde instalar configuração."
+
+#: usr/local/www/uploadconfig.php:60
+msgid "ERR Invalid configuration received."
+msgstr "ERRO Configuração inválida recebida."
+
+#: usr/local/www/vpn_ipsec.php:134 usr/local/www/vpn_ipsec_keys.php:86
+#: usr/local/www/vpn_ipsec_mobile.php:303 usr/local/www/vpn_ipsec.php:133
+#: usr/local/www/vpn_ipsec_mobile.php:330 usr/local/www/vpn_ipsec_keys.php:85
+#: usr/local/www/vpn_ipsec.php:139
+msgid "The IPsec tunnel configuration has been changed"
+msgstr "A configuração de túnvel IPsec foi modificada"
+
+#: usr/local/www/vpn_ipsec.php:141 usr/local/www/vpn_ipsec_keys.php:93
+#: usr/local/www/vpn_ipsec_mobile.php:318
+#: usr/local/www/vpn_ipsec_phase1.php:497
+#: usr/local/www/vpn_ipsec_phase2.php:381
+#: usr/local/www/vpn_ipsec_phase2.php:407 usr/local/www/vpn_ipsec.php:140
+#: usr/local/www/vpn_ipsec_mobile.php:345 usr/local/www/vpn_ipsec_keys.php:92
+#: usr/local/www/vpn_ipsec_phase2.php:473
+#: usr/local/www/vpn_ipsec_phase1.php:496 usr/local/www/vpn_ipsec.php:146
+#: usr/local/www/vpn_ipsec_phase1.php:517
+#: usr/local/www/vpn_ipsec_phase2.php:495
+msgid "Tunnels"
+msgstr "Túneis"
+
+#: usr/local/www/vpn_ipsec.php:142 usr/local/www/vpn_ipsec_keys.php:94
+#: usr/local/www/vpn_ipsec_mobile.php:319
+#: usr/local/www/vpn_ipsec_phase1.php:498
+#: usr/local/www/vpn_ipsec_phase2.php:382
+#: usr/local/www/vpn_ipsec_phase2.php:408 usr/local/www/vpn_ipsec.php:141
+#: usr/local/www/vpn_ipsec_mobile.php:346 usr/local/www/vpn_ipsec_keys.php:93
+#: usr/local/www/vpn_ipsec_phase2.php:474
+#: usr/local/www/vpn_ipsec_phase1.php:497 usr/local/www/vpn_ipsec.php:147
+#: usr/local/www/vpn_ipsec_phase1.php:518
+#: usr/local/www/vpn_ipsec_phase2.php:496
+msgid "Mobile clients"
+msgstr "Clientes móveis"
+
+#: usr/local/www/vpn_ipsec.php:143 usr/local/www/vpn_ipsec_keys.php:95
+#: usr/local/www/vpn_ipsec_mobile.php:320
+#: usr/local/www/vpn_ipsec_phase1.php:499
+#: usr/local/www/vpn_ipsec_phase2.php:383
+#: usr/local/www/vpn_ipsec_phase2.php:409
+msgid "Pre-shared keys"
+msgstr "Chaves pre-compartilhadas"
+
+#: usr/local/www/vpn_ipsec.php:160 usr/local/www/vpn_ipsec.php:159
+#: usr/local/www/vpn_ipsec.php:165
+msgid "Enable IPsec"
+msgstr "Habilitar IPsec"
+
+#: usr/local/www/vpn_ipsec.php:221 usr/local/www/vpn_ipsec.php:351
+#: usr/local/www/vpn_ipsec_phase2.php:552 usr/local/www/vpn_ipsec.php:232
+#: usr/local/www/vpn_ipsec.php:362 usr/local/www/vpn_ipsec_phase2.php:578
+#: usr/local/www/vpn_ipsec.php:231 usr/local/www/vpn_ipsec.php:361
+#: usr/local/www/vpn_ipsec_phase2.php:680 usr/local/www/vpn_ipsec.php:237
+#: usr/local/www/vpn_ipsec.php:367 usr/local/www/vpn_ipsec_phase2.php:701
+msgid "auto"
+msgstr "auto"
+
+#: usr/local/www/vpn_ipsec.php:223 usr/local/www/vpn_ipsec.php:353
+#: usr/local/www/system_camanager.php:465
+#: usr/local/www/system_certmanager.php:578
+#: usr/local/www/vpn_ipsec_phase2.php:563
+#: usr/local/www/vpn_openvpn_server.php:864 usr/local/www/vpn_ipsec.php:234
+#: usr/local/www/vpn_ipsec.php:364 usr/local/www/system_certmanager.php:677
+#: usr/local/www/vpn_openvpn_server.php:937
+#: usr/local/www/system_camanager.php:466
+#: usr/local/www/vpn_ipsec_phase2.php:589 usr/local/www/vpn_ipsec.php:233
+#: usr/local/www/vpn_ipsec.php:363 usr/local/www/vpn_openvpn_server.php:965
+#: usr/local/www/vpn_ipsec_phase2.php:691
+#: usr/local/www/system_camanager.php:473 usr/local/www/vpn_ipsec.php:239
+#: usr/local/www/vpn_ipsec.php:369 usr/local/www/system_certmanager.php:686
+#: usr/local/www/vpn_openvpn_server.php:992
+#: usr/local/www/vpn_ipsec_phase2.php:712
+#: usr/local/www/system_certmanager.php:687
+msgid "bits"
+msgstr "bits"
+
+#: usr/local/www/vpn_ipsec.php:243 usr/local/www/vpn_ipsec.php:254
+#: usr/local/www/vpn_ipsec.php:253 usr/local/www/vpn_ipsec.php:259
+msgid "edit phase1 entry"
+msgstr "editar entrada de fase 1"
+
+#: usr/local/www/vpn_ipsec.php:247 usr/local/www/vpn_ipsec.php:258
+#: usr/local/www/vpn_ipsec.php:257 usr/local/www/vpn_ipsec.php:263
+msgid "Do you really want to delete this phase1 and all associated phase2 entries?"
+msgstr "Você realmente deseja apagar essa fase 1 e todas as entradas de fase 2 associadas?"
+
+#: usr/local/www/vpn_ipsec.php:248 usr/local/www/vpn_ipsec.php:259
+#: usr/local/www/vpn_ipsec.php:258 usr/local/www/vpn_ipsec.php:264
+msgid "delete phase1 entry"
+msgstr "apagar entrada de fase 1"
+
+#: usr/local/www/vpn_ipsec.php:258 usr/local/www/vpn_ipsec.php:269
+#: usr/local/www/vpn_ipsec.php:268 usr/local/www/vpn_ipsec.php:274
+msgid "copy phase1 entry"
+msgstr "copiar entrada de fase 1"
+
+#: usr/local/www/vpn_ipsec.php:279 usr/local/www/vpn_ipsec.php:290
+#: usr/local/www/vpn_ipsec.php:289 usr/local/www/vpn_ipsec.php:295
+#, php-format
+msgid "Show %s Phase-2 entries"
+msgstr "Exibir entradas de fase 2 %s"
+
+#: usr/local/www/vpn_ipsec.php:285 usr/local/www/vpn_ipsec.php:296
+#: usr/local/www/vpn_ipsec.php:295 usr/local/www/vpn_ipsec.php:301
+msgid "Local Subnet"
+msgstr "Subrede Local"
+
+#: usr/local/www/vpn_ipsec.php:286 usr/local/www/vpn_ipsec.php:297
+#: usr/local/www/vpn_ipsec.php:296 usr/local/www/vpn_ipsec.php:302
+msgid "Remote Subnet"
+msgstr "Subrede Remota"
+
+#: usr/local/www/vpn_ipsec.php:288 usr/local/www/vpn_ipsec.php:299
+#: usr/local/www/vpn_ipsec.php:298 usr/local/www/vpn_ipsec.php:304
+msgid "P2 Protocol"
+msgstr "Protocolo da F2"
+
+#: usr/local/www/vpn_ipsec.php:289 usr/local/www/vpn_ipsec.php:300
+#: usr/local/www/vpn_ipsec.php:299 usr/local/www/vpn_ipsec.php:305
+msgid "P2 Transforms"
+msgstr "Transformações da F2"
+
+#: usr/local/www/vpn_ipsec.php:290 usr/local/www/vpn_ipsec.php:301
+#: usr/local/www/vpn_ipsec.php:300 usr/local/www/vpn_ipsec.php:306
+msgid "P2 Auth Methods"
+msgstr "Métodos de Autenticação da F2"
+
+#: usr/local/www/vpn_ipsec.php:293 usr/local/www/vpn_ipsec.php:304
+#: usr/local/www/vpn_ipsec.php:303 usr/local/www/vpn_ipsec.php:309
+msgid "add phase2 entry"
+msgstr "adicionar entrada de fase 2"
+
+#: usr/local/www/vpn_ipsec.php:373 usr/local/www/vpn_ipsec.php:384
+#: usr/local/www/vpn_ipsec.php:383 usr/local/www/vpn_ipsec.php:389
+msgid "edit phase2 entry"
+msgstr "editar entradas de fase 2"
+
+#: usr/local/www/vpn_ipsec.php:375 usr/local/www/vpn_ipsec.php:386
+#: usr/local/www/vpn_ipsec.php:385 usr/local/www/vpn_ipsec.php:391
+msgid "Do you really want to delete this phase2 entry?"
+msgstr "Você realmente deseja apagar essa entrada de fase 2?"
+
+#: usr/local/www/vpn_ipsec.php:376 usr/local/www/vpn_ipsec.php:387
+#: usr/local/www/vpn_ipsec.php:386 usr/local/www/vpn_ipsec.php:392
+msgid "delete phase2 entry"
+msgstr "apagar entrada de fase 2"
+
+#: usr/local/www/vpn_ipsec.php:379 usr/local/www/vpn_ipsec.php:390
+#: usr/local/www/vpn_ipsec.php:389 usr/local/www/vpn_ipsec.php:395
+msgid "add a new Phase 2 based on this one"
+msgstr "adicionar um nova Fase 2 baseada na atual"
+
+#: usr/local/www/vpn_ipsec.php:410 usr/local/www/vpn_ipsec.php:421
+#: usr/local/www/vpn_ipsec.php:420 usr/local/www/vpn_ipsec.php:426
+msgid "add phase1 entry"
+msgstr "adicionar entrada de fase 1"
+
+#: usr/local/www/vpn_ipsec.php:424 usr/local/www/vpn_ipsec.php:435
+#: usr/local/www/vpn_ipsec.php:434 usr/local/www/vpn_ipsec.php:440
+msgid "You can check your IPsec status at"
+msgstr "Você pode verificar seu status do IPsec em"
+
+#: usr/local/www/vpn_ipsec.php:424 usr/local/www/vpn_ipsec.php:435
+#: usr/local/www/vpn_ipsec.php:434 usr/local/www/vpn_ipsec.php:440
+msgid "Status:IPsec"
+msgstr "Status:IPsec"
+
+#: usr/local/www/vpn_ipsec.php:425 usr/local/www/vpn_ipsec.php:436
+#: usr/local/www/vpn_ipsec.php:435 usr/local/www/vpn_ipsec.php:441
+msgid "IPsec Debug Mode can be enabled at"
+msgstr "Modo de Debug do IPsec pode ser habilitado em"
+
+#: usr/local/www/vpn_ipsec.php:425 usr/local/www/vpn_ipsec.php:426
+#: usr/local/www/vpn_ipsec.php:436 usr/local/www/vpn_ipsec.php:437
+#: usr/local/www/vpn_ipsec.php:435 usr/local/www/vpn_ipsec.php:441
+#: usr/local/www/vpn_ipsec.php:442
+msgid "System:Advanced:Miscellaneous"
+msgstr "Sistema:Avançado: Diversos"
+
+#: usr/local/www/vpn_ipsec.php:426 usr/local/www/vpn_ipsec.php:437
+#: usr/local/www/vpn_ipsec.php:436 usr/local/www/vpn_ipsec.php:442
+msgid "IPsec can be set to prefer older SAs at"
+msgstr "IPsec pode ser configurado utilizar os antigos SAs"
+
+#: usr/local/www/vpn_ipsec.php:456 usr/local/www/vpn_ipsec.php:467
+#: usr/local/www/vpn_ipsec.php:466 usr/local/www/vpn_ipsec.php:472
+msgid "Remote Gateway"
+msgstr "Gateway remoto"
+
+#: usr/local/www/vpn_ipsec.php:458 usr/local/www/vpn_ipsec.php:469
+#: usr/local/www/vpn_ipsec.php:468 usr/local/www/vpn_ipsec.php:474
+msgid "P1 Protocol"
+msgstr "Protocolo P1"
+
+#: usr/local/www/vpn_ipsec.php:459 usr/local/www/vpn_ipsec.php:470
+#: usr/local/www/vpn_ipsec.php:469 usr/local/www/vpn_ipsec.php:475
+msgid "P1 Transforms"
+msgstr "Transformações P1"
+
+#: usr/local/www/vpn_ipsec.php:460 usr/local/www/vpn_ipsec.php:471
+#: usr/local/www/vpn_ipsec.php:470 usr/local/www/vpn_ipsec.php:476
+msgid "P1 Description"
+msgstr "Descrição P1"
+
+#: usr/local/www/diag_logs_ppp.php:91 usr/local/www/diag_logs_ppp.php:90
+#: usr/local/www/diag_logs_ppp.php:88
+#, php-format
+msgid "Last %s PPP log entries"
+msgstr "Últimas %s entradas de log PPP"
+
+#: usr/local/www/diag_logs_relayd.php:87 usr/local/www/diag_logs_relayd.php:86
+#, php-format
+msgid "Last %s Load Balancer log entries"
+msgstr "Últimas %s entradas de log no Balanceador de Carga"
+
+#: usr/local/www/graph.php:112
+msgid "In"
+msgstr "Entrada"
+
+#: usr/local/www/graph.php:113
+msgid "Out"
+msgstr "Saída"
+
+#: usr/local/www/graph.php:117
+msgid "Switch to bytes/s"
+msgstr "Alterar para bytes/s"
+
+#: usr/local/www/graph.php:118
+msgid "AutoScale"
+msgstr "Auto Dimensionamento"
+
+#: usr/local/www/graph.php:120
+msgid "Graph shows last"
+msgstr "Gráfico mostra últimos"
+
+#: usr/local/www/graph.php:195
+msgid "Switch to"
+msgstr "Alternar para"
+
+#: usr/local/www/graph.php:201
+msgid "follow"
+msgstr "seguir"
+
+#: usr/local/www/graph.php:361
+msgid "Kbps"
+msgstr "Kbps"
+
+#: usr/local/www/graph.php:363
+msgid "Mbps"
+msgstr "Mbps"
+
+#: usr/local/www/graph.php:365
+msgid "Gbps"
+msgstr "Gbps"
+
+#: usr/local/www/graph.php:371
+msgid "KB/s"
+msgstr "KB/s"
+
+#: usr/local/www/graph.php:373
+msgid "MB/s"
+msgstr "MB/s"
+
+#: usr/local/www/graph.php:375
+msgid "GB/s"
+msgstr "BG/s"
+
+#: usr/local/www/diag_patterns.php:43
+#: usr/local/www/services_captiveportal_filemanager.php:195
+#: usr/local/www/exec.php:290 usr/local/www/exec.php:300
+#: usr/local/www/exec.php:292 usr/local/www/exec.php:302
+#: usr/local/www/services_captiveportal_filemanager.php:192
+msgid "Upload"
+msgstr "Carregar"
+
+#: usr/local/www/diag_patterns.php:46
+msgid "Uploaded file to"
+msgstr "Arquivo carregado em"
+
+#: usr/local/www/diag_patterns.php:49
+msgid "Warning: You must upload a file with .pat extension."
+msgstr "Atenção: Você deve fazer o carregamento de um arquivo com extensão .pat."
+
+#: usr/local/www/diag_patterns.php:58
+msgid "Add layer7 pattern"
+msgstr "Adicionar amostra de camada 7"
+
+#: usr/local/www/diag_patterns.php:69
+msgid "Upload layer7 pattern file"
+msgstr "Upload de arquivo padrão Layer7"
+
+#: usr/local/www/diag_patterns.php:72
+msgid "File to upload:"
+msgstr "Arquivo para carregar:"
+
+#: usr/local/www/diag_patterns.php:80 usr/local/www/diag_patterns.php:43
+msgid "Upload Pattern file"
+msgstr "Enviar arquivo de padrões"
+
+#: usr/local/www/vpn_ipsec_keys.php:64
+msgid "Deleted IPsec Pre-Shared Key"
+msgstr "Chave pré-compartilhada IPsec apagada"
+
+#: usr/local/www/vpn_ipsec_keys.php:71
+msgid "VPN: IPsec: Keys"
+msgstr "VPN: IPsec: Chaves"
+
+#: usr/local/www/vpn_ipsec_keys.php:104
+#: usr/local/www/vpn_ipsec_keys_edit.php:69
+#: usr/local/www/vpn_ipsec_keys_edit.php:128
+#: usr/local/www/vpn_ipsec_keys.php:103
+#: usr/local/www/vpn_ipsec_keys_edit.php:127
+msgid "Identifier"
+msgstr "Identificador"
+
+#: usr/local/www/vpn_ipsec_keys.php:105
+#: usr/local/www/vpn_ipsec_keys_edit.php:69
+#: usr/local/www/vpn_ipsec_keys_edit.php:136
+msgid "Pre-shared key"
+msgstr "Chave pre-compartilhada"
+
+#: usr/local/www/vpn_ipsec_keys.php:110 usr/local/www/vpn_ipsec_keys.php:146
+#: usr/local/www/vpn_ipsec_keys.php:109 usr/local/www/vpn_ipsec_keys.php:145
+msgid "add key"
+msgstr "adicionar chave"
+
+#: usr/local/www/vpn_ipsec_keys.php:123 usr/local/www/vpn_ipsec_keys.php:136
+#: usr/local/www/vpn_ipsec_keys.php:122 usr/local/www/vpn_ipsec_keys.php:135
+msgid "edit key"
+msgstr "editar chave"
+
+#: usr/local/www/vpn_ipsec_keys.php:137
+msgid "Do you really want to delete this pre-shared key?"
+msgstr "Você realmente deseja apagar essa chave pre-compartilhada?"
+
+#: usr/local/www/vpn_ipsec_keys.php:137 usr/local/www/vpn_ipsec_keys.php:136
+msgid "delete key"
+msgstr "apagar chave"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:74
+msgid "The identifier contains invalid characters."
+msgstr "O identificados contém caracteres inválidos."
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:77
+msgid "A user with this name already exists. Add the key to the user instead."
+msgstr "Um usuário com esse nome já existe. Ao invés disso, adicione a chave ao usuário."
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:83
+msgid "Another entry with the same identifier already exists."
+msgstr "Outra entrada com o mesmo identificador já existe."
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:100
+msgid "Edited"
+msgstr "Editado"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:103
+msgid "Added"
+msgstr "Adicionado"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:114
+msgid "VPN: IPsec: Edit pre-shared key"
+msgstr "VPN: IPsec: Editar chave pré-compartilhada"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:132
+#: usr/local/www/vpn_ipsec_keys_edit.php:131
+msgid "This can be either an IP address, fully qualified domain name or an e-mail address"
+msgstr "Isso pode ser tanto um endereço IP, um nome de domínio completamente qualificado quanto um endereço de e-mail"
+
+#: usr/local/www/vpn_ipsec_mobile.php:128
+#: usr/local/www/vpn_ipsec_mobile.php:132
+msgid "User Authentication Source"
+msgstr "Fonte de Autenticação de Usuário"
+
+#: usr/local/www/vpn_ipsec_mobile.php:128
+#: usr/local/www/vpn_ipsec_mobile.php:132
+msgid "Group Authentication Source"
+msgstr "Fonte de Autenticação de Grupo"
+
+#: usr/local/www/vpn_ipsec_mobile.php:134
+#: usr/local/www/vpn_ipsec_mobile.php:138
+msgid "A valid IP address for 'Virtual Address Pool Network' must be specified."
+msgstr "Um endereço IP válido para 'Rede de Pool de Endereços Virtuais' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_mobile.php:138
+#: usr/local/www/vpn_ipsec_mobile.php:142
+msgid "A valid value for 'DNS Default Domain' must be specified."
+msgstr "Um valor válido para 'Domínio Padrão de DNS' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_mobile.php:143
+#: usr/local/www/vpn_ipsec_mobile.php:159
+msgid "At least one DNS server must be specified to enable the DNS Server option."
+msgstr "Pelo menos um servidor DNS deve ser especificado para habilitar a opção de Servidor DNS."
+
+#: usr/local/www/vpn_ipsec_mobile.php:145
+#: usr/local/www/vpn_ipsec_mobile.php:161
+msgid "A valid IP address for 'DNS Server #1' must be specified."
+msgstr "Um endereço IP válido para 'Servidor DNS #1' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_mobile.php:147
+#: usr/local/www/vpn_ipsec_mobile.php:163
+msgid "A valid IP address for 'DNS Server #2' must be specified."
+msgstr "Um endereço IP válido para 'Servidor DNS #2' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_mobile.php:149
+#: usr/local/www/vpn_ipsec_mobile.php:165
+msgid "A valid IP address for 'DNS Server #3' must be specified."
+msgstr "Um endereço IP válido para 'Servidor DNS #3' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_mobile.php:151
+#: usr/local/www/vpn_ipsec_mobile.php:167
+msgid "A valid IP address for 'DNS Server #4' must be specified."
+msgstr "Um endereço IP válido para 'Servidor DNS #4' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_mobile.php:156
+#: usr/local/www/vpn_ipsec_mobile.php:172
+msgid "At least one WINS server must be specified to enable the DNS Server option."
+msgstr "Pelo menos um servidor WInS deve ser especificado para habilitar a opção de Servidor DNS."
+
+#: usr/local/www/vpn_ipsec_mobile.php:158
+#: usr/local/www/vpn_ipsec_mobile.php:174
+msgid "A valid IP address for 'WINS Server #1' must be specified."
+msgstr "Um endereço IP válido para 'Servidor WINS #1' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_mobile.php:160
+#: usr/local/www/vpn_ipsec_mobile.php:176
+msgid "A valid IP address for 'WINS Server #2' must be specified."
+msgstr "Um endereço IP válido para 'Servidor WINS #2' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_mobile.php:165
+#: usr/local/www/vpn_ipsec_mobile.php:181
+msgid "A valid value for 'Login Banner' must be specified."
+msgstr "Um valor válido para 'Banner de Login' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_mobile.php:220
+#: usr/local/www/vpn_ipsec_mobile.php:240
+msgid "Mobile"
+msgstr "Móvel"
+
+#: usr/local/www/vpn_ipsec_mobile.php:308
+#: usr/local/www/vpn_ipsec_mobile.php:335
+msgid "Support for IPsec Mobile clients is enabled but a Phase1 definition was not found"
+msgstr "Suporte a clientes Móveis IPsec está habilitado mas a definição da Fase 1 não foi encontrada"
+
+#: usr/local/www/vpn_ipsec_mobile.php:308
+#: usr/local/www/vpn_ipsec_mobile.php:335
+msgid "Please click Create to define one."
+msgstr "Por favor, clique em Criar para definir uma."
+
+#: usr/local/www/vpn_ipsec_mobile.php:308
+#: usr/local/www/vpn_ipsec_mobile.php:335
+msgid "Create Phase1"
+msgstr "Criar Fase 1"
+
+#: usr/local/www/vpn_ipsec_mobile.php:330
+#: usr/local/www/vpn_ipsec_mobile.php:357
+msgid "IKE Extensions"
+msgstr "Extensões IKE"
+
+#: usr/local/www/vpn_ipsec_mobile.php:339
+#: usr/local/www/vpn_ipsec_mobile.php:366
+msgid "Enable IPsec Mobile Client Support"
+msgstr "Habilitar Suporte de Clientes Móveis IPsec"
+
+#: usr/local/www/vpn_ipsec_mobile.php:350
+#: usr/local/www/vpn_ipsec_mobile.php:377
+msgid "Extended Authentication (Xauth)"
+msgstr "Autenticação Extendida (Xauth)"
+
+#: usr/local/www/vpn_ipsec_mobile.php:354
+#: usr/local/www/vpn_ipsec_mobile.php:381
+msgid "User Authentication"
+msgstr "Autenticação de Usuário"
+
+#: usr/local/www/vpn_ipsec_mobile.php:358
+#: usr/local/www/vpn_ipsec_mobile.php:379
+#: usr/local/www/vpn_ipsec_mobile.php:404
+msgid "system"
+msgstr "sistema"
+
+#: usr/local/www/vpn_ipsec_mobile.php:375
+#: usr/local/www/vpn_ipsec_mobile.php:399
+msgid "Group Authentication"
+msgstr "Autenticação de Grupo"
+
+#: usr/local/www/vpn_ipsec_mobile.php:388
+#: usr/local/www/vpn_ipsec_mobile.php:413
+msgid "Client Configuration (mode-cfg)"
+msgstr "Configuração de Cliente (mode-cfg)"
+
+#: usr/local/www/vpn_ipsec_mobile.php:392
+#: usr/local/www/vpn_ipsec_mobile.php:417
+msgid "Virtual Address Pool"
+msgstr "Pool de Endereços Virtuais"
+
+#: usr/local/www/vpn_ipsec_mobile.php:401
+#: usr/local/www/vpn_ipsec_mobile.php:426
+msgid "Provide a virtual IP address to clients"
+msgstr "Fornece um endereço IP virtual para clientes"
+
+#: usr/local/www/vpn_ipsec_mobile.php:424
+#: usr/local/www/vpn_ipsec_mobile.php:449
+msgid "Network List"
+msgstr "Lista de Redes"
+
+#: usr/local/www/vpn_ipsec_mobile.php:433
+#: usr/local/www/vpn_ipsec_mobile.php:458
+msgid "Provide a list of accessible networks to clients"
+msgstr "Fornece uma lista de redes acessíveis para clientes"
+
+#: usr/local/www/vpn_ipsec_mobile.php:440
+#: usr/local/www/vpn_ipsec_mobile.php:465
+msgid "Save Xauth Password"
+msgstr "Salvar Senha Xauth"
+
+#: usr/local/www/vpn_ipsec_mobile.php:449
+#: usr/local/www/vpn_ipsec_mobile.php:474
+msgid "Allow clients to save Xauth passwords (Cisco VPN client only)."
+msgstr "Permite clientes para salvar senhas Xauth (somente cliente VPN da Cisco)."
+
+#: usr/local/www/vpn_ipsec_mobile.php:450
+#: usr/local/www/vpn_ipsec_mobile.php:475
+msgid "NOTE: With iPhone clients, this does not work when deployed via the iPhone configuration utility, only by manual entry."
+msgstr "NOTA: Com clientes de iPhone, isso não funciona quando instalado via a ferramentas de configuração do iPhone, somente por entrada manual."
+
+#: usr/local/www/vpn_ipsec_mobile.php:457
+#: usr/local/www/vpn_openvpn_csc.php:433
+#: usr/local/www/vpn_openvpn_server.php:1194
+#: usr/local/www/vpn_openvpn_server.php:1336
+#: usr/local/www/vpn_ipsec_mobile.php:482
+#: usr/local/www/vpn_openvpn_csc.php:432
+#: usr/local/www/vpn_openvpn_server.php:1378
+#: usr/local/www/vpn_openvpn_server.php:1430
+msgid "DNS Default Domain"
+msgstr "Domínio Padrão do DNS"
+
+#: usr/local/www/vpn_ipsec_mobile.php:466
+#: usr/local/www/vpn_openvpn_csc.php:443
+#: usr/local/www/vpn_openvpn_server.php:1204
+#: usr/local/www/vpn_openvpn_server.php:1346
+#: usr/local/www/vpn_ipsec_mobile.php:491
+#: usr/local/www/vpn_openvpn_csc.php:442
+#: usr/local/www/vpn_openvpn_server.php:1388
+#: usr/local/www/vpn_openvpn_server.php:1440
+msgid "Provide a default domain name to clients"
+msgstr "Fornece um nome de domínio padrão para clientes"
+
+#: usr/local/www/vpn_ipsec_mobile.php:480
+#: usr/local/www/vpn_openvpn_csc.php:458
+#: usr/local/www/vpn_openvpn_server.php:1219
+#: usr/local/www/vpn_openvpn_server.php:1361
+#: usr/local/www/vpn_ipsec_mobile.php:529
+#: usr/local/www/vpn_openvpn_csc.php:457
+#: usr/local/www/vpn_openvpn_server.php:1403
+#: usr/local/www/vpn_openvpn_server.php:1455
+msgid "DNS Servers"
+msgstr "Servidores DNS"
+
+#: usr/local/www/vpn_ipsec_mobile.php:489
+#: usr/local/www/vpn_openvpn_csc.php:468
+#: usr/local/www/vpn_openvpn_server.php:1229
+#: usr/local/www/vpn_openvpn_server.php:1371
+#: usr/local/www/vpn_ipsec_mobile.php:538
+#: usr/local/www/vpn_openvpn_csc.php:467
+#: usr/local/www/vpn_openvpn_server.php:1413
+#: usr/local/www/vpn_openvpn_server.php:1465
+msgid "Provide a DNS server list to clients"
+msgstr "Fornece uma lista de servidores DNS para clientes"
+
+#: usr/local/www/vpn_ipsec_mobile.php:522
+#: usr/local/www/vpn_openvpn_csc.php:606
+#: usr/local/www/vpn_openvpn_server.php:1367
+#: usr/local/www/vpn_openvpn_server.php:1509
+#: usr/local/www/vpn_ipsec_mobile.php:571
+#: usr/local/www/vpn_openvpn_csc.php:605
+#: usr/local/www/vpn_openvpn_server.php:1551
+#: usr/local/www/vpn_openvpn_server.php:1603
+msgid "WINS Servers"
+msgstr "Servidores WINS"
+
+#: usr/local/www/vpn_ipsec_mobile.php:531
+#: usr/local/www/vpn_openvpn_csc.php:616
+#: usr/local/www/vpn_openvpn_server.php:1377
+#: usr/local/www/vpn_openvpn_server.php:1519
+#: usr/local/www/vpn_ipsec_mobile.php:580
+#: usr/local/www/vpn_openvpn_csc.php:615
+#: usr/local/www/vpn_openvpn_server.php:1561
+#: usr/local/www/vpn_openvpn_server.php:1613
+msgid "Provide a WINS server list to clients"
+msgstr "Fornece uma lista de servidores WINS para clientes"
+
+#: usr/local/www/vpn_ipsec_mobile.php:552
+#: usr/local/www/vpn_ipsec_mobile.php:601
+msgid "Phase2 PFS Group"
+msgstr "Grupo Phase2 PFS"
+
+#: usr/local/www/vpn_ipsec_mobile.php:561
+#: usr/local/www/vpn_ipsec_mobile.php:610
+msgid "Provide the Phase2 PFS group to clients ( overrides all mobile phase2 settings )"
+msgstr "Fornece o grupo PFS da Fase 2 para clientes (substitui todas as configurações de dispositivos móveis da fase 2)"
+
+#: usr/local/www/vpn_ipsec_mobile.php:568
+#: usr/local/www/system_groupmanager.php:71
+#: usr/local/www/vpn_ipsec_mobile.php:617
+msgid "Group"
+msgstr "Grupo"
+
+#: usr/local/www/vpn_ipsec_mobile.php:582
+#: usr/local/www/vpn_ipsec_mobile.php:631
+msgid "Login Banner"
+msgstr "Banner de Login"
+
+#: usr/local/www/vpn_ipsec_mobile.php:591
+#: usr/local/www/vpn_ipsec_mobile.php:640
+msgid "Provide a login banner to clients"
+msgstr "Fornece um banner de login para clientes"
+
+#: usr/local/www/interfaces_lagg.php:70 usr/local/www/interfaces_lagg.php:74
+msgid "This LAGG interface cannot be deleted because it is still being used."
+msgstr "Essa interface LAGG não pode ser apagada porque ainda está sendo usada."
+
+#: usr/local/www/interfaces_lagg.php:140 usr/local/www/interfaces_lagg.php:141
+#: usr/local/www/interfaces_lagg.php:145
+msgid "LAGG allows for link aggregation, bonding and fault tolerance. Only unassigned interfaces can be added to LAGG."
+msgstr "LAGG permite a agregação de link, tolerância de laços e falhas. Somente interfaces não atribuídas podem ser adicionadas a LAGG."
+
+#: usr/local/www/interfaces_lagg_edit.php:86
+#: usr/local/www/interfaces_lagg_edit.php:88
+msgid "Lagg protocol"
+msgstr "Protocolo Lagg"
+
+#: usr/local/www/interfaces_lagg_edit.php:131
+#: usr/local/www/interfaces_lagg_edit.php:132
+#: usr/local/www/interfaces_lagg_edit.php:145
+msgid "LAGG configuration"
+msgstr "Configuração LAGG"
+
+#: usr/local/www/interfaces_lagg_edit.php:149
+#: usr/local/www/interfaces_lagg_edit.php:150
+#: usr/local/www/interfaces_lagg_edit.php:163
+msgid "Choose the members that will be used for the link aggregation"
+msgstr "Escolha os membros que serão usados para a agregação de link"
+
+#: usr/local/www/interfaces_lagg_edit.php:152
+#: usr/local/www/interfaces_lagg_edit.php:153
+#: usr/local/www/interfaces_lagg_edit.php:166
+msgid "Lag proto"
+msgstr "Lag proto"
+
+#: usr/local/www/interfaces_lagg_edit.php:168
+#: usr/local/www/interfaces_lagg_edit.php:169
+#: usr/local/www/interfaces_lagg_edit.php:182
+#: usr/local/www/interfaces_lagg_edit.php:181
+msgid "failover"
+msgstr "failover"
+
+#: usr/local/www/interfaces_lagg_edit.php:169
+#: usr/local/www/interfaces_lagg_edit.php:170
+#: usr/local/www/interfaces_lagg_edit.php:183
+#: usr/local/www/interfaces_lagg_edit.php:182
+msgid "Sends and receives traffic only through the master port. If the master port becomes unavailable, the next active port is used. The first interface added is the master port; any interfaces added after that are used as failover devices."
+msgstr "Envia e recebe tráfego somente através da porta master. Se a porta master de tornar indisponível, a próxima porta ativa é usada. A primeira interface adicionada é a porta master; qualquer interface adicionada depois disso serão usadas como dispositivos failover."
+
+#: usr/local/www/interfaces_lagg_edit.php:174
+#: usr/local/www/interfaces_lagg_edit.php:175
+#: usr/local/www/interfaces_lagg_edit.php:188
+#: usr/local/www/interfaces_lagg_edit.php:187
+msgid "fec"
+msgstr "fec"
+
+#: usr/local/www/interfaces_lagg_edit.php:174
+#: usr/local/www/interfaces_lagg_edit.php:175
+#: usr/local/www/interfaces_lagg_edit.php:188
+#: usr/local/www/interfaces_lagg_edit.php:187
+msgid "Supports Cisco EtherChannel. This is a static setup and does not negotiate aggregation with the peer or exchange frames to monitor the link."
+msgstr "Suporta Cisco EtherChannel. Esta é uma instalação estática e não negocia agregações com o peer ou troca frames para monitorar o link."
+
+#: usr/local/www/interfaces_lagg_edit.php:178
+#: usr/local/www/interfaces_lagg_edit.php:179
+#: usr/local/www/interfaces_lagg_edit.php:192
+#: usr/local/www/interfaces_lagg_edit.php:191
+msgid "lacp"
+msgstr "lacp"
+
+#: usr/local/www/interfaces_lagg_edit.php:178
+#: usr/local/www/interfaces_lagg_edit.php:179
+#: usr/local/www/interfaces_lagg_edit.php:192
+#: usr/local/www/interfaces_lagg_edit.php:191
+msgid "Supports the IEEE 802.3ad Link Aggregation Control Protocol (LACP) and the Marker Protocol. LACP will negotiate a set of aggregable links with the peer in to one or more Link Aggregated Groups. Each LAG is composed of ports of the same speed, set to full-duplex operation. The traffic will be balanced across the ports in the LAG with the greatest total speed, in most cases there will only be one LAG which contains all ports. In the event of changes in physical connectivity, Link Aggregation will quickly converge to a new configuration."
+msgstr "Suporta o Protocolo de Controle de Agregação de Link (LACP) da IEEE 802.3ad e o Protocolo Marker. LACP negociará um conjunto de links agregáveis com o peer em um ou mais Grupos de Links Agregados. Cada LAG é composto de portas da mesma velocidade, configurado para uma operação full-duplex. O tráfego será balanceado através das portas no LAG com a velocidade total maior, na maioria dos casos haverá somente um LAG que contém todas as portas. No momento em que houver mudanças na conexão física, a Agregação do Link será rapidamente convergida para uma nova configuração."
+
+#: usr/local/www/interfaces_lagg_edit.php:189
+#: usr/local/www/interfaces_lagg_edit.php:190
+#: usr/local/www/interfaces_lagg_edit.php:203
+#: usr/local/www/interfaces_lagg_edit.php:202
+msgid "loadbalance"
+msgstr "loadbalance"
+
+#: usr/local/www/interfaces_lagg_edit.php:189
+#: usr/local/www/interfaces_lagg_edit.php:190
+#: usr/local/www/interfaces_lagg_edit.php:203
+#: usr/local/www/interfaces_lagg_edit.php:202
+msgid "Balances outgoing traffic across the active ports based on hashed protocol header information and accepts incoming traffic from any active port. This is a static setup and does not negotiate aggregation with the peer or exchange frames to monitor the link. The hash includes the Ethernet source and destination address, and, if available, the VLAN tag, and the IP source and destination address"
+msgstr "Balanceia o tráfego de saída através das portas ativas baseado em informações do cabeçalho de protocolo em hash e aceita tráfego de entrada de qualquer porta ativa. Essa é uma instalação estática e não negocia agregação com o peer ou troca frames para monitorar o link. A hash inclui a fonte Ethernet e endereço de destino e, se disponível, a tag VLAN, e a fonte IP e endereço de destino"
+
+#: usr/local/www/interfaces_lagg_edit.php:197
+#: usr/local/www/interfaces_lagg_edit.php:198
+#: usr/local/www/interfaces_lagg_edit.php:211
+#: usr/local/www/interfaces_lagg_edit.php:210
+msgid "roundrobin"
+msgstr "roundrobin"
+
+#: usr/local/www/interfaces_lagg_edit.php:197
+#: usr/local/www/interfaces_lagg_edit.php:198
+#: usr/local/www/interfaces_lagg_edit.php:211
+#: usr/local/www/interfaces_lagg_edit.php:210
+msgid "Distributes outgoing traffic using a round-robin scheduler through all active ports and accepts incoming traffic from any active port"
+msgstr "Distribui tráfego de saída usando um agendamento round-robin através de todas as portas ativas e aceita tráfego de entrada de qualquer porta ativa"
+
+#: usr/local/www/interfaces_lagg_edit.php:201
+#: usr/local/www/interfaces_lagg_edit.php:202
+#: usr/local/www/interfaces_lagg_edit.php:215
+#: usr/local/www/interfaces_lagg_edit.php:214
+msgid "This protocol is intended to do nothing: it disables any traffic without disabling the lagg interface itself"
+msgstr "Esse protocolo não tem intenção de fazer nada: ele desabilita qualquer tráfego sem desabilitar a interface lagg"
+
+#: usr/local/www/interfaces_ppps.php:62
+msgid "This point-to-point link cannot be deleted because it is still being used as an interface."
+msgstr "Esse link ponto-a-ponto não pode ser apagado porque ele ainda está sendo usado como uma interface."
+
+#: usr/local/www/interfaces_ppps.php:78
+msgid "Interfaces: PPPs"
+msgstr "Interfaces: PPPs"
+
+#: usr/local/www/interfaces_ppps.php:109 usr/local/www/interfaces_ppps.php:110
+msgid "Interface(s)/Port(s)"
+msgstr "Interface(s)/Porta(s)"
+
+#: usr/local/www/interfaces_ppps.php:132 usr/local/www/interfaces_ppps.php:133
+msgid "Do you really want to delete this PPP interface?"
+msgstr "Você realmente deseja apagar essa interface PPP?"
+
+#: usr/local/www/interfaces_ppps_edit.php:182
+#: usr/local/www/interfaces_ppps_edit.php:188
+#: usr/local/www/interfaces_ppps_edit.php:191
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:194
+#: usr/local/www/interfaces_ppps_edit.php:197
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+msgid "Link Interface(s)"
+msgstr "Interface(s) de Link"
+
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/services_dhcp.php:587 usr/local/www/services_dhcpv6.php:522
+#: usr/local/www/services_dhcp.php:600 usr/local/www/services_dhcpv6.php:596
+#: usr/local/www/services_dhcp.php:710 usr/local/www/services_dhcpv6.php:527
+#: usr/local/www/interfaces_ppps_edit.php:205
+#: usr/local/www/interfaces_ppps_edit.php:208
+#: usr/local/www/services_dhcp.php:720 usr/local/www/services_dhcpv6.php:542
+#: usr/local/www/services_dhcp.php:740 usr/local/www/services_dhcp.php:752
+msgid "Subnet"
+msgstr "Subrede"
+
+#: usr/local/www/interfaces_ppps_edit.php:207
+#: usr/local/www/interfaces_ppps_edit.php:213
+msgid "Please choose a Link Type."
+msgstr "Por favor escolha o Tipo de Link."
+
+#: usr/local/www/interfaces_ppps_edit.php:211
+#: usr/local/www/interfaces_ppps_edit.php:217
+msgid "Multilink connections (MLPPP) using the PPP link type is not currently supported. Please select only one Link Interface."
+msgstr "Conexões multilink (MLPPP) usando o tipo de link PPP não é suportado atualmente. Por favor, selecione somente uma Interface de Link."
+
+#: usr/local/www/interfaces_ppps_edit.php:213
+#: usr/local/www/interfaces_ppps_edit.php:219
+msgid "The Service name contains invalid characters."
+msgstr "O nome do Serviço contém caracteres inválidos."
+
+#: usr/local/www/interfaces_ppps_edit.php:215
+#: usr/local/www/interfaces_ppps_edit.php:221
+msgid "Do not specify both a Service name and a NULL Service name."
+msgstr "Não especifique um nome de Serviço e um nome de Serviço Nulo."
+
+#: usr/local/www/interfaces_ppps_edit.php:229
+#: usr/local/www/interfaces_ppps_edit.php:235
+msgid "A valid PPPoE reset month must be specified (1-12) in the Custom PPPoE Periodic reset fields."
+msgstr "Um mês de reinício PPPoE válido deve ser especificado (1-12) nos campos de reinício periódico do PPPoE personalizados."
+
+#: usr/local/www/interfaces_ppps_edit.php:231
+#: usr/local/www/interfaces_ppps_edit.php:237
+msgid "A valid PPPoE reset day of month must be specified (1-31) in the Custom PPPoE Periodic reset fields. No checks are done on valid # of days per month"
+msgstr "Um dia do mês de reinício do PPPoE válido deve ser especificado (1-31) nos campos de reinício periódico do PPPoE personalizados. Nenhuma verificação é feita em um # de dias válido por mês"
+
+#: usr/local/www/interfaces_ppps_edit.php:233
+#: usr/local/www/interfaces_ppps_edit.php:239
+msgid "A valid PPPoE reset year must be specified. Don't select a year in the past!"
+msgstr "Um ano de reinício do PPPoE válido deve ser especificado. Não selecione um ano do passado!"
+
+#: usr/local/www/interfaces_ppps_edit.php:238
+#: usr/local/www/interfaces_ppps_edit.php:244
+#, php-format
+msgid "A valid local IP address must be specified for %s."
+msgstr "Um endereço IP local válido deve ser especificado para %s."
+
+#: usr/local/www/interfaces_ppps_edit.php:240
+#: usr/local/www/interfaces_ppps_edit.php:246
+#, php-format
+msgid "A valid gateway IP address OR hostname must be specified for %s."
+msgstr "Um endereço IP de gateway ou nome de host válido deve ser especificado para %s."
+
+#: usr/local/www/interfaces_ppps_edit.php:242
+#: usr/local/www/interfaces_ppps_edit.php:248
+#, php-format
+msgid "The bandwidth value for %s must be an integer."
+msgstr "O valor de tamanho de banda para %s deve ser um inteiro."
+
+#: usr/local/www/interfaces_ppps_edit.php:244
+#: usr/local/www/interfaces_ppps_edit.php:250
+#, php-format
+msgid "The MTU for %s must be greater than 576 bytes."
+msgstr "O MTU para %s deve ser maior que 576 bytes."
+
+#: usr/local/www/interfaces_ppps_edit.php:246
+#: usr/local/www/interfaces_ppps_edit.php:252
+#, php-format
+msgid "The MRU for %s must be greater than 576 bytes."
+msgstr "O MRU para %s deve ser maior que 576 bytes."
+
+#: usr/local/www/interfaces_ppps_edit.php:381
+#: usr/local/www/system_authservers.php:577
+#: usr/local/www/interfaces_ppps_edit.php:382
+#: usr/local/www/system_authservers.php:582
+#: usr/local/www/interfaces_ppps_edit.php:388
+#: usr/local/www/system_authservers.php:589
+#: usr/local/www/system_authservers.php:601
+msgid "Select"
+msgstr "Selecione"
+
+#: usr/local/www/interfaces_ppps_edit.php:398
+#: usr/local/www/interfaces_ppps_edit.php:399
+#: usr/local/www/interfaces_ppps_edit.php:405
+msgid "PPPs configuration"
+msgstr "Configuração PPPs"
+
+#: usr/local/www/interfaces_ppps_edit.php:401
+#: usr/local/www/interfaces_ppps_edit.php:402
+#: usr/local/www/interfaces_ppps_edit.php:408
+msgid "Link Type"
+msgstr "Tipo de Link"
+
+#: usr/local/www/interfaces_ppps_edit.php:416
+#: usr/local/www/interfaces_ppps_edit.php:417
+#: usr/local/www/interfaces_ppps_edit.php:423
+msgid "Link interface(s)"
+msgstr "Interface(s) de Link"
+
+#: usr/local/www/interfaces_ppps_edit.php:422
+#: usr/local/www/interfaces_ppps_edit.php:423
+#: usr/local/www/interfaces_ppps_edit.php:429
+msgid "Select at least two interfaces for Multilink (MLPPP) connections."
+msgstr "Selecione pelo menos duas interfaces para conexões Multilink (MLPPP)."
+
+#: usr/local/www/interfaces_ppps_edit.php:470
+#: usr/local/www/interfaces_ppps_edit.php:471
+#: usr/local/www/interfaces_ppps_edit.php:477
+msgid "You may enter a description here for your reference. Description will appear in the \"Interfaces Assign\" select lists."
+msgstr "Você deve informar a descrição aqui para sua referência. A descrição irá aparecer na lista de seleção \"Atribuição de Interfaces\"."
+
+#: usr/local/www/interfaces_ppps_edit.php:526
+#: usr/local/www/interfaces_ppps_edit.php:527
+#: usr/local/www/interfaces_ppps_edit.php:533
+#: usr/local/www/interfaces_ppps_edit.php:531
+msgid "Note: Typically *99# for GSM networks and #777 for CDMA networks"
+msgstr "Nota: Tipicamente *99# para redes GSM e #777 para redes CDMA"
+
+#: usr/local/www/interfaces_ppps_edit.php:540
+#: usr/local/www/interfaces_ppps_edit.php:541
+#: usr/local/www/interfaces_ppps_edit.php:547
+#: usr/local/www/interfaces_ppps_edit.php:545
+msgid "APN number (optional)"
+msgstr "Número APN (opcional)"
+
+#: usr/local/www/interfaces_ppps_edit.php:543
+#: usr/local/www/interfaces_ppps_edit.php:544
+#: usr/local/www/interfaces_ppps_edit.php:550
+#: usr/local/www/interfaces_ppps_edit.php:548
+msgid "Note: Defaults to 1 if you set APN above. Ignored if you set no APN above."
+msgstr "Nota: o valor padrão é 1 caso você configurar o APN acima. Ignora-se caso você não configurar o APN acima."
+
+#: usr/local/www/interfaces_ppps_edit.php:547
+#: usr/local/www/interfaces_ppps_edit.php:548
+#: usr/local/www/interfaces_ppps_edit.php:554
+#: usr/local/www/interfaces_ppps_edit.php:552
+msgid "SIM PIN"
+msgstr "SIM PIN"
+
+#: usr/local/www/interfaces_ppps_edit.php:554
+#: usr/local/www/interfaces_ppps_edit.php:555
+#: usr/local/www/interfaces_ppps_edit.php:561
+#: usr/local/www/interfaces_ppps_edit.php:559
+msgid "SIM PIN wait"
+msgstr "SIM PIN espera"
+
+#: usr/local/www/interfaces_ppps_edit.php:557
+#: usr/local/www/interfaces_ppps_edit.php:558
+#: usr/local/www/interfaces_ppps_edit.php:564
+#: usr/local/www/interfaces_ppps_edit.php:562
+msgid "Note: Time to wait for SIM to discover network after PIN is sent to SIM (seconds)."
+msgstr "Nota: Tempo para esperar que o SIM descubra a rede depois que o PIN é enviado ao SIM (segundos)."
+
+#: usr/local/www/interfaces_ppps_edit.php:561
+#: usr/local/www/interfaces_ppps_edit.php:562
+#: usr/local/www/interfaces_ppps_edit.php:568
+#: usr/local/www/interfaces_ppps_edit.php:566
+msgid "Init String"
+msgstr "String de inicialização"
+
+#: usr/local/www/interfaces_ppps_edit.php:564
+#: usr/local/www/interfaces_ppps_edit.php:565
+#: usr/local/www/interfaces_ppps_edit.php:571
+#: usr/local/www/interfaces_ppps_edit.php:569
+msgid "Note: Enter the modem initialization string here. Do NOT include the \"AT\" string at the beginning of the command. Many modern USB 3G modems don't need an initialization string."
+msgstr "Nota: Informe a string de inicialização do modem aqui. NÃO inclua a string \"AT\" no início do comando. Muitos modems USB 3G modernos não precisam de uma string de inicialização."
+
+#: usr/local/www/interfaces_ppps_edit.php:569
+#: usr/local/www/interfaces_ppps_edit.php:570
+#: usr/local/www/interfaces_ppps_edit.php:576
+#: usr/local/www/interfaces_ppps_edit.php:574
+msgid "Connection Timeout"
+msgstr "Conexão expirou"
+
+#: usr/local/www/interfaces_ppps_edit.php:572
+#: usr/local/www/interfaces_ppps_edit.php:573
+#: usr/local/www/interfaces_ppps_edit.php:579
+#: usr/local/www/interfaces_ppps_edit.php:577
+msgid "Note: Enter timeout in seconds for connection to be established (sec.) Default is 45 sec."
+msgstr "Nota: Informe o tempo de expiração em segundos para que a conexão seja estabelecida (segundos). O padrão é 45 segundos."
+
+#: usr/local/www/interfaces_ppps_edit.php:576
+#: usr/local/www/interfaces_ppps_edit.php:577
+#: usr/local/www/interfaces_ppps_edit.php:583
+#: usr/local/www/interfaces_ppps_edit.php:581
+msgid "Uptime Logging"
+msgstr "Geração de log de tempo de execução"
+
+#: usr/local/www/interfaces_ppps_edit.php:578
+#: usr/local/www/interfaces_ppps_edit.php:579
+#: usr/local/www/interfaces_ppps_edit.php:585
+#: usr/local/www/interfaces_ppps_edit.php:583
+msgid "Enable persistent logging of connection uptime."
+msgstr "Habilitar log de persistência da conexão em tempo de execução."
+
+#: usr/local/www/interfaces_ppps_edit.php:579
+#: usr/local/www/interfaces_ppps_edit.php:580
+#: usr/local/www/interfaces_ppps_edit.php:586
+#: usr/local/www/interfaces_ppps_edit.php:584
+msgid "This option causes cumulative uptime to be recorded and displayed on the Status Interfaces page."
+msgstr "Essa opção faz com que o acúmulo de tempo de execução seja gravado e exibido na página de Interfaces de Status."
+
+#: usr/local/www/interfaces_ppps_edit.php:591
+#: usr/local/www/interfaces_ppps_edit.php:592
+#: usr/local/www/interfaces_ppps_edit.php:598
+#: usr/local/www/interfaces_ppps_edit.php:596
+msgid "Configure a NULL Service name"
+msgstr "Configure um Nome do Serviço Nulo"
+
+#: usr/local/www/interfaces_ppps_edit.php:592
+#: usr/local/www/interfaces_ppps_edit.php:593
+#: usr/local/www/interfaces_ppps_edit.php:599
+#: usr/local/www/interfaces_ppps_edit.php:597
+msgid "Hint: this field can usually be left empty. Service name will not be configured if this field is empty. Check the \"Configure NULL\" box to configure a blank Service name."
+msgstr "Dica: esse campo pode ser deixado em branco. O nome de Serviço não será configurado se esse campo estiver vazio. Verifique a caixa \"Configure Nulo\" para configurar um nome de serviço em branco."
+
+#: usr/local/www/interfaces_ppps_edit.php:652 usr/local/www/vpn_pppoe.php:102
+#: usr/local/www/diag_ipsec.php:91 usr/local/www/diag_ipsec.php:102
+#: usr/local/www/vpn_pppoe.php:103 usr/local/www/diag_ipsec.php:103
+#: usr/local/www/interfaces_ppps_edit.php:653 usr/local/www/vpn_pppoe.php:104
+#: usr/local/www/interfaces_ppps_edit.php:659 usr/local/www/diag_ipsec.php:105
+#: usr/local/www/interfaces_ppps_edit.php:657
+msgid "Local IP"
+msgstr "IP local"
+
+#: usr/local/www/interfaces_ppps_edit.php:667
+#: usr/local/www/interfaces_ppps_edit.php:668
+#: usr/local/www/interfaces_ppps_edit.php:674
+#: usr/local/www/interfaces_ppps_edit.php:672
+msgid "IP Address OR Hostname"
+msgstr "Endereço IP OU Nome de Host"
+
+#: usr/local/www/interfaces_ppps_edit.php:678
+#: usr/local/www/interfaces_ppps_edit.php:679
+#: usr/local/www/interfaces_ppps_edit.php:685
+#: usr/local/www/interfaces_ppps_edit.php:683
+msgid "Dial On Demand"
+msgstr "Discagem sob Demanda"
+
+#: usr/local/www/interfaces_ppps_edit.php:680
+#: usr/local/www/interfaces_ppps_edit.php:681
+#: usr/local/www/interfaces_ppps_edit.php:687
+#: usr/local/www/interfaces_ppps_edit.php:685
+msgid "Enable Dial-on-Demand mode"
+msgstr "Habilitar modo de Discagem sob Demanda"
+
+#: usr/local/www/interfaces_ppps_edit.php:681
+#: usr/local/www/interfaces_ppps_edit.php:682
+#: usr/local/www/interfaces_ppps_edit.php:688
+#: usr/local/www/interfaces_ppps_edit.php:686
+msgid "This option causes the interface to operate in dial-on-demand mode. Do NOT enable if you want your link to be always up. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected."
+msgstr "Essa opção faz com que a inteface opere no modo de discagem sob demanda. NÃO habilite se você deseja que seu link esteja sempre funcionando. A interface é configurada, mas a conexão real é adiada até qualificar o tráfego de saída."
+
+#: usr/local/www/interfaces_ppps_edit.php:686
+#: usr/local/www/interfaces_ppps_edit.php:687
+#: usr/local/www/interfaces_ppps_edit.php:693
+#: usr/local/www/interfaces_ppps_edit.php:691
+msgid "Idle Timeout"
+msgstr "Tempo ocioso"
+
+#: usr/local/www/interfaces_ppps_edit.php:688
+#: usr/local/www/interfaces_ppps_edit.php:689
+#: usr/local/www/interfaces_ppps_edit.php:695
+#: usr/local/www/interfaces_ppps_edit.php:693
+msgid "(seconds) Default is 0, which disables the timeout feature."
+msgstr "(segundos). O padrão é 0, o que desabilita a funcionalidade de tempo de expiração."
+
+#: usr/local/www/interfaces_ppps_edit.php:689
+#: usr/local/www/interfaces_ppps_edit.php:690
+#: usr/local/www/interfaces_ppps_edit.php:696
+#: usr/local/www/interfaces_ppps_edit.php:694
+msgid "If no incoming or outgoing packets are transmitted for the entered number of seconds the connection is brought down."
+msgstr "Se nenhum pacote de entrada ou de saída forem transmitidos para o número de segundos informados, a conexão é desfeita."
+
+#: usr/local/www/interfaces_ppps_edit.php:690
+#: usr/local/www/interfaces_ppps_edit.php:691
+#: usr/local/www/interfaces_ppps_edit.php:697
+#: usr/local/www/interfaces_ppps_edit.php:695
+msgid "When the idle timeout occurs, if the dial-on-demand option is enabled, mpd goes back into dial-on-demand mode. Otherwise, the interface is brought down and all associated routes removed."
+msgstr "Quando o tempo ocioso, se a opção de discagem sob demanda estiver habilitada, mpd retorna ao modo discagem sob demanda. Do contrário, a interface é desconectada e todas as rotas associadas a ela removidas."
+
+#: usr/local/www/interfaces_ppps_edit.php:694
+#: usr/local/www/vpn_openvpn_client.php:787
+#: usr/local/www/vpn_openvpn_server.php:1077
+#: usr/local/www/vpn_openvpn_server.php:1219
+#: usr/local/www/vpn_openvpn_client.php:792
+#: usr/local/www/interfaces_ppps_edit.php:695
+#: usr/local/www/vpn_openvpn_server.php:1261
+#: usr/local/www/vpn_openvpn_client.php:838
+#: usr/local/www/vpn_openvpn_client.php:857
+#: usr/local/www/interfaces_ppps_edit.php:701
+#: usr/local/www/vpn_openvpn_server.php:1288
+#: usr/local/www/interfaces_ppps_edit.php:699
+msgid "Compression"
+msgstr "Compressão"
+
+#: usr/local/www/interfaces_ppps_edit.php:696
+#: usr/local/www/interfaces_ppps_edit.php:697
+#: usr/local/www/interfaces_ppps_edit.php:703
+#: usr/local/www/interfaces_ppps_edit.php:701
+msgid "Disable vjcomp(compression) (auto-negotiated by default)."
+msgstr "Desabilitar vjcomp (compressão) (auto-negociada por padrão)."
+
+#: usr/local/www/interfaces_ppps_edit.php:697
+#: usr/local/www/interfaces_ppps_edit.php:698
+#: usr/local/www/interfaces_ppps_edit.php:704
+#: usr/local/www/interfaces_ppps_edit.php:702
+msgid "This option enables Van Jacobson TCP header compression, which saves several bytes per TCP data packet. You almost always want this option. This compression ineffective for TCP connections with enabled modern extensions like time stamping or SACK, which modify TCP options between sequential packets."
+msgstr "Essa opção habilita a compressão de cabeçalho TCP de Van Jacobson, que salva muitos bytes por pacote TCP. Você deve sempre querer configurar essa opção. Essa compressão não tem efeito para conexões TCP com extensões modernas habilitadas como time stamping ou SACK, que modifica as opções TCP entre pacotes sequenciais."
+
+#: usr/local/www/interfaces_ppps_edit.php:703
+#: usr/local/www/interfaces_ppps_edit.php:704
+#: usr/local/www/interfaces_ppps_edit.php:710
+#: usr/local/www/interfaces_ppps_edit.php:708
+msgid "TCPmssFix"
+msgstr "TCPmssFix"
+
+#: usr/local/www/interfaces_ppps_edit.php:705
+#: usr/local/www/interfaces_ppps_edit.php:706
+#: usr/local/www/interfaces_ppps_edit.php:712
+#: usr/local/www/interfaces_ppps_edit.php:710
+msgid "Disable tcpmssfix (enabled by default)."
+msgstr "Desabilita tcpmssfix (habilita por padrão)."
+
+#: usr/local/www/interfaces_ppps_edit.php:706
+#: usr/local/www/interfaces_ppps_edit.php:707
+#: usr/local/www/interfaces_ppps_edit.php:713
+#: usr/local/www/interfaces_ppps_edit.php:711
+msgid "This option causes mpd to adjust incoming and outgoing TCP SYN segments so that the requested maximum segment size is not greater than the amount allowed by the interface MTU. This is necessary in many setups to avoid problems caused by routers that drop ICMP Datagram Too Big messages. Without these messages, the originating machine sends data, it passes the rogue router then hits a machine that has an MTU that is not big enough for the data. Because the IP Don't Fragment option is set, this machine sends an ICMP Datagram Too Big message back to the originator and drops the packet. The rogue router drops the ICMP message and the originator never gets to discover that it must reduce the fragment size or drop the IP Don't Fragment option from its outgoing data."
+msgstr "Essa opção faz com que o mpd ajuste segmentos TCP SYN de entrada e saída de modo que o tamanho máximo de segmento requerido não é maior que o total permitido pelo MTU da interface. Isso é necessário em muitas configurações para evitar problemas causados por roteadores que descartam mensagens ICMP Datagram Too Big. Sem essas mensagens, a máquina de origem envia dados, passa pelo roteador trapaceiro e então alcança a máquina que em um MTU que não é grande o bastante para o dado. Em função da opção Não Fragmentar IP estar configurada, a máquina envia uma mensagem de retorno ICMP Datagram Too Big para quem a originou e descarta o pacote. O roteador trapaceiro descarta a mensagem ICMP e quem a originou nunca descobre que deve reduzir o tamanho do fragmento ou descartar a opção de Não Fragmentar para seus dados de saída."
+
+#: usr/local/www/interfaces_ppps_edit.php:714
+#: usr/local/www/interfaces_ppps_edit.php:715
+#: usr/local/www/interfaces_ppps_edit.php:721
+#: usr/local/www/interfaces_ppps_edit.php:719
+msgid "ShortSeq"
+msgstr "ShortSeq"
+
+#: usr/local/www/interfaces_ppps_edit.php:716
+#: usr/local/www/interfaces_ppps_edit.php:717
+#: usr/local/www/interfaces_ppps_edit.php:723
+#: usr/local/www/interfaces_ppps_edit.php:721
+msgid "Disable shortseq (auto-negotiated by default)."
+msgstr "Desabilitar shortseq (auto-negociada por padrão)."
+
+#: usr/local/www/interfaces_ppps_edit.php:717
+#: usr/local/www/interfaces_ppps_edit.php:718
+#: usr/local/www/interfaces_ppps_edit.php:724
+#: usr/local/www/interfaces_ppps_edit.php:722
+msgid "This option is only meaningful if multi-link PPP is negotiated. It proscribes shorter multi-link fragment headers, saving two bytes on every frame. It is not necessary to disable this for connections that are not multi-link."
+msgstr "Essa opção somente faz sentido se o multi-link PPP é negociado. Ele proscreve cabeçalhos de fragmentos de multi-link mais curtos, salvando 2 bytes a cada frame. Não é necessário desabilitar isso para conexões que não são multi-link."
+
+#: usr/local/www/interfaces_ppps_edit.php:722
+#: usr/local/www/interfaces_ppps_edit.php:723
+#: usr/local/www/interfaces_ppps_edit.php:729
+#: usr/local/www/interfaces_ppps_edit.php:727
+msgid "ACFComp"
+msgstr "ACFComp"
+
+#: usr/local/www/interfaces_ppps_edit.php:724
+#: usr/local/www/interfaces_ppps_edit.php:725
+#: usr/local/www/interfaces_ppps_edit.php:731
+#: usr/local/www/interfaces_ppps_edit.php:729
+msgid "Disable acfcomp (compression) (auto-negotiated by default)."
+msgstr "Desabilitar acfcomp (compressão) (auto-negociada por padrão)."
+
+#: usr/local/www/interfaces_ppps_edit.php:725
+#: usr/local/www/interfaces_ppps_edit.php:726
+#: usr/local/www/interfaces_ppps_edit.php:732
+#: usr/local/www/interfaces_ppps_edit.php:730
+msgid "Address and control field compression. This option only applies to asynchronous link types. It saves two bytes per frame."
+msgstr "Endereça e controla compressão de campo. Essa opção somente se aplica a tipos de link assíncronos. Ela salva 2 bytes por frame."
+
+#: usr/local/www/interfaces_ppps_edit.php:729
+#: usr/local/www/interfaces_ppps_edit.php:730
+#: usr/local/www/interfaces_ppps_edit.php:736
+#: usr/local/www/interfaces_ppps_edit.php:734
+msgid "ProtoComp"
+msgstr "ProtoComp"
+
+#: usr/local/www/interfaces_ppps_edit.php:731
+#: usr/local/www/interfaces_ppps_edit.php:732
+#: usr/local/www/interfaces_ppps_edit.php:738
+#: usr/local/www/interfaces_ppps_edit.php:736
+msgid "Disable protocomp (compression) (auto-negotiated by default)."
+msgstr "Desabilitar protocomp (compressão) (auto-negociada por padrão)."
+
+#: usr/local/www/interfaces_ppps_edit.php:732
+#: usr/local/www/interfaces_ppps_edit.php:733
+#: usr/local/www/interfaces_ppps_edit.php:739
+#: usr/local/www/interfaces_ppps_edit.php:737
+msgid "Protocol field compression. This option saves one byte per frame for most frames."
+msgstr "Compressão de campo de protocolo. Essa opção salva 1 byte por frame para a maioria deles."
+
+#: usr/local/www/interfaces_ppps_edit.php:746
+#: usr/local/www/interfaces_ppps_edit.php:747
+#: usr/local/www/interfaces_ppps_edit.php:753
+#: usr/local/www/interfaces_ppps_edit.php:750
+msgid "Link Parameters"
+msgstr "Parâmetros de link"
+
+#: usr/local/www/interfaces_ppps_edit.php:753
+#: usr/local/www/interfaces_ppps_edit.php:754
+#: usr/local/www/interfaces_ppps_edit.php:760
+#: usr/local/www/interfaces_ppps_edit.php:757
+msgid "Set ONLY for MLPPP connections and ONLY when links have different bandwidths."
+msgstr "Configure SOMENTE para conexões MLPPP e SOMENTE quando links tiverem diferentes tamanhos de banda."
+
+#: usr/local/www/interfaces_ppps_edit.php:760
+#: usr/local/www/interfaces_ppps_edit.php:761
+#: usr/local/www/interfaces_ppps_edit.php:767
+#: usr/local/www/interfaces_ppps_edit.php:764
+msgid "MTU will default to 1492."
+msgstr "MTU será 1492 como padrão."
+
+#: usr/local/www/interfaces_ppps_edit.php:764
+#: usr/local/www/interfaces_ppps_edit.php:765
+#: usr/local/www/interfaces_ppps_edit.php:771
+#: usr/local/www/interfaces_ppps_edit.php:768
+msgid "MRU"
+msgstr "MRU"
+
+#: usr/local/www/interfaces_ppps_edit.php:767
+#: usr/local/www/interfaces_ppps_edit.php:774
+#: usr/local/www/interfaces_ppps_edit.php:768
+#: usr/local/www/interfaces_ppps_edit.php:775
+#: usr/local/www/interfaces_ppps_edit.php:781
+#: usr/local/www/interfaces_ppps_edit.php:771
+#: usr/local/www/interfaces_ppps_edit.php:778
+msgid "will be auto-negotiated by default."
+msgstr "será auto-negociado por padrão."
+
+#: usr/local/www/interfaces_ppps_edit.php:771
+#: usr/local/www/interfaces_ppps_edit.php:772
+#: usr/local/www/interfaces_ppps_edit.php:778
+#: usr/local/www/interfaces_ppps_edit.php:775
+msgid "MRRU"
+msgstr "MRRU"
+
+#: usr/local/www/interfaces_ppps_edit.php:774
+#: usr/local/www/interfaces_ppps_edit.php:775
+#: usr/local/www/interfaces_ppps_edit.php:781
+#: usr/local/www/interfaces_ppps_edit.php:778
+msgid "Set ONLY for MLPPP connections."
+msgstr "Configure SOMENTE conexões MLPP."
+
+#: usr/local/www/interfaces_qinq.php:64 usr/local/www/interfaces_qinq.php:66
+msgid "This QinQ cannot be deleted because it is still being used as an interface."
+msgstr "Esse QinQ não pode ser apagado porque ele ainda está sendo usado como uma interface."
+
+#: usr/local/www/interfaces_qinq.php:86
+#: usr/local/www/interfaces_qinq_edit.php:39
+#: usr/local/www/interfaces_qinq.php:89
+msgid "QinQ"
+msgstr "QinQ"
+
+#: usr/local/www/interfaces_qinq.php:117
+#: usr/local/www/interfaces_qinq_edit.php:356
+#: usr/local/www/interfaces_qinq_edit.php:357
+#: usr/local/www/interfaces_qinq.php:118 usr/local/www/interfaces_qinq.php:121
+#: usr/local/www/interfaces_qinq_edit.php:360
+msgid "Tag"
+msgstr "Tag"
+
+#: usr/local/www/interfaces_qinq.php:118 usr/local/www/interfaces_qinq.php:119
+#: usr/local/www/interfaces_qinq.php:122
+msgid "QinQ members"
+msgstr "Membros QinQ"
+
+#: usr/local/www/interfaces_qinq.php:142 usr/local/www/interfaces_qinq.php:143
+#: usr/local/www/interfaces_qinq.php:146
+msgid "Do you really want to delete this QinQ?"
+msgstr "Você realmente quer apagar esse QinQ?"
+
+#: usr/local/www/interfaces_qinq.php:153 usr/local/www/interfaces_qinq.php:154
+#: usr/local/www/interfaces_qinq.php:157
+#, php-format
+msgid "Not all drivers/NICs support 802.1Q QinQ tagging properly. On cards that do not explicitly support it, QinQ tagging will still work, but the reduced MTU may cause problems. See the %s handbook for information on supported cards."
+msgstr "Nem todos os drivers/NICs suportam tags QinQ 802.1Q apropriadamente. Em cartões que não explicitam que a suportam, tags QinQ ainda funcionarão, mas um MTU reduzido pode causar problemas. Veja o livro %s para informações sobre cartões que suportam."
+
+#: usr/local/www/interfaces_qinq_edit.php:84
+#: usr/local/www/interfaces_qinq_edit.php:85
+msgid "First level tag cannot be empty."
+msgstr "Tag de primeiro nível não pode ser vazia."
+
+#: usr/local/www/interfaces_qinq_edit.php:86
+#: usr/local/www/interfaces_qinq_edit.php:87
+msgid "You are editing an existing entry and modifying the first level tag is not allowed."
+msgstr "Você está editando uma entrada existente e modificar a tag de primeiro nível não é permitido."
+
+#: usr/local/www/interfaces_qinq_edit.php:88
+#: usr/local/www/interfaces_qinq_edit.php:89
+msgid "You are editing an existing entry and modifying the interface is not allowed."
+msgstr "Você está editando uma entrada existente e modificar a interface não é permitido."
+
+#: usr/local/www/interfaces_qinq_edit.php:92
+#: usr/local/www/interfaces_qinq_edit.php:93
+msgid "QinQ level already exists for this interface, edit it!"
+msgstr "Um nível QinQ já existe para essa interface, edite-o!"
+
+#: usr/local/www/interfaces_qinq_edit.php:96
+#: usr/local/www/interfaces_qinq_edit.php:97
+msgid "A normal VLAN exists with this tag please remove it to use this tag for QinQ first level."
+msgstr "Uma VLAN normal existe com essa tag, por favor, apague-a para usar essa tag para o primeiro nível de QinQ."
+
+#: usr/local/www/interfaces_qinq_edit.php:123
+#: usr/local/www/interfaces_qinq_edit.php:133
+#: usr/local/www/interfaces_qinq_edit.php:124
+#: usr/local/www/interfaces_qinq_edit.php:134
+msgid "Tags can contain only numbers or a range in format #-#."
+msgstr "Tags podem conter somente números ou um intervalo no formato #-#."
+
+#: usr/local/www/interfaces_qinq_edit.php:193
+#: usr/local/www/interfaces_qinq_edit.php:194
+#: usr/local/www/interfaces_qinq_edit.php:197
+msgid "QinQ VLANs group"
+msgstr "Grupo VLAN de QinQ"
+
+#: usr/local/www/interfaces_qinq_edit.php:269
+#: usr/local/www/interfaces_qinq_edit.php:270
+#: usr/local/www/interfaces_qinq_edit.php:273
+#: usr/local/www/interfaces_qinq_edit.php:272
+msgid "members"
+msgstr "membros"
+
+#: usr/local/www/interfaces_qinq_edit.php:273
+#: usr/local/www/interfaces_qinq_edit.php:274
+#: usr/local/www/interfaces_qinq_edit.php:277
+#: usr/local/www/interfaces_qinq_edit.php:276
+msgid "detail"
+msgstr "detalhe"
+
+#: usr/local/www/interfaces_qinq_edit.php:285
+#: usr/local/www/interfaces_qinq_edit.php:286
+#: usr/local/www/interfaces_qinq_edit.php:289
+msgid "Interface QinQ Edit"
+msgstr "Editar Interface QinQ"
+
+#: usr/local/www/interfaces_qinq_edit.php:305
+#: usr/local/www/interfaces_qinq_edit.php:306
+#: usr/local/www/interfaces_qinq_edit.php:309
+msgid "Only QinQ capable interfaces will be shown."
+msgstr "Somente interfaces que suportam QinQ serão exibidas."
+
+#: usr/local/www/interfaces_qinq_edit.php:308
+#: usr/local/www/interfaces_qinq_edit.php:309
+#: usr/local/www/interfaces_qinq_edit.php:312
+msgid "First level tag"
+msgstr "Tag de primeiro nível"
+
+#: usr/local/www/interfaces_qinq_edit.php:313
+#: usr/local/www/interfaces_qinq_edit.php:314
+#: usr/local/www/interfaces_qinq_edit.php:317
+msgid "This is the first level VLAN tag. On top of this are stacked the member VLANs defined below."
+msgstr "Essa é a tag VLAN de primeiro nível. No topo dela estão empilhados os membros VLAN definidos abaixo."
+
+#: usr/local/www/interfaces_qinq_edit.php:333
+#: usr/local/www/interfaces_qinq_edit.php:334
+#: usr/local/www/interfaces_qinq_edit.php:337
+msgid "Adds interface to QinQ interface groups so you can write filter rules easily."
+msgstr "Adiciona interface ao grupo de interfaces QinQ para que você possa escrever regras de filtro facilmente."
+
+#: usr/local/www/interfaces_qinq_edit.php:350
+#: usr/local/www/interfaces_qinq_edit.php:351
+#: usr/local/www/interfaces_qinq_edit.php:354
+msgid "You can specify ranges in the input below. The format is pretty simple i.e 9-100 or 10.20..."
+msgstr "Você pode especificar intervalos no campo abaixo. O formato é muito simples, i.e. 9-100 ou 10.20..."
+
+#: usr/local/www/interfaces_wireless.php:63
+#: usr/local/www/interfaces_wireless.php:65
+msgid "This wireless clone cannot be deleted because it is assigned as an interface."
+msgstr "O clone sem fio não pode ser apagado porque ele está atribuído como uma interface."
+
+#: usr/local/www/interfaces_wireless.php:124
+#: usr/local/www/interfaces_wireless.php:125
+#: usr/local/www/interfaces_wireless.php:127
+msgid "Do you really want to delete this wireless clone?"
+msgstr "Você realmente deseja apagar esse clone sem fio?"
+
+#: usr/local/www/interfaces_wireless.php:135
+#: usr/local/www/interfaces_wireless.php:136
+#: usr/local/www/interfaces_wireless.php:138
+msgid "Here you can configure clones of wireless interfaces, which can be assigned as separate independent interfaces. Only available on wireless chipsets that support this, with limitations on the number that can be created in each mode."
+msgstr "Aqui você pode configurar clones para interfaces sem fio, os quais podem ser atribuídos como interfaces separadas independentes. Somente disponível em conjunto de chips sem fio que os suportam, com limitação do número que podem ser criadas em cada modo."
+
+#: usr/local/www/interfaces_wireless_edit.php:116
+#: usr/local/www/interfaces_wireless_edit.php:118
+msgid "This wireless clone cannot be modified because it is still assigned as an interface."
+msgstr "Esse clone sem fio não pode ser modificado porque ainda está atribuído a uma interface."
+
+#: usr/local/www/interfaces_wireless_edit.php:118
+#: usr/local/www/interfaces_wireless_edit.php:120
+msgid "Use the configuration page for the assigned interface to change the mode."
+msgstr "Use a página de configuração para a interface atribuída modificar o modo."
+
+#: usr/local/www/interfaces_wireless_edit.php:123
+#: usr/local/www/interfaces_wireless_edit.php:125
+#, php-format
+msgid "Error creating interface with mode %1$s. The %2$s interface may not support creating more clones with the selected mode."
+msgstr "Erro ao criar interface com o modo %1$s. A interface %2$s pode não suportar a criação de mais clones com o modo selecionado."
+
+#: usr/local/www/interfaces_wireless_edit.php:128
+#: usr/local/www/interfaces_wireless_edit.php:130
+#, php-format
+msgid "Created with id %s"
+msgstr "Criado com o código %s"
+
+#: usr/local/www/interfaces_wireless_edit.php:131
+#: usr/local/www/interfaces_wireless_edit.php:133
+msgid "Created without id"
+msgstr "Criado sem código"
+
+#: usr/local/www/interfaces_wireless_edit.php:156
+#: usr/local/www/interfaces_wireless_edit.php:158
+msgid "Wireless clone configuration"
+msgstr "Configuração clone sem fio"
+
+#: usr/local/www/load_balancer_monitor.php:72
+msgid "This entry cannot be deleted because it is still referenced by at least one pool."
+msgstr "Essa entrada não pode ser apagada porque ainda está sendo referenciada por pelo menos um pool."
+
+#: usr/local/www/load_balancer_monitor.php:102
+#: usr/local/www/load_balancer_relay_protocol.php:114
+#: usr/local/www/load_balancer_setting.php:111
+#: usr/local/www/load_balancer_setting.php:110
+#: usr/local/www/load_balancer_monitor.php:100
+#: usr/local/www/load_balancer_relay_protocol.php:112
+msgid "The load balancer configuration has been changed"
+msgstr "A configuração do balanceador de carga foi modificada"
+
+#: usr/local/www/vpn_pppoe.php:96 usr/local/www/vpn_pppoe.php:97
+#: usr/local/www/vpn_pppoe.php:98
+msgid "The PPPoE entry list has been changed"
+msgstr "A lista de entrada PPPoE foi modificada"
+
+#: usr/local/www/vpn_pppoe.php:103
+#: usr/local/www/services_captiveportal_zones.php:54
+#: usr/local/www/vpn_pppoe.php:104
+#: usr/local/www/services_captiveportal_zones.php:55
+#: usr/local/www/vpn_pppoe.php:105
+msgid "Number of users"
+msgstr "Número de usuários"
+
+#: usr/local/www/vpn_pppoe.php:109 usr/local/www/vpn_pppoe.php:144
+#: usr/local/www/vpn_pppoe.php:110 usr/local/www/vpn_pppoe.php:145
+#: usr/local/www/vpn_pppoe.php:111 usr/local/www/vpn_pppoe.php:146
+msgid "add a new pppoe instance"
+msgstr "adicione uma nova instância pppoe"
+
+#: usr/local/www/vpn_pppoe.php:131 usr/local/www/vpn_pppoe.php:132
+#: usr/local/www/vpn_pppoe.php:133
+msgid "edit PPPoE instance"
+msgstr "editar instância pppoe"
+
+#: usr/local/www/vpn_pppoe.php:132 usr/local/www/vpn_pppoe.php:133
+#: usr/local/www/vpn_pppoe.php:134
+msgid "Do you really want to delete this entry? All elements that still use it will become invalid (e.g. filter rules)!"
+msgstr "Você realmente deseja apagar essa entrada? Todos os elementos que ainda a usam serão invalidados (e.g. regras de filtro)!"
+
+#: usr/local/www/vpn_pppoe.php:132 usr/local/www/vpn_pppoe.php:133
+#: usr/local/www/vpn_pppoe.php:134
+msgid "delete pppoe instance"
+msgstr "apagar instância pppoe"
+
+#: usr/local/www/load_balancer_monitor_edit.php:66
+msgid "Load Balancer: Monitor:"
+msgstr "Balanceados de Carga: Monitor:"
+
+#: usr/local/www/load_balancer_monitor_edit.php:95
+msgid "This monitor name has already been used. Monitor names must be unique."
+msgstr "Esse nome de monitor já foi usado. Nomes de monitores devem ser únicos."
+
+#: usr/local/www/load_balancer_monitor_edit.php:98
+#: usr/local/www/load_balancer_pool_edit.php:86
+#: usr/local/www/load_balancer_virtual_server_edit.php:89
+#: usr/local/www/load_balancer_relay_action_edit.php:127
+#: usr/local/www/load_balancer_relay_protocol_edit.php:89
+msgid "You cannot use spaces in the 'name' field."
+msgstr "Você não pode usar espaços no campo 'nome'."
+
+#: usr/local/www/load_balancer_monitor_edit.php:112
+#: usr/local/www/services_dhcp_edit.php:118
+#: usr/local/www/services_dnsmasq_edit.php:85
+#: usr/local/www/services_dhcpv6_edit.php:115
+#: usr/local/www/services_dnsmasq_edit.php:86
+#: usr/local/www/services_dhcpv6_edit.php:117
+#: usr/local/www/services_dhcp_edit.php:120
+#: usr/local/www/services_dhcpv6_edit.php:120
+#: usr/local/www/services_dhcp_edit.php:154
+msgid "The hostname can only contain the characters A-Z, 0-9 and '-'."
+msgstr "O nome do host somente pode conter os caracteres de A-Z, 0-9 e '-'."
+
+#: usr/local/www/load_balancer_monitor_edit.php:118
+msgid "HTTP(s) codes must be from RFC2616."
+msgstr "Código(s) HTTP devem ser da RFC2616."
+
+#: usr/local/www/load_balancer_monitor_edit.php:122
+msgid "The path to monitor must be set."
+msgstr "O caminho para o monitor deve ser configurado."
+
+#: usr/local/www/load_balancer_monitor_edit.php:145
+#, php-format
+msgid "modified '%s' monitor:"
+msgstr "monitor '%s' modificado:"
+
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_monitor_edit.php:197
+msgid "ICMP"
+msgstr "ICMP"
+
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_monitor_edit.php:268
+#: usr/local/www/load_balancer_relay_action_edit.php:186
+#: usr/local/www/load_balancer_relay_protocol_edit.php:144
+#: usr/local/www/system_advanced_admin.php:311
+#: usr/local/www/load_balancer_relay_protocol_edit.php:142
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:266
+#: usr/local/www/system_advanced_admin.php:332
+msgid "HTTP"
+msgstr "HTTP"
+
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_monitor_edit.php:301
+#: usr/local/www/system_advanced_admin.php:314
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:299
+#: usr/local/www/system_advanced_admin.php:335
+msgid "HTTPS"
+msgstr "HTTPS"
+
+#: usr/local/www/load_balancer_monitor_edit.php:199
+#: usr/local/www/load_balancer_monitor_edit.php:335
+#: usr/local/www/load_balancer_monitor_edit.php:197
+#: usr/local/www/load_balancer_monitor_edit.php:333
+msgid "Send/Expect"
+msgstr "Enviar/Esperar"
+
+#: usr/local/www/load_balancer_monitor_edit.php:232
+#: usr/local/www/load_balancer_monitor_edit.php:230
+msgid "Edit Load Balancer - Monitor entry"
+msgstr "Editar Balanceador de Carga - entrada de Monitor"
+
+#: usr/local/www/load_balancer_monitor_edit.php:272
+#: usr/local/www/load_balancer_monitor_edit.php:305
+#: usr/local/www/load_balancer_monitor_edit.php:270
+#: usr/local/www/load_balancer_monitor_edit.php:303
+msgid "Path"
+msgstr "Caminho"
+
+#: usr/local/www/load_balancer_monitor_edit.php:278
+#: usr/local/www/load_balancer_monitor_edit.php:311
+#: usr/local/www/diag_ping.php:55 usr/local/www/diag_ping.php:90
+#: usr/local/www/services_dnsmasq.php:243
+#: usr/local/www/services_dnsmasq_edit.php:141
+#: usr/local/www/diag_traceroute.php:62 usr/local/www/diag_traceroute.php:89
+#: usr/local/www/services_rfc2136_edit.php:169
+#: usr/local/www/services_dnsmasq_edit.php:196
+#: usr/local/www/services_dnsmasq_edit.php:237
+#: usr/local/www/services_unbound.php:279
+#: usr/local/www/services_dnsmasq.php:244
+#: usr/local/www/services_dnsmasq_edit.php:197
+#: usr/local/www/services_dnsmasq_edit.php:238
+#: usr/local/www/load_balancer_monitor_edit.php:276
+#: usr/local/www/load_balancer_monitor_edit.php:309
+#: usr/local/www/diag_testport.php:60 usr/local/www/diag_testport.php:117
+#: usr/local/www/diag_traceroute.php:93 usr/local/www/services_dnsmasq.php:269
+#: usr/local/www/diag_traceroute.php:63 usr/local/www/diag_traceroute.php:99
+#: usr/local/www/diag_ping.php:57 usr/local/www/diag_ping.php:97
+#: usr/local/www/services_dnsmasq.php:282
+#: usr/local/www/services_dnsmasq.php:346
+#: usr/local/www/services_rfc2136_edit.php:174
+msgid "Host"
+msgstr "Host"
+
+#: usr/local/www/load_balancer_monitor_edit.php:280
+#: usr/local/www/load_balancer_monitor_edit.php:313
+#: usr/local/www/load_balancer_monitor_edit.php:278
+#: usr/local/www/load_balancer_monitor_edit.php:311
+msgid "Hostname for Host: header if needed."
+msgstr "Nome de host para Host: adicionar cabeçalho se necessário."
+
+#: usr/local/www/load_balancer_monitor_edit.php:284
+#: usr/local/www/load_balancer_monitor_edit.php:317
+#: usr/local/www/load_balancer_monitor_edit.php:282
+#: usr/local/www/load_balancer_monitor_edit.php:315
+msgid "HTTP Code"
+msgstr "Código HTTP"
+
+#: usr/local/www/load_balancer_monitor_edit.php:339
+#: usr/local/www/load_balancer_monitor_edit.php:337
+msgid "Send string"
+msgstr "Enviar string"
+
+#: usr/local/www/load_balancer_monitor_edit.php:345
+#: usr/local/www/load_balancer_monitor_edit.php:343
+msgid "Expect string"
+msgstr "Esperar por string"
+
+#: usr/local/www/load_balancer_pool_edit.php:65
+msgid "Load Balancer: Pool:"
+msgstr "Balanceador de Carga: Pool:"
+
+#: usr/local/www/load_balancer_pool_edit.php:76
+msgid "Server List"
+msgstr "Lista de Servidor"
+
+#: usr/local/www/load_balancer_pool_edit.php:83
+msgid "This pool name has already been used. Pool names must be unique."
+msgstr "Esse nome de pool já foi usado. Nomes de pool devem ser únicos."
+
+#: usr/local/www/load_balancer_pool_edit.php:89
+#: usr/local/www/load_balancer_virtual_server_edit.php:92
+msgid "The port must be an integer between 1 and 65535."
+msgstr "A porta deve ser um inteiro entre 1 e 65535."
+
+#: usr/local/www/load_balancer_pool_edit.php:93
+msgid "The retry value must be an integer between 1 and 65535."
+msgstr "O valor de retorno deve ser um inteiro entre 1 e 65535."
+
+#: usr/local/www/load_balancer_pool_edit.php:98
+#, php-format
+msgid "%s is not a valid IP address (in \"enabled\" list)."
+msgstr "%s não é um endereço IP válido (na lista de \"habilitados\")."
+
+#: usr/local/www/load_balancer_pool_edit.php:105
+#, php-format
+msgid "%s is not a valid IP address (in \"disabled\" list)."
+msgstr "%s não é um endereço IP válido (na lista de \"desabilitados\")."
+
+#: usr/local/www/load_balancer_pool_edit.php:114
+#: usr/local/www/load_balancer_pool_edit.php:120
+msgid "Invalid monitor chosen."
+msgstr "Monitor escolhido inválido."
+
+#: usr/local/www/load_balancer_pool_edit.php:121
+#: usr/local/www/load_balancer_pool_edit.php:127
+#, php-format
+msgid " modified '%s' pool:"
+msgstr " pool '%s' modificado:"
+
+#: usr/local/www/load_balancer_pool_edit.php:178
+#: usr/local/www/load_balancer_pool_edit.php:186
+#: usr/local/www/load_balancer_pool_edit.php:184
+msgid "Add/edit Load Balancer - Pool entry"
+msgstr "Adicionar/editar Balanceador de Carga - entrada do Pool"
+
+#: usr/local/www/load_balancer_pool_edit.php:190
+#: usr/local/www/load_balancer_pool_edit.php:198
+#: usr/local/www/load_balancer_pool_edit.php:196
+msgid "Load Balance"
+msgstr "Balancear Carga"
+
+#: usr/local/www/load_balancer_pool_edit.php:191
+#: usr/local/www/load_balancer_pool_edit.php:199
+#: usr/local/www/load_balancer_pool_edit.php:197
+msgid "Manual Failover"
+msgstr "Failover manual"
+
+#: usr/local/www/load_balancer_pool_edit.php:206
+#: usr/local/www/load_balancer_pool_edit.php:215
+#: usr/local/www/load_balancer_pool_edit.php:213
+msgid "This is the port your servers are listening on."
+msgstr "Essa é a porta em que seus servidores estão lendo."
+
+#: usr/local/www/load_balancer_pool_edit.php:210
+#: usr/local/www/load_balancer_pool_edit.php:227
+#: usr/local/www/load_balancer_pool_edit.php:225
+msgid "Retry"
+msgstr "Retorno"
+
+#: usr/local/www/load_balancer_pool_edit.php:213
+#: usr/local/www/load_balancer_pool_edit.php:230
+#: usr/local/www/load_balancer_pool_edit.php:228
+msgid "Optionally specify how many times to retry checking a server before declaring it down."
+msgstr "Opcionalmente, especifique quantas vezes verificar o servidor antes de declará-lo inoperante."
+
+#: usr/local/www/load_balancer_pool_edit.php:220
+#: usr/local/www/load_balancer_pool_edit.php:237
+#: usr/local/www/load_balancer_pool_edit.php:235
+msgid "Add item to pool"
+msgstr "Adicione item no pool"
+
+#: usr/local/www/load_balancer_pool_edit.php:238
+#: usr/local/www/load_balancer_pool_edit.php:255
+#: usr/local/www/load_balancer_pool_edit.php:253
+msgid "Please add a monitor IP address on the monitors tab if you wish to use this feature."
+msgstr "Por favor, adicione um endereço IP monitor na aba de monitores se desejar usar essa funcionalidade."
+
+#: usr/local/www/load_balancer_pool_edit.php:244
+#: usr/local/www/load_balancer_pool_edit.php:261
+#: usr/local/www/load_balancer_pool_edit.php:259
+msgid "Server IP Address"
+msgstr "Endereço IP do Servidor"
+
+#: usr/local/www/load_balancer_pool_edit.php:247
+#: usr/local/www/load_balancer_pool_edit.php:264
+#: usr/local/www/load_balancer_pool_edit.php:262
+msgid "Add to pool"
+msgstr "Adicionar ao pool"
+
+#: usr/local/www/load_balancer_pool_edit.php:254
+#: usr/local/www/load_balancer_pool_edit.php:271
+#: usr/local/www/load_balancer_pool_edit.php:269
+msgid "Current Pool Members"
+msgstr "Membros atuais do Pool"
+
+#: usr/local/www/load_balancer_pool_edit.php:264
+#: usr/local/www/load_balancer_pool_edit.php:281
+#: usr/local/www/load_balancer_pool_edit.php:279
+msgid "Pool Disabled"
+msgstr "Pool Desabilitada"
+
+#: usr/local/www/load_balancer_pool_edit.php:277
+#: usr/local/www/load_balancer_pool_edit.php:300
+#: usr/local/www/load_balancer_relay_protocol_edit.php:253
+#: usr/local/www/load_balancer_pool_edit.php:294
+#: usr/local/www/load_balancer_pool_edit.php:317
+#: usr/local/www/load_balancer_relay_protocol_edit.php:251
+#: usr/local/www/load_balancer_pool_edit.php:292
+#: usr/local/www/load_balancer_pool_edit.php:315
+msgid "Remove"
+msgstr "Remover"
+
+#: usr/local/www/load_balancer_pool_edit.php:287
+#: usr/local/www/load_balancer_pool_edit.php:304
+#: usr/local/www/load_balancer_pool_edit.php:302
+msgid "Enabled (default)"
+msgstr "Habilitar (padrão)"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:61
+msgid "Load Balancer: Virtual Server:"
+msgstr "Balanceador de Carga: Servidor Virtual:"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:77
+#: usr/local/www/load_balancer_virtual_server_edit.php:261
+#: usr/local/www/load_balancer_relay_protocol.php:100
+#: usr/local/www/load_balancer_relay_protocol_edit.php:137
+#: usr/local/www/load_balancer_virtual_server_edit.php:250
+#: usr/local/www/load_balancer_virtual_server_edit.php:248
+msgid "Relay Protocol"
+msgstr "Protocolo Relay"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:86
+msgid "This virtual server name has already been used. Virtual server names must be unique."
+msgstr "O nome do servidor virtual já está sendo usado. Nomes de servidores virtuais devem ser únicos."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:95
+#, php-format
+msgid "%s is not a valid IP address."
+msgstr "%s não é um endereço IP válido."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:102
+#: usr/local/www/load_balancer_virtual_server_edit.php:104
+#, php-format
+msgid "modified '%s' vs:"
+msgstr "servidor virtual '%s' modificado:"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:104
+#: usr/local/www/load_balancer_virtual_server_edit.php:106
+#, php-format
+msgid "created '%s' vs:"
+msgstr "servidor virtual '%s' criado:"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:134
+#: usr/local/www/status_lb_vs.php:56
+#: usr/local/www/load_balancer_virtual_server_edit.php:136
+msgid "Virtual Server"
+msgstr "Servidor Virtual"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:180
+#: usr/local/www/load_balancer_virtual_server_edit.php:154
+#: usr/local/www/load_balancer_virtual_server_edit.php:152
+msgid "Edit Load Balancer - Virtual Server entry"
+msgstr "Editar Balanceador de Carga - entrada de Servidor Virtual"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:198
+#: usr/local/www/load_balancer_virtual_server_edit.php:172
+#: usr/local/www/load_balancer_virtual_server_edit.php:170
+msgid "This is normally the WAN IP address that you would like the server to listen on. All connections to this IP and port will be forwarded to the pool cluster."
+msgstr "Isso é, normalmente, o endereço IP WAN em que você gostaria que o servidor lesse. Toas as conexões para esse IP e porta serão encaminhadas para o cluster de pool."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:205
+#: usr/local/www/load_balancer_virtual_server_edit.php:186
+#: usr/local/www/load_balancer_virtual_server_edit.php:184
+msgid "This is the port that the clients will connect to. All connections to this port will be forwarded to the pool cluster."
+msgstr "Essa é a porta na qual os clientes irão conectar. Todas as conexões nessa porta serão encaminhadas para o cluster de pool."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:209
+#: usr/local/www/load_balancer_virtual_server_edit.php:198
+#: usr/local/www/load_balancer_virtual_server_edit.php:196
+msgid "Virtual Server Pool"
+msgstr "Pool de Servidor Virtual"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:212
+#: usr/local/www/load_balancer_virtual_server_edit.php:231
+#: usr/local/www/load_balancer_virtual_server_edit.php:201
+#: usr/local/www/load_balancer_virtual_server_edit.php:220
+#: usr/local/www/load_balancer_virtual_server_edit.php:199
+#: usr/local/www/load_balancer_virtual_server_edit.php:218
+msgid "Please add a pool on the Pools tab to use this feature."
+msgstr "Por favor, adicione um pool na aba de Pools para usar essa funcionalidade."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:244
+#: usr/local/www/load_balancer_virtual_server_edit.php:233
+#: usr/local/www/load_balancer_virtual_server_edit.php:231
+msgid "This is the server that clients will be redirected to if *ALL* servers in the pool are offline."
+msgstr "Esse é o servidor para o qual os clientes serão redirecionados de *TODOS* os servidores no pool estiverem desligados."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:279
+#: usr/local/www/status_captiveportal_test.php:92
+#: usr/local/www/load_balancer_virtual_server_edit.php:268
+#: usr/local/www/status_captiveportal_test.php:93
+#: usr/local/www/load_balancer_virtual_server_edit.php:266
+#: usr/local/www/status_captiveportal_expire.php:92
+#: usr/local/www/status_captiveportal_test.php:94
+msgid "Submit"
+msgstr "Submeter"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:289
+#: usr/local/www/load_balancer_virtual_server_edit.php:278
+#: usr/local/www/load_balancer_virtual_server_edit.php:276
+msgid "Don't forget to add a firewall rule for the virtual server/pool after you're finished setting it up."
+msgstr "Não esqueça de adicionar uma regra de firewall para o servidor/pool virtual depois que finalizar as configurações."
+
+#: usr/local/www/pkg_mgr.php:70 usr/local/www/pkg_mgr.php:82
+#, php-format
+msgid "Unable to retrieve package info from %s. Cached data will be used."
+msgstr "Incapaz de obter info de pacote de %s. Dados em cache serão usados."
+
+#: usr/local/www/pkg_mgr.php:73 usr/local/www/pkg_mgr.php:85
+#, php-format
+msgid "Unable to communicate with %1$s. Please verify DNS and interface configuration, and that %2$s has functional Internet connectivity."
+msgstr "Incapaz de comunicar-se com %1$s. Por favor, verifique a configuração de DNS e interface, e que %2$s tem conectividade com Internet em funcionamento."
+
+#: usr/local/www/pkg_mgr.php:122 usr/local/www/pkg_mgr.php:216
+#: usr/local/www/pkg_mgr.php:137 usr/local/www/pkg_mgr.php:243
+#: usr/local/www/pkg_mgr.php:246 usr/local/www/pkg_mgr.php:140
+#: usr/local/www/pkg_mgr.php:249
+msgid "There are currently no packages available for installation."
+msgstr "Atualmente não há pacotes disponíveis para instalação."
+
+#: usr/local/www/pkg_mgr.php:192 usr/local/www/pkg_mgr.php:228
+#: usr/local/www/pkg_mgr.php:231
+msgid "platform"
+msgstr "plataforma"
+
+#: usr/local/www/pkg_mgr.php:210
+msgid "Do you really want to install this package?"
+msgstr "Você realmente deseja instalar esse pacote?"
+
+#: usr/local/www/pkg_mgr_install.php:57 usr/local/www/pkg_mgr_install.php:55
+msgid "Install Package"
+msgstr "Instalar Pacote"
+
+#: usr/local/www/pkg_mgr_install.php:72 usr/local/www/pkg_mgr_install.php:70
+msgid "Available packages"
+msgstr "Pacotes disponíveis"
+
+#: usr/local/www/pkg_mgr_install.php:75 usr/local/www/pkg_mgr_install.php:73
+msgid "Installed packages"
+msgstr "Pacotes instalados"
+
+#: usr/local/www/pkg_mgr_install.php:76 usr/local/www/pkg_mgr_install.php:74
+msgid "Package Installer"
+msgstr "Instalador de Pacote"
+
+#: usr/local/www/pkg_mgr_install.php:124 usr/local/www/pkg_mgr_install.php:134
+#: usr/local/www/pkg_mgr_install.php:132 usr/local/www/pkg_mgr_install.php:128
+msgid "Creating restore point before package installation."
+msgstr "Criando ponto de restauração antes da instalação do pacote."
+
+#: usr/local/www/pkg_mgr_install.php:132 usr/local/www/pkg_mgr_install.php:133
+#: usr/local/www/pkg_mgr_install.php:141 usr/local/www/pkg_mgr_install.php:142
+#: usr/local/www/pkg_mgr_install.php:139 usr/local/www/pkg_mgr_install.php:140
+#: usr/local/www/pkg_mgr_install.php:135 usr/local/www/pkg_mgr_install.php:136
+msgid "Package deleted."
+msgstr "Pacote apagado."
+
+#: usr/local/www/pkg_mgr_install.php:147 usr/local/www/pkg_mgr_install.php:148
+#: usr/local/www/pkg_mgr_install.php:156 usr/local/www/pkg_mgr_install.php:157
+#: usr/local/www/pkg_mgr_install.php:154 usr/local/www/pkg_mgr_install.php:155
+#: usr/local/www/pkg_mgr_install.php:150 usr/local/www/pkg_mgr_install.php:151
+msgid "Package reinstallation failed."
+msgstr "Reinstalação do pacote falhou."
+
+#: usr/local/www/pkg_mgr_install.php:151 usr/local/www/pkg_mgr_install.php:152
+#: usr/local/www/pkg_mgr_install.php:160 usr/local/www/pkg_mgr_install.php:161
+#: usr/local/www/pkg_mgr_install.php:158 usr/local/www/pkg_mgr_install.php:159
+#: usr/local/www/pkg_mgr_install.php:154 usr/local/www/pkg_mgr_install.php:155
+msgid "Package reinstalled."
+msgstr "Pacote reinstalado."
+
+#: usr/local/www/pkg_mgr_install.php:163 usr/local/www/pkg_mgr_install.php:172
+#: usr/local/www/pkg_mgr_install.php:170 usr/local/www/pkg_mgr_install.php:166
+msgid "installation completed."
+msgstr "instalação completa."
+
+#: usr/local/www/pkg_mgr_install.php:166 usr/local/www/pkg_mgr_install.php:175
+#: usr/local/www/pkg_mgr_install.php:173 usr/local/www/pkg_mgr_install.php:169
+#, php-format
+msgid "Could not find %s."
+msgstr "Não pôde encontrar %s."
+
+#: usr/local/www/pkg_mgr_install.php:182 usr/local/www/pkg_mgr_install.php:183
+#: usr/local/www/pkg_mgr_install.php:191 usr/local/www/pkg_mgr_install.php:192
+#: usr/local/www/pkg_mgr_install.php:188 usr/local/www/pkg_mgr_install.php:189
+#: usr/local/www/pkg_mgr_install.php:184 usr/local/www/pkg_mgr_install.php:185
+msgid "All packages reinstalled."
+msgstr "Todos os pacotes reinstalados."
+
+#: usr/local/www/pkg_mgr_install.php:190 usr/local/www/pkg_mgr_install.php:194
+#: usr/local/www/pkg_mgr_install.php:200 usr/local/www/pkg_mgr_install.php:204
+#: usr/local/www/pkg_mgr_install.php:199 usr/local/www/pkg_mgr_install.php:203
+#: usr/local/www/pkg_mgr_install.php:195
+msgid "Installation of"
+msgstr "Instalação de"
+
+#: usr/local/www/pkg_mgr_install.php:190 usr/local/www/pkg_mgr_install.php:200
+#: usr/local/www/pkg_mgr_install.php:199 usr/local/www/pkg_mgr_install.php:195
+msgid "FAILED!"
+msgstr "FALHOU!"
+
+#: usr/local/www/pkg_mgr_install.php:191 usr/local/www/pkg_mgr_install.php:201
+#: usr/local/www/pkg_mgr_install.php:200 usr/local/www/pkg_mgr_install.php:196
+msgid "Installation halted."
+msgstr "Instalação interrompida."
+
+#: usr/local/www/pkg_mgr_install.php:194 usr/local/www/pkg_mgr_install.php:204
+#: usr/local/www/pkg_mgr_install.php:203 usr/local/www/pkg_mgr_install.php:199
+msgid "completed."
+msgstr "completa."
+
+#: usr/local/www/pkg_mgr_install.php:198 usr/local/www/pkg_mgr_install.php:208
+#: usr/local/www/pkg_mgr_install.php:207 usr/local/www/pkg_mgr_install.php:203
+msgid "Installation completed."
+msgstr "Instalação completa."
+
+#: usr/local/www/pkg_mgr_install.php:198 usr/local/www/pkg_mgr_install.php:208
+#: usr/local/www/pkg_mgr_install.php:207 usr/local/www/pkg_mgr_install.php:203
+msgid "setup instructions"
+msgstr "instruções de instalação"
+
+#: usr/local/www/pkg_mgr_install.php:200 usr/local/www/pkg_mgr_install.php:210
+#: usr/local/www/pkg_mgr_install.php:209 usr/local/www/pkg_mgr_install.php:205
+msgid "Installation completed. Please check to make sure that the package is configured from the respective menu then start the package."
+msgstr "Instalação completa. Por favor, verifique para ter certeza de que o pacote está configurado no respectivo menu e então inicie o pacote."
+
+#: usr/local/www/preload.php:6
+msgid "You are not allowed to access this page."
+msgstr "Você não tem permissão de acessar essa página."
+
+#: usr/local/www/progress.php:25 usr/local/www/progress.php:22
+msgid "Invalid Meter ID"
+msgstr "ID de Medida inválido"
+
+#: usr/local/www/progress.php:46 usr/local/www/progress.php:43
+msgid "UPLOAD completed"
+msgstr "UPLOAD completo"
+
+#: usr/local/www/progress.php:58 usr/local/www/progress.php:55
+msgid "Uploading Files... Please wait..."
+msgstr "Carregando arquivos... por favor aguarde..."
+
+#: usr/local/www/progress.php:68 usr/local/www/progress.php:65
+msgid "Uploading files..."
+msgstr "Carregando arquivos..."
+
+#: usr/local/www/progress.php:87 usr/local/www/progress.php:84
+msgid "Time Remaining:"
+msgstr "Tempo restante:"
+
+#: usr/local/www/progress.php:88 usr/local/www/progress.php:85
+msgid "Speed:"
+msgstr "Velocidade:"
+
+#: usr/local/www/progress.php:88 usr/local/www/progress.php:85
+msgid "KB/sec"
+msgstr "KB/sec"
+
+#: usr/local/www/progress.php:92 usr/local/www/progress.php:89
+msgid "Uploaded:"
+msgstr "Carregado:"
+
+#: usr/local/www/progress.php:93 usr/local/www/progress.php:90
+msgid "File Size:"
+msgstr "Tamanho do Arquivo:"
+
+#: usr/local/www/progress.php:97 usr/local/www/progress.php:94
+msgid "Completed:"
+msgstr "Completo:"
+
+#: usr/local/www/diag_dns.php:34 usr/local/www/diag_dns.php:250
+#: usr/local/www/fbegin.inc:192 usr/local/www/fbegin.inc:210
+#: usr/local/www/diag_dns.php:249 usr/local/www/fbegin.inc:218
+#: usr/local/www/fbegin.inc:209 usr/local/www/diag_dns.php:266
+msgid "DNS Lookup"
+msgstr "DNS Lookup"
+
+#: usr/local/www/diag_dns.php:100
+msgid "Host must be a valid hostname or IP address."
+msgstr "Host deve ser um hostname ou endereço IP válido."
+
+#: usr/local/www/diag_dns.php:110 usr/local/www/diag_dns.php:109
+msgid "No response"
+msgstr "Sem resposta"
+
+#: usr/local/www/diag_dns.php:143 usr/local/www/diag_dns.php:142
+msgid "No record found"
+msgstr "Nenhum registro encontrado"
+
+#: usr/local/www/diag_dns.php:158 usr/local/www/diag_dns.php:157
+#: usr/local/www/diag_dns.php:174
+msgid "Resolve DNS hostname or IP"
+msgstr "Resolva nome de host de DNS ou IP"
+
+#: usr/local/www/diag_dns.php:161 usr/local/www/system_authservers.php:162
+#: usr/local/www/system_authservers.php:185 usr/local/www/diag_dns.php:160
+#: usr/local/www/system_authservers.php:163
+#: usr/local/www/system_authservers.php:186
+#: usr/local/www/system_authservers.php:164
+#: usr/local/www/system_authservers.php:187 usr/local/www/diag_dns.php:177
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:189
+msgid "Hostname or IP"
+msgstr "Hostname ou IP"
+
+#: usr/local/www/diag_dns.php:203 usr/local/www/diag_dns.php:202
+#: usr/local/www/diag_dns.php:219
+msgid "Resolution time per server"
+msgstr "Tempo de resolução por servidor"
+
+#: usr/local/www/diag_dns.php:211 usr/local/www/diag_dns.php:210
+#: usr/local/www/diag_dns.php:227
+msgid "Query time"
+msgstr "Tempo de consulta"
+
+#: usr/local/www/diag_dns.php:235 usr/local/www/diag_dns.php:234
+#: usr/local/www/diag_dns.php:251
+msgid "More Information:"
+msgstr "Mais informação:"
+
+#: usr/local/www/diag_dns.php:237 usr/local/www/diag_ping.php:43
+#: usr/local/www/diag_ping.php:87 usr/local/www/diag_ping.php:119
+#: usr/local/www/fbegin.inc:200 usr/local/www/fbegin.inc:218
+#: usr/local/www/diag_dns.php:236 usr/local/www/fbegin.inc:226
+#: usr/local/www/fbegin.inc:217 usr/local/www/diag_ping.php:44
+#: usr/local/www/diag_ping.php:94 usr/local/www/diag_ping.php:141
+#: usr/local/www/diag_dns.php:253
+msgid "Ping"
+msgstr "Ping"
+
+#: usr/local/www/diag_dns.php:238 usr/local/www/diag_traceroute.php:45
+#: usr/local/www/diag_traceroute.php:86 usr/local/www/diag_traceroute.php:112
+#: usr/local/www/fbegin.inc:209 usr/local/www/fbegin.inc:227
+#: usr/local/www/diag_dns.php:237 usr/local/www/fbegin.inc:236
+#: usr/local/www/diag_traceroute.php:90 usr/local/www/diag_traceroute.php:136
+#: usr/local/www/fbegin.inc:228 usr/local/www/diag_traceroute.php:46
+#: usr/local/www/diag_traceroute.php:96 usr/local/www/diag_traceroute.php:155
+#: usr/local/www/diag_dns.php:254
+msgid "Traceroute"
+msgstr "Traceroute"
+
+#: usr/local/www/diag_dns.php:240 usr/local/www/diag_dns.php:239
+#: usr/local/www/diag_dns.php:256
+msgid "NOTE: The following links are to external services, so their reliability cannot be guaranteed."
+msgstr "NOTA: Os seguintes links são para serviços externos, assim a sua confiabilidade não pode ser garantida."
+
+#: usr/local/www/diag_dns.php:241 usr/local/www/diag_dns.php:240
+#: usr/local/www/diag_dns.php:257
+msgid "IP WHOIS @ DNS Stuff"
+msgstr "IP WHOIS @ DNS Stuff"
+
+#: usr/local/www/diag_dns.php:242 usr/local/www/diag_dns.php:241
+#: usr/local/www/diag_dns.php:258
+msgid "IP Info @ DNS Stuff"
+msgstr "IP Info @ DNS Stuff"
+
+#: usr/local/www/reboot.php:44
+msgid " Yes "
+msgstr " Sim"
+
+#: usr/local/www/reboot.php:45 usr/local/www/reboot.php:76
+#: usr/local/www/reboot.php:56
+msgid "The system is rebooting now. This may take one minute."
+msgstr "O sistema está reiniciando agora. Isso pode levar alguns minutos."
+
+#: usr/local/www/reboot.php:51 usr/local/www/reboot.php:48
+msgid "Reboot System"
+msgstr "Reiniciar Sistema"
+
+#: usr/local/www/reboot.php:59 usr/local/www/reboot.php:62
+msgid "Are you sure you want to reboot the system?"
+msgstr "Você tem certeza que deseja reiniciar o sistema?"
+
+#: usr/local/www/restart_httpd.php:42
+msgid "Restarting httpd"
+msgstr "Reiniciando httpd"
+
+#: usr/local/www/restart_httpd.php:50
+msgid "Mounting file systems read/write"
+msgstr "Montando sistema de arquivos leitura/escrita"
+
+#: usr/local/www/restart_httpd.php:53
+msgid "Forcing all PHP file permissions to 0755"
+msgstr "Forçando todas as permissões de arquivos PHP para 0755"
+
+#: usr/local/www/restart_httpd.php:56
+msgid "Mounting file systems read only"
+msgstr "Montando sistema de arquivo de somente leitura"
+
+#: usr/local/www/restart_httpd.php:59
+msgid "Restarting mini_httpd"
+msgstr "Reiniciando mimi-httpd"
+
+#: usr/local/www/edit.php:39 usr/local/www/edit.php:42
+#: usr/local/www/edit.php:41
+msgid "Edit file"
+msgstr "Editar arquivo"
+
+#: usr/local/www/edit.php:46 usr/local/www/edit.php:62
+#: usr/local/www/edit.php:49 usr/local/www/edit.php:65
+#: usr/local/www/edit.php:48
+msgid "No file name specified"
+msgstr "Nenhum nome de arquivo foi especificado"
+
+#: usr/local/www/edit.php:48 usr/local/www/edit.php:51
+#: usr/local/www/edit.php:50
+msgid "Loading a directory is not supported"
+msgstr "Carregar um diretório não é suportado"
+
+#: usr/local/www/edit.php:50 usr/local/www/edit.php:53
+#: usr/local/www/edit.php:52
+msgid "File does not exist or is not a regular file"
+msgstr "O arquivo não existe ou não é um arquivo regular"
+
+#: usr/local/www/edit.php:54 usr/local/www/edit.php:57
+#: usr/local/www/edit.php:56
+msgid "Failed to read file"
+msgstr "Falha ao ler o arquivo"
+
+#: usr/local/www/edit.php:74 usr/local/www/edit.php:77
+msgid "Failed to write file"
+msgstr "Falha ao escrever o arquivo"
+
+#: usr/local/www/edit.php:76 usr/local/www/edit.php:79
+msgid "Error while writing file"
+msgstr "Erro durante a gravação do arquivo"
+
+#: usr/local/www/edit.php:78 usr/local/www/edit.php:81
+msgid "File successfully saved"
+msgstr "Arquivo salvo com sucesso"
+
+#: usr/local/www/edit.php:98 usr/local/www/edit.php:101
+msgid "Loading file"
+msgstr "Carregando arquivo"
+
+#: usr/local/www/edit.php:117 usr/local/www/edit.php:120
+#: usr/local/www/edit.php:121
+msgid "File successfully loaded"
+msgstr "Arquivo carregado com sucesso"
+
+#: usr/local/www/edit.php:140 usr/local/www/edit.php:143
+#: usr/local/www/edit.php:144
+msgid "Saving file"
+msgstr "Salvando arquivo"
+
+#: usr/local/www/edit.php:177 usr/local/www/edit.php:180
+#: usr/local/www/edit.php:181
+msgid "Save / Load from path"
+msgstr "Salvar / Carregar do caminho"
+
+#: usr/local/www/edit.php:179 usr/local/www/edit.php:182
+#: usr/local/www/edit.php:183
+msgid "Load"
+msgstr "Carregar"
+
+#: usr/local/www/edit.php:180 usr/local/www/edit.php:183
+#: usr/local/www/edit.php:184
+msgid "Browse"
+msgstr "Navegar"
+
+#: usr/local/www/services_captiveportal.php:63
+#: usr/local/www/services_captiveportal_filemanager.php:75
+#: usr/local/www/services_captiveportal_filemanager.php:150
+#: usr/local/www/services_captiveportal_ip.php:64
+#: usr/local/www/services_captiveportal_ip.php:104
+#: usr/local/www/services_captiveportal_ip_edit.php:63
+#: usr/local/www/services_captiveportal_mac.php:63
+#: usr/local/www/services_captiveportal_mac.php:154
+#: usr/local/www/services_captiveportal_mac_edit.php:60
+#: usr/local/www/services_captiveportal_hostname.php:66
+#: usr/local/www/services_captiveportal_hostname.php:109
+#: usr/local/www/services_captiveportal_hostname_edit.php:62
+#: usr/local/www/services_captiveportal_vouchers.php:85
+#: usr/local/www/services_captiveportal_vouchers.php:403
+#: usr/local/www/services_captiveportal_vouchers_edit.php:48
+#: usr/local/www/status_captiveportal_test.php:58
+#: usr/local/www/status_captiveportal_voucher_rolls.php:57
+#: usr/local/www/status_captiveportal_vouchers.php:57
+#: usr/local/www/services_captiveportal_zones_edit.php:48
+#: usr/local/www/services_captiveportal_vouchers.php:410
+#: usr/local/www/services_captiveportal_vouchers.php:82
+#: usr/local/www/services_captiveportal_vouchers.php:423
+#: usr/local/www/services_captiveportal_vouchers_edit.php:45
+#: usr/local/www/services_captiveportal_ip.php:61
+#: usr/local/www/services_captiveportal_ip.php:102
+#: usr/local/www/services_captiveportal_hostname_edit.php:59
+#: usr/local/www/services_captiveportal_mac.php:60
+#: usr/local/www/services_captiveportal_mac.php:152
+#: usr/local/www/services_captiveportal_mac_edit.php:57
+#: usr/local/www/services_captiveportal_hostname.php:63
+#: usr/local/www/services_captiveportal_hostname.php:107
+#: usr/local/www/services_captiveportal.php:60
+#: usr/local/www/services_captiveportal_filemanager.php:71
+#: usr/local/www/services_captiveportal_filemanager.php:147
+#: usr/local/www/services_captiveportal_ip_edit.php:60
+#: usr/local/www/services_captiveportal_zones_edit.php:45
+#: usr/local/www/status_captiveportal_expire.php:58
+#: usr/local/www/services_captiveportal_vouchers.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:432
+#: usr/local/www/services_captiveportal_mac.php:162
+#: usr/local/www/services_captiveportal_vouchers.php:437
+msgid "Captive portal"
+msgstr "Portal Captive"
+
+#: usr/local/www/services_captiveportal.php:146
+#: usr/local/www/services_captiveportal_zones_edit.php:61
+#: usr/local/www/services_captiveportal_zones_edit.php:99
+#: usr/local/www/services_captiveportal.php:147
+#: usr/local/www/services_captiveportal.php:153
+#: usr/local/www/services_captiveportal_zones_edit.php:59
+#: usr/local/www/services_captiveportal_zones_edit.php:101
+#: usr/local/www/services_captiveportal_zones_edit.php:97
+#: usr/local/www/services_captiveportal.php:155
+msgid "Zone name"
+msgstr "Nome da Zona"
+
+#: usr/local/www/services_captiveportal.php:154
+#: usr/local/www/services_captiveportal.php:155
+#: usr/local/www/services_captiveportal.php:161
+#: usr/local/www/services_captiveportal.php:163
+#, php-format
+msgid "The captive portal cannot be used on interface %s since it is part of a bridge."
+msgstr "O portal captive não pode ser usado na interface %s já que ela faz parte de uma ponte."
+
+#: usr/local/www/services_captiveportal.php:158
+#: usr/local/www/services_captiveportal.php:159
+#: usr/local/www/services_captiveportal.php:165
+#: usr/local/www/services_captiveportal.php:167
+#, php-format
+msgid "The captive portal cannot be used on interface %s since it is used already on %s instance."
+msgstr "O Captive Portal não pode ser usado na interface %s já que ele está sendo usado na instância %s."
+
+#: usr/local/www/services_captiveportal.php:166
+#: usr/local/www/services_captiveportal.php:167
+msgid "Certificate and key must be specified for HTTPS login."
+msgstr "Certificado e chave devem ser especificados para o login HTTPS."
+
+#: usr/local/www/services_captiveportal.php:169
+#: usr/local/www/system_camanager.php:168
+#: usr/local/www/system_certmanager.php:168
+#: usr/local/www/system_certmanager.php:196
+#: usr/local/www/services_captiveportal.php:170
+#: usr/local/www/system_camanager.php:170
+#: usr/local/www/system_certmanager.php:199
+msgid "This certificate does not appear to be valid."
+msgstr "Esse certificado não parece ser válido."
+
+#: usr/local/www/services_captiveportal.php:171
+#: usr/local/www/services_captiveportal.php:172
+msgid "This intermmediate certificate does not appear to be valid."
+msgstr "Esse certificado intermediário não parece ser válido."
+
+#: usr/local/www/services_captiveportal.php:173
+#: usr/local/www/services_captiveportal.php:174
+msgid "This key does not appear to be valid."
+msgstr "Essa chave não parece ser válida."
+
+#: usr/local/www/services_captiveportal.php:177
+#: usr/local/www/services_captiveportal.php:178
+#: usr/local/www/services_captiveportal.php:176
+msgid "The HTTPS server name must be specified for HTTPS login."
+msgstr "O nome do servidor HTTPS deve ser especificado pelo login HTTPS."
+
+#: usr/local/www/services_captiveportal.php:183
+#: usr/local/www/services_captiveportal.php:184
+#: usr/local/www/services_captiveportal.php:182
+#: usr/local/www/services_captiveportal.php:185
+msgid "The timeout must be at least 1 minute."
+msgstr "O tempo de expiração deve ser pelo menos de 1 minuto."
+
+#: usr/local/www/services_captiveportal.php:186
+#: usr/local/www/services_captiveportal.php:187
+#: usr/local/www/services_captiveportal.php:185
+#: usr/local/www/services_captiveportal.php:203
+msgid "The idle timeout must be at least 1 minute."
+msgstr "O tempo ocioso deve ser no mínimo de 1 minuto."
+
+#: usr/local/www/services_captiveportal.php:189
+#: usr/local/www/services_captiveportal.php:190
+#: usr/local/www/services_captiveportal.php:188
+#: usr/local/www/services_captiveportal.php:206
+msgid "The pass-through credit count must be a number or left blank."
+msgstr "A contagem de crédito de passagem deve ser um número ou deixado em branco."
+
+#: usr/local/www/services_captiveportal.php:192
+#: usr/local/www/services_captiveportal.php:193
+#: usr/local/www/services_captiveportal.php:191
+#: usr/local/www/services_captiveportal.php:209
+msgid "The waiting period to restore pass-through credits must be above 0 hours."
+msgstr "O período de espera para restaurar os créditos de passagem deve ser acima de 0 horas."
+
+#: usr/local/www/services_captiveportal.php:196
+#: usr/local/www/services_captiveportal.php:199
+#: usr/local/www/services_captiveportal.php:202
+#: usr/local/www/services_captiveportal.php:205
+#: usr/local/www/services_captiveportal_ip_edit.php:107
+#: usr/local/www/services_captiveportal.php:197
+#: usr/local/www/services_captiveportal.php:200
+#: usr/local/www/services_captiveportal.php:203
+#: usr/local/www/services_captiveportal.php:206
+#: usr/local/www/services_captiveportal.php:195
+#: usr/local/www/services_captiveportal.php:198
+#: usr/local/www/services_captiveportal.php:201
+#: usr/local/www/services_captiveportal.php:204
+#: usr/local/www/services_captiveportal_ip_edit.php:105
+#: usr/local/www/services_captiveportal_ip_edit.php:104
+#: usr/local/www/services_captiveportal.php:213
+#: usr/local/www/services_captiveportal.php:216
+#: usr/local/www/services_captiveportal.php:219
+#: usr/local/www/services_captiveportal.php:222
+#, php-format
+msgid "A valid IP address must be specified. [%s]"
+msgstr "Um endereço IP válido deve ser especificado. [%s]"
+
+#: usr/local/www/services_captiveportal.php:208
+#: usr/local/www/services_captiveportal.php:211
+#: usr/local/www/services_captiveportal.php:214
+#: usr/local/www/services_captiveportal.php:217
+#: usr/local/www/services_captiveportal.php:220
+#: usr/local/www/services_captiveportal.php:209
+#: usr/local/www/services_captiveportal.php:212
+#: usr/local/www/services_captiveportal.php:215
+#: usr/local/www/services_captiveportal.php:218
+#: usr/local/www/services_captiveportal.php:221
+#: usr/local/www/services_captiveportal.php:207
+#: usr/local/www/services_captiveportal.php:210
+#: usr/local/www/services_captiveportal.php:213
+#: usr/local/www/services_captiveportal.php:216
+#: usr/local/www/services_captiveportal.php:219
+#: usr/local/www/services_captiveportal.php:225
+#: usr/local/www/services_captiveportal.php:228
+#: usr/local/www/services_captiveportal.php:231
+#: usr/local/www/services_captiveportal.php:234
+#: usr/local/www/services_captiveportal.php:237
+#, php-format
+msgid "A valid port number must be specified. [%s]"
+msgstr "Um número de porta válido deve ser especificado. [%s]"
+
+#: usr/local/www/services_captiveportal.php:223
+#: usr/local/www/services_captiveportal.php:224
+#: usr/local/www/services_captiveportal.php:222
+#: usr/local/www/services_captiveportal.php:240
+msgid "The maximum number of concurrent connections per client IP address may not be larger than the global maximum."
+msgstr "O número máximo de conexões concorrentes por endereço IP de cliente não pode ser maior que o máximo global."
+
+#: usr/local/www/services_captiveportal.php:421
+#: usr/local/www/services_captiveportal.php:425
+#: usr/local/www/services_captiveportal.php:423
+#: usr/local/www/services_captiveportal.php:441
+msgid "Captive portal(s)"
+msgstr "Captive portal(s)"
+
+#: usr/local/www/services_captiveportal.php:422
+#: usr/local/www/services_captiveportal_filemanager.php:151
+#: usr/local/www/services_captiveportal_ip.php:105
+#: usr/local/www/services_captiveportal_mac.php:155
+#: usr/local/www/services_captiveportal_hostname.php:110
+#: usr/local/www/services_captiveportal_vouchers.php:404
+#: usr/local/www/services_captiveportal_vouchers.php:411
+#: usr/local/www/services_captiveportal.php:426
+#: usr/local/www/services_captiveportal_vouchers.php:424
+#: usr/local/www/services_captiveportal_ip.php:103
+#: usr/local/www/services_captiveportal_mac.php:153
+#: usr/local/www/services_captiveportal_hostname.php:108
+#: usr/local/www/services_captiveportal.php:424
+#: usr/local/www/services_captiveportal_filemanager.php:148
+#: usr/local/www/services_captiveportal_vouchers.php:433
+#: usr/local/www/services_captiveportal_mac.php:163
+#: usr/local/www/services_captiveportal.php:442
+#: usr/local/www/services_captiveportal_vouchers.php:438
+msgid "Pass-through MAC"
+msgstr "Pass-through MAC"
+
+#: usr/local/www/services_captiveportal.php:423
+#: usr/local/www/services_captiveportal_filemanager.php:152
+#: usr/local/www/services_captiveportal_ip.php:106
+#: usr/local/www/services_captiveportal_mac.php:156
+#: usr/local/www/services_captiveportal_vouchers.php:405
+#: usr/local/www/services_captiveportal_vouchers.php:412
+#: usr/local/www/services_captiveportal.php:427
+#: usr/local/www/services_captiveportal_vouchers.php:425
+#: usr/local/www/services_captiveportal_ip.php:104
+#: usr/local/www/services_captiveportal_mac.php:154
+#: usr/local/www/services_captiveportal.php:425
+#: usr/local/www/services_captiveportal_filemanager.php:149
+#: usr/local/www/services_captiveportal_vouchers.php:434
+#: usr/local/www/services_captiveportal_mac.php:164
+#: usr/local/www/services_captiveportal.php:443
+#: usr/local/www/services_captiveportal_vouchers.php:439
+msgid "Allowed IP addresses"
+msgstr "Endereços IP permitidos"
+
+#: usr/local/www/services_captiveportal.php:424
+#: usr/local/www/services_captiveportal_filemanager.php:153
+#: usr/local/www/services_captiveportal_ip.php:107
+#: usr/local/www/services_captiveportal_mac.php:157
+#: usr/local/www/services_captiveportal_hostname.php:112
+#: usr/local/www/services_captiveportal_vouchers.php:406
+#: usr/local/www/services_captiveportal_vouchers.php:413
+#: usr/local/www/services_captiveportal.php:428
+#: usr/local/www/services_captiveportal_vouchers.php:426
+#: usr/local/www/services_captiveportal_ip.php:105
+#: usr/local/www/services_captiveportal_mac.php:155
+#: usr/local/www/services_captiveportal_hostname.php:110
+#: usr/local/www/services_captiveportal.php:426
+#: usr/local/www/services_captiveportal_filemanager.php:150
+#: usr/local/www/services_captiveportal_vouchers.php:435
+#: usr/local/www/services_captiveportal_mac.php:165
+#: usr/local/www/services_captiveportal.php:444
+#: usr/local/www/services_captiveportal_vouchers.php:440
+msgid "Allowed Hostnames"
+msgstr "Hostnames permitidos"
+
+#: usr/local/www/services_captiveportal.php:425
+#: usr/local/www/services_captiveportal.php:587
+#: usr/local/www/services_captiveportal_filemanager.php:154
+#: usr/local/www/services_captiveportal_ip.php:108
+#: usr/local/www/services_captiveportal_mac.php:158
+#: usr/local/www/services_captiveportal_hostname.php:113
+#: usr/local/www/services_captiveportal_vouchers.php:85
+#: usr/local/www/services_captiveportal_vouchers.php:407
+#: usr/local/www/status_captiveportal_vouchers.php:57
+#: usr/local/www/services_captiveportal_vouchers.php:414
+#: usr/local/www/services_captiveportal.php:429
+#: usr/local/www/services_captiveportal.php:592
+#: usr/local/www/services_captiveportal_vouchers.php:82
+#: usr/local/www/services_captiveportal_vouchers.php:427
+#: usr/local/www/services_captiveportal_ip.php:106
+#: usr/local/www/services_captiveportal_mac.php:156
+#: usr/local/www/services_captiveportal_hostname.php:111
+#: usr/local/www/services_captiveportal.php:427
+#: usr/local/www/services_captiveportal.php:590
+#: usr/local/www/services_captiveportal_filemanager.php:151
+#: usr/local/www/services_captiveportal_vouchers.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:436
+#: usr/local/www/services_captiveportal.php:584
+#: usr/local/www/services_captiveportal_mac.php:166
+#: usr/local/www/services_captiveportal.php:445
+#: usr/local/www/services_captiveportal.php:600
+#: usr/local/www/services_captiveportal_vouchers.php:441
+msgid "Vouchers"
+msgstr "Vouchers"
+
+#: usr/local/www/services_captiveportal.php:426
+#: usr/local/www/services_captiveportal_filemanager.php:155
+#: usr/local/www/services_captiveportal_ip.php:109
+#: usr/local/www/services_captiveportal_mac.php:159
+#: usr/local/www/services_captiveportal_hostname.php:114
+#: usr/local/www/services_captiveportal_vouchers.php:408
+#: usr/local/www/services_captiveportal_vouchers.php:415
+#: usr/local/www/services_captiveportal.php:430
+#: usr/local/www/services_captiveportal_vouchers.php:428
+#: usr/local/www/services_captiveportal_ip.php:107
+#: usr/local/www/services_captiveportal_mac.php:157
+#: usr/local/www/services_captiveportal_hostname.php:112
+#: usr/local/www/services_captiveportal.php:428
+#: usr/local/www/services_captiveportal_filemanager.php:152
+#: usr/local/www/services_captiveportal_vouchers.php:437
+#: usr/local/www/services_captiveportal_mac.php:167
+#: usr/local/www/services_captiveportal.php:446
+#: usr/local/www/services_captiveportal_vouchers.php:442
+msgid "File Manager"
+msgstr "Gerenciados de arquivo"
+
+#: usr/local/www/services_captiveportal.php:436
+#: usr/local/www/services_captiveportal.php:440
+#: usr/local/www/services_captiveportal.php:438
+#: usr/local/www/services_captiveportal.php:456
+msgid "Enable captive portal"
+msgstr "Habilitar portal captive"
+
+#: usr/local/www/services_captiveportal.php:450
+#: usr/local/www/services_captiveportal.php:455
+#: usr/local/www/services_captiveportal.php:453
+#: usr/local/www/services_captiveportal.php:471
+msgid "Select the interface(s) to enable for captive portal."
+msgstr "Selecione a(s) interface(s) a habilitar para o captive portal."
+
+#: usr/local/www/services_captiveportal.php:453
+#: usr/local/www/services_captiveportal.php:458
+#: usr/local/www/services_captiveportal.php:456
+#: usr/local/www/services_captiveportal.php:474
+msgid "Maximum concurrent connections"
+msgstr "Máximo de conexões concorrentes"
+
+#: usr/local/www/services_captiveportal.php:457
+#: usr/local/www/services_captiveportal.php:462
+#: usr/local/www/services_captiveportal.php:460
+#: usr/local/www/services_captiveportal.php:478
+msgid "per client IP address (0 = no limit)"
+msgstr "por endereço IP de cliente (0 = sem limite)"
+
+#: usr/local/www/services_captiveportal.php:460
+msgid "This setting limits the number of concurrent connections to the captive portal HTTP(S) server. This does not set how many users can be logged in to the captive portal, but rather how many users can load the portal page or authenticate at the same time! Default is 4 connections per client IP address, with a total maximum of 16 connections."
+msgstr "Essa configuração limita o número de conexões concorrentes para o servidor HTTP(S) do portal captive. Ela não configura quantos usuários podem estar logados no portal captive, mas sim quantos usuários podem carregar a página do portal ou autenticar ao mesmo tempo! O padrão é 4 conexões por endereço IP de cliente, com o total máximo de 16 conexões."
+
+#: usr/local/www/services_captiveportal.php:468
+#: usr/local/www/services_captiveportal.php:475
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/system_advanced_misc.php:426
+#: usr/local/www/system_advanced_misc.php:469
+#: usr/local/www/services_captiveportal.php:473
+#: usr/local/www/services_captiveportal.php:480
+#: usr/local/www/services_captiveportal_vouchers_edit.php:92
+#: usr/local/www/system_advanced_misc.php:518
+#: usr/local/www/services_captiveportal.php:471
+#: usr/local/www/services_captiveportal.php:478
+#: usr/local/www/system_advanced_misc.php:530
+#: usr/local/www/system_advanced_misc.php:651
+#: usr/local/www/services_captiveportal.php:489
+#: usr/local/www/services_captiveportal.php:496
+#: usr/local/www/system_advanced_misc.php:669
+msgid "minutes"
+msgstr "minutos"
+
+#: usr/local/www/services_captiveportal.php:469
+#: usr/local/www/services_captiveportal.php:474
+#: usr/local/www/services_captiveportal.php:472
+#: usr/local/www/services_captiveportal.php:490
+msgid "Clients will be disconnected after this amount of inactivity. They may log in again immediately, though. Leave this field blank for no idle timeout."
+msgstr "Clientes serão desconectados depois desse total de inatividade. Eles podem fazer login novamente imediatamente, no entando. Deixe esse campo em branco para nenhum tempo ocioso."
+
+#: usr/local/www/services_captiveportal.php:472
+#: usr/local/www/services_captiveportal.php:477
+#: usr/local/www/services_captiveportal.php:475
+#: usr/local/www/services_captiveportal.php:493
+msgid "Hard timeout"
+msgstr "Hard timeout"
+
+#: usr/local/www/services_captiveportal.php:476
+#: usr/local/www/services_captiveportal.php:481
+#: usr/local/www/services_captiveportal.php:479
+#: usr/local/www/services_captiveportal.php:497
+msgid "Clients will be disconnected after this amount of time, regardless of activity. They may log in again immediately, though. Leave this field blank for no hard timeout (not recommended unless an idle timeout is set)."
+msgstr "Clientes serão desconectados depois desse tempo, independentemente de ter atividade ou não. Eles podem realizar login novamente imediatamente, no entanto. Deixe esse campo em branco para não ter tempo de expiração rígido (não recomendado a menos que um tempo ocioso estiver configurado)."
+
+#: usr/local/www/services_captiveportal.php:479
+#: usr/local/www/services_captiveportal.php:484
+#: usr/local/www/services_captiveportal.php:482
+#: usr/local/www/services_captiveportal.php:500
+msgid "Pass-through credits allowed per MAC address"
+msgstr "Créditos de passagem permitidos por endereço MAC"
+
+#: usr/local/www/services_captiveportal.php:482
+#: usr/local/www/services_captiveportal.php:487
+#: usr/local/www/services_captiveportal.php:485
+#: usr/local/www/services_captiveportal.php:503
+msgid "per client MAC address (0 or blank = none)"
+msgstr "por endereço MAC de cliente (0 ou branco = nenhum)"
+
+#: usr/local/www/services_captiveportal.php:483
+#: usr/local/www/services_captiveportal.php:488
+#: usr/local/www/services_captiveportal.php:486
+#: usr/local/www/services_captiveportal.php:504
+msgid "This setting allows passing through the captive portal without authentication a limited number of times per MAC address. Once used up, the client can only log in with valid credentials until the waiting period specified below has expired. Recommended to set a hard timeout and/or idle timeout when using this for it to be effective."
+msgstr "Essa configuração permite passagem pelo portal captive sem autenticação para um número limitado de vezes por endereço MAC. Uma vez utilizado, o cliente somente pode realizar login com credenciais válidas até que o período de espera especificado abaixo tenha expirado. Recomenda-se configurar um tempo de expiração e/ou tempo de espera ao utilizar essa função para que ela seja mais efetiva."
+
+#: usr/local/www/services_captiveportal.php:486
+#: usr/local/www/services_captiveportal.php:491
+#: usr/local/www/services_captiveportal.php:489
+#: usr/local/www/services_captiveportal.php:507
+msgid "Waiting period to restore pass-through credits"
+msgstr "Período de espera para restaurar créditos de passagem"
+
+#: usr/local/www/services_captiveportal.php:489
+#: usr/local/www/services_captiveportal.php:494
+#: usr/local/www/services_captiveportal.php:492
+#: usr/local/www/services_captiveportal.php:510
+msgid "hours"
+msgstr "horas"
+
+#: usr/local/www/services_captiveportal.php:490
+#: usr/local/www/services_captiveportal.php:495
+#: usr/local/www/services_captiveportal.php:493
+#: usr/local/www/services_captiveportal.php:511
+msgid "Clients will have their available pass-through credits restored to the original count after this amount of time since using the first one. This must be above 0 hours if pass-through credits are enabled."
+msgstr "Clientes terão seus créditos de passagem restaurados para a contagem original após esse total de tempo desde que usando o primeiro. Esse deve ser acima de 0 horas se os créditos de passagem estão habilitados."
+
+#: usr/local/www/services_captiveportal.php:493
+#: usr/local/www/services_captiveportal.php:498
+#: usr/local/www/services_captiveportal.php:496
+#: usr/local/www/services_captiveportal.php:514
+msgid "Reset waiting period on attempted access"
+msgstr "Período de espera para reinício na tentativa de acesso"
+
+#: usr/local/www/services_captiveportal.php:496
+#: usr/local/www/services_captiveportal.php:501
+#: usr/local/www/services_captiveportal.php:499
+#: usr/local/www/services_captiveportal.php:517
+msgid "Enable waiting period reset on attempted access"
+msgstr "Habilitar período de espera de reinício na tentativa de acesso"
+
+#: usr/local/www/services_captiveportal.php:497
+#: usr/local/www/services_captiveportal.php:502
+#: usr/local/www/services_captiveportal.php:500
+#: usr/local/www/services_captiveportal.php:518
+msgid "If enabled, the waiting period is reset to the original duration if access is attempted when all pass-through credits have already been exhausted."
+msgstr "Se habilitado, o período de espera é reiniciado para a duração original se houver tentaviva de acesso quando todos os créditos de passagem tiverem exaurido."
+
+#: usr/local/www/services_captiveportal.php:500
+#: usr/local/www/services_captiveportal.php:505
+#: usr/local/www/services_captiveportal.php:503
+#: usr/local/www/services_captiveportal.php:521
+msgid "Logout popup window"
+msgstr "Janela popup de logout"
+
+#: usr/local/www/services_captiveportal.php:503
+#: usr/local/www/services_captiveportal.php:508
+#: usr/local/www/services_captiveportal.php:506
+#: usr/local/www/services_captiveportal.php:524
+msgid "Enable logout popup window"
+msgstr "Habilitar janela popup de logout"
+
+#: usr/local/www/services_captiveportal.php:504
+#: usr/local/www/services_captiveportal.php:509
+#: usr/local/www/services_captiveportal.php:507
+#: usr/local/www/services_captiveportal.php:525
+msgid "If enabled, a popup window will appear when clients are allowed through the captive portal. This allows clients to explicitly disconnect themselves before the idle or hard timeout occurs."
+msgstr "Se habilitada, uma janela popup irá aparecer quando os clientes tiverem acesso através do portal captive. Isso permite que clientes desconectem-se explicitamente antes que o tempo ocioso ou tempo de expiração rídigo ocorra."
+
+#: usr/local/www/services_captiveportal.php:507
+#: usr/local/www/services_captiveportal.php:512
+#: usr/local/www/services_captiveportal.php:510
+#: usr/local/www/services_captiveportal.php:528
+msgid "Pre-authentication redirect URL"
+msgstr "URL de redirecionamento de preautenticação"
+
+#: usr/local/www/services_captiveportal.php:510
+#: usr/local/www/services_captiveportal.php:515
+#: usr/local/www/services_captiveportal.php:513
+#: usr/local/www/services_captiveportal.php:531
+#, php-format
+msgid "Use this field to set $PORTAL_REDIRURL$ variable which can be accessed using your custom captive portal index.php page or error pages."
+msgstr "Use este campo para definir a variável $PORTAL_REDIRURL$, que pode ser acessada usando sua página personalizada do captive portal index.php ou páginas de erro."
+
+#: usr/local/www/services_captiveportal.php:514
+#: usr/local/www/services_captiveportal.php:519
+#: usr/local/www/services_captiveportal.php:517
+#: usr/local/www/services_captiveportal.php:535
+msgid "After authentication Redirection URL"
+msgstr "URL de redirecionamento após autenticação"
+
+#: usr/local/www/services_captiveportal.php:518
+#: usr/local/www/services_captiveportal.php:523
+#: usr/local/www/services_captiveportal.php:521
+#: usr/local/www/services_captiveportal.php:539
+msgid "If you provide a URL here, clients will be redirected to that URL instead of the one they initially tried to access after they've authenticated."
+msgstr "Se você fornecer uma URL aqui, clientes serão redirecionados para essa URL ao invés daquela que inicialmente eles tentaram acessar após terem se autenticado."
+
+#: usr/local/www/services_captiveportal.php:522
+#: usr/local/www/services_captiveportal.php:527
+#: usr/local/www/services_captiveportal.php:525
+#: usr/local/www/services_captiveportal.php:543
+msgid "Concurrent user logins"
+msgstr "Logins de usuário concorrentes"
+
+#: usr/local/www/services_captiveportal.php:525
+#: usr/local/www/services_captiveportal.php:530
+#: usr/local/www/services_captiveportal.php:528
+#: usr/local/www/services_captiveportal.php:546
+msgid "Disable concurrent logins"
+msgstr "Desabilitar logins concorrentes"
+
+#: usr/local/www/services_captiveportal.php:526
+#: usr/local/www/services_captiveportal.php:531
+#: usr/local/www/services_captiveportal.php:529
+#: usr/local/www/services_captiveportal.php:547
+msgid "If this option is set, only the most recent login per username will be active. Subsequent logins will cause machines previously logged in with the same username to be disconnected."
+msgstr "Se essa opção for configurada, somente o login por nome de usuário mais recente será ativado. Logins subsequentes provocarão a desconexão de máquinas anteriormente logadas com o mesmo nome de usuário."
+
+#: usr/local/www/services_captiveportal.php:529
+#: usr/local/www/services_captiveportal.php:534
+#: usr/local/www/services_captiveportal.php:532
+#: usr/local/www/services_captiveportal.php:550
+msgid "MAC filtering"
+msgstr "Filtragem de MAC"
+
+#: usr/local/www/services_captiveportal.php:532
+#: usr/local/www/services_captiveportal.php:537
+#: usr/local/www/services_captiveportal.php:535
+#: usr/local/www/services_captiveportal.php:553
+msgid "Disable MAC filtering"
+msgstr "Desabilitar filtragem de MAC"
+
+#: usr/local/www/services_captiveportal.php:533
+#: usr/local/www/services_captiveportal.php:538
+#: usr/local/www/services_captiveportal.php:536
+#: usr/local/www/services_captiveportal.php:554
+msgid "If this option is set, no attempts will be made to ensure that the MAC address of clients stays the same while they're logged in.This is required when the MAC address of the client cannot be determined (usually because there are routers between"
+msgstr "Se essa opção for configurada, nenhuma tentativa será feita para garantir que o endereço MAC de clientes se mantenha o mesmo enquanto eles estão logados. Esse é um requisito quando o endereço MAC do cliente não pode ser determinado (normalmente porque não há rotas entre"
+
+#: usr/local/www/services_captiveportal.php:534
+#: usr/local/www/services_captiveportal.php:539
+#: usr/local/www/services_captiveportal.php:537
+#: usr/local/www/services_captiveportal.php:555
+msgid "and the clients)."
+msgstr "e os clientes)."
+
+#: usr/local/www/services_captiveportal.php:535
+#: usr/local/www/services_captiveportal.php:540
+#: usr/local/www/services_captiveportal.php:538
+#: usr/local/www/services_captiveportal.php:556
+msgid "If this is enabled, RADIUS MAC authentication cannot be used."
+msgstr "Se isto estiver habilitado, autenticação de MAC RADIUS não pode ser usada."
+
+#: usr/local/www/services_captiveportal.php:538
+#: usr/local/www/services_captiveportal.php:543
+#: usr/local/www/services_captiveportal.php:541
+#: usr/local/www/services_captiveportal.php:559
+msgid "Pass-through MAC Auto Entry"
+msgstr "Entrada Auto de MAC Pass-through"
+
+#: usr/local/www/services_captiveportal.php:541
+#: usr/local/www/services_captiveportal.php:546
+#: usr/local/www/services_captiveportal.php:544
+#: usr/local/www/services_captiveportal.php:562
+msgid "Enable Pass-through MAC automatic additions"
+msgstr "Habilitar adições automáticas de MAC Pass-through"
+
+#: usr/local/www/services_captiveportal.php:542
+#: usr/local/www/services_captiveportal.php:547
+#: usr/local/www/services_captiveportal.php:545
+#: usr/local/www/services_captiveportal.php:563
+msgid "If this option is set, a MAC passthrough entry is automatically added after the user has successfully authenticated. Users of that MAC address will never have to authenticate again."
+msgstr "Se essa opção estiver configurada, a entrada MAC passthrough é automaticamente adicionada após o usuário ter autenticado com sucesso. Usuários de tal endereço MAC nunca terão que autenticar novamente."
+
+#: usr/local/www/services_captiveportal.php:543
+#: usr/local/www/services_captiveportal.php:549
+#: usr/local/www/services_captiveportal.php:548
+#: usr/local/www/services_captiveportal.php:554
+#: usr/local/www/services_captiveportal.php:546
+#: usr/local/www/services_captiveportal.php:552
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:570
+msgid "To remove the passthrough MAC entry you either have to log in and remove it manually from the"
+msgstr "Para remover a entrada MAC pass-through você deve realizar login e removê-la"
+
+#: usr/local/www/services_captiveportal.php:543
+#: usr/local/www/services_captiveportal.php:549
+#: usr/local/www/services_captiveportal.php:548
+#: usr/local/www/services_captiveportal.php:554
+#: usr/local/www/services_captiveportal.php:546
+#: usr/local/www/services_captiveportal.php:552
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:570
+msgid "Pass-through MAC tab"
+msgstr "Aba de MAC Pass-through"
+
+#: usr/local/www/services_captiveportal.php:543
+#: usr/local/www/services_captiveportal.php:549
+#: usr/local/www/services_captiveportal.php:548
+#: usr/local/www/services_captiveportal.php:554
+#: usr/local/www/services_captiveportal.php:546
+#: usr/local/www/services_captiveportal.php:552
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:570
+msgid "or send a POST from another system to remove it."
+msgstr "ou envie um POST de outro sistema para removê-la."
+
+#: usr/local/www/services_captiveportal.php:544
+#: usr/local/www/services_captiveportal.php:549
+#: usr/local/www/services_captiveportal.php:547
+#: usr/local/www/services_captiveportal.php:565
+msgid "If this is enabled, RADIUS MAC authentication cannot be used. Also, the logout window will not be shown."
+msgstr "Se isto estiver habilitado, a autenticação MAC RADIUS não pode ser usada. Além disso, a janela de logout não será exibida."
+
+#: usr/local/www/services_captiveportal.php:547
+#: usr/local/www/services_captiveportal.php:552
+#: usr/local/www/services_captiveportal.php:550
+#: usr/local/www/services_captiveportal.php:568
+msgid "Enable Pass-through MAC automatic addition with username"
+msgstr "Habilitar adição automática de MAC Pass-through com nome de usuário"
+
+#: usr/local/www/services_captiveportal.php:548
+#: usr/local/www/services_captiveportal.php:553
+#: usr/local/www/services_captiveportal.php:551
+#: usr/local/www/services_captiveportal.php:569
+msgid "If this option is set, with the automatically MAC passthrough entry created the username, used during authentication, will be saved."
+msgstr "Se essa opção estiver configurada, com a entrada automática de MAC passthrough criada, o nome de usuário, usado durante a autenticação, será salvo."
+
+#: usr/local/www/services_captiveportal.php:553
+#: usr/local/www/services_captiveportal.php:558
+#: usr/local/www/services_captiveportal.php:556
+#: usr/local/www/services_captiveportal.php:574
+msgid "Per-user bandwidth restriction"
+msgstr "Restrição de banda por usuário"
+
+#: usr/local/www/services_captiveportal.php:556
+#: usr/local/www/services_captiveportal.php:561
+#: usr/local/www/services_captiveportal.php:559
+#: usr/local/www/services_captiveportal.php:577
+msgid "Enable per-user bandwidth restriction"
+msgstr "Habilitar restrição de banda por usuário"
+
+#: usr/local/www/services_captiveportal.php:559
+#: usr/local/www/services_captiveportal.php:564
+#: usr/local/www/services_captiveportal.php:562
+#: usr/local/www/services_captiveportal.php:580
+msgid "Default download"
+msgstr "Download padrão"
+
+#: usr/local/www/services_captiveportal.php:563
+#: usr/local/www/services_captiveportal.php:568
+#: usr/local/www/services_captiveportal.php:566
+#: usr/local/www/services_captiveportal.php:584
+msgid "Default upload"
+msgstr "Carregamento padrão"
+
+#: usr/local/www/services_captiveportal.php:567
+#: usr/local/www/services_captiveportal.php:572
+#: usr/local/www/services_captiveportal.php:570
+#: usr/local/www/services_captiveportal.php:588
+msgid "If this option is set, the captive portal will restrict each user who logs in to the specified default bandwidth. RADIUS can override the default settings. Leave empty or set to 0 for no limit."
+msgstr "Se essa opção estiver configurada, o portal captive restringirá cada usuário que realizar login na largura de banda especificada. RADIUS pode sobrescrever a configuração padrão. Deixe vazio ou configure 0 para não impor limite."
+
+#: usr/local/www/services_captiveportal.php:570
+#: usr/local/www/services_captiveportal.php:575
+#: usr/local/www/services_captiveportal.php:573
+msgid "PMS authentication"
+msgstr "Autenticação PMS"
+
+#: usr/local/www/services_captiveportal.php:573
+#: usr/local/www/services_captiveportal.php:578
+#: usr/local/www/services_captiveportal.php:576
+msgid "Enable PMS authentication"
+msgstr "Habilitar autenticação PSM"
+
+#: usr/local/www/services_captiveportal.php:574
+#: usr/local/www/services_captiveportal.php:579
+#: usr/local/www/services_captiveportal.php:577
+msgid "If this option is set, users will be authenticated through the PMS backend if they fill the necessary information in the login page."
+msgstr "Se habilitada, usuários poderão se autenticar através do painel PMS, se eles preencherem os campos necessários na pagina de login."
+
+#: usr/local/www/services_captiveportal.php:583
+#: usr/local/www/services_captiveportal.php:588
+#: usr/local/www/services_captiveportal.php:586
+#: usr/local/www/services_captiveportal.php:580
+#: usr/local/www/services_captiveportal.php:596
+msgid "No Authentication"
+msgstr "Sem Autenticação"
+
+#: usr/local/www/services_captiveportal.php:587
+#: usr/local/www/diag_ipsec.php:194
+#: usr/local/www/services_captiveportal.php:592
+#: usr/local/www/diag_ipsec.php:195
+#: usr/local/www/services_captiveportal.php:590
+#: usr/local/www/diag_ipsec.php:196
+#: usr/local/www/services_captiveportal.php:584
+#: usr/local/www/services_captiveportal.php:600
+msgid "Local"
+msgstr "Local"
+
+#: usr/local/www/services_captiveportal.php:587 usr/local/www/fbegin.inc:93
+#: usr/local/www/fbegin.inc:95 usr/local/www/system_usermanager.php:54
+#: usr/local/www/fbegin.inc:110 usr/local/www/fbegin.inc:112
+#: usr/local/www/services_captiveportal.php:592 usr/local/www/fbegin.inc:119
+#: usr/local/www/fbegin.inc:121 usr/local/www/services_captiveportal.php:590
+#: usr/local/www/services_captiveportal.php:584 usr/local/www/fbegin.inc:111
+#: usr/local/www/fbegin.inc:113 usr/local/www/services_captiveportal.php:600
+msgid "User Manager"
+msgstr "Ger. de usuário"
+
+#: usr/local/www/services_captiveportal.php:591
+#: usr/local/www/services_captiveportal.php:596
+#: usr/local/www/services_captiveportal.php:594
+#: usr/local/www/services_captiveportal.php:612
+msgid "RADIUS Authentication"
+msgstr "Autenticação RADIUS"
+
+#: usr/local/www/services_captiveportal.php:599
+#: usr/local/www/services_captiveportal.php:635
+#: usr/local/www/services_captiveportal.php:678
+#: usr/local/www/services_captiveportal.php:633
+#: usr/local/www/services_captiveportal.php:676
+#: usr/local/www/services_captiveportal.php:634
+#: usr/local/www/services_captiveportal.php:677
+#: usr/local/www/services_captiveportal.php:650
+#: usr/local/www/services_captiveportal.php:693
+msgid "Primary RADIUS server"
+msgstr "Servidor RADIUS primário"
+
+#: usr/local/www/services_captiveportal.php:604
+#: usr/local/www/services_captiveportal.php:640
+#: usr/local/www/services_captiveportal.php:638
+#: usr/local/www/services_captiveportal.php:639
+#: usr/local/www/services_captiveportal.php:655
+msgid "Enter the IP address of the RADIUS server which users of the captive portal have to authenticate against."
+msgstr "Informe o endereço IP do servidor RADIUS no qual usuários do portal captive tem que autenticar."
+
+#: usr/local/www/services_captiveportal.php:609
+#: usr/local/www/services_captiveportal.php:645
+#: usr/local/www/services_captiveportal.php:643
+#: usr/local/www/services_captiveportal.php:644
+#: usr/local/www/services_captiveportal.php:660
+msgid "Leave this field blank to use the default port (1812)."
+msgstr "Deixe esse campo em branco para usar a porta padrão (1812)."
+
+#: usr/local/www/services_captiveportal.php:612
+#: usr/local/www/services_captiveportal.php:632
+#: usr/local/www/services_captiveportal.php:651
+#: usr/local/www/services_captiveportal.php:670
+#: usr/local/www/services_captiveportal.php:725
+#: usr/local/www/services_captiveportal.php:648
+#: usr/local/www/services_captiveportal.php:668
+#: usr/local/www/services_captiveportal.php:690
+#: usr/local/www/services_captiveportal.php:709
+#: usr/local/www/services_captiveportal.php:767
+#: usr/local/www/services_captiveportal.php:646
+#: usr/local/www/services_captiveportal.php:666
+#: usr/local/www/services_captiveportal.php:688
+#: usr/local/www/services_captiveportal.php:707
+#: usr/local/www/services_captiveportal.php:765
+#: usr/local/www/services_captiveportal.php:647
+#: usr/local/www/services_captiveportal.php:667
+#: usr/local/www/services_captiveportal.php:689
+#: usr/local/www/services_captiveportal.php:708
+#: usr/local/www/services_captiveportal.php:663
+#: usr/local/www/services_captiveportal.php:683
+#: usr/local/www/services_captiveportal.php:705
+#: usr/local/www/services_captiveportal.php:724
+msgid "Shared secret"
+msgstr "Segredo compartilhado"
+
+#: usr/local/www/services_captiveportal.php:614
+#: usr/local/www/services_captiveportal.php:650
+#: usr/local/www/services_captiveportal.php:648
+#: usr/local/www/services_captiveportal.php:649
+#: usr/local/www/services_captiveportal.php:665
+msgid "Leave this field blank to not use a RADIUS shared secret (not recommended)."
+msgstr "Deixe o campo em brando para não usar o segredo compartilhado do RADIUS (não recomendado)."
+
+#: usr/local/www/services_captiveportal.php:620 usr/local/www/vpn_pptp.php:440
+#: usr/local/www/services_captiveportal.php:656
+#: usr/local/www/services_captiveportal.php:697 usr/local/www/vpn_pptp.php:442
+#: usr/local/www/services_captiveportal.php:654
+#: usr/local/www/services_captiveportal.php:695
+#: usr/local/www/services_captiveportal.php:655
+#: usr/local/www/services_captiveportal.php:696 usr/local/www/vpn_pptp.php:445
+#: usr/local/www/services_captiveportal.php:671
+#: usr/local/www/services_captiveportal.php:712
+msgid "Secondary RADIUS server"
+msgstr "Servidor RADIUS secundário"
+
+#: usr/local/www/services_captiveportal.php:625
+#: usr/local/www/services_captiveportal.php:661
+#: usr/local/www/services_captiveportal.php:659
+#: usr/local/www/services_captiveportal.php:660
+#: usr/local/www/services_captiveportal.php:676
+msgid "If you have a second RADIUS server, you can activate it by entering its IP address here."
+msgstr "Se você possui um servidor RADIUS secundário, você pode ativa-lo informando seu endereço IP aqui."
+
+#: usr/local/www/services_captiveportal.php:639
+msgid "Tertiary RADIUS server"
+msgstr "Servidor RADIUS terciário"
+
+#: usr/local/www/services_captiveportal.php:644
+#: usr/local/www/services_captiveportal.php:683
+#: usr/local/www/services_captiveportal.php:681
+#: usr/local/www/services_captiveportal.php:682
+#: usr/local/www/services_captiveportal.php:698
+msgid "If you have a third RADIUS server, you can activate it by entering its IP address here."
+msgstr "Se você possui um terceiro servidor RADIUS, você pode ativa-lo informando seu endereço IP aqui."
+
+#: usr/local/www/services_captiveportal.php:658
+msgid "Quaternary RADIUS server"
+msgstr "Servidor RADIUS quartenário"
+
+#: usr/local/www/services_captiveportal.php:663
+#: usr/local/www/services_captiveportal.php:702
+#: usr/local/www/services_captiveportal.php:700
+#: usr/local/www/services_captiveportal.php:701
+#: usr/local/www/services_captiveportal.php:717
+msgid "If you have a fourth RADIUS server, you can activate it by entering its IP address here."
+msgstr "Se você possui um quarto servidor RADIUS, você pode ativa-lo informando seu endereço IP aqui."
+
+#: usr/local/www/services_captiveportal.php:677
+#: usr/local/www/services_captiveportal.php:719
+#: usr/local/www/services_captiveportal.php:717
+#: usr/local/www/services_captiveportal.php:715
+#: usr/local/www/services_captiveportal.php:731
+msgid "Accounting"
+msgstr "Contabilidade"
+
+#: usr/local/www/services_captiveportal.php:682
+#: usr/local/www/services_captiveportal.php:724
+#: usr/local/www/services_captiveportal.php:722
+#: usr/local/www/services_captiveportal.php:720
+#: usr/local/www/services_captiveportal.php:736
+msgid "send RADIUS accounting packets"
+msgstr "enviar pacotes de accounting RADIUS"
+
+#: usr/local/www/services_captiveportal.php:683
+#: usr/local/www/services_captiveportal.php:725
+#: usr/local/www/services_captiveportal.php:723
+#: usr/local/www/services_captiveportal.php:721
+#: usr/local/www/services_captiveportal.php:737
+msgid "If this is enabled, RADIUS accounting packets will be sent to the primary RADIUS server."
+msgstr "Se isso estiver habilitado, pacotes de accounting RADIUS serão enviados para o servidor RADIUS primário."
+
+#: usr/local/www/services_captiveportal.php:686
+#: usr/local/www/services_captiveportal.php:728
+#: usr/local/www/services_captiveportal.php:726
+#: usr/local/www/services_captiveportal.php:724
+#: usr/local/www/services_captiveportal.php:740
+msgid "Accounting port"
+msgstr "Porta de Accounting"
+
+#: usr/local/www/services_captiveportal.php:688
+#: usr/local/www/services_captiveportal.php:730
+#: usr/local/www/services_captiveportal.php:728
+#: usr/local/www/services_captiveportal.php:726
+#: usr/local/www/services_captiveportal.php:742
+msgid "Leave blank to use the default port (1813)."
+msgstr "Deixe em branco para usar a porta padrão (1813)."
+
+#: usr/local/www/services_captiveportal.php:694
+#: usr/local/www/services_captiveportal.php:736
+#: usr/local/www/services_captiveportal.php:734
+#: usr/local/www/services_captiveportal.php:746
+#: usr/local/www/services_captiveportal.php:762
+msgid "Reauthentication"
+msgstr "Reautenticação"
+
+#: usr/local/www/services_captiveportal.php:699
+#: usr/local/www/services_captiveportal.php:741
+#: usr/local/www/services_captiveportal.php:739
+#: usr/local/www/services_captiveportal.php:748
+#: usr/local/www/services_captiveportal.php:764
+msgid "Reauthenticate connected users every minute"
+msgstr "Reautentique usuários conectados a cada minuto"
+
+#: usr/local/www/services_captiveportal.php:700
+#: usr/local/www/services_captiveportal.php:742
+#: usr/local/www/services_captiveportal.php:740
+#: usr/local/www/services_captiveportal.php:749
+#: usr/local/www/services_captiveportal.php:765
+msgid "If reauthentication is enabled, Access-Requests will be sent to the RADIUS server for each user that is logged in every minute. If an Access-Reject is received for a user, that user is disconnected from the captive portal immediately."
+msgstr "Se a reautenticação estiver habilitada, Access-Requests serão enviados para o servidor RADIUS para cada usuário logado a cada minuto. Se um Access-Reject é recebido por um usuário, aquele usuário é desconectado do portal captive imediatamente."
+
+#: usr/local/www/services_captiveportal.php:704
+#: usr/local/www/services_captiveportal.php:746
+#: usr/local/www/services_captiveportal.php:744
+#: usr/local/www/services_captiveportal.php:732
+#: usr/local/www/services_captiveportal.php:748
+msgid "Accounting updates"
+msgstr "Atualizações de accounting"
+
+#: usr/local/www/services_captiveportal.php:706
+#: usr/local/www/services_captiveportal.php:748
+#: usr/local/www/services_captiveportal.php:746
+#: usr/local/www/services_captiveportal.php:734
+#: usr/local/www/services_captiveportal.php:750
+msgid "no accounting updates"
+msgstr "nenhuma atualização de accounting"
+
+#: usr/local/www/services_captiveportal.php:707
+#: usr/local/www/services_captiveportal.php:749
+#: usr/local/www/services_captiveportal.php:747
+#: usr/local/www/services_captiveportal.php:735
+#: usr/local/www/services_captiveportal.php:751
+msgid "stop/start accounting"
+msgstr "parar/iniciar accounting"
+
+#: usr/local/www/services_captiveportal.php:708
+#: usr/local/www/services_captiveportal.php:750
+#: usr/local/www/services_captiveportal.php:748
+#: usr/local/www/services_captiveportal.php:736
+#: usr/local/www/services_captiveportal.php:752
+msgid "interim update"
+msgstr "atualização de interim"
+
+#: usr/local/www/services_captiveportal.php:715
+#: usr/local/www/services_captiveportal.php:757
+#: usr/local/www/services_captiveportal.php:755
+#: usr/local/www/services_captiveportal.php:753
+#: usr/local/www/services_captiveportal.php:769
+msgid "RADIUS MAC authentication"
+msgstr "Autenticação de MAC do RADIUS"
+
+#: usr/local/www/services_captiveportal.php:720
+#: usr/local/www/services_captiveportal.php:762
+#: usr/local/www/services_captiveportal.php:760
+#: usr/local/www/services_captiveportal.php:755
+#: usr/local/www/services_captiveportal.php:771
+msgid "Enable RADIUS MAC authentication"
+msgstr "Habilitar autenticação de MAC do RADIUS"
+
+#: usr/local/www/services_captiveportal.php:721
+#: usr/local/www/services_captiveportal.php:763
+#: usr/local/www/services_captiveportal.php:761
+#: usr/local/www/services_captiveportal.php:756
+#: usr/local/www/services_captiveportal.php:772
+msgid "If this option is enabled, the captive portal will try to authenticate users by sending their MAC address as the username and the password entered below to the RADIUS server."
+msgstr "Se essa opção estiver habilitada, o portal captive tentará autenticar usuários enviando seus endereços MAC como o nome de usuário e senha informados abaixo para o servidor RADIUS."
+
+#: usr/local/www/services_captiveportal.php:732
+#: usr/local/www/services_captiveportal.php:774
+#: usr/local/www/services_captiveportal.php:772
+#: usr/local/www/services_captiveportal.php:743
+#: usr/local/www/services_captiveportal.php:759
+msgid "RADIUS options"
+msgstr "Opções RADIUS"
+
+#: usr/local/www/services_captiveportal.php:736
+#: usr/local/www/services_captiveportal.php:778
+#: usr/local/www/services_captiveportal.php:776
+#: usr/local/www/services_captiveportal.php:764
+#: usr/local/www/services_captiveportal.php:780
+msgid "RADIUS NAS IP attribute"
+msgstr "Atributo RADIUS NAS IP"
+
+#: usr/local/www/services_captiveportal.php:766
+#: usr/local/www/services_captiveportal.php:808
+#: usr/local/www/services_captiveportal.php:806
+#: usr/local/www/services_captiveportal.php:794
+#: usr/local/www/services_captiveportal.php:810
+msgid "Choose the IP to use for calling station attribute."
+msgstr "Escolha o IP para usar para chamar atributo estação."
+
+#: usr/local/www/services_captiveportal.php:771
+#: usr/local/www/services_captiveportal.php:813
+#: usr/local/www/services_captiveportal.php:811
+#: usr/local/www/services_captiveportal.php:799
+#: usr/local/www/services_captiveportal.php:815
+msgid "Session-Timeout"
+msgstr "Session-Timeout"
+
+#: usr/local/www/services_captiveportal.php:772
+#: usr/local/www/services_captiveportal.php:814
+#: usr/local/www/services_captiveportal.php:812
+#: usr/local/www/services_captiveportal.php:800
+#: usr/local/www/services_captiveportal.php:816
+msgid "Use RADIUS Session-Timeout attributes"
+msgstr "Use atributos de Session-Timeout do RADIUS"
+
+#: usr/local/www/services_captiveportal.php:773
+#: usr/local/www/services_captiveportal.php:815
+#: usr/local/www/services_captiveportal.php:813
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:817
+msgid "When this is enabled, clients will be disconnected after the amount of time retrieved from the RADIUS Session-Timeout attribute."
+msgstr "Quando isso estiver habilitado, clientes serão desconectados após o total de tempo obtido do atributo Session-Timeout do RADIUS."
+
+#: usr/local/www/services_captiveportal.php:789
+#: usr/local/www/services_captiveportal.php:831
+#: usr/local/www/services_captiveportal.php:829
+#: usr/local/www/services_captiveportal.php:817
+#: usr/local/www/services_captiveportal.php:833
+#, php-format
+msgid "If RADIUS type is set to Cisco, in Access-Requests the value of Calling-Station-Id will be set to the client's IP address and the Called-Station-Id to the client's MAC address. Default behavior is Calling-Station-Id = client's MAC address and Called-Station-Id = %s's WAN IP address."
+msgstr "Se o tipo RADIUS estiver configurado para Cisco, em Access-Requests o valor do Calling-Station-Id será configurado com o endereço IP do cliente e o Called-Station-Id para o endereço MAC do cliente. O comportamento padrão é Calling-Station-Id = endereço MAC de cliente e Called-Station-Id = endereço IP da WAN %s."
+
+#: usr/local/www/services_captiveportal.php:796
+#: usr/local/www/services_captiveportal.php:838
+#: usr/local/www/services_captiveportal.php:836
+#: usr/local/www/services_captiveportal.php:834
+#: usr/local/www/services_captiveportal.php:850
+msgid "MAC address format"
+msgstr "Formato do endereço MAC"
+
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:843
+msgid "singledash"
+msgstr "singledash"
+
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:843
+msgid "ietf"
+msgstr "ietf"
+
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:843
+msgid "cisco"
+msgstr "cisco"
+
+#: usr/local/www/services_captiveportal.php:801
+#: usr/local/www/services_captiveportal.php:843
+msgid "unformatted"
+msgstr "não formatado"
+
+#: usr/local/www/services_captiveportal.php:810
+#: usr/local/www/services_captiveportal.php:852
+#: usr/local/www/services_captiveportal.php:850
+#: usr/local/www/services_captiveportal.php:849
+#: usr/local/www/services_captiveportal.php:865
+msgid "This option changes the MAC address format used in the whole RADIUS system. Change this if you also"
+msgstr "Essa opção modifica o formato do endereço MAC usado em todo o sistema RADIUS. Modifique isso se você também"
+
+#: usr/local/www/services_captiveportal.php:811
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/services_captiveportal.php:851
+#: usr/local/www/services_captiveportal.php:850
+#: usr/local/www/services_captiveportal.php:866
+msgid "need to change the username format for RADIUS MAC authentication."
+msgstr "precisa modificar o formato do nome de usuário para a autenticação MAC do RADIUS."
+
+#: usr/local/www/services_captiveportal.php:812
+#: usr/local/www/services_captiveportal.php:854
+#: usr/local/www/services_captiveportal.php:852
+#: usr/local/www/services_captiveportal.php:851
+#: usr/local/www/services_captiveportal.php:867
+msgid "default:"
+msgstr "padrão:"
+
+#: usr/local/www/services_captiveportal.php:813
+#: usr/local/www/services_captiveportal.php:855
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/services_captiveportal.php:852
+#: usr/local/www/services_captiveportal.php:868
+msgid "singledash:"
+msgstr "singledash:"
+
+#: usr/local/www/services_captiveportal.php:814
+#: usr/local/www/services_captiveportal.php:856
+#: usr/local/www/services_captiveportal.php:854
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/services_captiveportal.php:869
+msgid "ietf:"
+msgstr "ietf:"
+
+#: usr/local/www/services_captiveportal.php:815
+#: usr/local/www/services_captiveportal.php:857
+#: usr/local/www/services_captiveportal.php:855
+#: usr/local/www/services_captiveportal.php:854
+#: usr/local/www/services_captiveportal.php:870
+msgid "cisco:"
+msgstr "cisco:"
+
+#: usr/local/www/services_captiveportal.php:816
+#: usr/local/www/services_captiveportal.php:858
+#: usr/local/www/services_captiveportal.php:856
+#: usr/local/www/services_captiveportal.php:855
+#: usr/local/www/services_captiveportal.php:871
+msgid "unformatted:"
+msgstr "não formatado:"
+
+#: usr/local/www/services_captiveportal.php:819
+#: usr/local/www/services_captiveportal.php:861
+#: usr/local/www/services_captiveportal.php:859
+#: usr/local/www/services_captiveportal.php:877
+msgid "HTTPS login"
+msgstr "Login HTTPS"
+
+#: usr/local/www/services_captiveportal.php:822
+#: usr/local/www/services_captiveportal.php:864
+#: usr/local/www/services_captiveportal.php:862
+#: usr/local/www/services_captiveportal.php:880
+msgid "Enable HTTPS login"
+msgstr "Habilitar login HTTPS"
+
+#: usr/local/www/services_captiveportal.php:823
+#: usr/local/www/services_captiveportal.php:865
+msgid "If enabled, the username and password will be transmitted over an HTTPS connection to protect against eavesdroppers. A server name, certificate and matching private key must also be specified below."
+msgstr "Se habilitado, o nome de usuário e senha será transmitido sobre uma conexão HTTPS para protegê-los de eavesdroppers. Um nome de servidor, certificado e chave privada correspondente também devem ser especificados abaixo."
+
+#: usr/local/www/services_captiveportal.php:826
+#: usr/local/www/services_captiveportal.php:868
+#: usr/local/www/services_captiveportal.php:866
+#: usr/local/www/services_captiveportal.php:884
+msgid "HTTPS server name"
+msgstr "Nome do servidor HTTPS"
+
+#: usr/local/www/services_captiveportal.php:829
+#: usr/local/www/services_captiveportal.php:871
+#: usr/local/www/services_captiveportal.php:869
+#: usr/local/www/services_captiveportal.php:887
+#, php-format
+msgid "This name will be used in the form action for the HTTPS POST and should match the Common Name (CN) in your certificate (otherwise, the client browser will most likely display a security warning). Make sure captive portal clients can resolve this name in DNS and verify on the client that the IP resolves to the correct interface IP on %s."
+msgstr "Esse nome será usado na ação do formulário para o POST HTTPS e deve corresponder ao Common Name (CN) no seu certificado (do contrário, o browser do cliente irá provavelmente mostrar um aviso de segurança). Tenha certeza que os clientes do portal captive podem resolver esse nome em DNS e verificar no cliente que o IP resulta no IP de interface correto em %s."
+
+#: usr/local/www/services_captiveportal.php:832
+#: usr/local/www/services_captiveportal.php:874
+msgid "HTTPS certificate"
+msgstr "Certificado HTTPS"
+
+#: usr/local/www/services_captiveportal.php:836
+#: usr/local/www/services_captiveportal.php:878
+msgid "Paste a signed certificate in X.509 PEM format here."
+msgstr "Cole um certificado assinado no formato X.509 PEM aqui."
+
+#: usr/local/www/services_captiveportal.php:839
+#: usr/local/www/services_captiveportal.php:881
+msgid "HTTPS private key"
+msgstr "Chave privada HTTPS"
+
+#: usr/local/www/services_captiveportal.php:843
+#: usr/local/www/services_captiveportal.php:885
+msgid "Paste an RSA private key in PEM format here."
+msgstr "Cole uma chave privada RSA no formato PEM aqui."
+
+#: usr/local/www/services_captiveportal.php:846
+#: usr/local/www/services_captiveportal.php:888
+msgid "HTTPS intermediate certificate"
+msgstr "Certificado intermediário HTTPS"
+
+#: usr/local/www/services_captiveportal.php:850
+#: usr/local/www/system_camanager.php:406
+#: usr/local/www/system_certmanager.php:515
+#: usr/local/www/system_certmanager.php:614
+#: usr/local/www/services_captiveportal.php:892
+#: usr/local/www/system_camanager.php:413
+#: usr/local/www/system_certmanager.php:623
+#: usr/local/www/system_certmanager.php:624
+msgid "Paste a certificate in X.509 PEM format here."
+msgstr "Cole um certificado em formato X.509 PEM aqui."
+
+#: usr/local/www/services_captiveportal.php:853
+#: usr/local/www/services_captiveportal.php:895
+#: usr/local/www/services_captiveportal.php:891
+#: usr/local/www/services_captiveportal.php:893
+#: usr/local/www/services_captiveportal.php:909
+msgid "Portal page contents"
+msgstr "Conteúdo da página do portal"
+
+#: usr/local/www/services_captiveportal.php:865
+#: usr/local/www/services_captiveportal.php:899
+#: usr/local/www/services_captiveportal.php:913
+#: usr/local/www/services_captiveportal.php:910
+#: usr/local/www/services_captiveportal.php:944
+#: usr/local/www/services_captiveportal.php:958
+#: usr/local/www/services_captiveportal.php:906
+#: usr/local/www/services_captiveportal.php:940
+#: usr/local/www/services_captiveportal.php:954
+#: usr/local/www/services_captiveportal.php:908
+#: usr/local/www/services_captiveportal.php:942
+#: usr/local/www/services_captiveportal.php:956
+#: usr/local/www/services_captiveportal.php:924
+#: usr/local/www/services_captiveportal.php:972
+msgid "View current page"
+msgstr "Veja página atual"
+
+#: usr/local/www/services_captiveportal.php:871
+#: usr/local/www/services_captiveportal.php:916
+#: usr/local/www/services_captiveportal.php:912
+#: usr/local/www/services_captiveportal.php:914
+#: usr/local/www/services_captiveportal.php:930
+#, php-format
+msgid "Upload an HTML/PHP file for the portal page here (leave blank to keep the current one). Make sure to include a form (POST to %1$s) with a submit button (%2$s) and a hidden field with %3$s and %4$s. Include the %5$s and %6$s and/or %7$s input fields if authentication is enabled, otherwise it will always fail."
+msgstr "Carregar um arquivo HTML/PHP para a página do portal aqui (deixe em branco para manter o atual). Tenha certeza que incluiu um formulário (com POST para %1$s) com um botão de submissão (%2$s) e campo escondido com %3$s e %4$s. Inclua os campos %5$s e %6$s e/ou %7$s se a autenticação estiver habilitada, do contrário ele sempre irá falhar."
+
+#: usr/local/www/services_captiveportal.php:882
+#: usr/local/www/services_captiveportal.php:927
+#: usr/local/www/services_captiveportal.php:923
+#: usr/local/www/services_captiveportal.php:925
+#: usr/local/www/services_captiveportal.php:941
+msgid "Example code for the form:"
+msgstr "Exemplo de código para o formulário:"
+
+#: usr/local/www/services_captiveportal.php:894
+#: usr/local/www/services_captiveportal.php:939
+#: usr/local/www/services_captiveportal.php:935
+#: usr/local/www/services_captiveportal.php:937
+#: usr/local/www/services_captiveportal.php:953
+msgid "error page"
+msgstr "página de erro"
+
+#: usr/local/www/services_captiveportal.php:895
+#: usr/local/www/services_captiveportal.php:909
+#: usr/local/www/services_captiveportal.php:940
+#: usr/local/www/services_captiveportal.php:954
+#: usr/local/www/services_captiveportal.php:936
+#: usr/local/www/services_captiveportal.php:950
+#: usr/local/www/services_captiveportal.php:938
+#: usr/local/www/services_captiveportal.php:952
+#: usr/local/www/services_captiveportal.php:968
+msgid "contents"
+msgstr "conteúdo"
+
+#: usr/local/www/services_captiveportal.php:903
+#: usr/local/www/services_captiveportal.php:948
+#: usr/local/www/services_captiveportal.php:944
+#: usr/local/www/services_captiveportal.php:946
+#: usr/local/www/services_captiveportal.php:962
+msgid "The contents of the HTML/PHP file that you upload here are displayed when an authentication error occurs. You may include"
+msgstr "O conteúdo do arquivo HTML/PHP que você carregar aqui é exibido quando um erro de autenticação ocorrer. Você deve incluir"
+
+#: usr/local/www/services_captiveportal.php:904
+#: usr/local/www/services_captiveportal.php:949
+#: usr/local/www/services_captiveportal.php:945
+#: usr/local/www/services_captiveportal.php:947
+#: usr/local/www/services_captiveportal.php:963
+msgid "which will be replaced by the error or reply messages from the RADIUS server, if any."
+msgstr "que será substituído pela mensagem de erro ou de resposta do servidor RADIUS, se houver."
+
+#: usr/local/www/services_captiveportal.php:907 usr/local/www/fbegin.inc:86
+#: usr/local/www/fbegin.inc:103 usr/local/www/services_captiveportal.php:952
+#: usr/local/www/fbegin.inc:112 usr/local/www/services_captiveportal.php:948
+#: usr/local/www/services_captiveportal.php:950 usr/local/www/fbegin.inc:104
+#: usr/local/www/services_captiveportal.php:966
+msgid "Logout"
+msgstr "Logout"
+
+#: usr/local/www/services_captiveportal.php:917
+#: usr/local/www/services_captiveportal.php:962
+#: usr/local/www/services_captiveportal.php:958
+#: usr/local/www/services_captiveportal.php:960
+#: usr/local/www/services_captiveportal.php:976
+msgid "The contents of the HTML/PHP file that you upload here are displayed on authentication success when the logout popup is enabled."
+msgstr "O conteúdo do arquivo HTML/PHP que você carregou aqui são exibidos no sucesso de autenticação quando a popup de logout estiver habilitada."
+
+#: usr/local/www/services_captiveportal.php:930
+#: usr/local/www/services_captiveportal.php:975
+#: usr/local/www/services_captiveportal.php:971
+#: usr/local/www/services_captiveportal.php:973
+#: usr/local/www/services_captiveportal.php:989
+msgid "Changing any settings on this page will disconnect all clients! Don't forget to enable the DHCP server on your captive portal interface! Make sure that the default/maximum DHCP lease time is higher than the timeout entered on this page. Also, the DNS forwarder needs to be enabled for DNS lookups by unauthenticated clients to work."
+msgstr "Mudando qualquer configuração nessa página irá desconectar todos os clientes! Não esqueça de habilitar o servidor DHCP na interface de seu portal captive! Tenha certeza de que o tempo de concessão padrão/máximo é maior que o tempo de expiração informado nessa página. Além disso, o DNS forwarder precisa estar habilitado para receber DNS lookups de clientes não autenticados para funcionar."
+
+#: usr/local/www/services_captiveportal_filemanager.php:101
+#: usr/local/www/services_captiveportal_filemanager.php:98
+#, php-format
+msgid "A file with the name '%s' already exists."
+msgstr "Um arquivo com o nome '%s' já existe."
+
+#: usr/local/www/services_captiveportal_filemanager.php:108
+#: usr/local/www/services_captiveportal_filemanager.php:105
+msgid "The total size of all files uploaded may not exceed "
+msgstr "O tamanho total de todos os arquivos carregados não pode exceder "
+
+#: usr/local/www/services_captiveportal_filemanager.php:163
+#: usr/local/www/system_firmware_restorefullbackup.php:141
+#: usr/local/www/services_captiveportal_filemanager.php:160
+#: usr/local/www/diag_system_pftop.php:140
+#: usr/local/www/diag_system_pftop.php:159
+msgid "Size"
+msgstr "Tamanho"
+
+#: usr/local/www/services_captiveportal_filemanager.php:168
+#: usr/local/www/services_captiveportal_filemanager.php:207
+#: usr/local/www/services_captiveportal_filemanager.php:165
+#: usr/local/www/services_captiveportal_filemanager.php:204
+msgid "add file"
+msgstr "adicionar arquivo"
+
+#: usr/local/www/services_captiveportal_filemanager.php:179
+#: usr/local/www/services_captiveportal_filemanager.php:176
+msgid "Do you really want to delete this file?"
+msgstr "Você realmente deseja apagar esse arquivo?"
+
+#: usr/local/www/services_captiveportal_filemanager.php:179
+#: usr/local/www/services_captiveportal_filemanager.php:176
+msgid "delete file"
+msgstr "apagar arquivo"
+
+#: usr/local/www/services_captiveportal_filemanager.php:186
+#: usr/local/www/services_captiveportal_filemanager.php:183
+msgid "TOTAL"
+msgstr "TOTAL"
+
+#: usr/local/www/services_captiveportal_filemanager.php:197
+#: usr/local/www/services_captiveportal_filemanager.php:194
+msgid "cancel"
+msgstr "cancelar"
+
+#: usr/local/www/services_captiveportal_filemanager.php:217
+#: usr/local/www/services_captiveportal_filemanager.php:214
+msgid "Any files that you upload here with the filename prefix of captiveportal- will be made available in the root directory of the captive portal HTTP(S) server. You may reference them directly from your portal page HTML code using relative paths. Example: you've uploaded an image with the name 'captiveportal-test.jpg' using the file manager. Then you can include it in your portal page like this:"
+msgstr "Qualquer arquivo que você carregar aqui com o prefixo de seu nome como captiveportal- será colocado a disposição no diretório root do servidor HTTP(S) do portal captive. Você deve referencia-los diretamente de seu código HTML da página do seu portal usando caminhos relativos. Exemplo: você carregou uma imagem com o nome 'captiveportal-test.jpg' usando o gerenciador de arquivo. Então você pode inclui-lo na sua página de portal assim:"
+
+#: usr/local/www/services_captiveportal_filemanager.php:224
+#: usr/local/www/services_captiveportal_filemanager.php:221
+msgid "In addition, you can also upload .php files for execution. You can pass the filename to your custom page from the initial page by using text similar to:"
+msgstr "Adicionalmente você também pode carregar os arquivos .php para execução. Você pode passar o nome do arquivo para sua página personalizada pela página inicial usando um texto similar a:"
+
+#: usr/local/www/services_captiveportal_filemanager.php:227
+#: usr/local/www/services_captiveportal_filemanager.php:224
+msgid "Acceptable usage policy"
+msgstr "Política de uso aceitável"
+
+#: usr/local/www/services_captiveportal_filemanager.php:229
+#: usr/local/www/services_captiveportal_filemanager.php:226
+#, php-format
+msgid "The total size limit for all files is %s."
+msgstr "O limite total de tamanho para todos os arquivos é %s."
+
+#: usr/local/www/diag_limiter_info.php:46
+msgid "Diagnostics: Limiter Info"
+msgstr "Diagnósticos: Limiter Info"
+
+#: usr/local/www/diag_limiter_info.php:108
+#: usr/local/www/diag_limiter_info.php:109
+msgid "Gathering Limiter information, please wait..."
+msgstr "Definindo informações da fatia, por favor aguarde..."
+
+#: usr/local/www/firewall_nat.php:197 usr/local/www/firewall_nat.php:202
+#: usr/local/www/firewall_nat.php:205
+msgid "Src. addr"
+msgstr "End. fonte"
+
+#: usr/local/www/firewall_nat.php:198 usr/local/www/firewall_nat.php:203
+#: usr/local/www/firewall_nat.php:206
+msgid "Src. ports"
+msgstr "Portas fonte"
+
+#: usr/local/www/firewall_nat.php:199 usr/local/www/firewall_nat.php:204
+#: usr/local/www/firewall_nat.php:207
+msgid "Dest. addr"
+msgstr "End. destino"
+
+#: usr/local/www/firewall_nat.php:200 usr/local/www/firewall_nat.php:205
+#: usr/local/www/firewall_nat.php:208
+msgid "Dest. ports"
+msgstr "Portas destino"
+
+#: usr/local/www/firewall_nat.php:201 usr/local/www/firewall_nat.php:206
+#: usr/local/www/firewall_nat.php:209
+msgid "NAT IP"
+msgstr "IP NAT"
+
+#: usr/local/www/firewall_nat.php:202 usr/local/www/firewall_nat.php:207
+#: usr/local/www/firewall_nat.php:210
+msgid "NAT Ports"
+msgstr "Portas NAT"
+
+#: usr/local/www/firewall_nat.php:252 usr/local/www/firewall_nat.php:265
+#: usr/local/www/firewall_nat.php:268
+msgid "All traffic matching this NAT entry is passed"
+msgstr "Todo o tráfego correspondente a essa entrada NAT é liberado"
+
+#: usr/local/www/firewall_nat.php:254 usr/local/www/firewall_nat.php:267
+#: usr/local/www/firewall_nat.php:270
+msgid "Firewall rule ID"
+msgstr "ID da regra de firewall"
+
+#: usr/local/www/firewall_nat.php:254 usr/local/www/firewall_nat.php:267
+#: usr/local/www/firewall_nat.php:270
+msgid "is managed with this rule"
+msgstr "é gerenciado por essa regra"
+
+#: usr/local/www/firewall_nat.php:313 usr/local/www/firewall_nat_out.php:450
+#: usr/local/www/firewall_nat_out.php:451 usr/local/www/firewall_nat.php:326
+#: usr/local/www/firewall_nat_out.php:448
+#: usr/local/www/firewall_nat_out.php:455 usr/local/www/firewall_nat.php:329
+#: usr/local/www/firewall_nat_out.php:454
+msgid "Do you really want to delete this rule?"
+msgstr "Você realmente quer apagar esta regra?"
+
+#: usr/local/www/firewall_nat.php:349 usr/local/www/firewall_nat.php:362
+#: usr/local/www/firewall_nat.php:365
+msgid "linked rule"
+msgstr "regra associada"
+
+#: usr/local/www/diag_ipsec.php:78 usr/local/www/diag_ipsec_sad.php:73
+#: usr/local/www/diag_ipsec_spd.php:72 usr/local/www/diag_ipsec.php:88
+#: usr/local/www/diag_ipsec.php:89 usr/local/www/diag_ipsec_sad.php:74
+#: usr/local/www/diag_ipsec_spd.php:73 usr/local/www/diag_ipsec.php:91
+msgid "Overview"
+msgstr "Visão geral"
+
+#: usr/local/www/diag_ipsec.php:79 usr/local/www/diag_ipsec_sad.php:49
+#: usr/local/www/diag_ipsec_sad.php:74 usr/local/www/diag_ipsec_spd.php:73
+#: usr/local/www/diag_ipsec.php:89 usr/local/www/diag_ipsec.php:90
+#: usr/local/www/diag_ipsec_sad.php:75 usr/local/www/diag_ipsec_spd.php:74
+#: usr/local/www/diag_ipsec.php:92
+msgid "SAD"
+msgstr "SAD"
+
+#: usr/local/www/diag_ipsec.php:80 usr/local/www/diag_ipsec_sad.php:75
+#: usr/local/www/diag_ipsec_spd.php:49 usr/local/www/diag_ipsec_spd.php:74
+#: usr/local/www/diag_ipsec.php:90 usr/local/www/diag_ipsec.php:91
+#: usr/local/www/diag_ipsec_sad.php:76 usr/local/www/diag_ipsec_spd.php:75
+#: usr/local/www/diag_ipsec.php:93
+msgid "SPD"
+msgstr "SPD"
+
+#: usr/local/www/diag_ipsec.php:81 usr/local/www/diag_ipsec_sad.php:76
+#: usr/local/www/diag_ipsec_spd.php:75 usr/local/www/diag_ipsec.php:91
+#: usr/local/www/diag_ipsec.php:92 usr/local/www/diag_ipsec_sad.php:77
+#: usr/local/www/diag_ipsec_spd.php:76 usr/local/www/diag_ipsec.php:94
+msgid "Logs"
+msgstr "Logs"
+
+#: usr/local/www/diag_ipsec.php:92 usr/local/www/diag_ipsec.php:103
+#: usr/local/www/diag_ipsec.php:104 usr/local/www/diag_ipsec.php:106
+msgid "Remote IP"
+msgstr "IP remoto"
+
+#: usr/local/www/diag_ipsec.php:93 usr/local/www/vpn_ipsec_phase2.php:419
+#: usr/local/www/diag_ipsec.php:104 usr/local/www/vpn_ipsec_phase2.php:445
+#: usr/local/www/diag_ipsec.php:105 usr/local/www/vpn_ipsec_phase2.php:511
+#: usr/local/www/diag_ipsec.php:107 usr/local/www/vpn_ipsec_phase2.php:533
+msgid "Local Network"
+msgstr "Rede Local"
+
+#: usr/local/www/diag_ipsec.php:94 usr/local/www/vpn_ipsec_phase2.php:461
+#: usr/local/www/vpn_openvpn_client.php:762
+#: usr/local/www/vpn_openvpn_server.php:1055 usr/local/www/diag_ipsec.php:105
+#: usr/local/www/vpn_openvpn_server.php:1197
+#: usr/local/www/vpn_ipsec_phase2.php:487
+#: usr/local/www/vpn_openvpn_client.php:767 usr/local/www/diag_ipsec.php:106
+#: usr/local/www/vpn_ipsec_phase2.php:589 usr/local/www/diag_ipsec.php:108
+#: usr/local/www/vpn_ipsec_phase2.php:610
+msgid "Remote Network"
+msgstr "Rede Remota"
+
+#: usr/local/www/diag_ipsec.php:165 usr/local/www/diag_ipsec_sad.php:135
+#: usr/local/www/diag_ipsec_spd.php:144 usr/local/www/diag_ipsec_sad.php:136
+#: usr/local/www/diag_ipsec_spd.php:145
+msgid "You can configure your IPsec"
+msgstr "Você pode configurar seu IPsec"
+
+#: usr/local/www/diag_ipsec_sad.php:90 usr/local/www/diag_ipsec_sad.php:91
+msgid "SPI"
+msgstr "SPI"
+
+#: usr/local/www/diag_ipsec_sad.php:91 usr/local/www/diag_ipsec_sad.php:92
+msgid "Enc. alg."
+msgstr "Enc. alg."
+
+#: usr/local/www/diag_ipsec_sad.php:92 usr/local/www/diag_ipsec_sad.php:93
+msgid "Auth. alg."
+msgstr "Log de Autenticação."
+
+#: usr/local/www/diag_ipsec_sad.php:93 usr/local/www/diag_ipsec_sad.php:94
+msgid "Data"
+msgstr "Data"
+
+#: usr/local/www/diag_ipsec_sad.php:112 usr/local/www/diag_ipsec_sad.php:113
+msgid "Do you really want to delete this security association?"
+msgstr "Você realmente deseja apagar esta associação de segurança?"
+
+#: usr/local/www/diag_ipsec_sad.php:121 usr/local/www/diag_ipsec_sad.php:122
+msgid "No IPsec security associations."
+msgstr "Nenhuma associação de segurança IPsec."
+
+#: usr/local/www/services_captiveportal_ip.php:123
+#: usr/local/www/services_captiveportal_ip.php:163
+#: usr/local/www/services_captiveportal_hostname.php:128
+#: usr/local/www/services_captiveportal_hostname.php:164
+#: usr/local/www/services_captiveportal_ip.php:121
+#: usr/local/www/services_captiveportal_ip.php:161
+#: usr/local/www/services_captiveportal_hostname.php:126
+#: usr/local/www/services_captiveportal_hostname.php:162
+msgid "add address"
+msgstr "adicionar endereço"
+
+#: usr/local/www/services_captiveportal_ip.php:153
+#: usr/local/www/services_captiveportal_hostname.php:154
+#: usr/local/www/services_captiveportal_ip.php:151
+#: usr/local/www/services_captiveportal_hostname.php:152
+msgid "edit address"
+msgstr "editar endereço"
+
+#: usr/local/www/services_captiveportal_ip.php:154
+#: usr/local/www/services_captiveportal_hostname.php:155
+#: usr/local/www/services_captiveportal_ip.php:152
+#: usr/local/www/services_captiveportal_hostname.php:153
+msgid "Do you really want to delete this address?"
+msgstr "Você realmente deseja apagar esse endereço?"
+
+#: usr/local/www/services_captiveportal_ip.php:154
+#: usr/local/www/services_captiveportal_hostname.php:155
+#: usr/local/www/services_captiveportal_ip.php:152
+#: usr/local/www/services_captiveportal_hostname.php:153
+msgid "delete address"
+msgstr "apagar endereço"
+
+#: usr/local/www/services_captiveportal_ip.php:172
+#: usr/local/www/services_captiveportal_ip.php:170
+msgid "Adding allowed IP addresses will allow IP access to/from these addresses through the captive portal without being taken to the portal page. This can be used for a web server serving images for the portal page or a DNS server on another network, for example. By specifying <em>from</em> addresses, it may be used to always allow pass-through access from a client behind the captive portal."
+msgstr "Adicionando endereços IP permitidos irá permitir acesso dos IPs de destino/origem esses endereços através do portal captive sem que sejam direcionados à página do portal. Isso pode ser usado para um servidor web que serve imagens para a página do portal ou um servidor DNS em outra rede, por exemplo. Especificando endereços <em>de origem</em>, isso pode ser usado para sempre permitir acesso pass-through de um cliente por trás do portal captive."
+
+#: usr/local/www/services_captiveportal_ip.php:176
+#: usr/local/www/services_captiveportal_ip.php:183
+#: usr/local/www/services_captiveportal_hostname.php:177
+#: usr/local/www/services_captiveportal_hostname.php:184
+#: usr/local/www/services_captiveportal_ip.php:174
+#: usr/local/www/services_captiveportal_ip.php:181
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/services_captiveportal_hostname.php:182
+msgid "All connections"
+msgstr "Todas as conexões"
+
+#: usr/local/www/services_captiveportal_ip.php:176
+#: usr/local/www/services_captiveportal_ip.php:183
+#: usr/local/www/services_captiveportal_ip.php:174
+#: usr/local/www/services_captiveportal_ip.php:181
+msgid "the IP address are allowed"
+msgstr "o endereço IP permitido"
+
+#: usr/local/www/services_captiveportal_ip.php:183
+#: usr/local/www/services_captiveportal_hostname.php:184
+#: usr/local/www/services_captiveportal_ip.php:181
+#: usr/local/www/services_captiveportal_hostname.php:182
+msgid "from"
+msgstr "de"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:63
+#: usr/local/www/services_captiveportal_ip_edit.php:60
+msgid "Edit allowed IP address"
+msgstr "Editar endereços IP permitidos"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:102
+#: usr/local/www/services_captiveportal_ip_edit.php:100
+#: usr/local/www/services_captiveportal_ip_edit.php:99
+msgid "Allowed IP address"
+msgstr "Endereços IP permitidos"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:110
+#: usr/local/www/services_captiveportal_mac_edit.php:108
+#: usr/local/www/services_captiveportal_hostname_edit.php:110
+#: usr/local/www/services_captiveportal_hostname_edit.php:108
+#: usr/local/www/services_captiveportal_mac_edit.php:106
+#: usr/local/www/services_captiveportal_ip_edit.php:108
+msgid "Upload speed needs to be an integer"
+msgstr "Velocidade de carregamento necessário deve ser um inteiro"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:113
+#: usr/local/www/services_captiveportal_mac_edit.php:110
+#: usr/local/www/services_captiveportal_hostname_edit.php:112
+#: usr/local/www/services_captiveportal_hostname_edit.php:110
+#: usr/local/www/services_captiveportal_mac_edit.php:108
+#: usr/local/www/services_captiveportal_ip_edit.php:111
+msgid "Download speed needs to be an integer"
+msgstr "Velocidade de download necessária deve ser um inteiro"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:120
+#: usr/local/www/services_captiveportal_mac_edit.php:117
+#: usr/local/www/services_captiveportal_hostname_edit.php:119
+#: usr/local/www/services_captiveportal_hostname_edit.php:117
+#: usr/local/www/services_captiveportal_mac_edit.php:115
+#: usr/local/www/services_captiveportal_ip_edit.php:118
+msgid "already allowed"
+msgstr "já permitido"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:175
+#: usr/local/www/services_captiveportal_ip_edit.php:173
+#: usr/local/www/services_captiveportal_ip_edit.php:184
+msgid "Edit allowed ip rule"
+msgstr "Edita regras de IP permitidas"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:182
+#: usr/local/www/services_captiveportal_ip_edit.php:191
+#: usr/local/www/services_captiveportal_hostname_edit.php:164
+#: usr/local/www/services_captiveportal_hostname_edit.php:172
+#: usr/local/www/system_gateways_edit.php:442
+#: usr/local/www/system_gateways_edit.php:454
+#: usr/local/www/system_gateways_edit.php:463
+#: usr/local/www/system_gateways_edit.php:475
+#: usr/local/www/services_captiveportal_hostname_edit.php:162
+#: usr/local/www/services_captiveportal_hostname_edit.php:170
+#: usr/local/www/system_gateways_edit.php:569
+#: usr/local/www/system_gateways_edit.php:581
+#: usr/local/www/services_captiveportal_ip_edit.php:180
+#: usr/local/www/services_captiveportal_ip_edit.php:189
+#: usr/local/www/system_gateways_edit.php:573
+#: usr/local/www/system_gateways_edit.php:585
+#: usr/local/www/system_gateways_edit.php:575
+#: usr/local/www/system_gateways_edit.php:587
+#: usr/local/www/system_gateways_edit.php:605
+#: usr/local/www/system_gateways_edit.php:617
+msgid "From"
+msgstr "De"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:182
+#: usr/local/www/services_captiveportal_ip_edit.php:192
+#: usr/local/www/services_captiveportal_hostname_edit.php:164
+#: usr/local/www/services_captiveportal_hostname_edit.php:173
+#: usr/local/www/system_gateways_edit.php:445
+#: usr/local/www/system_gateways_edit.php:457
+#: usr/local/www/system_gateways_edit.php:466
+#: usr/local/www/system_gateways_edit.php:478
+#: usr/local/www/services_captiveportal_hostname_edit.php:162
+#: usr/local/www/services_captiveportal_hostname_edit.php:171
+#: usr/local/www/system_gateways_edit.php:572
+#: usr/local/www/system_gateways_edit.php:584
+#: usr/local/www/services_captiveportal_ip_edit.php:180
+#: usr/local/www/services_captiveportal_ip_edit.php:190
+#: usr/local/www/system_gateways_edit.php:576
+#: usr/local/www/system_gateways_edit.php:588
+#: usr/local/www/system_gateways_edit.php:578
+#: usr/local/www/system_gateways_edit.php:590
+#: usr/local/www/system_gateways_edit.php:608
+#: usr/local/www/system_gateways_edit.php:620
+msgid "To"
+msgstr "Para"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:191
+#: usr/local/www/services_captiveportal_ip_edit.php:192
+#: usr/local/www/services_captiveportal_hostname_edit.php:172
+#: usr/local/www/services_captiveportal_hostname_edit.php:173
+#: usr/local/www/services_captiveportal_hostname_edit.php:170
+#: usr/local/www/services_captiveportal_hostname_edit.php:171
+#: usr/local/www/services_captiveportal_ip_edit.php:189
+#: usr/local/www/services_captiveportal_ip_edit.php:190
+msgid "Use"
+msgstr "Use"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:191
+#: usr/local/www/services_captiveportal_ip_edit.php:189
+msgid "to always allow an IP address through the captive portal (without authentication)"
+msgstr "para sempre permitir um endereço de IP através do portal captive (sem autenticação)"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:192
+#: usr/local/www/services_captiveportal_ip_edit.php:190
+msgid "to allow access from all clients (even non-authenticated ones) behind the portal to this IP address"
+msgstr "para permitir acesso de todos os clientes (mesmo aqueles não autenticados) atrás do portal para esse endereço de IP"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:204
+#: usr/local/www/services_captiveportal_ip_edit.php:202
+#: usr/local/www/services_captiveportal_ip_edit.php:196
+msgid "IP address and subnet mask. Use /32 for a single IP"
+msgstr "Endereço IP e máscara de subrede. Use /32 para um IP sozinho"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:215
+#: usr/local/www/services_captiveportal_mac_edit.php:189
+#: usr/local/www/services_captiveportal_hostname_edit.php:189
+#: usr/local/www/services_captiveportal_hostname_edit.php:187
+#: usr/local/www/services_captiveportal_mac_edit.php:187
+#: usr/local/www/services_captiveportal_ip_edit.php:213
+#: usr/local/www/services_captiveportal_ip_edit.php:207
+#: usr/local/www/services_captiveportal_mac_edit.php:200
+msgid "Bandwidth up"
+msgstr "Tamanho de banda de carregamento"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:218
+#: usr/local/www/services_captiveportal_ip_edit.php:216
+#: usr/local/www/services_captiveportal_ip_edit.php:210
+msgid "Enter a upload limit to be enforced on this IP address in Kbit/s"
+msgstr "Informe um limite de carregamento para ser utilizado nesse endereço IP em Kbit/s"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:222
+#: usr/local/www/services_captiveportal_mac_edit.php:195
+#: usr/local/www/services_captiveportal_hostname_edit.php:195
+#: usr/local/www/services_captiveportal_hostname_edit.php:193
+#: usr/local/www/services_captiveportal_mac_edit.php:193
+#: usr/local/www/services_captiveportal_ip_edit.php:220
+#: usr/local/www/services_captiveportal_ip_edit.php:214
+#: usr/local/www/services_captiveportal_mac_edit.php:206
+msgid "Bandwidth down"
+msgstr "Tamanho de banda de download"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:225
+#: usr/local/www/services_captiveportal_ip_edit.php:223
+#: usr/local/www/services_captiveportal_ip_edit.php:217
+msgid "Enter a download limit to be enforced on this IP address in Kbit/s"
+msgstr "Informe o limite de download para ser utilizado nesse endereço IP em Kbit/s"
+
+#: usr/local/www/services_captiveportal_mac.php:80
+#: usr/local/www/services_captiveportal_mac.php:78
+msgid "No entry exists yet!"
+msgstr "Nenhuma entrada existente ainda!"
+
+#: usr/local/www/services_captiveportal_mac.php:84
+#: usr/local/www/services_captiveportal_mac.php:82
+msgid "Please set the zone on which the operation should be allowed"
+msgstr "Por favor, defina a zona na qual a operação deve ser permitida"
+
+#: usr/local/www/services_captiveportal_mac.php:96
+#: usr/local/www/services_captiveportal_mac.php:94
+msgid "No entry exists for this username:"
+msgstr "Nenhuma entrada existente para esse nome de usuário:"
+
+#: usr/local/www/services_captiveportal_mac.php:115
+#: usr/local/www/services_captiveportal_mac.php:113
+#: usr/local/www/services_captiveportal_mac.php:118
+msgid "The entry was sucessfully deleted"
+msgstr "A entrada foi apagada com sucesso"
+
+#: usr/local/www/services_captiveportal_mac.php:117
+#: usr/local/www/services_captiveportal_mac.php:115
+#: usr/local/www/services_captiveportal_mac.php:120
+msgid "No entry exists for this mac address:"
+msgstr "Nenhuma entrada existente para esse endereço mac:"
+
+#: usr/local/www/services_captiveportal_mac.php:148
+#: usr/local/www/services_captiveportal_mac.php:146
+#: usr/local/www/services_captiveportal_mac.php:156
+msgid "The captive portal MAC address configuration has been changed.<br>You must apply the changes in order for them to take effect."
+msgstr "A configuração de endereço MAC do portal captive foi modificada.<br>Você deve aplicar as modificações para que elas tenham efeito."
+
+#: usr/local/www/services_captiveportal_mac.php:180
+#: usr/local/www/services_captiveportal_mac.php:178
+#: usr/local/www/services_captiveportal_mac.php:188
+msgid "edit host"
+msgstr "editar host"
+
+#: usr/local/www/services_captiveportal_mac.php:181
+#: usr/local/www/services_dnsmasq.php:276
+#: usr/local/www/services_unbound.php:312
+#: usr/local/www/services_dnsmasq.php:277
+#: usr/local/www/services_captiveportal_mac.php:179
+#: usr/local/www/services_dnsmasq.php:302
+#: usr/local/www/services_captiveportal_mac.php:189
+#: usr/local/www/services_dnsmasq.php:315
+#: usr/local/www/services_dnsmasq.php:379
+msgid "Do you really want to delete this host?"
+msgstr "Você realmente deseja apagar esse host?"
+
+#: usr/local/www/services_captiveportal_mac.php:181
+#: usr/local/www/services_captiveportal_mac.php:179
+#: usr/local/www/services_captiveportal_mac.php:189
+msgid "delete host"
+msgstr "remover host"
+
+#: usr/local/www/services_captiveportal_mac.php:186
+#: usr/local/www/services_captiveportal_mac.php:184
+#: usr/local/www/services_captiveportal_mac.php:194
+msgid "add host"
+msgstr "adicionar host"
+
+#: usr/local/www/services_captiveportal_mac.php:192
+#: usr/local/www/services_captiveportal_mac.php:190
+#: usr/local/www/services_captiveportal_mac.php:200
+msgid "Adding MAC addresses as pass-through MACs allows them access through the captive portal automatically without being taken to the portal page."
+msgstr "Adicionar endereços MAC como MACs pass-throughs permite que eles tenham acesso através do portal captive automaticamente sem que sejam direcionados à página do portal."
+
+#: usr/local/www/services_captiveportal_mac_edit.php:60
+#: usr/local/www/services_captiveportal_mac_edit.php:57
+msgid "Edit pass-through MAC address"
+msgstr "Editar endereço MAC pass-through"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:105
+#: usr/local/www/services_captiveportal_mac_edit.php:103
+msgid "A valid MAC address must be specified"
+msgstr "Um endereço MAC válido deve ser especificado"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:172
+#: usr/local/www/services_captiveportal_mac_edit.php:170
+#: usr/local/www/services_captiveportal_mac_edit.php:177
+msgid "Edit Pass-through MAC address"
+msgstr "Editar liberação de tráfego (Pass-through) do endereço MAC"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:179
+#: usr/local/www/services_captiveportal_mac_edit.php:177
+#: usr/local/www/services_captiveportal_mac_edit.php:190
+msgid "MAC address (6 hex octets separated by colons)"
+msgstr "Endereço MAC (6 octetos hexadecimais separados por vírgulas)"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:192
+#: usr/local/www/services_captiveportal_mac_edit.php:190
+#: usr/local/www/services_captiveportal_mac_edit.php:203
+msgid "Enter a upload limit to be enforced on this MAC address in Kbit/s"
+msgstr "Informe um limite de carregamento para ser utilizado nesse endereço MAC em Kbit/s"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:198
+#: usr/local/www/services_captiveportal_mac_edit.php:196
+#: usr/local/www/services_captiveportal_mac_edit.php:209
+msgid "Enter a download limit to be enforced on this MAC address in Kbit/s"
+msgstr "Informe um limite de download para ser utilizado nesse endereço MAC em Kbit/s"
+
+#: usr/local/www/diag_ipsec_spd.php:90 usr/local/www/diag_ipsec_spd.php:91
+msgid "Tunnel endpoints"
+msgstr "Extremidades do túnel"
+
+#: usr/local/www/diag_ipsec_spd.php:108 usr/local/www/diag_ipsec_spd.php:109
+msgid "Do you really want to delete this security policy?"
+msgstr "Você realmente deseja excluir essa politica de segurança?"
+
+#: usr/local/www/diag_ipsec_spd.php:119 usr/local/www/diag_ipsec_spd.php:120
+msgid "incoming (as seen by firewall)"
+msgstr "entrada (como visto pelo firewall)"
+
+#: usr/local/www/diag_ipsec_spd.php:126 usr/local/www/diag_ipsec_spd.php:127
+msgid "outgoing (as seen by firewall)"
+msgstr "saída (como visto pelo firewall)"
+
+#: usr/local/www/diag_ipsec_spd.php:131 usr/local/www/diag_ipsec_spd.php:132
+msgid "No IPsec security policies."
+msgstr "Nenhuma politica de segurança IPsec."
+
+#: usr/local/www/diag_ping.php:59 usr/local/www/diag_ping.php:61
+#, php-format
+msgid "Count must be between 1 and %s"
+msgstr "Contagem deve estar entre 1 e %s"
+
+#: usr/local/www/diag_ping.php:126 usr/local/www/diag_ping.php:148
+msgid "Ping output"
+msgstr "Ping output"
+
+#: usr/local/www/services_dhcp.php:111 usr/local/www/services_dhcp.php:112
+msgid "The DHCP Server can only be enabled on interfaces configured with static IP addresses"
+msgstr "O servidor DHCP pode somente ser habilitado em interfaces configuradas com endereços IP estáticos"
+
+#: usr/local/www/services_dhcp.php:111 usr/local/www/services_dhcpv6.php:74
+#: usr/local/www/services_router_advertisements.php:75
+#: usr/local/www/services_dhcpv6.php:75 usr/local/www/services_dhcp.php:112
+msgid "Only interfaces configured with a static IP will be shown"
+msgstr "Somente interfaces configuradas com um IP estático serão exibidas"
+
+#: usr/local/www/services_dhcp.php:207 usr/local/www/services_dhcpv6.php:177
+#: usr/local/www/services_dhcp.php:208 usr/local/www/services_dhcpv6.php:189
+#: usr/local/www/services_dhcp.php:254 usr/local/www/services_dhcpv6.php:174
+#: usr/local/www/services_dhcp.php:235 usr/local/www/services_dhcpv6.php:168
+#: usr/local/www/services_dhcp.php:236
+msgid "Range begin"
+msgstr "Início do intervalo"
+
+#: usr/local/www/services_dhcp.php:207 usr/local/www/services_dhcpv6.php:177
+#: usr/local/www/services_dhcp.php:208 usr/local/www/services_dhcpv6.php:189
+#: usr/local/www/services_dhcp.php:254 usr/local/www/services_dhcpv6.php:174
+#: usr/local/www/services_dhcp.php:235 usr/local/www/services_dhcpv6.php:168
+#: usr/local/www/services_dhcp.php:236
+msgid "Range end"
+msgstr "Fim do intervalo"
+
+#: usr/local/www/services_dhcp.php:212 usr/local/www/services_dhcp.php:214
+#: usr/local/www/services_dhcpv6.php:182 usr/local/www/services_dhcpv6.php:186
+#: usr/local/www/services_dhcpv6.php:188 usr/local/www/services_dhcp.php:213
+#: usr/local/www/services_dhcp.php:215 usr/local/www/services_dhcpv6.php:194
+#: usr/local/www/services_dhcpv6.php:198 usr/local/www/services_dhcpv6.php:200
+#: usr/local/www/services_dhcp.php:259 usr/local/www/services_dhcp.php:261
+#: usr/local/www/services_dhcpv6.php:179 usr/local/www/services_dhcpv6.php:183
+#: usr/local/www/services_dhcpv6.php:185 usr/local/www/services_dhcp.php:240
+#: usr/local/www/services_dhcp.php:242 usr/local/www/services_dhcpv6.php:173
+#: usr/local/www/services_dhcpv6.php:177 usr/local/www/services_dhcp.php:241
+#: usr/local/www/services_dhcp.php:243
+msgid "A valid range must be specified."
+msgstr "Um intervalo válido deve ser especificado."
+
+#: usr/local/www/services_dhcp.php:216 usr/local/www/services_dhcp.php:217
+#: usr/local/www/services_dhcp.php:263
+#: usr/local/www/services_dhcp_edit.php:207
+#: usr/local/www/services_dhcp.php:244 usr/local/www/services_dhcp.php:245
+msgid "A valid IP address must be specified for the gateway."
+msgstr "Um endereço IP válido deve ser especificado para o gateway."
+
+#: usr/local/www/services_dhcp.php:218 usr/local/www/services_dhcp.php:219
+#: usr/local/www/services_dhcp.php:265
+#: usr/local/www/services_dhcp_edit.php:209
+#: usr/local/www/services_dhcp.php:246 usr/local/www/services_dhcp.php:247
+msgid "A valid IP address must be specified for the primary/secondary WINS servers."
+msgstr "Um endereço IP válido deve ser especificado para os servidores WINS primário/secundário."
+
+#: usr/local/www/services_dhcp.php:223 usr/local/www/services_dhcp.php:224
+#: usr/local/www/services_dhcp.php:270
+#: usr/local/www/services_dhcp_edit.php:215
+#: usr/local/www/services_dhcp.php:251 usr/local/www/services_dhcp.php:252
+#, php-format
+msgid "The gateway address %s does not lie within the chosen interface's subnet."
+msgstr "O endereço gateway %s não está dentro da subrede da interface escolhida."
+
+#: usr/local/www/services_dhcp.php:226 usr/local/www/services_dhcp.php:227
+#: usr/local/www/services_dhcp.php:273
+#: usr/local/www/services_dhcp_edit.php:218
+#: usr/local/www/services_dhcp.php:254 usr/local/www/services_dhcp.php:255
+msgid "A valid IP address must be specified for the primary/secondary DNS servers."
+msgstr "Um endereço IP válido deve ser especificado para os servidores DNS primário/secundário."
+
+#: usr/local/www/services_dhcp.php:229 usr/local/www/services_dhcpv6.php:195
+#: usr/local/www/services_dhcp.php:230 usr/local/www/services_dhcpv6.php:207
+#: usr/local/www/services_dhcp.php:276 usr/local/www/services_dhcpv6.php:192
+#: usr/local/www/services_dhcp_edit.php:221
+#: usr/local/www/services_dhcp.php:257 usr/local/www/services_dhcpv6.php:186
+#: usr/local/www/services_dhcp.php:258
+msgid "The default lease time must be at least 60 seconds."
+msgstr "O tempo de concessão padrão deve ser de no mínimo 60 segundos."
+
+#: usr/local/www/services_dhcp.php:231 usr/local/www/services_dhcpv6.php:197
+#: usr/local/www/services_dhcp.php:232 usr/local/www/services_dhcpv6.php:209
+#: usr/local/www/services_dhcp.php:278 usr/local/www/services_dhcpv6.php:194
+#: usr/local/www/services_dhcp_edit.php:223
+#: usr/local/www/services_dhcp.php:259 usr/local/www/services_dhcpv6.php:188
+#: usr/local/www/services_dhcp.php:279 usr/local/www/services_dhcp.php:280
+msgid "The maximum lease time must be at least 60 seconds and higher than the default lease time."
+msgstr "O tempo de concessão máximo deve ser no mínimo de 60 segundos e maior que o tempo de concessão padrão."
+
+#: usr/local/www/services_dhcp.php:233 usr/local/www/services_dhcpv6.php:199
+#: usr/local/www/services_dhcp.php:234 usr/local/www/services_dhcpv6.php:211
+#: usr/local/www/services_dhcp.php:280 usr/local/www/services_dhcpv6.php:196
+#: usr/local/www/services_dhcp_edit.php:225
+#: usr/local/www/services_dhcp.php:261 usr/local/www/services_dhcpv6.php:190
+#: usr/local/www/services_dhcp.php:281 usr/local/www/services_dhcp.php:282
+msgid "A valid domain name must be specified for the dynamic DNS registration."
+msgstr "Um nome de domínio válido deve ser especificado para o registro de DNS dinâmico."
+
+#: usr/local/www/services_dhcp.php:235 usr/local/www/services_dhcp.php:246
+#: usr/local/www/services_dhcp.php:298
+#: usr/local/www/services_dhcp_edit.php:237
+#: usr/local/www/services_dhcp.php:279 usr/local/www/services_dhcp.php:299
+#: usr/local/www/services_dhcp.php:300
+msgid "A valid IP address must be specified for the primary/secondary NTP servers."
+msgstr "Um endereço IP válido deve ser especificado pelos servidores NTP primário/secundário."
+
+#: usr/local/www/services_dhcp.php:237 usr/local/www/services_dhcpv6.php:203
+#: usr/local/www/services_dhcp.php:248 usr/local/www/services_dhcpv6.php:225
+#: usr/local/www/services_dhcp.php:300 usr/local/www/services_dhcpv6.php:210
+#: usr/local/www/services_dhcp.php:281 usr/local/www/services_dhcpv6.php:204
+#: usr/local/www/services_dhcp.php:301 usr/local/www/services_dhcp.php:302
+msgid "A valid domain name must be specified for the DNS domain."
+msgstr "Um nome de domínio válido deve ser especificado para o domínio DNS."
+
+#: usr/local/www/services_dhcp.php:239 usr/local/www/services_dhcp.php:250
+#: usr/local/www/services_dhcp.php:302
+#: usr/local/www/services_dhcp_edit.php:239
+#: usr/local/www/services_dhcp.php:283 usr/local/www/services_dhcp.php:303
+#: usr/local/www/services_dhcp.php:304
+msgid "A valid IP address or hostname must be specified for the TFTP server."
+msgstr "Um endereço IP válido ou nome de host deve ser especificado para o servidor TFTP."
+
+#: usr/local/www/services_dhcp.php:241 usr/local/www/services_dhcp.php:252
+#: usr/local/www/services_dhcp.php:304
+#: usr/local/www/services_dhcp_edit.php:241
+#: usr/local/www/services_dhcp.php:285 usr/local/www/services_dhcp.php:305
+#: usr/local/www/services_dhcp.php:306
+msgid "A valid IP address must be specified for the network boot server."
+msgstr "Um endereço IP válido deve ser especificado para o servidor de boot da rede."
+
+#: usr/local/www/services_dhcp.php:244 usr/local/www/services_dhcp.php:255
+#: usr/local/www/services_dhcp.php:307 usr/local/www/services_dhcp.php:288
+#: usr/local/www/services_dhcp.php:308 usr/local/www/services_dhcp.php:309
+msgid "You cannot use the network address in the starting subnet range."
+msgstr "Você não pode usar o endereço da rede no início do intervalo da subrede."
+
+#: usr/local/www/services_dhcp.php:246 usr/local/www/services_dhcp.php:257
+#: usr/local/www/services_dhcp.php:309 usr/local/www/services_dhcp.php:290
+#: usr/local/www/services_dhcp.php:310 usr/local/www/services_dhcp.php:311
+msgid "You cannot use the broadcast address in the ending subnet range."
+msgstr "Você não pode usar o endereço de broadcast no final do intervalo de subrede."
+
+#: usr/local/www/services_dhcp.php:253 usr/local/www/services_dhcp.php:264
+#: usr/local/www/services_dhcp.php:316 usr/local/www/services_dhcp.php:297
+#: usr/local/www/services_dhcp.php:317 usr/local/www/services_dhcp.php:318
+#, php-format
+msgid "The subnet range cannot overlap with virtual IP address %s."
+msgstr "O intervalo de subrede não pode sobrepor o endereço IP virtual %s."
+
+#: usr/local/www/services_dhcp.php:268 usr/local/www/services_dhcp.php:279
+#: usr/local/www/services_dhcp.php:331 usr/local/www/services_dhcp.php:312
+#: usr/local/www/services_dhcp.php:332 usr/local/www/services_dhcp.php:333
+msgid "Text type cannot include quotation marks."
+msgstr "Tipo texto não pode ter aspas."
+
+#: usr/local/www/services_dhcp.php:270 usr/local/www/services_dhcp.php:281
+#: usr/local/www/services_dhcp.php:333 usr/local/www/services_dhcp.php:314
+#: usr/local/www/services_dhcp.php:334 usr/local/www/services_dhcp.php:335
+msgid "String type must be enclosed in quotes like \"this\" or must be a series of octets specified in hexadecimal, separated by colons, like 01:23:45:67:89:ab:cd:ef"
+msgstr "Tipo String deve estar entre aspas \"assim\" ou deve ter uma série de octetos especificados em hexadecimal, separados por dois pontos, como 01:23:45:67:89:ab:cd:ef"
+
+#: usr/local/www/services_dhcp.php:272 usr/local/www/services_dhcp.php:283
+#: usr/local/www/services_dhcp.php:335 usr/local/www/services_dhcp.php:316
+#: usr/local/www/services_dhcp.php:336 usr/local/www/services_dhcp.php:337
+msgid "Boolean type must be true, false, on, or off."
+msgstr "Tipo booleano deve ser true, false, on ou off."
+
+#: usr/local/www/services_dhcp.php:274 usr/local/www/services_dhcp.php:285
+#: usr/local/www/services_dhcp.php:337 usr/local/www/services_dhcp.php:318
+#: usr/local/www/services_dhcp.php:338 usr/local/www/services_dhcp.php:339
+msgid "Unsigned 8-bit integer type must be a number in the range 0 to 255."
+msgstr "Inteiro de 8-bits sem sinal deve ser um número no intervalo de 0 a 255."
+
+#: usr/local/www/services_dhcp.php:276 usr/local/www/services_dhcp.php:287
+#: usr/local/www/services_dhcp.php:339 usr/local/www/services_dhcp.php:320
+#: usr/local/www/services_dhcp.php:340 usr/local/www/services_dhcp.php:341
+msgid "Unsigned 16-bit integer type must be a number in the range 0 to 65535."
+msgstr "Inteiro de 16-bits sem sinal deve ser um número no intervalo de 0 a 65535."
+
+#: usr/local/www/services_dhcp.php:278 usr/local/www/services_dhcp.php:289
+#: usr/local/www/services_dhcp.php:341 usr/local/www/services_dhcp.php:322
+#: usr/local/www/services_dhcp.php:342 usr/local/www/services_dhcp.php:343
+msgid "Unsigned 32-bit integer type must be a number in the range 0 to 4294967295."
+msgstr "Inteiro de 32-bits sem sinal deve ser um número no intervalo de 0 a 4294967295."
+
+#: usr/local/www/services_dhcp.php:280 usr/local/www/services_dhcp.php:291
+#: usr/local/www/services_dhcp.php:343 usr/local/www/services_dhcp.php:324
+#: usr/local/www/services_dhcp.php:344 usr/local/www/services_dhcp.php:345
+msgid "Signed 8-bit integer type must be a number in the range -128 to 127."
+msgstr "Inteiro de 8-bits com sinal deve ser um número no intervalo de -128 a 127."
+
+#: usr/local/www/services_dhcp.php:282 usr/local/www/services_dhcp.php:293
+#: usr/local/www/services_dhcp.php:345 usr/local/www/services_dhcp.php:326
+#: usr/local/www/services_dhcp.php:346 usr/local/www/services_dhcp.php:347
+msgid "Signed 16-bit integer type must be a number in the range -32768 to 32767."
+msgstr "Inteiro de 16-bits com sinal deve ser um número no intervalo de -32768 a 32767."
+
+#: usr/local/www/services_dhcp.php:284 usr/local/www/services_dhcp.php:295
+#: usr/local/www/services_dhcp.php:347 usr/local/www/services_dhcp.php:328
+#: usr/local/www/services_dhcp.php:348 usr/local/www/services_dhcp.php:349
+msgid "Signed 32-bit integer type must be a number in the range -2147483648 to 2147483647."
+msgstr "Inteiro de 32-bits com sinal deve ser um número no intervalo de -2147483648 a 2147483647."
+
+#: usr/local/www/services_dhcp.php:286 usr/local/www/services_dhcp.php:297
+#: usr/local/www/services_dhcp.php:349 usr/local/www/services_dhcp.php:330
+#: usr/local/www/services_dhcp.php:350 usr/local/www/services_dhcp.php:351
+msgid "IP address or host type must be an IP address or host name."
+msgstr "Endereço IP ou tipo de host deve ser um endereço IP ou nome de host."
+
+#: usr/local/www/services_dhcp.php:297 usr/local/www/services_dhcpv6.php:230
+#: usr/local/www/services_dhcp.php:308 usr/local/www/services_dhcpv6.php:252
+#: usr/local/www/services_dhcp.php:360 usr/local/www/services_dhcpv6.php:237
+#: usr/local/www/services_dhcp.php:341 usr/local/www/services_dhcpv6.php:232
+#: usr/local/www/services_dhcp.php:361 usr/local/www/services_dhcp.php:362
+msgid "The specified range lies outside of the current subnet."
+msgstr "O intervalo especificado está fora da subrede atual."
+
+#: usr/local/www/services_dhcp.php:301 usr/local/www/services_dhcp.php:312
+#: usr/local/www/services_dhcpv6.php:257 usr/local/www/services_dhcp.php:364
+#: usr/local/www/services_dhcpv6.php:242 usr/local/www/services_dhcp.php:345
+#: usr/local/www/services_dhcpv6.php:237 usr/local/www/services_dhcp.php:365
+#: usr/local/www/services_dhcp.php:366
+msgid "The range is invalid (first element higher than second element)."
+msgstr "O intervalo é inválido (primeiro elemento maior que o segunto elemento)."
+
+#: usr/local/www/services_dhcp.php:305 usr/local/www/services_dhcpv6.php:240
+#: usr/local/www/services_dhcp.php:316 usr/local/www/services_dhcpv6.php:261
+#: usr/local/www/services_dhcp.php:372 usr/local/www/services_dhcpv6.php:246
+#: usr/local/www/services_dhcp.php:368 usr/local/www/services_dhcpv6.php:241
+#: usr/local/www/services_dhcp.php:388 usr/local/www/services_dhcp.php:389
+#, php-format
+msgid "You must disable the DHCP relay on the %s interface before enabling the DHCP server."
+msgstr "Você deve desabilitar o DHCP relay na interface %s antes de habilitar o servidor DHCP."
+
+#: usr/local/www/services_dhcp.php:315 usr/local/www/services_dhcp.php:326
+#: usr/local/www/services_dhcpv6.php:276 usr/local/www/services_dhcp.php:382
+#: usr/local/www/services_dhcpv6.php:261 usr/local/www/services_dhcp.php:378
+#: usr/local/www/services_dhcpv6.php:256 usr/local/www/services_dhcp.php:398
+#: usr/local/www/services_dhcp.php:399
+#, php-format
+msgid "The DHCP range cannot overlap any static DHCP mappings."
+msgstr "O intervalo DHCP não pode sobrepor nenhum mapeamento DHCP estático."
+
+#: usr/local/www/services_dhcp.php:421 usr/local/www/services_dhcp.php:433
+#: usr/local/www/services_dhcp.php:527 usr/local/www/services_dhcp.php:526
+#: usr/local/www/services_dhcp.php:546 usr/local/www/services_dhcp.php:558
+msgid "DHCP server"
+msgstr "Servidor DHCP"
+
+#: usr/local/www/services_dhcp.php:435 usr/local/www/services_dhcp.php:447
+#: usr/local/www/services_dhcp.php:540 usr/local/www/services_dhcp.php:539
+#: usr/local/www/services_dhcp.php:559 usr/local/www/services_dhcp.php:571
+msgid "Text"
+msgstr "Texto"
+
+#: usr/local/www/services_dhcp.php:435 usr/local/www/services_dhcp.php:447
+#: usr/local/www/services_dhcp.php:540 usr/local/www/services_dhcp.php:539
+#: usr/local/www/services_dhcp.php:559 usr/local/www/services_dhcp.php:571
+msgid "String"
+msgstr "String"
+
+#: usr/local/www/services_dhcp.php:435 usr/local/www/services_dhcp.php:447
+#: usr/local/www/services_dhcp.php:540 usr/local/www/services_dhcp.php:539
+#: usr/local/www/services_dhcp.php:559 usr/local/www/services_dhcp.php:571
+msgid "Boolean"
+msgstr "Booleano"
+
+#: usr/local/www/services_dhcp.php:436 usr/local/www/services_dhcp.php:448
+#: usr/local/www/services_dhcp.php:541 usr/local/www/services_dhcp.php:540
+#: usr/local/www/services_dhcp.php:560 usr/local/www/services_dhcp.php:572
+msgid "Unsigned 8-bit integer"
+msgstr "Inteiro de 8-bits sem sinal"
+
+#: usr/local/www/services_dhcp.php:436 usr/local/www/services_dhcp.php:448
+#: usr/local/www/services_dhcp.php:541 usr/local/www/services_dhcp.php:540
+#: usr/local/www/services_dhcp.php:560 usr/local/www/services_dhcp.php:572
+msgid "Unsigned 16-bit integer"
+msgstr "Inteiro de 16-bits sem sinal"
+
+#: usr/local/www/services_dhcp.php:436 usr/local/www/services_dhcp.php:448
+#: usr/local/www/services_dhcp.php:541 usr/local/www/services_dhcp.php:540
+#: usr/local/www/services_dhcp.php:560 usr/local/www/services_dhcp.php:572
+msgid "Unsigned 32-bit integer"
+msgstr "Inteiro de 32-bits sem sinal"
+
+#: usr/local/www/services_dhcp.php:437 usr/local/www/services_dhcp.php:449
+#: usr/local/www/services_dhcp.php:542 usr/local/www/services_dhcp.php:541
+#: usr/local/www/services_dhcp.php:561 usr/local/www/services_dhcp.php:573
+msgid "Signed 8-bit integer"
+msgstr "Inteiro de 8-bits com sinal"
+
+#: usr/local/www/services_dhcp.php:437 usr/local/www/services_dhcp.php:449
+#: usr/local/www/services_dhcp.php:542 usr/local/www/services_dhcp.php:541
+#: usr/local/www/services_dhcp.php:561 usr/local/www/services_dhcp.php:573
+msgid "Signed 16-bit integer"
+msgstr "Inteiro de 16-bits com sinal"
+
+#: usr/local/www/services_dhcp.php:437 usr/local/www/services_dhcp.php:449
+#: usr/local/www/services_dhcp.php:542 usr/local/www/services_dhcp.php:541
+#: usr/local/www/services_dhcp.php:561 usr/local/www/services_dhcp.php:573
+msgid "Signed 32-bit integer"
+msgstr "Inteiro de 32-bits com sinal"
+
+#: usr/local/www/services_dhcp.php:437 usr/local/www/services_dhcp.php:449
+#: usr/local/www/services_dhcp.php:542 usr/local/www/services_dhcp.php:541
+#: usr/local/www/services_dhcp.php:561 usr/local/www/services_dhcp.php:573
+msgid "IP address or host"
+msgstr "Endereço IP ou host"
+
+#: usr/local/www/services_dhcp.php:528 usr/local/www/services_dhcpv6.php:453
+#: usr/local/www/services_dhcp.php:541 usr/local/www/services_dhcpv6.php:480
+#: usr/local/www/services_dhcp.php:645 usr/local/www/services_dhcpv6.php:460
+#: usr/local/www/services_dhcp.php:647 usr/local/www/services_dhcpv6.php:455
+#: usr/local/www/services_dhcp.php:667 usr/local/www/services_dhcp.php:679
+msgid "DHCP Relay is currently enabled. Cannot enable the DHCP Server service while the DHCP Relay is enabled on any interface."
+msgstr "DHCP Relay está atualmente habilitado. Não é possível habilitar do serviço do Servidor DHCP enquanto o DHCP Relay estiver habilitado em qualquer interface."
+
+#: usr/local/www/services_dhcp.php:536 usr/local/www/services_dhcpv6.php:461
+#: usr/local/www/services_dhcp.php:549 usr/local/www/services_dhcpv6.php:488
+#: usr/local/www/services_dhcp.php:653 usr/local/www/services_dhcpv6.php:468
+#: usr/local/www/services_dhcp.php:655 usr/local/www/services_dhcpv6.php:463
+#: usr/local/www/services_dhcp.php:675 usr/local/www/services_dhcp.php:687
+msgid "The static mapping configuration has been changed"
+msgstr "A configuração de mapeamento estático foi modificada"
+
+#: usr/local/www/services_dhcp.php:575 usr/local/www/services_dhcp.php:588
+#: usr/local/www/services_dhcp.php:693 usr/local/www/services_dhcp.php:695
+#: usr/local/www/services_dhcp.php:715 usr/local/www/services_dhcp.php:727
+#, php-format
+msgid "Enable DHCP server on %s interface"
+msgstr "Habilitar servidor DHCP na interface %s"
+
+#: usr/local/www/services_dhcp.php:583 usr/local/www/services_dhcpv6.php:518
+#: usr/local/www/services_dhcp.php:596 usr/local/www/services_dhcpv6.php:592
+#: usr/local/www/services_dhcp.php:706 usr/local/www/services_dhcpv6.php:523
+#: usr/local/www/services_dhcp.php:708 usr/local/www/services_dhcpv6.php:534
+#: usr/local/www/services_dhcp.php:728 usr/local/www/services_dhcp.php:740
+msgid "Deny unknown clients"
+msgstr "Negar clientes desconhecidos"
+
+#: usr/local/www/services_dhcp.php:584 usr/local/www/services_dhcpv6.php:519
+#: usr/local/www/services_dhcp.php:597 usr/local/www/services_dhcpv6.php:593
+#: usr/local/www/services_dhcp.php:707 usr/local/www/services_dhcpv6.php:524
+#: usr/local/www/services_dhcp.php:709 usr/local/www/services_dhcpv6.php:535
+#: usr/local/www/services_dhcp.php:729 usr/local/www/services_dhcp.php:741
+msgid "If this is checked, only the clients defined below will get DHCP leases from this server. "
+msgstr "Se isso estiver marcado, somente os clientes abaixo obterão concessões DHCP desse servidor."
+
+#: usr/local/www/services_dhcp.php:593 usr/local/www/services_dhcpv6.php:528
+#: usr/local/www/services_dhcp.php:606 usr/local/www/services_dhcpv6.php:602
+#: usr/local/www/services_dhcp.php:716 usr/local/www/services_dhcpv6.php:533
+#: usr/local/www/services_captiveportal_ip_edit.php:99
+#: usr/local/www/services_dhcp.php:726 usr/local/www/services_dhcpv6.php:548
+#: usr/local/www/services_dhcp.php:746 usr/local/www/services_dhcp.php:758
+msgid "Subnet mask"
+msgstr "Máscara de subrede"
+
+#: usr/local/www/services_dhcp.php:599 usr/local/www/services_dhcpv6.php:534
+#: usr/local/www/services_dhcp.php:612 usr/local/www/services_dhcpv6.php:608
+#: usr/local/www/services_dhcp.php:722 usr/local/www/services_dhcpv6.php:539
+#: usr/local/www/services_dhcp.php:732 usr/local/www/services_dhcpv6.php:554
+#: usr/local/www/services_dhcp.php:752 usr/local/www/services_dhcp.php:764
+msgid "Available range"
+msgstr "Intervalo disponível"
+
+#: usr/local/www/services_dhcp.php:616 usr/local/www/services_dhcpv6.php:552
+#: usr/local/www/services_dhcp.php:629 usr/local/www/services_dhcpv6.php:625
+#: usr/local/www/services_dhcp.php:750 usr/local/www/vpn_l2tp.php:342
+#: usr/local/www/services_dhcpv6.php:556 usr/local/www/vpn_l2tp.php:345
+#: usr/local/www/services_dhcp.php:760 usr/local/www/services_dhcpv6.php:573
+#: usr/local/www/services_dhcp.php:780 usr/local/www/services_dhcp.php:792
+msgid "Subnet Mask"
+msgstr "Máscara de subrede"
+
+#: usr/local/www/services_dhcp.php:633 usr/local/www/services_dhcpv6.php:569
+#: usr/local/www/services_dhcp.php:646 usr/local/www/services_dhcpv6.php:642
+#: usr/local/www/services_dhcp.php:767 usr/local/www/services_dhcpv6.php:573
+#: usr/local/www/services_dhcp.php:777 usr/local/www/services_dhcpv6.php:590
+#: usr/local/www/services_dhcp.php:797 usr/local/www/services_dhcp.php:809
+msgid "Range"
+msgstr "Intervalo"
+
+#: usr/local/www/services_dhcp.php:640 usr/local/www/services_dhcp.php:653
+#: usr/local/www/services_dhcp.php:829
+#: usr/local/www/services_dhcp_edit.php:395
+#: usr/local/www/services_dhcp.php:843 usr/local/www/services_dhcp.php:863
+#: usr/local/www/services_dhcp.php:875
+msgid "WINS servers"
+msgstr "Servidores WINS"
+
+#: usr/local/www/services_dhcp.php:651 usr/local/www/services_dhcpv6.php:594
+#: usr/local/www/services_dhcp.php:664 usr/local/www/services_dhcpv6.php:671
+#: usr/local/www/services_router_advertisements.php:376
+#: usr/local/www/services_dhcp.php:840 usr/local/www/services_dhcpv6.php:602
+#: usr/local/www/services_dhcp_edit.php:406
+#: usr/local/www/services_dhcp.php:854 usr/local/www/services_dhcpv6.php:619
+#: usr/local/www/services_router_advertisements.php:371
+#: usr/local/www/services_dhcp.php:874 usr/local/www/services_dhcp.php:886
+msgid "NOTE: leave blank to use the system default DNS servers - this interface's IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the General page."
+msgstr "NOTA: deixe em branco para usar os servidores DNS padrão do sistema - esse IP de interface se o DNS forwarder estiver habilitado, do contrário os servidores configurados na página Principal."
+
+#: usr/local/www/services_dhcp.php:658 usr/local/www/services_dhcpv6.php:602
+#: usr/local/www/services_dhcp.php:671 usr/local/www/services_dhcp.php:847
+#: usr/local/www/services_dhcp_edit.php:413
+#: usr/local/www/services_dhcp.php:861 usr/local/www/services_dhcp.php:881
+#: usr/local/www/services_dhcp.php:893
+msgid "The default is to use the IP on this interface of the firewall as the gateway. Specify an alternate gateway here if this is not the correct gateway for your network."
+msgstr "O padrão é usar o IP nessa interface do firewall como o gateway. Especifique um gateway alternativo aqui se esse não for o gateway correto para sua rede."
+
+#: usr/local/www/services_dhcp.php:662 usr/local/www/services_dhcpv6.php:607
+#: usr/local/www/services_dhcp.php:675 usr/local/www/services_dhcpv6.php:675
+#: usr/local/www/services_dhcp.php:851 usr/local/www/services_dhcpv6.php:606
+#: usr/local/www/services_dhcp_edit.php:417
+#: usr/local/www/services_dhcp.php:865 usr/local/www/services_dhcpv6.php:623
+#: usr/local/www/services_dhcp.php:885 usr/local/www/services_dhcp.php:897
+msgid "Domain name"
+msgstr "Nome de domínio"
+
+#: usr/local/www/services_dhcp.php:665 usr/local/www/services_dhcpv6.php:610
+#: usr/local/www/services_dhcp.php:678 usr/local/www/services_dhcpv6.php:678
+#: usr/local/www/services_dhcp.php:854 usr/local/www/services_dhcpv6.php:609
+#: usr/local/www/services_dhcp_edit.php:420
+#: usr/local/www/services_dhcp.php:868 usr/local/www/services_dhcpv6.php:626
+#: usr/local/www/services_dhcp.php:888 usr/local/www/services_dhcp.php:900
+msgid "The default is to use the domain name of this system as the default domain name provided by DHCP. You may specify an alternate domain name here."
+msgstr "O padrão é usar o nome de domínio desse sistema como o nome de domínio padrão fornecido pelo DHCP. Você pode especificar um nome de domínio alternativo aqui."
+
+#: usr/local/www/services_dhcp.php:669 usr/local/www/services_dhcpv6.php:614
+#: usr/local/www/services_dhcp.php:682 usr/local/www/services_dhcpv6.php:682
+#: usr/local/www/services_router_advertisements.php:381
+#: usr/local/www/services_dhcp.php:858 usr/local/www/services_dhcpv6.php:613
+#: usr/local/www/services_dhcp_edit.php:424
+#: usr/local/www/services_dhcp.php:872 usr/local/www/services_dhcpv6.php:630
+#: usr/local/www/services_router_advertisements.php:376
+#: usr/local/www/services_dhcp.php:892 usr/local/www/services_dhcp.php:904
+msgid "Domain search list"
+msgstr "Lista de busca de domínio"
+
+#: usr/local/www/services_dhcp.php:672 usr/local/www/services_dhcpv6.php:617
+msgid "The DHCP server can optionally provide a domain search list."
+msgstr "O servidor DHCP pode, opcionalmente, fornecer uma lista de busca de domínio."
+
+#: usr/local/www/services_dhcp.php:676 usr/local/www/services_dhcpv6.php:621
+#: usr/local/www/services_dhcp.php:689 usr/local/www/services_dhcpv6.php:689
+#: usr/local/www/services_dhcp.php:865 usr/local/www/services_dhcpv6.php:620
+#: usr/local/www/services_dhcp_edit.php:431
+#: usr/local/www/services_dhcp.php:879 usr/local/www/services_dhcpv6.php:637
+#: usr/local/www/services_dhcp.php:899 usr/local/www/services_dhcp.php:911
+msgid "Default lease time"
+msgstr "Tempo de concessão padrão"
+
+#: usr/local/www/services_dhcp.php:680 usr/local/www/services_dhcpv6.php:625
+#: usr/local/www/services_dhcp.php:693 usr/local/www/services_dhcpv6.php:693
+#: usr/local/www/services_dhcp.php:869 usr/local/www/services_dhcpv6.php:624
+#: usr/local/www/services_dhcp_edit.php:435
+#: usr/local/www/services_dhcp.php:883 usr/local/www/services_dhcpv6.php:641
+#: usr/local/www/services_dhcp.php:903 usr/local/www/services_dhcp.php:915
+msgid "This is used for clients that do not ask for a specific expiration time."
+msgstr "Isso é usado para clientes que não requisitam um tempo de expiração específico."
+
+#: usr/local/www/services_dhcp.php:682 usr/local/www/services_dhcpv6.php:627
+#: usr/local/www/services_dhcp.php:695 usr/local/www/services_dhcpv6.php:695
+#: usr/local/www/services_dhcp.php:871 usr/local/www/services_dhcpv6.php:626
+#: usr/local/www/services_dhcp_edit.php:437
+#: usr/local/www/services_dhcp.php:885 usr/local/www/services_dhcpv6.php:643
+#: usr/local/www/services_dhcp.php:905 usr/local/www/services_dhcp.php:917
+msgid "The default is 7200 seconds."
+msgstr "O padrão é 7200 segundos."
+
+#: usr/local/www/services_dhcp.php:686 usr/local/www/services_dhcpv6.php:631
+#: usr/local/www/services_dhcp.php:699 usr/local/www/services_dhcpv6.php:699
+#: usr/local/www/services_dhcp.php:875 usr/local/www/services_dhcpv6.php:630
+#: usr/local/www/services_dhcp_edit.php:441
+#: usr/local/www/services_dhcp.php:889 usr/local/www/services_dhcpv6.php:647
+#: usr/local/www/services_dhcp.php:909 usr/local/www/services_dhcp.php:921
+msgid "Maximum lease time"
+msgstr "Tempo máximo de concessão"
+
+#: usr/local/www/services_dhcp.php:690 usr/local/www/services_dhcpv6.php:635
+#: usr/local/www/services_dhcp.php:703 usr/local/www/services_dhcpv6.php:703
+#: usr/local/www/services_dhcp.php:879 usr/local/www/services_dhcpv6.php:634
+#: usr/local/www/services_dhcp_edit.php:445
+#: usr/local/www/services_dhcp.php:893 usr/local/www/services_dhcpv6.php:651
+#: usr/local/www/services_dhcp.php:913 usr/local/www/services_dhcp.php:925
+msgid "This is the maximum lease time for clients that ask for a specific expiration time."
+msgstr "Esse é o máximo tempo de concessão para clientes que requisitama por um tempo de expiração específico."
+
+#: usr/local/www/services_dhcp.php:692 usr/local/www/services_dhcpv6.php:637
+#: usr/local/www/services_dhcp.php:705 usr/local/www/services_dhcpv6.php:705
+#: usr/local/www/services_dhcp.php:881 usr/local/www/services_dhcpv6.php:636
+#: usr/local/www/services_dhcp_edit.php:447
+#: usr/local/www/services_dhcp.php:895 usr/local/www/services_dhcpv6.php:653
+#: usr/local/www/services_dhcp.php:915 usr/local/www/services_dhcp.php:927
+msgid "The default is 86400 seconds."
+msgstr "O padrão é 86400 segundos."
+
+#: usr/local/www/services_dhcp.php:696 usr/local/www/services_dhcpv6.php:641
+#: usr/local/www/services_dhcp.php:709 usr/local/www/services_dhcpv6.php:709
+#: usr/local/www/services_dhcp.php:886 usr/local/www/services_dhcpv6.php:640
+#: usr/local/www/services_dhcp.php:900 usr/local/www/services_dhcpv6.php:657
+#: usr/local/www/services_dhcp.php:920 usr/local/www/services_dhcp.php:932
+msgid "Failover peer IP:"
+msgstr "Failover peer IP:"
+
+#: usr/local/www/services_dhcp.php:699 usr/local/www/services_dhcpv6.php:644
+#: usr/local/www/services_dhcp.php:712 usr/local/www/services_dhcpv6.php:712
+#: usr/local/www/services_dhcp.php:889 usr/local/www/services_dhcpv6.php:643
+#: usr/local/www/services_dhcpv6.php:660
+msgid "Leave blank to disable. Enter the interface IP address of the other machine. Machines must be using CARP."
+msgstr "Deixe em branco para desabilitar. Informar o endereço IP da interface da outra máquina. Máquinas devem ser CARP."
+
+#: usr/local/www/services_dhcp.php:703 usr/local/www/services_dhcp.php:716
+#: usr/local/www/services_dhcp.php:895 usr/local/www/services_dhcp.php:909
+#: usr/local/www/services_dhcp.php:1150 usr/local/www/services_dhcp.php:929
+#: usr/local/www/services_dhcp.php:1170 usr/local/www/services_dhcp.php:941
+#: usr/local/www/services_dhcp.php:1182
+msgid "Static ARP"
+msgstr "ARP Estático"
+
+#: usr/local/www/services_dhcp.php:710 usr/local/www/services_dhcp.php:723
+#: usr/local/www/services_dhcp.php:902 usr/local/www/services_dhcp.php:916
+#: usr/local/www/services_dhcp.php:936 usr/local/www/services_dhcp.php:948
+msgid "Enable Static ARP entries"
+msgstr "Habilitar entradas ARP estáticas"
+
+#: usr/local/www/services_dhcp.php:715 usr/local/www/services_dhcp.php:728
+#: usr/local/www/services_dhcp.php:907 usr/local/www/services_dhcp.php:921
+#: usr/local/www/services_dhcp.php:941
+msgid "Only the machines listed below will be able to communicate with the firewall on this NIC."
+msgstr "Somente as máquinas listadas abaixo serão capazes de comunicar-se com o firewall nesse NIC."
+
+#: usr/local/www/services_dhcp.php:725 usr/local/www/services_dhcpv6.php:651
+#: usr/local/www/services_dhcp.php:763 usr/local/www/services_dhcpv6.php:744
+#: usr/local/www/services_dhcp.php:945 usr/local/www/services_dhcpv6.php:675
+#: usr/local/www/services_dhcp_edit.php:454
+#: usr/local/www/services_dhcp.php:958 usr/local/www/services_dhcpv6.php:692
+#: usr/local/www/services_dhcp.php:978 usr/local/www/services_dhcp.php:990
+msgid "Show Dynamic DNS"
+msgstr "Mostrar DNS Dinâmico"
+
+#: usr/local/www/services_dhcp.php:729 usr/local/www/services_dhcpv6.php:655
+#: usr/local/www/services_dhcp.php:767 usr/local/www/services_dhcpv6.php:748
+#: usr/local/www/services_dhcp.php:949 usr/local/www/services_dhcpv6.php:679
+#: usr/local/www/services_dhcp_edit.php:458
+#: usr/local/www/services_dhcp.php:962 usr/local/www/services_dhcpv6.php:696
+#: usr/local/www/services_dhcp.php:982 usr/local/www/services_dhcp.php:994
+msgid "Enable registration of DHCP client names in DNS."
+msgstr "Habilitar registro de nomes de clientes DHCP no DNS."
+
+#: usr/local/www/services_dhcp.php:732 usr/local/www/services_dhcpv6.php:658
+#: usr/local/www/services_dhcp.php:770 usr/local/www/services_dhcpv6.php:751
+#: usr/local/www/services_dhcp.php:952 usr/local/www/services_dhcpv6.php:682
+#: usr/local/www/services_dhcp_edit.php:461
+#: usr/local/www/services_dhcp.php:965 usr/local/www/services_dhcpv6.php:699
+#: usr/local/www/services_dhcp.php:985 usr/local/www/services_dhcp.php:997
+msgid "Note: Leave blank to disable dynamic DNS registration."
+msgstr "Nota: Deixe em branco para desabilitar registro de DNS dinâmico."
+
+#: usr/local/www/services_dhcp.php:733 usr/local/www/services_dhcpv6.php:659
+#: usr/local/www/services_dhcp.php:771 usr/local/www/services_dhcpv6.php:752
+#: usr/local/www/services_dhcp.php:953 usr/local/www/services_dhcpv6.php:683
+#: usr/local/www/services_dhcp_edit.php:462
+#: usr/local/www/services_dhcp.php:966 usr/local/www/services_dhcpv6.php:700
+#: usr/local/www/services_dhcp.php:986 usr/local/www/services_dhcp.php:998
+msgid "Enter the dynamic DNS domain which will be used to register client names in the DNS server."
+msgstr "Informe o domínio DNS dinâmico que será usado para registrar nomes de clientes no servidor DNS."
+
+#: usr/local/www/services_dhcp.php:738 usr/local/www/services_dhcpv6.php:664
+#: usr/local/www/services_dhcp.php:776 usr/local/www/services_dhcpv6.php:757
+#: usr/local/www/services_dhcp.php:972 usr/local/www/services_dhcpv6.php:688
+#: usr/local/www/services_dhcp_edit.php:467
+#: usr/local/www/services_dhcp.php:985 usr/local/www/services_dhcpv6.php:705
+#: usr/local/www/services_dhcp.php:1005 usr/local/www/services_dhcp.php:1017
+msgid "NTP servers"
+msgstr "Servidores NTP"
+
+#: usr/local/www/services_dhcp.php:741 usr/local/www/services_dhcpv6.php:667
+#: usr/local/www/services_dhcp.php:779 usr/local/www/services_dhcpv6.php:760
+#: usr/local/www/services_dhcp.php:975 usr/local/www/services_dhcpv6.php:691
+#: usr/local/www/services_dhcp_edit.php:470
+#: usr/local/www/services_dhcp.php:988 usr/local/www/services_dhcpv6.php:708
+#: usr/local/www/services_dhcp.php:1008 usr/local/www/services_dhcp.php:1020
+msgid "Show NTP configuration"
+msgstr "Exibir configuração NTP"
+
+#: usr/local/www/services_dhcp.php:750 usr/local/www/services_dhcpv6.php:676
+#: usr/local/www/services_dhcp.php:788 usr/local/www/services_dhcpv6.php:770
+#: usr/local/www/services_dhcp.php:984 usr/local/www/services_dhcpv6.php:701
+#: usr/local/www/services_dhcp_edit.php:479
+#: usr/local/www/services_dhcp.php:997 usr/local/www/services_dhcpv6.php:718
+#: usr/local/www/services_dhcp.php:1017 usr/local/www/services_dhcp.php:1029
+msgid "TFTP server"
+msgstr "Servidor TFTP"
+
+#: usr/local/www/services_dhcp.php:753 usr/local/www/services_dhcpv6.php:679
+#: usr/local/www/services_dhcp.php:791 usr/local/www/services_dhcpv6.php:773
+#: usr/local/www/services_dhcp.php:987 usr/local/www/services_dhcpv6.php:704
+#: usr/local/www/services_dhcp_edit.php:482
+#: usr/local/www/services_dhcp.php:1000 usr/local/www/services_dhcpv6.php:721
+#: usr/local/www/services_dhcp.php:1020 usr/local/www/services_dhcp.php:1032
+msgid "Show TFTP configuration"
+msgstr "Exibir configuração TFTP"
+
+#: usr/local/www/services_dhcp.php:757 usr/local/www/services_dhcpv6.php:683
+#: usr/local/www/services_dhcp.php:795 usr/local/www/services_dhcpv6.php:777
+#: usr/local/www/services_dhcp.php:991 usr/local/www/services_dhcpv6.php:708
+#: usr/local/www/services_dhcp_edit.php:486
+#: usr/local/www/services_dhcp.php:1004 usr/local/www/services_dhcpv6.php:725
+#: usr/local/www/services_dhcp.php:1024 usr/local/www/services_dhcp.php:1036
+msgid "Leave blank to disable. Enter a full hostname or IP for the TFTP server."
+msgstr "Deixe em branco para desabilitar. Informe um nome de host completo ou IP para o servidor TFTP."
+
+#: usr/local/www/services_dhcp.php:762 usr/local/www/services_dhcpv6.php:688
+#: usr/local/www/services_dhcp.php:800 usr/local/www/services_dhcpv6.php:783
+#: usr/local/www/services_dhcp.php:996 usr/local/www/services_dhcpv6.php:714
+#: usr/local/www/services_dhcp.php:1009 usr/local/www/services_dhcpv6.php:731
+#: usr/local/www/services_dhcp.php:1029 usr/local/www/services_dhcp.php:1041
+msgid "LDAP URI"
+msgstr "URI LDAP"
+
+#: usr/local/www/services_dhcp.php:765 usr/local/www/services_dhcpv6.php:691
+#: usr/local/www/services_dhcp.php:803 usr/local/www/services_dhcpv6.php:786
+#: usr/local/www/services_dhcp.php:999 usr/local/www/services_dhcpv6.php:717
+#: usr/local/www/services_dhcp.php:1012 usr/local/www/services_dhcpv6.php:734
+#: usr/local/www/services_dhcp.php:1032 usr/local/www/services_dhcp.php:1044
+msgid "Show LDAP configuration"
+msgstr "Exibir configuração LDAP"
+
+#: usr/local/www/services_dhcp.php:769 usr/local/www/services_dhcpv6.php:695
+#: usr/local/www/services_dhcp.php:807 usr/local/www/services_dhcpv6.php:790
+#: usr/local/www/services_dhcp.php:1003 usr/local/www/services_dhcpv6.php:721
+#: usr/local/www/services_dhcp.php:1016 usr/local/www/services_dhcpv6.php:738
+#: usr/local/www/services_dhcp.php:1036 usr/local/www/services_dhcp.php:1048
+msgid "Leave blank to disable. Enter a full URI for the LDAP server in the form ldap://ldap.example.com/dc=example,dc=com"
+msgstr "Deixa em branco para desabilitar. Informe um URI complleto para o servidor LDAP na forma ldap://ldap.example.com/dc=example,dc=com"
+
+#: usr/local/www/services_dhcp.php:774 usr/local/www/services_dhcpv6.php:700
+#: usr/local/www/services_dhcp.php:812 usr/local/www/services_dhcpv6.php:795
+#: usr/local/www/services_dhcp.php:1008 usr/local/www/services_dhcpv6.php:726
+#: usr/local/www/services_dhcp.php:1021 usr/local/www/services_dhcpv6.php:743
+#: usr/local/www/services_dhcp.php:1041 usr/local/www/services_dhcp.php:1053
+msgid "Enable network booting"
+msgstr "Habilitar boot da rede"
+
+#: usr/local/www/services_dhcp.php:777 usr/local/www/services_dhcpv6.php:703
+#: usr/local/www/services_dhcp.php:815 usr/local/www/services_dhcpv6.php:798
+#: usr/local/www/services_dhcp.php:1011 usr/local/www/services_dhcpv6.php:729
+#: usr/local/www/services_dhcp.php:1024 usr/local/www/services_dhcpv6.php:746
+#: usr/local/www/services_dhcp.php:1044 usr/local/www/services_dhcp.php:1056
+msgid "Show Network booting"
+msgstr "Exibir boot da Rede"
+
+#: usr/local/www/services_dhcp.php:781 usr/local/www/services_dhcpv6.php:707
+#: usr/local/www/services_dhcp.php:819 usr/local/www/services_dhcpv6.php:802
+#: usr/local/www/services_dhcp.php:1015 usr/local/www/services_dhcpv6.php:733
+#: usr/local/www/services_dhcp.php:1028 usr/local/www/services_dhcpv6.php:750
+#: usr/local/www/services_dhcp.php:1048 usr/local/www/services_dhcp.php:1060
+msgid "Enables network booting."
+msgstr "Habilita boot da rede."
+
+#: usr/local/www/services_dhcp.php:783 usr/local/www/services_dhcpv6.php:709
+#: usr/local/www/services_dhcp.php:821 usr/local/www/services_dhcpv6.php:804
+#: usr/local/www/services_dhcp.php:1017 usr/local/www/services_dhcpv6.php:735
+#: usr/local/www/services_dhcp.php:1030 usr/local/www/services_dhcpv6.php:752
+#: usr/local/www/services_dhcp.php:1050 usr/local/www/services_dhcp.php:1062
+msgid "Enter the IP of the"
+msgstr "Informe o IP do"
+
+#: usr/local/www/services_dhcp.php:783 usr/local/www/services_dhcpv6.php:709
+#: usr/local/www/services_dhcp.php:821 usr/local/www/services_dhcpv6.php:804
+#: usr/local/www/services_dhcp.php:1017 usr/local/www/services_dhcpv6.php:735
+#: usr/local/www/services_dhcp.php:1030 usr/local/www/services_dhcpv6.php:752
+#: usr/local/www/services_dhcp.php:1050 usr/local/www/services_dhcp.php:1062
+msgid "next-server"
+msgstr "next-server"
+
+#: usr/local/www/services_dhcp.php:785 usr/local/www/services_dhcpv6.php:711
+#: usr/local/www/services_dhcp.php:823 usr/local/www/services_dhcpv6.php:806
+#: usr/local/www/services_dhcp.php:1019 usr/local/www/services_dhcpv6.php:737
+#: usr/local/www/services_dhcp.php:1032 usr/local/www/services_dhcpv6.php:754
+#: usr/local/www/services_dhcp.php:1052 usr/local/www/services_dhcp.php:1064
+msgid "and the filename"
+msgstr "e o nome do arquivo"
+
+#: usr/local/www/services_dhcp.php:787 usr/local/www/services_dhcpv6.php:713
+#: usr/local/www/services_dhcp.php:825 usr/local/www/services_dhcpv6.php:808
+#: usr/local/www/services_dhcp.php:1021 usr/local/www/services_dhcpv6.php:739
+#: usr/local/www/services_dhcp.php:1034 usr/local/www/services_dhcpv6.php:756
+#: usr/local/www/services_dhcp.php:1054 usr/local/www/services_dhcp.php:1066
+msgid "Note: You need both a filename and a boot server configured for this to work!"
+msgstr "Nota: Você precisa um nome de arquivo e um servidor de boot configurado para isso funcionar!"
+
+#: usr/local/www/services_dhcp.php:789 usr/local/www/services_dhcpv6.php:715
+#: usr/local/www/services_dhcpv6_edit.php:224
+#: usr/local/www/services_dhcp.php:827
+#: usr/local/www/services_dhcp_edit.php:247
+#: usr/local/www/services_dhcpv6.php:810
+#: usr/local/www/services_dhcpv6_edit.php:226
+#: usr/local/www/services_dhcp.php:1023
+#: usr/local/www/services_dhcp_edit.php:249
+#: usr/local/www/services_dhcpv6.php:741
+#: usr/local/www/services_dhcpv6_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:377
+#: usr/local/www/services_dhcp.php:1036 usr/local/www/services_dhcpv6.php:758
+#: usr/local/www/services_dhcp.php:1056 usr/local/www/services_dhcp.php:1068
+msgid "Enter the"
+msgstr "Informe o"
+
+#: usr/local/www/services_dhcp.php:789 usr/local/www/services_dhcpv6.php:715
+#: usr/local/www/services_dhcpv6_edit.php:224
+#: usr/local/www/services_dhcp.php:827
+#: usr/local/www/services_dhcp_edit.php:247
+#: usr/local/www/services_dhcpv6.php:810
+#: usr/local/www/services_dhcpv6_edit.php:226
+#: usr/local/www/services_dhcp.php:1023
+#: usr/local/www/services_dhcp_edit.php:249
+#: usr/local/www/services_dhcpv6.php:741
+#: usr/local/www/services_dhcpv6_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:377
+#: usr/local/www/services_dhcp.php:1036 usr/local/www/services_dhcpv6.php:758
+#: usr/local/www/services_dhcp.php:1056 usr/local/www/services_dhcp.php:1068
+msgid "root-path"
+msgstr "root-path"
+
+#: usr/local/www/services_dhcp.php:789 usr/local/www/services_dhcpv6.php:715
+#: usr/local/www/services_dhcpv6_edit.php:224
+#: usr/local/www/services_dhcp.php:827
+#: usr/local/www/services_dhcp_edit.php:247
+#: usr/local/www/services_dhcpv6.php:810
+#: usr/local/www/services_dhcpv6_edit.php:226
+#: usr/local/www/services_dhcp.php:1023
+#: usr/local/www/services_dhcp_edit.php:249
+#: usr/local/www/services_dhcpv6.php:741
+#: usr/local/www/services_dhcpv6_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:377
+#: usr/local/www/services_dhcp.php:1036 usr/local/www/services_dhcpv6.php:758
+#: usr/local/www/services_dhcp.php:1056 usr/local/www/services_dhcp.php:1068
+msgid "string"
+msgstr "string"
+
+#: usr/local/www/services_dhcp.php:791 usr/local/www/services_dhcpv6.php:717
+#: usr/local/www/services_dhcp.php:829 usr/local/www/services_dhcpv6.php:812
+#: usr/local/www/services_dhcp.php:1025 usr/local/www/services_dhcpv6.php:743
+#: usr/local/www/services_dhcp.php:1038 usr/local/www/services_dhcpv6.php:760
+#: usr/local/www/services_dhcp.php:1058 usr/local/www/services_dhcp.php:1070
+msgid "Note: string-format: iscsi:(servername):(protocol):(port):(LUN):targetname"
+msgstr "Nota: string-format: iscsi:(servername):(protocol):(port):(LUN):targetname"
+
+#: usr/local/www/services_dhcp.php:796 usr/local/www/services_dhcpv6.php:722
+#: usr/local/www/services_dhcp.php:834 usr/local/www/services_dhcpv6.php:817
+#: usr/local/www/services_dhcp.php:1031 usr/local/www/services_dhcpv6.php:748
+#: usr/local/www/services_dhcp.php:1044 usr/local/www/services_dhcpv6.php:765
+#: usr/local/www/services_dhcp.php:1064 usr/local/www/services_dhcp.php:1076
+msgid "Additional BOOTP/DHCP Options"
+msgstr "Opções BOOTP/DHCP Adicionais"
+
+#: usr/local/www/services_dhcp.php:799 usr/local/www/services_dhcpv6.php:725
+#: usr/local/www/services_dhcp.php:837 usr/local/www/services_dhcpv6.php:820
+#: usr/local/www/services_dhcp.php:1034 usr/local/www/services_dhcpv6.php:751
+#: usr/local/www/services_dhcp.php:1047 usr/local/www/services_dhcpv6.php:768
+#: usr/local/www/services_dhcp.php:1067 usr/local/www/services_dhcp.php:1079
+msgid "Show Additional BOOTP/DHCP Options"
+msgstr "Exibir Opções BOOTP/DHCP Adicionais"
+
+#: usr/local/www/services_dhcp.php:807 usr/local/www/services_dhcpv6.php:733
+#: usr/local/www/services_dhcp.php:845 usr/local/www/services_dhcpv6.php:828
+#: usr/local/www/services_dhcp.php:1042 usr/local/www/services_dhcpv6.php:759
+#: usr/local/www/services_dhcp.php:1055 usr/local/www/services_dhcpv6.php:776
+#: usr/local/www/services_dhcp.php:1075 usr/local/www/services_dhcp.php:1087
+msgid "Enter the DHCP option number and the value for each item you would like to include in the DHCP lease information. For a list of available options please visit this"
+msgstr "Informe o número de opção DHCP e o valor de cada item que você gostaria de incluir nas informações de concessão DHCP. Para uma lista de opções disponíveis, por favor, visite "
+
+#: usr/local/www/services_dhcp.php:812
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/services_dhcpv6.php:738 usr/local/www/services_dhcp.php:850
+#: usr/local/www/services_dhcpv6.php:833
+#: usr/local/www/services_captiveportal_vouchers_edit.php:92
+#: usr/local/www/services_dhcp.php:1047 usr/local/www/services_dhcpv6.php:764
+#: usr/local/www/services_dhcp.php:1060 usr/local/www/services_dhcpv6.php:781
+#: usr/local/www/services_dhcp.php:1080 usr/local/www/services_dhcp.php:1092
+msgid "Number"
+msgstr "Número"
+
+#: usr/local/www/services_dhcp.php:814
+#: usr/local/www/load_balancer_relay_action_edit.php:506
+#: usr/local/www/system_advanced_sysctl.php:173
+#: usr/local/www/system_advanced_sysctl.php:249
+#: usr/local/www/services_dhcpv6.php:739
+#: usr/local/www/system_certmanager.php:763
+#: usr/local/www/load_balancer_relay_action_edit.php:505
+#: usr/local/www/services_dhcp.php:852 usr/local/www/services_dhcpv6.php:834
+#: usr/local/www/load_balancer_relay_action_edit.php:503
+#: usr/local/www/services_dhcp.php:1049 usr/local/www/services_dhcpv6.php:765
+#: usr/local/www/services_dhcp.php:1062
+#: usr/local/www/system_certmanager.php:788
+#: usr/local/www/services_dhcpv6.php:782 usr/local/www/services_dhcp.php:1082
+#: usr/local/www/system_certmanager.php:789
+#: usr/local/www/services_dhcp.php:1094
+msgid "Value"
+msgstr "Valor"
+
+#: usr/local/www/services_dhcp.php:877 usr/local/www/services_dhcpv6.php:790
+#: usr/local/www/services_dhcp.php:915 usr/local/www/services_dhcpv6.php:885
+#: usr/local/www/services_dhcp.php:1119 usr/local/www/services_dhcpv6.php:816
+#: usr/local/www/services_dhcp.php:1132 usr/local/www/services_dhcpv6.php:833
+#: usr/local/www/services_dhcp.php:1152 usr/local/www/services_dhcp.php:1164
+msgid "The DNS servers entered in"
+msgstr "Os servidores DNS informados em"
+
+#: usr/local/www/services_dhcp.php:877 usr/local/www/services_dhcpv6.php:790
+#: usr/local/www/services_dhcp.php:915 usr/local/www/services_dhcpv6.php:885
+#: usr/local/www/services_dhcp.php:1119 usr/local/www/services_dhcpv6.php:816
+#: usr/local/www/services_dhcp.php:1132 usr/local/www/services_dhcpv6.php:833
+#: usr/local/www/services_dhcp.php:1152 usr/local/www/services_dhcp.php:1164
+msgid "System: General setup"
+msgstr "Sistema: Configurações Gerais"
+
+#: usr/local/www/services_dhcp.php:878 usr/local/www/services_dhcpv6.php:791
+#: usr/local/www/services_dhcp.php:916 usr/local/www/services_dhcpv6.php:886
+#: usr/local/www/services_dhcp.php:1120 usr/local/www/services_dhcpv6.php:817
+#: usr/local/www/services_dhcp.php:1133 usr/local/www/services_dhcpv6.php:834
+#: usr/local/www/services_dhcp.php:1153 usr/local/www/services_dhcp.php:1165
+msgid "(or the"
+msgstr "(ou o"
+
+#: usr/local/www/services_dhcp.php:879 usr/local/www/services_dhcpv6.php:792
+#: usr/local/www/services_dhcp.php:917 usr/local/www/services_dhcpv6.php:887
+#: usr/local/www/services_dhcp.php:1121 usr/local/www/services_dhcpv6.php:818
+#: usr/local/www/services_dhcp.php:1134 usr/local/www/services_dhcpv6.php:835
+#: usr/local/www/services_dhcp.php:1154 usr/local/www/services_dhcp.php:1166
+msgid "if enabled)"
+msgstr "se habilitado)"
+
+#: usr/local/www/services_dhcp.php:879 usr/local/www/services_dhcpv6.php:792
+#: usr/local/www/services_dhcp.php:917 usr/local/www/services_dhcpv6.php:887
+#: usr/local/www/services_dhcp.php:1121 usr/local/www/services_dhcpv6.php:818
+#: usr/local/www/services_dhcp.php:1134 usr/local/www/services_dhcpv6.php:835
+#: usr/local/www/services_dhcp.php:1154 usr/local/www/services_dhcp.php:1166
+msgid "will be assigned to clients by the DHCP server."
+msgstr "será atribuído a clientes pelo servidor DHCP."
+
+#: usr/local/www/services_dhcp.php:882 usr/local/www/services_dhcpv6.php:795
+#: usr/local/www/services_dhcp.php:920 usr/local/www/services_dhcpv6.php:890
+#: usr/local/www/services_dhcp.php:1124 usr/local/www/services_dhcpv6.php:821
+#: usr/local/www/services_dhcp.php:1137 usr/local/www/services_dhcpv6.php:838
+#: usr/local/www/services_dhcp.php:1157 usr/local/www/services_dhcp.php:1169
+msgid "The DHCP lease table can be viewed on the"
+msgstr "A tabela de concessão DHCP pode ser visualizada no"
+
+#: usr/local/www/services_dhcp.php:882 usr/local/www/services_dhcpv6.php:795
+#: usr/local/www/services_dhcp.php:920 usr/local/www/services_dhcpv6.php:890
+#: usr/local/www/services_dhcp.php:1124 usr/local/www/services_dhcp.php:1137
+#: usr/local/www/services_dhcp.php:1157 usr/local/www/services_dhcp.php:1169
+msgid "Status: DHCP leases"
+msgstr "Status: concessões DHCP"
+
+#: usr/local/www/services_dhcp.php:883 usr/local/www/services_dhcpv6.php:796
+#: usr/local/www/services_dhcp.php:921 usr/local/www/services_dhcpv6.php:891
+#: usr/local/www/services_dhcp.php:1125 usr/local/www/services_dhcpv6.php:822
+#: usr/local/www/services_dhcp.php:1138 usr/local/www/services_dhcpv6.php:839
+#: usr/local/www/services_dhcp.php:1158 usr/local/www/services_dhcp.php:1170
+msgid "page."
+msgstr "página."
+
+#: usr/local/www/services_dhcp_edit.php:116
+#: usr/local/www/services_dhcpv6_edit.php:113
+#: usr/local/www/services_dhcpv6_edit.php:115
+#: usr/local/www/services_dhcp_edit.php:118
+#: usr/local/www/services_dhcpv6_edit.php:118
+#: usr/local/www/services_dhcp_edit.php:152
+msgid "The hostname cannot end with a hyphen according to RFC952"
+msgstr "O nome de host não pode terminar com um hífen de acordo com a RFC952"
+
+#: usr/local/www/services_dhcp_edit.php:121
+#: usr/local/www/services_dhcpv6_edit.php:118
+#: usr/local/www/services_dhcpv6_edit.php:120
+#: usr/local/www/services_dhcp_edit.php:123
+#: usr/local/www/services_dhcpv6_edit.php:123
+#: usr/local/www/services_dhcp_edit.php:157
+msgid "A valid hostname is specified, but the domain name part should be omitted"
+msgstr "Um nome de host válido é especificado, mas a parte do nome de domínio deve ser omitida"
+
+#: usr/local/www/services_dhcp_edit.php:132
+#: usr/local/www/services_dhcp_edit.php:134
+#: usr/local/www/services_dhcp_edit.php:168
+msgid "Static ARP is enabled. You must specify an IP address."
+msgstr "ARP estático está habilitado. Você deve especificar um endereço IP."
+
+#: usr/local/www/services_dhcp_edit.php:141
+#: usr/local/www/services_dhcp_edit.php:143
+#: usr/local/www/services_dhcp_edit.php:177
+msgid "This Hostname, IP or MAC address already exists."
+msgstr "Esse nome de host, endereço IP ou MAC já existe."
+
+#: usr/local/www/services_dhcp_edit.php:152
+#: usr/local/www/services_dhcp_edit.php:154
+#: usr/local/www/services_dhcp_edit.php:188
+#, php-format
+msgid "The IP address must not be within the DHCP range for this interface."
+msgstr "O endereço IP não deve estar dentro do intervalo DHCP para essa interface."
+
+#: usr/local/www/services_dhcp_edit.php:159
+#: usr/local/www/services_dhcp_edit.php:161
+#: usr/local/www/services_dhcp_edit.php:202
+#, php-format
+msgid "The IP address must lie in the %s subnet."
+msgstr "O endereço IP deve estar na subrede %s."
+
+#: usr/local/www/services_dhcp_edit.php:190
+#: usr/local/www/services_dhcpv6_edit.php:172
+#: usr/local/www/services_dhcpv6_edit.php:175
+#: usr/local/www/services_dhcp_edit.php:193
+#: usr/local/www/services_dhcpv6_edit.php:178
+#: usr/local/www/services_dhcp_edit.php:301
+msgid "Edit static mapping"
+msgstr "Editar mapeamento estático"
+
+#: usr/local/www/services_dhcp_edit.php:204
+#: usr/local/www/services_dhcp_edit.php:207
+#: usr/local/www/services_dhcp_edit.php:206
+#: usr/local/www/services_dhcp_edit.php:334
+msgid "Static DHCP Mapping"
+msgstr "Mapeamento DHCP estático"
+
+#: usr/local/www/services_dhcp_edit.php:215
+#: usr/local/www/services_dhcp_edit.php:218
+#: usr/local/www/services_dhcp_edit.php:217
+#: usr/local/www/services_dhcp_edit.php:345
+#: usr/local/www/services_captiveportal_mac_edit.php:188
+msgid "Copy my MAC address"
+msgstr "Copie meu endereço MAC"
+
+#: usr/local/www/services_dhcp_edit.php:217
+#: usr/local/www/services_dhcp_edit.php:220
+#: usr/local/www/services_dhcp_edit.php:219
+#: usr/local/www/services_dhcp_edit.php:347
+msgid "Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx"
+msgstr "Informe um endereço MAC no seguinte formato: xx:xx:xx:xx:xx:xx"
+
+#: usr/local/www/services_dhcp_edit.php:225
+#: usr/local/www/services_dhcp_edit.php:228
+msgid "If no IP address is given, one will be dynamically allocated from the pool."
+msgstr "Se nenhum endereço IP for dado, um será dinamicamente alocado do pool."
+
+#: usr/local/www/services_dhcp_edit.php:231
+#: usr/local/www/services_dhcpv6_edit.php:208
+#: usr/local/www/services_dhcpv6_edit.php:211
+#: usr/local/www/services_dhcp_edit.php:234
+#: usr/local/www/services_dhcpv6_edit.php:213
+#: usr/local/www/services_dhcp_edit.php:236
+#: usr/local/www/services_dhcpv6_edit.php:216
+#: usr/local/www/services_dhcp_edit.php:364
+msgid "Name of the host, without domain part."
+msgstr "Nome do host, sem a parte do domínio."
+
+#: usr/local/www/services_dhcp_relay.php:72
+#: usr/local/www/services_dhcpv6_relay.php:73
+msgid "Destination Server"
+msgstr "Servidor de Destino"
+
+#: usr/local/www/services_dhcp_relay.php:80
+msgid "A valid Destination Server IP address must be specified."
+msgstr "Um endereço IP do Servidor de Destino válido deve ser especificado."
+
+#: usr/local/www/services_dhcp_relay.php:100 usr/local/www/fbegin.inc:122
+#: usr/local/www/status_services.php:295
+#: usr/local/www/widgets/widgets/services_status.widget.php:100
+#: usr/local/www/fbegin.inc:139 etc/inc/service-utils.inc:278
+#: usr/local/www/fbegin.inc:148 usr/local/www/fbegin.inc:140
+#: etc/inc/service-utils.inc:277 etc/inc/service-utils.inc:294
+#: etc/inc/service-utils.inc:289
+msgid "DHCP Relay"
+msgstr "DHCP Relay"
+
+#: usr/local/www/services_dhcp_relay.php:144
+#: usr/local/www/services_dhcp_relay.php:145
+msgid "DHCP Relay configuration"
+msgstr "Configuração do DHCP Relay"
+
+#: usr/local/www/services_dhcp_relay.php:150
+#: usr/local/www/services_dhcp_relay.php:151
+#, php-format
+msgid "Enable DHCP relay on interface"
+msgstr "Habilitar DHCP Relay na interface"
+
+#: usr/local/www/services_dhcp_relay.php:175
+#: usr/local/www/services_dhcpv6_relay.php:176
+#: usr/local/www/services_dhcp_relay.php:176
+#: usr/local/www/services_dhcpv6_relay.php:177
+msgid "Append circuit ID and agent ID to requests"
+msgstr "Anexe o circuit ID e o agent ID às requisições"
+
+#: usr/local/www/services_dhcp_relay.php:176
+#: usr/local/www/services_dhcp_relay.php:177
+#, php-format
+msgid "If this is checked, the DHCP relay will append the circuit ID (%s interface number) and the agent ID to the DHCP request."
+msgstr "Se isso estiver marcado, o DHCP relay anexará o circuit ID (número de interface %s) e o agent ID à requisição DHCP."
+
+#: usr/local/www/services_dhcp_relay.php:179
+#: usr/local/www/services_dhcpv6_relay.php:180
+#: usr/local/www/services_dhcp_relay.php:180
+#: usr/local/www/services_dhcpv6_relay.php:181
+msgid "Destination server"
+msgstr "Servidor de Destino"
+
+#: usr/local/www/services_dhcp_relay.php:183
+#: usr/local/www/services_dhcp_relay.php:184
+msgid "This is the IP address of the server to which DHCP requests are relayed. You can enter multiple server IP addresses, separated by commas. Select \"Proxy requests to DHCP server on WAN subnet\" to relay DHCP packets to the server that was used on the WAN interface."
+msgstr "Esse é o endereço IP do servidor para o qual as requisições DHCP são retransmitidas. Você pode inserir múltiplos servidores de endereços de IP, separados por vírgulas. Selecione \"Requisições de Proxy para o servidor DHCP na subrede WAN\" para retransmitir pacotes DHCP para o servidor que foi usado na interface WAN."
+
+#: usr/local/www/services_dnsmasq.php:80 usr/local/www/services_dnsmasq.php:84
+#: usr/local/www/services_dnsmasq.php:86
+#: usr/local/www/services_dnsmasq.php:107
+msgid "Invalid custom options"
+msgstr "Opções personalizadas inválidas"
+
+#: usr/local/www/services_dnsmasq.php:147
+#: usr/local/www/services_dnsmasq.php:148
+#: usr/local/www/services_dnsmasq.php:152
+#: usr/local/www/services_dnsmasq.php:154
+#: usr/local/www/services_dnsmasq.php:175
+msgid "The DNS forwarder configuration has been changed"
+msgstr "A configuração do DNS forwarder foi modificada"
+
+#: usr/local/www/services_dnsmasq.php:151
+#: usr/local/www/services_dnsmasq.php:152
+#: usr/local/www/services_dnsmasq.php:156
+#: usr/local/www/services_dnsmasq.php:158
+#: usr/local/www/services_dnsmasq.php:179
+msgid "General DNS Forwarder Options"
+msgstr "Opções gerais do DNS Forwarder"
+
+#: usr/local/www/services_dnsmasq.php:157
+#: usr/local/www/services_dnsmasq.php:158
+#: usr/local/www/services_dnsmasq.php:162
+#: usr/local/www/services_dnsmasq.php:164
+#: usr/local/www/services_dnsmasq.php:185
+msgid "Enable DNS forwarder"
+msgstr "Habilitar DNS forwarder"
+
+#: usr/local/www/services_dnsmasq.php:161
+#: usr/local/www/services_unbound.php:211
+#: usr/local/www/services_dnsmasq.php:162
+#: usr/local/www/services_dnsmasq.php:166
+#: usr/local/www/services_dnsmasq.php:168
+#: usr/local/www/services_dnsmasq.php:189
+msgid "DHCP Registration"
+msgstr "Registro DHCP"
+
+#: usr/local/www/services_dnsmasq.php:164
+#: usr/local/www/services_dnsmasq.php:165
+#: usr/local/www/services_dnsmasq.php:169
+#: usr/local/www/services_dnsmasq.php:171
+#: usr/local/www/services_dnsmasq.php:192
+msgid "Register DHCP leases in DNS forwarder"
+msgstr "Registrar concessões DHCP no DNS forwarder"
+
+#: usr/local/www/services_dnsmasq.php:165
+#: usr/local/www/services_dnsmasq.php:166
+#: usr/local/www/services_dnsmasq.php:170
+#: usr/local/www/services_dnsmasq.php:172
+#: usr/local/www/services_dnsmasq.php:193
+#, php-format
+msgid "If this option is set, then machines that specify their hostname when requesting a DHCP lease will be registered in the DNS forwarder, so that their name can be resolved. You should also set the domain in %sSystem: General setup%s to the proper value."
+msgstr "Se essa opção estiver configurada, então máquinas que especificam seus nomes de host quando requisitam uma concessão DHCP serão registrados no DNS forwarder, de modo que seus nomes possam ser resolvidos. Você deve também configurar em %sSistema: Configurações Gerais %s para o valor apropriado."
+
+#: usr/local/www/services_dnsmasq.php:173
+#: usr/local/www/services_unbound.php:223
+#: usr/local/www/services_dnsmasq.php:174
+#: usr/local/www/services_dnsmasq.php:178
+#: usr/local/www/services_dnsmasq.php:180
+#: usr/local/www/services_dnsmasq.php:201
+msgid "Static DHCP"
+msgstr "DHCP estático"
+
+#: usr/local/www/services_dnsmasq.php:176
+#: usr/local/www/services_dnsmasq.php:177
+#: usr/local/www/services_dnsmasq.php:181
+#: usr/local/www/services_dnsmasq.php:183
+#: usr/local/www/services_dnsmasq.php:204
+msgid "Register DHCP static mappings in DNS forwarder"
+msgstr "Registrar mapeamentos estáticos DHCP no DNS forwarder"
+
+#: usr/local/www/services_dnsmasq.php:177
+#: usr/local/www/services_dnsmasq.php:178
+#: usr/local/www/services_dnsmasq.php:182
+#: usr/local/www/services_dnsmasq.php:184
+#: usr/local/www/services_dnsmasq.php:205
+#, php-format
+msgid "If this option is set, then DHCP static mappings will be registered in the DNS forwarder, so that their name can be resolved. You should also set the domain in %sSystem: General setup%s to the proper value."
+msgstr "Se essa opção estiver configurada, então os mapeamentos estáticos DHCP serão registrados no DNS forwarder, de modo que seus nomes possam ser resolvidos. Você deve também configurar o domínio em %sSistema: Configurações Gerais%s para um valor apropriado."
+
+#: usr/local/www/services_dnsmasq.php:184
+#: usr/local/www/services_unbound.php:234
+#: usr/local/www/services_dnsmasq.php:185
+#: usr/local/www/services_dnsmasq.php:189
+#: usr/local/www/services_dnsmasq.php:191
+#: usr/local/www/services_dnsmasq.php:212
+msgid "Prefer DHCP"
+msgstr "DHCP preferido"
+
+#: usr/local/www/services_dnsmasq.php:187
+#: usr/local/www/services_unbound.php:237
+#: usr/local/www/services_dnsmasq.php:188
+#: usr/local/www/services_dnsmasq.php:192
+#: usr/local/www/services_dnsmasq.php:194
+#: usr/local/www/services_dnsmasq.php:215
+msgid "Resolve DHCP mappings first"
+msgstr "Resolver mapeamentos de DHCP primeiro"
+
+#: usr/local/www/services_dnsmasq.php:188
+#: usr/local/www/services_unbound.php:238
+#: usr/local/www/services_dnsmasq.php:189
+#: usr/local/www/services_dnsmasq.php:193
+#: usr/local/www/services_dnsmasq.php:195
+#: usr/local/www/services_dnsmasq.php:216
+#, php-format
+msgid "If this option is set, then DHCP mappings will be resolved before the manual list of names below. This only affects the name given for a reverse lookup (PTR)."
+msgstr "Se esta opção estiver definida, os mapeamentos DHCP serão resolvidos antes da lista manual de nomes abaixo. Isso afeta apenas o nome dado para uma consulta reversa (PTR)."
+
+#: usr/local/www/services_dnsmasq.php:202
+#: usr/local/www/services_dnsmasq.php:203
+#: usr/local/www/services_dnsmasq.php:228
+#: usr/local/www/services_dnsmasq.php:241
+#: usr/local/www/services_dnsmasq.php:305
+msgid "Enter any additional options you would like to add to the dnsmasq configuration here, separated by a space or newline"
+msgstr "Informe quaisquer opções adicionais que desejar às configurações do servidor OpenVPN aqui, separados por ponto-e-vírgula ou uma nova linha"
+
+#: usr/local/www/services_dnsmasq.php:215
+#: usr/local/www/services_dnsmasq.php:216
+#: usr/local/www/services_dnsmasq.php:241
+#: usr/local/www/services_dnsmasq.php:254
+#: usr/local/www/services_dnsmasq.php:318
+#, php-format
+msgid "If the DNS forwarder is enabled, the DHCP service (if enabled) will automatically serve the LAN IP address as a DNS server to DHCP clients so they will use the forwarder. The DNS forwarder will use the DNS servers entered in %sSystem: General setup%s or those obtained via DHCP or PPP on WAN if the &quot;Allow DNS server list to be overridden by DHCP/PPP on WAN&quot; is checked. If you don't use that option (or if you use a static IP address on WAN), you must manually specify at least one DNS server on the %sSystem:General setup%s page."
+msgstr "Se o DNS forwarder estiver habilitado, o serviço DHCP (se habilitado) servirá automaticamente o endereço IP da LAN como um servidor DNS para clientes DHCP de modo a usar o forwarder. O DNS forwarder usará os servidores DNS informados em %sSistema: Instalação Geral%s ou aqueles obtidos via DHCP ou PPP na WAN se a opção &quot;Permitir que a lista de servidores DNS seja sobrescrita pelo DHCP/PPP na WAN&quot; estiver marcada. Se você não usar essa opção (ou se você usar o endereço IP estático na WAN), você deve especificar manualmente pelo menos um servidor DNS na página %sSistema: Configurações Gerais%s."
+
+#: usr/local/www/services_dnsmasq.php:231
+#: usr/local/www/services_unbound.php:267
+#: usr/local/www/services_dnsmasq.php:232
+#: usr/local/www/services_dnsmasq.php:257
+#: usr/local/www/services_dnsmasq.php:270
+#: usr/local/www/services_dnsmasq.php:334
+msgid "Host Overrides"
+msgstr "Sobreescrever Host"
+
+#: usr/local/www/services_dnsmasq.php:235
+#: usr/local/www/services_unbound.php:271
+#: usr/local/www/services_dnsmasq.php:236
+#: usr/local/www/services_dnsmasq.php:261
+#: usr/local/www/services_dnsmasq.php:274
+#: usr/local/www/services_dnsmasq.php:338
+msgid "Entries in this section override individual results from the forwarders."
+msgstr "Entradas nesta seção substituir os resultados individuais dos forwarders."
+
+#: usr/local/www/services_dnsmasq.php:236
+#: usr/local/www/services_unbound.php:272
+#: usr/local/www/services_dnsmasq.php:237
+#: usr/local/www/services_dnsmasq.php:262
+#: usr/local/www/services_dnsmasq.php:275
+#: usr/local/www/services_dnsmasq.php:339
+msgid "Use these for changing DNS results or for adding custom DNS records."
+msgstr "Use estas opções para alterar resultados de DNS ou adicionar registros de DNS personalizados."
+
+#: usr/local/www/services_dnsmasq.php:299
+#: usr/local/www/services_dnsmasq.php:320
+#: usr/local/www/services_unbound.php:335
+#: usr/local/www/services_dnsmasq.php:321
+#: usr/local/www/services_dnsmasq.php:346
+#: usr/local/www/services_dnsmasq.php:359
+#: usr/local/www/services_dnsmasq.php:423
+msgid "Domain Overrides"
+msgstr "Sobreescrever domínio"
+
+#: usr/local/www/services_dnsmasq.php:303
+#: usr/local/www/services_dnsmasq.php:324
+#: usr/local/www/services_unbound.php:339
+#: usr/local/www/services_dnsmasq.php:325
+#: usr/local/www/services_dnsmasq.php:350
+#: usr/local/www/services_dnsmasq.php:363
+#: usr/local/www/services_dnsmasq.php:427
+msgid "Entries in this area override an entire domain by specifying an authoritative DNS server to be queried for that domain."
+msgstr "Entradas nesta área sobreescrevem um domínio inteiro especificando um servidor DNS autoritativo para ser consultado para tal domínio."
+
+#: usr/local/www/services_dnsmasq.php:337
+#: usr/local/www/services_dnsmasq.php:358
+#: usr/local/www/services_unbound.php:373
+#: usr/local/www/services_dnsmasq.php:359
+#: usr/local/www/services_dnsmasq.php:384
+#: usr/local/www/services_dnsmasq.php:397
+#: usr/local/www/services_dnsmasq.php:461
+msgid "Do you really want to delete this domain override?"
+msgstr "Você realmente deseja apagar essa sobrescrita de domínio?"
+
+#: usr/local/www/services_dnsmasq_edit.php:100
+#: usr/local/www/services_dnsmasq_edit.php:138
+msgid "This host/domain already exists."
+msgstr "Esse host/domínio já existe."
+
+#: usr/local/www/services_dnsmasq_edit.php:127
+#: usr/local/www/services_dnsmasq_edit.php:166
+msgid "Edit host"
+msgstr "Editar host"
+
+#: usr/local/www/services_dnsmasq_edit.php:138
+#: usr/local/www/services_dnsmasq_edit.php:193
+#: usr/local/www/services_dnsmasq_edit.php:194
+msgid "Edit DNS Forwarder entry"
+msgstr "Editar entrada de DNS Forwarder"
+
+#: usr/local/www/services_dnsmasq_edit.php:144
+#: usr/local/www/services_dnsmasq_edit.php:199
+#: usr/local/www/services_dnsmasq_edit.php:200
+msgid "Name of the host, without domain part"
+msgstr "Nome do host, sem a parte de domínio"
+
+#: usr/local/www/services_dnsmasq_edit.php:146
+#: usr/local/www/services_dnsmasq_edit.php:201
+#: usr/local/www/services_dnsmasq_edit.php:202
+msgid "myhost"
+msgstr "myhost"
+
+#: usr/local/www/services_dnsmasq_edit.php:152
+#: usr/local/www/services_dnsmasq_edit.php:207
+#: usr/local/www/services_dnsmasq_edit.php:208
+msgid "Domain of the host"
+msgstr "Domínio de host"
+
+#: usr/local/www/services_dnsmasq_edit.php:153
+#: usr/local/www/services_dnsmasq_edit.php:208
+#: usr/local/www/services_dnsmasq_edit.php:209
+msgid "example.com"
+msgstr "examplo.com"
+
+#: usr/local/www/services_dnsmasq_edit.php:159
+#: usr/local/www/services_dnsmasq_edit.php:214
+#: usr/local/www/services_dnsmasq_edit.php:215
+msgid "IP address of the host"
+msgstr "Endereço IP do host"
+
+#: usr/local/www/diag_pkglogs.php:81
+msgid "Package logs"
+msgstr "Logs de pacotes"
+
+#: usr/local/www/diag_pkglogs.php:92
+msgid "No packages with logging facilities are currently installed."
+msgstr "Não há pacotes com instalações de log atualmente."
+
+#: usr/local/www/diag_pkglogs.php:103 usr/local/www/diag_pkglogs.php:105
+#, php-format
+msgid "%s"
+msgstr "%s"
+
+#: usr/local/www/diag_pkglogs.php:118
+#, php-format
+msgid "Last %1$s %2$s log entries"
+msgstr "Últimos %1$s %2$s logs de entrada"
+
+#: usr/local/www/status.php:110 usr/local/www/status.php:111
+msgid "This status page includes the following information"
+msgstr "Essa página de status inclui as seguintes informações"
+
+#: usr/local/www/status.php:225 usr/local/www/status.php:226
+#: usr/local/www/status.php:230
+msgid "Note: make sure to remove any sensitive information (passwords, maybe also IP addresses) before posting information from this page in public places (like mailing lists)"
+msgstr "Nota: tenha certeza que removeu todas as informações sensíveis (senhas, talvés endereços IP também) antes de publicar informações dessa página para espaços públicos (como listas de e-mail)"
+
+#: usr/local/www/status.php:228 usr/local/www/status.php:229
+#: usr/local/www/status.php:233
+msgid "Passwords in config.xml have been automatically removed"
+msgstr "Senhas no config.xml foram automaticamente removidas"
+
+#: usr/local/www/bandwidth_by_ip.php:54 usr/local/www/bandwidth_by_ip.php:67
+#: usr/local/www/bandwidth_by_ip.php:61 usr/local/www/bandwidth_by_ip.php:103
+msgid "no info"
+msgstr "sem informações"
+
+#: usr/local/www/vpn_pptp.php:82 usr/local/www/vpn_pptp.php:353
+#: usr/local/www/vpn_l2tp.php:73 usr/local/www/vpn_l2tp.php:321
+#: usr/local/www/vpn_pppoe_edit.php:112 usr/local/www/vpn_pppoe_edit.php:424
+#: usr/local/www/vpn_pppoe_edit.php:425 usr/local/www/vpn_pptp.php:355
+#: usr/local/www/vpn_l2tp.php:74 usr/local/www/vpn_pppoe_edit.php:428
+#: usr/local/www/vpn_pptp.php:358
+msgid "Server address"
+msgstr "Endereço do servidor"
+
+#: usr/local/www/vpn_pptp.php:82 usr/local/www/vpn_l2tp.php:73
+#: usr/local/www/vpn_pppoe_edit.php:112 usr/local/www/vpn_l2tp.php:74
+msgid "Remote start address"
+msgstr "Endereço inicial remoto"
+
+#: usr/local/www/vpn_pptp.php:87 usr/local/www/vpn_l2tp.php:78
+#: usr/local/www/vpn_pppoe_edit.php:117 usr/local/www/vpn_l2tp.php:79
+msgid "RADIUS server address"
+msgstr "Endereço do servidor RADIUS"
+
+#: usr/local/www/vpn_pptp.php:87 usr/local/www/vpn_pptp.php:432
+#: usr/local/www/vpn_l2tp.php:78 usr/local/www/vpn_l2tp.php:428
+#: usr/local/www/vpn_pppoe_edit.php:117 usr/local/www/vpn_pptp.php:434
+#: usr/local/www/vpn_l2tp.php:79 usr/local/www/vpn_pptp.php:437
+msgid "RADIUS shared secret"
+msgstr "Segredo Compartilhado RADIUS"
+
+#: usr/local/www/vpn_pptp.php:93 usr/local/www/vpn_l2tp.php:84
+#: usr/local/www/vpn_pppoe_edit.php:123 usr/local/www/vpn_l2tp.php:85
+msgid "A valid server address must be specified."
+msgstr "Um endereço de servidor válido deve ser especificado."
+
+#: usr/local/www/vpn_pptp.php:96 usr/local/www/vpn_l2tp.php:87
+#: usr/local/www/vpn_pppoe_edit.php:125 usr/local/www/vpn_l2tp.php:88
+#: usr/local/www/vpn_l2tp.php:91 usr/local/www/vpn_pptp.php:99
+msgid "A valid remote start address must be specified."
+msgstr "Um endereço inicial remoto válido deve ser especificado."
+
+#: usr/local/www/vpn_pptp.php:99 usr/local/www/vpn_l2tp.php:90
+#: usr/local/www/vpn_pppoe_edit.php:127 usr/local/www/vpn_l2tp.php:91
+#: usr/local/www/vpn_l2tp.php:94 usr/local/www/vpn_pptp.php:102
+msgid "A valid RADIUS server address must be specified."
+msgstr "Um endereço de servidor RADIUS válido deve ser especificado."
+
+#: usr/local/www/vpn_pptp.php:108 usr/local/www/vpn_l2tp.php:106
+#: usr/local/www/vpn_pppoe_edit.php:134 usr/local/www/vpn_l2tp.php:107
+#: usr/local/www/vpn_l2tp.php:110 usr/local/www/vpn_pptp.php:111
+msgid "The specified server address lies in the remote subnet."
+msgstr "O endereço do servidor especificado está na subrede remota."
+
+#: usr/local/www/vpn_pptp.php:112 usr/local/www/vpn_l2tp.php:109
+#: usr/local/www/vpn_l2tp.php:110 usr/local/www/vpn_l2tp.php:113
+#: usr/local/www/vpn_pptp.php:115
+msgid "The specified server address is equal to the LAN interface address."
+msgstr "O endereço do servidor especificado é igual ao endereço da interface LAN."
+
+#: usr/local/www/vpn_pptp.php:117 usr/local/www/vpn_pptp.php:120
+msgid "PPTP redirection target address"
+msgstr "Endereço alvo de redirecionamento PPTP"
+
+#: usr/local/www/vpn_pptp.php:122 usr/local/www/vpn_pptp.php:125
+msgid "A valid target address must be specified."
+msgstr "Um endereço de alvo válido deve ser especificado."
+
+#: usr/local/www/vpn_pptp.php:193 usr/local/www/vpn_pptp_users.php:71
+#: usr/local/www/vpn_pptp_users_edit.php:135 usr/local/www/vpn_pptp.php:196
+msgid "VPN PPTP"
+msgstr "PPPTP da VPN"
+
+#: usr/local/www/vpn_pptp.php:300 usr/local/www/vpn_pptp_users.php:89
+#: usr/local/www/vpn_l2tp.php:280 usr/local/www/vpn_l2tp_users.php:92
+#: usr/local/www/vpn_pptp.php:302 usr/local/www/vpn_l2tp_users.php:93
+#: usr/local/www/vpn_l2tp.php:281 usr/local/www/vpn_pptp_users.php:90
+#: usr/local/www/vpn_l2tp.php:284 usr/local/www/vpn_pptp.php:305
+msgid "Configuration"
+msgstr "Configuração"
+
+#: usr/local/www/vpn_pptp.php:301 usr/local/www/vpn_pptp_users.php:71
+#: usr/local/www/vpn_pptp_users.php:90
+#: usr/local/www/system_authservers.php:421
+#: usr/local/www/system_groupmanager.php:240
+#: usr/local/www/system_groupmanager_addprivs.php:168
+#: usr/local/www/system_usermanager.php:440
+#: usr/local/www/system_usermanager_addprivs.php:167
+#: usr/local/www/system_usermanager_settings.php:113
+#: usr/local/www/vpn_l2tp.php:281 usr/local/www/vpn_l2tp_users.php:38
+#: usr/local/www/vpn_l2tp_users.php:93
+#: usr/local/www/system_usermanager.php:438
+#: usr/local/www/system_groupmanager_addprivs.php:166
+#: usr/local/www/vpn_pptp.php:303 usr/local/www/vpn_l2tp_users.php:94
+#: usr/local/www/vpn_l2tp.php:282 usr/local/www/vpn_pptp_users.php:91
+#: usr/local/www/system_authservers.php:426 usr/local/www/vpn_l2tp.php:285
+#: usr/local/www/system_authservers.php:433 usr/local/www/vpn_pptp.php:306
+#: usr/local/www/system_usermanager_settings.php:115
+#: usr/local/www/system_groupmanager.php:243
+#: usr/local/www/system_authservers.php:444
+msgid "Users"
+msgstr "Usuários"
+
+#: usr/local/www/vpn_pptp.php:320 usr/local/www/vpn_pptp.php:322
+#: usr/local/www/vpn_pptp.php:325
+msgid "Redirect incoming PPTP connections to"
+msgstr "Redirecionar conexões PPTP de entrada para"
+
+#: usr/local/www/vpn_pptp.php:322 usr/local/www/vpn_pptp.php:324
+#: usr/local/www/vpn_pptp.php:327
+msgid "PPTP redirection"
+msgstr "Redirecionamento PPTP"
+
+#: usr/local/www/vpn_pptp.php:326 usr/local/www/vpn_pptp.php:328
+#: usr/local/www/vpn_pptp.php:331
+msgid "Enter the IP address of a host which will accept incoming PPTP connections"
+msgstr "Informe o endereço IP do host que aceitará conexões PPTP de entrada"
+
+#: usr/local/www/vpn_pptp.php:332 usr/local/www/vpn_pptp.php:334
+#: usr/local/www/vpn_pptp.php:337
+msgid "Enable PPTP server"
+msgstr "Habilitar servidor PPTP"
+
+#: usr/local/www/vpn_pptp.php:335 usr/local/www/vpn_pptp.php:337
+#: usr/local/www/vpn_pptp.php:340
+msgid "No. PPTP users"
+msgstr "No. usuários PPTP"
+
+#: usr/local/www/vpn_pptp.php:349 usr/local/www/vpn_pptp.php:351
+#: usr/local/www/vpn_pptp.php:354
+msgid "Hint: 10 is ten PPTP clients"
+msgstr "Dica: 10 são dez clientes PPTP"
+
+#: usr/local/www/vpn_pptp.php:357 usr/local/www/vpn_pptp.php:359
+#: usr/local/www/vpn_pptp.php:362
+msgid "Enter the IP address the PPTP server should give to clients for use as their \"gateway\""
+msgstr "Informe o endereço IP do servidor PPTP que deverá ser utilizado pelos clientes em seu \"gateway\""
+
+#: usr/local/www/vpn_pptp.php:359 usr/local/www/vpn_l2tp.php:327
+#: usr/local/www/vpn_pppoe_edit.php:430 usr/local/www/vpn_pppoe_edit.php:431
+#: usr/local/www/vpn_pptp.php:361 usr/local/www/vpn_l2tp.php:328
+#: usr/local/www/vpn_l2tp.php:331 usr/local/www/vpn_pppoe_edit.php:434
+#: usr/local/www/vpn_pptp.php:364
+msgid "Typically this is set to an unused IP just outside of the client range"
+msgstr "Normalmente, isto é definido como um IP não utilizado fora do range do cliente"
+
+#: usr/local/www/vpn_pptp.php:362 usr/local/www/vpn_l2tp.php:330
+#: usr/local/www/vpn_pppoe_edit.php:433 usr/local/www/vpn_pppoe_edit.php:434
+#: usr/local/www/vpn_pptp.php:364 usr/local/www/vpn_l2tp.php:331
+#: usr/local/www/vpn_l2tp.php:334 usr/local/www/vpn_pppoe_edit.php:437
+#: usr/local/www/vpn_pptp.php:367
+msgid "NOTE: This should NOT be set to any IP address currently in use on this firewall"
+msgstr "NOTA: Este não deve ser definido para nenhum endereço IP atualmente em uso neste firewall "
+
+#: usr/local/www/vpn_pptp.php:365 usr/local/www/vpn_l2tp.php:333
+#: usr/local/www/vpn_pppoe_edit.php:436 usr/local/www/vpn_pppoe_edit.php:437
+#: usr/local/www/vpn_pptp.php:367 usr/local/www/vpn_pppoe_edit.php:440
+#: usr/local/www/vpn_pptp.php:370
+msgid "Remote address range"
+msgstr "Intervalo de endereço remoto"
+
+#: usr/local/www/vpn_pptp.php:370 usr/local/www/vpn_pptp.php:372
+#: usr/local/www/vpn_pptp.php:375
+msgid "Specify the starting address for the client IP subnet"
+msgstr "Especifique o endereço de início para a subrede do IP do cliente"
+
+#: usr/local/www/vpn_pptp.php:373 usr/local/www/vpn_pptp.php:375
+#: usr/local/www/vpn_pptp.php:378
+msgid "PPTP DNS Servers"
+msgstr "Servidores DNS PPTP"
+
+#: usr/local/www/vpn_pptp.php:379 usr/local/www/vpn_pptp.php:381
+#: usr/local/www/vpn_pptp.php:384
+msgid "primary and secondary DNS servers assigned to PPTP clients"
+msgstr "servidores DNS primário e secundário atribuídos a clientes PPTP"
+
+#: usr/local/www/vpn_pptp.php:382 usr/local/www/vpn_l2tp.php:404
+#: usr/local/www/vpn_pptp.php:384 usr/local/www/vpn_l2tp.php:405
+#: usr/local/www/vpn_l2tp.php:408 usr/local/www/vpn_pptp.php:387
+msgid "WINS Server"
+msgstr "Servidor WINS"
+
+#: usr/local/www/vpn_pptp.php:388 usr/local/www/vpn_l2tp.php:410
+#: usr/local/www/vpn_pppoe_edit.php:461 usr/local/www/vpn_pppoe_edit.php:462
+#: usr/local/www/vpn_pptp.php:390 usr/local/www/vpn_l2tp.php:411
+#: usr/local/www/vpn_l2tp.php:414 usr/local/www/vpn_pppoe_edit.php:465
+#: usr/local/www/vpn_pptp.php:393
+msgid "RADIUS"
+msgstr "RADIUS"
+
+#: usr/local/www/vpn_pptp.php:391 usr/local/www/vpn_l2tp.php:413
+#: usr/local/www/vpn_pppoe_edit.php:464 usr/local/www/vpn_pppoe_edit.php:465
+#: usr/local/www/vpn_pptp.php:393 usr/local/www/vpn_l2tp.php:414
+#: usr/local/www/vpn_l2tp.php:417 usr/local/www/vpn_pppoe_edit.php:468
+#: usr/local/www/vpn_pptp.php:396
+msgid "Use a RADIUS server for authentication"
+msgstr "Usar um servidor RADIUS para autenticação"
+
+#: usr/local/www/vpn_pptp.php:392 usr/local/www/vpn_pppoe_edit.php:465
+#: usr/local/www/vpn_pppoe_edit.php:466 usr/local/www/vpn_pptp.php:394
+#: usr/local/www/vpn_pppoe_edit.php:469 usr/local/www/vpn_pptp.php:397
+msgid "When set, all users will be authenticated using the RADIUS server specified below. The local user database will not be used"
+msgstr "Quando configurado, todos os usuários serão autenticados usando o servidor RADIUS especificado abaixo. A base de dados de usuários local não será usada"
+
+#: usr/local/www/vpn_pptp.php:397 usr/local/www/vpn_l2tp.php:417
+#: usr/local/www/vpn_pppoe_edit.php:470 usr/local/www/vpn_pppoe_edit.php:471
+#: usr/local/www/vpn_pptp.php:399 usr/local/www/vpn_l2tp.php:418
+#: usr/local/www/vpn_l2tp.php:421 usr/local/www/vpn_pppoe_edit.php:474
+#: usr/local/www/vpn_pptp.php:402
+msgid "Enable RADIUS accounting"
+msgstr "Habilitar RADIUS accounting"
+
+#: usr/local/www/vpn_pptp.php:398 usr/local/www/vpn_pppoe_edit.php:472
+#: usr/local/www/vpn_pppoe_edit.php:473 usr/local/www/vpn_pptp.php:400
+#: usr/local/www/vpn_pppoe_edit.php:476 usr/local/www/vpn_pptp.php:403
+msgid "Sends accounting packets to the RADIUS server"
+msgstr "Envia pacotes de accounting para o servidor RADIUS"
+
+#: usr/local/www/vpn_pptp.php:401 usr/local/www/vpn_pptp.php:403
+#: usr/local/www/vpn_pptp.php:406
+msgid "Secondary RADIUS server for failover authentication"
+msgstr "Servidor RADIUS secundário para autenticação failover"
+
+#: usr/local/www/vpn_pptp.php:402 usr/local/www/vpn_pptp.php:404
+#: usr/local/www/vpn_pptp.php:407
+msgid "When set, all requests will go to the secondary server when primary fails"
+msgstr "Quando configurado, todas as requisições irão para o servidor secundário quando o primário falhar"
+
+#: usr/local/www/vpn_pptp.php:405 usr/local/www/vpn_pppoe_edit.php:492
+#: usr/local/www/vpn_pppoe_edit.php:493 usr/local/www/vpn_pptp.php:407
+#: usr/local/www/vpn_pppoe_edit.php:496 usr/local/www/vpn_pptp.php:410
+msgid "RADIUS issued IPs"
+msgstr "IPs emitidos pelo RADIUS"
+
+#: usr/local/www/vpn_pptp.php:406 usr/local/www/vpn_pptp.php:408
+#: usr/local/www/vpn_pptp.php:411
+msgid "Issue IP addresses via RADIUS server"
+msgstr "Emite endereços IP via servidor RADIUS"
+
+#: usr/local/www/vpn_pptp.php:411 usr/local/www/vpn_pptp.php:413
+#: usr/local/www/vpn_pptp.php:416
+msgid "RADIUS NAS IP"
+msgstr "IP NAS do RADIUS"
+
+#: usr/local/www/vpn_pptp.php:417 usr/local/www/vpn_pppoe_edit.php:485
+#: usr/local/www/vpn_pppoe_edit.php:486 usr/local/www/vpn_pptp.php:419
+#: usr/local/www/vpn_pppoe_edit.php:489 usr/local/www/vpn_pptp.php:422
+msgid "RADIUS Accounting Update"
+msgstr "Atualização de accounting do RADIUS"
+
+#: usr/local/www/vpn_pptp.php:423 usr/local/www/vpn_pptp.php:425
+#: usr/local/www/vpn_l2tp.php:422 usr/local/www/vpn_l2tp.php:425
+#: usr/local/www/vpn_pptp.php:428
+msgid "RADIUS Server"
+msgstr "Servidor RADIUS"
+
+#: usr/local/www/vpn_pptp.php:429 usr/local/www/vpn_pptp.php:446
+#: usr/local/www/vpn_pptp.php:431 usr/local/www/vpn_pptp.php:448
+#: usr/local/www/vpn_pptp.php:434 usr/local/www/vpn_pptp.php:451
+msgid "Enter the IP address, RADIUS port, and RADIUS accounting port of the RADIUS server"
+msgstr "Informe o endereço IP, porta do RADIUS, e porta de accounting do servidor RADIUS"
+
+#: usr/local/www/vpn_pptp.php:436 usr/local/www/vpn_pppoe_edit.php:510
+#: usr/local/www/vpn_pppoe_edit.php:527 usr/local/www/vpn_pppoe_edit.php:511
+#: usr/local/www/vpn_pppoe_edit.php:528 usr/local/www/vpn_pptp.php:438
+#: usr/local/www/vpn_pppoe_edit.php:514 usr/local/www/vpn_pppoe_edit.php:531
+#: usr/local/www/vpn_pptp.php:441
+msgid "Enter the shared secret that will be used to authenticate to the RADIUS server"
+msgstr "Informe o segredo compartilhado que será usado para autenticar no servidor RADIUS"
+
+#: usr/local/www/vpn_pptp.php:449 usr/local/www/vpn_pptp.php:451
+#: usr/local/www/vpn_pptp.php:454
+msgid "Secondary RADIUS shared secret"
+msgstr "Segredo compartilhado secundário do RADIUS"
+
+#: usr/local/www/vpn_pptp.php:453 usr/local/www/vpn_pptp.php:455
+#: usr/local/www/vpn_pptp.php:458
+msgid "Enter the shared secret that will be used to authenticate to the secondary RADIUS server"
+msgstr "Informe o segredo compartilhado que será usado para autenticar no servidor RADIUS secundário"
+
+#: usr/local/www/vpn_pptp.php:463 usr/local/www/vpn_pptp.php:465
+#: usr/local/www/vpn_pptp.php:468
+msgid "Require 128-bit encryption"
+msgstr "Requere criptografia 128-bits"
+
+#: usr/local/www/vpn_pptp.php:464 usr/local/www/vpn_pptp.php:466
+#: usr/local/www/vpn_pptp.php:469
+msgid "When set, only 128-bit encryption will be accepted. Otherwise 40-bit and 56-bit encryption will be accepted as well. Note that encryption will always be forced on PPTP connections (i.e. unencrypted connections will not be accepted)"
+msgstr "Quando configurado, somente criptografias de 128-bits serão aceitas. Do contrário criptografias de 40 e 56 bits serão aceitas também. Note que a criptografia será sempre forçada nas conexões PPTP (i.e. conexões não criptografadas não serão aceitas)"
+
+#: usr/local/www/vpn_pptp.php:478 usr/local/www/vpn_pptp.php:480
+#: usr/local/www/vpn_pptp.php:483
+msgid "don't forget to "
+msgstr "não esqueça de "
+
+#: usr/local/www/vpn_pptp.php:478 usr/local/www/vpn_pptp.php:480
+#: usr/local/www/vpn_pptp.php:483
+msgid "add a firewall rule"
+msgstr "adicionar uma regra de firewall"
+
+#: usr/local/www/vpn_pptp.php:478 usr/local/www/vpn_pptp.php:480
+#: usr/local/www/vpn_pptp.php:483
+msgid "to permit traffic from PPTP clients"
+msgstr "para permitir tráfego de clientes PPTP"
+
+#: usr/local/www/vpn_pptp_users.php:81 usr/local/www/vpn_l2tp_users.php:84
+#: usr/local/www/vpn_l2tp_users.php:85 usr/local/www/vpn_pptp_users.php:82
+msgid "Warning: RADIUS is enabled. The local user database will not be used."
+msgstr "Advertência: RADIUS está habilitado. A base de dados de usuários local não será usada."
+
+#: usr/local/www/vpn_pptp_users.php:83 usr/local/www/vpn_pptp_users.php:84
+msgid "The PPTP user list has been modified"
+msgstr "A lista de usuários PPTP foi modificada;"
+
+#: usr/local/www/vpn_pptp_users.php:83 usr/local/www/vpn_l2tp_users.php:86
+#: usr/local/www/vpn_l2tp_users.php:87 usr/local/www/vpn_pptp_users.php:84
+msgid "You must apply the changes in order for them to take effect"
+msgstr "Você deve aplicar as mudanças para que elas tenham efeito"
+
+#: usr/local/www/vpn_pptp_users.php:83 usr/local/www/vpn_pptp_users.php:84
+msgid "Warning: this will terminate all current PPTP sessions"
+msgstr "Advertência: isso irá finaliar todas as sessões PPTP atuais"
+
+#: usr/local/www/vpn_pptp_users.php:104 usr/local/www/vpn_pptp_users.php:127
+#: usr/local/www/system_usermanager.php:842
+#: usr/local/www/vpn_l2tp_users.php:120
+#: usr/local/www/system_usermanager.php:840
+#: usr/local/www/system_usermanager.php:845
+#: usr/local/www/vpn_l2tp_users.php:121 usr/local/www/vpn_pptp_users.php:105
+#: usr/local/www/vpn_pptp_users.php:128
+#: usr/local/www/system_usermanager.php:798
+msgid "add user"
+msgstr "adicionar usuário"
+
+#: usr/local/www/vpn_pptp_users.php:117
+#: usr/local/www/system_usermanager.php:824
+#: usr/local/www/system_usermanager.php:822
+#: usr/local/www/system_usermanager.php:825
+#: usr/local/www/vpn_pptp_users.php:118
+#: usr/local/www/system_usermanager.php:848
+msgid "edit user"
+msgstr "editar usuário"
+
+#: usr/local/www/vpn_pptp_users.php:118 usr/local/www/vpn_l2tp_users.php:115
+#: usr/local/www/vpn_l2tp_users.php:116 usr/local/www/vpn_pptp_users.php:119
+msgid "Do you really want to delete this user?"
+msgstr "Você realmente deseja apagar esse usuário?"
+
+#: usr/local/www/vpn_pptp_users.php:118
+#: usr/local/www/system_usermanager.php:829
+#: usr/local/www/vpn_l2tp_users.php:115
+#: usr/local/www/system_usermanager.php:827
+#: usr/local/www/system_usermanager.php:830
+#: usr/local/www/vpn_l2tp_users.php:116 usr/local/www/vpn_pptp_users.php:119
+#: usr/local/www/system_usermanager.php:853
+msgid "delete user"
+msgstr "apagar usuário"
+
+#: usr/local/www/vpn_pptp_users_edit.php:85
+#: usr/local/www/services_dyndns_edit.php:94
+#: usr/local/www/system_usermanager.php:199
+#: usr/local/www/vpn_l2tp_users_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:110
+#: usr/local/www/vpn_l2tp_users_edit.php:88
+#: usr/local/www/services_dyndns_edit.php:111
+msgid "The username contains invalid characters."
+msgstr "O nome de usuário contém caracteres inválidos."
+
+#: usr/local/www/vpn_pptp_users_edit.php:88
+msgid "The password cannot start with '!'."
+msgstr "A senha não pode iniciar com '!'."
+
+#: usr/local/www/vpn_pptp_users_edit.php:91
+#: usr/local/www/vpn_l2tp_users_edit.php:90
+#: usr/local/www/vpn_l2tp_users_edit.php:91
+msgid "The password contains invalid characters."
+msgstr "A senha contém caracteres inválidos."
+
+#: usr/local/www/vpn_pptp_users_edit.php:94
+#: usr/local/www/system_usermanager.php:205
+#: usr/local/www/system_usermanager_passwordmg.php:54
+#: usr/local/www/vpn_l2tp_users_edit.php:93
+#: usr/local/www/vpn_l2tp_users_edit.php:94
+msgid "The passwords do not match."
+msgstr "As senhas não correspondem."
+
+#: usr/local/www/vpn_pptp_users_edit.php:97
+#: usr/local/www/vpn_l2tp_users_edit.php:96
+#: usr/local/www/vpn_l2tp_users_edit.php:97
+msgid "The IP address entered is not valid."
+msgstr "O endereço IP informado não é válido."
+
+#: usr/local/www/vpn_pptp_users_edit.php:104
+#: usr/local/www/system_usermanager.php:215
+#: usr/local/www/vpn_l2tp_users_edit.php:103
+#: usr/local/www/vpn_l2tp_users_edit.php:104
+msgid "Another entry with the same username already exists."
+msgstr "Outra entrada com o mesmo nome de usuário já existe."
+
+#: usr/local/www/vpn_pptp_users_edit.php:155
+#: usr/local/www/vpn_l2tp_users_edit.php:163
+#: usr/local/www/vpn_pptp_users_edit.php:156
+#: usr/local/www/vpn_l2tp_users_edit.php:164
+msgid "confirmation"
+msgstr "confirmação"
+
+#: usr/local/www/vpn_pptp_users_edit.php:156
+#: usr/local/www/vpn_pptp_users_edit.php:157
+msgid "If you want to change the users' password, enter it here twice."
+msgstr "Se você desejar mudar a senha do usuário, informe-a duas vezes aqui."
+
+#: usr/local/www/vpn_pptp_users_edit.php:163
+#: usr/local/www/vpn_l2tp_users_edit.php:171
+#: usr/local/www/vpn_pptp_users_edit.php:164
+#: usr/local/www/vpn_l2tp_users_edit.php:172
+msgid "If you want the user to be assigned a specific IP address, enter it here."
+msgstr "Se você desejar que o usuário seja designado a um endereço IP específico, informe-o aqui."
+
+#: usr/local/www/wizard.php:65 usr/local/www/wizard.php:71
+#, php-format
+msgid "ERROR: Could not open %s."
+msgstr "ERRO: Não pôde abrir %s."
+
+#: usr/local/www/wizard.php:77
+#, php-format
+msgid "ERROR: Could not parse %s/wizards/%s file."
+msgstr "ERRO: Não pôde fazer parse do arquivo %s/wizards/%s."
+
+#: usr/local/www/load_balancer_relay_action_edit.php:65
+msgid "Load Balancer: Relay Action:"
+msgstr "Balanceador de Carga: Ação de Relay:"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:124
+msgid "This action name has already been used. Action names must be unique."
+msgstr "Esse nome de ação já está sendo usado. Nomes de ação devem ser únicos."
+
+#: usr/local/www/load_balancer_relay_action_edit.php:134
+#, php-format
+msgid "modified '%s' action:"
+msgstr "ação '%s' modificada:"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:186
+#: usr/local/www/load_balancer_relay_protocol_edit.php:144
+#: usr/local/www/load_balancer_relay_protocol_edit.php:142
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+msgid "DNS"
+msgstr "DNS"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:408
+#: usr/local/www/load_balancer_relay_action_edit.php:407
+#: usr/local/www/load_balancer_relay_action_edit.php:405
+msgid "Edit Load Balancer - Relay Action entry"
+msgstr "Editar Balanceador de Carga - Entrada de Ação Relay"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:508
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:173
+#: usr/local/www/load_balancer_relay_action_edit.php:507
+#: usr/local/www/load_balancer_relay_action_edit.php:505
+#: usr/local/www/services_rfc2136_edit.php:72
+#: usr/local/www/services_rfc2136_edit.php:178
+msgid "Key"
+msgstr "Chave"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:517
+#: usr/local/www/load_balancer_relay_action_edit.php:537
+#: usr/local/www/load_balancer_relay_action_edit.php:516
+#: usr/local/www/load_balancer_relay_action_edit.php:536
+#: usr/local/www/load_balancer_relay_action_edit.php:514
+#: usr/local/www/load_balancer_relay_action_edit.php:534
+msgid "TODO"
+msgstr "TODO"
+
+#: usr/local/www/xmlrpc.php:58 usr/local/www/xmlrpc.php:54
+msgid "Disallowing CARP sync loop."
+msgstr "Desabilitando loop de sincronização CARP."
+
+#: usr/local/www/xmlrpc.php:67 usr/local/www/xmlrpc.php:63
+msgid "Authentication failed"
+msgstr "Autenticação falhou"
+
+#: usr/local/www/xmlrpc.php:78 usr/local/www/xmlrpc.php:74
+msgid "XMLRPC wrapper for eval(). This method must be called with two parameters: a string containing the local system\\'s password followed by the PHP code to evaluate."
+msgstr "Wrapper de XMLRPC para eval(). Esse método deve ser chamado com 2 parâmetros: uma string contendo a senha do sistema local seguida pelo código PHP para avaliar."
+
+#: usr/local/www/xmlrpc.php:109 usr/local/www/xmlrpc.php:105
+msgid "XMLRPC wrapper for mwexec(). This method must be called with two parameters: a string containing the local system\\'s password followed by an shell command to execute."
+msgstr "Wrapper de XMLRPC para mexec(). Esse método deve ser chamado com 2 parâmetros: uma string contendo a senha do sistema local seguida por um comando shell para ser executado."
+
+#: usr/local/www/xmlrpc.php:133 usr/local/www/xmlrpc.php:129
+msgid "XMLRPC wrapper for backup_config_section. This method must be called with two parameters: a string containing the local system\\'s password followed by an array containing the keys to be backed up."
+msgstr "Wrapper de XMLRPC para backup_config_section. Esse método deve ser chamado com 2 parâmetros: uma string contendo a senha do sistema local seguida por uma lista com as chaves para serem armazenadas."
+
+#: usr/local/www/xmlrpc.php:156 usr/local/www/xmlrpc.php:152
+#: usr/local/www/xmlrpc.php:159 usr/local/www/xmlrpc.php:161
+msgid "XMLRPC wrapper for restore_config_section. This method must be called with two parameters: a string containing the local system\\'s password and an array to merge into the system\\'s config. This function returns true upon completion."
+msgstr "Wrapper de XMLRPC para restore_config_section. Esse método deve ser chamado com 2 parâmetros: uma string contendo a senha do sistema local e uma lista para mesclar com a configuração do sistema. Essa função retorna verdadeiro ao finalizar."
+
+#: usr/local/www/xmlrpc.php:203 usr/local/www/xmlrpc.php:282
+#: usr/local/www/xmlrpc.php:307 usr/local/www/xmlrpc.php:212
+#: usr/local/www/xmlrpc.php:291 usr/local/www/xmlrpc.php:316
+#: usr/local/www/xmlrpc.php:288 usr/local/www/xmlrpc.php:313
+#: usr/local/www/xmlrpc.php:224 usr/local/www/xmlrpc.php:308
+#: usr/local/www/xmlrpc.php:337 usr/local/www/xmlrpc.php:228
+#: usr/local/www/xmlrpc.php:314 usr/local/www/xmlrpc.php:345
+#, php-format
+msgid "Merged in config (%s sections) from XMLRPC client."
+msgstr "Mescaldo em config (seções %s) do cliente XMLRPC."
+
+#: usr/local/www/xmlrpc.php:263 usr/local/www/xmlrpc.php:272
+#: usr/local/www/xmlrpc.php:269 usr/local/www/xmlrpc.php:286
+#: usr/local/www/xmlrpc.php:290
+msgid "XMLRPC wrapper for merging package sections. This method must be called with two parameters: a string containing the local system\\'s password and an array to merge into the system\\'s config. This function returns true upon completion."
+msgstr "Wrapper de XMLRPC para mesclar seções de pacotes. Esse método deve ser chamado com 2 parâmetros: uma string contendo a senha do sistema local seguida por uma lista para mesclar com a configuração do sistema. Essa função retorna verdadeiro ao finalizar."
+
+#: usr/local/www/xmlrpc.php:288 usr/local/www/xmlrpc.php:297
+#: usr/local/www/xmlrpc.php:294 usr/local/www/xmlrpc.php:314
+#: usr/local/www/xmlrpc.php:320
+msgid "XMLRPC wrapper for merge_config_section. This method must be called with two parameters: a string containing the local system\\'s password and an array to merge into the system\\'s config. This function returns true upon completion."
+msgstr "Wrapper de XMLRPC para merge_config_section. Esse método deve ser chamado com 2 parâmetros: uma string contendo a senha do sistema local seguida por uma lista para mesclar com a configuração do sistema. Essa função retorna verdadeiro ao finalizar."
+
+#: usr/local/www/xmlrpc.php:312 usr/local/www/xmlrpc.php:321
+#: usr/local/www/xmlrpc.php:318 usr/local/www/xmlrpc.php:342
+#: usr/local/www/xmlrpc.php:350
+msgid "Basic XMLRPC wrapper for filter_configure. This method must be called with one paramater: a string containing the local system\\'s password. This function returns true upon completion."
+msgstr "Wrapper de XMLRPC para filter_configure. Esse método deve ser chamado com 1 parâmetro: uma string contendo a senha do sistema local. Essa função retorna verdadeiro ao finalizar."
+
+#: usr/local/www/xmlrpc.php:342 usr/local/www/xmlrpc.php:351
+#: usr/local/www/xmlrpc.php:348 usr/local/www/xmlrpc.php:372
+#: usr/local/www/xmlrpc.php:380
+msgid "Basic XMLRPC wrapper for configuring CARP interfaces."
+msgstr "Wrapper básico de XMLRPC para configurar interfaces CARP."
+
+#: usr/local/www/xmlrpc.php:364 usr/local/www/xmlrpc.php:385
+#: usr/local/www/xmlrpc.php:373 usr/local/www/xmlrpc.php:394
+#: usr/local/www/xmlrpc.php:370 usr/local/www/xmlrpc.php:391
+#: usr/local/www/xmlrpc.php:397 usr/local/www/xmlrpc.php:418
+#: usr/local/www/xmlrpc.php:407 usr/local/www/xmlrpc.php:428
+msgid "Basic XMLRPC wrapper for check_firmware_version. This function will return the output of check_firmware_version upon completion."
+msgstr "Wrapper básico de XMLRPC para check_firmware_version. Essa função retornará o resultado de check_firmware_version após finalizar."
+
+#: usr/local/www/xmlrpc.php:406 usr/local/www/xmlrpc.php:415
+#: usr/local/www/xmlrpc.php:412 usr/local/www/xmlrpc.php:439
+#: usr/local/www/xmlrpc.php:449
+msgid "Basic XMLRPC wrapper for rc.reboot."
+msgstr "Wrapper básico de XMLRPC para rc.reboot."
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:65
+msgid "Load Balancer: Relay Protocol:"
+msgstr "Balanceador de Carga: Protocolo Relay:"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:86
+msgid "This protocol name has already been used. Protocol names must be unique."
+msgstr "Esse nome de protocolo já existe. Nomes de protocolos devem ser únicos."
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:105
+#, php-format
+msgid "modified '%s' load balancing protocol:"
+msgstr "protocolo de balanceamento de carga '%s' modificado:"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:107
+msgid "name"
+msgstr "nome"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:108
+#: usr/local/www/load_balancer_relay_protocol_edit.php:110
+msgid "type"
+msgstr "tipo"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:109
+msgid "description"
+msgstr "descrição"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:111
+msgid "action"
+msgstr "ação"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:192
+#: usr/local/www/load_balancer_relay_protocol_edit.php:190
+msgid "Edit Load Balancer - Relay Protocol entry"
+msgstr "Editar Balanceador de Carga - Entrada de Protocolo Relay"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:227
+#: usr/local/www/load_balancer_relay_protocol_edit.php:225
+msgid "Add / remove available actions"
+msgstr "Adicionar / Remover ações disponíveis"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:237
+#: usr/local/www/load_balancer_relay_protocol_edit.php:235
+msgid "Available Actions"
+msgstr "Ações Disponíveis"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:252
+#: usr/local/www/system_crlmanager.php:474
+#: usr/local/www/load_balancer_relay_protocol_edit.php:250
+#: usr/local/www/system_crlmanager.php:507
+msgid "Add"
+msgstr "Adicionar"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:259
+#: usr/local/www/load_balancer_relay_protocol_edit.php:257
+msgid "Enabled Actions"
+msgstr "Habilitar Ações"
+
+#: usr/local/www/pkg_mgr_settings.php:62 usr/local/www/pkg_mgr_settings.php:94
+#: usr/local/www/pkg_mgr_settings.php:93
+msgid "Package Settings"
+msgstr "Configurações de Pacote"
+
+#: usr/local/www/pkg_mgr_settings.php:92 usr/local/www/pkg_mgr_settings.php:91
+#, php-format
+msgid "%s packages"
+msgstr "%s pacotes"
+
+#: usr/local/www/pkg_mgr_settings.php:102
+#: usr/local/www/pkg_mgr_settings.php:105
+#: usr/local/www/pkg_mgr_settings.php:101
+#: usr/local/www/pkg_mgr_settings.php:104
+msgid "Package Repository URL"
+msgstr "URL de Repositório de Pacotes"
+
+#: usr/local/www/pkg_mgr_settings.php:107
+#: usr/local/www/pkg_mgr_settings.php:106
+msgid "Use a different URL server for packages other than"
+msgstr "Use um servidor URL diferente para pacotes ao invés de"
+
+#: usr/local/www/pkg_mgr_settings.php:112
+#: usr/local/www/pkg_mgr_settings.php:111
+#, php-format
+msgid "This is where %s will check for packages when the"
+msgstr "Isso é onde %s verificará por pacotes quando o"
+
+#: usr/local/www/pkg_mgr_settings.php:112
+#: usr/local/www/pkg_mgr_settings.php:111
+msgid "System: Packages"
+msgstr "Sistema: Pacotes"
+
+#: usr/local/www/services_captiveportal_hostname.php:111
+#: usr/local/www/services_captiveportal_hostname.php:109
+msgid "Allowed IP Addresses"
+msgstr "Endereços IP permitidos"
+
+#: usr/local/www/services_captiveportal_hostname.php:173
+#: usr/local/www/services_captiveportal_hostname.php:171
+msgid "Adding allowed Hostnames will allow a DNS hostname access to/from access through the captive portal without being taken to the portal page. This can be used for a web server serving images for the portal page or a DNS server on another network, for example. By specifying <em>from</em> addresses, it may be used to always allow pass-through access from a client behind the captive portal."
+msgstr "Adicionando hostnames permitidos irá permitir acesso de/para através do captive portal sem levá-los a página do portal. Isto pode ser usado para um servidor web servindo imagens para a página do captive portal ou um servidor DNS em outra rede, por exemplo. Especificando endereços <em>de</em> origem, pode ser usado para sempre permitir acesso de um cliente atrás do captive portal."
+
+#: usr/local/www/services_captiveportal_hostname.php:177
+#: usr/local/www/services_captiveportal_hostname.php:184
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/services_captiveportal_hostname.php:182
+msgid "the Hostname are allowed"
+msgstr "o hostname está permitido"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:62
+#: usr/local/www/services_captiveportal_hostname_edit.php:59
+msgid "Edit allowed Hostname"
+msgstr "Editar hostname permitido"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:102
+#: usr/local/www/services_captiveportal_hostname_edit.php:100
+msgid "Allowed Hostname"
+msgstr "Hostname permitido"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:107
+#: usr/local/www/services_captiveportal_hostname_edit.php:105
+#, php-format
+msgid "A valid Hostname must be specified. [%s]"
+msgstr "Um hostname válido deve ser especificado. [%s]"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:172
+#: usr/local/www/services_captiveportal_hostname_edit.php:170
+msgid "to always allow an Hostname through the captive portal (without authentication)"
+msgstr "para sempre permitir um hostname através do portal captive (sem autenticação)"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:173
+#: usr/local/www/services_captiveportal_hostname_edit.php:171
+msgid "to allow access from all clients (even non-authenticated ones) behind the portal to this Hostname"
+msgstr "para permitir acesso de todos os clientes (mesmo aqueles não autenticados) atrás do portal para esse Hostname"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:192
+#: usr/local/www/services_captiveportal_hostname_edit.php:190
+msgid "Enter a upload limit to be enforced on this Hostname in Kbit/s"
+msgstr "Informe um limite de upload para ser utilizado nesse Hostname em Kbit/s"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:198
+#: usr/local/www/services_captiveportal_hostname_edit.php:196
+msgid "Enter a download limit to be enforced on this Hostname in Kbit/s"
+msgstr "Informe o limite de download para ser utilizado nesse Hostname em Kbit/s"
+
+#: usr/local/www/services_captiveportal_vouchers.php:67
+#: usr/local/www/services_captiveportal_vouchers.php:64
+msgid "You will need to recreate any existing Voucher Rolls due to the public and private key changes. Click cancel if you do not wish to recreate the vouchers."
+msgstr "Você precisará recriar qualquer Lista de Voucher existente devido a mudanças em chaves públicas e privadas. Clique em cancelar se não desejar recriar os vouchers."
+
+#: usr/local/www/services_captiveportal_vouchers.php:114
+#: usr/local/www/services_captiveportal_vouchers.php:123
+#: usr/local/www/services_captiveportal_vouchers.php:130
+msgid "Voucher invalid"
+msgstr "Voucher inválido"
+
+#: usr/local/www/services_captiveportal_vouchers.php:116
+#: usr/local/www/services_captiveportal_vouchers.php:125
+#: usr/local/www/services_captiveportal_vouchers.php:132
+msgid "Voucher expired"
+msgstr "Voucher expirado"
+
+#: usr/local/www/services_captiveportal_vouchers.php:139
+#: usr/local/www/services_captiveportal_vouchers.php:148
+#: usr/local/www/services_captiveportal_vouchers.php:155
+msgid "Cannot write private key file"
+msgstr "Não pode escrever no arquivo de chave privada"
+
+#: usr/local/www/services_captiveportal_vouchers.php:157
+#: usr/local/www/services_captiveportal_vouchers.php:166
+#: usr/local/www/services_captiveportal_vouchers.php:175
+msgid "Need private RSA key to print vouchers"
+msgstr "É necessária uma chave RSA privada para imprimir vouchers"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "charset"
+msgstr "charset"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "rollbits"
+msgstr "rollbits"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "ticketbits"
+msgstr "ticketbits"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "checksumbits"
+msgstr "checksumbits"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "publickey"
+msgstr "publickey"
+
+#: usr/local/www/services_captiveportal_vouchers.php:191
+#: usr/local/www/services_captiveportal_vouchers.php:201
+#: usr/local/www/services_captiveportal_vouchers.php:210
+msgid "magic"
+msgstr "magic"
+
+#: usr/local/www/services_captiveportal_vouchers.php:194
+#: usr/local/www/services_captiveportal_vouchers.php:565
+#: usr/local/www/services_captiveportal_vouchers.php:572
+#: usr/local/www/services_captiveportal_vouchers.php:204
+#: usr/local/www/services_captiveportal_vouchers.php:585
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:594
+#: usr/local/www/services_captiveportal_vouchers.php:599
+msgid "Synchronize Voucher Database IP"
+msgstr "Sincronizar IP de base de dados de Vouchers"
+
+#: usr/local/www/services_captiveportal_vouchers.php:194
+#: usr/local/www/services_captiveportal_vouchers.php:204
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "Sync port"
+msgstr "Porta de sincronização"
+
+#: usr/local/www/services_captiveportal_vouchers.php:194
+#: usr/local/www/services_captiveportal_vouchers.php:204
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "Sync password"
+msgstr "Senha de sincronização"
+
+#: usr/local/www/services_captiveportal_vouchers.php:194
+#: usr/local/www/services_captiveportal_vouchers.php:204
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "Sync username"
+msgstr "Sincronização de usuário"
+
+#: usr/local/www/services_captiveportal_vouchers.php:203
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:222
+msgid "Need at least 2 characters to create vouchers."
+msgstr "São necessários pelo menos 2 caracteres para criar vouchers."
+
+#: usr/local/www/services_captiveportal_vouchers.php:205
+#: usr/local/www/services_captiveportal_vouchers.php:215
+#: usr/local/www/services_captiveportal_vouchers.php:224
+msgid "Double quotes aren't allowed."
+msgstr "Aspas não são permitidas."
+
+#: usr/local/www/services_captiveportal_vouchers.php:207
+#: usr/local/www/services_captiveportal_vouchers.php:217
+#: usr/local/www/services_captiveportal_vouchers.php:226
+msgid "aren't allowed."
+msgstr "não são permitidas."
+
+#: usr/local/www/services_captiveportal_vouchers.php:209
+#: usr/local/www/services_captiveportal_vouchers.php:219
+#: usr/local/www/services_captiveportal_vouchers.php:228
+msgid "# of Bits to store Roll Id needs to be between 1..31."
+msgstr "# de Bits para armazenar Id da Lista precisa estar entre 1..31."
+
+#: usr/local/www/services_captiveportal_vouchers.php:211
+#: usr/local/www/services_captiveportal_vouchers.php:221
+#: usr/local/www/services_captiveportal_vouchers.php:230
+msgid "# of Bits to store Ticket Id needs to be between 1..16."
+msgstr "# de Bits para armazenar Ticket Id precisa estar entre 1..16."
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+#: usr/local/www/services_captiveportal_vouchers.php:223
+#: usr/local/www/services_captiveportal_vouchers.php:232
+msgid "# of Bits to store checksum needs to be between 1..31."
+msgstr "# de Bits para armazenar checksum precisa estar entre 1..31."
+
+#: usr/local/www/services_captiveportal_vouchers.php:215
+#: usr/local/www/services_captiveportal_vouchers.php:225
+#: usr/local/www/services_captiveportal_vouchers.php:234
+msgid "This doesn't look like an RSA Public key."
+msgstr "Isso não parece uma chave RSA pública."
+
+#: usr/local/www/services_captiveportal_vouchers.php:217
+#: usr/local/www/services_captiveportal_vouchers.php:227
+#: usr/local/www/services_captiveportal_vouchers.php:236
+msgid "This doesn't look like an RSA Private key."
+msgstr "Isso não parece uma chave RSA privada."
+
+#: usr/local/www/services_captiveportal_vouchers.php:219
+#: usr/local/www/services_captiveportal_vouchers.php:229
+#: usr/local/www/services_captiveportal_vouchers.php:238
+msgid "You cannot sync the voucher database to this host (itself)."
+msgstr "Você não pode sincronizar o banco de dados do vouche para este host (em si)."
+
+#: usr/local/www/services_captiveportal_vouchers.php:421
+#: usr/local/www/services_captiveportal_vouchers.php:428
+#: usr/local/www/services_captiveportal_vouchers.php:441
+#: usr/local/www/services_captiveportal_vouchers.php:450
+#: usr/local/www/services_captiveportal_vouchers.php:455
+msgid "Enable Vouchers"
+msgstr "Habilitar Vouchers"
+
+#: usr/local/www/services_captiveportal_vouchers.php:435
+#: usr/local/www/services_captiveportal_vouchers_edit.php:173
+#: usr/local/www/status_captiveportal_vouchers.php:116
+#: usr/local/www/services_captiveportal_vouchers.php:442
+#: usr/local/www/status_captiveportal_vouchers.php:117
+#: usr/local/www/services_captiveportal_vouchers.php:455
+#: usr/local/www/services_captiveportal_vouchers_edit.php:171
+#: usr/local/www/services_captiveportal_vouchers.php:464
+#: usr/local/www/status_captiveportal_vouchers.php:122
+#: usr/local/www/services_captiveportal_vouchers.php:469
+msgid "Roll"
+msgstr "Lista"
+
+#: usr/local/www/services_captiveportal_vouchers.php:436
+#: usr/local/www/status_captiveportal_voucher_rolls.php:86
+#: usr/local/www/services_captiveportal_vouchers.php:443
+#: usr/local/www/services_captiveportal_vouchers.php:456
+#: usr/local/www/status_captiveportal_voucher_rolls.php:87
+#: usr/local/www/services_captiveportal_vouchers.php:465
+#: usr/local/www/status_captiveportal_voucher_rolls.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:470
+msgid "Minutes/Ticket"
+msgstr "Minutos/Ticket"
+
+#: usr/local/www/services_captiveportal_vouchers.php:437
+#: usr/local/www/services_captiveportal_vouchers.php:444
+#: usr/local/www/services_captiveportal_vouchers.php:457
+#: usr/local/www/services_captiveportal_vouchers.php:466
+#: usr/local/www/services_captiveportal_vouchers.php:471
+msgid "of Tickets"
+msgstr "de Tickets"
+
+#: usr/local/www/services_captiveportal_vouchers.php:438
+#: usr/local/www/services_captiveportal_vouchers_edit.php:197
+#: usr/local/www/status_captiveportal_voucher_rolls.php:88
+#: usr/local/www/services_captiveportal_vouchers.php:445
+#: usr/local/www/services_captiveportal_vouchers.php:458
+#: usr/local/www/services_captiveportal_vouchers_edit.php:195
+#: usr/local/www/status_captiveportal_voucher_rolls.php:89
+#: usr/local/www/services_captiveportal_vouchers.php:467
+#: usr/local/www/status_captiveportal_voucher_rolls.php:91
+#: usr/local/www/services_captiveportal_vouchers.php:472
+msgid "Comment"
+msgstr "Comentar"
+
+#: usr/local/www/services_captiveportal_vouchers.php:458
+#: usr/local/www/services_captiveportal_vouchers.php:465
+#: usr/local/www/services_captiveportal_vouchers.php:478
+#: usr/local/www/services_captiveportal_vouchers.php:487
+#: usr/local/www/services_captiveportal_vouchers.php:492
+msgid "edit voucher"
+msgstr "editar voucher"
+
+#: usr/local/www/services_captiveportal_vouchers.php:459
+#: usr/local/www/services_captiveportal_vouchers.php:466
+#: usr/local/www/services_captiveportal_vouchers.php:479
+#: usr/local/www/services_captiveportal_vouchers.php:488
+#: usr/local/www/services_captiveportal_vouchers.php:493
+msgid "Do you really want to delete this voucher? This makes all vouchers from this roll invalid"
+msgstr "Você realmente deseja apagar esse voucher? Isso torna todos os vouchers dessa lista inválidos"
+
+#: usr/local/www/services_captiveportal_vouchers.php:459
+#: usr/local/www/services_captiveportal_vouchers.php:466
+#: usr/local/www/services_captiveportal_vouchers.php:479
+#: usr/local/www/services_captiveportal_vouchers.php:488
+#: usr/local/www/services_captiveportal_vouchers.php:493
+msgid "delete vouchers"
+msgstr "remover vouchers"
+
+#: usr/local/www/services_captiveportal_vouchers.php:460
+#: usr/local/www/services_captiveportal_vouchers.php:467
+#: usr/local/www/services_captiveportal_vouchers.php:480
+#: usr/local/www/services_captiveportal_vouchers.php:489
+#: usr/local/www/services_captiveportal_vouchers.php:494
+msgid "generate vouchers for this roll to CSV file"
+msgstr "gerar vouchers para essa lista em arquivo CSV"
+
+#: usr/local/www/services_captiveportal_vouchers.php:470
+#: usr/local/www/services_captiveportal_vouchers.php:477
+#: usr/local/www/services_captiveportal_vouchers.php:490
+#: usr/local/www/services_captiveportal_vouchers.php:499
+#: usr/local/www/services_captiveportal_vouchers.php:504
+msgid "add voucher"
+msgstr "adicionar voucher"
+
+#: usr/local/www/services_captiveportal_vouchers.php:475
+#: usr/local/www/services_captiveportal_vouchers.php:482
+#: usr/local/www/services_captiveportal_vouchers.php:495
+#: usr/local/www/services_captiveportal_vouchers.php:504
+#: usr/local/www/services_captiveportal_vouchers.php:509
+msgid "Create, generate and activate Rolls with Vouchers that allow access through the captive portal for the configured time. Once a voucher is activated, its clock is started and runs uninterrupted until it expires. During that time, the voucher can be re-used from the same or a different computer. If the voucher is used again from another computer, the previous session is stopped."
+msgstr "Crie, gere e ative Listas com Vouchers que dão permissão de acesso através do portal captive para o tempo configurado. Uma vez que um voucher for ativado, seu relório é iniciado e executa ininterruptamente até que expire. Durante esse tempo, o voucher pode ser reusado do mesmo computador ou de um diferente. Se o voucher é usado novamente por outro computador, a sessão anterior é interrompida."
+
+#: usr/local/www/services_captiveportal_vouchers.php:481
+#: usr/local/www/services_captiveportal_vouchers.php:488
+#: usr/local/www/services_captiveportal_vouchers.php:501
+#: usr/local/www/services_captiveportal_vouchers.php:510
+#: usr/local/www/services_captiveportal_vouchers.php:515
+msgid "Enable Voucher support first using the checkbox above and hit Save at the bottom."
+msgstr "Habilite suporte a Voucher usando a checkbox acima primeiro e pressione Salvar no rodapé."
+
+#: usr/local/www/services_captiveportal_vouchers.php:486
+#: usr/local/www/services_captiveportal_vouchers.php:493
+#: usr/local/www/services_captiveportal_vouchers.php:506
+#: usr/local/www/services_captiveportal_vouchers.php:515
+#: usr/local/www/services_captiveportal_vouchers.php:520
+msgid "Voucher public key"
+msgstr "Chave pública de Voucher"
+
+#: usr/local/www/services_captiveportal_vouchers.php:491
+#: usr/local/www/services_captiveportal_vouchers.php:498
+#: usr/local/www/services_captiveportal_vouchers.php:511
+#: usr/local/www/services_captiveportal_vouchers.php:520
+#: usr/local/www/services_captiveportal_vouchers.php:525
+msgid "Paste an RSA public key (64 Bit or smaller) in PEM format here. This key is used to decrypt vouchers."
+msgstr "Cole uma chave RSA pública (64 Bit ou menor) em formato PEM aqui. Essa é a chave usada para descriptografar vouchers."
+
+#: usr/local/www/services_captiveportal_vouchers.php:491
+#: usr/local/www/services_captiveportal_vouchers.php:498
+#: usr/local/www/services_captiveportal_vouchers.php:505
+#: usr/local/www/services_captiveportal_vouchers.php:511
+#: usr/local/www/services_captiveportal_vouchers.php:518
+#: usr/local/www/services_captiveportal_vouchers.php:520
+#: usr/local/www/services_captiveportal_vouchers.php:527
+#: usr/local/www/services_captiveportal_vouchers.php:525
+#: usr/local/www/services_captiveportal_vouchers.php:532
+msgid "Generate"
+msgstr "Gerar"
+
+#: usr/local/www/services_captiveportal_vouchers.php:491
+#: usr/local/www/services_captiveportal_vouchers.php:498
+#: usr/local/www/services_captiveportal_vouchers.php:505
+#: usr/local/www/services_captiveportal_vouchers.php:511
+#: usr/local/www/services_captiveportal_vouchers.php:518
+#: usr/local/www/services_captiveportal_vouchers.php:520
+#: usr/local/www/services_captiveportal_vouchers.php:527
+#: usr/local/www/services_captiveportal_vouchers.php:525
+#: usr/local/www/services_captiveportal_vouchers.php:532
+msgid "new key"
+msgstr "nova chave"
+
+#: usr/local/www/services_captiveportal_vouchers.php:494
+#: usr/local/www/services_captiveportal_vouchers.php:501
+#: usr/local/www/services_captiveportal_vouchers.php:514
+#: usr/local/www/services_captiveportal_vouchers.php:523
+#: usr/local/www/services_captiveportal_vouchers.php:528
+msgid "Voucher private key"
+msgstr "Chave privada de Voucher"
+
+#: usr/local/www/services_captiveportal_vouchers.php:498
+#: usr/local/www/services_captiveportal_vouchers.php:505
+#: usr/local/www/services_captiveportal_vouchers.php:518
+#: usr/local/www/services_captiveportal_vouchers.php:527
+#: usr/local/www/services_captiveportal_vouchers.php:532
+msgid "Paste an RSA private key (64 Bit or smaller) in PEM format here. This key is only used to generate encrypted vouchers and doesn't need to be available if the vouchers have been generated offline."
+msgstr "Cole uma chave RSA privada (64 Bit ou menor) no formato PEM aqui. Essa chave somente é usada para gerar vouchers criptografados e não precisa estar disponível se os vouchers foram gerados fora do ar."
+
+#: usr/local/www/services_captiveportal_vouchers.php:502
+#: usr/local/www/services_captiveportal_vouchers.php:509
+#: usr/local/www/services_captiveportal_vouchers.php:522
+#: usr/local/www/services_captiveportal_vouchers.php:531
+#: usr/local/www/services_captiveportal_vouchers.php:536
+msgid "Character set"
+msgstr "Conjunto de caracteres"
+
+#: usr/local/www/services_captiveportal_vouchers.php:506
+#: usr/local/www/services_captiveportal_vouchers.php:513
+#: usr/local/www/services_captiveportal_vouchers.php:526
+#: usr/local/www/services_captiveportal_vouchers.php:535
+#: usr/local/www/services_captiveportal_vouchers.php:540
+msgid "Tickets are generated with the specified character set. It should contain printable characters (numbers, lower case and upper case letters) that are hard to confuse with others. Avoid e.g. 0/O and l/1."
+msgstr "Tickets são gerados com um específico conjunto de caracteres. Ele deve conter caracteres passíveis de impressão (números, letras maiúsculas e minúsculas) que são difíceis de serem confundidas com outras. Evite e.g. 0/O e l/1."
+
+#: usr/local/www/services_captiveportal_vouchers.php:510
+#: usr/local/www/services_captiveportal_vouchers.php:517
+#: usr/local/www/services_captiveportal_vouchers.php:530
+#: usr/local/www/services_captiveportal_vouchers.php:539
+#: usr/local/www/services_captiveportal_vouchers.php:544
+msgid "of Roll Bits"
+msgstr "de Bits de Lista"
+
+#: usr/local/www/services_captiveportal_vouchers.php:514
+#: usr/local/www/services_captiveportal_vouchers.php:521
+#: usr/local/www/services_captiveportal_vouchers.php:534
+#: usr/local/www/services_captiveportal_vouchers.php:543
+#: usr/local/www/services_captiveportal_vouchers.php:548
+msgid "Reserves a range in each voucher to store the Roll # it belongs to. Allowed range: 1..31. Sum of Roll+Ticket+Checksum bits must be one Bit less than the RSA key size."
+msgstr "Reserva um intervalo em cada voucher para armazenar o # da Lista que ele pertence. O intervalo permitido: 1..31. Soma dos bits de Lista+Ticket+Checksum deve ser um Bit menor que o tamanho da chave RSA."
+
+#: usr/local/www/services_captiveportal_vouchers.php:518
+#: usr/local/www/services_captiveportal_vouchers.php:525
+#: usr/local/www/services_captiveportal_vouchers.php:538
+#: usr/local/www/services_captiveportal_vouchers.php:547
+#: usr/local/www/services_captiveportal_vouchers.php:552
+msgid "of Ticket Bits"
+msgstr "de Ticket Bits"
+
+#: usr/local/www/services_captiveportal_vouchers.php:522
+#: usr/local/www/services_captiveportal_vouchers.php:529
+#: usr/local/www/services_captiveportal_vouchers.php:542
+#: usr/local/www/services_captiveportal_vouchers.php:551
+#: usr/local/www/services_captiveportal_vouchers.php:556
+msgid "Reserves a range in each voucher to store the Ticket# it belongs to. Allowed range: 1..16. Using 16 bits allows a roll to have up to 65535 vouchers. A bit array, stored in RAM and in the config, is used to mark if a voucher has been used. A bit array for 65535 vouchers requires 8 KB of storage."
+msgstr "Reserva um intervalo em cada voucher para armazenar o # de Ticket ao qual pertence. O intervalo permitido: 1..16. Usando 16 bits permite que uma lista tenha até 65535 vouchers. uma cadeia de bits, armazenada na RAM e na configuração, é usado para marcar se um voucher foi usado. A cadeia de bits para 65535 vouchers requer 8 KB de espaço de armazenamento."
+
+#: usr/local/www/services_captiveportal_vouchers.php:526
+#: usr/local/www/services_captiveportal_vouchers.php:533
+#: usr/local/www/services_captiveportal_vouchers.php:546
+#: usr/local/www/services_captiveportal_vouchers.php:555
+#: usr/local/www/services_captiveportal_vouchers.php:560
+msgid "of Checksum Bits"
+msgstr "de Checksum Bits"
+
+#: usr/local/www/services_captiveportal_vouchers.php:530
+#: usr/local/www/services_captiveportal_vouchers.php:537
+#: usr/local/www/services_captiveportal_vouchers.php:550
+#: usr/local/www/services_captiveportal_vouchers.php:559
+#: usr/local/www/services_captiveportal_vouchers.php:564
+msgid "Reserves a range in each voucher to store a simple checksum over Roll # and Ticket#. Allowed range is 0..31."
+msgstr "Reserva um intervalo em cada voucher para armazenar um checksum simples sobre o # da Lista e # de Ticket. O intervalo válido é 0..31."
+
+#: usr/local/www/services_captiveportal_vouchers.php:534
+#: usr/local/www/services_captiveportal_vouchers.php:541
+#: usr/local/www/services_captiveportal_vouchers.php:554
+#: usr/local/www/services_captiveportal_vouchers.php:563
+#: usr/local/www/services_captiveportal_vouchers.php:568
+msgid "Magic Number"
+msgstr "Número mágico"
+
+#: usr/local/www/services_captiveportal_vouchers.php:538
+#: usr/local/www/services_captiveportal_vouchers.php:545
+#: usr/local/www/services_captiveportal_vouchers.php:558
+#: usr/local/www/services_captiveportal_vouchers.php:567
+#: usr/local/www/services_captiveportal_vouchers.php:572
+msgid "Magic number stored in every voucher. Verified during voucher check. Size depends on how many bits are left by Roll+Ticket+Checksum bits. If all bits are used, no magic number will be used and checked."
+msgstr "Número mágico armazenado em cada voucher. Verificado durante a verificação do voucher. O tamanho depende de quantos bits são deixados pelos bits Lista+Ticket+Checksum. Se todos os bits são usados, nenhum número mágico será usado e verificado."
+
+#: usr/local/www/services_captiveportal_vouchers.php:542
+#: usr/local/www/services_captiveportal_vouchers.php:549
+#: usr/local/www/services_captiveportal_vouchers.php:562
+#: usr/local/www/services_captiveportal_vouchers.php:571
+#: usr/local/www/services_captiveportal_vouchers.php:576
+msgid "Invalid Voucher Message"
+msgstr "Mensagem de Voucher Inválido"
+
+#: usr/local/www/services_captiveportal_vouchers.php:545
+#: usr/local/www/services_captiveportal_vouchers.php:552
+#: usr/local/www/services_captiveportal_vouchers.php:565
+#: usr/local/www/services_captiveportal_vouchers.php:574
+#: usr/local/www/services_captiveportal_vouchers.php:579
+msgid "Error message displayed for invalid vouchers on captive portal error page"
+msgstr "Mensagem de erro exibida para vouchers inválidos na página de erro do portal captive"
+
+#: usr/local/www/services_captiveportal_vouchers.php:549
+#: usr/local/www/services_captiveportal_vouchers.php:556
+#: usr/local/www/services_captiveportal_vouchers.php:569
+#: usr/local/www/services_captiveportal_vouchers.php:578
+#: usr/local/www/services_captiveportal_vouchers.php:583
+msgid "Expired Voucher Message"
+msgstr "Mensagem de Voucher Expirado"
+
+#: usr/local/www/services_captiveportal_vouchers.php:552
+#: usr/local/www/services_captiveportal_vouchers.php:559
+#: usr/local/www/services_captiveportal_vouchers.php:572
+#: usr/local/www/services_captiveportal_vouchers.php:581
+#: usr/local/www/services_captiveportal_vouchers.php:586
+msgid "Error message displayed for expired vouchers on captive portal error page"
+msgstr "Mensagem de erro exibida para vouchers expirados na página de erro do portal captive"
+
+#: usr/local/www/services_captiveportal_vouchers.php:562
+#: usr/local/www/services_captiveportal_vouchers.php:569
+#: usr/local/www/services_captiveportal_vouchers.php:582
+#: usr/local/www/services_captiveportal_vouchers.php:591
+#: usr/local/www/services_captiveportal_vouchers.php:596
+msgid "Voucher database synchronization"
+msgstr "Sincronização de base de dados de Vouchers"
+
+#: usr/local/www/services_captiveportal_vouchers.php:568
+#: usr/local/www/services_captiveportal_vouchers.php:575
+#: usr/local/www/services_captiveportal_vouchers.php:588
+#: usr/local/www/services_captiveportal_vouchers.php:597
+#: usr/local/www/services_captiveportal_vouchers.php:602
+msgid "IP address of master nodes webConfigurator to synchronize voucher database and used vouchers from."
+msgstr "Endereço IP do master nodes webConfigurator para sincronizar base de dados de voucher e vouchers usados."
+
+#: usr/local/www/services_captiveportal_vouchers.php:569
+#: usr/local/www/services_captiveportal_vouchers.php:576
+#: usr/local/www/services_captiveportal_vouchers.php:589
+#: usr/local/www/services_captiveportal_vouchers.php:598
+#: usr/local/www/services_captiveportal_vouchers.php:603
+msgid "NOTE: this should be setup on the slave nodes and not the primary node!"
+msgstr "NOTA: Isso deve ser configurado nos nodes secundarios e não nos primarios!"
+
+#: usr/local/www/services_captiveportal_vouchers.php:573
+#: usr/local/www/services_captiveportal_vouchers.php:580
+#: usr/local/www/services_captiveportal_vouchers.php:593
+#: usr/local/www/services_captiveportal_vouchers.php:602
+#: usr/local/www/services_captiveportal_vouchers.php:607
+msgid "Voucher sync port"
+msgstr "Porta de sincronização do Voucher"
+
+#: usr/local/www/services_captiveportal_vouchers.php:576
+#: usr/local/www/services_captiveportal_vouchers.php:583
+#: usr/local/www/services_captiveportal_vouchers.php:596
+#: usr/local/www/services_captiveportal_vouchers.php:605
+#: usr/local/www/services_captiveportal_vouchers.php:610
+msgid "This is the port of the master voucher nodes webConfigurator. Example: 443"
+msgstr "Essa é a porta do master voucher nodes webConfigurator. Exemplo: 443"
+
+#: usr/local/www/services_captiveportal_vouchers.php:580
+#: usr/local/www/services_captiveportal_vouchers.php:587
+#: usr/local/www/services_captiveportal_vouchers.php:600
+#: usr/local/www/services_captiveportal_vouchers.php:609
+#: usr/local/www/services_captiveportal_vouchers.php:614
+msgid "Voucher sync username"
+msgstr "Nome de usuário de sincronização do Voucher"
+
+#: usr/local/www/services_captiveportal_vouchers.php:583
+#: usr/local/www/services_captiveportal_vouchers.php:590
+#: usr/local/www/services_captiveportal_vouchers.php:603
+#: usr/local/www/services_captiveportal_vouchers.php:612
+#: usr/local/www/services_captiveportal_vouchers.php:617
+msgid "This is the username of the master voucher nodes webConfigurator."
+msgstr "Esse é o nome de usuário do master voucher nodes webConfigurator."
+
+#: usr/local/www/services_captiveportal_vouchers.php:587
+#: usr/local/www/services_captiveportal_vouchers.php:594
+#: usr/local/www/services_captiveportal_vouchers.php:607
+#: usr/local/www/services_captiveportal_vouchers.php:616
+#: usr/local/www/services_captiveportal_vouchers.php:621
+msgid "Voucher sync password"
+msgstr "Senha de sincronização do Voucher"
+
+#: usr/local/www/services_captiveportal_vouchers.php:590
+#: usr/local/www/services_captiveportal_vouchers.php:597
+#: usr/local/www/services_captiveportal_vouchers.php:610
+#: usr/local/www/services_captiveportal_vouchers.php:619
+#: usr/local/www/services_captiveportal_vouchers.php:624
+msgid "This is the password of the master voucher nodes webConfigurator."
+msgstr "Esse é a senha do master voucher nodes webConfigurator."
+
+#: usr/local/www/services_captiveportal_vouchers.php:604
+#: usr/local/www/services_captiveportal_vouchers.php:611
+#: usr/local/www/services_captiveportal_vouchers.php:625
+#: usr/local/www/services_captiveportal_vouchers.php:634
+#: usr/local/www/services_captiveportal_vouchers.php:639
+msgid "Changing any Voucher parameter (apart from managing the list of Rolls) on this page will render existing vouchers useless if they were generated with different settings."
+msgstr "Ao mudar qualquer parâmetro de Voucher (além de gerenciar a lista de Listas) nessa página irá tornar inúteis os vouchers existentes se eles foram gerados com configurações diferentes."
+
+#: usr/local/www/services_captiveportal_vouchers.php:606
+#: usr/local/www/services_captiveportal_vouchers.php:613
+#: usr/local/www/services_captiveportal_vouchers.php:627
+#: usr/local/www/services_captiveportal_vouchers.php:636
+#: usr/local/www/services_captiveportal_vouchers.php:641
+msgid "Specifying the Voucher Database Synchronization options will not record any other value from the other options. They will be retrieved/synced from the master."
+msgstr "Especificando a opção Voucher Database Synchronization não grava qualquer outro valor das demais opções. Eles serão recuperados / sincronizados a partir do master."
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:48
+#: usr/local/www/services_captiveportal_vouchers_edit.php:45
+msgid "Edit Voucher Rolls"
+msgstr "Editar Listad de Voucher"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:101
+#: usr/local/www/services_captiveportal_vouchers_edit.php:99
+#, php-format
+msgid "Roll number %s already exists."
+msgstr "Número de lista %s já existe."
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:107
+#: usr/local/www/services_captiveportal_vouchers_edit.php:105
+#, php-format
+msgid "Roll number must be numeric and less than %s"
+msgstr "Número de lista deve ser numérico e menor que %s"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:110
+#: usr/local/www/services_captiveportal_vouchers_edit.php:108
+#, php-format
+msgid "A roll has at least one voucher and less than %s."
+msgstr "Uma lista tem no mínimo um voucher e menos que %s."
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:113
+#: usr/local/www/services_captiveportal_vouchers_edit.php:111
+msgid "Each voucher must be good for at least 1 minute."
+msgstr "Cada voucher deve ser bom por pelo menos 1 minuto."
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:134
+#: usr/local/www/services_captiveportal_vouchers_edit.php:132
+#, php-format
+msgid "All %1$s vouchers from Roll %2$s marked unused"
+msgstr "Todos %1$s vouchers da Lista %2$s são marcados como não usados"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:177
+#: usr/local/www/services_captiveportal_vouchers_edit.php:175
+msgid "Enter the Roll"
+msgstr "Informe a Lista"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:177
+#: usr/local/www/services_captiveportal_vouchers_edit.php:175
+msgid "found on top of the generated/printed vouchers"
+msgstr "encontrado no topo dos vouchers gerados/impressos"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:181
+#: usr/local/www/services_captiveportal_vouchers_edit.php:179
+msgid "Minutes per Ticket"
+msgstr "Minutos por Ticket"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:185
+#: usr/local/www/services_captiveportal_vouchers_edit.php:183
+msgid "Defines the time in minutes that a user is allowed access. The clock starts ticking the first time a voucher is used for authentication"
+msgstr "Define o tempo em minutos que um usuário tem permissão de acesso. O relógio inicia a contagem a primeira vez que um voucher é usado para autenticação"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:193
+#: usr/local/www/services_captiveportal_vouchers_edit.php:191
+msgid "Enter the number of vouchers"
+msgstr "Informe o número de vouchers"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:193
+#: usr/local/www/services_captiveportal_vouchers_edit.php:191
+msgid "found on top of the generated/printed vouchers. WARNING: Changing this number for an existing Roll will mark all vouchers as unused again"
+msgstr "encontrado no topo de vouchers gerados/impressos. AVISO: Mudando esse número para uma Lista existente irá marcar todos os vouchers como não usados novamente"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:201
+#: usr/local/www/services_captiveportal_vouchers_edit.php:199
+msgid "Can be used to further identify this roll. Ignored by the system"
+msgstr "Pode ser usado para identificação adicional dessa lista. Ignorado pelo sistema"
+
+#: usr/local/www/diag_resetstate.php:54
+msgid "The state table has been flushed successfully."
+msgstr "A tabela de estado foi limpa com sucesso."
+
+#: usr/local/www/diag_resetstate.php:60
+msgid "The source tracking table has been flushed successfully."
+msgstr "A tabela de rastreamento de origem foi limpa com sucesso."
+
+#: usr/local/www/diag_resetstate.php:64
+msgid "Reset state"
+msgstr "Reiniviar estado"
+
+#: usr/local/www/diag_resetstate.php:91
+msgid "Firewall state table"
+msgstr "Tabela de conexões do firewall"
+
+#: usr/local/www/diag_resetstate.php:93
+msgid "Resetting the state tables will remove all entries from the corresponding tables. This means that all open connections will be broken and will have to be re-established. This may be necessary after making substantial changes to the firewall and/or NAT rules, especially if there are IP protocol mappings (e.g. for PPTP or IPv6) with open connections."
+msgstr "Reiniciando as conexões da tabela irá remover todas as entradas correspondentes das tabelas. Isto significa que todas as conexões em aberto serão fechadas e serão reestabelecidas. Isto pode ser necessário após mudanças consideráveis ao firewall e/ou regras de NAT, especialmente se há mapeamentos do protocolo IP (e.g. PPTP ou IPv6) com conexões abertas."
+
+#: usr/local/www/diag_resetstate.php:100
+msgid "The firewall will normally leave the state tables intact when changing rules."
+msgstr "O firewall normalmente deixará a tabela de conexões intacta quando as regras mudarem."
+
+#: usr/local/www/diag_resetstate.php:103
+msgid "NOTE: If you reset the firewall state table, the browser session may appear to be hung after clicking &quot;Reset&quot;. Simply refresh the page to continue."
+msgstr "NOTA: Se você reiniciar a tabela de estado do firewall, a sessão do browser pode parecer expirada após clicar em &quot;Reiniciar&quot;. Simplemente atualize a página para continuar."
+
+#: usr/local/www/diag_resetstate.php:113
+msgid "Firewall Source Tracking"
+msgstr "Rastreamento de origem do Firewall"
+
+#: usr/local/www/diag_resetstate.php:115
+msgid "Resetting the source tracking table will remove all source/destination associations. This means that the \"sticky\" source/destination association will be cleared for all clients."
+msgstr "Reiniciar a tabela de rastreamento de origem irá remover todas as associações de origem/destino. Isto significa que as associações persistentes serão limpas para todos os clientes."
+
+#: usr/local/www/diag_resetstate.php:119
+msgid "This does not clear active connection states, only source tracking."
+msgstr "Isto não limpa estados de conexões ativas, apenas o rastreamento de origem."
+
+#: usr/local/www/diag_resetstate.php:127 usr/local/www/status_lb_pool.php:218
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: usr/local/www/status_filter_reload.php:44
+msgid "Filter Reload Status"
+msgstr "Status do Filtro"
+
+#: usr/local/www/status_filter_reload.php:88
+#: usr/local/www/status_filter_reload.php:89
+msgid "This page will automatically refresh every 3 seconds until the filter is done reloading"
+msgstr "Essa página irá atualizar-se automaticamente a cada 3 segundos até que o filtro tenha recarregado"
+
+#: usr/local/www/diag_routes.php:45
+msgid "Routing tables"
+msgstr "Tabela de roteamento"
+
+#: usr/local/www/diag_routes.php:58 usr/local/www/diag_routes.php:59
+msgid "Name resolution"
+msgstr "Resolução de nomes"
+
+#: usr/local/www/diag_routes.php:62 usr/local/www/diag_routes.php:63
+msgid "Enable this to attempt to resolve names when displaying the tables."
+msgstr "Habilitar isto para tentar resolver nomes quando visualizar a tabela de estados."
+
+#: usr/local/www/diag_routes.php:69 usr/local/www/diag_routes.php:70
+msgid "Show"
+msgstr "Mostrar"
+
+#: usr/local/www/diag_routes.php:72
+msgid "By enabling name resolution, the query should take a bit longer. You can stop it at any time by clicking the Stop button in your browser"
+msgstr "Ao permitir a resolução de nomes, a consulta deve demorar um pouco. Você pode parar a qualquer momento, clicando no botão Pare no seu navegador"
+
+#: usr/local/www/diag_traceroute.php:62 usr/local/www/diag_traceroute.php:63
+msgid "ttl"
+msgstr "ttl"
+
+#: usr/local/www/diag_traceroute.php:66 usr/local/www/diag_traceroute.php:67
+#, php-format
+msgid "Maximum number of hops must be between 1 and %s"
+msgstr "Número máximo de saltos deve estar entre 1 e %s"
+
+#: usr/local/www/diag_traceroute.php:94 usr/local/www/diag_traceroute.php:112
+#: usr/local/www/diag_traceroute.php:131
+msgid "Maximum number of hops"
+msgstr "Número máximo de saltos"
+
+#: usr/local/www/diag_traceroute.php:104 usr/local/www/diag_traceroute.php:128
+#: usr/local/www/diag_traceroute.php:147
+msgid "Use ICMP"
+msgstr "Usar ICMP"
+
+#: usr/local/www/diag_traceroute.php:117 usr/local/www/diag_traceroute.php:141
+#: usr/local/www/diag_traceroute.php:162
+msgid "Traceroute may take a while to complete. You may hit the Stop button on your browser at any time to see the progress of failed traceroutes."
+msgstr "Traceroute pode demorar um pouco para ser concluído. Você pode pressionar o botão de parada em seu navegador a qualquer hora para ver o andamento das falhas dos traceroutes."
+
+#: usr/local/www/diag_traceroute.php:120 usr/local/www/diag_traceroute.php:144
+#: usr/local/www/diag_traceroute.php:173
+msgid "Traceroute output:"
+msgstr "Saída de traceroute:"
+
+#: usr/local/www/diag_traceroute.php:137
+msgid "Multi-wan is not supported from this utility currently."
+msgstr "Este utilitário não suporta Multi-wan atualmente."
+
+#: usr/local/www/status_graph.php:85 usr/local/www/fbegin.inc:173
+#: usr/local/www/fbegin.inc:191 usr/local/www/fbegin.inc:199
+#: usr/local/www/status_graph.php:90 usr/local/www/status_graph.php:101
+#: usr/local/www/fbegin.inc:190 usr/local/www/status_graph.php:111
+msgid "Traffic Graph"
+msgstr "Gráfico de tráfego"
+
+#: usr/local/www/status_graph.php:197
+msgid "Your browser does not support the type SVG! You need to either use Firefox or download the Adobe SVG plugin"
+msgstr "Seu browser não suporta o tipo SVG! Você precisa usar o Firefox ou fazer download do plugin do Adobe SVG"
+
+#: usr/local/www/status_graph.php:203 usr/local/www/status_graph.php:198
+#: usr/local/www/status_graph.php:209 usr/local/www/status_graph.php:220
+#: usr/local/www/status_graph.php:242
+msgid "Host IP"
+msgstr "IP do Host"
+
+#: usr/local/www/status_graph.php:204 usr/local/www/status_graph.php:199
+#: usr/local/www/status_graph.php:210 usr/local/www/status_graph.php:221
+#: usr/local/www/status_graph.php:243
+msgid "Bandwidth In"
+msgstr "Tamanho de banda de entrada"
+
+#: usr/local/www/status_graph.php:205 usr/local/www/status_graph.php:200
+#: usr/local/www/status_graph.php:211 usr/local/www/status_graph.php:222
+#: usr/local/www/status_graph.php:244
+msgid "Bandwidth Out"
+msgstr "Tamanho de banda de saída"
+
+#: usr/local/www/status_graph.php:291 usr/local/www/status_graph.php:286
+#: usr/local/www/status_graph.php:297 usr/local/www/status_graph.php:308
+#: usr/local/www/status_graph.php:330
+msgid "the"
+msgstr "o"
+
+#: usr/local/www/status_graph.php:291 usr/local/www/status_graph.php:286
+#: usr/local/www/status_graph.php:297 usr/local/www/status_graph.php:308
+#: usr/local/www/status_graph.php:330
+msgid "Adobe SVG Viewer"
+msgstr "Visualizador Adobe SVG"
+
+#: usr/local/www/status_graph.php:291 usr/local/www/status_graph.php:286
+#: usr/local/www/status_graph.php:297 usr/local/www/status_graph.php:308
+#: usr/local/www/status_graph.php:330
+msgid "Firefox 1.5 or later or other browser supporting SVG is required to view the graph"
+msgstr "Firefox 1.5 ou versão mais recente ou outro browser que suporte SVG é requerido para visualizar o gráfico"
+
+#: usr/local/www/carp_status.php:71 usr/local/www/carp_status.php:67
+#, php-format
+msgid "%s IPs have been disabled. Please note that disabling does not survive a reboot and some configuration changes will re-enable."
+msgstr "%s IPs foram desabilitados. Por favor, estas alterações não estarão disponíveis no próximo boot."
+
+#: usr/local/www/carp_status.php:73 usr/local/www/carp_status.php:69
+msgid "CARP has been enabled."
+msgstr "CARP foi habilitado."
+
+#: usr/local/www/carp_status.php:127 usr/local/www/carp_status.php:120
+msgid "Enable Carp"
+msgstr "Habilitar CARP"
+
+#: usr/local/www/carp_status.php:130 usr/local/www/carp_status.php:123
+msgid "Disable Carp"
+msgstr "Desabilitar CARP"
+
+#: usr/local/www/carp_status.php:138 usr/local/www/carp_status.php:131
+msgid "CARP Interface"
+msgstr "Interface CARP"
+
+#: usr/local/www/carp_status.php:144 usr/local/www/carp_status.php:137
+msgid "Could not locate any defined CARP interfaces."
+msgstr "Não foi possível localizar interfaces CARP definidas."
+
+#: usr/local/www/carp_status.php:196
+msgid "You can configure CARP settings"
+msgstr "Você pode definir as configurações CARP"
+
+#: usr/local/www/carp_status.php:202 usr/local/www/carp_status.php:195
+msgid "pfSync nodes"
+msgstr "Nós pfSync"
+
+#: usr/local/www/status_interfaces.php:81
+#: usr/local/www/status_interfaces.php:84
+msgid "interface"
+msgstr "interface"
+
+#: usr/local/www/status_interfaces.php:99
+#: usr/local/www/status_interfaces.php:117
+#: usr/local/www/status_interfaces.php:102
+#: usr/local/www/status_interfaces.php:120
+msgid "Release"
+msgstr "Lançamento"
+
+#: usr/local/www/status_interfaces.php:102
+#: usr/local/www/status_interfaces.php:120
+#: usr/local/www/status_interfaces.php:105
+#: usr/local/www/status_interfaces.php:123
+msgid "Renew"
+msgstr "Renovar"
+
+#: usr/local/www/status_interfaces.php:117
+#: usr/local/www/status_interfaces.php:132
+#: usr/local/www/status_interfaces.php:147
+#: usr/local/www/status_interfaces.php:163
+#: usr/local/www/status_interfaces.php:135
+#: usr/local/www/status_interfaces.php:150
+#: usr/local/www/status_interfaces.php:165
+#: usr/local/www/status_interfaces.php:181
+#: usr/local/www/status_interfaces.php:138
+#: usr/local/www/status_interfaces.php:153
+#: usr/local/www/status_interfaces.php:168
+#: usr/local/www/status_interfaces.php:184
+msgid "Connect"
+msgstr "Conectar"
+
+#: usr/local/www/status_interfaces.php:171
+#: usr/local/www/status_interfaces.php:189
+#: usr/local/www/status_interfaces.php:192
+msgid "Uptime "
+msgstr "Uptime"
+
+#: usr/local/www/status_interfaces.php:200
+#: usr/local/www/status_interfaces.php:274
+#: usr/local/www/status_interfaces.php:277
+msgid "Subnet mask IPv4"
+msgstr "Máscara de Subrede IPv4"
+
+#: usr/local/www/status_interfaces.php:207
+#: usr/local/www/status_interfaces.php:281
+#: usr/local/www/status_interfaces.php:284
+msgid "Gateway IPv4"
+msgstr "Gateway IPv4"
+
+#: usr/local/www/status_interfaces.php:224
+#: usr/local/www/status_interfaces.php:305
+#: usr/local/www/status_interfaces.php:308
+msgid "Subnet mask IPv6"
+msgstr "Máscara de Subrede IPv6"
+
+#: usr/local/www/status_interfaces.php:239
+#: usr/local/www/status_interfaces.php:320
+#: usr/local/www/status_interfaces.php:323
+msgid "ISP DNS servers"
+msgstr "Servidores DNS ISP"
+
+#: usr/local/www/status_interfaces.php:251
+#: usr/local/www/status_interfaces.php:332
+#: usr/local/www/status_interfaces.php:335
+msgid "Media"
+msgstr "Media"
+
+#: usr/local/www/status_interfaces.php:272
+#: usr/local/www/status_interfaces.php:369
+#: usr/local/www/status_interfaces.php:372
+msgid "BSSID"
+msgstr "BSSID"
+
+#: usr/local/www/status_interfaces.php:279
+#: usr/local/www/diag_dump_states_sources.php:148
+#: usr/local/www/status_interfaces.php:376
+#: usr/local/www/status_interfaces.php:379
+#: usr/local/www/diag_dump_states_sources.php:147
+#: usr/local/www/diag_system_pftop.php:158
+msgid "Rate"
+msgstr "Taxa"
+
+#: usr/local/www/status_interfaces.php:286
+#: usr/local/www/status_interfaces.php:383
+#: usr/local/www/status_interfaces.php:386
+msgid "RSSI"
+msgstr "RSSI"
+
+#: usr/local/www/status_interfaces.php:293
+#: usr/local/www/status_interfaces.php:390
+#: usr/local/www/status_interfaces.php:393
+msgid "In/out packets"
+msgstr "Pacotes de entrada/saída"
+
+#: usr/local/www/status_interfaces.php:302
+#: usr/local/www/status_interfaces.php:399
+#: usr/local/www/status_interfaces.php:402
+msgid "In/out packets (pass)"
+msgstr "Pacotes de entrada/saída (liberados)"
+
+#: usr/local/www/status_interfaces.php:311
+#: usr/local/www/status_interfaces.php:408
+#: usr/local/www/status_interfaces.php:411
+msgid "In/out packets (block)"
+msgstr "Pacotes de entrada/saída (bloqueados)"
+
+#: usr/local/www/status_interfaces.php:321
+#: usr/local/www/status_interfaces.php:418
+#: usr/local/www/status_interfaces.php:421
+msgid "In/out errors"
+msgstr "Erros de entrada/saída "
+
+#: usr/local/www/status_interfaces.php:329
+#: usr/local/www/status_interfaces.php:426
+#: usr/local/www/status_interfaces.php:429
+msgid "Collisions"
+msgstr "Colisões"
+
+#: usr/local/www/status_interfaces.php:338
+#: usr/local/www/status_interfaces.php:435
+#: usr/local/www/status_interfaces.php:438
+#, php-format
+msgid "Bridge (%s)"
+msgstr "Ponte (%s)"
+
+#: usr/local/www/status_interfaces.php:360
+#: usr/local/www/status_interfaces.php:457
+#: usr/local/www/status_interfaces.php:460
+msgid "Interrupts/Second"
+msgstr "Interrupções/Segundo"
+
+#: usr/local/www/status_interfaces.php:363
+#: usr/local/www/status_interfaces.php:460
+#: usr/local/www/status_interfaces.php:463
+msgid "total"
+msgstr "total"
+
+#: usr/local/www/status_interfaces.php:376
+#: usr/local/www/status_interfaces.php:473
+#: usr/local/www/status_interfaces.php:476
+#, php-format
+msgid "Using dial-on-demand will bring the connection up again if any packet triggers it. To substantiate this point: disconnecting manually will %snot%s prevent dial-on-demand from making connections to the outside! Don't use dial-on-demand if you want to make sure that the line is kept disconnected."
+msgstr "Usar a discagem sob demanda irá levantar a conexão novamente se algum pacote a engatilhar. Para fundamentar esse ponto: desconectar manualmente %snão%s irá prevenir discagem sob demanda de fazer conexões externas! Não use discagem sob demanda se quiser ter certeza de que a linha se manterá desconectada."
+
+#: usr/local/www/exec.php:91 usr/local/www/exec.php:93
+msgid "Execute command"
+msgstr "Executar comando"
+
+#: usr/local/www/exec.php:153 usr/local/www/exec.php:155
+msgid "Nothing to recall"
+msgstr "Nada para lembrar"
+
+#: usr/local/www/exec.php:222 usr/local/www/exec.php:224
+msgid "Note: this function is unsupported. Use it on your own risk"
+msgstr "Nota: Esta função não é suportada. Use-a sob seu próprio risco"
+
+#: usr/local/www/exec.php:253 usr/local/www/exec.php:255
+msgid "Execute Shell command"
+msgstr "Executar comando Shell"
+
+#: usr/local/www/exec.php:256 usr/local/www/exec.php:309
+#: usr/local/www/exec.php:258 usr/local/www/exec.php:311
+msgid "Command"
+msgstr "Comando"
+
+#: usr/local/www/exec.php:264 usr/local/www/exec.php:315
+#: usr/local/www/exec.php:266 usr/local/www/exec.php:317
+msgid "Execute"
+msgstr "Executar"
+
+#: usr/local/www/exec.php:266 usr/local/www/status_upnp.php:77
+#: usr/local/www/exec.php:268 usr/local/www/status_upnp.php:78
+msgid "Clear"
+msgstr "Limpar"
+
+#: usr/local/www/exec.php:276 usr/local/www/exec.php:278
+msgid "File to download"
+msgstr "Arquivo para download"
+
+#: usr/local/www/exec.php:293 usr/local/www/exec.php:295
+msgid "File to upload"
+msgstr "Arquivo para carregar"
+
+#: usr/local/www/exec.php:306 usr/local/www/exec.php:308
+msgid "PHP Execute"
+msgstr "Executar PHP"
+
+#: usr/local/www/exec.php:317 usr/local/www/exec.php:319
+msgid "Example"
+msgstr "Exemplo"
+
+#: usr/local/www/exec_raw.php:47
+msgid "Nothing specified. Cannot continue."
+msgstr "Nada especificado. Não pode continuar."
+
+#: usr/local/www/fbegin.inc:88 usr/local/www/fbegin.inc:105
+#: usr/local/www/fbegin.inc:114 usr/local/www/fbegin.inc:106
+msgid "Packages"
+msgstr "Pacotes"
+
+#: usr/local/www/fbegin.inc:89 usr/local/www/fbegin.inc:106
+#: usr/local/www/fbegin.inc:115 usr/local/www/fbegin.inc:107
+msgid "Setup Wizard"
+msgstr "Wizard Config"
+
+#: usr/local/www/fbegin.inc:90 usr/local/www/diag_logs_routing.php:54
+#: usr/local/www/diag_logs_routing.php:84 usr/local/www/fbegin.inc:107
+#: usr/local/www/diag_logs_resolver.php:98 usr/local/www/diag_logs.php:97
+#: usr/local/www/diag_logs_wireless.php:86
+#: usr/local/www/diag_logs_gateways.php:98
+#: usr/local/www/diag_logs_routing.php:85 usr/local/www/fbegin.inc:116
+#: usr/local/www/diag_logs_resolver.php:99
+#: usr/local/www/diag_logs_wireless.php:87
+#: usr/local/www/diag_logs_gateways.php:99 usr/local/www/fbegin.inc:108
+msgid "Routing"
+msgstr "Roteamento"
+
+#: usr/local/www/fbegin.inc:91 usr/local/www/fbegin.inc:108
+#: usr/local/www/fbegin.inc:117 usr/local/www/fbegin.inc:109
+msgid "Cert Manager"
+msgstr "Ger. de certificados"
+
+#: usr/local/www/fbegin.inc:123 usr/local/www/services_dhcpv6_relay.php:101
+#: usr/local/www/fbegin.inc:140 usr/local/www/fbegin.inc:149
+#: usr/local/www/fbegin.inc:141 etc/inc/service-utils.inc:296
+msgid "DHCPv6 Relay"
+msgstr "DHCPv6 Relay"
+
+#: usr/local/www/fbegin.inc:126 usr/local/www/fbegin.inc:143
+#: usr/local/www/services_dhcpv6.php:581
+#: usr/local/www/services_router_advertisements.php:260
+#: usr/local/www/services_dhcpv6.php:502 usr/local/www/services_dhcpv6.php:512
+#: usr/local/www/services_dhcpv6.php:513 usr/local/www/services_dhcpv6.php:523
+#: usr/local/www/services_router_advertisements.php:255
+#: usr/local/www/diag_backup.php:185
+msgid "DHCPv6 Server"
+msgstr "Servidor DHCPv6"
+
+#: usr/local/www/fbegin.inc:129 usr/local/www/status_services.php:316
+#: usr/local/www/widgets/widgets/services_status.widget.php:121
+#: usr/local/www/fbegin.inc:146 etc/inc/service-utils.inc:299
+#: usr/local/www/fbegin.inc:155 usr/local/www/fbegin.inc:147
+#: etc/inc/service-utils.inc:298 etc/inc/service-utils.inc:315
+#: etc/inc/service-utils.inc:317
+msgid "IGMP proxy"
+msgstr "Proxy IGMP"
+
+#: usr/local/www/fbegin.inc:131 usr/local/www/fbegin.inc:149
+msgid "OLSR"
+msgstr "OLSR"
+
+#: usr/local/www/fbegin.inc:132 usr/local/www/vpn_pppoe_edit.php:234
+#: usr/local/www/fbegin.inc:150 usr/local/www/fbegin.inc:158
+#: usr/local/www/vpn_pppoe_edit.php:237
+msgid "PPPoE Server"
+msgstr "Servidor PPPoE"
+
+#: usr/local/www/fbegin.inc:133 usr/local/www/fbegin.inc:151
+#: usr/local/www/fbegin.inc:159
+msgid "RIP"
+msgstr "RIP"
+
+#: usr/local/www/fbegin.inc:139 usr/local/www/fbegin.inc:175
+#: usr/local/www/fbegin.inc:157 usr/local/www/fbegin.inc:193
+#: usr/local/www/fbegin.inc:165 usr/local/www/fbegin.inc:201
+#: usr/local/www/fbegin.inc:156 usr/local/www/fbegin.inc:192
+msgid "UPnP &amp; NAT-PMP"
+msgstr "UPnP &amp; NAT-PMP"
+
+#: usr/local/www/fbegin.inc:157 usr/local/www/fbegin.inc:174
+#: usr/local/www/fbegin.inc:182 usr/local/www/fbegin.inc:173
+msgid "CARP (failover)"
+msgstr "CARP (failover)"
+
+#: usr/local/www/fbegin.inc:158 usr/local/www/fbegin.inc:175
+#: usr/local/www/fbegin.inc:183 usr/local/www/fbegin.inc:174
+msgid "Dashboard"
+msgstr "Dashboard"
+
+#: usr/local/www/fbegin.inc:160 usr/local/www/fbegin.inc:177
+#: usr/local/www/fbegin.inc:185 usr/local/www/fbegin.inc:176
+msgid "DHCP Leases"
+msgstr "Concessões DHCP"
+
+#: usr/local/www/fbegin.inc:161 usr/local/www/fbegin.inc:178
+#: usr/local/www/fbegin.inc:186 usr/local/www/fbegin.inc:177
+msgid "DHCPv6 Leases"
+msgstr "Concessões DHCPv6"
+
+#: usr/local/www/fbegin.inc:162 usr/local/www/fbegin.inc:179
+#: usr/local/www/fbegin.inc:187 usr/local/www/fbegin.inc:178
+msgid "Filter Reload"
+msgstr "Recarregar Filtro"
+
+#: usr/local/www/fbegin.inc:168 usr/local/www/fbegin.inc:186
+#: usr/local/www/fbegin.inc:194 usr/local/www/fbegin.inc:185
+msgid "Package Logs"
+msgstr "Logs de pacotes"
+
+#: usr/local/www/fbegin.inc:169 usr/local/www/status_queues.php:98
+#: usr/local/www/status_rrd_graph.php:338
+#: usr/local/www/status_rrd_graph_settings.php:57
+#: usr/local/www/status_rrd_graph_settings.php:137
+#: usr/local/www/fbegin.inc:187
+#: usr/local/www/status_rrd_graph_settings.php:138
+#: usr/local/www/status_queues.php:101 usr/local/www/status_rrd_graph.php:386
+#: usr/local/www/fbegin.inc:195 usr/local/www/status_rrd_graph.php:411
+#: usr/local/www/status_queues.php:109 usr/local/www/fbegin.inc:186
+#: usr/local/www/status_queues.php:123
+msgid "Queues"
+msgstr "Filas"
+
+#: usr/local/www/fbegin.inc:170 usr/local/www/status_rrd_graph.php:224
+#: usr/local/www/status_rrd_graph_img.php:41
+#: usr/local/www/status_rrd_graph_settings.php:113
+#: usr/local/www/status_rrd_graph_settings.php:171
+#: usr/local/www/fbegin.inc:188
+#: usr/local/www/status_rrd_graph_settings.php:114
+#: usr/local/www/status_rrd_graph_settings.php:172
+#: usr/local/www/status_rrd_graph.php:244 usr/local/www/fbegin.inc:196
+#: usr/local/www/status_rrd_graph_img.php:43
+#: usr/local/www/status_rrd_graph.php:248 usr/local/www/fbegin.inc:187
+msgid "RRD Graphs"
+msgstr "Gráficos RRD"
+
+#: usr/local/www/fbegin.inc:172 usr/local/www/fbegin.inc:190
+#: usr/local/www/fbegin.inc:198 usr/local/www/fbegin.inc:189
+msgid "System Logs"
+msgstr "Logs do sistema"
+
+#: usr/local/www/fbegin.inc:188
+msgid "ARP Tables"
+msgstr "Tabela ARP"
+
+#: usr/local/www/fbegin.inc:191 usr/local/www/fbegin.inc:209
+#: usr/local/www/fbegin.inc:217 usr/local/www/fbegin.inc:208
+msgid "Command Prompt"
+msgstr "Prompt de Comando"
+
+#: usr/local/www/fbegin.inc:193 usr/local/www/fbegin.inc:211
+#: usr/local/www/fbegin.inc:219 usr/local/www/fbegin.inc:210
+msgid "Edit File"
+msgstr "Editar arquivo"
+
+#: usr/local/www/fbegin.inc:194 usr/local/www/fbegin.inc:212
+#: usr/local/www/fbegin.inc:220 usr/local/www/fbegin.inc:211
+msgid "Factory Defaults"
+msgstr "Padrão de fábrica"
+
+#: usr/local/www/fbegin.inc:195 usr/local/www/fbegin.inc:213
+#: usr/local/www/fbegin.inc:221 usr/local/www/fbegin.inc:212
+msgid "Halt System"
+msgstr "Desligar sistema"
+
+#: usr/local/www/fbegin.inc:196 usr/local/www/fbegin.inc:214
+#: usr/local/www/fbegin.inc:222 usr/local/www/fbegin.inc:213
+msgid "Limiter Info"
+msgstr "Limitador"
+
+#: usr/local/www/fbegin.inc:197 usr/local/www/diag_ndp.php:103
+#: usr/local/www/fbegin.inc:215 usr/local/www/fbegin.inc:223
+#: usr/local/www/fbegin.inc:214
+msgid "NDP Table"
+msgstr "Tabela NDP"
+
+#: usr/local/www/fbegin.inc:201 usr/local/www/fbegin.inc:219
+#: usr/local/www/fbegin.inc:227
+msgid "pfInfo"
+msgstr "pfInfo"
+
+#: usr/local/www/fbegin.inc:202 usr/local/www/fbegin.inc:220
+#: usr/local/www/fbegin.inc:228
+msgid "pfTop"
+msgstr "pfTop"
+
+#: usr/local/www/fbegin.inc:203 usr/local/www/fbegin.inc:221
+#: usr/local/www/fbegin.inc:229
+msgid "Reboot"
+msgstr "Reiniciar"
+
+#: usr/local/www/fbegin.inc:205 usr/local/www/fbegin.inc:223
+#: usr/local/www/widgets/widgets/smart_status.widget.php:38
+#: usr/local/www/fbegin.inc:231
+#: usr/local/www/widgets/widgets/smart_status.widget.php:39
+msgid "SMART Status"
+msgstr "Status SMART"
+
+#: usr/local/www/fbegin.inc:207 usr/local/www/fbegin.inc:225
+#: usr/local/www/fbegin.inc:234 usr/local/www/fbegin.inc:226
+msgid "States Summary"
+msgstr "Resumo da Tabela de Estados"
+
+#: usr/local/www/fbegin.inc:208 usr/local/www/fbegin.inc:226
+#: usr/local/www/fbegin.inc:235 usr/local/www/fbegin.inc:227
+msgid "System Activity"
+msgstr "Atividades do Sistema"
+
+#: usr/local/www/fbegin.inc:216 usr/local/www/fbegin.inc:233
+#: usr/local/www/fbegin.inc:242 usr/local/www/fbegin.inc:234
+msgid "Restart HTTPD"
+msgstr "Reiniciar HTTPD"
+
+#: usr/local/www/fbegin.inc:222 usr/local/www/fbegin.inc:240
+#: usr/local/www/fbegin.inc:249 usr/local/www/fbegin.inc:241
+msgid "About this Page"
+msgstr "Sobre esta página"
+
+#: usr/local/www/fbegin.inc:224 usr/local/www/fbegin.inc:242
+#: usr/local/www/fbegin.inc:251 usr/local/www/fbegin.inc:243
+msgid "Bug Database"
+msgstr "Banco de Dados de Bugs"
+
+#: usr/local/www/fbegin.inc:225 usr/local/www/fbegin.inc:243
+#: usr/local/www/fbegin.inc:252 usr/local/www/fbegin.inc:244
+msgid "User Forum"
+msgstr "Fórum Usuário"
+
+#: usr/local/www/fbegin.inc:226 usr/local/www/fbegin.inc:244
+#: usr/local/www/fbegin.inc:253 usr/local/www/fbegin.inc:245
+msgid "Documentation"
+msgstr "Documentação"
+
+#: usr/local/www/fbegin.inc:227 usr/local/www/fbegin.inc:245
+#: usr/local/www/fbegin.inc:254 usr/local/www/fbegin.inc:246
+msgid "Developers Wiki"
+msgstr "Wiki de desenvolvedores"
+
+#: usr/local/www/fbegin.inc:228 usr/local/www/fbegin.inc:246
+#: usr/local/www/fbegin.inc:255 usr/local/www/fbegin.inc:247
+msgid "Paid Support"
+msgstr "Suporte à pagamentos"
+
+#: usr/local/www/fbegin.inc:229 usr/local/www/fbegin.inc:247
+#: usr/local/www/fbegin.inc:256 usr/local/www/fbegin.inc:248
+msgid "pfSense Book"
+msgstr "Livro pfSense"
+
+#: usr/local/www/fbegin.inc:230 usr/local/www/fbegin.inc:248
+#: usr/local/www/fbegin.inc:257 usr/local/www/fbegin.inc:249
+msgid "Search portal"
+msgstr "Portal fonte"
+
+#: usr/local/www/fbegin.inc:231 usr/local/www/fbegin.inc:249
+#: usr/local/www/fbegin.inc:258 usr/local/www/fbegin.inc:250
+msgid "FreeBSD Handbook"
+msgstr "FreeBSD Handbook"
+
+#: usr/local/www/fbegin.inc:376 usr/local/www/fbegin.inc:394
+#: usr/local/www/fbegin.inc:340 usr/local/www/fbegin.inc:332
+msgid "Help"
+msgstr "Ajuda"
+
+#: usr/local/www/fbegin.inc:425 usr/local/www/fbegin.inc:443
+msgid "Status of items on this page."
+msgstr "Status dos itens nesta página."
+
+#: usr/local/www/fbegin.inc:428 usr/local/www/fbegin.inc:446
+msgid "Log entries for items on this page."
+msgstr "Entradas de log para itens nesta página."
+
+#: usr/local/www/fbegin.inc:431 usr/local/www/fbegin.inc:449
+msgid "Help for items on this page."
+msgstr "Ajuda para os itens nesta página."
+
+#: usr/local/www/fbegin.inc:441 usr/local/www/fbegin.inc:459
+#: usr/local/www/fbegin.inc:429 usr/local/www/fbegin.inc:421
+msgid "Packages are currently being reinstalled in the background.<p>Do not make changes in the GUI until this is complete."
+msgstr "Pacotes estão sendo reinstalados em background atualmente.<p>Não faça alterações na interface Web até que isto esteja completo."
+
+#: usr/local/www/status_queues.php:98 usr/local/www/status_queues.php:101
+#: usr/local/www/status_queues.php:109 usr/local/www/status_queues.php:123
+msgid "Traffic shaper"
+msgstr "Traffic shaper"
+
+#: usr/local/www/status_queues.php:107 usr/local/www/status_queues.php:110
+#: usr/local/www/status_queues.php:111 usr/local/www/status_queues.php:117
+#: usr/local/www/status_queues.php:131
+msgid "Traffic shaping is not configured."
+msgstr "Modelagem de tráfego não está configurado."
+
+#: usr/local/www/status_queues.php:136 usr/local/www/status_queues.php:143
+#: usr/local/www/status_queues.php:144 usr/local/www/status_queues.php:149
+#: usr/local/www/status_queues.php:166
+msgid "Statistics"
+msgstr "Estatísticas"
+
+#: usr/local/www/status_queues.php:158 usr/local/www/status_queues.php:165
+#: usr/local/www/status_queues.php:166 usr/local/www/status_queues.php:223
+#: usr/local/www/status_queues.php:224 usr/local/www/status_queues.php:246
+msgid "Loading"
+msgstr "Carregando"
+
+#: usr/local/www/status_queues.php:173 usr/local/www/status_queues.php:181
+#: usr/local/www/status_queues.php:182 usr/local/www/status_queues.php:164
+#: usr/local/www/status_queues.php:186
+msgid "Queue graphs take 5 seconds to sample data"
+msgstr "Gráficos de filas levam 5 segundos para gerar dados de amostra"
+
+#: usr/local/www/status_queues.php:174 usr/local/www/status_queues.php:182
+#: usr/local/www/status_queues.php:183 usr/local/www/status_queues.php:165
+#: usr/local/www/status_queues.php:187
+msgid "You can configure the Traffic Shaper"
+msgstr "Você pode configurar o Traffic Shaper"
+
+#: usr/local/www/status_rrd_graph.php:211
+#: usr/local/www/status_rrd_graph_settings.php:59
+#: usr/local/www/status_rrd_graph.php:174
+#: usr/local/www/status_rrd_graph.php:179
+msgid "Inverse"
+msgstr "Inverso"
+
+#: usr/local/www/status_rrd_graph.php:212
+#: usr/local/www/status_rrd_graph_settings.php:60
+#: usr/local/www/status_rrd_graph.php:175
+#: usr/local/www/status_rrd_graph.php:180
+msgid "Absolute"
+msgstr "Absoluto"
+
+#: usr/local/www/status_rrd_graph.php:214
+#: usr/local/www/status_rrd_graph_settings.php:61
+#: usr/local/www/status_rrd_graph.php:234
+#: usr/local/www/status_rrd_graph.php:238
+msgid "Absolute Timespans"
+msgstr "Timespans absolutos"
+
+#: usr/local/www/status_rrd_graph.php:214
+#: usr/local/www/status_rrd_graph_settings.php:62
+#: usr/local/www/status_rrd_graph.php:234
+#: usr/local/www/status_rrd_graph.php:238
+msgid "Current Period"
+msgstr "Período atual"
+
+#: usr/local/www/status_rrd_graph.php:214
+#: usr/local/www/status_rrd_graph_settings.php:63
+#: usr/local/www/status_rrd_graph.php:234
+#: usr/local/www/status_rrd_graph.php:238
+msgid "Previous Period"
+msgstr "Período anterior"
+
+#: usr/local/www/status_rrd_graph.php:331
+#: usr/local/www/status_rrd_graph_settings.php:54
+#: usr/local/www/status_rrd_graph_settings.php:130
+#: usr/local/www/status_rrd_graph_settings.php:131
+#: usr/local/www/status_rrd_graph.php:379
+#: usr/local/www/status_rrd_graph.php:404
+msgid "Traffic"
+msgstr "Tráfego"
+
+#: usr/local/www/status_rrd_graph.php:333
+#: usr/local/www/status_rrd_graph_settings.php:55
+#: usr/local/www/status_rrd_graph_settings.php:132
+#: usr/local/www/status_rrd_graph_settings.php:133
+#: usr/local/www/status_rrd_graph.php:381
+#: usr/local/www/status_rrd_graph.php:406
+msgid "Packets"
+msgstr "Pacotes"
+
+#: usr/local/www/status_rrd_graph.php:335
+#: usr/local/www/status_rrd_graph_settings.php:56
+#: usr/local/www/status_rrd_graph_settings.php:134
+#: usr/local/www/status_rrd_graph_settings.php:135
+#: usr/local/www/status_rrd_graph.php:383
+#: usr/local/www/status_rrd_graph.php:408
+msgid "Quality"
+msgstr "Qualidade"
+
+#: usr/local/www/status_rrd_graph.php:340
+#: usr/local/www/status_rrd_graph_settings.php:139
+#: usr/local/www/status_rrd_graph_settings.php:140
+#: usr/local/www/status_rrd_graph.php:388
+#: usr/local/www/status_rrd_graph.php:413
+msgid "QueueDrops"
+msgstr "Quedas de fila"
+
+#: usr/local/www/status_rrd_graph.php:348
+#: usr/local/www/status_rrd_graph_settings.php:147
+#: usr/local/www/status_rrd_graph_settings.php:148
+#: usr/local/www/status_rrd_graph.php:396
+#: usr/local/www/status_rrd_graph.php:421
+msgid "Cellular"
+msgstr "Celular"
+
+#: usr/local/www/status_rrd_graph.php:371
+#: usr/local/www/status_rrd_graph.php:419
+#: usr/local/www/status_rrd_graph.php:451
+msgid "Note: Change of color and/or style may not take effect until the next refresh"
+msgstr "Nota: Mudança de cor e/ou estilo podem não ter efeito até a próxima atualização"
+
+#: usr/local/www/status_rrd_graph.php:375
+#: usr/local/www/status_rrd_graph.php:423
+#: usr/local/www/status_rrd_graph.php:455
+msgid "Graphs:"
+msgstr "Gráficos:"
+
+#: usr/local/www/status_rrd_graph.php:432
+#: usr/local/www/status_rrd_graph.php:480
+#: usr/local/www/status_rrd_graph.php:515
+msgid "Style:"
+msgstr "Estilo:"
+
+#: usr/local/www/status_rrd_graph.php:446
+#: usr/local/www/status_rrd_graph.php:494
+#: usr/local/www/status_rrd_graph.php:529
+msgid "Period:"
+msgstr "Período:"
+
+#: usr/local/www/status_rrd_graph.php:461
+#: usr/local/www/status_rrd_graph.php:513
+#: usr/local/www/status_rrd_graph.php:548
+msgid "Start:"
+msgstr "Início:"
+
+#: usr/local/www/status_rrd_graph.php:463
+#: usr/local/www/status_rrd_graph.php:515
+#: usr/local/www/status_rrd_graph.php:550
+msgid "End:"
+msgstr "Fim:"
+
+#: usr/local/www/status_rrd_graph.php:465
+#: usr/local/www/status_rrd_graph.php:517
+#: usr/local/www/status_rrd_graph.php:552
+msgid "Go"
+msgstr "Ir"
+
+#: usr/local/www/status_rrd_graph_img.php:41
+#: usr/local/www/status_rrd_graph_img.php:43
+msgid "Image viewer"
+msgstr "Visualizador de imagem"
+
+#: usr/local/www/status_rrd_graph_img.php:216
+#: usr/local/www/status_rrd_graph_img.php:221
+#: usr/local/www/status_rrd_graph_img.php:266
+#, php-format
+msgid "rrdcolors.inc.php for theme %s does not exist, using defaults!"
+msgstr "rrdcolors.inc.php para tema %s não existe, usando padrões!"
+
+#: usr/local/www/status_rrd_graph_img.php:1095
+#: usr/local/www/status_rrd_graph_img.php:1088
+#: usr/local/www/status_rrd_graph_img.php:1093
+#: usr/local/www/status_rrd_graph_img.php:1182
+#, php-format
+msgid "Sorry we do not have data to graph for %s"
+msgstr "Lamento, não temos dados para gerar gráfico para %s"
+
+#: usr/local/www/status_rrd_graph_img.php:1115
+#: usr/local/www/status_rrd_graph_img.php:1108
+#: usr/local/www/status_rrd_graph_img.php:1113
+#: usr/local/www/status_rrd_graph_img.php:1202
+#, php-format
+msgid "Failed to create graph with error code %1$s, the error is: %2$s"
+msgstr "Falhou ao criar gráfico com o código de erro %1$s, o erro é: %2$s"
+
+#: usr/local/www/status_rrd_graph_img.php:1117
+#: usr/local/www/status_rrd_graph_img.php:1124
+#: usr/local/www/status_rrd_graph_img.php:1110
+#: usr/local/www/status_rrd_graph_img.php:1115
+#: usr/local/www/status_rrd_graph_img.php:1122
+#: usr/local/www/status_rrd_graph_img.php:1204
+#: usr/local/www/status_rrd_graph_img.php:1211
+#, php-format
+msgid "failed to create graph from %s%s, removing database"
+msgstr "falhou ao criar gráfico de %s%s, removendo da base de dados"
+
+#: usr/local/www/status_rrd_graph_settings.php:174
+#: usr/local/www/status_rrd_graph_settings.php:175
+msgid "Enables the RRD graphing backend."
+msgstr "Habilitar o backend de geração de gráfico RRD."
+
+#: usr/local/www/status_rrd_graph_settings.php:178
+#: usr/local/www/status_rrd_graph_settings.php:179
+msgid "Default category"
+msgstr "Categoria padrão"
+
+#: usr/local/www/status_rrd_graph_settings.php:189
+#: usr/local/www/status_rrd_graph_settings.php:190
+msgid "This selects default category."
+msgstr "Isso seleciona a categoria padrão."
+
+#: usr/local/www/status_rrd_graph_settings.php:193
+#: usr/local/www/status_rrd_graph_settings.php:194
+msgid "Default style"
+msgstr "Estilo padrão"
+
+#: usr/local/www/status_rrd_graph_settings.php:204
+#: usr/local/www/status_rrd_graph_settings.php:205
+msgid "This selects the default style."
+msgstr "Isso selecona o estilo padrão."
+
+#: usr/local/www/status_rrd_graph_settings.php:208
+#: usr/local/www/status_rrd_graph_settings.php:209
+msgid "Default period"
+msgstr "Período padrão"
+
+#: usr/local/www/status_rrd_graph_settings.php:219
+#: usr/local/www/status_rrd_graph_settings.php:220
+msgid "This selects the default period."
+msgstr "Isso selecona o período padrão."
+
+#: usr/local/www/status_rrd_graph_settings.php:231
+#: usr/local/www/status_rrd_graph_settings.php:232
+msgid "Reset RRD Data"
+msgstr "Reiniciar dados RRD"
+
+#: usr/local/www/status_rrd_graph_settings.php:231
+#: usr/local/www/status_rrd_graph_settings.php:232
+msgid "Do you really want to reset the RRD graphs? This will erase all graph data."
+msgstr "Você realmente deseja reiniciar os gráficos RRD? Isto irá apagar todos os dados do gráfico."
+
+#: usr/local/www/status_rrd_graph_settings.php:237
+#: usr/local/www/status_rrd_graph_settings.php:238
+msgid "Graphs will not be allowed to be recreated within a 1 minute interval, please take this into account after changing the style."
+msgstr "Gráficos não terão permissão de serem criados dentro de um intervalo de 1 minuto, por favor, leve isso em conta após modificar o estilo."
+
+#: usr/local/www/status_services.php:60
+#: usr/local/www/widgets/widgets/services_status.widget.php:54
+#: etc/inc/service-utils.inc:387 etc/inc/service-utils.inc:386
+#: etc/inc/service-utils.inc:403 etc/inc/service-utils.inc:405
+msgid "Not available."
+msgstr "Não disponível."
+
+#: usr/local/www/status_services.php:112 usr/local/www/status_services.php:100
+#: usr/local/www/status_services.php:98 etc/inc/service-utils.inc:657
+#: etc/inc/service-utils.inc:660 etc/inc/service-utils.inc:680
+#, php-format
+msgid "%s has been restarted."
+msgstr "%s foi reiniciado."
+
+#: usr/local/www/status_services.php:159 usr/local/www/status_services.php:151
+#: usr/local/www/status_services.php:149 etc/inc/service-utils.inc:544
+#: etc/inc/service-utils.inc:547 etc/inc/service-utils.inc:558
+#, php-format
+msgid "%s has been started."
+msgstr "%s foi iniciado."
+
+#: usr/local/www/status_services.php:218 usr/local/www/status_services.php:214
+#: usr/local/www/status_services.php:212 etc/inc/service-utils.inc:605
+#: etc/inc/service-utils.inc:608 etc/inc/service-utils.inc:622
+#, php-format
+msgid "%s has been stopped."
+msgstr "%s foi interrompido."
+
+#: usr/local/www/status_services.php:269
+#: usr/local/www/widgets/widgets/services_status.widget.php:74
+#: etc/inc/service-utils.inc:247 etc/inc/service-utils.inc:246
+#: etc/inc/service-utils.inc:263
+msgid "NTP clock sync"
+msgstr "Sincronização de relógio NTP"
+
+#: usr/local/www/status_services.php:302
+#: usr/local/www/widgets/widgets/services_status.widget.php:107
+#: etc/inc/service-utils.inc:285 etc/inc/service-utils.inc:284
+#: etc/inc/service-utils.inc:301 etc/inc/service-utils.inc:303
+msgid "DHCP Service"
+msgstr "Serviço DHCP"
+
+#: usr/local/www/status_services.php:309
+#: usr/local/www/widgets/widgets/services_status.widget.php:114
+#: etc/inc/service-utils.inc:292 etc/inc/service-utils.inc:291
+#: etc/inc/service-utils.inc:308 etc/inc/service-utils.inc:310
+msgid "SNMP Service"
+msgstr "Serviço SNMP"
+
+#: usr/local/www/status_services.php:323
+#: usr/local/www/widgets/widgets/services_status.widget.php:128
+#: etc/inc/service-utils.inc:306 etc/inc/service-utils.inc:305
+#: etc/inc/service-utils.inc:322 etc/inc/service-utils.inc:324
+msgid "UPnP Service"
+msgstr "Serviço UPnP"
+
+#: usr/local/www/status_services.php:353
+#: usr/local/www/widgets/widgets/services_status.widget.php:158
+#: etc/inc/service-utils.inc:343 etc/inc/service-utils.inc:342
+#: etc/inc/service-utils.inc:359 etc/inc/service-utils.inc:361
+msgid "Server load balancing daemon"
+msgstr "Daemon do balanceamento de carga do servidor"
+
+#: usr/local/www/status_services.php:380
+#: usr/local/www/widgets/widgets/services_status.widget.php:210
+#: etc/inc/service-utils.inc:411 etc/inc/service-utils.inc:410
+#: etc/inc/service-utils.inc:427 etc/inc/service-utils.inc:430
+#: etc/inc/service-utils.inc:435
+msgid "Running"
+msgstr "Executando"
+
+#: usr/local/www/status_services.php:383
+#: usr/local/www/widgets/widgets/services_status.widget.php:213
+#: etc/inc/service-utils.inc:420 etc/inc/service-utils.inc:419
+#: etc/inc/service-utils.inc:437 etc/inc/service-utils.inc:440
+#: etc/inc/service-utils.inc:445
+msgid "Stopped"
+msgstr "Interrompido"
+
+#: usr/local/www/status_services.php:392
+#: usr/local/www/widgets/widgets/services_status.widget.php:222
+msgid "Restart Service"
+msgstr "Reiniciar Serviço"
+
+#: usr/local/www/status_services.php:398
+#: usr/local/www/widgets/widgets/services_status.widget.php:228
+msgid "Stop Service"
+msgstr "Interromper Serviço"
+
+#: usr/local/www/status_services.php:407
+#: usr/local/www/widgets/widgets/services_status.widget.php:237
+msgid "Start Service"
+msgstr "Iniciar Serviço"
+
+#: usr/local/www/status_services.php:412
+#: usr/local/www/widgets/widgets/services_status.widget.php:242
+#: usr/local/www/status_services.php:271
+#: usr/local/www/widgets/widgets/services_status.widget.php:83
+#: usr/local/www/status_services.php:269 usr/local/www/status_services.php:110
+#: usr/local/www/widgets/widgets/services_status.widget.php:84
+msgid "No services found"
+msgstr "Nenhum serviço encontrado"
+
+#: usr/local/www/status_upnp.php:48
+msgid "Rules have been cleared and the daemon restarted"
+msgstr "Regras foram limpas e o daemon reiniciado"
+
+#: usr/local/www/status_upnp.php:58
+msgid "UPnP &amp; NAT-PMP Status"
+msgstr "UPnP &amp; Status NAT-PMP"
+
+#: usr/local/www/status_upnp.php:67 usr/local/www/status_upnp.php:68
+msgid "UPnP is currently disabled."
+msgstr "UPnP está atualmente desabilitado."
+
+#: usr/local/www/status_upnp.php:77 usr/local/www/status_upnp.php:78
+msgid "all currently connected sessions"
+msgstr "todas as sessões atualmente conectadas"
+
+#: usr/local/www/diag_arp.php:261 usr/local/www/fbegin.inc:206
+#: usr/local/www/fbegin.inc:214 usr/local/www/fbegin.inc:205
+msgid "ARP Table"
+msgstr "Tabela ARP"
+
+#: /usr/local/www/firewall_rules.php:320
+#: usr/local/www/diag_arp.php:271 usr/local/www/diag_ndp.php:113
+msgid "Loading, please wait..."
+msgstr "Carregando, por favor aguarde..."
+
+#: usr/local/www/services_dyndns_edit.php:87
+#: usr/local/www/services_dyndns_edit.php:158
+#: usr/local/www/services_dyndns_edit.php:92
+#: usr/local/www/services_dyndns_edit.php:216
+#: usr/local/www/services_dyndns_edit.php:220
+#: usr/local/www/services_dyndns_edit.php:93
+#: usr/local/www/services_dyndns_edit.php:222
+#: usr/local/www/services_dyndns_edit.php:223
+msgid "Service type"
+msgstr "Tipo de Serviço"
+
+#: usr/local/www/services_dyndns_edit.php:92
+#: usr/local/www/services_dyndns_edit.php:108
+#: usr/local/www/services_dyndns_edit.php:109
+msgid "The MX contains invalid characters."
+msgstr "O MX contém caracteres inválidos."
+
+#: usr/local/www/services_dyndns_edit.php:133
+#: usr/local/www/services_dyndns_edit.php:147
+#: usr/local/www/services_dyndns_edit.php:156
+#: usr/local/www/services_dyndns_edit.php:205
+#: usr/local/www/services_dyndns_edit.php:160
+#: usr/local/www/services_dyndns_edit.php:209
+#: usr/local/www/services_dyndns_edit.php:162
+#: usr/local/www/services_dyndns_edit.php:211
+#: usr/local/www/services_dyndns_edit.php:212
+msgid "Dynamic DNS client"
+msgstr "Cliente DNS dinâmico"
+
+#: usr/local/www/services_dyndns_edit.php:154
+#: usr/local/www/services_rfc2136_edit.php:188
+#: usr/local/www/services_dyndns_edit.php:212
+#: usr/local/www/services_dyndns_edit.php:216
+#: usr/local/www/services_dyndns_edit.php:218
+#: usr/local/www/services_dyndns_edit.php:219
+#: usr/local/www/services_rfc2136_edit.php:193
+#: usr/local/www/services_rfc2136_edit.php:199
+msgid "yes"
+msgstr "sim"
+
+#: usr/local/www/services_dyndns_edit.php:172
+#: usr/local/www/services_rfc2136_edit.php:134
+#: usr/local/www/services_dyndns_edit.php:230
+#: usr/local/www/services_dyndns_edit.php:234
+#: usr/local/www/services_dyndns_edit.php:236
+#: usr/local/www/services_dyndns_edit.php:237
+#: usr/local/www/services_rfc2136_edit.php:139
+msgid "Interface to monitor"
+msgstr "Interface para monitorar"
+
+#: usr/local/www/services_dyndns_edit.php:191
+#: usr/local/www/services_dyndns_edit.php:274
+#: usr/local/www/services_dyndns_edit.php:278
+#: usr/local/www/services_dyndns_edit.php:280
+#: usr/local/www/services_dyndns_edit.php:281
+msgid "Enter the complete host/domain name. example: myhost.dyndns.org"
+msgstr "Informe um nome de host/domínio completo. Exemplo: myhost.dyndns.org"
+
+#: usr/local/www/services_dyndns_edit.php:192
+#: usr/local/www/services_dyndns_edit.php:275
+#: usr/local/www/services_dyndns_edit.php:279
+#: usr/local/www/services_dyndns_edit.php:281
+#: usr/local/www/services_dyndns_edit.php:282
+msgid "For he.net tunnelbroker, enter your tunnel ID"
+msgstr "Para tunnelbroker he.net, digite o ID do túnel"
+
+#: usr/local/www/services_dyndns_edit.php:197
+#: usr/local/www/services_dyndns_edit.php:280
+#: usr/local/www/services_dyndns_edit.php:284
+#: usr/local/www/services_dyndns_edit.php:286
+#: usr/local/www/services_dyndns_edit.php:287
+msgid "MX"
+msgstr "MX"
+
+#: usr/local/www/services_dyndns_edit.php:201
+#: usr/local/www/services_dyndns_edit.php:284
+#: usr/local/www/services_dyndns_edit.php:288
+#: usr/local/www/services_dyndns_edit.php:290
+#: usr/local/www/services_dyndns_edit.php:291
+msgid "Note: With DynDNS service you can only use a hostname, not an IP address."
+msgstr "Nota: Com o serviço DNS Dinâmico você pode somente usar um nome de host, não um endereço IP."
+
+#: usr/local/www/services_dyndns_edit.php:203
+#: usr/local/www/services_dyndns_edit.php:286
+#: usr/local/www/services_dyndns_edit.php:290
+#: usr/local/www/services_dyndns_edit.php:292
+#: usr/local/www/services_dyndns_edit.php:293
+msgid "Set this option only if you need a special MX record. Not all services support this."
+msgstr "Configure essa opção somente se você precisar de um registro MX especial. Nem todos os serviços suportam isso."
+
+#: usr/local/www/services_dyndns_edit.php:207
+#: usr/local/www/services_dyndns_edit.php:290
+#: usr/local/www/services_dyndns_edit.php:294
+#: usr/local/www/services_dyndns_edit.php:296
+#: usr/local/www/services_dyndns_edit.php:297
+msgid "Wildcards"
+msgstr "Wildcards"
+
+#: usr/local/www/services_dyndns_edit.php:210
+#: usr/local/www/services_dyndns_edit.php:293
+#: usr/local/www/services_dyndns_edit.php:297
+#: usr/local/www/services_dyndns_edit.php:299
+#: usr/local/www/services_dyndns_edit.php:305
+#: usr/local/www/services_dyndns_edit.php:300
+#: usr/local/www/services_dyndns_edit.php:306
+msgid "Enable "
+msgstr "Habilitar"
+
+#: usr/local/www/services_dyndns_edit.php:210
+#: usr/local/www/services_dyndns_edit.php:293
+#: usr/local/www/services_dyndns_edit.php:297
+#: usr/local/www/services_dyndns_edit.php:299
+#: usr/local/www/services_dyndns_edit.php:300
+msgid "Wildcard"
+msgstr "Wildcard"
+
+#: usr/local/www/services_dyndns_edit.php:216
+msgid "Username is required for all types except Namecheap and FreeDNS."
+msgstr "Nome de usuário é necessário para todos os tipos exceto Namecheap e FreeDNS."
+
+#: usr/local/www/services_dyndns_edit.php:224
+#: usr/local/www/services_dyndns_edit.php:309
+#: usr/local/www/services_dyndns_edit.php:313
+#: usr/local/www/services_dyndns_edit.php:321
+#: usr/local/www/services_dyndns_edit.php:322
+msgid "FreeDNS (freedns.afraid.org): Enter your \"Authentication Token\" provided by FreeDNS."
+msgstr "FreeDNS (freedns.afraid.org): Informe seu \"Authentication Token\" fornecido pelo FreeDNS."
+
+#: usr/local/www/services_dyndns_edit.php:246
+#: usr/local/www/services_dyndns_edit.php:377
+#: usr/local/www/services_dyndns_edit.php:381
+#: usr/local/www/services_dyndns_edit.php:389
+#: usr/local/www/services_dyndns_edit.php:390
+#, php-format
+msgid ""
+"You must configure a DNS server in %sSystem:\n"
+" General setup%s or allow the DNS server list to be overridden\n"
+" by DHCP/PPP on WAN for dynamic DNS updates to work."
+msgstr ""
+"Você deve configurar um servidor DNS em %sSistema:\n"
+" Configurações Gerais%s ou permitir que a lista de servidor DNS seja sobrescrita\n"
+" pelo DHCP/PPP na WAN para atualizações DNS dinâmicas funcionarem."
+
+#: usr/local/www/services_igmpproxy.php:80
+#: usr/local/www/services_igmpproxy_edit.php:46
+msgid "IGMP Proxy"
+msgstr "Proxy IGMP"
+
+#: usr/local/www/services_igmpproxy.php:90
+msgid "The IGMP entry list has been changed"
+msgstr "A lista de entrada IGMP foi modificada"
+
+#: usr/local/www/services_igmpproxy.php:103
+#: usr/local/www/services_igmpproxy.php:146
+msgid "add a new igmpentry"
+msgstr "adicionar um nova entrada igmp"
+
+#: usr/local/www/services_igmpproxy.php:133
+msgid "edit igmpentry"
+msgstr "editar entrada igmp"
+
+#: usr/local/www/services_igmpproxy.php:134
+msgid "Do you really want to delete this igmpentry? All elements that still use it will become invalid (e.g. filter rules)!"
+msgstr "Você realmente deseja apagar essa entrada igmp? Todos os elementos que ainda a usam serão invalidados (e.g. regras de filtro)!"
+
+#: usr/local/www/services_igmpproxy.php:134
+msgid "delete igmpentry"
+msgstr "apagar entrada igmp"
+
+#: usr/local/www/services_igmpproxy.php:161
+msgid "Please add the interface for upstream, the allowed subnets, and the downstream interfaces you would like the proxy to allow. Only one 'upstream' interface can be configured."
+msgstr "Por favor adicionar a interface para upstream, as subredes permitidas, e as interfaces downstream que você gostaria que o proxy desse permissão. Somente uma interface 'upstream' pode ser configurada."
+
+#: usr/local/www/services_igmpproxy_edit.php:79
+msgid "Only one 'upstream' interface can be configured."
+msgstr "Somente uma interface 'upstream' pode ser configurada."
+
+#: usr/local/www/services_igmpproxy_edit.php:158
+#: usr/local/www/services_igmpproxy_edit.php:160
+msgid "IGMP Proxy Edit"
+msgstr "Editar Proxy IGMP"
+
+#: usr/local/www/services_igmpproxy_edit.php:188
+#: usr/local/www/services_igmpproxy_edit.php:190
+msgid "Upstream Interface"
+msgstr "Interface Upstream"
+
+#: usr/local/www/services_igmpproxy_edit.php:189
+#: usr/local/www/services_igmpproxy_edit.php:191
+msgid "Downstream Interface"
+msgstr "Interface Downstream"
+
+#: usr/local/www/services_igmpproxy_edit.php:193
+#: usr/local/www/services_igmpproxy_edit.php:195
+msgid "The <b>upstream</b> network interface is the outgoing interface which is responsible for communicating to available multicast data sources. There can only be one upstream interface."
+msgstr "A interface de rede <b>upstream</b> é uma interface de saída que é responsável por comunicar-se com fontes de dado multicast disponíveis. Somente pode existir uma interface upstream."
+
+#: usr/local/www/services_igmpproxy_edit.php:199
+#: usr/local/www/services_igmpproxy_edit.php:201
+msgid "Downstream"
+msgstr "Downstream"
+
+#: usr/local/www/services_igmpproxy_edit.php:199
+#: usr/local/www/services_igmpproxy_edit.php:201
+msgid "network interfaces are the distribution interfaces to the destination networks, where multicast clients can join groups and receive multicast data. One or more downstream interfaces must be configured."
+msgstr "(interfaces de rede) são interfaces de distribuição para redes de destino onde clientes multicast podem unir-se a grupos e receber dados de multicast. Uma ou mais interfaces downstream deve ser configurados."
+
+#: usr/local/www/services_igmpproxy_edit.php:206
+#: usr/local/www/services_igmpproxy_edit.php:208
+msgid "Threshold"
+msgstr "Threshold"
+
+#: usr/local/www/services_igmpproxy_edit.php:211
+#: usr/local/www/services_igmpproxy_edit.php:213
+msgid "Defines the TTL threshold for the network interface. Packets with a lower TTL than the threshold value will be ignored. This setting is optional, and by default the threshold is 1."
+msgstr "Define o threshold TTL para a interface de rede. Pacotes com um TTL mais baixo que os valores de thresholds serão ignorados. Essa configuração é opcional e, por padrão, o threshold é 1."
+
+#: usr/local/www/services_igmpproxy_edit.php:218
+#: usr/local/www/services_igmpproxy_edit.php:220
+msgid "Network (s)"
+msgstr "Rede(s)"
+
+#: usr/local/www/services_rfc2136.php:55
+msgid "RFC 2136 clients"
+msgstr "Clientes RFC 2136"
+
+#: usr/local/www/services_rfc2136.php:99
+#: usr/local/www/vpn_openvpn_client.php:894
+#: usr/local/www/vpn_openvpn_client.php:899
+#: usr/local/www/vpn_openvpn_client.php:952
+#: usr/local/www/services_rfc2136.php:118
+#: usr/local/www/vpn_openvpn_client.php:971
+#: usr/local/www/services_rfc2136.php:165
+msgid "Do you really want to delete this client?"
+msgstr "Você realmente deseja apagar esse cliente?"
+
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:153
+#: usr/local/www/services_dyndns_edit.php:348
+#: usr/local/www/services_dyndns_edit.php:352
+#: usr/local/www/services_dyndns_edit.php:360
+#: usr/local/www/services_dyndns_edit.php:361
+#: usr/local/www/services_rfc2136_edit.php:72
+#: usr/local/www/services_rfc2136_edit.php:158
+msgid "TTL"
+msgstr "TTL"
+
+#: usr/local/www/services_rfc2136_edit.php:71
+#: usr/local/www/services_rfc2136_edit.php:159
+#: usr/local/www/services_rfc2136_edit.php:72
+#: usr/local/www/services_rfc2136_edit.php:164
+msgid "Key name"
+msgstr "Nome da chave"
+
+#: usr/local/www/services_rfc2136_edit.php:76
+#: usr/local/www/services_rfc2136_edit.php:77
+msgid "The DNS update host name contains invalid characters."
+msgstr "O nome de host da atualização do DNS contém caracteres inválidos."
+
+#: usr/local/www/services_rfc2136_edit.php:78
+#: usr/local/www/services_rfc2136_edit.php:79
+msgid "The DNS update TTL must be an integer."
+msgstr "O TTL da atualização do DNS deve ser um inteiro."
+
+#: usr/local/www/services_rfc2136_edit.php:80
+#: usr/local/www/services_rfc2136_edit.php:81
+msgid "The DNS update key name contains invalid characters."
+msgstr "O nome da chave da atualização do DNS contém caracteres inválidos."
+
+#: usr/local/www/services_rfc2136_edit.php:100
+#: usr/local/www/services_rfc2136_edit.php:102
+msgid "New/Edited RFC2136 dnsupdate entry was posted."
+msgstr "Nova/Editada entrada de atualização do DNS pela RFC 2136 foi publicado."
+
+#: usr/local/www/services_rfc2136_edit.php:109
+#: usr/local/www/services_rfc2136_edit.php:123
+#: usr/local/www/services_rfc2136_edit.php:114
+#: usr/local/www/services_rfc2136_edit.php:128
+msgid "RFC 2136 client"
+msgstr "Cliente RFC 2136"
+
+#: usr/local/www/services_rfc2136_edit.php:163
+#: usr/local/www/services_rfc2136_edit.php:168
+msgid "This must match the setting on the DNS server."
+msgstr "Isso deve corresponder à configuração no servidor DNS."
+
+#: usr/local/www/services_rfc2136_edit.php:166
+#: usr/local/www/services_rfc2136_edit.php:171
+msgid "Key type"
+msgstr "Tipo de chave"
+
+#: usr/local/www/services_rfc2136_edit.php:168
+#: usr/local/www/services_captiveportal_zones.php:52
+#: usr/local/www/services_captiveportal_zones.php:53
+#: usr/local/www/services_rfc2136_edit.php:173
+msgid "Zone"
+msgstr "Zona"
+
+#: usr/local/www/services_rfc2136_edit.php:170
+#: usr/local/www/services_rfc2136_edit.php:175
+msgid " User"
+msgstr " Usuário"
+
+#: usr/local/www/services_rfc2136_edit.php:177
+#: usr/local/www/services_rfc2136_edit.php:182
+msgid "Paste an HMAC-MD5 key here."
+msgstr "Cole uma chave HMAC-MD5 aqui."
+
+#: usr/local/www/services_rfc2136_edit.php:189
+#: usr/local/www/services_rfc2136_edit.php:194
+msgid "Use TCP instead of UDP"
+msgstr "Use TCP ao invés de UDP"
+
+#: usr/local/www/services_rfc2136_edit.php:210
+#: usr/local/www/services_rfc2136_edit.php:223
+#, php-format
+msgid "You must configure a DNS server in %sSystem: General setup %sor allow the DNS server list to be overridden by DHCP/PPP on WAN for dynamic DNS updates to work."
+msgstr "Você deve configurar um servidor DNS em %sSistema: Configurações Gerais%s ou pemitir que a lista de servidores DNS seja sobrescrita pelo DHCP/PPP na WAN para atualizações DNS dinâmicas funcionarem."
+
+#: usr/local/www/status_captiveportal_test.php:82
+#: usr/local/www/status_captiveportal_test.php:83
+#: usr/local/www/status_captiveportal_expire.php:82
+#: usr/local/www/status_captiveportal_test.php:84
+msgid "Voucher(s)"
+msgstr "Voucher(s)"
+
+#: usr/local/www/status_captiveportal_test.php:86
+#: usr/local/www/status_captiveportal_test.php:87
+#: usr/local/www/status_captiveportal_test.php:88
+msgid "Enter multiple vouchers separated by space or newline. The remaining time, if valid, will be shown for each voucher"
+msgstr "Informe múltiplos vouchers separados por espaço ou uma nova linha. O tempo remanescente, se válido, será exibido para cada voucher"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:85
+#: usr/local/www/status_captiveportal_voucher_rolls.php:86
+#: usr/local/www/status_captiveportal_voucher_rolls.php:88
+msgid "Roll#"
+msgstr "Lista#"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:87
+#: usr/local/www/status_captiveportal_voucher_rolls.php:88
+#: usr/local/www/status_captiveportal_voucher_rolls.php:90
+msgid "# of Tickets"
+msgstr "# de Tickets"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:89
+#: usr/local/www/status_captiveportal_voucher_rolls.php:90
+#: usr/local/www/status_captiveportal_voucher_rolls.php:92
+msgid "used"
+msgstr "usado"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:90
+#: usr/local/www/status_captiveportal_voucher_rolls.php:91
+#: usr/local/www/status_captiveportal_voucher_rolls.php:93
+msgid "active"
+msgstr "ativo"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:91
+#: usr/local/www/status_captiveportal_voucher_rolls.php:92
+#: usr/local/www/status_captiveportal_voucher_rolls.php:94
+msgid "ready"
+msgstr "pronto"
+
+#: usr/local/www/status_captiveportal_vouchers.php:115
+#: usr/local/www/status_captiveportal_vouchers.php:116
+#: usr/local/www/status_captiveportal_vouchers.php:121
+msgid "Voucher"
+msgstr "Voucher"
+
+#: usr/local/www/status_captiveportal_vouchers.php:117
+#: usr/local/www/status_captiveportal_vouchers.php:118
+#: usr/local/www/status_captiveportal_vouchers.php:123
+msgid "Activated at"
+msgstr "Ativado em"
+
+#: usr/local/www/status_captiveportal_vouchers.php:118
+#: usr/local/www/status_captiveportal_vouchers.php:119
+#: usr/local/www/status_captiveportal_vouchers.php:124
+msgid "Expires in"
+msgstr "Expira em"
+
+#: usr/local/www/status_captiveportal_vouchers.php:119
+#: usr/local/www/status_captiveportal_vouchers.php:120
+#: usr/local/www/status_captiveportal_vouchers.php:125
+msgid "Expires at"
+msgstr "Expira em"
+
+#: usr/local/www/status_captiveportal_vouchers.php:127
+#: usr/local/www/status_captiveportal_vouchers.php:128
+#: usr/local/www/status_captiveportal_vouchers.php:133
+msgid "min"
+msgstr "min"
+
+#: usr/local/www/status_dhcp_leases.php:48
+#: usr/local/www/status_dhcp_leases.php:49
+msgid "DHCP leases"
+msgstr "Concessões DHCP"
+
+#: usr/local/www/status_dhcp_leases.php:287
+#: usr/local/www/status_dhcpv6_leases.php:328
+#: usr/local/www/status_dhcpv6_leases.php:372
+#: usr/local/www/status_dhcp_leases.php:308
+#: usr/local/www/status_dhcpv6_leases.php:373
+#: usr/local/www/status_dhcp_leases.php:310
+#: usr/local/www/status_dhcpv6_leases.php:376
+#: usr/local/www/status_dhcp_leases.php:311
+msgid "Failover Group"
+msgstr "Grupo de Failover"
+
+#: usr/local/www/status_dhcp_leases.php:288
+#: usr/local/www/status_dhcpv6_leases.php:329
+#: usr/local/www/status_dhcpv6_leases.php:373
+#: usr/local/www/status_dhcp_leases.php:309
+#: usr/local/www/status_dhcpv6_leases.php:374
+#: usr/local/www/status_dhcp_leases.php:311
+#: usr/local/www/status_dhcpv6_leases.php:377
+#: usr/local/www/status_dhcp_leases.php:312
+msgid "My State"
+msgstr "Meu estado"
+
+#: usr/local/www/status_dhcp_leases.php:289
+#: usr/local/www/status_dhcp_leases.php:291
+#: usr/local/www/status_dhcpv6_leases.php:330
+#: usr/local/www/status_dhcpv6_leases.php:332
+#: usr/local/www/status_dhcpv6_leases.php:374
+#: usr/local/www/status_dhcpv6_leases.php:376
+#: usr/local/www/status_dhcp_leases.php:310
+#: usr/local/www/status_dhcp_leases.php:312
+#: usr/local/www/status_dhcpv6_leases.php:375
+#: usr/local/www/status_dhcpv6_leases.php:377
+#: usr/local/www/status_dhcp_leases.php:314
+#: usr/local/www/status_dhcpv6_leases.php:378
+#: usr/local/www/status_dhcpv6_leases.php:380
+#: usr/local/www/status_dhcp_leases.php:313
+#: usr/local/www/status_dhcp_leases.php:315
+msgid "Since"
+msgstr "Desde"
+
+#: usr/local/www/status_dhcp_leases.php:290
+#: usr/local/www/status_dhcpv6_leases.php:331
+#: usr/local/www/status_dhcpv6_leases.php:375
+#: usr/local/www/status_dhcp_leases.php:311
+#: usr/local/www/status_dhcpv6_leases.php:376
+#: usr/local/www/status_dhcp_leases.php:313
+#: usr/local/www/status_dhcpv6_leases.php:379
+#: usr/local/www/status_dhcp_leases.php:314
+msgid "Peer State"
+msgstr "Estado do peer"
+
+#: usr/local/www/status_dhcp_leases.php:322
+#: usr/local/www/status_dhcpv6_leases.php:364
+#: usr/local/www/status_dhcpv6_leases.php:408
+#: usr/local/www/status_dhcpv6_leases.php:485
+#: usr/local/www/status_dhcp_leases.php:343
+#: usr/local/www/status_dhcpv6_leases.php:409
+#: usr/local/www/status_dhcpv6_leases.php:486
+#: usr/local/www/status_dhcp_leases.php:345
+#: usr/local/www/status_dhcpv6_leases.php:412
+#: usr/local/www/status_dhcpv6_leases.php:489
+#: usr/local/www/status_dhcp_leases.php:346
+msgid "End"
+msgstr "Fim"
+
+#: usr/local/www/status_dhcp_leases.php:323
+#: usr/local/www/status_gateway_groups.php:132
+#: usr/local/www/status_gateways.php:127 usr/local/www/status_gateways.php:131
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:57
+#: usr/local/www/status_dhcpv6_leases.php:365
+#: usr/local/www/status_dhcpv6_leases.php:409
+#: usr/local/www/status_dhcp_leases.php:344
+#: usr/local/www/status_dhcpv6_leases.php:410
+#: usr/local/www/status_gateways.php:128 usr/local/www/status_gateways.php:132
+#: usr/local/www/status_dhcp_leases.php:346
+#: usr/local/www/status_gateway_groups.php:133
+#: usr/local/www/status_dhcpv6_leases.php:413
+#: usr/local/www/status_dhcp_leases.php:347
+msgid "Online"
+msgstr "No ar"
+
+#: usr/local/www/status_dhcp_leases.php:324
+#: usr/local/www/status_dhcpv6_leases.php:366
+#: usr/local/www/status_dhcpv6_leases.php:410
+#: usr/local/www/status_dhcp_leases.php:345
+#: usr/local/www/status_dhcpv6_leases.php:411
+#: usr/local/www/status_dhcp_leases.php:347
+#: usr/local/www/status_dhcpv6_leases.php:414
+#: usr/local/www/status_dhcp_leases.php:348
+msgid "Lease Type"
+msgstr "Tipo de concessão"
+
+#: usr/local/www/status_dhcp_leases.php:368
+#: usr/local/www/status_dhcp_leases.php:389
+#: usr/local/www/status_dhcp_leases.php:393
+#: usr/local/www/status_dhcp_leases.php:394
+msgid "send Wake on LAN packet to this MAC address"
+msgstr "enviar pacote Wake on LAN para esse endereço MAC"
+
+#: usr/local/www/status_dhcp_leases.php:390
+#: usr/local/www/status_dhcpv6_leases.php:417
+#: usr/local/www/status_dhcpv6_leases.php:461
+#: usr/local/www/status_dhcp_leases.php:411
+#: usr/local/www/status_dhcpv6_leases.php:462
+#: usr/local/www/status_dhcp_leases.php:415
+#: usr/local/www/status_dhcpv6_leases.php:465
+#: usr/local/www/status_dhcp_leases.php:416
+msgid "add a static mapping for this MAC address"
+msgstr "adicionar um mapeamento estático para esse endereço MAC"
+
+#: usr/local/www/status_dhcp_leases.php:397
+#: usr/local/www/status_dhcp_leases.php:418
+#: usr/local/www/status_dhcp_leases.php:422
+#: usr/local/www/status_dhcp_leases.php:423
+msgid "add a Wake on LAN mapping for this MAC address"
+msgstr "adicionar um mapeamento Wake on LAN para esse endereço MAC"
+
+#: usr/local/www/status_dhcp_leases.php:402
+#: usr/local/www/status_dhcpv6_leases.php:426
+#: usr/local/www/status_dhcpv6_leases.php:470
+#: usr/local/www/status_dhcp_leases.php:423
+#: usr/local/www/status_dhcpv6_leases.php:471
+#: usr/local/www/status_dhcp_leases.php:427
+#: usr/local/www/status_dhcpv6_leases.php:474
+#: usr/local/www/status_dhcp_leases.php:428
+msgid "delete this DHCP lease"
+msgstr "apague essa concessão DHCP"
+
+#: usr/local/www/status_dhcp_leases.php:415
+#: usr/local/www/status_dhcpv6_leases.php:439
+#: usr/local/www/status_dhcpv6_leases.php:540
+#: usr/local/www/status_dhcp_leases.php:436
+#: usr/local/www/status_dhcpv6_leases.php:541
+#: usr/local/www/status_dhcp_leases.php:440
+#: usr/local/www/status_dhcpv6_leases.php:544
+#: usr/local/www/status_dhcp_leases.php:441
+msgid "Show active and static leases only"
+msgstr "Exibir concessões ativas e estáticas somente"
+
+#: usr/local/www/status_dhcp_leases.php:418
+#: usr/local/www/status_dhcpv6_leases.php:442
+#: usr/local/www/status_dhcpv6_leases.php:543
+#: usr/local/www/status_dhcp_leases.php:439
+#: usr/local/www/status_dhcpv6_leases.php:544
+#: usr/local/www/status_dhcp_leases.php:443
+#: usr/local/www/status_dhcpv6_leases.php:547
+#: usr/local/www/status_dhcp_leases.php:444
+msgid "Show all configured leases"
+msgstr "Exibir todas as concessões configuradas"
+
+#: usr/local/www/status_dhcp_leases.php:422
+#: usr/local/www/status_dhcpv6_leases.php:446
+#: usr/local/www/status_dhcpv6_leases.php:547
+#: usr/local/www/status_dhcp_leases.php:443
+#: usr/local/www/status_dhcpv6_leases.php:548
+#: usr/local/www/status_dhcp_leases.php:447
+#: usr/local/www/status_dhcpv6_leases.php:551
+#: usr/local/www/status_dhcp_leases.php:448
+msgid "No leases file found. Is the DHCP server active"
+msgstr "Nenhum arquivo de concessões encontrado. O servidor DHCP está ativo?"
+
+#: usr/local/www/status_gateway_groups.php:100
+#: usr/local/www/status_gateway_groups.php:101
+#, php-format
+msgid "Tier %s"
+msgstr "Camada %s"
+
+#: usr/local/www/status_gateway_groups.php:126
+#: usr/local/www/status_gateways.php:121 usr/local/www/status_gateways.php:122
+#: usr/local/www/status_gateway_groups.php:127
+msgid "Warning, Packetloss"
+msgstr "Aviso, perda de pacote"
+
+#: usr/local/www/status_gateway_groups.php:129
+#: usr/local/www/status_gateways.php:124 usr/local/www/status_gateways.php:125
+#: usr/local/www/status_gateway_groups.php:130
+msgid "Warning, Latency"
+msgstr "Advertência, latência"
+
+#: usr/local/www/status_gateway_groups.php:135
+#: usr/local/www/status_gateways.php:100 usr/local/www/status_gateways.php:108
+#: usr/local/www/status_gateways.php:134
+#: usr/local/www/widgets/widgets/gateways.widget.php:69
+#: usr/local/www/widgets/widgets/gateways.widget.php:77
+#: usr/local/www/widgets/widgets/gateways.widget.php:98
+#: usr/local/www/status_gateway_groups.php:136
+msgid "Gathering data"
+msgstr "Coletando dados"
+
+#: usr/local/www/status_gateways.php:75 usr/local/www/status_gateways.php:76
+msgid "RTT"
+msgstr "RTT"
+
+#: usr/local/www/status_gateways.php:76 usr/local/www/status_gateways.php:77
+msgid "Loss"
+msgstr "Perda"
+
+#: usr/local/www/status_gateways.php:144
+#, php-format
+msgid "Last check %s"
+msgstr "Última verificação %s"
+
+#: usr/local/www/status_graph_cpu.php:41
+msgid "CPU load"
+msgstr "Carregamento de CPU"
+
+#: usr/local/www/status_graph_cpu.php:46
+msgid "Status: CPU Graph"
+msgstr "Status: Gráfico de CPU"
+
+#: usr/local/www/status_graph_cpu.php:53
+msgid "if you can't see the graph, you may have to install the"
+msgstr "se você não pode ver o gráfico, você deve ter que instalar o"
+
+#: usr/local/www/status_graph_cpu.php:53
+msgid "Adobe SVG viewer"
+msgstr "Visualizador Adobe SVG"
+
+#: usr/local/www/status_lb_vs.php:78 usr/local/www/vpn_ipsec_phase2.php:427
+#: usr/local/www/vpn_ipsec_phase2.php:469
+#: usr/local/www/vpn_ipsec_phase2.php:475
+#: usr/local/www/vpn_ipsec_phase2.php:453
+#: usr/local/www/vpn_ipsec_phase2.php:495
+#: usr/local/www/vpn_ipsec_phase2.php:501
+#: usr/local/www/vpn_ipsec_phase2.php:519
+#: usr/local/www/vpn_ipsec_phase2.php:555
+#: usr/local/www/vpn_ipsec_phase2.php:597
+#: usr/local/www/vpn_ipsec_phase2.php:603
+#: usr/local/www/vpn_ipsec_phase2.php:541
+#: usr/local/www/vpn_ipsec_phase2.php:576
+#: usr/local/www/vpn_ipsec_phase2.php:618
+#: usr/local/www/vpn_ipsec_phase2.php:624
+msgid "Address"
+msgstr "Endereço"
+
+#: usr/local/www/status_openvpn.php:145 usr/local/www/status_openvpn.php:146
+#: usr/local/www/status_openvpn.php:147
+msgid "Client connections"
+msgstr "Conexões de clientes"
+
+#: usr/local/www/status_openvpn.php:152 usr/local/www/system_camanager.php:534
+#: usr/local/www/system_certmanager.php:627
+#: usr/local/www/system_certmanager.php:730
+#: usr/local/www/vpn_openvpn_csc.php:673
+#: usr/local/www/system_certmanager.php:743
+#: usr/local/www/system_certmanager.php:896
+#: usr/local/www/system_camanager.php:535 usr/local/www/status_openvpn.php:153
+#: usr/local/www/vpn_openvpn_csc.php:672
+#: usr/local/www/system_camanager.php:559 usr/local/www/status_openvpn.php:214
+#: usr/local/www/system_certmanager.php:768
+#: usr/local/www/system_certmanager.php:938
+#: usr/local/www/status_openvpn.php:154 usr/local/www/status_openvpn.php:224
+#: usr/local/www/system_certmanager.php:769
+#: usr/local/www/system_certmanager.php:942
+msgid "Common Name"
+msgstr "Nome Comum"
+
+#: usr/local/www/status_openvpn.php:153 usr/local/www/status_openvpn.php:154
+#: usr/local/www/status_openvpn.php:215 usr/local/www/status_openvpn.php:155
+#: usr/local/www/status_openvpn.php:225
+msgid "Real Address"
+msgstr "Endereço Real"
+
+#: usr/local/www/status_openvpn.php:154 usr/local/www/status_openvpn.php:155
+#: usr/local/www/status_openvpn.php:156
+msgid "Virtual Address"
+msgstr "Endereço Virtual"
+
+#: usr/local/www/status_openvpn.php:155 usr/local/www/status_openvpn.php:213
+#: usr/local/www/status_openvpn.php:264 usr/local/www/status_openvpn.php:156
+#: usr/local/www/status_openvpn.php:216 usr/local/www/status_openvpn.php:267
+#: usr/local/www/status_openvpn.php:315 usr/local/www/status_openvpn.php:157
+#: usr/local/www/status_openvpn.php:274 usr/local/www/status_openvpn.php:335
+msgid "Connected Since"
+msgstr "Conectado desde"
+
+#: usr/local/www/status_openvpn.php:156 usr/local/www/status_openvpn.php:216
+#: usr/local/www/status_openvpn.php:267 usr/local/www/status_openvpn.php:157
+#: usr/local/www/status_openvpn.php:219 usr/local/www/status_openvpn.php:270
+#: usr/local/www/status_openvpn.php:318 usr/local/www/status_openvpn.php:158
+#: usr/local/www/status_openvpn.php:277 usr/local/www/status_openvpn.php:338
+msgid "Bytes Sent"
+msgstr "Bytes Enviados"
+
+#: usr/local/www/status_openvpn.php:157 usr/local/www/status_openvpn.php:217
+#: usr/local/www/status_openvpn.php:268 usr/local/www/status_openvpn.php:158
+#: usr/local/www/status_openvpn.php:220 usr/local/www/status_openvpn.php:271
+#: usr/local/www/status_openvpn.php:319 usr/local/www/status_openvpn.php:159
+msgid "Bytes Received"
+msgstr "Bytes Recebidos"
+
+#: usr/local/www/status_openvpn.php:184 usr/local/www/status_openvpn.php:185
+#: usr/local/www/status_openvpn.php:186
+msgid "Kill client connection from"
+msgstr "Matar conexão de cliente de"
+
+#: usr/local/www/status_openvpn.php:205 usr/local/www/status_openvpn.php:208
+#: usr/local/www/status_openvpn.php:256 usr/local/www/status_openvpn.php:266
+msgid "Peer to Peer Server Instance Statistics"
+msgstr "Estatísticas da instância do servidor Peer to Peer"
+
+#: usr/local/www/status_openvpn.php:214 usr/local/www/status_openvpn.php:265
+#: usr/local/www/status_openvpn.php:217 usr/local/www/status_openvpn.php:268
+#: usr/local/www/status_openvpn.php:316 usr/local/www/status_openvpn.php:275
+#: usr/local/www/status_openvpn.php:336
+msgid "Virtual Addr"
+msgstr "Endereço Virtual"
+
+#: usr/local/www/status_openvpn.php:215 usr/local/www/status_openvpn.php:266
+#: usr/local/www/status_openvpn.php:218 usr/local/www/status_openvpn.php:269
+#: usr/local/www/status_openvpn.php:317 usr/local/www/status_openvpn.php:276
+#: usr/local/www/status_openvpn.php:337
+msgid "Remote Host"
+msgstr "Host Remoto"
+
+#: usr/local/www/status_openvpn.php:256 usr/local/www/status_openvpn.php:259
+#: usr/local/www/status_openvpn.php:307 usr/local/www/status_openvpn.php:327
+msgid "Client Instance Statistics"
+msgstr "Estatísticas de instâncias de clientes"
+
+#: usr/local/www/status_openvpn.php:304 usr/local/www/status_openvpn.php:307
+#: usr/local/www/status_openvpn.php:355
+msgid "You need to bind each OpenVPN client to enable its management daemon: use 'Local port' setting in the OpenVPN client screen"
+msgstr "Você precisa vincular cada cliente OpenVPN para habilitar seu daemon de gerenciamento: use configuração de 'Porta Local' na tela do cliente OpenVPN"
+
+#: usr/local/www/status_openvpn.php:308 usr/local/www/status_openvpn.php:311
+#: usr/local/www/status_openvpn.php:359 usr/local/www/status_openvpn.php:389
+msgid "No OpenVPN instances defined"
+msgstr "Nenhuma instância do OpenVPN definida"
+
+#: usr/local/www/system_advanced_admin.php:87
+#: usr/local/www/system_advanced_admin.php:88
+msgid "You must specify a valid webConfigurator port number"
+msgstr "Você deve especificar um número de porta do webConfigurator válido"
+
+#: usr/local/www/system_advanced_admin.php:91
+#: usr/local/www/system_advanced_admin.php:92
+msgid "Max Processes must be a number 1 or greater"
+msgstr "Número máximo de processos deve ser maior que 1"
+
+#: usr/local/www/system_advanced_admin.php:97
+#: usr/local/www/system_advanced_admin.php:98
+#, php-format
+msgid "Alternate hostname %s is not a valid hostname."
+msgstr "Hostnane alternativo %s não é um hostname valido."
+
+#: usr/local/www/system_advanced_admin.php:102
+#: usr/local/www/services_dnsmasq.php:92
+#: usr/local/www/system_advanced_admin.php:103
+msgid "You must specify a valid port number"
+msgstr "Você deve especificar um número de porta válido"
+
+#: usr/local/www/system_advanced_admin.php:232
+#: usr/local/www/system_advanced_admin.php:238
+#, php-format
+msgid "One moment...redirecting to %s in 20 seconds."
+msgstr "Um momento... redirecionando para %s em 20 segundos."
+
+#: usr/local/www/system_advanced_admin.php:242
+#: usr/local/www/system_advanced_admin.php:263
+msgid "Advanced: Admin Access"
+msgstr "Avançado: Acesso de Administrador"
+
+#: usr/local/www/system_advanced_admin.php:274
+#: usr/local/www/system_advanced_firewall.php:215
+#: usr/local/www/system_advanced_misc.php:206
+#: usr/local/www/system_advanced_network.php:182
+#: usr/local/www/system_advanced_notifications.php:151
+#: usr/local/www/system_advanced_sysctl.php:147
+#: usr/local/www/system_advanced_firewall.php:229
+#: usr/local/www/system_advanced_notifications.php:160
+#: usr/local/www/system_advanced_misc.php:232
+#: usr/local/www/system_advanced_misc.php:251
+#: usr/local/www/system_advanced_misc.php:255
+#: usr/local/www/system_advanced_firewall.php:258
+#: usr/local/www/system_advanced_misc.php:302
+#: usr/local/www/system_advanced_admin.php:295
+#: usr/local/www/system_advanced_misc.php:308
+#: usr/local/www/system_advanced_firewall.php:269
+#: usr/local/www/system_advanced_notifications.php:175
+#: usr/local/www/system_advanced_network.php:181
+msgid "Admin Access"
+msgstr "Acesso de Administrador"
+
+#: usr/local/www/system_advanced_admin.php:275
+#: usr/local/www/system_advanced_firewall.php:216
+#: usr/local/www/system_advanced_misc.php:207
+#: usr/local/www/system_advanced_network.php:183
+#: usr/local/www/system_advanced_notifications.php:152
+#: usr/local/www/system_advanced_sysctl.php:148
+#: usr/local/www/system_advanced_firewall.php:230
+#: usr/local/www/system_advanced_notifications.php:161
+#: usr/local/www/system_advanced_misc.php:233
+#: usr/local/www/system_advanced_misc.php:252
+#: usr/local/www/system_advanced_misc.php:256
+#: usr/local/www/system_advanced_firewall.php:259
+#: usr/local/www/system_advanced_misc.php:303
+#: usr/local/www/system_advanced_admin.php:296
+#: usr/local/www/system_advanced_misc.php:309
+#: usr/local/www/system_advanced_firewall.php:270
+#: usr/local/www/system_advanced_notifications.php:176
+#: usr/local/www/system_advanced_network.php:182
+msgid "Firewall / NAT"
+msgstr "Firewall / NAT"
+
+#: usr/local/www/system_advanced_admin.php:276
+#: usr/local/www/system_advanced_firewall.php:217
+#: usr/local/www/system_advanced_misc.php:208
+#: usr/local/www/system_advanced_network.php:184
+#: usr/local/www/system_advanced_notifications.php:153
+#: usr/local/www/system_advanced_sysctl.php:149
+#: usr/local/www/system_advanced_firewall.php:231
+#: usr/local/www/system_advanced_notifications.php:162
+#: usr/local/www/system_advanced_misc.php:234
+#: usr/local/www/system_advanced_misc.php:253
+#: usr/local/www/system_advanced_misc.php:257
+#: usr/local/www/system_advanced_firewall.php:260
+#: usr/local/www/system_advanced_misc.php:304
+#: usr/local/www/system_advanced_admin.php:297
+#: usr/local/www/system_advanced_misc.php:310
+#: usr/local/www/system_advanced_firewall.php:271
+#: usr/local/www/system_advanced_notifications.php:177
+#: usr/local/www/system_advanced_network.php:183
+msgid "Networking"
+msgstr "Rede"
+
+#: usr/local/www/system_advanced_admin.php:277
+#: usr/local/www/system_advanced_firewall.php:218
+#: usr/local/www/system_advanced_misc.php:209
+#: usr/local/www/system_advanced_network.php:185
+#: usr/local/www/system_advanced_notifications.php:154
+#: usr/local/www/system_advanced_sysctl.php:150
+#: usr/local/www/system_advanced_firewall.php:232
+#: usr/local/www/system_advanced_notifications.php:163
+#: usr/local/www/system_advanced_misc.php:235
+#: usr/local/www/system_advanced_misc.php:254
+#: usr/local/www/system_advanced_misc.php:258
+#: usr/local/www/system_advanced_firewall.php:261
+#: usr/local/www/system_advanced_misc.php:305
+#: usr/local/www/system_advanced_admin.php:298
+#: usr/local/www/system_advanced_misc.php:311
+#: usr/local/www/system_advanced_firewall.php:272
+#: usr/local/www/system_advanced_notifications.php:178
+#: usr/local/www/system_advanced_network.php:184
+msgid "Miscellaneous"
+msgstr "Diversos"
+
+#: usr/local/www/system_advanced_admin.php:278
+#: usr/local/www/system_advanced_firewall.php:219
+#: usr/local/www/system_advanced_misc.php:210
+#: usr/local/www/system_advanced_network.php:186
+#: usr/local/www/system_advanced_notifications.php:155
+#: usr/local/www/system_advanced_sysctl.php:151
+#: usr/local/www/system_advanced_firewall.php:233
+#: usr/local/www/system_advanced_notifications.php:164
+#: usr/local/www/system_advanced_misc.php:236
+#: usr/local/www/system_advanced_misc.php:255
+#: usr/local/www/system_advanced_misc.php:259
+#: usr/local/www/system_advanced_firewall.php:262
+#: usr/local/www/system_advanced_misc.php:306
+#: usr/local/www/system_advanced_admin.php:299
+#: usr/local/www/system_advanced_misc.php:312
+#: usr/local/www/system_advanced_firewall.php:273
+#: usr/local/www/system_advanced_notifications.php:179
+#: usr/local/www/system_advanced_network.php:185
+msgid "System Tunables"
+msgstr "Ajustes do sistema"
+
+#: usr/local/www/system_advanced_admin.php:279
+#: usr/local/www/system_advanced_firewall.php:220
+#: usr/local/www/system_advanced_misc.php:211
+#: usr/local/www/system_advanced_network.php:187
+#: usr/local/www/system_advanced_notifications.php:156
+#: usr/local/www/system_advanced_sysctl.php:152
+#: usr/local/www/system_advanced_firewall.php:234
+#: usr/local/www/system_advanced_notifications.php:165
+#: usr/local/www/system_advanced_misc.php:237
+#: usr/local/www/system_advanced_misc.php:256
+#: usr/local/www/system_advanced_misc.php:260
+#: usr/local/www/system_advanced_firewall.php:263
+#: usr/local/www/system_advanced_misc.php:307
+#: usr/local/www/system_advanced_admin.php:300
+#: usr/local/www/system_advanced_misc.php:313
+#: usr/local/www/system_advanced_firewall.php:274
+#: usr/local/www/system_advanced_notifications.php:180
+#: usr/local/www/system_advanced_network.php:186
+msgid "Notifications"
+msgstr "Notificações"
+
+#: usr/local/www/system_advanced_admin.php:297
+#: usr/local/www/system_advanced_admin.php:318
+msgid "webConfigurator"
+msgstr "webConfigurator"
+
+#: usr/local/www/system_advanced_admin.php:317
+#: usr/local/www/system_advanced_admin.php:338
+msgid "No Certificates have been defined. You must"
+msgstr "Nenhum Certificado foi definido. Você deve"
+
+#: usr/local/www/system_advanced_admin.php:318
+#: usr/local/www/system_advanced_admin.php:339
+msgid "Create or Import"
+msgstr "Criar ou Importar"
+
+#: usr/local/www/system_advanced_admin.php:319
+#: usr/local/www/system_advanced_admin.php:340
+msgid "a Certificate before SSL can be enabled."
+msgstr "um Certificado antes de habilitar o SSL."
+
+#: usr/local/www/system_advanced_admin.php:324
+#: usr/local/www/services_captiveportal.php:872
+#: usr/local/www/services_captiveportal.php:874
+#: usr/local/www/services_captiveportal.php:890
+#: usr/local/www/system_advanced_admin.php:345
+msgid "SSL Certificate"
+msgstr "Certificado SSL"
+
+#: usr/local/www/system_advanced_admin.php:339
+#: usr/local/www/system_advanced_admin.php:360
+msgid "TCP port"
+msgstr "Porta TCP"
+
+#: usr/local/www/system_advanced_admin.php:344
+#: usr/local/www/system_advanced_admin.php:365
+msgid "Enter a custom port number for the webConfigurator above if you want to override the default (80 for HTTP, 443 for HTTPS). Changes will take effect immediately after save."
+msgstr "Informe um número de porta personalizado para o webConfigurator acima se desejar sobrescrever o padrão (80 para HTTP, 433 para HTTPS). Mudança terão efeito imediatamente após salvar."
+
+#: usr/local/www/system_advanced_admin.php:351
+#: usr/local/www/system_advanced_admin.php:372
+msgid "Max Processes"
+msgstr "Número máximo de processos"
+
+#: usr/local/www/system_advanced_admin.php:356
+#: usr/local/www/system_advanced_admin.php:377
+msgid "Enter the number of webConfigurator processes you want to run. This defaults to 2. Increasing this will allow more users/browsers to access the GUI concurrently."
+msgstr "Número máximo de processos para o WebConfigurator. O padrão é 2. Aumentando o número, você aumentara o número de usuários simultâneos que poderão logar no WebConfigurator."
+
+#: usr/local/www/system_advanced_admin.php:363
+#: usr/local/www/system_advanced_admin.php:384
+msgid "WebGUI redirect"
+msgstr "Redirecionamento WebGUI"
+
+#: usr/local/www/system_advanced_admin.php:366
+#: usr/local/www/system_advanced_admin.php:387
+msgid "Disable webConfigurator redirect rule"
+msgstr "Desabiliar regra de redirecionamento do webConfigurator"
+
+#: usr/local/www/system_advanced_admin.php:368
+#: usr/local/www/system_advanced_admin.php:389
+msgid "When this is unchecked, access to the webConfigurator is always permitted even on port 80, regardless of the listening port configured. Check this box to disable this automatically added redirect rule. "
+msgstr "Quando isso estiver desmarcado, o acesso ao webConfigurator será sempre permitido mesmo na porta 80, independentemente de qual porta de leitura que estiver configurada. Marque essa caixa para desabilitar essa regra de redirecionamento automaticamente adicionada."
+
+#: usr/local/www/system_advanced_admin.php:375
+#: usr/local/www/system_advanced_admin.php:396
+msgid "WebGUI Login Autocomplete"
+msgstr "Autocompletar Login do WebGUI"
+
+#: usr/local/www/system_advanced_admin.php:378
+#: usr/local/www/system_advanced_admin.php:399
+msgid "Disable webConfigurator login autocomplete"
+msgstr "Desabilitar autocompletar do Login do webConfigurator"
+
+#: usr/local/www/system_advanced_admin.php:380
+#: usr/local/www/system_advanced_admin.php:401
+msgid "When this is unchecked, login credentials for the webConfigurator may be saved by the browser. While convenient, some security standards require this to be disabled. Check this box to disable autocomplete on the login form so that browsers will not prompt to save credentials (NOTE: Some browsers do not respect this option). "
+msgstr "Quando esta estiver desmarcada, credenciais de login para o webConfigurator podem ser salvas pelo navegador. Enquanto conveniente, algumas normas de segurança exigem que este seja desativado. Marque esta caixa para desativar autocomplete no formulário de login para que os navegadores não solicitará para salvar as credenciais (NOTA: Alguns navegadores não respeitam essa opção)"
+
+#: usr/local/www/system_advanced_admin.php:387
+#: usr/local/www/system_advanced_admin.php:408
+msgid "WebGUI login messages"
+msgstr "WebGUI mensagens de login"
+
+#: usr/local/www/system_advanced_admin.php:390
+#: usr/local/www/system_advanced_admin.php:411
+msgid "Disable logging of webConfigurator successful logins"
+msgstr "Desabiliar log de logins efetuados com sucesso no webConfigurator"
+
+#: usr/local/www/system_advanced_admin.php:392
+#: usr/local/www/system_advanced_admin.php:413
+msgid "When this is checked, successful logins to the webConfigurator will not be logged."
+msgstr "Quando esta opção estiver marcada, não haverá log de login com sucesso na interface Web."
+
+#: usr/local/www/system_advanced_admin.php:398
+#: usr/local/www/system_advanced_admin.php:419
+msgid "Anti-lockout"
+msgstr "Anti-lockout"
+
+#: usr/local/www/system_advanced_admin.php:407
+#: usr/local/www/system_advanced_admin.php:428
+msgid "Disable webConfigurator anti-lockout rule"
+msgstr "Desabilitar regra anti-lockout do webConfigurator"
+
+#: usr/local/www/system_advanced_admin.php:409
+#: usr/local/www/system_advanced_admin.php:430
+#, php-format
+msgid "When this is unchecked, access to the webConfigurator on the %s interface is always permitted, regardless of the user-defined firewall rule set. Check this box to disable this automatically added rule, so access to the webConfigurator is controlled by the user-defined firewall rules (ensure you have a firewall rule in place that allows you in, or you will lock yourself out!)"
+msgstr "Quando isso estiver desmarcado, acesso ao webConfigurator na interface %s é sempre permitido, independentemente do conjunto de regras de firewall definido pelo usuário. Maque essa opção para desabilitar essa regra automaticamente adicionada, para que o acesso ao webConfigurator seja controlado pelas regras de firewall definidas pelo usuário (tenha certeza de que possui uma regra de firewall que lhe dá permissão de acesso, ou você não conseguirá mais o acesso!)"
+
+#: usr/local/www/system_advanced_admin.php:415
+#: usr/local/www/system_advanced_admin.php:436
+msgid "Hint: the &quot;Set interface(s) IP address&quot; option in the console menu resets this setting as well."
+msgstr "Dica: a opção &quot;Configure o endereço IP de interface(s)&quot; no menu do console reinicia essa configuração da mesma forma."
+
+#: usr/local/www/system_advanced_admin.php:419
+#: usr/local/www/system_advanced_admin.php:440
+msgid "DNS Rebind Check"
+msgstr "Verificação de DNS Rebind"
+
+#: usr/local/www/system_advanced_admin.php:422
+#: usr/local/www/system_advanced_admin.php:443
+msgid "Disable DNS Rebinding Checks"
+msgstr "Desabilitar Verificação DNS Rebinding"
+
+#: usr/local/www/system_advanced_admin.php:424
+#: usr/local/www/system_advanced_admin.php:445
+msgid "When this is unchecked, your system is protected against <a href=\"http://en.wikipedia.org/wiki/DNS_rebinding\">DNS Rebinding attacks</a>. This blocks private IP responses from your configured DNS servers. Check this box to disable this protection if it interferes with webConfigurator access or name resolution in your environment. "
+msgstr "Quando isso estiver desmarcado, acesso ao webConfigurator é protegido contra <a href=\"http://en.wikipedia.org/wiki/DNS_rebinding\">Ataques de DNS Rebinding</a>. Isto bloqueia respostas de IPs privados de seu servidor DNS. Marque essa opção para desabilitar essa proteção se você achar que ela interfere no acesso do webConfigurator em alguns casos."
+
+#: usr/local/www/system_advanced_admin.php:431
+#: usr/local/www/system_advanced_admin.php:452
+msgid "Alternate Hostnames"
+msgstr "Nomes de host alternativo"
+
+#: usr/local/www/system_advanced_admin.php:435
+#: usr/local/www/system_advanced_admin.php:456
+msgid "Alternate Hostnames for DNS Rebinding and HTTP_REFERER Checks"
+msgstr "Alternar Nomes de host por DNS Rebinding e checagem de HTTP_REFERER"
+
+#: usr/local/www/system_advanced_admin.php:437
+#: usr/local/www/system_advanced_admin.php:458
+msgid "Here you can specify alternate hostnames by which the router may be queried, to bypass the DNS Rebinding Attack checks. Separate hostnames with spaces."
+msgstr "Aqui você especifica nomes de hosts alternativos pelos quais o roteador pode ser colocado em fila, para evitar verificações de ataques de DNS Bindings. Separe os nomes dos hosts com espaços."
+
+#: usr/local/www/system_advanced_admin.php:442
+#: usr/local/www/system_advanced_admin.php:463
+msgid "Browser HTTP_REFERER enforcement"
+msgstr "Execução de HTTP_REFERER de navegação"
+
+#: usr/local/www/system_advanced_admin.php:445
+#: usr/local/www/system_advanced_admin.php:466
+msgid "Disable HTTP_REFERER enforcement check"
+msgstr "Desabilitar verificação de execução de HTTP_REFERER"
+
+#: usr/local/www/system_advanced_admin.php:447
+msgid "When this is unchecked, access to the webConfigurator is protected against HTTP_REFERER redirection attempts. Check this box to disable this protection if you find that it interferes with webConfigurator access in certain corner cases such as using external scripts to interact with this system. More information on HTTP_REFERER is available from <a target='_new' href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."
+msgstr "Quando isso não estiver marcado, acesso ao webConfigurator está protegido contra tentativas de redirecionamento HTTP_REFERER. Marque essa caixa para desabilitar essa proteção se achar que isso interfere com o acesso ao webConfigurator em alguns casos específicos tais como quando usando scripts de terceiros para interagir com o pfSense. Mais informações sobre HTTP_REFERER estão disponíveis em <a target='_new' href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."
+
+#: usr/local/www/system_advanced_admin.php:457
+#: usr/local/www/system_advanced_admin.php:494
+msgid "Secure Shell"
+msgstr "Secure Shell"
+
+#: usr/local/www/system_advanced_admin.php:460
+#: usr/local/www/system_advanced_admin.php:497
+msgid "Secure Shell Server"
+msgstr "Servidor de Secure Shell"
+
+#: usr/local/www/system_advanced_admin.php:463
+#: usr/local/www/system_advanced_admin.php:500
+msgid "Enable Secure Shell"
+msgstr "Habilitar Secure Shell"
+
+#: usr/local/www/system_advanced_admin.php:467
+#: usr/local/www/system_advanced_admin.php:504
+msgid "Authentication Method"
+msgstr "Método de Autenticação"
+
+#: usr/local/www/system_advanced_admin.php:470
+msgid "Disable password login for Secure Shell (RSA key only)"
+msgstr "Desabilitar login com senha para Secure Shell (somente chave RSA)"
+
+#: usr/local/www/system_advanced_admin.php:472
+#: usr/local/www/system_advanced_admin.php:509
+msgid "When enabled, authorized keys need to be configured for each"
+msgstr "Quando desabilitado, chaves autorizadas precisam ser configuradas para cada"
+
+#: usr/local/www/system_advanced_admin.php:473
+#: usr/local/www/system_advanced_admin.php:510
+msgid "user"
+msgstr "usuário"
+
+#: usr/local/www/system_advanced_admin.php:474
+#: usr/local/www/system_advanced_admin.php:511
+msgid "that has been granted secure shell access."
+msgstr "foi concedido acesso ao secure shell."
+
+#: usr/local/www/system_advanced_admin.php:478
+#: usr/local/www/system_advanced_admin.php:515
+msgid "SSH port"
+msgstr "Porta SSH"
+
+#: usr/local/www/system_advanced_admin.php:482
+#: usr/local/www/system_advanced_admin.php:519
+msgid "Note: Leave this blank for the default of 22."
+msgstr "Nota: Deixe isso em branco para usar o padrão de 22."
+
+#: usr/local/www/system_advanced_admin.php:489
+#: usr/local/www/system_advanced_admin.php:526
+msgid "Serial Communcations"
+msgstr "Comunicações Seriais"
+
+#: usr/local/www/system_advanced_admin.php:493
+#: usr/local/www/system_advanced_admin.php:530
+msgid "Serial Terminal"
+msgstr "Terminal Serial"
+
+#: usr/local/www/system_advanced_admin.php:496
+#: usr/local/www/system_advanced_admin.php:533
+msgid "Enables the first serial port with 9600/8/N/1 by default, or another speed selectable below."
+msgstr "Habilita a primeira porta serial para 9600/8/N/1 por padrão, o outra velocidade selecionável abaixo."
+
+#: usr/local/www/system_advanced_admin.php:497
+#: usr/local/www/system_advanced_admin.php:534
+msgid "Note: This will redirect the console output and messages to the serial port. You can still access the console menu from the internal video card/keyboard. A <b>null modem</b> serial cable or adapter is required to use the serial console."
+msgstr "Nota: Isto irá redirecionar a saída do console e mensagens para a porta serial. VOcê pode permanecer acessando o menu console de um monitor cartão/teclado. Um cabo serial <b>null modem</b> ou adaptador são requeridos para uso do console serial."
+
+#: usr/local/www/system_advanced_admin.php:502
+#: usr/local/www/system_advanced_admin.php:539
+msgid "Serial Speed"
+msgstr "Velocidade da porta serial"
+
+#: usr/local/www/system_advanced_admin.php:512
+#: usr/local/www/system_advanced_admin.php:549
+msgid "Allows selection of different speeds for the serial console port."
+msgstr "Possibilita selecionar diferentes velocidades para a porta serial do console."
+
+#: usr/local/www/system_advanced_admin.php:519
+#: usr/local/www/system_advanced_admin.php:556
+msgid "Console Options"
+msgstr "Opções de Console"
+
+#: usr/local/www/system_advanced_admin.php:522
+#: usr/local/www/system_advanced_admin.php:559
+msgid "Console menu"
+msgstr "Menu do Console"
+
+#: usr/local/www/system_advanced_admin.php:525
+#: usr/local/www/system_advanced_admin.php:562
+msgid "Password protect the console menu"
+msgstr "Proteger menu do console com senha"
+
+#: usr/local/www/system_advanced_admin.php:527
+#: usr/local/www/system_advanced_admin.php:564
+msgid "Changes to this option will take effect after a reboot."
+msgstr "Alterações nesta opção terão efeito após reboot."
+
+#: usr/local/www/system_advanced_admin.php:564
+#: usr/local/www/system_advanced_admin.php:601
+msgid "secure shell configuration has changed. Stopping sshd."
+msgstr "configuração de secure shell foi modificada. Interrompendo sshd."
+
+#: usr/local/www/system_advanced_admin.php:567
+#: usr/local/www/system_advanced_admin.php:604
+msgid "secure shell configuration has changed. Restarting sshd."
+msgstr "configuração de secure shell foi modificada. Reiniciando sshd."
+
+#: usr/local/www/system_advanced_admin.php:574
+#: usr/local/www/diag_logs_settings.php:153
+#: usr/local/www/system_advanced_admin.php:611
+msgid "webConfigurator configuration has changed. Restarting webConfigurator."
+msgstr "configuração do webConfigurator foi modificada. Reiniciando webConfigurator."
+
+#: usr/local/www/system_advanced_firewall.php:78
+#: usr/local/www/system_advanced_firewall.php:77
+#: usr/local/www/system_advanced_firewall.php:88
+#: usr/local/www/system_advanced_firewall.php:90
+msgid "The Firewall Maximum States value must be an integer."
+msgstr "O valor de estado máximo do Firewall deve ser um inteiro."
+
+#: usr/local/www/system_advanced_firewall.php:81
+#: usr/local/www/system_advanced_firewall.php:83
+#: usr/local/www/system_advanced_firewall.php:94
+#: usr/local/www/system_advanced_firewall.php:99
+msgid "The Firewall Maximum Table Entries value must be an integer."
+msgstr "O valor máximo das entradas da tabela do Firewall deve ser um inteiro."
+
+#: usr/local/www/system_advanced_firewall.php:84
+#: usr/local/www/system_advanced_firewall.php:86
+#: usr/local/www/system_advanced_firewall.php:97
+#: usr/local/www/system_advanced_firewall.php:102
+msgid "The TCP idle timeout must be an integer."
+msgstr "O tempo ocioso TCP deve ser um inteiro."
+
+#: usr/local/www/system_advanced_firewall.php:87
+#: usr/local/www/system_advanced_firewall.php:89
+#: usr/local/www/system_advanced_firewall.php:100
+#: usr/local/www/system_advanced_firewall.php:105
+msgid "The Reflection timeout must be an integer."
+msgstr "O tempo de expiração de Reflection deve ser um inteiro."
+
+#: usr/local/www/system_advanced_firewall.php:178
+#: usr/local/www/system_advanced_firewall.php:192
+#: usr/local/www/system_advanced_firewall.php:221
+#: usr/local/www/system_advanced_firewall.php:232
+msgid "Advanced: Firewall and NAT"
+msgstr "Avançado: Firewall e NAT"
+
+#: usr/local/www/system_advanced_firewall.php:190
+#: usr/local/www/system_advanced_firewall.php:204
+#: usr/local/www/system_advanced_firewall.php:233
+#: usr/local/www/system_advanced_firewall.php:244
+msgid "as the name says, it's the normal optimization algorithm"
+msgstr "como o nome diz, é o algoritmo de otimização normal"
+
+#: usr/local/www/system_advanced_firewall.php:191
+#: usr/local/www/system_advanced_firewall.php:205
+#: usr/local/www/system_advanced_firewall.php:234
+#: usr/local/www/system_advanced_firewall.php:245
+msgid "used for high latency links, such as satellite links. Expires idle connections later than default"
+msgstr "usado para links de latência alta, como os links satélites. Expira conexões ociosas mais tarde que o padrão"
+
+#: usr/local/www/system_advanced_firewall.php:192
+#: usr/local/www/system_advanced_firewall.php:206
+msgid "expires idle connections quicker. More efficient use of CPU and memory but can drop legitimate connections"
+msgstr "expira conexões ociosas mais rápido. Faz uso mais eficiente da CPU e da memória mas pode derrubar conexões legítimas"
+
+#: usr/local/www/system_advanced_firewall.php:193
+#: usr/local/www/system_advanced_firewall.php:207
+msgid "tries to avoid dropping any legitimate connections at the expense of increased memory usage and CPU utilization."
+msgstr "tenta evitar queda de qualquer conexão legítima às custas do uso de memória e utilização de CPU."
+
+#: usr/local/www/system_advanced_firewall.php:239
+#: usr/local/www/system_advanced_firewall.php:253
+#: usr/local/www/system_advanced_firewall.php:282
+#: usr/local/www/system_advanced_firewall.php:281
+#: usr/local/www/system_advanced_firewall.php:292
+msgid "Firewall Advanced"
+msgstr "Firewall Avançado"
+
+#: usr/local/www/system_advanced_firewall.php:242
+#: usr/local/www/system_advanced_firewall.php:256
+#: usr/local/www/system_advanced_firewall.php:285
+#: usr/local/www/system_advanced_firewall.php:284
+#: usr/local/www/system_advanced_firewall.php:295
+msgid "IP Do-Not-Fragment compatibility"
+msgstr "Compatibilidade com IP Do-Not-Fragment"
+
+#: usr/local/www/system_advanced_firewall.php:245
+#: usr/local/www/system_advanced_firewall.php:259
+#: usr/local/www/system_advanced_firewall.php:288
+#: usr/local/www/system_advanced_firewall.php:287
+#: usr/local/www/system_advanced_firewall.php:298
+msgid "Clear invalid DF bits instead of dropping the packets"
+msgstr "Limpar bits DF inválidos ao invés de descartar os pacotes"
+
+#: usr/local/www/system_advanced_firewall.php:246
+#: usr/local/www/system_advanced_firewall.php:260
+#: usr/local/www/system_advanced_firewall.php:289
+#: usr/local/www/system_advanced_firewall.php:288
+#: usr/local/www/system_advanced_firewall.php:299
+msgid "This allows for communications with hosts that generate fragmented packets with the don't fragment (DF) bit set. Linux NFS is known to do this. This will cause the filter to not drop such packets but instead clear the don't fragment bit."
+msgstr "Isso dá permissão para comunicações com hosts que geram pacotes fragmentados com o conjunto de bits don't fragment (DF). Linux NFS é conhecido por isso. Isso irá fazer com que o filtro não descarte tais pacotes mas, ao invés disso, limpará o bit don't fragment."
+
+#: usr/local/www/system_advanced_firewall.php:253
+#: usr/local/www/system_advanced_firewall.php:267
+#: usr/local/www/system_advanced_firewall.php:296
+#: usr/local/www/system_advanced_firewall.php:295
+#: usr/local/www/system_advanced_firewall.php:306
+msgid "IP Random id generation"
+msgstr "Geração de id Randômico de IP"
+
+#: usr/local/www/system_advanced_firewall.php:256
+#: usr/local/www/system_advanced_firewall.php:270
+#: usr/local/www/system_advanced_firewall.php:299
+#: usr/local/www/system_advanced_firewall.php:298
+#: usr/local/www/system_advanced_firewall.php:309
+msgid "Insert a stronger id into IP header of packets passing through the filter."
+msgstr "Inserir o id mais forte no cabeçalho IP dos pacotes que passam no filtro."
+
+#: usr/local/www/system_advanced_firewall.php:257
+#: usr/local/www/system_advanced_firewall.php:271
+#: usr/local/www/system_advanced_firewall.php:300
+#: usr/local/www/system_advanced_firewall.php:299
+#: usr/local/www/system_advanced_firewall.php:310
+msgid "Replaces the IP identification field of packets with random values to compensate for operating systems that use predictable values. This option only applies to packets that are not fragmented after the optional packet reassembly."
+msgstr "Substitui o campo de identificação do IP de pacotes com valores randômicos para compensar por sistemas operacionais que usam valores previsíveis. Essa opção somente se aplica a pacotes que não estão fragmentados após a remontagem opcional de pacote."
+
+#: usr/local/www/system_advanced_firewall.php:264
+#: usr/local/www/system_advanced_firewall.php:278
+#: usr/local/www/system_advanced_firewall.php:307
+#: usr/local/www/system_advanced_firewall.php:306
+#: usr/local/www/system_advanced_firewall.php:317
+msgid "Firewall Optimization Options"
+msgstr "Opções de Otimização do Firewall"
+
+#: usr/local/www/system_advanced_firewall.php:267
+#: usr/local/www/system_advanced_firewall.php:281
+#: usr/local/www/system_advanced_firewall.php:310
+#: usr/local/www/system_advanced_firewall.php:309
+#: usr/local/www/system_advanced_firewall.php:320
+msgid "normal"
+msgstr "normal"
+
+#: usr/local/www/system_advanced_firewall.php:268
+#: usr/local/www/system_advanced_firewall.php:282
+#: usr/local/www/system_advanced_firewall.php:311
+#: usr/local/www/system_advanced_firewall.php:310
+#: usr/local/www/system_advanced_firewall.php:321
+msgid "high-latency"
+msgstr "alta-latência"
+
+#: usr/local/www/system_advanced_firewall.php:269
+#: usr/local/www/system_advanced_firewall.php:283
+#: usr/local/www/system_advanced_firewall.php:312
+#: usr/local/www/system_advanced_firewall.php:311
+#: usr/local/www/system_advanced_firewall.php:322
+msgid "aggressive"
+msgstr "agressivo"
+
+#: usr/local/www/system_advanced_firewall.php:270
+#: usr/local/www/system_advanced_firewall.php:284
+#: usr/local/www/system_advanced_firewall.php:313
+#: usr/local/www/system_advanced_firewall.php:312
+#: usr/local/www/system_advanced_firewall.php:323
+msgid "conservative"
+msgstr "conservador"
+
+#: usr/local/www/system_advanced_firewall.php:278
+#: usr/local/www/system_advanced_firewall.php:292
+#: usr/local/www/system_advanced_firewall.php:321
+#: usr/local/www/system_advanced_firewall.php:322
+#: usr/local/www/system_advanced_firewall.php:333
+msgid "Select the type of state table optimization to use"
+msgstr "Selecione o tipo de otimização de tabela de estado a ser usado"
+
+#: usr/local/www/system_advanced_firewall.php:282
+#: usr/local/www/system_advanced_firewall.php:296
+#: usr/local/www/system_advanced_firewall.php:325
+#: usr/local/www/system_advanced_firewall.php:326
+#: usr/local/www/system_advanced_firewall.php:337
+msgid "Disable Firewall"
+msgstr "Desabilitar Firewall"
+
+#: usr/local/www/system_advanced_firewall.php:285
+#: usr/local/www/system_advanced_firewall.php:299
+#: usr/local/www/system_advanced_firewall.php:328
+#: usr/local/www/system_advanced_firewall.php:329
+#: usr/local/www/system_advanced_firewall.php:340
+msgid "Disable all packet filtering."
+msgstr "Desabilitar todos os filtros de pacotes."
+
+#: usr/local/www/system_advanced_firewall.php:287
+#: usr/local/www/system_advanced_firewall.php:301
+#: usr/local/www/system_advanced_firewall.php:330
+#: usr/local/www/system_advanced_firewall.php:331
+#: usr/local/www/system_advanced_firewall.php:342
+#, php-format
+msgid "Note: This converts %s into a routing only platform!"
+msgstr "Nota: Isso converte %s em uma plataforma de roteamento somente!"
+
+#: usr/local/www/system_advanced_firewall.php:288
+#: usr/local/www/system_advanced_firewall.php:302
+#: usr/local/www/system_advanced_firewall.php:331
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/system_advanced_firewall.php:343
+msgid "Note: This will also turn off NAT!"
+msgstr "Nota: Isso também irá desligar o NAT!"
+
+#: usr/local/www/system_advanced_firewall.php:289
+#: usr/local/www/system_advanced_firewall.php:303
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/system_advanced_firewall.php:333
+#: usr/local/www/system_advanced_firewall.php:344
+msgid "If you only want to disable NAT, and not firewall rules, visit the"
+msgstr "Se você quer desabilitar o NAT, e não regras de firewall, visite o"
+
+#: usr/local/www/system_advanced_firewall.php:289
+#: usr/local/www/system_advanced_firewall.php:303
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/system_advanced_firewall.php:333
+#: usr/local/www/system_advanced_firewall.php:344
+msgid "Outbound NAT"
+msgstr "NAT de saída"
+
+#: usr/local/www/system_advanced_firewall.php:294
+#: usr/local/www/system_advanced_firewall.php:308
+#: usr/local/www/system_advanced_firewall.php:337
+#: usr/local/www/system_advanced_firewall.php:338
+#: usr/local/www/system_advanced_firewall.php:349
+msgid "Disable Firewall Scrub"
+msgstr "Desabilitar Firewall Scrub"
+
+#: usr/local/www/system_advanced_firewall.php:297
+#: usr/local/www/system_advanced_firewall.php:311
+#: usr/local/www/system_advanced_firewall.php:340
+#: usr/local/www/system_advanced_firewall.php:341
+#: usr/local/www/system_advanced_firewall.php:352
+msgid "Disables the PF scrubbing option which can sometimes interfere with NFS and PPTP traffic."
+msgstr "Desabilita a opção de PF scrubbing que pode, às vezes, interferir com o NFS e tráfego PPTP."
+
+#: usr/local/www/system_advanced_firewall.php:302
+#: usr/local/www/system_advanced_firewall.php:316
+#: usr/local/www/system_advanced_firewall.php:360
+#: usr/local/www/system_advanced_firewall.php:361
+#: usr/local/www/system_advanced_firewall.php:372
+msgid "Firewall Maximum States"
+msgstr "Estados Máximos do Firewall"
+
+#: usr/local/www/system_advanced_firewall.php:306
+#: usr/local/www/system_advanced_firewall.php:320
+#: usr/local/www/system_advanced_firewall.php:364
+#: usr/local/www/system_advanced_firewall.php:365
+#: usr/local/www/system_advanced_firewall.php:376
+msgid "Maximum number of connections to hold in the firewall state table."
+msgstr "Número máximo de conexões para manter na table de estado do firewall."
+
+#: usr/local/www/system_advanced_firewall.php:308
+#: usr/local/www/system_advanced_firewall.php:322
+#: usr/local/www/system_advanced_firewall.php:366
+#: usr/local/www/system_advanced_firewall.php:367
+#: usr/local/www/system_advanced_firewall.php:378
+msgid "Note: Leave this blank for the default. On your system the default size is:"
+msgstr "Nota: Deixe em branco para o padrão. No seu sistema o tamanho padrão é:"
+
+#: usr/local/www/system_advanced_firewall.php:312
+#: usr/local/www/system_advanced_firewall.php:342
+#: usr/local/www/system_advanced_firewall.php:386
+#: usr/local/www/system_advanced_firewall.php:387
+#: usr/local/www/system_advanced_firewall.php:398
+msgid "Firewall Maximum Table Entries"
+msgstr "Máximo de Entradas da Tabela do Firewall"
+
+#: usr/local/www/system_advanced_firewall.php:316
+#: usr/local/www/system_advanced_firewall.php:346
+#: usr/local/www/system_advanced_firewall.php:390
+#: usr/local/www/system_advanced_firewall.php:391
+#: usr/local/www/system_advanced_firewall.php:402
+msgid "Maximum number of table entries for systems such as aliases, sshlockout, snort, etc, combined."
+msgstr "Número máximo de entradas da tabela para sistema tais como aliases, sshlockout, snort, etc, combinados."
+
+#: usr/local/www/system_advanced_firewall.php:319
+#: usr/local/www/system_advanced_firewall.php:334
+#: usr/local/www/system_advanced_firewall.php:349
+#: usr/local/www/system_advanced_firewall.php:378
+#: usr/local/www/system_advanced_firewall.php:393
+#: usr/local/www/system_advanced_firewall.php:379
+#: usr/local/www/system_advanced_firewall.php:394
+#: usr/local/www/system_advanced_firewall.php:390
+#: usr/local/www/system_advanced_firewall.php:405
+msgid "Note: Leave this blank for the default."
+msgstr "Nota: Deixe isso em branco para o padrão."
+
+#: usr/local/www/system_advanced_firewall.php:321
+#: usr/local/www/system_advanced_firewall.php:336
+#: usr/local/www/system_advanced_firewall.php:351
+#: usr/local/www/system_advanced_firewall.php:380
+#: usr/local/www/system_advanced_firewall.php:395
+#: usr/local/www/system_advanced_firewall.php:381
+#: usr/local/www/system_advanced_firewall.php:396
+#: usr/local/www/system_advanced_firewall.php:392
+#: usr/local/www/system_advanced_firewall.php:407
+msgid "On your system the default size is:"
+msgstr "Em seu sistema o tamanho padrão é:"
+
+#: usr/local/www/system_advanced_firewall.php:327
+#: usr/local/www/system_advanced_firewall.php:357
+#: usr/local/www/system_advanced_firewall.php:401
+#: usr/local/www/system_advanced_firewall.php:402
+#: usr/local/www/system_advanced_firewall.php:413
+msgid "Static route filtering"
+msgstr "Filtragem de rota estática"
+
+#: usr/local/www/system_advanced_firewall.php:330
+#: usr/local/www/system_advanced_firewall.php:360
+#: usr/local/www/system_advanced_firewall.php:404
+#: usr/local/www/system_advanced_firewall.php:405
+#: usr/local/www/system_advanced_firewall.php:416
+msgid "Bypass firewall rules for traffic on the same interface"
+msgstr "Evitar regras de firewall para tráfego na mesma interface"
+
+#: usr/local/www/system_advanced_firewall.php:332
+#: usr/local/www/system_advanced_firewall.php:362
+#: usr/local/www/system_advanced_firewall.php:406
+#: usr/local/www/system_advanced_firewall.php:407
+#: usr/local/www/system_advanced_firewall.php:418
+msgid "This option only applies if you have defined one or more static routes. If it is enabled, traffic that enters and leaves through the same interface will not be checked by the firewall. This may be desirable in some situations where multiple subnets are connected to the same interface."
+msgstr "Essa opção somente se aplica se você definiu uma ou mais rotas estáticas. Se estiver habilitada, o tráfego que entra e sai da mesma interface não será verificado pelo firewall. Isso pode ser desejável em algumas situações onde múltiplas redes estão conectadas na mesma interface."
+
+#: usr/local/www/system_advanced_firewall.php:342
+#: usr/local/www/system_advanced_firewall.php:372
+#: usr/local/www/system_advanced_firewall.php:416
+#: usr/local/www/system_advanced_firewall.php:417
+#: usr/local/www/system_advanced_firewall.php:428
+msgid "Disable all auto-added VPN rules."
+msgstr "Desabilita as regras VPN auto-adicionadas."
+
+#: usr/local/www/system_advanced_firewall.php:344
+#: usr/local/www/system_advanced_firewall.php:374
+#: usr/local/www/system_advanced_firewall.php:418
+#: usr/local/www/system_advanced_firewall.php:419
+#: usr/local/www/system_advanced_firewall.php:430
+msgid "Note: This disables automatically added rules for IPsec, PPTP."
+msgstr "Nota: Isso desativa automaticamente as regras adicionadas de IPsec, PPTP."
+
+#: usr/local/www/system_advanced_firewall.php:352
+#: usr/local/www/system_advanced_firewall.php:382
+#: usr/local/www/system_advanced_firewall.php:426
+#: usr/local/www/system_advanced_firewall.php:427
+#: usr/local/www/system_advanced_firewall.php:438
+msgid "Disable reply-to on WAN rules"
+msgstr "Desabilitar reply-to nas regras WAN"
+
+#: usr/local/www/system_advanced_firewall.php:354
+#: usr/local/www/system_advanced_firewall.php:384
+#: usr/local/www/system_advanced_firewall.php:428
+#: usr/local/www/system_advanced_firewall.php:429
+#: usr/local/www/system_advanced_firewall.php:440
+msgid "With Multi-WAN you generally want to ensure traffic leaves the same interface it arrives on, hence reply-to is added automatically by default. When using bridging, you must disable this behavior if the WAN gateway IP is different from the gateway IP of the hosts behind the bridged interface."
+msgstr "Com Multi-WAN você geralmente quer garantir que o tráfego saia pela mesmas interface pode onde ele chegou, portanto, reply-to é automaticamente adicionado por padrão. Quando utilizando bridge, você precisa desabilitar este comportamento se o IP do gateway da WAN é diferente do IP do gateway dos hosts atrás da inteface bridge."
+
+#: usr/local/www/system_advanced_firewall.php:364
+#: usr/local/www/system_advanced_firewall.php:404
+#: usr/local/www/system_advanced_firewall.php:466
+#: usr/local/www/system_advanced_firewall.php:467
+#: usr/local/www/system_advanced_firewall.php:488
+msgid "Network Address Translation"
+msgstr "Tradução de Endereço de Rede"
+
+#: usr/local/www/system_advanced_firewall.php:367
+msgid "Disable NAT Reflection for port forwards"
+msgstr "Desabilitar NAT Reflection para encaminhamentos de portas"
+
+#: usr/local/www/system_advanced_firewall.php:370
+msgid "Disables the automatic creation of additional NAT redirect rules for access to port forwards on your external IP addresses from within your internal networks. Note: Reflection for port forward entries is skipped for ranges larger than 500 ports."
+msgstr "Desabilita a criação automática de regras de redirecionamento NAT adicionais para acesso a encaminhamento de portas para seu endereço IP externo de dentro de suas redes internas. Nota: Reflection para entradas de encaminhamento de porta não é feito para intervalos maiores que 500 portas."
+
+#: usr/local/www/system_advanced_firewall.php:374
+#: usr/local/www/system_advanced_firewall.php:425
+#: usr/local/www/system_advanced_firewall.php:487
+#: usr/local/www/system_advanced_firewall.php:488
+#: usr/local/www/system_advanced_firewall.php:509
+msgid "Reflection Timeout"
+msgstr "Tempo de expiração de Reflection"
+
+#: usr/local/www/system_advanced_firewall.php:377
+msgid "Enter value for Reflection timeout in seconds. Note: Only applies to Reflection on port forwards."
+msgstr "Informe o valor para tempo de expiração de Reflection em segundos. Nota: Somente se aplica a Reflection em encaminhamentos de porta."
+
+#: usr/local/www/system_advanced_firewall.php:381
+msgid "Disable NAT Reflection for 1:1 NAT"
+msgstr "Desabilitar NAT Reflection para 1:1 NAT"
+
+#: usr/local/www/system_advanced_firewall.php:384
+msgid "Disables the automatic creation of additional NAT 1:1 mappings for access to 1:1 mappings of your external IP addresses from within your internal networks. Note: Reflection for 1:1 NAT might not fully work in certain complex routing scenarios."
+msgstr "Desabilita a criação automática de mapeamentos NAT 1:1 adicionais para acessar os mapeamentos 1:1 de seus endereços IP externos de dentro de sua rede interna. Nota: Reflection para 1:1 NAT pode não funcionar totalmente em certos cenários de roteamento complexos."
+
+#: usr/local/www/system_advanced_firewall.php:391
+#: usr/local/www/system_advanced_firewall.php:448
+#: usr/local/www/system_advanced_firewall.php:510
+#: usr/local/www/system_advanced_firewall.php:511
+#: usr/local/www/system_advanced_firewall.php:532
+msgid "Automatically create outbound NAT rules which assist inbound NAT rules that direct traffic back out to the same subnet it originated from."
+msgstr "Regra de saída NAT criada automaticamente que assistem regras de entrada para direcionar o trágefo de volta à mesma sub-rede que a originou."
+
+#: usr/local/www/system_advanced_firewall.php:393
+msgid "Currently only applies to 1:1 NAT rules. Required for full functionality of NAT Reflection for 1:1 NAT."
+msgstr "Atualmente só aplicado a regras NAT 1:1. Requerido para funcionalidade total da Reflexão de NAT para NAT 1:1."
+
+#: usr/local/www/system_advanced_firewall.php:397
+#: usr/local/www/system_advanced_firewall.php:456
+#: usr/local/www/system_advanced_firewall.php:518
+#: usr/local/www/system_advanced_firewall.php:519
+#: usr/local/www/system_advanced_firewall.php:540
+msgid "TFTP Proxy"
+msgstr "TFTP Proxy"
+
+#: usr/local/www/system_advanced_firewall.php:407
+#: usr/local/www/system_advanced_firewall.php:466
+#: usr/local/www/system_advanced_firewall.php:528
+#: usr/local/www/system_advanced_firewall.php:529
+#: usr/local/www/system_advanced_firewall.php:550
+msgid "Choose the interfaces where you want TFTP proxy helper to be enabled."
+msgstr "Escolha as interfaces onde deseja habilitar o TFTP proxy helper."
+
+#: usr/local/www/system_advanced_misc.php:179
+#: usr/local/www/system_advanced_misc.php:199
+#: usr/local/www/system_advanced_misc.php:218
+#: usr/local/www/system_advanced_misc.php:222
+#: usr/local/www/system_advanced_misc.php:254
+#: usr/local/www/system_advanced_misc.php:260
+msgid "Advanced: Miscellaneous"
+msgstr "Avançado: Diversos"
+
+#: usr/local/www/system_advanced_misc.php:229
+#: usr/local/www/system_advanced_misc.php:255
+#: usr/local/www/system_advanced_misc.php:274
+#: usr/local/www/system_advanced_misc.php:278
+#: usr/local/www/system_advanced_misc.php:325
+#: usr/local/www/system_advanced_misc.php:331
+msgid "Proxy support"
+msgstr "Suporte a Proxy"
+
+#: usr/local/www/system_advanced_misc.php:232
+#: usr/local/www/system_advanced_misc.php:258
+#: usr/local/www/system_advanced_misc.php:277
+#: usr/local/www/system_advanced_misc.php:281
+#: usr/local/www/system_advanced_misc.php:328
+#: usr/local/www/system_advanced_misc.php:334
+msgid "Proxy URL"
+msgstr "URL do Proxy"
+
+#: usr/local/www/system_advanced_misc.php:236
+#: usr/local/www/system_advanced_misc.php:262
+#: usr/local/www/system_advanced_misc.php:281
+#: usr/local/www/system_advanced_misc.php:285
+#: usr/local/www/system_advanced_misc.php:332
+#: usr/local/www/system_advanced_misc.php:338
+#, php-format
+msgid "Proxy url for allowing %s to use this proxy to connect outside."
+msgstr "Url de proxy para permitir %s para usar este proxy para se conectar de fora."
+
+#: usr/local/www/system_advanced_misc.php:240
+#: usr/local/www/system_advanced_misc.php:266
+#: usr/local/www/system_advanced_misc.php:285
+#: usr/local/www/system_advanced_misc.php:289
+#: usr/local/www/system_advanced_misc.php:336
+#: usr/local/www/system_advanced_misc.php:342
+msgid "Proxy Port"
+msgstr "Porta do Proxy"
+
+#: usr/local/www/system_advanced_misc.php:244
+#: usr/local/www/system_advanced_misc.php:270
+#: usr/local/www/system_advanced_misc.php:289
+#: usr/local/www/system_advanced_misc.php:293
+#: usr/local/www/system_advanced_misc.php:340
+#: usr/local/www/system_advanced_misc.php:346
+#, php-format
+msgid "Proxy port to use when %s connects to the proxy URL configured above. Default is 8080 for http protocol or 443 for ssl."
+msgstr "Porta de proxy para usar quando %s se conecta à URL do proxy configurado acima. Padrão é 8080 para o protocolo HTTP ou 443 para SSL."
+
+#: usr/local/www/system_advanced_misc.php:248
+#: usr/local/www/system_advanced_misc.php:274
+#: usr/local/www/system_advanced_misc.php:293
+#: usr/local/www/system_advanced_misc.php:297
+#: usr/local/www/system_advanced_misc.php:344
+#: usr/local/www/system_advanced_misc.php:350
+msgid "Proxy Username"
+msgstr "Usuário Proxy"
+
+#: usr/local/www/system_advanced_misc.php:252
+#: usr/local/www/system_advanced_misc.php:278
+#: usr/local/www/system_advanced_misc.php:297
+#: usr/local/www/system_advanced_misc.php:301
+#: usr/local/www/system_advanced_misc.php:348
+#: usr/local/www/system_advanced_misc.php:354
+#, php-format
+msgid "Proxy username for allowing %s to use this proxy to connect outside"
+msgstr "Nome de usuário de Proxy para permitir %s para usar este proxy para se conectar fora"
+
+#: usr/local/www/system_advanced_misc.php:256
+#: usr/local/www/system_advanced_misc.php:282
+#: usr/local/www/system_advanced_misc.php:301
+#: usr/local/www/system_advanced_misc.php:305
+#: usr/local/www/system_advanced_misc.php:352
+#: usr/local/www/system_advanced_misc.php:358
+msgid "Proxy Pass"
+msgstr "Proxy Pass"
+
+#: usr/local/www/system_advanced_misc.php:260
+#: usr/local/www/system_advanced_misc.php:286
+#: usr/local/www/system_advanced_misc.php:305
+#: usr/local/www/system_advanced_misc.php:309
+#: usr/local/www/system_advanced_misc.php:356
+#: usr/local/www/system_advanced_misc.php:362
+#, php-format
+msgid "Proxy password for allowing %s to use this proxy to connect outside"
+msgstr "Senha do proxy para permitir %s para usar esse proxy para se conectar fora"
+
+#: usr/local/www/system_advanced_misc.php:264
+#: usr/local/www/system_advanced_misc.php:267
+#: usr/local/www/system_advanced_misc.php:282
+#: usr/local/www/system_advanced_misc.php:290
+#: usr/local/www/system_advanced_misc.php:293
+#: usr/local/www/system_advanced_misc.php:314
+#: usr/local/www/system_advanced_misc.php:309
+#: usr/local/www/system_advanced_misc.php:312
+#: usr/local/www/system_advanced_misc.php:333
+#: usr/local/www/system_advanced_misc.php:313
+#: usr/local/www/system_advanced_misc.php:316
+#: usr/local/www/system_advanced_misc.php:337
+#: usr/local/www/system_advanced_misc.php:360
+#: usr/local/www/system_advanced_misc.php:363
+#: usr/local/www/system_advanced_misc.php:384
+#: usr/local/www/system_advanced_misc.php:366
+#: usr/local/www/system_advanced_misc.php:369
+#: usr/local/www/system_advanced_misc.php:390
+msgid "Load Balancing"
+msgstr "Balanceando de Carga"
+
+#: usr/local/www/system_advanced_misc.php:270
+#: usr/local/www/system_advanced_misc.php:296
+#: usr/local/www/system_advanced_misc.php:315
+#: usr/local/www/system_advanced_misc.php:319
+#: usr/local/www/system_advanced_misc.php:366
+#: usr/local/www/system_advanced_misc.php:372
+msgid "Use sticky connections"
+msgstr "Use conexões sticky"
+
+#: usr/local/www/system_advanced_misc.php:271
+msgid "Successive connections will be redirected to the servers in a round-robin manner with connections from the same source being sent to the same web server. This 'sticky connection' will exist as long as there are states that refer to this connection. Once the states expire, so will the sticky connection. Further connections from that host will be redirected to the next web server in the round robin."
+msgstr "Conexões sucessivas serão redirecionadas para servidores usando round-robin com as conexões da mesma fonte sendo enviada para o mesmo servidor web. Essa 'conexão sticky' existirá contanto que existam estados que se referenciam a ela. Uma vez que os estados expirarem, o mesmo ocorrerá com a conexão sticky. Mais conexões desse host serão redirecionadas para o próximo servidor web do round robin."
+
+#: usr/local/www/system_advanced_misc.php:285
+#: usr/local/www/system_advanced_misc.php:317
+#: usr/local/www/system_advanced_misc.php:336
+#: usr/local/www/system_advanced_misc.php:340
+#: usr/local/www/system_advanced_misc.php:387
+#: usr/local/www/system_advanced_misc.php:393
+msgid "Allow default gateway switching"
+msgstr "Permitir a alteração de rota padrão"
+
+#: usr/local/www/system_advanced_misc.php:286
+#: usr/local/www/system_advanced_misc.php:318
+#: usr/local/www/system_advanced_misc.php:337
+#: usr/local/www/system_advanced_misc.php:341
+#: usr/local/www/system_advanced_misc.php:388
+#: usr/local/www/system_advanced_misc.php:394
+msgid "If the link where the default gateway resides fails switch the default gateway to another available one."
+msgstr "Se o link onde o gateway padrão reside falhar, troca o default gateway para outro disponível."
+
+#: usr/local/www/system_advanced_misc.php:294
+#: usr/local/www/system_advanced_misc.php:326
+#: usr/local/www/system_advanced_misc.php:345
+#: usr/local/www/system_advanced_misc.php:349
+#: usr/local/www/system_advanced_misc.php:396
+#: usr/local/www/system_advanced_misc.php:402
+msgid "Power savings"
+msgstr "Economia de energia"
+
+#: usr/local/www/system_advanced_misc.php:297
+#: usr/local/www/system_advanced_misc.php:329
+#: usr/local/www/system_advanced_misc.php:348
+#: usr/local/www/system_advanced_misc.php:352
+#: usr/local/www/system_advanced_misc.php:399
+#: usr/local/www/system_advanced_misc.php:405
+msgid "PowerD"
+msgstr "PowerD"
+
+#: usr/local/www/system_advanced_misc.php:300
+#: usr/local/www/system_advanced_misc.php:332
+#: usr/local/www/system_advanced_misc.php:351
+#: usr/local/www/system_advanced_misc.php:355
+#: usr/local/www/system_advanced_misc.php:402
+#: usr/local/www/system_advanced_misc.php:408
+msgid "Use PowerD"
+msgstr "Use PowerD"
+
+#: usr/local/www/system_advanced_misc.php:302
+msgid "The powerd utility monitors the system state and sets various power control options accordingly. It offers three modes (maximum, minimum, and adaptive) that can be individually selected while on AC power or batteries. The modes maximum, minimum, and adaptive may be abbreviated max, min, adp. Maximum mode chooses the highest performance values. Minimum mode selects the lowest performance values to get the most power savings. Adaptive mode attempts to strike a balance by degrading performance when the system appears idle and increasing it when the system is busy. It offers a good balance between a small performance loss for greatly "
+msgstr "O utilitário powerd monitora o estado do sistema e configura várias opções de controle de energia de acordo. Ele oferece 3 modos (máximo, mínimo e adaptável) que podem ser selecionados individualmente quando estiver usando energia AC ou baterias. Os modos máximo, mínimo e adaptável podem vir abreviados como max, min, adp. O modo Máximo escolhe os valores de performance mais altos. O modo Mínimo seleciona os valores de performance mais baixos para obter o máximo de economia de energia. O modo Adaptável tenta balancear por meio de degradação da performance quando o sistema parece estar ocioso e aumenta a performance quando o sistema está ocupado. Ele oferece um bom balanço entre perdas de performance pequenas para grandes aumentos em economia de energia."
+
+#: usr/local/www/system_advanced_misc.php:318
+#: usr/local/www/system_advanced_misc.php:361
+msgid "glxsb Crypto Acceleration"
+msgstr "Aceleração de Criptografia glxsb"
+
+#: usr/local/www/system_advanced_misc.php:321
+#: usr/local/www/system_advanced_misc.php:364
+msgid "glxsb"
+msgstr "glxsb"
+
+#: usr/local/www/system_advanced_misc.php:324
+#: usr/local/www/system_advanced_misc.php:367
+msgid "Use glxsb"
+msgstr "Use glxsb"
+
+#: usr/local/www/system_advanced_misc.php:326
+#: usr/local/www/system_advanced_misc.php:369
+msgid "The AMD Geode LX Security Block will accelerate some cryptographic functions on systems which have the chip. Do not enable this option if you have a Hifn cryptographic acceleration card, as this will take precedence and the Hifn card will not be used. Acceleration should be automatic for IPsec when using Rijndael (AES). OpenVPN should be set for AES-128-CBC."
+msgstr "O AMD Geode LX Security Block irá acelerar algumas funções de criptografia em sistemas que possuem o chip. Não habilite essa opção se você tem um cartão de aceleração de criptografia Hifn, já que ele terá prioridade e o cartão Hifn não será usado. Aceleração pode ser automática para IPsec quando estiver usando Rijndael (AES). OpenVPN deve ser configurado para AES-128-CBC."
+
+#: usr/local/www/system_advanced_misc.php:332
+#: usr/local/www/system_advanced_misc.php:375
+msgid "If you do not have a glxsb chip in your system, this option will have no effect. To unload the module, uncheck this option and then reboot."
+msgstr "Se você não tiver um chip glxsb no seu sistema, essa opção não terá efeito. Para descarregar o módulo, desmarque essa opção e então reinicie o sistema."
+
+#: usr/local/www/system_advanced_misc.php:340
+#: usr/local/www/system_advanced_misc.php:383
+#: usr/local/www/system_advanced_misc.php:432
+#: usr/local/www/system_advanced_misc.php:444
+#: usr/local/www/system_advanced_misc.php:491
+#: usr/local/www/system_advanced_misc.php:497
+msgid "IP Security"
+msgstr "Segurança IP"
+
+#: usr/local/www/system_advanced_misc.php:343
+#: usr/local/www/system_advanced_misc.php:386
+#: usr/local/www/system_advanced_misc.php:435
+#: usr/local/www/system_advanced_misc.php:447
+#: usr/local/www/system_advanced_misc.php:494
+#: usr/local/www/system_advanced_misc.php:500
+msgid "Security Associations"
+msgstr "Associações de Segurança"
+
+#: usr/local/www/system_advanced_misc.php:346
+#: usr/local/www/system_advanced_misc.php:389
+#: usr/local/www/system_advanced_misc.php:438
+#: usr/local/www/system_advanced_misc.php:450
+#: usr/local/www/system_advanced_misc.php:497
+#: usr/local/www/system_advanced_misc.php:503
+msgid "Prefer older IPsec SAs"
+msgstr "Prefira IPsec SAs mais velhos"
+
+#: usr/local/www/system_advanced_misc.php:348
+#: usr/local/www/system_advanced_misc.php:391
+#: usr/local/www/system_advanced_misc.php:440
+#: usr/local/www/system_advanced_misc.php:452
+#: usr/local/www/system_advanced_misc.php:499
+#: usr/local/www/system_advanced_misc.php:505
+msgid "By default, if several SAs match, the newest one is preferred if it's at least 30 seconds old. Select this option to always prefer old SAs over new ones."
+msgstr "Por padrão, se várias SAs correspondem, o mais nova é preferida se ela for pelo menos 30 segundos velha. Selecione essa opção para sempre preferir SAs velhas ao invés das novas."
+
+#: usr/local/www/system_advanced_misc.php:354
+#: usr/local/www/system_advanced_misc.php:397
+#: usr/local/www/system_advanced_misc.php:446
+#: usr/local/www/system_advanced_misc.php:458
+#: usr/local/www/system_advanced_misc.php:505
+#: usr/local/www/system_advanced_misc.php:511
+msgid "IPsec Debug"
+msgstr "Depuração de IPsec"
+
+#: usr/local/www/system_advanced_misc.php:357
+#: usr/local/www/system_advanced_misc.php:400
+#: usr/local/www/system_advanced_misc.php:449
+#: usr/local/www/system_advanced_misc.php:461
+#: usr/local/www/system_advanced_misc.php:508
+#: usr/local/www/system_advanced_misc.php:514
+msgid "Start racoon in debug mode"
+msgstr "Iniciar racoon no modo de depuração"
+
+#: usr/local/www/system_advanced_misc.php:359
+#: usr/local/www/system_advanced_misc.php:402
+#: usr/local/www/system_advanced_misc.php:451
+#: usr/local/www/system_advanced_misc.php:463
+#: usr/local/www/system_advanced_misc.php:510
+#: usr/local/www/system_advanced_misc.php:516
+msgid "Launches racoon in debug mode so that more verbose logs will be generated to aid in troubleshooting."
+msgstr "Lançamentos de racoon no modo de depuração para geração de logs mais detalhado para auxiliar na solução de problemas."
+
+#: usr/local/www/system_advanced_misc.php:361
+#: usr/local/www/system_advanced_misc.php:404
+#: usr/local/www/system_advanced_misc.php:453
+#: usr/local/www/system_advanced_misc.php:465
+#: usr/local/www/system_advanced_misc.php:512
+#: usr/local/www/system_advanced_misc.php:518
+msgid "NOTE: Changing this setting will restart racoon."
+msgstr "NOTA: Alterar essa configuração irá reiniciar racoon."
+
+#: usr/local/www/system_advanced_misc.php:365
+#: usr/local/www/system_advanced_misc.php:408
+#: usr/local/www/system_advanced_misc.php:457
+#: usr/local/www/system_advanced_misc.php:469
+#: usr/local/www/system_advanced_misc.php:516
+#: usr/local/www/system_advanced_misc.php:534
+msgid "Maximum MSS"
+msgstr "Máximo MSS"
+
+#: usr/local/www/system_advanced_misc.php:368
+#: usr/local/www/system_advanced_misc.php:411
+#: usr/local/www/system_advanced_misc.php:460
+#: usr/local/www/system_advanced_misc.php:472
+#: usr/local/www/system_advanced_misc.php:519
+#: usr/local/www/system_advanced_misc.php:537
+msgid "Enable MSS clamping on VPN traffic"
+msgstr "Habilitar MSS clamping no tráfego da VPN"
+
+#: usr/local/www/system_advanced_misc.php:372
+#: usr/local/www/system_advanced_misc.php:415
+#: usr/local/www/system_advanced_misc.php:464
+#: usr/local/www/system_advanced_misc.php:476
+#: usr/local/www/system_advanced_misc.php:523
+#: usr/local/www/system_advanced_misc.php:541
+msgid "Enable MSS clamping on TCP flows over VPN. This helps overcome problems with PMTUD on IPsec VPN links. If left blank, the default value is 1400 bytes. "
+msgstr "Habilitar MSS clamping em fluxos TCP sobre a VPN. Isso ajuda a superar problemas com PMTUD em links IPsec da VPN. Se deixado em branco o valor padrão é 1400 bytes."
+
+#: usr/local/www/system_advanced_misc.php:383
+#: usr/local/www/system_advanced_misc.php:426
+#: usr/local/www/system_advanced_misc.php:475
+#: usr/local/www/system_advanced_misc.php:487
+#: usr/local/www/system_advanced_misc.php:534
+#: usr/local/www/system_advanced_misc.php:552
+msgid "Schedule States"
+msgstr "Estados de agendamento"
+
+#: usr/local/www/system_advanced_misc.php:387
+#: usr/local/www/system_advanced_misc.php:430
+#: usr/local/www/system_advanced_misc.php:479
+#: usr/local/www/system_advanced_misc.php:491
+#: usr/local/www/system_advanced_misc.php:538
+#: usr/local/www/system_advanced_misc.php:556
+msgid "By default schedules clear the states of existing connections when the expiration time has come. This option overrides that behavior by not clearing states for existing connections."
+msgstr "Por padrão, agendadores limpam os estados de conexões quando atingirem o tempo de expiração. Esta opção sobrescreve o comportamento anterior, não limpando as tabelas."
+
+#: usr/local/www/system_advanced_misc.php:395
+#: usr/local/www/system_advanced_misc.php:438
+#: usr/local/www/system_advanced_misc.php:487
+#: usr/local/www/system_advanced_misc.php:499
+#: usr/local/www/system_advanced_misc.php:546
+#: usr/local/www/system_advanced_misc.php:564
+msgid "Gateway Monitoring"
+msgstr "Monitoramento do Gateway"
+
+#: usr/local/www/system_advanced_misc.php:402
+#: usr/local/www/system_advanced_misc.php:445
+#: usr/local/www/system_advanced_misc.php:494
+#: usr/local/www/system_advanced_misc.php:506
+#: usr/local/www/system_advanced_misc.php:553
+#: usr/local/www/system_advanced_misc.php:571
+msgid "By default the monitoring process will flush states for a gateway that goes down. This option overrides that behavior by not clearing states for existing connections."
+msgstr "Por padrão o monitoramento de processos irá limpar a tabela de estados quando um gateway cair. Esta opções sobrescreve o comportamento anterior para conexões existentes."
+
+#: usr/local/www/system_advanced_misc.php:411
+#: usr/local/www/system_advanced_misc.php:454
+#: usr/local/www/system_advanced_misc.php:503
+#: usr/local/www/system_advanced_misc.php:515
+#: usr/local/www/system_advanced_misc.php:636
+#: usr/local/www/system_advanced_misc.php:654
+msgid "Hardware Settings"
+msgstr "Configurações de Hardware"
+
+#: usr/local/www/system_advanced_misc.php:414
+#: usr/local/www/system_advanced_misc.php:457
+#: usr/local/www/system_advanced_misc.php:506
+#: usr/local/www/system_advanced_misc.php:518
+#: usr/local/www/system_advanced_misc.php:639
+#: usr/local/www/system_advanced_misc.php:657
+msgid "Hard disk standby time "
+msgstr "Tempo de espera do disco rígido"
+
+#: usr/local/www/system_advanced_misc.php:421
+#: usr/local/www/system_advanced_misc.php:464
+#: usr/local/www/system_advanced_misc.php:513
+#: usr/local/www/system_advanced_misc.php:525
+#: usr/local/www/system_advanced_misc.php:646
+#: usr/local/www/system_advanced_misc.php:664
+msgid "Always on"
+msgstr "Sempre ligado"
+
+#: usr/local/www/system_advanced_misc.php:430
+#: usr/local/www/system_advanced_misc.php:473
+#: usr/local/www/system_advanced_misc.php:522
+#: usr/local/www/system_advanced_misc.php:534
+#: usr/local/www/system_advanced_misc.php:655
+#: usr/local/www/system_advanced_misc.php:673
+msgid "Puts the hard disk into standby mode when the selected amount of time after the last access has elapsed."
+msgstr "Coloque o disco rígido em modo de espera quando o total de tempo selecionado após o último acesso ter decorrido."
+
+#: usr/local/www/system_advanced_misc.php:431
+#: usr/local/www/system_advanced_misc.php:474
+#: usr/local/www/system_advanced_misc.php:523
+#: usr/local/www/system_advanced_misc.php:535
+#: usr/local/www/system_advanced_misc.php:656
+#: usr/local/www/system_advanced_misc.php:674
+msgid "Do not set this for CF cards."
+msgstr "Não configure isso para cartões CF."
+
+#: usr/local/www/system_advanced_network.php:68
+#: usr/local/www/system_advanced_network.php:67
+msgid "You must specify an IP address to NAT IPv6 packets."
+msgstr "Você deve especificar um endereço IP para os pacotes IPv6 do NAT."
+
+#: usr/local/www/system_advanced_network.php:148
+#: usr/local/www/system_advanced_network.php:147
+msgid "Advanced: Networking"
+msgstr "Avançado: Rede"
+
+#: usr/local/www/system_advanced_network.php:205
+#: usr/local/www/system_advanced_network.php:204
+msgid "IPv6 Options"
+msgstr "Opções IPv6"
+
+#: usr/local/www/system_advanced_network.php:208
+#: usr/local/www/system_advanced_network.php:211
+#: usr/local/www/system_advanced_network.php:207
+#: usr/local/www/system_advanced_network.php:210
+msgid "Allow IPv6"
+msgstr "Permitir IPv6"
+
+#: usr/local/www/system_advanced_network.php:212
+msgid "All IPv6 will be blocked unless this box is checked."
+msgstr "Todos os IPv6 serão bloqueados a menos que essa opção esteja marcada."
+
+#: usr/local/www/system_advanced_network.php:217
+#: usr/local/www/system_advanced_network.php:218
+msgid "IPv6 over IPv4 Tunneling"
+msgstr "IPv6 sobre tunelamento IPv4"
+
+#: usr/local/www/system_advanced_network.php:220
+#: usr/local/www/system_advanced_network.php:221
+msgid "Enable IPv4 NAT encapsulation of IPv6 packets"
+msgstr "Habilitar encapsulamento NAT de IPv4 para pacotes IPv6"
+
+#: usr/local/www/system_advanced_network.php:221
+#: usr/local/www/system_advanced_network.php:222
+msgid "This provides an RFC 2893 compatibility mechanism that can be used to tunneling IPv6 packets over IPv4 routing infrastructures. If enabled, don't forget to add a firewall rule to permit IPv6 packets."
+msgstr "Isso provê um mecanismo de compatibilidade com RFC 2893 que pode ser usado para tunelamento de pacotes IPv6 sobre infraestrutura de roteamento IPv4. Se habilitada, não esqueça de adicionar uma regra de firewall para permitir pacotes IPv6."
+
+#: usr/local/www/system_advanced_network.php:234
+#: usr/local/www/system_advanced_network.php:235
+msgid "Network Interfaces"
+msgstr "Interfaces de Rede"
+
+#: usr/local/www/system_advanced_network.php:237
+#: usr/local/www/system_advanced_network.php:238
+msgid "Device polling"
+msgstr "Polling de dispositivo"
+
+#: usr/local/www/system_advanced_network.php:240
+#: usr/local/www/system_advanced_network.php:241
+msgid "Enable device polling"
+msgstr "Habilitar polling de dispositivo"
+
+#: usr/local/www/system_advanced_network.php:241
+#: usr/local/www/system_advanced_network.php:242
+#, php-format
+msgid "Device polling is a technique that lets the system periodically poll network devices for new data instead of relying on interrupts. This prevents your webConfigurator, SSH, etc. from being inaccessible due to interrupt floods when under extreme load. Generally this is not recommended. Not all NICs support polling; see the %s homepage for a list of supported cards."
+msgstr "Polling de dispositivo é uma técnica que permite que o sistema periodicamente eleja dispositivos de rede para novos dados ao invés de confiar em interrupções. Isso previne que seu webConfigurator, SSH, etc, de serem inacessíveis devido a transbordo de interrupções quando extremamente carregados. Geralmente isso não é recomendado. Nem todas as NICs suportam polling; veja a página %s para uma lista de cartões com suporte."
+
+#: usr/local/www/system_advanced_network.php:245
+#: usr/local/www/system_advanced_network.php:246
+msgid "Hardware Checksum Offloading"
+msgstr "Hardware Checksum Offloading"
+
+#: usr/local/www/system_advanced_network.php:248
+#: usr/local/www/system_advanced_network.php:249
+msgid "Disable hardware checksum offload"
+msgstr "Desabilitar Hardware Checksum Offload"
+
+#: usr/local/www/system_advanced_network.php:249
+#: usr/local/www/system_advanced_network.php:250
+msgid "Checking this option will disable hardware checksum offloading. Checksum offloading is broken in some hardware, particularly some Realtek cards. Rarely, drivers may have problems with checksum offloading and some specific NICs."
+msgstr "Marcando essa opção o hardware checksum offloading será desabilitado. Checksum offloading está quebrado em algum hardware, particularmente alguns cartões Realtek. Raramente, drivers podem ter problemas com checksum offloading e alguns NICs específicos."
+
+#: usr/local/www/system_advanced_network.php:253
+#: usr/local/www/system_advanced_network.php:254
+msgid "Hardware TCP Segmentation Offloading"
+msgstr "Hardware TCP Segmentation Offloading"
+
+#: usr/local/www/system_advanced_network.php:256
+#: usr/local/www/system_advanced_network.php:257
+msgid "Disable hardware TCP segmentation offload"
+msgstr "Desabilitar Hardware TCP Segmentation Offloading"
+
+#: usr/local/www/system_advanced_network.php:257
+#: usr/local/www/system_advanced_network.php:258
+msgid "Checking this option will disable hardware TCP segmentation offloading (TSO, TSO4, TSO6). This offloading is broken in some hardware drivers, and may impact performance with some specific NICs."
+msgstr "Marcando essa opção, o Hardware TCP Segmentation Offloading será desabilitado (TSO, TSO4, TS06). Esse offloading está quebrado em alguns drivers de hardware, e pode impactar a performance com alguns NICs específicos."
+
+#: usr/local/www/system_advanced_network.php:261
+#: usr/local/www/system_advanced_network.php:262
+msgid "Hardware Large Receive Offloading"
+msgstr "Hardware Large Receive Offloading"
+
+#: usr/local/www/system_advanced_network.php:264
+#: usr/local/www/system_advanced_network.php:265
+msgid "Disable hardware large receive offload"
+msgstr "Desabilitar Hardware Large Receive Offloading"
+
+#: usr/local/www/system_advanced_network.php:265
+#: usr/local/www/system_advanced_network.php:266
+msgid "Checking this option will disable hardware large receive offloading (LRO). This offloading is broken in some hardware drivers, and may impact performance with some specific NICs."
+msgstr "Marcar esta opção irá desabilitar o Hardware Large Receive Offloading (LRO). Esse offloading está quebrado em alguns drivers de hardware, e pode impactar a performance com alguns NICs específicos."
+
+#: usr/local/www/system_advanced_network.php:269
+#: usr/local/www/system_advanced_network.php:270
+msgid "ARP Handling"
+msgstr "Manuseio de ARP"
+
+#: usr/local/www/system_advanced_network.php:272
+#: usr/local/www/system_advanced_network.php:273
+msgid "Suppress ARP messages"
+msgstr "Suprimir mensagens ARP"
+
+#: usr/local/www/system_advanced_network.php:273
+#: usr/local/www/system_advanced_network.php:274
+msgid "This option will suppress ARP log messages when multiple interfaces reside on the same broadcast domain"
+msgstr "Essa opção irá suprimir mensagens de log ARP quando múltiplas interfaces residirem no mesmo domínio de broadcast"
+
+#: usr/local/www/system_advanced_notifications.php:118
+#: usr/local/www/system_advanced_notifications.php:124
+#: usr/local/www/system_advanced_notifications.php:127
+#: usr/local/www/system_advanced_notifications.php:133
+#: usr/local/www/system_advanced_notifications.php:144
+#: usr/local/www/system_advanced_notifications.php:151
+#, php-format
+msgid "This is a test message from %s. It is safe to ignore this message."
+msgstr "Essa é uma mensagem de teste de %s. É seguro ignorar essa mensagem."
+
+#: usr/local/www/system_advanced_notifications.php:131
+#: usr/local/www/system_advanced_notifications.php:140
+#: usr/local/www/system_advanced_notifications.php:155
+msgid "Advanced: Notifications"
+msgstr "Avançado: Notificações"
+
+#: usr/local/www/system_advanced_notifications.php:168
+#: usr/local/www/system_advanced_notifications.php:177
+#: usr/local/www/system_advanced_notifications.php:192
+msgid "Growl"
+msgstr "Growl"
+
+#: usr/local/www/system_advanced_notifications.php:171
+#: usr/local/www/system_advanced_notifications.php:180
+#: usr/local/www/system_advanced_notifications.php:202
+msgid "Registration Name"
+msgstr "Nome de Registro"
+
+#: usr/local/www/system_advanced_notifications.php:174
+#: usr/local/www/system_advanced_notifications.php:183
+#: usr/local/www/system_advanced_notifications.php:205
+msgid "Enter the name to register with the Growl server (default: PHP-Growl)."
+msgstr "Informe o nome para registrar o servidor Growl (padrão PHP-Growl)."
+
+#: usr/local/www/system_advanced_notifications.php:178
+#: usr/local/www/system_advanced_notifications.php:187
+#: usr/local/www/system_advanced_notifications.php:209
+msgid "Notification Name"
+msgstr "Nome da Notificação"
+
+#: usr/local/www/system_advanced_notifications.php:181
+#: usr/local/www/system_advanced_notifications.php:190
+#: usr/local/www/system_advanced_notifications.php:212
+#, php-format
+msgid "Enter a name for the Growl notifications (default: %s growl alert)."
+msgstr "Informe um nome para as notificações do Growl (padrão: %s growl alert)."
+
+#: usr/local/www/system_advanced_notifications.php:188
+#: usr/local/www/system_advanced_notifications.php:197
+#: usr/local/www/system_advanced_notifications.php:219
+msgid "This is the IP address that you would like to send growl notifications to."
+msgstr "Esse é o endereço IP para o qual você gostaria de enviar notificações growl."
+
+#: usr/local/www/system_advanced_notifications.php:195
+#: usr/local/www/system_advanced_notifications.php:204
+#: usr/local/www/system_advanced_notifications.php:226
+msgid "Enter the password of the remote growl notification device."
+msgstr "Informe a senha do dispositivo de notificação growl remoto."
+
+#: usr/local/www/system_advanced_notifications.php:203
+#: usr/local/www/system_advanced_notifications.php:212
+#: usr/local/www/system_advanced_notifications.php:243
+msgid "SMTP E-Mail"
+msgstr "E-Mail SMTP"
+
+#: usr/local/www/system_advanced_notifications.php:206
+#: usr/local/www/system_advanced_notifications.php:215
+#: usr/local/www/system_advanced_notifications.php:253
+msgid "E-Mail server"
+msgstr "Servidor de E-Mail"
+
+#: usr/local/www/system_advanced_notifications.php:209
+#: usr/local/www/system_advanced_notifications.php:218
+#: usr/local/www/system_advanced_notifications.php:256
+msgid "This is the FQDN or IP address of the SMTP E-Mail server to which notifications will be sent."
+msgstr "Esse é o endereço FQDN ou IP do servidor de E-Mail SMTP para o qual as notificações serão enviadas."
+
+#: usr/local/www/system_advanced_notifications.php:213
+#: usr/local/www/system_advanced_notifications.php:222
+#: usr/local/www/system_advanced_notifications.php:260
+msgid "SMTP Port of E-Mail server"
+msgstr "Porta SMTP do Servidor de E-Mail"
+
+#: usr/local/www/system_advanced_notifications.php:217
+#: usr/local/www/system_advanced_notifications.php:226
+#: usr/local/www/system_advanced_notifications.php:264
+msgid "This is the port of the SMTP E-Mail server, typically 25, 587 (submission) or 465 (smtps, tick ssl/tls checkbox)"
+msgstr "Essa é a porta do servidor de E-Mail SMTP, normalmente 25 ou 587 (submissão) ou 465 (smtps, tick ssl/tls checkbox)"
+
+#: usr/local/www/system_advanced_notifications.php:221
+#: usr/local/www/system_advanced_notifications.php:230
+#: usr/local/www/system_advanced_notifications.php:268
+msgid "From e-mail address"
+msgstr "Endereço de e-mail de origem"
+
+#: usr/local/www/system_advanced_notifications.php:224
+#: usr/local/www/system_advanced_notifications.php:233
+#: usr/local/www/system_advanced_notifications.php:271
+msgid "This is the e-mail address that will appear in the from field."
+msgstr "Esse é o endereço de e-mail que irá aparecer no campo De."
+
+#: usr/local/www/system_advanced_notifications.php:228
+#: usr/local/www/system_advanced_notifications.php:237
+#: usr/local/www/system_advanced_notifications.php:275
+msgid "Notification E-Mail address"
+msgstr "Endereço de E-mail de Notificação"
+
+#: usr/local/www/system_advanced_notifications.php:231
+#: usr/local/www/system_advanced_notifications.php:240
+#: usr/local/www/system_advanced_notifications.php:278
+msgid "Enter the e-mail address that you would like email notifications sent to."
+msgstr "Informe o endereço de e-mail para o qual você gostaria que notificações por e-mail sejam enviadas."
+
+#: usr/local/www/system_advanced_notifications.php:235
+#: usr/local/www/system_advanced_notifications.php:244
+#: usr/local/www/system_advanced_notifications.php:282
+msgid "Notification E-Mail auth username (optional)"
+msgstr "Nome de usuário de autenticação de E-Mail de Notificação (opcional)"
+
+#: usr/local/www/system_advanced_notifications.php:238
+#: usr/local/www/system_advanced_notifications.php:247
+#: usr/local/www/system_advanced_notifications.php:285
+msgid "Enter the e-mail address username for SMTP authentication."
+msgstr "Informe o nome de usuário do endereço de e-mail para autenticação SMTP."
+
+#: usr/local/www/system_advanced_notifications.php:242
+#: usr/local/www/system_advanced_notifications.php:251
+#: usr/local/www/system_advanced_notifications.php:289
+msgid "Notification E-Mail auth password"
+msgstr "Senha de autorização de E-Mail de Notificação"
+
+#: usr/local/www/system_advanced_notifications.php:245
+#: usr/local/www/system_advanced_notifications.php:254
+#: usr/local/www/system_advanced_notifications.php:292
+msgid "Enter the e-mail address password for SMTP authentication."
+msgstr "Informe a senha do endereço de e-mail para autenticação SMTP."
+
+#: usr/local/www/system_advanced_sysctl.php:125
+msgid "Advanced: System Tunables"
+msgstr "Avançado: Ajustes do sistema"
+
+#: usr/local/www/system_advanced_sysctl.php:139
+msgid "The firewall tunables have changed. You must apply the configuration to take affect."
+msgstr "Os ajustes do firewall mudaram. Você deve aplicar as configurações para que elas tenham efeito."
+
+#: usr/local/www/system_advanced_sysctl.php:171
+msgid "Tunable Name"
+msgstr "Nome do Ajuste"
+
+#: usr/local/www/system_advanced_sysctl.php:234
+msgid "Edit system tunable"
+msgstr "Editar ajuste do sistema"
+
+#: usr/local/www/system_advanced_sysctl.php:237
+msgid "Tunable"
+msgstr "Juste"
+
+#: usr/local/www/system_authservers.php:44
+msgid "Authentication Servers"
+msgstr "Servidores de Autenticação"
+
+#: usr/local/www/system_authservers.php:83
+#: usr/local/www/system_authservers.php:84
+msgid "deleted"
+msgstr "apagado"
+
+#: usr/local/www/system_authservers.php:160
+#: usr/local/www/system_authservers.php:183
+#: usr/local/www/system_authservers.php:438
+#: usr/local/www/system_camanager.php:165
+#: usr/local/www/system_camanager.php:177
+#: usr/local/www/system_camanager.php:192
+#: usr/local/www/system_camanager.php:369
+#: usr/local/www/system_certmanager.php:164
+#: usr/local/www/system_certmanager.php:176
+#: usr/local/www/system_certmanager.php:193
+#: usr/local/www/system_certmanager.php:307
+#: usr/local/www/system_certmanager.php:495
+#: usr/local/www/system_certmanager.php:801
+#: usr/local/www/system_crlmanager.php:193
+#: usr/local/www/system_crlmanager.php:200
+#: usr/local/www/system_crlmanager.php:318
+#: usr/local/www/system_usermanager.php:189
+#: usr/local/www/system_usermanager.php:705
+#: usr/local/www/system_certmanager.php:192
+#: usr/local/www/system_certmanager.php:204
+#: usr/local/www/system_certmanager.php:222
+#: usr/local/www/system_certmanager.php:394
+#: usr/local/www/system_certmanager.php:594
+#: usr/local/www/system_certmanager.php:967
+#: usr/local/www/system_usermanager.php:703
+#: usr/local/www/system_crlmanager.php:192
+#: usr/local/www/system_crlmanager.php:199
+#: usr/local/www/system_crlmanager.php:319
+#: usr/local/www/system_crlmanager.php:404
+#: usr/local/www/system_authservers.php:161
+#: usr/local/www/system_authservers.php:184
+#: usr/local/www/system_authservers.php:443
+#: usr/local/www/system_camanager.php:167
+#: usr/local/www/system_camanager.php:179
+#: usr/local/www/system_camanager.php:194
+#: usr/local/www/system_camanager.php:376
+#: usr/local/www/system_certmanager.php:195
+#: usr/local/www/system_certmanager.php:207
+#: usr/local/www/system_certmanager.php:225
+#: usr/local/www/system_certmanager.php:403
+#: usr/local/www/system_certmanager.php:603
+#: usr/local/www/system_certmanager.php:1009
+#: usr/local/www/system_authservers.php:162
+#: usr/local/www/system_authservers.php:185
+#: usr/local/www/system_authservers.php:450
+#: usr/local/www/system_certmanager.php:604
+#: usr/local/www/system_certmanager.php:1013
+#: usr/local/www/system_authservers.php:164
+#: usr/local/www/system_authservers.php:187
+#: usr/local/www/system_authservers.php:461
+msgid "Descriptive name"
+msgstr "Nome descritivo"
+
+#: usr/local/www/system_authservers.php:163
+#: usr/local/www/system_authservers.php:484
+#: usr/local/www/system_authservers.php:164
+#: usr/local/www/system_authservers.php:489
+#: usr/local/www/system_authservers.php:165
+#: usr/local/www/system_authservers.php:496
+#: usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:508
+msgid "Port value"
+msgstr "Valor da porta"
+
+#: usr/local/www/system_authservers.php:164
+#: usr/local/www/system_authservers.php:490
+#: usr/local/www/system_authservers.php:165
+#: usr/local/www/system_authservers.php:495
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:502
+#: usr/local/www/system_authservers.php:168
+#: usr/local/www/system_authservers.php:514
+msgid "Transport"
+msgstr "Transporte"
+
+#: usr/local/www/system_authservers.php:165
+#: usr/local/www/system_authservers.php:526
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:531
+#: usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:538
+#: usr/local/www/system_authservers.php:169
+#: usr/local/www/system_authservers.php:550
+msgid "Protocol version"
+msgstr "Versão do protocolo"
+
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:168
+#: usr/local/www/system_authservers.php:170
+msgid "Search level"
+msgstr "Nível de busca"
+
+#: usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:168
+#: usr/local/www/system_authservers.php:169
+#: usr/local/www/system_authservers.php:171
+msgid "User naming Attribute"
+msgstr "Atributo de nomeação de usuário"
+
+#: usr/local/www/system_authservers.php:168
+#: usr/local/www/system_authservers.php:169
+#: usr/local/www/system_authservers.php:170
+#: usr/local/www/system_authservers.php:172
+msgid "Group naming Attribute"
+msgstr "Atributo de nomeação de grupo"
+
+#: usr/local/www/system_authservers.php:169
+#: usr/local/www/system_authservers.php:665
+#: usr/local/www/system_authservers.php:170
+#: usr/local/www/system_authservers.php:670
+#: usr/local/www/system_authservers.php:171
+#: usr/local/www/system_authservers.php:677
+#: usr/local/www/system_authservers.php:173
+#: usr/local/www/system_authservers.php:689
+msgid "Group member attribute"
+msgstr "Atributo de membro de grupo"
+
+#: usr/local/www/system_authservers.php:170
+#: usr/local/www/system_authservers.php:171
+#: usr/local/www/system_authservers.php:172
+#: usr/local/www/system_authservers.php:174
+msgid "Authentication container"
+msgstr "Contêiner de autenticação"
+
+#: usr/local/www/system_authservers.php:175
+#: usr/local/www/system_authservers.php:176
+#: usr/local/www/system_authservers.php:177
+#: usr/local/www/system_authservers.php:179
+msgid "Bind user DN"
+msgstr "DN de usuário de Bind"
+
+#: usr/local/www/system_authservers.php:176
+#: usr/local/www/system_authservers.php:177
+#: usr/local/www/system_authservers.php:178
+#: usr/local/www/system_authservers.php:180
+msgid "Bind Password"
+msgstr "Senha de bind"
+
+#: usr/local/www/system_authservers.php:191
+#: usr/local/www/system_authservers.php:707
+#: usr/local/www/system_authservers.php:192
+#: usr/local/www/system_authservers.php:712
+#: usr/local/www/system_authservers.php:193
+#: usr/local/www/system_authservers.php:719
+#: usr/local/www/system_authservers.php:195
+#: usr/local/www/system_authservers.php:761
+msgid "Authentication port value"
+msgstr "Valor da porta de autenticação"
+
+#: usr/local/www/system_authservers.php:197
+#: usr/local/www/system_authservers.php:713
+#: usr/local/www/system_authservers.php:198
+#: usr/local/www/system_authservers.php:718
+#: usr/local/www/system_authservers.php:199
+#: usr/local/www/system_authservers.php:725
+#: usr/local/www/system_authservers.php:201
+#: usr/local/www/system_authservers.php:767
+msgid "Accounting port value"
+msgstr "Valor da porta de Accounting"
+
+#: usr/local/www/system_authservers.php:202
+#: usr/local/www/system_authservers.php:686
+#: usr/local/www/system_authservers.php:203
+#: usr/local/www/system_authservers.php:691
+#: usr/local/www/system_authservers.php:204
+#: usr/local/www/system_authservers.php:698
+#: usr/local/www/system_authservers.php:206
+#: usr/local/www/system_authservers.php:740
+msgid "Shared Secret"
+msgstr "Segredo compartilhado"
+
+#: usr/local/www/system_authservers.php:209
+#: usr/local/www/system_authservers.php:210
+#: usr/local/www/system_authservers.php:211
+#: usr/local/www/system_authservers.php:213
+msgid "The host name contains invalid characters."
+msgstr "O nome do host contém caracteres inválidos."
+
+#: usr/local/www/system_authservers.php:212
+#: usr/local/www/system_authservers.php:213
+#: usr/local/www/system_authservers.php:214
+#: usr/local/www/system_authservers.php:216
+msgid "An authentication server with the same name already exists."
+msgstr "Um servidor de autenticação com o mesmo nome já existe."
+
+#: usr/local/www/system_authservers.php:382
+#: usr/local/www/system_authservers.php:383
+#: usr/local/www/system_authservers.php:390
+#: usr/local/www/system_authservers.php:401
+msgid "Please fill the required values."
+msgstr "Por favor, preencha os valores requeridos."
+
+#: usr/local/www/system_authservers.php:388
+#: usr/local/www/system_authservers.php:389
+#: usr/local/www/system_authservers.php:396
+#: usr/local/www/system_authservers.php:407
+msgid "Please fill the bind username/password."
+msgstr "Por favor, preencha o usuário/senha de bind."
+
+#: usr/local/www/system_authservers.php:406
+#: usr/local/www/system_usermanager_settings.php:103
+#: usr/local/www/system_authservers.php:411
+#: usr/local/www/system_authservers.php:418
+#: usr/local/www/system_usermanager_settings.php:104
+#: usr/local/www/system_authservers.php:429
+msgid "Popup blocker detected. Action aborted."
+msgstr "Detectado bloqueio de popup. Ação abortada."
+
+#: usr/local/www/system_authservers.php:475
+#: usr/local/www/system_authservers.php:480
+#: usr/local/www/system_authservers.php:487
+#: usr/local/www/system_authservers.php:498
+msgid "LDAP Server Settings"
+msgstr "Configurações do Servidor LDAP"
+
+#: usr/local/www/system_authservers.php:478
+#: usr/local/www/system_authservers.php:680
+#: usr/local/www/system_authservers.php:483
+#: usr/local/www/system_authservers.php:685
+#: usr/local/www/system_authservers.php:490
+#: usr/local/www/system_authservers.php:692
+#: usr/local/www/system_authservers.php:501
+#: usr/local/www/system_authservers.php:734
+msgid "Hostname or IP address"
+msgstr "Nome de host ou endereço IP"
+
+#: usr/local/www/system_authservers.php:505
+#: usr/local/www/vpn_openvpn_client.php:629
+#: usr/local/www/vpn_openvpn_server.php:778
+#: usr/local/www/vpn_openvpn_server.php:851
+#: usr/local/www/vpn_openvpn_client.php:634
+#: usr/local/www/vpn_openvpn_server.php:879
+#: usr/local/www/vpn_openvpn_client.php:652
+#: usr/local/www/system_authservers.php:510
+#: usr/local/www/vpn_openvpn_client.php:671
+#: usr/local/www/system_authservers.php:517
+#: usr/local/www/vpn_openvpn_server.php:906
+#: usr/local/www/system_authservers.php:529
+msgid "Peer Certificate Authority"
+msgstr "Peer com Fonte Certificadora"
+
+#: usr/local/www/system_authservers.php:518
+#: usr/local/www/system_authservers.php:523
+#: usr/local/www/system_authservers.php:530
+#: usr/local/www/system_authservers.php:542
+msgid "This option is used if 'SSL Encrypted' option is choosen."
+msgstr "Esta opções é utilizada se a opções 'Criptografado por SSL' estiver selecionada."
+
+#: usr/local/www/system_authservers.php:519
+#: usr/local/www/system_authservers.php:524
+#: usr/local/www/system_authservers.php:531
+#: usr/local/www/system_authservers.php:543
+msgid "It must match with the CA in the AD otherwise problems will arise."
+msgstr "Ele deve corresponder com o CA na AD caso contrário irá haver problemas."
+
+#: usr/local/www/system_authservers.php:541
+#: usr/local/www/system_authservers.php:546
+#: usr/local/www/system_authservers.php:553
+#: usr/local/www/system_authservers.php:565
+msgid "Search scope"
+msgstr "Escopo de busca"
+
+#: usr/local/www/system_authservers.php:545
+#: usr/local/www/system_authservers.php:550
+#: usr/local/www/system_authservers.php:557
+#: usr/local/www/system_authservers.php:569
+msgid "Level:"
+msgstr "Nível:"
+
+#: usr/local/www/system_authservers.php:560
+#: usr/local/www/system_authservers.php:565
+#: usr/local/www/system_authservers.php:572
+#: usr/local/www/system_authservers.php:584
+msgid "Base DN:"
+msgstr "DN Base:"
+
+#: usr/local/www/system_authservers.php:570
+#: usr/local/www/system_authservers.php:575
+#: usr/local/www/system_authservers.php:582
+#: usr/local/www/system_authservers.php:594
+msgid "Authentication containers"
+msgstr "Contêineres de autenticação"
+
+#: usr/local/www/system_authservers.php:574
+#: usr/local/www/system_authservers.php:579
+#: usr/local/www/system_authservers.php:586
+#: usr/local/www/system_authservers.php:598
+msgid "Containers:"
+msgstr "Contêineres:"
+
+#: usr/local/www/system_authservers.php:578
+#: usr/local/www/system_authservers.php:583
+#: usr/local/www/system_authservers.php:590
+#: usr/local/www/system_authservers.php:602
+msgid "Note: Semi-Colon separated. This will be prepended to the search base dn above or you can specify full container path."
+msgstr "NOTA: Separado por ponto e vírgula. Isso será anexado à base de busca dn acima ou você pode especificar o caminho completo do contêiner."
+
+#: usr/local/www/system_authservers.php:579
+#: usr/local/www/system_authservers.php:584
+#: usr/local/www/system_authservers.php:591
+#: usr/local/www/system_authservers.php:603
+msgid "Example: CN=Users;DC=example"
+msgstr "EXEMPLO: CN=Users;DC=example"
+
+#: usr/local/www/system_authservers.php:580
+#: usr/local/www/system_authservers.php:585
+#: usr/local/www/system_authservers.php:592
+#: usr/local/www/system_authservers.php:604
+msgid "Example: CN=Users,DC=example,DC=com;OU=OtherUsers,DC=example,DC=com "
+msgstr "EXEMPLO: CN=Users,DC=example,DC=com;OU=OtherUsers,DC=example,DC=com "
+
+#: usr/local/www/system_authservers.php:587
+#: usr/local/www/system_authservers.php:592
+#: usr/local/www/system_authservers.php:599
+#: usr/local/www/system_authservers.php:611
+msgid "Extended Query"
+msgstr "Consulta estendida"
+
+#: usr/local/www/system_authservers.php:597
+#: usr/local/www/system_authservers.php:602
+#: usr/local/www/system_authservers.php:609
+#: usr/local/www/system_authservers.php:621
+msgid "Example: CN=Groupname,OU=MyGroups,DC=example,DC=com;OU=OtherUsers,DC=example,DC=com "
+msgstr "EXEMPLO: CN=Groupname,OU=MyGroups,DC=example,DC=com;OU=OtherUsers,DC=example,DC=com"
+
+#: usr/local/www/system_authservers.php:604
+#: usr/local/www/system_authservers.php:609
+#: usr/local/www/system_authservers.php:616
+#: usr/local/www/system_authservers.php:628
+msgid "Bind credentials"
+msgstr "Credenciais de Vínculo"
+
+#: usr/local/www/system_authservers.php:612
+#: usr/local/www/system_authservers.php:617
+#: usr/local/www/system_authservers.php:624
+#: usr/local/www/system_authservers.php:636
+msgid "Use anonymous binds to resolve distinguished names"
+msgstr "Use vínculos anônimos para resolver nomes distintos"
+
+#: usr/local/www/system_authservers.php:621
+#: usr/local/www/system_authservers.php:626
+#: usr/local/www/system_authservers.php:633
+#: usr/local/www/system_authservers.php:645
+msgid "User DN:"
+msgstr "DN do usuário:"
+
+#: usr/local/www/system_authservers.php:637
+#: usr/local/www/system_authservers.php:642
+#: usr/local/www/system_authservers.php:649
+#: usr/local/www/system_authservers.php:661
+msgid "Initial Template"
+msgstr "Modelo inicial"
+
+#: usr/local/www/system_authservers.php:653
+#: usr/local/www/system_authservers.php:658
+#: usr/local/www/system_authservers.php:665
+#: usr/local/www/system_authservers.php:677
+msgid "User naming attribute"
+msgstr "Atributo de nomeação de usuário"
+
+#: usr/local/www/system_authservers.php:659
+#: usr/local/www/system_authservers.php:664
+#: usr/local/www/system_authservers.php:671
+#: usr/local/www/system_authservers.php:683
+msgid "Group naming attribute"
+msgstr "Atributo de nomeação de grupo"
+
+#: usr/local/www/system_authservers.php:677
+#: usr/local/www/system_authservers.php:682
+#: usr/local/www/system_authservers.php:689
+#: usr/local/www/system_authservers.php:731
+msgid "Radius Server Settings"
+msgstr "Configurações do Servidor Radius"
+
+#: usr/local/www/system_authservers.php:692
+#: usr/local/www/system_authservers.php:697
+#: usr/local/www/system_authservers.php:704
+#: usr/local/www/system_authservers.php:746
+msgid "Services offered"
+msgstr "Serviços oferecidos"
+
+#: usr/local/www/system_authservers.php:737
+#: usr/local/www/system_authservers.php:743
+#: usr/local/www/system_authservers.php:759
+#: usr/local/www/system_authservers.php:801
+msgid "Server Name"
+msgstr "Nome do Servidor"
+
+#: usr/local/www/system_authservers.php:739
+#: usr/local/www/system_authservers.php:745
+#: usr/local/www/system_authservers.php:761 usr/local/www/diag_dns.php:154
+#: usr/local/www/system_authservers.php:803
+msgid "Host Name"
+msgstr "Nome do Host"
+
+#: usr/local/www/system_authservers.php:756
+#: usr/local/www/vpn_openvpn_server.php:1479
+#: usr/local/www/vpn_openvpn_server.php:1621
+#: usr/local/www/vpn_openvpn_server.php:1662
+#: usr/local/www/system_authservers.php:764
+#: usr/local/www/system_authservers.php:780
+#: usr/local/www/vpn_openvpn_server.php:1714
+#: usr/local/www/system_authservers.php:797
+#: usr/local/www/system_authservers.php:839
+msgid "edit server"
+msgstr "editar servidor"
+
+#: usr/local/www/system_authservers.php:759
+#: usr/local/www/system_authservers.php:767
+#: usr/local/www/system_authservers.php:783
+#: usr/local/www/system_authservers.php:800
+#: usr/local/www/system_authservers.php:842
+msgid "Do you really want to delete this Server?"
+msgstr "Você realmente deseja apagar esse Servidor?"
+
+#: usr/local/www/system_authservers.php:760
+#: usr/local/www/vpn_openvpn_server.php:1483
+#: usr/local/www/vpn_openvpn_server.php:1625
+#: usr/local/www/vpn_openvpn_server.php:1666
+#: usr/local/www/system_authservers.php:768
+#: usr/local/www/system_authservers.php:784
+#: usr/local/www/vpn_openvpn_server.php:1718
+#: usr/local/www/system_authservers.php:801
+#: usr/local/www/system_authservers.php:843
+msgid "delete server"
+msgstr "apagar servidor"
+
+#: usr/local/www/system_authservers.php:772
+#: usr/local/www/vpn_openvpn_server.php:1496
+#: usr/local/www/vpn_openvpn_server.php:1638
+#: usr/local/www/vpn_openvpn_server.php:1679
+#: usr/local/www/system_authservers.php:782
+#: usr/local/www/system_authservers.php:798
+#: usr/local/www/vpn_openvpn_server.php:1731
+#: usr/local/www/system_authservers.php:770
+#: usr/local/www/system_authservers.php:812
+msgid "add server"
+msgstr "adicionar servidor"
+
+#: usr/local/www/system_authservers.php:779
+#: usr/local/www/system_authservers.php:789
+#: usr/local/www/system_authservers.php:805
+#: usr/local/www/system_authservers.php:777
+#: usr/local/www/system_authservers.php:819
+msgid "Additional authentication servers can be added here."
+msgstr "Servidores de autenticação adicionais podem ser adicionados aqui."
+
+#: usr/local/www/system_camanager.php:44
+msgid "Import an existing Certificate Authority"
+msgstr "Importar uma Autoridade Certificadora existente"
+
+#: usr/local/www/system_camanager.php:45
+msgid "Create an internal Certificate Authority"
+msgstr "Criar uma Autoridade de Certificadora interna"
+
+#: usr/local/www/system_camanager.php:46
+msgid "Create an intermediate Certificate Authority"
+msgstr "Cria uma Autoridade Certificadora intermediária"
+
+#: usr/local/www/system_camanager.php:50 usr/local/www/system_camanager.php:51
+msgid "Certificate Authority Manager"
+msgstr "Gerenciador de Autoridade de Certificadora"
+
+#: usr/local/www/system_camanager.php:95 usr/local/www/system_camanager.php:96
+#, php-format
+msgid "Certificate Authority %s and its CRLs (if any) successfully deleted"
+msgstr "Autorizadora de Certificado %s e suas CRLs (se existir) excluídas com sucesso"
+
+#: usr/local/www/system_camanager.php:166
+#: usr/local/www/system_camanager.php:402
+#: usr/local/www/system_certmanager.php:165
+#: usr/local/www/system_certmanager.php:511
+#: usr/local/www/system_certmanager.php:193
+#: usr/local/www/system_certmanager.php:610
+#: usr/local/www/system_camanager.php:168
+#: usr/local/www/system_camanager.php:409
+#: usr/local/www/system_certmanager.php:196
+#: usr/local/www/system_certmanager.php:619
+#: usr/local/www/system_certmanager.php:620
+msgid "Certificate data"
+msgstr "Dados do Certificado"
+
+#: usr/local/www/system_camanager.php:170
+#: usr/local/www/system_camanager.php:172
+msgid "Encrypted private keys are not yet supported."
+msgstr "Chaves privadas criptografadas não são suportadas ainda."
+
+#: usr/local/www/system_camanager.php:178
+#: usr/local/www/system_camanager.php:194
+#: usr/local/www/system_camanager.php:453
+#: usr/local/www/system_certmanager.php:178
+#: usr/local/www/system_certmanager.php:194
+#: usr/local/www/system_certmanager.php:566
+#: usr/local/www/system_certmanager.php:656
+#: usr/local/www/system_usermanager.php:191
+#: usr/local/www/system_usermanager.php:725
+#: usr/local/www/system_certmanager.php:206
+#: usr/local/www/system_certmanager.php:223
+#: usr/local/www/system_certmanager.php:665
+#: usr/local/www/system_certmanager.php:820
+#: usr/local/www/system_usermanager.php:723
+#: usr/local/www/system_camanager.php:454
+#: usr/local/www/system_camanager.php:180
+#: usr/local/www/system_camanager.php:196
+#: usr/local/www/system_camanager.php:461
+#: usr/local/www/system_certmanager.php:209
+#: usr/local/www/system_certmanager.php:226
+#: usr/local/www/system_certmanager.php:674
+#: usr/local/www/system_certmanager.php:845
+#: usr/local/www/system_certmanager.php:675
+#: usr/local/www/system_certmanager.php:849
+msgid "Key length"
+msgstr "Tamanho da chave"
+
+#: usr/local/www/system_camanager.php:179
+#: usr/local/www/system_camanager.php:195
+#: usr/local/www/system_camanager.php:469
+#: usr/local/www/system_certmanager.php:179
+#: usr/local/www/system_certmanager.php:582
+#: usr/local/www/system_crlmanager.php:366
+#: usr/local/www/system_usermanager.php:192
+#: usr/local/www/system_usermanager.php:739
+#: usr/local/www/vpn_ipsec_phase1.php:758
+#: usr/local/www/vpn_ipsec_phase2.php:619
+#: usr/local/www/system_certmanager.php:208
+#: usr/local/www/system_certmanager.php:698
+#: usr/local/www/system_usermanager.php:737
+#: usr/local/www/system_camanager.php:470
+#: usr/local/www/vpn_ipsec_phase2.php:645
+#: usr/local/www/vpn_ipsec_phase1.php:771
+#: usr/local/www/system_crlmanager.php:367
+#: usr/local/www/vpn_ipsec_phase2.php:741
+#: usr/local/www/vpn_ipsec_phase1.php:768
+#: usr/local/www/system_camanager.php:181
+#: usr/local/www/system_camanager.php:197
+#: usr/local/www/system_camanager.php:493
+#: usr/local/www/system_certmanager.php:211
+#: usr/local/www/system_certmanager.php:723
+#: usr/local/www/vpn_ipsec_phase1.php:789
+#: usr/local/www/vpn_ipsec_phase2.php:762
+#: usr/local/www/system_certmanager.php:724
+msgid "Lifetime"
+msgstr "Tempo de vida"
+
+#: usr/local/www/system_camanager.php:180
+#: usr/local/www/system_camanager.php:196
+#: usr/local/www/system_certmanager.php:180
+#: usr/local/www/system_certmanager.php:195
+#: usr/local/www/system_certmanager.php:209
+#: usr/local/www/system_certmanager.php:224
+#: usr/local/www/system_camanager.php:182
+#: usr/local/www/system_camanager.php:198
+#: usr/local/www/system_certmanager.php:212
+#: usr/local/www/system_certmanager.php:227
+msgid "Distinguished name Country Code"
+msgstr "Código de País de nome distinto"
+
+#: usr/local/www/system_camanager.php:181
+#: usr/local/www/system_camanager.php:197
+#: usr/local/www/system_certmanager.php:181
+#: usr/local/www/system_certmanager.php:196
+#: usr/local/www/system_certmanager.php:210
+#: usr/local/www/system_certmanager.php:225
+#: usr/local/www/system_camanager.php:183
+#: usr/local/www/system_camanager.php:199
+#: usr/local/www/system_certmanager.php:213
+#: usr/local/www/system_certmanager.php:228
+msgid "Distinguished name State or Province"
+msgstr "Estado ou Província de nome distinto"
+
+#: usr/local/www/system_camanager.php:182
+#: usr/local/www/system_camanager.php:198
+#: usr/local/www/system_certmanager.php:182
+#: usr/local/www/system_certmanager.php:197
+#: usr/local/www/system_certmanager.php:211
+#: usr/local/www/system_certmanager.php:226
+#: usr/local/www/system_camanager.php:184
+#: usr/local/www/system_camanager.php:200
+#: usr/local/www/system_certmanager.php:214
+#: usr/local/www/system_certmanager.php:229
+msgid "Distinguished name City"
+msgstr "Cidade de nome distinto"
+
+#: usr/local/www/system_camanager.php:183
+#: usr/local/www/system_camanager.php:199
+#: usr/local/www/system_certmanager.php:183
+#: usr/local/www/system_certmanager.php:198
+#: usr/local/www/system_certmanager.php:212
+#: usr/local/www/system_certmanager.php:227
+#: usr/local/www/system_camanager.php:185
+#: usr/local/www/system_camanager.php:201
+#: usr/local/www/system_certmanager.php:215
+#: usr/local/www/system_certmanager.php:230
+msgid "Distinguished name Organization"
+msgstr "Organização de nome distinto"
+
+#: usr/local/www/system_camanager.php:184
+#: usr/local/www/system_camanager.php:200
+#: usr/local/www/system_certmanager.php:184
+#: usr/local/www/system_certmanager.php:199
+#: usr/local/www/system_certmanager.php:213
+#: usr/local/www/system_certmanager.php:228
+#: usr/local/www/system_camanager.php:186
+#: usr/local/www/system_camanager.php:202
+#: usr/local/www/system_certmanager.php:216
+#: usr/local/www/system_certmanager.php:231
+msgid "Distinguished name Email Address"
+msgstr "Endereço de E-mail de nome distinto"
+
+#: usr/local/www/system_camanager.php:185
+#: usr/local/www/system_camanager.php:201
+#: usr/local/www/system_certmanager.php:185
+#: usr/local/www/system_certmanager.php:200
+#: usr/local/www/system_certmanager.php:214
+#: usr/local/www/system_certmanager.php:229
+#: usr/local/www/system_camanager.php:187
+#: usr/local/www/system_camanager.php:203
+#: usr/local/www/system_certmanager.php:217
+#: usr/local/www/system_certmanager.php:232
+msgid "Distinguished name Common Name"
+msgstr "Nome Comum de nome distinto"
+
+#: usr/local/www/system_camanager.php:193
+#: usr/local/www/system_camanager.php:436
+#: usr/local/www/system_camanager.php:437
+#: usr/local/www/system_camanager.php:195
+#: usr/local/www/system_camanager.php:444
+msgid "Signing Certificate Authority"
+msgstr "Assinatura da Autoridade Certificadora"
+
+#: usr/local/www/system_camanager.php:348
+#: usr/local/www/system_certmanager.php:458
+#: usr/local/www/system_crlmanager.php:283
+#: usr/local/www/system_certmanager.php:557
+#: usr/local/www/system_crlmanager.php:284
+#: usr/local/www/system_camanager.php:355
+#: usr/local/www/system_certmanager.php:566
+#: usr/local/www/system_certmanager.php:567
+msgid "CAs"
+msgstr "CAs"
+
+#: usr/local/www/system_camanager.php:349
+#: usr/local/www/system_camanager.php:568
+#: usr/local/www/system_certmanager.php:459
+#: usr/local/www/system_crlmanager.php:284
+#: usr/local/www/system_crlmanager.php:489
+#: usr/local/www/system_certmanager.php:558
+#: usr/local/www/system_camanager.php:569
+#: usr/local/www/system_crlmanager.php:285
+#: usr/local/www/system_crlmanager.php:522
+#: usr/local/www/system_camanager.php:356
+#: usr/local/www/system_camanager.php:593
+#: usr/local/www/system_certmanager.php:567
+#: usr/local/www/system_certmanager.php:568
+msgid "Certificates"
+msgstr "Certificados"
+
+#: usr/local/www/system_camanager.php:350
+#: usr/local/www/system_certmanager.php:460
+#: usr/local/www/system_crlmanager.php:285
+#: usr/local/www/system_certmanager.php:559
+#: usr/local/www/system_crlmanager.php:286
+#: usr/local/www/system_camanager.php:357
+#: usr/local/www/system_certmanager.php:568
+#: usr/local/www/system_certmanager.php:569
+msgid "Certificate Revocation"
+msgstr "Revogação de Certificado"
+
+#: usr/local/www/system_camanager.php:376
+#: usr/local/www/system_certmanager.php:475
+#: usr/local/www/system_crlmanager.php:300
+#: usr/local/www/system_certmanager.php:574
+#: usr/local/www/system_crlmanager.php:301
+#: usr/local/www/system_camanager.php:383
+#: usr/local/www/system_certmanager.php:583
+#: usr/local/www/system_certmanager.php:584
+msgid "Method"
+msgstr "Método"
+
+#: usr/local/www/system_camanager.php:398
+#: usr/local/www/system_camanager.php:405
+msgid "Existing Certificate Authority"
+msgstr "Fonte Autorizadora Existente"
+
+#: usr/local/www/system_camanager.php:410
+#: usr/local/www/system_camanager.php:417
+msgid "Certificate Private Key"
+msgstr "Chave Privada do Certificado"
+
+#: usr/local/www/system_camanager.php:410
+#: usr/local/www/system_camanager.php:417
+msgid "(optional)"
+msgstr "(opcional)"
+
+#: usr/local/www/system_camanager.php:414
+#: usr/local/www/system_camanager.php:421
+msgid "Paste the private key for the above certificate here. This is optional in most cases, but required if you need to generate a Certificate Revocation List (CRL)."
+msgstr "Cole a chave privada para o certificado acima aqui. Isso é opcional na maioria dos casos, mas requerido se você precisa gerar uma Lista de Revogação de Certificado (CRL)."
+
+#: usr/local/www/system_camanager.php:420
+#: usr/local/www/system_crlmanager.php:374
+#: usr/local/www/system_crlmanager.php:375
+msgid "Serial"
+msgstr "Serial"
+
+#: usr/local/www/system_camanager.php:433
+#: usr/local/www/system_camanager.php:434
+#: usr/local/www/system_camanager.php:441
+msgid "Internal Certificate Authority"
+msgstr "Fonte Autorizadora de Certificado Interno"
+
+#: usr/local/www/system_camanager.php:472
+#: usr/local/www/system_certmanager.php:585
+#: usr/local/www/system_crlmanager.php:369
+#: usr/local/www/system_certmanager.php:701
+#: usr/local/www/system_camanager.php:473
+#: usr/local/www/system_crlmanager.php:370
+#: usr/local/www/system_camanager.php:496
+#: usr/local/www/system_certmanager.php:726
+#: usr/local/www/system_certmanager.php:727
+msgid "days"
+msgstr "dias"
+
+#: usr/local/www/system_camanager.php:480
+#: usr/local/www/system_certmanager.php:593
+#: usr/local/www/system_certmanager.php:676
+#: usr/local/www/system_certmanager.php:709
+#: usr/local/www/system_certmanager.php:842
+#: usr/local/www/system_camanager.php:481
+#: usr/local/www/system_camanager.php:504
+#: usr/local/www/system_certmanager.php:734
+#: usr/local/www/system_certmanager.php:883
+#: usr/local/www/system_certmanager.php:735
+#: usr/local/www/system_certmanager.php:887
+msgid "Country Code"
+msgstr "Código do país"
+
+#: usr/local/www/system_camanager.php:494
+#: usr/local/www/system_certmanager.php:599
+#: usr/local/www/system_certmanager.php:690
+#: usr/local/www/system_certmanager.php:715
+#: usr/local/www/system_certmanager.php:856
+#: usr/local/www/system_camanager.php:495
+#: usr/local/www/system_camanager.php:519
+#: usr/local/www/system_certmanager.php:740
+#: usr/local/www/system_certmanager.php:898
+#: usr/local/www/system_certmanager.php:741
+#: usr/local/www/system_certmanager.php:902
+msgid "State or Province"
+msgstr "Estado ou Província"
+
+#: usr/local/www/system_camanager.php:498
+#: usr/local/www/system_camanager.php:508
+#: usr/local/www/system_camanager.php:518
+#: usr/local/www/system_camanager.php:528
+#: usr/local/www/system_camanager.php:538
+#: usr/local/www/system_camanager.php:499
+#: usr/local/www/system_camanager.php:509
+#: usr/local/www/system_camanager.php:519
+#: usr/local/www/system_camanager.php:529
+#: usr/local/www/system_camanager.php:539
+#: usr/local/www/system_camanager.php:523
+#: usr/local/www/system_camanager.php:533
+#: usr/local/www/system_camanager.php:543
+#: usr/local/www/system_camanager.php:553
+#: usr/local/www/system_camanager.php:563
+msgid "ex:"
+msgstr "ex:"
+
+#: usr/local/www/system_camanager.php:500
+#: usr/local/www/system_certmanager.php:696
+#: usr/local/www/system_certmanager.php:862
+#: usr/local/www/system_camanager.php:501
+#: usr/local/www/system_camanager.php:525
+#: usr/local/www/system_certmanager.php:904
+#: usr/local/www/system_certmanager.php:908
+msgid "Texas"
+msgstr "Texas"
+
+#: usr/local/www/system_camanager.php:504
+#: usr/local/www/system_certmanager.php:605
+#: usr/local/www/system_certmanager.php:700
+#: usr/local/www/system_certmanager.php:721
+#: usr/local/www/system_certmanager.php:866
+#: usr/local/www/system_camanager.php:505
+#: usr/local/www/system_camanager.php:529
+#: usr/local/www/system_certmanager.php:746
+#: usr/local/www/system_certmanager.php:908
+#: usr/local/www/system_certmanager.php:747
+#: usr/local/www/system_certmanager.php:912
+msgid "City"
+msgstr "Cidade"
+
+#: usr/local/www/system_camanager.php:510
+#: usr/local/www/system_certmanager.php:706
+#: usr/local/www/system_certmanager.php:872
+#: usr/local/www/system_camanager.php:511
+#: usr/local/www/system_camanager.php:535
+#: usr/local/www/system_certmanager.php:914
+#: usr/local/www/system_certmanager.php:918
+msgid "Austin"
+msgstr "Austin"
+
+#: usr/local/www/system_camanager.php:514
+#: usr/local/www/system_certmanager.php:611
+#: usr/local/www/system_certmanager.php:710
+#: usr/local/www/system_certmanager.php:727
+#: usr/local/www/system_certmanager.php:876
+#: usr/local/www/system_camanager.php:515
+#: usr/local/www/system_camanager.php:539
+#: usr/local/www/system_certmanager.php:752
+#: usr/local/www/system_certmanager.php:918
+#: usr/local/www/system_certmanager.php:753
+#: usr/local/www/system_certmanager.php:922
+msgid "Organization"
+msgstr "Organização"
+
+#: usr/local/www/system_camanager.php:520
+#: usr/local/www/system_certmanager.php:716
+#: usr/local/www/system_certmanager.php:882
+#: usr/local/www/system_camanager.php:521
+#: usr/local/www/system_camanager.php:545
+#: usr/local/www/system_certmanager.php:924
+#: usr/local/www/system_certmanager.php:928
+msgid "My Company Inc."
+msgstr "Minha Companhia Ltda."
+
+#: usr/local/www/system_camanager.php:530
+#: usr/local/www/system_camanager.php:531
+#: usr/local/www/system_camanager.php:555
+msgid "admin@mycompany.com"
+msgstr "admin@empresa.com"
+
+#: usr/local/www/system_camanager.php:540
+#: usr/local/www/system_camanager.php:541
+#: usr/local/www/system_camanager.php:565
+msgid "internal-ca"
+msgstr "CA interno"
+
+#: usr/local/www/system_camanager.php:566
+#: usr/local/www/system_crlmanager.php:488
+#: usr/local/www/system_camanager.php:567
+#: usr/local/www/system_crlmanager.php:521
+#: usr/local/www/system_camanager.php:591
+msgid "Internal"
+msgstr "Interno"
+
+#: usr/local/www/system_camanager.php:567
+#: usr/local/www/system_certmanager.php:855
+#: usr/local/www/system_certmanager.php:1021
+#: usr/local/www/system_camanager.php:568
+#: usr/local/www/system_camanager.php:592
+#: usr/local/www/system_certmanager.php:1063
+#: usr/local/www/system_certmanager.php:1067
+msgid "Issuer"
+msgstr "Emissor"
+
+#: usr/local/www/system_camanager.php:569
+#: usr/local/www/system_certmanager.php:856
+#: usr/local/www/system_certmanager.php:1022
+#: usr/local/www/system_camanager.php:570
+#: usr/local/www/system_camanager.php:594
+#: usr/local/www/system_certmanager.php:1064
+#: usr/local/www/system_certmanager.php:1068
+msgid "Distinguished Name"
+msgstr "Nome distinto"
+
+#: usr/local/www/system_camanager.php:579
+#: usr/local/www/system_certmanager.php:869
+#: usr/local/www/system_certmanager.php:1036
+#: usr/local/www/system_camanager.php:580
+#: usr/local/www/system_camanager.php:605
+#: usr/local/www/system_certmanager.php:1079
+#: usr/local/www/system_certmanager.php:1083
+msgid "self-signed"
+msgstr "auto-assinada"
+
+#: usr/local/www/system_camanager.php:581
+#: usr/local/www/system_certmanager.php:871
+#: usr/local/www/system_certmanager.php:1038
+#: usr/local/www/system_camanager.php:582
+#: usr/local/www/system_camanager.php:607
+#: usr/local/www/system_certmanager.php:1081
+#: usr/local/www/system_certmanager.php:1085
+msgid "external"
+msgstr "externa"
+
+#: usr/local/www/system_camanager.php:626
+#: usr/local/www/system_camanager.php:627
+#: usr/local/www/system_camanager.php:665
+msgid "edit CA"
+msgstr "Editar CA"
+
+#: usr/local/www/system_camanager.php:629
+#: usr/local/www/system_camanager.php:630
+#: usr/local/www/system_camanager.php:668
+msgid "export CA cert"
+msgstr "exportar certificado CA"
+
+#: usr/local/www/system_camanager.php:633
+#: usr/local/www/system_camanager.php:634
+#: usr/local/www/system_camanager.php:672
+msgid "export CA private key"
+msgstr "exportar chave privada da CA"
+
+#: usr/local/www/system_camanager.php:636
+#: usr/local/www/system_camanager.php:637
+#: usr/local/www/system_camanager.php:675
+msgid "Do you really want to delete this Certificate Authority and its CRLs, and unreference any associated certificates?"
+msgstr "Você realmente deseja apagar essa Autoridade Certificadora (CA), todos os seus CRLs e remover a referência de qualquer certificado associado?"
+
+#: usr/local/www/system_camanager.php:637
+#: usr/local/www/system_camanager.php:638
+#: usr/local/www/system_camanager.php:676
+msgid "delete ca"
+msgstr "apagar CA"
+
+#: usr/local/www/system_camanager.php:649
+#: usr/local/www/system_certmanager.php:952
+#: usr/local/www/system_certmanager.php:1132
+#: usr/local/www/system_camanager.php:650
+#: usr/local/www/system_certmanager.php:1135
+#: usr/local/www/system_camanager.php:688
+#: usr/local/www/system_certmanager.php:1191
+#: usr/local/www/system_certmanager.php:1195
+msgid "add or import ca"
+msgstr "adicionar ou importar CA"
+
+#: usr/local/www/system_camanager.php:649
+#: usr/local/www/system_certmanager.php:952
+#: usr/local/www/system_certmanager.php:1132
+#: usr/local/www/system_camanager.php:650
+#: usr/local/www/system_certmanager.php:1135
+#: usr/local/www/system_camanager.php:688
+#: usr/local/www/system_certmanager.php:1191
+#: usr/local/www/system_certmanager.php:1195
+msgid "add ca"
+msgstr "adicionar CA"
+
+#: usr/local/www/system_camanager.php:656
+#: usr/local/www/system_camanager.php:657
+#: usr/local/www/system_camanager.php:695
+msgid "Additional trusted Certificate Authorities can be added here."
+msgstr "Fontes Certificadoras confiáveis adicionais podem ser adicionadas aqui."
+
+#: usr/local/www/system_certmanager.php:44
+msgid "Import an existing Certificate"
+msgstr "Importar um Certificado existente"
+
+#: usr/local/www/system_certmanager.php:45
+msgid "Create an internal Certificate"
+msgstr "Criar um certificado interno"
+
+#: usr/local/www/system_certmanager.php:46
+msgid "Create a Certificate Signing Request"
+msgstr "Criar uma Requisição de Assinatura de Certificado"
+
+#: usr/local/www/system_certmanager.php:51
+#: usr/local/www/system_certmanager.php:56
+#: usr/local/www/system_certmanager.php:57
+msgid "Certificate Manager"
+msgstr "Gerenciador de Certificado"
+
+#: usr/local/www/system_certmanager.php:57
+#: usr/local/www/system_certmanager.php:62
+#: usr/local/www/system_certmanager.php:63
+msgid "Choose an existing certificate"
+msgstr "Escolha um certificado existente"
+
+#: usr/local/www/system_certmanager.php:96
+#: usr/local/www/system_certmanager.php:101
+#: usr/local/www/system_certmanager.php:102
+#, php-format
+msgid "Certificate %s successfully deleted"
+msgstr "Certificado %s foi apagado com sucesso"
+
+#: usr/local/www/system_certmanager.php:166
+#: usr/local/www/system_certmanager.php:194
+#: usr/local/www/system_certmanager.php:197
+msgid "Key data"
+msgstr "Dado chave"
+
+#: usr/local/www/system_certmanager.php:177
+#: usr/local/www/system_certmanager.php:549
+#: usr/local/www/system_usermanager.php:190
+#: usr/local/www/system_usermanager.php:711
+#: usr/local/www/system_certmanager.php:205
+#: usr/local/www/system_certmanager.php:648
+#: usr/local/www/system_usermanager.php:709
+#: usr/local/www/system_certmanager.php:208
+#: usr/local/www/system_certmanager.php:657
+#: usr/local/www/system_certmanager.php:658
+msgid "Certificate authority"
+msgstr "Fonte Autorizadora"
+
+#: usr/local/www/system_certmanager.php:205
+#: usr/local/www/system_certmanager.php:234
+#: usr/local/www/system_certmanager.php:237
+msgid "Existing Certificate Choice"
+msgstr "Escolha de Certificado Existente"
+
+#: usr/local/www/system_certmanager.php:300
+#: usr/local/www/system_certmanager.php:796
+#: usr/local/www/system_certmanager.php:840
+#: usr/local/www/system_certmanager.php:387
+#: usr/local/www/system_certmanager.php:962
+#: usr/local/www/system_certmanager.php:1006
+#: usr/local/www/system_certmanager.php:396
+#: usr/local/www/system_certmanager.php:1004
+#: usr/local/www/system_certmanager.php:1048
+#: usr/local/www/system_certmanager.php:1008
+#: usr/local/www/system_certmanager.php:1052
+msgid "Update"
+msgstr "Atualizar"
+
+#: usr/local/www/system_certmanager.php:308
+#: usr/local/www/system_certmanager.php:822
+#: usr/local/www/system_certmanager.php:395
+#: usr/local/www/system_certmanager.php:988
+#: usr/local/www/system_certmanager.php:404
+#: usr/local/www/system_certmanager.php:1030
+msgid "Final Certificate data"
+msgstr "Dado de Certificado Final"
+
+#: usr/local/www/system_certmanager.php:328
+#: usr/local/www/system_certmanager.php:415
+#: usr/local/www/system_certmanager.php:424
+#, php-format
+msgid "The certificate modulus does not match the signing request modulus."
+msgstr "O módulo de certificado não coincide com o módulo de solicitação de assinatura."
+
+#: usr/local/www/system_certmanager.php:507
+#: usr/local/www/system_certmanager.php:606
+#: usr/local/www/system_certmanager.php:615
+#: usr/local/www/system_certmanager.php:616
+msgid "Import Certificate"
+msgstr "Importar Certificado"
+
+#: usr/local/www/system_certmanager.php:519
+#: usr/local/www/system_certmanager.php:618
+#: usr/local/www/system_certmanager.php:627
+#: usr/local/www/system_certmanager.php:628
+msgid "Private key data"
+msgstr "Dado de chave privada"
+
+#: usr/local/www/system_certmanager.php:523
+#: usr/local/www/system_certmanager.php:622
+#: usr/local/www/system_certmanager.php:631
+#: usr/local/www/system_certmanager.php:632
+msgid "Paste a private key in X.509 PEM format here."
+msgstr "Cole uma chave privada no formato X.509 PEM aqui."
+
+#: usr/local/www/system_certmanager.php:533
+#: usr/local/www/system_certmanager.php:632
+#: usr/local/www/system_certmanager.php:641
+#: usr/local/www/system_certmanager.php:642
+msgid "Internal Certificate"
+msgstr "Certificação Interna"
+
+#: usr/local/www/system_certmanager.php:540
+#: usr/local/www/system_certmanager.php:639
+#: usr/local/www/system_certmanager.php:648
+#: usr/local/www/system_certmanager.php:649
+msgid "No internal Certificate Authorities have been defined. You must"
+msgstr "Nenhuma Fonte Autorizadora de Certificado (CA) interna foi definida. Você deve"
+
+#: usr/local/www/system_certmanager.php:542
+#: usr/local/www/system_certmanager.php:641
+#: usr/local/www/system_certmanager.php:650
+#: usr/local/www/system_certmanager.php:651
+msgid "an internal CA before creating an internal certificate."
+msgstr "um CA interno antes de criar um certificado interno."
+
+#: usr/local/www/system_certmanager.php:623
+#: usr/local/www/system_certmanager.php:726
+#: usr/local/www/system_certmanager.php:739
+#: usr/local/www/system_certmanager.php:892
+#: usr/local/www/system_certmanager.php:764
+#: usr/local/www/system_certmanager.php:934
+#: usr/local/www/system_certmanager.php:765
+#: usr/local/www/system_certmanager.php:938
+msgid "webadmin@mycompany.com"
+msgstr "webadmin@empresa.com"
+
+#: usr/local/www/system_certmanager.php:637
+#: usr/local/www/system_certmanager.php:736
+#: usr/local/www/system_certmanager.php:753
+#: usr/local/www/system_certmanager.php:902
+#: usr/local/www/system_certmanager.php:778
+#: usr/local/www/system_certmanager.php:944
+#: usr/local/www/system_certmanager.php:779
+#: usr/local/www/system_certmanager.php:948
+msgid "www.example.com"
+msgstr "www.examplo.com"
+
+#: usr/local/www/system_certmanager.php:653
+#: usr/local/www/system_certmanager.php:817
+#: usr/local/www/system_certmanager.php:842
+#: usr/local/www/system_certmanager.php:846
+msgid "External Signing Request"
+msgstr "Requisição de Assinatura Externa"
+
+#: usr/local/www/system_certmanager.php:749
+#: usr/local/www/system_certmanager.php:915
+#: usr/local/www/system_certmanager.php:957
+#: usr/local/www/system_certmanager.php:961
+msgid "Choose an Existing Certificate"
+msgstr "Escolher um Certificado Existente"
+
+#: usr/local/www/system_certmanager.php:752
+#: usr/local/www/system_certmanager.php:918
+#: usr/local/www/system_certmanager.php:960
+#: usr/local/www/system_certmanager.php:964
+msgid "Existing Certificates"
+msgstr "Certificados Existentes"
+
+#: usr/local/www/system_certmanager.php:810
+#: usr/local/www/system_certmanager.php:976
+#: usr/local/www/system_certmanager.php:1018
+#: usr/local/www/system_certmanager.php:1022
+msgid "Complete Signing Request"
+msgstr "Requisição de assinatura completa"
+
+#: usr/local/www/system_certmanager.php:814
+#: usr/local/www/system_certmanager.php:980
+#: usr/local/www/system_certmanager.php:1022
+msgid "Signing Request data"
+msgstr "Assinando dado Requisitado"
+
+#: usr/local/www/system_certmanager.php:818
+#: usr/local/www/system_certmanager.php:984
+#: usr/local/www/system_certmanager.php:1026
+#: usr/local/www/system_certmanager.php:1030
+msgid "Copy the certificate signing data from here and forward it to your certificate authority for signing."
+msgstr "Copie o dado da assinatura do certificado daqui e encaminhe-o para sua fonte autorizadora de certificado para ser assinado."
+
+#: usr/local/www/system_certmanager.php:826
+#: usr/local/www/system_certmanager.php:992
+#: usr/local/www/system_certmanager.php:1034
+#: usr/local/www/system_certmanager.php:1038
+msgid "Paste the certificate received from your certificate authority here."
+msgstr "Cole o certificado recebido de sua autoridade certificadora aqui."
+
+#: usr/local/www/system_certmanager.php:857
+#: usr/local/www/system_crlmanager.php:490
+#: usr/local/www/system_certmanager.php:1023
+#: usr/local/www/system_crlmanager.php:523
+#: usr/local/www/system_certmanager.php:1065
+#: usr/local/www/system_certmanager.php:1069
+msgid "In Use"
+msgstr "Em Uso"
+
+#: usr/local/www/system_certmanager.php:877
+#: usr/local/www/system_certmanager.php:1044
+#: usr/local/www/system_certmanager.php:1087
+#: usr/local/www/system_certmanager.php:1091
+msgid "external - signature pending"
+msgstr "externa - assinatura pendente"
+
+#: usr/local/www/system_certmanager.php:926
+#: usr/local/www/system_usermanager.php:658
+#: usr/local/www/system_certmanager.php:1103
+#: usr/local/www/system_usermanager.php:656
+#: usr/local/www/system_certmanager.php:1106
+#: usr/local/www/system_certmanager.php:1162
+#: usr/local/www/system_certmanager.php:1166
+msgid "export cert"
+msgstr "exportar cert"
+
+#: usr/local/www/system_certmanager.php:926
+#: usr/local/www/system_certmanager.php:929
+#: usr/local/www/system_certmanager.php:1103
+#: usr/local/www/system_certmanager.php:1106
+#: usr/local/www/system_certmanager.php:1109
+#: usr/local/www/system_certmanager.php:1162
+#: usr/local/www/system_certmanager.php:1165
+#: usr/local/www/system_certmanager.php:1166
+#: usr/local/www/system_certmanager.php:1169
+msgid "export ca"
+msgstr "exportar CA"
+
+#: usr/local/www/system_certmanager.php:929
+#: usr/local/www/system_certmanager.php:1106
+#: usr/local/www/system_certmanager.php:1109
+#: usr/local/www/system_certmanager.php:1165
+#: usr/local/www/system_certmanager.php:1169
+msgid "export key"
+msgstr "exportar chave"
+
+#: usr/local/www/system_certmanager.php:932
+#: usr/local/www/system_certmanager.php:1112
+#: usr/local/www/system_certmanager.php:1115
+#: usr/local/www/system_certmanager.php:1171
+#: usr/local/www/system_certmanager.php:1175
+msgid "Do you really want to delete this Certificate?"
+msgstr "Você realmente deseja apagar esse Certificado?"
+
+#: usr/local/www/system_certmanager.php:933
+#: usr/local/www/system_usermanager.php:661
+#: usr/local/www/system_certmanager.php:1113
+#: usr/local/www/system_usermanager.php:659
+#: usr/local/www/system_certmanager.php:1116
+#: usr/local/www/system_certmanager.php:1172
+#: usr/local/www/system_certmanager.php:1176
+msgid "delete cert"
+msgstr "apagar cert"
+
+#: usr/local/www/system_certmanager.php:939
+#: usr/local/www/system_certmanager.php:1119
+#: usr/local/www/system_certmanager.php:1122
+#: usr/local/www/system_certmanager.php:1178
+#: usr/local/www/system_certmanager.php:1182
+msgid "update csr"
+msgstr "atualizar csr"
+
+#: usr/local/www/system_certmanager.php:958
+#: usr/local/www/system_certmanager.php:1138
+#: usr/local/www/system_certmanager.php:1141
+#: usr/local/www/system_certmanager.php:1197
+#: usr/local/www/system_certmanager.php:1201
+msgid "Note: You can only delete a certificate if it is not currently in use."
+msgstr "NOTA: Você só pode excluir um certificado se o mesmo não estiver em uso."
+
+#: usr/local/www/system_crlmanager.php:46
+msgid "Certificate Revocation List Manager"
+msgstr "Gerenciador de Lista de Revogação de Certificado"
+
+#: usr/local/www/system_crlmanager.php:49
+msgid "Create an internal Certificate Revocation List"
+msgstr "Crie uma Lista de Revogação de Certificado interna"
+
+#: usr/local/www/system_crlmanager.php:50
+msgid "Import an existing Certificate Revocation List"
+msgstr "Importe uma Lista de Revogação de Certificado existente"
+
+#: usr/local/www/system_crlmanager.php:86
+msgid "Invalid CRL reference."
+msgstr "Referência a Lista de Revogação de Certificado inválida."
+
+#: usr/local/www/system_crlmanager.php:92
+#, php-format
+msgid "Certificate Revocation List %s is in use and cannot be deleted"
+msgstr "Lista de Revogação de Certificado %s esta sendo usada e não pode ser apagada"
+
+#: usr/local/www/system_crlmanager.php:98
+#, php-format
+msgid "Certificate Revocation List %s successfully deleted"
+msgstr "Lista de Revogação de Certificado %s apagada com sucesso"
+
+#: usr/local/www/system_crlmanager.php:136
+msgid "Both the Certificate and CRL must be specified."
+msgstr "O Certificado e Lista de Revogação de Certificado devem ser especificados."
+
+#: usr/local/www/system_crlmanager.php:140
+msgid "CA mismatch between the Certificate and CRL. Unable to Revoke."
+msgstr "Fonte Certificadora incompatível entre o Certificado e Lista de Revogação de Certificado. Impossível revogar."
+
+#: usr/local/www/system_crlmanager.php:143
+msgid "Cannot revoke certificates for an imported/external CRL."
+msgstr "Não é possível revogar certificados para uma Lista de Revogação de Certificado importada/externa."
+
+#: usr/local/www/system_crlmanager.php:175
+#: usr/local/www/system_crlmanager.php:177
+#, php-format
+msgid "Deleted Certificate %s from CRL %s"
+msgstr "Remover Certificado %s da Lista de Revogação de Certificado %s"
+
+#: usr/local/www/system_crlmanager.php:179
+#, php-format
+msgid "Failed to delete Certificate %s from CRL %s"
+msgstr "Falhou ao apagar o Cerficiado %s da Lista de Revogação de Certificado %s"
+
+#: usr/local/www/system_crlmanager.php:194
+#: usr/local/www/system_crlmanager.php:193
+msgid "Certificate Revocation List data"
+msgstr "Dados de Lista de Revogação de Certificado"
+
+#: usr/local/www/system_crlmanager.php:201
+#: usr/local/www/system_crlmanager.php:324
+#: usr/local/www/vpn_ipsec_phase1.php:166
+#: usr/local/www/vpn_openvpn_client.php:210
+#: usr/local/www/vpn_openvpn_server.php:282
+#: usr/local/www/vpn_openvpn_server.php:287
+#: usr/local/www/vpn_openvpn_client.php:214
+#: usr/local/www/system_crlmanager.php:200
+#: usr/local/www/system_crlmanager.php:325
+#: usr/local/www/vpn_openvpn_server.php:288
+#: usr/local/www/vpn_openvpn_client.php:220
+#: usr/local/www/vpn_openvpn_client.php:238
+#: usr/local/www/vpn_openvpn_server.php:309
+msgid "Certificate Authority"
+msgstr "Fonte Certificadora"
+
+#: usr/local/www/system_crlmanager.php:345
+#: usr/local/www/system_crlmanager.php:346
+msgid "Existing Certificate Revocation List"
+msgstr "Lista de Revogação de Certificado existente"
+
+#: usr/local/www/system_crlmanager.php:349
+#: usr/local/www/system_crlmanager.php:350
+#: usr/local/www/system_crlmanager.php:410
+msgid "CRL data"
+msgstr "Dado de Lista de Revogação de Certificado"
+
+#: usr/local/www/system_crlmanager.php:353
+#: usr/local/www/system_crlmanager.php:354
+#: usr/local/www/system_crlmanager.php:414
+msgid "Paste a Certificate Revocation List in X.509 CRL format here."
+msgstr "Copie uma Lista de Revogação de Certificado no formato X.509 CRL aqui."
+
+#: usr/local/www/system_crlmanager.php:363
+#: usr/local/www/system_crlmanager.php:364
+msgid "Internal Certificate Revocation List"
+msgstr "Lista de Revogação de Certificado Interna"
+
+#: usr/local/www/system_crlmanager.php:370
+#: usr/local/www/system_crlmanager.php:371
+msgid "Default: 9999"
+msgstr "Padrão: 9999"
+
+#: usr/local/www/system_crlmanager.php:378
+#: usr/local/www/system_crlmanager.php:379
+msgid "Default: 0"
+msgstr "Padrão: 0"
+
+#: usr/local/www/system_crlmanager.php:401
+#: usr/local/www/system_crlmanager.php:434
+msgid "Currently Revoked Certificates for CRL"
+msgstr "Certificados Revogados atualmente para Lista de Revogação de Certificado"
+
+#: usr/local/www/system_crlmanager.php:405
+#: usr/local/www/system_crlmanager.php:438
+msgid "Certificate Name"
+msgstr "Nome do Certificado"
+
+#: usr/local/www/system_crlmanager.php:406
+#: usr/local/www/system_crlmanager.php:439
+msgid "Revocation Reason"
+msgstr "Razão de Revogação"
+
+#: usr/local/www/system_crlmanager.php:407
+#: usr/local/www/system_crlmanager.php:440
+msgid "Revoked At"
+msgstr "Revogado Em"
+
+#: usr/local/www/system_crlmanager.php:416
+#: usr/local/www/system_crlmanager.php:449
+msgid "No Certificates Found for this CRL."
+msgstr "Nenhum Certificado Encontrado para essa Lista de Revogação de Certificado."
+
+#: usr/local/www/system_crlmanager.php:435
+#: usr/local/www/system_crlmanager.php:468
+msgid "Do you really want to delete this Certificate from the CRL?"
+msgstr "Você realmente deseja apagar esse Certificado da CRL?"
+
+#: usr/local/www/system_crlmanager.php:436
+#: usr/local/www/system_crlmanager.php:469
+msgid "Delete this certificate from the CRL "
+msgstr "Remover esse certificado para a Lista de Revogação de Certificado "
+
+#: usr/local/www/system_crlmanager.php:453
+#: usr/local/www/system_crlmanager.php:486
+msgid "No Certificates Found for this CA."
+msgstr "Nenhum Certificado Encontrado para essa Fonte Certificadora."
+
+#: usr/local/www/system_crlmanager.php:460
+#: usr/local/www/system_crlmanager.php:493
+msgid "Choose a Certificate to Revoke"
+msgstr "Escolha um Certificado para Revogar"
+
+#: usr/local/www/system_crlmanager.php:465
+#: usr/local/www/system_crlmanager.php:498
+msgid "Reason"
+msgstr "Razão"
+
+#: usr/local/www/system_crlmanager.php:527
+#: usr/local/www/system_crlmanager.php:560
+#: usr/local/www/system_crlmanager.php:568
+#, php-format
+msgid "Add or Import CRL for %s"
+msgstr "Adicionar ou importar Lista de Revogação de Certificado para %s"
+
+#: usr/local/www/system_crlmanager.php:527
+#: usr/local/www/system_crlmanager.php:531
+#: usr/local/www/system_crlmanager.php:560
+#: usr/local/www/system_crlmanager.php:564
+#: usr/local/www/system_crlmanager.php:568
+#: usr/local/www/system_crlmanager.php:572
+msgid "add crl"
+msgstr "adicionar lista de revogação de certificado"
+
+#: usr/local/www/system_crlmanager.php:531
+#: usr/local/www/system_crlmanager.php:564
+#: usr/local/www/system_crlmanager.php:572
+#, php-format
+msgid "Import CRL for %s"
+msgstr "Importar CRL para %s"
+
+#: usr/local/www/system_crlmanager.php:552
+#: usr/local/www/system_crlmanager.php:585
+#: usr/local/www/system_crlmanager.php:593
+msgid "Export CRL"
+msgstr "Exportar Lista de Revogação de Certificado"
+
+#: usr/local/www/system_crlmanager.php:557
+#: usr/local/www/system_crlmanager.php:590
+#: usr/local/www/system_crlmanager.php:594
+#: usr/local/www/system_crlmanager.php:598
+#: usr/local/www/system_crlmanager.php:602
+msgid "Edit CRL"
+msgstr "Editar Lista de Revogação de Certificado"
+
+#: usr/local/www/system_crlmanager.php:561
+#: usr/local/www/system_crlmanager.php:598
+#: usr/local/www/system_crlmanager.php:606
+msgid "Do you really want to delete this Certificate Revocation List?"
+msgstr "Você realmente deseja apagar esta Lista de Revogação de Certificado?"
+
+#: usr/local/www/system_crlmanager.php:562
+#: usr/local/www/system_crlmanager.php:599
+#: usr/local/www/system_crlmanager.php:607
+msgid "Delete CRL"
+msgstr "Remover Lista de Revogação de Certificado"
+
+#: usr/local/www/system_crlmanager.php:582
+#: usr/local/www/system_crlmanager.php:619
+#: usr/local/www/system_crlmanager.php:531
+msgid "Additional Certificate Revocation Lists can be added here."
+msgstr "Listas de Certificado de Revogação adicionais podem ser adicionadas aqui."
+
+#: usr/local/www/system_gateway_groups.php:75
+#: usr/local/www/system_gateway_groups.php:76
+#: usr/local/www/system_gateway_groups.php:85
+msgid "removed gateway group"
+msgstr "grupo de gateway removido"
+
+#: usr/local/www/system_gateway_groups.php:101
+#: usr/local/www/system_gateway_groups.php:102
+#: usr/local/www/system_gateway_groups.php:111
+#, php-format
+msgid "The gateway configuration has been changed.%sYou must apply the changes in order for them to take effect."
+msgstr "A configuração de gateway foi modificada.%sVocê deve aplicar as mudanças para que elas tenham efeito."
+
+#: usr/local/www/system_gateway_groups.php:165
+#: usr/local/www/system_gateway_groups.php:166
+#: usr/local/www/system_gateway_groups.php:187
+msgid "Do you really want to delete this gateway group?"
+msgstr "Você realmente deseja apagar esse grupo de gateway?"
+
+#: usr/local/www/system_gateway_groups.php:195
+#: usr/local/www/system_gateway_groups.php:196
+#: usr/local/www/system_gateway_groups.php:205
+msgid "Remember to use these Gateway Groups in firewall rules in order to enable load balancing, failover, or policy-based routing. Without rules directing traffic into the Gateway Groups, they will not be used."
+msgstr "Lembre-se de usar esses Grupos de Gateway em regras de firewall para habilitar balanceameno de carga, failover, ou roteamento baseado em políticas. Sem regras direcionando o tráfego para os Grupos de Gateway, eles não serão usados."
+
+#: usr/local/www/system_gateway_groups_edit.php:50
+#: usr/local/www/system_gateway_groups_edit.php:53
+msgid "Member Down"
+msgstr "Membro fora do ar"
+
+#: usr/local/www/system_gateway_groups_edit.php:51
+#: usr/local/www/system_gateway_groups_edit.php:54
+msgid "Packet Loss"
+msgstr "Perda de Pacote"
+
+#: usr/local/www/system_gateway_groups_edit.php:52
+#: usr/local/www/system_gateway_groups_edit.php:55
+msgid "High Latency"
+msgstr "Latência Alta"
+
+#: usr/local/www/system_gateway_groups_edit.php:53
+#: usr/local/www/system_gateway_groups_edit.php:56
+msgid "Packet Loss or High Latency"
+msgstr "Perda de Pacote ou Latência Alta"
+
+#: usr/local/www/system_gateway_groups_edit.php:85
+#: usr/local/www/system_gateway_groups_edit.php:88
+msgid "A valid gateway group name must be specified."
+msgstr "Um grupo de gateway válido deve ser especificado."
+
+#: usr/local/www/system_gateway_groups_edit.php:88
+#: usr/local/www/system_gateways_edit.php:106
+#: usr/local/www/system_gateway_groups_edit.php:91
+#: usr/local/www/system_gateways_edit.php:107
+#: usr/local/www/system_gateways_edit.php:108
+msgid "The gateway name must not contain invalid characters."
+msgstr "O nome do gateway não deve conter caracteres inválidos."
+
+#: usr/local/www/system_gateway_groups_edit.php:99
+#: usr/local/www/system_gateway_groups_edit.php:102
+#: usr/local/www/system_gateway_groups_edit.php:105
+#, php-format
+msgid "A gateway group with this name \"%s\" already exists."
+msgstr "Um grupo de gateway com esse nome \"%s\" já existe."
+
+#: usr/local/www/system_gateway_groups_edit.php:115
+#: usr/local/www/system_gateway_groups_edit.php:119
+#: usr/local/www/system_gateway_groups_edit.php:122
+#, php-format
+msgid "A gateway group cannot have the same name with a gateway \"%s\" please choose another name."
+msgstr "Um grupo de gateway não pode ter o mesmo nome que um gateway \"%s\". Por favor, escolha outro nome."
+
+#: usr/local/www/system_gateway_groups_edit.php:119
+#: usr/local/www/system_gateway_groups_edit.php:123
+#: usr/local/www/system_gateway_groups_edit.php:126
+msgid "No gateway(s) have been selected to be used in this group"
+msgstr "Nenhum gateway foi selecionado para ser usado nesse grupo"
+
+#: usr/local/www/system_gateway_groups_edit.php:142
+#: usr/local/www/system_gateways_edit.php:313
+#: usr/local/www/system_gateways_edit.php:344
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/system_gateways_edit.php:319
+#: usr/local/www/system_gateways_edit.php:350
+#: usr/local/www/system_gateway_groups_edit.php:146
+#: usr/local/www/system_gateways_edit.php:425
+#: usr/local/www/system_gateways_edit.php:456
+#: usr/local/www/system_gateways_edit.php:458
+#: usr/local/www/system_gateways_edit.php:455
+#: usr/local/www/system_gateways_edit.php:488
+msgid "Edit gateway"
+msgstr "Editar gateway"
+
+#: usr/local/www/system_gateway_groups_edit.php:155
+#: usr/local/www/system_gateway_groups_edit.php:166
+#: usr/local/www/system_gateway_groups_edit.php:225
+msgid "Edit gateway entry"
+msgstr "Editar entrada do gateway"
+
+#: usr/local/www/system_gateway_groups_edit.php:164
+#: usr/local/www/system_gateway_groups_edit.php:175
+#: usr/local/www/system_gateway_groups_edit.php:234
+#: usr/local/www/system_gateway_groups_edit.php:238
+msgid "Gateway Priority"
+msgstr "Prioridade do Gateway"
+
+#: usr/local/www/system_gateway_groups_edit.php:185
+#: usr/local/www/system_gateway_groups_edit.php:208
+#: usr/local/www/system_gateway_groups_edit.php:268
+#: usr/local/www/system_gateway_groups_edit.php:272
+msgid "Never"
+msgstr "Nunca"
+
+#: usr/local/www/system_gateway_groups_edit.php:186
+#: usr/local/www/system_gateway_groups_edit.php:209
+#: usr/local/www/system_gateway_groups_edit.php:269
+#: usr/local/www/system_gateway_groups_edit.php:273
+msgid "Tier 1"
+msgstr "Camada 1"
+
+#: usr/local/www/system_gateway_groups_edit.php:187
+#: usr/local/www/system_gateway_groups_edit.php:210
+#: usr/local/www/system_gateway_groups_edit.php:270
+#: usr/local/www/system_gateway_groups_edit.php:274
+msgid "Tier 2"
+msgstr "Camada 2"
+
+#: usr/local/www/system_gateway_groups_edit.php:188
+#: usr/local/www/system_gateway_groups_edit.php:211
+#: usr/local/www/system_gateway_groups_edit.php:271
+#: usr/local/www/system_gateway_groups_edit.php:275
+msgid "Tier 3"
+msgstr "Camada 3"
+
+#: usr/local/www/system_gateway_groups_edit.php:189
+#: usr/local/www/system_gateway_groups_edit.php:212
+#: usr/local/www/system_gateway_groups_edit.php:272
+#: usr/local/www/system_gateway_groups_edit.php:276
+msgid "Tier 4"
+msgstr "Camada 4"
+
+#: usr/local/www/system_gateway_groups_edit.php:190
+#: usr/local/www/system_gateway_groups_edit.php:213
+#: usr/local/www/system_gateway_groups_edit.php:273
+#: usr/local/www/system_gateway_groups_edit.php:277
+msgid "Tier 5"
+msgstr "Camada 5"
+
+#: usr/local/www/system_gateway_groups_edit.php:195
+#: usr/local/www/system_gateway_groups_edit.php:247
+#: usr/local/www/system_gateway_groups_edit.php:307
+#: usr/local/www/system_gateway_groups_edit.php:311
+msgid "Link Priority"
+msgstr "Prioridade do Link"
+
+#: usr/local/www/system_gateway_groups_edit.php:196
+#: usr/local/www/system_gateway_groups_edit.php:248
+#: usr/local/www/system_gateway_groups_edit.php:308
+#: usr/local/www/system_gateway_groups_edit.php:312
+msgid "The priority selected here defines in what order failover and balancing of links will be done. Multiple links of the same priority will balance connections until all links in the priority will be exhausted. If all links in a priority level are exhausted we will use the next available link(s) in the next priority level."
+msgstr "A prioridade selecionada aqui define em qual ordem o failover e balanceamento de links serão feitos. Múltiplos links de mesma prioridade irão balancear conexões até que todos os links da prioridade tiverem exaurido. Se todos os links em um nível de prioridade estiverem exaurido, usaremos o(s) próximo(s) link(s) disponíveis no próximo nível de prioridade."
+
+#: usr/local/www/system_gateway_groups_edit.php:205
+#: usr/local/www/system_gateway_groups_edit.php:260
+#: usr/local/www/system_gateway_groups_edit.php:320
+#: usr/local/www/system_gateway_groups_edit.php:322
+msgid "Trigger Level"
+msgstr "Nível de Gatilho"
+
+#: usr/local/www/system_gateway_groups_edit.php:216
+#: usr/local/www/system_gateway_groups_edit.php:271
+#: usr/local/www/system_gateway_groups_edit.php:331
+#: usr/local/www/system_gateway_groups_edit.php:333
+msgid "When to trigger exclusion of a member"
+msgstr "Quando engatilhar exclusão de um membro"
+
+#: usr/local/www/system_gateways.php:134
+msgid "The gateway configuration has been changed."
+msgstr "A configuração do gateway foi modificada."
+
+#: usr/local/www/system_gateways.php:155
+#: usr/local/www/system_gateways_edit.php:398
+#: usr/local/www/system_gateways_edit.php:419
+#: usr/local/www/system_gateways_edit.php:525
+#: usr/local/www/system_gateways_edit.php:529
+#: usr/local/www/system_gateways_edit.php:531
+#: usr/local/www/system_gateways_edit.php:561
+msgid "Monitor IP"
+msgstr "IP Monitor"
+
+#: usr/local/www/system_gateways.php:205
+msgid "Do you really want to delete this gateway?"
+msgstr "Você realmente deseja apagar esse gateway?"
+
+#: usr/local/www/system_gateways_edit.php:110
+#: usr/local/www/system_gateways_edit.php:111
+#: usr/local/www/system_gateways_edit.php:112
+msgid "A valid gateway IP address must be specified."
+msgstr "Um endereço IP de gateway válido deve ser especificado."
+
+#: usr/local/www/system_gateways_edit.php:118
+#: usr/local/www/system_gateways_edit.php:119
+#: usr/local/www/system_gateways_edit.php:120
+#: usr/local/www/system_gateways_edit.php:133
+#: usr/local/www/system_gateways_edit.php:148
+msgid "You can not use a IPv6 Gateway Address on a IPv4 only interface."
+msgstr "Você não pode usar um endereço IPv6 de gateway somente IPv4 em uma interface."
+
+#: usr/local/www/system_gateways_edit.php:122
+#: usr/local/www/system_gateways_edit.php:133
+#: usr/local/www/system_gateways_edit.php:123
+#: usr/local/www/system_gateways_edit.php:136
+#: usr/local/www/system_gateways_edit.php:124
+#: usr/local/www/system_gateways_edit.php:137
+#, php-format
+msgid "The gateway address %1$s does not lie within the chosen interface's subnet '%2$s'."
+msgstr "O gateway endereço %1$ s não se encontram dentro da subrede da interface escolhida '%2$ s'."
+
+#: usr/local/www/system_gateways_edit.php:129
+#: usr/local/www/system_gateways_edit.php:132
+#: usr/local/www/system_gateways_edit.php:133
+#: usr/local/www/system_gateways_edit.php:120
+msgid "You can not use a IPv4 Gateway Address on a IPv6 only interface."
+msgstr "Você não pode usar um endereço IPv4 de gateway somente IPv6 em uma interface."
+
+#: usr/local/www/system_gateways_edit.php:139
+#: usr/local/www/system_gateways_edit.php:143
+#: usr/local/www/system_gateways_edit.php:144
+#: usr/local/www/system_gateways_edit.php:174
+msgid "Dynamic gateway values cannot be specified for interfaces with a static IPv4 configuration."
+msgstr "Valores de gateway dinâmico não pode ser especificado para as interfaces com uma configuração IPv4 estático."
+
+#: usr/local/www/system_gateways_edit.php:143
+#: usr/local/www/system_gateways_edit.php:147
+#: usr/local/www/system_gateways_edit.php:148
+#: usr/local/www/system_gateways_edit.php:178
+msgid "Dynamic gateway values cannot be specified for interfaces with a static IPv6 configuration."
+msgstr "Valores de gateway dinâmico não pode ser especificado para as interfaces com uma configuração IPv6 estático."
+
+#: usr/local/www/system_gateways_edit.php:147
+#: usr/local/www/system_gateways_edit.php:151
+#: usr/local/www/system_gateways_edit.php:152
+#: usr/local/www/system_gateways_edit.php:182
+msgid "A valid monitor IP address must be specified."
+msgstr "Um endereço IP monitor válido deve ser especificado."
+
+#: usr/local/www/system_gateways_edit.php:160
+#: usr/local/www/system_gateways_edit.php:168
+#: usr/local/www/system_gateways_edit.php:178
+#: usr/local/www/system_gateways_edit.php:208
+msgid "Changing name on a gateway is not allowed."
+msgstr "Mudança de nome de gateway não é permitido."
+
+#: usr/local/www/system_gateways_edit.php:165
+#: usr/local/www/system_gateways_edit.php:173
+#: usr/local/www/system_gateways_edit.php:183
+#: usr/local/www/system_gateways_edit.php:213
+#, php-format
+msgid "The gateway name \"%s\" already exists."
+msgstr "O nome do gateway \"%s\" já existe."
+
+#: usr/local/www/system_gateways_edit.php:171
+#: usr/local/www/system_gateways_edit.php:179
+#: usr/local/www/system_gateways_edit.php:189
+#: usr/local/www/system_gateways_edit.php:219
+#, php-format
+msgid "The gateway IP address \"%s\" already exists."
+msgstr "O endereço IP do gateway \"%s\" já existe."
+
+#: usr/local/www/system_gateways_edit.php:177
+#: usr/local/www/system_gateways_edit.php:185
+#: usr/local/www/system_gateways_edit.php:195
+#: usr/local/www/system_gateways_edit.php:225
+#, php-format
+msgid "The monitor IP address \"%s\" is already in use. You must choose a different monitor IP."
+msgstr "O endereço IP monitor \"%s\" já está em uso. Você deve escolher um IP monitor diferente."
+
+#: usr/local/www/system_gateways_edit.php:187
+#: usr/local/www/system_gateways_edit.php:220
+#: usr/local/www/system_gateways_edit.php:195
+#: usr/local/www/system_gateways_edit.php:228
+msgid "The low latency watermark needs to be a numeric value."
+msgstr "A marca d'água de latência inferior precisa ser um valor numérico."
+
+#: usr/local/www/system_gateways_edit.php:193
+#: usr/local/www/system_gateways_edit.php:201
+msgid "The high latency watermark needs to be a numeric value."
+msgstr "A marca d'água de latência superior precisa ser um valor numérico."
+
+#: usr/local/www/system_gateways_edit.php:198
+#: usr/local/www/system_gateways_edit.php:206
+msgid "The low loss watermark needs to be a numeric value."
+msgstr "A marca d'água de perda inferior precisa ser um valor numérico."
+
+#: usr/local/www/system_gateways_edit.php:203
+#: usr/local/www/system_gateways_edit.php:211
+msgid "The high loss watermark needs to be a numeric value."
+msgstr "A marca d'água de perda superior precisa ser um valor numérico."
+
+#: usr/local/www/system_gateways_edit.php:209
+#: usr/local/www/system_gateways_edit.php:217
+msgid "The High latency watermark needs to be higher then the low latency watermark"
+msgstr "A marca d'água superior de latência precisa ser mais acima que a marca d'água inferior"
+
+#: usr/local/www/system_gateways_edit.php:215
+#: usr/local/www/system_gateways_edit.php:223
+msgid "The High packet loss watermark needs to be higher then the low packet loss watermark"
+msgstr "A marca d'água superior de perda de pacote precisa ser mais acima que a marca d'água inferior"
+
+#: usr/local/www/system_gateways_edit.php:363
+#: usr/local/www/system_gateways_edit.php:369
+#: usr/local/www/system_gateways_edit.php:475
+#: usr/local/www/system_gateways_edit.php:474
+#: usr/local/www/system_gateways_edit.php:476
+#: usr/local/www/system_gateways_edit.php:506
+msgid "Use BGPD"
+msgstr "Use BGPD"
+
+#: usr/local/www/system_gateways_edit.php:367
+#: usr/local/www/system_gateways_edit.php:373
+#: usr/local/www/system_gateways_edit.php:479
+#: usr/local/www/system_gateways_edit.php:478
+#: usr/local/www/system_gateways_edit.php:480
+#: usr/local/www/system_gateways_edit.php:510
+msgid "Choose which interface this gateway applies to."
+msgstr "Escolha em qual interface esse gateway se aplica."
+
+#: usr/local/www/system_gateways_edit.php:373
+#: usr/local/www/system_gateways_edit.php:394
+#: usr/local/www/system_gateways_edit.php:500
+#: usr/local/www/system_gateways_edit.php:502
+#: usr/local/www/system_gateways_edit.php:504
+#: usr/local/www/system_gateways_edit.php:534
+msgid "Gateway name"
+msgstr "Nome do Gateway"
+
+#: usr/local/www/system_gateways_edit.php:379
+#: usr/local/www/system_gateways_edit.php:400
+#: usr/local/www/system_gateways_edit.php:506
+#: usr/local/www/system_gateways_edit.php:509
+#: usr/local/www/system_gateways_edit.php:511
+#: usr/local/www/system_gateways_edit.php:541
+msgid "Gateway IP address"
+msgstr "Endereço IP do Gateway"
+
+#: usr/local/www/system_gateways_edit.php:382
+#: usr/local/www/system_gateways_edit.php:385
+#: usr/local/www/system_gateways_edit.php:403
+#: usr/local/www/system_gateways_edit.php:406
+#: usr/local/www/system_gateways_edit.php:509
+#: usr/local/www/system_gateways_edit.php:512
+#: usr/local/www/system_gateways_edit.php:513
+#: usr/local/www/system_gateways_edit.php:516
+#: usr/local/www/system_gateways_edit.php:515
+#: usr/local/www/system_gateways_edit.php:518
+#: usr/local/www/system_gateways_edit.php:545
+#: usr/local/www/system_gateways_edit.php:548
+msgid "Default Gateway"
+msgstr "Gateway Padrão"
+
+#: usr/local/www/system_gateways_edit.php:386
+#: usr/local/www/system_gateways_edit.php:407
+#: usr/local/www/system_gateways_edit.php:513
+#: usr/local/www/system_gateways_edit.php:517
+#: usr/local/www/system_gateways_edit.php:519
+#: usr/local/www/system_gateways_edit.php:549
+msgid "This will select the above gateway as the default gateway"
+msgstr "Isso irá selecionar o gateway acima como o gateway padrão"
+
+#: usr/local/www/system_gateways_edit.php:390
+#: usr/local/www/system_gateways_edit.php:393
+#: usr/local/www/system_gateways_edit.php:411
+#: usr/local/www/system_gateways_edit.php:414
+#: usr/local/www/system_gateways_edit.php:517
+#: usr/local/www/system_gateways_edit.php:520
+#: usr/local/www/system_gateways_edit.php:521
+#: usr/local/www/system_gateways_edit.php:524
+#: usr/local/www/system_gateways_edit.php:523
+#: usr/local/www/system_gateways_edit.php:526
+#: usr/local/www/system_gateways_edit.php:553
+#: usr/local/www/system_gateways_edit.php:556
+msgid "Disable Gateway Monitoring"
+msgstr "Desativar Monitoramento do Gateway"
+
+#: usr/local/www/system_gateways_edit.php:394
+#: usr/local/www/system_gateways_edit.php:415
+#: usr/local/www/system_gateways_edit.php:521
+#: usr/local/www/system_gateways_edit.php:525
+#: usr/local/www/system_gateways_edit.php:527
+#: usr/local/www/system_gateways_edit.php:557
+msgid "This will consider this gateway as always being up"
+msgstr "Isto irá considerar este gateway como sendo sempre up"
+
+#: usr/local/www/system_gateways_edit.php:407
+#: usr/local/www/system_gateways_edit.php:428
+#: usr/local/www/system_gateways_edit.php:534
+#: usr/local/www/system_gateways_edit.php:538
+#: usr/local/www/system_gateways_edit.php:540
+#: usr/local/www/system_gateways_edit.php:570
+msgid "Alternative monitor IP"
+msgstr "IP monitor alternativo"
+
+#: usr/local/www/system_gateways_edit.php:408
+#: usr/local/www/system_gateways_edit.php:429
+#: usr/local/www/system_gateways_edit.php:535
+#: usr/local/www/system_gateways_edit.php:539
+#: usr/local/www/system_gateways_edit.php:541
+#: usr/local/www/system_gateways_edit.php:571
+msgid "Enter an alternative address here to be used to monitor the link. This is used for the quality RRD graphs as well as the load balancer entries. Use this if the gateway does not respond to ICMP echo requests (pings)"
+msgstr "Informe um endereço alternativo aqui para ser usado para monitorar o link. Esse é usado para os gráficos RRD de qualidade assim como as entradas do balanceador de carga. Use isso se o gateway não responder à requisições echo ICMP (pings)"
+
+#: usr/local/www/system_gateways_edit.php:436
+#: usr/local/www/system_gateways_edit.php:457
+#: usr/local/www/system_gateways_edit.php:563
+#: usr/local/www/system_gateways_edit.php:567
+#: usr/local/www/system_gateways_edit.php:569
+#: usr/local/www/system_gateways_edit.php:599
+msgid "Weight for this gateway when used in a Gateway Group."
+msgstr "Peso para esse gateway quando usado em um Grupo de Gateway."
+
+#: usr/local/www/system_gateways_edit.php:440
+#: usr/local/www/system_gateways_edit.php:461
+#: usr/local/www/system_gateways_edit.php:567
+#: usr/local/www/system_gateways_edit.php:571
+#: usr/local/www/system_gateways_edit.php:573
+#: usr/local/www/system_gateways_edit.php:603
+msgid "Latency thresholds"
+msgstr "Thresholds de latência"
+
+#: usr/local/www/system_gateways_edit.php:448
+#: usr/local/www/system_gateways_edit.php:469
+msgid "These define the low and high water marks for latency in milliseconds. Default is 100/200."
+msgstr "Definem os limites inferiores e superiores para a latência em milisegundos. O padrão é 100/200."
+
+#: usr/local/www/system_gateways_edit.php:452
+#: usr/local/www/system_gateways_edit.php:473
+#: usr/local/www/system_gateways_edit.php:579
+#: usr/local/www/system_gateways_edit.php:583
+#: usr/local/www/system_gateways_edit.php:585
+#: usr/local/www/system_gateways_edit.php:615
+msgid "Packet Loss thresholds"
+msgstr "Thresholds de perda de pacote"
+
+#: usr/local/www/system_gateways_edit.php:460
+#: usr/local/www/system_gateways_edit.php:481
+msgid "These define the low and high water marks for packet loss in %. Default is 10/20."
+msgstr "Definem os limites inferiores e superiores para a perda de pacote em %. Padrão é 10/20."
+
+#: usr/local/www/system_gateways_edit.php:464
+#: usr/local/www/system_gateways_edit.php:496
+#: usr/local/www/system_gateways_edit.php:602
+#: usr/local/www/system_gateways_edit.php:606
+#: usr/local/www/system_gateways_edit.php:608
+#: usr/local/www/system_gateways_edit.php:638
+msgid "Down"
+msgstr "Contagem regressiva"
+
+#: usr/local/www/system_gateways_edit.php:468
+msgid "This defines the down time for the alarm to fire in seconds. Default is 10."
+msgstr "Isto define o tempo da contagem regressiva para o alarme disparar, em segundos. Padrão é 10."
+
+#: usr/local/www/system_gateways_edit.php:472
+#: usr/local/www/system_gateways_edit.php:485
+#: usr/local/www/system_gateways_edit.php:591
+#: usr/local/www/system_gateways_edit.php:595
+#: usr/local/www/system_gateways_edit.php:597
+#: usr/local/www/system_gateways_edit.php:627
+msgid "Frequency Probe"
+msgstr "Frequência da sonda"
+
+#: usr/local/www/system_gateways_edit.php:476
+msgid "This defines the frequency that an icmp probe will be sent in seconds. Default is 1."
+msgstr "Isto define a freqüência com que uma sonda de icmp serão enviadas em segundos. Padrão é 1."
+
+#: usr/local/www/system_groupmanager.php:49
+#: usr/local/www/system_groupmanager_addprivs.php:56
+msgid "Group manager"
+msgstr "Gerenciador de grupo"
+
+#: usr/local/www/system_groupmanager.php:72
+#: usr/local/www/system_groupmanager.php:96
+#: usr/local/www/system_usermanager.php:90
+#: usr/local/www/system_usermanager.php:105
+msgid "successfully deleted"
+msgstr "apagado com sucesso"
+
+#: usr/local/www/system_groupmanager.php:95
+#: usr/local/www/system_usermanager.php:104
+msgid "Privilege"
+msgstr "Privilégio"
+
+#: usr/local/www/system_groupmanager.php:122
+msgid "The group name contains invalid characters."
+msgstr "O nome do grupo contém caracteres inválidos."
+
+#: usr/local/www/system_groupmanager.php:128
+#: usr/local/www/system_groupmanager.php:131
+msgid "Another entry with the same group name already exists."
+msgstr "Outra entrada com o mesmo nome de grupo já existe."
+
+#: usr/local/www/system_groupmanager.php:262
+#: usr/local/www/system_usermanager.php:462
+#: usr/local/www/system_usermanager.php:460
+#: usr/local/www/system_groupmanager.php:265
+msgid "Defined by"
+msgstr "Definido por"
+
+#: usr/local/www/system_groupmanager.php:269
+#: usr/local/www/system_groupmanager.php:404
+#: usr/local/www/system_groupmanager.php:405
+#: usr/local/www/system_groupmanager.php:272
+#: usr/local/www/system_groupmanager.php:408
+msgid "Group name"
+msgstr "Nome do grupo"
+
+#: usr/local/www/system_groupmanager.php:279
+#: usr/local/www/system_groupmanager.php:282
+msgid "Group description, for your own information only"
+msgstr "Descrição do Grupo, para sua própria referência somente"
+
+#: usr/local/www/system_groupmanager.php:286
+#: usr/local/www/system_usermanager.php:511
+#: usr/local/www/system_usermanager.php:509
+#: usr/local/www/system_groupmanager.php:289
+msgid "Group Memberships"
+msgstr "Adesões de Grupos"
+
+#: usr/local/www/system_groupmanager.php:291
+#: usr/local/www/system_groupmanager.php:294
+msgid "Not Members"
+msgstr "Não membros"
+
+#: usr/local/www/system_groupmanager.php:309
+#: usr/local/www/system_groupmanager.php:312
+msgid "Add Members"
+msgstr "Adicionar Membros"
+
+#: usr/local/www/system_groupmanager.php:313
+#: usr/local/www/system_groupmanager.php:316
+msgid "Remove Members"
+msgstr "Remover membros"
+
+#: usr/local/www/system_groupmanager.php:334
+#: usr/local/www/system_groupmanager_addprivs.php:196
+#: usr/local/www/system_usermanager.php:565
+#: usr/local/www/system_usermanager_addprivs.php:193
+#: usr/local/www/system_usermanager.php:563
+#: usr/local/www/system_groupmanager_addprivs.php:194
+#: usr/local/www/system_groupmanager.php:337
+msgid "Hold down CTRL (pc)/COMMAND (mac) key to select multiple items"
+msgstr "Segure a tecla CTRL (pc)/ COMMAND (mac) para selecionar múltiplos items"
+
+#: usr/local/www/system_groupmanager.php:342
+#: usr/local/www/system_groupmanager.php:345
+msgid "Assigned Privileges"
+msgstr "Privilégios atribuídos"
+
+#: usr/local/www/system_groupmanager.php:363
+#: usr/local/www/system_usermanager.php:601
+#: usr/local/www/system_usermanager.php:599
+#: usr/local/www/system_groupmanager.php:366
+msgid "Do you really want to delete this privilege?"
+msgstr "Você realmente deseja apagar esse privilégio?"
+
+#: usr/local/www/system_groupmanager.php:406
+#: usr/local/www/system_groupmanager.php:407
+#: usr/local/www/system_groupmanager.php:410
+msgid "Member Count"
+msgstr "Contagem de membros"
+
+#: usr/local/www/system_groupmanager.php:447
+#: usr/local/www/system_groupmanager.php:450
+#: usr/local/www/system_groupmanager.php:468
+#: usr/local/www/system_groupmanager.php:471
+msgid "Do you really want to delete this group?"
+msgstr "Você realmente deseja apagar esse grupo?"
+
+#: usr/local/www/system_groupmanager.php:448
+#: usr/local/www/system_groupmanager.php:451
+#: usr/local/www/system_groupmanager.php:469
+#: usr/local/www/system_groupmanager.php:472
+msgid "delete group"
+msgstr "remover grupo"
+
+#: usr/local/www/system_groupmanager.php:460
+#: usr/local/www/system_groupmanager.php:465
+#: usr/local/www/system_groupmanager.php:415
+#: usr/local/www/system_groupmanager.php:418
+msgid "add group"
+msgstr "adicionar grupo"
+
+#: usr/local/www/system_groupmanager.php:467
+msgid ""
+"Additional webConfigurator groups can be added here. \n"
+"\t\t\t\t\t\t\t\tGroup permissions can be assigned which are inherited by users who are members of the group.\n"
+"\t\t\t\t\t\t\t\tAn icon that appears grey indicates that it is a system defined object.\n"
+"\t\t\t\t\t\t\t\tSome system object properties can be modified but they cannot be deleted."
+msgstr ""
+"Grupos webConfigurator adicionais podem ser adicionados aqui. \n"
+"\t\t\t\t\t\t\t\tPermissões de grupo podem ser designadas, as quais são herdadas de usuários que são membros do grupo.\n"
+"\t\t\t\t\t\t\t\tUm ícone que aparece cinza indica que é um objetos definido pelo sistema.\n"
+"\t\t\t\t\t\t\t\tAlgumas propriedades de objetos de sistema podem ser modificadas, mas não podem ser apagadas."
+
+#: usr/local/www/system_groupmanager_addprivs.php:56
+msgid "Add privileges"
+msgstr "Adicionar privilégios"
+
+#: usr/local/www/system_groupmanager_addprivs.php:79
+#: usr/local/www/system_usermanager_addprivs.php:84
+msgid "Selected priveleges"
+msgstr "Privilégios selecionados"
+
+#: usr/local/www/system_groupmanager_addprivs.php:182
+#: usr/local/www/system_usermanager_addprivs.php:181
+#: usr/local/www/system_groupmanager_addprivs.php:180
+msgid "System Privileges"
+msgstr "Privilégios de Sistema"
+
+#: usr/local/www/system_groupmanager_addprivs.php:218
+#: usr/local/www/system_usermanager_addprivs.php:199
+#: usr/local/www/system_groupmanager_addprivs.php:216
+msgid "Select a privilege from the list above for a description"
+msgstr "Selecione um privilégio da lista acima para uma descrição"
+
+#: usr/local/www/system_usermanager.php:157
+#: usr/local/www/system_usermanager.php:692
+#: usr/local/www/system_usermanager.php:701
+#: usr/local/www/vpn_ipsec_phase1.php:166
+#: usr/local/www/vpn_openvpn_client.php:210
+#: usr/local/www/vpn_openvpn_server.php:282
+#: usr/local/www/system_usermanager.php:690
+#: usr/local/www/system_usermanager.php:699
+#: usr/local/www/vpn_openvpn_server.php:287
+#: usr/local/www/vpn_openvpn_client.php:214
+#: usr/local/www/vpn_openvpn_server.php:288
+#: usr/local/www/vpn_openvpn_client.php:220
+#: usr/local/www/vpn_openvpn_client.php:238
+#: usr/local/www/vpn_openvpn_server.php:309
+msgid "Certificate"
+msgstr "Certificado"
+
+#: usr/local/www/system_usermanager.php:158
+msgid "association removed."
+msgstr "associação removida."
+
+#: usr/local/www/system_usermanager.php:202
+msgid "The username is longer than 16 characters."
+msgstr "O nome de usuário contém mais de 16 caractéres."
+
+#: usr/local/www/system_usermanager.php:226
+msgid "That username is reserved by the system."
+msgstr "Esse nome de usuário está reservado pelo sistema."
+
+#: usr/local/www/system_usermanager.php:250
+#: usr/local/www/system_usermanager.php:246
+msgid "Invalid expiration date format; use MM/DD/YYYY instead."
+msgstr "Formato de data de expiração inválido; use MM/DD/AAAA."
+
+#: usr/local/www/system_usermanager.php:257
+#: usr/local/www/system_usermanager.php:253
+msgid "Invalid internal Certificate Authority"
+msgstr "Fonte Certificadora interna inválida"
+
+#: usr/local/www/system_usermanager.php:489
+#: usr/local/www/system_usermanager_passwordmg.php:109
+#: usr/local/www/system_usermanager.php:487
+#: usr/local/www/system_usermanager_passwordmg.php:110
+#: usr/local/www/system_usermanager_passwordmg.php:115
+msgid "(confirmation)"
+msgstr "(confirmação)"
+
+#: usr/local/www/system_usermanager.php:493
+#: usr/local/www/system_usermanager.php:788
+#: usr/local/www/system_usermanager.php:491
+#: usr/local/www/system_usermanager.php:786
+#: usr/local/www/system_usermanager.php:787
+msgid "Full name"
+msgstr "Nome completo"
+
+#: usr/local/www/system_usermanager.php:497
+#: usr/local/www/system_usermanager.php:495
+msgid "User's full name, for your own information only"
+msgstr "Nome completo do usuário, para sua própria referência somente"
+
+#: usr/local/www/system_usermanager.php:501
+#: usr/local/www/system_usermanager.php:499
+msgid "Expiration date"
+msgstr "Data de expiração"
+
+#: usr/local/www/system_usermanager.php:505
+#: usr/local/www/system_usermanager.php:503
+msgid "Pick a date"
+msgstr "Selecione uma data"
+
+#: usr/local/www/system_usermanager.php:508
+#: usr/local/www/system_usermanager.php:506
+msgid "Leave blank if the account shouldn't expire, otherwise enter the expiration date in the following format: mm/dd/yyyy"
+msgstr "Deixe em branco se a conta não deve expirar, do contrário, informe a data de expiração no seguinte formato: mm/dd/aaaa"
+
+#: usr/local/www/system_usermanager.php:516
+#: usr/local/www/system_usermanager.php:514
+msgid "Not Member Of"
+msgstr "Não é Membro De"
+
+#: usr/local/www/system_usermanager.php:536
+#: usr/local/www/system_usermanager.php:534
+msgid "Add Groups"
+msgstr "Adicionar Grupos"
+
+#: usr/local/www/system_usermanager.php:540
+#: usr/local/www/system_usermanager.php:538
+msgid "Remove Groups"
+msgstr "Remover Grupos"
+
+#: usr/local/www/system_usermanager.php:544
+#: usr/local/www/system_usermanager.php:542
+msgid "Member Of"
+msgstr "Membro De"
+
+#: usr/local/www/system_usermanager.php:572
+#: usr/local/www/system_usermanager.php:570
+msgid "Effective Privileges"
+msgstr "Privilégios efetivos"
+
+#: usr/local/www/system_usermanager.php:576
+#: usr/local/www/system_usermanager.php:574
+msgid "Inherited From"
+msgstr "Herdado de"
+
+#: usr/local/www/system_usermanager.php:626
+#: usr/local/www/system_usermanager.php:624
+msgid "User Certificates"
+msgstr "Certificados de usuário"
+
+#: usr/local/www/system_usermanager.php:631
+#: usr/local/www/system_usermanager.php:629
+msgid "CA"
+msgstr "CA"
+
+#: usr/local/www/system_usermanager.php:655
+#: usr/local/www/system_usermanager.php:653
+msgid "export private key"
+msgstr "exportar chave privada"
+
+#: usr/local/www/system_usermanager.php:660
+#: usr/local/www/system_usermanager.php:658
+msgid "Do you really want to remove this certificate association?"
+msgstr "Você realmente deseja apagar esta associação de certificado?"
+
+#: usr/local/www/system_usermanager.php:660
+#: usr/local/www/system_usermanager.php:658
+msgid "(Certificate will not be deleted)"
+msgstr "(Certificado não será apagado)"
+
+#: usr/local/www/system_usermanager.php:694
+#: usr/local/www/system_usermanager.php:692
+msgid "Click to create a user certificate."
+msgstr "Clique para criar um certificado de usuário."
+
+#: usr/local/www/system_usermanager.php:752
+#: usr/local/www/system_usermanager.php:758
+#: usr/local/www/system_usermanager.php:750
+#: usr/local/www/system_usermanager.php:756
+msgid "Authorized keys"
+msgstr "Chaves autorizadas"
+
+#: usr/local/www/system_usermanager.php:754
+#: usr/local/www/system_usermanager.php:752
+msgid "Click to paste an authorized key."
+msgstr "Clique para colar uma chave autorizada."
+
+#: usr/local/www/system_usermanager.php:762
+#: usr/local/www/system_usermanager.php:760
+msgid "Paste an authorized keys file here."
+msgstr "Cole um arquivo de chaves autorizadas aqui."
+
+#: usr/local/www/system_usermanager.php:766
+#: usr/local/www/system_usermanager.php:764
+msgid "IPsec Pre-Shared Key"
+msgstr "Chave Pre-Compartilhada IPsec"
+
+#: usr/local/www/system_usermanager.php:828
+#: usr/local/www/system_usermanager.php:826
+#: usr/local/www/system_usermanager.php:829
+#: usr/local/www/system_usermanager.php:852
+msgid "Do you really want to delete this User?"
+msgstr "Você realmente deseja apagar esse Usuário?"
+
+#: usr/local/www/system_usermanager.php:849
+#: usr/local/www/system_usermanager.php:847
+#: usr/local/www/system_usermanager.php:852
+#: usr/local/www/system_usermanager.php:805
+msgid "Additional users can be added here. User permissions for accessing the webConfigurator can be assigned directly or inherited from group memberships. An icon that appears grey indicates that it is a system defined object. Some system object properties can be modified but they cannot be deleted."
+msgstr "Usuários adicionais podem ser adicionados aqui. Permissões de usuário para acessar o webConfigurator podem ser atribuídos diretamente ou herdados de membros do grupo. Um ícone que aparece cinza indica que é um sistema de objeto definido. Algumas propriedades objeto do sistema pode ser modificado, mas eles não podem ser excluídas."
+
+#: usr/local/www/system_usermanager.php:854
+#: usr/local/www/system_usermanager.php:852
+#: usr/local/www/system_usermanager.php:857
+#: usr/local/www/system_usermanager.php:810
+msgid "Accounts created here are also used for other parts of the system such as OpenVPN, IPsec, and Captive Portal."
+msgstr "Contas criadas aqui são usadas também para outras partes do sistema, tais como OpenVPN, IPsec e Captive Portal."
+
+#: usr/local/www/system_usermanager_passwordmg.php:43
+msgid "User Password"
+msgstr "Senha de Usuário"
+
+#: usr/local/www/system_usermanager_passwordmg.php:63
+msgid "Password successfully changed"
+msgstr "Senha modificada com sucesso"
+
+#: usr/local/www/system_usermanager_passwordmg.php:86
+#: usr/local/www/system_usermanager_passwordmg.php:87
+#: usr/local/www/system_usermanager_passwordmg.php:92
+msgid "Sorry, you cannot change the password for a non-local user."
+msgstr "Lamento, você não pode mudar a senha para um usuário que não seja local."
+
+#: usr/local/www/system_usermanager_passwordmg.php:112
+#: usr/local/www/system_usermanager_passwordmg.php:113
+#: usr/local/www/system_usermanager_passwordmg.php:118
+msgid "Select a new password"
+msgstr "Selecione uma nova senha"
+
+#: usr/local/www/system_usermanager_settings.php:51
+msgid "User manager settings"
+msgstr "Configurações de gerenciamento de usuário"
+
+#: usr/local/www/system_usermanager_settings.php:61
+msgid "Session timeout must be an integer value."
+msgstr "Expiração de Sessão deve ser um valor inteiro."
+
+#: usr/local/www/system_usermanager_settings.php:71
+msgid "The test was not performed because it is supported only for ldap based backends."
+msgstr "O teste não foi realizado porque ele somente é suportado por backends baseados em ldap."
+
+#: usr/local/www/system_usermanager_settings.php:131
+#: usr/local/www/system_usermanager_settings.php:134
+msgid "Session Timeout"
+msgstr "Expiração de Sessão"
+
+#: usr/local/www/system_usermanager_settings.php:135
+#: usr/local/www/system_usermanager_settings.php:138
+msgid "Time in minutes to expire idle management sessions. The default is 4 hours (240 minutes)."
+msgstr "Tempo em minutos para expirar sessões de gerenciamento ociosas. O padrão é 4 horas (240 minutos)."
+
+#: usr/local/www/system_usermanager_settings.php:136
+#: usr/local/www/system_usermanager_settings.php:139
+msgid "Enter 0 to never expire sessions. NOTE: This is a security risk!"
+msgstr "Informe 0 para nunca expirar sessões. NOTA: Isso é um risco de segurança!"
+
+#: usr/local/www/system_usermanager_settings.php:162
+#: usr/local/www/system_usermanager_settings.php:165
+msgid "Save and Test"
+msgstr "Salvar e Testar"
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:97
+msgid "Could not connect to the LDAP server. Please check your LDAP configuration."
+msgstr "Não pôde conectar ao servidor LDAP. Por favor, verifique sua configuração do LDAP."
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:98
+#: usr/local/www/system_usermanager_settings_test.php:119
+msgid "Close"
+msgstr "Fechar"
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:100
+msgid "Please select which containers to Authenticate against:"
+msgstr "Por favor selecione quais contêiners pelos quais Autenticar:"
+
+#: usr/local/www/system_usermanager_settings_test.php:76
+#, php-format
+msgid "Could not find settings for %s%s"
+msgstr "Não pôde encontrar configurações para %s%s"
+
+#: usr/local/www/system_usermanager_settings_test.php:78
+msgid "Testing pfSense LDAP settings... One moment please..."
+msgstr "Testanto configurações LDAP do pfSense... Um momento por favor..."
+
+#: usr/local/www/system_usermanager_settings_test.php:82
+msgid "Attempting connection to"
+msgstr "Tentando conectar em"
+
+#: usr/local/www/system_usermanager_settings_test.php:86
+msgid "Attempting bind to"
+msgstr "Tentando vincular a"
+
+#: usr/local/www/system_usermanager_settings_test.php:90
+msgid "Attempting to fetch Organizational Units from"
+msgstr "Tentando obter Unidades Organizacionais de"
+
+#: usr/local/www/system_usermanager_settings_test.php:96
+msgid "Organization units found"
+msgstr "Encontradas unidades organizacionais"
+
+#: usr/local/www/system_usermanager_settings_test.php:103
+#: usr/local/www/system_usermanager_settings_test.php:108
+#: usr/local/www/system_usermanager_settings_test.php:112
+msgid "failed"
+msgstr "falhou"
+
+#: usr/local/www/upload_progress.php:44
+msgid "Sorry, we could not find an uploadid code."
+msgstr "Lamento, não pudemos encontrar um código de carregamento."
+
+#: usr/local/www/upload_progress.php:86
+msgid "Uploading Files"
+msgstr "Carregando Arquivos"
+
+#: usr/local/www/upload_progress.php:86
+msgid "Please wait"
+msgstr "Por favor, aguarde"
+
+#: usr/local/www/upload_progress.php:95
+msgid "Uploading file"
+msgstr "Carregando arquivo"
+
+#: usr/local/www/upload_progress.php:123
+msgid "Uploaded"
+msgstr "Carregado"
+
+#: usr/local/www/upload_progress.php:133
+msgid "File Size"
+msgstr "Tamanho do Arquivo"
+
+#: usr/local/www/upload_progress.php:145
+msgid "Completed"
+msgstr "Completo"
+
+#: usr/local/www/upload_progress.php:155
+msgid "Estimated"
+msgstr "Estimado"
+
+#: usr/local/www/vpn_ipsec_phase1.php:160
+#: usr/local/www/vpn_ipsec_phase1.php:662
+#: usr/local/www/vpn_ipsec_phase1.php:675
+#: usr/local/www/vpn_ipsec_mobile.php:347 usr/local/www/vpn_ipsec_keys.php:104
+#: usr/local/www/vpn_ipsec_keys_edit.php:69
+#: usr/local/www/vpn_ipsec_keys_edit.php:135 usr/local/www/interfaces.php:2486
+#: usr/local/www/vpn_ipsec_phase1.php:674
+#: usr/local/www/vpn_ipsec_phase1.php:695 usr/local/www/interfaces.php:2516
+#: usr/local/www/interfaces.php:2562 usr/local/www/interfaces.php:2551
+#: usr/local/www/interfaces.php:2587
+msgid "Pre-Shared Key"
+msgstr "Chave Pré-Compartilhada"
+
+#: usr/local/www/vpn_ipsec_phase1.php:171
+#: usr/local/www/vpn_ipsec_phase1.php:564
+#: usr/local/www/vpn_ipsec_phase1.php:577
+#: usr/local/www/vpn_ipsec_phase1.php:576
+#: usr/local/www/vpn_ipsec_phase1.php:597
+msgid "Remote gateway"
+msgstr "Gateway remota"
+
+#: usr/local/www/vpn_ipsec_phase1.php:177
+msgid "The P1 lifetime must be an integer."
+msgstr "O tempo de vida da F1 deve ser um inteiro."
+
+#: usr/local/www/vpn_ipsec_phase1.php:180
+#: usr/local/www/vpn_ipsec_phase1.php:181
+msgid "A valid remote gateway address or host name must be specified."
+msgstr "Um endereço de gateway remoto válido ou nome de host deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:188
+#: usr/local/www/vpn_ipsec_phase1.php:194
+#, php-format
+msgid "The remote gateway \"%1$s\" is already used by phase1 \"%2$s\"."
+msgstr "O gateway remoto \"%1$s\" já está sendo usado pela fase 1 \"%2$s\"."
+
+#: usr/local/www/vpn_ipsec_phase1.php:201
+#: usr/local/www/vpn_ipsec_phase1.php:222
+msgid "Please enter an address for 'My Identifier'"
+msgstr "Por favor informe um endereço para 'Meu identificador'"
+
+#: usr/local/www/vpn_ipsec_phase1.php:204
+#: usr/local/www/vpn_ipsec_phase1.php:225
+msgid "Please enter a keyid tag for 'My Identifier'"
+msgstr "Por favor, informe uma tag keyid para 'Meu Identificador'"
+
+#: usr/local/www/vpn_ipsec_phase1.php:207
+#: usr/local/www/vpn_ipsec_phase1.php:228
+msgid "Please enter a fully qualified domain name for 'My Identifier'"
+msgstr "Por favor, informe um nome de domínio completamente qualificado para 'Meu Identificador'"
+
+#: usr/local/www/vpn_ipsec_phase1.php:210
+#: usr/local/www/vpn_ipsec_phase1.php:231
+msgid "Please enter a user and fully qualified domain name for 'My Identifier'"
+msgstr "Por favor, informe um usuário e um nome de domínio completamente qualificado para 'Meu Identificador'"
+
+#: usr/local/www/vpn_ipsec_phase1.php:213
+#: usr/local/www/vpn_ipsec_phase1.php:234
+msgid "Please enter a dynamic domain name for 'My Identifier'"
+msgstr "Por favor, informe um nome de domínio dinâmico para 'Meu Identificado'"
+
+#: usr/local/www/vpn_ipsec_phase1.php:216
+#: usr/local/www/vpn_ipsec_phase1.php:237
+msgid "A valid IP address for 'My identifier' must be specified."
+msgstr "Um endereço IP válido para 'Meu Identificador' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:219
+#: usr/local/www/vpn_ipsec_phase1.php:240
+msgid "A valid domain name for 'My identifier' must be specified."
+msgstr "Um nome de domínio válidos para 'Meu Identificador' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:223
+#: usr/local/www/vpn_ipsec_phase1.php:244
+msgid "A valid FQDN for 'My identifier' must be specified."
+msgstr "Um FQDN válido para 'Meu identificador' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:228
+#: usr/local/www/vpn_ipsec_phase1.php:249
+msgid "A valid User FQDN in the form of user@my.domain.com for 'My identifier' must be specified."
+msgstr "Um usuário FQDN válido na forma usuario@meu.dominio.com para 'Meu Identificador' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:233
+#: usr/local/www/vpn_ipsec_phase1.php:254
+msgid "A valid Dynamic DNS address for 'My identifier' must be specified."
+msgstr "Um endereço de DNS Dinâmico válido para 'Meu Identificador' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:243
+#: usr/local/www/vpn_ipsec_phase1.php:264
+msgid "Please enter an address for 'Peer Identifier'"
+msgstr "Por favor, informe um endereço para 'Identificador do Peer'"
+
+#: usr/local/www/vpn_ipsec_phase1.php:246
+#: usr/local/www/vpn_ipsec_phase1.php:267
+msgid "Please enter a keyid tag for 'Peer Identifier'"
+msgstr "Por favor, informe uma tag keyid para 'Identificador do Peer'"
+
+#: usr/local/www/vpn_ipsec_phase1.php:249
+#: usr/local/www/vpn_ipsec_phase1.php:270
+msgid "Please enter a fully qualified domain name for 'Peer Identifier'"
+msgstr "Por favor, informe um nome de domínio completamente qualificado para 'Identificador do Peer'"
+
+#: usr/local/www/vpn_ipsec_phase1.php:252
+#: usr/local/www/vpn_ipsec_phase1.php:273
+msgid "Please enter a user and fully qualified domain name for 'Peer Identifier'"
+msgstr "Por favor, informe um usuário e um nome de domínio completamente qualificado para 'Identificador do Peer'"
+
+#: usr/local/www/vpn_ipsec_phase1.php:255
+#: usr/local/www/vpn_ipsec_phase1.php:276
+msgid "A valid IP address for 'Peer identifier' must be specified."
+msgstr "Um endereço de IP válido para 'Identificador do Peer' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:258
+#: usr/local/www/vpn_ipsec_phase1.php:279
+msgid "A valid domain name for 'Peer identifier' must be specified."
+msgstr "Um nomde de domínio válido para 'Identificador do Peer' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:262
+#: usr/local/www/vpn_ipsec_phase1.php:283
+msgid "A valid FQDN for 'Peer identifier' must be specified."
+msgstr "Um FQDN válido para 'Identificador de peer' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:267
+#: usr/local/www/vpn_ipsec_phase1.php:288
+msgid "A valid User FQDN in the form of user@my.domain.com for 'Peer identifier' must be specified."
+msgstr "Um usuário FQDN válido na forma de usuario@meu.dominio.com para 'Identificador de peer' deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase1.php:273
+#: usr/local/www/vpn_ipsec_phase1.php:294
+msgid "A numeric value must be specified for DPD delay."
+msgstr "Um valor numérico deve ser especificado para atraso de DPD."
+
+#: usr/local/www/vpn_ipsec_phase1.php:276
+#: usr/local/www/vpn_ipsec_phase1.php:297
+msgid "A numeric value must be specified for DPD retries."
+msgstr "Um valor numérico deve ser especificado para tentativas de DPD."
+
+#: usr/local/www/vpn_ipsec_phase1.php:358
+#: usr/local/www/vpn_ipsec_phase1.php:360
+#: usr/local/www/vpn_ipsec_phase1.php:379
+#: usr/local/www/vpn_ipsec_phase1.php:381
+msgid "Edit Phase 1"
+msgstr "Editar Fase 1"
+
+#: usr/local/www/vpn_ipsec_phase1.php:509
+#: usr/local/www/vpn_openvpn_client.php:383
+#: usr/local/www/vpn_openvpn_csc.php:311
+#: usr/local/www/vpn_openvpn_server.php:601
+#: usr/local/www/vpn_openvpn_server.php:674
+#: usr/local/www/vpn_openvpn_client.php:388
+#: usr/local/www/vpn_openvpn_csc.php:310
+#: usr/local/www/vpn_openvpn_server.php:692
+#: usr/local/www/vpn_openvpn_client.php:396
+#: usr/local/www/vpn_ipsec_phase1.php:508
+#: usr/local/www/vpn_openvpn_client.php:414
+#: usr/local/www/vpn_ipsec_phase1.php:529
+#: usr/local/www/vpn_openvpn_server.php:718
+msgid "General information"
+msgstr "Informação geral"
+
+#: usr/local/www/vpn_ipsec_phase1.php:515
+#: usr/local/www/vpn_ipsec_phase1.php:514
+#: usr/local/www/vpn_ipsec_phase1.php:535
+msgid "Disable this phase1 entry"
+msgstr "Desabilitar essa entrada de fase 1"
+
+#: usr/local/www/vpn_ipsec_phase1.php:517
+#: usr/local/www/vpn_ipsec_phase1.php:516
+#: usr/local/www/vpn_ipsec_phase1.php:537
+msgid "Set this option to disable this phase1 without removing it from the list"
+msgstr "Configure essa opção para desabilitar essa fase1 sem removê-la da lista"
+
+#: usr/local/www/vpn_ipsec_phase1.php:523
+#: usr/local/www/vpn_ipsec_phase1.php:522
+#: usr/local/www/vpn_ipsec_phase1.php:543
+msgid "Internet Protocol"
+msgstr "Protocolo de internet"
+
+#: usr/local/www/vpn_ipsec_phase1.php:534
+#: usr/local/www/vpn_ipsec_phase1.php:533
+#: usr/local/www/vpn_ipsec_phase1.php:554
+msgid "Select the Internet Protocol family from this dropdown"
+msgstr "Selecione a família Protocolo de Internet a partir desta lista"
+
+#: usr/local/www/vpn_ipsec_phase1.php:557
+#: usr/local/www/vpn_ipsec_phase1.php:570
+#: usr/local/www/vpn_ipsec_phase1.php:569
+#: usr/local/www/vpn_ipsec_phase1.php:590
+msgid "Select the interface for the local endpoint of this phase1 entry"
+msgstr "Selecione a interface para o endpoint local dessa entrada da fase 1"
+
+#: usr/local/www/vpn_ipsec_phase1.php:568
+#: usr/local/www/vpn_ipsec_phase1.php:581
+#: usr/local/www/vpn_ipsec_phase1.php:580
+#: usr/local/www/vpn_ipsec_phase1.php:601
+msgid "Enter the public IP address or host name of the remote gateway"
+msgstr "Informe o endereço IP público ou nome de host do gateway remoto"
+
+#: usr/local/www/vpn_ipsec_phase1.php:590
+#: usr/local/www/vpn_ipsec_phase1.php:603
+#: usr/local/www/vpn_ipsec_phase1.php:602
+#: usr/local/www/vpn_ipsec_phase1.php:623
+msgid "Phase 1 proposal (Authentication)"
+msgstr "Proposta da Fase 1 (Autenticação)"
+
+#: usr/local/www/vpn_ipsec_phase1.php:594
+#: usr/local/www/vpn_openvpn_client.php:514
+#: usr/local/www/vpn_openvpn_client.php:519
+#: usr/local/www/vpn_ipsec_phase1.php:607
+#: usr/local/www/vpn_openvpn_client.php:537
+#: usr/local/www/vpn_ipsec_phase1.php:606
+#: usr/local/www/vpn_openvpn_client.php:556
+#: usr/local/www/vpn_ipsec_phase1.php:627
+msgid "Authentication method"
+msgstr "Método de Autenticação"
+
+#: usr/local/www/vpn_ipsec_phase1.php:609
+#: usr/local/www/vpn_ipsec_phase1.php:735
+#: usr/local/www/vpn_ipsec_phase1.php:753
+#: usr/local/www/vpn_ipsec_phase1.php:622
+#: usr/local/www/vpn_ipsec_phase1.php:748
+#: usr/local/www/vpn_ipsec_phase1.php:766
+#: usr/local/www/vpn_ipsec_phase1.php:621
+#: usr/local/www/vpn_ipsec_phase1.php:747
+#: usr/local/www/vpn_ipsec_phase1.php:763
+#: usr/local/www/vpn_ipsec_phase1.php:642
+#: usr/local/www/vpn_ipsec_phase1.php:768
+#: usr/local/www/vpn_ipsec_phase1.php:784
+msgid "Must match the setting chosen on the remote side"
+msgstr "Deve corresponder à configuração escolhida no lado remoto"
+
+#: usr/local/www/vpn_ipsec_phase1.php:614
+#: usr/local/www/vpn_ipsec_phase1.php:627
+#: usr/local/www/vpn_ipsec_phase1.php:626
+#: usr/local/www/vpn_ipsec_phase1.php:647
+msgid "Negotiation mode"
+msgstr "Modo de Negociação"
+
+#: usr/local/www/vpn_ipsec_phase1.php:625
+#: usr/local/www/vpn_ipsec_phase1.php:638
+#: usr/local/www/vpn_ipsec_phase1.php:637
+#: usr/local/www/vpn_ipsec_phase1.php:658
+msgid "Aggressive is more flexible, but less secure"
+msgstr "Agressivo é mais flexível, mas não menos seguro"
+
+#: usr/local/www/vpn_ipsec_phase1.php:629
+#: usr/local/www/vpn_ipsec_phase1.php:642
+#: usr/local/www/vpn_ipsec_phase1.php:641
+#: usr/local/www/vpn_ipsec_phase1.php:662
+msgid "My identifier"
+msgstr "Meu Identificador"
+
+#: usr/local/www/vpn_ipsec_phase1.php:642
+#: usr/local/www/vpn_ipsec_phase1.php:655
+#: usr/local/www/vpn_ipsec_phase1.php:654
+#: usr/local/www/vpn_ipsec_phase1.php:675
+msgid "Peer identifier"
+msgstr "Identificador do peer"
+
+#: usr/local/www/vpn_ipsec_phase1.php:657
+#: usr/local/www/vpn_ipsec_phase1.php:670
+#: usr/local/www/vpn_ipsec_phase1.php:669
+#: usr/local/www/vpn_ipsec_phase1.php:690
+msgid "NOTE: This is known as the \"group\" setting on some VPN client implementations"
+msgstr "NOTA: Isso é conhecido como a configuração de \"grupo\" em algumas implementações de cliente VPN"
+
+#: usr/local/www/vpn_ipsec_phase1.php:668
+#: usr/local/www/vpn_ipsec_phase1.php:681
+msgid "Input your pre-shared key string"
+msgstr "Insira sua string de chave pré-configurada"
+
+#: usr/local/www/vpn_ipsec_phase1.php:673
+#: usr/local/www/vpn_ipsec_phase1.php:686
+#: usr/local/www/vpn_ipsec_phase1.php:685
+#: usr/local/www/vpn_ipsec_phase1.php:706
+msgid "Policy Generation"
+msgstr "Geração de política"
+
+#: usr/local/www/vpn_ipsec_phase1.php:684
+#: usr/local/www/vpn_ipsec_phase1.php:697
+#: usr/local/www/vpn_ipsec_phase1.php:696
+#: usr/local/www/vpn_ipsec_phase1.php:717
+msgid "When working as a responder (as with mobile clients), this controls how policies are generated based on SA proposals."
+msgstr "Ao trabalhar com um responder (como em clientes móveis), isto controla como as políticas são geradas com base nas propostas SA."
+
+#: usr/local/www/vpn_ipsec_phase1.php:689
+#: usr/local/www/vpn_ipsec_phase1.php:702
+#: usr/local/www/vpn_ipsec_phase1.php:701
+#: usr/local/www/vpn_ipsec_phase1.php:722
+msgid "Proposal Checking"
+msgstr "Verificação de Proposta"
+
+#: usr/local/www/vpn_ipsec_phase1.php:700
+#: usr/local/www/vpn_ipsec_phase1.php:713
+#: usr/local/www/vpn_ipsec_phase1.php:712
+#: usr/local/www/vpn_ipsec_phase1.php:733
+msgid "Specifies the action of lifetime length, key length, and PFS of the phase 2 selection on the responder side, and the action of lifetime check in phase 1."
+msgstr "Especifica a ação de tamanho da tempo de vida, tamanho da chave, e PFS da seleção da fase 2 no lado que responde, e a ação de verificação de tempo de vida na fase 1."
+
+#: usr/local/www/vpn_ipsec_phase1.php:705
+#: usr/local/www/vpn_openvpn_client.php:706
+#: usr/local/www/vpn_openvpn_server.php:898
+#: usr/local/www/vpn_openvpn_server.php:971
+#: usr/local/www/vpn_openvpn_client.php:711
+#: usr/local/www/vpn_ipsec_phase1.php:718
+#: usr/local/www/vpn_openvpn_server.php:999
+#: usr/local/www/vpn_openvpn_client.php:729
+#: usr/local/www/vpn_ipsec_phase1.php:717
+#: usr/local/www/vpn_openvpn_client.php:748
+#: usr/local/www/vpn_ipsec_phase1.php:738
+#: usr/local/www/vpn_openvpn_server.php:1026
+msgid "Encryption algorithm"
+msgstr "Algoritmo de Criptografia"
+
+#: usr/local/www/vpn_ipsec_phase1.php:724
+#: usr/local/www/vpn_ipsec_phase1.php:737
+#: usr/local/www/vpn_ipsec_phase1.php:736
+#: usr/local/www/vpn_ipsec_phase1.php:757
+msgid "Hash algorithm"
+msgstr "Algorítmo de Hash"
+
+#: usr/local/www/vpn_ipsec_phase1.php:740
+#: usr/local/www/vpn_ipsec_phase1.php:753
+#: usr/local/www/vpn_ipsec_phase1.php:752
+#: usr/local/www/vpn_ipsec_phase1.php:773
+msgid "DH key group"
+msgstr "Grupo de chave DH"
+
+#: usr/local/www/vpn_ipsec_phase1.php:751
+#: usr/local/www/vpn_ipsec_phase2.php:603
+#: usr/local/www/vpn_ipsec_phase2.php:629
+#: usr/local/www/vpn_ipsec_phase1.php:764
+msgid "1 = 768 bit, 2 = 1024 bit, 5 = 1536 bit"
+msgstr "1 = 768 bit, 2 = 1024 bit, 5 = 1536 bit"
+
+#: usr/local/www/vpn_ipsec_phase1.php:765
+#: usr/local/www/vpn_ipsec_phase1.php:778
+#: usr/local/www/vpn_ipsec_phase1.php:775
+#: usr/local/www/vpn_ipsec_phase1.php:796
+msgid "My Certificate"
+msgstr "Meu Certificado"
+
+#: usr/local/www/vpn_ipsec_phase1.php:779
+#: usr/local/www/vpn_ipsec_phase1.php:792
+#: usr/local/www/vpn_ipsec_phase1.php:789
+#: usr/local/www/vpn_ipsec_phase1.php:810
+msgid "Select a certificate previously configured in the Certificate Manager"
+msgstr "Selecione um certificado previamente configurado no Gerenciador de Certificado"
+
+#: usr/local/www/vpn_ipsec_phase1.php:784
+#: usr/local/www/vpn_ipsec_phase1.php:797
+#: usr/local/www/vpn_ipsec_phase1.php:794
+#: usr/local/www/vpn_ipsec_phase1.php:815
+msgid "My Certificate Authority"
+msgstr "Minha Fonte Certificadora"
+
+#: usr/local/www/vpn_ipsec_phase1.php:798
+#: usr/local/www/vpn_ipsec_phase1.php:811
+#: usr/local/www/vpn_ipsec_phase1.php:808
+#: usr/local/www/vpn_ipsec_phase1.php:829
+msgid "Select a certificate authority previously configured in the Certificate Manager"
+msgstr "Selecione uma fonte certificadora previamente configurada no Gerenciador de Certificados"
+
+#: usr/local/www/vpn_ipsec_phase1.php:809
+#: usr/local/www/vpn_ipsec_phase1.php:822
+#: usr/local/www/vpn_ipsec_phase1.php:819
+#: usr/local/www/vpn_ipsec_phase1.php:840
+msgid "NAT Traversal"
+msgstr "NAT Traversal"
+
+#: usr/local/www/vpn_ipsec_phase1.php:814
+#: usr/local/www/vpn_ipsec_phase1.php:827
+#: usr/local/www/vpn_ipsec_phase1.php:824
+#: usr/local/www/vpn_ipsec_phase1.php:845
+msgid "Force"
+msgstr "Forçar"
+
+#: usr/local/www/vpn_ipsec_phase1.php:818
+#: usr/local/www/vpn_ipsec_phase1.php:831
+#: usr/local/www/vpn_ipsec_phase1.php:828
+#: usr/local/www/vpn_ipsec_phase1.php:849
+msgid "Set this option to enable the use of NAT-T (i.e. the encapsulation of ESP in UDP packets) if needed, which can help with clients that are behind restrictive firewalls"
+msgstr "Configure essa opção para habilitar o uso de NAT-T (i.e. o encapsulamento de ESP em pacotes UDP) se necessário, o que pode ajudar com clientes que estão atrás de firewalls restritivos"
+
+#: usr/local/www/vpn_ipsec_phase1.php:824
+#: usr/local/www/vpn_ipsec_phase1.php:837
+#: usr/local/www/vpn_ipsec_phase1.php:834
+#: usr/local/www/vpn_ipsec_phase1.php:855
+msgid "Dead Peer Detection"
+msgstr "Detecção de Dead Peer"
+
+#: usr/local/www/vpn_ipsec_phase1.php:827
+#: usr/local/www/vpn_ipsec_phase1.php:840
+#: usr/local/www/vpn_ipsec_phase1.php:837
+#: usr/local/www/vpn_ipsec_phase1.php:858
+msgid "Enable DPD"
+msgstr "Habilitar DPD"
+
+#: usr/local/www/vpn_ipsec_phase1.php:833
+#: usr/local/www/vpn_ipsec_phase1.php:846
+#: usr/local/www/vpn_ipsec_phase1.php:843
+#: usr/local/www/vpn_ipsec_phase1.php:864
+msgid "Delay between requesting peer acknowledgement"
+msgstr "Atraso entre requisições de reconhecimento de peer"
+
+#: usr/local/www/vpn_ipsec_phase1.php:837
+#: usr/local/www/vpn_ipsec_phase1.php:850
+#: usr/local/www/vpn_ipsec_phase1.php:847
+#: usr/local/www/vpn_ipsec_phase1.php:868
+msgid "retries"
+msgstr "tentativas"
+
+#: usr/local/www/vpn_ipsec_phase1.php:839
+#: usr/local/www/vpn_ipsec_phase1.php:852
+#: usr/local/www/vpn_ipsec_phase1.php:849
+#: usr/local/www/vpn_ipsec_phase1.php:870
+msgid "Number of consecutive failures allowed before disconnect"
+msgstr "Número de falhas consecutivas permitidas antes de desconectar"
+
+#: usr/local/www/vpn_ipsec_phase2.php:109
+#: usr/local/www/vpn_ipsec_phase2.php:111
+msgid "A valid ikeid must be specified."
+msgstr "Um ikeid válido deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase2.php:113
+#: usr/local/www/vpn_ipsec_phase2.php:115
+msgid "Local network type"
+msgstr "Tipo de rede local"
+
+#: usr/local/www/vpn_ipsec_phase2.php:113
+#: usr/local/www/vpn_ipsec_phase2.php:115
+msgid "P2 Hash Algorithms"
+msgstr "Algorpítimos de Hash da F2"
+
+#: usr/local/www/vpn_ipsec_phase2.php:116
+#: usr/local/www/vpn_ipsec_phase2.php:118
+msgid "Remote network type"
+msgstr "Tipo de rede remota"
+
+#: usr/local/www/vpn_ipsec_phase2.php:126
+#: usr/local/www/vpn_ipsec_phase2.php:128
+msgid "A valid local network bit count must be specified."
+msgstr "Um contador de bits de rede local válido deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase2.php:129
+#: usr/local/www/vpn_ipsec_phase2.php:131
+msgid "A valid local network IP address must be specified."
+msgstr "Um endereço IP válido da rede local deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase2.php:136
+#: usr/local/www/vpn_ipsec_phase2.php:146
+#: usr/local/www/vpn_ipsec_phase2.php:170
+#: usr/local/www/vpn_ipsec_phase2.php:178
+msgid "A valid remote network bit count must be specified."
+msgstr "Um contador de bits de rede remota válido deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase2.php:139
+#: usr/local/www/vpn_ipsec_phase2.php:149
+#: usr/local/www/vpn_ipsec_phase2.php:173
+#: usr/local/www/vpn_ipsec_phase2.php:181
+msgid "A valid remote network IP address must be specified."
+msgstr "Um endereço IP válido da rede remota deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase2.php:158
+#: usr/local/www/vpn_ipsec_phase2.php:162
+#: usr/local/www/vpn_ipsec_phase2.php:168
+#: usr/local/www/vpn_ipsec_phase2.php:172
+#: usr/local/www/vpn_ipsec_phase2.php:192
+#: usr/local/www/vpn_ipsec_phase2.php:196
+#: usr/local/www/vpn_ipsec_phase2.php:206
+#: usr/local/www/vpn_ipsec_phase2.php:210
+msgid "Phase2 with this Local Network is already defined for mobile clients."
+msgstr "Phase2 com esta rede local já está definido para clientes móveis."
+
+#: usr/local/www/vpn_ipsec_phase2.php:189
+#: usr/local/www/vpn_ipsec_phase2.php:193
+#: usr/local/www/vpn_ipsec_phase2.php:199
+#: usr/local/www/vpn_ipsec_phase2.php:203
+#: usr/local/www/vpn_ipsec_phase2.php:223
+#: usr/local/www/vpn_ipsec_phase2.php:227
+#: usr/local/www/vpn_ipsec_phase2.php:237
+#: usr/local/www/vpn_ipsec_phase2.php:241
+msgid "Phase2 with this Local/Remote networks combination is already defined for this Phase1."
+msgstr "Phase2 com esta combinação de redes local/remota já está definido para esta Phase1."
+
+#: usr/local/www/vpn_ipsec_phase2.php:204
+#: usr/local/www/vpn_ipsec_phase2.php:216
+#: usr/local/www/vpn_ipsec_phase2.php:240
+#: usr/local/www/vpn_ipsec_phase2.php:254
+msgid "At least one encryption algorithm must be selected."
+msgstr "Pelo menos um algorítimo de criptografica deve ser selecionado."
+
+#: usr/local/www/vpn_ipsec_phase2.php:207
+#: usr/local/www/vpn_ipsec_phase2.php:220
+#: usr/local/www/vpn_ipsec_phase2.php:244
+#: usr/local/www/vpn_ipsec_phase2.php:258
+msgid "The P2 lifetime must be an integer."
+msgstr "O tempo de vida da F2 deve ser um inteiro."
+
+#: usr/local/www/vpn_ipsec_phase2.php:255
+#: usr/local/www/vpn_ipsec_phase2.php:257
+#: usr/local/www/vpn_ipsec_phase2.php:268
+#: usr/local/www/vpn_ipsec_phase2.php:270
+#: usr/local/www/vpn_ipsec_phase2.php:294
+#: usr/local/www/vpn_ipsec_phase2.php:296
+#: usr/local/www/vpn_ipsec_phase2.php:316
+#: usr/local/www/vpn_ipsec_phase2.php:318
+msgid "Edit Phase 2"
+msgstr "Editar Fase 2"
+
+#: usr/local/www/vpn_ipsec_phase2.php:396
+#: usr/local/www/vpn_ipsec_phase2.php:422
+#: usr/local/www/vpn_ipsec_phase2.php:488
+#: usr/local/www/vpn_ipsec_phase2.php:510
+msgid "Disable this phase2 entry"
+msgstr "Desabilitar essa entrada da fase 2"
+
+#: usr/local/www/vpn_ipsec_phase2.php:398
+#: usr/local/www/vpn_ipsec_phase2.php:424
+#: usr/local/www/vpn_ipsec_phase2.php:490
+#: usr/local/www/vpn_ipsec_phase2.php:512
+msgid "Set this option to disable this phase2 entry without removing it from the list"
+msgstr "Configurar essa opção para desabilitar essa entrada da fase 2 sem removê-la da lista"
+
+#: usr/local/www/vpn_ipsec_phase2.php:433
+#: usr/local/www/vpn_ipsec_phase2.php:459
+#: usr/local/www/vpn_ipsec_phase2.php:525
+#: usr/local/www/vpn_ipsec_phase2.php:561
+#: usr/local/www/vpn_ipsec_phase2.php:547
+#: usr/local/www/vpn_ipsec_phase2.php:582
+#, php-format
+msgid "%s subnet"
+msgstr " subrede %s"
+
+#: usr/local/www/vpn_ipsec_phase2.php:512
+#: usr/local/www/vpn_ipsec_phase2.php:538
+#: usr/local/www/vpn_ipsec_phase2.php:640
+#: usr/local/www/vpn_ipsec_phase2.php:661
+msgid "Phase 2 proposal (SA/Key Exchange)"
+msgstr "Proposta da Fase 2 (Troca de Chave/SA)"
+
+#: usr/local/www/vpn_ipsec_phase2.php:527
+#: usr/local/www/vpn_ipsec_phase2.php:553
+#: usr/local/www/vpn_ipsec_phase2.php:655
+#: usr/local/www/vpn_ipsec_phase2.php:676
+msgid "ESP is encryption, AH is authentication only"
+msgstr "ESP é criptografia, AH é somente autenticação"
+
+#: usr/local/www/vpn_ipsec_phase2.php:532
+#: usr/local/www/vpn_ipsec_phase2.php:558
+#: usr/local/www/vpn_ipsec_phase2.php:660
+#: usr/local/www/vpn_ipsec_phase2.php:681
+msgid "Encryption algorithms"
+msgstr "Algorítmos de criptografia"
+
+#: usr/local/www/vpn_ipsec_phase2.php:574
+#: usr/local/www/vpn_ipsec_phase2.php:600
+#: usr/local/www/vpn_ipsec_phase2.php:702
+#: usr/local/www/vpn_ipsec_phase2.php:723
+msgid "Hint: use 3DES for best compatibility or if you have a hardware crypto accelerator card. Blowfish is usually the fastest in software encryption"
+msgstr "Dica: use 3DES para melhor compatibilidade ou se você tem um cartão de aceleração de criptografia de hardware. Blowfish é normalmente o mais rápido em criptografia de software"
+
+#: usr/local/www/vpn_ipsec_phase2.php:580
+#: usr/local/www/vpn_ipsec_phase2.php:606
+#: usr/local/www/vpn_ipsec_phase2.php:708
+#: usr/local/www/vpn_ipsec_phase2.php:729
+msgid "Hash algorithms"
+msgstr "Algorítmos de hash"
+
+#: usr/local/www/vpn_ipsec_phase2.php:590
+#: usr/local/www/vpn_ipsec_phase2.php:616
+#: usr/local/www/vpn_ipsec_phase2.php:718
+#: usr/local/www/vpn_ipsec_phase2.php:739
+msgid "PFS key group"
+msgstr "Grupo de chave PFS"
+
+#: usr/local/www/vpn_ipsec_phase2.php:614
+#: usr/local/www/vpn_ipsec_phase2.php:640
+#: usr/local/www/vpn_ipsec_phase2.php:736
+#: usr/local/www/vpn_ipsec_phase2.php:757
+msgid "Set globally in mobile client options"
+msgstr "Configure globalmente em opções de clientes móveis"
+
+#: usr/local/www/vpn_ipsec_phase2.php:632
+#: usr/local/www/vpn_ipsec_phase2.php:658
+#: usr/local/www/vpn_ipsec_phase2.php:754
+#: usr/local/www/vpn_ipsec_phase2.php:775
+msgid "Automatically ping host"
+msgstr "Fazer ping em host automaticamente"
+
+#: usr/local/www/vpn_l2tp.php:300
+msgid "Enable l2tp server"
+msgstr "Habilitar servidor l2tp"
+
+#: usr/local/www/vpn_l2tp.php:325 usr/local/www/vpn_l2tp.php:326
+#: usr/local/www/vpn_l2tp.php:329
+msgid "Enter the IP address the L2TP server should give to clients for use as their \"gateway\""
+msgstr "Digite o endereço IP que o servidor L2TP deve dar aos clientes para utilizar como seus \"gateway\""
+
+#: usr/local/www/vpn_l2tp.php:337 usr/local/www/vpn_l2tp.php:338
+#: usr/local/www/vpn_l2tp.php:341
+msgid "Specify the starting address for the client IP address subnet."
+msgstr "Especifique o endereço de início para a subrede de endereços IP do cliente."
+
+#: usr/local/www/vpn_l2tp.php:341 usr/local/www/vpn_pppoe_edit.php:390
+#: usr/local/www/vpn_pppoe_edit.php:391 usr/local/www/vpn_pppoe_edit.php:394
+msgid "Subnet netmask"
+msgstr "Máscara de subrede"
+
+#: usr/local/www/vpn_l2tp.php:354 usr/local/www/vpn_pppoe_edit.php:403
+#: usr/local/www/vpn_pppoe_edit.php:404 usr/local/www/vpn_l2tp.php:355
+#: usr/local/www/vpn_l2tp.php:358 usr/local/www/vpn_pppoe_edit.php:407
+msgid "is"
+msgstr "é"
+
+#: usr/local/www/vpn_l2tp.php:358 usr/local/www/vpn_l2tp.php:359
+#: usr/local/www/vpn_l2tp.php:362
+msgid "Number of L2TP users"
+msgstr "Número de usuários L2TP"
+
+#: usr/local/www/vpn_l2tp.php:371 usr/local/www/vpn_l2tp.php:372
+#: usr/local/www/vpn_l2tp.php:375
+msgid "is ten L2TP clients"
+msgstr "tem dez clientes L2TP"
+
+#: usr/local/www/vpn_l2tp.php:375 usr/local/www/vpn_l2tp.php:376
+#: usr/local/www/vpn_l2tp.php:379
+msgid "Secret"
+msgstr "Segredo"
+
+#: usr/local/www/vpn_l2tp.php:379 usr/local/www/vpn_l2tp.php:380
+#: usr/local/www/vpn_l2tp.php:383
+msgid "Specify optional secret shared between peers. Required on some devices/setups."
+msgstr "Especificar segredos opcionais compartilhados entre peers. Requerido em alguns dispositivos/instalações."
+
+#: usr/local/www/vpn_l2tp.php:383
+msgid "Encryption type"
+msgstr "Tipo de criptografia"
+
+#: usr/local/www/vpn_l2tp.php:386 usr/local/www/vpn_l2tp.php:387
+#: usr/local/www/vpn_l2tp.php:390
+msgid "CHAP"
+msgstr "CHAP"
+
+#: usr/local/www/vpn_l2tp.php:387 usr/local/www/services_captiveportal.php:607
+#: usr/local/www/services_captiveportal.php:605 usr/local/www/vpn_l2tp.php:388
+#: usr/local/www/vpn_l2tp.php:391 usr/local/www/services_captiveportal.php:606
+#: usr/local/www/services_captiveportal.php:622
+msgid "PAP"
+msgstr "PAP"
+
+#: usr/local/www/vpn_l2tp.php:390 usr/local/www/vpn_l2tp.php:391
+#: usr/local/www/vpn_l2tp.php:394
+msgid "Specifies which protocol to use for authentication."
+msgstr "Especifica qual protocolo usar para autenticação."
+
+#: usr/local/www/vpn_l2tp.php:394 usr/local/www/vpn_l2tp.php:395
+#: usr/local/www/vpn_l2tp.php:398
+msgid "L2TP DNS Servers"
+msgstr "Servidores DNS L2TP"
+
+#: usr/local/www/vpn_l2tp.php:400 usr/local/www/vpn_l2tp.php:401
+#: usr/local/www/vpn_l2tp.php:404
+msgid "primary and secondary DNS servers assigned to L2TP clients"
+msgstr "servidores DNS primário e secundário atribuídos a clientes L2TP"
+
+#: usr/local/www/vpn_l2tp.php:414 usr/local/www/vpn_l2tp.php:415
+#: usr/local/www/vpn_l2tp.php:418
+msgid "When set, all users will be authenticated using the RADIUS server specified below. The local user database will not be used."
+msgstr "Quando configurado, todos os usuários serão autenticados usando o servidor RADIUS especificado abaixo. A base de dados de usuários local não será usada."
+
+#: usr/local/www/vpn_l2tp.php:418 usr/local/www/vpn_l2tp.php:419
+#: usr/local/www/vpn_l2tp.php:422
+msgid "Sends accounting packets to the RADIUS server."
+msgstr "Envia pacotes de accounting para o servidor RADIUS."
+
+#: usr/local/www/vpn_l2tp.php:421
+msgid "RADIUS server"
+msgstr "Servidor RADIUS"
+
+#: usr/local/www/vpn_l2tp.php:425 usr/local/www/vpn_l2tp.php:426
+#: usr/local/www/vpn_l2tp.php:429
+msgid "Enter the IP address of the RADIUS server."
+msgstr "Informe o endereço IP do servidor RADIUS."
+
+#: usr/local/www/vpn_l2tp.php:432 usr/local/www/vpn_l2tp.php:433
+#: usr/local/www/vpn_l2tp.php:436
+msgid "Enter the shared secret that will be used to authenticate to the RADIUS server."
+msgstr "Informe o segredo compartilhado que será usado para autenticar no servidor RADIUS."
+
+#: usr/local/www/vpn_l2tp.php:435
+msgid "RADIUS issued IP's"
+msgstr "IP emitidos pelo RADIUS"
+
+#: usr/local/www/vpn_l2tp.php:439 usr/local/www/vpn_l2tp.php:440
+#: usr/local/www/vpn_l2tp.php:443
+msgid "Issue IP Addresses via RADIUS server."
+msgstr "Endereços IP emitidos via servidor RADIUS."
+
+#: usr/local/www/vpn_l2tp.php:452 usr/local/www/vpn_l2tp.php:453
+#: usr/local/www/vpn_l2tp.php:456
+msgid "Don't forget to add a firewall rule to permit traffic from L2TP clients!"
+msgstr "Não se esqueça de adicionar uma regra de firewall para permitir tráfego de clientes L2TP!"
+
+#: usr/local/www/vpn_l2tp_users.php:86 usr/local/www/vpn_l2tp_users.php:87
+msgid "The l2tp user list has been modified"
+msgstr "A lista de usuários l2tp foi modificada"
+
+#: usr/local/www/vpn_l2tp_users.php:86 usr/local/www/vpn_l2tp_users.php:87
+msgid "Warning: this will terminate all current l2tp sessions!"
+msgstr "Advertência: isso finalizará todas as sessões l2tp atuais!"
+
+#: usr/local/www/vpn_l2tp_users_edit.php:164
+#: usr/local/www/vpn_l2tp_users_edit.php:165
+msgid "If you want to change the users password, enter it here twice."
+msgstr "Se você desejar mudar a senha do usuário, informe-a aqui duas vezes."
+
+#: usr/local/www/vpn_openvpn_client.php:40
+#: usr/local/www/vpn_openvpn_client.php:366
+#: usr/local/www/vpn_openvpn_csc.php:294
+#: usr/local/www/vpn_openvpn_server.php:584
+#: usr/local/www/vpn_openvpn_server.php:657
+#: usr/local/www/vpn_openvpn_client.php:371
+#: usr/local/www/vpn_openvpn_csc.php:293
+#: usr/local/www/vpn_openvpn_server.php:675
+#: usr/local/www/vpn_openvpn_client.php:379
+#: usr/local/www/vpn_openvpn_client.php:397
+#: usr/local/www/vpn_openvpn_server.php:701
+msgid "Client"
+msgstr "Cliente"
+
+#: usr/local/www/vpn_openvpn_client.php:82
+#: usr/local/www/vpn_openvpn_client.php:86
+msgid "Client successfully deleted"
+msgstr "Cliente apagado com sucesso"
+
+#: usr/local/www/vpn_openvpn_client.php:164
+#: usr/local/www/vpn_openvpn_server.php:227
+#: usr/local/www/vpn_openvpn_server.php:232
+#: usr/local/www/vpn_openvpn_client.php:165
+#: usr/local/www/vpn_openvpn_server.php:233
+#: usr/local/www/vpn_openvpn_client.php:171
+#: usr/local/www/vpn_openvpn_client.php:182
+#: usr/local/www/vpn_openvpn_server.php:254
+msgid "The specified 'Local port' is in use. Please select another value"
+msgstr "A 'porta local' especificada está em uso. Por favor, selecione outro valor"
+
+#: usr/local/www/vpn_openvpn_client.php:183
+#: usr/local/www/vpn_openvpn_client.php:184
+#: usr/local/www/vpn_openvpn_client.php:190
+#: usr/local/www/vpn_openvpn_client.php:201
+msgid "User name and password are required for proxy with authentication."
+msgstr "Nome de usuário e senha são requeridos para o proxy com autenticação."
+
+#: usr/local/www/vpn_openvpn_client.php:200
+#: usr/local/www/vpn_openvpn_server.php:235
+#: usr/local/www/vpn_openvpn_server.php:240
+#: usr/local/www/vpn_openvpn_client.php:204
+#: usr/local/www/vpn_openvpn_server.php:241
+#: usr/local/www/vpn_openvpn_client.php:210
+#: usr/local/www/vpn_openvpn_client.php:228
+#: usr/local/www/vpn_openvpn_server.php:262
+msgid "The field 'Shared Key' does not appear to be valid"
+msgstr "O campo 'Chave compartilhada' não parece ser válido"
+
+#: usr/local/www/vpn_openvpn_client.php:205
+#: usr/local/www/vpn_openvpn_server.php:240
+#: usr/local/www/vpn_openvpn_server.php:245
+#: usr/local/www/vpn_openvpn_client.php:209
+#: usr/local/www/vpn_openvpn_server.php:246
+#: usr/local/www/vpn_openvpn_client.php:215
+#: usr/local/www/vpn_openvpn_client.php:233
+#: usr/local/www/vpn_openvpn_server.php:267
+msgid "The field 'TLS Authentication Key' does not appear to be valid"
+msgstr "O campo 'Chave de Autenticação TLS' não parece ser válido"
+
+#: usr/local/www/vpn_openvpn_client.php:214
+#: usr/local/www/vpn_openvpn_server.php:286
+#: usr/local/www/vpn_openvpn_server.php:291
+#: usr/local/www/vpn_openvpn_client.php:218
+#: usr/local/www/vpn_openvpn_server.php:292
+#: usr/local/www/vpn_openvpn_client.php:224
+#: usr/local/www/vpn_openvpn_client.php:242
+#: usr/local/www/vpn_openvpn_server.php:313
+msgid "Shared key"
+msgstr "Chave compartilhada"
+
+#: usr/local/www/vpn_openvpn_client.php:367
+#: usr/local/www/vpn_openvpn_csc.php:295
+#: usr/local/www/vpn_openvpn_server.php:585
+#: usr/local/www/vpn_openvpn_server.php:658
+#: usr/local/www/vpn_openvpn_client.php:372
+#: usr/local/www/vpn_openvpn_csc.php:294
+#: usr/local/www/vpn_openvpn_server.php:676
+#: usr/local/www/vpn_openvpn_client.php:380
+#: usr/local/www/vpn_openvpn_client.php:398
+#: usr/local/www/vpn_openvpn_server.php:702
+msgid "Client Specific Overrides"
+msgstr "Substituição Específica de Cliente"
+
+#: usr/local/www/vpn_openvpn_client.php:397
+#: usr/local/www/vpn_openvpn_client.php:402
+#: usr/local/www/vpn_openvpn_client.php:410
+#: usr/local/www/vpn_openvpn_client.php:428
+msgid "Disable this client"
+msgstr "Desabilitar esse cliente"
+
+#: usr/local/www/vpn_openvpn_client.php:402
+#: usr/local/www/vpn_openvpn_client.php:407
+#: usr/local/www/vpn_openvpn_client.php:415
+#: usr/local/www/vpn_openvpn_client.php:433
+msgid "Set this option to disable this client without removing it from the list"
+msgstr "Configure essa opção para desabilitar esse cliente sem removê-lo da lista"
+
+#: usr/local/www/vpn_openvpn_client.php:406
+#: usr/local/www/vpn_openvpn_server.php:624
+#: usr/local/www/vpn_openvpn_server.php:697
+#: usr/local/www/vpn_openvpn_client.php:411
+#: usr/local/www/vpn_openvpn_server.php:715
+#: usr/local/www/vpn_openvpn_client.php:419
+#: usr/local/www/vpn_openvpn_client.php:437
+#: usr/local/www/vpn_openvpn_server.php:741
+msgid "Server Mode"
+msgstr "Modo do Servidor"
+
+#: usr/local/www/vpn_openvpn_client.php:436
+#: usr/local/www/vpn_openvpn_client.php:441
+#: usr/local/www/vpn_openvpn_client.php:449
+#: usr/local/www/vpn_openvpn_client.php:467
+msgid "Device mode"
+msgstr "Modo do Dispositivo"
+
+#: usr/local/www/vpn_openvpn_client.php:476
+#: usr/local/www/vpn_openvpn_server.php:716
+#: usr/local/www/vpn_openvpn_server.php:789
+#: usr/local/www/vpn_openvpn_client.php:481
+#: usr/local/www/vpn_openvpn_server.php:817
+#: usr/local/www/vpn_openvpn_client.php:499
+#: usr/local/www/vpn_openvpn_client.php:518
+#: usr/local/www/vpn_openvpn_server.php:844
+msgid "Local port"
+msgstr "Porta local"
+
+#: usr/local/www/vpn_openvpn_client.php:480
+#: usr/local/www/vpn_openvpn_client.php:485
+#: usr/local/www/vpn_openvpn_client.php:503
+#: usr/local/www/vpn_openvpn_client.php:522
+msgid "Set this option if you would like to bind to a specific port. Leave this blank or enter 0 for a random dynamic port."
+msgstr "Configure esta opção se você desejar especificar uma porta específica para bind. Deixe em branco ou 0 para obter um valor randômico de porta."
+
+#: usr/local/www/vpn_openvpn_client.php:484
+#: usr/local/www/vpn_openvpn_client.php:489
+#: usr/local/www/vpn_openvpn_client.php:507
+#: usr/local/www/vpn_openvpn_client.php:526
+msgid "Server host or address"
+msgstr "Host de servidor ou endereço"
+
+#: usr/local/www/vpn_openvpn_client.php:490
+#: usr/local/www/vpn_openvpn_client.php:495
+#: usr/local/www/vpn_openvpn_client.php:513
+#: usr/local/www/vpn_openvpn_client.php:532
+msgid "Server port"
+msgstr "Porta de servidor"
+
+#: usr/local/www/vpn_openvpn_client.php:496
+#: usr/local/www/vpn_openvpn_client.php:501
+#: usr/local/www/vpn_openvpn_client.php:519
+#: usr/local/www/vpn_openvpn_client.php:538
+msgid "Proxy host or address"
+msgstr "Host de Proxy ou endereço"
+
+#: usr/local/www/vpn_openvpn_client.php:502
+#: usr/local/www/vpn_openvpn_client.php:507
+#: usr/local/www/vpn_openvpn_client.php:525
+#: usr/local/www/vpn_openvpn_client.php:544
+msgid "Proxy port"
+msgstr "Porta do Proxy"
+
+#: usr/local/www/vpn_openvpn_client.php:508
+#: usr/local/www/vpn_openvpn_client.php:513
+#: usr/local/www/vpn_openvpn_client.php:531
+#: usr/local/www/vpn_openvpn_client.php:550
+msgid "Proxy authentication extra options"
+msgstr "Opções extras de autenticação de proxy"
+
+#: usr/local/www/vpn_openvpn_client.php:520
+#: usr/local/www/vpn_openvpn_client.php:525
+#: usr/local/www/vpn_openvpn_client.php:543
+#: usr/local/www/vpn_openvpn_client.php:562
+msgid "basic"
+msgstr "básico"
+
+#: usr/local/www/vpn_openvpn_client.php:521
+#: usr/local/www/vpn_openvpn_client.php:526
+#: usr/local/www/vpn_openvpn_client.php:544
+#: usr/local/www/vpn_openvpn_client.php:563
+msgid "ntlm"
+msgstr "ntlm"
+
+#: usr/local/www/vpn_openvpn_client.php:552
+#: usr/local/www/vpn_openvpn_client.php:557
+#: usr/local/www/vpn_openvpn_client.php:575
+#: usr/local/www/vpn_openvpn_client.php:594
+msgid "Server host name resolution"
+msgstr "Resolução de nome de host de servidor"
+
+#: usr/local/www/vpn_openvpn_client.php:562
+#: usr/local/www/vpn_openvpn_client.php:567
+#: usr/local/www/vpn_openvpn_client.php:585
+#: usr/local/www/vpn_openvpn_client.php:604
+msgid "Infinitely resolve server"
+msgstr "Resolver servidor infinitamente"
+
+#: usr/local/www/vpn_openvpn_client.php:567
+#: usr/local/www/vpn_openvpn_client.php:572
+#: usr/local/www/vpn_openvpn_client.php:590
+#: usr/local/www/vpn_openvpn_client.php:609
+msgid "Continuously attempt to resolve the server host name. Useful when communicating with a server that is not permanently connected to the Internet"
+msgstr "Continuamente tenta resolver o nome de host do servidor. Útil quando estiver comunicando-se com um servidor que não está permanentemente conectado à Internet"
+
+#: usr/local/www/vpn_openvpn_client.php:584
+#: usr/local/www/vpn_openvpn_server.php:733
+#: usr/local/www/vpn_openvpn_server.php:806
+#: usr/local/www/vpn_openvpn_client.php:589
+#: usr/local/www/vpn_openvpn_server.php:834
+#: usr/local/www/vpn_openvpn_client.php:607
+#: usr/local/www/vpn_openvpn_client.php:626
+#: usr/local/www/vpn_openvpn_server.php:861
+msgid "Cryptographic Settings"
+msgstr "Configurações de Criptografia"
+
+#: usr/local/www/vpn_openvpn_client.php:587
+#: usr/local/www/vpn_openvpn_server.php:736
+#: usr/local/www/vpn_openvpn_server.php:809
+#: usr/local/www/vpn_openvpn_client.php:592
+#: usr/local/www/vpn_openvpn_server.php:837
+#: usr/local/www/vpn_openvpn_client.php:610
+#: usr/local/www/vpn_openvpn_client.php:629
+#: usr/local/www/vpn_openvpn_server.php:864
+msgid "TLS Authentication"
+msgstr "Autenticação de TLS"
+
+#: usr/local/www/vpn_openvpn_client.php:597
+#: usr/local/www/vpn_openvpn_server.php:746
+#: usr/local/www/vpn_openvpn_server.php:819
+#: usr/local/www/vpn_openvpn_client.php:602
+#: usr/local/www/vpn_openvpn_server.php:847
+#: usr/local/www/vpn_openvpn_client.php:620
+#: usr/local/www/vpn_openvpn_client.php:639
+#: usr/local/www/vpn_openvpn_server.php:874
+msgid "Enable authentication of TLS packets"
+msgstr "Habilitar autenticação de pacotes TLS"
+
+#: usr/local/www/vpn_openvpn_client.php:611
+#: usr/local/www/vpn_openvpn_server.php:760
+#: usr/local/www/vpn_openvpn_server.php:833
+#: usr/local/www/vpn_openvpn_client.php:616
+#: usr/local/www/vpn_openvpn_server.php:861
+#: usr/local/www/vpn_openvpn_client.php:634
+#: usr/local/www/vpn_openvpn_client.php:653
+#: usr/local/www/vpn_openvpn_server.php:888
+msgid "Automatically generate a shared TLS authentication key"
+msgstr "Gerar automaticamente uma chave de autenticação TLS compartilhada"
+
+#: usr/local/www/vpn_openvpn_client.php:622
+#: usr/local/www/vpn_openvpn_client.php:699
+#: usr/local/www/vpn_openvpn_server.php:771
+#: usr/local/www/vpn_openvpn_server.php:891
+#: usr/local/www/vpn_openvpn_server.php:844
+#: usr/local/www/vpn_openvpn_server.php:964
+#: usr/local/www/vpn_openvpn_client.php:627
+#: usr/local/www/vpn_openvpn_client.php:704
+#: usr/local/www/vpn_openvpn_server.php:872
+#: usr/local/www/vpn_openvpn_server.php:992
+#: usr/local/www/vpn_openvpn_client.php:645
+#: usr/local/www/vpn_openvpn_client.php:722
+#: usr/local/www/vpn_openvpn_client.php:664
+#: usr/local/www/vpn_openvpn_client.php:741
+#: usr/local/www/vpn_openvpn_server.php:899
+#: usr/local/www/vpn_openvpn_server.php:1019
+msgid "Paste your shared key here"
+msgstr "Cole sua chave compartilhada aqui"
+
+#: usr/local/www/vpn_openvpn_client.php:648
+#: usr/local/www/vpn_openvpn_client.php:653
+#: usr/local/www/vpn_openvpn_client.php:671
+#: usr/local/www/vpn_openvpn_client.php:690
+msgid "Client Certificate"
+msgstr "Certificado de Cliente"
+
+#: usr/local/www/vpn_openvpn_client.php:677
+#: usr/local/www/vpn_openvpn_server.php:869
+#: usr/local/www/vpn_openvpn_server.php:942
+#: usr/local/www/vpn_openvpn_client.php:682
+#: usr/local/www/vpn_openvpn_server.php:970
+#: usr/local/www/vpn_openvpn_client.php:700
+#: usr/local/www/vpn_openvpn_client.php:719
+#: usr/local/www/vpn_openvpn_server.php:997
+msgid "Shared Key"
+msgstr "Chave Compartilhada"
+
+#: usr/local/www/vpn_openvpn_client.php:688
+#: usr/local/www/vpn_openvpn_server.php:880
+#: usr/local/www/vpn_openvpn_server.php:953
+#: usr/local/www/vpn_openvpn_client.php:693
+#: usr/local/www/vpn_openvpn_server.php:981
+#: usr/local/www/vpn_openvpn_client.php:711
+#: usr/local/www/vpn_openvpn_client.php:730
+#: usr/local/www/vpn_openvpn_server.php:1008
+msgid "Automatically generate a shared key"
+msgstr "Gerar automaticamente uma chave compartilhada"
+
+#: usr/local/www/vpn_openvpn_client.php:724
+#: usr/local/www/vpn_openvpn_server.php:916
+#: usr/local/www/vpn_openvpn_server.php:989
+#: usr/local/www/vpn_openvpn_client.php:729
+#: usr/local/www/vpn_openvpn_server.php:1017
+#: usr/local/www/vpn_openvpn_client.php:747
+#: usr/local/www/vpn_openvpn_client.php:766
+#: usr/local/www/vpn_openvpn_server.php:1044
+msgid "Hardware Crypto"
+msgstr "Hardware Crypto"
+
+#: usr/local/www/vpn_openvpn_client.php:745
+#: usr/local/www/vpn_openvpn_csc.php:374
+#: usr/local/www/vpn_openvpn_server.php:980
+#: usr/local/www/vpn_openvpn_server.php:1053
+#: usr/local/www/vpn_openvpn_client.php:750
+#: usr/local/www/vpn_openvpn_csc.php:373
+#: usr/local/www/vpn_openvpn_server.php:1081
+#: usr/local/www/vpn_openvpn_client.php:768
+#: usr/local/www/vpn_openvpn_client.php:787
+#: usr/local/www/vpn_openvpn_server.php:1108
+msgid "Tunnel Settings"
+msgstr "Configurações de túnel"
+
+#: usr/local/www/vpn_openvpn_client.php:748
+#: usr/local/www/vpn_openvpn_csc.php:377
+#: usr/local/www/vpn_openvpn_server.php:1450
+#: usr/local/www/vpn_openvpn_server.php:1592
+#: usr/local/www/vpn_openvpn_client.php:753
+#: usr/local/www/vpn_openvpn_csc.php:376
+#: usr/local/www/vpn_openvpn_server.php:1633
+#: usr/local/www/vpn_openvpn_server.php:1685
+msgid "Tunnel Network"
+msgstr "Rede de túneis"
+
+#: usr/local/www/vpn_openvpn_client.php:752
+#: usr/local/www/vpn_openvpn_csc.php:381
+#: usr/local/www/vpn_openvpn_client.php:757
+#: usr/local/www/vpn_openvpn_csc.php:380
+#: usr/local/www/vpn_openvpn_client.php:775
+#: usr/local/www/vpn_openvpn_client.php:794
+msgid "This is the virtual network used for private communications between this client and the server expressed using CIDR (eg. 10.0.8.0/24). The first network address is assumed to be the server address and the second network address will be assigned to the client virtual interface"
+msgstr "Essa é uma rede virtual usada para comunicações privadas entre esse cliente e o servidor expresso usando CIDR (e.g. 10.0.8.0/24). O primeiro endereço é assumido como o do endereço do servidor e, o segundo, o endereço de rede que será atribuído à interface virtual do cliente"
+
+#: usr/local/www/vpn_openvpn_client.php:766
+#: usr/local/www/vpn_openvpn_client.php:771
+msgid "This is a network that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as a CIDR range. If this is a site-to-site VPN, enter here the remote LAN here. You may leave this blank to only communicate with other clients"
+msgstr "Essa é uma rede que será roteada através do túnel para que uma VPN site-to-site possa ser estabelecida sem modificar manualmente as tabelas de roteamento. Expressa como um intervalor CIDR. Se essa é uma VPN site-to-site, informe que a LAN remote. Você deve deixar isso em branco para somente comunicar-se com outros clientes"
+
+#: usr/local/www/vpn_openvpn_client.php:776
+#: usr/local/www/vpn_openvpn_client.php:781
+#: usr/local/www/vpn_openvpn_client.php:827
+#: usr/local/www/vpn_openvpn_client.php:846
+msgid "Limit outgoing bandwidth"
+msgstr "Limitar tamanho de banda de saída"
+
+#: usr/local/www/vpn_openvpn_client.php:780
+#: usr/local/www/vpn_openvpn_client.php:785
+#: usr/local/www/vpn_openvpn_client.php:831
+#: usr/local/www/vpn_openvpn_client.php:850
+msgid "Maximum outgoing bandwidth for this tunnel. Leave empty for no limit. The input value has to be something between 100 bytes/sec and 100 Mbytes/sec (entered as bytes per second)"
+msgstr "Tamanho de banda de saída máximo para esse túnel. Deixe vazio para não ter limite. O valor inserido tem que ser algo entre 100 bytes/seg e 100 Mbytes/seg (informado como bytes por segundo)"
+
+#: usr/local/www/vpn_openvpn_client.php:797
+#: usr/local/www/vpn_openvpn_server.php:1087
+#: usr/local/www/vpn_openvpn_server.php:1229
+#: usr/local/www/vpn_openvpn_client.php:802
+#: usr/local/www/vpn_openvpn_server.php:1271
+#: usr/local/www/vpn_openvpn_client.php:848
+#: usr/local/www/vpn_openvpn_client.php:867
+#: usr/local/www/vpn_openvpn_server.php:1298
+msgid "Compress tunnel packets using the LZO algorithm"
+msgstr "Comprimir pacotes do túnel usando o algorítmo LZO"
+
+#: usr/local/www/vpn_openvpn_client.php:805
+#: usr/local/www/vpn_openvpn_server.php:1095
+#: usr/local/www/vpn_openvpn_server.php:1237
+#: usr/local/www/vpn_openvpn_client.php:810
+#: usr/local/www/vpn_openvpn_server.php:1279
+#: usr/local/www/vpn_openvpn_client.php:856
+#: usr/local/www/vpn_openvpn_client.php:875
+#: usr/local/www/vpn_openvpn_server.php:1306
+msgid "Type-of-Service"
+msgstr "Tipo de Serviço"
+
+#: usr/local/www/vpn_openvpn_client.php:815
+#: usr/local/www/vpn_openvpn_server.php:1105
+#: usr/local/www/vpn_openvpn_server.php:1247
+#: usr/local/www/vpn_openvpn_client.php:820
+#: usr/local/www/vpn_openvpn_server.php:1289
+#: usr/local/www/vpn_openvpn_client.php:866
+#: usr/local/www/vpn_openvpn_client.php:885
+#: usr/local/www/vpn_openvpn_server.php:1316
+msgid "Set the TOS IP header value of tunnel packets to match the encapsulated packet value"
+msgstr "Configurar o valor do cabeçalho IP TOS para que os pacotes do túnel correspondam ao valor do pacote encapsulado"
+
+#: usr/local/www/vpn_openvpn_client.php:826
+#: usr/local/www/vpn_openvpn_server.php:1409
+#: usr/local/www/vpn_openvpn_server.php:1551
+#: usr/local/www/vpn_openvpn_client.php:831
+#: usr/local/www/vpn_openvpn_server.php:1593
+#: usr/local/www/vpn_openvpn_client.php:880
+#: usr/local/www/vpn_openvpn_client.php:899
+#: usr/local/www/vpn_openvpn_server.php:1645
+msgid "Advanced configuration"
+msgstr "Configuração Avançada"
+
+#: usr/local/www/vpn_openvpn_client.php:835
+#: usr/local/www/vpn_openvpn_client.php:840
+#: usr/local/www/vpn_openvpn_client.php:889
+#: usr/local/www/vpn_openvpn_client.php:908
+msgid "Enter any additional options you would like to add to the OpenVPN client configuration here, separated by a semicolon"
+msgstr "Informe quaisquer opções adicionais que você deseja adicionar à configuração do cliente OpenVPN aqui, separado por ponto-e-vírgula"
+
+#: usr/local/www/vpn_openvpn_client.php:836
+#: usr/local/www/vpn_openvpn_client.php:841
+#: usr/local/www/vpn_openvpn_client.php:890
+msgid "EXAMPLE: route 10.0.0.0 255.255.255.0;"
+msgstr "EXEMPLO: route 10.0.0.0 255.255.255.0;"
+
+#: usr/local/www/vpn_openvpn_client.php:891
+#: usr/local/www/vpn_openvpn_client.php:896
+#: usr/local/www/vpn_openvpn_client.php:949
+#: usr/local/www/vpn_openvpn_client.php:968
+msgid "edit client"
+msgstr "editar cliente"
+
+#: usr/local/www/vpn_openvpn_client.php:895
+#: usr/local/www/vpn_openvpn_client.php:900
+#: usr/local/www/vpn_openvpn_client.php:953
+#: usr/local/www/vpn_openvpn_client.php:972
+msgid "delete client"
+msgstr "apagar cliente"
+
+#: usr/local/www/vpn_openvpn_client.php:908
+#: usr/local/www/vpn_openvpn_client.php:913
+#: usr/local/www/vpn_openvpn_client.php:966
+#: usr/local/www/vpn_openvpn_client.php:985
+msgid "add client"
+msgstr "adicionar cliente"
+
+#: usr/local/www/vpn_openvpn_client.php:915
+#: usr/local/www/vpn_openvpn_client.php:920
+#: usr/local/www/vpn_openvpn_client.php:973
+#: usr/local/www/vpn_openvpn_client.php:992
+msgid "Additional OpenVPN clients can be added here."
+msgstr "Clientes OpenVPN adicionais podem ser adicionados aqui."
+
+#: usr/local/www/vpn_openvpn_csc.php:40
+msgid "Client Specific Override"
+msgstr "Substituição Específica de Cliente"
+
+#: usr/local/www/vpn_openvpn_csc.php:67 usr/local/www/vpn_openvpn_csc.php:66
+msgid "Client Specific Override successfully deleted"
+msgstr "Substituição Específica de Cliente apagada com sucesso"
+
+#: usr/local/www/vpn_openvpn_csc.php:131
+#: usr/local/www/vpn_openvpn_server.php:244
+#: usr/local/www/vpn_openvpn_server.php:249
+#: usr/local/www/vpn_openvpn_csc.php:130
+#: usr/local/www/vpn_openvpn_server.php:250
+#: usr/local/www/vpn_openvpn_server.php:271
+msgid "The field 'DNS Server #1' must contain a valid IP address"
+msgstr "O campo 'Servidor DNS #1' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:133
+#: usr/local/www/vpn_openvpn_server.php:246
+#: usr/local/www/vpn_openvpn_server.php:251
+#: usr/local/www/vpn_openvpn_csc.php:132
+#: usr/local/www/vpn_openvpn_server.php:252
+#: usr/local/www/vpn_openvpn_server.php:273
+msgid "The field 'DNS Server #2' must contain a valid IP address"
+msgstr "O campo 'Servidor DNS #2' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:135
+#: usr/local/www/vpn_openvpn_server.php:248
+#: usr/local/www/vpn_openvpn_server.php:253
+#: usr/local/www/vpn_openvpn_csc.php:134
+#: usr/local/www/vpn_openvpn_server.php:254
+#: usr/local/www/vpn_openvpn_server.php:275
+msgid "The field 'DNS Server #3' must contain a valid IP address"
+msgstr "O campo 'Servidor DNS #3' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:137
+#: usr/local/www/vpn_openvpn_server.php:250
+#: usr/local/www/vpn_openvpn_server.php:255
+#: usr/local/www/vpn_openvpn_csc.php:136
+#: usr/local/www/vpn_openvpn_server.php:256
+#: usr/local/www/vpn_openvpn_server.php:277
+msgid "The field 'DNS Server #4' must contain a valid IP address"
+msgstr "O campo 'Servidor DNS #4' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:142
+#: usr/local/www/vpn_openvpn_server.php:255
+#: usr/local/www/vpn_openvpn_server.php:260
+#: usr/local/www/vpn_openvpn_csc.php:141
+#: usr/local/www/vpn_openvpn_server.php:261
+#: usr/local/www/vpn_openvpn_server.php:282
+msgid "The field 'NTP Server #1' must contain a valid IP address"
+msgstr "O campo 'Servidor NTP #1' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:144
+#: usr/local/www/vpn_openvpn_server.php:257
+#: usr/local/www/vpn_openvpn_server.php:262
+#: usr/local/www/vpn_openvpn_csc.php:143
+#: usr/local/www/vpn_openvpn_server.php:263
+#: usr/local/www/vpn_openvpn_server.php:284
+msgid "The field 'NTP Server #2' must contain a valid IP address"
+msgstr "O campo 'Servidor NTP #2' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:146
+#: usr/local/www/vpn_openvpn_server.php:259
+#: usr/local/www/vpn_openvpn_server.php:264
+#: usr/local/www/vpn_openvpn_csc.php:145
+#: usr/local/www/vpn_openvpn_server.php:265
+#: usr/local/www/vpn_openvpn_server.php:286
+msgid "The field 'NTP Server #3' must contain a valid IP address"
+msgstr "O campo 'Servidor NTP #3' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:148
+#: usr/local/www/vpn_openvpn_server.php:261
+#: usr/local/www/vpn_openvpn_server.php:266
+#: usr/local/www/vpn_openvpn_csc.php:147
+#: usr/local/www/vpn_openvpn_server.php:267
+#: usr/local/www/vpn_openvpn_server.php:288
+msgid "The field 'NTP Server #4' must contain a valid IP address"
+msgstr "O campo 'Servidor NTP #4' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:154
+#: usr/local/www/vpn_openvpn_server.php:267
+#: usr/local/www/vpn_openvpn_server.php:272
+#: usr/local/www/vpn_openvpn_csc.php:153
+#: usr/local/www/vpn_openvpn_server.php:273
+#: usr/local/www/vpn_openvpn_server.php:294
+msgid "The field 'WINS Server #1' must contain a valid IP address"
+msgstr "O campo 'Servidor WINS #1' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:156
+#: usr/local/www/vpn_openvpn_server.php:269
+#: usr/local/www/vpn_openvpn_server.php:274
+#: usr/local/www/vpn_openvpn_csc.php:155
+#: usr/local/www/vpn_openvpn_server.php:275
+#: usr/local/www/vpn_openvpn_server.php:296
+msgid "The field 'WINS Server #2' must contain a valid IP address"
+msgstr "O campo 'Servidor WINS #2' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:160
+#: usr/local/www/vpn_openvpn_server.php:273
+#: usr/local/www/vpn_openvpn_server.php:278
+#: usr/local/www/vpn_openvpn_csc.php:159
+#: usr/local/www/vpn_openvpn_server.php:279
+#: usr/local/www/vpn_openvpn_server.php:300
+msgid "The field 'NetBIOS Data Distribution Server #1' must contain a valid IP address"
+msgstr "O campo 'Servidor de Distribuição de Dados do NetBIOS WINS #1' deve conter um endereço IP válido"
+
+#: usr/local/www/vpn_openvpn_csc.php:325 usr/local/www/vpn_openvpn_csc.php:324
+msgid "Disable this override"
+msgstr "Desabilitar essa substituição"
+
+#: usr/local/www/vpn_openvpn_csc.php:330 usr/local/www/vpn_openvpn_csc.php:329
+msgid "Set this option to disable this client-specific override without removing it from the list"
+msgstr "Configure essa opção para desabilitar uma substituição específica de cliente sem removê-la da lista"
+
+#: usr/local/www/vpn_openvpn_csc.php:334 usr/local/www/vpn_openvpn_csc.php:333
+msgid "Common name"
+msgstr "Nome Comum"
+
+#: usr/local/www/vpn_openvpn_csc.php:338 usr/local/www/vpn_openvpn_csc.php:337
+msgid "Enter the client's X.509 common name here"
+msgstr "Informe o nome comum dos X.509 do cliente aqui"
+
+#: usr/local/www/vpn_openvpn_csc.php:350 usr/local/www/vpn_openvpn_csc.php:349
+msgid "Connection blocking"
+msgstr "Bloquei de conexão"
+
+#: usr/local/www/vpn_openvpn_csc.php:360 usr/local/www/vpn_openvpn_csc.php:359
+msgid "Block this client connection based on its common name"
+msgstr "Bloqueie a conexão desse cliente baseado nesse nome comum"
+
+#: usr/local/www/vpn_openvpn_csc.php:365 usr/local/www/vpn_openvpn_csc.php:364
+msgid "Don't use this option to permanently disable a client due to a compromised key or password. Use a CRL (certificate revocation list) instead"
+msgstr "Não use essa opção para desabilitar permanentemente um cliente devido a uma chave ou senha comprometida. An invés disso, use uma CRL (lista de revogação de certificado )"
+
+#: usr/local/www/vpn_openvpn_csc.php:391
+#: usr/local/www/vpn_openvpn_server.php:1011
+#: usr/local/www/vpn_openvpn_server.php:1153
+#: usr/local/www/vpn_openvpn_csc.php:390
+#: usr/local/www/vpn_openvpn_server.php:1181
+#: usr/local/www/vpn_openvpn_server.php:1208
+msgid "Redirect Gateway"
+msgstr "Gateway de redirecionamento"
+
+#: usr/local/www/vpn_openvpn_csc.php:401
+#: usr/local/www/vpn_openvpn_server.php:1021
+#: usr/local/www/vpn_openvpn_server.php:1163
+#: usr/local/www/vpn_openvpn_csc.php:400
+#: usr/local/www/vpn_openvpn_server.php:1191
+#: usr/local/www/vpn_openvpn_server.php:1218
+msgid "Force all client generated traffic through the tunnel"
+msgstr "Force todo o tráfego gerado por clientes através desse túnel"
+
+#: usr/local/www/vpn_openvpn_csc.php:412
+#: usr/local/www/vpn_openvpn_server.php:1155
+#: usr/local/www/vpn_openvpn_server.php:1297
+#: usr/local/www/vpn_openvpn_csc.php:411
+#: usr/local/www/vpn_openvpn_server.php:1339
+#: usr/local/www/vpn_openvpn_server.php:1366
+msgid "Client Settings"
+msgstr "Configurações de Cliente"
+
+#: usr/local/www/vpn_openvpn_csc.php:415 usr/local/www/vpn_openvpn_csc.php:414
+msgid "Server Definitions"
+msgstr "Definições de Servidor"
+
+#: usr/local/www/vpn_openvpn_csc.php:425 usr/local/www/vpn_openvpn_csc.php:424
+msgid "Prevent this client from receiving any server-defined client settings"
+msgstr "Previna que esse cliente receba quaisquer configurações de cliente definidas no servidor"
+
+#: usr/local/www/vpn_openvpn_csc.php:510
+#: usr/local/www/vpn_openvpn_server.php:1271
+#: usr/local/www/vpn_openvpn_server.php:1413
+#: usr/local/www/vpn_openvpn_csc.php:509
+#: usr/local/www/vpn_openvpn_server.php:1455
+#: usr/local/www/vpn_openvpn_server.php:1507
+msgid "NTP Servers"
+msgstr "Servidores NTP"
+
+#: usr/local/www/vpn_openvpn_csc.php:520
+#: usr/local/www/vpn_openvpn_server.php:1281
+#: usr/local/www/vpn_openvpn_server.php:1423
+#: usr/local/www/vpn_openvpn_csc.php:519
+#: usr/local/www/vpn_openvpn_server.php:1465
+#: usr/local/www/vpn_openvpn_server.php:1517
+msgid "Provide a NTP server list to clients"
+msgstr "Fornece uma lista de servidores NTP para clientes"
+
+#: usr/local/www/vpn_openvpn_csc.php:546
+#: usr/local/www/vpn_openvpn_server.php:1307
+#: usr/local/www/vpn_openvpn_server.php:1449
+#: usr/local/www/vpn_openvpn_csc.php:545
+#: usr/local/www/vpn_openvpn_server.php:1491
+#: usr/local/www/vpn_openvpn_server.php:1543
+msgid "NetBIOS Options"
+msgstr "Opções de NetBIOS"
+
+#: usr/local/www/vpn_openvpn_csc.php:556
+#: usr/local/www/vpn_openvpn_server.php:1317
+#: usr/local/www/vpn_openvpn_server.php:1459
+#: usr/local/www/vpn_openvpn_csc.php:555
+#: usr/local/www/vpn_openvpn_server.php:1501
+#: usr/local/www/vpn_openvpn_server.php:1553
+msgid "Enable NetBIOS over TCP/IP"
+msgstr "Habilitar NetBIOS sobre TCP/IP"
+
+#: usr/local/www/vpn_openvpn_csc.php:561
+msgid "If this option is not set, all NetBIOS-over-TCP/IP options (includeing WINS) will be disabled"
+msgstr "Se essa opção não estiver configurada, todas as opções de NetBIOS sobre TCP/IP (incluindo WINS) serão desabilitadas"
+
+#: usr/local/www/vpn_openvpn_csc.php:568
+#: usr/local/www/vpn_openvpn_server.php:1329
+#: usr/local/www/vpn_openvpn_server.php:1471
+#: usr/local/www/vpn_openvpn_csc.php:567
+#: usr/local/www/vpn_openvpn_server.php:1513
+#: usr/local/www/vpn_openvpn_server.php:1565
+msgid "Node Type"
+msgstr "Tipo de Nó"
+
+#: usr/local/www/vpn_openvpn_csc.php:581
+#: usr/local/www/vpn_openvpn_server.php:1342
+#: usr/local/www/vpn_openvpn_server.php:1484
+#: usr/local/www/vpn_openvpn_csc.php:580
+#: usr/local/www/vpn_openvpn_server.php:1526
+#: usr/local/www/vpn_openvpn_server.php:1578
+msgid "Possible options: b-node (broadcasts), p-node (point-to-point name queries to a WINS server), m-node (broadcast then query name server), and h-node (query name server, then broadcast)"
+msgstr "Opções possíveis: b-node (faz broadcasts), p-node (consulta nomes ponto-a-ponto para um servidor WINS), m-node (faz broadcast e então consulta servidor de nome), e h-node (consulta servidor de nome, então faz broadcast)"
+
+#: usr/local/www/vpn_openvpn_csc.php:595
+#: usr/local/www/vpn_openvpn_server.php:1356
+#: usr/local/www/vpn_openvpn_server.php:1498
+#: usr/local/www/vpn_openvpn_csc.php:594
+#: usr/local/www/vpn_openvpn_server.php:1540
+#: usr/local/www/vpn_openvpn_server.php:1592
+msgid "A NetBIOS Scope\tID provides an extended naming service for\tNetBIOS over TCP/IP. The NetBIOS scope ID isolates NetBIOS traffic on a single network to only those nodes with the same NetBIOS scope ID"
+msgstr "Um \tID do escopo do NetBIOS fornece um serviço de nome extendido para \tNetBIOS sobre TCP/IP. O ID do escopo do NetBIOS isola o tráfego de NetBIOS em uma única rede para somente aqueles nós com o mesmo ID do escopo do NetBIOS"
+
+#: usr/local/www/vpn_openvpn_csc.php:648 usr/local/www/vpn_openvpn_csc.php:647
+msgid "Enter any additional options you would like to add for this client specific override, separated by a semicolon"
+msgstr "Informe qualquer opção adicional que desejar para essa substituição específica de cliente, separado (csc) por um ponto-e-vírgula"
+
+#: usr/local/www/vpn_openvpn_csc.php:649
+#: usr/local/www/vpn_openvpn_server.php:1419
+#: usr/local/www/vpn_openvpn_server.php:1561
+#: usr/local/www/vpn_openvpn_csc.php:648
+#: usr/local/www/vpn_openvpn_server.php:1603
+#: usr/local/www/vpn_openvpn_server.php:1655
+msgid "EXAMPLE: push \"route 10.0.0.0 255.255.255.0\""
+msgstr "EXEMPLO: push \"route 10.0.0.0 255.255.255.0\""
+
+#: usr/local/www/vpn_openvpn_csc.php:696 usr/local/www/vpn_openvpn_csc.php:695
+msgid "edit csc"
+msgstr "editar csc"
+
+#: usr/local/www/vpn_openvpn_csc.php:699 usr/local/www/vpn_openvpn_csc.php:698
+msgid "Do you really want to delete this csc?"
+msgstr "Você realmente deseja apagar essa csc?"
+
+#: usr/local/www/vpn_openvpn_csc.php:700 usr/local/www/vpn_openvpn_csc.php:699
+msgid "delete csc"
+msgstr "apagar csc"
+
+#: usr/local/www/vpn_openvpn_csc.php:711 usr/local/www/vpn_openvpn_csc.php:710
+msgid "add csc"
+msgstr "adicionar csc"
+
+#: usr/local/www/vpn_openvpn_csc.php:718 usr/local/www/vpn_openvpn_csc.php:717
+msgid "Additional OpenVPN client specific overrides can be added here."
+msgstr "Substituições específicas de cliente OpenVPN adicionais podem ser adicionadas aqui."
+
+#: usr/local/www/vpn_openvpn_server.php:86
+#: usr/local/www/vpn_openvpn_server.php:87
+msgid "Server successfully deleted"
+msgstr "Servidor apagado com sucesso"
+
+#: usr/local/www/vpn_openvpn_server.php:210
+#: usr/local/www/vpn_openvpn_server.php:215
+#: usr/local/www/vpn_openvpn_server.php:216
+#: usr/local/www/vpn_openvpn_server.php:228
+msgid "You must select a Backend for Authentication if the server mode requires User Auth."
+msgstr "Você deve selecionar um Backend para Autenticação se o modo do servidor requerer Autenticação de Usuário."
+
+#: usr/local/www/vpn_openvpn_server.php:277
+#: usr/local/www/vpn_openvpn_server.php:282
+#: usr/local/www/vpn_openvpn_server.php:283
+#: usr/local/www/vpn_openvpn_server.php:304
+msgid "The field 'Concurrent connections' must be numeric."
+msgstr "O campo 'Conexões concorrentes' deve ser numérico."
+
+#: usr/local/www/vpn_openvpn_server.php:290
+#: usr/local/www/vpn_openvpn_server.php:296
+#: usr/local/www/vpn_openvpn_server.php:297
+#: usr/local/www/vpn_openvpn_server.php:318
+msgid "Tunnel network"
+msgstr "Rede de túneis"
+
+#: usr/local/www/vpn_openvpn_server.php:615
+#: usr/local/www/vpn_openvpn_server.php:688
+#: usr/local/www/vpn_openvpn_server.php:706
+#: usr/local/www/vpn_openvpn_server.php:732
+msgid "Disable this server"
+msgstr "Desabilitar esse servidor"
+
+#: usr/local/www/vpn_openvpn_server.php:620
+#: usr/local/www/vpn_openvpn_server.php:693
+#: usr/local/www/vpn_openvpn_server.php:711
+#: usr/local/www/vpn_openvpn_server.php:737
+msgid "Set this option to disable this server without removing it from the list"
+msgstr "Configure essa opção to desabilitar o servidor sem removê-lo dessa lista"
+
+#: usr/local/www/vpn_openvpn_server.php:639
+#: usr/local/www/vpn_openvpn_server.php:712
+#: usr/local/www/vpn_openvpn_server.php:730
+#: usr/local/www/vpn_openvpn_server.php:756
+msgid "Backend for authentication"
+msgstr "Backend para autenticação"
+
+#: usr/local/www/vpn_openvpn_server.php:671
+#: usr/local/www/vpn_openvpn_server.php:744
+#: usr/local/www/vpn_openvpn_server.php:762
+#: usr/local/www/vpn_openvpn_server.php:788
+msgid "Device Mode"
+msgstr "Modo do Dispositivo"
+
+#: usr/local/www/vpn_openvpn_server.php:797
+#: usr/local/www/vpn_openvpn_server.php:870
+#: usr/local/www/vpn_openvpn_server.php:898
+#: usr/local/www/vpn_openvpn_server.php:925
+msgid "Peer Certificate Revocation List"
+msgstr "Lista de Certificados de Revogação de Peer"
+
+#: usr/local/www/vpn_openvpn_server.php:822
+#: usr/local/www/vpn_openvpn_server.php:895
+#: usr/local/www/vpn_openvpn_server.php:923
+#: usr/local/www/vpn_openvpn_server.php:950
+msgid "Server Certificate"
+msgstr "Certificado de Servidor"
+
+#: usr/local/www/vpn_openvpn_server.php:851
+#: usr/local/www/vpn_openvpn_server.php:924
+#: usr/local/www/vpn_openvpn_server.php:952
+#: usr/local/www/vpn_openvpn_server.php:979
+msgid "DH Parameters Length"
+msgstr "Tamanho de Parâmetros de DH"
+
+#: usr/local/www/vpn_openvpn_server.php:934
+#: usr/local/www/vpn_openvpn_server.php:1007
+#: usr/local/www/vpn_openvpn_server.php:1035
+#: usr/local/www/vpn_openvpn_server.php:1062
+msgid "Certificate Depth"
+msgstr "Profundidade do Certificado"
+
+#: usr/local/www/vpn_openvpn_server.php:952
+#: usr/local/www/vpn_openvpn_server.php:1025
+#: usr/local/www/vpn_openvpn_server.php:1053
+#: usr/local/www/vpn_openvpn_server.php:1080
+msgid "When a certificate-based client logs in, do not accept certificates below this depth. Useful for denying certificates made with intermediate CAs generated from the same CA as the server."
+msgstr "Quando um cliente faz login com base em certificados, não aceitar certificados com profundidade abaixo desta. Útil para negar certificados emitidos por CAs intermadiários gerados a partir do mesmo CA que o servidor."
+
+#: usr/local/www/vpn_openvpn_server.php:959
+#: usr/local/www/vpn_openvpn_server.php:1032
+#: usr/local/www/vpn_openvpn_server.php:1060
+#: usr/local/www/vpn_openvpn_server.php:1087
+msgid "Strict User/CN Matching"
+msgstr "Correspondência de Usuário estrito/CN"
+
+#: usr/local/www/vpn_openvpn_server.php:969
+#: usr/local/www/vpn_openvpn_server.php:1042
+#: usr/local/www/vpn_openvpn_server.php:1070
+#: usr/local/www/vpn_openvpn_server.php:1097
+msgid "When authenticating users, enforce a match between the common name of the client certificate and the username given at login."
+msgstr "Durante a autenticação de usuários, reforce uma correspondência entre um nome comum do certificado do cliente e um dado nome de usuário no login."
+
+#: usr/local/www/vpn_openvpn_server.php:983
+#: usr/local/www/vpn_openvpn_server.php:1056
+#: usr/local/www/vpn_openvpn_server.php:1084
+#: usr/local/www/vpn_openvpn_client.php:771
+#: usr/local/www/vpn_openvpn_client.php:790
+#: usr/local/www/vpn_openvpn_server.php:1111
+msgid "IPv4 Tunnel Network"
+msgstr "Tunel da Rede IPv4"
+
+#: usr/local/www/vpn_openvpn_server.php:987
+#: usr/local/www/vpn_openvpn_server.php:1060
+#: usr/local/www/vpn_openvpn_server.php:1088
+#: usr/local/www/vpn_openvpn_server.php:1115
+msgid "This is the IPv4 virtual network used for private communications between this server and client hosts expressed using CIDR (eg. 10.0.8.0/24). The first network address will be assigned to the\tserver virtual interface. The remaining network addresses can optionally be assigned to connecting clients. (see Address Pool)"
+msgstr "Essa é a rede virtual IPv4 usada para comunicações privadas entre esse servidor e os hosts clientes expressados usando CIDR (e.g. 10.0.8.0/24). O primeiro endereço de rede será atribuído à \t interface virtual do servidor. Os endereços de rede remanescentes podem opcionalmente ser atribuídos a clientes em conexão. (veja Pool de Endereço)"
+
+#: usr/local/www/vpn_openvpn_server.php:997
+#: usr/local/www/vpn_openvpn_server.php:1070
+#: usr/local/www/vpn_openvpn_server.php:1098
+#: usr/local/www/vpn_openvpn_client.php:785
+#: usr/local/www/vpn_openvpn_client.php:804
+#: usr/local/www/vpn_openvpn_server.php:1125
+msgid "IPv6 Tunnel Network"
+msgstr "Tunel da Rede IPv6"
+
+#: usr/local/www/vpn_openvpn_server.php:1001
+#: usr/local/www/vpn_openvpn_server.php:1074
+msgid "This is the IPv6 virtual network used for private communications between this server and client hosts expressed using CIDR (eg. fe80::/64). The first network address will be assigned to the\tserver virtual interface. The remaining network addresses can optionally be assigned to connecting clients. (see Address Pool)"
+msgstr "Essa é a rede virtual IPv6 usada para comunicações privadas entre esse servidor e os hosts clientes expressados usando CIDR (e.g. fe80::/64). O primeiro endereço de rede será atribuído à \tinterface virtual do servidor. Os endereços de rede remanescentes podem opcionalmente ser atribuídos a clientes em conexão. (veja Pool de Endereço)"
+
+#: usr/local/www/vpn_openvpn_server.php:1029
+#: usr/local/www/vpn_openvpn_server.php:1171
+#: usr/local/www/vpn_openvpn_server.php:1199
+msgid "IPv4 Local Network"
+msgstr "Rede Local IPv4"
+
+#: usr/local/www/vpn_openvpn_server.php:1033
+#: usr/local/www/vpn_openvpn_server.php:1175
+#: usr/local/www/vpn_openvpn_server.php:1203
+msgid "This is the network that will be accessible from the remote endpoint. Expressed as a CIDR range. You may leave this blank if you don't want to add a route to the local network through this tunnel on the remote machine. This is generally set to your LAN network"
+msgstr "Essa é a rede que será acessível do endpoint remoto. Expressado como um intervalo CIDR. Você deve deixar isso em branco se não desejar adicionar uma rota à rede local através desse túnel na máquina remota. Isso é geralmente configurado na sua rede LAN"
+
+#: usr/local/www/vpn_openvpn_server.php:1042
+#: usr/local/www/vpn_openvpn_server.php:1184
+#: usr/local/www/vpn_openvpn_server.php:1212
+msgid "IPv6 Local Network"
+msgstr "Rede local IPv6"
+
+#: usr/local/www/vpn_openvpn_server.php:1046
+#: usr/local/www/vpn_openvpn_server.php:1188
+#: usr/local/www/vpn_openvpn_server.php:1216
+msgid "This is the IPv6 network that will be accessible from the remote endpoint. Expressed as a CIDR range. You may leave this blank if you don't want to add a route to the local network through this tunnel on the remote machine. This is generally set to your LAN network"
+msgstr "Essa é a rede IPv6 que será acessível do endpoint remoto. Expressado como um intervalo CIDR. Você deve deixar isso em branco se não desejar adicionar uma rota à rede local através desse túnel na máquina remota. Isso é geralmente configurado na sua rede LAN"
+
+#: usr/local/www/vpn_openvpn_server.php:1059
+#: usr/local/www/vpn_openvpn_server.php:1201
+msgid "This is a network that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as a CIDR range. If this is a site-to-site VPN, enter here the remote LAN here. You may leave this blank if you don't want a site-to-site VPN"
+msgstr "Essa é uma rede que será roteada através do túnel, de forma que uma VPN site-to-site possa ser estabelecida sem modificar manualmente as tabelas de roteamento. Expressado como um intervalo CIDR. Se essa é uma VPN site-to-site, informe aqui a LAN remota. Você pode deixar isso em branco se não desejar uma VPN site-to-site"
+
+#: usr/local/www/vpn_openvpn_server.php:1069
+#: usr/local/www/vpn_openvpn_server.php:1211
+#: usr/local/www/vpn_openvpn_server.php:1253
+#: usr/local/www/vpn_openvpn_server.php:1280
+msgid "Concurrent connections"
+msgstr "Conexões concorrentes"
+
+#: usr/local/www/vpn_openvpn_server.php:1073
+#: usr/local/www/vpn_openvpn_server.php:1215
+#: usr/local/www/vpn_openvpn_server.php:1257
+#: usr/local/www/vpn_openvpn_server.php:1284
+msgid "Specify the maximum number of clients allowed to concurrently connect to this server"
+msgstr "Especifique o número máximo de clientes que tem permissão de conectar-se ao mesmo tempo nesse servidor"
+
+#: usr/local/www/vpn_openvpn_server.php:1113
+#: usr/local/www/vpn_openvpn_server.php:1255
+#: usr/local/www/vpn_openvpn_server.php:1297
+#: usr/local/www/vpn_openvpn_server.php:1324
+msgid "Inter-client communication"
+msgstr "Comunicação inter-clientes"
+
+#: usr/local/www/vpn_openvpn_server.php:1123
+#: usr/local/www/vpn_openvpn_server.php:1265
+#: usr/local/www/vpn_openvpn_server.php:1307
+#: usr/local/www/vpn_openvpn_server.php:1334
+msgid "Allow communication between clients connected to this server"
+msgstr "Permite comunicação entre clientes conectaados a esse servidor"
+
+#: usr/local/www/vpn_openvpn_server.php:1131
+#: usr/local/www/vpn_openvpn_server.php:1273
+#: usr/local/www/vpn_openvpn_server.php:1315
+#: usr/local/www/vpn_openvpn_server.php:1342
+msgid "Duplicate Connections"
+msgstr "Conexões duplicadas"
+
+#: usr/local/www/vpn_openvpn_server.php:1141
+#: usr/local/www/vpn_openvpn_server.php:1283
+#: usr/local/www/vpn_openvpn_server.php:1325
+#: usr/local/www/vpn_openvpn_server.php:1352
+msgid "Allow multiple concurrent connections from clients using the same Common Name.<br/>NOTE: This is not generally recommended, but may be needed for some scenarios."
+msgstr "Habilite múltiplas conexões concorrentes para clientes usando um Nome Comum.<br/>NOTA: Isto geralmente não é recomendado, mas pode ser necessário em alguns cenários."
+
+#: usr/local/www/vpn_openvpn_server.php:1158
+#: usr/local/www/vpn_openvpn_server.php:1300
+#: usr/local/www/vpn_openvpn_server.php:1342
+#: usr/local/www/vpn_openvpn_server.php:1369
+msgid "Dynamic IP"
+msgstr "IP Dinâmico"
+
+#: usr/local/www/vpn_openvpn_server.php:1168
+#: usr/local/www/vpn_openvpn_server.php:1310
+#: usr/local/www/vpn_openvpn_server.php:1352
+#: usr/local/www/vpn_openvpn_server.php:1379
+msgid "Allow connected clients to retain their connections if their IP address changes"
+msgstr "Permite clientes conectados a reter suas conexões se seus endereços IP mudarem"
+
+#: usr/local/www/vpn_openvpn_server.php:1176
+#: usr/local/www/vpn_openvpn_server.php:1318
+#: usr/local/www/vpn_openvpn_server.php:1360
+#: usr/local/www/vpn_openvpn_server.php:1387
+msgid "Address Pool"
+msgstr "Pool de endereços"
+
+#: usr/local/www/vpn_openvpn_server.php:1186
+#: usr/local/www/vpn_openvpn_server.php:1328
+#: usr/local/www/vpn_openvpn_server.php:1370
+#: usr/local/www/vpn_openvpn_server.php:1397
+msgid "Provide a virtual adapter IP address to clients (see Tunnel Network)"
+msgstr "Fornece um endereço IP adaptador virtual para clientes (veja Rede de Túneis)"
+
+#: usr/local/www/vpn_openvpn_server.php:1322
+#: usr/local/www/vpn_openvpn_server.php:1464
+#: usr/local/www/vpn_openvpn_csc.php:560
+#: usr/local/www/vpn_openvpn_server.php:1506
+#: usr/local/www/vpn_openvpn_server.php:1558
+msgid "If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) will be disabled"
+msgstr "Se essa opção não estiver configurada, todas as opções de NetBIOS sobre TCP/IP (incluindo WINS) serão desabilitadas"
+
+#: usr/local/www/vpn_openvpn_server.php:1352
+#: usr/local/www/vpn_openvpn_server.php:1494
+#: usr/local/www/vpn_openvpn_server.php:1536
+#: usr/local/www/vpn_openvpn_server.php:1588
+msgid "Scope ID"
+msgstr "ID de Escopo"
+
+#: usr/local/www/vpn_openvpn_server.php:1418
+#: usr/local/www/vpn_openvpn_server.php:1560
+#: usr/local/www/vpn_openvpn_server.php:1602
+#: usr/local/www/vpn_openvpn_server.php:1654
+msgid "Enter any additional options you would like to add to the OpenVPN server configuration here, separated by a semicolon"
+msgstr "Informe quaisquer opções adicionais que desejar às configurações do servidor OpenVPN aqui, separados por ponto-e-vírgula"
+
+#: usr/local/www/vpn_openvpn_server.php:1449
+#: usr/local/www/vpn_openvpn_server.php:1591
+#: usr/local/www/vpn_openvpn_server.php:1632
+#: usr/local/www/vpn_openvpn_server.php:1684
+msgid "Protocol / Port"
+msgstr "Protocolo / Porta"
+
+#: usr/local/www/vpn_openvpn_server.php:1482
+#: usr/local/www/vpn_openvpn_server.php:1624
+#: usr/local/www/vpn_openvpn_server.php:1665
+#: usr/local/www/vpn_openvpn_server.php:1717
+msgid "Do you really want to delete this server?"
+msgstr "Você realmente deseja apagar esse servidor?"
+
+#: usr/local/www/vpn_openvpn_server.php:1503
+#: usr/local/www/vpn_openvpn_server.php:1645
+#: usr/local/www/vpn_openvpn_server.php:1686
+#: usr/local/www/vpn_openvpn_server.php:1738
+msgid "Additional OpenVPN servers can be added here."
+msgstr "Servidores OpenVPN adicionais podem ser adicionados aqui."
+
+#: usr/local/www/vpn_pppoe_edit.php:136
+msgid "The specified server address is equal to an interface ip address."
+msgstr "O endereço do servidor especificado é igual a um endereço ip de interface."
+
+#: usr/local/www/vpn_pppoe_edit.php:141
+#, php-format
+msgid "No password specified for username %s"
+msgstr "Nenhuma senha especificada para o usuário %s"
+
+#: usr/local/www/vpn_pppoe_edit.php:143
+#, php-format
+msgid "Incorrect ip address specified for username %s"
+msgstr "Endereço IP especificado incorreto para o usuário %s"
+
+#: usr/local/www/vpn_pppoe_edit.php:355 usr/local/www/vpn_pppoe_edit.php:356
+#: usr/local/www/vpn_pppoe_edit.php:359
+msgid "PPPoE server configuration"
+msgstr "Configuração do servidor PPPoE"
+
+#: usr/local/www/vpn_pppoe_edit.php:368 usr/local/www/vpn_pppoe_edit.php:369
+#: usr/local/www/vpn_pppoe_edit.php:372
+msgid "Enable PPPoE server"
+msgstr "Habilitar servidor PPPoE"
+
+#: usr/local/www/vpn_pppoe_edit.php:403 usr/local/www/vpn_pppoe_edit.php:404
+#: usr/local/www/vpn_pppoe_edit.php:407
+msgid "Hint"
+msgstr "Dica"
+
+#: usr/local/www/vpn_pppoe_edit.php:407 usr/local/www/vpn_pppoe_edit.php:408
+#: usr/local/www/vpn_pppoe_edit.php:411
+msgid "No. PPPoE users"
+msgstr "No. usuários PPPoE"
+
+#: usr/local/www/vpn_pppoe_edit.php:420 usr/local/www/vpn_pppoe_edit.php:421
+#: usr/local/www/vpn_pppoe_edit.php:424
+msgid "Hint: 10 is ten PPPoE clients"
+msgstr "Dica: 10 são dez clientes PPPoE"
+
+#: usr/local/www/vpn_pppoe_edit.php:428 usr/local/www/vpn_pppoe_edit.php:429
+#: usr/local/www/vpn_pppoe_edit.php:432
+msgid "Enter the IP address the PPPoE server should give to clients for use as their \"gateway\""
+msgstr "Digite o endereço IP do servidor PPPoE deve dar aos clientes para usarem como \"gateway\""
+
+#: usr/local/www/vpn_pppoe_edit.php:440 usr/local/www/vpn_pppoe_edit.php:441
+#: usr/local/www/vpn_pppoe_edit.php:444
+msgid "Specify the starting address for the client IP address subnet"
+msgstr "Especifique os endereços de início para a subrede do endereço IP do cliente"
+
+#: usr/local/www/vpn_pppoe_edit.php:457 usr/local/www/vpn_pppoe_edit.php:458
+#: usr/local/www/vpn_pppoe_edit.php:461
+msgid "If entered they will be given to all PPPoE clients, else LAN DNS and one WAN DNS will go to all clients"
+msgstr "Se informados, eles serão dados a todos os clientes PPPoE, senão, DNS de LAN e um DNS de WAN irão para todos os clientes"
+
+#: usr/local/www/vpn_pppoe_edit.php:474 usr/local/www/vpn_pppoe_edit.php:475
+#: usr/local/www/vpn_pppoe_edit.php:478
+msgid "Use Backup RADIUS Server"
+msgstr "Usar servidor RADIUS de Backup"
+
+#: usr/local/www/vpn_pppoe_edit.php:475 usr/local/www/vpn_pppoe_edit.php:476
+#: usr/local/www/vpn_pppoe_edit.php:479
+msgid "When set, if primary server fails all requests will be sent via backup server"
+msgstr "Quando configurado, se o servidor primário falhar, todas as requisições serão enviadas através do servidor de backup"
+
+#: usr/local/www/vpn_pppoe_edit.php:478 usr/local/www/vpn_pppoe_edit.php:479
+#: usr/local/www/vpn_pppoe_edit.php:482
+msgid "NAS IP Address"
+msgstr "Endereço IP do NAS"
+
+#: usr/local/www/vpn_pppoe_edit.php:481 usr/local/www/vpn_pppoe_edit.php:482
+#: usr/local/www/vpn_pppoe_edit.php:485
+msgid "RADIUS server NAS IP Address"
+msgstr "Endereço IP NAS do servidor RADIUS"
+
+#: usr/local/www/vpn_pppoe_edit.php:488 usr/local/www/vpn_pppoe_edit.php:489
+#: usr/local/www/vpn_pppoe_edit.php:492
+msgid "RADIUS accounting update period in seconds"
+msgstr "Período de atualização de accounting do RADIUS em segundos"
+
+#: usr/local/www/vpn_pppoe_edit.php:495 usr/local/www/vpn_pppoe_edit.php:496
+#: usr/local/www/vpn_pppoe_edit.php:499
+msgid "Issue IP Addresses via RADIUS server"
+msgstr "Emitir Endereços IP através do servidor RADIUS"
+
+#: usr/local/www/vpn_pppoe_edit.php:498 usr/local/www/vpn_pppoe_edit.php:499
+#: usr/local/www/vpn_pppoe_edit.php:502
+msgid "RADIUS server Primary"
+msgstr "Servidor RADIUS Primário"
+
+#: usr/local/www/vpn_pppoe_edit.php:503 usr/local/www/vpn_pppoe_edit.php:504
+#: usr/local/www/vpn_pppoe_edit.php:507
+msgid "Enter the IP address, authentication port and accounting port (optional) of the RADIUS server."
+msgstr "Informe o endereço IP, porta de autenticação e porta de accounting (opcional) do servidor RADIUS."
+
+#: usr/local/www/vpn_pppoe_edit.php:504 usr/local/www/vpn_pppoe_edit.php:520
+#: usr/local/www/vpn_pppoe_edit.php:505 usr/local/www/vpn_pppoe_edit.php:521
+#: usr/local/www/vpn_pppoe_edit.php:508 usr/local/www/vpn_pppoe_edit.php:524
+msgid "standard port 1812 and 1813 accounting"
+msgstr "portas padrão 1812 e 1813 de accounting"
+
+#: usr/local/www/vpn_pppoe_edit.php:507 usr/local/www/vpn_pppoe_edit.php:508
+#: usr/local/www/vpn_pppoe_edit.php:511
+msgid "RADIUS primary shared secret"
+msgstr "Shared secred primário do RADIUS"
+
+#: usr/local/www/vpn_pppoe_edit.php:514 usr/local/www/vpn_pppoe_edit.php:515
+#: usr/local/www/vpn_pppoe_edit.php:518
+msgid "RADIUS server Secondary"
+msgstr "Servidor RADIUS Secundário"
+
+#: usr/local/www/vpn_pppoe_edit.php:519 usr/local/www/vpn_pppoe_edit.php:520
+#: usr/local/www/vpn_pppoe_edit.php:523
+msgid "Enter the IP address, authentication port and accounting port (optional) of the backup RADIUS server."
+msgstr "Informe o endereço IP, porta de autenticação e porta de accounting (opcional) do servidor RADIUS de backup."
+
+#: usr/local/www/vpn_pppoe_edit.php:523 usr/local/www/vpn_pppoe_edit.php:524
+#: usr/local/www/vpn_pppoe_edit.php:527
+msgid "RADIUS secondary shared secret"
+msgstr "Segreado compartilhado secundário do RADIUS"
+
+#: usr/local/www/vpn_pppoe_edit.php:531 usr/local/www/vpn_pppoe_edit.php:532
+#: usr/local/www/vpn_pppoe_edit.php:535
+msgid "User (s)"
+msgstr "Usuário (s)"
+
+#: usr/local/www/vpn_pppoe_edit.php:596 usr/local/www/vpn_pppoe_edit.php:597
+#: usr/local/www/vpn_pppoe_edit.php:600
+msgid "don't forget to add a firewall rule to permit traffic from PPPoE clients"
+msgstr "não esqueça de adicionar uma regra de firewall para permitir tráfego de clientes PPPoE"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:37
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:37
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:37
+msgid "You need to specify the number of connections."
+msgstr "Você precisa especificar o número de conexões."
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:42
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:42
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:43
+msgid "The number of connections should be greater than 1."
+msgstr "O número de conexões deve ser maior que 1."
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:65
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:63
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:64
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:71
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:63
+msgid "You have less interfaces than number of connections!"
+msgstr "Você não tem interfaces suficientes para o número de conexões desejado!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:445
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:518
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:459
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:551
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:489
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:586
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:293
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:372
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:588
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:443
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:516
+msgid "Address must be a valid IP address or Firewall Alias. Please correct this value to continue."
+msgstr "Endereço deve ser um IP válido ou alias do Firewall. Por favor defina o valor correto para continuar."
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:505
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:536
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:539
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:568
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:574
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:601
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:358
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:392
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:576
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:603
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:503
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:534
+msgid "Only percentage bandwidth specification is allowed."
+msgstr "Somente a especificação percentual de largura de banda é permitido."
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:695
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1044
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:722
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1106
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:756
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1154
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:542
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:930
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:758
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1156
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:693
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1042
+msgid "Custom Bandwidths are greater than 30%. Please lower them for the wizard to continue."
+msgstr "Largura da banda customizáveis são maiores que 30%. Favor reduzi-la para continuar com o assistente."
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1346
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1408
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1462
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1205
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1464
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1344
+msgid "Penalty Box"
+msgstr "Penalty Box"
+
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1366
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1427
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1482
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1225
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1484
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1364
+msgid "VOIP Adapter"
+msgstr "Adaptador VOIP"
+
+#: usr/local/www/wizards/openvpn_wizard.inc:602
+#: usr/local/www/wizards/openvpn_wizard.inc:618
+#: usr/local/www/wizards/openvpn_wizard.inc:619
+#, php-format
+msgid "OpenVPN %s wizard"
+msgstr "OpenVPN %s Assistente"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:268
+msgid "You cannot specify bandwidth smaller than 1!"
+msgstr "Você não pode especificar uma largura de banda menor que 1!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:278
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:288
+msgid "You cannot select the same interface for local and outside."
+msgstr "Você não pode selecionar a mesma interface para local e remoto."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:276
+msgid "You cannot specify 0 bandwidth!"
+msgstr "Você não pode especificar largura de banda 0!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:297
+msgid "You cannot select the same interface twice on local interfaces."
+msgstr "Você não pode selecionar a mesma interface duas vezes em interfaces locais."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:37
+msgid "You need to specify the number of local interfaces connected."
+msgstr "Você precisa especificar um número de interfaces locais conectadas."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:41
+msgid "The number of local connection needs to be greater than 1."
+msgstr "O número de conexões locais deve ser maior que 1."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:240
+msgid "Upload bandwidth of connection is not valid."
+msgstr "A largura de banda da conexão para upload não é válida."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:245
+msgid "Download bandwidth of connection is not valid."
+msgstr "A largura de banda da conexão para download não é válida."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:252
+msgid "You cannot specify bandwidth less than 1!"
+msgstr "Você não pode especificar largura de banda menor que 1!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:257
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:262
+msgid "We do not support Bandwidths smaller than 128Kbit/s for CBQ scheduler."
+msgstr "Não são recomendadas larguras de banda menores que 128Kbit/s para o organizador CBQ."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:300
+msgid "Upload or download bandwidth is not valid."
+msgstr "A largura de banda para download ou upload não é válida."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:317
+#, php-format
+msgid "You cannot set the VoIP upload bandwidth on WAN connection higher than 80% of the connection."
+msgstr "Você não pode definir a largura de banda para upload VoIP numa conexão WAN maior que 80% da conexão."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:324
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:334
+#, php-format
+msgid "You cannot set the VoIP download bandwidth on connection higher than 80% of the connection."
+msgstr "Você não pode definir a largura de banda do download VoIP numa conexão maior que 80% da conexão"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:162
+#: usr/local/www/widgets/widgets/system_information.widget.php:153
+#: usr/local/www/widgets/widgets/system_information.widget.php:159
+#: usr/local/www/widgets/widgets/system_information.widget.php:160
+#: usr/local/www/widgets/widgets/system_information.widget.php:158
+#: usr/local/www/widgets/widgets/system_information.widget.php:164
+msgid "Current date/time"
+msgstr "Data/hora atuais"
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:41
+msgid "Computer / Device"
+msgstr "Computador / Dispositivo"
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:67
+msgid "Wake Up"
+msgstr "Acordar"
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:72
+msgid "No saved WoL addresses"
+msgstr "Endereços WoL não salvos"
+
+#: usr/local/www/firewall_nat_npt.php:105
+msgid "External Prefix"
+msgstr "Prefixo Externo"
+
+#: usr/local/www/firewall_nat_npt.php:106
+msgid "Internal prefix"
+msgstr "Prefixo interno"
+
+#: usr/local/www/firewall_nat_npt_edit.php:106
+msgid "Source prefix"
+msgstr "Prefixo de origem"
+
+#: usr/local/www/firewall_nat_npt_edit.php:108
+msgid "Destination prefix"
+msgstr "Prefixo de destino"
+
+#: usr/local/www/firewall_nat_npt_edit.php:156
+#: usr/local/www/firewall_nat_npt_edit.php:161
+#: usr/local/www/firewall_nat_npt_edit.php:160
+#: usr/local/www/firewall_nat_npt_edit.php:158
+msgid "Edit NAT NPt entry"
+msgstr "Editar entrada NAT NPt"
+
+#: usr/local/www/firewall_nat_npt_edit.php:206
+#: usr/local/www/firewall_nat_npt_edit.php:211
+#: usr/local/www/firewall_nat_npt_edit.php:210
+#: usr/local/www/firewall_nat_npt_edit.php:209
+msgid "Internal IPv6 Prefix"
+msgstr "Prefixo IPv6 interno"
+
+#: usr/local/www/firewall_nat_npt_edit.php:228
+#: usr/local/www/firewall_nat_npt_edit.php:233
+#: usr/local/www/firewall_nat_npt_edit.php:232
+#: usr/local/www/firewall_nat_npt_edit.php:231
+msgid ""
+"Enter the internal (LAN) ULA IPv6 Prefix for the Network Prefix translation. The prefix size specified for the internal IPv6 prefix will be applied to the \n"
+"external prefix."
+msgstr "Digite o prefixo interno (LAN) ULA IPv6 para a tradução prefixo de rede. O tamanho do prefixo especificado para o prefixo IPv6 interno será aplicado ao prefixo externo."
+
+#: usr/local/www/firewall_nat_npt_edit.php:234
+#: usr/local/www/firewall_nat_npt_edit.php:239
+#: usr/local/www/firewall_nat_npt_edit.php:238
+#: usr/local/www/firewall_nat_npt_edit.php:237
+msgid "Destination IPv6 Prefix"
+msgstr "Prefixo IPv6 de destino"
+
+#: usr/local/www/firewall_nat_npt_edit.php:258
+#: usr/local/www/firewall_nat_npt_edit.php:263
+#: usr/local/www/firewall_nat_npt_edit.php:262
+#: usr/local/www/firewall_nat_npt_edit.php:261
+msgid "Enter the Global Unicast routable IPv6 prefix here"
+msgstr "Digite o prefixo roteável IPv6 Global Unicast aqui"
+
+#: usr/local/www/services_dhcpv6.php:74
+#: usr/local/www/services_router_advertisements.php:74
+msgid "The DHCPv6 Server can only be enabled on interfaces configured with static IP addresses"
+msgstr "O servidor DHCPv6 pode somente ser habilitado em interfaces configuradas com endereços IP estáticos"
+
+#: usr/local/www/services_dhcpv6.php:184 usr/local/www/services_dhcpv6.php:196
+#: usr/local/www/services_dhcpv6.php:181 usr/local/www/services_dhcpv6.php:175
+msgid "A valid prefix range must be specified."
+msgstr "Um intervalo válido deve ser especificado."
+
+#: usr/local/www/services_dhcpv6.php:190 usr/local/www/services_dhcpv6.php:202
+#: usr/local/www/services_dhcpv6.php:187 usr/local/www/services_dhcpv6.php:181
+msgid "A valid IPv6 address must be specified for the gateway."
+msgstr "Um endereço IPv6 válido deve ser especificado para o gateway."
+
+#: usr/local/www/services_dhcpv6.php:192 usr/local/www/services_dhcpv6.php:204
+#: usr/local/www/services_router_advertisements.php:154
+#: usr/local/www/services_dhcpv6.php:189 usr/local/www/services_dhcpv6.php:183
+#: usr/local/www/services_router_advertisements.php:149
+msgid "A valid IPv6 address must be specified for the primary/secondary DNS servers."
+msgstr "Um endereço IPv6 válido deve ser especificado para os servidores DNS primário/secundário."
+
+#: usr/local/www/services_dhcpv6.php:201 usr/local/www/services_dhcpv6.php:223
+#: usr/local/www/services_dhcpv6.php:208 usr/local/www/services_dhcpv6.php:202
+msgid "A valid IPv6 address must be specified for the primary/secondary NTP servers."
+msgstr "Um endereço IPv6 válido deve ser especificado pelos servidores NTP primário/secundário."
+
+#: usr/local/www/services_dhcpv6.php:205 usr/local/www/services_dhcpv6.php:227
+#: usr/local/www/services_dhcpv6.php:212 usr/local/www/services_dhcpv6.php:206
+msgid "A valid IPv6 address or hostname must be specified for the TFTP server."
+msgstr "Um endereço IPv6 válido ou nome de host deve ser especificado para o servidor TFTP."
+
+#: usr/local/www/services_dhcpv6.php:207 usr/local/www/services_dhcpv6.php:229
+#: usr/local/www/services_dhcpv6.php:214 usr/local/www/services_dhcpv6.php:208
+msgid "A valid IPv6 address must be specified for the network boot server."
+msgstr "Um endereço IPv6 válido deve ser especificado para o servidor de boot da rede."
+
+#: usr/local/www/services_dhcpv6.php:214 usr/local/www/services_dhcpv6.php:236
+#: usr/local/www/services_dhcpv6.php:221 usr/local/www/services_dhcpv6.php:215
+#, php-format
+msgid "The subnet range cannot overlap with virtual IPv6 address %s."
+msgstr "O intervalo de subrede não pode sobrepor o endereço IPv6 virtual %s."
+
+#: usr/local/www/services_dhcpv6.php:359 usr/local/www/services_dhcpv6.php:386
+#: usr/local/www/services_dhcpv6.php:367 usr/local/www/services_dhcpv6.php:362
+msgid "DHCPv6 server"
+msgstr "Servidor DHCPv6"
+
+#: usr/local/www/services_dhcpv6.php:497 usr/local/www/services_dhcpv6.php:524
+#: usr/local/www/services_router_advertisements.php:261
+#: usr/local/www/services_router_advertisements.php:270
+#: usr/local/www/services_dhcpv6.php:503 usr/local/www/services_dhcpv6.php:514
+#: usr/local/www/services_router_advertisements.php:256
+#: usr/local/www/services_router_advertisements.php:265
+msgid "Router Advertisements"
+msgstr "Router advertisements"
+
+#: usr/local/www/services_dhcpv6.php:504
+#, php-format
+msgid "Select the Operating Mode for the router advertisement Daemon. Use \"Router Only\" to only advertise the router, \"Unmanaged\" for Router Advertising with Stateless Autoconfig, \"Managed\" for DHCPv6 only with router advertisements, \"Assisted\" for DHCPv6 Combined with Stateless Autoconfig"
+msgstr "Selecione o modo de operação para o Daemon anúncio de roteador. Use \"Somente Roteador\" apenas para anunciar o router, \"não gerenciados\" para Advertising Router com Autoconfig Stateless, \"Managed\" para DHCPv6 somente com anúncios de roteador, \"Assistida\" para DHCPv6 Stateless Combinado com Autoconfig"
+
+#: usr/local/www/services_dhcpv6.php:510 usr/local/www/services_dhcpv6.php:584
+#: usr/local/www/services_dhcpv6.php:515 usr/local/www/services_dhcpv6.php:526
+#, php-format
+msgid "Enable DHCPv6 server on %s interface"
+msgstr "Habilitar servidor DHCPv6 na interface %s"
+
+#: usr/local/www/services_dhcpv6.php:576 usr/local/www/services_dhcpv6.php:649
+#: usr/local/www/services_dhcpv6.php:580 usr/local/www/services_dhcpv6.php:597
+msgid "Prefix Delegation Range"
+msgstr "Faixa de Delegação de Prefixo"
+
+#: usr/local/www/services_dhcpv6.php:580
+msgid "prefix length"
+msgstr "comprimento do prefixo"
+
+#: usr/local/www/services_dhcpv6.php:585
+msgid ""
+"You can define a Prefix range here for DHCP Prefix Delegation. This allows for \n"
+"\t\t\t\t\tassigning networks to subrouters"
+msgstr ""
+"Você pode definir aqui uma faixa prefixo para a Delegação de Prefixo DHCP. Isto permite que \n"
+" \t \t \t \t \t atribua redes para subroteadores"
+
+#: usr/local/www/services_dhcpv6.php:803
+#: usr/local/www/status_dhcpv6_leases.php:361
+#: usr/local/www/status_dhcpv6_leases.php:405
+#: usr/local/www/status_dhcpv6_leases.php:483
+#: usr/local/www/services_dhcpv6.php:898
+#: usr/local/www/status_dhcpv6_leases.php:406
+#: usr/local/www/status_dhcpv6_leases.php:484
+#: usr/local/www/services_dhcpv6.php:829
+#: usr/local/www/status_dhcpv6_leases.php:409
+#: usr/local/www/status_dhcpv6_leases.php:487
+#: usr/local/www/services_dhcpv6.php:850
+msgid "DUID"
+msgstr "DUID"
+
+#: usr/local/www/services_dhcpv6_edit.php:106
+#: usr/local/www/services_dhcpv6_edit.php:189
+#: usr/local/www/services_dhcpv6_edit.php:108
+#: usr/local/www/services_dhcpv6_edit.php:192
+#: usr/local/www/services_dhcpv6_edit.php:191
+#: usr/local/www/services_dhcpv6_edit.php:111
+#: usr/local/www/services_dhcpv6_edit.php:194
+msgid "DUID Identifier"
+msgstr "Identificador DUID"
+
+#: usr/local/www/services_dhcpv6_edit.php:126
+#: usr/local/www/services_dhcpv6_edit.php:128
+#: usr/local/www/services_dhcpv6_edit.php:131
+msgid "A valid DUID Identifier must be specified."
+msgstr "Um identificador DUID válido deve ser especificado."
+
+#: usr/local/www/services_dhcpv6_edit.php:135
+#: usr/local/www/services_dhcpv6_edit.php:137
+#: usr/local/www/services_dhcpv6_edit.php:140
+msgid "This Hostname, IP or DUID Identifier already exists."
+msgstr "Esse Hostname, endereço de IP ou DUID já existe."
+
+#: usr/local/www/services_dhcpv6_edit.php:172
+#: usr/local/www/services_dhcpv6_edit.php:175
+#: usr/local/www/services_dhcpv6_edit.php:178
+msgid "DHCPv6"
+msgstr "DHCPv6"
+
+#: usr/local/www/services_dhcpv6_edit.php:186
+#: usr/local/www/services_dhcpv6_edit.php:189
+#: usr/local/www/services_dhcpv6_edit.php:188
+#: usr/local/www/services_dhcpv6_edit.php:191
+msgid "Static DHCPv6 Mapping"
+msgstr "Mapeamento DHCPv6 estático"
+
+#: usr/local/www/services_dhcpv6_edit.php:193
+#: usr/local/www/services_dhcpv6_edit.php:196
+#: usr/local/www/services_dhcpv6_edit.php:195
+#: usr/local/www/services_dhcpv6_edit.php:198
+msgid "Enter a DUID Identifier in the following format: "
+msgstr "Digite um Identificador DUID no seguinte formato:"
+
+#: usr/local/www/services_dhcpv6_edit.php:202
+#: usr/local/www/services_dhcpv6_edit.php:205
+msgid "If no IPv6 address is given, one will be dynamically allocated from the pool."
+msgstr "Se nenhum endereço IPv6 for fornecido, um será dinamicamente alocado da fila."
+
+#: usr/local/www/services_dhcpv6_relay.php:81
+msgid "A valid Destination Server IPv6 address must be specified."
+msgstr "Um endereço de IPv6 válido do Servidor de Destino deve ser especificado."
+
+#: usr/local/www/services_dhcpv6_relay.php:145
+#: usr/local/www/services_dhcpv6_relay.php:146
+msgid "DHCPv6 Relay configuration"
+msgstr "Configuração do DHCPv6 Relay"
+
+#: usr/local/www/services_dhcpv6_relay.php:151
+#: usr/local/www/services_dhcpv6_relay.php:152
+#, php-format
+msgid "Enable DHCPv6 relay on interface"
+msgstr "Habilitar DHCPv6 relay na interface"
+
+#: usr/local/www/services_dhcpv6_relay.php:169
+#: usr/local/www/services_dhcpv6_relay.php:170
+msgid "Interfaces without an IPv6 address will not be shown."
+msgstr "Interfaces sem um endereço de IPv6 não serão exibidas."
+
+#: usr/local/www/services_dhcpv6_relay.php:177
+#: usr/local/www/services_dhcpv6_relay.php:178
+#, php-format
+msgid "If this is checked, the DHCPv6 relay will append the circuit ID (%s interface number) and the agent ID to the DHCPv6 request."
+msgstr "Se esta opção estiver marcada, o DHCPv6 relay anexará o circuit ID (número de interface %s) e o agent ID à requisição DHCPv6."
+
+#: usr/local/www/services_dhcpv6_relay.php:184
+#: usr/local/www/services_dhcpv6_relay.php:185
+msgid "This is the IPv6 address of the server to which DHCPv6 requests are relayed. You can enter multiple server IPv6 addresses, separated by commas. Select \"Proxy requests to DHCPv6 server on WAN subnet\" to relay DHCPv6 packets to the server that was used on the WAN interface."
+msgstr "Esse é o endereço IPv6 do servidor para o qual as requisições DHCPv6 são retransmitidas. Você pode informar múltiplos endereços de servidores IPv6 separados por vírgulas. Selecione \"Requisições de Proxy para servidor DHCPv6 na subrede WAN\" para retransmitir pacotes DHCPv6 para o servidor que foi usado na interface WAN."
+
+#: usr/local/www/status_dhcpv6_leases.php:49
+#: usr/local/www/status_dhcpv6_leases.php:50
+msgid "DHCPv6 leases"
+msgstr "Concessões DHCPv6"
+
+#: usr/local/www/status_dhcpv6_leases.php:360
+#: usr/local/www/status_dhcpv6_leases.php:404
+#: usr/local/www/status_dhcpv6_leases.php:482
+#: usr/local/www/status_dhcpv6_leases.php:405
+#: usr/local/www/status_dhcpv6_leases.php:483
+#: usr/local/www/status_dhcpv6_leases.php:408
+#: usr/local/www/status_dhcpv6_leases.php:486
+msgid "IAID"
+msgstr "IAID"
+
+#: usr/local/www/status_dhcpv6_leases.php:362
+#: usr/local/www/status_dhcpv6_leases.php:406
+#: usr/local/www/status_dhcpv6_leases.php:407
+#: usr/local/www/status_dhcpv6_leases.php:410
+msgid "Hostname/MAC"
+msgstr "Hostname/MAC"
+
+#: usr/local/www/diag_logs_wireless.php:88
+#: usr/local/www/diag_logs_wireless.php:99
+#: usr/local/www/diag_logs_wireless.php:100
+#, php-format
+msgid "Wireless (hostapd) log entries"
+msgstr "Wireless (hostapd) registro de logs"
+
+#: usr/local/www/services_captiveportal_zones.php:37
+msgid "Zones"
+msgstr "Zonas"
+
+#: usr/local/www/services_captiveportal_zones.php:47
+#: usr/local/www/services_captiveportal_zones.php:48
+msgid "The CaptivePortal entry list has been changed"
+msgstr "A lista de entrada do CaptivePortal foi modificada"
+
+#: usr/local/www/services_captiveportal_zones.php:60
+#: usr/local/www/services_captiveportal_zones.php:101
+#: usr/local/www/services_captiveportal_zones.php:61
+#: usr/local/www/services_captiveportal_zones.php:102
+msgid "add a new captiveportal instance"
+msgstr "adicionar uma nova instância do Captive Portal"
+
+#: usr/local/www/services_captiveportal_zones.php:88
+#: usr/local/www/services_captiveportal_zones.php:89
+msgid "edit captiveportal instance"
+msgstr "editar instância do captiveportal"
+
+#: usr/local/www/services_captiveportal_zones.php:89
+#: usr/local/www/services_captiveportal_zones.php:90
+msgid "delete captiveportal instance"
+msgstr "apagar a instância do captiveportal"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:48
+#: usr/local/www/services_captiveportal_zones_edit.php:45
+msgid "Edit Zones"
+msgstr "Editar Zonas"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:67
+#: usr/local/www/services_captiveportal_zones_edit.php:69
+msgid "already exists"
+msgstr "Já existe"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:96
+#: usr/local/www/services_captiveportal_zones_edit.php:98
+#: usr/local/www/services_captiveportal_zones_edit.php:94
+msgid "Edit Captive Portal Zones"
+msgstr "Editar Zonas do Captive Portal"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:103
+msgid "Zone name. Cannot contain spaces."
+msgstr "Nome da Zona. Não pode conter espaços."
+
+#: usr/local/www/system_firmware_restorefullbackup.php:104
+msgid "Restore full backup"
+msgstr "Restaurar backup completo"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:139
+msgid "Filename"
+msgstr "Nome do arquivo"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:162
+msgid "Do you really want to delete this backup?"
+msgstr "Você realmente deseja apagar esse backup?"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:174
+msgid "<center>Could not locate any previous backups.</center>"
+msgstr "<center>Não foi possível localizar nenhum dos backups anteriores.</center>"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:184
+msgid "Restore"
+msgstr "Restaurar"
+
+#: usr/local/www/diag_dump_states_sources.php:65
+msgid "Show Source Tracking"
+msgstr "Mostrar Rastreamento de Origem"
+
+#: usr/local/www/diag_dump_states_sources.php:145
+#: usr/local/www/diag_dump_states_sources.php:144
+msgid "Source -> Destination"
+msgstr "Origem -> Destino"
+
+#: usr/local/www/diag_dump_states_sources.php:146
+#: usr/local/www/diag_dump_states_sources.php:145
+msgid "# States"
+msgstr "# Estados"
+
+#: usr/local/www/diag_dump_states_sources.php:147
+#: usr/local/www/diag_dump_states_sources.php:146
+msgid "# Connections"
+msgstr "# Conexões"
+
+#: usr/local/www/diag_dump_states_sources.php:180
+#: usr/local/www/diag_dump_states_sources.php:179
+msgid "Remove all source tracking entries from"
+msgstr "Remover todos as entradas de rastreamentos de origem de"
+
+#: usr/local/www/diag_dump_states_sources.php:190
+#: usr/local/www/diag_dump_states_sources.php:189
+msgid "No source tracking entries were found."
+msgstr "Nenhuma entrada de rastreamento por origem encontrada."
+
+#: etc/inc/system.inc:418 etc/inc/system.inc:425
+#, php-format
+msgid "Not adding default route because OLSR dynamic gateway is enabled."
+msgstr "Rota padrão não adicionada porque o gateway dinâmico OLSR está habilitado."
+
+# 87%
+#: etc/inc/priv.defs.inc:118 etc/inc/priv.defs.inc:124
+msgid "WebCfg - Diagnostics: Logs: Gateways page"
+msgstr "WebCfg - Página Diagnóstico: Logs: Gateways"
+
+# 84%
+#: etc/inc/priv.defs.inc:119 etc/inc/priv.defs.inc:125
+msgid "Allow access to the 'Diagnostics: Logs: System: Gateways' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Logs: Gateway'."
+
+# 85%
+#: etc/inc/priv.defs.inc:124 etc/inc/priv.defs.inc:130
+msgid "WebCfg - Diagnostics: Logs: Resolver page"
+msgstr "WebCfg - Página Diagnóstico: Logs: Resolver"
+
+# 84%
+#: etc/inc/priv.defs.inc:125 etc/inc/priv.defs.inc:131
+msgid "Allow access to the 'Diagnostics: Logs: System: Resolver' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Logs: Sistema: Resolver'."
+
+# 87%
+#: etc/inc/priv.defs.inc:130 etc/inc/priv.defs.inc:136
+msgid "WebCfg - Diagnostics: Logs: Wireless page"
+msgstr "WebCfg - Página Diagnóstico: Logs: Wireless"
+
+# 84%
+#: etc/inc/priv.defs.inc:131 etc/inc/priv.defs.inc:137
+msgid "Allow access to the 'Diagnostics: Logs: System: Wireless' page."
+msgstr "Permitir acesso à  página 'Diagnóstico: Logs: Sistema: Wireless'."
+
+# 88%
+#: etc/inc/priv.defs.inc:148 etc/inc/priv.defs.inc:154
+msgid "WebCfg - Status: System logs: NTP page"
+msgstr "WebCfg - Página Status: Logs do Sistema: NTP"
+
+# 91%
+#: etc/inc/priv.defs.inc:149 etc/inc/priv.defs.inc:155
+msgid "Allow access to the 'Status: System logs: NTP' page."
+msgstr "Permitir acesso à  página 'Status: Logs do Sistema: NTP'."
+
+#: etc/inc/pfsense-utils.inc:2377 etc/inc/pfsense-utils.inc:2468
+#: etc/inc/pfsense-utils.inc:2521 etc/inc/pfsense-utils.inc:2528
+#: etc/inc/pfsense-utils.inc:2535 etc/inc/pfsense-utils.inc:2532
+msgid "English"
+msgstr "Inglês"
+
+#: etc/inc/pfsense-utils.inc:2378 etc/inc/pfsense-utils.inc:2469
+#: etc/inc/pfsense-utils.inc:2522 etc/inc/pfsense-utils.inc:2529
+#: etc/inc/pfsense-utils.inc:2536 etc/inc/pfsense-utils.inc:2533
+msgid "Portuguese (Brazil)"
+msgstr "Português (Brasil)"
+
+# 98%
+#: etc/inc/interfaces.inc:251 etc/inc/interfaces.inc:250
+#: etc/inc/interfaces.inc:248
+msgid "interface_vlan_configure called with if undefined."
+msgstr "interface_vlan_configure called with if undefined."
+
+# 98%
+#: etc/inc/interfaces.inc:292 etc/inc/interfaces.inc:291
+#: etc/inc/interfaces.inc:289
+#, php-format
+msgid "interface_qinq_configure called with if undefined.%s"
+msgstr "interface_qinq_configure called with if undefined.%s"
+
+# 96%
+#: etc/inc/interfaces.inc:377 etc/inc/interfaces.inc:376
+#: etc/inc/interfaces.inc:380
+#, php-format
+msgid "interface_qinq2_configure called with if undefined.%s"
+msgstr "interface_qinq2_configure called with if undefined.%s"
+
+# 75%
+#: etc/inc/interfaces.inc:2152
+#, php-format
+msgid "Error: cannot open dhclient_%s.conf in interface_carpdev_configure() for writing.%s"
+msgstr "Error: cannot open dhclient_%s.conf in interface_carpdev_configure() for writing.%s"
+
+# 96%
+#: etc/inc/interfaces.inc:2995
+msgid "Could not bring wanif up in interface_carpdev_dhcp_configure()"
+msgstr "Could not bring wanif up in interface_carpdev_dhcp_configure()"
+
+# 75%
+#: etc/inc/interfaces.inc:3500 etc/inc/interfaces.inc:3360
+#: etc/inc/interfaces.inc:3453 etc/inc/interfaces.inc:3580
+#: etc/inc/interfaces.inc:3525 etc/inc/interfaces.inc:3547
+#, php-format
+msgid "Error: cannot open dhclient_%s.conf in interface_dhcp_configure() for writing.%s"
+msgstr "Error: cannot open dhclient_%s.conf in interface_dhcp_configure() for writing.%s"
+
+#: etc/inc/services.inc:1085 etc/inc/services.inc:1217
+#: etc/inc/services.inc:1211 etc/inc/services.inc:1218
+#: etc/inc/services.inc:1270 etc/inc/services.inc:1268
+msgid "Started IGMP proxy service."
+msgstr "Serviço IGMP proxy iniciado."
+
+#: usr/local/www/diag_logs_routing.php:74
+#: usr/local/www/diag_logs_settings.php:224 usr/local/www/fbegin.inc:148
+#: usr/local/www/fbegin.inc:183 usr/local/www/diag_logs_relayd.php:75
+#: usr/local/www/diag_logs_auth.php:74 usr/local/www/diag_logs_ipsec.php:111
+#: usr/local/www/diag_logs_vpn.php:135 usr/local/www/diag_logs_ppp.php:79
+#: usr/local/www/diag_logs_resolver.php:87 usr/local/www/diag_logs_ntpd.php:54
+#: usr/local/www/diag_logs_ntpd.php:74 usr/local/www/diag_logs.php:86
+#: usr/local/www/status_ntpd.php:94 usr/local/www/diag_logs_dhcp.php:79
+#: usr/local/www/diag_logs_wireless.php:76
+#: usr/local/www/diag_logs_filter_summary.php:193
+#: usr/local/www/services_ntpd.php:71 usr/local/www/diag_logs_gateways.php:87
+#: usr/local/www/diag_logs_openvpn.php:78
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_filter.php:110
+#: usr/local/www/diag_logs_routing.php:75
+#: usr/local/www/diag_logs_settings.php:231 usr/local/www/fbegin.inc:157
+#: usr/local/www/fbegin.inc:191 usr/local/www/diag_logs_relayd.php:76
+#: usr/local/www/diag_logs_auth.php:75 usr/local/www/diag_logs_ipsec.php:112
+#: usr/local/www/diag_logs_resolver.php:88 usr/local/www/diag_logs_ntpd.php:75
+#: usr/local/www/status_ntpd.php:109 usr/local/www/diag_logs_dhcp.php:80
+#: usr/local/www/diag_logs_wireless.php:77
+#: usr/local/www/diag_logs_filter_summary.php:194
+#: usr/local/www/services_ntpd.php:76 usr/local/www/diag_logs_gateways.php:88
+#: usr/local/www/diag_logs_openvpn.php:79
+#: usr/local/www/diag_logs_filter_dynamic.php:108
+#: usr/local/www/diag_logs_filter.php:100
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: usr/local/www/diag_logs_ppp.php:77 usr/local/www/fbegin.inc:149
+#: usr/local/www/fbegin.inc:182 usr/local/www/diag_logs_filter.php:130
+#: usr/local/www/status_ntpd.php:115 usr/local/www/diag_logs_settings.php:250
+msgid "NTP"
+msgstr "NTP"
+
+# 75%
+#: usr/local/www/diag_logs_routing.php:82
+#: usr/local/www/diag_logs_resolver.php:96 usr/local/www/diag_logs.php:65
+#: usr/local/www/diag_logs.php:95 usr/local/www/diag_logs_wireless.php:84
+#: usr/local/www/diag_logs_gateways.php:96
+#: usr/local/www/diag_logs_routing.php:83
+#: usr/local/www/diag_logs_resolver.php:97
+#: usr/local/www/diag_logs_wireless.php:85
+#: usr/local/www/diag_logs_gateways.php:97
+msgid "General"
+msgstr "Geral"
+
+#: usr/local/www/diag_logs_routing.php:85
+#: usr/local/www/diag_logs_resolver.php:66
+#: usr/local/www/diag_logs_resolver.php:99 usr/local/www/diag_logs.php:98
+#: usr/local/www/diag_logs_wireless.php:87
+#: usr/local/www/diag_logs_gateways.php:99
+#: usr/local/www/diag_logs_routing.php:86
+#: usr/local/www/diag_logs_resolver.php:100
+#: usr/local/www/diag_logs_wireless.php:88
+#: usr/local/www/diag_logs_gateways.php:100
+msgid "Resolver"
+msgstr "Resolver"
+
+#: usr/local/www/diag_logs_routing.php:97
+#: usr/local/www/diag_logs_routing.php:98
+#, php-format
+msgid "Routing daemon log entries"
+msgstr "Logs do daemon de roteamento"
+
+# 92%
+#: usr/local/www/system_routes_edit.php:158
+#: usr/local/www/system_routes_edit.php:169
+#: usr/local/www/system_routes_edit.php:171
+#: usr/local/www/system_routes_edit.php:173
+msgid "A route to these destination networks already exists"
+msgstr "Já existe uma rota para estas redes de destino"
+
+#: usr/local/www/system_routes_edit.php:302
+#: usr/local/www/system_routes_edit.php:303
+#: usr/local/www/system_routes_edit.php:326
+#: usr/local/www/system_routes_edit.php:335
+#: usr/local/www/system_routes_edit.php:337
+msgid "Disable this static route"
+msgstr "Desabilitar esta rota estática"
+
+#: usr/local/www/system_routes_edit.php:303
+#: usr/local/www/system_routes_edit.php:304
+#: usr/local/www/system_routes_edit.php:327
+#: usr/local/www/system_routes_edit.php:336
+#: usr/local/www/system_routes_edit.php:338
+msgid "Set this option to disable this static route without removing it from the list."
+msgstr "Marque esta opção para desabilitar esta rota estática sem removê-la da lista."
+
+# 91%
+#: usr/local/www/pkg_mgr.php:185 usr/local/www/pkg_mgr_installed.php:178
+#: usr/local/www/pkg_mgr_installed.php:180 usr/local/www/pkg_mgr.php:188
+msgid "Package info"
+msgstr "Info do pacote"
+
+#: usr/local/www/pkg_mgr.php:189 usr/local/www/pkg_mgr_installed.php:182
+#: usr/local/www/pkg_mgr_installed.php:184 usr/local/www/pkg_mgr.php:192
+msgid "No package info, check the forum"
+msgstr "Sem informações do pacote, verifique o fórum"
+
+#: usr/local/www/pkg_mgr.php:193
+msgid "Click on package name to access it's website."
+msgstr "Clique no nome do pacote para acessar seu website."
+
+#: usr/local/www/pkg_mgr.php:217 usr/local/www/pkg_mgr.php:220
+msgid "Click "
+msgstr "Clique"
+
+#: usr/local/www/pkg_mgr.php:232 usr/local/www/pkg_mgr_installed.php:199
+#: usr/local/www/pkg_mgr_installed.php:201 usr/local/www/pkg_mgr.php:235
+msgid "Click package info for more details about "
+msgstr "Clique nas informações do pacote para mais detalhes sobre"
+
+#: usr/local/www/pkg_mgr.php:237 usr/local/www/pkg_mgr.php:240
+#: usr/local/www/pkg_mgr.php:243
+msgid "Do you really want to install "
+msgstr "Você realmente deseja instalar"
+
+# 77%
+#: usr/local/www/pkg_mgr.php:237 usr/local/www/pkg_mgr.php:240
+#: usr/local/www/pkg_mgr.php:243
+msgid "Install "
+msgstr "Instalado"
+
+#: usr/local/www/services_unbound_acls.php:57
+msgid "Access List successfully deleted"
+msgstr "Lista de acesso excluída com sucesso"
+
+#: usr/local/www/services_unbound_acls.php:173
+msgid "The settings for the DNS Resolver have changed. You must apply the configuration to take affect."
+msgstr "As configurações do DNS Resolver foram alteradas. Você precisa aplicar as configurações para que elas tenham efeito."
+
+#: usr/local/www/services_unbound_acls.php:181
+msgid "General Settings"
+msgstr "ConfiguraçÃo Geral"
+
+# 76%
+#: usr/local/www/services_unbound_acls.php:182
+#: usr/local/www/services_unbound.php:137
+#: usr/local/www/services_unbound_advanced.php:124
+msgid "Advanced settings"
+msgstr "Configurações avançadas"
+
+#: usr/local/www/services_unbound_acls.php:183
+#: usr/local/www/services_unbound.php:138
+#: usr/local/www/services_unbound_advanced.php:125
+msgid "Access Lists"
+msgstr "Listas de acesso"
+
+#: usr/local/www/services_unbound_acls.php:200
+#, php-format
+msgid "%s Access List"
+msgstr "Lista de acesso %s"
+
+#: usr/local/www/services_unbound_acls.php:203
+msgid "Access List name"
+msgstr "Nome da lista de acesso"
+
+#: usr/local/www/services_unbound_acls.php:207
+msgid "Provide an Access List name."
+msgstr "Forneça um nome para a Lista de Acesso."
+
+#: usr/local/www/services_unbound_acls.php:222
+msgid "Choose what to do with DNS requests that match the criteria specified below."
+msgstr "Escolha o que fazer com requisições DNS que correspondem aos critérios especificados abaixo."
+
+#: usr/local/www/services_unbound_acls.php:223
+msgid "<b>Deny:</b> This action stops queries from hosts within the netblock defined below."
+msgstr "<b>Negar:</b> Esta ação interrompe consultas de hosts dentro da rede definida abaixo."
+
+#: usr/local/www/services_unbound_acls.php:224
+msgid "<b>Refuse:</b> This action also stops queries from hosts within the netblock defined below, but sends a DNS rcode REFUSED error message back to the client."
+msgstr "<b>Recusar:</b> Esta ação também interrompe consultas de hosts dentro da rede definida abaixo, mas envia uma mensagem de erro DNS rcode REFUSED para o cliente."
+
+#: usr/local/www/services_unbound_acls.php:225
+msgid "<b>Allow:</b> This action allows queries from hosts within the netblock defined below."
+msgstr "<b>Permitir:</b> Esta ação permite consultas de hosts dentro da rede definida abaixo."
+
+#: usr/local/www/services_unbound_acls.php:226
+msgid "<b>Allow Snoop:</b> This action allows recursive and nonrecursive access from hosts within the netblock defined below. Used for cache snooping and ideally should only be configured for your administrative host."
+msgstr "<b>Permitir Snoop:</b> Esta ação permite acesso recursivo e não recursivo de hosts dentro da rede definida abaixo. Usado para cache snooping e o ideal é que seja configurado apenas para seu host administrativo."
+
+# 87%
+#: usr/local/www/services_unbound_acls.php:231
+msgid "Networks"
+msgstr "Redes"
+
+#: usr/local/www/services_unbound_acls.php:317
+msgid "Access List Name"
+msgstr "Nome da Lista de Acesso"
+
+#: usr/local/www/services_unbound_acls.php:340
+msgid "edit access list"
+msgstr "editar lista de acesso"
+
+# 82%
+#: usr/local/www/services_unbound_acls.php:343
+msgid "Do you really want to delete this access list?"
+msgstr "Você deseja realmente apagar esta lista de acesso?"
+
+#: usr/local/www/services_unbound_acls.php:344
+msgid "delete access list"
+msgstr "excluir lista de acesso"
+
+#: usr/local/www/services_unbound_acls.php:357
+msgid "Add new Access List"
+msgstr "Adicionar nova Lista de Acesso"
+
+#: usr/local/www/services_unbound_acls.php:364
+msgid "Access Lists to control access to the DNS Resolver can be defined here."
+msgstr "Listas de Acesso para controlar o acesso ao DNS Resolver podem ser definidas aqui."
+
+#: usr/local/www/diag_logs_settings.php:86
+#: usr/local/www/diag_logs_settings.php:87
+#: usr/local/www/diag_logs_settings.php:90
+msgid "A valid IP address/hosname or IP/hostname:port must be specified for remote syslog server #1."
+msgstr "Um IP/hostname ou IP/hostname:porta deve ser expecificado para o servidor syslog remoto #1."
+
+#: usr/local/www/diag_logs_settings.php:89
+#: usr/local/www/diag_logs_settings.php:90
+#: usr/local/www/diag_logs_settings.php:93
+msgid "A valid IP address/hosname or IP/hostname:port must be specified for remote syslog server #2."
+msgstr "Um IP/hostname ou IP/hostname:porta deve ser expecificado para o servidor syslog remoto #2."
+
+#: usr/local/www/diag_logs_settings.php:92
+#: usr/local/www/diag_logs_settings.php:93
+#: usr/local/www/diag_logs_settings.php:96
+msgid "A valid IP address/hosname or IP/hostname:port must be specified for remote syslog server #3."
+msgstr "Um IP/hostname ou IP/hostname:porta deve ser expecificado para o servidor syslog remoto #3."
+
+#: usr/local/www/diag_logs_settings.php:234
+#: usr/local/www/diag_logs_settings.php:241
+#: usr/local/www/diag_logs_settings.php:260
+msgid "General Logging Options"
+msgstr "Opções Gerais de Log"
+
+#: usr/local/www/diag_logs_settings.php:245
+#: usr/local/www/diag_logs_settings.php:252
+#: usr/local/www/diag_logs_settings.php:271
+msgid "Hint: This is only the number of log entries displayed in the GUI. It does not affect how many entries are contained in the actual log files."
+msgstr "Dica: Este é apenas o número de entradas do log exibidas na interface. Isto não afeta a quantidade de entradas existente nos arquivos de log reais."
+
+#: usr/local/www/diag_logs_settings.php:251
+#: usr/local/www/diag_logs_settings.php:258
+#: usr/local/www/diag_logs_settings.php:278
+msgid "Hint: packets that are blocked by the implicit default block rule will not be logged if you uncheck this option. Per-rule logging options are still respected."
+msgstr "Dica: pacotes que são bloqueados pela regra de bloqueio padrão não são \"logadas\" se você desmarcar esta opção. Opções de log por regras ainda são respeitadas."
+
+#: usr/local/www/diag_logs_settings.php:259
+#: usr/local/www/diag_logs_settings.php:266
+#: usr/local/www/diag_logs_settings.php:297
+msgid "Hint: If this is checked, filter logs are shown as generated by the packet filter, without any formatting. This will reveal more detailed information, but it is more difficult to read."
+msgstr "Dica: Se isto estiver ativado, regras de filtros são exibidas da forma como são geradas pelo filtro de pacotes, sem formatação alguma. Isto irá revelar mais informações detalhadas, mas é mais difícil de ler."
+
+# 91%
+#: usr/local/www/diag_logs_settings.php:265
+#: usr/local/www/diag_logs_settings.php:285
+#: usr/local/www/diag_logs_settings.php:316
+msgid "Disable writing log files to the local disk"
+msgstr "Desabilitar gravação de arquivos de log no disco local"
+
+#: usr/local/www/diag_logs_settings.php:274
+#: usr/local/www/diag_logs_settings.php:294
+#: usr/local/www/diag_logs_settings.php:325
+msgid "Remote Logging Options"
+msgstr "Opções de Log Remoto"
+
+#: usr/local/www/diag_logs_settings.php:277
+#: usr/local/www/diag_logs_settings.php:297
+#: usr/local/www/diag_logs_settings.php:328
+msgid "Enable Remote Logging"
+msgstr "Habilitar Log Remoto"
+
+#: usr/local/www/diag_logs_settings.php:279
+#: usr/local/www/diag_logs_settings.php:299
+#: usr/local/www/diag_logs_settings.php:330
+msgid "Send log messages to remote syslog server"
+msgstr "Enviar mensagens de log para o servidor syslog remoto"
+
+# 90%
+#: usr/local/www/diag_logs_settings.php:282
+#: usr/local/www/diag_logs_settings.php:302
+#: usr/local/www/diag_logs_settings.php:333
+msgid "Remote Syslog Servers"
+msgstr "Servidores Syslog Remotos"
+
+#: usr/local/www/diag_logs_settings.php:299
+#: usr/local/www/diag_logs_settings.php:319
+#: usr/local/www/diag_logs_settings.php:350
+msgid "IP addresses of remote syslog servers, or an IP:port."
+msgstr "Endereços IP dos servidores syslog remotos, ou IP:porta."
+
+#: usr/local/www/diag_logs_settings.php:304
+#: usr/local/www/diag_logs_settings.php:324
+#: usr/local/www/diag_logs_settings.php:355
+msgid "Remote Syslog Contents"
+msgstr "Conteúdo Syslog Remoto"
+
+#: usr/local/www/diag_logs_settings.php:334
+#: usr/local/www/diag_logs_settings.php:354
+#: usr/local/www/diag_logs_settings.php:385
+msgid "syslog sends UDP datagrams to port 514 on the specified remote syslog server, unless another port is specified. Be sure to set syslogd on the remote server to accept syslog messages from"
+msgstr "syslog envia um datagrama UDP para a porta 514 do servidor remoto especificado, a não ser que outra porta seja especificada. Esteja certo de configurar o syslogd no servidor remoto para aceitar mensagens de"
+
+# 94%
+#: usr/local/www/system_gateway_groups_edit.php:229
+#: usr/local/www/system_gateway_groups_edit.php:289
+#: usr/local/www/system_gateway_groups_edit.php:293
+msgid "Interface Address"
+msgstr "Endereço da Interface"
+
+#: usr/local/www/system_gateway_groups_edit.php:253
+#: usr/local/www/system_gateway_groups_edit.php:313
+msgid "The virtual IP field selects what (virtual) IP should be used when this group applies to a local Dyndns, IPsec or openvpn endpoint"
+msgstr "O campo IP virtual seleciona qual IP (virtual) deve ser usado quando este grupo se aplica a um Dyndns, IPsec ou OpenVPN local"
+
+#: usr/local/www/services_dyndns_edit.php:102
+#: usr/local/www/services_dyndns_edit.php:322
+#: usr/local/www/services_dyndns_edit.php:326
+#: usr/local/www/services_dyndns_edit.php:103
+#: usr/local/www/services_dyndns_edit.php:334
+#: usr/local/www/services_dyndns_edit.php:335
+msgid "Update URL"
+msgstr "Atualizar URL"
+
+#: usr/local/www/services_dyndns_edit.php:254
+#: usr/local/www/services_dyndns_edit.php:258
+#: usr/local/www/services_dyndns_edit.php:260
+#: usr/local/www/services_dyndns_edit.php:261
+msgid "Interface to send update from"
+msgstr "Interface de onde enviar atualizações"
+
+#: usr/local/www/services_dyndns_edit.php:262
+#: usr/local/www/services_dyndns_edit.php:266
+#: usr/local/www/services_dyndns_edit.php:268
+#: usr/local/www/services_dyndns_edit.php:269
+msgid "Note: This is almost always the same as the Interface to Monitor."
+msgstr "Nota: Esta é quase sempre a mesma interface de Interface a Monitorar."
+
+# 80%
+#: usr/local/www/services_dyndns_edit.php:299
+#: usr/local/www/services_dyndns_edit.php:303
+#: usr/local/www/services_dyndns_edit.php:311
+#: usr/local/www/services_dyndns_edit.php:312
+msgid "Username is required for all types except Namecheap, FreeDNS and Custom Entries."
+msgstr "Nome de usuário é necessário para todos os tipos exceto Namecheap e FreeDNS e entradas customizadas."
+
+#: usr/local/www/services_dyndns_edit.php:300
+#: usr/local/www/services_dyndns_edit.php:304
+#: usr/local/www/services_dyndns_edit.php:312
+#: usr/local/www/services_dyndns_edit.php:313
+msgid "Route 53: Enter your Access Key ID."
+msgstr "Route 53: Entre com seu Access Key ID."
+
+#: usr/local/www/services_dyndns_edit.php:301
+#: usr/local/www/services_dyndns_edit.php:305
+#: usr/local/www/services_dyndns_edit.php:313
+#: usr/local/www/services_dyndns_edit.php:314
+msgid "For Custom Entries, Username and Password represent HTTP Authentication username and passwords."
+msgstr "Para entradas customizadas, nome de usuário e senha, apresente usuário e senha autenticação HTTP."
+
+#: usr/local/www/services_dyndns_edit.php:310
+#: usr/local/www/services_dyndns_edit.php:314
+#: usr/local/www/services_dyndns_edit.php:322
+#: usr/local/www/services_dyndns_edit.php:323
+msgid "Route 53: Enter your Secret Access Key."
+msgstr "Route 53: Entre com seu Secret Access Key."
+
+#: usr/local/www/services_dyndns_edit.php:315
+#: usr/local/www/services_dyndns_edit.php:319
+#: usr/local/www/services_dyndns_edit.php:327
+#: usr/local/www/services_dyndns_edit.php:328
+msgid "Zone ID"
+msgstr "Zone ID"
+
+#: usr/local/www/services_dyndns_edit.php:318
+#: usr/local/www/services_dyndns_edit.php:322
+#: usr/local/www/services_dyndns_edit.php:330
+#: usr/local/www/services_dyndns_edit.php:331
+msgid "Enter Zone ID that you received when you created your domain in Route 53."
+msgstr "Informe o Zone ID que você recebeu quando criou seu domínio no Route 53."
+
+#: usr/local/www/services_dyndns_edit.php:325
+#: usr/local/www/services_dyndns_edit.php:329
+#: usr/local/www/services_dyndns_edit.php:337
+#: usr/local/www/services_dyndns_edit.php:338
+msgid "This is the only field required by for Custom Dynamic DNS, and is only used by Custom Entries."
+msgstr "Este é o único campo exigido pelo Custom Dynamic DNS e usado apenas pelas entradas customizadas."
+
+#: usr/local/www/services_dyndns_edit.php:327
+#: usr/local/www/services_dyndns_edit.php:338
+#: usr/local/www/services_dyndns_edit.php:331
+#: usr/local/www/services_dyndns_edit.php:342
+#: usr/local/www/services_dyndns_edit.php:339
+#: usr/local/www/services_dyndns_edit.php:350
+#: usr/local/www/services_dyndns_edit.php:340
+#: usr/local/www/services_dyndns_edit.php:351
+msgid "If you need the new IP to be included in the request, put %IP% in its place."
+msgstr "Se precisa que o novo IP seja incluído na requisição, coloque %IP% em seu lugar."
+
+#: usr/local/www/services_dyndns_edit.php:331
+#: usr/local/www/services_dyndns_edit.php:335
+#: usr/local/www/services_dyndns_edit.php:343
+#: usr/local/www/services_dyndns_edit.php:344
+msgid "Result Match"
+msgstr "Result Match"
+
+#: usr/local/www/services_dyndns_edit.php:334
+#: usr/local/www/services_dyndns_edit.php:338
+#: usr/local/www/services_dyndns_edit.php:346
+#: usr/local/www/services_dyndns_edit.php:347
+msgid "This field is only used by Custom Dynamic DNS Entries."
+msgstr "Este campo é usado apenas pelo Custom Dynamic DNS Entries."
+
+#: usr/local/www/services_dyndns_edit.php:336
+#: usr/local/www/services_dyndns_edit.php:340
+#: usr/local/www/services_dyndns_edit.php:348
+#: usr/local/www/services_dyndns_edit.php:349
+msgid "This field should be identical to what your DDNS Provider will return if the update succeeds, leave it blank to disable checking of returned results."
+msgstr "Este campo deve ser identico ao o que seu provedor DDNS irá retornar se a atualização for bem sucedida, deixe em branco para desabilitar a verificação de resultados retornados."
+
+#: usr/local/www/services_dyndns_edit.php:340
+#: usr/local/www/services_dyndns_edit.php:344
+#: usr/local/www/services_dyndns_edit.php:352
+#: usr/local/www/services_dyndns_edit.php:353
+msgid "If you need to include multiple possible values, sperate them with a |. If your provider includes a |, escape it with \\|"
+msgstr "Se você precisar incluir multiplos valores possíveis, separe-os com um |. Se o seu provedor incluir um |, escape-o com \\|"
+
+#: usr/local/www/services_dyndns_edit.php:342
+#: usr/local/www/services_dyndns_edit.php:346
+#: usr/local/www/services_dyndns_edit.php:354
+#: usr/local/www/services_dyndns_edit.php:355
+msgid ""
+"Tabs (\\t), newlines (\\n"
+") and carriage returns (\\r) at the beginning or end of the returned results are removed before comparison."
+msgstr ""
+"Tabs (\\t), quebra de linha (\\n"
+") e retornos de carro (\\r) no inicio ou no fim dos resultados retornados são removidos antes da comparação."
+
+#: usr/local/www/services_dyndns_edit.php:351
+#: usr/local/www/services_dyndns_edit.php:355
+#: usr/local/www/services_dyndns_edit.php:363
+#: usr/local/www/services_dyndns_edit.php:364
+msgid "Choose TTL for your dns record."
+msgstr "Escolha o TTL para seus registros DNS."
+
+#: usr/local/www/services_dyndns_edit.php:370
+#: usr/local/www/services_dyndns_edit.php:374
+#: usr/local/www/services_dyndns_edit.php:382
+#: usr/local/www/services_dyndns_edit.php:383
+#: usr/local/www/services_rfc2136_edit.php:104
+#: usr/local/www/services_rfc2136_edit.php:214
+msgid "Save & Force Update"
+msgstr "Salvar e Forçar Atualização"
+
+#: usr/local/www/fbegin.inc:102 usr/local/www/fbegin.inc:111
+#: usr/local/www/fbegin.inc:103
+msgid "High Avail. Sync"
+msgstr "Sincronização Alta Disp."
+
+#: usr/local/www/services_dnsmasq_edit.php:119
+msgid "Alias Domain"
+msgstr "Alias de Dominio"
+
+#: usr/local/www/services_dnsmasq_edit.php:124
+msgid "Hostnames in alias list can only contain the characters A-Z, 0-9 and '-'."
+msgstr "Hostnames na lista de alias podem conter apenas caracteres A-Z, 0-9 e '-'."
+
+#: usr/local/www/services_dnsmasq_edit.php:127
+msgid "A valid domain must be specified in alias list."
+msgstr "Um dominio válido deve ser especificado na lista de alias."
+
+#: usr/local/www/services_dnsmasq_edit.php:232
+#: usr/local/www/services_dnsmasq_edit.php:233
+msgid "Enter additional names for this host."
+msgstr "Informe nomes adicionais para este host."
+
+#: usr/local/www/pkg.php:238 usr/local/www/pkg.php:186
+msgid "Saving changes..."
+msgstr "Salvando alterações..."
+
+#: usr/local/www/pkg.php:239 usr/local/www/pkg.php:187
+msgid "Do you really want to save changes?"
+msgstr "Você deseja realmente salvar as alterações?"
+
+#: usr/local/www/status_interfaces.php:196
+#: usr/local/www/status_interfaces.php:199
+msgid "Cell Signal (RSSI)"
+msgstr "Cell Signal (RSSI)"
+
+#: usr/local/www/status_interfaces.php:203
+#: usr/local/www/status_interfaces.php:206
+msgid "Cell Mode"
+msgstr "Cell Mode"
+
+#: usr/local/www/status_interfaces.php:210
+#: usr/local/www/status_interfaces.php:213
+msgid "Cell SIM State"
+msgstr "Cell SIM State"
+
+#: usr/local/www/status_interfaces.php:217
+#: usr/local/www/status_interfaces.php:220
+msgid "Cell Service"
+msgstr "Cell Service"
+
+#: usr/local/www/status_interfaces.php:224
+#: usr/local/www/status_interfaces.php:227
+msgid "Cell Upstream"
+msgstr "Cell Upstream"
+
+#: usr/local/www/status_interfaces.php:231
+#: usr/local/www/status_interfaces.php:234
+msgid "Cell Downstream"
+msgstr "Cell Downstream"
+
+#: usr/local/www/status_interfaces.php:238
+#: usr/local/www/status_interfaces.php:241
+msgid "Cell Current Up"
+msgstr "Cell Current Up"
+
+#: usr/local/www/status_interfaces.php:245
+#: usr/local/www/status_interfaces.php:248
+msgid "Cell Current Down"
+msgstr "Cell Current Down"
+
+#: usr/local/www/status_interfaces.php:289
+#: usr/local/www/status_interfaces.php:292
+msgid "IPv6 Link Local"
+msgstr "IPv6 Link Local"
+
+#: usr/local/www/status_interfaces.php:339
+#: usr/local/www/status_interfaces.php:342
+msgid "LAGG Protocol"
+msgstr "Protocolo LAGG"
+
+#: usr/local/www/status_interfaces.php:346
+#: usr/local/www/status_interfaces.php:349
+msgid "LAGG Ports"
+msgstr "Portas LAGG"
+
+#: usr/local/www/diag_defaults.php:51 usr/local/www/diag_defaults.php:61
+msgid "The system has been reset to factory defaults and is now rebooting. This may take a few minutes, depending on your hardware."
+msgstr "O systema foi restaurado para o padrão de fábrica e está reiniciando. Isto pode levar alguns minutos, dependendo do seu hardware."
+
+#: usr/local/www/carp_status.php:196 usr/local/www/carp_status.php:189
+msgid "You can configure high availability sync settings"
+msgstr "Você pode definir as configurações de sincronização de alta disponibilidade "
+
+#: usr/local/www/load_balancer_setting.php:69
+msgid "Timeout must be a numeric value"
+msgstr "Timeout deve ser um valor numérico"
+
+#: usr/local/www/load_balancer_setting.php:73
+msgid "Interval must be a numeric value"
+msgstr "Intervalo deve ser um valor numérico"
+
+#: usr/local/www/load_balancer_setting.php:78
+msgid "Prefork must be a numeric value"
+msgstr "Prefork deve ser um valor numérico"
+
+#: usr/local/www/load_balancer_setting.php:81
+msgid "Prefork value must be between 1 and 32"
+msgstr "O valor de prefork deve estar entre 1 e 32"
+
+#: usr/local/www/load_balancer_setting.php:132
+#: usr/local/www/load_balancer_setting.php:131
+msgid "Relayd global settings"
+msgstr "Configurações gerais do Relayd"
+
+#: usr/local/www/load_balancer_setting.php:135
+#: usr/local/www/load_balancer_setting.php:134
+msgid "timeout"
+msgstr "timeout"
+
+#: usr/local/www/load_balancer_setting.php:139
+#: usr/local/www/load_balancer_setting.php:138
+msgid "Set the global timeout in milliseconds for checks. Leave blank to use the default value of 1000 ms "
+msgstr "Define o timeout global em milisegundos para verificações. Deixe em branco para usar o valor padrão de 1000 ms"
+
+# 75%
+#: usr/local/www/load_balancer_setting.php:143
+#: usr/local/www/load_balancer_setting.php:142
+msgid "interval"
+msgstr "intervalo"
+
+#: usr/local/www/load_balancer_setting.php:147
+#: usr/local/www/load_balancer_setting.php:146
+msgid "Set the interval in seconds at which the member of a pool will be checked. Leave blank to use the default interval of 10 seconds"
+msgstr "Define o intervalo em segundos no qual o membro de um pool será verificado. Deixe em branco para usar o valor padão de 10 segundos"
+
+#: usr/local/www/load_balancer_setting.php:151
+#: usr/local/www/load_balancer_setting.php:150
+msgid "prefork"
+msgstr "prefork"
+
+#: usr/local/www/load_balancer_setting.php:155
+#: usr/local/www/load_balancer_setting.php:154
+msgid "Number of processes used by relayd. Leave blank to use the default value of 5 processes"
+msgstr "Número de processos usados pelo relayd. Deixe em branco para usar o valor padrão de 5 processos"
+
+# 98%
+#: usr/local/www/services_dhcp_relay.php:80
+msgid "A valid Destination Server IP address must be specified."
+msgstr "Um endereço IP do Servidor de Destino válido deve ser especificado."
+
+#: usr/local/www/diag_ipsec.php:65 usr/local/www/diag_ipsec.php:66
+#: usr/local/www/diag_ipsec.php:68
+msgid "Disconnected user"
+msgstr "Usuário desconectado"
+
+#: usr/local/www/diag_ipsec.php:192 usr/local/www/diag_ipsec.php:193
+#: usr/local/www/diag_ipsec.php:194
+msgid "Mobile User"
+msgstr "Usuário Móvel"
+
+#: usr/local/www/diag_ipsec.php:193 usr/local/www/diag_ipsec.php:194
+#: usr/local/www/diag_ipsec.php:195
+msgid "Login Time"
+msgstr "Hora do Login"
+
+# 83%
+#: usr/local/www/diag_ipsec.php:195 usr/local/www/diag_ipsec.php:196
+#: usr/local/www/diag_ipsec.php:197
+msgid "Remote"
+msgstr "Remoto"
+
+# 82%
+#: usr/local/www/diag_ipsec.php:223 usr/local/www/diag_ipsec.php:224
+#: usr/local/www/diag_ipsec.php:225
+msgid "You can configure IPsec"
+msgstr "Você pode configurar seu IPsec"
+
+# 81%
+#: usr/local/www/system_certmanager.php:207
+#: usr/local/www/system_certmanager.php:681
+#: usr/local/www/system_certmanager.php:210
+#: usr/local/www/system_certmanager.php:706
+#: usr/local/www/system_certmanager.php:707
+msgid "Certificate Type"
+msgstr "Tipo do Certificado"
+
+#: usr/local/www/system_certmanager.php:694
+#: usr/local/www/system_certmanager.php:719
+#: usr/local/www/system_certmanager.php:720
+msgid "Type of certificate to generate. Used for placing restrictions on the usage of the generated certificate."
+msgstr "Tipo do certificado a gerar. Usado para colocar restrições sobre o uso do certificado gerado."
+
+#: usr/local/www/system_certmanager.php:757
+#: usr/local/www/system_certmanager.php:782
+#: usr/local/www/system_certmanager.php:783
+msgid "Alternative Names"
+msgstr "Nomes Alternativos"
+
+#: usr/local/www/system_certmanager.php:1109
+#: usr/local/www/system_certmanager.php:1112
+#: usr/local/www/system_certmanager.php:1168
+#: usr/local/www/system_certmanager.php:1172
+msgid "export cert+key in .p12"
+msgstr "export cert+key in .p12"
+
+#: usr/local/www/diag_backup.php:192 usr/local/www/diag_backup.php:193
+msgid "RRD Data"
+msgstr "Dados RRD"
+
+#: usr/local/www/firewall_rules_edit.php:224
+#: usr/local/www/firewall_rules_edit.php:237
+#: usr/local/www/firewall_rules_edit.php:222
+#: usr/local/www/firewall_rules_edit.php:236
+#: usr/local/www/firewall_rules_edit.php:219
+#: usr/local/www/firewall_rules_edit.php:233
+#: usr/local/www/firewall_rules_edit.php:225
+#: usr/local/www/firewall_rules_edit.php:239
+msgid "You can not assign a gateway to a rule that applies to IPv4 and IPv6"
+msgstr "Você pode atribuir um gateway a regra que aplicar para IPv4 e IPv6"
+
+#: usr/local/www/firewall_rules_edit.php:249
+#: usr/local/www/firewall_rules_edit.php:248
+#: usr/local/www/firewall_rules_edit.php:245
+#: usr/local/www/firewall_rules_edit.php:251
+msgid "You can not assign a protocol other then ICMP, TCP, UDP or TCP/UDP to a rule that applies to IPv4 and IPv6"
+msgstr "Você não pode atribuir um protocolo diferente de ICMP, TCP, UDP ou TCP/UDP para uma regra que se aplica a IPv4 e IPv6"
+
+#: usr/local/www/firewall_rules_edit.php:253
+#: usr/local/www/firewall_rules_edit.php:252
+#: usr/local/www/firewall_rules_edit.php:249
+#: usr/local/www/firewall_rules_edit.php:255
+msgid "You can not assign a ICMP type to a rule that applies to IPv4 and IPv6"
+msgstr "Você não pode atribuir um tipo ICMP para uma regra que se aplica a IPv4 e IPV6"
+
+#: usr/local/www/firewall_rules_edit.php:416
+#: usr/local/www/firewall_rules_edit.php:415
+#: usr/local/www/firewall_rules_edit.php:418
+#: usr/local/www/firewall_rules_edit.php:424
+msgid "You can not use a IPv4 or IPv6 address in combined IPv4 + IPv6 rules."
+msgstr "Você não pode usar um endereço IPv4 ou IPv6 in regras combinando IPv4 + IPv6."
+
+#: usr/local/www/firewall_rules_edit.php:1285
+#: usr/local/www/firewall_rules_edit.php:1300
+#: usr/local/www/firewall_rules_edit.php:1307
+#: usr/local/www/firewall_rules_edit.php:1306
+#: usr/local/www/firewall_rules_edit.php:1354
+msgid "802.1p"
+msgstr "802.1p"
+
+#: usr/local/www/firewall_rules_edit.php:1308
+#: usr/local/www/firewall_rules_edit.php:1323
+#: usr/local/www/firewall_rules_edit.php:1330
+#: usr/local/www/firewall_rules_edit.php:1341
+#: usr/local/www/firewall_rules_edit.php:1389
+msgid "Choose 802.1p priority to match on"
+msgstr "Escolha a prioridade 802.1p para correspoder "
+
+#: usr/local/www/firewall_rules_edit.php:1312
+#: usr/local/www/firewall_rules_edit.php:1327
+#: usr/local/www/firewall_rules_edit.php:1334
+#: usr/local/www/firewall_rules_edit.php:1345
+#: usr/local/www/firewall_rules_edit.php:1393
+msgid "Choose 802.1p priority to apply"
+msgstr "Escolha a prioridade 802.1p para aplicar"
+
+#: usr/local/www/services_unbound.php:102
+#: usr/local/www/services_unbound_advanced.php:88
+msgid "DNS Resolver"
+msgstr "DNS Resolver"
+
+#: usr/local/www/services_unbound.php:129
+msgid "The configuration for the DNS Resolver, has been changed"
+msgstr "A configuração do DNS Rescolver foi modificada"
+
+#: usr/local/www/services_unbound.php:136
+#: usr/local/www/services_unbound_advanced.php:123
+msgid "General settings"
+msgstr "Configurações Gerais"
+
+# 75%
+#: usr/local/www/services_unbound.php:147
+msgid "General DNS Resolver Options"
+msgstr "Opções gerais do DNS Resolver"
+
+#: usr/local/www/services_unbound.php:153
+msgid "Enable DNS Resolver"
+msgstr "Habilitsar DNS Resolver"
+
+# 94%
+#: usr/local/www/services_unbound.php:157
+msgid "Network interfaces"
+msgstr "Interfaces de rede"
+
+#: usr/local/www/services_unbound.php:172
+msgid "The DNS Resolver Server will listen on the selected interfaces. To add an interface click inside the interface box and select the interface from the drop down."
+msgstr "O servidor DNS Resolver irá ouvir as interfaces selecionadas. Para adicionar uma interface, clique dentro da caixa de interface e selecione uma das opções."
+
+#: usr/local/www/services_unbound.php:177
+msgid "Outgoing interfaces"
+msgstr "Interfaces de saída"
+
+#: usr/local/www/services_unbound.php:192
+msgid "Utilize different network interface(s) that the DNS Resolver will use to send queries to authoritative servers and receive their replies. By default all interfaces are used."
+msgstr "Utilize interfaces de rede diferentes das que o DNS Resolver irá usar para enviar consultas a servidores autoritativos e receber respostas. Por padrão todas as interfaces são usadas."
+
+#: usr/local/www/services_unbound.php:197
+msgid "DNSSEC"
+msgstr "DNSSEC"
+
+#: usr/local/www/services_unbound.php:200
+msgid "Enable DNSSEC Support"
+msgstr "Habilitar suporte a DNSSEC"
+
+# 90%
+#: usr/local/www/services_unbound.php:204
+msgid "Forwarding"
+msgstr "Forwarding"
+
+#: usr/local/www/services_unbound.php:207
+msgid "Enable Forwarding Mode"
+msgstr "Habilitr modo Forwarding"
+
+#: usr/local/www/services_unbound.php:214
+msgid "Register DHCP leases in the DNS Resolver"
+msgstr "Registar DHCP leases no DNS Resolver"
+
+#: usr/local/www/services_unbound.php:215
+#, php-format
+msgid "If this option is set, then machines that specify their hostname when requesting a DHCP lease will be registered in the DNS Resolver, so that their name can be resolved. You should also set the domain in %sSystem: General setup%s to the proper value."
+msgstr "Se esta opções estiver definida, então máquinas que especificarem seu hostname quando requisitando um DHCP lease serão registradas no DNS Resolver, assim seus nomes podem ser resolvidos. Você deve também definir o domínio em %sSistema: Configurações Gerais%s para o valor adequado."
+
+# 77%
+#: usr/local/www/services_unbound.php:226
+msgid "Register DHCP static mappings in the DNS Resolver"
+msgstr "Registrar mapeamentos estáticos DHCP no DNS Resolver"
+
+#: usr/local/www/services_unbound.php:227
+#, php-format
+msgid "If this option is set, then DHCP static mappings will be registered in the DNS Resolver, so that their name can be resolved. You should also set the domain in %sSystem: General setup%s to the proper value."
+msgstr "Se esta opção estiver definida, então mapeamentos estáticos DHCP serão registrados no DNS Resolver, assim seus nomes pode ser resolvidos. Você deve também definir o domínio em %sSistema: Configurações Gerais%s para o valor próprio."
+
+#: usr/local/www/services_unbound.php:254
+#, php-format
+msgid "If the DNS Resolver is enabled, the DHCP service (if enabled) will automatically serve the LAN IP address as a DNS server to DHCP clients so they will use the DNS Resolver. If Forwarding, is enabled, the DNS Resolver will use the DNS servers entered in %sSystem: General setup%s or those obtained via DHCP or PPP on WAN if the &quot;Allow DNS server list to be overridden by DHCP/PPP on WAN&quot; is checked."
+msgstr "Se o DNS Resolver estiver habilitado, o serviço DHCP (se habilitado) irá automaticamente forneceser o endereço IP da LAN como um servidor DNS para clientes DHCP, assim eles irão usar o DNS Resolver. Se o Forwarding estiver habilitado, o DNS Resolver irá usar o servidor DNS informado em %sSistema: Configurações Gerais%s ou aqueles obtidos bia DHCP ou PPP on WAN se a opção &quot;Permitir lista de servidores DNS ser sobrescrita pelo DHCP/PPP na WAN&quot; estiver habilitada."
+
+#: usr/local/www/services_unbound_advanced.php:116
+msgid "The configuration of the DNS Resolver, has been changed"
+msgstr "A configuração do DNS Resolver foi alterada"
+
+#: usr/local/www/services_unbound_advanced.php:134
+msgid "Advanced Resolver Options"
+msgstr "Opções Avançadas do Resolver"
+
+#: usr/local/www/services_unbound_advanced.php:137
+msgid "Hide Identity"
+msgstr "Esconder Identidade"
+
+#: usr/local/www/services_unbound_advanced.php:140
+msgid "If enabled, id.server and hostname.bind queries are refused."
+msgstr "Se habilitado, consultas id.server e hostname.bind são recusadas."
+
+#: usr/local/www/services_unbound_advanced.php:144
+msgid "Hide Version"
+msgstr "Esconder Versão"
+
+#: usr/local/www/services_unbound_advanced.php:147
+msgid "If enabled, version.server and version.bind queries are refused."
+msgstr "Se habilitada, consultas version.server e version.bind são recusadas."
+
+#: usr/local/www/services_unbound_advanced.php:151
+msgid "Prefetch Support"
+msgstr "Prefetch Support"
+
+#: usr/local/www/services_unbound_advanced.php:154
+msgid "Message cache elements are prefetched before they expire to help keep the cache up to date. When enabled, this option can cause an increase of around 10% more DNS traffic and load on the server, but frequently requested items will not expire from the cache."
+msgstr "Elementos de cache de mensagem são pré-carregados antes de expirarem para ajudar a manter o cache atualizado. Quando habilitada, esta opção pode causar um aumento em torno de 10% no tráfego DNS e carga do servidor, itens requisitados frequentemente não irão expirar a partir do cache."
+
+#: usr/local/www/services_unbound_advanced.php:158
+msgid "Prefetch DNS Key Support"
+msgstr "Suporte a Prefetch DNS Key"
+
+#: usr/local/www/services_unbound_advanced.php:161
+#, php-format
+msgid "DNSKEY's are fetched earlier in the validation process when a %sDelegation signer%s is encountered. This helps lower the latency of requests but does utilize a little more CPU."
+msgstr "DNS KEYs são obtidas anteriormente no processo de validação quando uma %sDelegation signer%s é encontrada. Isto ajuda a reduzir a latência das requisições, mas utiliza um pouco mais de CPU."
+
+#: usr/local/www/services_unbound_advanced.php:165
+msgid "Harden Glue"
+msgstr "Harden Glue"
+
+#: usr/local/www/services_unbound_advanced.php:168
+msgid "Only trust glue if it is within the servers authority."
+msgstr "Somente confiar \"glue\" se estiver dentro dos servidores autoritarios"
+
+#: usr/local/www/services_unbound_advanced.php:172
+msgid "Harden DNSSEC data"
+msgstr "Endurecer dados DNSSEC"
+
+#: usr/local/www/services_unbound_advanced.php:175
+msgid "DNSSEC data is required for trust-anchored zones. If such data is absent, the zone becomes bogus. If this is disabled and no DNSSEC data is received, then the zone is made insecure."
+msgstr "Dados de DNSSEC são requeridos para zonas \"trust-anchored\", Se algum dado estiver ausente, a zona se tornará falsa. Se isto estiver desabilitados ou nenhum dado DNSSEC é recebido, a zona ficará insegura."
+
+#: usr/local/www/services_unbound_advanced.php:179
+msgid "Message Cache Size"
+msgstr "Tamanho do Cache de Mensagem"
+
+#: usr/local/www/services_unbound_advanced.php:190
+msgid "Size of the message cache. The message cache stores DNS rcodes and validation statuses. The RRSet cache will automatically be set to twice this amount. The RRSet cache contains the actual RR data. The default is 4 megabytes."
+msgstr "Tamanho do cache de mensagem. O cache de mensagem armazena DNS rcodes e status de validação. O cache RRSet será automaticamente definido para duas vezes este montante. O cahce RRSet contém os dados RR reais. O padrão é 4 megabytes."
+
+#: usr/local/www/services_unbound_advanced.php:194
+msgid "Outgoing TCP Buffers"
+msgstr "Buffers TCP de Saída"
+
+#: usr/local/www/services_unbound_advanced.php:204
+msgid "The number of outgoing TCP buffers to allocate per thread. The default value is 10. If 0 is selected then no TCP queries, to authoritative servers, are done."
+msgstr "O número de buffers TCP de saída a alocar por thread. O valor padrão é 10. Se 0 é selecionado, então nenhuma consulta TCP, para servidores autoritativos, é feita."
+
+#: usr/local/www/services_unbound_advanced.php:208
+msgid "Incoming TCP Buffers"
+msgstr "Buffers TCP de Entrada"
+
+#: usr/local/www/services_unbound_advanced.php:218
+msgid "The number of incoming TCP buffers to allocate per thread. The default value is 10. If 0 is selected then no TCP queries, from clients, are accepted."
+msgstr "O número de buffers TCP de entrada a ser alocados por thread. O valor padrão é 10. Se 0 é selecionado, então nenhuma consulta TCP de clientes é aceita."
+
+#: usr/local/www/services_unbound_advanced.php:222
+msgid "EDNS Buffer Size"
+msgstr "Tamanho do Buffer EDNS"
+
+#: usr/local/www/services_unbound_advanced.php:229
+msgid "Number of bytes size to advertise as the EDNS reassembly buffer size. This is the value that is used in UDP datagrams sent to peers. RFC recommendation is 4096 (which is the default). If you have fragmentation reassemble problems, usually seen as timeouts, then a value of 1480 should help. The 512 value bypasses most MTU path problems, but it can generate an excessive amount of TCP fallback."
+msgstr "Número de bytes de tamanho para anunciar como o tamanho do buffer de remontagem do EDNS. Este é o valor usado em datagramas UDP enviados a outros pares. A recomendação da RFC é 4096 (que é o padrão), o qual é o valor padrão. Se você tem problemas com remontagem de fragmentos, normalmente visto como timeouts, então um valor de 1480 deve ajudar. O valor 512 contorna a maioria dos problemas de caminho com MTU, mas pode gerar um montante excessivo de TCP fallback."
+
+#: usr/local/www/services_unbound_advanced.php:233
+msgid "Number of queries per thread"
+msgstr "Número de consultas por thread"
+
+#: usr/local/www/services_unbound_advanced.php:240
+msgid "The number of queries that every thread will service simultaneously. If more queries arrive that need to be serviced, and no queries can be jostled, then these queries are dropped."
+msgstr "O número de consultas que toda thread irá fornecer simultaneamente. Se mais consultas chegarem, e mais nenhuma puder ser atendida, então elas serão excluídas."
+
+#: usr/local/www/services_unbound_advanced.php:244
+msgid "Jostle Timeout"
+msgstr "Jostle Timeout"
+
+#: usr/local/www/services_unbound_advanced.php:252
+msgid "This timeout is used for when the server is very busy. This protects against denial of service by slow queries or high query rates. The default value is 200 milliseconds."
+msgstr "Este timeout é usado quando o servidor está sobrecarregado. Isto protege contra negação de serviço por consultas lentas ou altas taxas de consultas. O padrão é 200 milisegundos."
+
+#: usr/local/www/services_unbound_advanced.php:256
+msgid "Maximum TTL for RRsets and messages"
+msgstr "TTL Máximo para RRsets e mensagens"
+
+#: usr/local/www/services_unbound_advanced.php:259
+msgid "Configure a maximum Time to live for RRsets and messages in the cache. The default is 86400 seconds (1 day). When the internal TTL expires the cache item is expired. This can be configured to force the resolver to query for data more often and not trust (very large) TTL values."
+msgstr "Configura um Time To Live máximo para RRsets e mensagens em cache. O padrão é 86400 segundos (1 dia). Quando o TTL interno expira, o item de cache é expirado. Isto pode ser configurado para forçar o resolver a consultar dados mais frequentemente e não confiar em valores TTL (muito grandes)."
+
+#: usr/local/www/services_unbound_advanced.php:263
+msgid "Minimum TTL for RRsets and messages"
+msgstr "TTL Mínimo para RRsets e mensagens"
+
+#: usr/local/www/services_unbound_advanced.php:266
+msgid "Configure a minimum Time to live for RRsets and messages in the cache. The default is 0 seconds. If the minimum value kicks in, the data is cached for longer than the domain owner intended, and thus less queries are made to look up the data. The 0 value ensures the data in the cache is as the domain owner intended. High values can lead to trouble as the data in the cache might not match up with the actual data anymore."
+msgstr "Configura um TTL mínimo para RRsets e mensagens no cache. O padrão é 0 segundos. Se o valor mínimo entra em ação, os dados são cacheados por mais tempo que o dono do domínio pretendia e, assim, menos consultas são feitas para buscar dados. O valor 0 garante que os dados em cache está como o dono do domínio pretendia. Valores altos podem levar a problemas já que os dados no cache podem nao mais corresponder com os dados reais."
+
+#: usr/local/www/services_unbound_advanced.php:270
+msgid "TTL for Host cache entries"
+msgstr "TTL para entradas de Hosts no cache"
+
+#: usr/local/www/services_unbound_advanced.php:279
+msgid "Time to live for entries in the host cache. The host cache contains roundtrip timing and EDNS support information. The default is 15 minutes."
+msgstr "Tempo de vida para entradas no cache de host. O cache de host contém o tempo de viagem e informação de suporte EDNS. O padrão é 15 minutos."
+
+#: usr/local/www/services_unbound_advanced.php:283
+msgid "TTL for lame delegation"
+msgstr "TTL para lame delegation"
+
+#: usr/local/www/services_unbound_advanced.php:292
+msgid "Time to live for when a delegation is considered to be lame. The default is 15 minutes."
+msgstr "Tempo de vida para quando a delegação for considerada imperfeita. O padrão é 15 minutos."
+
+#: usr/local/www/services_unbound_advanced.php:296
+msgid "Number of Hosts to cache"
+msgstr "Número de hosts no cache"
+
+#: usr/local/www/services_unbound_advanced.php:305
+msgid "Number of hosts for which information is cached. The default is 10,000."
+msgstr "Número de hosts para os quais as informacões são cacheadas. O padrão é 10.000."
+
+#: usr/local/www/services_unbound_advanced.php:309
+msgid "Unwanted Reply Threshold"
+msgstr "Limite de respostas indesejadas"
+
+#: usr/local/www/services_unbound_advanced.php:319
+msgid "If enabled, a total number of unwanted replies is kept track of in every thread. When it reaches the threshold, a defensive action is taken and a warning is printed to the log file. This defensive action is to clear the RRSet and message caches, hopefully flushing away any poison. The default is disabled, but if enabled a a value of 10 million is suggested."
+msgstr "Se habilitado, um número total de respostas indesejadas são rastreadas em toda thread. Quando o limite é alcançado, uma ação defensiva é tomada en um aviso é impresso no arquivo de log. Esta ação defensiva é para limpar os caches de mensagem e RRset, esperando limpar qualquer envenenamento."
+
+#: usr/local/www/services_unbound_advanced.php:323
+msgid "Log level verbosity"
+msgstr "Log level verbosity"
+
+#: usr/local/www/services_unbound_advanced.php:333
+msgid "Select the log verbosity."
+msgstr "Select the log verbosity."
+
+# 92%
+#: usr/local/www/system_advanced_firewall.php:80
+#: usr/local/www/system_advanced_firewall.php:91
+#: usr/local/www/system_advanced_firewall.php:96
+msgid "The Firewall Maximum Tables value must be an integer."
+msgstr "O valor de Máximo de Tabelas de Firewall deve ser um inteiro."
+
+# 82%
+#: usr/local/www/system_advanced_firewall.php:326
+#: usr/local/www/system_advanced_firewall.php:370
+#: usr/local/www/system_advanced_firewall.php:371
+#: usr/local/www/system_advanced_firewall.php:382
+msgid "Firewall Maximum Tables"
+msgstr "Máximo de Tabelas de Firewall"
+
+#: usr/local/www/system_advanced_firewall.php:330
+#: usr/local/www/system_advanced_firewall.php:374
+#: usr/local/www/system_advanced_firewall.php:375
+#: usr/local/www/system_advanced_firewall.php:386
+msgid "Maximum number of tables for systems such as aliases, sshlockout, snort, etc, combined."
+msgstr "Número máximo de tables para sistemas como aliases, sshlockout, snort, etc, combinados."
+
+#: usr/local/www/system_advanced_firewall.php:331
+#: usr/local/www/system_advanced_firewall.php:375
+#: usr/local/www/system_advanced_firewall.php:376
+#: usr/local/www/system_advanced_firewall.php:387
+msgid "This is the actual number of tables, not the number of entries inside the tables (see below)"
+msgstr "Este é o número real de tabelas, não o número de entradas dentro das tabelas (veja abaixo)"
+
+#: usr/local/www/system_advanced_firewall.php:393
+#: usr/local/www/system_advanced_firewall.php:437
+#: usr/local/www/system_advanced_firewall.php:438
+#: usr/local/www/system_advanced_firewall.php:449
+msgid "Disable Negate rule on policy routing rules"
+msgstr "Desabilitar regra de negação nas regras de política de roteamento"
+
+#: usr/local/www/system_advanced_firewall.php:395
+#: usr/local/www/system_advanced_firewall.php:439
+#: usr/local/www/system_advanced_firewall.php:440
+#: usr/local/www/system_advanced_firewall.php:451
+msgid "With Multi-WAN you generally want to ensure traffic reaches directly connected networks and VPN networks when using policy routing. You can disable this for special purposes but it requires manually creating rules for these networks"
+msgstr "Com Multi-WAN você geralmente quer garantir que o tráfego chegue as redes conectadas e redes VPN quando usando política de roteamento. Você pode desabilitar isto para propósitos especiais, mas isto requeter criar regras manualmente para estas redes"
+
+#: usr/local/www/system_advanced_firewall.php:407
+#: usr/local/www/system_advanced_firewall.php:469
+#: usr/local/www/system_advanced_firewall.php:470
+#: usr/local/www/system_advanced_firewall.php:491
+msgid "NAT Reflection mode for port forwards"
+msgstr "Modo NAT Reflection para redirecionamento de portas"
+
+#: usr/local/www/system_advanced_firewall.php:411
+#: usr/local/www/firewall_nat_edit.php:794
+#: usr/local/www/firewall_nat_edit.php:793
+#: usr/local/www/firewall_nat_edit.php:788
+#: usr/local/www/system_advanced_firewall.php:473
+#: usr/local/www/firewall_nat_edit.php:800
+#: usr/local/www/system_advanced_firewall.php:474
+#: usr/local/www/firewall_nat_edit.php:801
+#: usr/local/www/system_advanced_firewall.php:495
+msgid "Enable (NAT + Proxy)"
+msgstr "Habilitar (NAT + Proxy)"
+
+#: usr/local/www/system_advanced_firewall.php:412
+#: usr/local/www/firewall_nat_edit.php:795
+#: usr/local/www/firewall_nat_edit.php:794
+#: usr/local/www/firewall_nat_edit.php:789
+#: usr/local/www/system_advanced_firewall.php:474
+#: usr/local/www/firewall_nat_edit.php:801
+#: usr/local/www/system_advanced_firewall.php:475
+#: usr/local/www/firewall_nat_edit.php:802
+#: usr/local/www/system_advanced_firewall.php:496
+msgid "Enable (Pure NAT)"
+msgstr "Habilitar (NAT Puro)"
+
+#: usr/local/www/system_advanced_firewall.php:415
+#: usr/local/www/system_advanced_firewall.php:477
+#: usr/local/www/system_advanced_firewall.php:478
+#: usr/local/www/system_advanced_firewall.php:499
+msgid "When enabled, this automatically creates additional NAT redirect rules for access to port forwards on your external IP addresses from within your internal networks."
+msgstr "Quando habilitado, isto automaticamente cria regras NAT de redirecionamento adicionais para acessar redirecionamento de portas no seu endereço IP externo de dentro de sua rede interna."
+
+#: usr/local/www/system_advanced_firewall.php:417
+#: usr/local/www/system_advanced_firewall.php:479
+#: usr/local/www/system_advanced_firewall.php:480
+#: usr/local/www/system_advanced_firewall.php:501
+msgid "The NAT + proxy mode uses a helper program to send packets to the target of the port forward. It is useful in setups where the interface and/or gateway IP used for communication with the target cannot be accurately determined at the time the rules are loaded. Reflection rules are not created for ranges larger than 500 ports and will not be used for more than 1000 ports total between all port forwards. Only TCP and UDP protocols are supported."
+msgstr "O modo NAT + Proxy usa um programa auxiliar para enviar pacotes para o alvo do redirecionamento de porta. Isto é útil em setups onde a interface e/ou IP do gateway usados para comunicação com o alvo não podem ser precisamente determinados no momento que as regras são carregadas. Regras de Reflexão não são criadas para ranges maiores que 500 portas e não serão usados por mais que o total de 1000 portas entre todos os redirecionamentos de portas. Apenas protocolos TCP e UDP são suportados."
+
+#: usr/local/www/system_advanced_firewall.php:419
+#: usr/local/www/system_advanced_firewall.php:481
+#: usr/local/www/system_advanced_firewall.php:482
+#: usr/local/www/system_advanced_firewall.php:503
+msgid "The pure NAT mode uses a set of NAT rules to direct packets to the target of the port forward. It has better scalability, but it must be possible to accurately determine the interface and gateway IP used for communication with the target at the time the rules are loaded. There are no inherent limits to the number of ports other than the limits of the protocols. All protocols available for port forwards are supported."
+msgstr "O modo NAT puro usa um conjunto de regras NAT para direcionar pacotes para o alvo do redirecionamento de porta. Ele tem melhor escalabilidade, masdeve ser possível determinar com precisão a interface e IP do gateway usado para comunicação com o alvo quando as regras são carregadas. Não há limites inerente ao número de portas que não sejam os limites dos protocolos. Todos os disponíveis para redirecionamento de portas são suportados."
+
+#: usr/local/www/system_advanced_firewall.php:421
+#: usr/local/www/system_advanced_firewall.php:441
+#: usr/local/www/system_advanced_firewall.php:483
+#: usr/local/www/system_advanced_firewall.php:503
+#: usr/local/www/system_advanced_firewall.php:484
+#: usr/local/www/system_advanced_firewall.php:504
+#: usr/local/www/system_advanced_firewall.php:505
+#: usr/local/www/system_advanced_firewall.php:525
+msgid "Individual rules may be configured to override this system setting on a per-rule basis."
+msgstr "Regras individuais devem ser configuradas para "
+
+#: usr/local/www/system_advanced_firewall.php:428
+#: usr/local/www/system_advanced_firewall.php:490
+#: usr/local/www/system_advanced_firewall.php:491
+#: usr/local/www/system_advanced_firewall.php:512
+msgid "Enter value for Reflection timeout in seconds."
+msgstr "Entre com um valor de tempo de vida de Reflexão em segundos"
+
+#: usr/local/www/system_advanced_firewall.php:430
+#: usr/local/www/system_advanced_firewall.php:492
+#: usr/local/www/system_advanced_firewall.php:493
+#: usr/local/www/system_advanced_firewall.php:514
+msgid "Note: Only applies to Reflection on port forwards in NAT + proxy mode."
+msgstr "Nota: Somente é aplicado a Reflexão em portas redirecionadas em NAT + modo proxy."
+
+# 91%
+#: usr/local/www/system_advanced_firewall.php:434
+#: usr/local/www/system_advanced_firewall.php:496
+#: usr/local/www/system_advanced_firewall.php:497
+#: usr/local/www/system_advanced_firewall.php:518
+msgid "Enable NAT Reflection for 1:1 NAT"
+msgstr "Habilitar NAT Reflection para 1:1 NAT"
+
+#: usr/local/www/system_advanced_firewall.php:437
+#: usr/local/www/system_advanced_firewall.php:499
+#: usr/local/www/system_advanced_firewall.php:500
+#: usr/local/www/system_advanced_firewall.php:521
+msgid "Enables the automatic creation of additional NAT redirect rules for access to 1:1 mappings of your external IP addresses from within your internal networks."
+msgstr "Habilita a criação automatica de regras adcionais de redirecionamento do NAT para acesso a mapeamento 1:1 do seu endereço de IP externo de dentro de suas redes internas."
+
+#: usr/local/www/system_advanced_firewall.php:439
+#: usr/local/www/system_advanced_firewall.php:501
+#: usr/local/www/system_advanced_firewall.php:502
+#: usr/local/www/system_advanced_firewall.php:523
+msgid "Note: Reflection on 1:1 mappings is only for the inbound component of the 1:1 mappings. This functions the same as the pure NAT mode for port forwards. For more details, refer to the pure NAT mode description above."
+msgstr "Nota: Reflexão em mapeamento 1:1 é somente para componentes de entrada de mapeamentos 1:1. Estas funções são as mesmas de um modo puro NAT de redirecionamento de porta. Para mais detalhes, veja a descrição acima sobre modo puro NAT."
+
+#: usr/local/www/system_advanced_firewall.php:445
+#: usr/local/www/system_advanced_firewall.php:507
+#: usr/local/www/system_advanced_firewall.php:508
+#: usr/local/www/system_advanced_firewall.php:529
+msgid "Enable automatic outbound NAT for Reflection"
+msgstr "Habilita a saída de NAT automatica para Reflexão"
+
+#: usr/local/www/system_advanced_firewall.php:450
+#: usr/local/www/system_advanced_firewall.php:512
+#: usr/local/www/system_advanced_firewall.php:513
+#: usr/local/www/system_advanced_firewall.php:534
+msgid "Required for full functionality of the pure NAT mode of NAT Reflection for port forwards or NAT Reflection for 1:1 NAT."
+msgstr "Requerido para funcionalidade completa do modo puro NAT de uma Reflexão de NAT para portas redirecionadas ou Reflexão de NAT para NAT 1:1."
+
+#: usr/local/www/system_advanced_firewall.php:452
+#: usr/local/www/system_advanced_firewall.php:514
+#: usr/local/www/system_advanced_firewall.php:515
+#: usr/local/www/system_advanced_firewall.php:536
+msgid "Note: This only works for assigned interfaces. Other interfaces require manually creating the outbound NAT rules that direct the reply packets back through the router."
+msgstr "Nota: Isto somente trabalha para interfaces atribuidas. Outras interfaces requerem a criação manual de regras de NAT de saída para regras que direcionam a respostas de pacotes através do roteador."
+
+# 91%
+#: usr/local/www/diag_logs_ntpd.php:85 usr/local/www/diag_logs_ntpd.php:86
+#, php-format
+msgid "Last %s NTP log entries"
+msgstr "Últimas %s entradas de log NTP"
+
+#: usr/local/www/firewall_aliases_edit.php:468
+#: usr/local/www/firewall_aliases_edit.php:470
+#: usr/local/www/firewall_aliases_edit.php:492
+#: usr/local/www/firewall_aliases_edit.php:491
+msgid "Enter as many hosts as you would like. Hosts must be specified by their IP address or fully qualified domain name (FQDN). FQDN hostnames are periodically re-resolved and updated. If multiple IPs are returned by a DNS query, all are used."
+msgstr "Entre com tantos hosts como você gostaria. Hosts deve ser especificado pelo seu endereço IP ou nome de domínio totalmente qualificado FQDN. Nomes de host FQDN são periodicamente re-resolvido e atualizado. Se vários IPs são retornados por uma consulta DNS, todos são usados."
+
+# 77%
+#: usr/local/www/firewall_aliases_edit.php:590
+#: usr/local/www/firewall_aliases_edit.php:593
+#: usr/local/www/firewall_aliases_edit.php:624
+#: usr/local/www/firewall_aliases_edit.php:623
+msgid "The name of the alias may only consist of the characters \"a-z, A-Z, 0-9 and _\"."
+msgstr "O nome do alias somente deve consistir dos caracteres de \"a-z, A-Z, 0-9 e _\""
+
+# 93%
+#: usr/local/www/system_advanced_admin.php:470
+#: usr/local/www/system_advanced_admin.php:507
+msgid "Disable password login for Secure Shell (RSA/DSA key only)"
+msgstr "Desabilitar login com senha para Secure Shell (somente chave RSA/DSA)"
+
+#: usr/local/www/pkg_mgr_installed.php:113 usr/local/www/diag_confbak.php:154
+#: usr/local/www/pkg_mgr_installed.php:115
+msgid "Version"
+msgstr "Versão"
+
+#: usr/local/www/pkg_mgr_installed.php:197
+#: usr/local/www/pkg_mgr_installed.php:199
+msgid "Click on "
+msgstr "Clique em"
+
+# 85%
+#: usr/local/www/pkg_mgr_installed.php:205
+#: usr/local/www/pkg_mgr_installed.php:208
+#: usr/local/www/pkg_mgr_installed.php:210
+msgid "Remove "
+msgstr "Remove"
+
+# 90%
+#: usr/local/www/pkg_mgr_installed.php:209
+#: usr/local/www/pkg_mgr_installed.php:212
+#: usr/local/www/pkg_mgr_installed.php:215
+#: usr/local/www/pkg_mgr_installed.php:214
+#: usr/local/www/pkg_mgr_installed.php:217
+msgid "Reinstall "
+msgstr "Reinstalar"
+
+#: usr/local/www/system_advanced_notifications.php:262
+#: usr/local/www/system_advanced_notifications.php:309
+msgid "System Sounds"
+msgstr "Sons do Sistema"
+
+#: usr/local/www/system_advanced_notifications.php:265
+#: usr/local/www/system_advanced_notifications.php:312
+msgid "Startup/Shutdown Sound"
+msgstr "Som de Inicio/Desligamento"
+
+#: usr/local/www/system_advanced_notifications.php:268
+#: usr/local/www/system_advanced_notifications.php:315
+msgid "Disable the startup/shutdown beep"
+msgstr "Desabilita o beep de inicialização/desligamento"
+
+#: usr/local/www/system_advanced_notifications.php:270
+#: usr/local/www/system_advanced_notifications.php:317
+msgid "When this is checked, startup and shutdown sounds will no longer play."
+msgstr "Quando isto esta marcado, os sons de inicialização e desligamento não vão mais tocar."
+
+#: usr/local/www/status_rrd_graph.php:146
+#: usr/local/www/status_rrd_graph.php:151
+msgid "Invalid start date/time:"
+msgstr "Data/hora inicial inválida:"
+
+#: usr/local/www/status_rrd_graph.php:159
+#: usr/local/www/status_rrd_graph.php:164
+msgid "Invalid end date/time:"
+msgstr "Data/hora final inválida:"
+
+#: usr/local/www/status_rrd_graph.php:509
+#: usr/local/www/status_rrd_graph.php:544
+msgid "Enter date and/or time. Current timezone:"
+msgstr "Entre com data e/ou hora. Fuso horario atual:"
+
+#: usr/local/www/status_ntpd.php:109 usr/local/www/status_ntpd.php:125
+#: usr/local/www/status_ntpd.php:131
+msgid "Ref ID"
+msgstr "ID de Ref."
+
+#: usr/local/www/status_ntpd.php:110 usr/local/www/status_ntpd.php:126
+#: usr/local/www/status_ntpd.php:132
+msgid "Stratum"
+msgstr "Stratum"
+
+#: usr/local/www/status_ntpd.php:112 usr/local/www/status_ntpd.php:128
+#: usr/local/www/status_ntpd.php:134
+msgid "When"
+msgstr "Quando"
+
+# 75%
+#: usr/local/www/status_ntpd.php:113 usr/local/www/status_ntpd.php:129
+#: usr/local/www/status_ntpd.php:135
+msgid "Poll"
+msgstr "Votação"
+
+#: usr/local/www/status_ntpd.php:114 usr/local/www/status_ntpd.php:130
+#: usr/local/www/status_ntpd.php:136
+msgid "Reach"
+msgstr "Alcance"
+
+#: usr/local/www/status_ntpd.php:116 usr/local/www/status_ntpd.php:132
+#: usr/local/www/status_ntpd.php:138
+msgid "Offset"
+msgstr "Compensação"
+
+#: usr/local/www/status_ntpd.php:117 usr/local/www/status_ntpd.php:133
+#: usr/local/www/status_ntpd.php:139
+msgid "Jitter"
+msgstr "Jitter"
+
+#: usr/local/www/firewall_rules.php:790 usr/local/www/firewall_rules.php:783
+#: usr/local/www/firewall_rules.php:784
+msgid "No floating rules are currently defined."
+msgstr "Nenhuma regra flutuante foi definida."
+
+#: usr/local/www/system_advanced_misc.php:297
+#: usr/local/www/system_advanced_misc.php:316
+#: usr/local/www/system_advanced_misc.php:320
+#: usr/local/www/system_advanced_misc.php:367
+#: usr/local/www/system_advanced_misc.php:373
+msgid "Successive connections will be redirected to the servers in a round-robin manner with connections from the same source being sent to the same web server. This 'sticky connection' will exist as long as there are states that refer to this connection. Once the states expire, so will the sticky connection. Further connections from that host will be redirected to the next web server in the round robin. Changing this option will restart the Load Balancing service."
+msgstr "Conexões sucessivas serão redirecionadas para os servidores de um modo round-robin com conexões a partir da mesma fonte que está sendo enviado para o mesmo servidor web. Esta \"sticky connection\" vai existir enquanto há estados que se referem a esta conexão. Uma vez que os estados expirar, assim que a conexão pegajosa. Outras conexões do que o anfitrião será redirecionado para o próximo servidor web no round robin. Mudando esta opção irá reiniciar o serviço de balanceamento de carga."
+
+#: usr/local/www/system_advanced_misc.php:308
+#: usr/local/www/system_advanced_misc.php:327
+#: usr/local/www/system_advanced_misc.php:331
+#: usr/local/www/system_advanced_misc.php:378
+#: usr/local/www/system_advanced_misc.php:384
+msgid "Set the source tracking timeout for sticky connections. By default this is 0, so source tracking is removed as soon as the state expires. Setting this timeout higher will cause the source/destination relationship to persist for longer periods of time."
+msgstr "Defina o tempo limite de rastreamento de origem para conexões pegajosos. Por padrão é 0, portanto, rastreamento de origem é removida assim que o estado expira. Definir o tempo limite superior fará com que o relacionamento origem/destino de persistir por longos períodos de tempo."
+
+#: usr/local/www/system_advanced_misc.php:336
+#: usr/local/www/system_advanced_misc.php:355
+#: usr/local/www/system_advanced_misc.php:359
+#: usr/local/www/system_advanced_misc.php:367
+#: usr/local/www/system_advanced_misc.php:406
+#: usr/local/www/system_advanced_misc.php:414
+#: usr/local/www/system_advanced_misc.php:412
+#: usr/local/www/system_advanced_misc.php:420
+msgid "Hiadaptive"
+msgstr "Hiadaptive"
+
+#: usr/local/www/system_advanced_misc.php:337
+#: usr/local/www/system_advanced_misc.php:356
+#: usr/local/www/system_advanced_misc.php:360
+#: usr/local/www/system_advanced_misc.php:368
+#: usr/local/www/system_advanced_misc.php:407
+#: usr/local/www/system_advanced_misc.php:415
+#: usr/local/www/system_advanced_misc.php:413
+#: usr/local/www/system_advanced_misc.php:421
+msgid "Adaptive"
+msgstr "Adaptável"
+
+#: usr/local/www/system_advanced_misc.php:338
+#: usr/local/www/system_advanced_misc.php:357
+#: usr/local/www/system_advanced_misc.php:361
+#: usr/local/www/system_advanced_misc.php:369
+#: usr/local/www/system_advanced_misc.php:408
+#: usr/local/www/system_advanced_misc.php:416
+#: usr/local/www/system_advanced_misc.php:414
+#: usr/local/www/system_advanced_misc.php:422
+msgid "Minimum"
+msgstr "Mínimo"
+
+#: usr/local/www/system_advanced_misc.php:339
+#: usr/local/www/system_advanced_misc.php:358
+#: usr/local/www/system_advanced_misc.php:362
+#: usr/local/www/system_advanced_misc.php:370
+#: usr/local/www/system_advanced_misc.php:409
+#: usr/local/www/system_advanced_misc.php:417
+#: usr/local/www/system_advanced_misc.php:415
+#: usr/local/www/system_advanced_misc.php:423
+msgid "Maximum"
+msgstr "Máximo"
+
+#: usr/local/www/system_advanced_misc.php:342
+#: usr/local/www/system_advanced_misc.php:361
+#: usr/local/www/system_advanced_misc.php:373
+#: usr/local/www/system_advanced_misc.php:420
+msgid "The powerd utility monitors the system state and sets various power control options accordingly. It offers four modes (maximum, minimum, adaptive and hiadaptive) that can be individually selected while on AC power or batteries. The modes maximum, minimum, adaptive and hiadaptive may be abbreviated max, min, adp, hadp. Maximum mode chooses the highest performance values. Minimum mode selects the lowest performance values to get the most power savings. Adaptive mode attempts to strike a balance by degrading performance when the system appears idle and increasing it when the system is busy. It offers a good balance between a small performance loss for greatly increased power savings. Hiadaptive mode is alike adaptive mode, but tuned for systems where performance and interactivity are more importantthan power consumption. It rises frequency faster, drops slower andkeeps twice lower CPU load."
+msgstr "O utilitário powerd monitora o estado do sistema e define várias opções de controle de energia em conformidade. Ele oferece quatro modos (máximo, mínimo, adaptativas e hiadaptive) que podem ser selecionados individualmente durante a alimentação por AC ou baterias. Os modos de máximo, mínimo, adaptativos e hiadaptive pode ser abreviado max, min, adp, hadp. Modo máxima escolhe os mais altos valores de desempenho. Modo mínima seleciona os valores mais baixos de desempenho para obter o máximo de poupança de energia. O modo adaptativo tenta encontrar um equilíbrio, degradando o desempenho quando o sistema parece ocioso e aumentando-a quando o sistema está ocupado. Ele oferece um bom equilíbrio entre uma pequena perda de desempenho para um grande aumento de economia de energia. Hiadaptive modo é o modo adaptativo iguais, mas atento para sistemas onde o desempenho ea interatividade são o consumo de energia mais importantthan. Levanta-se freqüência mais rápido, cai andkeeps mais lentas de carga duas vezes menor CPU."
+
+#: usr/local/www/firewall_shaper_vinterface.php:204
+#: usr/local/www/firewall_shaper_vinterface.php:228
+#: usr/local/www/firewall_shaper_vinterface.php:205
+#: usr/local/www/firewall_shaper_vinterface.php:230
+msgid "You cannot name a child queue with the same name as a parent limiter"
+msgstr "Você não pode nomear uma fila filho com o mesmo nome do limitador parente."
+
+#: usr/local/www/diag_routes.php:72 usr/local/www/diag_routes.php:73
+msgid "By enabling name resolution, the query should take a bit longer. You can stop it at any time by clicking the Stop button in your browser."
+msgstr "Habilitando a resolução de nome, a requisição deve demorar um pouco mais. Você pode parar isso a qualquer momento clicando no botão \"Parar\" no seu navegador."
+
+#: usr/local/www/status_dhcpv6_leases.php:481
+#: usr/local/www/status_dhcpv6_leases.php:482
+#: usr/local/www/status_dhcpv6_leases.php:485
+msgid "IPv6 Prefix"
+msgstr "Prefixo IPv6"
+
+#: usr/local/www/services_captiveportal.php:465
+#: usr/local/www/services_captiveportal.php:463
+#: usr/local/www/services_captiveportal.php:481
+msgid "This setting limits the number of concurrent connections to the captive portal HTTP(S) server. This does not set how many users can be logged in to the captive portal, but rather how many users can load the portal page or authenticate at the same time! Possible setting allowed is: minimum 4 connections per client IP address, with a total maximum of 100 connections."
+msgstr "Esta configuração limita o número de conexões simultâneas ao HTTP portal cativo (S) do servidor. Isso não define quantos usuários podem ser registradas no portal cativo, mas sim quantos usuários podem carregar a página do portal ou autenticar ao mesmo tempo! Regulação possível permitido é: 4 conexões mínimos por endereço IP do cliente, com um total máximo de 100 conexões."
+
+#: usr/local/www/services_captiveportal.php:602
+#: usr/local/www/services_captiveportal.php:600
+#: usr/local/www/services_captiveportal.php:601
+#: usr/local/www/services_captiveportal.php:617
+msgid "RADIUS Protocol"
+msgstr "Protocolo Radius"
+
+#: usr/local/www/services_captiveportal.php:611
+#: usr/local/www/services_captiveportal.php:609
+#: usr/local/www/services_captiveportal.php:610
+#: usr/local/www/services_captiveportal.php:626
+msgid "CHAP_MD5"
+msgstr "CHAP_MD5"
+
+#: usr/local/www/services_captiveportal.php:615
+#: usr/local/www/services_captiveportal.php:613
+#: usr/local/www/services_captiveportal.php:614
+#: usr/local/www/services_captiveportal.php:630
+msgid "MSCHAPv1"
+msgstr "MSCHAPv1"
+
+#: usr/local/www/services_captiveportal.php:619
+#: usr/local/www/services_captiveportal.php:617
+#: usr/local/www/services_captiveportal.php:618
+#: usr/local/www/services_captiveportal.php:634
+msgid "MSCHAPv2"
+msgstr "MSCHAPv2"
+
+#: usr/local/www/system_gateways_edit.php:389
+#: usr/local/www/system_gateways_edit.php:495
+#: usr/local/www/system_gateways_edit.php:497
+#: usr/local/www/system_gateways_edit.php:527
+msgid "Choose the Internet Protocol this gateway uses."
+msgstr "Escolha o protocolo de Internet que o gateway usa."
+
+#: usr/local/www/system_gateways_edit.php:490
+msgid "This defines how often that an icmp probe will be sent in seconds. Default is 1."
+msgstr "Isto define quantas vezes a consulta icmp vai ser enviada em segundos. O padrão é 1."
+
+#: usr/local/www/system_gateways_edit.php:491
+#: usr/local/www/system_gateways_edit.php:597
+#: usr/local/www/system_gateways_edit.php:601
+#: usr/local/www/system_gateways_edit.php:603
+#: usr/local/www/system_gateways_edit.php:633
+msgid "NOTE: The quality graph is averaged over seconds, not intervals, so as the frequency probe is increased the accuracy of the quality graph is decreased."
+msgstr "NOTA: A gráfico de qualidade é uma média sobre segundos, não intervalos. assim como a consulta de frequencia é aumentada o gráfico de qualidade é diminuida."
+
+#: usr/local/www/system_gateways_edit.php:500
+msgid "This defines the number of bad probes before the alarm will fire. Default is 10."
+msgstr "Isto define o número de consultas ruins para o alarme ser acionado. O padrão é 10."
+
+#: usr/local/www/system_gateways_edit.php:505
+msgid "NOTE: The total time before a gateway is down is the product of the Frequency Probe and the Down fields. By default this is 1*10=10 seconds."
+msgstr "NOTA: O total de tempo antes de um gateway cair é o produto da frequencia de consultas e de quedas. Por padrão isso é 1*10=10 segundos."
+
+#: usr/local/www/status_gateways.php:100 usr/local/www/status_gateways.php:108
+#: usr/local/www/status_gateways.php:134
+#: usr/local/www/widgets/widgets/gateways.widget.php:73
+#: usr/local/www/widgets/widgets/gateways.widget.php:81
+#: usr/local/www/status_gateways.php:101 usr/local/www/status_gateways.php:109
+#: usr/local/www/status_gateways.php:135
+#: usr/local/www/widgets/widgets/gateways.widget.php:94
+#: usr/local/www/widgets/widgets/gateways.widget.php:103
+#: usr/local/www/widgets/widgets/gateways.widget.php:95
+#: usr/local/www/widgets/widgets/gateways.widget.php:104
+msgid "Pending"
+msgstr "Pendente"
+
+# 76%
+#: usr/local/www/status_gateways.php:140 usr/local/www/status_gateways.php:141
+msgid "Last check:"
+msgstr "Última checagem:"
+
+# 95%
+#: usr/local/www/diag_dump_states.php:145
+#: usr/local/www/diag_dump_states.php:144
+msgid "Current state count"
+msgstr "Contagem de estado atual:"
+
+#: usr/local/www/diag_dump_states.php:147
+#: usr/local/www/diag_dump_states.php:146
+msgid "Matching filter"
+msgstr "Correspondência de filtro"
+
+#: usr/local/www/diag_dump_states.php:155
+#: usr/local/www/diag_dump_states.php:154
+#: usr/local/www/diag_dump_states.php:143
+msgid "Kill"
+msgstr "Matar"
+
+#: usr/local/www/services_dyndns.php:184 usr/local/www/services_dyndns.php:180
+#: usr/local/www/services_dyndns.php:191
+msgid "You can force an update for an IP address on the edit page for that service."
+msgstr "Você pode forçar uma atualização do endereço de IP editando na página para este serviço."
+
+#: usr/local/www/vpn_openvpn_server.php:299
+#: usr/local/www/vpn_openvpn_server.php:300
+#: usr/local/www/vpn_openvpn_server.php:321
+msgid "Using a tunnel network and server bridge settings together is not allowed."
+msgstr "Usando uma rede de túnel e as configurações do servidor bridge juntos não é permitido."
+
+#: usr/local/www/vpn_openvpn_server.php:302
+#: usr/local/www/vpn_openvpn_server.php:303
+#: usr/local/www/vpn_openvpn_server.php:324
+msgid "Server Bridge DHCP Start and End must both be empty, or defined."
+msgstr "Inicio e fim do servidor DHCP bridge devem estar vazios ou definidos."
+
+#: usr/local/www/vpn_openvpn_server.php:304
+#: usr/local/www/vpn_openvpn_server.php:305
+#: usr/local/www/vpn_openvpn_server.php:326
+msgid "Server Bridge DHCP Start must be an IPv4 address."
+msgstr "Inicio do servidor bridge DHCP deve ser um endereço IPv4."
+
+#: usr/local/www/vpn_openvpn_server.php:306
+#: usr/local/www/vpn_openvpn_server.php:307
+#: usr/local/www/vpn_openvpn_server.php:328
+msgid "Server Bridge DHCP End must be an IPv4 address."
+msgstr "Final do servidor bridge DHCP deve ser um endereço IPv4."
+
+#: usr/local/www/vpn_openvpn_server.php:308
+#: usr/local/www/vpn_openvpn_server.php:309
+#: usr/local/www/vpn_openvpn_server.php:330
+msgid "The Server Bridge DHCP range is invalid (start higher than end)."
+msgstr "A faixa do Servidor Bridge DHCP é inválida (inicio é maior que o final)"
+
+#: usr/local/www/vpn_openvpn_server.php:1084
+#: usr/local/www/vpn_openvpn_server.php:1112
+#: usr/local/www/vpn_openvpn_server.php:1139
+msgid "Bridge DHCP"
+msgstr "Bridge DHCP"
+
+#: usr/local/www/vpn_openvpn_server.php:1094
+#: usr/local/www/vpn_openvpn_server.php:1122
+#: usr/local/www/vpn_openvpn_server.php:1149
+msgid "Allow clients on the bridge to obtain DHCP."
+msgstr "Permite ao clientes da bridge obterem DHCP."
+
+#: usr/local/www/vpn_openvpn_server.php:1102
+#: usr/local/www/vpn_openvpn_server.php:1130
+#: usr/local/www/vpn_openvpn_server.php:1157
+msgid "Bridge Interface"
+msgstr "Interface Bridge"
+
+#: usr/local/www/vpn_openvpn_server.php:1124
+msgid "The interface to which this tap instance will be, bridged. This is not done automatically. You must assign this interface and create the bridge separately. This setting controls which existing IP address and subnet mask are used by OpenVPN for the bridge. Setting this to 'none' will cause the Server Bridge DHCP settings below to be ignored."
+msgstr "A interface para que esta instância torneira será, em ponte. Isto não é feito automaticamente. Você deve atribuir essa interface e criar a ponte separadamente. Esta definição controla qual o endereço IP existente e máscara de subrede são usados ¿¿por OpenVPN para a ponte. A definição como 'none' fará com que as configurações do servidor DHCP Ponte abaixo para ser ignorado."
+
+#: usr/local/www/vpn_openvpn_server.php:1133
+#: usr/local/www/vpn_openvpn_server.php:1161
+#: usr/local/www/vpn_openvpn_server.php:1188
+msgid "Server Bridge DHCP Start"
+msgstr "Servidor Bridge DHCP Inicial"
+
+#: usr/local/www/vpn_openvpn_server.php:1137
+msgid "When using tap mode as multi-point server, you may optionally supply a DHCP range to use on the interface to which this tap instance is bridged. If these settings are left blank, DHCP will be passed through to the LAN, and the interface setting above will be ignored."
+msgstr "Ao usar o modo tap como servidor multi-ponto, você pode, opcionalmente, fornecer uma gama DHCP para usar na interface para que esta instância torneira está superado. Se essas configurações são deixadas em branco, DHCP será repassado para a LAN, ea interface de configuração acima serão ignorados."
+
+#: usr/local/www/vpn_openvpn_server.php:1146
+#: usr/local/www/vpn_openvpn_server.php:1174
+#: usr/local/www/vpn_openvpn_server.php:1201
+msgid "Server Bridge DHCP End"
+msgstr "Servidor Bridge DHCP Final"
+
+#: usr/local/www/services_dhcp.php:239 usr/local/www/services_dhcpv6.php:216
+#: usr/local/www/services_router_advertisements.php:159
+#: usr/local/www/services_dhcp.php:285 usr/local/www/services_dhcpv6.php:201
+#: usr/local/www/services_dhcp_edit.php:230
+#: usr/local/www/services_dhcp.php:266 usr/local/www/services_dhcpv6.php:195
+#: usr/local/www/services_router_advertisements.php:154
+#: usr/local/www/services_dhcp.php:286 usr/local/www/services_dhcp.php:287
+msgid "A valid domain search list must be specified."
+msgstr "Uma lista de pesquisa de domínio válido deve ser especificado."
+
+#: usr/local/www/services_dhcp.php:685 usr/local/www/services_dhcp.php:861
+#: usr/local/www/services_dhcp_edit.php:427
+#: usr/local/www/services_dhcp.php:875 usr/local/www/services_dhcp.php:895
+msgid "The DHCP server can optionally provide a domain search list. Use the semicolon character as seperator "
+msgstr "O servidor DHCP pode, opcionalmente, fornecer uma lista de pesquisa de domínios. Use o caractere ponto e vírgula como separador"
+
+#: usr/local/www/services_dhcp.php:735 usr/local/www/services_dhcpv6.php:716
+#: usr/local/www/services_dhcp.php:916 usr/local/www/services_dhcpv6.php:647
+#: usr/local/www/services_dhcp.php:930 usr/local/www/services_dhcpv6.php:664
+#: usr/local/www/services_dhcp.php:950 usr/local/www/services_dhcp.php:962
+msgid "Time format change"
+msgstr "Alteração de formato de hora"
+
+#: usr/local/www/services_dhcp.php:744 usr/local/www/services_dhcp.php:925
+#: usr/local/www/services_dhcp.php:939 usr/local/www/services_dhcp.php:959
+#: usr/local/www/services_dhcp.php:971
+msgid "Change DHCP display lease time from UTC to local time."
+msgstr "Alterar tempo de concessão DHCP exibição de UTC para a hora local."
+
+#: usr/local/www/services_dhcp.php:751 usr/local/www/services_dhcp.php:932
+msgid ""
+"By default DHCP leases are displayed in UTC time. By checking this \n"
+"\t\t\t\t\t\tbox DHCP lease time will be displayed in local time and set to time zone selected. This will be used for all DHCP interfaces lease time."
+msgstr ""
+"Por DHCP padrão arrendamentos são exibidas em tempo UTC. Ao marcar esta \n"
+"\t\t\t\t\t\tcaixa tempo de concessão DHCP será exibida no horário local e definir a zona de tempo selecionado. Isso será usado para todos os tempos interfaces de DHCP locação."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:92
+msgid "The port must be an integer between 1 and 65535, a port alias, or left blank."
+msgstr "A porta deve ser um inteiro entre 1 e 65535, um alias de porta ou deve estar em branco."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:95
+#, php-format
+msgid "%s is not a valid IP address, IPv4 subnet, or alias."
+msgstr "%s não é um endereço de IP válido, subrede IPv4 ou alias."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:97
+#, php-format
+msgid "%s is a subnet containing more than 64 IP addresses."
+msgstr "%s é uma subrede contendo mais de 64 endereços IP"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:173
+#: usr/local/www/load_balancer_virtual_server_edit.php:171
+msgid "You may also specify a host alias listed in Firewall -&gt; Aliases here."
+msgstr "Você deve também especificar um alias de host listado no Firewall -&gt; Aliases aqui."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:187
+#: usr/local/www/load_balancer_virtual_server_edit.php:185
+msgid "If left blank, listening ports from the pool will be used."
+msgstr "Se deixar em branco, as portas escutadas do pool serão usadas."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:188
+#: usr/local/www/load_balancer_pool_edit.php:216
+#: usr/local/www/load_balancer_virtual_server_edit.php:186
+#: usr/local/www/load_balancer_pool_edit.php:214
+msgid "You may also specify a port alias listed in Firewall -&gt; Aliases here."
+msgstr "Você deve especificar um alias de porta listada no Firewall -&gt; Aliases aqui."
+
+#: usr/local/www/system_hasync.php:96 usr/local/www/system_hasync.php:97
+#: usr/local/www/system_hasync.php:98
+msgid "High Availability Sync"
+msgstr "Sincronização de Alta Disponibilidade"
+
+# 76%
+#: usr/local/www/services_ntpd.php:86 usr/local/www/services_ntpd.php:92
+msgid "NTP Server Configuration"
+msgstr "Configuração do servidor NTP"
+
+#: usr/local/www/interfaces_bridge_edit.php:391
+#: usr/local/www/interfaces_bridge_edit.php:392
+#: usr/local/www/interfaces_bridge_edit.php:393
+#: usr/local/www/interfaces_bridge_edit.php:396
+msgid "Set the Spanning Tree priority of interface to value. The default is 128. The minimum is 0 and the maximum is 240. Increments of 16."
+msgstr "Defina a prioridade Spanning Tree de interface para valor. O padrão é 128. O mínimo é 0 e o máximo é 240. Incrementos de 16."
+
+#: usr/local/www/diag_packet_capture.php:172
+#: usr/local/www/diag_packet_capture.php:219
+#: usr/local/www/diag_packet_capture.php:235
+msgid "Select the protocol to capture, or Any."
+msgstr "Selecione o protocolo para capturar, ou Qualquer."
+
+#: usr/local/www/diag_packet_capture.php:245
+#: usr/local/www/diag_packet_capture.php:292
+#: usr/local/www/diag_packet_capture.php:310
+msgid "View Capture"
+msgstr "Visualizar Captura"
+
+#: usr/local/www/system_camanager.php:420
+#: usr/local/www/system_camanager.php:427
+msgid "Serial for next certificate"
+msgstr "Serial para o próximo certificado"
+
+#: usr/local/www/system_camanager.php:423
+#: usr/local/www/system_camanager.php:430
+msgid "Enter a decimal number to be used as the serial number for the next certificate to be created using this CA."
+msgstr "Digite um número decimal a ser usado como o número de série para o próximo certificado a ser criado usando essa CA."
+
+#: usr/local/www/vpn_ipsec_phase2.php:140
+#: usr/local/www/vpn_ipsec_phase2.php:141
+#: usr/local/www/vpn_ipsec_phase2.php:163
+#: usr/local/www/vpn_ipsec_phase2.php:145
+#: usr/local/www/vpn_ipsec_phase2.php:171
+msgid "Invalid Local Network."
+msgstr "Rede Local Inválida"
+
+#: usr/local/www/vpn_ipsec_phase2.php:140
+#: usr/local/www/vpn_ipsec_phase2.php:141
+#: usr/local/www/vpn_ipsec_phase2.php:163
+#: usr/local/www/vpn_ipsec_phase2.php:145
+#: usr/local/www/vpn_ipsec_phase2.php:171
+msgid "has no subnet."
+msgstr "não tem nenhuma sub-rede."
+
+#: usr/local/www/firewall_nat_edit.php:233
+#: usr/local/www/firewall_nat_edit.php:238
+#: usr/local/www/firewall_nat_edit.php:243
+#, php-format
+msgid "A valid local port must be specified. It must be a port alias or integer between 1 and 65535."
+msgstr "A porta local válido deve ser especificado. Ele deve ser um alias de porto ou inteiro entre 1 e 65535."
+
+# 94%
+#: usr/local/www/firewall_nat_edit.php:793
+#: usr/local/www/firewall_nat_edit.php:792
+#: usr/local/www/firewall_nat_edit.php:787
+#: usr/local/www/firewall_nat_edit.php:799
+#: usr/local/www/firewall_nat_edit.php:800
+msgid "Use system default"
+msgstr "Use padrão do sistema"
+
+#: usr/local/www/interfaces.php:463 usr/local/www/interfaces.php:460
+#: usr/local/www/interfaces.php:448 usr/local/www/interfaces.php:453
+#: usr/local/www/interfaces.php:449 usr/local/www/interfaces.php:452
+msgid "This interface is referenced by IPv4 VIPs. Please delete those before setting the interface to 'none' configuration."
+msgstr "Essa interface é referenciada por VIPs IPv4. Por favor, apague aqueles antes de definir a interface para configuração de nenhum."
+
+#: usr/local/www/interfaces.php:516 usr/local/www/interfaces.php:513
+#: usr/local/www/interfaces.php:501 usr/local/www/interfaces.php:506
+#: usr/local/www/interfaces.php:502 usr/local/www/interfaces.php:505
+msgid "This interface is referenced by IPv6 VIPs. Please delete those before setting the interface to 'none' configuration."
+msgstr "Essa interface é referenciada por VIPs IPv6. Por favor, apague aqueles antes de definir a interface para configuração de nenhum."
+
+#: usr/local/www/interfaces.php:526 usr/local/www/interfaces.php:523
+#: usr/local/www/interfaces.php:511
+#, php-format
+msgid "You can only have one interface configured as %s or 6to4."
+msgstr "Você somente pode ter uma interface configurada como %s ou 6to4."
+
+#: usr/local/www/interfaces.php:536 usr/local/www/interfaces.php:533
+#: usr/local/www/interfaces.php:521
+#, php-format
+msgid "You can only have one interface configured as %s or 6rd."
+msgstr "Você somente pode ter uma interface configurada como %s ou 6rd."
+
+#: usr/local/www/interfaces.php:549 usr/local/www/interfaces.php:546
+#: usr/local/www/interfaces.php:534 usr/local/www/interfaces.php:541
+#: usr/local/www/interfaces.php:537 usr/local/www/interfaces.php:540
+msgid "You must enter a valid hexadecimal number for the IPv6 prefix ID."
+msgstr "Você deve digitar um número hexadecimal válidor para o prefixo IP do IPv6."
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:550
+#: usr/local/www/interfaces.php:538 usr/local/www/interfaces.php:545
+#: usr/local/www/interfaces.php:541 usr/local/www/interfaces.php:544
+msgid "You specified an IPv6 prefix ID that is out of range."
+msgstr "Você especificou um prefixo ID IPv6 fora da faixa."
+
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1107
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1158 usr/local/www/interfaces.php:1171
+msgid "SLAAC"
+msgstr "SLAAC"
+
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1107
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1158 usr/local/www/interfaces.php:1171
+msgid "6rd Tunnel"
+msgstr "Túnel 6rd"
+
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1107
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1158 usr/local/www/interfaces.php:1171
+msgid "6to4 Tunnel"
+msgstr "Túnel 6to4"
+
+#: usr/local/www/interfaces.php:1119 usr/local/www/interfaces.php:1107
+#: usr/local/www/interfaces.php:1121 usr/local/www/interfaces.php:1163
+#: usr/local/www/interfaces.php:1158 usr/local/www/interfaces.php:1171
+msgid "Track Interface"
+msgstr "Caminho da Interface"
+
+#: usr/local/www/interfaces.php:1411 usr/local/www/interfaces.php:1399
+#: usr/local/www/interfaces.php:1412 usr/local/www/interfaces.php:1455
+#: usr/local/www/interfaces.php:1450 usr/local/www/interfaces.php:1463
+msgid "If you leave this field blank, the adapter's default MTU will be used. This is typically 1500 bytes but can vary in some circumstances."
+msgstr "Se você deixar este campo em branco, o adaptadores de MTU padrão será usado. Este é tipicamente 1500 bytes, mas pode variar em algumas circunstâncias."
+
+#: usr/local/www/interfaces.php:1768 usr/local/www/interfaces.php:1756
+#: usr/local/www/interfaces.php:1774 usr/local/www/interfaces.php:1820
+#: usr/local/www/interfaces.php:1812 usr/local/www/interfaces.php:1848
+msgid "6RD Configuration"
+msgstr "Desenvolvimento rápido 6RD"
+
+#: usr/local/www/interfaces.php:1771 usr/local/www/interfaces.php:1759
+#: usr/local/www/interfaces.php:1777 usr/local/www/interfaces.php:1823
+#: usr/local/www/interfaces.php:1815 usr/local/www/interfaces.php:1851
+msgid "6RD prefix"
+msgstr "Prefixo 6RD"
+
+#: usr/local/www/interfaces.php:1775 usr/local/www/interfaces.php:1763
+#: usr/local/www/interfaces.php:1781 usr/local/www/interfaces.php:1827
+#: usr/local/www/interfaces.php:1819 usr/local/www/interfaces.php:1855
+msgid "The value in this field is the 6RD IPv6 prefix assigned by your ISP. e.g. '2001:db8::/32'"
+msgstr "O valor neste campo é o prefixo 6RD IPv6 atribuído pelo seu Provedor. por exemplo: '2001:db8::/32'"
+
+#: usr/local/www/interfaces.php:1779 usr/local/www/interfaces.php:1767
+#: usr/local/www/interfaces.php:1785 usr/local/www/interfaces.php:1831
+#: usr/local/www/interfaces.php:1823 usr/local/www/interfaces.php:1859
+msgid "6RD Border Relay"
+msgstr "Borda de Relay 6RD"
+
+#: usr/local/www/interfaces.php:1783 usr/local/www/interfaces.php:1771
+#: usr/local/www/interfaces.php:1789 usr/local/www/interfaces.php:1835
+#: usr/local/www/interfaces.php:1827 usr/local/www/interfaces.php:1863
+msgid "The value in this field is 6RD IPv4 gateway address assigned by your ISP"
+msgstr "O valor neste campo é um endereço de gateway 6RD IPv4 atribuido por seu Provedor."
+
+#: usr/local/www/interfaces.php:1787 usr/local/www/interfaces.php:1775
+#: usr/local/www/interfaces.php:1793 usr/local/www/interfaces.php:1839
+#: usr/local/www/interfaces.php:1831 usr/local/www/interfaces.php:1867
+msgid "6RD IPv4 Prefix length"
+msgstr "Tamanho do Prefixo IPv4 6RD"
+
+#: usr/local/www/interfaces.php:1799 usr/local/www/interfaces.php:1787
+#: usr/local/www/interfaces.php:1805 usr/local/www/interfaces.php:1851
+#: usr/local/www/interfaces.php:1843 usr/local/www/interfaces.php:1879
+msgid "The value in this field is the 6RD IPv4 prefix length. Normally specified by the ISP. A value of 0 means we embed the entire IPv4 address in the 6RD prefix."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1809 usr/local/www/interfaces.php:1797
+#: usr/local/www/interfaces.php:1818 usr/local/www/interfaces.php:1864
+#: usr/local/www/interfaces.php:1856 usr/local/www/interfaces.php:1892
+msgid "Track IPv6 Interface"
+msgstr "Caminho da Interface IPv6"
+
+#: usr/local/www/interfaces.php:1812 usr/local/www/interfaces.php:1800
+#: usr/local/www/interfaces.php:1821 usr/local/www/interfaces.php:1867
+#: usr/local/www/interfaces.php:1859 usr/local/www/interfaces.php:1895
+msgid "IPv6 Interface"
+msgstr "Interface IPv6"
+
+#: usr/local/www/interfaces.php:1838 usr/local/www/interfaces.php:1826
+#: usr/local/www/interfaces.php:1847 usr/local/www/interfaces.php:1893
+#: usr/local/www/interfaces.php:1885 usr/local/www/interfaces.php:1921
+msgid "This selects the dynamic IPv6 WAN interface to track for configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1842 usr/local/www/interfaces.php:1830
+#: usr/local/www/interfaces.php:1851 usr/local/www/interfaces.php:1897
+#: usr/local/www/interfaces.php:1889 usr/local/www/interfaces.php:1925
+msgid "IPv6 Prefix ID"
+msgstr "Prefixo ID IPv6"
+
+#: usr/local/www/interfaces.php:1853 usr/local/www/interfaces.php:1841
+#: usr/local/www/interfaces.php:1862 usr/local/www/interfaces.php:1908
+#: usr/local/www/interfaces.php:1898 usr/local/www/interfaces.php:1934
+msgid "The value in this field is the (Delegated) IPv6 prefix ID. This determines the configurable network ID based on the dynamic IPv6 connection"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1855 usr/local/www/interfaces.php:1843
+#: usr/local/www/interfaces.php:1864 usr/local/www/interfaces.php:1910
+#, php-format
+msgid "Enter a <b>hexadecimal</b> value between %x and %x here, or leave blank."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2356 usr/local/www/interfaces.php:2344
+#: usr/local/www/interfaces.php:2374 usr/local/www/interfaces.php:2420
+#: usr/local/www/interfaces.php:2409 usr/local/www/interfaces.php:2445
+msgid "Note: Only required in Access Point mode. If left blank in Ad-hoc or Infrastructure mode, this interface will connect to any available SSID"
+msgstr "Nota: Somente é requerido o modo Ponto de Acesso. Se deixar em branco no modo Ad-hoc ou modo Infraestrutura, esta interface irá conectar se houver um SSID."
+
+# 79%
+#: usr/local/www/interfaces.php:2576 usr/local/www/interfaces.php:2564
+#: usr/local/www/interfaces.php:2594 usr/local/www/interfaces.php:2640
+#: usr/local/www/interfaces.php:2629 usr/local/www/interfaces.php:2665
+msgid "Secondary 802.1X Authentication Server IP Address"
+msgstr "Endereço IP secundario de Servidor de Autenticação 802.1X"
+
+# 76%
+#: usr/local/www/interfaces.php:2583 usr/local/www/interfaces.php:2571
+#: usr/local/www/interfaces.php:2601 usr/local/www/interfaces.php:2647
+#: usr/local/www/interfaces.php:2636 usr/local/www/interfaces.php:2672
+msgid "Secondary 802.1X Authentication Server Port"
+msgstr "Porta secundaria do Servidor de Autenticação 802.1X"
+
+# 80%
+#: usr/local/www/interfaces.php:2590 usr/local/www/interfaces.php:2578
+#: usr/local/www/interfaces.php:2608 usr/local/www/interfaces.php:2654
+#: usr/local/www/interfaces.php:2643 usr/local/www/interfaces.php:2679
+msgid "Secondary 802.1X Authentication Server Shared Secret"
+msgstr "Segredo Compartilhado secundario do Servidor de Autenticação 802.1X"
+
+#: usr/local/www/vpn_openvpn_client.php:196
+#: usr/local/www/vpn_openvpn_client.php:202
+#: usr/local/www/vpn_openvpn_client.php:220
+msgid "The bandwidth limit must be a positive numeric value."
+msgstr "O limite de banda deve ser um valor número positivo."
+
+#: usr/local/www/load_balancer_pool_edit.php:89
+msgid "The port must be an integer between 1 and 65535, or a port alias."
+msgstr "O número da porta deve ser um número inteiro entre 1 e 65535, ou um apelido para a porta."
+
+# 76%
+#: usr/local/www/load_balancer_pool_edit.php:98
+#, php-format
+msgid "%s is not a valid IP address or IPv4 subnet (in \"enabled\" list)."
+msgstr "%s não é um endereço IPv4 válido (na lista de \"habilitados\")."
+
+#: usr/local/www/load_balancer_pool_edit.php:101
+#, php-format
+msgid "%s is a subnet containing more than 64 IP addresses (in \"enabled\" list)."
+msgstr "%s é uma subrede contendo mais de 64 endereços IP (em lista \"habilitada\")"
+
+# 76%
+#: usr/local/www/load_balancer_pool_edit.php:108
+#, php-format
+msgid "%s is not a valid IP address or IPv4 subnet (in \"disabled\" list)."
+msgstr "%s não é um endereço IP válido ou subrede IPv4 (na lista de \"desabilitados\")."
+
+#: usr/local/www/load_balancer_pool_edit.php:111
+#, php-format
+msgid "%s is a subnet containing more than 64 IP addresses (in \"disabled\" list)."
+msgstr "%s é uma subrede contendo mais de 64 endereços IP (em lista \"desabilitada\")"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:153
+#: usr/local/www/firewall_virtual_ip_edit.php:152
+#: usr/local/www/firewall_virtual_ip_edit.php:144
+#: usr/local/www/firewall_virtual_ip_edit.php:160
+#, php-format
+msgid "VHID %s is already in use on interface %s. Pick a unique number on this interface."
+msgstr ""
+
+#: usr/local/www/services_snmp.php:391 usr/local/www/services_snmp.php:392
+#: usr/local/www/services_snmp.php:407
+msgid "Interface Binding"
+msgstr "Interface Associada"
+
+# 78%
+#: usr/local/www/services_snmp.php:396 usr/local/www/services_snmp.php:397
+#: usr/local/www/services_snmp.php:412
+msgid "Bind Interface"
+msgstr "Interface de escuta"
+
+#: usr/local/www/widgets/widgets/smart_status.widget.php:36
+#: usr/local/www/widgets/widgets/smart_status.widget.php:37
+msgid "Drive"
+msgstr "Drive"
+
+#: usr/local/www/widgets/widgets/smart_status.widget.php:37
+#: usr/local/www/widgets/widgets/smart_status.widget.php:38
+msgid "Ident"
+msgstr "Ident"
+
+#: usr/local/www/system.php:418 usr/local/www/system.php:411
+#: usr/local/www/system.php:409
+msgid "Language"
+msgstr "Línguagem"
+
+#: usr/local/www/system.php:431 usr/local/www/system.php:424
+#: usr/local/www/system.php:422
+msgid "Choose a language for the webConfigurator"
+msgstr "Escolha o idioma para o configurador web (webConfigurator)"
+
+#: usr/local/www/firewall_virtual_ip.php:118
+#: usr/local/www/firewall_virtual_ip.php:115
+#: usr/local/www/firewall_virtual_ip.php:127
+#: usr/local/www/firewall_virtual_ip.php:150
+#: usr/local/www/firewall_virtual_ip.php:157
+msgid "This entry cannot be deleted because it is still referenced by a CARP IP with the description"
+msgstr "Esta entrada não pode ser removida porque ela esta referenciada por um IP de CARP com a descrição"
+
+#: usr/local/www/firewall_virtual_ip.php:124
+#: usr/local/www/firewall_virtual_ip.php:121
+#: usr/local/www/firewall_virtual_ip.php:132
+#: usr/local/www/firewall_virtual_ip.php:155
+#: usr/local/www/firewall_virtual_ip.php:162
+msgid "This entry cannot be deleted because it is still referenced by an IP alias entry with the description"
+msgstr "Esta entrada não pode ser removida porque ela esta referenciada por um IP Alias com a descrição"
+
+#: usr/local/www/services_dhcpv6.php:531
+#: usr/local/www/services_router_advertisements.php:277
+#: usr/local/www/services_router_advertisements.php:272
+#, php-format
+msgid "Select the Operating Mode for the Router Advertisement (RA) Daemon."
+msgstr "Selecione o modo de Operação do Serviço Anuncio de Roteamento (Router Advertisement - RA)"
+
+#: usr/local/www/services_dhcpv6.php:532
+#: usr/local/www/services_router_advertisements.php:278
+#: usr/local/www/services_router_advertisements.php:273
+#, php-format
+msgid "Use \"Router Only\" to only advertise this router, \"Unmanaged\" for Router Advertising with Stateless Autoconfig, \"Managed\" for assignment through (a) DHCPv6 Server, \"Assisted\" for DHCPv6 Server assignment combined with Stateless Autoconfig"
+msgstr "Use \"Router Only\" para somente anunciar este roteador, \"Unmanaged\" para Router Advertising com Stateless Autoconfig, \"Managed\" para atribuir sobre um Servidor DHCPv6, \"Assisted\" para Servidor DHCPv6 atribuido combinando com Stateless Autoconfig"
+
+#: usr/local/www/services_dhcpv6.php:533
+#: usr/local/www/services_router_advertisements.php:279
+#: usr/local/www/services_router_advertisements.php:274
+#, php-format
+msgid "It is not required to activate this DHCPv6 server when set to \"Managed\", this can be another host on the network"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:537
+#: usr/local/www/services_router_advertisements.php:283
+#: usr/local/www/services_router_advertisements.php:278
+msgid "Router Priority"
+msgstr "Prioridade de Roteador"
+
+#: usr/local/www/services_dhcpv6.php:544
+#: usr/local/www/services_router_advertisements.php:290
+#: usr/local/www/services_router_advertisements.php:285
+#, php-format
+msgid "Select the Priority for the Router Advertisement (RA) Daemon."
+msgstr "Selecione a prioridade para o serviço Router Advertisement (RA) "
+
+# 83%
+#: usr/local/www/services_dhcpv6.php:558
+#: usr/local/www/services_router_advertisements.php:304
+#: usr/local/www/services_router_advertisements.php:299
+msgid "RA Interface"
+msgstr "Interface RA"
+
+#: usr/local/www/services_dhcpv6.php:566
+#: usr/local/www/services_router_advertisements.php:312
+#: usr/local/www/services_router_advertisements.php:307
+#, php-format
+msgid "Select the Interface for the Router Advertisement (RA) Daemon."
+msgstr "Selecione a interface para o serviço Router Advertisement (RA) "
+
+#: usr/local/www/services_dhcpv6.php:653 usr/local/www/services_dhcpv6.php:584
+msgid "prefix delegation size"
+msgstr "tamanho da delegação de prefixo"
+
+#: usr/local/www/services_dhcpv6.php:662 usr/local/www/services_dhcpv6.php:593
+#: usr/local/www/services_dhcpv6.php:610
+msgid ""
+"You can define a Prefix range here for DHCP Prefix Delegation. This allows for \n"
+"\t\t\t\t\tassigning networks to subrouters. The start and end of the range must end on boundaries of the prefix delegation size."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:685 usr/local/www/services_dhcpv6.php:616
+#: usr/local/www/services_dhcpv6.php:633
+msgid "The DHCP server can optionally provide a domain search list. Use the semicolon character as seperator"
+msgstr "O Servidor DHCP pode opcionalmente prover uma lista de pesquisa de dominio. Use o caracter ponto-e-virgula como separador."
+
+#: usr/local/www/services_dhcpv6.php:725 usr/local/www/services_dhcpv6.php:656
+#: usr/local/www/services_dhcpv6.php:673
+#, fuzzy
+msgid "Change DHCPv6 display lease time from UTC to local time."
+msgstr "Alterar tempo de concessão DHCP exibição de UTC para a hora local."
+
+#: usr/local/www/services_dhcpv6.php:732 usr/local/www/services_dhcpv6.php:663
+#: usr/local/www/services_dhcpv6.php:680
+msgid ""
+"By default DHCPv6 leases are displayed in UTC time. By checking this \n"
+"\t\t\t\t\t\tbox DHCPv6 lease time will be displayed in local time and set to time zone selected. This will be used for all DHCPv6 interfaces lease time."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:64
+msgid "WebCfg - Diagnostics: Sockets page"
+msgstr "WebCfg - Diagnosticos: Página de Sockets"
+
+#: etc/inc/priv.defs.inc:65
+msgid "Allow access to the 'Diagnostics: Sockets' page."
+msgstr "Permite acesso a página 'Diagnosticos: Sockets'"
+
+#: etc/inc/config.console.inc:263
+#, php-format
+msgid "%sEnter the Optional %s interface name or 'a' for auto-detection%s(or nothing if finished):%s"
+msgstr "%sEntre com nome opcional para interface %s ou 'a' para auto-detecção %s(ou nada se quiser finalizar):%s"
+
+#: etc/inc/shaper.inc:2909 etc/inc/shaper.inc:2910 etc/inc/shaper.inc:2915
+#: etc/inc/shaper.inc:2983 etc/inc/shaper.inc:3041 etc/inc/shaper.inc:3049
+#, fuzzy, php-format
+msgid "Bandwidth for schedule %s must be an integer."
+msgstr "O valor de tamanho de banda para %s deve ser um inteiro."
+
+#: etc/inc/shaper.inc:2915 etc/inc/shaper.inc:2916 etc/inc/shaper.inc:2921
+#: etc/inc/shaper.inc:2989 etc/inc/shaper.inc:3047 etc/inc/shaper.inc:3057
+msgid "You need to specify a schedule for every additional entry"
+msgstr ""
+
+#: etc/inc/shaper.inc:2917 etc/inc/shaper.inc:2918 etc/inc/shaper.inc:2923
+#: etc/inc/shaper.inc:2991 etc/inc/shaper.inc:3049 etc/inc/shaper.inc:3059
+msgid "If more than one bandwidth configured all schedules need to be selected"
+msgstr "If mais de um controle de banda é configurado, todos os agendamentos precisam ser selecionados."
+
+#: etc/inc/shaper.inc:2919 etc/inc/shaper.inc:2920 etc/inc/shaper.inc:2925
+#: etc/inc/shaper.inc:2993 etc/inc/shaper.inc:3051 etc/inc/shaper.inc:3061
+msgid "At least one bw specification is necessary"
+msgstr ""
+
+#: etc/inc/shaper.inc:3200 etc/inc/shaper.inc:3201 etc/inc/shaper.inc:3208
+#: etc/inc/shaper.inc:3276 etc/inc/shaper.inc:3332 etc/inc/shaper.inc:3357
+msgid "add another schedule"
+msgstr "adicionar outro agendamento"
+
+#: etc/inc/functions.inc:94
+msgid "Acknowledge All Notices"
+msgstr "Reconhecer todos os avisos"
+
+#: etc/inc/functions.inc:95
+msgid "Click to Acknowledge"
+msgstr "Clique para Reconhecer"
+
+#: etc/inc/functions.inc:113
+msgid "unread notice"
+msgstr "aviso não lido"
+
+#: etc/inc/functions.inc:115
+msgid "unread notices"
+msgstr "avisos não lido"
+
+#: etc/inc/service-utils.inc:234 etc/inc/service-utils.inc:233
+#: etc/inc/service-utils.inc:250
+msgid "Router Advertisement Daemon"
+msgstr "Serviço de Anúncio de Roteador"
+
+#: etc/inc/service-utils.inc:313 etc/inc/service-utils.inc:312
+#: etc/inc/service-utils.inc:329 etc/inc/service-utils.inc:331
+msgid "RIP Daemon"
+msgstr "Serviço RIP"
+
+#: etc/inc/service-utils.inc:413 etc/inc/service-utils.inc:422
+#: etc/inc/service-utils.inc:412 etc/inc/service-utils.inc:421
+#: etc/inc/service-utils.inc:429 etc/inc/service-utils.inc:439
+#: etc/inc/service-utils.inc:432 etc/inc/service-utils.inc:442
+#: etc/inc/service-utils.inc:437 etc/inc/service-utils.inc:447
+#, php-format
+msgid "%s Service is"
+msgstr "%s Serviço é"
+
+#: etc/inc/service-utils.inc:447 etc/inc/service-utils.inc:446
+#: etc/inc/service-utils.inc:464 etc/inc/service-utils.inc:467
+#: etc/inc/service-utils.inc:472
+#, php-format
+msgid "Restart %sService"
+msgstr "Reiniciar Serviço %s"
+
+#: etc/inc/service-utils.inc:458 etc/inc/service-utils.inc:457
+#: etc/inc/service-utils.inc:475 etc/inc/service-utils.inc:478
+#: etc/inc/service-utils.inc:483
+#, php-format
+msgid "Stop %sService"
+msgstr "Parar Serviço %s"
+
+#: etc/inc/service-utils.inc:471 etc/inc/service-utils.inc:470
+#: etc/inc/service-utils.inc:491 etc/inc/service-utils.inc:494
+#: etc/inc/service-utils.inc:499
+#, php-format
+msgid "Start %sService"
+msgstr "Iniciar Serviço %s"
+
+#: etc/inc/filter.inc:2993 etc/inc/filter.inc:3079 etc/inc/filter.inc:3103
+#: etc/inc/filter.inc:3108 etc/inc/filter.inc:3131
+msgid "Removed 15 minute filter reload for Time Based Rules"
+msgstr "Removido 15 minutos de releitura de filtros para regras baseada em Tempo."
+
+#: usr/local/www/pkg_mgr.php:193 usr/local/www/pkg_mgr.php:196
+msgid "Click on package name to access its website."
+msgstr "Clique no nome do pacote para ter acesso ao website."
+
+#: usr/local/www/diag_logs_settings.php:276
+#: usr/local/www/diag_logs_settings.php:307
+msgid "Show the applied rule description below or in the firewall log rows."
+msgstr "Mostra as descrições de regras aplicadas abaixo ou nas linhas do firewall."
+
+#: usr/local/www/diag_logs_settings.php:278
+#: usr/local/www/diag_logs_settings.php:309
+msgid "Displaying rule descriptions for all lines in the log might affect performance with large rulessets."
+msgstr ""
+
+#: usr/local/www/fbegin.inc:152 usr/local/www/fbegin.inc:144
+msgid "DHCPv6 Server/RA"
+msgstr "Servidor/RA DHCPv6"
+
+#: usr/local/www/fbegin.inc:232 usr/local/www/diag_sockets.php:44
+#: usr/local/www/fbegin.inc:224
+msgid "Sockets"
+msgstr "Sockets"
+
+#: usr/local/www/fbegin.inc:419 usr/local/www/fbegin.inc:411
+msgid "Help for items on this page"
+msgstr "Ajuda para os itens nessa página"
+
+#: usr/local/www/system_groupmanager.php:472
+#: usr/local/www/system_groupmanager.php:422
+#: usr/local/www/system_groupmanager.php:425
+msgid ""
+"Additional webConfigurator groups can be added here. \n"
+"\t\t\t\t\t\t\t\t\tGroup permissions can be assigned which are inherited by users who are members of the group.\n"
+"\t\t\t\t\t\t\t\t\tAn icon that appears grey indicates that it is a system defined object.\n"
+"\t\t\t\t\t\t\t\t\tSome system object properties can be modified but they cannot be deleted."
+msgstr ""
+"Additional webConfigurator groups can be added here. \n"
+"\t\t\t\t\t\t\t\t\tGroup permissions can be assigned which are inherited by users who are members of the group.\n"
+"\t\t\t\t\t\t\t\t\tAn icon that appears grey indicates that it is a system defined object.\n"
+"\t\t\t\t\t\t\t\t\tSome system object properties can be modified but they cannot be deleted."
+
+#: usr/local/www/services_dnsmasq_edit.php:216
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+msgid "or"
+msgstr "ou"
+
+#: usr/local/www/services_dhcpv6_edit.php:204
+#: usr/local/www/services_dhcpv6_edit.php:207
+msgid "If an IPv6 address is entered, the address must be outside of the pool."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6_edit.php:206
+#: usr/local/www/services_dhcpv6_edit.php:209
+#, fuzzy
+msgid "If no IPv6 address is given, one will be dynamically allocated from the pool."
+msgstr "Se nenhum endereço IPv6 for fornecido, um será dinamicamente alocado da fila."
+
+#: usr/local/www/services_router_advertisements.php:118
+#: usr/local/www/services_router_advertisements.php:117
+msgid "Subnets are specified in CIDR format. Select the CIDR mask that pertains to each entry. /128 specifies a single IPv6 host; /64 specifies a normal IPv6 network; etc. If no subnets are specified here, the Router Advertisement (RA) Daemon will advertise to the subnet to which the router's interface is assigned."
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:149
+#: usr/local/www/services_router_advertisements.php:144
+#, fuzzy, php-format
+msgid "An invalid subnet or alias was specified. [%s/%s]"
+msgstr "%s não é um endereço de IP válido, subrede IPv4 ou alias."
+
+#: usr/local/www/services_router_advertisements.php:194
+#: usr/local/www/services_router_advertisements.php:189
+msgid "Router advertisements"
+msgstr "Anúncios de Roteador"
+
+#: usr/local/www/services_router_advertisements.php:318
+#: usr/local/www/services_router_advertisements.php:313
+msgid "RA Subnet(s)"
+msgstr "Subrede(s) RA"
+
+#: usr/local/www/services_router_advertisements.php:384
+#: usr/local/www/services_router_advertisements.php:379
+#, fuzzy
+msgid "The RA server can optionally provide a domain search list. Use the semicolon character as seperator"
+msgstr "O Servidor DHCP pode opcionalmente prover uma lista de pesquisa de dominio. Use o caracter ponto-e-virgula como separador."
+
+#: usr/local/www/services_router_advertisements.php:392
+#: usr/local/www/services_router_advertisements.php:387
+msgid "Use same settings as DHCPv6 server"
+msgstr "Usa as mesmas configurações do servidor DHCPv6"
+
+#: usr/local/www/vpn_ipsec.php:142 usr/local/www/vpn_ipsec_keys.php:94
+#: usr/local/www/vpn_ipsec_phase2.php:475
+#: usr/local/www/vpn_ipsec_phase1.php:498 usr/local/www/vpn_ipsec.php:148
+#: usr/local/www/vpn_ipsec_phase1.php:519
+#: usr/local/www/vpn_ipsec_phase2.php:497
+msgid "Pre-Shared Keys"
+msgstr "Chaves pré-compartilhada"
+
+#: usr/local/www/system_usermanager_settings_test.php:78
+#, php-format
+msgid "Testing %s LDAP settings... One moment please..."
+msgstr "Testando configurações LDAP %s... Um momento por favor..."
+
+#: usr/local/www/vpn_ipsec_mobile.php:149
+#, fuzzy
+msgid "A valid split DNS domain list must be specified."
+msgstr "Um nome de domínio válido deve ser especificado para o domínio DNS."
+
+#: usr/local/www/vpn_ipsec_mobile.php:505
+msgid "Split DNS"
+msgstr "Divisão do DNS"
+
+#: usr/local/www/vpn_ipsec_mobile.php:514
+msgid "Provide a list of split DNS domain names to clients. Enter a comma separated list."
+msgstr "Forneça uma lista de nomes de dominio DNS para os clientes. Entre com os valores separados por virgula na lista."
+
+#: usr/local/www/vpn_ipsec_mobile.php:515
+msgid "NOTE: If left blank, and a default domain is set, it will be used for this value."
+msgstr "NOTA: Se deixar em branco e um dominio padrão é definido, ele irá ser usado para esse valor."
+
+#: usr/local/www/firewall_shaper.php:131
+#: usr/local/www/firewall_shaper_vinterface.php:146
+msgid "Unable to write config.xml (Access Denied?)"
+msgstr "Incapaz de escrever config.xml (Acesso Negado?)"
+
+#: usr/local/www/firewall_rules_edit.php:455
+#: usr/local/www/firewall_rules_edit.php:458
+#: usr/local/www/firewall_rules_edit.php:464
+msgid "Please select a gateway, normaly the interface selected gateway, so the limiters work correctly"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:136
+#, fuzzy
+msgid "Do you really want to delete this Pre-Shared Key?"
+msgstr "Você realmente deseja apagar essa chave pre-compartilhada?"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:83
+msgid "A valid domain must be specified after _msdcs."
+msgstr "Um dominio válido devve ser especificado após _msdcs."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:93
+msgid "An interface IP address must be specified for the DNS query source."
+msgstr "Um endereço de IP da interface deve ser especificado para consultas de DNS de origem."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:144
+msgid "Source IP"
+msgstr "IP de Origem"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:147
+msgid "Source IP address for queries to the DNS server for the override domain."
+msgstr "Endereço de IP de origem para consultas ao servidor DNS para sobrepor o dominio."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:148
+msgid "Leave blank unless your DNS server is accessed through a VPN tunnel."
+msgstr ""
+
+#: usr/local/www/system_crlmanager.php:401
+msgid "Edit Imported Certificate Revocation List"
+msgstr "Edita a lista de Revogação de Certificado importado."
+
+#: usr/local/www/system_advanced_firewall.php:206
+#: usr/local/www/system_advanced_firewall.php:235
+#: usr/local/www/system_advanced_firewall.php:246
+#, fuzzy
+msgid "expires idle connections quicker. More efficient use of CPU and memory but can drop legitimate idle connections"
+msgstr "expira conexões ociosas mais rápido. Faz uso mais eficiente da CPU e da memória mas pode derrubar conexões legítimas"
+
+#: usr/local/www/system_advanced_firewall.php:207
+#: usr/local/www/system_advanced_firewall.php:236
+#: usr/local/www/system_advanced_firewall.php:247
+#, fuzzy
+msgid "tries to avoid dropping any legitimate idle connections at the expense of increased memory usage and CPU utilization."
+msgstr "tenta evitar queda de qualquer conexão legítima às custas do uso de memória e utilização de CPU."
+
+#: usr/local/www/vpn_pptp.php:297 usr/local/www/vpn_pptp.php:300
+msgid "PPTP is no longer considered a secure VPN technology because it relies upon MS-CHAPv2 which has been compromised. If you continue to use PPTP be aware that intercepted traffic can be decrypted by a third party, so it should be considered unencrypted. We advise migrating to another VPN type such as OpenVPN or IPsec.<br/><br/><a href=\"https://isc.sans.edu/diary/End+of+Days+for+MS-CHAPv2/13807\">Read More</a>"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:185 usr/local/www/status_ntpd.php:191
+msgid "Clock Latitude"
+msgstr "Latitude"
+
+#: usr/local/www/status_ntpd.php:186 usr/local/www/status_ntpd.php:192
+msgid "Clock Longitude"
+msgstr "Longitude"
+
+#: usr/local/www/system_advanced_misc.php:77
+#: usr/local/www/system_advanced_misc.php:80
+#: usr/local/www/system_advanced_misc.php:84
+#: usr/local/www/system_advanced_misc.php:85
+#, fuzzy
+msgid "AMD Geode LX Security Block"
+msgstr "O AMD Geode LX Security Block irá acelerar algumas funções de criptografia em sistemas que possuem o chip. Não habilite essa opção se você tem um cartão de aceleração de criptografia Hifn, já que ele terá prioridade e o cartão Hifn não será usado. Aceleração pode ser automática para IPsec quando estiver usando Rijndael (AES). OpenVPN deve ser configurado para AES-128-CBC."
+
+#: usr/local/www/system_advanced_misc.php:78
+#: usr/local/www/system_advanced_misc.php:81
+#: usr/local/www/system_advanced_misc.php:85
+#: usr/local/www/system_advanced_misc.php:86
+msgid "AES-NI CPU-based Acceleration"
+msgstr "Aceleração baseada em CPU AES-NI"
+
+#: usr/local/www/system_advanced_misc.php:80
+#: usr/local/www/system_advanced_misc.php:83
+#: usr/local/www/system_advanced_misc.php:87
+#: usr/local/www/system_advanced_misc.php:88
+#, fuzzy
+msgid "Intel Core* CPU on-die thermal sensor"
+msgstr "Sensor termal on-die CPU AMD K8, K10 e K11"
+
+#: usr/local/www/system_advanced_misc.php:81
+#: usr/local/www/system_advanced_misc.php:84
+#: usr/local/www/system_advanced_misc.php:88
+#: usr/local/www/system_advanced_misc.php:89
+msgid "AMD K8, K10 and K11 CPU on-die thermal sensor"
+msgstr "Sensor termal on-die CPU AMD K8, K10 e K11"
+
+#: usr/local/www/system_advanced_misc.php:92
+#: usr/local/www/system_advanced_misc.php:95
+#: usr/local/www/system_advanced_misc.php:99
+#: usr/local/www/system_advanced_misc.php:100
+msgid "Please select a valid Cryptographic Accelerator."
+msgstr "Por favor, selecione um acelerador de Criptografia válido."
+
+#: usr/local/www/system_advanced_misc.php:95
+#: usr/local/www/system_advanced_misc.php:98
+#: usr/local/www/system_advanced_misc.php:102
+#: usr/local/www/system_advanced_misc.php:103
+msgid "Please select a valid Thermal Hardware Sensor."
+msgstr "Por favor, selecione um hardware de sensor termal válido"
+
+#: usr/local/www/system_advanced_misc.php:380
+#: usr/local/www/system_advanced_misc.php:392
+#: usr/local/www/system_advanced_misc.php:439
+#: usr/local/www/system_advanced_misc.php:445
+#, fuzzy
+msgid "Cryptographic Hardware Acceleration"
+msgstr "Hardware de Criptografia"
+
+#: usr/local/www/system_advanced_misc.php:383
+#: usr/local/www/system_advanced_misc.php:395
+#: usr/local/www/system_advanced_misc.php:442
+#: usr/local/www/system_advanced_misc.php:448
+msgid "Cryptographic Hardware"
+msgstr "Hardware de Criptografia"
+
+#: usr/local/www/system_advanced_misc.php:392
+#: usr/local/www/system_advanced_misc.php:404
+#: usr/local/www/system_advanced_misc.php:451
+#: usr/local/www/system_advanced_misc.php:457
+msgid "A cryptographic accelerator module will use hardware support to speed up some cryptographic functions on systems which have the chip. Do not enable this option if you have a Hifn cryptographic acceleration card, as this will take precedence and the Hifn card will not be used. Acceleration should be automatic for IPsec when using a cipher supported by your chip, such as AES-128. OpenVPN should be set for AES-128-CBC and have cryptodev enabled for hardware acceleration."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:400
+#: usr/local/www/system_advanced_misc.php:412
+#: usr/local/www/system_advanced_misc.php:459
+#: usr/local/www/system_advanced_misc.php:465
+msgid "If you do not have a crypto chip in your system, this option will have no effect. To unload the selected module, set this option to 'none' and then reboot."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:408
+#: usr/local/www/system_advanced_misc.php:411
+#: usr/local/www/system_advanced_misc.php:420
+#: usr/local/www/system_advanced_misc.php:423
+#: usr/local/www/system_advanced_misc.php:467
+#: usr/local/www/system_advanced_misc.php:470
+#: usr/local/www/system_advanced_misc.php:473
+#: usr/local/www/system_advanced_misc.php:476
+msgid "Thermal Sensors"
+msgstr "Sensores Termais"
+
+#: usr/local/www/system_advanced_misc.php:414
+#: usr/local/www/system_advanced_misc.php:426
+#: usr/local/www/system_advanced_misc.php:473
+#: usr/local/www/system_advanced_misc.php:479
+msgid "None/ACPI"
+msgstr "Nenhum/ACPI"
+
+#: usr/local/www/system_advanced_misc.php:420
+#: usr/local/www/system_advanced_misc.php:432
+#: usr/local/www/system_advanced_misc.php:479
+#: usr/local/www/system_advanced_misc.php:485
+msgid "If you have a supported CPU, selecting a themal sensor will load the appropriate driver to read its temperature. Setting this to 'None' will attempt to read the temperature from an ACPI-compliant motherboard sensor instead, if one is present."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:424
+#: usr/local/www/system_advanced_misc.php:436
+#: usr/local/www/system_advanced_misc.php:483
+#: usr/local/www/system_advanced_misc.php:489
+msgid "If you do not have a supported thermal sensor chip in your system, this option will have no effect. To unload the selected module, set this option to 'none' and then reboot."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:173
+#: usr/local/www/services_captiveportal.php:175
+msgid "Certificate must be specified for HTTPS login."
+msgstr "Certificado deve ser especificado para login de HTTPS."
+
+#: usr/local/www/services_captiveportal.php:863
+#: usr/local/www/services_captiveportal.php:865
+#: usr/local/www/services_captiveportal.php:881
+msgid "If enabled, the username and password will be transmitted over an HTTPS connection to protect against eavesdroppers. A server name and certificate must also be specified below."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:886
+#: usr/local/www/services_captiveportal.php:888
+#: usr/local/www/services_captiveportal.php:904
+msgid "No Certificates defined."
+msgstr "Nenhum certificado definido."
+
+#: usr/local/www/system_gateways_edit.php:205
+#: usr/local/www/system_gateways_edit.php:235
+msgid "The low latency threshold needs to be a numeric value."
+msgstr "O limiar de latencia baixa deve ser um valor númerico."
+
+#: usr/local/www/system_gateways_edit.php:208
+#: usr/local/www/system_gateways_edit.php:238
+msgid "The low latency threshold needs to be positive."
+msgstr "O limiar de latencia baixa deve ser um valor positivo."
+
+#: usr/local/www/system_gateways_edit.php:215
+#: usr/local/www/system_gateways_edit.php:245
+msgid "The high latency threshold needs to be a numeric value."
+msgstr "O limiar de latencia alta deve ser um valor númerico."
+
+#: usr/local/www/system_gateways_edit.php:218
+#: usr/local/www/system_gateways_edit.php:248
+msgid "The high latency threshold needs to be positive."
+msgstr "O limiar de latencia alta deve ser um valor positivo."
+
+#: usr/local/www/system_gateways_edit.php:225
+#: usr/local/www/system_gateways_edit.php:255
+msgid "The low Packet Loss threshold needs to be a numeric value."
+msgstr "O limiar de perda de pacote baixo deve ser um valor númerico."
+
+#: usr/local/www/system_gateways_edit.php:228
+#: usr/local/www/system_gateways_edit.php:258
+msgid "The low Packet Loss threshold needs to be positive."
+msgstr "O limiar de perda de pacotes baixo deve ser um valor positivo."
+
+#: usr/local/www/system_gateways_edit.php:231
+#: usr/local/www/system_gateways_edit.php:261
+msgid "The low Packet Loss threshold needs to be less than 100."
+msgstr "O limiar de perda de pacotes deve ser um valor menor que 100."
+
+#: usr/local/www/system_gateways_edit.php:238
+#: usr/local/www/system_gateways_edit.php:268
+msgid "The high Packet Loss threshold needs to be a numeric value."
+msgstr "O limiar de perda de pacotes alto deve ser um valor númerico."
+
+#: usr/local/www/system_gateways_edit.php:241
+#: usr/local/www/system_gateways_edit.php:271
+msgid "The high Packet Loss threshold needs to be positive."
+msgstr "O limiar de perda de pacotes alto deve ser um valor positivo."
+
+#: usr/local/www/system_gateways_edit.php:244
+#: usr/local/www/system_gateways_edit.php:274
+msgid "The high Packet Loss threshold needs to be 100 or less."
+msgstr "O limiar de perda de pacotes alto deve ser um valor menor que 100."
+
+#: usr/local/www/system_gateways_edit.php:252
+#: usr/local/www/system_gateways_edit.php:282
+msgid "The high latency threshold needs to be higher than the low latency threshold"
+msgstr "O limiar de latencia alta precisa ser maior que o valor limiar de latencia baixa."
+
+#: usr/local/www/system_gateways_edit.php:275
+#: usr/local/www/system_gateways_edit.php:305
+msgid "The high Packet Loss threshold needs to be higher than the low Packet Loss threshold"
+msgstr "O limiar de perda de pacotes alto deve ser maior que o valor limiar de perda de pacotes baixo."
+
+#: usr/local/www/system_gateways_edit.php:297
+#: usr/local/www/system_gateways_edit.php:327
+msgid "The frequency probe interval needs to be a numeric value."
+msgstr "O intervalo de frequencia de consulta deve ser um valor númerico."
+
+#: usr/local/www/system_gateways_edit.php:300
+#: usr/local/www/system_gateways_edit.php:330
+msgid "The frequency probe interval needs to be positive."
+msgstr "O intervalo de frequencia de consulta deve ser um valor positivo."
+
+#: usr/local/www/system_gateways_edit.php:307
+#: usr/local/www/system_gateways_edit.php:337
+msgid "The down time setting needs to be a numeric value."
+msgstr "A configuração de tempo de queda deve ser um valor númerico."
+
+#: usr/local/www/system_gateways_edit.php:310
+#: usr/local/www/system_gateways_edit.php:340
+msgid "The down time setting needs to be positive."
+msgstr "A configuração de tempo de queda deve ser um valor positivo."
+
+#: usr/local/www/system_gateways_edit.php:318
+#: usr/local/www/system_gateways_edit.php:348
+msgid "The Frequency Probe interval needs to be less than the down time setting."
+msgstr "O intervalo de frequencia de consulta deve ser menor que a configuraçõa de tempo de queda."
+
+#: usr/local/www/system_gateways_edit.php:611
+#: usr/local/www/system_gateways_edit.php:615
+#: usr/local/www/system_gateways_edit.php:617
+#: usr/local/www/system_gateways_edit.php:647
+msgid "NOTE: The Frequency Probe interval must be less than the Down time, otherwise the gateway will seem to go down then come up again at the next probe."
+msgstr "NOTA: O intervalo de frequencia de consulta deve ser menor que o tempo de queda, caso contrário vai parecer que o gateway caiu antes da próxima consulta."
+
+#: usr/local/www/shortcuts.inc:96
+msgid "Main page for this section"
+msgstr "Página principal para esta sessão"
+
+#: usr/local/www/shortcuts.inc:120
+msgid "Status of items on this page"
+msgstr "Status dos itens nesta página"
+
+#: usr/local/www/shortcuts.inc:127
+msgid "Log entries for items on this page"
+msgstr "Entrada de log para os itens nesta página"
+
+#: usr/local/www/vpn_openvpn_server.php:1102
+#: usr/local/www/vpn_openvpn_server.php:1129
+#, fuzzy
+msgid "This is the IPv6 virtual network used for private communications between this server and client hosts expressed using CIDR (eg. fe80::/64). The first network address will be assigned to the server virtual interface. The remaining network addresses can optionally be assigned to connecting clients. (see Address Pool)"
+msgstr "Essa é a rede virtual IPv6 usada para comunicações privadas entre esse servidor e os hosts clientes expressados usando CIDR (e.g. fe80::/64). O primeiro endereço de rede será atribuído à \tinterface virtual do servidor. Os endereços de rede remanescentes podem opcionalmente ser atribuídos a clientes em conexão. (veja Pool de Endereço)"
+
+#: usr/local/www/vpn_openvpn_server.php:1152
+#: usr/local/www/vpn_openvpn_server.php:1179
+#, fuzzy
+msgid "The interface to which this tap instance will be bridged. This is not done automatically. You must assign this interface and create the bridge separately. This setting controls which existing IP address and subnet mask are used by OpenVPN for the bridge. Setting this to 'none' will cause the Server Bridge DHCP settings below to be ignored."
+msgstr "A interface para que esta instância torneira será, em ponte. Isto não é feito automaticamente. Você deve atribuir essa interface e criar a ponte separadamente. Esta definição controla qual o endereço IP existente e máscara de subrede são usados ¿¿por OpenVPN para a ponte. A definição como 'none' fará com que as configurações do servidor DHCP Ponte abaixo para ser ignorado."
+
+#: usr/local/www/vpn_openvpn_server.php:1165
+#: usr/local/www/vpn_openvpn_server.php:1192
+#, fuzzy
+msgid "When using tap mode as a multi-point server, you may optionally supply a DHCP range to use on the interface to which this tap instance is bridged. If these settings are left blank, DHCP will be passed through to the LAN, and the interface setting above will be ignored."
+msgstr "Ao usar o modo tap como servidor multi-ponto, você pode, opcionalmente, fornecer uma gama DHCP para usar na interface para que esta instância torneira está superado. Se essas configurações são deixadas em branco, DHCP será repassado para a LAN, ea interface de configuração acima serão ignorados."
+
+#: usr/local/www/vpn_openvpn_server.php:1225
+#: usr/local/www/vpn_openvpn_client.php:799
+msgid "IPv4 Remote Network"
+msgstr "Rede remota IPv4"
+
+#: usr/local/www/vpn_openvpn_server.php:1229
+#, fuzzy
+msgid "This is a network that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as a CIDR range. If this is a site-to-site VPN, enter the remote LAN here. You may leave this blank if you don't want a site-to-site VPN"
+msgstr "Essa é uma rede que será roteada através do túnel, de forma que uma VPN site-to-site possa ser estabelecida sem modificar manualmente as tabelas de roteamento. Expressado como um intervalo CIDR. Se essa é uma VPN site-to-site, informe aqui a LAN remota. Você pode deixar isso em branco se não desejar uma VPN site-to-site"
+
+#: usr/local/www/vpn_openvpn_server.php:1239
+#: usr/local/www/vpn_openvpn_client.php:813
+msgid "IPv6 Remote Network"
+msgstr "Rede remota IPv6"
+
+#: usr/local/www/vpn_openvpn_server.php:1243
+msgid "This is an IPv6 network that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as an IP/PREFIX. If this is a site-to-site VPN, enter the remote LAN here. You may leave this blank if you don't want a site-to-site VPN"
+msgstr "Esta é uma rede IPv6 que será encaminhado através do túnel, de modo que uma VPN site-to-site pode ser estabelecida sem alterar manualmente as tabelas de roteamento. Expresso como um prefixo IP. Se esta é uma VPN site-to-site, digite a LAN remota aqui. Você pode deixar este campo em branco se você não quiser uma VPN site-to-site"
+
+#: usr/local/www/services_dhcp.php:293 usr/local/www/services_dhcp.php:274
+#: usr/local/www/services_dhcp.php:294 usr/local/www/services_dhcp.php:295
+msgid "If you specify a mac allow list, it must contain only valid partial MAC addresses."
+msgstr "Se você especificar uma lista de mac permitido. isto deve conter somente endereços parciais de MAC."
+
+#: usr/local/www/services_dhcp.php:295 usr/local/www/services_dhcp.php:276
+#: usr/local/www/services_dhcp.php:296 usr/local/www/services_dhcp.php:297
+msgid "If you specify a mac deny list, it must contain only valid partial MAC addresses."
+msgstr "Se você especificar uma lista de mac bloqueados. isto deve conter somente endereços parciais de MAC."
+
+#: usr/local/www/services_dhcp.php:699 usr/local/www/services_dhcp.php:701
+#: usr/local/www/services_dhcp.php:721 usr/local/www/services_dhcp.php:733
+msgid "Editing Pool-Specific Options. To return to the Interface, click its tab above."
+msgstr "Editar Opções de pool específico. Para retornar para a interface, clique na guia acima."
+
+#: usr/local/www/services_dhcp.php:775 usr/local/www/services_dhcp.php:785
+#: usr/local/www/services_dhcp.php:805 usr/local/www/services_dhcp.php:817
+msgid "Additional Pools"
+msgstr "Pools adicionais"
+
+#: usr/local/www/services_dhcp.php:777 usr/local/www/services_dhcp.php:787
+#: usr/local/www/services_dhcp.php:807 usr/local/www/services_dhcp.php:819
+msgid "If you need additional pools of addresses inside of this subnet outside the above Range, they may be specified here."
+msgstr "Se você precisar de pools de endereços adicionais dentro desta subrede externa na faixa acima, então você deve especificar aqui."
+
+#: usr/local/www/services_dhcp.php:780 usr/local/www/services_dhcp.php:790
+#: usr/local/www/services_dhcp.php:810 usr/local/www/services_dhcp.php:822
+msgid "Pool Start"
+msgstr "Pool Inicial"
+
+#: usr/local/www/services_dhcp.php:781 usr/local/www/services_dhcp.php:791
+#: usr/local/www/services_dhcp.php:811 usr/local/www/services_dhcp.php:823
+msgid "Pool End"
+msgstr "Pool Final"
+
+#: usr/local/www/services_dhcp.php:805 usr/local/www/services_dhcp.php:819
+#: usr/local/www/services_dhcp.php:839 usr/local/www/services_dhcp.php:851
+msgid "Do you really want to delete this pool?"
+msgstr "Você realmente quer remover este pool?"
+
+#: usr/local/www/services_dhcp.php:958 usr/local/www/services_dhcp.php:971
+#: usr/local/www/services_dhcp.php:991 usr/local/www/services_dhcp.php:1003
+msgid "MAC Address Control"
+msgstr "Controle de endereço MAC"
+
+#: usr/local/www/services_dhcp.php:961 usr/local/www/services_dhcp.php:974
+#: usr/local/www/services_dhcp.php:994 usr/local/www/services_dhcp.php:1006
+msgid "Show MAC Address Control"
+msgstr "Visualizar Controle de endereço MAC"
+
+#: usr/local/www/services_dhcp.php:965 usr/local/www/services_dhcp.php:978
+#: usr/local/www/services_dhcp.php:998 usr/local/www/services_dhcp.php:1010
+msgid "Enter a list of partial MAC addresses to allow, comma separated, no spaces, such as "
+msgstr "Entre com uma lista parcial de endereços MAC permitidos, separados por virgula, sem espaço, como "
+
+#: usr/local/www/services_dhcp.php:967 usr/local/www/services_dhcp.php:980
+#: usr/local/www/services_dhcp.php:1000 usr/local/www/services_dhcp.php:1012
+msgid "Enter a list of partial MAC addresses to deny access, comma separated, no spaces, such as "
+msgstr "Entre com uma lista parcial de endereços MAC bloqueados, separados por virgula, sem espaço, como "
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:89
+msgid "You cannot use spaces or slashes in the 'name' field."
+msgstr "Você não pode usar espaços ou barras no campo 'nome'."
+
+#: usr/local/www/guiconfig.inc:1009 usr/local/www/guiconfig.inc:1024
+#: usr/local/www/guiconfig.inc:1021 usr/local/www/guiconfig.inc:1028
+msgid "move mouse out this alias to hide"
+msgstr "mova o mouse para fora para esconder este alias"
+
+#: usr/local/www/guiconfig.inc:1066 usr/local/www/guiconfig.inc:1081
+#: usr/local/www/guiconfig.inc:1078 usr/local/www/guiconfig.inc:1085
+msgid "edit this alias"
+msgstr "edita o alias"
+
+#: usr/local/www/guiconfig.inc:1077 usr/local/www/guiconfig.inc:1089
+#: usr/local/www/guiconfig.inc:1092 usr/local/www/guiconfig.inc:1104
+#: usr/local/www/guiconfig.inc:1101 usr/local/www/guiconfig.inc:1096
+#: usr/local/www/guiconfig.inc:1108
+msgid "loading..."
+msgstr "carregando..."
+
+#: usr/local/www/system_firmware_settings.php:175
+#: usr/local/www/system_firmware_settings.php:184
+#: usr/local/www/system_firmware_settings.php:186
+msgid "Dashboard check"
+msgstr "Checagem do Dashboard"
+
+#: usr/local/www/system_firmware_settings.php:179
+#: usr/local/www/system_firmware_settings.php:188
+#: usr/local/www/system_firmware_settings.php:190
+msgid "Disable the automatic dashboard auto-update check."
+msgstr "Desabilita a checagem de auto atualização do dashboard."
+
+#: usr/local/www/services_ntpd.php:119
+msgid "Interfaces without an IP address will not be shown."
+msgstr "Interfaces sem um endereço de IP não serão visualizados."
+
+#: usr/local/www/services_ntpd.php:121
+msgid "Selecting no interfaces will listen on all interfaces with a wildcard."
+msgstr "Senão selecionar uma interface, todas elas serão atribuidas a escutar em um curiga (*)."
+
+#: usr/local/www/services_ntpd.php:122
+msgid "Selecting all interfaces will explicitly listen on only the interfaces/IPs specified."
+msgstr "Selecionando todas as interfaces, será explicito que somente o endereço IP especifico da interface será usado."
+
+#: usr/local/www/services_ntpd.php:140
+msgid "The GPS must provide NMEA format output!"
+msgstr "O GPS deve prover uma saida no formato NMEA!"
+
+#: usr/local/www/services_ntpd.php:142
+msgid "All serial ports are listed, be sure to pick only the port with the GPS attached."
+msgstr "Todas as portas seriais são listadas, mas somente uma porta pode ser selecionada para atribuir ao GPS."
+
+#: usr/local/www/services_ntpd.php:144
+msgid "It is best to configure at least 2 servers under"
+msgstr "É melhor configurar pelo menos 2 servidores sob"
+
+#: usr/local/www/services_ntpd.php:144
+msgid "System > General"
+msgstr "Sistema > Geral"
+
+#: usr/local/www/services_ntpd.php:144
+msgid "to avoid loss of sync if the GPS data is not valid over time. Otherwise ntpd may only use values from the unsynchronized local clock when providing time to clients."
+msgstr "para evitar a perda de sincronia, se os dados de GPS não é válida ao longo do tempo. Caso contrário ntpd só podem utilizar os valores do relógio local não sincronizado ao fornecer tempo para os clientes."
+
+#: usr/local/www/firewall_aliases.php:177
+#: usr/local/www/firewall_aliases.php:175
+msgid "Ports"
+msgstr "Portas"
+
+#: usr/local/www/firewall_aliases.php:178
+#: usr/local/www/firewall_aliases.php:176
+msgid "Urls"
+msgstr "Urls"
+
+#: usr/local/www/firewall_aliases.php:195
+#: usr/local/www/firewall_aliases.php:272
+#: usr/local/www/firewall_aliases.php:274
+#: usr/local/www/firewall_aliases.php:275
+msgid "Add a new alias"
+msgstr "Adiciona um novo alias"
+
+#: usr/local/www/firewall_aliases.php:255
+#: usr/local/www/firewall_aliases.php:256
+#: usr/local/www/firewall_aliases.php:257
+msgid "Edit alias"
+msgstr "Edita alias"
+
+#: usr/local/www/firewall_aliases.php:256
+#: usr/local/www/firewall_aliases.php:257
+#: usr/local/www/firewall_aliases.php:258
+msgid "Delete alias"
+msgstr "Remove alias"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:64
+msgid "The zone name can only contain letters, digits, and underscores (_)."
+msgstr "O nome da zone somente pode conter letras, números e sobre-linha (_)."
+
+#: usr/local/www/services_captiveportal_zones_edit.php:105
+#: usr/local/www/services_captiveportal_zones_edit.php:101
+msgid "Zone name. Can only contain letters, digits, and underscores (_)."
+msgstr "Nome da Zona. Somente pode conter letras, números e sobrelinhas (_)."
+
+#: usr/local/www/diag_packet_capture.php:81
+msgid "Invalid interface."
+msgstr "Interface inválida"
+
+#: usr/local/www/diag_packet_capture.php:84
+msgid "Invalid address family."
+msgstr "Família de Endereço inválido."
+
+#: usr/local/www/diag_packet_capture.php:87
+msgid "Invalid protocol."
+msgstr "procolo inválido."
+
+#: usr/local/www/diag_packet_capture.php:92
+#, fuzzy, php-format
+msgid "A valid IP address or CIDR block must be specified. [%s]"
+msgstr "Um endereço IP local válido deve ser especificado para %s."
+
+#: usr/local/www/diag_packet_capture.php:97
+msgid "Invalid value specified for port."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:104
+msgid "Invalid value specified for packet length."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:111
+msgid "Invalid value specified for packet count."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:148
+#: usr/local/www/vpn_ipsec_phase2.php:152
+#, fuzzy
+msgid "A valid NAT local network bit count must be specified."
+msgstr "Um contador de bits de rede local válido deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase2.php:150
+#: usr/local/www/vpn_ipsec_phase2.php:154
+msgid "You cannot configure a network type address for NAT while only an address type is selected for local source."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:153
+#: usr/local/www/vpn_ipsec_phase2.php:157
+#, fuzzy
+msgid "A valid NAT local network IP address must be specified."
+msgstr "Um endereço IP válido da rede local deve ser especificado."
+
+#: usr/local/www/vpn_ipsec_phase2.php:548
+#: usr/local/www/vpn_ipsec_phase2.php:569
+msgid "In case you need NAT/BINAT on this network specify the address to be translated"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:114
+msgid "VPN: IPsec: Edit Pre-Shared Key"
+msgstr "VPN: IPsec: Edite Chave Pré-Compartilhada"
+
+#: usr/local/www/services_dhcp_edit.php:227
+#: usr/local/www/services_dhcp_edit.php:355
+msgid "If an IPv4 address is entered, the address must be outside of the pool."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:229
+#: usr/local/www/services_dhcp_edit.php:357
+#, fuzzy
+msgid "If no IPv4 address is given, one will be dynamically allocated from the pool."
+msgstr "Se nenhum endereço IP for dado, um será dinamicamente alocado do pool."
+
+#: usr/local/www/interfaces.php:2460 usr/local/www/interfaces.php:2490
+#: usr/local/www/interfaces.php:2536 usr/local/www/interfaces.php:2525
+#: usr/local/www/interfaces.php:2561
+msgid "WPA Pre-Shared Key"
+msgstr "Chave Pré-Compartilhada WPA"
+
+#: usr/local/www/vpn_openvpn_client.php:789
+#: usr/local/www/vpn_openvpn_client.php:808
+msgid "This is the IPv6 virtual network used for private communications between this client and the server expressed using CIDR (eg. fe80::/64). The first network address is assumed to be the server address and the second network address will be assigned to the client virtual interface"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:803
+#, fuzzy
+msgid "This is a network that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as a CIDR range. If this is a site-to-site VPN, enter the remote LAN here. You may leave this blank to only communicate with other clients"
+msgstr "Essa é uma rede que será roteada através do túnel para que uma VPN site-to-site possa ser estabelecida sem modificar manualmente as tabelas de roteamento. Expressa como um intervalor CIDR. Se essa é uma VPN site-to-site, informe que a LAN remote. Você deve deixar isso em branco para somente comunicar-se com outros clientes"
+
+#: usr/local/www/vpn_openvpn_client.php:817
+msgid "This is an IPv6 network that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as an IP/PREFIX. If this is a site-to-site VPN, enter the remote LAN here. You may leave this blank to only communicate with other clients"
+msgstr ""
+
+#: usr/local/www/vpn_l2tp.php:301 usr/local/www/vpn_l2tp.php:304
+msgid "Enable L2TP server"
+msgstr "Habilita servidor L2TP"
+
+#: usr/local/www/vpn_l2tp.php:322 usr/local/www/vpn_l2tp.php:325
+msgid "Server Address"
+msgstr "Endereço do Servidor"
+
+#: usr/local/www/vpn_l2tp.php:334 usr/local/www/vpn_l2tp.php:337
+msgid "Remote Address Range"
+msgstr "Faixa de endereço remoto"
+
+#: usr/local/www/vpn_l2tp.php:384 usr/local/www/vpn_l2tp.php:387
+msgid "Authentication Type"
+msgstr "Tipo de Autenticação"
+
+#: usr/local/www/vpn_l2tp.php:429 usr/local/www/vpn_l2tp.php:432
+msgid "RADIUS Shared Secret"
+msgstr "Chave compartilhada do RADIUS"
+
+#: usr/local/www/vpn_l2tp.php:436 usr/local/www/vpn_l2tp.php:439
+msgid "RADIUS Issued IP's"
+msgstr "IP's emitidos do RADIUS"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:126
+#: usr/local/www/firewall_virtual_ip_edit.php:128
+#, fuzzy
+msgid "The /31 and /32 subnet mask are invalid for CARP IPs."
+msgstr "A máscara de subrede /32 é inválida para IPs CARP."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:130
+#: usr/local/www/firewall_virtual_ip_edit.php:132
+#, fuzzy
+msgid "The /127 and /128 subnet mask are invalid for CARP IPs."
+msgstr "A máscara de rede /128 é inválida para IPs CARP."
+
+#: usr/local/www/interfaces_gif.php:137 usr/local/www/interfaces_gif.php:141
+msgid "If you are using a GIF tunnel to connect to a Hurricane Electric (he.net) Tunnel Broker on a WAN with a dynamic IP, you may want to add a"
+msgstr ""
+
+#: usr/local/www/interfaces_gif.php:137 usr/local/www/interfaces_gif.php:141
+msgid "HE.net Tunnelbroker type DynDNS Entry"
+msgstr ""
+
+#: usr/local/www/interfaces_gif.php:137 usr/local/www/interfaces_gif.php:141
+msgid "to keep your tunnel functional when your IP changes."
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:102
+#: usr/local/www/widgets/widgets/system_information.widget.php:103
+#: usr/local/www/widgets/widgets/system_information.widget.php:101
+#: usr/local/www/widgets/widgets/system_information.widget.php:107
+#, fuzzy
+msgid "Obtaining update status"
+msgstr "Status de Download de Auto-Atualização"
+
+#: usr/local/www/vpn_ipsec_phase1.php:680
+#: usr/local/www/vpn_ipsec_phase1.php:701
+#, fuzzy
+msgid "Input your Pre-Shared Key string"
+msgstr "Insira sua string de chave pré-configurada"
+
+#: usr/local/www/diag_nanobsd.php:179 usr/local/www/diag_nanobsd.php:170
+msgid "Media Read/Write Status"
+msgstr "Status da Media de Leitura/Escrita"
+
+#: usr/local/www/diag_nanobsd.php:192 usr/local/www/diag_nanobsd.php:183
+msgid "Read/Write"
+msgstr "Leitura/Escrita"
+
+#: usr/local/www/diag_nanobsd.php:194 usr/local/www/diag_nanobsd.php:185
+msgid "Switch to Read-Only"
+msgstr "Alterar para somente-leitura"
+
+#: usr/local/www/diag_nanobsd.php:196 usr/local/www/diag_nanobsd.php:187
+msgid "Read-Only"
+msgstr "Somente-Leitura"
+
+#: usr/local/www/diag_nanobsd.php:198 usr/local/www/diag_nanobsd.php:189
+msgid "Switch to Read/Write"
+msgstr "Alterar para Leitura/Escrita"
+
+#: usr/local/www/diag_nanobsd.php:201 usr/local/www/diag_nanobsd.php:192
+msgid "NOTE: This setting is only temporary, and can be switched dynamically in the background."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:208 usr/local/www/diag_nanobsd.php:199
+msgid "Keep media mounted read/write at all times."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:821 usr/local/www/services_dhcpv6.php:838
+#, fuzzy
+msgid "Status: DHCPv6 leases"
+msgstr "Concessões DHCPv6"
+
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:307
+msgid "Rule"
+msgstr "Regra"
+
+#: usr/local/www/system_firmware.php:55
+msgid "Standard Kernel"
+msgstr "Kernel Padrão"
+
+#: usr/local/www/system_firmware.php:56
+msgid "Embedded Kernel"
+msgstr "Kernel Embarcado"
+
+#: usr/local/www/vpn_l2tp.php:88 usr/local/www/vpn_pptp.php:96
+#, fuzzy
+msgid "'Server address' parameter should NOT be set to any IP address currently in use on this firewall."
+msgstr "NOTA: Este não deve ser definido para nenhum endereço IP atualmente em uso neste firewall "
+
+#: usr/local/www/system_camanager.php:220
+#: usr/local/www/system_certmanager.php:299
+#: usr/local/www/system_certmanager.php:301
+#, fuzzy
+msgid "Please select a valid Key Length."
+msgstr "Por favor, selecione um acelerador de Criptografia válido."
+
+#: usr/local/www/system_camanager.php:222
+#: usr/local/www/system_certmanager.php:303
+#, fuzzy
+msgid "Please select a valid Digest Algorithm."
+msgstr "Por favor, selecione um acelerador de Criptografia válido."
+
+#: usr/local/www/system_camanager.php:477
+#: usr/local/www/system_certmanager.php:690
+#: usr/local/www/system_certmanager.php:863
+#: usr/local/www/system_certmanager.php:691
+#: usr/local/www/system_certmanager.php:867
+msgid "Digest Algorithm"
+msgstr "Algoritmo Digest"
+
+#: usr/local/www/system_camanager.php:489
+#: usr/local/www/system_certmanager.php:702
+#: usr/local/www/system_certmanager.php:875
+#: usr/local/www/system_certmanager.php:703
+#: usr/local/www/system_certmanager.php:879
+msgid "NOTE: It is recommended to use an algorithm stronger than SHA1 when possible."
+msgstr ""
+
+#: usr/local/www/system_camanager.php:653
+#: usr/local/www/system_certmanager.php:1127
+#: usr/local/www/system_certmanager.php:1131
+msgid "Valid From"
+msgstr "Válido de"
+
+#: usr/local/www/system_camanager.php:658
+#: usr/local/www/system_certmanager.php:1132
+#: usr/local/www/system_certmanager.php:1136
+msgid "Valid Until"
+msgstr "Válido até"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:107
+#, fuzzy
+msgid "A valid subnet mask must be specified"
+msgstr "Uma sub-rede externa válida deve ser especificada."
+
+#: usr/local/www/vpn_openvpn_client.php:160
+#: usr/local/www/vpn_openvpn_server.php:213
+msgid "Protocol and IP address families do not match. You cannot select an IPv6 protocol and an IPv4 IP address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:162
+#: usr/local/www/vpn_openvpn_server.php:215
+msgid "Protocol and IP address families do not match. You cannot select an IPv4 protocol and an IPv6 IP address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:164
+#: usr/local/www/vpn_openvpn_server.php:217
+msgid "An IPv4 protocol was selected, but the selected interface has no IPv4 address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:166
+#: usr/local/www/vpn_openvpn_server.php:219
+msgid "An IPv6 protocol was selected, but the selected interface has no IPv6 address."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:818
+#: usr/local/www/vpn_openvpn_server.php:1252
+#, fuzzy
+msgid "IPv4 Remote Network/s"
+msgstr "Rede remota IPv4"
+
+#: usr/local/www/vpn_openvpn_client.php:822
+msgid "These are the IPv4 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as a comma-separated list of one or more CIDR ranges. If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank to only communicate with other clients"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:832
+#: usr/local/www/vpn_openvpn_server.php:1266
+#, fuzzy
+msgid "IPv6 Remote Network/s"
+msgstr "Rede remota IPv6"
+
+#: usr/local/www/vpn_openvpn_client.php:836
+msgid "These are the IPv6 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as a comma-separated list of one or more IP/PREFIX. If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank to only communicate with other clients"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:909
+msgid "EXAMPLE:"
+msgstr "EXEMPLO:"
+
+#: usr/local/www/status_openvpn.php:201 usr/local/www/status_openvpn.php:211
+msgid "Show Routing Table"
+msgstr "Mostra tabela de roteamento"
+
+#: usr/local/www/status_openvpn.php:201 usr/local/www/status_openvpn.php:211
+msgid "Display OpenVPN's internal routing table for this server."
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:207 usr/local/www/status_openvpn.php:217
+msgid "Routing Table"
+msgstr "Tabela de roteamento"
+
+#: usr/local/www/status_openvpn.php:216 usr/local/www/status_openvpn.php:226
+msgid "Target Network"
+msgstr "Rede Alvo"
+
+#: usr/local/www/status_openvpn.php:217 usr/local/www/status_openvpn.php:227
+msgid "Last Used"
+msgstr "Último Usado"
+
+#: usr/local/www/status_openvpn.php:239 usr/local/www/status_openvpn.php:249
+msgid "An IP address followed by C indicates a host currently connected through the VPN."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:49 usr/local/www/diag_testport.php:114
+#: usr/local/www/fbegin.inc:218
+msgid "Test Port"
+msgstr "Teste de Porta"
+
+#: usr/local/www/diag_testport.php:64
+#, fuzzy
+msgid "Please enter a valid IP or hostname."
+msgstr "Host deve ser um hostname ou endereço IP válido."
+
+#: usr/local/www/diag_testport.php:68
+#, fuzzy
+msgid "Please enter a valid port number."
+msgstr "Um número de porta válido deve ser especificado. [%s]"
+
+#: usr/local/www/diag_testport.php:72
+msgid "Please enter a valid source port number, or leave the field blank."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:76
+msgid "You cannot connect to an IPv4 address using IPv6."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:79
+msgid "You cannot connect to an IPv6 address using IPv4."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:106
+msgid "This page allows you to perform a simple TCP connection test to determine if a host is up and accepting connections on a given port. This test does not function for UDP since there is no way to reliably determine if a UDP port accepts connections in this manner."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:108
+msgid "No data is transmitted to the remote host during this test, it will only attempt to open a connection and optionally display the data sent back from the server."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:132
+#, fuzzy
+msgid "This should typically be left blank."
+msgstr "Isto será usado se o campo for deixado em branco."
+
+#: usr/local/www/diag_testport.php:136
+msgid "Show Remote Text"
+msgstr "Mostra texto remoto"
+
+#: usr/local/www/diag_testport.php:139
+msgid "Shows the text given by the server when connecting to the port. Will take 10+ seconds to display if checked."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:159 usr/local/www/diag_testport.php:161
+#: usr/local/www/diag_traceroute.php:104 usr/local/www/diag_ping.php:102
+msgid "IP Protocol"
+msgstr "Protocolo IP"
+
+#: usr/local/www/diag_testport.php:166 usr/local/www/diag_testport.php:168
+msgid "IPv4"
+msgstr "IPv4"
+
+#: usr/local/www/diag_testport.php:169 usr/local/www/diag_testport.php:171
+msgid "IPv6"
+msgstr "IPv6"
+
+#: usr/local/www/diag_testport.php:173 usr/local/www/diag_testport.php:175
+msgid "If you force IPv4 or IPv6 and use a hostname that does not contain a result using that protocol, it will result in an error. For example if you force IPv4 and use a hostname that only returns an AAAA IPv6 IP address, it will not work."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:186 usr/local/www/diag_testport.php:188
+msgid "Port Test Results"
+msgstr "Resultados do teste de Porta"
+
+#: usr/local/www/diag_testport.php:246 usr/local/www/diag_testport.php:248
+msgid "No output received, or connection failed. Try with \"Show Remote Text\" unchecked first."
+msgstr ""
+
+#: usr/local/www/diag_testport.php:248 usr/local/www/diag_testport.php:250
+msgid "Connection failed (Refused/Timeout)"
+msgstr "Conexão falhou (Recusada/Timeout)"
+
+#: usr/local/www/firewall_rules_edit.php:1295
+#: usr/local/www/firewall_nat_edit.php:780
+#: usr/local/www/firewall_nat_out_edit.php:647
+#: usr/local/www/firewall_rules_edit.php:1302
+#: usr/local/www/firewall_nat_edit.php:792
+#: usr/local/www/firewall_nat_out_edit.php:659
+#: usr/local/www/firewall_rules_edit.php:1301
+#: usr/local/www/firewall_nat_edit.php:793
+#: usr/local/www/firewall_rules_edit.php:1349
+msgid "Hint: This prevents the rule on Master from automatically syncing to other CARP members. This does NOT prevent the rule from being overwritten on Slave."
+msgstr ""
+
+#: usr/local/www/interfaces_qinq.php:68
+msgid "QinQ interface does not exist"
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:84
+#, fuzzy
+msgid "Interface supplied as parent is invalid"
+msgstr "Protocolo fornecido inválido"
+
+#: usr/local/www/system_firmware_settings.php:151
+#: usr/local/www/system_firmware_settings.php:153
+#, php-format
+msgid "Entries denoted by \"Current architecture\" match the architecture of your current installation, such as %s. Changing architectures during an upgrade is not recommended, and may require a manual reboot after the update completes."
+msgstr ""
+
+#: usr/local/www/interfaces_lagg_edit.php:95
+#: usr/local/www/interfaces_lagg_edit.php:98
+#, fuzzy
+msgid "Interface supplied as member is invalid"
+msgstr "Protocolo fornecido inválido"
+
+#: usr/local/www/interfaces_lagg_edit.php:101
+msgid "Protocol supplied is invalid"
+msgstr "Protocolo fornecido inválido"
+
+#: usr/local/www/status_captiveportal_expire.php:58
+#: usr/local/www/status_captiveportal_expire.php:73
+#: usr/local/www/status_captiveportal_vouchers.php:112
+#: usr/local/www/status_captiveportal.php:110
+#: usr/local/www/status_captiveportal_test.php:75
+#: usr/local/www/status_captiveportal_voucher_rolls.php:79
+msgid "Expire Vouchers"
+msgstr "Vouchers expirados"
+
+#: usr/local/www/status_captiveportal_expire.php:86
+msgid "Enter multiple vouchers separated by space or newline. All valid vouchers will be marked as expired"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:835
+#: usr/local/www/firewall_nat_edit.php:847
+#: usr/local/www/firewall_nat_edit.php:848
+msgid "NOTE: The \"pass\" selection does not work properly with Multi-WAN. It will only work on an interface containing the default gateway."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan.php:71
+msgid "Invalid VLAN interface."
+msgstr "Interface VLAN inválida"
+
+#: usr/local/www/interfaces_gif_edit.php:87
+msgid "The alias IP address family has to match the family of the remote peer address."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:193
+msgid "The IP address must not be within the range configured on a DHCP pool for this interface."
+msgstr "O endereço IP não deve estar dentro do intervalo DHCP para essa interface."
+
+#: usr/local/www/services_dhcp_edit.php:388
+msgid "ARP Table Static Entry"
+msgstr "Tabela de entradas estaticas ARP"
+
+#: usr/local/www/services_dhcp_edit.php:391
+msgid "Create an ARP Table Static Entry for this MAC & IP Address pair. "
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:117
+msgid "This IP address is being used by another interface or VIP."
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:122 usr/local/www/diag_traceroute.php:141
+msgid "Reverse Address Lookup"
+msgstr "DNS Lookup Reverso"
+
+#: usr/local/www/interfaces_bridge.php:70
+#, fuzzy
+msgid "Invalid bridge interface."
+msgstr "Interface Bridge"
+
+#: usr/local/www/diag_smart.php:339
+msgid "Perform Self-tests"
+msgstr "Performance dos auto-testes"
+
+#: usr/local/www/diag_smart.php:384
+msgid "Self-test"
+msgstr "Auto-teste"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1484
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1427
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1364
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1225
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1485
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1428
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1365
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1226
+msgid "Connections From Upstream SIP Server"
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1497
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1440
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1377
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1238
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1499
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1442
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1379
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1240
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1498
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1441
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1378
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1239
+msgid "Connections To Upstream SIP Server"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe_edit.php:149
+msgid "Wrong data submitted"
+msgstr "Dados errados submetidos"
+
+#: usr/local/www/license.php:158
+msgid "1992-2012 The FreeBSD Project. All rights reserved"
+msgstr "1992-2013 Projeto FreeBSD. Todos os direitos reservados"
+
+#: usr/local/www/license.php:161
+msgid "1999-2010 The PHP Group. All rights reserved."
+msgstr "1999-2010 Grupo PHP. Todos os direitos reservados."
+
+#: usr/local/www/license.php:164
+msgid "2004, Jan Knescke, incremental"
+msgstr "2004, Jan Knescke. incremental"
+
+#: usr/local/www/license.php:168
+msgid "2004-2012 Internet Software Consortium, Inc."
+msgstr "2004-2012 Internet Software Consortium, Inc."
+
+#: usr/local/www/license.php:169
+msgid "1995-2003 Internet Software Consortium"
+msgstr "1995-2003 Internet Software Consortium"
+
+#: usr/local/www/services_dhcp.php:352 usr/local/www/services_dhcp.php:372
+#: usr/local/www/services_dhcp.php:373
+msgid "The specified range must not be within the DHCP range for this interface."
+msgstr "Especifique uma faixa que não deve estar na faixa de DHCP nesta interface."
+
+#: usr/local/www/services_dhcp.php:361 usr/local/www/services_dhcp.php:381
+#: usr/local/www/services_dhcp.php:382
+#, fuzzy
+msgid "The specified range must not be within the range configured on a DHCP pool for this interface."
+msgstr "Especifique uma faixa que não deve estar na faixa de DHCP nesta interface."
+
+#: usr/local/www/services_dhcp.php:713 usr/local/www/services_dhcp.php:733
+#: usr/local/www/services_dhcp.php:745
+msgid "Pool Description"
+msgstr "Descrição do Pool"
+
+#: usr/local/www/services_dhcp.php:903 usr/local/www/services_dhcp.php:923
+#: usr/local/www/services_dhcp.php:935
+msgid "Leave blank to disable. Enter the interface IP address of the other machine. Machines must be using CARP. Interface's advskew determines whether the DHCPd process is Primary or Secondary. Ensure one machine's advskew<20 (and the other is >20)."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:946 usr/local/www/services_dhcp.php:966
+#: usr/local/www/services_dhcp.php:978
+#, fuzzy
+msgid ""
+"By default DHCP leases are displayed in UTC time. By checking this\n"
+"\t\t\t\t\t\tbox DHCP lease time will be displayed in local time and set to time zone selected. This will be used for all DHCP interfaces lease time."
+msgstr ""
+"Por DHCP padrão arrendamentos são exibidas em tempo UTC. Ao marcar esta \n"
+"\t\t\t\t\t\tcaixa tempo de concessão DHCP será exibida no horário local e definir a zona de tempo selecionado. Isso será usado para todos os tempos interfaces de DHCP locação."
+
+#: usr/local/www/services_dhcp.php:1146 usr/local/www/services_dhcp.php:1166
+#: usr/local/www/services_dhcp.php:1178
+#, fuzzy
+msgid "DHCP Static Mappings for this interface."
+msgstr "Registrar mapeamentos estáticos DHCP no DNS forwarder"
+
+#: usr/local/www/diag_system_pftop.php:133
+msgid "View type:"
+msgstr "Tipo de Visualização:"
+
+#: usr/local/www/diag_system_pftop.php:136
+msgid "Label"
+msgstr "Etiqueta"
+
+#: usr/local/www/diag_system_pftop.php:141
+msgid "Speed"
+msgstr "Velocidade"
+
+#: usr/local/www/diag_system_pftop.php:150
+msgid "Age"
+msgstr "Idade"
+
+#: usr/local/www/diag_system_pftop.php:151
+msgid "Bytes"
+msgstr "Bytes"
+
+#: usr/local/www/diag_system_pftop.php:152
+msgid "Destination Address"
+msgstr "Endereço de Destino"
+
+#: usr/local/www/diag_system_pftop.php:154
+msgid "Expiry"
+msgstr "Expirado"
+
+#: usr/local/www/diag_system_pftop.php:156
+msgid "Peak"
+msgstr "Pico"
+
+#: usr/local/www/diag_system_pftop.php:157
+msgid "Packet"
+msgstr "Pacote"
+
+#: usr/local/www/diag_system_pftop.php:161 usr/local/www/diag_testport.php:143
+#: usr/local/www/diag_traceroute.php:113 usr/local/www/diag_ping.php:111
+msgid "Source Address"
+msgstr "Endereço de Origem"
+
+#: usr/local/www/diag_system_pftop.php:166
+msgid "Number of States:"
+msgstr "Número de Estados:"
+
+#: usr/local/www/system_advanced_misc.php:357
+#: usr/local/www/system_advanced_misc.php:404
+#: usr/local/www/system_advanced_misc.php:410
+msgid "On AC Power Mode"
+msgstr "Em modo Ligado"
+
+#: usr/local/www/system_advanced_misc.php:365
+#: usr/local/www/system_advanced_misc.php:412
+#: usr/local/www/system_advanced_misc.php:418
+msgid "On Battery Power Mode"
+msgstr "Em modo bateria"
+
+#: usr/local/www/bandwidth_by_ip.php:24
+msgid "Wrong Interface"
+msgstr "Interface errada"
+
+#: usr/local/www/services_dhcpv6.php:601
+msgid "Prefix Delegation Size"
+msgstr "Tamanho do prefixo de Delegação"
+
+#: usr/local/www/services_dhcpv6.php:846
+#, fuzzy
+msgid "DHCPv6 Static Mappings for this interface."
+msgstr "Mapeamento DHCPv6 estático"
+
+#: usr/local/www/system_authservers.php:217
+#: usr/local/www/system_authservers.php:219
+#, fuzzy
+msgid "RADIUS Timeout value must be numeric and positive."
+msgstr "Timeout deve ser um valor numérico"
+
+#: usr/local/www/system_authservers.php:731
+#: usr/local/www/system_authservers.php:773
+msgid "Authentication Timeout"
+msgstr "Limite de tempo de Autenticação"
+
+#: usr/local/www/system_authservers.php:734
+#: usr/local/www/system_authservers.php:776
+msgid "This value controls how long, in seconds, that the RADIUS server may take to respond to an authentication request."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:735
+#: usr/local/www/system_authservers.php:777
+#, fuzzy
+msgid "If left blank, the default value is 5 seconds."
+msgstr "NOTA: Se deixar em branco e um dominio padrão é definido, ele irá ser usado para esse valor."
+
+#: usr/local/www/system_authservers.php:736
+#: usr/local/www/system_authservers.php:778
+msgid "NOTE: If you are using an interactive two-factor authentication system, increase this timeout to account for how long it will take the user to receive and enter a token."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:80
+#: usr/local/www/system_advanced_firewall.php:82
+msgid "The Firewall Adaptive values must be set together."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:82
+#: usr/local/www/system_advanced_firewall.php:84
+#, fuzzy
+msgid "The Firewall Adaptive Start value must be an integer."
+msgstr "O valor de estado máximo do Firewall deve ser um inteiro."
+
+#: usr/local/www/system_advanced_firewall.php:85
+#: usr/local/www/system_advanced_firewall.php:87
+#, fuzzy
+msgid "The Firewall Adaptive End value must be an integer."
+msgstr "O valor de Máximo de Tabelas de Firewall deve ser um inteiro."
+
+#: usr/local/www/system_advanced_firewall.php:345
+#: usr/local/www/system_advanced_firewall.php:346
+#: usr/local/www/system_advanced_firewall.php:357
+#, fuzzy
+msgid "Firewall Adaptive Timeouts"
+msgstr "Adaptável"
+
+#: usr/local/www/system_advanced_firewall.php:347
+#: usr/local/www/system_advanced_firewall.php:348
+#: usr/local/www/system_advanced_firewall.php:359
+msgid "Timeouts for states can be scaled adaptively as the number of state table entries grows."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:350
+#: usr/local/www/system_advanced_firewall.php:351
+#: usr/local/www/system_advanced_firewall.php:362
+msgid "When the number of state entries exceeds this value, adaptive scaling begins. All timeout values are scaled linearly with factor (adaptive.end - number of states) / (adaptive.end - adaptive.start)."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:354
+#: usr/local/www/system_advanced_firewall.php:355
+#: usr/local/www/system_advanced_firewall.php:366
+msgid "When reaching this number of state entries, all timeout values become zero, effectively purging all state entries immediately. This value is used to define the scale factor, it should not actually be reached (set a lower state limit, see below)."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:356
+#: usr/local/www/system_advanced_firewall.php:357
+#: usr/local/www/system_advanced_firewall.php:368
+#, fuzzy
+msgid "Note: Leave this blank for the default(0)."
+msgstr "Nota: Deixe isso em branco para o padrão."
+
+#: usr/local/www/system_advanced_firewall.php:447
+#: usr/local/www/system_advanced_firewall.php:448
+#: usr/local/www/system_advanced_firewall.php:469
+#, fuzzy
+msgid "Bogon Networks"
+msgstr "Bloquear redes bogon"
+
+#: usr/local/www/system_advanced_firewall.php:450
+#: usr/local/www/system_advanced_firewall.php:451
+#: usr/local/www/system_advanced_firewall.php:472
+msgid "Update Frequency"
+msgstr "Frequencia de atualização"
+
+#: usr/local/www/system_advanced_firewall.php:453
+#: usr/local/www/system_advanced_firewall.php:454
+#: usr/local/www/system_advanced_firewall.php:475
+msgid "Monthly"
+msgstr "Mensalmente"
+
+#: usr/local/www/system_advanced_firewall.php:454
+#: usr/local/www/system_advanced_firewall.php:455
+#: usr/local/www/system_advanced_firewall.php:476
+msgid "Weekly"
+msgstr "Semanalmente"
+
+#: usr/local/www/system_advanced_firewall.php:455
+#: usr/local/www/system_advanced_firewall.php:456
+#: usr/local/www/system_advanced_firewall.php:477
+msgid "Daily"
+msgstr "Diariamente"
+
+#: usr/local/www/system_advanced_firewall.php:458
+#: usr/local/www/system_advanced_firewall.php:459
+#: usr/local/www/system_advanced_firewall.php:480
+msgid "The frequency of updating the lists of IP addresses that are reserved (but not RFC 1918) or not yet assigned by IANA."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:227
+#: usr/local/www/services_captiveportal.php:243
+msgid "The NAS-Identifier must be 3-253 characters long and should only contain ASCII characters."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:593
+#: usr/local/www/services_captiveportal.php:609
+msgid "Allow only users/groups with 'Captive portal login' privilege set"
+msgstr "Permite somente usuários/grupos com previlegios de \"Login de Captive Portal\""
+
+#: usr/local/www/services_captiveportal.php:760
+#: usr/local/www/services_captiveportal.php:776
+#, fuzzy
+msgid "MAC authentication secret"
+msgstr "Segredo Compartilhado do Servidor de Autenticação 802.1X"
+
+#: usr/local/www/services_captiveportal.php:823
+#: usr/local/www/services_captiveportal.php:839
+msgid "Accounting Style"
+msgstr "Estilo de contabilidade"
+
+#: usr/local/www/services_captiveportal.php:824
+#: usr/local/www/services_captiveportal.php:840
+msgid "Invert Acct-Input-Octets and Acct-Output-Octets"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:825
+#: usr/local/www/services_captiveportal.php:841
+msgid "When this is enabled, data counts for RADIUS accounting packets will be taken from the client perspective, not the NAS. Acct-Input-Octets will represent download, and Acct-Output-Octets will represent upload."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:829
+#: usr/local/www/services_captiveportal.php:845
+msgid "NAS Identifier"
+msgstr "Identificador NAS"
+
+#: usr/local/www/services_captiveportal.php:831
+#: usr/local/www/services_captiveportal.php:847
+msgid "Specify a NAS identifier to override the default value"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:193 usr/local/www/pkg_mgr_install.php:189
+msgid "No packages are installed."
+msgstr "Nenhum pacote instalado."
+
+#: usr/local/www/interfaces_bridge_edit.php:154
+msgid "A member interface passed does not exist in configuration"
+msgstr ""
+
+#: usr/local/www/status_queues.php:150 usr/local/www/status_queues.php:172
+msgid "PPS"
+msgstr "PPS"
+
+#: usr/local/www/status_queues.php:152 usr/local/www/status_queues.php:174
+msgid "Borrows"
+msgstr "Emprestimos"
+
+#: usr/local/www/status_queues.php:153 usr/local/www/status_queues.php:175
+msgid "Suspends"
+msgstr "Suspensos"
+
+#: usr/local/www/status_queues.php:154 usr/local/www/status_queues.php:176
+msgid "Drops"
+msgstr "Descartados"
+
+#: usr/local/www/status_queues.php:155 usr/local/www/status_queues.php:177
+msgid "Length"
+msgstr "Tamanho"
+
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:51
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:78
+msgid "Int."
+msgstr "int."
+
+#: usr/local/www/widgets/widgets/log.widget.php:164
+#: usr/local/www/widgets/widgets/log.widget.php:168
+#: usr/local/www/widgets/widgets/log.widget.php:169
+msgid "IF"
+msgstr "SE"
+
+#: usr/local/www/widgets/widgets/log.widget.php:167
+#: usr/local/www/widgets/widgets/log.widget.php:171
+msgid "Prot"
+msgstr "Prot."
+
+#: usr/local/www/services_dnsmasq.php:199
+#: usr/local/www/services_dnsmasq.php:201
+#: usr/local/www/services_dnsmasq.php:222
+#, fuzzy
+msgid "DNS Query Forwarding"
+msgstr "encaminhando"
+
+#: usr/local/www/services_dnsmasq.php:202
+#: usr/local/www/services_dnsmasq.php:204
+#: usr/local/www/services_dnsmasq.php:225
+#, fuzzy
+msgid "Query DNS servers sequentially"
+msgstr "Servidores DNS"
+
+#: usr/local/www/services_dnsmasq.php:203
+#: usr/local/www/services_dnsmasq.php:205
+#: usr/local/www/services_dnsmasq.php:226
+#, php-format
+msgid "If this option is set, %s DNS Forwarder (dnsmasq) will query the DNS servers sequentially in the order specified (<i>System - General Setup - DNS Servers</i>), rather than all at once in parallel. "
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:212
+#: usr/local/www/services_dnsmasq.php:214
+#: usr/local/www/services_dnsmasq.php:235
+msgid "Require domain"
+msgstr "Requer dominio"
+
+#: usr/local/www/services_dnsmasq.php:213
+#: usr/local/www/services_dnsmasq.php:215
+#: usr/local/www/services_dnsmasq.php:236
+#, php-format
+msgid "If this option is set, %s DNS Forwarder (dnsmasq) will not forward A or AAAA queries for plain names, without dots or domain parts, to upstream name servers. If the name is not known from /etc/hosts or DHCP then a \"not found\" answer is returned. "
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:183
+msgid "A valid remote gateway IPv4 address must be specified or you need to change protocol to IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:185
+msgid "A valid remote gateway IPv6 address must be specified or you need to change protocol to IPv4"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:205
+msgid "There is a Phase 2 using IPv6, you cannot use IPv4."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:209
+msgid "There is a Phase 2 using IPv4, you cannot use IPv6."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1226
+msgid "IPv4 Local Network/s"
+msgstr "Rede(s) local(is) IPv4"
+
+#: usr/local/www/vpn_openvpn_server.php:1230
+msgid "These are the IPv4 networks that will be accessible from the remote endpoint. Expressed as a comma-separated list of one or more CIDR ranges. You may leave this blank if you don't want to add a route to the local network through this tunnel on the remote machine. This is generally set to your LAN network"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1239
+msgid "IPv6 Local Network/s"
+msgstr "Rede(s) local(is) IPv6"
+
+#: usr/local/www/vpn_openvpn_server.php:1243
+msgid "These are the IPv6 networks that will be accessible from the remote endpoint. Expressed as a comma-separated list of one or more IP/PREFIX. You may leave this blank if you don't want to add a route to the local network through this tunnel on the remote machine. This is generally set to your LAN network"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1256
+msgid "These are the IPv4 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as a comma-separated list of one or more CIDR ranges. If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank if you don't want a site-to-site VPN"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1270
+msgid "These are the IPv6 networks that will be routed through the tunnel, so that a site-to-site VPN can be established without manually changing the routing tables. Expressed as a comma-separated list of one or more IP/PREFIX. If this is a site-to-site VPN, enter the remote LAN/s here. You may leave this blank if you don't want a site-to-site VPN"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1405
+msgid "Topology"
+msgstr "Topologia"
+
+#: usr/local/www/vpn_openvpn_server.php:1415
+msgid "Allocate only one IP per client (topology subnet), rather than an isolated subnet per client (topology net30)."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1422
+msgid "Relevant when supplying a virtual adapter IP address to clients when using tun mode on IPv4."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1423
+msgid "Some clients may require this even for IPv6, such as OpenVPN Connect (iOS/Android). Others may break if it is present, such as older versions of OpenVPN or clients such as Yealink phones."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:133
+msgid "A valid local network IPv4 address must be specified or you need to change Mode to IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:135
+msgid "A valid local network IPv6 address must be specified or you need to change Mode to IPv4"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:159
+msgid "A valid NAT local network IPv4 address must be specified or you need to change Mode to IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:161
+msgid "A valid NAT local network IPv6 address must be specified or you need to change Mode to IPv4"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:183
+msgid "A valid remote network IPv4 address must be specified or you need to change Mode to IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:185
+msgid "A valid remote network IPv6 address must be specified or you need to change Mode to IPv4"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:192
+msgid "Mobile IPsec only supports Tunnel mode."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:287
+msgid "Phase 1 is using IPv4. You cannot use Tunnel IPv6 on Phase 2."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:289
+msgid "Phase 1 is using IPv6. You cannot use Tunnel IPv4 on Phase 2."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:210
+#, php-format
+msgid "You cannot set port %s to interface %s because this interface is a member of %s."
+msgstr ""
+
+#: usr/local/www/services_snmp.php:395
+msgid "UCD"
+msgstr "UCD"
+
+#: usr/local/www/services_snmp.php:397
+msgid "Regex"
+msgstr "Regex"
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:560
+#: usr/local/www/interfaces.php:556 usr/local/www/interfaces.php:559
+msgid "This IPv4 address is being used by another interface or VIP."
+msgstr ""
+
+#: usr/local/www/interfaces.php:557 usr/local/www/interfaces.php:565
+#: usr/local/www/interfaces.php:561 usr/local/www/interfaces.php:564
+msgid "This IPv4 address conflicts with a Static Route."
+msgstr ""
+
+#: usr/local/www/interfaces.php:568 usr/local/www/interfaces.php:577
+#: usr/local/www/interfaces.php:573 usr/local/www/interfaces.php:576
+msgid "This IPv6 address is being used by another interface or VIP."
+msgstr ""
+
+#: usr/local/www/interfaces.php:572 usr/local/www/interfaces.php:582
+#: usr/local/www/interfaces.php:578 usr/local/www/interfaces.php:581
+msgid "This IPv6 address conflicts with a Static Route."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2651 usr/local/www/interfaces.php:2697
+#: usr/local/www/interfaces.php:2686 usr/local/www/interfaces.php:2722
+msgid "Note: The update frequency can be changed under System->Advanced Firewall/NAT settings."
+msgstr ""
+
+#: etc/inc/priv/user.priv.inc:6
+msgid "User - Services - Captive portal login"
+msgstr "Usuários - Serviços - Login Captive Portal"
+
+#: etc/inc/priv/user.priv.inc:7
+#, fuzzy
+msgid "Indicates whether the user is able to login on the captive portal."
+msgstr "Indica se esse usuário pode fazer login, por exemplo, via SSH."
+
+#: etc/inc/pkg-utils.inc:617 etc/inc/pkg-utils.inc:618
+#, fuzzy, php-format
+msgid "Package %s is not supported on this version."
+msgstr "Versão do Pacote"
+
+#: etc/inc/priv.defs.inc:732
+msgid "WebCfg - Services: Captive portal: Allowed Hostnames page"
+msgstr "WebCfg - Serviços: Captive portal: Hostnames Permitidos"
+
+#: etc/inc/priv.defs.inc:733 etc/inc/priv.defs.inc:739
+msgid "Allow access to the 'Services: Captive portal: Allowed Hostnames' page."
+msgstr "Permite acesso a página 'Serviços: Captive porta: Hostnames Permitidos'"
+
+#: etc/inc/priv.defs.inc:738
+msgid "WebCfg - Services: Captive portal: Edit Allowed Hostnames page"
+msgstr "WebCfg - Serviços: Captive portal: Edita Hostnames permitidos"
+
+#: etc/inc/priv.defs.inc:1136
+#, fuzzy
+msgid "WebCfg - System: User Manager: settings page"
+msgstr "WebCfg - Sistema: Gerenciador de Usuários: Página de Configurações"
+
+#: etc/inc/priv.defs.inc:1137
+#, fuzzy
+msgid "Allow access to the 'System: User Manager: settings' page."
+msgstr "Permitir acesso à página 'Sistema: Gerenciador de usuários: Página deConfigurações'."
+
+#: etc/inc/interfaces.inc:294
+#, fuzzy, php-format
+msgid "interface_qinq_configure called with invalid if.%s"
+msgstr "interface_qinq_configure called with if undefined.%s"
+
+#: etc/inc/interfaces.inc:401
+#, fuzzy
+msgid "Creating wireless clone interfaces..."
+msgstr "Criando outras interfaces clones sem fio..."
+
+#: etc/inc/interfaces.inc:1139 etc/inc/interfaces.inc:1141
+msgid "Wrong parameters used during interface_bring_down"
+msgstr ""
+
+#: etc/inc/services.inc:2013 etc/inc/services.inc:2053
+#: etc/inc/services.inc:2084 etc/inc/services.inc:2148
+#: etc/inc/services.inc:2198
+#, php-format
+msgid "Removed cron job for %s"
+msgstr "Removido entrada cron para %s"
+
+#: etc/inc/openvpn.inc:257
+#, fuzzy, php-format
+msgid "The field '%s' must contain a single valid %s CIDR range."
+msgstr "O campo '%s' deve conter um intervalo CIDR válido."
+
+#: etc/inc/openvpn.inc:269
+#, php-format
+msgid "The field '%s' must contain only valid %s CIDR range(s) separated by commas."
+msgstr ""
+
+#: etc/inc/vpn.inc:1780 etc/inc/vpn.inc:1793 etc/inc/vpn.inc:1790
+#: etc/inc/vpn.inc:1792
+#, php-format
+msgid "Removing SPDs from tunnel gw '%1$s'. Local Subnet '%2$s' and Remote Subnet '%3$s'. Reloading policy"
+msgstr "Removendo SPDs do túnel gw '%1$s'. Subrede local '%2$s' e Subrede remota '%3$s'. Recarregando politica"
+
+#: etc/inc/pfsense-utils.inc:938
+msgid "Disabling auto login was not possible."
+msgstr "Desabilitar auto-login não é possivel."
+
+#: etc/inc/pfsense-utils.inc:956
+msgid "Enabled console auto login, console menu is NOT password protected."
+msgstr "Habilita auto login do console, menu de console NÃO é protegido por senha."
+
+#: etc/inc/pfsense-utils.inc:958
+msgid "Disabled console auto login, console menu is password protected."
+msgstr "Desabilita auto login do console, o menu de console é protegido por senha."
+
+#: usr/local/www/system_gateways_edit.php:552
+#: usr/local/www/system_gateways_edit.php:582
+msgid " - Show advanced option"
+msgstr " - Mostra opções avançada"
+
+#: usr/local/www/services_dyndns_edit.php:302
+#: usr/local/www/services_dyndns_edit.php:303
+msgid "Verbose logging"
+msgstr "Log verboso"
+
+#: usr/local/www/services_dyndns_edit.php:305
+#: usr/local/www/services_dyndns_edit.php:306
+msgid "verbose logging"
+msgstr "log verboso"
+
+#: usr/local/www/status_openvpn.php:278 usr/local/www/status_openvpn.php:339
+msgid "Bytes Rcvd"
+msgstr "Bytes Receb."
+
+#: usr/local/www/status_openvpn.php:385
+msgid "If you have custom options that override the management features of OpenVPN on a client or server, they will cause that OpenVPN instance to not work correctly with this status page."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1579
+#: usr/local/www/firewall_nat_edit.php:863
+#: usr/local/www/firewall_nat_out_edit.php:678
+#: usr/local/www/firewall_rules_edit.php:1590
+#: usr/local/www/firewall_nat_edit.php:864
+#: usr/local/www/firewall_rules_edit.php:1638
+msgid "Rule Information"
+msgstr "Informação de Regra"
+
+#: usr/local/www/firewall_rules_edit.php:1583
+#: usr/local/www/firewall_nat_edit.php:867
+#: usr/local/www/firewall_nat_out_edit.php:682
+#: usr/local/www/firewall_rules_edit.php:1594
+#: usr/local/www/firewall_nat_edit.php:868
+#: usr/local/www/firewall_rules_edit.php:1642
+msgid "Created"
+msgstr "Criado"
+
+#: usr/local/www/firewall_rules_edit.php:1591
+#: usr/local/www/firewall_nat_edit.php:875
+#: usr/local/www/firewall_nat_out_edit.php:690
+#: usr/local/www/firewall_rules_edit.php:1602
+#: usr/local/www/firewall_nat_edit.php:876
+#: usr/local/www/firewall_rules_edit.php:1650
+msgid "Updated"
+msgstr "Atualizado"
+
+#: usr/local/www/diag_logs_filter.php:163
+msgid "Source IP Address"
+msgstr "Endereço IP de origem"
+
+#: usr/local/www/diag_logs_filter.php:175
+#: usr/local/www/diag_logs_filter.php:255
+msgid "Quantity"
+msgstr "Quantidade"
+
+#: usr/local/www/diag_logs_filter.php:185
+msgid "Destination IP Address"
+msgstr "Endereço IP de Destino"
+
+#: usr/local/www/diag_logs_filter.php:193
+msgid "Protocol Flags"
+msgstr "Protocolos Marcados"
+
+#: usr/local/www/diag_logs_filter.php:203
+#: usr/local/www/diag_logs_filter.php:266
+#, php-format
+msgid "Matches %1$s regular expression%2$s."
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:204
+msgid "Precede with exclamation (!) as first character to exclude match."
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:251
+msgid "Filter expresion"
+msgstr "Expressão de Filtro"
+
+#: usr/local/www/diag_dump_states.php:136
+msgid "Current total state count"
+msgstr "Contagem atual total do estado"
+
+#: usr/local/www/diag_dump_states.php:218
+msgid "States matching current filter"
+msgstr "Atual estados correspondentes ao filtro"
+
+#: usr/local/www/firewall_nat_edit.php:417
+msgid "NAT Port Forward"
+msgstr "Redirecionamento de Porta NAT"
+
+#: usr/local/www/status_graph.php:242
+msgid "Host Name or IP"
+msgstr "Nome de host ou IP"
+
+#: usr/local/www/interfaces_gif_edit.php:210
+msgid "ECN friendly behavior"
+msgstr "comportamento amigável ECN"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:146
+#, fuzzy
+msgid "You cannot use the network address for this VIP"
+msgstr "Você não pode usar o endereço da rede no início do intervalo da subrede."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:148
+#, fuzzy
+msgid "You cannot use the broadcast address for this VIP"
+msgstr "Você não pode usar o endereço de broadcast no final do intervalo de subrede."
+
+#: usr/local/www/diag_packet_capture.php:204
+msgid "Promiscuous"
+msgstr "Promiscuo"
+
+#: usr/local/www/diag_packet_capture.php:207
+msgid "If checked, the"
+msgstr "se checado, o"
+
+#: usr/local/www/diag_packet_capture.php:207
+msgid "packet capture"
+msgstr "captura de pacote"
+
+#: usr/local/www/diag_packet_capture.php:207
+msgid "will be performed using promiscuous mode."
+msgstr "serão realizadas usando modo promiscuo."
+
+#: usr/local/www/diag_packet_capture.php:208
+msgid "Some network adapters do not support or work well in promiscuous mode."
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:72 usr/local/www/diag_ping.php:67
+msgid "When using IPv4, the target host must be an IPv4 address or hostname."
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:74 usr/local/www/diag_ping.php:69
+msgid "When using IPv6, the target host must be an IPv6 address or hostname."
+msgstr ""
+
+#: usr/local/www/diag_traceroute.php:164
+msgid "Using a source interface/IP address that does not match selected type (IPv4, IPv6) will result in an error or empty output."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1472
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1493
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1507
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1524
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1543
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1567
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1594
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1647
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1416
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1436
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1450
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1467
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1486
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1510
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1589
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1352
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1373
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1387
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1403
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1422
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1446
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1473
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1526
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1213
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1234
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1248
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1265
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1284
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1308
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1335
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1388
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1471
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1492
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1506
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1523
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1542
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1566
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1593
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1646
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1415
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1435
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1449
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1466
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1485
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1509
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1588
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1351
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1372
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1386
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1402
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1421
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1445
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1472
+#: usr/local/www/wizards/traffic_shaper_wizard.inc:1525
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1212
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1233
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1247
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1264
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1283
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1307
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1334
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_lan.inc:1387
+msgid "Traffic Shaper Wizard"
+msgstr "Traffic Shaper Wizard"
+
+#: usr/local/www/wizards/openvpn_wizard.inc:614
+#: usr/local/www/wizards/openvpn_wizard.inc:629
+msgid "OpenVPN Wizard"
+msgstr "OpenVPN Wizard"
+
+#: usr/local/www/services_dhcp.php:274 usr/local/www/services_dhcp.php:275
+#, php-format
+msgid "The Captive Portal zone '%s' has Hard Timeout parameter set to a value bigger than Default lease time (%s)."
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1026
+msgid "Signing request data"
+msgstr "Assinatura de dados pedido"
+
+#: usr/local/www/system_certmanager.php:1034
+msgid "Final certificate data"
+msgstr "Dados do certificado final"
+
+#: usr/local/www/system_advanced_admin.php:447
+#: usr/local/www/system_advanced_admin.php:468
+#, fuzzy
+msgid "When this is unchecked, access to the webConfigurator is protected against HTTP_REFERER redirection attempts. Check this box to disable this protection if you find that it interferes with webConfigurator access in certain corner cases such as using external scripts to interact with this system. More information on HTTP_REFERER is available from <a target='_blank' href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."
+msgstr "Quando isso não estiver marcado, acesso ao webConfigurator está protegido contra tentativas de redirecionamento HTTP_REFERER. Marque essa caixa para desabilitar essa proteção se achar que isso interfere com o acesso ao webConfigurator em alguns casos específicos tais como quando usando scripts de terceiros para interagir com o pfSense. Mais informações sobre HTTP_REFERER estão disponíveis em <a target='_new' href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."
+
+#: usr/local/www/system_advanced_misc.php:105
+#: usr/local/www/system_advanced_misc.php:106
+msgid "/tmp Size must be numeric and should not be less than 40MB."
+msgstr "Tamanho do /tmp deve ser número e não deve ser menor que 40Mb"
+
+#: usr/local/www/system_advanced_misc.php:108
+#: usr/local/www/system_advanced_misc.php:109
+msgid "/var Size must be numeric and should not be less than 60MB."
+msgstr "Tamanho do /var deve ser número e não deve ser menor que 60Mb"
+
+#: usr/local/www/system_advanced_misc.php:558
+#: usr/local/www/system_advanced_misc.php:576
+msgid "Skip rules when gateway is down"
+msgstr "Pule regras quando o gateway estiver caído"
+
+#: usr/local/www/system_advanced_misc.php:562
+#: usr/local/www/system_advanced_misc.php:580
+msgid "By default, when a rule has a specific gateway set, and this gateway is down, rule is created and traffic is sent to default gateway.This option overrides that behavior and the rule is not created when gateway is down"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:568
+#: usr/local/www/system_advanced_misc.php:586
+msgid "RAM Disk Settings (Reboot to Apply Changes)"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:572
+#: usr/local/www/system_advanced_misc.php:590
+msgid "Use RAM Disks"
+msgstr "Use discos RAM"
+
+#: usr/local/www/system_advanced_misc.php:575
+#: usr/local/www/system_advanced_misc.php:593
+msgid "Use memory file system for /tmp and /var"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:576
+#: usr/local/www/system_advanced_misc.php:594
+msgid "Set this if you wish to use /tmp and /var as RAM disks (memory file system disks) on a full install rather than use the hard disk. Setting this will cause the data in /tmp and /var to be lost at reboot, including log data. RRD and DHCP Leases will be retained."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:582
+#: usr/local/www/system_advanced_misc.php:600
+msgid "/tmp RAM Disk Size"
+msgstr "Tamanho do disco RAM /tmp"
+
+#: usr/local/www/system_advanced_misc.php:586
+#: usr/local/www/system_advanced_misc.php:604
+msgid "Set the size, in MB, for the /tmp RAM disk. Leave blank for 40MB. Do not set lower than 40."
+msgstr "Configure o tamanho, em MB, para o disco RAM /tmp. Deixe em branco para 40Mb. Não configure valor melhor que 40."
+
+#: usr/local/www/system_advanced_misc.php:591
+#: usr/local/www/system_advanced_misc.php:609
+msgid "/var RAM Disk Size"
+msgstr "Tamanho do disco RAM /var"
+
+#: usr/local/www/system_advanced_misc.php:595
+#: usr/local/www/system_advanced_misc.php:613
+msgid "Set the size, in MB, for the /var RAM disk. Leave blank for 60MB. Do not set lower than 60."
+msgstr "Configure o tamanho, em MB, para o disco RAM /var. Deixe em branco para 60Mb. Não configure valor melhor que 60."
+
+#: usr/local/www/system_advanced_misc.php:600
+#: usr/local/www/system_advanced_misc.php:618
+msgid "Periodic RRD Backup"
+msgstr "Backup periodico do RRD"
+
+#: usr/local/www/system_advanced_misc.php:616
+#: usr/local/www/system_advanced_misc.php:634
+msgid "Periodic DHCP Leases Backup"
+msgstr "Backup periodico das listas DHCP"
+
+#: usr/local/www/system_routes_edit.php:132
+#: usr/local/www/system_routes_edit.php:134
+#, php-format
+msgid "The alias (%s) has one or more FQDNs configured and cannot be used to configure a static route."
+msgstr ""
+
+#: usr/local/www/system_routes_edit.php:179
+#: usr/local/www/system_routes_edit.php:186
+#: usr/local/www/system_routes_edit.php:181
+#: usr/local/www/system_routes_edit.php:188
+#: usr/local/www/system_routes_edit.php:183
+#: usr/local/www/system_routes_edit.php:190
+#, php-format
+msgid "This network conflicts with address configured on interface %s."
+msgstr "Esta rede conflita com o endereço configurado na interface %s."
+
+#: usr/local/www/firewall_nat_out.php:117
+#: usr/local/www/firewall_nat_out.php:128
+#: usr/local/www/firewall_nat_out.php:141
+#: usr/local/www/firewall_nat_out.php:157
+#: usr/local/www/firewall_nat_out.php:178
+#: usr/local/www/firewall_nat_out.php:199
+#: usr/local/www/firewall_nat_out.php:214
+msgid "Manual Outbound NAT Switch"
+msgstr "Alteração Manual de Saída de NAT"
+
+#: usr/local/www/system_gateway_groups_edit.php:100
+#, fuzzy
+msgid "Changing name on a gateway group is not allowed."
+msgstr "Mudança de nome de gateway não é permitido."
+
+#: usr/local/www/system_gateway_groups_edit.php:150
+msgid "Edit gateway group"
+msgstr "Edita grupo de gateway"
+
+#: usr/local/www/system_gateway_groups_edit.php:229
+#, fuzzy
+msgid "Edit gateway group entry"
+msgstr "Edita grupo de gateway"
+
+#: usr/local/www/system_gateway_groups_edit.php:317
+#, fuzzy
+msgid "The virtual IP field selects what (virtual) IP should be used when this group applies to a local Dynamic DNS, IPsec or OpenVPN endpoint"
+msgstr "O campo IP virtual seleciona qual IP (virtual) deve ser usado quando este grupo se aplica a um Dyndns, IPsec ou OpenVPN local"
+
+#: usr/local/www/services_captiveportal.php:198
+msgid "Hard timeout must be less or equal Default lease time set on DHCP Server"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:245
+#: usr/local/www/firewall_aliases_edit.php:244
+#, fuzzy, php-format
+msgid "You must provide a valid URL. Could not fetch usable data from '%s'."
+msgstr "Você deve fornecer uma URL válida. Não foi possível obter dados úteis."
+
+#: usr/local/www/firewall_aliases_edit.php:250
+#: usr/local/www/firewall_aliases_edit.php:249
+#, php-format
+msgid "URL '%s' is not valid."
+msgstr "URL '%s' não é válida."
+
+#: usr/local/www/firewall_aliases_edit.php:288
+#: usr/local/www/firewall_aliases_edit.php:287
+msgid "This alias is used on a static route and cannot contain FQDNs."
+msgstr ""
+
+#: usr/local/www/system_firmware_restorefullbackup.php:174
+#, fuzzy
+msgid "Could not locate any previous backups."
+msgstr "Não foi possível localizar nenhum dos backups anteriores."
+
+#: usr/local/www/system_firmware_restorefullbackup.php:182
+msgid "do not restore config.xml."
+msgstr "não restaure config.xml."
+
+#: usr/local/www/diag_dns.php:156
+msgid "Query Time"
+msgstr "Tempo de Consulta"
+
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:131
+msgid "Checking ..."
+msgstr "Checando ..."
+
+#: usr/local/www/services_dnsmasq.php:224
+#: usr/local/www/services_dnsmasq.php:245
+msgid "Do not forward private reverse lookups"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:225
+#: usr/local/www/services_dnsmasq.php:246
+#, php-format
+msgid "If this option is set, %s DNS Forwarder (dnsmasq) will not forward reverse DNS lookups (PTR) for private addresses (RFC 1918) to upstream name servers. Any entries in the Domain Overrides section forwarding private \"n.n.n.in-addr.arpa\" names to a specific server are still forwarded. If the IP to name is not known from /etc/hosts, DHCP or a specific domain override then a \"not found\" answer is immediately returned. "
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:212
+#: usr/local/www/system_advanced_network.php:211
+#, fuzzy
+msgid "All IPv6 traffic will be blocked by the firewall unless this box is checked."
+msgstr "Todos os IPv6 serão bloqueados a menos que essa opção esteja marcada."
+
+#: usr/local/www/system_advanced_network.php:213
+#: usr/local/www/system_advanced_network.php:212
+msgid "NOTE: This does not disable any IPv6 features on the firewall, it only blocks traffic."
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:234
+msgid "RRD/DHCP Backup"
+msgstr "Backup RRD/DHCP"
+
+#: usr/local/www/diag_nanobsd.php:236
+msgid "These options have been relocated to"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:236
+msgid "System > Advanced, Miscellaneous tab"
+msgstr "Sistema > Avançado, Aba Diversos"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:90
+#, fuzzy
+msgid "A valid IP address must be specified, or # for an exclusion or ! to not forward at all."
+msgstr "Um endereço IP válido deve ser especificado, ou # para uma exclusão."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+msgid "Or enter ! for lookups for this host/subdomain to NOT be forwarded anywhere."
+msgstr ""
+
+#: usr/local/www/interfaces.php:517 usr/local/www/interfaces.php:513
+#: usr/local/www/interfaces.php:516
+#, fuzzy
+msgid "You can only have one interface configured in 6rd with same prefix."
+msgstr "Você somente pode ter uma interface configurada como %s ou 6rd."
+
+#: usr/local/www/interfaces.php:528 usr/local/www/interfaces.php:524
+#: usr/local/www/interfaces.php:527
+#, fuzzy, php-format
+msgid "You can only have one interface configured as 6to4."
+msgstr "Você somente pode ter uma interface configurada como %s ou 6to4."
+
+#: usr/local/www/interfaces.php:648 usr/local/www/interfaces.php:644
+#: usr/local/www/interfaces.php:649
+msgid "The MTU of a VLAN cannot be greater than that of its parent interface."
+msgstr ""
+
+#: usr/local/www/interfaces.php:663 usr/local/www/interfaces.php:659
+#: usr/local/www/interfaces.php:664
+#, php-format
+msgid "Interface %s (VLAN) has MTU set to a bigger value"
+msgstr ""
+
+#: etc/inc/easyrule.inc:118 etc/inc/easyrule.inc:301
+msgid "Easy Rule"
+msgstr "Regra Fácil"
+
+#: etc/inc/vpn.inc:1015 etc/inc/vpn.inc:1014 etc/inc/vpn.inc:1016
+#, php-format
+msgid "Ignoring IPsec racoon daemon reload since there are no tunnels on interface %s"
+msgstr ""
+
+#: etc/inc/auth.inc:1127 etc/inc/auth.inc:1162
+#, fuzzy, php-format
+msgid "ERROR! Could not login to server %1$s as user %2$s: %3$s"
+msgstr "ERRO! Não foi possível logar no servidor %1$s como usuário %2$s."
+
+#: usr/local/www/system_gateways_edit.php:139
+#: usr/local/www/system_gateways_edit.php:167
+#, fuzzy, php-format
+msgid "The gateway address %1$s does not lie within one of the chosen interface's subnets."
+msgstr "O gateway endereço %1$ s não se encontram dentro da subrede da interface escolhida '%2$ s'."
+
+#: usr/local/www/diag_arp.php:342
+msgid "NOTE: Local IPv6 peers use"
+msgstr ""
+
+#: usr/local/www/diag_arp.php:342
+msgid "NDP"
+msgstr "NDP"
+
+#: usr/local/www/diag_arp.php:342
+msgid "instead of ARP"
+msgstr "em vez de ARP"
+
+#: usr/local/www/firewall_virtual_ip.php:128
+#: usr/local/www/firewall_virtual_ip.php:135
+#, fuzzy
+msgid "This entry cannot be deleted because it is still referenced by at least one Gateway."
+msgstr "Essa entrada não pode ser apagada porque ela ainda é referenciada por pelo menos um protocolo relay."
+
+#: usr/local/www/interfaces_gif_edit.php:169
+#, fuzzy
+msgid "The interface here serves as the local address to be used for the gif tunnel."
+msgstr "A interface aqui serve como o endereço local para ser usado para o túnel GRE."
+
+#: usr/local/www/services_dhcp.php:941 usr/local/www/services_dhcp.php:953
+msgid "This option persists even if DHCP server is disabled. Only the machines listed below will be able to communicate with the firewall on this NIC."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:381
+#, fuzzy
+msgid "Set the transmit hold count for Spanning Tree. This is the number of packets transmitted before being rate limited. The default is 6. The minimum is 1 and the maximum is 10."
+msgstr "Configure a contagem de espera de transmissão para a Árvore Expansível. Esse é o número de pacotes transmitidos antes que seja limitado a uma taxa. O padrão é 6. O mínimo é 1 e o máximo é 10."
+
+#: usr/local/www/services_dnsmasq.php:254
+msgid "Listen Port"
+msgstr "Porta de escuta"
+
+#: usr/local/www/services_dnsmasq.php:258
+msgid "The port used for responding to DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 53."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:268
+msgid "Interface IPs used by the DNS Forwarder for responding to queries from clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries to other interface IPs not selected below are discarded. The default behavior is to respond to queries on every available IPv4 and IPv6 address."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:288
+msgid "Strict Interface Binding"
+msgstr "Interface Associada"
+
+#: usr/local/www/services_dnsmasq.php:290
+msgid "If this option is set, the DNS forwarder will only bind to the interfaces containing the IP addresses selected above, rather than binding to all interfaces and discarding queries to other addresses."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:292
+msgid "NOTE: This option does NOT work with IPv6. If set, dnsmasq will not bind to IPv6 addresses."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:523
+#: usr/local/www/firewall_nat_out_edit.php:561
+msgid "(leave blank for any)"
+msgstr "(deixe em branco para qualquer valor)"
+
+#: usr/local/www/interfaces.php:1900 usr/local/www/interfaces.php:1936
+#, php-format
+msgid "Enter a <b>hexadecimal</b> value between %x and %x here, default value is 0."
+msgstr ""
+
+#: etc/inc/shaper.inc:1232
+msgid "Codel Active Queue"
+msgstr "Fila ativa de Codel"
+
+#: etc/inc/pfsense-utils.inc:2537
+msgid "Turkish"
+msgstr "Turco"
+
+#: usr/local/www/system_gateways_edit.php:647
+msgid "The Frequency Probe interval must be less than the Down time, otherwise the gateway will seem to go down then come up again at the next probe."
+msgstr "NOTA: O intervalo de frequencia de consulta deve ser menor que o tempo de queda, caso contrário vai parecer que o gateway caiu antes da próxima consulta."
+
+#: usr/local/www/system_gateways_edit.php:648
+msgid "The total time before a gateway is down is the product of the Frequency Probe and the Down fields. By default this is 1*10=10 seconds."
+msgstr "NOTA: O total de tempo antes de um gateway cair é o produto da frequencia de consultas e de quedas. Por padrão isso é 1*10=10 segundos."
+
+#: etc/inc/shaper.inc:2904 etc/inc/shaper.inc:2906
+msgid "IPV4 bit mask must be blank or numeric value between 1 and 32."
+msgstr ""
+
+#: etc/inc/shaper.inc:2907 etc/inc/shaper.inc:2909
+msgid "IPV6 bit mask must be blank or numeric value between 1 and 128."
+msgstr ""
+
+#: etc/inc/shaper.inc:3352 etc/inc/shaper.inc:3625 etc/inc/shaper.inc:3378
+#: etc/inc/shaper.inc:3651
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"a dynamic pipe with the bandwidth, delay, packet loss and queue size given above will \n"
+"be created for each source/destination IP address encountered, \n"
+"respectively. This makes it possible to easily specify bandwidth \n"
+"limits per host."
+msgstr ""
+"Se 'origem' ou 'destino' é escolhido, \n"
+"um pipe dinâmico com o tamanho de banda, atraso, perda de pacote e tamanho de fila dado acima serão \n"
+"criados para cada endereço IP de origem/destino encontrado, \n"
+"respectivamente. Isso faz com que seja possível especificar facilmente os limites de \n"
+"tamanho de banda por host."
+
+#: etc/inc/shaper.inc:3373 etc/inc/shaper.inc:3399
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"leaving the mask bits blank will create one pipe per host. Otherwise specify \n"
+"the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+"per pipe."
+msgstr ""
+
+#: etc/inc/shaper.inc:3646 etc/inc/shaper.inc:3672
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"leaving the mask bits blank will create one pipe per host. Otherwise specify \n"
+"the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+"per queue."
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:379
+#, fuzzy
+msgid "The RA server can optionally provide a domain search list. Use the semicolon character as separator"
+msgstr "O servidor DHCP pode, opcionalmente, fornecer uma lista de pesquisa de domínios. Use o caractere ponto e vírgula como separador"
+
+#: usr/local/www/system_gateways_edit.php:327
+#, fuzzy
+msgid "The probe interval needs to be a numeric value."
+msgstr "O intervalo de frequencia de consulta deve ser um valor númerico."
+
+#: usr/local/www/system_gateways_edit.php:330
+#, fuzzy
+msgid "The probe interval needs to be positive."
+msgstr "O intervalo de frequencia de consulta deve ser um valor positivo."
+
+#: usr/local/www/system_gateways_edit.php:348
+#, fuzzy
+msgid "The probe interval needs to be less than the down time setting."
+msgstr "O intervalo de frequencia de consulta deve ser menor que a configuraçõa de tempo de queda."
+
+#: usr/local/www/system_gateways_edit.php:627
+msgid "Probe Interval"
+msgstr "Intervalo de sonda"
+
+#: usr/local/www/system_gateways_edit.php:633
+#, fuzzy
+msgid "NOTE: The quality graph is averaged over seconds, not intervals, so as the probe interval is increased the accuracy of the quality graph is decreased."
+msgstr "NOTA: A gráfico de qualidade é uma média sobre segundos, não intervalos. assim como a consulta de frequencia é aumentada o gráfico de qualidade é diminuida."
+
+#: usr/local/www/system_gateways_edit.php:647
+#, fuzzy
+msgid "The probe interval must be less than the down time, otherwise the gateway will seem to go down then come up again at the next probe."
+msgstr "NOTA: O intervalo de frequencia de consulta deve ser menor que o tempo de queda, caso contrário vai parecer que o gateway caiu antes da próxima consulta."
+
+#: usr/local/www/system_gateways_edit.php:648
+msgid "The down time defines the length of time before the gateway is marked as down, but the accuracy is controlled by the probe interval. For example, if your down time is 40 seconds but on a 30 second probe interval, only one probe would have to fail before the gateway is marked down at the 40 second mark. By default, the gateway is considered down after 10 seconds, and the probe interval is 1 second, so 10 probes would have to fail before the gateway is marked down."
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:125
+#, fuzzy
+msgid "The group name is longer than 16 characters."
+msgstr "O nome de usuário contém mais de 16 caractéres."
+
+#: usr/local/www/diag_logs_settings.php:155
+#, fuzzy
+msgid "WebGUI process is restarting."
+msgstr "Reiniciando httpd"
+
+#: usr/local/www/diag_logs_settings.php:281
+msgid "Log packets blocked by 'Block Bogon Networks' rules"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:284
+msgid "Log packets blocked by 'Block Private Networks' rules"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:290
+msgid "Log errors from the web server process."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:291
+msgid "Hint: If this is checked, errors from the lighttpd web server process for the GUI or Captive Portal will appear in the main system log."
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:216
+msgid "Check this box for WCCP encapsulation version 2, or leave unchecked for version 1."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:477
+msgid "You can only specify the maximum number of established connections per host (advanced option) for TCP protocol."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:479
+msgid "You can only specify the maximum new connections / per second(s) (advanced option) for TCP protocol."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:481
+msgid "You can only specify the state timeout (advanced option) for TCP protocol."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:486
+msgid "You can only specify the maximum state entries (advanced option) for ICMP/TCP/UDP protocols."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:488
+msgid "You can only specify the maximum number of unique source hosts (advanced option) for ICMP/TCP/UDP protocols."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:490
+msgid "You can only specify the maximum state entries per host (advanced option) for ICMP/TCP/UDP protocols."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:495
+msgid "You can only specify the maximum state entries (advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:497
+msgid "You can only specify the maximum number of unique source hosts (advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:499
+msgid "You can only specify the maximum number of established connections per host (advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:501
+msgid "You can only specify the maximum state entries per host (advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:503
+msgid "You can only specify the maximum new connections / per second(s) (advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:505
+msgid "You can only specify the state timeout (advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:510
+msgid "You cannot specify the maximum state entries (advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:512
+msgid "You cannot specify the maximum number of unique source hosts (advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:514
+msgid "You cannot specify the maximum number of established connections per host (advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:516
+msgid "You cannot specify the maximum state entries per host (advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:518
+msgid "You cannot specify the maximum new connections / per second(s) (advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:520
+msgid "You cannot specify the state timeout (advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1258
+msgid " Maximum state entries this rule can create (TCP/UDP/ICMP)"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1259
+msgid " Maximum number of unique source hosts (TCP/UDP/ICMP)"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1260
+#, fuzzy
+msgid " Maximum number of established connections per host (TCP only)"
+msgstr " Número máximo de conexões estabelecidas por host"
+
+#: usr/local/www/firewall_rules_edit.php:1261
+msgid " Maximum state entries per host (TCP/UDP/ICMP)"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1270
+#, fuzzy
+msgid "Maximum new connections / per second(s) (TCP only)"
+msgstr "Máximo de novas conexões / por segundo(s)"
+
+#: usr/local/www/firewall_rules_edit.php:1273
+#, fuzzy
+msgid "State Timeout in seconds (TCP only)"
+msgstr "Tempo de espera de estado em segundos"
+
+#: usr/local/www/firewall_aliases.php:176
+msgid "URLs"
+msgstr "URLs"
+
+#: usr/local/www/services_dhcp_edit.php:427
+#: usr/local/www/services_dhcp.php:907
+#, fuzzy
+msgid "The DHCP server can optionally provide a domain search list. Use the semicolon character as separator "
+msgstr "O servidor DHCP pode, opcionalmente, fornecer uma lista de pesquisa de domínios. Use o caractere ponto e vírgula como separador"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:182
+#: usr/local/www/firewall_virtual_ip_edit.php:205
+#, fuzzy
+msgid "For this type of vip localhost is not allowed."
+msgstr "Para este tipo de VIP, um carp pai não é permitido."
+
+#: usr/local/www/system_certmanager.php:1195
+msgid "add or import certificate"
+msgstr "adicionar ou importar certificado"
+
+#: usr/local/www/system_certmanager.php:1195
+msgid "add certificate"
+msgstr "adicionar certificado"
+
+#: usr/local/www/system_advanced_admin.php:475
+msgid "BEAST Attack Protection"
+msgstr "Proteção de ataque BEAST"
+
+#: usr/local/www/system_advanced_admin.php:478
+msgid "Mitigate the BEAST SSL Attack"
+msgstr "Mitigando o ataque BEAST SSL"
+
+#: usr/local/www/system_advanced_admin.php:480
+msgid "When this is checked, the webConfigurator can mitigate BEAST SSL attacks. "
+msgstr "Quando isto está checado, o Webconfigurator pode mitigar ataques BEAST SSL."
+
+#: usr/local/www/system_advanced_admin.php:483
+#, php-format
+msgid "This option has been automatically disabled because a conflicting cryptographic accelerator card has been detected (%s)."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:485
+msgid "This option is off by default because Hifn accelerators do NOT work with this option, and the GUI will not function. It is possible that other accelerators have a similar problem that is not yet known/documented. More information on BEAST is available from <a target='_blank' href='https://en.wikipedia.org/wiki/Transport_Layer_Security#BEAST_attack'>Wikipedia</a>."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:426
+msgid "The powerd utility monitors the system state and sets various power control options accordingly. It offers four modes (maximum, minimum, adaptive and hiadaptive) that can be individually selected while on AC power or batteries. The modes maximum, minimum, adaptive and hiadaptive may be abbreviated max, min, adp, hadp. Maximum mode chooses the highest performance values. Minimum mode selects the lowest performance values to get the most power savings. Adaptive mode attempts to strike a balance by degrading performance when the system appears idle and increasing it when the system is busy. It offers a good balance between a small performance loss for greatly increased power savings. Hiadaptive mode is alike adaptive mode, but tuned for systems where performance and interactivity are more important than power consumption. It raises frequency faster, drops slower and keeps twice lower CPU load."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:522
+msgid "IPsec Reload on Failover"
+msgstr "Recarregue IPsec em Failover"
+
+#: usr/local/www/system_advanced_misc.php:525
+msgid "Force IPsec Reload on Failover"
+msgstr "Força releitura do IPsec em Failover"
+
+#: usr/local/www/system_advanced_misc.php:527
+msgid "In some circumstances using a gateway group as the interface for an IPsec tunnel does not function properly, and IPsec must be forcefully reloaded when a failover occurs. Because this will disrupt all IPsec tunnels, this behavior is disabled by default. Check this box to force IPsec to fully reload on failover."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:633
+#, fuzzy
+msgid "The DHCP server can optionally provide a domain search list. Use the semicolon character as separator"
+msgstr "O servidor DHCP pode, opcionalmente, fornecer uma lista de pesquisa de domínios. Use o caractere ponto e vírgula como separador"
+
+#: usr/local/www/system_authservers.php:504
+msgid "NOTE: When using SSL, this hostname MUST match the Common Name (CN) of the LDAP server's SSL Certificate."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:695
+msgid "UTF8 Encode"
+msgstr "UTF8 Codificado"
+
+#: usr/local/www/system_authservers.php:703
+msgid "UTF8 encode LDAP parameters before sending them to the server. Required to support international characters, but may not be supported by every LDAP server."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:710
+msgid "Username Alterations"
+msgstr "Alteração de Nome de Usuário"
+
+#: usr/local/www/system_authservers.php:718
+msgid "Do not strip away parts of the username after the @ symbol, e.g. user@host becomes user when unchecked."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:93
+msgid "The Aliases Hostname Resolve Interval value must be an integer."
+msgstr "O valor do intervalo de resolução de hostname de Alias deve ser inteiro"
+
+#: usr/local/www/system_advanced_firewall.php:456
+msgid "Aliases Hostnames Resolve Interval"
+msgstr "Intervalo de resolução de Hostname de Aliases"
+
+#: usr/local/www/system_advanced_firewall.php:460
+msgid "Interval, in seconds, that will be used to resolve hostnames configured on aliases."
+msgstr "Intervalo, em segundos, deve ser usado para resolver hostnames configurados nos aliases"
+
+#: usr/local/www/system_advanced_firewall.php:462
+#, fuzzy
+msgid "Note: Leave this blank for the default (300s)."
+msgstr "Nota: Deixe isso em branco para o padrão."
+
+#: usr/local/www/firewall_aliases_edit.php:492
+#, fuzzy
+msgid "Enter as many ports as you wish. Port ranges can be expressed by separating with a colon."
+msgstr "Insira quantas portas você desejar. Intervalos de portas podem ser especificados utilizando dois pontos."
+
+#: usr/local/www/system_advanced_notifications.php:137
+#: usr/local/www/system_advanced_notifications.php:234
+msgid "Test Growl"
+msgstr "Teste Growl"
+
+#: usr/local/www/system_advanced_notifications.php:147
+#: usr/local/www/system_advanced_notifications.php:300
+msgid "Test SMTP"
+msgstr "Teste SMTP"
+
+#: usr/local/www/system_advanced_notifications.php:195
+msgid "Disable Growl Notifications"
+msgstr "Desabilita notificações Growl"
+
+#: usr/local/www/system_advanced_notifications.php:198
+msgid "Check this option to disable growl notifications but preserve the settings below."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:235
+#, fuzzy
+msgid "NOTE: A test notification will be sent even if the service is marked as disabled."
+msgstr "NOTA: Uma mensagem de teste será enviada se o serviço estiver marcado como desabilitado."
+
+#: usr/local/www/system_advanced_notifications.php:246
+msgid "Disable SMTP Notifications"
+msgstr "Desabilitar notificações SMTP"
+
+#: usr/local/www/system_advanced_notifications.php:249
+msgid "Check this option to disable SMTP notifications but preserve the settings below. Some other mechanisms, such as packages, may need these settings in place to function."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:301
+msgid "NOTE: A test message will be sent even if the service is marked as disabled."
+msgstr "NOTA: Uma mensagem de teste será enviada se o serviço estiver marcado como desabilitado."
+
+#: usr/local/www/services_rfc2136_edit.php:197
+msgid "Use Public IP"
+msgstr "Usa IP Público"
+
+#: usr/local/www/services_rfc2136_edit.php:200
+msgid "If the interface IP is private, attempt to fetch and use the public IP instead."
+msgstr ""
+
+#: usr/local/www/interfaces.php:597
+msgid "A valid alias IP address must be specified to reject DHCP Leases from."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1770
+msgid "Reject Leases From"
+msgstr "Rejeita listas de"
+
+#: usr/local/www/interfaces.php:1774
+msgid "If there is a certain upstream DHCP server that should be ignored, place the IP address or subnet of the DHCP server to be ignored here."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1775
+msgid "this is useful for rejecting leases from cable modems that offer private IPs when they lose upstream sync."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1808
+msgid "Use IPv4 connectivity as parent interface"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1811
+msgid "Request a IPv6 prefix/information through the IPv4 connectivity link"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1815
+msgid "Request only an IPv6 prefix"
+msgstr "Requesita somente um prefixo IPv6"
+
+#: usr/local/www/interfaces.php:1818
+msgid "Only request an IPv6 prefix, do not request an IPv6 address"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1267
+msgid "One moment please, reinstalling packages...\n"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1268
+msgid " >>> Trying to fetch package info..."
+msgstr ">>> Tentando buscar informações sobre o pacote..."
+
+#: etc/inc/pkg-utils.inc:1269
+msgid "Attempting to reinstall all packages"
+msgstr "Preparando para reinstalar todos os pacotes"
+
+#: etc/inc/pkg-utils.inc:1277
+msgid "Cannot reinstall packages: "
+msgstr "Não pode reinstalar pacotes:"
+
+#: etc/inc/pkg-utils.inc:1286
+msgid "List of packages to reinstall: "
+msgstr "Lista de pacotes para reinstalar:"
+
+#: etc/inc/pkg-utils.inc:1293
+msgid "Uninstalling package"
+msgstr "Desinstalando pacote"
+
+#: etc/inc/pkg-utils.inc:1295
+msgid "Finished uninstalling package"
+msgstr "Terminada desistalação de pacote"
+
+#: etc/inc/pkg-utils.inc:1296
+msgid "Reinstalling package"
+msgstr "Reinstalando pacote"
+
+#: etc/inc/pkg-utils.inc:1298
+msgid "Finished installing package"
+msgstr "Terminada a instalação do pacote"
+
+#: etc/inc/pkg-utils.inc:1301
+msgid "Finished reinstalling all packages."
+msgstr "Terminada a reinstalação de todos os pacotes."
+
+#: etc/inc/shaper.inc:2884
+msgid "Burst"
+msgstr "Explosão"
+
+#: etc/inc/shaper.inc:2894
+#, fuzzy
+msgid "Plr must be a value between 0 and 1."
+msgstr "Plr deve ser um inteiro entre 1 e 100."
+
+#: etc/inc/shaper.inc:3051
+#, fuzzy, php-format
+msgid "Burst for schedule %s must be an integer."
+msgstr "O valor de tamanho de banda para %s deve ser um inteiro."
+
+#: etc/inc/shaper.inc:3358
+msgid "Bandwidth is a rate (e.g. Mbit/s), burst is a total amount of data that will be transferred at full speed after an idle period."
+msgstr "Controle de banda é uma média (ex: Mbit/s), burst é o total de dados que será transferido na velocidade total apos um periodo de espera."
+
+#: /usr/local/www/system.php:334
+msgid ""
+"Enter IP addresses to be used by the system for DNS resolution. These are "
+"also used for the DHCP service, DNS forwarder and for PPTP VPN clients."
+msgstr ""
+"Digite o endereço de IP que deve ser usado para resolução de DNS do sistema."
+"Ele também será usado para o serviço de DHCP, Encaminhamento de DNS e para os clientes da VPN PPTP."
+
+#: /usr/local/www/guiconfig.inc:257
+msgid "The field %s contains invalid characters."
+msgstr "O campo %s contém caracteres inválidos."
+
+#: /usr/local/www/guiconfig.inc:263
+msgid "The field %s is required."
+msgstr "O campo %s é requerido."
+
+#: /usr/local/www/guiconfig.inc:881
+msgid "The provided variable is not an array."
+msgstr "A variável fornecida não é um array."
+
+#: /usr/local/www/guiconfig.inc:1061
+msgid "listing only first 10k items"
+msgstr "listando somente os primeiros 10k items"
+
+#: /usr/local/www/guiconfig.inc:435
+msgid "The changes have been applied successfully."
+msgstr "As alterações foram aplicadas com sucesso"
+
+#: /usr/local/www/fbegin.inc:119
+msgid "(assign)"
+msgstr "(associar)"
diff --git a/src/usr/local/share/locale/tr/LC_MESSAGES/pfSense.mo b/src/usr/local/share/locale/tr/LC_MESSAGES/pfSense.mo
new file mode 100644
index 0000000..bf252ab
--- /dev/null
+++ b/src/usr/local/share/locale/tr/LC_MESSAGES/pfSense.mo
Binary files differ
diff --git a/src/usr/local/share/locale/tr/LC_MESSAGES/pfSense.po b/src/usr/local/share/locale/tr/LC_MESSAGES/pfSense.po
new file mode 100644
index 0000000..3e9674a
--- /dev/null
+++ b/src/usr/local/share/locale/tr/LC_MESSAGES/pfSense.po
@@ -0,0 +1,34350 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-12-12 12:10-0200\n"
+"PO-Revision-Date: 2014-07-02 09:45+0200\n"
+"Last-Translator: technical <selim_guner2000@hotmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 2.1.6\n"
+
+#: etc/inc/array_intersect_key.inc:37
+msgid "Wrong parameter count for array_intersect_key()"
+msgstr ""
+"The DHCP Server can only be enabled on interfaces configured with static IP "
+"addresses"
+
+#: etc/inc/array_intersect_key.inc:45
+msgid "array_intersect_key() Argument #"
+msgstr "array_intersect_key() Değişken #"
+
+#: etc/inc/array_intersect_key.inc:46
+msgid " is not an array"
+msgstr " geçerli bir aralık değil"
+
+#: etc/inc/auth.inc:106
+msgid ""
+"Potential DNS Rebind attack detected, see http://en.wikipedia.org/wiki/"
+"DNS_rebinding<br />Try accessing the router by IP address instead of by "
+"hostname."
+msgstr ""
+
+#: etc/inc/auth.inc:121
+msgid "Redirecting..."
+msgstr "Yönlendiriliyor..."
+
+#: etc/inc/auth.inc:121
+msgid "Redirecting to the dashboard..."
+msgstr "Anasayfa'ya yönlendiriliyor..."
+
+#: etc/inc/auth.inc:338 etc/inc/auth.inc:358 etc/inc/auth.inc:429
+#: etc/inc/auth.inc:458 etc/inc/auth.inc:514 etc/inc/auth.inc:648
+#: etc/inc/auth.inc:660
+#, php-format
+msgid "Running: %s"
+msgstr "Çalışan: %s "
+
+#: etc/inc/auth.inc:695 etc/inc/auth.inc:767 etc/inc/auth.inc:838
+#: etc/inc/auth.inc:1093
+#, php-format
+msgid "ERROR! Could not connect to server %s."
+msgstr "HATA! Sunucuya bağlantı kurulamadı %s."
+
+#: etc/inc/auth.inc:713
+#, php-format
+msgid "LDAP: Could not lookup CA by reference for host %s."
+msgstr "LDAP: %s hostu için sertifika otoritelerine referansla bakılamaz."
+
+#: etc/inc/auth.inc:825
+msgid ""
+"ERROR! ldap_get_user_ous() backed selected with no LDAP authentication "
+"server defined."
+msgstr ""
+"HATA! ldap_get_user_ous() desteklenen LDAP kimlik doğrulama sunucusu "
+"seçilmedi."
+
+#: etc/inc/auth.inc:852
+#, php-format
+msgid "ERROR! ldap_get_user_ous() could not bind anonymously to server %s."
+msgstr "HATA! ldap_get_user_ous() %s sunucusuna anonim bağlanamadı."
+
+#: etc/inc/auth.inc:857
+#, php-format
+msgid "ERROR! ldap_get_user_ous() could not bind to server %s."
+msgstr "HATA! ldap_get_user_ous() %s sunucusuna bağlanamadı."
+
+#: etc/inc/auth.inc:953
+#, php-format
+msgid "ERROR! ldap_get_groups() Could not connect to server %s."
+msgstr "HATA! ldap_get_groups() %s sunucusuna bağlantı kuramadı."
+
+#: etc/inc/auth.inc:966
+#, php-format
+msgid "ERROR! ldap_get_groups() could not bind anonymously to server %s."
+msgstr "HATA! ldap_get_groups() %s sunucusuna anonim bağlanamadı."
+
+#: etc/inc/auth.inc:971
+#, php-format
+msgid "ERROR! ldap_get_groups() could not bind to server %s."
+msgstr "HATA! ldap_get_groups() %s sunucusuna bağlanamadı."
+
+#: etc/inc/auth.inc:1072
+msgid ""
+"ERROR! ldap_backed() called with no LDAP authentication server defined. "
+"Defaulting to local user database. Visit System -> User Manager."
+msgstr ""
+"HATA! ldap_backed() tanımlanmış bir LDAP kimlik doğrulama sunucusu ile "
+"çağrılamadı. Yerel kullanıcı veritabanı varsayılan olarak alınacak. Sistem -"
+"> Kullanıcı Yönetmi'ni ziyaret edin."
+
+#: etc/inc/auth.inc:1075
+msgid "ERROR! ldap_backed() called with no LDAP authentication server defined."
+msgstr ""
+"HATA! ldap_backed() tanımlanan hiçbir LDAP kimlik doğrulama sunucusuyla "
+"çağrılamadı."
+
+#: etc/inc/auth.inc:1109
+#, php-format
+msgid "ERROR! Could not bind to server %s."
+msgstr "HATA! %s Sunucuya bağlanamıyor."
+
+#: etc/inc/auth.inc:1127
+#, php-format
+msgid "Now Searching for %s in directory."
+msgstr "%s Dizini içerisinde aranıyor."
+
+#: etc/inc/auth.inc:1135
+#, php-format
+msgid "Now Searching in server %1$s, container %2$s with filter %3$s."
+msgstr "%1$s Sunucusunda, %3$s. filitresi ile %2$s barındırıcıda aranıyor."
+
+#: etc/inc/auth.inc:1146
+#, php-format
+msgid "Search resulted in error: %s"
+msgstr "Arama hatalı sonuçlandı: %s"
+
+#: etc/inc/auth.inc:1162
+msgid "ERROR! Either LDAP search failed, or multiple users were found."
+msgstr "HATA! LDAP arama başarısız yada birden fazla kullanıcı bulundu."
+
+# 89%
+#: etc/inc/auth.inc:1169
+#, php-format
+msgid "ERROR! Could not login to server %1$s as user %2$s: %3$s"
+msgstr "HATA ! Sunucu'ya %1$s kullanıcı olarak %2$s giriş yapılamadı: %3$s"
+
+#: etc/inc/auth.inc:1176
+#, php-format
+msgid "Logged in successfully as %1$s via LDAP server %2$s with DN = %3$s."
+msgstr ""
+"DN = %3$s ile LDAP %2$s sunucusu üzerinden başarıyla giriş yapıldı %1$s."
+
+#: etc/inc/auth.inc:1211
+#, php-format
+msgid "Radius start: %s<br />\n"
+msgstr ""
+
+#: etc/inc/auth.inc:1222
+#, php-format
+msgid "Radius send failed: %s<br />\n"
+msgstr ""
+
+#: etc/inc/auth.inc:1228
+#, php-format
+msgid "Radius Auth succeeded"
+msgstr "Radius kimlik doğrulaması başarılı"
+
+#: etc/inc/auth.inc:1233
+#, php-format
+msgid "Radius Auth rejected"
+msgstr "Raidus Kimlik Doğrulaması reddedildi"
+
+#: etc/inc/auth.inc:1276 etc/inc/auth.inc:1291
+msgid "Local Database"
+msgstr "Yerel Veritabanı"
+
+#: etc/inc/auth.inc:1380
+#, php-format
+msgid "Successful login for user '%1$s' from: %2$s"
+msgstr "'%1$s' dan: %2$s Kullanıcısının oturum açması başarılı"
+
+#: etc/inc/auth.inc:1433
+#, php-format
+msgid "Session timed out for user '%1$s' from: %2$s"
+msgstr "'%1$s' dan: %2$s kullanıcısı için oturum zamanı aşıldı"
+
+#: etc/inc/auth.inc:1435
+#, php-format
+msgid "User logged out for user '%1$s' from: %2$s"
+msgstr "Kullanıcı '%1$s' dan: %2$s oturum kapattı"
+
+#: etc/inc/authgui.inc:75
+msgid "No page assigned to this user! Click here to logout."
+msgstr ""
+"Bu kullanıcıya sayfa atanamadı! Oturumu kapatmak için buraya tıklayınız."
+
+#: etc/inc/authgui.inc:105
+#, php-format
+msgid "Error: %1$s Description: %2$s"
+msgstr "Hata: %1$s Açıklama: %2$s"
+
+#: etc/inc/authgui.inc:168
+msgid "unknown reason"
+msgstr "bilinmeyen sebep"
+
+#: etc/inc/authgui.inc:169
+#, php-format
+msgid "Invalid login (%s)."
+msgstr "(%s) geçersiz oturum açma."
+
+#: etc/inc/authgui.inc:174
+#, php-format
+msgid "This device is currently being maintained by: %s."
+msgstr "Bu cihaz şu anda %s tarafından bakıma alındı."
+
+#: etc/inc/authgui.inc:245 etc/inc/authgui.inc:308
+msgid "Login"
+msgstr "Giriş"
+
+#: etc/inc/authgui.inc:273
+msgid ""
+"You are accessing this router by an IP address not configured locally, which "
+"may be forwarded by NAT or other means. <br /><br />If you did not setup "
+"this forwarding, you may be the target of a man-in-the-middle attack."
+msgstr ""
+
+#: etc/inc/authgui.inc:282
+msgid "Username:"
+msgstr "Kullanıcı adı:"
+
+#: etc/inc/authgui.inc:289 usr/local/www/diag_backup.php:693
+#: usr/local/www/system_authservers.php:655
+msgid "Password:"
+msgstr "Parola:"
+
+#: etc/inc/authgui.inc:296
+msgid "Enter username and password to login."
+msgstr "Giriş yapmak için kullanıcı adı ve parola girin."
+
+#: etc/inc/authgui.inc:302
+msgid "Your browser must support cookies to login."
+msgstr "Tarayıcınız oturum açmak için çerezleri kabul etmeli."
+
+#: etc/inc/captiveportal.inc:1388
+#, php-format
+msgid "Error: cannot open '%s' in captiveportal_write_elements()%s"
+msgstr "Hata: captiveportal_write_elements()%s içindeki '%s' açılamadı"
+
+#: etc/inc/config.console.inc:59
+msgid "DANGER! WARNING! ACHTUNG!"
+msgstr "TEHLIKE! UYARI! DİKKAT!"
+
+#: etc/inc/config.console.inc:60
+#, php-format
+msgid "%s requires *AT LEAST* %s RAM to function correctly.%s"
+msgstr "%s ihtiyaç duyar *EN AZ* %s RAM %s 'in düzgün işlev görmesi için"
+
+#: etc/inc/config.console.inc:61
+#, php-format
+msgid "Only (%s) MB RAM has been detected, with (%s) available to %s.%s"
+msgstr ""
+
+#: etc/inc/config.console.inc:62
+msgid "Press ENTER to continue."
+msgstr "Devam etmek için ENTER'a basın."
+
+#: etc/inc/config.console.inc:84 etc/inc/config.console.inc:484
+msgid "No interfaces found!"
+msgstr "Arabirimler bulunamadı!"
+
+#: etc/inc/config.console.inc:182
+msgid "VLAN interfaces:"
+msgstr "VLAN Arabirimleri:"
+
+#: etc/inc/config.console.inc:201
+msgid "Enter the WAN interface name or 'a' for auto-detection:"
+msgstr ""
+"WAN arabiriminin adını giriniz ya da otomatik algılaması için 'a' harfine "
+"basınız:"
+
+#: etc/inc/config.console.inc:209 etc/inc/config.console.inc:234
+#: etc/inc/config.console.inc:266 etc/inc/config.console.inc:507
+#, php-format
+msgid "%sInvalid interface name '%s'%s"
+msgstr "%s Geçersiz arabirim adı '%s'%s"
+
+#: etc/inc/config.console.inc:216
+#, php-format
+msgid ""
+"%sEnter the LAN interface name or 'a' for auto-detection %sNOTE: this "
+"enables full Firewalling/NAT mode.%s(or nothing if finished):%s"
+msgstr ""
+"%sLAN arabiriminin adını giriniz ya da otomatik algılanması için 'a' harfine "
+"basınız %sNOT: Bu %sGüvenlik Duvarı/NAT kipini etkinleştirir(yada hiçbir şey "
+"bitmemiş ise):%s"
+
+#: etc/inc/config.console.inc:251
+#, php-format
+msgid "%sOptional interface %s description found: %s"
+msgstr "%sOpsiyonel arabirim %s Açıklaması bulundu: %s"
+
+#: etc/inc/config.console.inc:253
+#, php-format
+msgid ""
+"%sEnter the Optional %s interface name or 'a' for auto-detection%s(or "
+"nothing if finished):%s"
+msgstr ""
+"%sİsteğe bağlı%s arabirim adını girin yada otomatik algılama için 'a' ya "
+"basın%s(yada tamamlandıysa hiçbirşey yapmayın):%s"
+
+#: etc/inc/config.console.inc:260
+msgid "Optional"
+msgstr "Seçimsel"
+
+#: etc/inc/config.console.inc:294
+msgid "The interfaces will be assigned as follows:"
+msgstr "Arabirimler aşağıdaki gibi atanacaklar:"
+
+#: etc/inc/config.console.inc:408
+#, php-format
+msgid "%sWriting configuration..."
+msgstr "%s Yapılandırma uygulanıyor..."
+
+#: etc/inc/config.console.inc:410
+#, php-format
+msgid "done.%s"
+msgstr "tamam.%s"
+
+#: etc/inc/config.console.inc:417
+msgid "One moment while we reload the settings..."
+msgstr "Ayarlar yüklenirken biraz bekleyiniz..."
+
+#: etc/inc/config.console.inc:418
+msgid " done!"
+msgstr " tamam!"
+
+#: etc/inc/config.console.inc:438
+#, php-format
+msgid "Detected link-up on interface %s.%s"
+msgstr "%s.%s arabirimindeki bağlantı algılandı"
+
+#: etc/inc/config.console.inc:443
+#, php-format
+msgid "No link-up detected.%s"
+msgstr "%s için bağlantı algılanmadı"
+
+#: etc/inc/config.console.inc:482
+msgid "VLAN Capable interfaces:"
+msgstr "VLAN beceri arabirimleri:"
+
+#: etc/inc/config.console.inc:497
+msgid "No VLAN capable interfaces detected."
+msgstr "VLAN destekli arabirim algılanmadı."
+
+#: etc/inc/config.console.inc:501
+msgid ""
+"Enter the parent interface name for the new VLAN (or nothing if finished):"
+msgstr ""
+"Yeni VLAN için Üst arabirim adını giriniz (veya bittiyse herhangi birşey "
+"yapmayınız):"
+
+#: etc/inc/config.console.inc:514
+msgid "Enter the VLAN tag (1-4094):"
+msgstr "VLAN etiketi giriniz(1-4094):"
+
+#: etc/inc/config.console.inc:518
+#, php-format
+msgid "%sInvalid VLAN tag '%s'%s"
+msgstr "%sGeçersiz VLAN etiketi '%s'%s"
+
+#: etc/inc/config.inc:96
+msgid "Upgrading m0n0wall configuration to pfSense... "
+msgstr "m0n0wall yapılandırması, pfsense yapılandırmasına yükseltiliyor..."
+
+#: etc/inc/config.inc:99
+msgid "ERROR! Could not convert m0n0wall -> pfsense in config.xml"
+msgstr "HATA! m0n0wall -> pfsense config.xml çevirisi yapılamadı"
+
+#: etc/inc/config.inc:128
+msgid "CDROM build"
+msgstr "CDROM oluştur"
+
+#: etc/inc/config.inc:129 etc/inc/config.inc:130
+msgid "CFG:"
+msgstr "CFG:"
+
+#: etc/inc/config.inc:131
+msgid "TYPE:"
+msgstr "TÜR:"
+
+#: etc/inc/config.inc:146 etc/inc/config.inc:161
+#, php-format
+msgid "Found configuration on %s.%s"
+msgstr "%s.%s üzerinde yapılandırma bulundu"
+
+#: etc/inc/config.inc:175 etc/inc/config.inc:176 etc/inc/config.lib.inc:105
+#: etc/inc/config.lib.inc:106 etc/inc/config.lib.inc:249
+#: etc/inc/config.lib.inc:271 etc/inc/config.lib.inc:272
+msgid "No config.xml found, attempting last known config restore."
+msgstr "config.xml bulunamadı, bilinen son yapılandırma geri yükleniyor."
+
+#: etc/inc/config.inc:179
+msgid "No config.xml or config backups found, resetting to factory defaults."
+msgstr ""
+"config.xml veya yapılandırma yedeği bulunamadı, fabrika ayarlarına "
+"sıfırlanıyor."
+
+#: etc/inc/config.lib.inc:79
+msgid "Config.xml unlocked."
+msgstr "Config.xml kilitli değil."
+
+#: etc/inc/config.lib.inc:82
+msgid "Invalid password entered. Please try again."
+msgstr "Geçersiz parola girişi yaptınız. Lütfen tekrar deneyiniz."
+
+#: etc/inc/config.lib.inc:110 etc/inc/config.lib.inc:140
+#: etc/inc/config.lib.inc:276
+msgid ""
+"Config.xml is corrupted and is 0 bytes. Could not restore a previous backup."
+msgstr ""
+"Config.xml bozulmuş ve boyutu 0 bayt. Bir önceki yedekleme geri yüklenemedi."
+
+#: etc/inc/config.lib.inc:138 etc/inc/config.lib.inc:149
+#: etc/inc/config.lib.inc:548
+msgid "Could not restore config.xml."
+msgstr "config.xml dosyası onarılamadı."
+
+#: etc/inc/config.lib.inc:214 etc/inc/config.lib.inc:215
+#, php-format
+msgid "%1$s is restoring the configuration %2$s"
+msgstr "%2$s yapılandırmasına %1$s geri yükleniyor"
+
+#: etc/inc/config.lib.inc:237
+msgid "Resetting factory defaults..."
+msgstr "Fabrika ayarlarına sıfırlanıyor..."
+
+#: etc/inc/config.lib.inc:240
+msgid ""
+"No XML configuration file found - using factory defaults.\n"
+"Make sure that the configuration floppy disk with the conf/config.xml\n"
+"file is inserted. If it isn't, your configuration changes will be lost\n"
+"on reboot.\n"
+msgstr ""
+"XML yapılandırma dosyası bulunamadı - fabrika ayarları kullanılıyor.\n"
+"floppy disketin içinde conf/config.xml bulunduğundan emin olun.\n"
+"Aksi taktirde yaptğınız yapılandırma değişiklikleri sistem yeniden\n"
+"başladığında kaybolacak.\n"
+
+#: etc/inc/config.lib.inc:253
+#, php-format
+msgid "XML configuration file not found. %s cannot continue booting."
+msgstr "XML yapılandırma dosyası bulunmadı. %s ön yüklemeye devam edilemiyor."
+
+#: etc/inc/config.lib.inc:259
+msgid ""
+"Last known config found and restored. Please double check your "
+"configuration file for accuracy."
+msgstr ""
+"Son bilinen yapılandırma dosyası bulundu ve geri yüklendi. Çift tıklayarak "
+"yapılandırmanın doğruluğunu kontrol ediniz."
+
+#: etc/inc/config.lib.inc:263
+msgid "Could not find a usable configuration file! Exiting...."
+msgstr ""
+
+# elektrik gitmelerinde karşımıza gelen konsol yazısı. bildiğiniz checkdisk ile aynı mantıkta bir komut çalıştırıyor dirty yerine başka birşey kullanılabilinir.
+#: etc/inc/config.lib.inc:323
+msgid "Disk is dirty. Running fsck -y"
+msgstr "Disk kirli. fsck -y Çalıştırılıyor"
+
+#: etc/inc/config.lib.inc:334
+msgid "File system is dirty. Launching FSCK for /"
+msgstr "Dosya sistemi kirli. FSCK başlatılıyor /"
+
+#: etc/inc/config.lib.inc:388
+#, php-format
+msgid "Start Configuration upgrade at %s, set execution timeout to 15 minutes"
+msgstr ""
+"Yapılandırma yükseltmesine %s başla, 15 dakika zaman aşımı süresi ayarla"
+
+#: etc/inc/config.lib.inc:399 etc/inc/config.lib.inc:400
+msgid "Updated bogon update frequency to 3am"
+msgstr "Sahte IP/Ağ güncellenecek, güncelleme sıklığı saati 03:00"
+
+#: etc/inc/config.lib.inc:431
+#, php-format
+msgid "Ended Configuration upgrade at %s"
+msgstr "Yapılandırma yükseltmesi %s de bitti"
+
+#: etc/inc/config.lib.inc:434
+#, php-format
+msgid "Upgraded config version level from %1$s to %2$s"
+msgstr "Yapılandırma sürümü %1$s dan %2$s yükseltildi"
+
+#: etc/inc/config.lib.inc:525
+msgid "WARNING: Config contents could not be save. Could not open file!"
+msgstr "UYARI: Yapılandırma içeriği kaydedilemedi. Dosya açılamadı!"
+
+#: etc/inc/config.lib.inc:527
+#, php-format
+msgid "Unable to open %s/config.xml for writing in write_config()%s"
+msgstr "write_config()%s yazmak için %s/config.xml açılamadı"
+
+#: etc/inc/config.lib.inc:633
+msgid "Reverted to"
+msgstr "Ters çevirilen"
+
+#: etc/inc/config.lib.inc:648
+msgid "Installing configuration..."
+msgstr "Yapılandırma kuruluyor..."
+
+#: etc/inc/config.lib.inc:650
+msgid "Installing configuration ...."
+msgstr "Yapılandırma kuruluyor ...."
+
+#: etc/inc/config.lib.inc:701
+msgid "XML error: unable to open file"
+msgstr "XML hata: dosya açılamadı"
+
+#: etc/inc/config.lib.inc:707
+#, php-format
+msgid "%1$s at line %2$d"
+msgstr "%1$s satırı %2$d"
+
+#: etc/inc/config.lib.inc:759 etc/inc/config.lib.inc:761
+#, php-format
+msgid "The backup cache file %s is corrupted. Unlinking."
+msgstr "Yedek ön bellek dosyası %s bozuk. bağlantı bırıkılıyor."
+
+# bu çeviride türkçe karakter kullanmayınız (yaptı) kelimesi hariç herhangi bir yere türkçe karakter girince tüm pfSense nin sorun vermesine sebep oluyor (TechnicaL)
+#
+# - AydinY: "yaptı" kelimesi türkçe olduğu zaman da config.xml de işlemi geri alıyor.
+#: etc/inc/config.lib.inc:901
+#, php-format
+msgid "%s made unknown change"
+msgstr "%s bilinmeyen degisiklik yapti"
+
+#: etc/inc/easyrule.inc:118
+msgid "Easy Rule: Blocked from Firewall Log View"
+msgstr "Kolay Kural: Engellenen Firewall Günlüklerini Görüntüle"
+
+#: etc/inc/easyrule.inc:119 etc/inc/easyrule.inc:302
+msgid "Easy Rule"
+msgstr "Kolay Kural"
+
+#: etc/inc/easyrule.inc:179 etc/inc/easyrule.inc:187
+msgid "Entry added"
+msgstr "Giriş eklendi"
+
+#: etc/inc/easyrule.inc:184
+msgid "Hosts blocked from Firewall Log view"
+msgstr "Firewall günlük görüntüleyicideki bloke edilen ana bağlantılar"
+
+#: etc/inc/easyrule.inc:264
+msgid "Easy Rule: Passed from Firewall Log View"
+msgstr "Kolay Kural: Geçiş yapan Güvenlik Duvarı Günlüklerini Görüntüle"
+
+#: etc/inc/easyrule.inc:319
+msgid "Tried to block invalid IP:"
+msgstr "Engellenmeye çalışılan IP geçersiz:"
+
+#: etc/inc/easyrule.inc:323
+msgid "Invalid interface for block rule:"
+msgstr "Engeleme kuralı için gerçersiz arabirim:"
+
+#: etc/inc/easyrule.inc:326
+msgid "Host added successfully"
+msgstr "Host başarıyla eklendi"
+
+#: etc/inc/easyrule.inc:328
+msgid "Failed to create block rule, alias, or add host."
+msgstr ""
+"Grup ya da Ana bilgisayar engelleme kuralı oluşturma işlemi başarısız oldu."
+
+#: etc/inc/easyrule.inc:331
+msgid "Tried to block but had no host IP or interface"
+msgstr "Engellenmeye çalışıldı fakat host ip adresi ya da arabirim bulunamadı"
+
+#: etc/inc/easyrule.inc:333
+msgid "Unknown block error."
+msgstr "Bilinmeyen engelleme hatası."
+
+#: etc/inc/easyrule.inc:344
+msgid "Invalid interface for pass rule:"
+msgstr "Geçiş kuralı için geçersiz arabirim:"
+
+#: etc/inc/easyrule.inc:347
+msgid "Invalid protocol for pass rule:"
+msgstr "Geçiş kuralı için geçersiz protokol:"
+
+#: etc/inc/easyrule.inc:350
+msgid "Tried to pass invalid source IP:"
+msgstr "Geçiş için geçersiz kaynak IP adresi denendi:"
+
+#: etc/inc/easyrule.inc:353
+msgid "Tried to pass invalid destination IP:"
+msgstr "Geçiş için geçersiz hedef IP adresi denendi:"
+
+#: etc/inc/easyrule.inc:357
+msgid "Missing destination port:"
+msgstr "Hedef port eksik:"
+
+#: etc/inc/easyrule.inc:360
+msgid "Tried to pass invalid destination port:"
+msgstr "Geçiş için geçersiz hedef port adresi denendi:"
+
+#: etc/inc/easyrule.inc:367
+msgid "Successfully added pass rule!"
+msgstr "Geçiş kuralı başarılı bir şekilde eklendi!"
+
+#: etc/inc/easyrule.inc:369
+msgid "Failed to add pass rule."
+msgstr "Geçiş kuralı ekleme işlemi başarısız oldu."
+
+#: etc/inc/easyrule.inc:372
+msgid "Missing parameters for pass rule."
+msgstr "Geçiş kuralı için parametre(ler) eksik."
+
+#: etc/inc/easyrule.inc:374
+msgid "Unknown pass error."
+msgstr "Bilinmeyen geçiş hatası."
+
+#: etc/inc/filter.inc:62 etc/inc/filter.inc:92
+#: usr/local/www/firewall_nat_1to1_edit.php:364
+#: usr/local/www/firewall_nat_1to1_edit.php:437
+#: usr/local/www/firewall_nat_edit.php:569
+#: usr/local/www/firewall_nat_edit.php:616
+#: usr/local/www/firewall_nat_edit.php:629
+#: usr/local/www/firewall_nat_edit.php:658
+#: usr/local/www/firewall_nat_out_edit.php:540
+#: usr/local/www/firewall_nat_out_edit.php:590
+#: usr/local/www/firewall_rules_edit.php:1049
+#: usr/local/www/firewall_rules_edit.php:1110
+#: usr/local/www/firewall_rules_edit.php:1123
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1152
+#: usr/local/www/firewall_rules_edit.php:1209
+#: usr/local/www/firewall_rules_edit.php:1222
+#: usr/local/www/services_captiveportal_hostname.php:180
+#: usr/local/www/services_captiveportal_hostname.php:187
+msgid "any"
+msgstr "herhangi biri"
+
+#: etc/inc/filter.inc:63 etc/inc/filter.inc:97
+msgid "Echo request"
+msgstr "Yankı isteği"
+
+#: etc/inc/filter.inc:64 etc/inc/filter.inc:98
+msgid "Echo reply"
+msgstr "Yankı yanıtı"
+
+#: etc/inc/filter.inc:65 etc/inc/filter.inc:93
+msgid "Destination unreachable"
+msgstr "Hedef ulaşılabilir değil"
+
+#: etc/inc/filter.inc:66
+msgid "Source quench"
+msgstr "Kaynak söndürme"
+
+#: etc/inc/filter.inc:67 etc/inc/filter.inc:109
+msgid "Redirect"
+msgstr "Yönlendirme"
+
+#: etc/inc/filter.inc:68
+msgid "Alternate Host"
+msgstr "Alternatif Host"
+
+#: etc/inc/filter.inc:69 etc/inc/filter.inc:106
+msgid "Router advertisement"
+msgstr "Yönlendirici ilanı"
+
+#: etc/inc/filter.inc:70 etc/inc/filter.inc:105
+msgid "Router solicitation"
+msgstr "Yönlendirici talebi"
+
+#: etc/inc/filter.inc:71 etc/inc/filter.inc:95
+msgid "Time exceeded"
+msgstr "Zaman doldu"
+
+#: etc/inc/filter.inc:72
+msgid "Invalid IP header"
+msgstr "Geçersiz IP başlığı"
+
+#: etc/inc/filter.inc:73
+msgid "Timestamp"
+msgstr "Zaman damgası"
+
+#: etc/inc/filter.inc:74
+msgid "Timestamp reply"
+msgstr "Zaman damgası yanıtı"
+
+#: etc/inc/filter.inc:75
+msgid "Information request"
+msgstr "Bilgi talebi"
+
+#: etc/inc/filter.inc:76
+msgid "Information reply"
+msgstr "Bilgi yanıtı"
+
+#: etc/inc/filter.inc:77
+msgid "Address mask request"
+msgstr "Adres maskesi talebi"
+
+#: etc/inc/filter.inc:78
+msgid "Address mask reply"
+msgstr "Adres maskesi yanıtı"
+
+#: etc/inc/filter.inc:79 usr/local/www/diag_dns.php:264
+#: usr/local/www/diag_traceroute.php:47 usr/local/www/diag_traceroute.php:97
+#: usr/local/www/diag_traceroute.php:156 usr/local/www/fbegin.inc:233
+msgid "Traceroute"
+msgstr "Traceroute"
+
+#: etc/inc/filter.inc:80
+msgid "Datagram conversion error"
+msgstr ""
+
+#: etc/inc/filter.inc:81
+msgid "Mobile host redirect"
+msgstr ""
+
+#: etc/inc/filter.inc:82
+msgid "IPv6 where-are-you"
+msgstr ""
+
+#: etc/inc/filter.inc:83
+msgid "IPv6 I-am-here"
+msgstr ""
+
+#: etc/inc/filter.inc:84
+msgid "Mobile registration request"
+msgstr ""
+
+#: etc/inc/filter.inc:85
+msgid "Mobile registration reply"
+msgstr ""
+
+#: etc/inc/filter.inc:86
+msgid "SKIP"
+msgstr ""
+
+#: etc/inc/filter.inc:87
+msgid "Photuris"
+msgstr ""
+
+#: etc/inc/filter.inc:94
+msgid "Packet too big"
+msgstr ""
+
+#: etc/inc/filter.inc:96
+msgid "Parameter problem"
+msgstr ""
+
+#: etc/inc/filter.inc:99
+msgid "Group membership query"
+msgstr ""
+
+#: etc/inc/filter.inc:100
+msgid "Multicast listener query"
+msgstr ""
+
+#: etc/inc/filter.inc:101
+msgid "Group membership report"
+msgstr ""
+
+#: etc/inc/filter.inc:102
+msgid "Multicast listener report"
+msgstr ""
+
+#: etc/inc/filter.inc:103
+msgid "Group membership termination"
+msgstr ""
+
+#: etc/inc/filter.inc:104
+msgid "Multicast listener done"
+msgstr ""
+
+#: etc/inc/filter.inc:107
+msgid "Neighbor solicitation"
+msgstr ""
+
+#: etc/inc/filter.inc:108
+msgid "Neighbor advertisement"
+msgstr ""
+
+#: etc/inc/filter.inc:110
+msgid "Router renumbering"
+msgstr ""
+
+#: etc/inc/filter.inc:111
+msgid "Who are you request"
+msgstr ""
+
+#: etc/inc/filter.inc:112
+msgid "Who are you reply"
+msgstr ""
+
+#: etc/inc/filter.inc:113
+msgid "FQDN query"
+msgstr ""
+
+#: etc/inc/filter.inc:114
+msgid "FQDN reply"
+msgstr ""
+
+#: etc/inc/filter.inc:115
+msgid "Node information request"
+msgstr ""
+
+#: etc/inc/filter.inc:116
+msgid "Node information reply"
+msgstr ""
+
+#: etc/inc/filter.inc:117
+msgid "mtrace resp"
+msgstr ""
+
+#: etc/inc/filter.inc:118
+msgid "mtrace messages"
+msgstr ""
+
+#: etc/inc/filter.inc:223
+msgid "Initializing"
+msgstr "Başlatılıyor"
+
+#: etc/inc/filter.inc:235
+msgid "Configuring firewall"
+msgstr "Firewall yapılandırılıyor"
+
+#: etc/inc/filter.inc:240
+msgid "Creating aliases"
+msgstr "Gruplar oluşturuluyor"
+
+#: etc/inc/filter.inc:245
+msgid "Generating Limiter rules"
+msgstr "Limitleyici kuralları oluşturuluyor"
+
+#: etc/inc/filter.inc:248
+msgid "Generating NAT rules"
+msgstr "NAT kuralları oluşturuluyor"
+
+#: etc/inc/filter.inc:253
+msgid "Generating filter rules"
+msgstr "Fiitre kuralları oluşturuluyor"
+
+#: etc/inc/filter.inc:259
+msgid "Generating ALTQ queues"
+msgstr "ALTQ kuyrukları oluşturuluyor"
+
+#: etc/inc/filter.inc:261
+msgid "Generating Layer7 rules"
+msgstr "Layer7 kuralları oluşturuluyor"
+
+#: etc/inc/filter.inc:265
+msgid "Loading filter rules"
+msgstr "Filtreleme kuralları yükleniyor"
+
+#: etc/inc/filter.inc:272
+msgid "Filter is disabled. Not loading rules."
+msgstr "Filtreleme devre dışı. Kurallar yüklenmiyor."
+
+#: etc/inc/filter.inc:274 etc/inc/filter.inc:462 etc/inc/interfaces.inc:190
+#: etc/inc/interfaces.inc:210 etc/inc/interfaces.inc:342
+#: etc/inc/interfaces.inc:399 etc/inc/interfaces.inc:653
+#: etc/inc/interfaces.inc:959 etc/inc/interfaces.inc:987
+#: etc/inc/interfaces.inc:1008 etc/inc/interfaces.inc:1023
+#: etc/inc/interfaces.inc:1922 etc/inc/pkg-utils.inc:365
+#: etc/inc/pkg-utils.inc:651 etc/inc/pkg-utils.inc:676
+#: etc/inc/pkg-utils.inc:754 etc/inc/pkg-utils.inc:769
+#: etc/inc/pkg-utils.inc:803 etc/inc/pkg-utils.inc:832
+#: etc/inc/pkg-utils.inc:839 etc/inc/pkg-utils.inc:856
+#: etc/inc/pkg-utils.inc:872 etc/inc/pkg-utils.inc:888
+#: etc/inc/pkg-utils.inc:995 etc/inc/pkg-utils.inc:1012
+#: etc/inc/pkg-utils.inc:1037 etc/inc/pkg-utils.inc:1082
+#: etc/inc/pkg-utils.inc:1091 etc/inc/pkg-utils.inc:1101
+#: etc/inc/pkg-utils.inc:1116 etc/inc/pkg-utils.inc:1123
+#: etc/inc/pkg-utils.inc:1142 etc/inc/pkg-utils.inc:1468
+#: etc/inc/pkg-utils.inc:1494 etc/inc/pkg-utils.inc:1537 etc/inc/rrd.inc:938
+#: etc/inc/services.inc:1328 etc/inc/services.inc:1686
+#: etc/inc/services.inc:1870 etc/inc/services.inc:1907
+#: etc/inc/services.inc:2118 etc/inc/system.inc:895 etc/inc/system.inc:986
+#: etc/inc/system.inc:1406 etc/inc/system.inc:1769 etc/inc/system.inc:1909
+msgid "done."
+msgstr "tamamlandı."
+
+#: etc/inc/filter.inc:314
+msgid "Setting up logging information"
+msgstr "Kayıt bilgilerini ayarlama"
+
+#: etc/inc/filter.inc:319
+msgid "Setting up SCRUB information"
+msgstr "SCRUB bilgilerini ayarlama"
+
+#: etc/inc/filter.inc:363
+#, php-format
+msgid "The line in question reads [%1$d]: %2$s"
+msgstr "Söz konusu olan sıranın okuduğu [%1$d]: %2$s"
+
+#: etc/inc/filter.inc:369
+msgid "PF was wedged/busy and has been reset."
+msgstr "PF sıkışmış/meşgul oldu ve tekrar başlatılıyor."
+
+#: etc/inc/filter.inc:377 etc/inc/filter.inc:378
+#, php-format
+msgid "There were error(s) loading the rules: %1$s - %2$s"
+msgstr "Kurallar yüklenirken hata(lar) vardı: %1$s - %2$s"
+
+#: etc/inc/filter.inc:388
+msgid "Starting up layer7 daemon"
+msgstr "layer7 servisi başlatılıyor"
+
+#: etc/inc/filter.inc:447
+msgid "Processing down interface states"
+msgstr "Kapalı arabirim durumları işleniyor"
+
+#: etc/inc/filter.inc:451
+msgid "Running plugins"
+msgstr "Çalışan eklentiler"
+
+#: etc/inc/filter.inc:455
+msgid "Running plugins (pf)"
+msgstr "Çalışan eklentiler (pf)"
+
+#: etc/inc/filter.inc:457
+msgid "Plugins completed."
+msgstr "Eklentiler tamamlandı."
+
+#: etc/inc/filter.inc:460 usr/local/www/restart_httpd.php:53
+#: usr/local/www/restart_httpd.php:56 usr/local/www/restart_httpd.php:59
+#: usr/local/www/restart_httpd.php:62
+msgid "Done"
+msgstr "Tamam"
+
+#: etc/inc/filter.inc:738
+msgid "Creating gateway group item..."
+msgstr "Ağ geçidi grup maddesi oluşturuluyor..."
+
+#: etc/inc/filter.inc:773
+#, php-format
+msgid "Setting up route with %1$s on %2$s"
+msgstr "Yönlendirme ayarlanıyor %1$s ile %2$s"
+
+#: etc/inc/filter.inc:780
+#, php-format
+msgid ""
+"An error occurred while trying to find the interface got %s . The rule has "
+"not been added."
+msgstr "%s arabirim bulma sırasında sorun ile karşılaşıldı. Kural eklenemedi."
+
+#: etc/inc/filter.inc:1118
+#, php-format
+msgid "Creating reflection NAT rule for %s..."
+msgstr "%s NAT kuralı için yansıma oluşturuluyor..."
+
+#: etc/inc/filter.inc:1207
+#, php-format
+msgid "Creating reflection rule for %s..."
+msgstr "%s için yansıma kuralı oluşturuluyor..."
+
+#: etc/inc/filter.inc:1390
+msgid "localhost"
+msgstr ""
+
+#: etc/inc/filter.inc:1398
+msgid "static route"
+msgstr ""
+
+#: etc/inc/filter.inc:1409
+msgid "DHCP alias address"
+msgstr ""
+
+#: etc/inc/filter.inc:1446
+msgid "PPTP server"
+msgstr ""
+
+#: etc/inc/filter.inc:1455
+msgid "PPPoE server"
+msgstr ""
+
+#: etc/inc/filter.inc:1464
+msgid "L2TP server"
+msgstr ""
+
+#: etc/inc/filter.inc:1473
+msgid "OpenVPN server"
+msgstr ""
+
+#: etc/inc/filter.inc:1480
+msgid "OpenVPN client"
+msgstr ""
+
+#: etc/inc/filter.inc:1488
+msgid "IPsec client"
+msgstr ""
+
+#: etc/inc/filter.inc:1521
+msgid "Auto created rule for ISAKMP"
+msgstr ""
+
+#: etc/inc/filter.inc:1531
+msgid "Auto created rule"
+msgstr ""
+
+#: etc/inc/filter.inc:1630
+msgid "Creating 1:1 rules..."
+msgstr "1:1 kuralları oluşturuluyor..."
+
+#: etc/inc/filter.inc:1786
+#, php-format
+msgid "Creating advanced outbound rule %s"
+msgstr "%s Gelişmiş dışarı giden kuralı oluşturuluyor"
+
+#: etc/inc/filter.inc:1824
+msgid "Creating outbound NAT rules"
+msgstr "Dışarı giden NAT kuralı oluşturuluyor"
+
+#: etc/inc/filter.inc:1831
+msgid "Creating automatic outbound rules"
+msgstr ""
+
+#: etc/inc/filter.inc:1861
+msgid "Setting up TFTP helper"
+msgstr "TFTP yardımcısı ayarlanıyor"
+
+#: etc/inc/filter.inc:1893
+#, php-format
+msgid "Creating NAT rule %s"
+msgstr "NAT kuralı %s oluşturuluyor"
+
+#: etc/inc/filter.inc:2100
+#, php-format
+msgid "Creating filter rule %s ..."
+msgstr "Filtre kuralı %s oluşturuluyor ..."
+
+#: etc/inc/filter.inc:2432
+#, php-format
+msgid "Setting up pass/block rules %s"
+msgstr "%s İzin/Engel kuralı ayarlanıyor"
+
+#: etc/inc/filter.inc:2441
+#, php-format
+msgid "Could not find IPv6 gateway for interface (%s)."
+msgstr ""
+
+#: etc/inc/filter.inc:2447
+#, php-format
+msgid "Could not find IPv4 gateway for interface (%s)."
+msgstr "Arabirim (%s) için IPv4 ağ geçidi bulunamadı."
+
+#: etc/inc/filter.inc:2474
+#, php-format
+msgid "Creating rule %s"
+msgstr "%s kuralı oluşturuluyor"
+
+#: etc/inc/filter.inc:2725
+msgid "Creating default rules"
+msgstr "Varsayılan kurallar oluşturuluyor"
+
+#: etc/inc/filter.inc:3344
+msgid "Creating IPsec rules..."
+msgstr "IPsec kuralları oluşturuluyor..."
+
+#: etc/inc/filter.inc:3397
+msgid ""
+"Please use filter_tdr_install_cron() function tdr_install_cron will be "
+"deprecated!"
+msgstr ""
+"tdr_install_cron fonksiyonu önerilmiyor!, Lütfen filter_tdr_install_cron() "
+"fonksiyonunu kullanın. "
+
+#: etc/inc/filter.inc:3443
+msgid "Installed 15 minute filter reload for Time Based Rules"
+msgstr "Zaman tabanlı kuralların tekrar yüklenmesi 15 dakikaya kuruldu"
+
+#: etc/inc/filter.inc:3450
+msgid "Removed 15 minute filter reload for Time Based Rules"
+msgstr ""
+"Zaman Tabanlı Kurallar için kaldırılan filitre yeniden yüklemesi 15 dakıkadır"
+
+#: etc/inc/filter.inc:3766
+#, php-format
+msgid "Checking for %1$s PF hooks in package %2$s"
+msgstr "%2$s Paketinin içinde PF kancaları %1$s kontrol ediliyor"
+
+#: etc/inc/filter.inc:3772
+#, php-format
+msgid "Processing early %1$s rules for package %2$s"
+msgstr "%2$s paketi için %1$s kuralı erken işleniyor"
+
+#: etc/inc/filter.inc:3777
+#, php-format
+msgid "There was an error while parsing the package filter rules for %s."
+msgstr "%s paket kuralı ayrıştırılırken bir hata oluştu."
+
+#: etc/inc/filter_log.inc:251
+#, php-format
+msgid ""
+"There was a error parsing rule number: %s. Please report to mailing list "
+"or forum."
+msgstr ""
+
+#: etc/inc/filter_log.inc:260
+#, php-format
+msgid ""
+"There was a error parsing rule: %s. Please report to mailing list or forum."
+msgstr ""
+"Kural ayrıştırılırken bir hata oluştu:%s Lütfen eposta listesine ya da "
+"foruma rapor ediniz."
+
+#: etc/inc/filter_log.inc:273
+#, php-format
+msgid "Service %1$s/%2$s: %3$s"
+msgstr "Hizmet %1$s/%2$s: %3$s"
+
+#: etc/inc/functions.inc:94
+msgid "Acknowledge All Notices"
+msgstr "Tüm Bildirimleri Onaylayın"
+
+#: etc/inc/functions.inc:95
+msgid "Click to Acknowledge"
+msgstr "Onaylamak için tıklayın"
+
+#: etc/inc/functions.inc:113
+msgid "unread notice"
+msgstr "okunmamış bildirim"
+
+#: etc/inc/functions.inc:115
+msgid "unread notices"
+msgstr "okunmamış bildirimler"
+
+#: etc/inc/gwlb.inc:939
+#, php-format
+msgid "Updating gateway group gateway for %1$s - new gateway is %2$s"
+msgstr ""
+"%1$s için Grup geçidi geçit adresi güncelleniyor, yeni geçit adresi %2$s"
+
+#: etc/inc/interfaces.inc:51
+msgid "interfaces_bring_up() was called but no variable defined."
+msgstr "interfaces_bring_up() denilen hiçbir değişken tanımlı değil."
+
+#: etc/inc/interfaces.inc:186
+msgid "Configuring loopback interface..."
+msgstr "Loopback arabirimi yapılandırılıyor..."
+
+#: etc/inc/interfaces.inc:197
+msgid "Configuring VLAN interfaces..."
+msgstr "VLAN arabirimi yapılandırılıyor..."
+
+#: etc/inc/interfaces.inc:217
+msgid "VLAN: called with wrong options. Problems with config!"
+msgstr "VLAN: Hatalı seçenekler. Yapılandırma hatalı!"
+
+# 98%
+#: etc/inc/interfaces.inc:225
+msgid "interface_vlan_configure called with if undefined."
+msgstr "interface_vlan_confgure denilen eğer tanımsızsa."
+
+#: etc/inc/interfaces.inc:259 etc/inc/interfaces.inc:349
+#, php-format
+msgid "QinQ compat VLAN: called with wrong options. Problems with config!%s"
+msgstr "QinQ compat VLAN: denilen yanlış ayarlar. Sorunlar yapılandırma!%s"
+
+# 98%
+#: etc/inc/interfaces.inc:266
+#, php-format
+msgid "interface_qinq_configure called with if undefined.%s"
+msgstr "interface_qinq_confgure denilen eğer tanımsızsa.%s"
+
+#: etc/inc/interfaces.inc:271
+#, php-format
+msgid "interface_qinq_configure called with invalid if.%s"
+msgstr "interface_qinq_configure adlandırılan geçersiz %s"
+
+#: etc/inc/interfaces.inc:334
+msgid "Configuring QinQ interfaces..."
+msgstr "QinQ arabirimi yapılandırılıyor..."
+
+# 96%
+#: etc/inc/interfaces.inc:357
+#, php-format
+msgid "interface_qinq2_configure called with if undefined.%s"
+msgstr "interface_qinq2_confgure denilen eğer tanımsızsa.%s"
+
+#: etc/inc/interfaces.inc:378
+msgid "Creating wireless clone interfaces..."
+msgstr "Kablosuz klon arabirimleri oluşturuluyor..."
+
+#: etc/inc/interfaces.inc:446
+#, php-format
+msgid "No members found on %s"
+msgstr "%s da kullanıcı bulunamadı"
+
+#: etc/inc/interfaces.inc:502
+msgid "realif not defined in interfaces bridge - up"
+msgstr "açık - arabirimler köprüsü içinde realif tanımlı değil"
+
+#: etc/inc/interfaces.inc:615
+msgid "bridgeif not defined -- could not bring interface up"
+msgstr "köprü tanımlı değilse -- arabirim açık hale gelemez"
+
+#: etc/inc/interfaces.inc:639
+msgid "Configuring LAGG interfaces..."
+msgstr "LAGG arabirimleri yapılandırılıyor..."
+
+#: etc/inc/interfaces.inc:778
+msgid "Could not bring greif up -- variable not defined."
+msgstr "Değişken tanımlı değilse -- greif açık hale gelemez."
+
+#: etc/inc/interfaces.inc:847
+msgid ""
+"could not bring realif up -- variable not defined -- "
+"interface_gif_configure()"
+msgstr ""
+"interface_gif_configure() -- değişken tanımlı değilse -- realif açık hale "
+"gelemez"
+
+#: etc/inc/interfaces.inc:872
+msgid "could not bring gifif up -- variable not defined"
+msgstr "değişken tanımlı değilse -- gifif açık hale gelemez"
+
+#: etc/inc/interfaces.inc:953 etc/inc/interfaces.inc:980
+#: etc/inc/interfaces.inc:1001 etc/inc/interfaces.inc:1016
+#, php-format
+msgid "Configuring %s interface..."
+msgstr "%s arabirimleri yapılandırılıyor..."
+
+#: etc/inc/interfaces.inc:956 etc/inc/interfaces.inc:982
+#: etc/inc/interfaces.inc:1003 etc/inc/interfaces.inc:1018
+#, php-format
+msgid "Configuring %s"
+msgstr "%s yapılandırılıyor"
+
+#: etc/inc/interfaces.inc:1103
+msgid "Wrong parameters used during interface_bring_down"
+msgstr "interface_bring_down sırasında kullanılan parametreler yanlış"
+
+#: etc/inc/interfaces.inc:1440
+#, php-format
+msgid "Can't find PPP config for %s in interface_ppps_configure()."
+msgstr ""
+"interface_ppps_configure() içerisinde %s için PPP yapılandırması bulunamıyor."
+
+#: etc/inc/interfaces.inc:1499
+#, php-format
+msgid ""
+"Could not get a PPTP/L2TP Remote IP address from %1$s for %2$s in "
+"interfaces_ppps_configure."
+msgstr ""
+"%2$s interfaces_ppps_configure içinde Uzak PPTP/L2TP IP adresi %1$s dan %2$s "
+"alınamadı."
+
+#: etc/inc/interfaces.inc:1506
+#, php-format
+msgid ""
+"Device %s does not exist. PPP link cannot start without the modem device."
+msgstr "%s Aygıtı yok. PPP bağlantısı, modem cihazı olmadan başlatılamaz."
+
+#: etc/inc/interfaces.inc:1511
+#, php-format
+msgid "Unkown %s configured as ppp interface."
+msgstr "%s Bilinmeyen ppp arabirimi yapılandırması."
+
+#: etc/inc/interfaces.inc:1783
+#, php-format
+msgid "Error: cannot open mpd_%s.conf in interface_ppps_configure().%s"
+msgstr "Hata: %s interface_ppps_configure() içinde mpd_%s.conf açılamadı"
+
+#: etc/inc/interfaces.inc:1865
+msgid "Configuring CARP settings..."
+msgstr "CARP ayarları yapılandırılıyor..."
+
+#: etc/inc/interfaces.inc:2120
+#, php-format
+msgid ""
+"Interface specified for the virtual IP address %s does not exist. Skipping "
+"this VIP."
+msgstr ""
+"Belirtilen arabirim için sanal IP adresi %s bulunmadı. Bu Vip atlanıyor."
+
+#: etc/inc/interfaces.inc:2128
+#, php-format
+msgid ""
+"Interface does not have required IP address in the subnet of virtual IP "
+"address %s. Skipping this VIP."
+msgstr ""
+
+#: etc/inc/interfaces.inc:2135
+#, php-format
+msgid ""
+"Interface does not have required IPv6 address in the subnet of virtual IPv6 "
+"address %s. Skipping this VIP."
+msgstr ""
+
+#: etc/inc/interfaces.inc:2191
+#, php-format
+msgid "Interface %s changed to hostap mode"
+msgstr "Arabirim %s erişim noktası (hostap) kipine değiştirildi"
+
+#: etc/inc/interfaces.inc:2195
+#, php-format
+msgid "Interface %s changed to adhoc mode"
+msgstr "Arabirim %s eşler arası (ad-hoc) kipine değiştirildi"
+
+#: etc/inc/interfaces.inc:2199
+#, php-format
+msgid "Interface %s changed to infrastructure mode"
+msgstr "Arabirim %s altyapı (infrastructure) kipine değiştirildi"
+
+#: etc/inc/interfaces.inc:2211
+#, php-format
+msgid "Cloning new wireless interface %s"
+msgstr "Yeni kablosuz arabirim %s çoğaltılıyor"
+
+#: etc/inc/interfaces.inc:2216
+#, php-format
+msgid "Failed to clone interface %1$s with error code %2$s, output %3$s"
+msgstr "%1$s Klon arabirim başarısız %2$s hata kodu, %3$s çıkışı"
+
+#: etc/inc/interfaces.inc:2914
+msgid "Generating new MAC address."
+msgstr "Yeni MAC adresi oluşturuluyor."
+
+#: etc/inc/interfaces.inc:2920
+#, php-format
+msgid ""
+"The INVALID MAC address (ff:ff:ff:ff:ff:ff) on interface %1$s has been "
+"automatically replaced with %2$s"
+msgstr ""
+"Arabirimdeki GEÇERSİZ MAC adresi (ff:ff:ff:ff:ff:ff) %1$s otomatik olarak "
+"yerine %2$s koyuldu"
+
+# 75%
+#: etc/inc/interfaces.inc:3741
+#, php-format
+msgid ""
+"Error: cannot open dhclient_%s.conf in interface_dhcp_configure() for "
+"writing.%s"
+msgstr "Hata: %s dhclient_%s.conf içinde interface_dhcp_configure() açılamadı"
+
+#: etc/inc/interfaces.inc:3754
+#, php-format
+msgid "Invalid interface \"%s\" in interface_dhcp_configure()"
+msgstr "Geçersiz arabirim \"%s\" içinde interface_dhcp_configure()"
+
+#: etc/inc/interfaces.inc:3806
+#, php-format
+msgid "Could not bring up %s interface in interface_dhcp_configure()"
+msgstr "interface_dhcp_configure() içindeki %s arabirim açılamıyor"
+
+#: etc/inc/ipsec.inc:45
+msgid "My IP address"
+msgstr "IP adresim"
+
+#: etc/inc/ipsec.inc:46 etc/inc/ipsec.inc:55 usr/local/www/diag_arp.php:314
+#: usr/local/www/diag_logs_vpn.php:178
+#: usr/local/www/services_captiveportal.php:726
+#: usr/local/www/services_captiveportal.php:747
+#: usr/local/www/services_captiveportal.php:769
+#: usr/local/www/services_captiveportal.php:788
+#: usr/local/www/services_captiveportal_ip.php:119
+#: usr/local/www/services_captiveportal_ip_edit.php:190
+#: usr/local/www/services_dhcp.php:1248
+#: usr/local/www/services_dhcp_edit.php:394
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:76
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:141
+#: usr/local/www/services_dnsmasq_edit.php:85
+#: usr/local/www/services_dnsmasq_edit.php:230
+#: usr/local/www/services_unbound_domainoverride_edit.php:71
+#: usr/local/www/services_unbound_domainoverride_edit.php:137
+#: usr/local/www/services_unbound_host_edit.php:87
+#: usr/local/www/services_unbound_host_edit.php:232
+#: usr/local/www/status_captiveportal.php:157
+#: usr/local/www/status_dhcp_leases.php:331
+#: usr/local/www/system_advanced_network.php:233
+#: usr/local/www/vpn_ipsec_phase2.php:823 usr/local/www/vpn_l2tp_users.php:104
+#: usr/local/www/vpn_l2tp_users_edit.php:174
+#: usr/local/www/vpn_pptp_users.php:101
+#: usr/local/www/vpn_pptp_users_edit.php:165
+msgid "IP address"
+msgstr "IP adresi"
+
+#: etc/inc/ipsec.inc:47 etc/inc/ipsec.inc:56
+#: usr/local/www/system_camanager.php:503
+#: usr/local/www/system_certmanager.php:748
+#: usr/local/www/system_certmanager.php:900
+msgid "Distinguished name"
+msgstr "Ayrılmış isim"
+
+#: etc/inc/ipsec.inc:48 etc/inc/ipsec.inc:57
+msgid "User distinguished name"
+msgstr "Kullanıcı ayrılmış isim"
+
+#: etc/inc/ipsec.inc:49 etc/inc/ipsec.inc:58
+msgid "ASN.1 distinguished Name"
+msgstr "ASN.1 ayrılmış isim"
+
+#: etc/inc/ipsec.inc:50 etc/inc/ipsec.inc:59
+msgid "KeyID tag"
+msgstr "AnahtarID etiketi"
+
+#: etc/inc/ipsec.inc:51 usr/local/www/fbegin.inc:147
+#: usr/local/www/services_dhcp.php:1041
+#: usr/local/www/services_dhcp_edit.php:496
+#: usr/local/www/services_dhcpv6.php:697
+msgid "Dynamic DNS"
+msgstr "Dinamik DNS"
+
+#: etc/inc/ipsec.inc:54
+msgid "Peer IP address"
+msgstr "Eş Ip adresi"
+
+#: etc/inc/ipsec.inc:302 usr/local/www/vpn_ipsec.php:343
+#: usr/local/www/vpn_ipsec_phase1.php:398
+#: usr/local/www/vpn_ipsec_phase2.php:360
+msgid "Mobile Client"
+msgstr "Mobil İstemci"
+
+#: etc/inc/ipsec.inc:305 usr/local/www/diag_system_pftop.php:153
+#: usr/local/www/firewall_nat_edit.php:818
+#: usr/local/www/firewall_nat_edit.php:849 usr/local/www/interfaces.php:1411
+#: usr/local/www/interfaces.php:1412 usr/local/www/interfaces.php:1798
+#: usr/local/www/interfaces.php:1904
+#: usr/local/www/interfaces_bridge_edit.php:449
+#: usr/local/www/system_advanced_misc.php:438
+#: usr/local/www/vpn_ipsec_phase2.php:629
+msgid "None"
+msgstr "Hiçbiri"
+
+#: etc/inc/ipsec.inc:598
+msgid ""
+"Unable to find IPsec daemon leases file. Could not display mobile user stats!"
+msgstr ""
+
+#: etc/inc/meta.inc:68
+#, php-format
+msgid "list_phpfiles: unable to examine path %s\n"
+msgstr "liste_phpdosyaları: %s yolu denetlenemedi\n"
+
+#: etc/inc/meta.inc:99
+#, php-format
+msgid "unable to read %s\n"
+msgstr "%s okumak mümkün değil\n"
+
+#: etc/inc/meta.inc:132
+#, php-format
+msgid "error: tag mismatch ( %1$s != %2$s ) in '%3$s'%4$s"
+msgstr "Hata: Etiket uyumsuzluğu ( %1$s != %2$s ) içinde '%3$s'%4$s"
+
+#: etc/inc/meta.inc:143
+#, php-format
+msgid "warning: tag %1$s has no data in '%2$s'%3$s"
+msgstr "Uyarı: '%2$s'%3$s içerisinde etiket %1$s bilgisi yok"
+
+#: etc/inc/meta.inc:163
+#, php-format
+msgid "warning: tag %1$s has malformed data in '%2$s'%3$s"
+msgstr "Uyarı: '%2$s'%3$s içerisinde %1$s etiketi kusur içeriyor"
+
+#: etc/inc/meta.inc:185
+#, php-format
+msgid "warning: tag %1$s has invalid data in '%2$s'%3$s"
+msgstr "Uyarı: '%2$s'%3$s içerisinde %1$s etiketi geçersiz veri içeriyor"
+
+#: etc/inc/notices.inc:76
+#, php-format
+msgid "Could not open %s for writing"
+msgstr "Yazmak için %s açılamadı"
+
+#: etc/inc/notices.inc:337
+#, php-format
+msgid "Message sent to %s OK"
+msgstr "Mesaj %s 'a düzgün olarak gönderildi"
+
+#: etc/inc/notices.inc:340 etc/inc/notices.inc:341
+#, php-format
+msgid "Could not send the message to %1$s -- Error: %2$s"
+msgstr "Mesaj %1$s gönderilemedi. -- Hata: %2$s"
+
+#: etc/inc/openvpn.inc:101 etc/inc/openvpn.inc:109
+msgid "Peer to Peer ( SSL/TLS )"
+msgstr "Eşler arası (SSL/TLS)"
+
+#: etc/inc/openvpn.inc:102 etc/inc/openvpn.inc:110
+msgid "Peer to Peer ( Shared Key )"
+msgstr "Eşler arası (Paylaşılmış Anahtar)"
+
+#: etc/inc/openvpn.inc:103
+msgid "Remote Access ( SSL/TLS )"
+msgstr "Uzaktan Erişim (SSL/TLS)"
+
+#: etc/inc/openvpn.inc:104
+msgid "Remote Access ( User Auth )"
+msgstr "Uzaktan Erişim (Kullanıcı Kimlik Doğrulaması)"
+
+#: etc/inc/openvpn.inc:105
+msgid "Remote Access ( SSL/TLS + User Auth )"
+msgstr "Uzaktan Erişim (SSL/TLS + Kullanıcı Kimlik Doğrulaması)"
+
+#: etc/inc/openvpn.inc:114
+msgid "No Preference"
+msgstr ""
+
+#: etc/inc/openvpn.inc:115
+msgid "Disabled - No Compression"
+msgstr ""
+
+#: etc/inc/openvpn.inc:116
+msgid "Enabled with Adaptive Compression"
+msgstr ""
+
+#: etc/inc/openvpn.inc:117
+msgid "Enabled without Adaptive Compression"
+msgstr ""
+
+#: etc/inc/openvpn.inc:223
+msgid "None (No Encryption)"
+msgstr "Hiçbiri (Şifreleme Yok)"
+
+#: etc/inc/openvpn.inc:237
+msgid "None (No Authentication)"
+msgstr ""
+
+#: etc/inc/openvpn.inc:280
+#, php-format
+msgid "The field '%s' must contain a valid IP address or domain name."
+msgstr "'%s' Alanı geçerli bir IP adresi ya da etkialanı adı içermeli."
+
+#: etc/inc/openvpn.inc:287
+#, php-format
+msgid "The field '%s' must contain a valid port, ranging from 0 to 65535."
+msgstr "'%s' Alanı geçerli bir port ya da 0-65535 arasında bir değer içermeli."
+
+#: etc/inc/openvpn.inc:299
+#, php-format
+msgid "The field '%s' must contain a single valid %s CIDR range."
+msgstr "%s alanı geçerli bir %s CIDR aralığı içermelidir."
+
+#: etc/inc/openvpn.inc:311
+#, php-format
+msgid ""
+"The field '%s' must contain only valid %s CIDR range(s) separated by commas."
+msgstr ""
+"%s alanı geçerli bir %s virgül ile ayrılmış CIDR aralık(ları) içermelidir."
+
+#: etc/inc/pfsense-utils.inc:380
+msgid "MASTER"
+msgstr "ASIL"
+
+#: etc/inc/pfsense-utils.inc:382
+msgid "BACKUP"
+msgstr "YEDEK"
+
+#: etc/inc/pfsense-utils.inc:384
+msgid "INIT"
+msgstr "INIT"
+
+# yapılan çeviriden emin değilim (technical) öneri varsa gönderiniz.
+#: etc/inc/pfsense-utils.inc:452
+msgid "After synch increase advertising skew"
+msgstr "Senkronize sonrası reklam çarpıklığını artır"
+
+#: etc/inc/pfsense-utils.inc:497
+msgid "Error creating socket!"
+msgstr "Socket oluşturuken hata oluştu!"
+
+#: etc/inc/pfsense-utils.inc:498
+#, php-format
+msgid "Error code is '%1$s' - %2$s"
+msgstr "Hata kodu '%1$s' - %2$s"
+
+#: etc/inc/pfsense-utils.inc:503
+#, php-format
+msgid "setsockopt() failed, error: %s"
+msgstr "setsockopt() başarısız, hata: %s"
+
+#: etc/inc/pfsense-utils.inc:506
+#, php-format
+msgid "Magic Packet sent (%1$s) to {%2$s} MAC=%3$s"
+msgstr "Özel paket gönder (%1$s) den {%2$s} MAC=%3$s"
+
+#: etc/inc/pfsense-utils.inc:568 etc/inc/pfsense-utils.inc:590
+#, php-format
+msgid "Restored %s of config file (maybe from CARP partner)"
+msgstr "Yapılandırma dosyası %s geri yüklendi (belki CARP ile ilişkili)"
+
+#: etc/inc/pfsense-utils.inc:751
+#, php-format
+msgid "XMLRPC communication error: %s"
+msgstr "XMLRPC haberleşme hatası: %s"
+
+#: etc/inc/pfsense-utils.inc:754
+#, php-format
+msgid "XMLRPC request failed with error %1$s: %2$s"
+msgstr "XMLRPC isteği %1$s: %2$s hatası ile başarısız oldu"
+
+#: etc/inc/pfsense-utils.inc:854
+msgid "reload_interfaces_sync() is starting."
+msgstr "reload_interfaces_sync() başlatılıyor."
+
+#: etc/inc/pfsense-utils.inc:862
+msgid "Enabling system routing"
+msgstr "Sistem yönlendirmesi etkinleştiriliyor"
+
+#: etc/inc/pfsense-utils.inc:865
+msgid "Cleaning up Interfaces"
+msgstr "Arabirimler temizleniyor"
+
+#: etc/inc/pfsense-utils.inc:1213
+msgid "No history data found!"
+msgstr "Geçmiş veri bulunamadı!"
+
+#: etc/inc/pfsense-utils.inc:1336
+msgid "device not present! Is the modem attached to the system?"
+msgstr "Aygıt tanınmadı! Modem sisteme takıldı mı?"
+
+#: etc/inc/pfsense-utils.inc:1403
+msgid "running"
+msgstr "çalışıyor"
+
+#: etc/inc/pfsense-utils.inc:1404 usr/local/www/graph.php:207
+msgid "up"
+msgstr "yukarı"
+
+#: etc/inc/pfsense-utils.inc:1447
+msgid "blocking"
+msgstr "bloke ediliyor"
+
+#: etc/inc/pfsense-utils.inc:1447
+msgid "check for ethernet loops"
+msgstr "ethernet döngülerini kontrol et"
+
+#: etc/inc/pfsense-utils.inc:1450
+msgid "learning"
+msgstr "öğreniyor"
+
+#: etc/inc/pfsense-utils.inc:1453
+msgid "forwarding"
+msgstr "yönlendiriliyor"
+
+#: etc/inc/pfsense-utils.inc:1586
+#, php-format
+msgid "DNSCACHE: Found old IP %1$s and new IP %2$s"
+msgstr "DNS ARABELLEĞİ: Eski IP %1$s ve yeni IP %2$s buldu"
+
+#: etc/inc/pfsense-utils.inc:1960
+msgid ""
+"Alias archive is a .zip file which cannot be decompressed because utility is "
+"missing!"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:1992
+msgid ""
+"Alias archive is a .tar/tgz file which cannot be decompressed because "
+"utility is missing!"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2659 etc/inc/pfsense-utils.inc:2701
+msgid "English"
+msgstr "İngilizce"
+
+#: etc/inc/pfsense-utils.inc:2660 etc/inc/pfsense-utils.inc:2713
+msgid "Portuguese (Brazil)"
+msgstr "Portekizce (Brezilya)"
+
+#: etc/inc/pfsense-utils.inc:2661 etc/inc/pfsense-utils.inc:2718
+msgid "Turkish"
+msgstr "Türkçe"
+
+#: etc/inc/pfsense-utils.inc:2695
+msgid "Albanian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2696
+msgid "Bulgarian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2697
+msgid "Chinese (Simplified)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2698
+msgid "Chinese (Traditional)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2699
+msgid "Dutch"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2700
+msgid "Danish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2702
+msgid "Finnish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2703
+msgid "French"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2704
+msgid "German"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2705
+msgid "Greek"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2706
+msgid "Hungarian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2707
+msgid "Italian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2708
+msgid "Japanese"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2709
+msgid "Korean"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2710
+msgid "Latvian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2711
+msgid "Norwegian (Bokmal)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2712
+msgid "Polish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2714
+msgid "Portuguese (Portugal)"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2715
+msgid "Romanian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2716
+msgid "Russian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2717
+msgid "Slovenian"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2719
+msgid "Spanish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2720
+msgid "Swedish"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2721
+msgid "Slovak"
+msgstr ""
+
+#: etc/inc/pfsense-utils.inc:2722
+msgid "Czech"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:219
+msgid "Resyncing configuration for all packages."
+msgstr "Tüm paketlerin yapılandırmaları yeniden senkronize ediliyor."
+
+#: etc/inc/pkg-utils.inc:239
+msgid "Syncing packages:"
+msgstr "Paketler senkronize ediliyor:"
+
+#: etc/inc/pkg-utils.inc:281
+#, php-format
+msgid ""
+"The %1$s package is missing required dependencies and must be reinstalled. "
+"%2$s"
+msgstr "%1$s Paketi kayıp, gereken bağımlılıklar %2$s yeniden yüklenmeli"
+
+#: etc/inc/pkg-utils.inc:306 etc/inc/pkg-utils.inc:432
+#, php-format
+msgid ""
+"The %s package is missing required dependencies and must be reinstalled."
+msgstr "%s Paketi kayıp, gereken bağımlılıklar yeniden yüklenmeli."
+
+#: etc/inc/pkg-utils.inc:399
+#, php-format
+msgid ""
+"The %s package is missing its configuration file and must be reinstalled."
+msgstr "%s Paketi kayıp, yapılandırma dosyası yeniden yüklenmeli."
+
+#: etc/inc/pkg-utils.inc:628 etc/inc/pkg-utils.inc:629
+#, php-format
+msgid "Package %s is not supported on this version."
+msgstr "%s paketi, bu versiyonda desteklenmiyor."
+
+#: etc/inc/pkg-utils.inc:636 usr/local/www/pkg_mgr_install.php:170
+msgid "Beginning package installation."
+msgstr "Paket yüklenmesine başlanıyor."
+
+#: etc/inc/pkg-utils.inc:637 etc/inc/pkg-utils.inc:638
+#, php-format
+msgid "Beginning package installation for %s ."
+msgstr "%s paketinin yuklenmesine baslaniyor."
+
+#: etc/inc/pkg-utils.inc:646
+msgid "Saving updated package information..."
+msgstr "Güncellenen paket bilgisi kaydediliyor..."
+
+# Paket mesajı config.xml yazıldığından dolayı hataya neden oluyor. Bu sebeple türkçe kullanılmamalı.
+#: etc/inc/pkg-utils.inc:650
+#, php-format
+msgid "Installed %s package."
+msgstr "%s paketi yuklendi."
+
+#: etc/inc/pkg-utils.inc:654
+#, php-format
+msgid "Overwrote previous installation of %s."
+msgstr "Yazılan önceki kurulumu %s."
+
+#: etc/inc/pkg-utils.inc:655
+msgid "overwrite!"
+msgstr "üzerine yaz!"
+
+#: etc/inc/pkg-utils.inc:667
+#, php-format
+msgid "Failed to install package: %s."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:668
+msgid "Failed to install package."
+msgstr "Paket yüklemesi başarısız oldu."
+
+#: etc/inc/pkg-utils.inc:672
+msgid "Writing configuration... "
+msgstr "Yapılandırma kaydediliyor... "
+
+#: etc/inc/pkg-utils.inc:675
+#, php-format
+msgid "Successfully installed package: %s."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:709
+#, php-format
+msgid "The %s package is not installed.%sInstallation aborted."
+msgstr "%s Paketi kurulu değil.%sKurulumu iptal edildi."
+
+#: etc/inc/pkg-utils.inc:724
+msgid "Installing"
+msgstr "Yükleniyor"
+
+#: etc/inc/pkg-utils.inc:724
+msgid "and its dependencies."
+msgstr "ve ona bağımlılarıda."
+
+#: etc/inc/pkg-utils.inc:725
+msgid "Downloading"
+msgstr "İndiriliyor"
+
+#: etc/inc/pkg-utils.inc:725
+msgid "and its dependencies... "
+msgstr "ve ona bağımlılarıda."
+
+#: etc/inc/pkg-utils.inc:737
+msgid "Package WAS NOT installed properly."
+msgstr "Paket düzgün olarak YÜKLENMEDİ."
+
+#: etc/inc/pkg-utils.inc:751 etc/inc/pkg-utils.inc:1491
+msgid "Loading package configuration... "
+msgstr "Paket yapılandırması yükleniyor..."
+
+#: etc/inc/pkg-utils.inc:756
+msgid "Configuring package components...\n"
+msgstr "Paket bileşenleri yapılandırılıyor...\n"
+
+#: etc/inc/pkg-utils.inc:762 etc/inc/pkg-utils.inc:1077
+msgid "System files... "
+msgstr "Sistem dosyaları... "
+
+#: etc/inc/pkg-utils.inc:781 etc/inc/pkg-utils.inc:1053
+msgid "Loading package instructions..."
+msgstr "Paket kullanma talimatları yükleniyor..."
+
+#: etc/inc/pkg-utils.inc:796
+msgid "Custom commands..."
+msgstr "Özel komutlar..."
+
+#: etc/inc/pkg-utils.inc:800
+msgid "Executing custom_php_global_functions()..."
+msgstr "custom_php_global_functions() çalıştırılıyor..."
+
+#: etc/inc/pkg-utils.inc:807
+msgid "Executing custom_php_install_command()..."
+msgstr "custom_php_install_command() çalıştırılıyor..."
+
+#: etc/inc/pkg-utils.inc:836
+msgid "Executing custom_php_resync_config_command()..."
+msgstr "custom_php_resync_config_command() çalıştırılıyor..."
+
+#: etc/inc/pkg-utils.inc:845 etc/inc/pkg-utils.inc:1000
+msgid "Menu items... "
+msgstr "Menü öğeleri... "
+
+#: etc/inc/pkg-utils.inc:861
+msgid "Integrated Tab items... "
+msgstr "Birleşmiş Tab öğeleri... "
+
+#: etc/inc/pkg-utils.inc:877 etc/inc/pkg-utils.inc:1017
+msgid "Services... "
+msgstr "Servisler... "
+
+#: etc/inc/pkg-utils.inc:892
+msgid "Loading package configuration... failed!"
+msgstr "Paket yapılandırması yükleniyor... Başarısız oldu!"
+
+#: etc/inc/pkg-utils.inc:892
+msgid "Installation aborted."
+msgstr "Kurulum durduruldu."
+
+#: etc/inc/pkg-utils.inc:894
+msgid "Unable to load package configuration. Installation aborted."
+msgstr "Paket yapılandırması yüklenemedi. Kurulum durduruldu."
+
+#: etc/inc/pkg-utils.inc:939
+#, php-format
+msgid "Starting package deletion for %s..."
+msgstr "%s Paketinin silinmesi başlatılıyor..."
+
+#: etc/inc/pkg-utils.inc:959
+#, php-format
+msgid "The %s package is not installed.%sDeletion aborted."
+msgstr "%s paketi kurulu değil.%s Silme işlemi duruduruldu."
+
+#: etc/inc/pkg-utils.inc:970
+#, php-format
+msgid "Removing %s package... "
+msgstr "%s paketi kaldırılıyor..."
+
+#: etc/inc/pkg-utils.inc:971
+#, php-format
+msgid "Removing %s components..."
+msgstr "%s bileşenleri kaldırılıyor..."
+
+#: etc/inc/pkg-utils.inc:983
+msgid "Tabs items... "
+msgstr "Sekmeler öğeler"
+
+#: etc/inc/pkg-utils.inc:1087
+msgid "Deinstall commands... "
+msgstr "Kaldırma komutları... "
+
+#: etc/inc/pkg-utils.inc:1097
+msgid "Removing package instructions..."
+msgstr "Paket yönergeleri kaldırılıyor..."
+
+#: etc/inc/pkg-utils.inc:1099
+#, php-format
+msgid "Remove '%s'"
+msgstr "'%s' Kaldır"
+
+#: etc/inc/pkg-utils.inc:1106
+msgid "Auxiliary files... "
+msgstr "Yardımcı dosyalar..."
+
+#: etc/inc/pkg-utils.inc:1120
+msgid "Package XML... "
+msgstr "XML Paketleri"
+
+#: etc/inc/pkg-utils.inc:1139
+msgid "Configuration... "
+msgstr "Yapılandırma..."
+
+#: etc/inc/pkg-utils.inc:1222
+msgid "One moment please, reinstalling packages...\n"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1223
+msgid " >>> Trying to fetch package info..."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1224
+msgid "Attempting to reinstall all packages"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1230
+#, php-format
+msgid ""
+" >>> Unable to communicate with %1$s. Please verify DNS and interface "
+"configuration, and that %2$s has functional Internet connectivity."
+msgstr ""
+" >>> %1$s ile iletişim kurulamıyor. Lütfen DNS ve arabirim yapılandırmanızı, "
+"ayrıca %2$s in işlevsel internet bağlantısı olduğunu doğrulayın."
+
+#: etc/inc/pkg-utils.inc:1232
+msgid "Cannot reinstall packages: "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1241
+msgid "List of packages to reinstall: "
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1248
+msgid "Uninstalling package"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1250
+msgid "Finished uninstalling package"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1251
+msgid "Reinstalling package"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1253
+msgid "Finished installing package"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1256
+msgid "Finished reinstalling all packages."
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1432
+msgid "Package Manager Settings"
+msgstr ""
+
+#: etc/inc/pkg-utils.inc:1451
+msgid "Downloading package configuration file... "
+msgstr "Paket yapılandırma dosyası indiriliyor... "
+
+#: etc/inc/pkg-utils.inc:1453
+msgid "Downloading package configuration file..."
+msgstr "Paket yapılandırma dosyası indiriliyor..."
+
+#: etc/inc/pkg-utils.inc:1457
+msgid ""
+"ERROR! Unable to fetch package configuration file. Aborting installation."
+msgstr "Hata! Yapılandırma dosyası alınamıyor. Kurulum iptal ediliyor."
+
+#: etc/inc/pkg-utils.inc:1459
+msgid ""
+"ERROR! Unable to fetch package configuration file. Aborting package "
+"installation."
+msgstr "Hata! Yapılandırma dosyası alınamıyor. Paket kurulumu iptal ediliyor."
+
+#: etc/inc/pkg-utils.inc:1461
+msgid ""
+"failed!\n"
+"\n"
+"Installation aborted.\n"
+msgstr ""
+"başarısız!\n"
+"\n"
+"Kurulum iptal edildi.\n"
+
+#: etc/inc/pkg-utils.inc:1498
+msgid "Additional files... "
+msgstr "Ek dosyalar... "
+
+#: etc/inc/pkg-utils.inc:1524
+msgid "Extracting tarball to -C for "
+msgstr "tar.gz *tarball* -C ile çıkartılıyor "
+
+#: etc/inc/pkg-utils.inc:1530
+#, php-format
+msgid "Changing file mode to %1$s for %2$s%3$s%4$s"
+msgstr "Dosya modu %1$s olan %2$s%3$s%4$s a değiştiriliyor"
+
+#: etc/inc/priv/user.priv.inc:6
+msgid "User - Services - Captive portal login"
+msgstr "Kullanıcı - Servisler - Captive Portal girişi"
+
+#: etc/inc/priv/user.priv.inc:7
+msgid "Indicates whether the user is able to login on the captive portal."
+msgstr ""
+"Kullanıcının Captive portal'a girişinin mümkün olup olmadığını gösterir."
+
+#: etc/inc/priv.defs.inc:10
+msgid "WebCfg - All pages"
+msgstr "WebCfg - Tüm Sayfalar"
+
+#: etc/inc/priv.defs.inc:11
+msgid "Allow access to all pages"
+msgstr "Tüm sayfalara erişimi açar"
+
+#: etc/inc/priv.defs.inc:16
+msgid "WebCfg - Status: CARP page"
+msgstr "WebCfg - Durum: CARP (yük aktarma) sayfası"
+
+#: etc/inc/priv.defs.inc:17
+msgid "Allow access to the 'Status: CARP' page."
+msgstr "'Durum: CARP (Yük aktarma)' sayfasına erişime izin verir."
+
+#: etc/inc/priv.defs.inc:22
+msgid "WebCfg - Crash reporter"
+msgstr "Hata raporlayıcısı"
+
+#: etc/inc/priv.defs.inc:23
+msgid "Uploads crash reports to pfSense and or deletes crash reports."
+msgstr "Çakılma raporlarını PfSense' ye raporlar veya siler."
+
+#: etc/inc/priv.defs.inc:28
+msgid "WebCfg - Diagnostics: ARP Table page"
+msgstr "WebCfg - Araçlar: ARP Tablosu sayfası"
+
+#: etc/inc/priv.defs.inc:29
+msgid "Allow access to the 'Diagnostics: ARP Table' page."
+msgstr "'Araçlar: ARP Tablosu' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:34
+msgid "WebCfg - Diagnostics: Authentication page"
+msgstr "Webcfg - Araçlar: Kimlik Doğrulama sayfası"
+
+#: etc/inc/priv.defs.inc:35
+msgid "Allow access to the 'Diagnostics: Authentication' page."
+msgstr "'Araçlar: Kimlik Doğrulama' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:40
+msgid "WebCfg - Diagnostics: Backup/restore page"
+msgstr "Webcfg - Araçlar: Sistem Yedekle/ Geri Dön sayfası"
+
+#: etc/inc/priv.defs.inc:41
+msgid "Allow access to the 'Diagnostics: Backup/restore' page."
+msgstr "'Araçlar: Sistem Yedekle/ Geri Dön' sayfasına erişimi mümkün kılar."
+
+#: etc/inc/priv.defs.inc:46
+msgid "WebCfg - Diagnostics: Configuration History page"
+msgstr "Webcfg - Araçlar: Yapılandırma Geçmişi sayfası"
+
+#: etc/inc/priv.defs.inc:47
+msgid "Allow access to the 'Diagnostics: Configuration History' page."
+msgstr "'Araçlar: Yapılandırma Geçmişi' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:52
+msgid "WebCfg - Diagnostics: Factory defaults page"
+msgstr "Webcfg - Araçlar: Fabrika ayarları sayfası"
+
+#: etc/inc/priv.defs.inc:53
+msgid "Allow access to the 'Diagnostics: Factory defaults' page."
+msgstr "'Araçlar: Fabrika ayarları' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:58
+msgid "Webcfg - Diagnostics: NDP Table page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:59
+msgid "Allow access to the 'Diagnostics: NDP Table' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:64
+msgid "Webcfg - Diagnostics: Restore full backup"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:65
+msgid "Allow access to the 'Diagnostics: Restore Full Backup' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:70
+msgid "WebCfg - Diagnostics: Show States page"
+msgstr "Webcfg - Araçlar: Durumları görüntüleme sayfası"
+
+#: etc/inc/priv.defs.inc:71
+msgid "Allow access to the 'Diagnostics: Show States' page."
+msgstr "'Araçlar: Durumları görüntüleme' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:76
+msgid "WebCfg - Diagnostics: Sockets page"
+msgstr "WebCfg - Araçlar: Soketler sayfası"
+
+#: etc/inc/priv.defs.inc:77
+msgid "Allow access to the 'Diagnostics: Sockets' page."
+msgstr "'Araçlar: Soketler' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:82
+msgid "Webcfg - Diagnostics: Test Port"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:83
+msgid "Allow access to the 'Diagnostics: Test Port' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:88
+msgid "WebCfg - Status: IPsec page"
+msgstr "Webcfg - Durum: IPsec sayfası"
+
+#: etc/inc/priv.defs.inc:89
+msgid "Allow access to the 'Status: IPsec' page."
+msgstr "'Durum: IPsec' sayfasına erişmeye izin ver."
+
+#: etc/inc/priv.defs.inc:94
+msgid "WebCfg - Status: IPsec: Leasespage"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:95
+msgid "Allow access to the 'Status: IPsec: Leases' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:100
+msgid "WebCfg - Status: IPsec: SAD page"
+msgstr "WebCfg - Durum: IPsec: SAD sayfası"
+
+#: etc/inc/priv.defs.inc:101
+msgid "Allow access to the 'Status: IPsec: SAD' page."
+msgstr "'Durum: IPsec: SAD' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:106
+msgid "WebCfg - Status: IPsec: SPD page"
+msgstr "WebCfg - Durum: IPsec: SPD sayfası"
+
+#: etc/inc/priv.defs.inc:107
+msgid "Allow access to the 'Status: IPsec: SPD' page."
+msgstr "'Durum: IPsec: SPD' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:112
+msgid "Webcfg - Status: NTP page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:113
+msgid "Allow access to the 'Status: NTP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:118
+msgid "WebCfg - Diag IPsec XML page"
+msgstr "Webcfg - IPsec: XML incele sayfası"
+
+#: etc/inc/priv.defs.inc:119
+msgid "Allow access to the 'Diag IPsec XML' page."
+msgstr "'IPsec: XML incele' sayfasına erişimi mümkün kılar."
+
+#: etc/inc/priv.defs.inc:124
+msgid "WebCfg - Diagnostics: Logs: System page"
+msgstr "Webcfg - Araçlar: Sistem Kayıtları: Sistem sayfası"
+
+#: etc/inc/priv.defs.inc:125
+msgid "Allow access to the 'Diagnostics: Logs: System' page."
+msgstr "'Araçlar: Sistem Kayıtları: Sistem' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:130
+msgid "WebCfg - Status: System logs: Portal Auth page"
+msgstr "Webcfg - Durum: Sistem kayıtları: Portal Kimlik Doğrulama sayfası"
+
+#: etc/inc/priv.defs.inc:131
+msgid "Allow access to the 'Status: System logs: Portal Auth' page."
+msgstr ""
+"'Durum: Sistem kayıtları: Portal Kimlik Doğrulama' sayfasına erişim izni "
+"verir."
+
+#: etc/inc/priv.defs.inc:136
+msgid "WebCfg - Diagnostics: Logs: DHCP page"
+msgstr "Webcfg - Araçlar: Sistem Kayıtları: DHCP sayfası"
+
+#: etc/inc/priv.defs.inc:137
+msgid "Allow access to the 'Diagnostics: Logs: DHCP' page."
+msgstr "'Araçlar: Sistem Kayıtları: DHCP' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:142
+msgid "WebCfg - Diagnostics: Logs: Firewall page"
+msgstr "WebCfg - Araçlar: Sistem Kayıtları: Güvenlik duvarı sayfası"
+
+#: etc/inc/priv.defs.inc:143
+msgid "Allow access to the 'Diagnostics: Logs: Firewall' page."
+msgstr ""
+"'Araçlar: Sistem Kayıtları: Güvenlik duvarı' sayfasını kullanıcının "
+"erişimine açar."
+
+# 87%
+#: etc/inc/priv.defs.inc:148
+msgid "WebCfg - Diagnostics: Logs: Gateways page"
+msgstr "WebCfg - Araçlar: Sistem Kayıtları: Ağ Geçidi sayfası"
+
+# 84%
+#: etc/inc/priv.defs.inc:149
+msgid "Allow access to the 'Diagnostics: Logs: System: Gateways' page."
+msgstr "'Araçlar: Sistem Kayıtları: Sistem: Ağ Geçidi' sayfasını erişime açar."
+
+# 85%
+#: etc/inc/priv.defs.inc:154
+msgid "WebCfg - Diagnostics: Logs: Resolver page"
+msgstr "Webcfg - Araçlar: Sistem Kayıtları: Çözücü sayfası"
+
+# 84%
+#: etc/inc/priv.defs.inc:155
+msgid "Allow access to the 'Diagnostics: Logs: System: Resolver' page."
+msgstr "'Araçlar: Sistem Kayıtları: Sistem: Çözücü' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:160
+msgid "WebCfg - Hidden: No longer included page"
+msgstr "WebCfg - Gizli: Artık dahil edilmiyor sayfası"
+
+#: etc/inc/priv.defs.inc:161
+msgid "Allow access to the 'Hidden: No longer included' page."
+msgstr "'Gizli: Artık dahil edilmiyor' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:166 etc/inc/priv.defs.inc:184
+msgid "WebCfg - Status: System logs: IPsec VPN page"
+msgstr "WebCfg - Durum: Sistem Kayıtları: IPsec VPN sayfası"
+
+#: etc/inc/priv.defs.inc:167 etc/inc/priv.defs.inc:185
+msgid "Allow access to the 'Status: System logs: IPsec VPN' page."
+msgstr "'Durum: Sistem Kayıtları: Ipsec VPN' sayfasını erişime açar."
+
+# 88%
+#: etc/inc/priv.defs.inc:172
+msgid "WebCfg - Status: System logs: NTP page"
+msgstr "WebCfg - Durum: Sistem Kayıtları: NTP sayfası"
+
+# 91%
+#: etc/inc/priv.defs.inc:173
+msgid "Allow access to the 'Status: System logs: NTP' page."
+msgstr "'Durum: Sistem Kayıtları: NTP' sayfasını kullanıcının erişime açar."
+
+#: etc/inc/priv.defs.inc:178
+msgid "WebCfg - Status: System logs: OpenVPN page"
+msgstr "WebCfg - Durum: Sistem Kayıtları: OpenVPN sayfası"
+
+#: etc/inc/priv.defs.inc:179
+msgid "Allow access to the 'Status: System logs: OpenVPN' page."
+msgstr "'Durum: Sistem Kayıtları: OpenVPN' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:190
+msgid "WebCfg - Status: System logs: Load Balancer page"
+msgstr "WebCfg - Durum: Sistem Kayıtları: Yük Dengeleyici sayfası"
+
+#: etc/inc/priv.defs.inc:191
+msgid "Allow access to the 'Status: System logs: Load Balancer' page."
+msgstr ""
+"'Durum: Sistem Kayıtları: Yük Dengeleyici' sayfasını kullanıcının erişimine "
+"açar."
+
+#: etc/inc/priv.defs.inc:196
+msgid "Webcfg - Status: System logs: Routing page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:197
+msgid "Allow access to the 'Status: System logs: System: Routing' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:202
+msgid "Webcfg - Status: System logs: Wireless page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:203
+msgid "Allow access to the 'Status: System logs: System: Wireless' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:208
+msgid "WebCfg - Diagnostics: Logs: Settings page"
+msgstr "WebCfg - Araçlar: Sistem Kayıtları: Ayarlar sayfası"
+
+#: etc/inc/priv.defs.inc:209
+msgid "Allow access to the 'Diagnostics: Logs: Settings' page."
+msgstr "'Araçlar: Sistem Kayıtları: Ayarlar' sayfasını erişilebilir kılar."
+
+#: etc/inc/priv.defs.inc:214
+msgid "WebCfg - Diagnostics: Logs: VPN page"
+msgstr "WebCfg - Araçlar: Sistem Kayıtları: VPN sayfası"
+
+#: etc/inc/priv.defs.inc:215
+msgid "Allow access to the 'Diagnostics: Logs: VPN' page."
+msgstr ""
+"'Araçlar: Sistem Kayıtları: VPN' sayfasını kullanıcının erişimine açar."
+
+#: etc/inc/priv.defs.inc:220
+msgid "WebCfg - Diagnostics: NanoBSD"
+msgstr "WebCfg - Araçlar: NanoBSD"
+
+#: etc/inc/priv.defs.inc:221
+msgid "Allow access to the 'Diagnostics: NanoBSD' page."
+msgstr "'Araçlar: NanoBSD' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:226
+msgid "WebCfg - Diagnostics: Packet Capture page"
+msgstr "WebCfg - Araçlar Paket Yakalama sayfası"
+
+#: etc/inc/priv.defs.inc:227
+msgid "Allow access to the 'Diagnostics: Packet Capture' page."
+msgstr "'Araçlar Paket Yakalama' sayfasını kullanıcının erişimine açar."
+
+#: etc/inc/priv.defs.inc:232
+msgid "WebCfg - Diagnostics: Patterns page"
+msgstr "WebCfg - Araçlar: Örüntüler sayfası"
+
+#: etc/inc/priv.defs.inc:233
+msgid "Allow access to the 'Diagnostics: Patterns' page."
+msgstr "'Araçlar: Örüntüler' sayfasına erişime izin verir."
+
+#: etc/inc/priv.defs.inc:238 usr/local/www/diag_limiter_info.php:45
+msgid "Diagnostics: Limiter Info"
+msgstr "Araçlar: Limitleyici Bilgisi"
+
+#: etc/inc/priv.defs.inc:239
+msgid "Allows access to the 'Diagnostics: Limiter Info' page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:244 usr/local/www/diag_pf_info.php:45
+msgid "Diagnostics: pfInfo"
+msgstr "Araçlar: pfBilgi"
+
+#: etc/inc/priv.defs.inc:245
+msgid "Allows access to the 'Diagnostics: pfInfo' page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:250
+msgid "WebCfg - Diagnostics: System Activity"
+msgstr "Webcfg - Araçlar: Sistem Kayıtları sayfası"
+
+#: etc/inc/priv.defs.inc:251
+msgid "Allows access to the 'Diagnostics: System Activity' page"
+msgstr "'''Araçlar: Sistem Kayıtları' sayfasına erişim izni verir"
+
+#: etc/inc/priv.defs.inc:256 usr/local/www/diag_system_pftop.php:44
+msgid "Diagnostics: pfTop"
+msgstr "Araçlar: pfTop"
+
+#: etc/inc/priv.defs.inc:257
+msgid "Allows access to the 'Diagnostics: pfTop' page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:262
+msgid "WebCfg - Diagnostics: Ping page"
+msgstr "WebCfg - Araçlar: Ping sayfası"
+
+#: etc/inc/priv.defs.inc:263
+msgid "Allow access to the 'Diagnostics: Ping' page."
+msgstr "'Araçlar: Ping' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:268
+msgid "WebCfg - Status: Package logs page"
+msgstr "WebCfg - Durum: Paket Kayıtları sayfası"
+
+#: etc/inc/priv.defs.inc:269
+msgid "Allow access to the 'Status: Package logs' page."
+msgstr "'Durum: Paket Kayıtları' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:274
+msgid "WebCfg - Diagnostics: Reset state page"
+msgstr "WebCfg - Araçlar: Durum sıfırla sayfası"
+
+#: etc/inc/priv.defs.inc:275
+msgid "Allow access to the 'Diagnostics: Reset state' page."
+msgstr "'Araçlar: Durum sıfırla' sayfasının erişimine izin ver."
+
+#: etc/inc/priv.defs.inc:280
+msgid "WebCfg - Diagnostics: Routing tables page"
+msgstr "WebCfg - Araçlar: Yönlendirme tablosu sayfası"
+
+#: etc/inc/priv.defs.inc:281
+msgid "Allow access to the 'Diagnostics: Routing tables' page."
+msgstr "'Araçlar: Yönlendirme tablosu' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:286
+msgid "WebCfg - Diagnostics: States Summary page"
+msgstr "WebCfg - Araçlar: Durum Özetleri sayfası"
+
+#: etc/inc/priv.defs.inc:287
+msgid "Allow access to the 'Diagnostics: States Summary' page."
+msgstr "'Araçlar: Durum Özetleri' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:292
+msgid "WebCfg - Diagnostics: PF Table IP addresses"
+msgstr "WebCfg - Araçlar: PF Tablosu IP adresleri"
+
+#: etc/inc/priv.defs.inc:293
+msgid "Allow access to the 'Diagnostics: Tables' page."
+msgstr "'Araçlar: Tablolar' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:298
+msgid "WebCfg - Diagnostics: Traceroute page"
+msgstr "WebCfg - Araçlar: Tracerouter sayfası"
+
+#: etc/inc/priv.defs.inc:299
+msgid "Allow access to the 'Diagnostics: Traceroute' page."
+msgstr "'Araçlar: Traceroute' sayfasını erişilebilir yapar."
+
+#: etc/inc/priv.defs.inc:304
+msgid "WebCfg - Diagnostics: Edit FIle"
+msgstr "WebCfg - Araçlar: Dosya Düzenle"
+
+#: etc/inc/priv.defs.inc:305
+msgid "Allow access to the 'Diagnostics: Edit File' page."
+msgstr "'Araçlar: Dosya Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:312
+msgid "WebCfg - Diagnostics: Command page"
+msgstr "WebCfg - Araçlar: Komut sayfası"
+
+#: etc/inc/priv.defs.inc:313
+msgid "Allow access to the 'Diagnostics: Command' page."
+msgstr "'Araçlar: Komut' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:318
+msgid "WebCfg - Firewall: Aliases page"
+msgstr "WebCfg - Güvenlik duvarı: Gruplar sayfası"
+
+#: etc/inc/priv.defs.inc:319
+msgid "Allow access to the 'Firewall: Aliases' page."
+msgstr "'Güvenlik duvarı: Gruplar' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:324
+msgid "WebCfg - Firewall: Alias: Edit page"
+msgstr "WebCfg - Güvenlik duvarı: Grup: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:325
+msgid "Allow access to the 'Firewall: Alias: Edit' page."
+msgstr "'Güvenlik duvarı: Grup: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:330
+msgid "WebCfg - Firewall: Alias: Import page"
+msgstr "WebCfg - Güvenlik duvarı: Grup: Toplu içe aktarım sayfası"
+
+#: etc/inc/priv.defs.inc:331
+msgid "Allow access to the 'Firewall: Alias: Import' page."
+msgstr "'Güvenlik duvarı: Grup: Toplu içe aktarım' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:336
+msgid "Webcfg - Firewall: NAT: NPT page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:337
+msgid "Allow access to the 'Firewall: NAT: NPT' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:342
+msgid "Webcfg - Firewall: NAT: NPt: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:343
+msgid "Allow access to the 'Firewall: NAT: NPt: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:348
+msgid "WebCfg - Firewall: NAT: Port Forward page"
+msgstr "WebCfg - Güvenlik duvarı: NAT: Port Yönlendirme sayfası"
+
+#: etc/inc/priv.defs.inc:349
+msgid "Allow access to the 'Firewall: NAT: Port Forward' page."
+msgstr "'Güvenlik duvarı: NAT: Port Yönlendirme' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:354
+msgid "WebCfg - Firewall: NAT: 1:1 page"
+msgstr "WebCfg - Güvenlik duvarı: NAT: 1:1 sayfası"
+
+#: etc/inc/priv.defs.inc:355
+msgid "Allow access to the 'Firewall: NAT: 1:1' page."
+msgstr "'Güvenlik duvarı: NAT: 1:1' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:360
+msgid "WebCfg - Firewall: NAT: 1:1: Edit page"
+msgstr "WebCfg - Güvenlik duvarı: NAT: 1:1: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:361
+msgid "Allow access to the 'Firewall: NAT: 1:1: Edit' page."
+msgstr "'Güvenlik duvarı: NAT: 1:1: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:366
+msgid "WebCfg - Firewall: NAT: Port Forward: Edit page"
+msgstr "WebCfg - Güvenlik duvarı: NAT: Port Yönlendirme: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:367
+msgid "Allow access to the 'Firewall: NAT: Port Forward: Edit' page."
+msgstr ""
+"'Güvenlik duvarı: NAT: Port Yönlendirme: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:372
+msgid "WebCfg - Firewall: NAT: Outbound page"
+msgstr "WebCfg - Güvenlik duvarı: NAT: Dışarı giden sayfası"
+
+#: etc/inc/priv.defs.inc:373
+msgid "Allow access to the 'Firewall: NAT: Outbound' page."
+msgstr "'Güvenlik duvarı: NAT: Dışarı giden' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:378
+msgid "WebCfg - Firewall: NAT: Outbound: Edit page"
+msgstr "WebCfg - Güvenlik duvarı: NAT: Dışarı giden: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:379
+msgid "Allow access to the 'Firewall: NAT: Outbound: Edit' page."
+msgstr ""
+"'Güvenlik duvarı: NAT: Dışarı giden: Düzenle' sayfasını erişilebilir yapar."
+
+#: etc/inc/priv.defs.inc:384
+msgid "WebCfg - Firewall: Rules page"
+msgstr "WebCfg - Güvenlik Duvarı: Kurallar sayfası"
+
+#: etc/inc/priv.defs.inc:385
+msgid "Allow access to the 'Firewall: Rules' page."
+msgstr "'Güvenlik Duvarı: Kurallar' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:390
+msgid "WebCfg - Firewall: Rules: Edit page"
+msgstr "WebCfg - Güvenlik Duvarı: Kurallar: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:391
+msgid "Allow access to the 'Firewall: Rules: Edit' page."
+msgstr "'Güvenlik Duvarı: Kurallar: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:396
+msgid "WebCfg - Firewall: Schedules page"
+msgstr "WebCfg - Güvenlik Duvarı: Zamanlamalar sayfası"
+
+#: etc/inc/priv.defs.inc:397
+msgid "Allow access to the 'Firewall: Schedules' page."
+msgstr "'Güvenlik Duvarı: Zamanlamalar' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:402
+msgid "WebCfg - Firewall: Schedules: Edit page"
+msgstr "WebCfg - Güvenlik Duvarı: Zamanlamalar: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:403
+msgid "Allow access to the 'Firewall: Schedules: Edit' page."
+msgstr "'Güvenlik Duvarı: Zamanlamalar: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:408
+msgid "WebCfg - Firewall: Traffic Shaper page"
+msgstr "WebCfg - Güvenlik Duvarı: Trafik Şekillendirici sayfası"
+
+#: etc/inc/priv.defs.inc:409
+msgid "Allow access to the 'Firewall: Traffic Shaper' page."
+msgstr "'Güvenlik Duvarı: Trafik Şekillendirici' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:414
+msgid "WebCfg - Firewall: Traffic Shaper: Layer7 page"
+msgstr "WebCfg - Güvenlik Duvarı: Trafik Şekillendirici: Layer7 sayfası"
+
+#: etc/inc/priv.defs.inc:415
+msgid "Allow access to the 'Firewall: Traffic Shaper: Layer7' page."
+msgstr ""
+"'Güvenlik Duvarı: Trafik Şekillendirici: Layer7' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:420
+msgid "WebCfg - Firewall: Traffic Shaper: Queues page"
+msgstr "WebCfg - Güvenlik Duvarı: Trafik Şekillendirici: Kuyruklar sayfası"
+
+#: etc/inc/priv.defs.inc:421
+msgid "Allow access to the 'Firewall: Traffic Shaper: Queues' page."
+msgstr ""
+"'Güvenlik Duvarı: Trafik Şekillendirici: Kuyruklar' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:426
+msgid "WebCfg - Firewall: Traffic Shaper: Limiter page"
+msgstr "WebCfg - Güvenlik Duvarı: Trafik Şekillendirici: Limitleyici sayfası"
+
+#: etc/inc/priv.defs.inc:427
+msgid "Allow access to the 'Firewall: Traffic Shaper: Limiter' page."
+msgstr ""
+"'Güvenlik Duvarı: Trafik Şekillendirici: Limitleyici' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:432
+msgid "WebCfg - Firewall: Traffic Shaper: Wizard page"
+msgstr "WebCfg - Güvenlik Duvarı: Trafik Şekillendirici: Sihirbaz sayfası"
+
+#: etc/inc/priv.defs.inc:433
+msgid "Allow access to the 'Firewall: Traffic Shaper: Wizard' page."
+msgstr ""
+"'Güvenlik duvarı: Trafik Şekillendirici: Sihirbaz' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:438
+msgid "WebCfg - Firewall: Virtual IP Addresses page"
+msgstr "WebCfg - Güvenlik Duvarı: Sanal IP Adresleri sayfası"
+
+#: etc/inc/priv.defs.inc:439
+msgid "Allow access to the 'Firewall: Virtual IP Addresses' page."
+msgstr ""
+"'Güvenlik Duvarı: Sanal IP Adresleri' sayfasını kullanıcının erişimine açar."
+
+#: etc/inc/priv.defs.inc:444
+msgid "WebCfg - Firewall: Virtual IP Address: Edit page"
+msgstr "WebCfg - Güvenlik Duvarı: Sanal IP Adresi: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:445
+msgid "Allow access to the 'Firewall: Virtual IP Address: Edit' page."
+msgstr ""
+"Güvenlik Duvarı: Sanal IP Adresi: Düzenle' sayfasını erişilebilir kılar."
+
+#: etc/inc/priv.defs.inc:450
+msgid "WebCfg - AJAX: Get Service Providers"
+msgstr "WebCfg - AJAX: Servis Sağlayıcıları Al"
+
+#: etc/inc/priv.defs.inc:451
+msgid "Allow access to the 'AJAX: Service Providers' page."
+msgstr "'AJAX: Servis Sağlayıcıları Al' sayfasını kullanıcının erişimine açar."
+
+#: etc/inc/priv.defs.inc:456
+msgid "WebCfg - AJAX: Get Stats"
+msgstr "WebCfg - AJAX: İstatistikler"
+
+#: etc/inc/priv.defs.inc:457
+msgid "Allow access to the 'AJAX: Get Stats' page."
+msgstr "'AJAX: İstatistikleri Al' sayfasının erişimine izin ver."
+
+#: etc/inc/priv.defs.inc:462
+msgid "WebCfg - Diagnostics: Interface Traffic page"
+msgstr "WebCfg - Araçlar: Arabirim Trafiği sayfası"
+
+#: etc/inc/priv.defs.inc:463
+msgid "Allow access to the 'Diagnostics: Interface Traffic' page."
+msgstr "'Araçlar: Arabirim Trafiği' sayfasını erişilebilir yapar."
+
+#: etc/inc/priv.defs.inc:468 etc/inc/priv.defs.inc:972
+msgid "WebCfg - Diagnostics: CPU Utilization page"
+msgstr "WebCfg - Araçlar: İşlemci Kaynak Kullanımı sayfası"
+
+#: etc/inc/priv.defs.inc:469 etc/inc/priv.defs.inc:973
+msgid "Allow access to the 'Diagnostics: CPU Utilization' page."
+msgstr ""
+"'Araçlar: İşlemci Kaynak Kullanımı' sayfasını kullanıcının erişimine açar."
+
+#: etc/inc/priv.defs.inc:474
+msgid "WebCfg - Diagnostics: Halt system page"
+msgstr "WebCfg - Araçlar: Sistemi kapat sayfası"
+
+#: etc/inc/priv.defs.inc:475
+msgid "Allow access to the 'Diagnostics: Halt system' page."
+msgstr "'Araçlar: Sistemi Kapat' sayfasını erişilebilir kılar."
+
+#: etc/inc/priv.defs.inc:480
+msgid "WebCfg - Required for javascript page"
+msgstr "WebCfg - Javascript sayfası için gerekli"
+
+#: etc/inc/priv.defs.inc:481
+msgid "Allow access to the 'Required for javascript' page."
+msgstr "'Javascript için gerekli' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:486
+msgid "WebCfg - XMLRPC Interface Stats page"
+msgstr "WebCfg - XMLRPC Arabirim İstatistikleri sayfası"
+
+#: etc/inc/priv.defs.inc:487
+msgid "Allow access to the 'XMLRPC Interface Stats' page."
+msgstr "'XMLRPC Arabirim İstatistikleri' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:492
+msgid "WebCfg - System: Login / Logout page / Dashboard"
+msgstr "WebCfg - Sistem: Anasayfa / Oturum açma / Oturum kapatma"
+
+#: etc/inc/priv.defs.inc:493
+msgid "Allow access to the 'System: Login / Logout' page and Dashboard."
+msgstr ""
+"'Sistem: Oturum açma / Oturum kapatma' sayfalarına ve anasayfaya erişimi "
+"açar."
+
+#: etc/inc/priv.defs.inc:498
+msgid "WebCfg - Interfaces: WAN page"
+msgstr "WebCfg - Arabirimler: WAN sayfası"
+
+#: etc/inc/priv.defs.inc:499
+msgid "Allow access to the 'Interfaces' page."
+msgstr "'Arabirimler' sayfasını erişilebilir kılar."
+
+#: etc/inc/priv.defs.inc:504
+msgid "WebCfg - Interfaces: Assign network ports page"
+msgstr "WebCfg - Arabirimler: Network portlarını ata sayfası"
+
+#: etc/inc/priv.defs.inc:505
+msgid "Allow access to the 'Interfaces: Assign network ports' page."
+msgstr "'Arabirimler: Network portlarını ata' sayfasına erişme izni ver."
+
+#: etc/inc/priv.defs.inc:510
+msgid "WebCfg - Interfaces: Bridge page"
+msgstr "WebCfg - Arabirimler: Köprü sayfası"
+
+#: etc/inc/priv.defs.inc:511
+msgid "Allow access to the 'Interfaces: Bridge' page."
+msgstr "'Arabirimler: Köprü' sayfasına erişimi mümkün kılar."
+
+#: etc/inc/priv.defs.inc:516
+msgid "WebCfg - Interfaces: Bridge edit page"
+msgstr "WebCfg - Arabirimler: Köprü: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:517
+msgid "Allow access to the 'Interfaces: Bridge : Edit' page."
+msgstr "'Arabirimler: Köprü: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:522
+msgid "WebCfg - Interfaces: GIF page"
+msgstr "WebCfg - Arabirimler: GIF sayfası"
+
+#: etc/inc/priv.defs.inc:523
+msgid "Allow access to the 'Interfaces: GIF' page."
+msgstr "'Arabirimler: GIF' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:528
+msgid "WebCfg - Interfaces: GIF: Edit page"
+msgstr "WebCfg - Arabirimler: GIF: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:529
+msgid "Allow access to the 'Interfaces: GIF: Edit' page."
+msgstr "'Arabirimler: GIF: Düzenle' sayfasına erişim verir."
+
+#: etc/inc/priv.defs.inc:534
+msgid "WebCfg - Interfaces: GRE page"
+msgstr "WebCfg - Arabirimler: GRE sayfası"
+
+#: etc/inc/priv.defs.inc:535
+msgid "Allow access to the 'Interfaces: GRE' page."
+msgstr "'Arabirimler: GRE' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:540
+msgid "WebCfg - Interfaces: GRE: Edit page"
+msgstr "WebCfg - Arabirimler: GRE: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:541
+msgid "Allow access to the 'Interfaces: GRE: Edit' page."
+msgstr "'Arabirimler: GRE: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:546
+msgid "WebCfg - Interfaces: Groups page"
+msgstr "WebCfg - Arabirimler: Gruplar sayfası"
+
+#: etc/inc/priv.defs.inc:547
+msgid "Create interface groups"
+msgstr "Arabirim grupları oluştur"
+
+#: etc/inc/priv.defs.inc:552
+msgid "Interfaces: Groups: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:553
+msgid "Allow access to the 'Interfaces: Groups: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:558
+msgid "WebCfg - Interfaces: LAGG: page"
+msgstr "WebCfg - Arabirimler: LAGG sayfası"
+
+#: etc/inc/priv.defs.inc:559
+msgid "Edit Interface LAGG"
+msgstr "Arabirim LAGG düzenle"
+
+#: etc/inc/priv.defs.inc:564
+msgid "Interfaces: LAGG: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:565
+msgid "Allow access to the 'Interfaces: LAGG: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:570
+msgid "WebCfg - Interfaces: ppps page"
+msgstr "WebCfg - Arabirimler: PPPler sayfası"
+
+#: etc/inc/priv.defs.inc:571
+msgid "Allow access to the 'Interfaces: ppps' page."
+msgstr "'Arabirimler: PPPler' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:576
+msgid "WebCfg - Interfaces: PPPs: Edit page"
+msgstr "WebCfg - Arabirimler: PPPler: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:577
+msgid "Allow access to the 'Interfaces: PPPs: Edit' page."
+msgstr "'Arabirimler: PPPler: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:582
+msgid "WebCfg - Interfaces: QinQ page"
+msgstr "WebCfg - Arabirimler: QinQ sayfası"
+
+#: etc/inc/priv.defs.inc:583
+msgid "Allow access to the 'Interfaces: QinQ' page."
+msgstr "'Arabirimler: QinQ' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:588
+msgid "Interfaces: QinQ: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:589
+msgid "Allow access to 'Interfaces: QinQ: Edit' page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:594
+msgid "WebCfg - Interfaces: VLAN page"
+msgstr "WebCfg - Arabirimler: VLAN sayfası"
+
+#: etc/inc/priv.defs.inc:595
+msgid "Allow access to the 'Interfaces: VLAN' page."
+msgstr "'Arabirimler: VLAN' sayfasına erişim açar."
+
+#: etc/inc/priv.defs.inc:600
+msgid "WebCfg - Interfaces: VLAN: Edit page"
+msgstr "WebCfg - Arabirimler: VLAN: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:601
+msgid "Allow access to the 'Interfaces: VLAN: Edit' page."
+msgstr "'Arabirimler: VLAN: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:606
+msgid "WebCfg - Interfaces: Wireless page"
+msgstr "WebCfg - Arabirimler: Kablosuz sayfası"
+
+#: etc/inc/priv.defs.inc:607
+msgid "Allow access to the 'Interfaces: Wireless' page."
+msgstr "'Arabirimler: Kablosuz' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:612
+msgid "WebCfg - Interfaces: Wireless edit page"
+msgstr "WebCfg - Arabirimler: Kablosuz: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:613
+msgid "Allow access to the 'Interfaces: Wireless : Edit' page."
+msgstr "'Arabirimler: Kablosuz: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:618
+msgid "WebCfg - System: License page"
+msgstr "WebCfg - Sistem: Lisans sayfası"
+
+#: etc/inc/priv.defs.inc:619
+msgid "Allow access to the 'System: License' page."
+msgstr "'Sistem: Lisans' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:624
+msgid "WebCfg - Services: Load Balancer: Monitors page"
+msgstr "WebCfg - Servisler: Yük Dengeleyici: İzlemeler sayfası"
+
+#: etc/inc/priv.defs.inc:625
+msgid "Allow access to the 'Services: Load Balancer: Monitors' page."
+msgstr "'Servisler: Yük Dengeleyici: İzlemeler' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:630
+msgid "WebCfg - Services: Load Balancer: Monitor: Edit page"
+msgstr "WebCfg - Servisler: Yük Dengeleyici: İzlemeler: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:631
+msgid "Allow access to the 'Services: Load Balancer: Monitor: Edit' page."
+msgstr ""
+"'Servisler: Yük Dengeleyici: İzlemeler: Düzenle' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:636
+msgid "WebCfg - Load Balancer: Pool page"
+msgstr "WebCfg - Yük Dengeleyici: Havuzlar sayfası"
+
+#: etc/inc/priv.defs.inc:637
+msgid "Allow access to the 'Load Balancer: Pool' page."
+msgstr "'Yük Dengeleyici: Havuzlar' sayfasına erişim açar."
+
+#: etc/inc/priv.defs.inc:642
+msgid "WebCfg - Load Balancer: Pool: Edit page"
+msgstr "WebCfg - Yük Dengeleyici: Havuz: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:643
+msgid "Allow access to the 'Load Balancer: Pool: Edit' page."
+msgstr "'Yük Dengeleyici: Havuz: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:648
+msgid "WebCfg - Services: Load Balancer: Relay Actions page"
+msgstr "WebCfg - Servisler: Yük Dengeleyici: Aktarma Eylemi sayfası"
+
+#: etc/inc/priv.defs.inc:649
+msgid "Allow access to the 'Services: Load Balancer: Relay Actions' page."
+msgstr ""
+"'Servisler: Yük Dengeleyici: Aktarma Eylemleri' sayfasına erişmeye izin "
+"verir."
+
+#: etc/inc/priv.defs.inc:654
+msgid "WebCfg - Services: Load Balancer: Relay Action: Edit page"
+msgstr "WebCfg - Servisler: Yük Dengeleyici: Aktarma Eylemi: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:655
+msgid "Allow access to the 'Services: Load Balancer: Relay Action: Edit' page."
+msgstr ""
+"'Servisler: Yük Dengeleyici: Aktarım Eylemi: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:660
+msgid "WebCfg - Services: Load Balancer: Relay Protocols page"
+msgstr "WebCfg - Servisler: Yük Dengeleyici: Aktarım Protokolleri sayfası"
+
+#: etc/inc/priv.defs.inc:661
+msgid "Allow access to the 'Services: Load Balancer: Relay Protocols' page."
+msgstr ""
+"'Servisler: Yük Dengeleyici: Aktarım Protokolleri' sayfasına erişme izni "
+"verir."
+
+#: etc/inc/priv.defs.inc:666
+msgid "WebCfg - Services: Load Balancer: Relay Protocol: Edit page"
+msgstr ""
+"WebCfg - Servisler: Yük Dengeleyici: Aktarım Protokolü: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:667
+msgid ""
+"Allow access to the 'Services: Load Balancer: Relay Protocol: Edit' page."
+msgstr ""
+"'Servisler: Yük Dengeleyici: Aktarım Protokolü: Düzenle' sayfasını erişime "
+"açar."
+
+#: etc/inc/priv.defs.inc:672
+msgid "Webcfg - Services: Load Balancer: setting page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:673
+msgid "Allow access to the 'Settings: Load Balancer: Settings' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:678
+msgid "WebCfg - Services: Load Balancer: Virtual Servers page"
+msgstr "WebCfg - Servisler: Yük Dengeleyici: Sanal Sunucular sayfası"
+
+#: etc/inc/priv.defs.inc:679
+msgid "Allow access to the 'Services: Load Balancer: Virtual Servers' page."
+msgstr ""
+"'Servisler: Yük Dengeleyici: Sanal Sunucular' sayfasını kullanıcının "
+"erişimine açar."
+
+#: etc/inc/priv.defs.inc:684
+msgid "Webcfg - Services: NTP"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:685
+msgid "Allow access to the 'Services: NTP' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:690
+msgid "Webcfg - Status: NTP GPS page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:691
+msgid "Allow access to the 'Status: NTP Serial GPS' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:696
+msgid "Webcfg - Status: NTP PPS page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:697
+msgid "Allow access to the 'Status: NTP PPS' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:702
+msgid "WebCfg - Load Balancer: Virtual Server: Edit page"
+msgstr "WebCfg - Servisler: Yük Dengeleyici: Sanal Sunucu: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:703
+msgid "Allow access to the 'Load Balancer: Virtual Server: Edit' page."
+msgstr ""
+"'Servisler: Yük Dengeleyici: Sanal Sunucular: Düzenleme' sayfasının "
+"erişimine izin ver."
+
+#: etc/inc/priv.defs.inc:708
+msgid "WebCfg - Package: Settings page"
+msgstr "WebCfg - Paket: Ayarlar sayfası"
+
+#: etc/inc/priv.defs.inc:709
+msgid "Allow access to the 'Package: Settings' page."
+msgstr "'Paket: Ayarlar' sayfasını erişilebilir hale getirir."
+
+#: etc/inc/priv.defs.inc:714
+msgid "WebCfg - Package: Edit page"
+msgstr "WebCfg - Paket: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:715
+msgid "Allow access to the 'Package: Edit' page."
+msgstr "'Paket: Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:720
+msgid "WebCfg - System: Package Manager page"
+msgstr "WebCfg - Sistem: Paket Yöneticisi sayfası"
+
+#: etc/inc/priv.defs.inc:721
+msgid "Allow access to the 'System: Package Manager' page."
+msgstr "'Sistem: Paket Yöneticisi' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:726
+msgid "WebCfg - System: Package Manager: Install Package page"
+msgstr "WebCfg - Sistem: Paket Yönetici: Paket Kur sayfası"
+
+#: etc/inc/priv.defs.inc:727
+msgid "Allow access to the 'System: Package Manager: Install Package' page."
+msgstr "'Sistem: Paket Yöneticisi: Paket Kur' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:732
+msgid "WebCfg - System: Package Manager: Installed page"
+msgstr "WebCfg - Sistem: Paket Yöneticisi: Kurulu Paketler sayfası"
+
+#: etc/inc/priv.defs.inc:733
+msgid "Allow access to the 'System: Package Manager: Installed' page."
+msgstr "'Sistem: Paket Yöneticisi: Kurulu Paketler sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:738
+msgid "WebCfg - Packages: Settings page"
+msgstr "WebCfg - Paketler: Ayarlar sayfası"
+
+#: etc/inc/priv.defs.inc:739
+msgid "Allow access to the 'Packages: Settings' page."
+msgstr "'Paketler: Ayarlar' sayfasına erişim açar."
+
+#: etc/inc/priv.defs.inc:744
+msgid "WebCfg - Diagnostics: Reboot System page"
+msgstr "WebCfg - Araçlar: Yeniden Başlat sayfası"
+
+#: etc/inc/priv.defs.inc:745
+msgid "Allow access to the 'Diagnostics: Reboot System' page."
+msgstr "'Araçlar: Yeniden Başlat' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:750
+msgid "WebCfg - Diagnostics: Restart HTTPD : System page"
+msgstr "WebCfg - Araçlar: (HTTPD) Web sunucuyu yeniden başlat: Sistem sayfası"
+
+#: etc/inc/priv.defs.inc:751
+msgid "Allow access to the 'Diagnostics: Restart HTTPD: System' page."
+msgstr ""
+"'Araçlar: (HTTPD) Web sunucuyu yeniden başlat: Sistem' sayfasına erişimi "
+"açar."
+
+#: etc/inc/priv.defs.inc:756
+msgid "WebCfg - Services: Captive portal page"
+msgstr "WebCfg - Servisler: Hizmet Portalı sayfası"
+
+#: etc/inc/priv.defs.inc:757
+msgid "Allow access to the 'Services: Captive portal' page."
+msgstr "'Servisler: Hizmet portalı' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:762
+msgid "WebCfg - Services: Captive portal: File Manager page"
+msgstr "WebCfg - Servisler: Hizmet portalı: Dosya Yöneticisi sayfası"
+
+#: etc/inc/priv.defs.inc:763
+msgid "Allow access to the 'Services: Captive portal: File Manager' page."
+msgstr "'Servisler: Hizmet portalı: Dosya yöneticisi' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:768
+msgid "WebCfg - Services: Captive portal: Allowed IPs page"
+msgstr "WebCfg - Servisler: Hizmet portalı: İzinli IPler sayfası"
+
+#: etc/inc/priv.defs.inc:769
+msgid "Allow access to the 'Services: Captive portal: Allowed IPs' page."
+msgstr "'Servisler: Hizmet portalı: İzinli IPler' sayfasına erişim verir."
+
+#: etc/inc/priv.defs.inc:774
+msgid "WebCfg - Services: Captive portal: Edit Allowed IPs page"
+msgstr "WebCfg - Servisler: Hizmet portalı: İznli IPler düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:775
+msgid "Allow access to the 'Services: Captive portal: Edit Allowed IPs' page."
+msgstr ""
+"'Servisler: Hizmet portalı: İznli IPler düzenle' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:780
+msgid "WebCfg - Services: Captive portal: Mac Addresses page"
+msgstr "WebCfg - Servisler: Hizmet portalı: MAC Adresleri sayfası"
+
+#: etc/inc/priv.defs.inc:781
+msgid "Allow access to the 'Services: Captive portal: Mac Addresses' page."
+msgstr ""
+"'Servisler: Hizmet portalı: MAC Adresleri' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:786
+msgid "WebCfg - Services: Captive portal: Edit MAC Addresses page"
+msgstr "WebCfg - Servisler: Hizmet portalı: MAC Adresi Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:787
+msgid ""
+"Allow access to the 'Services: Captive portal: Edit MAC Addresses' page."
+msgstr ""
+"'Servisler: Hizmet portalı: MAC Adresi Düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:792
+msgid "WebCfg - Services: Captive portal: Allowed Hostnames page"
+msgstr ""
+"WebCfg - Servisler: Capitve portal: İzin verilen Ana Bilgisayarlar sayfası"
+
+#: etc/inc/priv.defs.inc:793 etc/inc/priv.defs.inc:799
+msgid "Allow access to the 'Services: Captive portal: Allowed Hostnames' page."
+msgstr ""
+"'Servisler: Hizmet Portalı: İzin verilen Ana Bilgisayar adları' sayfasına "
+"erişime izin ver."
+
+#: etc/inc/priv.defs.inc:798
+msgid "WebCfg - Services: Captive portal: Edit Allowed Hostnames page"
+msgstr ""
+"WebCfg - Servisler: Hizmet Portalı: İzin verilen Ana Bilgisayar sayfasını "
+"düzenle"
+
+#: etc/inc/priv.defs.inc:804
+msgid "Webcfg - Services: Captive portal: Edit Zones page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:805
+msgid "Allow access to the 'Services: Captive portal: Edit Zones' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:810
+msgid "WebCfg - Services: Captive portal Vouchers page"
+msgstr "WebCfg - Servisler: Hizmet Portalı: Biletler sayfası"
+
+#: etc/inc/priv.defs.inc:811
+msgid "Allow access to the 'Services: Captive portal Vouchers' page."
+msgstr "'Servisler: Hizmet portalı: Biletler' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:822
+msgid "WebCfg - Services: Captiveprotal Zones page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:823
+msgid "Allow access to the 'Services: CaptivePortal Zones' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:828
+msgid "WebCfg - Services: DHCP server page"
+msgstr "WebCfg - Servisler: DHCP sunucu sayfası"
+
+#: etc/inc/priv.defs.inc:829
+msgid "Allow access to the 'Services: DHCP server' page."
+msgstr "'Servisler: DHCP Sunucu' sayfasını kullanıcının erişimine açar."
+
+#: etc/inc/priv.defs.inc:834
+msgid "WebCfg - Services: DHCP Server : Edit static mapping page"
+msgstr "WebCfg - Servisler: DHCP Sunucu: Rezervasyon düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:835
+msgid "Allow access to the 'Services: DHCP Server : Edit static mapping' page."
+msgstr ""
+"'Servisler: DHCP Sunucu: Rezervasyon düzenle' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:840
+msgid "WebCfg - Services: DHCP Relay page"
+msgstr "WevCfg - Servisler: DHCP Aracısı sayfası"
+
+#: etc/inc/priv.defs.inc:841
+msgid "Allow access to the 'Services: DHCP Relay' page."
+msgstr "'Servisler: DHCP Aracısı' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:846
+msgid "Webcfg - Services: DHCPv6 server page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:847
+msgid "Allow access to the 'Services: DHCPv6 server' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:852
+msgid "Webcfg - Services: DHCPv6 Server : Edit static mapping page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:853
+msgid ""
+"Allow access to the 'Services: DHCPv6 Server : Edit static mapping' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:858
+msgid "Webcfg - Services: DHCPv6 Relay page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:859
+msgid "Allow access to the 'Services: DHCPv6 Relay' page."
+msgstr "'Servisler: DHCPv6 Aracısı' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:864
+msgid "WebCfg - Services: DNS Forwarder page"
+msgstr "WebCfg - Servisler: DNS Yönlendirici sayfası"
+
+#: etc/inc/priv.defs.inc:865
+msgid "Allow access to the 'Services: DNS Forwarder' page."
+msgstr "'Servisler: DNS Yönlendirici' sayfasına erişime olanak verir."
+
+#: etc/inc/priv.defs.inc:870
+msgid "WebCfg - Services: DNS Forwarder: Edit Domain Override page"
+msgstr ""
+"WebCfg - Servisler: DNS Yönlendirici: Etki alanı Üzerine yazmayı Düzenleme "
+"sayfası "
+
+#: etc/inc/priv.defs.inc:871
+msgid ""
+"Allow access to the 'Services: DNS Forwarder: Edit Domain Override' page."
+msgstr ""
+"'Servisler: DNS Yönlendirici: Etki alanı Üzerine yazmayı Düzenleme' "
+"sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:876
+msgid "WebCfg - Services: DNS Forwarder: Edit host page"
+msgstr "WebCfg - Servisler: DNS Yönlendirici: Host düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:877
+msgid "Allow access to the 'Services: DNS Forwarder: Edit host' page."
+msgstr "'Servisler: DNS Yönlendirici: Host düzenle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:882
+msgid "WebCfg - Services: DNS Resolver page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:883
+msgid "Allow access to the 'Services: DNS Resolver' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:888
+msgid "WebCfg - Services: DNS Resolver: Advanced page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:889
+msgid "Allow access to the 'Services: DNS Resolver: Advanced' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:894
+msgid "WebCfg - Services: DNS Resolver: Access Lists page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:895
+msgid "Allow access to the 'Services: DNS Resolver: Access Lists' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:900
+msgid "WebCfg - Services: DNS Resolver: Access Lists: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:901
+msgid "Allow access to the 'Services: DNS Resolver: Access Lists: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:906
+msgid "WebCfg - Services: DNS Resolver: Edit Domain Override page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:907
+msgid ""
+"Allow access to the 'Services: DNS Resolver: Edit Domain Override' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:912
+msgid "WebCfg - Services: DNS Resolver: Edit host page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:913
+msgid "Allow access to the 'Services: DNS Resolver: Edit host' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:918
+msgid "WebCfg - Services: Dynamic DNS clients page"
+msgstr "WebCfg - Servisler: Dinamik DNS istemcisi sayfası"
+
+#: etc/inc/priv.defs.inc:919
+msgid "Allow access to the 'Services: Dynamic DNS clients' page."
+msgstr "'Servisler: Dinamik DNS istemcileri' sayfasına erişim verir."
+
+#: etc/inc/priv.defs.inc:924
+msgid "WebCfg - Services: Dynamic DNS client page"
+msgstr "WebCfg - Servisler: Dinamik DNS istemci sayfası"
+
+#: etc/inc/priv.defs.inc:925
+msgid "Allow access to the 'Services: Dynamic DNS client' page."
+msgstr "'Servisler: Dinamik DNS istemcileri' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:930
+msgid "WebCfg - Services: Igmpproxy page"
+msgstr "WebCfg - Servisler: IGMP Vekil sayfası"
+
+#: etc/inc/priv.defs.inc:931
+msgid "Allow access to the 'Services: Igmpproxy' page."
+msgstr "'Servisler: IGMP Vekil' sayfasına erişim açar."
+
+#: etc/inc/priv.defs.inc:936
+msgid "Firewall: Igmpproxy: Edit page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:937
+msgid "Allow access to the 'Services: Igmpproxy: Edit' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:942
+msgid "WebCfg - Services: RFC 2136 clients page"
+msgstr "WebCfg - Servisler: RFC 2136 istemcileri sayfası"
+
+#: etc/inc/priv.defs.inc:943
+msgid "Allow access to the 'Services: RFC 2136 clients' page."
+msgstr "'Servisler: RFC 2136 istemcileri' sayfasını erişilebilir kılar."
+
+#: etc/inc/priv.defs.inc:948
+msgid "Webcfg - Services: Router advertisementspage"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:949
+msgid "Allow access to the 'Services: Router Advertisements' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:954
+msgid "WebCfg - Services: SNMP page"
+msgstr "WebCfg - Servisler: SNMP sayfası"
+
+#: etc/inc/priv.defs.inc:955
+msgid "Allow access to the 'Services: SNMP' page."
+msgstr "'Servisler: SNMP' sayfasını erişilebilir kılar."
+
+#: etc/inc/priv.defs.inc:960
+msgid "WebCfg - Services: Wake on LAN page"
+msgstr "WebCfg - Servisler: LAN ile Uyan sayfası"
+
+#: etc/inc/priv.defs.inc:961
+msgid "Allow access to the 'Services: Wake on LAN' page."
+msgstr "'Servisler: LAN ile Uyan' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:966
+msgid "WebCfg - Services: Wake on LAN: Edit page"
+msgstr "WebCfg - Servisler: LAN ile Uyan: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:967
+msgid "Allow access to the 'Services: Wake on LAN: Edit' page."
+msgstr "'Servisler: LAN ile Uyan: Düzenle' sayfasını erişilebilir yapar."
+
+#: etc/inc/priv.defs.inc:978
+msgid "WebCfg - Hidden: Detailed Status page"
+msgstr "WebCfg - Gizli: Detaylı Durum sayfası"
+
+#: etc/inc/priv.defs.inc:979
+msgid "Allow access to the 'Hidden: Detailed Status' page."
+msgstr "'Gizli: Detaylı Durum' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:984
+msgid "WebCfg - Status: Captive portal page"
+msgstr "WebCfg - Durum: Hizmet Portalı sayfası"
+
+#: etc/inc/priv.defs.inc:985
+msgid "Allow access to the 'Status: Captive portal' page."
+msgstr "'Durum: Hizmet Portalı sayfası' sayfasına erişim izni sağlar."
+
+#: etc/inc/priv.defs.inc:990
+msgid "Webcfg - Status: Captive portal Expire Vouchers page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:991
+msgid "Allow access to the 'Status: Captive portal Expire Vouchers' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:996
+msgid "WebCfg - Status: Captive portal test Vouchers page"
+msgstr "WebCfg - Durum: Hizmet Portalı Test Biletleri sayfası"
+
+#: etc/inc/priv.defs.inc:997
+msgid "Allow access to the 'Status: Captive portal Test Vouchers' page."
+msgstr ""
+"'Durum: Hizmet portalı: Test Biletleri' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1002
+msgid "WebCfg - Status: Captive portal Voucher Rolls page"
+msgstr "WebCfg - Durum: Hizmet Portalı Bilet Dağıtımı sayfası"
+
+#: etc/inc/priv.defs.inc:1003
+msgid "Allow access to the 'Status: Captive portal Voucher Rolls' page."
+msgstr "'Durum: Hizmet portalı Bilet Dağıtımı' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1008
+msgid "WebCfg - Status: Captive portal Vouchers page"
+msgstr "WebCfg - Durum: Hizmet Portalı Biletler sayfası"
+
+#: etc/inc/priv.defs.inc:1009
+msgid "Allow access to the 'Status: Captive portal Vouchers' page."
+msgstr "'Durum: Hizmet Portalı: Biletler' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1014
+msgid "WebCfg - Status: DHCP leases page"
+msgstr "WebCfg - Durum: DHCP kiraları sayfası"
+
+#: etc/inc/priv.defs.inc:1015
+msgid "Allow access to the 'Status: DHCP leases' page."
+msgstr "'Durum DHCP Kiraları' sayfasına erişim verir."
+
+#: etc/inc/priv.defs.inc:1020
+msgid "Webcfg - Status: DHCPv6 leases page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1021
+msgid "Allow access to the 'Status: DHCPv6 leases' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1026
+msgid "WebCfg - Status: Filter Reload Status page"
+msgstr "WebCfg - Durum: Filtre Yeniden Yükleme Durumu sayfası"
+
+#: etc/inc/priv.defs.inc:1027
+msgid "Allow access to the 'Status: Filter Reload Status' page."
+msgstr ""
+"'Durum: Filtre Yeniden Yükleme Durumu' sayfasına erişim yetkisini açar."
+
+#: etc/inc/priv.defs.inc:1032
+msgid "WebCfg - Status: Gateway Groups page"
+msgstr "WebCfg - Durum: Ağ Geçidi Grupları sayfası"
+
+#: etc/inc/priv.defs.inc:1033
+msgid "Allow access to the 'Status: Gateway Groups' page."
+msgstr "'Durum: Ağ Geçidi Grupları' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:1038
+msgid "WebCfg - Status: Gateways page"
+msgstr "WebCfg - Durum: Ağ Geçitleri sayfası"
+
+#: etc/inc/priv.defs.inc:1039
+msgid "Allow access to the 'Status: Gateways' page."
+msgstr "'Durum: Ağ Geçitleri' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1044
+msgid "WebCfg - Status: Traffic Graph page"
+msgstr "WebCfg - Durum: Trafik Grafikleri sayfası"
+
+#: etc/inc/priv.defs.inc:1045
+msgid "Allow access to the 'Status: Traffic Graph' page."
+msgstr "'Durum: Trafik Grafikleri' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1053
+msgid "WebCfg - Status: CPU load page"
+msgstr "WebCfg - Durum: İşlemci Yükü sayfası"
+
+#: etc/inc/priv.defs.inc:1054
+msgid "Allow access to the 'Status: CPU load' page."
+msgstr "'Durum: İşlemci Yükü' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1059
+msgid "WebCfg - Status: Interfaces page"
+msgstr "WebCfg - Durum: Arabirimler sayfası"
+
+#: etc/inc/priv.defs.inc:1060
+msgid "Allow access to the 'Status: Interfaces' page."
+msgstr "'Durum: Arabirimler' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1065
+msgid "WebCfg - Status: Load Balancer: Pool page"
+msgstr "WebCfg - Durum: Yük Dengeleyici: Havuz sayfası"
+
+#: etc/inc/priv.defs.inc:1066
+msgid "Allow access to the 'Status: Load Balancer: Pool' page."
+msgstr "'Durum: Yük Dengeleyici: Havuz' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1071
+msgid "WebCfg - Status: Load Balancer: Virtual Server page"
+msgstr "WebCfg - Durum: Yük Dengeleyici: Sanal Sunucu sayfası"
+
+#: etc/inc/priv.defs.inc:1072
+msgid "Allow access to the 'Status: Load Balancer: Virtual Server' page."
+msgstr "'Durum: Yük Dengeleyici: Sanal Sunucu' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:1077
+msgid "WebCfg - Status: OpenVPN page"
+msgstr "WebCfg - Durum: OpenVPN sayfası"
+
+#: etc/inc/priv.defs.inc:1078
+msgid "Allow access to the 'Status: OpenVPN' page."
+msgstr "'Durum: OpenVPN' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:1083
+msgid "WebCfg - Status: Traffic shaper: Queues page"
+msgstr "WebCfg - Durum: Trafik Şekillendirici: Kuyruklar sayfası"
+
+#: etc/inc/priv.defs.inc:1084
+msgid "Allow access to the 'Status: Traffic shaper: Queues' page."
+msgstr "'Durum: Trafik Şekillendirici: Kuyruklar' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:1089
+msgid "WebCfg - Status: RRD Graphs page"
+msgstr "WebCfg - Durum: RRD Grafikleri sayfası"
+
+#: etc/inc/priv.defs.inc:1090
+msgid "Allow access to the 'Status: RRD Graphs' page."
+msgstr "'Durum: RRD Grafikleri' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1096
+msgid "WebCfg - Status: RRD Graphs settings page"
+msgstr "WebCfg - Durum: RRD Grafikleri: Ayarlar sayfası"
+
+#: etc/inc/priv.defs.inc:1097
+msgid "Allow access to the 'Status: RRD Graphs: settings' page."
+msgstr "'Durum: RRD Grafikleri: Ayarlar' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1102
+msgid "WebCfg - Status: Services page"
+msgstr "WebCfg - Durum: Servisler sayfası"
+
+#: etc/inc/priv.defs.inc:1103
+msgid "Allow access to the 'Status: Services' page."
+msgstr "'Durum: Servisler' sayfasına erişim yetkisini açar."
+
+#: etc/inc/priv.defs.inc:1108
+msgid "WebCfg - Status: UPnP Status page"
+msgstr "WebCfg - Durum: UPnP Durumu sayfası"
+
+#: etc/inc/priv.defs.inc:1109
+msgid "Allow access to the 'Status: UPnP Status' page."
+msgstr "'Durum: UPnP Durumu' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1114
+msgid "WebCfg - Status: Wireless page"
+msgstr "WebCfg - Durum: Kablosuz sayfası"
+
+#: etc/inc/priv.defs.inc:1115
+msgid "Allow access to the 'Status: Wireless' page."
+msgstr "'Durum: Kablosuz' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1120
+msgid "WebCfg - System: General Setup page"
+msgstr "WebCfg - Sistem: Genel Ayarlar sayfası"
+
+#: etc/inc/priv.defs.inc:1121
+msgid "Allow access to the 'System: General Setup' page."
+msgstr "'Sistem: Genel Ayarlar' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1126
+msgid "WebCfg - System: Advanced: Admin Access Page"
+msgstr "WebCfg - Sistem: Gelişmiş: Yönetici Erişimi sayfası"
+
+#: etc/inc/priv.defs.inc:1127
+msgid "Allow access to the 'System: Advanced: Admin Access' page."
+msgstr "'Sistem: Gelişmiş: Yönetici Erişimi' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1132
+msgid "WebCfg - System: Advanced: Firewall and NAT page"
+msgstr "WebCfg - Sistem: Gelişmiş: Güvenlik Duvarı ve NAT sayfası"
+
+#: etc/inc/priv.defs.inc:1133
+msgid "Allow access to the 'System: Advanced: Firewall and NAT' page."
+msgstr "'Sistem: Gelişmiş: Güvenlik Duvarı ve NAT' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1138
+msgid "WebCfg - System: Advanced: Miscellaneous page"
+msgstr "WebCfg - Sistem: Gelişmiş: Diğer sayfası"
+
+#: etc/inc/priv.defs.inc:1139
+msgid "Allow access to the 'System: Advanced: Miscellaneous' page."
+msgstr "'Sistem: Gelişmiş: Diğer' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:1144
+msgid "WebCfg - System: Advanced: Network page"
+msgstr "WebCfg - Sistem: Gelişmiş: Ağ sayfası"
+
+#: etc/inc/priv.defs.inc:1145
+msgid "Allow access to the 'System: Advanced: Networking' page."
+msgstr "'Sistem: Gelişmiş: Ağ' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1150
+msgid "WebCfg - System: Advanced: Notifications page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1151
+msgid "Allow access to the 'System: Advanced: Notifications' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1156
+msgid "WebCfg - System: Advanced: Tunables page"
+msgstr "WebCfg - Sistem: Gelişmiş: Değişkenler sayfası"
+
+#: etc/inc/priv.defs.inc:1157
+msgid "Allow access to the 'System: Advanced: Tunables' page."
+msgstr "'Sistem: Gelişmiş: Değişkenlerr' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1162
+msgid "WebCfg - System: Authentication Servers"
+msgstr "WebCfg - Sistem: Kimlik Doğrulama Sunucuları"
+
+#: etc/inc/priv.defs.inc:1163
+msgid "Allow access to the 'System: Authentication Servers' page."
+msgstr "'Sistem: Kimlik Doğrulama Sunucuları' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1168
+msgid "WebCfg - System: CA Manager"
+msgstr "WebCfg - Sistem: (CA) Sertifika Yöneticisi"
+
+#: etc/inc/priv.defs.inc:1169
+msgid "Allow access to the 'System: CA Manager' page."
+msgstr "'Sistem: (CA) Sertifika Yöneticisi' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1174
+msgid "WebCfg - System: Certificate Manager"
+msgstr "WebCfg - Sistem: Sertifika Yöneticisi"
+
+#: etc/inc/priv.defs.inc:1175
+msgid "Allow access to the 'System: Certificate Manager' page."
+msgstr "'Sistem: Sertifika Yöneticisi' sayfasına erişime izin verir."
+
+#: etc/inc/priv.defs.inc:1180
+msgid "WebCfg - System: CRL Manager"
+msgstr "WebCfg - Sistem: CRL Yönetici"
+
+#: etc/inc/priv.defs.inc:1181
+msgid "Allow access to the 'System: CRL Manager' page."
+msgstr "'Sistem: CRL Yönetici' sayfasının erişimine izin ver."
+
+#: etc/inc/priv.defs.inc:1186
+msgid "WebCfg - System: Firmware: Manual Update page"
+msgstr "WebCfg - Sistem: Üretici yazılımı: Elle Güncelle sayfası"
+
+#: etc/inc/priv.defs.inc:1187
+msgid "Allow access to the 'System: Firmware: Manual Update' page."
+msgstr ""
+"'Sistem: Üretici yazılımı: Elle Güncelleme' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1192
+msgid "WebCfg - System: Firmware: Check For Update page"
+msgstr "WebCfg - Sistem: Üretici yazılımı: Güncelleme Kontrolü sayfası"
+
+#: etc/inc/priv.defs.inc:1193
+msgid "Allow access to the 'System: Firmware: Check For Update' page."
+msgstr ""
+"'Sistem: Üretici yazılımı: Güncelleme Kontrolü' sayfasına erişim yetkisi "
+"verir."
+
+#: etc/inc/priv.defs.inc:1198
+msgid "WebCfg - System: Firmware: Auto Update page"
+msgstr "WebCfg - Sistem: Üretici yazılımı: Otomatik Güncelle sayfası"
+
+#: etc/inc/priv.defs.inc:1199
+msgid "Allow access to the 'System: Firmware: Auto Update' page."
+msgstr ""
+"'Sistem: Üretici yazılımı: Otomatik Güncelle' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:1204
+msgid "WebCfg - System: Firmware: Settings page"
+msgstr "WebCfg - Sistem: Üretici yazılımı: Ayarlar sayfası"
+
+#: etc/inc/priv.defs.inc:1205
+msgid "Allow access to the 'System: Firmware: Settings' page."
+msgstr "'Sistem: Üretici yazılımı: Ayarlar' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1210
+msgid "WebCfg - System: Gateway Groups page"
+msgstr "WebCfg - Sistem: Ağ Geçit Grupları sayfası"
+
+#: etc/inc/priv.defs.inc:1211
+msgid "Allow access to the 'System: Gateway Groups' page."
+msgstr "'Sistem: Ağ Geçidi Grupları' sayfasına erişim yetkisini açar."
+
+#: etc/inc/priv.defs.inc:1216
+msgid "WebCfg - System: Gateways: Edit Gateway Groups page"
+msgstr "WebCfg - Sistem: Ağ Geçitleri: Ağ Geçidi Grupları Düzenleme sayfası"
+
+#: etc/inc/priv.defs.inc:1217
+msgid "Allow access to the 'System: Gateways: Edit Gateway Groups' page."
+msgstr ""
+"'Sistem: Ağ Geçitleri: Ağ Geçidi Grupları Düzenleme' sayfasına erişim "
+"yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1222
+msgid "WebCfg - System: Gateways page"
+msgstr "WebCfg - Sistem: Ağ Geçitleri sayfası"
+
+#: etc/inc/priv.defs.inc:1223
+msgid "Allow access to the 'System: Gateways' page."
+msgstr "'Sistem: Ağ Geçitleri' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:1228
+msgid "WebCfg - System: Gateways: Edit Gateway page"
+msgstr "WebCfg - Sistem: Ağ Geçitlerini Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:1229
+msgid "Allow access to the 'System: Gateways: Edit Gateway' page."
+msgstr ""
+"'Sistem: Ağ Geçitleri: Ağ Geçitlerini Düzenle' sayfasına erişim yetkisini "
+"açar."
+
+#: etc/inc/priv.defs.inc:1234
+msgid "WebCfg - System: Group manager page"
+msgstr "WebCfg - Sistem: Grup Yöneticisi sayfası"
+
+#: etc/inc/priv.defs.inc:1235
+msgid "Allow access to the 'System: Group manager' page."
+msgstr "'Sistem: Grup Yöneticisi' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:1240
+msgid "WebCfg - System: Group Manager: Add Privileges page"
+msgstr "WebCfg - Sistem: Grup Yöneticisi: Yetki Ekle sayfası"
+
+#: etc/inc/priv.defs.inc:1241
+msgid "Allow access to the 'System: Group Manager: Add Privileges' page."
+msgstr "'Sistem: Grup Yöneticisi: Yeki Ekle' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1246
+msgid "Webcfg - System: High Availability Sync"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1247
+msgid "Allow access to the 'System: High Availability Sync' page."
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1252
+msgid "WebCfg - System: Static Routes page"
+msgstr "WebCfg - Sistem: Sabit Yönlendirmeler sayfası"
+
+#: etc/inc/priv.defs.inc:1253
+msgid "Allow access to the 'System: Static Routes' page."
+msgstr "'Sistem: Sabit Yönlendirmeler sayfası' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:1258
+msgid "WebCfg - System: Static Routes: Edit route page"
+msgstr "WebCfg - Sistem: Sabit Yönlendirmeler: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:1259
+msgid "Allow access to the 'System: Static Routes: Edit route' page."
+msgstr ""
+"'Sistem: Sabit Yönlendirmeler: Düzenle' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1264
+msgid "WebCfg - System: User Manager page"
+msgstr "WebCfg - Sistem: Kullanıcı Yönetici sayfası"
+
+#: etc/inc/priv.defs.inc:1265
+msgid "Allow access to the 'System: User Manager' page."
+msgstr "'Sistem: Kullanıcı Yönetici' sayfasına erişim olanağı verir."
+
+#: etc/inc/priv.defs.inc:1270
+msgid "WebCfg - System: User Manager: Add Privileges page"
+msgstr "WebCfg - Sistem: Kullanıcı Yöneticisi: Yetki Ekle sayfası"
+
+#: etc/inc/priv.defs.inc:1271
+msgid "Allow access to the 'System: User Manager: Add Privileges' page."
+msgstr "'Sistem: Kullanıcı Yöneticisi: Yetki Ekle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:1276
+msgid "WebCfg - System: User Password Manager page"
+msgstr "WebCfg - Sistem: Kullanıcı Parola Yönetici sayfası"
+
+#: etc/inc/priv.defs.inc:1277
+msgid "Allow access to the 'System: User Password Manager' page."
+msgstr "'Sistem: Kullanıcı Parola Yönetici' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1282
+msgid "WebCfg - System: User Manager: settings page"
+msgstr "WebCfg - Sistem: Kullanıcı Yönetimi: ayarlar sayfası"
+
+#: etc/inc/priv.defs.inc:1283
+msgid "Allow access to the 'System: User Manager: settings' page."
+msgstr "'Sistem: Kullanıcı Yönetimi: ayarlar' sayfasına erişime izin ver."
+
+#: etc/inc/priv.defs.inc:1288
+msgid "WebCfg - System: User Manager: Settings: Test LDAP page"
+msgstr "WebCfg - Sistem: Kullanıcı Yöneticisi: Ayarlar: LDAP Test sayfası"
+
+#: etc/inc/priv.defs.inc:1289
+msgid "Allow access to the 'System: User Manager: Settings: Test LDAP' page."
+msgstr ""
+"'Sistem: Kullanıcı Yöneticisi: Ayarlar: LDAP Test' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:1294
+msgid "WebCfg - System: Firmware: Manual Update page (progress bar)"
+msgstr ""
+"WebCfg - Sistem: Üretici yazılımı: Elle Güncelleme sayfası (ilerleme durumu)"
+
+#: etc/inc/priv.defs.inc:1295
+msgid ""
+"Allow access to the 'System: Firmware: Manual Update: Progress bar' page."
+msgstr ""
+"'Sistem: Üretici yazılımı: Elle Güncelleme sayfası (ilerleme durumu)'nu "
+"erişime açar."
+
+#: etc/inc/priv.defs.inc:1300
+msgid "WebCfg - Hidden: Upload Configuration page"
+msgstr "WebCfg - Gizli: Yapılandırma Yükle sayfası"
+
+#: etc/inc/priv.defs.inc:1301
+msgid "Allow access to the 'Hidden: Upload Configuration' page."
+msgstr "'Gizli: Yapılandırma Yükle' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:1306
+msgid "WebCfg - VPN: IPsec page"
+msgstr "WebCfg - VPN: IPsec sayfası"
+
+#: etc/inc/priv.defs.inc:1307
+msgid "Allow access to the 'VPN: IPsec' page."
+msgstr "'VPN: IPsec' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1312
+msgid "WebCfg - VPN: IPsec: Pre-Shared Keys List"
+msgstr "WebCfg - VPN: IPsec: Ön Paylaşımlı Anahtarlar Listesi"
+
+#: etc/inc/priv.defs.inc:1313
+msgid "Allow access to the 'VPN: IPsec: Pre-Shared Keys List' page."
+msgstr ""
+"'VPN: IPsec: Ön Paylaşımlı Anahtarlar Listesi' sayfasına erişim yetkisi "
+"verir."
+
+#: etc/inc/priv.defs.inc:1318
+msgid "WebCfg - VPN: IPsec: Edit Pre-Shared Keys"
+msgstr "WebCfg - VPN: IPsec: Ön paylaşımlı Anahtarları Düzenle"
+
+#: etc/inc/priv.defs.inc:1319
+msgid "Allow access to the 'VPN: IPsec: Edit Pre-Shared Keys' page."
+msgstr "'VPN: IPsec: Ön Paylaşımlı Anahtarı Düzenle' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1324
+msgid "WebCfg - VPN: IPsec: Mobile page"
+msgstr "WebCfg - VPN: IPsec: Mobil istemciler sayfası"
+
+#: etc/inc/priv.defs.inc:1325
+msgid "Allow access to the 'VPN: IPsec: Mobile' page."
+msgstr "'VPN: IPsec: Mobil istemciler' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1330
+msgid "WebCfg - VPN: IPsec: Edit Phase 1 page"
+msgstr "WebCfg - VPN: IPsec: Aşama 1 düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:1331
+msgid "Allow access to the 'VPN: IPsec: Edit Phase 1' page."
+msgstr "'VPN: IPsec: Aşama 1 Düzenle' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1336
+msgid "WebCfg - VPN: IPsec: Edit Phase 2 page"
+msgstr "WebCfg - VPN: IPsec: Aşama 2 düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:1337
+msgid "Allow access to the 'VPN: IPsec: Edit Phase 2' page."
+msgstr "'VPN: IPsec: Aşama 2 Düzenle' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1342
+msgid "WebCfg - VPN: VPN L2TP page"
+msgstr "WebCfg - VPN: VPN L2TP sayfası"
+
+#: etc/inc/priv.defs.inc:1343
+msgid "Allow access to the 'VPN: VPN L2TP' page."
+msgstr "'VPN: VPN L2TP' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:1348
+msgid "WebCfg - VPN: VPN L2TP : Users page"
+msgstr "WebCfg - VPN: VPN L2TP: Kullanıcılar sayfası"
+
+#: etc/inc/priv.defs.inc:1349
+msgid "Allow access to the 'VPN: VPN L2TP : Users' page."
+msgstr "'VPN: VPN L2TP: Kullanıcılar' sayfasını erişime açar."
+
+#: etc/inc/priv.defs.inc:1354
+msgid "WebCfg - VPN: VPN L2TP : Users : Edit page"
+msgstr "WebCfg - VPN: VPN L2TP: Kullanıcılar: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:1355
+msgid "Allow access to the 'VPN: VPN L2TP : Users : Edit' page."
+msgstr "'VPN: VPN L2TP: Kullanıcılar: Düzenle' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1360
+msgid "WebCfg - OpenVPN: Client page"
+msgstr "WebCfg - OpenVPN: İstemci sayfası"
+
+#: etc/inc/priv.defs.inc:1361
+msgid "Allow access to the 'OpenVPN: Client' page."
+msgstr "'OpenVPN: İstemci' sayfasına erişim olanağı verir."
+
+#: etc/inc/priv.defs.inc:1366
+msgid "WebCfg - OpenVPN: Client Specific Override page"
+msgstr "WebCfg - OpenVPN: İstemciye Özel Ayarlar sayfası"
+
+#: etc/inc/priv.defs.inc:1367
+msgid "Allow access to the 'OpenVPN: Client Specific Override' page."
+msgstr "'OpenVPN: İstemciye Özel Ayarlar' sayfasına erişim yetkisini açar."
+
+#: etc/inc/priv.defs.inc:1372
+msgid "WebCfg - OpenVPN: Server page"
+msgstr "WebCfg - OpenVPN: Sunucu sayfası"
+
+#: etc/inc/priv.defs.inc:1373
+msgid "Allow access to the 'OpenVPN: Server' page."
+msgstr "'OpenVPN: Sunucu' sayfasına erişim izni verir."
+
+#: etc/inc/priv.defs.inc:1378
+msgid "WebCfg - Services: PPPoE Server page"
+msgstr "WebCfg - Servisler: PPPoE Sunucu sayfası"
+
+#: etc/inc/priv.defs.inc:1379
+msgid "Allow access to the 'Services: PPPoE Server' page."
+msgstr "'Servisler: PPPoE Sunucu' sayfasına erişim yetkisi verir."
+
+#: etc/inc/priv.defs.inc:1384
+msgid "WebCfg - Services: PPPoE Server: Edit page"
+msgstr "WebCfg - Servisler: PPPoE Sunucu: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:1385
+msgid "Allow access to the 'Services: PPPoE Server: Edit' page."
+msgstr "'Servisler: PPPoE Sunucu: Düzenle' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1390
+msgid "WebCfg - VPN: VPN PPTP page"
+msgstr "WebCfg - VPN: VPN PPTP sayfası"
+
+#: etc/inc/priv.defs.inc:1391
+msgid "Allow access to the 'VPN: VPN PPTP' page."
+msgstr "'VPN: VPN PPTP' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1396
+msgid "WebCfg - VPN: VPN PPTP: Users page"
+msgstr "WebCfg - VPN: VPN PPTP: Kullanıcılar sayfası"
+
+#: etc/inc/priv.defs.inc:1397
+msgid "Allow access to the 'VPN: VPN PPTP: Users' page."
+msgstr "'VPN: VPN PPTP: Kullanıcılar' sayfasına erişme olanağı verir."
+
+#: etc/inc/priv.defs.inc:1402
+msgid "WebCfg - VPN: VPN PPTP: User: Edit page"
+msgstr "WebCfg - VPN: VPN PPTP: Kullanıcı: Düzenle sayfası"
+
+#: etc/inc/priv.defs.inc:1403
+msgid "Allow access to the 'VPN: VPN PPTP: User: Edit' page."
+msgstr "'VPN: VPN PPTP: Kullanıcı: Düzenle' sayfasına erişme olanağı verir."
+
+#: etc/inc/priv.defs.inc:1408
+msgid "WebCfg - pfSense wizard subsystem page"
+msgstr "WebCfg - pfSense sihirbaz altsistemi sayfası"
+
+#: etc/inc/priv.defs.inc:1409
+msgid "Allow access to the 'pfSense wizard subsystem' page."
+msgstr "'pfSense sihirbaz altsistemi' sayfasına erişime izin verir."
+
+#: etc/inc/priv.defs.inc:1414
+msgid "WebCfg - XMLRPC Library page"
+msgstr "WebCfg - XMLRPC Kütüphane sayfası"
+
+#: etc/inc/priv.defs.inc:1415
+msgid "Allow access to the 'XMLRPC Library' page."
+msgstr "'XMLRPC Kütüphane' sayfasına erişimi açar."
+
+#: etc/inc/priv.defs.inc:1420
+msgid "WebCfg - Firewall: Easy Rule add/status page"
+msgstr ""
+
+#: etc/inc/priv.defs.inc:1421
+msgid "Allow access to the 'Firewall: Easy Rule' add/status page."
+msgstr ""
+
+#: etc/inc/radius.inc:406
+msgid "Error sending request:"
+msgstr "İstek gönderilmesinde hata:"
+
+#: etc/inc/radius.inc:412
+msgid "RADIUS_ACCESS_ACCEPT is unexpected for accounting"
+msgstr "RADIUS_ACCESS_ACCEPT hesap için beklenmeyen durum"
+
+#: etc/inc/radius.inc:421
+msgid "RADIUS_ACCOUNTING_RESPONSE is unexpected for authentication"
+msgstr "RADIUS_ACCOUNTING_RESPONSE beklenmeyen kimlik doğrulaması"
+
+#: etc/inc/radius.inc:426
+#, php-format
+msgid "Unexpected return value: %s"
+msgstr "Beklenmeyen değer dögüsü: %s"
+
+#: etc/inc/rrd.inc:44
+#, php-format
+msgid "RRD dump failed exited with %1$s, the error is: %2$s"
+msgstr "Hata: %2$s . RRD dökümü %1$s ile çıkıldı başarısız oldu"
+
+#: etc/inc/rrd.inc:102
+#, php-format
+msgid "RRD create failed exited with %1$s, the error is: %2$s"
+msgstr "RRD oluşturma %1$s ile sonlandı başarısız oldu, hata: %2$s"
+
+#: etc/inc/rrd.inc:117
+#, php-format
+msgid ""
+"Import RRD has %1$s DS values and %2$s RRA databases, new format RRD has "
+"%3$s DS values and %4$s RRA databases"
+msgstr ""
+"RRD yi içeri aktar %1$s DS değerleri ve %2$s RRA veritabanı, RRD nin yeni "
+"formatı %3$s DS değerleri ve %4$s RRA veritabanı"
+
+#: etc/inc/rrd.inc:201
+#, php-format
+msgid "The new RRD now has %1$s DS values and %2$s RRA databases"
+msgstr "Yeni RRD şimdi %1$s DS değeri ve %2$s RRA veritabanı"
+
+#: etc/inc/rrd.inc:209
+msgid "Generating RRD graphs..."
+msgstr "RRD grafikleri oluşturuluyor..."
+
+# Loglar da sorun yaratiyor. Bu nedenle ş, ı, ğ karakterlerini s,i,g olarak kullanmakta fayda var..
+#: etc/inc/rrd.inc:912
+msgid "Creating rrd update script"
+msgstr "Rrd güncellestirme komut dosyasi olusturuluyor"
+
+#: etc/inc/service-utils.inc:239
+msgid "Router Advertisement Daemon"
+msgstr "Yönlendirici İlan Servisi"
+
+#: etc/inc/service-utils.inc:246 usr/local/www/diag_backup.php:184
+#: usr/local/www/fbegin.inc:139
+msgid "DNS Forwarder"
+msgstr "DNS Yönlendirici"
+
+#: etc/inc/service-utils.inc:253
+msgid "Unbound DNS Resolver"
+msgstr ""
+
+#: etc/inc/service-utils.inc:259
+msgid "NTP clock sync"
+msgstr "NTP saat senkronizasyonu"
+
+#: etc/inc/service-utils.inc:268 usr/local/www/diag_backup.php:182
+#: usr/local/www/fbegin.inc:138 usr/local/www/fbegin.inc:173
+#: usr/local/www/services_captiveportal_zones.php:64
+#: usr/local/www/status_rrd_graph_settings.php:59
+#: usr/local/www/status_rrd_graph_settings.php:162
+msgid "Captive Portal"
+msgstr "Hizmet Portalı"
+
+#: etc/inc/service-utils.inc:285 usr/local/www/fbegin.inc:141
+#: usr/local/www/services_dhcp_relay.php:102
+msgid "DHCP Relay"
+msgstr "DHCP Aracısı (Relay)"
+
+#: etc/inc/service-utils.inc:292 usr/local/www/fbegin.inc:142
+#: usr/local/www/services_dhcpv6_relay.php:103
+msgid "DHCPv6 Relay"
+msgstr "DHCPv6 Aktarma"
+
+#: etc/inc/service-utils.inc:299
+msgid "DHCP Service"
+msgstr "DHCP Servisi"
+
+#: etc/inc/service-utils.inc:307
+msgid "Gateway Monitoring Daemon"
+msgstr ""
+
+#: etc/inc/service-utils.inc:314
+msgid "SNMP Service"
+msgstr "SNMP Servisi"
+
+#: etc/inc/service-utils.inc:321 usr/local/www/fbegin.inc:148
+msgid "IGMP proxy"
+msgstr "IGMP vekil"
+
+#: etc/inc/service-utils.inc:328
+msgid "UPnP Service"
+msgstr "UPnP Servisi"
+
+#: etc/inc/service-utils.inc:335
+msgid "RIP Daemon"
+msgstr "RIP Servisi"
+
+#: etc/inc/service-utils.inc:342 usr/local/www/diag_logs_ipsec.php:61
+msgid "IPsec VPN"
+msgstr "IPsec VPN"
+
+#: etc/inc/service-utils.inc:349
+msgid "Secure Shell Daemon"
+msgstr ""
+
+#: etc/inc/service-utils.inc:362 etc/inc/system.inc:2091
+#: usr/local/www/diag_backup.php:191 usr/local/www/diag_logs.php:86
+#: usr/local/www/diag_logs_auth.php:77 usr/local/www/diag_logs_dhcp.php:80
+#: usr/local/www/diag_logs_filter.php:143
+#: usr/local/www/diag_logs_filter_dynamic.php:108
+#: usr/local/www/diag_logs_filter_summary.php:197
+#: usr/local/www/diag_logs_gateways.php:88
+#: usr/local/www/diag_logs_ipsec.php:81 usr/local/www/diag_logs_ntpd.php:75
+#: usr/local/www/diag_logs_openvpn.php:46
+#: usr/local/www/diag_logs_openvpn.php:79 usr/local/www/diag_logs_ppp.php:77
+#: usr/local/www/diag_logs_relayd.php:76
+#: usr/local/www/diag_logs_resolver.php:88
+#: usr/local/www/diag_logs_routing.php:75
+#: usr/local/www/diag_logs_settings.php:275
+#: usr/local/www/diag_logs_vpn.php:135 usr/local/www/diag_logs_wireless.php:77
+#: usr/local/www/diag_packet_capture.php:110 usr/local/www/fbegin.inc:165
+#: usr/local/www/fbegin.inc:184 usr/local/www/license.php:143
+#: usr/local/www/status_graph.php:69 usr/local/www/status_openvpn.php:46
+#: usr/local/www/vpn_openvpn_client.php:41
+#: usr/local/www/vpn_openvpn_csc.php:41
+#: usr/local/www/vpn_openvpn_server.php:479
+msgid "OpenVPN"
+msgstr "OpenVPN"
+
+#: etc/inc/service-utils.inc:372
+msgid "Server load balancing daemon"
+msgstr "Sunucu yük dengeleyici servisi"
+
+#: etc/inc/service-utils.inc:416
+msgid "Not available."
+msgstr "Kullanılamaz."
+
+#: etc/inc/service-utils.inc:449
+msgid "Running"
+msgstr "Çalışıyor"
+
+#: etc/inc/service-utils.inc:450 etc/inc/service-utils.inc:458
+#, php-format
+msgid "%s Service is"
+msgstr "%s Servisi"
+
+#: etc/inc/service-utils.inc:457
+msgid "Stopped"
+msgstr "Durdu"
+
+#: etc/inc/service-utils.inc:457 usr/local/www/firewall_nat_1to1_edit.php:287
+#: usr/local/www/firewall_nat_edit.php:479
+#: usr/local/www/firewall_nat_npt_edit.php:165
+#: usr/local/www/firewall_nat_out_edit.php:453
+#: usr/local/www/firewall_rules_edit.php:856 usr/local/www/interfaces.php:2732
+#: usr/local/www/interfaces_ppps_edit.php:616
+#: usr/local/www/system_gateways_edit.php:647
+#: usr/local/www/system_routes_edit.php:315
+#: usr/local/www/system_usermanager.php:527
+#: usr/local/www/system_usermanager.php:906
+#: usr/local/www/vpn_ipsec_phase1.php:569
+#: usr/local/www/vpn_ipsec_phase2.php:552
+#: usr/local/www/vpn_openvpn_client.php:465
+#: usr/local/www/vpn_openvpn_client.php:1115
+#: usr/local/www/vpn_openvpn_csc.php:336 usr/local/www/vpn_openvpn_csc.php:746
+#: usr/local/www/vpn_openvpn_server.php:763
+#: usr/local/www/vpn_openvpn_server.php:1831
+msgid "Disabled"
+msgstr "Devredışı"
+
+#: etc/inc/service-utils.inc:482
+#, php-format
+msgid "Restart %sService"
+msgstr "%s Servisini Yeniden Başlat"
+
+#: etc/inc/service-utils.inc:493
+#, php-format
+msgid "Stop %sService"
+msgstr "%s Servisini Durdur"
+
+#: etc/inc/service-utils.inc:509
+#, php-format
+msgid "Start %sService"
+msgstr "%s Servisini Başlat"
+
+#: etc/inc/service-utils.inc:577
+#, php-format
+msgid "%s has been started."
+msgstr "%s başlatıldı."
+
+#: etc/inc/service-utils.inc:647
+#, php-format
+msgid "%s has been stopped."
+msgstr "%s durduruldu."
+
+#: etc/inc/service-utils.inc:716
+#, php-format
+msgid "%s has been restarted."
+msgstr "%s tekrar başlatıldı."
+
+#: etc/inc/services.inc:378
+#, php-format
+msgid "DHCP leases restore failed exited with %1$s, the error is: %2$s%3$s"
+msgstr "DHCP kiraları geri yükleme başarısız %1$s, hata : %2$s%3$s"
+
+#: etc/inc/services.inc:404
+msgid "Starting DHCP service..."
+msgstr "DHCP servisi başlatılıyor..."
+
+#: etc/inc/services.inc:487
+msgid "Warning! DHCP Failover setup and no CARP virtual IPs defined!"
+msgstr ""
+
+#: etc/inc/services.inc:896
+#, php-format
+msgid "Error: cannot open dhcpd.conf in services_dhcpdv4_configure().%s"
+msgstr ""
+"Hata: services_dhcpdv4_configure().%s içerisindeki dhcpd.conf açılamıyor"
+
+#: etc/inc/services.inc:1377
+msgid "Could not write Igmpproxy configuration file!"
+msgstr "Igmpproxy yapılandırma dosyasına yazılamıyor!"
+
+#: etc/inc/services.inc:1386
+msgid "Started IGMP proxy service."
+msgstr "IGMP vekil servisi başlatıldı."
+
+#: etc/inc/services.inc:1410
+msgid "Starting DHCP relay service..."
+msgstr "DHCP relay servisi başlatılıyor..."
+
+#: etc/inc/services.inc:1532
+msgid "Starting DHCPv6 relay service..."
+msgstr "DHCPv6 relay servisi başlatılıyor..."
+
+#: etc/inc/services.inc:1673
+msgid "Starting DynDNS clients..."
+msgstr "DynDNS istemcisi başlatılıyor..."
+
+#: etc/inc/services.inc:1742
+msgid "Starting DNS forwarder..."
+msgstr "DNS yönlendiricisi başlatılıyor..."
+
+#: etc/inc/services.inc:1896
+msgid "Starting DNS Resolver..."
+msgstr ""
+
+#: etc/inc/services.inc:1936
+msgid "Starting SNMP daemon... "
+msgstr "SNMP servisi başlatılıyor..."
+
+#: etc/inc/services.inc:1941
+#, php-format
+msgid "Error: cannot open snmpd.conf in services_snmpd_configure().%s"
+msgstr "Hata: %s services_snmpd_configure() içinde snmpd.conf açılamıyor"
+
+# Çeviri yapılmamalı, cron oluşturmada sorun oluyor. A.Y.
+#: etc/inc/services.inc:2285
+msgid "pfSense specific crontab entries"
+msgstr "pfSense specific crontab entries"
+
+# Çeviri yapılmamalı. Cron oluştururken hatalara neden oluyor. A.Y.
+#: etc/inc/services.inc:2286
+msgid "Created:"
+msgstr "Created:"
+
+# eğer mümkünse gibi bişey ekelemek yanlış zaten burda dosyaya müdahele edilmesi istenmiyor ! çeviriyi direk kelime bazlı işlemeyelim !!!!!!!!!
+#
+# Bu tarz dosyalar da Türkçe karakter kullanmak da tehlikeli! A.Y.
+#
+# Cron oluştururken sorunlara neden oluyor. Lütfen çevirmeyin. A.Y.
+#: etc/inc/services.inc:2307
+msgid "If possible do not add items to this file manually."
+msgstr "If possible do not add items to this file manually."
+
+# Çeviri yapılmamalıdır, cron oluştururken sorunlara neden oluyor.
+#: etc/inc/services.inc:2308
+msgid ""
+"If you do so, this file must be terminated with a blank line (e.g. new line)"
+msgstr ""
+"If you do so, this file must be terminated with a blank line (e.g. new line)"
+
+#: etc/inc/services.inc:2352
+msgid "Starting UPnP service... "
+msgstr "UPnP servisi başlatılıyor..."
+
+#: etc/inc/services.inc:2389
+#, php-format
+msgid "Installed cron job for %s"
+msgstr "%s için zamanlandırılmış görev kuruldu"
+
+#: etc/inc/services.inc:2392
+#, php-format
+msgid "Updated cron job for %s"
+msgstr "%s için zamanlandırılmış görev güncellendi"
+
+#: etc/inc/services.inc:2397
+#, php-format
+msgid "Removed cron job for %s"
+msgstr "%s zamanlanmış görevlerden kaldırıldı"
+
+#: etc/inc/shaper.inc:190
+#, php-format
+msgid "The field '%s' contains invalid characters."
+msgstr "'%s' alanı geçersiz karakterler içeriyor."
+
+#: etc/inc/shaper.inc:196
+#, php-format
+msgid "The field '%s' is required."
+msgstr "'%s' alanı gerekli."
+
+#: etc/inc/shaper.inc:321 etc/inc/shaper.inc:680 etc/inc/shaper.inc:1599
+#: etc/inc/shaper.inc:1914 etc/inc/shaper.inc:2259 etc/inc/shaper.inc:2399
+#: etc/inc/shaper.inc:2542 etc/inc/shaper.inc:2673 etc/inc/shaper.inc:2889
+#: etc/inc/shaper.inc:3323 usr/local/www/interfaces_ppps_edit.php:762
+#: usr/local/www/status_queues.php:175
+msgid "Bandwidth"
+msgstr "Bantgenişliği"
+
+#: etc/inc/shaper.inc:323 etc/inc/shaper.inc:1601 etc/inc/shaper.inc:2261
+#: etc/inc/shaper.inc:2544 etc/inc/shaper.inc:2893
+msgid "Bandwidthtype"
+msgstr "Bant genişliği türü"
+
+#: etc/inc/shaper.inc:328 etc/inc/shaper.inc:1607 etc/inc/shaper.inc:2266
+#: etc/inc/shaper.inc:2549
+msgid "Bandwidth must be an integer."
+msgstr "Bant genişliği tam sayı olmalıdır."
+
+#: etc/inc/shaper.inc:330 etc/inc/shaper.inc:1610 etc/inc/shaper.inc:2270
+#: etc/inc/shaper.inc:2553
+msgid "Bandwidth cannot be negative."
+msgstr "Bant genişliği negatif olamaz."
+
+#: etc/inc/shaper.inc:332
+msgid "Qlimit must be an integer."
+msgstr "Qlimit tam sayı olmalıdır."
+
+#: etc/inc/shaper.inc:334
+msgid "Qlimit must be positive."
+msgstr ""
+
+#: etc/inc/shaper.inc:336
+msgid "Tbrsize must be an integer."
+msgstr "Tbrsize tam sayı olmalıdır."
+
+#: etc/inc/shaper.inc:338
+msgid "Tbrsize must be positive."
+msgstr ""
+
+#: etc/inc/shaper.inc:639 etc/inc/shaper.inc:1167 etc/inc/shaper.inc:3632
+#: etc/inc/shaper.inc:3879
+msgid "Enable/Disable"
+msgstr "Aktif/Pasif"
+
+#: etc/inc/shaper.inc:644
+msgid "Enable/disable discipline and its children"
+msgstr "Kuyruk Disiplini ve alt öğeleri Aktif/Pasif"
+
+#: etc/inc/shaper.inc:646 etc/inc/shaper.inc:1004 etc/inc/shaper.inc:2895
+#: etc/inc/shaper.inc:3312 etc/inc/shaper.inc:3639 etc/inc/shaper.inc:3887
+#: etc/inc/shaper.inc:3959 usr/local/www/diag_gmirror.php:220
+#: usr/local/www/diag_gmirror.php:287 usr/local/www/firewall_aliases.php:191
+#: usr/local/www/firewall_aliases_edit.php:131
+#: usr/local/www/firewall_aliases_edit.php:746
+#: usr/local/www/firewall_aliases_import.php:68
+#: usr/local/www/firewall_schedule.php:97
+#: usr/local/www/interfaces_groups.php:96
+#: usr/local/www/load_balancer_monitor.php:122
+#: usr/local/www/load_balancer_monitor_edit.php:91
+#: usr/local/www/load_balancer_monitor_edit.php:237
+#: usr/local/www/load_balancer_pool.php:131
+#: usr/local/www/load_balancer_pool_edit.php:81
+#: usr/local/www/load_balancer_pool_edit.php:201
+#: usr/local/www/load_balancer_relay_action.php:139
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:412
+#: usr/local/www/load_balancer_relay_protocol.php:133
+#: usr/local/www/load_balancer_relay_protocol_edit.php:82
+#: usr/local/www/load_balancer_relay_protocol_edit.php:196
+#: usr/local/www/load_balancer_virtual_server.php:132
+#: usr/local/www/load_balancer_virtual_server_edit.php:76
+#: usr/local/www/load_balancer_virtual_server_edit.php:81
+#: usr/local/www/load_balancer_virtual_server_edit.php:166
+#: usr/local/www/pkg_mgr.php:193 usr/local/www/pkg_mgr_installed.php:123
+#: usr/local/www/services_captiveportal_filemanager.php:160
+#: usr/local/www/services_igmpproxy.php:96
+#: usr/local/www/status_gateways.php:74 usr/local/www/status_lb_pool.php:131
+#: usr/local/www/status_lb_vs.php:78 usr/local/www/status_openvpn.php:276
+#: usr/local/www/status_openvpn.php:339 usr/local/www/system_camanager.php:593
+#: usr/local/www/system_certmanager.php:1083
+#: usr/local/www/system_crlmanager.php:541
+#: usr/local/www/system_gateways.php:217
+#: usr/local/www/system_gateways_edit.php:114
+#: usr/local/www/system_gateways_edit.php:689
+#: usr/local/www/system_groupmanager.php:410
+#: usr/local/www/system_usermanager.php:644
+#: usr/local/www/system_usermanager.php:704
+#: usr/local/www/widgets/widgets/system_information.widget.php:118
+msgid "Name"
+msgstr "Ad"
+
+#: etc/inc/shaper.inc:650
+msgid "Scheduler Type "
+msgstr "Zamanlandırma Tipi "
+
+#: etc/inc/shaper.inc:676
+msgid "NOTE: Changing this changes all child queues!"
+msgstr "Uyarı: Bunu değiştirmen bütün alt kuyrukları değiştirir!"
+
+#: etc/inc/shaper.inc:677
+msgid " Beware you can lose information."
+msgstr " Dikkatli olun, bilgilendirmeleri kaybedebilirsiniz."
+
+#: etc/inc/shaper.inc:715
+msgid ""
+"Adjusts the size, in bytes, of the token bucket regulator. If not specified, "
+"heuristics based on the interface bandwidth are used to determine the size."
+msgstr ""
+"Regülatör algoritması bayt cinsinden boyutu ayarlar. Özellikle belirtilen "
+"bir şey yok ise arayüz bant genişliğine bağlı olarak sezgisel tarama "
+"boyutunu belirlemek için kullanır."
+
+#: etc/inc/shaper.inc:1013
+msgid "The priority must be an integer between 1 and 15."
+msgstr "Öncelik 1-15 arasında tam bir değer olmalı."
+
+#: etc/inc/shaper.inc:1016 etc/inc/shaper.inc:2906
+msgid "Queue limit must be an integer"
+msgstr "Kuyruk limiti tamsayı olmalıdır"
+
+#: etc/inc/shaper.inc:1018
+msgid "Queue limit must be positive"
+msgstr "Kuyruk limiti pozitif olmalı"
+
+#: etc/inc/shaper.inc:1020 etc/inc/shaper.inc:1022 etc/inc/shaper.inc:2908
+#: etc/inc/shaper.inc:2910 etc/inc/shaper.inc:3964
+msgid "Queue names must be alphanumeric and _ or - only."
+msgstr "Kuyruk adı harf,rakam, _ ve - karakterlerinden oluşmalıdır."
+
+#: etc/inc/shaper.inc:1025
+msgid "Only one default queue per interface is allowed."
+msgstr "Arabirim başına varsayılan olarak sadece bir kuyruğa izin verilir."
+
+#: etc/inc/shaper.inc:1172
+msgid "Enable/Disable queue and its children"
+msgstr "Kuyruk ve altkuyrukları Aktif/Pasif"
+
+#: etc/inc/shaper.inc:1176
+msgid "Queue Name"
+msgstr "Kuyruk adı"
+
+#: etc/inc/shaper.inc:1183
+msgid ""
+"Enter the name of the queue here. Do not use spaces and limit the size to "
+"15 characters."
+msgstr ""
+"Kuyruk adını buraya girin. Alan adı 15 karakter ile sınırlıdır ve alan "
+"adında boşluk kullanmayın."
+
+#: etc/inc/shaper.inc:1186 usr/local/www/interfaces_bridge_edit.php:373
+#: usr/local/www/interfaces_bridge_edit.php:392
+#: usr/local/www/system_gateway_groups.php:133
+msgid "Priority"
+msgstr "Öncelik"
+
+#: etc/inc/shaper.inc:1190
+msgid ""
+"For hfsc, the range is 0 to 7. The default is 1. Hfsc queues with a higher "
+"priority are preferred in the case of overload."
+msgstr ""
+"hfsc için değer 0 ile 7 arasındadır. Varsayılan değer 1'dir. Hfsc "
+"kuyruğunda daha yüksek bir öncelik istenmesi durumunda bu değer "
+"yükseltilebilir."
+
+#: etc/inc/shaper.inc:1193
+msgid "Queue limit"
+msgstr "Kuyruk limiti"
+
+#: etc/inc/shaper.inc:1197
+msgid "Queue limit in packets."
+msgstr ""
+
+#: etc/inc/shaper.inc:1200
+msgid "Scheduler options"
+msgstr "Zamanlayıcı seçenekleri"
+
+#: etc/inc/shaper.inc:1205 etc/inc/shaper.inc:1208
+msgid "Default queue"
+msgstr "Öntanımlı kuyruk"
+
+#: etc/inc/shaper.inc:1215
+msgid "Random Early Detection"
+msgstr "Rasgele Erken Algılanan"
+
+#: etc/inc/shaper.inc:1220
+msgid "Random Early Detection In and Out"
+msgstr "Rasgele Erken Algılanan Giriş ve Çıkış"
+
+#: etc/inc/shaper.inc:1225
+msgid "Explicit Congestion Notification"
+msgstr "Dönüş tıkanıklığının bildirilmesi"
+
+#: etc/inc/shaper.inc:1230
+msgid "Codel Active Queue"
+msgstr "Kodsal Aktif Kuyruk"
+
+#: etc/inc/shaper.inc:1231
+msgid "Select options for this queue"
+msgstr "Bu kuyruk için seçeneği işaretleyin"
+
+#: etc/inc/shaper.inc:1233 etc/inc/shaper.inc:3413 etc/inc/shaper.inc:3694
+#: etc/inc/shaper.inc:3892 usr/local/www/diag_ipsec.php:107
+#: usr/local/www/firewall_aliases.php:193
+#: usr/local/www/firewall_aliases_edit.php:583
+#: usr/local/www/firewall_aliases_edit.php:761
+#: usr/local/www/firewall_aliases_edit.php:798
+#: usr/local/www/firewall_aliases_import.php:185
+#: usr/local/www/firewall_nat.php:212 usr/local/www/firewall_nat_1to1.php:186
+#: usr/local/www/firewall_nat_1to1_edit.php:508
+#: usr/local/www/firewall_nat_edit.php:789
+#: usr/local/www/firewall_nat_npt.php:110
+#: usr/local/www/firewall_nat_npt_edit.php:269
+#: usr/local/www/firewall_nat_out.php:313
+#: usr/local/www/firewall_nat_out.php:550
+#: usr/local/www/firewall_nat_out_edit.php:781
+#: usr/local/www/firewall_rules.php:350
+#: usr/local/www/firewall_rules_edit.php:1249
+#: usr/local/www/firewall_schedule.php:99
+#: usr/local/www/firewall_schedule_edit.php:805
+#: usr/local/www/firewall_schedule_edit.php:1010
+#: usr/local/www/firewall_virtual_ip.php:242
+#: usr/local/www/firewall_virtual_ip_edit.php:501
+#: usr/local/www/interfaces.php:1655 usr/local/www/interfaces_bridge.php:120
+#: usr/local/www/interfaces_bridge_edit.php:292
+#: usr/local/www/interfaces_gif.php:114
+#: usr/local/www/interfaces_gif_edit.php:223
+#: usr/local/www/interfaces_gre.php:115
+#: usr/local/www/interfaces_gre_edit.php:226
+#: usr/local/www/interfaces_groups.php:98
+#: usr/local/www/interfaces_groups_edit.php:261
+#: usr/local/www/interfaces_lagg.php:120
+#: usr/local/www/interfaces_lagg_edit.php:225
+#: usr/local/www/interfaces_ppps.php:112
+#: usr/local/www/interfaces_ppps_edit.php:482
+#: usr/local/www/interfaces_qinq.php:124
+#: usr/local/www/interfaces_qinq_edit.php:343
+#: usr/local/www/interfaces_vlan.php:117
+#: usr/local/www/interfaces_vlan_edit.php:193
+#: usr/local/www/interfaces_wireless.php:112
+#: usr/local/www/interfaces_wireless_edit.php:191
+#: usr/local/www/load_balancer_monitor.php:124
+#: usr/local/www/load_balancer_monitor_edit.php:91
+#: usr/local/www/load_balancer_monitor_edit.php:243
+#: usr/local/www/load_balancer_pool.php:136
+#: usr/local/www/load_balancer_pool_edit.php:216
+#: usr/local/www/load_balancer_relay_action.php:142
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:418
+#: usr/local/www/load_balancer_relay_protocol.php:136
+#: usr/local/www/load_balancer_relay_protocol_edit.php:82
+#: usr/local/www/load_balancer_relay_protocol_edit.php:219
+#: usr/local/www/load_balancer_virtual_server.php:138
+#: usr/local/www/load_balancer_virtual_server_edit.php:172
+#: usr/local/www/pkg_mgr.php:199 usr/local/www/pkg_mgr_installed.php:126
+#: usr/local/www/services_captiveportal_hostname.php:127
+#: usr/local/www/services_captiveportal_hostname_edit.php:186
+#: usr/local/www/services_captiveportal_ip.php:120
+#: usr/local/www/services_captiveportal_ip_edit.php:203
+#: usr/local/www/services_captiveportal_mac.php:171
+#: usr/local/www/services_captiveportal_mac_edit.php:218
+#: usr/local/www/services_captiveportal_zones.php:83
+#: usr/local/www/services_captiveportal_zones_edit.php:106
+#: usr/local/www/services_dhcp.php:876 usr/local/www/services_dhcp.php:1250
+#: usr/local/www/services_dhcp_edit.php:424
+#: usr/local/www/services_dhcpv6.php:861
+#: usr/local/www/services_dhcpv6_edit.php:240
+#: usr/local/www/services_dnsmasq.php:355
+#: usr/local/www/services_dnsmasq.php:442
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:155
+#: usr/local/www/services_dnsmasq_edit.php:237
+#: usr/local/www/services_dnsmasq_edit.php:258
+#: usr/local/www/services_dyndns.php:90
+#: usr/local/www/services_dyndns_edit.php:416
+#: usr/local/www/services_igmpproxy.php:99
+#: usr/local/www/services_igmpproxy_edit.php:180
+#: usr/local/www/services_rfc2136.php:84
+#: usr/local/www/services_rfc2136_edit.php:206
+#: usr/local/www/services_unbound.php:423
+#: usr/local/www/services_unbound.php:510
+#: usr/local/www/services_unbound_acls.php:242
+#: usr/local/www/services_unbound_acls.php:296
+#: usr/local/www/services_unbound_acls.php:323
+#: usr/local/www/services_unbound_domainoverride_edit.php:148
+#: usr/local/www/services_unbound_host_edit.php:240
+#: usr/local/www/services_unbound_host_edit.php:261
+#: usr/local/www/services_wol.php:164 usr/local/www/services_wol_edit.php:152
+#: usr/local/www/status_gateway_groups.php:78
+#: usr/local/www/status_gateways.php:80 usr/local/www/status_lb_pool.php:135
+#: usr/local/www/status_lb_vs.php:82 usr/local/www/status_services.php:85
+#: usr/local/www/status_upnp.php:91
+#: usr/local/www/system_advanced_sysctl.php:182
+#: usr/local/www/system_advanced_sysctl.php:255
+#: usr/local/www/system_gateway_groups.php:134
+#: usr/local/www/system_gateway_groups_edit.php:339
+#: usr/local/www/system_gateways.php:221
+#: usr/local/www/system_gateways_edit.php:852
+#: usr/local/www/system_groupmanager.php:327
+#: usr/local/www/system_groupmanager.php:411
+#: usr/local/www/system_groupmanager.php:482
+#: usr/local/www/system_groupmanager_addprivs.php:218
+#: usr/local/www/system_routes.php:237
+#: usr/local/www/system_routes_edit.php:323
+#: usr/local/www/system_usermanager.php:645
+#: usr/local/www/system_usermanager_addprivs.php:187
+#: usr/local/www/vpn_ipsec_phase1.php:660
+#: usr/local/www/vpn_ipsec_phase2.php:691
+#: usr/local/www/vpn_openvpn_client.php:663
+#: usr/local/www/vpn_openvpn_client.php:1118
+#: usr/local/www/vpn_openvpn_csc.php:364 usr/local/www/vpn_openvpn_csc.php:748
+#: usr/local/www/vpn_openvpn_server.php:892
+#: usr/local/www/vpn_openvpn_server.php:1834 usr/local/www/vpn_pppoe.php:107
+#: usr/local/www/vpn_pppoe_edit.php:456
+msgid "Description"
+msgstr "Açıklama"
+
+#: etc/inc/shaper.inc:1260
+msgid "Bandwidth:"
+msgstr "Bant Genişliği:"
+
+#: etc/inc/shaper.inc:1264
+msgid "Priority: on"
+msgstr "Öncelik: Açık"
+
+#: etc/inc/shaper.inc:1267
+msgid "Default: on"
+msgstr "Varsayılan: Açık"
+
+#: etc/inc/shaper.inc:1274 etc/inc/shaper.inc:1275
+msgid "Delete queue from interface"
+msgstr "Arabirimden kuyruğu silin"
+
+#: etc/inc/shaper.inc:1614 etc/inc/shaper.inc:2274 etc/inc/shaper.inc:2558
+msgid "Bandwidth in percentage should be between 1 and 100 bounds."
+msgstr "Bantgenişliği yüzdesi 1 ile 100 arasında olmalıdır."
+
+#: etc/inc/shaper.inc:1631
+msgid "upperlimit service curve defined but missing (d) value"
+msgstr "Üstlimit servis eğrisi tanımlı ama (d) değeri eksik"
+
+#: etc/inc/shaper.inc:1633
+msgid ""
+"upperlimit service curve defined but missing initial bandwidth (m1) value"
+msgstr ""
+"Üstlimit servis eğrisi tanımlı ama başlangıç bant genişliği (m1) değeri eksik"
+
+#: etc/inc/shaper.inc:1635
+msgid "upperlimit m1 value needs to be Kb, Mb, Gb, or %"
+msgstr "Üstlimit m1 değeri Kb, Mb, Gb, veya % olmalı"
+
+#: etc/inc/shaper.inc:1637
+msgid "upperlimit d value needs to be numeric"
+msgstr "Üstlimit d değeri rakam olmalı"
+
+#: etc/inc/shaper.inc:1639
+msgid "upperlimit m2 value needs to be Kb, Mb, Gb, or %"
+msgstr "Üstlimit m2 değeri Kb, Mb, Gb, veya % olmalı"
+
+#: etc/inc/shaper.inc:1653
+msgid "linkshare service curve defined but missing (d) value"
+msgstr "Bağlantı paylaşımı servis eğrisi tanımlı ama (d) değeri eksik"
+
+#: etc/inc/shaper.inc:1655
+msgid ""
+"linkshare service curve defined but missing initial bandwidth (m1) value"
+msgstr ""
+"Bağlantı paylaşımı servis eğrisi tanımlı ama başlangıç bant genişliği (m1) "
+"değeri eksik"
+
+#: etc/inc/shaper.inc:1657
+msgid "linkshare m1 value needs to be Kb, Mb, Gb, or %"
+msgstr "Bağlantı paylaşımı m1 değeri Kb, Mb, Gb, veya % olmalı"
+
+#: etc/inc/shaper.inc:1659
+msgid "linkshare d value needs to be numeric"
+msgstr "Bağlantı paylaşımı d değeri numara olmalı"
+
+#: etc/inc/shaper.inc:1661
+msgid "linkshare m2 value needs to be Kb, Mb, Gb, or %"
+msgstr "Bağlantı paylaşımı m2 değeri Kb, Mb, Gb, veya % olmalı"
+
+#: etc/inc/shaper.inc:1663
+msgid "realtime service curve defined but missing (d) value"
+msgstr "Gerçek zamanlı servis eğrisi tanımlı ama (d) değeri eksik"
+
+#: etc/inc/shaper.inc:1665
+msgid "realtime service curve defined but missing initial bandwidth (m1) value"
+msgstr ""
+"Gerçek zamanlı servis eğrisi tanımlı ama başlangıç bant genişliği (m1) "
+"değeri eksik"
+
+#: etc/inc/shaper.inc:1680
+msgid "realtime m1 value needs to be Kb, Mb, Gb, or %"
+msgstr "Gerçek zaman m1 değeri Kb, Mb, Gb, veya % olmalı"
+
+#: etc/inc/shaper.inc:1682
+msgid "realtime d value needs to be numeric"
+msgstr "Gerçek zaman d değeri rakam olmalı"
+
+#: etc/inc/shaper.inc:1684
+msgid "realtime m2 value needs to be Kb, Mb, Gb, or %"
+msgstr "Gerçek zaman m2 değeri Kb, Mb, Gb, veya % olmalı"
+
+#: etc/inc/shaper.inc:1922 etc/inc/shaper.inc:2408 etc/inc/shaper.inc:2682
+msgid "Gbit/s"
+msgstr "Gbit/sn"
+
+#: etc/inc/shaper.inc:1926 etc/inc/shaper.inc:2412 etc/inc/shaper.inc:2686
+msgid "Mbit/s"
+msgstr "Mbit/sn"
+
+#: etc/inc/shaper.inc:1930 etc/inc/shaper.inc:2416 etc/inc/shaper.inc:2690
+#: usr/local/www/services_captiveportal.php:652
+#: usr/local/www/services_captiveportal.php:656
+msgid "Kbit/s"
+msgstr "Kbit/sn"
+
+#: etc/inc/shaper.inc:1934 etc/inc/shaper.inc:2420 etc/inc/shaper.inc:2694
+msgid "Bit/s"
+msgstr "Bit/sn"
+
+#: etc/inc/shaper.inc:1940 etc/inc/shaper.inc:2426 etc/inc/shaper.inc:2700
+msgid "Choose the amount of bandwidth for this queue"
+msgstr "Bu kuyruğa bant genişliği için miktar seçiniz"
+
+#: etc/inc/shaper.inc:1943
+msgid "Service Curve (sc)"
+msgstr "Hizmet eğrisi (he)"
+
+#: etc/inc/shaper.inc:1950
+msgid "Upperlimit:"
+msgstr "Üstlimit:"
+
+#: etc/inc/shaper.inc:1965
+msgid "The maximum allowed bandwidth for the queue."
+msgstr "Kuyruk için en fazla bant genişliğine izin verildi."
+
+#: etc/inc/shaper.inc:1969
+msgid "Real time:"
+msgstr "Gerçek zaman:"
+
+#: etc/inc/shaper.inc:1984
+msgid "The minimum required bandwidth for the queue."
+msgstr "Kuyruk için en az bant genişliği gerekiyor."
+
+#: etc/inc/shaper.inc:1988
+msgid "Link share:"
+msgstr "Bağlantı paylaş:"
+
+#: etc/inc/shaper.inc:2003
+msgid "The bandwidth share of a backlogged queue - this overrides priority."
+msgstr ""
+"Arka giriş kuyruğundaki bantgenişliği paylaşımı - önceliği geçersiz kılar."
+
+#: etc/inc/shaper.inc:2005
+msgid ""
+"The format for service curve specifications is (m1, d, m2). m2 controls the "
+"bandwidth assigned to the queue. m1 and d are optional and can be used to "
+"control the initial bandwidth assignment. For the first d milliseconds the "
+"queue gets the bandwidth given as m1, afterwards the value given in m2."
+msgstr ""
+"Servis eğrisi özelliklerinin formatı (m1, d, m2) m2 kuyruğa atanan (sıraya "
+"atanan) bant genişliğini kontrol eder. m1 ve d isteğe bağlı ve bant "
+"genişliği atanmasının kontrolünde kullanılır. d ilk milisaniye de "
+"kuyruktaki bant genişliğine m1, sonra ki değere m2 verir."
+
+#: etc/inc/shaper.inc:2257
+msgid "Priority must be an integer between 1 and 7."
+msgstr "Öncelik değeri 1 ile 7 arasında tamsayı bir değer olmalıdır."
+
+#: etc/inc/shaper.inc:2428 etc/inc/shaper.inc:2702
+msgid "Scheduler specific options"
+msgstr "Belirli seçenek(ler) zamanlayıcı"
+
+#: etc/inc/shaper.inc:2432
+msgid "Borrow from other queues when available"
+msgstr "Kullanılabilir olduğunda diğer kuyruklardan yararlan/ödünç al"
+
+#: etc/inc/shaper.inc:2540
+msgid "Priority must be an integer between 1 and 255."
+msgstr "Öncelik değer 1 ile 255 arasında bir tamsayı olmalıdır."
+
+#: etc/inc/shaper.inc:2708
+msgid "Number of buckets available."
+msgstr "Kalan bucket(ler) sayısı."
+
+#: etc/inc/shaper.inc:2713
+msgid "Bandwidth limit for hosts to not saturate link."
+msgstr "Bant genişliği sınırı, ana bağlantının limitini etkilemez."
+
+#: etc/inc/shaper.inc:2901
+msgid "Plr must be a value between 0 and 1."
+msgstr ""
+
+#: etc/inc/shaper.inc:2904
+msgid "Buckets must be an integer between 16 and 65535."
+msgstr "Bucket(ler) 16 ile 65535 tamsayısı arasında olmalıdır."
+
+#: etc/inc/shaper.inc:2913
+msgid "IPV4 bit mask must be blank or numeric value between 1 and 32."
+msgstr ""
+
+#: etc/inc/shaper.inc:2916
+msgid "IPV6 bit mask must be blank or numeric value between 1 and 128."
+msgstr ""
+
+#: etc/inc/shaper.inc:3057
+#, php-format
+msgid "Bandwidth for schedule %s must be an integer."
+msgstr "Zamanlama için bant genişliği %s tam sayı olmalıdır."
+
+#: etc/inc/shaper.inc:3059
+#, php-format
+msgid "Burst for schedule %s must be an integer."
+msgstr ""
+
+#: etc/inc/shaper.inc:3065
+msgid "You need to specify a schedule for every additional entry"
+msgstr "Her ek giriş için zamanlama belirtmeniz gerekir"
+
+#: etc/inc/shaper.inc:3067
+msgid "If more than one bandwidth configured all schedules need to be selected"
+msgstr ""
+"Eğer birden fazla bant genişliği yapılandırıldıysa tüm zamanlamaların "
+"seçilmesi gerekir"
+
+#: etc/inc/shaper.inc:3069
+msgid "At least one bw specification is necessary"
+msgstr "En az bir bw şartnamesi gereklidir"
+
+#: etc/inc/shaper.inc:3071
+msgid "Delay must be an integer."
+msgstr "Gecikme tamsayı olmalıdır."
+
+#: etc/inc/shaper.inc:3305 usr/local/www/diag_routes.php:171
+#: usr/local/www/interfaces.php:1645 usr/local/www/services_dnsmasq.php:189
+#: usr/local/www/services_rfc2136_edit.php:135
+#: usr/local/www/services_snmp.php:291 usr/local/www/services_snmp.php:351
+#: usr/local/www/services_unbound.php:254
+#: usr/local/www/system_firmware.php:125
+msgid "Enable"
+msgstr "Etkinleştir"
+
+#: etc/inc/shaper.inc:3310
+msgid "Enable limiter and its children"
+msgstr "Limitleyici ve Alt Öğeleri Aktif"
+
+#: etc/inc/shaper.inc:3365
+msgid "add another schedule"
+msgstr "başka bir zamanlama ekle"
+
+#: etc/inc/shaper.inc:3367
+msgid ""
+"Bandwidth is the rate (e.g. Mbit/s) to which traffic in this limiter will be "
+"restricted."
+msgstr ""
+
+#: etc/inc/shaper.inc:3369 etc/inc/shaper.inc:3650
+msgid "Mask"
+msgstr "Maske"
+
+#: etc/inc/shaper.inc:3380 etc/inc/shaper.inc:3661
+msgid "Source addresses"
+msgstr "Kaynak adres"
+
+#: etc/inc/shaper.inc:3384 etc/inc/shaper.inc:3665
+msgid "Destination addresses"
+msgstr "Hedef adres"
+
+#: etc/inc/shaper.inc:3387 etc/inc/shaper.inc:3668
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"a dynamic pipe with the bandwidth, delay, packet loss and queue size given "
+"above will \n"
+"be created for each source/destination IP address encountered, \n"
+"respectively. This makes it possible to easily specify bandwidth \n"
+"limits per host."
+msgstr ""
+
+#: etc/inc/shaper.inc:3408
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"leaving the mask bits blank will create one pipe per host. Otherwise "
+"specify \n"
+"the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+"per pipe."
+msgstr ""
+
+#: etc/inc/shaper.inc:3419 etc/inc/shaper.inc:3700 etc/inc/shaper.inc:3898
+#: usr/local/www/firewall_aliases_edit.php:766
+#: usr/local/www/firewall_nat_1to1_edit.php:513
+#: usr/local/www/firewall_nat_edit.php:792
+#: usr/local/www/firewall_nat_npt_edit.php:272
+#: usr/local/www/firewall_nat_out_edit.php:785
+#: usr/local/www/firewall_schedule_edit.php:808
+#: usr/local/www/firewall_schedule_edit.php:982
+#: usr/local/www/firewall_virtual_ip_edit.php:504
+#: usr/local/www/interfaces_gif_edit.php:226
+#: usr/local/www/interfaces_gre_edit.php:229
+#: usr/local/www/interfaces_groups_edit.php:266
+#: usr/local/www/interfaces_qinq_edit.php:348
+#: usr/local/www/interfaces_vlan_edit.php:196
+#: usr/local/www/interfaces_wireless_edit.php:194
+#: usr/local/www/services_dhcp_edit.php:427
+#: usr/local/www/services_dhcpv6_edit.php:243
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:158
+#: usr/local/www/services_dnsmasq_edit.php:240
+#: usr/local/www/services_igmpproxy_edit.php:185
+#: usr/local/www/services_unbound_domainoverride_edit.php:152
+#: usr/local/www/services_unbound_host_edit.php:243
+#: usr/local/www/services_wol_edit.php:155
+#: usr/local/www/system_gateway_groups_edit.php:342
+#: usr/local/www/system_routes_edit.php:326
+msgid "You may enter a description here for your reference (not parsed)."
+msgstr ""
+"Bu alana kendiniz için herhangi bir açıklama girebilirsiniz, (sistem dikkate "
+"almayacaktır)."
+
+#: etc/inc/shaper.inc:3425 etc/inc/shaper.inc:3706
+#: usr/local/www/interfaces_bridge_edit.php:300
+#: usr/local/www/interfaces_ppps_edit.php:751
+msgid "Show advanced options"
+msgstr "Gelişmiş seçenekleri göster"
+
+#: etc/inc/shaper.inc:3429 usr/local/www/status_ntpd.php:186
+msgid "Delay"
+msgstr "Gecikme"
+
+#: etc/inc/shaper.inc:3433
+msgid ""
+"Hint: in most cases, you should specify 0 here (or leave the field empty)"
+msgstr "İpucu: birçok durumda buraya 0 atayın (ya da boş bırakın)"
+
+#: etc/inc/shaper.inc:3437 etc/inc/shaper.inc:3717
+msgid "Packet loss rate"
+msgstr "Paket kayıp oranı"
+
+#: etc/inc/shaper.inc:3441 etc/inc/shaper.inc:3721
+msgid ""
+"Hint: in most cases, you should specify 0 here (or leave the field empty). A "
+"value of 0.001 means one packet in 1000 gets dropped"
+msgstr ""
+"İpucu: birçok durumda buraya 0 atayın (ya da boş bırakın). 0.0001 gibi bir "
+"değerin anlamı 1000 düşürülecek"
+
+#: etc/inc/shaper.inc:3446 etc/inc/shaper.inc:3726
+msgid "Queue Size"
+msgstr "Kuyruk boyutu"
+
+#: etc/inc/shaper.inc:3451 etc/inc/shaper.inc:3731
+msgid ""
+"Hint: in most cases, you should leave the field empty. All packets in this "
+"pipe are placed into a fixed-size queue first, then they are delayed by "
+"value specified in the Delay field, and then they are delivered to their "
+"destination."
+msgstr ""
+"İpucu: Çoğu zaman bu alanı boş bırakmanız gerekir. Bu geçiş hattındaki tüm "
+"paketler ilk olarak sabit boyutlu olarak sıraya yerleştirilir, geriye kalan "
+"paketler ise gecikme alanında belirtilen değere göre bekletilir ve hedef "
+"adrese teslim edilir."
+
+#: etc/inc/shaper.inc:3457 etc/inc/shaper.inc:3737
+msgid "Bucket Size"
+msgstr "Bucket Boyutu"
+
+#: etc/inc/shaper.inc:3462 etc/inc/shaper.inc:3742
+msgid ""
+"Hint: in most cases, you should leave the field empty. It increases the hash "
+"size set."
+msgstr ""
+"İpucu: çoğu durumda bu alan boş bırakılabilinir. Hash ayar boyutunu artırır."
+
+#: etc/inc/shaper.inc:3530
+msgid "Weight must be an integer between 1 and 100."
+msgstr "Ağırlık 1 ile 100 tamsayı aralığında olmalıdır."
+
+#: etc/inc/shaper.inc:3637
+msgid "Enable/Disable queue"
+msgstr "Kuyruğu Etkinleştir/Kapat"
+
+#: etc/inc/shaper.inc:3657 usr/local/www/firewall_rules.php:734
+#: usr/local/www/firewall_rules_edit.php:1410
+#: usr/local/www/firewall_rules_edit.php:1419
+#: usr/local/www/interfaces_lagg_edit.php:218
+#: usr/local/www/load_balancer_virtual_server_edit.php:232
+#: usr/local/www/vpn_ipsec_mobile.php:405
+#: usr/local/www/vpn_openvpn_client.php:609
+msgid "none"
+msgstr "Hiçbiri"
+
+#: etc/inc/shaper.inc:3689
+msgid ""
+"If 'source' or 'destination' slots is chosen, \n"
+"leaving the mask bits blank will create one pipe per host. Otherwise "
+"specify \n"
+"the number of 'one' bits in the subnet mask used to group multiple hosts \n"
+"per queue."
+msgstr ""
+
+#: etc/inc/shaper.inc:3709 usr/local/www/system_gateways_edit.php:753
+msgid "Weight"
+msgstr "Ağırlık"
+
+#: etc/inc/shaper.inc:3713
+msgid ""
+"Hint: For queues under the same parent this specifies the share that a queue "
+"gets(values range from 1 to 100, you can leave it blank otherwise)"
+msgstr ""
+"İpucu: Kuyruklar için aynı üst (parent) grubun altında kuyruğun paylaşacağı "
+"değeri belirtir (değer aralığı 1 ile 100 arasındadır, aksi halde boş "
+"bırakınız)"
+
+#: etc/inc/shaper.inc:3741
+msgid "slots"
+msgstr "yuvalar"
+
+#: etc/inc/shaper.inc:3885
+msgid "Enable/Disable layer7 Container"
+msgstr "Layer7 Barındırıcı Etkinleştir/Kapat"
+
+#: etc/inc/shaper.inc:4150
+#, php-format
+msgid "Sending HUP signal to %s"
+msgstr "HUP sinyali %s e gönderiliyor"
+
+#: etc/inc/shaper.inc:4511
+msgid " Clone shaper/queue on this interface"
+msgstr " Bu arabirimdeki klon şekillendirici / kuyruğu"
+
+#: etc/inc/shaper.inc:4519 etc/inc/shaper.inc:4526
+#, php-format
+msgid "Welcome to the %s Traffic Shaper."
+msgstr "%s Trafik Şekillendiricisine hoşgeldiniz."
+
+#: etc/inc/shaper.inc:4520 etc/inc/shaper.inc:4527
+msgid ""
+"The tree on the left helps you navigate through the queues <br />buttons at "
+"the bottom represent queue actions and are activated accordingly."
+msgstr ""
+"Sol tarafta bulunan ağaç kuyrukta gezinmenize yardımcı olur <br />altındaki "
+"düğmeler kuyruk eylemlerini gösterir ve buna uygun olarak aktif hale "
+"getirilir."
+
+#: etc/inc/smtp.inc:93
+msgid ": data access time out"
+msgstr "veri erişim zaman aşımı"
+
+#: etc/inc/smtp.inc:96
+msgid ": the server disconnected"
+msgstr "sunucu bağlantısı kesildi"
+
+#: etc/inc/smtp.inc:108
+msgid "reached the end of data while reading from the SMTP server conection"
+msgstr "SMTP sunucusu bağlantısı okurken veri sonuna erişildi"
+
+#: etc/inc/smtp.inc:114
+msgid "it was not possible to read line from the SMTP server"
+msgstr "bu SMTP sunucusundaki satırlar okunamıyor"
+
+#: etc/inc/smtp.inc:136
+msgid "it was not possible to send a line to the SMTP server"
+msgstr "Bu SMTP sunucusuna satır gönderilemiyor"
+
+#: etc/inc/smtp.inc:150
+msgid "it was not possible to send data to the SMTP server"
+msgstr "bu SMTP sunucusuna veri gönderilemiyor"
+
+#: etc/inc/smtp.inc:222
+msgid "establishing SSL connections requires at least PHP version 4.3.0"
+msgstr ""
+"SSL bağlantısının sağlanabilmesi için PHP versiyonunun 4.3.0 ve üstü olması "
+"gerekmektedir"
+
+#: etc/inc/smtp.inc:225
+msgid "establishing SSL connections requires the OpenSSL extension enabled"
+msgstr "SSL bağlantıları için OpenSSL eklentisi aktif olmalıdır"
+
+#: etc/inc/smtp.inc:234
+#, php-format
+msgid "could not resolve host \"%s\""
+msgstr "\"%s\" ana bilgisayarı çözülemedi"
+
+#: etc/inc/smtp.inc:238
+#, php-format
+msgid "domain \"%s\" resolved to an address excluded to be valid"
+msgstr "etki alanı \"%s\" geçerli olması dışında bir adres çözümlenir"
+
+#: etc/inc/smtp.inc:240
+#, php-format
+msgid "Connecting to host address \"%1$s\" port %2$s..."
+msgstr ""
+"Ana bilgisayara \"%1$s\" adresinden %2$s bağlantı noktasndan bağlanıyor..."
+
+#: etc/inc/smtp.inc:247
+msgid "-3 socket could not be created"
+msgstr "-3 yuva oluşturulamadı"
+
+#: etc/inc/smtp.inc:249
+#, php-format
+msgid "-4 dns lookup on hostname \"%s\" failed"
+msgstr "-4 \"%s\" host adı dns araması yapılamadı"
+
+#: etc/inc/smtp.inc:251
+msgid "-5 connection refused or timed out"
+msgstr "-5 bağlantı reddedildi veya zaman aşımına uğradı"
+
+#: etc/inc/smtp.inc:253
+msgid "-6 fdopen() call failed"
+msgstr "-6 fdopen() çağrısı başarısız "
+
+#: etc/inc/smtp.inc:255
+msgid "-7 setvbuf() call failed"
+msgstr "-7 setvbuf() çağrısı başarısız"
+
+#: etc/inc/smtp.inc:257
+#, php-format
+msgid "could not connect to the host \"%1$s\": %2$s"
+msgstr "Ana bilgisayara bağlanılamadı \"%1$s\": %2$s"
+
+#: etc/inc/smtp.inc:266
+msgid ""
+"it is not possible to authenticate using the specified mechanism because the "
+"SASL library class is not loaded"
+msgstr ""
+"Belirtilen mekaznizma kullanılarak doğrulama mümkün değil çünkü SASL "
+"kitaplık sınıfı yüklü değil"
+
+#: etc/inc/smtp.inc:290
+#, php-format
+msgid "authenticated mechanism %1$s may not be used: %2$s"
+msgstr "Doğrulama mekanizması %1$s kullanılamadı: %2$s"
+
+#: etc/inc/smtp.inc:295
+msgid "Could not start the SASL authentication client:"
+msgstr "SASL kimlik doğrulama istemcisi başlatılamadı:"
+
+#: etc/inc/smtp.inc:302
+msgid "Could not send the AUTH command"
+msgstr "AUTH komutu gönderilemedi"
+
+#: etc/inc/smtp.inc:317 etc/inc/smtp.inc:347
+msgid "Authentication error:"
+msgstr "Kimlik doğrulama hata:"
+
+#: etc/inc/smtp.inc:332
+msgid "Could not send the authentication step message"
+msgstr "Kimlik doğrulama adımı mesajı gönderilemedi"
+
+#: etc/inc/smtp.inc:352
+msgid "Could not process the SASL authentication step:"
+msgstr "SASL kimlik doğrulama işlemi adımı gönderilemedi:"
+
+#: etc/inc/smtp.inc:366
+msgid "connection is already established"
+msgstr "Bağlantı zaten kuruldu"
+
+#: etc/inc/smtp.inc:404
+msgid "it was not specified the POP3 authentication user"
+msgstr "belirtilen POP3 kimlik doğrulama kullanıcısı değil"
+
+#: etc/inc/smtp.inc:410
+msgid "it was not specified the POP3 authentication password"
+msgstr "belirtilen POP3 kimlik doğrulama şifresi değil"
+
+#: etc/inc/smtp.inc:414
+#, php-format
+msgid "Resolving POP3 authentication host \"%s\"..."
+msgstr "POP3 kimlik doğrulama sunucusu \"%s\" çözümleniyor..."
+
+#: etc/inc/smtp.inc:421
+msgid "POP3 authentication server greeting was not found"
+msgstr "POP3 kimlik doğrulama sunucusu karşılama bulamadı"
+
+#: etc/inc/smtp.inc:429
+msgid "POP3 authentication user was not accepted:"
+msgstr "POP3 kimlik doğrulama kullanıcısı kabul edilmedi:"
+
+#: etc/inc/smtp.inc:437
+msgid "POP3 authentication password was not accepted:"
+msgstr "POP3 kimlik doğrulama şifresi kabul edilmedi:"
+
+#: etc/inc/smtp.inc:446
+msgid "could not determine the SMTP to connect"
+msgstr "bağlanılacak SMTP belirlenemedi"
+
+#: etc/inc/smtp.inc:452
+#, php-format
+msgid "Resolving SMTP server domain \"%s\"..."
+msgstr "SMTP sunucu alan adı \"%s\" çözümleniyor..."
+
+#: etc/inc/smtp.inc:464
+#, php-format
+msgid "Connected to SMTP server \"%s\"."
+msgstr "\"%s\" sunucusuna bağlantı kuruldu."
+
+#: etc/inc/smtp.inc:478
+msgid "server does not require authentication"
+msgstr "sunucu kimlik doğrulaması gerektirmez"
+
+#: etc/inc/smtp.inc:542
+msgid ""
+"it is not supported any of the authentication mechanisms required by the "
+"server"
+msgstr ""
+"sunucu tarafından istenen herhangi bir kimlik doğrulama mekanizması "
+"desteklenmiyor"
+
+#: etc/inc/smtp.inc:632
+msgid ""
+"direct delivery connection is already established and sender is already set"
+msgstr ""
+"doğrudan dağıtım bağlantısı zaten kurulmuş ve gönderen zaten ayarlanmış"
+
+#: etc/inc/smtp.inc:640
+msgid "connection is not in the initial state"
+msgstr "bağlantı başlangıç durumunda değil"
+
+#: etc/inc/smtp.inc:662
+msgid "it was not specified a valid direct recipient"
+msgstr "geçerli bir doğrudan alıcı belirtilmedi"
+
+#: etc/inc/smtp.inc:681
+msgid ""
+"it is not possible to deliver directly to recipients of different domains"
+msgstr "farklı etki alanlarının alıcılara doğrudan erişimi mümkün değil"
+
+#: etc/inc/smtp.inc:686
+msgid "connection is already established and the recipient is already set"
+msgstr "bağlantı zaten kurulmuş ve alıcı zaten ayarlanmış"
+
+#: etc/inc/smtp.inc:698
+msgid "connection is not in the recipient setting state"
+msgstr "bağlantı alıcı ayar durumunda değil"
+
+#: etc/inc/smtp.inc:727
+msgid "connection is not in the start sending data state"
+msgstr "veri durumunu göndermeyi başlatacak bağlantı yok"
+
+#: etc/inc/smtp.inc:757 etc/inc/smtp.inc:768
+msgid "connection is not in the sending data state"
+msgstr "veri durumunu gönderecek bağlantı yok"
+
+#: etc/inc/smtp.inc:804
+msgid "it was not previously established a SMTP connection"
+msgstr "daha önce sağlanmış bir SMTP bağlantısı değil"
+
+#: etc/inc/system.inc:515
+#, php-format
+msgid "Not adding default route because OLSR dynamic gateway is enabled."
+msgstr "Varsayılan rota eklenemedi çünki OLSR dinamik ağ geçidi etkin."
+
+#: etc/inc/system.inc:556
+#, php-format
+msgid "Static Routes: Gateway IP could not be found for %s"
+msgstr "Statik yönlendirici: Ağ geçidi IP si %s bulunamadı"
+
+#: etc/inc/system.inc:715
+msgid "Starting syslog..."
+msgstr "Syslog başlıyor..."
+
+#: etc/inc/system.inc:860
+#, php-format
+msgid "Error: cannot open syslog.conf in system_syslogd_start().%s"
+msgstr "Hata: system_syslogd_start().%s içindeki syslog.conf açılamadı"
+
+#: etc/inc/system.inc:942
+msgid "Starting webConfigurator..."
+msgstr "webArayüzü başlatılıyor..."
+
+#: etc/inc/system.inc:988 etc/inc/system.inc:1912 etc/inc/system.inc:1915
+msgid "failed!"
+msgstr "başarısız oldu!"
+
+#: etc/inc/system.inc:1288
+#, php-format
+msgid "Error: cannot open cert.pem in system_webgui_start().%s"
+msgstr "Hata: system_webgui_start().%s içindeki cert.pem açılamadı"
+
+#: etc/inc/system.inc:1299
+#, php-format
+msgid "Error: cannot open ca.pem in system_webgui_start().%s"
+msgstr "Hata: system_webgui_start().%s içindeki ca.pem açılamadı"
+
+#: etc/inc/system.inc:1307
+msgid "ssl configuration"
+msgstr "ssl yapılandırması"
+
+#: etc/inc/system.inc:1360
+#, php-format
+msgid "Error: cannot open %s in system_generate_lighty_config().%s"
+msgstr "Hata: system_generate_lighty_config().%s içindeki %s açılamadı"
+
+#: etc/inc/system.inc:1380
+msgid "Setting timezone..."
+msgstr "Saat dilimi ayarlanıyor..."
+
+#: etc/inc/system.inc:1761
+msgid "Syncing system time before startup..."
+msgstr "Başlangıçtan önce sistem saati senkronize ediliyor..."
+
+#: etc/inc/system.inc:1875
+#, php-format
+msgid "Error: cannot open dmesg.boot in system_dmesg_save().%s"
+msgstr "Hata: system_dmesg_save().%s içindeki dmesg.boot açılamıyor"
+
+#: etc/inc/system.inc:1897
+msgid "Setting hard disk standby... "
+msgstr "Sabit disk hazırda beklemeye ayarlanıyor..."
+
+#: etc/inc/system.inc:2018
+msgid "Generic PC"
+msgstr "Genel PC"
+
+#: etc/inc/system.inc:2021
+msgid "Generic PC (CD-ROM)"
+msgstr "Genel PC (CD-ROM)"
+
+#: etc/inc/system.inc:2030
+msgid "PC Engines WRAP"
+msgstr "PC Engines WRAP"
+
+#: etc/inc/system.inc:2033
+msgid "PC Engines ALIX"
+msgstr "PC Engines ALIX"
+
+#: etc/inc/system.inc:2045
+msgid "embedded (unknown)"
+msgstr "gömülü (bilinmeyen)"
+
+#: etc/inc/upgrade_config.inc:113
+#, php-format
+msgid "%sWarning: filter rule removed (interface '%s' does not exist anymore)."
+msgstr "%sUyarı: filtre kuralı kaldırıldı ('%s' arabirimi artık yok)."
+
+#: etc/inc/upgrade_config.inc:125
+#, php-format
+msgid ""
+"%sWarning: filter rule removed (source network '%s' does not exist anymore)."
+msgstr "%sUyarı: filtre kuralı kaldırıldı ('%s' kaynak ağı artık yok)."
+
+#: etc/inc/upgrade_config.inc:138
+#, php-format
+msgid ""
+"%sWarning: filter rule removed (destination network '%s' does not exist "
+"anymore)."
+msgstr "%sUyarı: filtre kuralı kaldırıldı ('%s' hedef ağı artık yok)."
+
+#: etc/inc/upgrade_config.inc:158
+#, php-format
+msgid ""
+"%sWarning: traffic shaper rule removed (interface '%s' does not exist "
+"anymore)."
+msgstr ""
+"%sUyarı: trafik şekillendirici kuralı kaldırıldı ('%s' arabirimi artık yok)."
+
+#: etc/inc/upgrade_config.inc:170
+#, php-format
+msgid ""
+"%sWarning: traffic shaper rule removed (source network '%s' does not exist "
+"anymore)."
+msgstr ""
+"%sUyarı: trafik şekillendirici kuralı kaldırıldı ('%s' kaynak ağı artık yok)."
+
+#: etc/inc/upgrade_config.inc:183
+#, php-format
+msgid ""
+"%sWarning: traffic shaper rule removed (destination network '%s' does not "
+"exist anymore)."
+msgstr ""
+"%sUyarı: trafik Kameralari kuralı kaldırıldı ('%s' hedef ağı artık yok)."
+
+#: etc/inc/upgrade_config.inc:333
+#, php-format
+msgid "CARP vhid %s"
+msgstr "CARP vhid %s"
+
+#: etc/inc/upgrade_config.inc:510
+msgid "Permit IPsec traffic."
+msgstr "IPsec trafiğine izin ver."
+
+#: etc/inc/upgrade_config.inc:585
+msgid "System Administrators"
+msgstr "Sistem Yöneticileri"
+
+#: etc/inc/upgrade_config.inc:604
+msgid ""
+"Indicates whether this user will lock access to the webConfigurator for "
+"other users."
+msgstr ""
+"Bu kullanıcı için diğer kullanıcıların webArayüzü erişimlerini kilitleyip "
+"kilitleyemediğini gösterir."
+
+#: etc/inc/upgrade_config.inc:607
+msgid ""
+"Indicates whether this user will lock individual HTML pages after having "
+"accessed a particular page (the lock will be freed if the user leaves or "
+"saves the page form)."
+msgstr ""
+"Kullanıcının erişilen her html sayfaları için kilidi olup olmadığını "
+"gösterir (kullanıcı sayfayı kaydeder ya da kapatırsa kilit serbest "
+"kalacaktır)."
+
+#: etc/inc/upgrade_config.inc:610
+msgid "Indicates whether this user is able to login for example via SSH."
+msgstr "Kullanıcının SSH örneği ile girişinin mümkün olup olmadığını gösterir."
+
+#: etc/inc/upgrade_config.inc:613
+#, php-format
+msgid ""
+"Indicates whether this user is allowed to copy files onto the %s appliance "
+"via SCP/SFTP. If you are going to use this privilege, you must install "
+"scponly on the appliance (Hint: pkg_add -r scponly)."
+msgstr ""
+"Bu kullanıcının SCP/SFTP aracılığı ile %s cihazına dosyaları kopyalamak için "
+"izin olup olmadığını gösterir. Bu ayrıcalığı kullanmak için scponly "
+"uygulamasını yüklemelisiniz. (İpucu: pkg_add -r scponly)."
+
+#: etc/inc/upgrade_config.inc:616
+msgid ""
+"This user is associated with the UNIX root user (you should associate this "
+"privilege only with one single user)."
+msgstr ""
+"Bu kullanıcı UNIX root ile ilişkilidir (bu ayrıcalıkları sadece bir "
+"kullanıcı ile ilişkilendirmelisiniz)."
+
+#: etc/inc/upgrade_config.inc:633
+msgid "Drop packets to closed TCP ports without returning a RST"
+msgstr ""
+"RST'den cevap gelmesini beklemeden TCP bağlantı noktalarına paketleri bırak"
+
+#: etc/inc/upgrade_config.inc:637
+msgid "Do not send ICMP port unreachable messages for closed UDP ports"
+msgstr ""
+"Kapalı UDP bağlantı noktaları için ICMP port ulaşılamaz mesajları gönderme"
+
+#: etc/inc/upgrade_config.inc:641
+msgid "Randomize the ID field in IP packets (default is 0: sequential IP IDs)"
+msgstr ""
+"IP paketlerinde ID alanını rastgele sırala (IP ID'lerinin sırası varsayılan "
+"0'dır.)"
+
+#: etc/inc/upgrade_config.inc:645
+msgid "Drop SYN-FIN packets (breaks RFC1379, but nobody uses it anyway)"
+msgstr ""
+"SYN-FIN paketlerini Düşür (RFC1379 u sonlandırır, zaten kimse kullanmaz)"
+
+#: etc/inc/upgrade_config.inc:649
+msgid "Sending of IPv4 ICMP redirects"
+msgstr "IPv4 ICMP yeniden yönlendirmeleri gönderiliyor"
+
+#: etc/inc/upgrade_config.inc:653
+msgid "Sending of IPv6 ICMP redirects"
+msgstr "IPv6 ICMP yeniden yönlendirmeleri gönderiliyor"
+
+#: etc/inc/upgrade_config.inc:657
+msgid "Generate SYN cookies for outbound SYN-ACK packets"
+msgstr "Giden SYN-ACK paketleri için SYN çerezleri oluştur"
+
+#: etc/inc/upgrade_config.inc:661
+msgid "Maximum incoming TCP datagram size"
+msgstr "Maksimum gelen TCP veri birimi boyutu"
+
+#: etc/inc/upgrade_config.inc:665
+msgid "Maximum outgoing TCP datagram size"
+msgstr "Maksimum giden TCP veri birimi boyutu"
+
+#: etc/inc/upgrade_config.inc:669
+msgid ""
+"Fastforwarding (see http://lists.freebsd.org/pipermail/freebsd-net/2004-"
+"January/002534.html)"
+msgstr ""
+"Hızlıyönlendiriliyor (bakınız http://lists.freebsd.org/pipermail/freebsd-"
+"net/2004-January/002534.html)"
+
+#: etc/inc/upgrade_config.inc:673
+msgid "Do not delay ACK to try and piggyback it onto a data packet"
+msgstr ""
+"Bir veri paketi üzerinde deneyip ve piggyback (omuzlama) da ACK gecikmesi "
+"yoktur."
+
+#: etc/inc/upgrade_config.inc:677
+msgid "Maximum outgoing UDP datagram size"
+msgstr "Maksimum giden UDP veri birimi boyutu"
+
+#: etc/inc/upgrade_config.inc:681
+msgid ""
+"Handling of non-IP packets which are not passed to pfil (see if_bridge(4))"
+msgstr ""
+"Pfil den geçmeyip IP-Paketi olmayanların taşunması (bakınız if_bridge(4))"
+
+#: etc/inc/upgrade_config.inc:685
+msgid "Allow unprivileged access to tap(4) device nodes"
+msgstr "Ayrıcalıksız erişim (4) aygıt düğümü öğesine izin ver."
+
+#: etc/inc/upgrade_config.inc:689
+msgid "Randomize PID's (see src/sys/kern/kern_fork.c: sysctl_kern_randompid())"
+msgstr "Rastgele PID's (Bak src/sys/kern/kern_fork.c: sysctl_kern_randompid())"
+
+#: etc/inc/upgrade_config.inc:693
+msgid ""
+"The system will attempt to calculate the bandwidth delay product for each "
+"connection and limit the amount of data queued to the network to just the "
+"amount required to maintain optimum throughput. "
+msgstr ""
+"Sistem Her Onaylı Bağlantı için Bantgenişliği Hesaplaması Yaparak Ağda ki "
+"Veri Kaynaklarının Kullanımını Optimum Seviyede Tutmaya Çalışır."
+
+#: etc/inc/upgrade_config.inc:697
+msgid "Set ICMP Limits"
+msgstr "ICMP Sınırlarını Ayarla"
+
+#: etc/inc/upgrade_config.inc:701
+msgid "TCP Offload engine"
+msgstr "TCP bırakma (Offload) moturu"
+
+#: etc/inc/upgrade_config.inc:742
+#, php-format
+msgid "Interface %s Static Gateway"
+msgstr "%s Arabiriminin Sabit Ağ Geçidi"
+
+#: etc/inc/upgrade_config.inc:745
+#, php-format
+msgid "Interface %s Dynamic Gateway"
+msgstr "%s Arabiriminin Değişken Ağ Geçidi"
+
+#: etc/inc/upgrade_config.inc:811
+#, php-format
+msgid "Upgraded static route for %s"
+msgstr "Güncellenen statik yönlendirici %s"
+
+#: etc/inc/upgrade_config.inc:908
+#, php-format
+msgid "Sitedown pool for VS: %s"
+msgstr "Site kapalı havuzu VS için: %s"
+
+#: etc/inc/upgrade_config.inc:1063
+#, php-format
+msgid "phase2 for %s"
+msgstr "aşama 2 için %s"
+
+#: etc/inc/upgrade_config.inc:1290
+#, php-format
+msgid "Upgraded Dyndns %s"
+msgstr "Güncellenmiş Dyndns %s"
+
+#: etc/inc/upgrade_config.inc:1342
+msgid "All Users"
+msgstr "Tüm Kullanıcılar"
+
+#: etc/inc/upgrade_config.inc:1474
+#, php-format
+msgid "Converted bridged %s"
+msgstr "Dönüştürülmüş köprülenmiş %s"
+
+#: etc/inc/upgrade_config.inc:1848
+msgid "Auto added OpenVPN rule from config upgrade."
+msgstr "Yapılandırma yükseltmesinde otomatik eklenen OpenVPN kuralı."
+
+#: etc/inc/util.inc:101
+#, php-format
+msgid "WARNING: Could not mark subsystem: %s dirty"
+msgstr "UYARI: Alt sistem işareti alınamadı %s kirli "
+
+#: etc/inc/util.inc:121
+msgid "WARNING: You must give a name as parameter to lock() function."
+msgstr "UYARI: Parametreye isim vermelisiniz işlev() kilidi."
+
+#: etc/inc/util.inc:138
+msgid "WARNING: You must give a name as parameter to try_lock() function."
+msgstr ""
+
+#: etc/inc/util.inc:273
+#, php-format
+msgid "Reference %s is going negative, not doing unreference."
+msgstr "Kaynak %s eksiye gidiyor, kaynak yapmıyor."
+
+#: etc/inc/util.inc:1254
+#, php-format
+msgid "The command '%1$s' returned exit code '%2$d', the output was '%3$s' "
+msgstr "Komut '%1$s' geriye '%2$d' dondurdu, '%3$s' olarak cikti verdi."
+
+#: etc/inc/voucher.inc:391
+#, php-format
+msgid "%1$s (%2$s/%3$s) active and good for %4$d Minutes"
+msgstr "%1$s (%2$s/%3$s) aktif ve iyi %4$d Dakika"
+
+#: etc/inc/voucher.inc:428
+msgid "Access denied!"
+msgstr "Erişim Engellendi!"
+
+#: etc/inc/voucher.inc:430
+#, php-format
+msgid "Access granted for %d Minutes in total."
+msgstr "Toplam %d dakikalığına erişim verildi."
+
+#: etc/inc/voucher.inc:496
+msgid "Enabling voucher support... "
+msgstr "Bilet desteği aktifleştiriliyor... "
+
+#: etc/inc/voucher.inc:535
+#, php-format
+msgid "Error: cannot write voucher.cfg"
+msgstr "Hata: voucher.cfg yazılamıyor"
+
+#: etc/inc/voucher.inc:586
+#, php-format
+msgid "cant write %1$s/voucher_%s_used_%2$s.db"
+msgstr "%1$s/voucher_%s_used_%2$s.db yazılamıyor"
+
+#: etc/inc/voucher.inc:667
+#, php-format
+msgid "cant read %1$s/voucher_%s_used_%2$s.db"
+msgstr "%1$s/voucher_%s_used_%2$s.db okunamıyor"
+
+#: etc/inc/voucher.inc:684
+#, php-format
+msgid "Voucher: %s"
+msgstr "Bilet: %s"
+
+#: etc/inc/vpn.inc:161
+msgid "Configuring IPsec VPN... "
+msgstr "IPsec VPN Yapılandırılıyor..."
+
+#: etc/inc/vpn.inc:423
+#, php-format
+msgid "Error: Invalid certificate info for %s"
+msgstr "Hata: %s Geçersiz sertifika bilgisi"
+
+#: etc/inc/vpn.inc:429
+#, php-format
+msgid "Error: Invalid certificate hash info for %s"
+msgstr "Hata: %s Geçersiz sertifika hash bilgisi"
+
+#: etc/inc/vpn.inc:434
+#, php-format
+msgid "Error: Cannot write IPsec CA file for %s"
+msgstr "Hata: IPsec CA dosyası %s e yazılamıyor"
+
+#: etc/inc/vpn.inc:456
+#, php-format
+msgid "Error: Invalid phase1 certificate reference for %s"
+msgstr "Hata: %s geçersiz aşama 1 sertifika kaynağı"
+
+#: etc/inc/vpn.inc:464
+#, php-format
+msgid "Error: Cannot write phase1 key file for %s"
+msgstr "Hata: %s Anahtar aşama 1 dosyasına yazılamadı"
+
+#: etc/inc/vpn.inc:471
+#, php-format
+msgid "Error: Cannot write phase1 certificate file for %s"
+msgstr "Hata: %s Sertifika aşama 1 dosyasına yazılamadı"
+
+#: etc/inc/vpn.inc:916
+#, php-format
+msgid "Ignoring IPsec reload since there are no tunnels on interface %s"
+msgstr ""
+
+#: etc/inc/vpn.inc:923
+msgid "Forcefully reloading IPsec"
+msgstr ""
+
+#: etc/inc/vpn.inc:967
+msgid "Configuring PPTP VPN service... "
+msgstr "PPTP VPN servisi yapılandırılıyor..."
+
+#: etc/inc/vpn.inc:977
+msgid "Could not kill mpd within 3 seconds. Trying again."
+msgstr "3 Saniye içinde mpd durdurulamadı. Tekrar deneniyor."
+
+#: etc/inc/vpn.inc:1000
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_pptpd_configure()."
+msgstr "Hata: vpn_pptpd_configure(). içinde mpd.conf açılamadı."
+
+#: etc/inc/vpn.inc:1119
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_pptpd_configure()."
+msgstr "Hata: vpn_pptpd_configure(). içinde mpd.links açılamadı."
+
+#: etc/inc/vpn.inc:1144
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_pptpd_configure()."
+msgstr "Hata: vpn_pptpd_configure(). içinde mpd.secret açılamadı."
+
+#: etc/inc/vpn.inc:1202
+msgid "Configuring PPPoE Server service... "
+msgstr ""
+
+#: etc/inc/vpn.inc:1226
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_pppoe_configure()."
+msgstr "Hata: vpn_pppoe_configure(). içinde mpd.conf açılmadı."
+
+#: etc/inc/vpn.inc:1335
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_pppoe_configure()."
+msgstr "Hata: vpn_pppoe_configure(). içinde mpd.links açılamadı."
+
+#: etc/inc/vpn.inc:1362
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_pppoe_configure()."
+msgstr "Hata: vpn_pppoe_configure(). içinde mpd.secret açılamadı."
+
+#: etc/inc/vpn.inc:1395 usr/local/www/system_firmware_check.php:141
+msgid "done"
+msgstr "tamamlandı"
+
+#: etc/inc/vpn.inc:1414
+msgid "Configuring l2tp VPN service... "
+msgstr "l2tp VPN servisi yapılandırılıyor..."
+
+#: etc/inc/vpn.inc:1439
+#, php-format
+msgid "Error: cannot open mpd.conf in vpn_l2tp_configure()."
+msgstr "Hata: vpn_l2tp_configure(). içinde mpd.conf açılamadı."
+
+#: etc/inc/vpn.inc:1538
+#, php-format
+msgid "Error: cannot open mpd.links in vpn_l2tp_configure()."
+msgstr "Hata: vpn_l2tp_configure(). içinde mpd.links açılamadı."
+
+#: etc/inc/vpn.inc:1564
+#, php-format
+msgid "Error: cannot open mpd.secret in vpn_l2tp_configure()."
+msgstr "Hata: vpn_l2tp_configure(). içinde mpd.secret açılamadı."
+
+#: etc/inc/xmlparse.inc:93 etc/inc/xmlparse_attr.inc:78
+#, php-format
+msgid "XML error: %1$s at line %2$d cannot occur more than once"
+msgstr "XML hatası: %1$s satırında %2$d bir kereden fazla olamaz"
+
+#: etc/inc/xmlparse.inc:184 etc/inc/xmlparse_attr.inc:187
+msgid "Error: could not open XML input"
+msgstr "Hata: XML girdisi açılamadı"
+
+#: etc/inc/xmlparse.inc:190
+#, php-format
+msgid "XML error: %1$s at line %2$d in %3$s"
+msgstr "XML hata: %3$s içinde %2$d satır %1$s"
+
+#: etc/inc/xmlparse.inc:207 etc/inc/xmlparse_attr.inc:210
+#, php-format
+msgid "XML error: no %s object found!"
+msgstr "XML hata : %s nesnesi bulunamadı!"
+
+#: etc/inc/xmlparse_attr.inc:197
+#, php-format
+msgid "XML error: %1$s at line %2$d"
+msgstr "XML hatası: %1$s satır %2$d"
+
+#: etc/inc/xmlreader.inc:168
+#, php-format
+msgid "Error returned while trying to parse %s"
+msgstr "Ayrıştırmaya çalışırken hata ile döndü %s"
+
+#: etc/inc/xmlrpc_client.inc:152
+msgid "Unknown method"
+msgstr "Bilinmeyen yöntem"
+
+#: etc/inc/xmlrpc_client.inc:153
+msgid "Invalid return payload: enable debugging to examine incoming payload"
+msgstr ""
+"Geçersiz yük dönüşü: gelen yükü incelemek için hata ayıklamayı etkinleştir"
+
+#: etc/inc/xmlrpc_client.inc:154
+msgid "Incorrect parameters passed to method"
+msgstr "Hatalı parametreler yönteme geçirildi"
+
+#: etc/inc/xmlrpc_client.inc:155
+msgid "Can't introspect: method unknown"
+msgstr "İçgözlem olamaz: Biliynmeyen Yöntem"
+
+#: etc/inc/xmlrpc_client.inc:156
+msgid "Didn't receive 200 OK from remote server."
+msgstr "Uzak sunucudan 200 OK alınmadı."
+
+#: etc/inc/xmlrpc_client.inc:157
+msgid "The requested method didn't return an XML_RPC_Response object."
+msgstr "İstenilen yöntem XML_RPC_Response nesnesi döndürmedi."
+
+#: etc/inc/xmlrpc_client.inc:158
+msgid "Invalid request payload"
+msgstr "Geçersiz yük isteği"
+
+#: etc/inc/xmlrpc_client.inc:260
+msgid "missing top level xmlrpc element"
+msgstr "üst düzey xmlrpc öğesi kayıp"
+
+#: etc/inc/xmlrpc_client.inc:268
+#, php-format
+msgid "xmlrpc element %1$s cannot be child of %2$s"
+msgstr "xmlrpc öğesi %1$s %2$s nin alt öğesi değil"
+
+#: etc/inc/xmlrpc_client.inc:431
+msgid "Non-numeric value received in INT or DOUBLE"
+msgstr "INT veya İKİZ alınan değerleri numaratik olmayan değer"
+
+#: etc/inc/xmlrpc_client.inc:860
+#, php-format
+msgid "send()'s %s parameter must be an XML_RPC_Message object."
+msgstr "send()'s %s parametresi XML_RPC_Message nesnesine ait olmalıdır."
+
+#: etc/inc/xmlrpc_client.inc:951
+#, php-format
+msgid ""
+"Connection to proxy server \n"
+" %1$s:%2$s failed. %3$s"
+msgstr ""
+"Proxy sunucu bağlantısı sırasında \n"
+"%1$s:%2$s başarısız oldu. %3$s"
+
+#: etc/inc/xmlrpc_client.inc:957
+#, php-format
+msgid ""
+"Connection to RPC server \n"
+" %1$s:%2$s failed. %3$s"
+msgstr ""
+"RPC sunucu bağlantısı sırasında \n"
+"%1$s:%2$s başarısız oldu. %3$s"
+
+#: etc/inc/xmlrpc_client.inc:1330
+msgid "The submitted request did not contain this parameter"
+msgstr "Gönderilen istek bu parametreyi içermiyor"
+
+#: etc/inc/xmlrpc_client.inc:1361
+msgid "mb_convert_encoding() is not available"
+msgstr "mb_convert_encoding() kullanılamaz"
+
+#: etc/inc/xmlrpc_client.inc:1470
+#, php-format
+msgid "HTTP error, got response: %s"
+msgstr "HTTP hatası, gelen yanıt: %s"
+
+#: etc/inc/xmlrpc_client.inc:1593
+msgid "Scalar can have only one value"
+msgstr "Sayı sadece bir değer olmalı"
+
+#: etc/inc/xmlrpc_client.inc:1600
+#, php-format
+msgid "Not a scalar type (%s)"
+msgstr "(%s) sayısal bir tür değil"
+
+#: etc/inc/xmlrpc_client.inc:1636 etc/inc/xmlrpc_client.inc:1652
+#, php-format
+msgid "Already initialized as a [%s]"
+msgstr "[%s] olarak henüz başlatıldı"
+
+#: etc/inc/xmlrpc_server.inc:48
+msgid ""
+"This method lists all the methods that the XML-RPC server knows how to "
+"dispatch"
+msgstr ""
+"Bu yöntem tüm yöntemleri listeler XML-RPC sunucusu nasıl dağıtacağını "
+"belirler"
+
+#: etc/inc/xmlrpc_server.inc:66
+msgid ""
+"Returns an array of known signatures (an array of arrays) for the method "
+"name passed. If no signatures are known, returns a none-array (test for "
+"type != array to detect missing signature)"
+msgstr ""
+"Geçen yöntem adı ile tanınan imzalar bir dizi olarak döndürür. (dizler için "
+"dizi) Eğer tanımlı imza yoksa, boş-dizi olarak dönüş yapar (tür için test != "
+"dizi kayıp imza tesbiti)"
+
+#: etc/inc/xmlrpc_server.inc:86
+msgid ""
+"Returns help text if defined for the method passed, otherwise returns an "
+"empty string"
+msgstr ""
+"Yardım dosyası tanımlıysa yöntem geçiş yaparak döner, aksi halde boş dizilim "
+"olarak döner"
+
+#: etc/inc/zeromq.inc:225 etc/inc/zeromq.inc:236
+#, php-format
+msgid "Merged in config (%s sections) from ZeroMQ client."
+msgstr "ZeroMQ istemcisinden (%s bölümleri) yapılandırmaya dahil edildi."
+
+#: usr/local/sbin/gmirror_status_check.php:58
+#, php-format
+msgid "List of mirrors changed. Old: (%s) New: (%s)"
+msgstr ""
+
+#: usr/local/sbin/gmirror_status_check.php:65
+#, php-format
+msgid "Mirror %s status changed from %s to %s."
+msgstr ""
+
+#: usr/local/sbin/gmirror_status_check.php:70
+#, php-format
+msgid "Mirror %s consumer count changed from %d to %d."
+msgstr ""
+
+#: usr/local/sbin/gmirror_status_check.php:77
+#, php-format
+msgid "Mirror %s drive status changed. Old: (%s) New: (%s)"
+msgstr ""
+
+#: usr/local/www/bandwidth_by_ip.php:24
+msgid "Wrong Interface"
+msgstr "Hatalı Arabirim"
+
+#: usr/local/www/bandwidth_by_ip.php:119
+msgid "no info"
+msgstr "bilgi yok"
+
+#: usr/local/www/carp_status.php:72
+#, php-format
+msgid ""
+"%s IPs have been disabled. Please note that disabling does not survive a "
+"reboot."
+msgstr ""
+"%s IP kapatılmış durumda. Cihazı yeniden başlattığınızda tekrar "
+"etkinleştirileceklerini unutmayın."
+
+#: usr/local/www/carp_status.php:75
+msgid "CARP has been enabled."
+msgstr "CARP etkinleştirildi."
+
+#: usr/local/www/carp_status.php:99 usr/local/www/carp_status.php:148
+#: usr/local/www/diag_gmirror.php:221 usr/local/www/diag_ipsec.php:49
+#: usr/local/www/diag_ipsec.php:115 usr/local/www/diag_ipsec_leases.php:46
+#: usr/local/www/diag_ipsec_leases.php:89 usr/local/www/diag_ipsec_sad.php:50
+#: usr/local/www/diag_ipsec_spd.php:50 usr/local/www/diag_logs.php:66
+#: usr/local/www/diag_logs_auth.php:57 usr/local/www/diag_logs_dhcp.php:60
+#: usr/local/www/diag_logs_filter.php:123
+#: usr/local/www/diag_logs_filter_dynamic.php:62
+#: usr/local/www/diag_logs_filter_summary.php:35
+#: usr/local/www/diag_logs_gateways.php:67
+#: usr/local/www/diag_logs_ipsec.php:61 usr/local/www/diag_logs_ntpd.php:55
+#: usr/local/www/diag_logs_openvpn.php:46 usr/local/www/diag_logs_ppp.php:58
+#: usr/local/www/diag_logs_relayd.php:56
+#: usr/local/www/diag_logs_resolver.php:67
+#: usr/local/www/diag_logs_routing.php:55
+#: usr/local/www/diag_logs_settings.php:187 usr/local/www/diag_logs_vpn.php:45
+#: usr/local/www/diag_logs_wireless.php:57 usr/local/www/diag_pkglogs.php:86
+#: usr/local/www/easyrule.php:83 usr/local/www/fbegin.inc:324
+#: usr/local/www/pkg_mgr.php:198
+#: usr/local/www/status_captiveportal_expire.php:60
+#: usr/local/www/status_captiveportal_test.php:59
+#: usr/local/www/status_captiveportal_voucher_rolls.php:58
+#: usr/local/www/status_captiveportal_vouchers.php:58
+#: usr/local/www/status_dhcp_leases.php:50
+#: usr/local/www/status_dhcpv6_leases.php:51
+#: usr/local/www/status_filter_reload.php:45
+#: usr/local/www/status_gateway_groups.php:53
+#: usr/local/www/status_gateways.php:52 usr/local/www/status_gateways.php:79
+#: usr/local/www/status_graph.php:114 usr/local/www/status_graph_cpu.php:42
+#: usr/local/www/status_interfaces.php:60
+#: usr/local/www/status_interfaces.php:88 usr/local/www/status_lb_pool.php:63
+#: usr/local/www/status_lb_vs.php:57 usr/local/www/status_lb_vs.php:81
+#: usr/local/www/status_ntpd.php:164 usr/local/www/status_ntpd.php:178
+#: usr/local/www/status_openvpn.php:46 usr/local/www/status_openvpn.php:277
+#: usr/local/www/status_openvpn.php:340 usr/local/www/status_queues.php:124
+#: usr/local/www/status_rrd_graph.php:260
+#: usr/local/www/status_rrd_graph_settings.php:120
+#: usr/local/www/status_services.php:68 usr/local/www/status_services.php:86
+#: usr/local/www/status_upnp.php:59 usr/local/www/status_wireless.php:42
+#: usr/local/www/status_wireless.php:79
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:46
+msgid "Status"
+msgstr "Durum"
+
+#: usr/local/www/carp_status.php:99
+#: usr/local/www/firewall_virtual_ip_edit.php:389
+msgid "CARP"
+msgstr "CARP"
+
+#: usr/local/www/carp_status.php:110
+msgid ""
+"CARP has detected a problem and this unit has been demoted to BACKUP status."
+msgstr ""
+
+#: usr/local/www/carp_status.php:110
+msgid "Check link status on all interfaces with configured CARP VIPs."
+msgstr ""
+
+#: usr/local/www/carp_status.php:130
+msgid "Temporarily Disable CARP"
+msgstr ""
+
+#: usr/local/www/carp_status.php:133
+msgid "Enable CARP"
+msgstr ""
+
+#: usr/local/www/carp_status.php:136
+msgid "Leave Persistent CARP Maintenance Mode"
+msgstr ""
+
+#: usr/local/www/carp_status.php:138
+msgid "Enter Persistent CARP Maintenance Mode"
+msgstr ""
+
+#: usr/local/www/carp_status.php:146
+msgid "CARP Interface"
+msgstr "CARP Arabirimi"
+
+#: usr/local/www/carp_status.php:147 usr/local/www/firewall_nat_out.php:649
+#: usr/local/www/firewall_nat_out_edit.php:712
+#: usr/local/www/system_gateway_groups_edit.php:319
+msgid "Virtual IP"
+msgstr "Sanal IP"
+
+#: usr/local/www/carp_status.php:152
+msgid "Could not locate any defined CARP interfaces."
+msgstr "Tanımlı herhangi bir CARP arabirimi tespit edilememiştir."
+
+#: usr/local/www/carp_status.php:199 usr/local/www/diag_packet_capture.php:262
+#: usr/local/www/diag_packet_capture.php:348
+#: usr/local/www/firewall_shaper_layer7.php:66
+#: usr/local/www/interfaces_wireless.php:137 usr/local/www/pkg_edit.php:936
+#: usr/local/www/services_ntpd_pps.php:138 usr/local/www/status_graph.php:338
+#: usr/local/www/status_graph_cpu.php:54 usr/local/www/status_queues.php:187
+#: usr/local/www/vpn_ipsec.php:642 usr/local/www/vpn_ipsec_keys.php:180
+#: usr/local/www/vpn_ipsec_keys_edit.php:161
+#: usr/local/www/vpn_pppoe_edit.php:610 usr/local/www/vpn_pptp.php:487
+msgid "Note"
+msgstr "Not"
+
+#: usr/local/www/carp_status.php:201
+msgid "You can configure high availability sync settings"
+msgstr "Yüksek erişilebilirlik senkronize ayarlarını yapılandırabilirsiniz"
+
+#: usr/local/www/carp_status.php:201
+#: usr/local/www/firewall_shaper_layer7.php:67
+#: usr/local/www/firewall_virtual_ip.php:308 usr/local/www/interfaces.php:3490
+#: usr/local/www/interfaces.php:3499 usr/local/www/status_queues.php:189
+msgid "here"
+msgstr "burada"
+
+#: usr/local/www/carp_status.php:205
+msgid "pfSync nodes"
+msgstr "pfSync uçları"
+
+#: usr/local/www/crash_reporter.php:69
+msgid "Unfortunately we have detected a programming bug."
+msgstr "Ne yazıkki bir programlama hatası algılandı."
+
+#: usr/local/www/crash_reporter.php:70
+msgid ""
+"Would you like to submit the programming debug logs to the pfSense "
+"developers for inspection?"
+msgstr ""
+"İnceleme için pfSense geliştiricilerine programlama hata ayıklama kodlarını "
+"göndermek istermisiniz?"
+
+#: usr/local/www/crash_reporter.php:71
+msgid ""
+"Please double check the contents to ensure you are comfortable sending this "
+"information before clicking Yes."
+msgstr ""
+"Bu bilgilerin gönderilmesinde herhangi bir sakınca olmadığından emin olmak "
+"için içeriği inceleyip ondan sonra Evet'e tıklayınız."
+
+#: usr/local/www/crash_reporter.php:72
+msgid "Contents of crash reports"
+msgstr "Problem raporu içeriği"
+
+#: usr/local/www/crash_reporter.php:74 usr/local/www/diag_defaults.php:61
+#: usr/local/www/diag_defaults.php:71 usr/local/www/diag_defaults.php:83
+#: usr/local/www/halt.php:61 usr/local/www/halt.php:70
+#: usr/local/www/pkg.php:426 usr/local/www/reboot.php:55
+#: usr/local/www/reboot.php:65 usr/local/www/system_firmware.php:231
+msgid "Yes"
+msgstr "Evet"
+
+#: usr/local/www/crash_reporter.php:74
+msgid " - Submit this to the developers for inspection"
+msgstr " - İncelenmek üzere geliştiricilere gönder"
+
+#: usr/local/www/crash_reporter.php:75 usr/local/www/diag_defaults.php:48
+#: usr/local/www/diag_defaults.php:84 usr/local/www/halt.php:50
+#: usr/local/www/halt.php:71 usr/local/www/pkg.php:424
+#: usr/local/www/reboot.php:44 usr/local/www/reboot.php:66
+#: usr/local/www/system_firmware.php:232
+msgid "No"
+msgstr "Hayır"
+
+#: usr/local/www/crash_reporter.php:75
+msgid " - Just delete the crash report and take me back to the Dashboard"
+msgstr "- Hata raporunu temizle ve anasayfaya geri dön"
+
+#: usr/local/www/crash_reporter.php:79 usr/local/www/diag_arp.php:262
+#: usr/local/www/diag_authentication.php:69 usr/local/www/diag_backup.php:593
+#: usr/local/www/diag_confbak.php:110 usr/local/www/diag_defaults.php:53
+#: usr/local/www/diag_dns.php:35 usr/local/www/diag_dump_states.php:72
+#: usr/local/www/diag_dump_states_sources.php:66
+#: usr/local/www/diag_gmirror.php:46 usr/local/www/diag_nanobsd.php:50
+#: usr/local/www/diag_ndp.php:107 usr/local/www/diag_packet_capture.php:88
+#: usr/local/www/diag_patterns.php:63 usr/local/www/diag_ping.php:47
+#: usr/local/www/diag_resetstate.php:65 usr/local/www/diag_routes.php:71
+#: usr/local/www/diag_smart.php:18 usr/local/www/diag_sockets.php:45
+#: usr/local/www/diag_states_summary.php:187 usr/local/www/diag_tables.php:45
+#: usr/local/www/diag_testport.php:49 usr/local/www/diag_traceroute.php:47
+#: usr/local/www/edit.php:42 usr/local/www/exec.php:96
+#: usr/local/www/fbegin.inc:332 usr/local/www/halt.php:55
+#: usr/local/www/reboot.php:49 usr/local/www/system_firmware_auto.php:62
+#: usr/local/www/system_firmware_restorefullbackup.php:105
+msgid "Diagnostics"
+msgstr "Araçlar"
+
+#: usr/local/www/crash_reporter.php:79
+msgid "Crash reporter"
+msgstr "Hata raporlayıcısı"
+
+#: usr/local/www/crash_reporter.php:100
+msgid "Processing..."
+msgstr "İşleniyor..."
+
+#: usr/local/www/crash_reporter.php:109
+msgid "Uploading..."
+msgstr "Yükleniyor..."
+
+#: usr/local/www/crash_reporter.php:119
+#: usr/local/www/services_captiveportal_zones_edit.php:116
+msgid "Continue"
+msgstr "Devam et"
+
+#: usr/local/www/crash_reporter.php:119
+msgid " and delete crash report files from local disk."
+msgstr " ve hata raporu dosyalarını diskten sil."
+
+#: usr/local/www/diag_arp.php:262 usr/local/www/fbegin.inc:206
+msgid "ARP Table"
+msgstr "ARP Tablosu"
+
+#: usr/local/www/diag_arp.php:272 usr/local/www/diag_ndp.php:117
+#: usr/local/www/firewall_rules.php:300
+msgid "Loading, please wait..."
+msgstr "Yükleniyor, lütfen bekleyiniz..."
+
+#: usr/local/www/diag_arp.php:315 usr/local/www/diag_ndp.php:134
+#: usr/local/www/interfaces.php:1694
+#: usr/local/www/services_captiveportal_mac.php:170
+#: usr/local/www/services_captiveportal_mac_edit.php:102
+#: usr/local/www/services_captiveportal_mac_edit.php:205
+#: usr/local/www/services_dhcp.php:1247
+#: usr/local/www/services_dhcp_edit.php:374 usr/local/www/services_wol.php:145
+#: usr/local/www/services_wol.php:163 usr/local/www/services_wol_edit.php:86
+#: usr/local/www/services_wol_edit.php:144
+#: usr/local/www/status_captiveportal.php:158
+#: usr/local/www/status_dhcp_leases.php:332
+#: usr/local/www/status_interfaces.php:246
+msgid "MAC address"
+msgstr "MAC adresi"
+
+#: usr/local/www/diag_arp.php:316 usr/local/www/diag_ndp.php:135
+#: usr/local/www/interfaces.php:2004
+#: usr/local/www/services_captiveportal_hostname.php:126
+#: usr/local/www/services_captiveportal_hostname_edit.php:179
+#: usr/local/www/services_captiveportal_hostname_edit.php:183
+#: usr/local/www/services_dhcp.php:1249
+#: usr/local/www/services_dhcp_edit.php:404
+#: usr/local/www/services_dhcpv6.php:860
+#: usr/local/www/services_dhcpv6_edit.php:220
+#: usr/local/www/services_dyndns.php:88
+#: usr/local/www/services_dyndns_edit.php:100
+#: usr/local/www/services_dyndns_edit.php:312
+#: usr/local/www/services_rfc2136.php:82
+#: usr/local/www/services_rfc2136_edit.php:74
+#: usr/local/www/services_rfc2136_edit.php:152
+#: usr/local/www/status_dhcp_leases.php:333 usr/local/www/system.php:108
+#: usr/local/www/system.php:312
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:83
+msgid "Hostname"
+msgstr "Host adı"
+
+#: usr/local/www/diag_arp.php:317 usr/local/www/diag_logs_filter.php:203
+#: usr/local/www/diag_logs_filter.php:237 usr/local/www/diag_ndp.php:136
+#: usr/local/www/diag_packet_capture.php:243
+#: usr/local/www/firewall_nat_1to1.php:182
+#: usr/local/www/firewall_nat_1to1_edit.php:117
+#: usr/local/www/firewall_nat_1to1_edit.php:295
+#: usr/local/www/firewall_nat_edit.php:197
+#: usr/local/www/firewall_nat_edit.php:200
+#: usr/local/www/firewall_nat_edit.php:495
+#: usr/local/www/firewall_nat_npt.php:107
+#: usr/local/www/firewall_nat_npt_edit.php:108
+#: usr/local/www/firewall_nat_npt_edit.php:173
+#: usr/local/www/firewall_nat_out.php:305
+#: usr/local/www/firewall_nat_out.php:542
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_nat_out_edit.php:469
+#: usr/local/www/firewall_rules_edit.php:906
+#: usr/local/www/firewall_virtual_ip.php:240
+#: usr/local/www/firewall_virtual_ip_edit.php:397
+#: usr/local/www/interfaces_assign.php:482
+#: usr/local/www/interfaces_bridge.php:118
+#: usr/local/www/interfaces_gif.php:112 usr/local/www/interfaces_gre.php:113
+#: usr/local/www/interfaces_groups_edit.php:276
+#: usr/local/www/interfaces_lagg.php:118 usr/local/www/interfaces_ppps.php:110
+#: usr/local/www/interfaces_qinq.php:121 usr/local/www/interfaces_vlan.php:115
+#: usr/local/www/interfaces_wireless.php:110
+#: usr/local/www/services_captiveportal.php:211
+#: usr/local/www/services_dhcp_relay.php:73
+#: usr/local/www/services_dhcpv6_relay.php:74
+#: usr/local/www/services_dyndns.php:86
+#: usr/local/www/services_igmpproxy_edit.php:166
+#: usr/local/www/services_wol.php:131 usr/local/www/services_wol.php:162
+#: usr/local/www/services_wol_edit.php:86
+#: usr/local/www/services_wol_edit.php:130 usr/local/www/status_graph.php:208
+#: usr/local/www/system_gateways.php:218
+#: usr/local/www/system_gateways_edit.php:114
+#: usr/local/www/system_gateways_edit.php:655
+#: usr/local/www/system_routes.php:236 usr/local/www/vpn_ipsec_phase1.php:610
+#: usr/local/www/vpn_l2tp.php:309 usr/local/www/vpn_openvpn_client.php:530
+#: usr/local/www/vpn_openvpn_server.php:850 usr/local/www/vpn_pppoe.php:104
+#: usr/local/www/vpn_pppoe_edit.php:383
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:45
+msgid "Interface"
+msgstr "Arabirim"
+
+# takip eden 5642 ve 5643 le beraber kullanılıyor
+#: usr/local/www/diag_arp.php:343
+msgid "NOTE: Local IPv6 peers use"
+msgstr "NOT: Yerel IPv6 eşler için"
+
+#: usr/local/www/diag_arp.php:343
+msgid "NDP"
+msgstr "NDP"
+
+# 5641 ve 5642 ile beraber kullanılıyor. (technical)
+#: usr/local/www/diag_arp.php:343
+msgid "instead of ARP"
+msgstr "yerine ARP kullanın"
+
+#: usr/local/www/diag_authentication.php:52
+msgid "is not a valid authentication server"
+msgstr "geçerli bir kimlik doğrulama sunucusu değil"
+
+#: usr/local/www/diag_authentication.php:55
+msgid "A username and password must be specified."
+msgstr "Bir kullanıcı adı ve parola tanımlanmalıdır."
+
+#: usr/local/www/diag_authentication.php:59
+#: usr/local/www/diag_logs_vpn.php:177
+#: usr/local/www/system_groupmanager.php:533
+#: usr/local/www/system_usermanager.php:99
+#: usr/local/www/system_usermanager.php:959
+#: usr/local/www/vpn_l2tp_users_edit.php:39
+#: usr/local/www/vpn_pptp_users_edit.php:138
+msgid "User"
+msgstr "Kullanıcı"
+
+#: usr/local/www/diag_authentication.php:59
+msgid "authenticated successfully."
+msgstr "kimliği başarıyla doğrulandı."
+
+#: usr/local/www/diag_authentication.php:61
+msgid "This user is a member of these groups"
+msgstr "Bu kullanıcı belirtilen belirtilen üyesidir"
+
+#: usr/local/www/diag_authentication.php:65
+msgid "Authentication failed."
+msgstr "Kimlik doğrulama başarısız."
+
+#: usr/local/www/diag_authentication.php:69 usr/local/www/fbegin.inc:207
+#: usr/local/www/interfaces.php:3238
+#: usr/local/www/services_captiveportal.php:662
+#: usr/local/www/services_captiveportal.php:1039
+msgid "Authentication"
+msgstr "Kimlik doğrulama"
+
+#: usr/local/www/diag_authentication.php:91
+#: usr/local/www/system_authservers.php:85
+#: usr/local/www/system_usermanager_settings.php:141
+msgid "Authentication Server"
+msgstr "Kimlik Doğrulama Sunucusu"
+
+#: usr/local/www/diag_authentication.php:107
+#: usr/local/www/firewall_aliases_edit.php:602
+#: usr/local/www/interfaces.php:2619 usr/local/www/interfaces.php:2693
+#: usr/local/www/interfaces.php:2802
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+#: usr/local/www/interfaces_ppps_edit.php:523
+#: usr/local/www/services_dyndns_edit.php:104
+#: usr/local/www/services_dyndns_edit.php:356
+#: usr/local/www/status_captiveportal.php:159
+#: usr/local/www/system_usermanager.php:205
+#: usr/local/www/system_usermanager.php:210
+#: usr/local/www/system_usermanager.php:215
+#: usr/local/www/system_usermanager.php:533
+#: usr/local/www/system_usermanager.php:904
+#: usr/local/www/vpn_l2tp_users.php:103
+#: usr/local/www/vpn_l2tp_users_edit.php:83
+#: usr/local/www/vpn_l2tp_users_edit.php:86
+#: usr/local/www/vpn_l2tp_users_edit.php:159
+#: usr/local/www/vpn_openvpn_client.php:621
+#: usr/local/www/vpn_openvpn_client.php:685
+#: usr/local/www/vpn_pppoe_edit.php:548 usr/local/www/vpn_pptp_users.php:100
+#: usr/local/www/vpn_pptp_users_edit.php:79
+#: usr/local/www/vpn_pptp_users_edit.php:82
+#: usr/local/www/vpn_pptp_users_edit.php:150
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:107
+msgid "Username"
+msgstr "Kullanıcı adı"
+
+#: usr/local/www/diag_authentication.php:113 usr/local/www/interfaces.php:2625
+#: usr/local/www/interfaces.php:2699 usr/local/www/interfaces.php:2808
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+#: usr/local/www/interfaces_ppps_edit.php:529
+#: usr/local/www/services_dyndns_edit.php:102
+#: usr/local/www/services_dyndns_edit.php:365
+#: usr/local/www/system_advanced_notifications.php:232
+#: usr/local/www/system_usermanager.php:211
+#: usr/local/www/system_usermanager.php:216
+#: usr/local/www/system_usermanager.php:540
+#: usr/local/www/system_usermanager_passwordmg.php:51
+#: usr/local/www/system_usermanager_passwordmg.php:111
+#: usr/local/www/system_usermanager_passwordmg.php:115
+#: usr/local/www/vpn_l2tp_users_edit.php:86
+#: usr/local/www/vpn_l2tp_users_edit.php:165
+#: usr/local/www/vpn_openvpn_client.php:631
+#: usr/local/www/vpn_openvpn_client.php:695
+#: usr/local/www/vpn_pppoe_edit.php:549
+#: usr/local/www/vpn_pptp_users_edit.php:82
+#: usr/local/www/vpn_pptp_users_edit.php:156
+msgid "Password"
+msgstr "Parola"
+
+#: usr/local/www/diag_authentication.php:121 usr/local/www/diag_smart.php:370
+#: usr/local/www/diag_testport.php:181
+msgid "Test"
+msgstr "Test"
+
+#: usr/local/www/diag_backup.php:162
+msgid "Restored base_package menus after configuration restore."
+msgstr "Yapılandırmaya geri dönüldükten sonra temel_paket menüleri yüklendi."
+
+#: usr/local/www/diag_backup.php:181 usr/local/www/fbegin.inc:128
+#: usr/local/www/firewall_aliases.php:157
+#: usr/local/www/firewall_aliases_edit.php:53
+#: usr/local/www/firewall_aliases_import.php:50
+#: usr/local/www/firewall_aliases_import.php:68
+#: usr/local/www/services_dnsmasq_edit.php:244
+#: usr/local/www/services_unbound_host_edit.php:247
+msgid "Aliases"
+msgstr "Gruplar"
+
+#: usr/local/www/diag_backup.php:183
+msgid "Captive Portal Vouchers"
+msgstr "Hizmet Portalı Biletleri"
+
+#: usr/local/www/diag_backup.php:185 usr/local/www/fbegin.inc:144
+msgid "DHCP Server"
+msgstr "DHCP Sunucu"
+
+#: usr/local/www/diag_backup.php:186 usr/local/www/services_dhcpv6.php:533
+#: usr/local/www/services_dhcpv6.php:543
+#: usr/local/www/services_router_advertisements.php:262
+msgid "DHCPv6 Server"
+msgstr "DHCPv6 Sunucu"
+
+#: usr/local/www/diag_backup.php:187
+msgid "Firewall Rules"
+msgstr "Güvenlik Duvarı Kuralları"
+
+#: usr/local/www/diag_backup.php:188
+#: usr/local/www/diag_logs_filter_summary.php:48 usr/local/www/fbegin.inc:180
+#: usr/local/www/fbegin.inc:292 usr/local/www/interfaces.php:1406
+#: usr/local/www/interfaces_assign.php:44
+#: usr/local/www/interfaces_bridge.php:87
+#: usr/local/www/interfaces_bridge_edit.php:240
+#: usr/local/www/interfaces_gif.php:81
+#: usr/local/www/interfaces_gif_edit.php:136
+#: usr/local/www/interfaces_gre.php:82
+#: usr/local/www/interfaces_gre_edit.php:130
+#: usr/local/www/interfaces_groups.php:64
+#: usr/local/www/interfaces_groups_edit.php:45
+#: usr/local/www/interfaces_lagg.php:87
+#: usr/local/www/interfaces_lagg_edit.php:137
+#: usr/local/www/interfaces_ppps_edit.php:389
+#: usr/local/www/interfaces_qinq.php:90
+#: usr/local/www/interfaces_qinq_edit.php:40
+#: usr/local/www/interfaces_vlan.php:84
+#: usr/local/www/interfaces_vlan_edit.php:152
+#: usr/local/www/interfaces_wireless.php:79
+#: usr/local/www/interfaces_wireless_edit.php:151
+#: usr/local/www/services_captiveportal.php:523
+#: usr/local/www/services_captiveportal_zones.php:81
+#: usr/local/www/services_dnsmasq.php:269
+#: usr/local/www/status_interfaces.php:60
+msgid "Interfaces"
+msgstr "Arabirimler"
+
+#: usr/local/www/diag_backup.php:189
+msgid "IPSEC"
+msgstr "IPSEC"
+
+#: usr/local/www/diag_backup.php:190 usr/local/www/fbegin.inc:129
+#: usr/local/www/firewall_nat.php:167 usr/local/www/firewall_nat_1to1.php:148
+#: usr/local/www/firewall_nat_1to1_edit.php:227
+#: usr/local/www/firewall_nat_edit.php:457
+#: usr/local/www/firewall_nat_npt.php:81
+#: usr/local/www/firewall_nat_npt_edit.php:148
+#: usr/local/www/firewall_nat_out.php:214
+#: usr/local/www/firewall_nat_out_edit.php:343
+#: usr/local/www/firewall_virtual_ip.php:307
+msgid "NAT"
+msgstr "NAT"
+
+#: usr/local/www/diag_backup.php:192 usr/local/www/fbegin.inc:437
+#: usr/local/www/pkg_mgr.php:59 usr/local/www/pkg_mgr.php:106
+#: usr/local/www/pkg_mgr_install.php:58 usr/local/www/pkg_mgr_installed.php:52
+#: usr/local/www/pkg_mgr_installed.php:81
+msgid "Package Manager"
+msgstr "Paket Yöneticisi"
+
+#: usr/local/www/diag_backup.php:193
+msgid "PPTP Server"
+msgstr "PPTP Sunucusu"
+
+#: usr/local/www/diag_backup.php:194
+msgid "RRD Data"
+msgstr "RRD Veri"
+
+#: usr/local/www/diag_backup.php:195
+msgid "Scheduled Tasks"
+msgstr "Zamanlanmış Görevler"
+
+#: usr/local/www/diag_backup.php:196
+msgid "Syslog"
+msgstr "Syslog"
+
+#: usr/local/www/diag_backup.php:197 usr/local/www/diag_logs.php:78
+#: usr/local/www/diag_logs_auth.php:69 usr/local/www/diag_logs_dhcp.php:72
+#: usr/local/www/diag_logs_filter.php:135
+#: usr/local/www/diag_logs_filter_dynamic.php:100
+#: usr/local/www/diag_logs_filter_summary.php:189
+#: usr/local/www/diag_logs_gateways.php:80
+#: usr/local/www/diag_logs_ipsec.php:73 usr/local/www/diag_logs_ntpd.php:67
+#: usr/local/www/diag_logs_openvpn.php:71 usr/local/www/diag_logs_ppp.php:69
+#: usr/local/www/diag_logs_relayd.php:68
+#: usr/local/www/diag_logs_resolver.php:80
+#: usr/local/www/diag_logs_routing.php:67
+#: usr/local/www/diag_logs_settings.php:267
+#: usr/local/www/diag_logs_vpn.php:127 usr/local/www/diag_logs_wireless.php:69
+#: usr/local/www/fbegin.inc:284 usr/local/www/fbegin.inc:437
+#: usr/local/www/pkg_mgr.php:59 usr/local/www/pkg_mgr.php:106
+#: usr/local/www/pkg_mgr_install.php:58 usr/local/www/pkg_mgr_installed.php:52
+#: usr/local/www/pkg_mgr_installed.php:81
+#: usr/local/www/pkg_mgr_settings.php:63
+#: usr/local/www/status_rrd_graph.php:416
+#: usr/local/www/status_rrd_graph_img.php:44
+#: usr/local/www/status_rrd_graph_settings.php:54
+#: usr/local/www/status_rrd_graph_settings.php:135 usr/local/www/system.php:76
+#: usr/local/www/system.php:289 usr/local/www/system.php:309
+#: usr/local/www/system_advanced_admin.php:275
+#: usr/local/www/system_advanced_firewall.php:233
+#: usr/local/www/system_advanced_misc.php:245
+#: usr/local/www/system_advanced_network.php:154
+#: usr/local/www/system_advanced_notifications.php:164
+#: usr/local/www/system_advanced_sysctl.php:135
+#: usr/local/www/system_authservers.php:45
+#: usr/local/www/system_camanager.php:52
+#: usr/local/www/system_certmanager.php:58
+#: usr/local/www/system_crlmanager.php:47
+#: usr/local/www/system_firmware.php:103 usr/local/www/system_firmware.php:202
+#: usr/local/www/system_firmware_check.php:50
+#: usr/local/www/system_firmware_settings.php:87
+#: usr/local/www/system_gateway_groups.php:99
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/system_gateways.php:182
+#: usr/local/www/system_gateways_edit.php:523
+#: usr/local/www/system_groupmanager.php:53
+#: usr/local/www/system_groupmanager_addprivs.php:57
+#: usr/local/www/system_hasync.php:101 usr/local/www/system_routes.php:199
+#: usr/local/www/system_routes_edit.php:212
+#: usr/local/www/system_usermanager.php:58
+#: usr/local/www/system_usermanager_passwordmg.php:44
+#: usr/local/www/system_usermanager_settings.php:50
+msgid "System"
+msgstr "Sistem"
+
+#: usr/local/www/diag_backup.php:198
+msgid "Static routes"
+msgstr "Statik yönlendirmeler"
+
+#: usr/local/www/diag_backup.php:199
+msgid "System tunables"
+msgstr "Sistem değişkenleri"
+
+#: usr/local/www/diag_backup.php:200
+msgid "SNMP Server"
+msgstr "SNMP Sunucu"
+
+#: usr/local/www/diag_backup.php:201 usr/local/www/fbegin.inc:132
+#: usr/local/www/firewall_shaper.php:55
+#: usr/local/www/firewall_shaper_layer7.php:60
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_wizards.php:74
+msgid "Traffic Shaper"
+msgstr "Trafik Şekillendirme"
+
+#: usr/local/www/diag_backup.php:202
+msgid "VLANS"
+msgstr "VLANlar"
+
+#: usr/local/www/diag_backup.php:203 usr/local/www/fbegin.inc:159
+#: usr/local/www/services_wol.php:116 usr/local/www/services_wol.php:128
+#: usr/local/www/services_wol_edit.php:116
+msgid "Wake on LAN"
+msgstr "Lan ile Uyan"
+
+#: usr/local/www/diag_backup.php:207
+msgid "ALL"
+msgstr "TÜMÜ"
+
+#: usr/local/www/diag_backup.php:248 usr/local/www/diag_backup.php:715
+#: usr/local/www/diag_backup.php:752
+msgid "Restore configuration"
+msgstr "Yapılandırmaya geri dön"
+
+#: usr/local/www/diag_backup.php:250
+msgid "Reinstall"
+msgstr "Tekrar kur"
+
+#: usr/local/www/diag_backup.php:252 usr/local/www/diag_backup.php:774
+msgid "Clear Package Lock"
+msgstr "Paket Kilidini Temizle"
+
+#: usr/local/www/diag_backup.php:254 usr/local/www/diag_tables.php:157
+#: usr/local/www/diag_tables.php:166 usr/local/www/exec.php:279
+#: usr/local/www/exec.php:289
+#: usr/local/www/system_firmware_restorefullbackup.php:167
+msgid "Download"
+msgstr "İndir"
+
+#: usr/local/www/diag_backup.php:256
+msgid "Restore version"
+msgstr "Sürümü geri yükle"
+
+#: usr/local/www/diag_backup.php:271
+msgid "You must supply and confirm the password for encryption."
+msgstr "Şifreleme için parola belirleyip onaylamalısınız."
+
+#: usr/local/www/diag_backup.php:273 usr/local/www/diag_backup.php:350
+msgid "The supplied 'Password' and 'Confirm' field values must match."
+msgstr "Belirtilen 'Parola' ve 'Onay' alanları aynı olmalıdır."
+
+#: usr/local/www/diag_backup.php:348
+msgid "You must supply and confirm the password for decryption."
+msgstr "Şifre çözümleme için parola belirleyip onaylamalısınız."
+
+#: usr/local/www/diag_backup.php:360
+#, php-format
+msgid "Warning, could not read file %s"
+msgstr "Uyarı, %s dosyası okunamadı"
+
+#: usr/local/www/diag_backup.php:366
+msgid ""
+"The uploaded file does not appear to contain an encrypted pfsense "
+"configuration."
+msgstr ""
+"Görünüşe göre yüklenen dosya şifrelenmiş bir pfSense yapılandırma dosyası "
+"değil."
+
+#: usr/local/www/diag_backup.php:373
+msgid "Upgrading m0n0wall configuration to pfsense."
+msgstr "M0n0wall yapılandırması pfSense'ye yükseltiliyor."
+
+#: usr/local/www/diag_backup.php:381 usr/local/www/diag_backup.php:384
+msgid ""
+"You have selected to restore an area but we could not locate the correct xml "
+"tag."
+msgstr ""
+"Yapılandırmanın sadece belirli bir kısmını geri yüklemeyi seçtiniz ancak "
+"yüklenen yapılandırma dosyasında gerekli bölüm bulunamadı."
+
+#: usr/local/www/diag_backup.php:396
+msgid ""
+"The configuration area has been restored. You may need to reboot the "
+"firewall."
+msgstr ""
+"apılandırmanın seçilen kısmına geri dönüldü. Sistemi yeniden başlatmanız "
+"gerekebilir."
+
+#: usr/local/www/diag_backup.php:401
+#, php-format
+msgid ""
+"You have selected to restore the full configuration but we could not locate "
+"a %s tag."
+msgstr "Tüm yapılandırmayı geri yüklemeyi seçtiniz fakat %s takısı bulunamadı."
+
+#: usr/local/www/diag_backup.php:527
+msgid "The m0n0wall configuration has been restored and upgraded to pfSense."
+msgstr "m0n0wall yapılandırması pfSense'ye geri yüklendi ve güncellendi."
+
+#: usr/local/www/diag_backup.php:555 usr/local/www/diag_backup.php:579
+msgid "The configuration could not be restored."
+msgstr "Yapılandırmaya geri dönülemedi."
+
+#: usr/local/www/diag_backup.php:560
+msgid "The configuration could not be restored (file upload error)."
+msgstr "Yapılandırma geri alınamadı (dosya yükleme hatası)."
+
+#: usr/local/www/diag_backup.php:573
+msgid ""
+"XXX - this feature may hose your config (do NOT backrev configs!) - billm"
+msgstr ""
+"XXX - bu özellik yapılandımanızı bozabilir. (eski versiyon yapılandırması "
+"OLMASIN!) - billm"
+
+#: usr/local/www/diag_backup.php:582
+msgid "No version selected."
+msgstr "Sürüm seçimi yapılmadı."
+
+#: usr/local/www/diag_backup.php:593
+msgid "Backup/restore"
+msgstr "Yedekle/geri dön"
+
+#: usr/local/www/diag_backup.php:636
+#: usr/local/www/system_firmware_restorefullbackup.php:117
+msgid "The firewall configuration has been changed."
+msgstr "Güvenlik Duvarı yapılandırması değiştirildi."
+
+#: usr/local/www/diag_backup.php:636
+#: usr/local/www/system_firmware_restorefullbackup.php:117
+msgid "The firewall is now rebooting."
+msgstr "Güvenlik Duvarı yeniden başlatılıyor."
+
+#: usr/local/www/diag_backup.php:645 usr/local/www/diag_confbak.php:151
+msgid "Config History"
+msgstr "Yapılandırma Geçmişi"
+
+#: usr/local/www/diag_backup.php:646 usr/local/www/diag_confbak.php:152
+#: usr/local/www/fbegin.inc:208
+msgid "Backup/Restore"
+msgstr "Yedekle/Geri Dön"
+
+# Cümle sonunda " unutulmuş!
+#: usr/local/www/diag_backup.php:656
+msgid "Backup configuration"
+msgstr "Yapılandırmayı yedekle"
+
+#: usr/local/www/diag_backup.php:661
+msgid "Click this button to download the system configuration in XML format."
+msgstr ""
+"Sistem yapılandırmasını XML biçiminde indirmek için bu düğmeye tıklayın."
+
+#: usr/local/www/diag_backup.php:661
+msgid "Backup area:"
+msgstr "Yedekleme alanı:"
+
+#: usr/local/www/diag_backup.php:668
+msgid "Do not backup package information."
+msgstr "Paket bilgisini yedekleme."
+
+#: usr/local/www/diag_backup.php:678
+msgid "Encrypt this configuration file."
+msgstr "Bu yapılandırma dosyasını şifrele."
+
+#: usr/local/www/diag_backup.php:686
+msgid ""
+"Do not backup RRD data (NOTE: RRD Data can consume 4+ megabytes of config."
+"xml space!)"
+msgstr ""
+"RRD verisini yedekleme. (RRD verisi 4MB'dan fazla alana ihtiyaç duyar!)"
+
+#: usr/local/www/diag_backup.php:701
+msgid "confirm:"
+msgstr "onayla:"
+
+# İndir büyük harfle yazılmalı aksi halde XML yedeği alınamaz. A.Y.
+#: usr/local/www/diag_backup.php:708
+msgid "Download configuration"
+msgstr "Yapılandırmayı İndir"
+
+#: usr/local/www/diag_backup.php:720
+msgid "Open a"
+msgstr "Bir "
+
+#: usr/local/www/diag_backup.php:720
+msgid ""
+"configuration XML file and click the button below to restore the "
+"configuration."
+msgstr ""
+"yapılandırma yedeğini aşağıda seçip yükleyerek o yapılandırmaya "
+"dönebilirsiniz."
+
+#: usr/local/www/diag_backup.php:722
+msgid "Restore area:"
+msgstr "Geri yüklenecek alan:"
+
+#: usr/local/www/diag_backup.php:730
+msgid "Configuration file is encrypted."
+msgstr "Yapılandırma dosyası şifreli."
+
+#: usr/local/www/diag_backup.php:737
+msgid "Password :"
+msgstr "Parola :"
+
+#: usr/local/www/diag_backup.php:745
+msgid "confirm :"
+msgstr "onayla :"
+
+#: usr/local/www/diag_backup.php:753 usr/local/www/diag_ipsec.php:498
+#: usr/local/www/diag_ipsec_leases.php:125
+#: usr/local/www/diag_ipsec_sad.php:135 usr/local/www/diag_ipsec_spd.php:132
+#: usr/local/www/diag_logs_settings.php:469
+#: usr/local/www/diag_packet_capture.php:339 usr/local/www/diag_routes.php:207
+#: usr/local/www/firewall_aliases.php:291
+#: usr/local/www/firewall_nat_1to1.php:339
+#: usr/local/www/firewall_nat_out.php:637
+#: usr/local/www/firewall_schedule.php:241
+#: usr/local/www/firewall_virtual_ip.php:306
+#: usr/local/www/firewall_virtual_ip_edit.php:520
+#: usr/local/www/interfaces.php:2749 usr/local/www/interfaces_bridge.php:155
+#: usr/local/www/interfaces_bridge_edit.php:467
+#: usr/local/www/interfaces_bridge_edit.php:511
+#: usr/local/www/interfaces_bridge_edit.php:555
+#: usr/local/www/interfaces_gif.php:138 usr/local/www/interfaces_gre.php:139
+#: usr/local/www/interfaces_groups.php:150
+#: usr/local/www/interfaces_lagg.php:144
+#: usr/local/www/interfaces_ppps_edit.php:633
+#: usr/local/www/interfaces_qinq.php:156 usr/local/www/interfaces_vlan.php:141
+#: usr/local/www/load_balancer_virtual_server_edit.php:289
+#: usr/local/www/services_captiveportal.php:1087
+#: usr/local/www/services_captiveportal_filemanager.php:213
+#: usr/local/www/services_captiveportal_hostname.php:175
+#: usr/local/www/services_captiveportal_ip.php:172
+#: usr/local/www/services_captiveportal_mac.php:215
+#: usr/local/www/services_captiveportal_vouchers.php:642
+#: usr/local/www/services_dhcp.php:1007 usr/local/www/services_dhcp.php:1032
+#: usr/local/www/services_dhcp.php:1227 usr/local/www/services_dhcpv6.php:688
+#: usr/local/www/services_dhcpv6.php:840
+#: usr/local/www/services_dnsmasq.php:323
+#: usr/local/www/services_dyndns.php:189
+#: usr/local/www/services_dyndns_edit.php:317
+#: usr/local/www/services_dyndns_edit.php:434
+#: usr/local/www/services_igmpproxy.php:161
+#: usr/local/www/services_rfc2136_edit.php:224
+#: usr/local/www/services_unbound.php:394 usr/local/www/services_wol.php:211
+#: usr/local/www/status_rrd_graph_settings.php:247
+#: usr/local/www/system_advanced_network.php:268
+#: usr/local/www/system_advanced_network.php:279
+#: usr/local/www/system_advanced_network.php:290
+#: usr/local/www/system_gateway_groups.php:206
+#: usr/local/www/system_routes.php:372 usr/local/www/vpn_l2tp.php:456
+msgid "Note:"
+msgstr "Not:"
+
+#: usr/local/www/diag_backup.php:753
+msgid "The firewall will reboot after restoring the configuration."
+msgstr ""
+"Güvenlik duvarı yapılandırmayı sistem yükledikten sonra tekrar başlatılacak."
+
+#: usr/local/www/diag_backup.php:761
+msgid "Package Functions"
+msgstr "Paket Fonksiyonları"
+
+#: usr/local/www/diag_backup.php:767
+msgid ""
+"Click this button to reinstall all system packages. This may take a while."
+msgstr ""
+"Tüm sistem paketlerini yeniden kurmak için bu düğmeye tıklayınız. Bu işlem "
+"biraz zaman alabilir."
+
+#: usr/local/www/diag_backup.php:768
+msgid "Reinstall packages"
+msgstr "Paketleri tekrar kur"
+
+#: usr/local/www/diag_backup.php:773
+msgid ""
+"Click this button to clear the package lock if a package fails to reinstall "
+"properly after an upgrade."
+msgstr ""
+"Eğer yükseltme işleminden sonra paketin yeniden kurulumu başarılı olmazsa "
+"paket kilidini temizlemek için bu düğmeye tıklayın."
+
+#: usr/local/www/diag_confbak.php:55 usr/local/www/diag_confbak.php:185
+#: usr/local/www/diag_gmirror.php:74 usr/local/www/diag_gmirror.php:204
+msgid "Confirm"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:64
+#, php-format
+msgid "Successfully reverted to timestamp %1$s with description \"%2$s\"."
+msgstr ""
+"\"%2$s\" tanımlamasını taşıyan %1$s zaman damgasına başarıyla geri dönüldü."
+
+#: usr/local/www/diag_confbak.php:64 usr/local/www/diag_confbak.php:70
+#: usr/local/www/diag_confbak.php:123 usr/local/www/diag_confbak.php:184
+#: usr/local/www/diag_confbak.php:231 usr/local/www/diag_confbak.php:241
+#: usr/local/www/firewall_nat_edit.php:876
+#: usr/local/www/firewall_nat_edit.php:884
+#: usr/local/www/firewall_nat_out_edit.php:805
+#: usr/local/www/firewall_nat_out_edit.php:816
+#: usr/local/www/firewall_rules_edit.php:1721
+#: usr/local/www/firewall_rules_edit.php:1729
+msgid "n/j/y H:i:s"
+msgstr "n/j/y H:i:s"
+
+#: usr/local/www/diag_confbak.php:66
+msgid "Unable to revert to the selected configuration."
+msgstr "Seçilen yapılandırmaya geri dönülemedi."
+
+#: usr/local/www/diag_confbak.php:70
+#, php-format
+msgid "Deleted backup with timestamp %1$s and description \"%2$s\"."
+msgstr "\"%2$s\" tanımlamalı ve %1$s zaman damgalı yedek silindi."
+
+#: usr/local/www/diag_confbak.php:110
+msgid "Configuration History"
+msgstr "Yapılandırma Geçmişi"
+
+#: usr/local/www/diag_confbak.php:123
+msgid "Configuration diff from"
+msgstr "Yapılandırma farkı"
+
+#: usr/local/www/diag_confbak.php:123 usr/local/www/diag_dump_states.php:213
+#: usr/local/www/diag_dump_states_sources.php:182
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_nat_edit.php:755
+#: usr/local/www/services_captiveportal_hostname.php:181
+#: usr/local/www/services_dhcp.php:864 usr/local/www/services_dhcpv6.php:606
+#: usr/local/www/services_dhcpv6.php:613
+msgid "to"
+msgstr "ile"
+
+#: usr/local/www/diag_confbak.php:165 usr/local/www/diag_gmirror.php:186
+msgid "Confirm Action"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:171 usr/local/www/diag_gmirror.php:191
+msgid "Please confirm the selected action"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:173 usr/local/www/diag_gmirror.php:193
+#: usr/local/www/diag_logs_filter.php:174 usr/local/www/diag_logs_vpn.php:176
+#: usr/local/www/firewall_rules_edit.php:836
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:485
+#: usr/local/www/services_captiveportal_mac_edit.php:102
+#: usr/local/www/services_captiveportal_mac_edit.php:186
+#: usr/local/www/services_unbound_acls.php:215
+#: usr/local/www/services_unbound_acls.php:322
+msgid "Action"
+msgstr "Eylem"
+
+#: usr/local/www/diag_confbak.php:175
+msgid "Restore from Configuration Backup"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:179
+msgid "Remove Configuration Backup"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:183
+msgid "Target Configuration"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:184
+#, php-format
+msgid "Timestamp %1$s"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:192
+msgid "Backup Count"
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:197
+msgid ""
+"Enter the number of older configurations to keep in the local backup cache. "
+"By default this is 30 for a full install or 5 on NanoBSD."
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:199 usr/local/www/diag_logs_settings.php:464
+#: usr/local/www/diag_nanobsd.php:199 usr/local/www/diag_smart.php:244
+#: usr/local/www/edit.php:189 usr/local/www/firewall_aliases_edit.php:851
+#: usr/local/www/firewall_aliases_import.php:215
+#: usr/local/www/firewall_nat_1to1_edit.php:536
+#: usr/local/www/firewall_nat_edit.php:896
+#: usr/local/www/firewall_nat_npt_edit.php:278
+#: usr/local/www/firewall_nat_out.php:265
+#: usr/local/www/firewall_nat_out_edit.php:828
+#: usr/local/www/firewall_rules_edit.php:1261
+#: usr/local/www/firewall_rules_edit.php:1738
+#: usr/local/www/firewall_schedule_edit.php:1168
+#: usr/local/www/firewall_shaper.php:351
+#: usr/local/www/firewall_shaper_layer7.php:566
+#: usr/local/www/firewall_shaper_vinterface.php:319
+#: usr/local/www/firewall_virtual_ip_edit.php:509
+#: usr/local/www/interfaces.php:3379 usr/local/www/interfaces_assign.php:553
+#: usr/local/www/interfaces_bridge_edit.php:604
+#: usr/local/www/interfaces_gif_edit.php:233
+#: usr/local/www/interfaces_gre_edit.php:236
+#: usr/local/www/interfaces_groups_edit.php:333
+#: usr/local/www/interfaces_lagg_edit.php:235
+#: usr/local/www/interfaces_ppps_edit.php:795
+#: usr/local/www/interfaces_qinq_edit.php:397
+#: usr/local/www/interfaces_vlan_edit.php:203
+#: usr/local/www/interfaces_wireless_edit.php:201
+#: usr/local/www/load_balancer_monitor_edit.php:358
+#: usr/local/www/load_balancer_pool_edit.php:334
+#: usr/local/www/load_balancer_relay_action_edit.php:558
+#: usr/local/www/load_balancer_relay_protocol_edit.php:281
+#: usr/local/www/load_balancer_setting.php:162 usr/local/www/pkg_edit.php:435
+#: usr/local/www/pkg_mgr_settings.php:143
+#: usr/local/www/services_captiveportal.php:1081
+#: usr/local/www/services_captiveportal_hostname_edit.php:206
+#: usr/local/www/services_captiveportal_ip_edit.php:226
+#: usr/local/www/services_captiveportal_mac_edit.php:244
+#: usr/local/www/services_captiveportal_vouchers.php:636
+#: usr/local/www/services_captiveportal_vouchers_edit.php:208
+#: usr/local/www/services_dhcp.php:1222
+#: usr/local/www/services_dhcp_edit.php:545
+#: usr/local/www/services_dhcp_relay.php:192
+#: usr/local/www/services_dhcpv6.php:835
+#: usr/local/www/services_dhcpv6_edit.php:249
+#: usr/local/www/services_dhcpv6_relay.php:193
+#: usr/local/www/services_dnsmasq.php:318
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:164
+#: usr/local/www/services_dnsmasq_edit.php:305
+#: usr/local/www/services_dyndns_edit.php:424
+#: usr/local/www/services_igmpproxy.php:155
+#: usr/local/www/services_igmpproxy_edit.php:282
+#: usr/local/www/services_ntpd.php:411 usr/local/www/services_ntpd_gps.php:574
+#: usr/local/www/services_ntpd_pps.php:217
+#: usr/local/www/services_rfc2136_edit.php:214
+#: usr/local/www/services_router_advertisements.php:407
+#: usr/local/www/services_snmp.php:438 usr/local/www/services_unbound.php:382
+#: usr/local/www/services_unbound_acls.php:117
+#: usr/local/www/services_unbound_acls.php:310
+#: usr/local/www/services_unbound_domainoverride_edit.php:159
+#: usr/local/www/services_unbound_host_edit.php:310
+#: usr/local/www/services_wol_edit.php:161
+#: usr/local/www/status_lb_pool.php:218
+#: usr/local/www/status_rrd_graph_settings.php:236
+#: usr/local/www/system.php:521 usr/local/www/system_advanced_admin.php:611
+#: usr/local/www/system_advanced_firewall.php:559
+#: usr/local/www/system_advanced_misc.php:651
+#: usr/local/www/system_advanced_network.php:330
+#: usr/local/www/system_advanced_notifications.php:101
+#: usr/local/www/system_advanced_notifications.php:343
+#: usr/local/www/system_advanced_sysctl.php:114
+#: usr/local/www/system_advanced_sysctl.php:269
+#: usr/local/www/system_authservers.php:791
+#: usr/local/www/system_camanager.php:369
+#: usr/local/www/system_camanager.php:580
+#: usr/local/www/system_certmanager.php:197
+#: usr/local/www/system_certmanager.php:595
+#: usr/local/www/system_certmanager.php:1016
+#: usr/local/www/system_crlmanager.php:298
+#: usr/local/www/system_crlmanager.php:401
+#: usr/local/www/system_crlmanager.php:433
+#: usr/local/www/system_firmware_settings.php:274
+#: usr/local/www/system_gateway_groups_edit.php:347
+#: usr/local/www/system_gateways_edit.php:861
+#: usr/local/www/system_groupmanager.php:460
+#: usr/local/www/system_groupmanager_addprivs.php:226
+#: usr/local/www/system_routes_edit.php:332
+#: usr/local/www/system_usermanager.php:882
+#: usr/local/www/system_usermanager_addprivs.php:195
+#: usr/local/www/system_usermanager_passwordmg.php:133
+#: usr/local/www/system_usermanager_settings.php:163
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:124
+#: usr/local/www/vpn_ipsec.php:266 usr/local/www/vpn_ipsec_keys_edit.php:150
+#: usr/local/www/vpn_ipsec_mobile.php:659
+#: usr/local/www/vpn_ipsec_phase1.php:924
+#: usr/local/www/vpn_ipsec_phase2.php:833
+#: usr/local/www/vpn_ipsec_settings.php:297 usr/local/www/vpn_l2tp.php:450
+#: usr/local/www/vpn_l2tp_users_edit.php:182
+#: usr/local/www/vpn_openvpn_client.php:1100
+#: usr/local/www/vpn_openvpn_csc.php:732
+#: usr/local/www/vpn_openvpn_server.php:1816
+#: usr/local/www/vpn_pppoe_edit.php:604 usr/local/www/vpn_pptp.php:482
+#: usr/local/www/vpn_pptp_users_edit.php:173
+msgid "Save"
+msgstr "Kaydet"
+
+#: usr/local/www/diag_confbak.php:204
+msgid ""
+"NOTE: Be aware of how much space is consumed by backups before adjusting "
+"this value. Current space used by backups: "
+msgstr ""
+
+#: usr/local/www/diag_confbak.php:214
+msgid ""
+"To view the differences between an older configuration and a newer "
+"configuration, select the older configuration using the left column of radio "
+"options and select the newer configuration in the right column, then press "
+"the Diff button."
+msgstr ""
+
+# Buton değeri paketin işlevi için kullanılıyor, değiştirildiği için bu özellik şuanda kullanılamıyor.
+#: usr/local/www/diag_confbak.php:219 usr/local/www/diag_confbak.php:275
+msgid "Diff"
+msgstr "Diff"
+
+#: usr/local/www/diag_confbak.php:220
+#: usr/local/www/system_firmware_restorefullbackup.php:141
+msgid "Date"
+msgstr "Tarih"
+
+#: usr/local/www/diag_confbak.php:221 usr/local/www/pkg_mgr_installed.php:125
+#: usr/local/www/widgets/widgets/system_information.widget.php:122
+msgid "Version"
+msgstr "Sürüm"
+
+#: usr/local/www/diag_confbak.php:222 usr/local/www/diag_gmirror.php:288
+#: usr/local/www/diag_system_pftop.php:138
+#: usr/local/www/diag_system_pftop.php:157
+#: usr/local/www/services_captiveportal_filemanager.php:161
+#: usr/local/www/system_firmware_restorefullbackup.php:142
+msgid "Size"
+msgstr "Boyut"
+
+#: usr/local/www/diag_confbak.php:223
+msgid "Configuration Change"
+msgstr "Ayar Değişikliği"
+
+#: usr/local/www/diag_confbak.php:235
+msgid "Current"
+msgstr "Güncel"
+
+#: usr/local/www/diag_confbak.php:243 usr/local/www/diag_ipsec.php:143
+#: usr/local/www/diag_ipsec.php:151 usr/local/www/diag_ipsec.php:158
+#: usr/local/www/diag_ipsec.php:164 usr/local/www/diag_ipsec.php:173
+#: usr/local/www/diag_ipsec.php:188 usr/local/www/diag_ipsec.php:198
+#: usr/local/www/diag_ipsec.php:204 usr/local/www/diag_ipsec.php:302
+#: usr/local/www/diag_ipsec.php:321 usr/local/www/diag_ipsec.php:409
+#: usr/local/www/diag_ipsec.php:418 usr/local/www/diag_ipsec.php:427
+#: usr/local/www/diag_ipsec.php:436
+#: usr/local/www/widgets/widgets/gateways.widget.php:123
+msgid "Unknown"
+msgstr "Bilinmeyen"
+
+#: usr/local/www/diag_confbak.php:263
+msgid "Revert to this configuration"
+msgstr "Bu yapılandırmaya geri dön"
+
+#: usr/local/www/diag_confbak.php:266
+msgid "Remove this backup"
+msgstr "Bu yedeği sil"
+
+#: usr/local/www/diag_confbak.php:269
+msgid "Download this backup"
+msgstr "Bu yedeği indir"
+
+#: usr/local/www/diag_confbak.php:281
+msgid "No backups found."
+msgstr "Yedek bulunamadı."
+
+#: usr/local/www/diag_defaults.php:53
+msgid "Factory defaults"
+msgstr "Fabrika ayarları"
+
+#: usr/local/www/diag_defaults.php:62
+msgid ""
+"The system has been reset to factory defaults and is now rebooting. This may "
+"take a few minutes, depending on your hardware."
+msgstr ""
+"Sistem fabrika ayarlarına geri döndürüldü ve tekrar başlatılacak. Bu işlem "
+"donanımınıza bağlı olarak birkaç dakika sürebilir."
+
+#: usr/local/www/diag_defaults.php:71
+msgid "If you click"
+msgstr "Eğer buna tıklarsanız"
+
+#: usr/local/www/diag_defaults.php:71
+msgid "the firewall will:"
+msgstr "güvenlik duvarı şunu yapacak:"
+
+#: usr/local/www/diag_defaults.php:73
+msgid "Reset to factory defaults"
+msgstr "Fabrika ayarlarına geri dön"
+
+#: usr/local/www/diag_defaults.php:74
+msgid "LAN IP address will be reset to 192.168.1.1"
+msgstr "LAN IP adresi 192.168.1.1 e sıfırlanacak"
+
+#: usr/local/www/diag_defaults.php:75
+msgid "System will be configured as a DHCP server on the default LAN interface"
+msgstr ""
+"Sistem öntanımlı LAN arabiriminde DHCP sunucu olarak çalışacak şekilde "
+"yapılandırılacaktır"
+
+#: usr/local/www/diag_defaults.php:76
+msgid "Reboot after changes are installed"
+msgstr "Değişiklikler kurulduktan sonra tekrar başlat"
+
+#: usr/local/www/diag_defaults.php:77
+msgid ""
+"WAN interface will be set to obtain an address automatically from a DHCP "
+"server"
+msgstr ""
+"WAN arabirimi bir DHCP sunucudan otomatik IP almak üzere yapılandırılacaktır"
+
+#: usr/local/www/diag_defaults.php:78
+msgid "webConfigurator admin username will be reset to 'admin'"
+msgstr "webArayüzü yönetici kullanıcı adı 'admin' olarak değiştirilecektir"
+
+#: usr/local/www/diag_defaults.php:79
+msgid "webConfigurator admin password will be reset to"
+msgstr "Yeni webArayüzü yönetici kullanıcı parolası"
+
+#: usr/local/www/diag_defaults.php:81
+msgid "Are you sure you want to proceed?"
+msgstr "Devam etmek istediğinize emin misiniz?"
+
+#: usr/local/www/diag_dns.php:35 usr/local/www/diag_dns.php:277
+#: usr/local/www/fbegin.inc:210
+msgid "DNS Lookup"
+msgstr "DNS Sorgusu"
+
+#: usr/local/www/diag_dns.php:101
+msgid "Host must be a valid hostname or IP address."
+msgstr "Sunucu geçerli bir ad ya da IP adresine sahip olmalıdır."
+
+#: usr/local/www/diag_dns.php:110
+msgid "No response"
+msgstr "Cevap yok"
+
+#: usr/local/www/diag_dns.php:143
+msgid "No record found"
+msgstr "Hiç kayıt bulunamadı"
+
+#: usr/local/www/diag_dns.php:156 usr/local/www/diag_tables.php:137
+#: usr/local/www/interfaces_ppps_edit.php:673
+#: usr/local/www/load_balancer_virtual_server.php:134
+#: usr/local/www/load_balancer_virtual_server_edit.php:76
+#: usr/local/www/load_balancer_virtual_server_edit.php:81
+#: usr/local/www/load_balancer_virtual_server_edit.php:178
+#: usr/local/www/system_advanced_notifications.php:225
+msgid "IP Address"
+msgstr "IP Adresi"
+
+#: usr/local/www/diag_dns.php:157 usr/local/www/system_authservers.php:807
+msgid "Host Name"
+msgstr "Host Adı"
+
+#: usr/local/www/diag_dns.php:160 usr/local/www/diag_dns.php:234
+#: usr/local/www/diag_logs_settings.php:421
+#: usr/local/www/diag_logs_settings.php:425
+#: usr/local/www/diag_logs_settings.php:429
+#: usr/local/www/services_rfc2136.php:81
+#: usr/local/www/services_rfc2136_edit.php:187
+#: usr/local/www/status_ntpd.php:179 usr/local/www/vpn_ipsec_mobile.php:547
+#: usr/local/www/vpn_ipsec_mobile.php:553
+#: usr/local/www/vpn_ipsec_mobile.php:559
+#: usr/local/www/vpn_ipsec_mobile.php:565
+#: usr/local/www/vpn_ipsec_mobile.php:589
+#: usr/local/www/vpn_ipsec_mobile.php:595
+#: usr/local/www/vpn_openvpn_client.php:445
+#: usr/local/www/vpn_openvpn_client.php:1117
+#: usr/local/www/vpn_openvpn_csc.php:316 usr/local/www/vpn_openvpn_csc.php:551
+#: usr/local/www/vpn_openvpn_csc.php:559 usr/local/www/vpn_openvpn_csc.php:567
+#: usr/local/www/vpn_openvpn_csc.php:575 usr/local/www/vpn_openvpn_csc.php:603
+#: usr/local/www/vpn_openvpn_csc.php:611 usr/local/www/vpn_openvpn_csc.php:699
+#: usr/local/www/vpn_openvpn_csc.php:707
+#: usr/local/www/vpn_openvpn_server.php:479
+#: usr/local/www/vpn_openvpn_server.php:743
+#: usr/local/www/vpn_openvpn_server.php:1554
+#: usr/local/www/vpn_openvpn_server.php:1562
+#: usr/local/www/vpn_openvpn_server.php:1570
+#: usr/local/www/vpn_openvpn_server.php:1578
+#: usr/local/www/vpn_openvpn_server.php:1626
+#: usr/local/www/vpn_openvpn_server.php:1634
+#: usr/local/www/vpn_openvpn_server.php:1722
+#: usr/local/www/vpn_openvpn_server.php:1730
+msgid "Server"
+msgstr "Sunucu"
+
+# 90%
+#: usr/local/www/diag_dns.php:160
+msgid "Query Time"
+msgstr "Sorgu Zamanı"
+
+#: usr/local/www/diag_dns.php:182
+msgid "Resolve DNS hostname or IP"
+msgstr "DNS adı yada IP çözümle"
+
+#: usr/local/www/diag_dns.php:185 usr/local/www/system_authservers.php:168
+#: usr/local/www/system_authservers.php:191
+msgid "Hostname or IP"
+msgstr "Host adı ya da IP"
+
+#: usr/local/www/diag_dns.php:229
+msgid "Resolution time per server"
+msgstr "Sunucu başına çözümleme süresi"
+
+#: usr/local/www/diag_dns.php:237
+msgid "Query time"
+msgstr "Sorgu zamanı"
+
+#: usr/local/www/diag_dns.php:261
+msgid "More Information:"
+msgstr "Ek Bilgi:"
+
+#: usr/local/www/diag_dns.php:263 usr/local/www/diag_ping.php:47
+#: usr/local/www/diag_ping.php:97 usr/local/www/diag_ping.php:144
+#: usr/local/www/fbegin.inc:222
+msgid "Ping"
+msgstr "Ping"
+
+#: usr/local/www/diag_dns.php:266
+msgid ""
+"NOTE: The following links are to external services, so their reliability "
+"cannot be guaranteed."
+msgstr ""
+"NOT: Belirtilen linkler dış servislere aittir, dolayısıyla tutarlılıkları "
+"garanti edilememektedir."
+
+#: usr/local/www/diag_dns.php:267
+msgid "IP WHOIS @ DNS Stuff"
+msgstr "DNS Stuff sunucusundaki IP WHOIS bilgisi"
+
+#: usr/local/www/diag_dns.php:268
+msgid "IP Info @ DNS Stuff"
+msgstr "DNS Stuff sunucusundaki IP bilgisi"
+
+#: usr/local/www/diag_dump_states.php:52
+#: usr/local/www/diag_dump_states_sources.php:52
+#: usr/local/www/status_openvpn.php:63
+#: usr/local/www/widgets/widgets/openvpn.widget.php:20
+msgid "invalid input"
+msgstr "geçersiz girdi"
+
+#: usr/local/www/diag_dump_states.php:72
+msgid "Show States"
+msgstr "Durumları Göster"
+
+#: usr/local/www/diag_dump_states.php:108
+#: usr/local/www/diag_dump_states_sources.php:96
+#: usr/local/www/status_openvpn.php:134
+#: usr/local/www/widgets/widgets/openvpn.widget.php:87
+msgid "An error occurred."
+msgstr "Bir hata oluştu."
+
+#: usr/local/www/diag_dump_states.php:124
+#: usr/local/www/diag_dump_states_sources.php:112
+#: usr/local/www/diag_resetstate.php:78
+#: usr/local/www/diag_states_summary.php:153
+#: usr/local/www/diag_states_summary.php:155 usr/local/www/fbegin.inc:230
+msgid "States"
+msgstr "Durumlar"
+
+#: usr/local/www/diag_dump_states.php:126
+#: usr/local/www/diag_dump_states_sources.php:113
+#: usr/local/www/diag_resetstate.php:80
+msgid "Source Tracking"
+msgstr "Kaynak Takibi"
+
+#: usr/local/www/diag_dump_states.php:127
+#: usr/local/www/diag_dump_states_sources.php:114
+#: usr/local/www/diag_resetstate.php:81
+msgid "Reset States"
+msgstr "Durumları Sıfırla"
+
+# 76%
+#: usr/local/www/diag_dump_states.php:149
+msgid "Current total state count"
+msgstr "Güncel toplam durum sayımı"
+
+#: usr/local/www/diag_dump_states.php:152
+#: usr/local/www/diag_dump_states_sources.php:133
+msgid "Filter expression:"
+msgstr "Filtreleme ifadesi:"
+
+#: usr/local/www/diag_dump_states.php:154
+#: usr/local/www/diag_dump_states_sources.php:135
+#: usr/local/www/diag_logs.php:127 usr/local/www/diag_logs_filter.php:219
+#: usr/local/www/diag_logs_filter.php:282
+#: usr/local/www/diag_logs_gateways.php:129
+#: usr/local/www/diag_logs_resolver.php:129
+msgid "Filter"
+msgstr "Filtre"
+
+#: usr/local/www/diag_dump_states.php:156
+msgid "Kill"
+msgstr "Sonlandır"
+
+#: usr/local/www/diag_dump_states.php:169
+msgid "Int"
+msgstr ""
+
+#: usr/local/www/diag_dump_states.php:170
+#: usr/local/www/diag_logs_filter.php:329
+#: usr/local/www/diag_logs_filter_dynamic.php:140
+#: usr/local/www/diag_states_summary.php:154
+#: usr/local/www/firewall_nat.php:205 usr/local/www/firewall_rules.php:339
+msgid "Proto"
+msgstr "Protokol"
+
+#: usr/local/www/diag_dump_states.php:171
+msgid "Source -> Router -> Destination"
+msgstr "Kaynak -> Router -> Hedef"
+
+#: usr/local/www/diag_dump_states.php:172
+#: usr/local/www/diag_system_pftop.php:140
+#: usr/local/www/status_dhcpv6_leases.php:507
+msgid "State"
+msgstr "Durum"
+
+#: usr/local/www/diag_dump_states.php:213
+msgid "Remove all state entries from"
+msgstr "Tüm durum girdilerini sil"
+
+#: usr/local/www/diag_dump_states.php:224
+msgid "No states were found."
+msgstr "Herhangi bir durum bulunamadı."
+
+#: usr/local/www/diag_dump_states.php:237
+msgid "States matching current filter"
+msgstr "Şimdiki filitreye uyuşan durumlar"
+
+#: usr/local/www/diag_dump_states_sources.php:66
+msgid "Show Source Tracking"
+msgstr "Kaynak Takibini Göster"
+
+#: usr/local/www/diag_dump_states_sources.php:147
+msgid "Source -> Destination"
+msgstr "Kaynak -> Hedef"
+
+#: usr/local/www/diag_dump_states_sources.php:148
+msgid "# States"
+msgstr "# Durum"
+
+#: usr/local/www/diag_dump_states_sources.php:149
+msgid "# Connections"
+msgstr "# Bağlantılar"
+
+#: usr/local/www/diag_dump_states_sources.php:150
+#: usr/local/www/diag_system_pftop.php:156
+#: usr/local/www/status_interfaces.php:377
+msgid "Rate"
+msgstr "Hız"
+
+#: usr/local/www/diag_dump_states_sources.php:182
+msgid "Remove all source tracking entries from"
+msgstr "Tüm kaynak takibi girdilerini sil"
+
+#: usr/local/www/diag_dump_states_sources.php:192
+msgid "No source tracking entries were found."
+msgstr "Kaynak takibi girdisi bulunamadı."
+
+#: usr/local/www/diag_gmirror.php:46 usr/local/www/fbegin.inc:215
+msgid "GEOM Mirrors"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:58
+msgid "Forget all formerly connected consumers"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:59 usr/local/www/diag_gmirror.php:301
+msgid "Remove metadata from disk"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:60
+msgid "Insert consumer into mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:61
+msgid "Remove consumer from mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:62
+msgid "Reactivate consumer on mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:63
+msgid "Deactivate consumer from mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:64
+msgid "Force rebuild of mirror consumer"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:81
+msgid "You must supply a valid mirror name."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:84
+msgid "You must supply a valid consumer name"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:90
+msgid ""
+"Consumer is already in use and cannot be inserted. Remove consumer from "
+"existing mirror first."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:92
+msgid ""
+"Consumer has metadata from an existing mirror. Clear metadata before "
+"inserting consumer."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:95
+msgid ""
+"Mirror is not in a COMPLETE state, cannot insert consumer. Forget "
+"disconnected disks or wait for rebuild to finish."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:99
+msgid "Consumer is in use and cannot be cleared. Deactivate disk first."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:101
+msgid "Consumer has no metadata to clear."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:105
+msgid "Consumer is already present on specified mirror."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:107
+msgid "Consumer has no metadata and cannot be reactivated."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:114
+msgid "Consumer must be present on the specified mirror."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:166
+msgid ""
+"There was an error performing the chosen mirror operation. Check the System "
+"Log for details."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:176 usr/local/www/diag_nanobsd.php:137
+#: usr/local/www/interfaces.php:3490 usr/local/www/interfaces.php:3499
+#: usr/local/www/interfaces_groups_edit.php:325
+#: usr/local/www/load_balancer_virtual_server_edit.php:210
+#: usr/local/www/load_balancer_virtual_server_edit.php:229
+#: usr/local/www/system_advanced_admin.php:322
+#: usr/local/www/system_advanced_firewall.php:285
+#: usr/local/www/system_advanced_misc.php:302
+#: usr/local/www/system_advanced_network.php:203
+#: usr/local/www/system_advanced_sysctl.php:173
+#: usr/local/www/system_firmware_settings.php:175
+#: usr/local/www/system_routes_edit.php:393
+msgid "NOTE:"
+msgstr "NOT:"
+
+#: usr/local/www/diag_gmirror.php:178
+msgid ""
+"The options on this page are intended for use by advanced users only. This "
+"page is for managing existing mirrors, not creating new mirrors."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:196
+msgid "Mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:200
+msgid "Consumer"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:209
+msgid "GEOM Mirror information"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:213
+msgid "Mirror Status"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:222
+msgid "Component"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:234
+msgid "Forget Disconnected Disks"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:242 usr/local/www/diag_gmirror.php:257
+msgid "Rebuild"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:243 usr/local/www/diag_gmirror.php:258
+msgid "Deactivate"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:244 usr/local/www/diag_gmirror.php:259
+#: usr/local/www/load_balancer_pool_edit.php:303
+#: usr/local/www/load_balancer_pool_edit.php:323
+#: usr/local/www/load_balancer_relay_protocol_edit.php:254
+msgid "Remove"
+msgstr "Kaldır"
+
+#: usr/local/www/diag_gmirror.php:267
+msgid "No Mirrors Found"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:271
+msgid ""
+"Some disk operations may only be performed when there are multiple consumers "
+"present in a mirror."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:276
+msgid "Consumer information"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:280
+msgid "Available Consumers"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:289
+msgid "Add to Mirror"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:300
+msgid "Reactivate on:"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:316
+msgid "No unused consumers found"
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:320
+msgid ""
+"Consumers may only be added to a mirror if they are larger than the size of "
+"the mirror."
+msgstr ""
+
+#: usr/local/www/diag_gmirror.php:327
+msgid ""
+"To repair a failed mirror, first perform a 'Forget' command on the mirror, "
+"followed by an 'insert' action on the new consumer."
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:49 usr/local/www/diag_ipsec_leases.php:46
+#: usr/local/www/diag_ipsec_sad.php:50 usr/local/www/diag_ipsec_spd.php:50
+#: usr/local/www/diag_logs.php:82 usr/local/www/diag_logs_auth.php:73
+#: usr/local/www/diag_logs_dhcp.php:76 usr/local/www/diag_logs_filter.php:139
+#: usr/local/www/diag_logs_filter_dynamic.php:104
+#: usr/local/www/diag_logs_filter_summary.php:193
+#: usr/local/www/diag_logs_gateways.php:84
+#: usr/local/www/diag_logs_ipsec.php:77 usr/local/www/diag_logs_ntpd.php:71
+#: usr/local/www/diag_logs_openvpn.php:75 usr/local/www/diag_logs_ppp.php:73
+#: usr/local/www/diag_logs_relayd.php:72
+#: usr/local/www/diag_logs_resolver.php:84
+#: usr/local/www/diag_logs_routing.php:71
+#: usr/local/www/diag_logs_settings.php:271
+#: usr/local/www/diag_logs_vpn.php:131 usr/local/www/diag_logs_wireless.php:73
+#: usr/local/www/fbegin.inc:164 usr/local/www/fbegin.inc:181
+#: usr/local/www/vpn_ipsec.php:216 usr/local/www/vpn_ipsec_mobile.php:241
+#: usr/local/www/vpn_ipsec_phase1.php:398
+#: usr/local/www/vpn_ipsec_phase1.php:400
+#: usr/local/www/vpn_ipsec_phase2.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:362
+#: usr/local/www/vpn_ipsec_settings.php:168
+msgid "IPsec"
+msgstr "IPsec"
+
+#: usr/local/www/diag_ipsec.php:92 usr/local/www/diag_ipsec_leases.php:61
+#: usr/local/www/diag_ipsec_sad.php:75 usr/local/www/diag_ipsec_spd.php:64
+msgid "Overview"
+msgstr "Görünüm"
+
+#: usr/local/www/diag_ipsec.php:93 usr/local/www/diag_ipsec_leases.php:46
+#: usr/local/www/diag_ipsec_leases.php:62 usr/local/www/diag_ipsec_sad.php:76
+#: usr/local/www/diag_ipsec_spd.php:65
+msgid "Leases"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:94 usr/local/www/diag_ipsec_leases.php:63
+#: usr/local/www/diag_ipsec_sad.php:50 usr/local/www/diag_ipsec_sad.php:77
+#: usr/local/www/diag_ipsec_spd.php:66
+msgid "SAD"
+msgstr "SAD"
+
+#: usr/local/www/diag_ipsec.php:95 usr/local/www/diag_ipsec_leases.php:64
+#: usr/local/www/diag_ipsec_sad.php:78 usr/local/www/diag_ipsec_spd.php:50
+#: usr/local/www/diag_ipsec_spd.php:67
+msgid "SPD"
+msgstr "SPD"
+
+#: usr/local/www/diag_ipsec.php:96 usr/local/www/diag_ipsec_leases.php:65
+#: usr/local/www/diag_ipsec_sad.php:79 usr/local/www/diag_ipsec_spd.php:68
+msgid "Logs"
+msgstr "Kayıtlar"
+
+#: usr/local/www/diag_ipsec.php:108
+msgid "Local ID"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:109 usr/local/www/interfaces_ppps_edit.php:665
+#: usr/local/www/vpn_pppoe.php:105
+msgid "Local IP"
+msgstr "Yerel IP"
+
+#: usr/local/www/diag_ipsec.php:110
+msgid "Remote ID"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:111
+msgid "Remote IP"
+msgstr "Uzak IP"
+
+#: usr/local/www/diag_ipsec.php:112
+msgid "Role"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:113
+msgid "Reauth"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:114 usr/local/www/diag_ipsec.php:284
+msgid "Algo"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:147
+msgid "Any identifier"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:162 usr/local/www/diag_ipsec.php:202
+msgid "Port: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:246 usr/local/www/diag_ipsec.php:472
+msgid "Connect VPN"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:254
+msgid "Disconnect VPN"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:257
+msgid "Disconnect VPN Connection"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:280
+msgid "Local subnets"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:281
+msgid "Local SPI(s)"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:282
+msgid "Remote subnets"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:283
+msgid "Times"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:285
+msgid "Stats"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:308
+msgid "Local: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:310
+msgid "Remote: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:326
+msgid "Rekey: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:327
+msgid "Life: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:328
+msgid "Install: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:350
+msgid "IPComp: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:355
+msgid "Bytes-In: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:357
+msgid "Packets-In: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:359
+msgid "Bytes-Out: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:361
+msgid "Packets-Out: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:367
+msgid "Disconnect Child SA"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:452 usr/local/www/diag_ipsec.php:453
+msgid "Awaiting connections"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:465 usr/local/www/diag_ipsec.php:466
+msgid "Disconnected"
+msgstr ""
+
+#: usr/local/www/diag_ipsec.php:500
+msgid "You can configure IPsec"
+msgstr "IPsec'i yapılandırabilirsiniz"
+
+#: usr/local/www/diag_ipsec_leases.php:79
+msgid "Pool: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:80
+msgid "usage: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:81
+msgid "online: "
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:87 usr/local/www/firewall_rules.php:335
+#: usr/local/www/load_balancer_relay_action_edit.php:511
+msgid "ID"
+msgstr "Kimlik"
+
+#: usr/local/www/diag_ipsec_leases.php:88 usr/local/www/diag_ping.php:60
+#: usr/local/www/diag_ping.php:100 usr/local/www/diag_testport.php:60
+#: usr/local/www/diag_testport.php:117 usr/local/www/diag_traceroute.php:64
+#: usr/local/www/diag_traceroute.php:100
+#: usr/local/www/load_balancer_monitor_edit.php:280
+#: usr/local/www/load_balancer_monitor_edit.php:313
+#: usr/local/www/services_dnsmasq.php:352
+#: usr/local/www/services_dnsmasq_edit.php:215
+#: usr/local/www/services_dnsmasq_edit.php:256
+#: usr/local/www/services_rfc2136_edit.php:175
+#: usr/local/www/services_unbound.php:420
+#: usr/local/www/services_unbound_host_edit.php:216
+#: usr/local/www/services_unbound_host_edit.php:259
+msgid "Host"
+msgstr "Host"
+
+#: usr/local/www/diag_ipsec_leases.php:104
+msgid "No leases from this pool yet."
+msgstr ""
+
+#: usr/local/www/diag_ipsec_leases.php:114
+msgid "No IPsec pools."
+msgstr ""
+
+# yapılandırabilirsiniz kelimesi web arayüz de iki defa geldiği için silindi. (technical)
+#: usr/local/www/diag_ipsec_leases.php:126
+#: usr/local/www/diag_ipsec_sad.php:136 usr/local/www/diag_ipsec_spd.php:133
+msgid "You can configure your IPsec"
+msgstr "IPsec'i "
+
+#: usr/local/www/diag_ipsec_leases.php:126
+#: usr/local/www/diag_ipsec_sad.php:136 usr/local/www/diag_ipsec_spd.php:133
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/firewall_rules_edit.php:998
+msgid "here."
+msgstr "yapılandırabilirsiniz."
+
+#: usr/local/www/diag_ipsec_sad.php:90 usr/local/www/diag_ipsec_spd.php:79
+#: usr/local/www/diag_logs_filter.php:327
+#: usr/local/www/diag_logs_filter_dynamic.php:138
+#: usr/local/www/firewall_nat_edit.php:548
+#: usr/local/www/firewall_nat_edit.php:554
+#: usr/local/www/firewall_nat_out.php:306
+#: usr/local/www/firewall_nat_out.php:543
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_nat_out_edit.php:533
+#: usr/local/www/firewall_rules.php:340
+#: usr/local/www/firewall_rules_edit.php:1034
+#: usr/local/www/vpn_ipsec_mobile.php:385
+#: usr/local/www/vpn_ipsec_mobile.php:403
+#: usr/local/www/widgets/widgets/log.widget.php:181
+msgid "Source"
+msgstr "Kaynak"
+
+#: usr/local/www/diag_ipsec_sad.php:91 usr/local/www/diag_ipsec_spd.php:80
+#: usr/local/www/diag_logs_filter.php:328
+#: usr/local/www/diag_logs_filter_dynamic.php:139
+#: usr/local/www/firewall_nat_1to1_edit.php:422
+#: usr/local/www/firewall_nat_edit.php:643
+#: usr/local/www/firewall_nat_out.php:308
+#: usr/local/www/firewall_nat_out.php:545
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_nat_out_edit.php:578
+#: usr/local/www/firewall_rules.php:342
+#: usr/local/www/firewall_rules_edit.php:1137
+#: usr/local/www/widgets/widgets/log.widget.php:182
+msgid "Destination"
+msgstr "Hedef"
+
+#: usr/local/www/diag_ipsec_sad.php:92 usr/local/www/diag_ipsec_spd.php:82
+#: usr/local/www/diag_logs_filter.php:193
+#: usr/local/www/diag_packet_capture.php:277
+#: usr/local/www/firewall_nat_edit.php:197
+#: usr/local/www/firewall_nat_edit.php:200
+#: usr/local/www/firewall_nat_edit.php:537
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_nat_out_edit.php:513
+#: usr/local/www/firewall_rules_edit.php:988
+#: usr/local/www/firewall_shaper_layer7.php:467
+#: usr/local/www/interfaces_bridge_edit.php:310
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:425
+#: usr/local/www/load_balancer_virtual_server.php:133
+#: usr/local/www/services_rfc2136_edit.php:193
+#: usr/local/www/status_upnp.php:88
+#: usr/local/www/system_advanced_admin.php:333
+#: usr/local/www/vpn_ipsec_phase2.php:710
+#: usr/local/www/vpn_openvpn_client.php:500
+#: usr/local/www/vpn_openvpn_client.php:1116
+#: usr/local/www/vpn_openvpn_server.php:815
+msgid "Protocol"
+msgstr "Protokol"
+
+#: usr/local/www/diag_ipsec_sad.php:93
+msgid "SPI"
+msgstr "SPI"
+
+#: usr/local/www/diag_ipsec_sad.php:94
+msgid "Enc. alg."
+msgstr "Şifreleme algoritması."
+
+#: usr/local/www/diag_ipsec_sad.php:95
+msgid "Auth. alg."
+msgstr "Kimlik doğrulama algoritması."
+
+#: usr/local/www/diag_ipsec_sad.php:96
+msgid "Data"
+msgstr "Veri"
+
+#: usr/local/www/diag_ipsec_sad.php:115
+msgid "Do you really want to delete this security association?"
+msgstr "Bu güvenlik ilişkilendirmesini silmeyi gerçekten istiyor musunuz?"
+
+#: usr/local/www/diag_ipsec_sad.php:124
+msgid "No IPsec security associations."
+msgstr "IPsec güvenlik ilişkilendirmesi yok."
+
+#: usr/local/www/diag_ipsec_spd.php:81
+#: usr/local/www/firewall_rules_edit.php:954
+#: usr/local/www/load_balancer_relay_action_edit.php:121
+#: usr/local/www/load_balancer_relay_action_edit.php:444
+#: usr/local/www/services_captiveportal_hostname_edit.php:163
+msgid "Direction"
+msgstr "Yön"
+
+#: usr/local/www/diag_ipsec_spd.php:83
+msgid "Tunnel endpoints"
+msgstr "Tünel uçları"
+
+#: usr/local/www/diag_ipsec_spd.php:109
+msgid "incoming (as seen by firewall)"
+msgstr "gelen (güvenlik duvarı tarafından görüldüğü şekliyle)"
+
+#: usr/local/www/diag_ipsec_spd.php:116
+msgid "outgoing (as seen by firewall)"
+msgstr "giden (güvenlik duvarı tarafından görünen şekliyle)"
+
+#: usr/local/www/diag_ipsec_spd.php:121
+msgid "No IPsec security policies."
+msgstr "IPsec güvenlik ilkesi bulunamamıştır."
+
+#: usr/local/www/diag_limiter_info.php:106
+msgid "Gathering Limiter information, please wait..."
+msgstr "Limitleyici bilgisi alınıyor, lütfen bekleyiniz..."
+
+#: usr/local/www/diag_logs.php:66 usr/local/www/diag_logs_auth.php:57
+#: usr/local/www/diag_logs_dhcp.php:60 usr/local/www/diag_logs_filter.php:123
+#: usr/local/www/diag_logs_filter_dynamic.php:62
+#: usr/local/www/diag_logs_filter_summary.php:35
+#: usr/local/www/diag_logs_gateways.php:67
+#: usr/local/www/diag_logs_ipsec.php:61 usr/local/www/diag_logs_ntpd.php:55
+#: usr/local/www/diag_logs_openvpn.php:46 usr/local/www/diag_logs_ppp.php:58
+#: usr/local/www/diag_logs_relayd.php:56
+#: usr/local/www/diag_logs_resolver.php:67
+#: usr/local/www/diag_logs_routing.php:55
+#: usr/local/www/diag_logs_settings.php:187 usr/local/www/diag_logs_vpn.php:45
+#: usr/local/www/diag_logs_wireless.php:57
+msgid "System logs"
+msgstr "Sistem kayıtları"
+
+# 75%
+#: usr/local/www/diag_logs.php:66 usr/local/www/diag_logs.php:96
+#: usr/local/www/diag_logs_gateways.php:98
+#: usr/local/www/diag_logs_resolver.php:98
+#: usr/local/www/diag_logs_routing.php:84
+#: usr/local/www/diag_logs_wireless.php:86
+msgid "General"
+msgstr "Genel"
+
+# Kısaltma kullanılmıştır çünki sayfa içindeki menülere sığmıyordu (technical)
+#: usr/local/www/diag_logs.php:79 usr/local/www/diag_logs_auth.php:70
+#: usr/local/www/diag_logs_dhcp.php:73 usr/local/www/diag_logs_filter.php:123
+#: usr/local/www/diag_logs_filter.php:136
+#: usr/local/www/diag_logs_filter_dynamic.php:101
+#: usr/local/www/diag_logs_filter_summary.php:190
+#: usr/local/www/diag_logs_gateways.php:81
+#: usr/local/www/diag_logs_ipsec.php:74 usr/local/www/diag_logs_ntpd.php:68
+#: usr/local/www/diag_logs_openvpn.php:72 usr/local/www/diag_logs_ppp.php:70
+#: usr/local/www/diag_logs_relayd.php:69
+#: usr/local/www/diag_logs_resolver.php:81
+#: usr/local/www/diag_logs_routing.php:68
+#: usr/local/www/diag_logs_settings.php:268
+#: usr/local/www/diag_logs_vpn.php:128 usr/local/www/diag_logs_wireless.php:70
+#: usr/local/www/fbegin.inc:300 usr/local/www/firewall_aliases.php:157
+#: usr/local/www/firewall_aliases_edit.php:53
+#: usr/local/www/firewall_aliases_import.php:50
+#: usr/local/www/firewall_nat.php:167 usr/local/www/firewall_nat_1to1.php:148
+#: usr/local/www/firewall_nat_1to1_edit.php:227
+#: usr/local/www/firewall_nat_edit.php:457
+#: usr/local/www/firewall_nat_npt.php:81
+#: usr/local/www/firewall_nat_npt_edit.php:148
+#: usr/local/www/firewall_nat_out.php:214
+#: usr/local/www/firewall_nat_out_edit.php:343
+#: usr/local/www/firewall_rules.php:50
+#: usr/local/www/firewall_rules_edit.php:805
+#: usr/local/www/firewall_schedule.php:51
+#: usr/local/www/firewall_schedule_edit.php:62
+#: usr/local/www/firewall_shaper.php:55
+#: usr/local/www/firewall_shaper_layer7.php:60
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_wizards.php:74
+#: usr/local/www/firewall_virtual_ip.php:203
+#: usr/local/www/firewall_virtual_ip_edit.php:290
+#: usr/local/www/services_igmpproxy_edit.php:46
+msgid "Firewall"
+msgstr "Güvenlik Duvarı"
+
+#: usr/local/www/diag_logs.php:80 usr/local/www/diag_logs_auth.php:71
+#: usr/local/www/diag_logs_dhcp.php:60 usr/local/www/diag_logs_dhcp.php:74
+#: usr/local/www/diag_logs_filter.php:137
+#: usr/local/www/diag_logs_filter_dynamic.php:102
+#: usr/local/www/diag_logs_filter_summary.php:191
+#: usr/local/www/diag_logs_gateways.php:82
+#: usr/local/www/diag_logs_ipsec.php:75 usr/local/www/diag_logs_ntpd.php:69
+#: usr/local/www/diag_logs_openvpn.php:73 usr/local/www/diag_logs_ppp.php:71
+#: usr/local/www/diag_logs_relayd.php:70
+#: usr/local/www/diag_logs_resolver.php:82
+#: usr/local/www/diag_logs_routing.php:69
+#: usr/local/www/diag_logs_settings.php:269
+#: usr/local/www/diag_logs_vpn.php:129 usr/local/www/diag_logs_wireless.php:71
+#: usr/local/www/interfaces.php:1411 usr/local/www/services_dhcp_edit.php:335
+msgid "DHCP"
+msgstr "DHCP"
+
+#: usr/local/www/diag_logs.php:81 usr/local/www/diag_logs_auth.php:57
+#: usr/local/www/diag_logs_auth.php:72 usr/local/www/diag_logs_dhcp.php:75
+#: usr/local/www/diag_logs_filter.php:138
+#: usr/local/www/diag_logs_filter_dynamic.php:103
+#: usr/local/www/diag_logs_filter_summary.php:192
+#: usr/local/www/diag_logs_gateways.php:83
+#: usr/local/www/diag_logs_ipsec.php:76 usr/local/www/diag_logs_ntpd.php:70
+#: usr/local/www/diag_logs_openvpn.php:74 usr/local/www/diag_logs_ppp.php:72
+#: usr/local/www/diag_logs_relayd.php:71
+#: usr/local/www/diag_logs_resolver.php:83
+#: usr/local/www/diag_logs_routing.php:70
+#: usr/local/www/diag_logs_settings.php:270
+#: usr/local/www/diag_logs_vpn.php:130 usr/local/www/diag_logs_wireless.php:72
+msgid "Portal Auth"
+msgstr "Hizmet Portalı"
+
+#: usr/local/www/diag_logs.php:83 usr/local/www/diag_logs_auth.php:74
+#: usr/local/www/diag_logs_dhcp.php:77 usr/local/www/diag_logs_filter.php:140
+#: usr/local/www/diag_logs_filter_dynamic.php:105
+#: usr/local/www/diag_logs_filter_summary.php:194
+#: usr/local/www/diag_logs_gateways.php:85
+#: usr/local/www/diag_logs_ipsec.php:78 usr/local/www/diag_logs_ntpd.php:72
+#: usr/local/www/diag_logs_openvpn.php:76 usr/local/www/diag_logs_ppp.php:58
+#: usr/local/www/diag_logs_ppp.php:74 usr/local/www/diag_logs_relayd.php:73
+#: usr/local/www/diag_logs_resolver.php:85
+#: usr/local/www/diag_logs_routing.php:72
+#: usr/local/www/diag_logs_settings.php:272
+#: usr/local/www/diag_logs_vpn.php:132 usr/local/www/diag_logs_wireless.php:74
+#: usr/local/www/interfaces.php:1411 usr/local/www/status_interfaces.php:165
+msgid "PPP"
+msgstr "PPP"
+
+#: usr/local/www/diag_logs.php:84 usr/local/www/diag_logs_auth.php:75
+#: usr/local/www/diag_logs_dhcp.php:78 usr/local/www/diag_logs_filter.php:141
+#: usr/local/www/diag_logs_filter_dynamic.php:106
+#: usr/local/www/diag_logs_filter_summary.php:195
+#: usr/local/www/diag_logs_gateways.php:86
+#: usr/local/www/diag_logs_ipsec.php:79 usr/local/www/diag_logs_ntpd.php:73
+#: usr/local/www/diag_logs_openvpn.php:77 usr/local/www/diag_logs_ppp.php:75
+#: usr/local/www/diag_logs_relayd.php:74
+#: usr/local/www/diag_logs_resolver.php:86
+#: usr/local/www/diag_logs_routing.php:73
+#: usr/local/www/diag_logs_settings.php:273 usr/local/www/diag_logs_vpn.php:45
+#: usr/local/www/diag_logs_vpn.php:133 usr/local/www/diag_logs_wireless.php:75
+#: usr/local/www/fbegin.inc:316
+#: usr/local/www/status_rrd_graph_settings.php:158
+#: usr/local/www/vpn_ipsec.php:216 usr/local/www/vpn_ipsec_mobile.php:241
+#: usr/local/www/vpn_ipsec_phase1.php:398
+#: usr/local/www/vpn_ipsec_phase1.php:400
+#: usr/local/www/vpn_ipsec_phase2.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:362
+#: usr/local/www/vpn_ipsec_settings.php:168 usr/local/www/vpn_l2tp.php:39
+#: usr/local/www/vpn_l2tp_users.php:39
+#: usr/local/www/vpn_l2tp_users_edit.php:39 usr/local/www/vpn_pppoe.php:88
+#: usr/local/www/vpn_pptp.php:197 usr/local/www/vpn_pptp_users.php:72
+#: usr/local/www/vpn_pptp_users_edit.php:138
+msgid "VPN"
+msgstr "VPN"
+
+#: usr/local/www/diag_logs.php:85 usr/local/www/diag_logs_auth.php:76
+#: usr/local/www/diag_logs_dhcp.php:79 usr/local/www/diag_logs_filter.php:142
+#: usr/local/www/diag_logs_filter_dynamic.php:107
+#: usr/local/www/diag_logs_filter_summary.php:196
+#: usr/local/www/diag_logs_gateways.php:87
+#: usr/local/www/diag_logs_ipsec.php:80 usr/local/www/diag_logs_ntpd.php:74
+#: usr/local/www/diag_logs_openvpn.php:78 usr/local/www/diag_logs_ppp.php:76
+#: usr/local/www/diag_logs_relayd.php:56 usr/local/www/diag_logs_relayd.php:75
+#: usr/local/www/diag_logs_resolver.php:87
+#: usr/local/www/diag_logs_routing.php:74
+#: usr/local/www/diag_logs_settings.php:274
+#: usr/local/www/diag_logs_vpn.php:134 usr/local/www/diag_logs_wireless.php:76
+#: usr/local/www/fbegin.inc:149 usr/local/www/fbegin.inc:182
+#: usr/local/www/load_balancer_monitor.php:89
+#: usr/local/www/load_balancer_monitor_edit.php:196
+#: usr/local/www/load_balancer_pool.php:98
+#: usr/local/www/load_balancer_pool_edit.php:170
+#: usr/local/www/load_balancer_relay_action.php:105
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_relay_protocol.php:101
+#: usr/local/www/load_balancer_relay_protocol_edit.php:140
+#: usr/local/www/load_balancer_setting.php:100
+#: usr/local/www/load_balancer_virtual_server.php:99
+#: usr/local/www/load_balancer_virtual_server_edit.php:147
+#: usr/local/www/status_lb_pool.php:63 usr/local/www/status_lb_vs.php:57
+msgid "Load Balancer"
+msgstr "Yük Dengeleyici"
+
+#: usr/local/www/diag_logs.php:87 usr/local/www/diag_logs_auth.php:78
+#: usr/local/www/diag_logs_dhcp.php:81 usr/local/www/diag_logs_filter.php:144
+#: usr/local/www/diag_logs_filter_dynamic.php:109
+#: usr/local/www/diag_logs_filter_summary.php:198
+#: usr/local/www/diag_logs_gateways.php:89
+#: usr/local/www/diag_logs_ipsec.php:82 usr/local/www/diag_logs_ntpd.php:55
+#: usr/local/www/diag_logs_ntpd.php:76 usr/local/www/diag_logs_openvpn.php:80
+#: usr/local/www/diag_logs_ppp.php:78 usr/local/www/diag_logs_relayd.php:77
+#: usr/local/www/diag_logs_resolver.php:89
+#: usr/local/www/diag_logs_routing.php:76
+#: usr/local/www/diag_logs_settings.php:276
+#: usr/local/www/diag_logs_vpn.php:136 usr/local/www/diag_logs_wireless.php:78
+#: usr/local/www/fbegin.inc:150 usr/local/www/fbegin.inc:183
+#: usr/local/www/services_ntpd.php:180 usr/local/www/services_ntpd.php:237
+#: usr/local/www/services_ntpd_gps.php:366
+#: usr/local/www/services_ntpd_pps.php:117 usr/local/www/status_ntpd.php:164
+#: usr/local/www/status_rrd_graph_settings.php:62
+msgid "NTP"
+msgstr "NTP"
+
+#: usr/local/www/diag_logs.php:88 usr/local/www/diag_logs_auth.php:79
+#: usr/local/www/diag_logs_dhcp.php:82 usr/local/www/diag_logs_filter.php:145
+#: usr/local/www/diag_logs_filter_dynamic.php:110
+#: usr/local/www/diag_logs_filter_summary.php:199
+#: usr/local/www/diag_logs_gateways.php:90
+#: usr/local/www/diag_logs_ipsec.php:83 usr/local/www/diag_logs_ntpd.php:77
+#: usr/local/www/diag_logs_openvpn.php:81 usr/local/www/diag_logs_ppp.php:79
+#: usr/local/www/diag_logs_relayd.php:78
+#: usr/local/www/diag_logs_resolver.php:90
+#: usr/local/www/diag_logs_routing.php:77
+#: usr/local/www/diag_logs_settings.php:187
+#: usr/local/www/diag_logs_settings.php:277
+#: usr/local/www/diag_logs_vpn.php:137 usr/local/www/diag_logs_wireless.php:79
+#: usr/local/www/load_balancer_monitor.php:111
+#: usr/local/www/load_balancer_pool.php:120
+#: usr/local/www/load_balancer_setting.php:100
+#: usr/local/www/load_balancer_setting.php:123
+#: usr/local/www/load_balancer_virtual_server.php:121
+#: usr/local/www/status_rrd_graph.php:452
+#: usr/local/www/status_rrd_graph_settings.php:171
+#: usr/local/www/system_authservers.php:450
+#: usr/local/www/system_firmware_settings.php:87
+#: usr/local/www/system_groupmanager.php:290
+#: usr/local/www/system_groupmanager_addprivs.php:170
+#: usr/local/www/system_usermanager.php:496
+#: usr/local/www/system_usermanager_addprivs.php:159
+#: usr/local/www/system_usermanager_settings.php:116
+#: usr/local/www/vpn_ipsec_settings.php:168
+msgid "Settings"
+msgstr "Ayarlar"
+
+#: usr/local/www/diag_logs.php:97 usr/local/www/diag_logs_gateways.php:67
+#: usr/local/www/diag_logs_gateways.php:99
+#: usr/local/www/diag_logs_resolver.php:99
+#: usr/local/www/diag_logs_routing.php:85
+#: usr/local/www/diag_logs_wireless.php:87 usr/local/www/fbegin.inc:176
+#: usr/local/www/status_gateway_groups.php:66
+#: usr/local/www/status_gateway_groups.php:77
+#: usr/local/www/status_gateways.php:52 usr/local/www/status_gateways.php:64
+#: usr/local/www/system_gateway_groups.php:119
+#: usr/local/www/system_gateway_groups.php:132
+#: usr/local/www/system_gateway_groups_edit.php:153
+#: usr/local/www/system_gateways.php:182 usr/local/www/system_gateways.php:203
+#: usr/local/www/system_gateways_edit.php:523
+#: usr/local/www/system_routes.php:220
+msgid "Gateways"
+msgstr "Ağ Geçitleri"
+
+#: usr/local/www/diag_logs.php:98 usr/local/www/diag_logs_gateways.php:100
+#: usr/local/www/diag_logs_resolver.php:100
+#: usr/local/www/diag_logs_routing.php:55
+#: usr/local/www/diag_logs_routing.php:86
+#: usr/local/www/diag_logs_wireless.php:88 usr/local/www/fbegin.inc:108
+msgid "Routing"
+msgstr "Yönlendirmeler"
+
+#: usr/local/www/diag_logs.php:99 usr/local/www/diag_logs_gateways.php:101
+#: usr/local/www/diag_logs_resolver.php:67
+#: usr/local/www/diag_logs_resolver.php:101
+#: usr/local/www/diag_logs_routing.php:87
+#: usr/local/www/diag_logs_wireless.php:89
+msgid "Resolver"
+msgstr "Çözücü"
+
+#: usr/local/www/diag_logs.php:100 usr/local/www/diag_logs_gateways.php:102
+#: usr/local/www/diag_logs_resolver.php:102
+#: usr/local/www/diag_logs_routing.php:88
+#: usr/local/www/diag_logs_wireless.php:57
+#: usr/local/www/diag_logs_wireless.php:90 usr/local/www/fbegin.inc:201
+#: usr/local/www/interfaces_assign.php:467
+#: usr/local/www/interfaces_bridge.php:102 usr/local/www/interfaces_gif.php:96
+#: usr/local/www/interfaces_gre.php:97 usr/local/www/interfaces_groups.php:79
+#: usr/local/www/interfaces_lagg.php:102 usr/local/www/interfaces_ppps.php:94
+#: usr/local/www/interfaces_qinq.php:105 usr/local/www/interfaces_vlan.php:99
+#: usr/local/www/interfaces_wireless.php:79
+#: usr/local/www/interfaces_wireless.php:94
+#: usr/local/www/interfaces_wireless_edit.php:151
+#: usr/local/www/status_rrd_graph.php:431
+#: usr/local/www/status_rrd_graph_settings.php:150
+#: usr/local/www/status_wireless.php:42
+msgid "Wireless"
+msgstr "Kablosuz"
+
+#: usr/local/www/diag_logs.php:110 usr/local/www/diag_logs_gateways.php:112
+#: usr/local/www/diag_logs_resolver.php:112
+#, php-format
+msgid "Last %s system log entries"
+msgstr "Sistem günlüğü son %s girdisi"
+
+#: usr/local/www/diag_logs.php:121 usr/local/www/diag_logs_auth.php:93
+#: usr/local/www/diag_logs_dhcp.php:96 usr/local/www/diag_logs_filter.php:410
+#: usr/local/www/diag_logs_gateways.php:123
+#: usr/local/www/diag_logs_ipsec.php:110 usr/local/www/diag_logs_ntpd.php:92
+#: usr/local/www/diag_logs_openvpn.php:98 usr/local/www/diag_logs_ppp.php:96
+#: usr/local/www/diag_logs_relayd.php:92
+#: usr/local/www/diag_logs_resolver.php:123
+#: usr/local/www/diag_logs_routing.php:103 usr/local/www/diag_logs_vpn.php:188
+#: usr/local/www/diag_logs_wireless.php:105
+msgid "Clear log"
+msgstr "Günlüğü temizle"
+
+#: usr/local/www/diag_logs_auth.php:89
+#, php-format
+msgid "Last %s Portal Auth log entries"
+msgstr "Hizmet Portalı son %s kimlik doğrulama girdisi"
+
+#: usr/local/www/diag_logs_dhcp.php:92
+#, php-format
+msgid "Last %s DHCP service log entries"
+msgstr "DHCP servisi son %s günlük girdisi"
+
+#: usr/local/www/diag_logs_filter.php:58
+msgid "Cannot resolve"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:78
+msgid "The rule that triggered this action is"
+msgstr "Bu eylemi tetikleyen kural"
+
+#: usr/local/www/diag_logs_filter.php:152
+#: usr/local/www/diag_logs_filter_dynamic.php:117
+#: usr/local/www/diag_logs_filter_summary.php:206
+msgid "Normal View"
+msgstr "Normal görünüm"
+
+#: usr/local/www/diag_logs_filter.php:153
+#: usr/local/www/diag_logs_filter_dynamic.php:118
+#: usr/local/www/diag_logs_filter_summary.php:207
+msgid "Dynamic View"
+msgstr "Dinamik Görünüm"
+
+#: usr/local/www/diag_logs_filter.php:154
+#: usr/local/www/diag_logs_filter_dynamic.php:119
+#: usr/local/www/diag_logs_filter_summary.php:208
+msgid "Summary View"
+msgstr "Özet Görünüm"
+
+#: usr/local/www/diag_logs_filter.php:181
+#: usr/local/www/diag_logs_filter.php:322
+#: usr/local/www/diag_logs_filter_dynamic.php:136
+#: usr/local/www/diag_logs_vpn.php:175 usr/local/www/diag_system_pftop.php:141
+#: usr/local/www/firewall_schedule_edit.php:922
+#: usr/local/www/widgets/widgets/log.widget.php:179
+msgid "Time"
+msgstr "Zaman"
+
+# 82%
+#: usr/local/www/diag_logs_filter.php:185
+msgid "Source IP Address"
+msgstr "Kaynak IP Adresi"
+
+#: usr/local/www/diag_logs_filter.php:189
+#: usr/local/www/diag_system_pftop.php:158 usr/local/www/diag_testport.php:129
+#: usr/local/www/firewall_nat_out.php:307
+#: usr/local/www/firewall_nat_out.php:544
+msgid "Source Port"
+msgstr "Kaynak port"
+
+# 75%
+#: usr/local/www/diag_logs_filter.php:197
+#: usr/local/www/diag_logs_filter.php:277
+msgid "Quantity"
+msgstr "Miktar"
+
+# 86%
+#: usr/local/www/diag_logs_filter.php:207
+msgid "Destination IP Address"
+msgstr "Hedef IP Adresi"
+
+#: usr/local/www/diag_logs_filter.php:211
+#: usr/local/www/diag_system_pftop.php:151
+#: usr/local/www/firewall_nat_out.php:309
+#: usr/local/www/firewall_nat_out.php:546
+msgid "Destination Port"
+msgstr "Hedef Port"
+
+#: usr/local/www/diag_logs_filter.php:215
+msgid "Protocol Flags"
+msgstr "Protokol Bayrakları"
+
+#: usr/local/www/diag_logs_filter.php:225
+#: usr/local/www/diag_logs_filter.php:288
+#, php-format
+msgid "Matches %1$s regular expression%2$s."
+msgstr "Düzenli ifade %2$s Eşleşen %1$s."
+
+#: usr/local/www/diag_logs_filter.php:226
+msgid "Precede with exclamation (!) as first character to exclude match."
+msgstr "Eşleşmeyi ilk karakterden hariç tutmak için ünlem (!) koyun."
+
+#: usr/local/www/diag_logs_filter.php:273 usr/local/www/diag_routes.php:193
+msgid "Filter expression"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:314
+#, php-format
+msgid "Last %s firewall log entries."
+msgstr "Güvenlik Duvarı son %s günlük girdisi."
+
+#: usr/local/www/diag_logs_filter.php:316
+msgid "matched log entries."
+msgstr "uyan günlük girdisi."
+
+#: usr/local/www/diag_logs_filter.php:317
+#, php-format
+msgid "Max(%s)"
+msgstr "En fazla (%s)"
+
+#: usr/local/www/diag_logs_filter.php:321
+#: usr/local/www/diag_logs_filter_dynamic.php:135
+#: usr/local/www/widgets/widgets/log.widget.php:178
+msgid "Act"
+msgstr "Eyl"
+
+#: usr/local/www/diag_logs_filter.php:323
+#: usr/local/www/diag_logs_filter_dynamic.php:137
+#: usr/local/www/firewall_nat.php:204 usr/local/www/services_rfc2136.php:80
+msgid "If"
+msgstr "Arabirim"
+
+#: usr/local/www/diag_logs_filter.php:325
+msgid "Rule"
+msgstr "Kural"
+
+#: usr/local/www/diag_logs_filter.php:370
+#: usr/local/www/diag_logs_filter.php:376
+msgid "Click to resolve"
+msgstr ""
+
+#: usr/local/www/diag_logs_filter.php:371
+msgid "Easy Rule: Add to Block List"
+msgstr "Kolay Kural: Engelleme listesine ekle"
+
+#: usr/local/www/diag_logs_filter.php:371
+msgid "Do you really want to add this BLOCK rule?"
+msgstr "Bu ENGEL kuralını eklemek istediğinize emin misiniz?"
+
+#: usr/local/www/diag_logs_filter.php:377
+msgid "Easy Rule: Pass this traffic"
+msgstr "Kolay Kural: Bu trafiğe izin ver"
+
+#: usr/local/www/diag_logs_filter.php:377
+msgid "Do you really want to add this PASS rule?"
+msgstr "Bu İZİN Kuralını eklemek istediğinize emin misiniz?"
+
+#: usr/local/www/diag_logs_filter.php:398
+#, php-format
+msgid "Last %s firewall log entries"
+msgstr "Güvenlik Duvarı son %s günlük girdisi "
+
+#: usr/local/www/diag_logs_filter_dynamic.php:62
+msgid "Firewall (Dynamic View)"
+msgstr "Güvenlik Duvarı (Dinamik Görünüm)"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:131
+#, php-format
+msgid "Last %s records"
+msgstr "Son %s kayıtlar"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:131
+msgid "Pause:"
+msgstr "Duraklat:"
+
+#: usr/local/www/diag_logs_filter_dynamic.php:173
+msgid "TCP Flags"
+msgstr "TCP Bayrakları"
+
+#: usr/local/www/diag_logs_filter_summary.php:35
+msgid "Firewall Log Summary"
+msgstr "Güvenlik duvarı günlük özeti"
+
+#: usr/local/www/diag_logs_filter_summary.php:47
+#: usr/local/www/load_balancer_relay_protocol_edit.php:231
+msgid "Actions"
+msgstr "Eylemler"
+
+#: usr/local/www/diag_logs_filter_summary.php:49
+msgid "Protocols"
+msgstr "Protokoller"
+
+#: usr/local/www/diag_logs_filter_summary.php:50
+msgid "Source IPs"
+msgstr "Kaynak IPler"
+
+#: usr/local/www/diag_logs_filter_summary.php:51
+msgid "Destination IPs"
+msgstr "Hedef IPler"
+
+#: usr/local/www/diag_logs_filter_summary.php:52
+msgid "Source Ports"
+msgstr "Kaynak Portlar"
+
+#: usr/local/www/diag_logs_filter_summary.php:53
+msgid "Destination Ports"
+msgstr "Hedef Portlar"
+
+#: usr/local/www/diag_logs_filter_summary.php:73
+msgid "data"
+msgstr "veri"
+
+#: usr/local/www/diag_logs_filter_summary.php:83
+#: usr/local/www/widgets/widgets/log.widget.php:201
+#: usr/local/www/widgets/widgets/log.widget.php:204
+msgid "Reverse Resolve with DNS"
+msgstr "DNS ters çözümleme yap"
+
+#: usr/local/www/diag_logs_filter_summary.php:219
+#, php-format
+msgid ""
+"This is a firewall log summary, of the last %1$s lines of the firewall log "
+"(Max %2$s)."
+msgstr ""
+"Güvenlik Duvarı olay günlüğünün son %1$s satırının özetidir (en fazla %2$s)."
+
+#: usr/local/www/diag_logs_filter_summary.php:220
+msgid "NOTE: IE8 users must enable compatibility view."
+msgstr "NOT: IE8 kullanıcıları uyumluluk görünümünü etkinleştirmelidir."
+
+#: usr/local/www/diag_logs_ipsec.php:93
+#, php-format
+msgid "Last %s IPsec log entries"
+msgstr "IPSec son %s günlük girdisi"
+
+#: usr/local/www/diag_logs_ntpd.php:87
+#, php-format
+msgid "Last %s NTP log entries"
+msgstr "Son %s NTP günlük girdileri"
+
+#: usr/local/www/diag_logs_openvpn.php:91
+#, php-format
+msgid "Last %s OpenVPN log entries"
+msgstr "OpenVPN son %s olay girdisi"
+
+#: usr/local/www/diag_logs_ppp.php:89
+#, php-format
+msgid "Last %s PPP log entries"
+msgstr "Son %s PPP günlük girdisi"
+
+#: usr/local/www/diag_logs_relayd.php:88
+#, php-format
+msgid "Last %s Load Balancer log entries"
+msgstr "Yük Dengeleyici son %s günlük girdisi"
+
+#: usr/local/www/diag_logs_routing.php:99
+#, php-format
+msgid "Routing daemon log entries"
+msgstr "Yönlendirme servisi günlük girdileri"
+
+#: usr/local/www/diag_logs_settings.php:88
+#: usr/local/www/diag_logs_settings.php:366
+msgid "Reset Log Files"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:90
+msgid "The log files have been reset."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:98
+msgid ""
+"A valid IP address/hostname or IP/hostname:port must be specified for remote "
+"syslog server #1."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:101
+msgid ""
+"A valid IP address/hostname or IP/hostname:port must be specified for remote "
+"syslog server #2."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:104
+msgid ""
+"A valid IP address/hostname or IP/hostname:port must be specified for remote "
+"syslog server #3."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:108
+msgid "Number of log entries to show must be between 5 and 2000."
+msgstr "Gösterilecek günlük girdisi sayısı 5 ile 2000 arasında olmalıdır."
+
+#: usr/local/www/diag_logs_settings.php:113
+msgid "Log file size must be a positive integer greater than 5120."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:178
+#: usr/local/www/system_advanced_admin.php:650
+msgid "webConfigurator configuration has changed. Restarting webConfigurator."
+msgstr "webArayüzü ayarları değiştirildi. webArayüzü tekrar başlatılıyor."
+
+#: usr/local/www/diag_logs_settings.php:180
+msgid "WebGUI process is restarting."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:286
+msgid "General Logging Options"
+msgstr "Genel Günlükleme Ayarları"
+
+#: usr/local/www/diag_logs_settings.php:291
+msgid "Show log entries in reverse order (newest entries on top)"
+msgstr "Günlük girdilerini tersten (en yeni kayıtlar en üstte) göster"
+
+#: usr/local/www/diag_logs_settings.php:297
+msgid ""
+"Hint: This is only the number of log entries displayed in the GUI. It does "
+"not affect how many entries are contained in the actual log files."
+msgstr ""
+"İpucu: Bu sadece GUI (webArayüz) tarafından görüntülenecek günlük girdisi "
+"sayısı içindir. Bu gerçek günlük dosyalarında bulunan girdilerin sayısının "
+"kaç tane olduğunu etkilemez."
+
+#: usr/local/www/diag_logs_settings.php:303
+msgid ""
+"Logs are held in constant-size circular log files. This field controls how "
+"large each log file is, and thus how many entries may exist inside the log. "
+"By default this is approximately 500KB per log file, and there are nearly 20 "
+"such log files."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:305
+msgid ""
+"NOTE: Log sizes are changed the next time a log file is cleared or deleted. "
+"To immediately increase the size of the log files, you must first save the "
+"options to set the size, then clear all logs using the \"Reset Log Files\" "
+"option farther down this page. "
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:306
+msgid ""
+"Be aware that increasing this value increases every log file size, so disk "
+"usage will increase significantly."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:307
+msgid "Disk space currently used by log files: "
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:308
+msgid "Remaining disk space for log files: "
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:315
+msgid "Log packets matched from the default block rules put in the ruleset"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:316
+msgid ""
+"Hint: packets that are blocked by the implicit default block rule will not "
+"be logged if you uncheck this option. Per-rule logging options are still "
+"respected."
+msgstr ""
+"İpucu: Eğer bu seçeneğin işaretini kaldırırsanız varsayılan kural tarafından "
+"engellenen paketler kayıt altına alınmayacaktır. Kuralların kendi günlükleme "
+"seçenekleri etkilenmez."
+
+#: usr/local/www/diag_logs_settings.php:319
+msgid "Log packets matched from the default pass rules put in the ruleset"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:320
+msgid ""
+"Hint: packets that are allowed by the implicit default pass rule will be "
+"logged if you check this option. Per-rule logging options are still "
+"respected."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:323
+msgid "Log packets blocked by 'Block Bogon Networks' rules"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:326
+msgid "Log packets blocked by 'Block Private Networks' rules"
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:332
+msgid "Log errors from the web server process."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:333
+msgid ""
+"Hint: If this is checked, errors from the lighttpd web server process for "
+"the GUI or Captive Portal will appear in the main system log."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:338
+msgid "Show raw filter logs"
+msgstr "Ham filtreleme günlüklerini göster"
+
+#: usr/local/www/diag_logs_settings.php:339
+msgid ""
+"Hint: If this is checked, filter logs are shown as generated by the packet "
+"filter, without any formatting. This will reveal more detailed information, "
+"but it is more difficult to read."
+msgstr ""
+"İpucu: Eğer bu seçeneği işaretlerseniz, filtre günlükleri paket filtresinin "
+"oluşturduğu haliyle, herhangi bir biçimlendirme uygulanmadan gösterilir. Bu "
+"durumda daha fazla detay görüntülenir, ancak okuması daha zordur."
+
+#: usr/local/www/diag_logs_settings.php:349
+msgid "Show the applied rule description below or in the firewall log rows."
+msgstr ""
+"Uygulanan kural açıklamalarını aşşağıda yada Güvenlik Duvarı kayıt "
+"satırlarında görebilirsiniz."
+
+#: usr/local/www/diag_logs_settings.php:351
+msgid ""
+"Displaying rule descriptions for all lines in the log might affect "
+"performance with large rule sets."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:358
+msgid "Disable writing log files to the local disk"
+msgstr "Yerel diske (Harddisk) günlük dosyalarını yazmayı devre dışı bırak."
+
+#: usr/local/www/diag_logs_settings.php:360
+msgid "Disable writing log files to the local RAM disk"
+msgstr "Günlük dosyalarının yerel RAM diske yazılması özelliğini kapat"
+
+#: usr/local/www/diag_logs_settings.php:366
+msgid ""
+"Do you really want to reset the log files? This will erase all local log "
+"data."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:368
+msgid ""
+"Note: Clears all local log files and reinitializes them as empty logs. This "
+"also restarts the DHCP daemon. Use the Save button first if you have made "
+"any setting changes."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:375
+msgid "Remote Logging Options"
+msgstr "Uzak Günlük Seçenekleri"
+
+#: usr/local/www/diag_logs_settings.php:378 usr/local/www/diag_ping.php:114
+#: usr/local/www/diag_system_pftop.php:159 usr/local/www/diag_testport.php:143
+#: usr/local/www/diag_traceroute.php:114
+msgid "Source Address"
+msgstr "Kaynak Adres"
+
+#: usr/local/www/diag_logs_settings.php:394
+msgid ""
+"This option will allow the logging daemon to bind to a single IP address, "
+"rather than all IP addresses."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:395
+msgid ""
+"If you pick a single IP, remote syslog severs must all be of that IP type. "
+"If you wish to mix IPv4 and IPv6 remote syslog servers, you must bind to all "
+"interfaces."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:397
+msgid ""
+"NOTE: If an IP address cannot be located on the chosen interface, the daemon "
+"will bind to all addresses."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:401 usr/local/www/diag_ping.php:105
+#: usr/local/www/diag_testport.php:161 usr/local/www/diag_traceroute.php:105
+msgid "IP Protocol"
+msgstr "IP Protokolü"
+
+#: usr/local/www/diag_logs_settings.php:408
+msgid ""
+"This option is only used when a non-default address is chosen as the source "
+"above. This option only expresses a preference; If an IP address of the "
+"selected type is not found on the chosen interface, the other type will be "
+"tried."
+msgstr ""
+
+#: usr/local/www/diag_logs_settings.php:412
+msgid "Enable Remote Logging"
+msgstr "Uzak Günlük Tutmayı Etkinleştir"
+
+#: usr/local/www/diag_logs_settings.php:414
+msgid "Send log messages to remote syslog server"
+msgstr "Sistem günlüklerini uzaktaki Syslog sunusuna gönder"
+
+#: usr/local/www/diag_logs_settings.php:417
+msgid "Remote Syslog Servers"
+msgstr "Uzak Syslog Sunucuları"
+
+#: usr/local/www/diag_logs_settings.php:434
+msgid "IP addresses of remote syslog servers, or an IP:port."
+msgstr "Uzak syslog sunucularının IP adresleri, yada IP:port."
+
+#: usr/local/www/diag_logs_settings.php:440
+msgid "Remote Syslog Contents"
+msgstr "Uzak Syslog İçerikleri"
+
+#: usr/local/www/diag_logs_settings.php:443
+msgid "Everything"
+msgstr "Herşey"
+
+#: usr/local/www/diag_logs_settings.php:445
+msgid "System events"
+msgstr "Sistem olayları"
+
+#: usr/local/www/diag_logs_settings.php:447
+msgid "Firewall events"
+msgstr "Güvenlik Duvarı olayları"
+
+#: usr/local/www/diag_logs_settings.php:449
+msgid "DHCP service events"
+msgstr "DHCP servisi olayları"
+
+#: usr/local/www/diag_logs_settings.php:451
+msgid "Portal Auth events"
+msgstr "Hizmet Portalı olayları"
+
+#: usr/local/www/diag_logs_settings.php:453
+msgid "VPN (PPTP, IPsec, OpenVPN) events"
+msgstr "VPN (PPTP, IPsec, OpenVPN) olayları"
+
+#: usr/local/www/diag_logs_settings.php:455
+msgid "Gateway Monitor events"
+msgstr "Ağ geçidi izleme olayları"
+
+#: usr/local/www/diag_logs_settings.php:457
+msgid "Server Load Balancer events"
+msgstr "Sunucu Yük Dengeleyici olayları"
+
+#: usr/local/www/diag_logs_settings.php:459
+msgid "Wireless events"
+msgstr "Kablosuz olayları"
+
+#: usr/local/www/diag_logs_settings.php:470
+msgid ""
+"syslog sends UDP datagrams to port 514 on the specified remote syslog "
+"server, unless another port is specified. Be sure to set syslogd on the "
+"remote server to accept syslog messages from"
+msgstr ""
+"syslog UDP verigramlarını 514. porttan başka bir port belirtilmediğinde UDP "
+"olarak uzak syslog sunucusuna gönderir. Uzak sunucudan syslog mesajlarını "
+"kabul etme ayarlarının açık olduğundan emin olun"
+
+#: usr/local/www/diag_logs_vpn.php:144
+msgid "PPTP Logins"
+msgstr "PPTP Oturumları"
+
+#: usr/local/www/diag_logs_vpn.php:147
+msgid "PPTP Raw"
+msgstr "Ham PPTP"
+
+#: usr/local/www/diag_logs_vpn.php:150
+msgid "PPPoE Logins"
+msgstr "PPPoE Oturumları"
+
+#: usr/local/www/diag_logs_vpn.php:153
+msgid "PPPoE Raw"
+msgstr "Ham PPPoE"
+
+#: usr/local/www/diag_logs_vpn.php:156
+msgid "L2TP Logins"
+msgstr "L2TP Oturumları"
+
+#: usr/local/www/diag_logs_vpn.php:159
+msgid "L2TP Raw"
+msgstr "Ham L2TP"
+
+#: usr/local/www/diag_logs_vpn.php:171
+#, php-format
+msgid "Last %1$s %2$s VPN log entries"
+msgstr "VPN %1$s %2$s günlük girdileri"
+
+#: usr/local/www/diag_logs_wireless.php:101
+#, php-format
+msgid "Wireless (hostapd) log entries"
+msgstr "Kablosuz (hostapd) günlük girdileri"
+
+#: usr/local/www/diag_nanobsd.php:50 usr/local/www/fbegin.inc:236
+msgid "NanoBSD"
+msgstr "NanoBSD"
+
+#: usr/local/www/diag_nanobsd.php:70
+msgid "Setting slice information, please wait..."
+msgstr "Dilim bilgisi yapılandıılıyor, lütfen bekleyiniz..."
+
+#: usr/local/www/diag_nanobsd.php:79
+msgid "The boot slice has been set to"
+msgstr "Yeni açılış dilimi"
+
+#: usr/local/www/diag_nanobsd.php:86
+msgid "Duplicating slice. Please wait, this will take a moment..."
+msgstr "Dilim çoğaltılıyor. Lütfen bekleyin, biraz zaman alabilir..."
+
+#: usr/local/www/diag_nanobsd.php:95
+msgid "The slice has been duplicated."
+msgstr "Dilim çoğaltıldı."
+
+#: usr/local/www/diag_nanobsd.php:95
+msgid ""
+"If you would like to boot from this newly duplicated slice please set it "
+"using the bootup information area."
+msgstr ""
+"Eğer sistemi bu yeni dilimden açmak isterseniz açılış bilgisi bölümünden "
+"ayarlayabilirsiniz."
+
+#: usr/local/www/diag_nanobsd.php:97
+msgid "There was an error while duplicating the slice. Operation aborted."
+msgstr "Dilim çoğaltılırken bir hata oluştu. İşlem iptal edildi."
+
+#: usr/local/www/diag_nanobsd.php:139
+#: usr/local/www/system_advanced_admin.php:324
+#: usr/local/www/system_advanced_firewall.php:287
+#: usr/local/www/system_advanced_misc.php:304
+#: usr/local/www/system_advanced_network.php:205
+#: usr/local/www/system_advanced_sysctl.php:175
+msgid "The options on this page are intended for use by advanced users only."
+msgstr "Bu sayfadaki seçenekler sadece ileri düzey kullanıcılar içindir."
+
+#: usr/local/www/diag_nanobsd.php:145
+msgid "Bootup information"
+msgstr "Açılış bilgisi"
+
+#: usr/local/www/diag_nanobsd.php:148
+msgid "NanoBSD Image size"
+msgstr "NanoBSD imaj boyutu"
+
+#: usr/local/www/diag_nanobsd.php:154
+msgid "Bootup"
+msgstr "Açılış"
+
+#: usr/local/www/diag_nanobsd.php:157
+msgid "Bootup slice is currently:"
+msgstr "Güncel açılış dilimi:"
+
+#: usr/local/www/diag_nanobsd.php:158
+msgid "This will switch the bootup slice to the alternate slice."
+msgstr "Bu işlem açılış dilimini diğer dilim olarak değiştirir."
+
+#: usr/local/www/diag_nanobsd.php:168
+msgid "Media Read/Write Status"
+msgstr "Ortam Oku/Yaz Durumu"
+
+#: usr/local/www/diag_nanobsd.php:182
+msgid "Read/Write"
+msgstr "Oku/Yaz"
+
+#: usr/local/www/diag_nanobsd.php:184
+msgid "Switch to Read-Only"
+msgstr "Salt okunur' a değiştir"
+
+#: usr/local/www/diag_nanobsd.php:186
+msgid "Read-Only"
+msgstr "Salt okunur"
+
+#: usr/local/www/diag_nanobsd.php:188
+msgid "Switch to Read/Write"
+msgstr "Oku/Yaz' ı değiştir"
+
+#: usr/local/www/diag_nanobsd.php:191
+msgid ""
+"NOTE: This setting is only temporary, and can be switched dynamically in the "
+"background."
+msgstr ""
+"NOT: Bu ​​ayar geçicidir, ve arka planda dinamik olarak değiştirilebilir."
+
+#: usr/local/www/diag_nanobsd.php:198
+msgid "Keep media mounted read/write at all times."
+msgstr "Okuma/yazma için ortamı her zaman takılı tut (mounted)."
+
+#: usr/local/www/diag_nanobsd.php:207
+msgid "Duplicate bootup slice to alternate"
+msgstr "Açılış dilimini alternatif dilime çoğalt"
+
+#: usr/local/www/diag_nanobsd.php:210
+msgid "Duplicate bootup slice"
+msgstr "Açılış dilimini çoğalt"
+
+#: usr/local/www/diag_nanobsd.php:213
+msgid "Destination slice:"
+msgstr "Hedef dilim:"
+
+#: usr/local/www/diag_nanobsd.php:220
+msgid ""
+"This will duplicate the bootup slice to the alternate slice. Use this if "
+"you would like to duplicate the known good working boot partition to the "
+"alternate."
+msgstr ""
+"Bu işlem açılış dilimini alternatif dilime çoğaltır. Bu seçeneği çalıştığını "
+"bildiğiniz açılış bölümünü alternatif bölüme çoğaltmak için kullanın."
+
+#: usr/local/www/diag_nanobsd.php:221
+msgid "Duplicate slice"
+msgstr ""
+
+#: usr/local/www/diag_nanobsd.php:229
+msgid "Periodic Data Backup"
+msgstr "Periyodik Veri Yedekleme"
+
+#: usr/local/www/diag_nanobsd.php:232
+msgid "RRD/DHCP Backup"
+msgstr "RRD/DHCP Yedek"
+
+#: usr/local/www/diag_nanobsd.php:234
+msgid "These options have been relocated to"
+msgstr "Bu ayarlar yeniden konumlandırıldı"
+
+# 75%
+#: usr/local/www/diag_nanobsd.php:234
+msgid "System > Advanced, Miscellaneous tab"
+msgstr "Sistem: Gelişmiş, Diğer sekmesine"
+
+#: usr/local/www/diag_nanobsd.php:242
+msgid "View upgrade log"
+msgstr "Yükseltme günlüğünü görüntüle"
+
+#: usr/local/www/diag_nanobsd.php:245
+msgid "View previous upgrade log"
+msgstr "Önceki yükseltme günlüğünü göster"
+
+#: usr/local/www/diag_ndp.php:107 usr/local/www/fbegin.inc:219
+msgid "NDP Table"
+msgstr "NDB Tablosu"
+
+#: usr/local/www/diag_ndp.php:133 usr/local/www/interfaces.php:564
+#: usr/local/www/interfaces.php:1883 usr/local/www/services_dhcpv6.php:859
+#: usr/local/www/services_dhcpv6_edit.php:210
+#: usr/local/www/status_dhcpv6_leases.php:416
+#: usr/local/www/status_interfaces.php:291
+msgid "IPv6 address"
+msgstr "IPv6 adresi"
+
+#: usr/local/www/diag_packet_capture.php:85
+#: usr/local/www/diag_packet_capture.php:371
+msgid "Download Capture"
+msgstr "Yakalanan Paketleri İndir"
+
+#: usr/local/www/diag_packet_capture.php:88 usr/local/www/fbegin.inc:234
+msgid "Packet Capture"
+msgstr "Paket Yakalama"
+
+#: usr/local/www/diag_packet_capture.php:127
+msgid "Invalid interface."
+msgstr "Geçersiz arabirim."
+
+#: usr/local/www/diag_packet_capture.php:130
+msgid "Invalid address family."
+msgstr "Geçersiz adres ailesi."
+
+#: usr/local/www/diag_packet_capture.php:133
+msgid "Invalid protocol."
+msgstr "Geçersiz protokol."
+
+#: usr/local/www/diag_packet_capture.php:145
+#, php-format
+msgid "A valid IP address or CIDR block must be specified. [%s]"
+msgstr "Geçerli bir IP adresi yada CIDR bloğu belirtilmelidir. [%s]"
+
+#: usr/local/www/diag_packet_capture.php:151
+msgid "Invalid value specified for port."
+msgstr "Port için belirtilen değer geçersiz."
+
+#: usr/local/www/diag_packet_capture.php:158
+msgid "Invalid value specified for packet length."
+msgstr "Paket uzunluğu için beliritlen değer geçersiz."
+
+#: usr/local/www/diag_packet_capture.php:165
+msgid "Invalid value specified for packet count."
+msgstr "Paket sayısı için belirtilen değer geçersiz."
+
+#: usr/local/www/diag_packet_capture.php:191
+#: usr/local/www/diag_packet_capture.php:365
+#: usr/local/www/diag_packet_capture.php:420
+#: usr/local/www/status_dhcp_leases.php:334
+#: usr/local/www/status_dhcpv6_leases.php:420
+#: usr/local/www/status_dhcpv6_leases.php:505
+msgid "Start"
+msgstr "Başlat"
+
+#: usr/local/www/diag_packet_capture.php:198
+#: usr/local/www/diag_packet_capture.php:364
+#: usr/local/www/diag_packet_capture.php:367
+msgid "Stop"
+msgstr "Durdur"
+
+#: usr/local/www/diag_packet_capture.php:240
+msgid "Packet capture"
+msgstr "Paket yakalama"
+
+#: usr/local/www/diag_packet_capture.php:254
+msgid "Select the interface on which to capture traffic."
+msgstr "Üzerinden geçen trafiğin kaydedileceği arabirimi seçiniz."
+
+#: usr/local/www/diag_packet_capture.php:258
+msgid "Promiscuous"
+msgstr "Karışıklık"
+
+#: usr/local/www/diag_packet_capture.php:261
+msgid "If checked, the"
+msgstr "Eğer işaretlendiyse, "
+
+# 92%
+#: usr/local/www/diag_packet_capture.php:261
+msgid "packet capture"
+msgstr "paket yakalama"
+
+#: usr/local/www/diag_packet_capture.php:261
+msgid "will be performed using promiscuous mode."
+msgstr "karışıklık kipi kullanılarak gerçekleştirilir."
+
+#: usr/local/www/diag_packet_capture.php:262
+msgid "Some network adapters do not support or work well in promiscuous mode."
+msgstr "Bağzı ağ adaptörleri karışıklık kipinde çalışmayı desteklemeyebilir."
+
+#: usr/local/www/diag_packet_capture.php:266
+#: usr/local/www/system_gateways_edit.php:672
+msgid "Address Family"
+msgstr "Adres Ailesi"
+
+#: usr/local/www/diag_packet_capture.php:273
+msgid ""
+"Select the type of traffic to be captured, either Any, IPv4 only or IPv6 "
+"only."
+msgstr "Yakalanacak trafik türünü (Tümü, sadece IPv4 veya sadece IPv6) seçin."
+
+#: usr/local/www/diag_packet_capture.php:295
+msgid "Select the protocol to capture, or Any."
+msgstr "Yakalamak için protokol seçin veya tümünü."
+
+#: usr/local/www/diag_packet_capture.php:299
+msgid "Host Address"
+msgstr "Sunucu Adresi"
+
+#: usr/local/www/diag_packet_capture.php:302
+msgid ""
+"This value is either the Source or Destination IP address or subnet in CIDR "
+"notation. The packet capture will look for this address in either field."
+msgstr ""
+"Bu değer kaynak veya hedef IP adresi veya CIDR biçiminde alt ağ olabilir. "
+"Paket yakalama işlemi iki alanda da girdiğiniz adresi arayacaktır."
+
+#: usr/local/www/diag_packet_capture.php:303
+msgid ""
+"Matching can be negated by preceding the value with \"!\". Multiple IP "
+"addresses or CIDR subnets may be specified. Comma (\",\") separated values "
+"perform a boolean \"and\". Separating with a pipe (\"|\") performs a boolean "
+"\"or\"."
+msgstr ""
+
+#: usr/local/www/diag_packet_capture.php:304
+msgid ""
+"If you leave this field blank, all packets on the specified interface will "
+"be captured."
+msgstr ""
+"Bu alanı boş bırakırsanız belirtilen arabirimden geçen tüm paketler "
+"kaydedilir."
+
+#: usr/local/www/diag_packet_capture.php:308
+#: usr/local/www/diag_testport.php:60 usr/local/www/diag_testport.php:123
+#: usr/local/www/firewall_aliases_edit.php:587
+#: usr/local/www/firewall_rules.php:341 usr/local/www/firewall_rules.php:343
+#: usr/local/www/load_balancer_pool.php:134
+#: usr/local/www/load_balancer_pool_edit.php:81
+#: usr/local/www/load_balancer_pool_edit.php:223
+#: usr/local/www/load_balancer_virtual_server.php:135
+#: usr/local/www/load_balancer_virtual_server_edit.php:192
+#: usr/local/www/services_captiveportal.php:731
+#: usr/local/www/services_captiveportal.php:752
+#: usr/local/www/services_captiveportal.php:774
+#: usr/local/www/services_captiveportal.php:793
+#: usr/local/www/status_upnp.php:87
+msgid "Port"
+msgstr "Port"
+
+#: usr/local/www/diag_packet_capture.php:311
+msgid ""
+"The port can be either the source or destination port. The packet capture "
+"will look for this port in either field."
+msgstr ""
+"Bu değer kaynak veya hedef port olabilir. Kaynak veya hedef portu bu değerde "
+"olan paketler kaydedilir."
+
+#: usr/local/www/diag_packet_capture.php:312
+msgid "Leave blank if you do not want to filter by port."
+msgstr ""
+"Port numarasına göre filtrelemek istemiyorsanız bu alanı boş bırakınız."
+
+#: usr/local/www/diag_packet_capture.php:316
+msgid "Packet Length"
+msgstr "Paket Uzunluğu"
+
+#: usr/local/www/diag_packet_capture.php:319
+msgid ""
+"The Packet length is the number of bytes of each packet that will be "
+"captured. Default value is 0, which will capture the entire frame regardless "
+"of its size."
+msgstr ""
+"Bu alana her paketin ilk kaç baytının kaydedileceğini girebilirsiniz. "
+"Öntanımlı değer olan 0 girilirse boyutuna bakılmaksızın tüm çerçeve "
+"kaydedilir."
+
+#: usr/local/www/diag_packet_capture.php:323 usr/local/www/diag_ping.php:60
+#: usr/local/www/diag_ping.php:132
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/services_captiveportal_vouchers_edit.php:190
+msgid "Count"
+msgstr "Adet"
+
+#: usr/local/www/diag_packet_capture.php:326
+msgid ""
+"This is the number of packets the packet capture will grab. Default value is "
+"100."
+msgstr ""
+"Paket yakalamada kaç paketin kaydedileceğini bu bölüme girebilirsiniz. "
+"Öntanımlı değeri 100'dür."
+
+#: usr/local/www/diag_packet_capture.php:326
+msgid "Enter 0 (zero) for no count limit."
+msgstr "Adet sınırını kaldırmak için 0 (sıfır) giriniz."
+
+#: usr/local/www/diag_packet_capture.php:330
+msgid "Level of Detail"
+msgstr "Detay Seviyesi"
+
+#: usr/local/www/diag_packet_capture.php:333
+msgid "Normal"
+msgstr "Normal"
+
+#: usr/local/www/diag_packet_capture.php:334
+msgid "Medium"
+msgstr "Orta"
+
+#: usr/local/www/diag_packet_capture.php:335
+msgid "High"
+msgstr "Yüksek"
+
+#: usr/local/www/diag_packet_capture.php:336
+msgid "Full"
+msgstr "Tam"
+
+#: usr/local/www/diag_packet_capture.php:338
+msgid ""
+"This is the level of detail that will be displayed after hitting 'Stop' when "
+"the packets have been captured."
+msgstr ""
+"Paket yakalama bittiğinde veya [Dur]a tıklandığında yakalanan paketlerin ne "
+"derece detaylı görüntüleneceğini belirler."
+
+#: usr/local/www/diag_packet_capture.php:340
+msgid ""
+"This option does not affect the level of detail when downloading the packet "
+"capture."
+msgstr ""
+"Bu seçenek paket kayıtlarının indirilmesi sırasındaki detay deviyesini "
+"etkilemez."
+
+#: usr/local/www/diag_packet_capture.php:344
+msgid "Reverse DNS Lookup"
+msgstr "Ters DNS Sorgusu"
+
+#: usr/local/www/diag_packet_capture.php:347
+msgid ""
+"This check box will cause the packet capture to perform a reverse DNS lookup "
+"associated with all IP addresses."
+msgstr ""
+"Bu seçenek paket yakalama işleminin tüm IP adreslerine ters DNS sorgusu "
+"uygulanmasını sağlar."
+
+#: usr/local/www/diag_packet_capture.php:348
+msgid "This option can cause delays for large packet captures."
+msgstr ""
+"Bu seçenek paket yakalama boyutu büyük olduğunda gecikmelere sebep olabilir."
+
+#: usr/local/www/diag_packet_capture.php:370
+msgid "View Capture"
+msgstr "Yakalananı Gör"
+
+#: usr/local/www/diag_packet_capture.php:372
+msgid "The packet capture file was last updated:"
+msgstr "Paket yakalama dosyasının son güncellenme zamanı:"
+
+#: usr/local/www/diag_packet_capture.php:385
+#: usr/local/www/diag_packet_capture.php:422
+msgid "Packet Capture is running."
+msgstr "Paket Yakalama çalışıyor."
+
+#: usr/local/www/diag_packet_capture.php:429
+msgid "Packet Capture stopped."
+msgstr "Paket Yakalama durdu."
+
+#: usr/local/www/diag_packet_capture.php:429
+msgid "Packets Captured:"
+msgstr "Yakalanan Paket Sayısı:"
+
+#: usr/local/www/diag_patterns.php:43 usr/local/www/diag_patterns.php:85
+msgid "Upload Pattern file"
+msgstr "Desen dosyası yükle"
+
+#: usr/local/www/diag_patterns.php:49
+#, php-format
+msgid "Added custom l7 pattern %s"
+msgstr ""
+
+#: usr/local/www/diag_patterns.php:51
+msgid "Uploaded file to"
+msgstr "Yüklenen dosyanın konumu"
+
+#: usr/local/www/diag_patterns.php:54
+msgid "Warning: You must upload a file with .pat extension."
+msgstr "Uyarı: Yüklenecek dosya .pat uzantısında olmalıdır."
+
+#: usr/local/www/diag_patterns.php:63
+msgid "Add layer7 pattern"
+msgstr "Layer7 deseni ekle"
+
+#: usr/local/www/diag_patterns.php:74
+msgid "Upload layer7 pattern file"
+msgstr "Layer7 desen dosyası yükle"
+
+#: usr/local/www/diag_patterns.php:77
+msgid "File to upload:"
+msgstr "Yüklenecek dosya:"
+
+#: usr/local/www/diag_pf_info.php:101
+msgid "Gathering PF information, please wait..."
+msgstr "PF bilgisi toplanıyor, lütfen bekleyiniz..."
+
+#: usr/local/www/diag_ping.php:64
+#, php-format
+msgid "Count must be between 1 and %s"
+msgstr "Adet 1 ile %s arasında olmalıdır"
+
+#: usr/local/www/diag_ping.php:70 usr/local/www/diag_traceroute.php:73
+msgid "When using IPv4, the target host must be an IPv4 address or hostname."
+msgstr "IPv4 kullanıldığında, hedef host IPv4 adresi yada host adı olmalı."
+
+#: usr/local/www/diag_ping.php:72 usr/local/www/diag_traceroute.php:75
+msgid "When using IPv6, the target host must be an IPv6 address or hostname."
+msgstr "IPv6 kullanıldığında, hedef host IPv6 adresi yada host adı olmalı."
+
+#: usr/local/www/diag_ping.php:151
+msgid "Ping output"
+msgstr "Ping çıktısı"
+
+#: usr/local/www/diag_pkglogs.php:86
+msgid "Package logs"
+msgstr "Paket günlükleri"
+
+#: usr/local/www/diag_pkglogs.php:97
+msgid "No packages with logging facilities are currently installed."
+msgstr "Şu anda günlükleme özellikli bir paket yok."
+
+#: usr/local/www/diag_pkglogs.php:108 usr/local/www/diag_pkglogs.php:110
+#, php-format
+msgid "%s"
+msgstr "%s"
+
+#: usr/local/www/diag_pkglogs.php:123
+#, php-format
+msgid "Last %1$s %2$s log entries"
+msgstr "Son %1$s %2$s günlük girdisi"
+
+#: usr/local/www/diag_resetstate.php:55
+msgid "The state table has been flushed successfully."
+msgstr "Durum tablosu başarıyla temizlendi."
+
+#: usr/local/www/diag_resetstate.php:61
+msgid "The source tracking table has been flushed successfully."
+msgstr "Kaynak takibi tablosu başarıyla temizlendi."
+
+#: usr/local/www/diag_resetstate.php:65
+msgid "Reset state"
+msgstr "Durumu sıfırla"
+
+#: usr/local/www/diag_resetstate.php:92
+msgid "Firewall state table"
+msgstr "Güvenlik Duvarı durum tablosu"
+
+#: usr/local/www/diag_resetstate.php:94
+msgid ""
+"Resetting the state tables will remove all entries from the corresponding "
+"tables. This means that all open connections will be broken and will have to "
+"be re-established. This may be necessary after making substantial changes to "
+"the firewall and/or NAT rules, especially if there are IP protocol mappings "
+"(e.g. for PPTP or IPv6) with open connections."
+msgstr ""
+"Durum tablosunun temizlenmesi tüm açık bağlantıların kapatılmasına sebep "
+"olur. Dolayısıyla tüm açık bağlantılar kopar ve yeniden kurulmaları gerekir. "
+"Bu sıfırlama işlemi, güvenlik duvarında ve/veya NAT kurallarında büyük "
+"değişiklikler yapıldığında (özellikle PPTP veya IPv6 gibi IP protokol "
+"eşleştirmeleri varsa) gerekli olabilir."
+
+#: usr/local/www/diag_resetstate.php:101
+msgid ""
+"The firewall will normally leave the state tables intact when changing rules."
+msgstr ""
+"Güvenlik duvarı normalde kurallar değiştirilirken durum tablolarına dokunmaz."
+
+#: usr/local/www/diag_resetstate.php:104
+msgid ""
+"NOTE: If you reset the firewall state table, the browser session may appear "
+"to be hung after clicking &quot;Reset&quot;. Simply refresh the page to "
+"continue."
+msgstr ""
+"NOT: Güvenlik duvarı durum tablosu sıfırlandığında tarayıcı oturumu asılı "
+"kalabilir. Bu durumda çalışmaya devam etmek için sayfayı yenilemeniz "
+"yeterlidir."
+
+#: usr/local/www/diag_resetstate.php:114
+msgid "Firewall Source Tracking"
+msgstr "Güvenlik Duvarı Kaynak Takibi"
+
+#: usr/local/www/diag_resetstate.php:116
+msgid ""
+"Resetting the source tracking table will remove all source/destination "
+"associations. This means that the \"sticky\" source/destination association "
+"will be cleared for all clients."
+msgstr ""
+"Kaynak takibi tablosunu temizlenmesi tüm kaynak/hedef ortaklıklarını "
+"silecektir. Bu \"sabit\" kaynak/hedef ortaklılkarının tüm istemcilerde "
+"silineceğini belirtir."
+
+#: usr/local/www/diag_resetstate.php:120
+msgid "This does not clear active connection states, only source tracking."
+msgstr "Bu aktif bağlantı durumlarını silmez, sadece kaynak takibini siler."
+
+#: usr/local/www/diag_resetstate.php:128 usr/local/www/status_lb_pool.php:219
+msgid "Reset"
+msgstr "Sıfırla"
+
+#: usr/local/www/diag_routes.php:71
+msgid "Routing tables"
+msgstr "Yönlendirme tabloları"
+
+#: usr/local/www/diag_routes.php:169
+msgid "Name resolution"
+msgstr "İsim çözümleme"
+
+#: usr/local/www/diag_routes.php:173
+msgid "Enable this to attempt to resolve names when displaying the tables."
+msgstr "Tabloları görüntülerken isim çözümlemeyi etkinleştir."
+
+#: usr/local/www/diag_routes.php:178
+msgid "Number of rows"
+msgstr ""
+
+#: usr/local/www/diag_routes.php:182 usr/local/www/diag_tables.php:169
+msgid "all"
+msgstr "tüm"
+
+#: usr/local/www/diag_routes.php:188
+msgid "Select how many rows to display."
+msgstr ""
+
+#: usr/local/www/diag_routes.php:197
+msgid "Use a regular expression to filter IP address or hostnames."
+msgstr ""
+
+#: usr/local/www/diag_routes.php:204 usr/local/www/system_certmanager.php:413
+#: usr/local/www/system_certmanager.php:1025
+#: usr/local/www/system_certmanager.php:1069
+msgid "Update"
+msgstr "Güncelle"
+
+#: usr/local/www/diag_routes.php:207
+msgid ""
+"By enabling name resolution, the query should take a bit longer. You can "
+"stop it at any time by clicking the Stop button in your browser."
+msgstr ""
+"İsim çözümleme etkinleştirildiğinde, sorgulama biraz daha uzun sürecektir. "
+"İstediğiniz anda tarayıcınızın Durdur düğmesini kullanarak işlemi "
+"durdurabilirsiniz."
+
+#: usr/local/www/diag_routes.php:219 usr/local/www/diag_routes.php:227
+msgid "Gathering data, please wait..."
+msgstr ""
+
+#: usr/local/www/diag_smart.php:18
+msgid "S.M.A.R.T. Monitor Tools"
+msgstr "S.M.A.R.T. İzleme Araçları"
+
+#: usr/local/www/diag_smart.php:77
+msgid "PASSED"
+msgstr "GEÇTİ"
+
+#: usr/local/www/diag_smart.php:78
+msgid "FAILED"
+msgstr "BAŞARISIZ"
+
+#: usr/local/www/diag_smart.php:79
+msgid "Warning"
+msgstr "Uyarı"
+
+#: usr/local/www/diag_smart.php:130 usr/local/www/diag_smart.php:437
+msgid "Abort"
+msgstr "İptal"
+
+#: usr/local/www/diag_smart.php:179
+#, php-format
+msgid "Email sent to %s"
+msgstr "%s adresine E-posta gönderildi"
+
+#: usr/local/www/diag_smart.php:219 usr/local/www/diag_smart.php:290
+msgid "Information/Tests"
+msgstr "Bilgi/Testler"
+
+#: usr/local/www/diag_smart.php:220 usr/local/www/diag_smart.php:231
+msgid "Config"
+msgstr "Yapılandırma"
+
+#: usr/local/www/diag_smart.php:234 usr/local/www/system_camanager.php:552
+#: usr/local/www/system_certmanager.php:776
+#: usr/local/www/system_certmanager.php:949
+msgid "Email Address"
+msgstr "E-Posta Adresi"
+
+#: usr/local/www/diag_smart.php:256
+msgid "Test email"
+msgstr "Test e-postası"
+
+#: usr/local/www/diag_smart.php:261
+#, php-format
+msgid "Send test email to %s"
+msgstr "Test e-postası %s adresine gönderildi"
+
+#: usr/local/www/diag_smart.php:269 usr/local/www/services_wol.php:153
+msgid "Send"
+msgstr "Gönder"
+
+#: usr/local/www/diag_smart.php:302 usr/local/www/diag_smart.php:307
+msgid "Info"
+msgstr "Bilgi"
+
+#: usr/local/www/diag_smart.php:305
+msgid "Info type"
+msgstr "Bilgi tipi"
+
+#: usr/local/www/diag_smart.php:308
+msgid "Health"
+msgstr "Sağlık"
+
+#: usr/local/www/diag_smart.php:309
+msgid "SMART Capabilities"
+msgstr "SMART Yetenekleri"
+
+#: usr/local/www/diag_smart.php:310
+msgid "Attributes"
+msgstr "Özellikler"
+
+#: usr/local/www/diag_smart.php:311 usr/local/www/firewall_aliases.php:180
+#: usr/local/www/pkg_mgr.php:176
+msgid "All"
+msgstr "Tümü"
+
+#: usr/local/www/diag_smart.php:315 usr/local/www/diag_smart.php:354
+#: usr/local/www/diag_smart.php:391 usr/local/www/diag_smart.php:421
+msgid "Device: /dev/"
+msgstr "Aygıt: /dev/"
+
+#: usr/local/www/diag_smart.php:331 usr/local/www/diag_smart.php:407
+msgid "View"
+msgstr "Görüntüle"
+
+#: usr/local/www/diag_smart.php:342
+msgid "Perform Self-tests"
+msgstr "Kendini kendini testleri Yapın"
+
+#: usr/local/www/diag_smart.php:345
+msgid "Test type"
+msgstr "Test türü"
+
+#: usr/local/www/diag_smart.php:347
+#: usr/local/www/status_gateway_groups.php:125
+#: usr/local/www/status_gateways.php:123
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:63
+msgid "Offline"
+msgstr "Çevrim Dışı"
+
+#: usr/local/www/diag_smart.php:348
+msgid "Short"
+msgstr "Kısa"
+
+#: usr/local/www/diag_smart.php:349 usr/local/www/diag_system_pftop.php:135
+msgid "Long"
+msgstr "Uzun"
+
+#: usr/local/www/diag_smart.php:350
+msgid "Conveyance (ATA Disks Only)"
+msgstr "Taşıma (Sadece ATA diskler)"
+
+#: usr/local/www/diag_smart.php:381
+msgid "View Logs"
+msgstr "Günlükleri Görüntüle"
+
+#: usr/local/www/diag_smart.php:384
+msgid "Log type"
+msgstr "Günlük türü"
+
+#: usr/local/www/diag_smart.php:386
+msgid "Error"
+msgstr "Hata"
+
+#: usr/local/www/diag_smart.php:387
+msgid "Self-test"
+msgstr "Kendi kendini test"
+
+#: usr/local/www/diag_smart.php:418
+msgid "Abort tests"
+msgstr "Testleri durdur"
+
+#: usr/local/www/diag_smart.php:437
+msgid "Do you really want to abort the test?"
+msgstr "Testleri durdurmayı gerçekten istiyor musunuz?"
+
+#: usr/local/www/diag_smart.php:452
+msgid "Back"
+msgstr "Geri"
+
+#: usr/local/www/diag_sockets.php:45 usr/local/www/fbegin.inc:229
+msgid "Sockets"
+msgstr "Soketler"
+
+#: usr/local/www/diag_states_summary.php:152
+#: usr/local/www/firewall_aliases.php:177
+#: usr/local/www/services_dnsmasq.php:354
+#: usr/local/www/services_dnsmasq.php:441
+#: usr/local/www/services_unbound.php:422
+#: usr/local/www/services_unbound.php:509 usr/local/www/vpn_pppoe_edit.php:550
+msgid "IP"
+msgstr "IP"
+
+#: usr/local/www/diag_states_summary.php:156
+msgid "Src Ports"
+msgstr "Kyn Portlar"
+
+#: usr/local/www/diag_states_summary.php:157
+msgid "Dst Ports"
+msgstr "Hdf Portlar"
+
+#: usr/local/www/diag_states_summary.php:187
+msgid "State Table Summary"
+msgstr "Durum Tablosu Özeti"
+
+#: usr/local/www/diag_states_summary.php:194
+msgid "By Source IP"
+msgstr "Kaynak IPye göre"
+
+#: usr/local/www/diag_states_summary.php:195
+msgid "By Destination IP"
+msgstr "Hedef IPye göre"
+
+#: usr/local/www/diag_states_summary.php:196
+msgid "Total per IP"
+msgstr "IP başı toplam"
+
+#: usr/local/www/diag_states_summary.php:197
+msgid "By IP Pair"
+msgstr "IP çiftine göre"
+
+#: usr/local/www/diag_system_activity.php:46
+msgid "Diagnostics: System Activity"
+msgstr "Araçlar: İşlemci Kullanımı"
+
+#: usr/local/www/diag_system_activity.php:99
+msgid "Gathering CPU activity, please wait..."
+msgstr "CPU etkinlikleri toplanıyor, lütfen bekleyiniz..."
+
+#: usr/local/www/diag_system_pftop.php:131
+msgid "View type:"
+msgstr "Türü Görüntüle:"
+
+#: usr/local/www/diag_system_pftop.php:133 usr/local/www/interfaces.php:2972
+#: usr/local/www/interfaces.php:2983 usr/local/www/interfaces.php:2995
+#: usr/local/www/interfaces.php:3025 usr/local/www/interfaces.php:3041
+#: usr/local/www/interfaces.php:3057
+msgid "Default"
+msgstr "Varsayılan"
+
+#: usr/local/www/diag_system_pftop.php:134
+msgid "Label"
+msgstr "Etiket"
+
+#: usr/local/www/diag_system_pftop.php:136
+#: usr/local/www/firewall_rules.php:345 usr/local/www/status_queues.php:166
+msgid "Queue"
+msgstr "Sıra"
+
+#: usr/local/www/diag_system_pftop.php:137 usr/local/www/fbegin.inc:130
+#: usr/local/www/firewall_rules.php:50
+#: usr/local/www/firewall_rules_edit.php:805
+msgid "Rules"
+msgstr "Kurallar"
+
+#: usr/local/www/diag_system_pftop.php:139
+msgid "Speed"
+msgstr "Hız"
+
+#: usr/local/www/diag_system_pftop.php:146
+msgid "Sort type:"
+msgstr "Sıralama türü:"
+
+#: usr/local/www/diag_system_pftop.php:148
+msgid "Age"
+msgstr "Yaş"
+
+#: usr/local/www/diag_system_pftop.php:149
+msgid "Bytes"
+msgstr "Bayt"
+
+#: usr/local/www/diag_system_pftop.php:150
+msgid "Destination Address"
+msgstr "Hedef Adres"
+
+#: usr/local/www/diag_system_pftop.php:152
+msgid "Expiry"
+msgstr "Geçerlilik"
+
+#: usr/local/www/diag_system_pftop.php:154
+msgid "Peak"
+msgstr "En Yüksek"
+
+#: usr/local/www/diag_system_pftop.php:155
+msgid "Packet"
+msgstr "Paket"
+
+#: usr/local/www/diag_system_pftop.php:164
+msgid "Number of States:"
+msgstr "Durumların Numarası:"
+
+#: usr/local/www/diag_system_pftop.php:184
+msgid "Gathering pfTOP activity, please wait..."
+msgstr "pfTop etkinlikleri toplanıyor, lütfen bekleyiniz..."
+
+#: usr/local/www/diag_tables.php:45 usr/local/www/fbegin.inc:221
+msgid "Tables"
+msgstr "Tablolar"
+
+#: usr/local/www/diag_tables.php:88
+msgid "The bogons database has been updated."
+msgstr "Sahte IP (bogon) veritabanı güncellendi."
+
+#: usr/local/www/diag_tables.php:122
+msgid "Table:"
+msgstr "Tablo:"
+
+#: usr/local/www/diag_tables.php:157 usr/local/www/diag_tables.php:159
+msgid "No entries exist in this table."
+msgstr "Tabloda herhangi bir girdi bulunamadı."
+
+#: usr/local/www/diag_tables.php:157 usr/local/www/diag_tables.php:166
+msgid " the latest bogon data."
+msgstr " son sahte IP (bogon) verisi."
+
+#: usr/local/www/diag_tables.php:166 usr/local/www/diag_tables.php:169
+msgid "entries in this table."
+msgstr "girdileri sil."
+
+#: usr/local/www/diag_tables.php:169
+#: usr/local/www/firewall_shaper_layer7.php:572
+#: usr/local/www/services_dhcpv6.php:809
+#: usr/local/www/system_firmware_restorefullbackup.php:164
+msgid "Delete"
+msgstr "Sil"
+
+#: usr/local/www/diag_testport.php:49 usr/local/www/diag_testport.php:114
+#: usr/local/www/fbegin.inc:223
+msgid "Test Port"
+msgstr "Port Test"
+
+#: usr/local/www/diag_testport.php:64
+msgid "Please enter a valid IP or hostname."
+msgstr "Lütfen geçerli bir IP adresi girin."
+
+#: usr/local/www/diag_testport.php:68
+msgid "Please enter a valid port number."
+msgstr "Lütfen geçerli bir port numarası girin."
+
+#: usr/local/www/diag_testport.php:72
+msgid "Please enter a valid source port number, or leave the field blank."
+msgstr "Lütfen geçerli bir kaynak adresi girin veya bu alanı boş bırakın."
+
+#: usr/local/www/diag_testport.php:76
+msgid "You cannot connect to an IPv4 address using IPv6."
+msgstr "IPv6 adresini kullanarak IPv4 adresine bağlanamazsınız."
+
+#: usr/local/www/diag_testport.php:79
+msgid "You cannot connect to an IPv6 address using IPv4."
+msgstr "IPv4 adresini kullanarak IPv6 adresine bağlanamazsınız."
+
+#: usr/local/www/diag_testport.php:106
+msgid ""
+"This page allows you to perform a simple TCP connection test to determine if "
+"a host is up and accepting connections on a given port. This test does not "
+"function for UDP since there is no way to reliably determine if a UDP port "
+"accepts connections in this manner."
+msgstr ""
+"Bu sayfa, host'un açık ve belirtilen porttan bağlantıyı kabul ettiğini "
+"belirlemek için basit bir TCP bağlantısı testi gerçekleştirmeye olanak "
+"sağlar. UDP portları bu şekilde bir bağlantıyı kabul ediyorsa "
+"güvenilirliğini belirlemenin bir yolu olmadığı için bu test UDP için "
+"çalışmaz."
+
+#: usr/local/www/diag_testport.php:108
+msgid ""
+"No data is transmitted to the remote host during this test, it will only "
+"attempt to open a connection and optionally display the data sent back from "
+"the server."
+msgstr ""
+"Test sırasında Host'a bağlantıyı açmak için herhangi bir veri gönderilir ve "
+"isteğe bağlı olarak Host'dan geri gönderilen verileri görüntülemek için "
+"kullanılır."
+
+#: usr/local/www/diag_testport.php:132
+msgid "This should typically be left blank."
+msgstr "Bu genellikle boş bırakılmalıdır."
+
+#: usr/local/www/diag_testport.php:136
+msgid "Show Remote Text"
+msgstr "Uzak Metin Görüntüle"
+
+#: usr/local/www/diag_testport.php:139
+msgid ""
+"Shows the text given by the server when connecting to the port. Will take "
+"10+ seconds to display if checked."
+msgstr ""
+"Port'a bağlanırken sunucu tarafından verilen metini gösterir. İşaretlenirse "
+"görüntüleme 10+ saniye uzar."
+
+#: usr/local/www/diag_testport.php:168
+msgid "IPv4"
+msgstr "IPv4"
+
+#: usr/local/www/diag_testport.php:171
+msgid "IPv6"
+msgstr "IPv6"
+
+#: usr/local/www/diag_testport.php:175
+msgid ""
+"If you force IPv4 or IPv6 and use a hostname that does not contain a result "
+"using that protocol, it will result in an error. For example if you force "
+"IPv4 and use a hostname that only returns an AAAA IPv6 IP address, it will "
+"not work."
+msgstr ""
+"Zorla IPv4 yada IPv6 ile host adı kullanılırsa bu protokol de sonuç vermez, "
+"sonuç hatalı olacaktır. Örnek verecek olursak zorla IPv4 ve host adı "
+"kullanımı sadece AAAA IPv6 IP adresi ile dönecektir, işe yaramayacaktır."
+
+#: usr/local/www/diag_testport.php:188
+msgid "Port Test Results"
+msgstr "Port Testi Sonuçları"
+
+#: usr/local/www/diag_testport.php:266
+msgid ""
+"No output received, or connection failed. Try with \"Show Remote Text\" "
+"unchecked first."
+msgstr ""
+"Çıktı alınamadı, yada bağlantı başarısız oldu. Önce \"Uzak Metin Göster\" "
+"işaretsiz yaparak deneyin."
+
+#: usr/local/www/diag_testport.php:268
+msgid "Connection failed (Refused/Timeout)"
+msgstr "Bağlantı başarısız (Reddedildi/Zaman aşımı)"
+
+#: usr/local/www/diag_traceroute.php:64
+msgid "ttl"
+msgstr "ttl"
+
+#: usr/local/www/diag_traceroute.php:68
+#, php-format
+msgid "Maximum number of hops must be between 1 and %s"
+msgstr "Maksimum atlama sayısı 1 ile %s arasında olmalıdır"
+
+#: usr/local/www/diag_traceroute.php:132
+msgid "Maximum number of hops"
+msgstr "Maksimum atlama sayısı"
+
+#: usr/local/www/diag_traceroute.php:142
+msgid "Reverse Address Lookup"
+msgstr "Ters Adres Arama"
+
+#: usr/local/www/diag_traceroute.php:148
+msgid "Use ICMP"
+msgstr "ICMP Kullan"
+
+#: usr/local/www/diag_traceroute.php:162
+#: usr/local/www/firewall_rules_edit.php:880
+#: usr/local/www/services_ntpd_gps.php:402
+#: usr/local/www/services_ntpd_gps.php:404
+msgid "Note: "
+msgstr "Not: "
+
+#: usr/local/www/diag_traceroute.php:163
+msgid ""
+"Traceroute may take a while to complete. You may hit the Stop button on your "
+"browser at any time to see the progress of failed traceroutes."
+msgstr ""
+"Traceroute işleminin tamamlanması uzun zaman alabilir. Tarayıcınızdaki "
+"durdur butonu ile başarısız traceroute sonuçlarını görebilirsiniz."
+
+#: usr/local/www/diag_traceroute.php:165
+msgid ""
+"Using a source interface/IP address that does not match selected type (IPv4, "
+"IPv6) will result in an error or empty output."
+msgstr ""
+"Kaynak arabirim/IP adresi seçilen tür (IPv4,IPv6) ya uyuşmuyor bu yüzden "
+"sonuç boş yada hatalı olacak."
+
+#: usr/local/www/diag_traceroute.php:174
+msgid "Traceroute output:"
+msgstr "Traceroute çıktısı:"
+
+#: usr/local/www/easyrule.php:42
+msgid "Firewall: EasyRule"
+msgstr ""
+
+#: usr/local/www/easyrule.php:77
+msgid "Message"
+msgstr "Mesaj"
+
+#: usr/local/www/easyrule.php:80
+msgid ""
+"This is the Easy Rule status page, mainly used to display errors when adding "
+"rules. If you are seeing this, there apparently was not an error, and you "
+"navigated to the page directly without telling it what to do"
+msgstr ""
+"Kolay Kural durum sayfası, kural eklerken oluşan hataların görüntülendiği "
+"sayfadır. Bu sayfayı görüyorsanız kural eklenirken herhangi bir hata "
+"oluşmadı ve sistem sizi otomatik olarak buraya yönlendirdi"
+
+#: usr/local/www/easyrule.php:83
+msgid ""
+"This page is meant to be called from the block/pass buttons on the Firewall "
+"Logs page"
+msgstr ""
+"Bu sayfa Güvenlik Duvarı Günlüğü sayfasındaki engelle/izin ver düğmelerinden "
+"çağırılmak üzere tasarlanmıştır"
+
+#: usr/local/www/easyrule.php:83
+msgid "System Logs, Firewall Tab"
+msgstr "Sistem Kayıtları, Güvenlik Duvarı Sekmesi"
+
+#: usr/local/www/edit.php:42
+msgid "Edit file"
+msgstr "Dosya düzenle"
+
+#: usr/local/www/edit.php:49 usr/local/www/edit.php:66
+msgid "No file name specified"
+msgstr "Dosya adı belirtilmeli"
+
+#: usr/local/www/edit.php:51
+msgid "Loading a directory is not supported"
+msgstr "Klasör yükleme desteklenmemektedir"
+
+#: usr/local/www/edit.php:53
+msgid "File does not exist or is not a regular file"
+msgstr "Dosya bulunamadı ya da tür desteklenmiyor"
+
+#: usr/local/www/edit.php:57
+msgid "Failed to read file"
+msgstr "Dosya okuma başarısız"
+
+#: usr/local/www/edit.php:78
+msgid "Failed to write file"
+msgstr "Dosya yazma başarısız"
+
+#: usr/local/www/edit.php:80
+msgid "Error while writing file"
+msgstr "Dosya yazma sırasında hata"
+
+#: usr/local/www/edit.php:82
+msgid "File successfully saved"
+msgstr "Dosya başarıyla kaydedildi"
+
+#: usr/local/www/edit.php:104
+msgid "Loading file"
+msgstr "Dosya yükleniyor"
+
+#: usr/local/www/edit.php:124
+msgid "File successfully loaded"
+msgstr "Dosya başarıyla yüklendi"
+
+#: usr/local/www/edit.php:147
+msgid "Saving file"
+msgstr "Dosya kaydediliyor"
+
+#: usr/local/www/edit.php:185
+msgid "Save / Load from path"
+msgstr "Dosya kaydet/yükle"
+
+#: usr/local/www/edit.php:187
+msgid "Load"
+msgstr "Yükle"
+
+#: usr/local/www/edit.php:188
+msgid "Browse"
+msgstr "Gözat"
+
+#: usr/local/www/exec.php:96
+msgid "Execute command"
+msgstr "Komut çalıştır"
+
+#: usr/local/www/exec.php:159
+msgid "Nothing to recall"
+msgstr "Çağırılacak herhangi bir bilgi yok"
+
+#: usr/local/www/exec.php:228
+msgid "Note: this function is unsupported. Use it on your own risk"
+msgstr "Not: Bu özellik desteklenmemektedir. Risk aldığınızı unutmayın"
+
+#: usr/local/www/exec.php:259
+msgid "Execute Shell command"
+msgstr "Kabuk komutu çalıştır"
+
+#: usr/local/www/exec.php:262 usr/local/www/exec.php:315
+msgid "Command"
+msgstr "Komut"
+
+#: usr/local/www/exec.php:270 usr/local/www/exec.php:321
+msgid "Execute"
+msgstr "Çalıştır"
+
+#: usr/local/www/exec.php:272 usr/local/www/status_upnp.php:79
+msgid "Clear"
+msgstr "Temizle"
+
+#: usr/local/www/exec.php:282
+msgid "File to download"
+msgstr "İndirilecek dosya"
+
+#: usr/local/www/exec.php:296 usr/local/www/exec.php:306
+#: usr/local/www/services_captiveportal_filemanager.php:193
+msgid "Upload"
+msgstr "Yükle"
+
+#: usr/local/www/exec.php:299
+msgid "File to upload"
+msgstr "Yüklenecek dosya"
+
+#: usr/local/www/exec.php:312
+msgid "PHP Execute"
+msgstr "PHP Çalıştır"
+
+#: usr/local/www/exec.php:323
+msgid "Example"
+msgstr "Örnek"
+
+#: usr/local/www/fbegin.inc:100 usr/local/www/firewall_nat_edit.php:550
+#: usr/local/www/firewall_rules_edit.php:1096
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1302
+#: usr/local/www/firewall_rules_edit.php:1318
+#: usr/local/www/firewall_rules_edit.php:1358
+#: usr/local/www/firewall_rules_edit.php:1398
+#: usr/local/www/firewall_rules_edit.php:1428
+#: usr/local/www/firewall_rules_edit.php:1440
+#: usr/local/www/firewall_rules_edit.php:1495
+#: usr/local/www/firewall_rules_edit.php:1522
+#: usr/local/www/firewall_rules_edit.php:1571
+#: usr/local/www/firewall_rules_edit.php:1621
+#: usr/local/www/firewall_rules_edit.php:1676
+#: usr/local/www/interfaces.php:1743 usr/local/www/interfaces.php:2847
+#: usr/local/www/pkg_edit.php:1129 usr/local/www/services_dhcp.php:1044
+#: usr/local/www/services_dhcp.php:1066 usr/local/www/services_dhcp.php:1080
+#: usr/local/www/services_dhcp.php:1092 usr/local/www/services_dhcp.php:1104
+#: usr/local/www/services_dhcp.php:1116 usr/local/www/services_dhcp.php:1143
+#: usr/local/www/services_dhcp_edit.php:499
+#: usr/local/www/services_dhcp_edit.php:522
+#: usr/local/www/services_dhcp_edit.php:534
+#: usr/local/www/services_dhcpv6.php:700 usr/local/www/services_dhcpv6.php:723
+#: usr/local/www/services_dhcpv6.php:736 usr/local/www/services_dhcpv6.php:749
+#: usr/local/www/services_dhcpv6.php:761 usr/local/www/services_dhcpv6.php:776
+#: usr/local/www/services_dnsmasq.php:304
+#: usr/local/www/services_dnsmasq.php:307
+#: usr/local/www/services_dnsmasq.php:310 usr/local/www/services_ntpd.php:346
+#: usr/local/www/services_ntpd.php:366 usr/local/www/services_ntpd.php:395
+#: usr/local/www/services_ntpd_gps.php:558
+#: usr/local/www/services_unbound.php:368
+#: usr/local/www/services_unbound.php:371
+#: usr/local/www/services_unbound.php:374
+#: usr/local/www/services_unbound_advanced.php:191
+#: usr/local/www/system_gateways_edit.php:744
+#: usr/local/www/vpn_openvpn_client.php:1057
+#: usr/local/www/vpn_openvpn_csc.php:716
+#: usr/local/www/vpn_openvpn_server.php:1773
+msgid "Advanced"
+msgstr "Gelişmiş"
+
+#: usr/local/www/fbegin.inc:101 usr/local/www/system_firmware.php:103
+#: usr/local/www/system_firmware.php:202
+#: usr/local/www/system_firmware_auto.php:62
+#: usr/local/www/system_firmware_check.php:50
+#: usr/local/www/system_firmware_settings.php:87
+msgid "Firmware"
+msgstr "Üretici yazılımı"
+
+#: usr/local/www/fbegin.inc:102 usr/local/www/system.php:289
+msgid "General Setup"
+msgstr "Genel Ayarlar"
+
+#: usr/local/www/fbegin.inc:103
+msgid "High Avail. Sync"
+msgstr "Yüksek Kullanılırlık senk."
+
+#: usr/local/www/fbegin.inc:104 usr/local/www/services_captiveportal.php:1059
+msgid "Logout"
+msgstr "Güvenli Çıkış"
+
+#: usr/local/www/fbegin.inc:106
+msgid "Packages"
+msgstr "Paketler"
+
+#: usr/local/www/fbegin.inc:107
+msgid "Setup Wizard"
+msgstr "Kurulum Sihirbazı"
+
+#: usr/local/www/fbegin.inc:109
+msgid "Cert Manager"
+msgstr "Sertifika Yöneticisi"
+
+#: usr/local/www/fbegin.inc:111 usr/local/www/fbegin.inc:113
+#: usr/local/www/services_captiveportal.php:671
+#: usr/local/www/system_usermanager.php:58
+msgid "User Manager"
+msgstr "Kullanıcı Yönetimi"
+
+#: usr/local/www/fbegin.inc:119
+msgid "(assign)"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:131 usr/local/www/firewall_schedule.php:51
+#: usr/local/www/firewall_schedule_edit.php:62
+#: usr/local/www/system_advanced_misc.php:496
+msgid "Schedules"
+msgstr "Zamanlamalar"
+
+#: usr/local/www/fbegin.inc:133 usr/local/www/firewall_virtual_ip.php:226
+msgid "Virtual IPs"
+msgstr "Sanal IPler"
+
+#: usr/local/www/fbegin.inc:140 usr/local/www/services_unbound.php:204
+#: usr/local/www/services_unbound_advanced.php:191
+#: usr/local/www/services_unbound_domainoverride_edit.php:115
+#: usr/local/www/services_unbound_host_edit.php:183
+msgid "DNS Resolver"
+msgstr "DNS Çözümleyici"
+
+#: usr/local/www/fbegin.inc:145
+msgid "DHCPv6 Server/RA"
+msgstr "DHCPv6 Sunucu/RA"
+
+#: usr/local/www/fbegin.inc:151 usr/local/www/vpn_pppoe_edit.php:239
+msgid "PPPoE Server"
+msgstr "PPPoE Sunucu"
+
+#: usr/local/www/fbegin.inc:152 usr/local/www/services_snmp.php:170
+msgid "SNMP"
+msgstr "SNMP"
+
+#: usr/local/www/fbegin.inc:157 usr/local/www/fbegin.inc:193
+msgid "UPnP &amp; NAT-PMP"
+msgstr "UPnP &amp; NAT-PMP"
+
+#: usr/local/www/fbegin.inc:166 usr/local/www/interfaces.php:1411
+#: usr/local/www/status_interfaces.php:139
+msgid "PPTP"
+msgstr "PPTP"
+
+#: usr/local/www/fbegin.inc:167 usr/local/www/interfaces.php:1411
+#: usr/local/www/status_interfaces.php:152 usr/local/www/vpn_l2tp.php:39
+#: usr/local/www/vpn_l2tp_users.php:39
+#: usr/local/www/vpn_l2tp_users_edit.php:39
+msgid "L2TP"
+msgstr "L2TP"
+
+#: usr/local/www/fbegin.inc:174
+msgid "CARP (failover)"
+msgstr "CARP (yük aktarma)"
+
+#: usr/local/www/fbegin.inc:175
+msgid "Dashboard"
+msgstr "Anasayfa"
+
+#: usr/local/www/fbegin.inc:177
+msgid "DHCP Leases"
+msgstr "DHCP Kiraları"
+
+#: usr/local/www/fbegin.inc:178
+msgid "DHCPv6 Leases"
+msgstr "DHCPv6 Kiraları"
+
+#: usr/local/www/fbegin.inc:179
+msgid "Filter Reload"
+msgstr "Filitre Yeniden Yükleme"
+
+#: usr/local/www/fbegin.inc:186
+msgid "Package Logs"
+msgstr "Paket Günlükleri"
+
+#: usr/local/www/fbegin.inc:187 usr/local/www/status_queues.php:124
+#: usr/local/www/status_rrd_graph.php:425
+#: usr/local/www/status_rrd_graph_settings.php:58
+#: usr/local/www/status_rrd_graph_settings.php:144
+msgid "Queues"
+msgstr "Kuyruklar"
+
+#: usr/local/www/fbegin.inc:188 usr/local/www/status_rrd_graph.php:260
+#: usr/local/www/status_rrd_graph_img.php:44
+#: usr/local/www/status_rrd_graph_settings.php:120
+#: usr/local/www/status_rrd_graph_settings.php:182
+msgid "RRD Graphs"
+msgstr "RRD Grafikleri"
+
+#: usr/local/www/fbegin.inc:189 usr/local/www/fbegin.inc:308
+#: usr/local/www/load_balancer_monitor.php:89
+#: usr/local/www/load_balancer_monitor_edit.php:196
+#: usr/local/www/load_balancer_pool.php:98
+#: usr/local/www/load_balancer_pool_edit.php:170
+#: usr/local/www/load_balancer_relay_action.php:105
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_relay_protocol.php:101
+#: usr/local/www/load_balancer_relay_protocol_edit.php:140
+#: usr/local/www/load_balancer_setting.php:100
+#: usr/local/www/load_balancer_virtual_server.php:99
+#: usr/local/www/load_balancer_virtual_server_edit.php:147
+#: usr/local/www/services_captiveportal.php:69
+#: usr/local/www/services_captiveportal_filemanager.php:72
+#: usr/local/www/services_captiveportal_hostname.php:67
+#: usr/local/www/services_captiveportal_hostname_edit.php:60
+#: usr/local/www/services_captiveportal_ip.php:65
+#: usr/local/www/services_captiveportal_ip_edit.php:61
+#: usr/local/www/services_captiveportal_mac.php:64
+#: usr/local/www/services_captiveportal_mac_edit.php:61
+#: usr/local/www/services_captiveportal_vouchers.php:92
+#: usr/local/www/services_captiveportal_vouchers_edit.php:46
+#: usr/local/www/services_captiveportal_zones_edit.php:46
+#: usr/local/www/services_dhcp.php:597
+#: usr/local/www/services_dhcp_edit.php:335
+#: usr/local/www/services_dhcp_relay.php:102
+#: usr/local/www/services_dhcpv6.php:375
+#: usr/local/www/services_dhcpv6_edit.php:185
+#: usr/local/www/services_dhcpv6_relay.php:103
+#: usr/local/www/services_dnsmasq.php:153
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:122
+#: usr/local/www/services_dnsmasq_edit.php:182
+#: usr/local/www/services_dyndns.php:61
+#: usr/local/www/services_dyndns_edit.php:181
+#: usr/local/www/services_igmpproxy.php:81 usr/local/www/services_ntpd.php:180
+#: usr/local/www/services_ntpd_gps.php:160
+#: usr/local/www/services_ntpd_pps.php:101
+#: usr/local/www/services_rfc2136.php:56
+#: usr/local/www/services_rfc2136_edit.php:116
+#: usr/local/www/services_router_advertisements.php:194
+#: usr/local/www/services_snmp.php:170 usr/local/www/services_unbound.php:204
+#: usr/local/www/services_unbound_advanced.php:191
+#: usr/local/www/services_unbound_domainoverride_edit.php:115
+#: usr/local/www/services_unbound_host_edit.php:183
+#: usr/local/www/services_wol.php:116 usr/local/www/services_wol_edit.php:116
+#: usr/local/www/status_services.php:68
+#: usr/local/www/system_authservers.php:192
+#: usr/local/www/vpn_pppoe_edit.php:239
+msgid "Services"
+msgstr "Servisler"
+
+#: usr/local/www/fbegin.inc:190
+msgid "System Logs"
+msgstr "Sistem Kayıtları"
+
+#: usr/local/www/fbegin.inc:191 usr/local/www/status_graph.php:114
+msgid "Traffic Graph"
+msgstr "Trafik Grafikleri"
+
+#: usr/local/www/fbegin.inc:209
+msgid "Command Prompt"
+msgstr "Hızlı Komut Ekranı"
+
+#: usr/local/www/fbegin.inc:211
+msgid "Edit File"
+msgstr "Dosya Düzenle"
+
+#: usr/local/www/fbegin.inc:212
+msgid "Factory Defaults"
+msgstr "Fabrika Ayarları"
+
+#: usr/local/www/fbegin.inc:217
+msgid "Halt System"
+msgstr "Sistemi Kapat"
+
+#: usr/local/www/fbegin.inc:218
+msgid "Limiter Info"
+msgstr "Limitleyici Bilgisi"
+
+#: usr/local/www/fbegin.inc:224
+msgid "pfInfo"
+msgstr "pfBilgi"
+
+#: usr/local/www/fbegin.inc:225
+msgid "pfTop"
+msgstr "pfTop"
+
+#: usr/local/www/fbegin.inc:226
+msgid "Reboot"
+msgstr "Yeniden Başlat"
+
+#: usr/local/www/fbegin.inc:227 usr/local/www/system_gateway_groups.php:120
+#: usr/local/www/system_gateways.php:204 usr/local/www/system_routes.php:221
+msgid "Routes"
+msgstr "Yönlendirmeler"
+
+#: usr/local/www/fbegin.inc:228
+#: usr/local/www/widgets/widgets/smart_status.widget.php:40
+msgid "SMART Status"
+msgstr "SMART Durumu"
+
+#: usr/local/www/fbegin.inc:231
+msgid "States Summary"
+msgstr "Durum Özeti"
+
+#: usr/local/www/fbegin.inc:232
+msgid "System Activity"
+msgstr "Sistem Etkinliği"
+
+#: usr/local/www/fbegin.inc:239
+msgid "Restart HTTPD"
+msgstr "HTTPD Yeniden Başlat"
+
+#: usr/local/www/fbegin.inc:245
+msgid "pfSense Gold"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:250
+msgid "About this Page"
+msgstr "Sayfa Hakkında"
+
+#: usr/local/www/fbegin.inc:252
+msgid "Bug Database"
+msgstr "Hata Veritabanı"
+
+#: usr/local/www/fbegin.inc:253
+msgid "User Forum"
+msgstr "Kullanıcı Forum"
+
+#: usr/local/www/fbegin.inc:254
+msgid "Documentation"
+msgstr "Dökümantasyon"
+
+#: usr/local/www/fbegin.inc:255
+msgid "Developers Wiki"
+msgstr "Wiki Geliştiricileri"
+
+#: usr/local/www/fbegin.inc:256
+msgid "Paid Support"
+msgstr "Ödemeli Destek"
+
+#: usr/local/www/fbegin.inc:257
+msgid "pfSense Book"
+msgstr "pfSense Kitabı"
+
+#: usr/local/www/fbegin.inc:258
+msgid "Search portal"
+msgstr "Arama portalı"
+
+#: usr/local/www/fbegin.inc:259
+msgid "FreeBSD Handbook"
+msgstr "FreeBSD El Kitapçığı"
+
+#: usr/local/www/fbegin.inc:340
+msgid "Gold"
+msgstr ""
+
+#: usr/local/www/fbegin.inc:349
+msgid "Help"
+msgstr "Yardım"
+
+#: usr/local/www/fbegin.inc:428
+msgid "Help for items on this page"
+msgstr "Bu sayfadakı öğeler için yardım"
+
+#: usr/local/www/fbegin.inc:438
+msgid ""
+"Packages are currently being reinstalled in the background.<p>Do not make "
+"changes in the GUI until this is complete."
+msgstr ""
+"Şu anda paketler arkaplanda yeniden kuruluyor.<p>Bu işlem tamamlanana kadar "
+"arayüzde değişiklik yapmayın."
+
+#: usr/local/www/firewall_aliases.php:109
+#, php-format
+msgid "Cannot delete alias. Currently in use by %s"
+msgstr "%s tarafından kullanıldığı için grup silinemiyor"
+
+#: usr/local/www/firewall_aliases.php:169
+msgid "The alias list has been changed."
+msgstr "Grup listesi değiştirildi."
+
+#: usr/local/www/firewall_aliases.php:169 usr/local/www/firewall_nat.php:184
+#: usr/local/www/firewall_nat_1to1.php:162
+#: usr/local/www/firewall_nat_npt.php:90
+#: usr/local/www/firewall_nat_out.php:226
+#: usr/local/www/firewall_shaper.php:406
+#: usr/local/www/firewall_shaper_layer7.php:402
+#: usr/local/www/firewall_shaper_queues.php:189
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/firewall_shaper_wizards.php:97
+#: usr/local/www/firewall_virtual_ip.php:218 usr/local/www/interfaces.php:1633
+#: usr/local/www/load_balancer_monitor.php:101
+#: usr/local/www/load_balancer_relay_protocol.php:113
+#: usr/local/www/load_balancer_setting.php:112
+#: usr/local/www/load_balancer_virtual_server.php:111
+#: usr/local/www/services_captiveportal_zones.php:75
+#: usr/local/www/services_dhcp.php:738 usr/local/www/services_dhcpv6.php:482
+#: usr/local/www/services_dnsmasq.php:182
+#: usr/local/www/services_igmpproxy.php:91
+#: usr/local/www/services_unbound_acls.php:179
+#: usr/local/www/services_unbound_advanced.php:204
+#: usr/local/www/system_gateways.php:196 usr/local/www/vpn_ipsec.php:231
+#: usr/local/www/vpn_ipsec_keys.php:92 usr/local/www/vpn_ipsec_mobile.php:331
+#: usr/local/www/vpn_pppoe.php:99
+msgid "You must apply the changes in order for them to take effect."
+msgstr "Değişiklikleri uygulayarak etkin hale gelmelerini sağlayabilirsiniz."
+
+#: usr/local/www/firewall_aliases.php:178
+msgid "Ports"
+msgstr "Portlar"
+
+#: usr/local/www/firewall_aliases.php:179
+msgid "URLs"
+msgstr ""
+
+#: usr/local/www/firewall_aliases.php:192
+#: usr/local/www/services_igmpproxy.php:98
+msgid "Values"
+msgstr "Değerler"
+
+#: usr/local/www/firewall_aliases.php:198
+#: usr/local/www/firewall_aliases.php:278
+msgid "Add a new alias"
+msgstr "Yeni grup ekle"
+
+#: usr/local/www/firewall_aliases.php:260
+msgid "Edit alias"
+msgstr "Grup düzenle"
+
+#: usr/local/www/firewall_aliases.php:261
+msgid ""
+"Do you really want to delete this alias? All elements that still use it will "
+"become invalid (e.g. filter rules)!"
+msgstr ""
+"Bu grup tanımını silmek istediğinize emin misiniz? Bu tanımı kullanan tüm "
+"nesneler (örn. filtre kuralları) devre dışı kalacaktır!"
+
+#: usr/local/www/firewall_aliases.php:261
+msgid "Delete alias"
+msgstr "Grup sil"
+
+#: usr/local/www/firewall_aliases.php:281
+msgid "Bulk import aliases from list"
+msgstr "Grupları listeden içeri aktar"
+
+#: usr/local/www/firewall_aliases.php:291
+msgid ""
+"Aliases act as placeholders for real hosts, networks or ports. They can be "
+"used to minimize the number of changes that have to be made if a host, "
+"network or port changes. You can enter the name of an alias instead of the "
+"host, network or port in all fields that have a red background. The alias "
+"will be resolved according to the list above. If an alias cannot be resolved "
+"(e.g. because you deleted it), the corresponding element (e.g. filter/NAT/"
+"shaper rule) will be considered invalid and skipped."
+msgstr ""
+"Gruplar gerçek bilgisayarlar, ağlar ya da portlar için taşıyıcı gibidir. "
+"Bilgisayarlar, ağlar ya da portlar değiştiğinde yapılması gereken değişiklik "
+"sayısını azaltmak için kullanılabilirler. Arkaplan rengi kırmızı tüm "
+"alanlarda IP, ağ veya port girmek yerine grup adı girebilirsiniz. Girdiğiniz "
+"grup yukarıdaki listeye göre çözümlenir. Eğer bir grup çözümlenemezse (örn. "
+"sildiğiniz için), grup adının girildiği öğe (örn. güvenlik duvarı kuralı) "
+"geçersiz kabul edilir ve atlanır."
+
+#: usr/local/www/firewall_aliases_edit.php:53
+#: usr/local/www/firewall_nat_1to1_edit.php:227
+#: usr/local/www/firewall_nat_edit.php:457
+#: usr/local/www/firewall_nat_npt_edit.php:148
+#: usr/local/www/firewall_nat_out_edit.php:343
+#: usr/local/www/firewall_rules_edit.php:805
+#: usr/local/www/firewall_schedule_edit.php:62
+#: usr/local/www/firewall_virtual_ip_edit.php:290
+#: usr/local/www/interfaces_bridge_edit.php:240
+#: usr/local/www/interfaces_gif_edit.php:136
+#: usr/local/www/interfaces_gre_edit.php:130
+#: usr/local/www/interfaces_groups_edit.php:45
+#: usr/local/www/interfaces_lagg_edit.php:137
+#: usr/local/www/interfaces_ppps_edit.php:389
+#: usr/local/www/interfaces_qinq_edit.php:40
+#: usr/local/www/interfaces_vlan_edit.php:152
+#: usr/local/www/interfaces_wireless_edit.php:151
+#: usr/local/www/load_balancer_monitor_edit.php:196
+#: usr/local/www/load_balancer_pool_edit.php:170
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+#: usr/local/www/load_balancer_relay_protocol_edit.php:140
+#: usr/local/www/load_balancer_virtual_server_edit.php:147
+#: usr/local/www/pkg_edit.php:259 usr/local/www/services_igmpproxy_edit.php:46
+#: usr/local/www/services_rfc2136_edit.php:116
+#: usr/local/www/services_wol_edit.php:116
+#: usr/local/www/vpn_l2tp_users_edit.php:39
+#: usr/local/www/vpn_pppoe_edit.php:239
+#: usr/local/www/vpn_pptp_users_edit.php:138
+msgid "Edit"
+msgstr "Düzenle"
+
+#: usr/local/www/firewall_aliases_edit.php:126
+msgid ""
+"Vertical bars (|) at start or end, or double in the middle of descriptions "
+"not allowed. Descriptions have been cleaned. Check and save again."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:137
+#: usr/local/www/firewall_aliases_edit.php:139
+msgid "Reserved word used for alias name."
+msgstr "Grup için bu isim kullanılamaz."
+
+#: usr/local/www/firewall_aliases_edit.php:142
+msgid ""
+"The alias name must be less than 32 characters long, may not consist of only "
+"numbers, and may only contain the following characters"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:148
+#: usr/local/www/firewall_aliases_import.php:77
+msgid "An alias with this name already exists."
+msgstr "Bu isimde bir grup adı zaten var."
+
+#: usr/local/www/firewall_aliases_edit.php:157
+#: usr/local/www/firewall_aliases_import.php:83
+#, php-format
+msgid "Cannot use a reserved keyword as alias name %s"
+msgstr "Ayrılmış kelime %s grup adı olarak kullanılamaz"
+
+#: usr/local/www/firewall_aliases_edit.php:162
+#: usr/local/www/firewall_aliases_import.php:88
+msgid "An interface description with this name already exists."
+msgstr "Bu isimde bir arabirim açıklaması zaten var."
+
+#: usr/local/www/firewall_aliases_edit.php:185
+msgid "You must provide a valid URL."
+msgstr "Geçerli bir URL girmelisiniz."
+
+#: usr/local/www/firewall_aliases_edit.php:187
+msgid "Unable to fetch usable data."
+msgstr "Kullanılabilir veri toplanamadı."
+
+#: usr/local/www/firewall_aliases_edit.php:199
+#: usr/local/www/firewall_aliases_edit.php:241
+#: usr/local/www/firewall_aliases_edit.php:306
+#, php-format
+msgid "Entry added %s"
+msgstr "%s girdisi eklendi"
+
+# 85%
+#: usr/local/www/firewall_aliases_edit.php:270
+#, php-format
+msgid "You must provide a valid URL. Could not fetch usable data from '%s'."
+msgstr "Geçerli bir URL sağlamalısınız. Kullanılabilir veri toplanamadı '%s'."
+
+#: usr/local/www/firewall_aliases_edit.php:274
+#, php-format
+msgid "URL '%s' is not valid."
+msgstr "URL '%s' geçerli değil."
+
+#: usr/local/www/firewall_aliases_edit.php:337
+#, php-format
+msgid "Range is too large to expand into individual host IP addresses (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:338
+#: usr/local/www/firewall_aliases_edit.php:366
+#, php-format
+msgid "The maximum number of entries in an alias is %s"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:346
+#: usr/local/www/firewall_aliases_import.php:113
+#, php-format
+msgid "IPv6 address ranges are not supported (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:365
+#, php-format
+msgid "Subnet is too large to expand into individual host IP addresses (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:373
+#, php-format
+msgid "IPv6 subnets are not supported in host aliases (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:400
+#, php-format
+msgid "The maximum number of entries in an alias has been exceeded (%s)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:417
+msgid "is not a valid port or alias."
+msgstr "geçerli bir port veya grup adı değil."
+
+#: usr/local/www/firewall_aliases_edit.php:421
+#, php-format
+msgid "%1$s is not a valid %2$s address, FQDN or alias."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:426
+#, php-format
+msgid "%s/%s is not a valid subnet."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:434
+#, php-format
+msgid ""
+"The alias(es): %s cannot be nested because they are not of the same type."
+msgstr "Grup ad(lar)ı: %s aynı türde olmadığından gruplanamaz."
+
+#: usr/local/www/firewall_aliases_edit.php:580
+msgid "Network or FQDN"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:581
+#: usr/local/www/firewall_aliases_edit.php:775
+msgid "Network(s)"
+msgstr "Ağ(lar)"
+
+#: usr/local/www/firewall_aliases_edit.php:582
+#: usr/local/www/services_igmpproxy_edit.php:229
+#: usr/local/www/services_unbound_acls.php:241
+msgid "CIDR"
+msgstr "CIDR"
+
+#: usr/local/www/firewall_aliases_edit.php:584
+#: usr/local/www/firewall_aliases_edit.php:774
+#: usr/local/www/firewall_aliases_edit.php:786
+msgid "Host(s)"
+msgstr "İstemci(ler)"
+
+#: usr/local/www/firewall_aliases_edit.php:585
+msgid "IP or FQDN"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:586
+#: usr/local/www/firewall_aliases_edit.php:776
+msgid "Port(s)"
+msgstr "Port(lar)"
+
+#: usr/local/www/firewall_aliases_edit.php:588
+#: usr/local/www/firewall_aliases_edit.php:778
+msgid "URL (IPs)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:589
+#: usr/local/www/firewall_aliases_edit.php:779
+msgid "URL (Ports)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:590
+#: usr/local/www/firewall_aliases_edit.php:780
+msgid "URL Table (IPs)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:591
+#: usr/local/www/firewall_aliases_edit.php:781
+msgid "URL Table (Ports)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:592
+msgid "Update Freq. (days)"
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:594
+msgid ""
+"Networks are specified in CIDR format. Select the CIDR mask that pertains "
+"to each entry. /32 specifies a single IPv4 host, /128 specifies a single "
+"IPv6 host, /24 specifies 255.255.255.0, /64 specifies a normal IPv6 network, "
+"etc. Hostnames (FQDNs) may also be specified, using a /32 mask for IPv4 "
+"or /128 for IPv6. You may also enter an IP range such as "
+"192.168.1.1-192.168.1.254 and a list of CIDR networks will be derived to "
+"fill the range."
+msgstr ""
+"Ağlar bit sayısıyla CIDR biçiminde belirtilir. Her girdi için bir CIDR "
+"maskesi seçmelisiniz. /32 tek bir istemciyi belirtir, /128 tek IPv6 sunucusu "
+"belirtir, /24 255.255.255.0 belirtir, /64 normal IPv6 ağ belirtir, vb. /32 "
+"maskesiyle IPv4 yada IPv6 için /128 maskesi ile sunucu isimleri (FQDNler) de "
+"belirtebilirsiniz. 192.168.1.1-192.168.1.254 gibi IP aralıkları da "
+"belirtebilirsiniz, bu durumda aralığı belirtecek CIDR otomatik belirlenir."
+
+#: usr/local/www/firewall_aliases_edit.php:595
+msgid ""
+"Enter as many hosts as you would like. Hosts must be specified by their IP "
+"address or fully qualified domain name (FQDN). FQDN hostnames are "
+"periodically re-resolved and updated. If multiple IPs are returned by a DNS "
+"query, all are used. You may also enter an IP range such as "
+"192.168.1.1-192.168.1.10 or a small subnet such as 192.168.1.16/28 and a "
+"list of individual IP addresses will be generated."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:596
+msgid ""
+"Enter as many ports as you wish. Port ranges can be expressed by separating "
+"with a colon."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:597
+#, php-format
+msgid ""
+"Enter as many URLs as you wish. After saving %s will download the URL and "
+"import the items into the alias. Use only with small sets of IP addresses "
+"(less than 3000)."
+msgstr ""
+"İstediğiniz sayıda URL girebilirsiniz. Kaydettikten sonra %s URL'yi indirip "
+"öğeleri gruba aktarır. Sadece küçük IP adresi gruplarında (3000'den az) "
+"kullanın."
+
+#: usr/local/www/firewall_aliases_edit.php:598
+#, php-format
+msgid ""
+"Enter as many URLs as you wish. After saving %s will download the URL and "
+"import the items into the alias. Use only with small sets of Ports (less "
+"than 3000)."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:599
+#, php-format
+msgid ""
+"Enter a single URL containing a large number of IPs and/or Subnets. After "
+"saving %s will download the URL and create a table file containing these "
+"addresses. This will work with large numbers of addresses (30,000+) or small "
+"numbers."
+msgstr ""
+"Çok sayıda IP veya altağ içeren tek bir URL girin. Kaydettikten sonra %s "
+"URL'yi indirip bu adresleri içeren bir tablo dosyası oluşturur. Hem küçük "
+"sayılarla hem de çok sayıda adresle (300 binden fazla) çalışır."
+
+#: usr/local/www/firewall_aliases_edit.php:600
+#, php-format
+msgid ""
+"Enter a single URL containing a list of Port numbers and/or Port ranges. "
+"After saving %s will download the URL."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_edit.php:603
+#: usr/local/www/firewall_aliases_edit.php:777
+msgid "OpenVPN Users"
+msgstr "OpenVPN Kullanıcıları"
+
+#: usr/local/www/firewall_aliases_edit.php:604
+msgid "Enter as many usernames as you wish."
+msgstr "İstediğiniz sayıda kullanıcı adı girebilirsiniz."
+
+#: usr/local/www/firewall_aliases_edit.php:743
+msgid "Alias Edit"
+msgstr "Grup Düzenle"
+
+#: usr/local/www/firewall_aliases_edit.php:755
+msgid ""
+"The name of the alias may only consist of the characters \"a-z, A-Z, 0-9 and "
+"_\"."
+msgstr "Grup adı \"a-z, A-Z, 0-9 ve _\" karakterleri içerebilir."
+
+#: usr/local/www/firewall_aliases_edit.php:771
+#: usr/local/www/firewall_virtual_ip.php:241
+#: usr/local/www/firewall_virtual_ip_edit.php:110
+#: usr/local/www/firewall_virtual_ip_edit.php:384
+#: usr/local/www/load_balancer_monitor.php:123
+#: usr/local/www/load_balancer_monitor_edit.php:91
+#: usr/local/www/load_balancer_monitor_edit.php:249
+#: usr/local/www/load_balancer_relay_action.php:140
+#: usr/local/www/load_balancer_relay_action_edit.php:464
+#: usr/local/www/load_balancer_relay_protocol.php:134
+#: usr/local/www/load_balancer_relay_protocol_edit.php:82
+#: usr/local/www/load_balancer_relay_protocol_edit.php:202
+#: usr/local/www/services_captiveportal.php:894
+#: usr/local/www/services_dhcp.php:1157
+#: usr/local/www/services_igmpproxy.php:97
+#: usr/local/www/services_igmpproxy_edit.php:190
+#: usr/local/www/status_ntpd.php:182 usr/local/www/system_authservers.php:167
+#: usr/local/www/system_authservers.php:190
+#: usr/local/www/system_authservers.php:476
+#: usr/local/www/system_authservers.php:806
+#: usr/local/www/system_certmanager.php:805
+#: usr/local/www/vpn_ipsec_phase2.php:582
+#: usr/local/www/vpn_ipsec_phase2.php:617
+#: usr/local/www/vpn_ipsec_phase2.php:659
+msgid "Type"
+msgstr "Tür"
+
+#: usr/local/www/firewall_aliases_edit.php:792
+msgid "Item information"
+msgstr "Öğe Bilgisi"
+
+#: usr/local/www/firewall_aliases_edit.php:796
+#: usr/local/www/firewall_nat_1to1_edit.php:368
+#: usr/local/www/firewall_nat_1to1_edit.php:442
+#: usr/local/www/firewall_nat_edit.php:571
+#: usr/local/www/firewall_nat_edit.php:660
+#: usr/local/www/firewall_nat_out_edit.php:542
+#: usr/local/www/firewall_nat_out_edit.php:593
+#: usr/local/www/firewall_rules_edit.php:1057
+#: usr/local/www/firewall_rules_edit.php:1160
+#: usr/local/www/firewall_virtual_ip_edit.php:424
+#: usr/local/www/services_igmpproxy_edit.php:228
+#: usr/local/www/services_unbound_acls.php:240
+#: usr/local/www/system_routes.php:234 usr/local/www/vpn_ipsec_mobile.php:435
+#: usr/local/www/vpn_ipsec_phase2.php:587
+#: usr/local/www/vpn_ipsec_phase2.php:622
+#: usr/local/www/vpn_ipsec_phase2.php:664
+msgid "Network"
+msgstr "Ağ"
+
+#: usr/local/www/firewall_aliases_edit.php:830
+#: usr/local/www/services_dnsmasq_edit.php:279
+#: usr/local/www/services_router_advertisements.php:345
+#: usr/local/www/services_unbound_host_edit.php:283
+#: usr/local/www/system_certmanager.php:825
+msgid "remove this entry"
+msgstr "bu girdiyi sil"
+
+#: usr/local/www/firewall_aliases_edit.php:843
+#: usr/local/www/firewall_shaper_layer7.php:556
+#: usr/local/www/interfaces_groups_edit.php:322
+#: usr/local/www/interfaces_qinq_edit.php:390
+#: usr/local/www/services_dhcp.php:1197 usr/local/www/services_dhcpv6.php:817
+#: usr/local/www/services_dnsmasq_edit.php:290
+#: usr/local/www/services_igmpproxy_edit.php:275
+#: usr/local/www/services_router_advertisements.php:363
+#: usr/local/www/services_unbound_acls.php:281
+#: usr/local/www/services_unbound_host_edit.php:295
+#: usr/local/www/system_certmanager.php:837
+#: usr/local/www/vpn_pppoe_edit.php:586
+msgid "add another entry"
+msgstr "başka giriş ekle"
+
+#: usr/local/www/firewall_aliases_edit.php:852
+#: usr/local/www/firewall_aliases_import.php:216
+#: usr/local/www/firewall_nat_1to1_edit.php:537
+#: usr/local/www/firewall_nat_edit.php:897
+#: usr/local/www/firewall_nat_npt_edit.php:279
+#: usr/local/www/firewall_nat_out_edit.php:829
+#: usr/local/www/firewall_rules_edit.php:1262
+#: usr/local/www/firewall_rules_edit.php:1739
+#: usr/local/www/firewall_schedule_edit.php:1169
+#: usr/local/www/firewall_shaper_layer7.php:569
+#: usr/local/www/firewall_virtual_ip_edit.php:510
+#: usr/local/www/interfaces.php:1856 usr/local/www/interfaces.php:1962
+#: usr/local/www/interfaces.php:3380
+#: usr/local/www/interfaces_bridge_edit.php:605
+#: usr/local/www/interfaces_gif_edit.php:234
+#: usr/local/www/interfaces_gre_edit.php:237
+#: usr/local/www/interfaces_groups_edit.php:334
+#: usr/local/www/interfaces_lagg_edit.php:236
+#: usr/local/www/interfaces_ppps_edit.php:796
+#: usr/local/www/interfaces_qinq_edit.php:398
+#: usr/local/www/interfaces_vlan_edit.php:204
+#: usr/local/www/interfaces_wireless_edit.php:202
+#: usr/local/www/load_balancer_monitor_edit.php:359
+#: usr/local/www/load_balancer_pool_edit.php:335
+#: usr/local/www/load_balancer_relay_action_edit.php:559
+#: usr/local/www/load_balancer_relay_protocol_edit.php:282
+#: usr/local/www/load_balancer_virtual_server_edit.php:280
+#: usr/local/www/pkg_edit.php:942
+#: usr/local/www/services_captiveportal.php:1082
+#: usr/local/www/services_captiveportal_vouchers.php:637
+#: usr/local/www/services_dhcp_edit.php:546
+#: usr/local/www/services_dhcpv6_edit.php:250
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:165
+#: usr/local/www/services_dnsmasq_edit.php:306
+#: usr/local/www/services_dyndns_edit.php:425
+#: usr/local/www/services_igmpproxy_edit.php:283
+#: usr/local/www/services_rfc2136_edit.php:215
+#: usr/local/www/services_unbound_acls.php:311
+#: usr/local/www/services_unbound_domainoverride_edit.php:160
+#: usr/local/www/services_unbound_host_edit.php:311
+#: usr/local/www/services_wol_edit.php:162
+#: usr/local/www/system_advanced_sysctl.php:270
+#: usr/local/www/system_gateway_groups_edit.php:348
+#: usr/local/www/system_gateways_edit.php:862
+#: usr/local/www/system_groupmanager.php:461
+#: usr/local/www/system_groupmanager_addprivs.php:227
+#: usr/local/www/system_hasync.php:348
+#: usr/local/www/system_routes_edit.php:302
+#: usr/local/www/system_routes_edit.php:333
+#: usr/local/www/system_usermanager.php:883
+#: usr/local/www/system_usermanager_addprivs.php:196
+#: usr/local/www/vpn_l2tp_users_edit.php:183
+#: usr/local/www/vpn_pppoe_edit.php:605
+msgid "Cancel"
+msgstr "İptal"
+
+#: usr/local/www/firewall_aliases_import.php:50
+msgid "Bulk import"
+msgstr "Toplu İçeri Aktarım"
+
+#: usr/local/www/firewall_aliases_import.php:73
+msgid "The alias name may only consist of the characters"
+msgstr "Grup adı sadece karakterlerden oluşmalıdır"
+
+#: usr/local/www/firewall_aliases_import.php:115
+#, php-format
+msgid "%s is not an IP address. Please correct the error to continue"
+msgstr "%s bir IP adresi değildir. Devam etmek için hatayı düzeltiniz"
+
+#: usr/local/www/firewall_aliases_import.php:123
+msgid ""
+"Descriptions may not start or end with vertical bar (|) or contain double "
+"vertical bar ||."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:132
+msgid "Descriptions must be less than 200 characters long."
+msgstr ""
+
+#: usr/local/www/firewall_aliases_import.php:172
+msgid "Alias Import"
+msgstr "Grup İçeri Aktar"
+
+#: usr/local/www/firewall_aliases_import.php:175
+msgid "Alias Name"
+msgstr "Grup Adı"
+
+#: usr/local/www/firewall_aliases_import.php:180
+msgid ""
+"The name of the alias may only consist of the characters \"a-z, A-Z and "
+"0-9\"."
+msgstr "Grup adı sadece \"a-z, A-Z and 0-9\" karakterleri içerebilir."
+
+#: usr/local/www/firewall_aliases_import.php:190
+#: usr/local/www/interfaces_lagg_edit.php:228
+#: usr/local/www/services_captiveportal_hostname_edit.php:189
+#: usr/local/www/services_captiveportal_ip_edit.php:206
+#: usr/local/www/services_captiveportal_mac_edit.php:222
+#: usr/local/www/services_captiveportal_zones_edit.php:110
+#: usr/local/www/system_gateways_edit.php:855
+#: usr/local/www/vpn_ipsec_phase1.php:665
+#: usr/local/www/vpn_ipsec_phase2.php:696
+#: usr/local/www/vpn_openvpn_client.php:667
+#: usr/local/www/vpn_openvpn_csc.php:368
+#: usr/local/www/vpn_openvpn_server.php:896
+msgid "You may enter a description here for your reference (not parsed)"
+msgstr ""
+"Bu alana kendiniz için herhangi bir açıklama girebilirsiniz, (sistem dikkate "
+"almayacaktır)"
+
+#: usr/local/www/firewall_aliases_import.php:195
+msgid "Aliases to import"
+msgstr "İçeri aktarılacak gruplar"
+
+#: usr/local/www/firewall_aliases_import.php:200
+msgid ""
+"Paste in the aliases to import separated by a carriage return. Common "
+"examples are lists of IPs, networks, blacklists, etc."
+msgstr ""
+"Grupları her satıra ayrı bir tane gelecek şekilde bu alana yapıştırın. Genel "
+"örnekler IPler, ağlar, karalisteler ve benzerleridir."
+
+#: usr/local/www/firewall_aliases_import.php:202
+msgid ""
+"The list may contain IP addresses, with or without CIDR prefix, IP ranges, "
+"blank lines (ignored) and an optional description after each IP. e.g.:"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:167 usr/local/www/firewall_nat.php:190
+#: usr/local/www/firewall_nat_1to1.php:169
+#: usr/local/www/firewall_nat_edit.php:457
+#: usr/local/www/firewall_nat_npt.php:95
+#: usr/local/www/firewall_nat_out.php:233
+msgid "Port Forward"
+msgstr "Port Yönlendirme"
+
+#: usr/local/www/firewall_nat.php:184 usr/local/www/firewall_nat_npt.php:90
+msgid "The NAT configuration has been changed"
+msgstr "NAT yapılandırması değiştirildi"
+
+#: usr/local/www/firewall_nat.php:191 usr/local/www/firewall_nat_1to1.php:148
+#: usr/local/www/firewall_nat_1to1.php:170
+#: usr/local/www/firewall_nat_1to1_edit.php:227
+#: usr/local/www/firewall_nat_npt.php:96
+#: usr/local/www/firewall_nat_out.php:234
+msgid "1:1"
+msgstr "1:1"
+
+#: usr/local/www/firewall_nat.php:192 usr/local/www/firewall_nat_1to1.php:171
+#: usr/local/www/firewall_nat_npt.php:97
+#: usr/local/www/firewall_nat_out.php:214
+#: usr/local/www/firewall_nat_out.php:235
+#: usr/local/www/firewall_nat_out_edit.php:343
+msgid "Outbound"
+msgstr "Dışarı giden"
+
+#: usr/local/www/firewall_nat.php:193 usr/local/www/firewall_nat_1to1.php:172
+#: usr/local/www/firewall_nat_npt.php:81 usr/local/www/firewall_nat_npt.php:98
+#: usr/local/www/firewall_nat_npt_edit.php:148
+#: usr/local/www/firewall_nat_out.php:236
+msgid "NPt"
+msgstr "NPt"
+
+#: usr/local/www/firewall_nat.php:206
+msgid "Src. addr"
+msgstr "Kyn. adres"
+
+#: usr/local/www/firewall_nat.php:207
+msgid "Src. ports"
+msgstr "Kyn. portlar"
+
+#: usr/local/www/firewall_nat.php:208
+msgid "Dest. addr"
+msgstr "Hdf. adres"
+
+#: usr/local/www/firewall_nat.php:209
+msgid "Dest. ports"
+msgstr "Hdf. portlar"
+
+#: usr/local/www/firewall_nat.php:210
+msgid "NAT IP"
+msgstr "NAT IP"
+
+#: usr/local/www/firewall_nat.php:211
+msgid "NAT Ports"
+msgstr "NAT Portları"
+
+#: usr/local/www/firewall_nat.php:218 usr/local/www/firewall_nat.php:220
+#: usr/local/www/firewall_nat.php:349 usr/local/www/firewall_nat.php:351
+#: usr/local/www/firewall_nat_1to1.php:321
+#: usr/local/www/firewall_nat_out.php:515 usr/local/www/firewall_rules.php:367
+#: usr/local/www/firewall_rules.php:368 usr/local/www/firewall_rules.php:804
+#: usr/local/www/firewall_rules.php:805
+msgid "delete selected rules"
+msgstr "seçili kuralları sil"
+
+#: usr/local/www/firewall_nat.php:220 usr/local/www/firewall_nat.php:351
+#: usr/local/www/firewall_rules.php:368 usr/local/www/firewall_rules.php:805
+msgid "Do you really want to delete the selected rules?"
+msgstr "Seçili kuralları silmek istediğinize emin misiniz?"
+
+#: usr/local/www/firewall_nat.php:269
+msgid "All traffic matching this NAT entry is passed"
+msgstr "Bu NAT girişine uyan tüm trafik geçirilir"
+
+#: usr/local/www/firewall_nat.php:271
+msgid "Firewall rule ID"
+msgstr "Güvenlik duvarı kuralı"
+
+#: usr/local/www/firewall_nat.php:271
+msgid "is managed with this rule"
+msgstr "bu kural tarafından yönetilmektedir"
+
+#: usr/local/www/firewall_nat.php:326 usr/local/www/firewall_nat_1to1.php:260
+#: usr/local/www/firewall_nat_out.php:460 usr/local/www/firewall_rules.php:402
+#: usr/local/www/firewall_rules.php:431 usr/local/www/firewall_rules.php:459
+#: usr/local/www/firewall_rules.php:750
+msgid "move selected rules before this rule"
+msgstr "seçili kuralları bu kuralın üstüne taşı"
+
+#: usr/local/www/firewall_nat.php:327 usr/local/www/firewall_nat_1to1.php:265
+#: usr/local/www/firewall_nat_npt.php:160 usr/local/www/firewall_rules.php:403
+#: usr/local/www/firewall_rules.php:432 usr/local/www/firewall_rules.php:460
+#: usr/local/www/firewall_rules.php:751
+msgid "edit rule"
+msgstr "kuralı düzenle"
+
+#: usr/local/www/firewall_nat.php:330 usr/local/www/firewall_nat_1to1.php:271
+#: usr/local/www/firewall_nat_out.php:469
+msgid "Do you really want to delete this rule?"
+msgstr "Bu kuralı silmek istediğinize emin misiniz?"
+
+#: usr/local/www/firewall_nat.php:330 usr/local/www/firewall_nat_1to1.php:272
+#: usr/local/www/firewall_nat_npt.php:161
+#: usr/local/www/firewall_nat_out.php:470 usr/local/www/firewall_rules.php:754
+msgid "delete rule"
+msgstr "kuralı sil"
+
+#: usr/local/www/firewall_nat.php:331 usr/local/www/firewall_nat_out.php:475
+msgid "add a new NAT based on this one"
+msgstr ""
+
+#: usr/local/www/firewall_nat.php:344 usr/local/www/firewall_rules.php:798
+msgid "move selected rules to end"
+msgstr "seçili kuralları sona taşı"
+
+#: usr/local/www/firewall_nat.php:362 usr/local/www/firewall_rules.php:817
+msgid "pass"
+msgstr "izin ver"
+
+#: usr/local/www/firewall_nat.php:366
+msgid "linked rule"
+msgstr "ilişkilendirilmiş kural"
+
+#: usr/local/www/firewall_nat_1to1.php:160
+#: usr/local/www/firewall_nat_out.php:226
+msgid "The NAT configuration has been changed."
+msgstr "NAT yapılandırması değiştirildi."
+
+#: usr/local/www/firewall_nat_1to1.php:183
+msgid "External IP"
+msgstr "Dış IP"
+
+#: usr/local/www/firewall_nat_1to1.php:184
+#: usr/local/www/firewall_nat_1to1_edit.php:348
+#: usr/local/www/status_upnp.php:89
+msgid "Internal IP"
+msgstr "İç IP"
+
+#: usr/local/www/firewall_nat_1to1.php:185
+msgid "Destination IP"
+msgstr "Hedef IP"
+
+#: usr/local/www/firewall_nat_1to1.php:193
+#: usr/local/www/firewall_nat_npt.php:115
+#: usr/local/www/firewall_nat_npt.php:173
+msgid "add rule"
+msgstr "kural ekle"
+
+#: usr/local/www/firewall_nat_1to1.php:219
+#: usr/local/www/firewall_nat_out.php:371 usr/local/www/firewall_rules.php:507
+#: usr/local/www/system_gateways.php:272 usr/local/www/system_gateways.php:278
+#: usr/local/www/system_routes.php:264 usr/local/www/vpn_ipsec.php:300
+#: usr/local/www/vpn_ipsec.php:475
+msgid "click to toggle enabled/disabled status"
+msgstr "açık/kapalı durumunu değiştirmek için tıklayın"
+
+#: usr/local/www/firewall_nat_1to1.php:277
+#: usr/local/www/firewall_rules.php:407 usr/local/www/firewall_rules.php:436
+#: usr/local/www/firewall_rules.php:464 usr/local/www/firewall_rules.php:755
+msgid "add a new rule based on this one"
+msgstr "bu kuralı temel alan yeni bir kural ekle"
+
+#: usr/local/www/firewall_nat_1to1.php:298
+#: usr/local/www/firewall_nat_1to1.php:303
+#: usr/local/www/firewall_nat_out.php:495
+#: usr/local/www/firewall_nat_out.php:499
+msgid "move selected mappings to end"
+msgstr "seçili eşlemeleri sona taşı"
+
+#: usr/local/www/firewall_nat_1to1.php:311
+#: usr/local/www/firewall_nat_out.php:320
+#: usr/local/www/firewall_nat_out.php:506
+msgid "add new mapping"
+msgstr "yeni eşleme ekle"
+
+#: usr/local/www/firewall_nat_1to1.php:326
+#: usr/local/www/firewall_nat_out.php:519
+msgid "delete selected mappings"
+msgstr "seçili eşlemeleri sil"
+
+#: usr/local/www/firewall_nat_1to1.php:327
+#: usr/local/www/firewall_nat_out.php:519
+msgid "Do you really want to delete the selected mappings?"
+msgstr "Seçili eşlemeleri silmek istediğinize emin misiniz?"
+
+#: usr/local/www/firewall_nat_1to1.php:340
+msgid "Depending on the way your WAN connection is setup, you may also need a"
+msgstr ""
+"WAN bağlantı yapılandırmanıza bağlı olarak ayrıca ihtiyaç duyabilirsiniz"
+
+#: usr/local/www/firewall_nat_1to1.php:341
+msgid "Virtual IP."
+msgstr "bir Sanal IP."
+
+#: usr/local/www/firewall_nat_1to1.php:342
+msgid ""
+"If you add a 1:1 NAT entry for any of the interface IPs on this system, it "
+"will make this system inaccessible on that IP address. i.e. if you use your "
+"WAN IP address, any services on this system (IPsec, OpenVPN server, etc.) "
+"using the WAN IP address will no longer function."
+msgstr ""
+"Eğer 1:1 NAT girdisi olarak bu sistem üzerindeki herhangi bir arabirimin IP "
+"adresini tanımlarsanız, belirtilen IP adresinden sisteme erişemezsiniz. "
+"Örneğin WAN IP adresinizi kullanırsanız o sistem üzerindeki servisler "
+"(örneğin IPsec, OpenVPN, vb.) çalışmaz hale gelir."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:112
+#: usr/local/www/firewall_nat_out_edit.php:141
+#, php-format
+msgid ""
+"Invalid characters detected (%s). Please remove invalid characters and save "
+"again."
+msgstr ""
+"Geçersiz karakterler tespit edildi (%s). Lütfen geçersiz karakterleri "
+"temizleyip tekrar kaydediniz."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:117
+msgid "External subnet"
+msgstr "Dış alt ağ"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:120
+#: usr/local/www/firewall_nat_edit.php:205
+msgid "Source address"
+msgstr "Kaynak adres"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:124
+#: usr/local/www/firewall_nat_edit.php:209
+msgid "Destination address"
+msgstr "Hedef adres"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:155
+msgid "A valid external subnet must be specified."
+msgstr "Geçerli bir dış altağ tanımlanmalıdır."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:159
+#: usr/local/www/firewall_nat_edit.php:254
+#: usr/local/www/firewall_rules_edit.php:446
+#: usr/local/www/firewall_rules_edit.php:450
+msgid "You must specify single host or alias for alias entries."
+msgstr "Tek bir grup adı ya da istemci girmelisiniz."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:164
+#, php-format
+msgid "%s is not a valid internal IP address."
+msgstr "%s geçerli bir iç IP adresi değildir."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:167
+msgid "A valid internal bit count must be specified."
+msgstr "Gerçerli bir iç ağ maskesi bit değeri belirtilmelidir."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:174
+#: usr/local/www/firewall_nat_edit.php:267
+#: usr/local/www/firewall_rules_edit.php:463
+#, php-format
+msgid "%s is not a valid destination IP address or alias."
+msgstr "%s geçerli bir hedef IP değeri ya da grup adı değildir."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:177
+#: usr/local/www/firewall_nat_edit.php:270
+#: usr/local/www/firewall_nat_out_edit.php:188
+#: usr/local/www/firewall_rules_edit.php:466
+msgid "A valid destination bit count must be specified."
+msgstr "Geçerli bi hedef ağ maskesi bit değeri tanımlanmalıdır."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:284
+msgid "Edit NAT 1:1 entry"
+msgstr "1:1 NAT girdisini düzenle"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:290
+#: usr/local/www/firewall_nat_edit.php:482
+#: usr/local/www/firewall_nat_npt_edit.php:168
+#: usr/local/www/firewall_nat_out_edit.php:456
+#: usr/local/www/firewall_rules_edit.php:859
+msgid "Disable this rule"
+msgstr "Kuralı devre dışı bırak"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:291
+#: usr/local/www/firewall_nat_edit.php:483
+#: usr/local/www/firewall_nat_npt_edit.php:169
+#: usr/local/www/firewall_nat_out_edit.php:457
+#: usr/local/www/firewall_rules_edit.php:860
+msgid "Set this option to disable this rule without removing it from the list."
+msgstr ""
+"Herhangi bir kuralı silmeden devredışı bırakmak için bu seçeneği "
+"işaretleyiniz."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:332
+#: usr/local/www/firewall_nat_npt_edit.php:209
+msgid "Choose which interface this rule applies to"
+msgstr "Bu kuralın hangi arabirime uygulanacağını seçiniz"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:333
+#: usr/local/www/firewall_nat_npt_edit.php:210
+msgid "Hint: in most cases, you'll want to use WAN here"
+msgstr "İpucu: Çoğu durumda bu alanda WAN seçilmelidir"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:336
+msgid "External subnet IP"
+msgstr "Dış altağ IPsi"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:341
+msgid ""
+"Enter the external (usually on a WAN) subnet's starting address for the 1:1 "
+"mapping. The subnet mask from the internal address below will be applied to "
+"this IP address."
+msgstr ""
+"1:1 haritalama için dış altağın (genellikle WAN arabiriminde olur) başlangıç "
+"adresini girin. Aşağıdaki iç adres altağ maskesi bu IP adresine uygulanır."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:343
+msgid ""
+"Hint: this is generally an address owned by the router itself on the "
+"selected interface."
+msgstr ""
+"İpucu: Genellikle seçili arabirimde yönlendiriciye (router) ait bir adrestir."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:351
+#: usr/local/www/firewall_nat_1to1_edit.php:425
+#: usr/local/www/firewall_nat_edit.php:557
+#: usr/local/www/firewall_nat_edit.php:646
+#: usr/local/www/firewall_nat_npt_edit.php:216
+#: usr/local/www/firewall_nat_npt_edit.php:244
+#: usr/local/www/firewall_nat_out_edit.php:581
+#: usr/local/www/firewall_rules_edit.php:1037
+#: usr/local/www/firewall_rules_edit.php:1140
+msgid "not"
+msgstr "dışında"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:353
+#: usr/local/www/firewall_nat_1to1_edit.php:427
+#: usr/local/www/firewall_nat_edit.php:559
+#: usr/local/www/firewall_nat_edit.php:648
+#: usr/local/www/firewall_nat_npt_edit.php:218
+#: usr/local/www/firewall_nat_npt_edit.php:246
+#: usr/local/www/firewall_nat_out_edit.php:582
+#: usr/local/www/firewall_rules_edit.php:1039
+#: usr/local/www/firewall_rules_edit.php:1142
+msgid "Use this option to invert the sense of the match."
+msgstr "Eşleştirmeyi tersine çevirmek için bu seçeneği kullanabilirsiniz."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:358
+#: usr/local/www/firewall_nat_1to1_edit.php:432
+#: usr/local/www/firewall_nat_edit.php:564
+#: usr/local/www/firewall_nat_edit.php:653
+#: usr/local/www/firewall_nat_out_edit.php:537
+#: usr/local/www/firewall_nat_out_edit.php:586
+#: usr/local/www/firewall_rules_edit.php:1044
+#: usr/local/www/firewall_rules_edit.php:1147
+#: usr/local/www/firewall_virtual_ip_edit.php:419
+msgid "Type:"
+msgstr "Tür:"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:366
+msgid "Single host"
+msgstr "Tek istemci"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:372
+#: usr/local/www/firewall_nat_1to1_edit.php:448
+#: usr/local/www/firewall_nat_edit.php:573
+#: usr/local/www/firewall_nat_edit.php:663
+#: usr/local/www/firewall_rules_edit.php:1062
+#: usr/local/www/firewall_rules_edit.php:1163
+msgid "PPTP clients"
+msgstr "PPTP istemcileri"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:377
+#: usr/local/www/firewall_nat_1to1_edit.php:455
+#: usr/local/www/firewall_nat_edit.php:576
+#: usr/local/www/firewall_nat_edit.php:666
+#: usr/local/www/firewall_rules_edit.php:1065
+#: usr/local/www/firewall_rules_edit.php:1166
+msgid "PPPoE clients"
+msgstr "PPPoE istemcileri"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:382
+#: usr/local/www/firewall_nat_1to1_edit.php:462
+#: usr/local/www/firewall_nat_edit.php:579
+#: usr/local/www/firewall_nat_edit.php:669
+#: usr/local/www/firewall_rules_edit.php:1068
+#: usr/local/www/firewall_rules_edit.php:1169
+msgid "L2TP clients"
+msgstr "L2TP istemcileri"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:389
+#: usr/local/www/firewall_nat_1to1_edit.php:471
+#: usr/local/www/firewall_nat_edit.php:584
+#: usr/local/www/firewall_nat_edit.php:674
+#: usr/local/www/firewall_rules_edit.php:1073
+#: usr/local/www/firewall_rules_edit.php:1174
+msgid "net"
+msgstr ""
+
+#: usr/local/www/firewall_nat_1to1_edit.php:392
+#: usr/local/www/firewall_nat_1to1_edit.php:474
+#: usr/local/www/firewall_nat_edit.php:586
+#: usr/local/www/firewall_nat_edit.php:676
+#: usr/local/www/firewall_rules_edit.php:1075
+#: usr/local/www/firewall_rules_edit.php:1176
+msgid "address"
+msgstr "adres"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:402
+#: usr/local/www/firewall_nat_1to1_edit.php:484
+#: usr/local/www/firewall_nat_edit.php:594
+#: usr/local/www/firewall_nat_edit.php:705
+#: usr/local/www/firewall_nat_npt_edit.php:223
+#: usr/local/www/firewall_nat_npt_edit.php:251
+#: usr/local/www/firewall_nat_out_edit.php:547
+#: usr/local/www/firewall_nat_out_edit.php:599
+#: usr/local/www/firewall_nat_out_edit.php:634
+#: usr/local/www/firewall_rules_edit.php:1083
+#: usr/local/www/firewall_rules_edit.php:1184
+#: usr/local/www/firewall_virtual_ip_edit.php:430
+#: usr/local/www/vpn_ipsec_phase2.php:598
+#: usr/local/www/vpn_ipsec_phase2.php:634
+msgid "Address:"
+msgstr "Adres:"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:418
+msgid ""
+"Enter the internal (LAN) subnet for the 1:1 mapping. The subnet size "
+"specified for the internal subnet will be applied to the external subnet."
+msgstr ""
+"1:1 haritalama için iç (LAN) altağını girin. İç altağ için belirtilen altağ "
+"boyutu dış altağa uygulanır."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:439
+#: usr/local/www/firewall_nat_edit.php:570
+#: usr/local/www/firewall_nat_edit.php:659
+#: usr/local/www/firewall_rules_edit.php:1056
+#: usr/local/www/firewall_rules_edit.php:1159
+msgid "Single host or alias"
+msgstr "Tek istemci ya da grup"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:502
+msgid ""
+"The 1:1 mapping will only be used for connections to or from the specified "
+"destination."
+msgstr ""
+"1:1 haritalama belirtilen hedefe giden ya da hedeften gelen bağlantılar için "
+"kullanılır."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:503
+msgid "Hint: this is usually 'any'."
+msgstr "İpucu: Genelde 'herhangi biri' seçilir."
+
+#: usr/local/www/firewall_nat_1to1_edit.php:518
+#: usr/local/www/firewall_nat_edit.php:803
+msgid "NAT reflection"
+msgstr "NAT yansılama"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:522
+msgid "use system default"
+msgstr "sistem varsayılanını kullan"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:525
+msgid "enable"
+msgstr "etkinleştir"
+
+#: usr/local/www/firewall_nat_1to1_edit.php:528
+msgid "disable"
+msgstr "kapat"
+
+#: usr/local/www/firewall_nat_edit.php:124
+#, php-format
+msgid ""
+"Invalid characters detected %s. Please remove invalid characters and save "
+"again."
+msgstr ""
+"Geçersiz karakter tespit edilmiştir %s. Lütfen geçersiz karakterleri "
+"temizleyip tekrar kaydediniz."
+
+#: usr/local/www/firewall_nat_edit.php:197
+msgid "Destination port from"
+msgstr "Hedef porttan"
+
+#: usr/local/www/firewall_nat_edit.php:197
+msgid "Destination port to"
+msgstr "Hedef porta"
+
+#: usr/local/www/firewall_nat_edit.php:213
+#: usr/local/www/firewall_nat_edit.php:760
+msgid "Redirect target IP"
+msgstr "Hedef IPyi yönlendir"
+
+#: usr/local/www/firewall_nat_edit.php:235
+#, php-format
+msgid "\"%s\" is not a valid redirect target IP address or host alias."
+msgstr "\"%s\" geçerli bir yönlendirme hedef IP adresi veya grup değil."
+
+#: usr/local/www/firewall_nat_edit.php:239
+#: usr/local/www/firewall_rules_edit.php:410
+#, php-format
+msgid ""
+"%s is not a valid start source port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+"%s geçerli bir başlangıç kaynak portu değil. Bir port grubu ya da 1 ile "
+"65535 arası bir tamsayı olmalıdır."
+
+#: usr/local/www/firewall_nat_edit.php:241
+#, php-format
+msgid ""
+"%s is not a valid end source port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+"%s geçerli bir bitiş kaynak portu değil. Bir port grubu yada 1 ile 65535 "
+"arası bir tamsayı olmalıdır."
+
+#: usr/local/www/firewall_nat_edit.php:243
+#: usr/local/www/firewall_rules_edit.php:414
+#, php-format
+msgid ""
+"%s is not a valid start destination port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+"%s geçerli bir başlangıç hedef portu değil. Bir port grubu yada 1 ile 65535 "
+"arası sayı olmalıdır."
+
+#: usr/local/www/firewall_nat_edit.php:245
+#: usr/local/www/firewall_rules_edit.php:416
+#, php-format
+msgid ""
+"%s is not a valid end destination port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+"%s geçerli bir bitiş hedef portu değil. Bir port grubu yada 1 ile 65535 "
+"arası sayı olmalıdır."
+
+#: usr/local/www/firewall_nat_edit.php:248
+#, php-format
+msgid ""
+"A valid redirect target port must be specified. It must be a port alias or "
+"integer between 1 and 65535."
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:259
+#: usr/local/www/firewall_rules_edit.php:455
+#, php-format
+msgid "%s is not a valid source IP address or alias."
+msgstr "%s geçerli bir kaynak IP adresi ya da grup değil."
+
+#: usr/local/www/firewall_nat_edit.php:262
+#: usr/local/www/firewall_nat_out_edit.php:180
+#: usr/local/www/firewall_rules_edit.php:458
+msgid "A valid source bit count must be specified."
+msgstr "Geçerli bir kaynak bit adedi belirtilmelidir."
+
+#: usr/local/www/firewall_nat_edit.php:289
+msgid "The target port range must be an integer between 1 and 65535."
+msgstr "Hedef port aralığı 1 ile 65535 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/firewall_nat_edit.php:310
+msgid "The destination port range overlaps with an existing entry."
+msgstr "Hedef port aralığı varolan bir girdi ile çakışıyor."
+
+# 75%
+#: usr/local/www/firewall_nat_edit.php:422
+msgid "NAT Port Forward"
+msgstr "NAT Port Yonlendirme"
+
+#: usr/local/www/firewall_nat_edit.php:472
+msgid "Edit Redirect entry"
+msgstr "Yönlendirme girdisini düzenle"
+
+#: usr/local/www/firewall_nat_edit.php:487
+msgid "No RDR (NOT)"
+msgstr "Yönlendirme (YOK)"
+
+#: usr/local/www/firewall_nat_edit.php:490
+msgid ""
+"Enabling this option will disable redirection for traffic matching this rule."
+msgstr ""
+"Bu seçeneğin etkinleştirilmesi kurala uyan trafikte yönlendirmeyi kapatır."
+
+#: usr/local/www/firewall_nat_edit.php:491
+msgid ""
+"Hint: this option is rarely needed, don't use this unless you know what "
+"you're doing."
+msgstr ""
+"İpucu: Bu seçeneğe nadiren ihtiyaç olur, ne yaptığınızdan emin değilseniz bu "
+"seçeneği kullanmayın."
+
+#: usr/local/www/firewall_nat_edit.php:533
+#: usr/local/www/firewall_nat_out_edit.php:507
+msgid "Choose which interface this rule applies to."
+msgstr "Bu kuralın uygulanacağı arabirimi seçiniz."
+
+#: usr/local/www/firewall_nat_edit.php:534
+#: usr/local/www/firewall_nat_out_edit.php:508
+msgid "Hint: in most cases, you'll want to use WAN here."
+msgstr "İpucu: Çoğu durumda burada WAN kullanılır."
+
+#: usr/local/www/firewall_nat_edit.php:543
+#: usr/local/www/firewall_rules_edit.php:998
+msgid "Choose which IP protocol this rule should match."
+msgstr "Bu kuralın eşleşeceği IP protokolünü seçiniz."
+
+#: usr/local/www/firewall_nat_edit.php:545
+msgid "Hint: in most cases, you should specify"
+msgstr "İpucu: Çoğu durumda"
+
+#: usr/local/www/firewall_nat_edit.php:545
+#: usr/local/www/load_balancer_monitor_edit.php:200
+#: usr/local/www/load_balancer_relay_action_edit.php:188
+#: usr/local/www/load_balancer_relay_protocol_edit.php:145
+msgid "TCP"
+msgstr "TCP"
+
+#: usr/local/www/firewall_nat_edit.php:550
+msgid "Show source address and port range"
+msgstr "Kaynak adres ve port aralığını görüntüle"
+
+#: usr/local/www/firewall_nat_edit.php:608
+#: usr/local/www/firewall_rules_edit.php:1102
+msgid "Source port range"
+msgstr "Kaynak port aralığı"
+
+#: usr/local/www/firewall_nat_edit.php:612
+#: usr/local/www/firewall_nat_edit.php:725
+#: usr/local/www/firewall_rules_edit.php:1106
+#: usr/local/www/firewall_rules_edit.php:1205
+msgid "from:"
+msgstr "başlangıç:"
+
+#: usr/local/www/firewall_nat_edit.php:615
+#: usr/local/www/firewall_nat_edit.php:628
+#: usr/local/www/firewall_nat_edit.php:728
+#: usr/local/www/firewall_nat_edit.php:741
+#: usr/local/www/firewall_nat_edit.php:771
+#: usr/local/www/firewall_rules_edit.php:1109
+#: usr/local/www/firewall_rules_edit.php:1122
+#: usr/local/www/firewall_rules_edit.php:1208
+#: usr/local/www/firewall_rules_edit.php:1221
+msgid "other"
+msgstr "diğer"
+
+#: usr/local/www/firewall_nat_edit.php:625
+#: usr/local/www/firewall_nat_edit.php:738
+#: usr/local/www/firewall_rules_edit.php:1119
+#: usr/local/www/firewall_rules_edit.php:1218
+msgid "to:"
+msgstr "bitiş:"
+
+#: usr/local/www/firewall_nat_edit.php:639
+msgid "Specify the source port or port range for this rule"
+msgstr "Bu kural için kaynak port yada port aralığı belirtiniz"
+
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid "This is usually"
+msgstr "Bu genellikle"
+
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid "random"
+msgstr "rasgeledir"
+
+#: usr/local/www/firewall_nat_edit.php:639
+msgid ""
+"and almost never equal to the destination port range (and should usually be "
+"'any')"
+msgstr ""
+"ve neredeyse hiçbir zaman hedef port aralığıyla aynı olmaz (ve genellikle "
+"'herhangi biri' olmalıdır)"
+
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_nat_edit.php:755
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1235
+msgid "Hint: you can leave the"
+msgstr "İpucu: "
+
+#: usr/local/www/firewall_nat_edit.php:639
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid "field empty if you only want to filter a single port."
+msgstr "Sadece tek port engellemek için bu alanı boş bırakınız."
+
+#: usr/local/www/firewall_nat_edit.php:661
+#: usr/local/www/firewall_nat_out_edit.php:541
+#: usr/local/www/firewall_rules_edit.php:1059
+#: usr/local/www/firewall_rules_edit.php:1161
+msgid "This Firewall (self)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_edit.php:721
+msgid "Destination port range"
+msgstr "Hedef port aralığı"
+
+#: usr/local/www/firewall_nat_edit.php:753
+msgid ""
+"Specify the port or port range for the destination of the packet for this "
+"mapping."
+msgstr "Bu eşleştirme için hedef port ya da port aralığı belirtiniz."
+
+#: usr/local/www/firewall_nat_edit.php:755
+msgid "field empty if you only want to map a single port"
+msgstr "Tek port belirtmek istiyorsanız bu alanı boş bırakınız"
+
+#: usr/local/www/firewall_nat_edit.php:763
+msgid ""
+"Enter the internal IP address of the server on which you want to map the "
+"ports."
+msgstr "Portları haritalamak istediğiniz sunucunun iç IP adresini giriniz."
+
+#: usr/local/www/firewall_nat_edit.php:765
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:138
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:145
+#: usr/local/www/services_dnsmasq_edit.php:220
+#: usr/local/www/services_dnsmasq_edit.php:227
+#: usr/local/www/services_dnsmasq_edit.php:234
+#: usr/local/www/services_unbound_domainoverride_edit.php:132
+#: usr/local/www/services_unbound_domainoverride_edit.php:142
+#: usr/local/www/services_unbound_host_edit.php:220
+#: usr/local/www/services_unbound_host_edit.php:228
+#: usr/local/www/services_unbound_host_edit.php:236
+#: usr/local/www/system.php:318 usr/local/www/system.php:329
+msgid "e.g."
+msgstr "örn."
+
+#: usr/local/www/firewall_nat_edit.php:768
+msgid "Redirect target port"
+msgstr "Hedef portu yönlendir"
+
+#: usr/local/www/firewall_nat_edit.php:782
+msgid ""
+"Specify the port on the machine with the IP address entered above. In case "
+"of a port range, specify the beginning port of the range (the end port will "
+"be calculated automatically)."
+msgstr ""
+"Yukarıda girdiğiniz IPye sahip makinanın portunu belirtiniz. Port aralığı "
+"olacaksa başlangıç portunu giriniz (bitiş portu otomatik hesaplanacaktır)."
+
+#: usr/local/www/firewall_nat_edit.php:786
+msgid "Hint: this is usually identical to the 'from' port above"
+msgstr "İpucu: bu değer genellikle yukarıdaki 'başlangıç' portu ile aynıdır"
+
+#: usr/local/www/firewall_nat_edit.php:796
+#: usr/local/www/firewall_nat_out_edit.php:774
+#: usr/local/www/firewall_rules_edit.php:1425
+msgid "No XMLRPC Sync"
+msgstr "XMLRPC senkronizasyonunu kapat"
+
+#: usr/local/www/firewall_nat_edit.php:799
+#: usr/local/www/firewall_nat_out_edit.php:777
+#: usr/local/www/firewall_rules_edit.php:1432
+msgid ""
+"Hint: This prevents the rule on Master from automatically syncing to other "
+"CARP members. This does NOT prevent the rule from being overwritten on Slave."
+msgstr ""
+"İpucu: CARP üyelerinin eşitlenmesini (Ana \"Master\") kural otomatik olarak "
+"engeller. Bu düşük seviyeli (Slave) kuralın üstüne gelen kuralı engellemez."
+
+#: usr/local/www/firewall_nat_edit.php:806
+msgid "Use system default"
+msgstr "Sistem varsayılanını kullan"
+
+#: usr/local/www/firewall_nat_edit.php:807
+#: usr/local/www/system_advanced_firewall.php:490
+msgid "Enable (NAT + Proxy)"
+msgstr "(NAT+ Vekil 'Proxy') Etkinleştir"
+
+#: usr/local/www/firewall_nat_edit.php:808
+#: usr/local/www/system_advanced_firewall.php:491
+msgid "Enable (Pure NAT)"
+msgstr "(Saf NAT)'ı Etkinleştir"
+
+#: usr/local/www/firewall_nat_edit.php:809
+#: usr/local/www/services_dyndns_edit.php:241
+#: usr/local/www/system_advanced_firewall.php:489
+#: usr/local/www/system_advanced_misc.php:576
+#: usr/local/www/system_advanced_misc.php:592
+#: usr/local/www/system_firmware.php:127
+msgid "Disable"
+msgstr "Kapat"
+
+#: usr/local/www/firewall_nat_edit.php:815
+#: usr/local/www/firewall_nat_edit.php:846
+msgid "Filter rule association"
+msgstr "Filtre kuralı ilişkilendirmesi"
+
+#: usr/local/www/firewall_nat_edit.php:819
+#: usr/local/www/firewall_nat_edit.php:852
+msgid "Pass"
+msgstr "İzin ver"
+
+#: usr/local/www/firewall_nat_edit.php:829
+msgid "View the filter rule"
+msgstr "Filtreleme kurallını görüntüle"
+
+#: usr/local/www/firewall_nat_edit.php:837
+msgid "Create new associated filter rule"
+msgstr "İlişkilendirilmiş filtreleme kuralı oluştur"
+
+#: usr/local/www/firewall_nat_edit.php:850
+msgid "Add associated filter rule"
+msgstr "İlişkilendirilmiş filtreleme kuralı ekle"
+
+#: usr/local/www/firewall_nat_edit.php:851
+msgid "Add unassociated filter rule"
+msgstr "İlişkilendirilmemiş filtreleme kuralı ekle"
+
+#: usr/local/www/firewall_nat_edit.php:854
+msgid ""
+"NOTE: The \"pass\" selection does not work properly with Multi-WAN. It will "
+"only work on an interface containing the default gateway."
+msgstr ""
+"NOT: \"İzin ver\" seçimi Çoklu-WAN (Multi-WAN) ile düzgün çalışmamaktadır. "
+"Yanlızca varsayılan ağ geçidi içeren bir arabirim üzerinden çalışmaktadır."
+
+# 76%
+#: usr/local/www/firewall_nat_edit.php:870
+#: usr/local/www/firewall_nat_out_edit.php:797
+#: usr/local/www/firewall_rules_edit.php:1715
+msgid "Rule Information"
+msgstr "Kural Bilgisi"
+
+# 87%
+#: usr/local/www/firewall_nat_edit.php:874
+#: usr/local/www/firewall_nat_out_edit.php:803
+#: usr/local/www/firewall_rules_edit.php:1719
+msgid "Created"
+msgstr "Oluşturuldu"
+
+#: usr/local/www/firewall_nat_edit.php:876
+#: usr/local/www/firewall_nat_edit.php:884
+#: usr/local/www/firewall_nat_out_edit.php:805
+#: usr/local/www/firewall_nat_out_edit.php:816
+#: usr/local/www/firewall_rules_edit.php:1721
+#: usr/local/www/firewall_rules_edit.php:1729 usr/local/www/license.php:49
+msgid "by"
+msgstr "(c)"
+
+# 85%
+#: usr/local/www/firewall_nat_edit.php:882
+#: usr/local/www/firewall_nat_out_edit.php:814
+#: usr/local/www/firewall_rules_edit.php:1727
+msgid "Updated"
+msgstr "Güncellendi"
+
+#: usr/local/www/firewall_nat_npt.php:108
+msgid "External Prefix"
+msgstr "Dış Ön-ek"
+
+#: usr/local/www/firewall_nat_npt.php:109
+msgid "Internal prefix"
+msgstr "İç Ön-ek"
+
+#: usr/local/www/firewall_nat_npt.php:161 usr/local/www/services_dhcp.php:1285
+#: usr/local/www/services_dhcpv6.php:891
+msgid "Do you really want to delete this mapping?"
+msgstr "Bu adreslemeyi silmek istediğinize emin misiniz?"
+
+#: usr/local/www/firewall_nat_npt_edit.php:110
+msgid "Source prefix"
+msgstr "Kaynak Ön-ek"
+
+#: usr/local/www/firewall_nat_npt_edit.php:112
+msgid "Destination prefix"
+msgstr "Hedef Ön-ek"
+
+#: usr/local/www/firewall_nat_npt_edit.php:162
+msgid "Edit NAT NPt entry"
+msgstr "NAT NPT girdisini düzenle"
+
+#: usr/local/www/firewall_nat_npt_edit.php:213
+msgid "Internal IPv6 Prefix"
+msgstr "İç IPv6 Ön-ek"
+
+#: usr/local/www/firewall_nat_npt_edit.php:235
+msgid ""
+"Enter the internal (LAN) ULA IPv6 Prefix for the Network Prefix translation. "
+"The prefix size specified for the internal IPv6 prefix will be applied to "
+"the \n"
+"external prefix."
+msgstr ""
+"İç (LAN) ULA IPv6 Ön-ek i Ağ ön-ek çevirisi için girin. Ön-ek boyutu iç IPv6 "
+"ön-eki belirtin, belirtilen değer dış Ön-ek \n"
+"için de geçerli olacak."
+
+#: usr/local/www/firewall_nat_npt_edit.php:241
+msgid "Destination IPv6 Prefix"
+msgstr "Hedef IPv6 Ön-ek"
+
+#: usr/local/www/firewall_nat_npt_edit.php:265
+msgid "Enter the Global Unicast routable IPv6 prefix here"
+msgstr "Global yönetilebilir tekli IPv6 ön-ek' i buraya girin"
+
+#: usr/local/www/firewall_nat_out.php:101
+#, php-format
+msgid " - %1$s to %2$s"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:104
+msgid "Manual Outbound NAT Switch"
+msgstr "Elle dışarı NAT Değiştir"
+
+#: usr/local/www/firewall_nat_out.php:123
+msgid "Default rules for each interface have been created."
+msgstr "Her arabirim için öntanımlı kurallar oluşturuldu."
+
+#: usr/local/www/firewall_nat_out.php:245
+msgid "Mode:"
+msgstr "Kip:"
+
+#: usr/local/www/firewall_nat_out.php:251
+msgid "Automatic outbound NAT rule generation"
+msgstr "Otomatik dışarı NAT kuralı oluşturma"
+
+#: usr/local/www/firewall_nat_out.php:252
+msgid "(IPsec passthrough included)"
+msgstr "(IPsec geçiş dahil)"
+
+#: usr/local/www/firewall_nat_out.php:260
+msgid "Hybrid Outbound NAT rule generation"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:261
+msgid "(Automatic Outbound NAT + rules below)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:279
+msgid "Manual Outbound NAT rule generation"
+msgstr "Elle dışarı NAT kuralı oluşturma"
+
+#: usr/local/www/firewall_nat_out.php:280
+msgid "(AON - Advanced Outbound NAT)"
+msgstr "(AON - Gelişmiş Dışarı NAT)"
+
+#: usr/local/www/firewall_nat_out.php:288
+msgid "Disable Outbound NAT rule generation"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:289
+msgid "(No Outbound NAT rules)"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:300
+msgid "Mappings:"
+msgstr "Eşlemeler:"
+
+#: usr/local/www/firewall_nat_out.php:310
+#: usr/local/www/firewall_nat_out.php:547
+msgid "NAT Address"
+msgstr "NAT Adresi"
+
+#: usr/local/www/firewall_nat_out.php:311
+#: usr/local/www/firewall_nat_out.php:548
+msgid "NAT Port"
+msgstr "NAT Portu"
+
+#: usr/local/www/firewall_nat_out.php:312
+#: usr/local/www/firewall_nat_out.php:549
+msgid "Static Port"
+msgstr "Sabit Port"
+
+#: usr/local/www/firewall_nat_out.php:365
+msgid "This rule is being ignored"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:448
+#: usr/local/www/firewall_nat_out.php:620
+msgid "YES"
+msgstr "EVET"
+
+#: usr/local/www/firewall_nat_out.php:450
+#: usr/local/www/firewall_nat_out.php:622
+msgid "NO"
+msgstr "HAYIR"
+
+#: usr/local/www/firewall_nat_out.php:463
+msgid "edit mapping"
+msgstr "eşlemeyi düzenle"
+
+#: usr/local/www/firewall_nat_out.php:537
+msgid "Automatic rules:"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:559
+msgid "automatic outbound nat"
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:638
+msgid ""
+"If automatic outbound NAT selected, a mapping is automatically created for "
+"each interface's subnet (except WAN-type connections) and the rules on "
+"\"Mappings\" section of this page are ignored.<br /><br /> If manual "
+"outbound NAT is selected, outbound NAT rules will not be automatically "
+"generated and only the mappings you specify on this page will be used. <br /"
+"><br /> If hybrid outbound NAT is selected, mappings you specify on this "
+"page will be used, followed by the automatically generated ones. <br /><br /"
+">If disable outbound NAT is selected, no rules will be used. <br /><br />If "
+"a target address other than an interface's IP address is used, then "
+"depending on the way the WAN connection is setup, a "
+msgstr ""
+
+#: usr/local/www/firewall_nat_out.php:650
+msgid " may also be required."
+msgstr " de gerekebilir."
+
+#: usr/local/www/firewall_nat_out_edit.php:146
+msgid "Source bit count"
+msgstr "Kaynak bit sayısı"
+
+#: usr/local/www/firewall_nat_out_edit.php:146
+#: usr/local/www/firewall_rules_edit.php:395
+msgid "Destination bit count"
+msgstr "Hedef bit sayısı"
+
+#: usr/local/www/firewall_nat_out_edit.php:166
+msgid ""
+"You must supply either a valid port or port alias for the source port entry."
+msgstr ""
+"Kaynak port girişi için geçerli bir port veya port grubu adı girmelisiniz."
+
+#: usr/local/www/firewall_nat_out_edit.php:169
+msgid ""
+"You must supply either a valid port or port alias for the destination port "
+"entry."
+msgstr ""
+"Hedef Port girişi için geçerli bir port yada port grubu adı belirtiniz."
+
+#: usr/local/www/firewall_nat_out_edit.php:172
+msgid "You must supply a valid port for the NAT port entry."
+msgstr ""
+
+#: usr/local/www/firewall_nat_out_edit.php:176
+msgid "A valid source must be specified."
+msgstr "Geçerli bir kaynak belirtilmelidir."
+
+#: usr/local/www/firewall_nat_out_edit.php:184
+msgid "A valid destination must be specified."
+msgstr "Geçerli bir hedef belirtilmelidir."
+
+#: usr/local/www/firewall_nat_out_edit.php:192
+msgid "Negating destination address of \"any\" is invalid."
+msgstr "Hedef adres \\\"Herhangi bir\\\"in tersi alınamaz."
+
+#: usr/local/www/firewall_nat_out_edit.php:197
+msgid "A valid target IP address must be specified."
+msgstr "Geçerli bir hedef IP adresi belirtilmelidir."
+
+#: usr/local/www/firewall_nat_out_edit.php:202
+msgid "A valid target IP must be specified when using the 'Other Subnet' type."
+msgstr "'Diğer Altağ' seçildiğinde geçerli bir hedef IP belirtilmelidir."
+
+#: usr/local/www/firewall_nat_out_edit.php:205
+msgid ""
+"A valid target bit count must be specified when using the 'Other Subnet' "
+"type."
+msgstr ""
+"'Diğer Altağ' seçildiğinde geçerli bir hedef bit sayısı belirtilmelidir."
+
+#: usr/local/www/firewall_nat_out_edit.php:218
+msgid "Only Round Robin pool options may be chosen when selecting an alias."
+msgstr ""
+"Bir grup seçilirken sadece Dairesel Denetim havuz seçenekleri kullanılabilir."
+
+#: usr/local/www/firewall_nat_out_edit.php:446
+msgid "Edit Advanced Outbound NAT entry"
+msgstr "Detaylı Dışarı NAT girdisini düzenle"
+
+#: usr/local/www/firewall_nat_out_edit.php:461
+msgid "Do not NAT"
+msgstr "NAT yapma"
+
+#: usr/local/www/firewall_nat_out_edit.php:464
+msgid ""
+"Enabling this option will disable NAT for traffic matching this rule and "
+"stop processing Outbound NAT rules."
+msgstr ""
+"Bu seçeneği etkinleştirerek bu kurala uyan trafikte NATı devre dışı "
+"bırakabilir ve Dışarı NAT kurallarının çalışmasını durdurabilirsiniz."
+
+#: usr/local/www/firewall_nat_out_edit.php:465
+msgid "Hint: in most cases, you won't use this option."
+msgstr "İpucu: Çoğu durumda bu seçenek kullanılmaz."
+
+#: usr/local/www/firewall_nat_out_edit.php:525
+msgid "Choose which protocol this rule should match."
+msgstr "Bu kuralın uyacağı protokolü seçiniz."
+
+#: usr/local/www/firewall_nat_out_edit.php:527
+#, php-format
+msgid "Hint: in most cases, you should specify %s any %s here."
+msgstr "İpucu: Çoğu durumda burada %s tümü %s seçmelisiniz."
+
+#: usr/local/www/firewall_nat_out_edit.php:564
+msgid "Enter the source network for the outbound NAT mapping."
+msgstr "Dışarı NAT eşleme için kaynak ağı girin."
+
+#: usr/local/www/firewall_nat_out_edit.php:568
+msgid "Source port:"
+msgstr "Kaynak port:"
+
+# 95%
+#: usr/local/www/firewall_nat_out_edit.php:571
+#: usr/local/www/firewall_nat_out_edit.php:623
+msgid "(leave blank for any)"
+msgstr "(Tümü için boş bırakınız)"
+
+#: usr/local/www/firewall_nat_out_edit.php:616
+msgid "Enter the destination network for the outbound NAT mapping."
+msgstr "Dışarı NAT için hedef ağ giriniz."
+
+#: usr/local/www/firewall_nat_out_edit.php:620
+msgid "Destination port:"
+msgstr "Hedef port:"
+
+#: usr/local/www/firewall_nat_out_edit.php:630
+msgid "Translation"
+msgstr "Çeviri"
+
+#: usr/local/www/firewall_nat_out_edit.php:638
+msgid "Interface address"
+msgstr "Arabirim adresi"
+
+#: usr/local/www/firewall_nat_out_edit.php:684
+msgid "Other Subnet (Enter Below)"
+msgstr "Diğer Altağ (Aşağıya Giriniz)"
+
+#: usr/local/www/firewall_nat_out_edit.php:691
+msgid "Other Subnet:"
+msgstr "Diğer Altağ:"
+
+#: usr/local/www/firewall_nat_out_edit.php:709
+msgid "Packets matching this rule will be mapped to the IP address given here."
+msgstr "Bu kurala uyan paketler burada belirtilen IP adresine eşlenecektir."
+
+#: usr/local/www/firewall_nat_out_edit.php:710
+msgid ""
+"If you want this rule to apply to another IP address rather than the IP "
+"address of the interface chosen above, select it here (you will need to "
+"define "
+msgstr ""
+"Eğer bu kuralın yukarıda seçilen arabirim dışında bir IP adresine "
+"uygulanmasını istiyorsanız, burada seçiniz (önce "
+
+#: usr/local/www/firewall_nat_out_edit.php:713
+msgid "addresses on the interface first)."
+msgstr "arabirime adresler tanımlamalısınız)."
+
+#: usr/local/www/firewall_nat_out_edit.php:745
+msgid ""
+"Only Round Robin types work with Host Aliases. Any type can be used with a "
+"Subnet."
+msgstr ""
+"Altağlarda herhangi bir tür kullanılabilir. İstemci gruplarında ise sadece "
+"Dairesel Denetim türleri çalışır."
+
+#: usr/local/www/firewall_nat_out_edit.php:746
+msgid "Round Robin: Loops through the translation addresses."
+msgstr "Dairesel Denetim: Çeviri adreslerinde döner."
+
+#: usr/local/www/firewall_nat_out_edit.php:747
+msgid "Random: Selects an address from the translation address pool at random."
+msgstr "Rasgele: Çeviri adres havuzundan rasgele bir adres seçer."
+
+#: usr/local/www/firewall_nat_out_edit.php:748
+msgid ""
+"Source Hash: Uses a hash of the source address to determine the translation "
+"address, ensuring that the redirection address is always the same for a "
+"given source."
+msgstr ""
+"Kaynak Değeri: Çeviri adresini belirlemek için kaynak adresten hesaplanan "
+"bir değer kullanılır. Böylece her bir kaynak için yönlendirileceği adres "
+"sabitlenmiş olur."
+
+#: usr/local/www/firewall_nat_out_edit.php:749
+msgid ""
+"Bitmask: Applies the subnet mask and keeps the last portion identical; "
+"10.0.1.50 -&gt; x.x.x.50."
+msgstr ""
+"Bit maskesi: Son bölümü aynen bırakarak altağ maskesini uygular; 10.0.1.50 -"
+"&gt; x.x.x.50."
+
+#: usr/local/www/firewall_nat_out_edit.php:750
+msgid ""
+"Sticky Address: The Sticky Address option can be used with the Random and "
+"Round Robin pool types to ensure that a particular source address is always "
+"mapped to the same translation address."
+msgstr ""
+"Kalıcı Adres: Kalıcı Adres seçeneği Rasgele ve Dairesel Denetim havuz "
+"türleriyle belirli bir kaynak adresin her zaman aynı çeviri adresine "
+"eşlenmesi için kullanılabilir."
+
+#: usr/local/www/firewall_nat_out_edit.php:755
+msgid "Port:"
+msgstr "Port:"
+
+#: usr/local/www/firewall_nat_out_edit.php:763
+msgid "Enter the source port for the outbound NAT mapping."
+msgstr "Dışarı NAT eşleme için kaynak port giriniz."
+
+#: usr/local/www/firewall_nat_out_edit.php:767
+msgid "Static-port:"
+msgstr "Statik-port:"
+
+#: usr/local/www/firewall_rules.php:109
+msgid "Drag and drop firewall rules ordering update."
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:184
+#, php-format
+msgid ""
+"The settings have been applied. The firewall rules are now reloading in the "
+"background.<br />You can also %s monitor %s the reload progress"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:292 usr/local/www/firewall_rules.php:294
+msgid ""
+"The firewall rule configuration has been changed.<br />You must apply the "
+"changes in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:292 usr/local/www/guiconfig.inc:307
+#: usr/local/www/headjs.php:148
+msgid "Apply changes"
+msgstr "Apply changes"
+
+#: usr/local/www/firewall_rules.php:315
+msgid "Floating"
+msgstr "Değişen"
+
+#: usr/local/www/firewall_rules.php:344
+#: usr/local/www/firewall_rules_edit.php:1519 usr/local/www/interfaces.php:511
+#: usr/local/www/interfaces.php:564 usr/local/www/services_dhcp.php:944
+#: usr/local/www/services_dhcp_edit.php:455
+#: usr/local/www/status_gateways.php:75 usr/local/www/system_gateways.php:219
+#: usr/local/www/system_gateways_edit.php:696
+#: usr/local/www/system_routes.php:235 usr/local/www/system_routes_edit.php:87
+#: usr/local/www/system_routes_edit.php:244
+msgid "Gateway"
+msgstr "Ağ geçidi"
+
+#: usr/local/www/firewall_rules.php:346
+#: usr/local/www/firewall_rules_edit.php:1492
+msgid "Schedule"
+msgstr "Zamanlama"
+
+#: usr/local/www/firewall_rules.php:371 usr/local/www/firewall_rules.php:774
+#: usr/local/www/firewall_rules.php:808
+msgid "add new rule"
+msgstr "yeni kural ekle"
+
+#: usr/local/www/firewall_rules.php:398
+msgid "Anti-Lockout Rule"
+msgstr "Kilitlenmeme Kuralı"
+
+#: usr/local/www/firewall_rules.php:420
+msgid "RFC 1918 networks"
+msgstr "RFC 1918 ağları"
+
+#: usr/local/www/firewall_rules.php:427 usr/local/www/interfaces.php:3348
+msgid "Block private networks"
+msgstr "Özel networkleri engelle"
+
+#: usr/local/www/firewall_rules.php:448
+msgid "Reserved/not assigned by IANA"
+msgstr "Ayrılmış/IANA tarafından atanmamış"
+
+#: usr/local/www/firewall_rules.php:455 usr/local/www/interfaces.php:3360
+msgid "Block bogon networks"
+msgstr "Sahte ağları engelle"
+
+#: usr/local/www/firewall_rules.php:480
+msgid "advanced settings set"
+msgstr "detaylı ayar kümesi"
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:858
+msgid "Mon"
+msgstr "Pts"
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+msgid "Tues"
+msgstr "Sal"
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:860
+msgid "Wed"
+msgstr "Çar"
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+msgid "Thur"
+msgstr "Per"
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:862
+msgid "Fri"
+msgstr "Cum"
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:863
+msgid "Sat"
+msgstr "Cts"
+
+#: usr/local/www/firewall_rules.php:544 usr/local/www/firewall_schedule.php:44
+#: usr/local/www/firewall_schedule_edit.php:66
+#: usr/local/www/firewall_schedule_edit.php:864
+msgid "Sun"
+msgstr "Paz"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "January"
+msgstr "Ocak"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "February"
+msgstr "Şubat"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "March"
+msgstr "Mart"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "April"
+msgstr "Nisan"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "May"
+msgstr "Mayıs"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "June"
+msgstr "Haziran"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "July"
+msgstr "Temmuz"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "August"
+msgstr "Ağustos"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "September"
+msgstr "Eylül"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "October"
+msgstr "Ekim"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "November"
+msgstr "Kasım"
+
+#: usr/local/www/firewall_rules.php:545 usr/local/www/firewall_schedule.php:45
+#: usr/local/www/firewall_schedule_edit.php:67
+msgid "December"
+msgstr "Aralık"
+
+#: usr/local/www/firewall_rules.php:654
+msgid "Traffic matching this rule is currently being denied"
+msgstr "Bu kurala uyan trafik engellenmektedir"
+
+#: usr/local/www/firewall_rules.php:657
+msgid "Traffic matching this rule is currently being allowed"
+msgstr "Bu kurala uyan trafik izinlidir"
+
+#: usr/local/www/firewall_rules.php:665
+msgid "This rule is not currently active because its period has expired"
+msgstr "Süresi geçtiği için bu kural artık etkin değil"
+
+#: usr/local/www/firewall_rules.php:769
+msgid "No floating rules are currently defined."
+msgstr "Geçerli olarak tanımlanmış değişen kurallar yok."
+
+#: usr/local/www/firewall_rules.php:771
+msgid "No rules are currently defined for this interface"
+msgstr "Bu arabirim için herhangi bir kural tanımlanmadı"
+
+#: usr/local/www/firewall_rules.php:772
+msgid ""
+"All incoming connections on this interface will be blocked until you add "
+"pass rules."
+msgstr ""
+"Bu arabirimden gelen tüm bağlantılar siz izin kuralı ekleyene kadar "
+"engellenecektir."
+
+#: usr/local/www/firewall_rules.php:774
+msgid "Click the"
+msgstr "Yeni kural"
+
+#: usr/local/www/firewall_rules.php:774
+msgid " button to add a new rule."
+msgstr " eklemek için tıklayınız."
+
+#: usr/local/www/firewall_rules.php:820
+msgid "match"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:823
+msgid "block"
+msgstr "engelle"
+
+#: usr/local/www/firewall_rules.php:826
+msgid "reject"
+msgstr "reddet"
+
+#: usr/local/www/firewall_rules.php:829
+msgid "log"
+msgstr "günlüğe kaydet"
+
+#: usr/local/www/firewall_rules.php:833
+msgid "pass (disabled)"
+msgstr "izin ver (devre dışı)"
+
+#: usr/local/www/firewall_rules.php:836
+msgid "match (disabled)"
+msgstr ""
+
+#: usr/local/www/firewall_rules.php:839
+msgid "block (disabled)"
+msgstr "engelle (devre dışı)"
+
+#: usr/local/www/firewall_rules.php:842
+msgid "reject (disabled)"
+msgstr "reddet (devre dışı)"
+
+#: usr/local/www/firewall_rules.php:845
+msgid "log (disabled)"
+msgstr "günlüğe kaydet (devre dışı)"
+
+#: usr/local/www/firewall_rules.php:851
+#: usr/local/www/load_balancer_pool.php:148 usr/local/www/vpn_l2tp.php:359
+#: usr/local/www/vpn_l2tp.php:376
+msgid "Hint:"
+msgstr "İpucu:"
+
+#: usr/local/www/firewall_rules.php:855
+msgid ""
+"Rules are evaluated on a first-match basis (i.e. the action of the first "
+"rule to match a packet will be executed). This means that if you use block "
+"rules, you'll have to pay attention to the rule order. Everything that isn't "
+"explicitly passed is blocked by default. "
+msgstr ""
+"Kurallar ilk uyan sırasına göre işlemektedir (pakete ilk uyan kuralın eylemi "
+"gerçekleştirilir). Yani eğer 'engelle' kuralları kullanıyorsanız kural "
+"sıralamasına dikkat etmelisiniz. Özellikle 'izin ver'mediğiniz kurallar "
+"öntanımlı olarak engellenecektir."
+
+#: usr/local/www/firewall_rules.php:862
+msgid ""
+"Floating rules are evaluated on a first-match basis (i.e. the action of the "
+"first rule to match a packet will be executed) only if the 'quick' option is "
+"checked on a rule. Otherwise they will only apply if no other rules match. "
+"Pay close attention to the rule order and options chosen. If no rule here "
+"matches, the per-interface or default rules are used. "
+msgstr ""
+"Eğer bir kuralda 'hızlı' seçeneği etkinleştirilmişse, değişen kurallar \\"
+"\"ilk uyan\\\" mantığıyla değerlendirilir (yani pakete uyan ilk kuralın "
+"eylemi işletilir). Aksi taktirde diğer kurallar uymazsa işletilirler. "
+"Seçimlerinize ve kural sırasına dikkat etmelisiniz. Eğer buradaki kuralların "
+"hiçbiri eşleşmezse, arabirim başına veya öntanımlı kurallar işler."
+
+#: usr/local/www/firewall_rules_edit.php:278
+#: usr/local/www/firewall_rules_edit.php:292
+msgid "You can not assign a gateway to a rule that applies to IPv4 and IPv6"
+msgstr "IPv4 ve IPv6 uygulanacak kural için ağ geçidi atayamazsınız"
+
+#: usr/local/www/firewall_rules_edit.php:281
+msgid "You can not assign an IPv4 gateway group on IPv6 Address Family rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:284
+msgid "You can not assign an IPv6 gateway group on IPv4 Address Family rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:295
+msgid "You can not assign an IPv4 Gateway to an IPv6 Filter rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:298
+msgid "You can not assign an IPv6 Gateway to an IPv4 Filter rule"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:304
+msgid ""
+"You can not assign a protocol other than ICMP, TCP, UDP or TCP/UDP to a rule "
+"that applies to IPv4 and IPv6"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:308
+msgid "You can not assign a ICMP type to a rule that applies to IPv4 and IPv6"
+msgstr "IPv4 ve IPv6 için uygulanacak ICMP türü kurallarını atayamazsınız"
+
+#: usr/local/www/firewall_rules_edit.php:382
+#, php-format
+msgid "%s is only valid with protocol TCP."
+msgstr "%s sadece TCP protokolü ile çalışır."
+
+#: usr/local/www/firewall_rules_edit.php:384
+#, php-format
+msgid "%s is only valid if the gateway is set to 'default'."
+msgstr "%s sadece varsayılan ağ geçidi ile çalışır."
+
+#: usr/local/www/firewall_rules_edit.php:412
+#, php-format
+msgid ""
+"%s is not a valid end source port. It must be a port alias or integer "
+"between 1 and 65535."
+msgstr ""
+"%s geçerli bir bitiş kaynak portu değil. Port grubu ya da 1 ile 65535 arası "
+"bir tamsayı olmalıdır."
+
+#: usr/local/www/firewall_rules_edit.php:471
+#, php-format
+msgid ""
+"The Source IP address %s Address Family differs from the destination %s."
+msgstr "Kaynak IP adresi %s Hedef Adres Ailesi %s den farklıdır."
+
+#: usr/local/www/firewall_rules_edit.php:473
+msgid "You can not use IPv6 addresses in IPv4 rules."
+msgstr "IPv6 adreslerini IPv4 kuralları ile kullanamazsınız."
+
+#: usr/local/www/firewall_rules_edit.php:475
+msgid "You can not use IPv4 addresses in IPv6 rules."
+msgstr "IPv4 adreslerini IPv6 kuralları ile kullanamazsınız."
+
+#: usr/local/www/firewall_rules_edit.php:479
+msgid "You can not use a IPv4 or IPv6 address in combined IPv4 + IPv6 rules."
+msgstr ""
+"IPv4 yada IPv6 adresleri içinde birleşik IPv4 IPv6 kurallarını "
+"kullanamazsınız."
+
+#: usr/local/www/firewall_rules_edit.php:495
+msgid "OS detection is only valid with protocol TCP."
+msgstr "İşletim sistemi tespiti sadece TCP protokolünde çalışır."
+
+#: usr/local/www/firewall_rules_edit.php:497
+msgid "Invalid OS detection selection. Please select a valid OS."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:502
+msgid "You have to select a queue when you select an acknowledge queue too."
+msgstr "Alındılama kuyruğu seçtiğinizde bir kuyruk da seçmeniz gerekir."
+
+#: usr/local/www/firewall_rules_edit.php:504
+msgid "Acknowledge queue and Queue cannot be the same."
+msgstr "Alındılama kuyruğu ve kuyruk aynı olamaz."
+
+#: usr/local/www/firewall_rules_edit.php:507
+msgid ""
+"You can not use limiters in Floating rules without choosing a direction."
+msgstr "Değişen kurallarda yön seçmeksizin limitleyici kulllanamazsınız."
+
+#: usr/local/www/firewall_rules_edit.php:509
+msgid ""
+"You can not use gateways in Floating rules without choosing a direction."
+msgstr "Değişen kurallarda yön seçmeksizin ağ geçidi kullanamazsınız."
+
+#: usr/local/www/firewall_rules_edit.php:512
+msgid ""
+"You must select a queue for the In direction before selecting one for Out "
+"too."
+msgstr ""
+"Dış yönü için bir kuyruk seçmeden önce İç yönü için bir kuyruk seçmelisiniz."
+
+#: usr/local/www/firewall_rules_edit.php:514
+msgid "In and Out Queue cannot be the same."
+msgstr "Giriş ve Çıkış kuyrukları aynı olmaz."
+
+#: usr/local/www/firewall_rules_edit.php:516
+#: usr/local/www/firewall_rules_edit.php:518
+msgid ""
+"You cannot select one queue and one virtual interface for IN and Out. Both "
+"must be from the same type."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:520
+msgid ""
+"Please select a gateway, normally the interface selected gateway, so the "
+"limiters work correctly"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:523
+msgid "ID must be an integer"
+msgstr "Kimlik değeri tamsayı olmalıdır"
+
+#: usr/local/www/firewall_rules_edit.php:526
+msgid "You can only select a layer7 container for TCP and/or UDP protocols"
+msgstr "Sadece TCP ve UDP protokolleri için layer7 barındırıcı seçilebilir"
+
+#: usr/local/www/firewall_rules_edit.php:528
+msgid "You can only select a layer7 container for Pass type rules."
+msgstr "Sadece İzin türü kurallar için layer7 barındırıcı seçilebilir."
+
+#: usr/local/www/firewall_rules_edit.php:533
+msgid ""
+"You can only specify the maximum number of established connections per host "
+"(advanced option) for TCP protocol."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:535
+msgid ""
+"You can only specify the maximum new connections per host / per second(s) "
+"(advanced option) for TCP protocol."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:537
+msgid ""
+"You can only specify the state timeout (advanced option) for TCP protocol."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:542
+msgid ""
+"You can only specify the maximum state entries (advanced option) for Pass "
+"type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:544
+msgid ""
+"You can only specify the maximum number of unique source hosts (advanced "
+"option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:546
+msgid ""
+"You can only specify the maximum number of established connections per host "
+"(advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:548
+msgid ""
+"You can only specify the maximum state entries per host (advanced option) "
+"for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:550
+msgid ""
+"You can only specify the maximum new connections per host / per second(s) "
+"(advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:552
+msgid ""
+"You can only specify the state timeout (advanced option) for Pass type rules."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:557
+msgid ""
+"You cannot specify the maximum state entries (advanced option) if statetype "
+"is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:559
+msgid ""
+"You cannot specify the maximum number of unique source hosts (advanced "
+"option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:561
+msgid ""
+"You cannot specify the maximum number of established connections per host "
+"(advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:563
+msgid ""
+"You cannot specify the maximum state entries per host (advanced option) if "
+"statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:565
+msgid ""
+"You cannot specify the maximum new connections per host / per second(s) "
+"(advanced option) if statetype is none and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:567
+msgid ""
+"You cannot specify the state timeout (advanced option) if statetype is none "
+"and no L7 container is selected."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:571
+msgid "Maximum state entries (advanced option) must be a positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:574
+msgid ""
+"Maximum number of unique source hosts (advanced option) must be a positive "
+"integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:577
+msgid ""
+"Maximum number of established connections per host (advanced option) must be "
+"a positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:580
+msgid ""
+"Maximum state entries per host (advanced option) must be a positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:583
+msgid ""
+"Maximum new connections per host / per second(s) (advanced option) must be a "
+"positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:586
+msgid "State timeout (advanced option) must be a positive integer"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:590
+msgid ""
+"Both maximum new connections per host and the interval (per second(s)) must "
+"be specified"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:602
+msgid ""
+"If you specify TCP flags that should be set you should specify out of which "
+"flags as well."
+msgstr ""
+"İşaretlenecek TCP bayrakları belirtirseniz hangilerinden olduğunu da "
+"belirtmelisiniz."
+
+#: usr/local/www/firewall_rules_edit.php:829
+msgid "Edit Firewall rule"
+msgstr "Güvenlik duvarı kuralını düzenle"
+
+#: usr/local/www/firewall_rules_edit.php:850
+msgid "Choose what to do with packets that match the criteria specified below."
+msgstr "Aşağıda belirtilen kritere uyan paketlere ne yapılacağını seçin."
+
+#: usr/local/www/firewall_rules_edit.php:851
+msgid ""
+"Hint: the difference between block and reject is that with reject, a packet "
+"(TCP RST or ICMP port unreachable for UDP) is returned to the sender, "
+"whereas with block the packet is dropped silently. In either case, the "
+"original packet is discarded."
+msgstr ""
+"İpucu: Engelle ile reddet arasındaki fark şudur; reddedilen paket (TCP "
+"sıfırlama veya UDP ICM port erişilemez) sahibine geri gönderilir, engellenen "
+"paket ise sessizce silinir. İki durumda da asıl paket 'çöpe gider'."
+
+#: usr/local/www/firewall_rules_edit.php:866
+msgid "Quick"
+msgstr "Hızlı"
+
+#: usr/local/www/firewall_rules_edit.php:870
+msgid "Apply the action immediately on match."
+msgstr "Eşleşen olduğunda eylemi hemen gerçekleştir."
+
+#: usr/local/www/firewall_rules_edit.php:871
+msgid ""
+"Set this option if you need to apply this action to traffic that matches "
+"this rule immediately."
+msgstr ""
+"Bu kurala uyan trafiğin hemen uygulanması için bu seçeneği işaretleyin."
+
+#: usr/local/www/firewall_rules_edit.php:878
+msgid "Associated filter rule"
+msgstr "İlişkilendirilmiş filtreleme kuralı"
+
+#: usr/local/www/firewall_rules_edit.php:880
+msgid "This is associated to a NAT rule."
+msgstr "Bu bir NAT kuralına ilişkilendirilmiş."
+
+#: usr/local/www/firewall_rules_edit.php:881
+msgid ""
+"You cannot edit the interface, protocol, source, or destination of "
+"associated filter rules."
+msgstr ""
+"İlişkilendirilmiş filtreleme kurallarının arabirim, protokol, kaynak ya da "
+"hedefini değiştiremezsiniz."
+
+#: usr/local/www/firewall_rules_edit.php:888
+msgid "View the NAT rule"
+msgstr "NAT kuralını görüntüle"
+
+#: usr/local/www/firewall_rules_edit.php:948
+msgid "Choose on which interface packets must come in to match this rule."
+msgstr "Bu kurala uyacak paketlerin hangi arabirimden geleceğinini seçiniz."
+
+#: usr/local/www/firewall_rules_edit.php:972
+msgid "TCP/IP Version"
+msgstr "TCP/IP Versiyonu"
+
+#: usr/local/www/firewall_rules_edit.php:984
+msgid "Select the Internet Protocol version this rule applies to"
+msgstr "Kuralların uygulanacağı İnternet Protokol versiyonunu seçin"
+
+#: usr/local/www/firewall_rules_edit.php:998
+msgid "Hint: in most cases, you should specify "
+msgstr "İpucu: Çoğu durumda şunu belirtmelisiniz "
+
+#: usr/local/www/firewall_rules_edit.php:1002
+msgid "ICMP type"
+msgstr "ICMP türü"
+
+#: usr/local/www/firewall_rules_edit.php:1014
+#: usr/local/www/firewall_rules_edit.php:1030
+msgid ""
+"If you selected ICMP for the protocol above, you may specify an ICMP type "
+"here."
+msgstr ""
+"Eğer yukarıdan ICMP protokolünü seçtiyseniz burada ICMP türü "
+"belirtebilirsiniz."
+
+#: usr/local/www/firewall_rules_edit.php:1018
+msgid "ICMPv6 type"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1096
+msgid "Show source port range"
+msgstr "Kaynak port aralığını göster"
+
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid "Specify the source port or port range for this rule."
+msgstr "Bu kural için kaynak port ya da port aralığı belirtiniz."
+
+#: usr/local/www/firewall_rules_edit.php:1133
+msgid ""
+"and almost never equal to the destination port range (and should usually be"
+msgstr ""
+"ve neredeyse hiçbir zaman hedef port aralığıyla aynı değildir (ve genellikle"
+
+#: usr/local/www/firewall_rules_edit.php:1133
+#: usr/local/www/firewall_rules_edit.php:1235
+msgid "'to'"
+msgstr "'hedef'"
+
+#: usr/local/www/firewall_rules_edit.php:1201
+msgid "Destination port range "
+msgstr "Hedef port aralığı "
+
+#: usr/local/www/firewall_rules_edit.php:1233
+msgid ""
+"Specify the port or port range for the destination of the packet for this "
+"rule."
+msgstr "Bu kural için hedef port yada port aralığı belirtin."
+
+#: usr/local/www/firewall_rules_edit.php:1235
+msgid "field empty if you only want to filter a single port"
+msgstr "tek portun filtrelenmesi için alanı boş bırakınız"
+
+#: usr/local/www/firewall_rules_edit.php:1240
+msgid "Log"
+msgstr "Günlük"
+
+#: usr/local/www/firewall_rules_edit.php:1243
+msgid "Log packets that are handled by this rule"
+msgstr "Bu kural tarafından işlenen paketleri günlükle"
+
+#: usr/local/www/firewall_rules_edit.php:1245
+msgid ""
+"Hint: the firewall has limited local log space. Don't turn on logging for "
+"everything. If you want to do a lot of logging, consider using a remote "
+"syslog server"
+msgstr ""
+"İpucu: Güvenlik duvarının yerel günlük alanı kısıtlıdır. Herşeyi günlüğe "
+"kaydetmeyin. Eğer çok sayıda günlükleme faaliyeti olacaksa bir uzak syslog "
+"sunucu kullanmayı düşünebilirsiniz"
+
+#: usr/local/www/firewall_rules_edit.php:1245
+msgid "see the"
+msgstr "bakın"
+
+#: usr/local/www/firewall_rules_edit.php:1245
+msgid "Diagnostics: System logs: Settings"
+msgstr "Araçlar: Sistem kayıtları: Ayarlar"
+
+#: usr/local/www/firewall_rules_edit.php:1245
+#: usr/local/www/services_captiveportal.php:1060
+#: usr/local/www/system_advanced_firewall.php:345
+msgid "page"
+msgstr "sayfa"
+
+#: usr/local/www/firewall_rules_edit.php:1253
+#: usr/local/www/services_unbound_acls.php:300
+msgid "You may enter a description here for your reference."
+msgstr "Bu alana kendiniz için herhangi bir açıklama girebilirsiniz."
+
+#: usr/local/www/firewall_rules_edit.php:1274 usr/local/www/pkg_edit.php:446
+msgid "Advanced features"
+msgstr "Gelişmiş özellikler"
+
+#: usr/local/www/firewall_rules_edit.php:1277
+msgid "Source OS"
+msgstr "Kaynak İşletim Sistemi"
+
+#: usr/local/www/firewall_rules_edit.php:1280
+#: usr/local/www/firewall_rules_edit.php:1302
+#: usr/local/www/firewall_rules_edit.php:1318
+#: usr/local/www/firewall_rules_edit.php:1358
+#: usr/local/www/firewall_rules_edit.php:1398
+#: usr/local/www/firewall_rules_edit.php:1428
+#: usr/local/www/firewall_rules_edit.php:1440
+#: usr/local/www/firewall_rules_edit.php:1495
+#: usr/local/www/firewall_rules_edit.php:1522
+#: usr/local/www/firewall_rules_edit.php:1571
+#: usr/local/www/firewall_rules_edit.php:1621
+#: usr/local/www/firewall_rules_edit.php:1676
+#: usr/local/www/interfaces.php:1743 usr/local/www/pkg_edit.php:1129
+#: usr/local/www/services_dnsmasq.php:307
+#: usr/local/www/services_unbound.php:371
+msgid "Show advanced option"
+msgstr "Gelişmiş seçeneği göster"
+
+#: usr/local/www/firewall_rules_edit.php:1283
+msgid "OS Type:"
+msgstr "İşletim Sistemi Türü:"
+
+#: usr/local/www/firewall_rules_edit.php:1294
+msgid ""
+"Note: this only works for TCP rules. General OS choice matches all subtypes."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1299
+msgid "Diffserv Code Point"
+msgstr "Fark sunucusu kod noktası"
+
+#: usr/local/www/firewall_rules_edit.php:1315
+#: usr/local/www/interfaces_ppps_edit.php:688
+#: usr/local/www/vpn_ipsec_phase1.php:862
+#: usr/local/www/vpn_ipsec_phase2.php:817
+msgid "Advanced Options"
+msgstr "Gelişmiş Seçenekler"
+
+#: usr/local/www/firewall_rules_edit.php:1322
+msgid ""
+"This allows packets with IP options to pass. Otherwise they are blocked by "
+"default. This is usually only seen with multicast traffic."
+msgstr ""
+"Bu ayar IP özellikli paketlerin geçmesine izin verir. Aksi taktirde "
+"öntanımlı olarak engellenirler. seçenek izin verilecek IP seçeneklerini "
+"belirler. Bu durum genellikle sadece çok noktaya yayın yapan trafikte "
+"görülür."
+
+#: usr/local/www/firewall_rules_edit.php:1325
+msgid "This will disable auto generated reply-to for this rule."
+msgstr ""
+"Bu seçenek bu kural için otomatik oluşturulacak olan cevap kuralını devre "
+"dışı bırakır."
+
+#: usr/local/www/firewall_rules_edit.php:1328
+msgid ""
+"You can mark a packet matching this rule and use this mark to match on other "
+"NAT/filter rules. It is called"
+msgstr ""
+"Bu kurala uyan paketleri işaretleyebilirsiniz. O işareti de diğer NAT/filtre "
+"kurallarında kullanabilirsiniz. Buna"
+
+#: usr/local/www/firewall_rules_edit.php:1328
+msgid "Policy filtering"
+msgstr "İlke filtreleme denir"
+
+#: usr/local/www/firewall_rules_edit.php:1331
+msgid "You can match packet on a mark placed before on another rule."
+msgstr "Daha önce başka bir kuralda işaretlenen paketle eşleştirebilirsiniz."
+
+#: usr/local/www/firewall_rules_edit.php:1333
+msgid " Maximum state entries this rule can create"
+msgstr " Bu kuralın oluşturabileceği maksimum durum girdisi"
+
+#: usr/local/www/firewall_rules_edit.php:1334
+msgid " Maximum number of unique source hosts"
+msgstr " Maksimum benzersiz kaynak host sayısı"
+
+#: usr/local/www/firewall_rules_edit.php:1335
+msgid " Maximum number of established connections per host (TCP only)"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1336
+msgid " Maximum state entries per host"
+msgstr " Host başına maksimum durum girdisi"
+
+#: usr/local/www/firewall_rules_edit.php:1345
+msgid "Maximum new connections per host / per second(s) (TCP only)"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1348
+msgid "State Timeout in seconds (TCP only)"
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1350
+msgid "Note: Leave fields blank to disable that feature."
+msgstr "Not: Bu özelliği kapatmak için alanları boş bırakınız."
+
+#: usr/local/www/firewall_rules_edit.php:1355
+msgid "TCP flags"
+msgstr "TCP bayrakları"
+
+#: usr/local/www/firewall_rules_edit.php:1387
+msgid "Any flags."
+msgstr "Tüm bayraklar."
+
+#: usr/local/www/firewall_rules_edit.php:1389
+msgid ""
+"Use this to choose TCP flags that must be set or cleared for this rule to "
+"match."
+msgstr ""
+"Bu kuralın eşleşmesi için 1 ya da 0 yapılacak TCP bayraklarını belirlemek "
+"için kullanabilirsiniz."
+
+#: usr/local/www/firewall_rules_edit.php:1395
+msgid "State Type"
+msgstr "Durum Türü"
+
+#: usr/local/www/firewall_rules_edit.php:1404
+msgid ""
+"Hint: This prevents states created by this rule to be sync'ed over pfsync."
+msgstr ""
+
+#: usr/local/www/firewall_rules_edit.php:1407
+#: usr/local/www/firewall_rules_edit.php:1416
+msgid "keep state"
+msgstr "durumu koru"
+
+#: usr/local/www/firewall_rules_edit.php:1408
+#: usr/local/www/firewall_rules_edit.php:1417
+msgid "sloppy state"
+msgstr "yarım durum"
+
+#: usr/local/www/firewall_rules_edit.php:1409
+#: usr/local/www/firewall_rules_edit.php:1418
+msgid "synproxy state"
+msgstr "synproxy durumu"
+
+#: usr/local/www/firewall_rules_edit.php:1413
+msgid ""
+"Hint: Select which type of state tracking mechanism you would like to use. "
+"If in doubt, use keep state."
+msgstr ""
+"İpucu: Ne tür durum takip mekanizması kullanmak istediğinizi seçin. Emin "
+"değilseniz 'durumu koru'yu kullanın."
+
+#: usr/local/www/firewall_rules_edit.php:1416
+#: usr/local/www/firewall_rules_edit.php:1417
+msgid "Works with all IP protocols."
+msgstr "Tüm IP protokolleri ile çalışır."
+
+#: usr/local/www/firewall_rules_edit.php:1418
+msgid ""
+"Proxies incoming TCP connections to help protect servers from spoofed TCP "
+"SYN floods. This option includes the functionality of keep state and "
+"modulate state combined."
+msgstr ""
+"Gelen TCP bağlantılarına vekillik yaparak sunucuları TCP SYN yükleme "
+"saldırılarından korur. Bu seçenek durumu koru ve durumu ayarla "
+"fonksiyonelliğini birlikte sağlar."
+
+#: usr/local/www/firewall_rules_edit.php:1419
+msgid ""
+"Do not use state mechanisms to keep track. This is only useful if you're "
+"doing advanced queueing in certain situations. Please check the "
+"documentation."
+msgstr ""
+"İzleme amaçlı olarak durum mekanizmalarını kullanma. Bu sadece belirli "
+"durumlarda, gelişmiş kuyruklama yapıyorsanız kullanışlıdır. Lütfen "
+"belgeleri kontrol edin."
+
+#: usr/local/www/firewall_rules_edit.php:1437
+msgid "802.1p"
+msgstr "802.1p"
+
+#: usr/local/www/firewall_rules_edit.php:1472
+msgid "Choose 802.1p priority to match on"
+msgstr "802.1p eşleşen önceliği seçin"
+
+#: usr/local/www/firewall_rules_edit.php:1476
+msgid "Choose 802.1p priority to apply"
+msgstr "802.1p uygulanacak önceliği seçin"
+
+#: usr/local/www/firewall_rules_edit.php:1514
+msgid "Leave as 'none' to leave the rule enabled all the time."
+msgstr "Kuralın her zaman etkin olması için 'hiçbiri' olarak bırakın."
+
+#: usr/local/www/firewall_rules_edit.php:1526
+#: usr/local/www/services_captiveportal.php:896
+#: usr/local/www/services_captiveportal.php:926
+#: usr/local/www/services_ntpd_gps.php:464
+#: usr/local/www/services_ntpd_gps.php:470
+#: usr/local/www/services_ntpd_gps.php:476
+#: usr/local/www/services_ntpd_gps.php:552
+#: usr/local/www/services_ntpd_pps.php:162
+#: usr/local/www/services_ntpd_pps.php:168
+#: usr/local/www/services_ntpd_pps.php:212
+msgid "default"
+msgstr "varsayılan"
+
+#: usr/local/www/firewall_rules_edit.php:1563
+msgid ""
+"Leave as 'default' to use the system routing table. Or choose a gateway to "
+"utilize policy based routing."
+msgstr ""
+"Sistem yönlendirme tablolarını kullanmak için 'varsayılan'da bırakınız. Ya "
+"da ilke tabanlı yönlendirme yapmak için bir ağ geçidi seçin."
+
+#: usr/local/www/firewall_rules_edit.php:1568
+msgid "In/Out"
+msgstr "İçeri/Dışarı"
+
+#: usr/local/www/firewall_rules_edit.php:1612
+msgid ""
+"Choose the Out queue/Virtual interface only if you have also selected In."
+msgstr ""
+"Sadece 'İçeri'yi de seçtiyseniz 'Dışarı' kuyruğunu veya sanal arabirimi "
+"seçin."
+
+#: usr/local/www/firewall_rules_edit.php:1612
+msgid ""
+"The Out selection is applied to traffic leaving the interface where the rule "
+"is created, In is applied to traffic coming into the chosen interface."
+msgstr ""
+"'Dışarı' seçimi kuralın oluşturulduğu arabirimden ayrılan trafiğe, 'İçeri' "
+"seçimi ise arabirime gelen trafiğe uygulanır."
+
+#: usr/local/www/firewall_rules_edit.php:1612
+msgid ""
+"If you are creating a floating rule, if the direction is In then the same "
+"rules apply, if the direction is out the selections are reverted Out is for "
+"incoming and In is for outgoing."
+msgstr ""
+"Değişen türde bir kural oluşturuyorsanız, yön 'İçeri' ise kural aynen "
+"geçerlidir ama yön 'Dışarı' ise yaptığınız seçimler tersine çevrilir "
+"'Dışarı' gelen, 'İçeri' giden paketler için olur."
+
+#: usr/local/www/firewall_rules_edit.php:1618
+msgid "Ackqueue/Queue"
+msgstr "Alındılama kuyruğu/Kuyruk"
+
+#: usr/local/www/firewall_rules_edit.php:1668
+msgid "Choose the Acknowledge Queue only if you have selected Queue."
+msgstr "Sadece Kuyruk seçtiyseniz Alındılama Kuyruğu'nu seçin."
+
+#: usr/local/www/firewall_rules_edit.php:1673
+#: usr/local/www/firewall_shaper.php:415
+#: usr/local/www/firewall_shaper_layer7.php:60
+#: usr/local/www/firewall_shaper_layer7.php:411
+#: usr/local/www/firewall_shaper_queues.php:198
+#: usr/local/www/firewall_shaper_vinterface.php:395
+#: usr/local/www/firewall_shaper_wizards.php:106
+msgid "Layer7"
+msgstr "Layer7"
+
+#: usr/local/www/firewall_rules_edit.php:1696
+msgid ""
+"Choose a Layer7 container to apply application protocol inspection rules. "
+"These are valid for TCP and UDP protocols only."
+msgstr ""
+"Uygulama protokolü inceleme kurallarını uygulamak için Layer7 barındırıcı "
+"seçiniz. Bu seçenekler sadece TCP ve UDP protokolleri için geçerlidir."
+
+#: usr/local/www/firewall_schedule.php:78
+#, php-format
+msgid "Cannot delete Schedule. Currently in use by %s"
+msgstr "Zamanlama %s tarafından kullanıldığından silinemez"
+
+#: usr/local/www/firewall_schedule.php:98
+msgid "Time Range(s)"
+msgstr "Zaman Aralık(lar)ı"
+
+#: usr/local/www/firewall_schedule.php:104
+#: usr/local/www/firewall_schedule.php:234
+msgid "add a new schedule"
+msgstr "yeni zamanlama ekle"
+
+#: usr/local/www/firewall_schedule.php:116
+msgid "Schedule is currently active"
+msgstr "Zamanlama etkin durumda"
+
+#: usr/local/www/firewall_schedule.php:221
+msgid "edit alias"
+msgstr "grubu düzenle"
+
+#: usr/local/www/firewall_schedule.php:222
+msgid "Do you really want to delete this schedule?"
+msgstr "Bu zamanlamayı silmek istediğinize emin misiniz?"
+
+#: usr/local/www/firewall_schedule.php:222
+msgid "delete alias"
+msgstr "grubu sil"
+
+#: usr/local/www/firewall_schedule.php:241
+msgid ""
+"Schedules act as placeholders for time ranges to be used in Firewall Rules."
+msgstr ""
+"Zamanlamalar güvenlik duvarı kurallarında bir veya daha fazla zaman "
+"aralığına taşıyıcı görevi görür."
+
+#: usr/local/www/firewall_schedule_edit.php:90
+msgid "Schedule may not be named LAN."
+msgstr "Zamanlama ismi LAN olamaz."
+
+#: usr/local/www/firewall_schedule_edit.php:92
+msgid "Schedule may not be named WAN."
+msgstr "Zamanlama ismi WAN olamaz."
+
+#: usr/local/www/firewall_schedule_edit.php:94
+msgid "Schedule name cannot be blank."
+msgstr "Zamanlama adı alanı boş bırakılamaz."
+
+#: usr/local/www/firewall_schedule_edit.php:98
+msgid "Reserved word used for schedule name."
+msgstr "Zamanlama adı olarak ayrılmış bir isim kullanılamaz."
+
+#: usr/local/www/firewall_schedule_edit.php:101
+msgid "The schedule name may only consist of the characters a-z, A-Z, 0-9"
+msgstr ""
+"Zamanlama adı sadece a-z, A-Z, 0-9 karakterlerinden oluşmalıdır ve Türkçe "
+"karakter kullanılmamalıdır"
+
+#: usr/local/www/firewall_schedule_edit.php:110
+msgid "A Schedule with this name already exists."
+msgstr "Bu isimde bir zamanlama zaten var."
+
+#: usr/local/www/firewall_schedule_edit.php:123
+#, php-format
+msgid "Invalid start time - '%s'"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:127
+#, php-format
+msgid "Invalid stop time - '%s'"
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:175
+msgid "The schedule must have at least one time range configured."
+msgstr "Zamanlamada en az bir zaman aralığı tanımlanmış olmalıdır."
+
+#: usr/local/www/firewall_schedule_edit.php:782
+msgid "Schedule information"
+msgstr "Zamanlama bilgisi"
+
+#: usr/local/www/firewall_schedule_edit.php:788
+msgid "Schedule Name"
+msgstr "Zamanlama Adı"
+
+#: usr/local/www/firewall_schedule_edit.php:794
+msgid "NOTE: This schedule is in use so the name may not be modified!"
+msgstr ""
+"NOT: Bu zamanlama bir güvenlik duvarı tarafından kullanılıyor, o yüzden adı "
+"değiştirilemez!"
+
+#: usr/local/www/firewall_schedule_edit.php:799
+msgid ""
+"The name of the alias may only consist of the characters a-z, A-Z and 0-9"
+msgstr ""
+"Grup adı a-z,A-Z, ve 0-9 arası karakterler içerebilir, Türkçe karakter "
+"kullanılmamalıdır"
+
+#: usr/local/www/firewall_schedule_edit.php:816
+msgid "Month"
+msgstr "Ay"
+
+#: usr/local/www/firewall_schedule_edit.php:859
+msgid "Tue"
+msgstr "Sal"
+
+#: usr/local/www/firewall_schedule_edit.php:861
+msgid "Thu"
+msgstr "Per"
+
+#: usr/local/www/firewall_schedule_edit.php:918
+msgid ""
+"Click individual date to select that date only. Click the appropriate "
+"weekday Header to select all occurrences of that weekday."
+msgstr ""
+
+#: usr/local/www/firewall_schedule_edit.php:926
+#: usr/local/www/firewall_schedule_edit.php:1008
+msgid "Start Time"
+msgstr "Başlama Zamanı"
+
+#: usr/local/www/firewall_schedule_edit.php:926
+#: usr/local/www/firewall_schedule_edit.php:1009
+msgid "Stop Time"
+msgstr "Bitiş Zamanı"
+
+#: usr/local/www/firewall_schedule_edit.php:939
+#: usr/local/www/firewall_schedule_edit.php:964
+msgid "Hr"
+msgstr "Sa"
+
+#: usr/local/www/firewall_schedule_edit.php:946
+#: usr/local/www/firewall_schedule_edit.php:971
+msgid "Min"
+msgstr "Dak"
+
+#: usr/local/www/firewall_schedule_edit.php:975
+msgid ""
+"Select the time range for the day(s) selected on the Month(s) above. A full "
+"day is 0:00-23:59."
+msgstr ""
+"Seçili tarihler için saat-dakika aralığını seçin. Tam bir gün 0:00 ile 23:59 "
+"arasıdır."
+
+#: usr/local/www/firewall_schedule_edit.php:979
+msgid "Time Range Description"
+msgstr "Zaman Aralığı Açıklaması"
+
+#: usr/local/www/firewall_schedule_edit.php:989
+msgid "Add Time"
+msgstr "Zaman Ekle"
+
+#: usr/local/www/firewall_schedule_edit.php:990
+msgid "Clear Selection"
+msgstr "Seçimi Temizle"
+
+#: usr/local/www/firewall_schedule_edit.php:999
+msgid "Schedule repeat"
+msgstr "Zamanlama tekrarı"
+
+#: usr/local/www/firewall_schedule_edit.php:1002
+msgid "Configured Ranges"
+msgstr "Yapılandırılan Aralıklar"
+
+#: usr/local/www/firewall_schedule_edit.php:1007
+msgid "Day(s)"
+msgstr "Gün(ler)"
+
+#: usr/local/www/firewall_shaper.php:132
+#: usr/local/www/firewall_shaper_vinterface.php:146
+msgid "Unable to write config.xml (Access Denied?)"
+msgstr "Config.xml dosyasına yazılamadı (Erişim Reddedildi?)"
+
+#: usr/local/www/firewall_shaper.php:161
+#: usr/local/www/firewall_shaper_vinterface.php:160
+msgid "Could not create new queue/discipline!"
+msgstr "Yeni kuyruk/disiplin oluşturulamadı!"
+
+#: usr/local/www/firewall_shaper.php:177 usr/local/www/firewall_shaper.php:186
+#: usr/local/www/firewall_shaper.php:195
+#: usr/local/www/firewall_shaper_vinterface.php:173
+#: usr/local/www/firewall_shaper_vinterface.php:183
+#: usr/local/www/firewall_shaper_vinterface.php:193
+msgid "Queue not found!"
+msgstr "Kuyruk bulunamadı!"
+
+#: usr/local/www/firewall_shaper.php:272
+#: usr/local/www/firewall_shaper_vinterface.php:247
+msgid "Could not add new queue."
+msgstr "Yeni kuyruk eklenemedi."
+
+#: usr/local/www/firewall_shaper.php:348
+#: usr/local/www/firewall_shaper_vinterface.php:316
+msgid "Queue Actions"
+msgstr "Kuyruk Eylemleri"
+
+#: usr/local/www/firewall_shaper.php:359
+#: usr/local/www/firewall_shaper_vinterface.php:327
+msgid "Add new queue"
+msgstr "Yeni kuyruk ekle"
+
+#: usr/local/www/firewall_shaper.php:370
+#: usr/local/www/firewall_shaper_vinterface.php:338
+msgid "Delete this queue"
+msgstr "Bu kuyruğu sil"
+
+#: usr/local/www/firewall_shaper.php:372
+msgid "Disable shaper on interface"
+msgstr "Arabirimdeki şekillendiriciyi kapat"
+
+#: usr/local/www/firewall_shaper.php:406
+#: usr/local/www/firewall_shaper_vinterface.php:386
+#: usr/local/www/firewall_shaper_wizards.php:97
+msgid "The traffic shaper configuration has been changed."
+msgstr "Trafik şekillendirici yapılandırması değiştirildi."
+
+#: usr/local/www/firewall_shaper.php:412
+#: usr/local/www/firewall_shaper_layer7.php:408
+#: usr/local/www/firewall_shaper_queues.php:195
+#: usr/local/www/firewall_shaper_vinterface.php:392
+#: usr/local/www/firewall_shaper_wizards.php:103
+msgid "By Interface"
+msgstr "Arabirime Göre"
+
+#: usr/local/www/firewall_shaper.php:413
+#: usr/local/www/firewall_shaper_layer7.php:409
+#: usr/local/www/firewall_shaper_queues.php:196
+#: usr/local/www/firewall_shaper_vinterface.php:393
+#: usr/local/www/firewall_shaper_wizards.php:104
+msgid "By Queue"
+msgstr "Kuyruğa Göre"
+
+#: usr/local/www/firewall_shaper.php:414
+#: usr/local/www/firewall_shaper_layer7.php:410
+#: usr/local/www/firewall_shaper_queues.php:197
+#: usr/local/www/firewall_shaper_vinterface.php:54
+#: usr/local/www/firewall_shaper_vinterface.php:394
+#: usr/local/www/firewall_shaper_wizards.php:105
+msgid "Limiter"
+msgstr "Limitleyici"
+
+#: usr/local/www/firewall_shaper.php:416
+#: usr/local/www/firewall_shaper_layer7.php:412
+#: usr/local/www/firewall_shaper_queues.php:199
+#: usr/local/www/firewall_shaper_vinterface.php:396
+#: usr/local/www/firewall_shaper_wizards.php:74
+#: usr/local/www/firewall_shaper_wizards.php:107
+#: usr/local/www/vpn_openvpn_client.php:448
+#: usr/local/www/vpn_openvpn_csc.php:319
+#: usr/local/www/vpn_openvpn_server.php:746
+msgid "Wizards"
+msgstr "Sihirbazlar"
+
+#: usr/local/www/firewall_shaper.php:427
+msgid "Remove Shaper"
+msgstr "Şekillendiriciyi Kaldır"
+
+#: usr/local/www/firewall_shaper_layer7.php:67
+msgid "You can add new layer7 protocol patterns by simply uploading the file"
+msgstr "Dosyayı yükleyerek yeni layer7 protokol örüntüleri ekleyebilirsiniz"
+
+#: usr/local/www/firewall_shaper_layer7.php:112
+msgid "Layer7 Rules Container not found!"
+msgstr "Layer7 Kural Barındırıcısı bulunamadı!"
+
+#: usr/local/www/firewall_shaper_layer7.php:162
+msgid "Found the following repeated protocol definitions"
+msgstr "Şu tekrarlanan protokol tanımları tespit edildi"
+
+#: usr/local/www/firewall_shaper_layer7.php:402
+#: usr/local/www/firewall_shaper_queues.php:189
+msgid "The traffic shaper configuration has been changed"
+msgstr "Trafik şekillendirme yapılandırması değiştirildi"
+
+#: usr/local/www/firewall_shaper_layer7.php:433
+msgid "Create new l7 rules group"
+msgstr "Yeni Layer7 kural grubu oluştur"
+
+#: usr/local/www/firewall_shaper_layer7.php:446
+msgid "Rule(s)"
+msgstr "Kural(lar)"
+
+#: usr/local/www/firewall_shaper_layer7.php:458
+msgid "Add one or more rules"
+msgstr "Bir yada daha fazla kural ekle"
+
+#: usr/local/www/firewall_shaper_layer7.php:474
+msgid "Structure"
+msgstr "Yapı"
+
+#: usr/local/www/firewall_shaper_layer7.php:481
+msgid "Behaviour"
+msgstr "Davranış"
+
+#: usr/local/www/firewall_shaper_queues.php:173
+msgid "Firewall: Shaper: By Queues View"
+msgstr "Güvenlik Duvarı: Şekillendirici: Kuyruk Görünümü"
+
+#: usr/local/www/firewall_shaper_vinterface.php:102
+msgid ""
+"This pipe/queue is referenced in filter rules, please remove references from "
+"there before deleting."
+msgstr ""
+
+#: usr/local/www/firewall_shaper_vinterface.php:114
+#, php-format
+msgid "No queue with name %s was found!"
+msgstr "%s adında kuyruk bulunamadı!"
+
+#: usr/local/www/firewall_shaper_vinterface.php:205
+#: usr/local/www/firewall_shaper_vinterface.php:230
+msgid "You cannot name a child queue with the same name as a parent limiter"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_vinterface.php:340
+msgid "Delete Limiter"
+msgstr ""
+
+#: usr/local/www/firewall_shaper_vinterface.php:415
+msgid "Create new limiter"
+msgstr "Yeni limitleyici ekle"
+
+#: usr/local/www/firewall_shaper_wizards.php:78
+msgid "Multiple Lan/Wan"
+msgstr "Çoklu LAN/WAN"
+
+#: usr/local/www/firewall_shaper_wizards.php:79
+msgid "Dedicated Links"
+msgstr "Adanmış Bağlantılar"
+
+#: usr/local/www/firewall_shaper_wizards.php:116
+msgid "Wizard function"
+msgstr "Sihirbaz fonksiyonu"
+
+#: usr/local/www/firewall_shaper_wizards.php:117
+msgid "Wizard Link"
+msgstr "Sihirbaz Bağlantısı"
+
+#: usr/local/www/firewall_virtual_ip.php:104
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"NAT mapping."
+msgstr "Bu girdi en az bir NAT eşleme kuralında kullanıldığı için silinemez."
+
+# 90%
+#: usr/local/www/firewall_virtual_ip.php:138
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"Gateway."
+msgstr ""
+"Bu girdi en az bir tane Ağ Geçidi tarafından kullanıldığı için silinemez."
+
+#: usr/local/www/firewall_virtual_ip.php:165
+msgid ""
+"This entry cannot be deleted because it is still referenced by a CARP IP "
+"with the description"
+msgstr ""
+"Bu girdi halen açıklama içeren CARP IP ile beraber kullanıldığı için "
+"silinemez"
+
+#: usr/local/www/firewall_virtual_ip.php:170
+msgid ""
+"This entry cannot be deleted because it is still referenced by an IP alias "
+"entry with the description"
+msgstr ""
+"Bu girdi halen açıklama içeren IP grubu ile beraber kullanıldığı için "
+"silinemez"
+
+#: usr/local/www/firewall_virtual_ip.php:203
+msgid "Virtual IP Addresses"
+msgstr "Sanal IP Adresleri"
+
+#: usr/local/www/firewall_virtual_ip.php:218
+msgid "The VIP configuration has been changed."
+msgstr "Sanal IP yapılandırılması değiştirildi."
+
+#: usr/local/www/firewall_virtual_ip.php:227
+msgid "CARP Settings"
+msgstr "CARP Ayarları"
+
+#: usr/local/www/firewall_virtual_ip.php:239
+msgid "Virtual IP address"
+msgstr "Sanal IP adresi"
+
+#: usr/local/www/firewall_virtual_ip.php:285
+#: usr/local/www/services_captiveportal_zones.php:117
+#: usr/local/www/services_dyndns.php:179 usr/local/www/services_wol.php:189
+#: usr/local/www/system_advanced_sysctl.php:210
+msgid "Do you really want to delete this entry?"
+msgstr "Bu girdiyi silmek istediğinize emin misiniz?"
+
+#: usr/local/www/firewall_virtual_ip.php:307
+msgid "The virtual IP addresses defined on this page may be used in"
+msgstr "Bu sayfada tanımlanan sanal IP adresleri haritalamada "
+
+#: usr/local/www/firewall_virtual_ip.php:307
+msgid "mappings."
+msgstr "kullanılabilir."
+
+#: usr/local/www/firewall_virtual_ip.php:308
+msgid "You can check the status of your CARP Virtual IPs and interfaces "
+msgstr "CARP sanal IP ve arabirimlerinizin durumunu takip edebilirsiniz "
+
+#: usr/local/www/firewall_virtual_ip_edit.php:119
+#: usr/local/www/services_dhcp_edit.php:180
+#: usr/local/www/services_dnsmasq_edit.php:103
+#: usr/local/www/services_unbound_host_edit.php:105
+msgid "A valid IP address must be specified."
+msgstr "Geçerli bir IP adresi belirtilmelidir."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:140
+msgid "This IP address is being used by another interface or VIP."
+msgstr "Bu IP adresi başka bir arabirim veya VIP tarafından kullanılıyor."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:149
+msgid ""
+"The interface chosen for the VIP has no IPv4 or IPv6 address configured so "
+"it cannot be used as a parent for the VIP."
+msgstr ""
+"Seçilen arabirim IPv4 yada IPv6 adresi VIP olarak yapılandırılmadı bu "
+"yüzden Üst (parent) olarak VIP kullanılamaz."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:163
+msgid "You cannot use the network address for this VIP"
+msgstr "Ağ adresini bu VIP de kullanamazsınız"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:165
+msgid "You cannot use the broadcast address for this VIP"
+msgstr "Yayın adresini bu VIP de kullanamazsınız"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:177
+#, php-format
+msgid ""
+"VHID %s is already in use on interface %s. Pick a unique number on this "
+"interface."
+msgstr ""
+"VHID %s arabirimde zaten kullanılıyor %s. Bu arabirim için benzersiz bir "
+"numara seçiniz."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:181
+msgid ""
+"You must specify a CARP password that is shared between the two VHID members."
+msgstr ""
+"İki VHID üyesi arasında paylaşılacak bir CARP parolası belirlemelisiniz."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:194
+#: usr/local/www/firewall_virtual_ip_edit.php:218
+msgid "For this type of vip localhost is not allowed."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:196
+#: usr/local/www/firewall_virtual_ip_edit.php:220
+msgid ""
+"A CARP parent interface can only be used with IP Alias type Virtual IPs."
+msgstr ""
+
+#: usr/local/www/firewall_virtual_ip_edit.php:212
+#, php-format
+msgid ""
+"Sorry, we could not locate an interface with a matching subnet for %s. "
+"Please add an IP alias in this subnet on this interface."
+msgstr ""
+"%s altağına uyan arabirim yok. Lütfen bu arabirime bu altağda bir IP rumuzu "
+"ekleyiniz."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:290
+msgid "Virtual IP Address"
+msgstr "Sanal IP Adresi"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:316
+#: usr/local/www/firewall_virtual_ip_edit.php:318
+msgid ""
+"This must be the network's subnet mask. It does not specify a CIDR range."
+msgstr "Ağın altağ maskesi olmalıdır. CIDR aralığı belirtmez."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:317
+msgid "This is a CIDR block of proxy ARP addresses."
+msgstr "Vekil ARP adreslerinin CIDR bloğudur."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:381
+msgid "Edit Virtual IP"
+msgstr "Sanal IP yi düzenle"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:387
+msgid "IP Alias"
+msgstr "IP Grubu"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:391
+msgid "Proxy ARP"
+msgstr "Vekil ARP"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:393
+msgid "Other"
+msgstr "Diğer"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:415
+msgid "IP Address(es)"
+msgstr "IP Adres(ler)i"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:422
+msgid "Single address"
+msgstr "Tek adres"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:442
+msgid "Expansion:"
+msgstr "Genişleme:"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:462
+msgid "Virtual IP Password"
+msgstr "Sanal IP Parolası"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:464
+msgid "Enter the VHID group password."
+msgstr "VHID grubunun parolasını giriniz."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:468
+msgid "VHID Group"
+msgstr "VHID Grubu"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:476
+msgid "Enter the VHID group that the machines will share"
+msgstr "Sistemlerin paylaşacağı VHID grubunu giriniz"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:480
+msgid "Advertising Frequency"
+msgstr "Duyuru Sıklığı"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:497
+msgid ""
+"The frequency that this machine will advertise. 0 means usually master. "
+"Otherwise the lowest combination of both values in the cluster determines "
+"the master."
+msgstr ""
+"Bu makinanın duyuru yapma sıklığı. 0 genellikle ana eleman demektir. Diğer "
+"durumlarda kümedeki iki değerin en düşük kombinasyonu ana elemanın hangisi "
+"olduğunu belirler."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:522
+msgid ""
+"Proxy ARP and Other type Virtual IPs cannot be bound to by anything running "
+"on the firewall, such as IPsec, OpenVPN, etc. Use a CARP or IP Alias type "
+"address for these cases."
+msgstr ""
+"Vekil ARP ve Diğer IP(ler) türündeki adresler OpenVPN, IPsec ve Güvenlik "
+"Duvarı gibi çalışan servisler ile bağlı olamaz. Bu gibi durumlar için bir "
+"CARP veya IP Grubu türünde adres kullanın."
+
+#: usr/local/www/firewall_virtual_ip_edit.php:523
+msgid "For more information on CARP and the above values, visit the OpenBSD "
+msgstr ""
+"CARP ve yukarıdaki değerler hakkında daha fazla bilgi için OpenBSD ziyaret "
+"edebilirsiniz"
+
+#: usr/local/www/firewall_virtual_ip_edit.php:523
+msgid "CARP FAQ"
+msgstr "CARP Sıkça Sorulan Sorular"
+
+#: usr/local/www/graph.php:117
+msgid "In"
+msgstr "İçeri"
+
+#: usr/local/www/graph.php:118
+msgid "Out"
+msgstr "Dışarı"
+
+#: usr/local/www/graph.php:122
+msgid "Switch to bytes/s"
+msgstr "bayt/saniye gösterimine geç"
+
+#: usr/local/www/graph.php:123
+msgid "AutoScale"
+msgstr "otomatik Ölçekleme"
+
+#: usr/local/www/graph.php:126
+msgid "Graph shows last"
+msgstr "Grafik son"
+
+#: usr/local/www/graph.php:126 usr/local/www/interfaces.php:2721
+#: usr/local/www/interfaces.php:2843
+#: usr/local/www/interfaces_bridge_edit.php:347
+#: usr/local/www/interfaces_bridge_edit.php:357
+#: usr/local/www/interfaces_bridge_edit.php:366
+#: usr/local/www/interfaces_bridge_edit.php:437
+#: usr/local/www/services_dhcp.php:968 usr/local/www/services_dhcp.php:978
+#: usr/local/www/services_dhcp_edit.php:479
+#: usr/local/www/services_dhcp_edit.php:489
+#: usr/local/www/services_dhcpv6.php:655 usr/local/www/services_dhcpv6.php:665
+#: usr/local/www/services_ntpd_gps.php:463
+#: usr/local/www/services_ntpd_gps.php:469
+#: usr/local/www/services_ntpd_pps.php:161
+#: usr/local/www/services_rfc2136_edit.php:162
+#: usr/local/www/vpn_ipsec_phase1.php:855
+#: usr/local/www/vpn_ipsec_phase1.php:900
+#: usr/local/www/vpn_ipsec_phase2.php:810
+msgid "seconds"
+msgstr "saniyeyi gösterir"
+
+#: usr/local/www/graph.php:129 usr/local/www/graph_cpu.php:85
+msgid "Collecting initial data, please wait"
+msgstr "Başlangıç verisi toplanıyor, lütfen bekleyiniz"
+
+#: usr/local/www/graph.php:141 usr/local/www/graph_cpu.php:97
+msgid "No URL for getURL"
+msgstr "getURL için URL yok"
+
+#: usr/local/www/graph.php:148 usr/local/www/graph_cpu.php:104
+msgid "No callback function for getURL"
+msgstr "getURL için çağrı fonksiyonu yok"
+
+#: usr/local/www/graph.php:164 usr/local/www/graph_cpu.php:120
+msgid "Both getURL and XMLHttpRequest are undefined"
+msgstr "Ne getURL ne de XMLHttpRequest tanımlanmış"
+
+#: usr/local/www/graph.php:201
+msgid "Switch to"
+msgstr "Geç"
+
+#: usr/local/www/graph.php:207
+msgid "follow"
+msgstr "takip"
+
+#: usr/local/www/graph.php:368
+msgid "Kbps"
+msgstr "Kbps"
+
+#: usr/local/www/graph.php:370
+msgid "Mbps"
+msgstr "Mbps"
+
+#: usr/local/www/graph.php:372
+msgid "Gbps"
+msgstr "Gbps"
+
+#: usr/local/www/graph.php:378
+msgid "KB/s"
+msgstr "KB/sn"
+
+#: usr/local/www/graph.php:380
+msgid "MB/s"
+msgstr "MB/sn"
+
+#: usr/local/www/graph.php:382
+msgid "GB/s"
+msgstr "GB/sn"
+
+#: usr/local/www/graph_cpu.php:84
+msgid "Cannot get CPU load"
+msgstr "CPU yükü alınamadı"
+
+#: usr/local/www/guiconfig.inc:257
+#, php-format
+msgid "The field %s contains invalid characters."
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:263
+#, php-format
+msgid "The field %s is required."
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:280
+msgid "The following input errors were detected:"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:314
+msgid "apply"
+msgstr "uygula"
+
+#: usr/local/www/guiconfig.inc:314
+msgid "save"
+msgstr "kaydet"
+
+#: usr/local/www/guiconfig.inc:314 usr/local/www/system_certmanager.php:667
+#: usr/local/www/vpn_ipsec_mobile.php:336
+msgid "create"
+msgstr "iç sertifika otoritesi oluştur"
+
+#: usr/local/www/guiconfig.inc:337 usr/local/www/guiconfig.inc:402
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:98
+#: usr/local/www/system_usermanager_settings_test.php:128
+msgid "Close"
+msgstr "Kapat"
+
+#: usr/local/www/guiconfig.inc:379
+msgid "Undo"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:448
+msgid "The changes have been applied successfully."
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:453
+msgid ""
+"You can also <a href=\"status_filter_reload.php\">monitor</a> the filter "
+"reload progress."
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:1013
+msgid "Currently viewing: "
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:1071
+msgid "move mouse out this alias to hide"
+msgstr "Bu grubu gizlemek için farenizi dışarı hareket ettirin"
+
+#: usr/local/www/guiconfig.inc:1111
+msgid "listing only first 10k items"
+msgstr ""
+
+#: usr/local/www/guiconfig.inc:1135
+msgid "edit this alias"
+msgstr "bu grubu düzenle"
+
+#: usr/local/www/guiconfig.inc:1146 usr/local/www/guiconfig.inc:1158
+msgid "loading..."
+msgstr "yükleniyor..."
+
+#: usr/local/www/halt.php:55
+msgid "Halt system"
+msgstr "Sistemi kapat"
+
+#: usr/local/www/halt.php:62
+msgid "The system is halting now. This may take one minute."
+msgstr "Sistem kapatılıyor. Bu işlem bir dakika sürebilir."
+
+#: usr/local/www/halt.php:68
+msgid "Are you sure you want to halt the system?"
+msgstr "Sistemi kapatmak istediğinize emin misiniz?"
+
+# XML loglarında hatalara neden oluyor. Bu nedenle ş, ı ve ğ harfleri düzenlendi.
+#: usr/local/www/index.php:128
+msgid "Widget configuration has been changed."
+msgstr "Kullanilabilir pencere yapilandirmasi degistirildi."
+
+#: usr/local/www/index.php:185
+#, php-format
+msgid "Welcome to %s!\n"
+msgstr "%s - Hoşgeldiniz!\n"
+
+#: usr/local/www/index.php:186
+msgid "One moment while we start the initial setup wizard."
+msgstr "Kurulum sihirbazı hazırlanırken lütfen bekleyiniz."
+
+#: usr/local/www/index.php:187
+msgid ""
+"Embedded platform users: Please be patient, the wizard takes a little longer "
+"to run than the normal GUI."
+msgstr ""
+"Gömülü platform kullanıcıları: Sihirbazın tamamlanması normal grafik arayüze "
+"göre biraz daha uzun sürer, lütfen sabırlı olunuz."
+
+#: usr/local/www/index.php:188
+#, php-format
+msgid "To bypass the wizard, click on the %s logo on the initial page."
+msgstr "Sihirbazı geçmek için giriş sayfasındaki %s logosuna tıklayınız."
+
+#: usr/local/www/index.php:467
+msgid "Status: Dashboard"
+msgstr "Durum: Anasayfa"
+
+#: usr/local/www/index.php:497
+msgid "Available Widgets"
+msgstr "Kullanılabilir Pencere Araçları"
+
+#: usr/local/www/index.php:534
+msgid "Welcome to the Dashboard page"
+msgstr "Anasayfa'ya hoş geldiniz"
+
+#: usr/local/www/index.php:541
+msgid ""
+"This page allows you to customize the information you want to be displayed!"
+msgstr "Bu sayfa görüntülemek istediğiniz bilginin özelleştirilmesini sağlar!"
+
+#: usr/local/www/index.php:542
+msgid "To get started click the"
+msgstr "Başlamak için"
+
+#: usr/local/www/index.php:542
+msgid "icon to add widgets."
+msgstr "pencere araçları ekle simgesine tıklayınız."
+
+#: usr/local/www/index.php:544
+msgid "You can move any widget around by clicking and dragging the title."
+msgstr ""
+"Pencere araçlarını başlıklarına tıklayıp sürükleyerek taşıyabilirsiniz."
+
+#: usr/local/www/index.php:551
+msgid "Click here to add widgets"
+msgstr "Pencere aracı eklemek için tıklayınız"
+
+#: usr/local/www/index.php:553
+msgid "Click here for help"
+msgstr "Yardım için tıklayınız"
+
+#: usr/local/www/index.php:557
+msgid "Save Settings"
+msgstr "Ayarları Kaydet"
+
+#: usr/local/www/index.php:730
+msgid "Loading selected widget"
+msgstr "Seçili pencere aracı yükleniyor"
+
+#: usr/local/www/installer/installer.php:187
+msgid "Could not open /tmp/installer.sh for writing"
+msgstr "Yazmak için /tmp/installer.sh açılamadı"
+
+#: usr/local/www/installer/installer.php:362
+#, php-format
+msgid "Beginning installation on disk %s."
+msgstr "Disk %s üzerine kurulum başlıyor."
+
+#: usr/local/www/installer/installer.php:408
+msgid "Installer"
+msgstr "Kurulum"
+
+#: usr/local/www/installer/installer.php:916
+#: usr/local/www/installer/installer.php:1104
+msgid "ERROR: Could not find any suitable disks for installation."
+msgstr "HATA: Kurulum için uygun disk bulunamadı."
+
+#: usr/local/www/interfaces.php:250
+#, php-format
+msgid "Sorry, an alias with the name %s already exists."
+msgstr "%s isimli bir grup sistemde zaten var."
+
+#: usr/local/www/interfaces.php:415
+msgid "You have already applied your settings!"
+msgstr "Ayarlar zaten uygulandı!"
+
+#: usr/local/www/interfaces.php:495
+msgid "An interface with the specified description already exists."
+msgstr "Belirtilen açıklamaya sahip arabirim zaten var."
+
+#: usr/local/www/interfaces.php:500
+msgid "The interface description cannot contain only numbers."
+msgstr ""
+
+#: usr/local/www/interfaces.php:504
+msgid ""
+"The DHCP Server is active on this interface and it can be used only with a "
+"static IP configuration. Please disable the DHCP Server service on this "
+"interface first, then change the interface configuration."
+msgstr ""
+"Bu arabirimde DHCP sunucu aktif durumda ve sadece statik IP yapılandırması "
+"kullanılabilir. Arabirim yapılandırmasını değiştirmeden önce DHCP sunucu "
+"servisini durdurmalısınız."
+
+#: usr/local/www/interfaces.php:506
+msgid ""
+"The DHCP6 Server is active on this interface and it can be used only with a "
+"static IPv6 configuration. Please disable the DHCPv6 Server service on this "
+"interface first, then change the interface configuration."
+msgstr ""
+"DHCP6 Sunucusu bu arabirimde aktif ve sadece statik IPv6 yapılandırması "
+"tarafından kullanılır. Bu arabirimde lütfen DHCPv6 Sunucu servisini önce "
+"durdurun, daha sonra arabirim yapılandırmasını değiştirin. "
+
+#: usr/local/www/interfaces.php:511 usr/local/www/interfaces.php:1777
+#: usr/local/www/status_interfaces.php:260
+msgid "IPv4 address"
+msgstr "IPv4 adresi"
+
+#: usr/local/www/interfaces.php:511 usr/local/www/interfaces.php:564
+msgid "Subnet bit count"
+msgstr "Altağ bit sayısı"
+
+#: usr/local/www/interfaces.php:518
+msgid ""
+"This interface is referenced by IPv4 VIPs. Please delete those before "
+"setting the interface to 'none' configuration."
+msgstr ""
+"Bu arabirim IPv4 VIP(lere) tarafından referans edildi. Lütfen arabirim "
+"'hiç' ('none') yapılandırmasını ayarlamadan önce bunları silin."
+
+#: usr/local/www/interfaces.php:523 usr/local/www/interfaces.php:576
+#: usr/local/www/interfaces.php:588 usr/local/www/interfaces.php:598
+#: usr/local/www/interfaces.php:603
+#, php-format
+msgid "You have to reassign the interface to be able to configure as %s."
+msgstr "%s yapılandırabilmek için arabirimi tekrar atamanız gerekli."
+
+#: usr/local/www/interfaces.php:527 usr/local/www/interfaces.php:2643
+msgid "Modem Port"
+msgstr "Modem Portu"
+
+#: usr/local/www/interfaces.php:527 usr/local/www/interfaces.php:2631
+#: usr/local/www/interfaces_ppps_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:536
+msgid "Phone Number"
+msgstr "Telefon Numarası"
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:536
+msgid "PPPoE username"
+msgstr "PPPoE kullanıcı adı"
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:536
+msgid "PPPoE password"
+msgstr "PPPoE parolası"
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:543
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:2711
+#: usr/local/www/interfaces.php:2833
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:210
+msgid "Dial on demand"
+msgstr "Gerektiğinde bağlan"
+
+#: usr/local/www/interfaces.php:533 usr/local/www/interfaces.php:543
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:210
+msgid "Idle timeout value"
+msgstr "Boşta kalma süresi"
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP username"
+msgstr "PPTP kullanıcı adı"
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP password"
+msgstr "PPTP parolası"
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP local IP address"
+msgstr "PPTP yerel IP adresi"
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP subnet"
+msgstr "PPTP altağ"
+
+#: usr/local/www/interfaces.php:543 usr/local/www/interfaces.php:546
+msgid "PPTP remote IP address"
+msgstr "PPTP uzak IP adresi"
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:556
+msgid "L2TP username"
+msgstr "L2TP kullanıcı adı"
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:556
+msgid "L2TP password"
+msgstr "L2TP parolası"
+
+#: usr/local/www/interfaces.php:553 usr/local/www/interfaces.php:556
+msgid "L2TP remote IP address"
+msgstr "PPTP uzak IP adresi"
+
+#: usr/local/www/interfaces.php:571
+msgid ""
+"This interface is referenced by IPv6 VIPs. Please delete those before "
+"setting the interface to 'none' configuration."
+msgstr ""
+"Bu arabirim IPv6 VIP(lere) tarafından referans edildi. Lütfen arabirim "
+"'hiç' ('none') yapılandırmasını ayarlamadan önce bunları silin."
+
+#: usr/local/www/interfaces.php:582
+msgid "You can only have one interface configured in 6rd with same prefix."
+msgstr "Yapılandırabileceğiniz arabirim sadece bir tane 6. ile aynı ön-ek'te."
+
+# 89%
+#: usr/local/www/interfaces.php:593
+#, php-format
+msgid "You can only have one interface configured as 6to4."
+msgstr "Yapılandırabileceğiniz arabirim sadece bir tane 6 dan 4'e."
+
+#: usr/local/www/interfaces.php:606
+msgid "You must enter a valid hexadecimal number for the IPv6 prefix ID."
+msgstr "IPv6 ön-eki kimliği için geçerli bir ondalık numara girmelisiniz."
+
+#: usr/local/www/interfaces.php:618
+#, php-format
+msgid "This track6 prefix ID is already being used in %s."
+msgstr ""
+
+#: usr/local/www/interfaces.php:631
+msgid "A valid IPv4 address must be specified."
+msgstr "Geçerli bir IPv4 adresi belirtilmelidir."
+
+#: usr/local/www/interfaces.php:634
+msgid "This IPv4 address is being used by another interface or VIP."
+msgstr "Bu IPv4 adresi başka bir arabirim veya VIP tarafından kullanılıyor."
+
+#: usr/local/www/interfaces.php:639
+msgid "This IPv4 address is the network address and cannot be used"
+msgstr ""
+
+#: usr/local/www/interfaces.php:641
+msgid "This IPv4 address is the broadcast address and cannot be used"
+msgstr ""
+
+#: usr/local/www/interfaces.php:647
+msgid "This IPv4 address conflicts with a Static Route."
+msgstr "Bu IPv4 adresi statik yönlendirme ile çakışmaya neden olmaktadır."
+
+#: usr/local/www/interfaces.php:656 usr/local/www/services_dhcpv6_edit.php:132
+msgid "A valid IPv6 address must be specified."
+msgstr "Geçerli bir IPv6 adresi belirtilmelidir."
+
+#: usr/local/www/interfaces.php:659
+msgid "This IPv6 address is being used by another interface or VIP."
+msgstr "Bu IPv6 adresi başka bir arabirim veya VIP tarafından kullanılıyor."
+
+#: usr/local/www/interfaces.php:664
+msgid "This IPv6 address conflicts with a Static Route."
+msgstr "Bu IPv6 adresi statik yönlendirme ile çakışmaya neden olmaktadır."
+
+#: usr/local/www/interfaces.php:672 usr/local/www/interfaces.php:674
+msgid "A valid subnet bit count must be specified."
+msgstr "Geçerli bir altağ bit sayısı belirtilmelidir."
+
+#: usr/local/www/interfaces.php:676
+msgid "A valid alias IP address must be specified."
+msgstr "Geçerli bir Grup IP adresi belirtilmelidir."
+
+#: usr/local/www/interfaces.php:678
+msgid "A valid alias subnet bit count must be specified."
+msgstr "Geçerli bir Grup altağ bit sayısı belirtilmelidir."
+
+#: usr/local/www/interfaces.php:680
+msgid "A valid alias IP address must be specified to reject DHCP Leases from."
+msgstr ""
+
+#: usr/local/www/interfaces.php:694 usr/local/www/system_routes_edit.php:99
+msgid "A valid gateway must be specified."
+msgstr "Geçerli bir ağ geçidi belirtilmelidir."
+
+#: usr/local/www/interfaces.php:698
+msgid "The service name contains invalid characters."
+msgstr "Servis adı geçersiz karakterler içeriyor."
+
+#: usr/local/www/interfaces.php:700 usr/local/www/interfaces.php:716
+#: usr/local/www/interfaces_ppps_edit.php:228
+msgid "The idle timeout value must be an integer."
+msgstr "Boşta kalma süresi bir tamsayı olmalıdır."
+
+#: usr/local/www/interfaces.php:703 usr/local/www/interfaces_ppps_edit.php:231
+msgid "A valid PPPoE reset hour must be specified (0-23)."
+msgstr "Geçerli bir PPPoE sıfırlama saati belirtilmelidir (0-23)."
+
+#: usr/local/www/interfaces.php:706 usr/local/www/interfaces_ppps_edit.php:234
+msgid "A valid PPPoE reset minute must be specified (0-59)."
+msgstr "Geçerli bir PPPoE sıfırlama dakikası belirtilmelidir (0-59)."
+
+#: usr/local/www/interfaces.php:708 usr/local/www/interfaces_ppps_edit.php:236
+msgid "A valid PPPoE reset date must be specified (mm/dd/yyyy)."
+msgstr "Geçerli bir PPPoE sıfırlama tarihi girilmelidir.(aa/gg/yyyy)."
+
+#: usr/local/www/interfaces.php:710
+msgid "A valid PPTP local IP address must be specified."
+msgstr "Geçerli bir PPTP yerel IP adresi belirtilmelidir."
+
+#: usr/local/www/interfaces.php:712
+msgid "A valid PPTP subnet bit count must be specified."
+msgstr "Geçerli bir PPTP altağ bit sayısı belirtilmelidir."
+
+#: usr/local/www/interfaces.php:714
+msgid "A valid PPTP remote IP address must be specified."
+msgstr "Geçerli bir PPTP uzak IP adresi belirtilmelidir."
+
+#: usr/local/www/interfaces.php:718 usr/local/www/services_dhcp_edit.php:183
+#: usr/local/www/services_wol.php:87 usr/local/www/services_wol_edit.php:94
+msgid "A valid MAC address must be specified."
+msgstr "Geçerli bir MAC adresi belirtilmelidir."
+
+#: usr/local/www/interfaces.php:731
+#, php-format
+msgid "The MTU must be between %d and %d bytes."
+msgstr ""
+
+#: usr/local/www/interfaces.php:742
+msgid "The MTU of a VLAN cannot be greater than that of its parent interface."
+msgstr ""
+
+#: usr/local/www/interfaces.php:757
+#, php-format
+msgid "Interface %s (VLAN) has MTU set to a larger value"
+msgstr ""
+
+#: usr/local/www/interfaces.php:763
+msgid "The MSS must be an integer between 576 and 65535 bytes."
+msgstr ""
+
+#: usr/local/www/interfaces.php:767 usr/local/www/interfaces.php:3075
+#: usr/local/www/interfaces_wireless.php:111
+#: usr/local/www/interfaces_wireless_edit.php:90
+#: usr/local/www/interfaces_wireless_edit.php:182
+#: usr/local/www/load_balancer_pool.php:132
+#: usr/local/www/load_balancer_pool_edit.php:81
+#: usr/local/www/load_balancer_pool_edit.php:207
+#: usr/local/www/load_balancer_virtual_server_edit.php:76
+#: usr/local/www/status_lb_pool.php:132 usr/local/www/vpn_ipsec.php:276
+#: usr/local/www/vpn_ipsec.php:444 usr/local/www/vpn_ipsec_phase2.php:563
+msgid "Mode"
+msgstr "Kip"
+
+#: usr/local/www/interfaces.php:770 usr/local/www/interfaces.php:3085
+#: usr/local/www/status_interfaces.php:363
+msgid "SSID"
+msgstr "SSID"
+
+#: usr/local/www/interfaces.php:805
+msgid ""
+"Invalid WEP key. Enter a valid 40, 64, 104 or 128 bit WEP key."
+msgstr ""
+"WEP anahtar boyutu geçersiz. Anahtar boyutu 40 (64) bit ya da 104 (128) bit "
+"olmalıdır."
+
+#: usr/local/www/interfaces.php:813
+msgid "The WPA passphrase must be between 8 and 63 characters long."
+msgstr "Şifre uzunluğu 8 ila 63 karakter arası olmalıdır."
+
+#: usr/local/www/interfaces.php:1383
+#, php-format
+msgid ""
+"Unable to change mode to %s. You may already have the maximum number of "
+"wireless clones supported in this mode."
+msgstr ""
+"Kip %s olarak değiştirilemedi. Bu kipte desteklenen maksimum kablosuz "
+"kopyasını kullanıyor olabilirsiniz."
+
+#: usr/local/www/interfaces.php:1411
+msgid "Static IPv4"
+msgstr "Sabit IPv4"
+
+#: usr/local/www/interfaces.php:1411 usr/local/www/status_interfaces.php:126
+#: usr/local/www/vpn_pppoe.php:88
+msgid "PPPoE"
+msgstr "PPPoE"
+
+#: usr/local/www/interfaces.php:1412
+msgid "Static IPv6"
+msgstr "Sabit IPv6"
+
+#: usr/local/www/interfaces.php:1412
+msgid "DHCP6"
+msgstr "DHCP6"
+
+#: usr/local/www/interfaces.php:1412
+msgid "SLAAC"
+msgstr "SLAAC"
+
+#: usr/local/www/interfaces.php:1412
+msgid "6rd Tunnel"
+msgstr "6'ıncı Tünel"
+
+#: usr/local/www/interfaces.php:1412
+msgid "6to4 Tunnel"
+msgstr "6 dan 4'e Tünel"
+
+#: usr/local/www/interfaces.php:1412
+msgid "Track Interface"
+msgstr "Arabirim İzi"
+
+#: usr/local/www/interfaces.php:1633
+#, php-format
+msgid "The %s configuration has been changed."
+msgstr "%s yapılandırması değiştirildi."
+
+#: usr/local/www/interfaces.php:1633
+msgid "Don't forget to adjust the DHCP Server range if needed after applying."
+msgstr "Gerekiyorsa DHCP sunucu aralığını yapılandırmayı unutmayınız."
+
+#: usr/local/www/interfaces.php:1642
+msgid "General configuration"
+msgstr "Genel yapılandırma"
+
+#: usr/local/www/interfaces.php:1648
+msgid "Enable Interface"
+msgstr "Arabirimi Etkinleştir"
+
+#: usr/local/www/interfaces.php:1658
+msgid "Enter a description (name) for the interface here."
+msgstr "Bu alana arabirim için bir açıklama (isim) girebilirsiniz."
+
+#: usr/local/www/interfaces.php:1662
+msgid "IPv4 Configuration Type"
+msgstr "IPv4 Yapılandırma Türü"
+
+#: usr/local/www/interfaces.php:1678
+msgid "IPv6 Configuration Type"
+msgstr "IPv6 Yapılandırma Türü"
+
+#: usr/local/www/interfaces.php:1703
+msgid "Insert my local MAC address"
+msgstr "Yerel MAC adresimi al"
+
+#: usr/local/www/interfaces.php:1706
+msgid ""
+"This field can be used to modify (\"spoof\") the MAC address of this "
+"interface"
+msgstr ""
+"Bu alan arabiriminin MAC adresini olduğundan farklı (\"aldatmak\") göstermek "
+"için yapılandırılabilir"
+
+#: usr/local/www/interfaces.php:1708
+msgid "(may be required with some cable connections)"
+msgstr "(bazı kablo bağlantılarda gerekebilir)"
+
+#: usr/local/www/interfaces.php:1709
+msgid ""
+"Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx or leave blank"
+msgstr "xx:xx:xx:xx:xx:xx biçiminde bir MAC adresi giriniz yada boş bırakınız"
+
+#: usr/local/www/interfaces.php:1714
+#: usr/local/www/interfaces_ppps_edit.php:769
+#: usr/local/www/status_interfaces.php:326
+msgid "MTU"
+msgstr "MTU"
+
+#: usr/local/www/interfaces.php:1719
+msgid ""
+"If you leave this field blank, the adapter's default MTU will be used. This "
+"is typically 1500 bytes but can vary in some circumstances."
+msgstr ""
+"Bu alanı boş bırakırsanız, ağ kartının varsayılan MTU değeri kullanılır. "
+"Varsayılan değer bir çok durumda bu 1500 bayttır."
+
+#: usr/local/www/interfaces.php:1725
+msgid "MSS"
+msgstr "MSS"
+
+#: usr/local/www/interfaces.php:1729
+msgid ""
+"If you enter a value in this field, then MSS clamping for TCP connections to "
+"the value entered above minus 40 (TCP/IP header size) will be in effect."
+msgstr ""
+"Bu alana bir değer girerseniz, TCP bağlantılarının MSS sıkma değeri "
+"girdiğiniz değerin 40 eksiği (TCP/IP başlık boyutu) olarak ayarlanır."
+
+#: usr/local/www/interfaces.php:1738
+msgid "Speed and duplex"
+msgstr "Hız ve çift yönlü"
+
+#: usr/local/www/interfaces.php:1759
+msgid ""
+"Here you can explicitly set speed and duplex mode for this interface. "
+"WARNING: You MUST leave this set to autoselect (automatically negotiate "
+"speed) unless the port this interface connects to has its speed and duplex "
+"forced."
+msgstr ""
+"Burada bu arabirimin hızını ve çift yön biçimini belirleyebilirsiniz. UYARI: "
+"Eğer bu arabirimin bağlandığı portun hızı ve çift yön kipi özel olarak "
+"ayarlanmadıysa otomatik (otomatik hız anlaşması) olarak bırakın."
+
+#: usr/local/www/interfaces.php:1774
+msgid "Static IPv4 configuration"
+msgstr "Sabit IPv4 yapılandırması"
+
+#: usr/local/www/interfaces.php:1795
+msgid "IPv4 Upstream Gateway"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1813 usr/local/www/interfaces.php:1919
+#: usr/local/www/system_routes_edit.php:257
+msgid "add a new one."
+msgstr "yeni bir tane ekleyin."
+
+#: usr/local/www/interfaces.php:1816 usr/local/www/interfaces.php:1922
+msgid ""
+"If this interface is an Internet connection, select an existing Gateway from "
+"the list or add a new one using the link above."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1817 usr/local/www/interfaces.php:1923
+msgid "On local LANs the upstream gateway should be \"none\"."
+msgstr ""
+
+#: usr/local/www/interfaces.php:1831 usr/local/www/system_routes_edit.php:270
+msgid "Add new gateway:"
+msgstr "Yeni ağ geçidi ekle:"
+
+#: usr/local/www/interfaces.php:1839
+msgid "Default gateway:"
+msgstr "Varsayılan ağ geçidi:"
+
+#: usr/local/www/interfaces.php:1842 usr/local/www/system_routes_edit.php:288
+msgid "Gateway Name:"
+msgstr "Ağ Geçidi Adı:"
+
+#: usr/local/www/interfaces.php:1845
+msgid "Gateway IPv4:"
+msgstr "Ağ Geçidi IPv4:"
+
+#: usr/local/www/interfaces.php:1848 usr/local/www/interfaces.php:1954
+#: usr/local/www/system_routes_edit.php:294
+msgid "Description:"
+msgstr "Açıklama:"
+
+#: usr/local/www/interfaces.php:1855 usr/local/www/interfaces.php:1961
+#: usr/local/www/system_routes_edit.php:301
+msgid "Save Gateway"
+msgstr "Ağ Geçidini Kaydet"
+
+#: usr/local/www/interfaces.php:1880
+msgid "Static IPv6 configuration"
+msgstr "Sabit IPv6 yapılandırması"
+
+#: usr/local/www/interfaces.php:1901
+msgid "IPv6 Upstream Gateway"
+msgstr ""
+
+#: usr/local/www/interfaces.php:1937
+msgid "Add new v6 gateway:"
+msgstr "Yeni v6 ağ geçidi ekle:"
+
+#: usr/local/www/interfaces.php:1945
+msgid "Default v6 gateway:"
+msgstr "Varsayılan v6 ağ geçidi:"
+
+#: usr/local/www/interfaces.php:1948
+msgid "Gateway Name IPv6:"
+msgstr "Ağ geçidi ismi IPv6:"
+
+#: usr/local/www/interfaces.php:1951
+msgid "Gateway IPv6:"
+msgstr "Ağ geçidi IPv6:"
+
+#: usr/local/www/interfaces.php:1985
+msgid ""
+"DHCP client configuration &nbsp; &nbsp; <input name="
+"\"adv_dhcp_config_advanced\" type=\"checkbox\" id=\"adv_dhcp_config_advanced"
+"\" value=\"\" onclick=\"show_adv_dhcp_config(this)\" /> Advanced &nbsp; "
+"&nbsp; <input name=\"adv_dhcp_config_file_override\" type=\"checkbox\" id="
+"\"adv_dhcp_config_file_override\" value=\"\" onclick="
+"\"show_adv_dhcp_config(this)\" /> Config File Override &nbsp; &nbsp; "
+msgstr ""
+
+#: usr/local/www/interfaces.php:1994
+msgid "Enable DHCP+"
+msgstr "Etkinleştir DHCP+"
+
+#: usr/local/www/interfaces.php:1997
+msgid "Enable DHCP+L2TP or DHCP+PPTP."
+msgstr "DHCP+L2TP veya DHCP+PPTP etkinleştir."
+
+#: usr/local/www/interfaces.php:1999
+msgid ""
+"Status changes on this interface will trigger reconfiguration (if necessary) "
+"of the associated PPTP/L2TP link."
+msgstr ""
+"Bu arabirimde durum değişiklikleri ilişkili PPTP/L2TP bağlantısının "
+"(gerekiyorsa) yeniden yapılandırılmasına neden olur."
+
+#: usr/local/www/interfaces.php:2008
+msgid ""
+"The value in this field is sent as the DHCP client identifier and hostname "
+"when requesting a DHCP lease. Some ISPs may require this (for client "
+"identification)."
+msgstr ""
+"Bu alandaki değer DHCP istemci tanımlayıcısı ve DHCP kirası istendiğinde "
+"makine adı olarak gönderilir. Bazı ISSler (Internet Servis Sağlayıcı) "
+"istemci tanıma amaçlı olarak bu alanın bir değer taşımasını gerektirebilir."
+
+#: usr/local/www/interfaces.php:2014
+msgid "Alias IPv4 address"
+msgstr "Grup IPv4 adresi"
+
+#: usr/local/www/interfaces.php:2028
+msgid ""
+"The value in this field is used as a fixed alias IPv4 address by the DHCP "
+"client."
+msgstr ""
+"Bu alandaki kısaltılmış Grup değeri, DHCP istemcinin IPv4 adresi olarak "
+"kullanılacak."
+
+#: usr/local/www/interfaces.php:2033
+msgid "Reject Leases From"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2037
+msgid ""
+"If there is a certain upstream DHCP server that should be ignored, place the "
+"IP address or subnet of the DHCP server to be ignored here."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2038
+msgid ""
+"This is useful for rejecting leases from cable modems that offer private IPs "
+"when they lose upstream sync."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2043
+msgid "Protocol Timing"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2064
+msgid ""
+"The values in these fields are DHCP protocol timings used when requesting a "
+"lease. <br /> "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2105
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Lease "
+"Requirements and Requests</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2107
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Send</a> "
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp-options&amp;sektion=5\">Options</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2110
+msgid ""
+"The values in this field are DHCP options to be sent when requesting a DHCP "
+"lease. [option declaration [, ...]] <br />Value Substitutions: {interface}, "
+"{hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />Where C is U(pper) or "
+"L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) "
+"(omitted for none). <br />Some ISPs may require certain options be or not be "
+"sent. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2115
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Request</"
+"a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp-options&amp;sektion=5\">Options</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2118
+msgid ""
+"The values in this field are DHCP option 55 to be sent when requesting a "
+"DHCP lease. [option [, ...]] <br />Some ISPs may require certain options be "
+"or not be requested. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2121
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Require</"
+"a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp-options&amp;sektion=5\">Options</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2124
+msgid ""
+"The values in this field are DHCP options required by the client when "
+"requesting a DHCP lease. [option [, ...]] "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2129
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp-options&amp;sektion=5\">Option</a> <a target=\"FreeBSD_DHCP\" "
+"href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;"
+"sektion=5#OPTION_MODIFIERS\">Modifiers</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2133
+msgid ""
+"The values in this field are DHCP option modifiers applied to obtained DHCP "
+"lease. [modifier option declaration [, ...]] <br /> modifiers: (default, "
+"supersede, prepend, append)"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2139
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhclient.conf&amp;sektion=5\">Configuration File</a> Override"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2143 usr/local/www/interfaces.php:2388
+msgid ""
+"The value in this field is the full absolute path to a DHCP client "
+"configuration file. [/[dirname/[.../]]filename[.ext]] <br /> Value "
+"Substitutions in Config File: {interface}, {hostname}, {mac_addr_asciiCD}, "
+"{mac_addr_hexCD} <br />Where C is U(pper) or L(ower) Case, and D is \" :-.\" "
+"Delimiter (space, colon, hyphen, or period) (omitted for none). <br />Some "
+"ISPs may require certain options be or not be sent. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2197
+msgid ""
+"DHCP6 client configuration &nbsp; &nbsp; <input name="
+"\"adv_dhcp6_config_advanced\" type=\"checkbox\" id="
+"\"adv_dhcp6_config_advanced\" value=\"\" onclick="
+"\"show_adv_dhcp6_config(this)\" /> Advanced &nbsp; &nbsp; <input name="
+"\"adv_dhcp6_config_file_override\" type=\"checkbox\" id="
+"\"adv_dhcp6_config_file_override\" value=\"\" onclick="
+"\"show_adv_dhcp6_config(this)\" /> Config File Override &nbsp; &nbsp; "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2206
+msgid "DHCPv6 Unique Identifier (DUID)"
+msgstr "DHCPv6 benzersiz tanımlayıcı (DUID)"
+
+#: usr/local/www/interfaces.php:2210
+msgid ""
+"The value in this field is sent as the DHCPv6 client identifier when "
+"requesting a DHCPv6 lease."
+msgstr ""
+"Bu alandaki değer DHCPv6 kira talebi olunca DHCPv6 istemcisi tarafından "
+"gönderilir."
+
+#: usr/local/www/interfaces.php:2215
+#, php-format
+msgid "The current DUID is: '%s'"
+msgstr "Şimdiki DUID: '%s' "
+
+#: usr/local/www/interfaces.php:2222
+msgid "Use IPv4 connectivity as parent interface"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2225
+msgid "Request a IPv6 prefix/information through the IPv4 connectivity link"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2229
+msgid "Request only an IPv6 prefix"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2232
+msgid "Only request an IPv6 prefix, do not request an IPv6 address"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2236
+msgid "DHCPv6 Prefix Delegation size"
+msgstr "DHCP Önek Yetkilendirme boyutu"
+
+#: usr/local/www/interfaces.php:2249
+msgid ""
+"The value in this field is the delegated prefix length provided by the "
+"DHCPv6 server. Normally specified by the ISP."
+msgstr ""
+"Bu alandaki önek uzunluğu yetkilendirmesi değerini DHCPv6 sunucusu sağlar. "
+"Normalde ISP tarafından belirtilir."
+
+#: usr/local/www/interfaces.php:2253
+msgid "Send IPv6 prefix hint"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2256
+msgid ""
+"Send an IPv6 prefix hint to indicate the desired prefix size for delegation"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2262
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Interface_statement\">Interface Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2265
+msgid "Information Only"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2268
+msgid "Send Options"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2271
+msgid ""
+"The values in this field are DHCP send options to be sent when requesting a "
+"DHCP lease. [option declaration [, ...]] <br />Value Substitutions: "
+"{interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />Where C "
+"is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, "
+"hyphen, or period) (omitted for none). <br />Some DHCP services may require "
+"certain options be or not be sent. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2277
+msgid "Request Options"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2280
+msgid ""
+"The values in this field are DHCP request options to be sent when requesting "
+"a DHCP lease. [option [, ...]] <br />Some DHCP services may require certain "
+"options be or not be requested. "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2284
+msgid "Script"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2287
+msgid ""
+"The value in this field is the absolute path to a script invoked on certain "
+"conditions including when a reply message is received. <br />[/[dirname/"
+"[.../]]filename[.ext]] "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2294
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Identity_association_statement\">Identity Association Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2299
+msgid "Non-Temporary Address Allocation"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2301
+msgid "id-assoc na"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2302 usr/local/www/interfaces.php:2319
+msgid "<i>ID</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2305 usr/local/www/status_lb_vs.php:79
+#: usr/local/www/vpn_ipsec_phase2.php:586
+#: usr/local/www/vpn_ipsec_phase2.php:621
+#: usr/local/www/vpn_ipsec_phase2.php:663
+#: usr/local/www/vpn_ipsec_phase2.php:669
+msgid "Address"
+msgstr "Adres"
+
+#: usr/local/www/interfaces.php:2306
+msgid "<i>ipv6-address</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2308 usr/local/www/interfaces.php:2325
+msgid "<i>pltime</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2310 usr/local/www/interfaces.php:2327
+msgid "<i>vltime</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2316
+msgid "Prefix Delegation"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2318
+msgid "id-assoc pd"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2322
+msgid "Prefix"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2323
+msgid "<i>ipv6-prefix</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2335
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Prefix_interface_statement\">Prefix Interface Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2338
+msgid "Prefix Interface "
+msgstr ""
+
+#: usr/local/www/interfaces.php:2339
+msgid "<i>sla-id</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2341
+msgid "<i>sla-len</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2348
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Authentication_statement\">Authentication Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2351
+msgid "<i>authname</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2353
+msgid "<i>protocol</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2355
+msgid "<i>algorithm</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2357
+msgid "<i>rdm</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2364
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD"
+"+10.1-RELEASE+and+Ports#Keyinfo_statement\">Keyinfo Statement</a>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2367
+msgid "<i>keyname</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2369
+msgid "<i>realm</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2372
+msgid "<i>keyid</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2374
+msgid "<i>secret</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2376
+msgid "<i>expire</i>"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2383
+msgid ""
+"<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?"
+"query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=+10.1-RELEASE+and+Ports"
+"\">Configuration File</a> Override"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2469
+msgid "6RD Configuration"
+msgstr ""
+
+#: usr/local/www/interfaces.php:2472
+msgid "6RD prefix"
+msgstr "6'ıncı ön-ek"
+
+#: usr/local/www/interfaces.php:2476
+msgid ""
+"The value in this field is the 6RD IPv6 prefix assigned by your ISP. e.g. "
+"'2001:db8::/32'"
+msgstr ""
+"Bu alandaki değer 6'ıncı IPv6 ön-eki sizin ISP'niz tarafından sağlanır. örn. "
+"'2001:db8::/32'"
+
+#: usr/local/www/interfaces.php:2480
+msgid "6RD Border Relay"
+msgstr "6'ıncı Sınır Aktarma"
+
+#: usr/local/www/interfaces.php:2484
+msgid ""
+"The value in this field is 6RD IPv4 gateway address assigned by your ISP"
+msgstr ""
+"Bu alandaki değer 6'ıncı IPv4 ağ geçidi sizin ISP'niz tarafından sağlanır"
+
+#: usr/local/www/interfaces.php:2488
+msgid "6RD IPv4 Prefix length"
+msgstr "6'ıncı Ipv4 ön-ek uzunluğu"
+
+#: usr/local/www/interfaces.php:2500
+msgid ""
+"The value in this field is the 6RD IPv4 prefix length. Normally specified by "
+"the ISP. A value of 0 means we embed the entire IPv4 address in the 6RD "
+"prefix."
+msgstr ""
+"Bu alandaki değer 6'ıncı IPv4 ön-ek uzunluğudur. Normalde ISP tarafından "
+"belirlenir. Değer 0 ise tüm IPv4 adresini 6'ıncı ön-ek'e gömmüşüz anlamına "
+"gelir."
+
+#: usr/local/www/interfaces.php:2513
+msgid "Track IPv6 Interface"
+msgstr "IPv6 Arabirim İzi"
+
+#: usr/local/www/interfaces.php:2516
+msgid "IPv6 Interface"
+msgstr "IPv6 Arabirimi"
+
+#: usr/local/www/interfaces.php:2554
+msgid "This selects the dynamic IPv6 WAN interface to track for configuration"
+msgstr "Bu dinamik IPv6 WAN arabirimini yapılandırma izi için seçer"
+
+#: usr/local/www/interfaces.php:2558
+msgid "IPv6 Prefix ID"
+msgstr "IPv6 Ön-ek kimliği"
+
+#: usr/local/www/interfaces.php:2569
+msgid ""
+"The value in this field is the (Delegated) IPv6 prefix ID. This determines "
+"the configurable network ID based on the dynamic IPv6 connection"
+msgstr ""
+"Bu alandaki değer (yetkilendirimiş) IPv6 ön-ek kimliğidir. Bu dinamik IPv6 "
+"bağlantısına dayalı yapılandırılabilir bir ağ kimliği belirler"
+
+#: usr/local/www/interfaces.php:2571
+msgid "default value is 0."
+msgstr ""
+
+#: usr/local/www/interfaces.php:2584
+msgid "PPP configuration"
+msgstr "PPP yapılandırması"
+
+#: usr/local/www/interfaces.php:2587
+#: usr/local/www/interfaces_ppps_edit.php:491
+msgid "Service Provider"
+msgstr "Servis Sağlayıcı"
+
+#: usr/local/www/interfaces.php:2591
+#: usr/local/www/interfaces_ppps_edit.php:495
+msgid "Country:"
+msgstr "Ülke:"
+
+#: usr/local/www/interfaces.php:2599
+#: usr/local/www/interfaces_ppps_edit.php:503
+msgid "Provider:"
+msgstr "Sağlayıcı:"
+
+#: usr/local/www/interfaces.php:2607
+#: usr/local/www/interfaces_ppps_edit.php:511
+msgid "Plan:"
+msgstr "Plan:"
+
+#: usr/local/www/interfaces.php:2615
+#: usr/local/www/interfaces_ppps_edit.php:519
+msgid "Select to fill in data for your service provider."
+msgstr "Servis sağlayıcı bilgilerinizi girmek için seçiniz."
+
+#: usr/local/www/interfaces.php:2637
+#: usr/local/www/interfaces_ppps_edit.php:543
+msgid "Access Point Name (APN)"
+msgstr "Erişim Noktası Adı (APN)"
+
+#: usr/local/www/interfaces.php:2667
+msgid "Advanced PPP"
+msgstr "Gelişmiş PPP"
+
+#: usr/local/www/interfaces.php:2670 usr/local/www/interfaces.php:2675
+#: usr/local/www/interfaces.php:2779 usr/local/www/interfaces.php:2784
+#: usr/local/www/interfaces.php:2850 usr/local/www/interfaces.php:2855
+msgid "Click here"
+msgstr "Buraya "
+
+#: usr/local/www/interfaces.php:2671
+msgid "to edit PPP configuration."
+msgstr "tıklayarak PPP yapılandırmanızı değiştirebilirsiniz."
+
+#: usr/local/www/interfaces.php:2676
+msgid "to create a PPP configuration."
+msgstr "PPP yapılandırması oluşturabilirsiniz."
+
+#: usr/local/www/interfaces.php:2690
+msgid "PPPoE configuration"
+msgstr "PPPoE yapılandırması"
+
+#: usr/local/www/interfaces.php:2705
+#: usr/local/www/interfaces_ppps_edit.php:602
+msgid "Service name"
+msgstr "Servis adı"
+
+#: usr/local/www/interfaces.php:2707
+msgid "Hint: this field can usually be left empty"
+msgstr "İpucu: Bu alan çoğunlukla boş bırakılabilir"
+
+#: usr/local/www/interfaces.php:2714 usr/local/www/interfaces.php:2836
+msgid "Enable Dial-On-Demand mode"
+msgstr "Gerektiğinde arama kipini etkinleştir"
+
+#: usr/local/www/interfaces.php:2715
+msgid ""
+"This option causes the interface to operate in dial-on-demand mode, allowing "
+"you to have a "
+msgstr ""
+"Bu seçenek arabirimin 'gerektiğinde ara' kipinde çalışmasını sağlar, böylece "
+
+#: usr/local/www/interfaces.php:2715 usr/local/www/interfaces.php:2837
+msgid "virtual full time"
+msgstr "görünüşte tam zamanlı"
+
+#: usr/local/www/interfaces.php:2715 usr/local/www/interfaces.php:2837
+msgid ""
+"connection. The interface is configured, but the actual connection of the "
+"link is delayed until qualifying outgoing traffic is detected."
+msgstr ""
+"bir bağlantı elde edilir. Arabirim yapılandırılır ama bağlantının gerçekten "
+"sağlanması için dışarıya doğru trafik oluşması beklenir."
+
+#: usr/local/www/interfaces.php:2719 usr/local/www/interfaces.php:2841
+#: usr/local/www/services_captiveportal.php:550
+msgid "Idle timeout"
+msgstr "Boşta bekleme zamanı"
+
+#: usr/local/www/interfaces.php:2721 usr/local/www/interfaces.php:2843
+msgid ""
+"If no qualifying outgoing packets are transmitted for the specified number "
+"of seconds, the connection is brought down. An idle timeout of zero disables "
+"this feature."
+msgstr ""
+"Belirtilen saniye sayısı boyunca dışarıya paket gönderilmezse bağlantı "
+"durdurulur. Bu değeri 0 girerseniz bu özellik kapatılır."
+
+#: usr/local/www/interfaces.php:2725
+#: usr/local/www/interfaces_ppps_edit.php:609
+msgid "Periodic reset"
+msgstr "Belirli aralıklarla sıfırlama"
+
+#: usr/local/www/interfaces.php:2733
+#: usr/local/www/interfaces_ppps_edit.php:617
+#: usr/local/www/status_rrd_graph.php:450
+#: usr/local/www/status_rrd_graph_settings.php:169
+msgid "Custom"
+msgstr "Özel"
+
+#: usr/local/www/interfaces.php:2734
+#: usr/local/www/interfaces_ppps_edit.php:618
+msgid "Pre-Set"
+msgstr "Önceden ayarlı"
+
+#: usr/local/www/interfaces.php:2735
+#: usr/local/www/interfaces_ppps_edit.php:619
+msgid "Select a reset timing type"
+msgstr "Sıfırlama zamanlama türü seçin"
+
+#: usr/local/www/interfaces.php:2743
+#: usr/local/www/interfaces_ppps_edit.php:627
+msgid "hour (0-23)"
+msgstr "saat (0-23)"
+
+#: usr/local/www/interfaces.php:2745
+#: usr/local/www/interfaces_ppps_edit.php:629
+msgid "minute (0-59)"
+msgstr "dakika (0-59)"
+
+#: usr/local/www/interfaces.php:2747
+#: usr/local/www/interfaces_ppps_edit.php:631
+msgid "reset at a specific date (mm/dd/yyyy)"
+msgstr "belirli tarihte sıfırla (aa/gg/yyyy)"
+
+#: usr/local/www/interfaces.php:2750
+#: usr/local/www/interfaces_ppps_edit.php:634
+msgid ""
+"If you leave the date field empty, the reset will be executed each day at "
+"the time you did specify using the minutes and hour field."
+msgstr ""
+"Tarih alanı boş bırakılır ise sıfırlama işlemi dakika ve saat alanında "
+"belirtilen değerlere göre her gün gerçekleştirilecektir."
+
+#: usr/local/www/interfaces.php:2758
+#: usr/local/www/interfaces_ppps_edit.php:642
+msgid "reset at each month ('0 0 1 * *')"
+msgstr "her ay sıfırla ('0 0 1 * *')"
+
+#: usr/local/www/interfaces.php:2761
+#: usr/local/www/interfaces_ppps_edit.php:645
+msgid "reset at each week ('0 0 * * 0')"
+msgstr "her hafta sıfırla ('0 0 * * 0')"
+
+#: usr/local/www/interfaces.php:2764
+#: usr/local/www/interfaces_ppps_edit.php:648
+msgid "reset at each day ('0 0 * * *')"
+msgstr "her gün sıfırla ('0 0 * * *')"
+
+#: usr/local/www/interfaces.php:2767
+#: usr/local/www/interfaces_ppps_edit.php:651
+msgid "reset at each hour ('0 * * * *')"
+msgstr "her saat sıfırla ('0 * * * *')"
+
+#: usr/local/www/interfaces.php:2776
+msgid "Advanced and MLPPP"
+msgstr "Gelişmiş ve MLPPP"
+
+#: usr/local/www/interfaces.php:2780
+msgid ""
+"for additional PPPoE configuration options. Save first if you made changes."
+msgstr "ek PPPoE yapılandırma seçenekleri için önce değişiklikleri kaydediniz."
+
+#: usr/local/www/interfaces.php:2785
+msgid "for advanced PPPoE configuration options and MLPPP configuration."
+msgstr "gelişmiş PPPoE yapılandırma seçenekleri ve MLPPP yapılandırması için."
+
+#: usr/local/www/interfaces.php:2799
+msgid "PPTP/L2TP configuration"
+msgstr "PPTP/L2TP yapılandırması"
+
+#: usr/local/www/interfaces.php:2814
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+msgid "Local IP address"
+msgstr "Yerel IP adresi"
+
+#: usr/local/www/interfaces.php:2827
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+msgid "Remote IP address"
+msgstr "Uzak IP adresi"
+
+#: usr/local/www/interfaces.php:2837
+msgid ""
+"This option causes the interface to operate in dial-on-demand mode, allowing "
+"you to have a"
+msgstr "Bu seçenek arabirimin gerektiğinde bağlanarak çalışmasını sağlar"
+
+#: usr/local/www/interfaces.php:2851
+msgid ""
+"for additional PPTP and L2TP configuration options. Save first if you made "
+"changes."
+msgstr ""
+"Ek PPTP ve L2TP yapılandırma seçenekleri için değişiklikleri kaydediniz."
+
+#: usr/local/www/interfaces.php:2856
+msgid "for advanced PPTP and L2TP configuration options"
+msgstr "gelişmiş PPTP ve L2TP yapılandırma seçeneklerini değiştirebilirsiniz"
+
+#: usr/local/www/interfaces.php:2871
+msgid ""
+"Common wireless configuration - Settings apply to all wireless networks on"
+msgstr ""
+"Genel kablosuz yapılandırması - Ayarlar şu arabirim üzerindeki kablosuz "
+"ağlara uygulanacaktır"
+
+#: usr/local/www/interfaces.php:2874
+msgid "Persist common settings"
+msgstr "Ortak ayarları sabitle"
+
+#: usr/local/www/interfaces.php:2877
+msgid ""
+"Enabling this preserves the common wireless configuration through interface "
+"deletions and reassignments."
+msgstr ""
+"Bu seçeneği açmak arabirim silinme ve yeniden atanma gibi durumlarda ortak "
+"ayarları korur."
+
+#: usr/local/www/interfaces.php:2881
+msgid "Standard"
+msgstr "Standart"
+
+#: usr/local/www/interfaces.php:2901
+msgid "Protection Mode"
+msgstr "Koruma Kipi"
+
+#: usr/local/www/interfaces.php:2904
+msgid "Protection mode off"
+msgstr "Koruma kipi kapalı"
+
+#: usr/local/www/interfaces.php:2905
+msgid "Protection mode CTS to self"
+msgstr "Koruma kipi CTS kendine"
+
+#: usr/local/www/interfaces.php:2906
+msgid "Protection mode RTS and CTS"
+msgstr "Koruma kipi RTS ve CTS"
+
+#: usr/local/www/interfaces.php:2909
+msgid ""
+"For IEEE 802.11g, use the specified technique for protecting OFDM frames in "
+"a mixed 11b/11g network."
+msgstr ""
+"IEEE 802.11g için OFDM çerçevelerini 11b/11g karışık ağlarda korumak için "
+"belirtilen tekniği kullan."
+
+#: usr/local/www/interfaces.php:2917
+msgid "Transmit power"
+msgstr "Yayın gücü"
+
+#: usr/local/www/interfaces.php:2930
+msgid ""
+"Note: Typically only a few discreet power settings are available and the "
+"driver will use the setting closest to the specified value. Not all "
+"adapters support changing the transmit power setting."
+msgstr ""
+"Not: Genellikle sadece birkaç güç ayarı kullanılabilir durumdadır ve sürücü "
+"belirtilen değere en yakın ayarı kullanır. Tüm ağ kartları yayın gücü "
+"ayarını desteklemez."
+
+#: usr/local/www/interfaces.php:2934 usr/local/www/status_interfaces.php:356
+msgid "Channel"
+msgstr "Kanal"
+
+#: usr/local/www/interfaces.php:2937 usr/local/www/interfaces.php:2984
+#: usr/local/www/interfaces.php:2996 usr/local/www/vpn_ipsec_phase1.php:882
+msgid "Auto"
+msgstr "Otomatik"
+
+#: usr/local/www/interfaces.php:2957
+msgid ""
+"Legend: wireless standards - channel # (frequency @ max TX power / TX power "
+"allowed in reg. domain)"
+msgstr ""
+"Efsane: kablosuz standartları - kanal # (frekans @ en yüksek TX gücü / "
+"normal alanda izin verilen TX gücü)"
+
+#: usr/local/www/interfaces.php:2959
+msgid ""
+"Note: Not all channels may be supported by your card. Auto may override the "
+"wireless standard selected above."
+msgstr ""
+"Not: Kartınız tüm kanalları desteklemiyor olabilir. Otomatik seçeneği "
+"yukarıda seçili olan kablosuz standardının üzerine yazabilir."
+
+#: usr/local/www/interfaces.php:2964
+msgid "Antenna settings"
+msgstr "Anten ayarları"
+
+#: usr/local/www/interfaces.php:2970
+msgid "Diversity"
+msgstr "Farklılık"
+
+#: usr/local/www/interfaces.php:2973 usr/local/www/vpn_l2tp.php:299
+#: usr/local/www/vpn_pppoe_edit.php:372 usr/local/www/vpn_pptp.php:320
+msgid "Off"
+msgstr "Kapalı"
+
+#: usr/local/www/interfaces.php:2974
+msgid "On"
+msgstr "Açık"
+
+#: usr/local/www/interfaces.php:2981
+msgid "Transmit antenna"
+msgstr "Yayın anteni"
+
+#: usr/local/www/interfaces.php:2985 usr/local/www/interfaces.php:2997
+msgid "#1"
+msgstr "#1"
+
+#: usr/local/www/interfaces.php:2986 usr/local/www/interfaces.php:2998
+msgid "#2"
+msgstr "#2"
+
+#: usr/local/www/interfaces.php:2993
+msgid "Receive antenna"
+msgstr "Alıcı anten"
+
+#: usr/local/www/interfaces.php:3005
+msgid ""
+"Note: The antenna numbers do not always match up with the labels on the card."
+msgstr "Not: Anten numaraları kart üzerindeki etiketlerle eşleşmeyebilir."
+
+#: usr/local/www/interfaces.php:3011
+msgid "Distance setting"
+msgstr "Mesafe ayarı"
+
+#: usr/local/www/interfaces.php:3015
+msgid ""
+"Note: This field can be used to tune ACK/CTS timers to fit the distance "
+"between AP and Client"
+msgstr ""
+"Not: Bu alan erişim noktası (AP - Access Point) ile istemci arasındaki "
+"mesafeyi belielemek için ACK/CTS zamanlayıcılarını ayarlamada kullanılabilir"
+
+#: usr/local/www/interfaces.php:3016
+msgid "(measured in meters)"
+msgstr ""
+"(metre cinsinden ölçülür ve sadece Atheros tabanlı kartlarda çalışır !)"
+
+#: usr/local/www/interfaces.php:3021
+msgid "Regulatory settings"
+msgstr "Düzenleyici ayarları"
+
+#: usr/local/www/interfaces.php:3023
+msgid "Regulatory domain"
+msgstr "Düzenleyici bölgesi"
+
+#: usr/local/www/interfaces.php:3037
+msgid ""
+"Note: Some cards have a default that is not recognized and require changing "
+"the regulatory domain to one in this list for the changes to other "
+"regulatory settings to work."
+msgstr ""
+"Not: Bazı kartların öntanımlı değeri tanınmaz ve diğer düzenleyici "
+"ayarlarının çalışabilmesi için bu düzenleyici bölgesinin bu değere "
+"değiştirilmesi gerekir."
+
+#: usr/local/www/interfaces.php:3039
+msgid "Country (listed with country code and regulatory domain)"
+msgstr "Ülke (ülke kodu ve düzenleyici bölgesi şeklinde listelenmiştir)"
+
+#: usr/local/www/interfaces.php:3053
+msgid ""
+"Note: Any country setting other than \"Default\" will override the "
+"regulatory domain setting"
+msgstr ""
+"Not: \"Öntanımlı\" dışındaki değerler düzenleyici bölgesi değerini değiştirir"
+
+#: usr/local/www/interfaces.php:3055
+msgid "Location"
+msgstr "Konum"
+
+#: usr/local/www/interfaces.php:3058
+msgid "Indoor"
+msgstr "Kapalı alan"
+
+#: usr/local/www/interfaces.php:3059
+msgid "Outdoor"
+msgstr "Açık alan"
+
+#: usr/local/www/interfaces.php:3060
+msgid "Anywhere"
+msgstr "Herhangi biryerde"
+
+#: usr/local/www/interfaces.php:3063
+msgid ""
+"These settings may affect which channels are available and the maximum "
+"transmit power allowed on those channels. Using the correct settings to "
+"comply with local regulatory requirements is recommended."
+msgstr ""
+"Bu ayarlar hangi kanalların kullanılabileceğini ve o kanallarda izin verilen "
+"en yüksek yayın gücünü etkileyebilir. Yerel düzenleyici gerekliliklerine "
+"uygun ve doğru ayarları kullanmak gerekir."
+
+#: usr/local/www/interfaces.php:3065
+msgid ""
+"Note: All wireless networks on this interface will be temporarily brought "
+"down when changing regulatory settings. Some of the regulatory domains or "
+"country codes may not be allowed by some cards. These settings may not be "
+"able to add additional channels that are not already supported."
+msgstr ""
+"Not: Düzenleyici ayarları değiştirilirken bu arabirim üzerindeki tüm "
+"kablosuz ağlar geçici olarak kapatılacaktır. Bazı kartlar bazı düzenleyici "
+"bölgelerini ve ülke kodlarını kabul etmeyebilir. Bu ayarlar halihazırda "
+"desteklenenlerin dışında ek kanallar ekleyemeyebilir."
+
+#: usr/local/www/interfaces.php:3072
+msgid "Network-specific wireless configuration"
+msgstr "Ağa-özel kablosuz yapılandırması"
+
+#: usr/local/www/interfaces.php:3078
+#: usr/local/www/interfaces_wireless_edit.php:185
+msgid "Infrastructure (BSS)"
+msgstr "Altyapı (BSS)"
+
+#: usr/local/www/interfaces.php:3079
+#: usr/local/www/interfaces_wireless_edit.php:186
+msgid "Ad-hoc (IBSS)"
+msgstr "Eşlerarası (Ad-hoc - IBSS)"
+
+#: usr/local/www/interfaces.php:3080
+#: usr/local/www/interfaces_wireless_edit.php:187
+msgid "Access Point"
+msgstr "Erişim Noktası (Access Point - AP)"
+
+#: usr/local/www/interfaces.php:3089
+msgid ""
+"Note: Only required in Access Point mode. If left blank in Ad-hoc or "
+"Infrastructure mode, this interface will connect to any available SSID"
+msgstr ""
+"Not: Sadece Access Point (Erişim Noktası) kipinde gerekir. Adhoc (eşler "
+"arası) yada Infrastructure (Altyapı BSS) kipinde boş bırakılırsa arabirim "
+"sadece mevcut olan SSID ye bağlanır"
+
+#: usr/local/www/interfaces.php:3094
+msgid "Minimum wireless standard"
+msgstr "Minimum kablosuz standardı"
+
+#: usr/local/www/interfaces.php:3097
+msgid "Any"
+msgstr "Herhangi biri"
+
+#: usr/local/www/interfaces.php:3099
+msgid "802.11g"
+msgstr "802.11g"
+
+#: usr/local/www/interfaces.php:3101
+msgid "802.11n"
+msgstr "802.11n"
+
+#: usr/local/www/interfaces.php:3104
+msgid ""
+"When operating as an access point, allow only stations capable of the "
+"selected wireless standard to associate (stations not capable are not "
+"permitted to associate)."
+msgstr ""
+"Erişim noktası olarak çalışırken sadece seçilen kablosuz standardında "
+"çalışabilen istemcilerin bağlanmasına izin ver, (diğerlerinin ilişkilendirme "
+"isteklerini reddet)."
+
+#: usr/local/www/interfaces.php:3109
+msgid "802.11g only"
+msgstr "Sadece 802.11g"
+
+#: usr/local/www/interfaces.php:3112
+msgid ""
+"When operating as an access point in 802.11g mode, allow only 11g-capable "
+"stations to associate (11b-only stations are not permitted to associate)."
+msgstr ""
+"802.11g kipinde erişim noktası olarak çalışırken sadece 11g çalışabilen "
+"istemcilerin erişimine izin ver (sadece 11b olan istemcileri reddet)."
+
+#: usr/local/www/interfaces.php:3117
+msgid "Allow intra-BSS communication"
+msgstr "BSS'ler arası iletişime izin ver"
+
+#: usr/local/www/interfaces.php:3121
+msgid ""
+"When operating as an access point, enable this if you want to pass packets "
+"between wireless clients directly."
+msgstr ""
+"Erişim noktası olarak çalışırken kablosuz istemciler arasında paketlerin "
+"doğrudan geçirilmesine izin vermek istiyorsanız etkinleştirin."
+
+#: usr/local/www/interfaces.php:3123
+msgid ""
+"Disabling the internal bridging is useful when traffic is to be processed "
+"with packet filtering."
+msgstr ""
+"Trafik paket filtreleme tarafından işlenecekse iç köprülemeyi kapatmak "
+"gerekir."
+
+#: usr/local/www/interfaces.php:3127
+msgid "Enable WME"
+msgstr "WMEyi etkinleştir"
+
+#: usr/local/www/interfaces.php:3130
+msgid "Setting this option will force the card to use WME (wireless QoS)."
+msgstr "Bu seçeneği açmak ağ kartını WME (kablosuz QoS) kullanmaya zorlar."
+
+#: usr/local/www/interfaces.php:3134
+msgid "Enable Hide SSID"
+msgstr "SSID Gizlemeyi Etkinleştir"
+
+#: usr/local/www/interfaces.php:3138
+msgid "Setting this option will force the card to NOT broadcast its SSID"
+msgstr ""
+"Bu seçeneğin etkinleştirilmesi ağ kartını ağ adını (SSID) yayınlanmamaya "
+"zorlar"
+
+#: usr/local/www/interfaces.php:3140
+msgid "(this might create problems for some clients)."
+msgstr "(bazı işlemcilerin zorun yaşamasına neden olabilir)."
+
+#: usr/local/www/interfaces.php:3144
+msgid "WEP"
+msgstr "WEP"
+
+#: usr/local/www/interfaces.php:3147
+msgid "Enable WEP"
+msgstr "WEP'i Etkinleştir"
+
+#: usr/local/www/interfaces.php:3152
+msgid "TX key"
+msgstr "TX anahtarı"
+
+#: usr/local/www/interfaces.php:3155
+msgid "Key 1:"
+msgstr "Anahtar 1:"
+
+#: usr/local/www/interfaces.php:3164
+msgid "Key 2:"
+msgstr "Anahtar 2:"
+
+#: usr/local/www/interfaces.php:3173
+msgid "Key 3:"
+msgstr "Anahtar 3:"
+
+#: usr/local/www/interfaces.php:3182
+msgid "Key 4:"
+msgstr "Anahtar 4:"
+
+#: usr/local/www/interfaces.php:3192
+msgid ""
+"40 (64) bit keys may be entered as 5 ASCII characters or 10 hex digits "
+"preceded by '0x'."
+msgstr ""
+"40 (64) bit anahtarlar 5 ASCII karakter veya önüne '0x' koymak şartıyla 10 "
+"adet onaltılı basamak olarak girilebilir."
+
+#: usr/local/www/interfaces.php:3193
+msgid ""
+"104 (128) bit keys may be entered as 13 ASCII characters or 26 hex digits "
+"preceded by '0x'."
+msgstr ""
+"40 (128) bit anahtarlar 13 ASCII karakter veya önüne '0x' koymak şartıyla 26 "
+"adet onaltılı basamak olarak girilebilir."
+
+#: usr/local/www/interfaces.php:3197 usr/local/www/interfaces.php:3221
+msgid "WPA"
+msgstr "WPA"
+
+#: usr/local/www/interfaces.php:3200
+msgid "Enable WPA"
+msgstr "WPA'yı Etkinleştir"
+
+#: usr/local/www/interfaces.php:3205
+msgid "WPA Pre-Shared Key"
+msgstr "WPA Ön Paylaşımlı Anahtar"
+
+#: usr/local/www/interfaces.php:3208
+msgid "PSK:"
+msgstr "PSK:"
+
+#: usr/local/www/interfaces.php:3214
+msgid "WPA Passphrase must be between 8 and 63 characters long."
+msgstr "Şifre 8 ila 63 karakter olmalıdır."
+
+#: usr/local/www/interfaces.php:3218
+msgid "WPA Mode"
+msgstr "WPA Kipi"
+
+#: usr/local/www/interfaces.php:3222
+msgid "WPA2"
+msgstr "WPA2"
+
+#: usr/local/www/interfaces.php:3223 usr/local/www/interfaces.php:3233
+#: usr/local/www/interfaces.php:3243 usr/local/www/interfaces.php:3252
+#: usr/local/www/services_captiveportal_hostname_edit.php:167
+msgid "Both"
+msgstr "İkisi birden"
+
+#: usr/local/www/interfaces.php:3228
+msgid "WPA Key Management Mode"
+msgstr "WPA Anahtar Yönetim Kipi"
+
+#: usr/local/www/interfaces.php:3231 usr/local/www/vpn_ipsec_keys.php:113
+#: usr/local/www/vpn_ipsec_keys_edit.php:72
+#: usr/local/www/vpn_ipsec_keys_edit.php:142
+#: usr/local/www/vpn_ipsec_mobile.php:348
+#: usr/local/www/vpn_ipsec_phase1.php:174
+#: usr/local/www/vpn_ipsec_phase1.php:747
+#: usr/local/www/vpn_ipsec_settings.php:206
+msgid "Pre-Shared Key"
+msgstr "Ön Paylaşımlı Anahtar"
+
+#: usr/local/www/interfaces.php:3232
+msgid "Extensible Authentication Protocol"
+msgstr "Genişletilebilir Kimlik Doğrulama Protokolü (EAP)"
+
+#: usr/local/www/interfaces.php:3241
+msgid "Open System Authentication"
+msgstr "Açık Sistem Kimlik Doğrulama (OSA)"
+
+#: usr/local/www/interfaces.php:3242
+msgid "Shared Key Authentication"
+msgstr "Paylaşımlı Anahtar Kimlik Doğrulama (SKA)"
+
+#: usr/local/www/interfaces.php:3245
+msgid "Note: Shared Key Authentication requires WEP."
+msgstr "Not: Paylaşımlı Anahtar Kimlik Doğrulama WEP gerektirir."
+
+#: usr/local/www/interfaces.php:3249
+msgid "WPA Pairwise"
+msgstr "WPA Çiftleme"
+
+#: usr/local/www/interfaces.php:3253
+msgid "AES (recommended)"
+msgstr "AES (önerilen)"
+
+#: usr/local/www/interfaces.php:3254
+msgid "TKIP"
+msgstr "TKIP"
+
+#: usr/local/www/interfaces.php:3259
+msgid "Key Rotation"
+msgstr "Anahtar Rotasyonu"
+
+#: usr/local/www/interfaces.php:3262
+msgid ""
+"Allowed values are 1-9999. Must be longer than Master Key "
+"Regeneration time."
+msgstr ""
+"İzin verilen değerler 1 ile 9999 arasındadır ama Ana Anahtar Yenileme "
+"zamanından fazla olmamalıdır."
+
+#: usr/local/www/interfaces.php:3266
+msgid "Master Key Regeneration"
+msgstr "Ana Anahtar Yenileme"
+
+#: usr/local/www/interfaces.php:3269
+msgid ""
+"Allowed values are 1-9999. Must be shorter than Key Rotation time."
+msgstr ""
+"İzin verilen değerler 1 ile 9999 arasındadır ama Anahtar Rotasyon zamanından "
+"fazla olmamalıdır."
+
+#: usr/local/www/interfaces.php:3273
+msgid "Strict Key Regeneration"
+msgstr "Sıkı Anahtar Yenileme"
+
+#: usr/local/www/interfaces.php:3276
+msgid ""
+"Setting this option will force the AP to rekey whenever a client "
+"disassociates."
+msgstr ""
+"Bu seçeneği açmak erişim noktasını her istemci ayrılışında anahtar "
+"yenilemeye zorlar."
+
+#: usr/local/www/interfaces.php:3280
+msgid "Enable IEEE802.1X Authentication"
+msgstr "IEEE802.1x Kimlik Doğrulamayı Etkinleştir"
+
+#: usr/local/www/interfaces.php:3283
+msgid "Setting this option will enable 802.1X authentication."
+msgstr ""
+"Bu seçeneği etkinleştirmek 802.1x kimlik doğrulamanın devreye girmesini "
+"sağlayacaktır."
+
+#: usr/local/www/interfaces.php:3284
+#: usr/local/www/load_balancer_pool_edit.php:267
+#: usr/local/www/status_openvpn.php:392
+msgid "NOTE"
+msgstr "NOT"
+
+#: usr/local/www/interfaces.php:3284
+msgid "this option requires checking the \"Enable WPA box\"."
+msgstr "bu seçenek \"WPA kutusunu etkinleştir\"i işaretlemeyi gerektirir."
+
+#: usr/local/www/interfaces.php:3288
+msgid "802.1X Authentication Server IP Address"
+msgstr "802.1x Kimlik Doğrulama Sunucu IP Adresi"
+
+#: usr/local/www/interfaces.php:3291 usr/local/www/interfaces.php:3312
+msgid ""
+"Enter the IP address of the 802.1X Authentication Server. This is commonly "
+"a Radius server (FreeRadius, Internet Authentication Services, etc.)"
+msgstr ""
+"802.1x kimlik doğrulama sunucusunun IP adesini giriniz. Genellikle Radius "
+"sunucudur (FreeRadius, Internet Kimlik Doğrulama Servisleri (IAS) vb.)"
+
+#: usr/local/www/interfaces.php:3295
+msgid "802.1X Authentication Server Port"
+msgstr "802.1x Kimlik doğrulama Sunucu Portu"
+
+#: usr/local/www/interfaces.php:3298 usr/local/www/interfaces.php:3319
+msgid "Leave blank for the default port 1812."
+msgstr "Varsayılan port olan 1812'yi kullanmak için boş bırakın."
+
+#: usr/local/www/interfaces.php:3302
+msgid "802.1X Authentication Server Shared Secret"
+msgstr "802.1x Kimlik Doğrulama Sunucusu Paylaşımlı Anahtar"
+
+#: usr/local/www/interfaces.php:3309
+msgid "Secondary 802.1X Authentication Server IP Address"
+msgstr "İkincil 802.1X Kimlik Doğrulama Suncusu IP Adresi"
+
+#: usr/local/www/interfaces.php:3316
+msgid "Secondary 802.1X Authentication Server Port"
+msgstr "İkincil 802.1X Kimlik Doğrulama Sunucusu Portu"
+
+#: usr/local/www/interfaces.php:3323
+msgid "Secondary 802.1X Authentication Server Shared Secret"
+msgstr "İkincil 802.1X Kimlik Doğrulama Sunucusu Paylaşımlı Anahtarı"
+
+#: usr/local/www/interfaces.php:3330
+msgid "Authentication Roaming Preauth"
+msgstr "Kimlik Doğrulama Dolaşım Önyayını"
+
+#: usr/local/www/interfaces.php:3341
+msgid "Private networks"
+msgstr "Özel ağlar"
+
+#: usr/local/www/interfaces.php:3349
+msgid ""
+"When set, this option blocks traffic from IP addresses that are reserved for "
+"private networks as per RFC 1918 (10/8, 172.16/12, 192.168/16) as"
+msgstr ""
+"Ayarlandığında, bu seçenek RFC 1918'e göre özel ağ olarak ayrılmış IP "
+"adreslerinden (10/8, 172.16/12, 192.168/16) ve "
+
+#: usr/local/www/interfaces.php:3351
+msgid "well as loopback addresses (127/8)."
+msgstr "loopback adresinden gelen trafiği (127/8) engeller."
+
+#: usr/local/www/interfaces.php:3351
+msgid ""
+"You should generally leave this option turned on, unless your WAN network "
+"lies in such a private address space, too."
+msgstr ""
+"Eğer WAN ağınız da bu tür bir özel ağın içinde değilse bu seçeneği açık "
+"bırakmalısınız."
+
+#: usr/local/www/interfaces.php:3361
+msgid ""
+"When set, this option blocks traffic from IP addresses that are reserved "
+"(but not RFC 1918) or not yet assigned by IANA."
+msgstr ""
+"Bu seçenek RFC 1918 dışında ayrılmış veya IANA tarafından atanmamış IP "
+"adreslerini engeller."
+
+#: usr/local/www/interfaces.php:3363
+msgid ""
+"Bogons are prefixes that should never appear in the Internet routing table, "
+"and obviously should not appear as the source address in any packets you "
+"receive."
+msgstr ""
+"Sahte IPler Internet yönlendirme tablosunda veya aldığınız paketlerin kaynak "
+"adres bölümünde hiç görünmemesi gereken IPlerdir."
+
+#: usr/local/www/interfaces.php:3366
+msgid ""
+"Note: The update frequency can be changed under System->Advanced Firewall/"
+"NAT settings."
+msgstr ""
+"Not: Güncelleme sıklığı Sistem -> Gelişmiş -> Firewall/NAT menüsünden "
+"yapılabilir."
+
+#: usr/local/www/interfaces.php:3490 usr/local/www/interfaces.php:3499
+msgid "You can manage Gateways"
+msgstr "Ağ geçitlerini yönetebilirsiniz"
+
+#: usr/local/www/interfaces_assign.php:44
+msgid "Assign network ports"
+msgstr "Ağ portlarını ata"
+
+#: usr/local/www/interfaces_assign.php:59
+#, php-format
+msgid "VLAN %1$s on %2$s"
+msgstr "VLAN %2$s üzerinde %1$s"
+
+#: usr/local/www/interfaces_assign.php:208
+msgid "lan"
+msgstr "lan"
+
+#: usr/local/www/interfaces_assign.php:209
+msgid "LAN"
+msgstr "LAN"
+
+#: usr/local/www/interfaces_assign.php:234
+msgid "Interface has been added."
+msgstr "Arabirim eklendi."
+
+#: usr/local/www/interfaces_assign.php:274
+#, php-format
+msgid "Port %1$s was assigned to %2$s interfaces:"
+msgstr "Port %1$s %2$s arabirimlerine atanmıştı:"
+
+#: usr/local/www/interfaces_assign.php:290
+#, php-format
+msgid ""
+"You cannot set port %s to interface %s because this interface is a member of "
+"%s."
+msgstr "%s port %s arabirimi üyesi olduğundan %s arabirimi için kullanılamaz."
+
+#: usr/local/www/interfaces_assign.php:367
+msgid ""
+"The interface is part of a group. Please remove it from the group to continue"
+msgstr ""
+"Arabirim bir grubun üyesi. Devam etmek için önce grup üyeliğinden çıkarınız"
+
+#: usr/local/www/interfaces_assign.php:369
+msgid ""
+"The interface is part of a bridge. Please remove it from the bridge to "
+"continue"
+msgstr "Arabirim bir köprünün üyesi. Devam etmek için önce köprüden çıkarınız"
+
+#: usr/local/www/interfaces_assign.php:371
+msgid ""
+"The interface is part of a gre tunnel. Please delete the tunnel to continue"
+msgstr "Arabirim bir GRE tünelinin üyesi. Devam etmek için önce tüneli siliniz"
+
+#: usr/local/www/interfaces_assign.php:373
+msgid ""
+"The interface is part of a gif tunnel. Please delete the tunnel to continue"
+msgstr "Arabirim bir GIF tünelinin üyesi. Devam etmek için önce tüneli siliniz"
+
+#: usr/local/www/interfaces_assign.php:411
+msgid "Interface has been deleted."
+msgstr "Arabirim silindi."
+
+#: usr/local/www/interfaces_assign.php:435
+msgid "The system is now rebooting. Please wait."
+msgstr "Sistem yeniden başlatılıyor. Lütfen bekleyiniz."
+
+#: usr/local/www/interfaces_assign.php:437
+msgid "Reboot is needed. Please apply the settings in order to reboot."
+msgstr ""
+"Sistemi yeniden başlatmak gerekiyor. Lütfen tekrar başlatma için "
+"yapılandırmayı uygulayınız."
+
+#: usr/local/www/interfaces_assign.php:439
+msgid ""
+"Interface mismatch detected. Please resolve the mismatch and click 'Apply "
+"changes'. The firewall will reboot afterwards."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:451
+msgid ""
+"The interface configuration has been changed.<br />You must apply the "
+"changes in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:465
+#: usr/local/www/interfaces_bridge.php:100 usr/local/www/interfaces_gif.php:94
+#: usr/local/www/interfaces_gre.php:95 usr/local/www/interfaces_groups.php:77
+#: usr/local/www/interfaces_lagg.php:100 usr/local/www/interfaces_ppps.php:92
+#: usr/local/www/interfaces_qinq.php:103 usr/local/www/interfaces_vlan.php:97
+#: usr/local/www/interfaces_wireless.php:92
+msgid "Interface assignments"
+msgstr "Arabirim atamaları"
+
+#: usr/local/www/interfaces_assign.php:466
+#: usr/local/www/interfaces_bridge.php:101 usr/local/www/interfaces_gif.php:95
+#: usr/local/www/interfaces_gre.php:96 usr/local/www/interfaces_groups.php:78
+#: usr/local/www/interfaces_lagg.php:101 usr/local/www/interfaces_ppps.php:93
+#: usr/local/www/interfaces_qinq.php:104 usr/local/www/interfaces_vlan.php:98
+#: usr/local/www/interfaces_wireless.php:93
+msgid "Interface Groups"
+msgstr "Arabirim Grupları"
+
+#: usr/local/www/interfaces_assign.php:468
+#: usr/local/www/interfaces_bridge.php:103 usr/local/www/interfaces_gif.php:97
+#: usr/local/www/interfaces_gre.php:98 usr/local/www/interfaces_groups.php:80
+#: usr/local/www/interfaces_lagg.php:103 usr/local/www/interfaces_ppps.php:95
+#: usr/local/www/interfaces_qinq.php:106 usr/local/www/interfaces_vlan.php:100
+#: usr/local/www/interfaces_wireless.php:95
+msgid "VLANs"
+msgstr "VLANlar"
+
+#: usr/local/www/interfaces_assign.php:469
+#: usr/local/www/interfaces_bridge.php:104 usr/local/www/interfaces_gif.php:98
+#: usr/local/www/interfaces_gre.php:99 usr/local/www/interfaces_groups.php:81
+#: usr/local/www/interfaces_lagg.php:104 usr/local/www/interfaces_ppps.php:96
+#: usr/local/www/interfaces_qinq.php:107 usr/local/www/interfaces_vlan.php:101
+#: usr/local/www/interfaces_wireless.php:96
+msgid "QinQs"
+msgstr "QinQler"
+
+#: usr/local/www/interfaces_assign.php:470
+#: usr/local/www/interfaces_bridge.php:105 usr/local/www/interfaces_gif.php:99
+#: usr/local/www/interfaces_gre.php:100 usr/local/www/interfaces_groups.php:82
+#: usr/local/www/interfaces_lagg.php:105 usr/local/www/interfaces_ppps.php:97
+#: usr/local/www/interfaces_ppps_edit.php:389
+#: usr/local/www/interfaces_qinq.php:108 usr/local/www/interfaces_vlan.php:102
+#: usr/local/www/interfaces_wireless.php:97
+msgid "PPPs"
+msgstr "PPPler"
+
+#: usr/local/www/interfaces_assign.php:471
+#: usr/local/www/interfaces_bridge.php:106
+#: usr/local/www/interfaces_gif.php:100 usr/local/www/interfaces_gre.php:82
+#: usr/local/www/interfaces_gre.php:101
+#: usr/local/www/interfaces_gre_edit.php:130
+#: usr/local/www/interfaces_groups.php:83
+#: usr/local/www/interfaces_lagg.php:106 usr/local/www/interfaces_ppps.php:98
+#: usr/local/www/interfaces_qinq.php:109 usr/local/www/interfaces_vlan.php:103
+#: usr/local/www/interfaces_wireless.php:98
+msgid "GRE"
+msgstr "GRE"
+
+#: usr/local/www/interfaces_assign.php:472
+#: usr/local/www/interfaces_bridge.php:107 usr/local/www/interfaces_gif.php:81
+#: usr/local/www/interfaces_gif.php:101
+#: usr/local/www/interfaces_gif_edit.php:136
+#: usr/local/www/interfaces_gre.php:102 usr/local/www/interfaces_groups.php:84
+#: usr/local/www/interfaces_lagg.php:107 usr/local/www/interfaces_ppps.php:99
+#: usr/local/www/interfaces_qinq.php:110 usr/local/www/interfaces_vlan.php:104
+#: usr/local/www/interfaces_wireless.php:99
+msgid "GIF"
+msgstr "GIF"
+
+#: usr/local/www/interfaces_assign.php:473
+#: usr/local/www/interfaces_bridge.php:108
+#: usr/local/www/interfaces_gif.php:102 usr/local/www/interfaces_gre.php:103
+#: usr/local/www/interfaces_groups.php:85
+#: usr/local/www/interfaces_lagg.php:108 usr/local/www/interfaces_ppps.php:100
+#: usr/local/www/interfaces_qinq.php:111 usr/local/www/interfaces_vlan.php:105
+#: usr/local/www/interfaces_wireless.php:100
+msgid "Bridges"
+msgstr "Köprüler"
+
+#: usr/local/www/interfaces_assign.php:474
+#: usr/local/www/interfaces_bridge.php:109
+#: usr/local/www/interfaces_gif.php:103 usr/local/www/interfaces_gre.php:104
+#: usr/local/www/interfaces_groups.php:86 usr/local/www/interfaces_lagg.php:87
+#: usr/local/www/interfaces_lagg.php:109
+#: usr/local/www/interfaces_lagg_edit.php:137
+#: usr/local/www/interfaces_ppps.php:101 usr/local/www/interfaces_qinq.php:112
+#: usr/local/www/interfaces_vlan.php:106
+#: usr/local/www/interfaces_wireless.php:101
+msgid "LAGG"
+msgstr "LAGG"
+
+#: usr/local/www/interfaces_assign.php:483
+msgid "Network port"
+msgstr "Ağ portu"
+
+#: usr/local/www/interfaces_assign.php:513
+msgid "delete interface"
+msgstr "arabirimi sil"
+
+#: usr/local/www/interfaces_assign.php:515
+msgid "Do you really want to delete this interface?"
+msgstr "Bu arabirimi silmek istediğinize emin misiniz?"
+
+#: usr/local/www/interfaces_assign.php:527
+msgid "Available network ports:"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:543
+msgid "add selected interface"
+msgstr ""
+
+#: usr/local/www/interfaces_assign.php:556
+msgid ""
+"Interfaces that are configured as members of a lagg(4) interface will not be "
+"shown."
+msgstr ""
+"Lagg(4) arabiriminin üyesi olarak yapılandırılmış arabirimler "
+"gösterilmeyecek."
+
+#: usr/local/www/interfaces_bridge.php:64 usr/local/www/interfaces_gif.php:64
+#: usr/local/www/interfaces_gre.php:65 usr/local/www/interfaces_lagg.php:70
+#: usr/local/www/interfaces_vlan.php:65
+msgid "Wrong parameters supplied"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge.php:66 usr/local/www/interfaces_gif.php:66
+#: usr/local/www/interfaces_gre.php:67 usr/local/www/interfaces_lagg.php:72
+#: usr/local/www/interfaces_vlan.php:67
+msgid "Wrong index supplied"
+msgstr ""
+
+#: usr/local/www/interfaces_bridge.php:69
+msgid "This bridge cannot be deleted because it is assigned as an interface."
+msgstr "Köprü bir arabirim olarak atandığı için silinemez."
+
+#: usr/local/www/interfaces_bridge.php:87
+#: usr/local/www/interfaces_bridge_edit.php:240
+msgid "Bridge"
+msgstr "Köprü"
+
+#: usr/local/www/interfaces_bridge.php:119
+#: usr/local/www/interfaces_groups.php:97
+#: usr/local/www/interfaces_lagg.php:119
+#: usr/local/www/load_balancer_pool_edit.php:286
+#: usr/local/www/system_groupmanager.php:375
+msgid "Members"
+msgstr "Üyeler"
+
+#: usr/local/www/interfaces_bridge.php:146
+msgid "Do you really want to delete this bridge?"
+msgstr "Bu köprüyü silmek istediğinize emin misiniz?"
+
+#: usr/local/www/interfaces_bridge.php:157
+msgid "Here you can configure bridging of interfaces."
+msgstr "Burada arabirimler arasında köprülemeyi yapılandırabilirsiniz."
+
+#: usr/local/www/interfaces_bridge_edit.php:123
+msgid "Member Interfaces"
+msgstr "Üye Arabirimler"
+
+#: usr/local/www/interfaces_bridge_edit.php:128
+msgid "Maxage needs to be an integer between 6 and 40."
+msgstr "En yüksek süre değeri 6 ile 40 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/interfaces_bridge_edit.php:130
+msgid "Maxaddr needs to be an integer."
+msgstr "En yüksek adres tamsayı olmalıdır."
+
+#: usr/local/www/interfaces_bridge_edit.php:132
+msgid "Timeout needs to be an integer."
+msgstr "Zaman aşımı tamsayı olmalıdır."
+
+#: usr/local/www/interfaces_bridge_edit.php:134
+msgid "Forward Delay needs to be an integer between 4 and 30."
+msgstr "Yönlendirme Gecikmesi 4 ile 30 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/interfaces_bridge_edit.php:136
+msgid "Hello time for STP needs to be an integer between 1 and 2."
+msgstr "STP selamlama zamanı 1 ya da 2 olmalıdır."
+
+#: usr/local/www/interfaces_bridge_edit.php:138
+msgid "Priority for STP needs to be an integer between 0 and 61440."
+msgstr "STP önceliği 0 ile 61440 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/interfaces_bridge_edit.php:140
+msgid "Transmit Hold Count for STP needs to be an integer between 1 and 10."
+msgstr "STP Yayın Tutma Sayısı 1 ile 10 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/interfaces_bridge_edit.php:143
+msgid "interface priority for STP needs to be an integer between 0 and 240."
+msgstr "STP arabirim önceliği 0 ile 240 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/interfaces_bridge_edit.php:148
+msgid ""
+"interface path cost for STP needs to be an integer between 1 and 200000000."
+msgstr ""
+"STP arabirim yol tutarı 1 ile 200.000.000 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/interfaces_bridge_edit.php:153
+msgid "You must select at least 2 member interfaces for a bridge."
+msgstr "Köprü için en az iki üye arabirim seçmelisiniz."
+
+#: usr/local/www/interfaces_bridge_edit.php:158
+msgid "A member interface passed does not exist in configuration"
+msgstr "Geçiş yapan arabirim üyesi yapılandırmada mevcut değil"
+
+#: usr/local/www/interfaces_bridge_edit.php:161
+msgid "Bridging a wireless interface is only possible in hostap mode."
+msgstr "Kablosuz bir arabirimi köprülemek sadece hostap kipinde mümkündür."
+
+#: usr/local/www/interfaces_bridge_edit.php:163
+msgid ""
+"Span interface cannot be part of the bridge. Remove the span interface from "
+"bridge members to continue."
+msgstr ""
+"Yayım arabirimi bir köprünün parçası olamaz. Devam etmek için yayım "
+"arabirimini köprüden çıkarınız."
+
+#: usr/local/www/interfaces_bridge_edit.php:221
+#: usr/local/www/interfaces_gif_edit.php:117
+#: usr/local/www/interfaces_gre_edit.php:111
+#: usr/local/www/interfaces_lagg_edit.php:118
+#: usr/local/www/interfaces_vlan_edit.php:134
+msgid "Error occurred creating interface, please retry."
+msgstr ""
+
+#: usr/local/www/interfaces_bridge_edit.php:270
+msgid "Bridge configuration"
+msgstr "Köprü yapılandırması"
+
+#: usr/local/www/interfaces_bridge_edit.php:273
+#: usr/local/www/interfaces_lagg_edit.php:92
+msgid "Member interfaces"
+msgstr "Üye arabirimler"
+
+#: usr/local/www/interfaces_bridge_edit.php:288
+msgid "Interfaces participating in the bridge."
+msgstr "Bu arabirimde yer alan köprüler."
+
+#: usr/local/www/interfaces_bridge_edit.php:304
+msgid "RSTP/STP"
+msgstr "RSTP/STP"
+
+#: usr/local/www/interfaces_bridge_edit.php:307
+msgid "Enable spanning tree options for this bridge."
+msgstr "Bu köprü için yayım ağacı seçeneklerini aç."
+
+#: usr/local/www/interfaces_bridge_edit.php:323
+msgid "Protocol used for spanning tree."
+msgstr "Yayım ağacında kullanılacak protokol."
+
+#: usr/local/www/interfaces_bridge_edit.php:325
+msgid "STP interfaces"
+msgstr "STP Arabirimleri"
+
+#: usr/local/www/interfaces_bridge_edit.php:339
+msgid ""
+"Enable Spanning Tree Protocol on interface. The if_bridge(4) driver has "
+"support for the IEEE 802.1D Spanning Tree Protocol (STP). STP is used to "
+"detect and remove loops in a network topology."
+msgstr ""
+"Arabirimde Yayım Ağacı Protokolünü (STP) aç. if_bridge(4) sürücüsü IEEE "
+"802.1d Yayım Ağacı Protokolünü (STP - Spanning Tree Protocol) destekler. STP "
+"ağ topolojisinde döngüleri tespit edip silmek için kullanılır."
+
+#: usr/local/www/interfaces_bridge_edit.php:345
+msgid "Valid time"
+msgstr "Geçerli Zaman"
+
+#: usr/local/www/interfaces_bridge_edit.php:350
+msgid ""
+"Set the time that a Spanning Tree Protocol configuration is valid. The "
+"default is 20 seconds. The minimum is 6 seconds and the maximum is 40 "
+"seconds."
+msgstr ""
+"Yayım Ağacı Protokolü yapılandırmasının geçerli olacağı süreyi belirleyin. "
+"Varsayılan değer 20 saniyedir. En az 6, en çok 40 saniye olabilir."
+
+#: usr/local/www/interfaces_bridge_edit.php:355
+msgid "Forward time"
+msgstr "Yönlendirme Zamanı"
+
+#: usr/local/www/interfaces_bridge_edit.php:360
+msgid ""
+"Set the time that must pass before an interface begins forwarding packets "
+"when Spanning Tree is enabled. The default is 15 seconds. The minimum is 4 "
+"seconds and the maximum is 30 seconds."
+msgstr ""
+"Yayım Ağacı açıldığında arabirimler paketleri yönlendirmeye başlamadan önce "
+"geçmesi gereken süreyi belirleyin. Varsayılan değeri 15, en az 4, en fazla "
+"30 saniyedir."
+
+#: usr/local/www/interfaces_bridge_edit.php:364
+msgid "Hello time"
+msgstr "Selamlama süresi"
+
+#: usr/local/www/interfaces_bridge_edit.php:369
+msgid ""
+"Set the time between broadcasting of Spanning Tree Protocol configuration "
+"messages. The hello time may only be changed when operating in legacy STP "
+"mode. The default is 2 seconds. The minimum is 1 second and the maximum is "
+"2 seconds."
+msgstr ""
+"Yayım Ağacı Protokolü yapılandırma mesajlarının yayınlanışı arasında geçmesi "
+"gereken süreyi belirleyin. Selamlama süresi sadece eski STP kipinde "
+"çalışırken değiştirilebilir. Varsayılan değeri 2 saniyedir ve 1 ya da 2 "
+"saniye olabilir."
+
+#: usr/local/www/interfaces_bridge_edit.php:378
+msgid ""
+"Set the bridge priority for Spanning Tree. The default is 32768. The "
+"minimum is 0 and the maximum is 61440."
+msgstr ""
+"Yayım Ağacı köprü önceliğini belirleyin. Varsayılan değeri 32768 saniyedir. "
+"En az 0, en fazla 61440 olabilir."
+
+#: usr/local/www/interfaces_bridge_edit.php:382
+msgid "Hold count"
+msgstr "Tutma sayısı"
+
+#: usr/local/www/interfaces_bridge_edit.php:387
+msgid ""
+"Set the transmit hold count for Spanning Tree. This is the number of "
+"packets transmitted before being rate limited. The default is 6. The "
+"minimum is 1 and the maximum is 10."
+msgstr ""
+"Yayım Ağacı tutma sayısını belirleyin. Hız sınırlamasından önce gönderilen "
+"paket sayısıdır. Varsayılan değeri 6'dır. En az 1, en fazla 10 olabilir."
+
+#: usr/local/www/interfaces_bridge_edit.php:402
+msgid ""
+"Set the Spanning Tree priority of interface to value. The default is 128. "
+"The minimum is 0 and the maximum is 240. Increments of 16."
+msgstr ""
+"Arabirimin Yayım Ağacı önceliğini ayarlayın. Varsayılan olarak 128, en az 0, "
+"en fazla 240'tır. Artışları 16 dır."
+
+#: usr/local/www/interfaces_bridge_edit.php:406
+msgid "Path cost"
+msgstr "Yol tutarı"
+
+#: usr/local/www/interfaces_bridge_edit.php:416
+msgid ""
+"Set the Spanning Tree path cost of interface to value. The default is "
+"calculated from the link speed. To change a previously selected path cost "
+"back to automatic, set the cost to 0. The minimum is 1 and the maximum is "
+"200000000."
+msgstr ""
+"Arabirimin Yayım Ağacı yol tutarını belirleyin. Varsayılan değer bağlantı "
+"hızından hesaplanır. Önceden seçilmiş yol tutarını otomatiğe çevirmek için 0 "
+"atayın. En az 1, en fazla 200.000.000 olabilir."
+
+#: usr/local/www/interfaces_bridge_edit.php:425
+msgid "Cache size"
+msgstr "Önbellek boyutu"
+
+#: usr/local/www/interfaces_bridge_edit.php:427
+msgid "entries"
+msgstr "girdileri"
+
+#: usr/local/www/interfaces_bridge_edit.php:429
+msgid ""
+"Set the size of the bridge address cache to size.\tThe default is .100 "
+"entries."
+msgstr ""
+"Köprü adresi önbelleğini bu boyuta ayarla.\tVarsayılan değeri .100 girdidir."
+
+#: usr/local/www/interfaces_bridge_edit.php:435
+msgid "Cache entry expire time"
+msgstr "Önbellek girdi zaman dolumu süresi"
+
+#: usr/local/www/interfaces_bridge_edit.php:439
+msgid ""
+"Set the timeout of address cache entries to this number of seconds. If "
+"seconds is zero, then address cache entries will not be expired. The default "
+"is 240 seconds."
+msgstr ""
+"Adres önbellek girdilerinin zaman aşımını bu kadar saniye olarak ayarla. "
+"Eğer 0 atanırsa adres önbellek girdilerinin süresi dolmaz. Varsayılan değeri "
+"240 saniyedir."
+
+#: usr/local/www/interfaces_bridge_edit.php:446
+msgid "Span port"
+msgstr "Yayım portu"
+
+#: usr/local/www/interfaces_bridge_edit.php:460
+msgid ""
+"Add the interface named by interface as a span port on the bridge. Span "
+"ports transmit a copy of every frame received by the bridge. This is most "
+"useful for snooping a bridged network passively on another host connected to "
+"one of the span ports of the bridge."
+msgstr ""
+"Adı verilen arabirimi köprüde yayım portu olarak ekle. Yayım portları "
+"köprüye gelen her çerçevenin bir kopyasını yayınlar. Bu yöntem en çok "
+"köprünün yayım portlarından birine bağlı başka bir sunucu üzerindeki "
+"köprülenmiş ağı izlemekte işe yarar."
+
+#: usr/local/www/interfaces_bridge_edit.php:469
+msgid "The span interface cannot be part of the bridge member interfaces."
+msgstr "Yayım arabirimi köprü üye arabirimlerinden biri olamaz."
+
+#: usr/local/www/interfaces_bridge_edit.php:474
+msgid "Edge ports"
+msgstr "Sınır portlar"
+
+#: usr/local/www/interfaces_bridge_edit.php:488
+msgid ""
+"Set interface as an edge port. An edge port connects directly to end "
+"stations and cannot create bridging loops in the network; this allows it to "
+"transition straight to forwarding."
+msgstr ""
+"Arabirimi sınır port olarak ata. Sınır port uç bilgisayarlara doğrudan "
+"bağlanır; böylece doğrudan yönlendirme yapmasına olanak sağlanmış olur."
+
+#: usr/local/www/interfaces_bridge_edit.php:494
+msgid "Auto Edge ports"
+msgstr "Otomatik Sınır portlar"
+
+#: usr/local/www/interfaces_bridge_edit.php:508
+msgid ""
+"Allow interface to automatically detect edge status. This is the default "
+"for all interfaces added to a bridge."
+msgstr ""
+"Arabirimin sınır durumunu doğrudan tespit etmesine olanak ver. Köprüye "
+"eklenen tüm arabirimlerin öntanımlısı budur."
+
+#: usr/local/www/interfaces_bridge_edit.php:513
+msgid "This will disable the autoedge status of interfaces."
+msgstr "Bu seçenek arabirimlerin otomatik sınır durumunu kapatır."
+
+#: usr/local/www/interfaces_bridge_edit.php:517
+msgid "PTP ports"
+msgstr "PTP portları"
+
+#: usr/local/www/interfaces_bridge_edit.php:531
+msgid ""
+"Set the interface as a point-to-point link. This is required for straight "
+"transitions to forwarding and should be enabled on a direct link to another "
+"RSTP-capable switch."
+msgstr ""
+"Arabirimi uçtan uca bağlantısı olarak ayarla. Bu yönlendirmeye doğrudan "
+"geçiş için gereklidir ve RSTP becerisi olan başka bir switch'e doğrudan "
+"bağlantı varsa etkinleştirilmelidir."
+
+#: usr/local/www/interfaces_bridge_edit.php:537
+msgid "Auto PTP ports"
+msgstr "Otomatik PTP portları"
+
+#: usr/local/www/interfaces_bridge_edit.php:551
+msgid ""
+"Automatically detect the point-to-point status on interface by checking the "
+"full duplex link status. This is the default for interfaces added to the "
+"bridge."
+msgstr ""
+"Full duplex bağlantı durumunu kontrol ederek uçtan uca durumunu otomatik "
+"olarak bul. Köprüye eklenen arabirimler için öntanımlı ayar budur."
+
+#: usr/local/www/interfaces_bridge_edit.php:557
+msgid ""
+"The interfaces selected here will be removed from default autoedge status."
+msgstr ""
+"Burada seçilen arabirimler varsayılan otomatik sınır durumundan çıkarılır."
+
+#: usr/local/www/interfaces_bridge_edit.php:561
+msgid "Sticky ports"
+msgstr "Sabit portlar"
+
+#: usr/local/www/interfaces_bridge_edit.php:575
+msgid ""
+"Mark an interface as a \"sticky\" interface. Dynamically learned address "
+"entries are treated as static once entered into the cache. Sticky entries "
+"are never aged out of the cache or replaced, even if the address is seen on "
+"a different interface."
+msgstr ""
+"Arabirimi \"sabit\" diye işaretle. Dinamik olarak öğrenilen adres girdileri "
+"önbelleğe girdikten sonra statik kabul edilir. Sabit girdiler adreslerle "
+"farklı bir arabirim üzerimde karşılaşılsa da önbellekten çıkarılmaz."
+
+#: usr/local/www/interfaces_bridge_edit.php:582
+msgid "Private ports"
+msgstr "Özel portlar"
+
+#: usr/local/www/interfaces_bridge_edit.php:596
+msgid ""
+"Mark an interface as a \"private\" interface. A private interface does not "
+"forward any traffic to any other port that is also a private interface."
+msgstr ""
+"Arabirimi \"özel\" bir arabirim olarak ata. Özel arabirimler diğer özel "
+"arabirimlere trafik yönlendirmez."
+
+#: usr/local/www/interfaces_gif.php:69
+msgid ""
+"This gif TUNNEL cannot be deleted because it is still being used as an "
+"interface."
+msgstr "Bu GIF tüneli bir arabirim olarak kullanıldığı için silinemez."
+
+#: usr/local/www/interfaces_gif.php:113 usr/local/www/interfaces_gre.php:114
+msgid "Tunnel to..."
+msgstr "Tünellenecek..."
+
+#: usr/local/www/interfaces_gif.php:129
+msgid "Do you really want to delete this gif tunnel?"
+msgstr "Bu GIF tünelini silmek istediğinize emin misiniz?"
+
+#: usr/local/www/interfaces_gif.php:140
+msgid "GIF tunnels are configured here."
+msgstr "GIF tünelleri burada yapılandırılır."
+
+# takip eden 2 satır çeviri birlikte kullanılıyor o yüzden cümleler devrik konumlanmıştır (technical)
+#: usr/local/www/interfaces_gif.php:142
+msgid ""
+"If you are using a GIF tunnel to connect to a Hurricane Electric (he.net) "
+"Tunnel Broker on a WAN with a dynamic IP, you may want to add a"
+msgstr ""
+"IP değişikliklerinizde tünelinizi işlevsel tutmak ve Hurricane Electric (he."
+"net) e bağlanmak için WAN dinamik IP sinde GIF Tünelkırıcı kullanıyorsanız,"
+
+# takip eden 1 satır çeviri birlikte kullanılıyor o yüzden cümleler devrik konumlanmıştır (technical)
+#: usr/local/www/interfaces_gif.php:142
+msgid "HE.net Tunnelbroker type DynDNS Entry"
+msgstr "HE.net Tünelkırıcı için DynDNS girdisi eklemek"
+
+# yukarıdaki 2 satır çeviri birlikte kullanılıyor o yüzden cümleler devrik konumlanmıştır (technical)
+#: usr/local/www/interfaces_gif.php:142
+msgid "to keep your tunnel functional when your IP changes."
+msgstr "isteyebilirsiniz."
+
+#: usr/local/www/interfaces_gif_edit.php:78
+msgid ""
+"Parent interface,Local address, Remote tunnel address, Remote tunnel "
+"network, Local tunnel address"
+msgstr ""
+"Ebeveyn arabirim, Yerel adres, Uzak tünel adresi, Uzak tünel ağı, Yerel "
+"tünel adresi"
+
+#: usr/local/www/interfaces_gif_edit.php:84
+#: usr/local/www/interfaces_gre_edit.php:83
+msgid "The tunnel local and tunnel remote fields must have valid IP addresses."
+msgstr "Yerel ve uzak tünel alanlarına geçerli IP adresleri girilmeli."
+
+#: usr/local/www/interfaces_gif_edit.php:90
+msgid ""
+"The alias IP address family has to match the family of the remote peer "
+"address."
+msgstr ""
+"Grup IP adres ailesi ile uzak eş adres ailesine birbirine uymak zorundadır."
+
+#: usr/local/www/interfaces_gif_edit.php:98
+#, php-format
+msgid "A gif with the network %s is already defined."
+msgstr "%s ağıyla bir GIF zaten tanımlı."
+
+#: usr/local/www/interfaces_gif_edit.php:149
+msgid "GIF configuration"
+msgstr "GIF yapılandırması"
+
+#: usr/local/www/interfaces_gif_edit.php:152
+#: usr/local/www/interfaces_gre_edit.php:77
+#: usr/local/www/interfaces_gre_edit.php:146
+#: usr/local/www/interfaces_lagg_edit.php:152
+#: usr/local/www/interfaces_qinq_edit.php:294
+#: usr/local/www/interfaces_vlan_edit.php:79
+#: usr/local/www/interfaces_vlan_edit.php:167
+#: usr/local/www/interfaces_wireless_edit.php:90
+#: usr/local/www/interfaces_wireless_edit.php:165
+msgid "Parent interface"
+msgstr "Ebeveyn arabirim"
+
+#: usr/local/www/interfaces_gif_edit.php:172
+msgid ""
+"The interface here serves as the local address to be used for the gif tunnel."
+msgstr ""
+"Buradaki arabirim GIF tüneli olarak kullanılacak yerel uca karşılık gelir."
+
+#: usr/local/www/interfaces_gif_edit.php:175
+msgid "gif remote address"
+msgstr "GIF uzak adresi"
+
+#: usr/local/www/interfaces_gif_edit.php:179
+msgid "Peer address where encapsulated gif packets will be sent. "
+msgstr "Kapsüllenmiş GIF paketlerinin gönderileceği eş adresi."
+
+#: usr/local/www/interfaces_gif_edit.php:182
+msgid "gif tunnel local address"
+msgstr "GIF tünel yerel adresi"
+
+#: usr/local/www/interfaces_gif_edit.php:186
+msgid "Local gif tunnel endpoint"
+msgstr "GIF tüneli yerel ucu"
+
+#: usr/local/www/interfaces_gif_edit.php:189
+msgid "gif tunnel remote address "
+msgstr "GIF tüneli uzak adresi"
+
+#: usr/local/www/interfaces_gif_edit.php:203
+msgid ""
+"Remote gif address endpoint. The subnet part is used for determining the "
+"network that is tunnelled."
+msgstr ""
+"Uzak GIF adresi bitiş noktası. Bu alt ağ tünel ağın sonlandırılmasında "
+"kullanıldı."
+
+#: usr/local/www/interfaces_gif_edit.php:206
+msgid "Route caching "
+msgstr "Rota önbellekleme"
+
+#: usr/local/www/interfaces_gif_edit.php:210
+msgid ""
+"Specify if route caching can be enabled. Be careful with these settings on "
+"dynamic networks. "
+msgstr ""
+"Rota önbelleklemenin etkinleştirilip etkinleştirilmeyeceğini seçiniz. "
+"Dinamik ağlarda bu ayarları dikkatli kullanınız."
+
+# 95%
+#: usr/local/www/interfaces_gif_edit.php:213
+msgid "ECN friendly behavior"
+msgstr "ECN dostu davranış"
+
+#: usr/local/www/interfaces_gif_edit.php:218
+msgid ""
+"Note that the ECN friendly behavior violates RFC2893. This should be used "
+"in mutual agreement with the peer."
+msgstr ""
+"ECN dostu davranışın RFC2893'ü ihlal ettiğini unutmayınız. Bu ayar sadece "
+"diğer uçla anlaşılarak kullanılmalıdır."
+
+#: usr/local/www/interfaces_gre.php:70
+msgid ""
+"This GRE tunnel cannot be deleted because it is still being used as an "
+"interface."
+msgstr "Bu GRE tüneli halen bir arabirim olarak kullanıldığından silinemiyor."
+
+#: usr/local/www/interfaces_gre.php:130
+msgid "Do you really want to delete this GRE tunnel?"
+msgstr "GRE tünelini silmek istediğinize emin misiniz?"
+
+#: usr/local/www/interfaces_gre.php:139
+msgid ""
+"Here you can configure Generic Routing Encapsulation (GRE - RFC 2784) "
+"tunnels."
+msgstr ""
+"Bu kısımda GRE (Genel Rota Sarmalama - RFC2784) yapılandırmasını "
+"gerçekleştirebilirsiniz."
+
+#: usr/local/www/interfaces_gre_edit.php:77
+msgid "Local address"
+msgstr "Yerel adres"
+
+#: usr/local/www/interfaces_gre_edit.php:77
+msgid "Remote tunnel address"
+msgstr "Uzak tünel adresi"
+
+#: usr/local/www/interfaces_gre_edit.php:77
+msgid "Remote tunnel network"
+msgstr "Uzak tünel ağı"
+
+#: usr/local/www/interfaces_gre_edit.php:77
+msgid "Local tunnel address"
+msgstr "Yerel tünel adresi"
+
+#: usr/local/www/interfaces_gre_edit.php:91
+#, php-format
+msgid "A GRE tunnel with the network %s is already defined."
+msgstr "Sistemde zaten %s ağında bir GRE tüneli tanımlı durumda."
+
+#: usr/local/www/interfaces_gre_edit.php:143
+msgid "GRE configuration"
+msgstr "GRE yapılandırması"
+
+#: usr/local/www/interfaces_gre_edit.php:166
+msgid ""
+"The interface here serves as the local address to be used for the GRE tunnel."
+msgstr "Bu arabirim GRE Tüneli için kullanılacak yerel adres olarak çalışır."
+
+#: usr/local/www/interfaces_gre_edit.php:169
+msgid "Remote tunnel endpoint IP address"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:173
+msgid "Peer address where encapsulated GRE packets will be sent "
+msgstr "Sarmalanmış GRE paketlerinin gönderileceği eş uç adresi"
+
+#: usr/local/www/interfaces_gre_edit.php:176
+msgid "Local tunnel IP address "
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:180
+msgid "Local IP address assigned inside this tunnel"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:183
+msgid "Remote tunnel IP address "
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:197
+msgid ""
+"IP address inside this tunnel on the remote end. The subnet part is used for "
+"the determining the network that is tunneled."
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:200
+msgid "Mobile encapsulation"
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:204
+msgid ""
+"Check this box to use mobile encapsulation (IP protocol 55, RFC 2004). When "
+"unchecked, uses GRE encapsulation (IP protocol 47, RFCs 1701, 1702)."
+msgstr ""
+
+#: usr/local/www/interfaces_gre_edit.php:207
+msgid "Route search type"
+msgstr "Rota arama türü"
+
+#: usr/local/www/interfaces_gre_edit.php:212
+msgid ""
+"For correct operation, the GRE device needs a route to the destination that "
+"is less specific than the one over the tunnel. (Basically, there needs to "
+"be a route to the decapsulating host that does not run over the tunnel, as "
+"this would be a loop."
+msgstr ""
+"Doğru bir şekilde çalışması için, GRE cihazının hedefe tünel üzerinden "
+"gidenden daha az özelleşmiş olması gerekir. (Özetle, çözümleme işlemini "
+"yapan istemciye tünel üzerinden gitmeyen bir rota olması gerekir, çünkü aksi "
+"taktirde bir döngü oluşur)."
+
+#: usr/local/www/interfaces_gre_edit.php:219
+msgid "WCCP version"
+msgstr "WCCP sürümü"
+
+#: usr/local/www/interfaces_gre_edit.php:223
+msgid ""
+"Check this box for WCCP encapsulation version 2, or leave unchecked for "
+"version 1."
+msgstr ""
+
+#: usr/local/www/interfaces_groups.php:64
+#: usr/local/www/interfaces_groups_edit.php:45
+#: usr/local/www/system_authservers.php:449
+#: usr/local/www/system_gateway_groups.php:121
+#: usr/local/www/system_gateways.php:205
+#: usr/local/www/system_groupmanager.php:289
+#: usr/local/www/system_groupmanager_addprivs.php:169
+#: usr/local/www/system_routes.php:222
+#: usr/local/www/system_usermanager.php:495
+#: usr/local/www/system_usermanager.php:907
+#: usr/local/www/system_usermanager_addprivs.php:158
+#: usr/local/www/system_usermanager_settings.php:115
+msgid "Groups"
+msgstr "Gruplar"
+
+#: usr/local/www/interfaces_groups.php:130
+#: usr/local/www/system_groupmanager.php:552
+msgid "edit group"
+msgstr "grup düzenle"
+
+#: usr/local/www/interfaces_groups.php:131
+msgid ""
+"Do you really want to delete this group? All elements that still use it will "
+"become invalid (e.g. filter rules)!"
+msgstr ""
+"Bu grubu silmek istediğinize emin misiniz? Bu grubu kullanan öğeler (örn. "
+"filtre kuralları) devre dışı kalacaktır!"
+
+#: usr/local/www/interfaces_groups.php:131
+msgid "delete ifgroupentry"
+msgstr "eğer grubu girdisini sil"
+
+#: usr/local/www/interfaces_groups.php:143
+msgid "add a new group"
+msgstr "yeni grup ekle"
+
+#: usr/local/www/interfaces_groups.php:150
+msgid ""
+"Interface Groups allow you to create rules that apply to multiple interfaces "
+"without duplicating the rules. If you remove members from an interface "
+"group, the group rules no longer apply to that interface."
+msgstr ""
+"Arabirim Grupları kuralların birden fazla kopyasını çıkarmadan birden fazla "
+"arabirime uygulanacak kurallar oluşturmanıza olanak verir. Bir arabirim "
+"grubunun bir üyesi silindiğinde grup kuralları artık o arabirime uygulanmaz."
+
+#: usr/local/www/interfaces_groups_edit.php:75
+msgid "Group name already exists!"
+msgstr "Grup adı sistemde mevcut!"
+
+#: usr/local/www/interfaces_groups_edit.php:78
+msgid "Only letters A-Z are allowed as the group name."
+msgstr "Grup adında sadece İngilizce A-Z harfleri kullanılabilir."
+
+#: usr/local/www/interfaces_groups_edit.php:250
+msgid "Interface Groups Edit"
+msgstr "Arabirim Gruplarını Düzenle"
+
+#: usr/local/www/interfaces_groups_edit.php:253
+#: usr/local/www/status_gateway_groups.php:76
+#: usr/local/www/system_gateway_groups.php:131
+#: usr/local/www/system_gateway_groups_edit.php:235
+#: usr/local/www/system_gateway_groups_edit.php:238
+#: usr/local/www/system_groupmanager.php:143
+msgid "Group Name"
+msgstr "Grup Adı"
+
+#: usr/local/www/interfaces_groups_edit.php:257
+msgid "No numbers or spaces are allowed. Only characters in a-zA-Z"
+msgstr ""
+"Sayı ve boşluk kullanılamaz. Sadece İngilizce a-z ve A-Z harfleri "
+"kullanılabilir"
+
+#: usr/local/www/interfaces_groups_edit.php:271
+#: usr/local/www/interfaces_qinq_edit.php:353
+msgid "Member (s)"
+msgstr "Üye (ler)"
+
+#: usr/local/www/interfaces_groups_edit.php:326
+msgid ""
+"Rules for WAN type interfaces in groups do not contain the reply-to "
+"mechanism upon which Multi-WAN typically relies."
+msgstr ""
+
+#: usr/local/www/interfaces_groups_edit.php:327
+msgid "More Information"
+msgstr ""
+
+#: usr/local/www/interfaces_lagg.php:75
+msgid "This LAGG interface cannot be deleted because it is still being used."
+msgstr "Bu LAGG arabirimi kullanımda olduğundan silinemez."
+
+#: usr/local/www/interfaces_lagg.php:146
+msgid ""
+"LAGG allows for link aggregation, bonding and fault tolerance. Only "
+"unassigned interfaces can be added to LAGG."
+msgstr ""
+"LAGG bağlantı toplamaya, bağlanmaya ve hata toleransına izin verir. Sadece "
+"atanmamış arabirimler LAGG'a eklenebilir."
+
+#: usr/local/www/interfaces_lagg_edit.php:92
+msgid "Lagg protocol"
+msgstr "LAGG protokolü"
+
+#: usr/local/www/interfaces_lagg_edit.php:99
+#: usr/local/www/interfaces_lagg_edit.php:102
+msgid "Interface supplied as member is invalid"
+msgstr "Arabirime verilen kullanıcı geçersiz"
+
+#: usr/local/www/interfaces_lagg_edit.php:105
+msgid "Protocol supplied is invalid"
+msgstr "Verilen protokol geçersiz"
+
+#: usr/local/www/interfaces_lagg_edit.php:149
+msgid "LAGG configuration"
+msgstr "LAGG yapılandırması"
+
+#: usr/local/www/interfaces_lagg_edit.php:167
+msgid "Choose the members that will be used for the link aggregation"
+msgstr "Bağlantı toplamada kullanılacak üyeleri seçin"
+
+#: usr/local/www/interfaces_lagg_edit.php:170
+msgid "Lag proto"
+msgstr "Lag protokolü"
+
+#: usr/local/www/interfaces_lagg_edit.php:185
+msgid "failover"
+msgstr "yük aktarma"
+
+#: usr/local/www/interfaces_lagg_edit.php:186
+msgid ""
+"Sends and receives traffic only through the master port. If the master port "
+"becomes unavailable, the next active port is used. The first interface "
+"added is the master port; any interfaces added after that are used as "
+"failover devices."
+msgstr ""
+"Sadece ana portu kullanarak trafik gönderir ve alır. Eğer ana port devre "
+"dışı kalırsa bir sonraki aktif port kullanılır. İlk eklenen arabirim ana "
+"porttur, daha sonra eklenenler yük aktarma için kullanılır."
+
+#: usr/local/www/interfaces_lagg_edit.php:191
+msgid "fec"
+msgstr "fec"
+
+#: usr/local/www/interfaces_lagg_edit.php:191
+msgid ""
+"Supports Cisco EtherChannel. This is a static setup and does not negotiate "
+"aggregation with the peer or exchange frames to monitor the link."
+msgstr ""
+"Cisco EtherChannel destekler. Bu statik bir yapılandırmadır; eş ile toplama "
+"anlaşması veya bağlantıyı takip etmek için çerçeve alışverişi yapmaz."
+
+#: usr/local/www/interfaces_lagg_edit.php:195
+msgid "lacp"
+msgstr "lacp"
+
+#: usr/local/www/interfaces_lagg_edit.php:195
+msgid ""
+"Supports the IEEE 802.3ad Link Aggregation Control Protocol (LACP) and the "
+"Marker Protocol. LACP will negotiate a set of aggregable links with the "
+"peer in to one or more Link Aggregated Groups. Each LAG is composed of "
+"ports of the same speed, set to full-duplex operation. The traffic will be "
+"balanced across the ports in the LAG with the greatest total speed, in most "
+"cases there will only be one LAG which contains all ports. In the event of "
+"changes in physical connectivity, Link Aggregation will quickly converge to "
+"a new configuration."
+msgstr ""
+"IEEE 802.3ad Bağlantı Toplama Kontrol Protokolünü (LACP - Link Aggregation "
+"Control Protocol) ve İşaretleme Protokolünü (Marker Protocol) destekler. "
+"LACP eş ile bir veya daha fazla Bağlantı Toplama Grubuna (LAG - Link "
+"Aggregated Group) bir dizi anlaşılmış bağlantı görüşecektir. Her LAG full-"
+"duplex çalışmaya ayarlanmış aynı hızda portlardan oluşur. Trafik LAG'daki "
+"portlar arasında dengelenir ve böylece en yüksek toplam hız elde edilir; "
+"çoğu durumda tüm portları içeren tek bir LAG olur. Fiziksel "
+"bağlanılabilirlik değişikliklerinde Bağlantı Toplama hemen yeni "
+"yapılandırmaya geçer."
+
+#: usr/local/www/interfaces_lagg_edit.php:206
+msgid "loadbalance"
+msgstr "yük dengeleme"
+
+#: usr/local/www/interfaces_lagg_edit.php:206
+msgid ""
+"Balances outgoing traffic across the active ports based on hashed protocol "
+"header information and accepts incoming traffic from any active port. This "
+"is a static setup and does not negotiate aggregation with the peer or "
+"exchange frames to monitor the link. The hash includes the Ethernet source "
+"and destination address, and, if available, the VLAN tag, and the IP source "
+"and destination address"
+msgstr ""
+"Dışarıya giden trafiği protokol başlık bilgisine göre etkin portlar arasında "
+"dengeler ve tüm etkin portlardan gelen trafiği kabul eder. Bu statik bir "
+"yapılandırmadır; eş ile toplama görüşmesi yapmaz ve bağlantıyı izlemek için "
+"çerçeve alışverişinde bulunmaz. Protokol başlık bilgisinde kullanılan "
+"değerleme Ethernet kaynak ve hedef adresini, varsa VLAN takısını ve IP "
+"kaynak ve hedef adresini içerir"
+
+#: usr/local/www/interfaces_lagg_edit.php:214
+msgid "roundrobin"
+msgstr "dairesel denetim"
+
+#: usr/local/www/interfaces_lagg_edit.php:214
+msgid ""
+"Distributes outgoing traffic using a round-robin scheduler through all "
+"active ports and accepts incoming traffic from any active port"
+msgstr ""
+"Dışarı giden trafiği bir dairesel denetim tarifeleyici kullanarak tüm etkin "
+"portlar arasında dağıtır ve tüm etkin portlardan gelen trafiği kabul eder"
+
+#: usr/local/www/interfaces_lagg_edit.php:218
+msgid ""
+"This protocol is intended to do nothing: it disables any traffic without "
+"disabling the lagg interface itself"
+msgstr ""
+"Bu protokol hiçbirşey yapmamak için tasarlanmıştır: LAGG arabirimini "
+"kapatmadan tüm trafiği kapatır"
+
+#: usr/local/www/interfaces_ppps.php:63
+msgid ""
+"This point-to-point link cannot be deleted because it is still being used as "
+"an interface."
+msgstr ""
+"Bu noktadan noktaya bağlantı bir arabirim olarak kullanıldığından "
+"silinemiyor."
+
+#: usr/local/www/interfaces_ppps.php:79
+msgid "Interfaces: PPPs"
+msgstr "Arabirimler: PPPler"
+
+#: usr/local/www/interfaces_ppps.php:111
+msgid "Interface(s)/Port(s)"
+msgstr "Arabirim(ler)/Port(lar)"
+
+#: usr/local/www/interfaces_ppps.php:134
+msgid "Do you really want to delete this PPP interface?"
+msgstr "Bu PPP arabirimini silmek istediğinize emin misiniz?"
+
+#: usr/local/www/interfaces_ppps_edit.php:193
+#: usr/local/www/interfaces_ppps_edit.php:199
+#: usr/local/www/interfaces_ppps_edit.php:202
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+msgid "Link Interface(s)"
+msgstr "Bağlantı Arabirim(ler)i"
+
+#: usr/local/www/interfaces_ppps_edit.php:210
+#: usr/local/www/interfaces_ppps_edit.php:213
+#: usr/local/www/services_dhcp.php:804 usr/local/www/services_dhcpv6.php:555
+msgid "Subnet"
+msgstr "Altağ"
+
+#: usr/local/www/interfaces_ppps_edit.php:218
+msgid "Please choose a Link Type."
+msgstr "Bağlantı türü seçiniz."
+
+#: usr/local/www/interfaces_ppps_edit.php:222
+msgid ""
+"Multilink connections (MLPPP) using the PPP link type is not currently "
+"supported. Please select only one Link Interface."
+msgstr ""
+"PPP bağlantı türüyle çoklu bağlantı (MLPPP) henüz desteklenmiyor. Lütfen "
+"sadece bir bağlantı arabirimi seçin."
+
+#: usr/local/www/interfaces_ppps_edit.php:224
+msgid "The Service name contains invalid characters."
+msgstr "Servis adı geçersiz karakterler içeriyor."
+
+#: usr/local/www/interfaces_ppps_edit.php:226
+msgid "Do not specify both a Service name and a NULL Service name."
+msgstr "Hem bir servis adı hem de Boş servis adı belirtmeyin."
+
+#: usr/local/www/interfaces_ppps_edit.php:240
+msgid ""
+"A valid PPPoE reset month must be specified (1-12) in the Custom PPPoE "
+"Periodic reset fields."
+msgstr ""
+"Özel PPPoE düzenli sıfırlama alanlarında çeçerli bir PPPoE sıfırlama ayı "
+"(1-12) belirtmelisiniz."
+
+#: usr/local/www/interfaces_ppps_edit.php:242
+msgid ""
+"A valid PPPoE reset day of month must be specified (1-31) in the Custom "
+"PPPoE Periodic reset fields. No checks are done on valid # of days per month"
+msgstr ""
+"Özel PPPoE düzenli sıfırlama alanlarında çeçerli bir PPPoE sıfırlama günü "
+"(1-31) belirtmelisiniz. Her ayın farklı sayıda günden oluştuğunu da unutmayın"
+
+#: usr/local/www/interfaces_ppps_edit.php:244
+msgid ""
+"A valid PPPoE reset year must be specified. Don't select a year in the past!"
+msgstr ""
+"Geçerli bir PPPoE sıfırlama yılı giriniz. Geçmişteki bir yıl "
+"belirtilmemelidir!"
+
+#: usr/local/www/interfaces_ppps_edit.php:249
+#, php-format
+msgid "A valid local IP address must be specified for %s."
+msgstr "%s için geçerli bir yerel IP adresi belirtilmelidir."
+
+#: usr/local/www/interfaces_ppps_edit.php:251
+#, php-format
+msgid "A valid gateway IP address OR hostname must be specified for %s."
+msgstr "%s geçerli bir ağ geçidi IP adresi ya da host adı tanımlanmalıdır."
+
+#: usr/local/www/interfaces_ppps_edit.php:253
+#, php-format
+msgid "The bandwidth value for %s must be an integer."
+msgstr "%s bant genişliği tamsayı olarak girilmelidir."
+
+#: usr/local/www/interfaces_ppps_edit.php:255
+#, php-format
+msgid "The MTU for %s must be greater than 576 bytes."
+msgstr "%s MTU değeri 576 bayttan büyük olmalıdır."
+
+#: usr/local/www/interfaces_ppps_edit.php:257
+#, php-format
+msgid "The MRU for %s must be greater than 576 bytes."
+msgstr "%s MRU değeri 576 bayttan büyük olmalıdır."
+
+#: usr/local/www/interfaces_ppps_edit.php:393
+#: usr/local/www/system_authservers.php:605
+msgid "Select"
+msgstr "Seç"
+
+#: usr/local/www/interfaces_ppps_edit.php:412
+msgid "PPPs configuration"
+msgstr "PPP yapılandırması"
+
+#: usr/local/www/interfaces_ppps_edit.php:415
+msgid "Link Type"
+msgstr "Bağlantı Türü"
+
+#: usr/local/www/interfaces_ppps_edit.php:430
+msgid "Link interface(s)"
+msgstr "Bağlantı arabirim(ler)i"
+
+#: usr/local/www/interfaces_ppps_edit.php:436
+msgid "Select at least two interfaces for Multilink (MLPPP) connections."
+msgstr "Çoklu bağlantı (MLPPP) için en az iki arabirim seçmelisiniz."
+
+#: usr/local/www/interfaces_ppps_edit.php:485
+msgid ""
+"You may enter a description here for your reference. Description will appear "
+"in the \"Interfaces Assign\" select lists."
+msgstr ""
+"Buraya kendiniz için bir açıklama girebilirsiniz. Açıklama \"Arabirim Ataması"
+"\" seçim listelerinde çıkar."
+
+#: usr/local/www/interfaces_ppps_edit.php:539
+msgid "Note: Typically *99# for GSM networks and #777 for CDMA networks"
+msgstr "Not: Genelde, GSM ağları için *99# ve CDMA ağları için #777'dir"
+
+#: usr/local/www/interfaces_ppps_edit.php:553
+msgid "APN number (optional)"
+msgstr "APN numarası (isteğe bağlı)"
+
+#: usr/local/www/interfaces_ppps_edit.php:556
+msgid ""
+"Note: Defaults to 1 if you set APN above. Ignored if you set no APN above."
+msgstr ""
+"Not: APN belirttiyseniz varsayılan olarak 1'dir. APN belirtmediyseniz "
+"gözardı edilir."
+
+#: usr/local/www/interfaces_ppps_edit.php:560
+msgid "SIM PIN"
+msgstr "SIM PIN"
+
+#: usr/local/www/interfaces_ppps_edit.php:567
+msgid "SIM PIN wait"
+msgstr "SIM PIN beklemesi"
+
+#: usr/local/www/interfaces_ppps_edit.php:570
+msgid ""
+"Note: Time to wait for SIM to discover network after PIN is sent to SIM "
+"(seconds)."
+msgstr ""
+"Not: SIM kartının PIN girildikten sonra ağı bulması için beklenecek süre "
+"(saniye cinsinden)."
+
+#: usr/local/www/interfaces_ppps_edit.php:574
+msgid "Init String"
+msgstr "Açılış Dizesi"
+
+#: usr/local/www/interfaces_ppps_edit.php:577
+msgid ""
+"Note: Enter the modem initialization string here. Do NOT include the \"AT\" "
+"string at the beginning of the command. Many modern USB 3G modems don't need "
+"an initialization string."
+msgstr ""
+"Not: Buraya modem açılış dizesini girin. Komutun başındaki \"AT\" dizesini "
+"yazmayın. Çoğu modern USB 3G modemin bir açılış dizesine ihtiyacı yoktur."
+
+#: usr/local/www/interfaces_ppps_edit.php:582
+msgid "Connection Timeout"
+msgstr "Bağlantı Zaman Aşımı"
+
+#: usr/local/www/interfaces_ppps_edit.php:585
+msgid ""
+"Note: Enter timeout in seconds for connection to be established (sec.) "
+"Default is 45 sec."
+msgstr ""
+"Not: Bağlantının kurulması için en fazla beklenmesi gereken süreyi saniye "
+"cinsinden girin. Varsayılan olarak 45 saniyedir."
+
+#: usr/local/www/interfaces_ppps_edit.php:589
+msgid "Uptime Logging"
+msgstr "Geçen Süre Günlükleme"
+
+#: usr/local/www/interfaces_ppps_edit.php:591
+msgid "Enable persistent logging of connection uptime."
+msgstr "Bağlantı süresinin kalıcı olarak günlüklenmesini aç."
+
+#: usr/local/www/interfaces_ppps_edit.php:592
+msgid ""
+"This option causes cumulative uptime to be recorded and displayed on the "
+"Status Interfaces page."
+msgstr ""
+"Bu seçenek toplam etkinlik süresinin kaydedilmesini ve Arabirim Durumları "
+"sayfasında gösterilmesini açar."
+
+#: usr/local/www/interfaces_ppps_edit.php:604
+msgid "Configure a NULL Service name"
+msgstr "Boş servis adını yapılandır"
+
+#: usr/local/www/interfaces_ppps_edit.php:605
+msgid ""
+"Hint: this field can usually be left empty. Service name will not be "
+"configured if this field is empty. Check the \"Configure NULL\" box to "
+"configure a blank Service name."
+msgstr ""
+"İpucu: Bu alan genellikle boş bırakılabilir ve boş bırakıldığında servis adı "
+"yapılandırılmaz. Boş bir servis adını yapılandırmak için \"Boş servisi "
+"yapılandır\" kutusunu işaretleyin."
+
+#: usr/local/www/interfaces_ppps_edit.php:680
+msgid "IP Address OR Hostname"
+msgstr "IP Adresi ya da Host Adı"
+
+#: usr/local/www/interfaces_ppps_edit.php:691
+msgid "Dial On Demand"
+msgstr "Gerektiğinde Arama"
+
+#: usr/local/www/interfaces_ppps_edit.php:693
+msgid "Enable Dial-on-Demand mode"
+msgstr "Gerektiğinde Arama kipini etkinleştir"
+
+#: usr/local/www/interfaces_ppps_edit.php:694
+msgid ""
+"This option causes the interface to operate in dial-on-demand mode. Do NOT "
+"enable if you want your link to be always up. The interface is configured, "
+"but the actual connection of the link is delayed until qualifying outgoing "
+"traffic is detected."
+msgstr ""
+"Bu seçenek arabiriminde gerektiğinde arama kipinde çalışmasını sağlar. Eğer "
+"bağlantının sürekli açık olmasını istiyorsanız bu seçeneği AÇMAYIN. Arabirim "
+"yapılandırılır ama dışarı trafik çıkana kadar bağlantı sağlanmaz."
+
+#: usr/local/www/interfaces_ppps_edit.php:699
+msgid "Idle Timeout"
+msgstr "Boşta Kalma Zaman Aşımı"
+
+#: usr/local/www/interfaces_ppps_edit.php:701
+msgid "(seconds) Default is 0, which disables the timeout feature."
+msgstr ""
+"(Saniye) cinsindendir. Varsayılan değer olan 0 zaman aşımı süresini devre "
+"dışı bırakır."
+
+#: usr/local/www/interfaces_ppps_edit.php:702
+msgid ""
+"If no incoming or outgoing packets are transmitted for the entered number of "
+"seconds the connection is brought down."
+msgstr ""
+"Girilen süre boyunca gelen yada giden paket trafiği oluşmazsa bağlantı "
+"kapatılır."
+
+#: usr/local/www/interfaces_ppps_edit.php:703
+msgid ""
+"When the idle timeout occurs, if the dial-on-demand option is enabled, mpd "
+"goes back into dial-on-demand mode. Otherwise, the interface is brought down "
+"and all associated routes removed."
+msgstr ""
+"Boşta kalma zamanı dolduğunda, eğer gerektiğinde arama özelliği açıksa mpd "
+"gerektiğinde arama kipine döner. Aksi taktirde bağlantı kapatılır ve "
+"ilişkili tüm rotalar kaldırılır."
+
+#: usr/local/www/interfaces_ppps_edit.php:707
+#: usr/local/www/vpn_openvpn_client.php:956
+#: usr/local/www/vpn_openvpn_server.php:1349
+msgid "Compression"
+msgstr "Sıkıştırma"
+
+#: usr/local/www/interfaces_ppps_edit.php:709
+msgid "Disable vjcomp(compression) (auto-negotiated by default)."
+msgstr ""
+"vjcomp'u (sıkıştırma) devre dışı bırak. Varsayılan olarak karşı taraftan "
+"gelen değere göre davranılır."
+
+#: usr/local/www/interfaces_ppps_edit.php:710
+msgid ""
+"This option enables Van Jacobson TCP header compression, which saves several "
+"bytes per TCP data packet. You almost always want this option. This "
+"compression ineffective for TCP connections with enabled modern extensions "
+"like time stamping or SACK, which modify TCP options between sequential "
+"packets."
+msgstr ""
+"Bu seçenek Van Jacobson TCP başlık sıkıştırmasını açar, bu da her TCP veri "
+"paketinde birkaç bayt kazandırır. Bu seçenek neredeyse her zaman açık "
+"olmalıdır. Ardışık paketlerde TCP seçeneklerini değiştiren zaman damgası ve "
+"SACK gibi modern eklentileri açık TCP bağlantılarında etkisizdir."
+
+#: usr/local/www/interfaces_ppps_edit.php:716
+msgid "TCPmssFix"
+msgstr "TCPmssFix"
+
+#: usr/local/www/interfaces_ppps_edit.php:718
+msgid "Disable tcpmssfix (enabled by default)."
+msgstr "tcpmssfix'i kapat (varsayılan olarak etkin)."
+
+#: usr/local/www/interfaces_ppps_edit.php:719
+msgid ""
+"This option causes mpd to adjust incoming and outgoing TCP SYN segments so "
+"that the requested maximum segment size is not greater than the amount "
+"allowed by the interface MTU. This is necessary in many setups to avoid "
+"problems caused by routers that drop ICMP Datagram Too Big messages. Without "
+"these messages, the originating machine sends data, it passes the rogue "
+"router then hits a machine that has an MTU that is not big enough for the "
+"data. Because the IP Don't Fragment option is set, this machine sends an "
+"ICMP Datagram Too Big message back to the originator and drops the packet. "
+"The rogue router drops the ICMP message and the originator never gets to "
+"discover that it must reduce the fragment size or drop the IP Don't Fragment "
+"option from its outgoing data."
+msgstr ""
+"Bu seçenek mpd'nin gelen ve giden TCP SYN paketlerini istenen en yüksek "
+"paket boyutunun arabirim MTU'sunun izin verdiğinden büyük olmamasını "
+"sağlayacak şekilde değiştirmesini sağlar. Bu ayar, \"ICMP Datagram Çok Büyük"
+"\" mesajlarını silen yönlendiricilerin (router) neden olduğu problemleri "
+"engellemek için gereklidir. Bu mesajlar olmadığında, paketin çıktığı makine "
+"veriyi gönderir, paket yönlendiriciden gelen ve MTU'su veri için yeterince "
+"yüksek olmayan makineye ulaşır, IP Bölmeme (IP Don't Fragment) seçeneği açık "
+"olduğu için de makine geriye ICMP Datagram Çok Büyük yanıtıyla paketi siler. "
+"Yönlendirici ise bu ICMP mesajını sildiğinden ilk paketi gönderen makine "
+"parça boyutunu küçültmesi ya da IP Bölmeme seçeneğini kaldırması gerektiğini "
+"öğrenemez."
+
+#: usr/local/www/interfaces_ppps_edit.php:727
+msgid "ShortSeq"
+msgstr "ShortSeq"
+
+#: usr/local/www/interfaces_ppps_edit.php:729
+msgid "Disable shortseq (auto-negotiated by default)."
+msgstr ""
+"shortseq'i kapat (varsayılan olarak karşı tarafla anlaşarak belirlenir)."
+
+#: usr/local/www/interfaces_ppps_edit.php:730
+msgid ""
+"This option is only meaningful if multi-link PPP is negotiated. It "
+"proscribes shorter multi-link fragment headers, saving two bytes on every "
+"frame. It is not necessary to disable this for connections that are not "
+"multi-link."
+msgstr ""
+"Bu seçenek sadece çoklu PPP bağlantısı açıksa anlamlıdır. Daha kısa çoklu "
+"bağlantı parça başlıkları oluşturarak her çerçevede 2 bayt kazanır. Bağlantı "
+"çoklu türde değilse kapatmaya gerek yoktur."
+
+#: usr/local/www/interfaces_ppps_edit.php:735
+msgid "ACFComp"
+msgstr "ACFComp"
+
+#: usr/local/www/interfaces_ppps_edit.php:737
+msgid "Disable acfcomp (compression) (auto-negotiated by default)."
+msgstr ""
+"ACFComp'u (sıkıştırma) kapat (varsayılan olarak eşle anlaşılarak atanır)."
+
+#: usr/local/www/interfaces_ppps_edit.php:738
+msgid ""
+"Address and control field compression. This option only applies to "
+"asynchronous link types. It saves two bytes per frame."
+msgstr ""
+"Adres ve kontrol alanı sıkıştırması. Bu seçenek sadece asenkron bağlantı "
+"türlerinde geçerlidir. Çerçeve başına 2 bayt kazanır."
+
+#: usr/local/www/interfaces_ppps_edit.php:742
+msgid "ProtoComp"
+msgstr "ProtoComp"
+
+#: usr/local/www/interfaces_ppps_edit.php:744
+msgid "Disable protocomp (compression) (auto-negotiated by default)."
+msgstr ""
+"ProtoComp'u (sıkıştırma) kapat (varsayılan olarak eşle anlaşılarak atanır)."
+
+#: usr/local/www/interfaces_ppps_edit.php:745
+msgid ""
+"Protocol field compression. This option saves one byte per frame for most "
+"frames."
+msgstr "Protokol alanı sıkıştırması. Bu seçenek çoğu çerçevede 1 bayt kazanır."
+
+#: usr/local/www/interfaces_ppps_edit.php:758
+msgid "Link Parameters"
+msgstr "Bağlantı Paremetreleri"
+
+#: usr/local/www/interfaces_ppps_edit.php:765
+msgid ""
+"Set ONLY for MLPPP connections and ONLY when links have different bandwidths."
+msgstr ""
+"Sadece MLPPP bağlantılarında ve sadece farklı bant genişliğine sahip hatlar "
+"var ise kullanınız."
+
+#: usr/local/www/interfaces_ppps_edit.php:772
+msgid "MTU will default to 1492."
+msgstr "MTU varsayılan değeri 1492 olarak atanacak."
+
+#: usr/local/www/interfaces_ppps_edit.php:776
+msgid "MRU"
+msgstr "MRU"
+
+#: usr/local/www/interfaces_ppps_edit.php:779
+#: usr/local/www/interfaces_ppps_edit.php:786
+msgid "will be auto-negotiated by default."
+msgstr "varsayılan olarak karşı tarafla anlaşılarak atanır."
+
+#: usr/local/www/interfaces_ppps_edit.php:783
+msgid "MRRU"
+msgstr "MRRU"
+
+#: usr/local/www/interfaces_ppps_edit.php:786
+msgid "Set ONLY for MLPPP connections."
+msgstr "Sadece MLPPP bağlantıları için açın."
+
+#: usr/local/www/interfaces_qinq.php:67
+msgid ""
+"This QinQ cannot be deleted because it is still being used as an interface."
+msgstr "Bir arabirim olarak kullanıldığından bu QinQ silinemiyor."
+
+#: usr/local/www/interfaces_qinq.php:69
+msgid "QinQ interface does not exist"
+msgstr "QinQ arabirimi mevcut değil"
+
+#: usr/local/www/interfaces_qinq.php:90
+#: usr/local/www/interfaces_qinq_edit.php:40
+msgid "QinQ"
+msgstr "QinQ"
+
+#: usr/local/www/interfaces_qinq.php:122
+#: usr/local/www/interfaces_qinq_edit.php:362
+msgid "Tag"
+msgstr "Başlık"
+
+#: usr/local/www/interfaces_qinq.php:123
+msgid "QinQ members"
+msgstr "QinQ üyeleri"
+
+#: usr/local/www/interfaces_qinq.php:147
+msgid "Do you really want to delete this QinQ?"
+msgstr "Bu QinQ'i silmek istediğinize emin misiniz?"
+
+#: usr/local/www/interfaces_qinq.php:158
+#, php-format
+msgid ""
+"Not all drivers/NICs support 802.1Q QinQ tagging properly. On cards that do "
+"not explicitly support it, QinQ tagging will still work, but the reduced MTU "
+"may cause problems. See the %s handbook for information on supported cards."
+msgstr ""
+"Tüm sürücüler ve NICler 802.1q QinQ başlıklarını desteklemez. Özel olarak "
+"desteklediği belirtilmeyen kartlarda QinQ yine de çalışır, ama düşen MTU "
+"değeri problem çıkarabilir. Desteklenen kartlar için %s El Kitabına bakın."
+
+#: usr/local/www/interfaces_qinq_edit.php:87
+msgid "First level tag cannot be empty."
+msgstr "Birinci seviye başlığı boş olamaz."
+
+#: usr/local/www/interfaces_qinq_edit.php:89
+msgid ""
+"You are editing an existing entry and modifying the first level tag is not "
+"allowed."
+msgstr ""
+"Varolan bir girdiyi düzenliyorsunuz ve ilk seviye başlığın düzenlenmesine "
+"izin verilmemektedir."
+
+#: usr/local/www/interfaces_qinq_edit.php:91
+msgid ""
+"You are editing an existing entry and modifying the interface is not allowed."
+msgstr ""
+"Varolan bir girdiyi düzenliyorsunuz ve arabirimi değiştirmeye izin verilmez."
+
+#: usr/local/www/interfaces_qinq_edit.php:95
+msgid "QinQ level already exists for this interface, edit it!"
+msgstr "QinQ seviyesi bu arabirim için zaten tanımlı, düzenleyiniz!"
+
+#: usr/local/www/interfaces_qinq_edit.php:99
+msgid ""
+"A normal VLAN exists with this tag please remove it to use this tag for QinQ "
+"first level."
+msgstr ""
+"Bu başlığı taşıyan normal bir VLAN zaten var, bu başlığı QinQ ilk seviye "
+"olarak kullanmak için onu silmelisiniz."
+
+#: usr/local/www/interfaces_qinq_edit.php:126
+#: usr/local/www/interfaces_qinq_edit.php:136
+msgid "Tags can contain only numbers or a range in format #-#."
+msgstr "Başlıklar sadece sayı ve #-# biçiminde aralık içerebilir."
+
+#: usr/local/www/interfaces_qinq_edit.php:199
+msgid "QinQ VLANs group"
+msgstr "QinQ VLANlar grubu"
+
+#: usr/local/www/interfaces_qinq_edit.php:274
+msgid "members"
+msgstr "üyeler"
+
+#: usr/local/www/interfaces_qinq_edit.php:278
+msgid "detail"
+msgstr "detay"
+
+#: usr/local/www/interfaces_qinq_edit.php:291
+msgid "Interface QinQ Edit"
+msgstr "Arabirim QinQ'ini düzenle"
+
+#: usr/local/www/interfaces_qinq_edit.php:311
+msgid "Only QinQ capable interfaces will be shown."
+msgstr "Sadece QinQ uyumlu arabirimler görüntüleniyor."
+
+#: usr/local/www/interfaces_qinq_edit.php:314
+msgid "First level tag"
+msgstr "İlk seviye başlığı"
+
+#: usr/local/www/interfaces_qinq_edit.php:319
+msgid ""
+"This is the first level VLAN tag. On top of this are stacked the member "
+"VLANs defined below."
+msgstr ""
+"İlk seviye VLAN başlığıdır. Bunun üzerine aşağıda tanımlanan üye VLAN "
+"iliştirilir."
+
+#: usr/local/www/interfaces_qinq_edit.php:324
+#: usr/local/www/load_balancer_relay_action.php:141
+#: usr/local/www/load_balancer_relay_action_edit.php:516
+#: usr/local/www/load_balancer_relay_action_edit.php:536
+#: usr/local/www/load_balancer_relay_protocol.php:135
+msgid "Options"
+msgstr "Seçenekler"
+
+#: usr/local/www/interfaces_qinq_edit.php:339
+msgid ""
+"Adds interface to QinQ interface groups so you can write filter rules easily."
+msgstr ""
+"Arabirimi QinQ arabirim grubuna ekleyerek filtreleme kuralı yazmayı "
+"kolaylaştırır."
+
+#: usr/local/www/interfaces_qinq_edit.php:356
+msgid ""
+"You can specify ranges in the input below. The format is pretty simple i.e "
+"9-100 or 10.20..."
+msgstr ""
+"Aşağıdaki giriş alanında aralık belirtebilirsiniz. Yapısı basittir, 9-100 "
+"veya 10.20... biçiminde yazabilirsiniz."
+
+#: usr/local/www/interfaces_vlan.php:70
+msgid ""
+"This VLAN cannot be deleted because it is still being used as an interface."
+msgstr "Bu VLAN bir arabirim olarak kullanıldığından silinemez."
+
+#: usr/local/www/interfaces_vlan.php:84
+#: usr/local/www/interfaces_vlan_edit.php:152
+msgid "VLAN"
+msgstr "VLAN"
+
+#: usr/local/www/interfaces_vlan.php:116
+#: usr/local/www/interfaces_vlan_edit.php:79
+msgid "VLAN tag"
+msgstr "VLAN başlığı"
+
+#: usr/local/www/interfaces_vlan.php:132
+msgid "Do you really want to delete this VLAN?"
+msgstr "Bu VLANı silmek istediğinize emin misiniz?"
+
+#: usr/local/www/interfaces_vlan.php:143
+#, php-format
+msgid ""
+"Not all drivers/NICs support 802.1Q VLAN tagging properly. On cards that do "
+"not explicitly support it, VLAN tagging will still work, but the reduced MTU "
+"may cause problems. See the %s handbook for information on supported cards."
+msgstr ""
+"Tüm sürücüler ve NICler 802.1q VLAN başlıklarını desteklemez. Özel olarak "
+"desteklediği belirtilmeyen kartlarda VLAN başlıklama yine de çalışır, ama "
+"düşen MTU değeri problem çıkarabilir. Desteklenen kartlar için %s El "
+"Kitabına bakın."
+
+#: usr/local/www/interfaces_vlan_edit.php:84
+msgid "The VLAN tag must be an integer between 1 and 4094."
+msgstr "VLAN başlığı ile 4094 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/interfaces_vlan_edit.php:88
+msgid "Interface supplied as parent is invalid"
+msgstr "Arabirime verilen aile(üst-parent) geçersiz"
+
+#: usr/local/www/interfaces_vlan_edit.php:93
+msgid ""
+"Interface is assigned and you cannot change the VLAN tag while assigned."
+msgstr ""
+
+#: usr/local/www/interfaces_vlan_edit.php:101
+#, php-format
+msgid "A VLAN with the tag %s is already defined on this interface."
+msgstr "%s başlığa sahip VLAN bu arabirimde tanımlanmış durumda."
+
+#: usr/local/www/interfaces_vlan_edit.php:108
+msgid "A QinQ VLAN exists with this tag please remove it to use this tag with."
+msgstr ""
+"Bu başlığa sahip bir QinQ VLAN zaten var, lütfen bu takıyı kullanmak için "
+"önce onu silin."
+
+#: usr/local/www/interfaces_vlan_edit.php:164
+msgid "VLAN configuration"
+msgstr "VLAN yapılandırması"
+
+#: usr/local/www/interfaces_vlan_edit.php:183
+msgid "Only VLAN capable interfaces will be shown."
+msgstr "Sadece VLAN uyumlu arabirimler görüntülenir."
+
+#: usr/local/www/interfaces_vlan_edit.php:186
+msgid "VLAN tag "
+msgstr "VLAN başlığı "
+
+#: usr/local/www/interfaces_vlan_edit.php:190
+msgid "802.1Q VLAN tag (between 1 and 4094) "
+msgstr "802.1q VLAN başlığı (1 ile 4094 arasında) "
+
+#: usr/local/www/interfaces_wireless.php:66
+msgid ""
+"This wireless clone cannot be deleted because it is assigned as an interface."
+msgstr "Bu kablosuz klonu bir arabirim olarak atandığından silinemez."
+
+#: usr/local/www/interfaces_wireless.php:128
+msgid "Do you really want to delete this wireless clone?"
+msgstr "Bu kablosuz klonunu silmek istediğinize emin misiniz?"
+
+#: usr/local/www/interfaces_wireless.php:139
+msgid ""
+"Here you can configure clones of wireless interfaces, which can be assigned "
+"as separate independent interfaces. Only available on wireless chipsets that "
+"support this, with limitations on the number that can be created in each "
+"mode."
+msgstr ""
+"Bu alandan kablosuz arabirimlerin bağımsız arabirim olarak atanacak "
+"klonlarını yapılandırabilirsiniz. Sadece bu özelliği destekleyen "
+"arabirimlerde, her kipte oluşturulabilecek klon sayısı sınırlı olmak "
+"kaydıyla, çalışır."
+
+#: usr/local/www/interfaces_wireless_edit.php:122
+msgid ""
+"This wireless clone cannot be modified because it is still assigned as an "
+"interface."
+msgstr "Bir arabirim olarak kullanıldığından bu kablosuz klonu değiştirilemez."
+
+#: usr/local/www/interfaces_wireless_edit.php:124
+msgid ""
+"Use the configuration page for the assigned interface to change the mode."
+msgstr ""
+"Kipi değiştirmek için atanmış arabirimin yapılandırma sayfasını kullanınız."
+
+#: usr/local/www/interfaces_wireless_edit.php:129
+#, php-format
+msgid ""
+"Error creating interface with mode %1$s. The %2$s interface may not support "
+"creating more clones with the selected mode."
+msgstr ""
+"%1$s kipinde arabirim oluşturulurken hata oluştu. %2$s arabirimi seçili "
+"kipte daha fazla klon oluşturulmasını desteklemiyor olabilir."
+
+#: usr/local/www/interfaces_wireless_edit.php:134
+#, php-format
+msgid "Created with id %s"
+msgstr "%s kimliği ile oluşturuldu"
+
+#: usr/local/www/interfaces_wireless_edit.php:137
+msgid "Created without id"
+msgstr "Kimlik olmadan oluşturuldu"
+
+#: usr/local/www/interfaces_wireless_edit.php:162
+msgid "Wireless clone configuration"
+msgstr "Kablosuz klonu yapılandırması"
+
+#: usr/local/www/license.php:47
+msgid "License"
+msgstr "Lisans"
+
+#: usr/local/www/license.php:49
+msgid "is Copyright"
+msgstr "Telif hakkı"
+
+#: usr/local/www/license.php:50 usr/local/www/license.php:54
+msgid "All rights reserved"
+msgstr "Tüm hakları saklıdır"
+
+#: usr/local/www/license.php:52
+msgid "m0n0wall is Copyright "
+msgstr "m0n0wall telif hakkı "
+
+#: usr/local/www/license.php:52
+msgid "2002-2014 by Manuel Kasper"
+msgstr ""
+
+#: usr/local/www/license.php:55
+msgid "Redistribution and use in source and binary forms, with or without"
+msgstr ""
+"Kaynak ve ikili dosya forumlarını değişiklik, yeniden dağıtımı, kullanımı, "
+
+#: usr/local/www/license.php:56
+msgid ""
+"modification, are permitted provided that the following conditions are met"
+msgstr ""
+"düzenlemesi sadece aşağıdaki koşulların yerine getirilmesi şartı ile izin "
+"verilir"
+
+#: usr/local/www/license.php:59
+msgid ""
+"1. Redistributions of source code must retain the above copyright notice,"
+msgstr ""
+"1. Redistributions of source code must retain the above copyright notice,"
+
+#: usr/local/www/license.php:61
+msgid "this list of conditions and the following disclaimer"
+msgstr "this list of conditions and the following disclaimer"
+
+#: usr/local/www/license.php:63
+msgid "2. Redistributions in binary form must reproduce the above copyright"
+msgstr "2. Redistributions in binary form must reproduce the above copyright"
+
+#: usr/local/www/license.php:64
+msgid "notice, this list of conditions and the following disclaimer in the"
+msgstr "notice, this list of conditions and the following disclaimer in the"
+
+#: usr/local/www/license.php:66
+msgid "documentation and/or other materials provided with the distribution."
+msgstr "documentation and/or other materials provided with the distribution."
+
+#: usr/local/www/license.php:68
+msgid "THIS SOFTWARE IS PROVIDED "
+msgstr "THIS SOFTWARE IS PROVIDED "
+
+#: usr/local/www/license.php:68
+msgid "AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,"
+msgstr "AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,"
+
+#: usr/local/www/license.php:70
+msgid ""
+"INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY"
+msgstr ""
+"INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY"
+
+#: usr/local/www/license.php:71
+msgid ""
+"AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE"
+msgstr ""
+"AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE"
+
+#: usr/local/www/license.php:73
+msgid ""
+"AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,"
+msgstr ""
+"AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,"
+
+#: usr/local/www/license.php:75
+msgid "OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF"
+msgstr ""
+"OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF"
+
+#: usr/local/www/license.php:77
+msgid ""
+"SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS"
+msgstr ""
+"SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS"
+
+#: usr/local/www/license.php:79
+msgid "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN"
+msgstr ""
+"INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN"
+
+#: usr/local/www/license.php:81
+msgid "CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)"
+msgstr ""
+"CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)"
+
+#: usr/local/www/license.php:82
+msgid ""
+"ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE"
+msgstr ""
+"ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE"
+
+#: usr/local/www/license.php:84
+msgid "POSSIBILITY OF SUCH DAMAGE"
+msgstr "POSSIBILITY OF SUCH DAMAGE"
+
+#: usr/local/www/license.php:86
+msgid "is based upon/includes various free software packages, listed below."
+msgstr ""
+"temel içerik/üzerine çeşitli ücretsiz yazılım paketleri, aşağıda "
+"listelenmiştir."
+
+#: usr/local/www/license.php:88
+#, php-format
+msgid ""
+"The authors of %s would like to thank the authors of these software packages "
+"for their efforts"
+msgstr ""
+
+#: usr/local/www/license.php:91 usr/local/www/license.php:94
+#: usr/local/www/license.php:97 usr/local/www/license.php:101
+#: usr/local/www/license.php:102 usr/local/www/license.php:107
+#: usr/local/www/license.php:111 usr/local/www/license.php:114
+#: usr/local/www/license.php:117 usr/local/www/license.php:120
+#: usr/local/www/license.php:124 usr/local/www/license.php:125
+#: usr/local/www/license.php:127 usr/local/www/license.php:133
+#: usr/local/www/license.php:134 usr/local/www/license.php:141
+msgid "Copyright"
+msgstr "Telif hakkı"
+
+#: usr/local/www/license.php:91
+msgid "1992-2014 The FreeBSD Project. All rights reserved"
+msgstr ""
+
+#: usr/local/www/license.php:93
+msgid "This product includes PHP, freely available from"
+msgstr "Bu ürün PHP içerir, ücretsiz olarak"
+
+#: usr/local/www/license.php:94
+msgid "1999-2014 The PHP Group. All rights reserved."
+msgstr ""
+
+#: usr/local/www/license.php:96
+msgid "LightTPD"
+msgstr "LightTPD"
+
+#: usr/local/www/license.php:97
+msgid "2004, Jan Knescke, incremental"
+msgstr "2004, Jan Knescke, incremental"
+
+#: usr/local/www/license.php:98 usr/local/www/license.php:108
+msgid "All rights reserved."
+msgstr "Her hakkı saklıdır."
+
+#: usr/local/www/license.php:100
+msgid "ISC DHCP server "
+msgstr "ISC DHCP sunucu "
+
+#: usr/local/www/license.php:101
+msgid "2004-2012 Internet Software Consortium, Inc."
+msgstr "2004-2012 Internet Software Consortium, Inc."
+
+#: usr/local/www/license.php:102
+msgid "1995-2003 Internet Software Consortium"
+msgstr "1995-2003 Internet Software Consortium"
+
+#: usr/local/www/license.php:104 usr/local/www/services_snmp.php:397
+msgid "PF"
+msgstr "PF"
+
+#: usr/local/www/license.php:106
+msgid "MPD - Multi-link PPP daemon for FreeBSD"
+msgstr "MPD - FreeBSD çoklu bağlantı PPP servisi"
+
+#: usr/local/www/license.php:110
+msgid "Circular log support for FreeBSD syslogd "
+msgstr "FreeBSD syslogd dairesel günlük desteği "
+
+#: usr/local/www/license.php:113
+msgid "Dnsmasq - a DNS forwarder for NAT firewalls"
+msgstr "Dnsmasq - NAT güvenlik duvarları için DNS yönlendirici"
+
+#: usr/local/www/license.php:116
+msgid "IPsec-Tools"
+msgstr ""
+
+#: usr/local/www/license.php:117
+msgid "1995-2002 WIDE Project. All rights reserved."
+msgstr "1995-2002 WIDE Project. Her hakkı saklıdır."
+
+#: usr/local/www/license.php:119
+msgid "msntp"
+msgstr "msntp"
+
+#: usr/local/www/license.php:120
+msgid ""
+" 1996, 1997, 2000 N.M. Maclaren, University of Cambridge. All rights "
+"reserved."
+msgstr ""
+" 1996, 1997, 2000 N.M. Maclaren, University of Cambridge. Her hakkı saklıdır."
+
+#: usr/local/www/license.php:123
+msgid "UCD-SNMP"
+msgstr "UCD-SNMP"
+
+#: usr/local/www/license.php:124
+msgid "1989, 1991, 1992 by Carnegie Mellon University."
+msgstr "1989, 1991, 1992 Carnegie Mellon University."
+
+#: usr/local/www/license.php:125
+msgid ""
+"1996, 1998-2000 The Regents of the University of California. All rights "
+"reserved"
+msgstr ""
+"1996, 1998-2000 University of California İdare Meclisi. Her hakkı saklıdır"
+
+#: usr/local/www/license.php:127
+msgid "2001-2002, Network Associates Technology, Inc. All rights reserved."
+msgstr "2001-2002, Network Associates Technology, Inc. Her hakkı saklıdır."
+
+#: usr/local/www/license.php:129
+msgid "Portions of this code are copyright"
+msgstr "Kodun bir kısmının hakları"
+
+#: usr/local/www/license.php:129
+msgid "2001-2002, Cambridge Broadband Ltd. All rights reserved."
+msgstr "2001-2002, Cambridge Broadband Ltd. Her hakkı saklıdır."
+
+#: usr/local/www/license.php:132
+msgid "choparp"
+msgstr "choparp"
+
+#: usr/local/www/license.php:136
+msgid "php-radius"
+msgstr "php-radius"
+
+#: usr/local/www/license.php:137
+msgid "Copyright 2000, 2001, 2002 by Edwin Groothuis. All rights reserved."
+msgstr "Telif hakkı 2000, 2001, 2002 Edwin Groothuis. Her hakkı saklıdır."
+
+#: usr/local/www/license.php:138
+msgid "This product includes software developed by Edwin Groothuis."
+msgstr "Bu ürün Edwin Groothuis tarafından geliştirilmiş yazılım içerir."
+
+#: usr/local/www/license.php:140
+msgid "wol"
+msgstr "wol"
+
+#: usr/local/www/license.php:144
+msgid "Copyright (C) 2002-2005 OpenVPN Solutions LLC "
+msgstr "Copyright (C) 2002-2005 OpenVPN Solutions LLC "
+
+#: usr/local/www/load_balancer_monitor.php:73
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"pool."
+msgstr "Bu girdi halen en az bir havuz tarafından kullanıldığı için silinemez."
+
+#: usr/local/www/load_balancer_monitor.php:89
+#: usr/local/www/load_balancer_monitor_edit.php:196
+#: usr/local/www/load_balancer_pool.php:135
+#: usr/local/www/load_balancer_pool_edit.php:81
+#: usr/local/www/load_balancer_pool_edit.php:252
+#: usr/local/www/status_gateways.php:76 usr/local/www/status_lb_pool.php:134
+msgid "Monitor"
+msgstr "İzle"
+
+#: usr/local/www/load_balancer_monitor.php:101
+#: usr/local/www/load_balancer_relay_protocol.php:113
+#: usr/local/www/load_balancer_setting.php:112
+msgid "The load balancer configuration has been changed"
+msgstr "Yük Dengeleyici yapılandırması değiştirildi"
+
+#: usr/local/www/load_balancer_monitor.php:108
+#: usr/local/www/load_balancer_pool.php:117
+#: usr/local/www/load_balancer_relay_action.php:125
+#: usr/local/www/load_balancer_relay_protocol.php:121
+#: usr/local/www/load_balancer_setting.php:120
+#: usr/local/www/load_balancer_virtual_server.php:118
+#: usr/local/www/status_lb_pool.php:121 usr/local/www/status_lb_vs.php:68
+msgid "Pools"
+msgstr "Havuzlar"
+
+#: usr/local/www/load_balancer_monitor.php:109
+#: usr/local/www/load_balancer_pool.php:118
+#: usr/local/www/load_balancer_relay_action.php:126
+#: usr/local/www/load_balancer_relay_protocol.php:122
+#: usr/local/www/load_balancer_setting.php:121
+#: usr/local/www/load_balancer_virtual_server.php:99
+#: usr/local/www/load_balancer_virtual_server.php:119
+#: usr/local/www/status_lb_pool.php:122 usr/local/www/status_lb_vs.php:69
+msgid "Virtual Servers"
+msgstr "Sanal Sunucular"
+
+#: usr/local/www/load_balancer_monitor.php:110
+#: usr/local/www/load_balancer_pool.php:119
+#: usr/local/www/load_balancer_relay_action.php:124
+#: usr/local/www/load_balancer_relay_protocol.php:120
+#: usr/local/www/load_balancer_setting.php:122
+#: usr/local/www/load_balancer_virtual_server.php:120
+msgid "Monitors"
+msgstr "İzlemeler"
+
+#: usr/local/www/load_balancer_monitor_edit.php:69
+msgid "Load Balancer: Monitor:"
+msgstr "Yük Dengeleyici: İzle:"
+
+#: usr/local/www/load_balancer_monitor_edit.php:98
+msgid "This monitor name has already been used. Monitor names must be unique."
+msgstr "Bu izleme adı zaten kullanımda. İzleme adları benzersiz olmalıdır."
+
+#: usr/local/www/load_balancer_monitor_edit.php:101
+#: usr/local/www/load_balancer_pool_edit.php:91
+#: usr/local/www/load_balancer_relay_action_edit.php:131
+#: usr/local/www/load_balancer_relay_protocol_edit.php:92
+msgid "You cannot use spaces in the 'name' field."
+msgstr "'İsim' alanında boşluk kullanamazsınız."
+
+#: usr/local/www/load_balancer_monitor_edit.php:115
+#: usr/local/www/services_dhcp_edit.php:172
+#: usr/local/www/services_dhcpv6_edit.php:124
+msgid "The hostname can only contain the characters A-Z, 0-9 and '-'."
+msgstr ""
+"Host adı İngilizce A-Z,0-9 ve '-' karakterleri dışında bir karakter içeremez."
+
+#: usr/local/www/load_balancer_monitor_edit.php:121
+msgid "HTTP(s) codes must be from RFC2616."
+msgstr "HTTP(s) kodları RFC2616'ya uygun olmalıdır."
+
+#: usr/local/www/load_balancer_monitor_edit.php:125
+msgid "The path to monitor must be set."
+msgstr "İzleme yolu tanımlanmalıdır."
+
+#: usr/local/www/load_balancer_monitor_edit.php:148
+#, php-format
+msgid "modified '%s' monitor:"
+msgstr "'%s' izlemesi değiştirildi:"
+
+#: usr/local/www/load_balancer_monitor_edit.php:200
+msgid "ICMP"
+msgstr "ICMP"
+
+#: usr/local/www/load_balancer_monitor_edit.php:200
+#: usr/local/www/load_balancer_monitor_edit.php:270
+#: usr/local/www/load_balancer_relay_action_edit.php:188
+#: usr/local/www/load_balancer_relay_protocol_edit.php:145
+#: usr/local/www/system_advanced_admin.php:344
+msgid "HTTP"
+msgstr "HTTP"
+
+#: usr/local/www/load_balancer_monitor_edit.php:200
+#: usr/local/www/load_balancer_monitor_edit.php:303
+#: usr/local/www/system_advanced_admin.php:347
+msgid "HTTPS"
+msgstr "HTTPS"
+
+#: usr/local/www/load_balancer_monitor_edit.php:200
+#: usr/local/www/load_balancer_monitor_edit.php:337
+msgid "Send/Expect"
+msgstr "Gönder/Bekle"
+
+#: usr/local/www/load_balancer_monitor_edit.php:234
+msgid "Edit Load Balancer - Monitor entry"
+msgstr "Yük Dengeleme Düzenle - Girdiyi izle"
+
+#: usr/local/www/load_balancer_monitor_edit.php:274
+#: usr/local/www/load_balancer_monitor_edit.php:307
+msgid "Path"
+msgstr "Yol"
+
+#: usr/local/www/load_balancer_monitor_edit.php:282
+#: usr/local/www/load_balancer_monitor_edit.php:315
+msgid "Hostname for Host: header if needed."
+msgstr "Gerekiyorsa &quot;Host:&quot; başlığı sunucu adı."
+
+#: usr/local/www/load_balancer_monitor_edit.php:286
+#: usr/local/www/load_balancer_monitor_edit.php:319
+msgid "HTTP Code"
+msgstr "HTTP Kodu"
+
+#: usr/local/www/load_balancer_monitor_edit.php:341
+msgid "Send string"
+msgstr "Dize gönder "
+
+#: usr/local/www/load_balancer_monitor_edit.php:347
+msgid "Expect string"
+msgstr "Beklenecek dize"
+
+#: usr/local/www/load_balancer_pool.php:73
+#: usr/local/www/load_balancer_relay_protocol.php:72
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"virtual server."
+msgstr "En az bir sanal sunucuda kullanıldığından bu girdi silinemez."
+
+#: usr/local/www/load_balancer_pool.php:98
+#: usr/local/www/load_balancer_pool_edit.php:170
+#: usr/local/www/load_balancer_virtual_server.php:136
+#: usr/local/www/status_lb_pool.php:63
+msgid "Pool"
+msgstr "Havuz"
+
+#: usr/local/www/load_balancer_pool.php:110
+#: usr/local/www/status_lb_pool.php:114
+#, php-format
+msgid ""
+"The load balancer configuration has been changed%sYou must apply the changes "
+"in order for them to take effect."
+msgstr ""
+"Yük Dengeleme yapılandırması değiştirilmiştir%sDeğişiklikleri uygulayarak "
+"etkin hale gelmelerini sağlayabilirsiniz."
+
+#: usr/local/www/load_balancer_pool.php:133
+#: usr/local/www/status_lb_pool.php:133 usr/local/www/status_lb_vs.php:80
+#: usr/local/www/system_authservers.php:451
+#: usr/local/www/system_groupmanager.php:291
+#: usr/local/www/system_groupmanager_addprivs.php:171
+#: usr/local/www/system_usermanager.php:497
+#: usr/local/www/system_usermanager_addprivs.php:160
+#: usr/local/www/system_usermanager_settings.php:117
+msgid "Servers"
+msgstr "Sunucular"
+
+#: usr/local/www/load_balancer_pool.php:149
+#, php-format
+msgid ""
+"The Load Balancer in %s 2.0 is for server load balancing, not Multi-WAN. For "
+"load balancing or failover for multiple WANs, use "
+msgstr ""
+"Bu Yük Dengeleyici %s 2.0 sunucu yük dengeleyicisi için, birden fazla WAN "
+"için değil. Eğer yükaktarma için birden fazla WAN kullanımında Yük "
+"Dengeleyici olarak kullanmak istiyorsanız sağdaki link'e tıklayınız "
+
+#: usr/local/www/load_balancer_pool.php:150
+#: usr/local/www/status_gateway_groups.php:49
+#: usr/local/www/status_gateway_groups.php:53
+#: usr/local/www/status_gateway_groups.php:67
+#: usr/local/www/status_gateways.php:65
+#: usr/local/www/system_gateway_groups.php:54
+#: usr/local/www/system_gateway_groups.php:99
+msgid "Gateway Groups"
+msgstr "Ağ Geçidi Grupları"
+
+#: usr/local/www/load_balancer_pool_edit.php:70
+msgid "Load Balancer: Pool:"
+msgstr "Yük Dengeleyici: Havuz:"
+
+#: usr/local/www/load_balancer_pool_edit.php:81
+msgid "Server List"
+msgstr "Sunucu Listesi"
+
+#: usr/local/www/load_balancer_pool_edit.php:88
+msgid "This pool name has already been used. Pool names must be unique."
+msgstr "Havuz adı zaten kullanılıyor. Havuz adları benzersiz olmalıdır."
+
+#: usr/local/www/load_balancer_pool_edit.php:94
+#, php-format
+msgid "The name '%s' is a reserved word and cannot be used."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:97
+#, php-format
+msgid "Sorry, an alias is already named %s."
+msgstr ""
+
+#: usr/local/www/load_balancer_pool_edit.php:100
+msgid "The port must be an integer between 1 and 65535, or a port alias."
+msgstr ""
+"Port 1 ile 65535 arasında bir tamsayı yada grup (alias) portu olmalıdır."
+
+#: usr/local/www/load_balancer_pool_edit.php:104
+msgid "The retry value must be an integer between 1 and 65535."
+msgstr "Tekrar deneme değeri 1 ile 65535 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/load_balancer_pool_edit.php:109
+#, php-format
+msgid "%s is not a valid IP address or IPv4 subnet (in \"enabled\" list)."
+msgstr ""
+"%s geçerli bir IP adresi yada IPv4 altağ değil (\"etkin\" listesi içinde)."
+
+#: usr/local/www/load_balancer_pool_edit.php:112
+#, php-format
+msgid ""
+"%s is a subnet containing more than 64 IP addresses (in \"enabled\" list)."
+msgstr ""
+"%s altağı 64 ten daha fazla IP adresleri içeriyor (\"etkin\" listesi içinde)."
+
+#: usr/local/www/load_balancer_pool_edit.php:119
+#, php-format
+msgid "%s is not a valid IP address or IPv4 subnet (in \"disabled\" list)."
+msgstr ""
+"%s geçerli bir IP adresi yada IPv4 altağ değil (\"kapalı\" listesi içinde)."
+
+#: usr/local/www/load_balancer_pool_edit.php:122
+#, php-format
+msgid ""
+"%s is a subnet containing more than 64 IP addresses (in \"disabled\" list)."
+msgstr ""
+"%s altağı 64 ten daha fazla IP adresleri içeriyor (\"kapalı\" listesi "
+"içinde)."
+
+#: usr/local/www/load_balancer_pool_edit.php:131
+msgid "Invalid monitor chosen."
+msgstr "Geçersiz izleme seçimi."
+
+#: usr/local/www/load_balancer_pool_edit.php:138
+#, php-format
+msgid " modified '%s' pool:"
+msgstr " '%s' havuzu değiştirildi:"
+
+#: usr/local/www/load_balancer_pool_edit.php:198
+msgid "Add/edit Load Balancer - Pool entry"
+msgstr "Yük Dengeleyici ekle/düzenle - Havuz girdisi"
+
+#: usr/local/www/load_balancer_pool_edit.php:210
+msgid "Load Balance"
+msgstr "Yük Dengeleme"
+
+#: usr/local/www/load_balancer_pool_edit.php:211
+msgid "Manual Failover"
+msgstr "Elle Yük Aktarma"
+
+#: usr/local/www/load_balancer_pool_edit.php:227
+msgid "This is the port your servers are listening on."
+msgstr "Sunucularınızın dinlediği port numarası."
+
+#: usr/local/www/load_balancer_pool_edit.php:228
+#: usr/local/www/load_balancer_virtual_server_edit.php:197
+msgid ""
+"You may also specify a port alias listed in Firewall -&gt; Aliases here."
+msgstr ""
+"Güvenlik Duvarı -&gt; Gruplar kısmında belirtilmiş listelenen port Grup ları "
+"belirtebilirsiniz."
+
+#: usr/local/www/load_balancer_pool_edit.php:239
+msgid "Retry"
+msgstr "Tekrar Dene"
+
+#: usr/local/www/load_balancer_pool_edit.php:242
+msgid ""
+"Optionally specify how many times to retry checking a server before "
+"declaring it down."
+msgstr ""
+"İsterseniz bir sunucuyu erişilemez kabul etmek için kaç deneme yapılması "
+"gerektiğini belirtebilirsiniz."
+
+#: usr/local/www/load_balancer_pool_edit.php:249
+msgid "Add item to pool"
+msgstr "Havuza öğe ekle"
+
+#: usr/local/www/load_balancer_pool_edit.php:267
+msgid ""
+"Please add a monitor IP address on the monitors tab if you wish to use this "
+"feature."
+msgstr ""
+"Bu özelliği kullanmak istiyorsanız izlemeler sekmesinden bir izleme IPsi "
+"ekleyiniz."
+
+#: usr/local/www/load_balancer_pool_edit.php:273
+msgid "Server IP Address"
+msgstr "Sunucu IP Adresi"
+
+#: usr/local/www/load_balancer_pool_edit.php:276
+msgid "Add to pool"
+msgstr "Havuza ekle"
+
+#: usr/local/www/load_balancer_pool_edit.php:283
+msgid "Current Pool Members"
+msgstr "Güncel Havuz Üyeleri"
+
+#: usr/local/www/load_balancer_pool_edit.php:292
+msgid "Pool Disabled"
+msgstr "Havuz Devre Dışı"
+
+#: usr/local/www/load_balancer_pool_edit.php:312
+msgid "Enabled (default)"
+msgstr "Etkin (varsayılan)"
+
+#: usr/local/www/load_balancer_relay_action.php:75
+msgid ""
+"This entry cannot be deleted because it is still referenced by at least one "
+"relay protocol."
+msgstr ""
+"Bu girdi en az bir aktarım protokolü tarafından kullanıldığı için silinemez."
+
+#: usr/local/www/load_balancer_relay_action.php:105
+#: usr/local/www/load_balancer_relay_action_edit.php:184
+msgid "Relay Action"
+msgstr "Aktarma Eylemi"
+
+#: usr/local/www/load_balancer_relay_action.php:117
+msgid ""
+"The load balancer configuration has been changed.<br />You must apply the "
+"changes in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/load_balancer_relay_action.php:127
+msgid "Relay Actions"
+msgstr "Aktarma Eylemleri"
+
+#: usr/local/www/load_balancer_relay_action.php:128
+msgid "Relay Protocols"
+msgstr "Aktarma Protokolleri"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:69
+msgid "Load Balancer: Relay Action:"
+msgstr "Yük Dengeleyici: Aktarma Eylemi:"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:128
+msgid "This action name has already been used. Action names must be unique."
+msgstr "Bu eylem adı kullanılıyor. Eylem adları benzersiz olmalıdır."
+
+#: usr/local/www/load_balancer_relay_action_edit.php:138
+#, php-format
+msgid "modified '%s' action:"
+msgstr "'%s' değiştirilmiş eylemi:"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:188
+#: usr/local/www/load_balancer_relay_protocol_edit.php:145
+msgid "DNS"
+msgstr "DNS"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:409
+msgid "Edit Load Balancer - Relay Action entry"
+msgstr "Yük Dengeleyici Düzenle - Aktarma Eylemi girişi"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:507
+#: usr/local/www/services_dhcp.php:1158 usr/local/www/services_dhcpv6.php:790
+#: usr/local/www/system_advanced_sysctl.php:183
+#: usr/local/www/system_advanced_sysctl.php:261
+#: usr/local/www/system_certmanager.php:806
+msgid "Value"
+msgstr "Değer"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:509
+#: usr/local/www/services_rfc2136_edit.php:74
+#: usr/local/www/services_rfc2136_edit.php:180
+msgid "Key"
+msgstr "Anahtar"
+
+#: usr/local/www/load_balancer_relay_action_edit.php:518
+#: usr/local/www/load_balancer_relay_action_edit.php:538
+msgid "TODO"
+msgstr "YAPILACAK"
+
+#: usr/local/www/load_balancer_relay_protocol.php:101
+#: usr/local/www/load_balancer_relay_protocol_edit.php:140
+#: usr/local/www/load_balancer_virtual_server_edit.php:81
+#: usr/local/www/load_balancer_virtual_server_edit.php:260
+msgid "Relay Protocol"
+msgstr "Aktarım Protokolü"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:68
+msgid "Load Balancer: Relay Protocol:"
+msgstr "Yük Dengeleyici: Aktarım Protokolü:"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:89
+msgid ""
+"This protocol name has already been used. Protocol names must be unique."
+msgstr "Protokol adı kullanımda. Protokol adları benzersiz olmalıdır."
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:108
+#, php-format
+msgid "modified '%s' load balancing protocol:"
+msgstr "değiştirilmiş '%s' yük dengeleme protokolü:"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:110
+msgid "name"
+msgstr "isim"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:111
+#: usr/local/www/load_balancer_relay_protocol_edit.php:113
+msgid "type"
+msgstr "tür"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:112
+msgid "description"
+msgstr "açıklama"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:114
+msgid "action"
+msgstr "eylem"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:193
+msgid "Edit Load Balancer - Relay Protocol entry"
+msgstr "Yük dengeleyiciyi düzenle - Aktarma Protokolü girişi"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:228
+msgid "Add / remove available actions"
+msgstr "Eylem ekle / kaldır"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:238
+msgid "Available Actions"
+msgstr "Kullanılabilir Eylemler"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:253
+#: usr/local/www/system_crlmanager.php:528
+msgid "Add"
+msgstr "Ekle"
+
+#: usr/local/www/load_balancer_relay_protocol_edit.php:260
+msgid "Enabled Actions"
+msgstr "Etkinleştirilmiş Eylemler"
+
+#: usr/local/www/load_balancer_setting.php:71
+msgid "Timeout must be a numeric value"
+msgstr "Zaman aşımı sayısal bir değer olmalıdır"
+
+#: usr/local/www/load_balancer_setting.php:75
+msgid "Interval must be a numeric value"
+msgstr "Aralık sayısal bir değer olmalıdır"
+
+#: usr/local/www/load_balancer_setting.php:80
+msgid "Prefork must be a numeric value"
+msgstr "Prefork sayısal bir değer olmalıdır"
+
+#: usr/local/www/load_balancer_setting.php:83
+msgid "Prefork value must be between 1 and 32"
+msgstr "Prefork değeri 1 ile 32 arasında olmalıdır"
+
+#: usr/local/www/load_balancer_setting.php:133
+msgid "Relayd global settings"
+msgstr "Aytarıcıd genel ayarları"
+
+#: usr/local/www/load_balancer_setting.php:136
+msgid "timeout"
+msgstr "zaman aşımı"
+
+#: usr/local/www/load_balancer_setting.php:140
+msgid ""
+"Set the global timeout in milliseconds for checks. Leave blank to use the "
+"default value of 1000 ms "
+msgstr ""
+"Genel zaman aşımı kontrollerini milisaniye olarak ayarlayın. Boş bırakarak "
+"varsayılan değer (1000 ms) kullanın "
+
+#: usr/local/www/load_balancer_setting.php:144
+msgid "interval"
+msgstr "aralık"
+
+#: usr/local/www/load_balancer_setting.php:148
+msgid ""
+"Set the interval in seconds at which the member of a pool will be checked. "
+"Leave blank to use the default interval of 10 seconds"
+msgstr ""
+"Tabloya ait kullanıcıların kontrol edileceği aralığı ayarlayın. Boş "
+"bırakarak varsayılan değer (10 saniye) kullanın"
+
+#: usr/local/www/load_balancer_setting.php:152
+msgid "prefork"
+msgstr "işlem (prefork)"
+
+#: usr/local/www/load_balancer_setting.php:156
+msgid ""
+"Number of processes used by relayd for dns protocol. Leave blank to use the "
+"default value of 5 processes"
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server.php:111
+msgid "The virtual server configuration has been changed"
+msgstr "Sanal sunucu yapılandırması değiştirildi"
+
+#: usr/local/www/load_balancer_virtual_server.php:137
+#: usr/local/www/load_balancer_virtual_server_edit.php:226
+msgid "Fall Back Pool"
+msgstr "Alternatif Havuz"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:65
+msgid "Load Balancer: Virtual Server:"
+msgstr "Yük Dengeleyici: Sanal Sunucu:"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:90
+msgid ""
+"This virtual server name has already been used. Virtual server names must "
+"be unique."
+msgstr ""
+"Bu sanal sunucu adı kullanımda. Sanal sunucu adları benzersiz olmalıdır."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:93
+msgid "You cannot use spaces or slashes in the 'name' field."
+msgstr "'isim' alanında boşluk veya bölü çizgisi (slaş) kullanamazsınız."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:96
+msgid ""
+"The port must be an integer between 1 and 65535, a port alias, or left blank."
+msgstr ""
+"Port 1 ile 65535 arasında bir tamsayı yada grup (alias) portu olmalıdır yada "
+"boş bırakılmalıdır."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:99
+#, php-format
+msgid "%s is not a valid IP address, IPv4 subnet, or alias."
+msgstr "%s geçerli bir IP adresi, IPv4 altağ yada grup (alias) değil."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:101
+#, php-format
+msgid "%s is a subnet containing more than 64 IP addresses."
+msgstr "%s altağı 64 ten daha fazla IP adresleri içeriyor."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:104
+msgid "You cannot select a Fall Back Pool when using the DNS relay protocol."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:111
+#, php-format
+msgid "modified '%s' vs:"
+msgstr "'%s' değiştirildi:"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:113
+#, php-format
+msgid "created '%s' vs:"
+msgstr "'%s' oluşturuldu:"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:147
+#: usr/local/www/status_lb_vs.php:57
+msgid "Virtual Server"
+msgstr "Sanal Sunucu"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:163
+msgid "Edit Load Balancer - Virtual Server entry"
+msgstr "Yük Dengeleyici Düzenle - Sanal Sunucu girişi"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:181
+msgid ""
+"This is normally the WAN IP address that you would like the server to listen "
+"on. All connections to this IP and port will be forwarded to the pool "
+"cluster."
+msgstr ""
+"Bu değer normalde sunucunuzun dinlemesini istediğiniz WAN IP adresi "
+"olmalıdır. Bu IP porta yapılan tüm bağlantılar havuz kümesine "
+"yönlendirilecektir."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:182
+msgid ""
+"You may also specify a host alias listed in Firewall -&gt; Aliases here."
+msgstr ""
+"Güvenlik Duvarı -&gt; Gruplar kısmında belirtilmiş listelenen host Grup ları "
+"belirtebilirsiniz."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:195
+msgid ""
+"This is the port that the clients will connect to. All connections to this "
+"port will be forwarded to the pool cluster."
+msgstr ""
+"İstemcilerin bağlanacağı port. Bu porta yapılan bağlantılar havuz kümesine "
+"yönlendirilecektir."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:196
+msgid "If left blank, listening ports from the pool will be used."
+msgstr "Eğer boş bırakırsanız, dinlenen portlar havuzdan kullanılır."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:207
+msgid "Virtual Server Pool"
+msgstr "Sanal Sunucu Havuzu"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:210
+#: usr/local/www/load_balancer_virtual_server_edit.php:229
+msgid "Please add a pool on the Pools tab to use this feature."
+msgstr ""
+"Bu özelliği kullanabilmek için lütfen Havuzlar sekmesinden bir havuz ekleyin."
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:242
+msgid ""
+"The server pool to which clients will be redirected if *ALL* servers in the "
+"Virtual Server Pool are offline."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:243
+msgid "This option is NOT compatible with the DNS relay protocol."
+msgstr ""
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:279
+#: usr/local/www/status_captiveportal_expire.php:95
+#: usr/local/www/status_captiveportal_test.php:95
+msgid "Submit"
+msgstr "Kaydet"
+
+#: usr/local/www/load_balancer_virtual_server_edit.php:289
+msgid ""
+"Don't forget to add a firewall rule for the virtual server/pool after you're "
+"finished setting it up."
+msgstr ""
+"Yapılandırmayı tamamladıktan sonra sanal sunucu / havuz için güvenlik duvarı "
+"kuralı eklemeyi unutmayın."
+
+#: usr/local/www/pkg.php:57
+msgid "ERROR: No package defined."
+msgstr "HATA: Paket tanımlanmadı."
+
+#: usr/local/www/pkg.php:188
+msgid "Saving changes..."
+msgstr "Değişiklikler kaydediliyor..."
+
+#: usr/local/www/pkg.php:189
+msgid "Do you really want to save changes?"
+msgstr "Gerçekten değişiklikleri kaydetmek istiyor musunuz?"
+
+#: usr/local/www/pkg.php:458
+msgid "Do you really want to delete this item?"
+msgstr "Bu öğeyi silmek istediğinize emin misiniz?"
+
+#: usr/local/www/pkg_edit.php:74
+msgid "ERROR: No valid package defined."
+msgstr ""
+
+#: usr/local/www/pkg_edit.php:263
+msgid "Package Editor"
+msgstr "Paket Editörü"
+
+#: usr/local/www/pkg_mgr.php:91
+#, php-format
+msgid "Unable to retrieve package info from %s. Cached data will be used."
+msgstr "Paket bilgisi %s den alınamıyor. Önbellekteki veri kullanılacak."
+
+#: usr/local/www/pkg_mgr.php:94
+#, php-format
+msgid ""
+"Unable to communicate with %1$s. Please verify DNS and interface "
+"configuration, and that %2$s has functional Internet connectivity."
+msgstr ""
+"%1$s ile iletişim kurulamıyor. Lütfen DNS'i ve arabirimi doğrulayın ve "
+"%2$s'nin çalışan bir Internet bağlantısı olup olmadığını kontrol edin."
+
+#: usr/local/www/pkg_mgr.php:138 usr/local/www/pkg_mgr_installed.php:109
+msgid "Available Packages"
+msgstr "Kurulabilir Paketler"
+
+#: usr/local/www/pkg_mgr.php:139 usr/local/www/pkg_mgr_installed.php:113
+#: usr/local/www/pkg_mgr_settings.php:102
+msgid "Installed Packages"
+msgstr "Kurulu Paketler"
+
+#: usr/local/www/pkg_mgr.php:184
+msgid "Other Categories"
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:196 usr/local/www/pkg_mgr_installed.php:124
+msgid "Category"
+msgstr "Kategori"
+
+#: usr/local/www/pkg_mgr.php:203 usr/local/www/pkg_mgr.php:279
+msgid "There are currently no packages available for installation."
+msgstr "Kurulabilir paket bulunamadı."
+
+# 91%
+#: usr/local/www/pkg_mgr.php:225 usr/local/www/pkg_mgr_installed.php:190
+msgid "Package info"
+msgstr "Paket bilgisi"
+
+#: usr/local/www/pkg_mgr.php:228 usr/local/www/pkg_mgr_installed.php:194
+msgid "No package info, check the forum"
+msgstr "Paket bilgisi yok, forum'u kontrol ediniz"
+
+#: usr/local/www/pkg_mgr.php:234
+msgid "Click on package name to access its website."
+msgstr "Paket ismine tıklayarak websitesine erişebilirsiniz."
+
+#: usr/local/www/pkg_mgr.php:245
+msgid "Click "
+msgstr "Tıkla "
+
+#: usr/local/www/pkg_mgr.php:245
+msgid " version to check its change log."
+msgstr ""
+
+#: usr/local/www/pkg_mgr.php:257
+msgid "platform"
+msgstr "platform"
+
+#: usr/local/www/pkg_mgr.php:261 usr/local/www/pkg_mgr_installed.php:211
+msgid "Click package info for more details about "
+msgstr "Paket bilgisine tıklayarak hakkında daha fazla detay al "
+
+# 77%
+#: usr/local/www/pkg_mgr.php:273
+msgid "Install "
+msgstr "Yükle "
+
+#: usr/local/www/pkg_mgr_install.php:58
+msgid "Install Package"
+msgstr "Paket Kur"
+
+#: usr/local/www/pkg_mgr_install.php:100
+msgid "Available packages"
+msgstr "Kullanılabilir paketler"
+
+#: usr/local/www/pkg_mgr_install.php:101
+msgid "Installed packages"
+msgstr "Kurulu paketler"
+
+#: usr/local/www/pkg_mgr_install.php:102
+msgid "Package Installer"
+msgstr "Paket Kurucu"
+
+#: usr/local/www/pkg_mgr_install.php:197
+msgid "Something is wrong on the request."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:201
+msgid "Log was not retrievable."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_install.php:206
+msgid "installation completed."
+msgstr "kurulumu tamamlandı."
+
+#: usr/local/www/pkg_mgr_install.php:209
+#, php-format
+msgid "Could not find %s."
+msgstr "%s bulunamadı."
+
+#: usr/local/www/pkg_mgr_install.php:220
+msgid "Creating restore point before package installation."
+msgstr "Paket kurulumu oncesi kurtarma noktasi olusturuluyor."
+
+#: usr/local/www/pkg_mgr_install.php:225 usr/local/www/pkg_mgr_install.php:226
+msgid "Package deleted."
+msgstr "Paket silindi."
+
+#: usr/local/www/pkg_mgr_install.php:236 usr/local/www/pkg_mgr_install.php:237
+msgid "Package reinstallation failed."
+msgstr "Paketin tekrar kurulumu başarısız."
+
+#: usr/local/www/pkg_mgr_install.php:240 usr/local/www/pkg_mgr_install.php:241
+msgid "Package reinstalled."
+msgstr "Paket tekrar kuruldu."
+
+#: usr/local/www/pkg_mgr_install.php:263 usr/local/www/pkg_mgr_install.php:264
+msgid "All packages reinstalled."
+msgstr "Tüm paketler yeniden kuruldu."
+
+#: usr/local/www/pkg_mgr_install.php:269
+msgid "No packages are installed."
+msgstr "Yüklü paket yok."
+
+#: usr/local/www/pkg_mgr_install.php:275
+msgid "Installation of"
+msgstr "Kurulum"
+
+#: usr/local/www/pkg_mgr_install.php:275
+msgid "FAILED!"
+msgstr "BAŞARISIZ!"
+
+#: usr/local/www/pkg_mgr_install.php:276
+msgid "Installation halted."
+msgstr "Kurulum durduruldu."
+
+#: usr/local/www/pkg_mgr_install.php:283
+msgid "Installation completed."
+msgstr "Kurulum tamamlandı."
+
+#: usr/local/www/pkg_mgr_install.php:283
+msgid "setup instructions"
+msgstr "kurulum adımları"
+
+#: usr/local/www/pkg_mgr_install.php:285
+msgid ""
+"Installation completed. Please check to make sure that the package is "
+"configured from the respective menu then start the package."
+msgstr ""
+"Kurulum tamamlandı. Paketin kurulu olduğundan emin olmak için ilgili "
+"menüden pakedin arayüzünü açıp yapılandırdıktan sonra paketi başlatınız."
+
+#: usr/local/www/pkg_mgr_installed.php:154
+#: usr/local/www/pkg_mgr_installed.php:156
+#: usr/local/www/pkg_mgr_installed.php:163
+#: usr/local/www/pkg_mgr_installed.php:165
+msgid "Available"
+msgstr "Uygun"
+
+#: usr/local/www/pkg_mgr_installed.php:157
+#: usr/local/www/pkg_mgr_installed.php:166
+#: usr/local/www/pkg_mgr_installed.php:184
+msgid "Installed"
+msgstr "Yüklü"
+
+#: usr/local/www/pkg_mgr_installed.php:181
+#: usr/local/www/pkg_mgr_installed.php:183
+msgid "Latest"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:181
+#: usr/local/www/pkg_mgr_installed.php:183
+msgid "N/A"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_installed.php:209
+msgid "Click on "
+msgstr "Tıklayın "
+
+#: usr/local/www/pkg_mgr_installed.php:220
+msgid "Remove "
+msgstr "Sil "
+
+#: usr/local/www/pkg_mgr_installed.php:224
+#: usr/local/www/pkg_mgr_installed.php:227
+msgid "Reinstall "
+msgstr "Tekrar kur "
+
+#: usr/local/www/pkg_mgr_installed.php:237
+msgid "There are no packages currently installed."
+msgstr "Kurulu paket yok."
+
+#: usr/local/www/pkg_mgr_settings.php:63
+#: usr/local/www/pkg_mgr_settings.php:103
+msgid "Package Settings"
+msgstr "Paket Ayarları"
+
+#: usr/local/www/pkg_mgr_settings.php:101
+#, php-format
+msgid "%s packages"
+msgstr "%s paketler"
+
+#: usr/local/www/pkg_mgr_settings.php:112
+msgid ""
+"This page allows an alternate package repository to be configured, primarily "
+"for temporary use as a testing mechanism."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:113
+msgid ""
+"The contents of unofficial packages servers cannot be verified and may "
+"contain malicious files."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:114
+msgid ""
+"The package server settings should remain at their default values to ensure "
+"that verifiable and trusted packages are recevied."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:116
+msgid ""
+"A warning is printed on the Dashboard and in the package manager when an "
+"unofficial package server is in use."
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:121
+#: usr/local/www/pkg_mgr_settings.php:124
+msgid "Package Repository URL"
+msgstr "Paket Depo URLsi"
+
+#: usr/local/www/pkg_mgr_settings.php:126
+msgid "Use a non-official server for packages"
+msgstr ""
+
+#: usr/local/www/pkg_mgr_settings.php:128
+#: usr/local/www/system_firmware_settings.php:170
+msgid "Base URL:"
+msgstr "Taban URL:"
+
+#: usr/local/www/pkg_mgr_settings.php:131
+#, php-format
+msgid "This is where %s will check for packages when the"
+msgstr "%s paketleri burada arayacak"
+
+#: usr/local/www/pkg_mgr_settings.php:131
+msgid "System: Packages"
+msgstr "Sistem: Paketler"
+
+#: usr/local/www/pkg_mgr_settings.php:131
+#: usr/local/www/system_firmware_settings.php:173
+msgid "page is viewed."
+msgstr "sayfa görüntülendi."
+
+#: usr/local/www/reboot.php:49
+msgid "Reboot System"
+msgstr "Sistemi Yeniden Başlat"
+
+#: usr/local/www/reboot.php:57
+msgid "The system is rebooting now. This may take one minute."
+msgstr "Sistem yeniden başlatılıyor. Birkaç dakika sürebilir."
+
+#: usr/local/www/reboot.php:63
+msgid "Are you sure you want to reboot the system?"
+msgstr "Sistemi yeniden başlatmak istediğinize emin misiniz?"
+
+#: usr/local/www/restart_httpd.php:43
+msgid "Restarting httpd"
+msgstr "Httpd yeniden başlatılıyor"
+
+#: usr/local/www/restart_httpd.php:51
+msgid "Mounting file systems read/write"
+msgstr "Dosya sistemleri okuma-yazma yetkileri ile bağlanıyor"
+
+#: usr/local/www/restart_httpd.php:54
+msgid "Forcing all PHP file permissions to 0755"
+msgstr "Tüm PHP dosya izinleri 0755 olarak değiştiriliyor"
+
+#: usr/local/www/restart_httpd.php:57
+msgid "Mounting file systems read only"
+msgstr "Dosya sistemleri salt okunur olarak bağlanıyor"
+
+#: usr/local/www/restart_httpd.php:60
+msgid "Restarting mini_httpd"
+msgstr "mini_httpd yeniden başlatılıyor"
+
+#: usr/local/www/services_captiveportal.php:69
+#: usr/local/www/services_captiveportal_filemanager.php:72
+#: usr/local/www/services_captiveportal_hostname.php:67
+#: usr/local/www/services_captiveportal_hostname_edit.php:60
+#: usr/local/www/services_captiveportal_ip.php:65
+#: usr/local/www/services_captiveportal_ip_edit.php:61
+#: usr/local/www/services_captiveportal_mac.php:64
+#: usr/local/www/services_captiveportal_mac_edit.php:61
+#: usr/local/www/services_captiveportal_vouchers.php:92
+#: usr/local/www/services_captiveportal_vouchers_edit.php:46
+#: usr/local/www/services_captiveportal_zones_edit.php:46
+#: usr/local/www/status_captiveportal_expire.php:60
+#: usr/local/www/status_captiveportal_test.php:59
+#: usr/local/www/status_captiveportal_voucher_rolls.php:58
+#: usr/local/www/status_captiveportal_vouchers.php:58
+msgid "Captive portal"
+msgstr "Hizmet Portalı"
+
+#: usr/local/www/services_captiveportal.php:88
+#, php-format
+msgid "Captive Portal: zone %s: Restore default portal page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:107
+#, php-format
+msgid "Captive Portal: zone %s: Restore default error page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:126
+#, php-format
+msgid "Captive Portal: zone %s: Restore default logout page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:211
+#: usr/local/www/services_captiveportal_zones_edit.php:60
+#: usr/local/www/services_captiveportal_zones_edit.php:98
+msgid "Zone name"
+msgstr "Bölge adı"
+
+#: usr/local/www/services_captiveportal.php:219
+#, php-format
+msgid ""
+"The captive portal cannot be used on interface %s since it is part of a "
+"bridge."
+msgstr ""
+"%s arabirimi bir köprü üyesi olduğundan Hizmet Portalı için kullanılamaz."
+
+#: usr/local/www/services_captiveportal.php:223
+#, php-format
+msgid ""
+"The captive portal cannot be used on interface %s since it is used already "
+"on %s instance."
+msgstr ""
+"Hizmet Portalı %s arabirimini kullanamaz %s örneğinde zaten kullanımda."
+
+#: usr/local/www/services_captiveportal.php:231
+msgid "Certificate must be specified for HTTPS login."
+msgstr "HTTPS giriş için sertifika tanımlanmalıdır."
+
+#: usr/local/www/services_captiveportal.php:234
+msgid "The HTTPS server name must be specified for HTTPS login."
+msgstr "HTTPS oturumu için HTTP sunucu adı tanımlanmalıdır."
+
+#: usr/local/www/services_captiveportal.php:241
+msgid "The timeout must be at least 1 minute."
+msgstr "Zaman aşımı en az bir dakika olmalıdır."
+
+#: usr/local/www/services_captiveportal.php:254
+msgid ""
+"Hard timeout must be less or equal Default lease time set on DHCP Server"
+msgstr ""
+"Mecburi zaman aşımı varsayılan DHCP Sunucu kira zamanından daha az yada eşit "
+"olmalıdır"
+
+#: usr/local/www/services_captiveportal.php:259
+msgid "The idle timeout must be at least 1 minute."
+msgstr "Boşta kalma süresi en az 1 dakika olmalıdır."
+
+#: usr/local/www/services_captiveportal.php:262
+msgid "The pass-through credit count must be a number or left blank."
+msgstr "İzin kredi sayısı ya bir tamsayı olmalıdır ya da boş bırakılmalıdır."
+
+#: usr/local/www/services_captiveportal.php:265
+msgid ""
+"The waiting period to restore pass-through credits must be above 0 hours."
+msgstr ""
+"İzin kredilerini yenilemek için geçmesi gereken süre 0 saatten fazla "
+"olmalıdır."
+
+#: usr/local/www/services_captiveportal.php:269
+#: usr/local/www/services_captiveportal.php:272
+#: usr/local/www/services_captiveportal.php:275
+#: usr/local/www/services_captiveportal.php:278
+#: usr/local/www/services_captiveportal_ip_edit.php:106
+#, php-format
+msgid "A valid IP address must be specified. [%s]"
+msgstr "Geçerli bir IP adresi belirtilmelidir. [%s]"
+
+#: usr/local/www/services_captiveportal.php:281
+#: usr/local/www/services_captiveportal.php:284
+#: usr/local/www/services_captiveportal.php:287
+#: usr/local/www/services_captiveportal.php:290
+#: usr/local/www/services_captiveportal.php:293
+#, php-format
+msgid "A valid port number must be specified. [%s]"
+msgstr "Geçerli bir port numarası belirtilmelidir. [%s]"
+
+#: usr/local/www/services_captiveportal.php:296
+msgid ""
+"The maximum number of concurrent connections per client IP address may not "
+"be larger than the global maximum."
+msgstr ""
+"İstemci IP adresi başına maksimum eş zamanlı anlık bağlantı sayısı değeri "
+"verilen genel en yüksek değerden fazla olmamalıdır."
+
+#: usr/local/www/services_captiveportal.php:299
+msgid ""
+"The NAS-Identifier must be 3-253 characters long and should only contain "
+"ASCII characters."
+msgstr ""
+"NAS-Identifier 3-253 karakter uzunluğunda olmalıdır ve yalnızca ASCII "
+"karakterler içermelidir."
+
+#: usr/local/www/services_captiveportal.php:505
+#: usr/local/www/services_captiveportal_filemanager.php:148
+#: usr/local/www/services_captiveportal_hostname.php:113
+#: usr/local/www/services_captiveportal_ip.php:106
+#: usr/local/www/services_captiveportal_mac.php:156
+#: usr/local/www/services_captiveportal_vouchers.php:442
+msgid "Captive portal(s)"
+msgstr "Hizmet Portal(ları)"
+
+#: usr/local/www/services_captiveportal.php:506
+#: usr/local/www/services_captiveportal_filemanager.php:149
+#: usr/local/www/services_captiveportal_hostname.php:114
+#: usr/local/www/services_captiveportal_ip.php:107
+#: usr/local/www/services_captiveportal_mac.php:157
+#: usr/local/www/services_captiveportal_vouchers.php:443
+msgid "MAC"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:507
+#: usr/local/www/services_captiveportal_filemanager.php:150
+#: usr/local/www/services_captiveportal_ip.php:108
+#: usr/local/www/services_captiveportal_mac.php:158
+#: usr/local/www/services_captiveportal_vouchers.php:444
+msgid "Allowed IP addresses"
+msgstr "İzinli IP adresleri"
+
+#: usr/local/www/services_captiveportal.php:508
+#: usr/local/www/services_captiveportal_filemanager.php:151
+#: usr/local/www/services_captiveportal_hostname.php:116
+#: usr/local/www/services_captiveportal_ip.php:109
+#: usr/local/www/services_captiveportal_mac.php:159
+#: usr/local/www/services_captiveportal_vouchers.php:445
+msgid "Allowed Hostnames"
+msgstr "İzinli sistem adları"
+
+#: usr/local/www/services_captiveportal.php:509
+#: usr/local/www/services_captiveportal.php:671
+#: usr/local/www/services_captiveportal_filemanager.php:152
+#: usr/local/www/services_captiveportal_hostname.php:117
+#: usr/local/www/services_captiveportal_ip.php:110
+#: usr/local/www/services_captiveportal_mac.php:160
+#: usr/local/www/services_captiveportal_vouchers.php:92
+#: usr/local/www/services_captiveportal_vouchers.php:446
+#: usr/local/www/status_captiveportal_vouchers.php:58
+msgid "Vouchers"
+msgstr "Biletler"
+
+#: usr/local/www/services_captiveportal.php:510
+#: usr/local/www/services_captiveportal_filemanager.php:153
+#: usr/local/www/services_captiveportal_hostname.php:118
+#: usr/local/www/services_captiveportal_ip.php:111
+#: usr/local/www/services_captiveportal_mac.php:161
+#: usr/local/www/services_captiveportal_vouchers.php:447
+msgid "File Manager"
+msgstr "Dosya Yöneticisi"
+
+#: usr/local/www/services_captiveportal.php:520
+msgid "Enable captive portal"
+msgstr "Hizmet Portalını etkinleştir"
+
+#: usr/local/www/services_captiveportal.php:535
+msgid "Select the interface(s) to enable for captive portal."
+msgstr "Hizmet Portalını etkinleştirmek istediğiniz arabirim(ler)'i seçiniz."
+
+#: usr/local/www/services_captiveportal.php:538
+msgid "Maximum concurrent connections"
+msgstr "Maksimum eş zamanlı bağlantı sayısı"
+
+#: usr/local/www/services_captiveportal.php:542
+msgid "per client IP address (0 = no limit)"
+msgstr "istemci başına IP adresi (0 = sınırsız)"
+
+#: usr/local/www/services_captiveportal.php:545
+msgid ""
+"This setting limits the number of concurrent connections to the captive "
+"portal HTTP(S) server. This does not set how many users can be logged in to "
+"the captive portal, but rather how many users can load the portal page or "
+"authenticate at the same time! Possible setting allowed is: minimum 4 "
+"connections per client IP address, with a total maximum of 100 connections."
+msgstr ""
+"Bu ayar Hizmet Portalı HTTP(S) sunucusuna aynı anda yapılabilecek bağlantı "
+"sayısını sınırlar. Hizmet Portalına oturum açabilecek kullanıcı sayısı "
+"değil, aynı anda oturum ekranını görebilecek kullanıcı sayısıdır. Varsayılan "
+"bağlantı değeri istemci IP adresi başına 4'tür, toplam en fazla 100'dür."
+
+#: usr/local/www/services_captiveportal.php:553
+#: usr/local/www/services_captiveportal.php:560
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/system_advanced_misc.php:623
+msgid "minutes"
+msgstr "dakika"
+
+#: usr/local/www/services_captiveportal.php:554
+msgid ""
+"Clients will be disconnected after this amount of inactivity. They may log "
+"in again immediately, though. Leave this field blank for no idle timeout."
+msgstr ""
+"İstemciler bu süre boyunca herhangi bir eylem gerçekleştirmezlerse "
+"bağlantıları kesilir. Hemen arkasında oturum açabilirler. Boşta kalma "
+"durumunda bağlantının kesilmesi için bu alanı boş bırakın."
+
+#: usr/local/www/services_captiveportal.php:557
+msgid "Hard timeout"
+msgstr "Mecburi zaman aşımı"
+
+#: usr/local/www/services_captiveportal.php:561
+msgid ""
+"Clients will be disconnected after this amount of time, regardless of "
+"activity. They may log in again immediately, though. Leave this field blank "
+"for no hard timeout (not recommended unless an idle timeout is set)."
+msgstr ""
+"İstemcilerin bağlantıları, etkinlik durumuna bakılmazsızın, bu sürenin "
+"sonunda koparılır. Hemen tekrar oturum açabilirler. Mecburi zaman aşımını "
+"kaldırmak için bu alanı boş bırakın (boşta zaman aşımı ayarlanmadıysa "
+"tavsiye edilmez)."
+
+#: usr/local/www/services_captiveportal.php:564
+msgid "Pass-through credits allowed per MAC address"
+msgstr "MAC adresi başına izinli kredi"
+
+#: usr/local/www/services_captiveportal.php:567
+msgid "per client MAC address (0 or blank = none)"
+msgstr "istemci MAC adresi başına (0 veya boş bırakabilirsiniz)"
+
+#: usr/local/www/services_captiveportal.php:568
+msgid ""
+"This setting allows passing through the captive portal without "
+"authentication a limited number of times per MAC address. Once used up, the "
+"client can only log in with valid credentials until the waiting period "
+"specified below has expired. Recommended to set a hard timeout and/or idle "
+"timeout when using this for it to be effective."
+msgstr ""
+"Bu ayar her MAC adresi başına Hizmet Portalından kimlik doğrulama olmaksızın "
+"sınırlı sayıda geçişe izin verir. Bu sayıda kimlik doğrulamasız geçişten "
+"sonra istemci aşağıda belirtilen bekleme süresi dolmadan sadece kimlik "
+"doğruladıktan sonra çıkabilir. Bu ayarı kullanacaksanız boşta zaman aşımı ve/"
+"veya mecburi zaman aşımının da yapılandırılması önerilir."
+
+#: usr/local/www/services_captiveportal.php:571
+msgid "Waiting period to restore pass-through credits"
+msgstr "İzinli kredileri yenilemek için gereken bekleme süresi"
+
+#: usr/local/www/services_captiveportal.php:574
+msgid "hours"
+msgstr "saat"
+
+#: usr/local/www/services_captiveportal.php:575
+msgid ""
+"Clients will have their available pass-through credits restored to the "
+"original count after this amount of time since using the first one. This "
+"must be above 0 hours if pass-through credits are enabled."
+msgstr ""
+"Belirtilen süre geçtiğinde istemcilerin izin kredileri orjinal değerlerine "
+"sıfırlanır. İzin kredileri açıksa 0 saatten fazla olmalıdır."
+
+#: usr/local/www/services_captiveportal.php:578
+msgid "Reset waiting period on attempted access"
+msgstr "Erişim denemesinde bekleme süresini sıfırla"
+
+#: usr/local/www/services_captiveportal.php:581
+msgid "Enable waiting period reset on attempted access"
+msgstr "Erişim denemesinde bekleme süresinin sıfırlanmasını etkinleştir"
+
+#: usr/local/www/services_captiveportal.php:582
+msgid ""
+"If enabled, the waiting period is reset to the original duration if access "
+"is attempted when all pass-through credits have already been exhausted."
+msgstr ""
+"Etkinleştirildiğinde, izin kredileri tükendikten sonra erişmeye "
+"çalışıldığında bekleme süresi sıfırlanır."
+
+#: usr/local/www/services_captiveportal.php:585
+msgid "Logout popup window"
+msgstr "Oturum kapat penceresi"
+
+#: usr/local/www/services_captiveportal.php:588
+msgid "Enable logout popup window"
+msgstr "Oturum kapat penceresini etkinleştir"
+
+#: usr/local/www/services_captiveportal.php:589
+msgid ""
+"If enabled, a popup window will appear when clients are allowed through the "
+"captive portal. This allows clients to explicitly disconnect themselves "
+"before the idle or hard timeout occurs."
+msgstr ""
+"Etkinleştirildiğinde, Hizmet Portalından istemci geçişine izin verildiyse ek "
+"bir pencere açılır. Bu pencereden kullanıcılar boşta veya mecburi zaman "
+"aşımını beklemeden oturumlarını kapatıp bağlantılarını kesebilirler."
+
+#: usr/local/www/services_captiveportal.php:592
+msgid "Pre-authentication redirect URL"
+msgstr "Ön kimlik doğrulama yönlendirme adresi"
+
+#: usr/local/www/services_captiveportal.php:595
+#, php-format
+msgid ""
+"Use this field to set $PORTAL_REDIRURL$ variable which can be accessed using "
+"your custom captive portal index.php page or error pages."
+msgstr ""
+"Bu alanı Hizmet Portalı index.php veya hata sayfalarından erişilebilen bir "
+"değişken olan $PORTAL_REDIRURL$ değişkenine değer atamak için "
+"kullanabilirsiniz."
+
+#: usr/local/www/services_captiveportal.php:599
+msgid "After authentication Redirection URL"
+msgstr "Kimlik doğrulama sonrası yönlendirilecek adres"
+
+#: usr/local/www/services_captiveportal.php:603
+msgid ""
+"If you provide a URL here, clients will be redirected to that URL instead of "
+"the one they initially tried to access after they've authenticated."
+msgstr ""
+"Eğer buraya bir adres (URL) girerseniz, kullanıcılar kimlik doğrulama "
+"ardından erişmeye çalıştıkları adres yerine bu adrese yönlendirilirler."
+
+#: usr/local/www/services_captiveportal.php:607
+msgid "Blocked MAC address redirect URL"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:610
+#, php-format
+msgid ""
+"If you provide a URL here, MAC addresses set to be blocked will be redirect "
+"to that URL when attempt to access anything."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:614
+msgid "Concurrent user logins"
+msgstr "Eş zamanlı kullanıcı oturumları"
+
+#: usr/local/www/services_captiveportal.php:617
+msgid "Disable concurrent logins"
+msgstr "Eş zamanlı oturumları devre dışı bırak"
+
+#: usr/local/www/services_captiveportal.php:618
+msgid ""
+"If this option is set, only the most recent login per username will be "
+"active. Subsequent logins will cause machines previously logged in with the "
+"same username to be disconnected."
+msgstr ""
+"Bu seçenek açıldığında, her kullanıcı adına ait son oturum geçerli "
+"olacaktır. Aynı kullanıcı adıyla oturum açıldığında o kullanıcı adıyla "
+"açılan diğer oturumlar kapatılır."
+
+#: usr/local/www/services_captiveportal.php:621
+msgid "MAC filtering"
+msgstr "MAC filtreleme"
+
+#: usr/local/www/services_captiveportal.php:624
+msgid "Disable MAC filtering"
+msgstr "MAC filtrelemeyi devre dışı bırak"
+
+#: usr/local/www/services_captiveportal.php:625
+msgid ""
+"If this option is set, no attempts will be made to ensure that the MAC "
+"address of clients stays the same while they're logged in.This is required "
+"when the MAC address of the client cannot be determined (usually because "
+"there are routers between"
+msgstr ""
+"Bu seçenek açıldığında istemcilerin oturum açtıktan sonra MAC adreslerinin "
+"aynı kaldığına dair herhangi bir kontrol yapılmaz. Kullanıcın MAC adresi "
+"belirlenemiyorsa bu seçeneğin açılması gerekir (genellikle istemcilerle"
+
+#: usr/local/www/services_captiveportal.php:626
+msgid "and the clients)."
+msgstr "arasında yönlendirici(ler) varsa gereklidir)."
+
+#: usr/local/www/services_captiveportal.php:627
+msgid "If this is enabled, RADIUS MAC authentication cannot be used."
+msgstr ""
+"Bu özellik etkinleştirildiğinde RADIUS MAC kimlik doğrulama kullanılamaz."
+
+#: usr/local/www/services_captiveportal.php:630
+msgid "Pass-through MAC Auto Entry"
+msgstr "İzinli MAC otomatik girişi"
+
+#: usr/local/www/services_captiveportal.php:633
+msgid "Enable Pass-through MAC automatic additions"
+msgstr "İzinli MAC otomatik eklemelerini etkinleştir"
+
+#: usr/local/www/services_captiveportal.php:634
+msgid ""
+"If this option is set, a MAC passthrough entry is automatically added after "
+"the user has successfully authenticated. Users of that MAC address will "
+"never have to authenticate again."
+msgstr ""
+"Bu seçenek açıldığında kullanıcı başarılı şekilde kimlik doğruladıktan sonra "
+"otomatik olarak bir MAC izni oluşturulur. O MAC adresinden çıkan "
+"kullanıcıların bir daha kimlik doğrulaması gerekmez."
+
+#: usr/local/www/services_captiveportal.php:635
+#: usr/local/www/services_captiveportal.php:641
+msgid ""
+"To remove the passthrough MAC entry you either have to log in and remove it "
+"manually from the"
+msgstr "İzinli MAC girdisini silmek için oturum açmalı veya silmeli ("
+
+#: usr/local/www/services_captiveportal.php:635
+#: usr/local/www/services_captiveportal.php:641
+msgid "MAC tab"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:635
+#: usr/local/www/services_captiveportal.php:641
+msgid "or send a POST from another system to remove it."
+msgstr ") ya da silmek için başka bir sistemden POST isteğinde bulunmalısınız."
+
+#: usr/local/www/services_captiveportal.php:636
+msgid ""
+"If this is enabled, RADIUS MAC authentication cannot be used. Also, the "
+"logout window will not be shown."
+msgstr ""
+"Etkinleştirildiğinde RADIUS MAC kimlik doğrulama kullanılamaz. Aynı zamanda "
+"oturum kapatma ekranı da görüntülenmeyecektir."
+
+#: usr/local/www/services_captiveportal.php:639
+msgid "Enable Pass-through MAC automatic addition with username"
+msgstr "Kullanıcı adı ile otomatik izinli MAC eklenmesini etkinleştir"
+
+#: usr/local/www/services_captiveportal.php:640
+msgid ""
+"If this option is set, with the automatically MAC passthrough entry created "
+"the username, used during authentication, will be saved."
+msgstr ""
+"Bu seçenek açıldığında otomatik MAC izni eklenirken, kimlik doğrulayan "
+"kullanıcı adı da kaydedilir."
+
+#: usr/local/www/services_captiveportal.php:645
+msgid "Per-user bandwidth restriction"
+msgstr "Kullanıcı başına bant genişliği sınırlaması"
+
+#: usr/local/www/services_captiveportal.php:648
+msgid "Enable per-user bandwidth restriction"
+msgstr "Kullanıcı başına bant genişliği sınırlamasını etkinleştir"
+
+#: usr/local/www/services_captiveportal.php:651
+msgid "Default download"
+msgstr "Varsayılan indirme"
+
+#: usr/local/www/services_captiveportal.php:655
+msgid "Default upload"
+msgstr "Varsayılan gönderme"
+
+#: usr/local/www/services_captiveportal.php:659
+msgid ""
+"If this option is set, the captive portal will restrict each user who logs "
+"in to the specified default bandwidth. RADIUS can override the default "
+"settings. Leave empty or set to 0 for no limit."
+msgstr ""
+"Bu seçenek etkinleştirildiğinde Hizmet Portalı oturum açan her kullanıcıya "
+"belirtilen varsayılan bantgenişliği sınırlamasını uygulayacaktır. RADIUS "
+"varsayılan değerlerin üzerine yazabilir. Sınırlama uygulamamak için boş "
+"bırakın veya 0 atayın."
+
+#: usr/local/www/services_captiveportal.php:667
+msgid "No Authentication"
+msgstr "Kimlik Doğrulama Yok"
+
+#: usr/local/www/services_captiveportal.php:671
+msgid "Local"
+msgstr "Yerel"
+
+#: usr/local/www/services_captiveportal.php:680
+msgid "Allow only users/groups with 'Captive portal login' privilege set"
+msgstr ""
+"Sadece kullanıcılar/gruplar a 'Hizmet portalı giriş' ayrıcalığı ayarlanırsa "
+"izin ver"
+
+#: usr/local/www/services_captiveportal.php:683
+msgid "RADIUS Authentication"
+msgstr "RADIUS Kimlik Doğrulama"
+
+#: usr/local/www/services_captiveportal.php:689
+msgid "RADIUS Protocol"
+msgstr "Radius Protokol"
+
+#: usr/local/www/services_captiveportal.php:694 usr/local/www/vpn_l2tp.php:392
+msgid "PAP"
+msgstr "PAP"
+
+#: usr/local/www/services_captiveportal.php:698
+msgid "CHAP_MD5"
+msgstr "CHAP_MD5"
+
+#: usr/local/www/services_captiveportal.php:702
+msgid "MSCHAPv1"
+msgstr "MSCHAPv1"
+
+#: usr/local/www/services_captiveportal.php:706
+msgid "MSCHAPv2"
+msgstr "MSCHAPv2"
+
+#: usr/local/www/services_captiveportal.php:723
+#: usr/local/www/services_captiveportal.php:766
+msgid "Primary RADIUS server"
+msgstr "Ana RADIUS sunucu"
+
+#: usr/local/www/services_captiveportal.php:728
+msgid ""
+"Enter the IP address of the RADIUS server which users of the captive portal "
+"have to authenticate against."
+msgstr ""
+"Hizmet Portalının kimlik doğrulamada kullanacağı RADIUS sunucusunun IP "
+"adresini giriniz."
+
+#: usr/local/www/services_captiveportal.php:733
+msgid "Leave this field blank to use the default port (1812)."
+msgstr "Varsayılan port 1812unu kullanmak için boş bırakınız."
+
+#: usr/local/www/services_captiveportal.php:736
+#: usr/local/www/services_captiveportal.php:756
+#: usr/local/www/services_captiveportal.php:778
+#: usr/local/www/services_captiveportal.php:797
+msgid "Shared secret"
+msgstr "Paylaşımlı anahtar"
+
+#: usr/local/www/services_captiveportal.php:738
+msgid ""
+"Leave this field blank to not use a RADIUS shared secret (not recommended)."
+msgstr ""
+"Bu alanı boş bırakarak RADIUS paylaşımlı anahtar kullanımını devre dışı "
+"bırakabilirsiniz (tavsiye edilmez)."
+
+#: usr/local/www/services_captiveportal.php:744
+#: usr/local/www/services_captiveportal.php:785 usr/local/www/vpn_pptp.php:450
+msgid "Secondary RADIUS server"
+msgstr "İkincil RADIUS sunucu"
+
+#: usr/local/www/services_captiveportal.php:749
+msgid ""
+"If you have a second RADIUS server, you can activate it by entering its IP "
+"address here."
+msgstr ""
+"İkinci bir RADIUS sunucunuz varsa bu alandan IP adresini girerek "
+"etkinleştirebilirsiniz."
+
+#: usr/local/www/services_captiveportal.php:771
+msgid ""
+"If you have a third RADIUS server, you can activate it by entering its IP "
+"address here."
+msgstr ""
+"Üçüncü bir RADIUS sunucunuz varsa bu alandan IP adresini girerek "
+"etkinleştirebilirsiniz."
+
+#: usr/local/www/services_captiveportal.php:790
+msgid ""
+"If you have a fourth RADIUS server, you can activate it by entering its IP "
+"address here."
+msgstr ""
+"Dördüncü bir RADIUS sunucunuz varsa bu alandan IP adresini girerek "
+"etkinleştirebilirsiniz."
+
+#: usr/local/www/services_captiveportal.php:804
+msgid "Accounting"
+msgstr "Hesaplandırma"
+
+#: usr/local/www/services_captiveportal.php:809
+msgid "send RADIUS accounting packets"
+msgstr "RADIUS hesaplandırma paketleri gönder"
+
+#: usr/local/www/services_captiveportal.php:810
+msgid ""
+"If this is enabled, RADIUS accounting packets will be sent to the primary "
+"RADIUS server."
+msgstr ""
+"Etkinleştirildiğinde ana RADIUS sunucuya RADIUS hesaplandırma paketleri "
+"gönderilir."
+
+#: usr/local/www/services_captiveportal.php:813
+msgid "Accounting port"
+msgstr "Hesaplandırma portu"
+
+#: usr/local/www/services_captiveportal.php:815
+msgid "Leave blank to use the default port (1813)."
+msgstr "Varsayılan (1813) portunun kullanılması için boş bırakınız."
+
+#: usr/local/www/services_captiveportal.php:821
+msgid "Accounting updates"
+msgstr "Hesaplandırma güncellemeleri"
+
+#: usr/local/www/services_captiveportal.php:823
+msgid "no accounting updates"
+msgstr "hesaplandırma güncellemesi yapma"
+
+#: usr/local/www/services_captiveportal.php:824
+msgid "stop/start accounting"
+msgstr "hesaplandırmayı başlat/durdur"
+
+#: usr/local/www/services_captiveportal.php:825
+msgid "interim update"
+msgstr "geçici güncelleme"
+
+#: usr/local/www/services_captiveportal.php:832
+msgid "RADIUS options"
+msgstr "RADIUS seçenekleri"
+
+#: usr/local/www/services_captiveportal.php:835
+msgid "Reauthentication"
+msgstr "Tekrar kimlik doğrulama"
+
+#: usr/local/www/services_captiveportal.php:837
+msgid "Reauthenticate connected users every minute"
+msgstr "Bağlı kullanıcıları her dakika tekrar kimlik doğrulamaya tabi tut"
+
+#: usr/local/www/services_captiveportal.php:838
+msgid ""
+"If reauthentication is enabled, Access-Requests will be sent to the RADIUS "
+"server for each user that is logged in every minute. If an Access-Reject is "
+"received for a user, that user is disconnected from the captive portal "
+"immediately."
+msgstr ""
+"Eğer yeniden kimlik doğrulama açıldıysa her kullanıcının erişim istekleri "
+"her dakika RADIUS sunucuya gönderilir. Herhangi bir kullanıcı için yanıt "
+"olarak erişim reddi alındığında o kullanıcının Hizmet Portalı bağlantısı "
+"kesilir."
+
+#: usr/local/www/services_captiveportal.php:842
+msgid "RADIUS MAC authentication"
+msgstr "RADIUS MAC kimlik doğrulama"
+
+#: usr/local/www/services_captiveportal.php:844
+msgid "Enable RADIUS MAC authentication"
+msgstr "RADIUS MAC kimlik doğrulamayı etkinleştir"
+
+#: usr/local/www/services_captiveportal.php:845
+msgid ""
+"If this option is enabled, the captive portal will try to authenticate users "
+"by sending their MAC address as the username and the password entered below "
+"to the RADIUS server."
+msgstr ""
+"Bu seçenek açıldığında Hizmet Portalı RADIUS sunucuya kullanıcı adı olarak "
+"kullanıcıların MAC adreslerini ve parola olarak da aşağıda girilen değeri "
+"göndererek kimlik kontrolü gerçekleştirir."
+
+#: usr/local/www/services_captiveportal.php:849
+msgid "MAC authentication secret"
+msgstr "MAC kimlik doğrulaması gizli"
+
+#: usr/local/www/services_captiveportal.php:853
+msgid "RADIUS NAS IP attribute"
+msgstr "RADIUS NAS IP niteliği"
+
+#: usr/local/www/services_captiveportal.php:883
+msgid "Choose the IP to use for calling station attribute."
+msgstr "İstemci niteliğini çağırmak için kullanılacak IPyi seçin."
+
+#: usr/local/www/services_captiveportal.php:888
+msgid "Session-Timeout"
+msgstr "Oturum Zaman Aşımı"
+
+#: usr/local/www/services_captiveportal.php:889
+msgid "Use RADIUS Session-Timeout attributes"
+msgstr "RADIUS oturum zaman aşımı niteliklerini kullan"
+
+#: usr/local/www/services_captiveportal.php:890
+msgid ""
+"When this is enabled, clients will be disconnected after the amount of time "
+"retrieved from the RADIUS Session-Timeout attribute."
+msgstr ""
+"Etkinleştirildiğinde istemcilerin bağlantıları RADIUS oturum zaman aşımı "
+"niteliğiyle alınan süre sonunda kesilir."
+
+#: usr/local/www/services_captiveportal.php:906
+#, php-format
+msgid ""
+"If RADIUS type is set to Cisco, in Access-Requests the value of Calling-"
+"Station-Id will be set to the client's IP address and the Called-Station-Id "
+"to the client's MAC address. Default behavior is Calling-Station-Id = "
+"client's MAC address and Called-Station-Id = %s's WAN IP address."
+msgstr ""
+"RADIUS türü Cisco olarak ayarlandığında, erişim isteklerinde Calling-Station-"
+"Id değeri istemcinin IP adresi olarak ve Called-Station-Id de istemcinin MAC "
+"adresi olarak atanır. Öntanımlı davranış Calling-Station-Id'ye istemcinin "
+"MAC adresini ve Called-Station-Id'ye %s WAN IP adresini atamaktır."
+
+#: usr/local/www/services_captiveportal.php:912
+msgid "Accounting Style"
+msgstr "Hesap Tazı"
+
+#: usr/local/www/services_captiveportal.php:913
+msgid "Invert Acct-Input-Octets and Acct-Output-Octets"
+msgstr "Acct-Input-Octets ve Acct-Output-Octets ters çevir"
+
+#: usr/local/www/services_captiveportal.php:914
+msgid ""
+"When this is enabled, data counts for RADIUS accounting packets will be "
+"taken from the client perspective, not the NAS. Acct-Input-Octets will "
+"represent download, and Acct-Output-Octets will represent upload."
+msgstr ""
+"Etkinleştirildiğinde, RADIUS hesabında veri miktarı hesap edilirken, NAS "
+"trafiği değil, client trafiği dikkate alınacak. Acct-Input-Octets indirilen, "
+"Acct-Output-Octets gönderilen veriyi temsil edecek."
+
+#: usr/local/www/services_captiveportal.php:918
+msgid "NAS Identifier"
+msgstr "NAS tanımlayıcısı"
+
+#: usr/local/www/services_captiveportal.php:920
+msgid "Specify a NAS identifier to override the default value"
+msgstr "Varsayılan değeri geçersiz kılmak için bir NAS kimliği belirtin"
+
+#: usr/local/www/services_captiveportal.php:923
+msgid "MAC address format"
+msgstr "MAC adresi formatı"
+
+#: usr/local/www/services_captiveportal.php:938
+msgid ""
+"This option changes the MAC address format used in the whole RADIUS system. "
+"Change this if you also"
+msgstr ""
+"Bu seçenek tüm RADIUS sisteminde belirtilen formatın kullanılmasını sağlar. "
+"RADIUS MAC kimlik"
+
+#: usr/local/www/services_captiveportal.php:939
+msgid "need to change the username format for RADIUS MAC authentication."
+msgstr ""
+"doğrulamadaki kullanıcı adını da değiştirmeniz gerekiyorsa bunu kullanın."
+
+#: usr/local/www/services_captiveportal.php:940
+msgid "default:"
+msgstr "varsayılan:"
+
+#: usr/local/www/services_captiveportal.php:941
+msgid "singledash:"
+msgstr "tek çizgi:"
+
+#: usr/local/www/services_captiveportal.php:942
+msgid "ietf:"
+msgstr "ietf:"
+
+#: usr/local/www/services_captiveportal.php:943
+msgid "cisco:"
+msgstr "cisco:"
+
+#: usr/local/www/services_captiveportal.php:944
+msgid "unformatted:"
+msgstr "düz:"
+
+#: usr/local/www/services_captiveportal.php:951
+msgid "HTTPS login"
+msgstr "HTTPS oturum"
+
+#: usr/local/www/services_captiveportal.php:954
+msgid "Enable HTTPS login"
+msgstr "HTTPS oturumunu etkinleştir"
+
+#: usr/local/www/services_captiveportal.php:955
+msgid ""
+"If enabled, the username and password will be transmitted over an HTTPS "
+"connection to protect against eavesdroppers. A server name and certificate "
+"must also be specified below."
+msgstr ""
+"Etkinleştirildiğinde kullanıcı adı ve şifre dinlenmelerini engellemek için "
+"HTTPS üzerinden gönderilecektir. Bir sunucu adı ve sertifika aşağıda "
+"tanımlanmalıdır."
+
+#: usr/local/www/services_captiveportal.php:958
+msgid "HTTPS server name"
+msgstr "HTTPS sunucu adı"
+
+#: usr/local/www/services_captiveportal.php:961
+#, php-format
+msgid ""
+"This name will be used in the form action for the HTTPS POST and should "
+"match the Common Name (CN) in your certificate (otherwise, the client "
+"browser will most likely display a security warning). Make sure captive "
+"portal clients can resolve this name in DNS and verify on the client that "
+"the IP resolves to the correct interface IP on %s."
+msgstr ""
+"Bu isim HTTPS POST form eyleminde kullanılacaktır ve sertifikanızdaki Ortak "
+"İsim (CN - Common Name) ile aynı olmalıdır (aksi taktirde istemci browser "
+"büyük ihtimalle bir güvenlik uyarısı verecektir). Hizmet Portalı "
+"istemcilerinin DNS'te bu ismi çözümleyebildiğinden ve istemcide IP'nin %s "
+"üzerindeki doğru arabirim IP'sine gittiğine emin olmalısınız."
+
+#: usr/local/www/services_captiveportal.php:964
+#: usr/local/www/system_advanced_admin.php:357
+msgid "SSL Certificate"
+msgstr "SSL Sertifikası"
+
+#: usr/local/www/services_captiveportal.php:978
+msgid "No Certificates defined."
+msgstr "Tanımlı sertifika yok."
+
+#: usr/local/www/services_captiveportal.php:983
+#: usr/local/www/services_captiveportal.php:986
+msgid "Disable HTTPS forwards"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:987
+msgid ""
+"If this option is set, attempts to connect to SSL/HTTPS (Port 443) sites "
+"will not be forwarded to the captive portal. This prevents certificate "
+"errors from being presented to the user even if HTTPS logins are enabled. "
+"Users must attempt a connecton to an HTTP (Port 80) site to get forwarded to "
+"the captive portal. If HTTPS logins are enabled, the user will be redirected "
+"to the HTTPS login page."
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:990
+msgid "Portal page contents"
+msgstr "Hizmet Portalı sayfa içerikleri"
+
+#: usr/local/www/services_captiveportal.php:1005
+#: usr/local/www/services_captiveportal.php:1045
+#: usr/local/www/services_captiveportal.php:1065
+msgid "View current page"
+msgstr "Sayfayı görüntüle"
+
+#: usr/local/www/services_captiveportal.php:1007
+#: usr/local/www/services_captiveportal.php:1047
+#: usr/local/www/services_captiveportal.php:1067
+msgid "Download current page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1010
+msgid "Restore default portal page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1017
+#, php-format
+msgid ""
+"Upload an HTML/PHP file for the portal page here (leave blank to keep the "
+"current one). Make sure to include a form (POST to %1$s) with a submit "
+"button (%2$s) and a hidden field with %3$s and %4$s. Include the %5$s and "
+"%6$s and/or %7$s input fields if authentication is enabled, otherwise it "
+"will always fail."
+msgstr ""
+"Hizmet Portalı için bir HTML/PHP sayfası yükleyin. %1$s POST yapacak bir "
+"form, %2$s bir gönder düğmesi ve %3$s ve %4$s şeklinde bir gizli alan "
+"eklemeyi unutmayın. Kimlik doğrulama açıksa %5$s ve %6$s girdi alanlarını "
+"eklemeyi unutmayın. Ayrıca kimlik doğrulama açıksa %7$s alanını da "
+"ekleyebilirsiniz."
+
+#: usr/local/www/services_captiveportal.php:1028
+msgid "Example code for the form:"
+msgstr "Form için örnek kod:"
+
+#: usr/local/www/services_captiveportal.php:1040
+msgid "error page"
+msgstr "hata sayfası"
+
+#: usr/local/www/services_captiveportal.php:1041
+#: usr/local/www/services_captiveportal.php:1061
+msgid "contents"
+msgstr "içindekiler"
+
+#: usr/local/www/services_captiveportal.php:1050
+msgid "Restore default error page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1055
+msgid ""
+"The contents of the HTML/PHP file that you upload here are displayed when an "
+"authentication error occurs. You may include"
+msgstr ""
+"Burada yüklediğiniz HTML/PHP dosyası bir kimlik doğrulama hatası oluştuğunda "
+"gösterilen dosyadır"
+
+#: usr/local/www/services_captiveportal.php:1056
+msgid ""
+"which will be replaced by the error or reply messages from the RADIUS "
+"server, if any."
+msgstr ""
+"eklediğinizde RADIUS sunucudan gelen hata mesajı veya yanıtla değiştirilir."
+
+#: usr/local/www/services_captiveportal.php:1070
+msgid "Restore default logout page"
+msgstr ""
+
+#: usr/local/www/services_captiveportal.php:1075
+msgid ""
+"The contents of the HTML/PHP file that you upload here are displayed on "
+"authentication success when the logout popup is enabled."
+msgstr ""
+"Burada yüklediğiniz HTML/PHP dosyası oturum kapatma penceresi "
+"etkinleştirildiğinde kimlik doğrulandıktan sonra gösterilir."
+
+#: usr/local/www/services_captiveportal.php:1088
+msgid ""
+"Changing any settings on this page will disconnect all clients! Don't forget "
+"to enable the DHCP server on your captive portal interface! Make sure that "
+"the default/maximum DHCP lease time is higher than the timeout entered on "
+"this page. Also, the DNS forwarder needs to be enabled for DNS lookups by "
+"unauthenticated clients to work."
+msgstr ""
+"Bu sayfadaki herhangi bir ayarı değiştirmek tüm istemcilerin bağlantısını "
+"kesecektir. Hizmet Portalı arabiriminde DHCP sunucuyu etkinleştirmeyi "
+"unutmayın. DHCP kira süresinin bu sayfada girilen zaman aşımından yüksek "
+"olması gerekir. Ayrıca, kimliği doğrulanmamış istemcilerin DNS sorgularının "
+"çalışması için DNS yönlendiricinin etkinleştirilmesi gerekir."
+
+#: usr/local/www/services_captiveportal_filemanager.php:99
+#, php-format
+msgid "A file with the name '%s' already exists."
+msgstr "%s adında dosya sistemde zaten mevcut."
+
+#: usr/local/www/services_captiveportal_filemanager.php:106
+msgid "The total size of all files uploaded may not exceed "
+msgstr "Tüm dosyaların toplam boyutu şu değeri geçemez "
+
+#: usr/local/www/services_captiveportal_filemanager.php:166
+#: usr/local/www/services_captiveportal_filemanager.php:205
+msgid "add file"
+msgstr "dosya ekle"
+
+#: usr/local/www/services_captiveportal_filemanager.php:177
+msgid "Do you really want to delete this file?"
+msgstr "Bu dosyayı silmek istediğinize emin misiniz?"
+
+#: usr/local/www/services_captiveportal_filemanager.php:177
+msgid "delete file"
+msgstr "dosyayı sil"
+
+#: usr/local/www/services_captiveportal_filemanager.php:184
+msgid "TOTAL"
+msgstr "TOPLAM"
+
+#: usr/local/www/services_captiveportal_filemanager.php:195
+msgid "cancel"
+msgstr "iptal"
+
+#: usr/local/www/services_captiveportal_filemanager.php:215
+msgid ""
+"Any files that you upload here with the filename prefix of captiveportal- "
+"will be made available in the root directory of the captive portal HTTP(S) "
+"server. You may reference them directly from your portal page HTML code "
+"using relative paths. Example: you've uploaded an image with the name "
+"'captiveportal-test.jpg' using the file manager. Then you can include it in "
+"your portal page like this:"
+msgstr ""
+"Burada yükleyeceğiniz tüm dosyalarının adlarının başına captiveportal- "
+"eklenecektir ve Hizmet Portalı HTTP(S) sunucusunun kök dizininden "
+"erişilebilir olacaktır. Portal sayfalarınızın HTML'in bu dosyalara atıfta "
+"bulunabilirsiniz. Örneğin dosya yöneticisini kullanacak 'captiveportal-test."
+"jpg' adlında bir dosya yüklediyseniz, Hizmet Portalı sayfalarınızda şu "
+"şekilde atıfta bulunabilirsiniz:"
+
+#: usr/local/www/services_captiveportal_filemanager.php:222
+msgid ""
+"In addition, you can also upload .php files for execution. You can pass the "
+"filename to your custom page from the initial page by using text similar to:"
+msgstr ""
+"Ek olarak, çalıştırılmak üzere .php dosyaları da yükleyebilirsiniz. "
+"Hazırladığınız özel dosyalara ana dosyadan şuna benzer şekilde atıfta "
+"bulunabilirsiniz:"
+
+#: usr/local/www/services_captiveportal_filemanager.php:225
+msgid "Acceptable usage policy"
+msgstr "Kabul edilebilir kullanım ilkeleri"
+
+#: usr/local/www/services_captiveportal_filemanager.php:227
+#, php-format
+msgid "The total size limit for all files is %s."
+msgstr "Tüm dosyalar için toplam boyut limiti %s."
+
+#: usr/local/www/services_captiveportal_hostname.php:115
+msgid "Allowed IP Addresses"
+msgstr "İzinli IP Adresleri"
+
+#: usr/local/www/services_captiveportal_hostname.php:132
+#: usr/local/www/services_captiveportal_hostname.php:168
+#: usr/local/www/services_captiveportal_ip.php:125
+#: usr/local/www/services_captiveportal_ip.php:165
+msgid "add address"
+msgstr "adres ekle"
+
+#: usr/local/www/services_captiveportal_hostname.php:158
+#: usr/local/www/services_captiveportal_ip.php:155
+msgid "edit address"
+msgstr "adres düzenle"
+
+#: usr/local/www/services_captiveportal_hostname.php:159
+#: usr/local/www/services_captiveportal_ip.php:156
+msgid "Do you really want to delete this address?"
+msgstr "Bu adresi silmek istediğinize emin misiniz?"
+
+#: usr/local/www/services_captiveportal_hostname.php:159
+#: usr/local/www/services_captiveportal_ip.php:156
+msgid "delete address"
+msgstr "adresi sil"
+
+#: usr/local/www/services_captiveportal_hostname.php:177
+msgid ""
+"Adding allowed Hostnames will allow a DNS hostname access to/from access "
+"through the captive portal without being taken to the portal page. This can "
+"be used for a web server serving images for the portal page or a DNS server "
+"on another network, for example. By specifying <em>from</em> addresses, it "
+"may be used to always allow pass-through access from a client behind the "
+"captive portal."
+msgstr ""
+"Eklenen izinli sunucu adresleri portal sayfalarına yönlendirilmeksizin "
+"trafik gidiş-gelişine izin verilen adreslerdir. Bu özelliği başka bir ağdan "
+"hizmet portalına resim gönderen bir web sunucu gibi sistemlere erişim vermek "
+"ya da başka bir ağdaki DNS sunucuya sorgu yapabilmek için kullanabilirsiniz. "
+"<em>Kaynak</em> adresleri belirterek Hizmet Portalının arkasındaki bir "
+"istemciden bu adrese her zaman erişim izni verilebilir."
+
+#: usr/local/www/services_captiveportal_hostname.php:181
+#: usr/local/www/services_captiveportal_hostname.php:188
+msgid "All connections"
+msgstr "Tüm bağlantılar"
+
+#: usr/local/www/services_captiveportal_hostname.php:181
+#: usr/local/www/services_captiveportal_hostname.php:188
+msgid "the Hostname are allowed"
+msgstr "İzin verilen hostlar"
+
+#: usr/local/www/services_captiveportal_hostname.php:188
+msgid "from"
+msgstr "kaynak"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:60
+msgid "Edit allowed Hostname"
+msgstr "İzinli host düzenle"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:102
+msgid "Allowed Hostname"
+msgstr "İzin verilen host adı"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:107
+#, php-format
+msgid "A valid Hostname must be specified. [%s]"
+msgstr "Geçerli bir host adı belirtilmelidir. [%s]"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:110
+#: usr/local/www/services_captiveportal_ip_edit.php:112
+#: usr/local/www/services_captiveportal_mac_edit.php:122
+msgid "Upload speed needs to be an integer"
+msgstr "Gönderme hızı tamsayı olmalıdır"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:112
+#: usr/local/www/services_captiveportal_ip_edit.php:115
+#: usr/local/www/services_captiveportal_mac_edit.php:124
+msgid "Download speed needs to be an integer"
+msgstr "İndirme hızı tamsayı olmalıdır"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:119
+#: usr/local/www/services_captiveportal_ip_edit.php:122
+msgid "already allowed"
+msgstr "zaten izinli"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:167
+#: usr/local/www/services_captiveportal_hostname_edit.php:175
+#: usr/local/www/system_gateways_edit.php:771
+#: usr/local/www/system_gateways_edit.php:783
+msgid "From"
+msgstr "Kaynak"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:167
+#: usr/local/www/services_captiveportal_hostname_edit.php:176
+#: usr/local/www/system_gateways_edit.php:774
+#: usr/local/www/system_gateways_edit.php:786
+msgid "To"
+msgstr "Hedef"
+
+# kelime içinde yeri yok herhangi bir veri girmeyiniz tek boşluk bırakılacak.
+#: usr/local/www/services_captiveportal_hostname_edit.php:175
+#: usr/local/www/services_captiveportal_hostname_edit.php:176
+msgid "Use"
+msgstr " "
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:175
+msgid ""
+"to always allow an Hostname through the captive portal (without "
+"authentication)"
+msgstr ""
+"İstemciyi (kimlik doğrulamaya tabi tutmadan) hizmet portalından geçişine "
+"izin ver"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:176
+msgid ""
+"to allow access from all clients (even non-authenticated ones) behind the "
+"portal to this Hostname"
+msgstr ""
+"tüm istemcilerden (kimliği doğrulanmamış olanlar dahil) bu sunucuya erişim "
+"ver"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:192
+#: usr/local/www/services_captiveportal_ip_edit.php:210
+#: usr/local/www/services_captiveportal_mac_edit.php:226
+msgid "Bandwidth up"
+msgstr "Gönderme bantgenişliği"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:195
+msgid "Enter a upload limit to be enforced on this Hostname in Kbit/s"
+msgstr "Kbit/sn cinsinden bu sunucuya veri gönderme hızı belirleyin"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:198
+#: usr/local/www/services_captiveportal_ip_edit.php:217
+#: usr/local/www/services_captiveportal_mac_edit.php:234
+msgid "Bandwidth down"
+msgstr "İndirme bantgenişliği"
+
+#: usr/local/www/services_captiveportal_hostname_edit.php:201
+msgid "Enter a download limit to be enforced on this Hostname in Kbit/s"
+msgstr "Kbit/sn cinsinden bu sunucudan veri indirme hızı belirleyin"
+
+#: usr/local/www/services_captiveportal_ip.php:174
+msgid ""
+"Adding allowed IP addresses will allow IP access to/from these addresses "
+"through the captive portal without being taken to the portal page. This can "
+"be used for a web server serving images for the portal page or a DNS server "
+"on another network, for example."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_ip_edit.php:61
+msgid "Edit allowed IP address"
+msgstr "İzinli IP adresini düzenle"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:101
+msgid "Allowed IP address"
+msgstr "İzinli IP adresi"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:101
+#: usr/local/www/services_dhcp.php:810 usr/local/www/services_dhcpv6.php:561
+msgid "Subnet mask"
+msgstr "Altağ maskesi"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:109
+msgid "A valid subnet mask must be specified"
+msgstr "Geçerli bir Alt Ağ maskesi belirtin"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:187
+msgid "Edit allowed ip rule"
+msgstr "İzinli IP kuralını düzenle"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:199
+msgid "IP address and subnet mask. Use /32 for a single IP"
+msgstr "IP adresi ve altağ maskesi. Tek IP için /32 kullanınız"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:213
+msgid "Enter a upload limit to be enforced on this IP address in Kbit/s"
+msgstr "Kbit/sn cinsinden bu IP adresine veri gönderme hızı sınırını girin"
+
+#: usr/local/www/services_captiveportal_ip_edit.php:220
+msgid "Enter a download limit to be enforced on this IP address in Kbit/s"
+msgstr "Kbit/sn cinsinden bu IP adresinden veri çekme hızı sınırını girin"
+
+#: usr/local/www/services_captiveportal_mac.php:82
+msgid "No entry exists yet!"
+msgstr "Henüz herhangi bir kayıt girilmemiş!"
+
+#: usr/local/www/services_captiveportal_mac.php:86
+msgid "Please set the zone on which the operation should be allowed"
+msgstr "Lütfen bu alanı izin verilecek işleme göre ayarlayınız"
+
+#: usr/local/www/services_captiveportal_mac.php:98
+msgid "No entry exists for this username:"
+msgstr "Bu kullanıcı için hehangi bir kayıt bulunamadı:"
+
+#: usr/local/www/services_captiveportal_mac.php:117
+msgid "The entry was sucessfully deleted"
+msgstr "Kayıt başarıyla silindi"
+
+#: usr/local/www/services_captiveportal_mac.php:119
+msgid "No entry exists for this mac address:"
+msgstr "Bu MAC adresi için kayıt bulunamadı:"
+
+#: usr/local/www/services_captiveportal_mac.php:150
+msgid ""
+"The captive portal MAC address configuration has been changed.<br />You must "
+"apply the changes in order for them to take effect."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac.php:191
+msgid "edit host"
+msgstr "host düzenle"
+
+#: usr/local/www/services_captiveportal_mac.php:194
+#: usr/local/www/services_dnsmasq.php:398
+#: usr/local/www/services_unbound.php:466
+msgid "Do you really want to delete this host?"
+msgstr "Bu hostu silmek istediğinize emin misiniz?"
+
+#: usr/local/www/services_captiveportal_mac.php:195
+msgid "delete host"
+msgstr "host sil"
+
+#: usr/local/www/services_captiveportal_mac.php:208
+msgid "add host"
+msgstr "host ekle"
+
+#: usr/local/www/services_captiveportal_mac.php:216
+msgid ""
+"Adding MAC addresses as 'pass' MACs allows them access through the captive "
+"portal automatically without being taken to the portal page."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:61
+#: usr/local/www/services_captiveportal_mac_edit.php:183
+msgid "Edit MAC address rules"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:113
+#, php-format
+msgid ""
+"The MAC address %s belongs to a local interface, you cannot use it here."
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:118
+msgid "A valid MAC address must be specified"
+msgstr "Geçerli bir MAC adresi belirtilmelidir"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:131
+#: usr/local/www/services_captiveportal_zones_edit.php:70
+msgid "already exists"
+msgstr "zaten mevcut"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:201
+msgid "Choose what to do with packets coming from this MAC address"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_mac_edit.php:213
+#: usr/local/www/services_dhcp_edit.php:382
+msgid "Copy my MAC address"
+msgstr "Mac adresimi kopyala"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:215
+msgid "MAC address (6 hex octets separated by colons)"
+msgstr ""
+"MAC adresi (birbirinden : ile ayrılmış 6 adet çift basamaklı onaltılık sayı)"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:230
+msgid "Enter a upload limit to be enforced on this MAC address in Kbit/s"
+msgstr "Bu MAC adresi için Kbit/sn cinsinden veri gönderme limiti giriniz"
+
+#: usr/local/www/services_captiveportal_mac_edit.php:238
+msgid "Enter a download limit to be enforced on this MAC address in Kbit/s"
+msgstr "Bu MAC adresi için Kbit/sn cinsinden veri indirme limiti giriniz"
+
+#: usr/local/www/services_captiveportal_vouchers.php:67
+msgid ""
+"You will need to recreate any existing Voucher Rolls due to the public and "
+"private key changes. Click cancel if you do not wish to recreate the "
+"vouchers."
+msgstr ""
+"Genel ve özel anahtarlar değiştiği için Bilet Gruplarının yeniden "
+"hazırlanması gerekir. Eğer biletleri yeniden oluşturmak istemiyorsanız "
+"İptal'e tıklayın."
+
+#: usr/local/www/services_captiveportal_vouchers.php:133
+msgid "Voucher invalid"
+msgstr "Bilet geçersiz"
+
+#: usr/local/www/services_captiveportal_vouchers.php:135
+msgid "Voucher expired"
+msgstr "Biletin süresi doldu"
+
+#: usr/local/www/services_captiveportal_vouchers.php:158
+msgid "Cannot write private key file"
+msgstr "Özel anahtar dosyası yazılamadı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:178
+msgid "Need private RSA key to print vouchers"
+msgstr "Biletlerin yazdırılması için RSA özel anahtarına ihtiyaç duyulmaktadır"
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "charset"
+msgstr "karakter kümesi"
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "rollbits"
+msgstr "grup bit sayısı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "ticketbits"
+msgstr "bilet bit sayısı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "checksumbits"
+msgstr "kontrol bit sayısı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "publickey"
+msgstr "genel anahtar"
+
+#: usr/local/www/services_captiveportal_vouchers.php:213
+msgid "magic"
+msgstr "özel"
+
+#: usr/local/www/services_captiveportal_vouchers.php:216
+#: usr/local/www/services_captiveportal_vouchers.php:603
+msgid "Synchronize Voucher Database IP"
+msgstr "Bilet Veritabanı IP Adresi"
+
+#: usr/local/www/services_captiveportal_vouchers.php:216
+msgid "Sync port"
+msgstr "Senkron portu"
+
+#: usr/local/www/services_captiveportal_vouchers.php:216
+msgid "Sync password"
+msgstr "Senkron parolası"
+
+#: usr/local/www/services_captiveportal_vouchers.php:216
+msgid "Sync username"
+msgstr "Senkron kullanıcı adı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:225
+msgid "Need at least 2 characters to create vouchers."
+msgstr "Bilet oluşturmak için en az 2 karater gerekir."
+
+#: usr/local/www/services_captiveportal_vouchers.php:227
+msgid "Double quotes aren't allowed."
+msgstr "Çift tırnak kullanılamaz."
+
+#: usr/local/www/services_captiveportal_vouchers.php:229
+msgid "aren't allowed."
+msgstr "kullanılamaz."
+
+#: usr/local/www/services_captiveportal_vouchers.php:231
+msgid "# of Bits to store Roll Id needs to be between 1..31."
+msgstr "# Grup Kimliğinin saklanacağı bit sayısı 1 ile 31 arasında olmalıdır."
+
+#: usr/local/www/services_captiveportal_vouchers.php:233
+msgid "# of Bits to store Ticket Id needs to be between 1..16."
+msgstr "# Bilet Kimliğinin saklanacağı bit sayısı 1 ile 16 arasında olmalıdır."
+
+#: usr/local/www/services_captiveportal_vouchers.php:235
+msgid "# of Bits to store checksum needs to be between 1..31."
+msgstr ""
+"# Kontrol değerinin saklanacağı bit sayısı 1 ile 31 arasında olmalıdır."
+
+#: usr/local/www/services_captiveportal_vouchers.php:237
+msgid "This doesn't look like an RSA Public key."
+msgstr "Bu bir RSA Ortak anahtarına benzemiyor."
+
+#: usr/local/www/services_captiveportal_vouchers.php:239
+msgid "This doesn't look like an RSA Private key."
+msgstr "Bu bir RSA Özel anahtarına benzemiyor."
+
+#: usr/local/www/services_captiveportal_vouchers.php:241
+msgid "You cannot sync the voucher database to this host (itself)."
+msgstr "Bilet veritabanını bu sunucuya (kendisine) senkron edemezsiniz."
+
+#: usr/local/www/services_captiveportal_vouchers.php:459
+msgid "Enable Vouchers"
+msgstr "Biletleri Etkinleştir"
+
+#: usr/local/www/services_captiveportal_vouchers.php:464
+#: usr/local/www/status_captiveportal.php:117
+#: usr/local/www/status_captiveportal_expire.php:74
+#: usr/local/www/status_captiveportal_test.php:74
+#: usr/local/www/status_captiveportal_voucher_rolls.php:58
+#: usr/local/www/status_captiveportal_voucher_rolls.php:79
+#: usr/local/www/status_captiveportal_vouchers.php:112
+msgid "Voucher Rolls"
+msgstr "Bilet Grupları"
+
+#: usr/local/www/services_captiveportal_vouchers.php:473
+#: usr/local/www/services_captiveportal_vouchers_edit.php:174
+#: usr/local/www/status_captiveportal_vouchers.php:124
+msgid "Roll"
+msgstr "Grup"
+
+#: usr/local/www/services_captiveportal_vouchers.php:474
+#: usr/local/www/status_captiveportal_voucher_rolls.php:91
+msgid "Minutes/Ticket"
+msgstr "Dakika/Bilet"
+
+#: usr/local/www/services_captiveportal_vouchers.php:475
+msgid "of Tickets"
+msgstr "Bilette"
+
+#: usr/local/www/services_captiveportal_vouchers.php:476
+#: usr/local/www/services_captiveportal_vouchers_edit.php:198
+#: usr/local/www/status_captiveportal_voucher_rolls.php:93
+msgid "Comment"
+msgstr "Yorum"
+
+#: usr/local/www/services_captiveportal_vouchers.php:496
+msgid "edit voucher"
+msgstr "bilet düzenle"
+
+#: usr/local/www/services_captiveportal_vouchers.php:497
+msgid ""
+"Do you really want to delete this voucher? This makes all vouchers from this "
+"roll invalid"
+msgstr ""
+"Bu bileti silmek istediğinize emin misiniz? Bu eylem bu gruptaki tüm "
+"biletleri geçersiz kılar"
+
+#: usr/local/www/services_captiveportal_vouchers.php:497
+msgid "delete vouchers"
+msgstr "biletleri sil"
+
+#: usr/local/www/services_captiveportal_vouchers.php:498
+msgid "generate vouchers for this roll to CSV file"
+msgstr "bu gruptaki biletleri CSV dosyasına yaz"
+
+#: usr/local/www/services_captiveportal_vouchers.php:508
+msgid "add voucher"
+msgstr "bilet ekle"
+
+#: usr/local/www/services_captiveportal_vouchers.php:513
+msgid ""
+"Create, generate and activate Rolls with Vouchers that allow access through "
+"the captive portal for the configured time. Once a voucher is activated, its "
+"clock is started and runs uninterrupted until it expires. During that time, "
+"the voucher can be re-used from the same or a different computer. If the "
+"voucher is used again from another computer, the previous session is stopped."
+msgstr ""
+"Hizmet Portalında istenen zaman aralığında kullanılmak üzere bilet(ler) "
+"oluşturup etkinleştirebilirsiniz. Bir bilet etkinleştirildiğinde saati "
+"başlar ve süresi dolana kadar kesintisiz devam eder. Bu süre zarfında bilet "
+"aynı bilgisayardan veya farklı bilgisayardan kullanılabilir. Eğer bilet "
+"farklı bir bilgisayarda kullanılırsa önceki oturum kapatılır."
+
+#: usr/local/www/services_captiveportal_vouchers.php:519
+msgid ""
+"Enable Voucher support first using the checkbox above and hit Save at the "
+"bottom."
+msgstr ""
+"Bilet desteğini etkinleştirmek için aşağıdaki seçim kutusunu işaretleyip "
+"Kaydet'e tıklayın."
+
+#: usr/local/www/services_captiveportal_vouchers.php:525
+msgid "Voucher public key"
+msgstr "Bilet ortak anahtarı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:530
+msgid ""
+"Paste an RSA public key (64 Bit or smaller) in PEM format here. This key is "
+"used to decrypt vouchers."
+msgstr ""
+"Buraya PEM formatında bir RSA ortak anahtarı (64 bit veya daha küçük) "
+"yapıştırın. Bu anahtar biletleri çözümlemede kullanılır."
+
+#: usr/local/www/services_captiveportal_vouchers.php:530
+#: usr/local/www/services_captiveportal_vouchers.php:537
+msgid "Generate"
+msgstr "Oluştur"
+
+#: usr/local/www/services_captiveportal_vouchers.php:530
+#: usr/local/www/services_captiveportal_vouchers.php:537
+msgid "new key"
+msgstr "yeni anahtar"
+
+#: usr/local/www/services_captiveportal_vouchers.php:533
+msgid "Voucher private key"
+msgstr "Bilet özel anahtarı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:537
+msgid ""
+"Paste an RSA private key (64 Bit or smaller) in PEM format here. This key is "
+"only used to generate encrypted vouchers and doesn't need to be available if "
+"the vouchers have been generated offline."
+msgstr ""
+"Buraya PEM formatında bir RSA özel anahtarı (64 bit veya daha küçük) "
+"yapıştırın. Bu anahtar sadece şifrelenmiş biletleri oluştururken kullanılır "
+"ve bilet çevrimdışı olarak oluşturulmuşsa erişilebilir durumda olması "
+"gerekmez."
+
+#: usr/local/www/services_captiveportal_vouchers.php:540
+msgid "Character set"
+msgstr "Karakter kümesi"
+
+#: usr/local/www/services_captiveportal_vouchers.php:544
+msgid ""
+"Tickets are generated with the specified character set. It should contain "
+"printable characters (numbers, lower case and upper case letters) that are "
+"hard to confuse with others. Avoid e.g. 0/O and l/1."
+msgstr ""
+"Biletler belirtilen karakter kümesinde oluşturulur. Diğer karakterlerle "
+"karıştırılmayacak alfanümerik karakterler (rakamlar, büyük ve küçük harfler) "
+"içermelidir. O (harf), 0 (sıfır), l (harf) ve 1 (bir) gibi karakterler "
+"kullanmaktan kaçının."
+
+#: usr/local/www/services_captiveportal_vouchers.php:548
+msgid "of Roll Bits"
+msgstr "Grup Bitleri"
+
+#: usr/local/www/services_captiveportal_vouchers.php:552
+msgid ""
+"Reserves a range in each voucher to store the Roll # it belongs to. Allowed "
+"range: 1..31. Sum of Roll+Ticket+Checksum bits must be one Bit less than the "
+"RSA key size."
+msgstr ""
+"Her bilette biletin ait olduğu grup numarasını saklamak için bir aralığı "
+"ayırır. İzin verilen bit sayısı 1 ile 31 arasıdır. Grup, Bilet ve Kontrol "
+"toplamı bitleri toplam sayısı RSA anahtar boyutundan bir düşük olmalıdır."
+
+#: usr/local/www/services_captiveportal_vouchers.php:556
+msgid "of Ticket Bits"
+msgstr "Bilet bitleri"
+
+#: usr/local/www/services_captiveportal_vouchers.php:560
+msgid ""
+"Reserves a range in each voucher to store the Ticket# it belongs to. Allowed "
+"range: 1..16. Using 16 bits allows a roll to have up to 65535 vouchers. A "
+"bit array, stored in RAM and in the config, is used to mark if a voucher has "
+"been used. A bit array for 65535 vouchers requires 8 KB of storage."
+msgstr ""
+"Her bilette bilet kimliğini saklamak için bir aralığı ayırır. İzin verilen "
+"bit sayısı 1 ile 16 arasındadır. 16 bit kullanılması bir bilet grubunda "
+"65535 bilet olmasına olanak verir. Oluşan dizeler RAMda ve sistem "
+"yapılandırma dosyasında tutulur ve biletin kullanımda olup olmadığı oradan "
+"takip edilir. 65535 biletli bir dize 8KB depolama alanı gerektirir."
+
+#: usr/local/www/services_captiveportal_vouchers.php:564
+msgid "of Checksum Bits"
+msgstr "Kontrol Toplamı Bitleri"
+
+#: usr/local/www/services_captiveportal_vouchers.php:568
+msgid ""
+"Reserves a range in each voucher to store a simple checksum over Roll # and "
+"Ticket#. Allowed range is 0..31."
+msgstr ""
+"Her biletin bir kısmını grup ve bilet kimliklerinin kontrol toplamını "
+"saklamak için ayırır. İzin verilen aralık 0-31dir."
+
+#: usr/local/www/services_captiveportal_vouchers.php:572
+msgid "Magic Number"
+msgstr "Özel Numara"
+
+#: usr/local/www/services_captiveportal_vouchers.php:576
+msgid ""
+"Magic number stored in every voucher. Verified during voucher check. Size "
+"depends on how many bits are left by Roll+Ticket+Checksum bits. If all bits "
+"are used, no magic number will be used and checked."
+msgstr ""
+"Her bilette saklanan özel numara. Bilet kontrolü sırasında doğrulanır. "
+"Boyutu grup, bilet ve kontrol toplamı için kaç bit ayrıldığına bağlıdır. Tüm "
+"bitler kullanımdaysa özel numara kullanılmaz ve kontrol edilmez."
+
+#: usr/local/www/services_captiveportal_vouchers.php:580
+msgid "Invalid Voucher Message"
+msgstr "Geçersiz Bilet Mesajı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:583
+msgid ""
+"Error message displayed for invalid vouchers on captive portal error page"
+msgstr ""
+"Hizmet Portalında geçersiz bilet kullanıldığında hata sayfasında "
+"gösterilecek hata mesajı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:587
+msgid "Expired Voucher Message"
+msgstr "Süresi Geçmiş Bilet Mesajı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:590
+msgid ""
+"Error message displayed for expired vouchers on captive portal error page"
+msgstr ""
+"Hizmet Portalında süresi dolmuş bilet kullanıldığında hata sayfasında "
+"gösterilecek hata mesajı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:600
+msgid "Voucher database synchronization"
+msgstr "Bilet veritabanı senkronizasyonu"
+
+#: usr/local/www/services_captiveportal_vouchers.php:606
+msgid ""
+"IP address of master nodes webConfigurator to synchronize voucher database "
+"and used vouchers from."
+msgstr ""
+"webArayüzü bilet veritabanını ve kullanılmış biletleri senkronize edeceği IP "
+"adresi."
+
+#: usr/local/www/services_captiveportal_vouchers.php:607
+msgid "NOTE: this should be setup on the slave nodes and not the primary node!"
+msgstr "NOT: Bu ayar ana uçta değil diğer uçlarda yapılmalıdır!"
+
+#: usr/local/www/services_captiveportal_vouchers.php:611
+msgid "Voucher sync port"
+msgstr "Bilet senkronizasyon portu"
+
+#: usr/local/www/services_captiveportal_vouchers.php:614
+msgid ""
+"This is the port of the master voucher nodes webConfigurator. Example: 443"
+msgstr ""
+"webArayüzü bilet verilerinin senkronizasyonu için kullanılacak porttur. "
+"Örnek: 443"
+
+#: usr/local/www/services_captiveportal_vouchers.php:618
+msgid "Voucher sync username"
+msgstr "Bilet senkronizasyon kullanıcı adı"
+
+#: usr/local/www/services_captiveportal_vouchers.php:621
+msgid "This is the username of the master voucher nodes webConfigurator."
+msgstr "webArayüzü ana bilet düğümlerinde verilecek kullanıcı adı."
+
+#: usr/local/www/services_captiveportal_vouchers.php:625
+msgid "Voucher sync password"
+msgstr "Bilet senkronizasyon parolası"
+
+#: usr/local/www/services_captiveportal_vouchers.php:628
+msgid "This is the password of the master voucher nodes webConfigurator."
+msgstr "webArayüzü ana bilet düğümlerinde verilecek parola."
+
+#: usr/local/www/services_captiveportal_vouchers.php:643
+msgid ""
+"Changing any Voucher parameter (apart from managing the list of Rolls) on "
+"this page will render existing vouchers useless if they were generated with "
+"different settings."
+msgstr ""
+"Bu sayfadaki herhangi bir Bilet parametresini değiştirmek (grup listesi "
+"yönetimi dışında) varolan biletleri (eğer farklı ayarlarla "
+"oluşturulmuşlarsa) geçersiz kılacaktır."
+
+#: usr/local/www/services_captiveportal_vouchers.php:645
+msgid ""
+"Specifying the Voucher Database Synchronization options will not record any "
+"other value from the other options. They will be retrieved/synced from the "
+"master."
+msgstr ""
+"Bilet Veritabanı Senkronizasyon ayarları yapılırsa diğer seçenekler "
+"kaydedilmez, ana uçtan alınır/senkronize edilir."
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:46
+msgid "Edit Voucher Rolls"
+msgstr "Bilet Gruplarını Yönet"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:94
+#: usr/local/www/services_dhcp.php:1156 usr/local/www/services_dhcpv6.php:789
+msgid "Number"
+msgstr "Sıra"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:101
+#, php-format
+msgid "Roll number %s already exists."
+msgstr "Grup numarası %s zaten var."
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:107
+#, php-format
+msgid "Roll number must be numeric and less than %s"
+msgstr "Grup numarası sayı olmalıdır ve %s sayısından küçük olmalıdır"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:110
+#, php-format
+msgid "A roll has at least one voucher and less than %s."
+msgstr "Bir grubun %s sayısından düşük olmak kaydıyla en az bir bileti var."
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:113
+msgid "Each voucher must be good for at least 1 minute."
+msgstr "Her bilet en az 1 dakika kullanılabilir olmalıdır."
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:134
+#, php-format
+msgid "All %1$s vouchers from Roll %2$s marked unused"
+msgstr "%2$s grubundaki tüm %1$s bilet kullanılmadı olarak işaretlendi"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:178
+msgid "Enter the Roll"
+msgstr "Grubu gir"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:178
+msgid "found on top of the generated/printed vouchers"
+msgstr "oluşurulmuş veya yazdırılmış bilet listesinin üstünde"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:182
+msgid "Minutes per Ticket"
+msgstr "Dakikadaki Bilet Sayısı"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:186
+msgid ""
+"Defines the time in minutes that a user is allowed access. The clock starts "
+"ticking the first time a voucher is used for authentication"
+msgstr ""
+"Kullanıcıya kaç dakika erişim izni verileceğini belirler. Süre bilet kimlik "
+"doğrulama amacıyla kullanıldığı anda başlar"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:194
+msgid "Enter the number of vouchers"
+msgstr "Bilet sayısınız giriniz"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:194
+msgid ""
+"found on top of the generated/printed vouchers. WARNING: Changing this "
+"number for an existing Roll will mark all vouchers as unused again"
+msgstr ""
+"oluşturulmuş/yazdırılmış bilet listesinin üstündeki. UYARI: Mevcut grupta bu "
+"sayıyı değiştirmek tüm biletleri kullanılmamış olarak işaretler"
+
+#: usr/local/www/services_captiveportal_vouchers_edit.php:202
+msgid "Can be used to further identify this roll. Ignored by the system"
+msgstr "Bu bileti tanımada kullanılabilir. Sistem tarafından gözardı edilir"
+
+#: usr/local/www/services_captiveportal_zones.php:64
+msgid "Zones"
+msgstr "Bölgeler"
+
+#: usr/local/www/services_captiveportal_zones.php:75
+msgid "The CaptivePortal entry list has been changed"
+msgstr "Hizmet Portalı girdi listesi değiştirildi"
+
+#: usr/local/www/services_captiveportal_zones.php:80
+#: usr/local/www/services_rfc2136_edit.php:174
+msgid "Zone"
+msgstr "Bölge"
+
+#: usr/local/www/services_captiveportal_zones.php:82
+#: usr/local/www/vpn_pppoe.php:106
+msgid "Number of users"
+msgstr "Kullanıcı sayısı"
+
+#: usr/local/www/services_captiveportal_zones.php:88
+#: usr/local/www/services_captiveportal_zones.php:129
+msgid "add a new captiveportal instance"
+msgstr "yeni hizmet portalı örneği ekle"
+
+#: usr/local/www/services_captiveportal_zones.php:116
+msgid "edit captiveportal instance"
+msgstr "hizmet portalı örneğini düzenle"
+
+#: usr/local/www/services_captiveportal_zones.php:117
+msgid "delete captiveportal instance"
+msgstr "hizmet portalı örneğini sil"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:46
+msgid "Edit Zones"
+msgstr "Bölgeleri düzenle"
+
+#: usr/local/www/services_captiveportal_zones_edit.php:65
+msgid "The zone name can only contain letters, digits, and underscores (_)."
+msgstr "Bölge adı. Harfler, rakamlar ve sadece alt çizgi (_) içerebilir."
+
+#: usr/local/www/services_captiveportal_zones_edit.php:95
+msgid "Edit Captive Portal Zones"
+msgstr ""
+
+#: usr/local/www/services_captiveportal_zones_edit.php:102
+msgid "Zone name. Can only contain letters, digits, and underscores (_)."
+msgstr "Bölge adı. Harfler, rakamlar ve sadece alt çizgi (_) içerebilir."
+
+#: usr/local/www/services_dhcp.php:249 usr/local/www/services_dhcpv6.php:170
+msgid "Range begin"
+msgstr "Aralık başlangıcı"
+
+#: usr/local/www/services_dhcp.php:249 usr/local/www/services_dhcpv6.php:170
+msgid "Range end"
+msgstr "Aralık sonu"
+
+#: usr/local/www/services_dhcp.php:254 usr/local/www/services_dhcp.php:256
+#: usr/local/www/services_dhcpv6.php:175 usr/local/www/services_dhcpv6.php:179
+#: usr/local/www/services_dhcpv6.php:181
+msgid "A valid range must be specified."
+msgstr "Geçerli bir aralık belirtilmelidir."
+
+#: usr/local/www/services_dhcp.php:258
+#: usr/local/www/services_dhcp_edit.php:225
+msgid "A valid IP address must be specified for the gateway."
+msgstr "Ağ geçidi için geçerli bir IP adresi belirtilmelidir."
+
+#: usr/local/www/services_dhcp.php:260
+#: usr/local/www/services_dhcp_edit.php:227
+msgid ""
+"A valid IP address must be specified for the primary/secondary WINS servers."
+msgstr ""
+"Birincil/ikincil WINS sunucular için geçerli bir IP adresi girilmelidir."
+
+#: usr/local/www/services_dhcp.php:265
+#: usr/local/www/services_dhcp_edit.php:233
+#, php-format
+msgid ""
+"The gateway address %s does not lie within the chosen interface's subnet."
+msgstr "Ağ geçidi adresi %s seçili arabirimin altağında değil."
+
+#: usr/local/www/services_dhcp.php:268
+#: usr/local/www/services_dhcp_edit.php:236
+msgid "A valid IP address must be specified for each of the DNS servers."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:271
+#: usr/local/www/services_dhcp_edit.php:239
+#: usr/local/www/services_dhcpv6.php:188
+msgid "The default lease time must be at least 60 seconds."
+msgstr "Varsayılan kira süresi en az 60 saniye olmalıdır."
+
+#: usr/local/www/services_dhcp.php:288
+#, php-format
+msgid ""
+"The Captive Portal zone '%s' has Hard Timeout parameter set to a value "
+"bigger than Default lease time (%s)."
+msgstr ""
+"Hizmet Portalı alanı Mecburi zaman aşımı parametresi değeri '%s' varsayılan "
+"kira süresinden (%s) daha büyük."
+
+#: usr/local/www/services_dhcp.php:293
+#: usr/local/www/services_dhcp_edit.php:241
+#: usr/local/www/services_dhcpv6.php:190
+msgid ""
+"The maximum lease time must be at least 60 seconds and higher than the "
+"default lease time."
+msgstr ""
+"En fazla kira süresi en az 60 saniye olmalıdır ve varsayılan kira süresinden "
+"de yüksek olmak zorundadır."
+
+#: usr/local/www/services_dhcp.php:295
+#: usr/local/www/services_dhcp_edit.php:243
+#: usr/local/www/services_dhcpv6.php:192
+msgid "A valid domain name must be specified for the dynamic DNS registration."
+msgstr "Dinamik DNS kaydı için geçerli bir sunucu adı girilmelidir."
+
+#: usr/local/www/services_dhcp.php:297
+#: usr/local/www/services_dhcp_edit.php:245
+msgid ""
+"A valid primary domain name server IP address must be specified for the "
+"dynamic domain name."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:300
+#: usr/local/www/services_dhcp_edit.php:248
+#: usr/local/www/services_dhcpv6.php:197
+msgid "You must specify both a valid domain key and key name."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:305
+#: usr/local/www/services_dhcp_edit.php:253
+#: usr/local/www/services_dhcpv6.php:202
+#: usr/local/www/services_router_advertisements.php:155
+msgid "A valid domain search list must be specified."
+msgstr "Geçerli bir domain (alan adı) listesi belirtilmelidir."
+
+#: usr/local/www/services_dhcp.php:313
+msgid ""
+"If you specify a mac allow list, it must contain only valid partial MAC "
+"addresses."
+msgstr ""
+"Eğer mac izin listesi belirtecekseniz, sadece geçerli kısmi MAC adresleri "
+"içerebilir."
+
+#: usr/local/www/services_dhcp.php:315
+msgid ""
+"If you specify a mac deny list, it must contain only valid partial MAC "
+"addresses."
+msgstr ""
+"Eğer mac reddetme listesi belirtecekseniz, sadece geçerli kısmi MAC "
+"adresleri içerebilir."
+
+#: usr/local/www/services_dhcp.php:318
+#: usr/local/www/services_dhcp_edit.php:260
+msgid ""
+"A valid IP address must be specified for the primary/secondary NTP servers."
+msgstr ""
+"Birincil/ikincil NTP sunucular için geçerli bir IP adresi girilmelidir."
+
+#: usr/local/www/services_dhcp.php:320 usr/local/www/services_dhcpv6.php:211
+msgid "A valid domain name must be specified for the DNS domain."
+msgstr "DNS etki alanı için geçerli bir sunucu adı girilmelidir."
+
+#: usr/local/www/services_dhcp.php:322
+#: usr/local/www/services_dhcp_edit.php:262
+msgid "A valid IP address or hostname must be specified for the TFTP server."
+msgstr "TFTP sunucu için geçerli bir host adı ya da IP adresi girilmelidir."
+
+#: usr/local/www/services_dhcp.php:324
+#: usr/local/www/services_dhcp_edit.php:264
+msgid "A valid IP address must be specified for the network boot server."
+msgstr "Ağ açılış (boot) sunucusu olarak geçerli bir IP adresi girilmelidir."
+
+#: usr/local/www/services_dhcp.php:327
+msgid "You cannot use the network address in the starting subnet range."
+msgstr "Ağ adresini altağ sınırı başlangıcı olarak kullanamazsınız."
+
+#: usr/local/www/services_dhcp.php:329
+msgid "You cannot use the broadcast address in the ending subnet range."
+msgstr "Yayın adresini altağ sınırı bitişi olarak kullanamazsınız."
+
+#: usr/local/www/services_dhcp.php:336
+#, php-format
+msgid "The subnet range cannot overlap with virtual IP address %s."
+msgstr "Altağ aralığı sanal IP adresi %s ile çakışamaz."
+
+#: usr/local/www/services_dhcp.php:351
+msgid "Text type cannot include quotation marks."
+msgstr "Metin türü çift veya tek tırnak içeremez."
+
+#: usr/local/www/services_dhcp.php:353
+msgid ""
+"String type must be enclosed in quotes like \"this\" or must be a series of "
+"octets specified in hexadecimal, separated by colons, like 01:23:45:67:89:ab:"
+"cd:ef"
+msgstr ""
+"Dize (string) türü çift tırnakla sarmalanmış (\"bunun\" gibi) olmalıdır veya "
+"iki basamaklı onaltılık 8 sayıdan (01:23:45:67:89:ab:cd:ef gibi) oluşmalıdır"
+
+#: usr/local/www/services_dhcp.php:355
+msgid "Boolean type must be true, false, on, or off."
+msgstr "Boole türü true, false, on veya off olabilir."
+
+#: usr/local/www/services_dhcp.php:357
+msgid "Unsigned 8-bit integer type must be a number in the range 0 to 255."
+msgstr ""
+"İşaretsiz 8 bitlik tamsayı türü 0 ile 255 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/services_dhcp.php:359
+msgid "Unsigned 16-bit integer type must be a number in the range 0 to 65535."
+msgstr ""
+"İşaretsiz 16 bitlik tamsayı türü 0 ile 65535 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/services_dhcp.php:361
+msgid ""
+"Unsigned 32-bit integer type must be a number in the range 0 to 4294967295."
+msgstr ""
+"İşaretsiz 32 bitlik tamsayı türü 0 ile 4294967295 arasında bir tamsayı "
+"olmalıdır."
+
+#: usr/local/www/services_dhcp.php:363
+msgid "Signed 8-bit integer type must be a number in the range -128 to 127."
+msgstr ""
+"İşaretli 8 bitlik tamsayı türü -128 ile 127 arasında bir tamsayı olmalıdır."
+
+#: usr/local/www/services_dhcp.php:365
+msgid ""
+"Signed 16-bit integer type must be a number in the range -32768 to 32767."
+msgstr ""
+"İşaretli 16 bitlik tamsayı türü -32768 ile 32767 arasında bir tamsayı "
+"olmalıdır."
+
+#: usr/local/www/services_dhcp.php:367
+msgid ""
+"Signed 32-bit integer type must be a number in the range -2147483648 to "
+"2147483647."
+msgstr ""
+"İşaretli 32 bitlik tamsayı türü -2147483648 ile 2147483647 arasında bir "
+"tamsayı olmalıdır."
+
+#: usr/local/www/services_dhcp.php:369
+msgid "IP address or host type must be an IP address or host name."
+msgstr "IP adresi veya host adı bir IP adresi veya host adı olmalıdır."
+
+#: usr/local/www/services_dhcp.php:380 usr/local/www/services_dhcpv6.php:239
+msgid "The specified range lies outside of the current subnet."
+msgstr "Belirtilen aralık varolan altağ dışında kalmaktadır."
+
+#: usr/local/www/services_dhcp.php:384 usr/local/www/services_dhcpv6.php:244
+msgid "The range is invalid (first element higher than second element)."
+msgstr "Aralık değeri geçerli değil (İlk sayı ikinciden daha büyük)."
+
+#: usr/local/www/services_dhcp.php:391
+msgid ""
+"The specified range must not be within the DHCP range for this interface."
+msgstr "Belirtilen aralık bu arabirim için DHCP aralığı içinde olmalıdır."
+
+#: usr/local/www/services_dhcp.php:400
+msgid ""
+"The specified range must not be within the range configured on a DHCP pool "
+"for this interface."
+msgstr ""
+"Belirtilen aralık bu arabirim için DHCP havuzunun yapılandırılmış aralığında "
+"olmalıdır."
+
+#: usr/local/www/services_dhcp.php:407 usr/local/www/services_dhcpv6.php:248
+#, php-format
+msgid ""
+"You must disable the DHCP relay on the %s interface before enabling the DHCP "
+"server."
+msgstr ""
+"DHCP sunucuyu etkinleştirmeden önce %s arabirimindeki DHCP aracısını devre "
+"dışı bırakmalısınız."
+
+#: usr/local/www/services_dhcp.php:417 usr/local/www/services_dhcpv6.php:263
+#, php-format
+msgid "The DHCP range cannot overlap any static DHCP mappings."
+msgstr ""
+"DHCP aralığı herhangi bir DHCP statik haritalamasındaki öğelerle örtüşemez."
+
+#: usr/local/www/services_dhcp.php:597
+msgid "DHCP server"
+msgstr "DHCP sunucu"
+
+#: usr/local/www/services_dhcp.php:611
+msgid "Text"
+msgstr "Metin"
+
+#: usr/local/www/services_dhcp.php:611
+msgid "String"
+msgstr "Dize (string)"
+
+#: usr/local/www/services_dhcp.php:611
+msgid "Boolean"
+msgstr "Boole"
+
+#: usr/local/www/services_dhcp.php:612
+msgid "Unsigned 8-bit integer"
+msgstr "İşaretsiz 8 bitlik tamsayı"
+
+#: usr/local/www/services_dhcp.php:612
+msgid "Unsigned 16-bit integer"
+msgstr "İşaretsiz 16 bitlik tamsayı"
+
+#: usr/local/www/services_dhcp.php:612
+msgid "Unsigned 32-bit integer"
+msgstr "İşaretsiz 32 bitlik tamsayı"
+
+#: usr/local/www/services_dhcp.php:613
+msgid "Signed 8-bit integer"
+msgstr "İşaretli 8 bitlik tamsayı"
+
+#: usr/local/www/services_dhcp.php:613
+msgid "Signed 16-bit integer"
+msgstr "İşaretli 16 bitlik tamsayı"
+
+#: usr/local/www/services_dhcp.php:613
+msgid "Signed 32-bit integer"
+msgstr "İşaretli 32 bitlik tamsayı"
+
+#: usr/local/www/services_dhcp.php:613
+msgid "IP address or host"
+msgstr "IP adresi yada host"
+
+#: usr/local/www/services_dhcp.php:730 usr/local/www/services_dhcpv6.php:474
+msgid ""
+"DHCP Relay is currently enabled. Cannot enable the DHCP Server service while "
+"the DHCP Relay is enabled on any interface."
+msgstr ""
+"DHCP Aracısı etkin durumda. DHCP sunucu servisi DHCP Aracısı etkin "
+"durumdayken başlatılamaz."
+
+#: usr/local/www/services_dhcp.php:738 usr/local/www/services_dhcpv6.php:482
+msgid "The static mapping configuration has been changed"
+msgstr "Statik haritalama yapılandırması değiştirildi"
+
+#: usr/local/www/services_dhcp.php:760
+msgid ""
+"The DHCP Server can only be enabled on interfaces configured with a static "
+"IPv4 address. This system has none."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:779
+#, php-format
+msgid "Enable DHCP server on %s interface"
+msgstr "%s arabiriminde DHCP sunucuyu etkinleştir"
+
+#: usr/local/www/services_dhcp.php:785
+msgid ""
+"Editing Pool-Specific Options. To return to the Interface, click its tab "
+"above."
+msgstr ""
+"Havuz özel seçeneklerini düzenle. Arabirime geri dönmek için yukarıdaki "
+"sekmeye tıklayın."
+
+#: usr/local/www/services_dhcp.php:792
+msgid "Deny unknown clients"
+msgstr "Tanınmayan istemcileri reddet"
+
+#: usr/local/www/services_dhcp.php:793
+msgid ""
+"If this is checked, only the clients defined below will get DHCP leases from "
+"this server. "
+msgstr ""
+"Bu seçenek işaretlendiğinde sadece aşağıda belirtilen istemciler sunucudan "
+"DHCP kirası temin edebilirler. "
+
+#: usr/local/www/services_dhcp.php:797
+msgid "Pool Description"
+msgstr "Havuz Açıklaması"
+
+#: usr/local/www/services_dhcp.php:816 usr/local/www/services_dhcpv6.php:567
+msgid "Available range"
+msgstr "Uygun aralık"
+
+#: usr/local/www/services_dhcp.php:844 usr/local/www/services_dhcpv6.php:586
+#: usr/local/www/vpn_l2tp.php:346
+msgid "Subnet Mask"
+msgstr "Altağ Maskesi"
+
+#: usr/local/www/services_dhcp.php:861 usr/local/www/services_dhcpv6.php:603
+msgid "Range"
+msgstr "Aralık"
+
+#: usr/local/www/services_dhcp.php:869
+msgid "Additional Pools"
+msgstr "Ek Havuzlar"
+
+#: usr/local/www/services_dhcp.php:871
+msgid ""
+"If you need additional pools of addresses inside of this subnet outside the "
+"above Range, they may be specified here."
+msgstr ""
+"Yukardaki aralığın dışında bu altağ içinde eğer ek havuz adreslerine "
+"ihtiyacınız varsa, buradan belirtilebilirsiniz."
+
+#: usr/local/www/services_dhcp.php:874
+msgid "Pool Start"
+msgstr "Havuz Başlangıçı"
+
+#: usr/local/www/services_dhcp.php:875
+msgid "Pool End"
+msgstr "Havuz Bitişi"
+
+#: usr/local/www/services_dhcp.php:903
+msgid "Do you really want to delete this pool?"
+msgstr "Bu havuzu silmek istediğinize emin misiniz?"
+
+#: usr/local/www/services_dhcp.php:927
+#: usr/local/www/services_dhcp_edit.php:438
+msgid "WINS servers"
+msgstr "WINS sunucular"
+
+#: usr/local/www/services_dhcp.php:934
+#: usr/local/www/services_dhcp_edit.php:445
+#: usr/local/www/services_dhcpv6.php:628
+#: usr/local/www/services_router_advertisements.php:377
+#: usr/local/www/system.php:334 usr/local/www/vpn_pppoe_edit.php:463
+msgid "DNS servers"
+msgstr "DNS sunucular"
+
+#: usr/local/www/services_dhcp.php:940
+#: usr/local/www/services_dhcp_edit.php:451
+#: usr/local/www/services_dhcpv6.php:634
+#: usr/local/www/services_router_advertisements.php:383
+msgid ""
+"NOTE: leave blank to use the system default DNS servers - this interface's "
+"IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the "
+"General page."
+msgstr ""
+"Not: Sistem varsayılan DNS sunucusunu kullanmak için boş bırakınız, DNS "
+"yönlendirici etkinse bu arabirimin IPsini, aksi taktirde Genel sayfasında "
+"yapılandırılmış sunucuları giriniz."
+
+#: usr/local/www/services_dhcp.php:947
+msgid ""
+"The default is to use the IP on this interface of the firewall as the "
+"gateway. Specify an alternate gateway here if this is not the correct "
+"gateway for your network. Type \"none\" for no gateway assignment."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:951
+#: usr/local/www/services_dhcp_edit.php:462
+#: usr/local/www/services_dhcpv6.php:638
+msgid "Domain name"
+msgstr "Alan adı"
+
+#: usr/local/www/services_dhcp.php:954
+#: usr/local/www/services_dhcp_edit.php:465
+#: usr/local/www/services_dhcpv6.php:641
+msgid ""
+"The default is to use the domain name of this system as the default domain "
+"name provided by DHCP. You may specify an alternate domain name here."
+msgstr ""
+"Varsayılan davranış DHCP tarafından verilen alan adı olarak bu sistmein alan "
+"adını kullanmaktır. İsterseniz buradan farklı bir alan adı verebilirsiniz."
+
+#: usr/local/www/services_dhcp.php:958
+#: usr/local/www/services_dhcp_edit.php:469
+#: usr/local/www/services_dhcpv6.php:645
+#: usr/local/www/services_router_advertisements.php:388
+msgid "Domain search list"
+msgstr "Alan adı arama listesi"
+
+#: usr/local/www/services_dhcp.php:961
+#: usr/local/www/services_dhcp_edit.php:472
+msgid ""
+"The DHCP server can optionally provide a domain search list. Use the "
+"semicolon character as separator "
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:965
+#: usr/local/www/services_dhcp_edit.php:476
+#: usr/local/www/services_dhcpv6.php:652
+msgid "Default lease time"
+msgstr "Varsayılan kira süresi"
+
+#: usr/local/www/services_dhcp.php:969
+#: usr/local/www/services_dhcp_edit.php:480
+#: usr/local/www/services_dhcpv6.php:656
+msgid ""
+"This is used for clients that do not ask for a specific expiration time."
+msgstr "Kiralarının ne zaman dolacağını sormayan istemciler için kullanılır."
+
+#: usr/local/www/services_dhcp.php:971
+#: usr/local/www/services_dhcp_edit.php:482
+#: usr/local/www/services_dhcpv6.php:658
+msgid "The default is 7200 seconds."
+msgstr "Varsayılan 7200 saniyedir."
+
+#: usr/local/www/services_dhcp.php:975
+#: usr/local/www/services_dhcp_edit.php:486
+#: usr/local/www/services_dhcpv6.php:662
+msgid "Maximum lease time"
+msgstr "Maksimum kira süresi"
+
+#: usr/local/www/services_dhcp.php:979
+#: usr/local/www/services_dhcp_edit.php:490
+#: usr/local/www/services_dhcpv6.php:666
+msgid ""
+"This is the maximum lease time for clients that ask for a specific "
+"expiration time."
+msgstr ""
+"Kiralarının ne zaman dolacağını soran kullanıcılar için en yüksek kira "
+"süresidir."
+
+#: usr/local/www/services_dhcp.php:981
+#: usr/local/www/services_dhcp_edit.php:492
+#: usr/local/www/services_dhcpv6.php:668
+msgid "The default is 86400 seconds."
+msgstr "Varsayılan 86400 saniyedir."
+
+#: usr/local/www/services_dhcp.php:986
+msgid "Failover peer IP:"
+msgstr "Yük aktarma eş IPsi:"
+
+#: usr/local/www/services_dhcp.php:989
+msgid ""
+"Leave blank to disable. Enter the interface IP address of the other "
+"machine. Machines must be using CARP. Interface's advskew determines "
+"whether the DHCPd process is Primary or Secondary. Ensure one machine's "
+"advskew<20 (and the other is >20)."
+msgstr ""
+"Boş bırakarak devre dışı hale getirebilirsiniz. Diğer sistemin IP adresini "
+"giriniz. Her iki sistem de CARP kullanmalıdırlar. Arabirimler advskew DHCPd "
+"işleminin birincil veya ikincil olup olmadığını belirler. Bir makinanın "
+"advskew'i <20 (ve diğer bir >20) olduğundan emin olun."
+
+#: usr/local/www/services_dhcp.php:995 usr/local/www/services_dhcp.php:1246
+msgid "Static ARP"
+msgstr "Statik ARP"
+
+#: usr/local/www/services_dhcp.php:1002
+msgid "Enable Static ARP entries"
+msgstr "Statik ARP girdilerini etkinleştir"
+
+#: usr/local/www/services_dhcp.php:1007
+msgid ""
+"This option persists even if DHCP server is disabled. Only the machines "
+"listed below will be able to communicate with the firewall on this NIC."
+msgstr ""
+"Bu seçenek, DHCP sunucusu devre dışı olsa bile devam eder. Sadece aşağıda "
+"belirtilen sistemler bu NIC üzerinden güvenlik duvarı ile haberleşebilirler."
+
+#: usr/local/www/services_dhcp.php:1016 usr/local/www/services_dhcpv6.php:672
+msgid "Time format change"
+msgstr "Saat biçimi değiştir"
+
+#: usr/local/www/services_dhcp.php:1025
+msgid "Change DHCP display lease time from UTC to local time."
+msgstr "DHCP izleme kira saatini UTC den yerel saate değiştir."
+
+#: usr/local/www/services_dhcp.php:1032
+msgid ""
+"By default DHCP leases are displayed in UTC time. By checking this\n"
+"\t\t\t\t\t\tbox DHCP lease time will be displayed in local time and set to "
+"time zone selected. This will be used for all DHCP interfaces lease time."
+msgstr ""
+"Varsayılan olarak DHCP kiraları UTC zaman dilimine göre görüntülenir. DHCP "
+"kira sürülerini yerel saat diliminde görmek istiyorsanız zaman dilimini "
+"seçmek için bu\n"
+"\t\t\t\t\t\tkutucuğu işaretleyin."
+
+#: usr/local/www/services_dhcp.php:1044
+#: usr/local/www/services_dhcp_edit.php:499
+#: usr/local/www/services_dhcpv6.php:700
+msgid "Show Dynamic DNS"
+msgstr "Dinamik DNS kayıtlarını göster"
+
+#: usr/local/www/services_dhcp.php:1048
+#: usr/local/www/services_dhcp_edit.php:503
+#: usr/local/www/services_dhcpv6.php:704
+msgid "Enable registration of DHCP client names in DNS."
+msgstr "DHCP istemci adlarının DNSe kaydedilmesini aktif et."
+
+#: usr/local/www/services_dhcp.php:1051
+#: usr/local/www/services_dhcp_edit.php:506
+#: usr/local/www/services_dhcpv6.php:707
+msgid "Note: Leave blank to disable dynamic DNS registration."
+msgstr ""
+"Not: Boş bırakarak dinamik DNS kayıt işlemini devre dışı bırakabilirsiniz."
+
+#: usr/local/www/services_dhcp.php:1052
+#: usr/local/www/services_dhcp_edit.php:507
+#: usr/local/www/services_dhcpv6.php:708
+msgid ""
+"Enter the dynamic DNS domain which will be used to register client names in "
+"the DNS server."
+msgstr ""
+"DNS sunucuda istemci isimlerini kaydetmede kullanılacak dinamik DNS adını "
+"giriniz."
+
+#: usr/local/www/services_dhcp.php:1054
+#: usr/local/www/services_dhcp_edit.php:509
+#: usr/local/www/services_dhcpv6.php:710
+msgid ""
+"Enter the primary domain name server IP address for the dynamic domain name."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1056
+#: usr/local/www/services_dhcp_edit.php:511
+#: usr/local/www/services_dhcpv6.php:712
+msgid ""
+"Enter the dynamic DNS domain key name which will be used to register client "
+"names in the DNS server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1058
+#: usr/local/www/services_dhcp_edit.php:513
+#: usr/local/www/services_dhcpv6.php:714
+msgid ""
+"Enter the dynamic DNS domain key secret which will be used to register "
+"client names in the DNS server."
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1063
+msgid "MAC Address Control"
+msgstr "MAC Adres Kontrol"
+
+#: usr/local/www/services_dhcp.php:1066
+msgid "Show MAC Address Control"
+msgstr "MAC Adres Kontrolünü Göster"
+
+#: usr/local/www/services_dhcp.php:1070
+msgid ""
+"Enter a list of partial MAC addresses to allow, comma separated, no spaces, "
+"such as "
+msgstr ""
+"İzin verilen Kısmi MAC adresleri listesini ,virgülle ayrılmış, boşluk "
+"olmadan, şu şekilde giriniz "
+
+#: usr/local/www/services_dhcp.php:1072
+msgid ""
+"Enter a list of partial MAC addresses to deny access, comma separated, no "
+"spaces, such as "
+msgstr ""
+"İzin verilmeyen Kısmi MAC adresleri listesini , virgülle ayrılmış, boşluk "
+"olmadan, şu şekilde giriniz "
+
+#: usr/local/www/services_dhcp.php:1077
+#: usr/local/www/services_dhcp_edit.php:519
+#: usr/local/www/services_dhcpv6.php:720
+msgid "NTP servers"
+msgstr "NTP sunucular"
+
+#: usr/local/www/services_dhcp.php:1080
+#: usr/local/www/services_dhcp_edit.php:522
+#: usr/local/www/services_dhcpv6.php:723
+msgid "Show NTP configuration"
+msgstr "NTP yapılandırmasını görüntüle"
+
+#: usr/local/www/services_dhcp.php:1089
+#: usr/local/www/services_dhcp_edit.php:531
+#: usr/local/www/services_dhcpv6.php:733
+msgid "TFTP server"
+msgstr "TFTP sunucu"
+
+#: usr/local/www/services_dhcp.php:1092
+#: usr/local/www/services_dhcp_edit.php:534
+#: usr/local/www/services_dhcpv6.php:736
+msgid "Show TFTP configuration"
+msgstr "TFP yapılandırmasını görüntüle"
+
+#: usr/local/www/services_dhcp.php:1096
+#: usr/local/www/services_dhcp_edit.php:538
+#: usr/local/www/services_dhcpv6.php:740
+msgid ""
+"Leave blank to disable. Enter a full hostname or IP for the TFTP server."
+msgstr ""
+"Boş bırakarak devre dış hale getirebilirsiniz. TFP sunucunun IP ya da Host "
+"adını giriniz."
+
+#: usr/local/www/services_dhcp.php:1101 usr/local/www/services_dhcpv6.php:746
+msgid "LDAP URI"
+msgstr "LDAP URI"
+
+#: usr/local/www/services_dhcp.php:1104 usr/local/www/services_dhcpv6.php:749
+msgid "Show LDAP configuration"
+msgstr "LDAP yapılandırmasını görüntüle"
+
+#: usr/local/www/services_dhcp.php:1108 usr/local/www/services_dhcpv6.php:753
+msgid ""
+"Leave blank to disable. Enter a full URI for the LDAP server in the form "
+"ldap://ldap.example.com/dc=example,dc=com"
+msgstr ""
+"Boş bırakarak kapatabilirsiniz. LDAP sunucu URIsini ldap://ldap.ornek.com/"
+"c=example,dc=com"
+
+#: usr/local/www/services_dhcp.php:1113 usr/local/www/services_dhcpv6.php:758
+msgid "Enable network booting"
+msgstr "Ağdan açmayı etkinleştir"
+
+#: usr/local/www/services_dhcp.php:1116 usr/local/www/services_dhcpv6.php:761
+msgid "Show Network booting"
+msgstr "Ağ üzerinden açılma bilgilerini görüntüle"
+
+#: usr/local/www/services_dhcp.php:1120 usr/local/www/services_dhcpv6.php:765
+msgid "Enables network booting."
+msgstr "Ağdan açılmayı etkinleştir."
+
+#: usr/local/www/services_dhcp.php:1122
+msgid "Enter the IP of the"
+msgstr "IPsini girin"
+
+#: usr/local/www/services_dhcp.php:1122
+msgid "next-server"
+msgstr "bir sonraki sunucu"
+
+#: usr/local/www/services_dhcp.php:1124
+msgid "and the default bios filename"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1126
+msgid "and the UEFI 32bit filename "
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1128
+msgid "and the UEFI 64bit filename "
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1130
+msgid ""
+"Note: You need both a filename and a boot server configured for this to work!"
+msgstr "Not: Çalışması için hem dosya adı hem de açılma sunucusu girmelisiniz!"
+
+#: usr/local/www/services_dhcp.php:1131
+msgid ""
+"You will need all three filenames and a boot server configured for UEFI to "
+"work!"
+msgstr ""
+
+#: usr/local/www/services_dhcp.php:1132
+#: usr/local/www/services_dhcp_edit.php:420
+#: usr/local/www/services_dhcpv6_edit.php:236
+msgid "Enter the"
+msgstr "Girin"
+
+#: usr/local/www/services_dhcp.php:1132
+#: usr/local/www/services_dhcp_edit.php:420
+#: usr/local/www/services_dhcpv6_edit.php:236
+msgid "root-path"
+msgstr "kök yolu"
+
+#: usr/local/www/services_dhcp.php:1132
+#: usr/local/www/services_dhcp_edit.php:420
+#: usr/local/www/services_dhcpv6_edit.php:236
+msgid "string"
+msgstr "dize"
+
+#: usr/local/www/services_dhcp.php:1134
+msgid ""
+"Note: string-format: iscsi:(servername):(protocol):(port):(LUN):targetname"
+msgstr "Not: Dize formatı: iscsi:(sunucu adı):(protokol):(port):(LUN):hedef ad"
+
+#: usr/local/www/services_dhcp.php:1140 usr/local/www/services_dhcpv6.php:773
+msgid "Additional BOOTP/DHCP Options"
+msgstr "Ek DHCP/BOOTP seçenekleri"
+
+#: usr/local/www/services_dhcp.php:1143 usr/local/www/services_dhcpv6.php:776
+msgid "Show Additional BOOTP/DHCP Options"
+msgstr "Ek DHCP/BOOTP Seçeneklerini Görüntüle"
+
+#: usr/local/www/services_dhcp.php:1151 usr/local/www/services_dhcpv6.php:784
+msgid ""
+"Enter the DHCP option number and the value for each item you would like to "
+"include in the DHCP lease information. For a list of available options "
+"please visit this"
+msgstr ""
+"DHCP kira bilgisine dahil etmek istediğiniz seçeneklerin DHCP seçenek "
+"numaralarını ve değerlerini girin. Seçeneklerin listesi "
+
+#: usr/local/www/services_dhcp.php:1151 usr/local/www/services_dhcpv6.php:784
+msgid "URL"
+msgstr "URL"
+
+#: usr/local/www/services_dhcp.php:1228 usr/local/www/services_dhcpv6.php:841
+msgid "The DNS servers entered in"
+msgstr "Girilen DNS sunucular"
+
+#: usr/local/www/services_dhcp.php:1228 usr/local/www/services_dhcpv6.php:841
+msgid "System: General setup"
+msgstr "Sistem: Genel ayarlar"
+
+#: usr/local/www/services_dhcp.php:1229 usr/local/www/services_dhcpv6.php:842
+msgid "(or the"
+msgstr "(ya da etkinleştirilmişse"
+
+#: usr/local/www/services_dhcp.php:1229 usr/local/www/services_dhcpv6.php:842
+#: usr/local/www/services_dnsmasq.php:153
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:122
+#: usr/local/www/services_dnsmasq_edit.php:182
+msgid "DNS forwarder"
+msgstr "DNS yönlendirici"
+
+#: usr/local/www/services_dhcp.php:1230 usr/local/www/services_dhcpv6.php:843
+msgid "if enabled)"
+msgstr ")"
+
+#: usr/local/www/services_dhcp.php:1230 usr/local/www/services_dhcpv6.php:843
+msgid "will be assigned to clients by the DHCP server."
+msgstr "DHCP sunucu tarafından istemcilere atanacaktır."
+
+#: usr/local/www/services_dhcp.php:1233 usr/local/www/services_dhcpv6.php:846
+msgid "The DHCP lease table can be viewed on the"
+msgstr "DHCP kira tablosuna"
+
+#: usr/local/www/services_dhcp.php:1233
+msgid "Status: DHCP leases"
+msgstr "Durum: DHCP kiraları"
+
+#: usr/local/www/services_dhcp.php:1234 usr/local/www/services_dhcpv6.php:847
+msgid "page."
+msgstr "sayfasından bakabilirsiniz."
+
+#: usr/local/www/services_dhcp.php:1242
+msgid "DHCP Static Mappings for this interface."
+msgstr "DHCP arabirimi için statik eşlemeler."
+
+#: usr/local/www/services_dhcp_edit.php:162
+msgid "Either MAC address or Client identifier must be specified"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:170
+#: usr/local/www/services_dhcpv6_edit.php:122
+msgid "The hostname cannot end with a hyphen according to RFC952"
+msgstr "RFC952'ye göre sunucu adı '-' ile bitemez"
+
+#: usr/local/www/services_dhcp_edit.php:175
+#: usr/local/www/services_dhcpv6_edit.php:127
+#: usr/local/www/services_dnsmasq_edit.php:94
+#: usr/local/www/services_unbound_host_edit.php:96
+#: usr/local/www/system.php:117
+msgid ""
+"A valid hostname is specified, but the domain name part should be omitted"
+msgstr "Sunucu adı geçerli ama alan adı kısmı olmamalı"
+
+#: usr/local/www/services_dhcp_edit.php:186
+msgid "Static ARP is enabled. You must specify an IP address."
+msgstr "Statik ARP etkinleştirildi. Bir IP adresi belirtmelisiniz."
+
+#: usr/local/www/services_dhcp_edit.php:195
+msgid "This Hostname, IP, MAC address or Client identifier already exists."
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:206
+#, php-format
+msgid "The IP address must not be within the DHCP range for this interface."
+msgstr "IP adresi bu arabirimin DHCP aralığında olmamalıdır."
+
+#: usr/local/www/services_dhcp_edit.php:211
+msgid ""
+"The IP address must not be within the range configured on a DHCP pool for "
+"this interface."
+msgstr ""
+"IP Adresi DHCP havuzunun bu arabirim için yapılandırılmış aralığı içinde "
+"olmalıdır."
+
+#: usr/local/www/services_dhcp_edit.php:220
+#, php-format
+msgid "The IP address must lie in the %s subnet."
+msgstr "IP adresi %s altağında bulunmalıdırlar."
+
+#: usr/local/www/services_dhcp_edit.php:335
+#: usr/local/www/services_dhcpv6_edit.php:185
+msgid "Edit static mapping"
+msgstr "Statik eşlemeyi düzenle"
+
+#: usr/local/www/services_dhcp_edit.php:371
+msgid "Static DHCP Mapping"
+msgstr "Statik DHCP Eşleme"
+
+#: usr/local/www/services_dhcp_edit.php:384
+msgid "Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx"
+msgstr "MAC adresini: xx:xx:xx:xx:xx:xx formatında giriniz"
+
+#: usr/local/www/services_dhcp_edit.php:388
+msgid "Client identifier"
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:398
+msgid "If an IPv4 address is entered, the address must be outside of the pool."
+msgstr "Bir IPv4 adresi girdiyseniz adres havuzu dışında olması gerekir."
+
+#: usr/local/www/services_dhcp_edit.php:400
+msgid ""
+"If no IPv4 address is given, one will be dynamically allocated from the pool."
+msgstr "Hiçbir IPv4 adresi belirtilmemişse dinamik olarak havuzundan ayrılır."
+
+#: usr/local/www/services_dhcp_edit.php:407
+#: usr/local/www/services_dhcpv6_edit.php:223
+msgid "Name of the host, without domain part."
+msgstr "Host adı (alan adı olmadan) girilmelidir."
+
+#: usr/local/www/services_dhcp_edit.php:431
+msgid "ARP Table Static Entry"
+msgstr "ARP tablosu statik girdisi"
+
+#: usr/local/www/services_dhcp_edit.php:434
+msgid "Create an ARP Table Static Entry for this MAC &amp; IP Address pair. "
+msgstr ""
+
+#: usr/local/www/services_dhcp_edit.php:458
+msgid ""
+"The default is to use the IP on this interface of the firewall as the "
+"gateway. Specify an alternate gateway here if this is not the correct "
+"gateway for your network."
+msgstr ""
+"Varsayılan davranış ağ geçidi olarak güvenlik duvarının bu arabiriminin IP "
+"adresini kullanmaktır. Eğer ağınızın ağ geçidi bu değilse buradan farklı bir "
+"ağ geçidi belirtebilirsiniz."
+
+#: usr/local/www/services_dhcp_relay.php:73
+#: usr/local/www/services_dhcpv6_relay.php:74
+msgid "Destination Server"
+msgstr "Hedef Sunucu"
+
+#: usr/local/www/services_dhcp_relay.php:81
+msgid "A valid Destination Server IP address must be specified."
+msgstr "Geçerli bir Hedef Sunucu IP adresi belirtilmelidir."
+
+#: usr/local/www/services_dhcp_relay.php:147
+msgid "DHCP Relay configuration"
+msgstr "DHCP aracısı yapılandırma"
+
+#: usr/local/www/services_dhcp_relay.php:153
+#, php-format
+msgid "Enable DHCP relay on interface"
+msgstr "Bu arabirimde DHCP aracısını aktif et"
+
+#: usr/local/www/services_dhcp_relay.php:178
+#: usr/local/www/services_dhcpv6_relay.php:179
+msgid "Append circuit ID and agent ID to requests"
+msgstr "İsteklere devre ve uygulama kimliklerini ekle"
+
+#: usr/local/www/services_dhcp_relay.php:179
+#, php-format
+msgid ""
+"If this is checked, the DHCP relay will append the circuit ID (%s interface "
+"number) and the agent ID to the DHCP request."
+msgstr ""
+"İşaretliyse DHCP aracısı devre kimliğini (%s arabirim numarası) ve uygulama "
+"kimliğini DHCP isteğine ekler."
+
+#: usr/local/www/services_dhcp_relay.php:182
+#: usr/local/www/services_dhcpv6_relay.php:183
+msgid "Destination server"
+msgstr "Hedef sunucu"
+
+#: usr/local/www/services_dhcp_relay.php:186
+msgid ""
+"This is the IP address of the server to which DHCP requests are relayed. You "
+"can enter multiple server IP addresses, separated by commas. Select \"Proxy "
+"requests to DHCP server on WAN subnet\" to relay DHCP packets to the server "
+"that was used on the WAN interface."
+msgstr ""
+"DHCP isteklerinin aktarılacağı sunucunun IP adresidir. Virgülle ayırarak "
+"birden fazla IP adresi girebilirsiniz. DHCP paketlerini WAN arabiriminde "
+"kullanılan sunucuya aktarmak için \"DHCP sunucuya gelen istekleri WAN "
+"altağına yönlendir\"i seçin."
+
+#: usr/local/www/services_dhcpv6.php:177
+msgid "A valid prefix range must be specified."
+msgstr "Geçerli bir Ön-ek aralığı belirtilmelidir."
+
+#: usr/local/www/services_dhcpv6.php:183
+msgid "A valid IPv6 address must be specified for the gateway."
+msgstr "Ağ geçidi için geçerli bir IPv6 adresi belirtilmelidir."
+
+#: usr/local/www/services_dhcpv6.php:185
+#: usr/local/www/services_router_advertisements.php:150
+msgid "A valid IPv6 address must be specified for each of the DNS servers."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:194
+msgid ""
+"A valid primary domain name server IPv4 address must be specified for the "
+"dynamic domain name."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:209
+msgid ""
+"A valid IPv6 address must be specified for the primary/secondary NTP servers."
+msgstr "Ana/ikincil NTP sunucusu için geçerli bir IPv6 adresi belirtilmelidir."
+
+#: usr/local/www/services_dhcpv6.php:213
+msgid "A valid IPv6 address or hostname must be specified for the TFTP server."
+msgstr "TFTP sunucu için geçerli bir IPv6 adresi belirtilmelidir."
+
+#: usr/local/www/services_dhcpv6.php:215
+msgid "A valid URL must be specified for the network bootfile."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:222
+#, php-format
+msgid "The subnet range cannot overlap with virtual IPv6 address %s."
+msgstr "Altağ aralığı sanal IPv6 adresi %s ile çakışamaz."
+
+#: usr/local/www/services_dhcpv6.php:375
+msgid "DHCPv6 server"
+msgstr "DHCPv6 sunucu"
+
+#: usr/local/www/services_dhcpv6.php:520
+msgid ""
+"The DHCPv6 Server can only be enabled on interfaces configured with a static "
+"IPv6 address. This system has none."
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:534
+#: usr/local/www/services_router_advertisements.php:263
+#: usr/local/www/services_router_advertisements.php:272
+msgid "Router Advertisements"
+msgstr "Yönlendirici İlanı"
+
+# 94%
+#: usr/local/www/services_dhcpv6.php:546
+#, php-format
+msgid "Enable DHCPv6 server on %s interface"
+msgstr "%s arabiriminde DHCPv6 sunucuyu etkinleştir"
+
+#: usr/local/www/services_dhcpv6.php:610
+msgid "Prefix Delegation Range"
+msgstr "Ön-ek Yetilendirme Aralığı"
+
+#: usr/local/www/services_dhcpv6.php:614
+msgid "Prefix Delegation Size"
+msgstr "Ön-Ek Yetkilendirme Boyutu"
+
+#: usr/local/www/services_dhcpv6.php:623
+msgid ""
+"You can define a Prefix range here for DHCP Prefix Delegation. This allows "
+"for \n"
+"\t\t\t\t\tassigning networks to subrouters. The start and end of the range "
+"must end on boundaries of the prefix delegation size."
+msgstr ""
+"DHCP Önek Yetkilendirmesi için Ön-ek aralığını tanılmayın. Bu \n"
+"\t\t\t\t\t Ağ'lara altyönlendiricilerin atanmasına izin verir. Aralığının "
+"başlangıç ​​ve bitişi ön-ek yetkilendirme boyutu sınırlarında bitmelidir."
+
+#: usr/local/www/services_dhcpv6.php:648
+msgid ""
+"The DHCP server can optionally provide a domain search list. Use the "
+"semicolon character as separator"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:681
+msgid "Change DHCPv6 display lease time from UTC to local time."
+msgstr "DHCPv6 izleme kira saatini UTC den yerel saate değiştir."
+
+#: usr/local/www/services_dhcpv6.php:688
+msgid ""
+"By default DHCPv6 leases are displayed in UTC time. By checking this \n"
+"\t\t\t\t\t\tbox DHCPv6 lease time will be displayed in local time and set to "
+"time zone selected. This will be used for all DHCPv6 interfaces lease time."
+msgstr ""
+"Varsayılan olarak DHCPv6 kiraları UTC saati olarak görüntülenir. Bu "
+"kutucuğu \n"
+"\t\t\t\t\t\t tıkklayarak DHCPv6 kira saati yerel saat olarak görüntülenir ve "
+"seçilen zaman dilimine ayarlanır. Bu tüm DHCPv6 arabirimleri kira "
+"saatlerinde kullanılır."
+
+#: usr/local/www/services_dhcpv6.php:767
+msgid "Enter the Bootfile URL"
+msgstr ""
+
+#: usr/local/www/services_dhcpv6.php:846
+msgid "Status: DHCPv6 leases"
+msgstr "Durum: DHCPv6 Kiraları"
+
+#: usr/local/www/services_dhcpv6.php:854
+msgid "DHCPv6 Static Mappings for this interface."
+msgstr "DHCPv6 arabirimi için statik eşlemeler."
+
+#: usr/local/www/services_dhcpv6.php:858
+#: usr/local/www/status_dhcpv6_leases.php:418
+#: usr/local/www/status_dhcpv6_leases.php:504
+msgid "DUID"
+msgstr "DUID"
+
+#: usr/local/www/services_dhcpv6_edit.php:115
+#: usr/local/www/services_dhcpv6_edit.php:201
+msgid "DUID Identifier"
+msgstr "DUID Tanımlayıcı"
+
+#: usr/local/www/services_dhcpv6_edit.php:135
+msgid "A valid DUID Identifier must be specified."
+msgstr "Geçerli bir DUID tanımlayıcı belirtilmelidir."
+
+# 75%
+#: usr/local/www/services_dhcpv6_edit.php:144
+msgid "This Hostname, IP or DUID Identifier already exists."
+msgstr "Bu host Adı, IP ya da DUID tanımlayıcı sistemde zaten mevcut."
+
+# 83%
+#: usr/local/www/services_dhcpv6_edit.php:185
+msgid "DHCPv6"
+msgstr "DHCPv6"
+
+# 90%
+#: usr/local/www/services_dhcpv6_edit.php:198
+msgid "Static DHCPv6 Mapping"
+msgstr "Statik DHCPv6 Eşleme"
+
+#: usr/local/www/services_dhcpv6_edit.php:205
+msgid "Enter a DUID Identifier in the following format: "
+msgstr "DUID tanımlayıcıyı belirtilen biçimde giriniz: "
+
+#: usr/local/www/services_dhcpv6_edit.php:214
+msgid "If an IPv6 address is entered, the address must be outside of the pool."
+msgstr "Eğer IPv6 adresi girlidiyse bı adres havuzun dışında olmalıdır."
+
+#: usr/local/www/services_dhcpv6_edit.php:216
+msgid ""
+"If no IPv6 address is given, one will be dynamically allocated from the pool."
+msgstr ""
+"Eğer verilen bir IPv6 adresi yoksa, biri dinamik olarak havuzdan tahsis "
+"edilecek."
+
+# 96%
+#: usr/local/www/services_dhcpv6_relay.php:82
+msgid "A valid Destination Server IPv6 address must be specified."
+msgstr "Geçerli bir Hedef Sunucu IPv6 adresi belirtilmelidir."
+
+#: usr/local/www/services_dhcpv6_relay.php:148
+msgid "DHCPv6 Relay configuration"
+msgstr "DHCPv6 Aktarma yapılandırması"
+
+#: usr/local/www/services_dhcpv6_relay.php:154
+#, php-format
+msgid "Enable DHCPv6 relay on interface"
+msgstr "DHCPv6 Aktarıcısını arabirimde etkinleştir"
+
+#: usr/local/www/services_dhcpv6_relay.php:172
+msgid "Interfaces without an IPv6 address will not be shown."
+msgstr "IPv6 adresi dışındaki arabirimler gösterilmeyecektir."
+
+#: usr/local/www/services_dhcpv6_relay.php:180
+#, php-format
+msgid ""
+"If this is checked, the DHCPv6 relay will append the circuit ID (%s "
+"interface number) and the agent ID to the DHCPv6 request."
+msgstr ""
+"İşaretliyse DHCPv6 aracısı devre kimliğini (%s arabirim numarası) ve "
+"uygulama kimliğini DHCPv6 isteğine ekler."
+
+#: usr/local/www/services_dhcpv6_relay.php:187
+msgid ""
+"This is the IPv6 address of the server to which DHCPv6 requests are relayed. "
+"You can enter multiple server IPv6 addresses, separated by commas. "
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:94
+#: usr/local/www/system_advanced_admin.php:105
+msgid "You must specify a valid port number"
+msgstr "Geçerli bir port numarası belirtilmelidir"
+
+#: usr/local/www/services_dnsmasq.php:109
+msgid "Invalid custom options"
+msgstr "Özel ayarlar geçersiz"
+
+#: usr/local/www/services_dnsmasq.php:182
+msgid "The DNS forwarder configuration has been changed"
+msgstr "DNS yönlendirici yapılandırılması değiştirildi"
+
+#: usr/local/www/services_dnsmasq.php:186
+msgid "General DNS Forwarder Options"
+msgstr "Genel DNS Yönlendirici Seçenekleri"
+
+#: usr/local/www/services_dnsmasq.php:192
+msgid "Enable DNS forwarder"
+msgstr "DNS yönlendiriciyi etkinleştir"
+
+#: usr/local/www/services_dnsmasq.php:196
+#: usr/local/www/services_unbound.php:337
+msgid "DHCP Registration"
+msgstr "DHCP Kayıt"
+
+#: usr/local/www/services_dnsmasq.php:199
+msgid "Register DHCP leases in DNS forwarder"
+msgstr "DHCP kiralarını DNS yönlendiriciye kaydet"
+
+#: usr/local/www/services_dnsmasq.php:200
+#, php-format
+msgid ""
+"If this option is set, then machines that specify their hostname when "
+"requesting a DHCP lease will be registered in the DNS forwarder, so that "
+"their name can be resolved. You should also set the domain in %sSystem: "
+"General setup%s to the proper value."
+msgstr ""
+"Bu seçenek açıldığında, DHCP kirası isterken kendi isimlerini belirten "
+"makinalar DNS yönlendiriciye kaydedilir, böylece isimleri çözülebilir. "
+"Ayrıca %sSistem: Genel ayarlar%s sayfasından alan adını da ayarlamalısınız."
+
+#: usr/local/www/services_dnsmasq.php:208
+#: usr/local/www/services_unbound.php:349
+msgid "Static DHCP"
+msgstr "Statik DHCP"
+
+#: usr/local/www/services_dnsmasq.php:211
+msgid "Register DHCP static mappings in DNS forwarder"
+msgstr "DHCP statik eşleşmeleri DNS yönlendiriciye kaydet"
+
+#: usr/local/www/services_dnsmasq.php:212
+#, php-format
+msgid ""
+"If this option is set, then DHCP static mappings will be registered in the "
+"DNS forwarder, so that their name can be resolved. You should also set the "
+"domain in %sSystem: General setup%s to the proper value."
+msgstr ""
+"Bu seçenek açıldığında DHCP statik eşlemeleri DNS yönlendiriciye kaydedilir, "
+"böylece isimleri çözülebilir. Ayrıca %sSistem: Genel ayarlar%s sayfasından "
+"alan adını da ayarlamalısınız."
+
+#: usr/local/www/services_dnsmasq.php:219
+msgid "Prefer DHCP"
+msgstr "DHCP Öner"
+
+#: usr/local/www/services_dnsmasq.php:222
+msgid "Resolve DHCP mappings first"
+msgstr "Önce DHCP eşleşmelerini çöz"
+
+#: usr/local/www/services_dnsmasq.php:223
+#, php-format
+msgid ""
+"If this option is set, then DHCP mappings will be resolved before the manual "
+"list of names below. This only affects the name given for a reverse lookup "
+"(PTR)."
+msgstr ""
+"Bu seçenek açıldığında, aşağıda girdiğiniz listeden önce DHCP eşleşmeleri "
+"çözümlenir. Bu sadece tersine çözümleme (PTR) için verilen ismi etkiler."
+
+#: usr/local/www/services_dnsmasq.php:229
+#: usr/local/www/services_unbound.php:330
+msgid "DNS Query Forwarding"
+msgstr "DNS sorgusu iletme"
+
+#: usr/local/www/services_dnsmasq.php:232
+msgid "Query DNS servers sequentially"
+msgstr "DNS sunucularını sırayla sorgular"
+
+#: usr/local/www/services_dnsmasq.php:233
+#, php-format
+msgid ""
+"If this option is set, %s DNS Forwarder (dnsmasq) will query the DNS servers "
+"sequentially in the order specified (<i>System - General Setup - DNS "
+"Servers</i>), rather than all at once in parallel. "
+msgstr ""
+"Bu seçenek seçili ise, %s DNS Yönlendirici (dnsmasq),(<i>Sistem - Genel "
+"Ayarlar - DNS Sunucular</i>), 'de belirtilen DNS sunucularının hepsinde tek "
+"seferde paralel sorgu yapmak yerine, sırayla sorgulama yapar. "
+
+#: usr/local/www/services_dnsmasq.php:242
+msgid "Require domain"
+msgstr "Etki alanı gerekli"
+
+#: usr/local/www/services_dnsmasq.php:243
+#, php-format
+msgid ""
+"If this option is set, %s DNS Forwarder (dnsmasq) will not forward A or AAAA "
+"queries for plain names, without dots or domain parts, to upstream name "
+"servers. If the name is not known from /etc/hosts or DHCP then a \"not found"
+"\" answer is returned. "
+msgstr ""
+"Eğer bu seçenek ayarlanırsa, %s DNS Yönlendirici (dnsmasq), nokta ya da "
+"domain parçaları içermeyen, sade isimlerin A yada AAAA sorgularını, üstdüzey "
+"DNS sunucularına yönlendirmeyecek. Eğer isim bilinen bir /etc/hosts yada "
+"DHCP de değilse \"not found (bulunamadı)\" cevabı ile geri döner. "
+
+#: usr/local/www/services_dnsmasq.php:252
+msgid "Do not forward private reverse lookups"
+msgstr "Özel geri aramaları yönlendirme"
+
+#: usr/local/www/services_dnsmasq.php:253
+#, php-format
+msgid ""
+"If this option is set, %s DNS Forwarder (dnsmasq) will not forward reverse "
+"DNS lookups (PTR) for private addresses (RFC 1918) to upstream name "
+"servers. Any entries in the Domain Overrides section forwarding private \"n."
+"n.n.in-addr.arpa\" names to a specific server are still forwarded. If the IP "
+"to name is not known from /etc/hosts, DHCP or a specific domain override "
+"then a \"not found\" answer is immediately returned. "
+msgstr ""
+"Eğer bu seçenek ayarlanırsa, %s DNS Yönlendirici (dnsmasq), birincil "
+"adresler (RFC 1918) dan üstakış isim sunucuları için ters DNS aramaları "
+"(PTR) yönlendirmesi yapmaz. Etki alanı Üzerine yazılacak alanındaki her "
+"girdi özel yönlendirme \"n.n.n.in-addr.arpa\" isimleri belirtilen sunuclar "
+"halen yönlendirilir. IP den isime bilinmeyen /etc/hosts, DHCP yada özel etki "
+"alanı üzerine yeniden yazmalar \"bulunamadı\" cevabı hemen geri döndürülür. "
+
+#: usr/local/www/services_dnsmasq.php:261
+#: usr/local/www/services_unbound.php:262
+msgid "Listen Port"
+msgstr "Dinlenecek Port"
+
+#: usr/local/www/services_dnsmasq.php:265
+#: usr/local/www/services_unbound.php:267
+msgid ""
+"The port used for responding to DNS queries. It should normally be left "
+"blank unless another service needs to bind to TCP/UDP port 53."
+msgstr ""
+"Bu port DNS sorgularının cevaplasında kullanılır. Başka bir hizmet TCP/UDP "
+"53. porttan bağlanması gerekmedikçe normalde boş bırakılması gerekir."
+
+#: usr/local/www/services_dnsmasq.php:275
+msgid ""
+"Interface IPs used by the DNS Forwarder for responding to queries from "
+"clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries "
+"to other interface IPs not selected below are discarded. The default "
+"behavior is to respond to queries on every available IPv4 and IPv6 address."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:295
+msgid "Strict Interface Binding"
+msgstr "Sıkı Arabirim Bağlama"
+
+#: usr/local/www/services_dnsmasq.php:297
+msgid ""
+"If this option is set, the DNS forwarder will only bind to the interfaces "
+"containing the IP addresses selected above, rather than binding to all "
+"interfaces and discarding queries to other addresses."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:299
+msgid ""
+"NOTE: This option does NOT work with IPv6. If set, dnsmasq will not bind to "
+"IPv6 addresses."
+msgstr ""
+"NOT: Ayarlarsanız bu seçenek IPv6 ile ÇALIŞMAZ. dnsmasq IPv6 adresleri ile "
+"bağlanamaz."
+
+#: usr/local/www/services_dnsmasq.php:312
+msgid ""
+"Enter any additional options you would like to add to the dnsmasq "
+"configuration here, separated by a space or newline"
+msgstr ""
+"dnsmasq yapılandırmasına eklemek istediğiniz diğer seçenekleri aralarına "
+"noktalı virgül koyarak veya her birini ayrı satıra yazarak buradan "
+"girebilirsiniz"
+
+#: usr/local/www/services_dnsmasq.php:324
+#, php-format
+msgid ""
+"If the DNS forwarder is enabled, the DHCP service (if enabled) will "
+"automatically serve the LAN IP address as a DNS server to DHCP clients so "
+"they will use the forwarder. The DNS forwarder will use the DNS servers "
+"entered in %sSystem: General setup%s or those obtained via DHCP or PPP on "
+"WAN if the &quot;Allow DNS server list to be overridden by DHCP/PPP on "
+"WAN&quot; is checked. If you don't use that option (or if you use a static "
+"IP address on WAN), you must manually specify at least one DNS server on the "
+"%sSystem:General setup%s page."
+msgstr ""
+"DHCP yönlendirici etkinleştirildiğinde DHCP servisi (açıksa) LAN IP adresini "
+"DHCP istemcilere LAN DNS sunucu olarak bildirir, böylece istemciler "
+"yönlendiriciyi kullanır. DNS yönlendirici de %sSystem: Genel ayarlar%s "
+"sayfasında girilen veya DHCP ya da (&quot;WAN üzerinden DHCP/PPPnin DNS "
+"sunucu listesinin üzerine yazmasına izin ver&quot; açıksa) WAN üzerinden PPP "
+"ile alınan DNS sunucuları kullanır. O seçeneği kullanmıyorsanız (veya WAN "
+"tarafında statik IP kullanıyorsanız), %sSistem: Genel ayarlar%s sayfasında "
+"en az bir DNS sunucu belirtmelisiniz."
+
+#: usr/local/www/services_dnsmasq.php:340
+#: usr/local/www/services_unbound.php:408
+msgid "Host Overrides"
+msgstr "Host Üzerine yaz"
+
+#: usr/local/www/services_dnsmasq.php:344
+#: usr/local/www/services_unbound.php:412
+msgid ""
+"Entries in this section override individual results from the forwarders."
+msgstr ""
+"Bu bölümdeki girdiler yönlendiricilerdeki özel sonuçların üzerine yazar."
+
+#: usr/local/www/services_dnsmasq.php:345
+#: usr/local/www/services_unbound.php:413
+msgid "Use these for changing DNS results or for adding custom DNS records."
+msgstr ""
+"Bunu DNS sonuçlarını değiştirmede yada özel DNS kayıtlarını eklemede "
+"kullanın."
+
+#: usr/local/www/services_dnsmasq.php:353
+#: usr/local/www/services_dnsmasq.php:440
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:76
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:134
+#: usr/local/www/services_dnsmasq_edit.php:85
+#: usr/local/www/services_dnsmasq_edit.php:223
+#: usr/local/www/services_dnsmasq_edit.php:257
+#: usr/local/www/services_unbound.php:421
+#: usr/local/www/services_unbound.php:508
+#: usr/local/www/services_unbound_domainoverride_edit.php:71
+#: usr/local/www/services_unbound_domainoverride_edit.php:127
+#: usr/local/www/services_unbound_host_edit.php:87
+#: usr/local/www/services_unbound_host_edit.php:224
+#: usr/local/www/services_unbound_host_edit.php:260
+#: usr/local/www/system.php:108 usr/local/www/system.php:323
+msgid "Domain"
+msgstr "Alan adı"
+
+#: usr/local/www/services_dnsmasq.php:430
+#: usr/local/www/services_unbound.php:498
+msgid "Domain Overrides"
+msgstr "Alan adı Üzerine yaz"
+
+#: usr/local/www/services_dnsmasq.php:433
+msgid ""
+"Entries in this area override an entire domain, and subdomains, by "
+"specifying an authoritative DNS server to be queried for that domain."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq.php:479
+#: usr/local/www/services_unbound.php:552
+msgid "Do you really want to delete this domain override?"
+msgstr "Bu alan adı üzerine yazmayı silmek istediğinize emin misiniz?"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:87
+#: usr/local/www/services_unbound_domainoverride_edit.php:82
+msgid "A valid domain must be specified after _msdcs."
+msgstr "Geçerli bir domain (alan adı) _msdcs den sonra belirtilmelidir."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:91
+#: usr/local/www/services_dnsmasq_edit.php:100
+#: usr/local/www/services_unbound_domainoverride_edit.php:84
+#: usr/local/www/services_unbound_host_edit.php:102
+msgid "A valid domain must be specified."
+msgstr "Geçerli bir alan adı belirtilmelidir."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:94
+msgid ""
+"A valid IP address must be specified, or # for an exclusion or ! to not "
+"forward at all."
+msgstr ""
+"Ya geçerli bir IP adresi ya da dışta bırakma için # girilmelidir! yada "
+"tamamı yönlendirilmez."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:97
+msgid "An interface IP address must be specified for the DNS query source."
+msgstr "Arabirim IP adresi DNS sorgu kaynağı için belirtilmelidir."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:122
+#: usr/local/www/services_unbound_domainoverride_edit.php:115
+msgid "Edit Domain Override"
+msgstr "Alan Adı Üzerine yaz'ı Değiştir"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:137
+#: usr/local/www/services_unbound_domainoverride_edit.php:131
+msgid "Domain to override (NOTE: this does not have to be a valid TLD!)"
+msgstr "Üzerine yazılacak alan adı (Not: Geçerli bir TLD olması gerekmez.)"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:138
+#: usr/local/www/services_unbound_domainoverride_edit.php:132
+msgid "test"
+msgstr "test"
+
+# boş bırakınız cümle içinde gereksiz olabilir.
+#
+# "Olabilir cümlesi emin olunmadığını gösteriyor, anlamlı kelimelerin mutlaka karşılığı yazılmalıdır." A.Y.
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:138
+#: usr/local/www/services_dnsmasq_edit.php:234
+#: usr/local/www/services_unbound_domainoverride_edit.php:132
+#: usr/local/www/services_unbound_host_edit.php:236
+msgid "or"
+msgstr " veya"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:144
+#: usr/local/www/services_unbound_domainoverride_edit.php:141
+msgid "IP address of the authoritative DNS server for this domain"
+msgstr "Bu alan adı için otorite olacak DNS sunucunun IP adresi"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:145
+msgid ""
+"Or enter # for an exclusion to pass through this host/subdomain to standard "
+"nameservers instead of a previous override."
+msgstr ""
+"Ya da daha önce tanımlanmış bir üzerine yazma işlemini iptal etmek için # "
+"girin."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:145
+msgid ""
+"Or enter ! for lookups for this host/subdomain to NOT be forwarded anywhere."
+msgstr ""
+"Yada ! girin, aramalar için host/alt etki alanı herhangi bir yerden "
+"YÖNLENDİRİLEMEZ."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:148
+msgid "Source IP"
+msgstr "Kaynak IP"
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:151
+msgid ""
+"Source IP address for queries to the DNS server for the override domain."
+msgstr ""
+"Domain (alan adı) üzerine yazacak DNS sunucu sorguları için kaynak IP adresi."
+
+#: usr/local/www/services_dnsmasq_domainoverride_edit.php:152
+msgid "Leave blank unless your DNS server is accessed through a VPN tunnel."
+msgstr "DNS sunucunuz VPN tünel üzerinden erişim yapmadıkça boş bırakın."
+
+#: usr/local/www/services_dnsmasq_edit.php:91 usr/local/www/system.php:114
+msgid ""
+"The hostname can only contain the characters A-Z, 0-9 and '-'. It may not "
+"start or end with '-'."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:130
+#: usr/local/www/services_unbound_host_edit.php:132
+msgid "Alias Domain"
+msgstr "Grup Alan Adı"
+
+#: usr/local/www/services_dnsmasq_edit.php:135
+#: usr/local/www/services_unbound_host_edit.php:137
+msgid ""
+"Hostnames in an alias list can only contain the characters A-Z, 0-9 and '-'. "
+"They may not start or end with '-'."
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:138
+#: usr/local/www/services_unbound_host_edit.php:140
+msgid ""
+"A valid alias hostname is specified, but the domain name part should be "
+"omitted"
+msgstr ""
+
+#: usr/local/www/services_dnsmasq_edit.php:143
+#: usr/local/www/services_unbound_host_edit.php:145
+msgid "A valid domain must be specified in alias list."
+msgstr ""
+"Geçerli bir domain (alan adı) grup (alias) listesi içinde belirtilmelidir."
+
+#: usr/local/www/services_dnsmasq_edit.php:154
+#: usr/local/www/services_unbound_host_edit.php:155
+msgid "This host/domain already exists."
+msgstr "Bu sunucu/alan adı zaten kayıtlı."
+
+#: usr/local/www/services_dnsmasq_edit.php:182
+#: usr/local/www/services_unbound_host_edit.php:183
+msgid "Edit host"
+msgstr "Host düzenle"
+
+#: usr/local/www/services_dnsmasq_edit.php:212
+msgid "Edit DNS Forwarder entry"
+msgstr "DNS Yönlendirici kaydını düzenle"
+
+#: usr/local/www/services_dnsmasq_edit.php:218
+#: usr/local/www/services_unbound_host_edit.php:219
+msgid "Name of the host, without domain part"
+msgstr "Host adı, domain kısmı belirtilmeden"
+
+#: usr/local/www/services_dnsmasq_edit.php:220
+#: usr/local/www/services_unbound_host_edit.php:220
+msgid "myhost"
+msgstr "hostum"
+
+#: usr/local/www/services_dnsmasq_edit.php:226
+#: usr/local/www/services_unbound_host_edit.php:227
+msgid "Domain of the host"
+msgstr "Host'un alan adı"
+
+#: usr/local/www/services_dnsmasq_edit.php:227
+#: usr/local/www/services_unbound_host_edit.php:228
+msgid "example.com"
+msgstr "ornek.com"
+
+#: usr/local/www/services_dnsmasq_edit.php:233
+#: usr/local/www/services_unbound_host_edit.php:235
+msgid "IP address of the host"
+msgstr "Host IP adresi"
+
+#: usr/local/www/services_dnsmasq_edit.php:251
+#: usr/local/www/services_unbound_host_edit.php:254
+msgid "Enter additional names for this host."
+msgstr "Bu host için ek isimleri giriniz."
+
+#: usr/local/www/services_dyndns.php:61
+msgid "Dynamic DNS clients"
+msgstr "Dinamik DNS istemcileri"
+
+#: usr/local/www/services_dyndns.php:75 usr/local/www/services_rfc2136.php:69
+msgid "DynDns"
+msgstr "DynDns"
+
+#: usr/local/www/services_dyndns.php:76 usr/local/www/services_rfc2136.php:70
+msgid "RFC 2136"
+msgstr "RFC 2136"
+
+#: usr/local/www/services_dyndns.php:87 usr/local/www/status_openvpn.php:283
+#: usr/local/www/status_openvpn.php:346 usr/local/www/status_services.php:84
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:82
+msgid "Service"
+msgstr "Servis"
+
+#: usr/local/www/services_dyndns.php:89 usr/local/www/services_rfc2136.php:83
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:84
+msgid "Cached IP"
+msgstr "Önbelleklenmiş IP"
+
+#: usr/local/www/services_dyndns.php:191
+msgid ""
+"IP addresses appearing in green are up to date with Dynamic DNS provider."
+msgstr "Yeşil IP adresleri dinamik DNS sağlayıcıda güncel durumdadır."
+
+#: usr/local/www/services_dyndns.php:192
+msgid ""
+"You can force an update for an IP address on the edit page for that service."
+msgstr ""
+"Bu hizmet için düzenleme sayfasında IP adresini güncelleştirmeye "
+"zorlayabilirsiniz."
+
+#: usr/local/www/services_dyndns_edit.php:97
+#: usr/local/www/services_dyndns_edit.php:247
+msgid "Service type"
+msgstr "Servis türü"
+
+#: usr/local/www/services_dyndns_edit.php:107
+#: usr/local/www/services_dyndns_edit.php:382
+msgid "Update URL"
+msgstr "Güncelleme URL"
+
+#: usr/local/www/services_dyndns_edit.php:121
+msgid "The hostname contains invalid characters."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:126
+msgid "The MX contains invalid characters."
+msgstr "MX geçersiz karaterler içeriyor."
+
+#: usr/local/www/services_dyndns_edit.php:128
+#: usr/local/www/system_usermanager.php:227
+#: usr/local/www/vpn_l2tp_users_edit.php:92
+#: usr/local/www/vpn_pptp_users_edit.php:88
+msgid "The username contains invalid characters."
+msgstr "Kullanıcı adı geçersiz karakterler içeriyor."
+
+#: usr/local/www/services_dyndns_edit.php:181
+#: usr/local/www/services_dyndns_edit.php:236
+msgid "Dynamic DNS client"
+msgstr "Dinamik DNS istemcisi"
+
+#: usr/local/www/services_dyndns_edit.php:243
+#: usr/local/www/services_rfc2136_edit.php:195
+#: usr/local/www/services_rfc2136_edit.php:201
+msgid "yes"
+msgstr "evet"
+
+#: usr/local/www/services_dyndns_edit.php:261
+#: usr/local/www/services_rfc2136_edit.php:141
+msgid "Interface to monitor"
+msgstr "İzlenecek arabirim"
+
+#: usr/local/www/services_dyndns_edit.php:286
+msgid "Interface to send update from"
+msgstr "Arabirimden güncelleme gönderimi"
+
+#: usr/local/www/services_dyndns_edit.php:308
+msgid "Note: This is almost always the same as the Interface to Monitor."
+msgstr "Not: Bu hemen hemen herzaman Arabirimi izlemekle aynıdır."
+
+#: usr/local/www/services_dyndns_edit.php:319
+msgid "Enter the complete host/domain name. example: myhost.dyndns.org"
+msgstr "Tam host/alanadı giriniz. Örn: pfsense.dyndns.org"
+
+#: usr/local/www/services_dyndns_edit.php:320
+msgid "For he.net tunnelbroker, enter your tunnel ID"
+msgstr "he.net tünelkırıcı için, tünel kimliğinizi giriniz"
+
+#: usr/local/www/services_dyndns_edit.php:325
+msgid "MX"
+msgstr "MX"
+
+#: usr/local/www/services_dyndns_edit.php:329
+msgid ""
+"Note: With DynDNS service you can only use a hostname, not an IP address."
+msgstr ""
+"Not: DynDNS servisi ile sadece host adı kullanılabilir, IP adresi "
+"kullanılamaz."
+
+#: usr/local/www/services_dyndns_edit.php:331
+msgid ""
+"Set this option only if you need a special MX record. Not all services "
+"support this."
+msgstr ""
+"Bu seçeneği sadece özel MX kaydı oluşturulacak ise seçiniz. Bu özelliği tüm "
+"servisler desteklemez, unutmayınız."
+
+#: usr/local/www/services_dyndns_edit.php:335
+msgid "Wildcards"
+msgstr "Joker karakterler"
+
+#: usr/local/www/services_dyndns_edit.php:338
+#: usr/local/www/services_dyndns_edit.php:344
+msgid "Enable "
+msgstr "Etkinleştir "
+
+#: usr/local/www/services_dyndns_edit.php:338
+msgid "Wildcard"
+msgstr "Joker karakter"
+
+#: usr/local/www/services_dyndns_edit.php:341
+msgid "Verbose logging"
+msgstr "Kapsamlı günlük"
+
+#: usr/local/www/services_dyndns_edit.php:344
+msgid "verbose logging"
+msgstr "kapsamlı günlük"
+
+#: usr/local/www/services_dyndns_edit.php:347
+msgid "CURL options"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:350
+msgid "Force IPv4 resolving"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:352
+msgid "Verify SSL peer"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:359
+msgid ""
+"Username is required for all types except Namecheap, FreeDNS and Custom "
+"Entries."
+msgstr ""
+"Namecheap,Özel girdiler ve FreeDNS dışındaki tüm türlerde kullanıcı adı "
+"girilmelidir."
+
+#: usr/local/www/services_dyndns_edit.php:360
+msgid "Route 53: Enter your Access Key ID."
+msgstr "Yönlendir 53: Giriş Anahtarı Kimliğini giriniz."
+
+#: usr/local/www/services_dyndns_edit.php:361
+msgid ""
+"For Custom Entries, Username and Password represent HTTP Authentication "
+"username and passwords."
+msgstr ""
+"Özel girdiler, Kullanıcı adı ve Parola HTTP kimlik doğrulama kullanıcı adı "
+"ve parolasini temsil eder."
+
+#: usr/local/www/services_dyndns_edit.php:369
+msgid ""
+"FreeDNS (freedns.afraid.org): Enter your \"Authentication Token\" provided "
+"by FreeDNS."
+msgstr ""
+"FreeDNS (freedns.afraid.org): FreeDNS tarafından sağlanan \"Kimlik Doğrulama "
+"Anahtarı\"nı giriniz."
+
+#: usr/local/www/services_dyndns_edit.php:370
+msgid "Route 53: Enter your Secret Access Key."
+msgstr "Yönlendir 53: Gizli Giriş Anahtar' ınızı giriniz."
+
+#: usr/local/www/services_dyndns_edit.php:375
+msgid "Zone ID"
+msgstr "Alan Kimliği (ID)"
+
+#: usr/local/www/services_dyndns_edit.php:378
+msgid ""
+"Enter Zone ID that you received when you created your domain in Route 53."
+msgstr ""
+"Route 53 ile oluşturduğunuz alan adınız için size gönderilen Zone ID "
+"bilgisini giriniz."
+
+#: usr/local/www/services_dyndns_edit.php:385
+msgid ""
+"This is the only field required by for Custom Dynamic DNS, and is only used "
+"by Custom Entries."
+msgstr ""
+"Bu alan sadece özel Dinamik DNS Girdilerinde gerekebilir, DNS ve sadece Özel "
+"Girdilerinde kullanılır."
+
+#: usr/local/www/services_dyndns_edit.php:387
+#: usr/local/www/services_dyndns_edit.php:398
+msgid ""
+"If you need the new IP to be included in the request, put %IP% in its place."
+msgstr ""
+"Eğer talep içerisinde yeni IP'ye ihtiyaç duyarsanız, oraya %IP% yazınız."
+
+#: usr/local/www/services_dyndns_edit.php:391
+msgid "Result Match"
+msgstr "Eşleşen Sonuç"
+
+#: usr/local/www/services_dyndns_edit.php:394
+msgid "This field is only used by Custom Dynamic DNS Entries."
+msgstr "Bu alan sadece özel Dinamik DNS Girdilerinde kullanılır."
+
+#: usr/local/www/services_dyndns_edit.php:396
+msgid ""
+"This field should be identical to what your DDNS Provider will return if the "
+"update succeeds, leave it blank to disable checking of returned results."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:400
+msgid ""
+"If you need to include multiple possible values, separate them with a |. If "
+"your provider includes a |, escape it with \\|"
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:402
+msgid ""
+"Tabs (\\t), newlines (\\n) and carriage returns (\\r) at the beginning or "
+"end of the returned results are removed before comparison."
+msgstr ""
+
+#: usr/local/www/services_dyndns_edit.php:407
+#: usr/local/www/services_rfc2136_edit.php:74
+#: usr/local/www/services_rfc2136_edit.php:159
+msgid "TTL"
+msgstr "TTL"
+
+#: usr/local/www/services_dyndns_edit.php:410
+msgid "Choose TTL for your dns record."
+msgstr "Dns kaydınız için TTL seçiniz."
+
+#: usr/local/www/services_dyndns_edit.php:428
+#: usr/local/www/services_rfc2136_edit.php:106
+msgid "Save & Force Update"
+msgstr "Kaydet & Zorla Güncelle"
+
+#: usr/local/www/services_dyndns_edit.php:435
+#, php-format
+msgid ""
+"You must configure a DNS server in %sSystem:\n"
+" General setup%s or allow the DNS server list to be "
+"overridden\n"
+" by DHCP/PPP on WAN for dynamic DNS updates to work."
+msgstr ""
+"Dinamik DNS güncellemelerinin çalışması için ya %sSistem:\n"
+" Genel ayarlar%s sayfasında bir DNS sunucu "
+"yapılandırmalısınız veya WAN\n"
+" üzerinde DHCP/PPP tarafından üzerine yazılabilecek "
+"şekilde ayarlamalısınız."
+
+#: usr/local/www/services_igmpproxy.php:81
+#: usr/local/www/services_igmpproxy_edit.php:46
+msgid "IGMP Proxy"
+msgstr "IGMP Vekil"
+
+#: usr/local/www/services_igmpproxy.php:91
+msgid "The IGMP entry list has been changed"
+msgstr "IGMP girdi listesi değiştirildi"
+
+#: usr/local/www/services_igmpproxy.php:104
+#: usr/local/www/services_igmpproxy.php:147
+msgid "add a new igmpentry"
+msgstr "yeni IGMP girdisi ekle"
+
+#: usr/local/www/services_igmpproxy.php:134
+msgid "edit igmpentry"
+msgstr "IGMP girdisini düzenle"
+
+#: usr/local/www/services_igmpproxy.php:135
+msgid ""
+"Do you really want to delete this igmp entry? All elements that still use it "
+"will become invalid (e.g. filter rules)!"
+msgstr ""
+
+#: usr/local/www/services_igmpproxy.php:135
+msgid "delete igmpentry"
+msgstr "IGMP girdisini sil"
+
+#: usr/local/www/services_igmpproxy.php:161
+msgid ""
+"Please add the interface for upstream, the allowed subnets, and the "
+"downstream interfaces you would like the proxy to allow. Only one 'upstream' "
+"interface can be configured."
+msgstr ""
+"Vekilin izin vermesini istediğiniz gönderme arabirimi, izin verilen altağlar "
+"ve alma arabirimlerini ekleyin. Tek bir 'gönderme' arabirimi "
+"yapılandırılabilir."
+
+#: usr/local/www/services_igmpproxy_edit.php:80
+msgid "Only one 'upstream' interface can be configured."
+msgstr "Tek bir 'gönderme' arabirimi yapılandırılabilir."
+
+#: usr/local/www/services_igmpproxy_edit.php:163
+msgid "IGMP Proxy Edit"
+msgstr "IGMP Vekili Düzenle"
+
+#: usr/local/www/services_igmpproxy_edit.php:193
+msgid "Upstream Interface"
+msgstr "Gönderme Arabirimi"
+
+#: usr/local/www/services_igmpproxy_edit.php:194
+msgid "Downstream Interface"
+msgstr "Alma Arabirimi"
+
+#: usr/local/www/services_igmpproxy_edit.php:198
+msgid ""
+"The <b>upstream</b> network interface is the outgoing interface which is "
+"responsible for communicating to available multicast data sources. There can "
+"only be one upstream interface."
+msgstr ""
+"<b>Gönderme</b> ağ arabirimi çoklu yayın veri kaynaklarına erişmekten "
+"sorumlu çıkış arabirimidir. Tek bir gönderme arabirimi olabilir."
+
+#: usr/local/www/services_igmpproxy_edit.php:204
+msgid "Downstream"
+msgstr "Alma"
+
+#: usr/local/www/services_igmpproxy_edit.php:204
+msgid ""
+"network interfaces are the distribution interfaces to the destination "
+"networks, where multicast clients can join groups and receive multicast "
+"data. One or more downstream interfaces must be configured."
+msgstr ""
+"arabirimleri çoklu yayın istemcilerinin gruplara dahil olabildiği ve çoklu "
+"yayın veri alabildiği hedef ağlara dağıtım yapan arabirimlerdir. Birden "
+"fazla alma arabirimi olabilir."
+
+#: usr/local/www/services_igmpproxy_edit.php:211
+msgid "Threshold"
+msgstr "Eşik"
+
+#: usr/local/www/services_igmpproxy_edit.php:216
+msgid ""
+"Defines the TTL threshold for the network interface. Packets with a "
+"lower TTL than the threshold value will be ignored. This setting is "
+"optional, and by default the threshold is 1."
+msgstr ""
+
+#: usr/local/www/services_igmpproxy_edit.php:223
+msgid "Network (s)"
+msgstr "Ağ (lar)"
+
+#: usr/local/www/services_ntpd.php:214 usr/local/www/services_ntpd.php:306
+msgid "Add another Time server"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:238 usr/local/www/services_ntpd_gps.php:367
+#: usr/local/www/services_ntpd_pps.php:118
+msgid "Serial GPS"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:239 usr/local/www/services_ntpd_gps.php:368
+#: usr/local/www/services_ntpd_pps.php:119 usr/local/www/status_queues.php:174
+msgid "PPS"
+msgstr "PPS"
+
+#: usr/local/www/services_ntpd.php:249
+msgid "NTP Server Configuration"
+msgstr "NTP Sunucu Yapılandırması"
+
+#: usr/local/www/services_ntpd.php:276
+msgid "Interfaces without an IP address will not be shown."
+msgstr "IP adresi içermeyen arabirimler gösterilmeyecektir."
+
+#: usr/local/www/services_ntpd.php:278
+msgid "Selecting no interfaces will listen on all interfaces with a wildcard."
+msgstr "Arabirimler seçilmediğinde tüm arabirimlerin joker karakterini izler."
+
+#: usr/local/www/services_ntpd.php:279
+msgid ""
+"Selecting all interfaces will explicitly listen on only the interfaces/IPs "
+"specified."
+msgstr ""
+"Tüm arabirimlerin seçilmesi halinde sadece belirtilen arabirimler/IP(ler)i "
+"izlemesi beklenir."
+
+#: usr/local/www/services_ntpd.php:309
+msgid "For best results three to five servers should be configured here."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:311
+msgid ""
+"The <i>prefer</i> option indicates that NTP should favor the use of this "
+"server more than all others."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:313
+msgid ""
+"The <i>noselect</i> option indicates that NTP should not use this server for "
+"time, but stats for this server will be collected and displayed."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:319
+msgid "(0-15)"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:320
+msgid ""
+"Orphan mode allows the system clock to be used when no other clocks are "
+"available. The number here specifies the stratum reported during orphan mode "
+"and should normally be set to a number high enough to insure that any other "
+"servers available to clients are preferred over this server. (default: 12)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:327
+msgid "Enable RRD graphs of NTP statistics (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:333
+msgid ""
+"These options enable additional messages from NTP to be written to the "
+"System Log"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:333
+msgid "Status > System Logs > NTP"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:336
+msgid "Enable logging of peer messages (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:339
+msgid "Enable logging of system messages (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:346
+msgid "Show statistics logging options"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:349
+msgid "Warning: "
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:349
+msgid "these options will create persistant daily log files in /var/log/ntp."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:352
+msgid "Enable logging of reference clock statistics (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:355
+msgid "Enable logging of clock discipline statistics (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:358
+msgid "Enable logging of NTP peer statistics (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:366
+msgid "Show access restriction options"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:369
+msgid "these options control access to NTP from the WAN."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:372
+msgid "Enable Kiss-o'-death packets (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:375
+msgid ""
+"Deny state modifications (i.e. run time configuration) by ntpq and ntpdc "
+"(default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:378
+msgid "Disable ntpq and ntpdc queries (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:381
+msgid "Disable all except ntpq and ntpdc queries (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:384
+msgid "Deny packets that attempt a peer association (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:387
+msgid "Deny mode 6 control message trap service (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:395
+msgid "Show Leap second configuration"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:398
+msgid ""
+"A leap second file allows NTP to advertize an upcoming leap second addition "
+"or subtraction."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:399
+msgid "Normally this is only useful if this server is a stratum 1 time server."
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:401
+msgid "Enter Leap second configuration as text:"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:403
+msgid "Or"
+msgstr ""
+
+#: usr/local/www/services_ntpd.php:403
+msgid "select a file to upload:"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:160
+msgid "NTP GPS"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:376
+msgid "NTP Serial GPS Configuration"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:383
+msgid ""
+"For the best results, NTP should have at least three sources of time. So it "
+"is best to configure at least 2 servers under"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:383
+#: usr/local/www/services_ntpd_pps.php:138
+msgid "Services > NTP"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:383
+msgid ""
+"to minimize clock drift if the GPS data is not valid over time. Otherwise "
+"ntpd may only use values from the unsynchronized local clock when providing "
+"time to clients."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:387
+msgid "GPS"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:399
+msgid "This option allows you to select a predefined configuration."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:402
+msgid "Default is the configuration of pfSense 2.1 and earlier"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:403
+msgid " (not recommended). Select Generic if your GPS is not listed.)"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:404
+msgid ""
+"The perdefined configurations assume your GPS has already been set to NMEA "
+"mode."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:428
+msgid ""
+"All serial ports are listed, be sure to pick the port with the GPS attached."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:437
+msgid "Serial port baud rate."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:440
+msgid ""
+"Note: A higher baud rate is generally only helpful if the GPS is sending too "
+"many sentences. It is recommended to configure the GPS to send only one "
+"sentence at a baud rate of 4800 or 9600."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:457
+msgid ""
+"By default NTP will listen for all supported NMEA sentences. Here one or "
+"more sentences to listen for may be specified."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:464
+msgid "Fudge time 1 is used to specify the GPS PPS signal offset"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:470
+msgid "Fudge time 2 is used to specify the GPS time offset"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:475
+#: usr/local/www/services_ntpd_pps.php:167
+msgid "(0-16)"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:476
+msgid "This may be used to change the GPS Clock stratum"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:476
+msgid ""
+"This may be useful if, for some reason, you want ntpd to prefer a different "
+"clock"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:484
+#: usr/local/www/services_ntpd_pps.php:176
+msgid ""
+"Normally there should be no need to change these options from the defaults."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:494
+msgid "NTP should prefer this clock (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:502
+msgid ""
+"NTP should not use this clock, it will be displayed for reference "
+"only(default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:510
+msgid "Enable PPS signal processing (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:518
+#: usr/local/www/services_ntpd_pps.php:186
+msgid "Enable falling edge PPS signal processing (default: rising edge)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:526
+msgid "Enable kernel PPS clock discipline (default: enabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:534
+msgid "Obscure location in timestamp (default: unobscured)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:542
+msgid ""
+"Log the sub-second fraction of the received time stamp (default: Not logged)."
+"<br />Note: enabling this will rapidly fill the log, but is useful for "
+"tuning Fudge time 2."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:551
+#: usr/local/www/services_ntpd_pps.php:211
+msgid "(1 to 4 charactors)"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:552
+msgid "This may be used to change the GPS Clock ID"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:558
+msgid "Show GPS Initialization commands"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:563
+msgid ""
+"Note: Commands entered here will be sent to the GPS during initialization. "
+"Please read and understand your GPS documentation before making any changes "
+"here."
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:564
+msgid "NMEA checksum calculator"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:566
+msgid ""
+"Enter the text between &quot;$&quot; and &quot;*&quot; of a NMEA command "
+"string:"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:566
+msgid "checksum"
+msgstr ""
+
+#: usr/local/www/services_ntpd_gps.php:567
+msgid "Calculate NMEA checksum"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:101
+msgid "NTP PPS"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:129
+msgid "NTP PPS Configuration"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:134
+msgid ""
+"Devices with a Pulse Per Second output such as radios that receive a time "
+"signal from DCF77 (DE), JJY (JP), MSF (GB) or WWVB (US) may be used as a PPS "
+"reference for NTP."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:135
+msgid ""
+"A serial GPS may also be used, but the serial GPS driver would usually be "
+"the better option."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:136
+msgid ""
+"A PPS signal only provides a reference to the change of a second, so at "
+"least one other source to number the seconds is required."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:138
+msgid "At least 3 additional time sources should be configured under"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:138
+msgid "to reliably supply the time of each PPS pulse."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:154
+msgid ""
+"All serial ports are listed, be sure to pick the port with the PPS source "
+"attached."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:162
+msgid ""
+"Fudge time is used to specify the PPS signal offset from the actual second "
+"such as the transmission delay between the transmitter and the receiver."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:168
+msgid "This may be used to change the PPS Clock stratum"
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:168
+msgid ""
+"This may be useful if, for some reason, you want ntpd to prefer a different "
+"clock and just monitor this source."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:194
+msgid "Enable kernel PPS clock discipline (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:202
+msgid ""
+"Record a timestamp once for each second, useful for constructing Allan "
+"deviation plots (default: disabled)."
+msgstr ""
+
+#: usr/local/www/services_ntpd_pps.php:212
+msgid "This may be used to change the PPS Clock ID"
+msgstr ""
+
+#: usr/local/www/services_rfc2136.php:56
+msgid "RFC 2136 clients"
+msgstr "RFC 2136 istemcileri"
+
+#: usr/local/www/services_rfc2136.php:166
+#: usr/local/www/vpn_openvpn_client.php:1165
+msgid "Do you really want to delete this client?"
+msgstr "Bu istemciyi silmek istediğinize emin misiniz?"
+
+#: usr/local/www/services_rfc2136_edit.php:74
+#: usr/local/www/services_rfc2136_edit.php:165
+msgid "Key name"
+msgstr "Anahtar adı"
+
+#: usr/local/www/services_rfc2136_edit.php:79
+msgid "The DNS update host name contains invalid characters."
+msgstr "DNS güncelleme host adı geçersiz karakterler içeriyor."
+
+#: usr/local/www/services_rfc2136_edit.php:81
+msgid "The DNS update TTL must be an integer."
+msgstr "DNS güncelleme TTL değeri tamsayı olmalıdır."
+
+#: usr/local/www/services_rfc2136_edit.php:83
+msgid "The DNS update key name contains invalid characters."
+msgstr "DNS güncelleme anahtar adı geçersiz karakterler içeriyor."
+
+#: usr/local/www/services_rfc2136_edit.php:104
+msgid "New/Edited RFC2136 dnsupdate entry was posted."
+msgstr "Yeni/değiştirilmiş RFC2136 dnsupdate girdisi gönderildi."
+
+#: usr/local/www/services_rfc2136_edit.php:116
+#: usr/local/www/services_rfc2136_edit.php:130
+msgid "RFC 2136 client"
+msgstr "RFC 2136 istemcisi"
+
+#: usr/local/www/services_rfc2136_edit.php:169
+msgid "This must match the setting on the DNS server."
+msgstr "Bu ayar DNS sunucu ayarları ile uyumlu olmalıdır."
+
+#: usr/local/www/services_rfc2136_edit.php:172
+msgid "Key type"
+msgstr "Anahtar türü"
+
+#: usr/local/www/services_rfc2136_edit.php:176
+msgid " User"
+msgstr " Kullanıcı"
+
+#: usr/local/www/services_rfc2136_edit.php:184
+msgid "Paste an HMAC-MD5 key here."
+msgstr "Burada bir HMAC-MD5 anahtarı vermelisiniz."
+
+#: usr/local/www/services_rfc2136_edit.php:196
+msgid "Use TCP instead of UDP"
+msgstr "UDP yerine TCP kullan"
+
+#: usr/local/www/services_rfc2136_edit.php:199
+msgid "Use Public IP"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:202
+msgid ""
+"If the interface IP is private, attempt to fetch and use the public IP "
+"instead."
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:216
+msgid "Save &amp; Force Update"
+msgstr ""
+
+#: usr/local/www/services_rfc2136_edit.php:225
+#, php-format
+msgid ""
+"You must configure a DNS server in %sSystem: General setup %sor allow the "
+"DNS server list to be overridden by DHCP/PPP on WAN for dynamic DNS updates "
+"to work."
+msgstr ""
+"Dinamik DNS güncellemelerinin çalışması için %sSistem: Genel ayarlar%s "
+"sayfasında bir DNS sunucu yapılandırmalı veya WAN üzerinde DHCP/PPP "
+"tarafından DNS listesinin güncellenmesine izin vermelisiniz."
+
+#: usr/local/www/services_router_advertisements.php:75
+msgid ""
+"The DHCPv6 Server can only be enabled on interfaces configured with static "
+"IP addresses"
+msgstr ""
+"DHCPv6 Sunucu sadece arabirimler statik IP adresleri ile yapılandırılınca "
+"etkinleşir"
+
+#: usr/local/www/services_router_advertisements.php:76
+msgid "Only interfaces configured with a static IP will be shown"
+msgstr "Sadece statik IP adresine sahip arabirimler görüntülenmektedir"
+
+#: usr/local/www/services_router_advertisements.php:118
+msgid ""
+"Subnets are specified in CIDR format. Select the CIDR mask that pertains to "
+"each entry. /128 specifies a single IPv6 host; /64 specifies a normal IPv6 "
+"network; etc. If no subnets are specified here, the Router Advertisement "
+"(RA) Daemon will advertise to the subnet to which the router's interface is "
+"assigned."
+msgstr ""
+"Altağlar CIDR formatında belirtilmelidir. Her girdi seçilen CIDR maskesi ile "
+"ilgilidir. /128 tek bir IPv6 istemciyi belirtir; /64 normal bir IPv6 ağını "
+"belirtir; vb. Eğer alt ağlar burada belirtiliyor ise, Yönlendirici İlanı "
+"(RA) Servisi hangi arabirim atandıysa altağ için ilan yapar."
+
+#: usr/local/www/services_router_advertisements.php:145
+#, php-format
+msgid "An invalid subnet or alias was specified. [%s/%s]"
+msgstr "Geçersiz altağ yada grup belirtildi. [%s/%s]"
+
+#: usr/local/www/services_router_advertisements.php:194
+msgid "Router advertisements"
+msgstr "Yönlendirici ilanları"
+
+#: usr/local/www/services_router_advertisements.php:279
+#, php-format
+msgid "Select the Operating Mode for the Router Advertisement (RA) Daemon."
+msgstr ""
+"Yönlendirici İlanı (RA Router Advertisement) Servisi için operasyon kipini "
+"seçiniz."
+
+#: usr/local/www/services_router_advertisements.php:280
+#, php-format
+msgid ""
+"Use \"Router Only\" to only advertise this router, \"Unmanaged\" for Router "
+"Advertising with Stateless Autoconfig, \"Managed\" for assignment through "
+"(a) DHCPv6 Server, \"Assisted\" for DHCPv6 Server assignment combined with "
+"Stateless Autoconfig"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:281
+#, php-format
+msgid ""
+"It is not required to activate this DHCPv6 server when set to \"Managed\", "
+"this can be another host on the network"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:285
+msgid "Router Priority"
+msgstr "Yönlendirici Önceliği"
+
+#: usr/local/www/services_router_advertisements.php:292
+#, php-format
+msgid "Select the Priority for the Router Advertisement (RA) Daemon."
+msgstr "Yönlendirici İlanı (RA Router Advertisement) için öncelik seçiniz."
+
+#: usr/local/www/services_router_advertisements.php:306
+msgid "RA Interface"
+msgstr "Yönlendirici İlanı (RA Router Advertisement) Arabirimi"
+
+#: usr/local/www/services_router_advertisements.php:314
+#, php-format
+msgid "Select the Interface for the Router Advertisement (RA) Daemon."
+msgstr "Yönlendirici İlanı (RA Router Advertisement) için arabirim seçiniz."
+
+#: usr/local/www/services_router_advertisements.php:320
+msgid "RA Subnet(s)"
+msgstr "Yönlendirici ilan (RA outer Advertisement) altağ(ları)"
+
+#: usr/local/www/services_router_advertisements.php:391
+msgid ""
+"The RA server can optionally provide a domain search list. Use the semicolon "
+"character as separator"
+msgstr ""
+
+#: usr/local/www/services_router_advertisements.php:399
+msgid "Use same settings as DHCPv6 server"
+msgstr "Aynı ayarları DHCPv6 sunucu için kullan"
+
+#: usr/local/www/services_snmp.php:95
+msgid "Invalid character '#' in system location"
+msgstr "Sistem konum alanında karakter '#' geçersiz"
+
+#: usr/local/www/services_snmp.php:96
+msgid "Invalid character '#' in system contact"
+msgstr "Sistem iletişim alanında karakter '#' geçersiz"
+
+#: usr/local/www/services_snmp.php:97
+msgid "Invalid character '#' in read community string"
+msgstr "Okuma topluluk dizesinde karakter '#' geçersiz"
+
+#: usr/local/www/services_snmp.php:100
+msgid "Community"
+msgstr "Topluluk"
+
+#: usr/local/www/services_snmp.php:104
+msgid "Polling Port"
+msgstr "Sorgulama Portu"
+
+#: usr/local/www/services_snmp.php:111
+msgid "Invalid character '#' in SNMP trap string"
+msgstr "SNMP tuzak dizesinde karakter '#' geçersiz"
+
+#: usr/local/www/services_snmp.php:114 usr/local/www/services_snmp.php:357
+msgid "Trap server"
+msgstr "Tuzak sunucusu"
+
+#: usr/local/www/services_snmp.php:118
+msgid "Trap server port"
+msgstr "Tuzak sunucusu portu"
+
+#: usr/local/www/services_snmp.php:122 usr/local/www/services_snmp.php:376
+msgid "Trap string"
+msgstr "Tuzak dizesi"
+
+#: usr/local/www/services_snmp.php:290
+msgid "SNMP Daemon"
+msgstr "SNMP servisi"
+
+#: usr/local/www/services_snmp.php:296
+msgid "Polling Port "
+msgstr "Sorgulama Portu "
+
+#: usr/local/www/services_snmp.php:299
+msgid "Enter the port to accept polling events on (default 161)"
+msgstr "Sorgulama olaylarına erişilecek portu girin (varsayılan 161)"
+
+#: usr/local/www/services_snmp.php:304
+msgid "System location"
+msgstr "Sistem konumu"
+
+#: usr/local/www/services_snmp.php:311
+msgid "System contact"
+msgstr "Sistem iletişim"
+
+#: usr/local/www/services_snmp.php:318
+msgid "Read Community String"
+msgstr "Topluluk dizesini oku"
+
+#: usr/local/www/services_snmp.php:321
+msgid ""
+"The community string is like a password, restricting access to querying SNMP "
+"to hosts knowing the community string. Use a strong value here to protect "
+"from unauthorized information disclosure."
+msgstr ""
+"Topluluk dizesi parola gibidir, SNMP sorgusunu dizeyi bilenlerle sınırlar. "
+"Yetkisiz erişimi engellemek için güçlü bir dize belirleyin."
+
+#: usr/local/www/services_snmp.php:350
+msgid "SNMP Traps"
+msgstr "SNMP Tuzakları"
+
+#: usr/local/www/services_snmp.php:360
+msgid "Enter trap server name"
+msgstr "Tuzak sunucusu adı giriniz"
+
+#: usr/local/www/services_snmp.php:365
+msgid "Trap server port "
+msgstr "Tuzak sunucu portu "
+
+#: usr/local/www/services_snmp.php:368
+msgid "Enter the port to send the traps to (default 162)"
+msgstr "Tuzakların gönderileceği port adresini giriniz (varsayılan 162)"
+
+#: usr/local/www/services_snmp.php:373
+msgid "Enter the SNMP trap string"
+msgstr "SNMP tuzak dizesini girin"
+
+#: usr/local/www/services_snmp.php:385
+msgid "Modules"
+msgstr "Bileşenler"
+
+#: usr/local/www/services_snmp.php:391
+msgid "SNMP Modules"
+msgstr "SMNP Bileşenleri"
+
+#: usr/local/www/services_snmp.php:393
+msgid "MibII"
+msgstr "MibII"
+
+#: usr/local/www/services_snmp.php:395
+msgid "Netgraph"
+msgstr "Net grafik"
+
+#: usr/local/www/services_snmp.php:399
+msgid "Host Resources (Requires MibII)"
+msgstr "Host Kaynakları (MibII gerektirir)"
+
+#: usr/local/www/services_snmp.php:401
+msgid "UCD"
+msgstr "UCD"
+
+#: usr/local/www/services_snmp.php:403
+msgid "Regex"
+msgstr "Düzenli ifade"
+
+#: usr/local/www/services_snmp.php:413
+msgid "Interface Binding"
+msgstr "Arabirim Bağlama"
+
+#: usr/local/www/services_snmp.php:418
+msgid "Bind Interface"
+msgstr "Arabirim Bağla (Ata)"
+
+#: usr/local/www/services_unbound.php:130
+msgid "You must specify a valid port number."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:230
+msgid "The configuration of the DNS Resolver has been changed"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:230
+msgid "You must apply changes for them to take effect."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:238
+#: usr/local/www/services_unbound_advanced.php:212
+msgid "General settings"
+msgstr "Genel ayarlar"
+
+#: usr/local/www/services_unbound.php:239
+#: usr/local/www/services_unbound_acls.php:189
+#: usr/local/www/services_unbound_advanced.php:213
+msgid "Advanced settings"
+msgstr "Gelişmiş ayarlar"
+
+#: usr/local/www/services_unbound.php:240
+#: usr/local/www/services_unbound_acls.php:190
+#: usr/local/www/services_unbound_advanced.php:214
+msgid "Access Lists"
+msgstr "Erişim Listeleri"
+
+#: usr/local/www/services_unbound.php:251
+msgid "General DNS Resolver Options"
+msgstr "Genel DNS Çözümleyici Ayarları"
+
+#: usr/local/www/services_unbound.php:257
+msgid "Enable DNS Resolver"
+msgstr "DNS Çözümleyici'yi etkinleştir"
+
+#: usr/local/www/services_unbound.php:272
+#: usr/local/www/system_advanced_network.php:251
+msgid "Network Interfaces"
+msgstr "Ağ Arabirimleri"
+
+#: usr/local/www/services_unbound.php:278
+msgid ""
+"Interface IPs used by the DNS Resolver for responding to queries from "
+"clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries "
+"to other interface IPs not selected below are discarded. The default "
+"behavior is to respond to queries on every available IPv4 and IPv6 address."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:297
+msgid "Outgoing Network Interfaces"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:303
+msgid ""
+"Utilize different network interface(s) that the DNS Resolver will use to "
+"send queries to authoritative servers and receive their replies. By default "
+"all interfaces are used."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:322
+msgid "DNSSEC"
+msgstr "DNSSEC"
+
+#: usr/local/www/services_unbound.php:325
+msgid "Enable DNSSEC Support"
+msgstr "DNSSEC Desteğini Etkinleştir"
+
+#: usr/local/www/services_unbound.php:333
+msgid "Enable Forwarding Mode"
+msgstr "Yönlendirme Kipini Etkinleştir"
+
+#: usr/local/www/services_unbound.php:340
+msgid "Register DHCP leases in the DNS Resolver"
+msgstr "DHCP kiralarını DNS Çüzücüye kaydet"
+
+#: usr/local/www/services_unbound.php:341
+#, php-format
+msgid ""
+"If this option is set, then machines that specify their hostname when "
+"requesting a DHCP lease will be registered in the DNS Resolver, so that "
+"their name can be resolved. You should also set the domain in %sSystem: "
+"General setup%s to the proper value."
+msgstr ""
+"Bu seçenek açıldığında, DHCP kirası isterken kendi isimlerini belirten "
+"makinalar DNS Çözücüye kaydedilir, böylece isimleri çözülebilir. Ayrıca "
+"%sSistem: Genel ayarlar%s sayfasından alan adını da ayarlamalısınız."
+
+#: usr/local/www/services_unbound.php:352
+msgid "Register DHCP static mappings in the DNS Resolver"
+msgstr "DHCP statik eşleşmeleri DNS Çözücüye kaydet"
+
+#: usr/local/www/services_unbound.php:353
+#, php-format
+msgid ""
+"If this option is set, then DHCP static mappings will be registered in the "
+"DNS Resolver, so that their name can be resolved. You should also set the "
+"domain in %sSystem: General setup%s to the proper value."
+msgstr ""
+"Bu seçenek açıldığında DHCP statik eşlemeleri DNS Çözücüye kaydedilir, "
+"böylece isimleri çözülebilir. Ayrıca %sSistem: Genel ayarlar%s sayfasından "
+"alan adını da ayarlamalısınız."
+
+#: usr/local/www/services_unbound.php:360
+msgid "TXT Comment Support"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:363
+msgid ""
+"If this option is set, then any descriptions associated with Host entries "
+"and DHCP Static mappings will create a corresponding TXT record."
+msgstr ""
+
+#: usr/local/www/services_unbound.php:376
+msgid ""
+"Enter any additional configuration parameters to add to the DNS Resolver "
+"configuration here, separated by a newline"
+msgstr ""
+
+#: usr/local/www/services_unbound.php:395
+#, php-format
+msgid ""
+"If the DNS Resolver is enabled, the DHCP service (if enabled) will "
+"automatically serve the LAN IP address as a DNS server to DHCP clients so "
+"they will use the DNS Resolver. If Forwarding, is enabled, the DNS Resolver "
+"will use the DNS servers entered in %sSystem: General setup%s or those "
+"obtained via DHCP or PPP on WAN if the &quot;Allow DNS server list to be "
+"overridden by DHCP/PPP on WAN&quot; is checked."
+msgstr ""
+"DHCP Çözücü etkinleştirildiğinde DHCP servisi (açıksa) LAN IP adresini DHCP "
+"istemcilere LAN DNS sunucu olarak bildirir, böylece istemciler DNS çözücüyü "
+"kullanır. Eğer Yönlendirme etkinse, DNS Çözücü %sSystem: Genel ayarlar%s "
+"sayfasında girilen veya DHCP ya da (&quot;WAN üzerinden DHCP/PPPnin DNS "
+"sunucu listesinin üzerine yazmasına izin ver&quot; açıksa) WAN üzerinden PPP "
+"ile alınan DNS sunucuları kullanır."
+
+#: usr/local/www/services_unbound.php:501
+msgid ""
+"Entries in this area override an entire domain by specifying an "
+"authoritative DNS server to be queried for that domain."
+msgstr ""
+"Bu alandaki girdiler alan adı için sorgulanacak yetkili DNS sunucusu "
+"belirterek tüm alan adının üzerine yazar."
+
+#: usr/local/www/services_unbound_acls.php:95
+#: usr/local/www/services_unbound_acls.php:109
+msgid "You must enter a valid IP address for each row under Networks."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:100
+msgid "You must enter a valid IPv4 netmask for each IPv4 row under Networks."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:106
+msgid "You must enter a valid IPv6 netmask for each IPv6 row under Networks."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:179
+#: usr/local/www/services_unbound_advanced.php:204
+msgid "The configuration of the DNS Resolver, has been changed"
+msgstr "DNS Çözücü yapılandırması değiştirildi"
+
+# 93%
+#: usr/local/www/services_unbound_acls.php:188
+msgid "General Settings"
+msgstr "Genel Ayarlar"
+
+#: usr/local/www/services_unbound_acls.php:204
+#, php-format
+msgid "%s Access List"
+msgstr "%s Erişim Listesi"
+
+#: usr/local/www/services_unbound_acls.php:207
+msgid "Access List name"
+msgstr "Erişim Listesi adı"
+
+#: usr/local/www/services_unbound_acls.php:211
+msgid "Provide an Access List name."
+msgstr "Erişim Listesi adı sağlayın."
+
+#: usr/local/www/services_unbound_acls.php:226
+msgid ""
+"Choose what to do with DNS requests that match the criteria specified below."
+msgstr "Aşağıda belirtilen kritere uyan DNS isteklerine ne yapılacağını seçin."
+
+#: usr/local/www/services_unbound_acls.php:227
+msgid ""
+"<b>Deny:</b> This action stops queries from hosts within the netblock "
+"defined below."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:228
+msgid ""
+"<b>Refuse:</b> This action also stops queries from hosts within the netblock "
+"defined below, but sends a DNS rcode REFUSED error message back to the "
+"client."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:229
+msgid ""
+"<b>Allow:</b> This action allows queries from hosts within the netblock "
+"defined below."
+msgstr ""
+
+#: usr/local/www/services_unbound_acls.php:230
+msgid ""
+"<b>Allow Snoop:</b> This action allows recursive and nonrecursive access "
+"from hosts within the netblock defined below. Used for cache snooping and "
+"ideally should only be configured for your administrative host."
+msgstr ""
+
+# 87%
+#: usr/local/www/services_unbound_acls.php:235
+msgid "Networks"
+msgstr "Ağlar"
+
+#: usr/local/www/services_unbound_acls.php:321
+msgid "Access List Name"
+msgstr "Giriş Listesi Adı"
+
+#: usr/local/www/services_unbound_acls.php:335
+msgid "Add new Access List"
+msgstr "Yeni Giriş Listesi Ekle"
+
+#: usr/local/www/services_unbound_acls.php:344
+msgid "Access Lists to control access to the DNS Resolver can be defined here."
+msgstr ""
+"Giriş Listeleri ile DNS Çözücü girişlerinin izinlerini buradan "
+"tanımlayabilirsiniz."
+
+#: usr/local/www/services_unbound_acls.php:368
+msgid "edit access list"
+msgstr "giriş listesini düzenle"
+
+# 82%
+#: usr/local/www/services_unbound_acls.php:370
+msgid "Do you really want to delete this access list?"
+msgstr "Bu giriş listesini silmek istediğinize emin misiniz?"
+
+#: usr/local/www/services_unbound_acls.php:371
+msgid "delete access list"
+msgstr "giriş listesini sil"
+
+#: usr/local/www/services_unbound_advanced.php:225
+msgid "Advanced Resolver Options"
+msgstr "Gelişmiş Çözücü Seçenekleri"
+
+#: usr/local/www/services_unbound_advanced.php:228
+msgid "Hide Identity"
+msgstr "Kimliği gizle"
+
+#: usr/local/www/services_unbound_advanced.php:231
+msgid "If enabled, id.server and hostname.bind queries are refused."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:235
+msgid "Hide Version"
+msgstr "Sürümü gizle"
+
+#: usr/local/www/services_unbound_advanced.php:238
+msgid "If enabled, version.server and version.bind queries are refused."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:242
+msgid "Prefetch Support"
+msgstr "Prefetch (önbellek) Desteği"
+
+#: usr/local/www/services_unbound_advanced.php:245
+msgid ""
+"Message cache elements are prefetched before they expire to help keep the "
+"cache up to date. When enabled, this option can cause an increase of around "
+"10% more DNS traffic and load on the server, but frequently requested items "
+"will not expire from the cache."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:249
+msgid "Prefetch DNS Key Support"
+msgstr "Prefetch (önbellek) DNS Anahtar Desteği"
+
+#: usr/local/www/services_unbound_advanced.php:252
+#, php-format
+msgid ""
+"DNSKEY's are fetched earlier in the validation process when a %sDelegation "
+"signer%s is encountered. This helps lower the latency of requests but does "
+"utilize a little more CPU."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:256
+msgid "Harden Glue"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:259
+msgid "Only trust glue if it is within the servers authority."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:263
+msgid "Harden DNSSEC data"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:266
+msgid ""
+"DNSSEC data is required for trust-anchored zones. If such data is absent, "
+"the zone becomes bogus. If this is disabled and no DNSSEC data is received, "
+"then the zone is made insecure."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:270
+msgid "Message Cache Size"
+msgstr "Mesaj Ön bellek Boyutu"
+
+#: usr/local/www/services_unbound_advanced.php:283
+msgid ""
+"Size of the message cache. The message cache stores DNS rcodes and "
+"validation statuses. The RRSet cache will automatically be set to twice this "
+"amount. The RRSet cache contains the actual RR data. The default is 4 "
+"megabytes."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:287
+msgid "Outgoing TCP Buffers"
+msgstr "Giden TCP Ön bellekleri"
+
+#: usr/local/www/services_unbound_advanced.php:300
+msgid ""
+"The number of outgoing TCP buffers to allocate per thread. The default value "
+"is 10. If 0 is selected then no TCP queries, to authoritative servers, are "
+"done."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:304
+msgid "Incoming TCP Buffers"
+msgstr "Gelen TCP Ön bellekleri"
+
+#: usr/local/www/services_unbound_advanced.php:317
+msgid ""
+"The number of incoming TCP buffers to allocate per thread. The default value "
+"is 10. If 0 is selected then no TCP queries, from clients, are accepted."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:321
+msgid "EDNS Buffer Size"
+msgstr "EDNS Tampon Bellek Boyutu"
+
+#: usr/local/www/services_unbound_advanced.php:334
+msgid ""
+"Number of bytes size to advertise as the EDNS reassembly buffer size. This "
+"is the value that is used in UDP datagrams sent to peers. RFC recommendation "
+"is 4096 (which is the default). If you have fragmentation reassemble "
+"problems, usually seen as timeouts, then a value of 1480 should help. The "
+"512 value bypasses most MTU path problems, but it can generate an excessive "
+"amount of TCP fallback."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:338
+msgid "Number of queries per thread"
+msgstr "İş parçacığı (thread) başına kuyruk sayısı"
+
+#: usr/local/www/services_unbound_advanced.php:351
+msgid ""
+"The number of queries that every thread will service simultaneously. If more "
+"queries arrive that need to be serviced, and no queries can be jostled, then "
+"these queries are dropped."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:355
+msgid "Jostle Timeout"
+msgstr "Jostle Zaman Aşımı"
+
+#: usr/local/www/services_unbound_advanced.php:368
+msgid ""
+"This timeout is used for when the server is very busy. This protects against "
+"denial of service by slow queries or high query rates. The default value is "
+"200 milliseconds."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:372
+msgid "Maximum TTL for RRsets and messages"
+msgstr "RRset(ler) ve mesajlar için Maksimum TTL"
+
+#: usr/local/www/services_unbound_advanced.php:375
+msgid ""
+"Configure a maximum Time to live for RRsets and messages in the cache. The "
+"default is 86400 seconds (1 day). When the internal TTL expires the cache "
+"item is expired. This can be configured to force the resolver to query for "
+"data more often and not trust (very large) TTL values."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:379
+msgid "Minimum TTL for RRsets and messages"
+msgstr "RRset(ler) ve mesajlar için En Az (minimum) TTL"
+
+#: usr/local/www/services_unbound_advanced.php:382
+msgid ""
+"Configure a minimum Time to live for RRsets and messages in the cache. The "
+"default is 0 seconds. If the minimum value kicks in, the data is cached for "
+"longer than the domain owner intended, and thus less queries are made to "
+"look up the data. The 0 value ensures the data in the cache is as the domain "
+"owner intended. High values can lead to trouble as the data in the cache "
+"might not match up with the actual data anymore."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:386
+msgid "TTL for Host cache entries"
+msgstr "Host önbellek girdileri için TTL"
+
+#: usr/local/www/services_unbound_advanced.php:395
+msgid ""
+"Time to live for entries in the host cache. The host cache contains "
+"roundtrip timing and EDNS support information. The default is 15 minutes."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:399
+msgid "TTL for lame delegation"
+msgstr "Eksik yetkilendirme için TTL"
+
+#: usr/local/www/services_unbound_advanced.php:408
+msgid ""
+"Time to live for when a delegation is considered to be lame. The default is "
+"15 minutes."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:412
+msgid "Number of Hosts to cache"
+msgstr "Ön belleğe alınacak Hostların sayısı"
+
+#: usr/local/www/services_unbound_advanced.php:421
+msgid "Number of hosts for which information is cached. The default is 10,000."
+msgstr ""
+"Önbelleğe alınacak bilgileri belirleyecek hostların sayısı. Varsayılan "
+"10,000."
+
+#: usr/local/www/services_unbound_advanced.php:425
+msgid "Unwanted Reply Threshold"
+msgstr "İstenmeyen Yanıt Eşik değerleri"
+
+#: usr/local/www/services_unbound_advanced.php:435
+msgid ""
+"If enabled, a total number of unwanted replies is kept track of in every "
+"thread. When it reaches the threshold, a defensive action is taken and a "
+"warning is printed to the log file. This defensive action is to clear the "
+"RRSet and message caches, hopefully flushing away any poison. The default is "
+"disabled, but if enabled a value of 10 million is suggested."
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:439
+msgid "Log level verbosity"
+msgstr "Günlük seviyesi ayrıntı düzeyi"
+
+#: usr/local/www/services_unbound_advanced.php:452
+msgid "Select the log verbosity."
+msgstr "Günlük ayrıntı düzeyini seç."
+
+#: usr/local/www/services_unbound_advanced.php:456
+msgid "Disable auto-added access control"
+msgstr ""
+
+#: usr/local/www/services_unbound_advanced.php:459
+msgid ""
+"Check this box to disable the automatically-added access control entries. By "
+"default, IPv4 and IPv6 networks residing on internal interfaces of this "
+"system are permitted. Allowed networks must be manually configured on the "
+"Access Lists tab if the auto-added entries are disabled."
+msgstr ""
+
+#: usr/local/www/services_unbound_domainoverride_edit.php:90
+msgid ""
+"A valid IP address and port must be specified, for example "
+"192.168.100.10@5353."
+msgstr ""
+
+#: usr/local/www/services_unbound_domainoverride_edit.php:92
+msgid "A valid IP address must be specified, for example 192.168.100.10."
+msgstr ""
+
+#: usr/local/www/services_unbound_domainoverride_edit.php:143
+msgid ""
+"To use a nondefault port for communication, append an '@' with the port "
+"number."
+msgstr ""
+
+#: usr/local/www/services_unbound_host_edit.php:93
+msgid ""
+"The hostname can only contain the characters A-Z, 0-9, '_' and '-'. It may "
+"not start or end with '-'."
+msgstr ""
+
+#: usr/local/www/services_unbound_host_edit.php:213
+msgid "Edit DNS Resolver entry"
+msgstr ""
+
+#: usr/local/www/services_wol.php:64
+#, php-format
+msgid "Sent magic packet to %1$s (%2$s)%3$s"
+msgstr "Özel paketi %1$s (%2$s)%3$s adresine gönderildi"
+
+#: usr/local/www/services_wol.php:66
+#, php-format
+msgid ""
+"Please check the %1$ssystem log%2$s, the wol command for %3$s (%4$s) did not "
+"complete successfully%5$s"
+msgstr ""
+"Lütfen %1$ssistem günlüğü%2$snü kontrol edin, %3$s (%4$s) wol komutu "
+"başarısız oldu %5$s"
+
+#: usr/local/www/services_wol.php:89
+msgid "A valid interface must be specified."
+msgstr "Geçerli bir arabirim belirtilmelidir."
+
+#: usr/local/www/services_wol.php:95
+msgid "A valid ip could not be found!"
+msgstr "Geçerli bir IP bulunamadı!"
+
+#: usr/local/www/services_wol.php:100
+#, php-format
+msgid "Sent magic packet to %s."
+msgstr "%s adresine özel paket gönderildi."
+
+#: usr/local/www/services_wol.php:102
+#, php-format
+msgid ""
+"Please check the %1$ssystem log%2$s, the wol command for %3$s did not "
+"complete successfully%4$s"
+msgstr ""
+"Lütfen %1$s sistem günlüğü %2$s kontrol edin, %3$s wol(LiU) komutu başarısız "
+"oldu %4$s"
+
+#: usr/local/www/services_wol.php:142
+msgid "Choose which interface the host to be woken up is connected to."
+msgstr "Uyanacak istemcinin bağlantı olduğu arabirimi seçin."
+
+#: usr/local/www/services_wol.php:149
+msgid "Enter a MAC address "
+msgstr "MAC adresi giriniz "
+
+#: usr/local/www/services_wol.php:149
+msgid "in the following format: xx:xx:xx:xx:xx:xx"
+msgstr "xx:xx:xx:xx:xx:xx biçiminde"
+
+#: usr/local/www/services_wol.php:158
+msgid "Wake all clients at once: "
+msgstr "Tüm istemcileri aynı anda aç: "
+
+#: usr/local/www/services_wol.php:159
+msgid "Or Click the MAC address to wake up an individual device:"
+msgstr "Veya tek bir cihazı uyandırmak için MAC adresine tıkla:"
+
+#: usr/local/www/services_wol.php:213
+msgid ""
+"This service can be used to wake up (power on) computers by sending special"
+msgstr "Bu servis bilgisayarları uyandırmak (açmak) için kullanılabilir"
+
+#: usr/local/www/services_wol.php:213
+msgid "Magic Packets"
+msgstr "Özel Paketler göndererek"
+
+#: usr/local/www/services_wol.php:213
+msgid ""
+"The NIC in the computer that is to be woken up must support Wake on LAN and "
+"has to be configured properly (WOL cable, BIOS settings). "
+msgstr ""
+"Uyandırılacak bilgisayardaki NIC Wake ON LAN (Lan ile Uyan) özelliğini "
+"desteklemelidir ve düzgün şekilde ayarlanmış olmalıdır (WOL kablosu, BIOS "
+"ayarları)."
+
+#: usr/local/www/services_wol_edit.php:127
+msgid "Edit WOL entry"
+msgstr "WOL (Lan ile Uyan) girdisini düzenle"
+
+#: usr/local/www/services_wol_edit.php:141
+msgid "Choose which interface this host is connected to."
+msgstr "İstemcinin bağlı olduğu arabirimi seçiniz."
+
+#: usr/local/www/services_wol_edit.php:148
+msgid "Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx"
+msgstr "MAC adresini örnekteki gibi giriniz: xx:xx:xx:xx:xx:xx"
+
+#: usr/local/www/shortcuts.inc:96
+msgid "Main page for this section"
+msgstr "Bu bölümün ana sayfası"
+
+#: usr/local/www/shortcuts.inc:120
+msgid "Status of items on this page"
+msgstr "Bu sayfanın öğelerinin durumları"
+
+#: usr/local/www/shortcuts.inc:127
+msgid "Log entries for items on this page"
+msgstr "Bu sayfanın öğelerinin kayıt girdileri"
+
+#: usr/local/www/status.php:125
+msgid "This status page includes the following information"
+msgstr "Durum sayfası aşağıdaki bilgileri içerir"
+
+#: usr/local/www/status.php:245
+msgid ""
+"Note: make sure to remove any sensitive information (passwords, maybe also "
+"IP addresses) before posting information from this page in public places "
+"(like mailing lists)"
+msgstr ""
+"Not: Halka açık yerlerde (örneğin e-posta listelerinde) bu bilgileri "
+"yayınlamadan önce gizlilik dereceli bilgileri (parolalar, belki IP "
+"adresleri) silmeyi unutmayın"
+
+#: usr/local/www/status.php:248
+msgid "Passwords in config.xml have been automatically removed"
+msgstr "Config.xml'deki parolalar otomatik olarak silinecektir"
+
+#: usr/local/www/status_captiveportal.php:53
+msgid "Status: Captive portal"
+msgstr "Durum: Hizmet portalı"
+
+#: usr/local/www/status_captiveportal.php:115
+#: usr/local/www/status_captiveportal_expire.php:72
+#: usr/local/www/status_captiveportal_test.php:72
+#: usr/local/www/status_captiveportal_voucher_rolls.php:77
+#: usr/local/www/status_captiveportal_vouchers.php:110
+msgid "Active Users"
+msgstr "Etkin Kullanıcılar"
+
+#: usr/local/www/status_captiveportal.php:116
+#: usr/local/www/status_captiveportal_expire.php:73
+#: usr/local/www/status_captiveportal_test.php:73
+#: usr/local/www/status_captiveportal_voucher_rolls.php:78
+#: usr/local/www/status_captiveportal_vouchers.php:111
+msgid "Active Vouchers"
+msgstr "Etkin Biletler"
+
+#: usr/local/www/status_captiveportal.php:118
+#: usr/local/www/status_captiveportal_expire.php:75
+#: usr/local/www/status_captiveportal_test.php:59
+#: usr/local/www/status_captiveportal_test.php:75
+#: usr/local/www/status_captiveportal_voucher_rolls.php:80
+#: usr/local/www/status_captiveportal_vouchers.php:113
+msgid "Test Vouchers"
+msgstr "Test Biletleri"
+
+#: usr/local/www/status_captiveportal.php:119
+#: usr/local/www/status_captiveportal_expire.php:60
+#: usr/local/www/status_captiveportal_expire.php:76
+#: usr/local/www/status_captiveportal_test.php:76
+#: usr/local/www/status_captiveportal_voucher_rolls.php:81
+#: usr/local/www/status_captiveportal_vouchers.php:114
+msgid "Expire Vouchers"
+msgstr "Süresi dolan Biletler"
+
+#: usr/local/www/status_captiveportal.php:130
+msgid "Captive Portal Zone"
+msgstr "Hizmet Portalı Alanı"
+
+#: usr/local/www/status_captiveportal.php:154
+msgid "Captive Portal status"
+msgstr ""
+
+#: usr/local/www/status_captiveportal.php:161
+#: usr/local/www/status_captiveportal.php:164
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:111
+msgid "Session start"
+msgstr "Oturum başlangıcı"
+
+#: usr/local/www/status_captiveportal.php:162
+#: usr/local/www/widgets/widgets/captive_portal_status.widget.php:112
+msgid "Last activity"
+msgstr "Son etkinlik"
+
+#: usr/local/www/status_captiveportal.php:190
+msgid "Do you really want to disconnect this client?"
+msgstr "Bu istemcinin oturumu kapatmak istediğinize emin misiniz?"
+
+#: usr/local/www/status_captiveportal.php:190
+#: usr/local/www/status_interfaces.php:132
+#: usr/local/www/status_interfaces.php:145
+#: usr/local/www/status_interfaces.php:158
+#: usr/local/www/status_interfaces.php:172
+msgid "Disconnect"
+msgstr "Bağlantıyı Kes"
+
+#: usr/local/www/status_captiveportal.php:207
+msgid "Don't show last activity"
+msgstr "Son etkinlikleri görüntüleme"
+
+#: usr/local/www/status_captiveportal.php:210
+msgid "Show last activity"
+msgstr "Son etkinlikleri göster"
+
+#: usr/local/www/status_captiveportal_expire.php:85
+#: usr/local/www/status_captiveportal_test.php:85
+msgid "Voucher(s)"
+msgstr "Bilet(ler)"
+
+#: usr/local/www/status_captiveportal_expire.php:89
+msgid ""
+"Enter multiple vouchers separated by space or newline. All valid vouchers "
+"will be marked as expired"
+msgstr ""
+"Birden fazla biletleri boşluk yada yeni satır ile girin. Tüm geçerli "
+"biletler süresi dolmuş olarak işaretlenecek"
+
+#: usr/local/www/status_captiveportal_test.php:89
+msgid ""
+"Enter multiple vouchers separated by space or newline. The remaining time, "
+"if valid, will be shown for each voucher"
+msgstr ""
+"Boşluklarla veya yeni satırlarla birbirinden ayrılmış birden fazla bilet "
+"girin. Her biletin (varsa) kalan süresi gösterilecektir"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:90
+msgid "Roll#"
+msgstr "Grup No#"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:92
+msgid "# of Tickets"
+msgstr "# Bilet Sayısı"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:94
+msgid "used"
+msgstr "kullanılan"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:95
+msgid "active"
+msgstr "aktif"
+
+#: usr/local/www/status_captiveportal_voucher_rolls.php:96
+msgid "ready"
+msgstr "hazır"
+
+#: usr/local/www/status_captiveportal_vouchers.php:123
+msgid "Voucher"
+msgstr "Bilet"
+
+#: usr/local/www/status_captiveportal_vouchers.php:125
+msgid "Activated at"
+msgstr "Etkinleştirilme"
+
+#: usr/local/www/status_captiveportal_vouchers.php:126
+msgid "Expires in"
+msgstr "Zaman dolumu"
+
+#: usr/local/www/status_captiveportal_vouchers.php:127
+msgid "Expires at"
+msgstr "Zaman dolumu"
+
+#: usr/local/www/status_captiveportal_vouchers.php:135
+msgid "min"
+msgstr "dk"
+
+#: usr/local/www/status_dhcp_leases.php:50
+msgid "DHCP leases"
+msgstr "DHCP kiraları"
+
+#: usr/local/www/status_dhcp_leases.php:300
+#: usr/local/www/status_dhcpv6_leases.php:385
+msgid "Failover Group"
+msgstr "Yük Aktarma Grubu"
+
+#: usr/local/www/status_dhcp_leases.php:301
+#: usr/local/www/status_dhcpv6_leases.php:386
+msgid "My State"
+msgstr "Durumum"
+
+#: usr/local/www/status_dhcp_leases.php:302
+#: usr/local/www/status_dhcp_leases.php:304
+#: usr/local/www/status_dhcpv6_leases.php:387
+#: usr/local/www/status_dhcpv6_leases.php:389
+msgid "Since"
+msgstr "Başlangıcı"
+
+#: usr/local/www/status_dhcp_leases.php:303
+#: usr/local/www/status_dhcpv6_leases.php:388
+msgid "Peer State"
+msgstr "Eş Durumu"
+
+#: usr/local/www/status_dhcp_leases.php:335
+#: usr/local/www/status_dhcpv6_leases.php:421
+#: usr/local/www/status_dhcpv6_leases.php:506
+msgid "End"
+msgstr "Bitiş"
+
+#: usr/local/www/status_dhcp_leases.php:336
+#: usr/local/www/status_dhcpv6_leases.php:422
+#: usr/local/www/status_gateway_groups.php:134
+#: usr/local/www/status_gateways.php:132 usr/local/www/status_gateways.php:136
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:60
+msgid "Online"
+msgstr "Çevrim İçi"
+
+#: usr/local/www/status_dhcp_leases.php:337
+#: usr/local/www/status_dhcpv6_leases.php:423
+msgid "Lease Type"
+msgstr "Kira Türü"
+
+#: usr/local/www/status_dhcp_leases.php:386
+msgid "send Wake on LAN packet to this MAC address"
+msgstr "bu MAC adresine ağdan açma paketi gönder"
+
+#: usr/local/www/status_dhcp_leases.php:408
+#: usr/local/www/status_dhcpv6_leases.php:482
+msgid "add a static mapping for this MAC address"
+msgstr "bu MAC adresi için statik eşleşme ekle"
+
+#: usr/local/www/status_dhcp_leases.php:411
+msgid "edit the static mapping for this entry"
+msgstr ""
+
+#: usr/local/www/status_dhcp_leases.php:415
+msgid "add a Wake on LAN mapping for this MAC address"
+msgstr "bu MAC adresi için ağdan açma eşlemesi ekle"
+
+#: usr/local/www/status_dhcp_leases.php:420
+#: usr/local/www/status_dhcpv6_leases.php:491
+msgid "delete this DHCP lease"
+msgstr "bu DHCP kirasını sil"
+
+#: usr/local/www/status_dhcp_leases.php:433
+#: usr/local/www/status_dhcpv6_leases.php:562
+msgid "Show active and static leases only"
+msgstr "Sadece etkin ve statik kira girişlerini görüntüle"
+
+#: usr/local/www/status_dhcp_leases.php:436
+#: usr/local/www/status_dhcpv6_leases.php:565
+msgid "Show all configured leases"
+msgstr "Yapılandırılmış tüm kiraları görüntüle"
+
+#: usr/local/www/status_dhcp_leases.php:440
+#: usr/local/www/status_dhcpv6_leases.php:569
+msgid "No leases file found. Is the DHCP server active"
+msgstr "Kira dosyası bulunamadı. DHCP sunucunun aktif olduğundan emin olun"
+
+# 92%
+#: usr/local/www/status_dhcpv6_leases.php:51
+msgid "DHCPv6 leases"
+msgstr "DHCPv6 kiraları"
+
+#: usr/local/www/status_dhcpv6_leases.php:417
+#: usr/local/www/status_dhcpv6_leases.php:503
+msgid "IAID"
+msgstr "IAID"
+
+#: usr/local/www/status_dhcpv6_leases.php:419
+msgid "Hostname/MAC"
+msgstr "Host adı/MAC"
+
+# 78%
+#: usr/local/www/status_dhcpv6_leases.php:502
+msgid "IPv6 Prefix"
+msgstr "IPv6 Ön-ek"
+
+#: usr/local/www/status_filter_reload.php:45
+msgid "Filter Reload Status"
+msgstr "Filtre Yeniden Yükleme Durumu"
+
+#: usr/local/www/status_filter_reload.php:90
+msgid ""
+"This page will automatically refresh every 3 seconds until the filter is "
+"done reloading"
+msgstr ""
+"Bu sayfa filtre yeniden yükleme tamamlanana kadar her 3 saniyede bir "
+"güncellenecektir"
+
+#: usr/local/www/status_gateway_groups.php:102
+#, php-format
+msgid "Tier %s"
+msgstr "Katman %s"
+
+#: usr/local/www/status_gateway_groups.php:128
+#: usr/local/www/status_gateways.php:126
+msgid "Warning, Packetloss"
+msgstr "Uyarı, Paket Kaybı"
+
+#: usr/local/www/status_gateway_groups.php:131
+#: usr/local/www/status_gateways.php:129
+msgid "Warning, Latency"
+msgstr "Uyarı, Gecikme"
+
+#: usr/local/www/status_gateway_groups.php:137
+msgid "Gathering data"
+msgstr "Veri toplanıyor"
+
+#: usr/local/www/status_gateways.php:77
+msgid "RTT"
+msgstr "RTT"
+
+#: usr/local/www/status_gateways.php:78
+msgid "Loss"
+msgstr "Kayıp"
+
+#: usr/local/www/status_gateways.php:102 usr/local/www/status_gateways.php:110
+#: usr/local/www/status_gateways.php:139
+#: usr/local/www/widgets/widgets/gateways.widget.php:88
+#: usr/local/www/widgets/widgets/gateways.widget.php:97
+msgid "Pending"
+msgstr "Beklemede"
+
+#: usr/local/www/status_gateways.php:120
+msgid "Offline (forced)"
+msgstr ""
+
+#: usr/local/www/status_gateways.php:145
+msgid "Last check:"
+msgstr "Son kontrol:"
+
+#: usr/local/www/status_graph.php:250
+msgid "Host IP"
+msgstr "Host IP"
+
+# 86%
+#: usr/local/www/status_graph.php:250
+msgid "Host Name or IP"
+msgstr "Host Adı ya da IP"
+
+#: usr/local/www/status_graph.php:251
+msgid "Bandwidth In"
+msgstr "Bant Genişliği (içeri)"
+
+#: usr/local/www/status_graph.php:252
+msgid "Bandwidth Out"
+msgstr "Bant Genişliği (dışarı)"
+
+# boş bırakınız kelime içinde gerekli değil.
+#: usr/local/www/status_graph.php:338
+msgid "the"
+msgstr " "
+
+#: usr/local/www/status_graph.php:338
+msgid "Adobe SVG Viewer"
+msgstr "Adobe SVG Görüntüleyici"
+
+#: usr/local/www/status_graph.php:338
+msgid ""
+"Firefox 1.5 or later or other browser supporting SVG is required to view the "
+"graph"
+msgstr ""
+"Grafiği görüntülemek için Firefox 1.5 üstü ve SVG destekli tarayıcılar "
+"gerekmektedir"
+
+#: usr/local/www/status_graph_cpu.php:42
+msgid "CPU load"
+msgstr "CPU yükü"
+
+#: usr/local/www/status_graph_cpu.php:47
+msgid "Status: CPU Graph"
+msgstr "Durum: CPU Grafiği"
+
+#: usr/local/www/status_graph_cpu.php:54
+msgid "if you can't see the graph, you may have to install the"
+msgstr "grafiği göremiyorsanız, kurmanız gerekebilir "
+
+#: usr/local/www/status_graph_cpu.php:54
+msgid "Adobe SVG viewer"
+msgstr "Adobe SVG Görüntüleyici"
+
+#: usr/local/www/status_interfaces.php:84
+msgid "interface"
+msgstr "arabirim"
+
+# Interface kısmında hattı bıraktırmak için söylenen yer çeviri ye müdahele etmeyin.
+#: usr/local/www/status_interfaces.php:103
+#: usr/local/www/status_interfaces.php:119
+msgid "Release"
+msgstr "Bırak"
+
+#: usr/local/www/status_interfaces.php:103
+#: usr/local/www/status_interfaces.php:119
+msgid "Renew"
+msgstr "Yenile"
+
+#: usr/local/www/status_interfaces.php:132
+#: usr/local/www/status_interfaces.php:145
+#: usr/local/www/status_interfaces.php:158
+#: usr/local/www/status_interfaces.php:175
+msgid "Connect"
+msgstr "Bağlan"
+
+#: usr/local/www/status_interfaces.php:183
+msgid "Uptime "
+msgstr "Çalışma Zamanı "
+
+#: usr/local/www/status_interfaces.php:190
+msgid "Cell Signal (RSSI)"
+msgstr "Cep Sinyali (RSSI)"
+
+#: usr/local/www/status_interfaces.php:197
+msgid "Cell Mode"
+msgstr "Cep Kipi"
+
+#: usr/local/www/status_interfaces.php:204
+msgid "Cell SIM State"
+msgstr "Cep SIM Durumu"
+
+#: usr/local/www/status_interfaces.php:211
+msgid "Cell Service"
+msgstr "Cep Servisi"
+
+#: usr/local/www/status_interfaces.php:218
+msgid "Cell Upstream"
+msgstr "Cep Gönderme"
+
+#: usr/local/www/status_interfaces.php:225
+msgid "Cell Downstream"
+msgstr "Cep İndirme"
+
+#: usr/local/www/status_interfaces.php:232
+msgid "Cell Current Up"
+msgstr "Cep Şimdiki Gönderilen"
+
+#: usr/local/www/status_interfaces.php:239
+msgid "Cell Current Down"
+msgstr "Cep Şimdiki İndirilen"
+
+#: usr/local/www/status_interfaces.php:268
+msgid "Subnet mask IPv4"
+msgstr "Altağ maskesi IPv4"
+
+#: usr/local/www/status_interfaces.php:275
+msgid "Gateway IPv4"
+msgstr "Ağ geçidi IPv4"
+
+#: usr/local/www/status_interfaces.php:283
+msgid "IPv6 Link Local"
+msgstr "IPv6 Yerel Bağlantı"
+
+#: usr/local/www/status_interfaces.php:299
+msgid "Subnet mask IPv6"
+msgstr "Altağ maskesi IPv6"
+
+#: usr/local/www/status_interfaces.php:306
+msgid "Gateway IPv6"
+msgstr "Ağ Geçidi IPv6"
+
+#: usr/local/www/status_interfaces.php:314
+msgid "ISP DNS servers"
+msgstr "ISP DNS sunucular"
+
+#: usr/local/www/status_interfaces.php:333
+msgid "Media"
+msgstr "Ortam"
+
+#: usr/local/www/status_interfaces.php:340
+msgid "LAGG Protocol"
+msgstr "LAGG Protokol"
+
+#: usr/local/www/status_interfaces.php:347
+msgid "LAGG Ports"
+msgstr "LAGG Portları"
+
+#: usr/local/www/status_interfaces.php:370
+msgid "BSSID"
+msgstr "BSSID"
+
+#: usr/local/www/status_interfaces.php:384
+msgid "RSSI"
+msgstr "RSSI"
+
+#: usr/local/www/status_interfaces.php:391
+msgid "In/out packets"
+msgstr "gelen/giden paketler"
+
+#: usr/local/www/status_interfaces.php:400
+msgid "In/out packets (pass)"
+msgstr "gelen/giden paketler (izin ver)"
+
+#: usr/local/www/status_interfaces.php:409
+msgid "In/out packets (block)"
+msgstr "gelen/giden paketler (engelle)"
+
+#: usr/local/www/status_interfaces.php:419
+msgid "In/out errors"
+msgstr "girdi/çıktı hataları"
+
+#: usr/local/www/status_interfaces.php:427
+msgid "Collisions"
+msgstr "Çarpışmalar"
+
+#: usr/local/www/status_interfaces.php:436
+#, php-format
+msgid "Bridge (%s)"
+msgstr "Köprü (%s)"
+
+#: usr/local/www/status_interfaces.php:458
+msgid "Interrupts/Second"
+msgstr "Kesme/Saniye"
+
+#: usr/local/www/status_interfaces.php:461
+msgid "total"
+msgstr "toplam"
+
+#: usr/local/www/status_interfaces.php:463
+msgid "rate"
+msgstr "hız"
+
+#: usr/local/www/status_interfaces.php:474
+#, php-format
+msgid ""
+"Using dial-on-demand will bring the connection up again if any packet "
+"triggers it. To substantiate this point: disconnecting manually will %snot%s "
+"prevent dial-on-demand from making connections to the outside! Don't use "
+"dial-on-demand if you want to make sure that the line is kept disconnected."
+msgstr ""
+"Gerektiğinde arama özelliği eğer herhangi bir paket tarafından tetiklenirse "
+"bağlantıyı tekrar kurar. Diğer bir deyişle, bağlantıyı kesmek bağlantının "
+"tekrar kurulmayacağı anlamına %sgelmez%s . Bağlantıyı kestiğinizde tekrar "
+"bağlanmamasını istiyorsanız gerektiğinde arama özelliğini kullanmayın."
+
+#: usr/local/www/status_ntpd.php:180
+msgid "Ref ID"
+msgstr "Referans Kimliği"
+
+#: usr/local/www/status_ntpd.php:181
+msgid "Stratum"
+msgstr "Katman"
+
+#: usr/local/www/status_ntpd.php:183
+msgid "When"
+msgstr "Ne zaman"
+
+#: usr/local/www/status_ntpd.php:184
+msgid "Poll"
+msgstr "Havuz"
+
+#: usr/local/www/status_ntpd.php:185
+msgid "Reach"
+msgstr "Erişim"
+
+#: usr/local/www/status_ntpd.php:187
+msgid "Offset"
+msgstr "Dengeli"
+
+#: usr/local/www/status_ntpd.php:188
+msgid "Jitter"
+msgstr "Toplam Gecikme (Jitter)"
+
+#: usr/local/www/status_ntpd.php:245
+msgid "Clock Latitude"
+msgstr "Saat Enlemi"
+
+#: usr/local/www/status_ntpd.php:246
+msgid "Clock Longitude"
+msgstr "Saat Boylamı"
+
+#: usr/local/www/status_ntpd.php:247
+msgid "Clock Altitude"
+msgstr ""
+
+#: usr/local/www/status_ntpd.php:248
+msgid "Satellites"
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:150
+msgid "Client connections"
+msgstr "İstemci bağlantıları"
+
+#: usr/local/www/status_openvpn.php:157 usr/local/www/status_openvpn.php:227
+#: usr/local/www/system_camanager.php:562
+#: usr/local/www/system_certmanager.php:786
+#: usr/local/www/system_certmanager.php:959
+#: usr/local/www/vpn_openvpn_csc.php:747
+msgid "Common Name"
+msgstr "Genel Ad"
+
+#: usr/local/www/status_openvpn.php:158 usr/local/www/status_openvpn.php:228
+msgid "Real Address"
+msgstr "Gerçek Adres"
+
+#: usr/local/www/status_openvpn.php:159
+msgid "Virtual Address"
+msgstr "Sanal Adres"
+
+#: usr/local/www/status_openvpn.php:160 usr/local/www/status_openvpn.php:278
+#: usr/local/www/status_openvpn.php:341
+msgid "Connected Since"
+msgstr "Bağlantı Süresi"
+
+#: usr/local/www/status_openvpn.php:161 usr/local/www/status_openvpn.php:281
+#: usr/local/www/status_openvpn.php:344
+msgid "Bytes Sent"
+msgstr "Gönderilen Bayt"
+
+#: usr/local/www/status_openvpn.php:162
+msgid "Bytes Received"
+msgstr "Alınan Bayt"
+
+#: usr/local/www/status_openvpn.php:189
+msgid "Kill client connection from"
+msgstr "İstemci bağlantısını kes"
+
+#: usr/local/www/status_openvpn.php:214
+msgid "Show Routing Table"
+msgstr "Yönlendirme Tablosunu Göster"
+
+#: usr/local/www/status_openvpn.php:214
+msgid "Display OpenVPN's internal routing table for this server."
+msgstr "Bu sunucuda OpenVPN'(ler) in dahili yönlendirme tablolarını görüntüle."
+
+#: usr/local/www/status_openvpn.php:220
+msgid "Routing Table"
+msgstr "Yönlendirme Tablosu"
+
+#: usr/local/www/status_openvpn.php:229
+msgid "Target Network"
+msgstr "Hedef Ağ"
+
+#: usr/local/www/status_openvpn.php:230
+msgid "Last Used"
+msgstr "Son Kullanım"
+
+#: usr/local/www/status_openvpn.php:252
+msgid ""
+"An IP address followed by C indicates a host currently connected through the "
+"VPN."
+msgstr ""
+"IP adresinden sonra C host'un geçerli bağlantısının VPN üzerinden olduğunu "
+"gösterir."
+
+#: usr/local/www/status_openvpn.php:269
+msgid "Peer to Peer Server Instance Statistics"
+msgstr "Eşler Arası Sunucu İstatistikleri"
+
+#: usr/local/www/status_openvpn.php:279 usr/local/www/status_openvpn.php:342
+msgid "Virtual Addr"
+msgstr "Sanal Adres"
+
+#: usr/local/www/status_openvpn.php:280 usr/local/www/status_openvpn.php:343
+msgid "Remote Host"
+msgstr "Uzak Host"
+
+#: usr/local/www/status_openvpn.php:282 usr/local/www/status_openvpn.php:345
+msgid "Bytes Rcvd"
+msgstr "Alınan Bayt"
+
+#: usr/local/www/status_openvpn.php:332
+msgid "Client Instance Statistics"
+msgstr "OpenVPN İstemci İstatistikleri"
+
+#: usr/local/www/status_openvpn.php:392
+msgid ""
+"If you have custom options that override the management features of OpenVPN "
+"on a client or server, they will cause that OpenVPN instance to not work "
+"correctly with this status page."
+msgstr ""
+
+#: usr/local/www/status_openvpn.php:396
+msgid "No OpenVPN instances defined"
+msgstr ""
+
+#: usr/local/www/status_queues.php:124
+msgid "Traffic shaper"
+msgstr "Trafik şekillendirici"
+
+#: usr/local/www/status_queues.php:132
+msgid "Traffic shaping is not configured."
+msgstr "Trafik şekillendirme yapılandırılmadı."
+
+#: usr/local/www/status_queues.php:168
+msgid "Statistics"
+msgstr "İstatistikler"
+
+#: usr/local/www/status_queues.php:176
+msgid "Borrows"
+msgstr "Borrow(lar)"
+
+#: usr/local/www/status_queues.php:177
+msgid "Suspends"
+msgstr "Bekletilenler"
+
+#: usr/local/www/status_queues.php:178
+msgid "Drops"
+msgstr "Düşenler"
+
+#: usr/local/www/status_queues.php:179
+msgid "Length"
+msgstr "Uzunlık"
+
+#: usr/local/www/status_queues.php:188
+msgid "Queue graphs take 5 seconds to sample data"
+msgstr "Kuyruk grafiklerinin veri örneklemesi 5 saniye kadar sürer"
+
+#: usr/local/www/status_queues.php:189
+msgid "You can configure the Traffic Shaper"
+msgstr "Trafik şekillendiriciyi yapılandır"
+
+#: usr/local/www/status_queues.php:250
+msgid "Loading"
+msgstr "Yükleniyor"
+
+#: usr/local/www/status_rrd_graph.php:160
+msgid "Invalid start date/time:"
+msgstr "Geçersiz başlat tarih/saat:"
+
+#: usr/local/www/status_rrd_graph.php:173
+msgid "Invalid end date/time:"
+msgstr "Geçersiz bitiş tarih/saat:"
+
+#: usr/local/www/status_rrd_graph.php:188
+#: usr/local/www/status_rrd_graph_settings.php:65
+msgid "Inverse"
+msgstr "Ters"
+
+#: usr/local/www/status_rrd_graph.php:189
+#: usr/local/www/status_rrd_graph_settings.php:66
+msgid "Absolute"
+msgstr "Mutlak"
+
+#: usr/local/www/status_rrd_graph.php:250
+#: usr/local/www/status_rrd_graph_settings.php:67
+msgid "Absolute Timespans"
+msgstr "Mutlak Müddet"
+
+#: usr/local/www/status_rrd_graph.php:250
+#: usr/local/www/status_rrd_graph_settings.php:68
+msgid "Current Period"
+msgstr "Güncel Aralık"
+
+#: usr/local/www/status_rrd_graph.php:250
+#: usr/local/www/status_rrd_graph_settings.php:69
+msgid "Previous Period"
+msgstr "Önceki Aralık"
+
+#: usr/local/www/status_rrd_graph.php:418
+#: usr/local/www/status_rrd_graph_settings.php:55
+#: usr/local/www/status_rrd_graph_settings.php:137
+msgid "Traffic"
+msgstr "Trafik"
+
+#: usr/local/www/status_rrd_graph.php:420
+#: usr/local/www/status_rrd_graph_settings.php:56
+#: usr/local/www/status_rrd_graph_settings.php:139
+msgid "Packets"
+msgstr "Paketler"
+
+#: usr/local/www/status_rrd_graph.php:422
+#: usr/local/www/status_rrd_graph_settings.php:57
+#: usr/local/www/status_rrd_graph_settings.php:141
+msgid "Quality"
+msgstr "Kalite"
+
+#: usr/local/www/status_rrd_graph.php:427
+#: usr/local/www/status_rrd_graph_settings.php:146
+msgid "QueueDrops"
+msgstr "Kuyruktan Düşme"
+
+#: usr/local/www/status_rrd_graph.php:435
+#: usr/local/www/status_rrd_graph_settings.php:154
+msgid "Cellular"
+msgstr "Hücresel"
+
+#: usr/local/www/status_rrd_graph.php:469
+msgid ""
+"Note: Change of color and/or style may not take effect until the next refresh"
+msgstr ""
+"Not: Renk yada stil değişimi bir sonraki yenilemeye kadar etkin olmayabilir"
+
+#: usr/local/www/status_rrd_graph.php:473
+msgid "Graphs:"
+msgstr "Grafikler:"
+
+#: usr/local/www/status_rrd_graph.php:536
+msgid "Style:"
+msgstr "Stil:"
+
+#: usr/local/www/status_rrd_graph.php:550
+msgid "Period:"
+msgstr "Aralık:"
+
+#: usr/local/www/status_rrd_graph.php:566
+msgid "Enter date and/or time. Current timezone:"
+msgstr "Şimdiki zamandilimi nin tarih ve/veya saatini giriniz:"
+
+#: usr/local/www/status_rrd_graph.php:570
+msgid "Start:"
+msgstr "Başlangıç:"
+
+#: usr/local/www/status_rrd_graph.php:572
+msgid "End:"
+msgstr "Bitiş:"
+
+#: usr/local/www/status_rrd_graph.php:574
+msgid "Go"
+msgstr "Oluştur"
+
+#: usr/local/www/status_rrd_graph_img.php:44
+msgid "Image viewer"
+msgstr "Resim görüntüleyici"
+
+#: usr/local/www/status_rrd_graph_img.php:268
+#, php-format
+msgid "rrdcolors.inc.php for theme %s does not exist, using defaults!"
+msgstr ""
+"%s temasının rrdcolors.inc.php dosyası olmadığından öntanımlı değerler "
+"kullanılıyor!"
+
+#: usr/local/www/status_rrd_graph_img.php:1228
+#, php-format
+msgid "Sorry we do not have data to graph for %s"
+msgstr "%s için grafik oluşturmaya yetecek kadar veri yok"
+
+#: usr/local/www/status_rrd_graph_img.php:1248
+#, php-format
+msgid "Failed to create graph with error code %1$s, the error is: %2$s"
+msgstr "Grafik oluşturulamadı. Hata kodu: %1$s. Hata mesajı: %2$s"
+
+#: usr/local/www/status_rrd_graph_img.php:1250
+#: usr/local/www/status_rrd_graph_img.php:1257
+#, php-format
+msgid "failed to create graph from %s%s, removing database"
+msgstr "%s%s grafiği oluşturulamadı, veritabanı kaldırılıyor"
+
+#: usr/local/www/status_rrd_graph_settings.php:185
+msgid "Enables the RRD graphing backend."
+msgstr "RRD grafiği çıkarma servisini etkinleştirir."
+
+#: usr/local/www/status_rrd_graph_settings.php:189
+msgid "Default category"
+msgstr "Varsayılan kategori"
+
+#: usr/local/www/status_rrd_graph_settings.php:200
+msgid "This selects default category."
+msgstr "Varsayılan kategoriyi seçer."
+
+#: usr/local/www/status_rrd_graph_settings.php:204
+msgid "Default style"
+msgstr "Varsayılan stil"
+
+#: usr/local/www/status_rrd_graph_settings.php:215
+msgid "This selects the default style."
+msgstr "Varsayılan stili seçer."
+
+#: usr/local/www/status_rrd_graph_settings.php:219
+msgid "Default period"
+msgstr "Varsayılan zaman aralığı"
+
+#: usr/local/www/status_rrd_graph_settings.php:230
+msgid "This selects the default period."
+msgstr "Varsayılan zaman aralığını seçer."
+
+#: usr/local/www/status_rrd_graph_settings.php:242
+msgid "Reset RRD Data"
+msgstr "RRD verisini sıfırla"
+
+#: usr/local/www/status_rrd_graph_settings.php:242
+msgid ""
+"Do you really want to reset the RRD graphs? This will erase all graph data."
+msgstr ""
+"RRD grafiklerini silmek istediğinize emin misiniz? Tüm grafik verisi silinir."
+
+#: usr/local/www/status_rrd_graph_settings.php:248
+msgid ""
+"Graphs will not be allowed to be recreated within a 1 minute interval, "
+"please take this into account after changing the style."
+msgstr ""
+"Bir dakikalık aralıklarla grafik yeniden oluşturulamaz, stili seçtikten "
+"sonra bir dakika boyunca tekrar değiştiremeyeceğinizi unutmayınız."
+
+#: usr/local/www/status_services.php:120
+#: usr/local/www/widgets/widgets/services_status.widget.php:90
+msgid "No services found"
+msgstr "Herhangi bir servis bulunamadı"
+
+#: usr/local/www/status_upnp.php:49
+msgid "Rules have been cleared and the daemon restarted"
+msgstr "Kurallar temizlendi ve servis tekrar başlatıldı"
+
+#: usr/local/www/status_upnp.php:59
+msgid "UPnP &amp; NAT-PMP Status"
+msgstr "UPnP &amp; NAT-PMP Durumu"
+
+#: usr/local/www/status_upnp.php:69
+msgid "UPnP is currently disabled."
+msgstr "UPnP devre dışı."
+
+#: usr/local/www/status_upnp.php:79
+msgid "all currently connected sessions"
+msgstr "şu anda bağlı olan tüm oturumlar"
+
+#: usr/local/www/status_upnp.php:90
+msgid "Int. Port"
+msgstr ""
+
+#: usr/local/www/status_wireless.php:85
+msgid ""
+"Rescan has been initiated in the background. Refresh this page in 10 seconds "
+"to see the results."
+msgstr ""
+"Tekrar tarama işlemi arkaplanda başlatılmıştır. Sonuçları görmek için bu "
+"sayfayı 10 sn içinde yenileyiniz."
+
+#: usr/local/www/status_wireless.php:95
+msgid "Nearby access points or ad-hoc peers"
+msgstr "Yakın erişim noktaları ve uçtan uca eşleri"
+
+#: usr/local/www/status_wireless.php:142
+msgid "Associated or ad-hoc peers"
+msgstr "İlişkilendirilmiş (ad-hoc) eşleri"
+
+#: usr/local/www/system.php:122
+msgid "The domain may only contain the characters a-z, 0-9, '-' and '.'."
+msgstr ""
+"Alan adı sadece İngilizcede a-z, 0-9, '-' ve '.' karakterlerini içerebilir."
+
+#: usr/local/www/system.php:158
+#, php-format
+msgid ""
+"You can not assign a gateway to DNS '%s' server which is on a directly "
+"connected network."
+msgstr "Doğrudan bağlı bir ağ da %s DNS sunucusu için ağ geçidi atayamazsınız."
+
+#: usr/local/www/system.php:167
+msgid ""
+"The time update interval must be either 0 (disabled) or between 6 and 1440."
+msgstr ""
+"Zaman güncelleme aralığı 0 (devre dışı) ya da 6 ile 1140 arasında bir "
+"tamsayı olmalıdır."
+
+#: usr/local/www/system.php:174
+msgid ""
+"A NTP Time Server name may only contain the characters a-z, 0-9, '-' and '.'."
+msgstr ""
+"NTP Zaman sunucusu İngilizce a-z,0-9, '-' ve '.' karakterleri içerebilir."
+
+#: usr/local/www/system.php:316
+msgid "Name of the firewall host, without domain part"
+msgstr "Güvenlik duvarı sistemin adı, alan adı olmadan"
+
+#: usr/local/www/system.php:327
+msgid ""
+"Do not use 'local' as a domain name. It will cause local hosts running mDNS "
+"(avahi, bonjour, etc.) to be unable to resolve local hosts not running mDNS."
+msgstr ""
+"Alan adı olarak 'local' kullanmayın. mDNS çalıştıran yerel sunucuların "
+"(avahi, bonjour vb.) mDNS çalıştırmayan yerel sunucuları bulmasını engeller."
+
+#: usr/local/www/system.php:329
+msgid "mycorp.com, home, office, private, etc."
+msgstr "firmam.com, ev, ofis, ozel vb."
+
+#: usr/local/www/system.php:339
+msgid "DNS Server"
+msgstr "DNS Sunucu"
+
+#: usr/local/www/system.php:341
+msgid "Use gateway"
+msgstr "Ağ geçidi kullan"
+
+#: usr/local/www/system.php:388
+msgid ""
+"Enter IP addresses to be used by the system for DNS resolution. These are "
+"also used for the DHCP service, DNS forwarder and for PPTP VPN clients."
+msgstr ""
+
+#: usr/local/www/system.php:393
+msgid ""
+"In addition, optionally select the gateway for each DNS server. When using "
+"multiple WAN connections there should be at least one unique DNS server per "
+"gateway."
+msgstr ""
+"Ek olarak her DNS sunucunun ağ geçidini seçin. Birden fazla WAN bağlantısı "
+"kullanırken her ağ geçidi için en az bir benzersiz DNS sunucu "
+"tanımlamalısınız."
+
+#: usr/local/www/system.php:400
+msgid "Allow DNS server list to be overridden by DHCP/PPP on WAN"
+msgstr ""
+"WAN üzerinde DHCP/PPP tarafından DNS sunucu listesinin üzerine yazılmasına "
+"izin ver"
+
+#: usr/local/www/system.php:403
+#, php-format
+msgid ""
+"If this option is set, %s will use DNS servers assigned by a DHCP/PPP server "
+"on WAN for its own purposes (including the DNS forwarder). However, they "
+"will not be assigned to DHCP and PPTP VPN clients."
+msgstr ""
+"Bu seçenek açıldığında %s kendi işleri için WAN üzerinde DHCP/PPP sunucu "
+"tarafından atanan DNS sunucularını kullanır. Ancak, DHCP ve PPTP VPN "
+"istemcilerine atanmazlar."
+
+#: usr/local/www/system.php:412
+msgid "Do not use the DNS Forwarder as a DNS server for the firewall"
+msgstr "DNS yönlendiriciyi güvenlik duvarı için DNS sunucu olarak kullanma"
+
+#: usr/local/www/system.php:415
+msgid ""
+"By default localhost (127.0.0.1) will be used as the first DNS server where "
+"the DNS Forwarder or DNS Resolver is enabled and set to listen on Localhost, "
+"so system can use the local DNS service to perform lookups. Checking this "
+"box omits localhost from the list of DNS servers."
+msgstr ""
+
+#: usr/local/www/system.php:421
+msgid "Time zone"
+msgstr "Zaman dilimi"
+
+#: usr/local/www/system.php:433
+msgid "Select the location closest to you"
+msgstr "Size en yakın konumu seçiniz"
+
+#: usr/local/www/system.php:451
+msgid "NTP time server"
+msgstr "NTP zaman sunucusu"
+
+#: usr/local/www/system.php:456
+msgid ""
+"Use a space to separate multiple hosts (only one required). Remember to set "
+"up at least one DNS server if you enter a host name here!"
+msgstr ""
+"Bir tane yeterlidir ama birden fazla girecekseniz aralarına bir boşluk "
+"bırakın. Eğer burada bir adres girerseniz en az bir DNS sunucu girmeyi "
+"unutmamalısınız!"
+
+#: usr/local/www/system.php:463
+msgid "Language"
+msgstr "Dil"
+
+#: usr/local/www/system.php:476
+msgid "Choose a language for the webConfigurator"
+msgstr "webArayüzü için dil seçiniz"
+
+#: usr/local/www/system.php:485
+msgid "Theme"
+msgstr "Tema"
+
+#: usr/local/www/system.php:509
+msgid "This will change the look and feel of"
+msgstr "Görünümü değiştirerek hissedeceksiniz"
+
+#: usr/local/www/system_advanced_admin.php:90
+msgid "You must specify a valid webConfigurator port number"
+msgstr "webArayüzü için geçerli bir port numarası belirtmelisiniz"
+
+#: usr/local/www/system_advanced_admin.php:94
+msgid "Max Processes must be a number 1 or greater"
+msgstr "En Fazla Süreç Sayısı, en az 1 olmak üzere bir tamsayı olmalıdır"
+
+#: usr/local/www/system_advanced_admin.php:100
+#, php-format
+msgid "Alternate hostname %s is not a valid hostname."
+msgstr "Alternatif host adı %s geçerli bir host adı değil."
+
+#: usr/local/www/system_advanced_admin.php:247
+#, php-format
+msgid "One moment...redirecting to %s in 20 seconds."
+msgstr "Bekleyiniz... 20 saniye içinde %s sayfasına yönlendiriliyorsunuz."
+
+#: usr/local/www/system_advanced_admin.php:275
+msgid "Advanced: Admin Access"
+msgstr "Gelişmiş: Yönetici Erişimi"
+
+#: usr/local/www/system_advanced_admin.php:307
+#: usr/local/www/system_advanced_firewall.php:270
+#: usr/local/www/system_advanced_misc.php:287
+#: usr/local/www/system_advanced_network.php:188
+#: usr/local/www/system_advanced_notifications.php:184
+#: usr/local/www/system_advanced_sysctl.php:157
+msgid "Admin Access"
+msgstr "Yönetici Erişimi"
+
+#: usr/local/www/system_advanced_admin.php:308
+#: usr/local/www/system_advanced_firewall.php:271
+#: usr/local/www/system_advanced_misc.php:288
+#: usr/local/www/system_advanced_network.php:189
+#: usr/local/www/system_advanced_notifications.php:185
+#: usr/local/www/system_advanced_sysctl.php:158
+msgid "Firewall / NAT"
+msgstr "Güvenlik duvarı/NAT"
+
+#: usr/local/www/system_advanced_admin.php:309
+#: usr/local/www/system_advanced_firewall.php:272
+#: usr/local/www/system_advanced_misc.php:289
+#: usr/local/www/system_advanced_network.php:190
+#: usr/local/www/system_advanced_notifications.php:186
+#: usr/local/www/system_advanced_sysctl.php:159
+msgid "Networking"
+msgstr "Ağ"
+
+#: usr/local/www/system_advanced_admin.php:310
+#: usr/local/www/system_advanced_firewall.php:273
+#: usr/local/www/system_advanced_misc.php:290
+#: usr/local/www/system_advanced_network.php:191
+#: usr/local/www/system_advanced_notifications.php:187
+#: usr/local/www/system_advanced_sysctl.php:160
+msgid "Miscellaneous"
+msgstr "Diğer Ayarlar"
+
+#: usr/local/www/system_advanced_admin.php:311
+#: usr/local/www/system_advanced_firewall.php:274
+#: usr/local/www/system_advanced_misc.php:291
+#: usr/local/www/system_advanced_network.php:192
+#: usr/local/www/system_advanced_notifications.php:188
+#: usr/local/www/system_advanced_sysctl.php:161
+msgid "System Tunables"
+msgstr "Sistem İnce Ayarları"
+
+#: usr/local/www/system_advanced_admin.php:312
+#: usr/local/www/system_advanced_firewall.php:275
+#: usr/local/www/system_advanced_misc.php:292
+#: usr/local/www/system_advanced_network.php:193
+#: usr/local/www/system_advanced_notifications.php:189
+#: usr/local/www/system_advanced_sysctl.php:162
+msgid "Notifications"
+msgstr "Bildirimler"
+
+#: usr/local/www/system_advanced_admin.php:330
+msgid "webConfigurator"
+msgstr "webArayüzü"
+
+#: usr/local/www/system_advanced_admin.php:350
+msgid "No Certificates have been defined. You must"
+msgstr ""
+"Herhangi bir sertifika tanımlanmadı. SSL'i etkinleştirebilmek için bir "
+"sertifika"
+
+#: usr/local/www/system_advanced_admin.php:351
+msgid "Create or Import"
+msgstr "Oluştur yada İçeri Aktar"
+
+#: usr/local/www/system_advanced_admin.php:352
+msgid "a Certificate before SSL can be enabled."
+msgstr "SSL etkinleştirilmeden önceki sertifika."
+
+#: usr/local/www/system_advanced_admin.php:376
+msgid "TCP port"
+msgstr "TCP port"
+
+#: usr/local/www/system_advanced_admin.php:381
+msgid ""
+"Enter a custom port number for the webConfigurator above if you want to "
+"override the default (80 for HTTP, 443 for HTTPS). Changes will take effect "
+"immediately after save."
+msgstr ""
+"webArayüzünün çalışacağı portu değiştirmek istiyorsanız buraya yazın. "
+"Varsayılan portlar (HTTP 80, HTTPS 443'tür). Kaydettiğiniz anda "
+"değişiklikler etkinleştirilir."
+
+#: usr/local/www/system_advanced_admin.php:388
+msgid "Max Processes"
+msgstr "En Fazla İşlem Sayısı"
+
+#: usr/local/www/system_advanced_admin.php:393
+msgid ""
+"Enter the number of webConfigurator processes you want to run. This defaults "
+"to 2. Increasing this will allow more users/browsers to access the GUI "
+"concurrently."
+msgstr ""
+"Çalıştırmak istediğiniz webArayüzü sayısını girin. Öntanımlı değeri 2'dir. "
+"Bu sayıyı artırmak aynı anda daha fazla kullanıcının / tarayıcının web "
+"arayüzüne erişebilmesine olanak verir."
+
+#: usr/local/www/system_advanced_admin.php:400
+msgid "WebGUI redirect"
+msgstr "Web arayüzünü yeniden yönlendir"
+
+#: usr/local/www/system_advanced_admin.php:403
+msgid "Disable webConfigurator redirect rule"
+msgstr "webArayüzü yeniden yönlendirme kuralını kapat"
+
+#: usr/local/www/system_advanced_admin.php:405
+msgid ""
+"When this is unchecked, access to the webConfigurator is always permitted "
+"even on port 80, regardless of the listening port configured. Check this box "
+"to disable this automatically added redirect rule. "
+msgstr ""
+"Bu kutunun işareti kaldırıldığında başka bir porta yönlendirme olsa bile 80 "
+"portundan webArayüzüne erişime izin verilir. Otomatik olarak eklenen bu "
+"yeniden yönlendirme kuralını kapatmak için kutuyu işaretleyin. "
+
+#: usr/local/www/system_advanced_admin.php:412
+msgid "WebGUI Login Autocomplete"
+msgstr "Web arayüzü Oturum Açma Otomatik Tamamlama"
+
+#: usr/local/www/system_advanced_admin.php:415
+msgid "Enable webConfigurator login autocomplete"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:417
+msgid ""
+"When this is checked, login credentials for the webConfigurator may be saved "
+"by the browser. While convenient, some security standards require this to be "
+"disabled. Check this box to enable autocomplete on the login form so that "
+"browsers will prompt to save credentials (NOTE: Some browsers do not respect "
+"this option). "
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:424
+msgid "WebGUI login messages"
+msgstr "Web arayüzü oturum açma mesajları"
+
+#: usr/local/www/system_advanced_admin.php:427
+msgid "Disable logging of webConfigurator successful logins"
+msgstr "webArayüzüne başarıyla oturum açma işlemlerini günlüğe kaydetme"
+
+#: usr/local/www/system_advanced_admin.php:429
+msgid ""
+"When this is checked, successful logins to the webConfigurator will not be "
+"logged."
+msgstr ""
+"Bu seçenek işaretlendiğinde webArayüzüne oturum açma işlemleri günlüğe "
+"kaydedilmez."
+
+#: usr/local/www/system_advanced_admin.php:435
+msgid "Anti-lockout"
+msgstr "Anti-kilit"
+
+#: usr/local/www/system_advanced_admin.php:444
+msgid "Disable webConfigurator anti-lockout rule"
+msgstr "webArayüzü anti-kilit kuralını kapat"
+
+#: usr/local/www/system_advanced_admin.php:446
+#, php-format
+msgid ""
+"When this is unchecked, access to the webConfigurator on the %s interface is "
+"always permitted, regardless of the user-defined firewall rule set. Check "
+"this box to disable this automatically added rule, so access to the "
+"webConfigurator is controlled by the user-defined firewall rules (ensure you "
+"have a firewall rule in place that allows you in, or you will lock yourself "
+"out!)"
+msgstr ""
+"Bu kutunun işareti kaldırıldığında, güvenlik duvarının kullanıcı tarafından "
+"tanımlanmış kurallarına bakılmaksızın webArayüzüne %s arabiriminden erişime "
+"her zaman izin verilir. Otomatik olarak eklenen bu kuralı kaldırmak için bu "
+"kutuyu işaretleyin.webArayüzünden bu kutuyu işaretlerseniz (kendinizi "
+"kilitlememek için bir güvenlik duvarı kuralı eklemeniz gerektiğini "
+"unutmayın!)"
+
+#: usr/local/www/system_advanced_admin.php:452
+msgid ""
+"Hint: the &quot;Set interface(s) IP address&quot; option in the console menu "
+"resets this setting as well."
+msgstr ""
+"İpucu: Konsol menüsündeki &quot;Arabirim(ler)in IP adresini yapılandır&quot; "
+"seçeneği bu ayarı da sıfırlar."
+
+#: usr/local/www/system_advanced_admin.php:456
+msgid "DNS Rebind Check"
+msgstr "DNS Yeniden Bağlama Kontrolü"
+
+#: usr/local/www/system_advanced_admin.php:459
+msgid "Disable DNS Rebinding Checks"
+msgstr "DNS Yeniden Bağlama Kontrollerini Kapat"
+
+#: usr/local/www/system_advanced_admin.php:461
+msgid ""
+"When this is unchecked, your system is protected against <a href=\"http://en."
+"wikipedia.org/wiki/DNS_rebinding\">DNS Rebinding attacks</a>. This blocks "
+"private IP responses from your configured DNS servers. Check this box to "
+"disable this protection if it interferes with webConfigurator access or name "
+"resolution in your environment. "
+msgstr ""
+"Bu kutunun işaretini kaldırdığınızda, sisteminiz <a href=\\\"http://en."
+"wikipedia.org/wiki/DNS_rebinding\\\">DNS Yeniden Bağlama saldırıları</a>na "
+"karşı korunmuş olur. Bunu yapılandırılmış DNS sunucularınızdan özel IP "
+"yanıtlarını engelleyerek yapar. Bu seçeneği sadece webArayüzüne erişiminizi "
+"engelliyor veya isim çözme işlemlerini bozuyorsa kapatın. "
+
+#: usr/local/www/system_advanced_admin.php:468
+msgid "Alternate Hostnames"
+msgstr "Alternatif Host Adları"
+
+#: usr/local/www/system_advanced_admin.php:472
+msgid "Alternate Hostnames for DNS Rebinding and HTTP_REFERER Checks"
+msgstr ""
+"DNS Yeniden Bağlama ve HTTP_REFERER Kontrolleri için Alternatif Host Adları"
+
+#: usr/local/www/system_advanced_admin.php:474
+msgid ""
+"Here you can specify alternate hostnames by which the router may be queried, "
+"to bypass the DNS Rebinding Attack checks. Separate hostnames with spaces."
+msgstr ""
+"Yönlendiricinin (router) sorgulanabileceği alternatif host adları "
+"girebilirsiniz, bu hostlar DNS Yeniden Bağlama Saldırısı kontrollerinden "
+"muaf tutulur. Birden fazla host adı girecekseniz aralarında bir boşluk "
+"bırakın."
+
+#: usr/local/www/system_advanced_admin.php:479
+msgid "Browser HTTP_REFERER enforcement"
+msgstr "Tarayıcı HTTP_REFERER mecburiyeti"
+
+#: usr/local/www/system_advanced_admin.php:482
+msgid "Disable HTTP_REFERER enforcement check"
+msgstr "Tarayıcı HTTP_REFERER mecburiyeti kontrollerini kapat"
+
+#: usr/local/www/system_advanced_admin.php:484
+msgid ""
+"When this is unchecked, access to the webConfigurator is protected against "
+"HTTP_REFERER redirection attempts. Check this box to disable this protection "
+"if you find that it interferes with webConfigurator access in certain corner "
+"cases such as using external scripts to interact with this system. More "
+"information on HTTP_REFERER is available from <a target='_blank' "
+"href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."
+msgstr ""
+"Bu kutunun işareti kaldırıldığında, web arayüzüne erişim HTTP_REFERER "
+"yeniden yönlendirme denemelerine karşı korunur. Dış betiklerin sisteme "
+"erişimde sıkıntı yaşaması gibi uç durumlar yaşıyorsanız kutunun işaretini "
+"kaldırın. HTTP_REFERER başlığı hakkında daha fazla bilgiyi <a "
+"target='_blank' href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</"
+"a>'da bulabilirsiniz."
+
+#: usr/local/www/system_advanced_admin.php:491
+msgid "BEAST Attack Protection"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:494
+msgid "Mitigate the BEAST SSL Attack"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:496
+msgid ""
+"When this is checked, the webConfigurator can mitigate BEAST SSL attacks. "
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:499
+#, php-format
+msgid ""
+"This option has been automatically disabled because a conflicting "
+"cryptographic accelerator card has been detected (%s)."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:501
+msgid ""
+"This option is off by default because Hifn accelerators do NOT work with "
+"this option, and the GUI will not function. It is possible that other "
+"accelerators have a similar problem that is not yet known/documented. More "
+"information on BEAST is available from <a target='_blank' href='https://en."
+"wikipedia.org/wiki/Transport_Layer_Security#BEAST_attack'>Wikipedia</a>."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:507
+msgid "Browser tab text"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:510
+msgid "Display page name first in browser tab"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:512
+msgid ""
+"When this is unchecked, the browser tab shows the host name followed by the "
+"current page. "
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:514
+msgid "Check this box to display the current page followed by the host name."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:521
+msgid "Secure Shell"
+msgstr "SSH"
+
+#: usr/local/www/system_advanced_admin.php:524
+msgid "Secure Shell Server"
+msgstr "SSH Sunucu"
+
+#: usr/local/www/system_advanced_admin.php:527
+msgid "Enable Secure Shell"
+msgstr "SSH'ı Etkinleştir"
+
+#: usr/local/www/system_advanced_admin.php:531
+msgid "Authentication Method"
+msgstr "Kimlik Doğrulama Yöntemi"
+
+# 93%
+#: usr/local/www/system_advanced_admin.php:534
+msgid "Disable password login for Secure Shell (RSA/DSA key only)"
+msgstr "SSH için şifre girişini kapat (RSA/DSA anahtarıyla bağlan)"
+
+#: usr/local/www/system_advanced_admin.php:536
+msgid "When enabled, authorized keys need to be configured for each"
+msgstr "Etkinleştirildiğinde, SSH erişimi verilen her "
+
+#: usr/local/www/system_advanced_admin.php:537
+msgid "user"
+msgstr "kullanıcı"
+
+#: usr/local/www/system_advanced_admin.php:538
+msgid "that has been granted secure shell access."
+msgstr "için kimliği doğrulanmış anahtarlar gerekir."
+
+#: usr/local/www/system_advanced_admin.php:542
+msgid "SSH port"
+msgstr "SSH portu"
+
+#: usr/local/www/system_advanced_admin.php:546
+msgid "Note: Leave this blank for the default of 22."
+msgstr "Not: Varsayılan 22 değeri için bu alanı boş bırakabilirsiniz."
+
+#: usr/local/www/system_advanced_admin.php:553
+msgid "Serial Communications"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:557
+msgid "Serial Terminal"
+msgstr "Seri Terminal"
+
+#: usr/local/www/system_advanced_admin.php:560
+msgid ""
+"Enables the first serial port with 115200/8/N/1 by default, or another speed "
+"selectable below."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:561
+msgid ""
+"Note: This will redirect the console output and messages to the serial "
+"port. You can still access the console menu from the internal video card/"
+"keyboard. A <b>null modem</b> serial cable or adapter is required to use the "
+"serial console."
+msgstr ""
+"Not: Bu işlem konsol çıktısını seri porta yöneltir. Konsol menüsüne ekran "
+"kartı/klavye ikilisinden erişim kapatılmaz. Seri konsolu kullanabilmek için "
+"<b>null modem</b> seri kablosu veya adaptörü gereklidir."
+
+#: usr/local/www/system_advanced_admin.php:566
+msgid "Serial Speed"
+msgstr "Seri Hızı"
+
+#: usr/local/www/system_advanced_admin.php:576
+msgid "Allows selection of different speeds for the serial console port."
+msgstr "Seri konsol portu için değişik hız seçimine izin verir."
+
+#: usr/local/www/system_advanced_admin.php:581
+msgid "Primary Console"
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:587
+msgid ""
+"Select the preferred console if multiple consoles are present. The preferred "
+"console will show pfSense boot script output. All consoles display OS boot "
+"messages, console messages, and the console menu."
+msgstr ""
+
+#: usr/local/www/system_advanced_admin.php:595
+msgid "Console Options"
+msgstr "Konsol Seçenekleri"
+
+#: usr/local/www/system_advanced_admin.php:598
+msgid "Console menu"
+msgstr "Konsol menüsü"
+
+#: usr/local/www/system_advanced_admin.php:601
+msgid "Password protect the console menu"
+msgstr "Konsol menüsünü parola ile koru"
+
+#: usr/local/www/system_advanced_admin.php:603
+msgid "Changes to this option will take effect after a reboot."
+msgstr ""
+"Bu seçenekte yapılan değişiklikler sistem tekrar başlatıldığında "
+"etkinleştirilir."
+
+#: usr/local/www/system_advanced_admin.php:640
+msgid "secure shell configuration has changed. Stopping sshd."
+msgstr "SSH yapılandırması değiştirildi. sshd servisi durduruluyor."
+
+#: usr/local/www/system_advanced_admin.php:643
+msgid "secure shell configuration has changed. Restarting sshd."
+msgstr "SSH yapılandırması değiştirildi. sshd servisi yeniden başlatılıyor."
+
+#: usr/local/www/system_advanced_firewall.php:82
+msgid "The Firewall Adaptive values must be set together."
+msgstr "Güvenlik Duvarı Uyarlanabilir değerleri beraber yapılandırılmalıdır."
+
+#: usr/local/www/system_advanced_firewall.php:84
+msgid "The Firewall Adaptive Start value must be an integer."
+msgstr "Güvenlik Duvarı Uyarlanabilir Başlangıç değeri tam sayı olmalıdır."
+
+#: usr/local/www/system_advanced_firewall.php:87
+msgid "The Firewall Adaptive End value must be an integer."
+msgstr "Güvenlik Duvarı Uyarlanabilir Bitiş değeri tam sayı olmalıdır."
+
+#: usr/local/www/system_advanced_firewall.php:90
+msgid "The Firewall Maximum States value must be an integer."
+msgstr "Güvenlik duvarı Maksimum Durum değeri tamsayı olmalıdır."
+
+#: usr/local/www/system_advanced_firewall.php:93
+msgid "The Aliases Hostname Resolve Interval value must be an integer."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:96
+msgid "The Firewall Maximum Table Entries value must be an integer."
+msgstr "Güvenlik duvarı Maksimum Tablo Girdisi tamsayı olmalıdır."
+
+#: usr/local/www/system_advanced_firewall.php:99
+msgid "The TCP idle timeout must be an integer."
+msgstr "TCP boşta kalma zaman aşımı değeri tamsayı olmalıdır."
+
+#: usr/local/www/system_advanced_firewall.php:102
+msgid "The Reflection timeout must be an integer."
+msgstr "Yansıtma zaman aşımı değeri tamsayı olmalıdır."
+
+#: usr/local/www/system_advanced_firewall.php:233
+msgid "Advanced: Firewall and NAT"
+msgstr "Gelişmiş: Güvenlik duvarı ve NAT"
+
+#: usr/local/www/system_advanced_firewall.php:245
+msgid "as the name says, it's the normal optimization algorithm"
+msgstr "isminden de anlaşılacağı üzere, normal eniyileştirme algoritmasıdır"
+
+#: usr/local/www/system_advanced_firewall.php:246
+msgid ""
+"used for high latency links, such as satellite links. Expires idle "
+"connections later than default"
+msgstr ""
+"uydu bağlantıları gibi yüksek gecikmeli bağlantılar için kullanılır. Boş "
+"bağlantıları normalden daha geç kapatır"
+
+#: usr/local/www/system_advanced_firewall.php:247
+msgid ""
+"expires idle connections quicker. More efficient use of CPU and memory but "
+"can drop legitimate idle connections"
+msgstr ""
+"boştaki bağlantıları daha hızlı sonlandır. CPU ve belleğin daha verimli "
+"kullanılması için ancak meşru boştaki bağlantıları sonlandırabilirsiniz"
+
+#: usr/local/www/system_advanced_firewall.php:248
+msgid ""
+"tries to avoid dropping any legitimate idle connections at the expense of "
+"increased memory usage and CPU utilization."
+msgstr ""
+"meşru boştaki bağlantıyı sonlandırmak pahasına artan CPU ve bellek "
+"kullanımını önlemeye çalışır."
+
+#: usr/local/www/system_advanced_firewall.php:293
+msgid "Firewall Advanced"
+msgstr "Güvenlik Duvarı Gelişmiş"
+
+#: usr/local/www/system_advanced_firewall.php:296
+msgid "IP Do-Not-Fragment compatibility"
+msgstr "IP Bölme (DF) uyumluluğu"
+
+#: usr/local/www/system_advanced_firewall.php:299
+msgid "Clear invalid DF bits instead of dropping the packets"
+msgstr "Paketleri atmak yerine DG bitlerini temizlemeye çalış"
+
+#: usr/local/www/system_advanced_firewall.php:300
+msgid ""
+"This allows for communications with hosts that generate fragmented packets "
+"with the don't fragment (DF) bit set. Linux NFS is known to do this. This "
+"will cause the filter to not drop such packets but instead clear the don't "
+"fragment bit."
+msgstr ""
+"DF biti 1 durumunda olan parçalı paketler üreten sunucularla iletişime "
+"olanak verir. Örneğin Linux NFS bu tür sunuculardan biridir. Bu seçenekle o "
+"paketler atılmaz, sadece DF bitleri temizlenir."
+
+#: usr/local/www/system_advanced_firewall.php:307
+msgid "IP Random id generation"
+msgstr "IP rasgele kimlik üretimi"
+
+#: usr/local/www/system_advanced_firewall.php:310
+msgid ""
+"Insert a stronger id into IP header of packets passing through the filter."
+msgstr ""
+"Filtreden geçen paketlerin IP başlığına daha güçlü bir kimlik yerleştir."
+
+#: usr/local/www/system_advanced_firewall.php:311
+msgid ""
+"Replaces the IP identification field of packets with random values to "
+"compensate for operating systems that use predictable values. This option "
+"only applies to packets that are not fragmented after the optional packet "
+"reassembly."
+msgstr ""
+"Paketlerin IP kimlik tanımlama kısmında öngörülebilir değerler kullanan "
+"işletim sistemlerinden gelen paketleri güçlendirmek için IP kimlik tanımlama "
+"alanının değerini değiştirir. Bu seçenek sadece isteğe bağlı paket açma ve "
+"yeniden birleştirme işleminden sonra parçalanmamış halde olan paketleri "
+"etkiler."
+
+#: usr/local/www/system_advanced_firewall.php:318
+msgid "Firewall Optimization Options"
+msgstr "Güvenlik Duvarı Eniyileştirme Seçenekleri"
+
+#: usr/local/www/system_advanced_firewall.php:321
+msgid "normal"
+msgstr "normal"
+
+#: usr/local/www/system_advanced_firewall.php:322
+msgid "high-latency"
+msgstr "yüksek gecikmeli"
+
+#: usr/local/www/system_advanced_firewall.php:323
+msgid "aggressive"
+msgstr "saldırgan"
+
+#: usr/local/www/system_advanced_firewall.php:324
+msgid "conservative"
+msgstr "muhafazakar"
+
+#: usr/local/www/system_advanced_firewall.php:334
+msgid "Select the type of state table optimization to use"
+msgstr "Kullanılacak durum tablosu eniyileştirme yöntemini seçiniz"
+
+#: usr/local/www/system_advanced_firewall.php:338
+msgid "Disable Firewall"
+msgstr "Güvenlik Duvarını Devre Dışı Bırak"
+
+#: usr/local/www/system_advanced_firewall.php:341
+msgid "Disable all packet filtering."
+msgstr "Tüm paket filtrelemeyi devre dışı bırak."
+
+#: usr/local/www/system_advanced_firewall.php:343
+#, php-format
+msgid "Note: This converts %s into a routing only platform!"
+msgstr ""
+"Not: Bu seçenek %s sistemini sadece yönlendime yapan bir sisteme dönüştürür!"
+
+#: usr/local/www/system_advanced_firewall.php:344
+msgid "Note: This will also turn off NAT!"
+msgstr "Not: NAT'ı da devre dışı bırakır!"
+
+#: usr/local/www/system_advanced_firewall.php:345
+msgid "If you only want to disable NAT, and not firewall rules, visit the"
+msgstr ""
+"Güvenlik Duvarı kurallarını kapatmadan sadece NAT'ı devredışı bırakmak "
+"istiyorsanız"
+
+#: usr/local/www/system_advanced_firewall.php:345
+msgid "Outbound NAT"
+msgstr "Dışarı NAT"
+
+#: usr/local/www/system_advanced_firewall.php:350
+msgid "Disable Firewall Scrub"
+msgstr "Güvenlik Duvarı Elden Geçirmeyi Devre Dışı Bırak"
+
+#: usr/local/www/system_advanced_firewall.php:353
+msgid ""
+"Disables the PF scrubbing option which can sometimes interfere with NFS and "
+"PPTP traffic."
+msgstr ""
+"Zaman zaman NFS ve PPTP trafiğini bozabilen bir özellik olan PF elden "
+"geçirme seçeneğini kapatır."
+
+#: usr/local/www/system_advanced_firewall.php:358
+msgid "Firewall Adaptive Timeouts"
+msgstr "Güvenlik Duvarı Uyarlanabilir Zaman aşımları"
+
+#: usr/local/www/system_advanced_firewall.php:360
+msgid ""
+"Timeouts for states can be scaled adaptively as the number of state table "
+"entries grows."
+msgstr ""
+"Durum tablosu girdileri büyüdükçe durumlar için zaman aşımı bağdaşık olarak "
+"ölçeklendirilebilir."
+
+#: usr/local/www/system_advanced_firewall.php:363
+msgid ""
+"When the number of state entries exceeds this value, adaptive scaling "
+"begins. All timeout values are scaled linearly with factor (adaptive.end - "
+"number of states) / (adaptive.end - adaptive.start)."
+msgstr ""
+"Durum tablosu girdilerinin sayısı bu değeri aştığında uyarlanabilir "
+"ölçekleme başlar. Tüm zaman aşımı değerleri faktörü ile doğrusal ölçeklenir "
+"(uyarlanabilir.bitiş -durum tablosu girdiler sayısı) / (uyarlanabilir bitiş "
+"- uyarlanabilir başlangıç)."
+
+#: usr/local/www/system_advanced_firewall.php:367
+msgid ""
+"When reaching this number of state entries, all timeout values become zero, "
+"effectively purging all state entries immediately. This value is used to "
+"define the scale factor, it should not actually be reached (set a lower "
+"state limit, see below)."
+msgstr ""
+"Durum girişleri bu sayıya ulaştığında tüm zaman aşımı değerleri anında "
+"sıfırlanır. Bu değer ölçek faktörü tanımlamak için kullanılır, aslında "
+"ulaşılabilir değildir. (daha düşük durum sınırı ayarlamak için aşağıya "
+"bakınız)."
+
+#: usr/local/www/system_advanced_firewall.php:369
+msgid "Note: Leave this blank for the default(0)."
+msgstr "Not: Varsayılan değer (0) için boş bırakın."
+
+#: usr/local/www/system_advanced_firewall.php:373
+msgid "Firewall Maximum States"
+msgstr "Güvenlik Duvarı Maksimum Durum"
+
+#: usr/local/www/system_advanced_firewall.php:377
+msgid "Maximum number of connections to hold in the firewall state table."
+msgstr "Güvenlik Duvarı durum tablosunda tutulacak maksimum bağlantı sayısı."
+
+#: usr/local/www/system_advanced_firewall.php:379
+msgid ""
+"Note: Leave this blank for the default. On your system the default size is:"
+msgstr ""
+"Not: Varsayılan değer için boş bırakınız. Sisteminizdeki varsayılan değer:"
+
+#: usr/local/www/system_advanced_firewall.php:383
+msgid "Firewall Maximum Table Entries"
+msgstr "Güvenlik Duvarı Maksimum Tablo Girdisi Sayısı"
+
+#: usr/local/www/system_advanced_firewall.php:387
+msgid ""
+"Maximum number of table entries for systems such as aliases, sshlockout, "
+"snort, etc, combined."
+msgstr ""
+"Gruplar, sshlockout, snort vb sistemler için ayrılan en fazla tablo girdisi "
+"sayısı."
+
+#: usr/local/www/system_advanced_firewall.php:390
+msgid "Note: Leave this blank for the default."
+msgstr "Not: Varsayılan değer için boş bırakınız."
+
+#: usr/local/www/system_advanced_firewall.php:392
+msgid "On your system the default size is:"
+msgstr "Sisteminizdeki varsayılan değer:"
+
+#: usr/local/www/system_advanced_firewall.php:398
+msgid "Static route filtering"
+msgstr "Statik rota yönlendirme filtreleme"
+
+#: usr/local/www/system_advanced_firewall.php:401
+msgid "Bypass firewall rules for traffic on the same interface"
+msgstr "Aynı arabirim üzerindeki trafik için güvenlik duvarı kurallarını atla"
+
+#: usr/local/www/system_advanced_firewall.php:403
+msgid ""
+"This option only applies if you have defined one or more static routes. If "
+"it is enabled, traffic that enters and leaves through the same interface "
+"will not be checked by the firewall. This may be desirable in some "
+"situations where multiple subnets are connected to the same interface."
+msgstr ""
+"Sadece statik rotalar tanımladıysanız anlamlıdır. Etkinleştirildiğinde, aynı "
+"arabirim üzerinden gelip giden trafik güvenlik duvarı tarafından kontrol "
+"edilmez. Bu seçeneği birden fazla altağın aynı arabirime bağlı olduğu "
+"durumlarda kullanmak isteyebilirsiniz."
+
+#: usr/local/www/system_advanced_firewall.php:413
+msgid "Disable all auto-added VPN rules."
+msgstr "Otomatik eklenen tüm VPN kurallarını kapat."
+
+#: usr/local/www/system_advanced_firewall.php:415
+msgid "Note: This disables automatically added rules for IPsec, PPTP."
+msgstr ""
+"Not: Bu seçenek IPsec ve PPTP için otomatik olarak eklenen kuralları kapatır."
+
+#: usr/local/www/system_advanced_firewall.php:423
+msgid "Disable reply-to on WAN rules"
+msgstr "WAN kurallarındaki yanıt adresi özelliğini kapat"
+
+#: usr/local/www/system_advanced_firewall.php:425
+msgid ""
+"With Multi-WAN you generally want to ensure traffic leaves the same "
+"interface it arrives on, hence reply-to is added automatically by default. "
+"When using bridging, you must disable this behavior if the WAN gateway IP is "
+"different from the gateway IP of the hosts behind the bridged interface."
+msgstr ""
+"Çoklu WAN yapılandırmalarda genellikle trafiğin geldiği arabirimden gitmesi "
+"istenir ve bu amaçla yanıt adresi otomatik olarak eklenir. Köprüleme "
+"kullanıldığında WAN ağ geçidi IPsi köprülenen arabirimin arkasındaki "
+"istemcilerin ağ geçidi IPsinden farklı ise bu özelliği kapatmanız gerekir."
+
+#: usr/local/www/system_advanced_firewall.php:434
+msgid "Disable Negate rule on policy routing rules"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:436
+msgid ""
+"With Multi-WAN you generally want to ensure traffic reaches directly "
+"connected networks and VPN networks when using policy routing. You can "
+"disable this for special purposes but it requires manually creating rules "
+"for these networks"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:441
+msgid "Aliases Hostnames Resolve Interval"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:445
+msgid ""
+"Interval, in seconds, that will be used to resolve hostnames configured on "
+"aliases."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:447
+msgid "Note: Leave this blank for the default (300s)."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:451
+msgid "Check certificate of aliases URLs"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:454
+msgid "Verify HTTPS certificates when downloading alias URLs"
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:456
+msgid ""
+"Make sure the certificate is valid for all HTTPS addresses on aliases. If "
+"it's not valid or is revoked, do not download it."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:464
+msgid "Bogon Networks"
+msgstr "Sahte Ağlar"
+
+# Güncelleme sıklığı
+#: usr/local/www/system_advanced_firewall.php:467
+msgid "Update Frequency"
+msgstr "Güncelleştirme sıklığı"
+
+#: usr/local/www/system_advanced_firewall.php:470
+msgid "Monthly"
+msgstr "Aylık"
+
+#: usr/local/www/system_advanced_firewall.php:471
+msgid "Weekly"
+msgstr "Haftalık"
+
+#: usr/local/www/system_advanced_firewall.php:472
+msgid "Daily"
+msgstr "Günlük"
+
+#: usr/local/www/system_advanced_firewall.php:475
+msgid ""
+"The frequency of updating the lists of IP addresses that are reserved (but "
+"not RFC 1918) or not yet assigned by IANA."
+msgstr ""
+"IP adreslerinin listesi güncelleme sıklığı ayrılmış (RFC 1918 hariç) yada "
+"IANA tarafından atanamaz."
+
+#: usr/local/www/system_advanced_firewall.php:483
+msgid "Network Address Translation"
+msgstr "NAT 'Ağ Adres Çevrimi'"
+
+#: usr/local/www/system_advanced_firewall.php:486
+msgid "NAT Reflection mode for port forwards"
+msgstr "Port yönlendirmeleri için NAT Yansıtma"
+
+#: usr/local/www/system_advanced_firewall.php:494
+msgid ""
+"When enabled, this automatically creates additional NAT redirect rules for "
+"access to port forwards on your external IP addresses from within your "
+"internal networks."
+msgstr ""
+"Etkinleştirildiğinde İç ağlarınızdan dış IPleriniz ile yapılan port "
+"yönlendirmelerine erişim için otomatik olarak ek NAT yönlendirme kuralları "
+"oluşturulmasını sağlar."
+
+#: usr/local/www/system_advanced_firewall.php:496
+msgid ""
+"The NAT + proxy mode uses a helper program to send packets to the target of "
+"the port forward. It is useful in setups where the interface and/or gateway "
+"IP used for communication with the target cannot be accurately determined at "
+"the time the rules are loaded. Reflection rules are not created for ranges "
+"larger than 500 ports and will not be used for more than 1000 ports total "
+"between all port forwards. Only TCP and UDP protocols are supported."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:498
+msgid ""
+"The pure NAT mode uses a set of NAT rules to direct packets to the target of "
+"the port forward. It has better scalability, but it must be possible to "
+"accurately determine the interface and gateway IP used for communication "
+"with the target at the time the rules are loaded. There are no inherent "
+"limits to the number of ports other than the limits of the protocols. All "
+"protocols available for port forwards are supported."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:500
+#: usr/local/www/system_advanced_firewall.php:520
+msgid ""
+"Individual rules may be configured to override this system setting on a per-"
+"rule basis."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:504
+msgid "Reflection Timeout"
+msgstr "Yansıtma Zaman Aşımı"
+
+#: usr/local/www/system_advanced_firewall.php:507
+msgid "Enter value for Reflection timeout in seconds."
+msgstr "Saniye cinsinden bir Yansıtma zaman aşımı değeri girin."
+
+#: usr/local/www/system_advanced_firewall.php:509
+msgid "Note: Only applies to Reflection on port forwards in NAT + proxy mode."
+msgstr ""
+
+# 91%
+#: usr/local/www/system_advanced_firewall.php:513
+msgid "Enable NAT Reflection for 1:1 NAT"
+msgstr "1:1 NAT için NAT Yansıtmayı Aktif et"
+
+#: usr/local/www/system_advanced_firewall.php:516
+msgid ""
+"Enables the automatic creation of additional NAT redirect rules for access "
+"to 1:1 mappings of your external IP addresses from within your internal "
+"networks."
+msgstr ""
+"Etkinleştirildiğinde İç ağlarınızdan dış IPleriniz ile yapılan 1:1 eşleşme "
+"yönlendirmelerine erişim için otomatik olarak ek NAT yönlendirme kuralları "
+"oluşturulmasını sağlar."
+
+#: usr/local/www/system_advanced_firewall.php:518
+msgid ""
+"Note: Reflection on 1:1 mappings is only for the inbound component of the "
+"1:1 mappings. This functions the same as the pure NAT mode for port "
+"forwards. For more details, refer to the pure NAT mode description above."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:524
+msgid "Enable automatic outbound NAT for Reflection"
+msgstr "Otomatik dışarı NAT'ı yansıma için etkinleştirin"
+
+#: usr/local/www/system_advanced_firewall.php:527
+msgid ""
+"Automatically create outbound NAT rules which assist inbound NAT rules that "
+"direct traffic back out to the same subnet it originated from."
+msgstr ""
+"Trafiği geldiği altağa yönlendirilen içeriye doğru NAT kurallarına yardımcı "
+"olmak amacıyla ek dışarıya doğru NAT kurallarını otomatik oluştur."
+
+#: usr/local/www/system_advanced_firewall.php:529
+msgid ""
+"Required for full functionality of the pure NAT mode of NAT Reflection for "
+"port forwards or NAT Reflection for 1:1 NAT."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:531
+msgid ""
+"Note: This only works for assigned interfaces. Other interfaces require "
+"manually creating the outbound NAT rules that direct the reply packets back "
+"through the router."
+msgstr ""
+
+#: usr/local/www/system_advanced_firewall.php:535
+msgid "TFTP Proxy"
+msgstr "TFTP Vekil"
+
+#: usr/local/www/system_advanced_firewall.php:550
+msgid "Choose the interfaces where you want TFTP proxy helper to be enabled."
+msgstr "TFTP vekil yardımcısının etkinleştirileceği arabirimleri seçiniz."
+
+#: usr/local/www/system_advanced_misc.php:85
+msgid "AMD Geode LX Security Block"
+msgstr "AMD Geode LX Güvenlik Engeli"
+
+#: usr/local/www/system_advanced_misc.php:86
+msgid "AES-NI CPU-based Acceleration"
+msgstr "AES-NI CPU-based Hızlandırma"
+
+#: usr/local/www/system_advanced_misc.php:88
+msgid "Intel Core* CPU on-die thermal sensor"
+msgstr "Intel Core* CPU on-die termal algılayıcı"
+
+#: usr/local/www/system_advanced_misc.php:89
+msgid "AMD K8, K10 and K11 CPU on-die thermal sensor"
+msgstr "AMD K8, K10 ve K11 CPU on-die termal algılayıcı"
+
+#: usr/local/www/system_advanced_misc.php:100
+msgid "Please select a valid Cryptographic Accelerator."
+msgstr "Geçerli bir Şifreleme Hızlandırıcı seçiniz."
+
+#: usr/local/www/system_advanced_misc.php:103
+msgid "Please select a valid Thermal Hardware Sensor."
+msgstr "Geçerli bir Termal Donanım Algılayıcı seçiniz."
+
+#: usr/local/www/system_advanced_misc.php:106
+msgid "/tmp Size must be numeric and should not be less than 40MB."
+msgstr "/tmp boyutu sayı olmalıdır ve 40MB dan daha az olamaz."
+
+#: usr/local/www/system_advanced_misc.php:109
+msgid "/var Size must be numeric and should not be less than 60MB."
+msgstr "/var boyutu sayı olmalıdır ve 60MB dan daha az olamaz."
+
+#: usr/local/www/system_advanced_misc.php:245
+msgid "Advanced: Miscellaneous"
+msgstr "Gelişmiş: Diğer"
+
+#: usr/local/www/system_advanced_misc.php:310
+msgid "Proxy support"
+msgstr "Vekil sunucu desteği"
+
+#: usr/local/www/system_advanced_misc.php:313
+msgid "Proxy URL"
+msgstr "Vekil URL"
+
+#: usr/local/www/system_advanced_misc.php:317
+#, php-format
+msgid ""
+"Hostname or IP address of proxy server this system will use for its outbound "
+"Internet access."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:321
+msgid "Proxy Port"
+msgstr "Vekil Portu"
+
+#: usr/local/www/system_advanced_misc.php:325
+#, php-format
+msgid "Port where proxy server is listening."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:329
+msgid "Proxy Username"
+msgstr "Vekil Kullanıcı adı"
+
+#: usr/local/www/system_advanced_misc.php:333
+#, php-format
+msgid ""
+"Username for authentication to proxy server. Optional, leave blank to not "
+"use authentication."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:337
+msgid "Proxy Password"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:341
+#, php-format
+msgid "Password for authentication to proxy server."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:345
+#: usr/local/www/system_advanced_misc.php:348
+#: usr/local/www/system_advanced_misc.php:369
+msgid "Load Balancing"
+msgstr "Yük Dengeleme"
+
+#: usr/local/www/system_advanced_misc.php:351
+msgid "Use sticky connections"
+msgstr "Sabit bağlantılar kullan"
+
+#: usr/local/www/system_advanced_misc.php:352
+msgid ""
+"Successive connections will be redirected to the servers in a round-robin "
+"manner with connections from the same source being sent to the same web "
+"server. This 'sticky connection' will exist as long as there are states that "
+"refer to this connection. Once the states expire, so will the sticky "
+"connection. Further connections from that host will be redirected to the "
+"next web server in the round robin. Changing this option will restart the "
+"Load Balancing service."
+msgstr ""
+"Ardışık bağlantılar sunuculara dairesel bir mantıkla yönlendirilir, bir "
+"kaynaktan gelen bağlantılar hep aynı sunucuya gönderilir. Bu 'kalıcı "
+"bağlantı', bu bağlantıya atıfta bulunan durumlar olduğu sürece canlı kalır. "
+"Durumların süresi dolduğunda, kalıcı bağlantının da süresi dolmuş olur. O "
+"istemciden gelen sonraki bağlantı istekleri dairesel dağıtılır. Bu ayarların "
+"değiştirilmesi Yük Dengeleyici servisini yeniden başlatacaktır."
+
+#: usr/local/www/system_advanced_misc.php:363
+msgid ""
+"Set the source tracking timeout for sticky connections. By default this is "
+"0, so source tracking is removed as soon as the state expires. Setting this "
+"timeout higher will cause the source/destination relationship to persist for "
+"longer periods of time."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:372
+msgid "Enable default gateway switching"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:373
+msgid ""
+"If the default gateway goes down, switch the default gateway to another "
+"available one. This is not enabled by default, as it's unnecessary in most "
+"all scenarios, which instead use gateway groups."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:381
+msgid "Power savings"
+msgstr "Güç tasarrufu"
+
+#: usr/local/www/system_advanced_misc.php:384
+msgid "PowerD"
+msgstr "PowerD"
+
+#: usr/local/www/system_advanced_misc.php:387
+msgid "Use PowerD"
+msgstr "PowerD Kullan"
+
+#: usr/local/www/system_advanced_misc.php:389
+msgid "On AC Power Mode"
+msgstr "Prizde Güç Modu"
+
+#: usr/local/www/system_advanced_misc.php:391
+#: usr/local/www/system_advanced_misc.php:399
+#: usr/local/www/system_advanced_misc.php:407
+msgid "Hiadaptive"
+msgstr "Hidengeli"
+
+#: usr/local/www/system_advanced_misc.php:392
+#: usr/local/www/system_advanced_misc.php:400
+#: usr/local/www/system_advanced_misc.php:408
+msgid "Adaptive"
+msgstr "Dengeli"
+
+#: usr/local/www/system_advanced_misc.php:393
+#: usr/local/www/system_advanced_misc.php:401
+#: usr/local/www/system_advanced_misc.php:409
+msgid "Minimum"
+msgstr "Minimum"
+
+#: usr/local/www/system_advanced_misc.php:394
+#: usr/local/www/system_advanced_misc.php:402
+#: usr/local/www/system_advanced_misc.php:410
+msgid "Maximum"
+msgstr "Maksimum"
+
+#: usr/local/www/system_advanced_misc.php:397
+msgid "On Battery Power Mode"
+msgstr "Bataryada Güç Modu"
+
+#: usr/local/www/system_advanced_misc.php:405
+msgid "On Unknown Power Mode"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:413
+msgid ""
+"The powerd utility monitors the system state and sets various power control "
+"options accordingly. It offers four modes (maximum, minimum, adaptive and "
+"hiadaptive) that can be individually selected while on AC power or "
+"batteries. The modes maximum, minimum, adaptive and hiadaptive may be "
+"abbreviated max, min, adp, hadp. Maximum mode chooses the highest "
+"performance values. Minimum mode selects the lowest performance values to "
+"get the most power savings. Adaptive mode attempts to strike a balance by "
+"degrading performance when the system appears idle and increasing it when "
+"the system is busy. It offers a good balance between a small performance "
+"loss for greatly increased power savings. Hiadaptive mode is alike adaptive "
+"mode, but tuned for systems where performance and interactivity are more "
+"important than power consumption. It raises frequency faster, drops slower "
+"and keeps twice lower CPU load."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:432
+msgid "Cryptographic Hardware Acceleration"
+msgstr "Donanımsal Şifreleme Hızlandırıcı"
+
+#: usr/local/www/system_advanced_misc.php:435
+msgid "Cryptographic Hardware"
+msgstr "Donanımsal Şifreleme"
+
+#: usr/local/www/system_advanced_misc.php:444
+msgid ""
+"A cryptographic accelerator module will use hardware support to speed up "
+"some cryptographic functions on systems which have the chip. Do not enable "
+"this option if you have a Hifn cryptographic acceleration card, as this will "
+"take precedence and the Hifn card will not be used. Acceleration should be "
+"automatic for IPsec when using a cipher supported by your chip, such as "
+"AES-128. OpenVPN should be set for AES-128-CBC and have cryptodev enabled "
+"for hardware acceleration."
+msgstr ""
+"Şifreleme hızlandırcı birimi bağzı hız artışı sağlayan donanımsal şifreleme "
+"işlevi sağlayacak çip e sahip sistemlerde kullanılır. Eğer Hifn şifreleme "
+"hızlandırıcı kart a sahipseniz bu seçeneği etkinleştirmeyin, bu öncelik alır "
+"ve Hifn kart kullanılmaz. Hızlandırma IPsec'in kullanacaği çip otomatik "
+"olmalı, örneğin AES-128 desteğine sahip bir çipe sahip olmalısınız. OpenVPN "
+"AES-128-CBC ye ayarlanmalı ve donanımsal hızlandırma da cryptodev seçeneği "
+"etkinleştirilmelidir."
+
+#: usr/local/www/system_advanced_misc.php:452
+msgid ""
+"If you do not have a crypto chip in your system, this option will have no "
+"effect. To unload the selected module, set this option to 'none' and then "
+"reboot."
+msgstr ""
+"Eğer sisteminizde şifreleme çipi yoksa, bu seçenek etkisiz olacak. "
+"Seçtiğiniz birimi kaldırın ve seçeneği 'yok (none)' ye ayarlayıp yeniden "
+"başlatın."
+
+#: usr/local/www/system_advanced_misc.php:460
+#: usr/local/www/system_advanced_misc.php:463
+msgid "Thermal Sensors"
+msgstr "Termal Algılayıcılar"
+
+#: usr/local/www/system_advanced_misc.php:466
+msgid "None/ACPI"
+msgstr "Yok (None)/ACPI"
+
+#: usr/local/www/system_advanced_misc.php:472
+msgid ""
+"If you have a supported CPU, selecting a themal sensor will load the "
+"appropriate driver to read its temperature. Setting this to 'None' will "
+"attempt to read the temperature from an ACPI-compliant motherboard sensor "
+"instead, if one is present."
+msgstr ""
+"Eğer desteklenen bir CPU ya sahipseniz, seçilen termal algılayıcı sıcaklığı "
+"okumak için uygun sürücüyü yükleyecektir. Eğer mevcutsa ayar 'yok (none) ise "
+"sıcaklığı sensör yerine ACPI-uyumlu anakart tan okumaya çalışacaktır."
+
+#: usr/local/www/system_advanced_misc.php:476
+msgid ""
+"If you do not have a supported thermal sensor chip in your system, this "
+"option will have no effect. To unload the selected module, set this option "
+"to 'none' and then reboot."
+msgstr ""
+"Eğer sisteminizde desteklenen termal algılayıcı çipi yoksa, bu seçenek "
+"etkisiz olacak. Seçtiğiniz birimi kaldırın ve seçeneği 'yok (none)' ye "
+"ayarlayıp yeniden başlatın."
+
+#: usr/local/www/system_advanced_misc.php:484
+msgid "IP Security"
+msgstr "IP Güvenlik"
+
+#: usr/local/www/system_advanced_misc.php:489
+msgid ""
+"These settings have moved to <a href=\"vpn_ipsec_settings.php\">VPN &gt; "
+"IPsec on the Advanced Settings tab</a>."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:499
+msgid "Schedule States"
+msgstr "Zamanlama Durumları"
+
+#: usr/local/www/system_advanced_misc.php:503
+msgid ""
+"By default, when a schedule expires, connections permitted by that schedule "
+"are killed. This option overrides that behavior by not clearing states for "
+"existing connections."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:511
+msgid "Gateway Monitoring"
+msgstr "Ağ Geçidi İzleme"
+
+#: usr/local/www/system_advanced_misc.php:514
+msgid "State Killing on Gateway Failure"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:518
+msgid ""
+"The monitoring process will flush states for a gateway that goes down if "
+"this box is not checked. Check this box to disable this behavior."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:522
+msgid "Skip rules when gateway is down"
+msgstr "Ağ geçidi kapalıysa kuralları es geç"
+
+#: usr/local/www/system_advanced_misc.php:526
+msgid ""
+"By default, when a rule has a gateway specified and this gateway is down, "
+"the rule is created omitting the gateway. This option overrides that "
+"behavior by omitting the entire rule instead."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:532
+msgid "Enable gateway monitoring debug logging"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:536
+msgid ""
+"Enable this setting to log debug information from the gateway monitoring "
+"process to the system logs."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:540
+msgid "RAM Disk Settings (Reboot to Apply Changes)"
+msgstr "RAM Disk Ayarları (Değişiklikleri Onaylayarak Yeniden Başlatın)"
+
+#: usr/local/www/system_advanced_misc.php:544
+msgid "Use RAM Disks"
+msgstr "RAM Disklerini kullan"
+
+#: usr/local/www/system_advanced_misc.php:547
+msgid "Use memory file system for /tmp and /var"
+msgstr "Sistem bellek dosyası olarak /tmp ve /var kullan"
+
+#: usr/local/www/system_advanced_misc.php:548
+msgid ""
+"Set this if you wish to use /tmp and /var as RAM disks (memory file system "
+"disks) on a full install rather than use the hard disk. Setting this will "
+"cause the data in /tmp and /var to be lost at reboot, including log data. "
+"RRD and DHCP Leases will be retained."
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:554
+msgid "/tmp RAM Disk Size"
+msgstr "/tmp RAM Disk Boyutu"
+
+#: usr/local/www/system_advanced_misc.php:558
+msgid ""
+"Set the size, in MB, for the /tmp RAM disk. Leave blank for 40MB. Do not set "
+"lower than 40."
+msgstr ""
+"Boyutu MB olarak /tmp RAM disk için ayarlayın. 40MB için boş bırakın. 40 dan "
+"düşük ayarlamayın."
+
+#: usr/local/www/system_advanced_misc.php:563
+msgid "/var RAM Disk Size"
+msgstr "/var RAM Disk Boyutu"
+
+#: usr/local/www/system_advanced_misc.php:567
+msgid ""
+"Set the size, in MB, for the /var RAM disk. Leave blank for 60MB. Do not set "
+"lower than 60."
+msgstr ""
+"Boyutu MB olarak /var RAM disk için ayarlayın. 60MB için boş bırakın. 60 dan "
+"düşük ayarlamayın."
+
+# 80%
+#: usr/local/www/system_advanced_misc.php:572
+msgid "Periodic RRD Backup"
+msgstr "Periyodik RRD Yedekleme"
+
+#: usr/local/www/system_advanced_misc.php:574
+#: usr/local/www/system_advanced_misc.php:590
+msgid "Frequency:"
+msgstr "Sıklık:"
+
+#: usr/local/www/system_advanced_misc.php:578
+#: usr/local/www/system_advanced_misc.php:594
+msgid "hour"
+msgstr "saat"
+
+#: usr/local/www/system_advanced_misc.php:582
+msgid ""
+"This will periodically backup the RRD data so it can be restored "
+"automatically on the next boot. Keep in mind that the more frequent the "
+"backup, the more writes will happen to your media."
+msgstr ""
+"Bu işlem RRD verisini belirli aralıklarla yedekler, böylece bir sonraki "
+"sistem açılışında yeniden yüklenebilir. Unutulmamalıdır ki yedekleme ne "
+"kadar sık olursa diske yazım o kadar sık gerçekleşir."
+
+#: usr/local/www/system_advanced_misc.php:588
+msgid "Periodic DHCP Leases Backup"
+msgstr "Periyodik DHCP Kiraları Yedekleme"
+
+#: usr/local/www/system_advanced_misc.php:598
+msgid ""
+"This will periodically backup the DHCP leases data so it can be restored "
+"automatically on the next boot. Keep in mind that the more frequent the "
+"backup, the more writes will happen to your media."
+msgstr ""
+"Bu işlem DHCP kiraları verisini belirli aralıklarla yedekler, böylece bir "
+"sonraki sistem açılışında yeniden yüklenebilir. Unutulmamalıdır ki yedekleme "
+"ne kadar sık olursa diske yazım o kadar sık gerçekleşir."
+
+#: usr/local/www/system_advanced_misc.php:608
+msgid "Hardware Settings"
+msgstr "Donanım Ayarları"
+
+#: usr/local/www/system_advanced_misc.php:611
+msgid "Hard disk standby time "
+msgstr "Harddisk beklemede kalma süresi "
+
+#: usr/local/www/system_advanced_misc.php:618
+msgid "Always on"
+msgstr "Her zaman açık"
+
+#: usr/local/www/system_advanced_misc.php:627
+msgid ""
+"Puts the hard disk into standby mode when the selected amount of time after "
+"the last access has elapsed."
+msgstr ""
+"Son disk erişiminden itibaren belirtilen süre geçtiğinde diskin beklemeye "
+"alınmasını sağlar."
+
+#: usr/local/www/system_advanced_misc.php:628
+msgid "Do not set this for CF cards."
+msgstr "CF kartlarda bu ayarı kullanmayınız."
+
+#: usr/local/www/system_advanced_misc.php:637
+msgid "Package settings"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:640
+msgid "Package signature"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:643
+msgid "Do NOT check package signature"
+msgstr ""
+
+#: usr/local/www/system_advanced_misc.php:644
+msgid ""
+"Enable this option to allow pfSense to install any package without checking "
+"its signature."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:68
+msgid "You must specify an IP address to NAT IPv6 packets."
+msgstr "NAT IPv6 paketleri için bir IP adresi belirtmelisiniz."
+
+#: usr/local/www/system_advanced_network.php:154
+msgid "Advanced: Networking"
+msgstr "Gelişmiş: Ağ"
+
+#: usr/local/www/system_advanced_network.php:211
+msgid "IPv6 Options"
+msgstr "IPv6 Seçenekleri"
+
+#: usr/local/www/system_advanced_network.php:214
+#: usr/local/www/system_advanced_network.php:217
+msgid "Allow IPv6"
+msgstr "IPv6ya İzin Ver"
+
+#: usr/local/www/system_advanced_network.php:218
+msgid ""
+"All IPv6 traffic will be blocked by the firewall unless this box is checked."
+msgstr ""
+"Bu kutu işaretli olduğu sürece tüm IPv6 trafiği güvenlik duvarı tarafından "
+"engellenir."
+
+#: usr/local/www/system_advanced_network.php:219
+msgid ""
+"NOTE: This does not disable any IPv6 features on the firewall, it only "
+"blocks traffic."
+msgstr ""
+"NOT: Bu güvenlik duvarında herhangi bir IPv6 özelliğini devre dışı bırakmaz, "
+"sadece trafiği engeller."
+
+#: usr/local/www/system_advanced_network.php:224
+msgid "IPv6 over IPv4 Tunneling"
+msgstr "IPv4 tünellemeyle IPv6"
+
+#: usr/local/www/system_advanced_network.php:227
+msgid "Enable IPv4 NAT encapsulation of IPv6 packets"
+msgstr "IPv6 paketlerinin IPv4 NAT ile sarmalanması özelliğini aç"
+
+#: usr/local/www/system_advanced_network.php:228
+msgid ""
+"This provides an RFC 2893 compatibility mechanism that can be used to "
+"tunneling IPv6 packets over IPv4 routing infrastructures. If enabled, don't "
+"forget to add a firewall rule to permit IPv6 packets."
+msgstr ""
+"Bu seçenek IPv6 paketlerinin IPv4 altyapısından tünellenmesine olanak veren "
+"RFC 2893 uyumluluk mekanizmasını sağlar. Etkinleştirirseniz IPv6 paketlerine "
+"izin veren bir güvenlik duvarı kuralı eklemeyi unutmayın."
+
+#: usr/local/www/system_advanced_network.php:238
+msgid "Prefer IPv4 over IPv6"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:241
+msgid "Prefer to use IPv4 even if IPv6 is available"
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:242
+msgid ""
+"By default, if a hostname resolves IPv6 and IPv4 addresses IPv6 will be "
+"used, if you check this option, IPv4 will be used instead of IPv6."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:254
+msgid "Device polling"
+msgstr "Aygıt sorgulama"
+
+#: usr/local/www/system_advanced_network.php:257
+msgid "Enable device polling"
+msgstr "Aygıt sorgulamayı etkinleştir"
+
+#: usr/local/www/system_advanced_network.php:258
+#, php-format
+msgid ""
+"Device polling is a technique that lets the system periodically poll network "
+"devices for new data instead of relying on interrupts. This prevents your "
+"webConfigurator, SSH, etc. from being inaccessible due to interrupt floods "
+"when under extreme load. Generally this is not recommended. Not all NICs "
+"support polling; see the %s homepage for a list of supported cards."
+msgstr ""
+"Aygıt sorgulama sistemin kesmelerle çalışmak yerine belirli aralıklarla "
+"ağdaki aygıtları sorguladığı bir tekniktir. Bu teknik webArayüzü ve SSH gibi "
+"servislerin çok yoğun yükler altında erişilemez hale gelmesini engeller, "
+"ancak genellikle tavsiye edilmez. Tüm NICler sorgulamayı desteklemez; "
+"desteklenen kartların listesini için %s adresine bakabilirsiniz."
+
+#: usr/local/www/system_advanced_network.php:262
+msgid "Hardware Checksum Offloading"
+msgstr "Donanım Kontrol Toplamı Yük Azaltımı"
+
+#: usr/local/www/system_advanced_network.php:265
+msgid "Disable hardware checksum offload"
+msgstr "Donanım kontrol toplamı yük azaltımını kapat"
+
+#: usr/local/www/system_advanced_network.php:266
+msgid ""
+"Checking this option will disable hardware checksum offloading. Checksum "
+"offloading is broken in some hardware, particularly some Realtek cards. "
+"Rarely, drivers may have problems with checksum offloading and some specific "
+"NICs."
+msgstr ""
+"Bu seçeneğin işaretlenmesi donanım kontrol toplamı yük azaltımını kapatır. "
+"Kontrol toplamı yük azaltımı bazı donanımlarda, özellikle de bazı Realtek "
+"kartlarda düzgün çalışmaz. Nadiren de olsa sürücüler kontrol toplamı yük "
+"azaltımı ve belirli NIClerde sorun çıkarabilir."
+
+#: usr/local/www/system_advanced_network.php:269
+#: usr/local/www/system_advanced_network.php:280
+#: usr/local/www/system_advanced_network.php:291
+msgid ""
+"This will take effect after you reboot the machine or re-configure each "
+"interface."
+msgstr ""
+
+#: usr/local/www/system_advanced_network.php:273
+msgid "Hardware TCP Segmentation Offloading"
+msgstr "Donanım TCP Kesimleme Yük Azaltımı"
+
+#: usr/local/www/system_advanced_network.php:276
+msgid "Disable hardware TCP segmentation offload"
+msgstr "Donanım TCP kesimleme yük azaltımını kapat"
+
+#: usr/local/www/system_advanced_network.php:277
+msgid ""
+"Checking this option will disable hardware TCP segmentation offloading (TSO, "
+"TSO4, TSO6). This offloading is broken in some hardware drivers, and may "
+"impact performance with some specific NICs."
+msgstr ""
+"Bu seçeneği işaretlemek TCP kesimleme yük azaltımını (TSO, TSO4, TSO6) "
+"kapatır. Bu yük azaltımı bazı donanım sürücülerinde düzgün çalışmaz ve "
+"belirli NIClerde performansı etkileyebilir."
+
+#: usr/local/www/system_advanced_network.php:284
+msgid "Hardware Large Receive Offloading"
+msgstr "Donanım Büyük Teslimat Yük Azaltımı"
+
+#: usr/local/www/system_advanced_network.php:287
+msgid "Disable hardware large receive offload"
+msgstr "Donanım büyük teslimat yük azaltımını kapat"
+
+#: usr/local/www/system_advanced_network.php:288
+msgid ""
+"Checking this option will disable hardware large receive offloading (LRO). "
+"This offloading is broken in some hardware drivers, and may impact "
+"performance with some specific NICs."
+msgstr ""
+"Bu seçeneği işaretlemek donanım büyük teslimat yük azatımını (LRO) kapatır. "
+"Bu yük azaltımı bazı donanım sürücülerinde bozuktur ve belirli NIClerde "
+"performansı etkileyebilir."
+
+#: usr/local/www/system_advanced_network.php:295
+msgid "ARP Handling"
+msgstr "ARP İşleme"
+
+#: usr/local/www/system_advanced_network.php:298
+msgid "Suppress ARP messages"
+msgstr "ARP mesajlarını baskıla"
+
+#: usr/local/www/system_advanced_network.php:299
+msgid ""
+"This option will suppress ARP log messages when multiple interfaces reside "
+"on the same broadcast domain"
+msgstr ""
+"Bu seçenek birden fazla arabirim aynı yayın alanında bulunduğunda ARP "
+"günlükleme mesajlarını baskılar"
+
+#: usr/local/www/system_advanced_notifications.php:147
+#: usr/local/www/system_advanced_notifications.php:243
+msgid "Test Growl"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:153
+#: usr/local/www/system_advanced_notifications.php:160
+#, php-format
+msgid "This is a test message from %s. It is safe to ignore this message."
+msgstr "Bu %s tarafından gönderilen bir test mesajıdır. Gözardı ediniz."
+
+#: usr/local/www/system_advanced_notifications.php:156
+#: usr/local/www/system_advanced_notifications.php:315
+msgid "Test SMTP"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:164
+msgid "Advanced: Notifications"
+msgstr "Gelişmiş: Bildirimler"
+
+#: usr/local/www/system_advanced_notifications.php:201
+msgid "Growl"
+msgstr "Growl"
+
+#: usr/local/www/system_advanced_notifications.php:204
+msgid "Disable Growl Notifications"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:207
+msgid ""
+"Check this option to disable growl notifications but preserve the settings "
+"below."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:211
+msgid "Registration Name"
+msgstr "Kayıt Adı"
+
+#: usr/local/www/system_advanced_notifications.php:214
+msgid "Enter the name to register with the Growl server (default: PHP-Growl)."
+msgstr "Growl sunucuya gönderilecek ismi giriniz (varsayılan PHP-Growl)."
+
+#: usr/local/www/system_advanced_notifications.php:218
+msgid "Notification Name"
+msgstr "Bildirim adı"
+
+#: usr/local/www/system_advanced_notifications.php:221
+#, php-format
+msgid "Enter a name for the Growl notifications (default: %s growl alert)."
+msgstr "Growl bildirimleri için bir isim giriniz (varsayılan %s growl alert)."
+
+#: usr/local/www/system_advanced_notifications.php:228
+msgid ""
+"This is the IP address that you would like to send growl notifications to."
+msgstr "Growl bildirimlerini göndermek istediğiniz IP adresi."
+
+#: usr/local/www/system_advanced_notifications.php:235
+msgid "Enter the password of the remote growl notification device."
+msgstr "Uzak Growl bildirim aygıtının parolası."
+
+#: usr/local/www/system_advanced_notifications.php:244
+msgid ""
+"NOTE: A test notification will be sent even if the service is marked as "
+"disabled."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:252
+msgid "SMTP E-Mail"
+msgstr "SMTP E-Posta"
+
+#: usr/local/www/system_advanced_notifications.php:255
+msgid "Disable SMTP Notifications"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:258
+msgid ""
+"Check this option to disable SMTP notifications but preserve the settings "
+"below. Some other mechanisms, such as packages, may need these settings in "
+"place to function."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:262
+msgid "E-Mail server"
+msgstr "E-posta sunucu"
+
+#: usr/local/www/system_advanced_notifications.php:265
+msgid ""
+"This is the FQDN or IP address of the SMTP E-Mail server to which "
+"notifications will be sent."
+msgstr ""
+"Bildirim mesajlarının gönderileceği SMTP e-posta sunucusunun FQDN veya IP "
+"adresidir."
+
+#: usr/local/www/system_advanced_notifications.php:269
+msgid "SMTP Port of E-Mail server"
+msgstr "E-Posta sunucusunun SMTP portu"
+
+#: usr/local/www/system_advanced_notifications.php:272
+msgid ""
+"This is the port of the SMTP E-Mail server, typically 25, 587 (submission) "
+"or 465 (smtps)"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:276
+msgid "Secure SMTP Connection"
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:283
+msgid "From e-mail address"
+msgstr "Kimden e-posta adresi"
+
+#: usr/local/www/system_advanced_notifications.php:286
+msgid "This is the e-mail address that will appear in the from field."
+msgstr "Kimden alanında görüntülenecek e-posta adresi."
+
+#: usr/local/www/system_advanced_notifications.php:290
+msgid "Notification E-Mail address"
+msgstr "Bildirim e-posta adresi"
+
+#: usr/local/www/system_advanced_notifications.php:293
+msgid ""
+"Enter the e-mail address that you would like email notifications sent to."
+msgstr ""
+"Bilgilendirme mesajlarının gönderilmesini istediğiniz e-posta adresini "
+"giriniz."
+
+#: usr/local/www/system_advanced_notifications.php:297
+msgid "Notification E-Mail auth username (optional)"
+msgstr "Bildirim e-posta kutusu kimlik doğrulama kullanıcı adı (isteğe bağlı)"
+
+#: usr/local/www/system_advanced_notifications.php:300
+msgid "Enter the e-mail address username for SMTP authentication."
+msgstr ""
+"SMTP kimlik doğrulama için kullanılacak e-posta kutusu kullanıcı adını "
+"giriniz."
+
+#: usr/local/www/system_advanced_notifications.php:304
+msgid "Notification E-Mail auth password"
+msgstr "Bildirim eposta kutusu kimlik doğrulama parolası"
+
+#: usr/local/www/system_advanced_notifications.php:307
+msgid "Enter the e-mail address password for SMTP authentication."
+msgstr ""
+"SMTP kimlik doğrulama için kullanılacak e-posta kutusu parolasını giriniz."
+
+#: usr/local/www/system_advanced_notifications.php:316
+msgid ""
+"NOTE: A test message will be sent even if the service is marked as disabled."
+msgstr ""
+
+#: usr/local/www/system_advanced_notifications.php:324
+msgid "System Sounds"
+msgstr "Sistem Sesleri"
+
+#: usr/local/www/system_advanced_notifications.php:327
+msgid "Startup/Shutdown Sound"
+msgstr "Başlangıç/Kapanış Sesi"
+
+#: usr/local/www/system_advanced_notifications.php:330
+msgid "Disable the startup/shutdown beep"
+msgstr "Başlangıç/Kapanış sesini kapat"
+
+#: usr/local/www/system_advanced_notifications.php:332
+msgid "When this is checked, startup and shutdown sounds will no longer play."
+msgstr "İşaretlendiğinde, başlangıç ve kapanış sesleri çalmayacak."
+
+#: usr/local/www/system_advanced_sysctl.php:135
+msgid "Advanced: System Tunables"
+msgstr "Gelişmiş: Sistem Değişkenleri"
+
+#: usr/local/www/system_advanced_sysctl.php:149
+msgid ""
+"The firewall tunables have changed. You must apply the configuration to "
+"take affect."
+msgstr ""
+"Güvenlik duvarı iç değişkenleri değiştirildi. Değişikliklerin uygulanması "
+"için etkinleştirmelisiniz."
+
+#: usr/local/www/system_advanced_sysctl.php:181
+msgid "Tunable Name"
+msgstr "Değişken Adı"
+
+#: usr/local/www/system_advanced_sysctl.php:246
+msgid "Edit system tunable"
+msgstr "Sistem değişkenini düzenle"
+
+#: usr/local/www/system_advanced_sysctl.php:249
+msgid "Tunable"
+msgstr "Değişken"
+
+#: usr/local/www/system_authservers.php:45
+msgid "Authentication Servers"
+msgstr "Kimlik Doğrulama Sunucuları"
+
+#: usr/local/www/system_authservers.php:86
+msgid "deleted"
+msgstr "silindi"
+
+#: usr/local/www/system_authservers.php:166
+#: usr/local/www/system_authservers.php:189
+#: usr/local/www/system_authservers.php:465
+#: usr/local/www/system_camanager.php:170
+#: usr/local/www/system_camanager.php:182
+#: usr/local/www/system_camanager.php:197
+#: usr/local/www/system_camanager.php:379
+#: usr/local/www/system_certmanager.php:206
+#: usr/local/www/system_certmanager.php:218
+#: usr/local/www/system_certmanager.php:236
+#: usr/local/www/system_certmanager.php:420
+#: usr/local/www/system_certmanager.php:621
+#: usr/local/www/system_certmanager.php:1030
+#: usr/local/www/system_crlmanager.php:195
+#: usr/local/www/system_crlmanager.php:202
+#: usr/local/www/system_crlmanager.php:327
+#: usr/local/www/system_crlmanager.php:417
+#: usr/local/www/system_usermanager.php:217
+#: usr/local/www/system_usermanager.php:795
+msgid "Descriptive name"
+msgstr "Açıklayıcı isim"
+
+#: usr/local/www/system_authservers.php:169
+#: usr/local/www/system_authservers.php:512
+msgid "Port value"
+msgstr "Port değeri"
+
+#: usr/local/www/system_authservers.php:170
+#: usr/local/www/system_authservers.php:518
+msgid "Transport"
+msgstr "Taşıma"
+
+#: usr/local/www/system_authservers.php:171
+#: usr/local/www/system_authservers.php:554
+msgid "Protocol version"
+msgstr "Protokol sürümü"
+
+#: usr/local/www/system_authservers.php:172
+msgid "Search level"
+msgstr "Arama seviyesi"
+
+#: usr/local/www/system_authservers.php:173
+msgid "User naming Attribute"
+msgstr "Kullanıcı isimlendirme niteliği"
+
+#: usr/local/www/system_authservers.php:174
+msgid "Group naming Attribute"
+msgstr "Grup isimlendirme niteliği"
+
+#: usr/local/www/system_authservers.php:175
+#: usr/local/www/system_authservers.php:693
+msgid "Group member attribute"
+msgstr "Grup üyesi niteliği"
+
+#: usr/local/www/system_authservers.php:176
+msgid "Authentication container"
+msgstr "Kimlik doğrulama taşıyıcısı"
+
+#: usr/local/www/system_authservers.php:181
+msgid "Bind user DN"
+msgstr "Kullanıcı DN bağla"
+
+#: usr/local/www/system_authservers.php:182
+msgid "Bind Password"
+msgstr "Parola bağla"
+
+#: usr/local/www/system_authservers.php:197
+#: usr/local/www/system_authservers.php:765
+msgid "Authentication port value"
+msgstr "Kimlik doğrulama port değeri"
+
+#: usr/local/www/system_authservers.php:203
+#: usr/local/www/system_authservers.php:771
+msgid "Accounting port value"
+msgstr "Hesaplandırma port değeri"
+
+#: usr/local/www/system_authservers.php:208
+#: usr/local/www/system_authservers.php:744
+msgid "Shared Secret"
+msgstr "Paylaşımlı Anahtar"
+
+#: usr/local/www/system_authservers.php:215
+msgid "The host name contains invalid characters."
+msgstr "Host adı geçersiz karakter içeriyor."
+
+#: usr/local/www/system_authservers.php:218
+msgid "An authentication server with the same name already exists."
+msgstr "Aynı adla bir kimlik doğrulama sunucusu sistemde mevcut."
+
+#: usr/local/www/system_authservers.php:221
+msgid "RADIUS Timeout value must be numeric and positive."
+msgstr "RADIUS zaman aşımı değeri pozitif ve tam sayı olmalıdır. "
+
+#: usr/local/www/system_authservers.php:405
+msgid "Please fill the required values."
+msgstr "Lütfen gerekli alanları doldurunuz."
+
+#: usr/local/www/system_authservers.php:411
+msgid "Please fill the bind username/password."
+msgstr "Bağlama Kullanıcı adı ve parola alanlarını doldurunuz."
+
+#: usr/local/www/system_authservers.php:433
+#: usr/local/www/system_usermanager_settings.php:103
+msgid "Popup blocker detected. Action aborted."
+msgstr "Açılır pencere engelleyicisi tespit edildi. Eylem iptal edildi."
+
+#: usr/local/www/system_authservers.php:448
+#: usr/local/www/system_groupmanager.php:288
+#: usr/local/www/system_groupmanager_addprivs.php:168
+#: usr/local/www/system_usermanager.php:494
+#: usr/local/www/system_usermanager_addprivs.php:157
+#: usr/local/www/system_usermanager_settings.php:114
+#: usr/local/www/vpn_l2tp.php:286 usr/local/www/vpn_l2tp_users.php:39
+#: usr/local/www/vpn_l2tp_users.php:95 usr/local/www/vpn_pptp.php:307
+#: usr/local/www/vpn_pptp_users.php:72 usr/local/www/vpn_pptp_users.php:92
+msgid "Users"
+msgstr "Kullanıcılar"
+
+#: usr/local/www/system_authservers.php:502
+msgid "LDAP Server Settings"
+msgstr "LDAP Sunucu Ayarları"
+
+#: usr/local/www/system_authservers.php:505
+#: usr/local/www/system_authservers.php:738
+msgid "Hostname or IP address"
+msgstr "Host adı ya da IP adresi"
+
+#: usr/local/www/system_authservers.php:508
+msgid ""
+"NOTE: When using SSL, this hostname MUST match the Common Name (CN) of the "
+"LDAP server's SSL Certificate."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:533
+#: usr/local/www/vpn_openvpn_client.php:751
+#: usr/local/www/vpn_openvpn_server.php:948
+msgid "Peer Certificate Authority"
+msgstr "Eş Sertifika Otoritesi"
+
+#: usr/local/www/system_authservers.php:546
+msgid "This option is used if 'SSL Encrypted' option is choosen."
+msgstr "Bu seçenek sadece 'SSL Şifreli' seçeneği açıksa kullanılır."
+
+#: usr/local/www/system_authservers.php:547
+msgid "It must match with the CA in the AD otherwise problems will arise."
+msgstr "AD'deki CA ile eşleşmelidir, aksi taktirde problem çıkabilir."
+
+#: usr/local/www/system_authservers.php:569
+msgid "Search scope"
+msgstr "Arama kapsamı"
+
+#: usr/local/www/system_authservers.php:573
+msgid "Level:"
+msgstr "Seviye:"
+
+#: usr/local/www/system_authservers.php:588
+msgid "Base DN:"
+msgstr "Temel DN:"
+
+#: usr/local/www/system_authservers.php:598
+msgid "Authentication containers"
+msgstr "Kimlik doğrulama taşıyıcıları"
+
+#: usr/local/www/system_authservers.php:602
+msgid "Containers:"
+msgstr "Taşıyıcılar:"
+
+#: usr/local/www/system_authservers.php:606
+msgid ""
+"Note: Semi-Colon separated. This will be prepended to the search base dn "
+"above or you can specify full container path containing a dc= component."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:607
+#: usr/local/www/system_authservers.php:608
+#: usr/local/www/system_authservers.php:625
+msgid "Example:"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:615
+msgid "Extended Query"
+msgstr "Geniş Sorgu"
+
+#: usr/local/www/system_authservers.php:632
+msgid "Bind credentials"
+msgstr "Bağlama bilgileri"
+
+#: usr/local/www/system_authservers.php:640
+msgid "Use anonymous binds to resolve distinguished names"
+msgstr "arklı isimleri çözmek için anonim bağlanma kullan"
+
+#: usr/local/www/system_authservers.php:649
+msgid "User DN:"
+msgstr "Kullanıcı DN:"
+
+#: usr/local/www/system_authservers.php:665
+msgid "Initial Template"
+msgstr "Başlangıç Şablonu"
+
+#: usr/local/www/system_authservers.php:681
+msgid "User naming attribute"
+msgstr "Kullanıcı isimlendirme niteliği"
+
+#: usr/local/www/system_authservers.php:687
+msgid "Group naming attribute"
+msgstr "Grup isimlendirme niteliği"
+
+#: usr/local/www/system_authservers.php:699
+msgid "UTF8 Encode"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:707
+msgid ""
+"UTF8 encode LDAP parameters before sending them to the server. Required to "
+"support international characters, but may not be supported by every LDAP "
+"server."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:714
+msgid "Username Alterations"
+msgstr ""
+
+#: usr/local/www/system_authservers.php:722
+msgid ""
+"Do not strip away parts of the username after the @ symbol, e.g. user@host "
+"becomes user when unchecked."
+msgstr ""
+
+#: usr/local/www/system_authservers.php:735
+msgid "Radius Server Settings"
+msgstr "Radius Sunucu Ayarları"
+
+#: usr/local/www/system_authservers.php:750
+msgid "Services offered"
+msgstr "Sunulan servisler"
+
+#: usr/local/www/system_authservers.php:777
+msgid "Authentication Timeout"
+msgstr "Kimlik doğrulamada zaman aşımı"
+
+#: usr/local/www/system_authservers.php:780
+msgid ""
+"This value controls how long, in seconds, that the RADIUS server may take to "
+"respond to an authentication request."
+msgstr ""
+"Bu değer RADIUS sunucusundan bir kimlik doğrulama isteğinde kaç saniye "
+"sürdüğünü kontrol eder."
+
+#: usr/local/www/system_authservers.php:781
+msgid "If left blank, the default value is 5 seconds."
+msgstr "Boş bırakılması durumunda varsayılan değer 5 saniyedir."
+
+#: usr/local/www/system_authservers.php:782
+msgid ""
+"NOTE: If you are using an interactive two-factor authentication system, "
+"increase this timeout to account for how long it will take the user to "
+"receive and enter a token."
+msgstr ""
+"NOT: İki faktörlü kimlik doğrulama sistemi kullanıyorsanız, hesabın zaman "
+"aşımı süresini uzatmak için kullanıcının giriş yetkisini tekrar alabileceği "
+"bir belirteç girin."
+
+#: usr/local/www/system_authservers.php:805
+msgid "Server Name"
+msgstr "Sunucu Adı"
+
+#: usr/local/www/system_authservers.php:816
+#: usr/local/www/vpn_openvpn_server.php:1842
+msgid "add server"
+msgstr "sunucu ekle"
+
+#: usr/local/www/system_authservers.php:823
+msgid "Additional authentication servers can be added here."
+msgstr "Buradan kimlik doğrulama sunucuları ekleyebilirsiniz."
+
+#: usr/local/www/system_authservers.php:843
+#: usr/local/www/vpn_openvpn_server.php:1871
+msgid "edit server"
+msgstr "sunucu düzenle"
+
+#: usr/local/www/system_authservers.php:846
+msgid "Do you really want to delete this Server?"
+msgstr "Bu sunucuyu silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_authservers.php:847
+#: usr/local/www/vpn_openvpn_server.php:1875
+msgid "delete server"
+msgstr "sunucu sil"
+
+#: usr/local/www/system_camanager.php:45
+msgid "Import an existing Certificate Authority"
+msgstr "Varolan Sertifika Otoritesini içeri aktar"
+
+#: usr/local/www/system_camanager.php:46
+msgid "Create an internal Certificate Authority"
+msgstr "İç Sertifika Sunucusu oluştur"
+
+#: usr/local/www/system_camanager.php:47
+msgid "Create an intermediate Certificate Authority"
+msgstr "Ara Sertifika Otoritesi oluştur"
+
+#: usr/local/www/system_camanager.php:52
+msgid "Certificate Authority Manager"
+msgstr "Sertifika Yöneticisi"
+
+#: usr/local/www/system_camanager.php:98
+#, php-format
+msgid "Certificate Authority %s and its CRLs (if any) successfully deleted"
+msgstr "%s Sertifika Otoritesi ve CRLleri başarıyla silindi"
+
+#: usr/local/www/system_camanager.php:171
+#: usr/local/www/system_camanager.php:412
+#: usr/local/www/system_certmanager.php:207
+#: usr/local/www/system_certmanager.php:637
+msgid "Certificate data"
+msgstr "Sertifika verisi"
+
+#: usr/local/www/system_camanager.php:173
+#: usr/local/www/system_certmanager.php:210
+msgid "This certificate does not appear to be valid."
+msgstr "Sertifika geçerli görünmüyor."
+
+#: usr/local/www/system_camanager.php:175
+msgid "Encrypted private keys are not yet supported."
+msgstr "Şifreli özel anahtarlar henüz desteklenmemektedir."
+
+#: usr/local/www/system_camanager.php:183
+#: usr/local/www/system_camanager.php:199
+#: usr/local/www/system_camanager.php:464
+#: usr/local/www/system_certmanager.php:220
+#: usr/local/www/system_certmanager.php:237
+#: usr/local/www/system_certmanager.php:692
+#: usr/local/www/system_certmanager.php:866
+#: usr/local/www/system_usermanager.php:219
+#: usr/local/www/system_usermanager.php:821
+msgid "Key length"
+msgstr "Anahtar uzunluğu"
+
+#: usr/local/www/system_camanager.php:184
+#: usr/local/www/system_camanager.php:200
+#: usr/local/www/system_camanager.php:496
+#: usr/local/www/system_certmanager.php:222
+#: usr/local/www/system_certmanager.php:741
+#: usr/local/www/system_crlmanager.php:380
+#: usr/local/www/system_usermanager.php:220
+#: usr/local/www/system_usermanager.php:839
+#: usr/local/www/vpn_ipsec_phase1.php:852
+#: usr/local/www/vpn_ipsec_phase2.php:807
+msgid "Lifetime"
+msgstr "Yaşam süresi"
+
+#: usr/local/www/system_camanager.php:185
+#: usr/local/www/system_camanager.php:201
+#: usr/local/www/system_certmanager.php:223
+#: usr/local/www/system_certmanager.php:238
+msgid "Distinguished name Country Code"
+msgstr "Ayrılmış isim Ülke Kodu"
+
+#: usr/local/www/system_camanager.php:186
+#: usr/local/www/system_camanager.php:202
+#: usr/local/www/system_certmanager.php:224
+#: usr/local/www/system_certmanager.php:239
+msgid "Distinguished name State or Province"
+msgstr "Ayrılmış isim Eyalet"
+
+#: usr/local/www/system_camanager.php:187
+#: usr/local/www/system_camanager.php:203
+#: usr/local/www/system_certmanager.php:225
+#: usr/local/www/system_certmanager.php:240
+msgid "Distinguished name City"
+msgstr "Ayrılmış isim Şehir"
+
+#: usr/local/www/system_camanager.php:188
+#: usr/local/www/system_camanager.php:204
+#: usr/local/www/system_certmanager.php:226
+#: usr/local/www/system_certmanager.php:241
+msgid "Distinguished name Organization"
+msgstr "Ayrılmış isim Firma"
+
+#: usr/local/www/system_camanager.php:189
+#: usr/local/www/system_camanager.php:205
+#: usr/local/www/system_certmanager.php:227
+#: usr/local/www/system_certmanager.php:242
+msgid "Distinguished name Email Address"
+msgstr "Ayrılmış isim E-posta Adresi"
+
+#: usr/local/www/system_camanager.php:190
+#: usr/local/www/system_camanager.php:206
+#: usr/local/www/system_certmanager.php:228
+#: usr/local/www/system_certmanager.php:243
+msgid "Distinguished name Common Name"
+msgstr "Ayrılmış isim Genel Ad"
+
+#: usr/local/www/system_camanager.php:198
+#: usr/local/www/system_camanager.php:447
+msgid "Signing Certificate Authority"
+msgstr "İşaretleyen Sertifika Otoritesi"
+
+#: usr/local/www/system_camanager.php:223
+#: usr/local/www/system_certmanager.php:311
+#: usr/local/www/system_certmanager.php:316
+msgid "Please select a valid Key Length."
+msgstr "Geçerli anahtar uzunlığını seçiniz."
+
+#: usr/local/www/system_camanager.php:225
+#: usr/local/www/system_certmanager.php:313
+#: usr/local/www/system_certmanager.php:318
+msgid "Please select a valid Digest Algorithm."
+msgstr "Geçerli Özet Algoritması' nı seçiniz."
+
+#: usr/local/www/system_camanager.php:358
+#: usr/local/www/system_certmanager.php:584
+#: usr/local/www/system_crlmanager.php:287
+msgid "CAs"
+msgstr "CA'lar"
+
+#: usr/local/www/system_camanager.php:359
+#: usr/local/www/system_camanager.php:596
+#: usr/local/www/system_certmanager.php:585
+#: usr/local/www/system_crlmanager.php:288
+#: usr/local/www/system_crlmanager.php:543
+msgid "Certificates"
+msgstr "Sertifikalar"
+
+#: usr/local/www/system_camanager.php:360
+#: usr/local/www/system_certmanager.php:586
+#: usr/local/www/system_crlmanager.php:289
+msgid "Certificate Revocation"
+msgstr "Sertifika İptal"
+
+#: usr/local/www/system_camanager.php:386
+#: usr/local/www/system_certmanager.php:601
+#: usr/local/www/system_crlmanager.php:304
+msgid "Method"
+msgstr "Yöntem"
+
+#: usr/local/www/system_camanager.php:408
+msgid "Existing Certificate Authority"
+msgstr "Varolan Sertifika Otoritesi"
+
+#: usr/local/www/system_camanager.php:416
+#: usr/local/www/system_certmanager.php:641
+msgid "Paste a certificate in X.509 PEM format here."
+msgstr "Sertifikayı X.509 PEM formatında bu alana yapıştırınız."
+
+#: usr/local/www/system_camanager.php:420
+msgid "Certificate Private Key"
+msgstr "Sertifika Özel Anahtarı"
+
+#: usr/local/www/system_camanager.php:420
+msgid "(optional)"
+msgstr "(isteğe bağlı)"
+
+#: usr/local/www/system_camanager.php:424
+msgid ""
+"Paste the private key for the above certificate here. This is optional in "
+"most cases, but required if you need to generate a Certificate Revocation "
+"List (CRL)."
+msgstr ""
+"Üsteki sertifikanın özel anahtarını buraya yapıştırın. Çoğu durumda isteğe "
+"bağlıdır ama eğer Sertifika İptal Listesi (CRL) oluşturmak istiyorsanız "
+"zorunludur."
+
+#: usr/local/www/system_camanager.php:430
+msgid "Serial for next certificate"
+msgstr "Sonraki sertifika için seri numarası"
+
+#: usr/local/www/system_camanager.php:433
+msgid ""
+"Enter a decimal number to be used as the serial number for the next "
+"certificate to be created using this CA."
+msgstr ""
+"Sonraki oluşturulacak sertifika için numaralardan oluşan bir seri numarası "
+"giriniz, bu oluşturulan CA'da kullanılacak."
+
+#: usr/local/www/system_camanager.php:444
+msgid "Internal Certificate Authority"
+msgstr "İç Sertifika Otoritesi"
+
+#: usr/local/www/system_camanager.php:476
+#: usr/local/www/system_certmanager.php:704 usr/local/www/vpn_ipsec.php:363
+#: usr/local/www/vpn_ipsec.php:517 usr/local/www/vpn_ipsec_phase2.php:757
+#: usr/local/www/vpn_openvpn_server.php:1034
+msgid "bits"
+msgstr "bit"
+
+#: usr/local/www/system_camanager.php:480
+#: usr/local/www/system_certmanager.php:708
+#: usr/local/www/system_certmanager.php:884
+msgid "Digest Algorithm"
+msgstr "Özet Algoritması"
+
+#: usr/local/www/system_camanager.php:492
+#: usr/local/www/system_certmanager.php:720
+#: usr/local/www/system_certmanager.php:896
+msgid ""
+"NOTE: It is recommended to use an algorithm stronger than SHA1 when possible."
+msgstr ""
+"NOT: Burada mümkünse SHA1 den daha güçlü bir algoritma kullanılması tavsiye "
+"edilir."
+
+#: usr/local/www/system_camanager.php:499
+#: usr/local/www/system_certmanager.php:744
+#: usr/local/www/system_crlmanager.php:383
+msgid "days"
+msgstr "gün"
+
+#: usr/local/www/system_camanager.php:507
+#: usr/local/www/system_certmanager.php:752
+#: usr/local/www/system_certmanager.php:904
+msgid "Country Code"
+msgstr "Ülke Kodu"
+
+#: usr/local/www/system_camanager.php:522
+#: usr/local/www/system_certmanager.php:758
+#: usr/local/www/system_certmanager.php:919
+msgid "State or Province"
+msgstr "Eyalet"
+
+#: usr/local/www/system_camanager.php:526
+#: usr/local/www/system_camanager.php:536
+#: usr/local/www/system_camanager.php:546
+#: usr/local/www/system_camanager.php:556
+#: usr/local/www/system_camanager.php:566
+msgid "ex:"
+msgstr "örn:"
+
+#: usr/local/www/system_camanager.php:528
+#: usr/local/www/system_certmanager.php:925
+msgid "Texas"
+msgstr "Teksas"
+
+#: usr/local/www/system_camanager.php:532
+#: usr/local/www/system_certmanager.php:764
+#: usr/local/www/system_certmanager.php:929
+msgid "City"
+msgstr "Şehir"
+
+#: usr/local/www/system_camanager.php:538
+#: usr/local/www/system_certmanager.php:935
+msgid "Austin"
+msgstr "Austin"
+
+#: usr/local/www/system_camanager.php:542
+#: usr/local/www/system_certmanager.php:770
+#: usr/local/www/system_certmanager.php:939
+msgid "Organization"
+msgstr "Kurum"
+
+#: usr/local/www/system_camanager.php:548
+#: usr/local/www/system_certmanager.php:945
+msgid "My Company Inc."
+msgstr "Firmam Ltd. Şti."
+
+#: usr/local/www/system_camanager.php:558
+msgid "admin@mycompany.com"
+msgstr "admin@sirketim.com"
+
+#: usr/local/www/system_camanager.php:568
+msgid "internal-ca"
+msgstr "iç sertifika"
+
+#: usr/local/www/system_camanager.php:594
+#: usr/local/www/system_crlmanager.php:542
+msgid "Internal"
+msgstr "iç"
+
+#: usr/local/www/system_camanager.php:595
+#: usr/local/www/system_certmanager.php:1084
+msgid "Issuer"
+msgstr "Sağlayıcı"
+
+#: usr/local/www/system_camanager.php:597
+#: usr/local/www/system_certmanager.php:1085
+msgid "Distinguished Name"
+msgstr "Ayrılmış İsim"
+
+#: usr/local/www/system_camanager.php:608
+#: usr/local/www/system_certmanager.php:1100
+msgid "self-signed"
+msgstr "kendinden imzalı"
+
+#: usr/local/www/system_camanager.php:610
+#: usr/local/www/system_certmanager.php:1102
+msgid "external"
+msgstr "dış"
+
+#: usr/local/www/system_camanager.php:656
+#: usr/local/www/system_certmanager.php:1148
+msgid "Valid From"
+msgstr "İtibaren geçerli"
+
+#: usr/local/www/system_camanager.php:661
+#: usr/local/www/system_certmanager.php:1153
+msgid "Valid Until"
+msgstr "Geçerlilik Tarihi"
+
+#: usr/local/www/system_camanager.php:668
+msgid "edit CA"
+msgstr "CA düzenle"
+
+#: usr/local/www/system_camanager.php:671
+msgid "export CA cert"
+msgstr "sertifikayı dışarı ver"
+
+#: usr/local/www/system_camanager.php:675
+msgid "export CA private key"
+msgstr "özel anahtarı dışarı ver"
+
+#: usr/local/www/system_camanager.php:678
+msgid ""
+"Do you really want to delete this Certificate Authority and its CRLs, and "
+"unreference any associated certificates?"
+msgstr ""
+"Bu sertifika otoritesini ve bununla ilişkilendirilmiş sertifikaları silmek "
+"istediğinize emin misiniz?"
+
+#: usr/local/www/system_camanager.php:679
+msgid "delete ca"
+msgstr "CA sil"
+
+#: usr/local/www/system_camanager.php:691
+msgid "add or import ca"
+msgstr "CA ekle veya içeri aktar"
+
+#: usr/local/www/system_camanager.php:691
+msgid "add ca"
+msgstr "CA ekle"
+
+#: usr/local/www/system_camanager.php:698
+msgid "Additional trusted Certificate Authorities can be added here."
+msgstr "Ek Güvenilen Sertifika Otoriteleri burada eklenebilir."
+
+#: usr/local/www/system_certmanager.php:45
+msgid "Import an existing Certificate"
+msgstr "Varolan bir sertifikayı içeri aktar"
+
+#: usr/local/www/system_certmanager.php:46
+msgid "Create an internal Certificate"
+msgstr "İç sertifika oluştur"
+
+#: usr/local/www/system_certmanager.php:47
+msgid "Create a Certificate Signing Request"
+msgstr "Sertifika İmzalama Talebi oluştur"
+
+#: usr/local/www/system_certmanager.php:58
+msgid "Certificate Manager"
+msgstr "Sertifika Yöneticisi"
+
+#: usr/local/www/system_certmanager.php:66
+msgid "Choose an existing certificate"
+msgstr "Varolan sertifika seç"
+
+#: usr/local/www/system_certmanager.php:106
+#, php-format
+msgid "Certificate %s successfully deleted"
+msgstr "% sertifikası başarıyla silindi"
+
+#: usr/local/www/system_certmanager.php:208
+msgid "Key data"
+msgstr "Anahtar veri"
+
+#: usr/local/www/system_certmanager.php:219
+#: usr/local/www/system_certmanager.php:675
+#: usr/local/www/system_usermanager.php:218
+#: usr/local/www/system_usermanager.php:801
+msgid "Certificate authority"
+msgstr "Sertifika otoritesi"
+
+#: usr/local/www/system_certmanager.php:221
+#: usr/local/www/system_certmanager.php:724
+msgid "Certificate Type"
+msgstr "Sertifika Türü"
+
+#: usr/local/www/system_certmanager.php:248
+msgid "Existing Certificate Choice"
+msgstr "Varolan Sertifika Seçimi"
+
+#: usr/local/www/system_certmanager.php:421
+msgid "Final Certificate data"
+msgstr "Son Sertifika verisi"
+
+#: usr/local/www/system_certmanager.php:441
+#, php-format
+msgid "The certificate modulus does not match the signing request modulus."
+msgstr "Sertifika konusu imzalama isteği konusuyla eşleşmiyor."
+
+#: usr/local/www/system_certmanager.php:633
+msgid "Import Certificate"
+msgstr "Sertifika İçeri Aktar"
+
+#: usr/local/www/system_certmanager.php:645
+msgid "Private key data"
+msgstr "Özel anahtar verisi"
+
+#: usr/local/www/system_certmanager.php:649
+msgid "Paste a private key in X.509 PEM format here."
+msgstr "Özel anahtarı x.509 PEM formatında yapıştırınız."
+
+#: usr/local/www/system_certmanager.php:659
+msgid "Internal Certificate"
+msgstr "İç Sertifika"
+
+#: usr/local/www/system_certmanager.php:666
+msgid "No internal Certificate Authorities have been defined. You must"
+msgstr ""
+"İç Sertifika sunucusu tanımlanmadı. Bir iç sertifika oluşturmadan önce bir "
+
+#: usr/local/www/system_certmanager.php:668
+msgid "an internal CA before creating an internal certificate."
+msgstr "manız gerekir."
+
+#: usr/local/www/system_certmanager.php:737
+msgid ""
+"Type of certificate to generate. Used for placing restrictions on the usage "
+"of the generated certificate."
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:782
+#: usr/local/www/system_certmanager.php:955
+msgid "webadmin@mycompany.com"
+msgstr "webadmin@sirketim.com"
+
+#: usr/local/www/system_certmanager.php:796
+#: usr/local/www/system_certmanager.php:965
+msgid "www.example.com"
+msgstr "www.test.com"
+
+#: usr/local/www/system_certmanager.php:800
+msgid "Alternative Names"
+msgstr "Alternatif İsimler"
+
+#: usr/local/www/system_certmanager.php:863
+msgid "External Signing Request"
+msgstr "Dış İmzalama Talebi"
+
+#: usr/local/www/system_certmanager.php:978
+msgid "Choose an Existing Certificate"
+msgstr "Varolan Sertifikayı Seç"
+
+#: usr/local/www/system_certmanager.php:981
+msgid "Existing Certificates"
+msgstr "Mevcut Sertifikalar"
+
+#: usr/local/www/system_certmanager.php:1039
+msgid "Complete Signing Request"
+msgstr "Tam İmzalama Talebi"
+
+# 95%
+#: usr/local/www/system_certmanager.php:1043
+msgid "Signing request data"
+msgstr "İmzalama talep verisi"
+
+#: usr/local/www/system_certmanager.php:1047
+msgid ""
+"Copy the certificate signing data from here and forward it to your "
+"certificate authority for signing."
+msgstr ""
+"Sertifika imzalama verisini buradan kopyalayın ve imzalama için sertifika "
+"otoritenize gönderin."
+
+# 95%
+#: usr/local/www/system_certmanager.php:1051
+msgid "Final certificate data"
+msgstr "Son sertifika verisi"
+
+#: usr/local/www/system_certmanager.php:1055
+msgid "Paste the certificate received from your certificate authority here."
+msgstr "Sertifika otoritesinden alınan sertifikayı buraya yapıştırın."
+
+#: usr/local/www/system_certmanager.php:1086
+#: usr/local/www/system_crlmanager.php:544
+msgid "In Use"
+msgstr "Kullanımda"
+
+#: usr/local/www/system_certmanager.php:1108
+msgid "external - signature pending"
+msgstr "dış - imza bekleniyor"
+
+#: usr/local/www/system_certmanager.php:1183
+#: usr/local/www/system_usermanager.php:742
+msgid "export cert"
+msgstr "sertifikayı dışarı aktar"
+
+#: usr/local/www/system_certmanager.php:1183
+#: usr/local/www/system_certmanager.php:1186
+msgid "export ca"
+msgstr "sertifika otoritesini dışarı aktar"
+
+#: usr/local/www/system_certmanager.php:1186
+msgid "export key"
+msgstr "anahtarı dışarı aktar"
+
+#: usr/local/www/system_certmanager.php:1189
+msgid "export ca cert+user cert+user cert key in .p12 format"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1192
+msgid "Do you really want to delete this Certificate?"
+msgstr "Bu sertifikayı silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_certmanager.php:1193
+#: usr/local/www/system_usermanager.php:749
+msgid "delete cert"
+msgstr "sertifikayı sil"
+
+#: usr/local/www/system_certmanager.php:1199
+msgid "update csr"
+msgstr "CSRyi güncelle"
+
+#: usr/local/www/system_certmanager.php:1212
+msgid "add or import certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1212
+msgid "add certificate"
+msgstr ""
+
+#: usr/local/www/system_certmanager.php:1218
+msgid "Note: You can only delete a certificate if it is not currently in use."
+msgstr "Not: Sadece kullanımda olmayan sertifikaları silebilirsiniz."
+
+#: usr/local/www/system_crlmanager.php:47
+msgid "Certificate Revocation List Manager"
+msgstr "Sertifika İptal Listesi Yöneticisi"
+
+#: usr/local/www/system_crlmanager.php:50
+msgid "Create an internal Certificate Revocation List"
+msgstr "İç Sertifika İptal Listesi oluştur"
+
+#: usr/local/www/system_crlmanager.php:51
+msgid "Import an existing Certificate Revocation List"
+msgstr "Sertifika İptal Listesini içeri aktar"
+
+#: usr/local/www/system_crlmanager.php:88
+msgid "Invalid CRL reference."
+msgstr "Geçersiz Sertifika İptal Listesi referansı."
+
+#: usr/local/www/system_crlmanager.php:94
+#, php-format
+msgid "Certificate Revocation List %s is in use and cannot be deleted"
+msgstr "Sertifika İptal Listesi %s kullanımda ve silinemez"
+
+#: usr/local/www/system_crlmanager.php:100
+#, php-format
+msgid "Certificate Revocation List %s successfully deleted"
+msgstr "Sertifika İptal Listesi %s başarıyla silindi"
+
+#: usr/local/www/system_crlmanager.php:139
+msgid "Both the Certificate and CRL must be specified."
+msgstr "Sertifika ve İptal listesi belirtilmelidir."
+
+#: usr/local/www/system_crlmanager.php:143
+msgid "CA mismatch between the Certificate and CRL. Unable to Revoke."
+msgstr "Sertifika ve Sertifika İptal listesinde uyumsuzluk. İptal edilemiyor."
+
+#: usr/local/www/system_crlmanager.php:146
+msgid "Cannot revoke certificates for an imported/external CRL."
+msgstr "İçeriye aktarılmış veya dış CRL sertifikaları iptal edilemez."
+
+#: usr/local/www/system_crlmanager.php:178
+#: usr/local/www/system_crlmanager.php:180
+#, php-format
+msgid "Deleted Certificate %s from CRL %s"
+msgstr "CRL %1$s içindeki %2$s sertifikası silindi"
+
+#: usr/local/www/system_crlmanager.php:182
+#, php-format
+msgid "Failed to delete Certificate %s from CRL %s"
+msgstr "CRL %1$s içindeki %2$s sertifikası silinemedi"
+
+#: usr/local/www/system_crlmanager.php:196
+msgid "Certificate Revocation List data"
+msgstr "Sertifika İptal Listesi verisi"
+
+#: usr/local/www/system_crlmanager.php:203
+#: usr/local/www/system_crlmanager.php:333
+#: usr/local/www/vpn_ipsec_phase1.php:181
+#: usr/local/www/vpn_openvpn_client.php:258
+#: usr/local/www/vpn_openvpn_server.php:333
+msgid "Certificate Authority"
+msgstr "Sertifika Otoritesi"
+
+#: usr/local/www/system_crlmanager.php:359
+msgid "Existing Certificate Revocation List"
+msgstr "Varolan Sertifika İptal Listesi"
+
+#: usr/local/www/system_crlmanager.php:363
+#: usr/local/www/system_crlmanager.php:423
+msgid "CRL data"
+msgstr "CRL verisi"
+
+#: usr/local/www/system_crlmanager.php:367
+#: usr/local/www/system_crlmanager.php:427
+msgid "Paste a Certificate Revocation List in X.509 CRL format here."
+msgstr "Sertifika İptal Listesini x.509 CRL formatında bu alana yapıştırınız."
+
+#: usr/local/www/system_crlmanager.php:377
+msgid "Internal Certificate Revocation List"
+msgstr "İç Sertifika İptal Listesi"
+
+#: usr/local/www/system_crlmanager.php:384
+msgid "Default: 9999"
+msgstr "Varsayılan: 9999"
+
+#: usr/local/www/system_crlmanager.php:388
+msgid "Serial"
+msgstr "Seri"
+
+#: usr/local/www/system_crlmanager.php:392
+msgid "Default: 0"
+msgstr "Varsayılan: 0"
+
+#: usr/local/www/system_crlmanager.php:414
+msgid "Edit Imported Certificate Revocation List"
+msgstr "İçeriye aktarılan Sertifika İptal Listesini düzenle"
+
+#: usr/local/www/system_crlmanager.php:447
+msgid "Currently Revoked Certificates for CRL"
+msgstr "CRL iptal edilmiş sertifikalar listesi"
+
+#: usr/local/www/system_crlmanager.php:451
+msgid "Certificate Name"
+msgstr "Sertifika Adı"
+
+#: usr/local/www/system_crlmanager.php:452
+msgid "Revocation Reason"
+msgstr "İptal Sebebi"
+
+#: usr/local/www/system_crlmanager.php:453
+msgid "Revoked At"
+msgstr "İptal Zamanı"
+
+#: usr/local/www/system_crlmanager.php:462
+msgid "No Certificates Found for this CRL."
+msgstr "Sertifika İptal Listesinde Sertifika bulunamadı."
+
+#: usr/local/www/system_crlmanager.php:481
+msgid "Do you really want to delete this Certificate from the CRL?"
+msgstr ""
+"Bu sertifikayı Sertifika İptal Listesinden silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_crlmanager.php:482
+msgid "Delete this certificate from the CRL "
+msgstr "Bu sertifikayı sertifika iptal listesinden sil "
+
+#: usr/local/www/system_crlmanager.php:499
+msgid "No Certificates Found for this CA."
+msgstr "Sertifika otoritesi için sertifika bulunamadı."
+
+#: usr/local/www/system_crlmanager.php:506
+msgid "Choose a Certificate to Revoke"
+msgstr "İptal edilecek sertifikayı seçiniz"
+
+#: usr/local/www/system_crlmanager.php:515
+msgid "Reason"
+msgstr "Sebep"
+
+#: usr/local/www/system_crlmanager.php:552
+msgid "Additional Certificate Revocation Lists can be added here."
+msgstr "Ek Sertifika İptal Listelerini buradan ekleyebilirsiniz."
+
+#: usr/local/www/system_crlmanager.php:589
+#, php-format
+msgid "Add or Import CRL for %s"
+msgstr "%s den CRL içeri aktar yada ekle"
+
+#: usr/local/www/system_crlmanager.php:589
+#: usr/local/www/system_crlmanager.php:593
+msgid "add crl"
+msgstr "CRL ekle"
+
+#: usr/local/www/system_crlmanager.php:593
+#, php-format
+msgid "Import CRL for %s"
+msgstr "%s den CRL içeri aktar"
+
+#: usr/local/www/system_crlmanager.php:613
+msgid "Export CRL"
+msgstr "CRL dışarı aktar"
+
+#: usr/local/www/system_crlmanager.php:617
+#: usr/local/www/system_crlmanager.php:621
+msgid "Edit CRL"
+msgstr "CRL düzenle"
+
+#: usr/local/www/system_crlmanager.php:625
+msgid "Do you really want to delete this Certificate Revocation List?"
+msgstr "Sertifika İptal Listesini silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_crlmanager.php:626
+msgid "Delete CRL"
+msgstr "CRL sil"
+
+#: usr/local/www/system_firmware.php:83
+msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
+msgstr "Yüklenen dosya php.ini upload_max_filesize yönergesini aşıyor"
+
+#: usr/local/www/system_firmware.php:85
+msgid ""
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
+"the HTML form"
+msgstr "Yüklenen dosya HTML de belirtilen MAX_FILE_SIZE ' yi aşıyor"
+
+#: usr/local/www/system_firmware.php:87
+msgid "The uploaded file was only partially uploaded"
+msgstr "Yüklenen dosya sadece kısmen yüklendi"
+
+#: usr/local/www/system_firmware.php:89
+msgid "No file was uploaded"
+msgstr "Yüklenen dosya yok"
+
+#: usr/local/www/system_firmware.php:91
+msgid "Missing a temporary folder"
+msgstr "Kayıp geçici klasör"
+
+#: usr/local/www/system_firmware.php:93
+msgid "Failed to write file to disk"
+msgstr "Disk e dosya yazma başarısız"
+
+#: usr/local/www/system_firmware.php:95
+msgid "File upload stopped by extension"
+msgstr "Dosya yüklemesi uzantı tarafından durduruldu"
+
+#: usr/local/www/system_firmware.php:97
+msgid "Unknown upload error"
+msgstr "Bilinmeyen yükleme hatası"
+
+#: usr/local/www/system_firmware.php:103 usr/local/www/system_firmware.php:240
+#: usr/local/www/system_firmware_auto.php:81
+#: usr/local/www/system_firmware_check.php:65
+#: usr/local/www/system_firmware_restorefullbackup.php:126
+#: usr/local/www/system_firmware_settings.php:125
+msgid "Manual Update"
+msgstr "Elle Güncelleme"
+
+#: usr/local/www/system_firmware.php:108
+msgid ""
+"An upgrade is currently in progress.<p>The firewall will reboot when the "
+"operation is complete."
+msgstr ""
+"Güncelleme işlemi devam etmekte.<p>Güvenlik Duvarı işlem bittikten sonra "
+"yeniden başlayacak."
+
+#: usr/local/www/system_firmware.php:129
+msgid "Upgrade"
+msgstr "Yükselt"
+
+#: usr/local/www/system_firmware.php:148
+msgid "The uploaded image file is not for this platform."
+msgstr "Yüklenen imaj dosyası bu platform için değil."
+
+#: usr/local/www/system_firmware.php:151
+msgid "Image upload failed (out of memory?)"
+msgstr "İmaj yüklemesi başarısız (bellek yetersizliği?)"
+
+#: usr/local/www/system_firmware.php:162
+#: usr/local/www/system_firmware_auto.php:209
+msgid "The digital signature on this image is invalid."
+msgstr "İmajın dijital imzası geçerli değil."
+
+#: usr/local/www/system_firmware.php:164
+#: usr/local/www/system_firmware_auto.php:212
+msgid "This image is not digitally signed."
+msgstr "İmaj dijital olarak imzalanmamış."
+
+#: usr/local/www/system_firmware.php:166
+#: usr/local/www/system_firmware_auto.php:216
+msgid "There has been an error verifying the signature on this image."
+msgstr "İmaj imzasının doğrulanması sırasında hata oluştu."
+
+#: usr/local/www/system_firmware.php:169
+#: usr/local/www/system_firmware_auto.php:231
+msgid "The image file is corrupt."
+msgstr "Belirtilen imaj dosyası bozuk."
+
+#: usr/local/www/system_firmware.php:182
+msgid ""
+"The firmware is now being updated. The firewall will reboot automatically."
+msgstr ""
+"Üretici yazılımı şimdi yükleniyor. Güvenlik Duvarı otomatik olarak yeniden "
+"başlayacak."
+
+#: usr/local/www/system_firmware.php:196
+#, php-format
+msgid "Firmware image missing or other error, please try again %s."
+msgstr ""
+"Üretici yazılımı imajı kayıp yada diğer hata, lütfen tekrar deneyin %s."
+
+#: usr/local/www/system_firmware.php:222
+msgid ""
+"This means that the image you uploaded is not an official/supported image "
+"and may lead to unexpected behavior or security compromises. Only install "
+"images that come from sources that you trust, and make sure that the image "
+"has not been tampered with."
+msgstr ""
+"Yüklediğiniz imaj orjinal ya da desteklenen bir imaj değil bunun uygulanması "
+"sistemde hata ve güvenlik sorunlarına yol açabilir. Kaynak dosyası "
+"değiştirilmiş tahrib edilmiş imajları yüklemekten kaçının sadece güvenilir "
+"kaynaklardan gelen imajları yükleyin."
+
+#: usr/local/www/system_firmware.php:226
+msgid "Do you want to install this image anyway (on your own risk)?"
+msgstr "Yine de bu imajı kurmak istermisiniz (risk size ait)?"
+
+#: usr/local/www/system_firmware.php:241
+#: usr/local/www/system_firmware_auto.php:62
+#: usr/local/www/system_firmware_auto.php:82
+#: usr/local/www/system_firmware_check.php:50
+#: usr/local/www/system_firmware_check.php:66
+#: usr/local/www/system_firmware_restorefullbackup.php:127
+#: usr/local/www/system_firmware_settings.php:126
+msgid "Auto Update"
+msgstr "Otomatik Güncelle"
+
+#: usr/local/www/system_firmware.php:242
+#: usr/local/www/system_firmware_auto.php:83
+#: usr/local/www/system_firmware_check.php:67
+#: usr/local/www/system_firmware_restorefullbackup.php:128
+#: usr/local/www/system_firmware_settings.php:127
+msgid "Updater Settings"
+msgstr "Güncelleme Ayarları"
+
+#: usr/local/www/system_firmware.php:244
+#: usr/local/www/system_firmware_auto.php:85
+#: usr/local/www/system_firmware_check.php:69
+#: usr/local/www/system_firmware_restorefullbackup.php:130
+#: usr/local/www/system_firmware_settings.php:129
+msgid "Restore Full Backup"
+msgstr "Tam Yedeğe Geri Dön"
+
+#: usr/local/www/system_firmware.php:254
+msgid "Invoke"
+msgstr "Çalıştır"
+
+#: usr/local/www/system_firmware.php:254
+msgid "Manual Upgrade"
+msgstr "Elle Yükseltme"
+
+#: usr/local/www/system_firmware.php:261
+msgid "Enable firmware upload"
+msgstr "Üretici yazılımı yüklemeyi etkinleştir"
+
+#: usr/local/www/system_firmware.php:263
+#, php-format
+msgid "Click \"Enable firmware upload\" to begin."
+msgstr "\"Üretici yazılımı yüklemeyi etkinleştir\" tıklayarak başlayın."
+
+#: usr/local/www/system_firmware.php:266
+msgid "Disable firmware upload"
+msgstr "Üretici yazılımı yüklemeyi kapat"
+
+#: usr/local/www/system_firmware.php:282
+#: usr/local/www/system_firmware_check.php:106
+msgid "Perform full backup prior to upgrade"
+msgstr "Yükseltme yapmadan önce tam yedek alın"
+
+#: usr/local/www/system_firmware.php:285
+msgid "Upgrade firmware"
+msgstr "Üretici yazılımı yükseltme"
+
+#: usr/local/www/system_firmware.php:286
+msgid "Click \"Upgrade firmware\" to start the upgrade process."
+msgstr ""
+"\"Üretici yazılımı yükseltme\" yi tıklayarak yükseltme işlemini başlatın."
+
+#: usr/local/www/system_firmware.php:288
+msgid "You must reboot the system before you can upgrade the firmware."
+msgstr "Üretici yazılımı yüklemeden önce sistemi yeniden başlatmalısınız."
+
+#: usr/local/www/system_firmware.php:299
+msgid "Warning:"
+msgstr "Uyarı:"
+
+#: usr/local/www/system_firmware.php:302
+msgid ""
+"DO NOT abort the firmware upgrade once it has started. The firewall will "
+"reboot automatically after storing the new firmware. The configuration will "
+"be maintained."
+msgstr ""
+"Başladıktan sonra ürün yükseltmesini DURDURMAYIN. Güvenlik duvarı yeni "
+"Üretici yazılımı yüklendikten sonra otomatik olarak tekrar başlayacaktır. "
+"Yapılandırma korunur."
+
+#: usr/local/www/system_firmware_auto.php:122
+msgid "Beginning firmware upgrade"
+msgstr "Üretici yazılımı yükseltme başlıyor"
+
+#: usr/local/www/system_firmware_auto.php:141
+msgid "Downloading current version information"
+msgstr "Güncel sürüm bilgisi indiriliyor"
+
+#: usr/local/www/system_firmware_auto.php:156
+#: usr/local/www/system_firmware_auto.php:165
+#: usr/local/www/system_firmware_check.php:143
+msgid "Unable to check for updates."
+msgstr "Güncellemeler kontrol edilemiyor."
+
+#: usr/local/www/system_firmware_auto.php:170
+msgid "Downloading updates"
+msgstr "Güncellemeler indiriliyor"
+
+#: usr/local/www/system_firmware_auto.php:180
+msgid "download complete."
+msgstr "indirme tamamlandı."
+
+#: usr/local/www/system_firmware_auto.php:182
+#: usr/local/www/system_firmware_check.php:161
+msgid "You are on the latest version."
+msgstr "En son sürümü kullanıyorsunuz."
+
+#: usr/local/www/system_firmware_auto.php:222
+msgid ""
+"Update cannot continue. You can disable this check on the Updater Settings "
+"tab."
+msgstr ""
+"Güncelleme devam edemiyor. Bu seçeneği Güncelleme Ayarları başlığından "
+"devre dışı bırakabilirsiniz."
+
+#: usr/local/www/system_firmware_auto.php:227
+msgid ""
+"Upgrade Image does not contain a signature but the system has been "
+"configured to allow unsigned images. One moment please..."
+msgstr ""
+"Yükseltme imajı bir imza içermiyor ama sistem imzasız imajlara izin verecek "
+"şekilde ayarlanmış durumda. Bir saniye..."
+
+#: usr/local/www/system_firmware_auto.php:232
+msgid "Update cannot continue"
+msgstr "Güncelleme devam edemiyor"
+
+#: usr/local/www/system_firmware_auto.php:243
+msgid "Downloading complete but sha256 does not match."
+msgstr "İndirme tamamlandı ama sha256 eşleşmiyor."
+
+#: usr/local/www/system_firmware_auto.php:244
+msgid "Auto upgrade aborted."
+msgstr "Otomatik yükseltme iptal edildi."
+
+#: usr/local/www/system_firmware_auto.php:244
+msgid "Downloaded SHA256"
+msgstr "SHA256 indirildi"
+
+#: usr/local/www/system_firmware_auto.php:244
+msgid "Needed SHA256"
+msgstr "SHA256 gerekiyor"
+
+#: usr/local/www/system_firmware_auto.php:246
+msgid "is now upgrading."
+msgstr "yükseltme yapılıyor."
+
+#: usr/local/www/system_firmware_auto.php:246
+msgid "The firewall will reboot once the operation is completed."
+msgstr "İşlem tamamlanınca güvenlik duvarı yeniden başlatılacak."
+
+#: usr/local/www/system_firmware_auto.php:268
+msgid "Auto Update Download Status"
+msgstr "Otomatik Güncelleme İndirme Durumu"
+
+#: usr/local/www/system_firmware_auto.php:270
+msgid "Current Version"
+msgstr "Mevcut Sürüm"
+
+#: usr/local/www/system_firmware_auto.php:271
+msgid "Latest Version"
+msgstr "Son Sürüm "
+
+#: usr/local/www/system_firmware_auto.php:272
+msgid "File size"
+msgstr "Dosya boyutu"
+
+#: usr/local/www/system_firmware_auto.php:273
+msgid "Downloaded"
+msgstr "İndirilen"
+
+#: usr/local/www/system_firmware_auto.php:274
+msgid "Percent"
+msgstr "Yüzde"
+
+#: usr/local/www/system_firmware_check.php:109
+msgid "Invoke Auto Upgrade"
+msgstr "Otomatik Yükseltmeyi Çalıştır"
+
+#: usr/local/www/system_firmware_check.php:127
+msgid "Downloading new version information..."
+msgstr "Yeni sürüm bilgisi indiriliyor..."
+
+#: usr/local/www/system_firmware_check.php:145
+msgid "Could not contact custom update server."
+msgstr "Özel güncelleme sunucusuna bağlanılamadı."
+
+#: usr/local/www/system_firmware_check.php:147
+#, php-format
+msgid "Could not contact %1$s update server %2$s%3$s"
+msgstr "%1$s özel güncelleme sunucusuna %2$s%3$s bağlanılamadı"
+
+#: usr/local/www/system_firmware_check.php:149
+msgid "Obtaining current version information..."
+msgstr "Güncel sürüm bilgisi alınıyor..."
+
+#: usr/local/www/system_firmware_check.php:186
+msgid "A new version is now available"
+msgstr "Yeni bir sürüm var"
+
+#: usr/local/www/system_firmware_check.php:187
+msgid "Current version"
+msgstr "Mevcut sürüm"
+
+#: usr/local/www/system_firmware_check.php:189
+msgid "NanoBSD Size"
+msgstr "NanoBSD Boyutu"
+
+#: usr/local/www/system_firmware_check.php:191
+msgid "Built On"
+msgstr "İnşa"
+
+#: usr/local/www/system_firmware_check.php:192
+msgid "New version"
+msgstr "Yeni sürüm"
+
+#: usr/local/www/system_firmware_check.php:193
+msgid "Update source"
+msgstr "Güncelleme kaynağı"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:105
+msgid "Restore full backup"
+msgstr "Tam yedeği geri yükle"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:140
+msgid "Filename"
+msgstr "Dosya ismi"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:163
+msgid "Do you really want to delete this backup?"
+msgstr "Bu yedeği silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_firmware_restorefullbackup.php:175
+msgid "Could not locate any previous backups."
+msgstr "Herhangi bir önceki yedekleme bulamadı."
+
+# 86%
+#: usr/local/www/system_firmware_restorefullbackup.php:183
+msgid "do not restore config.xml."
+msgstr "config.xml dosyası onarılamadı."
+
+#: usr/local/www/system_firmware_restorefullbackup.php:185
+msgid "Restore"
+msgstr "Geri yükle"
+
+#: usr/local/www/system_firmware_settings.php:50
+msgid ""
+"A Firmware Auto Update Base URL must be specified when \"Use an unofficial "
+"server for firmware upgrades\" is enabled."
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:137
+msgid "Firmware Branch"
+msgstr "Üretici yazılımı Dalı"
+
+#: usr/local/www/system_firmware_settings.php:141
+msgid "Default Auto Update URLs"
+msgstr "Varsayılan Otomatik Güncelleme URLleri"
+
+#: usr/local/www/system_firmware_settings.php:161
+#, php-format
+msgid ""
+"Entries denoted by \"Current architecture\" match the architecture of your "
+"current installation, such as %s. Changing architectures during an upgrade "
+"is not recommended, and may require a manual reboot after the update "
+"completes."
+msgstr ""
+"\"Current architecture (güncel yapı)\" ifadesine uyan girdiler sizin "
+"sisteminizde kurulu olan yapıdır, mesela %s gibi. Güncelleme sırasında yapı "
+"değişitirmek önerilmez ve güncelleme tamamlanınca el ile yeniden başlatma "
+"gerekebilir."
+
+#: usr/local/www/system_firmware_settings.php:166
+msgid "Firmware Auto Update URL"
+msgstr "Üretici yazılımı Otomatik Güncelleme URLleri"
+
+#: usr/local/www/system_firmware_settings.php:168
+msgid "Use an unofficial server for firmware upgrades"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:173
+msgid "This is where"
+msgstr "Burada"
+
+#: usr/local/www/system_firmware_settings.php:173
+msgid "will check for newer firmware versions when the"
+msgstr "yeni Üretici yazılımı sürümü kontrolü gerçekleştirir"
+
+#: usr/local/www/system_firmware_settings.php:173
+msgid "System: Firmware: Auto Update"
+msgstr "Sistem: Üretici yazılımı: Otomatik Güncelle"
+
+#: usr/local/www/system_firmware_settings.php:175
+#, php-format
+msgid ""
+"When a custom URL is configured, the system will not verify the image has an "
+"official digital signature"
+msgstr ""
+
+#: usr/local/www/system_firmware_settings.php:183
+msgid "Updates"
+msgstr "Güncellemeler"
+
+#: usr/local/www/system_firmware_settings.php:186
+msgid "Unsigned images"
+msgstr "İmzalanmamış imajlar"
+
+#: usr/local/www/system_firmware_settings.php:190
+msgid ""
+"Allow auto-update firmware images with a missing or invalid digital "
+"signature to be used."
+msgstr ""
+"Dijital olması olmayan veya bozuk olan ürün imajlarının otomatik "
+"güncellenmesine izin ver."
+
+#: usr/local/www/system_firmware_settings.php:194
+msgid "Dashboard check"
+msgstr "Anasayfa kotrol"
+
+#: usr/local/www/system_firmware_settings.php:198
+msgid "Disable the automatic dashboard auto-update check."
+msgstr "Anasayfada otomatik-güncelleme kontrol etmeyi kapat."
+
+#: usr/local/www/system_firmware_settings.php:206
+msgid "Gitsync"
+msgstr "Git senkronizasyonu"
+
+#: usr/local/www/system_firmware_settings.php:209
+msgid "Auto sync on update"
+msgstr "Güncellemede otomatik olarak senkronize et"
+
+#: usr/local/www/system_firmware_settings.php:213
+msgid ""
+"After updating, sync with the following repository/branch before reboot."
+msgstr ""
+"Güncellemeden sonra, yeniden başlatmadan önce aşağıdaki depo/dal ile "
+"senkronize et."
+
+#: usr/local/www/system_firmware_settings.php:225
+msgid "Repository URL"
+msgstr "Depo URLsi"
+
+#: usr/local/www/system_firmware_settings.php:230
+#, php-format
+msgid "The most recently used repository was %s"
+msgstr "En son kullanılan depo URLsi %s"
+
+#: usr/local/www/system_firmware_settings.php:232
+msgid "This will be used if the field is left blank."
+msgstr "Alan boş bırakılır ise bu kullanılacaktır."
+
+#: usr/local/www/system_firmware_settings.php:251
+msgid "Branch name"
+msgstr "Dal adı"
+
+#: usr/local/www/system_firmware_settings.php:256
+#, php-format
+msgid "The most recently used branch was %s"
+msgstr "En son kullanılan dal %s idi"
+
+#: usr/local/www/system_firmware_settings.php:259
+msgid "Usually the branch name is master"
+msgstr "Genellikle dal adı 'master'dır"
+
+#: usr/local/www/system_firmware_settings.php:262
+msgid "Note: Sync will not be performed if a branch is not specified."
+msgstr "Not: Eğer bir dal belirtmezseniz senkronizasyon gerçekleştirilmez."
+
+#: usr/local/www/system_gateway_groups.php:86
+msgid "removed gateway group"
+msgstr "ağ geçidi grubu silindi"
+
+#: usr/local/www/system_gateway_groups.php:112
+#, php-format
+msgid ""
+"The gateway configuration has been changed.%sYou must apply the changes in "
+"order for them to take effect."
+msgstr ""
+"Ağ geçidi yapılandırması değiştirildi.%s Değişiklikleri uygulayarak etkin "
+"hale gelmelerini sağlayabilirsiniz."
+
+#: usr/local/www/system_gateway_groups.php:188
+msgid "Do you really want to delete this gateway group?"
+msgstr "Bu ağ geçidi grubunu silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_gateway_groups.php:206
+msgid ""
+"Remember to use these Gateway Groups in firewall rules in order to enable "
+"load balancing, failover, or policy-based routing. Without rules directing "
+"traffic into the Gateway Groups, they will not be used."
+msgstr ""
+"Yük dengeleme, yük aktarma veya ilke tabanlı yönlendirmeleri kullanabilmek "
+"için güvenlik duvarı kurallarında bu Ağ Geçidi Gruplarını kullanmayı "
+"unutmayın. Trafiği Ağ Geçidi Gruplarına yönlendiren kurallar olmazsa "
+"kullanılmazlar."
+
+#: usr/local/www/system_gateway_groups_edit.php:56
+msgid "Member Down"
+msgstr "Üye Kapalı"
+
+#: usr/local/www/system_gateway_groups_edit.php:57
+msgid "Packet Loss"
+msgstr "Paket Kaybı"
+
+#: usr/local/www/system_gateway_groups_edit.php:58
+msgid "High Latency"
+msgstr "Yüksek Gecikme"
+
+#: usr/local/www/system_gateway_groups_edit.php:59
+msgid "Packet Loss or High Latency"
+msgstr "Paket Kaybı ya da Yüksek Gecikme"
+
+#: usr/local/www/system_gateway_groups_edit.php:91
+msgid "A valid gateway group name must be specified."
+msgstr "Geçerli bir ağ geçidi grup adı belirtilmelidir."
+
+#: usr/local/www/system_gateway_groups_edit.php:94
+#: usr/local/www/system_gateways_edit.php:122
+msgid "The gateway name must not contain invalid characters."
+msgstr "Ağ geçidi adı geçersiz karakterler içermemelidir."
+
+# 87%
+#: usr/local/www/system_gateway_groups_edit.php:103
+msgid "Changing name on a gateway group is not allowed."
+msgstr "Ağ geçidi grubu adının değiştirilmesine izin verilmemektedir."
+
+#: usr/local/www/system_gateway_groups_edit.php:108
+#, php-format
+msgid "A gateway group with this name \"%s\" already exists."
+msgstr "\"%s\" adında bir ağ geçidi grubu sistemde mevcut."
+
+#: usr/local/www/system_gateway_groups_edit.php:125
+#, php-format
+msgid ""
+"A gateway group cannot have the same name with a gateway \"%s\" please "
+"choose another name."
+msgstr ""
+"Bir ağ geçidi grubu ağ geçidi \"%s\" ile aynı ada sahip olamaz. Lütfen başka "
+"bir isim seçin."
+
+#: usr/local/www/system_gateway_groups_edit.php:129
+msgid "No gateway(s) have been selected to be used in this group"
+msgstr "Bu grupta kullanılmak üzere ağ geçit(ler)'i seçilmemiş"
+
+#: usr/local/www/system_gateway_groups_edit.php:153
+msgid "Edit gateway group"
+msgstr "Ağ geçidi grubunu düzenle"
+
+# 75%
+#: usr/local/www/system_gateway_groups_edit.php:232
+msgid "Edit gateway group entry"
+msgstr "Ağ geçidi grup kaydını düzenle"
+
+#: usr/local/www/system_gateway_groups_edit.php:241
+msgid "Gateway Priority"
+msgstr "Ağ Geçidi Önceliği"
+
+#: usr/local/www/system_gateway_groups_edit.php:275
+msgid "Never"
+msgstr "Hiçbir zaman"
+
+#: usr/local/www/system_gateway_groups_edit.php:276
+msgid "Tier 1"
+msgstr "Sıra 1"
+
+#: usr/local/www/system_gateway_groups_edit.php:277
+msgid "Tier 2"
+msgstr "Sıra 2"
+
+#: usr/local/www/system_gateway_groups_edit.php:278
+msgid "Tier 3"
+msgstr "Sıra 3"
+
+#: usr/local/www/system_gateway_groups_edit.php:279
+msgid "Tier 4"
+msgstr "Sıra 4"
+
+#: usr/local/www/system_gateway_groups_edit.php:280
+msgid "Tier 5"
+msgstr "Sıra 5"
+
+#: usr/local/www/system_gateway_groups_edit.php:296
+msgid "Interface Address"
+msgstr "Arabirim Adresi"
+
+#: usr/local/www/system_gateway_groups_edit.php:314
+msgid "Link Priority"
+msgstr "Bağlantı Önceliği"
+
+#: usr/local/www/system_gateway_groups_edit.php:315
+msgid ""
+"The priority selected here defines in what order failover and balancing of "
+"links will be done. Multiple links of the same priority will balance "
+"connections until all links in the priority will be exhausted. If all links "
+"in a priority level are exhausted we will use the next available link(s) in "
+"the next priority level."
+msgstr ""
+"Burada seçilen öncelik bağlantılarda yük dengeleme ve aktarma işlemlerinin "
+"hangi sırayla yapılacağını belirler. Aynı önceliğe sahip birden fazla "
+"bağlantı olursa o önceliğe sahip tüm bağlantılar tükenene kadar dengeli "
+"kullanılır. Bir öncelik sırasındaki tüm bağlantılar tükendiğinde bir sonraki "
+"öncelik sırasına geçilir."
+
+#: usr/local/www/system_gateway_groups_edit.php:320
+msgid ""
+"The virtual IP field selects what (virtual) IP should be used when this "
+"group applies to a local Dynamic DNS, IPsec or OpenVPN endpoint"
+msgstr ""
+"Sanal IP alanı seçilen hangi (sanal) IP, bu grup yerel Dinamik DNS, IPsec "
+"yada OpenVPN uç noktası için kullanılmalıdır"
+
+#: usr/local/www/system_gateway_groups_edit.php:325
+msgid "Trigger Level"
+msgstr "Tetikleme Seviyesi"
+
+#: usr/local/www/system_gateway_groups_edit.php:336
+msgid "When to trigger exclusion of a member"
+msgstr "Bir üyenin dışarıda bırakılması ne zaman tetiklenecek"
+
+#: usr/local/www/system_gateways.php:89
+#, php-format
+msgid ""
+"Gateway '%s' cannot be deleted because it is in use on Gateway Group '%s'"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:99
+#, php-format
+msgid ""
+"Gateway '%s' cannot be deleted because it is in use on Static Route '%s'"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:196
+msgid "The gateway configuration has been changed."
+msgstr "Ağ geçidi yapılandırması değiştirildi."
+
+#: usr/local/www/system_gateways.php:220
+#: usr/local/www/system_gateways_edit.php:719
+msgid "Monitor IP"
+msgstr "İzleme IPsi"
+
+#: usr/local/www/system_gateways.php:266
+msgid "This gateway is inactive because interface is missing"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:340
+msgid "Do you really want to delete this gateway?"
+msgstr "Bu ağ geçidini silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_gateways.php:377 usr/local/www/system_gateways.php:382
+msgid "delete selected items"
+msgstr ""
+
+#: usr/local/www/system_gateways.php:383
+msgid "Do you really want to delete the selected gateway items?"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:126
+msgid "A valid gateway IP address must be specified."
+msgstr "Geçerli bir ağ geçidi IP adresi belirtilmelidir."
+
+#: usr/local/www/system_gateways_edit.php:134
+msgid ""
+"Cannot add IPv4 Gateway Address because no IPv4 address could be found on "
+"the interface."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:153
+#: usr/local/www/system_gateways_edit.php:181
+#, php-format
+msgid ""
+"The gateway address %1$s does not lie within one of the chosen interface's "
+"subnets."
+msgstr "Ağ geçidi adresi %1$s seçilen arabirimlerin altağı içinde yer almıyor."
+
+#: usr/local/www/system_gateways_edit.php:162
+msgid ""
+"Cannot add IPv6 Gateway Address because no IPv6 address could be found on "
+"the interface."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:188
+msgid ""
+"Dynamic gateway values cannot be specified for interfaces with a static IPv4 "
+"configuration."
+msgstr ""
+"Statik IPv4 yapılandırması olan arabirimlerde dinamik ağ geçidi değerleri "
+"belirtilemez."
+
+#: usr/local/www/system_gateways_edit.php:192
+msgid ""
+"Dynamic gateway values cannot be specified for interfaces with a static IPv6 "
+"configuration."
+msgstr ""
+"Statik IPv6 yapılandırması olan arabirimlerde dinamik ağ geçidi değerleri "
+"belirtilemez."
+
+#: usr/local/www/system_gateways_edit.php:196
+msgid "A valid monitor IP address must be specified."
+msgstr "Geçerli bir izleme IP adresi belirtilmelidir."
+
+#: usr/local/www/system_gateways_edit.php:222
+msgid "Changing name on a gateway is not allowed."
+msgstr "Ağ geçidi adının değiştirilmesine izin verilmemektedir."
+
+#: usr/local/www/system_gateways_edit.php:227
+#, php-format
+msgid "The gateway name \"%s\" already exists."
+msgstr "\"%s\" adında ağ geçidi sistemde mevcut."
+
+#: usr/local/www/system_gateways_edit.php:233
+#, php-format
+msgid "The gateway IP address \"%s\" already exists."
+msgstr "Ağ geçidi IP adresi \"%s\" sistemde zaten mevcut."
+
+#: usr/local/www/system_gateways_edit.php:239
+#, php-format
+msgid ""
+"The monitor IP address \"%s\" is already in use. You must choose a different "
+"monitor IP."
+msgstr ""
+"\"%s\" izleme IP adresi kullanımda. Başka bir izleme IP adresi seçiniz."
+
+#: usr/local/www/system_gateways_edit.php:249
+msgid "The low latency threshold needs to be a numeric value."
+msgstr "Düşük gecikme eşiğinin sayısal bir değer olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:252
+msgid "The low latency threshold needs to be positive."
+msgstr "Düşük gecikme eşiğinin pozitif olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:259
+msgid "The high latency threshold needs to be a numeric value."
+msgstr "Yüksek gecikme eşiğinin sayısal bir değer olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:262
+msgid "The high latency threshold needs to be positive."
+msgstr "Yüksek gecikme eşiğinin pozitif olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:269
+msgid "The low Packet Loss threshold needs to be a numeric value."
+msgstr "Düşük paket kaybı eşiğinin sayısal bir değer olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:272
+msgid "The low Packet Loss threshold needs to be positive."
+msgstr "Düşük paket kaybı eşiğinin pozitif olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:275
+msgid "The low Packet Loss threshold needs to be less than 100."
+msgstr "Düşük paket kaybı eşiğinin 100 den daha az olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:282
+msgid "The high Packet Loss threshold needs to be a numeric value."
+msgstr "Yüksek paket kaybı eşiğinin sayısal bir değer olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:285
+msgid "The high Packet Loss threshold needs to be positive."
+msgstr "Yüksek paket kaybı eşiğinin pozitif olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:288
+msgid "The high Packet Loss threshold needs to be 100 or less."
+msgstr "Yüksek paket kaybı eşiğinin 100 yada daha az olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:296
+msgid ""
+"The high latency threshold needs to be higher than the low latency threshold"
+msgstr ""
+"Yüksek gecikme eşiğinin düşük gecikme eşiğinden daha yüksek olması gerekir"
+
+#: usr/local/www/system_gateways_edit.php:319
+msgid ""
+"The high Packet Loss threshold needs to be higher than the low Packet Loss "
+"threshold"
+msgstr ""
+"Yüksek paket kaybı eşiğinin düşük paket kaybı eşiğinden daha yüksek olması "
+"gerekir"
+
+#: usr/local/www/system_gateways_edit.php:341
+msgid "The probe interval needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:344
+msgid "The probe interval needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:351
+msgid "The down time setting needs to be a numeric value."
+msgstr "Erişilemez zamanının ayarları sayısal bir değer olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:354
+msgid "The down time setting needs to be positive."
+msgstr "Erişilemez zamanının ayarlarının pozitif olması gerekir."
+
+#: usr/local/www/system_gateways_edit.php:362
+msgid "The probe interval needs to be less than the down time setting."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:384
+msgid "The average delay replies qty needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:387
+msgid "The average delay replies qty needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:394
+msgid "The average packet loss probes qty needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:397
+msgid "The average packet loss probes qty needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:404
+msgid "The lost probe delay needs to be a numeric value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:407
+msgid "The lost probe delay needs to be positive."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:523
+#: usr/local/www/system_gateways_edit.php:644
+msgid "Edit gateway"
+msgstr "Ağ geçidi düzenle"
+
+#: usr/local/www/system_gateways_edit.php:650
+msgid "Disable this gateway"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:651
+msgid ""
+"Set this option to disable this gateway without removing it from the list."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:668
+msgid "Choose which interface this gateway applies to."
+msgstr "Bu ağ geçidinin hangi arabirim için olduğunu seçin."
+
+#: usr/local/www/system_gateways_edit.php:685
+msgid "Choose the Internet Protocol this gateway uses."
+msgstr "İnternet Protokolü için kullanılacak ağ geçidi türünü seçiniz."
+
+#: usr/local/www/system_gateways_edit.php:692
+msgid "Gateway name"
+msgstr "Ağ geçidi adı"
+
+#: usr/local/www/system_gateways_edit.php:699
+msgid "Gateway IP address"
+msgstr "Ağ geçidi IP adresi"
+
+#: usr/local/www/system_gateways_edit.php:703
+#: usr/local/www/system_gateways_edit.php:706
+msgid "Default Gateway"
+msgstr "Varsayılan Ağ Geçidi"
+
+#: usr/local/www/system_gateways_edit.php:707
+msgid "This will select the above gateway as the default gateway"
+msgstr ""
+"Bu seçenek aşağıda belirtilen ağ geçidini varsayılan ağ geçidi olarak "
+"seçecektir"
+
+#: usr/local/www/system_gateways_edit.php:711
+#: usr/local/www/system_gateways_edit.php:714
+msgid "Disable Gateway Monitoring"
+msgstr "Ağ Geçidi İzlemeyi Kapat"
+
+#: usr/local/www/system_gateways_edit.php:715
+msgid "This will consider this gateway as always being up"
+msgstr "Bu seçenek bu ağ geçidini her zaman açık kabul etmeyi sağlar"
+
+#: usr/local/www/system_gateways_edit.php:728
+msgid "Alternative monitor IP"
+msgstr "Alternatif izleme IP adresi"
+
+#: usr/local/www/system_gateways_edit.php:729
+msgid ""
+"Enter an alternative address here to be used to monitor the link. This is "
+"used for the quality RRD graphs as well as the load balancer entries. Use "
+"this if the gateway does not respond to ICMP echo requests (pings)"
+msgstr ""
+"Bağlantıyı izlemek için kullanılacak alternatif bir adres girin. Hem RRD "
+"grafikleri hem de yük dengeleyici kayıtlarında kullanılır. Ağ geçidi ICMP "
+"echo isteklerine (ping'lere) cevap vermiyorsa bunu kullanabilirsiniz"
+
+#: usr/local/www/system_gateways_edit.php:736
+#: usr/local/www/system_gateways_edit.php:739
+msgid "Mark Gateway as Down"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:740
+msgid "This will force this gateway to be considered Down"
+msgstr ""
+
+# 86%
+#: usr/local/www/system_gateways_edit.php:748
+msgid " - Show advanced option"
+msgstr " - Gelişmiş seçeneği göster"
+
+#: usr/local/www/system_gateways_edit.php:765
+msgid "Weight for this gateway when used in a Gateway Group."
+msgstr ""
+"Bu ağ geçidinin bir Ağ Geçidi Grubunda kullanıldığında alacağı ağırlık."
+
+#: usr/local/www/system_gateways_edit.php:769
+msgid "Latency thresholds"
+msgstr "Gecikme eşik değerleri"
+
+#: usr/local/www/system_gateways_edit.php:781
+msgid "Packet Loss thresholds"
+msgstr "Paket Kaybı eşik değeri"
+
+#: usr/local/www/system_gateways_edit.php:793
+msgid "Probe Interval"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:799
+msgid ""
+"NOTE: The quality graph is averaged over seconds, not intervals, so as the "
+"probe interval is increased the accuracy of the quality graph is decreased."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:804
+msgid "Down"
+msgstr "Kapalı"
+
+#: usr/local/www/system_gateways_edit.php:812
+msgid "Average Delay Replies Qty"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:817
+#: usr/local/www/system_gateways_edit.php:827
+#: usr/local/www/system_gateways_edit.php:837
+msgid "Use calculated value."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:822
+msgid "Average Packet Loss Probes Qty"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:832
+msgid "Lost Probe Delay"
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:843
+msgid ""
+"The probe interval must be less than the down time, otherwise the gateway "
+"will seem to go down then come up again at the next probe."
+msgstr ""
+
+#: usr/local/www/system_gateways_edit.php:844
+msgid ""
+"The down time defines the length of time before the gateway is marked as "
+"down, but the accuracy is controlled by the probe interval. For example, if "
+"your down time is 40 seconds but on a 30 second probe interval, only one "
+"probe would have to fail before the gateway is marked down at the 40 second "
+"mark. By default, the gateway is considered down after 10 seconds, and the "
+"probe interval is 1 second, so 10 probes would have to fail before the "
+"gateway is marked down."
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:53
+#: usr/local/www/system_groupmanager_addprivs.php:57
+msgid "Group manager"
+msgstr "Grup yöneticisi"
+
+#: usr/local/www/system_groupmanager.php:79
+#: usr/local/www/vpn_ipsec_mobile.php:619
+msgid "Group"
+msgstr "Grup"
+
+#: usr/local/www/system_groupmanager.php:80
+#: usr/local/www/system_groupmanager.php:104
+#: usr/local/www/system_usermanager.php:100
+#: usr/local/www/system_usermanager.php:115
+msgid "successfully deleted"
+msgstr "başarıyla silindi"
+
+#: usr/local/www/system_groupmanager.php:103
+#: usr/local/www/system_usermanager.php:114
+msgid "Privilege"
+msgstr "Yetki"
+
+#: usr/local/www/system_groupmanager.php:131
+msgid "Selected groups removed successfully!"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:148
+msgid "The group name contains invalid characters."
+msgstr "Grup adı geçersiz karakterler içeriyor."
+
+#: usr/local/www/system_groupmanager.php:151
+msgid "The group name is longer than 16 characters."
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:157
+msgid "Another entry with the same group name already exists."
+msgstr "Sistemde aynı grup isminde bir tanım mevcut."
+
+#: usr/local/www/system_groupmanager.php:314
+#: usr/local/www/system_usermanager.php:520
+msgid "Defined by"
+msgstr "Tanımlayan"
+
+#: usr/local/www/system_groupmanager.php:321
+#: usr/local/www/system_groupmanager.php:481
+msgid "Group name"
+msgstr "Grup adı"
+
+#: usr/local/www/system_groupmanager.php:331
+msgid "Group description, for your own information only"
+msgstr "Grup açıklaması (grubu daha kolay tanıyabilmeniz için)"
+
+#: usr/local/www/system_groupmanager.php:338
+#: usr/local/www/system_usermanager.php:566
+msgid "Group Memberships"
+msgstr "Grup Üyelikleri"
+
+#: usr/local/www/system_groupmanager.php:343
+msgid "Not Members"
+msgstr "Üye Olmayanlar"
+
+#: usr/local/www/system_groupmanager.php:367
+msgid "Add Members"
+msgstr "Üye Ekle"
+
+#: usr/local/www/system_groupmanager.php:371
+msgid "Remove Members"
+msgstr "Üye Çıkar"
+
+#: usr/local/www/system_groupmanager.php:398
+#: usr/local/www/system_groupmanager_addprivs.php:196
+#: usr/local/www/system_usermanager.php:632
+#: usr/local/www/system_usermanager_addprivs.php:183
+msgid "Hold down CTRL (pc)/COMMAND (mac) key to select multiple items"
+msgstr "Birden fazla öğe seçmek için CTRL (PC) / COMMAND (Mac) basılı tutun"
+
+#: usr/local/www/system_groupmanager.php:406
+msgid "Assigned Privileges"
+msgstr "Atanan Yetkiler"
+
+#: usr/local/www/system_groupmanager.php:432
+#: usr/local/www/system_usermanager.php:674
+msgid "Do you really want to delete this privilege?"
+msgstr "Bu yetkiyi silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_groupmanager.php:433
+#: usr/local/www/system_usermanager.php:675
+msgid "delete privilege"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:483
+msgid "Member Count"
+msgstr "Üye Sayısı"
+
+#: usr/local/www/system_groupmanager.php:494
+msgid "add group"
+msgstr "grup ekle"
+
+#: usr/local/www/system_groupmanager.php:495
+msgid "Delete selected groups"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:495
+msgid "Do you really want to delete selected groups?"
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:501
+msgid ""
+"Additional webConfigurator groups can be added here.\n"
+"\t\t\t\t\t\t\t\t\t\tGroup permissions can be assigned which are inherited by "
+"users who are members of the group.\n"
+"\t\t\t\t\t\t\t\t\t\tAn icon that appears grey indicates that it is a system "
+"defined object.\n"
+"\t\t\t\t\t\t\t\t\t\tSome system object properties can be modified but they "
+"cannot be deleted."
+msgstr ""
+
+#: usr/local/www/system_groupmanager.php:562
+msgid "Do you really want to delete this group?"
+msgstr "Bu grubu silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_groupmanager.php:563
+msgid "delete group"
+msgstr "grubu sil"
+
+#: usr/local/www/system_groupmanager_addprivs.php:57
+msgid "Add privileges"
+msgstr "Yetki ekle"
+
+#: usr/local/www/system_groupmanager_addprivs.php:81
+#: usr/local/www/system_usermanager_addprivs.php:75
+msgid "Selected priveleges"
+msgstr "Seçili yetkiler"
+
+#: usr/local/www/system_groupmanager_addprivs.php:182
+#: usr/local/www/system_usermanager_addprivs.php:171
+msgid "System Privileges"
+msgstr "Sistem yetkileri"
+
+#: usr/local/www/system_groupmanager_addprivs.php:220
+#: usr/local/www/system_usermanager_addprivs.php:189
+msgid "Select a privilege from the list above for a description"
+msgstr "Yukarıdaki listeden bir yetki seçerek açıklamasını görebilirsiniz"
+
+#: usr/local/www/system_hasync.php:101
+msgid "High Availability Sync"
+msgstr "Yüksek Kullanılırlık senk."
+
+#: usr/local/www/system_routes.php:54 usr/local/www/system_routes.php:199
+#: usr/local/www/system_routes_edit.php:212
+msgid "Static Routes"
+msgstr "Statik Yönlendirmeler"
+
+#: usr/local/www/system_routes.php:114 usr/local/www/system_routes.php:126
+msgid "removed route to"
+msgstr "şu yönlendirme silindi"
+
+#: usr/local/www/system_routes.php:141
+msgid "enabled route to"
+msgstr ""
+
+#: usr/local/www/system_routes.php:145
+msgid "disabled route to"
+msgstr ""
+
+#: usr/local/www/system_routes.php:212
+#, php-format
+msgid ""
+"The static route configuration has been changed.%sYou must apply the changes "
+"in order for them to take effect."
+msgstr ""
+"Statik yönlendirme yapılandırması değiştirildi.%sDeğişiklikleri uygulayarak "
+"etkin hale gelmelerini sağlayabilirsiniz."
+
+#: usr/local/www/system_routes.php:293
+msgid "move selected routes before this route"
+msgstr ""
+
+#: usr/local/www/system_routes.php:298
+msgid "edit route"
+msgstr ""
+
+#: usr/local/www/system_routes.php:304
+msgid "Do you really want to delete this route?"
+msgstr "Bu yönlendirmeyi silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_routes.php:305
+msgid "delete route"
+msgstr ""
+
+#: usr/local/www/system_routes.php:310
+msgid "add a new route based on this one"
+msgstr ""
+
+#: usr/local/www/system_routes.php:328 usr/local/www/system_routes.php:333
+msgid "move selected routes to end"
+msgstr ""
+
+#: usr/local/www/system_routes.php:341
+msgid "add new route"
+msgstr ""
+
+#: usr/local/www/system_routes.php:351 usr/local/www/system_routes.php:356
+msgid "delete selected routes"
+msgstr ""
+
+#: usr/local/www/system_routes.php:357
+msgid "Do you really want to delete the selected routes?"
+msgstr ""
+
+#: usr/local/www/system_routes.php:372
+msgid ""
+"Do not enter static routes for networks assigned on any interface of this "
+"firewall. Static routes are only used for networks reachable via a "
+"different router, and not reachable via your default gateway."
+msgstr ""
+"Bu güvenlik duvarının herhangi bir arabirimine atanmış ağlar için statik "
+"yönlendirme girmeyin. Statik yönlendirmeler sadece varsayılan ağ geçidiniz "
+"üzerinden erişemediğiniz, onun yerine farklı bir yönlendirici üzerinden "
+"eriştiğiniz ağlar için kullanılır."
+
+#: usr/local/www/system_routes_edit.php:85
+#: usr/local/www/system_routes_edit.php:229
+msgid "Destination network"
+msgstr "Hedef ağ"
+
+#: usr/local/www/system_routes_edit.php:86
+msgid "Destination network bit count"
+msgstr "Hedef ağ bit sayısı"
+
+#: usr/local/www/system_routes_edit.php:92
+msgid "A valid IPv4 or IPv6 destination network must be specified."
+msgstr "Geçerli bir IPv4 yada IPv6 hedef ağı belirtilmeli."
+
+#: usr/local/www/system_routes_edit.php:95
+msgid "A valid destination network bit count must be specified."
+msgstr "Geçerli bir hedef ağ bit sayısı belirtilmelidir."
+
+#: usr/local/www/system_routes_edit.php:113
+msgid "A IPv4 subnet can not be over 32 bits."
+msgstr "IPv4 altağ 32 bit üzerinde olamaz."
+
+# 92%
+#: usr/local/www/system_routes_edit.php:155
+msgid "A route to these destination networks already exists"
+msgstr "Bu hedef ağa bir yönlendirme sistemde mevcut"
+
+#: usr/local/www/system_routes_edit.php:165
+#: usr/local/www/system_routes_edit.php:172
+#, php-format
+msgid "This network conflicts with address configured on interface %s."
+msgstr "Bu ağ çatışmaları adresi ile beraber %s arabiriminde yapılandırıldı."
+
+#: usr/local/www/system_routes_edit.php:212
+msgid "Edit route"
+msgstr "Yönlendirme düzenle"
+
+#: usr/local/www/system_routes_edit.php:226
+msgid "Edit route entry"
+msgstr "Yönlendirme girdisi düzenle"
+
+#: usr/local/www/system_routes_edit.php:240
+msgid "Destination network for this static route"
+msgstr "Bu statik yönlendirme için hedef ağ"
+
+#: usr/local/www/system_routes_edit.php:257
+msgid "Choose which gateway this route applies to or"
+msgstr "Bu yönlendirmenin uygulanacağı ağ geçidini seçiniz veya"
+
+#: usr/local/www/system_routes_edit.php:274
+msgid "Default gateway:"
+msgstr "Varsayılan ağ geçidi:"
+
+#: usr/local/www/system_routes_edit.php:277
+msgid "Interface:"
+msgstr "Arabirim:"
+
+#: usr/local/www/system_routes_edit.php:291
+msgid "Gateway IP:"
+msgstr "Ağ Geçidi IPsi:"
+
+#: usr/local/www/system_routes_edit.php:318
+msgid "Disable this static route"
+msgstr "Bu statik yönlendirmeyi kapat"
+
+#: usr/local/www/system_routes_edit.php:319
+msgid ""
+"Set this option to disable this static route without removing it from the "
+"list."
+msgstr ""
+"By seçenek ile listeden statik yönlendirmeyi silmeden devre dışı "
+"bırakabilirsiniz."
+
+#: usr/local/www/system_routes_edit.php:393
+#, php-format
+msgid "You can manage Gateways %shere%s."
+msgstr "Ağ geçitlerini %sburadan%s yönetebilirsiniz."
+
+#: usr/local/www/system_routes_edit.php:396
+msgid "Sorry, we could not create your gateway at this time."
+msgstr "Ağ geçidi oluşturulamadı."
+
+#: usr/local/www/system_usermanager.php:167
+#: usr/local/www/system_usermanager.php:781
+#: usr/local/www/system_usermanager.php:791
+#: usr/local/www/vpn_ipsec_phase1.php:181
+#: usr/local/www/vpn_openvpn_server.php:333
+msgid "Certificate"
+msgstr "Sertifika"
+
+#: usr/local/www/system_usermanager.php:168
+msgid "association removed."
+msgstr "ilişkilendirme kaldırıldı."
+
+#: usr/local/www/system_usermanager.php:193
+msgid "Selected users removed successfully!"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:230
+msgid "The username is longer than 16 characters."
+msgstr "Kullanıcı adı 16 karakterden uzun."
+
+#: usr/local/www/system_usermanager.php:233
+#: usr/local/www/system_usermanager_passwordmg.php:55
+#: usr/local/www/vpn_l2tp_users_edit.php:98
+#: usr/local/www/vpn_pptp_users_edit.php:97
+msgid "The passwords do not match."
+msgstr "Parolalar aynı değil."
+
+#: usr/local/www/system_usermanager.php:236
+msgid "IPsec Pre-Shared Key contains invalid characters."
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:246
+#: usr/local/www/vpn_l2tp_users_edit.php:108
+#: usr/local/www/vpn_pptp_users_edit.php:107
+msgid "Another entry with the same username already exists."
+msgstr "Aynı kullanıcı adıyla başka girdi tespit edildi."
+
+#: usr/local/www/system_usermanager.php:257
+msgid "That username is reserved by the system."
+msgstr "Bu kullanıcı adı sistem tarafından kullanıma ayrılmıştır."
+
+#: usr/local/www/system_usermanager.php:277
+msgid "Invalid expiration date format; use MM/DD/YYYY instead."
+msgstr "Süre dolum tarih formatı geçersiz; AA/GG/YYYY biçiminde girin."
+
+#: usr/local/www/system_usermanager.php:284
+msgid "Invalid internal Certificate Authority"
+msgstr "Geçersiz iç Sertifika Otoritesi"
+
+#: usr/local/www/system_usermanager.php:547
+#: usr/local/www/system_usermanager_passwordmg.php:123
+msgid "(confirmation)"
+msgstr "(onay)"
+
+#: usr/local/www/system_usermanager.php:551
+#: usr/local/www/system_usermanager.php:905
+msgid "Full name"
+msgstr "Ad Soyad"
+
+#: usr/local/www/system_usermanager.php:555
+msgid "User's full name, for your own information only"
+msgstr "Kullanıcının tam adı (Bilgi amaçlı)"
+
+#: usr/local/www/system_usermanager.php:559
+msgid "Expiration date"
+msgstr "Geçerlilik süresi"
+
+#: usr/local/www/system_usermanager.php:563
+msgid ""
+"Leave blank if the account shouldn't expire, otherwise enter the expiration "
+"date in the following format: mm/dd/yyyy"
+msgstr ""
+"Hesap her zaman geçerli olsun istiyorsanız boş bırakın, aksi taktirde "
+"hesabın son geçerlilik tarihini aa/gg/yyyy biçiminde girin"
+
+#: usr/local/www/system_usermanager.php:571
+msgid "Not Member Of"
+msgstr "Üyesi Değil"
+
+#: usr/local/www/system_usermanager.php:597
+msgid "Add Groups"
+msgstr "Grup ekle"
+
+#: usr/local/www/system_usermanager.php:601
+msgid "Remove Groups"
+msgstr "Grup çıkar"
+
+#: usr/local/www/system_usermanager.php:605
+msgid "Member Of"
+msgstr "Üyesi"
+
+#: usr/local/www/system_usermanager.php:639
+msgid "Effective Privileges"
+msgstr "Etkin İzinler"
+
+#: usr/local/www/system_usermanager.php:643
+msgid "Inherited From"
+msgstr "Miras Alınan"
+
+#: usr/local/www/system_usermanager.php:700
+msgid "User Certificates"
+msgstr "Kullanıcı Sertifikaları"
+
+#: usr/local/www/system_usermanager.php:705
+msgid "CA"
+msgstr "CA"
+
+#: usr/local/www/system_usermanager.php:736
+msgid "export private key"
+msgstr "özel anahtarı dışarı ver"
+
+#: usr/local/www/system_usermanager.php:748
+msgid "Do you really want to remove this certificate association?"
+msgstr "Bu sertifika ilişkilendirmesini silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_usermanager.php:748
+msgid "(Certificate will not be deleted)"
+msgstr "(Sertifika silinmeyecektir.)"
+
+#: usr/local/www/system_usermanager.php:783
+msgid "Click to create a user certificate."
+msgstr "Kullanıcı sertifikası oluşturmak için tıklayınız."
+
+#: usr/local/www/system_usermanager.php:853
+#: usr/local/www/system_usermanager.php:859
+msgid "Authorized keys"
+msgstr "İzinli anahtarlar"
+
+#: usr/local/www/system_usermanager.php:855
+msgid "Click to paste an authorized key."
+msgstr "İzinli anahtar yapıştırmak için tıklayınız."
+
+#: usr/local/www/system_usermanager.php:870
+msgid "Paste an authorized keys file here."
+msgstr "Buraya izinli anahtar dosyası yapıştırabilirsiniz."
+
+#: usr/local/www/system_usermanager.php:874
+msgid "IPsec Pre-Shared Key"
+msgstr "IPsec Ön Paylaşımlı Anahtar"
+
+#: usr/local/www/system_usermanager.php:918
+#: usr/local/www/vpn_l2tp_users.php:122 usr/local/www/vpn_pptp_users.php:106
+#: usr/local/www/vpn_pptp_users.php:129
+msgid "add user"
+msgstr "kullanıcı ekle"
+
+#: usr/local/www/system_usermanager.php:919
+msgid "Delete selected users"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:919
+msgid "Do you really want to delete selected Users?"
+msgstr ""
+
+#: usr/local/www/system_usermanager.php:925
+msgid ""
+"Additional users can be added here. User permissions for accessing the "
+"webConfigurator can be assigned directly or inherited from group "
+"memberships. An icon that appears grey indicates that it is a system defined "
+"object. Some system object properties can be modified but they cannot be "
+"deleted."
+msgstr ""
+"Ek webArayüzü kullanıcıları buradan eklenebilir. webArayüzüne erişim "
+"izinleri doğrudan atanabilir veya grup üyeliklerinden miras alınabilir. Gri "
+"bir simge sistem tanımlı bir nesne olduğu anlamına gelir. Sistem "
+"nesnelerinin bazı özellikleri değiştirilebilir ancak silinemez."
+
+#: usr/local/www/system_usermanager.php:930
+msgid ""
+"Accounts created here are also used for other parts of the system such as "
+"OpenVPN, IPsec, and Captive Portal."
+msgstr ""
+"Burada oluşturulan hesaplar OpenVPN, IPsec ve Hizmet Portalı gibi bölümler "
+"için de kullanılır."
+
+#: usr/local/www/system_usermanager.php:978
+#: usr/local/www/vpn_pptp_users.php:119
+msgid "edit user"
+msgstr "kullanıcı düzenle"
+
+#: usr/local/www/system_usermanager.php:988
+#: usr/local/www/vpn_l2tp_users.php:117 usr/local/www/vpn_pptp_users.php:120
+msgid "Do you really want to delete this user?"
+msgstr "Bu kullanıcıyı silmek istediğinize emin misiniz?"
+
+#: usr/local/www/system_usermanager.php:989
+#: usr/local/www/vpn_l2tp_users.php:117 usr/local/www/vpn_pptp_users.php:120
+msgid "delete user"
+msgstr "kullanıcı sil"
+
+#: usr/local/www/system_usermanager_passwordmg.php:44
+msgid "User Password"
+msgstr "Kullanıcı Parolası"
+
+#: usr/local/www/system_usermanager_passwordmg.php:67
+msgid "Password successfully changed"
+msgstr "Parola başarıyla değiştirildi"
+
+#: usr/local/www/system_usermanager_passwordmg.php:96
+msgid "Sorry, you cannot change the password for a non-local user."
+msgstr "Yerel olmayan kullanıcının parolasını değiştiremezsiniz."
+
+#: usr/local/www/system_usermanager_passwordmg.php:126
+msgid "Select a new password"
+msgstr "Yeni parola seçiniz"
+
+#: usr/local/www/system_usermanager_settings.php:50
+msgid "User manager settings"
+msgstr "Kullanıcı yöneticisi ayarları"
+
+#: usr/local/www/system_usermanager_settings.php:60
+msgid "Session timeout must be an integer value."
+msgstr "Oturum zaman aşımı değeri tamsayı olmalıdır."
+
+#: usr/local/www/system_usermanager_settings.php:70
+msgid ""
+"The test was not performed because it is supported only for ldap based "
+"backends."
+msgstr ""
+"Sadece LDAP tabanlı arkauçlarda desteklendiğinden dolayı test "
+"gerçekleştirilmedi."
+
+#: usr/local/www/system_usermanager_settings.php:132
+msgid "Session Timeout"
+msgstr "Oturum Zaman Aşımı"
+
+#: usr/local/www/system_usermanager_settings.php:136
+msgid ""
+"Time in minutes to expire idle management sessions. The default is 4 hours "
+"(240 minutes)."
+msgstr ""
+"Boş duran yönetim oturumlarının kapatılma süresi. Varsayılan 4 saattir (240 "
+"dakika)."
+
+#: usr/local/www/system_usermanager_settings.php:137
+msgid "Enter 0 to never expire sessions. NOTE: This is a security risk!"
+msgstr ""
+"Sıfır (0) girerek oturumların sona ermesini engelleyebilirsiniz. Not: Bu bir "
+"güvenlik riski oluşturur!"
+
+#: usr/local/www/system_usermanager_settings.php:164
+msgid "Save and Test"
+msgstr "Kaydet ve Test Et"
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:97
+msgid ""
+"Could not connect to the LDAP server. Please check your LDAP configuration."
+msgstr "LDAP sunucuya bağlanamadı. LDAP yapılandırmasını kontrol edin."
+
+#: usr/local/www/system_usermanager_settings_ldapacpicker.php:100
+msgid "Please select which containers to Authenticate against:"
+msgstr "Her taşıyıcılarla kimlik doğrulama yapılacağını seçiniz:"
+
+#: usr/local/www/system_usermanager_settings_test.php:81
+#, php-format
+msgid "Could not find settings for %s%s"
+msgstr "%s%s ayarları bulunamadı"
+
+#: usr/local/www/system_usermanager_settings_test.php:86
+#, php-format
+msgid "Testing %s LDAP settings... One moment please..."
+msgstr "%s LDAP ayarları test ediliyor... Bir dakika lütfen..."
+
+#: usr/local/www/system_usermanager_settings_test.php:90
+msgid "Attempting connection to"
+msgstr "Bağlanmaya çalışıyor"
+
+#: usr/local/www/system_usermanager_settings_test.php:94
+msgid "Attempting bind to"
+msgstr "İlişkilendirmeye çalışıyor"
+
+#: usr/local/www/system_usermanager_settings_test.php:98
+msgid "Attempting to fetch Organizational Units from"
+msgstr "Yönetimsel Birimler okunuyor"
+
+#: usr/local/www/system_usermanager_settings_test.php:105
+msgid "Organization units found"
+msgstr "Bulunan yönetimsel birimler"
+
+#: usr/local/www/system_usermanager_settings_test.php:112
+#: usr/local/www/system_usermanager_settings_test.php:117
+#: usr/local/www/system_usermanager_settings_test.php:121
+msgid "failed"
+msgstr "başarısız"
+
+#: usr/local/www/uploadconfig.php:49
+msgid "ERR Could not save configuration."
+msgstr "HATA: Yapılandırma kaydedilemedi."
+
+#: usr/local/www/uploadconfig.php:55
+msgid "OK"
+msgstr "TAMAM"
+
+#: usr/local/www/uploadconfig.php:58
+msgid "ERR Could not install configuration."
+msgstr "HATA: Yapılandırma kurulamadı."
+
+#: usr/local/www/uploadconfig.php:61
+msgid "ERR Invalid configuration received."
+msgstr "HATA: Geçersiz yapılandırma alındı."
+
+#: usr/local/www/vpn_ipsec.php:231 usr/local/www/vpn_ipsec_keys.php:92
+#: usr/local/www/vpn_ipsec_mobile.php:331
+msgid "The IPsec tunnel configuration has been changed"
+msgstr "IPSec tünel yapılandırması değiştirildi"
+
+#: usr/local/www/vpn_ipsec.php:238 usr/local/www/vpn_ipsec_keys.php:100
+#: usr/local/www/vpn_ipsec_mobile.php:346
+#: usr/local/www/vpn_ipsec_phase1.php:553
+#: usr/local/www/vpn_ipsec_phase2.php:539
+#: usr/local/www/vpn_ipsec_settings.php:204
+msgid "Tunnels"
+msgstr "Tüneller"
+
+#: usr/local/www/vpn_ipsec.php:239 usr/local/www/vpn_ipsec_keys.php:101
+#: usr/local/www/vpn_ipsec_mobile.php:347
+#: usr/local/www/vpn_ipsec_phase1.php:554
+#: usr/local/www/vpn_ipsec_phase2.php:540
+#: usr/local/www/vpn_ipsec_settings.php:205
+msgid "Mobile clients"
+msgstr "Mobil istemciler"
+
+#: usr/local/www/vpn_ipsec.php:240 usr/local/www/vpn_ipsec_keys.php:102
+#: usr/local/www/vpn_ipsec_phase1.php:555
+#: usr/local/www/vpn_ipsec_phase2.php:541
+msgid "Pre-Shared Keys"
+msgstr "Ön Paylaşımlı Anahtarlar"
+
+#: usr/local/www/vpn_ipsec.php:241 usr/local/www/vpn_ipsec_keys.php:103
+#: usr/local/www/vpn_ipsec_mobile.php:349
+#: usr/local/www/vpn_ipsec_phase1.php:556
+#: usr/local/www/vpn_ipsec_phase2.php:542
+#: usr/local/www/vpn_ipsec_settings.php:207
+msgid "Advanced Settings"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:258
+msgid "Enable IPsec"
+msgstr "IPsec'i Etkinleştir"
+
+#: usr/local/www/vpn_ipsec.php:274
+msgid "IKE"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:275
+msgid "Remote Gateway"
+msgstr "Uzak ağ geçidi"
+
+#: usr/local/www/vpn_ipsec.php:277
+msgid "P1 Protocol"
+msgstr "P1 Protokol"
+
+#: usr/local/www/vpn_ipsec.php:278
+msgid "P1 Transforms"
+msgstr "P1 Dönüştürme"
+
+#: usr/local/www/vpn_ipsec.php:279
+msgid "P1 Description"
+msgstr "P1 Açıklama"
+
+#: usr/local/www/vpn_ipsec.php:361 usr/local/www/vpn_ipsec.php:515
+#: usr/local/www/vpn_ipsec_phase2.php:746
+msgid "auto"
+msgstr "otomatik"
+
+#: usr/local/www/vpn_ipsec.php:384 usr/local/www/vpn_ipsec.php:539
+msgid "move selected entries before this"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:389
+msgid "edit phase1 entry"
+msgstr "Aşama 1 girdisini düzenle"
+
+#: usr/local/www/vpn_ipsec.php:396
+msgid "delete phase1 entry"
+msgstr "aşama 1 girdisini sil"
+
+#: usr/local/www/vpn_ipsec.php:398
+msgid ""
+"Do you really want to delete this phase1 and all associated phase2 entries?"
+msgstr ""
+"Aşama 1 ve ilişkilendirilmiş Aşama 2 girdilerini silmek istediğinize emin "
+"misiniz? "
+
+#: usr/local/www/vpn_ipsec.php:405
+msgid "copy phase1 entry"
+msgstr "aşama 1 girdisini kopyala"
+
+#: usr/local/www/vpn_ipsec.php:437
+#, php-format
+msgid "Show %s Phase-2 entries"
+msgstr "%s aşama 2 girdisi göster"
+
+#: usr/local/www/vpn_ipsec.php:445
+msgid "Local Subnet"
+msgstr "Yerel Altağ"
+
+#: usr/local/www/vpn_ipsec.php:446
+msgid "Remote Subnet"
+msgstr "Uzak Altağ"
+
+#: usr/local/www/vpn_ipsec.php:447
+msgid "P2 Protocol"
+msgstr "P2 Protokol"
+
+#: usr/local/www/vpn_ipsec.php:448
+msgid "P2 Transforms"
+msgstr "P2 Dönüştürmeler"
+
+#: usr/local/www/vpn_ipsec.php:449
+msgid "P2 Auth Methods"
+msgstr "P2 Kimlik Doğrulama Yöntemleri"
+
+#: usr/local/www/vpn_ipsec.php:542
+msgid "edit phase2 entry"
+msgstr "aşama 2 girdisi düzenle"
+
+#: usr/local/www/vpn_ipsec.php:545
+msgid "delete phase2 entry"
+msgstr "aşama 2 girdisini sil"
+
+#: usr/local/www/vpn_ipsec.php:547
+msgid "Do you really want to delete this phase2 entry?"
+msgstr "Bu aşama 2 girdisini silmek istediğinizden emin misiniz?"
+
+#: usr/local/www/vpn_ipsec.php:549
+msgid "add a new Phase 2 based on this one"
+msgstr "bunu temel alarak yeni bir Aşama 2 ekle"
+
+#: usr/local/www/vpn_ipsec.php:563 usr/local/www/vpn_ipsec.php:567
+msgid "move selected phase2 entries to end"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:572
+msgid "add phase2 entry"
+msgstr "aşama 2 girdisi ekle"
+
+#: usr/local/www/vpn_ipsec.php:577 usr/local/www/vpn_ipsec.php:581
+msgid "delete selected phase2 entries"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:581
+msgid "Do you really want to delete the selected phase2 entries?"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:604 usr/local/www/vpn_ipsec.php:608
+msgid "move selected phase1 entries to end"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:615
+msgid "add new phase1"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:624 usr/local/www/vpn_ipsec.php:628
+msgid "delete selected phase1 entries"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:628
+msgid "Do you really want to delete the selected phase1 entries?"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:644
+msgid "You can check your IPsec status at"
+msgstr "IPsec durumunu kontrol edebilirsiniz"
+
+#: usr/local/www/vpn_ipsec.php:644
+msgid "Status:IPsec"
+msgstr "Durum: IPsec"
+
+#: usr/local/www/vpn_ipsec.php:645
+msgid "IPsec Debug Mode can be enabled at"
+msgstr "IPsec Hata Ayıklama Kipini açmak için"
+
+#: usr/local/www/vpn_ipsec.php:645 usr/local/www/vpn_ipsec.php:646
+msgid "VPN:IPsec:Advanced Settings"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec.php:646
+msgid "IPsec can be set to prefer older SAs at"
+msgstr "IPsec'in daha eski SAları tercih etmesi için"
+
+#: usr/local/www/vpn_ipsec_keys.php:71
+msgid "Deleted IPsec Pre-Shared Key"
+msgstr "Silinen IPsec Ön Paylaşımlı Anahtar"
+
+#: usr/local/www/vpn_ipsec_keys.php:78
+msgid "VPN: IPsec: Keys"
+msgstr "VPN: IPsec: Anahtarlar"
+
+#: usr/local/www/vpn_ipsec_keys.php:112
+#: usr/local/www/vpn_ipsec_keys_edit.php:72
+#: usr/local/www/vpn_ipsec_keys_edit.php:134
+msgid "Identifier"
+msgstr "Tanımlayıcı"
+
+#: usr/local/www/vpn_ipsec_keys.php:118 usr/local/www/vpn_ipsec_keys.php:166
+msgid "add key"
+msgstr "anahtar ekle"
+
+#: usr/local/www/vpn_ipsec_keys.php:128
+msgid "ANY USER"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:142
+msgid "edit"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys.php:156
+msgid "edit key"
+msgstr "anahtarı düzenle"
+
+#: usr/local/www/vpn_ipsec_keys.php:157
+msgid "Do you really want to delete this Pre-Shared Key?"
+msgstr "Bu Ön Paylaşımlı anahtarı silmek istediğinize emin misiniz?"
+
+#: usr/local/www/vpn_ipsec_keys.php:157
+msgid "delete key"
+msgstr "anahtarı sil"
+
+#: usr/local/www/vpn_ipsec_keys.php:182
+#: usr/local/www/vpn_ipsec_keys_edit.php:163
+msgid "PSK for any user can be set by using an identifier of any/ANY"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:77
+msgid "The identifier contains invalid characters."
+msgstr "Tanımlayıcı geçersiz karakterler içeriyor."
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:80
+msgid "A user with this name already exists. Add the key to the user instead."
+msgstr "Bu isimde bir kullanıcı sistemde mevcut. Anahtarı kullanıcıya ekleyin."
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:84
+#: usr/local/www/vpn_ipsec_phase1.php:193
+msgid "Pre-Shared Key contains invalid characters."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:90
+msgid "Another entry with the same identifier already exists."
+msgstr "Aynı tanımlayıcıyla başka bir girdi sistemde mevcut."
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:107
+msgid "Edited"
+msgstr "Düzenlendi"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:110
+msgid "Added"
+msgstr "Eklendi"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:121
+msgid "VPN: IPsec: Edit Pre-Shared Key"
+msgstr "VPN: IPsec: Ön Paylaşımlı Anahtar Düzenle"
+
+#: usr/local/www/vpn_ipsec_keys_edit.php:138
+msgid ""
+"This can be either an IP address, fully qualified domain name or an e-mail "
+"address"
+msgstr "IP adresi, (tam) domain adı ya da e-posta adresi olabilir"
+
+#: usr/local/www/vpn_ipsec_mobile.php:133
+msgid "User Authentication Source"
+msgstr "Kullanıcı Kimlik Doğrulama Kaynağı"
+
+#: usr/local/www/vpn_ipsec_mobile.php:133
+msgid "Group Authentication Source"
+msgstr "Grup Kimlik Doğrulama Kaynağı"
+
+#: usr/local/www/vpn_ipsec_mobile.php:139
+msgid ""
+"A valid IP address for 'Virtual Address Pool Network' must be specified."
+msgstr "'Sanal IP Adres Havuzu' için geçerli bir IP adresi tanımlanmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:143
+msgid "A valid value for 'DNS Default Domain' must be specified."
+msgstr "'DNS Varsayılan Alan' için geçerli bir değer belirtilmelidir."
+
+#: usr/local/www/vpn_ipsec_mobile.php:150
+msgid "A valid split DNS domain list must be specified."
+msgstr "Geçerli bölünmüş DNS domain (alan adı) listesi belirtilmeli."
+
+#: usr/local/www/vpn_ipsec_mobile.php:160
+msgid ""
+"At least one DNS server must be specified to enable the DNS Server option."
+msgstr ""
+"DNS Sunucu seçeneğini etkinleştirmek için en az bir DNS sunucu "
+"tanımlanmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:162
+msgid "A valid IP address for 'DNS Server #1' must be specified."
+msgstr "'DNS Sunucu #1' için geçerli bir IP adresi tanımlanmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:164
+msgid "A valid IP address for 'DNS Server #2' must be specified."
+msgstr "'DNS Sunucu #2' için geçerli bir IP adresi tanımlanmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:166
+msgid "A valid IP address for 'DNS Server #3' must be specified."
+msgstr "'DNS Sunucu #3' için geçerli bir IP adresi tanımlanmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:168
+msgid "A valid IP address for 'DNS Server #4' must be specified."
+msgstr "'DNS Sunucu #4' için geçerli bir IP adresi tanımlanmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:173
+msgid ""
+"At least one WINS server must be specified to enable the DNS Server option."
+msgstr ""
+"DNS Sunucu seçeneğini etkinleştirmek için en az bir WINS Sunucu "
+"tanımlanmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:175
+msgid "A valid IP address for 'WINS Server #1' must be specified."
+msgstr "'WINS Sunucu #1' için geçerli bir IP adresi tanımlanmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:177
+msgid "A valid IP address for 'WINS Server #2' must be specified."
+msgstr "'WINS Sunucu #2' için geçerli bir IP adresi tanımlanmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:182
+msgid "A valid value for 'Login Banner' must be specified."
+msgstr "'Oturum Başlığı' için geçerli bir değer belirtilmelidir."
+
+#: usr/local/www/vpn_ipsec_mobile.php:241
+msgid "Mobile"
+msgstr "Mobil"
+
+#: usr/local/www/vpn_ipsec_mobile.php:336
+msgid ""
+"Support for IPsec Mobile clients is enabled but a Phase1 definition was not "
+"found"
+msgstr ""
+"Ipsec Mobil istemci desteği aktif durumda fakat Aşama 1 tanımı bulunamadı"
+
+#: usr/local/www/vpn_ipsec_mobile.php:336
+msgid "Please click Create to define one."
+msgstr "Yeni bir tane tanımlamak için Oluştur'a tıklayınız."
+
+#: usr/local/www/vpn_ipsec_mobile.php:336
+msgid "Create Phase1"
+msgstr "Aşama 1 Oluştur"
+
+#: usr/local/www/vpn_ipsec_mobile.php:359
+msgid "IKE Extensions"
+msgstr "IKE Uzantıları"
+
+#: usr/local/www/vpn_ipsec_mobile.php:368
+msgid "Enable IPsec Mobile Client Support"
+msgstr "IPsec Mobil İstemci Desteğini Etkinleştir"
+
+#: usr/local/www/vpn_ipsec_mobile.php:379
+msgid "Extended Authentication (Xauth)"
+msgstr "Genişletilmiş Kimlik Doğrulama (XAuth)"
+
+#: usr/local/www/vpn_ipsec_mobile.php:383
+msgid "User Authentication"
+msgstr "Kullanıcı Kimlik Doğrulama"
+
+#: usr/local/www/vpn_ipsec_mobile.php:401
+msgid "Group Authentication"
+msgstr "Grup Kimlik Doğrulama"
+
+#: usr/local/www/vpn_ipsec_mobile.php:406
+msgid "system"
+msgstr "sistem"
+
+#: usr/local/www/vpn_ipsec_mobile.php:415
+msgid "Client Configuration (mode-cfg)"
+msgstr "İstemci Yapılandırma (mode-cfg)"
+
+#: usr/local/www/vpn_ipsec_mobile.php:419
+msgid "Virtual Address Pool"
+msgstr "Sanal Adres Havuzu"
+
+#: usr/local/www/vpn_ipsec_mobile.php:428
+msgid "Provide a virtual IP address to clients"
+msgstr "İstemcilere sanal IP sağla"
+
+#: usr/local/www/vpn_ipsec_mobile.php:451
+msgid "Network List"
+msgstr "Ağ Listesi"
+
+#: usr/local/www/vpn_ipsec_mobile.php:460
+msgid "Provide a list of accessible networks to clients"
+msgstr "İstemcilere erişilebilir ağların listesini sağla"
+
+#: usr/local/www/vpn_ipsec_mobile.php:467
+msgid "Save Xauth Password"
+msgstr "Xauth Parolasını Kaydet"
+
+#: usr/local/www/vpn_ipsec_mobile.php:476
+msgid "Allow clients to save Xauth passwords (Cisco VPN client only)."
+msgstr ""
+"İstemcilerin Xauth parolalarını kaydetmelerine izin ver (sadece Cisco VPN "
+"istemci)."
+
+#: usr/local/www/vpn_ipsec_mobile.php:477
+msgid ""
+"NOTE: With iPhone clients, this does not work when deployed via the iPhone "
+"configuration utility, only by manual entry."
+msgstr ""
+"NOT: iPhone istemciler için dağıtılabilir bir yapılandırma aracı yoktur, "
+"sadece manuel giriş yapılmalıdır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:484
+#: usr/local/www/vpn_openvpn_csc.php:507
+#: usr/local/www/vpn_openvpn_server.php:1510
+msgid "DNS Default Domain"
+msgstr "DNS Varsayılan Alan"
+
+#: usr/local/www/vpn_ipsec_mobile.php:493
+#: usr/local/www/vpn_openvpn_csc.php:517
+#: usr/local/www/vpn_openvpn_server.php:1520
+msgid "Provide a default domain name to clients"
+msgstr "İstemcilere varsayılan alan adını sağla"
+
+#: usr/local/www/vpn_ipsec_mobile.php:507
+msgid "Split DNS"
+msgstr "Bölünmüş DNS"
+
+#: usr/local/www/vpn_ipsec_mobile.php:516
+msgid ""
+"Provide a list of split DNS domain names to clients. Enter a comma separated "
+"list."
+msgstr ""
+"DNS domain adı ve istemcilerini bölerek liste oluştur. Virgülle ayrılmış bir "
+"liste girin."
+
+#: usr/local/www/vpn_ipsec_mobile.php:517
+msgid ""
+"NOTE: If left blank, and a default domain is set, it will be used for this "
+"value."
+msgstr ""
+"NOT: Eğer boş bırakırsanız, varsayılan domain ayarlı ise, bu değer "
+"kullanılır."
+
+#: usr/local/www/vpn_ipsec_mobile.php:531
+#: usr/local/www/vpn_openvpn_csc.php:532
+#: usr/local/www/vpn_openvpn_server.php:1535
+msgid "DNS Servers"
+msgstr "DNS Sunucular"
+
+#: usr/local/www/vpn_ipsec_mobile.php:540
+#: usr/local/www/vpn_openvpn_csc.php:542
+#: usr/local/www/vpn_openvpn_server.php:1545
+msgid "Provide a DNS server list to clients"
+msgstr "İstemcilere DNS sunucu listesi sağla"
+
+#: usr/local/www/vpn_ipsec_mobile.php:573
+#: usr/local/www/vpn_openvpn_csc.php:680
+#: usr/local/www/vpn_openvpn_server.php:1703
+msgid "WINS Servers"
+msgstr "WINS Sunucular"
+
+#: usr/local/www/vpn_ipsec_mobile.php:582
+#: usr/local/www/vpn_openvpn_csc.php:690
+#: usr/local/www/vpn_openvpn_server.php:1713
+msgid "Provide a WINS server list to clients"
+msgstr "İstemcilere WINS sunucu listesi sağla"
+
+#: usr/local/www/vpn_ipsec_mobile.php:603
+msgid "Phase2 PFS Group"
+msgstr "Aşama 2 PFS Grubu"
+
+#: usr/local/www/vpn_ipsec_mobile.php:612
+msgid ""
+"Provide the Phase2 PFS group to clients ( overrides all mobile phase2 "
+"settings )"
+msgstr ""
+"İstemcilere Aşama 2 grubu sağla (tüm mobil aşama 2 ayarlarının üstüne yazar)"
+
+#: usr/local/www/vpn_ipsec_mobile.php:633
+msgid "Login Banner"
+msgstr "Oturum Açma Başlığı"
+
+#: usr/local/www/vpn_ipsec_mobile.php:642
+msgid "Provide a login banner to clients"
+msgstr "İstemcilere oturum açma başlığı sağla"
+
+#: usr/local/www/vpn_ipsec_phase1.php:165
+msgid "EAP-TLS can only be used with IKEv2 type VPNs."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:186
+#: usr/local/www/vpn_ipsec_phase1.php:649
+msgid "Remote gateway"
+msgstr "Uzak ağ geçidi"
+
+#: usr/local/www/vpn_ipsec_phase1.php:197
+msgid "The P1 lifetime must be an integer."
+msgstr "P1 yaşam süresi sayı değeri olmalıdır."
+
+#: usr/local/www/vpn_ipsec_phase1.php:201
+msgid "A valid remote gateway address or host name must be specified."
+msgstr "Geçerli bir uzak ağ geçidi ya da host adı belirtilmelidir."
+
+#: usr/local/www/vpn_ipsec_phase1.php:203
+msgid ""
+"A valid remote gateway IPv4 address must be specified or you need to change "
+"protocol to IPv6"
+msgstr ""
+"Geçerli bir uzak ağ geçidi IPv4 ağ adresi belirtilmeli yada Kipi IPv6'ya "
+"değiştirmelisiniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:205
+msgid ""
+"A valid remote gateway IPv6 address must be specified or you need to change "
+"protocol to IPv4"
+msgstr ""
+"Geçerli bir uzak ağ geçidi IPv6 ağ adresi belirtilmeli yada Kipi IPv4'e "
+"değiştirmelisiniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:214
+#, php-format
+msgid "The remote gateway \"%1$s\" is already used by phase1 \"%2$s\"."
+msgstr "Uzak ağ geçidi \"%1$s\" aşama 1 \"%2$s\" tarafından kullanılıyor."
+
+#: usr/local/www/vpn_ipsec_phase1.php:225
+msgid "There is a Phase 2 using IPv6, you cannot use IPv4."
+msgstr "2. Aşama IPv6 kullanmaktadır, IPv4 kullanamazsınız."
+
+#: usr/local/www/vpn_ipsec_phase1.php:229
+msgid "There is a Phase 2 using IPv4, you cannot use IPv6."
+msgstr "2. Aşama IPv4 kullanmaktadır, IPv6 kullanamazsınız."
+
+#: usr/local/www/vpn_ipsec_phase1.php:242
+msgid "Please enter an address for 'My Identifier'"
+msgstr "Lütfen 'Tanımlayıcım' için bir adres giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:245
+msgid "Please enter a keyid tag for 'My Identifier'"
+msgstr "Lütfen 'Tanımlayıcım' için bir anahtar kimliği başlığı giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:248
+msgid "Please enter a fully qualified domain name for 'My Identifier'"
+msgstr "Lütfen 'Tanmlayıcım' için tam bir alan (domain) adı giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:251
+msgid "Please enter a user and fully qualified domain name for 'My Identifier'"
+msgstr ""
+"Lütfen 'Tanmlayıcım' için bir kullanıcı ve tam bir alan (domain) adı giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:254
+msgid "Please enter a dynamic domain name for 'My Identifier'"
+msgstr "Lütfen 'Tanmlayıcım' için dinamik bir alan (domain) adı giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:257
+msgid "A valid IP address for 'My identifier' must be specified."
+msgstr "Lütfen 'Tanmlayıcım' için geçerli bir IP adresi giriniz."
+
+#: usr/local/www/vpn_ipsec_phase1.php:260
+msgid "A valid domain name for 'My identifier' must be specified."
+msgstr "Lütfen 'Tanmlayıcım' için geçerli bir domain adı giriniz."
+
+#: usr/local/www/vpn_ipsec_phase1.php:264
+msgid "A valid FQDN for 'My identifier' must be specified."
+msgstr "Lütfen 'Tanmlayıcım' için geçerli bir FQDN adresi giriniz."
+
+#: usr/local/www/vpn_ipsec_phase1.php:269
+msgid ""
+"A valid User FQDN in the form of user@my.domain.com for 'My identifier' must "
+"be specified."
+msgstr ""
+"Lütfen 'Tanımlayıcım' için geçerli bir tam alan adı (FQDN) giriniz. Örn: "
+"kullanici@guncel.adres.com"
+
+#: usr/local/www/vpn_ipsec_phase1.php:274
+msgid "A valid Dynamic DNS address for 'My identifier' must be specified."
+msgstr "Lütfen 'Tanımlayıcım' için geçerli bir Dinamik DNS adresi giriniz."
+
+#: usr/local/www/vpn_ipsec_phase1.php:284
+msgid "Please enter an address for 'Peer Identifier'"
+msgstr "'Eş Tanımlayıcı' için bir adres giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:287
+msgid "Please enter a keyid tag for 'Peer Identifier'"
+msgstr "'Eş Tanımlayıcı' için bir anahtar kimliği takısı giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:290
+msgid "Please enter a fully qualified domain name for 'Peer Identifier'"
+msgstr "'Eş Tanımlayıcı' için tam bir alan (domain) adı giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:293
+msgid ""
+"Please enter a user and fully qualified domain name for 'Peer Identifier'"
+msgstr ""
+"'Eş Tanımlayıcı' için bir kullanıcı ve tam bir alan (domain) adı giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:296
+msgid "A valid IP address for 'Peer identifier' must be specified."
+msgstr "'Eş Tanımlayıcı' için geçerli bir IP giriniz."
+
+#: usr/local/www/vpn_ipsec_phase1.php:299
+msgid "A valid domain name for 'Peer identifier' must be specified."
+msgstr "'Eş Tanımlayıcı' için geçerli bir alan adı giriniz."
+
+#: usr/local/www/vpn_ipsec_phase1.php:303
+msgid "A valid FQDN for 'Peer identifier' must be specified."
+msgstr "Lütfen 'Eş tanımlayıcı' için geçerli bir FQDN giriniz."
+
+#: usr/local/www/vpn_ipsec_phase1.php:308
+msgid ""
+"A valid User FQDN in the form of user@my.domain.com for 'Peer identifier' "
+"must be specified."
+msgstr ""
+"Lütfen 'Eş tanımlayıcı' için geçerli bir tam alan adı (FQDN) giriniz. Örn: "
+"kullanici@guncel.adres.com"
+
+#: usr/local/www/vpn_ipsec_phase1.php:314
+msgid "A numeric value must be specified for DPD delay."
+msgstr "DPD gecikmesi değeri sayı olmalıdır."
+
+#: usr/local/www/vpn_ipsec_phase1.php:317
+msgid "A numeric value must be specified for DPD retries."
+msgstr "DPD denemeleri sayı olmalıdır."
+
+#: usr/local/www/vpn_ipsec_phase1.php:321
+msgid "Valid arguments for IKE type is v1 or v2 or auto"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:398
+#: usr/local/www/vpn_ipsec_phase1.php:400
+msgid "Edit Phase 1"
+msgstr "Aşama 1 Düzenle"
+
+#: usr/local/www/vpn_ipsec_phase1.php:566
+#: usr/local/www/vpn_openvpn_client.php:462
+#: usr/local/www/vpn_openvpn_csc.php:333
+#: usr/local/www/vpn_openvpn_server.php:760
+msgid "General information"
+msgstr "Genel Bilgi"
+
+#: usr/local/www/vpn_ipsec_phase1.php:572
+msgid "Disable this phase1 entry"
+msgstr "Bu aşama 1 girdisini devre dışı bırak"
+
+#: usr/local/www/vpn_ipsec_phase1.php:574
+msgid ""
+"Set this option to disable this phase1 without removing it from the list"
+msgstr "Bu seçenekle aşama 1'i silmeden devre dışı bırakabilirsiniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:580
+msgid "Key Exchange version"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:591
+msgid ""
+"Select the Internet Key Exchange protocol version to be used, IKEv1 or IKEv2"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:595
+msgid "Internet Protocol"
+msgstr "İnternet Protokolü"
+
+#: usr/local/www/vpn_ipsec_phase1.php:606
+msgid "Select the Internet Protocol family from this dropdown"
+msgstr "Açılır menüden İnternet Protokol cinsini seçiniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:642
+msgid "Select the interface for the local endpoint of this phase1 entry"
+msgstr "Bu aşama 1 girdisinin yerel ucu için bir arabirim seçiniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:653
+msgid "Enter the public IP address or host name of the remote gateway"
+msgstr "Uzak ağ geçidinin dış IP adresini veya alan adını giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:675
+msgid "Phase 1 proposal (Authentication)"
+msgstr "Aşama 1 teklif (Kimlik doğrulama)"
+
+#: usr/local/www/vpn_ipsec_phase1.php:679
+#: usr/local/www/vpn_openvpn_client.php:604
+msgid "Authentication method"
+msgstr "Kimlik doğrulama yöntemi"
+
+#: usr/local/www/vpn_ipsec_phase1.php:694
+#: usr/local/www/vpn_ipsec_phase1.php:831
+#: usr/local/www/vpn_ipsec_phase1.php:847
+msgid "Must match the setting chosen on the remote side"
+msgstr "Uzak uçta seçilen ayarla eşleşmelidir"
+
+#: usr/local/www/vpn_ipsec_phase1.php:699
+msgid "Negotiation mode"
+msgstr "Uzlaşma kipi"
+
+#: usr/local/www/vpn_ipsec_phase1.php:710
+msgid "Aggressive is more flexible, but less secure"
+msgstr "'Saldırgan' dah esnek ama daha az güvenlidir"
+
+#: usr/local/www/vpn_ipsec_phase1.php:714
+msgid "My identifier"
+msgstr "Tanımlayıcım"
+
+#: usr/local/www/vpn_ipsec_phase1.php:727
+msgid "Peer identifier"
+msgstr "Eş tanımlayıcı"
+
+#: usr/local/www/vpn_ipsec_phase1.php:742
+msgid ""
+"NOTE: This is known as the \"group\" setting on some VPN client "
+"implementations"
+msgstr "NOT: Bazı VPN istemcilerde \"grup\" olarak bilinir"
+
+#: usr/local/www/vpn_ipsec_phase1.php:753
+msgid "Input your Pre-Shared Key string"
+msgstr "Ön Paylaşımlı Anahtar dizilimini giriniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:758
+msgid "My Certificate"
+msgstr "Sertifikam"
+
+#: usr/local/www/vpn_ipsec_phase1.php:772
+msgid "Select a certificate previously configured in the Certificate Manager"
+msgstr ""
+"Daha önce Sertifika Yöneticisinde yapılandırılmış bir sertifika seçiniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:777
+msgid "My Certificate Authority"
+msgstr "Sertifika Sunucum"
+
+#: usr/local/www/vpn_ipsec_phase1.php:791
+msgid ""
+"Select a certificate authority previously configured in the Certificate "
+"Manager"
+msgstr ""
+"Daha önce Sertifika Yöneticisinde yapılandırılmış bir sertifika otoritesi "
+"seçiniz"
+
+#: usr/local/www/vpn_ipsec_phase1.php:797
+msgid "Phase 1 proposal (Algorithms)"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:801
+#: usr/local/www/vpn_openvpn_client.php:828
+#: usr/local/www/vpn_openvpn_server.php:1068
+msgid "Encryption algorithm"
+msgstr "Şifreleme algoritması"
+
+#: usr/local/www/vpn_ipsec_phase1.php:820
+msgid "Hash algorithm"
+msgstr "Değer üretme algoritması"
+
+#: usr/local/www/vpn_ipsec_phase1.php:836
+msgid "DH key group"
+msgstr "DH anahtar grup"
+
+#: usr/local/www/vpn_ipsec_phase1.php:865
+msgid "Disable Rekey"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:868
+msgid "Whether a connection should be renegotiated when it is about to expire."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:872
+msgid "Disable Reauth"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:875
+msgid ""
+"Whether rekeying of an IKE_SA should also reauthenticate the peer. In IKEv1, "
+"reauthentication is always done."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase1.php:879
+msgid "NAT Traversal"
+msgstr "NAT Çözümleme"
+
+#: usr/local/www/vpn_ipsec_phase1.php:883
+msgid "Force"
+msgstr "Zorla"
+
+#: usr/local/www/vpn_ipsec_phase1.php:887
+msgid ""
+"Set this option to enable the use of NAT-T (i.e. the encapsulation of ESP in "
+"UDP packets) if needed, which can help with clients that are behind "
+"restrictive firewalls"
+msgstr ""
+"Bu seçeneği, gerekiyorsa kısıtlayıcılığı yüksek güvenlik duvarları arkasında "
+"bulunan istemcilere yardımı olabilecek NAT-T (ESPnin UDP paketleriyle "
+"sarmalanması) kullanımını açmak için kullanın"
+
+#: usr/local/www/vpn_ipsec_phase1.php:893
+msgid "Dead Peer Detection"
+msgstr "Ölü Eş Keşfi"
+
+#: usr/local/www/vpn_ipsec_phase1.php:896
+msgid "Enable DPD"
+msgstr "DPD'yi Etkinleştir"
+
+#: usr/local/www/vpn_ipsec_phase1.php:902
+msgid "Delay between requesting peer acknowledgement"
+msgstr "Eş onayı istemleri arasındaki bekleme"
+
+#: usr/local/www/vpn_ipsec_phase1.php:906
+msgid "retries"
+msgstr "deneme"
+
+#: usr/local/www/vpn_ipsec_phase1.php:908
+msgid "Number of consecutive failures allowed before disconnect"
+msgstr "Bağlantı koparılmadan önce ardışık kaç başarısızlığa izin veriliyor"
+
+#: usr/local/www/vpn_ipsec_phase2.php:132
+msgid "A valid ikeid must be specified."
+msgstr "Geçerli bir ikeid belirtilmelidir."
+
+#: usr/local/www/vpn_ipsec_phase2.php:136
+msgid "Local network type"
+msgstr "Yerel ağ türü"
+
+#: usr/local/www/vpn_ipsec_phase2.php:136
+msgid "Unique Identifier"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:139
+msgid "Remote network type"
+msgstr "Uzak ağ türü"
+
+#: usr/local/www/vpn_ipsec_phase2.php:149
+msgid "A valid local network bit count must be specified."
+msgstr "Geçerli bir yerel ağ bit sayısı belirtilmelidir."
+
+#: usr/local/www/vpn_ipsec_phase2.php:152
+msgid "A valid local network IP address must be specified."
+msgstr "Geçerli bir yerel ağ IP adresi belirtilmelidir."
+
+#: usr/local/www/vpn_ipsec_phase2.php:154
+msgid ""
+"A valid local network IPv4 address must be specified or you need to change "
+"Mode to IPv6"
+msgstr ""
+"Geçerli bir yerel IPv4 ağ adresi belirtilmeli yada Kipi IPv6'ya "
+"değiştirmelisiniz"
+
+#: usr/local/www/vpn_ipsec_phase2.php:156
+msgid ""
+"A valid local network IPv6 address must be specified or you need to change "
+"Mode to IPv4"
+msgstr ""
+"Geçerli bir yerel IPv6 ağ adresi belirtilmeli yada Kipi IPv4'e "
+"değiştirmelisiniz"
+
+#: usr/local/www/vpn_ipsec_phase2.php:166
+#: usr/local/www/vpn_ipsec_phase2.php:192
+msgid "Invalid Local Network."
+msgstr "Geçersiz Yerel Ağ."
+
+#: usr/local/www/vpn_ipsec_phase2.php:166
+#: usr/local/www/vpn_ipsec_phase2.php:192
+msgid "has no subnet."
+msgstr "altağ değil."
+
+#: usr/local/www/vpn_ipsec_phase2.php:173
+msgid "A valid NAT local network bit count must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:175
+msgid ""
+"You cannot configure a network type address for NAT while only an address "
+"type is selected for local source."
+msgstr ""
+"Sadece yerel kaynaktan adres türü seçildiyse NAT için ağ türü adresi "
+"yapılandıramazsınız."
+
+#: usr/local/www/vpn_ipsec_phase2.php:178
+msgid "A valid NAT local network IP address must be specified."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:180
+msgid ""
+"A valid NAT local network IPv4 address must be specified or you need to "
+"change Mode to IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:182
+msgid ""
+"A valid NAT local network IPv6 address must be specified or you need to "
+"change Mode to IPv4"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:199
+msgid "A valid remote network bit count must be specified."
+msgstr "Geçerli bir uzak ağ bit sayısı belirtilmelidir."
+
+#: usr/local/www/vpn_ipsec_phase2.php:202
+msgid "A valid remote network IP address must be specified."
+msgstr "Geçerli bir uzak ağ IP adresi belirtilmelidir."
+
+#: usr/local/www/vpn_ipsec_phase2.php:204
+msgid ""
+"A valid remote network IPv4 address must be specified or you need to change "
+"Mode to IPv6"
+msgstr ""
+"Geçerli bir uzak IPv4 ağ adresi belirtilmeli yada Kipi IPv6'ya "
+"değiştirmelisiniz"
+
+#: usr/local/www/vpn_ipsec_phase2.php:206
+msgid ""
+"A valid remote network IPv6 address must be specified or you need to change "
+"Mode to IPv4"
+msgstr ""
+"Geçerli bir uzak IPv6 ağ adresi belirtilmeli yada Kipi IPv4'e "
+"değiştirmelisiniz"
+
+#: usr/local/www/vpn_ipsec_phase2.php:224
+msgid "Phase2 with this Local Network is already defined for mobile clients."
+msgstr "Mobil istemciler için bu Yerel Ağda Aşama 2 zaten tanımlı."
+
+#: usr/local/www/vpn_ipsec_phase2.php:249
+msgid ""
+"Phase2 with this Local/Remote networks combination is already defined for "
+"this Phase1."
+msgstr ""
+"Bu Yerel/Uzak ağ kombinasyonları için bu Aşama 1'in 2nci Aşaması zaten "
+"tanımlı."
+
+#: usr/local/www/vpn_ipsec_phase2.php:280
+#: usr/local/www/vpn_ipsec_phase2.php:285
+msgid ""
+"The local and remote networks of a phase 2 entry cannot overlap the outside "
+"of the tunnel (interface and remote gateway) configured in its phase 1."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:299
+msgid "At least one encryption algorithm must be selected."
+msgstr "En az bir şifreleme algoritması seçilmelidir."
+
+#: usr/local/www/vpn_ipsec_phase2.php:304
+msgid "At least one hashing algorithm needs to be selected."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_phase2.php:313
+msgid "The P2 lifetime must be an integer."
+msgstr "P2 yaşam süresi değeri tamsayı olmalıdır."
+
+#: usr/local/www/vpn_ipsec_phase2.php:360
+#: usr/local/www/vpn_ipsec_phase2.php:362
+msgid "Edit Phase 2"
+msgstr "Aşama 2 Düzenle"
+
+#: usr/local/www/vpn_ipsec_phase2.php:555
+msgid "Disable this phase2 entry"
+msgstr "Bu Aşama 2 girdisini devre dışı bırak"
+
+#: usr/local/www/vpn_ipsec_phase2.php:557
+msgid ""
+"Set this option to disable this phase2 entry without removing it from the "
+"list"
+msgstr ""
+"Bu seçeneği etkinleştirerek aşama 2 girdisini lsiteden silmeden devre dışı "
+"bırakabilirsiniz"
+
+#: usr/local/www/vpn_ipsec_phase2.php:578
+msgid "Local Network"
+msgstr "Yerel Ağ"
+
+#: usr/local/www/vpn_ipsec_phase2.php:592
+#: usr/local/www/vpn_ipsec_phase2.php:627
+#, php-format
+msgid "%s subnet"
+msgstr "%s altağ"
+
+#: usr/local/www/vpn_ipsec_phase2.php:614
+msgid ""
+"In case you need NAT/BINAT on this network specify the address to be "
+"translated"
+msgstr ""
+"Bu durumda ağ üzerinde NAT/BINAT çevrilecek adresini belirtmeniz gerekir"
+
+#: usr/local/www/vpn_ipsec_phase2.php:655
+msgid "Remote Network"
+msgstr "Uzak Ağ"
+
+#: usr/local/www/vpn_ipsec_phase2.php:706
+msgid "Phase 2 proposal (SA/Key Exchange)"
+msgstr "Aşama 2 teklif (SA/Anahtar Değişimi)"
+
+#: usr/local/www/vpn_ipsec_phase2.php:721
+msgid "ESP is encryption, AH is authentication only"
+msgstr "ESP şifreleme, AH sadece kimlik doğrulama içindir"
+
+#: usr/local/www/vpn_ipsec_phase2.php:726
+msgid "Encryption algorithms"
+msgstr "Şifreleme algoritmaları"
+
+#: usr/local/www/vpn_ipsec_phase2.php:768
+msgid ""
+"Hint: use 3DES for best compatibility or if you have a hardware crypto "
+"accelerator card. Blowfish is usually the fastest in software encryption"
+msgstr ""
+"İpucu: En yüksek uyumluluk için ya da donanım şifreleme hızlandırıcı "
+"kartınız varsa 3DES kullanın. Yazılım şifreleme söz konusu olduğunda "
+"Blowfish en hızlısıdır"
+
+#: usr/local/www/vpn_ipsec_phase2.php:774
+msgid "Hash algorithms"
+msgstr "Değer üretme algoritmaları"
+
+#: usr/local/www/vpn_ipsec_phase2.php:784
+msgid "PFS key group"
+msgstr "PFS anahtar grubu"
+
+#: usr/local/www/vpn_ipsec_phase2.php:802
+msgid "Set globally in mobile client options"
+msgstr "Mobil istemci seçeneklerinde genel olarak yapılandırılır"
+
+#: usr/local/www/vpn_ipsec_phase2.php:820
+msgid "Automatically ping host"
+msgstr "Hostu otomatik pingle"
+
+#: usr/local/www/vpn_ipsec_settings.php:217
+msgid "IPsec Advanced Settings"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:220
+msgid "Security Associations"
+msgstr "Güvenlik İlişkilendirmeleri"
+
+#: usr/local/www/vpn_ipsec_settings.php:223
+msgid "Prefer older IPsec SAs"
+msgstr "Daha eski IPsec SA'larını seç"
+
+#: usr/local/www/vpn_ipsec_settings.php:225
+msgid ""
+"By default, if several SAs match, the newest one is preferred if it's at "
+"least 30 seconds old. Select this option to always prefer old SAs over new "
+"ones."
+msgstr ""
+"Varsayılan olarak birden fazla SA eşleştiği taktirde, en az 30 saniyedir "
+"hayatta olan en yenisi tercih edilir. Daha eski olanları yenilere tercih "
+"etmek için bu seçeneği açın."
+
+#: usr/local/www/vpn_ipsec_settings.php:231
+msgid "IPsec Debug"
+msgstr "IPsec Hata Ayıklama"
+
+#: usr/local/www/vpn_ipsec_settings.php:233
+msgid "Start IPsec in debug mode based on sections selected"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:254
+msgid ""
+"Launches IPsec in debug mode so that more verbose logs will be generated to "
+"aid in troubleshooting."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:259
+msgid "IPsec Reload on Failover"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:262
+msgid "Force IPsec Reload on Failover"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:264
+msgid ""
+"In some circumstances using a gateway group as the interface for an IPsec "
+"tunnel does not function properly, and IPsec must be forcefully reloaded "
+"when a failover occurs. Because this will disrupt all IPsec tunnels, this "
+"behavior is disabled by default. Check this box to force IPsec to fully "
+"reload on failover."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:271
+msgid "Unencrypted payloads in IKEv1 Main Mode"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:274
+msgid "Accept unencrypted ID and HASH payloads in IKEv1 Main Mode"
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:276
+msgid ""
+"Some implementations send the third Main Mode message unencrypted, probably "
+"to find the PSKs for the specified ID for authentication.This is very "
+"similar to Aggressive Mode, and has the same security implications: A "
+"passive attacker can sniff the negotiated Identity, and start brute forcing "
+"the PSK using the HASH payload. It is recommended to keep this option to no, "
+"unless you know exactly what the implications are and require compatibility "
+"to such devices (for example, some SonicWall boxes)."
+msgstr ""
+
+#: usr/local/www/vpn_ipsec_settings.php:283
+msgid "Maximum MSS"
+msgstr "Maksimum MSS"
+
+#: usr/local/www/vpn_ipsec_settings.php:286
+msgid "Enable MSS clamping on VPN traffic"
+msgstr "VPN trafikte MSS sıkma özelliğini aç"
+
+#: usr/local/www/vpn_ipsec_settings.php:290
+msgid ""
+"Enable MSS clamping on TCP flows over VPN. This helps overcome problems with "
+"PMTUD on IPsec VPN links. If left blank, the default value is 1400 bytes. "
+msgstr ""
+"VPN üzerinden gerçekleşen TCP akışlarında MSS sıkma özelliğini etkinleştir. "
+"Bu seçenek IPsec VPN bağlantılardaki PMTUD problemlerinin giderilmesine "
+"yardımcı olur. Boş bırakarak varsayılan 1400 kullanılmasını "
+"sağlayabilirsiniz."
+
+#: usr/local/www/vpn_l2tp.php:75 usr/local/www/vpn_pppoe_edit.php:114
+#: usr/local/www/vpn_pppoe_edit.php:436 usr/local/www/vpn_pptp.php:83
+#: usr/local/www/vpn_pptp.php:362
+msgid "Server address"
+msgstr "Sunucu adresi"
+
+#: usr/local/www/vpn_l2tp.php:75 usr/local/www/vpn_pppoe_edit.php:114
+#: usr/local/www/vpn_pptp.php:83
+msgid "Remote start address"
+msgstr "Uzak başlangıç adresi"
+
+#: usr/local/www/vpn_l2tp.php:80 usr/local/www/vpn_pppoe_edit.php:119
+#: usr/local/www/vpn_pptp.php:88
+msgid "RADIUS server address"
+msgstr "RADIUS sunucu adresi"
+
+#: usr/local/www/vpn_l2tp.php:80 usr/local/www/vpn_pppoe_edit.php:119
+#: usr/local/www/vpn_pptp.php:88 usr/local/www/vpn_pptp.php:442
+msgid "RADIUS shared secret"
+msgstr "RADIUS paylaşımlı anahtar"
+
+#: usr/local/www/vpn_l2tp.php:86 usr/local/www/vpn_pppoe_edit.php:125
+#: usr/local/www/vpn_pptp.php:94
+msgid "A valid server address must be specified."
+msgstr "Geçerli bir sunucu adresi belirtilmelidir."
+
+#: usr/local/www/vpn_l2tp.php:89 usr/local/www/vpn_pptp.php:97
+msgid ""
+"'Server address' parameter should NOT be set to any IP address currently in "
+"use on this firewall."
+msgstr ""
+"'Sunucu adresi' parametresi güvenlik duvarında kullanılacak herhangi bir IP "
+"adresine AYARLANAMAZ."
+
+#: usr/local/www/vpn_l2tp.php:92 usr/local/www/vpn_pppoe_edit.php:127
+#: usr/local/www/vpn_pptp.php:100
+msgid "A valid remote start address must be specified."
+msgstr "Geçerli bir uzak başlangıç adresi belirtilmelidir."
+
+#: usr/local/www/vpn_l2tp.php:95 usr/local/www/vpn_pppoe_edit.php:129
+#: usr/local/www/vpn_pptp.php:103
+msgid "A valid RADIUS server address must be specified."
+msgstr "Geçerli bir RADIUS sunucu adresi belirtilmelidir."
+
+#: usr/local/www/vpn_l2tp.php:111 usr/local/www/vpn_pppoe_edit.php:136
+#: usr/local/www/vpn_pptp.php:112
+msgid "The specified server address lies in the remote subnet."
+msgstr "Belirtilen sunucu adresi uzak ağ aralığı içinde kalıyor."
+
+#: usr/local/www/vpn_l2tp.php:114 usr/local/www/vpn_pptp.php:116
+msgid "The specified server address is equal to the LAN interface address."
+msgstr "Belirtilen sunucu adresi LAN arabirim adresi ile aynı."
+
+#: usr/local/www/vpn_l2tp.php:285 usr/local/www/vpn_l2tp_users.php:94
+#: usr/local/www/vpn_pptp.php:306 usr/local/www/vpn_pptp_users.php:91
+msgid "Configuration"
+msgstr "Yapılandırma"
+
+#: usr/local/www/vpn_l2tp.php:305
+msgid "Enable L2TP server"
+msgstr "L2TP Sunucusunu Etkinleştir"
+
+#: usr/local/www/vpn_l2tp.php:326
+msgid "Server Address"
+msgstr "Sunucu Adresi"
+
+#: usr/local/www/vpn_l2tp.php:330
+msgid ""
+"Enter the IP address the L2TP server should give to clients for use as their "
+"\"gateway\""
+msgstr ""
+"L2TP sunucunun tüm istemcilere \"ağ geçidi\" olarak göndereceği IP adresini "
+"giriniz"
+
+#: usr/local/www/vpn_l2tp.php:332 usr/local/www/vpn_pppoe_edit.php:442
+#: usr/local/www/vpn_pptp.php:368
+msgid "Typically this is set to an unused IP just outside of the client range"
+msgstr "Genelde istemci aralığının hemen dışında, kullanılmayan bir IP verilir"
+
+#: usr/local/www/vpn_l2tp.php:335 usr/local/www/vpn_pppoe_edit.php:445
+#: usr/local/www/vpn_pptp.php:371
+msgid ""
+"NOTE: This should NOT be set to any IP address currently in use on this "
+"firewall"
+msgstr ""
+"NOT: Bu ayar bu güvenlik duvarında kullanımda olan bir IP adresi olmamalıdır"
+
+#: usr/local/www/vpn_l2tp.php:338
+msgid "Remote Address Range"
+msgstr "Uzak Adres Aralığı"
+
+#: usr/local/www/vpn_l2tp.php:342
+msgid "Specify the starting address for the client IP address subnet."
+msgstr "İstemci IP adres aştağı için başlangış adresi belirtiniz."
+
+# kelime içinde anlamı olmadığı için boş geçilmelidir.
+#: usr/local/www/vpn_l2tp.php:359 usr/local/www/vpn_pppoe_edit.php:415
+msgid "is"
+msgstr " "
+
+#: usr/local/www/vpn_l2tp.php:363
+msgid "Number of L2TP users"
+msgstr "L2TP kullanıcı sayısı"
+
+#: usr/local/www/vpn_l2tp.php:376
+msgid "is ten L2TP clients"
+msgstr "10 (on) L2TP istemcisidir"
+
+#: usr/local/www/vpn_l2tp.php:380
+msgid "Secret"
+msgstr "Anahtar"
+
+#: usr/local/www/vpn_l2tp.php:384
+msgid ""
+"Specify optional secret shared between peers. Required on some devices/"
+"setups."
+msgstr ""
+"Eşler arasında paylaşılan ve isteğe bağlı olan anahtarı belirtin. Bazı "
+"aygıtlarda ve yapılandırmalarda gereklidir."
+
+#: usr/local/www/vpn_l2tp.php:388
+msgid "Authentication Type"
+msgstr "Kimlik Doğrulama Türü"
+
+#: usr/local/www/vpn_l2tp.php:391
+msgid "CHAP"
+msgstr "CHAP"
+
+#: usr/local/www/vpn_l2tp.php:395
+msgid "Specifies which protocol to use for authentication."
+msgstr "Kimlik doğrulama için hangi protokolün kullanılacağını belirler."
+
+#: usr/local/www/vpn_l2tp.php:399
+msgid "L2TP DNS Servers"
+msgstr "L2TP DNS Sunucuları"
+
+#: usr/local/www/vpn_l2tp.php:405
+msgid "primary and secondary DNS servers assigned to L2TP clients"
+msgstr "L2TP istemcilere atanacak birincil ve ikincil DNS sunucu"
+
+#: usr/local/www/vpn_l2tp.php:409 usr/local/www/vpn_pptp.php:393
+msgid "WINS Server"
+msgstr "WINS Sunucu"
+
+#: usr/local/www/vpn_l2tp.php:415 usr/local/www/vpn_pppoe_edit.php:473
+#: usr/local/www/vpn_pptp.php:399
+msgid "RADIUS"
+msgstr "RADIUS"
+
+#: usr/local/www/vpn_l2tp.php:418 usr/local/www/vpn_pppoe_edit.php:476
+#: usr/local/www/vpn_pptp.php:402
+msgid "Use a RADIUS server for authentication"
+msgstr "Kimlik doğrulama için RADIUS sunucu kullan"
+
+#: usr/local/www/vpn_l2tp.php:419
+msgid ""
+"When set, all users will be authenticated using the RADIUS server specified "
+"below. The local user database will not be used."
+msgstr ""
+"Etkinleştirildiğinde istemciler aşağıda belirtilen RADIUS sunucusundan "
+"kimlik doğrularlar. Yerel kullanıcı veritabanı kullanılmaz."
+
+#: usr/local/www/vpn_l2tp.php:422 usr/local/www/vpn_pppoe_edit.php:482
+#: usr/local/www/vpn_pptp.php:408
+msgid "Enable RADIUS accounting"
+msgstr "RADIUS hesaplandırmayı etkinleştir"
+
+#: usr/local/www/vpn_l2tp.php:423
+msgid "Sends accounting packets to the RADIUS server."
+msgstr "Hesaplandırma paketlerini RADIUS sunucuya gönderir."
+
+#: usr/local/www/vpn_l2tp.php:426 usr/local/www/vpn_pptp.php:433
+msgid "RADIUS Server"
+msgstr "RADIUS Sunucu"
+
+#: usr/local/www/vpn_l2tp.php:430
+msgid "Enter the IP address of the RADIUS server."
+msgstr "RADIUS sunucunun IP adresini giriniz."
+
+#: usr/local/www/vpn_l2tp.php:433
+msgid "RADIUS Shared Secret"
+msgstr "RADIUS Paylaşımlı Anahtar"
+
+#: usr/local/www/vpn_l2tp.php:437
+msgid ""
+"Enter the shared secret that will be used to authenticate to the RADIUS "
+"server."
+msgstr ""
+"RADIUS sunucu ile kimlik doğrulamada kullanılacak paylaşımlı anahtarı "
+"giriniz."
+
+#: usr/local/www/vpn_l2tp.php:440
+msgid "RADIUS Issued IP's"
+msgstr "RADIUS Verilen IP(ler)"
+
+#: usr/local/www/vpn_l2tp.php:444
+msgid "Issue IP Addresses via RADIUS server."
+msgstr "IP Adreslerini RADIUS sunucu sağlasın."
+
+#: usr/local/www/vpn_l2tp.php:457
+msgid ""
+"Don't forget to add a firewall rule to permit traffic from L2TP clients!"
+msgstr ""
+"Güvenlik Duvarında L2TP istemcilerinden trafiğe izin verecek kural "
+"oluşturulmalıdır!"
+
+#: usr/local/www/vpn_l2tp_users.php:86 usr/local/www/vpn_pptp_users.php:83
+msgid "Warning: RADIUS is enabled. The local user database will not be used."
+msgstr ""
+"Uyarı: RADIUS etkinleştirildi. Yerel kullanıcı veritabanı kullanılmayacaktır."
+
+#: usr/local/www/vpn_l2tp_users.php:88
+msgid "The l2tp user list has been modified"
+msgstr "L2TP kullanıcı listesi değiştirildi"
+
+#: usr/local/www/vpn_l2tp_users.php:88 usr/local/www/vpn_pptp_users.php:85
+msgid "You must apply the changes in order for them to take effect"
+msgstr "Değişiklikleri uygulayarak etkin olmasını sağlayabilirsiniz"
+
+#: usr/local/www/vpn_l2tp_users.php:88
+msgid "Warning: this will terminate all current l2tp sessions!"
+msgstr "Uyarı: Tüm aktif L2TP oturumları sonlandırılacaktır!"
+
+#: usr/local/www/vpn_l2tp_users_edit.php:95
+#: usr/local/www/vpn_pptp_users_edit.php:94
+msgid "The password contains invalid characters."
+msgstr "Parola geçersiz karakterler içermekte."
+
+#: usr/local/www/vpn_l2tp_users_edit.php:101
+#: usr/local/www/vpn_pptp_users_edit.php:100
+msgid "The IP address entered is not valid."
+msgstr "Girilen IP adresi geçerli değil."
+
+#: usr/local/www/vpn_l2tp_users_edit.php:169
+#: usr/local/www/vpn_pptp_users_edit.php:160
+msgid "confirmation"
+msgstr "onay"
+
+#: usr/local/www/vpn_l2tp_users_edit.php:170
+msgid "If you want to change the users password, enter it here twice."
+msgstr ""
+"Kullanıcı şifresini değiştirmek için yeni şifreyi burada iki defa giriniz."
+
+#: usr/local/www/vpn_l2tp_users_edit.php:177
+#: usr/local/www/vpn_pptp_users_edit.php:168
+msgid ""
+"If you want the user to be assigned a specific IP address, enter it here."
+msgstr ""
+"Kullanıcıya özel bir IP adresi atanması için IP adresini buraya giriniz."
+
+#: usr/local/www/vpn_openvpn_client.php:41
+#: usr/local/www/vpn_openvpn_client.php:446
+#: usr/local/www/vpn_openvpn_csc.php:317
+#: usr/local/www/vpn_openvpn_server.php:744
+msgid "Client"
+msgstr "İstemci"
+
+#: usr/local/www/vpn_openvpn_client.php:88
+msgid "Client successfully deleted"
+msgstr "İstemci başarıyla silindi"
+
+#: usr/local/www/vpn_openvpn_client.php:180
+#: usr/local/www/vpn_openvpn_server.php:232
+msgid ""
+"Protocol and IP address families do not match. You cannot select an IPv6 "
+"protocol and an IPv4 IP address."
+msgstr ""
+"Protokol ve IP adresi ailesi eşleşmiyor. IPv6 protokolü ve IPv4 IP adresi "
+"seçemezsiniz."
+
+#: usr/local/www/vpn_openvpn_client.php:182
+#: usr/local/www/vpn_openvpn_server.php:234
+msgid ""
+"Protocol and IP address families do not match. You cannot select an IPv4 "
+"protocol and an IPv6 IP address."
+msgstr ""
+"Protokol ve IP adresi ailesi eşleşmiyor. IPv4 protokolü ve IPv6 IP adresi "
+"seçemezsiniz."
+
+#: usr/local/www/vpn_openvpn_client.php:184
+#: usr/local/www/vpn_openvpn_server.php:236
+msgid ""
+"An IPv4 protocol was selected, but the selected interface has no IPv4 "
+"address."
+msgstr "IPv4 protokolü seçildi ancak seçili arabirimin IPv4 adresi yok."
+
+#: usr/local/www/vpn_openvpn_client.php:186
+#: usr/local/www/vpn_openvpn_server.php:238
+msgid ""
+"An IPv6 protocol was selected, but the selected interface has no IPv6 "
+"address."
+msgstr "IPv6 protokolü seçildi ancak seçili arabirimin IPv6 adresi yok."
+
+#: usr/local/www/vpn_openvpn_client.php:202
+#: usr/local/www/vpn_openvpn_server.php:273
+msgid "The specified 'Local port' is in use. Please select another value"
+msgstr "Belirtilen yerel port kullanımda. Lütfen başka port seçiniz"
+
+#: usr/local/www/vpn_openvpn_client.php:221
+msgid "User name and password are required for proxy with authentication."
+msgstr "Kimlik doğrulamalı vekil için kullanıcı adı ve parola gereklidir."
+
+#: usr/local/www/vpn_openvpn_client.php:240
+msgid "The bandwidth limit must be a positive numeric value."
+msgstr "Bant genişliği limiti pozitif bir sayısal değer olmalıdır."
+
+#: usr/local/www/vpn_openvpn_client.php:248
+#: usr/local/www/vpn_openvpn_server.php:281
+msgid "The field 'Shared Key' does not appear to be valid"
+msgstr "Paylaşımlı anahtar alanı geçersiz görünüyor"
+
+#: usr/local/www/vpn_openvpn_client.php:253
+#: usr/local/www/vpn_openvpn_server.php:286
+msgid "The field 'TLS Authentication Key' does not appear to be valid"
+msgstr "TLS Kimlik Doğrulama Anahtarı alanı geçersiz görünüyor"
+
+#: usr/local/www/vpn_openvpn_client.php:262
+#: usr/local/www/vpn_openvpn_server.php:337
+msgid "Shared key"
+msgstr "Paylaşımlı anahtar"
+
+#: usr/local/www/vpn_openvpn_client.php:268
+msgid ""
+"If no Client Certificate is selected, a username and password must be "
+"entered."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:447
+#: usr/local/www/vpn_openvpn_csc.php:318
+#: usr/local/www/vpn_openvpn_server.php:745
+msgid "Client Specific Overrides"
+msgstr "İstemciye Özel Ayarlar"
+
+#: usr/local/www/vpn_openvpn_client.php:476
+msgid "Disable this client"
+msgstr "Bu istemciyi devre dışı bırak"
+
+#: usr/local/www/vpn_openvpn_client.php:481
+msgid ""
+"Set this option to disable this client without removing it from the list"
+msgstr "Bu seçenekle istemciyi listeden silmeden devre dışı bırakabilirsiniz"
+
+#: usr/local/www/vpn_openvpn_client.php:485
+#: usr/local/www/vpn_openvpn_server.php:783
+msgid "Server Mode"
+msgstr "Sunucu Kipi"
+
+#: usr/local/www/vpn_openvpn_client.php:515
+msgid "Device mode"
+msgstr "Aygıt kipi"
+
+#: usr/local/www/vpn_openvpn_client.php:566
+#: usr/local/www/vpn_openvpn_server.php:886
+msgid "Local port"
+msgstr "Yerel port"
+
+#: usr/local/www/vpn_openvpn_client.php:570
+msgid ""
+"Set this option if you would like to bind to a specific port. Leave this "
+"blank or enter 0 for a random dynamic port."
+msgstr ""
+"Bu seçenekle belirli bir porta bağlanmayı sağlayabilirsiniz. Boş bırakarak "
+"ya da 0 girerek rasgele bir port seçilmesini sağlayabilirsiniz."
+
+#: usr/local/www/vpn_openvpn_client.php:574
+msgid "Server host or address"
+msgstr "Sunucu host yada adres"
+
+#: usr/local/www/vpn_openvpn_client.php:580
+msgid "Server port"
+msgstr "Sunucu portu"
+
+#: usr/local/www/vpn_openvpn_client.php:586
+msgid "Proxy host or address"
+msgstr "Vekil host ya da adres"
+
+#: usr/local/www/vpn_openvpn_client.php:592
+msgid "Proxy port"
+msgstr "Vekil portu"
+
+#: usr/local/www/vpn_openvpn_client.php:598
+msgid "Proxy authentication extra options"
+msgstr "Vekil kimlik doğrulama ek seçenekleri"
+
+#: usr/local/www/vpn_openvpn_client.php:610
+msgid "basic"
+msgstr "temel"
+
+#: usr/local/www/vpn_openvpn_client.php:611
+msgid "ntlm"
+msgstr "ntlm"
+
+#: usr/local/www/vpn_openvpn_client.php:642
+msgid "Server host name resolution"
+msgstr "Sunucu host isim çözümleme"
+
+#: usr/local/www/vpn_openvpn_client.php:652
+msgid "Infinitely resolve server"
+msgstr "Sürekli sunucu adresi çözümle"
+
+#: usr/local/www/vpn_openvpn_client.php:657
+msgid ""
+"Continuously attempt to resolve the server host name. Useful when "
+"communicating with a server that is not permanently connected to the Internet"
+msgstr ""
+"Sunucu host adını çözümleyene kadar devam et. Internete sürekli bağlı "
+"olmayan bir sunucuyla iletişim kurarken faydalıdır"
+
+#: usr/local/www/vpn_openvpn_client.php:674
+msgid "User Authentication Settings"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:677
+msgid "User name/pass"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:679
+msgid "Leave empty when no user name and password are needed."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:706
+#: usr/local/www/vpn_openvpn_server.php:903
+msgid "Cryptographic Settings"
+msgstr "Şifreleme Ayarı"
+
+#: usr/local/www/vpn_openvpn_client.php:709
+#: usr/local/www/vpn_openvpn_server.php:906
+msgid "TLS Authentication"
+msgstr "TLS Kimlik Doğrulama"
+
+#: usr/local/www/vpn_openvpn_client.php:719
+#: usr/local/www/vpn_openvpn_server.php:916
+msgid "Enable authentication of TLS packets"
+msgstr "TLS paketlerinin kimlik doğrulamasına izin ver"
+
+#: usr/local/www/vpn_openvpn_client.php:733
+#: usr/local/www/vpn_openvpn_server.php:930
+msgid "Automatically generate a shared TLS authentication key"
+msgstr "Otomatik olarak paylaşımlı bir TLS kimlik doğrulama anahtarı oluştur"
+
+#: usr/local/www/vpn_openvpn_client.php:744
+#: usr/local/www/vpn_openvpn_client.php:821
+#: usr/local/www/vpn_openvpn_server.php:941
+#: usr/local/www/vpn_openvpn_server.php:1061
+msgid "Paste your shared key here"
+msgstr "Paylaşımlı anahtarınızı bu alana yapıştırınız"
+
+#: usr/local/www/vpn_openvpn_client.php:770
+msgid "Client Certificate"
+msgstr "İstemci Sertifikası"
+
+#: usr/local/www/vpn_openvpn_client.php:799
+#: usr/local/www/vpn_openvpn_server.php:1039
+msgid "Shared Key"
+msgstr "Paylaşımlı Anahtar"
+
+#: usr/local/www/vpn_openvpn_client.php:810
+#: usr/local/www/vpn_openvpn_server.php:1050
+msgid "Automatically generate a shared key"
+msgstr "Otomatik olarak bir paylaşımlı anahtar oluştur"
+
+#: usr/local/www/vpn_openvpn_client.php:846
+#: usr/local/www/vpn_openvpn_server.php:1086
+msgid "Auth Digest Algorithm"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:861
+msgid ""
+"NOTE: Leave this set to SHA1 unless the server is set to match. SHA1 is the "
+"default for OpenVPN."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:865
+#: usr/local/www/vpn_openvpn_server.php:1105
+msgid "Hardware Crypto"
+msgstr "Donanım Şifreleme"
+
+#: usr/local/www/vpn_openvpn_client.php:886
+#: usr/local/www/vpn_openvpn_csc.php:396
+#: usr/local/www/vpn_openvpn_server.php:1169
+msgid "Tunnel Settings"
+msgstr "Tünel Ayarları"
+
+#: usr/local/www/vpn_openvpn_client.php:889
+#: usr/local/www/vpn_openvpn_server.php:1172
+msgid "IPv4 Tunnel Network"
+msgstr "IPv4 Tünel Ağ"
+
+#: usr/local/www/vpn_openvpn_client.php:893
+#: usr/local/www/vpn_openvpn_csc.php:403
+msgid ""
+"This is the virtual network used for private communications between this "
+"client and the server expressed using CIDR (eg. 10.0.8.0/24). The first "
+"network address is assumed to be the server address and the second network "
+"address will be assigned to the client virtual interface"
+msgstr ""
+"Bu sunucu ile CIDR yoluyla belirtilen istemciler (örn 10.0.8.0/24) arasında "
+"özel iletişim için kullanılacak sanal ağdır. İlk ağ adresi sunucu adresi "
+"olarak kabul edilir ve ikinci ağ adresi de istemci sanal arabirimine atanır"
+
+#: usr/local/www/vpn_openvpn_client.php:903
+#: usr/local/www/vpn_openvpn_server.php:1186
+msgid "IPv6 Tunnel Network"
+msgstr "IPv6 Tünel Ağ"
+
+#: usr/local/www/vpn_openvpn_client.php:907
+msgid ""
+"This is the IPv6 virtual network used for private communications between "
+"this client and the server expressed using CIDR (eg. fe80::/64). The first "
+"network address is assumed to be the server address and the second network "
+"address will be assigned to the client virtual interface"
+msgstr ""
+"Bu IPv6 sunucu ile CIDR yoluyla belirtilen istemciler (örn. fe80::/64) "
+"arasında özel iletişim için kullanılacak sanal ağdır. İlk ağ adresi sunucu "
+"adresi olarak kabul edilir ve ikinci ağ adresi de istemci sanal arabirimine "
+"atanır"
+
+#: usr/local/www/vpn_openvpn_client.php:917
+#: usr/local/www/vpn_openvpn_csc.php:435
+#: usr/local/www/vpn_openvpn_server.php:1313
+msgid "IPv4 Remote Network/s"
+msgstr "Uzaktaki IPv4 Ağ(lar)ı"
+
+#: usr/local/www/vpn_openvpn_client.php:921
+msgid ""
+"These are the IPv4 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more CIDR ranges. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank to only communicate with other clients"
+msgstr ""
+"Yönlendirme tablolarında elle değişiklik yapmadan alanlar arası sanal özel "
+"IPv4 ağı (site-to-site VPN) kurulabilmesi için Tünel içinden yönlendirilecek "
+"bir ağdır. CIDR aralığı virgülle ayrılmış bir yada daha fazla liste olarak "
+"girilir. Eğer bu alanlar arası bir VPN ise buraya uzak LAN'ı giriniz. Eğer "
+"alanlar arası VPN istemiyorsanız burayı boş bırakabilirsiniz"
+
+#: usr/local/www/vpn_openvpn_client.php:931
+#: usr/local/www/vpn_openvpn_csc.php:450
+#: usr/local/www/vpn_openvpn_server.php:1327
+msgid "IPv6 Remote Network/s"
+msgstr "Uzaktaki IPv6 Ağ(lar)ı"
+
+#: usr/local/www/vpn_openvpn_client.php:935
+msgid ""
+"These are the IPv6 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more IP/PREFIX. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank to only communicate with other clients"
+msgstr ""
+"Yönlendirme tablolarında elle değişiklik yapmadan alanlar arası sanal özel "
+"IPv6 ağı (site-to-site VPN) kurulabilmesi için Tünel içinden yönlendirilecek "
+"bir ağdır. IP/PREFIX virgülle ayrılmış bir yada daha fazla liste olarak "
+"girilir. Eğer bu alanlar arası bir VPN ise buraya uzak LAN'ı giriniz. Eğer "
+"alanlar arası VPN istemiyorsanız burayı boş bırakabilirsiniz"
+
+#: usr/local/www/vpn_openvpn_client.php:945
+msgid "Limit outgoing bandwidth"
+msgstr "Giden bant genişliğini sınırla"
+
+#: usr/local/www/vpn_openvpn_client.php:949
+msgid ""
+"Maximum outgoing bandwidth for this tunnel. Leave empty for no limit. The "
+"input value has to be something between 100 bytes/sec and 100 Mbytes/sec "
+"(entered as bytes per second)"
+msgstr ""
+"Bu tünel için maksimum giden bant genişliği. Sınır koymamak için boş "
+"bırakın. Girdi değeri 100 bayt/sn ile 100 Mbayt/sn arasında olmalıdır (bayt/"
+"sn cinsinden girilir)"
+
+#: usr/local/www/vpn_openvpn_client.php:969
+msgid ""
+"Compress tunnel packets using the LZO algorithm. Adaptive compression will "
+"dynamically disable compression for a period of time if OpenVPN detects that "
+"the data in the packets is not being compressed efficiently."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:973
+#: usr/local/www/vpn_openvpn_server.php:1366
+msgid "Type-of-Service"
+msgstr "Servis Türü"
+
+#: usr/local/www/vpn_openvpn_client.php:983
+#: usr/local/www/vpn_openvpn_server.php:1376
+msgid ""
+"Set the TOS IP header value of tunnel packets to match the encapsulated "
+"packet value"
+msgstr ""
+"Tünel paketlerinin TOS IP başlık değerini satmalanmış paket değeriyle "
+"eşlenecek şekilde ayarla"
+
+#: usr/local/www/vpn_openvpn_client.php:992
+#: usr/local/www/vpn_openvpn_server.php:1421
+msgid "Disable IPv6"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1002
+#: usr/local/www/vpn_openvpn_server.php:1431
+msgid "Don't forward IPv6 traffic"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1011
+msgid "Don't pull routes"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1021
+msgid "Don't add or remove routes automatically. Instead pass routes to "
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1021
+msgid "script using environmental variables"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1030
+msgid "Don't add/remove routes"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1040
+msgid ""
+"This option effectively bars the server from adding routes to the client's "
+"routing table, however note that this option still allows the server to set "
+"the TCP/IP properties of the client's TUN/TAP interface"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1054
+#: usr/local/www/vpn_openvpn_server.php:1770
+msgid "Advanced configuration"
+msgstr "Gelişmiş yapılandırma"
+
+#: usr/local/www/vpn_openvpn_client.php:1063
+msgid ""
+"Enter any additional options you would like to add to the OpenVPN client "
+"configuration here, separated by a semicolon"
+msgstr ""
+"OpenVPN istemci yapılandırmasına eklemek istediğiniz ek seçenekleri "
+"aralarına noktalı virgül koyarak girin"
+
+#: usr/local/www/vpn_openvpn_client.php:1064
+msgid "EXAMPLE:"
+msgstr "ÖRNEK:"
+
+#: usr/local/www/vpn_openvpn_client.php:1072
+#: usr/local/www/vpn_openvpn_server.php:1788
+msgid "Verbosity level"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1085
+#: usr/local/www/vpn_openvpn_server.php:1801
+msgid ""
+"Each level shows all info from the previous levels. Level 3 is recommended "
+"if you want a good summary of what's happening without being swamped by "
+"output"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1086
+#: usr/local/www/vpn_openvpn_server.php:1802
+msgid "No output except fatal errors"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1087
+#: usr/local/www/vpn_openvpn_server.php:1803
+msgid "Normal usage range"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1088
+#: usr/local/www/vpn_openvpn_server.php:1804
+msgid ""
+"Output R and W characters to the console for each packet read and write, "
+"uppercase is used for TCP/UDP packets and lowercase is used for TUN/TAP "
+"packets"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1089
+#: usr/local/www/vpn_openvpn_server.php:1805
+msgid "Debug info range"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_client.php:1126
+msgid "add client"
+msgstr "istemci ekle"
+
+#: usr/local/www/vpn_openvpn_client.php:1133
+msgid "Additional OpenVPN clients can be added here."
+msgstr "Ek OpenVPN istemcilerini burada ekleyebilirsiniz."
+
+#: usr/local/www/vpn_openvpn_client.php:1162
+msgid "edit client"
+msgstr "istemci düzenle"
+
+#: usr/local/www/vpn_openvpn_client.php:1166
+msgid "delete client"
+msgstr "istemci sil"
+
+#: usr/local/www/vpn_openvpn_csc.php:41
+msgid "Client Specific Override"
+msgstr "İstemciye Özel Ayarlar"
+
+#: usr/local/www/vpn_openvpn_csc.php:68
+msgid "Client Specific Override successfully deleted"
+msgstr "İstemciye Özel Ayarlar başarıyla silindi"
+
+#: usr/local/www/vpn_openvpn_csc.php:148
+#: usr/local/www/vpn_openvpn_server.php:290
+msgid "The field 'DNS Server #1' must contain a valid IP address"
+msgstr "DNS Sunucu #1 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:150
+#: usr/local/www/vpn_openvpn_server.php:292
+msgid "The field 'DNS Server #2' must contain a valid IP address"
+msgstr "DNS Sunucu #2 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:152
+#: usr/local/www/vpn_openvpn_server.php:294
+msgid "The field 'DNS Server #3' must contain a valid IP address"
+msgstr "DNS Sunucu #3 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:154
+#: usr/local/www/vpn_openvpn_server.php:296
+msgid "The field 'DNS Server #4' must contain a valid IP address"
+msgstr "DNS Sunucu #4 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:159
+#: usr/local/www/vpn_openvpn_server.php:301
+msgid "The field 'NTP Server #1' must contain a valid IP address"
+msgstr "NTP Sunucu #1 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:161
+#: usr/local/www/vpn_openvpn_server.php:303
+msgid "The field 'NTP Server #2' must contain a valid IP address"
+msgstr "NTP Sunucu #2 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:163
+#: usr/local/www/vpn_openvpn_server.php:305
+msgid "The field 'NTP Server #3' must contain a valid IP address"
+msgstr "NTP Sunucu #3 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:165
+#: usr/local/www/vpn_openvpn_server.php:307
+msgid "The field 'NTP Server #4' must contain a valid IP address"
+msgstr "NTP Sunucu #4 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:171
+#: usr/local/www/vpn_openvpn_server.php:313
+msgid "The field 'WINS Server #1' must contain a valid IP address"
+msgstr "WINS Sunucu #1 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:173
+#: usr/local/www/vpn_openvpn_server.php:315
+msgid "The field 'WINS Server #2' must contain a valid IP address"
+msgstr "WINS Sunucu #2 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:177
+#: usr/local/www/vpn_openvpn_server.php:319
+msgid ""
+"The field 'NetBIOS Data Distribution Server #1' must contain a valid IP "
+"address"
+msgstr ""
+"NetBIOS Veri Dağıtım Sunucusu #1 alanı geçerli bir IP adresi içermelidir"
+
+#: usr/local/www/vpn_openvpn_csc.php:347
+msgid "Disable this override"
+msgstr "Üzerine yazmayı kapat"
+
+#: usr/local/www/vpn_openvpn_csc.php:352
+msgid ""
+"Set this option to disable this client-specific override without removing it "
+"from the list"
+msgstr ""
+"Bu ayar seçeneği ile istemciye-özgü yeniden yazmayı listeden silmeden "
+"kapatabilirsiniz"
+
+#: usr/local/www/vpn_openvpn_csc.php:356
+msgid "Common name"
+msgstr "Genel ad"
+
+#: usr/local/www/vpn_openvpn_csc.php:360
+msgid "Enter the client's X.509 common name here"
+msgstr "İstemcinin X.509 genel adını buraya girin"
+
+#: usr/local/www/vpn_openvpn_csc.php:372
+msgid "Connection blocking"
+msgstr "Bağlantı engelleme"
+
+#: usr/local/www/vpn_openvpn_csc.php:382
+msgid "Block this client connection based on its common name"
+msgstr "Genel adına göre bu istemci bağlantısını engelle"
+
+#: usr/local/www/vpn_openvpn_csc.php:387
+msgid ""
+"Don't use this option to permanently disable a client due to a compromised "
+"key or password. Use a CRL (certificate revocation list) instead"
+msgstr ""
+"Bu seçeneği kullanarak bir anahtar ya da parola nedeniyle istemciyi "
+"tamamiyle kapatmak için kullanmayın. Bunun yerine CRL (sertifika silme "
+"listesi) kullanın"
+
+#: usr/local/www/vpn_openvpn_csc.php:399
+#: usr/local/www/vpn_openvpn_server.php:1833
+msgid "Tunnel Network"
+msgstr "Tünel Ağ"
+
+#: usr/local/www/vpn_openvpn_csc.php:413
+#: usr/local/www/vpn_openvpn_server.php:1287
+msgid "IPv4 Local Network/s"
+msgstr "IPv4 Yerel Ağ(ları)"
+
+#: usr/local/www/vpn_openvpn_csc.php:417
+msgid ""
+"These are the IPv4 networks that will be accessible from this particular "
+"client. Expressed as a comma-separated list of one or more CIDR ranges."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:419 usr/local/www/vpn_openvpn_csc.php:430
+msgid ""
+"NOTE: You do not need to specify networks here if they have already been "
+"defined on the main server configuration."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:424
+#: usr/local/www/vpn_openvpn_server.php:1300
+msgid "IPv6 Local Network/s"
+msgstr "IPv6 Yerel Ağ(ları)"
+
+#: usr/local/www/vpn_openvpn_csc.php:428
+msgid ""
+"These are the IPv6 networks that will be accessible from this particular "
+"client. Expressed as a comma-separated list of one or more IP/PREFIX "
+"networks."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:439
+msgid ""
+"These are the IPv4 networks that will be routed to this client specifically "
+"using iroute, so that a site-to-site VPN can be established. Expressed as a "
+"comma-separated list of one or more CIDR ranges. You may leave this blank if "
+"there are no client-side networks to be routed"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:445
+msgid ""
+"NOTE: Remember to add these subnets to the IPv4 Remote Networks list on the "
+"corresponding OpenVPN server settings."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:454
+msgid ""
+"These are the IPv6 networks that will be routed to this client specifically "
+"using iroute, so that a site-to-site VPN can be established. Expressed as a "
+"comma-separated list of one or more IP/PREFIX networks. You may leave this "
+"blank if there are no client-side networks to be routed"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:460
+msgid ""
+"NOTE: Remember to add these subnets to the IPv6 Remote Networks list on the "
+"corresponding OpenVPN server settings."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_csc.php:465
+#: usr/local/www/vpn_openvpn_server.php:1269
+msgid "Redirect Gateway"
+msgstr "Ağ Geçidini Yönlendir"
+
+#: usr/local/www/vpn_openvpn_csc.php:475
+#: usr/local/www/vpn_openvpn_server.php:1279
+msgid "Force all client generated traffic through the tunnel"
+msgstr "İstemci tarafından oluşturulan tüm trafiği tünelden geçir"
+
+#: usr/local/www/vpn_openvpn_csc.php:486
+#: usr/local/www/vpn_openvpn_server.php:1446
+msgid "Client Settings"
+msgstr "İstemci Ayarları"
+
+#: usr/local/www/vpn_openvpn_csc.php:489
+msgid "Server Definitions"
+msgstr "Sunucu Tanımlamaları"
+
+#: usr/local/www/vpn_openvpn_csc.php:499
+msgid "Prevent this client from receiving any server-defined client settings"
+msgstr ""
+"Bu istemcinin sunucu tarafından tanımlanmış istemci ayarlarını almasını "
+"engelle"
+
+#: usr/local/www/vpn_openvpn_csc.php:584
+#: usr/local/www/vpn_openvpn_server.php:1607
+msgid "NTP Servers"
+msgstr "NTP Sunucular"
+
+#: usr/local/www/vpn_openvpn_csc.php:594
+#: usr/local/www/vpn_openvpn_server.php:1617
+msgid "Provide a NTP server list to clients"
+msgstr "İstemcilere bir NTP sunucu listesi sağla"
+
+#: usr/local/www/vpn_openvpn_csc.php:620
+#: usr/local/www/vpn_openvpn_server.php:1643
+msgid "NetBIOS Options"
+msgstr "NETBIOS Seçenekleri"
+
+#: usr/local/www/vpn_openvpn_csc.php:630
+#: usr/local/www/vpn_openvpn_server.php:1653
+msgid "Enable NetBIOS over TCP/IP"
+msgstr "TCP/IP üzerinden NetBIOS'u etkinleştir"
+
+#: usr/local/www/vpn_openvpn_csc.php:635
+#: usr/local/www/vpn_openvpn_server.php:1658
+msgid ""
+"If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) "
+"will be disabled"
+msgstr ""
+"Bu seçenek seçilmediğinde TCP/IP üzerinde NetBIOS (WINS dahil ) devre dışı "
+"kalacaktır"
+
+#: usr/local/www/vpn_openvpn_csc.php:642
+#: usr/local/www/vpn_openvpn_server.php:1665
+msgid "Node Type"
+msgstr "Uç Türü"
+
+#: usr/local/www/vpn_openvpn_csc.php:655
+#: usr/local/www/vpn_openvpn_server.php:1678
+msgid ""
+"Possible options: b-node (broadcasts), p-node (point-to-point name queries "
+"to a WINS server), m-node (broadcast then query name server), and h-node "
+"(query name server, then broadcast)"
+msgstr ""
+"Mümkün seçenekler: b-node (yayınlamak), p-node (WINS sunucu noktadan noktaya "
+"isim sorguları), m-node (yayınladıktan sonra isim sunucusunu sorgulamak), ve "
+"h-node (isim sunucusunu sorguladıktan sonra yayınlamak)"
+
+#: usr/local/www/vpn_openvpn_csc.php:669
+#: usr/local/www/vpn_openvpn_server.php:1692
+msgid ""
+"A NetBIOS Scope\tID provides an extended naming service for\tNetBIOS over "
+"TCP/IP. The NetBIOS scope ID isolates NetBIOS traffic on a single network to "
+"only those nodes with the same NetBIOS scope ID"
+msgstr ""
+"NetBIOS Scope ID TCP/IP üzerinden NetBIOS için genişletilmiş isimlendirme "
+"servisi sağlar. NetBIOS scope ID tek ağ üzerindeki NetBIOS trafiğini sadece "
+"aynı NetBIOS scope ID'sini taşıyanlarla sınırlar"
+
+#: usr/local/www/vpn_openvpn_csc.php:722
+msgid ""
+"Enter any additional options you would like to add for this client specific "
+"override, separated by a semicolon"
+msgstr ""
+"Bu istemciye özel olarak eklemek istediğiniz seçenekleri aralarına noktalı "
+"virgül koyarak girin"
+
+#: usr/local/www/vpn_openvpn_csc.php:723
+#: usr/local/www/vpn_openvpn_server.php:1780
+msgid "EXAMPLE: push \"route 10.0.0.0 255.255.255.0\""
+msgstr "ÖRNEK: push \"route 10.0.0.0 255.255.255.0\""
+
+#: usr/local/www/vpn_openvpn_csc.php:770
+msgid "edit csc"
+msgstr "csc düzenle"
+
+#: usr/local/www/vpn_openvpn_csc.php:773
+msgid "Do you really want to delete this csc?"
+msgstr "Bu csc'yi silmek istediğinize emin misiniz?"
+
+#: usr/local/www/vpn_openvpn_csc.php:774
+msgid "delete csc"
+msgstr "csc sil"
+
+#: usr/local/www/vpn_openvpn_csc.php:785
+msgid "add csc"
+msgstr "csc ekle"
+
+#: usr/local/www/vpn_openvpn_csc.php:792
+msgid "Additional OpenVPN client specific overrides can be added here."
+msgstr "Ek OpenVPN istemciye özel ayarlar buradan girilebilir."
+
+#: usr/local/www/vpn_openvpn_server.php:89
+msgid "Server successfully deleted"
+msgstr "Sunucu başarıyla silindi"
+
+#: usr/local/www/vpn_openvpn_server.php:247
+msgid ""
+"You must select a Backend for Authentication if the server mode requires "
+"User Auth."
+msgstr ""
+"Sunucu kipi Kullanıcı Kimlik Doğrulama gerektiriyorsa kullanılacak kimlik "
+"doğrulama arkaucunu seçin."
+
+#: usr/local/www/vpn_openvpn_server.php:328
+msgid "The field 'Concurrent connections' must be numeric."
+msgstr "Eş zamanlı bağlantılar alanı sayı olmalıdır."
+
+#: usr/local/www/vpn_openvpn_server.php:342
+msgid "Tunnel network"
+msgstr "Tünel ağ"
+
+#: usr/local/www/vpn_openvpn_server.php:345
+msgid ""
+"Using a tunnel network and server bridge settings together is not allowed."
+msgstr "Tünel ağ ve sunucu köprüsü ayarlarını beraber kullanıma izin verilmez."
+
+#: usr/local/www/vpn_openvpn_server.php:348
+msgid "Server Bridge DHCP Start and End must both be empty, or defined."
+msgstr "Sunucu Köprüsü DHCP Başlangıç ve Bitişi boş yada tanımlı olmalıdır."
+
+#: usr/local/www/vpn_openvpn_server.php:350
+msgid "Server Bridge DHCP Start must be an IPv4 address."
+msgstr "Sunucu Köprüsü DHCP Başlangıcı IPv4 adresi olmalıdır."
+
+#: usr/local/www/vpn_openvpn_server.php:352
+msgid "Server Bridge DHCP End must be an IPv4 address."
+msgstr "Sunucu Köprüsü DHCP Bitişi IPv4 adresi olmalıdır."
+
+#: usr/local/www/vpn_openvpn_server.php:354
+msgid "The Server Bridge DHCP range is invalid (start higher than end)."
+msgstr ""
+"Sunucu Köprüsü DHCP aralığı geçersiz (Başlangıcı bitişinden daha yüksek)."
+
+#: usr/local/www/vpn_openvpn_server.php:774
+msgid "Disable this server"
+msgstr "Sunucuyu devre dışı bırak"
+
+#: usr/local/www/vpn_openvpn_server.php:779
+msgid ""
+"Set this option to disable this server without removing it from the list"
+msgstr ""
+"Bu seçeneği etkinleştirerek silmeden sunucunun devre dışı kalmasını "
+"sağlayabilirsiniz"
+
+#: usr/local/www/vpn_openvpn_server.php:798
+msgid "Backend for authentication"
+msgstr "Kimlik doğrulama arkaucu"
+
+#: usr/local/www/vpn_openvpn_server.php:830
+msgid "Device Mode"
+msgstr "Aygıt Kipi"
+
+#: usr/local/www/vpn_openvpn_server.php:967
+msgid "Peer Certificate Revocation List"
+msgstr "Eş Sertifika Silme Listesi"
+
+#: usr/local/www/vpn_openvpn_server.php:992
+msgid "Server Certificate"
+msgstr "Sunucu Sertifikası"
+
+#: usr/local/www/vpn_openvpn_server.php:1021
+msgid "DH Parameters Length"
+msgstr "DH Paremetre Uzunluğu"
+
+#: usr/local/www/vpn_openvpn_server.php:1101
+msgid ""
+"NOTE: Leave this set to SHA1 unless all clients are set to match. SHA1 is "
+"the default for OpenVPN."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1123
+msgid "Certificate Depth"
+msgstr "Sertifika Derinliği"
+
+#: usr/local/www/vpn_openvpn_server.php:1141
+msgid ""
+"When a certificate-based client logs in, do not accept certificates below "
+"this depth. Useful for denying certificates made with intermediate CAs "
+"generated from the same CA as the server."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1148
+msgid "Strict User/CN Matching"
+msgstr "Sıkı Kullanıcı/CN Eşleme"
+
+#: usr/local/www/vpn_openvpn_server.php:1158
+msgid ""
+"When authenticating users, enforce a match between the common name of the "
+"client certificate and the username given at login."
+msgstr ""
+"Kullanıcı kimlikleri doğrulanırken istemci sertifikasının genel adı ile "
+"oturum açılırken verilen kullanıcı adının aynı olmasını zorunlu kılar."
+
+#: usr/local/www/vpn_openvpn_server.php:1176
+msgid ""
+"This is the IPv4 virtual network used for private communications between "
+"this server and client hosts expressed using CIDR (eg. 10.0.8.0/24). The "
+"first network address will be assigned to the\tserver virtual interface. The "
+"remaining network addresses can optionally be assigned to connecting "
+"clients. (see Address Pool)"
+msgstr ""
+"Bu IPv4 sunucu ile CIDR yoluyla belirtilen istemciler (örn. 10.0.8.0/24) "
+"arasında özel iletişim için kullanılacak sanal ağdır. İlk ağ adresi sunucu"
+"\tsanal arabirimine atanır. Diğer ağ adresleri bağlanan istemcilere isteğe "
+"göre atanabilir (bkz Adres Havuzu)"
+
+#: usr/local/www/vpn_openvpn_server.php:1190
+msgid ""
+"This is the IPv6 virtual network used for private communications between "
+"this server and client hosts expressed using CIDR (eg. fe80::/64). The first "
+"network address will be assigned to the server virtual interface. The "
+"remaining network addresses can optionally be assigned to connecting "
+"clients. (see Address Pool)"
+msgstr ""
+"Bu IPv6 sunucu ile CIDR yoluyla belirtilen istemciler (örn. fe80::/64) "
+"arasında özel iletişim için kullanılacak sanal ağdır. İlk ağ adresi sunucu "
+"sanal arabirimine atanır. Diğer ağ adresleri bağlanan istemcilere isteğe "
+"göre atanabilir (bkz Adres Havuzu)"
+
+#: usr/local/www/vpn_openvpn_server.php:1200
+msgid "Bridge DHCP"
+msgstr "Köprü DHCP"
+
+#: usr/local/www/vpn_openvpn_server.php:1210
+msgid "Allow clients on the bridge to obtain DHCP."
+msgstr "Köprüdeki istemcilerin DHCP den yararlanmasına izin ver."
+
+#: usr/local/www/vpn_openvpn_server.php:1218
+msgid "Bridge Interface"
+msgstr "Köprü Arabirim"
+
+#: usr/local/www/vpn_openvpn_server.php:1240
+msgid ""
+"The interface to which this tap instance will be bridged. This is not done "
+"automatically. You must assign this interface and create the bridge "
+"separately. This setting controls which existing IP address and subnet mask "
+"are used by OpenVPN for the bridge. Setting this to 'none' will cause the "
+"Server Bridge DHCP settings below to be ignored."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1249
+msgid "Server Bridge DHCP Start"
+msgstr "Sunucu Köprüsü DHCP Başlangıcı"
+
+#: usr/local/www/vpn_openvpn_server.php:1253
+msgid ""
+"When using tap mode as a multi-point server, you may optionally supply a "
+"DHCP range to use on the interface to which this tap instance is bridged. If "
+"these settings are left blank, DHCP will be passed through to the LAN, and "
+"the interface setting above will be ignored."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1262
+msgid "Server Bridge DHCP End"
+msgstr "Sunucu Köprüsü DHCP Bitişi"
+
+#: usr/local/www/vpn_openvpn_server.php:1291
+msgid ""
+"These are the IPv4 networks that will be accessible from the remote "
+"endpoint. Expressed as a comma-separated list of one or more CIDR ranges. "
+"You may leave this blank if you don't want to add a route to the local "
+"network through this tunnel on the remote machine. This is generally set to "
+"your LAN network"
+msgstr ""
+"Uzak uçtan erişilebilir olacak IPv4 ağı. CIDR aralığı virgülle ayrılmış bir "
+"yada daha fazla liste olarak belirtilir. Eğer uzak makinada bu tünel içinden "
+"yerel ağa bir yönlendirme eklemek istemiyorsanız burayı boş "
+"bırakabilirsiniz. Genel LAN ağınız olarak ayarlıdır"
+
+#: usr/local/www/vpn_openvpn_server.php:1304
+msgid ""
+"These are the IPv6 networks that will be accessible from the remote "
+"endpoint. Expressed as a comma-separated list of one or more IP/PREFIX. You "
+"may leave this blank if you don't want to add a route to the local network "
+"through this tunnel on the remote machine. This is generally set to your LAN "
+"network"
+msgstr ""
+"Uzak uçtan erişilebilir olacak IPv6 ağı. IP/PREFIX virgülle ayrılmış bir "
+"yada daha fazla liste olarak belirtilir. Eğer uzak makinada bu tünel içinden "
+"yerel ağa bir yönlendirme eklemek istemiyorsanız burayı boş "
+"bırakabilirsiniz. Genel LAN ağınız olarak ayarlıdır"
+
+#: usr/local/www/vpn_openvpn_server.php:1317
+msgid ""
+"These are the IPv4 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more CIDR ranges. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank if you don't want a site-to-site VPN"
+msgstr ""
+"Yönlendirme tablolarında elle değişiklik yapmadan alanlar arası sanal özel "
+"IPv4 ağı (site-to-site VPN) kurulabilmesi için Tünel içinden yönlendirilecek "
+"bir ağdır. CIDR aralığı virgülle ayrılmış bir yada daha fazla liste olarak "
+"girilir. Eğer bu alanlar arası bir VPN ise buraya uzak LAN'ı giriniz. Eğer "
+"alanlar arası VPN istemiyorsanız burayı boş bırakabilirsiniz"
+
+#: usr/local/www/vpn_openvpn_server.php:1331
+msgid ""
+"These are the IPv6 networks that will be routed through the tunnel, so that "
+"a site-to-site VPN can be established without manually changing the routing "
+"tables. Expressed as a comma-separated list of one or more IP/PREFIX. If "
+"this is a site-to-site VPN, enter the remote LAN/s here. You may leave this "
+"blank if you don't want a site-to-site VPN"
+msgstr ""
+"Yönlendirme tablolarında elle değişiklik yapmadan alanlar arası sanal özel "
+"IPv6 ağı (site-to-site VPN) kurulabilmesi için Tünel içinden yönlendirilecek "
+"bir ağdır. IP/PREFIX virgülle ayrılmış bir yada daha fazla liste olarak "
+"girilir. Eğer bu alanlar arası bir VPN ise buraya uzak LAN'ı giriniz. Eğer "
+"alanlar arası VPN istemiyorsanız burayı boş bırakabilirsiniz"
+
+#: usr/local/www/vpn_openvpn_server.php:1341
+msgid "Concurrent connections"
+msgstr "Eş zamanlı bağlantılar"
+
+#: usr/local/www/vpn_openvpn_server.php:1345
+msgid ""
+"Specify the maximum number of clients allowed to concurrently connect to "
+"this server"
+msgstr ""
+"Bu sunucuya eş zamanlı bağlanmasına izin verilen istemci sayısını belirtiniz"
+
+#: usr/local/www/vpn_openvpn_server.php:1362
+msgid ""
+"Compress tunnel packets using the LZO algorithm. Adaptive compression will "
+"dynamically disable compression for a period of time if OpenVPN detects that "
+"the data in the packets is not being compressed efficiently"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1384
+msgid "Inter-client communication"
+msgstr "İstemciler arası iletişim"
+
+#: usr/local/www/vpn_openvpn_server.php:1394
+msgid "Allow communication between clients connected to this server"
+msgstr ""
+"Bu sunucuya bağlanan istemcilerinin kendi aralarındaki trafiklerine izin ver"
+
+#: usr/local/www/vpn_openvpn_server.php:1402
+msgid "Duplicate Connections"
+msgstr "Çift Bağlantı"
+
+#: usr/local/www/vpn_openvpn_server.php:1412
+msgid ""
+"Allow multiple concurrent connections from clients using the same Common "
+"Name.<br />NOTE: This is not generally recommended, but may be needed for "
+"some scenarios."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1449
+msgid "Dynamic IP"
+msgstr "Dinamik IP"
+
+#: usr/local/www/vpn_openvpn_server.php:1459
+msgid ""
+"Allow connected clients to retain their connections if their IP address "
+"changes"
+msgstr ""
+"Bağlanan istemcilerin IP adresleri değişse bile bağlantılarını korumalarına "
+"izin ver"
+
+#: usr/local/www/vpn_openvpn_server.php:1467
+msgid "Address Pool"
+msgstr "Adres Havuzu"
+
+#: usr/local/www/vpn_openvpn_server.php:1477
+msgid "Provide a virtual adapter IP address to clients (see Tunnel Network)"
+msgstr "İstemcilere sanal IP adresi sağla (bkz Tünel Ağ)"
+
+#: usr/local/www/vpn_openvpn_server.php:1485
+msgid "Topology"
+msgstr "Topoloji"
+
+#: usr/local/www/vpn_openvpn_server.php:1495
+msgid ""
+"Allocate only one IP per client (topology subnet), rather than an isolated "
+"subnet per client (topology net30)."
+msgstr ""
+"İstemci başına IP yi paylaştır (altağ tapoloji), yerine ise istemci başına "
+"izole edilmiş altağ koy (tapoloji net30)."
+
+#: usr/local/www/vpn_openvpn_server.php:1502
+msgid ""
+"Relevant when supplying a virtual adapter IP address to clients when using "
+"tun mode on IPv4."
+msgstr ""
+"IPv4 tünel kipinde istemciler için uygun sanal bağdaştırıcı IP adresi sağlar."
+
+#: usr/local/www/vpn_openvpn_server.php:1503
+msgid ""
+"Some clients may require this even for IPv6, such as OpenVPN Connect (iOS/"
+"Android). Others may break if it is present, such as older versions of "
+"OpenVPN or clients such as Yealink phones."
+msgstr ""
+"Bağzı istemciler IPv6 ihtiyacı duyabilir, OpenVPN bağlantısı (iOS/Android) "
+"gibi. Diğer eski versiyonlar mevcutsa (OpenVPN istemcileri yada Yealink "
+"telefonlar gibi) bu durumu bozabilir."
+
+#: usr/local/www/vpn_openvpn_server.php:1588
+msgid "Force DNS cache update"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1598
+msgid ""
+"Run ''net stop dnscache'', ''net start dnscache'', ''ipconfig /flushdns'' "
+"and ''ipconfig /registerdns'' on connection initiation. This is known to "
+"kick Windows into recognizing pushed DNS servers."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1688
+msgid "Scope ID"
+msgstr "Scope ID"
+
+#: usr/local/www/vpn_openvpn_server.php:1739
+msgid "Client Management Port"
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1749
+msgid ""
+"Use a different management port on clients. The default port is 166. Specify "
+"a different port if the client machines need to select from multiple OpenVPN "
+"links."
+msgstr ""
+
+#: usr/local/www/vpn_openvpn_server.php:1779
+msgid ""
+"Enter any additional options you would like to add to the OpenVPN server "
+"configuration here, separated by a semicolon"
+msgstr ""
+"OpenVPN sunucu yapılandırmasına eklemek istediğiniz diğer seçenekleri "
+"aralarına noktalı virgül koyarak girebilirsiniz"
+
+#: usr/local/www/vpn_openvpn_server.php:1832
+msgid "Protocol / Port"
+msgstr "Potokol / Port"
+
+#: usr/local/www/vpn_openvpn_server.php:1874
+msgid "Do you really want to delete this server?"
+msgstr "Bu sunucuyu silmek istediğinizden emin misiniz?"
+
+#: usr/local/www/vpn_openvpn_server.php:1887
+msgid "Additional OpenVPN servers can be added here."
+msgstr "Ek OpenVPN sunucular bu alandan eklenebilir."
+
+#: usr/local/www/vpn_pppoe.php:99
+msgid "The PPPoE entry list has been changed"
+msgstr "PPPoE girdi listesi değiştirildi"
+
+#: usr/local/www/vpn_pppoe.php:112 usr/local/www/vpn_pppoe.php:147
+msgid "add a new pppoe instance"
+msgstr "yeni PPPoE ekle"
+
+#: usr/local/www/vpn_pppoe.php:134
+msgid "edit PPPoE instance"
+msgstr ""
+
+#: usr/local/www/vpn_pppoe.php:135
+msgid ""
+"Do you really want to delete this entry? All elements that still use it will "
+"become invalid (e.g. filter rules)!"
+msgstr ""
+"Bu girdiyi silmek istediğinize emin misiniz? Bunu kullanan öğeler (örn. "
+"filtre kuralları) geçersiz hale gelecektir!"
+
+#: usr/local/www/vpn_pppoe.php:135
+msgid "delete pppoe instance"
+msgstr "PPPoE sil"
+
+#: usr/local/www/vpn_pppoe_edit.php:138
+msgid "The specified server address is equal to an interface ip address."
+msgstr "Belirtilen sunucu adresi bir arabirim IP adresine eş."
+
+#: usr/local/www/vpn_pppoe_edit.php:143
+#, php-format
+msgid "No password specified for username %s"
+msgstr "%s kullanıcısının parolası tanımlanmamış"
+
+#: usr/local/www/vpn_pppoe_edit.php:145
+#, php-format
+msgid "Incorrect ip address specified for username %s"
+msgstr "%s kullanıcısı IP adresi yanlış girilmiş"
+
+#: usr/local/www/vpn_pppoe_edit.php:151
+msgid "Wrong data submitted"
+msgstr "Yanlış veri gönderildi"
+
+#: usr/local/www/vpn_pppoe_edit.php:366
+msgid "PPPoE server configuration"
+msgstr "PPPoE sunucu yapılandırması"
+
+#: usr/local/www/vpn_pppoe_edit.php:379
+msgid "Enable PPPoE server"
+msgstr "PPPoE sunucuyu etkinleştir"
+
+#: usr/local/www/vpn_pppoe_edit.php:402
+msgid "Subnet netmask"
+msgstr "Altağ maskesi"
+
+#: usr/local/www/vpn_pppoe_edit.php:415
+msgid "Hint"
+msgstr "İpucu"
+
+#: usr/local/www/vpn_pppoe_edit.php:419
+msgid "No. PPPoE users"
+msgstr "PPPoE kullanıcı sayısı"
+
+#: usr/local/www/vpn_pppoe_edit.php:432
+msgid "Hint: 10 is ten PPPoE clients"
+msgstr "İpucu: 10 on adet PPPoE istemcisi demektir"
+
+#: usr/local/www/vpn_pppoe_edit.php:440
+msgid ""
+"Enter the IP address the PPPoE server should give to clients for use as "
+"their \"gateway\""
+msgstr ""
+"PPPoE sunucunun istemcilere \"ağ geçidi\" olarak vereceği IP adresini girin"
+
+#: usr/local/www/vpn_pppoe_edit.php:448 usr/local/www/vpn_pptp.php:374
+msgid "Remote address range"
+msgstr "Uzak adres aralığı"
+
+#: usr/local/www/vpn_pppoe_edit.php:452
+msgid "Specify the starting address for the client IP address subnet"
+msgstr "İstemci IP adres altağı başlangıç adresi belirle"
+
+#: usr/local/www/vpn_pppoe_edit.php:469
+msgid ""
+"If entered they will be given to all PPPoE clients, else LAN DNS and one WAN "
+"DNS will go to all clients"
+msgstr ""
+"Boş bırakırsanız LAN DNS ve bir WAN DNS tüm istemcilere gider, aksi taktirde "
+"tüm PPPoE istemcilere bu değer gönderilir"
+
+#: usr/local/www/vpn_pppoe_edit.php:477 usr/local/www/vpn_pptp.php:403
+msgid ""
+"When set, all users will be authenticated using the RADIUS server specified "
+"below. The local user database will not be used"
+msgstr ""
+"İşaretlendiğinde, tüm kullanıcılar aşağıda belirtilen RADIUS sunucu "
+"kullanılarak kimlik doğrulamaya tabi tutulur. Yerel kullanıcı veritabanı "
+"kullanılmaz"
+
+#: usr/local/www/vpn_pppoe_edit.php:484 usr/local/www/vpn_pptp.php:409
+msgid "Sends accounting packets to the RADIUS server"
+msgstr "Hesaplandırma paketlerini RADIUS sunucuya gönderir"
+
+#: usr/local/www/vpn_pppoe_edit.php:486
+msgid "Use Backup RADIUS Server"
+msgstr "Yedek RADIUS Sunucusu Kullan"
+
+#: usr/local/www/vpn_pppoe_edit.php:487
+msgid ""
+"When set, if primary server fails all requests will be sent via backup server"
+msgstr ""
+"Eğer ana sunucu isteklere cevap veremezse tüm istekler yedek sunucu "
+"üzerinden gönderilir"
+
+#: usr/local/www/vpn_pppoe_edit.php:490
+msgid "NAS IP Address"
+msgstr "NAS IP Adresi"
+
+#: usr/local/www/vpn_pppoe_edit.php:493
+msgid "RADIUS server NAS IP Address"
+msgstr "RADIUS sunucu NAS IP adresi"
+
+#: usr/local/www/vpn_pppoe_edit.php:497 usr/local/www/vpn_pptp.php:427
+msgid "RADIUS Accounting Update"
+msgstr "RADIUS Hesaplandırma Güncelleme"
+
+#: usr/local/www/vpn_pppoe_edit.php:500
+msgid "RADIUS accounting update period in seconds"
+msgstr "RADIUS hesaplandırma güncelleme periyodu (sn)"
+
+#: usr/local/www/vpn_pppoe_edit.php:504 usr/local/www/vpn_pptp.php:416
+msgid "RADIUS issued IPs"
+msgstr "RADIUS tarafından atanan IP'ler"
+
+#: usr/local/www/vpn_pppoe_edit.php:507
+msgid "Issue IP Addresses via RADIUS server"
+msgstr "IP adreslerini RADIUS sunucudan ata"
+
+#: usr/local/www/vpn_pppoe_edit.php:510
+msgid "RADIUS server Primary"
+msgstr "Ana RADIUS sunucu"
+
+#: usr/local/www/vpn_pppoe_edit.php:515
+msgid ""
+"Enter the IP address, authentication port and accounting port (optional) of "
+"the RADIUS server."
+msgstr ""
+"Ana RADIUS sunucunun IP adresini, kimlik doğrulama portunu, hesaplandırma "
+"portu (isteğe bağlı) belirtiniz."
+
+#: usr/local/www/vpn_pppoe_edit.php:516 usr/local/www/vpn_pppoe_edit.php:532
+msgid "standard port 1812 and 1813 accounting"
+msgstr "standart 1812 ve 1813 hesaplandırma portları"
+
+#: usr/local/www/vpn_pppoe_edit.php:519
+msgid "RADIUS primary shared secret"
+msgstr "RADIUS ana paylaşımlı anahtar"
+
+#: usr/local/www/vpn_pppoe_edit.php:522 usr/local/www/vpn_pppoe_edit.php:539
+#: usr/local/www/vpn_pptp.php:446
+msgid ""
+"Enter the shared secret that will be used to authenticate to the RADIUS "
+"server"
+msgstr ""
+"RADIUS sunucuya kimlik doğrularken kullanılacak paylaşımlı anahtarı "
+"belirtiniz"
+
+#: usr/local/www/vpn_pppoe_edit.php:526
+msgid "RADIUS server Secondary"
+msgstr "İkincil RADIUS sunucu"
+
+#: usr/local/www/vpn_pppoe_edit.php:531
+msgid ""
+"Enter the IP address, authentication port and accounting port (optional) of "
+"the backup RADIUS server."
+msgstr ""
+"Yedek RADIUS sunucunun IP adresini, kimlik doğrulama portunu, hesaplandırma "
+"portu (isteğe bağlı) belirtiniz."
+
+#: usr/local/www/vpn_pppoe_edit.php:535
+msgid "RADIUS secondary shared secret"
+msgstr "RADIUS ikincil paylaşımlı anahtar"
+
+#: usr/local/www/vpn_pppoe_edit.php:543
+msgid "User (s)"
+msgstr "Kullanıcı(lar)"
+
+#: usr/local/www/vpn_pppoe_edit.php:611
+msgid ""
+"don't forget to add a firewall rule to permit traffic from PPPoE clients"
+msgstr ""
+"PPPoE istemcilerden trafiğe izin verecek güvenlik duvarı izin kuralı "
+"eklemeyi unutmayın"
+
+#: usr/local/www/vpn_pptp.php:121
+msgid "PPTP redirection target address"
+msgstr "PPTP yönlendirme hedef adresi"
+
+#: usr/local/www/vpn_pptp.php:126
+msgid "A valid target address must be specified."
+msgstr "Geçerli bir hedef adres belirtilmelidir."
+
+#: usr/local/www/vpn_pptp.php:197 usr/local/www/vpn_pptp_users.php:72
+#: usr/local/www/vpn_pptp_users_edit.php:138
+msgid "VPN PPTP"
+msgstr "VPN PPTP"
+
+#: usr/local/www/vpn_pptp.php:301
+msgid ""
+"PPTP is no longer considered a secure VPN technology because it relies upon "
+"MS-CHAPv2 which has been compromised. If you continue to use PPTP be aware "
+"that intercepted traffic can be decrypted by a third party, so it should be "
+"considered unencrypted. We advise migrating to another VPN type such as "
+"OpenVPN or IPsec.<br /><br /><a href=\"https://isc.sans.edu/diary/End+of+Days"
+"+for+MS-CHAPv2/13807\">Read More</a>"
+msgstr ""
+
+#: usr/local/www/vpn_pptp.php:327
+msgid "Redirect incoming PPTP connections to"
+msgstr "Gelen PPTP bağlantılarını yönlendir"
+
+#: usr/local/www/vpn_pptp.php:330
+msgid "PPTP redirection"
+msgstr "PPTP yönlendirme"
+
+#: usr/local/www/vpn_pptp.php:334
+msgid ""
+"Enter the IP address of a host which will accept incoming PPTP connections"
+msgstr "Gelen PPTP bağlantılarını kabul edecek bir host IP adresi giriniz"
+
+#: usr/local/www/vpn_pptp.php:341
+msgid "Enable PPTP server"
+msgstr "PPTP sunucuyu etkinleştir"
+
+#: usr/local/www/vpn_pptp.php:344
+msgid "No. PPTP users"
+msgstr "PPTP kullanıcı sayısı"
+
+#: usr/local/www/vpn_pptp.php:358
+msgid "Hint: 10 is ten PPTP clients"
+msgstr "İpucu: 10, on adet PPTP istemcisi demektir"
+
+#: usr/local/www/vpn_pptp.php:366
+msgid ""
+"Enter the IP address the PPTP server should give to clients for use as their "
+"\"gateway\""
+msgstr ""
+"PPTP sunucunun istemcilere \"ağ geçidi\" olarak vereceği IP adresini giriniz"
+
+#: usr/local/www/vpn_pptp.php:379
+msgid "Specify the starting address for the client IP subnet"
+msgstr "İstemci IP altağı için başlangıç adresi belirtiniz"
+
+#: usr/local/www/vpn_pptp.php:383
+msgid "PPTP DNS Servers"
+msgstr "PPTP DNS Sunucuları"
+
+#: usr/local/www/vpn_pptp.php:389
+msgid "primary and secondary DNS servers assigned to PPTP clients"
+msgstr "PPTP istemcilere atanacak birincil ve ikincil DNS sunucu"
+
+#: usr/local/www/vpn_pptp.php:412
+msgid "Secondary RADIUS server for failover authentication"
+msgstr "Yük aktarma kimlik doğrulama için ikincil RADIUS sunucu"
+
+#: usr/local/www/vpn_pptp.php:413
+msgid ""
+"When set, all requests will go to the secondary server when primary fails"
+msgstr ""
+"Ayarlandığında, birincil sunucu yanıt veremediğinde tüm istekler ikincil "
+"sunucuya gidecektir"
+
+#: usr/local/www/vpn_pptp.php:417
+msgid "Issue IP addresses via RADIUS server"
+msgstr "IP adreslerini RADIUS sunucu üzerinden ata"
+
+#: usr/local/www/vpn_pptp.php:421
+msgid "RADIUS NAS IP"
+msgstr "RADIUS NAS IP"
+
+#: usr/local/www/vpn_pptp.php:439 usr/local/www/vpn_pptp.php:456
+msgid ""
+"Enter the IP address, RADIUS port, and RADIUS accounting port of the RADIUS "
+"server"
+msgstr ""
+"RADIUS sunucunun IP adresini, RADIUS portunu ve RADIUS hesaplandırma portu "
+"belirtiniz"
+
+#: usr/local/www/vpn_pptp.php:459
+msgid "Secondary RADIUS shared secret"
+msgstr "İkincil RADIUS paylaşımlı anahtar"
+
+#: usr/local/www/vpn_pptp.php:463
+msgid ""
+"Enter the shared secret that will be used to authenticate to the secondary "
+"RADIUS server"
+msgstr ""
+"İkincil RADIUS sunucuda kimlik doğrulama için kullanılacak paylaşımlı "
+"anahtarı giriniz"
+
+#: usr/local/www/vpn_pptp.php:473
+msgid "Require 128-bit encryption"
+msgstr "128 bit şifreleme gerektir"
+
+#: usr/local/www/vpn_pptp.php:474
+msgid ""
+"When set, only 128-bit encryption will be accepted. Otherwise 40-bit and 56-"
+"bit encryption will be accepted as well. Note that encryption will always be "
+"forced on PPTP connections (i.e. unencrypted connections will not be "
+"accepted)"
+msgstr ""
+"Bu seçenek açıldığında sadece 128-bit şifreleme kabul edilir. Aksi taktirde "
+"40 ve 58-bit şifreleme de kabul edilir. PPTP bağlantılarda şifrelemenin her "
+"durumda zorunlu tutulduğunu unutmayınız (şifresiz bağlantı istekleri "
+"reddedilir)"
+
+# bu çevirilerde kelime ters olarak işlendiği için (ingilizce altyapısı) çeviri cümlesine dikkate almayınız
+#: usr/local/www/vpn_pptp.php:488
+msgid "don't forget to "
+msgstr "PPTP istemcilerinin erişimine izin vermek için "
+
+# bu çevirilerde kelime ters olarak işlendiği için (ingilizce altyapısı) çeviri cümlesine dikkate almayınız
+#: usr/local/www/vpn_pptp.php:488
+msgid "add a firewall rule"
+msgstr "güvenlik duvarı kuralı ekle"
+
+# bu çevirilerde kelime ters olarak işlendiği için (ingilizce altyapısı) çeviri cümlesine dikkate almayınız
+#: usr/local/www/vpn_pptp.php:488
+msgid "to permit traffic from PPTP clients"
+msgstr "meyi unutmayınız"
+
+#: usr/local/www/vpn_pptp_users.php:85
+msgid "The PPTP user list has been modified"
+msgstr "PPTP kullanıcı listesi değiştirildi"
+
+#: usr/local/www/vpn_pptp_users.php:85
+msgid "Warning: this will terminate all current PPTP sessions"
+msgstr "Uyarı: PPTP oturumları sonlandırılacaktır"
+
+#: usr/local/www/vpn_pptp_users_edit.php:91
+msgid "The password cannot start with '!'."
+msgstr "Parola '!' karakteri ile başlayamaz."
+
+#: usr/local/www/vpn_pptp_users_edit.php:161
+msgid "If you want to change the users' password, enter it here twice."
+msgstr ""
+"Kullanıcıların parolalarını değiştirmek için bu bölüme iki defa giriniz."
+
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:81
+msgid "Int."
+msgstr "Int."
+
+#: usr/local/www/widgets/widgets/dyn_dns_status.widget.php:134
+msgid "Checking ..."
+msgstr "Kontrol Ediliyor ..."
+
+#: usr/local/www/widgets/widgets/log.widget.php:180
+msgid "IF"
+msgstr "Arabrm"
+
+#: usr/local/www/widgets/widgets/smart_status.widget.php:38
+msgid "Drive"
+msgstr "Sürücü"
+
+#: usr/local/www/widgets/widgets/smart_status.widget.php:39
+msgid "Ident"
+msgstr "Tanım"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:133
+msgid "Obtaining update status"
+msgstr "Güncelleme durumu alınıyor"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:139
+msgid "Platform"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:157
+msgid "NanoBSD Boot Slice"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:168
+msgid "CPU Type"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:183
+msgid "Hardware crypto"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:188
+msgid "Uptime"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:192
+msgid "Current date/time"
+msgstr "Güncel tarih/saat"
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:198
+msgid "DNS server(s)"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:210
+msgid "Last config change"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:215
+msgid "State table size"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:223
+msgid "Show states"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:227
+msgid "MBUF Usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:239
+msgid "Temperature"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:248
+msgid "Load average"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:254
+msgid "CPU usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:261
+msgid "Memory usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:270
+msgid "SWAP usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/system_information.widget.php:279
+msgid "Disk usage"
+msgstr ""
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:44
+msgid "Computer / Device"
+msgstr "Bilgisayar / Aygıt"
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:70
+msgid "Wake Up"
+msgstr "Uyan"
+
+#: usr/local/www/widgets/widgets/wake_on_lan.widget.php:75
+msgid "No saved WoL addresses"
+msgstr "Kayıtlı WoL (Lan ile Uyan) adresleri yok"
+
+#: usr/local/www/wizard.php:66 usr/local/www/wizard.php:72
+#, php-format
+msgid "ERROR: Could not open %s."
+msgstr "HATA: %s açılamadı."
+
+#: usr/local/www/wizard.php:78
+#, php-format
+msgid "ERROR: Could not parse %s/wizards/%s file."
+msgstr "HATA: %s/wizards/%s dosyası ayrıştırılamadı."
+
+#: usr/local/www/wizards/openvpn_wizard.inc:626
+#: usr/local/www/wizards/openvpn_wizard.inc:643
+#, php-format
+msgid "OpenVPN %s wizard"
+msgstr "OpenVPN %s sihirbazı"
+
+# 76%
+#: usr/local/www/wizards/openvpn_wizard.inc:638
+#: usr/local/www/wizards/openvpn_wizard.inc:653
+msgid "OpenVPN Wizard"
+msgstr "OpenVPN Sihirbazı"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:60
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:63
+msgid "You need to specify the number of connections."
+msgstr "Bağlantı sayısını belirtmelisiniz."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:65
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:68
+msgid "The number of connections should be greater than 1."
+msgstr "Bağlantı sayısı 1'den yüksek olmalıdır."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:90
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:104
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:111
+msgid "You have less interfaces than number of connections!"
+msgstr "Bağlantı sayısından az arabirim var!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:302
+msgid "You cannot specify bandwidth smaller than 1!"
+msgstr "Bant genişliği 1'den düşük olamaz!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:313
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:336
+msgid "You cannot select the same interface for local and outside."
+msgstr "Yerel ve dış için aynı arabirimi seçemezsiniz."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:495
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:591
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:538
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:641
+msgid ""
+"Address must be a valid IP address or Firewall Alias. Please correct this "
+"value to continue."
+msgstr ""
+"Adres geçerli bir IP adresi veya Güvenlik Duvarı Grup tanımı olmalıdır. "
+"Devam etmek için hatayı düzeltiniz."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:579
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:608
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:629
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:656
+msgid "Only percentage bandwidth specification is allowed."
+msgstr "Bant genişliği sadece yüzde cinsinden yazılabilir."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:762
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1146
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:811
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1209
+msgid ""
+"Custom Bandwidths are greater than 30%. Please lower them for the wizard to "
+"continue."
+msgstr ""
+"Özel Bant Genişlikleri yüzde 30'dan fazla. Sihirbazın devam edebilmesi için "
+"onları düşürmelisiniz."
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1448
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1517
+msgid "Penalty Box"
+msgstr "Ceza Kutusu"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1455
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1475
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1489
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1506
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1525
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1549
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1628
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1524
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1545
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1559
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1576
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1595
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1619
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1646
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1699
+msgid "Traffic Shaper Wizard"
+msgstr "Trafik Şekillendirme Sihirbazı"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1467
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1537
+msgid "Connections From Upstream SIP Server"
+msgstr "Yukarıakış SIP Sunucu 'dan gelen bağlantılar"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc:1481
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:1551
+msgid "Connections To Upstream SIP Server"
+msgstr "Yukarıakış SIP Sunucu 'ya giden bağlantılar"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:74
+msgid "You need to specify the number of LAN type interfaces."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:79
+msgid "The number of LAN type interfaces should be greater than 1."
+msgstr ""
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:323
+msgid "You cannot specify 0 bandwidth!"
+msgstr "Sıfır \"0\" bant genişliği kullanılamaz!"
+
+#: usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc:345
+msgid "You cannot select the same interface twice on local interfaces."
+msgstr "Yerel arabirimlerde aynı arabirimi iki kez seçemezsiniz."
+
+#: usr/local/www/xmlrpc.php:68
+msgid "Authentication failed"
+msgstr "Kimlik doğrulama başarısız"
+
+#: usr/local/www/xmlrpc.php:79
+msgid ""
+"XMLRPC wrapper for eval(). This method must be called with two parameters: a "
+"string containing the local system\\'s password followed by the PHP code to "
+"evaluate."
+msgstr ""
+"eval(). için XMLRPC paketleyici. Bu method iki parametre ile çağrılmalıdır: "
+"yerel sistem\\'lerde bir dize içermeli PHP kodunu sorgulamak için ardından "
+"şifre girilmelidir."
+
+#: usr/local/www/xmlrpc.php:110
+msgid ""
+"XMLRPC wrapper for mwexec(). This method must be called with two parameters: "
+"a string containing the local system\\'s password followed by an shell "
+"command to execute."
+msgstr ""
+"mwexec(). için XMLPRC paketleyici. Bu method iki parametre ile "
+"çağrılmalıdır: yerel sistem\\'lerde bir dize içermeli komut satırı (shell) "
+"komutunu çalıştırmak için ardından şifre girilmelidir."
+
+#: usr/local/www/xmlrpc.php:134
+msgid ""
+"XMLRPC wrapper for backup_config_section. This method must be called with "
+"two parameters: a string containing the local system\\'s password followed "
+"by an array containing the keys to be backed up."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:162
+msgid ""
+"XMLRPC wrapper for restore_config_section. This method must be called with "
+"two parameters: a string containing the local system\\'s password and an "
+"array to merge into the system\\'s config. This function returns true upon "
+"completion."
+msgstr ""
+
+# 88%
+#: usr/local/www/xmlrpc.php:229 usr/local/www/xmlrpc.php:320
+#: usr/local/www/xmlrpc.php:351
+#, php-format
+msgid "Merged in config (%s sections) from XMLRPC client."
+msgstr "XMLRPC istemcisinden (%s bölümleri) yapılandırmaya dahil edildi."
+
+#: usr/local/www/xmlrpc.php:296
+msgid ""
+"XMLRPC wrapper for merging package sections. This method must be called with "
+"two parameters: a string containing the local system\\'s password and an "
+"array to merge into the system\\'s config. This function returns true upon "
+"completion."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:326
+msgid ""
+"XMLRPC wrapper for merge_config_section. This method must be called with two "
+"parameters: a string containing the local system\\'s password and an array "
+"to merge into the system\\'s config. This function returns true upon "
+"completion."
+msgstr ""
+
+#: usr/local/www/xmlrpc.php:356
+msgid ""
+"Basic XMLRPC wrapper for filter_configure. This method must be called with "
+"one paramater: a string containing the local system\\'s password. This "
+"function returns true upon completion."
+msgstr ""
+"filter_configure için temel XMLRPC paketleyici. Yerel sistem parolasını "
+"içeren bir dize: Bu yöntem, bir parametre ile çağrılmalıdır. Bu işlem "
+"tamamlandıktan sonra doğru yapıldığına dair sonuç gösterir."
+
+#: usr/local/www/xmlrpc.php:393
+msgid "Basic XMLRPC wrapper for configuring CARP interfaces."
+msgstr "CARP arabirimlerini yapılandırmak için temel XMLRPC paketleyici."
+
+#: usr/local/www/xmlrpc.php:420 usr/local/www/xmlrpc.php:441
+msgid ""
+"Basic XMLRPC wrapper for check_firmware_version. This function will return "
+"the output of check_firmware_version upon completion."
+msgstr ""
+"check_firmware_version için temel XMLRPC paketleyici. Bu fonksiyon, "
+"tamamlandıktan sonra check_firmware_version çıkışını gösterecektir."
+
+#: usr/local/www/xmlrpc.php:462
+msgid "Basic XMLRPC wrapper for rc.reboot."
+msgstr "rc.reboot için temel XMLRPC paketleyici."
+
+#~ msgid "PEAR constructor called, class=%s\n"
+#~ msgstr "PEAR kurucu çağırıldığında; sınıf=%s\n"
+
+#~ msgid "PEAR destructor called, class=%s\n"
+#~ msgstr "PEAR silici çağrıldığında, sınıf=%s\n"
+
+#~ msgid "invalid error callback"
+#~ msgstr "geçersiz hata çağrısı"
+
+#~ msgid "invalid error mode"
+#~ msgstr "geçersiz hata yöntemi"
+
+#~ msgid "The expected error you submitted does not exist"
+#~ msgstr "Gönderiniz artık mevcut değil"
+
+#~ msgid "The expected error you submitted is empty"
+#~ msgstr "Beklenen hatayı boş gönderdiniz"
+
+#~ msgid ""
+#~ "PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_ErrorStack for exceptions"
+#~ msgstr ""
+#~ "PEAR_ERROR_EXCEPTION artık kullanılmıyor, PEAR_ErrorStack için özel sınıf "
+#~ "kullanılıyor."
+
+#~ msgid ""
+#~ "[%s: message=\"%s\" code=%d mode=callback callback=%s prefix=\"%s\" info="
+#~ "\"%s\"]"
+#~ msgstr "[%s: mesaj=\"%s\" kod=%d mod=geri geri=%s ek=\"%s\" bilgi=\"%s\"]"
+
+#~ msgid ""
+#~ "[%s: message=\"%s\" code=%d mode=%s level=%s prefix=\"%s\" info=\"%s\"]"
+#~ msgstr "[%s: mesaj=\"%s\" kod=%d mod=%s seviye=%s ek=\"%s\" bilgi=\"%s\"]"
+
+#~ msgid ""
+#~ "Potential DNS Rebind attack detected, see http://en.wikipedia.org/wiki/"
+#~ "DNS_rebinding<br/>Try accessing the router by IP address instead of by "
+#~ "hostname."
+#~ msgstr ""
+#~ "Muhtemel DNS tekrar bağlama saldırısı tesbit edildi, açıklama: http://en."
+#~ "wikipedia.org/wiki/DNS_rebinding<br/> Router e host adı yerine IP adresi "
+#~ "ile giriş yapmayı deneyin."
+
+#~ msgid "ERROR! Could not login to server %1$s as user %2$s."
+#~ msgstr "HATA ! Sunucu'ya %1$s kullanıcı olarak %2$s giriş yapılamadı."
+
+#~ msgid "Radius start: %s<br>\n"
+#~ msgstr "Radius başladı: %s<br>\n"
+
+#~ msgid "Radius send failed: %s<br>\n"
+#~ msgstr "Radius başarısız gönderme: %s<br>\n"
+
+#~ msgid "Local Auth"
+#~ msgstr "Yerel kimlik doğrulama"
+
+#~ msgid "Creating outbound rules %1$s - (%2$s)"
+#~ msgstr "%1$s - (%2$s) dışarı giden kuralları oluşturuluyor"
+
+#~ msgid "filter_generate_address: %s is not a valid source port."
+#~ msgstr "filter_generate_address: %s geçerli bir port değildir."
+
+#~ msgid "interface_vlan_confgure called with if undefined."
+#~ msgstr "interface_vlan_confgure denilen eğer tanımsızsa."
+
+#~ msgid "interface_qinq_confgure called with if undefined.%s"
+#~ msgstr "interface_qinq_confgure denilen eğer tanımsızsa.%s"
+
+#~ msgid "Creating other wireless clone interfaces..."
+#~ msgstr "Çoğaltılan diğer kablosuz arabirimler oluşturuluyor..."
+
+#~ msgid "Enable CARP ARP-balancing"
+#~ msgstr "CARP ARP-Dengelemesini Etkinleştir"
+
+#~ msgid "Disallow CARP preemption"
+#~ msgstr "CARP önalıma izin verme"
+
+#~ msgid "Enable CARP preemption"
+#~ msgstr "CARP önalımı etkinleştır"
+
+#~ msgid "Enable CARP logging"
+#~ msgstr "CARP günlüğünü etkinleştir"
+
+#~ msgid "Could not create rules.boot file!"
+#~ msgstr "rules.boot dosyası oluşturulamadı!"
+
+#~ msgid "Bring up pfsync0 syncpeer"
+#~ msgstr "syncpeer pfsync0 açık"
+
+#~ msgid "Bring up pfsync0 syncdev"
+#~ msgstr "syncdev pfsync0 açık"
+
+#~ msgid "Bring up pfsync0"
+#~ msgstr "pfsync0 açık"
+
+#~ msgid "Allow CARP."
+#~ msgstr "CARP izin ver."
+
+#~ msgid "Disallow CARP."
+#~ msgstr "CARP izin verme."
+
+#~ msgid ""
+#~ "Sorry but we could not find a matching real interface subnet for the "
+#~ "virtual IP address %s."
+#~ msgstr ""
+#~ "Üzgünüm %s Sanal IP adresi ile uyuşan gerçek arabirim altağ bulunamadı."
+
+#~ msgid ""
+#~ "Sorry but we could not find a matching real interface subnet for the "
+#~ "virtual IPv6 address %s."
+#~ msgstr ""
+#~ "Üzgünüm %s Sanal IPv6 adresi ile uyuşan gerçek arabirim altağ bulunamadı."
+
+#~ msgid ""
+#~ "Error: cannot open dhclient_%s.conf in interfaces_carpdev_configure() for "
+#~ "writing.%s"
+#~ msgstr ""
+#~ "Hata: Yazmak için %s dhclient_%s.conf içinde "
+#~ "interfaces_carpdev_configure() açılamadı"
+
+#~ msgid "Could not bring wanif up in terface_carpdev_dhcp_configure()"
+#~ msgstr "in terface_carpdev_dhcp_configure() wanif açık değil"
+
+#~ msgid ""
+#~ "Error: cannot open dhclient_%s.conf in interfaces_wan_dhcp_configure() "
+#~ "for writing.%s"
+#~ msgstr ""
+#~ "Hata: %s yazmak için interfaces_wan_dhcp_configure() yapılandırma içinde "
+#~ "dhclient_%s açılamadı"
+
+#~ msgid "The field '%s' must contain a valid CIDR range."
+#~ msgstr "'%s' Alanı geçerli bir CIDR aralığı içermeli."
+
+#~ msgid "Enabling auto login was not possible."
+#~ msgstr "Otomatik giriş mümkün değil."
+
+#~ msgid "Warning! DHCP Failover setup and no CARP virtual IP's defined!"
+#~ msgstr "Uyarı! DHCP Failover kurulum ve CARP sanal IP'leri tanımlı değil!"
+
+#~ msgid "Started Igmpproxy service sucsesfully."
+#~ msgstr "Igmpproxy servisi başarıyla çalıştırıldı."
+
+#~ msgid "Remvoed cron job for %s"
+#~ msgstr "%s için zamanlandırılmış görev silindi"
+
+#~ msgid "Qlimit must be an positive."
+#~ msgstr "Qlimit pozitif sayı olmalıdır."
+
+#~ msgid "Tbrsize must be an positive."
+#~ msgstr "Tbrsize pozitif sayı olmalıdır."
+
+#~ msgid "Queue limit in packets per second."
+#~ msgstr "Kuyruk Limiti Paket / Sn."
+
+#~ msgid "Plr must be an integer between 1 and 100."
+#~ msgstr "Plr 1 ile 100 tamsayısı arasında olmalıdır."
+
+#~ msgid ""
+#~ "If 'source' or 'destination' is chosen, \n"
+#~ "a dynamic pipe with the bandwidth, delay, packet loss and queue size "
+#~ "given above will \n"
+#~ "be created for each source/destination IP address encountered, \n"
+#~ "respectively. This makes it possible to easily specify bandwidth \n"
+#~ "limits per host."
+#~ msgstr ""
+#~ "'kaynak' veya 'hedef' seçilmişse, \n"
+#~ "sırası ile karşılaşılan her kaynak / varış yeri ip adresi için yukarıda "
+#~ "belirtilen \n"
+#~ "bant genişliği, gecikme, paket kaybı ve kuyruk hacmine sahip dinamik bir "
+#~ "boru oluşturulacaktır. \n"
+#~ "Bu, her ana sistem için bant genişliği sınırının kolayca belirtilmesini "
+#~ "mümkün kılacaktır."
+
+#~ msgid "Initializing PCMCIA..."
+#~ msgstr "PCMCIA başlatılıyor..."
+
+#~ msgid "webConfigurator default"
+#~ msgstr "webArayüzü varsayılan"
+
+#~ msgid "Importing HTTPS certificate"
+#~ msgstr "HTTPS sertifikası içe aktarılıyor"
+
+#~ msgid "Error: cannot open psk.txt in vpn_ipsec_configure()."
+#~ msgstr "Hata: vpn_ipsec_configure(). içindeki psk.txt açılamadı."
+
+#~ msgid "Error: cannot open racoon.conf in vpn_ipsec_configure()."
+#~ msgstr "Hata: vpn_ipsec_configure(). içindeki racoon.conf açılamadı."
+
+#~ msgid "Error: cannot open server %s in vpn.\n"
+#~ msgstr "Hata: vpn içindeki %s sunucusu açılamadı.\n"
+
+#~ msgid "Error: Cannot write phase1 CA certificate file for %s"
+#~ msgstr "Hata: %s CA sertifika aşama 1 dosyasına yazılamadı"
+
+#~ msgid "Error: cannot open spd.conf in vpn_ipsec_configure()."
+#~ msgstr "Hata: vpn_ipsec_configure(). içindeki spd.conf açılamadı."
+
+#~ msgid "Forcefully reloading IPsec racoon daemon"
+#~ msgstr "IPsec racoon servisi zorla yeniden yükleniyor"
+
+#~ msgid "Configuring PPPoE VPN service... "
+#~ msgstr "PPPoE VPN servisi yapılandırılıyor..."
+
+#~ msgid "Could not determine VPN endpoint for '%s'"
+#~ msgstr "'%s' VPN son noktası sonlandırılamıyor"
+
+#~ msgid ""
+#~ "IPSEC: ERROR: One of the endpoints is not a IP address. Old EP '%1$s' new "
+#~ "EP '%2$s'"
+#~ msgstr ""
+#~ "IPSEC: HATA: Son noktalardan birisi IP adresi değil. Eski EP '%1$s' yeni "
+#~ "EP '%2$s'"
+
+#~ msgid ""
+#~ "IPSEC: ERROR: One of the remote endpoints is not a IP address. Old RG "
+#~ "'%1$s' new RG '%2$s'"
+#~ msgstr ""
+#~ "IPSEC: HATA: Uzak son noktalardan birisi IP adresi değil. Eski RG '%1$s' "
+#~ "yeni RG '%2$s'"
+
+#~ msgid ""
+#~ "Reloading IPsec tunnel '%1$s'. Previous IP '%2$s', current IP '%3$s'. "
+#~ "Reloading policy"
+#~ msgstr ""
+#~ "'%1$s'. IPsec tüneli yeniden yükleniyor. Önceki IP '%2$s', şimdiki IP "
+#~ "'%3$s'. ilke yeniden yükleniyor"
+
+#~ msgid "XML error at line 1, check URL"
+#~ msgstr "1. satırda XML hatası, URL'yi kontrol ediniz"
+
+#~ msgid ""
+#~ "You are accessing this router by an IP address not configured locally, "
+#~ "which may be forwarded by NAT or other means. <br/><br/>If you did not "
+#~ "setup this forwarding, you may be the target of a man-in-the-middle "
+#~ "attack."
+#~ msgstr ""
+#~ "Bu yönlendiriciye yerelde ayarlanmamış, NAT veya başka bir yöntemle "
+#~ "yönlendirilmiş olabilecek bir IP adresinden erişiyorsunuz. <br/><br/>Eğer "
+#~ "böyle bir yönlendirme ayarlamadıysanız, bir MitM (man-in-the-middle / "
+#~ "araya girilmesi) saldırısı altında olabilirsiniz."
+
+#~ msgid "CmdCHAIN is executing -> %1$s - %2$s"
+#~ msgstr "CmdCHAIN yürütülüyor -> %1$s - %2$s"
+
+#~ msgid "%1$s failed with return code -> %2$s. The command was %3$s"
+#~ msgstr "%1$s başarısız oldu dönen hata kodu: -> %2$s. %3$s komutuydu"
+
+#~ msgid "Only (%s) MB RAM has been detected.%s"
+#~ msgstr "Sadece (%s) MB RAM algılandı. %s"
+
+#~ msgid "%sInvalid interface name '%s'%s)"
+#~ msgstr "%s Geçersiz arabirim adı '%s'%s)"
+
+#~ msgid "(or nothing if finished):%s"
+#~ msgstr "(veya eğer bittiyse herşey): %s"
+
+#~ msgid ""
+#~ "Removing static route for monitor %1$s and adding a new route through %2$s"
+#~ msgstr ""
+#~ "İzlenmesi için %1$s sabit yönlendirmesi siliniyor ve yerine %2$s "
+#~ "yönlendirmesi ekleniyor"
+
+#~ msgid "MONITOR: %s is down, removing from routing group"
+#~ msgstr "İZLEME: %s kapalı, yönlendirme grubundan kaldırılıyor"
+
+#~ msgid "MONITOR: %s has packet loss, removing from routing group"
+#~ msgstr "İZLEME: %s paket kaybı var, yönlendirme grubundan kaldırılıyor"
+
+#~ msgid "MONITOR: %s has high latency, removing from routing group"
+#~ msgstr "İZLEME: %s gecikme oranı yüksek, yönlendirme grubundan kaldırılıyor"
+
+#~ msgid ""
+#~ "Gateways status could not be determined, considering all as up/active."
+#~ msgstr ""
+#~ "Ağ Geçitlerinin durumu belirlenemedi, hepsinin etkin/çalışır durumda "
+#~ "olduğunu gözden geçirin."
+
+#~ msgid "WebCfg - Status: System logs: OpenNTPD page"
+#~ msgstr "WebCfg - Durum: Sistem Kayıtları: OpenNTPD sayfası"
+
+#~ msgid "Allow access to the 'Status: System logs: OpenNTPD' page."
+#~ msgstr ""
+#~ "'Durum: Sistem Kayıtları: OpenNTPD' sayfasını kullanıcının erişime açar."
+
+#~ msgid "WebCfg - Hidden: Exec Raw page"
+#~ msgstr "WebCfg - Gizli: Çalıştır sayfası"
+
+#~ msgid "Allow access to the 'Hidden: Exec Raw' page."
+#~ msgstr "'Gizli: Çalıştır' sayfasını erişilebilir kılar."
+
+#~ msgid "WebCfg - Interfaces: Groups: Edit page"
+#~ msgstr "WebCfg - Arabirimler: Gruplar: Düzenle sayfası"
+
+#~ msgid "Edit Interface groups"
+#~ msgstr "Arabirim gruplarını düzenle"
+
+#~ msgid "WebCfg - Interfaces: LAGG: Edit page"
+#~ msgstr "WebCfg - Arabirimler: LAGG: Düzenle sayfası"
+
+#~ msgid "WebCfg - Interfaces: QinQ: Edit page"
+#~ msgstr "WebCfg - Arabirimler: QinQ: Düzenle sayfası"
+
+#~ msgid "Edit Interface qinq"
+#~ msgstr "Arabirim qinq düzenle"
+
+#~ msgid "WebCfg - Services: DHCPv6 Relay page"
+#~ msgstr "WebCfg - Servisler: DHCPv6 Aracısı sayfası"
+
+#~ msgid "WebCfg - Firewall: Igmpproxy: Edit page"
+#~ msgstr "WebCfg - Güvenlik duvarı: IGMP Vekil: Düzenle sayfası"
+
+#~ msgid "Allow access to the 'Firewall: Igmpproxy' page."
+#~ msgstr "'Güvenlik duvarı: IGMP Vekil' sayfasına erişim yetkisi verir."
+
+#~ msgid "WebCfg - System: User manager: settings page"
+#~ msgstr "WebCfg - Sistem: Kullanıcı Yöneticisi: Ayarlar sayfası"
+
+#~ msgid "Allow access to the 'System: User manager: settings' page."
+#~ msgstr "'Sistem: Kullanıcı Yöneticisi: Ayarlar' sayfasını açar."
+
+#~ msgid "RRD restore failed exited with %1$s, the error is: %2$s%3$s"
+#~ msgstr "RRD grafikleri geri yükleme başarısız %1$s, hata: %2$s%3$s"
+
+#~ msgid "Package Name"
+#~ msgstr "Paket Adı"
+
+#~ msgid "Package Info"
+#~ msgstr "Paket bilgisi"
+
+#~ msgid "Package Version"
+#~ msgstr "Paket Sürümü"
+
+#~ msgid "No info, check the"
+#~ msgstr "Bilgi yok, kontrol edin"
+
+#~ msgid "forum"
+#~ msgstr "forum"
+
+#~ msgid "Do you really want to remove this package?"
+#~ msgstr "Bu paketi kaldırmak istediğinize emin misiniz?"
+
+#~ msgid "Remove this package."
+#~ msgstr "Bu paketi sil."
+
+#~ msgid "Reinstall this package."
+#~ msgstr "Paketi tekrar kur."
+
+#~ msgid "Reinstall this package's GUI components."
+#~ msgstr "Bu paketin arabirim bileşenlerini tekrar kur."
+
+#~ msgid "Status : EasyRule"
+#~ msgstr "Durum: Kolay Kural"
+
+#~ msgid "The list may contain only IP addresses."
+#~ msgstr "Liste sadece IP adresleri içermelidir."
+
+# Sayfada kullanımda olan limitter i silmek istediğinde verilen uyarı.
+#~ msgid ""
+#~ "This pipe/queue is referenced in filter rules, please remove references "
+#~ "from there before deleteing."
+#~ msgstr ""
+#~ "Bu kuyruk / boru filitre kurallarında kullanımda, lütfen silmeden önce "
+#~ "kullanımda olan kuralı kaldırınız."
+
+#~ msgid "Delete virtual interface"
+#~ msgstr "Sanal arabirimi sil"
+
+#~ msgid "Single Lan multi Wan"
+#~ msgstr "Tek LAN çoklu WAN"
+
+#~ msgid "Single Wan multi Lan"
+#~ msgstr "Tek WAN çoklu LAN"
+
+#~ msgid "A valid IP address must be specified, or # for an exclusion."
+#~ msgstr "Ya geçerli bir IP adresi ya da dışta bırakma için # girilmelidir."
+
+#~ msgid "The %s IP address may not be used in a virtual entry."
+#~ msgstr "%s IP adresi sanal girdi olarak kullanılamaz."
+
+#~ msgid "The /32 subnet mask is invalid for CARP IPs."
+#~ msgstr "/32 altağ maskesi CARP IPleri için geçerli değildir."
+
+#~ msgid "The /128 subnet mask is invalid for CARP IPs."
+#~ msgstr "/128 altağ maskesi CARP IPlerii için geçerli değildir."
+
+#~ msgid "There is already a virtual IP entry for the specified IP address."
+#~ msgstr "Belirtilen IP adresi için zaten sanal IP tanımlaması var."
+
+#~ msgid "VHID %s is already in use. Pick a unique number."
+#~ msgstr "VHID %s zaten kullanılıyor. Benzersiz bir numara seçiniz."
+
+#~ msgid "For this type of vip a carp parent is not allowed."
+#~ msgstr "Bu tür sanal IP için CARP ebeveyne izin verilmez."
+
+#~ msgid "For this type of VIP, a CARP parent is not allowed."
+#~ msgstr "Bu tür sanal IP, için CARP ebeveyne izin verilmez."
+
+#~ msgid "This entry cannot be modified because it is still referenced by CARP"
+#~ msgstr "Bu girdi CARP tarafından kullanıldığından düzenlenemez"
+
+#~ msgid ""
+#~ "The load balancer configuration has been changed.<br>You must apply the "
+#~ "changes in order for them to take effect."
+#~ msgstr ""
+#~ "Yük dengeleyici yapılandırması değiştirildi.<br>Değişiklikleri "
+#~ "uygulayarak etkin hale gelmelerini sağlayabilirsiniz."
+
+#~ msgid ""
+#~ "The system has been reset to factory defaults and is now rebooting. This "
+#~ "may take one minute."
+#~ msgstr ""
+#~ "Sistem fabrika ayarlarına geri döndürüldü ve yeniden başlatılıyor. Bu "
+#~ "işlem birkaç dakika sürebilir."
+
+#~ msgid "OpenNTPD"
+#~ msgstr "OpenNTPD"
+
+#~ msgid "Easy Rule is still experimental."
+#~ msgstr "Kolay Kural deneyseldir."
+
+#~ msgid "Continue at risk of your own peril."
+#~ msgstr "Sistem kararlılığının bozulabileceğini unutmayın."
+
+#~ msgid "Backups are also nice."
+#~ msgstr "Yedekler güzeldir candır."
+
+#~ msgid "Unknown Gateway/Dynamic"
+#~ msgstr "Bilinmeyen Ağ Geçidi/Dinamik"
+
+#~ msgid "Last %s OpenNTPD log entries"
+#~ msgstr "OpenNTPD son %s olay girdisi"
+
+#~ msgid "Current state count:"
+#~ msgstr "Güncel durum sayımı:"
+
+#~ msgid "A valid IP address must be specified for remote syslog server #1."
+#~ msgstr "Uzak syslog sunucu #1 için geçerli bir IP adresi belirtilmeli."
+
+#~ msgid "A valid IP address must be specified for remote syslog server #2."
+#~ msgstr "Uzak syslog sunucu #2 için geçerli bir IP adresi belirtilmeli."
+
+#~ msgid "A valid IP address must be specified for remote syslog server #3."
+#~ msgstr "Uzak syslog sunucu #3 için geçerli bir IP adresi belirtilmeli."
+
+#~ msgid "Number of log entries to show:"
+#~ msgstr "Gösterilecek günlük girdisi sayısı:"
+
+#~ msgid "Log packets blocked by the default rule"
+#~ msgstr "Varsayılan kural tarafından engellenen paketleri günlüğe kaydet"
+
+#~ msgid ""
+#~ "Hint: packets that are blocked by the implicit default block rule will "
+#~ "not be logged anymore if you uncheck this option. Per-rule logging "
+#~ "options are not affected."
+#~ msgstr ""
+#~ "İpucu: Eğer bu seçeneğin işaretini kaldırırsanız varsayılan kural "
+#~ "tarafından engellenen paketler kayıt altına alınmayacaktır. Kuralların "
+#~ "kendi günlükleme seçenekleri etkilenmez."
+
+#~ msgid ""
+#~ "Hint: If this is checked, filter logs are shown as generated by the "
+#~ "packet filter, without any formatting. This will reveal more detailed "
+#~ "information."
+#~ msgstr ""
+#~ "İpucu: Eğer bu seçeneği işaretlerseniz, filtre günlükleri paket "
+#~ "filtresinin oluşturduğu haliyle, herhangi bir biçimlendirme uygulanmadan "
+#~ "gösterilir. Bu durumda daha fazla detay görüntülenir."
+
+#~ msgid "Enable syslog'ing to remote syslog server"
+#~ msgstr "Syslog kayıtlarının uzak syslog sunucuya gösterilmesi özelliğini aç"
+
+#~ msgid "Remote syslog servers"
+#~ msgstr "Uzak syslog sunucular"
+
+#~ msgid "IP addresses of remote syslog servers"
+#~ msgstr "Uzak syslog sunucularının IP adresleri"
+
+#~ msgid ""
+#~ "syslog sends UDP datagrams to port 514 on the specified remote syslog "
+#~ "server. Be sure to set syslogd on the remote server to accept syslog "
+#~ "messages from"
+#~ msgstr ""
+#~ "syslog UDP verigramlarını 514. porttan UDP olarak uzak syslog sunucusuna "
+#~ "gönderir. Uzak sunucudan syslog mesajlarını kabul etme ayarlarının açık "
+#~ "olduğundan emin olun"
+
+#~ msgid "RRD Backup"
+#~ msgstr "RRD Yedekleme"
+
+#~ msgid "DHCP Leases Backup"
+#~ msgstr "DHCP Kiraları Yedeği"
+
+#~ msgid ""
+#~ "This value can be a domain name or IP address, or subnet in CIDR notation."
+#~ msgstr "Bu değer sunucu adı, IP adresi veya CIDR biçiminde alt ağ olabilir."
+
+#~ msgid "Bind to LAN interface only"
+#~ msgstr "Sadece LAN arabirimine bağlan"
+
+#~ msgid ""
+#~ "This option can be useful when trying to access the SNMP agent by the LAN "
+#~ "interface's IP address through a VPN tunnel terminated on the WAN "
+#~ "interface."
+#~ msgstr ""
+#~ "Bu seçenek SNMP ajanına WAN arabiriminde biten bir VPN tüneli içinden LAN "
+#~ "arabiriminin IP adresine erişmekte kullanılabilir."
+
+#~ msgid "Captiveportal status"
+#~ msgstr "Hizmet Portalı durumu"
+
+#~ msgid "Error occured creating interface, please retry."
+#~ msgstr ""
+#~ "Arabirim oluşturulurken bir hata meydana geldi, lütfen tekrar deneyiniz."
+
+#~ msgid ""
+#~ "Set the transmit hold count for Spanning Tree. This is the num- ber of "
+#~ "packets transmitted before being rate limited. The default is 6. The "
+#~ "minimum is 1 and the maximum is 10."
+#~ msgstr ""
+#~ "Yayım Ağacı tutma sayısını belirleyin. Hız sınırlamasından önce "
+#~ "gönderilen paket sayısıdır. Varsayılan değeri 6'dır. En az 1, en fazla "
+#~ "10 olabilir."
+
+#~ msgid ""
+#~ "Set the Spanning Tree priority of interface to value. The default is "
+#~ "128. The minimum is 0 and the maximum is 240."
+#~ msgstr ""
+#~ "Arabirimin Yayım Ağacı önceliğini ayarlayın. Varsayılan olarak 128, en az "
+#~ "0, en fazla 240'tır."
+
+#~ msgid ""
+#~ "The interface here servers as the local address to be used for the gif "
+#~ "tunnel."
+#~ msgstr ""
+#~ "Buradaki arabirim GIF tüneli olarak kullanılacak yerel uca karşılık gelir."
+
+#~ msgid "ECN friendly behaviour"
+#~ msgstr "ECN dostu davranış"
+
+#~ msgid "GRE remote address"
+#~ msgstr "GRE uzak adres"
+
+#~ msgid "GRE tunnel local address "
+#~ msgstr "GRE tüneli yerel adresi"
+
+#~ msgid "Local GRE tunnel endpoint"
+#~ msgstr "Yerel GRE tüneli ucu"
+
+#~ msgid "GRE tunnel remote address "
+#~ msgstr "GRE tünel uzak adresi "
+
+#~ msgid ""
+#~ "Remote GRE address endpoint. The subnet part is used for the determining "
+#~ "the network that is tunneled."
+#~ msgstr ""
+#~ "Uzak GRE adres ucu. Altağ kısmı tünellenen ağı belirlemekte kullanılır."
+
+#~ msgid "Mobile tunnel"
+#~ msgstr "Mobil tünel"
+
+#~ msgid "Specify which encapsulation method the tunnel should use. "
+#~ msgstr "Tünelin hangi sarmalama yöntemini kullanacağını seçiniz. "
+
+#~ msgid ""
+#~ "Specify which WCCP encapsulation(version 1 or 2) method the tunnel should "
+#~ "use"
+#~ msgstr ""
+#~ "Tünelin hangi WCCP sarmalama yöntemini (sürüm 1 veya 2) kullanacağını "
+#~ "belirtin"
+
+#~ msgid "add a new alias"
+#~ msgstr "yeni grup ekle"
+
+#~ msgid "Sorry, an interface is already named %s."
+#~ msgstr "Üzgünüm,%s adında bir arabirim zaten var."
+
+#~ msgid ""
+#~ "The alias name must be less than 32 characters long and may only consist "
+#~ "of the characters"
+#~ msgstr ""
+#~ "Grup adı sadece karakterlerden oluşmalıdır ve 32 karakteri geçmemelidir"
+
+#~ msgid "You must provide a valid URL. Could not fetch usable data."
+#~ msgstr "Geçerli bir URL girmelisiniz. Kullanılabilir veri toplanamadı."
+
+#~ msgid "%1$s is not a valid %2$s alias."
+#~ msgstr "%1$s geçerli bir %2$s grup adı değil."
+
+#~ msgid "URL Table"
+#~ msgstr "URL Tablosu"
+
+#~ msgid "Update Freq."
+#~ msgstr "Güncelleme Sıklığı."
+
+#~ msgid ""
+#~ "Enter as many hosts as you would like. Hosts must be specified by their "
+#~ "IP address."
+#~ msgstr ""
+#~ "İstediğiniz sayıda istemci adresi girebilirsiniz. İstemcileri IP "
+#~ "adresleriyle girebilirsiniz."
+
+#~ msgid ""
+#~ "Enter as many ports as you wish. Port ranges can be expressed by "
+#~ "seperating with a colon."
+#~ msgstr ""
+#~ "İstediğiniz sayıda port girebilirsiniz. Port aralığı belirtmek için iki "
+#~ "sayı arasına girmelisiniz."
+
+#~ msgid "subnet"
+#~ msgstr "altağ"
+
+#~ msgid ""
+#~ "%s is not a valid local port. It must be a port alias or integer between "
+#~ "1 and 65535."
+#~ msgstr ""
+#~ "%s geçerli bir yerel port değil. Bir port grubu yada 1 ile 65535 arası "
+#~ "sayı olmalıdır."
+
+#~ msgid ""
+#~ "HINT: This prevents the rule from automatically syncing to other CARP "
+#~ "members"
+#~ msgstr ""
+#~ "İpucu: Bu seçenek kuralın otomatik olarak diğer CARP üyelerine "
+#~ "gönderilmesini engeller"
+
+#~ msgid "Auto created rule for ISAKMP - %1$s to %2$s"
+#~ msgstr "ISAKMP için oluşturulan otomatik kural %1$s - %2$s"
+
+#~ msgid "Auto created rule for %1$s to %2$s"
+#~ msgstr "%1$s - %2$s için otomatik oluşturulan kural"
+
+#~ msgid "Auto created rule for localhost to %1$s"
+#~ msgstr "localhost ile %1$s arasında otomatik oluşturulan kural"
+
+#~ msgid "Auto created rule for PPTP server"
+#~ msgstr "PPTP sunucu için otomatik oluşturulmuş kural"
+
+#~ msgid "Auto created rule for PPPoE server"
+#~ msgstr "PPPoE sunucu için otomatik oluşturulmuş kural"
+
+#~ msgid "Auto created rule for L2TP server"
+#~ msgstr "L2TP sunucu için otomatik oluşturulmuş kural"
+
+#~ msgid "Auto created rule for OpenVPN server"
+#~ msgstr "OpenVPN sunucu için otomatik oluşturulmuş kural"
+
+#~ msgid "add a new nat based on this one"
+#~ msgstr "Bu kuralı temel alan yeni NAT ekle"
+
+#~ msgid ""
+#~ "With automatic outbound NAT enabled, a mapping is automatically created "
+#~ "for each interface's subnet (except WAN-type connections) and the rules "
+#~ "on this page are ignored.<br/><br/> If manual outbound NAT is enabled, "
+#~ "outbound NAT rules will not be automatically generated and only the "
+#~ "mappings you specify on this page will be used. <br/><br/> If a target "
+#~ "address other than a WAN-type interface's IP address is used, then "
+#~ "depending on the way the WAN connection is setup, a "
+#~ msgstr ""
+#~ "Dışa otomatik NAT etkinleştirildiğinde, WAN türü bağlantılar hariç her "
+#~ "arabirimin alt ağı için otomatik olarak bir eşleme oluşturulur ve bu "
+#~ "sayfadaki kurallar gözardı edilir.<br/><br/>Eğer elle NAT "
+#~ "etkinleştirilmişse, otomatik NAT kuralları oluşturulmaz ve sadece bu "
+#~ "sayfada belirttiğiniz eşlemeler kullanılır.<br/><br/>WAN türü dışındaki "
+#~ "bir arabirimin IP adresi hedef adres olarak kullanılırsa, WAN bağlantı "
+#~ "yapılandırmasına bağlı olarak bir "
+
+#~ msgid ""
+#~ "To completely disable outbound NAT, switch to Manual Outbound NAT then "
+#~ "delete any NAT rules that appear in the list."
+#~ msgstr ""
+#~ "Dışa NAT'ı tamamen kapatmak için Elle Dışa NAT'a geçin ve listedeki tüm "
+#~ "NAT kurallarını silin."
+
+#~ msgid "You must supply a valid port for the nat port entry."
+#~ msgstr "NAT port girişi için geçerli bir port belirtmelisiniz."
+
+#~ msgid ""
+#~ "(leave \n"
+#~ "blank for any)"
+#~ msgstr ""
+#~ "(Tümü \n"
+#~ "için boş bırakınız)"
+
+#~ msgid ""
+#~ "(leave blank for \n"
+#~ "any)"
+#~ msgstr ""
+#~ "(Tümü \n"
+#~ "için boş bırakınız)"
+
+#~ msgid ""
+#~ "Also note that if you are trying to redirect connections on the LAN "
+#~ "select the \"any\" option."
+#~ msgstr ""
+#~ "Ayrıca LAN üzerinde bağlantıları yeniden yönlendirmek istiyorsanız "
+#~ "\"herhangi biri\" seçeneğini seçmeniz gerekir."
+
+#~ msgid ""
+#~ "HINT: This prevents the rule from automatically syncing to other CARP "
+#~ "members."
+#~ msgstr ""
+#~ "İpucu: Diğer CARP üyelerine otomatik olarak bu kuralın gönderilmesini "
+#~ "engeller."
+
+#~ msgid ""
+#~ "The settings have been applied. The firewall rules are now reloading in "
+#~ "the background.<br/>You can also %s monitor %s the reload progress"
+#~ msgstr ""
+#~ "Yapılandırma uygulandı. Güvenlik duvarı kuralları arka planda yükleniyor."
+#~ "<br/>Aynı zamanda %2$s yükleme durumunu %1$s izleyebilirsiniz"
+
+#~ msgid ""
+#~ "The firewall rule configuration has been changed.<br>You must apply the "
+#~ "changes in order for them to take effect."
+#~ msgstr ""
+#~ "Güvenlik duvarı kuralları değiştirildi.<br/>Değişiklikleri uygulayarak "
+#~ "etkin hale gelmelerini sağlayabilirsiniz."
+
+#~ msgid "Reject type rules only works when the protocol is set to TCP."
+#~ msgstr "Reddet kuralları sadece protokol TCP ise kullanılabilir."
+
+#~ msgid "Queue type rules only work with queues."
+#~ msgstr "Sıra türü kurallar sadece sıralarda işe yarar."
+
+#~ msgid "You can not assign a IPv4 gateway group on IPv6 Address Family rule"
+#~ msgstr "IPv4 ağ geçidi grubunu IPv6 Adres Ailesi kuralına atayamazsınız"
+
+#~ msgid "You can not assign a IPv6 gateway group on IPv4 Address Family rule"
+#~ msgstr "IPv6 ağ geçidi grubunu IPv4 Adres Ailesi kuralına atayamazsınız"
+
+#~ msgid "You can not assign the IPv4 Gateway to a IPv6 Filter rule"
+#~ msgstr "IPv4 Ağ geçidini IPv6 Filtre kuralına atayamazsınız"
+
+#~ msgid "You can not assign the IPv6 Gateway to a IPv4 Filter rule"
+#~ msgstr "IPv6 Ağ geçidini IPv4 Filtre kuralına atayamazsınız"
+
+#~ msgid ""
+#~ "You cannot select one queue and one virtual interface for IN and Out. "
+#~ "both must be from the same type."
+#~ msgstr ""
+#~ "Giriş ve Çıkış için bir kuyruk ve bir de sanal arabirim seçemezsiniz. "
+#~ "İkisi de aynı türden olmalıdır."
+
+#~ msgid " subnet"
+#~ msgstr " altağ"
+
+#~ msgid "Note: this only works for TCP rules"
+#~ msgstr "Not: Bu ayar sadece TCP kurallarında çalışır"
+
+#~ msgid " Maximum number of established connections per host"
+#~ msgstr " Host başına maksimum kurulu bağlantı sayısı"
+
+#~ msgid "Maximum new connections / per second(s)"
+#~ msgstr "Saniyede kurulabilecek en fazla yeni bağlantı(lar)"
+
+#~ msgid "State Timeout in seconds"
+#~ msgstr "Saniye cinsinden durum zaman aşımı"
+
+#~ msgid ""
+#~ "Hint: This prevents the rule from automatically syncing to other CARP "
+#~ "members."
+#~ msgstr ""
+#~ "İpucu: Bu seçenek, diğer CARP üyelerine otomatik olarak bu kuralın "
+#~ "gönderilmesini engeller."
+
+#~ msgid ""
+#~ "Click individual date to select that date only. Click the appropriate "
+#~ "weekday Header to select all occurences of that weekday."
+#~ msgstr ""
+#~ "Belirli bir tarihi seçme için o tarihe tıklayın. Haftanın belirli bir "
+#~ "gününü seçmek için haftanın günü başlığına tıklayın."
+
+#~ msgid "Revert to this configuration?"
+#~ msgstr "Bu yapılandırmaya geri dönülsün mü?"
+
+#~ msgid "Delete this configuration backup?"
+#~ msgstr "Bu yapılandırma yedeği silinsin mi?"
+
+#~ msgid "This entry cannot be deleted because it is still referenced by CARP"
+#~ msgstr "Bu girdi CARP tarafından kullanıldığı için silinemez"
+
+#~ msgid ""
+#~ "This entry cannot be deleted because it is still referenced by ip alias "
+#~ "entry"
+#~ msgstr "Bu girdi bir IP grup girdisinde kullanıldığı için silinemez"
+
+#~ msgid ""
+#~ "This interface is referenced by VIPs please delete those before setting "
+#~ "the interface to 'none' configuration."
+#~ msgstr ""
+#~ "Bu arabirime bağlı sanal IPler olduğu için arabirimi 'hiçbiri' olarak "
+#~ "değiştirmeden önce onları silmelisiniz."
+
+#~ msgid "The MTU must be greater than 576 bytes."
+#~ msgstr "MTU değeri 576 bayttan yüksek olmalıdır."
+
+#~ msgid "The MSS must be greater than 576 bytes."
+#~ msgstr "MSS Değeri 576 bayttan yüksek olmalıdır."
+
+#~ msgid "Interface %s dynamic gateway"
+#~ msgstr "Arabirim %s dinamik ağ geçidi"
+
+#~ msgid ""
+#~ "If you leave this field blank, the adapter's default MTU will be used. "
+#~ "This is typically 1500 bytes but can vary on some hardware."
+#~ msgstr ""
+#~ "Bu alanı boş bırakırsanız, ağ kartının varsayılan MTU değeri kullanılır. "
+#~ "Varsayılan değer bir çok donanım için 1500 bayttır."
+
+#~ msgid ""
+#~ "If this interface is an Internet connection, select an existing Gateway "
+#~ "from the list or add one using the link above"
+#~ msgstr ""
+#~ "Eğer bu arabirim bir internet bağlantısı ise listedeki ağ geçitlerinden "
+#~ "birini seçin veya yukarıdaki bağlantıyı kullanarak yeni bir tane ekleyin"
+
+#~ msgid ""
+#~ "If this interface is an Internet connection, select an existing Gateway "
+#~ "from the list or add a new one using the link above"
+#~ msgstr ""
+#~ "Bu arabirim internet bağlantısı ise, mevcut ağ geçidini listeden seçiniz "
+#~ "yada aşağıdaki linki kullanarak bir tane ekleyiniz"
+
+#~ msgid "DHCPv6 Prefix Delegation ID"
+#~ msgstr "DHCPv6 Önek Yetkilendirme Kimliği"
+
+#~ msgid ""
+#~ "This ID sets the delegated DHCP-PD prefix number which will be used to "
+#~ "setup the interface."
+#~ msgstr ""
+#~ "Bu Kimlik arabirim kurulumu için yetkilendirilecek DHCP-PD önek "
+#~ "numarasını belirler."
+
+#~ msgid "DHCP client configuration"
+#~ msgstr "DHCP istemci yapılandırması"
+
+#~ msgid "DHCP6 client configuration"
+#~ msgstr "DHCP6 istemci yapılandırması"
+
+#~ msgid "WPA Pre Shared Key"
+#~ msgstr "WPA Önpaylaşımlı Anahtar"
+
+#~ msgid "Pre Shared Key"
+#~ msgstr "Önpaylaşımlı Anahtar"
+
+#~ msgid ""
+#~ "Interface mismatch detected. Please resolve the mismatch and click "
+#~ "Save. The firewall will reboot afterwards."
+#~ msgstr ""
+#~ "Arabirim uyumsuzluğu tespit edildi. Uyumsuzluğu düzelterek kaydediniz. "
+#~ "Ardından Güvenlik Duvarı yeniden başlatılacak."
+
+#~ msgid ""
+#~ "The interface configuration has been changed.<br>You must apply the "
+#~ "changes in order for them to take effect."
+#~ msgstr ""
+#~ "Arabirim yapılandırması değiştirildi.<br> Değişiklikleri uygulayarak "
+#~ "etkin hale gelmelerini sağlayabilirsiniz."
+
+#~ msgid "add interface"
+#~ msgstr "arabirim ekle"
+
+#~ msgid "Perform Self Tests"
+#~ msgstr "Testleri Uygula"
+
+#~ msgid "Self Test"
+#~ msgstr "Kendi kendini Test"
+
+#~ msgid "bytes"
+#~ msgstr "bayt"
+
+#~ msgid "age"
+#~ msgstr "süre"
+
+#~ msgid "dest"
+#~ msgstr "hedef"
+
+#~ msgid "dport"
+#~ msgstr "hport"
+
+#~ msgid "exp"
+#~ msgstr "dolum"
+
+#~ msgid "peak"
+#~ msgstr "zirve"
+
+#~ msgid "pkt"
+#~ msgstr "pkt"
+
+#~ msgid "size"
+#~ msgstr "boyut"
+
+#~ msgid "sport"
+#~ msgstr "kport"
+
+#~ msgid "src"
+#~ msgstr "kaynak"
+
+#~ msgid "2002-2007 by Manuel Kasper"
+#~ msgstr "2002-2007 Manuel Kasper"
+
+#~ msgid "The following persons have contributed code to m0n0wall"
+#~ msgstr "Aşağıdaki kişiler m0n0wall'a kod katkısında bulunmuştur"
+
+#~ msgid "Diagnostics: Ping function; WLAN channel auto-select; DNS forwarder"
+#~ msgstr ""
+#~ "Araçlar: Ping fonksiyonu; WLAN kanalı otomatik seçimi; DNS yönlendirici"
+
+#~ msgid "Timezone and NTP client support"
+#~ msgstr "Zaman dilimi ve NTP istemci desteği"
+
+#~ msgid ""
+#~ "Remote syslog'ing; some code bits for DHCP server on optional interfaces"
+#~ msgstr ""
+#~ "Uzak syslog'lama; isteğe bağlı arabirimlerde DHCP sunucu için bir miktar "
+#~ "kod"
+
+#~ msgid ""
+#~ "Idea/code bits for encrypted webConfigurator passwords; minimalized SNMP "
+#~ "agent"
+#~ msgstr ""
+#~ "Şifrelenmiş webArayüzü parolaları için fikir ve kod parçaları; "
+#~ "küçültülmüş SNMP ajanı"
+
+#~ msgid "Advanced outbound NAT: destination selection"
+#~ msgstr "Gelişmiş dış NAT: hedef seçimi"
+
+#~ msgid "Filtering bridge patches "
+#~ msgstr "Filtreleme köprü yamaları "
+
+#~ msgid ""
+#~ "Filter rule patches (ordering, block/pass, disabled); better status page;"
+#~ msgstr ""
+#~ "Filtre kural yamaları (sıralama, engelle/izin ver, devre dışı); daha iyi "
+#~ "durum sayfası;"
+
+#~ msgid "webConfigurator assign network ports page "
+#~ msgstr "webArayüzü ağ portları atama sayfası "
+
+#~ msgid "enhanced "
+#~ msgstr "geliştirilmiş "
+
+#~ msgid "execute command"
+#~ msgstr "komut çalıştır"
+
+#~ msgid " page"
+#~ msgstr " sayfa"
+
+#~ msgid "DHCP client: send hostname patch"
+#~ msgstr "DHCP istemci: host adı yaması gönder"
+
+#~ msgid "DHCP lease list page"
+#~ msgstr "DHCP Kira Listesi sayfası"
+
+#~ msgid "type filter rules; dial-on-demand"
+#~ msgstr "tür filtre kuralları; gerektiğinde bağlan"
+
+#~ msgid "SVG-based traffic grapher"
+#~ msgstr "SVG tabanlı trafik grafiği"
+
+#~ msgid "per-user IP address assignments for PPTP VPN"
+#~ msgstr "PPTP-VPN için kulanıcı bazlı IP ataması"
+
+#~ msgid "NAT on optional interfaces"
+#~ msgstr "Opsiyonel Arabirim NAT"
+
+#~ msgid "captive portal: pass-through MAC/IP addresses, RADIUS authentication"
+#~ msgstr "Hizmet Portalı: İzinli Mac / IP adresler, RADIUS kimlik doğrulama"
+
+#~ msgid "accounting;"
+#~ msgstr "hesaplandırma;"
+
+#~ msgid "HTTP server concurrency limit"
+#~ msgstr "HTTP sunucu eş zamanlı kullanım limiti"
+
+#~ msgid ""
+#~ "traffic shaper TOS matching; magic shaper; DHCP deny unknown clients;"
+#~ msgstr ""
+#~ "trafik şekillendirici TOS eşleme; özel şekillendirici; DHCP bilinmeyen "
+#~ "istemcileri reddet;"
+
+#~ msgid "IPsec user FQDNs; DHCP relay"
+#~ msgstr "IPsec kullanıcı FQDN'leri; DHCP aktarım"
+
+#~ msgid "IDE hard disk standby"
+#~ msgstr "IDE sabit disk bekleme"
+
+#~ msgid "CPU/memory usage display"
+#~ msgstr "CPU/Hafıza kullanım görünümü"
+
+#~ msgid "OpenVPN support"
+#~ msgstr "OpenVPN Desteği"
+
+#~ msgid ""
+#~ "The author of %s would like to thank the authors of these software "
+#~ "packages for their efforts"
+#~ msgstr ""
+#~ "%s yazarları şu yazılım paketlerinin yazarlarına teşekkürü bir borç bilir"
+
+#~ msgid " 1994-2003 FreeBSD, Inc. All rights reserved"
+#~ msgstr " 1994-2003 FreeBSD, Inc. Her hakkı saklıdır"
+
+#~ msgid "1999 - 2003 The PHP Group. All rights reserved"
+#~ msgstr "1999 - 2003 The PHP Group. Her hakkı saklıdır"
+
+#~ msgid " 2004 by Jan Kneschke "
+#~ msgstr " 2004 Jan Kneschke "
+
+#~ msgid "1996-2003 Internet Software Consortium. All rights reserved."
+#~ msgstr "1996-2003 Internet Software Consortium. Her hakkı saklıdır."
+
+#~ msgid "Racoon"
+#~ msgstr "Racoon"
+
+#~ msgid "BPALogin"
+#~ msgstr "BPA Giriş"
+
+#~ msgid "lightweight portable BIDS2 login client"
+#~ msgstr "hafif ve taşınabilir BIDS2 oturum açma istemcisi"
+
+#~ msgid " 2001-3 Shane Hyde, and others."
+#~ msgstr " 2001-3 Shane Hyde, vd."
+
+#~ msgid "The hostname may only contain the characters a-z, 0-9 and '-'."
+#~ msgstr ""
+#~ "Host adı sadece İngilizce a-z, 0-9 ve '-' karakterlerini içerebilir."
+
+#~ msgid "'."
+#~ msgstr "'."
+
+#~ msgid "A valid TCP/IP port must be specified for the webConfigurator port."
+#~ msgstr "webArayüzü için geçerli br TCP/IP portu belirtilmelidir."
+
+#~ msgid ""
+#~ "Enter IP addresses to by used by the system for DNS resolution.These are "
+#~ "also used for the DHCP service, DNS forwarder and for PPTP VPN clients."
+#~ msgstr ""
+#~ "DNS çözümleme için sistemin kullanacağı IP adreslerini girin. Bu IPler "
+#~ "DHCP servisi, DNS yönlendirme ve PPTP VPN istemciler için de "
+#~ "kullanılırlar."
+
+#~ msgid ""
+#~ "By default localhost (127.0.0.1) will be used as the first DNS server "
+#~ "where the DNS forwarder is enabled, so system can use the DNS forwarder "
+#~ "to perform lookups. Checking this box omits localhost from the list of "
+#~ "DNS servers."
+#~ msgstr ""
+#~ "Öntanımlı olarak, DNS yönlendirici etkinleştirildiyse, DNS "
+#~ "yönlendiricinin isim çözümleyebilmesi için, localhost (127.0.0.1) ilk DNS "
+#~ "sunucu olarak kullanılır. Bu kutuyu işaretlerseniz localhost DNS "
+#~ "sunuculara yazılmaz."
+
+#~ msgid "Please select kernel type"
+#~ msgstr "Lütfen çekirdek tipini seçiniz"
+
+#~ msgid "Multiprocessor kernel"
+#~ msgstr "Çok işlemcili çekirdek"
+
+#~ msgid "Uniprocessor kernel"
+#~ msgstr "Tek işlemcili çekirdek"
+
+#~ msgid "Embedded kernel"
+#~ msgstr "Gömülü çekirdek"
+
+#~ msgid "Developers kernel"
+#~ msgstr "Geliştirici çekirdeği"
+
+#~ msgid "Use a URL server for firmware upgrades other than"
+#~ msgstr ""
+#~ "Şunun dışındaki Üretici yazılımı güncellemeleri için bir URL sunucu kullan"
+
+#~ msgid ""
+#~ "When a custom URL is enabled, the system will not verify the digital "
+#~ "signature from %s."
+#~ msgstr ""
+#~ "Özel bir URL girildiğinde, sistem %s dijital imzasını kontrol etmez."
+
+#~ msgid "A route to this destination network already exists."
+#~ msgstr "Bu hedef ağa bir yönlendirme sistemde mevcut."
+
+#~ msgid "Pre-shared keys"
+#~ msgstr "Ön paylaşımlı anahtarlar"
+
+#~ msgid "add phase1 entry"
+#~ msgstr "aşama 1 girdisi ekle"
+
+#~ msgid "System:Advanced:Miscellaneous"
+#~ msgstr "Sistem: Gelişmiş: Diğer"
+
+#~ msgid "Pre-shared key"
+#~ msgstr "Ön paylaşımlı anahtar"
+
+#~ msgid "Do you really want to delete this pre-shared key?"
+#~ msgstr "Bu Ön paylaşımlı anahtarı silmek istediğinizden emin misiniz?"
+
+#~ msgid "VPN: IPsec: Edit pre-shared key"
+#~ msgstr "VPN: IPsec: Ön paylaşımlı anahtarı düzenle"
+
+#~ msgid "edit pppoe instance"
+#~ msgstr "PPPoE düzenle"
+
+#~ msgid "The port must be an integer between 1 and 65535."
+#~ msgstr "Port 1 ile 65535 arasında bir tamsayı olmalıdır."
+
+#~ msgid "%s is not a valid IP address (in \"enabled\" list)."
+#~ msgstr "%s geçerli bir IP adresi değil (\"açık\" listesinde)."
+
+#~ msgid "%s is not a valid IP address (in \"disabled\" list)."
+#~ msgstr "%s geçerli bir IP adresi değil (\"kapalı\" listesinde)."
+
+#~ msgid "%s is not a valid IP address."
+#~ msgstr "%s geçerli bir IP adresi değil."
+
+#~ msgid ""
+#~ "This is the server that clients will be redirected to if *ALL* servers in "
+#~ "the pool are offline."
+#~ msgstr ""
+#~ "Havuzdaki *HİÇBİR* sunucu erişilemez ise istemcilerin yönlendirilecek "
+#~ "sunucudur."
+
+#~ msgid "Do you really want to install this package?"
+#~ msgstr "Bu paketi kurmak istediğinize emin misiniz?"
+
+#~ msgid "completed."
+#~ msgstr "tamamlandı."
+
+#~ msgid "You are not allowed to access this page."
+#~ msgstr "Bu sayfaya erişim yetkiniz yoktur."
+
+#~ msgid "Invalid Meter ID"
+#~ msgstr "Geçersiz Metre Kimliği"
+
+#~ msgid "UPLOAD completed"
+#~ msgstr "YÜKLEME tamamlandı"
+
+#~ msgid "Uploading Files... Please wait..."
+#~ msgstr "Dosyalar yükleniyor... Lütfen bekleyiniz..."
+
+#~ msgid "Uploading files..."
+#~ msgstr "Dosyalar yükleniyor..."
+
+#~ msgid "Time Remaining:"
+#~ msgstr "Kalan Zaman:"
+
+#~ msgid "Speed:"
+#~ msgstr "Hız:"
+
+#~ msgid "KB/sec"
+#~ msgstr "KB/sn"
+
+#~ msgid "Uploaded:"
+#~ msgstr "Yüklenen:"
+
+#~ msgid "File Size:"
+#~ msgstr "Dosya Boyutu:"
+
+#~ msgid "Completed:"
+#~ msgstr "Tamamlanan:"
+
+#~ msgid " Yes "
+#~ msgstr " Evet "
+
+#~ msgid "Certificate and key must be specified for HTTPS login."
+#~ msgstr "HTTPS oturumu için sertifika ve anahtar belirtilmelidir."
+
+#~ msgid "This intermmediate certificate does not appear to be valid."
+#~ msgstr "Bu ara sertifika geçerli görünmüyor."
+
+#~ msgid "This key does not appear to be valid."
+#~ msgstr "Anahtar geçerli değil."
+
+#~ msgid "Pass-through MAC"
+#~ msgstr "İzinli MAC"
+
+#~ msgid ""
+#~ "This setting limits the number of concurrent connections to the captive "
+#~ "portal HTTP(S) server. This does not set how many users can be logged in "
+#~ "to the captive portal, but rather how many users can load the portal page "
+#~ "or authenticate at the same time! Default is 4 connections per client IP "
+#~ "address, with a total maximum of 16 connections."
+#~ msgstr ""
+#~ "Bu ayar Hizmet Portalı HTTP(S) sunucusuna aynı anda yapılabilecek "
+#~ "bağlantı sayısını sınırlar. Hizmet Portalına oturum açabilecek kullanıcı "
+#~ "sayısı değil, aynı anda oturum ekranını görebilecek kullanıcı sayısıdır. "
+#~ "Varsayılan değeri istemci IP adresi başına 4'tür, toplam 16'dır."
+
+#~ msgid "Pass-through MAC tab"
+#~ msgstr "İzinli MAC sekmesi"
+
+#~ msgid "PMS authentication"
+#~ msgstr "PMS kimlik doğrulama"
+
+#~ msgid "Enable PMS authentication"
+#~ msgstr "PMS kimlik doğrulamayı etkinleştir"
+
+#~ msgid ""
+#~ "If this option is set, users will be authenticated through the PMS "
+#~ "backend if they fill the necessary information in the login page."
+#~ msgstr ""
+#~ "Bu seçenek ayarlanırsa, kullanıcılar PMS arka uç biriminde doğrulanır "
+#~ "eğer gerekli ise giriş ekranında bilgilendirmeyi doldurunuz."
+
+#~ msgid "Tertiary RADIUS server"
+#~ msgstr "Üçüncü RADIUS sunucu"
+
+#~ msgid "Quaternary RADIUS server"
+#~ msgstr "Dördüncü RADIUS sunucu"
+
+#~ msgid "singledash"
+#~ msgstr "tek çizgi"
+
+#~ msgid "ietf"
+#~ msgstr "ietf"
+
+#~ msgid "cisco"
+#~ msgstr "cisco"
+
+#~ msgid "unformatted"
+#~ msgstr "düz"
+
+#~ msgid ""
+#~ "If enabled, the username and password will be transmitted over an HTTPS "
+#~ "connection to protect against eavesdroppers. A server name, certificate "
+#~ "and matching private key must also be specified below."
+#~ msgstr ""
+#~ "Etkinleştirildiğinde kullanıcı adı ve şifre dinlenmelerini engellemek "
+#~ "için HTTPS üzerinden gönderilecektir. Bir sunucu adı, sertifika ve "
+#~ "bunlara uyumlu özel anahtar aşağıda tanımlanmalıdır."
+
+#~ msgid "HTTPS certificate"
+#~ msgstr "HTTPS sertifikası"
+
+#~ msgid "Paste a signed certificate in X.509 PEM format here."
+#~ msgstr "İmzalı sertifikayı x.509 PEM formatında bu alana yapıştırınız."
+
+#~ msgid "HTTPS private key"
+#~ msgstr "HTTPS özel anahtar"
+
+#~ msgid "Paste an RSA private key in PEM format here."
+#~ msgstr "RSA özel anahtarını PEM formatında bu alana yapıştırınız."
+
+#~ msgid "HTTPS intermediate certificate"
+#~ msgstr "HTTPS ara sertifika"
+
+#~ msgid ""
+#~ "Adding allowed IP addresses will allow IP access to/from these addresses "
+#~ "through the captive portal without being taken to the portal page. This "
+#~ "can be used for a web server serving images for the portal page or a DNS "
+#~ "server on another network, for example. By specifying <em>from</em> "
+#~ "addresses, it may be used to always allow pass-through access from a "
+#~ "client behind the captive portal."
+#~ msgstr ""
+#~ "Eklenen izinli IP adresleri oturum açma sayfasına yönlendirilmeden IP "
+#~ "erişimine izin verilen adreslerdir. Bu özelliği başka bir ağdan hizmet "
+#~ "portalına resim gönderen bir web sunucu gibi sistemlere erişim vermek "
+#~ "için kullanabilirsiniz. <em>Kaynak</em> adresleri belirterek Hizmet "
+#~ "Portalının arkasındaki bir istemciye her zaman erişim izni verilebilir."
+
+#~ msgid "the IP address are allowed"
+#~ msgstr "izin verilen IP adresi"
+
+#~ msgid ""
+#~ "to always allow an IP address through the captive portal (without "
+#~ "authentication)"
+#~ msgstr ""
+#~ "bir IP adresininin Hizmet Portalından (kimlik doğrulama olmaksızın) "
+#~ "geçişine izin ver"
+
+#~ msgid ""
+#~ "to allow access from all clients (even non-authenticated ones) behind the "
+#~ "portal to this IP address"
+#~ msgstr ""
+#~ "Portalın arkasındaki tüm istemcilerden (kimliği doğrulanmamışlar dahil) "
+#~ "bu IP adresine erişim izni ver"
+
+#~ msgid ""
+#~ "The captive portal MAC address configuration has been changed.<br>You "
+#~ "must apply the changes in order for them to take effect."
+#~ msgstr ""
+#~ "Hizmet Portalı MAC adres yapılandırması değiştirildi.<br>Değişiklikleri "
+#~ "uygulayarak etkin hale gelmelerini sağlayabilirsiniz."
+
+#~ msgid ""
+#~ "Adding MAC addresses as pass-through MACs allows them access through the "
+#~ "captive portal automatically without being taken to the portal page."
+#~ msgstr ""
+#~ "MAC adreslerini izinli MAC olarak eklemek onlara Hizmet Portalı oturumu "
+#~ "gerektirmeden erişim sağlar."
+
+#~ msgid "Edit pass-through MAC address"
+#~ msgstr "İzinli MAC adresi girişini düzenle"
+
+#~ msgid "Edit Pass-through MAC address"
+#~ msgstr "Geçmesine izin verilecek MAC adresini düzenle"
+
+#~ msgid "Do you really want to delete this security policy?"
+#~ msgstr "Bu güvenlik ilkesini silmek istediğinize emin misiniz?"
+
+#~ msgid ""
+#~ "The DHCP Server can only be enabled on interfaces configured with static "
+#~ "IP addresses"
+#~ msgstr ""
+#~ "DHCP sunucu sadece statik adres ile çalışan arabirimlerde aktif edilebilir"
+
+#~ msgid ""
+#~ "A valid IP address must be specified for the primary/secondary DNS "
+#~ "servers."
+#~ msgstr ""
+#~ "Birincil/ikincil DNS sunucular için geçerli bir IP adresi girilmelidir."
+
+#~ msgid "The DHCP server can optionally provide a domain search list."
+#~ msgstr ""
+#~ "DHCP sunucu isteğe bağlı olarak bir alan adı arama listesi de verebilir."
+
+#~ msgid ""
+#~ "Leave blank to disable. Enter the interface IP address of the other "
+#~ "machine. Machines must be using CARP."
+#~ msgstr ""
+#~ "Boş bırakarak devre dışı hale getirebilirsiniz. Diğer sistemin IP "
+#~ "adresini giriniz. Her iki sistem de CARP kullanmalıdırlar."
+
+#~ msgid ""
+#~ "Only the machines listed below will be able to communicate with the "
+#~ "firewall on this NIC."
+#~ msgstr ""
+#~ "Sadece aşağıda belirtilen sistemler bu NIC üzerinden güvenlik duvarı ile "
+#~ "haberleşebilirler."
+
+#~ msgid "and the filename"
+#~ msgstr "dosya adı"
+
+#~ msgid "This Hostname, IP or MAC address already exists."
+#~ msgstr "Bu host Adı, IP ya da MAC sistemde zaten mevcut."
+
+#~ msgid ""
+#~ "If no IP address is given, one will be dynamically allocated from the "
+#~ "pool."
+#~ msgstr "Eğer IP adresi verilmezse havuzdan dinamik olarak atanacaktır."
+
+#~ msgid "A valid Destination Server IP address must be specified."
+#~ msgstr "Geçerli bir Hedef Sunucu IP adresi belirtilmelidir."
+
+#~ msgid "Disallowing CARP sync loop."
+#~ msgstr "CARP senkronizasyon döngüsüne izin verilmeyecek."
+
+#~ msgid "Use a different URL server for packages other than"
+#~ msgstr "Paketler için farklı bir URL sunucu kullan"
+
+#~ msgid "Show"
+#~ msgstr "Göster"
+
+#~ msgid ""
+#~ "By enabling name resolution, the query should take a bit longer. You can "
+#~ "stop it at any time by clicking the Stop button in your browser"
+#~ msgstr ""
+#~ "İsim çözümleme etkinleştirildiğinde, sorgulama biraz daha uzun "
+#~ "sürecektir. İstediğiniz anda tarayıcınızın Durdur düğmesini kullanarak "
+#~ "işlemi durdurabilirsiniz"
+
+#~ msgid "Multi-wan is not supported from this utility currently."
+#~ msgstr "Çoklu WAN bu uygulamada henüz desteklenmemektedir."
+
+#~ msgid ""
+#~ "Your browser does not support the type SVG! You need to either use "
+#~ "Firefox or download the Adobe SVG plugin"
+#~ msgstr ""
+#~ "Tarayıcınız SVG görüntülemeyi desteklemiyor. Firefox veya Chrome kullanın "
+#~ "ya da Adobe SVG eklentisini kurun"
+
+#~ msgid "Enable Carp"
+#~ msgstr "CARP'ı etkinleştir"
+
+#~ msgid "Disable Carp"
+#~ msgstr "CARP'ı devre dışı bırak"
+
+#~ msgid "You can configure CARP settings"
+#~ msgstr "CARP ayarlarını düzenleyebilirsiniz"
+
+#~ msgid "Nothing specified. Cannot continue."
+#~ msgstr "Herhangi bir tanım yapılmadı. Devam edilemiyor."
+
+#~ msgid "OLSR"
+#~ msgstr "OLSR"
+
+#~ msgid "RIP"
+#~ msgstr "RIP"
+
+#~ msgid "ARP Tables"
+#~ msgstr "ARP Tabloları"
+
+#~ msgid "Status of items on this page."
+#~ msgstr "Bu sayfadaki maddelerin durumu."
+
+#~ msgid "Log entries for items on this page."
+#~ msgstr "Bu sayfadaki maddelerin kayıt girdileri."
+
+#~ msgid "Help for items on this page."
+#~ msgstr "Bu sayfadaki maddelerin yardımı."
+
+#~ msgid "Restart Service"
+#~ msgstr "Servisi Tekrar Başlat"
+
+#~ msgid "Stop Service"
+#~ msgstr "Servisi Durdur"
+
+#~ msgid "Start Service"
+#~ msgstr "Servisi Başlat"
+
+#~ msgid "Username is required for all types except Namecheap and FreeDNS."
+#~ msgstr ""
+#~ "Namecheap ve FreeDNS dışındaki tüm türlerde kullanıcı adı girilmelidir."
+
+#~ msgid ""
+#~ "Do you really want to delete this igmpentry? All elements that still use "
+#~ "it will become invalid (e.g. filter rules)!"
+#~ msgstr ""
+#~ "Bu IGMP girdisini silmek istediğinizden emin misiniz? Bu girdiyi kullanan "
+#~ "öğeler (örn. filtre kuralları) devre dışı kalacaktır!"
+
+#~ msgid ""
+#~ "Defines the TTL threshold for the network interface. Packets with a "
+#~ "lower TTL than the threshols value will be ignored. This setting is "
+#~ "optional, and by default the threshold is 1."
+#~ msgstr ""
+#~ "Ağ arabiriminin TTL eşiğini tanımlar. Belirtilen eşiğin altında TTLsi "
+#~ "olan paketler gözardı edilir. Bu ayar seçimliktir ve varsayılan eşik "
+#~ "değeri 1 dir."
+
+#~ msgid "Last check %s"
+#~ msgstr "Son kontrol %s"
+
+#~ msgid ""
+#~ "You need to bind each OpenVPN client to enable its management daemon: use "
+#~ "'Local port' setting in the OpenVPN client screen"
+#~ msgstr ""
+#~ "OpenVPN itemcilerinin yönetim hizmetlerini açmak için onları bağlamanız "
+#~ "gerekir: OpenVPN istemci ekranında 'Yerel port' ayarını kullanın"
+
+#~ msgid "No OpenVPN instance defined"
+#~ msgstr "OpenVPN tanımı yapılmamış"
+
+#~ msgid "Disable webConfigurator login autocomplete"
+#~ msgstr "webArayüzü oturum açma otomatik tamamlama özelliğini kapat"
+
+#~ msgid ""
+#~ "When this is unchecked, login credentials for the webConfigurator may be "
+#~ "saved by the browser. While convenient, some security standards require "
+#~ "this to be disabled. Check this box to disable autocomplete on the login "
+#~ "form so that browsers will not prompt to save credentials (NOTE: Some "
+#~ "browsers do not respect this option). "
+#~ msgstr ""
+#~ "Bu seçenek işaretlenmediğinde, webArayüzü kimlik bilgileri tarayıcıya "
+#~ "kaydedilebilir. Bazı güvenlik standartları bu özelliğin kapalı olmasını "
+#~ "gerektirir. Bu seçeneği işaretleyerek oturum açma ekranında kullanıcı "
+#~ "adının otomatik tamamlanması özelliğini kapatabilirsiniz. (NOT: Bazı "
+#~ "tarayıcılar bu ayarı gözardı eder). "
+
+#~ msgid ""
+#~ "When this is unchecked, access to the webConfigurator is protected "
+#~ "against HTTP_REFERER redirection attempts. Check this box to disable this "
+#~ "protection if you find that it interferes with webConfigurator access in "
+#~ "certain corner cases such as using external scripts to interact with this "
+#~ "system. More information on HTTP_REFERER is available from <a "
+#~ "target='_new' href='http://en.wikipedia.org/wiki/"
+#~ "HTTP_referrer'>Wikipedia</a>."
+#~ msgstr ""
+#~ "Bu kutunun işareti kaldırıldığında, webArayüzüne erişim HTTP_REFERER "
+#~ "yeniden yönlendirme denemelerine karşı korunur. Dış betiklerin sisteme "
+#~ "erişimde sıkıntı yaşaması gibi uç durumlar yaşıyorsanız kutunun işaretini "
+#~ "kaldırın. HTTP_REFERER başlığı hakkında daha fazla bilgiyi <a "
+#~ "target='_new' href='http://en.wikipedia.org/wiki/"
+#~ "HTTP_referrer'>Wikipedia</a>'da bulabilirsiniz."
+
+#~ msgid "Disable password login for Secure Shell (RSA key only)"
+#~ msgstr "SSH için şifre girişini kapat (RSA anahtarıyla bağlan)"
+
+#~ msgid "Serial Communcations"
+#~ msgstr "Seri İletişim"
+
+#~ msgid ""
+#~ "Enables the first serial port with 9600/8/N/1 by default, or another "
+#~ "speed selectable below."
+#~ msgstr ""
+#~ "Seri port etkinleştirildiğinde 9600/8/N/1 varsayılandır, diğer hız "
+#~ "seçenekleri aşağıdadır."
+
+#~ msgid ""
+#~ "expires idle connections quicker. More efficient use of CPU and memory "
+#~ "but can drop legitimate connections"
+#~ msgstr ""
+#~ "boş bağlantıları daha çabuk kapatır. İşlemci ve hafıza daha verimli "
+#~ "kullanır ama sağlıklı bağlantıların da kapatılmasına neden olabilir"
+
+#~ msgid ""
+#~ "tries to avoid dropping any legitimate connections at the expense of "
+#~ "increased memory usage and CPU utilization."
+#~ msgstr ""
+#~ "daha fazla hafıza ve işlemci kullanmayı göze alarak sağlıklı "
+#~ "bağlantıların kapatılmasını engellemeye çalışır."
+
+#~ msgid "Disable NAT Reflection for port forwards"
+#~ msgstr "Port yönlendirmeleri için NAT yansıtmayı kapat"
+
+#~ msgid ""
+#~ "Disables the automatic creation of additional NAT redirect rules for "
+#~ "access to port forwards on your external IP addresses from within your "
+#~ "internal networks. Note: Reflection for port forward entries is skipped "
+#~ "for ranges larger than 500 ports."
+#~ msgstr ""
+#~ "İç ağlarınızdan dış IPleriniz ile yapılan port yönlendirmelerine erişim "
+#~ "için otomatik olarak ek NAT yönlendirme kuralları oluşturulmasını devre "
+#~ "dışı bırakır. Not: 500 porttan büyük aralıklar için port yönlendirme "
+#~ "girdileri yansıtması yapılmaz."
+
+#~ msgid ""
+#~ "Enter value for Reflection timeout in seconds. Note: Only applies to "
+#~ "Reflection on port forwards."
+#~ msgstr ""
+#~ "Saniye cinsinden bir Yansıtma zaman aşımı değeri girin. Not: Sadece port "
+#~ "yönlendirmelerdeki Yansıtmayı etkiler."
+
+#~ msgid "Disable NAT Reflection for 1:1 NAT"
+#~ msgstr "1:1 NAT için NAT Yansıtmayı kapat"
+
+#~ msgid ""
+#~ "Disables the automatic creation of additional NAT 1:1 mappings for access "
+#~ "to 1:1 mappings of your external IP addresses from within your internal "
+#~ "networks. Note: Reflection for 1:1 NAT might not fully work in certain "
+#~ "complex routing scenarios."
+#~ msgstr ""
+#~ "İç ağlarınızdan dış IP adreslerinizle 1:1 eşlemelere erişim için otomatik "
+#~ "olarak ek 1:1 NAT eşlemeleri oluşturulmasını devre dışı bırakır. Not: 1:1 "
+#~ "NAT yansıtması belirli karmaşık yönlendirme senaryolarında çalışmayabilir."
+
+#~ msgid ""
+#~ "Currently only applies to 1:1 NAT rules. Required for full functionality "
+#~ "of NAT Reflection for 1:1 NAT."
+#~ msgstr ""
+#~ "Sadece 1:1 NAT kurallarına uygulanır. 1:1 NAT ile NAT Yansıtmanın tam "
+#~ "olarak çalışması için gereklidir."
+
+#~ msgid "Proxy url for allowing %s to use this proxy to connect outside."
+#~ msgstr "%s Dış bağlantılar için kullanılacak Vekil Sunucu."
+
+#~ msgid ""
+#~ "Proxy port to use when %s connects to the proxy URL configured above. "
+#~ "Default is 8080 for http protocol or 443 for ssl."
+#~ msgstr ""
+#~ "%s üzerinde yapılandırılmış vekil URL'ye bağlanır, kullanılacak vekil "
+#~ "port numarası varsayılan http protokolü için 8080 ssl için 443 dür."
+
+#~ msgid "Proxy username for allowing %s to use this proxy to connect outside"
+#~ msgstr ""
+#~ "%s Vekil Sunucuyu kullanarak dışarıya bağlantı kurması için izin verilen "
+#~ "vekil (proxy) kullanıcı adı"
+
+#~ msgid "Proxy Pass"
+#~ msgstr "Vekil Parola"
+
+#~ msgid "Proxy password for allowing %s to use this proxy to connect outside"
+#~ msgstr ""
+#~ "%s Vekil Sunucuyu kullanarak dışarıya bağlantı kurması için izin verilen "
+#~ "vekil (proxy) parolası"
+
+#~ msgid ""
+#~ "Successive connections will be redirected to the servers in a round-robin "
+#~ "manner with connections from the same source being sent to the same web "
+#~ "server. This 'sticky connection' will exist as long as there are states "
+#~ "that refer to this connection. Once the states expire, so will the sticky "
+#~ "connection. Further connections from that host will be redirected to the "
+#~ "next web server in the round robin."
+#~ msgstr ""
+#~ "Ardışık bağlantılar sunuculara dairesel bir mantıkla yönlendirilir, bir "
+#~ "kaynaktan gelen bağlantılar hep aynı sunucuya gönderilir. Bu 'kalıcı "
+#~ "bağlantı', bu bağlantıya atıfta bulunan durumlar olduğu sürece canlı "
+#~ "kalır. Durumların süresi dolduğunda, kalıcı bağlantının da süresi dolmuş "
+#~ "olur. O istemciden gelen sonraki bağlantı istekleri dairesel dağıtılır."
+
+#~ msgid "Allow default gateway switching"
+#~ msgstr "Ötanımlı ağ geçidi değiştirmeye izin ver"
+
+#~ msgid ""
+#~ "If the link where the default gateway resides fails switch the default "
+#~ "gateway to another available one."
+#~ msgstr ""
+#~ "Eğer öntanımlı ağ geçidi bağlantısı başarısız olursa öntanımlı ağ "
+#~ "geçidini bir başkasıyla değiştir."
+
+#~ msgid ""
+#~ "The powerd utility monitors the system state and sets various power "
+#~ "control options accordingly. It offers three modes (maximum, minimum, and "
+#~ "adaptive) that can be individually selected while on AC power or "
+#~ "batteries. The modes maximum, minimum, and adaptive may be abbreviated "
+#~ "max, min, adp. Maximum mode chooses the highest performance values. "
+#~ "Minimum mode selects the lowest performance values to get the most power "
+#~ "savings. Adaptive mode attempts to strike a balance by degrading "
+#~ "performance when the system appears idle and increasing it when the "
+#~ "system is busy. It offers a good balance between a small performance "
+#~ "loss for greatly "
+#~ msgstr ""
+#~ "PowerD aracı sistem durumunu takip eder ve çeşitli güç koruma "
+#~ "seçeneklerini ona göre ayarlar. AC güçte ve pilde çalışma anına göre "
+#~ "ayarlanabilen üç çalışma kipi sağlar: maksimum, minimum ve dengeli. "
+#~ "Maksimum kip en yüksek performans değerlerini seçer. Minimum kip en "
+#~ "yüksek güç koruma için en düşük performans değerlerini seçer. Denge kipi "
+#~ "ise sistem boşta olduğunda performansı düşürerek ve sistem yoğunluğu "
+#~ "arttığında performansı yükselterek bir denge elde etmeye çalışır."
+
+#~ msgid "glxsb Crypto Acceleration"
+#~ msgstr "glxsb Şifreleme Hızlandırma"
+
+#~ msgid "glxsb"
+#~ msgstr "glxsb"
+
+#~ msgid "Use glxsb"
+#~ msgstr "Şifreleme Hızlandırma (glxsb) kullan"
+
+#~ msgid ""
+#~ "The AMD Geode LX Security Block will accelerate some cryptographic "
+#~ "functions on systems which have the chip. Do not enable this option if "
+#~ "you have a Hifn cryptographic acceleration card, as this will take "
+#~ "precedence and the Hifn card will not be used. Acceleration should be "
+#~ "automatic for IPsec when using Rijndael (AES). OpenVPN should be set for "
+#~ "AES-128-CBC."
+#~ msgstr ""
+#~ "AMD Geode LX Güvenlik Blok çipi olan sistemler için bazı şifreleme "
+#~ "fonksiyonlarını hızlandırır. Hifn şifreleme hızlandırma kartınız varsa "
+#~ "Hifn'den daha yüksek öncelikte olduğu için Hifn kartının kullanılmasını "
+#~ "engeller; bu nedenle Hifn şifreleme hızlandırma kartınız varsa bu "
+#~ "seçeneği açmamalısınız. IPSEC için Rijndael (AES) kullanırken hızlandırma "
+#~ "otomatik olarak devreye girecektir ve OpenVPN AES-128-CBC olarak "
+#~ "ayarlanmalıdır."
+
+#~ msgid ""
+#~ "If you do not have a glxsb chip in your system, this option will have no "
+#~ "effect. To unload the module, uncheck this option and then reboot."
+#~ msgstr ""
+#~ "Sisteminizde glxsb çipi yoksa bu seçeneği açmanın bir etkisi olmaz. "
+#~ "Bileşeni kaldırmak için bu seçeneğin işaretini kaldırıp sistemi yeniden "
+#~ "başlatmanız gerekir."
+
+#~ msgid "Start racoon in debug mode"
+#~ msgstr "Racoon'u hata ayıklama kipinde başlat"
+
+#~ msgid ""
+#~ "Launches racoon in debug mode so that more verbose logs will be generated "
+#~ "to aid in troubleshooting."
+#~ msgstr ""
+#~ "Sorun çözmenize yardımcı olmak için Racoon'u daha detaylı log üretmesine "
+#~ "neden olan hata ayıklama kipinde başlatır."
+
+#~ msgid "NOTE: Changing this setting will restart racoon."
+#~ msgstr ""
+#~ "NOT: Bu seçeneği işaretlemek Racoon'un yeniden başlatılmasına neden olur."
+
+#~ msgid ""
+#~ "By default schedules clear the states of existing connections when the "
+#~ "expiration time has come. This option overrides that behavior by not "
+#~ "clearing states for existing connections."
+#~ msgstr ""
+#~ "Varsayılan olarak zamanlamalar süreleri dolduğunda varolan bağlantıların "
+#~ "durumlarını temizler. Bu seçeneği kullanarak bu işlemin yapılmamasını "
+#~ "sağlayabilirsiniz."
+
+#~ msgid ""
+#~ "By default the monitoring process will flush states for a gateway that "
+#~ "goes down. This option overrides that behavior by not clearing states for "
+#~ "existing connections."
+#~ msgstr ""
+#~ "Varsayılan olarak izleme süreci erişilemeyen ağ geçidinin durumlarını "
+#~ "temizler. Bu seçeneği kullanarak bu işlemin yapılmamasını "
+#~ "sağlayabilirsiniz."
+
+#~ msgid "All IPv6 will be blocked unless this box is checked."
+#~ msgstr "Bu kutu işaretli değilse tüm IPv6 engellenir."
+
+#~ msgid ""
+#~ "This is the port of the SMTP E-Mail server, typically 25, 587 "
+#~ "(submission) or 465 (smtps, tick ssl/tls checkbox)"
+#~ msgstr ""
+#~ "SMTP posta sunucusu portu, çoğunlukla 25, 587 (gönderi) veya 465 (SMTPS, "
+#~ "SSL/TLS kutusunu işaretleyin) olarak kullanılmaktadır"
+
+#~ msgid ""
+#~ "Note: Semi-Colon separated. This will be prepended to the search base dn "
+#~ "above or you can specify full container path."
+#~ msgstr ""
+#~ "Not: Noktalı virgülle ayrılmalıdır. Yukarıdaki temel arama DNye eklenir, "
+#~ "veya tam taşıyıcı yolu belirtebilirsiniz."
+
+#~ msgid "Example: CN=Users;DC=example"
+#~ msgstr "Örnek: CN=Users;DC=ornek"
+
+#~ msgid "Example: CN=Users,DC=example,DC=com;OU=OtherUsers,DC=example,DC=com "
+#~ msgstr "Örnek: CN=Users,DC=example,DC=com;OU=OtherUsers,DC=example,DC=com "
+
+#~ msgid ""
+#~ "Example: CN=Groupname,OU=MyGroups,DC=example,DC=com;OU=OtherUsers,"
+#~ "DC=example,DC=com "
+#~ msgstr ""
+#~ "Örnek: CN=Groupname,OU=MyGroups,DC=example,DC=com;OU=OtherUsers,"
+#~ "DC=example,DC=com "
+
+#~ msgid "Signing Request data"
+#~ msgstr "İmzalama Talep verisi"
+
+#~ msgid "Edit gateway entry"
+#~ msgstr "Ağ geçidi kaydını düzenle"
+
+#~ msgid "You can not use a IPv6 Gateway Address on a IPv4 only interface."
+#~ msgstr "IPv4 arabiriminde IPV6 ağ geçidi adresi kullanamazsınız."
+
+#~ msgid ""
+#~ "The gateway address %1$s does not lie within the chosen interface's "
+#~ "subnet '%2$s'."
+#~ msgstr ""
+#~ "Seçilen arabirimlerin altağı '%2$s' ise ağ geçidi adresi %1$s yalan "
+#~ "söylemez."
+
+#~ msgid "You can not use a IPv4 Gateway Address on a IPv6 only interface."
+#~ msgstr "IPv6 arabiriminde IPV4 ağ geçidi adresi kullanamazsınız."
+
+#~ msgid "The low latency watermark needs to be a numeric value."
+#~ msgstr "Düşük gecikme belirteci bir sayı olmalıdır."
+
+#~ msgid "The high latency watermark needs to be a numeric value."
+#~ msgstr "Yüksek gecikme belirteci bir sayı olmalıdır."
+
+#~ msgid "The low loss watermark needs to be a numeric value."
+#~ msgstr "Düşük kayıp belirteci bir sayı olmalıdır."
+
+#~ msgid "The high loss watermark needs to be a numeric value."
+#~ msgstr "Yüksek kayıp belirteci bir sayı olmalıdır."
+
+#~ msgid ""
+#~ "The High latency watermark needs to be higher then the low latency "
+#~ "watermark"
+#~ msgstr ""
+#~ "Yüksek gecikme belirtecinin düşük gecikme belirtecinden daha büyük bir "
+#~ "sayı olması gerekir"
+
+#~ msgid ""
+#~ "The High packet loss watermark needs to be higher then the low packet "
+#~ "loss watermark"
+#~ msgstr ""
+#~ "Yüksek paket kayıp belirtecinin düşük paket kayıp belirtecinden daha "
+#~ "büyük bir sayı olması gerekir"
+
+#~ msgid "Use BGPD"
+#~ msgstr "BGPD kullan"
+
+#~ msgid ""
+#~ "These define the low and high water marks for latency in milliseconds. "
+#~ "Default is 100/200."
+#~ msgstr ""
+#~ "Bunlar milisaniye cinsinden gecikme alt ve üst sınırlarını tanımlar. "
+#~ "Varsayılan 100/200 dür."
+
+#~ msgid ""
+#~ "These define the low and high water marks for packet loss in %. Default "
+#~ "is 10/20."
+#~ msgstr ""
+#~ "Bunlar %. (yüzde) cinsinden paket kaybı alt ve üst sınırlarını tanımlar. "
+#~ "Varsayılan 10/20 dir."
+
+#~ msgid ""
+#~ "This defines the down time for the alarm to fire in seconds. Default is "
+#~ "10."
+#~ msgstr ""
+#~ "Erişilemez alarmının tetiklenmesi için saniye cinsinden geçmesi gereken "
+#~ "süreyi tanımlar. Varsayılan 10 dur."
+
+#~ msgid "Frequency Probe"
+#~ msgstr "Sorgu Sıklığı"
+
+#~ msgid ""
+#~ "This defines the frequency that an icmp probe will be sent in seconds. "
+#~ "Default is 1."
+#~ msgstr ""
+#~ "Bu ayar ICMP sorgusu gönderilme sıklığını saniye cinsinden belirler. "
+#~ "Varsayılan 1 dir."
+
+#~ msgid ""
+#~ "Additional webConfigurator groups can be added here. \n"
+#~ "\t\t\t\t\t\t\t\tGroup permissions can be assigned which are inherited by "
+#~ "users who are members of the group.\n"
+#~ "\t\t\t\t\t\t\t\tAn icon that appears grey indicates that it is a system "
+#~ "defined object.\n"
+#~ "\t\t\t\t\t\t\t\tSome system object properties can be modified but they "
+#~ "cannot be deleted."
+#~ msgstr ""
+#~ "Buradan ek webArayüzü grupları eklenebilir. \n"
+#~ "\t\t\t\t\t\t\t\tGrup üyeleri tarafından miras alınan grup izinleri "
+#~ "atanabilir.\n"
+#~ "\t\t\t\t\t\t\t\tGri bir simge nesnenin sistem tanımlı olduğu anlamına "
+#~ "gelir.\n"
+#~ "\t\t\t\t\t\t\t\tBazı sistem nesnesi özellikleri değiştirilebilir ama "
+#~ "silinemez."
+
+#~ msgid "Pick a date"
+#~ msgstr "Tarih seçiniz"
+
+#~ msgid "Do you really want to delete this User?"
+#~ msgstr "Bu kullanıcıyı silmek istediğinizden emin misiniz?"
+
+#~ msgid "Testing pfSense LDAP settings... One moment please..."
+#~ msgstr "LDAP ayarları test ediliyor... Lütfen bekleyiniz..."
+
+#~ msgid "Sorry, we could not find an uploadid code."
+#~ msgstr "Yükleme kimliği kodu (uploadid) bulunamadı."
+
+#~ msgid "Uploading Files"
+#~ msgstr "Dosyalar Yükleniyor"
+
+#~ msgid "Please wait"
+#~ msgstr "Lütfen bekleyiniz"
+
+#~ msgid "Uploading file"
+#~ msgstr "Dosya yükleniyor"
+
+#~ msgid "Uploaded"
+#~ msgstr "Yüklendi"
+
+#~ msgid "File Size"
+#~ msgstr "Dosya Boyutu"
+
+#~ msgid "Completed"
+#~ msgstr "Tamamlandı"
+
+#~ msgid "Estimated"
+#~ msgstr "Tahmini"
+
+#~ msgid "Input your pre-shared key string"
+#~ msgstr "Ön paylaşımlı anahtar dizenizi girin"
+
+#~ msgid "Policy Generation"
+#~ msgstr "İlke Üretimi"
+
+#~ msgid ""
+#~ "When working as a responder (as with mobile clients), this controls how "
+#~ "policies are generated based on SA proposals."
+#~ msgstr ""
+#~ "Yanıtlayıcı olarak çalışırken (mobil istemcilerle olduğu gibi), bu ayar "
+#~ "SA tekliflerine göre ilkelerin nasıl üretileceğini belirler."
+
+#~ msgid "Proposal Checking"
+#~ msgstr "Teklif Kontrolü"
+
+#~ msgid ""
+#~ "Specifies the action of lifetime length, key length, and PFS of the phase "
+#~ "2 selection on the responder side, and the action of lifetime check in "
+#~ "phase 1."
+#~ msgstr ""
+#~ "Yanıtlayan tarafta aşama 2 seçiminin ömür, anahtar uzunluğu ve PFS "
+#~ "eylemini; aşama 1'de ömür kontrolü eylemini belirtir."
+
+#~ msgid "1 = 768 bit, 2 = 1024 bit, 5 = 1536 bit"
+#~ msgstr "1 = 768 bit, 2 = 1024 bit, 5 = 1536 bit"
+
+#~ msgid "P2 Hash Algorithms"
+#~ msgstr "P2 Değer Üretme Algoritmaları"
+
+#~ msgid "Enable l2tp server"
+#~ msgstr "L2TP sunucuyu etkinleştir"
+
+#~ msgid "Encryption type"
+#~ msgstr "Şifreleme türü"
+
+#~ msgid "RADIUS server"
+#~ msgstr "RADIUS sunucu"
+
+#~ msgid "RADIUS issued IP's"
+#~ msgstr "RADIUS tarafından sağlanan IPler"
+
+#~ msgid ""
+#~ "This is a network that will be routed through the tunnel, so that a site-"
+#~ "to-site VPN can be established without manually changing the routing "
+#~ "tables. Expressed as a CIDR range. If this is a site-to-site VPN, enter "
+#~ "here the remote LAN here. You may leave this blank to only communicate "
+#~ "with other clients"
+#~ msgstr ""
+#~ "Yönlendirme tablolarını elle değiştirmeden alanlar arası sanal özel ağ "
+#~ "(site-to-site VPN) kurulabilmesi için tünel içinden yönlendirilecek "
+#~ "ağdır. CIDR aralığı olarak belirtilir. Eğer bu siteler arası VPN ise "
+#~ "buraya uzak LAN girilir. Sadece diğer istemcilerle iletişim kurmak için "
+#~ "burayı boş bırakabilirsiniz"
+
+#~ msgid "Compress tunnel packets using the LZO algorithm"
+#~ msgstr "Tünel paketlerini LZO algoritması ile sıkıştır"
+
+#~ msgid "EXAMPLE: route 10.0.0.0 255.255.255.0;"
+#~ msgstr "ÖRNEK: route 10.0.0.0 255.255.255.0;"
+
+#~ msgid ""
+#~ "If this option is not set, all NetBIOS-over-TCP/IP options (includeing "
+#~ "WINS) will be disabled"
+#~ msgstr ""
+#~ "Bu seçenek etkinleştirilmemişse tüm TCP/IP üzerinden NETBIOS (WINS dahil) "
+#~ "devre dışı kalır"
+
+#~ msgid ""
+#~ "This is the IPv6 virtual network used for private communications between "
+#~ "this server and client hosts expressed using CIDR (eg. fe80::/64). The "
+#~ "first network address will be assigned to the\tserver virtual interface. "
+#~ "The remaining network addresses can optionally be assigned to connecting "
+#~ "clients. (see Address Pool)"
+#~ msgstr ""
+#~ "Bu IPv6 sunucu ile CIDR yoluyla belirtilen istemciler (örn. fe80::/64) "
+#~ "arasında özel iletişim için kullanılacak sanal ağdır. İlk ağ adresi sunucu"
+#~ "\tsanal arabirimine atanır. Diğer ağ adresleri bağlanan istemcilere "
+#~ "isteğe göre atanabilir (bkz Adres Havuzu)"
+
+# 94%
+#~ msgid "IPv4 Local Network"
+#~ msgstr "IPv4 Yerel Ağ"
+
+#~ msgid ""
+#~ "This is the network that will be accessible from the remote endpoint. "
+#~ "Expressed as a CIDR range. You may leave this blank if you don't want to "
+#~ "add a route to the local network through this tunnel on the remote "
+#~ "machine. This is generally set to your LAN network"
+#~ msgstr ""
+#~ "Uzak uçtan erişilebilir olacak ağ. CIDR aralığı olarak belirtilir. Eğer "
+#~ "uzak makinada bu tünel içinden yerel ağa bir yönlendirme eklemek "
+#~ "istemiyorsanız burayı boş bırakabilirsiniz. Genel LAN ağınız olarak "
+#~ "ayarlıdır"
+
+#~ msgid "IPv6 Local Network"
+#~ msgstr "IPv6 Yerel Ağ"
+
+#~ msgid ""
+#~ "This is the IPv6 network that will be accessible from the remote "
+#~ "endpoint. Expressed as a CIDR range. You may leave this blank if you "
+#~ "don't want to add a route to the local network through this tunnel on the "
+#~ "remote machine. This is generally set to your LAN network"
+#~ msgstr ""
+#~ "Uzak uçtan erişilebilir olacak IPv6 ağı. CIDR aralığı olarak belirtilir. "
+#~ "Eğer uzak makinada bu tünel içinden yerel ağa bir yönlendirme eklemek "
+#~ "istemiyorsanız burayı boş bırakabilirsiniz. Genel LAN ağınız olarak "
+#~ "ayarlıdı"
+
+#~ msgid ""
+#~ "This is a network that will be routed through the tunnel, so that a site-"
+#~ "to-site VPN can be established without manually changing the routing "
+#~ "tables. Expressed as a CIDR range. If this is a site-to-site VPN, enter "
+#~ "here the remote LAN here. You may leave this blank if you don't want a "
+#~ "site-to-site VPN"
+#~ msgstr ""
+#~ "Yönlendirme tablolarında elle değişiklik yapmadan alanlar arası sanal "
+#~ "özel ağ (site-to-site VPN) kurulabilmesi için Tünel içinden "
+#~ "yönlendirilecek bir ağdır. CIDR aralığı şeklinde girilir. Eğer bu alanlar "
+#~ "arası bir VPN ise buraya uzak LAN'ı giriniz. Eğer alanlar arası VPN "
+#~ "istemiyorsanız burayı boş bırakabilirsiniz"
+
+#~ msgid ""
+#~ "Allow multiple concurrent connections from clients using the same Common "
+#~ "Name.<br/>NOTE: This is not generally recommended, but may be needed for "
+#~ "some scenarios."
+#~ msgstr ""
+#~ "Aynı Genel Adı kullanan istemcilerin birlikte birden fazla bağlantısına "
+#~ "izin ver.<br/>NOT: Genellikle önerilmez, ancak bazı durumlarda "
+#~ "gerekebilir."
+
+#~ msgid "VOIP Adapter"
+#~ msgstr "VoIP Adaptörü"
+
+#~ msgid "You need to specify the number of local interfaces connected."
+#~ msgstr "Bağlı arabirimlerin sayısını belirtmelisiniz."
+
+#~ msgid "The number of local connection needs to be greater than 1."
+#~ msgstr "Yerel bağlantı sayısı 1'den fazla olmalıdır."
+
+#~ msgid "Upload bandwidth of connection is not valid."
+#~ msgstr "Bağlantı upload bant genişliği geçerli değil."
+
+#~ msgid "Download bandwidth of connection is not valid."
+#~ msgstr "Bağlantı download bant genişliği geçerli değil."
+
+#~ msgid "You cannot specify bandwidth less than 1!"
+#~ msgstr "Bant genişliği alanlarında 1'den küçük değer giremezsiniz!"
+
+#~ msgid ""
+#~ "We do not support Bandwidths smaller than 128Kbit/s for CBQ scheduler."
+#~ msgstr "CBQ zamanlayıcısında 128Kbit/s'den düşük değerleri desteklemiyoruz."
+
+#~ msgid "Upload or download bandwidth is not valid."
+#~ msgstr "Gönderme veya İndirme bant genişliği geçersiz."
+
+#~ msgid ""
+#~ "You cannot set the VoIP upload bandwidth on WAN connection higher than "
+#~ "80% of the connection."
+#~ msgstr ""
+#~ "Bağlantının 80% oranından daha fazlasını WAN bağlantısının VoIP gönderme "
+#~ "bant genişliği olarak ayarlayamazsınız."
+
+#~ msgid ""
+#~ "You cannot set the VoIP download bandwidth on connection higher than "
+#~ "80% of the connection."
+#~ msgstr ""
+#~ "Bağlantının 80% oranından daha fazlasını VoIP indirme bant genişliği "
+#~ "olarak ayarlayamazsınız."
+
+#~ msgid ""
+#~ "A valid IPv6 address must be specified for the primary/secondary DNS "
+#~ "servers."
+#~ msgstr ""
+#~ "Ana/ikincil DNS sunucusu için geçerli bir IPv6 adresi belirtilmelidir."
+
+#~ msgid "A valid IPv6 address must be specified for the network boot server."
+#~ msgstr ""
+#~ "Ağ açılış (boot) sunucusu için geçerli bir IPv6 adresi belirtilmelidir."
+
+#~ msgid "prefix length"
+#~ msgstr "ön-ek uzunluğu"
+
+#~ msgid ""
+#~ "You can define a Prefix range here for DHCP Prefix Delegation. This "
+#~ "allows for \n"
+#~ "\t\t\t\t\tassigning networks to subrouters"
+#~ msgstr ""
+#~ "DHCP Önek Yetkilendirmesi için Ön-ek aralığını tanılmayın. Bu \n"
+#~ "\t\t\t\t\t Ağ'lara altyönlendiricilerin atanmasına izin verir"
+
+#~ msgid ""
+#~ "If no IPv6 address is given, one will be dynamically allocated from the "
+#~ "pool."
+#~ msgstr ""
+#~ "Eğer IPv6 adresi verilmediyse, bir tanesi dinamik olarak havuzdan tahsis "
+#~ "edilir edilir."
+
+#~ msgid ""
+#~ "This is the IPv6 address of the server to which DHCPv6 requests are "
+#~ "relayed. You can enter multiple server IPv6 addresses, separated by "
+#~ "commas. Select \"Proxy requests to DHCPv6 server on WAN subnet\" to relay "
+#~ "DHCPv6 packets to the server that was used on the WAN interface."
+#~ msgstr ""
+#~ "DHCPv6 isteklerinin aktarılacağı sunucunun IP adresidir. Virgülle "
+#~ "ayırarak birden fazla IP adresi girebilirsiniz. DHCPv6 paketlerini WAN "
+#~ "arabiriminde kullanılan sunucuya aktarmak için \"DHCPv6 sunucuya gelen "
+#~ "istekleri WAN altağına yönlendir\"i seçin."
+
+#~ msgid "Captiveportal"
+#~ msgstr "Hizmet Portalı"
+
+#~ msgid "Edit Captiveportal Zones"
+#~ msgstr "Hizmet Portalı Bölgelerini düzenle"
+
+#~ msgid "Zone name. Cannot contain spaces."
+#~ msgstr "Bölge adı. Boşluk içeremez."
+
+#~ msgid "<center>Could not locate any previous backups.</center>"
+#~ msgstr "<center>Herhangi bir önceki yedek(ler) bulunamıyor.</center>"
+
+# 87%
+#~ msgid "WebCfg - Diagnostics: Logs: Wireless page"
+#~ msgstr "WebCfg - Araçlar: Sistem Kayıtları: Kablosuz sayfası"
+
+# 84%
+#~ msgid "Allow access to the 'Diagnostics: Logs: System: Wireless' page."
+#~ msgstr ""
+#~ "'Araçlar: Sistem Kayıtları: Sistem: Kablosuz' sayfasını erişime açar."
+
+# 75%
+#~ msgid ""
+#~ "Error: cannot open dhclient_%s.conf in interface_carpdev_configure() for "
+#~ "writing.%s"
+#~ msgstr ""
+#~ "Hata: %s dhclient_%s.conf içinde interface_carpdev_configure() açılamadı"
+
+# 96%
+#~ msgid "Could not bring wanif up in interface_carpdev_dhcp_configure()"
+#~ msgstr "interface_carpdev_dhcp_configure() wanif açık değil"
+
+# 97%
+#~ msgid "Click on package name to access it's website."
+#~ msgstr "Paket ismine tıklayarak web sitesine erişebilirsiniz."
+
+#~ msgid "Do you really want to install "
+#~ msgstr "Gerçekten yüklemek istiyormusunuz "
+
+#~ msgid "Access List successfully deleted"
+#~ msgstr "Erişim listesi başarıyla silindi"
+
+#~ msgid ""
+#~ "The settings for the DNS Resolver have changed. You must apply the "
+#~ "configuration to take affect."
+#~ msgstr ""
+#~ "DNS Çözümleyici ayarları değiştirildi. Değişiklikleri uygulayarak "
+#~ "yapılandırmanın etkin olmasını sağlayabilirsiniz."
+
+#~ msgid ""
+#~ "A valid IP address/hosname or IP/hostname:port must be specified for "
+#~ "remote syslog server #1."
+#~ msgstr ""
+#~ "Uzak syslog sunucu #1 için geçerli bir IP adresi/host adı yada IP/host "
+#~ "adı:port belirtilmeli."
+
+#~ msgid ""
+#~ "A valid IP address/hosname or IP/hostname:port must be specified for "
+#~ "remote syslog server #2."
+#~ msgstr ""
+#~ "Uzak syslog sunucu #2 için geçerli bir IP adresi/host adı yada IP/host "
+#~ "adı:port belirtilmeli."
+
+#~ msgid ""
+#~ "A valid IP address/hosname or IP/hostname:port must be specified for "
+#~ "remote syslog server #3."
+#~ msgstr ""
+#~ "Uzak syslog sunucu #3 için geçerli bir IP adresi/host adı yada IP/host "
+#~ "adı:port belirtilmeli."
+
+#~ msgid ""
+#~ "The virtual IP field selects what (virtual) IP should be used when this "
+#~ "group applies to a local Dyndns, IPsec or openvpn endpoint"
+#~ msgstr ""
+#~ "Sanal IP alanı seçilen hangi (sanal) IP, bu grup yerel Dyndsn, IPsec yada "
+#~ "OpenVPN uç noktası için kullanılmalıdır"
+
+#~ msgid ""
+#~ "If you need to include multiple possible values, sperate them with a |. "
+#~ "If your provider includes a |, escape it with \\|"
+#~ msgstr ""
+#~ "Eğer birden fazla değer girmek isterseniz değerleri | ile ayırınız. Eğer "
+#~ "değeriniz | işaretini de içermeli ise \\| şeklinde kullanabilirsiniz."
+
+#~ msgid ""
+#~ "Hostnames in alias list can only contain the characters A-Z, 0-9 and '-'."
+#~ msgstr ""
+#~ "Grup listesi içindeki Host adları sadece İngilizce A-Z, 0-9 ve '-' "
+#~ "karakterlerini içerebilir."
+
+#~ msgid ""
+#~ "Number of processes used by relayd. Leave blank to use the default value "
+#~ "of 5 processes"
+#~ msgstr ""
+#~ "Aktarıcıd nin kullanacağı işlemci sayısı. Boş bırakarak varsayılan değer "
+#~ "(5 işlemci) kullanın"
+
+#~ msgid "Disconnected user"
+#~ msgstr "Bağlantısı kopmuş kullanıcı"
+
+#~ msgid "Mobile User"
+#~ msgstr "Mobil Kullanıcı"
+
+#~ msgid "Login Time"
+#~ msgstr "Oturum açma Saati"
+
+#~ msgid "Remote"
+#~ msgstr "Uzak"
+
+#~ msgid "export cert+key in .p12"
+#~ msgstr "sertifika+anahtar içinden .p12 dışa aktar"
+
+#~ msgid ""
+#~ "You can not assign a protocol other then ICMP, TCP, UDP or TCP/UDP to a "
+#~ "rule that applies to IPv4 and IPv6"
+#~ msgstr ""
+#~ "IPv4 ve IPv6 uygulanacak kural için ICMP, TCP, UDP yada TCP/UDP protokolü "
+#~ "atayamazsınız"
+
+#~ msgid "The configuration for the DNS Resolver, has been changed"
+#~ msgstr "DNS Çözümleyici' nin yapılandırması değiştirildi"
+
+#~ msgid "Network interfaces"
+#~ msgstr "Ağ Arabirimleri"
+
+#~ msgid "Outgoing interfaces"
+#~ msgstr "Giden Arabirimler"
+
+#~ msgid "Forwarding"
+#~ msgstr "Yönlendirme"
+
+#~ msgid "The Firewall Maximum Tables value must be an integer."
+#~ msgstr "Güvenlik Duvarı Maksimum Tabloları Değeri tamsayı olmalıdır."
+
+#~ msgid "Firewall Maximum Tables"
+#~ msgstr "Güvenlik Duvarı Maksimum Tabloları"
+
+#~ msgid ""
+#~ "Maximum number of tables for systems such as aliases, sshlockout, snort, "
+#~ "etc, combined."
+#~ msgstr ""
+#~ "Gruplar, sshlockout, snort vb sistemler için ayrılan en fazla tablo "
+#~ "sayısı."
+
+#~ msgid ""
+#~ "Enter as many hosts as you would like. Hosts must be specified by their "
+#~ "IP address or fully qualified domain name (FQDN). FQDN hostnames are "
+#~ "periodically re-resolved and updated. If multiple IPs are returned by a "
+#~ "DNS query, all are used."
+#~ msgstr ""
+#~ "Birden fazla host girebilirsiniz. Hostlar IP adresi yada tam donanımlı "
+#~ "domian adı (FQDN) olmalıdır. (FQDN) host isimleri periyodik olarak "
+#~ "çözümlenmiş ve güncel olmalıdır. Eğer birden fazla IP DNS sorgusundan "
+#~ "geri dönüyorsa, tamamı kullanılmalıdır."
+
+#~ msgid ""
+#~ "The powerd utility monitors the system state and sets various power "
+#~ "control options accordingly. It offers four modes (maximum, minimum, "
+#~ "adaptive and hiadaptive) that can be individually selected while on AC "
+#~ "power or batteries. The modes maximum, minimum, adaptive and hiadaptive "
+#~ "may be abbreviated max, min, adp, hadp. Maximum mode chooses the highest "
+#~ "performance values. Minimum mode selects the lowest performance values "
+#~ "to get the most power savings. Adaptive mode attempts to strike a balance "
+#~ "by degrading performance when the system appears idle and increasing it "
+#~ "when the system is busy. It offers a good balance between a small "
+#~ "performance loss for greatly increased power savings. Hiadaptive mode is "
+#~ "alike adaptive mode, but tuned for systems where performance and "
+#~ "interactivity are more importantthan power consumption. It rises "
+#~ "frequency faster, drops slower andkeeps twice lower CPU load."
+#~ msgstr ""
+#~ "PowerD aracı sistem durumunu takip eder ve çeşitli güç koruma "
+#~ "seçeneklerini ona göre ayarlar. AC güçte ve pilde çalışma anına göre "
+#~ "ayarlanabilen dört çalışma kipi sağlar: (maksimum, minimum, dengeli ve "
+#~ "hidengeli.) Maksimum kip en yüksek performans değerlerini seçer. Minimum "
+#~ "kip en yüksek güç koruma için en düşük performans değerlerini seçer. "
+#~ "Denge kipi ise sistem boşta olduğunda performansı düşürerek ve sistem "
+#~ "yoğunluğu arttığında performansı yükselterek bir denge elde etmeye "
+#~ "çalışır. hidengeli kipi dengeli kipine benzer fakat hızlıca CPUfreknasını "
+#~ "yükseltip iki kat yavaş düşürerek ve bekleterek performans ve etkileşimin "
+#~ "güç tüketimine göre daha önemli olduğu sistemler için ayarlanmıştır."
+
+#~ msgid ""
+#~ "This defines how often that an icmp probe will be sent in seconds. "
+#~ "Default is 1."
+#~ msgstr ""
+#~ "Bu ayar ICMP sorgusunun ne sıklıkta göndermesini saniye cinsinden "
+#~ "belirler. Varsayılan 1 dir."
+
+#~ msgid ""
+#~ "This defines the number of bad probes before the alarm will fire. Default "
+#~ "is 10."
+#~ msgstr ""
+#~ "Kötü sonda sayısının (bad probes) alarmının tetiklenmesi için saniye "
+#~ "cinsinden geçmesi gereken süreyi tanımlar. Varsayılan 10 dur."
+
+#~ msgid "Current state count"
+#~ msgstr "Güncel durum sayımı"
+
+#~ msgid "Matching filter"
+#~ msgstr "Uyuşan filitre"
+
+#~ msgid ""
+#~ "The DHCP server can optionally provide a domain search list. Use the "
+#~ "semicolon character as seperator "
+#~ msgstr ""
+#~ "DHCP sunucu isteğe bağlı olarak bir alan adı arama listesi de verebilir. "
+#~ "Ayırıcı olarak noktalı virgül karakterini kullanın "
+
+#~ msgid ""
+#~ "By default DHCP leases are displayed in UTC time. By checking this \n"
+#~ "\t\t\t\t\t\tbox DHCP lease time will be displayed in local time and set "
+#~ "to time zone selected. This will be used for all DHCP interfaces lease "
+#~ "time."
+#~ msgstr ""
+#~ "Varsayılan olarak DHCP kiraları UTC saati olarak görüntülenir. Bu "
+#~ "kutucuğu \n"
+#~ "\t\t\t\t\t\ttıkklayarak DHCP kira saati yerel saat olarak görüntülenir ve "
+#~ "seçilen zaman dilimine ayarlanır. Bu tüm DHCP arabirimleri kira "
+#~ "saatlerinde kullanılır."
+
+#~ msgid ""
+#~ "A valid local port must be specified. It must be a port alias or integer "
+#~ "between 1 and 65535."
+#~ msgstr ""
+#~ "Geçerli bir gerel port belirtilmelidir. Bir port grubu ya da 1 ile 65535 "
+#~ "arası bir tamsayı olmalıdır."
+
+#~ msgid "You can only have one interface configured as %s or 6to4."
+#~ msgstr "Yapılandırabileceğiniz arabirim sadece bir tane %s yada 6 dan 4'e."
+
+#~ msgid "You can only have one interface configured as %s or 6rd."
+#~ msgstr "Yapılandırabileceğiniz arabirim sadece bir tane %s yada 6'ıncı."
+
+#~ msgid "You specified an IPv6 prefix ID that is out of range."
+#~ msgstr "Belirttiğiniz IPv6 ön-eki kimliği aralık dışında."
+
+#~ msgid "6RD Rapid Deployment"
+#~ msgstr "6'ıncı Hızlı Dağıtım"
+
+#~ msgid ""
+#~ "Enter a <b>hexadecimal</b> value between %x and %x here, or leave blank."
+#~ msgstr ""
+#~ "Buraya <b>onaltılık</b>ondalık bir değer aralığında %x ve %x buraya "
+#~ "girin, yada boş bırakın."
+
+#~ msgid "prefix delegation size"
+#~ msgstr "ön-ek yetkilendirme boyutu"
+
+#~ msgid ""
+#~ "The DHCP server can optionally provide a domain search list. Use the "
+#~ "semicolon character as seperator"
+#~ msgstr ""
+#~ "DHCP sunucu isteğe bağlı olarak bir alan adı arama listesi de verebilir. "
+#~ "Ayırıcı olarak noktalı virgül karakterini kullanın"
+
+#~ msgid ""
+#~ "Displaying rule descriptions for all lines in the log might affect "
+#~ "performance with large rulessets."
+#~ msgstr ""
+#~ "Tüm satırlardaki büyük kural ayarlarını ve kural kayıtlarını görüntülemek "
+#~ "performansı etkileyebilir."
+
+#~ msgid ""
+#~ "Additional webConfigurator groups can be added here. \n"
+#~ "\t\t\t\t\t\t\t\t\tGroup permissions can be assigned which are inherited "
+#~ "by users who are members of the group.\n"
+#~ "\t\t\t\t\t\t\t\t\tAn icon that appears grey indicates that it is a system "
+#~ "defined object.\n"
+#~ "\t\t\t\t\t\t\t\t\tSome system object properties can be modified but they "
+#~ "cannot be deleted."
+#~ msgstr ""
+#~ "Buradan ek webArayüzü grupları eklenebilir. \n"
+#~ "\t\t\t\t\t\t\t\tGrup üyeleri tarafından miras alınan grup izinleri "
+#~ "atanabilir.\n"
+#~ "\t\t\t\t\t\t\t\tGri bir simge nesnenin sistem tanımlı olduğu anlamına "
+#~ "gelir.\n"
+#~ "\t\t\t\t\t\t\t\tBazı sistem nesnesi özellikleri değiştirilebilir ama "
+#~ "silinemez."
+
+#~ msgid ""
+#~ "The RA server can optionally provide a domain search list. Use the "
+#~ "semicolon character as seperator"
+#~ msgstr ""
+#~ "Yönlendirici ilan (RA Router Advertisement) sunucusu isteğe bağlı olarak "
+#~ "bir etki alanı arama listesini sağlar. Ayırıcı olarak noktalı virgül "
+#~ "işaretini kullanın"
+
+#~ msgid ""
+#~ "Please select a gateway, normaly the interface selected gateway, so the "
+#~ "limiters work correctly"
+#~ msgstr ""
+#~ "Ağ geçidini seçiniz, normalde arabirim ağ geçidi seçilidir, böylece "
+#~ "limitleyiciler düzgün çalışır"
+
+#~ msgid "The frequency probe interval needs to be a numeric value."
+#~ msgstr "Sorgu Sıklığı aralığının sayısal bir değer olması gerekir."
+
+#~ msgid "The frequency probe interval needs to be positive."
+#~ msgstr "Sorgu Sıklığı aralığının pozitif olması gerekir."
+
+#~ msgid ""
+#~ "The Frequency Probe interval needs to be less than the down time setting."
+#~ msgstr ""
+#~ "Sorgu Sıklığı aralığının erişilemez zaman ayarlarından daha az olması "
+#~ "gerelir."
+
+#~ msgid ""
+#~ "NOTE: The Frequency Probe interval must be less than the Down time, "
+#~ "otherwise the gateway will seem to go down then come up again at the next "
+#~ "probe."
+#~ msgstr ""
+#~ "NOT: Sorgu Sıklığı aralığı erişilemez zamandan daha az olması şarttır, "
+#~ "aksi taktirde ağ geçidi kapalı gibi gördüğü için tekrar açılması yeni "
+#~ "sorguda gerçekleşir."
+
+#~ msgid "IPv4 Remote Network"
+#~ msgstr "IPv4 Uzak Ağ"
+
+#~ msgid ""
+#~ "This is a network that will be routed through the tunnel, so that a site-"
+#~ "to-site VPN can be established without manually changing the routing "
+#~ "tables. Expressed as a CIDR range. If this is a site-to-site VPN, enter "
+#~ "the remote LAN here. You may leave this blank if you don't want a site-to-"
+#~ "site VPN"
+#~ msgstr ""
+#~ "Yönlendirme tablolarında elle değişiklik yapmadan alanlar arası sanal "
+#~ "özel ağ (site-to-site VPN) kurulabilmesi için Tünel içinden "
+#~ "yönlendirilecek bir ağdır. CIDR aralığı şeklinde girilir. Eğer bu alanlar "
+#~ "arası bir VPN ise buraya uzak LAN'ı giriniz. Eğer alanlar arası VPN "
+#~ "istemiyorsanız burayı boş bırakabilirsiniz"
+
+#~ msgid "IPv6 Remote Network"
+#~ msgstr "IPv6 Uzak Ağ"
+
+#~ msgid ""
+#~ "This is an IPv6 network that will be routed through the tunnel, so that a "
+#~ "site-to-site VPN can be established without manually changing the routing "
+#~ "tables. Expressed as an IP/PREFIX. If this is a site-to-site VPN, enter "
+#~ "the remote LAN here. You may leave this blank if you don't want a site-to-"
+#~ "site VPN"
+#~ msgstr ""
+#~ "Yönlendirme tablolarında elle değişiklik yapmadan alanlar arası sanal "
+#~ "özel IPv6 ağı (site-to-site VPN) kurulabilmesi için Tünel içinden "
+#~ "yönlendirilecek bir ağdır. IP/PREFIX olarak ifade edilir. Eğer bu alanlar "
+#~ "arası bir VPN ise buraya uzak LAN'ı giriniz. Eğer alanlar arası VPN "
+#~ "istemiyorsanız burayı boş bırakabilirsiniz"
+
+#~ msgid "The GPS must provide NMEA format output!"
+#~ msgstr "GPS NMEA formatında çıkış sağlamalıdır!"
+
+#~ msgid ""
+#~ "All serial ports are listed, be sure to pick only the port with the GPS "
+#~ "attached."
+#~ msgstr ""
+#~ "Tüm seri portlar listelendi, GPS'in bir porta bağlı olduğundan emin "
+#~ "olunuz."
+
+#~ msgid "It is best to configure at least 2 servers under"
+#~ msgstr "En az 2 sunucular altında yapılandırmak en iyisidir"
+
+#~ msgid "System > General"
+#~ msgstr "Sistem > Genel"
+
+#~ msgid "Urls"
+#~ msgstr "Urller"
+
+#~ msgid "A valid nat local network bit count must be specified."
+#~ msgstr "Geçerli bir nat yerel ağ bit sayısı belirtilmelidir."
+
+#~ msgid "A valid nat local network IP address must be specified."
+#~ msgstr "Geçerli bir nat yerel IP adresi belirtilmelidir."
+
+#~ msgid ""
+#~ "This is a network that will be routed through the tunnel, so that a site-"
+#~ "to-site VPN can be established without manually changing the routing "
+#~ "tables. Expressed as a CIDR range. If this is a site-to-site VPN, enter "
+#~ "the remote LAN here. You may leave this blank to only communicate with "
+#~ "other clients"
+#~ msgstr ""
+#~ "Yönlendirme tablolarını elle değiştirmeden alanlar arası sanal özel ağ "
+#~ "(site-to-site VPN) kurulabilmesi için tünel içinden yönlendirilecek "
+#~ "ağdır. CIDR aralığı olarak belirtilir. Eğer bu siteler arası VPN ise "
+#~ "buraya uzak LAN girilir. Sadece diğer istemcilerle iletişim kurmak için "
+#~ "burayı boş bırakabilirsiniz"
+
+#~ msgid ""
+#~ "This is an IPv6 network that will be routed through the tunnel, so that a "
+#~ "site-to-site VPN can be established without manually changing the routing "
+#~ "tables. Expressed as an IP/PREFIX. If this is a site-to-site VPN, enter "
+#~ "the remote LAN here. You may leave this blank to only communicate with "
+#~ "other clients"
+#~ msgstr ""
+#~ "Yönlendirme tablolarında elle değişiklik yapmadan alanlar arası sanal "
+#~ "özel IPv6 ağı (site-to-site VPN) kurulabilmesi için Tünel içinden "
+#~ "yönlendirilecek bir ağdır. IP/PREFIX olarak tanımlanır. Eğer bu alanlar "
+#~ "arası bir VPN ise buraya uzak LAN'ı giriniz. Eğer alanlar arası VPN "
+#~ "istemiyorsanız burayı boş bırakabilirsiniz"
+
+#~ msgid "The /31 and /32 subnet mask are invalid for CARP IPs."
+#~ msgstr "/31 ve /32 altağ maskesi CARP IPleri için geçersiz."
+
+#~ msgid "The /127 and /128 subnet mask are invalid for CARP IPs."
+#~ msgstr "/127 ve /128 altağ maskesi CARP IPleri için geçersiz."
+
+#~ msgid "Standard Kernel"
+#~ msgstr "Standart Çekirdek"
+
+#~ msgid "Embedded Kernel"
+#~ msgstr "Gömülü Çekirdek"
+
+#~ msgid "Invalid VLAN interface."
+#~ msgstr "Geçersiz VLAN arabirimi."
+
+#~ msgid "Create an ARP Table Static Entry for this MAC & IP Address pair. "
+#~ msgstr ""
+#~ "Bu MAC & IP adresi çifti için bir ARP tablo statik girdisi oluşturur."
+
+#~ msgid "Invalid bridge interface."
+#~ msgstr "Geçersiz köprü arabirimi."
+
+#~ msgid "1992-2012 The FreeBSD Project. All rights reserved"
+#~ msgstr "1992-2012 FreeBSD Projesi. Tüm hakları saklıdır"
+
+#~ msgid "1999-2010 The PHP Group. All rights reserved."
+#~ msgstr "1999-2010 PHP Grubu. Tüm hakları saklıdır."
+
+#~ msgid "Prot"
+#~ msgstr "Prot"
+
+#~ msgid ""
+#~ "A valid nat local network IPv4 address must be specified or you need to "
+#~ "change Mode to IPv6"
+#~ msgstr ""
+#~ "Geçerli bir nat yerel IPv4 ağ adresi belirtilmeli yada Kipi IPv6'ya "
+#~ "değiştirmelisiniz"
+
+#~ msgid ""
+#~ "A valid nat local network IPv6 address must be specified or you need to "
+#~ "change Mode to IPv4"
+#~ msgstr ""
+#~ "Geçerli bir nat yerel IPv6 ağ adresi belirtilmeli yada Kipi IPv4'e "
+#~ "değiştirmelisiniz"
+
+#~ msgid "Mobile IPsec only supports Tunnel mode."
+#~ msgstr "Mobil IPSec yalnızca tünel modu destekler."
+
+#~ msgid "Phase 1 is using IPv4. You cannot use Tunnel IPv6 on Phase 2."
+#~ msgstr ""
+#~ "1. aşamada IPv4 kullanılmaktadır, 2. aşamada IPv6 tüneli kullanamazsınız."
+
+#~ msgid "Phase 1 is using IPv6. You cannot use Tunnel IPv4 on Phase 2."
+#~ msgstr ""
+#~ "1. aşamada IPv6 kullanılmaktadır, 2. aşamada IPv4 tüneli kullanamazsınız."
+
+#~ msgid ""
+#~ "Removing SPDs from tunnel gw '%1$s'. Local Subnet '%2$s' and Remote "
+#~ "Subnet '%3$s'. Reloading policy"
+#~ msgstr ""
+#~ "SPD(ler) ağ geçidi tünelinden siliniyor '%1$s'. Yerel Altağ '%2$s' ve "
+#~ "Uzak Altağ '%3$s'. ilkeler tekrar yükleniyor"
+
+#~ msgid "Disabling auto login was not possible."
+#~ msgstr "Otomatik giriş mümkün olmadığı için devre dışı bırakıldı."
+
+#~ msgid "Enabled console auto login, console menu is NOT password protected."
+#~ msgstr ""
+#~ "Konsola otomatik giriş açık, konsol menüsüne giriş şifre ile "
+#~ "korunmamaktadır."
+
+#~ msgid "Disabled console auto login, console menu is password protected."
+#~ msgstr ""
+#~ "Konsola otomatik giriş kapalı, konsol menüsüne giriş şifre ile "
+#~ "korunmaktadır."
+
+# 88%
+#~ msgid "Filter expresion"
+#~ msgstr "Filtreleme ifadesi"
+
+#~ msgid ""
+#~ "The alias (%s) has one or more FQDNs configured and cannot be used to "
+#~ "configure a static route."
+#~ msgstr ""
+#~ "Bu grup (%s) artık FQDNler yapılandırmasında yok ve statik yönlendirmede "
+#~ "kullanılmaz."
+
+#~ msgid ""
+#~ "The firewall rule configuration has been changed.<br/>You must apply the "
+#~ "changes in order for them to take effect."
+#~ msgstr ""
+#~ "Güvenlik duvarı kuralları değiştirildi.<br/>Değişiklikleri uygulayarak "
+#~ "etkin hale gelmelerini sağlayabilirsiniz."
+
+#~ msgid "This alias is used on a static route and cannot contain FQDNs."
+#~ msgstr "Bu grup statik yönlendirmede kullanıldı ve FQDNler içermez."
+
+#~ msgid "MTU of a vlan should not be bigger than parent interface."
+#~ msgstr "Vlan için MTU üst (parent) arabirimden büyük olmamalıdır."
+
+#~ msgid "Interface %s (VLAN) has MTU set to a bigger value"
+#~ msgstr "Arabirim %s (VLAN) MTU değerinden daha büyük değer belirtildi"
+
+#~ msgid ""
+#~ "Ignoring IPsec racoon daemon reload since there are no tunnels on "
+#~ "interface %s"
+#~ msgstr ""
+#~ "Arabirim %s de tünel olmadığından IPsec rakun (racoon) servisi yeniden "
+#~ "yükleme işlemi göz ardı edildi"
+
+#~ msgid ""
+#~ "Enter a <b>hexadecimal</b> value between %x and %x here, default value is "
+#~ "0."
+#~ msgstr ""
+#~ "%x ve %x değeri arasında <b>onaltılı sayı dizgesi</b> girin, varsayılan "
+#~ "değer 0."
diff --git a/src/usr/local/share/mobile-broadband-provider-info/iso_3166-1_list_en.xml b/src/usr/local/share/mobile-broadband-provider-info/iso_3166-1_list_en.xml
new file mode 100755
index 0000000..44c5a62
--- /dev/null
+++ b/src/usr/local/share/mobile-broadband-provider-info/iso_3166-1_list_en.xml
@@ -0,0 +1,987 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
+<ISO_3166-1_List_en xml:lang="en">
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>AFGHANISTAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AF</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LAND ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AX</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ALBANIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AL</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ALGERIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>DZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>AMERICAN SAMOA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AS</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ANDORRA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AD</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ANGOLA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ANGUILLA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ANTARCTICA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AQ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ANTIGUA AND BARBUDA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ARGENTINA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ARMENIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ARUBA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AW</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>AUSTRALIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AU</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>AUSTRIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>AZERBAIJAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BAHAMAS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BS</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BAHRAIN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BH</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BANGLADESH</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BD</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BARBADOS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BB</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BELARUS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BY</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BELGIUM</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BELIZE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BENIN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BJ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BERMUDA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BHUTAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BOLIVIA, PLURINATIONAL STATE OF</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BOSNIA AND HERZEGOVINA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BOTSWANA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BW</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BOUVET ISLAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BV</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BRAZIL</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BRITISH INDIAN OCEAN TERRITORY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>IO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BRUNEI DARUSSALAM</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BULGARIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BURKINA FASO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BF</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>BURUNDI</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CAMBODIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KH</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CAMEROON</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CANADA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CAPE VERDE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CV</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CAYMAN ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KY</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CENTRAL AFRICAN REPUBLIC</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CF</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CHAD</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TD</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CHILE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CL</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CHINA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CHRISTMAS ISLAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CX</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>COCOS (KEELING) ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CC</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>COLOMBIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>COMOROS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CONGO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CONGO, THE DEMOCRATIC REPUBLIC OF THE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CD</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>COOK ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CK</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>COSTA RICA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CTE D'IVOIRE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CROATIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>HR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CUBA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CU</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CYPRUS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CY</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>CZECH REPUBLIC</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>DENMARK</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>DK</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>DJIBOUTI</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>DJ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>DOMINICA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>DM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>DOMINICAN REPUBLIC</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>DO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ECUADOR</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>EC</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>EGYPT</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>EG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>EL SALVADOR</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SV</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>EQUATORIAL GUINEA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GQ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ERITREA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ER</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ESTONIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>EE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ETHIOPIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ET</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>FALKLAND ISLANDS (MALVINAS)</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>FK</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>FAROE ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>FO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>FIJI</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>FJ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>FINLAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>FI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>FRANCE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>FR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>FRENCH GUIANA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GF</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>FRENCH POLYNESIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PF</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>FRENCH SOUTHERN TERRITORIES</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TF</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GABON</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GAMBIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GEORGIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GERMANY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>DE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GHANA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GH</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GIBRALTAR</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GREECE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GREENLAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GL</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GRENADA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GD</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GUADELOUPE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GP</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GUAM</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GU</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GUATEMALA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GUERNSEY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GUINEA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GUINEA-BISSAU</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GW</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>GUYANA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GY</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>HAITI</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>HT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>HEARD ISLAND AND MCDONALD ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>HM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>HOLY SEE (VATICAN CITY STATE)</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>VA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>HONDURAS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>HN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>HONG KONG</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>HK</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>HUNGARY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>HU</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ICELAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>IS</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>INDIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>IN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>INDONESIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ID</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>IRAN, ISLAMIC REPUBLIC OF</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>IR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>IRAQ</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>IQ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>IRELAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>IE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ISLE OF MAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>IM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ISRAEL</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>IL</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ITALY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>IT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>JAMAICA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>JM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>JAPAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>JP</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>JERSEY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>JE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>JORDAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>JO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>KAZAKHSTAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>KENYA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>KIRIBATI</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KP</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>KOREA, REPUBLIC OF</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>KUWAIT</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KW</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>KYRGYZSTAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LAO PEOPLE'S DEMOCRATIC REPUBLIC</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LATVIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LV</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LEBANON</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LB</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LESOTHO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LS</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LIBERIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LIBYAN ARAB JAMAHIRIYA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LY</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LIECHTENSTEIN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LITHUANIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>LUXEMBOURG</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LU</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MACAO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MK</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MADAGASCAR</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MALAWI</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MW</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MALAYSIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MY</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MALDIVES</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MV</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MALI</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ML</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MALTA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MARSHALL ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MH</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MARTINIQUE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MQ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MAURITANIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MAURITIUS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MU</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MAYOTTE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>YT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MEXICO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MX</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MICRONESIA, FEDERATED STATES OF</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>FM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MOLDOVA, REPUBLIC OF</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MD</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MONACO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MC</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MONGOLIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MONTENEGRO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ME</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MONTSERRAT</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MS</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MOROCCO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MOZAMBIQUE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>MYANMAR</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NAMIBIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NAURU</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NEPAL</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NP</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NETHERLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NL</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NETHERLANDS ANTILLES</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NEW CALEDONIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NC</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NEW ZEALAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NICARAGUA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NIGER</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NIGERIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NIUE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NU</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NORFOLK ISLAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NF</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NORTHERN MARIANA ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MP</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>NORWAY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>NO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>OMAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>OM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PAKISTAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PK</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PALAU</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PW</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PALESTINIAN TERRITORY, OCCUPIED</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PS</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PANAMA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PAPUA NEW GUINEA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PARAGUAY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PY</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PERU</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PHILIPPINES</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PH</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PITCAIRN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>POLAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PL</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PORTUGAL</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>PUERTO RICO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>QATAR</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>QA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>REUNION</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>RE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ROMANIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>RO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>RUSSIAN FEDERATION</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>RU</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>RWANDA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>RW</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAINT BARTHLEMY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>BL</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SH</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAINT KITTS AND NEVIS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>KN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAINT LUCIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LC</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAINT MARTIN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>MF</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAINT PIERRE AND MIQUELON</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>PM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAINT VINCENT AND THE GRENADINES</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>VC</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAMOA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>WS</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAN MARINO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAO TOME AND PRINCIPE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ST</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SAUDI ARABIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SENEGAL</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SERBIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>RS</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SEYCHELLES</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SC</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SIERRA LEONE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SL</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SINGAPORE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SLOVAKIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SK</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SLOVENIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SOLOMON ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SB</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SOMALIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SOUTH AFRICA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ZA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GS</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SPAIN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ES</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SRI LANKA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>LK</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SUDAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SD</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SURINAME</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SVALBARD AND JAN MAYEN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SJ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SWAZILAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SWEDEN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SWITZERLAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>CH</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>SYRIAN ARAB REPUBLIC</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>SY</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TAIWAN, PROVINCE OF CHINA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TW</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TAJIKISTAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TJ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TANZANIA, UNITED REPUBLIC OF</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>THAILAND</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TH</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TIMOR-LESTE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TL</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TOGO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TOKELAU</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TK</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TONGA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TO</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TRINIDAD AND TOBAGO</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TT</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TUNISIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TURKEY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TR</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TURKMENISTAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TURKS AND CAICOS ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TC</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>TUVALU</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>TV</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>UGANDA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>UG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>UKRAINE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>UA</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>UNITED ARAB EMIRATES</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>AE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>UNITED KINGDOM</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>GB</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>UNITED STATES</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>US</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>UNITED STATES MINOR OUTLYING ISLANDS</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>UM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>URUGUAY</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>UY</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>UZBEKISTAN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>UZ</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>VANUATU</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>VU</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>VENEZUELA, BOLIVARIAN REPUBLIC OF</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>VE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>VIET NAM</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>VN</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>VIRGIN ISLANDS, BRITISH</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>VG</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>VIRGIN ISLANDS, U.S.</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>VI</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>WALLIS AND FUTUNA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>WF</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>WESTERN SAHARA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>EH</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>YEMEN</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>YE</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ZAMBIA</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ZM</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+ <ISO_3166-1_Entry>
+ <ISO_3166-1_Country_name>ZIMBABWE</ISO_3166-1_Country_name>
+ <ISO_3166-1_Alpha-2_Code_element>ZW</ISO_3166-1_Alpha-2_Code_element>
+ </ISO_3166-1_Entry>
+</ISO_3166-1_List_en>
diff --git a/src/usr/local/share/mobile-broadband-provider-info/serviceproviders.xml b/src/usr/local/share/mobile-broadband-provider-info/serviceproviders.xml
new file mode 100644
index 0000000..a109fa4
--- /dev/null
+++ b/src/usr/local/share/mobile-broadband-provider-info/serviceproviders.xml
@@ -0,0 +1,13576 @@
+<?xml version="1.0" encoding='utf-8'?>
+<!-- -*- Mode: XML; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- -->
+<!DOCTYPE serviceproviders SYSTEM "serviceproviders.2.dtd">
+
+<!-- Authors:
+ 2008 Antti Kaijanmäki <antti@kaijanmaki.net>
+ 2009 Dan Williams <dcbw@redhat.com>
+ 2011 Antti Kaijanmäki <antti@canonical.com>
+-->
+
+<!-- THIS WORK IS IN PUBLIC DOMAIN:
+The person or persons who have associated work with this document
+(the "Dedicator" or "Certifier") hereby either (a) certifies that, to the best
+of his knowledge, the work of authorship identified is in the public domain of
+the country from which the work is published, or (b) hereby dedicates whatever
+copyright the dedicators holds in the work of authorship identified below
+(the "Work") to the public domain. A certifier, moreover, dedicates any
+copyright interest he may have in the associated work, and for these purposes,
+is described as a "dedicator" below.
+
+A certifier has taken reasonable steps to verify the copyright status of this
+work. Certifier recognizes that his good faith efforts may not shield him from
+liability if in fact the work certified is not in the public domain.
+
+Dedicator makes this dedication for the benefit of the public at large and to
+the detriment of the Dedicator's heirs and successors. Dedicator intends this
+dedication to be an overt act of relinquishment in perpetuity of all present
+and future rights under copyright law, whether vested or contingent, in the
+Work. Dedicator understands that such relinquishment of all rights includes the
+relinquishment of all rights to enforce (by lawsuit or otherwise) those
+copyrights in the Work.
+
+Dedicator recognizes that, once placed in the public domain, the Work may be
+freely reproduced, distributed, transmitted, used, modified, built upon, or
+otherwise exploited by anyone for any purpose, commercial or non-commercial,
+and in any way, including by methods that have not yet been invented or
+conceived.
+-->
+
+<serviceproviders format="2.0">
+
+<!-- United Arab Emirates -->
+<country code="ae">
+ <provider>
+ <name>Etisalat</name>
+ <gsm>
+ <network-id mcc="424" mnc="02"/>
+ <apn value="mnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Etisalat</name>
+ <username>mnet</username>
+ <password>mnet</password>
+ <dns>194.170.1.6</dns>
+ <dns>194.170.1.7</dns>
+ </apn>
+ <apn value="etisalat.ae">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Etisalat 3G</name>
+ <username>etisalat.ae</username>
+ <password>etisalat.ae</password>
+ </apn>
+ <apn value="etisalat">
+ <usage type="mms"/>
+ <name>etisalat MMS</name>
+ <mmsc>http://10.99.52.150/servlets/mms</mmsc>
+ <mmsproxy>10.12.0.30:8080</mmsproxy>
+ </apn>
+ <apn value="etisalat">
+ <usage type="mms"/>
+ <name>etisalat MMS</name>
+ <mmsc>http://mms/servlets/mms</mmsc>
+ <mmsproxy>10.12.0.32:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>du</name>
+ <gsm>
+ <network-id mcc="424" mnc="03"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="du">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="du">
+ <usage type="mms"/>
+ <name>du MMS</name>
+ <mmsc>http://mms.du.ae</mmsc>
+ <mmsproxy>10.19.18.4:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Afghanistan -->
+<country code="af">
+ <provider>
+ <name>AWCC</name>
+ <gsm>
+ <network-id mcc="412" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>awcc</username>
+ <password>1111</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Albania -->
+<country code="al">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="276" mnc="02"/>
+ <apn value="Twa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>TWA</name>
+ </apn>
+ <apn value="vodafoneweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone Web</name>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Vodafone MMS</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <mmsc>http://217.31.233.18:6001/MM1Servlet</mmsc>
+ <mmsproxy>217.31.233.18:9401</mmsproxy>
+ </apn>
+ <apn value="portalnmms">
+ <usage type="mms"/>
+ <name>Vodafone MMS</name>
+ <mmsc>http://mms1.live.vodafone.in/mms/</mmsc>
+ <mmsproxy>10.10.1.100:9401</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Armenia -->
+<country code="am">
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="283" mnc="01"/>
+ <apn value="internet.beeline.am">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ <apn value="mms.beeline.ua">
+ <usage type="mms"/>
+ <name>Beeline MMS</name>
+ <mmsc>http://mms/</mmsc>
+ <mmsproxy>10.11.8.18:8080</mmsproxy>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Beeline MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>10.16.70.199:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="283" mnc="10"/>
+ <apn value="internet.orange">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Hima (USB)</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <mmsc>http://mms.orange.nl:8002</mmsc>
+ <mmsproxy>10.250.255.183:5080</mmsproxy>
+ </apn>
+ <apn value="orangemms">
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <username>orange</username>
+ <password>orange</password>
+ <mmsc>http://mms.orange.es</mmsc>
+ <mmsproxy>wapmms.orange.es:8080</mmsproxy>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <mmsc>http://192.168.151.3:8002</mmsc>
+ <mmsproxy>192.168.151.2:8080</mmsproxy>
+ </apn>
+ <apn value="orange.mms">
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mmsc.orange.at/mms/wapenc</mmsc>
+ <mmsproxy>194.24.128.118:8080</mmsproxy>
+ </apn>
+ <apn value="orangemms">
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <mmsc>http://mms.orange.co.uk/</mmsc>
+ <mmsproxy>192.168.224.10:8080</mmsproxy>
+ </apn>
+ <apn value="mms.orange.dk">
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <mmsc>http://mms.orange.dk:8002</mmsc>
+ <mmsproxy>172.18.251.11:8080</mmsproxy>
+ </apn>
+ <apn value="mms.orange.md">
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <mmsc>http://mms/mms</mmsc>
+ <mmsproxy>192.168.127.125:3128</mmsproxy>
+ </apn>
+ <apn value="mms.orange.jo">
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <username>mmc</username>
+ <password>mmc</password>
+ <mmsc>http://172.16.1.96/servlets/mms</mmsc>
+ <mmsproxy>172.16.1.2:8080</mmsproxy>
+ </apn>
+ <apn value="orangerun.acte">
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <mmsc>http://mms.orange.re</mmsc>
+ <mmsproxy>192.168.10.200:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>VivaCell/MTS</name>
+ <gsm>
+ <network-id mcc="283" mnc="05"/>
+ <apn value="connect.vivacell.am">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>MTS connect</name>
+ </apn>
+ <apn value="inet.vivacell.am">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Karabakh Telecom</name>
+ <gsm>
+ <network-id mcc="283" mnc="04"/>
+ <balance-check>
+ <ussd>*122#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*123*CODE#</ussd>
+ </balance-top-up>
+ <apn value="connect.kt.am">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>KT_MARK</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+
+<!-- Angola -->
+<country code="ao">
+ <provider>
+ <name>Movinet</name>
+ <cdma>
+ <username>uname</username>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Unitel</name>
+ <gsm>
+ <network-id mcc="631" mnc="02"/>
+ <apn value="internet.unitel.co.ao">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="unitel">
+ <usage type="mms"/>
+ <name>unitel mms</name>
+ <mmsc>http//mms.unitel.com</mmsc>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Argentina -->
+<country code="ar">
+ <provider>
+ <name>Personal</name>
+ <gsm>
+ <network-id mcc="722" mnc="341"/>
+ <network-id mcc="722" mnc="34"/>
+ <apn value="gprs.personal.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>gprs</username>
+ <password>adgj</password>
+ <dns>172.25.7.6</dns>
+ <dns>172.25.7.7</dns>
+ </apn>
+ <apn value="datos.personal.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>DATOS</name>
+ <username>datos</username>
+ <password>datos</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Arnet</name>
+ <gsm>
+ <network-id mcc="722" mnc="340"/>
+ <apn value="arnet.personal.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>172.25.7.6</dns>
+ <dns>172.25.7.7</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Personal MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms.personal.com/</mmsc>
+ <mmsproxy>172.25.7.31:8080</mmsproxy>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>MMS Personal</name>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>172.16.192.7:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="722" mnc="310"/>
+ <network-id mcc="722" mnc="320"/>
+ <network-id mcc="722" mnc="330"/>
+ <apn value="gprs.claro.com.ar">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G Internet</name>
+ <username>clarogprs</username>
+ <password>clarogprs999</password>
+ <dns>170.51.255.100</dns>
+ <dns>170.51.242.18</dns>
+ </apn>
+ <apn value="internet.ctimovil.com.ar">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>clarogprs</username>
+ <password>clarogprs999</password>
+ </apn>
+ <apn value="mms.claro.com.br">
+ <usage type="mms"/>
+ <name>Claro Foto</name>
+ <username>claro</username>
+ <password>claro</password>
+ <mmsc>http://mms.claro.com.br/</mmsc>
+ <mmsproxy>200.169.126.10:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="722" mnc="010"/>
+ <network-id mcc="722" mnc="070"/>
+ <apn value="internet.gprs.unifon.com.ar">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WAP</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="internet.gprs.unifon.com.ar">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>Internet</username>
+ <password>Internet</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Austria -->
+<country code="at">
+ <provider>
+ <name>A1/Telekom Austria</name>
+ <gsm>
+ <!-- Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 -->
+ <network-id mcc="232" mnc="01"/>
+ <apn value="a1.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>A1 Breitband</name>
+ <username>ppp@a1plus.at</username>
+ <password>ppp</password>
+ <dns>194.48.124.202</dns>
+ <dns>194.48.124.200</dns>
+ </apn>
+ <!-- https://www.aon.at/export/sites/default/residential/pdf/produktfolder/aonFlex_Mobiltelefon.pdf-->
+ <apn value="aon.data">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>aon (Flex, Breitband-Duo, BusinessFlex)</name>
+ <username>mobile@aon.at</username>
+ <password>ppp</password>
+ </apn>
+ <!-- http://konfigurator.aon.at/otauseraon/templates/user/aon/manuals/AON_Installation.pdf -->
+ <apn value="aon.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>aonMobile</name>
+ <username>mobile@aon.at</username>
+ <password>ppp</password>
+ </apn>
+ <apn value="free.A1.net">
+ <usage type="mms"/>
+ <name>A1MMS</name>
+ <username>ppp@A1plus.at</username>
+ <password>ppp</password>
+ <mmsc>http://mmsc.A1.net</mmsc>
+ <mmsproxy>gateway.A1.net:8001</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ABroadband</name>
+ <gsm>
+ <network-id mcc="232" mnc="01"/>
+ <apn value="mdata.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>International Roaming</name>
+ <username>mdata@mdata.com</username>
+ <password>ppp</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bob</name>
+ <gsm>
+ <network-id mcc="232" mnc="11"/>
+ <apn value="bob.at">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>data@bob.at</username>
+ <password>ppp</password>
+ </apn>
+ <apn value="bob.at">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>ppp@bob.at</username>
+ <password>ppp</password>
+ <dns>194.48.139.254</dns>
+ <dns>194.48.124.200</dns>
+ </apn>
+ <apn value="mms.bob.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>data@bob.at</username>
+ <password>ppp</password>
+ </apn>
+ <apn value="mms.bob.at">
+ <usage type="mms"/>
+ <name>data bob MMS</name>
+ <username>data@bob.at</username>
+ <password>ppp</password>
+ <mmsc>http://mmsc.bob.at</mmsc>
+ <mmsproxy>194.48.124.7:8001</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="232" mnc="03"/>
+ <apn value="gprswap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ </apn>
+ <apn value="gprsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ <dns>213.162.69.169</dns>
+ <dns>213.162.65.1</dns>
+ </apn>
+ <apn value="business.gprsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business Internet</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ </apn>
+ <apn value="general.t-mobile.uk">
+ <usage type="mms"/>
+ <name>T-Mobile MMS</name>
+ <username>user</username>
+ <password>wap</password>
+ <mmsc>http://mmsc.t-mobile.co.uk:8002</mmsc>
+ <mmsproxy>149.254.201.135:8080</mmsproxy>
+ </apn>
+ <apn value="wap.voicestream.com">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>nokia</username>
+ <password>6600</password>
+ <mmsc>http://216.155.174.84/servlets/mms</mmsc>
+ <mmsproxy>216.155.165.50:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>tele.ring</name>
+ <gsm>
+ <network-id mcc="232" mnc="07"/>
+ <balance-check>
+ <ussd>*102#</ussd>
+ </balance-check>
+ <apn value="web">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Ge org:)</name>
+ <username>web@telering.at</username>
+ <password>web</password>
+ <dns>213.162.69.170</dns>
+ <dns>213.162.65.2</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>tele ring mms</name>
+ <username>wap@telering.at</username>
+ <password>wap</password>
+ <mmsc>http://relay.mms.telering.at</mmsc>
+ <mmsproxy>212.95.31.50:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="232" mnc="05"/>
+ <apn value="web.one.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>OneNet Web</name>
+ <username>web</username>
+ <password>web</password>
+ <dns>194.24.128.100</dns>
+ <dns>194.24.128.102</dns>
+ </apn>
+ <apn value="wap.one.at">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Orange WAP</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="mms.one.at">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ <apn value="fullspeed">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web (no filtering)</name>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="orange.web">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Orange Web</name>
+ <username>Orange</username>
+ <password>Orange</password>
+ <dns>81.3.216.100</dns>
+ <dns>194.24.128.100</dns>
+ </apn>
+ <apn value="orange.mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Orange Web</name>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Drei (3)</name>
+ <name xml:lang="de">Drei</name>
+ <gsm>
+ <network-id mcc="232" mnc="10"/>
+ <apn value="drei.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.94.78.17</dns>
+ <dns>213.94.78.16</dns>
+ </apn>
+ <apn value="drei.at">
+ <usage type="mms"/>
+ <name>3MMS</name>
+ <mmsc>http://mmsc</mmsc>
+ <mmsproxy>213.94.78.133:8799</mmsproxy>
+ </apn>
+ <apn value="three.co.uk">
+ <usage type="mms"/>
+ <name>3 MMS</name>
+ <mmsc>http://mms.um.three.co.uk:10021/mmsc</mmsc>
+ <mmsproxy>mms.three.co.uk:8799</mmsproxy>
+ </apn>
+ <apn value="mobile.three.com.hk">
+ <usage type="mms"/>
+ <name>3MMS</name>
+ <mmsc>http://mms.um.three.com.hk:10021/mmsc</mmsc>
+ <mmsproxy>172.20.97.116:8799</mmsproxy>
+ </apn>
+ <apn value="3services">
+ <usage type="mms"/>
+ <name>3 MMS</name>
+ <mmsc>http://mmsc.three.net.au:10021/mmsc</mmsc>
+ <mmsproxy>mmscprox.three.net.au:8799</mmsproxy>
+ </apn>
+ <apn value="3mms">
+ <usage type="mms"/>
+ <name>3mms</name>
+ <username>3mms</username>
+ <password>3mms</password>
+ <mmsc>http://mms.three.co.id</mmsc>
+ <mmsproxy>10.4.0.10:3128</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Yesss</name>
+ <gsm>
+ <network-id mcc="232" mnc="12"/>
+ <apn value="web.yesss.at">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- MVNO operating on T-Mobile's network -->
+ <name>VOLmobil</name>
+ <gsm>
+ <network-id mcc="232" mnc="03"/>
+ <apn value="volmobil">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="gprsmms">
+ <usage type="mms"/>
+ <name>T-Mobile MMS</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ <mmsc>http://mmsc.t-mobile.at/servlets/mms</mmsc>
+ <mmsproxy>10.12.0.20:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Australia -->
+<!-- http://whirlpool.net.au/wiki/mobiles_apn
+ http://ausdroid.net/apns/ -->
+<country code="au">
+ <provider>
+ <name>Amaysim</name>
+ <!-- http://www.amaysim.com.au/help-support/amaysim-mobile-broadband.html/ -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="internet"/>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Optus MMS</name>
+ <mmsc>http://mmsc.optus.com.au:8002/</mmsc>
+ <mmsproxy>61.88.190.10:8070</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Apex Telecom</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beagle</name>
+ <!-- http://www.beagle.com.au/support/faq/wireless.html -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>BLiNK</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns888a1">
+ <name>BLiNK (services after 04/08/09)</name>
+ </apn>
+ <apn value="connect">
+ <name>BLiNK (services prior to 04/08/09)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Crazy John&apos;s</name>
+ <gsm>
+ <network-id mcc="505" mnc="03"/>
+ <network-id mcc="505" mnc="38"/>
+ <apn value="purtona.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Crazy NET</name>
+ <dns>203.21.112.40</dns>
+ <dns>203.21.113.40</dns>
+ </apn>
+ <apn value="purtona.wap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Crazy WAP/MMS</name>
+ </apn>
+ <apn value="purtona.wap">
+ <usage type="mms"/>
+ <name>Crazy MMS</name>
+ <mmsc>http://purtona.mms/mmssend</mmsc>
+ <mmsproxy>10.202.2.20:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Dodo</name>
+ <!-- http://www.dodo.com/top-right-navigation/support/technical-support/wireless-broadband/wireless-broadband-settings/ -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="WirelessBroadband">
+ <name>Postpaid</name>
+ </apn>
+ <apn value="DODOLNS1">
+ <name>Prepaid</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Escape Net</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Exetel</name>
+ <!-- http://www.exetel.com.au/mobile_faq.php -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="exetel1">
+ <name>Exetel (Optus Based HSPA plans)</name>
+ </apn>
+ <apn value="INTERNET">
+ <name>Exetel (Optus Based CAP Plans) not iPhone</name>
+ </apn>
+ <apn value="OPTUSWAP">
+ <name>Exetel (Optus Based CAP Plans) not iPhone</name>
+ </apn>
+ <apn value="YesINTERNET">
+ <name>Exetel (Optus Based CAP Plans) iPhone</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Exetel (Vodafone based)</name>
+ <gsm>
+ <network-id mcc="505" mnc="03"/>
+ <apn value="vfinternet.au">
+ <name>Exetel (Vodafone Based)</name>
+ </apn>
+ </gsm>
+ </provider>
+<!-- Not validated yet
+ <provider>
+ <name>GRL / Red Bull Mobile</name>
+ <gsm>
+ <network-id mcc="505" mnc="03"/>
+ <apn value="purtona.net"/>
+ </gsm>
+ </provider>
+-->
+ <provider>
+ <name>Highway1</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>iiNet</name>
+ <!-- https://iihelp.iinet.net.au/BoB_MBB -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="iinet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Internode</name>
+ <gsm>
+ <!-- http://www.internode.on.net/residential/broadband/3g_wireless/nodemobile_data/faq/#What_is_the_APN -->
+ <network-id mcc="505" mnc="02"/>
+ <apn value="internode">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>NodeMobile Data</name>
+ </apn>
+ <apn value="splns333a1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old NodeMobile Data (before 2009-08-26)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>iPrimus</name>
+ <!-- http://support.iprimus.com.au/index.php?option=com_content&task=view&id=559&Itemid=203 -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="primuslns1"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Optus</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet (handsets)</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="yesinternet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Optus Yes Internet</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="connect">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Wireless Broadband</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="connectcap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Post-Paid Mobile Broadband</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="preconnect">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pre-Paid Mobile Broadband</name>
+ <dns>211.29.132.12</dns>
+ <dns>198.142.0.51</dns>
+ </apn>
+ <apn value="mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Optus MMS</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TPG Mobile</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="yesinternet">
+ <name>TPG (iPhone)</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>TPG (all except iPhone)</name>
+ </apn>
+ <apn value="mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ </apn>
+ </gsm>
+ </provider>
+<!-- not yet validated
+ <provider>
+ <name>Pacnet – Optus</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="pacnet"/>
+ <apn value="internet"/>
+ </gsm>
+ </provider>
+-->
+ <provider>
+ <name>Pennytel</name>
+ <!-- https://www.pennytel.com.au/faqs?f-answer-search=apn&x=0&y=0 -->
+ <gsm>
+ <network-id mcc="505" mnc="03"/>
+ <apn value="live.vodafone.com">
+ <name>Pennytel (Vodafone) live.vodafone.com</name>
+ </apn>
+ <apn value="vfinternet.au">
+ <name>Pennytel (Vodafone) vfinternet.au</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Smelly Black Dog</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="splns357"/>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telstra</name>
+ <gsm>
+ <network-id mcc="505" mnc="01"/>
+ <balance-check>
+ <dtmf>125111</dtmf>
+ <dtmf>1258888</dtmf>
+ <ussd-response>*100#</ussd-response>
+ </balance-check>
+ <apn value="telstra.wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>139.130.4.4</dns>
+ <dns>203.50.2.71</dns>
+ </apn>
+ <apn value="telstra.datapack">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telstra (3G data pack)</name>
+ <password>Telstra</password>
+ <dns>139.130.4.4</dns>
+ <dns>203.50.2.71</dns>
+ </apn>
+ <apn value="telstra.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telstra (Next G)</name>
+ <dns>10.4.85.138</dns>
+ <dns>10.4.176.234</dns>
+ </apn>
+ <apn value="telstra.pcpack">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telstra (3G PC pack - pay by time)</name>
+ <password>Telstra</password>
+ <dns>139.130.4.4</dns>
+ <dns>203.50.2.71</dns>
+ </apn>
+ <apn value="telstra.iph">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Telstra Internet/Wap</name>
+ </apn>
+ <apn value="telstra.mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Telstra MMS</name>
+ </apn>
+ <apn value="telstra.bigpond">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telstra BigPond</name>
+ <!-- username/password per-user -->
+ </apn>
+ <apn value="telstra.mms">
+ <usage type="mms"/>
+ <name>Telstra MMS</name>
+ <mmsc>http://mmsc.telstra.com:8002</mmsc>
+ <mmsproxy>10.1.1.180:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Three</name>
+ <gsm>
+ <network-id mcc="505" mnc="06"/>
+ <apn value="3netaccess">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>a</username>
+ <password>a</password>
+ <dns>202.124.68.130</dns>
+ <dns>202.124.76.66</dns>
+ </apn>
+ <apn value="3services">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Three Prepaid</name>
+ <username>a</username>
+ <password>a</password>
+ <dns>202.124.68.130</dns>
+ <dns>202.124.76.66</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Virgin Mobile</name>
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="VirginInternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ <username>guest</username>
+ <password>guest</password>
+ <dns>61.88.88.88</dns>
+ </apn>
+ <apn value="VirginBroadband">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <!-- http://www.vodafone.com.au/personal/mobile-broadband/modem-setup/index.htm -->
+ <network-id mcc="505" mnc="03"/>
+ <apn value="vfinternet.au">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid and some prepaid phone plans</name>
+ </apn>
+ <!-- username/password included in Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 -->
+ <!-- username/password not on site http://www.vodafone.com.au/personal/mobile-broadband/modem-setup/index.htm -->
+ <apn value="vfprepaymbb">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <!-- username>web</username -->
+ <!-- password>web</password -->
+ <dns>203.21.112.40</dns>
+ <dns>203.21.113.40</dns>
+ </apn>
+ <apn value="live.vodafone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Westnet</name>
+ <!-- http://myhelp.westnet.com.au/pages/releaseview.action?pageId=17073209#FAQs-WestnetMobilePhone-link31 -->
+ <gsm>
+ <network-id mcc="505" mnc="02"/>
+ <apn value="yesinternet">
+ <name>Westnet (iPhone)</name>
+ </apn>
+ <apn value="internet">
+ <name>Westnet (all except iPhone)</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Azerbaijan -->
+<country code="az">
+ <provider>
+ <name>Azercell</name>
+ <gsm>
+ <network-id mcc="400" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Azercell MMS</name>
+ <mmsc>http://mms.azercell.com/cMMSC/post</mmsc>
+ <mmsproxy>10.0.154.101:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bakcell</name>
+ <gsm>
+ <network-id mcc="400" mnc="02"/>
+ <apn value="mms">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Azerfon</name>
+ <gsm>
+ <network-id mcc="400" mnc="04"/>
+ <msisdn-query>
+ <ussd>*100#3#</ussd>
+ </msisdn-query>
+ <apn value="azerfon">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bosnia & Herzegovina -->
+<country code="ba">
+ <provider>
+ <name>BH GSM</name>
+ <gsm>
+ <network-id mcc="218" mnc="90"/>
+ <apn value="mms.bhmobile.ba">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ </apn>
+ <apn value="mms.bhmobile.ba">
+ <usage type="mms"/>
+ <name>BHMobileMMS</name>
+ <mmsc>http://mms.bhmobile.ba/cmmsc/post</mmsc>
+ <mmsproxy>195.222.56.41:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>m:tel</name>
+ <gsm>
+ <network-id mcc="218" mnc="05"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <apn value="mtelgprs1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Package 1</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ <apn value="mtelgprs2">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Package 2</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ <apn value="mtelgprs3">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Package 3</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ <apn value="mtelgprs4">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Package 4</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ <apn value="mtelfun">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <dns>81.93.67.2</dns>
+ <dns>81.93.67.3</dns>
+ </apn>
+ <apn value="mobismms">
+ <usage type="mms"/>
+ <name>mobismms</name>
+ <mmsc>http://mmsc.065mobis.com/mms/wapenc</mmsc>
+ <mmsproxy>192.168.61.11:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>HT-ERONET</name>
+ <gsm>
+ <network-id mcc="218" mnc="03"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <apn value="gprs.eronet.ba">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.eronet.ba">
+ <usage type="mms"/>
+ <name>ERONET MMS</name>
+ <mmsc>http://mms.gprs.eronet.ba/mms/wapenc</mmsc>
+ <mmsproxy>10.12.3.11:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Barbados -->
+<country code="bb">
+ <provider>
+ <name>Digicel</name>
+ <gsm>
+ <network-id mcc="342" mnc="750"/>
+ <apn value="isp.digicelbarbados.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bangladesh -->
+<country code="bd">
+ <provider>
+ <name>Robi (AKTel)</name>
+ <gsm>
+ <network-id mcc="470" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <dns>192.168.23.7</dns>
+ </apn>
+ <apn value="wap">
+ <usage type="mms"/>
+ <name>AKTEL-MMS 2 0</name>
+ <mmsc>http://192.168.23.4/was</mmsc>
+ <mmsproxy>192.168.23.7:9028</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Banglalink</name>
+ <gsm>
+ <network-id mcc="470" mnc="03"/>
+ <apn value="blweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ <dns>10.10.55.34</dns>
+ </apn>
+ <apn value="blmms">
+ <usage type="mms"/>
+ <name>blmms</name>
+ <mmsc>http://mmsc1:10021/mmsc/01</mmsc>
+ <mmsproxy>10.10.55.34:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>GrameenPhone</name>
+ <gsm>
+ <network-id mcc="470" mnc="01"/>
+ <apn value="gpinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.56.4.120</dns>
+ <dns>202.56.4.121</dns>
+ </apn>
+ <apn value="gpmms">
+ <usage type="mms"/>
+ <name>GP MMS</name>
+ <mmsc>http://mms.gpsurf.net/servlets/mms</mmsc>
+ <mmsproxy>10.128.1.2:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Airtel (Warid)</name>
+ <gsm>
+ <network-id mcc="470" mnc="07"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <dns>10.6.0.2</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Airtel MMS</name>
+ <mmsc>http://10.6.0.21/servlets/mms</mmsc>
+ <mmsproxy>10.6.0.2:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- http://www.teletalk.com.bd/cpoint/3G/MMS_Internet_service.php -->
+ <name>Teletalk</name>
+ <gsm>
+ <network-id mcc="470" mnc="04"/>
+ <apn value="wap">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Airtel MMS</name>
+ <mmsc>http://10.5.4.22:38090/was</mmsc>
+ <mmsproxy>10.5.4.40:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Citycell</name>
+ <cdma>
+ <username>waps</username>
+ <password>waps</password>
+ <dns>117.18.224.146</dns>
+ <dns>117.18.224.147</dns>
+ <sid value="13480"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Belgium -->
+<country code="be">
+ <provider>
+ <name>Mobistar</name>
+ <gsm>
+ <network-id mcc="206" mnc="10"/>
+ <voicemail>5555</voicemail>
+ <balance-check>
+ <ussd>#123#</ussd>
+ </balance-check>
+ <apn value="web.pro.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business</name>
+ <username>mobistar</username>
+ <password>mobistar</password>
+ <dns>212.65.63.10</dns>
+ <dns>212.65.63.145</dns>
+ </apn>
+ <apn value="internet.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Personal</name>
+ <username>mobistar</username>
+ <password>mobistar</password>
+ <dns>212.65.63.10</dns>
+ <dns>212.65.63.145</dns>
+ </apn>
+ <apn value="iew.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere</name>
+ <username>mobistar</username>
+ <password>mobistar</password>
+ <dns>212.224.255.252</dns>
+ <dns>212.65.63.217</dns>
+ </apn>
+ <apn value="mworld.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mobistar</username>
+ <password>mobistar</password>
+ <dns>212.65.63.10</dns>
+ <dns>212.65.63.145</dns>
+ </apn>
+ <apn value="mms.be">
+ <usage type="mms"/>
+ <name>Mobistar MMS</name>
+ <mmsc>http://mmsc.mobistar.be</mmsc>
+ <mmsproxy>212.65.63.143:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telenet Mobile</name>
+ <gsm>
+ <network-id mcc="206" mnc="10"/>
+ <apn value="mobile.internet.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old Walk &amp; Surf</name>
+ </apn>
+ <apn value="telenetwap.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Walk &amp; Talk</name>
+ </apn>
+ <apn value="telenetwap.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Walk &amp; Surf</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="206" mnc="10"/>
+ <apn value="orangeinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Proximus</name>
+ <gsm>
+ <network-id mcc="206" mnc="01"/>
+ <voicemail>1230</voicemail>
+ <!-- no balancecheck method ('auto-recharge') -->
+ <apn value="internet.proximus.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Inter</name>
+ <dns>195.238.2.21</dns>
+ <dns>81.169.60.107</dns>
+ </apn>
+ <apn value="intraprox.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Intra</name>
+ <dns>195.238.2.21</dns>
+ <dns>195.238.2.22</dns>
+ </apn>
+ <apn value="event.proximus.be">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mmsc.proximus.be/mms</mmsc>
+ <mmsproxy>10.55.14.75:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Base</name>
+ <gsm>
+ <network-id mcc="206" mnc="20"/>
+ <voicemail>1933</voicemail>
+ <!-- no balancecheck method ('auto-recharge') -->
+ <apn value="gprs.base.be">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>base</username>
+ <password>base</password>
+ <dns>195.130.131.139</dns>
+ <dns>212.53.4.4</dns>
+ </apn>
+ <apn value="mms.base.be">
+ <usage type="mms"/>
+ <name>BASE MMS</name>
+ <username>base</username>
+ <password>base</password>
+ <mmsc>http://mmsc.base.be</mmsc>
+ <mmsproxy>217.72.235.1:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mobile Vikings</name>
+ <gsm>
+ <network-id mcc="206" mnc="20"/>
+ <voicemail>1933</voicemail>
+ <apn value="web.be">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Burkina Faso -->
+<country code="bf">
+ <provider>
+ <name>Airtel 3G</name>
+ <gsm>
+ <network-id mcc="613" mnc="02"/>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bulgaria -->
+<country code="bg">
+ <provider>
+ <name>GloBul</name>
+ <gsm>
+ <network-id mcc="284" mnc="05"/>
+ <voicemail>120</voicemail>
+ <balance-check>
+ <ussd>*125#</ussd>
+ </balance-check>
+ <apn value="internet.globul.bg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>globul</username>
+ <dns>192.168.88.11</dns>
+ </apn>
+ <apn value="mms.globul.bg">
+ <usage type="mms"/>
+ <name>GLOBUL MMS GPRS</name>
+ <username>mms</username>
+ <mmsc>http://mmsc1.mms.globul.bg:8002</mmsc>
+ <mmsproxy>192.168.87.11:8004</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>M-Tel</name>
+ <gsm>
+ <network-id mcc="284" mnc="01"/>
+ <voicemail>131</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <!-- username/password not included in Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 -->
+ <apn value="inet-gprs.mtel.bg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.226.7.34</dns>
+ <dns>213.226.7.35</dns>
+ </apn>
+ <apn value="mms-gprs.mtel.bg">
+ <usage type="mms"/>
+ <name>MMS M-Tel GPRS</name>
+ <username>mtel</username>
+ <password>mtel</password>
+ <mmsc>http://mmsc/</mmsc>
+ <mmsproxy>10.150.0.33:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vivacom</name>
+ <gsm>
+ <network-id mcc="284" mnc="03"/>
+ <voicemail>110</voicemail>
+ <balance-check>
+ <ussd>*102#</ussd>
+ </balance-check>
+ <apn value="internet.vivacom.bg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <!-- http://www.vivacom.bg/en/residential/help_and_advice/common_questions/mobile_postpaid/8/ -->
+ <name>Vivacom Internet (Postpaid)</name>
+ <username>vivacom</username>
+ <password>vivacom</password>
+ </apn>
+ <apn value="internet.vivatel.bg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vivatel (old)</name>
+ <username>vivatel</username>
+ <password>vivatel</password>
+ <dns>192.168.123.123</dns>
+ </apn>
+ <apn value="mms.vivacom.bg">
+ <usage type="mms"/>
+ <name>vivacom MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mmsc.vivacom.bg</mmsc>
+ <mmsproxy>192.168.123.123:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bahrain -->
+<country code="bh">
+ <provider>
+ <name>Batelco</name>
+ <gsm>
+ <network-id mcc="426" mnc="01"/>
+ <apn value="internet.batelco.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>oNet</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="mms.batelco.com">
+ <usage type="mms"/>
+ <name>Batelco MMS</name>
+ <username>wap</username>
+ <password>wap</password>
+ <mmsc>http://192.168.36.10/servlets/mms</mmsc>
+ <mmsproxy>192.168.1.2:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zain BH</name>
+ <gsm>
+ <network-id mcc="426" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ <apn value="hsdpa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>eGO</name>
+ <username>hsdpa</username>
+ <password>hsdpa</password>
+ </apn>
+ <apn value="http://172.18.83.129">
+ <usage type="mms"/>
+ <name>mms</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://172.18.83.129</mmsc>
+ <mmsproxy>172.18.85.34:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>STC</name>
+ <gsm>
+ <network-id mcc="426" mnc="04"/>
+ <apn value="viva.bh">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Viva</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Brazil -->
+<country code="br">
+ <provider>
+ <!-- Brasil Telecom was bought by Oi on 2009-01-09 and will be phased
+ out and transitioned to Oi.
+ -->
+ <name>Brasil Telecom</name>
+ <gsm>
+ <network-id mcc="724" mnc="16"/>
+ <apn value="brt.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>BrT</username>
+ <password>BrT</password>
+ </apn>
+ <apn value="mms.brt.br">
+ <usage type="mms"/>
+ <name>BrT MMS</name>
+ <username>brt</username>
+ <password>brt</password>
+ <mmsc>http://mms.brasiltelecom.com.br/</mmsc>
+ <mmsproxy>200.96.8.29:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="724" mnc="05"/>
+ <voicemail>*100</voicemail>
+ <balance-check>
+ <ussd>*544#</ussd>
+ <ussd>*545#</ussd>
+ <ussd>*546#</ussd>
+ </balance-check>
+ <apn value="claro.com.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>claro</username>
+ <password>claro</password>
+ </apn>
+ <apn value="bandalarga.claro.com.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G</name>
+ <username>claro</username>
+ <password>claro</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CTBC</name>
+ <gsm>
+ <network-id mcc="724" mnc="07"/>
+ <network-id mcc="724" mnc="32"/>
+ <network-id mcc="724" mnc="33"/>
+ <network-id mcc="724" mnc="34"/>
+ <balance-check>
+ <dtmf>*22</dtmf>
+ </balance-check>
+ <apn value="ctbc.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>ctbc</username>
+ <password>1212</password>
+ </apn>
+ <apn value="mms.ctbc.br">
+ <usage type="mms"/>
+ <name>CTBC MMS</name>
+ <username>ctbc</username>
+ <password>1212</password>
+ <mmsc>http://mms.ctbccelular.com.br/was</mmsc>
+ <mmsproxy>172.29.7.70:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Oi</name>
+ <gsm>
+ <network-id mcc="724" mnc="16"/>
+ <network-id mcc="724" mnc="31"/>
+ <network-id mcc="724" mnc="24"/>
+ <voicemail>*100</voicemail>
+ <balance-check>
+ <dtmf>*804</dtmf>
+ <dtmf>*805</dtmf>
+ </balance-check>
+ <apn value="gprs.oi.com.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <password>oioioi</password>
+ </apn>
+ <apn value="wapgprs.oi.com.br">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>oiwap</username>
+ <password>oioioi</password>
+ </apn>
+ <apn value="mmsgprs.oi.com.br">
+ <usage type="mms"/>
+ <name>Oi MMS</name>
+ <username>oimms</username>
+ <password>oioioi</password>
+ <mmsc>http://200.222.42.204:8002</mmsc>
+ <mmsproxy>192.168.10.50:3128</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TIM</name>
+ <gsm>
+ <network-id mcc="724" mnc="02"/>
+ <network-id mcc="724" mnc="03"/>
+ <network-id mcc="724" mnc="04"/>
+ <network-id mcc="724" mnc="08"/>
+ <voicemail>*100</voicemail>
+ <balance-check>
+ <ussd>*222#</ussd>
+ <dtmf>*222</dtmf>
+ </balance-check>
+ <apn value="tim.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>tim</username>
+ <password>tim</password>
+ <dns>10.223.246.102</dns>
+ <dns>10.223.246.103</dns>
+ </apn>
+ <apn value="unico.tim.it">
+ <usage type="mms"/>
+ <name>iTIM</name>
+ <mmsc>http://mms.tim.it/servlets/mms</mmsc>
+ <mmsproxy>213.230.130.89:80</mmsproxy>
+ </apn>
+ <apn value="timbrasil.br">
+ <usage type="mms"/>
+ <name>TIM MMS</name>
+ <username>tim</username>
+ <password>tim</password>
+ <mmsc>http://mms.tim.br</mmsc>
+ <mmsproxy>200.179.66.242:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Velox</name>
+ <gsm>
+ <apn value="wap.telcel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>iesgprs</username>
+ <password>iesgprs2002</password>
+ <dns>66.36.250.14</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vivo</name>
+ <gsm>
+ <network-id mcc="724" mnc="06"/>
+ <network-id mcc="724" mnc="10"/>
+ <network-id mcc="724" mnc="11"/>
+ <network-id mcc="724" mnc="23"/>
+ <voicemail>*555</voicemail>
+ <balance-check>
+ <dtmf>*8000</dtmf>
+ <dtmf>*5005</dtmf>
+ </balance-check>
+ <apn value="zap.vivo.com.br">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vivo</username>
+ <password>vivo</password>
+ </apn>
+ <apn value="mms.vivo.com.br">
+ <usage type="mms"/>
+ <name>Vivo MMS</name>
+ <username>vivo</username>
+ <password>vivo</password>
+ <mmsc>http://termnat.vivomms.com.br:8088/mms</mmsc>
+ <mmsproxy>200.142.130.104:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Bahamas -->
+<country code="bs">
+ <provider>
+ <name>Batelco</name>
+ <gsm>
+ <network-id mcc="364" mnc="390"/>
+ <apn value="internet.btcbahamas.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Brunei -->
+<country code="bn">
+ <provider>
+ <name>B-Mobile</name>
+ <gsm>
+ <network-id mcc="528" mnc="02"/>
+ <apn value="bmobilewap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="bmobilemms">
+ <usage type="mms"/>
+ <name>B-mobile MMS</name>
+ <mmsc>http://mms.bmobile.com.bn/was</mmsc>
+ <mmsproxy>129.9.10.20:6500</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>DSTCOM</name>
+ <gsm>
+ <network-id mcc="528" mnc="11"/>
+ <apn value="dst.wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="mms.movistar.es">
+ <usage type="mms"/>
+ <name>Movistar MMS</name>
+ <username>MOVISTAR@mms</username>
+ <password>MOVISTAR</password>
+ <mmsc>http://mms.movistar.com</mmsc>
+ <mmsproxy>10.138.255.5:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Belarus -->
+<country code="by">
+ <provider>
+ <!-- http://www.velcom.by/ru/services/gprs/settings/ -->
+ <name>velcom</name>
+ <gsm>
+ <network-id mcc="257" mnc="01"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="wap.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>GPRS WAP</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="web.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS WEB</name>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="plus.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS WEB PLUS</name>
+ <username>plus</username>
+ <password>plus</password>
+ </apn>
+ <apn value="privet.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS PRIVET</name>
+ <username>privet</username>
+ <password>privet</password>
+ </apn>
+ <apn value="web1.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB BASIC</name>
+ <username>web1</username>
+ <password>web1</password>
+ </apn>
+ <apn value="web2.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB 25</name>
+ <username>web2</username>
+ <password>web2</password>
+ </apn>
+ <apn value="web3.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB 150</name>
+ <username>web3</username>
+ <password>web3</password>
+ </apn>
+ <apn value="vmi.velcom.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB 500</name>
+ <username>vmi</username>
+ <password>vmi</password>
+ </apn>
+ <apn value="mms.velcom.by">
+ <usage type="mms"/>
+ <name>VELCOM MMS</name>
+ <mmsc>http://mms.velcom.by/servlets/mms</mmsc>
+ <mmsproxy>10.200.15.15:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTS</name>
+ <gsm>
+ <network-id mcc="257" mnc="02"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="internet.mts.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mts</username>
+ <password>mts</password>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>MTS MMS</name>
+ <mmsc>http://mms.mts064.telekom.yu/mms/wapenc</mmsc>
+ <mmsproxy>172.17.85.131:8080</mmsproxy>
+ </apn>
+ <apn value="mms.mts.ru">
+ <usage type="mms"/>
+ <name>MTS MMS</name>
+ <username>mts</username>
+ <password>mts</password>
+ <mmsc>http://mmsc/</mmsc>
+ <mmsproxy>192.168.192.192:9201</mmsproxy>
+ </apn>
+ <apn value="mms.umc.ua">
+ <usage type="mms"/>
+ <name>UMC MMS GPRS</name>
+ <mmsc>http://mmsc:8002/</mmsc>
+ <mmsproxy>192.168.10.10:8080</mmsproxy>
+ </apn>
+ <apn value="sp.mts">
+ <usage type="mms"/>
+ <name>MTS MMS</name>
+ <mmsc>http://mmsc2.mts.net</mmsc>
+ <mmsproxy>209.4.229.90:9401</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- http://life.com.by/en/services/internet-105.html -->
+ <name>life:)</name>
+ <gsm>
+ <network-id mcc="257" mnc="03"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="internet.life.com.by">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Botswana -->
+<country code="bw">
+ <provider>
+ <name>Mascom Wireless</name>
+ <gsm>
+ <network-id mcc="652" mnc="01"/>
+ <apn value="internet.mascom">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>life:) MMS</name>
+ <mmsc>http://mms.life.com.ua/cmmsc/post</mmsc>
+ <mmsproxy>212.58.162.230:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Burundi -->
+<country code="bi">
+ <provider>
+ <name>Leo/UCom</name>
+ <gsm>
+ <network-id mcc="642" mnc="03"/>
+ <apn value="ucnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tempo/Africell</name>
+ <gsm>
+ <network-id mcc="642" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.mascom">
+ <usage type="mms"/>
+ <name>Mascom MMS</name>
+ <mmsc>http://192.168.33.50/mms</mmsc>
+ <mmsproxy>192.168.33.138:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Canada -->
+<country code="ca">
+ <provider>
+ <name>Fido</name>
+ <gsm>
+ <network-id mcc="302" mnc="370"/>
+ <apn value="internet.fido.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>fido</username>
+ <password>fido</password>
+ <dns>204.92.15.211</dns>
+ <dns>207.181.101.4</dns>
+ </apn>
+ <apn value="mms.fido.ca">
+ <usage type="mms"/>
+ <name>Fido MMS</name>
+ <mmsc>http://mms.fido.ca</mmsc>
+ <mmsproxy>mm1.fido.ca:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Rogers</name>
+ <gsm>
+ <network-id mcc="302" mnc="720"/>
+ <apn value="internet.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wapuser1</username>
+ <password>wap</password>
+ <dns>207.181.101.4</dns>
+ <dns>207.181.101.5</dns>
+ </apn>
+ <apn value="media.com">
+ <usage type="mms"/>
+ <name>Rogers Media</name>
+ <username>media</username>
+ <password>mda01</password>
+ <mmsc>http://mms.gprs.rogers.com</mmsc>
+ <mmsproxy>10.128.1.69:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bell Mobility</name>
+ <gsm>
+ <network-id mcc="302" mnc="610"/>
+ <network-id mcc="302" mnc="640"/>
+ <network-id mcc="302" mnc="651"/>
+ <network-id mcc="302" mnc="880"/>
+ <apn value="inet.bell.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="pda.bell.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Web</name>
+ </apn>
+ <apn value="pda2.bell.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Fast Web</name>
+ </apn>
+ <apn value="pda.bell.ca">
+ <usage type="mms"/>
+ <name>Bell MMS</name>
+ <mmsc>http://mms.bell.ca/mms/wapenc</mmsc>
+ <mmsproxy>web.wireless.bell.ca:80</mmsproxy>
+ </apn>
+ </gsm>
+ <cdma>
+ <sid value="16420"/>
+ <sid value="16440"/>
+ <sid value="16456"/>
+ <sid value="16410"/>
+ <sid value="16444"/>
+ <sid value="16390"/>
+ <sid value="16394"/>
+ <sid value="16402"/>
+ <sid value="16414"/>
+ <sid value="16416"/>
+ <sid value="16418"/>
+ <sid value="16462"/>
+ <sid value="16472"/>
+ <sid value="16408"/>
+ <sid value="16404"/>
+ <sid value="16430"/>
+ <sid value="16396"/>
+ <sid value="16426"/>
+ <sid value="16388"/>
+ <sid value="16390"/>
+ <sid value="16408"/>
+ <sid value="16414"/>
+ <sid value="16430"/>
+ <sid value="16460"/>
+ <sid value="16468"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telus Mobility</name>
+ <gsm>
+ <network-id mcc="302" mnc="220"/>
+ <network-id mcc="302" mnc="860"/>
+ <network-id mcc="302" mnc="880"/>
+ <apn value="isp.telus.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="vpn.telus.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet (with VPN)</name>
+ </apn>
+ <apn value="bb.telus.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Blackberry</name>
+ </apn>
+ <apn value="sp.telus.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Web/Smartphone</name>
+ </apn>
+ <apn value="sp.telus.com">
+ <usage type="mms"/>
+ <name>TELUS MMS</name>
+ <mmsc>http://aliasredirect.net/proxy/mmsc</mmsc>
+ <mmsproxy>74.49.0.18:80</mmsproxy>
+ </apn>
+ </gsm>
+ <cdma>
+ <sid value="16422"/>
+ <sid value="17500"/>
+ <sid value="16438"/>
+ <sid value="16458"/>
+ <sid value="16436"/>
+ <sid value="16434"/>
+ <sid value="16384"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Virgin Mobile</name>
+ <cdma/>
+ </provider>
+ <provider>
+ <name>SaskTel</name>
+ <cdma>
+ <sid value="16410"/>
+ <sid value="16412"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Vidéotron</name>
+ <gsm>
+ <network-id mcc="302" mnc="500"/>
+ <network-id mcc="302" mnc="510"/>
+ <apn value="media.videotron">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telephony data</name>
+ </apn>
+ <apn value="ihvm.videotron">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>IHVM</name>
+ </apn>
+ <apn value="media.videotron">
+ <usage type="mms"/>
+ <name>Media</name>
+ <mmsc>http://media.videotron.com</mmsc>
+ <mmsproxy>10.208.89.17:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>WIND Mobile</name>
+ <gsm>
+ <network-id mcc="302" mnc="490"/>
+ <apn value="broadband.windmobile.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Laptop (data stick)</name>
+ </apn>
+ <apn value="internet.windmobile.ca">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile (add-on for phone)</name>
+ </apn>
+ <apn value="mnet.b-online.gr">
+ <usage type="mms"/>
+ <name>WIND MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://192.168.200.95/servlets/mms</mmsc>
+ <mmsproxy>192.168.200.11:9401</mmsproxy>
+ </apn>
+ <apn value="mms.windmobile.ca">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://mms.windmobile.ca</mmsc>
+ <mmsproxy>74.115.197.70:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mobilicity</name>
+ <gsm>
+ <network-id mcc="302" mnc="320"/>
+ <apn value="wap.davewireless.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Web</name>
+ </apn>
+ <apn value="internet.davewireless.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ <apn value="mms.davewireless.com">
+ <usage type="mms"/>
+ <name>MoMMS</name>
+ <mmsc>http://mms.mobilicity.net</mmsc>
+ <mmsproxy>10.100.3.4:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Congo (Dem. Rep.) -->
+<country code="cd">
+ <provider>
+ <name>Vodacom</name>
+ <gsm>
+ <network-id mcc="630" mnc="01"/>
+ <apn value="vodanet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vodalive</username>
+ <dns>172.24.97.1</dns>
+ </apn>
+ <apn value="vodalive">
+ <usage type="mms"/>
+ <name>Vodalive</name>
+ <mmsc>http://172.24.97.1/mmsc</mmsc>
+ <mmsproxy>172.24.97.1:3128</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Congo (Rep.) -->
+<country code="cg">
+</country>
+
+<!-- Switzerland -->
+<country code="ch">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="228" mnc="03"/>
+ <balance-check>
+ <ussd>#121#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">#121*CODE#</ussd>
+ </balance-top-up>
+ <apn value="mobileoffice3g">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere - Standard</name>
+ <dns>213.55.128.1</dns>
+ <dns>213.55.128.2</dns>
+ </apn>
+ <apn value="click">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere - Prepaid</name>
+ <dns>213.55.128.1</dns>
+ <dns>213.55.128.2</dns>
+ </apn>
+ <apn value="intranetaccess">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere - Intranet Access</name>
+ </apn>
+ <apn value="internet">
+ <name>Internet Everywhere - Postpaid</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sunrise</name>
+ <gsm>
+ <network-id mcc="228" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>194.230.1.103</dns>
+ <dns>194.230.1.71</dns>
+ </apn>
+ <apn value="wap.sunrise.ch">
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="mms.sunrise.ch">
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ <apn value="mms.sunrise.ch">
+ <usage type="mms"/>
+ <name>Sunrise MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mmsc.sunrise.ch</mmsc>
+ <mmsproxy>212.35.34.75:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Swisscom</name>
+ <gsm>
+ <!-- username/password not included in Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 -->
+ <!-- http://www.swisscom.ch/res/hilfe/mobile/einstellungen/index.htm -->
+ <network-id mcc="228" mnc="01"/>
+ <balance-check>
+ <ussd>*130#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*123*CODE#</ussd>
+ </balance-top-up>
+ <apn value="gprs.swisscom.ch">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Swisscom GPRS</name>
+ <dns>138.188.101.189</dns>
+ <dns>138.188.101.186</dns>
+ </apn>
+ <apn value="corporate.swisscom.ch">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Swisscom CAA</name>
+ <username>testprofil</username>
+ <password>temporary</password>
+ </apn>
+ <apn value="event.swisscom.ch">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Swisscom MMS</name>
+ </apn>
+ <apn value="event.swisscom.ch">
+ <usage type="mms"/>
+ <name>Swisscom MMS</name>
+ <mmsc>http://mms.natel.ch:8079</mmsc>
+ <mmsproxy>192.168.210.2:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>M-Budget</name>
+ <gsm>
+ <network-id mcc="228" mnc="01"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="gprs.swisscom.ch">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Migros Data</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Cote d'Ivoire -->
+<country code="ci">
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="612" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>172.16.100.5</dns>
+ </apn>
+ <apn value="fast-mms">
+ <usage type="mms"/>
+ <name>MTN MMS</name>
+ <username>mms</username>
+ <mmsc>http://192.168.97.1/mmsc</mmsc>
+ <mmsproxy>192.168.97.1:3130</mmsproxy>
+ </apn>
+ <apn value="myMTN">
+ <usage type="mms"/>
+ <name>MTN-MMS</name>
+ <username>mtnmms</username>
+ <password>mtnmms</password>
+ <mmsc>http://mms.mtn.co.za/mms/wapenc</mmsc>
+ <mmsproxy>196.11.240.241:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Chile -->
+<country code="cl">
+ <provider>
+ <name>Claro Chile</name>
+ <gsm>
+ <network-id mcc="730" mnc="03"/>
+ <apn value="bam.clarochile.cl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>clarochile</username>
+ <password>clarochile</password>
+ </apn>
+ <apn value="bap.clarochile.cl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepago</name>
+ <username>clarochile</username>
+ <password>clarochile</password>
+ </apn>
+ <apn value="wap.clarochile.cl">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>clarochile</username>
+ <password>clarochile</password>
+ </apn>
+ <apn value="mms.clarochile.cl">
+ <usage type="mms"/>
+ <name>MMS CLARO</name>
+ <username>clarochile</username>
+ <password>clarochile</password>
+ <mmsc>http://mms.clarochile.cl</mmsc>
+ <mmsproxy>172.23.200.200:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Entel PCS</name>
+ <gsm>
+ <network-id mcc="730" mnc="01"/>
+ <apn value="imovil.entelpcs.cl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract / Prepaid / WebSession</name>
+ <username>entelpcs</username>
+ <password>entelpcs</password>
+ </apn>
+ <apn value="bam.entelpcs.cl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WAP</name>
+ <username>entelpcs</username>
+ <password>entelpcs</password>
+ </apn>
+ <apn value="mms.entelpcs.cl">
+ <usage type="mms"/>
+ <name>MMS Entel PCS</name>
+ <username>entelmms</username>
+ <password>entelpcs</password>
+ <mmsc>http://mmsc.entelpcs.cl</mmsc>
+ <mmsproxy>10.99.0.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="730" mnc="10"/>
+ <apn value="web.tmovil.cl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="wap.tmovil.cl">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="dst.mms">
+ <usage type="mms"/>
+ <name>DSTMMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms.dst.com.bn/mmsc</mmsc>
+ <mmsproxy>10.100.6.101:3130</mmsproxy>
+ </apn>
+ <apn value="dst.mms">
+ <usage type="mms"/>
+ <name>DSTMMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms.dst.com.bn/mmsc</mmsc>
+ <mmsproxy>10.100.6.101:3130</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Cameroon -->
+<country code="cm">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="624" mnc="02"/>
+ <apn value="orangecmgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="624" mnc="01"/>
+ <apn value="INTERNET">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>guest</username>
+ <password>guest</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- China -->
+<country code="cn">
+ <provider>
+ <name>China Mobile</name>
+ <gsm>
+ <network-id mcc="460" mnc="00"/>
+ <network-id mcc="460" mnc="02"/>
+ <apn value="cmwap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>guest</username>
+ <password>guest</password>
+ </apn>
+ <apn value="cmnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>guest</username>
+ <password>guest</password>
+ <dns>211.136.20.203</dns>
+ </apn>
+ <apn value="cmwap">
+ <usage type="mms"/>
+ <name>移动彩信</name>
+ <mmsc>http://mmsc.monternet.com</mmsc>
+ <mmsproxy>10.0.0.172:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>China Unicom</name>
+ <gsm>
+ <network-id mcc="460" mnc="01"/>
+ <apn value="3gnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>uninet</username>
+ </apn>
+ <apn value="3gwap">
+ <usage type="mms"/>
+ <name>联通彩信</name>
+ <mmsc>http://mmsc.myuni.com.cn</mmsc>
+ <mmsproxy>10.0.0.172:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>China Telecom</name>
+ <cdma>
+ <username>ctnet@mycdma.cn</username>
+ <password>vnet.mobi</password>
+ <sid value="11296"/>
+ <sid value="11298"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Costa Rica -->
+<country code="cr">
+ <provider>
+ <name>IceCelular</name>
+ <gsm>
+ <network-id mcc="712" mnc="01"/>
+ <network-id mcc="712" mnc="02"/>
+ <apn value="icecelular">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>guest</username>
+ <password>guest</password>
+ <dns>208.133.206.44</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Kolbi</name>
+ <gsm>
+ <network-id mcc="712" mnc="03"/>
+ <voicemail>190</voicemail>
+ <balance-check>
+ <sms text="">1150</sms>
+ </balance-check>
+ <apn value="kolbi3g">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Kolbi 3g</name>
+ </apn>
+ <apn value="mms.ideasclaro">
+ <usage type="mms"/>
+ <name>MMS CLARO CR</name>
+ <mmsc>http://mms.ideasclaro.com:8002</mmsc>
+ <mmsproxy>216.230.133.66:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Colombia -->
+<country code="co">
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="732" mnc="101"/>
+ <apn value="internet.comcel.com.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>COMCELWEB</username>
+ <password>COMCELWEB</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>eTb</name>
+ <gsm>
+ <apn value="moviletb.net.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>etb</username>
+ <password>etb</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="732" mnc="102"/>
+ <network-id mcc="732" mnc="123"/>
+ <apn value="internet.movistar.com.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="732" mnc="103"/>
+ <network-id mcc="732" mnc="111"/>
+ <apn value="web.colombiamovil.com.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.sentelgsm.com">
+ <usage type="mms"/>
+ <name>Tigo MMS</name>
+ <username>tigo</username>
+ <password>tigo</password>
+ <mmsc>http://mms.tigo.sn</mmsc>
+ <mmsproxy>172.16.16.16:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Uff</name>
+ <gsm>
+ <apn value="web.uffmovil.com.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- MVNO operating on Tigo's network -->
+ <name>UNE</name>
+ <gsm>
+ <network-id mcc="732" mnc="103"/>
+ <network-id mcc="732" mnc="111"/>
+ <apn value="www.une.net.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>une</username>
+ <password>une</password>
+ </apn>
+ <apn value="une4glte.net.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>LTE (4G)</name>
+ </apn>
+ <apn value="mms.colombiamovil.com.co">
+ <usage type="mms"/>
+ <name>TIGO multimedia</name>
+ <username>mms-cm1900</username>
+ <password>mms-cm1900</password>
+ <mmsc>http://mms.ola.com.co</mmsc>
+ <mmsproxy>190.102.206.48:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- MVNO operating on Telefonica's network -->
+ <name>Virgin Mobile</name>
+ <gsm>
+ <network-id mcc="732" mnc="123"/>
+ <apn value="web.vmc.net.co">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.movistar.com.co">
+ <usage type="mms"/>
+ <name>movistar MMS</name>
+ <username>movistar</username>
+ <password>movistar</password>
+ <mmsc>http://mms.movistar.com.co</mmsc>
+ <mmsproxy>192.168.222.7:9001</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Cyprus -->
+<country code="cy">
+ <provider>
+ <name>Cytamobile-Vodafone</name>
+ <gsm>
+ <network-id mcc="280" mnc="01"/>
+ <msisdn-query>
+ <ussd>*#109#</ussd>
+ </msisdn-query>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ </apn>
+ <apn value="pp.internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ </apn>
+ <apn value="cytamobile">
+ <usage type="mms"/>
+ <name>CytaMMS</name>
+ <mmsc>http://mmsc.cyta.com.cy</mmsc>
+ <mmsproxy>212.31.96.161:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="280" mnc="10"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Czech Republic -->
+<country code="cz">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="230" mnc="03"/>
+ <balance-check>
+ <ussd>*22#</ussd>
+ </balance-check>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>217.77.161.130</dns>
+ <dns>217.77.161.131</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="230" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>160.218.10.200</dns>
+ <dns>160.218.43.200</dns>
+ </apn>
+ <apn value="internet.open">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>160.218.10.200</dns>
+ <dns>160.218.43.200</dns>
+ </apn>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>02 MMS</name>
+ <mmsc>http://mms.o2active.cz:8002</mmsc>
+ <mmsproxy>160.218.160.218:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="230" mnc="01"/>
+ <apn value="internet.t-mobile.cz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>62.141.0.1</dns>
+ <dns>213.162.65.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Germany -->
+<country code="de">
+ <provider>
+ <name>AldiTalk/MedionMobile</name>
+ <gsm>
+ <network-id mcc="262" mnc="03"/>
+ <network-id mcc="262" mnc="05"/>
+ <network-id mcc="262" mnc="77"/>
+ <voicemail>9911</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*104*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Volume rate/30 Day Flatrate</name>
+ <username>eplus</username>
+ <password>gprs</password>
+ <dns>212.23.97.2</dns>
+ <dns>212.23.97.3</dns>
+ </apn>
+ <apn value="tagesflat.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>24 Hour Flatrate</name>
+ <name xml:lang="de">Tages-Flatrate</name>
+ <username>eplus</username>
+ <password>gprs</password>
+ </apn>
+ <apn value="mms.eplus.de">
+ <usage type="mms"/>
+ <name>E-plus MMS</name>
+ <username>mms</username>
+ <password>eplus</password>
+ <mmsc>http://mms/eplus/</mmsc>
+ <mmsproxy>212.23.97.153:5080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>blau.de</name>
+ <gsm>
+ <network-id mcc="262" mnc="03"/>
+ <network-id mcc="262" mnc="05"/>
+ <network-id mcc="262" mnc="77"/>
+
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*104*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>blau</username>
+ <password>blau</password>
+ </apn>
+ <apn value="tagesflat.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>24 Hour Flatrate</name>
+ <name xml:lang="de">Tages-Flatrate</name>
+ <username>blau</username>
+ <password>blau</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bild Mobil</name>
+ <gsm>
+ <!-- http://www.bildmobil.de/info_handyeinstellungen.html -->
+ <network-id mcc="262" mnc="02"/>
+ <apn value="access.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>BILD Mobilportal</name>
+ </apn>
+ <apn value="web.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <dns>139.7.30.125</dns>
+ <dns>139.7.30.126</dns>
+ </apn>
+ <!-- http://www.prepaid-wiki.de/index.php5/BILDmobil_Daten-SIM -->
+ <apn value="event.vodafone.de">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>BILDmobil Speedstick (Surfpakete)</name>
+ </apn>
+ <apn value="event.vodafone.de">
+ <usage type="mms"/>
+ <name>VF DE MMS</name>
+ <mmsc>http://139.7.24.1/servlets/mms</mmsc>
+ <mmsproxy>139.7.29.17:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>E-Plus</name>
+ <gsm>
+ <network-id mcc="262" mnc="03"/>
+ <network-id mcc="262" mnc="05"/>
+ <network-id mcc="262" mnc="77"/>
+
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*104*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>eplus</username>
+ <password>gprs</password>
+ <dns>212.23.97.2</dns>
+ <dns>212.23.97.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="262" mnc="07"/>
+ <network-id mcc="262" mnc="08"/>
+ <network-id mcc="262" mnc="11"/>
+
+ <voicemail>333</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*103*CODE#</ussd>
+ </balance-top-up>
+
+ <apn value="pinternet.interkom.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>LOOP</name>
+ <dns>193.189.244.225</dns>
+ <dns>193.189.244.206</dns>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pay-by-MB</name>
+ <dns>195.182.110.132</dns>
+ <dns>62.134.11.4</dns>
+ </apn>
+ <apn value="surfo2">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pay-by-time</name>
+ <dns>195.182.110.132</dns>
+ <dns>62.134.11.4</dns>
+ </apn>
+ <apn value="internet">
+ <usage type="mms"/>
+ <name>o2 MMS</name>
+ <mmsc>http://10.81.0.7:8002</mmsc>
+ <mmsproxy>195.182.114.52:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tchibo-Mobil</name>
+ <gsm>
+ <network-id mcc="262" mnc="07"/>
+ <network-id mcc="262" mnc="08"/>
+ <network-id mcc="262" mnc="11"/>
+
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*103*CODE#</ussd>
+ </balance-top-up>
+ <apn value="webmobil1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Tagesflat / Monats-Flatrate L / Monats-Flatrate XL</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile(Telekom)</name>
+ <gsm>
+ <network-id mcc="262" mnc="01"/>
+ <network-id mcc="262" mnc="06"/>
+
+ <voicemail>3311</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*101*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.t-d1.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <password>t-d1</password>
+ <dns>193.254.160.1</dns>
+ <dns>193.254.160.130</dns>
+ </apn>
+ <apn value="internet.t-mobile">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>t-mobile</username>
+ <password>tm</password>
+ <dns>10.74.83.22</dns>
+ <dns>193.254.160.1</dns>
+ </apn>
+ <apn value="internet.t-mobile">
+ <usage type="mms"/>
+ <name>T-Mobile MMS</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ <mmsc>http://mms.t-mobile.de/servlets/mms</mmsc>
+ <mmsproxy>172.28.23.131:8008</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Congstar</name>
+ <gsm>
+ <network-id mcc="262" mnc="01"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*101*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.t-mobile">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid Contracts</name>
+ <username>t-mobile</username>
+ <password>tm</password>
+ <dns>193.254.160.1</dns>
+ <dns>10.74.83.22</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="262" mnc="02"/>
+ <network-id mcc="262" mnc="04"/>
+ <network-id mcc="262" mnc="09"/>
+
+ <voicemail>5500</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*100*CODE#</ussd>
+ </balance-top-up>
+
+ <apn value="web.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>139.7.30.125</dns>
+ <dns>139.7.30.126</dns>
+ </apn>
+ <apn value="event.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WebSessions</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>139.7.30.125</dns>
+ <dns>139.7.30.126</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>FONIC</name>
+ <gsm>
+ <network-id mcc="262" mnc="07"/>
+ <network-id mcc="262" mnc="08"/>
+ <network-id mcc="262" mnc="11"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*103*CODE#</ussd>
+ </balance-top-up>
+ <apn value="pinternet.interkom.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>fonic</username>
+ <password>fonic</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>simyo Internet</name>
+ <gsm>
+ <network-id mcc="262" mnc="03"/>
+ <network-id mcc="262" mnc="05"/>
+ <network-id mcc="262" mnc="77"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*104*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.eplus.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>simyo</username>
+ <password>simyo</password>
+ <dns>212.23.97.2</dns>
+ <dns>212.23.97.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Alice</name>
+ <gsm>
+ <network-id mcc="262" mnc="07"/>
+ <apn value="internet.partner1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Option Mobile</name>
+ <dns>193.189.244.225</dns>
+ <dns>193.189.244.206</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>1&amp;1</name>
+ <gsm>
+ <!-- Vodafone (D2) network -->
+ <network-id mcc="262" mnc="02"/>
+ <network-id mcc="262" mnc="04"/>
+ <network-id mcc="262" mnc="09"/>
+
+ <voicemail>5500</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+
+ <apn value="web.vodafone.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ <apn value="mail.partner.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Web</name>
+ <username>D2</username>
+ <password>Web</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Netzclub</name>
+ <gsm>
+ <!-- O2 network -->
+ <network-id mcc="262" mnc="07"/>
+ <network-id mcc="262" mnc="08"/>
+ <network-id mcc="262" mnc="11"/>
+ <apn value="pinternet.interkom.de">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <!-- Information taken from https://www.netzclub.net/downloads/default/Manuelle_Handyeinstellungen.pdf -->
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Denmark -->
+<country code="dk">
+ <provider primary="true">
+ <name>3</name>
+ <gsm>
+ <network-id mcc="238" mnc="06"/>
+ <apn value="bredband.tre.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Bredbånd (standard)</name>
+ </apn>
+ <apn value="net.tre.dk">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Bredbånd Premium Kontant</name>
+ </apn>
+ <apn value="data.tre.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3 (standard for mobilkunder; spærret for indgående trafik)</name>
+ </apn>
+ <apn value="static.tre.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3 (statisk IP)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- http://oister.dk - Same network as 3.dk -->
+ <provider>
+ <name>OiSTER</name>
+ <gsm>
+ <network-id mcc="238" mnc="06"/>
+ <!-- http://www.oister.dk/kundeservice/mobilt-bredband/opsatning/andre-opsatninger/ -->
+ <apn value="bredband.oister.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ <apn value="data.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ </apn>
+ <apn value="data.tre.dk">
+ <usage type="mms"/>
+ <name>3mms</name>
+ <mmsc>http://mms.3.dk</mmsc>
+ <mmsproxy>mmsproxy.3.dk:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+
+ <!-- http://www.ice-net.dk/mobiltbredbaand.php -->
+ <provider>
+ <name>ice.net (Nordisk Mobiltelefon)</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="238" mnc="02"/>
+ <network-id mcc="238" mnc="77"/>
+
+ <voicemail>20171717</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ <dtmf>40454545</dtmf>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.88.64.199</dns>
+ <dns>212.88.64.14</dns>
+ </apn>
+ <apn value="telenor">
+ <usage type="mms"/>
+ <name>Telenor MMS</name>
+ <mmsc>http://mms.telenor.dk</mmsc>
+ <mmsproxy>212.88.64.8:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+
+ <!-- http://www.cbb.dk/mobil/hjaelp/manuel-opsaetning-af-mms-og-gprs/ -->
+ <provider>
+ <name>CBB Mobil</name>
+ <gsm>
+ <network-id mcc="238" mnc="02"/>
+ <network-id mcc="238" mnc="77"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TDC</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+
+ <voicemail>20171717</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ <dtmf>40454545</dtmf>
+ </balance-check>
+
+ <!-- http://kundeservice.tdc.dk/privat/faq.php?id=20063 -->
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.239.134.83</dns>
+ <dns>193.162.153.164</dns>
+ </apn>
+ <!-- mnc="0171" in Vodafone XML -->
+ <apn value="internet.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <!-- mnc="0172" in Vodafone XML -->
+ <apn value="internet.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.tdc.fi">
+ <usage type="mms"/>
+ <name>TDC MMS</name>
+ <mmsc>http://mmsc.tdc.fi</mmsc>
+ <mmsproxy>10.1.12.2:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Fullrate</name>
+ <gsm>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>Fullrate</username>
+ <password>Fullrate</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telia</name>
+ <gsm>
+ <network-id mcc="238" mnc="30"/>
+
+ <voicemail>28184000</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+
+ <apn value="www.internet.mtelia.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="www.mms.mtelia.dk">
+ <usage type="mms"/>
+ <name>Telia MMS</name>
+ <mmsc>http://mms.telia.dk</mmsc>
+ <mmsproxy>193.209.134.131:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>BiBoB</name>
+ <gsm>
+ <network-id mcc="238" mnc="02"/>
+ <apn value="internet.bibob.dk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- Telmore - Same network as TDC -->
+ <provider>
+ <name>Telmore</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.239.134.83</dns>
+ <dns>193.162.153.164</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Telmore MMS</name>
+ <mmsc>http://192.168.241.114:8002</mmsc>
+ <mmsproxy>194.182.251.15:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Unotel</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>happiimobil</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- Onfone: https://www.onfone.dk/Kundeservice/mobil/saet_din_mobil_op/internet-gprs-3g/ -->
+ <provider>
+ <name>Onfone Internet DK</name>
+ <gsm>
+ <network-id mcc="238" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Dominican Republic -->
+<country code="do">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="370" mnc="01"/>
+ <voicemail>*777</voicemail>
+ <balance-check>
+ <ussd>#131#</ussd>
+ </balance-check>
+ <apn value="orangenet.com.do">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="370" mnc="02"/>
+ <voicemail>*99</voicemail>
+ <balance-check>
+ <ussd>*122#</ussd>
+ <dtmf>*22</dtmf>
+ </balance-check>
+ <apn value="internet.ideasclaro.com.do">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.3.81.5</dns>
+ <dns>196.3.81.132</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Viva</name>
+ <gsm>
+ <network-id mcc="370" mnc="04"/>
+ <balance-check>
+ <ussd>#111#</ussd>
+ <dtmf>*74</dtmf>
+ </balance-check>
+ <apn value="edge.viva.net.do">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>viva</username>
+ <password>viva</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Algeria -->
+<country code="dz">
+ <provider>
+ <name>Djezzy</name>
+ <gsm>
+ <network-id mcc="603" mnc="02"/>
+ <apn value="djezzy.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="djezzy.mms">
+ <usage type="mms"/>
+ <name>MMS djezzy</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsproxy>172.24.97.158:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mobilis</name>
+ <gsm>
+ <network-id mcc="603" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Mobilis MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://172.25.49.9/servlets/mms</mmsc>
+ <mmsproxy>172.25.49.2:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nedjma</name>
+ <gsm>
+ <network-id mcc="603" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB</name>
+ <username>nedjma</username>
+ <password>nedjma</password>
+ </apn>
+ <apn value="nedjmaMMS">
+ <usage type="mms"/>
+ <name>Nedjma MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://10.10.111.1</mmsc>
+ <mmsproxy>192.168.52.3:3128</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Ecuador -->
+<country code="ec">
+ <provider>
+ <name>Movistar UMTS</name>
+ <gsm>
+ <network-id mcc="740" mnc="00"/>
+ <apn value="navega.movistar.ec">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ <apn value="mms.movistar.com.ec">
+ <usage type="mms"/>
+ <name>movistar MMS</name>
+ <username>movistar</username>
+ <password>movistar</password>
+ <mmsc>http://mms.movistar.com.ec:8088/mms/</mmsc>
+ <mmsproxy>10.3.5.50:9001</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Porta 3G</name>
+ <gsm>
+ <network-id mcc="740" mnc="01"/>
+ <apn value="internet.porta.com.ec">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.porta.com.ec">
+ <usage type="mms"/>
+ <name>MMS Porta</name>
+ <username>portamms</username>
+ <password>portamms2003</password>
+ <mmsc>http://iesmms.porta.com.ec</mmsc>
+ <mmsproxy>216.250.208.94:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Estonia -->
+<country code="ee">
+ <provider>
+ <name>EMT</name>
+ <gsm>
+ <network-id mcc="248" mnc="01"/>
+ <apn value="internet.emt.ee">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>217.71.32.116</dns>
+ <dns>217.71.32.115</dns>
+ </apn>
+ <apn value="mms.emt.ee">
+ <usage type="mms"/>
+ <name>EMT MMS</name>
+ <mmsc>http://mms.emt.ee/servlets/mms</mmsc>
+ <mmsproxy>217.71.32.82:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nordea</name>
+ <gsm>
+ <network-id mcc="248" mnc="01"/>
+ <apn value="internet.emt.ee">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Elisa</name>
+ <gsm>
+ <network-id mcc="248" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.204.0.1</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Elisa MMS</name>
+ <mmsc>http://mms.elisa.fi</mmsc>
+ <mmsproxy>213.161.41.57:80</mmsproxy>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Elisa MMS</name>
+ <mmsc>http://194.204.2.10</mmsc>
+ <mmsproxy>194.204.2.6:8000</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="248" mnc="03"/>
+ <apn value="internet.tele2.ee">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="internet.tele2.fi">
+ <usage type="mms"/>
+ <name>Tele2 MMS</name>
+ <username>wap</username>
+ <password>wap</password>
+ <mmsc>http://mmsc.tele2.fi</mmsc>
+ <mmsproxy>193.12.40.19:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Egypt -->
+<country code="eg">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="602" mnc="02"/>
+ <msisdn-query>
+ <ussd>*878#</ussd>
+ </msisdn-query>
+ <apn value="internet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>163.121.128.134</dns>
+ <dns>212.103.160.18</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Etisalat</name>
+ <gsm>
+ <network-id mcc="602" mnc="03"/>
+ <apn value="etisalat">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="Etisalat">
+ <usage type="mms"/>
+ <name>Etisalat MMS</name>
+ <mmsc>http://10.71.131.7:38090/</mmsc>
+ <mmsproxy>10.71.130.29:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MobiNil</name>
+ <gsm>
+ <network-id mcc="602" mnc="01"/>
+ <apn value="mobinilweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>80.75.166.250</dns>
+ <dns>163.121.163.201</dns>
+ </apn>
+ <apn value="mobinilmms">
+ <usage type="mms"/>
+ <name>MobiNil MMS</name>
+ <mmsc>http://10.7.13.24:8002/</mmsc>
+ <mmsproxy>62.241.155.45:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Spain -->
+<country code="es">
+ <provider>
+ <name>Euskaltel</name>
+ <gsm>
+ <network-id mcc="214" mnc="08"/>
+ <apn value="internet.euskaltel.mobi">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>CLIENTE</username>
+ <password>EUSKALTEL</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Lebara</name>
+ <gsm>
+ <apn value="gprsmov.lebaramobile.es">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Másmovil</name>
+ <gsm>
+ <network-id mcc="214" mnc="03"/>
+ <apn value="internetmas">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>móbil R (Mundo-R)</name>
+ <gsm>
+ <network-id mcc="214" mnc="17"/>
+ <apn value="internet.mundo-r.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- http://www.happymovil.es/es/prepago/internet-movil -->
+ <name>Happy Móvil/moviData</name>
+ <gsm>
+ <network-id mcc="214" mnc="03"/>
+ <apn value="INTERNETTPH">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.143.33.8</dns>
+ <dns>62.36.225.150</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ONO</name>
+ <gsm>
+ <network-id mcc="214" mnc="18"/>
+ <apn value="internet.ono.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>62.42.230.24</dns>
+ <dns>62.42.63.52</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Pepephone</name>
+ <gsm>
+ <network-id mcc="214" mnc="06"/>
+ <apn value="gprs.pepephone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pepephone</name>
+ </apn>
+ <apn value="gprsmov.pepephone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pepephone (Mobile)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="214" mnc="03"/>
+ <network-id mcc="214" mnc="09"/>
+
+ <voicemail>242</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ <ussd>*113#</ussd>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Orange</name>
+ <username>ORANGE</username>
+ <password>ORANGE</password>
+ <dns>85.62.229.133</dns>
+ <dns>85.62.229.134</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Simyo</name>
+ <gsm>
+ <network-id mcc="214" mnc="19"/>
+ <apn value="gprs-service.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>195.230.105.134</dns>
+ <dns>195.230.105.135</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telecable</name>
+ <gsm>
+ <network-id mcc="214" mnc="16"/>
+ <apn value="internet.telecable.es">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telecable</username>
+ <password>telecable</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar (Telefónica)</name>
+ <gsm>
+ <network-id mcc="214" mnc="05"/>
+ <network-id mcc="214" mnc="07"/>
+
+ <voicemail>123</voicemail>
+ <balance-check>
+ <dtmf>2266</dtmf>
+ </balance-check>
+
+ <!-- http://comunidad.movistar.es/t5/Asistencia-T%C3%A9cnica-Terminales-y/es-posible-capar-el-3g-desde-movistar/m-p/752106#M30907 -->
+ <apn value="telefonica.es">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telefónica</name>
+ <username>telefonica</username>
+ <password>telefonica</password>
+ <dns>194.179.1.100</dns>
+ <dns>194.179.1.101</dns>
+ </apn>
+ <apn value="movistar.es">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Movistar (USB modems)</name>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone (Airtel)</name>
+ <gsm>
+ <network-id mcc="214" mnc="01"/>
+ <network-id mcc="214" mnc="06"/>
+ <msisdn-query>
+ <ussd>*138#</ussd>
+ </msisdn-query>
+ <apn value="ac.vodafone.es">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>212.73.32.96</dns>
+ <dns>212.73.32.67</dns>
+ </apn>
+ <apn value="airtelnet.es">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Airtel (old)</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>212.73.32.3</dns>
+ <dns>212.73.32.67</dns>
+ </apn>
+ <apn value="mms.vodafone.net">
+ <usage type="mms"/>
+ <name>MMS VODAFONE</name>
+ <username>wap@wap</username>
+ <password>wap125</password>
+ <mmsc>http://mmsc.vodafone.es/servlets/mms</mmsc>
+ <mmsproxy>212.73.32.10:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Yoigo</name>
+ <gsm>
+ <network-id mcc="214" mnc="04"/>
+
+ <voicemail>633</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.248.76.210</dns>
+ <dns>213.248.100.54</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Yoigo MMS</name>
+ <mmsc>http://mmss/</mmsc>
+ <mmsproxy>193.209.134.141:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Jazztel</name>
+ <gsm>
+ <network-id mcc="214" mnc="21"/>
+ <apn value="jazzinternet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <dns>87.216.1.65</dns>
+ <dns>87.216.1.66</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Carrefour Móvil</name>
+ <gsm>
+ <apn value="CARREFOURINTERNET">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- from http://www.tuenti.com/movil/apn-tuenti-movil-android -->
+ <name>Tuenti Móvil</name>
+ <gsm>
+ <network-id mcc="214" mnc="05"/>
+ <apn value="tuenti.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>tuenti</username>
+ <password>tuenti</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- from http://www.eroskimovil.es/geomv/c/pub/en/servicios/datos -->
+ <name>Eroski Móvil</name>
+ <gsm>
+ <network-id mcc="214" mnc="24"/>
+ <apn value="gprs.eroskimovil.es">
+ <name>Eroski Móvil GPRS</name>
+ <username>wap@wap</username>
+ <password>wap125</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- from http://www.llamayamovil.com/internet -->
+ <name>LlamaYa móvil</name>
+ <gsm>
+ <network-id mcc="214" mnc="03"/>
+ <apn value="moreinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- MVNO operating on Orange's network -->
+ <!-- www.amena.com -->
+ <name>Amena</name>
+ <gsm>
+ <network-id mcc="214" mnc="03"/>
+ <apn value="orangeworld">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Ethiopia -->
+<country code="et">
+ <provider>
+ <name>Ethio Telecom</name>
+ <gsm>
+ <network-id mcc="636" mnc="01"/>
+ <balance-check>
+ <ussd>*804#</ussd>
+ </balance-check>
+
+ <apn value="etc.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.55.96.148</dns>
+ <dns>213.55.96.166</dns>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>etc</username>
+ <password>etc</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Faroe Islands -->
+<country code="fo">
+ <provider>
+ <name>Vodafone FO</name>
+ <gsm>
+ <network-id mcc="288" mnc="02"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="vmc.vodafone.fo">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Finland -->
+<country code="fi">
+ <provider>
+ <name>Kuiri</name>
+ <gsm>
+ <network-id mcc="244" mnc="31"/>
+ <apn value="kuirinet">
+ <usage type="internet"/>
+ <name>Kuiri Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Dna</name>
+ <gsm>
+ <network-id mcc="244" mnc="03"/>
+ <!-- Phone number dependent:
+ - Numbers beginning with 044 XXXXXXX turn in to 044 6 XXXXXXX
+ - Numbers beginning with 041 XXXXXXX turn in to 041 6 XXXXXXX
+ - Others case by case
+ http://www.dna.fi/Yrityksille/Matkaviestinpalvelut/LiittymienLisapalvelut/dnafaksivastaaja/Documents/dna_vastaaja_kayttohje_120310.pdf
+ <voicemail/> -->
+ <balance-check>
+ <ussd>*100#</ussd>
+ <dtmf>0800412582</dtmf>
+ <sms text="SALDO">14000</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>dna internet</name>
+ <dns>217.78.192.22</dns>
+ <dns>217.78.192.78</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>dna MMS</name>
+ <username>dna</username>
+ <password>mms</password>
+ <mmsc>http://mmsc.dnafinland.fi</mmsc>
+ <mmsproxy>10.1.1.2:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Dna</name>
+ <gsm>
+ <network-id mcc="244" mnc="04"/>
+ <apn value="internet">
+ <usage type="internet"/>
+ <name>dna internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Dna</name>
+ <gsm>
+ <network-id mcc="244" mnc="12"/>
+ <apn value="internet">
+ <usage type="internet"/>
+ <name>dna internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Dna</name>
+ <gsm>
+ <network-id mcc="244" mnc="13"/>
+ <apn value="internet">
+ <usage type="internet"/>
+ <name>dna internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Elisa</name>
+ <gsm>
+ <network-id mcc="244" mnc="05"/>
+ <voicemail>777</voicemail>
+ <balance-check>
+ <dtmf>080090598</dtmf>
+ <sms text="SALDO">18258</sms>
+ <sms text="PAKETTI">18258</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Saunalahti</name>
+ <gsm>
+ <network-id mcc="244" mnc="21"/>
+
+ <!-- Phone number dependent:
+ - Numbers beginning with 045 67 XXXXX turn in to 045 66 XXXXX
+ - Numbers beginning with 045 63 XXXXX turn in to 045 62 XXXXX
+ - Others case by case
+ http://saunalahti.fi/tuki/gsm/vo/ohjevastaaja.php
+ <voicemail/> -->
+ <balance-check>
+ <sms text="SALDO">16304</sms>
+ <sms text="SALDO">15045</sms>
+ <sms text="KOKOSALDO">16304</sms>
+ <sms text="GSALDO">16304</sms>
+ <sms text="PAKETTI">16304</sms>
+ </balance-check>
+
+ <apn value="internet.saunalahti">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid (contract) NAT (available for all subscribers)</name>
+ <dns>195.74.0.47</dns>
+ <dns>195.197.54.100</dns>
+ </apn>
+ <apn value="internet4">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid (contract) public IP address (needs to be ordered)</name>
+ <dns>195.74.0.47</dns>
+ <dns>195.197.54.100</dns>
+ </apn>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid (no contract)</name>
+ <dns>195.74.0.47</dns>
+ <dns>195.197.54.100</dns>
+ </apn>
+ <apn value="mms.saunalahti.fi">
+ <usage type="mms"/>
+ <name>Saunalahti MMS</name>
+ <mmsc>http://mms.saunalahti.fi:8002/</mmsc>
+ <mmsproxy>62.142.4.197:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sonera</name>
+ <gsm>
+ <network-id mcc="244" mnc="91"/>
+
+ <!-- Phone number dependent:
+ - Numbers beginning with 040 XXXXXXX turns in to 042 XXXXXXX
+ - Others case by case
+ <voicemail/> -->
+ <balance-check>
+ <sms text="EASY SALDO">15400</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>192.89.123.230</dns>
+ <dns>192.89.123.231</dns>
+ </apn>
+ <apn value="prointernet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Prointernet (public IP)</name>
+ <dns>192.89.123.230</dns>
+ <dns>192.89.123.231</dns>
+ </apn>
+ <apn value="telefinland">
+ <usage type="mms"/>
+ <name>TeleFinland MMS</name>
+ <mmsc>http://mms.sonera.net:8002</mmsc>
+ <mmsproxy>195.156.25.33:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Welho</name>
+ <gsm>
+ <apn value="internet.welho.fi">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Wekkula</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Fiji -->
+<country code="fj">
+ <provider>
+ <name>Vodafone / Kidanet</name>
+ <gsm>
+ <network-id mcc="542" mnc="01"/>
+ <msisdn-query>
+ <ussd>*999#</ussd>
+ </msisdn-query>
+ <apn value="vfinternet.fj">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="kidanet.fj">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <!-- http://www.vodafone.com.fj/pages.cfm/personal/services/prepay-flashnet/installation-guide.html -->
+ <apn value="prepay.vfinternet.fj">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- France -->
+<country code="fr">
+ <provider>
+ <name>A Mobile (Auchan Telecom)</name>
+ <gsm>
+ <apn value="wap65">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bouygues Telecom</name>
+ <gsm>
+ <network-id mcc="208" mnc="20"/>
+ <network-id mcc="208" mnc="21"/>
+
+ <voicemail>660</voicemail>
+ <balance-check>
+ <dtmf>630</dtmf>
+ </balance-check>
+
+ <apn value="a2bouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contrat Pro Data Illimité</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ <apn value="b2bouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>B2Bouygtel</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ <apn value="ebouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Forfait Data</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ <apn value="mmsbouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Forfait Data</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ <apn value="pcebouygtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contrat Pro Data</name>
+ <dns>62.201.129.99</dns>
+ </apn>
+ <apn value="mmsbouygtel.com">
+ <usage type="mms"/>
+ <name>Bouygues MMS</name>
+ <mmsc>http://mms.bouyguestelecom.fr/mms/wapenc</mmsc>
+ <mmsproxy>62.201.129.226:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Free Mobile</name>
+ <gsm>
+ <!-- http://mobile.free.fr/faq-config-apn-autres.html -->
+ <network-id mcc="208" mnc="15"/>
+ <apn value="free">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Free-Mobile</name>
+ <username>free</username>
+ <password>free</password>
+ </apn>
+ <apn value="mmsfree">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Free-Mobile</name>
+ </apn>
+ <apn value="mmsfree">
+ <usage type="mms"/>
+ <name>MMS Free</name>
+ <mmsc>http://mms.free.fr</mmsc>
+ <mmsproxy>10.0.0.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="208" mnc="01"/>
+ <network-id mcc="208" mnc="00"/>
+
+ <voicemail>888</voicemail>
+ <balance-check>
+ <ussd>#123#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">#124*CODE#</ussd>
+ </balance-top-up>
+
+ <apn value="orange.fr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Orange Internet</name>
+ <dns>194.51.3.56</dns>
+ <dns>194.51.3.76</dns>
+ </apn>
+ <apn value="internet-entreprise">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business Contract</name>
+ <dns>194.51.3.56</dns>
+ <dns>194.51.3.76</dns>
+ </apn>
+ <apn value="orange">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>No Contract / Mobicarte</name>
+ <username>orange</username>
+ <password>orange</password>
+ <dns>194.51.3.56</dns>
+ <dns>194.51.3.76</dns>
+ </apn>
+ <apn value="orange-mib">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Orange Entreprises</name>
+ <username>mportail</username>
+ <password>mib</password>
+ <dns>172.17.0.2</dns>
+ <dns>172.17.0.4</dns>
+ </apn>
+ <apn value="orange-acte">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Orange MMS</name>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ <apn value="orange.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SFR</name>
+ <gsm>
+ <!-- http://assistance.sfr.fr/internet-partout/Mobile/difference-wap-web/fc-2302-62196 -->
+ <network-id mcc="208" mnc="10"/>
+ <network-id mcc="208" mnc="11"/>
+ <msisdn-query>
+ <sms text="ABCd84367">9445</sms>
+ </msisdn-query>
+ <voicemail>123</voicemail>
+ <balance-check>
+ <dtmf>950</dtmf>
+ </balance-check>
+
+ <apn value="websfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web / Prepaid</name>
+ <dns>172.20.2.10</dns>
+ <dns>172.20.2.39</dns>
+ </apn>
+ <apn value="wapsfr">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ </apn>
+ <apn value="internetpro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR internetpro</name>
+ </apn>
+ <apn value="ipnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR ipnet</name>
+ </apn>
+ <apn value="slsfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <dns>172.20.2.10</dns>
+ <dns>172.20.2.39</dns>
+ </apn>
+ <apn value="sl2sfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Full Internet (Webphone)</name>
+ </apn>
+ <apn value="internetneuf">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet (Neuf Telecom)</name>
+ </apn>
+ <apn value="mms65">
+ <usage type="mms"/>
+ <name>mms65</name>
+ <mmsc>http://mms65</mmsc>
+ <mmsproxy>10.143.156.8</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Transatel Telecom</name>
+ <gsm>
+ <network-id mcc="208" mnc="22"/>
+ <apn value="netgprs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TEN</name>
+ <gsm>
+ <network-id mcc="208" mnc="01"/>
+ <apn value="ao.fr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ <apn value="ofnew.fr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pay-by-MB</name>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ <apn value="orange.acte">
+ <usage type="mms"/>
+ <name>Orange acte</name>
+ <username>orange</username>
+ <password>orange</password>
+ <mmsc>http://mms.orange.fr</mmsc>
+ <mmsproxy>192.168.10.200:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Britain -->
+<country code="gb">
+ <provider>
+ <name>Asda Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="15"/>
+ <apn value="asdamobiles.co.uk">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="asdamobiles.co.uk">
+ <usage type="mms"/>
+ <name>ASDA MMS</name>
+ <username>wap</username>
+ <password>wap</password>
+ <mmsc>http://mms.asdamobiles.co.uk/servlets/mms</mmsc>
+ <mmsproxy>212.183.137.12:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>BT Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="00"/>
+ <apn value="btmobile.bt.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>bt</username>
+ <password>bt</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>giffgaff</name>
+ <gsm>
+ <network-id mcc="234" mnc="02"/>
+ <network-id mcc="234" mnc="10"/>
+ <network-id mcc="234" mnc="11"/>
+ <voicemail>443</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="giffgaff.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>giffgaff</username>
+ <password>password</password>
+ </apn>
+ <apn value="wap.o2.co.uk">
+ <usage type="mms"/>
+ <name>O2 MMS</name>
+ <username>o2wap</username>
+ <password>password</password>
+ <mmsc>http://mmsc.mms.o2.co.uk:8002</mmsc>
+ <mmsproxy>193.113.200.195:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="234" mnc="02"/>
+ <network-id mcc="234" mnc="10"/>
+ <network-id mcc="234" mnc="11"/>
+ <voicemail>901</voicemail>
+ <balance-check>
+ <ussd>*#10#</ussd>
+ <dtmf>4444</dtmf>
+ </balance-check>
+ <apn value="mobile.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <username>o2web</username>
+ <password>password</password>
+ <dns>193.113.200.200</dns>
+ <dns>193.113.200.201</dns>
+ </apn>
+ <apn value="mobile.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract (faster)</name>
+ <username>faster</username>
+ <password>password</password>
+ <dns>193.113.200.200</dns>
+ <dns>193.113.200.201</dns>
+ </apn>
+ <apn value="payandgo.o2.co.uk">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Pay and Go (Prepaid)</name>
+ <username>payandgo</username>
+ <password>payandgo</password>
+ </apn>
+ <apn value="idata.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>iPhone (Contract)</name>
+ <username>vertigo</username>
+ <password>password</password>
+ </apn>
+ <apn value="m-bb.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>o2bb</username>
+ <password>password</password>
+ <dns>82.132.254.2</dns>
+ <dns>82.132.254.3</dns>
+ </apn>
+ <apn value="wap.o2.co.uk">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>o2wap</username>
+ <password>password</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- http://sales.talktalk.co.uk/products/mobile/faq/started.html#A12 -->
+ <name>TalkTalk</name>
+ <gsm>
+ <apn value="mobile.talktalk.co.uk">
+ <gateway>212.183.137.12:8799</gateway>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="30"/>
+ <voicemail>222</voicemail>
+ <balance-check>
+ <dtmf>150</dtmf>
+ <sms text="BA">150</sms>
+ <sms text="AL">150</sms>
+ </balance-check>
+ <apn value="general.t-mobile.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>User</username>
+ <password>mms</password>
+ <dns>149.254.201.126</dns>
+ <dns>149.254.192.126</dns>
+ </apn>
+ <apn value="general.t-mobile.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>149.254.230.7</dns>
+ <dns>149.254.199.126</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tesco Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="02"/>
+ <network-id mcc="234" mnc="10"/>
+ <network-id mcc="234" mnc="11"/>
+ <apn value="prepay.tesco-mobile.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>tescowap</username>
+ <password>password</password>
+ <dns>193.113.200.195</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Virgin Mobile</name>
+ <gsm>
+ <network-id mcc="234" mnc="31"/>
+ <network-id mcc="234" mnc="32"/>
+ <apn value="vdata">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.7.0.138</dns>
+ <dns>196.7.142.132</dns>
+ </apn>
+ <apn value="goto.virginmobile.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>user</username>
+ </apn>
+ <apn value="orange.acte">
+ <usage type="mms"/>
+ <name>VM acte GPRS</name>
+ <username>orange</username>
+ <password>orange</password>
+ <mmsc>http://mms.orange.fr</mmsc>
+ <mmsproxy>192.168.10.200:8080</mmsproxy>
+ </apn>
+ <apn value="vmms">
+ <usage type="mms"/>
+ <name>Virgin MMS</name>
+ <mmsc>http://mms.virginmobile.co.za</mmsc>
+ <mmsproxy>196.31.116.242:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="234" mnc="15"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <voicemail>121</voicemail>
+ <balance-check>
+ <ussd>*#1345#</ussd>
+ <dtmf>2345</dtmf>
+ </balance-check>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <username>web</username>
+ <password>web</password>
+ <dns>10.206.65.68</dns>
+ <dns>10.203.65.68</dns>
+ </apn>
+ <apn value="pp.vodafone.co.uk">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <username>web</username>
+ <password>web</password>
+ <dns>172.29.1.11</dns>
+ <dns>172.29.1.11</dns>
+ </apn>
+ <apn value="ppbundle.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>TopUp and Go</name>
+ <username>web</username>
+ <password>web</password>
+ <dns>10.203.129.68</dns>
+ <dns>10.203.129.68</dns>
+ </apn>
+ <apn value="pp.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>TopUp and Go (older 1GB SIMs)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>3</name>
+ <gsm>
+ <network-id mcc="234" mnc="20"/>
+ <apn value="3internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="three.co.uk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Handsets</name>
+ <dns>172.30.139.17</dns>
+ <dns>172.31.139.17</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="234" mnc="33"/>
+ <network-id mcc="234" mnc="34"/>
+ <voicemail>123</voicemail>
+ <balance-check>
+ <dtmf>453</dtmf>
+ </balance-check>
+ <apn value="orangeinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <username>orange</username>
+ <password>orange</password>
+ <dns>193.35.133.10</dns>
+ <dns>193.35.134.10</dns>
+ </apn>
+ <apn value="internetvpn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract (with VPN)</name>
+ <username>orange</username>
+ <password>orange</password>
+ <dns>193.35.133.10</dns>
+ <dns>193.35.134.10</dns>
+ </apn>
+ <apn value="orangewap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Orange WAP</name>
+ <username>orange</username>
+ <password>multimedia</password>
+ <dns>158.43.192.1</dns>
+ <dns>158.43.128.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Georgia -->
+<country code="ge">
+ <provider>
+ <name>Geocell</name>
+ <gsm>
+ <network-id mcc="282" mnc="01"/>
+ <apn value="Internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.72.130.20</dns>
+ <dns>212.72.152.1</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Geo MMS</name>
+ <mmsc>http://mms.geocell.com.ge/cmmsc/post</mmsc>
+ <mmsproxy>10.11.240.7:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Guernsey -->
+<country code="gg">
+ <provider>
+ <name>Airtel-Vodaphone</name>
+ <gsm>
+ <network-id mcc="234" mnc="03"/>
+ <apn value="airtel-ci-gprs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sure (Cable &amp; Wireless)</name>
+ <gsm>
+ <network-id mcc="234" mnc="55"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Lifestyle MMS</name>
+ <mmsc>http://mmsc.gprs.cw.com/</mmsc>
+ <mmsproxy>10.0.3.101:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wave Telecom</name>
+ <gsm>
+ <network-id mcc="234" mnc="50"/>
+ <apn value="pepper">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.9.0.135</dns>
+ <dns>212.9.0.136</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>pepperMMS</name>
+ <username>mms</username>
+ <mmsc>http://mmsc.surfmail.com/mmsc</mmsc>
+ <mmsproxy>212.9.19.199:3130</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Ghana -->
+<country code="gh">
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="620" mnc="01"/>
+ <balance-check>
+ <ussd>*124#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*125*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="620" mnc="02"/>
+ <msisdn-query>
+ <ussd>*127#</ussd>
+ </msisdn-query>
+ <balance-check>
+ <ussd>*122#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*123*CODE#</ussd>
+ </balance-top-up>
+ <apn value="browse">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="620" mnc="03"/>
+ <balance-check>
+ <ussd>*820#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*842*CODE#</ussd>
+ </balance-top-up>
+ <apn value="web.tigo.com.gh">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Airtel</name>
+ <gsm>
+ <network-id mcc="620" mnc="06"/>
+ <balance-check>
+ <ussd>*133#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*134*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>GloGhana</name>
+ <gsm>
+ <network-id mcc="620" mnc="07"/>
+ <balance-check>
+ <ussd>*124#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*123*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Cosmote MMS</name>
+ <mmsc>http://mmsc.cosmote.gr:8002</mmsc>
+ <mmsproxy>10.10.10.20:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Expresso</name>
+ <cdma>
+ <username>evdo@expresso.com</username>
+ <password>evdo</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Greenland -->
+<country code="gl">
+ <!-- http://www.tele.gl/da-DK/Privat/Info/Selvbetjening/Mobilopsaetning/Sider/ManuelOpsaetning.aspx -->
+ <provider>
+ <name>Tele Greenland A/S</name>
+ <gsm>
+ <apn value="internet">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Greece -->
+<country code="gr">
+ <provider>
+ <name>Cosmote</name>
+ <gsm>
+ <network-id mcc="202" mnc="01"/>
+
+ <voicemail>123</voicemail>
+ <balance-check>
+ <dtmf>1314</dtmf>
+ <sms text="YP">1314</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="202" mnc="05"/>
+ <voicemail>121</voicemail>
+ <balance-check>
+ <dtmf>1252</dtmf>
+ <sms text="Y">1252</sms>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ </apn>
+ <apn value="web.session">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband On Demand</name>
+ <dns>213.249.17.10</dns>
+ <dns>213.249.17.11</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wind</name>
+ <gsm>
+ <network-id mcc="202" mnc="09"/>
+ <network-id mcc="202" mnc="10"/>
+
+ <voicemail>122</voicemail>
+ <voicemail>1333</voicemail>
+ <balance-check>
+ <dtmf>1269</dtmf>
+ <dtmf>1225</dtmf>
+ <sms text="">1269</sms>
+ <sms text="">1225</sms>
+ </balance-check>
+
+ <apn value="gint.b-online.gr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="q-mms.myq.gr">
+ <usage type="mms"/>
+ <name>Q-Telecom MMS</name>
+ <mmsc>http://mms.myq.gr</mmsc>
+ <mmsproxy>192.168.80.134:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Guatemala -->
+<country code="gt">
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="704" mnc="01"/>
+ <apn value="internet.ideasclaro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Comcel / Tigo</name>
+ <gsm>
+ <network-id mcc="704" mnc="02"/>
+ <apn value="Wap.tigo.gt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>Wap</username>
+ <password>Wap</password>
+ </apn>
+ <apn value="mms.tigo.gt">
+ <usage type="mms"/>
+ <name>MMS TIGO</name>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>10.16.17.12:8888</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="704" mnc="03"/>
+ <apn value="internet.movistar.gt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistargt</username>
+ <password>movistargt</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Guyana -->
+<country code="gy">
+ <provider>
+ <name>GT&amp;T Cellink Plus</name>
+ <gsm>
+ <network-id mcc="738" mnc="02"/>
+ <apn value="wap.cellinkgy.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>test</username>
+ <password>test</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>DigiCel</name>
+ <gsm>
+ <network-id mcc="738" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="wap.digicelgy.com">
+ <usage type="mms"/>
+ <name>Digicel Guyana MMS</name>
+ <username>wap</username>
+ <password>wap</password>
+ <mmsc>http://mmc.digicelgy.com/servlets/mms</mmsc>
+ <mmsproxy>172.20.6.12:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Hong Kong -->
+<country code="hk">
+ <provider>
+ <name>CSL</name>
+ <gsm>
+ <network-id mcc="454" mnc="00"/>
+ <network-id mcc="454" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.84.255.1</dns>
+ <dns>203.116.254.150</dns>
+ </apn>
+ <apn value="hkcsl">
+ <usage type="mms"/>
+ <name>CSL MMS</name>
+ <mmsc>http://192.168.58.171:8002</mmsc>
+ <mmsproxy>192.168.59.51:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>New World</name>
+ <gsm>
+ <network-id mcc="454" mnc="10"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="peoples.mms">
+ <usage type="mms"/>
+ <name>CMHK MMS</name>
+ <mmsc>http://mms.hk.chinamobile.com/mms</mmsc>
+ <mmsproxy>172.31.31.36:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>China Mobile</name>
+ <gsm>
+ <network-id mcc="454" mnc="12"/>
+ <apn value="peoples.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="SmarTone-Vodafone">
+ <usage type="mms"/>
+ <name>picturemail</name>
+ <mmsc>http://mms.smartone-vodafone.com/server</mmsc>
+ <mmsproxy>10.9.9.9:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SmarTone</name>
+ <gsm>
+ <network-id mcc="454" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>PCCW (Sunday)</name>
+ <gsm>
+ <network-id mcc="454" mnc="16"/>
+ <network-id mcc="454" mnc="19"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Sunday (Old)</name>
+ </apn>
+ <apn value="pccwdata">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>PCCW 2G/GPRS</name>
+ </apn>
+ <apn value="pccw">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>PCCW 3G</name>
+ </apn>
+ <apn value="pccwmms">
+ <usage type="mms"/>
+ <name>PCCW MMS</name>
+ <mmsc>http://mmsc.mms.pccwmobile.com:8002/</mmsc>
+ <mmsproxy>10.131.2.8:8080</mmsproxy>
+ </apn>
+ <apn value="pccw">
+ <usage type="mms"/>
+ <name>PCCW 3G MMS</name>
+ <mmsc>http://3gmms.pccwmobile.com:8080/was</mmsc>
+ <mmsproxy>10.140.14.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sunday</name>
+ <gsm>
+ <network-id mcc="454" mnc="16"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="454" mnc="04"/>
+ <apn value="web.orangehk.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Three</name>
+ <gsm>
+ <network-id mcc="454" mnc="03"/>
+ <network-id mcc="454" mnc="04"/>
+ <apn value="mobile.three.com.hk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Honduras -->
+<country code="hn">
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="708" mnc="02"/>
+ <apn value="internet.tigo.hn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Croatia -->
+<country code="hr">
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="219" mnc="01"/>
+ <apn value="web.htgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>10.12.0.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>VIPNET</name>
+ <gsm>
+ <network-id mcc="219" mnc="10"/>
+ <apn value="data.vip.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract and Prepaid</name>
+ </apn>
+ <apn value="gprs5.vipnet.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS 5</name>
+ <username>38591</username>
+ <password>38591</password>
+ <dns>195.29.159.15</dns>
+ </apn>
+ <apn value="gprs0.vipnet.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS 0</name>
+ <username>38591</username>
+ <password>38591</password>
+ <dns>195.29.159.15</dns>
+ </apn>
+ <apn value="3g.vip.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G</name>
+ <username>38591</username>
+ <password>38591</password>
+ <dns>212.91.97.3</dns>
+ <dns>212.91.97.4</dns>
+ </apn>
+ <apn value="mms.vipnet.hr">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://mms.vipnet.hr/servlets/mms</mmsc>
+ <mmsproxy>212.91.99.91:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CARNet VIPNET</name>
+ <gsm>
+ <network-id mcc="219" mnc="10"/>
+ <apn value="carnet.vip.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>AAIEDU</username>
+ <password/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CARNet Tele2</name>
+ <gsm>
+ <network-id mcc="219" mnc="02"/>
+ <apn value="carnet.tele2.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>AAIEDU</username>
+ <password/>
+ </apn>
+ <apn value="internet.tele2.hr">
+ <usage type="mms"/>
+ <name>Tele2 MMS</name>
+ <mmsc>http://mmsc.tele2.hr</mmsc>
+ <mmsproxy>193012040066:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="219" mnc="02"/>
+ <apn value="mobileinternet.tele2.hr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.247.156.66</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Hungary -->
+<country code="hu">
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="216" mnc="01"/>
+ <apn value="net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>mobilinternet</name>
+ <dns>217.79.128.40</dns>
+ <dns>217.79.128.45</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Pannon MMS</name>
+ <mmsc>http://mmsc.pgsm.hu/</mmsc>
+ <mmsproxy>84.225.255.1:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>DIGI</name>
+ <gsm>
+ <!-- Using Telenor's network -->
+ <network-id mcc="216" mnc="01"/>
+ <apn value="digi">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>DIGI Move</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="216" mnc="30"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.51.115.1</dns>
+ <dns>194.176.224.6</dns>
+ </apn>
+ <apn value="mms-westel">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>mms</username>
+ <dns>212.51.115.1</dns>
+ <dns>194.176.224.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="216" mnc="70"/>
+ <apn value="standardnet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Előf. Normál</name>
+ <username>vodawap</username>
+ <password>vodawap</password>
+ <dns>80.244.97.30</dns>
+ <dns>80.244.96.1</dns>
+ </apn>
+ <!-- http://www.vodafone.hu/en/support/questions-answers/pay-monthly/internet -->
+ <apn value="internet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Előf. töm.</name>
+ <dns>80.244.97.30</dns>
+ <dns>80.244.96.1</dns>
+ </apn>
+ <apn value="vitamax.snet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Felt. norm.</name>
+ <dns>80.244.97.30</dns>
+ <dns>80.244.96.1</dns>
+ </apn>
+ <apn value="vitamax.internet.vodafone.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone (felt. töm.)</name>
+ <dns>80.244.97.30</dns>
+ <dns>80.244.96.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Invitel</name>
+ <!-- MVNO operating on Telenor's network -->
+ <gsm>
+ <apn value="invitel.mobilnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>net.and.go</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Indonesia -->
+<country code="id">
+ <provider>
+ <name>3</name>
+ <gsm>
+ <network-id mcc="510" mnc="89"/>
+ <apn value="3gprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>3gprs</username>
+ <password>3gprs</password>
+ </apn>
+ <apn value="3data">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Monthly Internet Service</name>
+ <name xml:lang="id">Layanan Internet Bulanan</name>
+ <username>3data</username>
+ <password>3data</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>AXIS</name>
+ <gsm>
+ <network-id mcc="510" mnc="08"/>
+ <apn value="AXIS">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>axis</username>
+ <password>123456</password>
+ </apn>
+ <apn value="AXISmms">
+ <usage type="mms"/>
+ <name>AXISmms</name>
+ <username>AXIS</username>
+ <password>123456</password>
+ <mmsc>http://mmsc.axis</mmsc>
+ <mmsproxy>10.8.3.8:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Indosat</name>
+ <gsm>
+ <network-id mcc="510" mnc="21"/>
+ <network-id mcc="510" mnc="01"/>
+
+ <!-- http://www.indosat.com/Customer_Support/Customer_Support/Setting_GPRS_MMS_WAP_dan_BroadBand -->
+ <!-- http://3g.indosat.com/about/FAQ.php -->
+ <!-- http://www.indosat.com/Mentari/Mentari_Update/Voucher_Internet_Indosat -->
+ <!-- It seems that the APN is pretty much the same for plans -->
+
+ <apn value="indosatgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>IM3/Mentari Time-based</name>
+ <username>indosat@durasi</username>
+ <password>indosat@durasi</password>
+ </apn>
+ <apn value="indosatgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>IM3/Mentari Volume-based</name>
+ <username>indosat</username>
+ <password>indosat</password>
+ </apn>
+ <apn value="indosatgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Matrix 3G/3.5G</name>
+ <username>indosat</username>
+ <password>indosat</password>
+ </apn>
+ <apn value="indosatmms">
+ <usage type="mms"/>
+ <name>IndosatMMS</name>
+ <username>indosat</username>
+ <password>indosat</password>
+ <mmsc>http://mmsc.indosat.com</mmsc>
+ <mmsproxy>10.19.19.19:8080</mmsproxy>
+ </apn>
+ </gsm>
+ <cdma>
+ <name>StarOne</name>
+ <username>starone</username>
+ <password>indosat</password>
+ <sid value="10817"/>
+ <sid value="10819"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telkomsel</name>
+ <gsm>
+ <network-id mcc="510" mnc="10"/>
+ <network-id mcc="510" mnc="20"/>
+
+ <!-- http://www.telkomsel.com/customer-service/manual-setting/ -->
+ <apn value="telkomsel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap123</password>
+ <dns>202.152.0.2</dns>
+ <dns>202.155.14.251</dns>
+ </apn>
+
+ <!-- http://www.telkomsel.com/telkomselflash/telkomsel-flash -->
+ <apn value="flash">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Flash Time-based</name>
+ <username>foo</username>
+ <password>bar</password>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Flash Volume-based</name>
+ <username>foo</username>
+ <password>bar</password>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>TSEL-MMS</name>
+ <username>wap</username>
+ <password>wap123</password>
+ <mmsc>http://mms.telkomsel.com</mmsc>
+ <mmsproxy>10.1.89.150:8000</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Excelcomindo (XL)</name>
+ <gsm>
+ <network-id mcc="510" mnc="11"/>
+ <apn value="www.xlgprs.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>xlgprs</username>
+ <password>proxl</password>
+ <dns>202.152.254.245</dns>
+ <dns>202.152.254.246</dns>
+ </apn>
+ <apn value="www.xlmms.net">
+ <usage type="mms"/>
+ <name>XL-MMS</name>
+ <username>xlgprs</username>
+ <password>proxl</password>
+ <mmsc>http://mmc.xl.net.id/servlets/mms</mmsc>
+ <mmsproxy>202.152.240.50:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SMART</name>
+ <cdma>
+ <username>smart</username>
+ <password>smart</password>
+ <sid value="10608"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Ceria</name>
+ <cdma>
+ <username>internet</username>
+ <password>ceria</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Fren</name>
+ <cdma>
+ <username>m8</username>
+ <password>m8</password>
+ <sid value="10530"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telkom Flexy</name>
+ <cdma>
+ <username>telkomnet@flexi</username>
+ <password>telkom</password>
+ <sid value="10496"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Esia</name>
+ <cdma>
+ <sid value="10623"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Ireland -->
+<country code="ie">
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="272" mnc="02"/>
+ <balance-check>
+ <ussd>*#100#</ussd>
+ </balance-check>
+ <apn value="open.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ <dns>62.40.32.33</dns>
+ <dns>62.40.32.34</dns>
+ </apn>
+ <apn value="pp.internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <username>faster</username>
+ <password>web</password>
+ <dns>62.40.32.33</dns>
+ <dns>62.40.32.34</dns>
+ </apn>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Old Config Internet and MMS</name>
+ </apn>
+ <apn value="internet">
+ <usage type="mms"/>
+ <name>O2 MMS</name>
+ <mmsc>http://mmsc.mms.o2.ie:8002</mmsc>
+ <mmsproxy>62.40.32.40:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="272" mnc="01"/>
+ <msisdn-query>
+ <sms text="MYMSISDN:">50189</sms>
+ </msisdn-query>
+ <apn value="hs.vodafone.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>89.19.64.36</dns>
+ <dns>89.19.64.164</dns>
+ </apn>
+ <apn value="isp.vodafone.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="live.vodafone.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>10.24.59.100</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>E-Mobile</name>
+ <gsm>
+ <network-id mcc="272" mnc="03"/>
+ <!-- Information not found on the web but with the Windows connection software -->
+ <apn value="broadband.eircommbb.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband To Go</name>
+ <dns>212.129.64.220</dns>
+ <dns>212.129.64.221</dns>
+ </apn>
+ <apn value="mms.mymeteor.ie">
+ <usage type="mms"/>
+ <name>MMS over GPRS</name>
+ <username>my</username>
+ <password>wap</password>
+ <mmsc>http://mms.mymeteor.ie</mmsc>
+ <mmsproxy>10.85.85.85:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Meteor</name>
+ <gsm>
+ <network-id mcc="272" mnc="03"/>
+ <apn value="data.mymeteor.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Meteor Data</name>
+ <username>my</username>
+ <password>meteor</password>
+ </apn>
+ <apn value="broadband.mymeteor.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband To Go</name>
+ <dns>212.129.64.220</dns>
+ <dns>212.129.64.221</dns>
+ </apn>
+ <apn value="isp.mymeteor.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>my</username>
+ <password>isp</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Three Ireland</name>
+ <gsm>
+ <network-id mcc="272" mnc="05"/>
+ <apn value="3ireland.ie">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>172.31.140.69</dns>
+ <dns>172.30.140.69</dns>
+ </apn>
+ <apn value="3ireland.ie">
+ <usage type="mms"/>
+ <name>3MMS</name>
+ <mmsc>http://mms.um.3ireland.ie:10021/mmsc</mmsc>
+ <mmsproxy>mms.3ireland.ie:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Israel -->
+<country code="il">
+ <provider>
+ <name>CellCom</name>
+ <gsm>
+ <network-id mcc="425" mnc="02"/>
+ <apn value="internetg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Cellcom MMS</name>
+ <mmsc>http://mms.cellcom.co.il</mmsc>
+ <mmsproxy>vwapm2.ain.co.il:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>GolanTelecom</name>
+ <gsm>
+ <network-id mcc="425" mnc="08"/>
+ <apn value="internet.golantelecom.net.il">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Home Cellular</name>
+ <gsm>
+ <network-id mcc="425" mnc="15"/>
+ <apn value="hcminternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Hot Mobile</name>
+ <gsm>
+ <network-id mcc="425" mnc="07"/>
+ <apn value="net.hotm">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="425" mnc="01"/>
+ <apn value="uinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G Internet</name>
+ <dns>158.43.192.1</dns>
+ <dns>158.43.128.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Pelephone</name>
+ <gsm>
+ <network-id mcc="425" mnc="03"/>
+ <apn value="internet.pelephone.net.il">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G</name>
+ <username>pcl@3g</username>
+ <password>pcl</password>
+ </apn>
+ <apn value="mms.pelephone.net.il">
+ <usage type="mms"/>
+ <name>Multimedia Pelephone</name>
+ <username>pcl@3g</username>
+ <password>pcl</password>
+ <mmsc>mmsu.pelephone.net.il</mmsc>
+ <mmsproxy>10.170.9.54:9093</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Rami Levi</name>
+ <gsm>
+ <network-id mcc="425" mnc="16"/>
+ <apn value="internet.rl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>rl@3g</username>
+ <password>rl</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>YouPhone 3G</name>
+ <gsm>
+ <network-id mcc="425" mnc="14"/>
+ <apn value="data.youphone.co.il">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Isle of Man -->
+<country code="im">
+ <provider>
+ <name>Manx Telecom</name>
+ <gsm>
+ <network-id mcc="234" mnc="58"/>
+ <apn value="3gpronto">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.manxpronto.net">
+ <usage type="mms"/>
+ <name>Pronto MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms.manxpronto.net:8002</mmsc>
+ <mmsproxy>195.10.99.46:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sure (Cable &amp; Wireless)</name>
+ <gsm>
+ <network-id mcc="234" mnc="36"/>
+ <network-id mcc="234" mnc="55"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- India -->
+<country code="in">
+ <provider>
+ <name>AIRCEL</name>
+ <gsm>
+ <network-id mcc="404" mnc="17"/>
+ <network-id mcc="404" mnc="28"/>
+ <network-id mcc="404" mnc="29"/>
+ <network-id mcc="404" mnc="37"/>
+ <network-id mcc="404" mnc="41"/>
+ <network-id mcc="404" mnc="42"/>
+ <network-id mcc="404" mnc="91"/>
+ <network-id mcc="405" mnc="800"/>
+ <network-id mcc="405" mnc="801"/>
+ <network-id mcc="405" mnc="802"/>
+ <network-id mcc="405" mnc="803"/>
+ <network-id mcc="405" mnc="804"/>
+ <network-id mcc="405" mnc="805"/>
+ <network-id mcc="405" mnc="806"/>
+ <network-id mcc="405" mnc="807"/>
+ <network-id mcc="405" mnc="808"/>
+ <network-id mcc="405" mnc="809"/>
+ <network-id mcc="405" mnc="810"/>
+ <network-id mcc="405" mnc="811"/>
+ <network-id mcc="405" mnc="812"/>
+
+ <apn value="aircelweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ </apn>
+ <apn value="aircelgprs">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ </apn>
+ <apn value="aircelgprs.po">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS (Postpaid)</name>
+ </apn>
+ <apn value="aircelgprs.pr">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>GPRS (Prepaid)</name>
+ </apn>
+ <apn value="aircelmms">
+ <usage type="mms"/>
+ <name>Aircel MMS</name>
+ <mmsc>http://172.17.83.67/servlets/mms</mmsc>
+ <mmsproxy>172.17.83.69:8080</mmsproxy>
+ </apn>
+ <apn value="aircelmms.po">
+ <usage type="mms"/>
+ <name>Aircel MMS</name>
+ <mmsc>http://mmsc/mmrelay.app</mmsc>
+ <mmsproxy>192.168.35.196:8081</mmsproxy>
+ </apn>
+ <apn value="aircelmms">
+ <usage type="mms"/>
+ <name>Aircel MMS</name>
+ <mmsc>http://mmsc/mmrelay.app</mmsc>
+ <mmsproxy>192.168.35.196:8081</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Airtel</name>
+ <gsm>
+ <network-id mcc="404" mnc="02"/>
+ <network-id mcc="404" mnc="03"/>
+ <network-id mcc="404" mnc="06"/>
+ <network-id mcc="404" mnc="10"/>
+ <network-id mcc="404" mnc="28"/>
+ <network-id mcc="404" mnc="31"/>
+ <network-id mcc="404" mnc="37"/>
+ <network-id mcc="404" mnc="40"/>
+ <network-id mcc="404" mnc="41"/>
+ <network-id mcc="404" mnc="42"/>
+ <network-id mcc="404" mnc="45"/>
+ <network-id mcc="404" mnc="49"/>
+ <network-id mcc="404" mnc="70"/>
+ <network-id mcc="404" mnc="90"/>
+ <network-id mcc="404" mnc="92"/>
+ <network-id mcc="404" mnc="93"/>
+ <network-id mcc="404" mnc="96"/>
+ <network-id mcc="404" mnc="97"/>
+ <network-id mcc="404" mnc="98"/>
+ <network-id mcc="405" mnc="51"/>
+ <network-id mcc="405" mnc="52"/>
+ <network-id mcc="405" mnc="54"/>
+ <network-id mcc="405" mnc="56"/>
+
+ <apn value="airtelgprs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.56.230.5</dns>
+ <dns>202.56.240.5</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="404" mnc="01"/>
+ <network-id mcc="404" mnc="05"/>
+ <network-id mcc="404" mnc="11"/>
+ <network-id mcc="404" mnc="13"/>
+ <network-id mcc="404" mnc="15"/>
+ <network-id mcc="404" mnc="20"/>
+ <network-id mcc="404" mnc="27"/>
+ <network-id mcc="404" mnc="30"/>
+ <network-id mcc="404" mnc="43"/>
+ <network-id mcc="404" mnc="46"/>
+ <network-id mcc="404" mnc="60"/>
+ <network-id mcc="404" mnc="84"/>
+ <network-id mcc="404" mnc="86"/>
+ <network-id mcc="404" mnc="88"/>
+ <network-id mcc="405" mnc="66"/>
+ <network-id mcc="405" mnc="750"/>
+ <network-id mcc="405" mnc="751"/>
+ <network-id mcc="405" mnc="752"/>
+ <network-id mcc="405" mnc="753"/>
+ <network-id mcc="405" mnc="754"/>
+ <network-id mcc="405" mnc="755"/>
+ <network-id mcc="405" mnc="756"/>
+ <apn value="www">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone Connect</name>
+ </apn>
+ <apn value="portalnmms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Vodafone Live</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>BSNL/CellOne</name>
+ <gsm>
+ <network-id mcc="404" mnc="34"/>
+ <network-id mcc="404" mnc="38"/>
+ <network-id mcc="404" mnc="51"/>
+ <network-id mcc="404" mnc="53"/>
+ <network-id mcc="404" mnc="54"/>
+ <network-id mcc="404" mnc="55"/>
+ <network-id mcc="404" mnc="57"/>
+ <network-id mcc="404" mnc="58"/>
+ <network-id mcc="404" mnc="59"/>
+ <network-id mcc="404" mnc="62"/>
+ <network-id mcc="404" mnc="64"/>
+ <network-id mcc="404" mnc="66"/>
+ <network-id mcc="404" mnc="71"/>
+ <network-id mcc="404" mnc="72"/>
+ <network-id mcc="404" mnc="73"/>
+ <network-id mcc="404" mnc="74"/>
+ <network-id mcc="404" mnc="75"/>
+ <network-id mcc="404" mnc="76"/>
+ <network-id mcc="404" mnc="77"/>
+ <network-id mcc="404" mnc="80"/>
+ <network-id mcc="404" mnc="81"/>
+
+ <!-- http://cellone.in/cellone_msp.htm -->
+ <apn value="bsnlnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>New GPRS/3G</name>
+ </apn>
+
+ <apn value="bsnlwap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>New WAP</name>
+ </apn>
+
+ <apn value="bsnlsouth">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old South Zone A (Karnatka, Andhra Pradesh, Chennai, Tamil Nadu, Kerala)</name>
+ </apn>
+ <apn value="gprssouth.cellone.in">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old South Zone B (Karnatka, Andhra Pradesh, Chennai, Tamil Nadu, Kerala)</name>
+ </apn>
+ <apn value="gprsnorth.cellone.in">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old North Zone (Haryana, Punjab, UP(East), UP(West), Himachal Pradesh, Rajasthan, Jammu &amp; Kashmir)</name>
+ </apn>
+ <apn value="gprswest.cellone.in">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old West Zone (Maharashtra, Gujrat, Madhya Pradesh, Chattishgarh)</name>
+ </apn>
+ <apn value="www.e.pr">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Old East Zone Prepaid (Jharkhand, Bihar, Kolkata, West Bengal, Orissa, Assam, North East, Adman Nicobar)</name>
+ <dns>218.248.240.208</dns>
+ <dns>218.248.240.135</dns>
+ </apn>
+ <apn value="www.e.po">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Old East Zone Postpaid (Jharkhand, Bihar, Kolkata, West Bengal, Orissa, Assam, North East, Adman Nicobar)</name>
+ <dns>218.248.240.208</dns>
+ <dns>218.248.240.135</dns>
+ </apn>
+ <apn value="bsnlmms">
+ <usage type="mms"/>
+ <name>BSNL MMS</name>
+ <mmsc>http://bsnlmmsc.in:8514</mmsc>
+ <mmsproxy>10.210.10.11:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Idea Cellular</name>
+ <gsm>
+ <network-id mcc="404" mnc="04"/>
+ <network-id mcc="404" mnc="07"/>
+ <network-id mcc="404" mnc="12"/>
+ <network-id mcc="404" mnc="14"/>
+ <network-id mcc="404" mnc="19"/>
+ <network-id mcc="404" mnc="22"/>
+ <network-id mcc="404" mnc="24"/>
+ <network-id mcc="404" mnc="44"/>
+ <network-id mcc="404" mnc="56"/>
+ <network-id mcc="404" mnc="82"/>
+ <network-id mcc="405" mnc="70"/>
+ <network-id mcc="405" mnc="799"/>
+ <network-id mcc="405" mnc="845"/>
+ <network-id mcc="405" mnc="848"/>
+ <network-id mcc="405" mnc="850"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>MMS Idea GPRS</name>
+ <mmsc>http://mms.idea.pl</mmsc>
+ <mmsproxy>192.168.6.104:8080</mmsproxy>
+ </apn>
+ <apn value="mmsc">
+ <usage type="mms"/>
+ <name>Idea MMS</name>
+ <mmsc>http://10.4.42.21:8002</mmsc>
+ <mmsproxy>10.4.42.15:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTNL</name>
+ <gsm>
+ <network-id mcc="404" mnc="68"/>
+ <network-id mcc="404" mnc="69"/>
+ <apn value="mtnl.net">
+ <usage type="internet"/>
+ <name>Delhi (3G Prepaid / Postpaid)</name>
+ <username>mtnl</username>
+ <password>mtnl123</password>
+ </apn>
+ <apn value="mtnl.net">
+ <usage type="internet"/>
+ <name>Mumbai (3G Prepaid / Postpaid)</name>
+ </apn>
+ <apn value="gprsmtnldel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Delhi</name>
+ <username>mtnl</username>
+ <password>mtnl123</password>
+ </apn>
+ <apn value="gprsppsmum">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Mumbai (Prepaid)</name>
+ <username>mtnl</username>
+ <password>mtnl123</password>
+ </apn>
+ <apn value="gprsmtnlmum">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mumbai (Postpaid / Plan 2)</name>
+ <username>mtnl</username>
+ <password>mtnl123</password>
+ </apn>
+ <apn value="mmsmtnldel">
+ <usage type="mms"/>
+ <name>MTNL MMS</name>
+ <mmsc>http://172.16.31.136/mms/</mmsc>
+ <mmsproxy>172.16.31.136:9401</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Reliance</name>
+ <gsm>
+ <network-id mcc="404" mnc="09"/>
+ <network-id mcc="404" mnc="36"/>
+ <network-id mcc="404" mnc="52"/>
+ <network-id mcc="404" mnc="83"/>
+ <network-id mcc="404" mnc="85"/>
+ <network-id mcc="405" mnc="05"/>
+ <network-id mcc="405" mnc="10"/>
+ <network-id mcc="405" mnc="13"/>
+ <apn value="smartnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Smart Net</name>
+ </apn>
+ <apn value="smartwap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Smart WAP</name>
+ </apn>
+ <apn value="rcomnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Netconnect (RCOMNET)</name>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>RMMS</name>
+ <mmsc>http://10.239.221.47/mms/</mmsc>
+ <mmsproxy>10.239.221.7:8080</mmsproxy>
+ </apn>
+ <apn value="rcommms">
+ <usage type="mms"/>
+ <name>Reliance MMS</name>
+ <mmsc>http://mmsc.rcom.co.in/mms/</mmsc>
+ <mmsproxy>10.239.221.5:8080</mmsproxy>
+ </apn>
+ </gsm>
+ <cdma>
+ <name>Reliance Netconnect</name>
+ <sid value="14655"/>
+ <sid value="14656"/>
+ <sid value="14657"/>
+ <sid value="14658"/>
+ <sid value="14659"/>
+ <sid value="14660"/>
+ <sid value="14661"/>
+ <sid value="14662"/>
+ <sid value="14663"/>
+ <sid value="14664"/>
+ <sid value="14665"/>
+ <sid value="14666"/>
+ <sid value="14667"/>
+ <sid value="14668"/>
+ <sid value="14669"/>
+ <sid value="14670"/>
+ <sid value="14671"/>
+ <sid value="14672"/>
+ <sid value="14673"/>
+ <sid value="14674"/>
+ <sid value="14675"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Spice telecom</name>
+ <gsm>
+ <network-id mcc="404" mnc="14"/>
+ <network-id mcc="404" mnc="44"/>
+
+ <apn value="Simplyenjoy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>spice</username>
+ <password>spice</password>
+ </apn>
+ <apn value="simplydownload">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>kar</name>
+ </apn>
+ <apn value="mmsc">
+ <usage type="mms"/>
+ <name>Idea MMS</name>
+ <mmsc>http://10.4.42.21:8002/</mmsc>
+ <mmsproxy>10.4.42.15:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tata Docomo</name>
+ <gsm>
+ <network-id mcc="405" mnc="025"/>
+ <network-id mcc="405" mnc="026"/>
+ <network-id mcc="405" mnc="027"/>
+ <network-id mcc="405" mnc="029"/>
+ <network-id mcc="405" mnc="030"/>
+ <network-id mcc="405" mnc="031"/>
+ <network-id mcc="405" mnc="032"/>
+ <network-id mcc="405" mnc="034"/>
+ <network-id mcc="405" mnc="035"/>
+ <network-id mcc="405" mnc="036"/>
+ <network-id mcc="405" mnc="037"/>
+ <network-id mcc="405" mnc="038"/>
+ <network-id mcc="405" mnc="039"/>
+ <network-id mcc="405" mnc="041"/>
+ <network-id mcc="405" mnc="042"/>
+ <network-id mcc="405" mnc="043"/>
+ <network-id mcc="405" mnc="044"/>
+ <network-id mcc="405" mnc="045"/>
+ <network-id mcc="405" mnc="046"/>
+ <network-id mcc="405" mnc="047"/>
+
+ <apn value="TATA.DOCOMO.INTERNET">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="TATADOCOMO3G">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="TATA.DOCOMO.MMS">
+ <usage type="mms"/>
+ <name>TATA DOCOMO MMS</name>
+ <mmsc>http://mmsc/</mmsc>
+ <mmsproxy>10.124.26.94:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tata Indicom (Plug2Surf)</name>
+ <cdma>
+ <username>internet</username>
+ <password>internet</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Tata Indicom (Photon+)</name>
+ <cdma>
+ <username>internet</username>
+ <password>internet</password>
+ <sid value="14836"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>MTS MBlaze</name>
+ <cdma>
+ <username>internet@internet.mtsindia.in</username>
+ <password>mts</password>
+ <sid value="14554"/>
+ <sid value="14555"/>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Iraq -->
+<country code="iq">
+ <provider>
+ <name>Itisaluna</name>
+ <cdma>
+ <username>itisaluna</username>
+ <password>itisaluna</password>
+ <sid value="15456"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Omnea Telecom</name>
+ <cdma>
+ <username>omnea</username>
+ <password>omnea</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Kalimat Telecom</name>
+ <cdma>
+ <sid value="15470"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Korek</name>
+ <gsm>
+ <network-id mcc="418" mnc="40"/>
+ <apn value="net.korek.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>korek</username>
+ <password>korek</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Asia Cell</name>
+ <gsm>
+ <network-id mcc="418" mnc="50"/>
+ <apn value="net.asiacell.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mtnirancell">
+ <usage type="mms"/>
+ <name>Irancell-MMS</name>
+ <mmsc>http://mms:8002</mmsc>
+ <mmsproxy>10.131.26.138:9200</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Iran -->
+<country code="ir">
+ <provider>
+ <name>همراه اول</name>
+ <gsm>
+ <network-id mcc="432" mnc="11"/>
+ <apn value="mcinet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ایرانسل</name>
+ <gsm>
+ <network-id mcc="432" mnc="35"/>
+ <apn value="mtnirancell">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Iceland -->
+<country code="is">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="274" mnc="02"/>
+ <network-id mcc="274" mnc="03"/>
+ <apn value="vmc.gprs.is">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.176.128.51</dns>
+ <dns>213.176.128.50</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nova</name>
+ <gsm>
+ <network-id mcc="274" mnc="11"/>
+ <apn value="internet.nova.is">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>192.168.190.54</dns>
+ <dns>192.168.190.55</dns>
+ </apn>
+ <apn value="mms.nova.is">
+ <usage type="mms"/>
+ <name>Nova MMS</name>
+ <mmsc>http://mmsc.nova.is</mmsc>
+ <mmsproxy>10.10.2.60:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Síminn</name>
+ <gsm>
+ <network-id mcc="274" mnc="01"/>
+ <apn value="wap.simi.is">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.105.224.1</dns>
+ <dns>212.30.200.200</dns>
+ </apn>
+ <apn value="mms.simi.is">
+ <usage type="mms"/>
+ <name>Siminn MMS</name>
+ <mmsc>http://mms.simi.is/servlets/mms</mmsc>
+ <mmsproxy>213.167.138.200:9201</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Italy -->
+<country code="it">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="222" mnc="10"/>
+ <apn value="mobile.vodafone.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ </apn>
+ <apn value="web.omnitel.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Facile (old)</name>
+ <dns>83.224.70.62</dns>
+ <dns>83.224.70.78</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TIM</name>
+ <gsm>
+ <network-id mcc="222" mnc="01"/>
+ <apn value="ibox.tim.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Maxxi Alice/Internet</name>
+ <dns>217.200.200.42</dns>
+ <dns>213.230.129.10</dns>
+ </apn>
+ <apn value="wap.tim.it">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>WAPTIM</username>
+ <dns>213.230.155.94</dns>
+ <dns>213.230.130.222</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wind</name>
+ <gsm>
+ <network-id mcc="222" mnc="88"/>
+ <apn value="internet.wind">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Non-business</name>
+ <username>Wind</username>
+ <password>Wind</password>
+ <dns>193.70.152.25</dns>
+ <dns>193.70.192.25</dns>
+ </apn>
+ <apn value="internet.wind.biz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business</name>
+ <username>Wind</username>
+ <password>Wind</password>
+ <dns>193.70.152.25</dns>
+ <dns>193.70.192.25</dns>
+ </apn>
+ <apn value="mms.wind">
+ <usage type="mms"/>
+ <name>WIND MMS</name>
+ <mmsc>http://mms.wind.it</mmsc>
+ <mmsproxy>212.245.244.100:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>3</name>
+ <gsm>
+ <network-id mcc="222" mnc="99"/>
+ <apn value="tre.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Ricaricabile</name>
+ <dns>62.13.169.92</dns>
+ <dns>62.13.169.93</dns>
+ </apn>
+ <apn value="datacard.tre.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Abbonamento</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Fastweb</name>
+ <gsm>
+ <network-id mcc="222" mnc="99"/>
+ <apn value="apn.fastweb.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Voce/dati</name>
+ </apn>
+ <apn value="datacard.fastweb.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Solo dati</name>
+ <dns>213.140.2.43</dns>
+ <dns>213.140.2.49</dns>
+ </apn>
+ <apn value="tre.it">
+ <usage type="mms"/>
+ <name>3 MMS</name>
+ <mmsc>http://10.216.59.240:10021/mmsc</mmsc>
+ <mmsproxy>wsb.treumts.it:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>PosteMobile</name>
+ <gsm>
+ <network-id mcc="222" mnc="10"/>
+ <apn value="internet.postemobile.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.postemobile.it">
+ <usage type="mms"/>
+ <name>PosteMobile MMS</name>
+ <mmsc>http://mms.postemobile.it/servlets/mms</mmsc>
+ <mmsproxy>10.128.224.10:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CoopVoce</name>
+ <gsm>
+ <network-id mcc="222" mnc="01"/>
+ <apn value="web.coopvoce.it">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Mobile</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- MVNO operating on 3's network -->
+ <!-- www.bip.it -->
+ <name>Bip</name>
+ <gsm>
+ <network-id mcc="222" mnc="99"/>
+ <apn value="internet.vistream.it">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Megabip Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <!-- Full MVNO with an own MNC code -->
+ <name>Nòverca</name>
+ <gsm>
+ <network-id mcc="222" mnc="07"/>
+ <apn value="web.noverca.it">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Noverca WEB</name>
+ </apn>
+ <apn value="mms.noverca.it">
+ <usage type="mms"/>
+ <name>Noverca MMS</name>
+ <mmsc>http://mms.noverca.it/</mmsc>
+ <mmsproxy>10.248.1.12:80</mmsproxy>
+ </apn>
+ <apn value="wap.noverca.it">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Noverca WAP</name>
+ <gateway>10.248.1.12:80</gateway>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- MVNO operating on TIM's network -->
+ <name>Tiscali</name>
+ <gsm>
+ <network-id mcc="222" mnc="01"/>
+ <apn value="tiscalimobileinternet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Tiscali Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Jersey -->
+<country code="je">
+ <provider>
+ <name>Airtel-Vodaphone</name>
+ <gsm>
+ <network-id mcc="234" mnc="03"/>
+ <apn value="airtel-ci-gprs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sure (Cable &amp; Wireless)</name>
+ <gsm>
+ <network-id mcc="234" mnc="55"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Jersey Telecom</name>
+ <gsm>
+ <network-id mcc="234" mnc="50"/>
+ <apn value="pepper">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>abc</username>
+ <password>abc</password>
+ <dns>212.9.0.135</dns>
+ <dns>212.9.0.136</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Jamaica -->
+<country code="jm">
+ <provider>
+ <name>Cable &amp; Wireless</name>
+ <gsm>
+ <network-id mcc="338" mnc="020"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Digicel</name>
+ <gsm>
+ <network-id mcc="338" mnc="050"/>
+ <apn value="web.digiceljamaica.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wapuser</username>
+ <password>wap03jam</password>
+ <dns>208.131.176.126</dns>
+ <dns>200.10.152.232</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Hashemite Kingdom of Jordan -->
+<country code="jo">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="416" mnc="77"/>
+ <apn value="net.orange.jo">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>net</username>
+ <password>net</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="416" mnc="01"/>
+ <apn value="zain">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>Zain</username>
+ <password>Zain</password>
+ </apn>
+ <apn value="Zain">
+ <usage type="mms"/>
+ <name>Zain-MMS</name>
+ <mmsc>http://10.122.200.12:8002</mmsc>
+ <mmsproxy>10.122.200.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Japan -->
+<country code="jp">
+ <provider>
+ <name>Softbank Mobile</name>
+ <gsm>
+ <network-id mcc="440" mnc="04"/>
+ <network-id mcc="440" mnc="06"/>
+ <network-id mcc="440" mnc="20"/>
+ <network-id mcc="440" mnc="40"/>
+ <network-id mcc="440" mnc="41"/>
+ <network-id mcc="440" mnc="42"/>
+ <network-id mcc="440" mnc="43"/>
+ <network-id mcc="440" mnc="44"/>
+ <network-id mcc="440" mnc="45"/>
+ <network-id mcc="440" mnc="46"/>
+ <network-id mcc="440" mnc="47"/>
+ <network-id mcc="440" mnc="48"/>
+ <network-id mcc="440" mnc="90"/>
+ <network-id mcc="440" mnc="92"/>
+ <network-id mcc="440" mnc="93"/>
+ <network-id mcc="440" mnc="94"/>
+ <network-id mcc="440" mnc="95"/>
+ <network-id mcc="440" mnc="96"/>
+ <network-id mcc="440" mnc="97"/>
+ <network-id mcc="440" mnc="98"/>
+ <apn value="softbank">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>ai@softbank</username>
+ <password>softbank</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>b-mobile</name>
+ <gsm>
+ <network-id mcc="440" mnc="10"/>
+ <apn value="dm.jplat.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>u300</name>
+ <username>bmobile@u300</username>
+ <password>bmobile</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>e-mobile</name>
+ <gsm>
+ <network-id mcc="440" mnc="00"/>
+ <apn value="emb.ne.jp">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>em</username>
+ <password>em</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>NTTdocomo</name>
+ <gsm>
+ <network-id mcc="440" mnc="01"/>
+ <network-id mcc="440" mnc="02"/>
+ <network-id mcc="440" mnc="03"/>
+ <network-id mcc="440" mnc="09"/>
+ <network-id mcc="440" mnc="10"/>
+ <network-id mcc="440" mnc="11"/>
+ <network-id mcc="440" mnc="12"/>
+ <network-id mcc="440" mnc="13"/>
+ <network-id mcc="440" mnc="14"/>
+ <network-id mcc="440" mnc="15"/>
+ <network-id mcc="440" mnc="16"/>
+ <network-id mcc="440" mnc="17"/>
+ <network-id mcc="440" mnc="18"/>
+ <network-id mcc="440" mnc="19"/>
+ <network-id mcc="440" mnc="21"/>
+ <network-id mcc="440" mnc="22"/>
+ <network-id mcc="440" mnc="23"/>
+ <network-id mcc="440" mnc="24"/>
+ <network-id mcc="440" mnc="25"/>
+ <network-id mcc="440" mnc="26"/>
+ <network-id mcc="440" mnc="27"/>
+ <network-id mcc="440" mnc="28"/>
+ <network-id mcc="440" mnc="29"/>
+ <network-id mcc="440" mnc="30"/>
+ <network-id mcc="440" mnc="31"/>
+ <network-id mcc="440" mnc="32"/>
+ <network-id mcc="440" mnc="33"/>
+ <network-id mcc="440" mnc="34"/>
+ <network-id mcc="440" mnc="35"/>
+ <network-id mcc="440" mnc="36"/>
+ <network-id mcc="440" mnc="37"/>
+ <network-id mcc="440" mnc="38"/>
+ <network-id mcc="440" mnc="39"/>
+ <network-id mcc="440" mnc="49"/>
+ <network-id mcc="440" mnc="58"/>
+ <network-id mcc="440" mnc="60"/>
+ <network-id mcc="440" mnc="61"/>
+ <network-id mcc="440" mnc="62"/>
+ <network-id mcc="440" mnc="63"/>
+ <network-id mcc="440" mnc="64"/>
+ <network-id mcc="440" mnc="65"/>
+ <network-id mcc="440" mnc="66"/>
+ <network-id mcc="440" mnc="67"/>
+ <network-id mcc="440" mnc="68"/>
+ <network-id mcc="440" mnc="69"/>
+ <network-id mcc="440" mnc="87"/>
+ <network-id mcc="440" mnc="99"/>
+
+ <apn value="mopera.ne.jp">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>mopera</name>
+ </apn>
+ <apn value="mopera.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>mopera U</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>au(KDDI)</name>
+ <cdma>
+ <username>au@au-win.ne.jp</username>
+ <password>au</password>
+ <dns>210.196.3.183</dns>
+ <dns>210.141.112.163</dns>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Kenya -->
+<country code="ke">
+ <provider>
+ <name>Airtel</name>
+ <gsm>
+ <network-id mcc="639" mnc="03"/>
+ <apn value="ke.celtel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.yu.co.ke">
+ <usage type="mms"/>
+ <name>YU mms</name>
+ <mmsc>http://mms.yu.co.ke</mmsc>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Safaricom</name>
+ <gsm>
+ <!--http://www.safaricom.co.ke/personal/internet/getting-started/handset-setting -->
+ <network-id mcc="639" mnc="02"/>
+ <balance-check>
+ <ussd>*144#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*544*CODE#</ussd>
+ </balance-top-up>
+ <apn value="safaricom">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Safaricom (Prepaid)</name>
+ <username>saf</username>
+ <password>data</password>
+ </apn>
+ <apn value="safaricom">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <apn value="mms.safaricom.com">
+ <usage type="mms"/>
+ <name>Safaricom MMS</name>
+ <username>saf</username>
+ <password>data</password>
+ <mmsc>http://mms.gprs.safaricom.com</mmsc>
+ <mmsproxy>172.22.2.38:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>yu (Econet)</name>
+ <gsm>
+ <network-id mcc="639" mnc="05"/>
+ <apn value="internet.econet.co.ke">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="639" mnc="07"/>
+ <apn value="bew.orange.co.ke">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ <cdma>
+ <name>Orange Fixed Plus</name>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Kyrgyzstan -->
+<country code="kg">
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="437" mnc="01"/>
+ <balance-check>
+ <ussd>*102#</ussd>
+ </balance-check>
+ <apn value="internet.beeline.kg">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MegaCom</name>
+ <gsm>
+ <network-id mcc="437" mnc="05"/>
+ <balance-check>
+ <ussd>*500#</ussd>
+ </balance-check>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O!</name>
+ <gsm>
+ <network-id mcc="437" mnc="09"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>FONEX</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>nexi (mir+kg)</name>
+ <name xml:lang="ru">Зона Мир+КГ</name>
+ <cdma>
+ <username>555@mir</username>
+ <password>555</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>nexi (kg)</name>
+ <name xml:lang="ru">Зона КГ</name>
+ <cdma>
+ <username>999@kg</username>
+ <password>999</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Cambodia -->
+<country code="kh">
+ <provider>
+ <name>Cellcard</name>
+ <gsm>
+ <network-id mcc="456" mnc="01"/>
+
+ <balance-check>
+ <ussd>#124#</ussd>
+ </balance-check>
+
+ <!-- http://www.cellcard.com.kh/en/service/data_3.5G_internet.php -->
+ <apn value="cellcard">
+ <usage type="internet"/>
+ <username>mobitel</username>
+ <password>mobitel</password>
+ </apn>
+ <apn value="internet">
+ <usage type="mms"/>
+ <name>Mobitel MMS</name>
+ <username>mobitel</username>
+ <password>internet</password>
+ <mmsc>http://mms.mobitel.si/servlets/mms</mmsc>
+ <mmsproxy>213.229.249.40:8080</mmsproxy>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>GPRS MMS</name>
+ <username>mobitel</username>
+ <password>mobitel</password>
+ <mmsc>http://mms.mobitel.com.kh/mmsc</mmsc>
+ <mmsproxy>203.144.95.98:3130</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Hello</name>
+ <gsm>
+ <network-id mcc="456" mnc="02"/>
+
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+
+ <!-- http://www.tmic.com.kh/public/mobile_broadband/mobile_broadband.aspx?page=broadband_faq -->
+ <!-- in reality any APN value works -->
+ <apn value="hellowww">
+ <usage type="internet"/>
+ </apn>
+ <apn value="hellomms">
+ <usage type="mms"/>
+ <name>Hellow MMS</name>
+ <mmsc>http://mms.iq2mobile.com</mmsc>
+ <mmsproxy>192.168.205.20:8088</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>qb</name>
+ <gsm>
+ <network-id mcc="456" mnc="04"/>
+
+ <balance-check>
+ <ussd>#132#</ussd>
+ </balance-check>
+
+ <!-- http://www.qbmore.com/download/handsetconfiguration.html -->
+ <apn value="WAP">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Smart Mobile</name>
+ <gsm>
+ <network-id mcc="456" mnc="06"/>
+
+ <balance-check>
+ <ussd>*888#</ussd>
+ </balance-check>
+
+ <!-- http://www.smart.com.kh/en/services/internet -->
+ <apn value="smart">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Metfone</name>
+ <gsm>
+ <network-id mcc="456" mnc="08"/>
+
+ <balance-check>
+ <ussd>*097#</ussd>
+ </balance-check>
+
+ <!-- http://metfone.com.kh/home/metfone.mf?id=20&task=detailpac -->
+ <apn value="metfone">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="456" mnc="09"/>
+
+ <balance-check>
+ <ussd>*102#</ussd>
+ </balance-check>
+
+ <!-- in reality any APN value works -->
+ <apn value="gprs.beeline.com.kh">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Excell</name>
+ <!-- mcc="456" mnc="11" -->
+ <cdma/>
+ </provider>
+ <provider>
+ <name>Mfone</name>
+ <gsm>
+ <network-id mcc="456" mnc="18"/>
+
+ <balance-check>
+ <ussd>*222#</ussd>
+ </balance-check>
+
+ <!-- http://www.mfone.com.kh/images/3g/mfone_3g.pdf -->
+ <apn value="Mfone">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Korea, Republic of -->
+<country code="kr">
+ <provider>
+ <name>KTF</name>
+ <gsm>
+ <network-id mcc="450" mnc="08"/>
+ <apn value="hsdpa-internet.ktfwing.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ <cdma>
+ <!-- cid: "016" -->
+ <username>ktf</username>
+ <password>ktf</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>LGUPlus</name>
+ <gsm>
+ <network-id mcc="450" mnc="06"/>
+ <apn value="internet.lguplus.co.kr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ <cdma>
+ <!-- cid: "109" -->
+ <!--
+ username must be xxxx(yournumber)@lgt.co.kr and
+ password must be your last 4 number
+ <username>number@lgt.co.kr</username>
+ <password></password>
+ -->
+ </cdma>
+ </provider>
+ <provider>
+ <name>SKTelecom</name>
+ <gsm>
+ <network-id mcc="450" mnc="05"/>
+ <apn value="nate.sktelecom.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.sktelecom.com">
+ <usage type="mms"/>
+ <name>SKT MMS</name>
+ <mmsc>http://omms.nate.com:9082/oma_mms</mmsc>
+ <mmsproxy>smart.nate.com:9093</mmsproxy>
+ </apn>
+ </gsm>
+ <cdma>
+ <!-- cid: 1501 -->
+ <username>sktelecom</username>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Kuwait -->
+<country code="kw">
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="419" mnc="02"/>
+ <apn value="pps">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Personal</name>
+ <username>pps</username>
+ <password>pps</password>
+ </apn>
+ <apn value="apn01">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Corporate</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wataniya</name>
+ <gsm>
+ <network-id mcc="419" mnc="03"/>
+ <apn value="action.wataniya.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.wataniya.com">
+ <usage type="mms"/>
+ <name>MMS Action</name>
+ <mmsc>http://action.wataniya.com</mmsc>
+ <mmsproxy>194.126.53.64:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Viva</name>
+ <gsm>
+ <network-id mcc="419" mnc="04"/>
+ <apn value="viva">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="viva">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://172.16.128.80:38090/was</mmsc>
+ <mmsproxy>172.16.128.228:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Kazakhstan -->
+<country code="kz">
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="401" mnc="01"/>
+ <apn value="internet.beeline.kz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>@internet.beeline</username>
+ <dns>212.19.149.53</dns>
+ <dns>194.226.128.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>K&apos;CELL</name>
+ <gsm>
+ <network-id mcc="401" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>kcell mms</name>
+ <mmsc>http://192.168.75.10:6001/MM1Servlet</mmsc>
+ <mmsproxy>195.47.255.15:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- Owned by K'CELL -->
+ <name>Activ</name>
+ <gsm>
+ <network-id mcc="401" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="401" mnc="77"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Pathword</name>
+ <cdma>
+ <username>Pathword</username>
+ <password>Pathword</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Dalacom</name>
+ <cdma>
+ <username>Dalacom</username>
+ <password>Dalacom</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Laos -->
+<country code="la">
+ <provider>
+ <name>ETL</name>
+ <gsm>
+ <network-id mcc="457" mnc="02"/>
+ <apn value="etlnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>192.168.4.130</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Lao Telecom</name>
+ <gsm>
+ <network-id mcc="457" mnc="01"/>
+ <balance-check>
+ <ussd>*122#</ussd>
+ </balance-check>
+ <apn value="ltcnet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Unitel</name>
+ <gsm>
+ <network-id mcc="457" mnc="03"/>
+ <apn value="startelecom">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Unitel (2G)</name>
+ </apn>
+ <apn value="unitel3g">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Unitel (3G)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beeline (Tigo)</name>
+ <gsm>
+ <network-id mcc="457" mnc="08"/>
+ <apn value="beelinenet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Lebanon -->
+<country code="lb">
+ <provider>
+ <name>MTC Touch</name>
+ <gsm>
+ <network-id mcc="415" mnc="03"/>
+ <apn value="gprs.mtctouch.com.lb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.mtctouch.com.lb">
+ <usage type="mms"/>
+ <name>mtctouch MMS</name>
+ <username>mtctouch</username>
+ <mmsc>http://mms:8088/mms/</mmsc>
+ <mmsproxy>192.168.4.103:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- St Lucia -->
+<country code="lc">
+ <provider>
+ <name>Cable &amp; Wireless</name>
+ <gsm>
+ <network-id mcc="358" mnc="110"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="multimedia">
+ <usage type="mms"/>
+ <name>MMS Postpaid</name>
+ <mmsc>http://mmsc</mmsc>
+ <mmsproxy>10.20.5.34:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Sri Lanka -->
+<country code="lk">
+ <provider>
+ <name>Airtel</name>
+ <gsm>
+ <network-id mcc="413" mnc="05"/>
+ <apn value="www.wap.airtel.lk">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Dialog GSM</name>
+ <gsm>
+ <network-id mcc="413" mnc="02"/>
+ <apn value="www.dialogsl.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ </apn>
+ <apn value="ppinternet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ </apn>
+ <apn value="dialogbb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Unlimited Broadband</name>
+ </apn>
+ <apn value="kitbb.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid (Kitbb)</name>
+ </apn>
+ <apn value="www.dialogsl.com">
+ <usage type="mms"/>
+ <name>Dialog - Go MMS</name>
+ <mmsc>http://192.168.122.130:3130/mmsc</mmsc>
+ <mmsproxy>192.168.122.2:8080</mmsproxy>
+ </apn>
+ <apn value="ppwap">
+ <usage type="mms"/>
+ <name>Go MMS for KIT</name>
+ <mmsc>http://mms.dialog.lk:3130/mmsc</mmsc>
+ <mmsproxy>192.168.122.2:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Hutch</name>
+ <gsm>
+ <network-id mcc="413" mnc="08"/>
+ <apn value="htwap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mobitel</name>
+ <gsm>
+ <network-id mcc="413" mnc="01"/>
+ <apn value="isp">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="413" mnc="03"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Lesotho -->
+<country code="ls">
+ <provider>
+ <name>Vodacom Lesotho</name>
+ <gsm>
+ <network-id mcc="651" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Lithuania -->
+<country code="lt">
+ <provider>
+ <name>Bite</name>
+ <gsm>
+ <network-id mcc="246" mnc="02"/>
+ <apn value="banga">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.226.131.131</dns>
+ <dns>193.219.88.36</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>BITE mms</name>
+ <username>mms@mms</username>
+ <password>mms</password>
+ <mmsc>http://mmsc/servlets/mms</mmsc>
+ <mmsproxy>192.168.150.2:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TELE2 GPRS</name>
+ <gsm>
+ <network-id mcc="246" mnc="03"/>
+ <apn value="internet.tele2.lt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.tele2.lt">
+ <usage type="mms"/>
+ <name>Tele2 MMS</name>
+ <username>wap</username>
+ <password>wap</password>
+ <mmsc>http://mmsc.tele2.lt</mmsc>
+ <mmsproxy>193.12.40.29:8080</mmsproxy>
+ </apn>
+ <apn value="mms.tele2.lv">
+ <usage type="mms"/>
+ <name>Tele2 MMS</name>
+ <username>wap</username>
+ <password>wap</password>
+ <mmsc>http://mmsc.tele2.lv</mmsc>
+ <mmsproxy>193.12.40.38:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Omnitel (contract)</name>
+ <gsm>
+ <network-id mcc="246" mnc="01"/>
+ <apn value="gprs.omnitel.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ <dns>194.176.32.129</dns>
+ <dns>195.22.175.1</dns>
+ </apn>
+ <apn value="gprs.startas.lt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>No contract</name>
+ <username>omni</username>
+ <password>omni</password>
+ <dns>194.176.32.129</dns>
+ <dns>195.22.175.1</dns>
+ </apn>
+ <apn value="gprs.mms.lt">
+ <usage type="mms"/>
+ <name>Omnitel MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms.omnitel.net:8002/</mmsc>
+ <mmsproxy>194.176.32.149:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Luxembourg -->
+<country code="lu">
+ <provider>
+ <name>LUXGSM</name>
+ <gsm>
+ <network-id mcc="270" mnc="01"/>
+ <apn value="web.pt.lu">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>194.154.192.101</dns>
+ <dns>194.154.192.102</dns>
+ </apn>
+ <apn value="mms.pt.lu">
+ <usage type="mms"/>
+ <name>Luxgsm MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mmsc.pt.lu</mmsc>
+ <mmsproxy>194.154.192.88:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tango</name>
+ <gsm>
+ <network-id mcc="270" mnc="77"/>
+ <apn value="hspa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>hspa</name>
+ <username>tango</username>
+ <password>tango</password>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>internet</name>
+ <username>tango</username>
+ <password>tango</password>
+ <dns>212.66.70.3</dns>
+ <dns>212.66.75.7</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Tango MMS</name>
+ <username>tango</username>
+ <password>tango</password>
+ <mmsc>http://mms.tango.lu/</mmsc>
+ <mmsproxy>212.66.75.3:8080</mmsproxy>
+ </apn>
+ <apn value="mms.li">
+ <usage type="mms"/>
+ <name>Tango MMS</name>
+ <mmsc>mms.tele2.li</mmsc>
+ <mmsproxy>212.66.75.9:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="270" mnc="99"/>
+ <apn value="orange.lu">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>85.94.224.1</dns>
+ <dns>85.94.224.2</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>VOXmobile</name>
+ <gsm>
+ <network-id mcc="270" mnc="99"/>
+ <apn value="vox.lu">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="vox.lu">
+ <usage type="mms"/>
+ <name>VOX mms GPRS</name>
+ <mmsc>http://mms.vox.lu</mmsc>
+ <mmsproxy>proxy.vox.lu:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Latvia -->
+<country code="lv">
+ <provider>
+ <name>LMT</name>
+ <gsm>
+ <network-id mcc="247" mnc="01"/>
+ <apn value="internet.lmt.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.93.96.2</dns>
+ <dns>212.93.96.4</dns>
+ </apn>
+ <apn value="open.lmt.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>O!Karte internet</name>
+ </apn>
+ <apn value="okarte.lmt.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>O!Karte</name>
+ </apn>
+ <apn value="mms.lmt.lv">
+ <usage type="mms"/>
+ <name>LMT MMS</name>
+ <username>lmt</username>
+ <password>lmt</password>
+ <mmsc>http://mmsc.lmt.lv/mmsc</mmsc>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="247" mnc="02"/>
+ <apn value="internet.tele2.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Regular</name>
+ <username>gprs</username>
+ <password>internet</password>
+ </apn>
+ <apn value="mobileinternet.tele2.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="data.tele2.lv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Zelta Zivtina</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Bite</name>
+ <gsm>
+ <network-id mcc="247" mnc="05"/>
+ <apn value="wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Bite plus</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Prepaid/Contract</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Morocco -->
+<country code="ma">
+ <provider>
+ <name>Ittissalat Al Maghrib (IAM)</name>
+ <gsm>
+ <network-id mcc="604" mnc="01"/>
+ <apn value="www.iamgprs1.ma">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Abonnement</name>
+ </apn>
+ <apn value="www.iamgprs2.ma">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Pre-payé</name>
+ </apn>
+ <apn value="Mmsiam">
+ <usage type="mms"/>
+ <name>MMSIAM</name>
+ <mmsc>http://mms:8002/</mmsc>
+ <mmsproxy>10.16.35.50:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Medi Telecom</name>
+ <gsm>
+ <network-id mcc="604" mnc="00"/>
+ <apn value="internet1.meditel.ma">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Abonnement</name>
+ <username>MEDINET</username>
+ <password>MEDINET</password>
+ </apn>
+ <apn value="internet2.meditel.ma">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Pre-payé</name>
+ <username>MEDINET</username>
+ <password>MEDINET</password>
+ </apn>
+ <apn value="mms.meditel.ma">
+ <usage type="mms"/>
+ <name>GPRS MMS</name>
+ <username>MEDIMMS</username>
+ <password>MEDIMMS</password>
+ <mmsc>http://mms.meditel.ma:8088/mms</mmsc>
+ <mmsproxy>10.8.8.9:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>WANA</name>
+ <gsm>
+ <network-id mcc="604" mnc="02"/>
+ <apn value="www.wana.ma">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>INWI</name>
+ </apn>
+ <apn value="mms.wana.ma">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://mms.wana.ma:38090</mmsc>
+ <mmsproxy>10.86.0.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Moldova -->
+<country code="md">
+ <provider>
+ <name>Moldcell</name>
+ <gsm>
+ <network-id mcc="259" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Moldcell MMS</name>
+ <mmsc>http://mms.moldcell.md/cmmsc/post</mmsc>
+ <mmsproxy>10.0.10.10:9401</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Unité</name>
+ <gsm>
+ <network-id mcc="259" mnc="05"/>
+ <apn value="internet.unite.md">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet cu abonament</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ <apn value="internet3g.unite.md">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet fără abonament</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="259" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Montenegro -->
+<country code="me">
+ <provider>
+ <name>ProMonte GSM</name>
+ <gsm>
+ <network-id mcc="297" mnc="01"/>
+ <apn value="gprs.promonte.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.promonte.com">
+ <usage type="mms"/>
+ <name>ProMMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mm.vor.promonte.com</mmsc>
+ <mmsproxy>192.168.246.5:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="297" mnc="02"/>
+ <apn value="tmcg-data">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>38267</username>
+ <password>38267</password>
+ </apn>
+ <apn value="tmcg-nw">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>38267</username>
+ <password>38267</password>
+ </apn>
+ <apn value="internet-postpaid">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid (old)</name>
+ </apn>
+ <apn value="internet-prepaid">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid (old)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>m:tel</name>
+ <gsm>
+ <network-id mcc="297" mnc="03"/>
+ <apn value="gprsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mtelmms">
+ <usage type="mms"/>
+ <name>mtelmms</name>
+ <username>mms</username>
+ <password>068</password>
+ <mmsc>http://mmsmtel.com/mms/wapenc</mmsc>
+ <mmsproxy>172.17.85.131:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Madagascar -->
+<country code="mg">
+ <provider>
+ <name>Airtel</name>
+ <gsm>
+ <network-id mcc="646" mnc="01"/>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="646" mnc="02"/>
+ <apn value="orangeworld">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>world</username>
+ <password>orange</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telma</name>
+ <gsm>
+ <network-id mcc="646" mnc="04"/>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Mali -->
+<country code="ml">
+ <provider>
+ <name>Malitel</name>
+ <gsm>
+ <network-id mcc="610" mnc="01"/>
+ <apn value="web.malitel3.ml">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>3G+</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ <cdma>
+ <name>Internet Mobile+</name>
+ <username>card</username>
+ <password>card</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="610" mnc="02"/>
+ <apn value="iew">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet Every Where</name>
+ <username>iew</username>
+ <password>iew</password>
+ </apn>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Myanmar -->
+<country code="mm">
+ <provider>
+ <name>MPT</name>
+ <gsm>
+ <network-id mcc="414" mnc="01"/>
+ <apn value="mptnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>MPTNET</name>
+ <username>mptnet</username>
+ <password>mptnet</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Mongolia -->
+<country code="mn">
+ <provider>
+ <name>MobiCom</name>
+ <gsm>
+ <network-id mcc="428" mnc="99"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>MMS MobiCom</name>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>10.10.10.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Macau -->
+<country code="mo">
+ <provider>
+ <name>3 / Hutchison</name>
+ <gsm>
+ <network-id mcc="455" mnc="03"/>
+ <network-id mcc="455" mnc="05"/>
+ <apn value="web.hutchisonmacau.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>hutchison</username>
+ <password>1234</password>
+ </apn>
+ <apn value="mms.hutchisonmacau.com">
+ <usage type="mms"/>
+ <name>HutchisonMMS</name>
+ <username>hutchison</username>
+ <password>1234</password>
+ <mmsc>http://10.30.15.51:10021/mmsc</mmsc>
+ <mmsproxy>10.30.15.53:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CTM</name>
+ <gsm>
+ <network-id mcc="455" mnc="01"/>
+ <network-id mcc="455" mnc="04"/>
+ <apn value="ctm-mobile">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="ctmmms">
+ <usage type="mms"/>
+ <name>CTMMMS</name>
+ <mmsc>http://mms.wap.ctm.net:8002</mmsc>
+ <mmsproxy>192.168.99.3:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>China Telecom</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Macedonia -->
+<country code="mk">
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="294" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>One</name>
+ <gsm>
+ <network-id mcc="294" mnc="02"/>
+ <apn value="datacard">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Cosmofon MMS</name>
+ <mmsc>http://195.167.65.220:8002</mmsc>
+ <mmsproxy>10.10.10.20:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="294" mnc="03"/>
+ <apn value="vipoperator">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vipoperator</username>
+ <password>vipoperator</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Malta -->
+<country code="mt">
+ <provider>
+ <name>GO Mobile</name>
+ <gsm>
+ <network-id mcc="278" mnc="21"/>
+ <apn value="gosurfing">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ </apn>
+ <apn value="rtgsurfing">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ </apn>
+ <apn value="gomms">
+ <usage type="mms"/>
+ <name>go mms</name>
+ <mmsc>http://mmsc</mmsc>
+ <mmsproxy>10.20.20.129:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="278" mnc="01"/>
+ <apn value="Internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>80.85.96.131</dns>
+ <dns>80.85.97.70</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Mauritius -->
+<country code="mu">
+ <provider>
+ <name>Emtel</name>
+ <gsm>
+ <network-id mcc="617" mnc="10"/>
+ <apn value="WEB">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Maldives -->
+<country code="mv">
+ <provider>
+ <name>Dhiraagu</name>
+ <gsm>
+ <network-id mcc="472" mnc="01"/>
+ <apn value="internet.dhimobile">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.dhimobile">
+ <usage type="mms"/>
+ <name>DhiMMS</name>
+ <mmsc>http://mmsc.dhimobile.com.mv</mmsc>
+ <mmsproxy>172.24.97.4:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Wataniya</name>
+ <gsm>
+ <network-id mcc="472" mnc="02"/>
+ <apn value="WataniyaNet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Malawi -->
+<country code="mw">
+ <provider>
+ <name>TNM</name>
+ <gsm>
+ <network-id mcc="650" mnc="01"/>
+ <apn value="Internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Mexico -->
+<country code="mx">
+ <provider>
+ <name>Telcel</name>
+ <gsm>
+ <network-id mcc="334" mnc="02"/>
+
+ <voicemail>*86</voicemail>
+ <balance-check>
+ <dtmf>*333</dtmf>
+ </balance-check>
+
+ <apn value="internet.itelcel.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>webgprs</username>
+ <password>webgprs2002</password>
+ </apn>
+ <apn value="mms.itelcel.com">
+ <usage type="mms"/>
+ <name>Mensajes Multimedia</name>
+ <username>mmsgprs</username>
+ <password>mmsgprs2003</password>
+ <mmsc>http://mms.itelcel.com/servlets/mms</mmsc>
+ <mmsproxy>148.233.151.240:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="334" mnc="03"/>
+
+ <voicemail>*86</voicemail>
+ <balance-check>
+ <dtmf>*133#</dtmf>
+ </balance-check>
+
+ <apn value="internet.movistar.mx">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Iusacell</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Malaysia -->
+<country code="my">
+ <provider>
+ <name>DiGi</name>
+ <gsm>
+ <network-id mcc="502" mnc="16"/>
+ <apn value="diginet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ <dns>203.92.128.131</dns>
+ <dns>203.92.128.132</dns>
+ </apn>
+ <apn value="3gdgnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ </apn>
+ <apn value="digimms">
+ <usage type="mms"/>
+ <name>DiGi MMS</name>
+ <mmsc>http://mms.digi.com.my/servlets/mms</mmsc>
+ <mmsproxy>203.92.128.160:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Maxis</name>
+ <gsm>
+ <network-id mcc="502" mnc="12"/>
+ <network-id mcc="502" mnc="17"/>
+ <apn value="maxisbb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ <username>maxis</username>
+ <password>wap</password>
+ </apn>
+ <apn value="net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <username>maxis</username>
+ <password>net</password>
+ </apn>
+ <apn value="unet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G (handsets)</name>
+ <username>maxis</username>
+ <password>wap</password>
+ <dns>10.213.17.1</dns>
+ <dns>10.213.17.2</dns>
+ </apn>
+ <apn value="unet">
+ <usage type="mms"/>
+ <name>Maxis 3G MMS</name>
+ <username>maxis</username>
+ <password>wap</password>
+ <mmsc>http://172.16.74.100:10021/mmsc</mmsc>
+ <mmsproxy>202.75.133.49:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Celcom</name>
+ <gsm>
+ <network-id mcc="502" mnc="13"/>
+ <network-id mcc="502" mnc="19"/>
+ <!-- http://www.channelx.com.my/mdp/gprs/internet_config.jsp?model_name=motorola_e398 -->
+ <apn value="celcom.net.my">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ </apn>
+ <!-- http://www.channelx.com.my/mdp/3g/wap_config_3g.jsp?model_name=huwei_u600_3g -->
+ <apn value="celcom3g">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Celcom 3G</name>
+ </apn>
+ <apn value="celcom3g">
+ <usage type="mms"/>
+ <name>Celcom 3G MMS</name>
+ <mmsc>http://mms.celcom.net.my</mmsc>
+ <mmsproxy>10.128.1.242:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Mozambique -->
+<country code="mz">
+ <provider>
+ <name>MCel</name>
+ <gsm>
+ <network-id mcc="643" mnc="01"/>
+ <apn value="isp.mcel.mz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>guest</username>
+ <password>guest</password>
+ <dns>212.96.24.2</dns>
+ <dns>212.96.24.1</dns>
+ </apn>
+ <apn value="mms.mcel.mz">
+ <usage type="mms"/>
+ <name>mCel MMS</name>
+ <mmsc>http://mcelmms</mmsc>
+ <mmsproxy>10.1.4.35:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodacom</name>
+ <gsm>
+ <network-id mcc="643" mnc="04"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract / Prepaid</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Namibia -->
+<country code="na">
+ <provider>
+ <name>MTC</name>
+ <gsm>
+ <network-id mcc="649" mnc="01"/>
+ <apn value="ppsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Tango</name>
+ <username>ppsuser</username>
+ <password>ppsuser</password>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telecom</name>
+ <cdma>
+ <name>switch</name>
+ <password>telecom</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Leo</name>
+ <gsm>
+ <network-id mcc="649" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Leo</name>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Cell One MMS</name>
+ <username>cellone</username>
+ <password>cellone</password>
+ <mmsc>mms.cellone.com.na</mmsc>
+ <mmsproxy>41.223.80.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Nigeria -->
+<country code="ng">
+ <provider>
+ <name>Airtel NG</name>
+ <!-- http://www.airtel.com/wps/wcm/connect/africaairtel/nigeria/3g/home/3gpower/PG_Internet_Settings -->
+ <gsm>
+ <network-id mcc="621" mnc="20"/>
+ <network-id mcc="621" mnc="80"/>
+ <balance-check>
+ <ussd>*123#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*126*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet.ng.airtel.com.ng">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="621" mnc="30"/>
+ <network-id mcc="621" mnc="60"/>
+ <balance-check>
+ <ussd>*556#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*555*CODE#</ussd>
+ </balance-top-up>
+ <apn value="web.gprs.mtnnigeria.net">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Glo Mobile</name>
+ <gsm>
+ <network-id mcc="621" mnc="50"/>
+ <network-id mcc="621" mnc="70"/>
+ <balance-check>
+ <ussd>#124#</ussd>
+ <ussd-response>4</ussd-response>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*123*CODE#</ussd>
+ </balance-top-up>
+ <apn value="glosecure">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Pay as You Go</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ <apn value="gloflat">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Glo 3G Packs</name>
+ <username>flat</username>
+ <password>flat</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Etisalat</name>
+ <gsm>
+ <network-id mcc="621" mnc="90"/>
+ <balance-check>
+ <ussd>*232#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*222*CODE#</ussd>
+ </balance-top-up>
+ <apn value="etisalat">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Etisalat Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Starcomms</name>
+ <cdma>
+ <username>your_phone_number@starcomms.com</username>
+ <password>your_phone_number</password>
+ <sid value="2"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Multilinks</name>
+ <cdma>
+ <!-- cid: "109" --><!--
+ username must be (yournumber)@multilinks.com and
+ password must be your last 4 number
+ <username>number@multilinks.com</username>
+ <password></password>
+ -->
+ </cdma>
+ </provider>
+</country>
+
+<!-- Nicaragua -->
+<country code="ni">
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="710" mnc="21"/>
+ <network-id mcc="710" mnc="73"/>
+ <apn value="wap.emovil">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>wapemovil</username>
+ <password>wapemovil</password>
+ </apn>
+ <apn value="web.emovil">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ <username>webemovil</username>
+ <password>webemovil</password>
+ </apn>
+ <apn value="internet.ideasalo.ni">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web (Alo pcs)</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ <apn value="wap.ideasalo.ni">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP (Alo pcs)</name>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="710" mnc="30"/>
+ <apn value="internet.movistar.ni">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Netherlands -->
+<country code="nl">
+ <provider>
+ <name>Hi</name>
+ <gsm>
+ <network-id mcc="204" mnc="08"/>
+ <apn value="portalmmm.nl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="portalmmm.nl">
+ <usage type="mms"/>
+ <name>KPN MMS</name>
+ <mmsc>http://mp.mobiel.kpn/mmsc</mmsc>
+ <mmsproxy>10.10.100.20:5080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Lebara</name>
+ <gsm>
+ <network-id mcc="204" mnc="12"/>
+ <apn value="multimedia.lebara.nl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="internet">
+ <usage type="mms"/>
+ <name>Telfort MMS</name>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>193.113.200.195:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Lycamobile</name>
+ <gsm>
+ <network-id mcc="204" mnc="09"/>
+ <apn value="data.lycamobile.nl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>lmnl</username>
+ <password>plus</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>KPN NL</name>
+ <gsm>
+ <network-id mcc="204" mnc="08"/>
+ <apn value="prepaidinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="fastinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>KPN</username>
+ <password>gprs</password>
+ <dns>62.133.126.28</dns>
+ <dns>62.133.126.29</dns>
+ </apn>
+ <apn value="noapn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>62.133.126.28</dns>
+ <dns>62.133.126.29</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MEDIONmobile</name>
+ <gsm>
+ <network-id mcc="204" mnc="08"/>
+ <network-id mcc="204" mnc="10"/>
+ <apn value="portalmmm.nl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Aldi Talk Mobiel Prepaid Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telfort</name>
+ <gsm>
+ <network-id mcc="204" mnc="12"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telfortnl</username>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="204" mnc="16"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>193.78.240.12</dns>
+ <dns>193.79.242.39</dns>
+ </apn>
+ <apn value="mms.ben">
+ <usage type="mms"/>
+ <name>Ben MMS</name>
+ <mmsc>http://benmms</mmsc>
+ <mmsproxy>10.10.10.11:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ben</name>
+ <gsm>
+ <network-id mcc="204" mnc="16"/>
+ <apn value="internet.ben">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>193.78.240.12</dns>
+ <dns>193.79.242.39</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="204" mnc="20"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>orange</username>
+ <password>orange</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="204" mnc="02"/>
+ <apn value="data.tele2.nl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>XS4ALL Mobiel Internet</name>
+ <gsm>
+ <apn value="umts.xs4all.nl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>xs4all</username>
+ <password>xs4all</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="204" mnc="04"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="live.vodafone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Non-business</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>62.140.138.237</dns>
+ <dns>62.140.140.250</dns>
+ </apn>
+ <apn value="office.vodafone.nl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="m2m.global.vodafone.nl">
+ <usage type="internet"/>
+ <name>M2M</name>
+ <username>web</username>
+ <password>web</password>
+ <authentication method="pap"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- MVNO operating on KPN's network -->
+ <name>Galaxy</name>
+ <gsm>
+ <network-id mcc="204" mnc="08"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Norway -->
+<country code="no">
+ <provider>
+ <name>Netcom</name>
+ <gsm>
+ <network-id mcc="242" mnc="02"/>
+
+ <balance-check>
+ <ussd>*150#</ussd>
+ </balance-check>
+
+ <apn value="internet.netcom.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>netcom</username>
+ <password>netcom</password>
+ <dns>212.169.123.67</dns>
+ <dns>212.45.188.254</dns>
+ </apn>
+ <apn value="mms.netcom.no">
+ <usage type="mms"/>
+ <name>NetCom mms</name>
+ <username>mms</username>
+ <password>netcom</password>
+ <mmsc>http://mms/</mmsc>
+ <mmsproxy>212.169.66.4:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- MVNO operating on NetCom's network -->
+ <name>Chess</name>
+ <gsm>
+ <network-id mcc="242" mnc="02"/>
+ <apn value="netcom">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>chess</username>
+ <password>chess</password>
+ </apn>
+ <apn value="mms.netcom.no">
+ <usage type="mms"/>
+ <name>Chess MMS</name>
+ <username>chess</username>
+ <password>chess</password>
+ <mmsc>http://mms/</mmsc>
+ <mmsproxy>212.169.66.4:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- http://www.ice.no/Mobilt-bredb%C3%A5nd-1046.aspx -->
+ <provider>
+ <name>ice.net (Nordisk Mobiltelefon)</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="242" mnc="01"/>
+
+ <voicemail>91500002</voicemail>
+ <balance-check>
+ <sms text="saldo">2525</sms>
+ </balance-check>
+
+ <apn value="telenor">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.17.131.3</dns>
+ <dns>148.122.161.2</dns>
+ </apn>
+ <apn value="mms.ventelo.no">
+ <usage type="mms"/>
+ <name>Ventelo MMS</name>
+ <username>ventelo</username>
+ <password>1111</password>
+ <mmsc>http://mmsc/</mmsc>
+ <mmsproxy>10.10.10.11:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TDC</name>
+ <gsm>
+ <network-id mcc="242" mnc="08"/>
+ <apn value="internet.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>80.232.41.10</dns>
+ <dns>80.232.41.20</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Network Norway</name>
+ <gsm>
+ <network-id mcc="242" mnc="05"/>
+ <apn value="internet">
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>NWN MMS</name>
+ <mmsc>http://mms.nwn.no</mmsc>
+ <mmsproxy>89.254.65.20:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>OneCall</name>
+ <gsm>
+ <network-id mcc="242" mnc="05"/>
+ <apn value="internet">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MyCall</name>
+ <gsm>
+ <network-id mcc="242" mnc="05"/>
+ <apn value="internet">
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Altibox</name>
+ <gsm>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telipol</name>
+ <gsm>
+ <network-id mcc="242" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ventelo</name>
+ <gsm>
+ <network-id mcc="242" mnc="07"/>
+ <apn value="internet.ventelo.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ludo Mobil</name>
+ <gsm>
+ <network-id mcc="242" mnc="07"/>
+ <apn value="internet.ventelo.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="242" mnc="02"/>
+ <network-id mcc="242" mnc="04"/>
+
+ <voicemail>47230000</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ <dtmf>47300000</dtmf>
+ </balance-check>
+
+ <apn value="internet.tele2.no">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>Mobilt internet</name>
+ </apn>
+ <!-- http://www.tele2.no/mobilt-bredbaand.html -->
+ <apn value="mobileinternet.tele2.no">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt bredbånd</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Nepal -->
+<country code="np">
+ <provider>
+ <name>Nepal Telecom</name>
+ <gsm>
+ <network-id mcc="429" mnc="01"/>
+ <apn value="ntnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mero Mobile</name>
+ <gsm>
+ <network-id mcc="429" mnc="02"/>
+ <apn value="mero">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- New Zealand -->
+<country code="nz">
+ <provider>
+ <name>Telecom New Zealand</name>
+ <gsm>
+ <network-id mcc="530" mnc="00"/>
+ <network-id mcc="530" mnc="05"/>
+ <apn value="wap.telecom.co.nz">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>XT mobile (WAP)</name>
+ </apn>
+ <apn value="internet.telecom.co.nz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>XT mobile (Internet with Firewall)</name>
+ <dns>202.27.156.72</dns>
+ <dns>202.27.158.40</dns>
+ </apn>
+ <apn value="direct.telecom.co.nz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>XT mobile (Direct Internet)</name>
+ <dns>202.27.156.72</dns>
+ <dns>202.27.158.40</dns>
+ </apn>
+ <apn value="oa.telecom.co.nz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>XT mobile (One Office/Remote Office)</name>
+ </apn>
+ <apn value="wap.telecom.co.nz">
+ <usage type="mms"/>
+ <name>TelecomMMS</name>
+ <mmsc>http://lsmmsc.xtra.co.nz</mmsc>
+ <mmsproxy>210.55.11.73:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="530" mnc="01"/>
+ <apn value="live.vodafone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WAP</name>
+ <dns>202.73.206.16</dns>
+ <dns>202.73.198.16</dns>
+ </apn>
+ <apn value="www.vodafone.net.nz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract / Prepaid (Restricted)</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Unrestricted (public)</name>
+ <dns>202.73.206.16</dns>
+ <dns>202.73.198.16</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>2-Degrees</name>
+ <gsm>
+ <network-id mcc="530" mnc="24"/>
+ <apn value="mms">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ </apn>
+ <apn value="internet">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ <dns>118.148.1.10</dns>
+ <dns>118.148.1.20</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>mms</name>
+ <mmsc>http://mms.2degrees.net.nz:48090</mmsc>
+ <mmsproxy>118.148.1.118:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TelstraClear</name>
+ <gsm>
+ <apn value="www.telstraclear.net.nz">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orcon</name>
+ <gsm>
+ <apn value="www.orcon.net.nz">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Oman -->
+<country code="om">
+ <provider>
+ <name>Oman Mobile</name>
+ <gsm>
+ <network-id mcc="422" mnc="02"/>
+ <apn value="taif">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>taif</username>
+ <password>taif</password>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet (old)</name>
+ </apn>
+ <apn value="MMS">
+ <usage type="mms"/>
+ <name>Oman Mobile MMS</name>
+ <username>MMS</username>
+ <password>MMS</password>
+ <mmsproxy>192.168.203.35:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nawras</name>
+ <gsm>
+ <network-id mcc="422" mnc="03"/>
+ <apn value="isp.nawras.com.om">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.nawras.com.om">
+ <usage type="mms"/>
+ <name>Nawras MMS</name>
+ <username>test</username>
+ <password>test</password>
+ <mmsc>http://10.128.240.16/servlets/mms</mmsc>
+ <mmsproxy>10.128.240.19:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Panama -->
+<country code="pa">
+ <provider>
+ <name>Cable and Wireless</name>
+ <gsm>
+ <network-id mcc="714" mnc="01"/>
+ <apn value="apn01.cwpanama.com.pa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="apn02.cwpanama.com.pa">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://mms.zonamovil.com.pa</mmsc>
+ <mmsproxy>172.25.3.5:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="714" mnc="02"/>
+ <apn value="internet.movistar.pa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistarpa</username>
+ <password>movistarpa</password>
+ <dns>200.39.10.1</dns>
+ <dns>200.36.160.237</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Peru -->
+<country code="pe">
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="716" mnc="10"/>
+ <apn value="tim.pe">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>tim</username>
+ <password>tulibertad</password>
+ </apn>
+ <apn value="ba.amx">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet Móvil Prepago</name>
+ <username>amx</username>
+ <password>amx</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="716" mnc="06"/>
+ <apn value="movistar.pe">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistar@datos</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Nextel</name>
+ <gsm>
+ <network-id mcc="716" mnc="07"/>
+ <apn value="datacard.nextel.com.pe">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Vini MMS</name>
+ <mmsc>http://mms.vini.pf/mmsc</mmsc>
+ <mmsproxy>172.20.10.16:9201</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- French Polynesia -->
+<country code="pf">
+ <provider>
+ <name>Vini</name>
+ <gsm>
+ <network-id mcc="547" mnc="20"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Papua New Guinea -->
+<country code="pg">
+ <provider>
+ <name>Digicel</name>
+ <gsm>
+ <network-id mcc="537" mnc="03"/>
+ <apn value="internet.digicelpng.com">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <dns>10.149.64.77</dns>
+ <dns>8.8.8.8</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Philippines -->
+<country code="ph">
+ <provider>
+ <name>Globe Telecom</name>
+ <gsm>
+ <network-id mcc="515" mnc="02"/>
+ <apn value="internet.globe.com.ph">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ <username>globe</username>
+ <password>globe</password>
+ <dns>203.127.225.10</dns>
+ <dns>203.127.225.11</dns>
+ </apn>
+ <apn value="http.globe.com.ph">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ <username>globe</username>
+ <password>globe</password>
+ <dns>203.127.225.10</dns>
+ <dns>203.127.225.11</dns>
+ </apn>
+ <apn value="www.globe.com.ph">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WAP</name>
+ <username>globe</username>
+ <password>globe</password>
+ <dns>203.127.225.10</dns>
+ <dns>203.127.225.11</dns>
+ </apn>
+ <apn value="mms.globe.com.ph">
+ <usage type="mms"/>
+ <name>myGlobe MMS</name>
+ <mmsc>http://192.40.100.22:10021/mmsc</mmsc>
+ <mmsproxy>192.40.100.20:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Smart</name>
+ <gsm>
+ <network-id mcc="515" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>witsductoor</username>
+ <password>banonoy</password>
+ <dns>202.57.96.3</dns>
+ <dns>202.57.96.4</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>SmartMMS</name>
+ <mmsc>http://10.102.61.238:8002</mmsc>
+ <mmsproxy>10.102.61.46:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Digitel (Sun Cellular)</name>
+ <gsm>
+ <network-id mcc="515" mnc="05"/>
+ <apn value="minternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Sun MMS</name>
+ <mmsc>http://mmscenter.suncellular.com.ph</mmsc>
+ <mmsproxy>202.138.159.78:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Pakistan -->
+<country code="pk">
+ <provider>
+ <name>Djuice</name>
+ <gsm>
+ <network-id mcc="515" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telenor</username>
+ <password>telenor</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mobilink</name>
+ <gsm>
+ <network-id mcc="515" mnc="01"/>
+ <apn value="connect.mobilinkworld.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="jazzconnect.mobilinkworld.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Jazz</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="515" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telenor</username>
+ <password>telenor</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ufone</name>
+ <gsm>
+ <network-id mcc="410" mnc="03"/>
+ <apn value="ufone.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>ufone</username>
+ <password>ufone</password>
+ </apn>
+ <apn value="ufone.mms">
+ <usage type="mms"/>
+ <name>Ufone MMS</name>
+ <username>ufone</username>
+ <password>ufone</password>
+ <mmsc>http://www.ufonemms.com:80</mmsc>
+ <mmsproxy>172.16.13.27:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Warid</name>
+ <gsm>
+ <network-id mcc="515" mnc="07"/>
+ <apn value="warid">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="zongmms">
+ <usage type="mms"/>
+ <name>ZONG MMS</name>
+ <mmsc>http://10.81.6.11:8080</mmsc>
+ <mmsproxy>10.81.6.33:8000</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ZONG</name>
+ <gsm>
+ <network-id mcc="515" mnc="04"/>
+ <apn value="zonginternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ptcl EVO</name>
+ <cdma>
+ <username>vwireless@ptcl.com</username>
+ <password>ptcl</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>WorldCall Wireless</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Poland -->
+<country code="pl">
+ <!-- Polish physical operators -->
+ <provider primary="true">
+ <name>T-mobile</name><!-- rebranded from Era in 2011 -->
+ <gsm>
+ <network-id mcc="260" mnc="02"/>
+ <voicemail>602950</voicemail>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*111*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <dns>213.158.194.1</dns>
+ <dns>213.158.193.38</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>T-Mobile.pl MMS</name>
+ <mmsc>http://mms/servlets/mms</mmsc>
+ <mmsproxy>213.158.194.226:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>Play Online</name>
+ <gsm>
+ <network-id mcc="260" mnc="06"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ <ussd>*155#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*100*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://10.10.28.164/mms/wapenc</mmsc>
+ <mmsproxy>10.10.25.5:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="260" mnc="03"/>
+ <voicemail>*501</voicemail>
+ <balance-check>
+ <ussd>*124*#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*125*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Standard access - with image compression</name>
+ <name xml:lang="pl">Dostęp standardowy - z kompresją grafiki</name>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>194.9.223.79</dns>
+ <dns>194.204.159.1</dns>
+ </apn>
+ <apn value="vpn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>VPN mode access without compression (requires activation)</name>
+ <name xml:lang="pl">Dostęp VPN bez kompresji (wymaga aktywacji)</name>
+ <username>internet</username>
+ <password>internet</password>
+ <dns>194.9.223.79</dns>
+ <dns>194.204.159.1</dns>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>cdma@orange</username>
+ <password>orange</password>
+ </cdma>
+ </provider>
+ <provider primary="true">
+ <name>Plus</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <voicemail>2222</voicemail>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*123*CODE#</ussd>
+ </balance-top-up>
+ <apn value="www.plusgsm.pl">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Standard access</name>
+ <name xml:lang="pl">Dostęp standardowy</name>
+ <username>plusgsm</username>
+ <password>plusgsm</password>
+ <dns>212.2.96.51</dns>
+ <dns>212.2.96.52</dns>
+ </apn>
+ <apn value="pro.plusgsm.pl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>External dynamic IP address (requires activation)</name>
+ <name xml:lang="pl">Zewnętrzny dynamiczny adres IP (wymaga aktywacji)</name>
+ <username>plusgsm</username>
+ <password>plusgsm</password>
+ <dns>212.2.96.51</dns>
+ <dns>212.2.96.52</dns>
+ </apn>
+ <apn value="m2m.plusgsm.pl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>External static IP address (requires activation)</name>
+ <name xml:lang="pl">Zewnętrzny statyczny adres IP (wymaga aktywacji)</name>
+ <username>plusgsm</username>
+ <password>plusgsm</password>
+ <dns>212.2.96.51</dns>
+ <dns>212.2.96.52</dns>
+ </apn>
+ <apn value="optimizer">
+ <plan type="postpaid"/>
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>iPlus optimizer with data compression</name>
+ <name xml:lang="pl">iPlus optimizer z kompresją danych</name>
+ <dns>212.2.96.51</dns>
+ <dns>212.2.96.52</dns>
+ </apn>
+ <apn value="mms.plusgsm.pl">
+ <usage type="mms"/>
+ <name>MMS GPRS</name>
+ <mmsc>http://mms.plusgsm.pl:8002</mmsc>
+ <mmsproxy>212.2.96.16:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>Cyfrowy Polsat</name>
+ <gsm>
+ <network-id mcc="260" mnc="12"/>
+ <apn value="multi.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="true">
+ <name>aero2</name>
+ <gsm>
+ <network-id mcc="260" mnc="17"/>
+ <apn value="darmowy">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <!-- Polish MVNO operators -->
+ <provider primary="false">
+ <name>Multimo</name>
+ <gsm>
+ <network-id mcc="260" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Default APN</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ <apn value="mni.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>APN: mni.internet</name>
+ <username>mni.internet</username>
+ </apn>
+ <apn value="telogic.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>APN: telogic.internet</name>
+ <username>telogic.internet</username>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>cdma@orange</username>
+ <password>orange</password>
+ </cdma>
+ </provider>
+ <provider primary="false">
+ <name>FreeM</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <apn value="freedata.pl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Heyah</name>
+ <gsm>
+ <network-id mcc="260" mnc="02"/>
+ <balance-check>
+ <ussd>*108#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*109*CODE#</ussd>
+ </balance-top-up>
+ <apn value="heyah.pl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>heyah</username>
+ <password>heyah</password>
+ <dns>213.158.194.1</dns>
+ <dns>213.158.193.38</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>GaduAIR</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <apn value="internet.gadu-gadu.pl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Aster</name>
+ <gsm>
+ <network-id mcc="260" mnc="03"/>
+ <apn value="aster.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Netia</name>
+ <gsm>
+ <network-id mcc="260" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Vectra</name>
+ <gsm>
+ <network-id mcc="260" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>mBank mobile</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="www.mobile.pl">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>INEA</name>
+ <gsm>
+ <network-id mcc="260" mnc="03"/>
+ <apn value="telogic.internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Mobilking</name>
+ <gsm>
+ <network-id mcc="260" mnc="02"/>
+ <apn value="wapMOBILKING">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>mobilking</username>
+ <password>mobilking</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>SamiSwoi</name>
+ <gsm>
+ <network-id mcc="260" mnc="01"/>
+ <apn value="www.plusgsm.pl">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider primary="false">
+ <name>Sferia</name>
+ <cdma>
+ <username>sferia</username>
+ <password>sferia</password>
+ </cdma>
+ </provider>
+ <provider primary="false">
+ <name>Nordisk Polska</name>
+ <cdma>
+ <username>CDMA</username>
+ <password>CDMA</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Portugal -->
+<country code="pt">
+ <provider>
+ <name>Kanguru</name>
+ <gsm>
+ <network-id mcc="268" mnc="03"/>
+ <apn value="kanguru-portatil">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Portable</name>
+ <name xml:lang="pt">Portátil</name>
+ <dns>62.169.67.172</dns>
+ <dns>62.169.67.171</dns>
+ </apn>
+ <apn value="kanguru-tempo">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Tempo (Prepaid)</name>
+ <dns>62.169.67.172</dns>
+ <dns>62.169.67.171</dns>
+ </apn>
+ <apn value="kangurufixo">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Fixo</name>
+ <dns>62.169.67.172</dns>
+ <dns>62.169.67.171</dns>
+ </apn>
+ <apn value="noapn">
+ <name>Apn dinâmico (no apn)</name>
+ <dns>62.169.67.172</dns>
+ <dns>62.169.67.171</dns>
+ </apn>
+ <apn value="umts">
+ <usage type="mms"/>
+ <name>Optimus MMS</name>
+ <mmsc>http://mmsc:10021/mmsc</mmsc>
+ <mmsproxy>62.169.66.5:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- Merged with Optimus in 2010 -->
+ <name>Clix</name>
+ <gsm>
+ <network-id mcc="268" mnc="03"/>
+ <apn value="clixinternetmovel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Optimus</name>
+ <gsm>
+ <network-id mcc="268" mnc="03"/>
+ <apn value="umts">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G</name>
+ </apn>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <dns>194.79.69.129</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TMN</name>
+ <gsm>
+ <network-id mcc="268" mnc="06"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Tmn Internet</name>
+ <username>tmn</username>
+ <password>tmn</password>
+ <dns>88.214.178.1</dns>
+ <dns>88.214.182.2</dns>
+ </apn>
+ <apn value="mmsc.tmn.pt">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Tmn Mms</name>
+ <username>tmn</username>
+ <password>tmnnet</password>
+ <dns>194.65.3.20</dns>
+ <dns>194.65.3.21</dns>
+ </apn>
+ <apn value="mmsc.tmn.pt">
+ <usage type="mms"/>
+ <name>MMSgprs</name>
+ <username>tmn</username>
+ <password>tmnnet</password>
+ <mmsc>http://mmsc/</mmsc>
+ <mmsproxy>10.111.2.16:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="268" mnc="01"/>
+ <apn value="internet.vodafone.pt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ <dns>212.18.160.133</dns>
+ <dns>212.18.160.134</dns>
+ </apn>
+ <apn value="net2.vodafone.pt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Vodafone Internet</name>
+ </apn>
+ <apn value="vas.vodafone.pt">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Vodafone MMS</name>
+ <username>vas</username>
+ <password>vas</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ZON</name>
+ <gsm>
+ <network-id mcc="268" mnc="01"/>
+ <apn value="internet.zon.pt">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Dados Móveis</name>
+ </apn>
+ <apn value="vas.zon.pt">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>vas</username>
+ <password>vas</password>
+ </apn>
+ <apn value="vas.zon.pt">
+ <usage type="mms"/>
+ <name>ZON MMS</name>
+ <username>vas</username>
+ <password>vas</password>
+ <mmsc>http://mms/servlets/mms</mmsc>
+ <mmsproxy>213.30.27.63:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Paraguay -->
+<country code="py">
+ <provider>
+ <name>VOX</name>
+ <gsm>
+ <network-id mcc="744" mnc="01"/>
+ <apn value="vox.wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/></apn>
+ <apn value="vox.mms">
+ <usage type="mms"/>
+ <name>e-magen</name>
+ <mmsc>http:/mms.vox.com.py/mmsc</mmsc>
+ <mmsproxy>172.24.97.29:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Personal</name>
+ <gsm>
+ <network-id mcc="744" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/></apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="744" mnc="04"/>
+ <apn value="internet.tigo.py">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="broadband.tigo.py">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Broadband</name>
+ <name xml:lang="es">Banda Ancha Móvil</name>
+ <username>tigo</username>
+ <password>tigo</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="744" mnc="02"/>
+ <apn value="gprs.claro.com.py">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Qatar -->
+<country code="qa">
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="427" mnc="02"/>
+ <msisdn-query>
+ <ussd>*#100#</ussd>
+ </msisdn-query>
+ <apn value="web.vodafone.com.qa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web</name>
+ </apn>
+ <apn value="vodafone.com.qa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web (old)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Q-Tel</name>
+ <gsm>
+ <network-id mcc="427" mnc="01"/>
+ <apn value="gprs.qtel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Qatarnet</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ <apn value="mms.qtel">
+ <usage type="mms"/>
+ <name>Qtel MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mmsr.qtelmms.qa</mmsc>
+ <mmsproxy>10.23.8.3:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Réunion (France) -->
+<country code="re">
+ <provider>
+ <name>SFR Réunion</name>
+ <gsm>
+ <network-id mcc="647" mnc="10"/>
+ <msisdn-query>
+ <sms text="ABCd84367">+33621012555</sms>
+ </msisdn-query>
+ <apn value="websfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract / Prepaid</name>
+ </apn>
+ <apn value="slsfr">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR slsfr</name>
+ </apn>
+ <apn value="internetpro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR internetpro</name>
+ </apn>
+ <apn value="ipnet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SFR ipnet</name>
+ </apn>
+ <apn value="mmssfr">
+ <usage type="mms"/>
+ <name>MMSGPRS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>10.0.224.145</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Romania -->
+<country code="ro">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="226" mnc="10"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>172.22.7.21</dns>
+ <dns>172.22.7.20</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="226" mnc="01"/>
+ <apn value="tobe.vodafone.ro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet (Prepaid)</name>
+ <username>tobe.vodafone.ro</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="internet.vodafone.ro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet (Postpaid)</name>
+ <username>internet.vodafone.ro</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="internet.pre.vodafone.ro">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet (Prepaid)</name>
+ <username>internet.pre.vodafone.ro</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="live.vodafone.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Live! (Postpaid)</name>
+ <username>live</username>
+ <password>vodafone</password>
+ </apn>
+ <apn value="live.pre.vodafone.ro">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Live! (Prepaid)</name>
+ <username>live.pre.vodafone.com</username>
+ <password>vodafone</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zapp</name>
+ <cdma>
+ <username>zapp</username>
+ <password>zapp</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Digi.Net Mobil</name>
+ <gsm>
+ <network-id mcc="226" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Home</name>
+ </apn>
+ <apn value="static">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Business (static)</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Serbia -->
+<country code="rs">
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="220" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>telenor</username>
+ <password>gprs</password>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Telenor MMS</name>
+ <mmsc>http://mms.telenor.rs/servlets/mms</mmsc>
+ <mmsproxy>217.65.192.33:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telekom Srbija</name>
+ <gsm>
+ <network-id mcc="220" mnc="03"/>
+ <apn value="gprsinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mts</username>
+ <password>064</password>
+ <dns>195.178.38.3</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>mts</username>
+ <password>"064"</password>
+ <mmsc>http://mms.mts064.telekom.yu/mms/wapenc</mmsc>
+ <mmsproxy>172.17.85.131:9201</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>VIP Mobile</name>
+ <gsm>
+ <network-id mcc="220" mnc="05"/>
+ <apn value="vipmobile">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>vipmobile</username>
+ <password>vipmobile</password>
+ </apn>
+ <apn value="vipmobile.mms">
+ <usage type="mms"/>
+ <name>Vip MMS</name>
+ <username>vipmobile</username>
+ <password>vipmobile</password>
+ <mmsc>http://mmsc.vipmobile.rs</mmsc>
+ <mmsproxy>212.15.182.82:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Rwanda -->
+<country code="rw">
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="635" mnc="10"/>
+ <apn value="internet.mtn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="635" mnc="13"/>
+ <apn value="web.tigo.rw">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Russia -->
+<country code="ru">
+ <provider>
+ <name>BaikalWestCom</name>
+ <name xml:lang="ru">БайкалВестКом</name>
+ <gsm>
+ <network-id mcc="250" mnc="12"/>
+ <apn value="inet.bwc.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>bwc</username>
+ <password>bwc</password>
+ <dns>81.18.113.2</dns>
+ <dns>81.18.112.50</dns>
+ </apn>
+ <apn value="mms.bwc.ru">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>bwc</username>
+ <mmsc>http://mmsc/mms</mmsc>
+ <mmsproxy>10.10.17.2:9201</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beeline</name>
+ <name xml:lang="ru">Билайн</name>
+ <gsm>
+ <network-id mcc="250" mnc="28"/>
+ <network-id mcc="250" mnc="99"/>
+ <balance-check>
+ <ussd>*102#</ussd>
+ </balance-check>
+ <apn value="home.beeline.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G modem</name>
+ <name xml:lang="ru">USB-модем</name>
+ <username>beeline</username>
+ <password>beeline</password>
+ <dns>212.44.130.6</dns>
+ <dns>217.118.83.6</dns>
+ </apn>
+ <apn value="internet.beeline.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile phone</name>
+ <name xml:lang="ru">Мобильный телефон</name>
+ <username>beeline</username>
+ <password>beeline</password>
+ <dns>217.118.66.243</dns>
+ <dns>217.118.66.244</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>ETK</name>
+ <gsm>
+ <network-id mcc="250" mnc="05"/>
+ <apn value="wap.etk.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTS</name>
+ <gsm>
+ <network-id mcc="250" mnc="01"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="internet.mts.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mts</username>
+ <password>mts</password>
+ <dns>213.87.0.1</dns>
+ <dns>213.87.1.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Megafon</name>
+ <name xml:lang="ru">Мегафон</name>
+
+ <gsm>
+ <network-id mcc="250" mnc="02"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>RUS</name>
+ <name xml:lang="ru">Россия</name>
+ <username>gdata</username>
+ <password>gdata</password>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>МегаФон MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mmsc:8002</mmsc>
+ <mmsproxy>10.10.10.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>NCC</name>
+ <gsm>
+ <network-id mcc="250" mnc="03"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>ncc</username>
+ <dns>10.0.3.5</dns>
+ <dns>10.0.3.2</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>NTC</name>
+ <gsm>
+ <network-id mcc="250" mnc="16"/>
+ <apn value="internet.ntc">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>80.243.64.67</dns>
+ <dns>80.243.68.34</dns>
+ </apn>
+ <apn value="mms.ntc">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://mmsc.vntc.ru/was</mmsc>
+ <mmsproxy>80.243.64.68:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Enisey TeleCom</name>
+ <name xml:lang="ru">Енисей Телеком</name>
+ <gsm>
+ <network-id mcc="250" mnc="05"/>
+ <apn value="internet.etk.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>etk</username>
+ <dns>10.10.30.3</dns>
+ <dns>10.10.30.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Motiv</name>
+ <name xml:lang="ru">Мотив</name>
+ <gsm>
+ <network-id mcc="250" mnc="35"/>
+ <apn value="inet.ycc.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>motiv</username>
+ <dns>217.148.52.34</dns>
+ <dns>217.148.52.3</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tatincom</name>
+ <name xml:lang="ru">Татинком</name>
+ <gsm>
+ <apn value="internet.tatincom.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>tatincom</username>
+ <password>tatincom</password>
+ <dns>89.207.96.2</dns>
+ <dns>89.207.97.18</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <name xml:lang="ru">Теле2</name>
+ <gsm>
+ <network-id mcc="250" mnc="20"/>
+ <apn value="internet.tele2.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>130.244.127.161</dns>
+ <dns>130.244.127.169</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Skylink</name>
+ <name xml:lang="ru">Скайлинк</name>
+ <cdma>
+ <username>mobile</username>
+ <password>internet</password>
+
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="11396"/> <!-- Khabarovsk area -->
+ <sid value="11398"/> <!-- Adygeya -->
+ <sid value="11400"/> <!-- Altay republic -->
+ <sid value="11418"/> <!-- Bashkostostan -->
+ <sid value="11424"/> <!-- Buryatiya -->
+ <sid value="11432"/> <!-- Dagestan -->
+ <sid value="11434"/> <!-- Ingushetia -->
+ <sid value="11438"/> <!-- Kabardino-Balkariya -->
+ <sid value="11440"/> <!-- Kalmykia -->
+ <sid value="11442"/> <!-- Karachayevo-Cherkessiya -->
+ <sid value="11446"/> <!-- Karelia -->
+ <sid value="11452"/> <!-- Komi -->
+ <sid value="11456"/> <!-- Mordovia -->
+ <sid value="11462"/> <!-- Yakutiya -->
+ <sid value="11465"/> <!-- North Osetia -->
+ <sid value="11482"/> <!-- Tatarstan -->
+ <sid value="11484"/> <!-- Tuva -->
+ <sid value="11492"/> <!-- Udmurtiya -->
+ <sid value="11494"/> <!-- Khakasia -->
+ <sid value="11498"/> <!-- Chechnya -->
+ <sid value="11510"/> <!-- Altay area -->
+ <sid value="11532"/> <!-- Krasnodar -->
+ <sid value="11546"/> <!-- Krasnoyarsk -->
+ <sid value="11556"/> <!-- Primorsky area -->
+ <sid value="11568"/> <!-- Stavropol -->
+ <sid value="11572"/> <!-- Amur area -->
+ <sid value="11578"/> <!-- Arkhangelsk -->
+ <sid value="11582"/> <!-- Astrakhan -->
+ <sid value="11590"/> <!-- Belgorod -->
+ <sid value="11596"/> <!-- Bryansk -->
+ <sid value="11604"/> <!-- Vladimir -->
+ <sid value="11616"/> <!-- Volgograd -->
+ <sid value="11622"/> <!-- Vologda -->
+ <sid value="11630"/> <!-- Ivanovo -->
+ <sid value="11642"/> <!-- Irkutsk -->
+ <sid value="11646"/> <!-- Kaliningrad -->
+ <sid value="11650"/> <!-- Kaluga -->
+ <sid value="11668"/> <!-- Kemerovo -->
+ <sid value="11672"/> <!-- Kostroma -->
+ <sid value="11676"/> <!-- Kurgan -->
+ <sid value="11684"/> <!-- Kursk -->
+ <sid value="11692"/> <!-- Leningrad area -->
+ <sid value="11698"/> <!-- Lipetsk -->
+ <sid value="11700"/> <!-- Magadan -->
+ <sid value="11732"/> <!-- Moscow area -->
+ <sid value="11736"/> <!-- Murmansk -->
+ <sid value="11754"/> <!-- Nizhniy Novgorod -->
+ <sid value="11758"/> <!-- V. Novgorog -->
+ <sid value="11772"/> <!-- Novosibirsk -->
+ <sid value="11780"/> <!-- Kirov -->
+ <sid value="11784"/> <!-- Chuvashia -->
+ <sid value="11788"/> <!-- Evreysky district -->
+ <sid value="11790"/> <!-- Aginsky-Buryatsky district -->
+ <sid value="11794"/> <!-- Penza -->
+ <sid value="11802"/> <!-- Mariy El -->
+ <sid value="11806"/> <!-- Koryak district -->
+ <sid value="11816"/> <!-- Omsk -->
+ <sid value="11826"/> <!-- Orenburg -->
+ <sid value="11830"/> <!-- Orel -->
+ <sid value="11844"/> <!-- Perm -->
+ <sid value="11848"/> <!-- Pskov -->
+ <sid value="11868"/> <!-- Rostov -->
+ <sid value="11874"/> <!-- Tomsk -->
+ <sid value="11884"/> <!-- Voronezh -->
+ <sid value="11892"/> <!-- Ryazan -->
+ <sid value="11908"/> <!-- Samara -->
+ <sid value="11922"/> <!-- Saratov -->
+ <sid value="11924"/> <!-- Sakhalin -->
+ <sid value="11948"/> <!-- Sverdlovsk -->
+ <sid value="11960"/> <!-- Tambov -->
+ <sid value="11964"/> <!-- Smolensk -->
+ <sid value="11968"/> <!-- Tver -->
+ <sid value="11978"/> <!-- Tula -->
+ <sid value="11984"/> <!-- Tyumen -->
+ <sid value="11990"/> <!-- Ul yanovsk -->
+ <sid value="12006"/> <!-- Chelyabinsk -->
+ <sid value="12012"/> <!-- Chita -->
+ <sid value="12020"/> <!-- Yaroslavl -->
+ <sid value="12060"/> <!-- Moscow -->
+ <sid value="12061"/> <!-- Moscow -->
+ <sid value="12063"/> <!-- St. Petersburg -->
+ <sid value="12064"/> <!-- St. Petersburg -->
+ <sid value="12065"/> <!-- Kemerovo -->
+ <sid value="12066"/> <!-- Kemerovo -->
+ <sid value="12067"/> <!-- Sverdlovsk -->
+ <sid value="12085"/> <!-- Nenetskiy district -->
+ <sid value="12087"/> <!-- Ust-Ordynsky district -->
+ <sid value="12090"/> <!-- Khanty-Mansi district -->
+ <sid value="12092"/> <!-- Chukotsky district -->
+ <sid value="12094"/> <!-- Yamal-Nenets district -->
+ <sid value="12095"/> <!-- Kamchatka -->
+ </cdma>
+ </provider>
+ <provider>
+ <name>U-tel</name>
+ <gsm>
+ <network-id mcc="250" mnc="39"/>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <apn value="internet.usi.ru">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mnc039.mcc250.gprs">
+ <usage type="mms"/>
+ <name>mms</name>
+ <mmsc>mms.usi.ru</mmsc>
+ <mmsproxy>192.168.168.192:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Saudi Arabia -->
+<country code="sa">
+ <provider>
+ <name>Mobily</name>
+ <gsm>
+ <network-id mcc="420" mnc="03"/>
+ <apn value="web1">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ </apn>
+ <apn value="web2">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Prepaid</name>
+ </apn>
+ <apn value="mms1">
+ <usage type="mms"/>
+ <name>mobily MMS (Postpaid)</name>
+ <mmsc>http://10.3.3.133:9090/was</mmsc>
+ <mmsproxy>10.3.2.133:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>STC</name>
+ <gsm>
+ <network-id mcc="420" mnc="01"/>
+ <apn value="jawalnet.com.sa">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.118.133.101</dns>
+ <dns>212.118.133.102</dns>
+ </apn>
+ <apn value="mms.net.sa">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://mms.net.sa:8002</mmsc>
+ <mmsproxy>10.1.1.1:8080</mmsproxy>
+ </apn>
+ <apn value="mms.net.sa">
+ <usage type="mms"/>
+ <name>ALJAWAL MMS</name>
+ <mmsc>http://mms.net.sa:8002</mmsc>
+ <mmsproxy>10.1.1.1:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="420" mnc="04"/>
+ <apn value="zain">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+
+<!-- Sweden -->
+<country code="se">
+ <provider primary="true">
+ <name>3</name>
+ <gsm>
+ <network-id mcc="240" mnc="02"/>
+ <network-id mcc="240" mnc="04"/>
+ <!-- http://www.tre.se/templates/Sporg3_02.aspx?id=4231 -->
+ <apn value="data.tre.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobiltelefon</name>
+ </apn>
+ <!-- http://www.tre.se/templates/Sporg3_02.aspx?id=4231 -->
+ <apn value="bredband.tre.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Bredband</name>
+ </apn>
+ <apn value="net.tre.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Bredband Kontantkort</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Glocalnet</name>
+ <gsm>
+ <network-id mcc="240" mnc="08"/>
+ <!-- http://glocalnet.se/mobiltbredband -->
+ <apn value="bredband.glocalnet.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Bredband</name>
+ </apn>
+ <!-- http://kundservice.glocalnet.se/Kundservice/Mobiltelefoni/Installningar/ -->
+ <apn value="internet.glocalnet.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Glocalnet Internet</name>
+ </apn>
+ <apn value="services.glocalnet.se">
+ <usage type="mms"/>
+ <name>Glocalnet MMS</name>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>172.30.253.241:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Halebop</name>
+ <gsm>
+ <network-id mcc="240" mnc="01"/>
+
+ <!-- http://www.halebop.se/halebop_kundtjanst/vanliga_fragor_kontantkort/ -->
+ <apn value="halebop.telia.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.telia.se">
+ <usage type="mms"/>
+ <name>Halebop MMS</name>
+ <mmsc>http://mmss/</mmsc>
+ <mmsproxy>193.209.134.132:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- http://www.ice.net/Mobilt-bredband-1373.aspx -->
+ <name>ice.net (Nordisk Mobiltelefon)</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Tele2</name>
+ <gsm>
+ <network-id mcc="240" mnc="07"/>
+ <network-id mcc="240" mnc="05"/>
+
+ <voicemail>222</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ <dtmf>211</dtmf>
+ </balance-check>
+
+ <!-- http://www.tele2.se/internet-via-gprs.html -->
+ <apn value="internet.tele2.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Internet</name>
+ </apn>
+ <!-- http://www.tele2.se/alien-modem.html -->
+ <apn value="mobileinternet.tele2.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Bredband</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Comviq</name>
+ <gsm>
+ <network-id mcc="240" mnc="07"/>
+ <network-id mcc="240" mnc="05"/>
+
+ <voicemail>222</voicemail>
+ <balance-check>
+ <ussd>*111#</ussd>
+ <dtmf>211</dtmf>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*110*CODE#</ussd>
+ </balance-top-up>
+
+ <apn value="data.comviq.se">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Surf</name>
+ </apn>
+
+ <apn value="internet.tele2.se">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Tele2 Comviq 3G</name>
+ </apn>
+ <apn value="mobileinternet.tele2.se">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Tele2 Comviq 3G (7,2 Mbit/s)</name>
+ </apn>
+ <apn value="internet.tele2.se">
+ <usage type="mms"/>
+ <name>Tele2 MMS</name>
+ <mmsc>http://mmsc.tele2.se</mmsc>
+ <mmsproxy>130.244.202.30:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Multicom Security</name>
+ <gsm>
+ <network-id mcc="240" mnc="01"/>
+ <network-id mcc="240" mnc="05"/>
+
+ <!-- http://multicomsecurity.se/produkter-tjanster/mobil-datakommunikation/mobiflex/ -->
+ <apn value="mobiflex.telia.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobiflex</name>
+ </apn>
+ <apn value="mms.telia.se">
+ <usage type="mms"/>
+ <name>Telia MMS</name>
+ <mmsc>http://mmss/</mmsc>
+ <mmsproxy>193.209.134.132:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telenor</name>
+ <gsm>
+ <network-id mcc="240" mnc="04"/>
+ <network-id mcc="240" mnc="06"/>
+ <network-id mcc="240" mnc="08"/>
+
+ <voicemail>888</voicemail>
+ <balance-check>
+ <ussd>*222#</ussd>
+ </balance-check>
+
+ <!-- http://www.telenor.se/privat/mobiltelefoni/alla-mobiltjanster/alla-mobiltjanster.html#C45-2100 -->
+ <apn value="internet.telenor.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Internet</name>
+ </apn>
+ <apn value="services.telenor.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilsurf med maxtaxa</name>
+ </apn>
+ <apn value="bredband.telenor.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Bredband</name>
+ </apn>
+ <apn value="sp-services">
+ <usage type="mms"/>
+ <name>Cellmobile MMS</name>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>172.30.253.241:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Telia</name>
+ <gsm>
+ <network-id mcc="240" mnc="01"/>
+ <network-id mcc="240" mnc="05"/>
+
+ <voicemail>*133#</voicemail>
+ <balance-check>
+ <ussd>*120#</ussd>
+ <ussd>*121#</ussd>
+ </balance-check>
+
+ <!-- http://www3.telia.se/foretag/mobilguiden/ -->
+ <apn value="online.telia.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Telia 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TDC</name>
+ <gsm>
+ <network-id mcc="240" mnc="14"/>
+ <apn value="internet.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="data.tre.se">
+ <usage type="mms"/>
+ <name>3mms</name>
+ <mmsc>http://mms.tre.se</mmsc>
+ <mmsproxy>mmsproxy.tre.se:8799</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>djuice</name>
+ <gsm>
+ <network-id mcc="240" mnc="09"/>
+ <apn value="internet.djuice.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Com Hem</name>
+ <gsm>
+ <network-id mcc="240" mnc="02"/>
+ <network-id mcc="240" mnc="04"/>
+ <!-- MVNO operating on 3's network -->
+ <apn value="bredband.comhem.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Parlino</name>
+ <gsm>
+ <network-id mcc="240" mnc="07"/>
+ <apn value="internet.parlino.se">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Universal Telecom</name>
+ <gsm>
+ <!-- http://www.uvtc.com/SWEDEN/internet/mobiltbredband/Default.aspx -->
+ <apn value="sp-internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Bredband</name>
+ </apn>
+ <!-- http://www.uvtc.com/sweden/Mobil/Faq/default.aspx -->
+ <apn value="internet.uvtc.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobilt Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Singapore -->
+<country code="sg">
+ <provider>
+ <name>M1</name>
+ <gsm>
+ <network-id mcc="525" mnc="03"/>
+ <!-- http://m1.com.sg/filedownloads/popup/Miworld/popup_se2.5.html mid page -->
+ <apn value="sunsurf">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>SunSurf/Mobile Broadband (postpaid)</name>
+ <username>65</username>
+ <dns>202.79.64.21</dns>
+ <dns>202.79.64.26</dns>
+ </apn>
+ <!-- http://m1.com.sg/filedownloads/popup/Miworld/popup_se2.5.html top page-->
+ <apn value="miworld">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>MiWorld Mobile (postpaid)</name>
+ <username>65(mobilenumber)</username>
+ <password>user123</password>
+ </apn>
+ <!-- http://m1.com.sg/filedownloads/popup/Miworld/popup_se2.5.html lower page -->
+ <apn value="miworldcard">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>MiWorld Mobile (prepaid)</name>
+ <username>65(mobilenumber)</username>
+ <password>user123</password>
+ </apn>
+ <apn value="prepaidbb">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband (prepaid)</name>
+ </apn>
+ <apn value="sunsurfmcard">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>M Card (prepaid)</name>
+ </apn>
+ <apn value="miworld">
+ <usage type="mms"/>
+ <name>M1 MMS</name>
+ <username>+65</username>
+ <password>user123</password>
+ <mmsc>http://mmsgw:8002/</mmsc>
+ <mmsproxy>172.16.14.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>SingTel</name>
+ <gsm>
+ <network-id mcc="525" mnc="01"/>
+ <network-id mcc="525" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>165.21.100.88</dns>
+ <dns>165.21.83.88</dns>
+ </apn>
+ <apn value="e-ideas">
+ <usage type="mms"/>
+ <name>IDEAS MMS</name>
+ <username>65IDEAS</username>
+ <password>IDEAS</password>
+ <mmsc>http://mms.singtel.com:10021/mmsc</mmsc>
+ <mmsproxy>165.21.42.84:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Starhub</name>
+ <gsm>
+ <network-id mcc="525" mnc="05"/>
+ <apn value="shwap">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>WAP</name>
+ <username>star</username>
+ <password>hub</password>
+ <dns>203.116.1.78</dns>
+ </apn>
+ <apn value="shppd">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>MaxMobile Broadband (prepaid)</name>
+ </apn>
+ <apn value="shinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>MaxMobile Broadband (postpaid)</name>
+ </apn>
+ <apn value="shmms">
+ <usage type="mms"/>
+ <name>Gee! MMS</name>
+ <mmsc>http://mms.starhubgee.com.sg:8002/</mmsc>
+ <mmsproxy>10.12.1.80:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Slovenia -->
+<country code="si">
+ <provider>
+ <name>Mobitel</name>
+ <gsm>
+ <network-id mcc="293" mnc="41"/>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Postpaid</name>
+ <username>mobitel</username>
+ <password>internet</password>
+ <dns>213.229.248.161</dns>
+ <dns>193.189.160.11</dns>
+ </apn>
+ <apn value="internetpro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mobitel</username>
+ <password>internet</password>
+ <dns>213.229.248.161</dns>
+ <dns>193.189.160.11</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone / Simobil</name>
+ <gsm>
+ <network-id mcc="293" mnc="40"/>
+ <msisdn-query>
+ <ussd>*100#</ussd>
+ </msisdn-query>
+ <apn value="internet.simobil.si">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>simobil</username>
+ <password>internet</password>
+ <dns>121.30.86.130</dns>
+ <dns>193.189.160.11</dns>
+ </apn>
+ <apn value="mms.simobil.si">
+ <usage type="mms"/>
+ <name>SI mobil MMS</name>
+ <username>simobil</username>
+ <password>internet</password>
+ <mmsc>http://mmc/</mmsc>
+ <mmsproxy>80.95.224.46:9201</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-2</name>
+ <gsm>
+ <network-id mcc="293" mnc="64"/>
+ <apn value="internet.t-2.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.t-2.net">
+ <usage type="mms"/>
+ <name>T2 MMS</name>
+ <mmsc>http://www.mms.t-2.net:8002</mmsc>
+ <mmsproxy>172.20.18.137:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Slovakia -->
+<country code="sk">
+ <provider>
+ <name>Slovak Telekom</name>
+ <gsm>
+ <network-id mcc="231" mnc="02"/>
+ <network-id mcc="231" mnc="04"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>195.91.0.17</dns>
+ <dns>194.154.227.17</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>T-Mobile MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>192.168.1.1:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="231" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>213.151.200.31</dns>
+ <dns>213.151.208.162</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>O2</name>
+ <gsm>
+ <network-id mcc="231" mnc="06"/>
+ <apn value="o2internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ <dns>160.218.161.60</dns>
+ <dns>194.228.211.33</dns>
+ </apn>
+ <apn value="o2mms">
+ <usage type="mms"/>
+ <name>O2 SK MMS</name>
+ <mmsc>http://mms.o2world.sk:8002</mmsc>
+ <mmsproxy>10.97.1.11:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Senegal -->
+<country code="sn">
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="608" mnc="02"/>
+ <apn value="wap.sentelgsm.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>200.85.0.104</dns>
+ <dns>200.85.0.107</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- El Salvador -->
+<country code="sv">
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="706" mnc="04"/>
+ <apn value="internet.movistar.sv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>movistarsv</username>
+ <password>movistarsv</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>digicel</name>
+ <gsm>
+ <network-id mcc="706" mnc="02"/>
+ <apn value="wap.digicelsv.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="wap.digicelsv.com">
+ <usage type="mms"/>
+ <name>Digicel El Salvador MMS</name>
+ <mmsc>http://172.26.5.132/servlets/mms</mmsc>
+ <mmsproxy>172.26.5.12:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tigo</name>
+ <gsm>
+ <network-id mcc="706" mnc="03"/>
+ <apn value="internet.tigo.sv">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="706" mnc="10"/>
+ <apn value="internet.ideasclaro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Sudan -->
+<country code="sd">
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="634" mnc="01"/>
+ <balance-check>
+ <ussd>*888#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*888*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTN</name>
+ <!-- http://www.mtn.sd/en/section/faq "Manual configuration of settings" -->
+ <gsm>
+ <network-id mcc="634" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sudani</name>
+ <!-- http://sudani.sd/PublicOne/Content/Support/HowTo.ConnectToInternet -->
+ <gsm>
+ <network-id mcc="634" mnc="07"/>
+ <apn value="sudaninet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>sudani</username>
+ <password>sudani</password>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>sudani</username>
+ <password>sudani</password>
+ </cdma>
+ </provider>
+</country>
+
+<!-- Thailand -->
+<country code="th">
+ <provider>
+ <name>AIS</name>
+ <gsm>
+ <network-id mcc="520" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.183.255.20</dns>
+ <dns>202.183.255.21</dns>
+ </apn>
+ <apn value="multimedia">
+ <usage type="mms"/>
+ <name>AIS-GPRS-3 MMS</name>
+ <mmsc>http://mms.mobilelife.co.th</mmsc>
+ <mmsproxy>203.170.229.34:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>DTAC</name>
+ <gsm>
+ <network-id mcc="520" mnc="18"/>
+ <apn value="www.dtac.co.th">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>202.44.202.2</dns>
+ <dns>203.44.144.33</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>DTAC-GPRS-3 MMS</name>
+ <mmsc>http://mms.dtac.co.th:8002/</mmsc>
+ <mmsproxy>203.155.200.133:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>True Move</name>
+ <gsm>
+ <network-id mcc="520" mnc="99"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>true</username>
+ <password>true</password>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>True GPRS 3 MMS</name>
+ <username>true</username>
+ <password>true</password>
+ <mmsc>http://mms.trueworld.net:8002/</mmsc>
+ <mmsproxy>10.4.7.39:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TOT 3G</name>
+ <gsm>
+ <network-id mcc="520" mnc="15"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Tunisia -->
+<country code="tn">
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="605" mnc="01"/>
+ <apn value="weborange">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet</name>
+ </apn>
+ <apn value="mms.otun">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>Internet + MMS</name>
+ </apn>
+ <apn value="keygp">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere Prepaid</name>
+ </apn>
+ <apn value="keypro">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet Everywhere Professional</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tunisie Télécom / TUNTEL</name>
+ <gsm>
+ <network-id mcc="605" mnc="02"/>
+ <apn value="mms.tn">
+ <plan type="postpaid"/>
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>mms@tt1</username>
+ <password>mms</password>
+ </apn>
+ <apn value="gprs.tn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS DATA</name>
+ <username>gprs</username>
+ <password>gprs</password>
+ </apn>
+ <apn value="internet.tn">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>WEB DATA</name>
+ </apn>
+ <apn value="mms.tn">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <username>mms@tt1</username>
+ <password>mms</password>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>213.150.186.106:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Tunisiana</name>
+ <gsm>
+ <network-id mcc="605" mnc="03"/>
+ <apn value="internet.tunisiana.com">
+ <name>Internet</name>
+ <username>internet</username>
+ <password>internet</password>
+ </apn>
+ <apn value="mms.tunisiana.com">
+ <usage type="mms"/>
+ <name>mms tunisiana</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mmsc.tunisiana.com</mmsc>
+ <mmsproxy>10.3.2.100:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Turkey -->
+<country code="tr">
+ <provider>
+ <name>Avea</name>
+ <gsm>
+ <network-id mcc="286" mnc="03"/>
+ <network-id mcc="286" mnc="04"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>212.156.4.4</dns>
+ <dns>212.156.4.20</dns>
+ </apn>
+
+ <apn value="aycell">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>(former Aycell)</name>
+ <dns>212.156.4.1</dns>
+ <dns>212.156.4.4</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Avea MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms.avea.com.tr/servlets/mms</mmsc>
+ <mmsproxy>213.161.151.201:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Turkcell</name>
+ <gsm>
+ <!-- http://www.turkcell.com.tr/Downloads/servis-yazilimi/3g/VINN3GModemE180/VINN_2_0_sms_profil_sebeke_aygit_bilgisi.pdf -->
+ <!-- http://www.turkcell.com.tr/bireysel/cihazlar/Sayfalar/vinnailesi/Turkcell-DC-VINN.aspx -->
+ <network-id mcc="286" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Turkcell internet</name>
+ </apn>
+ <apn value="mgb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Turkcell 3G</name>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Turkcell MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms.turkcell.com.tr/servlets/mms</mmsc>
+ <mmsproxy>212.252.169.217:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodafone</name>
+ <gsm>
+ <network-id mcc="286" mnc="02"/><!-- mnc="0251" in Vodofone XML -->
+ <msisdn-query>
+ <ussd>*101#</ussd>
+ </msisdn-query>
+ <apn value="internet">
+ <usage type="internet"/>
+ <name>Vodafone Internet</name>
+ <username>vodafone</username>
+ <password>vodafone</password>
+ </apn>
+ <!--
+ KKTC Telsim was a subsidiary of Telsim Group in Turkey which was taken
+ over by the Vodafone Group 2006 and rebranded as Vodafone in 2007.
+ Due to the political situation in Northern Cyprus the company shares the
+ Vodafone Turkey MCC and MNC codes although it is logically a separate
+ operator. The brand KKTC Telsim is still used in Northern Cyprus due to
+ Vodafone Group agreements with Cytamobile-Vodafone in Southern Cyprus.
+ -->
+ <apn value="edge.kktctelsim.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>KKTC Telsim</name>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Trinidad & Tobago -->
+<country code="tt">
+ <provider>
+ <name>Digicel</name>
+ <gsm>
+ <network-id mcc="374" mnc="13"/>
+ <apn value="wap.digiceltt.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="wap.digiceltt.com">
+ <usage type="mms"/>
+ <name>Digicel Trinidad MMS</name>
+ <username>wap</username>
+ <password>wap</password>
+ <mmsc>http://mmc.digiceltt.com/servlets/mms</mmsc>
+ <mmsproxy>172.20.6.12:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>bmobile / TSTT</name>
+ <gsm>
+ <network-id mcc="374" mnc="12"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wap</username>
+ <password>wap</password>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Bmobile mms</name>
+ <mmsc>http://192.168.210.104/mmrelay.app</mmsc>
+ <mmsproxy>192.168.210.104:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Taiwan -->
+<country code="tw">
+ <provider>
+ <name>Chunghwa Telecom (emome)</name>
+ <name xml:lang="zh">中華電信 (emome)</name>
+ <gsm>
+ <network-id mcc="466" mnc="92"/>
+ <!-- http://www.nav4all.com/site2/www.nav4all.com/enguk/gprs_settings_taiwan_chunghwatelekom_nav4all.php?m=F3 -->
+ <apn value="emome">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>web</username>
+ <password>web</password>
+ </apn>
+ <!-- Vodafone Broadband Connect version 10.1.0.23908 2010-06-07T17:47:01 lists username/pass = web. Others list empty -->
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="emome">
+ <usage type="mms"/>
+ <name>CHT MMS</name>
+ <mmsc>http://mms.emome.net:8002</mmsc>
+ <mmsproxy>10.1.1.1:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Far EasTone / KGT</name>
+ <name xml:lang="zh">遠傳電信 / 和信電訊</name>
+ <gsm>
+ <network-id mcc="466" mnc="01"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="fetnet01">
+ <usage type="mms"/>
+ <name>遠傳影音訊息</name>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>210.241.199.199:9201</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TW Mobile</name>
+ <name xml:lang="zh">台湾大哥大</name>
+ <gsm>
+ <network-id mcc="466" mnc="99"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>catch MMS</name>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>211.78.224.100:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>TransAsia</name>
+ <name xml:lang="zh">泛亞電信</name>
+ <gsm>
+ <network-id mcc="466" mnc="97"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="vibo">
+ <usage type="mms"/>
+ <name>VIBO行動網-MMS</name>
+ <mmsc>http://mms</mmsc>
+ <mmsproxy>172.24.128.36:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vibo Telecom / Aurora</name>
+ <name xml:lang="zh">威寶電信 (Vibo) / 震旦電信 (Aurora)</name>
+ <gsm>
+ <network-id mcc="466" mnc="89"/>
+ <apn value="vibo">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="MMS">
+ <usage type="mms"/>
+ <name>Vodacom MMS</name>
+ <mmsproxy>10.154.0.12</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Asia Pacific Telecom (APBW)</name>
+ <name xml:lang="zh">亞太電信 (亞太行動寬頻電信)</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Tanzania, United Republic of -->
+<country code="tz">
+ <provider>
+ <name>Airtel Tanzania</name>
+ <gsm>
+ <network-id mcc="640" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodacom</name>
+ <gsm>
+ <network-id mcc="640" mnc="04"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zantel</name>
+ <gsm>
+ <network-id mcc="640" mnc="03"/>
+ <apn value="znet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>@zantel.com</username>
+ <password> </password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>tiGO</name>
+ <gsm>
+ <network-id mcc="640" mnc="02"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sasatel</name>
+ <cdma>
+ <username>sasatel</username>
+ <password>sasatel</password>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="9891"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>TTCL</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Ukraine -->
+<country code="ua">
+ <provider>
+ <name>kyivstar</name>
+ <gsm>
+ <network-id mcc="255" mnc="03"/>
+
+ <apn value="www.ab.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Ace&amp;Base</name>
+ <username>igprs</username>
+ <password>internet</password>
+ </apn>
+ <apn value="www.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Contract GPRS</name>
+ </apn>
+ <apn value="3g.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet 3G</name>
+ </apn>
+ <apn value="mms.kyivstar.net">
+ <usage type="mms"/>
+ <name>Kyivstar MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms.kyivstar.net</mmsc>
+ <mmsproxy>10.10.10.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Djuice</name>
+ <gsm>
+ <network-id mcc="255" mnc="03"/>
+
+ <apn value="www.djuice.com.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet GPRS</name>
+ </apn>
+ <apn value="xl.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet XL</name>
+ </apn>
+ <apn value="3g.kyivstar.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet 3G</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <!-- http://www.life.com.ua/index.php?area=lifebox&lng=en&page=15-12 -->
+ <name>life:)</name>
+ <gsm>
+ <network-id mcc="255" mnc="06"/>
+ <balance-check>
+ <ussd>*111#</ussd>
+ </balance-check>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Standard</name>
+ <dns>212.58.160.33</dns>
+ <dns>212.58.160.34</dns>
+ </apn>
+ <apn value="speed">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Faster</name>
+ <dns>212.58.160.33</dns>
+ <dns>212.58.160.34</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="255" mnc="02"/>
+ <apn value="internet.beeline.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Jeans</name>
+ <gsm>
+ <network-id mcc="255" mnc="01"/>
+ <apn value="www.jeans.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>80.255.64.23</dns>
+ <dns>80.255.64.24</dns>
+ </apn>
+ <apn value="hyper.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Hyper.NET</name>
+ <dns>212.58.160.33</dns>
+ <dns>212.58.160.34</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTS</name>
+ <gsm>
+ <network-id mcc="255" mnc="01"/>
+
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS Internet</name>
+ <username>internet</username>
+ <dns>212.58.160.33</dns>
+ <dns>212.58.160.34</dns>
+ </apn>
+ <apn value="hyper.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Hyper.NET</name>
+ </apn>
+ <apn value="active">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>HyperActive</name>
+ </apn>
+ <apn value="www.umc.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>umc.ua</name>
+ <dns>80.255.64.23</dns>
+ <dns>80.255.64.24</dns>
+ </apn>
+ </gsm>
+ <cdma>
+ <name>MTS Connect 3G</name>
+ <username>mobile</username>
+ <password>internet</password>
+ <sid value="15907"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Utel</name>
+ <gsm>
+ <network-id mcc="255" mnc="07"/>
+ <apn value="3g.utel.ua">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="3g.utel.ua">
+ <usage type="mms"/>
+ <name>Utel MMS</name>
+ <mmsc>http://10.212.1.4/mms/wapenc</mmsc>
+ <mmsproxy>10.212.3.148:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>CDMA Ukraine</name>
+ <cdma>
+ <username>cdma</username>
+ <password>cdma</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>InterTelecom</name>
+ <cdma>
+ <username>IT@IT</username>
+ <password>IT</password>
+ <sid value="15906"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>PEOPLEnet</name>
+ <cdma/>
+ </provider>
+</country>
+
+<!-- Uganda -->
+<country code="ug">
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="641" mnc="10"/>
+ <apn value="yellopix.mtn.co.ug">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>193.108.252.50</dns>
+ <dns>193.108.252.51</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Orange</name>
+ <gsm>
+ <network-id mcc="641" mnc="14"/>
+ <apn value="orange.ug">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms.warid.co.ug">
+ <usage type="mms"/>
+ <name>warid mms</name>
+ <mmsc>http://mms.waridtel.co.ug</mmsc>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>UTL</name>
+ <gsm>
+ <network-id mcc="641" mnc="11"/>
+ <apn value="utbroadband">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ </apn>
+ <apn value="utweb">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ </apn>
+ <apn value="utwap">
+ <usage type="mms"/>
+ <name>Ug Telcom MMS</name>
+ <mmsc>http://mmsc.ugandatelecom.com/</mmsc>
+ <mmsproxy>10.76.101.51:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Warid</name>
+ <gsm>
+ <network-id mcc="641" mnc="22"/>
+ <!-- http://www.waridtel.co.ug/gprs.php -->
+ <apn value="web.waridtel.co.ug">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Zain</name>
+ <gsm>
+ <network-id mcc="641" mnc="01"/>
+ <apn value="web.ug.zain.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- United States -->
+<country code="us">
+ <provider>
+ <name>AT&amp;T</name>
+ <gsm>
+ <network-id mcc="310" mnc="038"/>
+ <network-id mcc="310" mnc="090"/>
+ <network-id mcc="310" mnc="150"/>
+ <network-id mcc="310" mnc="410"/>
+ <network-id mcc="310" mnc="560"/>
+ <network-id mcc="310" mnc="680"/>
+ <!-- http://www.wireless.att.com/answer-center/main.jsp?solutionId=35078&t=solutionTab -->
+ <apn value="wap.cingular">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>MEdia Net (phones)</name>
+ </apn>
+ <apn value="Broadband">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>LaptopConnect (data cards)</name>
+ </apn>
+ <apn value="isp.cingular">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Data Connect (old)</name>
+ </apn>
+ <apn value="pta">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>LTE</name>
+ </apn>
+ <apn value="wap.cingular">
+ <usage type="mms"/>
+ <name>AT&amp;T MMS</name>
+ <username>WAP@CINGULARGPRS.COM</username>
+ <password>CINGULAR1</password>
+ <mmsc>http://mmsc.cingular.com</mmsc>
+ <mmsproxy>wireless.cingular.com:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>T-Mobile</name>
+ <gsm>
+ <network-id mcc="310" mnc="026"/>
+ <network-id mcc="310" mnc="160"/>
+ <network-id mcc="310" mnc="200"/>
+ <network-id mcc="310" mnc="210"/>
+ <network-id mcc="310" mnc="220"/>
+ <network-id mcc="310" mnc="230"/>
+ <network-id mcc="310" mnc="240"/>
+ <network-id mcc="310" mnc="250"/>
+ <network-id mcc="310" mnc="260"/>
+ <network-id mcc="310" mnc="270"/>
+ <network-id mcc="310" mnc="310"/>
+ <network-id mcc="310" mnc="490"/>
+ <network-id mcc="310" mnc="580"/>
+ <network-id mcc="310" mnc="660"/>
+ <network-id mcc="310" mnc="800"/>
+
+ <voicemail>123</voicemail>
+ <apn value="fast.t-mobile.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>LTE</name>
+ </apn>
+ <apn value="epc.tmobile.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet/WebConnect</name>
+ <dns>10.177.0.34</dns>
+ <dns>10.164.103.44</dns>
+ </apn>
+ <apn value="wap.voicestream.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Web2Go/t-zones</name>
+ </apn>
+ <apn value="internet2.voicestream.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet (old)</name>
+ </apn>
+ <apn value="internet3.voicestream.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Internet with VPN (old)</name>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Cincinnati Bell Wireless</name>
+ <gsm>
+ <network-id mcc="310" mnc="420"/>
+ <apn value="wap.gocbw.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>cbw</username>
+ </apn>
+ <apn value="wap.gocbw.com">
+ <usage type="mms"/>
+ <name>CBW MMS</name>
+ <username>cbw</username>
+ <mmsc>http://mms.gocbw.com:8088/mms</mmsc>
+ <mmsproxy>216.68.79.202:80</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Sprint</name>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="4103"/>
+ <sid value="4106"/>
+ <sid value="4107"/>
+ <sid value="4120"/>
+ <sid value="4121"/>
+ <sid value="4124"/>
+ <sid value="4126"/>
+ <sid value="4132"/>
+ <sid value="4135"/>
+ <sid value="4139"/>
+ <sid value="4144"/>
+ <sid value="4145"/>
+ <sid value="4148"/>
+ <sid value="4151"/>
+ <sid value="4153"/>
+ <sid value="4155"/>
+ <sid value="4157"/>
+ <sid value="4159"/>
+ <sid value="4162"/>
+ <sid value="4164"/>
+ <sid value="4166"/>
+ <sid value="4168"/>
+ <sid value="4170"/>
+ <sid value="4171"/>
+ <sid value="4174"/>
+ <sid value="4180"/>
+ <sid value="4181"/>
+ <sid value="4183"/>
+ <sid value="4184"/>
+ <sid value="4186"/>
+ <sid value="4188"/>
+ <sid value="4190"/>
+ <sid value="4194"/>
+ <sid value="4195"/>
+ <sid value="4198"/>
+ <sid value="4274"/>
+ <sid value="4376"/>
+ <sid value="4379"/>
+ <sid value="4384"/>
+ <sid value="4390"/>
+ <sid value="4396"/>
+ <sid value="4418"/>
+ <sid value="4622"/>
+ <sid value="4654"/>
+ <sid value="4694"/>
+ <sid value="4812"/>
+ <sid value="4982"/>
+ <sid value="5116"/>
+ <sid value="5142"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Boost Mobile (Prepaid)</name>
+ <cdma/>
+ </provider>
+ <provider>
+ <name>Verizon</name>
+ <gsm>
+ <network-id mcc="310" mnc="995"/>
+ <network-id mcc="311" mnc="480"/>
+ <apn value="vzwims">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>4G LTE Contract</name>
+ </apn>
+ <apn value="vzwinternet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>4G LTE Contract</name>
+ <dns>66.174.92.14</dns>
+ <dns>69.78.96.14</dns>
+ </apn>
+ <apn value="vzwapp">
+ <plan type="postpaid"/>
+ <usage type="wap"/>
+ <name>4G LTE Contract</name>
+ </apn>
+ </gsm>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="2"/>
+ <sid value="4"/>
+ <sid value="5"/>
+ <sid value="6"/>
+ <sid value="8"/>
+ <sid value="12"/>
+ <sid value="15"/>
+ <sid value="17"/>
+ <sid value="18"/>
+ <sid value="20"/>
+ <sid value="21"/>
+ <sid value="22"/>
+ <sid value="26"/>
+ <sid value="28"/>
+ <sid value="30"/>
+ <sid value="32"/>
+ <sid value="33"/>
+ <sid value="37"/>
+ <sid value="40"/>
+ <sid value="41"/>
+ <sid value="48"/>
+ <sid value="51"/>
+ <sid value="54"/>
+ <sid value="56"/>
+ <sid value="58"/>
+ <sid value="59"/>
+ <sid value="60"/>
+ <sid value="64"/>
+ <sid value="65"/>
+ <sid value="69"/>
+ <sid value="73"/>
+ <sid value="75"/>
+ <sid value="78"/>
+ <sid value="80"/>
+ <sid value="86"/>
+ <sid value="92"/>
+ <sid value="93"/>
+ <sid value="94"/>
+ <sid value="95"/>
+ <sid value="96"/>
+ <sid value="104"/>
+ <sid value="107"/>
+ <sid value="110"/>
+ <sid value="112"/>
+ <sid value="113"/>
+ <sid value="119"/>
+ <sid value="126"/>
+ <sid value="127"/>
+ <sid value="133"/>
+ <sid value="137"/>
+ <sid value="139"/>
+ <sid value="143"/>
+ <sid value="150"/>
+ <sid value="154"/>
+ <sid value="162"/>
+ <sid value="163"/>
+ <sid value="165"/>
+ <sid value="170"/>
+ <sid value="172"/>
+ <sid value="179"/>
+ <sid value="180"/>
+ <sid value="181"/>
+ <sid value="186"/>
+ <sid value="189"/>
+ <sid value="190"/>
+ <sid value="203"/>
+ <sid value="213"/>
+ <sid value="214"/>
+ <sid value="222"/>
+ <sid value="224"/>
+ <sid value="226"/>
+ <sid value="228"/>
+ <sid value="241"/>
+ <sid value="250"/>
+ <sid value="258"/>
+ <sid value="262"/>
+ <sid value="263"/>
+ <sid value="266"/>
+ <sid value="272"/>
+ <sid value="276"/>
+ <sid value="284"/>
+ <sid value="286"/>
+ <sid value="294"/>
+ <sid value="298"/>
+ <sid value="299"/>
+ <sid value="300"/>
+ <sid value="314"/>
+ <sid value="316"/>
+ <sid value="319"/>
+ <sid value="323"/>
+ <sid value="328"/>
+ <sid value="329"/>
+ <sid value="330"/>
+ <sid value="349"/>
+ <sid value="356"/>
+ <sid value="377"/>
+ <sid value="385"/>
+ <sid value="404"/>
+ <sid value="428"/>
+ <sid value="443"/>
+ <sid value="456"/>
+ <sid value="465"/>
+ <sid value="482"/>
+ <sid value="483"/>
+ <sid value="486"/>
+ <sid value="490"/>
+ <sid value="498"/>
+ <sid value="502"/>
+ <sid value="506"/>
+ <sid value="528"/>
+ <sid value="530"/>
+ <sid value="532"/>
+ <sid value="539"/>
+ <sid value="1015"/>
+ <sid value="1026"/>
+ <sid value="1032"/>
+ <sid value="1034"/>
+ <sid value="1062"/>
+ <sid value="1072"/>
+ <sid value="1074"/>
+ <sid value="1076"/>
+ <sid value="1083"/>
+ <sid value="1086"/>
+ <sid value="1088"/>
+ <sid value="1094"/>
+ <sid value="1103"/>
+ <sid value="1129"/>
+ <sid value="1131"/>
+ <sid value="1137"/>
+ <sid value="1139"/>
+ <sid value="1145"/>
+ <sid value="1151"/>
+ <sid value="1153"/>
+ <sid value="1164"/>
+ <sid value="1166"/>
+ <sid value="1174"/>
+ <sid value="1180"/>
+ <sid value="1189"/>
+ <sid value="1193"/>
+ <sid value="1196"/>
+ <sid value="1220"/>
+ <sid value="1224"/>
+ <sid value="1227"/>
+ <sid value="1230"/>
+ <sid value="1267"/>
+ <sid value="1285"/>
+ <sid value="1330"/>
+ <sid value="1358"/>
+ <sid value="1417"/>
+ <sid value="1429"/>
+ <sid value="1476"/>
+ <sid value="1488"/>
+ <sid value="1492"/>
+ <sid value="1494"/>
+ <sid value="1506"/>
+ <sid value="1510"/>
+ <sid value="1514"/>
+ <sid value="1516"/>
+ <sid value="1517"/>
+ <sid value="1519"/>
+ <sid value="1523"/>
+ <sid value="1548"/>
+ <sid value="1552"/>
+ <sid value="1563"/>
+ <sid value="1567"/>
+ <sid value="1614"/>
+ <sid value="1626"/>
+ <sid value="1630"/>
+ <sid value="1632"/>
+ <sid value="1637"/>
+ <sid value="1639"/>
+ <sid value="1641"/>
+ <sid value="1653"/>
+ <sid value="1679"/>
+ <sid value="1736"/>
+ <sid value="1740"/>
+ <sid value="1749"/>
+ <sid value="1760"/>
+ <sid value="1776"/>
+ <sid value="1780"/>
+ <sid value="1790"/>
+ <sid value="1792"/>
+ <sid value="1824"/>
+ <sid value="1826"/>
+ <sid value="1827"/>
+ <sid value="1830"/>
+ <sid value="1832"/>
+ <sid value="1857"/>
+ <sid value="1910"/>
+ <sid value="1912"/>
+ <sid value="1940"/>
+ <sid value="1969"/>
+ <sid value="2004"/>
+ <sid value="2054"/>
+ <sid value="2058"/>
+ <sid value="2060"/>
+ <sid value="2076"/>
+ <sid value="2115"/>
+ <sid value="2119"/>
+ <sid value="2125"/>
+ <sid value="2127"/>
+ <sid value="2149"/>
+ <sid value="3004"/>
+ <sid value="3008"/>
+ <sid value="3046"/>
+ <sid value="3066"/>
+ <sid value="3216"/>
+ <sid value="3218"/>
+ <sid value="3228"/>
+ <sid value="6709"/>
+ <sid value="6711"/>
+ <sid value="7532"/>
+ <sid value="7536"/>
+ <sid value="9640"/>
+ <sid value="9642"/>
+ <sid value="9644"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>US Cellular</name>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm
+ NOTE: SIDs listed as "HOLLAND & KNIGHT LLP" are counted for US Cellular
+ because HOLLAND & KNIGHT LLP/Peter M. Connolly appears to be the
+ license administrator for US Cellular in those license areas listed
+ in the IFAST SID database as assigned to HOLLAND & KNIGHT LLP.
+ When a search of the FCC's ULS for the CMA noted for a SID by
+ IFAST does not return an active license held by
+ US Cellular/HOLLAND & KNIGHT LLP, that SID is not counted
+ for US Cellular (ex SID 1925, 1935, 5289, 5291, 5293, etc).
+ -->
+ <sid value="5"/>
+ <sid value="104"/>
+ <sid value="166"/>
+ <sid value="191"/>
+ <sid value="193"/>
+ <sid value="195"/>
+ <sid value="217"/>
+ <sid value="221"/>
+ <sid value="246"/>
+ <sid value="298"/>
+ <sid value="303"/>
+ <sid value="309"/>
+ <sid value="331"/>
+ <sid value="333"/>
+ <sid value="340"/>
+ <sid value="364"/>
+ <sid value="384"/>
+ <sid value="389"/>
+ <sid value="393"/>
+ <sid value="413"/>
+ <sid value="445"/>
+ <sid value="580"/>
+ <sid value="599"/>
+ <sid value="1059"/>
+ <sid value="1061"/>
+ <sid value="1075"/>
+ <sid value="1173"/>
+ <sid value="1175"/>
+ <sid value="1200"/>
+ <sid value="1211"/>
+ <sid value="1213"/>
+ <sid value="1219"/>
+ <sid value="1223"/>
+ <sid value="1228"/>
+ <sid value="1229"/>
+ <sid value="1237"/>
+ <sid value="1272"/>
+ <sid value="1317"/>
+ <sid value="1320"/>
+ <sid value="1399"/>
+ <sid value="1403"/>
+ <sid value="1406"/>
+ <sid value="1419"/>
+ <sid value="1425"/>
+ <sid value="1427"/>
+ <sid value="1484"/>
+ <sid value="1521"/>
+ <sid value="1541"/>
+ <sid value="1543"/>
+ <sid value="1574"/>
+ <sid value="1595"/>
+ <sid value="1607"/>
+ <sid value="1610"/>
+ <sid value="1643"/>
+ <sid value="1753"/>
+ <sid value="1779"/>
+ <sid value="1783"/>
+ <sid value="1794"/>
+ <sid value="1802"/>
+ <sid value="1819"/>
+ <sid value="1821"/>
+ <sid value="1881"/>
+ <sid value="1914"/>
+ <sid value="1983"/>
+ <sid value="2066"/>
+ <sid value="2141"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Alltel</name>
+ <gsm>
+ <!-- Former Western Wireless (roaming only) -->
+ <network-id mcc="310" mnc="590"/>
+ <apn value="MMS">
+ <usage type="mms"/>
+ <name>Picture Message</name>
+ <mmsc>http://mms.mycellonephone.com/highland/mms.php</mmsc>
+ <mmsproxy>66.255.55.23:80</mmsproxy>
+ </apn>
+ <apn value="cellular1wap">
+ <usage type="mms"/>
+ <name>CellularOne MMS</name>
+ <mmsc>http://mmsc</mmsc>
+ <mmsproxy>172.23.1.252:8799</mmsproxy>
+ </apn>
+ </gsm>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="32"/>
+ <sid value="42"/>
+ <sid value="52"/>
+ <sid value="53"/>
+ <sid value="54"/>
+ <sid value="57"/>
+ <sid value="71"/>
+ <sid value="74"/>
+ <sid value="79"/>
+ <sid value="83"/>
+ <sid value="84"/>
+ <sid value="85"/>
+ <sid value="97"/>
+ <sid value="100"/>
+ <sid value="114"/>
+ <sid value="116"/>
+ <sid value="120"/>
+ <sid value="126"/>
+ <sid value="130"/>
+ <sid value="142"/>
+ <sid value="144"/>
+ <sid value="152"/>
+ <sid value="156"/>
+ <sid value="182"/>
+ <sid value="186"/>
+ <sid value="188"/>
+ <sid value="202"/>
+ <sid value="204"/>
+ <sid value="205"/>
+ <sid value="208"/>
+ <sid value="212"/>
+ <sid value="216"/>
+ <sid value="220"/>
+ <sid value="240"/>
+ <sid value="244"/>
+ <sid value="256"/>
+ <sid value="260"/>
+ <sid value="272"/>
+ <sid value="281"/>
+ <sid value="282"/>
+ <sid value="292"/>
+ <sid value="304"/>
+ <sid value="306"/>
+ <sid value="312"/>
+ <sid value="318"/>
+ <sid value="338"/>
+ <sid value="342"/>
+ <sid value="344"/>
+ <sid value="348"/>
+ <sid value="350"/>
+ <sid value="368"/>
+ <sid value="374"/>
+ <sid value="376"/>
+ <sid value="386"/>
+ <sid value="387"/>
+ <sid value="392"/>
+ <sid value="396"/>
+ <sid value="416"/>
+ <sid value="418"/>
+ <sid value="424"/>
+ <sid value="430"/>
+ <sid value="440"/>
+ <sid value="444"/>
+ <sid value="448"/>
+ <sid value="462"/>
+ <sid value="478"/>
+ <sid value="487"/>
+ <sid value="491"/>
+ <sid value="504"/>
+ <sid value="518"/>
+ <sid value="520"/>
+ <sid value="544"/>
+ <sid value="546"/>
+ <sid value="547"/>
+ <sid value="550"/>
+ <sid value="558"/>
+ <sid value="570"/>
+ <sid value="578"/>
+ <sid value="1008"/>
+ <sid value="1012"/>
+ <sid value="1014"/>
+ <sid value="1016"/>
+ <sid value="1025"/>
+ <sid value="1031"/>
+ <sid value="1033"/>
+ <sid value="1038"/>
+ <sid value="1040"/>
+ <sid value="1042"/>
+ <sid value="1044"/>
+ <sid value="1046"/>
+ <sid value="1048"/>
+ <sid value="1052"/>
+ <sid value="1054"/>
+ <sid value="1056"/>
+ <sid value="1058"/>
+ <sid value="1093"/>
+ <sid value="1118"/>
+ <sid value="1120"/>
+ <sid value="1124"/>
+ <sid value="1126"/>
+ <sid value="1148"/>
+ <sid value="1154"/>
+ <sid value="1156"/>
+ <sid value="1236"/>
+ <sid value="1244"/>
+ <sid value="1246"/>
+ <sid value="1248"/>
+ <sid value="1250"/>
+ <sid value="1252"/>
+ <sid value="1254"/>
+ <sid value="1256"/>
+ <sid value="1258"/>
+ <sid value="1260"/>
+ <sid value="1262"/>
+ <sid value="1264"/>
+ <sid value="1266"/>
+ <sid value="1268"/>
+ <sid value="1270"/>
+ <sid value="1271"/>
+ <sid value="1296"/>
+ <sid value="1298"/>
+ <sid value="1302"/>
+ <sid value="1311"/>
+ <sid value="1332"/>
+ <sid value="1334"/>
+ <sid value="1336"/>
+ <sid value="1338"/>
+ <sid value="1340"/>
+ <sid value="1342"/>
+ <sid value="1344"/>
+ <sid value="1346"/>
+ <sid value="1348"/>
+ <sid value="1370"/>
+ <sid value="1372"/>
+ <sid value="1375"/>
+ <sid value="1383"/>
+ <sid value="1385"/>
+ <sid value="1393"/>
+ <sid value="1400"/>
+ <sid value="1414"/>
+ <sid value="1422"/>
+ <sid value="1424"/>
+ <sid value="1426"/>
+ <sid value="1466"/>
+ <sid value="1493"/>
+ <sid value="1495"/>
+ <sid value="1499"/>
+ <sid value="1501"/>
+ <sid value="1526"/>
+ <sid value="1528"/>
+ <sid value="1530"/>
+ <sid value="1532"/>
+ <sid value="1534"/>
+ <sid value="1536"/>
+ <sid value="1538"/>
+ <sid value="1540"/>
+ <sid value="1542"/>
+ <sid value="1544"/>
+ <sid value="1546"/>
+ <sid value="1558"/>
+ <sid value="1560"/>
+ <sid value="1566"/>
+ <sid value="1568"/>
+ <sid value="1638"/>
+ <sid value="1640"/>
+ <sid value="1642"/>
+ <sid value="1650"/>
+ <sid value="1652"/>
+ <sid value="1654"/>
+ <sid value="1688"/>
+ <sid value="1712"/>
+ <sid value="1720"/>
+ <sid value="1763"/>
+ <sid value="1765"/>
+ <sid value="1800"/>
+ <sid value="1816"/>
+ <sid value="1818"/>
+ <sid value="1866"/>
+ <sid value="1874"/>
+ <sid value="1900"/>
+ <sid value="1913"/>
+ <sid value="1916"/>
+ <sid value="1928"/>
+ <sid value="1930"/>
+ <sid value="1934"/>
+ <sid value="1938"/>
+ <sid value="1972"/>
+ <sid value="1982"/>
+ <sid value="1984"/>
+ <sid value="1986"/>
+ <sid value="1989"/>
+ <sid value="1992"/>
+ <sid value="2010"/>
+ <sid value="2012"/>
+ <sid value="2014"/>
+ <sid value="2018"/>
+ <sid value="2022"/>
+ <sid value="2026"/>
+ <sid value="2040"/>
+ <sid value="2044"/>
+ <sid value="2046"/>
+ <sid value="2064"/>
+ <sid value="2133"/>
+ <sid value="3020"/>
+ <sid value="3226"/>
+ <sid value="3244"/>
+ <sid value="3292"/>
+ <sid value="30524"/>
+ <sid value="30635"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Leap Wireless</name>
+ <cdma/>
+ </provider>
+ <provider>
+ <name>Cricket Communications</name>
+ <gsm>
+ <network-id mcc="310" mnc="000"/>
+ </gsm>
+ <cdma/>
+ </provider>
+ <provider>
+ <name>Jump Mobile (Prepaid)</name>
+ <cdma/>
+ </provider>
+ <provider>
+ <name>MetroPCS</name>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="4269"/>
+ <sid value="4273"/>
+ <sid value="4387"/>
+ <sid value="4531"/>
+ <sid value="4533"/>
+ <sid value="4547"/>
+ <sid value="4815"/>
+ <sid value="4855"/>
+ <sid value="5007"/>
+ <sid value="5023"/>
+ <sid value="5037"/>
+ <sid value="5097"/>
+ <sid value="5167"/>
+ <sid value="5199"/>
+ <sid value="21580"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Virgin Mobile / Helio</name>
+ <cdma>
+ <sid value="4183"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Cellular South</name>
+ <cdma>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm
+ NOTE: Cellular South appears to use "Lukas, Nace, Gutierrez & Sachs, Chartered"
+ as their license administrator, but that firm also administers Rural Cellular
+ Corporation (recently bought by Verizon) as well, so SIDs counted for
+ Cellular South were found by searching the FCC database for "Cellular South",
+ looking up the returned Cellular Market Areas in the IFAST database, and from
+ the IFAST database results using SIDs attributed to "Lukas, Nace, ..."
+ -->
+ <sid value="160"/>
+ <sid value="264"/>
+ <sid value="1382"/>
+ <sid value="1394"/>
+ <sid value="1996"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>BendBroadband</name>
+ <gsm>
+ <network-id mcc="311" mnc="570"/>
+ <apn value="ISP">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTPCS (Cellular One)</name>
+ <gsm>
+ <network-id mcc="310" mnc="570"/>
+ <apn value="wapgw.chinookwireless.net">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Mid-Rivers Cellular</name>
+ <cdma>
+ <sid value="3102"/>
+ </cdma>
+ </provider>
+ <provider>
+ <!-- MVNO operating on AT&T's network -->
+ <name>Straight Talk</name>
+ <gsm>
+ <network-id mcc="310" mnc="410"/>
+ <apn value="att.mvno">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="tfdata">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Uruguay -->
+<country code="uy">
+ <provider>
+ <name>Ancel</name>
+ <gsm>
+ <network-id mcc="748" mnc="00"/>
+ <network-id mcc="748" mnc="01"/>
+ <apn value="adslmovil">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>ADSL Móvil</name>
+ <dns>200.40.30.245</dns>
+ <dns>200.40.220.245</dns>
+ </apn>
+ <apn value="prepago.ancel">
+ <plan type="prepaid"/>
+ <usage type="internet"/>
+ <name>ADSL Móvil Prepago</name>
+ <username>BAM</username>
+ <password>BAM</password>
+ </apn>
+ <apn value="gprs.ancel">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>GPRS</name>
+ <dns>200.40.30.245</dns>
+ <dns>200.40.220.245</dns>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>mmsANCEL</name>
+ <mmsc>http://mmsc.mms.ancelutil.com.uy</mmsc>
+ <mmsproxy>200.40.246.2:3128</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Claro</name>
+ <gsm>
+ <network-id mcc="748" mnc="10"/>
+ <apn value="gprs.claro.com.uy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G Internet</name>
+ <username>ctigprs</username>
+ <password>ctigprs999</password>
+ </apn>
+ <apn value="internet.ctimovil.com.uy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>2G Internet</name>
+ <username>ctiweb</username>
+ <password>ctiweb999</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="748" mnc="07"/>
+ <apn value="apnumt.movistar.com.uy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>3G Internet</name>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ <apn value="webapn.movistar.com.uy">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>2G Internet</name>
+ <username>movistar</username>
+ <password>movistar</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Uzbekistan -->
+<country code="uz">
+ <provider>
+ <name>Beeline</name>
+ <gsm>
+ <network-id mcc="434" mnc="04"/>
+ <apn value="internet.beeline.uz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>beeline</username>
+ <password>beeline</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTS (Uzdunrobita)</name>
+ <gsm>
+ <network-id mcc="434" mnc="07"/>
+ <apn value="net.mts.uz">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mts</username>
+ <password>mts</password>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Ucell</name>
+ <gsm>
+ <network-id mcc="434" mnc="05"/>
+ <apn value="internet">
+ <username/>
+ <password/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- St Vincent -->
+<country code="vc">
+ <provider>
+ <name>Digicel</name>
+ <gsm>
+ <network-id mcc="360" mnc="070"/>
+ <apn value="wap.digiceloecs.com">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>wapoecs</username>
+ <password>wap03oecs</password>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Venezuela -->
+<country code="ve">
+ <provider>
+ <name>Digitel TIM</name>
+ <gsm>
+ <network-id mcc="734" mnc="01"/>
+ <network-id mcc="734" mnc="02"/>
+ <network-id mcc="734" mnc="03"/>
+ <apn value="gprsweb.digitel.ve">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>57.67.127.195</dns>
+ </apn>
+ <apn value="expresate.digitel.ve">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://mms.412.com.ve/servlets/mms</mmsc>
+ <mmsproxy>10.99.0.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movilnet</name>
+ <gsm>
+ <network-id mcc="734" mnc="06"/>
+ <apn value="int.movilnet.com.ve">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>200.44.32.12</dns>
+ <dns>200.11.248.12</dns>
+ </apn>
+ <apn value="mm.movilnet.com.ve">
+ <usage type="mms"/>
+ <name>MMS</name>
+ <mmsc>http://mms2.movilnet.com.ve/servlets/mms</mmsc>
+ <mmsproxy>192.168.16.12:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Movistar</name>
+ <gsm>
+ <network-id mcc="734" mnc="04"/>
+ <apn value="internet.movistar.ve">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>200.35.65.3</dns>
+ <dns>200.35.65.4</dns>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- Viet Nam -->
+<country code="vn">
+ <provider>
+ <name>MobiFone</name>
+ <gsm>
+ <network-id mcc="452" mnc="01"/>
+ <apn value="m-wap">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ <apn value="m-i090">
+ <usage type="mms"/>
+ <name>Mobifone MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://203.162.21.114/mmsc</mmsc>
+ <mmsproxy>203.162.21.114:3130</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vinaphone</name>
+ <gsm>
+ <network-id mcc="452" mnc="02"/>
+ <apn value="m3-world">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ <apn value="m3-card">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Broadband</name>
+ <username>mms</username>
+ <password>mms</password>
+ </apn>
+ <apn value="m3-mms">
+ <usage type="mms"/>
+ <name>Vinaphone MMS</name>
+ <username>mms</username>
+ <password>mms</password>
+ <mmsc>http://mms.vinaphone.com.vn</mmsc>
+ <mmsproxy>10.1.10.46:8000</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>S-Fone</name>
+ <cdma>
+ <!-- phone number dialed appears to be 1501 not 777 (???
+ http://www.sfone.com.vn/webportal/guideMobile02_vi.html?pageNum=3&subNum=9&idxNum=091
+ -->
+ <username>S-Fone</username>
+ <!-- Assignments taken from IFAST: http://www.ifast.org/files/NationalSID.htm -->
+ <sid value="13331"/>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Viettel Mobile</name>
+ <gsm>
+ <network-id mcc="452" mnc="04"/>
+ <apn value="v-internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Mobile Internet</name>
+ </apn>
+ <apn value="e-connect">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>D-com 3G</name>
+ </apn>
+ <apn value="v-mms">
+ <usage type="mms"/>
+ <name>Viettel MMS</name>
+ <mmsc>http://mms.viettelmobile.com.vn/mms/wapenc</mmsc>
+ <mmsproxy>192.168.233.10:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vietnamobile</name>
+ <gsm>
+ <network-id mcc="452" mnc="05"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>Vietnamobile MMS</name>
+ <mmsc>http://10.10.128.58/servlets/mms</mmsc>
+ <mmsproxy>10.10.128.44:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>EVNTelecom/E-Mobile</name>
+ <gsm>
+ <network-id mcc="452" mnc="08"/>
+ <apn value="e-internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>EVNTelecomNet</name>
+ </apn>
+ </gsm>
+ <cdma>
+ <username>evntelecom</username>
+ <password>evntelecom</password>
+ </cdma>
+ </provider>
+ <provider>
+ <name>Beeline VN</name>
+ <gsm>
+ <network-id mcc="452" mnc="07"/>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+<!-- South Africa -->
+<country code="za">
+ <provider>
+ <name>Cell-c</name>
+ <gsm>
+ <network-id mcc="655" mnc="07"/>
+ <msisdn-query>
+ <ussd>*147*100#</ussd>
+ </msisdn-query>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*102*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.7.0.138</dns>
+ <dns>196.7.142.132</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>MTN</name>
+ <gsm>
+ <network-id mcc="655" mnc="10"/>
+ <msisdn-query>
+ <ussd>*123*888#</ussd>
+ </msisdn-query>
+ <balance-check>
+ <ussd>*141#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*141*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.11.240.241</dns>
+ <dns>209.212.97.1</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Vodacom</name>
+ <gsm>
+ <network-id mcc="655" mnc="01"/>
+ <msisdn-query>
+ <ussd>*111*501#</ussd>
+ </msisdn-query>
+ <balance-check>
+ <ussd>*100#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*100*01*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.207.40.165</dns>
+ <dns>196.43.46.190</dns>
+ </apn>
+ <apn value="unrestricted">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <name>Unrestricted</name>
+ <dns>196.207.32.69</dns>
+ <dns>196.43.45.190</dns>
+ </apn>
+ <apn value="mms.vodacom.net">
+ <usage type="mms"/>
+ <name>Vlive!MMS</name>
+ <mmsc>http://mmsc.vodacom4me.co.za</mmsc>
+ <mmsproxy>196.6.128.13:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>Virgin Mobile</name>
+ <gsm>
+ <network-id mcc="655" mnc="07"/>
+ <balance-check>
+ <ussd>*101#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*102*CODE#</ussd>
+ </balance-top-up>
+ <apn value="vdata">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ <dns>196.7.0.138</dns>
+ <dns>196.7.142.132</dns>
+ </apn>
+ </gsm>
+ </provider>
+ <provider>
+ <name>8.ta</name>
+ <gsm>
+ <network-id mcc="655" mnc="02"/>
+ <msisdn-query>
+ <ussd>*1#</ussd>
+ </msisdn-query>
+ <balance-check>
+ <ussd>*188#</ussd>
+ </balance-check>
+ <balance-top-up>
+ <ussd replacement="CODE">*188*CODE#</ussd>
+ </balance-top-up>
+ <apn value="internet">
+ <plan type="postpaid"/>
+ <usage type="internet"/>
+ </apn>
+ <apn value="mms">
+ <usage type="mms"/>
+ <name>8 ta mms</name>
+ <mmsc>http://mms.8ta.com:38090/was</mmsc>
+ <mmsproxy>10.148.29.101:8080</mmsproxy>
+ </apn>
+ </gsm>
+ </provider>
+</country>
+
+</serviceproviders>
+
diff --git a/src/usr/local/share/pbi-keys/pfSense-BETA.ssl b/src/usr/local/share/pbi-keys/pfSense-BETA.ssl
new file mode 100644
index 0000000..69ced3a
--- /dev/null
+++ b/src/usr/local/share/pbi-keys/pfSense-BETA.ssl
@@ -0,0 +1,14 @@
+-----BEGIN PUBLIC KEY-----
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvl/Zi/Lj5p4cofA9pCIg
+ylSFUNZAIrJHhWE4x1jHr43Ez24RbbNQu2BfsaOGaCOnxBDk6xRNHkxWjUdFQIkc
+0R5lTLDiOnuJLB4nbA1FjVdygIeiikYHPnTQO2zaBAHX0O2k/ywNds+4HeKpf29S
+7NtqIeePMt8MlSqXJdyopZynAa+EF53q/0ude9fzvpITOtSogaJ78jlr3mLQmLeF
++flXBfV6sTe7bvVseFng+SuY8iAIsQqq58QrSlPcA7O2qNBlscqfJNFrZ2OCU4nZ
+7sXKqPWtIyZqCgH8XKv0ALwaDUt/F+XoAfod8kADXqhkIafx5dnbJ1ro0hffxi8Z
+SLia6heHvxLb2Ia9S7tteC3yaSa/Assq7anKefRpEDpSJFWTI+imdjHjteNpKrYz
+8WDPl5Rn3cOYgU1n73w+O9Km2VtO7Szhi6gh+EJ6+NXOmoUA4LHhVZYtfR3wFQtu
+jWazGigk3g0kXRh/wA7YLiLHbsgNT6zAnIk34UVx9agugYEUUjpsCAKUOxUSZNx7
+H0ow1zRNaE3cyMQAuxXy4opTnls9hiS5TpN1dstxviPgNj8/udykzJyeGFRVo5Tu
+iCcmBGizyK8n+9M1O5SAPpInukK5uR2sYYJhO8B8SOQTkbsBO55nip6wDQQx2ewE
+Rsvesuw3X/Mq/5hJ2DT8StkCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/src/usr/local/share/pfSense/post_upgrade_command b/src/usr/local/share/pfSense/post_upgrade_command
new file mode 100755
index 0000000..097bc5c
--- /dev/null
+++ b/src/usr/local/share/pfSense/post_upgrade_command
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+/etc/rc.conf_mount_rw
+
+PFSENSETYPE=`cat /etc/platform`
+
+if [ "${PFSENSETYPE}" = "pfSense" -o "${PFSENSETYPE}" = "nanobsd" ]; then
+ touch /conf/needs_package_sync
+fi
+
+# Detect interactive logins and display the shell
+detect_command='[ -n "$SSH_TTY" -o "$TERM" = "cons25" ] && exec /etc/rc.initial'
+echo "${detect_command}" > ${CVS_CO_DIR}/root/.shrc
+echo "${detect_command}" >> ${CVS_CO_DIR}/root/.profile
+
+if [ "${PFSENSETYPE}" = "nanobsd" ]; then
+ ROOT=/tmp/${1}/
+else
+ ROOT=/
+fi
+
+# Now turn on or off serial console as needed
+echo "Checking for ${ROOT}usr/local/share/pfSense/post_upgrade_command.php... " >> /conf/upgrade_log.txt
+if [ -x ${ROOT}usr/local/share/pfSense/post_upgrade_command.php ]; then
+ echo "Running ${ROOT}usr/local/share/pfSense/post_upgrade_command.php $1" >> /conf/upgrade_log.txt
+ ${ROOT}usr/local/share/pfSense/post_upgrade_command.php $1 >> /conf/upgrade_log.txt 2>&1
+fi
+
+# Remove any previous MD5 sum files
+rm -f /root/*.md5 >/dev/null 2>&1
+
+# Fixup permissions on installed files
+if [ -f ${ROOT}usr/local/share/pfSense/base.mtree ]; then
+ if [ -x "/tmp/mtree.old" ]; then
+ MTREE_BIN=/tmp/mtree.old
+ else
+ MTREE_BIN=/usr/sbin/mtree
+ fi
+ ${MTREE_BIN} -U -e -q -f ${ROOT}usr/local/share/pfSense/base.mtree -p ${ROOT} > /conf/mtree.log
+fi
+
+# Make sure to preserve existing time zone
+if [ "${PFSENSETYPE}" = "nanobsd" -a -f /etc/localtime ]; then
+ /bin/cp -p /etc/localtime ${ROOT}etc/localtime 2>/dev/null
+fi
+
+# Files may contain spaces
+oIFS=${IFS}
+IFS="
+"
+# Obsolete files - nanobsd doesn't need it since a new image is installed
+# on the other partition
+if [ "${PFSENSETYPE}" != "nanobsd" -a -f /etc/pfSense.obsoletedfiles ]; then
+ for f in $(cat /etc/pfSense.obsoletedfiles); do
+ if [ -n "${f}" -a -f "${f}" ]; then
+ rm -f "${f}"
+ elif [ -n "${f}" -a -d "${f}" ]; then
+ rm -rf "${f}"
+ fi
+ done
+fi
+
+# Restore IFS
+IFS=${oIFS}
diff --git a/src/usr/local/share/pfSense/post_upgrade_command.php b/src/usr/local/share/pfSense/post_upgrade_command.php
new file mode 100755
index 0000000..4a0215a
--- /dev/null
+++ b/src/usr/local/share/pfSense/post_upgrade_command.php
@@ -0,0 +1,31 @@
+#!/usr/local/bin/php-cgi -f
+<?php
+
+ /* upgrade embedded users serial console */
+ require_once("globals.inc");
+ require_once("config.inc");
+ require_once("functions.inc");
+
+ if (file_exists("/usr/local/bin/git") && isset($config['system']['gitsync']['synconupgrade'])) {
+ if (!empty($config['system']['gitsync']['repositoryurl'])) {
+ exec("cd /root/pfsense/pfSenseGITREPO/pfSenseGITREPO && git config remote.origin.url " . escapeshellarg($config['system']['gitsync']['repositoryurl']));
+ }
+ if (!empty($config['system']['gitsync']['branch'])) {
+ system("pfSsh.php playback gitsync " . escapeshellarg($config['system']['gitsync']['branch']) . " --upgrading");
+ }
+ }
+
+ $newslicedir = "";
+ if (isset($argv[1]) && $argv[1] != "") {
+ $newslicedir = '/tmp/' . $argv[1];
+ }
+
+ if ($g['enableserial_force'] || file_exists("{$newslicedir}/enableserial_force")) {
+ $config['system']['enableserial'] = true;
+ write_config();
+ }
+
+ system("echo \"Adding serial port settings ({$newslicedir})...\" >> /conf/upgrade_log.txt");
+ setup_serial_port("upgrade", $newslicedir);
+
+?>
diff --git a/src/usr/local/share/pfSense/pre_upgrade_command b/src/usr/local/share/pfSense/pre_upgrade_command
new file mode 100644
index 0000000..2ad365f
--- /dev/null
+++ b/src/usr/local/share/pfSense/pre_upgrade_command
@@ -0,0 +1,58 @@
+#!/bin/sh
+
+/etc/rc.conf_mount_rw
+
+# Record the previous version
+PRIOR_VERSION=`uname -r | cut -d'.' -f1`
+echo $PRIOR_VERSION > /tmp/pre_upgrade_version
+
+# De-activate sync on root filesystem. See ticket #4523
+# Back up original fstab
+/bin/cp /etc/fstab /etc/fstab.orig
+# De-activate sync on the root slice only. This will not match NanoBSD since it already has sync,noatime
+/usr/bin/sed -i '' 's/^\(\/.*[[:space:]]*\/[[:space:]]*ufs[[:space:]]*\)rw,sync\([[:space:]]*[[:digit:]][[:space:]]*[[:digit:]]\)$/\1rw\2/' /etc/fstab
+
+# Hack to workaround ticket #3749
+if [ ${PRIOR_VERSION} -le 8 ] && grep -q 'sh /etc/rc.reboot' /etc/rc.firmware; then
+ PROC=$(ps axwww | grep '/etc/rc.firmware *pfSenseupgrade')
+ PID=''
+ IMG=''
+ if [ -n "${PROC}" ]; then
+ PID=$(echo "${PROC}" | awk '{print $1}')
+ IMG=$(echo "${PROC}" | sed 's,^.*pfSenseupgrade *,,')
+ fi
+
+ if [ -n "${PID}" -a -n "${IMG}" -a -f "${IMG}" ]; then
+ cp -fp /bin/sh /tmp/sh.old
+ kill ${PID} >/dev/null 2>&1
+ kill -9 ${PID} >/dev/null 2>&1
+ sed -i '' -e 's,sh /,/tmp/sh.old /,' \
+ -e 's,/usr/sbin/mtree,/tmp/mtree.old,' /etc/rc.firmware
+ # To avoid restarting rc.firmware twice because of #4328
+ sed -i '' -e '/^restore_chflags()/, /^}/ s/mtree *-PU/mtree -P/' /etc/rc.firmware
+ /etc/rc.firmware pfSenseupgrade "${IMG}"
+ exit
+ fi
+fi
+
+# One more hack to workaround #4328
+if grep -q 'mtree *-PU' /etc/rc.firmware; then
+ PROC=$(ps axwww | grep '/etc/rc.firmware *pfSenseupgrade')
+ PID=''
+ IMG=''
+ if [ -n "${PROC}" ]; then
+ PID=$(echo "${PROC}" | awk '{print $1}')
+ IMG=$(echo "${PROC}" | sed 's,^.*pfSenseupgrade *,,')
+ fi
+
+ if [ -n "${PID}" -a -n "${IMG}" -a -f "${IMG}" ]; then
+ kill ${PID} >/dev/null 2>&1
+ kill -9 ${PID} >/dev/null 2>&1
+ sed -i '' -e '/^restore_chflags()/, /^}/ s/mtree *-PU/mtree -P/' /etc/rc.firmware
+ /etc/rc.firmware pfSenseupgrade "${IMG}"
+ exit
+ fi
+fi
+
+rm /boot/kernel/*
+
diff --git a/src/usr/local/share/protocols/100bao.pat b/src/usr/local/share/protocols/100bao.pat
new file mode 100644
index 0000000..a03a891
--- /dev/null
+++ b/src/usr/local/share/protocols/100bao.pat
@@ -0,0 +1,12 @@
+# 100bao - a Chinese P2P protocol/program - http://www.100bao.com
+# Pattern attributes: ok veryfast fast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/100Bao
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Pattern written by www.routerclub.com's wsgtrsys.
+# The author of this pattern says it works, but this is unconfirmed.
+
+100bao
+^\x01\x01\x05\x0a
+
diff --git a/src/usr/local/share/protocols/EAOrigin.pat b/src/usr/local/share/protocols/EAOrigin.pat
new file mode 100644
index 0000000..391be72
--- /dev/null
+++ b/src/usr/local/share/protocols/EAOrigin.pat
@@ -0,0 +1,7 @@
+# Origin powered by EA
+# zip? - Main Downloads for Games/Patches/Updates
+# User-Agents - Browsing the EA store.
+
+User-Agent: Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) Origin/9.2.1.4399 Safari/534.34 EA Download Manager
+User-Agent: Mozilla/5.0 EA Download Manager Origin
+zip?
diff --git a/src/usr/local/share/protocols/LICENSE b/src/usr/local/share/protocols/LICENSE
new file mode 100644
index 0000000..49395f6
--- /dev/null
+++ b/src/usr/local/share/protocols/LICENSE
@@ -0,0 +1,605 @@
+You may distribute this software under either the GPLv2 or Creative
+Commons Attribution-ShareAlike 2.5. The text of each follows:
+
+***************************************************************************
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+***************************************************************************
+
+ Creative Commons Legal Code
+ Attribution-ShareAlike 2.5
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
+ DAMAGES RESULTING FROM ITS USE.
+
+ License
+
+ THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
+ CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
+ PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
+ WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
+ PROHIBITED.
+
+ BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
+ AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS
+ YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF
+ SUCH TERMS AND CONDITIONS.
+
+ 1. Definitions
+ a. "Collective Work" means a work, such as a periodical issue,
+ anthology or encyclopedia, in which the Work in its entirety in
+ unmodified form, along with a number of other contributions,
+ constituting separate and independent works in themselves, are
+ assembled into a collective whole. A work that constitutes a
+ Collective Work will not be considered a Derivative Work (as
+ defined below) for the purposes of this License.
+ b. "Derivative Work" means a work based upon the Work or upon the
+ Work and other pre-existing works, such as a translation, musical
+ arrangement, dramatization, fictionalization, motion picture
+ version, sound recording, art reproduction, abridgment,
+ condensation, or any other form in which the Work may be recast,
+ transformed, or adapted, except that a work that constitutes a
+ Collective Work will not be considered a Derivative Work for the
+ purpose of this License. For the avoidance of doubt, where the
+ Work is a musical composition or sound recording, the
+ synchronization of the Work in timed-relation with a moving image
+ ("synching") will be considered a Derivative Work for the purpose
+ of this License.
+ c. "Licensor" means the individual or entity that offers the Work
+ under the terms of this License.
+ d. "Original Author" means the individual or entity who created the
+ Work.
+ e. "Work" means the copyrightable work of authorship offered under
+ the terms of this License.
+ f. "You" means an individual or entity exercising rights under this
+ License who has not previously violated the terms of this License
+ with respect to the Work, or who has received express permission
+ from the Licensor to exercise rights under this License despite a
+ previous violation.
+ g. "License Elements" means the following high-level license
+ attributes as selected by Licensor and indicated in the title of
+ this License: Attribution, ShareAlike.
+
+ 2. Fair Use Rights. Nothing in this license is intended to reduce,
+ limit, or restrict any rights arising from fair use, first sale or
+ other limitations on the exclusive rights of the copyright owner under
+ copyright law or other applicable laws.
+
+ 3. License Grant. Subject to the terms and conditions of this License,
+ Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+ perpetual (for the duration of the applicable copyright) license to
+ exercise the rights in the Work as stated below:
+ a. to reproduce the Work, to incorporate the Work into one or more
+ Collective Works, and to reproduce the Work as incorporated in the
+ Collective Works;
+ b. to create and reproduce Derivative Works;
+ c. to distribute copies or phonorecords of, display publicly, perform
+ publicly, and perform publicly by means of a digital audio
+ transmission the Work including as incorporated in Collective
+ Works;
+ d. to distribute copies or phonorecords of, display publicly, perform
+ publicly, and perform publicly by means of a digital audio
+ transmission Derivative Works.
+ e. For the avoidance of doubt, where the work is a musical
+ composition:
+ i. Performance Royalties Under Blanket Licenses. Licensor waives
+ the exclusive right to collect, whether individually or via a
+ performance rights society (e.g. ASCAP, BMI, SESAC),
+ royalties for the public performance or public digital
+ performance (e.g. webcast) of the Work.
+ ii. Mechanical Rights and Statutory Royalties. Licensor waives
+ the exclusive right to collect, whether individually or via a
+ music rights society or designated agent (e.g. Harry Fox
+ Agency), royalties for any phonorecord You create from the
+ Work ("cover version") and distribute, subject to the
+ compulsory license created by 17 USC Section 115 of the US
+ Copyright Act (or the equivalent in other jurisdictions).
+ f. Webcasting Rights and Statutory Royalties. For the avoidance of
+ doubt, where the Work is a sound recording, Licensor waives the
+ exclusive right to collect, whether individually or via a
+ performance-rights society (e.g. SoundExchange), royalties for the
+ public digital performance (e.g. webcast) of the Work, subject to
+ the compulsory license created by 17 USC Section 114 of the US
+ Copyright Act (or the equivalent in other jurisdictions).
+
+ The above rights may be exercised in all media and formats whether now
+ known or hereafter devised. The above rights include the right to make
+ such modifications as are technically necessary to exercise the rights
+ in other media and formats. All rights not expressly granted by
+ Licensor are hereby reserved.
+
+ 4. Restrictions.The license granted in Section 3 above is expressly
+ made subject to and limited by the following restrictions:
+ a. You may distribute, publicly display, publicly perform, or
+ publicly digitally perform the Work only under the terms of this
+ License, and You must include a copy of, or the Uniform Resource
+ Identifier for, this License with every copy or phonorecord of the
+ Work You distribute, publicly display, publicly perform, or
+ publicly digitally perform. You may not offer or impose any terms
+ on the Work that alter or restrict the terms of this License or
+ the recipients' exercise of the rights granted hereunder. You may
+ not sublicense the Work. You must keep intact all notices that
+ refer to this License and to the disclaimer of warranties. You may
+ not distribute, publicly display, publicly perform, or publicly
+ digitally perform the Work with any technological measures that
+ control access or use of the Work in a manner inconsistent with
+ the terms of this License Agreement. The above applies to the Work
+ as incorporated in a Collective Work, but this does not require
+ the Collective Work apart from the Work itself to be made subject
+ to the terms of this License. If You create a Collective Work,
+ upon notice from any Licensor You must, to the extent practicable,
+ remove from the Collective Work any credit as required by clause
+ 4(c), as requested. If You create a Derivative Work, upon notice
+ from any Licensor You must, to the extent practicable, remove from
+ the Derivative Work any credit as required by clause 4(c), as
+ requested.
+ b. You may distribute, publicly display, publicly perform, or
+ publicly digitally perform a Derivative Work only under the terms
+ of this License, a later version of this License with the same
+ License Elements as this License, or a Creative Commons iCommons
+ license that contains the same License Elements as this License
+ (e.g. Attribution-ShareAlike 2.5 Japan). You must include a copy
+ of, or the Uniform Resource Identifier for, this License or other
+ license specified in the previous sentence with every copy or
+ phonorecord of each Derivative Work You distribute, publicly
+ display, publicly perform, or publicly digitally perform. You may
+ not offer or impose any terms on the Derivative Works that alter
+ or restrict the terms of this License or the recipients' exercise
+ of the rights granted hereunder, and You must keep intact all
+ notices that refer to this License and to the disclaimer of
+ warranties. You may not distribute, publicly display, publicly
+ perform, or publicly digitally perform the Derivative Work with
+ any technological measures that control access or use of the Work
+ in a manner inconsistent with the terms of this License Agreement.
+ The above applies to the Derivative Work as incorporated in a
+ Collective Work, but this does not require the Collective Work
+ apart from the Derivative Work itself to be made subject to the
+ terms of this License.
+ c. If you distribute, publicly display, publicly perform, or publicly
+ digitally perform the Work or any Derivative Works or Collective
+ Works, You must keep intact all copyright notices for the Work and
+ provide, reasonable to the medium or means You are utilizing: (i)
+ the name of the Original Author (or pseudonym, if applicable) if
+ supplied, and/or (ii) if the Original Author and/or Licensor
+ designate another party or parties (e.g. a sponsor institute,
+ publishing entity, journal) for attribution in Licensor's
+ copyright notice, terms of service or by other reasonable means,
+ the name of such party or parties; the title of the Work if
+ supplied; to the extent reasonably practicable, the Uniform
+ Resource Identifier, if any, that Licensor specifies to be
+ associated with the Work, unless such URI does not refer to the
+ copyright notice or licensing information for the Work; and in the
+ case of a Derivative Work, a credit identifying the use of the
+ Work in the Derivative Work (e.g., "French translation of the Work
+ by Original Author," or "Screenplay based on original Work by
+ Original Author"). Such credit may be implemented in any
+ reasonable manner; provided, however, that in the case of a
+ Derivative Work or Collective Work, at a minimum such credit will
+ appear where any other comparable authorship credit appears and in
+ a manner at least as prominent as such other comparable authorship
+ credit.
+
+ 5. Representations, Warranties and Disclaimer
+
+ UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS
+ THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND
+ CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+ INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+ FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+ LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF
+ ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW
+ THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY
+ TO YOU.
+
+ 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
+ APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY
+ LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR
+ EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK,
+ EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ 7. Termination
+ a. This License and the rights granted hereunder will terminate
+ automatically upon any breach by You of the terms of this License.
+ Individuals or entities who have received Derivative Works or
+ Collective Works from You under this License, however, will not
+ have their licenses terminated provided such individuals or
+ entities remain in full compliance with those licenses. Sections
+ 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
+ b. Subject to the above terms and conditions, the license granted
+ here is perpetual (for the duration of the applicable copyright in
+ the Work). Notwithstanding the above, Licensor reserves the right
+ to release the Work under different license terms or to stop
+ distributing the Work at any time; provided, however that any such
+ election will not serve to withdraw this License (or any other
+ license that has been, or is required to be, granted under the
+ terms of this License), and this License will continue in full
+ force and effect unless terminated as stated above.
+
+ 8. Miscellaneous
+ a. Each time You distribute or publicly digitally perform the Work or
+ a Collective Work, the Licensor offers to the recipient a license
+ to the Work on the same terms and conditions as the license
+ granted to You under this License.
+ b. Each time You distribute or publicly digitally perform a
+ Derivative Work, Licensor offers to the recipient a license to the
+ original Work on the same terms and conditions as the license
+ granted to You under this License.
+ c. If any provision of this License is invalid or unenforceable under
+ applicable law, it shall not affect the validity or enforceability
+ of the remainder of the terms of this License, and without further
+ action by the parties to this agreement, such provision shall be
+ reformed to the minimum extent necessary to make such provision
+ valid and enforceable.
+ d. No term or provision of this License shall be deemed waived and no
+ breach consented to unless such waiver or consent shall be in
+ writing and signed by the party to be charged with such waiver or
+ consent.
+ e. This License constitutes the entire agreement between the parties
+ with respect to the Work licensed here. There are no
+ understandings, agreements or representations with respect to the
+ Work not specified here. Licensor shall not be bound by any
+ additional provisions that may appear in any communication from
+ You. This License may not be modified without the mutual written
+ agreement of the Licensor and You.
+
+ Creative Commons is not a party to this License, and makes no warranty
+ whatsoever in connection with the Work. Creative Commons will not be
+ liable to You or any party on any legal theory for any damages
+ whatsoever, including without limitation any general, special,
+ incidental or consequential damages arising in connection to this
+ license. Notwithstanding the foregoing two (2) sentences, if Creative
+ Commons has expressly identified itself as the Licensor hereunder, it
+ shall have all rights and obligations of Licensor.
+
+ Except for the limited purpose of indicating to the public that the
+ Work is licensed under the CCPL, neither party will use the trademark
+ "Creative Commons" or any related trademark or logo of Creative
+ Commons without the prior written consent of Creative Commons. Any
+ permitted use will be in compliance with Creative Commons'
+ then-current trademark usage guidelines, as may be published on its
+ website or otherwise made available upon request from time to time.
+
+ Creative Commons may be contacted at http://creativecommons.org/.
diff --git a/src/usr/local/share/protocols/aim.pat b/src/usr/local/share/protocols/aim.pat
new file mode 100644
index 0000000..5c43930
--- /dev/null
+++ b/src/usr/local/share/protocols/aim.pat
@@ -0,0 +1,28 @@
+# AIM - AOL instant messenger (OSCAR and TOC)
+# Pattern attributes: good slow notsofast
+# Protocol groups: chat proprietary
+# Wiki: http://www.protocolinfo.org/wiki/AIM
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 5190
+#
+# This may also match ICQ traffic.
+#
+# This pattern has been tested and is believed to work well.
+
+aim
+# See http://gridley.res.carleton.edu/~straitm/final (and various other places)
+# The first bit matches OSCAR signon and data commands, but not sure what
+# \x03\x0b matches, but it works apparently.
+# The next three bits match various parts of the TOC signon process.
+# The third one is the magic number "*", then 0x01 for "signon", then up to four
+# bytes ("up to" because l7-filter strips out nulls) which contain a sequence
+# number (2 bytes) the data length (2 more) and 3 nulls (which don't count),
+# then 0x01 for the version number (not sure if there ever has been another
+# version)
+# The fourth one is a command string, followed by some stuff, then the
+# beginning of the "roasted" password
+
+# This pattern is too slow!
+
+^(\*[\x01\x02].*\x03\x0b|\*\x01.?.?.?.?\x01)|flapon|toc_signon.*0x
diff --git a/src/usr/local/share/protocols/aimwebcontent.pat b/src/usr/local/share/protocols/aimwebcontent.pat
new file mode 100644
index 0000000..bc9a22d
--- /dev/null
+++ b/src/usr/local/share/protocols/aimwebcontent.pat
@@ -0,0 +1,10 @@
+# AIM web content - ads/news content downloaded by AOL Instant Messenger
+# Pattern attributes: good notsofast notsofast
+# Protocol groups: chat document_retrieval proprietary
+# Wiki: http://www.protocolinfo.org/wiki/AIM
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested and is believed to work well.
+
+aimwebcontent
+user-agent:aim/
diff --git a/src/usr/local/share/protocols/any.pat b/src/usr/local/share/protocols/any.pat
new file mode 100644
index 0000000..56d8134
--- /dev/null
+++ b/src/usr/local/share/protocols/any.pat
@@ -0,0 +1,8 @@
+# Unknown - Dummy pattern for old unmatched connections.
+
+unknown
+# This pattern is ignored by the kernel. It sees that the "protocol" is
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+# "unknown" and always returns unmatched for connections that are still
+# being tested.
+.
diff --git a/src/usr/local/share/protocols/applejuice.pat b/src/usr/local/share/protocols/applejuice.pat
new file mode 100644
index 0000000..eb552dc
--- /dev/null
+++ b/src/usr/local/share/protocols/applejuice.pat
@@ -0,0 +1,12 @@
+# Apple Juice - P2P filesharing - http://www.applejuicenet.de
+# Pattern attributes: great veryfast fast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/AppleJuice
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested with the Linux version (version
+# 0,29,142,229). It matches search reqests and file transfers.
+
+applejuice
+# this pattern extracted from ipp2p, by Eicke Friedrich.
+^ajprot\x0d\x0a
diff --git a/src/usr/local/share/protocols/ares.pat b/src/usr/local/share/protocols/ares.pat
new file mode 100644
index 0000000..32dc70d
--- /dev/null
+++ b/src/usr/local/share/protocols/ares.pat
@@ -0,0 +1,63 @@
+# Ares - P2P filesharing - http://aresgalaxy.sf.net
+# Pattern attributes: good veryfast fast undermatch
+# Protocol groups: p2p open_source
+# Wiki: http://www.protocolinfo.org/wiki/Ares
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# This pattern catches only client-server connect messages. This is
+# sufficient for blocking, but not for shaping, since it doesn't catch
+# the actual file transfers (see below).
+
+# Original pattern by Brandon Enright <bmenrigh at the server known as ucsd.edu>
+
+# This pattern has been tested with Ares 1.8.8.2998.
+
+ares
+# regular expression madness: "[]Z]" means ']' or 'Z'.
+^\x03[]Z].?.?\x05$
+
+# It appears that the general packet format is:
+# - Two byte little endian integer giving the data length
+# - One byte packet type
+# - data
+#
+# Login packets (TCP) have the following format:
+# - \x03\x00 (the length appears to always be 3)
+# - \x5a - The login packet type.
+# The source code suggests that for supernodes \x5d is used instead.
+# - Three more bytes. I don't know the meaning of these, but for me they
+# are always \x06\x06\x05 (in Ares 1.8.8.2998). From the comments in IPP2P,
+# it seems that they are not always exactly that, but seem to always end in
+# \x05.
+#
+# Search packets have the following format:
+# - Two byte little endian integer giving the data length
+# A single two letter word make this \x0a
+# The biggest I could get it was \x4f
+# - Packet type = \x09
+# - One byte document type:
+# - "all" = 00
+# - "audio" = 01
+# - "software" = 03
+# - "video" = 05
+# - "document" = 06
+# - "image" = 07
+# - "other" = 08
+# - \x0f - I don't know what this means, but it is always this for me
+# - Two bytes of unknown meaning that change
+# - Some number search words:
+# - \x14 - I don't know what this means, but it is always this for me
+# - One byte length of the first search word
+# Between 2 and \x14 in my tests with Ares 1.8.8.2998
+# It ignores single letter words and truncates ones longer than \x14
+# - Two bytes of unknown meaning that change
+# - The search word (not null terminated)
+# This was all investigated by searching for strings in "all". Searches
+# can also be performed in "title" and "author". I'm not going to
+# bother to research these because I new realize that searches are done
+# on the same TCP connection as the login packets, so there is no need
+# to match them separately.
+#
+# File transfers appear to be encrypted or at least obfuscated. (The
+# files themselves, at least, are not transmitted in the clear.) I
+# haven't found any patterns.
diff --git a/src/usr/local/share/protocols/armagetron.pat b/src/usr/local/share/protocols/armagetron.pat
new file mode 100644
index 0000000..a032410
--- /dev/null
+++ b/src/usr/local/share/protocols/armagetron.pat
@@ -0,0 +1,12 @@
+# Armagetron Advanced - open source Tron/snake based multiplayer game
+# Pattern attributes: good slow notsofast
+# Protocol groups: open_source game
+# Wiki: http://protocolinfo.org/wiki/Armagetron
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# Contributed to protocolinfo.org, possibly by joda.bot, who says "The
+# filter matches the initial transfer of configuration data. Very early
+# versions might not transfer the CYCLE_ Settings (before 0.2.5.x)."
+
+armagetron
+YCLC_E|CYEL
diff --git a/src/usr/local/share/protocols/audiogalaxy.pat b/src/usr/local/share/protocols/audiogalaxy.pat
new file mode 100644
index 0000000..db1999a
--- /dev/null
+++ b/src/usr/local/share/protocols/audiogalaxy.pat
@@ -0,0 +1,19 @@
+# Audiogalaxy - (defunct) Peer to Peer filesharing
+# Pattern attributes: ok fast fast
+# Protocol groups: p2p obsolete
+# Wiki: http://protocolinfo.org/wiki/Audiogalaxy
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# http://www.movspclr.co.uk/info/agprotocol.html
+#
+# This pattern is untested.
+#
+# To get or provide more information about this protocol and/or pattern:
+# http://www.protocolinfo.org/wiki/Audiogalaxy
+# http://lists.sourceforge.net/lists/listinfo/l7-filter-developers
+
+audiogalaxy
+# (magic cookie that starts conversations)|(magic cookie that starts
+# 0.606W/0.608W client/server conversations and a string that should always
+# appear in login messages)
+^(\x45\x5f\xd0\xd5|\x45\x5f.*0.60(6|8)W)
diff --git a/src/usr/local/share/protocols/battlefield1942.pat b/src/usr/local/share/protocols/battlefield1942.pat
new file mode 100644
index 0000000..ed7a7bf
--- /dev/null
+++ b/src/usr/local/share/protocols/battlefield1942.pat
@@ -0,0 +1,14 @@
+# Battlefield 1942 - An EA game
+# Pattern attributes: ok veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Battlefield_1942
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Contributed by Myles Uyema <mylesuyema AT gmail.com>
+#
+# This pattern has only been tested by one person.
+
+# tested on two original EA battlefield 1942 servers
+# matches the first two packets of joining a server
+battlefield1942
+^\x01\x11\x10\|\xf8\x02\x10\x40\x06
diff --git a/src/usr/local/share/protocols/battlefield2.pat b/src/usr/local/share/protocols/battlefield2.pat
new file mode 100644
index 0000000..e2d8791
--- /dev/null
+++ b/src/usr/local/share/protocols/battlefield2.pat
@@ -0,0 +1,26 @@
+# Battlefield 2 - An EA game.
+# Pattern attributes: ok slow notsofast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Battlefield_2
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is unconfirmed except implicitly by a comment on protocolinfo.
+
+battlefield2
+# gameplay|account-login|server browsing/information
+# See http://protocolinfo.org/wiki/Battlefield_2
+# Can we put a ^ on the last branch? If so, nosofast --> veryfast
+
+# 193.85.217.35 on protocolinfo says:
+# The first part of the pattern, \x11\x20\x01\xa0\x98\x11, has to be
+# modified for different version of Battlefield 2. The gameplay part of
+# pattern for BF2 v1.4 is \x11\x20\x01\x30\xb9\x10\x11, and for BF2
+# v1.41 is \x11\x20\x01\x50\xb9\x10\x11
+#
+# Rather than put all of those in, I've just gone with "...?" in the
+# middle.
+
+^(\x11\x20\x01...?\x11|\xfe\xfd.?.?.?.?.?.?(\x14\x01\x06|\xff\xff\xff))|[]\x01].?battlefield2
+
+# Pattern prior to 193.85.217.35's comment on protocolinfo:
+#^(\x11\x20\x01\xa0\x98\x11|\xfe\xfd.?.?.?.?.?.?(\x14\x01\x06|\xff\xff\xff))|[]\x01].?battlefield2
diff --git a/src/usr/local/share/protocols/battlefield2142.pat b/src/usr/local/share/protocols/battlefield2142.pat
new file mode 100644
index 0000000..4c0e42b
--- /dev/null
+++ b/src/usr/local/share/protocols/battlefield2142.pat
@@ -0,0 +1,14 @@
+# Battlefield 2142 - An EA game.
+# Pattern attributes: ok fast fast
+# Protocol groups: proprietary game
+# Wiki: http://protocolinfo.org/wiki/Battlefield_2142
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# Submitted by Telsin. Not confirmed.
+
+battlefield2142
+# gameplay|account-login|server browsing/information
+# Can't put a ^ on the last branch: it fails to match if you do.
+# This branch seems to matter very rarely, though
+^(\x11\x20\x01\x90\x50\x64\x10|\xfe\xfd.?.?.?\x18|[\x01\\].?battlefield2)
+
diff --git a/src/usr/local/share/protocols/bgp.pat b/src/usr/local/share/protocols/bgp.pat
new file mode 100644
index 0000000..61e417f
--- /dev/null
+++ b/src/usr/local/share/protocols/bgp.pat
@@ -0,0 +1,19 @@
+# BGP - Border Gateway Protocol - RFC 1771
+# Pattern attributes: ok veryfast fast
+# Protocol groups: networking ietf_draft_standard
+# Wiki: http://www.protocolinfo.org/wiki/BGP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is UNTESTED.
+
+bgp
+# "After a transport protocol connection is established, the first
+# message sent by each side is an OPEN message."
+# "If the Type of the message is OPEN, or if the Authentication Code used
+# in the OPEN message of the connection is zero, then the Marker must be
+# all ones."
+# Then the 2 byte length field, then the 1 byte type field (1 = OPEN).
+# Then the BGP version: 3 was RFC'd in 1991, 4 was RFC'd in 1995.
+# Could keep going, but that should be sufficient.
+^\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff..?\x01[\x03\x04]
+
diff --git a/src/usr/local/share/protocols/biff.pat b/src/usr/local/share/protocols/biff.pat
new file mode 100644
index 0000000..91e8bbf
--- /dev/null
+++ b/src/usr/local/share/protocols/biff.pat
@@ -0,0 +1,16 @@
+# Biff - new mail notification
+# Pattern attributes: good fast fast undermatch overmatch
+# Protocol groups: mail
+# Wiki: http://www.protocolinfo.org/wiki/Biff
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 512
+#
+# This pattern is completely untested.
+
+biff
+# This is a rare case where we will specify a $ (end of line), since
+# this is the entirety of the communication.
+# something that looks like a username, an @, a number.
+# won't catch usernames that have strange characters in them.
+^[a-z][a-z0-9]+@[1-9][0-9]+$
diff --git a/src/usr/local/share/protocols/bittorrent.pat b/src/usr/local/share/protocols/bittorrent.pat
new file mode 100644
index 0000000..c66f867
--- /dev/null
+++ b/src/usr/local/share/protocols/bittorrent.pat
@@ -0,0 +1,25 @@
+# Bittorrent - P2P filesharing / publishing tool - http://www.bittorrent.com
+# Pattern attributes: good slow notsofast undermatch
+# Protocol groups: p2p open_source
+# Wiki: http://www.protocolinfo.org/wiki/Bittorrent
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested and is believed to work well.
+# It will, however, not work on bittorrent streams that are encrypted, since
+# it's impossible to match (well) encrypted data.
+
+bittorrent
+
+# Does not attempt to match the HTTP download of the tracker
+# 0x13 is the length of "bittorrent protocol"
+# Second two bits match UDP wierdness
+# Next bit matches something Azureus does
+# Ditto on the next bit. Could also match on "user-agent: azureus", but that's in the next
+# packet and perhaps this will match multiple clients.
+# bitcomet-specific strings contributed by liangjun.
+
+# This is not a valid GNU basic regular expression (but that's ok).
+^(\x13bittorrent protocol|azver\x01$|get /scrape\?info_hash=|get /announce\?info_hash=|get /client/bitcomet/|GET /data\?fid=)|d1:ad2:id20:|\x08'7P\)[RP]
+
+# This pattern is "fast", but won't catch as much
+#^(\x13bittorrent protocol|azver\x01$|get /scrape\?info_hash=)
diff --git a/src/usr/local/share/protocols/chikka.pat b/src/usr/local/share/protocols/chikka.pat
new file mode 100644
index 0000000..a97ef28
--- /dev/null
+++ b/src/usr/local/share/protocols/chikka.pat
@@ -0,0 +1,17 @@
+# Chikka - SMS service which can be used without phones - http://chikka.com
+# Pattern attributes: good fast fast superset
+# Protocol groups: proprietary chat
+# Wiki: http://www.protocolinfo.org/wiki/Chikka
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# Tested with Chikka Javalite on 14 Jan 2007.
+# The login and chat use the same TCP connection.
+
+# "Kamusta" means "Hello" in Tagalog, apparently, so that will probably
+# stay the same. I've only seen v1.2, but I've given it some leeway for
+# past and future versions.
+
+# Chikka uses CIMD as part of the login process, see cimd.pat
+
+chikka
+^CTPv1\.[123] Kamusta.*\x0d\x0a$
diff --git a/src/usr/local/share/protocols/cimd.pat b/src/usr/local/share/protocols/cimd.pat
new file mode 100644
index 0000000..f508350
--- /dev/null
+++ b/src/usr/local/share/protocols/cimd.pat
@@ -0,0 +1,19 @@
+# Computer Interface to Message Distribution, an SMSC protocol by Nokia
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: proprietary chat
+# Wiki: http://www.protocolinfo.org/wiki/CIMD
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# I don't know whether CIMD is ever found by itself in a TCP connection.
+# I have only seen it myself as part of the Chikka login process, in
+# which the second and third packets (at least) are CIMD. So I am not
+# using a '^' at the beginning.
+#
+# This pretty well explains the pattern:
+# http://en.wikipedia.org/w/index.php?title=CIMD&oldid=42707583
+# However, Chikka does NOT terminate the last field with a tab.
+#
+# Tested with Chikka Javalite on 14 Jan 2007.
+
+cimd
+\x02[0-4][0-9]:[0-9]+.*\x03$
diff --git a/src/usr/local/share/protocols/ciscovpn.pat b/src/usr/local/share/protocols/ciscovpn.pat
new file mode 100644
index 0000000..d3dd7a6
--- /dev/null
+++ b/src/usr/local/share/protocols/ciscovpn.pat
@@ -0,0 +1,11 @@
+# Cisco VPN - VPN client software to a Cisco VPN server
+# Pattern attributes: ok veryfast fast
+# Protocol groups: remote_access proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Cisco_VPN
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern contributed by Myles Uyema <myles AT uyema.net>
+
+ciscovpn
+^\x01\xf4\x01\xf4
+
diff --git a/src/usr/local/share/protocols/citrix.pat b/src/usr/local/share/protocols/citrix.pat
new file mode 100644
index 0000000..fa73ce1
--- /dev/null
+++ b/src/usr/local/share/protocols/citrix.pat
@@ -0,0 +1,12 @@
+# Citrix ICA - proprietary remote desktop application - http://citrix.com
+# Pattern attributes: marginal notsofast notsofast
+# Protocol groups: remote_access proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Citrix
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is UNTESTED.
+
+# This is based on decode_citrix in dsniff 2.4.
+
+citrix
+\x32\x26\x85\x92\x58
diff --git a/src/usr/local/share/protocols/code_red.pat b/src/usr/local/share/protocols/code_red.pat
new file mode 100644
index 0000000..df0beee
--- /dev/null
+++ b/src/usr/local/share/protocols/code_red.pat
@@ -0,0 +1,8 @@
+# Code Red - a worm that attacks Microsoft IIS web servers
+# Pattern attributes: ok fast notsofast subset
+# Protocol groups: worm
+# Wiki: http://www.protocolinfo.org/wiki/CodeRed
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+code_red
+/default\.ida\?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a
diff --git a/src/usr/local/share/protocols/counterstrike-source.pat b/src/usr/local/share/protocols/counterstrike-source.pat
new file mode 100644
index 0000000..8ebd627
--- /dev/null
+++ b/src/usr/local/share/protocols/counterstrike-source.pat
@@ -0,0 +1,42 @@
+# Counterstrike (using the new "Source" engine) - network game
+# Pattern attributes: good veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Counter-Strike
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# By adam.randazzoATgmail.com
+
+counterstrike-source
+^\xff\xff\xff\xff.*cstrikeCounter-Strike
+
+# These games use Steam, which is developed by Valve Software.
+#
+# This was based off of the following captured data from ethereal:
+# --Source--
+# 0000 00 11 09 2a a8 79 00 13 10 2c 3f d7 08 00 45 20 ...*.y...,?...E
+# 0010 00 72 b9 f6 00 00 6b 11 b6 78 18 0e 04 cc c0 a8 .r....k..x......
+# 0020 01 6a 69 87 04 65 00 5e 01 ac ff ff ff ff 49 07 .ji..e.^......I.
+# 0030 54 4a 27 73 20 50 6c 61 63 65 20 6f 66 20 50 61 TJ's Place of Pa
+# 0040 69 6e 00 64 65 5f 70 69 72 61 6e 65 73 69 00 63 in.de_piranesi.c
+# 0050 73 74 72 69 6b 65 00 43 6f 75 6e 74 65 72 2d 53 strike.Counter-S
+# 0060 74 72 69 6b 65 3a 20 53 6f 75 72 63 65 00 dc 00 trike: Source...
+# 0070 08 10 06 64 77 00 00 31 2e 30 2e 30 2e 31 38 00 ...dw..1.0.0.18.
+# 0080
+#
+# --1.6--
+# 0000 00 11 09 2a a8 79 00 13 10 2c 3f d7 08 00 45 00 ...*.y...,?...E.
+# 0010 00 8e c4 1a 00 00 76 11 b3 85 08 09 02 fa c0 a8 ......v.........
+# 0020 01 14 69 91 04 37 00 7a c9 90 ff ff ff ff 6d 38 ..i..7.z......m8
+# 0030 2e 39 2e 32 2e 32 35 30 3a 32 37 30 32 35 00 49 .9.2.250:27025.I
+# 0040 50 20 2d 20 43 6c 61 6e 20 73 65 72 76 65 72 00 P - Clan server.
+# 0050 64 65 5f 64 75 73 74 32 00 63 73 74 72 69 6b 65 de_dust2.cstrike
+# 0060 00 43 6f 75 6e 74 65 72 2d 53 74 72 69 6b 65 00 .Counter-Strike.
+# 0070 0a 0c 2f 64 77 00 01 77 77 77 2e 63 6f 75 6e 74 ../dw..www.count
+# 0080 65 72 2d 73 74 72 69 6b 65 2e 6e 65 74 00 00 00 er-strike.net...
+# 0090 01 00 00 00 00 9e f7 0a 00 01 00 00 ............
+
+
+# Old pattern. (Adam Randazzo says "CS 1.6 and CS: Source are the
+# only two versions that are playable on the Internet since Valve
+# disabled the WON system in favor of steam.")
+# cs .*dl.www.counter-strike.net
diff --git a/src/usr/local/share/protocols/cvs.pat b/src/usr/local/share/protocols/cvs.pat
new file mode 100644
index 0000000..fc084d3
--- /dev/null
+++ b/src/usr/local/share/protocols/cvs.pat
@@ -0,0 +1,14 @@
+# CVS - Concurrent Versions System
+# Pattern attributes: good veryfast fast
+# Protocol groups: version_control open_source
+# Wiki: http://www.protocolinfo.org/wiki/CVS
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+cvs
+
+# Matches pserver login. AUTH is for actually starting the protocol
+# VERIFICATION is for authenticating without starting the protocols
+# and GSSAPI is for using security services such as kerberos.
+# http://www.loria.fr/~molli/cvs/doc/cvsclient_3.html
+
+^BEGIN (AUTH|VERIFICATION|GSSAPI) REQUEST\x0a
diff --git a/src/usr/local/share/protocols/dayofdefeat-source.pat b/src/usr/local/share/protocols/dayofdefeat-source.pat
new file mode 100644
index 0000000..42b24bb
--- /dev/null
+++ b/src/usr/local/share/protocols/dayofdefeat-source.pat
@@ -0,0 +1,11 @@
+# Day of Defeat: Source - game (Half-Life 2 mod) - http://www.valvesoftware.com
+# Pattern attributes: good veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Day_of_Defeat:Source
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# By Clayton Macleod <cherry twist at gmail dot com>
+
+dayofdefeat-source
+^\xff\xff\xff\xff.*dodDay of Defeat
+
diff --git a/src/usr/local/share/protocols/dazhihui.pat b/src/usr/local/share/protocols/dazhihui.pat
new file mode 100644
index 0000000..032440c
--- /dev/null
+++ b/src/usr/local/share/protocols/dazhihui.pat
@@ -0,0 +1,11 @@
+# Dazhihui - stock analysis and trading; Chinese - http://www.gw.com.cn
+# Pattern attributes: fast fast ok
+# Protocol groups:
+# Wiki: http://www.protocolinfo.org/wiki/Dazhihui
+# Copyright (C) 2009 Matthew Strait; See ../LICENSE
+
+# Pattern contributed by liangjun without comment.
+
+dazhihui
+^(longaccoun|qsver2auth|\x35[57]\x30|\+\x10\*)
+
diff --git a/src/usr/local/share/protocols/dhcp.pat b/src/usr/local/share/protocols/dhcp.pat
new file mode 100644
index 0000000..426480d
--- /dev/null
+++ b/src/usr/local/share/protocols/dhcp.pat
@@ -0,0 +1,36 @@
+# DHCP - Dynamic Host Configuration Protocol - RFC 1541
+# Pattern attributes: good veryfast fast
+# Protocol groups: networking ietf_draft_standard
+# Wiki: http://www.protocolinfo.org/wiki/DHCP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on ports 67 (server) and 68 (client)
+#
+# Also matches BOOTP (Bootstrap Protocol (RFC 951)) in the case that
+# the "vendor specific options" are used (these options were made standard
+# for DHCP).
+#
+# This pattern is lightly tested.
+
+dhcp
+^[\x01\x02][\x01- ]\x06.*c\x82sc
+
+# Let's break that down:
+#
+# (\x01|\x02) is for BOOTREQUEST or BOOTREPLY
+# Is there a demand for doing these separately? The Packeteer does.
+#
+# [\x01-\x20] is for any of the hardware address types listed at
+# (http://www.iana.org/assignments/arp-parameters) and hopefully faster
+# ethernets too (100, 1000 and 10000mb) as well (do they share the 10mb
+# number?).
+#
+# \x06 for "hardware address length = 6 bytes". Does anyone use other lengths
+# these days? If so, this pattern won't match it as it stands.
+#
+# .* covers the hops, xid, secs, flags, ciaddr, yiaddr, siaddr, giaddr,
+# chaddr, sname and file fields. While this can't really be "any number
+# of characters" long, it doesn't seem worth it to count.
+# Can we make this more specific by restricting the number of hops or seconds?
+#
+# 0x63825363 is the "magic cookie" which begins the DHCP options field.
diff --git a/src/usr/local/share/protocols/directconnect.pat b/src/usr/local/share/protocols/directconnect.pat
new file mode 100644
index 0000000..13be4a1
--- /dev/null
+++ b/src/usr/local/share/protocols/directconnect.pat
@@ -0,0 +1,14 @@
+# Direct Connect - P2P filesharing - http://www.neo-modus.com
+# Pattern attributes: good fast fast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/Direct_Connect
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Direct Connect "hubs" listen on port 411
+# http://www.dcpp.net/wiki/
+# I've verified that this pattern can be used to limit direct connect
+# bandwidth using DC:PRO 0.2.3.149R11.
+
+directconnect
+# client-to-client handshake|client-to-hub login, hub speaking|client-to-hub login, client speaking
+^(\$mynick |\$lock |\$key )
diff --git a/src/usr/local/share/protocols/dns.pat b/src/usr/local/share/protocols/dns.pat
new file mode 100644
index 0000000..c351831
--- /dev/null
+++ b/src/usr/local/share/protocols/dns.pat
@@ -0,0 +1,63 @@
+# DNS - Domain Name System - RFC 1035
+# Pattern attributes: great slow fast
+# Protocol groups: networking ietf_internet_standard
+# Wiki: http://www.protocolinfo.org/wiki/DNS
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# Thanks to Sebastien Bechet <s.bechet AT av7.net> for TLD detection
+# improvements
+
+# While RFC 2181 says "Occasionally it is assumed that the Domain Name
+# System serves only the purpose of mapping Internet host names to data,
+# and mapping Internet addresses to host names. This is not correct, the
+# DNS is a general (if somewhat limited) hierarchical database, and can
+# store almost any kind of data, for almost any purpose.", we will assume
+# just that, because that represents the vast majority of DNS traffic.
+
+# The packet starts with a 2 byte random ID number and 2 bytes of flags that
+# aren't easy to match on.
+
+# The first thing that is matchable is QDCOUNT, the number of queries.
+# Despite the fact that you can apparently ask for up to 65535
+# things at a time, usually you only ask for one and I doubt you ever ask for
+# zero. Let's allow up to two, just in case (even though I can't find any
+# situation that generates more than one).
+
+# Next comes the ANCOUNT, NSCOUNT, and ARCOUNT fields, which could be null
+# or some smallish number, not matchable except by length (up to 6)
+
+# The next matchable thing is the query address. The first byte indicates the
+# length of the first part of the address, which is limited to 63 (0x3F == '?').
+# The next byte has to be a letter (for domain names) or number (for reverse lookups).
+# Then there can be an combination of
+# letters, digits, hyphens, and 0x01-0x3F length markers.
+# Then we check for the presence of a top-level-domain at some later point.
+# This is indicated by a 0x02-0x06 and at least two letters, followed by no
+# more than four more letters.
+# Note that this will miss a very few queries that are for a TLD alone.
+# i.e. "host museum" (195.7.77.17)
+#
+# http://www.icann.org/tlds http://www.iana.org/cctld/cctld-whois.htm
+
+# next is the QTYPE field, which has valid values 1-16 (although this
+# could probably be restricted further since many are rare) and \x1c for
+# IPv6 (and maybe more?). It should follow immediately after the TLD
+# (and some stripped-out nulls)
+
+# next is QCLASS, which has valid values 1-4 and 255, except 2 is never used.
+# I'm not sure if 3 and 4 are used, so I'll include them. 1=Internet 255=any
+
+# If we wanted to match queries and responses separately, there could be
+# more specifics after this for the responses.
+
+dns
+# here's a sane way of doing it
+^.?.?.?.?[\x01\x02].?.?.?.?.?.?[\x01-?][a-z0-9][\x01-?a-z]*[\x02-\x06][a-z][a-z][fglmoprstuvz]?[aeop]?(um)?[\x01-\x10\x1c][\x01\x03\x04\xFF]
+
+# This way assumes that TLDs are any alpha string 2-6 characters long.
+# If TLDs are added, this is a good fallback.
+#^.?.?.?.?[\x01\x02].?.?.?.?.?.?[\x01-?][a-z0-9][\x01-?a-z]*[\x02-\x06][a-z][a-z][a-z]?[a-z]?[a-z]?[a-z]?[\x01-\x10][\x01\x03\x04\xFF]
+
+# If you have more processing power than me, you can substitute this for
+# the [a-z][a-z][a-z]?[a-z]?[a-z]?[a-z]?
+#(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|arpa|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)
diff --git a/src/usr/local/share/protocols/doom3.pat b/src/usr/local/share/protocols/doom3.pat
new file mode 100644
index 0000000..7d32d6f
--- /dev/null
+++ b/src/usr/local/share/protocols/doom3.pat
@@ -0,0 +1,10 @@
+# Doom 3 - computer game
+# Pattern attributes: good veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Doom
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Thanks to Clayton Macleod (cherrytwist at gmail.com).
+
+doom3
+^\xff\xffchallenge
diff --git a/src/usr/local/share/protocols/edonkey.pat b/src/usr/local/share/protocols/edonkey.pat
new file mode 100644
index 0000000..bc2522e
--- /dev/null
+++ b/src/usr/local/share/protocols/edonkey.pat
@@ -0,0 +1,37 @@
+# eDonkey2000 - P2P filesharing - http://edonkey2000.com and others
+# Pattern attributes: good fast fast overmatch
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/EDonkey
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Tested recently (April/May 2006) with eMule 0.47a and eDonkey2000 1.4
+# and a long time ago with something else.
+#
+# In addition to matching what you might expect, this matches much of
+# what eMule does when you tell it to only connect to the KAD network.
+# I don't quite know what to make of this.
+
+# Thanks to Matt Skidmore <fox AT woozle.org>
+
+edonkey
+
+# http://gd.tuwien.ac.at/opsys/linux/sf/p/pdonkey/eDonkey-protocol-0.6
+#
+# In addition to \xe3, \xc5 and \xd4, I see a lot of \xe5.
+# As of April 2006, I also see some \xe4.
+#
+# God this is a mess. What an irritating protocol.
+# This will match about 2% of streams with random data in them!
+# (But fortunately much fewer than 2% of streams that are other protocols.
+# You can test this with the data in ../testing/)
+
+^[\xc5\xd4\xe3-\xe5].?.?.?.?([\x01\x02\x05\x14\x15\x16\x18\x19\x1a\x1b\x1c\x20\x21\x32\x33\x34\x35\x36\x38\x40\x41\x42\x43\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58[\x60\x81\x82\x90\x91\x93\x96\x97\x98\x99\x9a\x9b\x9c\x9e\xa0\xa1\xa2\xa3\xa4]|\x59................?[ -~]|\x96....$)
+
+# matches everything and too much
+# ^(\xe3|\xc5|\xd4)
+
+# ipp2p essentially uses "\xe3....\x47", which doesn't seem at all right to me.
+
+# bandwidtharbitrator uses
+# e0.*@.*6[a-z].*p$|e0.*@.*[a-z]6[a-z].*p0$|e.*@.*[0-9]6.*p$|emule|edonkey
+# no comments to explain what all the mush is, of course...
diff --git a/src/usr/local/share/protocols/exe.pat b/src/usr/local/share/protocols/exe.pat
new file mode 100644
index 0000000..0a16e2a
--- /dev/null
+++ b/src/usr/local/share/protocols/exe.pat
@@ -0,0 +1,20 @@
+# Executable - Microsoft PE file format.
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+# Thanks to Brandon Enright [bmenrighATucsd.edu]
+
+# This pattern doesn't techincally match the PE file format but rather the
+# MZ stub program Microsoft uses for backwards compatibility with DOS.
+# That means this will correctly match DOS executables too.
+
+exe
+# There are two different stubs used depending on the compiler/packer.
+# Numerous NULL bytes have been stripped from this pattern.
+
+# This pattern may be more efficient:
+# \x4d\x5a\x90\x03\x04|\x4d\x5a\x50\x02\x04
+
+# This is easier to understand:
+\x4d\x5a(\x90\x03|\x50\x02)\x04
diff --git a/src/usr/local/share/protocols/fasttrack.pat b/src/usr/local/share/protocols/fasttrack.pat
new file mode 100644
index 0000000..6ed8ff1
--- /dev/null
+++ b/src/usr/local/share/protocols/fasttrack.pat
@@ -0,0 +1,23 @@
+# FastTrack - P2P filesharing (Kazaa, Morpheus, iMesh, Grokster, etc)
+# Pattern attributes: good slow notsofast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/Fasttrack
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Tested with Kazaa Lite Resurrection 0.0.7.6F
+#
+# This appears to match the download connections well, but not the search
+# connections (I think they are encrypted :-( ).
+
+fasttrack
+# while this is a valid http request, this will be caught because
+# the http pattern matches the response (and therefore the next packet)
+# Even so, it's best to put this match earlier in the chain.
+# http://cvs.berlios.de/cgi-bin/viewcvs.cgi/gift-fasttrack/giFT-FastTrack/PROTOCOL?rev=HEAD&content-type=text/vnd.viewcvs-markup
+
+# This pattern is kinda slow, but not too bad.
+^get (/.download/[ -~]*|/.supernode[ -~]|/.status[ -~]|/.network[ -~]*|/.files|/.hash=[0-9a-f]*/[ -~]*) http/1.1|user-agent: kazaa|x-kazaa(-username|-network|-ip|-supernodeip|-xferid|-xferuid|tag)|^give [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]?[0-9]?[0-9]?
+
+# This isn't much faster:
+#^get (/.download/.*|/.supernode.|/.status.|/.network.*|/.files|/.hash=[0-9a-f]*/.*) http/1.1|user-agent: kazaa|x-kazaa(-username|-network|-ip|-supernodeip|-xferid|-xferuid|tag)|^give [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]?[0-9]?[0-9]?
+
diff --git a/src/usr/local/share/protocols/finger.pat b/src/usr/local/share/protocols/finger.pat
new file mode 100644
index 0000000..f567f8c
--- /dev/null
+++ b/src/usr/local/share/protocols/finger.pat
@@ -0,0 +1,15 @@
+# Finger - User information server - RFC 1288
+# Pattern attributes: good slow slow undermatch overmatch
+# Protocol groups: ietf_draft_standard
+# Wiki: http://www.protocolinfo.org/wiki/Finger
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 79
+#
+# This pattern is lightly tested.
+
+finger
+# The first matches the client request, which should look like a username.
+# The second matches the usual UNIX reply (but remember that they are
+# allowed to say whatever they want)
+^[a-z][a-z0-9\-_]+\x0d\x0a|login: [\x09-\x0d -~]* name: [\x09-\x0d -~]* Directory:
diff --git a/src/usr/local/share/protocols/flash.pat b/src/usr/local/share/protocols/flash.pat
new file mode 100644
index 0000000..23e5d74
--- /dev/null
+++ b/src/usr/local/share/protocols/flash.pat
@@ -0,0 +1,18 @@
+# Flash - Macromedia Flash.
+# Pattern attributes: good slow notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+# Thanks to Brandon Enright {bmenrigh AT ucsd.edu} and chinalantian at
+# 126 dot com
+
+# Macromedia spec:
+# http://download.macromedia.com/pub/flash/flash_file_format_specification.pdf
+# See also:
+# http://www.digitalpreservation.gov/formats/fdd/fdd000130.shtml
+# http://osflash.org/flv
+
+flash
+# FWS = uncompressed, CWS = compressed, next byte is version number
+# FLV = video
+[FC]WS[\x01-\x09]|FLV\x01\x05\x09
diff --git a/src/usr/local/share/protocols/freenet.pat b/src/usr/local/share/protocols/freenet.pat
new file mode 100644
index 0000000..c62ad57
--- /dev/null
+++ b/src/usr/local/share/protocols/freenet.pat
@@ -0,0 +1,10 @@
+# Freenet - Anonymous information retrieval - http://freenetproject.org
+# Pattern attributes: poor veryfast fast
+# Protocol groups: p2p document_retrieval open_source
+# Wiki: http://www.protocolinfo.org/wiki/Freenet
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+freenet
+# Freenet is intentionally hard to identify...
+# This is empirical, only tested on one computer, and unlikely to work anymore.
+^\x01[\x08\x09][\x03\x04]
diff --git a/src/usr/local/share/protocols/ftp.pat b/src/usr/local/share/protocols/ftp.pat
new file mode 100644
index 0000000..44d97c4
--- /dev/null
+++ b/src/usr/local/share/protocols/ftp.pat
@@ -0,0 +1,46 @@
+# FTP - File Transfer Protocol - RFC 959
+# Pattern attributes: great notsofast fast
+# Protocol groups: document_retrieval ietf_internet_standard
+# Wiki: http://protocolinfo.org/wiki/FTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 21. Note that the data stream is on a dynamically
+# assigned port, which means that you will need the FTP connection
+# tracking module in your kernel to usefully match FTP data transfers.
+#
+# This pattern is well tested.
+#
+# Handles the first two things a server should say:
+#
+# First, the server says it's ready by sending "220". Most servers say
+# something after 220, even though they don't have to, and it usually
+# includes the string "ftp" (l7-filter is case insensitive). This
+# includes proftpd, vsftpd, wuftpd, warftpd, pureftpd, Bulletproof FTP
+# Server, and whatever ftp.microsoft.com uses. Almost all servers use only
+# ASCII printable characters between the "220" and the "FTP", but non-English
+# ones might use others.
+#
+# The next thing the server sends is a 331. All the above servers also
+# send something including "password" after this code. By default, we
+# do not match on this because it takes another packet and is more work
+# for regexec.
+
+ftp
+# by default, we allow only ASCII
+^220[\x09-\x0d -~]*ftp
+
+# This covers UTF-8 as well
+#^220[\x09-\x0d -~\x80-\xfd]*ftp
+
+# This allows any characters and is about 4x faster than either of the above
+# (which are about the same as each other)
+#^220.*ftp
+
+# This is much slower
+#^220[\x09-\x0d -~]*ftp|331[\x09-\x0d -~]*password
+
+# This pattern is more precise, but takes longer to match. (3 packets vs. 1)
+#^220[\x09-\x0d -~]*\x0d\x0aUSER[\x09-\x0d -~]*\x0d\x0a331
+
+# same as above, but slightly less precise and only takes 2 packets.
+#^220[\x09-\x0d -~]*\x0d\x0aUSER[\x09-\x0d -~]*\x0d\x0a
diff --git a/src/usr/local/share/protocols/gif.pat b/src/usr/local/share/protocols/gif.pat
new file mode 100644
index 0000000..d54ed91
--- /dev/null
+++ b/src/usr/local/share/protocols/gif.pat
@@ -0,0 +1,8 @@
+# GIF - Popular Image format.
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+gif
+# drawn from /usr/share/magic
+GIF8(7|9)a
diff --git a/src/usr/local/share/protocols/gkrellm.pat b/src/usr/local/share/protocols/gkrellm.pat
new file mode 100644
index 0000000..73eb537
--- /dev/null
+++ b/src/usr/local/share/protocols/gkrellm.pat
@@ -0,0 +1,13 @@
+# Gkrellm - a system monitor - http://gkrellm.net
+# Pattern attributes: great veryfast fast
+# Protocol groups: monitoring open_source
+# Wiki: http://www.protocolinfo.org/wiki/Gkrellm
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested and is believed to work well.
+# Since this is not anything resembling a published protocol, it may change without
+# warning in new versions of gkrellm.
+
+gkrellm
+# tested with gkrellm 2.2.7
+^gkrellm [23].[0-9].[0-9]\x0a$
diff --git a/src/usr/local/share/protocols/gnucleuslan.pat b/src/usr/local/share/protocols/gnucleuslan.pat
new file mode 100644
index 0000000..ae5895b
--- /dev/null
+++ b/src/usr/local/share/protocols/gnucleuslan.pat
@@ -0,0 +1,10 @@
+# GnucleusLAN - LAN-only P2P filesharing
+# Pattern attributes: good notsofast notsofast
+# Protocol groups: p2p open_source
+# Wiki: http://www.protocolinfo.org/wiki/GnucleusLAN
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested and is believed to work well.
+
+gnucleuslan
+gnuclear connect/[\x09-\x0d -~]*user-agent: gnucleus [\x09-\x0d -~]*lan:
diff --git a/src/usr/local/share/protocols/gnutella.pat b/src/usr/local/share/protocols/gnutella.pat
new file mode 100644
index 0000000..770ed43
--- /dev/null
+++ b/src/usr/local/share/protocols/gnutella.pat
@@ -0,0 +1,34 @@
+# Gnutella - P2P filesharing
+# Pattern attributes: good notsofast notsofast
+# Protocol groups: p2p open_source
+# Wiki: http://www.protocolinfo.org/wiki/Gnutella
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This should match both Gnutella and "Gnutella2" ("Mike's protocol")
+#
+# Various clients use this protocol including Mactella, Shareaza,
+# GTK-gnutella, Gnucleus, Gnotella, LimeWire, iMesh and BearShare.
+#
+# This is tested with gtk-gnutella and Shareaza.
+
+# http://www.gnutella2.com/tiki-index.php?page=UDP%20Transceiver
+# http://rfc-gnutella.sf.net/
+# http://www.gnutella2.com/tiki-index.php?page=Gnutella2%20Specification
+# http://en.wikipedia.org/wiki/Shareaza
+
+gnutella
+
+# The first part matches UDP messages - All start with "GND", then have
+# a flag byte which is either \x00, \x01 or \x02, then two sequence bytes
+# that can be anything, then a fragment number, which must start at 1.
+# The rest matches TCP first client message or first server message (in case
+# we can't see client messages). Some parts of this are empirical rather than
+# document based. Assumes version is between 0.0 and 2.9. (usually is
+# 0.4 or 0.6). I'm guessing at many of the user-agents.
+# The last bit is emprical and probably only matches Limewire.
+^(gnd[\x01\x02]?.?.?\x01|gnutella connect/[012]\.[0-9]\x0d\x0a|get /uri-res/n2r\?urn:sha1:|get /.*user-agent: (gtk-gnutella|bearshare|mactella|gnucleus|gnotella|limewire|imesh)|get /.*content-type: application/x-gnutella-packets|giv [0-9]*:[0-9a-f]*/|queue [0-9a-f]* [1-9][0-9]?[0-9]?\.[1-9][0-9]?[0-9]?\.[1-9][0-9]?[0-9]?\.[1-9][0-9]?[0-9]?:[1-9][0-9]?[0-9]?[0-9]?|gnutella.*content-type: application/x-gnutella|...................?lime)
+
+# Needlessly precise, at the expense of time
+#^(gnd[\x01\x02]?.?.?\x01|gnutella connect/[012]\.[0-9]\x0d\x0a|get /uri-res/n2r\?urn:sha1:|get /[\x09-\x0d -~]*user-agent: (gtk-gnutella|bearshare|mactella|gnucleus|gnotella|limewire|imesh)|get /[\x09-\x0d -~]*content-type: application/x-gnutella-packets|giv [0-9]*:[0-9a-f]*/|queue [0-9a-f]* [1-9][0-9]?[0-9]?\.[1-9][0-9]?[0-9]?\.[1-9][0-9]?[0-9]?\.[1-9][0-9]?[0-9]?:[1-9][0-9]?[0-9]?[0-9]?|gnutella[\x09-\x0d -~]*content-type: application/x-gnutella|..................lime)
+
+
diff --git a/src/usr/local/share/protocols/goboogy.pat b/src/usr/local/share/protocols/goboogy.pat
new file mode 100644
index 0000000..d88d00b
--- /dev/null
+++ b/src/usr/local/share/protocols/goboogy.pat
@@ -0,0 +1,13 @@
+# GoBoogy - a Korean P2P protocol
+# Pattern attributes: marginal slow notsofast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/GoBoogy
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is untested and likely does not work in all cases!
+#
+# By Adam Przybyla, modified by Matthew Strait. Possibly lifted from
+# Josh Ballard (oofle.com).
+
+goboogy
+<peerplat>|^get /getfilebyhash\.cgi\?|^get /queue_register\.cgi\?|^get /getupdowninfo\.cgi\?
diff --git a/src/usr/local/share/protocols/gopher.pat b/src/usr/local/share/protocols/gopher.pat
new file mode 100644
index 0000000..773016f
--- /dev/null
+++ b/src/usr/local/share/protocols/gopher.pat
@@ -0,0 +1,25 @@
+# Gopher - A precursor to HTTP - RFC 1436
+# Pattern attributes: good slow notsofast undermatch
+# Protocol groups: document_retrieval obsolete ietf_rfc_documented
+# Wiki: http://www.protocolinfo.org/wiki/Gopher
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Gopher servers usually run on TCP port 70.
+#
+# This pattern is lightly tested using gopher.dna.affrc.go.jp .
+
+gopher
+# This matches the server's response, but naturally only if it is a
+# directory listing, not if it is sending a file, because then the data
+# is totally arbitrary.
+
+# Matches the client saying "list what you have", then the server
+# response: one of the file type characters, any printable characters, a
+# tab, any printable characters, a tab, something that looks like a
+# domain name, a tab, and then a number which could be the start of a
+# port number.
+
+# "0About internet Gopher\tStuff:About us\trawBits.micro.umn.edu\t70"
+# "\r7search by keywords on protein data using wais\twaissrc:/protein_all/protein\tgopher.dna.affrc.go.jp\t70"
+
+^[\x09-\x0d]*[1-9,+tgi][\x09-\x0d -~]*\x09[\x09-\x0d -~]*\x09[a-z0-9.]*\.[a-z][a-z].?.?\x09[1-9]
diff --git a/src/usr/local/share/protocols/gtalk.pat b/src/usr/local/share/protocols/gtalk.pat
new file mode 100644
index 0000000..aa538ca
--- /dev/null
+++ b/src/usr/local/share/protocols/gtalk.pat
@@ -0,0 +1,11 @@
+# GTalk, a Jabber (XMPP) client
+# Pattern attributes: good veryfast fast subset
+# Protocol groups: chat ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/Jabber
+# Copyright (C) 2009 Matthew Strait; See ../LICENSE
+
+# See ../protocols/jabber.pat for more details
+
+gtalk
+^<stream:stream to="gmail\.com"
+
diff --git a/src/usr/local/share/protocols/guildwars.pat b/src/usr/local/share/protocols/guildwars.pat
new file mode 100644
index 0000000..65d2b92
--- /dev/null
+++ b/src/usr/local/share/protocols/guildwars.pat
@@ -0,0 +1,14 @@
+# Guild Wars - online game - http://guildwars.com
+# Pattern attributes: marginal veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Guild_Wars
+# Copyright (C) 2008 Matthew Strait; See ../LICENSE
+
+# Contributed on protocolinfo by Greatwolf with the comment, "Guild Wars
+# uses encrypted data on tcp/6112 and may be impossible to match by
+# content. An experimental filter has been written to match Guild Wars
+# packets. More testing is still required to determine the effectiveness
+# of this pattern."
+
+guildwars
+^[\x04\x05]\x0c.i\x01
diff --git a/src/usr/local/share/protocols/h323.pat b/src/usr/local/share/protocols/h323.pat
new file mode 100644
index 0000000..75b1a39
--- /dev/null
+++ b/src/usr/local/share/protocols/h323.pat
@@ -0,0 +1,36 @@
+# H.323 - Voice over IP.
+# Pattern attributes: ok veryfast fast
+# Protocol groups: voip itu-t_standard
+# Wiki: http://www.protocolinfo.org/wiki/H.323
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is written without knowledge of the principles of H.323.
+# It has only been tested with gnomemeeting and may not work for other
+# clients.
+#
+# Also, it has been reported that:
+# "the pattern ... match[es] only first H.323 stream (conntrack for H.323 was
+# enabled). Also the major chunk of traffic was of RTP which went untracked."
+#
+# Also, it may very well match other things that use TPKT and
+# Q.931.
+
+# Note that to take full advantage of this pattern, you will need to
+# have connection tracking of H.323 support in your kernel. This
+# support is not in the stock kernel. A patch can be found at
+# http://netfilter.org
+
+h323
+# TPKT format: http://www.ietf.org/rfc/rfc1006.txt
+# \x03 = TPKT version. It was 3 in May 1987 and gnomemeeting still uses 3.
+# ..? = null reserved byte and packet length field.
+# Q.931 format: http://www.freesoft.org/CIE/Topics/126.htm
+# \x08 = Q.931
+# . = length of call reference
+# The next byte was: \x18 = message sent from originating side.
+# But based on experimentation, it seems that just . is better.
+# .?.?.?.?.?.?.?.?.?.?.?.?.?.?.? = call reference (0-15 bytes (0 for nulls))
+# \x05 = setup message
+#
+# Yup, it doesn't actually include any H.323 protocol information.
+^\x03..?\x08...?.?.?.?.?.?.?.?.?.?.?.?.?.?.?\x05
diff --git a/src/usr/local/share/protocols/halflife2-deathmatch.pat b/src/usr/local/share/protocols/halflife2-deathmatch.pat
new file mode 100644
index 0000000..45d0bb0
--- /dev/null
+++ b/src/usr/local/share/protocols/halflife2-deathmatch.pat
@@ -0,0 +1,10 @@
+# Half-Life 2 Deathmatch - popular computer game
+# Pattern attributes: good veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Half-Life
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# By Clayton Macleod <cherrytwist TA gmail.com>
+
+halflife2-deathmatch
+^\xff\xff\xff\xff.*hl2mpDeathmatch
diff --git a/src/usr/local/share/protocols/hddtemp.pat b/src/usr/local/share/protocols/hddtemp.pat
new file mode 100644
index 0000000..cdd908c
--- /dev/null
+++ b/src/usr/local/share/protocols/hddtemp.pat
@@ -0,0 +1,14 @@
+# hddtemp - Hard drive temperature reporting
+# Pattern attributes: great veryfast fast
+# Protocol groups: monitoring open_source
+# Wiki: http://www.protocolinfo.org/wiki/HDDtemp
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 7634
+#
+# You're a silly person if you use this pattern.
+#
+# This pattern has been tested and is believed to work well.
+
+hddtemp
+^\|/dev/[a-z][a-z][a-z]\|[0-9a-z]*\|[0-9][0-9]\|[cfk]\|
diff --git a/src/usr/local/share/protocols/hotline.pat b/src/usr/local/share/protocols/hotline.pat
new file mode 100644
index 0000000..20ec6de
--- /dev/null
+++ b/src/usr/local/share/protocols/hotline.pat
@@ -0,0 +1,12 @@
+# Hotline - An old P2P filesharing protocol
+# Pattern attributes: marginal fast fast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/Hotline
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is untested!
+#
+# This is lifted from http://oofle.com/filesharing.php?app=hotline
+
+hotline
+^....................TRTPHOTL\x01\x02
diff --git a/src/usr/local/share/protocols/html.pat b/src/usr/local/share/protocols/html.pat
new file mode 100644
index 0000000..d834a96
--- /dev/null
+++ b/src/usr/local/share/protocols/html.pat
@@ -0,0 +1,11 @@
+# (X)HTML - (Extensible) Hypertext Markup Language - http://w3.org
+# Pattern attributes: good fast notsofast subset
+# Protocol groups: file
+#
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+# This pattern has been tested and is believe to work well.
+
+# this should match any (X)HTML document from any version that conforms
+# even vaugly to the standards.
+html
+<html.*><head>
diff --git a/src/usr/local/share/protocols/http-dap.pat b/src/usr/local/share/protocols/http-dap.pat
new file mode 100644
index 0000000..216d8d6
--- /dev/null
+++ b/src/usr/local/share/protocols/http-dap.pat
@@ -0,0 +1,19 @@
+# HTTP by Download Accelerator Plus - http://www.speedbit.com
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: document_retrieval ietf_draft_standard
+# Wiki: http://protocolinfo.org/wiki/HTTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Uses HTTP to download.
+
+http-dap
+
+# DAP identifies itself in the User-Agent field of every HTTP request it
+# makes. This is pretty trivial to get around if speedbit.com ever
+# wanted to.
+
+# The latest version uses "User-Agent: DA 7.0". The additional version
+# allowance is an attempt at "future proofing".
+
+User-Agent: DA [678]\.[0-9]
+
diff --git a/src/usr/local/share/protocols/http-freshdownload.pat b/src/usr/local/share/protocols/http-freshdownload.pat
new file mode 100644
index 0000000..a342e86
--- /dev/null
+++ b/src/usr/local/share/protocols/http-freshdownload.pat
@@ -0,0 +1,17 @@
+# HTTP by Fresh Download - http://www.freshdevices.com
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: document_retrieval ietf_draft_standard
+# Wiki: http://protocolinfo.org/wiki/HTTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+# Uses HTTP to download.
+
+http-freshdownload
+
+# Fresh Download identifies itself in the User-Agent field of every HTTP
+# request it makes.
+
+# The latest version uses "User-Agent: FreshDownload/4.40". The
+# additional version allowance is an attempt at "future proofing".
+
+User-Agent: FreshDownload/[456](\.[0-9][0-9]?)?
+
diff --git a/src/usr/local/share/protocols/http-itunes.pat b/src/usr/local/share/protocols/http-itunes.pat
new file mode 100644
index 0000000..fd44ee4
--- /dev/null
+++ b/src/usr/local/share/protocols/http-itunes.pat
@@ -0,0 +1,14 @@
+# HTTP - iTunes (Apple's music program)
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: streaming_audio ietf_draft_standard
+# Wiki: http://protocolinfo.org/wiki/HTTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Port 80
+# iTunes program basically uses the HTTP protocol for its initial
+# communication.
+# Pattern contributed by Deepak Seshadri <dseshadri AT broadbandmaritime.com>
+
+http-itunes
+http/(0\.9|1\.0|1\.1).*(user-agent: itunes)
+
diff --git a/src/usr/local/share/protocols/http-rtsp.pat b/src/usr/local/share/protocols/http-rtsp.pat
new file mode 100644
index 0000000..73ef926
--- /dev/null
+++ b/src/usr/local/share/protocols/http-rtsp.pat
@@ -0,0 +1,16 @@
+# RTSP tunneled within HTTP
+# Pattern attributes: ok notsofast fast subset
+# Protocol groups: streaming_audio streaming_video ietf_draft_standard
+# Wiki: http://www.protocolinfo.org/wiki/RTSP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Apple's documentation on what Quicktime does:
+# http://developer.apple.com/quicktime/icefloe/dispatch028.html
+# This is what the first part of the pattern is about
+#
+# The second part is based on the example in RFC 2326. For this part to
+# work, this pattern MUST be earlier in the iptables rules chain than
+# HTTP. Otherwise, the stream will be identified as HTTP.
+
+http-rtsp
+^(get[\x09-\x0d -~]* Accept: application/x-rtsp-tunnelled|http/(0\.9|1\.0|1\.1) [1-5][0-9][0-9] [\x09-\x0d -~]*a=control:rtsp://)
diff --git a/src/usr/local/share/protocols/http.pat b/src/usr/local/share/protocols/http.pat
new file mode 100644
index 0000000..5122310
--- /dev/null
+++ b/src/usr/local/share/protocols/http.pat
@@ -0,0 +1,28 @@
+# HTTP - HyperText Transfer Protocol - RFC 2616
+# Pattern attributes: great slow notsofast superset
+# Protocol groups: document_retrieval ietf_draft_standard
+# Wiki: http://protocolinfo.org/wiki/HTTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 80
+#
+# This pattern has been tested and is believed to work well.
+#
+# this intentionally catches the response from the server rather than
+# the request so that other protocols which use http (like kazaa) can be
+# caught based on specific http requests regardless of the ordering of
+# filters... also matches posts
+
+# Sites that serve really long cookies may break this by pushing the
+# server response too far away from the beginning of the connection. To
+# fix this, increase the kernel's data buffer length.
+
+http
+# Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF (rfc 2616)
+# As specified in rfc 2616 a status code is preceeded and followed by a
+# space.
+http/(0\.9|1\.0|1\.1) [1-5][0-9][0-9] [\x09-\x0d -~]*(connection:|content-type:|content-length:|date:)|post [\x09-\x0d -~]* http/[01]\.[019]
+# A slightly faster version that might be good enough:
+#http/(0\.9|1\.0|1\.1) [1-5][0-9][0-9]|post [\x09-\x0d -~]* http/[01]\.[019]
+# old pattern(s):
+#(http[\x09-\x0d -~]*(200 ok|302 |304 )[\x09-\x0d -~]*(connection:|content-type:|content-length:))|^(post [\x09-\x0d -~]* http/)
diff --git a/src/usr/local/share/protocols/httpaudio.pat b/src/usr/local/share/protocols/httpaudio.pat
new file mode 100644
index 0000000..c6cdd9a
--- /dev/null
+++ b/src/usr/local/share/protocols/httpaudio.pat
@@ -0,0 +1,32 @@
+# HTTP - Audio over HyperText Transfer Protocol (RFC 2616)
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: streaming_audio document_retrieval ietf_draft_standard
+# Wiki: http://protocolinfo.org/wiki/HTTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 80
+#
+# Contributed by Deepak Seshadri <dseshadri AT broadbandmaritime.com>
+#
+# This pattern has been tested and is believed to work well.
+#
+# To get or provide more information about this protocol and/or pattern:
+# http://www.protocolinfo.org/wiki/HTTP
+# http://lists.sourceforge.net/lists/listinfo/l7-filter-developers
+#
+# If you use this, you should be aware that:
+#
+# - they match both simple downloads of audio/video and streaming content.
+#
+# - blocking based on content-type encourages server
+# writers/administrators to misreport content-type (which will just make
+# headaches for everyone, including us), so I would strongly recommend
+# shaping audio/video down to a speed that discourages use of streaming
+# players without actually blocking it.
+#
+# - obviously, since this is a subset of HTTP, you need to match it
+# earlier in your iptables rules than HTTP.
+
+httpaudio
+http/(0\.9|1\.0|1\.1)[\x09-\x0d ][1-5][0-9][0-9][\x09-\x0d -~]*(content-type: audio)
+
diff --git a/src/usr/local/share/protocols/httpcachehit.pat b/src/usr/local/share/protocols/httpcachehit.pat
new file mode 100644
index 0000000..41cb099
--- /dev/null
+++ b/src/usr/local/share/protocols/httpcachehit.pat
@@ -0,0 +1,19 @@
+# HTTP - Proxy Cache hit for HyperText Transfer Protocol (RFC 2616)
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: document_retrieval ietf_draft_standard
+# Wiki: http://protocolinfo.org/wiki/HTTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 80
+#
+# Contributed by Francesco Del Degan <fdeldegan AT libero.it>
+#
+# This pattern has been tested and is believed to work well.
+#
+# To get or provide more information about this protocol and/or pattern:
+# http://www.protocolinfo.org/wiki/HTTP
+# http://lists.sourceforge.net/lists/listinfo/l7-filter-developers
+
+httpcachehit
+http/(0\.9|1\.0|1\.1)[\x09-\x0d ][1-5][0-9][0-9][\x09-\x0d -~]*(x-cache: hit)
+
diff --git a/src/usr/local/share/protocols/httpcachemiss.pat b/src/usr/local/share/protocols/httpcachemiss.pat
new file mode 100644
index 0000000..09ac6cd
--- /dev/null
+++ b/src/usr/local/share/protocols/httpcachemiss.pat
@@ -0,0 +1,17 @@
+# HTTP - Proxy Cache miss for HyperText Transfer Protocol (RFC 2616)
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: document_retrieval ietf_draft_standard
+# Wiki: http://protocolinfo.org/wiki/HTTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 80
+#
+# This pattern has been tested and is believed to work well.
+#
+# To get or provide more information about this protocol and/or pattern:
+# http://www.protocolinfo.org/wiki/HTTP
+# http://lists.sourceforge.net/lists/listinfo/l7-filter-developers
+
+httpcachemiss
+http/(0\.9|1\.0|1\.1)[\x09-\x0d ][1-5][0-9][0-9][\x09-\x0d -~]*(x-cache: miss)
+
diff --git a/src/usr/local/share/protocols/httpvideo.pat b/src/usr/local/share/protocols/httpvideo.pat
new file mode 100644
index 0000000..4a75ce0
--- /dev/null
+++ b/src/usr/local/share/protocols/httpvideo.pat
@@ -0,0 +1,32 @@
+# HTTP - Video over HyperText Transfer Protocol (RFC 2616)
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: streaming_video document_retrieval ietf_draft_standard
+# Wiki: http://protocolinfo.org/wiki/HTTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 80
+#
+# Contributed by Deepak Seshadri <dseshadri AT broadbandmaritime.com>
+#
+# This pattern has been tested and is believed to work well.
+#
+# To get or provide more information about this protocol and/or pattern:
+# http://www.protocolinfo.org/wiki/HTTP
+# http://lists.sourceforge.net/lists/listinfo/l7-filter-developers
+#
+# If you use this, you should be aware that:
+#
+# - they match both simple downloads of audio/video and streaming content.
+#
+# - blocking based on content-type encourages server
+# writers/administrators to misreport content-type (which will just make
+# headaches for everyone, including us), so I would strongly recommend
+# shaping audio/video down to a speed that discourages use of streaming
+# players without actually blocking it.
+#
+# - obviously, since this is a subset of HTTP, you need to match it
+# earlier in your iptables rules than HTTP.
+
+httpvideo
+http/(0\.9|1\.0|1\.1)[\x09-\x0d ][1-5][0-9][0-9][\x09-\x0d -~]*(content-type: video)
+
diff --git a/src/usr/local/share/protocols/ident.pat b/src/usr/local/share/protocols/ident.pat
new file mode 100644
index 0000000..3205e5e
--- /dev/null
+++ b/src/usr/local/share/protocols/ident.pat
@@ -0,0 +1,15 @@
+# Ident - Identification Protocol - RFC 1413
+# Pattern attributes: good fast fast
+# Protocol groups: networking ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/Ident
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 113
+#
+# This pattern is believed to work.
+
+ident
+# "number , numberCRLF" possibly without the CR and/or LF.
+# ^$ is appropriate because the first packet should never have anything
+# else in it.
+^[1-9][0-9]?[0-9]?[0-9]?[0-9]?[\x09-\x0d]*,[\x09-\x0d]*[1-9][0-9]?[0-9]?[0-9]?[0-9]?(\x0d\x0a|[\x0d\x0a])?$
diff --git a/src/usr/local/share/protocols/imap.pat b/src/usr/local/share/protocols/imap.pat
new file mode 100644
index 0000000..3f989c0
--- /dev/null
+++ b/src/usr/local/share/protocols/imap.pat
@@ -0,0 +1,14 @@
+# IMAP - Internet Message Access Protocol (A common e-mail protocol)
+# Pattern attributes: great fast fast
+# Protocol groups: mail ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/IMAP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This matches IMAP4 (RFC 3501) and probably IMAP2 (RFC 1176)
+#
+# This pattern has been tested and is believed to work well.
+#
+# This matches the IMAP welcome message or a noop command (which for
+# some unknown reason can happen at the start of a connection?)
+imap
+^(\* ok|a[0-9]+ noop)
diff --git a/src/usr/local/share/protocols/imesh.pat b/src/usr/local/share/protocols/imesh.pat
new file mode 100644
index 0000000..4cb7ac7
--- /dev/null
+++ b/src/usr/local/share/protocols/imesh.pat
@@ -0,0 +1,15 @@
+# iMesh - the native protocol of iMesh, a P2P application - http://imesh.com
+# Pattern attributes: ok fast notsofast
+# Protocol groups: p2p
+# Wiki: http://protocolinfo.org/wiki/iMesh
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# depending on the version of iMesh (the program), it can also use fasttrack,
+# gnutella and edonkey in addition to iMesh (the protocol).
+
+imesh
+# The first branch matches the login
+# The second branch matches the main non-download connection (searches, etc)
+# The third branch matches downloads of "premium" content
+# The fourth branch matches peer downloads.
+^(post[\x09-\x0d -~]*<PasswordHash>................................</PasswordHash><ClientVer>|\x34\x80?\x0d?\xfc\xff\x04|get[\x09-\x0d -~]*Host: imsh\.download-prod\.musicnet\.com|\x02[\x01\x02]\x83.*\x02[\x01\x02]\x83)
diff --git a/src/usr/local/share/protocols/ipp.pat b/src/usr/local/share/protocols/ipp.pat
new file mode 100644
index 0000000..15540d0
--- /dev/null
+++ b/src/usr/local/share/protocols/ipp.pat
@@ -0,0 +1,12 @@
+# IP printing - a new standard for UNIX printing - RFC 2911
+# Pattern attributes: good notsofast notsofast
+# Protocol groups: printer ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/IPP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested and is believed to work well.
+
+ipp
+# It's unlikely that anything else has this string, but I think we could
+# do a bit better...
+ipp://
diff --git a/src/usr/local/share/protocols/irc.pat b/src/usr/local/share/protocols/irc.pat
new file mode 100644
index 0000000..b922b3e
--- /dev/null
+++ b/src/usr/local/share/protocols/irc.pat
@@ -0,0 +1,20 @@
+# IRC - Internet Relay Chat - RFC 1459
+# Pattern attributes: great fast fast
+# Protocol groups: chat ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/IRC
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 6666 or 6667
+# Note that chat traffic runs on these ports, but IRC-DCC traffic (which
+# can use much more bandwidth) uses a dynamically assigned port, so you
+# must have the IRC connection tracking module in your kernel to classify
+# this.
+#
+# This pattern has been tested and is believed to work well.
+
+irc
+# First thing that happens is that the client sends NICK and USER, in
+# either order. This allows MIRC color codes (\x02-\x0d instead of
+# \x09-\x0d).
+^(nick[\x09-\x0d -~]*user[\x09-\x0d -~]*:|user[\x09-\x0d -~]*:[\x02-\x0d -~]*nick[\x09-\x0d -~]*\x0d\x0a)
+
diff --git a/src/usr/local/share/protocols/jabber.pat b/src/usr/local/share/protocols/jabber.pat
new file mode 100644
index 0000000..7c32890
--- /dev/null
+++ b/src/usr/local/share/protocols/jabber.pat
@@ -0,0 +1,24 @@
+# Jabber (XMPP) - open instant messenger protocol - RFC 3920 - http://jabber.org
+# Pattern attributes: good notsofast notsofast
+# Protocol groups: chat ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/Jabber
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested with Gaim and Gabber. It is only tested
+# with non-SSL mode Jabber with no proxies.
+
+# Thanks to Jan Hudec for some improvements.
+
+# Jabber seems to take a long time to set up a connection. I'm
+# connecting with Gabber 0.8.8 to 12jabber.org and the first 8 packets
+# is this:
+# <stream:stream to='12jabber.com' xmlns='jabber:client'
+# xmlns:stream='http://etherx.jabber.org/streams'><?xml
+# version='1.0'?><stream:stream
+# xmlns:stream='http://etherx.jabber.org/streams' id='3f73e951'
+# xmlns='jabber:client' from='12jabber.com'>
+#
+# No mention of my username or password yet, you'll note.
+
+jabber
+<stream:stream[\x09-\x0d ][ -~]*[\x09-\x0d ]xmlns=['"]jabber
diff --git a/src/usr/local/share/protocols/jpeg.pat b/src/usr/local/share/protocols/jpeg.pat
new file mode 100644
index 0000000..fd1a249
--- /dev/null
+++ b/src/usr/local/share/protocols/jpeg.pat
@@ -0,0 +1,8 @@
+# JPEG - Joint Picture Expert Group image format.
+# Pattern attributes: ok fast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+jpeg
+# drawn from /usr/share/magic
+\xff\xd8
diff --git a/src/usr/local/share/protocols/kugoo.pat b/src/usr/local/share/protocols/kugoo.pat
new file mode 100644
index 0000000..c478317
--- /dev/null
+++ b/src/usr/local/share/protocols/kugoo.pat
@@ -0,0 +1,21 @@
+# KuGoo - a Chinese P2P program - http://www.kugoo.com
+# Pattern attributes: ok fast fast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/KuGoo
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+kugoo
+# liangjun says: "i find old pattern is not working for kugoo 2008. so i
+# write a new pattern of kugoo 2008 ,it's working with all of kugoo 2008
+# version!"
+^(\x64.....\x70....\x50\x37|\x65.+)
+
+# Pattern before 2008 11 08
+#
+# The author of this pattern says it works, but this is unconfirmed.
+# Written by www.routerclub.com wsgtrsys.
+#
+# LanTian submitted \x64.+\x74\x47\x50\x37 for "KuGoo2", but adding as
+# another branch makes the pattern REALLY slow. If it could have a ^, that'd
+# be ok (still veryfast/fast). Waiting to hear.
+#^(\x31..\x8e|\x64.+\x74\x47\x50\x37)
diff --git a/src/usr/local/share/protocols/live365.pat b/src/usr/local/share/protocols/live365.pat
new file mode 100644
index 0000000..144ac50
--- /dev/null
+++ b/src/usr/local/share/protocols/live365.pat
@@ -0,0 +1,15 @@
+# live365 - An Internet radio site - http://live365.com
+# Pattern attributes: marginal notsofast notsofast
+# Protocol groups: streaming_audio
+# Wiki: http://www.protocolinfo.org/wiki/Live365
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern was "contributed" (taken with permission) by the bandwidth
+# arbitrator project (www.bandwidtharbitrator.com).
+#
+# This pattern is unconfirmed.
+
+live365
+# FIXME: what's going on here?
+membername.*session.*player
+
diff --git a/src/usr/local/share/protocols/liveforspeed.pat b/src/usr/local/share/protocols/liveforspeed.pat
new file mode 100644
index 0000000..ad32e9a
--- /dev/null
+++ b/src/usr/local/share/protocols/liveforspeed.pat
@@ -0,0 +1,13 @@
+# Live For Speed - A racing game.
+# Pattern attributes: poor fast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Live_For_Speed
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern was submitted to protocolinfo.org by 80.55.238.74 with no
+# explanation. It is unconfirmed.
+
+# Live For Speed S2 Alpha 0.5 X10
+liveforspeed
+^..\x05\x58\x0a\x1d\x03
+# The same guy came by the next day and deleted the \x03 without comment...
diff --git a/src/usr/local/share/protocols/lpd.pat b/src/usr/local/share/protocols/lpd.pat
new file mode 100644
index 0000000..4b78dfe
--- /dev/null
+++ b/src/usr/local/share/protocols/lpd.pat
@@ -0,0 +1,18 @@
+# LPD - Line Printer Daemon Protocol (old-style UNIX printing) - RFC 1179
+# Pattern attributes: ok fast fast
+# Protocol groups: printer ietf_rfc_documented
+# Wiki: http://www.protocolinfo.org/wiki/LPD
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is untested.
+
+lpd
+# print waiting jobs: ^\x01[!-~]+\x0a$
+# receive a print job: ^\x02[!-~]+\x0a.[\x01\x02\x03][\x01-\x0a -~]*\x0a$
+# Send queue state: ^[\x03\x04][!-~]+[\x09-\x0d]+[a-z][\x09-\x0d -~]*\x0a$
+# Remove jobs: ^\x05[!-~]+[\x09-\x0d]+([a-z][!-~]*[\x09-\x0d]+[1-9][0-9]?[0-9]?|root[\x09-\x0d]+[!-~]+).*\x0a$
+
+# This pattern looks like it might match random data once in a while, but
+# testing shows that this is not the case.
+
+^(\x01[!-~]+|\x02[!-~]+\x0a.[\x01\x02\x03][\x01-\x0a -~]*|[\x03\x04][!-~]+[\x09-\x0d]+[a-z][\x09-\x0d -~]*|\x05[!-~]+[\x09-\x0d]+([a-z][!-~]*[\x09-\x0d]+[1-9][0-9]?[0-9]?|root[\x09-\x0d]+[!-~]+).*)\x0a$
diff --git a/src/usr/local/share/protocols/mohaa.pat b/src/usr/local/share/protocols/mohaa.pat
new file mode 100644
index 0000000..00b6c07
--- /dev/null
+++ b/src/usr/local/share/protocols/mohaa.pat
@@ -0,0 +1,11 @@
+# Medal of Honor Allied Assault - an Electronic Arts game
+# Pattern attributes: good veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Medal_of_Honor_Allied_Assault
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is written and tested by Krzysztof Maciejewski.
+
+mohaa
+^\xff\xff\xff\xffgetstatus\x0a
+
diff --git a/src/usr/local/share/protocols/mp3.pat b/src/usr/local/share/protocols/mp3.pat
new file mode 100644
index 0000000..1b60a4c
--- /dev/null
+++ b/src/usr/local/share/protocols/mp3.pat
@@ -0,0 +1,11 @@
+# MP3 - Moving Picture Experts Group Audio Layer III
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+# By LanTian (chinalantian at 126 d.t com)
+
+# Only matches the standard MP3 form, non-standard files might not be matched.
+
+mp3
+\x49\x44\x33\x03
diff --git a/src/usr/local/share/protocols/msn-filetransfer.pat b/src/usr/local/share/protocols/msn-filetransfer.pat
new file mode 100644
index 0000000..797edb4
--- /dev/null
+++ b/src/usr/local/share/protocols/msn-filetransfer.pat
@@ -0,0 +1,30 @@
+# MSN (Micosoft Network) Messenger file transfers (MSNFTP and MSNSLP)
+# Pattern attributes: good fast fast
+# Protocol groups: chat document_retrieval proprietary
+# Wiki: http://www.protocolinfo.org/wiki/MSN_Messenger
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# http://www.hypothetic.org/docs/msn/client/file_transfer.php
+
+# NOTE! This pattern does not catch the modern type of MSN filetransfers
+# because they use the same TCP connection as the chat itself. See
+# ../example_traffic/msn_chat_and_file_transfer.txt for a demonstration.
+
+# This pattern has been tested and seems to work well. It, does,
+# however, require more testing with various versions of the official
+# MSN client as well as with clones such as Trillian, Miranda, Gaim,
+# etc. If you are using a MSN clone and this pattern DOES work for you,
+# please, also let us know.
+
+# First part matches the older MSNFTP: A MSN filetransfer is a normal
+# MSN connection except that the protocol is MSNFTP. Some clients
+# (especially Trillian) send other protocol versions besides MSNFTP
+# which should be matched by the [ -~]*.
+
+# Second part matches newer MSNSLP:
+# http://msnpiki.msnfanatic.com/index.php/MSNC:MSNSLP
+# This part is untested.
+
+msn-filetransfer
+^(ver [ -~]*msnftp\x0d\x0aver msnftp\x0d\x0ausr|method msnmsgr:)
+
diff --git a/src/usr/local/share/protocols/msnmessenger.pat b/src/usr/local/share/protocols/msnmessenger.pat
new file mode 100644
index 0000000..11dfc10
--- /dev/null
+++ b/src/usr/local/share/protocols/msnmessenger.pat
@@ -0,0 +1,28 @@
+# MSN Messenger - Microsoft Network chat client
+# Pattern attributes: good slow notsofast
+# Protocol groups: chat proprietary
+# Wiki: http://www.protocolinfo.org/wiki/MSN_Messenger
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually uses TCP port 1863
+# http://www.hypothetic.org/docs/msn/index.php
+# http://msnpiki.msnfanatic.com/
+#
+# This pattern has been tested and is believed to work well.
+
+msnmessenger
+
+# First branch: login
+# ver: allow versions up to 99.
+# I've never seen a cvr other than cvr0. Maybe this will be trouble later?
+# Can't anchor at the beginning because sometimes this is encapsulated in
+# HTTP. But either way, the first packet ends like this.
+# Second/Third branches: accepting/sending a message
+# I will assume that these can also be encapsulated in HTTP, although I have
+# not checked. Example of each direction:
+# ANS 1 quadong@hotmail.com 1139803431.29427 17522047
+# USR 1 quadong@hotmail.com 530423708.968145.366138
+
+# Branches are written entirely separately for better performance.
+ver [0-9]+ msnp[1-9][0-9]? [\x09-\x0d -~]*cvr0\x0d\x0a$|usr 1 [!-~]+ [0-9. ]+\x0d\x0a$|ans 1 [!-~]+ [0-9. ]+\x0d\x0a$
+
diff --git a/src/usr/local/share/protocols/mute.pat b/src/usr/local/share/protocols/mute.pat
new file mode 100644
index 0000000..53f2e23
--- /dev/null
+++ b/src/usr/local/share/protocols/mute.pat
@@ -0,0 +1,11 @@
+# MUTE - P2P filesharing - http://mute-net.sourceforge.net
+# Pattern attributes: marginal fast fast
+# Protocol groups: p2p open_source
+# Wiki: http://www.protocolinfo.org/wiki/MUTE
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is lightly tested. I don't know for sure that it will
+# match the actual file transfers.
+
+mute
+^(Public|AES)Key: [0-9a-f]*\x0aEnd(Public|AES)Key\x0a$
diff --git a/src/usr/local/share/protocols/napster.pat b/src/usr/local/share/protocols/napster.pat
new file mode 100644
index 0000000..d7ef032
--- /dev/null
+++ b/src/usr/local/share/protocols/napster.pat
@@ -0,0 +1,24 @@
+# Napster - P2P filesharing
+# Pattern attributes: good fast fast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/Napster
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# All my tests show that this pattern is fast, but one user has reported that
+# it is slow. Your milage may vary.
+#
+# Should work for any Napster offspring, like OpenNAP.
+# (Yes, people still use this!)
+# Matches both searches and downloads.
+#
+# http://opennap.sourceforge.net/napster.txt
+#
+# This pattern has been tested and is believed to work well.
+
+napster
+# (client-server: length, assumed to be less than 256, login or new user login,
+# username, password, port, client ID, link-type |
+# client-client: 1, firewalled or not, username, filename)
+# Assumes that filenames are well-behaved ASCII strings. I have found
+# one case where this assumptions fails (filename had \x99 in it).
+^(.[\x02\x06][!-~]+ [!-~]+ [0-9][0-9]?[0-9]?[0-9]?[0-9]? "[\x09-\x0d -~]+" ([0-9]|10)|1(send|get)[!-~]+ "[\x09-\x0d -~]+")
diff --git a/src/usr/local/share/protocols/nbns.pat b/src/usr/local/share/protocols/nbns.pat
new file mode 100644
index 0000000..ca114de
--- /dev/null
+++ b/src/usr/local/share/protocols/nbns.pat
@@ -0,0 +1,20 @@
+# NBNS - NetBIOS name service
+# Pattern attributes: good slow notsofast
+# Protocol groups: networking proprietary
+# Wiki: http://www.protocolinfo.org/wiki/NBNS
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested and is believed to work well.
+#
+# name query
+# \x01\x10 means name query
+#
+# registration NB
+# (\x10 or )\x10 means registration
+#
+# release NB (merged with registration)
+# 0\x10 means release
+
+nbns
+# This is not a valid basic GNU regular expression.
+\x01\x10\x01|\)\x10\x01\x01|0\x10\x01
diff --git a/src/usr/local/share/protocols/ncp.pat b/src/usr/local/share/protocols/ncp.pat
new file mode 100644
index 0000000..55792b2
--- /dev/null
+++ b/src/usr/local/share/protocols/ncp.pat
@@ -0,0 +1,23 @@
+# NCP - Novell Core Protocol
+# Pattern attributes: good fast fast
+# Protocol groups: networking proprietary
+# Wiki: http://www.protocolinfo.org/wiki/NCP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested and is believed to work well.
+
+# ncp request
+# dmdt means Request
+# *any length
+#
+# *any reply buffer size
+# "" means service request
+# | \x17\x17 means create a service connection
+# | uu means destroy service connection
+
+# ncp reply
+# tncp means reply
+# 33 means service reply
+
+ncp
+^(dmdt.*\x01.*(""|\x11\x11|uu)|tncp.*33)
diff --git a/src/usr/local/share/protocols/netbios.pat b/src/usr/local/share/protocols/netbios.pat
new file mode 100644
index 0000000..a0314b1
--- /dev/null
+++ b/src/usr/local/share/protocols/netbios.pat
@@ -0,0 +1,29 @@
+# NetBIOS - Network Basic Input Output System
+# Pattern attributes: marginal notsofast notsofast
+# Protocol groups: networking ietf_internet_standard proprietary
+# Wiki: http://www.protocolinfo.org/wiki/NetBIOS
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# As mentioned in smb.pat:
+#
+# "This protocol is sometimes also referred to as the Common Internet File
+# System (CIFS), LanManager or NetBIOS protocol." -- "man samba"
+#
+# Actually, SMB is a higher level protocol than NetBIOS. However, the
+# NetBIOS header is only 4 bytes: not much to match on.
+#
+# http://www.ubiqx.org/cifs/SMB.html
+# See also RFCs 1001 and 1002.
+#
+# This pattern attempts to match the (Session layer) NetBIOS Session request.
+# If sucessful, you may be able to match NetBIOS several packets earlier
+# than if you just waited for the easier-to-match SMB header.
+#
+# This pattern is untested.
+
+netbios
+# session request byte, three bytes of flags and length. Then
+# there should be a big mess of letters between A and P which represent
+# the NetBIOS names of the involved computers (with a null between them).
+# (40ish here, damn this regexp implementation and its lack of {40,})
+\x81.?.?.[A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P]
diff --git a/src/usr/local/share/protocols/nimda.pat b/src/usr/local/share/protocols/nimda.pat
new file mode 100644
index 0000000..86c7ce1
--- /dev/null
+++ b/src/usr/local/share/protocols/nimda.pat
@@ -0,0 +1,8 @@
+# Nimda - a worm that attacks Microsoft IIS web servers, and MORE!
+# Pattern attributes: ok notsofast notsofast subset
+# Protocol groups: worm
+# Wiki: http://www.protocolinfo.org/wiki/Nimda
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+nimda
+GET (/scripts/root\.exe\?/c\+dir|/MSADC/root\.exe\?/c\+dir|/c/winnt/system32/cmd\.exe\?/c\+dir|/d/winnt/system32/cmd\.exe\?/c\+dir|/scripts/\.\.%5c\.\./winnt/system32/cmd\.exe\?/c\+dir|/_vti_bin/\.\.%5c\.\./\.\.%5c\.\./\.\.%5c\.\./winnt/system32/cmd\.exe\?/c\+dir|/_mem_bin/\.\.%5c\.\./\.\.%5c\.\./\.\.%5c\.\./winnt/system32/cmd\.exe\?/c\+dir|/msadc/\.\.%5c\.\./\.\.%5c\.\./\.\.%5c/\.\.\xc1\x1c\.\./\.\.\xc1\x1c\.\./\.\.\xc1\x1c\.\./winnt/system32/cmd\.exe\?/c\+dir|/scripts/\.\.\xc1\x1c\.\./winnt/system32/cmd\.exe\?/c\+dir|/scripts/\.\.\xc0/\.\./winnt/system32/cmd\.exe\?/c\+dir|/scripts/\.\.\xc0\xaf\.\./winnt/system32/cmd\.exe\?/c\+dir|/scripts/\.\.\xc1\x9c\.\./winnt/system32/cmd\.exe\?/c\+dir|/scripts/\.\.%35c\.\./winnt/system32/cmd\.exe\?/c\+dir|/scripts/\.\.%35c\.\./winnt/system32/cmd\.exe\?/c\+dir|/scripts/\.\.%5c\.\./winnt/system32/cmd\.exe\?/c\+dir|/scripts/\.\.%2f\.\./winnt/system32/cmd\.exe\?/c\+dir)
diff --git a/src/usr/local/share/protocols/nntp.pat b/src/usr/local/share/protocols/nntp.pat
new file mode 100644
index 0000000..7a30578
--- /dev/null
+++ b/src/usr/local/share/protocols/nntp.pat
@@ -0,0 +1,21 @@
+# NNTP - Network News Transfer Protocol - RFCs 977 and 2980
+# Pattern attributes: good fast fast
+# Protocol groups: ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/NNTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# usually runs on port 119
+
+# This pattern is tested and is believed to work well (but could use
+# more testing).
+
+nntp
+# matches authorized login
+# OR
+# matches unauthorized login if the server says "news" after 200/201
+# (Half of the 2 servers I tested did :-), but they both required authorization
+# so it's quite possible that this pattern will miss some nntp traffic.)
+^(20[01][\x09-\x0d -~]*AUTHINFO USER|20[01][\x09-\x0d -~]*news)
+
+# same thing, slightly more accurate, but 100+ times slower
+#^20[01][\x09-\x0d -~]*\x0d\x0a[\x09-\x0d -~]*AUTHINFO USER|20[01][\x09-\x0d -~]*news
diff --git a/src/usr/local/share/protocols/ntp.pat b/src/usr/local/share/protocols/ntp.pat
new file mode 100644
index 0000000..760cfdb
--- /dev/null
+++ b/src/usr/local/share/protocols/ntp.pat
@@ -0,0 +1,17 @@
+# (S)NTP - (Simple) Network Time Protocol - RFCs 1305 and 2030
+# Pattern attributes: good fast fast overmatch
+# Protocol groups: time_synchronization ietf_draft_standard
+# Wiki: http://www.protocolinfo.org/wiki/NTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is tested and is believed to work.
+
+# client|server
+# Requires the server's timestamp to be in the present or future (of 2005).
+# Tested with ntpdate on Linux.
+# Assumes version 2, 3 or 4.
+
+# Note that ntp packets are always 48 bytes, so you should match on that too.
+
+ntp
+^([\x13\x1b\x23\xd3\xdb\xe3]|[\x14\x1c$].......?.?.?.?.?.?.?.?.?[\xc6-\xff])
diff --git a/src/usr/local/share/protocols/ogg.pat b/src/usr/local/share/protocols/ogg.pat
new file mode 100644
index 0000000..d9ba377
--- /dev/null
+++ b/src/usr/local/share/protocols/ogg.pat
@@ -0,0 +1,7 @@
+# Ogg - Ogg Vorbis music format (not any ogg file, just vorbis)
+# Pattern attributes: ok notsofast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+ogg
+oggs.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?\x01vorbis
diff --git a/src/usr/local/share/protocols/openft.pat b/src/usr/local/share/protocols/openft.pat
new file mode 100644
index 0000000..09fa852
--- /dev/null
+++ b/src/usr/local/share/protocols/openft.pat
@@ -0,0 +1,13 @@
+# OpenFT - P2P filesharing (implemented in giFT library)
+# Pattern attributes: good notsofast notsofast
+# Protocol groups: p2p open_source
+# Wiki: http://www.protocolinfo.org/wiki/OpenFT
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# Ben Efros <ben AT xgendev.com> says:
+# "This pattern identifies openFT P2P transfers fine. openFT is part of giFT
+# and is a pretty large p2p network. I would describe this pattern as pretty
+# weak, but it works for the giFT-based clients I've used."
+
+openft
+x-openftalias: [-)(0-9a-z ~.]
diff --git a/src/usr/local/share/protocols/pcanywhere.pat b/src/usr/local/share/protocols/pcanywhere.pat
new file mode 100644
index 0000000..60b50a7
--- /dev/null
+++ b/src/usr/local/share/protocols/pcanywhere.pat
@@ -0,0 +1,12 @@
+# pcAnywhere - Symantec remote access program
+# Pattern attributes: marginal veryfast fast
+# Protocol groups: remote_access proprietary
+# Wiki: http://www.protocolinfo.org/wiki/PcAnywhere
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# This is completely untested!
+# See http://www.unixwiz.net/tools/pcascan.txt
+
+pcanywhere
+# I think this only matches queries and not the bulk of the traffic!
+^(nq|st)$
diff --git a/src/usr/local/share/protocols/pdf.pat b/src/usr/local/share/protocols/pdf.pat
new file mode 100644
index 0000000..0c0e5f9
--- /dev/null
+++ b/src/usr/local/share/protocols/pdf.pat
@@ -0,0 +1,11 @@
+# PDF - Portable Document Format - Postscript-like format by Adobe
+# Pattern attributes: good fast notsofast subset
+# Protocol groups: file
+#
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+# This pattern has been tested and is believe to work well.
+
+# Matches PDF versions 1.0 - 1.6 (not sure if 1.6 exists yet, but it probably
+# will.
+pdf
+%PDF-1\.[0123456]
diff --git a/src/usr/local/share/protocols/perl.pat b/src/usr/local/share/protocols/perl.pat
new file mode 100644
index 0000000..822986b
--- /dev/null
+++ b/src/usr/local/share/protocols/perl.pat
@@ -0,0 +1,7 @@
+# Perl - A scripting language by Larry Wall.
+# Pattern attributes: good fast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+perl
+\#! ?/(usr/(local/)?)?bin/perl
diff --git a/src/usr/local/share/protocols/png.pat b/src/usr/local/share/protocols/png.pat
new file mode 100644
index 0000000..33aafda
--- /dev/null
+++ b/src/usr/local/share/protocols/png.pat
@@ -0,0 +1,13 @@
+# PNG - Portable Network Graphics, a popular image format
+# Pattern attributes: good fast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+# Contributed by Radovan Josth. Tested at least a bit.
+
+png
+# drawn from /usr/share/magic
+\x89PNG\x0d\x0a\x1a\x0a
+
+# this is probably sufficient, but by default let's use the longer version
+# \x89PNG
diff --git a/src/usr/local/share/protocols/poco.pat b/src/usr/local/share/protocols/poco.pat
new file mode 100644
index 0000000..c7ce686
--- /dev/null
+++ b/src/usr/local/share/protocols/poco.pat
@@ -0,0 +1,12 @@
+# POCO and PP365 - Chinese P2P filesharing - http://pp365.com http://poco.cn
+# Pattern attributes: ok veryfast fast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/Poco
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# The author of this pattern says it works, but this is unconfirmed.
+# Written by www.routerclub.com wsgtrsys.
+
+poco
+^\x80\x94\x0a\x01....\x1f\x9e
+
diff --git a/src/usr/local/share/protocols/pop3.pat b/src/usr/local/share/protocols/pop3.pat
new file mode 100644
index 0000000..47a8252
--- /dev/null
+++ b/src/usr/local/share/protocols/pop3.pat
@@ -0,0 +1,50 @@
+# POP3 - Post Office Protocol version 3 (popular e-mail protocol) - RFC 1939
+# Pattern attributes: great fast fast
+# Protocol groups: mail ietf_internet_standard
+# Wiki: http://www.protocolinfo.org/wiki/POP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested somewhat.
+
+# this is a difficult protocol to match because of the relative lack of
+# distinguishing information. Read on.
+pop3
+
+# this the most conservative pattern. It should definitely work.
+#^(\+ok|-err)
+
+# this pattern assumes that the server says _something_ after +ok or -err
+# I think this is probably the way to go.
+^(\+ok |-err )
+
+# more that 90% of servers seem to say "pop" after "+ok", but not all.
+#^(\+ok .*pop)
+
+# Here's another tack. I think this is my second favorite.
+#^(\+ok [\x09-\x0d -~]*(ready|hello|pop|starting)|-err [\x09-\x0d -~]*(invalid|unknown|unimplemented|unrecognized|command))
+
+# this matches the server saying "you have N messages that are M bytes",
+# which the client probably asks for early in the session (not tested)
+#\+ok [0-9]+ [0-9]+
+
+# some sample servers:
+# RFC example: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
+# mail.dreamhost.com: +OK Hello there.
+# pop.carleton.edu: +OK POP3D(*) Server PMDFV6.2.2 at Fri, 12 Sep 2003 19:28:10 -0500 (CDT) (APOP disabled)
+# mail.earthlink.net: +OK NGPopper vEL_4_38 at earthlink.net ready <25509.1063412951@falcon>
+# *.email.umn.edu: +OK Cubic Circle's v1.22 1998/04/11 POP3 ready <7d1e0000da67623f@aquamarine.tc.umn.edu>
+# mail.yale.edu: +OK POP3 pantheon-po01 v2002.81 server ready
+# mail.gustavus.edu: +OK POP3 solen v2001.78 server ready
+# mail.reed.edu: +OK POP3 letra.reed.edu v2002.81 server ready
+# mail.bowdoin.edu: +OK mail.bowdoin.edu POP3 service (iPlanet Messaging Server 5.2 HotFix 1.15 (built Apr 28 2003))
+# pop.colby.edu: +OK Qpopper (version 4.0.5) at basalt starting.
+# mail.mac.com: +OK Netscape Messaging Multiplexor ready
+
+# various error strings:
+#-ERR Invalid command.
+#-ERR invalid command
+#-ERR unimplemented
+#-ERR Invalid command, try one of: USER name, PASS string, QUIT
+#-ERR Unknown AUTHORIZATION state command
+#-ERR Unrecognized command
+#-ERR Unknown command: "sadf'".
diff --git a/src/usr/local/share/protocols/postscript.pat b/src/usr/local/share/protocols/postscript.pat
new file mode 100644
index 0000000..456ac21
--- /dev/null
+++ b/src/usr/local/share/protocols/postscript.pat
@@ -0,0 +1,7 @@
+# Postscript - Printing Language
+# Pattern attributes: good fast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+postscript
+%!ps
diff --git a/src/usr/local/share/protocols/pplive.pat b/src/usr/local/share/protocols/pplive.pat
new file mode 100644
index 0000000..42fef72
--- /dev/null
+++ b/src/usr/local/share/protocols/pplive.pat
@@ -0,0 +1,11 @@
+# PPLive - Chinese P2P streaming video - http://pplive.com
+# Pattern attributes: ok notsofast notsofast
+# Protocol groups: p2p streaming_video proprietary
+# Wiki: http://www.protocolinfo.org/wiki/PPLive
+# Copyright (C) 2008 Matthew Strait; See ../LICENSE
+
+# By liangjun, who says that it works. It may be easily improvable with
+# a bit more testing.
+
+pplive
+\x01...\xd3.+\x0c.$
diff --git a/src/usr/local/share/protocols/pressplay.pat b/src/usr/local/share/protocols/pressplay.pat
new file mode 100644
index 0000000..cd814cc
--- /dev/null
+++ b/src/usr/local/share/protocols/pressplay.pat
@@ -0,0 +1,15 @@
+# pressplay - A legal music distribution site - http://pressplay.com
+# Pattern attributes: ok notsofast notsofast
+# Protocol groups: document_retrieval obsolete proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Pressplay
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern was "contributed" (taken with permission) by the bandwidth
+# arbitrator project (www.bandwidtharbitrator.com).
+#
+# This pattern is unconfirmed.
+
+pressplay
+# can we do better than this?
+user-agent: nsplayer
+
diff --git a/src/usr/local/share/protocols/qq.pat b/src/usr/local/share/protocols/qq.pat
new file mode 100644
index 0000000..08db802
--- /dev/null
+++ b/src/usr/local/share/protocols/qq.pat
@@ -0,0 +1,26 @@
+# Tencent QQ Protocol - Chinese instant messenger protocol - http://www.qq.com
+# Pattern attributes: good notsofast fast
+# Protocol groups: chat
+# Wiki: http://www.protocolinfo.org/wiki/QQ
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Over six million people use QQ in China, according to wsgtrsys.
+#
+# This pattern has been tested and is believed to work well.
+#
+# QQ uses three (two?) methods to connect to server(s?).
+# one is udp, and another is tcp
+# udp protocol: the first byte is 02 and last byte is 03
+# tcp protocol: the second byte is 02 and last byte is 03
+# tony on protocolinfo.org says that now the *third* byte is 02:
+# "but when I tested on my PC, I found that when qq2007/qq2008
+# use tcp protocol, the third byte instead of the second is always 02.
+#
+# So the QQ protocol changed again, or I have made a mistake, I wonder
+# that."
+# So now the pattern allows any of the first three bytes to be 02. Delete
+# one of the ".?" to restore to the old behaviour.
+# pattern written by www.routerclub.com wsgtrsys
+
+qq
+^.?.?\x02.+\x03$
diff --git a/src/usr/local/share/protocols/quake-halflife.pat b/src/usr/local/share/protocols/quake-halflife.pat
new file mode 100644
index 0000000..bc05b8f
--- /dev/null
+++ b/src/usr/local/share/protocols/quake-halflife.pat
@@ -0,0 +1,32 @@
+# Half Life 1 engine games (HL 1, Quake 2/3/World, Counterstrike 1.6, etc.)
+# Pattern attributes: good veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Half-Life http://www.protocolinfo.org/wiki/Counter-Strike http://www.protocolinfo.org/wiki/Day_of_Defeat
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Contributed by Laurens Blankers <laurens AT blankersfamily.com>, who says:
+#
+# This pattern has been tested with QuakeWorld (2.30), Quake 2 (3.20),
+# Quake 3 (1.32), and Half-life (1.1.1.0). But may also work on other
+# games based on the Quake engine.
+#
+# Clayton Macleod <cherrytwist A gmail.com> says:
+# [This should match] Counter-Strike v1.6, [...] the slightly updated
+# Counter-Strike: Condition Zero, and the game Day Of Defeat, Team
+# Fortress Classic, Deathmatch Classic, Ricochet, Half-Life [1] Deathmatch,
+# and I imagine all the other 3rd party mods that also use this engine
+# will match that pattern.
+#
+# Gavin Pryke <gavinlee303 at googlemail.com> says:
+# Added "getstatus". Quake3 games were not being matched here until it was
+# added.
+
+quake-halflife
+# All quake (like) protocols start with 4x 0xFF. Then the client either
+# issues getinfo, getchallenge or getstatus.
+^\xff\xff\xff\xffget(info|challenge|status)
+
+# A previous quake pattern allowed the connection to start with only 2 bytes
+# of 0xFF. This doesn't seem to ever happen, but we should keep an eye out
+# for it.
+
diff --git a/src/usr/local/share/protocols/quake1.pat b/src/usr/local/share/protocols/quake1.pat
new file mode 100644
index 0000000..46bdebd
--- /dev/null
+++ b/src/usr/local/share/protocols/quake1.pat
@@ -0,0 +1,19 @@
+# Quake 1 - A popular computer game.
+# Pattern attributes: marginal veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Quake
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is untested and unconfirmed.
+
+# Info taken from http://www.gamers.org/dEngine/quake/QDP/qnp.html,
+# which says that it "is incomplete, inaccurate and only applies to
+# versions 0.91, 0.92, 1.00 and 1.01 of QUAKE"
+
+quake1
+# Connection request: 80 00 00 0c 01 51 55 41 4b 45 00 03
+# \x80 = control packet.
+# \x0c = packet length
+# \x01 = CCREQ_CONNECT
+# \x03 = protocol version (3 == 0.91, 0.92, 1.00, 1.01)
+^\x80\x0c\x01quake\x03
diff --git a/src/usr/local/share/protocols/quicktime.pat b/src/usr/local/share/protocols/quicktime.pat
new file mode 100644
index 0000000..5a6273d
--- /dev/null
+++ b/src/usr/local/share/protocols/quicktime.pat
@@ -0,0 +1,21 @@
+# Quicktime HTTP
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: streaming_video streaming_audio ietf_draft_standard
+# Wiki: http://protocolinfo.org/wiki/HTTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested and is believed to work well.
+# (Quick Time v6.5.1 downloading from www.apple.com/trailers)
+#
+# To get or provide more information about this protocol and/or pattern:
+# http://www.protocolinfo.org/wiki/HTTP
+# http://lists.sourceforge.net/lists/listinfo/l7-filter-developers
+#
+# Since this is a subset of HTTP, it should be put earlier in the packet
+# filtering chain than HTTP. Also, please don't use this to block Quicktime.
+# If you must do that, you should use a filtering HTTP proxy, which is probably
+# more accurate.
+
+quicktime
+user-agent: quicktime \(qtver=[0-9].[0-9].[0-9];os=[\x09-\x0d -~]+\)\x0d\x0a
+
diff --git a/src/usr/local/share/protocols/radmin.pat b/src/usr/local/share/protocols/radmin.pat
new file mode 100644
index 0000000..d13aa65
--- /dev/null
+++ b/src/usr/local/share/protocols/radmin.pat
@@ -0,0 +1,17 @@
+# Famatech Remote Administrator - remote desktop for MS Windows
+# Pattern attributes: ok veryfast fast
+# Protocol groups: remote_access proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Radmin
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been verified with Radmin v1.1 and v3.0beta on Win2000/XP
+# It has only been tested between a single pair of computers.
+
+# The first packet of every TCP stream appears to be either one of:
+#
+# 01 00 00 00 01 00 00 00 08 08
+# 01 00 00 00 01 00 00 00 1b 1b
+
+radmin
+^\x01\x01(\x08\x08|\x1b\x1b)$
+
diff --git a/src/usr/local/share/protocols/rar.pat b/src/usr/local/share/protocols/rar.pat
new file mode 100644
index 0000000..1332af1
--- /dev/null
+++ b/src/usr/local/share/protocols/rar.pat
@@ -0,0 +1,7 @@
+# RAR - The WinRAR archive format
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+rar
+rar\x21\x1a\x07
diff --git a/src/usr/local/share/protocols/rdp.pat b/src/usr/local/share/protocols/rdp.pat
new file mode 100644
index 0000000..44b853f
--- /dev/null
+++ b/src/usr/local/share/protocols/rdp.pat
@@ -0,0 +1,20 @@
+# RDP - Remote Desktop Protocol (used in Windows Terminal Services)
+# Pattern attributes: ok notsofast notsofast
+# Protocol groups: remote_access proprietary
+# Wiki: http://www.protocolinfo.org/wiki/RDP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern was submitted by Michael Leong. It has been tested under the
+# following conditions: "WinXP Pro with all the patches, rdesktop server
+# running on port 7000 instead of 3389 --> WinXP Pro Remote Desktop Client."
+# Also tested is WinXP to Win 2000 Server.
+
+# At least one other person has reported it to work as well.
+
+rdp
+rdpdr.*cliprdr.*rdpsnd
+
+# Old pattern, submitted by Daniel Weatherford.
+# rdpdr.*cliprdp.*rdpsnd
+
+
diff --git a/src/usr/local/share/protocols/replaytv-ivs.pat b/src/usr/local/share/protocols/replaytv-ivs.pat
new file mode 100644
index 0000000..aaf9255
--- /dev/null
+++ b/src/usr/local/share/protocols/replaytv-ivs.pat
@@ -0,0 +1,11 @@
+# ReplayTV Internet Video Sharing - Digital Video Recorder - http://replaytv.com
+# Pattern attributes: good fast fast
+# Protocol groups:
+# Wiki: http://www.protocolinfo.org/wiki/ReplayTV
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Pattern by jm 409 at hot mail dot com, who says that this one "worked best".
+
+replaytv-ivs
+^(get /ivs-IVSGetFileChunk|http/(0\.9|1\.0|1\.1) [1-5][0-9][0-9] [\x09-\x0d -~]*\x23\x23\x23\x23\x23REPLAY_CHUNK_START\x23\x23\x23\x23\x23)
+
diff --git a/src/usr/local/share/protocols/rlogin.pat b/src/usr/local/share/protocols/rlogin.pat
new file mode 100644
index 0000000..42c4f7e
--- /dev/null
+++ b/src/usr/local/share/protocols/rlogin.pat
@@ -0,0 +1,19 @@
+# rlogin - remote login - RFC 1282
+# Pattern attributes: ok fast fast
+# Protocol groups: remote_access ietf_rfc_documented
+# Wiki: http://www.protocolinfo.org/wiki/Rlogin
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# usually runs on port 443
+#
+# This pattern is untested.
+
+rlogin
+# At least three characters (user name, user name, terminal type),
+# the first of which could be the first character of a user name, a
+# slash, then a terminal speed. (Assumes that usernames and terminal
+# types are alphanumeric only. I'm sure there are usernames like
+# "straitm-47" out there, but it's not common.) All terminal speeds
+# I know of end in two zeros and are between 3 and 6 digits long.
+# This pattern is uncomfortably general.
+^[a-z][a-z0-9][a-z0-9]+/[1-9][0-9]?[0-9]?[0-9]?00
diff --git a/src/usr/local/share/protocols/rpm.pat b/src/usr/local/share/protocols/rpm.pat
new file mode 100644
index 0000000..0302839
--- /dev/null
+++ b/src/usr/local/share/protocols/rpm.pat
@@ -0,0 +1,7 @@
+# RPM - Redhat Package Management packages
+# Pattern attributes: good fast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+rpm
+\xed\xab\xee\xdb.?.?.?.?[1-7]
diff --git a/src/usr/local/share/protocols/rtf.pat b/src/usr/local/share/protocols/rtf.pat
new file mode 100644
index 0000000..676cb1a
--- /dev/null
+++ b/src/usr/local/share/protocols/rtf.pat
@@ -0,0 +1,8 @@
+# RTF - Rich Text Format - an open document format
+# Pattern attributes: good fast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+rtf
+\{\\rtf[12]
+
diff --git a/src/usr/local/share/protocols/rtmp.pat b/src/usr/local/share/protocols/rtmp.pat
new file mode 100644
index 0000000..2c7adad
--- /dev/null
+++ b/src/usr/local/share/protocols/rtmp.pat
@@ -0,0 +1,13 @@
+# Adobe Real Time Messaging Protocol(RTMP). By Jonathan A.P. Marpaung
+# Pattern attributes: works very fast
+# Protocol Groups: streaming_video streaming_audio
+# The RTMP Specification is availabe at
+# http://www.adobe.com/devnet/rtmp/pdf/rtmp_specification_1.0.pdf [^]
+#
+# First 12 bytes, starting at \x03 are the RTMP header. Next 25 bytes,
+# starting at \x02, are part of the RTMP body which is an AMF Object.
+# The first string "connect" is a command of the NetConnection class object.
+# The next string "app" is a Command Object which is followed by values
+# such as "video", .
+rtmp
+^\x03.+\x14.+\x02.+\x07.(connect)?.+(app)?
diff --git a/src/usr/local/share/protocols/rtp.pat b/src/usr/local/share/protocols/rtp.pat
new file mode 100644
index 0000000..61fcd8e
--- /dev/null
+++ b/src/usr/local/share/protocols/rtp.pat
@@ -0,0 +1,33 @@
+# RTP - Real-time Transport Protocol - RFC 3550
+# Pattern attributes: ok overmatch undermatch fast fast
+# Protocol groups: streaming_video ietf_internet_standard
+# Wiki: http://www.protocolinfo.org/wiki/RTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# RTP headers are *very* short and compact. They have almost nothing in
+# them that can be matched by l7-filter. As RTP connections take place
+# between even numbered ports, you should probably check for that before
+# applying this pattern. If you want to match them along with their
+# associated SIP packets, you might try setting up some iptables rules
+# that watch for SIP packets and then also match any other UDP packets
+# that are going between the same two IP addresses.
+#
+# I think we can count on the first bit being 1 and the second bit being
+# 0 (meaning protocol version 2). The next two bits could go either way,
+# but in the example I've seen, they are zero, so I'll assume they are
+# usually zero. The next four bits are a count of "contributing source
+# identifiers". I'm not sure how big that could be, but in the example
+# I've seen, they're zero, so I'll assume they're usually zero. So that
+# gives us ^\x80. The next bit is a tossup. Next is the payload type, 7
+# bits. I've taken likely values from the WireShark code: 0-34, 96-127
+# (decimal). The rest of the header is random numbers (sequence number,
+# timestamp, synchronization source identifier), so that's no help at
+# all.
+
+rtp
+^\x80[\x01-"`-\x7f\x80-\xa2\xe0-\xff]?..........*\x80
+
+# Might also try this. It's a bit slower (one packet and not too much extra
+# regexec load) and a bit more accurate:
+#^\x80[\x01-"`-\x7f\x80-\xa2\xe0-\xff]?..........*\x80.*\x80
+
diff --git a/src/usr/local/share/protocols/rtsp.pat b/src/usr/local/share/protocols/rtsp.pat
new file mode 100644
index 0000000..1013ae3
--- /dev/null
+++ b/src/usr/local/share/protocols/rtsp.pat
@@ -0,0 +1,15 @@
+# RTSP - Real Time Streaming Protocol - http://www.rtsp.org - RFC 2326
+# Pattern attributes: good notsofast notsofast
+# Protocol groups: streaming_video ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/RTSP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# usually runs on port 554
+#
+# To take full advantage of this pattern, please see the RTSP connection
+# tracking patch to the Linux kernel referenced at the above site.
+#
+# This pattern has been tested and is believed to work well.
+
+rtsp
+rtsp/1.0 200 ok
diff --git a/src/usr/local/share/protocols/runesofmagic.pat b/src/usr/local/share/protocols/runesofmagic.pat
new file mode 100644
index 0000000..6fbfea4
--- /dev/null
+++ b/src/usr/local/share/protocols/runesofmagic.pat
@@ -0,0 +1,63 @@
+# Runes of Magic - game - http://www.runesofmagic.com
+# Pattern attributes: ok veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Runes_of_Magic
+# Copyright (C) 2008 Matthew Strait; See ../LICENSE
+
+runesofmagic
+^\x10\x03...........\x0a\x02.....\x0e
+# See below (this is also veryfast fast)
+#^\x10\x03...........?\x0a\x02.....?$
+
+# Greatwolf captured the following:
+#
+# Server:
+#
+# 10 00 00 00 03 78 76 7a 1e 8a dd b5 95 a3 3a de .....xvz ......:.
+# 0a 00 00 00 02 df 85 cc cc cc ........ ..
+#
+# Client reply:
+#
+# 0e 00 00 00 02 28 82 cc cc cc 8b c9 cc cc .....(.. ......
+#
+# Server:
+#
+# 2e 00 00 00 02 1e 7f f4 f4 f4 ef f4 f4 f4 b3 8c ........ ........
+# [...]
+#
+# And says: "Bytes 10 00 00 00 03, 0a 00 00 00 02 and 0e (client reply)
+# were consistently present.
+#
+# ^\x10\x03...........\x0a\x02.....\x0e
+#
+# Pattern was able to match during the closed beta period. It is still
+# matching okay after RoM started open beta but could definitely use
+# more testing from others to verify effectiveness."
+#
+# Matthew Strait says:
+#
+# * If the server consistently sends those four bytes in the first packet,
+# it is probably wasteful to wait for the next (client) packet before
+# matching.
+#
+# * If we switch the match strategy to just looking at the first packet, and
+# the first packet is always the same (or nearly the same) length, we can
+# anchor (i.e. use a '$') at the end of the packet.
+#
+# * When there's a string of bytes that I don't understand and that take
+# different values from connection to connection, I think it's good to allow
+# for the possibility that at least one might be \x00, and so I'd make one
+# of the "." into ".?", unless you *know* that \x00 is impossible somehow.
+#
+# * All of those \xcc bytes don't look random to me. Your comments suggest
+# that it isn't always exactly like that, but is there always pattern of
+# repeated bytes or something else that might be useful? It probably isn't
+# necessary to exploit this, since it looks like there's already enough to
+# go with, but it would be nice to understand.
+#
+# So perhaps it would be an improvement to use:
+#
+# ^\x10\x03...........?\x0a\x02.....?$
+#
+# but this depends on the assumptions I made above.
+
diff --git a/src/usr/local/share/protocols/shoutcast.pat b/src/usr/local/share/protocols/shoutcast.pat
new file mode 100644
index 0000000..e78883c
--- /dev/null
+++ b/src/usr/local/share/protocols/shoutcast.pat
@@ -0,0 +1,27 @@
+# Shoutcast and Icecast - streaming audio
+# Pattern attributes: good slow notsofast
+# Protocol groups: streaming_audio
+# Wiki: http://www.protocolinfo.org/wiki/Icecast
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# usually runs on port 80
+#
+# Original pattern contributed by Deepak Seshadri <dseshadri AT
+# broadbandmaritime.com> who says "The difference between [Shoutcast and
+# Icecast] is not clearly mentioned anywhere. According to this
+# document, my pattern would filter JUST shoutcast packets."
+#
+# Should now match both Shoutcast and Icecast. Tested with Winamp (in
+# 2005) and Totem using streams at dir.xiph.org (in Nov 2007).
+#
+# http://sander.vanzoest.com/talks/2002/audio_and_apache/
+# http://forums.radiotoolbox.com/viewtopic.php?t=74
+# http://www.icecast.org
+
+shoutcast
+# The first branch looks for an HTTP request that looks like it is asking for
+# a SHOUTcast stream. The second branch looks for the server's reply. However,
+# some (newer?) servers answer with "http/1.0 200 OK", not "ICY 200 OK", so
+# this will not work.
+# This pattern was discovered using Ethereal.
+^get /.*icy-metadata:1|icy [1-5][0-9][0-9] [\x09-\x0d -~]*(content-type:audio|icy-)
diff --git a/src/usr/local/share/protocols/sip.pat b/src/usr/local/share/protocols/sip.pat
new file mode 100644
index 0000000..2728009
--- /dev/null
+++ b/src/usr/local/share/protocols/sip.pat
@@ -0,0 +1,20 @@
+# SIP - Session Initiation Protocol - Internet telephony - RFC 3261, 3265, etc.
+# Pattern attributes: good fast fast
+# Protocol groups: voip ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/SIP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested with the Ubiquity SIP user agent and has been
+# confirmed by at least one other user.
+#
+# Thanks to Ankit Desai for this pattern. Updated by tehseen sagar.
+#
+# SIP typically uses port 5060.
+#
+# This pattern is based on SIP request format as per RFC 3261. I'm not
+# sure about the version part. The RFC doesn't say anything about it, so
+# I have allowed version ranging from 0.x to 2.x.
+
+#Request-Line = Method SP Request-URI SP SIP-Version CRLF
+sip
+^(invite|register|cancel|message|subscribe|notify) sip[\x09-\x0d -~]*sip/[0-2]\.[0-9]
diff --git a/src/usr/local/share/protocols/skypeout.pat b/src/usr/local/share/protocols/skypeout.pat
new file mode 100644
index 0000000..55e4e10
--- /dev/null
+++ b/src/usr/local/share/protocols/skypeout.pat
@@ -0,0 +1,50 @@
+# Skype to phone - UDP voice call (program to POTS phone) - http://skype.com
+# Pattern attributes: ok slow notsofast overmatch
+# Protocol groups: voip p2p proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Skype
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# Thanks to Myles Uyema, mylesuyema AT gmail.com
+
+# Taken using Ethereal traces of Windows Skype v1.2.037, same in v1.2.0.18_API
+#
+# Skype will attempt to use the same UDP port for all its connections as
+# configured in its options. However, this is a random port by default.
+# Skype has some preference for ports 80 and 443.
+#
+# Example sessions:
+#
+#SkypeOut <USA phone number>
+#c6 5c bf 41 8e 8d d6 d2 08 <-- this is sometimes as short as 1 byte and
+#c6 5c bf 41 8e 8d d6 d2 08 <-- sometimes as long as 9 (or more?)
+#00 6b 2c f5 87 f1 06
+#00 6b 2c f5 87 f1 06
+#00 6b 2c f5 36 ea 85
+#00 6b 2c f5 36 ea 85
+#00 6b 2c f5 57 27 d4
+#00 6b 2c f5 57 27 d4
+#00 6b 2c f5 43 5b 00
+#00 6b 2c f5 43 5b 00
+#
+#SkypeOut <USA phone number>
+#7e 4f e5 b8
+#7e 4f e5 b8
+#00 6b 88 61 80 52 93
+#00 6b 88 61 80 52 93
+#00 6b 88 61 1a 09 e9
+#00 6b 88 61 1a 09 e9
+#00 6b 88 61 47 43 c4
+#00 6b 88 61 47 43 c4
+
+skypeout
+
+# Scary. Our regular expressions suck. This is a prime candidate for
+# some sort of a scheme to support two different regular expressions
+# when there's a major difference between what the two libraries allow.
+# For the Henry Spencer library, there's not much that can be done
+# except requiring that we see the same byte twice.
+
+# This matches about %4 of random streams and 13% of printable random streams
+
+# This is slow, but not as bad as you might think.
+^(\x01.?.?.?.?.?.?.?.?\x01|\x02.?.?.?.?.?.?.?.?\x02|\x03.?.?.?.?.?.?.?.?\x03|\x04.?.?.?.?.?.?.?.?\x04|\x05.?.?.?.?.?.?.?.?\x05|\x06.?.?.?.?.?.?.?.?\x06|\x07.?.?.?.?.?.?.?.?\x07|\x08.?.?.?.?.?.?.?.?\x08|\x09.?.?.?.?.?.?.?.?\x09|\x0a.?.?.?.?.?.?.?.?\x0a|\x0b.?.?.?.?.?.?.?.?\x0b|\x0c.?.?.?.?.?.?.?.?\x0c|\x0d.?.?.?.?.?.?.?.?\x0d|\x0e.?.?.?.?.?.?.?.?\x0e|\x0f.?.?.?.?.?.?.?.?\x0f|\x10.?.?.?.?.?.?.?.?\x10|\x11.?.?.?.?.?.?.?.?\x11|\x12.?.?.?.?.?.?.?.?\x12|\x13.?.?.?.?.?.?.?.?\x13|\x14.?.?.?.?.?.?.?.?\x14|\x15.?.?.?.?.?.?.?.?\x15|\x16.?.?.?.?.?.?.?.?\x16|\x17.?.?.?.?.?.?.?.?\x17|\x18.?.?.?.?.?.?.?.?\x18|\x19.?.?.?.?.?.?.?.?\x19|\x1a.?.?.?.?.?.?.?.?\x1a|\x1b.?.?.?.?.?.?.?.?\x1b|\x1c.?.?.?.?.?.?.?.?\x1c|\x1d.?.?.?.?.?.?.?.?\x1d|\x1e.?.?.?.?.?.?.?.?\x1e|\x1f.?.?.?.?.?.?.?.?\x1f|\x20.?.?.?.?.?.?.?.?\x20|\x21.?.?.?.?.?.?.?.?\x21|\x22.?.?.?.?.?.?.?.?\x22|\x23.?.?.?.?.?.?.?.?\x23|\$.?.?.?.?.?.?.?.?\$|\x25.?.?.?.?.?.?.?.?\x25|\x26.?.?.?.?.?.?.?.?\x26|\x27.?.?.?.?.?.?.?.?\x27|\(.?.?.?.?.?.?.?.?\(|\).?.?.?.?.?.?.?.?\)|\*.?.?.?.?.?.?.?.?\*|\+.?.?.?.?.?.?.?.?\+|\x2c.?.?.?.?.?.?.?.?\x2c|\x2d.?.?.?.?.?.?.?.?\x2d|\..?.?.?.?.?.?.?.?\.|\x2f.?.?.?.?.?.?.?.?\x2f|\x30.?.?.?.?.?.?.?.?\x30|\x31.?.?.?.?.?.?.?.?\x31|\x32.?.?.?.?.?.?.?.?\x32|\x33.?.?.?.?.?.?.?.?\x33|\x34.?.?.?.?.?.?.?.?\x34|\x35.?.?.?.?.?.?.?.?\x35|\x36.?.?.?.?.?.?.?.?\x36|\x37.?.?.?.?.?.?.?.?\x37|\x38.?.?.?.?.?.?.?.?\x38|\x39.?.?.?.?.?.?.?.?\x39|\x3a.?.?.?.?.?.?.?.?\x3a|\x3b.?.?.?.?.?.?.?.?\x3b|\x3c.?.?.?.?.?.?.?.?\x3c|\x3d.?.?.?.?.?.?.?.?\x3d|\x3e.?.?.?.?.?.?.?.?\x3e|\?.?.?.?.?.?.?.?.?\?|\x40.?.?.?.?.?.?.?.?\x40|\x41.?.?.?.?.?.?.?.?\x41|\x42.?.?.?.?.?.?.?.?\x42|\x43.?.?.?.?.?.?.?.?\x43|\x44.?.?.?.?.?.?.?.?\x44|\x45.?.?.?.?.?.?.?.?\x45|\x46.?.?.?.?.?.?.?.?\x46|\x47.?.?.?.?.?.?.?.?\x47|\x48.?.?.?.?.?.?.?.?\x48|\x49.?.?.?.?.?.?.?.?\x49|\x4a.?.?.?.?.?.?.?.?\x4a|\x4b.?.?.?.?.?.?.?.?\x4b|\x4c.?.?.?.?.?.?.?.?\x4c|\x4d.?.?.?.?.?.?.?.?\x4d|\x4e.?.?.?.?.?.?.?.?\x4e|\x4f.?.?.?.?.?.?.?.?\x4f|\x50.?.?.?.?.?.?.?.?\x50|\x51.?.?.?.?.?.?.?.?\x51|\x52.?.?.?.?.?.?.?.?\x52|\x53.?.?.?.?.?.?.?.?\x53|\x54.?.?.?.?.?.?.?.?\x54|\x55.?.?.?.?.?.?.?.?\x55|\x56.?.?.?.?.?.?.?.?\x56|\x57.?.?.?.?.?.?.?.?\x57|\x58.?.?.?.?.?.?.?.?\x58|\x59.?.?.?.?.?.?.?.?\x59|\x5a.?.?.?.?.?.?.?.?\x5a|\[.?.?.?.?.?.?.?.?\[|\\.?.?.?.?.?.?.?.?\\|\].?.?.?.?.?.?.?.?\]|\^.?.?.?.?.?.?.?.?\^|\x5f.?.?.?.?.?.?.?.?\x5f|\x60.?.?.?.?.?.?.?.?\x60|\x61.?.?.?.?.?.?.?.?\x61|\x62.?.?.?.?.?.?.?.?\x62|\x63.?.?.?.?.?.?.?.?\x63|\x64.?.?.?.?.?.?.?.?\x64|\x65.?.?.?.?.?.?.?.?\x65|\x66.?.?.?.?.?.?.?.?\x66|\x67.?.?.?.?.?.?.?.?\x67|\x68.?.?.?.?.?.?.?.?\x68|\x69.?.?.?.?.?.?.?.?\x69|\x6a.?.?.?.?.?.?.?.?\x6a|\x6b.?.?.?.?.?.?.?.?\x6b|\x6c.?.?.?.?.?.?.?.?\x6c|\x6d.?.?.?.?.?.?.?.?\x6d|\x6e.?.?.?.?.?.?.?.?\x6e|\x6f.?.?.?.?.?.?.?.?\x6f|\x70.?.?.?.?.?.?.?.?\x70|\x71.?.?.?.?.?.?.?.?\x71|\x72.?.?.?.?.?.?.?.?\x72|\x73.?.?.?.?.?.?.?.?\x73|\x74.?.?.?.?.?.?.?.?\x74|\x75.?.?.?.?.?.?.?.?\x75|\x76.?.?.?.?.?.?.?.?\x76|\x77.?.?.?.?.?.?.?.?\x77|\x78.?.?.?.?.?.?.?.?\x78|\x79.?.?.?.?.?.?.?.?\x79|\x7a.?.?.?.?.?.?.?.?\x7a|\{.?.?.?.?.?.?.?.?\{|\|.?.?.?.?.?.?.?.?\||\}.?.?.?.?.?.?.?.?\}|\x7e.?.?.?.?.?.?.?.?\x7e|\x7f.?.?.?.?.?.?.?.?\x7f|\x80.?.?.?.?.?.?.?.?\x80|\x81.?.?.?.?.?.?.?.?\x81|\x82.?.?.?.?.?.?.?.?\x82|\x83.?.?.?.?.?.?.?.?\x83|\x84.?.?.?.?.?.?.?.?\x84|\x85.?.?.?.?.?.?.?.?\x85|\x86.?.?.?.?.?.?.?.?\x86|\x87.?.?.?.?.?.?.?.?\x87|\x88.?.?.?.?.?.?.?.?\x88|\x89.?.?.?.?.?.?.?.?\x89|\x8a.?.?.?.?.?.?.?.?\x8a|\x8b.?.?.?.?.?.?.?.?\x8b|\x8c.?.?.?.?.?.?.?.?\x8c|\x8d.?.?.?.?.?.?.?.?\x8d|\x8e.?.?.?.?.?.?.?.?\x8e|\x8f.?.?.?.?.?.?.?.?\x8f|\x90.?.?.?.?.?.?.?.?\x90|\x91.?.?.?.?.?.?.?.?\x91|\x92.?.?.?.?.?.?.?.?\x92|\x93.?.?.?.?.?.?.?.?\x93|\x94.?.?.?.?.?.?.?.?\x94|\x95.?.?.?.?.?.?.?.?\x95|\x96.?.?.?.?.?.?.?.?\x96|\x97.?.?.?.?.?.?.?.?\x97|\x98.?.?.?.?.?.?.?.?\x98|\x99.?.?.?.?.?.?.?.?\x99|\x9a.?.?.?.?.?.?.?.?\x9a|\x9b.?.?.?.?.?.?.?.?\x9b|\x9c.?.?.?.?.?.?.?.?\x9c|\x9d.?.?.?.?.?.?.?.?\x9d|\x9e.?.?.?.?.?.?.?.?\x9e|\x9f.?.?.?.?.?.?.?.?\x9f|\xa0.?.?.?.?.?.?.?.?\xa0|\xa1.?.?.?.?.?.?.?.?\xa1|\xa2.?.?.?.?.?.?.?.?\xa2|\xa3.?.?.?.?.?.?.?.?\xa3|\xa4.?.?.?.?.?.?.?.?\xa4|\xa5.?.?.?.?.?.?.?.?\xa5|\xa6.?.?.?.?.?.?.?.?\xa6|\xa7.?.?.?.?.?.?.?.?\xa7|\xa8.?.?.?.?.?.?.?.?\xa8|\xa9.?.?.?.?.?.?.?.?\xa9|\xaa.?.?.?.?.?.?.?.?\xaa|\xab.?.?.?.?.?.?.?.?\xab|\xac.?.?.?.?.?.?.?.?\xac|\xad.?.?.?.?.?.?.?.?\xad|\xae.?.?.?.?.?.?.?.?\xae|\xaf.?.?.?.?.?.?.?.?\xaf|\xb0.?.?.?.?.?.?.?.?\xb0|\xb1.?.?.?.?.?.?.?.?\xb1|\xb2.?.?.?.?.?.?.?.?\xb2|\xb3.?.?.?.?.?.?.?.?\xb3|\xb4.?.?.?.?.?.?.?.?\xb4|\xb5.?.?.?.?.?.?.?.?\xb5|\xb6.?.?.?.?.?.?.?.?\xb6|\xb7.?.?.?.?.?.?.?.?\xb7|\xb8.?.?.?.?.?.?.?.?\xb8|\xb9.?.?.?.?.?.?.?.?\xb9|\xba.?.?.?.?.?.?.?.?\xba|\xbb.?.?.?.?.?.?.?.?\xbb|\xbc.?.?.?.?.?.?.?.?\xbc|\xbd.?.?.?.?.?.?.?.?\xbd|\xbe.?.?.?.?.?.?.?.?\xbe|\xbf.?.?.?.?.?.?.?.?\xbf|\xc0.?.?.?.?.?.?.?.?\xc0|\xc1.?.?.?.?.?.?.?.?\xc1|\xc2.?.?.?.?.?.?.?.?\xc2|\xc3.?.?.?.?.?.?.?.?\xc3|\xc4.?.?.?.?.?.?.?.?\xc4|\xc5.?.?.?.?.?.?.?.?\xc5|\xc6.?.?.?.?.?.?.?.?\xc6|\xc7.?.?.?.?.?.?.?.?\xc7|\xc8.?.?.?.?.?.?.?.?\xc8|\xc9.?.?.?.?.?.?.?.?\xc9|\xca.?.?.?.?.?.?.?.?\xca|\xcb.?.?.?.?.?.?.?.?\xcb|\xcc.?.?.?.?.?.?.?.?\xcc|\xcd.?.?.?.?.?.?.?.?\xcd|\xce.?.?.?.?.?.?.?.?\xce|\xcf.?.?.?.?.?.?.?.?\xcf|\xd0.?.?.?.?.?.?.?.?\xd0|\xd1.?.?.?.?.?.?.?.?\xd1|\xd2.?.?.?.?.?.?.?.?\xd2|\xd3.?.?.?.?.?.?.?.?\xd3|\xd4.?.?.?.?.?.?.?.?\xd4|\xd5.?.?.?.?.?.?.?.?\xd5|\xd6.?.?.?.?.?.?.?.?\xd6|\xd7.?.?.?.?.?.?.?.?\xd7|\xd8.?.?.?.?.?.?.?.?\xd8|\xd9.?.?.?.?.?.?.?.?\xd9|\xda.?.?.?.?.?.?.?.?\xda|\xdb.?.?.?.?.?.?.?.?\xdb|\xdc.?.?.?.?.?.?.?.?\xdc|\xdd.?.?.?.?.?.?.?.?\xdd|\xde.?.?.?.?.?.?.?.?\xde|\xdf.?.?.?.?.?.?.?.?\xdf|\xe0.?.?.?.?.?.?.?.?\xe0|\xe1.?.?.?.?.?.?.?.?\xe1|\xe2.?.?.?.?.?.?.?.?\xe2|\xe3.?.?.?.?.?.?.?.?\xe3|\xe4.?.?.?.?.?.?.?.?\xe4|\xe5.?.?.?.?.?.?.?.?\xe5|\xe6.?.?.?.?.?.?.?.?\xe6|\xe7.?.?.?.?.?.?.?.?\xe7|\xe8.?.?.?.?.?.?.?.?\xe8|\xe9.?.?.?.?.?.?.?.?\xe9|\xea.?.?.?.?.?.?.?.?\xea|\xeb.?.?.?.?.?.?.?.?\xeb|\xec.?.?.?.?.?.?.?.?\xec|\xed.?.?.?.?.?.?.?.?\xed|\xee.?.?.?.?.?.?.?.?\xee|\xef.?.?.?.?.?.?.?.?\xef|\xf0.?.?.?.?.?.?.?.?\xf0|\xf1.?.?.?.?.?.?.?.?\xf1|\xf2.?.?.?.?.?.?.?.?\xf2|\xf3.?.?.?.?.?.?.?.?\xf3|\xf4.?.?.?.?.?.?.?.?\xf4|\xf5.?.?.?.?.?.?.?.?\xf5|\xf6.?.?.?.?.?.?.?.?\xf6|\xf7.?.?.?.?.?.?.?.?\xf7|\xf8.?.?.?.?.?.?.?.?\xf8|\xf9.?.?.?.?.?.?.?.?\xf9|\xfa.?.?.?.?.?.?.?.?\xfa|\xfb.?.?.?.?.?.?.?.?\xfb|\xfc.?.?.?.?.?.?.?.?\xfc|\xfd.?.?.?.?.?.?.?.?\xfd|\xfe.?.?.?.?.?.?.?.?\xfe|\xff.?.?.?.?.?.?.?.?\xff)
diff --git a/src/usr/local/share/protocols/skypetoskype.pat b/src/usr/local/share/protocols/skypetoskype.pat
new file mode 100644
index 0000000..ed1103a
--- /dev/null
+++ b/src/usr/local/share/protocols/skypetoskype.pat
@@ -0,0 +1,14 @@
+# Skype to Skype - UDP voice call (program to program) - http://skype.com
+# Pattern attributes: ok veryfast fast overmatch
+# Protocol groups: voip p2p proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Skype
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# This matches at least some of the general chatter that occurs when the
+# user isn't doing anything as well as actual calls.
+# Thanks to Myles Uyema, mylesuyema AT gmail.com
+
+skypetoskype
+# require at least 16 bytes (my limited tests always get at least 18)
+^..\x02.............
+
diff --git a/src/usr/local/share/protocols/smb.pat b/src/usr/local/share/protocols/smb.pat
new file mode 100644
index 0000000..c1f8b0a
--- /dev/null
+++ b/src/usr/local/share/protocols/smb.pat
@@ -0,0 +1,19 @@
+# Samba/SMB - Server Message Block - Microsoft Windows filesharing
+# Pattern attributes: good fast notsofast
+# Protocol groups: document_retrieval networking proprietary
+# Wiki: http://www.protocolinfo.org/wiki/SMB
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# "This protocol is sometimes also referred to as the Common Internet File
+# System (CIFS), LanManager or NetBIOS protocol." -- "man samba"
+#
+# Actually, SMB is a higher level protocol than NetBIOS. However, the
+# NetBIOS header is only 4 bytes: not much to match on.
+#
+# http://www.ubiqx.org/cifs/SMB.html
+#
+# This pattern is lightly tested.
+
+smb
+# matches a NEGOTIATE PROTOCOL or TRANSACTION REQUEST command
+\xffsmb[\x72\x25]
diff --git a/src/usr/local/share/protocols/smtp.pat b/src/usr/local/share/protocols/smtp.pat
new file mode 100644
index 0000000..2f5d195
--- /dev/null
+++ b/src/usr/local/share/protocols/smtp.pat
@@ -0,0 +1,40 @@
+# SMTP - Simple Mail Transfer Protocol - RFC 2821 (See also RFC 1869)
+# Pattern attributes: great notsofast fast
+# Protocol groups: mail ietf_internet_standard
+# Wiki: http://www.protocolinfo.org/wiki/SMTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# usually runs on port 25
+#
+# This pattern has been tested and is believed to work well.
+
+# As usual, no text is required after "220", but all known servers have some
+# there. It (almost?) always has string "smtp" in it. The RFC examples
+# does not, so we match those too, just in case anyone has copied them
+# literally.
+#
+# Some examples:
+# 220 mail.stalker.com ESMTP CommuniGate Pro 4.1.3
+# 220 mail.vieodata.com ESMTP Merak 6.1.0; Mon, 15 Sep 2003 13:48:11 -0400
+# 220 mail.ut.caldera.com ESMTP
+# 220 persephone.pmail.gen.nz ESMTP server ready.
+# 220 smtp1.superb.net ESMTP
+# 220 mail.kerio.com Kerio MailServer 5.6.7 ESMTP ready
+# 220-mail.deerfield.com ESMTP VisNetic.MailServer.v6.0.9.0; Mon, 15 Sep 2003 13:4
+# 220 altn.com ESMTP MDaemon 6.8.5; Mon, 15 Sep 2003 12:46:42 -0500
+# 220 X1 NT-ESMTP Server ipsmin0165atl2.interland.net (IMail 6.06 73062-3)
+# 220 mail.icewarp.com ESMTP Merak 6.1.1; Mon, 15 Sep 2003 19:43:23 +0200
+# 220-mail.email-scan.com ESMTP
+# 220 smaug.dreamhost.com ESMTP
+# 220 kona.carleton.edu -- Server ESMTP (PMDF V6.2#30648)
+# 220 letra.reed.edu ESMTP Sendmail 8.12.9/8.12.9; Mon, 15 Sep 2003 10:35:57 -0700 (PDT)
+# 220-swan.mail.pas.earthlink.net ESMTP Exim 3.33 #1 Mon, 15 Sep 2003 10:32:15 -0700
+#
+# RFC examples:
+# 220 xyz.com Simple Mail Transfer Service Ready (RFC example)
+# 220 dbc.mtview.ca.us SMTP service ready
+
+smtp
+^220[\x09-\x0d -~]* (e?smtp|simple mail)
+userspace pattern=^220[\x09-\x0d -~]* (E?SMTP|[Ss]imple [Mm]ail)
+userspace flags=REG_NOSUB REG_EXTENDED
diff --git a/src/usr/local/share/protocols/snmp-mon.pat b/src/usr/local/share/protocols/snmp-mon.pat
new file mode 100644
index 0000000..fe22662
--- /dev/null
+++ b/src/usr/local/share/protocols/snmp-mon.pat
@@ -0,0 +1,32 @@
+# SNMP Monitoring - Simple Network Management Protocol (RFC1157)
+# Pattern attributes: good veryfast fast subset
+# Protocol groups: networking ietf_internet_standard
+# Wiki: http://en.wikipedia.org/wiki/SNMP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on UDP ports 161
+#
+# These filters match SNMPv1 packets without fail, and are made
+# as specific as possible not to match any ASN.1 encoded protocols.
+# However these could still be matched by other protocols that
+# use ASN.1 encoding
+
+# Contributed by Goli SriSairam <goli_sai AT yahoo.com>
+
+# This pattern has been tested and is believe to work well.
+#
+# To get or provide more information about this protocol and/or pattern:
+# http://www.protocolinfo.org/wiki/SNMP
+# http://lists.sourceforge.net/lists/listinfo/l7-filter-developers
+
+# SNMPv1 GET/GETNEXT/SET request and response
+# matches SNMP header
+# version \x02\x01
+# community \x04.+
+# PDU type [\xa0-\xa3] (GET/GETNEXT/SET/GETRESPONSE)
+# RequestId \x02[\x01-\x04].?.?.?.?
+# errorStatus \x02\x01.?
+# errorIndex \x02\x01.?
+# varbinds start \x30
+snmp-mon
+^\x02\x01\x04.+[\xa0-\xa3]\x02[\x01-\x04].?.?.?.?\x02\x01.?\x02\x01.?\x30
diff --git a/src/usr/local/share/protocols/snmp-trap.pat b/src/usr/local/share/protocols/snmp-trap.pat
new file mode 100644
index 0000000..e8ba19a
--- /dev/null
+++ b/src/usr/local/share/protocols/snmp-trap.pat
@@ -0,0 +1,33 @@
+# SNMP Traps - Simple Network Management Protocol (RFC1157)
+# Pattern attributes: good veryfast fast subset
+# Protocol groups: networking ietf_internet_standard
+# Wiki: http://en.wikipedia.org/wiki/SNMP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on UDP ports 162
+#
+# These filters match SNMPv1 packets without fail, and are made
+# as specific as possible not to match any ASN.1 encoded protocols.
+# However these could still be matched by other protocols that
+# use ASN.1 encoding
+
+# Contributed by Goli SriSairam <goli_sai AT yahoo.com>
+
+# This pattern has been tested and is believe to work well.
+#
+# To get or provide more information about this protocol and/or pattern:
+# http://www.protocolinfo.org/wiki/SNMP
+# http://lists.sourceforge.net/lists/listinfo/l7-filter-developers
+
+# SNMPv1 Trap
+# matches SNMP trap header
+# version \x02\x01
+# community string \x04.+
+# PDU type \xa4 (TRAP)
+# enterprise \x06.+
+# agent address \x40\x04\.?.?.?.?
+# trap type \x02\x01.?
+# specific trap type \x02\x01.?
+# timestamp \x43
+snmp-trap
+^\x02\x01\x04.+\xa4\x06.+\x40\x04.?.?.?.?\x02\x01.?\x02\x01.?\x43
diff --git a/src/usr/local/share/protocols/snmp.pat b/src/usr/local/share/protocols/snmp.pat
new file mode 100644
index 0000000..a7186b2
--- /dev/null
+++ b/src/usr/local/share/protocols/snmp.pat
@@ -0,0 +1,19 @@
+# SNMP - Simple Network Management Protocol - RFC 1157
+# Pattern attributes: good veryfast fast superset
+# Protocol groups: networking ietf_internet_standard
+# Wiki: http://www.protocolinfo.org/wiki/SNMP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on UDP ports 161 (monitoring) and 162 (traps).
+#
+# These filters match SNMPv1 packets without fail, and are made as
+# specific as possible not to match any ASN.1 encoded protocols. However
+# these could still be matched by other protocols that use ASN.1 encoding
+
+# Contributed by Goli SriSairam <goli_sai AT yahoo.com>
+
+# This pattern has been tested and is believed to work well.
+
+# All SNMPv1 traffic. See snmp-mon.pat and snmp-trap.pat for details.
+snmp
+^\x02\x01\x04.+([\xa0-\xa3]\x02[\x01-\x04].?.?.?.?\x02\x01.?\x02\x01.?\x30|\xa4\x06.+\x40\x04.?.?.?.?\x02\x01.?\x02\x01.?\x43)
diff --git a/src/usr/local/share/protocols/socks.pat b/src/usr/local/share/protocols/socks.pat
new file mode 100644
index 0000000..54189fd
--- /dev/null
+++ b/src/usr/local/share/protocols/socks.pat
@@ -0,0 +1,32 @@
+# SOCKS Version 5 - Firewall traversal protocol - RFC 1928
+# Pattern attributes: good notsofast notsofast
+# Protocol groups: networking ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/SOCKS
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 1080
+# Also useful: http://www.iana.org/assignments/socks-methods
+#
+# We have had two reports that this pattern works.
+
+# method request, no private methods \x05[\x01-\x08]*
+# method reply, assumes sucess \x05[\x01-\x08]?
+# method dependent sub-negotiation .*
+# request, ipv4 only \x05[\x01-\x03][\x01\x03].*
+# reply \x05[\x01-\x08]?[\x01\x03].*
+
+# username/password method
+# u/p request, assuming reasonable usernames and passwords
+# \x05[\x02-\x10][a-z][a-z0-9\-]*[\x05-\x20][!-~]*
+# server reply
+# \x05
+
+# GSSAPI method
+# client initial token \x01\x01\x02.*
+# server reply \x01\x01\x02.*
+
+# any other method .* (all methods boil down to this until we have information
+# about all the commonly used ones)
+
+socks
+\x05[\x01-\x08]*\x05[\x01-\x08]?.*\x05[\x01-\x03][\x01\x03].*\x05[\x01-\x08]?[\x01\x03]
diff --git a/src/usr/local/share/protocols/soribada.pat b/src/usr/local/share/protocols/soribada.pat
new file mode 100644
index 0000000..e1c0c56
--- /dev/null
+++ b/src/usr/local/share/protocols/soribada.pat
@@ -0,0 +1,51 @@
+# Soribada - A Korean P2P filesharing program/protocol - http://www.soribada.com
+# Pattern attributes: good slow notsofast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/Soribada
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# I am told that there are three versions of this protocol, the first no
+# longer being used. That would probably explain why incoming searches
+# have two different formats...
+
+# There are three parts to Soribada protocal:
+# 1: Ping/Pong to establish a relationship on the net (UDP with 2 useful bytes)
+# 2: Searching (in two formats) (UDP with two short easy to match starts)
+# 3: Download requests/transfers (TCP with an obvious first packet)
+
+# 1 -- Pings/Pongs:
+# Requester send 2 bytes and a 6 byte response is sent back.
+# \x10 for the first byte and \x14-\x16 for the second.
+# The response is the first byte (\x10) and the second byte incremented
+# by 1 (\x15-\x17).
+# No further communication happens between the hosts except for searches.
+# A regex match: ^\x10[\x14-\x16]\x10[\x15-\x17].?.?.?.?$
+# First Packet ---^^^^^^^^^^^^^^^
+# Second Packet -----------------^^^^^^^^^^^^^^^^^^^^^^^
+
+# 2 -- Search requests:
+# All searches are totally stateless and are only responded to if the user
+# actually has the file.
+# Both format start with a \x01 byte, have 3 "random bytes" and then 3 bytes
+# corasponding to one of two formats.
+# Format 1 is \x51\x3a\+ and format 2 is \x51\x32\x3a
+# A regex match: ^\x01.?.?.?(\x51\x3a\+|\x51\x32\x3a)
+
+# 3 -- Download requests:
+# All downloads start with "GETMP3\x0d\x0aFilename"
+# A regex match: ^GETMP3\x0d\x0aFilename
+
+soribada
+
+# This will match the second packet of two.
+# ^\x10[\x14-\x16]\x10[\x15-\x17].?.?.?.?$
+
+# Again, matching this is the end of the comunication.
+# ^\x01.?.?.?(\x51\x3a\+|\x51\x32\x3a)
+
+# This is the start of the transfer and an easy match
+#^GETMP3\x0d\x0aFilename
+
+# This will match everything including the udp packet portions
+^GETMP3\x0d\x0aFilename|^\x01.?.?.?(\x51\x3a\+|\x51\x32\x3a)|^\x10[\x14-\x16]\x10[\x15-\x17].?.?.?.?$
+
diff --git a/src/usr/local/share/protocols/soulseek.pat b/src/usr/local/share/protocols/soulseek.pat
new file mode 100644
index 0000000..ebc06ab
--- /dev/null
+++ b/src/usr/local/share/protocols/soulseek.pat
@@ -0,0 +1,17 @@
+# Soulseek - P2P filesharing - http://slsknet.org
+# Pattern attributes: good fast fast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/Soulseek
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# All my tests show that this pattern is fast, but one user has reported that
+# it is slow. Your milage may vary.
+
+# This has been tested and works for "pierce firewall" commands and file
+# transfers. It does *not* match all the various sorts of chatter that go on,
+# such as searches, pings and whatnot.
+
+soulseek
+# (Pierce firewall: in theory the token could be 4 bytes, but the last two
+# seem to always be zero.|download: Peer Init)
+^(\x05..?|.\x01.[ -~]+\x01F..?.?.?.?.?.?.?)$
diff --git a/src/usr/local/share/protocols/ssdp.pat b/src/usr/local/share/protocols/ssdp.pat
new file mode 100644
index 0000000..d2de92d
--- /dev/null
+++ b/src/usr/local/share/protocols/ssdp.pat
@@ -0,0 +1,21 @@
+# SSDP - Simple Service Discovery Protocol - easy discovery of network devices
+# Pattern attributes: good slow notsofast
+# Protocol groups: networking ietf_draft_standard
+# Wiki: http://www.protocolinfo.org/wiki/SSDP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# This pattern was tested only by listening to a Linksys WRT54G. However,
+# I expect it works in general given the simplicity of the protocol.
+
+# SSDP packets should _always_ be sent to the multicast address
+# 239.255.255.250, making this pattern irrelevant. (Moreover, SSDP
+# packets should be resitricted to local networks that have plenty of
+# bandwidth.) However, Microsoft, as usual, has other ideas, so maybe
+# it could be useful. Can't hurt, anyway. :-)
+#
+# http://www.upnp.org/download/draft_cai_ssdp_v1_03.txt
+# http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/ssdp.asp
+
+ssdp
+^notify[\x09-\x0d ]\*[\x09-\x0d ]http/1\.1[\x09-\x0d -~]*ssdp:(alive|byebye)|^m-search[\x09-\x0d ]\*[\x09-\x0d ]http/1\.1[\x09-\x0d -~]*ssdp:discover
+
diff --git a/src/usr/local/share/protocols/ssh.pat b/src/usr/local/share/protocols/ssh.pat
new file mode 100644
index 0000000..5e32f5c
--- /dev/null
+++ b/src/usr/local/share/protocols/ssh.pat
@@ -0,0 +1,17 @@
+# SSH - Secure SHell
+# Pattern attributes: great veryfast fast
+# Protocol groups: remote_access secure ietf_draft_standard
+# Wiki: http://www.protocolinfo.org/wiki/SSH
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# usually runs on port 22
+#
+# http://www.ietf.org/internet-drafts/draft-ietf-secsh-transport-22.txt
+#
+# This pattern has been tested and is believed to work well.
+
+ssh
+^ssh-[12]\.[0-9]
+
+# old pattern:
+# (diffie-hellman-group-exchange-sha1|diffie-hellman-group1-sha1.ssh-rsa|ssh-dssfaes128-cbc|3des-cbc|blowfish-cbc|cast128-cbc|arcfour|aes192-cbc|aes256-cbc|rijndael-cbc@lysator.liu.sefaes128-cbc|3des-cbc|blowfish-cbc|cast128-cbc|arcfour|aes192-cbc|aes256-cbc|rijndael-cbc@lysator.liu.seuhmac-md5|hmac-sha1|hmac-ripemd160)+
diff --git a/src/usr/local/share/protocols/ssl.pat b/src/usr/local/share/protocols/ssl.pat
new file mode 100644
index 0000000..ae30ee4
--- /dev/null
+++ b/src/usr/local/share/protocols/ssl.pat
@@ -0,0 +1,16 @@
+# SSL and TLS - Secure Socket Layer / Transport Layer Security - RFC 2246
+# Pattern attributes: good notsofast fast superset
+# Protocol groups: secure ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/SSL
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 443
+#
+# This is a superset of validcertssl. For it to match, it must be first.
+#
+# This pattern has been tested and is believed to work well.
+
+ssl
+# Server Hello with certificate | Client Hello
+# This allows SSL 3.X, which includes TLS 1.0, known internally as SSL 3.1
+^(.?.?\x16\x03.*\x16\x03|.?.?\x01\x03\x01?.*\x0b)
diff --git a/src/usr/local/share/protocols/stun.pat b/src/usr/local/share/protocols/stun.pat
new file mode 100644
index 0000000..3bfc3ab
--- /dev/null
+++ b/src/usr/local/share/protocols/stun.pat
@@ -0,0 +1,46 @@
+# STUN - Simple Traversal of UDP Through NAT - RFC 3489
+# Pattern attributes: ok veryfast fast
+# Protocol groups: networking ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/STUN
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is untested as far as I know.
+
+# Wikipedia says: "The STUN server is contacted on UDP port 3478,
+# however the server will hint clients to perform tests on alternate IP
+# and port number too (STUN servers have two IP addresses). The RFC
+# states that this port and IP are arbitrary."
+
+stun
+# \x01 is a Binding Request. \x02 is a Shared Secret Request. Binding
+# Requests are, experimentally, exactly 20 Bytes with three NULL Bytes.
+# The first NULL is part of the two byte message type field. The other
+# two give the message length, zero. I'm guessing that Shared Secret
+# Requests are similar, but I have not checked. Please read the RFC and
+# do experiments to find out. All other message types are responses,
+# and so don't matter.
+#
+# The .? allows one of the Message Transaction ID Bytes to be \x00. If
+# two are \x00, it will fail. This will happen 0.37% of the time, since
+# the Message Transaction ID is supposed to be random. If this is
+# unacceptable to you, add another ? to reduce this to 0.020%, but be
+# aware of the increased possibility of false positives.
+^[\x01\x02]................?$
+
+# From my post to the mailing list:
+# http://sourceforge.net/mailarchive/message.php?msg_id=36787107
+#
+# This is a rather permissive pattern, but you can make it a little better
+# by combining it with another iptables rule that checks that the packet
+# data is exactly 20 Bytes. Of course, the second packet is longer, so
+# maybe that introduces more complications than benefits.
+#
+# If you're willing to wait until the second packet to make the
+# identification, you could use this:
+#
+# ^\x01................?\x01\x01
+#
+# or if the Message Length is always \x24 (I'm not sure it is from your
+# single example):
+#
+# ^\x01................?\x01\x01\x24
diff --git a/src/usr/local/share/protocols/subspace.pat b/src/usr/local/share/protocols/subspace.pat
new file mode 100644
index 0000000..0a1b174
--- /dev/null
+++ b/src/usr/local/share/protocols/subspace.pat
@@ -0,0 +1,21 @@
+# Subspace - 2D asteroids-style space game - http://sscentral.com
+# Pattern attributes: marginal veryfast fast
+# Protocol groups: game
+# Wiki: http://www.protocolinfo.org/wiki/Subspace
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# By Myles Uyema <mylesuyema AT gmail.com>
+#
+# This pattern matches the initial 2 packets of the client-server
+# 'handshake' when joining a Zone.
+#
+# The first packet is an 8 byte UDP payload sent from client
+# 0x00 0x01 0x?? 0x?? 0x?? 0x?? 0x11
+# The next packet is a 12 byte UDP response from server
+# 0x00 0x10 0x?? 0x?? 0x?? 0x?? 0x?? 0x?? 0x?? 0x?? 0x01 0x00
+#
+# l7-filter strips out the null bytes, leaving me with this pattern
+
+subspace
+^\x01....\x11\x10........\x01$
+
diff --git a/src/usr/local/share/protocols/subversion.pat b/src/usr/local/share/protocols/subversion.pat
new file mode 100644
index 0000000..8769a19
--- /dev/null
+++ b/src/usr/local/share/protocols/subversion.pat
@@ -0,0 +1,13 @@
+# Subversion - a version control system
+# Pattern attributes: ok veryfast fast
+# Protocol groups: version_control open_source
+# Wiki: http://www.protocolinfo.org/wiki/Subversion
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is UNTESTED. (But it seems straightforward enough...)
+#
+# Subversion uses TCP port 3690 by default.
+
+subversion
+# This is not a valid basic GNU regular expression.
+^\( success \( 1 2 \(
diff --git a/src/usr/local/share/protocols/swf.pat b/src/usr/local/share/protocols/swf.pat
new file mode 100644
index 0000000..af03086
--- /dev/null
+++ b/src/usr/local/share/protocols/swf.pat
@@ -0,0 +1,2 @@
+swf
+swf\x21\x1a\x07
diff --git a/src/usr/local/share/protocols/tar.pat b/src/usr/local/share/protocols/tar.pat
new file mode 100644
index 0000000..d3ea987
--- /dev/null
+++ b/src/usr/local/share/protocols/tar.pat
@@ -0,0 +1,12 @@
+# Tar - tape archive. Standard UNIX file archiver, not just for tapes.
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+tar
+# /usr/share/magic
+## POSIX tar archives
+#257 string ustar\0 POSIX tar archive
+#257 string ustar\040\040\0 GNU tar archive
+# this is pretty general. It's not a dictionary word, but still...
+ustar
diff --git a/src/usr/local/share/protocols/teamfortress2.pat b/src/usr/local/share/protocols/teamfortress2.pat
new file mode 100644
index 0000000..337af39
--- /dev/null
+++ b/src/usr/local/share/protocols/teamfortress2.pat
@@ -0,0 +1,11 @@
+# Team Fortress 2 - network game - http://www.valvesoftware.com
+# Pattern attributes: good veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Team_Fortress
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Credits: Clayton Macleod <cherry twist at gmail dot com>
+# Jan Engelhardt <jengelh at computergmbh dot de>
+
+teamfortress2
+^\xff\xff\xff\xff.....*tfTeam Fortress
diff --git a/src/usr/local/share/protocols/teamspeak.pat b/src/usr/local/share/protocols/teamspeak.pat
new file mode 100644
index 0000000..8b2155e
--- /dev/null
+++ b/src/usr/local/share/protocols/teamspeak.pat
@@ -0,0 +1,15 @@
+# TeamSpeak - VoIP application - http://goteamspeak.com
+# Pattern attributes: good veryfast fast
+# Protocol groups: voip proprietary
+# Wiki: http://www.protocolinfo.org/wiki/TeamSpeak
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested by Matthew Strait and verified by packet
+# traces by at least two other people. The meaning of f4b303 is not
+# known, but it seems to appear in all first packets. This pattern only
+# matches the actual UDP voice traffic, not the TeamSpeak web interface
+# or "TCP query".
+
+teamspeak
+^\xf4\xbe\x03.*teamspeak
+
diff --git a/src/usr/local/share/protocols/telnet.pat b/src/usr/local/share/protocols/telnet.pat
new file mode 100644
index 0000000..cf10d0e
--- /dev/null
+++ b/src/usr/local/share/protocols/telnet.pat
@@ -0,0 +1,16 @@
+# Telnet - Insecure remote login - RFC 854
+# Pattern attributes: good veryfast fast
+# Protocol groups: remote_access obsolete ietf_internet_standard
+# Wiki: http://www.protocolinfo.org/wiki/Telnet
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 23
+#
+# This pattern is lightly tested.
+
+telnet
+# Matches at least three IAC (Do|Will|Don't|Won't) commands in a row.
+# My telnet client sends 9 when I connect, so this should be fine.
+# This pattern could fail on a unchatty connection or it could be
+# matched by something non-telnet spewing a lot of stuff in the fb-ff range.
+^\xff[\xfb-\xfe].\xff[\xfb-\xfe].\xff[\xfb-\xfe]
diff --git a/src/usr/local/share/protocols/tesla.pat b/src/usr/local/share/protocols/tesla.pat
new file mode 100644
index 0000000..1f4ee86
--- /dev/null
+++ b/src/usr/local/share/protocols/tesla.pat
@@ -0,0 +1,15 @@
+# Tesla Advanced Communication - P2P filesharing (?)
+# Pattern attributes: marginal slow notsofast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/Tesla
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern is untested!
+
+# This is lifted from http://oofle.com/filesharing.php?app=tesla
+# There is no explaination of what these numbers mean.
+# The above page says that the first string is found only in TCP packets
+# and the second only in UDP.
+
+tesla
+\x03\x9a\x89\x22\x31\x31\x31\.\x30\x30\x20\x42\x65\x74\x61\x20|\xe2\x3c\x69\x1e\x1c\xe9
diff --git a/src/usr/local/share/protocols/tftp.pat b/src/usr/local/share/protocols/tftp.pat
new file mode 100644
index 0000000..1782ff5
--- /dev/null
+++ b/src/usr/local/share/protocols/tftp.pat
@@ -0,0 +1,21 @@
+# TFTP - Trivial File Transfer Protocol - used for bootstrapping - RFC 1350
+# Pattern attributes: marginal fast fast
+# Protocol groups: document_retrieval ietf_internet_standard
+# Wiki: http://www.protocolinfo.org/wiki/TFTP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# usually runs on port 69
+#
+# This pattern is unconfirmed.
+
+tftp
+# The first packet from the initiating host should either be a Read Request
+# or a Write Request. In the other direction, it should be data packet with
+# block number one or an ACK with block number zero. We only attempt to match
+# the initiating host's packets, because the only identifying features of
+# the responses to them are two byte sequences (which isn't specific enough).
+# (\x01|\x02) = Read Request or Write Request
+# [ -~]* = the file name
+# the rest = netascii|octet|mail (case insensitivity done by the kernel)
+
+^(\x01|\x02)[ -~]*(netascii|octet|mail)
diff --git a/src/usr/local/share/protocols/thecircle.pat b/src/usr/local/share/protocols/thecircle.pat
new file mode 100644
index 0000000..d5e2b80
--- /dev/null
+++ b/src/usr/local/share/protocols/thecircle.pat
@@ -0,0 +1,12 @@
+# The Circle - P2P application - http://thecircle.org.au
+# Pattern attributes: ok veryfast fast
+# Protocol groups: p2p open_source
+# Wiki: http://www.protocolinfo.org/wiki/The_Circle
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# This is tested with The Circle 0.41c on Linux.
+# It likely misses some stuff. Notably, I wasn't able to test it on any
+# large downloads, because no one is sharing anything!
+
+thecircle
+^t\x03ni.?[\x01-\x06]?t[\x01-\x05]s[\x0a\x0b](glob|who are you$|query data)
diff --git a/src/usr/local/share/protocols/tonghuashun.pat b/src/usr/local/share/protocols/tonghuashun.pat
new file mode 100644
index 0000000..45f838b
--- /dev/null
+++ b/src/usr/local/share/protocols/tonghuashun.pat
@@ -0,0 +1,11 @@
+# Tonghuashun - stock analysis and trading; Chinese - http://www.10jqka.com.cn
+# Pattern attributes: ok fast fast
+# Protocol groups:
+# Wiki: http://www.protocolinfo.org/wiki/Tonghuashun
+# Copyright (C) 2009 Matthew Strait; See ../LICENSE
+
+# Pattern contributed by liangjun without comment.
+
+tonghuashun
+^(GET /docookie\.php\?uname=|\xfd\xfd\xfd\xfd\x30\x30\x30\x30\x30)
+
diff --git a/src/usr/local/share/protocols/tor.pat b/src/usr/local/share/protocols/tor.pat
new file mode 100644
index 0000000..7e4f707
--- /dev/null
+++ b/src/usr/local/share/protocols/tor.pat
@@ -0,0 +1,17 @@
+# Tor - The Onion Router - used for anonymization - http://tor.eff.org
+# Pattern attributes: good notsofast notsofast
+# Protocol groups: networking
+# Wiki: http://protocolinfo.org/wiki/Tor
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This pattern has been tested and is believed to work well.
+#
+# It matches on the second packet. I have no idea how the protocol
+# works, but this matches every stream I have made using Tor 0.1.0.16 as
+# a client on Linux.
+#
+# It does NOT attempt to match the HTTP request that fetches the list of
+# Tor servers.
+
+tor
+TOR1.*<identity>
diff --git a/src/usr/local/share/protocols/tsp.pat b/src/usr/local/share/protocols/tsp.pat
new file mode 100644
index 0000000..7751df9
--- /dev/null
+++ b/src/usr/local/share/protocols/tsp.pat
@@ -0,0 +1,14 @@
+# TSP - Berkely UNIX Time Synchronization Protocol
+# Pattern attributes: good veryfast fast overmatch
+# Protocol groups: time_synchronization open_source
+# Wiki: http://www.protocolinfo.org/wiki/TSP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# http://ftp.svbug.com/ftp/pub/manuals/pdf/smm.22.timed.pdf
+# http://docs.freebsd.org/44doc/smm/12.timed/paper.pdf
+#
+# This pattern is barely tested.
+
+tsp
+# type, version (1), sequence number, 8 type specific bytes, machine name
+^[\x01-\x13\x16-$]\x01.?.?.?.?.?.?.?.?.?.?[ -~]+
diff --git a/src/usr/local/share/protocols/unset.pat b/src/usr/local/share/protocols/unset.pat
new file mode 100644
index 0000000..b9c1244
--- /dev/null
+++ b/src/usr/local/share/protocols/unset.pat
@@ -0,0 +1,8 @@
+# Unset - Dummy pattern for unmatched connections that are still being tested
+
+unset
+# This pattern is ignored by the kernel. It sees that the "protocol" is
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+# "testing" and always returns matched for connections that are still
+# being tested.
+.
diff --git a/src/usr/local/share/protocols/uucp.pat b/src/usr/local/share/protocols/uucp.pat
new file mode 100644
index 0000000..f7ef22c
--- /dev/null
+++ b/src/usr/local/share/protocols/uucp.pat
@@ -0,0 +1,12 @@
+# UUCP - Unix to Unix Copy
+# Pattern attributes: ok veryfast fast
+# Protocol groups: document_retrieval obsolete
+# Wiki: http://www.protocolinfo.org/wiki/UUCP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# This is completely untested! (I don't know how to use UUCP...)
+
+# See http://docs.freebsd.org/info/uucp/uucp.info.The_Initial_Handshake.html
+
+uucp
+^\x10here=
diff --git a/src/usr/local/share/protocols/validcertssl.pat b/src/usr/local/share/protocols/validcertssl.pat
new file mode 100644
index 0000000..7aa1812
--- /dev/null
+++ b/src/usr/local/share/protocols/validcertssl.pat
@@ -0,0 +1,25 @@
+# Valid certificate SSL
+# Pattern attributes: good slow notsofast subset
+# Protocol groups: secure ietf_proposed_standard
+# Wiki: http://www.protocolinfo.org/wiki/SSL
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+# This matches anything claiming to use a valid certificate from a well
+# known certificate authority.
+#
+# This is a subset of ssl, so it needs to come first to match.
+#
+# Note that opening a website that has a valid certificate will
+# open one connection that matches this and many ssl connections that
+# only match the ssl pattern. Thus, this pattern may not be very useful.
+#
+# This pattern is believed match only the above, but may not match all
+# of it.
+#
+# the certificate authority info is sent in quasi plain text, if it matches
+# a well known certificate authority then we will assume it is a
+# web/imaps/etc server. Other ssl may be good too, but it should fall under
+# a different rule
+
+validcertssl
+^(.?.?\x16\x03.*\x16\x03|.?.?\x01\x03\x01?.*\x0b).*(thawte|equifax secure|rsa data security, inc|verisign, inc|gte cybertrust root|entrust\.net limited)
diff --git a/src/usr/local/share/protocols/ventrilo.pat b/src/usr/local/share/protocols/ventrilo.pat
new file mode 100644
index 0000000..74e588c
--- /dev/null
+++ b/src/usr/local/share/protocols/ventrilo.pat
@@ -0,0 +1,18 @@
+# Ventrilo - VoIP - http://ventrilo.com
+# Pattern attributes: good fast fast
+# Protocol groups: voip proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Ventrilo
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# I have tested this with Ventrilo client 2.3.0 on Windows talking to
+# Ventrilo server 2.3.1 (the public version) on Linux. I've done this
+# both within a LAN and over the Internet. In one test, I tried
+# monkeying around with the server settings to see if I could break the
+# pattern, and I couldn't. However, you can't change the port number in
+# the public server.
+#
+# It has also been tested by one other person in an unknown configuration.
+
+ventrilo
+^..?v\$\xcf
+
diff --git a/src/usr/local/share/protocols/vnc.pat b/src/usr/local/share/protocols/vnc.pat
new file mode 100644
index 0000000..79d0ae8
--- /dev/null
+++ b/src/usr/local/share/protocols/vnc.pat
@@ -0,0 +1,23 @@
+# VNC - Virtual Network Computing. Also known as RFB - Remote Frame Buffer
+# Pattern attributes: great veryfast fast
+# Protocol groups: remote_access
+# Wiki: http://www.protocolinfo.org/wiki/VNC
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# http://www.realvnc.com/documentation.html
+#
+# This pattern has been verified with vnc v3.3.7 on WinXP and Linux
+#
+# Thanks to Trevor Paskett <tpaskett AT cymphonix.com> for this pattern.
+
+vnc
+# Assumes single digit major and minor version numbers
+# This message should be all alone in the first packet, so ^$ is appropriate
+^rfb 00[1-9]\.00[0-9]\x0a$
+
+# This is a more restrictive version which assumes the version numbers
+# are ones actually in existance at the time of this writing, i.e. 3.3,
+# 3.7 and 3.8 (with some clients wrongly reporting 3.5). It should be
+# slightly faster, but probably not worth the extra maintenance.
+# ^rfb 003\.00[3578]\x0a$
+
diff --git a/src/usr/local/share/protocols/whois.pat b/src/usr/local/share/protocols/whois.pat
new file mode 100644
index 0000000..6abf0e8
--- /dev/null
+++ b/src/usr/local/share/protocols/whois.pat
@@ -0,0 +1,14 @@
+# Whois - query/response system, usually used for domain name info - RFC 3912
+# Pattern attributes: good notsofast notsofast overmatch
+# Protocol groups: networking ietf_draft_standard
+# Wiki: http://www.protocolinfo.org/wiki/Whois
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on TCP port 43
+#
+# This pattern has been tested and is believed to work well.
+
+whois
+# Matches the query. Assumes only that it is printable ASCII without wierd
+# whitespace.
+^[ !-~]+\x0d\x0a$
diff --git a/src/usr/local/share/protocols/worldofwarcraft.pat b/src/usr/local/share/protocols/worldofwarcraft.pat
new file mode 100644
index 0000000..4136d79
--- /dev/null
+++ b/src/usr/local/share/protocols/worldofwarcraft.pat
@@ -0,0 +1,66 @@
+# World of Warcraft - popular network game - http://blizzard.com/
+# Pattern attributes: ok veryfast fast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/World_of_Warcraft
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+
+worldofwarcraft
+^\x06\xec\x01
+
+# Quoth the author of this pattern, Weisskopf Beat <weisb AT bfh.ch>:
+
+# I have written a pattern for wow (tested with versions 1.8.3 and
+# 1.8.4, german edition). It does not match the login as i think this is
+# uncritical, but i have added the necessary info later on. So only the
+# actual in-game traffic is matched.
+#
+# I hope the pattern is specific enough, otherwise one may add some
+# bytes from the response.
+#
+# some captured info:
+#
+# login:
+#
+# 0000: 00 02 28 00 57 6F 57 00 01 08 03 C7 12 36 38 78 ..(.WoW......68x
+# 0010: 00 6E 69 57 00 45 44 65 64 3C 00 00 00 C0 A8 01 .niW.EDed<......
+# 0020: 22 0A 42 57 45 49 53 53 4B 4F 50 46 ".BWEISSKOPF
+#
+# 0000: 00 02 28 00 57 6F 57 00 01 08 03 C7 12 36 38 78 ..(.WoW......68x
+# 0010: 00 6E 69 57 00 45 44 65 64 3C 00 00 00 C0 A8 01 .niW.EDed<......
+# 0020: 22 0A 42 57 45 49 53 53 4B 4F 50 46 ".BWEISSKOPF
+#
+# server asking:
+#
+# #1
+# 0000: 00 06 EC 01 04 49 C5 33 .....I.3
+#
+# #2
+# 0000: 00 06 EC 01 C3 A8 6E 63 ......nc
+#
+# client response
+# #1
+# 0000: 00 A4 ED 01 00 00 C7 12 00 00 00 00 00 00 42 57 ..............BW
+# 0010: 45 49 53 53 4B 4F 50 46 00 EB 35 DC 89 5A CA 6D EISSKOPF..5..Z.m
+# 0020: 17 95 DE 5B 74 6E 1E 5D 23 73 C6 8F 27 9F 11 12 ...[tn.]#s..'...
+# 0030: BB 21 01 00 00 78 9C 75 CC 41 0A 83 50 0C 84 E1 .!...x.u.A..P...
+# 0040: E7 3D 7A 19 75 25 D4 4D AB EB 12 5E A2 0C 8D 51 .=z.u%.M...^...Q
+# 0050: D2 57 04 4F DF 2E 2D A4 B3 FD 86 3F A5 EF 1A C5 .W.O..-....?....
+# 0060: 71 90 F3 A3 7E E7 82 D5 C6 2E 55 CB 7E B9 FE 58 q...~.....U.~..X
+# 0070: 43 A5 A8 4C 10 E5 1E 86 85 B6 E8 04 63 D8 1C 06 C..L........c...
+# 0080: 5A A7 A9 84 D2 D9 6B 93 1C 5B 4F D9 D7 50 6E 04 Z.....k..[O..Pn.
+# 0090: 0E 61 20 15 8B 6B 83 13 CB FD 09 D5 7F 0C 13 3F .a ..k.........?
+# 00A0: DB 07 B4 EA 54 F8 ....T.
+#
+# #2
+# 0000: 00 A4 ED 01 00 00 C7 12 00 00 00 00 00 00 42 57 ..............BW
+# 0010: 45 49 53 53 4B 4F 50 46 00 38 4C B5 95 C3 AD 25 EISSKOPF.8L....%
+# 0020: CB 73 48 BD 82 FC 99 63 59 AC BF F3 D0 C6 8D AB .sH....cY.......
+# 0030: 3D 21 01 00 00 78 9C 75 CC 41 0A 83 50 0C 84 E1 =!...x.u.A..P...
+# 0040: E7 3D 7A 19 75 25 D4 4D AB EB 12 5E A2 0C 8D 51 .=z.u%.M...^...Q
+# 0050: D2 57 04 4F DF 2E 2D A4 B3 FD 86 3F A5 EF 1A C5 .W.O..-....?....
+# 0060: 71 90 F3 A3 7E E7 82 D5 C6 2E 55 CB 7E B9 FE 58 q...~.....U.~..X
+# 0070: 43 A5 A8 4C 10 E5 1E 86 85 B6 E8 04 63 D8 1C 06 C..L........c...
+# 0080: 5A A7 A9 84 D2 D9 6B 93 1C 5B 4F D9 D7 50 6E 04 Z.....k..[O..Pn.
+# 0090: 0E 61 20 15 8B 6B 83 13 CB FD 09 D5 7F 0C 13 3F .a ..k.........?
+# 00A0: DB 07 B4 EA 54 F8 ....T.
+
diff --git a/src/usr/local/share/protocols/x11.pat b/src/usr/local/share/protocols/x11.pat
new file mode 100644
index 0000000..2028ee7
--- /dev/null
+++ b/src/usr/local/share/protocols/x11.pat
@@ -0,0 +1,23 @@
+# X Windows Version 11 - Networked GUI system used in most Unices
+# Pattern attributes: good notsofast veryfast
+# Protocol groups: remote_access x_consortium_standard
+# Wiki: http://www.protocolinfo.org/wiki/X11
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# It is common for X to be tunneled through SSH. Then obviously this pattern
+# will not catch it.
+#
+# Specification: http://www.msu.edu/~huntharo/xwin/docs/xwindows/PROTO.pdf
+# Usually runs on port 6000 (6001 for the second server on a host, etc)
+#
+# This pattern has been tested.
+
+x11
+# 'l' = little-endian. 'B' = big endian
+# ".?" is for the unused byte that comes next. If it's a null, it won't appear.
+# \x0b = protocol-major-version 11.
+# For some reason, protocol-minor-version is 0, not 6, so can't match it.
+# This pattern is too general.
+^[lb].?\x0b
+userspace pattern=^[lB].?\x0b
+userspace flags=REG_NOSUB
diff --git a/src/usr/local/share/protocols/xboxlive.pat b/src/usr/local/share/protocols/xboxlive.pat
new file mode 100644
index 0000000..d04d9a7
--- /dev/null
+++ b/src/usr/local/share/protocols/xboxlive.pat
@@ -0,0 +1,41 @@
+# XBox Live - Console gaming
+# Pattern attributes: marginal slow notsofast
+# Protocol groups: game proprietary
+# Wiki: http://www.protocolinfo.org/wiki/XBox_Live
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This may match all XBox traffic, or may only match Halo 2 traffic.
+# We don't know yet.
+#
+# Thanks to Myles Uyema <mylesuyema AT gmail DOT com>, who says:
+#
+# Analyzing packet traces using Ethereal, the Xbox typically connects
+# to remote users using UDP port 3074. The first frame is typically
+# a 156 byte UDP payload. I've only scrutinized the first 20 or so bytes.
+#
+# Each line below represents the first frame between my Xbox and a remote
+# player's IP address playing Halo2 on Xbox Live.
+#
+# 00 00 00 00 00 58 80 00 00 00 00 00 82 31 9e a8 05 0f c5 62 00 f3 96 08
+# 00 00 00 00 00 58 80 00 00 00 00 00 82 31 9e a8 0f 0f c5 62 00 f3 97 09
+# 00 00 00 00 00 58 80 00 00 00 00 00 82 31 9e a8 05 0f c5 62 00 f3 95 07
+# 00 00 00 00 00 58 80 00 00 00 00 00 81 87 ea 59 aa 11 ff 89 00 f3 bc 07
+# 00 00 00 00 00 58 80 00 00 00 00 00 81 87 ea 59 aa 11 ff 89 00 f3 be 09
+# 00 00 00 00 00 58 80 00 00 00 00 00 81 87 ea 59 aa 11 ff 89 00 f3 bf 0a
+# 00 00 00 00 00 58 80 00 00 00 00 00 81 87 ea 59 aa 11 ff 89 00 f3 bd 08
+# 00 00 00 00 00 58 80 00 00 00 00 00 81 87 ea 59 aa 11 ff 89 00 f3 ba 05
+# 00 00 00 00 00 58 80 00 00 00 00 00 81 87 ea 59 aa 11 ff 89 00 f3 bb 06
+# 00 00 00 00 00 58 80 00 00 00 00 00 81 7f dd 14 f2 8e a3 a1 00 f3 ca 06
+# 00 00 00 00 00 58 80 00 00 00 00 00 81 7f dd 14 f2 8e a3 a1 00 f3 cc 08
+# 00 00 00 00 00 58 80 00 00 00 00 00 81 7f dd 14 f2 8e a3 a1 00 f3 c9 05
+# 00 00 00 00 00 58 80 00 00 00 00 00 8b ca 5b c0 d8 9c f8 c3 00 f3 d4 0a
+# 00 00 00 00 00 58 80 00 00 00 00 00 8b ca 5b c0 d8 9c f3 c3 00 f3 d1 07
+# 00 00 00 00 00 58 80 00 00 00 00 00 8b ca 5b c0 d8 9c f8 c3 00 f3 d2 08
+# 00 00 00 00 00 58 80 00 00 00 00 00 8b ca 5b c0 d8 9c f8 c3 00 f3 cf 05
+# 00 00 00 00 06 58 4e 00 00 00 e6 d9 6e ab 65 0d 63 9f 02 00 00 02 80 dd
+# 00 00 00 00 06 58 4e 00 00 00 46 e2 95 74 cd f9 bc 3d 00 00 00 00 8b ca
+# 00 00 00 00 06 58 4e 00 00 00 cf ce 3b 5c f5 f2 49 9a 00 00 00 00 8b ca
+# 00 00 00 00 06 58 4e 00 00 00 a9 c0 ac c5 16 e5 c9 92 00 00 00 00 8b ca
+
+xboxlive
+^\x58\x80........\xf3|^\x06\x58\x4e
diff --git a/src/usr/local/share/protocols/xunlei.pat b/src/usr/local/share/protocols/xunlei.pat
new file mode 100644
index 0000000..f7814c7
--- /dev/null
+++ b/src/usr/local/share/protocols/xunlei.pat
@@ -0,0 +1,83 @@
+# Xunlei - Chinese P2P filesharing - http://xunlei.com
+# Pattern attributes: good slow notsofast
+# Protocol groups: p2p
+# Wiki: http://www.protocolinfo.org/wiki/Xunlei
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# This has been tested by a number of people.
+#
+# Written by wsgtrsys of www.routerclub.com. Improved by VeNoMouS.
+# Improved more by wsgtrsys and platinum of bbs.chinaunix.net.
+#
+# Further additions of HTTP-like content by liangjunATdcuxD.Tcom, who
+# says: "i find old pattern is not working . so i write a new pattern of
+# xunlei,it's working with all of xunlei 5 version!" Matthew Strait notes
+# in response:
+#
+# I've looked around and I'm fairly sure that Internet Explorer 5.0
+# never identifies itself as "Mozilla/4.0 (compatible; MSIE 5.00;
+# Windows 98)" and that Internet Explorer 6.0 never identifies itself as
+# either "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; )" or
+# "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)".
+
+# The keep-alive part needs some examination too. These might validly
+# occur in an HTTP/1.0 connection, although I think in practical cases
+# they don't since there's general only one \x0d\x0a after it and/or the
+# next line starts with a letter (especially because it's the client
+# sending it). It wouldn't be crazy, though, if another protocol
+# (besides Xunlei) used keep-alive in a way that did match this. But
+# since I can't think of any examples, I'll assume it's ok for now.
+
+xunlei
+^([()]|get)(...?.?.?(reg|get|query)|.+User-Agent: (Mozilla/4\.0 \(compatible; (MSIE 6\.0; Windows NT 5\.1;? ?\)|MSIE 5\.00; Windows 98\))))|Keep-Alive\x0d\x0a\x0d\x0a[26]
+
+
+# This was the pattern until 2008 11 08. It is safer than the above against
+# overmatching ordinary HTTP connections
+#^[()]...?.?.?(reg|get|query)
+
+# More detail:
+# From http://sourceforge.net/tracker/index.php?func=detail&aid=1885209&group_id=80085&atid=558668
+#
+##############################################################################
+# Date: 2008-02-03
+# Sender: hydr0g3n
+#
+# Xunlei (Chinese P2P) traffic is not matched anymore by layer7 xunlei
+# pattern. It used to work in the past but not anymore. Maybe Xunlei was
+# updated and pattern should be adapted?
+#
+# Apparently ipp2p was edited by Chinese people to detect pplive and xunlei.
+# It is interesting and very recent:
+# http://www.chinaunix.net/jh/4/914377.html
+##############################################################################
+# Date: 2008-02-03
+# Sender: quadong
+#
+# Ok. Only some of the ipp2p function can be translated into an l7-filter
+# regular expression. The first part of search_xunlei can't be, since it
+# works by checking whether the length of the packet matches a byte in the
+# packet. The second part of search_xunlei becomes:
+#
+# \x20.?\x01?.?[\x01\x77]............?.?.?.?\x38
+#
+# Or possibly:
+#
+# ^\x20.?\x01?.?[\x01\x77]............?.?.?.?\x38
+#
+# I'm not sure whether IPP2P looks at every packet or only the first of each
+# connection.
+#
+# udp_search_xunlei says:
+# \x01\x01\x01\xfe\xff\xfe\xff|\x01\x11\xa0\xfe\xff\xfe\xff
+#
+# Again, putting a ^ at the beginning might work:
+#
+# ^(\x01\x01\x01\xfe\xff\xfe\xff|\x01\x11\xa0\xfe\xff\xfe\xff)
+#
+# So this *might* work:
+#
+# ^(\x20.?\x01?.?[\x01\x77]............?.?.?.?\x38|\x01\x01\x01\xfe\xff\xfe\xff|\x01\x11\xa0\xfe\xff\xfe\xff)
+#
+# but the ^ might be wrong and it will not match the HTTP part of Xunlei.
+##############################################################################
diff --git a/src/usr/local/share/protocols/yahoo.pat b/src/usr/local/share/protocols/yahoo.pat
new file mode 100644
index 0000000..17595b8
--- /dev/null
+++ b/src/usr/local/share/protocols/yahoo.pat
@@ -0,0 +1,27 @@
+# Yahoo messenger - an instant messenger protocol - http://yahoo.com
+# Pattern attributes: good fast fast
+# Protocol groups: chat proprietary
+# Wiki: http://www.protocolinfo.org/wiki/Yahoo_Messenger
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# Usually runs on port 5050
+#
+# This pattern has been tested and is believed to work well.
+
+yahoo
+# http://www.venkydude.com/articles/yahoo.htm says:
+# All Yahoo commands start with YMSG.
+# (Well... http://ethereal.com/faq.html#q5.32 suggests that YPNS and YHOO
+# are also possible, so let's allow those)
+# The next 7 bytes contain command (packet?) length and version information
+# which we won't currently try to match.
+# L means "YAHOO_SERVICE_VERIFY" according to Ethereal
+# W means "encryption challenge command" (YAHOO_SERVICE_AUTH)
+# T means "login command" (YAHOO_SERVICE_AUTHRESP)
+# (there are others, i.e. 0x01 "coming online", 0x02 "going offline",
+# 0x04 "changing status to available", 0x06 "user message", but W and T
+# should appear in the first few packets.)
+# 0xC080 is the standard argument separator, it should appear not long
+# after the "type of command" byte.
+
+^(ymsg|ypns|yhoo).?.?.?.?.?.?.?[lwt].*\xc0\x80
diff --git a/src/usr/local/share/protocols/zip.pat b/src/usr/local/share/protocols/zip.pat
new file mode 100644
index 0000000..e001354
--- /dev/null
+++ b/src/usr/local/share/protocols/zip.pat
@@ -0,0 +1,7 @@
+# ZIP - (PK|Win)Zip archive format
+# Pattern attributes: good notsofast notsofast subset
+# Protocol groups: file
+
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+zip
+pk\x03\x04\x14
diff --git a/src/usr/local/share/protocols/zmaap.pat b/src/usr/local/share/protocols/zmaap.pat
new file mode 100644
index 0000000..e741eca
--- /dev/null
+++ b/src/usr/local/share/protocols/zmaap.pat
@@ -0,0 +1,18 @@
+# ZMAAP - Zeroconf Multicast Address Allocation Protocol
+# Pattern attributes: ok veryfast fast
+# Protocol groups: networking ietf_draft_standard
+# Wiki: http://www.protocolinfo.org/wiki/ZMAAP
+# Copyright (C) 2008 Matthew Strait, Ethan Sommer; See ../LICENSE
+#
+# http://files.zeroconf.org/draft-ietf-zeroconf-zmaap-02.txt
+# (Note that this reference is an Internet-Draft, and therefore must
+# be considered a work in progress.)
+#
+# This pattern is untested!
+
+zmaap
+# - 4 byte magic number.
+# - 1 byte version. Allow 1 & 2, even though only version 1 currently exists.
+# - 1 byte message type,which is either 0 or 1
+# - 1 byte address family. L7-filter only works in IPv4, so this is 1.
+^\x1b\xd7\x3b\x48[\x01\x02]\x01?\x01
diff --git a/src/usr/local/share/rrdtool/fonts/DejaVuSansMono-Roman.ttf b/src/usr/local/share/rrdtool/fonts/DejaVuSansMono-Roman.ttf
new file mode 100644
index 0000000..691c8d6
--- /dev/null
+++ b/src/usr/local/share/rrdtool/fonts/DejaVuSansMono-Roman.ttf
Binary files differ
diff --git a/src/usr/local/www/apple-touch-icon.png b/src/usr/local/www/apple-touch-icon.png
new file mode 100755
index 0000000..7a4b975
--- /dev/null
+++ b/src/usr/local/www/apple-touch-icon.png
Binary files differ
diff --git a/src/usr/local/www/bandwidth_by_ip.php b/src/usr/local/www/bandwidth_by_ip.php
new file mode 100755
index 0000000..39f9a01
--- /dev/null
+++ b/src/usr/local/www/bandwidth_by_ip.php
@@ -0,0 +1,150 @@
+<?php
+/*
+ bandwidth_by_ip.php
+ */
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/local/bin/rate
+ pfSense_MODULE: trafficgraph
+*/
+
+require_once('guiconfig.inc');
+require_once('interfaces.inc');
+require_once('pfsense-utils.inc');
+require_once('util.inc');
+
+$listedIPs = "";
+
+//get interface IP and break up into an array
+$interface = $_GET['if'];
+$real_interface = get_real_interface($interface);
+if (!does_interface_exist($real_interface)) {
+ echo gettext("Wrong Interface");
+ return;
+}
+
+$intip = find_interface_ip($real_interface);
+//get interface subnet
+$netmask = find_interface_subnet($real_interface);
+$intsubnet = gen_subnet($intip, $netmask) . "/$netmask";
+
+// see if they want local, remote or all IPs returned
+$filter = $_GET['filter'];
+
+if ($filter == "") {
+ $filter = "local";
+}
+
+if ($filter == "local") {
+ $ratesubnet = "-c " . $intsubnet;
+} else {
+ // Tell the rate utility to consider the whole internet (0.0.0.0/0)
+ // and to consider local "l" traffic - i.e. traffic within the whole internet
+ // then we can filter the resulting output as we wish below.
+ $ratesubnet = "-lc 0.0.0.0/0";
+}
+
+//get the sort method
+$sort = $_GET['sort'];
+if ($sort == "out") {
+ $sort_method = "-T";
+} else {
+ $sort_method = "-R";
+}
+
+// get the desired format for displaying the host name or IP
+$hostipformat = $_GET['hostipformat'];
+$iplookup = array();
+// If hostname, description or FQDN is requested then load the locally-known IP address - host/description mappings into an array keyed by IP address.
+if ($hostipformat != "") {
+ if (is_array($config['dhcpd'])) {
+ // Build an array of static-mapped DHCP entries keyed by IP address.
+ foreach ($config['dhcpd'] as $ifdata) {
+ if (is_array($ifdata['staticmap'])) {
+ foreach ($ifdata['staticmap'] as $hostent) {
+ if (($hostent['ipaddr'] != "") && ($hostent['hostname'] != "")) {
+ if ($hostipformat == "descr" && $hostent['descr'] != "") {
+ $iplookup[$hostent['ipaddr']] = $hostent['descr'];
+ } else {
+ $iplookup[$hostent['ipaddr']] = $hostent['hostname'];
+ if ($hostipformat == "fqdn") {
+ $iplookup[$hostent['ipaddr']] .= "." . $config['system']['domain'];
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // Add any DNS host override data keyed by IP address.
+ foreach (array('dnsmasq', 'unbound') as $dns_type) {
+ if (isset($config[$dns_type]['enable'])) {
+ if (is_array($config[$dns_type]['hosts'])) {
+ foreach ($config[$dns_type]['hosts'] as $hostent) {
+ if (($hostent['ip'] != "") && ($hostent['host'] != "")) {
+ if ($hostipformat == "descr" && $hostent['descr'] != "") {
+ $iplookup[$hostent['ip']] = $hostent['descr'];
+ } else {
+ $iplookup[$hostent['ip']] = $hostent['host'];
+ if ($hostipformat == "fqdn") {
+ $iplookup[$hostent['ip']] .= "." . $hostent['domain'];
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+$_grb = exec("/usr/local/bin/rate -i {$real_interface} -nlq 1 -Aba 20 {$sort_method} {$ratesubnet} | tr \"|\" \" \" | awk '{ printf \"%s:%s:%s:%s:%s\\n\", $1, $2, $4, $6, $8 }'", $listedIPs);
+
+$someinfo = false;
+for ($x=2; $x<12; $x++) {
+
+ $bandwidthinfo = $listedIPs[$x];
+
+ // echo $bandwidthinfo;
+ $emptyinfocounter = 1;
+ if ($bandwidthinfo != "") {
+ $infoarray = explode (":", $bandwidthinfo);
+ if (($filter == "all") ||
+ (($filter == "local") && (ip_in_subnet($infoarray[0], $intsubnet))) ||
+ (($filter == "remote") && (!ip_in_subnet($infoarray[0], $intsubnet)))) {
+ if ($hostipformat == "") {
+ // pass back just the raw IP address
+ $addrdata = $infoarray[0];
+ } else {
+ // $hostipformat is one of "hostname", "descr" or "fqdn" - we want a text representation if we can get it.
+ if ($iplookup[$infoarray[0]] != "") {
+ // We have a local entry, so use it.
+ $addrdata = $iplookup[$infoarray[0]];
+ } else {
+ // Try to reverse lookup the IP address.
+ $addrdata = gethostbyaddr($infoarray[0]);
+ if ($addrdata != $infoarray[0]) {
+ // Reverse lookup returned something other than the IP address (FQDN, we hope!)
+ if ($hostipformat != "fqdn") {
+ // The user does not want the whole FQDN, so only pass back the first part of the name.
+ $name_array = explode(".", $addrdata);
+ $addrdata = $name_array[0];
+ }
+ }
+ }
+ }
+ //print host information;
+ echo $addrdata . ";" . $infoarray[1] . ";" . $infoarray[2] . "|";
+
+ //mark that we collected information
+ $someinfo = true;
+ }
+ }
+}
+unset($bandwidthinfo, $_grb);
+unset($listedIPs);
+
+//no bandwidth usage found
+if ($someinfo == false) {
+ echo gettext("no info");
+}
+?>
diff --git a/src/usr/local/www/carp_status.php b/src/usr/local/www/carp_status.php
new file mode 100644
index 0000000..5f863e2
--- /dev/null
+++ b/src/usr/local/www/carp_status.php
@@ -0,0 +1,252 @@
+<?php
+/*
+ carp_status.php
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-status-carp
+##|*NAME=Status: CARP page
+##|*DESCR=Allow access to the 'Status: CARP' page.
+##|*MATCH=carp_status.php*
+##|-PRIV
+
+/*
+ pfSense_MODULE: carp
+*/
+
+require_once("guiconfig.inc");
+require_once("globals.inc");
+
+function gentitle_pkg($pgname) {
+ global $config;
+ return $config['system']['hostname'] . "." . $config['system']['domain'] . " - " . $pgname;
+}
+
+unset($interface_arr_cache);
+unset($carp_interface_count_cache);
+unset($interface_ip_arr_cache);
+
+$status = get_carp_status();
+$status = intval($status);
+if ($_POST['carp_maintenancemode'] <> "") {
+ interfaces_carp_set_maintenancemode(!isset($config["virtualip_carp_maintenancemode"]));
+}
+if ($_POST['disablecarp'] <> "") {
+ if ($status > 0) {
+ set_single_sysctl('net.inet.carp.allow', '0');
+ if (is_array($config['virtualip']['vip'])) {
+ $viparr = &$config['virtualip']['vip'];
+ $found_dhcpdv6 = false;
+ foreach ($viparr as $vip) {
+ $carp_iface = "{$vip['interface']}_vip{$vip['vhid']}";
+ switch ($vip['mode']) {
+ case "carp":
+ interface_vip_bring_down($vip);
+ interface_ipalias_cleanup($carp_iface);
+
+ /*
+ * Reconfigure radvd when necessary
+ * XXX: Is it the best way to do it?
+ */
+ if (isset($config['dhcpdv6']) && is_array($config['dhcpdv6'])) {
+ foreach ($config['dhcpdv6'] as $dhcpv6if => $dhcpv6ifconf) {
+ if ($dhcpv6ifconf['rainterface'] != $carp_iface) {
+ continue;
+ }
+
+ services_radvd_configure();
+ break;
+ }
+ }
+
+ sleep(1);
+ break;
+ }
+ }
+ }
+ $savemsg = sprintf(gettext("%s IPs have been disabled. Please note that disabling does not survive a reboot and some configuration changes will re-enable."), $carp_counter);
+ $status = 0;
+ } else {
+ $savemsg = gettext("CARP has been enabled.");
+ if (is_array($config['virtualip']['vip'])) {
+ $viparr = &$config['virtualip']['vip'];
+ foreach ($viparr as $vip) {
+ switch ($vip['mode']) {
+ case "carp":
+ interface_carp_configure($vip);
+ sleep(1);
+ break;
+ case 'ipalias':
+ if (strpos($vip['interface'], '_vip')) {
+ interface_ipalias_configure($vip);
+ }
+ break;
+ }
+ }
+ }
+ interfaces_sync_setup();
+ set_single_sysctl('net.inet.carp.allow', '1');
+ $status = 1;
+ }
+}
+
+$carp_detected_problems = get_single_sysctl("net.inet.carp.demotion");
+
+if (!empty($_POST['resetdemotion'])) {
+ set_single_sysctl("net.inet.carp.demotion", "-{$carp_detected_problems}");
+ sleep(1);
+ $carp_detected_problems = get_single_sysctl("net.inet.carp.demotion");
+}
+
+$pgtitle = array(gettext("Status"), gettext("CARP"));
+$shortcut_section = "carp";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="carp_status.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+
+<?PHP if ($carp_detected_problems > 0) {
+ print_info_box(
+ gettext("CARP has detected a problem and this unit has been demoted to BACKUP status.") . "<br/>" .
+ gettext("Check the link status on all interfaces with configured CARP VIPs.") . "<br/>" .
+ gettext("Search the") .
+ " <a href=\"/diag_logs.php?filtertext=carp%3A+demoted+by\">" .
+ gettext("system log") .
+ "</a> " .
+ gettext("for CARP demotion-related events.") . "<br/>" .
+ "<input type=\"submit\" name=\"resetdemotion\" id=\"resetdemotion\" value=\"" .
+ gettext("Reset CARP Demotion Status") .
+ "\" />"
+ );
+
+} ?>
+
+<div id="mainlevel">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="carp status">
+ <tr>
+ <td>
+<?php
+ $carpcount = 0;
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $carp) {
+ if ($carp['mode'] == "carp") {
+ $carpcount++;
+ break;
+ }
+ }
+ }
+ if ($carpcount > 0) {
+ if ($status > 0) {
+ $carp_enabled = true;
+ echo "<input type=\"submit\" name=\"disablecarp\" id=\"disablecarp\" value=\"" . gettext("Temporarily Disable CARP") . "\" />";
+ } else {
+ $carp_enabled = false;
+ echo "<input type=\"submit\" name=\"disablecarp\" id=\"disablecarp\" value=\"" . gettext("Enable CARP") . "\" />";
+ }
+ if (isset($config["virtualip_carp_maintenancemode"])) {
+ echo "<input type=\"submit\" name=\"carp_maintenancemode\" id=\"carp_maintenancemode\" value=\"" . gettext("Leave Persistent CARP Maintenance Mode") . "\" />";
+ } else {
+ echo "<input type=\"submit\" name=\"carp_maintenancemode\" id=\"carp_maintenancemode\" value=\"" . gettext("Enter Persistent CARP Maintenance Mode") . "\" />";
+ }
+ }
+?>
+
+ <br/><br/>
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="results">
+ <tr>
+ <td class="listhdrr" align="center"><?=gettext("CARP Interface"); ?></td>
+ <td class="listhdrr" align="center"><?=gettext("Virtual IP"); ?></td>
+ <td class="listhdrr" align="center"><?=gettext("Status"); ?></td>
+ </tr>
+<?php
+ if ($carpcount == 0) {
+ echo "</table></td></tr></table></div></form><center><br />" . gettext("Could not locate any defined CARP interfaces.");
+ echo "</center>";
+
+ include("fend.inc");
+ echo "</body></html>";
+ return;
+ }
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $carp) {
+ if ($carp['mode'] != "carp") {
+ continue;
+ }
+ $ipaddress = $carp['subnet'];
+ $vhid = $carp['vhid'];
+ $status = get_carp_interface_status("_vip{$carp['uniqid']}");
+ echo "<tr>";
+ $align = "style=\"vertical-align:middle\"";
+ if ($carp_enabled == false) {
+ $icon = "<img {$align} src=\"/themes/".$g['theme']."/images/icons/icon_block.gif\" alt=\"disabled\" />";
+ $status = "DISABLED";
+ } else {
+ if ($status == "MASTER") {
+ $icon = "<img {$align} src=\"/themes/".$g['theme']."/images/icons/icon_pass.gif\" alt=\"master\" />";
+ } else if ($status == "BACKUP") {
+ $icon = "<img {$align} src=\"/themes/".$g['theme']."/images/icons/icon_pass_d.gif\" alt=\"backup\" />";
+ } else if ($status == "INIT") {
+ $icon = "<img {$align} src=\"/themes/".$g['theme']."/images/icons/icon_log.gif\" alt=\"init\" />";
+ } else {
+ $icon = "";
+ }
+ }
+ echo "<td class=\"listlr\" align=\"center\">" . convert_friendly_interface_to_friendly_descr($carp['interface']) . "@{$vhid} &nbsp;</td>";
+ echo "<td class=\"listlr\" align=\"center\">" . $ipaddress . "&nbsp;</td>";
+ echo "<td class=\"listlr\" align=\"center\">{$icon}&nbsp;&nbsp;" . $status . "&nbsp;</td>";
+ echo "</tr>";
+ }
+ }
+?>
+ </table>
+ </td>
+ </tr>
+ </table>
+</div>
+</form>
+
+<p class="vexpl">
+<span class="red"><strong><?=gettext("Note"); ?>:</strong></span>
+<br />
+<?=gettext("You can configure high availability sync settings"); ?> <a href="system_hasync.php"><?=gettext("here"); ?></a>.
+</p>
+
+<?php
+ echo "<br />" . gettext("pfSync nodes") . ":<br />";
+ echo "<pre>";
+ system("/sbin/pfctl -vvss | /usr/bin/grep creator | /usr/bin/cut -d\" \" -f7 | /usr/bin/sort -u");
+ echo "</pre>";
+?>
+
+<?php include("fend.inc"); ?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/classes/maintable.inc b/src/usr/local/www/classes/maintable.inc
new file mode 100644
index 0000000..1478de8
--- /dev/null
+++ b/src/usr/local/www/classes/maintable.inc
@@ -0,0 +1,206 @@
+<?php
+/* $Id$ */
+/*
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2008 Bill Marquette <bill.marquette@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: guiutils
+*/
+
+
+class MainTable {
+ private $headers = array();
+// private $columns = array();
+ private $columns = 0;
+ private $rows = 0;
+ private $content = array();
+ private $edit_uri = '';
+ private $my_uri = '';
+ private $buttons = array('move' => false, 'edit' => false, 'del' => false, 'dup' => false);
+
+ function add_column($header, $cname, $width) {
+// $this->column[] = array('header' => $header, 'cname' => $cname, 'width' => $width)
+ $this->headers[] = $header;
+ $this->cname[] = $cname;
+ $this->width[] = $width;
+ $this->columns++;
+ }
+
+ function add_content_array($rows) {
+ foreach ($rows as $row) {
+ $this->content[] = $row;
+ $this->rows++;
+ }
+ }
+ function add_button($name) {
+ if (isset($this->buttons[$name])) {
+ $this->buttons[$name] = true;
+ }
+ }
+ function edit_uri($uri) {
+ $this->edit_uri = $uri;
+ }
+
+ function my_uri($uri) {
+ $this->my_uri = $uri;
+ }
+
+ function display() {
+ echo "<!-- begin content table -->\n";
+ echo "<table class=\"tabcont\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"display\">\n";
+ echo " <!-- begin content table header -->\n";
+ echo $this->display_header();
+ echo " <!-- end content table header -->\n";
+ echo " <!-- begin content table rows -->\n";
+ echo $this->display_rows();
+ echo " <!-- end content table rows -->\n";
+ echo " <!-- begin content table footer -->\n";
+ echo $this->display_footer();
+ echo " <!-- end content table footer -->\n";
+ echo "</table>\n";
+ echo "<!-- end content table -->\n";
+ }
+
+ private function display_header() {
+ global $g;
+ echo "<tr>\n";
+ for ($col = 0; $col < $this->columns - 1; $col++) {
+ echo " <td width=\"{$this->width[$col]}%\" class=\"listhdrr\">{$this->headers[$col]}</td>\n";
+ }
+ echo " <td width=\"{$this->width[$this->columns - 1]}%\" class=\"listhdr\">{$this->headers[$this->columns - 1]}</td>\n";
+ echo " <td width=\"10%\" class=\"list\">\n";
+ echo " <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" summary=\"display header\">\n";
+ echo " <tr>\n";
+ echo " <td width=\"17\"></td>\n";
+ echo " <td valign=\"middle\"><a href=\"{$this->edit_uri}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" alt=\"plus\" /></a></td>\n";
+ echo " </tr>\n";
+ echo " </table>\n";
+ echo " </td>\n";
+ echo "</tr>\n";
+
+ }
+ private function display_rows() {
+ global $g;
+ $cur_row = 0;
+ $encode_cols = array("name", "descr");
+ foreach ($this->content as $row) {
+ echo "<tr>\n";
+ for ($col = 0; $col < $this->columns - 1; $col++) {
+ if ($col == 0) {
+ $cl = 'listlr';
+ } else {
+ $cl = 'listr';
+ }
+ echo " <td class=\"{$cl}\" onclick=\"fr_toggle({$cur_row})\" id=\"frd{$cur_row}\" ondblclick=\"document.location='{$this->edit_uri}?id={$cur_row}'\">\n";
+ if (is_array($row[$this->cname[$col]])) {
+ foreach ($row[$this->cname[$col]] as $data) {
+ if (in_array($this->cname[$col], $encode_cols)) {
+ $data = htmlspecialchars($data);
+ }
+ echo " {$data}<br />\n";
+ }
+ } else {
+ if (in_array($this->cname[$col], $encode_cols)) {
+ $row[$this->cname[$col]] = htmlspecialchars($row[$this->cname[$col]]);
+ }
+ echo " " . $row[$this->cname[$col]] . "\n";
+ }
+ echo " </td>\n";
+ }
+ echo " <td class=\"listbg\" onclick=\"fr_toggle({$cur_row})\" id=\"frd{$cur_row}\" ondblclick=\"document.location='{$this->edit_uri}?id={$cur_row}'\">\n";
+ echo " <font color=\"#FFFFFF\">" . htmlspecialchars($row[$this->cname[$this->columns - 1]]) . "</font>\n";
+ echo " </td>\n";
+ echo " <td class=\"list nowrap\">\n";
+ $this->display_buttons($cur_row);
+ echo " </td>\n";
+ echo "</tr>\n";
+
+ $cur_row++;
+ }
+ }
+ private function display_footer() {
+ global $g;
+ echo "<tr>\n";
+ echo " <td class=\"list\" colspan=\"{$this->columns}\"></td>\n";
+ echo " <td class=\"list\">\n";
+ echo " <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" summary=\"display footer\">\n";
+ echo " <tr>\n";
+ echo " <td width=\"17\"></td>\n";
+ echo " <td valign=\"middle\"><a href=\"{$this->edit_uri}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" alt=\"plus\" /></a></td>\n";
+ echo " </tr>\n";
+ echo " </table>\n";
+ echo " </td>\n";
+ echo "</tr>\n";
+ }
+ private function display_buttons($row) {
+ echo " <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" summary=\"display buttons\">\n";
+ echo " <tr>\n";
+ if ($this->buttons['move']) {
+ echo $this->display_button('move', $row);
+ }
+ if ($this->buttons['edit']) {
+ echo $this->display_button('edit', $row);
+ }
+ echo " </tr>\n";
+ echo " <tr>\n";
+ if ($this->buttons['del']) {
+ echo $this->display_button('del', $row);
+ }
+ if ($this->buttons['dup']) {
+ echo $this->display_button('dup', $row);
+ }
+ echo " </tr>\n";
+ echo " </table>\n";
+ }
+ private function display_button($button, $row) {
+ global $g;
+ echo "<td valign=\"middle\">";
+ switch ($button) {
+ case "move": {
+ echo "<input name=\"move_{$row}\" type=\"image\" src=\"./themes/{$g['theme']}/images/icons/icon_left.gif\" width=\"17\" height=\"17\" title=\"Move selected entries before this entry\" onmouseover=\"fr_insline({$row}, true)\" onmouseout=\"fr_insline({$row}, false)\" />";
+ break;
+ }
+ case "edit": {
+ echo "<a href=\"{$this->edit_uri}?id={$row}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_e.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"Edit entry\" alt=\"edit\" /></a>";
+ break;
+ }
+ case "del": {
+ echo "<a href=\"{$this->my_uri}?act=del&amp;id={$row}\" onclick=\"return confirm('Do you really want to delete this entry?')\"><img src=\"/themes/{$g['theme']}/images/icons/icon_x.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"Delete entry\" alt=\"delete\" /></a>";
+ break;
+ }
+ case "dup": {
+ echo "<a href=\"{$this->edit_uri}?act=dup&amp;id={$row}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"Duplicate entry\" alt=\"duplicate\" /></a>";
+ break;
+ }
+ }
+ echo "</td>";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/src/usr/local/www/code-syntax-highlighter/SyntaxHighlighter.css b/src/usr/local/www/code-syntax-highlighter/SyntaxHighlighter.css
new file mode 100644
index 0000000..413a034
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/SyntaxHighlighter.css
@@ -0,0 +1,166 @@
+
+/* Main style for the table */
+
+.dp-highlighter {
+ width: 100%;
+ overflow: auto;
+ line-height: 100% !important;
+ margin: 18px 0px 18px 0px;
+}
+
+.dp-highlighter table {
+ width: 100%;
+ margin: 2px 0px 2px 0px;
+ border-collapse: collapse;
+ border-bottom: 2px solid #eee;
+ background-color: #fff;
+}
+
+.dp-highlighter td
+{
+ font-family: Courier New;
+ font-size: 11px;
+}
+
+/* Styles for the tools */
+
+.dp-highlighter .tools-corner {
+ background-color: #eee;
+ font-size: 9px;
+}
+
+.dp-highlighter .tools {
+ background-color: #eee;
+ padding: 3px 8px 3px 0px;
+ border-bottom: 1px solid gray;
+ font: 9px Verdana, Geneva, Arial, Helvetica, sans-serif;
+ color: silver;
+}
+
+.dp-highlighter .tools a {
+ font-size: 9px;
+ color: gray;
+ text-decoration: none;
+}
+
+.dp-highlighter .tools a:hover {
+ color: red;
+ text-decoration: underline;
+}
+
+/* Gutter with line number */
+
+.dp-highlighter .gutter {
+ padding-right: 5px;
+ padding-left: 10px;
+ width: 5px;
+ background-color: #eee;
+ border-right: 1px solid gray;
+ color: gray;
+ text-align: right;
+ vertical-align: top;
+}
+
+/* Single line style */
+
+.dp-highlighter .line {
+ padding-left: 10px;
+ border-bottom: 1px solid #F7F7F7;
+ white-space:nowrap;
+}
+
+/* About dialog styles */
+
+.dp-about {
+ background-color: #fff;
+ margin: 0px;
+}
+
+.dp-about table {
+ width: 100%;
+ height: 100%;
+ font-size: 11px;
+ font-family: Tahoma, Verdana, Arial, sans-serif !important;
+}
+
+.dp-about td {
+ padding: 10px;
+ vertical-align: top;
+}
+
+.dp-about .copy {
+ border-bottom: 1px solid #ACA899;
+ height: 95%;
+}
+
+.dp-about .title {
+ color: red;
+ font-weight: bold;
+}
+
+.dp-about .para {
+ margin-bottom: 4px;
+}
+
+.dp-about .footer {
+ background-color: #ECEADB;
+ border-top: 1px solid #fff;
+ text-align: right;
+}
+
+.dp-about .close {
+ font-size: 11px;
+ font-family: Tahoma, Verdana, Arial, sans-serif !important;
+ background-color: #ECEADB;
+ width: 60px;
+ height: 22px;
+}
+
+/* Language specific styles */
+
+.dp-c {}
+.dp-c .comment { color: green; }
+.dp-c .string { color: blue; }
+.dp-c .preprocessor { color: gray; }
+.dp-c .keyword { color: blue; }
+.dp-c .vars { color: #d00; }
+
+.dp-vb {}
+.dp-vb .comment { color: green; }
+.dp-vb .string { color: blue; }
+.dp-vb .preprocessor { color: gray; }
+.dp-vb .keyword { color: blue; }
+
+.dp-sql {}
+.dp-sql .comment { color: green; }
+.dp-sql .string { color: red; }
+.dp-sql .keyword { color: blue; }
+.dp-sql .func { color: #ff1493; }
+.dp-sql .op { color: #808080; }
+
+.dp-xml {}
+.dp-xml .cdata { color: #ff1493; }
+.dp-xml .comments { color: green; }
+.dp-xml .tag { color: blue; }
+.dp-xml .tag-name { color: black; font-weight: bold; }
+.dp-xml .attribute { color: red; }
+.dp-xml .attribute-value { color: blue; }
+
+.dp-delphi {}
+.dp-delphi .comment { color: #008200; font-style: italic; }
+.dp-delphi .string { color: blue; }
+.dp-delphi .number { color: blue; }
+.dp-delphi .directive { color: #008284; }
+.dp-delphi .keyword { font-weight: bold; color: navy; }
+.dp-delphi .vars { color: #000; }
+
+.dp-py {}
+.dp-py .comment { color: green; }
+.dp-py .string { color: red; }
+.dp-py .docstring { color: brown; }
+.dp-py .keyword { color: blue; font-weight: bold;}
+.dp-py .builtins { color: #ff1493; }
+.dp-py .magicmethods { color: #808080; }
+.dp-py .exceptions { color: brown; }
+.dp-py .types { color: brown; font-style: italic; }
+.dp-py .commonlibs { color: #8A2BE2; font-style: italic; }
diff --git a/src/usr/local/www/code-syntax-highlighter/gpl.txt b/src/usr/local/www/code-syntax-highlighter/gpl.txt
new file mode 100644
index 0000000..5b6e7c6
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/gpl.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushCSharp.js b/src/usr/local/www/code-syntax-highlighter/shBrushCSharp.js
new file mode 100644
index 0000000..5743b93
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushCSharp.js
@@ -0,0 +1,30 @@
+dp.sh.Brushes.CSharp = function()
+{
+ var keywords = 'abstract as base bool break byte case catch char checked class const ' +
+ 'continue decimal default delegate do double else enum event explicit ' +
+ 'extern false finally fixed float for foreach get goto if implicit in int ' +
+ 'interface internal is lock long namespace new null object operator out ' +
+ 'override params private protected public readonly ref return sbyte sealed set ' +
+ 'short sizeof stackalloc static string struct switch this throw true try ' +
+ 'typeof uint ulong unchecked unsafe ushort using virtual void while';
+
+ this.regexList = [
+ // There's a slight problem with matching single line comments and figuring out
+ // a difference between // and ///. Using lookahead and lookbehind solves the
+ // problem, unfortunately JavaScript doesn't support lookbehind. So I'm at a
+ // loss how to translate that regular expression to JavaScript compatible one.
+// { regex: new RegExp('(?<!/)//(?!/).*$|(?<!/)////(?!/).*$|/\\*[^\\*]*(.)*?\\*/', 'gm'), css: 'comment' }, // one line comments starting with anything BUT '///' and multiline comments
+// { regex: new RegExp('(?<!/)///(?!/).*$', 'gm'), css: 'comments' }, // XML comments starting with ///
+
+ { regex: new RegExp('//.*$', 'gm'), css: 'comment' }, // one line comments
+ { regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'), css: 'comment' }, // multiline comments
+ { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // strings
+ { regex: new RegExp('^\\s*#.*', 'gm'), css: 'preprocessor' }, // preprocessor tags like #region and #endregion
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // c# keyword
+ ];
+
+ this.CssClass = 'dp-c';
+}
+
+dp.sh.Brushes.CSharp.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.CSharp.Aliases = ['c#', 'c-sharp', 'csharp'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushCpp.js b/src/usr/local/www/code-syntax-highlighter/shBrushCpp.js
new file mode 100644
index 0000000..09570d5
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushCpp.js
@@ -0,0 +1,72 @@
+/**
+ * Code Syntax Highlighter for C++(Windows Platform).
+ * Version 0.0.1
+ * Copyright (C) 2006 Shin, YoungJin.
+ * http://www.jiniya.net/lecture/techbox/test.html
+ *
+ * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
+ * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library 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 Lesser General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+dp.sh.Brushes.Cpp = function()
+{
+ var datatypes =
+ 'ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR ' +
+ 'DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH ' +
+ 'HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP ' +
+ 'HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY ' +
+ 'HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT ' +
+ 'HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE ' +
+ 'LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF ' +
+ 'LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR ' +
+ 'LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR ' +
+ 'PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT ' +
+ 'PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 ' +
+ 'POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR ' +
+ 'PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 ' +
+ 'PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT ' +
+ 'SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG ' +
+ 'ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM ' +
+ 'char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t ' +
+ 'clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS ' +
+ 'FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t ' +
+ '__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t ' +
+ 'jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler ' +
+ 'sig_atomic_t size_t _stat __stat64 _stati64 terminate_function ' +
+ 'time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf ' +
+ 'va_list wchar_t wctrans_t wctype_t wint_t signed';
+
+ var keywords =
+ 'break case catch class const __finally __exception __try ' +
+ 'const_cast continue private public protected __declspec ' +
+ 'default delete deprecated dllexport dllimport do dynamic_cast ' +
+ 'else enum explicit extern if for friend goto inline ' +
+ 'mutable naked namespace new noinline noreturn nothrow ' +
+ 'register reinterpret_cast return selectany ' +
+ 'sizeof static static_cast struct switch template this ' +
+ 'thread throw true false try typedef typeid typename union ' +
+ 'using uuid virtual void volatile whcar_t while';
+
+ this.regexList = [
+ { regex: dp.sh.RegexLib.SingleLineCComments, css: 'comment' }, // one line comments
+ { regex: dp.sh.RegexLib.MultiLineCComments, css: 'comment' }, // multiline comments
+ { regex: dp.sh.RegexLib.DoubleQuotedString, css: 'string' }, // strings
+ { regex: dp.sh.RegexLib.SingleQuotedString, css: 'string' }, // strings
+ { regex: new RegExp('^ *#.*', 'gm'), css: 'preprocessor' },
+ { regex: new RegExp(this.GetKeywords(datatypes), 'gm'), css: 'datatypes' },
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' }
+ ];
+
+ this.CssClass = 'dp-cpp';
+}
+
+dp.sh.Brushes.Cpp.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.Cpp.Aliases = ['cpp', 'c', 'c++'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushCss.js b/src/usr/local/www/code-syntax-highlighter/shBrushCss.js
new file mode 100644
index 0000000..6d3f0de
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushCss.js
@@ -0,0 +1,50 @@
+dp.sh.Brushes.CSS = function()
+{
+ var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' +
+ 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+ 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+ 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+ 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+ 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+ 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+ 'height letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+ 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+ 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+ 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+ 'quotes richness right size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+ 'table-layout text-align text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+ 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+
+ var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+ 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+ 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+
+ 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+ 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+ 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+ 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+ 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+ 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+ 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+ 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+ 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+ 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+ 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+
+ var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif';
+
+ this.regexList = [
+ { regex: dp.sh.RegexLib.MultiLineCComments, css: 'comment' }, // multiline comments
+ { regex: dp.sh.RegexLib.DoubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: dp.sh.RegexLib.SingleQuotedString, css: 'string' }, // single quoted strings
+ { regex: new RegExp('\\#[a-zA-Z0-9]{3,6}', 'g'), css: 'colors' }, // html colors
+ { regex: new RegExp('(\\d+)(px|pt|\:)', 'g'), css: 'string' }, // size specifications
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(this.GetKeywords(values), 'g'), css: 'string' }, // values
+ { regex: new RegExp(this.GetKeywords(fonts), 'g'), css: 'string' } // fonts
+ ];
+
+ this.CssClass = 'dp-css';
+}
+
+dp.sh.Brushes.CSS.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.CSS.Aliases = ['css'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushDelphi.js b/src/usr/local/www/code-syntax-highlighter/shBrushDelphi.js
new file mode 100644
index 0000000..efb0601
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushDelphi.js
@@ -0,0 +1,31 @@
+/* Delphi brush is contributed by Eddie Shipman */
+dp.sh.Brushes.Delphi = function()
+{
+ var keywords = 'abs addr and ansichar ansistring array as asm begin boolean byte cardinal ' +
+ 'case char class comp const constructor currency destructor div do double ' +
+ 'downto else end except exports extended false file finalization finally ' +
+ 'for function goto if implementation in inherited int64 initialization ' +
+ 'integer interface is label library longint longword mod nil not object ' +
+ 'of on or packed pansichar pansistring pchar pcurrency pdatetime pextended ' +
+ 'pint64 pointer private procedure program property pshortstring pstring ' +
+ 'pvariant pwidechar pwidestring protected public published raise real real48 ' +
+ 'record repeat set shl shortint shortstring shr single smallint string then ' +
+ 'threadvar to true try type unit until uses val var varirnt while widechar ' +
+ 'widestring with word write writeln xor';
+
+ this.regexList = [
+ { regex: new RegExp('\\(\\*[\\s\\S]*?\\*\\)', 'gm'), css: 'comment' }, // multiline comments (* *)
+ { regex: new RegExp('{(?!\\$)[\\s\\S]*?}', 'gm'), css: 'comment' }, // multiline comments { }
+ { regex: new RegExp('//.*$', 'gm'), css: 'comment' }, // one line
+ { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // strings
+ { regex: new RegExp('\\{\\$[a-zA-Z]+ .+\\}', 'g'), css: 'directive' }, // Compiler Directives and Region tags
+ { regex: new RegExp('\\b[\\d\\.]+\\b', 'g'), css: 'number' }, // numbers 12345
+ { regex: new RegExp('\\$[a-zA-Z0-9]+\\b', 'g'), css: 'number' }, // numbers $F5D3
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // keyword
+ ];
+
+ this.CssClass = 'dp-delphi';
+}
+
+dp.sh.Brushes.Delphi.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.Delphi.Aliases = ['delphi', 'pascal'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushJScript.js b/src/usr/local/www/code-syntax-highlighter/shBrushJScript.js
new file mode 100644
index 0000000..c68a2a5
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushJScript.js
@@ -0,0 +1,22 @@
+dp.sh.Brushes.JScript = function()
+{
+ var keywords = 'abstract boolean break byte case catch char class const continue debugger ' +
+ 'default delete do double else enum export extends false final finally float ' +
+ 'for function goto if implements import in instanceof int interface long native ' +
+ 'new null package private protected public return short static super switch ' +
+ 'synchronized this throw throws transient true try typeof var void volatile while with';
+
+ this.regexList = [
+ { regex: new RegExp('//.*$', 'gm'), css: 'comment' }, // one line comments
+ { regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'), css: 'comment' }, // multiline comments
+ { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // double quoted strings
+ { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // single quoted strings
+ { regex: new RegExp('^\\s*#.*', 'gm'), css: 'preprocessor' }, // preprocessor tags like #region and #endregion
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // keywords
+ ];
+
+ this.CssClass = 'dp-c';
+}
+
+dp.sh.Brushes.JScript.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.JScript.Aliases = ['js', 'jscript', 'javascript'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushJava.js b/src/usr/local/www/code-syntax-highlighter/shBrushJava.js
new file mode 100644
index 0000000..f18aaad
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushJava.js
@@ -0,0 +1,26 @@
+dp.sh.Brushes.Java = function()
+{
+ var keywords = 'abstract assert boolean break byte case catch char class const ' +
+ 'continue default do double else enum extends ' +
+ 'false final finally float for goto if implements import ' +
+ 'instanceof int interface long native new null ' +
+ 'package private protected public return ' +
+ 'short static strictfp super switch synchronized this throw throws true ' +
+ 'transient try void volatile while';
+
+ this.regexList = [
+ { regex: dp.sh.RegexLib.SingleLineCComments, css: 'comment' }, // one line comments
+ { regex: dp.sh.RegexLib.MultiLineCComments, css: 'comment' }, // multiline comments
+ { regex: dp.sh.RegexLib.DoubleQuotedString, css: 'string' }, // strings
+ { regex: dp.sh.RegexLib.SingleQuotedString, css: 'string' }, // strings
+ { regex: new RegExp('\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b', 'gi'), css: 'number' }, // numbers
+ { regex: new RegExp('(?!\\@interface\\b)\\@[\\$\\w]+\\b', 'g'), css: 'annotation' }, // annotation @anno
+ { regex: new RegExp('\\@interface\\b', 'g'), css: 'keyword' }, // @interface keyword
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // java keyword
+ ];
+
+ this.CssClass = 'dp-j';
+}
+
+dp.sh.Brushes.Java.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.Java.Aliases = ['java'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushPhp.js b/src/usr/local/www/code-syntax-highlighter/shBrushPhp.js
new file mode 100644
index 0000000..bcc3e3f
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushPhp.js
@@ -0,0 +1,23 @@
+dp.sh.Brushes.Php = function()
+{
+ var keywords = 'and or xor __FILE__ __LINE__ array as break case ' +
+ 'cfunction class const continue declare default die do echo else ' +
+ 'elseif empty enddeclare endfor endforeach endif endswitch endwhile eval exit ' +
+ 'extends for foreach function global if include include_once isset list ' +
+ 'new old_function print require require_once return static switch unset use ' +
+ 'var while __FUNCTION__ __CLASS__';
+
+ this.regexList = [
+ { regex: new RegExp('//.*$', 'gm'), css: 'comment' }, // one line comments
+ { regex: new RegExp('/\\*[\\s\\S]*?\\*/', 'g'), css: 'comment' }, // multiline comments
+ { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // double quoted strings
+ { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // single quoted strings
+ { regex: new RegExp('\\$\\w+', 'g'), css: 'vars' }, // variables
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // keyword
+ ];
+
+ this.CssClass = 'dp-c';
+}
+
+dp.sh.Brushes.Php.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.Php.Aliases = ['php'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushPython.js b/src/usr/local/www/code-syntax-highlighter/shBrushPython.js
new file mode 100644
index 0000000..96d2196
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushPython.js
@@ -0,0 +1,71 @@
+/* Python 2.3 syntax contributed by Gheorghe Milas */
+dp.sh.Brushes.Python = function()
+{
+ var keywords = 'and assert break class continue def del elif else except exec ' +
+ 'finally for from global if import in is lambda not or object pass print ' +
+ 'raise return try yield while';
+
+ var builtins = 'self __builtin__ __dict__ __future__ __methods__ __members__ __author__ __email__ __version__' +
+ '__class__ __bases__ __import__ __main__ __name__ __doc__ __self__ __debug__ __slots__ ' +
+ 'abs append apply basestring bool buffer callable chr classmethod clear close cmp coerce compile complex ' +
+ 'conjugate copy count delattr dict dir divmod enumerate Ellipsis eval execfile extend False file fileno filter float flush ' +
+ 'get getattr globals has_key hasarttr hash hex id index input insert int intern isatty isinstance isubclass ' +
+ 'items iter keys len list locals long map max min mode oct open ord pop pow property range ' +
+ 'raw_input read readline readlines reduce reload remove repr reverse round seek setattr slice sum ' +
+ 'staticmethod str super tell True truncate tuple type unichr unicode update values write writelines xrange zip';
+
+ var magicmethods = '__abs__ __add__ __and__ __call__ __cmp__ __coerce__ __complex__ __concat__ __contains__ __del__ __delattr__ __delitem__ ' +
+ '__delslice__ __div__ __divmod__ __float__ __getattr__ __getitem__ __getslice__ __hash__ __hex__ __eq__ __le__ __lt__ __gt__ __ge__ ' +
+ '__iadd__ __isub__ __imod__ __idiv__ __ipow__ __iand__ __ior__ __ixor__ __ilshift__ __irshift__ ' +
+ '__invert__ __init__ __int__ __inv__ __iter__ __len__ __long__ __lshift__ __mod__ __mul__ __new__ __neg__ __nonzero__ __oct__ __or__ ' +
+ '__pos__ __pow__ __radd__ __rand__ __rcmp__ __rdiv__ __rdivmod__ __repeat__ __repr__ __rlshift__ __rmod__ __rmul__ ' +
+ '__ror__ __rpow__ __rrshift__ __rshift__ __rsub__ __rxor__ __setattr__ __setitem__ __setslice__ __str__ __sub__ __xor__';
+
+ var exceptions = 'Exception StandardError ArithmeticError LookupError EnvironmentError AssertionError AttributeError EOFError ' +
+ 'FutureWarning IndentationError OverflowWarning PendingDeprecationWarning ReferenceError RuntimeWarning ' +
+ 'SyntaxWarning TabError UnicodeDecodeError UnicodeEncodeError UnicodeTranslateError UserWarning Warning ' +
+ 'IOError ImportError IndexError KeyError KeyboardInterrupt MemoryError NameError NotImplementedError OSError ' +
+ 'RuntimeError StopIteration SyntaxError SystemError SystemExit TypeError UnboundLocalError UnicodeError ValueError ' +
+ 'FloatingPointError OverflowError WindowsError ZeroDivisionError';
+
+ var types = 'NoneType TypeType IntType LongType FloatType ComplexType StringType UnicodeType BufferType TupleType ListType ' +
+ 'DictType FunctionType LambdaType CodeType ClassType UnboundMethodType InstanceType MethodType BuiltinFunctionType BuiltinMethodType ' +
+ 'ModuleType FileType XRangeType TracebackType FrameType SliceType EllipsisType';
+
+ var commonlibs = 'anydbm array asynchat asyncore AST base64 binascii binhex bisect bsddb buildtools bz2 ' +
+ 'BaseHTTPServer Bastion calendar cgi cmath cmd codecs codeop commands compiler copy copy_reg ' +
+ 'cPickle crypt cStringIO csv curses Carbon CGIHTTPServer ConfigParser Cookie datetime dbhash ' +
+ 'dbm difflib dircache distutils doctest DocXMLRPCServer email encodings errno exceptions fcntl ' +
+ 'filecmp fileinput ftplib gc gdbm getopt getpass glob gopherlib gzip heapq htmlentitydefs ' +
+ 'htmllib httplib HTMLParser imageop imaplib imgfile imghdr imp inspect itertools jpeg keyword ' +
+ 'linecache locale logging mailbox mailcap marshal math md5 mhlib mimetools mimetypes mimify mmap ' +
+ 'mpz multifile mutex MimeWriter netrc new nis nntplib nsremote operator optparse os parser pickle pipes ' +
+ 'popen2 poplib posix posixfile pprint preferences profile pstats pwd pydoc pythonprefs quietconsole ' +
+ 'quopri Queue random re readline resource rexec rfc822 rgbimg sched select sets sgmllib sha shelve shutil ' +
+ 'signal site smtplib socket stat statcache string struct symbol sys syslog SimpleHTTPServer ' +
+ 'SimpleXMLRPCServer SocketServer StringIO tabnanny tarfile telnetlib tempfile termios textwrap ' +
+ 'thread threading time timeit token tokenize traceback tty types Tkinter unicodedata unittest ' +
+ 'urllib urllib2 urlparse user UserDict UserList UserString warnings weakref webbrowser whichdb ' +
+ 'xml xmllib xmlrpclib xreadlines zipfile zlib';
+
+ this.regexList = [
+ { regex: new RegExp('#.*$', 'gm'), css: 'comment' }, // comments
+ { regex: new RegExp('^\\s*"""(.|\n)*?"""\\s*$', 'gm'), css: 'docstring' }, // documentation string "
+ { regex: new RegExp('^\\s*\'\'\'(.|\n)*?\'\'\'\\s*$', 'gm'), css: 'docstring' }, // documentation string '
+ { regex: new RegExp('"""(.|\n)*?"""', 'g'), css: 'string' }, // multi-line strings "
+ { regex: new RegExp('\'\'\'(.|\n)*?\'\'\'', 'g'), css: 'string' }, // multi-line strings '
+ { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // strings "
+ { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // strings '
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(this.GetKeywords(builtins), 'gm'), css: 'builtins' }, // builtin objects, functions, methods, magic attributes
+ { regex: new RegExp(this.GetKeywords(magicmethods), 'gm'), css: 'magicmethods' }, // special methods
+ { regex: new RegExp(this.GetKeywords(exceptions), 'gm'), css: 'exceptions' }, // standard exception classes
+ { regex: new RegExp(this.GetKeywords(types), 'gm'), css: 'types' }, // types from types.py
+ { regex: new RegExp(this.GetKeywords(commonlibs), 'gm'), css: 'commonlibs' } // common standard library modules
+ ];
+
+ this.CssClass = 'dp-py';
+}
+
+dp.sh.Brushes.Python.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.Python.Aliases = ['py', 'python'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushRuby.js b/src/usr/local/www/code-syntax-highlighter/shBrushRuby.js
new file mode 100644
index 0000000..fdc5e34
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushRuby.js
@@ -0,0 +1,26 @@
+/* Ruby 1.8.4 syntax contributed by Erik Peterson */
+dp.sh.Brushes.Ruby = function()
+{
+ var keywords = 'alias and BEGIN begin break case class def define_method defined do each else elsif ' +
+ 'END end ensure false for if in module new next nil not or raise redo rescue retry return ' +
+ 'self super then throw true undef unless until when while yield';
+
+ var builtins = 'Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload ' +
+ 'Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol ' +
+ 'ThreadGroup Thread Time TrueClass'
+
+ this.regexList = [
+ { regex: dp.sh.RegexLib.SingleLinePerlComments, css: 'comment' }, // one line comments
+ { regex: dp.sh.RegexLib.DoubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: dp.sh.RegexLib.SingleQuotedString, css: 'string' }, // single quoted strings
+ { regex: new RegExp(':[a-z][A-Za-z0-9_]*', 'g'), css: 'symbol' }, // symbols
+ { regex: new RegExp('[\\$|@|@@]\\w+', 'g'), css: 'variable' }, // $global, @instance, and @@class variables
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(this.GetKeywords(builtins), 'gm'), css: 'builtin' } // builtins
+ ];
+
+ this.CssClass = 'dp-rb';
+}
+
+dp.sh.Brushes.Ruby.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.Ruby.Aliases = ['ruby', 'rails'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushSql.js b/src/usr/local/www/code-syntax-highlighter/shBrushSql.js
new file mode 100644
index 0000000..b52543e
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushSql.js
@@ -0,0 +1,40 @@
+dp.sh.Brushes.Sql = function()
+{
+ var funcs = 'abs avg case cast coalesce convert count current_timestamp ' +
+ 'current_user day isnull left lower month nullif replace right ' +
+ 'session_user space substring sum system_user upper user year';
+
+ var keywords = 'absolute action add after alter as asc at authorization begin bigint ' +
+ 'binary bit by cascade char character check checkpoint close collate ' +
+ 'column commit committed connect connection constraint contains continue ' +
+ 'create cube current current_date current_time cursor database date ' +
+ 'deallocate dec decimal declare default delete desc distinct double drop ' +
+ 'dynamic else end end-exec escape except exec execute false fetch first ' +
+ 'float for force foreign forward free from full function global goto grant ' +
+ 'group grouping having hour ignore index inner insensitive insert instead ' +
+ 'int integer intersect into is isolation key last level load local max min ' +
+ 'minute modify move name national nchar next no numeric of off on only ' +
+ 'open option order out output partial password precision prepare primary ' +
+ 'prior privileges procedure public read real references relative repeatable ' +
+ 'restrict return returns revoke rollback rollup rows rule schema scroll ' +
+ 'second section select sequence serializable set size smallint static ' +
+ 'statistics table temp temporary then time timestamp to top transaction ' +
+ 'translation trigger true truncate uncommitted union unique update values ' +
+ 'varchar varying view when where with work';
+
+ var operators = 'all and any between cross in join like not null or outer some';
+
+ this.regexList = [
+ { regex: new RegExp('--(.*)$', 'gm'), css: 'comment' }, // one line and multiline comments
+ { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // strings
+ { regex: new RegExp('\'(?:\\.|[^\\\'\'])*\'', 'g'), css: 'string' }, // strings
+ { regex: new RegExp(this.GetKeywords(funcs), 'gmi'), css: 'func' }, // functions
+ { regex: new RegExp(this.GetKeywords(operators), 'gmi'), css: 'op' }, // operators and such
+ { regex: new RegExp(this.GetKeywords(keywords), 'gmi'), css: 'keyword' } // keyword
+ ];
+
+ this.CssClass = 'dp-sql';
+}
+
+dp.sh.Brushes.Sql.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.Sql.Aliases = ['sql'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushVb.js b/src/usr/local/www/code-syntax-highlighter/shBrushVb.js
new file mode 100644
index 0000000..197adcc
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushVb.js
@@ -0,0 +1,29 @@
+dp.sh.Brushes.Vb = function()
+{
+ var keywords = 'AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto ' +
+ 'Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate ' +
+ 'CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType ' +
+ 'Date Decimal Declare Default Delegate Dim DirectCast Do Double Each ' +
+ 'Else ElseIf End Enum Erase Error Event Exit False Finally For Friend ' +
+ 'Function Get GetType GoSub GoTo Handles If Implements Imports In ' +
+ 'Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module ' +
+ 'MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing ' +
+ 'NotInheritable NotOverridable Object On Option Optional Or OrElse ' +
+ 'Overloads Overridable Overrides ParamArray Preserve Private Property ' +
+ 'Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume ' +
+ 'Return Select Set Shadows Shared Short Single Static Step Stop String ' +
+ 'Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until ' +
+ 'Variant When While With WithEvents WriteOnly Xor';
+
+ this.regexList = [
+ { regex: new RegExp('\'.*$', 'gm'), css: 'comment' }, // one line comments
+ { regex: new RegExp('"(?:\\.|[^\\""])*"', 'g'), css: 'string' }, // strings
+ { regex: new RegExp('^\\s*#.*', 'gm'), css: 'preprocessor' }, // preprocessor tags like #region and #endregion
+ { regex: new RegExp(this.GetKeywords(keywords), 'gm'), css: 'keyword' } // c# keyword
+ ];
+
+ this.CssClass = 'dp-vb';
+}
+
+dp.sh.Brushes.Vb.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.Vb.Aliases = ['vb', 'vb.net'];
diff --git a/src/usr/local/www/code-syntax-highlighter/shBrushXml.js b/src/usr/local/www/code-syntax-highlighter/shBrushXml.js
new file mode 100644
index 0000000..0286082
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shBrushXml.js
@@ -0,0 +1,61 @@
+dp.sh.Brushes.Xml = function()
+{
+ this.CssClass = 'dp-xml';
+}
+
+dp.sh.Brushes.Xml.prototype = new dp.sh.Highlighter();
+dp.sh.Brushes.Xml.Aliases = ['xml', 'xhtml', 'xslt', 'html', 'xhtml'];
+
+dp.sh.Brushes.Xml.prototype.ProcessRegexList = function()
+{
+ function push(array, value)
+ {
+ array[array.length] = value;
+ }
+
+ /* If only there was a way to get index of a group within a match, the whole XML
+ could be matched with the expression looking something like that:
+
+ (<!\[CDATA\[\s*.*\s*\]\]>)
+ | (<!--\s*.*\s*?-->)
+ | (<)*(\w+)*\s*(\w+)\s*=\s*(".*?"|'.*?'|\w+)(/*>)*
+ | (</?)(.*?)(/?>)
+ */
+ var index = 0;
+ var match = null;
+ var regex = null;
+
+ // Match CDATA in the following format <![ ... [ ... ]]>
+ // <\!\[[\w\s]*?\[(.|\s)*?\]\]>
+ this.GetMatches(new RegExp('<\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\]>', 'gm'), 'cdata');
+
+ // Match comments
+ // <!--\s*.*\s*?-->
+ this.GetMatches(new RegExp('<!--\\s*.*\\s*?-->', 'gm'), 'comments');
+
+ // Match attributes and their values
+ // (\w+)\s*=\s*(".*?"|\'.*?\'|\w+)*
+ regex = new RegExp('([\\w-\.]+)\\s*=\\s*(".*?"|\'.*?\'|\\w+)*', 'gm');
+ while((match = regex.exec(this.code)) != null)
+ {
+ push(this.matches, new dp.sh.Match(match[1], match.index, 'attribute'));
+
+ // if xml is invalid and attribute has no property value, ignore it
+ if(match[2] != undefined)
+ {
+ push(this.matches, new dp.sh.Match(match[2], match.index + match[0].indexOf(match[2]), 'attribute-value'));
+ }
+ }
+
+ // Match opening and closing tag brackets
+ // </*\?*(?!\!)|/*\?*>
+ this.GetMatches(new RegExp('</*\\?*(?!\\!)|/*\\?*>', 'gm'), 'tag');
+
+ // Match tag names
+ // </*\?*\s*(\w+)
+ regex = new RegExp('</*\\?*\\s*([\\w-\.]+)', 'gm');
+ while((match = regex.exec(this.code)) != null)
+ {
+ push(this.matches, new dp.sh.Match(match[1], match.index + match[0].indexOf(match[1]), 'tag-name'));
+ }
+}
diff --git a/src/usr/local/www/code-syntax-highlighter/shCore.js b/src/usr/local/www/code-syntax-highlighter/shCore.js
new file mode 100644
index 0000000..e830438
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shCore.js
@@ -0,0 +1,589 @@
+/**
+ * Code Syntax Highlighter. Version 1.1.0
+ * Copyright (C) 2004 Dream Projections Inc.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ **
+ * Usage example:
+ *
+ * <script src="shCore.js" type="text/javascript"></script>
+ * <script src="shBrushXml.js" type="text/javascript"></script>
+ *
+ * <textarea name="code" language="html">
+ * <img src="myimage.gif" border="0">
+ * </textarea>
+ *
+ * <script>dp.SyntaxHighlighter.HighlightAll('code', 'value');</script>
+ *
+ **
+ * History:
+ * 1.1.0 - March 23rd, 2005
+ * - split brushes into separate files
+ * - now works in Safari
+ * - added missing strings to PHP matches
+ *
+ * 1.0.4 - February 2nd, 2005
+ * - added Delphi & Python
+ * - multi-line comments fixed
+ * - language name can be set through w3c valid 'class' attribute
+ * - HighlightAll(name, [showGutter], [showTools])
+ *
+ * 1.0.3 - December 31th, 2004 (added PHP & SQL)
+ * 1.0.2 - December 28th, 2004 (refactoring with namespaces)
+ * 1.0.1 - December 14th, 2004
+ * 1.0.0 - November 13th, 2004
+ */
+
+// create namespaces
+var dp = {
+ sh : // dp.sh
+ {
+ Utils : {}, // dp.sh.Utils
+ Brushes : {} // dp.sh.Brushes
+ }
+};
+
+dp.sh.Config = {
+ Version : '1.1.0',
+ About : '<html><head><title>About...</title></head><body class="dp-about"><table cellspacing="0"><tr><td class="copy"><div class="para title">dp.SyntaxHighlighter</div><div class="para">Version: {V}</div><div class="para"><a href="http://www.dreamprojections.com/sh/?ref=about" target="_blank">http://www.dreamprojections.com/SyntaxHighlighter</a></div>&copy;2004-2005 Dream Projections Inc. All right reserved.</td></tr><tr><td class="footer"><input type="button" class="close" value="OK" onClick="window.close()"/></td></tr></table></body></html>'
+};
+
+dp.SyntaxHighlighter = dp.sh;
+
+
+
+// opens a new windows and puts the original unformatted source code inside.
+dp.sh.Utils.ViewSource = function(sender)
+{
+ var code = sender.parentNode.originalCode;
+ var wnd = window.open('', '_blank', 'width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=1');
+
+ code = code.replace(/</g, '&lt;');
+
+ wnd.document.write('<pre>' + code + '</pre>');
+ wnd.document.close();
+}
+
+// copies the original source code in to the clipboard (IE only)
+dp.sh.Utils.ToClipboard = function(sender)
+{
+ var code = sender.parentNode.originalCode;
+
+ // This works only for IE. There's a way to make it work with Mozilla as well,
+ // but it requires security settings changed on the client, which isn't by
+ // default, so 99% of users won't have it working anyways.
+ if(window.clipboardData)
+ {
+ window.clipboardData.setData('text', code);
+
+ alert('The code is in your clipboard now.');
+ }
+}
+
+// creates an invisible iframe, puts the original source code inside and prints it
+dp.sh.Utils.PrintSource = function(sender)
+{
+ var td = sender.parentNode;
+ var code = td.processedCode;
+ var iframe = document.createElement('iframe');
+ var doc = null;
+ var wnd =
+
+ // this hides the iframe
+ iframe.style.cssText = 'position:absolute; width:0px; height:0px; left:-5px; top:-5px;';
+
+ td.appendChild(iframe);
+
+ doc = iframe.contentWindow.document;
+ code = code.replace(/</g, '&lt;');
+
+ doc.open();
+ doc.write('<pre>' + code + '</pre>');
+ doc.close();
+
+ iframe.contentWindow.focus();
+ iframe.contentWindow.print();
+
+ td.removeChild(iframe);
+}
+
+dp.sh.Utils.About = function()
+{
+ var wnd = window.open('', '_blank', 'dialog, width=320, height=150');
+ var doc = wnd.document;
+
+ var styles = document.getElementsByTagName('style');
+ var links = document.getElementsByTagName('link');
+
+ doc.write(dp.sh.Config.About.replace('{V}', dp.sh.Config.Version));
+
+ // copy over ALL the styles from the parent page
+ for(var i = 0; i < styles.length; i++)
+ doc.write('<style>' + styles[i].innerHTML + '</style>');
+
+ for(var i = 0; i < links.length; i++)
+ if(links[i].rel.toLowerCase() == 'stylesheet')
+ doc.write('<link type="text/css" rel="stylesheet" href="' + links[i].href + '"></link>');
+
+ doc.close();
+ wnd.focus();
+}
+
+
+
+
+
+// creates a new match object
+dp.sh.Match = function(value, index, css)
+{
+ this.value = value;
+ this.index = index;
+ this.length = value.length;
+ this.css = css;
+}
+
+
+
+
+
+dp.sh.Highlighter = function()
+{
+ this.addGutter = true;
+ this.addControls = true;
+ this.tabsToSpaces = true;
+}
+
+// static callback for the match sorting
+dp.sh.Highlighter.SortCallback = function(m1, m2)
+{
+ // sort matches by index first
+ if(m1.index < m2.index)
+ return -1;
+ else if(m1.index > m2.index)
+ return 1;
+ else
+ {
+ // if index is the same, sort by length
+ if(m1.length < m2.length)
+ return -1;
+ else if(m1.length > m2.length)
+ return 1;
+ }
+ return 0;
+}
+
+// gets a list of all matches for a given regular expression
+dp.sh.Highlighter.prototype.GetMatches = function(regex, css)
+{
+ var index = 0;
+ var match = null;
+
+ while((match = regex.exec(this.code)) != null)
+ {
+ this.matches[this.matches.length] = new dp.sh.Match(match[0], match.index, css);
+ }
+}
+
+dp.sh.Highlighter.prototype.AddBit = function(str, css)
+{
+ var span = document.createElement('span');
+
+ str = str.replace(/&/g, '&amp;');
+ str = str.replace(/ /g, '&nbsp;');
+ str = str.replace(/</g, '&lt;');
+ str = str.replace(/\n/gm, '&nbsp;<br />');
+
+ // when adding a piece of code, check to see if it has line breaks in it
+ // and if it does, wrap individual line breaks with span tags
+ if(css != null)
+ {
+ var regex = new RegExp('<br />', 'gi');
+
+ if(regex.test(str))
+ {
+ var lines = str.split('&nbsp;<br />');
+
+ str = '';
+
+ for(var i = 0; i < lines.length; i++)
+ {
+ span = document.createElement('span');
+ span.className = css;
+ span.innerHTML = lines[i];
+
+ this.div.appendChild(span);
+
+ // don't add a <br /> for the last line
+ if(i + 1 < lines.length)
+ {
+ this.div.appendChild(document.createElement('br'));
+ }
+ }
+ }
+ else
+ {
+ span.className = css;
+ span.innerHTML = str;
+ this.div.appendChild(span);
+ }
+ }
+ else
+ {
+ span.innerHTML = str;
+ this.div.appendChild(span);
+ }
+}
+
+// checks if one match is inside another
+dp.sh.Highlighter.prototype.IsInside = function(match)
+{
+ if(match == null || match.length == 0)
+ {
+ return;
+ }
+
+ for(var i = 0; i < this.matches.length; i++)
+ {
+ var c = this.matches[i];
+
+ if(c == null)
+ {
+ continue;
+ }
+
+ if((match.index > c.index) && (match.index <= c.index + c.length))
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+dp.sh.Highlighter.prototype.ProcessRegexList = function()
+{
+ for(var i = 0; i < this.regexList.length; i++)
+ {
+ this.GetMatches(this.regexList[i].regex, this.regexList[i].css);
+ }
+}
+
+dp.sh.Highlighter.prototype.ProcessSmartTabs = function(code)
+{
+ var lines = code.split('\n');
+ var result = '';
+ var tabSize = 4;
+ var tab = '\t';
+
+ // This function inserts specified amount of spaces in the string
+ // where a tab is while removing that given tab.
+ function InsertSpaces(line, pos, count)
+ {
+ var left = line.substr(0, pos);
+ var right = line.substr(pos + 1, line.length); // pos + 1 will get rid of the tab
+ var spaces = '';
+
+ for(var i = 0; i < count; i++)
+ {
+ spaces += ' ';
+ }
+
+ return left + spaces + right;
+ }
+
+ // This function process one line for 'smart tabs'
+ function ProcessLine(line, tabSize)
+ {
+ if(line.indexOf(tab) == -1)
+ {
+ return line;
+ }
+
+ var pos = 0;
+
+ while((pos = line.indexOf(tab)) != -1)
+ {
+ // This is pretty much all there is to the 'smart tabs' logic.
+ // Based on the position within the line and size of a tab,
+ // calculate the amount of spaces we need to insert.
+ var spaces = tabSize - pos % tabSize;
+
+ line = InsertSpaces(line, pos, spaces);
+ }
+
+ return line;
+ }
+
+ // Go through all the lines and do the 'smart tabs' magic.
+ for(var i = 0; i < lines.length; i++)
+ {
+ var line = lines[i];
+ result += ProcessLine(line, tabSize) + '\n';
+ }
+
+ return result;
+}
+
+dp.sh.Highlighter.prototype.SwitchToTable = function()
+{
+ // Safari fix: for some reason lowercase <br /> isn't getting picked up, even though 'i' is set
+ var lines = this.div.innerHTML.split(/<br \/>/gi);
+ var row = null;
+ var cell = null;
+ var html = '';
+ var pipe = ' | ';
+
+ // creates an anchor to a utility
+ function UtilHref(util, text)
+ {
+ return '<a href="#" onclick="dp.sh.Utils.' + util + '(this); return false;">' + text + '</a>';
+ }
+
+ row = this.table.insertRow(-1);
+
+ if(this.addGutter == true)
+ {
+ cell = row.insertCell(-1);
+ cell.className = 'tools-corner';
+ }
+
+ if(this.addControls == true)
+ {
+ cell = row.insertCell(-1);
+
+ cell.originalCode = this.originalCode;
+ cell.processedCode = this.code;
+
+ cell.className = 'tools';
+ cell.innerHTML = UtilHref('ViewSource', 'view plain') + pipe + UtilHref('PrintSource', 'print');
+
+ if(window.clipboardData)
+ {
+ cell.innerHTML += pipe + UtilHref('ToClipboard', 'copy to clipboard');
+ }
+
+ cell.innerHTML += pipe + UtilHref('About', '?');
+ }
+
+ for(var i = 0; i < lines.length - 1; i++)
+ {
+ row = this.table.insertRow(-1);
+
+ if(this.addGutter == true)
+ {
+ cell = row.insertCell(-1);
+ cell.className = 'gutter';
+ cell.innerHTML = i + 1;
+ }
+
+ cell = row.insertCell(-1);
+ cell.className = 'line';
+ cell.innerHTML = lines[i];
+ }
+
+ this.div.innerHTML = '';
+}
+
+dp.sh.Highlighter.prototype.Highlight = function(code)
+{
+ // This function strips all new lines and spaces
+ // from the beging and end of the string .
+ function Trim(str)
+ {
+ var begining = new RegExp('^[\\s\\n]', 'g');
+ var end = new RegExp('[\\s\\n]$', 'g');
+
+ while(begining.test(str))
+ {
+ str = str.substr(1);
+ }
+
+ while(end.test(str))
+ {
+ str = str.substr(0, str.length - 1);
+ }
+
+ return str;
+ }
+
+ // This function returns a portions of the string
+ // from pos1 to pos2 inclusive.
+ function Copy(string, pos1, pos2)
+ {
+ return string.substr(pos1, pos2 - pos1);
+ }
+
+ var pos = 0;
+
+ this.originalCode = code;
+ this.code = Trim(code);
+ this.div = document.createElement('div');
+ this.table = document.createElement('table');
+ this.matches = new Array();
+
+ if(this.CssClass != null)
+ {
+ this.table.className = this.CssClass;
+ }
+
+ // replace tabs with spaces
+ if(this.tabsToSpaces == true)
+ {
+ this.code = this.ProcessSmartTabs(this.code);
+ }
+
+ this.table.border = 0;
+ this.table.cellSpacing = 0;
+ this.table.cellPadding = 0;
+
+ this.ProcessRegexList();
+
+ // if no matches found, do nothing
+ if(this.matches.length == 0)
+ {
+ return;
+ }
+
+ // sort the matches
+ this.matches = this.matches.sort(dp.sh.Highlighter.SortCallback);
+
+ // The following loop checks to see if any of the matches are inside
+ // of other matches. This process would get rid of highligting strings
+ // inside comments, keywords inside strings and so on.
+ for(var i = 0; i < this.matches.length; i++)
+ {
+ if(this.IsInside(this.matches[i]))
+ {
+ this.matches[i] = null;
+ }
+ }
+
+ // Finally, go through the final list of matches and pull the all
+ // together adding everything in between that isn't a match.
+ for(var i = 0; i < this.matches.length; i++)
+ {
+ var match = this.matches[i];
+
+ if(match == null || match.length == 0)
+ {
+ continue;
+ }
+
+ this.AddBit(Copy(this.code, pos, match.index), null);
+ this.AddBit(match.value, match.css);
+
+ pos = match.index + match.length;
+ }
+
+ this.AddBit(this.code.substr(pos), null);
+
+ this.SwitchToTable();
+}
+
+dp.sh.Highlighter.prototype.GetKeywords = function(str)
+{
+ return '\\b' + str.replace(/ /g, '\\b|\\b') + '\\b';
+}
+
+// highlightes all elements identified by name and gets source code from specified property
+dp.sh.HighlightAll = function(name, showGutter /* optional */, showControls /* optional */)
+{
+ var elements = document.getElementsByName(name);
+ var highlighter = null;
+ var registered = new Object();
+ var propertyName = 'value';
+
+ function FindValue()
+ {
+ var a = arguments;
+
+ for(var i = 0; i < a.length; i++)
+ if(a[i] != null && ((typeof(a[i]) == 'string' && a[i] != '') || (typeof(a[i]) == 'object' && a[i].value != '')))
+ return a[i];
+
+ return null;
+ }
+
+ if(elements == null)
+ {
+ return;
+ }
+
+ // if showGutter isn't set, default to TRUE
+ if(showGutter == null)
+ {
+ showGutter = true;
+ }
+
+ // if showControls isn't set, default to TRUE
+ if(showControls == null)
+ {
+ showControls = true;
+ }
+
+ // register all brushes
+ for(var brush in dp.sh.Brushes)
+ {
+ var aliases = dp.sh.Brushes[brush].Aliases;
+
+ if(aliases == null)
+ {
+ continue;
+ }
+
+ for(var i = 0; i < aliases.length; i++)
+ {
+ registered[aliases[i]] = brush;
+ }
+ }
+
+ for(var i = 0; i < elements.length; i++)
+ {
+ var element = elements[i];
+ var language = FindValue(element.attributes['class'], element.className, element.attributes['language'], element.language);
+
+ if(language == null)
+ continue;
+
+ if(language.value)
+ language = language.value;
+
+ language = (language + '').toLowerCase();
+
+ if(registered[language] == null)
+ {
+ continue;
+ }
+
+ // instantiate a brush
+ highlighter = new dp.sh.Brushes[registered[language]]();
+
+ // hide the original element
+ element.style.display = 'none';
+
+ highlighter.addGutter = showGutter;
+ highlighter.addControls = showControls;
+ highlighter.Highlight(element[propertyName]);
+
+ // place the result table inside a div
+ var div = document.createElement('div');
+
+ div.className = 'dp-highlighter';
+ div.appendChild(highlighter.table);
+
+ element.parentNode.insertBefore(div, element);
+ }
+}
diff --git a/src/usr/local/www/code-syntax-highlighter/shCore.uncompressed.js b/src/usr/local/www/code-syntax-highlighter/shCore.uncompressed.js
new file mode 100644
index 0000000..8d92721
--- /dev/null
+++ b/src/usr/local/www/code-syntax-highlighter/shCore.uncompressed.js
@@ -0,0 +1,636 @@
+/**
+ * Code Syntax Highlighter.
+ * Version 1.3.0
+ * Copyright (C) 2004 Alex Gorbatchev.
+ * http://www.dreamprojections.com/syntaxhighlighter/
+ *
+ * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
+ * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This library 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 Lesser General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+//
+// create namespaces
+//
+var dp = {
+ sh :
+ {
+ Toolbar : {},
+ Utils : {},
+ RegexLib: {},
+ Brushes : {},
+ Strings : {},
+ Version : '1.4.1'
+ }
+};
+
+dp.sh.Strings = {
+ AboutDialog : '<html><head><title>About...</title></head><body class="dp-about"><table cellspacing="0"><tr><td class="copy"><p class="title">dp.SyntaxHighlighter</div><div class="para">Version: {V}</p><p><a href="http://www.dreamprojections.com/syntaxhighlighter/?ref=about" target="_blank">http://www.dreamprojections.com/SyntaxHighlighter</a></p>&copy;2004-2005 Alex Gorbatchev. All right reserved.</td></tr><tr><td class="footer"><input type="button" class="close" value="OK" onClick="window.close()"/></td></tr></table></body></html>'
+};
+
+dp.SyntaxHighlighter = dp.sh;
+
+//
+// Toolbar functions
+//
+
+dp.sh.Toolbar.Commands = {
+ ExpandSource: {
+ label: '+ expand source',
+ check: function(highlighter) { return highlighter.collapse; },
+ func: function(sender, highlighter)
+ {
+ sender.parentNode.removeChild(sender);
+ highlighter.div.className = highlighter.div.className.replace('collapsed', '');
+ }
+ },
+
+ // opens a new windows and puts the original unformatted source code inside.
+ ViewSource: {
+ label: 'view plain',
+ func: function(sender, highlighter)
+ {
+ var code = highlighter.originalCode.replace(/</g, '&lt;');
+ var wnd = window.open('', '_blank', 'width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=1');
+ wnd.document.write('<textarea style="width:99%;height:99%">' + code + '</textarea>');
+ wnd.document.close();
+ }
+ },
+
+ // copies the original source code in to the clipboard (IE only)
+ CopyToClipboard: {
+ label: 'copy to clipboard',
+ check: function() { return window.clipboardData != null; },
+ func: function(sender, highlighter)
+ {
+ window.clipboardData.setData('text', highlighter.originalCode);
+ alert('The code is in your clipboard now');
+ }
+ },
+
+ // creates an invisible iframe, puts the original source code inside and prints it
+ PrintSource: {
+ label: 'print',
+ func: function(sender, highlighter)
+ {
+ var iframe = document.createElement('IFRAME');
+ var doc = null;
+
+ // this hides the iframe
+ iframe.style.cssText = 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;';
+
+ document.body.appendChild(iframe);
+ doc = iframe.contentWindow.document;
+
+ dp.sh.Utils.CopyStyles(doc, window.document);
+ doc.write('<div class="' + highlighter.div.className.replace('collapsed', '') + ' printing">' + highlighter.div.innerHTML + '</div>');
+ doc.close();
+
+ iframe.contentWindow.focus();
+ iframe.contentWindow.print();
+
+ alert('Printing...');
+
+ document.body.removeChild(iframe);
+ }
+ },
+
+ About: {
+ label: '?',
+ func: function(highlighter)
+ {
+ var wnd = window.open('', '_blank', 'dialog,width=300,height=150,scrollbars=0');
+ var doc = wnd.document;
+
+ dp.sh.Utils.CopyStyles(doc, window.document);
+
+ doc.write(dp.sh.Strings.AboutDialog.replace('{V}', dp.sh.Version));
+ doc.close();
+ wnd.focus();
+ }
+ }
+};
+
+// creates a <div /> with all toolbar links
+dp.sh.Toolbar.Create = function(highlighter)
+{
+ var div = document.createElement('div');
+
+ div.className = 'tools';
+
+ for(var name in dp.sh.Toolbar.Commands)
+ {
+ var cmd = dp.sh.Toolbar.Commands[name];
+
+ if(cmd.check != null && !cmd.check(highlighter))
+ continue;
+
+ div.innerHTML += '<a href="#" onclick="dp.sh.Toolbar.Command(\'' + name + '\',this);return false;">' + cmd.label + '</a>';
+ }
+
+ return div;
+}
+
+// executes toolbar command by name
+dp.sh.Toolbar.Command = function(name, sender)
+{
+ var n = sender;
+
+ while(n != null && n.className.indexOf('dp-highlighter') == -1)
+ n = n.parentNode;
+
+ if(n != null)
+ dp.sh.Toolbar.Commands[name].func(sender, n.highlighter);
+}
+
+// copies all <link rel="stylesheet" /> from 'target' window to 'dest'
+dp.sh.Utils.CopyStyles = function(destDoc, sourceDoc)
+{
+ var links = sourceDoc.getElementsByTagName('link');
+
+ for(var i = 0; i < links.length; i++)
+ if(links[i].rel.toLowerCase() == 'stylesheet')
+ destDoc.write('<link type="text/css" rel="stylesheet" href="' + links[i].href + '"></link>');
+}
+
+//
+// Common reusable regular expressions
+//
+dp.sh.RegexLib = {
+ MultiLineCComments : new RegExp('/\\*[\\s\\S]*?\\*/', 'gm'),
+ SingleLineCComments : new RegExp('//.*$', 'gm'),
+ SingleLinePerlComments : new RegExp('#.*$', 'gm'),
+ DoubleQuotedString : new RegExp('"(?:\\.|(\\\\\\")|[^\\""])*"','g'),
+ SingleQuotedString : new RegExp("'(?:\\.|(\\\\\\')|[^\\''])*'", 'g')
+};
+
+//
+// Match object
+//
+dp.sh.Match = function(value, index, css)
+{
+ this.value = value;
+ this.index = index;
+ this.length = value.length;
+ this.css = css;
+}
+
+//
+// Highlighter object
+//
+dp.sh.Highlighter = function()
+{
+ this.noGutter = false;
+ this.addControls = true;
+ this.collapse = false;
+ this.tabsToSpaces = true;
+ this.wrapColumn = 80;
+ this.showColumns = true;
+}
+
+// static callback for the match sorting
+dp.sh.Highlighter.SortCallback = function(m1, m2)
+{
+ // sort matches by index first
+ if(m1.index < m2.index)
+ return -1;
+ else if(m1.index > m2.index)
+ return 1;
+ else
+ {
+ // if index is the same, sort by length
+ if(m1.length < m2.length)
+ return -1;
+ else if(m1.length > m2.length)
+ return 1;
+ }
+ return 0;
+}
+
+dp.sh.Highlighter.prototype.createElement = function(name)
+{
+ var result = document.createElement(name);
+ result.highlighter = this;
+ return result;
+}
+
+// gets a list of all matches for a given regular expression
+dp.sh.Highlighter.prototype.GetMatches = function(regex, css)
+{
+ var index = 0;
+ var match = null;
+
+ while((match = regex.exec(this.code)) != null)
+ this.matches[this.matches.length] = new dp.sh.Match(match[0], match.index, css);
+}
+
+dp.sh.Highlighter.prototype.AddBit = function(str, css)
+{
+ if(str == null || str.length == 0)
+ return;
+
+ var span = this.createElement('span');
+
+ str = str.replace(/&/g, '&amp;');
+ str = str.replace(/ /g, '&nbsp;');
+ str = str.replace(/</g, '&lt;');
+ str = str.replace(/\n/gm, '&nbsp;<br />');
+
+ // when adding a piece of code, check to see if it has line breaks in it
+ // and if it does, wrap individual line breaks with span tags
+ if(css != null)
+ {
+ var regex = new RegExp('<br />', 'gi');
+
+ if(regex.test(str))
+ {
+ var lines = str.split('&nbsp;<br />');
+
+ str = '';
+
+ for(var i = 0; i < lines.length; i++)
+ {
+ span = this.createElement('span');
+ span.className = css;
+ span.innerHTML = lines[i];
+
+ this.div.appendChild(span);
+
+ // don't add a <br /> for the last line
+ if(i + 1 < lines.length)
+ this.div.appendChild(this.createElement('br'));
+ }
+ }
+ else
+ {
+ span.className = css;
+ span.innerHTML = str;
+ this.div.appendChild(span);
+ }
+ }
+ else
+ {
+ span.innerHTML = str;
+ this.div.appendChild(span);
+ }
+}
+
+// checks if one match is inside any other match
+dp.sh.Highlighter.prototype.IsInside = function(match)
+{
+ if(match == null || match.length == 0)
+ return false;
+
+ for(var i = 0; i < this.matches.length; i++)
+ {
+ var c = this.matches[i];
+
+ if(c == null)
+ continue;
+
+ if((match.index > c.index) && (match.index < c.index + c.length))
+ return true;
+ }
+
+ return false;
+}
+
+dp.sh.Highlighter.prototype.ProcessRegexList = function()
+{
+ for(var i = 0; i < this.regexList.length; i++)
+ this.GetMatches(this.regexList[i].regex, this.regexList[i].css);
+}
+
+dp.sh.Highlighter.prototype.ProcessSmartTabs = function(code)
+{
+ var lines = code.split('\n');
+ var result = '';
+ var tabSize = 4;
+ var tab = '\t';
+
+ // This function inserts specified amount of spaces in the string
+ // where a tab is while removing that given tab.
+ function InsertSpaces(line, pos, count)
+ {
+ var left = line.substr(0, pos);
+ var right = line.substr(pos + 1, line.length); // pos + 1 will get rid of the tab
+ var spaces = '';
+
+ for(var i = 0; i < count; i++)
+ spaces += ' ';
+
+ return left + spaces + right;
+ }
+
+ // This function process one line for 'smart tabs'
+ function ProcessLine(line, tabSize)
+ {
+ if(line.indexOf(tab) == -1)
+ return line;
+
+ var pos = 0;
+
+ while((pos = line.indexOf(tab)) != -1)
+ {
+ // This is pretty much all there is to the 'smart tabs' logic.
+ // Based on the position within the line and size of a tab,
+ // calculate the amount of spaces we need to insert.
+ var spaces = tabSize - pos % tabSize;
+
+ line = InsertSpaces(line, pos, spaces);
+ }
+
+ return line;
+ }
+
+ // Go through all the lines and do the 'smart tabs' magic.
+ for(var i = 0; i < lines.length; i++)
+ result += ProcessLine(lines[i], tabSize) + '\n';
+
+ return result;
+}
+
+dp.sh.Highlighter.prototype.SwitchToList = function()
+{
+ // thanks to Lachlan Donald from SitePoint.com for this <br /> tag fix.
+ var html = this.div.innerHTML.replace(/<(br)\/?>/gi, '\n');
+ var lines = html.split('\n');
+
+ if(this.addControls == true)
+ this.bar.appendChild(dp.sh.Toolbar.Create(this));
+
+ // add columns ruler
+ if(this.showColumns)
+ {
+ var div = this.createElement('div');
+ var columns = this.createElement('div');
+ var showEvery = 10;
+ var i = 1;
+
+ while(i <= 150)
+ {
+ if(i % showEvery == 0)
+ {
+ div.innerHTML += i;
+ i += (i + '').length;
+ }
+ else
+ {
+ div.innerHTML += '&middot;';
+ i++;
+ }
+ }
+
+ columns.className = 'columns';
+ columns.appendChild(div);
+ this.bar.appendChild(columns);
+ }
+
+ for(var i = 0, lineIndex = this.firstLine; i < lines.length - 1; i++, lineIndex++)
+ {
+ var li = this.createElement('li');
+ var span = this.createElement('span');
+
+ // uses .line1 and .line2 css styles for alternating lines
+ li.className = (i % 2 == 0) ? 'alt' : '';
+ span.innerHTML = lines[i] + '&nbsp;';
+
+ li.appendChild(span);
+ this.ol.appendChild(li);
+ }
+
+ this.div.innerHTML = '';
+}
+
+dp.sh.Highlighter.prototype.Highlight = function(code)
+{
+ function Trim(str)
+ {
+ return str.replace(/^\s*(.*?)[\s\n]*$/g, '$1');
+ }
+
+ function Chop(str)
+ {
+ return str.replace(/\n*$/, '').replace(/^\n*/, '');
+ }
+
+ function Unindent(str)
+ {
+ var lines = str.split('\n');
+ var indents = new Array();
+ var regex = new RegExp('^\\s*', 'g');
+ var min = 1000;
+
+ // go through every line and check for common number of indents
+ for(var i = 0; i < lines.length && min > 0; i++)
+ {
+ if(Trim(lines[i]).length == 0)
+ continue;
+
+ var matches = regex.exec(lines[i]);
+
+ if(matches != null && matches.length > 0)
+ min = Math.min(matches[0].length, min);
+ }
+
+ // trim minimum common number of white space from the begining of every line
+ if(min > 0)
+ for(var i = 0; i < lines.length; i++)
+ lines[i] = lines[i].substr(min);
+
+ return lines.join('\n');
+ }
+
+ // This function returns a portions of the string from pos1 to pos2 inclusive
+ function Copy(string, pos1, pos2)
+ {
+ return string.substr(pos1, pos2 - pos1);
+ }
+
+ var pos = 0;
+
+ this.originalCode = code;
+ this.code = Chop(Unindent(code));
+ this.div = this.createElement('div');
+ this.bar = this.createElement('div');
+ this.ol = this.createElement('ol');
+ this.matches = new Array();
+
+ this.div.className = 'dp-highlighter';
+ this.div.highlighter = this;
+
+ this.bar.className = 'bar';
+
+ // set the first line
+ this.ol.start = this.firstLine;
+
+ if(this.CssClass != null)
+ this.ol.className = this.CssClass;
+
+ if(this.collapse)
+ this.div.className += ' collapsed';
+
+ if(this.noGutter)
+ this.div.className += ' nogutter';
+
+ // replace tabs with spaces
+ if(this.tabsToSpaces == true)
+ this.code = this.ProcessSmartTabs(this.code);
+
+ this.ProcessRegexList();
+
+ // if no matches found, add entire code as plain text
+ if(this.matches.length == 0)
+ {
+ this.AddBit(this.code, null);
+ this.SwitchToList();
+ this.div.appendChild(this.ol);
+ return;
+ }
+
+ // sort the matches
+ this.matches = this.matches.sort(dp.sh.Highlighter.SortCallback);
+
+ // The following loop checks to see if any of the matches are inside
+ // of other matches. This process would get rid of highligted strings
+ // inside comments, keywords inside strings and so on.
+ for(var i = 0; i < this.matches.length; i++)
+ if(this.IsInside(this.matches[i]))
+ this.matches[i] = null;
+
+ // Finally, go through the final list of matches and pull the all
+ // together adding everything in between that isn't a match.
+ for(var i = 0; i < this.matches.length; i++)
+ {
+ var match = this.matches[i];
+
+ if(match == null || match.length == 0)
+ continue;
+
+ this.AddBit(Copy(this.code, pos, match.index), null);
+ this.AddBit(match.value, match.css);
+
+ pos = match.index + match.length;
+ }
+
+ this.AddBit(this.code.substr(pos), null);
+
+ this.SwitchToList();
+ this.div.appendChild(this.bar);
+ this.div.appendChild(this.ol);
+}
+
+dp.sh.Highlighter.prototype.GetKeywords = function(str)
+{
+ return '\\b' + str.replace(/ /g, '\\b|\\b') + '\\b';
+}
+
+// highlightes all elements identified by name and gets source code from specified property
+dp.sh.HighlightAll = function(name, showGutter /* optional */, showControls /* optional */, collapseAll /* optional */, firstLine /* optional */, showColumns /* optional */)
+{
+ function FindValue()
+ {
+ var a = arguments;
+
+ for(var i = 0; i < a.length; i++)
+ {
+ if(a[i] == null)
+ continue;
+
+ if(typeof(a[i]) == 'string' && a[i] != '')
+ return a[i] + '';
+
+ if(typeof(a[i]) == 'object' && a[i].value != '')
+ return a[i].value + '';
+ }
+
+ return null;
+ }
+
+ function IsOptionSet(value, list)
+ {
+ for(var i = 0; i < list.length; i++)
+ if(list[i] == value)
+ return true;
+
+ return false;
+ }
+
+ function GetOptionValue(name, list, defaultValue)
+ {
+ var regex = new RegExp('^' + name + '\\[(\\w+)\\]$', 'gi');
+ var matches = null;
+
+ for(var i = 0; i < list.length; i++)
+ if((matches = regex.exec(list[i])) != null)
+ return matches[1];
+
+ return defaultValue;
+ }
+
+ var elements = document.getElementsByName(name);
+ var highlighter = null;
+ var registered = new Object();
+ var propertyName = 'value';
+
+ // if no code blocks found, leave
+ if(elements == null)
+ return;
+
+ // register all brushes
+ for(var brush in dp.sh.Brushes)
+ {
+ var aliases = dp.sh.Brushes[brush].Aliases;
+
+ if(aliases == null)
+ continue;
+
+ for(var i = 0; i < aliases.length; i++)
+ registered[aliases[i]] = brush;
+ }
+
+ for(var i = 0; i < elements.length; i++)
+ {
+ var element = elements[i];
+ var options = FindValue(
+ element.attributes['class'], element.className,
+ element.attributes['language'], element.language
+ );
+ var language = '';
+
+ if(options == null)
+ continue;
+
+ options = options.split(':');
+
+ language = options[0].toLowerCase();
+
+ if(registered[language] == null)
+ continue;
+
+ // instantiate a brush
+ highlighter = new dp.sh.Brushes[registered[language]]();
+
+ // hide the original element
+ element.style.display = 'none';
+
+ highlighter.noGutter = (showGutter == null) ? IsOptionSet('nogutter', options) : !showGutter;
+ highlighter.addControls = (showControls == null) ? !IsOptionSet('nocontrols', options) : showControls;
+ highlighter.collapse = (collapseAll == null) ? IsOptionSet('collapse', options) : collapseAll;
+ highlighter.showColumns = (showColumns == null) ? IsOptionSet('showcolumns', options) : showColumns;
+
+ // first line idea comes from Andrew Collington, thanks!
+ highlighter.firstLine = (firstLine == null) ? parseInt(GetOptionValue('firstline', options, 1)) : firstLine;
+
+ highlighter.Highlight(element[propertyName]);
+
+ element.parentNode.insertBefore(highlighter.div, element);
+ }
+}
diff --git a/src/usr/local/www/crash_reporter.php b/src/usr/local/www/crash_reporter.php
new file mode 100644
index 0000000..3b00e47
--- /dev/null
+++ b/src/usr/local/www/crash_reporter.php
@@ -0,0 +1,156 @@
+<?php
+/* $Id$ */
+/*
+ crash_reporter.php
+ part of pfSense
+ Copyright (C) 2011 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: header
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-crash-reporter
+##|*NAME=Crash reporter
+##|*DESCR=Uploads crash reports to pfSense and or deletes crash reports.
+##|*MATCH=crash_reporter.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require("captiveportal.inc");
+
+define("FILE_SIZE", 450000);
+
+function upload_crash_report($files) {
+ global $g;
+ $post = array();
+ $counter = 0;
+ foreach ($files as $file) {
+ $post["file{$counter}"] = "@{$file}";
+ $counter++;
+ }
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_HEADER, 0);
+ curl_setopt($ch, CURLOPT_VERBOSE, 0);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($ch, CURLOPT_USERAGENT, $g['product_name'] . '/' . $g['product_version']);
+ curl_setopt($ch, CURLOPT_URL, $g['crashreporterurl']);
+ curl_setopt($ch, CURLOPT_POST, true);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
+ $response = curl_exec($ch);
+ return $response;
+}
+
+function output_crash_reporter_html($crash_reports) {
+ echo "<p><strong>" . gettext("Unfortunately we have detected a programming bug.") . "</strong></p>";
+ echo "<p>" . gettext("Would you like to submit the programming debug logs to the pfSense developers for inspection?") . "</p>";
+ echo "<p><i>" . gettext("Please double check the contents to ensure you are comfortable sending this information before clicking Yes.") . "</i></p>";
+ echo "<p>" . gettext("Contents of crash reports") . ":<br />";
+ echo "<textarea readonly=\"readonly\" rows=\"40\" cols=\"65\" name=\"crashreports\">{$crash_reports}</textarea></p>";
+ echo "<p><input name=\"Submit\" type=\"submit\" class=\"formbtn\" value=\"" . gettext("Yes") . "\" />" . gettext(" - Submit this to the developers for inspection") . "</p>";
+ echo "<p><input name=\"Submit\" type=\"submit\" class=\"formbtn\" value=\"" . gettext("No") . "\" />" . gettext(" - Just delete the crash report and take me back to the Dashboard") . "</p>";
+ echo "</form>";
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Crash reporter"));
+include('head.inc');
+
+$crash_report_header = "Crash report begins. Anonymous machine information:\n\n";
+$crash_report_header .= php_uname("m") . "\n";
+$crash_report_header .= php_uname("r") . "\n";
+$crash_report_header .= php_uname("v") . "\n";
+$crash_report_header .= "\nCrash report details:\n";
+
+exec("/usr/bin/grep -vi warning /tmp/PHP_errors.log", $php_errors);
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+
+ <form action="crash_reporter.php" method="post">
+
+<?php
+ if (gettext($_POST['Submit']) == "Yes") {
+ echo gettext("Processing...");
+ if (!is_dir("/var/crash")) {
+ mkdir("/var/crash", 0750, true);
+ }
+ @file_put_contents("/var/crash/crashreport_header.txt", $crash_report_header);
+ if (file_exists("/tmp/PHP_errors.log")) {
+ copy("/tmp/PHP_errors.log", "/var/crash/PHP_errors.log");
+ }
+ exec("find /var/crash -type l -exec rm {} +");
+ exec("/usr/bin/gzip /var/crash/*");
+ $files_to_upload = glob("/var/crash/*");
+ echo "<br/>";
+ echo gettext("Uploading...");
+ ob_flush();
+ flush();
+ if (is_array($files_to_upload)) {
+ $resp = upload_crash_report($files_to_upload);
+ array_map('unlink', glob("/var/crash/*"));
+ // Erase the contents of the PHP error log
+ fclose(fopen("/tmp/PHP_errors.log", 'w'));
+ echo "<br/>";
+ print_r($resp);
+ echo "<p><a href=\"/\">" . gettext("Continue") . "</a>" . gettext(" and delete crash report files from local disk.") . "</p>";
+ } else {
+ echo "Could not find any crash files.";
+ }
+ } else if (gettext($_POST['Submit']) == "No") {
+ array_map('unlink', glob("/var/crash/*"));
+ // Erase the contents of the PHP error log
+ fclose(fopen("/tmp/PHP_errors.log", 'w'));
+ header("Location: /");
+ exit;
+ } else {
+ $crash_files = glob("/var/crash/*");
+ $crash_reports = $crash_report_header;
+ if (count($php_errors) > 0) {
+ $crash_reports .= "\nPHP Errors:\n";
+ $crash_reports .= implode("\n", $php_errors) . "\n\n";
+ }
+ if (is_array($crash_files)) {
+ foreach ($crash_files as $cf) {
+ if (filesize($cf) < FILE_SIZE) {
+ $crash_reports .= "\nFilename: {$cf}\n";
+ $crash_reports .= file_get_contents($cf);
+ }
+ }
+ } else {
+ echo "Could not locate any crash data.";
+ }
+ output_crash_reporter_html($crash_reports);
+ }
+?>
+
+<?php include("fend.inc"); ?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/csrf/csrf-magic.js b/src/usr/local/www/csrf/csrf-magic.js
new file mode 100644
index 0000000..d358b0f
--- /dev/null
+++ b/src/usr/local/www/csrf/csrf-magic.js
@@ -0,0 +1,186 @@
+/**
+ * @file
+ *
+ * Rewrites XMLHttpRequest to automatically send CSRF token with it. In theory
+ * plays nice with other JavaScript libraries, needs testing though.
+ */
+
+// Here are the basic overloaded method definitions
+// The wrapper must be set BEFORE onreadystatechange is written to, since
+// a bug in ActiveXObject prevents us from properly testing for it.
+CsrfMagic = function(real) {
+ // try to make it ourselves, if you didn't pass it
+ if (!real) try { real = new XMLHttpRequest; } catch (e) {;}
+ if (!real) try { real = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) {;}
+ if (!real) try { real = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {;}
+ if (!real) try { real = new ActiveXObject('Msxml2.XMLHTTP.4.0'); } catch (e) {;}
+ this.csrf = real;
+ // properties
+ var csrfMagic = this;
+ real.onreadystatechange = function() {
+ csrfMagic._updateProps();
+ return csrfMagic.onreadystatechange ? csrfMagic.onreadystatechange() : null;
+ };
+ csrfMagic._updateProps();
+}
+
+CsrfMagic.prototype = {
+
+ open: function(method, url, async, username, password) {
+ if (method == 'POST') this.csrf_isPost = true;
+ // deal with Opera bug, thanks jQuery
+ if (username) return this.csrf_open(method, url, async, username, password);
+ else return this.csrf_open(method, url, async);
+ },
+ csrf_open: function(method, url, async, username, password) {
+ if (username) return this.csrf.open(method, url, async, username, password);
+ else return this.csrf.open(method, url, async);
+ },
+
+ send: function(data) {
+ if (!this.csrf_isPost) return this.csrf_send(data);
+ prepend = csrfMagicName + '=' + csrfMagicToken + '&';
+ if (this.csrf_purportedLength === undefined) {
+ this.csrf_setRequestHeader("Content-length", this.csrf_purportedLength + prepend.length);
+ delete this.csrf_purportedLength;
+ }
+ delete this.csrf_isPost;
+ return this.csrf_send(prepend + data);
+ },
+ csrf_send: function(data) {
+ return this.csrf.send(data);
+ },
+
+ setRequestHeader: function(header, value) {
+ // We have to auto-set this at the end, since we don't know how long the
+ // nonce is when added to the data.
+ if (this.csrf_isPost && header == "Content-length") {
+ this.csrf_purportedLength = value;
+ return;
+ }
+ return this.csrf_setRequestHeader(header, value);
+ },
+ csrf_setRequestHeader: function(header, value) {
+ return this.csrf.setRequestHeader(header, value);
+ },
+
+ abort: function() {
+ return this.csrf.abort();
+ },
+ getAllResponseHeaders: function() {
+ return this.csrf.getAllResponseHeaders();
+ },
+ getResponseHeader: function(header) {
+ return this.csrf.getResponseHeader(header);
+ } // ,
+}
+
+// proprietary
+CsrfMagic.prototype._updateProps = function() {
+ this.readyState = this.csrf.readyState;
+ if (this.readyState == 4) {
+ this.responseText = this.csrf.responseText;
+ this.responseXML = this.csrf.responseXML;
+ this.status = this.csrf.status;
+ this.statusText = this.csrf.statusText;
+ }
+}
+CsrfMagic.process = function(base) {
+ var prepend = csrfMagicName + '=' + csrfMagicToken;
+ if (base) return prepend + '&' + base;
+ return prepend;
+}
+// callback function for when everything on the page has loaded
+CsrfMagic.end = function() {
+ // This rewrites forms AGAIN, so in case buffering didn't work this
+ // certainly will.
+ forms = document.getElementsByTagName('form');
+ for (var i = 0; i < forms.length; i++) {
+ form = forms[i];
+ if (form.method.toUpperCase() !== 'POST') continue;
+ if (form.elements[csrfMagicName]) continue;
+ var input = document.createElement('input');
+ input.setAttribute('name', csrfMagicName);
+ input.setAttribute('value', csrfMagicToken);
+ input.setAttribute('type', 'hidden');
+ form.appendChild(input);
+ }
+}
+
+// Sets things up for Mozilla/Opera/nice browsers
+// We very specifically match against Internet Explorer, since they haven't
+// implemented prototypes correctly yet.
+if (window.XMLHttpRequest && window.XMLHttpRequest.prototype && '\v' != 'v') {
+ var x = XMLHttpRequest.prototype;
+ var c = CsrfMagic.prototype;
+
+ // Save the original functions
+ x.csrf_open = x.open;
+ x.csrf_send = x.send;
+ x.csrf_setRequestHeader = x.setRequestHeader;
+
+ // Notice that CsrfMagic is itself an instantiatable object, but only
+ // open, send and setRequestHeader are necessary as decorators.
+ x.open = c.open;
+ x.send = c.send;
+ x.setRequestHeader = c.setRequestHeader;
+} else {
+ // The only way we can do this is by modifying a library you have been
+ // using. We support YUI, script.aculo.us, prototype, MooTools,
+ // jQuery, Ext and Dojo.
+ if (window.jQuery) {
+ // jQuery didn't implement a new XMLHttpRequest function, so we have
+ // to do this the hard way.
+ jQuery.csrf_ajax = jQuery.ajax;
+ jQuery.ajax = function( s ) {
+ if (s.type && s.type.toUpperCase() == 'POST') {
+ s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
+ if ( s.data && s.processData && typeof s.data != "string" ) {
+ s.data = jQuery.param(s.data);
+ }
+ s.data = CsrfMagic.process(s.data);
+ }
+ return jQuery.csrf_ajax( s );
+ }
+ }
+ if (window.Prototype) {
+ // This works for script.aculo.us too
+ Ajax.csrf_getTransport = Ajax.getTransport;
+ Ajax.getTransport = function() {
+ return new CsrfMagic(Ajax.csrf_getTransport());
+ }
+ }
+ if (window.MooTools) {
+ Browser.csrf_Request = Browser.Request;
+ Browser.Request = function () {
+ return new CsrfMagic(Browser.csrf_Request());
+ }
+ }
+ if (window.YAHOO) {
+ // old YUI API
+ YAHOO.util.Connect.csrf_createXhrObject = YAHOO.util.Connect.createXhrObject;
+ YAHOO.util.Connect.createXhrObject = function (transaction) {
+ obj = YAHOO.util.Connect.csrf_createXhrObject(transaction);
+ obj.conn = new CsrfMagic(obj.conn);
+ return obj;
+ }
+ }
+ if (window.Ext) {
+ // Ext can use other js libraries as loaders, so it has to come last
+ // Ext's implementation is pretty identical to Yahoo's, but we duplicate
+ // it for comprehensiveness's sake.
+ Ext.lib.Ajax.csrf_createXhrObject = Ext.lib.Ajax.createXhrObject;
+ Ext.lib.Ajax.createXhrObject = function (transaction) {
+ obj = Ext.lib.Ajax.csrf_createXhrObject(transaction);
+ obj.conn = new CsrfMagic(obj.conn);
+ return obj;
+ }
+ }
+ if (window.dojo) {
+ // NOTE: this doesn't work with latest dojo
+ dojo.csrf__xhrObj = dojo._xhrObj;
+ dojo._xhrObj = function () {
+ return new CsrfMagic(dojo.csrf__xhrObj());
+ }
+ }
+}
diff --git a/src/usr/local/www/csrf/csrf-magic.php b/src/usr/local/www/csrf/csrf-magic.php
new file mode 100644
index 0000000..58f4eba
--- /dev/null
+++ b/src/usr/local/www/csrf/csrf-magic.php
@@ -0,0 +1,403 @@
+<?php
+
+/**
+ * @file
+ *
+ * csrf-magic is a PHP library that makes adding CSRF-protection to your
+ * web applications a snap. No need to modify every form or create a database
+ * of valid nonces; just include this file at the top of every
+ * web-accessible page (or even better, your common include file included
+ * in every page), and forget about it! (There are, of course, configuration
+ * options for advanced users).
+ *
+ * This library is PHP4 and PHP5 compatible.
+ */
+
+// CONFIGURATION:
+
+/**
+ * By default, when you include this file csrf-magic will automatically check
+ * and exit if the CSRF token is invalid. This will defer executing
+ * csrf_check() until you're ready. You can also pass false as a parameter to
+ * that function, in which case the function will not exit but instead return
+ * a boolean false if the CSRF check failed. This allows for tighter integration
+ * with your system.
+ */
+$GLOBALS['csrf']['defer'] = false;
+
+/**
+ * This is the amount of seconds you wish to allow before any token becomes
+ * invalid; the default is two hours, which should be more than enough for
+ * most websites.
+ */
+$GLOBALS['csrf']['expires'] = 7200;
+
+/**
+ * Callback function to execute when there's the CSRF check fails and
+ * $fatal == true (see csrf_check). This will usually output an error message
+ * about the failure.
+ */
+$GLOBALS['csrf']['callback'] = 'csrf_callback';
+
+/**
+ * Whether or not to include our JavaScript library which also rewrites
+ * AJAX requests on this domain. Set this to the web path. This setting only works
+ * with supported JavaScript libraries in Internet Explorer; see README.txt for
+ * a list of supported libraries.
+ */
+$GLOBALS['csrf']['rewrite-js'] = false;
+
+/**
+ * A secret key used when hashing items. Please generate a random string and
+ * place it here. If you change this value, all previously generated tokens
+ * will become invalid.
+ */
+$GLOBALS['csrf']['secret'] = '';
+// nota bene: library code should use csrf_get_secret() and not access
+// this global directly
+
+/**
+ * Set this to false to disable csrf-magic's output handler, and therefore,
+ * its rewriting capabilities. If you're serving non HTML content, you should
+ * definitely set this false.
+ */
+$GLOBALS['csrf']['rewrite'] = true;
+
+/**
+ * Whether or not to use IP addresses when binding a user to a token. This is
+ * less reliable and less secure than sessions, but is useful when you need
+ * to give facilities to anonymous users and do not wish to maintain a database
+ * of valid keys.
+ */
+$GLOBALS['csrf']['allow-ip'] = true;
+
+/**
+ * If this information is available, use the cookie by this name to determine
+ * whether or not to allow the request. This is a shortcut implementation
+ * very similar to 'key', but we randomly set the cookie ourselves.
+ */
+$GLOBALS['csrf']['cookie'] = '__csrf_cookie';
+
+/**
+ * If this information is available, set this to a unique identifier (it
+ * can be an integer or a unique username) for the current "user" of this
+ * application. The token will then be globally valid for all of that user's
+ * operations, but no one else. This requires that 'secret' be set.
+ */
+$GLOBALS['csrf']['user'] = false;
+
+/**
+ * This is an arbitrary secret value associated with the user's session. This
+ * will most probably be the contents of a cookie, as an attacker cannot easily
+ * determine this information. Warning: If the attacker knows this value, they
+ * can easily spoof a token. This is a generic implementation; sessions should
+ * work in most cases.
+ *
+ * Why would you want to use this? Lets suppose you have a squid cache for your
+ * website, and the presence of a session cookie bypasses it. Let's also say
+ * you allow anonymous users to interact with the website; submitting forms
+ * and AJAX. Previously, you didn't have any CSRF protection for anonymous users
+ * and so they never got sessions; you don't want to start using sessions either,
+ * otherwise you'll bypass the Squid cache. Setup a different cookie for CSRF
+ * tokens, and have Squid ignore that cookie for get requests, for anonymous
+ * users. (If you haven't guessed, this scheme was(?) used for MediaWiki).
+ */
+$GLOBALS['csrf']['key'] = false;
+
+/**
+ * The name of the magic CSRF token that will be placed in all forms, i.e.
+ * the contents of <input type="hidden" name="$name" value="CSRF-TOKEN" />
+ */
+$GLOBALS['csrf']['input-name'] = '__csrf_magic';
+
+/**
+ * Set this to false if your site must work inside of frame/iframe elements,
+ * but do so at your own risk: this configuration protects you against CSS
+ * overlay attacks that defeat tokens.
+ */
+$GLOBALS['csrf']['frame-breaker'] = true;
+
+/**
+ * Whether or not CSRF Magic should be allowed to start a new session in order
+ * to determine the key.
+ */
+$GLOBALS['csrf']['auto-session'] = true;
+
+/**
+ * Whether or not csrf-magic should produce XHTML style tags.
+ */
+$GLOBALS['csrf']['xhtml'] = true;
+
+// FUNCTIONS:
+
+// Don't edit this!
+$GLOBALS['csrf']['version'] = '1.0.4';
+
+/**
+ * Rewrites <form> on the fly to add CSRF tokens to them. This can also
+ * inject our JavaScript library.
+ */
+function csrf_ob_handler($buffer, $flags) {
+ // Even though the user told us to rewrite, we should do a quick heuristic
+ // to check if the page is *actually* HTML. We don't begin rewriting until
+ // we hit the first <html tag.
+ static $is_html = false;
+ if (!$is_html) {
+ // not HTML until proven otherwise
+ if (stripos($buffer, '<html') !== false) {
+ $is_html = true;
+ } else {
+ return $buffer;
+ }
+ }
+ $tokens = csrf_get_tokens();
+ $name = $GLOBALS['csrf']['input-name'];
+ $endslash = $GLOBALS['csrf']['xhtml'] ? ' /' : '';
+ $input = "<input type='hidden' name='$name' value=\"$tokens\"$endslash>";
+ $buffer = preg_replace('#(<form[^>]*method\s*=\s*["\']post["\'][^>]*>)#i', '$1' . $input, $buffer);
+ if ($GLOBALS['csrf']['frame-breaker']) {
+ $buffer = str_ireplace('</head>', '<script type="text/javascript">if (top != self) {top.location.href = self.location.href;}</script></head>', $buffer);
+ }
+ if ($js = $GLOBALS['csrf']['rewrite-js']) {
+ $buffer = str_ireplace(
+ '</head>',
+ '<script type="text/javascript">'.
+ 'var csrfMagicToken = "'.$tokens.'";'.
+ 'var csrfMagicName = "'.$name.'";</script>'.
+ '<script src="'.$js.'" type="text/javascript"></script></head>',
+ $buffer
+ );
+ $script = '<script type="text/javascript">CsrfMagic.end();</script>';
+ $buffer = str_ireplace('</body>', $script . '</body>', $buffer, $count);
+ if (!$count) {
+ $buffer .= $script;
+ }
+ }
+ return $buffer;
+}
+
+/**
+ * Checks if this is a post request, and if it is, checks if the nonce is valid.
+ * @param bool $fatal Whether or not to fatally error out if there is a problem.
+ * @return True if check passes or is not necessary, false if failure.
+ */
+function csrf_check($fatal = true) {
+ if ($_SERVER['REQUEST_METHOD'] !== 'POST') return true;
+ csrf_start();
+ $name = $GLOBALS['csrf']['input-name'];
+ $ok = false;
+ $tokens = '';
+ do {
+ if (!isset($_POST[$name])) break;
+ // we don't regenerate a token and check it because some token creation
+ // schemes are volatile.
+ $tokens = $_POST[$name];
+ if (!csrf_check_tokens($tokens)) break;
+ $ok = true;
+ } while (false);
+ if ($fatal && !$ok) {
+ $callback = $GLOBALS['csrf']['callback'];
+ if (trim($tokens, 'A..Za..z0..9:;,') !== '') $tokens = 'hidden';
+ $callback($tokens);
+ exit;
+ }
+ return $ok;
+}
+
+/**
+ * Retrieves a valid token(s) for a particular context. Tokens are separated
+ * by semicolons.
+ */
+function csrf_get_tokens() {
+ $has_cookies = !empty($_COOKIE);
+
+ // $ip implements a composite key, which is sent if the user hasn't sent
+ // any cookies. It may or may not be used, depending on whether or not
+ // the cookies "stick"
+ $secret = csrf_get_secret();
+ if (!$has_cookies && $secret) {
+ // :TODO: Harden this against proxy-spoofing attacks
+ $ip = ';ip:' . csrf_hash($_SERVER['IP_ADDRESS']);
+ } else {
+ $ip = '';
+ }
+ csrf_start();
+
+ // These are "strong" algorithms that don't require per se a secret
+ if (session_id()) return 'sid:' . csrf_hash(session_id()) . $ip;
+ if ($GLOBALS['csrf']['cookie']) {
+ $val = csrf_generate_secret();
+ setcookie($GLOBALS['csrf']['cookie'], $val);
+ return 'cookie:' . csrf_hash($val) . $ip;
+ }
+ if ($GLOBALS['csrf']['key']) return 'key:' . csrf_hash($GLOBALS['csrf']['key']) . $ip;
+ // These further algorithms require a server-side secret
+ if (!$secret) return 'invalid';
+ if ($GLOBALS['csrf']['user'] !== false) {
+ return 'user:' . csrf_hash($GLOBALS['csrf']['user']);
+ }
+ if ($GLOBALS['csrf']['allow-ip']) {
+ return ltrim($ip, ';');
+ }
+ return 'invalid';
+}
+
+function csrf_flattenpost($data) {
+ $ret = array();
+ foreach($data as $n => $v) {
+ $ret = array_merge($ret, csrf_flattenpost2(1, $n, $v));
+ }
+ return $ret;
+}
+function csrf_flattenpost2($level, $key, $data) {
+ if(!is_array($data)) return array($key => $data);
+ $ret = array();
+ foreach($data as $n => $v) {
+ $nk = $level >= 1 ? $key."[$n]" : "[$n]";
+ $ret = array_merge($ret, csrf_flattenpost2($level+1, $nk, $v));
+ }
+ return $ret;
+}
+
+/**
+ * @param $tokens is safe for HTML consumption
+ */
+function csrf_callback($tokens) {
+ // (yes, $tokens is safe to echo without escaping)
+ header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
+ $data = '';
+ foreach (csrf_flattenpost($_POST) as $key => $value) {
+ if ($key == $GLOBALS['csrf']['input-name']) continue;
+ $data .= '<input type="hidden" name="'.htmlspecialchars($key).'" value="'.htmlspecialchars($value).'" />';
+ }
+ echo "<html><head><title>CSRF check failed</title></head>
+ <body>
+ <p>CSRF check failed. Your form session may have expired, or you may not have
+ cookies enabled.</p>
+ <form method='post' action=''>$data<input type='submit' value='Try again' /></form>
+ <p>Debug: $tokens</p></body></html>
+";
+}
+
+/**
+ * Checks if a composite token is valid. Outward facing code should use this
+ * instead of csrf_check_token()
+ */
+function csrf_check_tokens($tokens) {
+ if (is_string($tokens)) $tokens = explode(';', $tokens);
+ foreach ($tokens as $token) {
+ if (csrf_check_token($token)) return true;
+ }
+ return false;
+}
+
+/**
+ * Checks if a token is valid.
+ */
+function csrf_check_token($token) {
+ if (strpos($token, ':') === false) return false;
+ list($type, $value) = explode(':', $token, 2);
+ if (strpos($value, ',') === false) return false;
+ list($x, $time) = explode(',', $token, 2);
+ if ($GLOBALS['csrf']['expires']) {
+ if (time() > $time + $GLOBALS['csrf']['expires']) return false;
+ }
+ switch ($type) {
+ case 'sid':
+ return $value === csrf_hash(session_id(), $time);
+ case 'cookie':
+ $n = $GLOBALS['csrf']['cookie'];
+ if (!$n) return false;
+ if (!isset($_COOKIE[$n])) return false;
+ return $value === csrf_hash($_COOKIE[$n], $time);
+ case 'key':
+ if (!$GLOBALS['csrf']['key']) return false;
+ return $value === csrf_hash($GLOBALS['csrf']['key'], $time);
+ // We could disable these 'weaker' checks if 'key' was set, but
+ // that doesn't make me feel good then about the cookie-based
+ // implementation.
+ case 'user':
+ if (!csrf_get_secret()) return false;
+ if ($GLOBALS['csrf']['user'] === false) return false;
+ return $value === csrf_hash($GLOBALS['csrf']['user'], $time);
+ case 'ip':
+ if (!csrf_get_secret()) return false;
+ // do not allow IP-based checks if the username is set, or if
+ // the browser sent cookies
+ if ($GLOBALS['csrf']['user'] !== false) return false;
+ if (!empty($_COOKIE)) return false;
+ if (!$GLOBALS['csrf']['allow-ip']) return false;
+ return $value === csrf_hash($_SERVER['IP_ADDRESS'], $time);
+ }
+ return false;
+}
+
+/**
+ * Sets a configuration value.
+ */
+function csrf_conf($key, $val) {
+ if (!isset($GLOBALS['csrf'][$key])) {
+ trigger_error('No such configuration ' . $key, E_USER_WARNING);
+ return;
+ }
+ $GLOBALS['csrf'][$key] = $val;
+}
+
+/**
+ * Starts a session if we're allowed to.
+ */
+function csrf_start() {
+ if ($GLOBALS['csrf']['auto-session'] && !session_id()) {
+ session_start();
+ }
+}
+
+/**
+ * Retrieves the secret, and generates one if necessary.
+ */
+function csrf_get_secret() {
+ if ($GLOBALS['csrf']['secret']) return $GLOBALS['csrf']['secret'];
+ $dir = dirname(__FILE__);
+ $file = $dir . '/csrf-secret.php';
+ $secret = '';
+ if (file_exists($file)) {
+ include $file;
+ return $secret;
+ }
+ if (is_writable($dir)) {
+ $secret = csrf_generate_secret();
+ $fh = fopen($file, 'w');
+ fwrite($fh, '<?php $secret = "'.$secret.'";' . PHP_EOL);
+ fclose($fh);
+ return $secret;
+ }
+ return '';
+}
+
+/**
+ * Generates a random string as the hash of time, microtime, and mt_rand.
+ */
+function csrf_generate_secret($len = 32) {
+ $r = '';
+ for ($i = 0; $i < 32; $i++) {
+ $r .= chr(mt_rand(0, 255));
+ }
+ $r .= time() . microtime();
+ return sha1($r);
+}
+
+/**
+ * Generates a hash/expiry double. If time isn't set it will be calculated
+ * from the current time.
+ */
+function csrf_hash($value, $time = null) {
+ if (!$time) $time = time();
+ return sha1(csrf_get_secret() . $value . $time) . ',' . $time;
+}
+
+// Load user configuration
+if (function_exists('csrf_startup')) csrf_startup();
+// Initialize our handler
+if ($GLOBALS['csrf']['rewrite']) ob_start('csrf_ob_handler');
+// Perform check
+if (!$GLOBALS['csrf']['defer']) csrf_check();
diff --git a/src/usr/local/www/css/table.css b/src/usr/local/www/css/table.css
new file mode 100644
index 0000000..3393db3
--- /dev/null
+++ b/src/usr/local/www/css/table.css
@@ -0,0 +1,46 @@
+/* Element CSS Definitions for (MultiRow-)tables
+if theme changes are needed include a table.css in the /themes/yourtheme/ */
+.listMR {
+ background-color: #DDD;
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listMRlr {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listMRr {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listMRodd {
+ background-color: #FFFFFF;
+}
+.listMReven {
+ background-color: #F0F0F0;
+}
+.listMRDescriptionL {
+ border-right: none;
+ border-bottom: 2px solid #999999;
+}
+.listMRDescriptionR {
+ border-left: none;
+ border-bottom: 2px solid #999999;
+}
+.ellipsis {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
diff --git a/src/usr/local/www/diag_arp.php b/src/usr/local/www/diag_arp.php
new file mode 100644
index 0000000..e5615f4
--- /dev/null
+++ b/src/usr/local/www/diag_arp.php
@@ -0,0 +1,365 @@
+<?php
+/*
+ diag_arp.php
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright (C) 2004-2009 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2005 Paul Taylor (paultaylor@winndixie.com) and Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /bin/cat /usr/sbin/arp
+ pfSense_MODULE: arp
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-arptable
+##|*NAME=Diagnostics: ARP Table page
+##|*DESCR=Allow access to the 'Diagnostics: ARP Table' page.
+##|*MATCH=diag_arp.php*
+##|-PRIV
+
+@ini_set('zlib.output_compression', 0);
+@ini_set('implicit_flush', 1);
+
+require("guiconfig.inc");
+
+function leasecmp($a, $b) {
+ return strcmp($a[$_GET['order']], $b[$_GET['order']]);
+}
+
+function adjust_gmt($dt) {
+ $ts = strtotime($dt . " GMT");
+ return strftime("%Y/%m/%d %H:%M:%S", $ts);
+}
+
+function remove_duplicate($array, $field) {
+ foreach ($array as $sub) {
+ $cmp[] = $sub[$field];
+ }
+ $unique = array_unique($cmp);
+ foreach ($unique as $k => $rien) {
+ $new[] = $array[$k];
+ }
+ return $new;
+}
+
+// Define path to AWK
+$awk = "/usr/bin/awk";
+
+// Read in leases file
+$leasesfile = "{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases";
+
+/* this pattern sticks comments into a single array item */
+$cleanpattern = "'{ gsub(\"#.*\", \"\");} { gsub(\";\", \"\"); print;}'";
+
+/* We then split the leases file by } */
+$splitpattern = "'BEGIN { RS=\"}\";} {for (i=1; i<=NF; i++) printf \"%s \", \$i; printf \"}\\n\";}'";
+
+/* stuff the leases file in a proper format into an array by line */
+exec("cat {$leasesfile} | {$awk} {$cleanpattern} | {$awk} {$splitpattern}", $leases_content);
+$leases_count = count($leases_content);
+
+$pools = array();
+$leases = array();
+$i = 0;
+$l = 0;
+$p = 0;
+// Put everything together again
+while ($i < $leases_count) {
+ /* split the line by space */
+ $data = explode(" ", $leases_content[$i]);
+ /* walk the fields */
+ $f = 0;
+ $fcount = count($data);
+ /* with less then 20 fields there is nothing useful */
+ if ($fcount < 20) {
+ $i++;
+ continue;
+ }
+ while ($f < $fcount) {
+ switch ($data[$f]) {
+ case "failover":
+ $pools[$p]['name'] = $data[$f+2];
+ $pools[$p]['mystate'] = $data[$f+7];
+ $pools[$p]['peerstate'] = $data[$f+14];
+ $pools[$p]['mydate'] = $data[$f+10];
+ $pools[$p]['mydate'] .= " " . $data[$f+11];
+ $pools[$p]['peerdate'] = $data[$f+17];
+ $pools[$p]['peerdate'] .= " " . $data[$f+18];
+ $p++;
+ $i++;
+ continue 3;
+ case "lease":
+ $leases[$l]['ip'] = $data[$f+1];
+ $leases[$l]['type'] = "dynamic";
+ $f = $f+2;
+ break;
+ case "starts":
+ $leases[$l]['start'] = $data[$f+2];
+ $leases[$l]['start'] .= " " . $data[$f+3];
+ $f = $f+3;
+ break;
+ case "ends":
+ $leases[$l]['end'] = $data[$f+2];
+ $leases[$l]['end'] .= " " . $data[$f+3];
+ $f = $f+3;
+ break;
+ case "tstp":
+ $f = $f+3;
+ break;
+ case "tsfp":
+ $f = $f+3;
+ break;
+ case "atsfp":
+ $f = $f+3;
+ break;
+ case "cltt":
+ $f = $f+3;
+ break;
+ case "binding":
+ switch ($data[$f+2]) {
+ case "active":
+ $leases[$l]['act'] = "active";
+ break;
+ case "free":
+ $leases[$l]['act'] = "expired";
+ $leases[$l]['online'] = "offline";
+ break;
+ case "backup":
+ $leases[$l]['act'] = "reserved";
+ $leases[$l]['online'] = "offline";
+ break;
+ }
+ $f = $f+1;
+ break;
+ case "next":
+ /* skip the next binding statement */
+ $f = $f+3;
+ break;
+ case "rewind":
+ /* skip the rewind binding statement */
+ $f = $f+3;
+ break;
+ case "hardware":
+ $leases[$l]['mac'] = $data[$f+2];
+ /* check if it's online and the lease is active */
+ if ($leases[$l]['act'] == "active") {
+ $online = exec("/usr/sbin/arp -an |/usr/bin/awk '/{$leases[$l]['ip']}/ {print}'|wc -l");
+ if ($online == 1) {
+ $leases[$l]['online'] = 'online';
+ } else {
+ $leases[$l]['online'] = 'offline';
+ }
+ }
+ $f = $f+2;
+ break;
+ case "client-hostname":
+ if ($data[$f+1] <> "") {
+ $leases[$l]['hostname'] = preg_replace('/"/', '', $data[$f+1]);
+ } else {
+ $hostname = gethostbyaddr($leases[$l]['ip']);
+ if ($hostname <> "") {
+ $leases[$l]['hostname'] = $hostname;
+ }
+ }
+ $f = $f+1;
+ break;
+ case "uid":
+ $f = $f+1;
+ break;
+ }
+ $f++;
+ }
+ $l++;
+ $i++;
+}
+
+/* remove duplicate items by mac address */
+if (count($leases) > 0) {
+ $leases = remove_duplicate($leases, "ip");
+}
+
+if (count($pools) > 0) {
+ $pools = remove_duplicate($pools, "name");
+ asort($pools);
+}
+
+// Put this in an easy to use form
+$dhcpmac = array();
+$dhcpip = array();
+
+foreach ($leases as $value) {
+ $dhcpmac[$value['mac']] = $value['hostname'];
+ $dhcpip[$value['ip']] = $value['hostname'];
+}
+
+exec("/usr/sbin/arp -an", $rawdata);
+
+$i = 0;
+
+/* if list */
+$ifdescrs = get_configured_interface_with_descr();
+
+foreach ($ifdescrs as $key => $interface) {
+ $thisif = convert_friendly_interface_to_real_interface_name($key);
+ if (!empty($thisif)) {
+ $hwif[$thisif] = $interface;
+ }
+}
+
+$data = array();
+foreach ($rawdata as $line) {
+ $elements = explode(' ', $line);
+
+ if ($elements[3] != "(incomplete)") {
+ $arpent = array();
+ $arpent['ip'] = trim(str_replace(array('(', ')'), '', $elements[1]));
+ $arpent['mac'] = trim($elements[3]);
+ $arpent['interface'] = trim($elements[5]);
+ $data[] = $arpent;
+ }
+}
+
+function _getHostName($mac, $ip) {
+ global $dhcpmac, $dhcpip;
+
+ if ($dhcpmac[$mac]) {
+ return $dhcpmac[$mac];
+ } else if ($dhcpip[$ip]) {
+ return $dhcpip[$ip];
+ } else {
+ exec("host -W 1 " . escapeshellarg($ip), $output);
+ if (preg_match('/.*pointer ([A-Za-z_0-9.-]+)\..*/', $output[0], $matches)) {
+ if ($matches[1] <> $ip) {
+ return $matches[1];
+ }
+ }
+ }
+ return "";
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("ARP Table"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+
+<div id="loading">
+ <img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /><?= gettext("Loading, please wait..."); ?>
+ <p>&nbsp;</p>
+</div>
+
+<?php
+
+// Flush buffers out to client so that they see Loading, please wait....
+for ($i = 0; $i < ob_get_level(); $i++) {
+ ob_end_flush();
+}
+ob_implicit_flush(1);
+
+// Resolve hostnames and replace Z_ with "". The intention
+// is to sort the list by hostnames, alpha and then the non
+// resolvable addresses will appear last in the list.
+$dnsavailable=1;
+$dns = trim(_getHostName("", "8.8.8.8"));
+if ($dns == "") {
+ $dns = trim(_getHostName("", "8.8.4.4"));
+ if ($dns == "") {
+ $dnsavailable = 0;
+ }
+}
+
+foreach ($data as &$entry) {
+ if ($dnsavailable) {
+ $dns = trim(_getHostName($entry['mac'], $entry['ip']));
+ } else {
+ $dns="";
+ }
+ if (trim($dns)) {
+ $entry['dnsresolve'] = "$dns";
+ } else {
+ $entry['dnsresolve'] = "Z_ ";
+ }
+}
+
+// Sort the data alpha first
+$data = msort($data, "dnsresolve");
+
+// Load MAC-Manufacturer table
+$mac_man = load_mac_manufacturer_table();
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag arp">
+ <tr>
+ <td>
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="tabcont">
+ <tr>
+ <td class="listhdrr"><?= gettext("IP address"); ?></td>
+ <td class="listhdrr"><?= gettext("MAC address"); ?></td>
+ <td class="listhdrr"><?= gettext("Hostname"); ?></td>
+ <td class="listhdr"><?= gettext("Interface"); ?></td>
+ <td class="list"></td>
+ </tr>
+ <?php foreach ($data as $entry): ?>
+ <tr>
+ <td class="listlr"><?=$entry['ip'];?></td>
+ <td class="listr">
+ <?php
+ $mac=trim($entry['mac']);
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
+ print $mac;
+ if (isset($mac_man[$mac_hi])) { print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>"; }
+ ?>
+ </td>
+ <td class="listr">
+ <?php
+ echo trim(str_replace("Z_ ", "", $entry['dnsresolve']));
+ ?>
+ </td>
+ <td class="listr"><?=$hwif[$entry['interface']];?></td>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td><br /><?= gettext("NOTE: Local IPv6 peers use") ?> <a href="diag_ndp.php"><?= gettext("NDP") ?></a> <?= gettext("instead of ARP") ?>.</td>
+ </tr>
+</table>
+
+<?php include("fend.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+ jQuery('#loading').html('');
+//]]>
+</script>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_authentication.php b/src/usr/local/www/diag_authentication.php
new file mode 100644
index 0000000..d0b81d5
--- /dev/null
+++ b/src/usr/local/www/diag_authentication.php
@@ -0,0 +1,138 @@
+<?php
+/*
+ diag_authentication.php
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: auth
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-authentication
+##|*NAME=Diagnostics: Authentication page
+##|*DESCR=Allow access to the 'Diagnostics: Authentication' page.
+##|*MATCH=diag_authentication.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("PEAR.inc");
+require_once("radius.inc");
+
+if ($_POST) {
+ $pconfig = $_POST;
+ unset($input_errors);
+
+ $authcfg = auth_get_authserver($_POST['authmode']);
+ if (!$authcfg) {
+ $input_errors[] = $_POST['authmode'] . " " . gettext("is not a valid authentication server");
+ }
+
+ if (empty($_POST['username']) || empty($_POST['passwordfld'])) {
+ $input_errors[] = gettext("A username and password must be specified.");
+ }
+
+ if (!$input_errors) {
+ $attributes = array();
+ if (authenticate_user($_POST['username'], $_POST['passwordfld'], $authcfg, $attributes)) {
+ $savemsg = gettext("User") . ": " . $_POST['username'] . " " . gettext("authenticated successfully.");
+ $groups = getUserGroups($_POST['username'], $authcfg, $attributes);
+ $savemsg .= "<br />" . gettext("This user is a member of these groups") . ": <br />";
+ foreach ($groups as $group) {
+ $savemsg .= "{$group} ";
+ }
+ } else {
+ $input_errors[] = gettext("Authentication failed.");
+ }
+ }
+}
+$pgtitle = array(gettext("Diagnostics"), gettext("Authentication"));
+$shortcut_section = "authentication";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors);?>
+<?php if ($savemsg) print_info_box($savemsg);?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag authentication">
+ <tr>
+ <td class="tabnavtbl"></td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <form id="iform" name="iform" action="diag_authentication.php" method="post">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="test">
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Authentication Server"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="authmode" id="authmode" class="formselect" >
+ <?php
+ $auth_servers = auth_get_authserver_list();
+ foreach ($auth_servers as $auth_server):
+ $selected = "";
+ if ($auth_server['name'] == $pconfig['authmode']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$auth_server['name'];?>" <?=$selected;?>><?=$auth_server['name'];?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Username"); ?></td>
+ <td width="78%" class="vtable">
+ <input class="formfld unknown" size="20" id="username" name="username" value="<?=htmlspecialchars($pconfig['username']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Password"); ?></td>
+ <td width="78%" class="vtable">
+ <input class="formfld pwd" type="password" size="20" id="passwordfld" name="passwordfld" value="<?=htmlspecialchars($pconfig['passwordfld']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="save" name="save" type="submit" class="formbtn" value="<?=gettext("Test");?>" />
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+ </td>
+ </tr>
+</table>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_backup.php b/src/usr/local/www/diag_backup.php
new file mode 100644
index 0000000..6e454a4
--- /dev/null
+++ b/src/usr/local/www/diag_backup.php
@@ -0,0 +1,818 @@
+<?php
+/* $Id$ */
+/*
+ diag_backup.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/shutdown
+ pfSense_MODULE: backup
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-backup/restore
+##|*NAME=Diagnostics: Backup/restore page
+##|*DESCR=Allow access to the 'Diagnostics: Backup/restore' page.
+##|*MATCH=diag_backup.php*
+##|-PRIV
+
+/* Allow additional execution time 0 = no limit. */
+ini_set('max_execution_time', '0');
+ini_set('max_input_time', '0');
+
+/* omit no-cache headers because it confuses IE with file downloads */
+$omit_nocacheheaders = true;
+$nocsrf = true;
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$rrddbpath = "/var/db/rrd";
+$rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+
+function rrd_data_xml() {
+ global $rrddbpath;
+ global $rrdtool;
+
+ $result = "\t<rrddata>\n";
+ $rrd_files = glob("{$rrddbpath}/*.rrd");
+ $xml_files = array();
+ foreach ($rrd_files as $rrd_file) {
+ $basename = basename($rrd_file);
+ $xml_file = preg_replace('/\.rrd$/', ".xml", $rrd_file);
+ exec("$rrdtool dump '{$rrd_file}' '{$xml_file}'");
+ $xml_data = file_get_contents($xml_file);
+ unlink($xml_file);
+ if ($xml_data !== false) {
+ $result .= "\t\t<rrddatafile>\n";
+ $result .= "\t\t\t<filename>{$basename}</filename>\n";
+ $result .= "\t\t\t<xmldata>" . base64_encode(gzdeflate($xml_data)) . "</xmldata>\n";
+ $result .= "\t\t</rrddatafile>\n";
+ }
+ }
+ $result .= "\t</rrddata>\n";
+ return $result;
+}
+
+function restore_rrddata() {
+ global $config, $g, $rrdtool, $input_errors;
+ foreach ($config['rrddata']['rrddatafile'] as $rrd) {
+ if ($rrd['xmldata']) {
+ $rrd_file = "{$g['vardb_path']}/rrd/{$rrd['filename']}";
+ $xml_file = preg_replace('/\.rrd$/', ".xml", $rrd_file);
+ if (file_put_contents($xml_file, gzinflate(base64_decode($rrd['xmldata']))) === false) {
+ log_error("Cannot write $xml_file");
+ continue;
+ }
+ $output = array();
+ $status = null;
+ exec("$rrdtool restore -f '{$xml_file}' '{$rrd_file}'", $output, $status);
+ if ($status) {
+ log_error("rrdtool restore -f '{$xml_file}' '{$rrd_file}' failed returning {$status}.");
+ continue;
+ }
+ unlink($xml_file);
+ } else if ($rrd['data']) {
+ $rrd_file = "{$g['vardb_path']}/rrd/{$rrd['filename']}";
+ $rrd_fd = fopen($rrd_file, "w");
+ if (!$rrd_fd) {
+ log_error("Cannot write $rrd_file");
+ continue;
+ }
+ $data = base64_decode($rrd['data']);
+ /* Try to decompress the data. */
+ $dcomp = @gzinflate($data);
+ if ($dcomp) {
+ /* If the decompression worked, write the decompressed data */
+ if (fwrite($rrd_fd, $dcomp) === false) {
+ log_error("fwrite $rrd_file failed");
+ continue;
+ }
+ } else {
+ /* If the decompression failed, it wasn't compressed, so write raw data */
+ if (fwrite($rrd_fd, $data) === false) {
+ log_error("fwrite $rrd_file failed");
+ continue;
+ }
+ }
+ if (fclose($rrd_fd) === false) {
+ log_error("fclose $rrd_file failed");
+ continue;
+ }
+ }
+ }
+}
+
+function add_base_packages_menu_items() {
+ global $g, $config;
+ $base_packages = explode(",", $g['base_packages']);
+ $modified_config = false;
+ foreach ($base_packages as $bp) {
+ $basepkg_path = "/usr/local/pkg/{$bp}";
+ $tmpinfo = pathinfo($basepkg_path, PATHINFO_EXTENSION);
+ if ($tmpinfo['extension'] == "xml" && file_exists($basepkg_path)) {
+ $pkg_config = parse_xml_config_pkg($basepkg_path, "packagegui");
+ if ($pkg_config['menu'] != "") {
+ if (is_array($pkg_config['menu'])) {
+ foreach ($pkg_config['menu'] as $menu) {
+ if (is_array($config['installedpackages']['menu'])) {
+ foreach ($config['installedpackages']['menu'] as $amenu) {
+ if ($amenu['name'] == $menu['name']) {
+ continue;
+ }
+ }
+ }
+ $config['installedpackages']['menu'][] = $menu;
+ $modified_config = true;
+ }
+ }
+ $static_output .= "done.\n";
+ update_output_window($static_output);
+ }
+ }
+ }
+ if ($modified_config) {
+ write_config(gettext("Restored base_package menus after configuration restore."));
+ $config = parse_config(true);
+ }
+}
+
+function remove_bad_chars($string) {
+ return preg_replace('/[^a-z_0-9]/i', '', $string);
+}
+
+function check_and_returnif_section_exists($section) {
+ global $config;
+ if (is_array($config[$section])) {
+ return true;
+ }
+ return false;
+}
+
+function spit_out_select_items($name, $showall) {
+ global $config;
+
+ $areas = array("aliases" => gettext("Aliases"),
+ "captiveportal" => gettext("Captive Portal"),
+ "voucher" => gettext("Captive Portal Vouchers"),
+ "dnsmasq" => gettext("DNS Forwarder"),
+ "unbound" => gettext("DNS Resolver"),
+ "dhcpd" => gettext("DHCP Server"),
+ "dhcpdv6" => gettext("DHCPv6 Server"),
+ "filter" => gettext("Firewall Rules"),
+ "interfaces" => gettext("Interfaces"),
+ "ipsec" => gettext("IPSEC"),
+ "nat" => gettext("NAT"),
+ "openvpn" => gettext("OpenVPN"),
+ "installedpackages" => gettext("Package Manager"),
+ "pptpd" => gettext("PPTP Server"),
+ "rrddata" => gettext("RRD Data"),
+ "cron" => gettext("Scheduled Tasks"),
+ "syslog" => gettext("Syslog"),
+ "system" => gettext("System"),
+ "staticroutes" => gettext("Static routes"),
+ "sysctl" => gettext("System tunables"),
+ "snmpd" => gettext("SNMP Server"),
+ "shaper" => gettext("Traffic Shaper"),
+ "vlans" => gettext("VLANS"),
+ "wol" => gettext("Wake on LAN")
+ );
+
+ $select = "<select name=\"{$name}\" id=\"{$name}\">";
+ $select .= "<option value=\"\">" . gettext("ALL") . "</option>";
+
+ if ($showall == true) {
+ foreach ($areas as $area => $areaname) {
+ $select .= "<option value=\"{$area}\">{$areaname}</option>\n";
+ }
+ } else {
+ foreach ($areas as $area => $areaname) {
+ if ($area === "rrddata" || check_and_returnif_section_exists($area) == true) {
+ $select .= "<option value=\"{$area}\">{$areaname}</option>\n";
+ }
+ }
+ }
+
+ $select .= "</select>\n";
+
+ if ($name === "backuparea") {
+ $select .= <<<END_SCRIPT_BLOCK
+ <script type="text/javascript">
+ //<![CDATA[
+ jQuery(function (\$) {
+ $("#{$name}").change(function () {
+ backuparea_change(this);
+ }).trigger("change");
+ });
+ //]]>
+ </script>
+END_SCRIPT_BLOCK;
+ }
+
+ echo $select;
+
+}
+
+if ($_POST['apply']) {
+ ob_flush();
+ flush();
+ conf_mount_rw();
+ clear_subsystem_dirty("restore");
+ conf_mount_ro();
+ exit;
+}
+
+if ($_POST) {
+ unset($input_errors);
+ if (stristr($_POST['Submit'], gettext("Restore configuration"))) {
+ $mode = "restore";
+ } else if (stristr($_POST['Submit'], gettext("Reinstall"))) {
+ $mode = "reinstallpackages";
+ } else if (stristr($_POST['Submit'], gettext("Clear Package Lock"))) {
+ $mode = "clearpackagelock";
+ } else if (stristr($_POST['Submit'], gettext("Download"))) {
+ $mode = "download";
+ } else if (stristr($_POST['Submit'], gettext("Restore version"))) {
+ $mode = "restore_ver";
+ }
+ if ($_POST["nopackages"] <> "") {
+ $options = "nopackages";
+ }
+ if ($_POST["ver"] <> "") {
+ $ver2restore = $_POST["ver"];
+ }
+ if ($mode) {
+ if ($mode == "download") {
+ if ($_POST['encrypt']) {
+ if (!$_POST['encrypt_password'] || !$_POST['encrypt_passconf']) {
+ $input_errors[] = gettext("You must supply and confirm the password for encryption.");
+ }
+ if ($_POST['encrypt_password'] != $_POST['encrypt_passconf']) {
+ $input_errors[] = gettext("The supplied 'Password' and 'Confirm' field values must match.");
+ }
+ }
+
+ if (!$input_errors) {
+
+ //$lockbckp = lock('config');
+
+ $host = "{$config['system']['hostname']}.{$config['system']['domain']}";
+ $name = "config-{$host}-".date("YmdHis").".xml";
+ $data = "";
+
+ if ($options == "nopackages") {
+ if (!$_POST['backuparea']) {
+ /* backup entire configuration */
+ $data = file_get_contents("{$g['conf_path']}/config.xml");
+ } else {
+ /* backup specific area of configuration */
+ $data = backup_config_section($_POST['backuparea']);
+ $name = "{$_POST['backuparea']}-{$name}";
+ }
+ $sfn = "{$g['tmp_path']}/config.xml.nopkg";
+ file_put_contents($sfn, $data);
+ exec("sed '/<installedpackages>/,/<\/installedpackages>/d' {$sfn} > {$sfn}-new");
+ $data = file_get_contents($sfn . "-new");
+ } else {
+ if (!$_POST['backuparea']) {
+ /* backup entire configuration */
+ $data = file_get_contents("{$g['conf_path']}/config.xml");
+ } else if ($_POST['backuparea'] === "rrddata") {
+ $data = rrd_data_xml();
+ $name = "{$_POST['backuparea']}-{$name}";
+ } else {
+ /* backup specific area of configuration */
+ $data = backup_config_section($_POST['backuparea']);
+ $name = "{$_POST['backuparea']}-{$name}";
+ }
+ }
+
+ //unlock($lockbckp);
+
+ /*
+ * Backup RRD Data
+ */
+ if ($_POST['backuparea'] !== "rrddata" && !$_POST['donotbackuprrd']) {
+ $rrd_data_xml = rrd_data_xml();
+ $closing_tag = "</" . $g['xml_rootobj'] . ">";
+ $data = str_replace($closing_tag, $rrd_data_xml . $closing_tag, $data);
+ }
+
+ if ($_POST['encrypt']) {
+ $data = encrypt_data($data, $_POST['encrypt_password']);
+ tagfile_reformat($data, $data, "config.xml");
+ }
+
+ $size = strlen($data);
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$name}");
+ header("Content-Length: $size");
+ if (isset($_SERVER['HTTPS'])) {
+ header('Pragma: ');
+ header('Cache-Control: ');
+ } else {
+ header("Pragma: private");
+ header("Cache-Control: private, must-revalidate");
+ }
+ echo $data;
+
+ exit;
+ }
+ }
+
+ if ($mode == "restore") {
+ if ($_POST['decrypt']) {
+ if (!$_POST['decrypt_password'] || !$_POST['decrypt_passconf']) {
+ $input_errors[] = gettext("You must supply and confirm the password for decryption.");
+ }
+ if ($_POST['decrypt_password'] != $_POST['decrypt_passconf']) {
+ $input_errors[] = gettext("The supplied 'Password' and 'Confirm' field values must match.");
+ }
+ }
+
+ if (!$input_errors) {
+ if (is_uploaded_file($_FILES['conffile']['tmp_name'])) {
+
+ /* read the file contents */
+ $data = file_get_contents($_FILES['conffile']['tmp_name']);
+ if (!$data) {
+ log_error(sprintf(gettext("Warning, could not read file %s"), $_FILES['conffile']['tmp_name']));
+ return 1;
+ }
+
+ if ($_POST['decrypt']) {
+ if (!tagfile_deformat($data, $data, "config.xml")) {
+ $input_errors[] = gettext("The uploaded file does not appear to contain an encrypted pfsense configuration.");
+ return 1;
+ }
+ $data = decrypt_data($data, $_POST['decrypt_password']);
+ }
+
+ if (stristr($data, "<m0n0wall>")) {
+ log_error(gettext("Upgrading m0n0wall configuration to pfsense."));
+ /* m0n0wall was found in config. convert it. */
+ $data = str_replace("m0n0wall", "pfsense", $data);
+ $m0n0wall_upgrade = true;
+ }
+ if ($_POST['restorearea']) {
+ /* restore a specific area of the configuration */
+ if (!stristr($data, "<" . $_POST['restorearea'] . ">")) {
+ $input_errors[] = gettext("You have selected to restore an area but we could not locate the correct xml tag.");
+ } else {
+ if (!restore_config_section($_POST['restorearea'], $data)) {
+ $input_errors[] = gettext("You have selected to restore an area but we could not locate the correct xml tag.");
+ } else {
+ if ($config['rrddata']) {
+ restore_rrddata();
+ unset($config['rrddata']);
+ unlink_if_exists("{$g['tmp_path']}/config.cache");
+ write_config();
+ add_base_packages_menu_items();
+ convert_config();
+ conf_mount_ro();
+ }
+ filter_configure();
+ $savemsg = gettext("The configuration area has been restored. You may need to reboot the firewall.");
+ }
+ }
+ } else {
+ if (!stristr($data, "<" . $g['xml_rootobj'] . ">")) {
+ $input_errors[] = sprintf(gettext("You have selected to restore the full configuration but we could not locate a %s tag."), $g['xml_rootobj']);
+ } else {
+ /* restore the entire configuration */
+ file_put_contents($_FILES['conffile']['tmp_name'], $data);
+ if (config_install($_FILES['conffile']['tmp_name']) == 0) {
+ /* this will be picked up by /index.php */
+ conf_mount_rw();
+ mark_subsystem_dirty("restore");
+ touch("/conf/needs_package_sync");
+ /* remove cache, we will force a config reboot */
+ if (file_exists("{$g['tmp_path']}/config.cache")) {
+ unlink("{$g['tmp_path']}/config.cache");
+ }
+ $config = parse_config(true);
+ if (file_exists("/boot/loader.conf")) {
+ $loaderconf = file_get_contents("/boot/loader.conf");
+ if (strpos($loaderconf, "console=\"comconsole")) {
+ $config['system']['enableserial'] = true;
+ write_config("Restore serial console enabling in configuration.");
+ }
+ unset($loaderconf);
+ }
+ /* extract out rrd items, unset from $config when done */
+ if ($config['rrddata']) {
+ restore_rrddata();
+ unset($config['rrddata']);
+ unlink_if_exists("{$g['tmp_path']}/config.cache");
+ write_config();
+ add_base_packages_menu_items();
+ convert_config();
+ conf_mount_ro();
+ }
+ if ($m0n0wall_upgrade == true) {
+ if ($config['system']['gateway'] <> "") {
+ $config['interfaces']['wan']['gateway'] = $config['system']['gateway'];
+ }
+ unset($config['shaper']);
+ /* optional if list */
+ $ifdescrs = get_configured_interface_list(true, true);
+ /* remove special characters from interface descriptions */
+ if (is_array($ifdescrs)) {
+ foreach ($ifdescrs as $iface) {
+ $config['interfaces'][$iface]['descr'] = remove_bad_chars($config['interfaces'][$iface]['descr']);
+ }
+ }
+ /* check for interface names with an alias */
+ if (is_array($ifdescrs)) {
+ foreach ($ifdescrs as $iface) {
+ if (is_alias($config['interfaces'][$iface]['descr'])) {
+ // Firewall rules
+ $origname = $config['interfaces'][$iface]['descr'];
+ $newname = $config['interfaces'][$iface]['descr'] . "Alias";
+ update_alias_names_upon_change(array('filter', 'rule'), array('source', 'address'), $newname, $origname);
+ update_alias_names_upon_change(array('filter', 'rule'), array('destination', 'address'), $newname, $origname);
+ // NAT Rules
+ update_alias_names_upon_change(array('nat', 'rule'), array('source', 'address'), $newname, $origname);
+ update_alias_names_upon_change(array('nat', 'rule'), array('destination', 'address'), $newname, $origname);
+ update_alias_names_upon_change(array('nat', 'rule'), array('target'), $newname, $origname);
+ // Alias in an alias
+ update_alias_names_upon_change(array('aliases', 'alias'), array('address'), $newname, $origname);
+ }
+ }
+ }
+ unlink_if_exists("{$g['tmp_path']}/config.cache");
+ // Reset configuration version to something low
+ // in order to force the config upgrade code to
+ // run through with all steps that are required.
+ $config['system']['version'] = "1.0";
+ // Deal with descriptions longer than 63 characters
+ for ($i = 0; isset($config["filter"]["rule"][$i]); $i++) {
+ if (count($config['filter']['rule'][$i]['descr']) > 63) {
+ $config['filter']['rule'][$i]['descr'] = substr($config['filter']['rule'][$i]['descr'], 0, 63);
+ }
+ }
+ // Move interface from ipsec to enc0
+ for ($i = 0; isset($config["filter"]["rule"][$i]); $i++) {
+ if ($config['filter']['rule'][$i]['interface'] == "ipsec") {
+ $config['filter']['rule'][$i]['interface'] = "enc0";
+ }
+ }
+ // Convert icmp types
+ // http://www.openbsd.org/cgi-bin/man.cgi?query=icmp&sektion=4&arch=i386&apropos=0&manpath=OpenBSD+Current
+ for ($i = 0; isset($config["filter"]["rule"][$i]); $i++) {
+ if ($config["filter"]["rule"][$i]['icmptype']) {
+ switch ($config["filter"]["rule"][$i]['icmptype']) {
+ case "echo":
+ $config["filter"]["rule"][$i]['icmptype'] = "echoreq";
+ break;
+ case "unreach":
+ $config["filter"]["rule"][$i]['icmptype'] = "unreach";
+ break;
+ case "echorep":
+ $config["filter"]["rule"][$i]['icmptype'] = "echorep";
+ break;
+ case "squench":
+ $config["filter"]["rule"][$i]['icmptype'] = "squench";
+ break;
+ case "redir":
+ $config["filter"]["rule"][$i]['icmptype'] = "redir";
+ break;
+ case "timex":
+ $config["filter"]["rule"][$i]['icmptype'] = "timex";
+ break;
+ case "paramprob":
+ $config["filter"]["rule"][$i]['icmptype'] = "paramprob";
+ break;
+ case "timest":
+ $config["filter"]["rule"][$i]['icmptype'] = "timereq";
+ break;
+ case "timestrep":
+ $config["filter"]["rule"][$i]['icmptype'] = "timerep";
+ break;
+ case "inforeq":
+ $config["filter"]["rule"][$i]['icmptype'] = "inforeq";
+ break;
+ case "inforep":
+ $config["filter"]["rule"][$i]['icmptype'] = "inforep";
+ break;
+ case "maskreq":
+ $config["filter"]["rule"][$i]['icmptype'] = "maskreq";
+ break;
+ case "maskrep":
+ $config["filter"]["rule"][$i]['icmptype'] = "maskrep";
+ break;
+ }
+ }
+ }
+ $config['diag']['ipv6nat'] = true;
+ write_config();
+ add_base_packages_menu_items();
+ convert_config();
+ conf_mount_ro();
+ $savemsg = gettext("The m0n0wall configuration has been restored and upgraded to pfSense.");
+ mark_subsystem_dirty("restore");
+ }
+ if (is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cp) {
+ if (isset($cp['enable'])) {
+ /* for some reason ipfw doesn't init correctly except on bootup sequence */
+ mark_subsystem_dirty("restore");
+ break;
+ }
+ }
+ }
+ setup_serial_port();
+ if (is_interface_mismatch() == true) {
+ touch("/var/run/interface_mismatch_reboot_needed");
+ clear_subsystem_dirty("restore");
+ convert_config();
+ header("Location: interfaces_assign.php");
+ exit;
+ }
+ if (is_interface_vlan_mismatch() == true) {
+ touch("/var/run/interface_mismatch_reboot_needed");
+ clear_subsystem_dirty("restore");
+ convert_config();
+ header("Location: interfaces_assign.php");
+ exit;
+ }
+ } else {
+ $input_errors[] = gettext("The configuration could not be restored.");
+ }
+ }
+ }
+ } else {
+ $input_errors[] = gettext("The configuration could not be restored (file upload error).");
+ }
+ }
+ }
+
+ if ($mode == "reinstallpackages") {
+ header("Location: pkg_mgr_install.php?mode=reinstallall");
+ exit;
+ } else if ($mode == "clearpackagelock") {
+ clear_subsystem_dirty('packagelock');
+ $savemsg = "Package Lock Cleared";
+ } else if ($mode == "restore_ver") {
+ $input_errors[] = gettext("XXX - this feature may hose your config (do NOT backrev configs!) - billm");
+ if ($ver2restore <> "") {
+ $conf_file = "{$g['cf_conf_path']}/bak/config-" . strtotime($ver2restore) . ".xml";
+ if (config_install($conf_file) == 0) {
+ mark_subsystem_dirty("restore");
+ } else {
+ $input_errors[] = gettext("The configuration could not be restored.");
+ }
+ } else {
+ $input_errors[] = gettext("No version selected.");
+ }
+ }
+ }
+}
+
+$id = rand() . '.' . time();
+
+$mth = ini_get('upload_progress_meter.store_method');
+$dir = ini_get('upload_progress_meter.file.filename_template');
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Backup/restore"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function encrypt_change() {
+
+ if (!document.iform.encrypt.checked) {
+ document.getElementById("encrypt_opts").style.display="none";
+ } else {
+ document.getElementById("encrypt_opts").style.display="";
+ }
+}
+
+function decrypt_change() {
+
+ if (!document.iform.decrypt.checked) {
+ document.getElementById("decrypt_opts").style.display="none";
+ } else {
+ document.getElementById("decrypt_opts").style.display="";
+ }
+}
+
+function backuparea_change(obj) {
+ if (obj.value == "rrddata") {
+ document.getElementById("nopackages").disabled = true;
+ document.getElementById("dotnotbackuprrd").disabled = true;
+ } else {
+ document.getElementById("nopackages").disabled = false;
+ document.getElementById("dotnotbackuprrd").disabled = false;
+ }
+}
+//]]>
+</script>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('restore')): ?><br/>
+<form action="reboot.php" method="post">
+<input name="Submit" type="hidden" value="Yes" />
+<?php print_info_box(gettext("The firewall configuration has been changed.") . "<br />" . gettext("The firewall is now rebooting."));?><br />
+</form>
+<?php endif; ?>
+<form action="diag_backup.php" method="post" name="iform" enctype="multipart/form-data">
+<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="diag backup">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Config History"), false, "diag_confbak.php");
+ $tab_array[1] = array(gettext("Backup/Restore"), true, "diag_backup.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic"><?=gettext("Backup configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <p><?=gettext("Click this button to download the system configuration in XML format."); ?><br /><br /> <?=gettext("Backup area:"); ?> <?php spit_out_select_items("backuparea", false); ?></p>
+ <table>
+ <tr>
+ <td>
+ <input name="nopackages" type="checkbox" class="formcheckbox" id="nopackages" />
+ </td>
+ <td>
+ <span class="vexpl"><?=gettext("Do not backup package information."); ?></span>
+ </td>
+ </tr>
+ </table>
+ <table>
+ <tr>
+ <td>
+ <input name="encrypt" type="checkbox" class="formcheckbox" id="nopackages" onclick="encrypt_change()" />
+ </td>
+ <td>
+ <span class="vexpl"><?=gettext("Encrypt this configuration file."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="donotbackuprrd" type="checkbox" class="formcheckbox" id="dotnotbackuprrd" checked="checked" />
+ </td>
+ <td>
+ <span class="vexpl"><?=gettext("Do not backup RRD data (NOTE: RRD Data can consume 4+ megabytes of config.xml space!)"); ?></span>
+ </td>
+ </tr>
+ </table>
+ <table id="encrypt_opts">
+ <tr>
+ <td>
+ <span class="vexpl"><?=gettext("Password:"); ?> </span>
+ </td>
+ <td>
+ <input name="encrypt_password" type="password" class="formfld pwd" size="20" value="" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl"><?=gettext("confirm:"); ?> </span>
+ </td>
+ <td>
+ <input name="encrypt_passconf" type="password" class="formfld pwd" size="20" value="" />
+ </td>
+ </tr>
+ </table>
+ <p><input name="Submit" type="submit" class="formbtn" id="download" value="<?=gettext("Download configuration"); ?>" /></p>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" class="listtopic"><?=gettext("Restore configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <?=gettext("Open a"); ?> <?=$g['[product_name']?> <?=gettext("configuration XML file and click the button below to restore the configuration."); ?>
+ <br /><br />
+ <?=gettext("Restore area:"); ?> <?php spit_out_select_items("restorearea", true); ?>
+ <p><input name="conffile" type="file" class="formbtn" id="conffile" size="40" /></p>
+ <table>
+ <tr>
+ <td>
+ <input name="decrypt" type="checkbox" class="formcheckbox" id="nopackages" onclick="decrypt_change()" />
+ </td>
+ <td>
+ <span class="vexpl"><?=gettext("Configuration file is encrypted."); ?></span>
+ </td>
+ </tr>
+ </table>
+ <table id="decrypt_opts">
+ <tr>
+ <td>
+ <span class="vexpl"><?=gettext("Password :"); ?></span>
+ </td>
+ <td>
+ <input name="decrypt_password" type="password" class="formfld pwd" size="20" value="" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl"><?=gettext("confirm :"); ?></span>
+ </td>
+ <td>
+ <input name="decrypt_passconf" type="password" class="formfld pwd" size="20" value="" />
+ </td>
+ </tr>
+ </table>
+ <p><input name="Submit" type="submit" class="formbtn" id="restore" value="<?=gettext("Restore configuration"); ?>" /></p>
+ <p><strong><span class="red"><?=gettext("Note:"); ?></span></strong><br /><?=gettext("The firewall will reboot after restoring the configuration."); ?><br /></p>
+ </td>
+ </tr>
+ <?php if (($config['installedpackages']['package'] != "") || (is_subsystem_dirty("packagelock"))) { ?>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" class="listtopic"><?=gettext("Package Functions"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <?php if ($config['installedpackages']['package'] != "") { ?>
+ <p><?=gettext("Click this button to reinstall all system packages. This may take a while."); ?> <br /><br />
+ <input name="Submit" type="submit" class="formbtn" id="reinstallpackages" value="<?=gettext("Reinstall packages"); ?>" />
+ <br />
+ <br />
+ <?php } ?>
+ <?php if (is_subsystem_dirty("packagelock")) { ?>
+ <p><?=gettext("Click this button to clear the package lock if a package fails to reinstall properly after an upgrade."); ?> <br /><br />
+ <input name="Submit" type="submit" class="formbtn" id="clearpackagelock" value="<?=gettext("Clear Package Lock"); ?>" />
+ <?php } ?>
+ </p>
+ </td>
+ </tr>
+ <?php } ?>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+
+<script type="text/javascript">
+//<![CDATA[
+encrypt_change();
+decrypt_change();
+//]]>
+</script>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
+<?php
+
+if (is_subsystem_dirty('restore')) {
+ system_reboot();
+}
+
+?>
diff --git a/src/usr/local/www/diag_confbak.php b/src/usr/local/www/diag_confbak.php
new file mode 100644
index 0000000..cc1da99
--- /dev/null
+++ b/src/usr/local/www/diag_confbak.php
@@ -0,0 +1,301 @@
+<?php
+/* $Id$ */
+/*
+ diag_confbak.php
+ Copyright (C) 2005 Colin Smith
+ Copyright (C) 2010 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: config
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-configurationhistory
+##|*NAME=Diagnostics: Configuration History page
+##|*DESCR=Allow access to the 'Diagnostics: Configuration History' page.
+##|*MATCH=diag_confbak.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['backupcount'])) {
+ if (is_numeric($_POST['backupcount']) && ($_POST['backupcount'] >= 0)) {
+ $config['system']['backupcount'] = $_POST['backupcount'];
+ $changedescr = $config['system']['backupcount'];
+ } else {
+ unset($config['system']['backupcount']);
+ $changedescr = "(platform default)";
+ }
+ write_config("Changed backup revision count to {$changedescr}");
+} elseif ($_POST) {
+ if (!isset($_POST['confirm']) || ($_POST['confirm'] != gettext("Confirm")) || (!isset($_POST['newver']) && !isset($_POST['rmver']))) {
+ header("Location: diag_confbak.php");
+ return;
+ }
+
+ conf_mount_rw();
+ $confvers = unserialize(file_get_contents($g['cf_conf_path'] . '/backup/backup.cache'));
+ if ($_POST['newver'] != "") {
+ if (config_restore($g['conf_path'] . '/backup/config-' . $_POST['newver'] . '.xml') == 0) {
+ $savemsg = sprintf(gettext('Successfully reverted to timestamp %1$s with description "%2$s".'), date(gettext("n/j/y H:i:s"), $_POST['newver']), htmlspecialchars($confvers[$_POST['newver']]['description']));
+ } else {
+ $savemsg = gettext("Unable to revert to the selected configuration.");
+ }
+ }
+ if ($_POST['rmver'] != "") {
+ unlink_if_exists($g['conf_path'] . '/backup/config-' . $_POST['rmver'] . '.xml');
+ $savemsg = sprintf(gettext('Deleted backup with timestamp %1$s and description "%2$s".'), date(gettext("n/j/y H:i:s"), $_POST['rmver']), htmlspecialchars($confvers[$_POST['rmver']]['description']));
+ }
+ conf_mount_ro();
+}
+
+if ($_GET['getcfg'] != "") {
+ $file = $g['conf_path'] . '/backup/config-' . $_GET['getcfg'] . '.xml';
+
+ $exp_name = urlencode("config-{$config['system']['hostname']}.{$config['system']['domain']}-{$_GET['getcfg']}.xml");
+ $exp_data = file_get_contents($file);
+ $exp_size = strlen($exp_data);
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$exp_name}");
+ header("Content-Length: $exp_size");
+ echo $exp_data;
+ exit;
+}
+
+if (($_GET['diff'] == 'Diff') && isset($_GET['oldtime']) && isset($_GET['newtime']) &&
+ (is_numeric($_GET['oldtime'])) &&
+ (is_numeric($_GET['newtime']) || ($_GET['newtime'] == 'current'))) {
+ $diff = "";
+ $oldfile = $g['conf_path'] . '/backup/config-' . $_GET['oldtime'] . '.xml';
+ $oldtime = $_GET['oldtime'];
+ if ($_GET['newtime'] == 'current') {
+ $newfile = $g['conf_path'] . '/config.xml';
+ $newtime = $config['revision']['time'];
+ } else {
+ $newfile = $g['conf_path'] . '/backup/config-' . $_GET['newtime'] . '.xml';
+ $newtime = $_GET['newtime'];
+ }
+ if (file_exists($oldfile) && file_exists($newfile)) {
+ exec("/usr/bin/diff -u " . escapeshellarg($oldfile) . " " . escapeshellarg($newfile), $diff);
+ }
+}
+
+cleanup_backupcache(false);
+$confvers = get_backups();
+unset($confvers['versions']);
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Configuration History"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+ <?php
+ include("fbegin.inc");
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+ ?>
+ <?php if ($diff) { ?>
+ <table align="center" width="100%" border="0" cellspacing="0" style="padding-top: 4px; padding-bottom: 4px; vertical-align:middle;" summary="diag confbak">
+ <tr>
+ <td><?=gettext("Configuration diff from");?> <?php echo date(gettext("n/j/y H:i:s"), $oldtime); ?> <?=gettext("to");?> <?php echo date(gettext("n/j/y H:i:s"), $newtime); ?></td>
+ </tr>
+ <?php foreach ($diff as $line) {
+ switch (substr($line, 0, 1)) {
+ case "+":
+ $color = "#caffd3";
+ break;
+ case "-":
+ $color = "#ffe8e8";
+ break;
+ case "@":
+ $color = "#a0a0a0";
+ break;
+ default:
+ $color = "#ffffff";
+ }
+ ?>
+ <tr>
+ <td valign="middle" bgcolor="<?php echo $color; ?>" style="white-space: pre-wrap;"><?php echo htmlentities($line);?></td>
+ </tr>
+ <?php } ?>
+ </table>
+ <br />
+ <?php } ?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="stats">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Config History"), true, "diag_confbak.php");
+ $tab_array[1] = array(gettext("Backup/Restore"), false, "diag_backup.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <form action="diag_confbak.php" method="post">
+ <table class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
+
+<?php if ($_GET["newver"] || $_GET["rmver"]): ?>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?php echo gettext("Confirm Action"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+
+ <strong><?php echo gettext("Please confirm the selected action"); ?></strong>:
+ <br />
+ <br /><strong><?php echo gettext("Action"); ?>:</strong>
+ <?php if (!empty($_GET["newver"])) {
+ echo gettext("Restore from Configuration Backup");
+ $target_config = $_GET["newver"]; ?>
+ <input type="hidden" name="newver" value="<?php echo htmlspecialchars($_GET["newver"]); ?>" />
+ <?php } elseif (!empty($_GET["rmver"])) {
+ echo gettext("Remove Configuration Backup");
+ $target_config = $_GET["rmver"]; ?>
+ <input type="hidden" name="rmver" value="<?php echo htmlspecialchars($_GET["rmver"]); ?>" />
+ <?php } ?>
+ <br /><strong><?php echo gettext("Target Configuration"); ?>:</strong>
+ <?php echo sprintf(gettext('Timestamp %1$s'), date(gettext("n/j/y H:i:s"), $target_config)); ?>
+ <br /><input type="submit" name="confirm" value="<?php echo gettext("Confirm"); ?>" />
+ </td>
+ </tr>
+<?php else: ?>
+
+ <tr>
+ <td width="10%">&nbsp;</td>
+ <td width="15%" valign="top"><?=gettext("Backup Count");?></td>
+ <td width="10%">
+ <input name="backupcount" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($config['system']['backupcount']);?>"/>
+ </td>
+ <td width="60%">
+ <?= gettext("Enter the number of older configurations to keep in the local backup cache. By default this is 30 for a full install or 5 on NanoBSD."); ?>
+ </td>
+ <td width= "5%"><input name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" /></td>
+ </tr>
+ <tr>
+ <td class="vncell">&nbsp;</td>
+ <td colspan="4" class="vncell">
+ <?= gettext("NOTE: Be aware of how much space is consumed by backups before adjusting this value. Current space used by backups: "); ?> <?= exec("/usr/bin/du -sh /conf/backup | /usr/bin/awk '{print $1;}'") ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+ <form action="diag_confbak.php" method="get">
+ <table class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="difference">
+ <?php if (is_array($confvers)): ?>
+ <tr>
+ <td colspan="7" class="list">
+ <?= gettext("To view the differences between an older configuration and a newer configuration, select the older configuration using the left column of radio options and select the newer configuration in the right column, then press the Diff button."); ?>
+ <br /><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="5%" colspan="2" valign="middle" align="center" class="list nowrap"><input type="submit" name="diff" value="<?=gettext("Diff"); ?>" /></td>
+ <td width="20%" class="listhdrr"><?=gettext("Date");?></td>
+ <td width="5%" class="listhdrr"><?=gettext("Version");?></td>
+ <td width="5%" class="listhdrr"><?=gettext("Size");?></td>
+ <td width="60%" class="listhdrr"><?=gettext("Configuration Change");?></td>
+ <td width="5%" class="list">&nbsp;</td>
+ </tr>
+ <tr valign="top">
+ <td valign="middle" class="list nowrap"></td>
+ <td class="list">
+ <input type="radio" name="newtime" value="current" />
+ </td>
+ <td class="listlr"> <?= date(gettext("n/j/y H:i:s"), $config['revision']['time']) ?></td>
+ <td class="listr"> <?= $config['version'] ?></td>
+ <td class="listr"> <?= format_bytes(filesize("/conf/config.xml")) ?></td>
+ <td class="listr"> <?= htmlspecialchars($config['revision']['description']) ?></td>
+ <td valign="middle" class="list nowrap"><b><?=gettext("Current");?></b></td>
+ </tr>
+ <?php
+ $c = 0;
+ foreach ($confvers as $version):
+ if ($version['time'] != 0) {
+ $date = date(gettext("n/j/y H:i:s"), $version['time']);
+ } else {
+ $date = gettext("Unknown");
+ }
+ ?>
+ <tr valign="top">
+ <td class="list">
+ <input type="radio" name="oldtime" value="<?php echo $version['time'];?>" />
+ </td>
+ <td class="list">
+ <?php if ($c < (count($confvers) - 1)) { ?>
+ <input type="radio" name="newtime" value="<?php echo $version['time'];?>" />
+ <?php } else { ?>
+ &nbsp;
+ <?php }
+ $c++; ?>
+ </td>
+ <td class="listlr"> <?= $date ?></td>
+ <td class="listr"> <?= $version['version'] ?></td>
+ <td class="listr"> <?= format_bytes($version['filesize']) ?></td>
+ <td class="listr"> <?= htmlspecialchars($version['description']) ?></td>
+ <td valign="middle" class="list nowrap">
+ <a href="diag_confbak.php?newver=<?=$version['time'];?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="<?=gettext("Revert to this configuration");?>" title="<?=gettext("Revert to this configuration");?>" />
+ </a>
+ <a href="diag_confbak.php?rmver=<?=$version['time'];?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="<?=gettext("Remove this backup");?>" title="<?=gettext("Remove this backup");?>" />
+ </a>
+ <a href="diag_confbak.php?getcfg=<?=$version['time'];?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_down.gif" width="17" height="17" border="0" alt="<?=gettext("Download this backup");?>" title="<?=gettext("Download this backup");?>" />
+ </a>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ <tr>
+ <td colspan="2"><input type="submit" name="diff" value="<?=gettext("Diff"); ?>" /></td>
+ <td colspan="5"></td>
+ </tr>
+ <?php else: ?>
+ <tr>
+ <td>
+ <?php print_info_box(gettext("No backups found.")); ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+<?php endif; ?>
+ </table>
+ </form>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_defaults.php b/src/usr/local/www/diag_defaults.php
new file mode 100755
index 0000000..7c17511
--- /dev/null
+++ b/src/usr/local/www/diag_defaults.php
@@ -0,0 +1,90 @@
+<?php
+/* $Id$ */
+/*
+ diag_defaults.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: config
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-factorydefaults
+##|*NAME=Diagnostics: Factory defaults page
+##|*DESCR=Allow access to the 'Diagnostics: Factory defaults' page.
+##|*MATCH=diag_defaults.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if ($_POST['Submit'] == " " . gettext("No") . " ") {
+ header("Location: index.php");
+ exit;
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Factory defaults"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<?php if ($_POST['Submit'] == " " . gettext("Yes") . " "):
+ print_info_box(gettext("The system has been reset to factory defaults and is now rebooting. This may take a few minutes, depending on your hardware.")); ?>
+<pre>
+<?php
+ reset_factory_defaults();
+ system_reboot();
+?>
+</pre>
+<?php else: ?>
+<form action="diag_defaults.php" method="post">
+ <p><strong> <?=gettext("If you click") . " &quot;" . gettext("Yes") . "&quot;, " . gettext("the firewall will:")?></strong></p>
+ <ul>
+ <li><?=gettext("Reset to factory defaults");?></li>
+ <li><?=gettext("LAN IP address will be reset to 192.168.1.1");?></li>
+ <li><?=gettext("System will be configured as a DHCP server on the default LAN interface");?></li>
+ <li><?=gettext("Reboot after changes are installed");?></li>
+ <li><?=gettext("WAN interface will be set to obtain an address automatically from a DHCP server");?></li>
+ <li><?=gettext("webConfigurator admin username will be reset to 'admin'");?></li>
+ <li><?=gettext("webConfigurator admin password will be reset to");?> '<?=$g['factory_shipped_password']?>'</li>
+ </ul>
+ <p><strong><?=gettext("Are you sure you want to proceed?");?></strong></p>
+ <p>
+ <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("Yes");?> " />
+ <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("No");?> " />
+ </p>
+</form>
+<?php endif; ?>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_dns.php b/src/usr/local/www/diag_dns.php
new file mode 100644
index 0000000..4c57223
--- /dev/null
+++ b/src/usr/local/www/diag_dns.php
@@ -0,0 +1,320 @@
+<?php
+/*
+ diag_dns.php
+
+ Copyright (C) 2009 Jim Pingle (jpingle@gmail.com)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: dns
+*/
+
+$pgtitle = array(gettext("Diagnostics"), gettext("DNS Lookup"));
+require("guiconfig.inc");
+
+$host = trim($_REQUEST['host'], " \t\n\r\0\x0B[];\"'");
+$host_esc = escapeshellarg($host);
+
+/* If this section of config.xml has not been populated yet we need to set it up
+*/
+if (!is_array($config['aliases']['alias'])) {
+ $config['aliases']['alias'] = array();
+}
+$a_aliases = &$config['aliases']['alias'];
+
+$aliasname = str_replace(array(".", "-"), "_", $host);
+$alias_exists = false;
+$counter = 0;
+foreach ($a_aliases as $a) {
+ if ($a['name'] == $aliasname) {
+ $alias_exists = true;
+ $id = $counter;
+ }
+ $counter++;
+}
+
+if (isset($_POST['create_alias']) && (is_hostname($host) || is_ipaddr($host))) {
+ if ($_POST['override']) {
+ $override = true;
+ }
+ $resolved = gethostbyname($host);
+ $type = "hostname";
+ if ($resolved) {
+ $resolved = array();
+ exec("/usr/bin/drill {$host_esc} A | /usr/bin/grep {$host_esc} | /usr/bin/grep -v ';' | /usr/bin/awk '{ print $5 }'", $resolved);
+ $isfirst = true;
+ foreach ($resolved as $re) {
+ if ($re <> "") {
+ if (!$isfirst) {
+ $addresses .= " ";
+ }
+ $addresses .= rtrim($re) . "/32";
+ $isfirst = false;
+ }
+ }
+ $newalias = array();
+ if ($override) {
+ $alias_exists = false;
+ }
+ if ($alias_exists == false) {
+ $newalias['name'] = $aliasname;
+ $newalias['type'] = "network";
+ $newalias['address'] = $addresses;
+ $newalias['descr'] = "Created from Diagnostics-> DNS Lookup";
+ if ($override) {
+ $a_aliases[$id] = $newalias;
+ } else {
+ $a_aliases[] = $newalias;
+ }
+ write_config();
+ $createdalias = true;
+ }
+ }
+}
+
+if ($_POST) {
+ unset($input_errors);
+
+ $reqdfields = explode(" ", "host");
+ $reqdfieldsn = explode(",", "Host");
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!is_hostname($host) && !is_ipaddr($host)) {
+ $input_errors[] = gettext("Host must be a valid hostname or IP address.");
+ } else {
+ // Test resolution speed of each DNS server.
+ $dns_speeds = array();
+ $dns_servers = array();
+ exec("/usr/bin/grep nameserver /etc/resolv.conf | /usr/bin/cut -f2 -d' '", $dns_servers);
+ foreach ($dns_servers as $dns_server) {
+ $query_time = exec("/usr/bin/drill {$host_esc} " . escapeshellarg("@" . trim($dns_server)) . " | /usr/bin/grep Query | /usr/bin/cut -d':' -f2");
+ if ($query_time == "") {
+ $query_time = gettext("No response");
+ }
+ $new_qt = array();
+ $new_qt['dns_server'] = $dns_server;
+ $new_qt['query_time'] = $query_time;
+ $dns_speeds[] = $new_qt;
+ unset($new_qt);
+ }
+ }
+
+ $type = "unknown";
+ $resolved = "";
+ $ipaddr = "";
+ $hostname = "";
+ if (!$input_errors) {
+ if (is_ipaddr($host)) {
+ $type = "ip";
+ $resolved = gethostbyaddr($host);
+ $ipaddr = $host;
+ if ($host != $resolved) {
+ $hostname = $resolved;
+ }
+ } elseif (is_hostname($host)) {
+ $type = "hostname";
+ $resolved = gethostbyname($host);
+ if ($resolved) {
+ $resolved = array();
+ exec("/usr/bin/drill {$host_esc} A | /usr/bin/grep {$host_esc} | /usr/bin/grep -v ';' | /usr/bin/awk '{ print $5 }'", $resolved);
+ }
+ $hostname = $host;
+ if ($host != $resolved) {
+ $ipaddr = $resolved[0];
+ }
+ }
+
+ if ($host == $resolved) {
+ $resolved = gettext("No record found");
+ }
+ }
+}
+
+if (($_POST['host']) && ($_POST['dialog_output'])) {
+ display_host_results ($host, $resolved, $dns_speeds);
+ exit;
+}
+
+function display_host_results ($address, $hostname, $dns_speeds) {
+ $map_lengths = function($element) { return strlen($element[0]); };
+
+ echo gettext("IP Address") . ": {$address} \n";
+ echo gettext("Host Name") . ": {$hostname} \n";
+ echo "\n";
+ $text_table = array();
+ $text_table[] = array(gettext("Server"), gettext("Query Time"));
+ if (is_array($dns_speeds)) {
+ foreach ($dns_speeds as $qt) {
+ $text_table[] = array(trim($qt['dns_server']), trim($qt['query_time']));
+ }
+ }
+ $col0_padlength = max(array_map($map_lengths, $text_table)) + 4;
+ foreach ($text_table as $text_row) {
+ echo str_pad($text_row[0], $col0_padlength) . $text_row[1] . "\n";
+ }
+}
+
+include("head.inc"); ?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag dns">
+ <tr>
+ <td>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+ <form action="diag_dns.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"> <?=gettext("Resolve DNS hostname or IP");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname or IP");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?>
+ <table summary="results">
+ <tr>
+ <td valign="top">
+ <input name="host" type="text" class="formfld unknown" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
+ </td>
+<?php
+ if ($resolved && $type) {
+?>
+ <td valign="middle">&nbsp;=&nbsp;</td>
+ <td>
+ <font size="+1">
+<?php
+ $found = 0;
+ if (is_array($resolved)) {
+ foreach ($resolved as $hostitem) {
+ if ($hostitem <> "") {
+ echo $hostitem . "<br />";
+ $found++;
+ }
+ }
+ } else {
+ echo $resolved;
+ }
+ if ($found > 0) {
+?>
+ <br/>
+ </font>
+ <font size='-2'>
+<?php
+ if ($alias_exists) {
+?>
+ An alias already exists for the hostname <?= htmlspecialchars($host) ?>. <br />
+ <input type="hidden" name="override" value="true"/>
+ <input type="submit" name="create_alias" value="Overwrite Alias"/>
+<?php
+ } else {
+ if (!$createdalias) {
+?>
+ <input type="submit" name="create_alias" value="Create Alias from These Entries"/>
+<?php
+ } else {
+?>
+ Alias created with name <?= htmlspecialchars($newalias['name']) ?>
+<?php
+ }
+ }
+ }
+ }
+?>
+ </font>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if ($_POST):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Resolution time per server");?></td>
+ <td width="78%" class="vtable">
+ <table width="170" border="0" cellpadding="6" cellspacing="0" summary="resolution time">
+ <tr>
+ <td class="listhdrr">
+ <?=gettext("Server");?>
+ </td>
+ <td class="listhdrr">
+ <?=gettext("Query time");?>
+ </td>
+ </tr>
+<?php
+ if (is_array($dns_speeds)) {
+ foreach ($dns_speeds as $qt):
+?>
+ <tr>
+ <td class="listlr">
+ <?=$qt['dns_server']?>
+ </td>
+ <td class="listr">
+ <?=$qt['query_time']?>
+ </td>
+ </tr>
+<?php
+ endforeach;
+ }
+?>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+
+ if (!$input_errors && $ipaddr) {
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("More Information:");?></td>
+ <td width="78%" class="vtable">
+ <a href ="/diag_ping.php?host=<?=htmlspecialchars($host)?>&amp;interface=wan&amp;count=3"><?=gettext("Ping");?></a> <br />
+ <a href ="/diag_traceroute.php?host=<?=htmlspecialchars($host)?>&amp;ttl=18"><?=gettext("Traceroute");?></a>
+ <p>
+ <?=gettext("NOTE: The following links are to external services, so their reliability cannot be guaranteed.");?><br /><br />
+ <a target="_blank" href="http://private.dnsstuff.com/tools/whois.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP WHOIS @ DNS Stuff");?></a><br />
+ <a target="_blank" href="http://private.dnsstuff.com/tools/ipall.ch?ip=<?php echo $ipaddr; ?>"><?=gettext("IP Info @ DNS Stuff");?></a>
+ </p>
+ </td>
+ </tr>
+<?php
+ }
+?>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <br />&nbsp;
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("DNS Lookup");?>" />
+ </td>
+ </tr>
+ </table>
+ </form>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_dump_states.php b/src/usr/local/www/diag_dump_states.php
new file mode 100755
index 0000000..ebb3b06
--- /dev/null
+++ b/src/usr/local/www/diag_dump_states.php
@@ -0,0 +1,280 @@
+<?php
+/*
+ diag_dump_states.php
+ Copyright (C) 2005 Colin Smith
+ Copyright (C) 2005-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/pfctl
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-showstates
+##|*NAME=Diagnostics: Show States page
+##|*DESCR=Allow access to the 'Diagnostics: Show States' page.
+##|*MATCH=diag_dump_states.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("interfaces.inc");
+
+/* handle AJAX operations */
+if (isset($_POST['action']) && $_POST['action'] == "remove") {
+ if (isset($_POST['srcip']) && isset($_POST['dstip']) && is_ipaddr($_POST['srcip']) && is_ipaddr($_POST['dstip'])) {
+ $retval = pfSense_kill_states($_POST['srcip'], $_POST['dstip']);
+ echo htmlentities("|{$_POST['srcip']}|{$_POST['dstip']}|0|");
+ } else {
+ echo gettext("invalid input");
+ }
+ return;
+}
+
+if (isset($_POST['filter']) && isset($_POST['killfilter'])) {
+ if (is_ipaddr($_POST['filter'])) {
+ $tokill = $_POST['filter'] . "/32";
+ } elseif (is_subnet($_POST['filter'])) {
+ $tokill = $_POST['filter'];
+ } else {
+ // Invalid filter
+ $tokill = "";
+ }
+ if (!empty($tokill)) {
+ $retval = pfSense_kill_states($tokill);
+ $retval = pfSense_kill_states("0.0.0.0/0", $tokill);
+ }
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Show States"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+ function removeState(srcip, dstip) {
+ var busy = function(index, icon) {
+ jQuery(icon).bind("onclick", "");
+ jQuery(icon).attr('src', jQuery(icon).attr('src').replace("\.gif", "_d.gif"));
+ jQuery(icon).css("cursor", "wait");
+ }
+
+ jQuery('img[name="i:' + srcip + ":" + dstip + '"]').each(busy);
+
+ jQuery.ajax(
+ "<?=$_SERVER['SCRIPT_NAME'];?>",
+ {
+ type: "post",
+ data: {
+ action: "remove",
+ srcip: srcip,
+ dstip: dstip
+ },
+ complete: removeComplete
+ }
+ );
+ }
+
+ function removeComplete(req) {
+ var values = req.responseText.split("|");
+ if (values[3] != "0") {
+ alert('<?=gettext("An error occurred.");?>');
+ return;
+ }
+
+ jQuery('tr[id="r:' + values[1] + ":" + values[2] + '"]').each(
+ function(index, row) { jQuery(row).fadeOut(1000); }
+ );
+ }
+//]]>
+</script>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tabcon">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("States"), true, "diag_dump_states.php");
+ if (isset($config['system']['lb_use_sticky'])) {
+ $tab_array[] = array(gettext("Source Tracking"), false, "diag_dump_states_sources.php");
+ }
+ $tab_array[] = array(gettext("Reset States"), false, "diag_resetstate.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+
+<!-- Start of tab content -->
+
+<?php
+ $current_statecount=`pfctl -si | grep "current entries" | awk '{ print $3 }'`;
+?>
+
+<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="states">
+ <tr>
+ <td>
+ <form action="<?=$_SERVER['SCRIPT_NAME'];?>" method="post" name="iform">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="filter">
+ <tr>
+ <td>
+ <?=gettext("Current total state count");?>: <?= $current_statecount ?>
+ </td>
+ <td style="font-weight:bold;" align="right">
+ <?=gettext("Filter expression:");?>
+ <input type="text" name="filter" class="formfld search" value="<?=htmlspecialchars($_POST['filter']);?>" size="30" />
+ <input type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
+ <?php if (isset($_POST['filter']) && (is_ipaddr($_POST['filter']) || is_subnet($_POST['filter']))): ?>
+ <input type="submit" class="formbtn" name="killfilter" value="<?=gettext("Kill");?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <table class="tabcont sortable" width="100%" border="0" cellspacing="0" cellpadding="0" summary="results">
+ <thead>
+ <tr>
+ <th class="listhdrr" width="5%"><?=gettext("Int");?></th>
+ <th class="listhdrr" width="5%"><?=gettext("Proto");?></th>
+ <th class="listhdrr" width="65"><?=gettext("Source -> Router -> Destination");?></th>
+ <th class="listhdr" width="24%"><?=gettext("State");?></th>
+ <th class="list sort_ignore" width="1%"></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+$row = 0;
+/* get our states */
+$grepline = (isset($_POST['filter'])) ? "| /usr/bin/egrep " . escapeshellarg(htmlspecialchars($_POST['filter'])) : "";
+$fd = popen("/sbin/pfctl -s state {$grepline}", "r");
+while ($line = chop(fgets($fd))) {
+ if ($row >= 10000) {
+ break;
+ }
+
+ $line_split = preg_split("/\s+/", $line);
+
+ $iface = array_shift($line_split);
+ $proto = array_shift($line_split);
+ $state = array_pop($line_split);
+ $info = implode(" ", $line_split);
+
+ // We may want to make this optional, with a large state table, this could get to be expensive.
+ $iface = convert_real_interface_to_friendly_descr($iface);
+
+ /* break up info and extract $srcip and $dstip */
+ $ends = preg_split("/\<?-\>?/", $info);
+ if (strstr($info, "[")) {
+ // IPv6
+ $parts = explode("[", $ends[0]);
+ if (strstr($info, "->")) {
+ $srcip = trim($parts[0]);
+ } else {
+ $dstip = trim($parts[0]);
+ }
+ $parts = explode("[", $ends[count($ends) - 1]);
+ if (strstr($info, "->")) {
+ $dstip = trim($parts[0]);
+ } else {
+ $srcip = trim($parts[0]);
+ }
+ } else {
+ // IPv4
+ $parts = explode(":", $ends[0]);
+ if (strstr($info, "->")) {
+ $srcip = trim($parts[0]);
+ } else {
+ $dstip = trim($parts[0]);
+ }
+ $parts = explode(":", $ends[count($ends) - 1]);
+ if (strstr($info, "->")) {
+ $dstip = trim($parts[0]);
+ } else {
+ $srcip = trim($parts[0]);
+ }
+ }
+?>
+ <tr valign="top" id="r:<?= $srcip ?>:<?= $dstip ?>">
+ <td class="listlr"><?= $iface ?></td>
+ <td class="listr"><?= $proto ?></td>
+ <td class="listr"><?= $info ?></td>
+ <td class="listr"><?= $state ?></td>
+ <td class="list">
+ <img src="/themes/<?= $g['theme'] ?>/images/icons/icon_x.gif" height="17" width="17" border="0"
+ onclick="removeState('<?= $srcip ?>', '<?= $dstip ?>');" style="cursor:pointer;"
+ name="i:<?= $srcip ?>:<?= $dstip ?>"
+ title="<?= gettext('Remove all state entries from') ?> <?= $srcip ?> <?= gettext('to') ?> <?= $dstip ?>" alt="" />
+ </td>
+ </tr>
+<?php
+ $row++;
+ ob_flush();
+}
+
+if ($row == 0):
+?>
+ <tr>
+ <td class="list" colspan="4" align="center" valign="top">
+ <?= gettext("No states were found.") ?>
+ </td>
+ </tr>
+<?php
+endif;
+pclose($fd);
+?>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td class="list" colspan="4" align="center" valign="top">
+ <?php if (isset($_POST['filter']) && !empty($_POST['filter'])): ?>
+ <?=gettext("States matching current filter")?>: <?= $row ?>
+ <?php endif; ?>
+ </td>
+ </tr>
+</table>
+
+<!-- End of tab content -->
+
+ </div>
+ </td>
+ </tr>
+</table>
+
+<?php require("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_dump_states_sources.php b/src/usr/local/www/diag_dump_states_sources.php
new file mode 100644
index 0000000..4cb14c2
--- /dev/null
+++ b/src/usr/local/www/diag_dump_states_sources.php
@@ -0,0 +1,211 @@
+<?php
+/*
+ diag_dump_states_sources.php
+ Copyright (C) 2005 Colin Smith
+ Copyright (C) 2005-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/pfctl
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-showstates
+##|*NAME=Diagnostics: Show States page
+##|*DESCR=Allow access to the 'Diagnostics: Show States' page.
+##|*MATCH=diag_dump_states.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+
+/* handle AJAX operations */
+if ($_GET['action']) {
+ if ($_GET['action'] == "remove") {
+ if (is_ipaddr($_GET['srcip']) and is_ipaddr($_GET['dstip'])) {
+ $retval = mwexec("/sbin/pfctl -K " . escapeshellarg($_GET['srcip']) . " -K " . escapeshellarg($_GET['dstip']));
+ echo htmlentities("|{$_GET['srcip']}|{$_GET['dstip']}|{$retval}|");
+ } else {
+ echo gettext("invalid input");
+ }
+ exit;
+ }
+}
+
+/* get our states */
+if ($_GET['filter']) {
+ exec("/sbin/pfctl -s Sources | grep " . escapeshellarg(htmlspecialchars($_GET['filter'])), $sources);
+} else {
+ exec("/sbin/pfctl -s Sources", $sources);
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Show Source Tracking"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
+<?php include("fbegin.inc"); ?>
+<form action="diag_dump_states_sources.php" method="get" name="iform">
+
+<script type="text/javascript">
+//<![CDATA[
+ function removeSource(srcip, dstip) {
+ var busy = function(index, icon) {
+ jQuery(icon).bind("onclick", "");
+ jQuery(icon).attr('src', jQuery(icon).attr('src').replace("\.gif", "_d.gif"));
+ jQuery(icon).css("cursor", "wait");
+ }
+
+ jQuery('img[name="i:' + srcip + ":" + dstip + '"]').each(busy);
+
+ jQuery.ajax(
+ "<?=$_SERVER['SCRIPT_NAME'];?>" +
+ "?action=remove&srcip=" + srcip + "&dstip=" + dstip,
+ { type: "get", complete: removeComplete }
+ );
+ }
+
+ function removeComplete(req) {
+ var values = req.responseText.split("|");
+ if (values[3] != "0") {
+ alert('<?=gettext("An error occurred.");?>');
+ return;
+ }
+
+ jQuery('tr[name="r:' + values[1] + ":" + values[2] + '"]').each(
+ function(index, row) { jQuery(row).fadeOut(1000); }
+ );
+ }
+//]]>
+</script>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("States"), false, "diag_dump_states.php");
+ $tab_array[] = array(gettext("Source Tracking"), true, "diag_dump_states_sources.php");
+ $tab_array[] = array(gettext("Reset States"), false, "diag_resetstate.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+
+<!-- Start of tab content -->
+
+<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td>
+ <form action="<?=$_SERVER['SCRIPT_NAME'];?>" method="get">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td>&nbsp;</td>
+ <td style="font-weight:bold;" align="right">
+ <?=gettext("Filter expression:");?>
+ <input type="text" name="filter" class="formfld search" value="<?=htmlspecialchars($_GET['filter']);?>" size="30" />
+ <input type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
+ </td>
+ </tr>
+ </table>
+ </form>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <table class="tabcont sortable" width="100%" border="0" cellspacing="0" cellpadding="0">
+ <thead>
+ <tr>
+ <th class="listhdrr" width="40%"><?=gettext("Source -> Destination");?></th>
+ <th class="listhdrr" width="15%"><?=gettext("# States");?></th>
+ <th class="listhdrr" width="15%"><?=gettext("# Connections");?></th>
+ <th class="listhdr" width="15%"><?=gettext("Rate");?></th>
+ <th class="list sort_ignore" width="1%"></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+$row = 0;
+if (count($sources) > 0) {
+ foreach ($sources as $line) {
+ if ($row >= 1000) {
+ break;
+ }
+
+ // 192.168.20.2 -> 216.252.56.1 ( states 10, connections 0, rate 0.0/0s )
+
+ $source_split = "";
+ preg_match("/(.*)\s\(\sstates\s(.*),\sconnections\s(.*),\srate\s(.*)\s\)/", $line, $source_split);
+ list($all, $info, $numstates, $numconnections, $rate) = $source_split;
+
+ $source_split = "";
+ preg_match("/(.*)\s\<?-\>?\s(.*)/", $info, $source_split);
+ list($all, $srcip, $dstip) = $source_split;
+
+ ?>
+ <tr valign='top' name='r:<?php echo "{$srcip}:{$dstip}" ?>'>
+ <td class='listlr'><?php echo $info;?></td>
+ <td class='listr'><?php echo $numstates;?></td>
+ <td class='listr'><?php echo $numconnections;?></td>
+ <td class='listr'><?php echo $rate;?></td>
+ <td class='list'>
+ <img src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif' height='17' width='17' border='0'
+ onclick="removeSource(<?php echo "'{$srcip}', '{$dstip}'"; ?>);" style='cursor:pointer;'
+ name='i:<?php echo "{$srcip}:{$dstip}"; ?>'
+ title='<?php echo gettext("Remove all source tracking entries from") . " {$srcip} " . gettext("to") . " {$dstip}";?>' alt='' />
+ </td>
+ </tr>
+<?php
+ $row++;
+ }
+} else {
+ echo "<tr>
+ <td class='list' colspan='5' align='center' valign='top'>
+ " . gettext("No source tracking entries were found.") . "
+ </td>
+ </tr>";
+}
+?>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<!-- End of tab content -->
+
+ </div>
+ </td>
+ </tr>
+</table>
+
+<?php require("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_gmirror.php b/src/usr/local/www/diag_gmirror.php
new file mode 100644
index 0000000..f0f5bff
--- /dev/null
+++ b/src/usr/local/www/diag_gmirror.php
@@ -0,0 +1,406 @@
+<?php
+/*
+ diag_gmirror.php
+ Copyright (C) 2014 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/gmirror /sbin/geom /usr/bin/grep /usr/bin/egrep /usr/bin/cut /usr/bin/head
+ pfSense_BUILDER_BINARIES: /sbin/mount /usr/bin/awk /usr/bin/sed
+ pfSense_MODULE: gmirror
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-gmirror
+##|*NAME=Diagnostics: GEOM Mirrors
+##|*DESCR=Allow access to the 'Diagnostics: GEOM Mirrors' page.
+##|*MATCH=diag_gmirror.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("config.inc");
+require_once("gmirror.inc");
+
+$pgtitle = array(gettext("Diagnostics"), gettext("GEOM Mirrors"));
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
+
+<?php include("fbegin.inc"); ?>
+
+<?php
+$action_list = array(
+ "forget" => gettext("Forget all formerly connected consumers"),
+ "clear" => gettext("Remove metadata from disk"),
+ "insert" => gettext("Insert consumer into mirror"),
+ "remove" => gettext("Remove consumer from mirror"),
+ "activate" => gettext("Reactivate consumer on mirror"),
+ "deactivate" => gettext("Deactivate consumer from mirror"),
+ "rebuild" => gettext("Force rebuild of mirror consumer"),
+);
+
+/* User tried to pass a bogus action */
+if (!empty($_REQUEST['action']) && !array_key_exists($_REQUEST['action'], $action_list)) {
+ header("Location: diag_gmirror.php");
+ return;
+}
+
+if ($_POST) {
+ if (!isset($_POST['confirm']) || ($_POST['confirm'] != gettext("Confirm"))) {
+ header("Location: diag_gmirror.php");
+ return;
+ }
+ $input_errors = "";
+
+ if (($_POST['action'] != "clear") && !is_valid_mirror($_POST['mirror'])) {
+ $input_errors[] = gettext("You must supply a valid mirror name.");
+ }
+
+ if (!empty($_POST['consumer']) && !is_valid_consumer($_POST['consumer'])) {
+ $input_errors[] = gettext("You must supply a valid consumer name");
+ }
+
+ /* Additional action-specific validation that hasn't already been tested */
+ switch ($_POST['action']) {
+ case "insert":
+ if (!is_consumer_unused($_POST['consumer'])) {
+ $input_errors[] = gettext("Consumer is already in use and cannot be inserted. Remove consumer from existing mirror first.");
+ }
+ if (gmirror_consumer_has_metadata($_POST['consumer'])) {
+ $input_errors[] = gettext("Consumer has metadata from an existing mirror. Clear metadata before inserting consumer.");
+ }
+ $mstat = gmirror_get_status_single($_POST['mirror']);
+ if (strtoupper($mstat) != "COMPLETE") {
+ $input_errors[] = gettext("Mirror is not in a COMPLETE state, cannot insert consumer. Forget disconnected disks or wait for rebuild to finish.");
+ }
+ break;
+ case "clear":
+ if (!is_consumer_unused($_POST['consumer'])) {
+ $input_errors[] = gettext("Consumer is in use and cannot be cleared. Deactivate disk first.");
+ }
+ if (!gmirror_consumer_has_metadata($_POST['consumer'])) {
+ $input_errors[] = gettext("Consumer has no metadata to clear.");
+ }
+ break;
+ case "activate":
+ if (is_consumer_in_mirror($_POST['consumer'], $_POST['mirror'])) {
+ $input_errors[] = gettext("Consumer is already present on specified mirror.");
+ }
+ if (!gmirror_consumer_has_metadata($_POST['consumer'])) {
+ $input_errors[] = gettext("Consumer has no metadata and cannot be reactivated.");
+ }
+
+ break;
+ case "remove":
+ case "deactivate":
+ case "rebuild":
+ if (!is_consumer_in_mirror($_POST['consumer'], $_POST['mirror'])) {
+ $input_errors[] = gettext("Consumer must be present on the specified mirror.");
+ }
+ break;
+ }
+
+ $result = 0;
+ if (empty($input_errors)) {
+ switch ($_POST['action']) {
+ case "forget":
+ $result = gmirror_forget_disconnected($_POST['mirror']);
+ break;
+ case "clear":
+ $result = gmirror_clear_consumer($_POST['consumer']);
+ break;
+ case "insert":
+ $result = gmirror_insert_consumer($_POST['mirror'], $_POST['consumer']);
+ break;
+ case "remove":
+ $result = gmirror_remove_consumer($_POST['mirror'], $_POST['consumer']);
+ break;
+ case "activate":
+ $result = gmirror_activate_consumer($_POST['mirror'], $_POST['consumer']);
+ break;
+ case "deactivate":
+ $result = gmirror_deactivate_consumer($_POST['mirror'], $_POST['consumer']);
+ break;
+ case "rebuild":
+ $result = gmirror_force_rebuild($_POST['mirror'], $_POST['consumer']);
+ break;
+ }
+ $redir = "Location: diag_gmirror.php";
+ if ($result != 0) {
+ $redir .= "?error=" . urlencode($result);
+ }
+ /* If we reload the page too fast, the gmirror information may be missing or not up-to-date. */
+ sleep(3);
+ header($redir);
+ return;
+ }
+}
+
+$mirror_status = gmirror_get_status();
+$mirror_list = gmirror_get_mirrors();
+$unused_disks = gmirror_get_disks();
+$unused_consumers = array();
+foreach ($unused_disks as $disk) {
+ if (is_consumer_unused($disk)) {
+ $unused_consumers = array_merge($unused_consumers, gmirror_get_all_unused_consumer_sizes_on_disk($disk));
+ }
+}
+
+if ($input_errors) {
+ print_input_errors($input_errors);
+}
+if ($_GET["error"] && ($_GET["error"] != 0)) {
+ print_info_box(gettext("There was an error performing the chosen mirror operation. Check the System Log for details."));
+}
+
+?>
+<form action="diag_gmirror.php" method="POST" id="gmirror_form" name="gmirror_form">
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("NOTE:")?>&nbsp;</strong>
+ </span>
+ <?=gettext("The options on this page are intended for use by advanced users only. This page is for managing existing mirrors, not creating new mirrors.")?>
+ <br />&nbsp;
+ </span>
+ <p/>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0">
+
+<?php
+ if ($_GET["action"]):
+?>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?php echo gettext("Confirm Action"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <strong><?php echo gettext("Please confirm the selected action"); ?></strong>:
+ <br />
+ <br /><strong><?php echo gettext("Action"); ?>:</strong> <?php echo $action_list[$_GET["action"]]; ?>
+ <input type="hidden" name="action" value="<?php echo htmlspecialchars($_GET["action"]); ?>" />
+ <?php if (!empty($_GET["mirror"])): ?>
+ <br /><strong><?php echo gettext("Mirror"); ?>:</strong> <?php echo htmlspecialchars($_GET["mirror"]); ?>
+ <input type="hidden" name="mirror" value="<?php echo htmlspecialchars($_GET["mirror"]); ?>" />
+ <?php endif; ?>
+ <?php if (!empty($_GET["consumer"])): ?>
+ <br /><strong><?php echo gettext("Consumer"); ?>:</strong> <?php echo htmlspecialchars($_GET["consumer"]); ?>
+ <input type="hidden" name="consumer" value="<?php echo htmlspecialchars($_GET["consumer"]); ?>" />
+ <?php endif; ?>
+ <br />
+ <br /><input type="submit" name="confirm" value="<?php echo gettext("Confirm"); ?>" />
+ </td>
+ </tr>
+<?php
+ else:
+?>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?php echo gettext("GEOM Mirror information"); ?></td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?php echo gettext("Mirror Status"); ?></td>
+ <td width="78%" class="vtable">
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="gmirror status">
+ <tbody id="gmirror_status_table">
+<?php
+ if (count($mirror_status) > 0):
+?>
+ <tr>
+ <td width="30%" class="vncellt"><?php echo gettext("Name"); ?></td>
+ <td width="30%" class="vncellt"><?php echo gettext("Status"); ?></td>
+ <td width="40%" class="vncellt"><?php echo gettext("Component"); ?></td>
+ </tr>
+<?php
+ foreach ($mirror_status as $mirror => $name):
+ $components = count($name["components"]);
+?>
+ <tr>
+ <td width="30%" rowspan="<?php echo $components; ?>" class="listr">
+ <?php echo htmlspecialchars($name['name']); ?>
+ <br />Size: <?php echo gmirror_get_mirror_size($name['name']); ?>
+ </td>
+ <td width="30%" rowspan="<?php echo $components; ?>" class="listr">
+ <?php echo htmlspecialchars($name['status']); ?>
+<?php
+ if (strtoupper($name['status']) == "DEGRADED"):
+?>
+ <br /><a href="diag_gmirror.php?action=forget&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Forget Disconnected Disks"); ?>]</a>
+<?php
+ endif;
+?>
+ </td>
+ <td width="40%" class="listr">
+ <?php echo $name['components'][0]; ?>
+ <?php list($cname, $cstatus) = explode(" ", $name['components'][0], 2); ?>
+ <br />
+<?php
+ if ((strtoupper($name['status']) == "COMPLETE") && (count($name["components"]) > 1)):
+?>
+ <a href="diag_gmirror.php?action=rebuild&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Rebuild"); ?>]</a>
+ <a href="diag_gmirror.php?action=deactivate&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Deactivate"); ?>]</a>
+ <a href="diag_gmirror.php?action=remove&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Remove"); ?>]</a>
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+<?php
+ if (count($name["components"]) > 1):
+ $morecomponents = array_slice($name["components"], 1);
+ foreach ($morecomponents as $component):
+?>
+ <tr>
+ <td width="40%" class="listr">
+ <?php echo $component; ?>
+ <?php list($cname, $cstatus) = explode(" ", $component, 2); ?>
+ <br />
+<?php
+ if ((strtoupper($name['status']) == "COMPLETE") && (count($name["components"]) > 1)):
+?>
+ <a href="diag_gmirror.php?action=rebuild&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Rebuild"); ?>]</a>
+ <a href="diag_gmirror.php?action=deactivate&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Deactivate"); ?>]</a>
+ <a href="diag_gmirror.php?action=remove&amp;consumer=<?php echo htmlspecialchars($cname); ?>&amp;mirror=<?php echo htmlspecialchars($name['name']); ?>">[<?php echo gettext("Remove"); ?>]</a>
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+<?php
+ endforeach;
+ endif;
+ endforeach;
+ else:
+?>
+ <tr>
+ <td colspan="3" class="listr"><?php echo gettext("No Mirrors Found"); ?></td>
+ </tr>
+<?php
+ endif;
+?>
+ </tbody>
+ </table>
+ <br /><?php echo gettext("Some disk operations may only be performed when there are multiple consumers present in a mirror."); ?>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?php echo gettext("Consumer information"); ?></td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?php echo gettext("Available Consumers"); ?></td>
+ <td width="78%" class="vtable">
+
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="consumer list">
+ <tbody id="consumer_list">
+<?php
+ if (count($unused_consumers) > 0):
+?>
+ <tr>
+ <td width="30%" class="vncellt"><?php echo gettext("Name"); ?></td>
+ <td width="30%" class="vncellt"><?php echo gettext("Size"); ?></td>
+ <td width="40%" class="vncellt"><?php echo gettext("Add to Mirror"); ?></td>
+ </tr>
+<?php
+ foreach ($unused_consumers as $consumer):
+?>
+ <tr>
+ <td width="30%" class="listr">
+ <?php echo htmlspecialchars($consumer['name']); ?>
+ </td>
+ <td width="30%" class="listr"><?php echo htmlspecialchars($consumer['size']); ?> <?php echo htmlspecialchars($consumer['humansize']); ?></td>
+ <td width="40%" class="listr">
+<?php
+ $oldmirror = gmirror_get_consumer_metadata_mirror($consumer['name']);
+ if ($oldmirror):
+?>
+ <a href="diag_gmirror.php?action=activate&amp;consumer=<?php echo htmlspecialchars($consumer['name']); ?>&amp;mirror=<?php echo htmlspecialchars($oldmirror); ?>">[<?php echo gettext("Reactivate on:") . ' ' . htmlspecialchars($oldmirror); ?>]</a>
+ <br /><a href="diag_gmirror.php?action=clear&amp;consumer=<?php echo htmlspecialchars($consumer['name']); ?>">[<?php echo gettext("Remove metadata from disk"); ?>]</a>
+<?php
+ else:
+ foreach ($mirror_list as $mirror):
+ $mirror_size = gmirror_get_mirror_size($mirror);
+ $consumer_size = gmirror_get_unused_consumer_size($consumer['name']);
+ if ($consumer_size > $mirror_size):
+?>
+ <a href="diag_gmirror.php?action=insert&amp;consumer=<?php echo htmlspecialchars($consumer['name']); ?>&amp;mirror=<?php echo htmlspecialchars($mirror); ?>"><?php echo htmlspecialchars($mirror); ?></a>
+<?php
+ endif;
+ endforeach;
+ endif;
+?>
+ </td>
+ </tr>
+<?php
+ endforeach;
+ else:
+?>
+ <tr>
+ <td colspan="3" class="listr">
+ <?php echo gettext("No unused consumers found"); ?>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ </tbody>
+ </table>
+ <br /><?php echo gettext("Consumers may only be added to a mirror if they are larger than the size of the mirror."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class=""><?php echo gettext("To repair a failed mirror, first perform a 'Forget' command on the mirror, followed by an 'insert' action on the new consumer."); ?></td>
+ </tr>
+<?php
+ endif;
+?>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php require("fend.inc"); ?>
+</body>
+</html>
+
+<?php
+
+// Clear the loading indicator
+echo "<script type=\"text/javascript\">";
+echo "jQuery('#loading').html('');";
+echo "</script>";
+
+?>
diff --git a/src/usr/local/www/diag_ipsec.php b/src/usr/local/www/diag_ipsec.php
new file mode 100644
index 0000000..96c6835
--- /dev/null
+++ b/src/usr/local/www/diag_ipsec.php
@@ -0,0 +1,555 @@
+<?php
+/* $Id$ */
+/*
+ diag_ipsec.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2008 Shrew Soft Inc <mgrooms@shrew.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Parts of this code was originally based on vpn_ipsec_sad.php
+ Copyright (C) 2003-2004 Manuel Kasper
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: ipsec
+*/
+
+##|+PRIV
+##|*IDENT=page-status-ipsec
+##|*NAME=Status: IPsec page
+##|*DESCR=Allow access to the 'Status: IPsec' page.
+##|*MATCH=diag_ipsec.php*
+##|-PRIV
+
+
+global $g;
+
+$pgtitle = array(gettext("Status"), gettext("IPsec"));
+$shortcut_section = "ipsec";
+
+require("guiconfig.inc");
+include("head.inc");
+require("ipsec.inc");
+
+if ($_GET['act'] == 'connect') {
+ if (ctype_digit($_GET['ikeid'])) {
+ $ph1ent = ipsec_get_phase1($_GET['ikeid']);
+ if (!empty($ph1ent)) {
+ if (empty($ph1ent['iketype']) || $ph1ent['iketype'] == 'ikev1') {
+ $ph2entries = ipsec_get_number_of_phase2($_GET['ikeid']);
+ for ($i = 0; $i < $ph2entries; $i++) {
+ $connid = escapeshellarg("con{$_GET['ikeid']}00{$i}");
+ mwexec("/usr/local/sbin/ipsec down {$connid}");
+ mwexec("/usr/local/sbin/ipsec up {$connid}");
+ }
+ } else {
+ mwexec("/usr/local/sbin/ipsec down con" . escapeshellarg($_GET['ikeid']));
+ mwexec("/usr/local/sbin/ipsec up con" . escapeshellarg($_GET['ikeid']));
+ }
+ }
+ }
+} else if ($_GET['act'] == 'ikedisconnect') {
+ if (ctype_digit($_GET['ikeid'])) {
+ if (!empty($_GET['ikesaid']) && ctype_digit($_GET['ikesaid'])) {
+ mwexec("/usr/local/sbin/ipsec down con" . escapeshellarg($_GET['ikeid']) . "[" . escapeshellarg($_GET['ikesaid']) . "]");
+ } else {
+ mwexec("/usr/local/sbin/ipsec down con" . escapeshellarg($_GET['ikeid']));
+ }
+ }
+} else if ($_GET['act'] == 'childdisconnect') {
+ if (ctype_digit($_GET['ikeid'])) {
+ if (!empty($_GET['ikesaid']) && ctype_digit($_GET['ikesaid'])) {
+ mwexec("/usr/local/sbin/ipsec down con" . escapeshellarg($_GET['ikeid']) . "{" . escapeshellarg($_GET['ikesaid']) . "}");
+ }
+ }
+}
+
+if (!is_array($config['ipsec']['phase1'])) {
+ $config['ipsec']['phase1'] = array();
+}
+
+$a_phase1 = &$config['ipsec']['phase1'];
+
+$status = ipsec_smp_dump_status();
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?php echo $jsevents["body"]["onload"]; ?>">
+<?php include("fbegin.inc"); ?>
+<div id="inputerrors"></div>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ipsec">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Overview"), true, "diag_ipsec.php");
+ $tab_array[1] = array(gettext("Leases"), false, "diag_ipsec_leases.php");
+ $tab_array[2] = array(gettext("SAD"), false, "diag_ipsec_sad.php");
+ $tab_array[3] = array(gettext("SPD"), false, "diag_ipsec_spd.php");
+ $tab_array[4] = array(gettext("Logs"), false, "diag_logs_ipsec.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" class="tabcont sortable" summary="status">
+ <thead>
+ <tr>
+ <th class="listhdrr nowrap"><?php echo gettext("Description");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Local ID");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Local IP");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Remote ID");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Remote IP");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Role");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Reauth");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Algo");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Status");?></th>
+ <th class="list nowrap"></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ $ipsecconnected = array();
+ if (is_array($status['query']) && is_array($status['query']['ikesalist']) && is_array($status['query']['ikesalist']['ikesa'])):
+ foreach ($status['query']['ikesalist']['ikesa'] as $ikeid => $ikesa):
+ $con_id = substr($ikesa['peerconfig'], 3);
+ if ($ikesa['version'] == 1) {
+ $ph1idx = substr($con_id, 0, strrpos(substr($con_id, 0, -1), '00'));
+ $ipsecconnected[$ph1idx] = $ph1idx;
+ } else {
+ $ipsecconnected[$con_id] = $ph1idx = $con_id;
+ }
+
+ if (ipsec_phase1_status($status['query']['ikesalist']['ikesa'], $ikesa['id'])) {
+ $icon = "pass";
+ } elseif (!isset($config['ipsec']['enable'])) {
+ $icon = "block";
+ } else {
+ $icon = "reject";
+ }
+?>
+ <tr>
+ <td class="listlr">
+<?php
+ echo htmlspecialchars(ipsec_get_descr($ph1idx));
+?>
+ </td>
+ <td class="listr">
+<?php
+ if (!is_array($ikesa['local'])) {
+ echo gettext("Unknown");
+ } else {
+ if (!empty($ikesa['local']['identification'])) {
+ if ($ikesa['local']['identification'] == '%any') {
+ echo gettext('Any identifier');
+ } else {
+ echo htmlspecialchars($ikesa['local']['identification']);
+ }
+ } else {
+ echo gettext("Unknown");
+ }
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ if (!is_array($ikesa['local'])) {
+ echo gettext("Unknown");
+ } else {
+ if (!empty($ikesa['local']['address'])) {
+ echo htmlspecialchars($ikesa['local']['address']) . '<br/>' .
+ gettext('Port: ') . htmlspecialchars($ikesa['local']['port']);
+ } else {
+ echo gettext("Unknown");
+ }
+ if ($ikesa['local']['port'] == '4500') {
+ echo " NAT-T";
+ }
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ if (!is_array($ikesa['remote'])) {
+ echo gettext("Unknown");
+ } else {
+ $identity = "";
+ if (!empty($ikesa['remote']['identification'])) {
+ if ($ikesa['remote']['identification'] == '%any') {
+ $identity = 'Any identifier';
+ } else {
+ $identity = htmlspecialchars($ikesa['remote']['identification']);
+ }
+ }
+
+ if (is_array($ikesa['remote']['auth']) && !empty($ikesa['remote']['auth'][0]['identity'])) {
+ echo htmlspecialchars($ikesa['remote']['auth'][0]['identity']);
+ echo "<br/>{$identity}";
+ } else {
+ if (empty($identity)) {
+ echo gettext("Unknown");
+ } else {
+ echo $identity;
+ }
+ }
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ if (!is_array($ikesa['remote'])) {
+ echo gettext("Unknown");
+ } else {
+ if (!empty($ikesa['remote']['address'])) {
+ echo htmlspecialchars($ikesa['remote']['address']) . '<br/>' .
+ gettext('Port: ') . htmlspecialchars($ikesa['remote']['port']);
+ } else {
+ echo gettext("Unknown");
+ }
+ if ($ikesa['remote']['port'] == '4500') {
+ echo " NAT-T";
+ }
+ }
+?>
+ </td>
+ <td class="listr">
+ IKEv<?php echo htmlspecialchars($ikesa['version']);?>
+ <br/>
+<?php
+ echo htmlspecialchars($ikesa['role']);
+?>
+ </td>
+ <td class="listr">
+<?php
+ echo htmlspecialchars($ikesa['reauth']);
+?>
+ </td>
+ <td class="listr">
+<?php
+ echo htmlspecialchars($ikesa['encalg']);
+ echo "<br/>";
+ echo htmlspecialchars($ikesa['intalg']);
+ echo "<br/>";
+ echo htmlspecialchars($ikesa['prfalg']);
+ echo "<br/>";
+ echo htmlspecialchars($ikesa['dhgroup']);
+?>
+ </td>
+ <td class="listr">
+ <center>
+ <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_<?php echo $icon; ?>.gif" title="<?php echo $ikesa['status']; ?>" alt=""/>
+ <br/><?php echo htmlspecialchars($ikesa['status']);?>
+ <br/><?php echo htmlspecialchars($ikesa['established']);?>
+ </center>
+ </td>
+ <td >
+<?php
+ if ($icon != "pass"):
+?>
+ <center>
+ <a href="diag_ipsec.php?act=connect&amp;ikeid=<?php echo $con_id; ?>">
+ <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_service_start.gif" alt=<?php echo gettext("Connect VPN");?> title=<?php echo gettext("Connect VPN");?> border="0"/>
+ </a>
+ </center>
+<?php
+ else:
+?>
+ <center>
+ <a href="diag_ipsec.php?act=ikedisconnect&amp;ikeid=<?php echo $con_id; ?>">
+ <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_service_stop.gif" alt=<?php echo gettext("Disconnect VPN");?> title=<?php echo gettext("Disconnect VPN");?> border="0"/>
+ </a>
+ <a href="diag_ipsec.php?act=ikedisconnect&amp;ikeid=<?php echo $con_id; ?>&amp;ikesaid=<?php echo $ikesa['id']; ?>">
+ <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" alt=<?php echo gettext("Disconnect VPN Connection");?> title=<?php echo gettext("Disconnect VPN Connection");?> border="0"/>
+ </a>
+ </center>
+<?php
+ endif;
+?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="">
+ </table>
+ </td>
+ </tr>
+<?php
+ if (is_array($ikesa['childsalist'])):
+?>
+ <tr>
+ <td class="listrborder" colspan="9">
+ <div id="btnchildsa-<?=$ikeid;?>">
+ <input type="button" onclick="show_childsa('childsa-<?=$ikeid;?>', 'btnchildsa-<?=$ikeid;?>');" value="+" /> - Show child SA entries
+ </div>
+ <table class="tabcont" width="100%" height="100%" border="0" cellspacing="0" cellpadding="0" id="childsa-<?=$ikeid;?>" style="display:none" summary="">
+ <thead>
+ <tr>
+ <th class="listhdrr nowrap"><?php echo gettext("Local subnets");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Local SPI(s)");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Remote subnets");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Times");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Algo");?></th>
+ <th class="listhdrr nowrap"><?php echo gettext("Stats");?></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ if (is_array($ikesa['childsalist']['childsa'])):
+ foreach ($ikesa['childsalist']['childsa'] as $childsa):
+?>
+ <tr valign="top">
+ <td class="listlr nowrap">
+<?php
+ if (is_array($childsa['local']) &&
+ is_array($childsa['local']['networks']) &&
+ is_array($childsa['local']['networks']['network'])) {
+ foreach ($childsa['local']['networks']['network'] as $lnets) {
+ echo htmlspecialchars(ipsec_fixup_network($lnets)) . "<br />";
+ }
+ } else {
+ echo gettext("Unknown");
+ }
+?>
+ </td>
+ <td class="listr nowrap">
+<?php
+ if (is_array($childsa['local'])) {
+ echo gettext("Local: ") . htmlspecialchars($childsa['local']['spi']);
+ }
+ if (is_array($childsa['remote'])) {
+ echo "<br/>" . gettext("Remote: ") . htmlspecialchars($childsa['remote']['spi']);
+ }
+?>
+ </td>
+ <td class="listr nowrap">
+<?php
+ if (is_array($childsa['remote']) &&
+ is_array($childsa['remote']['networks']) &&
+ is_array($childsa['remote']['networks']['network'])) {
+ foreach ($childsa['remote']['networks']['network'] as $rnets) {
+ echo htmlspecialchars(ipsec_fixup_network($rnets)) . "<br />";
+ }
+ } else {
+ echo gettext("Unknown");
+ }
+?>
+ </td>
+ <td class="listr nowrap">
+<?php
+ echo gettext("Rekey: ") . htmlspecialchars($childsa['rekey']);
+ echo "<br/>" . gettext("Life: ") . htmlspecialchars($childsa['lifetime']);
+ echo "<br/>" . gettext("Install: ") .htmlspecialchars($childsa['installtime']);
+
+?>
+ </td>
+ <td class="listr nowrap">
+<?php
+ echo htmlspecialchars($childsa['encalg']);
+ echo "<br/>";
+ echo htmlspecialchars($childsa['intalg']);
+ echo "<br/>";
+ if (!empty($childsa['prfalg'])) {
+ echo htmlspecialchars($childsa['prfalg']);
+ echo "<br/>";
+ }
+ if (!empty($childsa['dhgroup'])) {
+ echo htmlspecialchars($childsa['dhgroup']);
+ echo "<br/>";
+ }
+ if (!empty($childsa['esn'])) {
+ echo htmlspecialchars($childsa['esn']);
+ echo "<br/>";
+ }
+ echo gettext("IPComp: ") . htmlspecialchars($childsa['ipcomp']);
+?>
+ </td>
+ <td class="listr nowrap">
+<?php
+ echo gettext("Bytes-In: ") . htmlspecialchars($childsa['bytesin']);
+ echo "<br/>";
+ echo gettext("Packets-In: ") . htmlspecialchars($childsa['packetsin']);
+ echo "<br/>";
+ echo gettext("Bytes-Out: ") . htmlspecialchars($childsa['bytesout']);
+ echo "<br/>";
+ echo gettext("Packets-Out: ") . htmlspecialchars($childsa['packetsout']);
+?>
+ </td>
+ <td>
+ <center>
+ <a href="diag_ipsec.php?act=childdisconnect&amp;ikeid=<?php echo $con_id; ?>&amp;ikesaid=<?php echo $childsa['reqid']; ?>">
+ <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" alt=<?php echo gettext("Disconnect Child SA");?> title=<?php echo gettext("Disconnect Child SA");?> border="0"/>
+ </a>
+ </center>
+ </td>
+ <td class="list nowrap">
+ &nbsp;
+ </td>
+ </tr>
+<?php
+ endforeach;
+ endif;
+?>
+ <tr style="display:none;"><td></td></tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+
+ unset($con_id);
+ endforeach;
+ endif;
+
+ $rgmap = array();
+ foreach ($a_phase1 as $ph1ent):
+ if (isset($ph1ent['disabled'])) {
+ continue;
+ }
+ $rgmap[$ph1ent['remote-gateway']] = $ph1ent['remote-gateway'];
+ if ($ipsecconnected[$ph1ent['ikeid']]) {
+ continue;
+ }
+?>
+ <tr>
+ <td class="listlr">
+<?php
+ echo htmlspecialchars($ph1ent['descr']);
+?>
+ </td>
+ <td class="listr">
+<?php
+ list ($myid_type, $myid_data) = ipsec_find_id($ph1ent, "local");
+ if (empty($myid_data)) {
+ echo gettext("Unknown");
+ } else {
+ echo htmlspecialchars($myid_data);
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ $ph1src = ipsec_get_phase1_src($ph1ent);
+ if (empty($ph1src)) {
+ echo gettext("Unknown");
+ } else {
+ echo htmlspecialchars($ph1src);
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ list ($peerid_type, $peerid_data) = ipsec_find_id($ph1ent, "peer", $rgmap);
+ if (empty($peerid_data)) {
+ echo gettext("Unknown");
+ } else {
+ echo htmlspecialchars($peerid_data);
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ $ph1src = ipsec_get_phase1_dst($ph1ent);
+ if (empty($ph1src)) {
+ echo gettext("Unknown");
+ } else {
+ echo htmlspecialchars($ph1src);
+ }
+?>
+ </td>
+ <td class="listr" >
+ </td>
+ <td class="listr" >
+ </td>
+ <td class="listr" >
+ </td>
+<?php
+ if (isset($ph1ent['mobile'])):
+?>
+ <td class="listr">
+ <center>
+ <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_pass.gif" title=<?php echo gettext("Awaiting connections");?> alt=""/>
+ <br/><?php echo gettext("Awaiting connections");?>
+ </center>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="">
+ </table>
+ </td>
+<?php
+ else:
+?>
+ <td class="listr">
+ <center>
+ <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_reject.gif" title=<?php echo gettext("Disconnected");?> alt=""/>
+ <br/><?php echo gettext("Disconnected");?>
+ </center>
+ </td>
+ <td >
+ <center>
+ <a href="diag_ipsec.php?act=connect&amp;ikeid=<?php echo $ph1ent['ikeid']; ?>">
+ <img src ="/themes/<?php echo $g['theme']; ?>/images/icons/icon_service_start.gif" alt=<?php echo gettext("Connect VPN");?> title=<?php echo gettext("Connect VPN");?> border="0"/>
+ </a>
+ </center>
+ </td>
+<?php
+ endif;
+?>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="">
+ </table>
+ </td>
+ </tr>
+<?php
+ endforeach;
+ unset($ipsecconnected, $phase1, $rgmap);
+?>
+ <tr style="display:none;"><td></td></tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+
+<p class="vexpl">
+ <span class="red">
+ <strong><?php echo gettext("Note:");?><br /></strong>
+ </span>
+ <?php echo gettext("You can configure IPsec");?>
+ <a href="vpn_ipsec.php">here</a>.
+</p>
+<?php unset($status); include("fend.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+function show_childsa(id, buttonid) {
+ document.getElementById(buttonid).innerHTML='';
+ aodiv = document.getElementById(id);
+ aodiv.style.display = "block";
+}
+//]]>
+</script>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_ipsec_leases.php b/src/usr/local/www/diag_ipsec_leases.php
new file mode 100644
index 0000000..501c83a
--- /dev/null
+++ b/src/usr/local/www/diag_ipsec_leases.php
@@ -0,0 +1,131 @@
+<?php
+/* $Id$ */
+/*
+ diag_ipsec_leases.php
+ Copyright (C) 2014 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/ipsec
+ pfSense_MODULE: ipsec
+*/
+
+##|+PRIV
+##|*IDENT=page-status-ipsec-leases
+##|*NAME=Status: IPsec: Leases page
+##|*DESCR=Allow access to the 'Status: IPsec: Leases' page.
+##|*MATCH=diag_ipsec_leases.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("ipsec.inc");
+
+$pgtitle = array(gettext("Status"), gettext("IPsec"), gettext("Leases"));
+$shortcut_section = "ipsec";
+include("head.inc");
+
+$mobile = ipsec_dump_mobile();
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+ <?php include("fbegin.inc"); ?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ipsec sad">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Overview"), false, "diag_ipsec.php");
+ $tab_array[1] = array(gettext("Leases"), true, "diag_ipsec_leases.php");
+ $tab_array[2] = array(gettext("SAD"), false, "diag_ipsec_sad.php");
+ $tab_array[3] = array(gettext("SPD"), false, "diag_ipsec_spd.php");
+ $tab_array[4] = array(gettext("Logs"), false, "diag_logs_ipsec.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <?php if (isset($mobile['pool']) && is_array($mobile['pool'])): ?>
+ <?php foreach ($mobile['pool'] as $pool): ?>
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="4" valign="top" class="listtopic">
+ <?php
+ echo gettext("Pool: ") . $pool['name'];
+ echo ' ' . gettext("usage: ") . $pool['usage'];
+ echo ' ' . gettext("online: ") . $pool['online'];
+ ?>
+ </td>
+ </tr>
+ <?php if (is_array($pool['lease']) && count($pool['lease']) > 0): ?>
+ <tr>
+ <td class="listhdrr nowrap"><?=gettext("ID");?></td>
+ <td class="listhdrr nowrap"><?=gettext("Host");?></td>
+ <td class="listhdrr nowrap"><?=gettext("Status");?></td>
+ <td class="list nowrap"></td>
+ </tr>
+ <?php foreach ($pool['lease'] as $lease): ?>
+ <tr>
+ <td class="listlr"><?=htmlspecialchars($lease['id']);?></td>
+ <td class="listr"><?=htmlspecialchars($lease['host']);?></td>
+ <td class="listr"><?=htmlspecialchars($lease['status']);?></td>
+ <td class="list nowrap">
+ </td>
+ </tr>
+ <?php endforeach;
+ else: ?>
+ <tr>
+ <td>
+ <p><strong><?=gettext("No leases from this pool yet.");?></strong></p>
+ </td>
+ </tr>
+ <?php endif; ?>
+ </table>
+ <?php endforeach; ?>
+ <?php else: ?>
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td>
+ <p><strong><?=gettext("No IPsec pools.");?></strong></p>
+ </td>
+ </tr>
+ </table>
+ <?php endif; ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+<p class="vexpl">
+<span class="red"><strong><?=gettext("Note:");?><br /></strong></span>
+<?=gettext("You can configure your IPsec");?> <a href="vpn_ipsec.php"><?=gettext("here.");?></a>
+</p>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_ipsec_sad.php b/src/usr/local/www/diag_ipsec_sad.php
new file mode 100644
index 0000000..f958d29
--- /dev/null
+++ b/src/usr/local/www/diag_ipsec_sad.php
@@ -0,0 +1,141 @@
+<?php
+/* $Id$ */
+/*
+ diag_ipsec_sad.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/setkey
+ pfSense_MODULE: ipsec
+*/
+
+##|+PRIV
+##|*IDENT=page-status-ipsec-sad
+##|*NAME=Status: IPsec: SAD page
+##|*DESCR=Allow access to the 'Status: IPsec: SAD' page.
+##|*MATCH=diag_ipsec_sad.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("ipsec.inc");
+
+$pgtitle = array(gettext("Status"), gettext("IPsec"), gettext("SAD"));
+$shortcut_section = "ipsec";
+include("head.inc");
+
+$sad = ipsec_dump_sad();
+
+/* delete any SA? */
+if ($_GET['act'] == "del") {
+ $fd = @popen("/sbin/setkey -c > /dev/null 2>&1", "w");
+ if ($fd) {
+ fwrite($fd, "delete {$_GET['src']} {$_GET['dst']} {$_GET['proto']} {$_GET['spi']} ;\n");
+ pclose($fd);
+ sleep(1);
+ }
+}
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+ <?php include("fbegin.inc"); ?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ipsec sad">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Overview"), false, "diag_ipsec.php");
+ $tab_array[1] = array(gettext("Leases"), false, "diag_ipsec_leases.php");
+ $tab_array[2] = array(gettext("SAD"), true, "diag_ipsec_sad.php");
+ $tab_array[3] = array(gettext("SPD"), false, "diag_ipsec_spd.php");
+ $tab_array[4] = array(gettext("Logs"), false, "diag_logs_ipsec.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <?php if (count($sad)): ?>
+ <tr>
+ <td class="listhdrr nowrap"><?=gettext("Source");?></td>
+ <td class="listhdrr nowrap"><?=gettext("Destination");?></td>
+ <td class="listhdrr nowrap"><?=gettext("Protocol");?></td>
+ <td class="listhdrr nowrap"><?=gettext("SPI");?></td>
+ <td class="listhdrr nowrap"><?=gettext("Enc. alg.");?></td>
+ <td class="listhdr nowrap"><?=gettext("Auth. alg.");?></td>
+ <td class="listhdr nowrap"><?=gettext("Data");?></td>
+ <td class="list nowrap"></td>
+ </tr>
+ <?php foreach ($sad as $sa): ?>
+ <tr>
+ <td class="listlr"><?=htmlspecialchars($sa['src']);?></td>
+ <td class="listr"><?=htmlspecialchars($sa['dst']);?></td>
+ <td class="listr"><?=htmlspecialchars(strtoupper($sa['proto']));?></td>
+ <td class="listr"><?=htmlspecialchars($sa['spi']);?></td>
+ <td class="listr"><?=htmlspecialchars($sa['ealgo']);?></td>
+ <td class="listr"><?=htmlspecialchars($sa['aalgo']);?></td>
+ <td class="listr"><?=htmlspecialchars($sa['data']);?></td>
+ <td class="list nowrap">
+ <?php
+ $args = "src=" . rawurlencode($sa['src']);
+ $args .= "&amp;dst=" . rawurlencode($sa['dst']);
+ $args .= "&amp;proto=" . rawurlencode($sa['proto']);
+ $args .= "&amp;spi=" . rawurlencode("0x" . $sa['spi']);
+ ?>
+ <a href="diag_ipsec_sad.php?act=del&amp;<?=$args;?>" onclick="return confirm('<?=gettext("Do you really want to delete this security association?"); ?>')">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" />
+ </a>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ <?php else: ?>
+ <tr>
+ <td>
+ <p><strong><?=gettext("No IPsec security associations.");?></strong></p>
+ </td>
+ </tr>
+ <?php endif; ?>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+<p class="vexpl">
+<span class="red"><strong><?=gettext("Note:");?><br /></strong></span>
+<?=gettext("You can configure your IPsec");?> <a href="vpn_ipsec.php"><?=gettext("here.");?></a>
+</p>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_ipsec_spd.php b/src/usr/local/www/diag_ipsec_spd.php
new file mode 100644
index 0000000..5efeda3
--- /dev/null
+++ b/src/usr/local/www/diag_ipsec_spd.php
@@ -0,0 +1,138 @@
+<?php
+/* $Id$ */
+/*
+ diag_ipsec_spd.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/setkey
+ pfSense_MODULE: ipsec
+*/
+
+##|+PRIV
+##|*IDENT=page-status-ipsec-spd
+##|*NAME=Status: IPsec: SPD page
+##|*DESCR=Allow access to the 'Status: IPsec: SPD' page.
+##|*MATCH=diag_ipsec_spd.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("ipsec.inc");
+
+$pgtitle = array(gettext("Status"), gettext("IPsec"), gettext("SPD"));
+$shortcut_section = "ipsec";
+include("head.inc");
+
+$spd = ipsec_dump_spd();
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+ <?php include("fbegin.inc"); ?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ipsec spd">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Overview"), false, "diag_ipsec.php");
+ $tab_array[1] = array(gettext("Leases"), false, "diag_ipsec_leases.php");
+ $tab_array[2] = array(gettext("SAD"), false, "diag_ipsec_sad.php");
+ $tab_array[3] = array(gettext("SPD"), true, "diag_ipsec_spd.php");
+ $tab_array[4] = array(gettext("Logs"), false, "diag_logs_ipsec.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea" style="background:#eeeeee">
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <?php if (count($spd)): ?>
+ <tr>
+ <td class="listhdrr nowrap"><?= gettext("Source"); ?></td>
+ <td class="listhdrr nowrap"><?= gettext("Destination"); ?></td>
+ <td class="listhdrr nowrap"><?= gettext("Direction"); ?></td>
+ <td class="listhdrr nowrap"><?= gettext("Protocol"); ?></td>
+ <td class="listhdrr nowrap"><?= gettext("Tunnel endpoints"); ?></td>
+ <td class="list nowrap"></td>
+ </tr>
+ <?php foreach ($spd as $sp): ?>
+ <tr>
+ <td class="listlr" valign="top"><?=htmlspecialchars($sp['srcid']);?></td>
+ <td class="listr" valign="top"><?=htmlspecialchars($sp['dstid']);?></td>
+ <td class="listr" valign="top">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_<?=$sp['dir'];?>.gif" width="11" height="11" style="margin-top: 2px" alt="direction" />
+ </td>
+ <td class="listr" valign="top"><?=htmlspecialchars(strtoupper($sp['proto']));?></td>
+ <td class="listr" valign="top"><?=htmlspecialchars($sp['src']);?> -> <?=htmlspecialchars($sp['dst']);?></td>
+ <td class="list nowrap">
+ <?php
+ $args = "srcid=".rawurlencode($sp['srcid']);
+ $args .= "&amp;dstid=".rawurlencode($sp['dstid']);
+ $args .= "&amp;dir=".rawurlencode($sp['dir']);
+ ?>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+ <br />
+ <table class="tabcont" border="0" cellspacing="0" cellpadding="6" summary="policies">
+ <tr>
+ <td width="16"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_in.gif" width="11" height="11" alt="in" /></td>
+ <td><?= gettext("incoming (as seen by firewall)"); ?></td>
+ </tr>
+ <tr>
+ <td colspan="5" height="4"></td>
+ </tr>
+ <tr>
+ <td><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_out.gif" width="11" height="11" alt="out" /></td>
+ <td><?= gettext("outgoing (as seen by firewall)"); ?></td>
+ </tr>
+ <?php else: ?>
+ <tr>
+ <td>
+ <p><strong><?= gettext("No IPsec security policies."); ?></strong></p>
+ </td>
+ </tr>
+ <?php endif; ?>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+<p class="vexpl">
+<span class="red"><strong><?= gettext("Note:"); ?><br /></strong></span>
+<?= gettext("You can configure your IPsec"); ?> <a href="vpn_ipsec.php"><?= gettext("here."); ?></a>
+</p>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_ipsec_xml.php b/src/usr/local/www/diag_ipsec_xml.php
new file mode 100644
index 0000000..82dcbea
--- /dev/null
+++ b/src/usr/local/www/diag_ipsec_xml.php
@@ -0,0 +1,84 @@
+<?php
+/* $Id$ */
+/*
+ diag_ipsec_xml.php
+ Copyright (C) 2007 pfSense Project
+ Copyright (C) 2010 Seth Mos
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Parts of this code was originally based on vpn_ipsec_sad.php
+ Copyright (C) 2003-2004 Manuel Kasper
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-ipsecxml
+##|*NAME=Diag IPsec XML page
+##|*DESCR=Allow access to the 'Diag IPsec XML' page.
+##|*MATCH=diag_ipsec_xml.php
+##|-PRIV
+
+global $g;
+
+require("guiconfig.inc");
+require("ipsec.inc");
+
+if (!is_array($config['ipsec']['phase2'])) {
+ $config['ipsec']['phase2'] = array();
+}
+
+$ipsec_status = array();
+
+$a_phase2 = &$config['ipsec']['phase2'];
+
+$status = ipsec_smp_dump_status();
+
+if (is_array($status['query']) && $status['query']['ikesalist'] && $status['query']['ikesalist']['ikesa']) {
+ foreach ($a_phase2 as $ph2ent) {
+ ipsec_lookup_phase1($ph2ent, $ph1ent);
+ $tunnel = array();
+ if (!isset($ph2ent['disabled']) && !isset($ph1ent['disabled'])) {
+ if (ipsec_phase1_status($status['query']['ikesalist']['ikesa'], $ph1ent['ikeid'])) {
+ $tunnel['state'] = "up";
+ } elseif (!isset($config['ipsec']['enable'])) {
+ $tunnel['state'] = "disabled";
+ } else {
+ $tunnel['state'] = "down";
+ }
+
+ $tunnel['src'] = ipsec_get_phase1_src($ph1ent);
+ $tunnel['endpoint'] = $ph1ent['remote-gateway'];
+ $tunnel['local'] = ipsec_idinfo_to_text($ph2ent['localid']);
+ $tunnel['remote'] = ipsec_idinfo_to_text($ph2ent['remoteid']);
+ $tunnel['name'] = "{$ph2ent['descr']}";
+ $ipsec_status['tunnel'][] = $tunnel;
+ }
+ }
+}
+
+$listtags = array("tunnel");
+$xml = dump_xml_config($ipsec_status, "ipsec");
+
+echo $xml;
+?>
diff --git a/src/usr/local/www/diag_limiter_info.php b/src/usr/local/www/diag_limiter_info.php
new file mode 100644
index 0000000..d4e5b06
--- /dev/null
+++ b/src/usr/local/www/diag_limiter_info.php
@@ -0,0 +1,121 @@
+<?php
+/* $Id$ */
+/*
+ diag_limiter_info.php
+ Copyright (C) 2010 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/top
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-limiter-info
+##|*NAME=Diagnostics: Limiter Info
+##|*DESCR=Allows access to the 'Diagnostics: Limiter Info' page
+##|*MATCH=diag_limiter_info.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$pgtitle = gettext("Diagnostics: Limiter Info");
+$shortcut_section = "trafficshaper-limiters";
+
+if ($_REQUEST['getactivity']) {
+ $text = `/sbin/ipfw pipe show`;
+ if ($text == "") {
+ $text = "We could not find any limiters on this system.";
+ }
+ echo "Limiters:\n";
+ echo $text;
+ $text = `/sbin/ipfw queue show`;
+ if ($text != "") {
+ echo "\n\nQueues:\n";
+ echo $text;
+ }
+ exit;
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+ function getlimiteractivity() {
+ var url = "/diag_limiter_info.php";
+ var pars = 'getactivity=yes';
+ jQuery.ajax(
+ url,
+ {
+ type: 'post',
+ data: pars,
+ complete: activitycallback
+ });
+ }
+ function activitycallback(transport) {
+ jQuery('#limiteractivitydiv').html('<font face="Courier" size="2"><pre style="text-align:left;">' + transport.responseText + '<\/pre><\/font>');
+ setTimeout('getlimiteractivity()', 2000);
+ }
+ setTimeout('getlimiteractivity()', 5000);
+//]]>
+</script>
+<div id="maincontent">
+<?php
+ if ($savemsg) {
+ echo "<div id=\"savemsg\">";
+ print_info_box($savemsg);
+ echo "</div>";
+ }
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag limiter info">
+ <tr>
+ <td>
+ <table id="backuptable" class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
+ <tr>
+ <td align="center">
+ <table summary="results">
+ <tr><td>
+ <div id="limiteractivitydiv">
+ <?=gettext("Gathering Limiter information, please wait...");?>
+ </div>
+ </td></tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</div>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs.php b/src/usr/local/www/diag_logs.php
new file mode 100755
index 0000000..2cbfcbb
--- /dev/null
+++ b/src/usr/local/www/diag_logs.php
@@ -0,0 +1,145 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-logs-system
+##|*NAME=Diagnostics: Logs: System page
+##|*DESCR=Allow access to the 'Diagnostics: Logs: System' page.
+##|*MATCH=diag_logs.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$system_logfile = "{$g['varlog_path']}/system.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($system_logfile);
+}
+
+if ($_GET['filtertext']) {
+ $filtertext = htmlspecialchars($_GET['filtertext']);
+}
+
+if ($_POST['filtertext']) {
+ $filtertext = htmlspecialchars($_POST['filtertext']);
+}
+
+if ($filtertext) {
+ $filtertextmeta="?filtertext=$filtertext";
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("General"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), true, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("General"), true, "/diag_logs.php");
+ $tab_array[] = array(gettext("Gateways"), false, "/diag_logs_gateways.php");
+ $tab_array[] = array(gettext("Routing"), false, "/diag_logs_routing.php");
+ $tab_array[] = array(gettext("Resolver"), false, "/diag_logs_resolver.php");
+ $tab_array[] = array(gettext("Wireless"), false, "/diag_logs_wireless.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic"><?php printf(gettext("Last %s system log entries"), $nentries); ?></td>
+ </tr>
+ <?php
+ if ($filtertext) {
+ dump_clog($system_logfile, $nentries, true, array("$filtertext"), array("ppp"));
+ } else {
+ dump_clog($system_logfile, $nentries, true, array(), array("ppp"));
+ }
+ ?>
+ <tr>
+ <td align="left" valign="top">
+ <form id="filterform" name="filterform" action="diag_logs.php" method="post" style="margin-top: 14px;">
+ <input id="submit" name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log");?>" />
+ </form>
+ </td>
+ <td align="right" valign="top" >
+ <form id="clearform" name="clearform" action="diag_logs.php" method="post" style="margin-top: 14px;">
+ <input id="filtertext" name="filtertext" value="<?=$filtertext;?>" />
+ <input id="filtersubmit" name="filtersubmit" type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_auth.php b/src/usr/local/www/diag_logs_auth.php
new file mode 100644
index 0000000..42bc0ba
--- /dev/null
+++ b/src/usr/local/www/diag_logs_auth.php
@@ -0,0 +1,112 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_auth.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ part of pfSense
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-status-systemlogs-portalauth
+##|*NAME=Status: System logs: Portal Auth page
+##|*DESCR=Allow access to the 'Status: System logs: Portal Auth' page.
+##|*MATCH=diag_logs_auth.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$portal_logfile = "{$g['varlog_path']}/portalauth.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($portal_logfile);
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Portal Auth"));
+$shortcut_section = "captiveportal";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs captive portal">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), true, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic">
+ <?php printf(gettext("Last %s Portal Auth log entries"), $nentries);?>
+ </td>
+ </tr>
+ <?php dump_clog($portal_logfile, $nentries, true); ?>
+ <tr>
+ <td>
+ <br />
+ <form action="diag_logs_auth.php" method="post">
+ <input name="clear" type="submit" class="formbtn" value="<?= gettext("Clear log"); ?>"/>
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_dhcp.php b/src/usr/local/www/diag_logs_dhcp.php
new file mode 100644
index 0000000..f87845d
--- /dev/null
+++ b/src/usr/local/www/diag_logs_dhcp.php
@@ -0,0 +1,115 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_dhcp.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: dhcpserver
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-logs-dhcp
+##|*NAME=Diagnostics: Logs: DHCP page
+##|*DESCR=Allow access to the 'Diagnostics: Logs: DHCP' page.
+##|*MATCH=diag_logs_dhcp.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$dhcpd_logfile = "{$g['varlog_path']}/dhcpd.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($dhcpd_logfile);
+ killbyname("dhcpd");
+ services_dhcpd_configure();
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("DHCP"));
+$shortcut_section = "dhcp";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs dhcp">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), true, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic">
+ <?php printf(gettext("Last %s DHCP service log entries"), $nentries);?>
+ </td>
+ </tr>
+ <?php dump_clog($dhcpd_logfile, $nentries); ?>
+ <tr>
+ <td>
+ <br />
+ <form action="diag_logs_dhcp.php" method="post">
+ <input name="clear" type="submit" class="formbtn" value="<?= gettext("Clear log");?>" />
+ </form>
+ </td>
+ <td>NOTE: Clearing the log file will restart the DHCP daemon.</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_filter.php b/src/usr/local/www/diag_logs_filter.php
new file mode 100644
index 0000000..b583035
--- /dev/null
+++ b/src/usr/local/www/diag_logs_filter.php
@@ -0,0 +1,503 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_filter.php
+ part of pfSense
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2009 Manuel Kasper <mk@neon1.net>,
+ Jim Pingle jim@pingle.org
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-logs-firewall
+##|*NAME=Diagnostics: Logs: Firewall page
+##|*DESCR=Allow access to the 'Diagnostics: Logs: Firewall' page.
+##|*MATCH=diag_logs_filter.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter_log.inc");
+
+# --- AJAX RESOLVE ---
+if (isset($_POST['resolve'])) {
+ $ip = strtolower($_POST['resolve']);
+ $res = (is_ipaddr($ip) ? gethostbyaddr($ip) : '');
+
+ if ($res && $res != $ip) {
+ $response = array('resolve_ip' => $ip, 'resolve_text' => $res);
+ } else {
+ $response = array('resolve_ip' => $ip, 'resolve_text' => gettext("Cannot resolve"));
+ }
+
+ echo json_encode(str_replace("\\", "\\\\", $response)); // single escape chars can break JSON decode
+ exit;
+}
+
+function getGETPOSTsettingvalue($settingname, $default) {
+ $settingvalue = $default;
+ if ($_GET[$settingname]) {
+ $settingvalue = $_GET[$settingname];
+ }
+ if ($_POST[$settingname]) {
+ $settingvalue = $_POST[$settingname];
+ }
+ return $settingvalue;
+}
+
+$rulenum = getGETPOSTsettingvalue('getrulenum', null);
+if ($rulenum) {
+ list($rulenum, $tracker, $type) = explode(',', $rulenum);
+ $rule = find_rule_by_number($rulenum, $tracker, $type);
+ echo gettext("The rule that triggered this action is") . ":\n\n{$rule}";
+ exit;
+}
+
+$filtersubmit = getGETPOSTsettingvalue('filtersubmit', null);
+if ($filtersubmit) {
+ $interfacefilter = getGETPOSTsettingvalue('interface', null);
+ $filtertext = getGETPOSTsettingvalue('filtertext', "");
+ $filterlogentries_qty = getGETPOSTsettingvalue('filterlogentries_qty', null);
+}
+
+$filterlogentries_submit = getGETPOSTsettingvalue('filterlogentries_submit', null);
+if ($filterlogentries_submit) {
+ $filterfieldsarray = array();
+
+ $actpass = getGETPOSTsettingvalue('actpass', null);
+ $actblock = getGETPOSTsettingvalue('actblock', null);
+
+ $filterfieldsarray['act'] = str_replace(" ", " ", trim($actpass . " " . $actblock));
+ $filterfieldsarray['act'] = $filterfieldsarray['act'] != "" ? $filterfieldsarray['act'] : 'All';
+ $filterfieldsarray['time'] = getGETPOSTsettingvalue('filterlogentries_time', null);
+ $filterfieldsarray['interface'] = getGETPOSTsettingvalue('filterlogentries_interfaces', null);
+ $filterfieldsarray['srcip'] = getGETPOSTsettingvalue('filterlogentries_sourceipaddress', null);
+ $filterfieldsarray['srcport'] = getGETPOSTsettingvalue('filterlogentries_sourceport', null);
+ $filterfieldsarray['dstip'] = getGETPOSTsettingvalue('filterlogentries_destinationipaddress', null);
+ $filterfieldsarray['dstport'] = getGETPOSTsettingvalue('filterlogentries_destinationport', null);
+ $filterfieldsarray['proto'] = getGETPOSTsettingvalue('filterlogentries_protocol', null);
+ $filterfieldsarray['tcpflags'] = getGETPOSTsettingvalue('filterlogentries_protocolflags', null);
+ $filterlogentries_qty = getGETPOSTsettingvalue('filterlogentries_qty', null);
+}
+
+$filter_logfile = "{$g['varlog_path']}/filter.log";
+
+$nentries = $config['syslog']['nentries'];
+
+# Override Display Quantity
+if ($filterlogentries_qty) {
+ $nentries = $filterlogentries_qty;
+}
+
+if (!$nentries || !is_numeric($nentries)) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($filter_logfile);
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Firewall"));
+$shortcut_section = "firewall";
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script src="/javascript/filter_log.js" type="text/javascript"></script>
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs filter">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), true, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Normal View"), true, "/diag_logs_filter.php");
+ $tab_array[] = array(gettext("Dynamic View"), false, "/diag_logs_filter_dynamic.php");
+ $tab_array[] = array(gettext("Summary View"), false, "/diag_logs_filter_summary.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" style="sortableMultirow:<?=$config['syslog']['filterdescriptions'] === "2"?2:1?>" summary="main area">
+ <tr>
+ <td colspan="<?=(!isset($config['syslog']['rawfilter']))?7:2?>" align="left" valign="middle">
+ <div id="filterlogentries_show" class="widgetconfigdiv" style="<?=(!isset($config['syslog']['rawfilter']))?"":"display:none"?>">
+ <form id="filterlogentries" name="filterlogentries" action="diag_logs_filter.php" method="post">
+ <?php
+ $Include_Act = explode(",", str_replace(" ", ",", $filterfieldsarray['act']));
+ if ($filterfieldsarray['interface'] == "All") $interface = "";
+ ?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="action">
+ <tr>
+ <td rowspan="2">
+ <div align="center"><?=gettext("Action");?></div>
+ <div align="left">
+ <input id="actpass" name="actpass" type="checkbox" value="Pass" <?php if (in_arrayi('Pass', $Include_Act)) echo "checked=\"checked\""; ?> /> Pass<br />
+ <input id="actblock" name="actblock" type="checkbox" value="Block" <?php if (in_arrayi('Block', $Include_Act)) echo "checked=\"checked\""; ?> /> Block<br />
+ </div>
+ </td>
+ <td>
+ <div align="center"><?=gettext("Time");?></div>
+ <div align="center"><input id="filterlogentries_time" name="filterlogentries_time" class="formfld search" type="text" size="12" value="<?= htmlspecialchars($filterfieldsarray['time']) ?>" /></div>
+ </td>
+ <td>
+ <div align="center"><?=gettext("Source IP Address");?></div>
+ <div align="center"><input id="filterlogentries_sourceipaddress" name="filterlogentries_sourceipaddress" class="formfld search" type="text" size="35" value="<?= htmlspecialchars($filterfieldsarray['srcip']) ?>" /></div>
+ </td>
+ <td>
+ <div align="center"><?=gettext("Source Port");?></div>
+ <div align="center"><input id="filterlogentries_sourceport" name="filterlogentries_sourceport" class="formfld search" type="text" size="10" value="<?= htmlspecialchars($filterfieldsarray['srcport']) ?>" /></div>
+ </td>
+ <td>
+ <div align="center"><?=gettext("Protocol");?></div>
+ <div align="center"><input id="filterlogentries_protocol" name="filterlogentries_protocol" class="formfld search" type="text" size="5" value="<?= htmlspecialchars($filterfieldsarray['proto']) ?>" /></div>
+ </td>
+ <td>
+ <div align="center" style="vertical-align:top;"><?=gettext("Quantity");?></div>
+ <div align="center" style="vertical-align:top;"><input id="filterlogentries_qty" name="filterlogentries_qty" class="" type="text" size="6" value="<?= htmlspecialchars($filterlogentries_qty) ?>" /></div>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">
+ <div align="center"><?=gettext("Interface");?></div>
+ <div align="center"><input id="filterlogentries_interfaces" name="filterlogentries_interfaces" class="formfld search" type="text" size="12" value="<?= htmlspecialchars($filterfieldsarray['interface']) ?>" /></div>
+ </td>
+ <td valign="top">
+ <div align="center"><?=gettext("Destination IP Address");?></div>
+ <div align="center"><input id="filterlogentries_destinationipaddress" name="filterlogentries_destinationipaddress" class="formfld search" type="text" size="35" value="<?= htmlspecialchars($filterfieldsarray['dstip']) ?>" /></div>
+ </td>
+ <td valign="top">
+ <div align="center"><?=gettext("Destination Port");?></div>
+ <div align="center"><input id="filterlogentries_destinationport" name="filterlogentries_destinationport" class="formfld search" type="text" size="10" value="<?= htmlspecialchars($filterfieldsarray['dstport']) ?>" /></div>
+ </td>
+ <td valign="top">
+ <div align="center"><?=gettext("Protocol Flags");?></div>
+ <div align="center"><input id="filterlogentries_protocolflags" name="filterlogentries_protocolflags" class="formfld search" type="text" size="5" value="<?= htmlspecialchars($filterfieldsarray['tcpflags']) ?>" /></div>
+ </td>
+ <td valign="bottom">
+ <div align="center"><input id="filterlogentries_submit" name="filterlogentries_submit" type="submit" class="formbtn" value="<?=gettext("Filter");?>" /></div>
+ </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td colspan="5">
+ <?printf(gettext('Matches %1$s regular expression%2$s.'), '<a target="_blank" href="http://www.php.net/manual/en/book.pcre.php">', '</a>');?>&nbsp;&nbsp;
+ <?=gettext("Precede with exclamation (!) as first character to exclude match.");?>&nbsp;&nbsp;
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+ <div id="filterform_show" class="widgetconfigdiv" style="<?=(!isset($config['syslog']['rawfilter']))?"display:none":""?>">
+ <form id="filterform" name="filterform" action="diag_logs_filter.php" method="post">
+ <table width="0%" border="0" cellpadding="0" cellspacing="0" summary="firewall log">
+ <tr>
+ <td>
+ <div align="center" style="vertical-align:top;"><?=gettext("Interface");?></div>
+ <div align="center" style="vertical-align:top;">
+ <select name="interface" onchange="dst_change(this.value,iface_old,document.iform.dsttype.value);iface_old = document.iform.interface.value;typesel_change();">
+ <option value="" <?=$interfacefilter?"":"selected=\"selected\""?>>*Any interface</option>
+<?php
+ $iflist = get_configured_interface_with_descr(false, true);
+ //$iflist = get_interface_list();
+ // Allow extending of the firewall edit interfaces
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/pre_interfaces_edit");
+ foreach ($iflist as $if => $ifdesc) {
+ $interfaces[$if] = $ifdesc;
+ }
+
+ if ($config['l2tp']['mode'] == "server") {
+ $interfaces['l2tp'] = "L2TP VPN";
+ }
+
+ if ($config['pptpd']['mode'] == "server") {
+ $interfaces['pptp'] = "PPTP VPN";
+ }
+
+ if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
+ $interfaces['pppoe'] = "PPPoE Server";
+ }
+
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ $interfaces["enc0"] = "IPsec";
+ }
+
+ /* add openvpn/tun interfaces */
+ if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
+ $interfaces["openvpn"] = "OpenVPN";
+ }
+
+ foreach ($interfaces as $iface => $ifacename):
+?>
+ <option value="<?=$iface;?>" <?=($iface == $interfacefilter)?"selected=\"selected\"":"";?>><?=htmlspecialchars($ifacename);?></option>
+<?php
+ endforeach;
+?>
+ </select>
+ </div>
+ </td>
+ <td>
+ <div align="center" style="vertical-align:top;"><?=gettext("Filter expression");?></div>
+ <div align="center" style="vertical-align:top;"><input id="filtertext" name="filtertext" class="formfld search" style="vertical-align:top;" type="text" size="35" value="<?= htmlspecialchars($filtertext) ?>" /></div>
+ </td>
+ <td>
+ <div align="center" style="vertical-align:top;"><?=gettext("Quantity");?></div>
+ <div align="center" style="vertical-align:top;"><input id="filterlogentries_qty" name="filterlogentries_qty" class="" style="vertical-align:top;" type="text" size="6" value="<?= htmlspecialchars($filterlogentries_qty) ?>" /></div>
+ </td>
+ <td>
+ <div align="center" style="vertical-align:top;">&nbsp;</div>
+ <div align="center" style="vertical-align:top;"><input id="filtersubmit" name="filtersubmit" type="submit" class="formbtn" style="vertical-align:top;" value="<?=gettext("Filter");?>" /></div>
+ </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td colspan="2">
+ <?printf(gettext('Matches %1$s regular expression%2$s.'), '<a target="_blank" href="http://www.php.net/manual/en/book.pcre.php">', '</a>');?>&nbsp;&nbsp;
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+ <div style="float: right; vertical-align:middle">
+ <br />
+ <?php if (!isset($config['syslog']['rawfilter']) && (isset($config['syslog']['filterdescriptions']) && $config['syslog']['filterdescriptions'] === "2")):?>
+ <a href="#" onclick="toggleListDescriptions()">Show/hide rule descriptions</a>
+ <?php endif;?>
+ </div>
+ </td>
+ </tr>
+<?php
+ if (!isset($config['syslog']['rawfilter'])):
+ $iflist = get_configured_interface_with_descr(false, true);
+ if ($iflist[$interfacefilter]) {
+ $interfacefilter = $iflist[$interfacefilter];
+ }
+ if ($filterlogentries_submit) {
+ $filterlog = conv_log_filter($filter_logfile, $nentries, $nentries + 100, $filterfieldsarray);
+ } else {
+ $filterlog = conv_log_filter($filter_logfile, $nentries, $nentries + 100, $filtertext, $interfacefilter);
+ }
+?>
+ <tr>
+ <td colspan="<?=$config['syslog']['filterdescriptions'] === "1"?7:6?>" class="listtopic">
+<?php
+ if ((!$filtertext) && (!$filterfieldsarray)) {
+ printf(gettext("Last %s firewall log entries."), count($filterlog));
+ } else {
+ echo count($filterlog). ' ' . gettext("matched log entries.") . ' ';
+ }
+ printf(gettext("Max(%s)"), $nentries);
+?>
+ </td>
+ </tr>
+ <tr class="sortableHeaderRowIdentifier">
+ <td width="10%" class="listhdrr"><?=gettext("Act");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Time");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("If");?></td>
+ <?php if ($config['syslog']['filterdescriptions'] === "1"):?>
+ <td width="10%" class="listhdrr"><?=gettext("Rule");?></td>
+ <?php endif;?>
+ <td width="25%" class="listhdrr"><?=gettext("Source");?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Destination");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Proto");?></td>
+ </tr>
+<?php
+ if ($config['syslog']['filterdescriptions']) {
+ buffer_rules_load();
+ }
+ $rowIndex = 0;
+ foreach ($filterlog as $filterent):
+ $evenRowClass = $rowIndex % 2 ? " listMReven" : " listMRodd";
+ $rowIndex++;
+?>
+ <tr class="<?=$evenRowClass?>">
+ <td class="listMRlr nowrap" align="center" sorttable_customkey="<?=$filterent['act']?>">
+ <center>
+ <a onclick="javascript:getURL('diag_logs_filter.php?getrulenum=<?php echo "{$filterent['rulenum']},{$filterent['tracker']},{$filterent['act']}"; ?>', outputrule);">
+ <img border="0" src="<?php echo find_action_image($filterent['act']);?>" width="11" height="11" align="middle" alt="<?php echo $filterent['act'] .'/'. $filterent['tracker'];?>" title="<?php echo $filterent['act'] .'/'. $filterent['tracker'];?>" />
+ <?php if ($filterent['count']) echo $filterent['count'];?>
+ </a>
+ </center>
+ </td>
+ <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['time']);?></td>
+ <td class="listMRr nowrap">
+ <?php if ($filterent['direction'] == "out"): ?>
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/out.gif" alt="Direction=OUT" title="Direction=OUT"/>
+ <?php endif; ?>
+ <?php echo htmlspecialchars($filterent['interface']);?>
+ </td>
+<?php
+ if ($config['syslog']['filterdescriptions'] === "1") {
+ echo("<td class=\"listMRr nowrap\">" . find_rule_by_number_buffer($filterent['rulenum'], $filterent['tracker'], $filterent['act']) . "</td>");
+ }
+
+ $int = strtolower($filterent['interface']);
+ $proto = strtolower($filterent['proto']);
+ if ($filterent['version'] == '6') {
+ $ipproto = "inet6";
+ $filterent['srcip'] = "[{$filterent['srcip']}]";
+ $filterent['dstip'] = "[{$filterent['dstip']}]";
+ } else {
+ $ipproto = "inet";
+ }
+
+ $srcstr = $filterent['srcip'] . get_port_with_service($filterent['srcport'], $proto);
+ $src_htmlclass = str_replace(array('.', ':'), '-', $filterent['srcip']);
+ $dststr = $filterent['dstip'] . get_port_with_service($filterent['dstport'], $proto);
+ $dst_htmlclass = str_replace(array('.', ':'), '-', $filterent['dstip']);
+?>
+ <td class="listMRr nowrap">
+ <img onclick="javascript:resolve_with_ajax('<?php echo "{$filterent['srcip']}"; ?>');" title="<?=gettext("Click to resolve");?>" class="ICON-<?= $src_htmlclass; ?>" border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_log.gif" alt="Icon Reverse Resolve with DNS"/>
+ <a href="easyrule.php?<?php echo "action=block&amp;int={$int}&amp;src={$filterent['srcip']}&amp;ipproto={$ipproto}"; ?>" title="<?=gettext("Easy Rule: Add to Block List");?>" onclick="return confirm('<?=gettext("Do you really want to add this BLOCK rule?")?>')">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_block_add.gif" alt="Icon Easy Rule: Add to Block List" />
+ </a>
+ <?php echo $srcstr . '<span class="RESOLVE-' . $src_htmlclass . '"></span>';?>
+ </td>
+ <td class="listMRr nowrap">
+ <img onclick="javascript:resolve_with_ajax('<?php echo "{$filterent['dstip']}"; ?>');" title="<?=gettext("Click to resolve");?>" class="ICON-<?= $dst_htmlclass; ?>" border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_log.gif" alt="Icon Reverse Resolve with DNS"/>
+ <a href="easyrule.php?<?php echo "action=pass&amp;int={$int}&amp;proto={$proto}&amp;src={$filterent['srcip']}&amp;dst={$filterent['dstip']}&amp;dstport={$filterent['dstport']}&amp;ipproto={$ipproto}"; ?>" title="<?=gettext("Easy Rule: Pass this traffic");?>" onclick="return confirm('<?=gettext("Do you really want to add this PASS rule?")?>')">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_pass_add.gif" alt="Icon Easy Rule: Pass this traffic" />
+ </a>
+ <?php echo $dststr . '<span class="RESOLVE-' . $dst_htmlclass . '"></span>';?>
+ </td>
+<?php
+ if ($filterent['proto'] == "TCP") {
+ $filterent['proto'] .= ":{$filterent['tcpflags']}";
+ }
+?>
+ <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['proto']);?></td>
+ </tr>
+<?php
+ if (isset($config['syslog']['filterdescriptions']) && $config['syslog']['filterdescriptions'] === "2"):
+?>
+ <tr class="<?=$evenRowClass?>">
+ <td colspan="2" class="listMRDescriptionL listMRlr" />
+ <td colspan="4" class="listMRDescriptionR listMRr nowrap"><?=find_rule_by_number_buffer($filterent['rulenum'], $filterent['tracker'], $filterent['act']);?></td>
+ </tr>
+<?php
+ endif;
+ endforeach;
+ buffer_rules_clear();
+ else:
+?>
+ <tr>
+ <td colspan="2" class="listtopic">
+ <?php printf(gettext("Last %s firewall log entries"), $nentries);?>
+ </td>
+ </tr>
+<?php
+ if ($filtertext) {
+ dump_clog($filter_logfile, $nentries, true, array("$filtertext"));
+ } else {
+ dump_clog($filter_logfile, $nentries);
+ }
+ endif;
+?>
+ <tr>
+ <td align="left" valign="top" colspan="3">
+ <form id="clearform" name="clearform" action="diag_logs_filter.php" method="post" style="margin-top: 14px;">
+ <input id="submit" name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log");?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+
+<p><span class="vexpl"><a href="https://doc.pfsense.org/index.php/What_are_TCP_Flags%3F">TCP Flags</a>: F - FIN, S - SYN, A or . - ACK, R - RST, P - PSH, U - URG, E - ECE, W - CWR</span></p>
+
+<?php include("fend.inc"); ?>
+
+<!-- AJAXY STUFF -->
+<script type="text/javascript">
+//<![CDATA[
+function resolve_with_ajax(ip_to_resolve) {
+ var url = "/diag_logs_filter.php";
+
+ jQuery.ajax(
+ url,
+ {
+ type: 'post',
+ dataType: 'json',
+ data: {
+ resolve: ip_to_resolve,
+ },
+ complete: resolve_ip_callback
+ });
+
+}
+
+function resolve_ip_callback(transport) {
+ var response = jQuery.parseJSON(transport.responseText);
+ var resolve_class = htmlspecialchars(response.resolve_ip.replace(/[.:]/g, '-'));
+ var resolve_text = '<small><br />' + htmlspecialchars(response.resolve_text) + '<\/small>';
+
+ jQuery('span.RESOLVE-' + resolve_class).html(resolve_text);
+ jQuery('img.ICON-' + resolve_class).removeAttr('title');
+ jQuery('img.ICON-' + resolve_class).removeAttr('alt');
+ jQuery('img.ICON-' + resolve_class).attr('src', '/themes/<?= $g['theme']; ?>/images/icons/icon_log_d.gif');
+ jQuery('img.ICON-' + resolve_class).prop('onclick', null);
+ // jQuery cautions that "removeAttr('onclick')" fails in some versions of IE
+}
+
+// From http://stackoverflow.com/questions/5499078/fastest-method-to-escape-html-tags-as-html-entities
+function htmlspecialchars(str) {
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;');
+}
+//]]>
+</script>
+
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_filter_dynamic.php b/src/usr/local/www/diag_logs_filter_dynamic.php
new file mode 100755
index 0000000..16ced9f
--- /dev/null
+++ b/src/usr/local/www/diag_logs_filter_dynamic.php
@@ -0,0 +1,223 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_filter_dynamic.php
+ part of pfSesne
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-hidden-nolongerincluded
+##|*NAME=Hidden: No longer included page
+##|*DESCR=Allow access to the 'Hidden: No longer included' page.
+##|*MATCH=diag_logs_filter_dynamic.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter_log.inc");
+
+$filter_logfile = "{$g['varlog_path']}/filter.log";
+
+/* Hardcode this. AJAX doesn't do so well with large numbers */
+$nentries = 50;
+
+/* AJAX related routines */
+handle_ajax($nentries, $nentries + 20);
+
+if ($_POST['clear']) {
+ clear_log_file($filter_logfile);
+}
+
+$filterlog = conv_log_filter($filter_logfile, $nentries, $nentries + 100);
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Firewall (Dynamic View)"));
+$shortcut_section = "firewall";
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+ lastsawtime = '<?php echo time(); ?>;';
+ var lines = Array();
+ var timer;
+ var updateDelay = 25500;
+ var isBusy = false;
+ var isPaused = false;
+ var nentries = <?php echo $nentries; ?>;
+<?php
+ if (isset($config['syslog']['reverse'])) {
+ echo "var isReverse = true;\n";
+ } else {
+ echo "var isReverse = false;\n";
+ }
+?>
+ /* Called by the AJAX updater */
+ function format_log_line(row) {
+ if (row[8] == '6') {
+ srcIP = '[' + row[3] + ']';
+ dstIP = '[' + row[5] + ']';
+ } else {
+ srcIP = row[3];
+ dstIP = row[5];
+ }
+
+ if (row[4] == '') {
+ srcPort = '';
+ } else {
+ srcPort = ':' + row[4];
+ }
+ if (row[6] == '') {
+ dstPort = '';
+ } else {
+ dstPort = ':' + row[6];
+ }
+
+ var line = '<td class="listMRlr" align="center">' + row[0] + '</td>' +
+ '<td class="listMRr nowrap">' + row[1] + '</td>' +
+ '<td class="listMRr nowrap">' + row[2] + '</td>' +
+ '<td class="listMRr nowrap">' + srcIP + srcPort + '</td>' +
+ '<td class="listMRr nowrap">' + dstIP + dstPort + '</td>' +
+ '<td class="listMRr nowrap">' + row[7] + '</td>';
+ return line;
+ }
+//]]>
+</script>
+<script src="/javascript/filter_log.js" type="text/javascript"></script>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs filter dynamic">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), true, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Normal View"), false, "/diag_logs_filter.php");
+ $tab_array[] = array(gettext("Dynamic View"), true, "/diag_logs_filter_dynamic.php");
+ $tab_array[] = array(gettext("Summary View"), false, "/diag_logs_filter_summary.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <thead>
+ <tr>
+ <td colspan="6" class="listtopic">
+ <?php printf(gettext("Last %s records"), $nentries);?>; <?=gettext("Pause:");?><input style="vertical-align:middle;" type="checkbox" onclick="javascript:toggle_pause();" />
+ </td>
+ </tr>
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Act");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Time");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("If");?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Source");?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Destination");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Proto");?></td>
+ </tr>
+ </thead>
+ <tbody id="filter-log-entries">
+<?php
+ $rowIndex = 0;
+ foreach ($filterlog as $filterent):
+ $evenRowClass = $rowIndex % 2 ? " listMReven" : " listMRodd";
+ $rowIndex++;
+ if ($filterent['version'] == '6') {
+ $srcIP = "[" . htmlspecialchars($filterent['srcip']) . "]";
+ $dstIP = "[" . htmlspecialchars($filterent['dstip']) . "]";
+ } else {
+ $srcIP = htmlspecialchars($filterent['srcip']);
+ $dstIP = htmlspecialchars($filterent['dstip']);
+ }
+
+ if ($filterent['srcport']) {
+ $srcPort = ":" . htmlspecialchars($filterent['srcport']);
+ } else {
+ $srcPort = "";
+ }
+
+ if ($filterent['dstport']) {
+ $dstPort = ":" . htmlspecialchars($filterent['dstport']);
+ } else {
+ $dstPort = "";
+ }
+?>
+ <tr class="<?=$evenRowClass?>">
+ <td class="listMRlr nowrap" align="center">
+ <a href="#" onclick="javascript:getURL('diag_logs_filter.php?getrulenum=<?php echo "{$filterent['rulenum']},{$filterent['tracker']},{$filterent['act']}"; ?>', outputrule);">
+ <img border="0" src="<?php echo find_action_image($filterent['act']);?>" width="11" height="11" alt="<?php echo $filterent['act'] .'/'. $filterent['tracker'];?>" title="<?php echo $filterent['act'] .'/'. $filterent['tracker'];?>" />
+ </a>
+ </td>
+ <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['time']);?></td>
+ <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['interface']);?></td>
+ <td class="listMRr nowrap"><?php echo $srcIP . $srcPort;?></td>
+ <td class="listMRr nowrap"><?php echo $dstIP . $dstPort;?></td>
+ <?php
+ if ($filterent['proto'] == "TCP") {
+ $filterent['proto'] .= ":{$filterent['tcpflags']}";
+ }
+ ?>
+ <td class="listMRr nowrap"><?php echo htmlspecialchars($filterent['proto']);?></td>
+ </tr>
+<?php
+ endforeach;
+?>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<p><span class="vexpl"><a href="https://doc.pfsense.org/index.php/What_are_TCP_Flags%3F"><?=gettext("TCP Flags"); ?></a>: F - FIN, S - SYN, A or . - ACK, R - RST, P - PSH, U - URG, E - ECE, C - CWR</span></p>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_filter_summary.php b/src/usr/local/www/diag_logs_filter_summary.php
new file mode 100644
index 0000000..331df0d
--- /dev/null
+++ b/src/usr/local/www/diag_logs_filter_summary.php
@@ -0,0 +1,249 @@
+<?php
+/*
+ diag_logs_filter_summary.php
+ Copyright (C) 2009 Jim Pingle (jpingle@gmail.com)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES:
+ pfSense_MODULE: filter
+*/
+
+$pgtitle = gettext("Status").": ".gettext("System logs").": ".gettext("Firewall Log Summary");
+$shortcut_section = "firewall";
+require_once("guiconfig.inc");
+include_once("filter_log.inc");
+
+$filter_logfile = "{$g['varlog_path']}/filter.log";
+$lines = 5000;
+$entriesperblock = 5;
+
+$filterlog = conv_log_filter($filter_logfile, $lines, $lines);
+$gotlines = count($filterlog);
+$fields = array(
+ 'act' => gettext("Actions"),
+ 'interface' => gettext("Interfaces"),
+ 'proto' => gettext("Protocols"),
+ 'srcip' => gettext("Source IPs"),
+ 'dstip' => gettext("Destination IPs"),
+ 'srcport' => gettext("Source Ports"),
+ 'dstport' => gettext("Destination Ports"));
+
+$summary = array();
+foreach (array_keys($fields) as $f) {
+ $summary[$f] = array();
+}
+
+$totals = array();
+
+function cmp($a, $b) {
+ if ($a == $b) {
+ return 0;
+ }
+ return ($a < $b) ? 1 : -1;
+}
+
+function stat_block($summary, $stat, $num) {
+ global $g, $gotlines, $fields;
+ uasort($summary[$stat] , 'cmp');
+ print "<table width=\"200\" cellpadding=\"3\" cellspacing=\"0\" border=\"1\" summary=\"source destination ip\">";
+ print "<tr><th colspan=\"2\">{$fields[$stat]} ".gettext("data")."</th></tr>";
+ $k = array_keys($summary[$stat]);
+ $total = 0;
+ $numentries = 0;
+ for ($i = 0; $i < $num; $i++) {
+ if ($k[$i]) {
+ $total += $summary[$stat][$k[$i]];
+ $numentries++;
+ $outstr = $k[$i];
+ if (is_ipaddr($outstr)) {
+ $outstr = "<a href=\"diag_dns.php?host={$outstr}\" title=\"".gettext("Reverse Resolve with DNS")."\"><img border=\"0\" src=\"/themes/{$g['theme']}/images/icons/icon_log.gif\" alt=\"log\" /></a> {$outstr}";
+ } elseif (substr_count($outstr, '/') == 1) {
+ list($proto, $port) = explode('/', $outstr);
+ $service = getservbyport($port, strtolower($proto));
+ if ($service) {
+ $outstr .= ": {$service}";
+ }
+ }
+ print "<tr><td>{$outstr}</td><td width=\"50\" align=\"right\">{$summary[$stat][$k[$i]]}</td></tr>";
+ }
+ }
+ $leftover = $gotlines - $total;
+ if ($leftover > 0) {
+ print "<tr><td>Other</td><td width=\"50\" align=\"right\">{$leftover}</td></tr>";
+ }
+ print "</table>";
+}
+
+function pie_block($summary, $stat, $num) {
+ global $gotlines, $fields;
+ uasort($summary[$stat] , 'cmp');
+ $k = array_keys($summary[$stat]);
+ $total = 0;
+ $numentries = 0;
+ print "\n<script type=\"text/javascript\">\n";
+ print "//<![CDATA[\n";
+ for ($i = 0; $i < $num; $i++) {
+ if ($k[$i]) {
+ $total += $summary[$stat][$k[$i]];
+ $numentries++;
+ print "var d{$stat}{$i} = [];\n";
+ print "d{$stat}{$i}.push([1, {$summary[$stat][$k[$i]]}]);\n";
+ }
+ }
+ $leftover = $gotlines - $total;
+ if ($leftover > 0) {
+ print "var d{$stat}{$num} = [];\n";
+ print "d{$stat}{$num}.push([1, {$leftover}]);\n";
+ }
+
+ print "Event.observe(window, 'load', function() {\n";
+ print " new Proto.Chart($('piechart{$stat}'),\n";
+ print " [\n";
+ for ($i = 0; $i < $num; $i++) {
+ if ($k[$i]) {
+ print " { data: d{$stat}{$i}, label: \"{$k[$i]}\"}";
+ if (!(($i == ($numentries - 1)) && ($leftover <= 0))) {
+ print ",\n";
+ } else {
+ print "\n";
+ }
+ }
+ }
+ if ($leftover > 0) {
+ print " { data: d{$stat}{$i}, label: \"Other\"}\n";
+ }
+ print " ],\n";
+ print " {\n";
+ print " pies: {show: true, autoScale: true},\n";
+ print " legend: {show: true, labelFormatter: lblfmt}\n";
+ print " });\n";
+ print "});\n";
+ print "//]]>\n";
+ print "</script>\n";
+ print "<table cellpadding=\"3\" cellspacing=\"0\" border=\"0\" summary=\"pie chart\">";
+ print "<tr><th><font size=\"+1\">{$fields[$stat]}</font></th></tr>";
+ print "<tr><td><div id=\"piechart{$stat}\" style=\"width:450px;height:300px\"></div></td></tr>";
+ print "</table>\n";
+}
+
+foreach ($filterlog as $fe) {
+ $specialfields = array('srcport', 'dstport');
+ foreach (array_keys($fields) as $field) {
+ if (!in_array($field, $specialfields)) {
+ $summary[$field][$fe[$field]]++;
+ }
+ }
+ /* Handle some special cases */
+ if ($fe['srcport']) {
+ $summary['srcport'][$fe['proto'].'/'.$fe['srcport']]++;
+ } else {
+ $summary['srcport'][$fe['srcport']]++;
+ }
+ if ($fe['dstport']) {
+ $summary['dstport'][$fe['proto'].'/'.$fe['dstport']]++;
+ } else {
+ $summary['dstport'][$fe['dstport']]++;
+ }
+}
+
+include("head.inc"); ?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script src="/javascript/filter_log.js" type="text/javascript"></script>
+<script type="text/javascript" src="/protochart/prototype.js"></script>
+<script type="text/javascript" src="/protochart/ProtoChart.js"></script>
+<!--[if IE]>
+<script type="text/javascript" src="/protochart/excanvas.js">
+</script>
+<![endif]-->
+<script type="text/javascript">
+//<![CDATA[
+ function lblfmt(lbl) {
+ return '<font size=\"-2\">' + lbl + '<\/font>'
+ }
+//]]>
+</script>
+
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs filter summary">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), true, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Normal View"), false, "/diag_logs_filter.php");
+ $tab_array[] = array(gettext("Dynamic View"), false, "/diag_logs_filter_dynamic.php");
+ $tab_array[] = array(gettext("Summary View"), true, "/diag_logs_filter_summary.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" align="center" summary="main area">
+ <tr>
+ <td align="center">
+
+<?php printf (gettext('This is a firewall log summary, of the last %1$s lines of the firewall log (Max %2$s).'), $gotlines, $lines)?><br />
+<?=gettext("NOTE: IE8 users must enable compatibility view.")?>
+
+<?php
+foreach (array_keys($fields) as $field) {
+ pie_block($summary, $field , $entriesperblock);
+ echo "<br /><br />";
+ stat_block($summary, $field , $entriesperblock);
+ echo "<br /><br />";
+}
+?>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_gateways.php b/src/usr/local/www/diag_logs_gateways.php
new file mode 100755
index 0000000..bb88615
--- /dev/null
+++ b/src/usr/local/www/diag_logs_gateways.php
@@ -0,0 +1,147 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_gateways.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2012 Seth Mos
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-logs-gateways
+##|*NAME=Diagnostics: Logs: System: Gateways page
+##|*DESCR=Allow access to the 'Diagnostics: Logs: System: Gateways' page.
+##|*MATCH=diag_logs_gateways.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$system_logfile = "{$g['varlog_path']}/gateways.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($system_logfile);
+}
+
+if ($_GET['filtertext']) {
+ $filtertext = htmlspecialchars($_GET['filtertext']);
+}
+
+if ($_POST['filtertext']) {
+ $filtertext = htmlspecialchars($_POST['filtertext']);
+}
+
+if ($filtertext) {
+ $filtertextmeta="?filtertext=$filtertext";
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Gateways"));
+$shortcut_section = "gateways";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system gateways">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), true, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("General"), false, "/diag_logs.php");
+ $tab_array[] = array(gettext("Gateways"), true, "/diag_logs_gateways.php");
+ $tab_array[] = array(gettext("Routing"), false, "/diag_logs_routing.php");
+ $tab_array[] = array(gettext("Resolver"), false, "/diag_logs_resolver.php");
+ $tab_array[] = array(gettext("Wireless"), false, "/diag_logs_wireless.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic"><?php printf(gettext("Last %s system log entries"), $nentries); ?></td>
+ </tr>
+ <?php
+ if ($filtertext) {
+ dump_clog($system_logfile, $nentries, true, array("$filtertext"));
+ } else {
+ dump_clog($system_logfile, $nentries, true, array());
+ }
+ ?>
+ <tr>
+ <td align="left" valign="top">
+ <form id="filterform" name="filterform" action="diag_logs_gateways.php" method="post" style="margin-top: 14px;">
+ <input id="submit" name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log");?>" />
+ </form>
+ </td>
+ <td align="right" valign="top" >
+ <form id="clearform" name="clearform" action="diag_logs_gateways.php" method="post" style="margin-top: 14px;">
+ <input id="filtertext" name="filtertext" value="<?=$filtertext;?>" />
+ <input id="filtersubmit" name="filtersubmit" type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_ipsec.php b/src/usr/local/www/diag_logs_ipsec.php
new file mode 100644
index 0000000..8fa79ce
--- /dev/null
+++ b/src/usr/local/www/diag_logs_ipsec.php
@@ -0,0 +1,123 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_ipsec.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig /usr/bin/awk
+ pfSense_MODULE: ipsec
+*/
+
+##|+PRIV
+##|*IDENT=page-status-systemlogs-ipsecvpn
+##|*NAME=Status: System logs: IPsec VPN page
+##|*DESCR=Allow access to the 'Status: System logs: IPsec VPN' page.
+##|*MATCH=diag_logs_ipsec.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("ipsec.inc");
+
+$ipsec_logfile = "{$g['varlog_path']}/ipsec.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($ipsec_logfile);
+}
+
+$ipsec_logarr = return_clog($ipsec_logfile, $nentries);
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("IPsec VPN"));
+$shortcut_section = "ipsec";
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs ipsec">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), true, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic"><?php printf(gettext("Last %s IPsec log entries"), $nentries);?></td>
+ </tr>
+ <?php
+ foreach ($ipsec_logarr as $logent) {
+ $logent = htmlspecialchars($logent);
+ $logent = preg_split("/\s+/", $logent, 6);
+ echo "<tr valign=\"top\">\n";
+ $entry_date_time = htmlspecialchars(join(" ", array_slice($logent, 0, 3)));
+ echo "<td class=\"listlr nowrap\">" . $entry_date_time . "</td>\n";
+ echo "<td class=\"listr\">" . $logent[4] . " " . $logent[5] . "</td>\n";
+ echo "</tr>\n";
+ }
+ ?>
+ <tr>
+ <td>
+ <br />
+ <form action="diag_logs_ipsec.php" method="post">
+ <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_ntpd.php b/src/usr/local/www/diag_logs_ntpd.php
new file mode 100644
index 0000000..d9f6bf5
--- /dev/null
+++ b/src/usr/local/www/diag_logs_ntpd.php
@@ -0,0 +1,110 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_ntpd.php
+ part of pfSense
+ Copyright (C) 2005 Bill Marquette <bill.marquette@gmail.com>.
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: ntpd
+*/
+
+##|+PRIV
+##|*IDENT=page-status-systemlogs-ntpd
+##|*NAME=Status: System logs: NTP page
+##|*DESCR=Allow access to the 'Status: System logs: NTP' page.
+##|*MATCH=diag_logs_ntpd.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$ntpd_logfile = "{$g['varlog_path']}/ntpd.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($ntpd_logfile);
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("NTP"));
+$shortcut_section = "ntp";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs ntpd">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), true, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic">
+ <?php printf(gettext("Last %s NTP log entries"), $nentries);?>
+ </td>
+ </tr>
+ <?php dump_clog($ntpd_logfile, $nentries); ?>
+ <tr>
+ <td>
+ <br />
+ <form action="diag_logs_ntpd.php" method="post">
+ <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_openvpn.php b/src/usr/local/www/diag_logs_openvpn.php
new file mode 100644
index 0000000..374014d
--- /dev/null
+++ b/src/usr/local/www/diag_logs_openvpn.php
@@ -0,0 +1,111 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_openvpn.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: openvpn
+*/
+
+##|+PRIV
+##|*IDENT=page-status-systemlogs-openvpn
+##|*NAME=Status: System logs: OpenVPN page
+##|*DESCR=Allow access to the 'Status: System logs: OpenVPN' page.
+##|*MATCH=diag_logs_openvpn.php*
+##|-PRIV
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("OpenVPN"));
+$shortcut_section = "openvpn";
+
+require("guiconfig.inc");
+require_once("vpn.inc");
+
+$openvpn_logfile = "{$g['varlog_path']}/openvpn.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($openvpn_logfile);
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs openvpn">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), true, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic"><?php printf(gettext("Last %s OpenVPN log entries"), $nentries)?></td>
+ </tr>
+ <?php dump_clog($openvpn_logfile, $nentries); ?>
+ <tr>
+ <td>
+ <br />
+ <form action="diag_logs_openvpn.php" method="post">
+ <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_ppp.php b/src/usr/local/www/diag_logs_ppp.php
new file mode 100644
index 0000000..4ef3f9c
--- /dev/null
+++ b/src/usr/local/www/diag_logs_ppp.php
@@ -0,0 +1,109 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_ppp.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig /usr/bin/awk
+ pfSense_MODULE:
+*/
+
+##|+PRIV
+##|*IDENT=page-status-systemlogs-ppp
+##|*NAME=Status: System logs: IPsec VPN page
+##|*DESCR=Allow access to the 'Status: System logs: IPsec VPN' page.
+##|*MATCH=diag_logs_ppp.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$ppp_logfile = "{$g['varlog_path']}/ppp.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($ppp_logfile);
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("PPP"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs ppp">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), true, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic"><?php printf(gettext("Last %s PPP log entries"), $nentries);?></td>
+ </tr>
+ <?php dump_clog($ppp_logfile, $nentries); ?>
+ <tr>
+ <td>
+ <br />
+ <form action="diag_logs_ppp.php" method="post">
+ <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_relayd.php b/src/usr/local/www/diag_logs_relayd.php
new file mode 100644
index 0000000..5468761
--- /dev/null
+++ b/src/usr/local/www/diag_logs_relayd.php
@@ -0,0 +1,111 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_relayd.php
+ part of pfSense
+
+ Copyright (C) 2008 Bill Marquette <bill.marquette@gmail.com>.
+ Copyright (C) 2008 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-status-systemlogs-loadbalancer
+##|*NAME=Status: System logs: Load Balancer page
+##|*DESCR=Allow access to the 'Status: System logs: Load Balancer' page.
+##|*MATCH=diag_logs_relayd.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$relayd_logfile = "{$g['varlog_path']}/relayd.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($relayd_logfile);
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Load Balancer"));
+$shortcut_section = "relayd";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), true, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic">
+ <?php printf(gettext("Last %s Load Balancer log entries"), $nentries);?>
+ </td>
+ </tr>
+ <?php dump_clog($relayd_logfile, $nentries); ?>
+ <tr>
+ <td>
+ <br />
+ <form action="diag_logs_relayd.php" method="post">
+ <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_resolver.php b/src/usr/local/www/diag_logs_resolver.php
new file mode 100755
index 0000000..73e39a9
--- /dev/null
+++ b/src/usr/local/www/diag_logs_resolver.php
@@ -0,0 +1,152 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_resolver.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2012 Seth Mos
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-logs-resolver
+##|*NAME=Diagnostics: Logs: System: Resolver page
+##|*DESCR=Allow access to the 'Diagnostics: Logs: System: Resolver' page.
+##|*MATCH=diag_logs_resolver.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$system_logfile = "{$g['varlog_path']}/resolver.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($system_logfile);
+}
+
+if ($_GET['filtertext']) {
+ $filtertext = htmlspecialchars($_GET['filtertext']);
+}
+
+if ($_POST['filtertext']) {
+ $filtertext = htmlspecialchars($_POST['filtertext']);
+}
+
+if ($filtertext) {
+ $filtertextmeta="?filtertext=$filtertext";
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Resolver"));
+if (isset($config['dnsmasq']['enable'])) {
+ $shortcut_section = "forwarder";
+} else {
+ $shortcut_section = "resolver";
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system resolver">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), true, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("General"), false, "/diag_logs.php");
+ $tab_array[] = array(gettext("Gateways"), false, "/diag_logs_gateways.php");
+ $tab_array[] = array(gettext("Routing"), false, "/diag_logs_routing.php");
+ $tab_array[] = array(gettext("Resolver"), true, "/diag_logs_resolver.php");
+ $tab_array[] = array(gettext("Wireless"), false, "/diag_logs_wireless.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic"><?php printf(gettext("Last %s system log entries"), $nentries); ?></td>
+ </tr>
+ <?php
+ if ($filtertext) {
+ dump_clog($system_logfile, $nentries, true, array("$filtertext"), array("ppp"));
+ } else {
+ dump_clog($system_logfile, $nentries, true, array(), array("ppp"));
+ }
+ ?>
+ <tr>
+ <td align="left" valign="top">
+ <form id="filterform" name="filterform" action="diag_logs_resolver.php" method="post" style="margin-top: 14px;">
+ <input id="submit" name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log");?>" />
+ </form>
+ </td>
+ <td align="right" valign="top" >
+ <form id="clearform" name="clearform" action="diag_logs_resolver.php" method="post" style="margin-top: 14px;">
+ <input id="filtertext" name="filtertext" value="<?=$filtertext;?>" />
+ <input id="filtersubmit" name="filtersubmit" type="submit" class="formbtn" value="<?=gettext("Filter");?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_routing.php b/src/usr/local/www/diag_logs_routing.php
new file mode 100644
index 0000000..debbf18
--- /dev/null
+++ b/src/usr/local/www/diag_logs_routing.php
@@ -0,0 +1,123 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_routing.php
+ part of pfSense
+
+ Copyright (C) 2012 Jim Pingle <jimp@pfsense.org>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-status-systemlogs-routing
+##|*NAME=Status: System logs: Routing page
+##|*DESCR=Allow access to the 'Status: System logs: System: Routing' page.
+##|*MATCH=diag_logs_routing.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$routing_logfile = "{$g['varlog_path']}/routing.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($routing_logfile);
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Routing"));
+$shortcut_section = "routing";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system routing">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), true, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("General"), false, "/diag_logs.php");
+ $tab_array[] = array(gettext("Gateways"), false, "/diag_logs_gateways.php");
+ $tab_array[] = array(gettext("Routing"), true, "/diag_logs_routing.php");
+ $tab_array[] = array(gettext("Resolver"), false, "/diag_logs_resolver.php");
+ $tab_array[] = array(gettext("Wireless"), false, "/diag_logs_wireless.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic">
+ <?php printf(gettext("Routing daemon log entries"), $nentries);?>
+ </td>
+ </tr>
+ <?php dump_clog($routing_logfile, $nentries); ?>
+ <tr>
+ <td>
+ <br />
+ <form action="diag_logs_routing.php" method="post">
+ <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_settings.php b/src/usr/local/www/diag_logs_settings.php
new file mode 100644
index 0000000..c9f2791
--- /dev/null
+++ b/src/usr/local/www/diag_logs_settings.php
@@ -0,0 +1,517 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_settings.php
+ Copyright (C) 2004-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-logs-settings
+##|*NAME=Diagnostics: Logs: Settings page
+##|*DESCR=Allow access to the 'Diagnostics: Logs: Settings' page.
+##|*MATCH=diag_logs_settings.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$pconfig['reverse'] = isset($config['syslog']['reverse']);
+$pconfig['nentries'] = $config['syslog']['nentries'];
+$pconfig['remoteserver'] = $config['syslog']['remoteserver'];
+$pconfig['remoteserver2'] = $config['syslog']['remoteserver2'];
+$pconfig['remoteserver3'] = $config['syslog']['remoteserver3'];
+$pconfig['sourceip'] = $config['syslog']['sourceip'];
+$pconfig['ipproto'] = $config['syslog']['ipproto'];
+$pconfig['filter'] = isset($config['syslog']['filter']);
+$pconfig['dhcp'] = isset($config['syslog']['dhcp']);
+$pconfig['portalauth'] = isset($config['syslog']['portalauth']);
+$pconfig['vpn'] = isset($config['syslog']['vpn']);
+$pconfig['apinger'] = isset($config['syslog']['apinger']);
+$pconfig['relayd'] = isset($config['syslog']['relayd']);
+$pconfig['hostapd'] = isset($config['syslog']['hostapd']);
+$pconfig['logall'] = isset($config['syslog']['logall']);
+$pconfig['system'] = isset($config['syslog']['system']);
+$pconfig['enable'] = isset($config['syslog']['enable']);
+$pconfig['logdefaultblock'] = !isset($config['syslog']['nologdefaultblock']);
+$pconfig['logdefaultpass'] = isset($config['syslog']['nologdefaultpass']);
+$pconfig['logbogons'] = !isset($config['syslog']['nologbogons']);
+$pconfig['logprivatenets'] = !isset($config['syslog']['nologprivatenets']);
+$pconfig['loglighttpd'] = !isset($config['syslog']['nologlighttpd']);
+$pconfig['rawfilter'] = isset($config['syslog']['rawfilter']);
+$pconfig['filterdescriptions'] = $config['syslog']['filterdescriptions'];
+$pconfig['disablelocallogging'] = isset($config['syslog']['disablelocallogging']);
+$pconfig['logfilesize'] = $config['syslog']['logfilesize'];
+
+if (!$pconfig['nentries']) {
+ $pconfig['nentries'] = 50;
+}
+
+function is_valid_syslog_server($target) {
+ return (is_ipaddr($target)
+ || is_ipaddrwithport($target)
+ || is_hostname($target)
+ || is_hostnamewithport($target));
+}
+
+if ($_POST['resetlogs'] == gettext("Reset Log Files")) {
+ clear_all_log_files();
+ $savemsg .= gettext("The log files have been reset.");
+} elseif ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['enable'] && !is_valid_syslog_server($_POST['remoteserver'])) {
+ $input_errors[] = gettext("A valid IP address/hostname or IP/hostname:port must be specified for remote syslog server #1.");
+ }
+ if ($_POST['enable'] && $_POST['remoteserver2'] && !is_valid_syslog_server($_POST['remoteserver2'])) {
+ $input_errors[] = gettext("A valid IP address/hostname or IP/hostname:port must be specified for remote syslog server #2.");
+ }
+ if ($_POST['enable'] && $_POST['remoteserver3'] && !is_valid_syslog_server($_POST['remoteserver3'])) {
+ $input_errors[] = gettext("A valid IP address/hostname or IP/hostname:port must be specified for remote syslog server #3.");
+ }
+
+ if (($_POST['nentries'] < 5) || ($_POST['nentries'] > 2000)) {
+ $input_errors[] = gettext("Number of log entries to show must be between 5 and 2000.");
+ }
+
+ if (isset($_POST['logfilesize']) && (strlen($_POST['logfilesize']) > 0)) {
+ if (!is_numeric($_POST['logfilesize']) || ($_POST['logfilesize'] < 100000)) {
+ $input_errors[] = gettext("Log file size must be numeric and greater than or equal to 100000.");
+ }
+ }
+ if (!$input_errors) {
+ $config['syslog']['reverse'] = $_POST['reverse'] ? true : false;
+ $config['syslog']['nentries'] = (int)$_POST['nentries'];
+ $pconfig['nentries'] = $config['syslog']['nentries'];
+ if (isset($_POST['logfilesize']) && (strlen($_POST['logfilesize']) > 0)) {
+ $config['syslog']['logfilesize'] = (int)$_POST['logfilesize'];
+ $pconfig['logfilesize'] = $config['syslog']['logfilesize'];
+ } else {
+ unset($config['syslog']['logfilesize']);
+ }
+ $config['syslog']['remoteserver'] = $_POST['remoteserver'];
+ $config['syslog']['remoteserver2'] = $_POST['remoteserver2'];
+ $config['syslog']['remoteserver3'] = $_POST['remoteserver3'];
+ $config['syslog']['sourceip'] = $_POST['sourceip'];
+ $config['syslog']['ipproto'] = $_POST['ipproto'];
+ $config['syslog']['filter'] = $_POST['filter'] ? true : false;
+ $config['syslog']['dhcp'] = $_POST['dhcp'] ? true : false;
+ $config['syslog']['portalauth'] = $_POST['portalauth'] ? true : false;
+ $config['syslog']['vpn'] = $_POST['vpn'] ? true : false;
+ $config['syslog']['apinger'] = $_POST['apinger'] ? true : false;
+ $config['syslog']['relayd'] = $_POST['relayd'] ? true : false;
+ $config['syslog']['hostapd'] = $_POST['hostapd'] ? true : false;
+ $config['syslog']['logall'] = $_POST['logall'] ? true : false;
+ $config['syslog']['system'] = $_POST['system'] ? true : false;
+ $config['syslog']['disablelocallogging'] = $_POST['disablelocallogging'] ? true : false;
+ $config['syslog']['enable'] = $_POST['enable'] ? true : false;
+ $oldnologdefaultblock = isset($config['syslog']['nologdefaultblock']);
+ $oldnologdefaultpass = isset($config['syslog']['nologdefaultpass']);
+ $oldnologbogons = isset($config['syslog']['nologbogons']);
+ $oldnologprivatenets = isset($config['syslog']['nologprivatenets']);
+ $oldnologlighttpd = isset($config['syslog']['nologlighttpd']);
+ $config['syslog']['nologdefaultblock'] = $_POST['logdefaultblock'] ? false : true;
+ $config['syslog']['nologdefaultpass'] = $_POST['logdefaultpass'] ? true : false;
+ $config['syslog']['nologbogons'] = $_POST['logbogons'] ? false : true;
+ $config['syslog']['nologprivatenets'] = $_POST['logprivatenets'] ? false : true;
+ $config['syslog']['nologlighttpd'] = $_POST['loglighttpd'] ? false : true;
+ $config['syslog']['rawfilter'] = $_POST['rawfilter'] ? true : false;
+ if (is_numeric($_POST['filterdescriptions']) && $_POST['filterdescriptions'] > 0) {
+ $config['syslog']['filterdescriptions'] = $_POST['filterdescriptions'];
+ } else {
+ unset($config['syslog']['filterdescriptions']);
+ }
+ if ($config['syslog']['enable'] == false) {
+ unset($config['syslog']['remoteserver']);
+ unset($config['syslog']['remoteserver2']);
+ unset($config['syslog']['remoteserver3']);
+ }
+
+ write_config();
+
+ $retval = 0;
+ $retval = system_syslogd_start();
+ if (($oldnologdefaultblock !== isset($config['syslog']['nologdefaultblock'])) ||
+ ($oldnologdefaultpass !== isset($config['syslog']['nologdefaultpass'])) ||
+ ($oldnologbogons !== isset($config['syslog']['nologbogons'])) ||
+ ($oldnologprivatenets !== isset($config['syslog']['nologprivatenets']))) {
+ $retval |= filter_configure();
+ }
+
+ $savemsg = get_std_save_message($retval);
+
+ if ($oldnologlighttpd !== isset($config['syslog']['nologlighttpd'])) {
+ ob_flush();
+ flush();
+ log_error(gettext("webConfigurator configuration has changed. Restarting webConfigurator."));
+ send_event("service restart webgui");
+ $savemsg .= "<br />" . gettext("WebGUI process is restarting.");
+ }
+
+ filter_pflog_start(true);
+ }
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Settings"));
+$closehead = false;
+include("head.inc");
+
+?>
+
+
+<script type="text/javascript">
+//<![CDATA[
+function enable_change(enable_over) {
+ if (document.iform.enable.checked || enable_over) {
+ document.iform.remoteserver.disabled = 0;
+ document.iform.remoteserver2.disabled = 0;
+ document.iform.remoteserver3.disabled = 0;
+ document.iform.filter.disabled = 0;
+ document.iform.dhcp.disabled = 0;
+ document.iform.portalauth.disabled = 0;
+ document.iform.vpn.disabled = 0;
+ document.iform.apinger.disabled = 0;
+ document.iform.relayd.disabled = 0;
+ document.iform.hostapd.disabled = 0;
+ document.iform.system.disabled = 0;
+ document.iform.logall.disabled = 0;
+ check_everything();
+ } else {
+ document.iform.remoteserver.disabled = 1;
+ document.iform.remoteserver2.disabled = 1;
+ document.iform.remoteserver3.disabled = 1;
+ document.iform.filter.disabled = 1;
+ document.iform.dhcp.disabled = 1;
+ document.iform.portalauth.disabled = 1;
+ document.iform.vpn.disabled = 1;
+ document.iform.apinger.disabled = 1;
+ document.iform.relayd.disabled = 1;
+ document.iform.hostapd.disabled = 1;
+ document.iform.system.disabled = 1;
+ document.iform.logall.disabled = 1;
+ }
+}
+function check_everything() {
+ if (document.iform.logall.checked) {
+ document.iform.filter.disabled = 1;
+ document.iform.filter.checked = false;
+ document.iform.dhcp.disabled = 1;
+ document.iform.dhcp.checked = false;
+ document.iform.portalauth.disabled = 1;
+ document.iform.portalauth.checked = false;
+ document.iform.vpn.disabled = 1;
+ document.iform.vpn.checked = false;
+ document.iform.apinger.disabled = 1;
+ document.iform.apinger.checked = false;
+ document.iform.relayd.disabled = 1;
+ document.iform.relayd.checked = false;
+ document.iform.hostapd.disabled = 1;
+ document.iform.hostapd.checked = false;
+ document.iform.system.disabled = 1;
+ document.iform.system.checked = false;
+ } else {
+ document.iform.filter.disabled = 0;
+ document.iform.dhcp.disabled = 0;
+ document.iform.portalauth.disabled = 0;
+ document.iform.vpn.disabled = 0;
+ document.iform.apinger.disabled = 0;
+ document.iform.relayd.disabled = 0;
+ document.iform.hostapd.disabled = 0;
+ document.iform.system.disabled = 0;
+ }
+}
+//]]>
+</script>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="diag_logs_settings.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs settings">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), true, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("General Logging Options");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">Forward/Reverse Display</td>
+ <td width="78%" class="vtable">
+ <input name="reverse" type="checkbox" id="reverse" value="yes" <?php if ($pconfig['reverse']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Show log entries in reverse order (newest entries on top)");?></strong>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">GUI Log Entries to Display</td>
+ <td width="78%" class="vtable">
+ <input name="nentries" id="nentries" type="text" class="formfld unknown" size="4" value="<?=htmlspecialchars($pconfig['nentries']);?>" /><br />
+ <?=gettext("Hint: This is only the number of log entries displayed in the GUI. It does not affect how many entries are contained in the actual log files.") ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">Log File Size (Bytes)</td>
+ <td width="78%" class="vtable">
+ <input name="logfilesize" id="logfilesize" type="text" class="formfld unknown" size="8" value="<?=htmlspecialchars($pconfig['logfilesize']);?>" /><br />
+ <?=gettext("Logs are held in constant-size circular log files. This field controls how large each log file is, and thus how many entries may exist inside the log. By default this is approximately 500KB per log file, and there are nearly 20 such log files.") ?>
+ <br /><br />
+ <?=gettext("NOTE: Log sizes are changed the next time a log file is cleared or deleted. To immediately increase the size of the log files, you must first save the options to set the size, then clear all logs using the \"Reset Log Files\" option farther down this page. "); ?>
+ <?=gettext("Be aware that increasing this value increases every log file size, so disk usage will increase significantly."); ?>
+ <?=gettext("Disk space currently used by log files: ") ?><?= exec("/usr/bin/du -sh /var/log | /usr/bin/awk '{print $1;}'"); ?>.
+ <?=gettext("Remaining disk space for log files: ") ?><?= exec("/bin/df -h /var/log | /usr/bin/awk '{print $4;}'"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vtable">Log Firewall Default Blocks</td>
+ <td class="vtable">
+ <input name="logdefaultblock" type="checkbox" id="logdefaultblock" value="yes" <?php if ($pconfig['logdefaultblock']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Log packets matched from the default block rules put in the ruleset");?></strong><br />
+ <?=gettext("Hint: packets that are blocked by the implicit default block rule will not be logged if you uncheck this option. Per-rule logging options are still respected.");?>
+ <br />
+ <input name="logdefaultpass" type="checkbox" id="logdefaultpass" value="yes" <?php if ($pconfig['logdefaultpass']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Log packets matched from the default pass rules put in the ruleset");?></strong><br />
+ <?=gettext("Hint: packets that are allowed by the implicit default pass rule will be logged if you check this option. Per-rule logging options are still respected.");?>
+ <br />
+ <input name="logbogons" type="checkbox" id="logbogons" value="yes" <?php if ($pconfig['logbogons']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Log packets blocked by 'Block Bogon Networks' rules");?></strong><br />
+ <br />
+ <input name="logprivatenets" type="checkbox" id="logprivatenets" value="yes" <?php if ($pconfig['logprivatenets']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Log packets blocked by 'Block Private Networks' rules");?></strong><br />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vtable">Web Server Log</td>
+ <td class="vtable">
+ <input name="loglighttpd" type="checkbox" id="loglighttpd" value="yes" <?php if ($pconfig['loglighttpd']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Log errors from the web server process.");?></strong><br />
+ <?=gettext("Hint: If this is checked, errors from the lighttpd web server process for the GUI or Captive Portal will appear in the main system log.");?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vtable">Raw Logs</td>
+ <td class="vtable">
+ <input name="rawfilter" type="checkbox" id="rawfilter" value="yes" <?php if ($pconfig['rawfilter']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Show raw filter logs");?></strong><br />
+ <?=gettext("Hint: If this is checked, filter logs are shown as generated by the packet filter, without any formatting. This will reveal more detailed information, but it is more difficult to read.");?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vtable">Filter descriptions</td>
+ <td class="vtable">
+ <select name="filterdescriptions" id="filterdescriptions" >
+ <option value="0"<?=!isset($pconfig['filterdescriptions'])?" selected=\"selected\"":""?>>Dont load descriptions</option>
+ <option value="1"<?=($pconfig['filterdescriptions']) === "1"?" selected=\"selected\"":""?>>Display as column</option>
+ <option value="2"<?=($pconfig['filterdescriptions']) === "2"?" selected=\"selected\"":""?>>Display as second row</option>
+ </select>
+ <strong><?=gettext("Show the applied rule description below or in the firewall log rows.");?></strong>
+ <br />
+ <?=gettext("Displaying rule descriptions for all lines in the log might affect performance with large rule sets.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">Local Logging</td>
+ <td width="78%" class="vtable">
+ <input name="disablelocallogging" type="checkbox" id="disablelocallogging" value="yes" <?php if ($pconfig['disablelocallogging']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
+ <strong>
+ <?php if ($g['platform'] == "pfSense"): ?>
+ <?=gettext("Disable writing log files to the local disk");?>
+ <?php else: ?>
+ <?=gettext("Disable writing log files to the local RAM disk");?>
+ <?php endif; ?>
+ </strong>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">Reset Logs</td>
+ <td width="78%">
+ <input name="resetlogs" type="submit" class="formbtn" value="<?=gettext("Reset Log Files"); ?>" onclick="return confirm('<?=gettext('Do you really want to reset the log files? This will erase all local log data.');?>')" />
+ <br /><br />
+ <?= gettext("Note: Clears all local log files and reinitializes them as empty logs. This also restarts the DHCP daemon. Use the Save button first if you have made any setting changes."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Remote Logging Options");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Source Address"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="sourceip" class="formselect">
+ <option value="">Default (any)</option>
+ <?php
+ $sourceips = get_possible_traffic_source_addresses(false);
+ foreach ($sourceips as $sipvalue => $sipname):
+ $selected = "";
+ if (!link_interface_to_bridge($sipvalue) && ($sipvalue == $pconfig['sourceip'])) {
+ $selected = 'selected="selected"';
+ }
+ ?>
+ <option value="<?=$sipvalue;?>" <?=$selected;?>>
+ <?=htmlspecialchars($sipname);?>
+ </option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <br />
+ <?= gettext("This option will allow the logging daemon to bind to a single IP address, rather than all IP addresses."); ?>
+ <?= gettext("If you pick a single IP, remote syslog severs must all be of that IP type. If you wish to mix IPv4 and IPv6 remote syslog servers, you must bind to all interfaces."); ?>
+ <br /><br />
+ <?= gettext("NOTE: If an IP address cannot be located on the chosen interface, the daemon will bind to all addresses."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IP Protocol"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="ipproto" class="formselect">
+ <option value="ipv4" <?php if ($ipproto == "ipv4") echo 'selected="selected"' ?>>IPv4</option>
+ <option value="ipv6" <?php if ($ipproto == "ipv6") echo 'selected="selected"' ?>>IPv6</option>
+ </select>
+ <br />
+ <?= gettext("This option is only used when a non-default address is chosen as the source above. This option only expresses a preference; If an IP address of the selected type is not found on the chosen interface, the other type will be tried."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Enable Remote Logging");?></td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
+ <strong><?=gettext("Send log messages to remote syslog server");?></strong>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Remote Syslog Servers");?></td>
+ <td width="78%" class="vtable">
+ <table summary="remtote syslog servers">
+ <tr>
+ <td><?=gettext("Server") . " 1";?></td>
+ <td><input name="remoteserver" id="remoteserver" type="text" class="formfld host" size="20" value="<?=htmlspecialchars($pconfig['remoteserver']);?>" /></td>
+ </tr>
+ <tr>
+ <td><?=gettext("Server") . " 2";?></td>
+ <td><input name="remoteserver2" id="remoteserver2" type="text" class="formfld host" size="20" value="<?=htmlspecialchars($pconfig['remoteserver2']);?>" /></td>
+ </tr>
+ <tr>
+ <td><?=gettext("Server") . " 3";?></td>
+ <td><input name="remoteserver3" id="remoteserver3" type="text" class="formfld host" size="20" value="<?=htmlspecialchars($pconfig['remoteserver3']);?>" /></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td><?=gettext("IP addresses of remote syslog servers, or an IP:port.");?></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Remote Syslog Contents");?></td>
+ <td width="78%" class="vtable">
+ <input name="logall" id="logall" type="checkbox" value="yes" <?php if ($pconfig['logall']) echo "checked=\"checked\""; ?> onclick="check_everything();" />
+ <?=gettext("Everything");?><br /><br />
+ <input name="system" id="system" type="checkbox" value="yes" onclick="enable_change(false)" <?php if ($pconfig['system']) echo "checked=\"checked\""; ?> />
+ <?=gettext("System events");?><br />
+ <input name="filter" id="filter" type="checkbox" value="yes" <?php if ($pconfig['filter']) echo "checked=\"checked\""; ?> />
+ <?=gettext("Firewall events");?><br />
+ <input name="dhcp" id="dhcp" type="checkbox" value="yes" <?php if ($pconfig['dhcp']) echo "checked=\"checked\""; ?> />
+ <?=gettext("DHCP service events");?><br />
+ <input name="portalauth" id="portalauth" type="checkbox" value="yes" <?php if ($pconfig['portalauth']) echo "checked=\"checked\""; ?> />
+ <?=gettext("Portal Auth events");?><br />
+ <input name="vpn" id="vpn" type="checkbox" value="yes" <?php if ($pconfig['vpn']) echo "checked=\"checked\""; ?> />
+ <?=gettext("VPN (PPTP, IPsec, OpenVPN) events");?><br />
+ <input name="apinger" id="apinger" type="checkbox" value="yes" <?php if ($pconfig['apinger']) echo "checked=\"checked\""; ?> />
+ <?=gettext("Gateway Monitor events");?><br />
+ <input name="relayd" id="relayd" type="checkbox" value="yes" <?php if ($pconfig['relayd']) echo "checked=\"checked\""; ?> />
+ <?=gettext("Server Load Balancer events");?><br />
+ <input name="hostapd" id="hostapd" type="checkbox" value="yes" <?php if ($pconfig['hostapd']) echo "checked=\"checked\""; ?> />
+ <?=gettext("Wireless events");?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" height="53" valign="top">&nbsp;</td>
+ <td width="78%">
+ <strong>
+ <span class="red">
+ <?=gettext("Note:")?>
+ </span>
+ </strong>
+ <br />
+ <?=gettext("syslog sends UDP datagrams to port 514 on the specified " .
+ "remote syslog server, unless another port is specified. Be sure to set syslogd on the " .
+ "remote server to accept syslog messages from");?> <?=$g['product_name']?>.
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_vpn.php b/src/usr/local/www/diag_logs_vpn.php
new file mode 100755
index 0000000..d1dc748
--- /dev/null
+++ b/src/usr/local/www/diag_logs_vpn.php
@@ -0,0 +1,211 @@
+#!/usr/local/bin/php
+<?php
+/*
+ diag_logs_vpn.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/sbin/fifolog_reader /usr/local/sbin/clog
+ pfSense_MODULE: vpn
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-logs-pptpvpn
+##|*NAME=Diagnostics: Logs: VPN page
+##|*DESCR=Allow access to the 'Diagnostics: Logs: VPN' page.
+##|*MATCH=diag_logs_vpn.php*
+##|-PRIV
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("VPN"));
+require("guiconfig.inc");
+require_once("vpn.inc");
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if (htmlspecialchars($_POST['vpntype'])) {
+ $vpntype = htmlspecialchars($_POST['vpntype']);
+} elseif (htmlspecialchars($_GET['vpntype'])) {
+ $vpntype = htmlspecialchars($_GET['vpntype']);
+} else {
+ $vpntype = "pptp";
+}
+if (htmlspecialchars($_POST['mode'])) {
+ $mode = htmlspecialchars($_POST['mode']);
+} elseif (htmlspecialchars($_GET['mode'])) {
+ $mode = htmlspecialchars($_GET['mode']);
+} else {
+ $mode = "login";
+}
+switch ($vpntype) {
+ case 'pptp':
+ $logname = "pptps";
+ break;
+ case 'poes':
+ $logname = "poes";
+ break;
+ case 'l2tp':
+ $logname = "l2tps";
+ break;
+}
+
+if ($_POST['clear']) {
+ if ($mode != "raw") {
+ clear_log_file("/var/log/vpn.log");
+ } else {
+ clear_log_file("/var/log/{$logname}.log");
+ }
+}
+
+function dump_clog_vpn($logfile, $tail) {
+ global $g, $config, $vpntype;
+
+ $sor = isset($config['syslog']['reverse']) ? "-r" : "";
+
+ $logarr = "";
+
+ if (isset($config['system']['usefifolog'])) {
+ exec("/usr/sbin/fifolog_reader " . escapeshellarg($logfile) . " | tail {$sor} -n " . $tail, $logarr);
+ } else {
+ exec("/usr/local/sbin/clog " . escapeshellarg($logfile) . " | tail {$sor} -n " . $tail, $logarr);
+ }
+
+ foreach ($logarr as $logent) {
+ $logent = preg_split("/\s+/", $logent, 6);
+ $llent = explode(",", $logent[5]);
+ $iftype = substr($llent[1], 0, 4);
+ if ($iftype != $vpntype) {
+ continue;
+ }
+ echo "<tr>\n";
+ echo "<td class=\"listlr nowrap\">" . htmlspecialchars(join(" ", array_slice($logent, 0, 3))) . "</td>\n";
+
+ if ($llent[0] == "login") {
+ echo "<td class=\"listr\"><img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" title=\"login\" alt=\"in\" /></td>\n";
+ } else {
+ echo "<td class=\"listr\"><img src=\"/themes/{$g['theme']}/images/icons/icon_out.gif\" width=\"11\" height=\"11\" title=\"logout\" alt=\"out\" /></td>\n";
+ }
+
+ echo "<td class=\"listr\">" . htmlspecialchars($llent[3]) . "</td>\n";
+ echo "<td class=\"listr\">" . htmlspecialchars($llent[2]) . "&nbsp;</td>\n";
+ echo "</tr>\n";
+ }
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs vpn">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), false, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), true, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("PPTP Logins"),
+ (($vpntype == "pptp") && ($mode != "raw")),
+ "/diag_logs_vpn.php?vpntype=pptp");
+ $tab_array[] = array(gettext("PPTP Raw"),
+ (($vpntype == "pptp") && ($mode == "raw")),
+ "/diag_logs_vpn.php?vpntype=pptp&amp;mode=raw");
+ $tab_array[] = array(gettext("PPPoE Logins"),
+ (($vpntype == "poes") && ($mode != "raw")),
+ "/diag_logs_vpn.php?vpntype=poes");
+ $tab_array[] = array(gettext("PPPoE Raw"),
+ (($vpntype == "poes") && ($mode == "raw")),
+ "/diag_logs_vpn.php?vpntype=poes&amp;mode=raw");
+ $tab_array[] = array(gettext("L2TP Logins"),
+ (($vpntype == "l2tp") && ($mode != "raw")),
+ "/diag_logs_vpn.php?vpntype=l2tp");
+ $tab_array[] = array(gettext("L2TP Raw"),
+ (($vpntype == "l2tp") && ($mode == "raw")),
+ "/diag_logs_vpn.php?vpntype=l2tp&amp;mode=raw");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <form action="diag_logs_vpn.php" method="post">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="4" class="listtopic">
+ <?php printf(gettext('Last %1$s %2$s VPN log entries'), $nentries, $vpns[$vpntype]);?>
+ </td>
+ </tr>
+ <?php
+ if ($mode != "raw"):
+ ?>
+ <tr>
+ <td class="listhdrr"><?=gettext("Time");?></td>
+ <td class="listhdrr"><?=gettext("Action");?></td>
+ <td class="listhdrr"><?=gettext("User");?></td>
+ <td class="listhdrr"><?=gettext("IP address");?></td>
+ </tr>
+ <?php
+ dump_clog_vpn("/var/log/vpn.log", $nentries);
+ ?>
+ <?php
+ else:
+ dump_clog("/var/log/{$logname}.log", $nentries);
+ endif;
+ ?>
+ </table>
+ <br />
+ <input type="hidden" name="vpntype" id="vpntype" value="<?=$vpntype;?>" />
+ <input type="hidden" name="mode" id="mode" value="<?=$mode;?>" />
+ <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
+ </form>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_logs_wireless.php b/src/usr/local/www/diag_logs_wireless.php
new file mode 100644
index 0000000..4979d1e
--- /dev/null
+++ b/src/usr/local/www/diag_logs_wireless.php
@@ -0,0 +1,125 @@
+<?php
+/* $Id$ */
+/*
+ diag_logs_wireless.php
+ part of pfSense
+
+ Copyright (C) 2008 Bill Marquette <bill.marquette@gmail.com>.
+ Copyright (C) 2008 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2011 Jim Pingle <jimp@pfsense.org>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-status-systemlogs-wireless
+##|*NAME=Status: System logs: Wireless page
+##|*DESCR=Allow access to the 'Status: System logs: System: Wireless' page.
+##|*MATCH=diag_logs_wireless.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$wireless_logfile = "{$g['varlog_path']}/wireless.log";
+
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+if ($_POST['clear']) {
+ clear_log_file($wireless_logfile);
+}
+
+$pgtitle = array(gettext("Status"), gettext("System logs"), gettext("Wireless"));
+$shortcut_section = "wireless";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="logs system wireless">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("System"), true, "diag_logs.php");
+ $tab_array[] = array(gettext("Firewall"), false, "diag_logs_filter.php");
+ $tab_array[] = array(gettext("DHCP"), false, "diag_logs_dhcp.php");
+ $tab_array[] = array(gettext("Portal Auth"), false, "diag_logs_auth.php");
+ $tab_array[] = array(gettext("IPsec"), false, "diag_logs_ipsec.php");
+ $tab_array[] = array(gettext("PPP"), false, "diag_logs_ppp.php");
+ $tab_array[] = array(gettext("VPN"), false, "diag_logs_vpn.php");
+ $tab_array[] = array(gettext("Load Balancer"), false, "diag_logs_relayd.php");
+ $tab_array[] = array(gettext("OpenVPN"), false, "diag_logs_openvpn.php");
+ $tab_array[] = array(gettext("NTP"), false, "diag_logs_ntpd.php");
+ $tab_array[] = array(gettext("Settings"), false, "diag_logs_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("General"), false, "/diag_logs.php");
+ $tab_array[] = array(gettext("Gateways"), false, "/diag_logs_gateways.php");
+ $tab_array[] = array(gettext("Routing"), false, "/diag_logs_routing.php");
+ $tab_array[] = array(gettext("Resolver"), false, "/diag_logs_resolver.php");
+ $tab_array[] = array(gettext("Wireless"), true, "/diag_logs_wireless.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic">
+ <?php printf(gettext("Wireless (hostapd) log entries"), $nentries);?>
+ </td>
+ </tr>
+ <?php dump_clog($wireless_logfile, $nentries); ?>
+ <tr>
+ <td>
+ <br />
+ <form action="diag_logs_wireless.php" method="post">
+ <input name="clear" type="submit" class="formbtn" value="<?=gettext("Clear log"); ?>" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_nanobsd.php b/src/usr/local/www/diag_nanobsd.php
new file mode 100644
index 0000000..63a4f35
--- /dev/null
+++ b/src/usr/local/www/diag_nanobsd.php
@@ -0,0 +1,289 @@
+<?php
+/*
+ diag_nanobsd.php
+ Copyright (C) 2009 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/mount /sbin/glabel /usr/bin/grep /usr/bin/cut /usr/bin/head /bin/cp
+ pfSense_BUILDER_BINARIES: /usr/sbin/boot0cfg /bin/mkdir /sbin/fsck_ufs /sbin/mount /bin/dd /sbin/tunefs
+ pfSense_MODULE: nanobsd
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-nanobsd
+##|*NAME=Diagnostics: NanoBSD
+##|*DESCR=Allow access to the 'Diagnostics: NanoBSD' page.
+##|*MATCH=diag_nanobsd.php*
+##|-PRIV
+
+ini_set('zlib.output_compression', 0);
+ini_set('implicit_flush', 1);
+ini_set('max_input_time', '9999');
+
+require_once("guiconfig.inc");
+require_once("config.inc");
+
+$pgtitle = array(gettext("Diagnostics"), gettext("NanoBSD"));
+include("head.inc");
+
+// Survey slice info
+global $SLICE, $OLDSLICE, $TOFLASH, $COMPLETE_PATH, $COMPLETE_BOOT_PATH;
+global $GLABEL_SLICE, $UFS_ID, $OLD_UFS_ID, $BOOTFLASH;
+global $BOOT_DEVICE, $REAL_BOOT_DEVICE, $BOOT_DRIVE, $ACTIVE_SLICE;
+nanobsd_detect_slice_info();
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
+
+<?php include("fbegin.inc"); ?>
+
+<?php
+
+$NANOBSD_SIZE = nanobsd_get_size();
+
+if ($_POST['bootslice']) {
+ $statusmsg = gettext("Setting slice information, please wait...");
+ echo <<<EOF
+ <div id="loading">
+ <img src="/themes/{$g['theme']}/images/misc/loader.gif">
+ $statusmsg
+ <p/>&nbsp;
+ </div>
+EOF;
+ nanobsd_switch_boot_slice();
+ $savemsg = gettext("The boot slice has been set to") . " " . nanobsd_get_active_slice();
+ // Survey slice info
+ nanobsd_detect_slice_info();
+
+}
+
+if ($_POST['destslice']) {
+ $statusmsg = gettext("Duplicating slice. Please wait, this will take a moment...");
+ echo <<<EOF
+ <div id="loading">
+ <img src="/themes/{$g['theme']}/images/misc/loader.gif">
+ $statusmsg
+ <p/>&nbsp;
+ </div>
+EOF;
+ if (nanobsd_clone_slice($_POST['destslice'])) {
+ $savemsg = gettext("The slice has been duplicated.") . "<p/>" . gettext("If you would like to boot from this newly duplicated slice please set it using the bootup information area.");
+ } else {
+ $savemsg = gettext("There was an error while duplicating the slice. Operation aborted.");
+ }
+ // Re-Survey slice info
+ nanobsd_detect_slice_info();
+}
+
+if ($_POST['changero']) {
+ if (is_writable("/")) {
+ conf_mount_ro();
+ } else {
+ conf_mount_rw();
+ }
+}
+
+if ($_POST['setrw']) {
+ conf_mount_rw();
+ if (isset($_POST['nanobsd_force_rw'])) {
+ $config['system']['nanobsd_force_rw'] = true;
+ } else {
+ unset($config['system']['nanobsd_force_rw']);
+ }
+
+ write_config("Changed Permanent Read/Write Setting");
+ conf_mount_ro();
+}
+
+if ($savemsg) {
+ print_info_box($savemsg);
+}
+
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <!-- tabs here if you want them -->
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("NOTE:")?>&nbsp;</strong>
+ </span>
+ <?=gettext("The options on this page are intended for use by advanced users only.")?>
+ <br />&nbsp;
+ </span>
+ <p/>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Bootup information");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NanoBSD Image size");?></td>
+ <td width="78%" class="vtable">
+ <?php echo $NANOBSD_SIZE; ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bootup");?></td>
+ <td width="78%" class="vtable">
+ <form action="diag_nanobsd.php" method="post" name="iform">
+ <?=gettext("Bootup slice is currently:");?> <?php echo $ACTIVE_SLICE; ?>
+ <br /><br /><?=gettext("This will switch the bootup slice to the alternate slice.");?>
+ <br />
+ <input type='hidden' name='bootslice' value='switch'>
+ <input type='submit' value='Switch Slice'></form>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Media Read/Write Status");?></td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell">Current Read/Write Status:</td>
+ <td valign="top" class="vncell">
+ <form action="diag_nanobsd.php" method="post" name="iform">
+ <?php if (is_writable("/")) {
+ $refcount = refcount_read(1000);
+ /* refcount_read returns -1 when shared memory section does not exist */
+ if ($refcount == 1 || $refcount == -1) {
+ $refdisplay = "";
+ } else {
+ $refdisplay = " (reference count " . $refcount . ")";
+ }
+ echo gettext("Read/Write") . $refdisplay;
+ if (!isset($config['system']['nanobsd_force_rw'])) {
+ echo "<br /><input type='submit' name='changero' value='" . gettext("Switch to Read-Only") . "'>";
+ }
+ } else {
+ echo gettext("Read-Only");
+ if (!isset($config['system']['nanobsd_force_rw'])) {
+ echo "<br /><input type='submit' name='changero' value='" . gettext("Switch to Read/Write") . "'>";
+ }
+ } ?>
+ </form>
+ <br /><?php echo gettext("NOTE: This setting is only temporary, and can be switched dynamically in the background."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell">Permanent Read/Write:</td>
+ <td valign="top" class="vncell">
+ <form action="diag_nanobsd.php" method="post" name="iform">
+ <input type="checkbox" name="nanobsd_force_rw" <?php if (isset($config['system']['nanobsd_force_rw'])) echo "checked"; ?>> <?php echo gettext("Keep media mounted read/write at all times.") ?>
+ <br /><input type='submit' name='setrw' value='<?php echo gettext("Save") ?>'>
+ </form>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Duplicate bootup slice to alternate");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Duplicate bootup slice");?></td>
+ <td width="78%" class="vtable">
+ <form action="diag_nanobsd.php" method="post" name="iform">
+ <?=gettext("Destination slice:");?>
+ <select name='destslice'>
+ <option value='<?php echo $COMPLETE_PATH; ?>'>
+ <?php echo "{$COMPLETE_BOOT_PATH} -> {$TOFLASH}"; ?>
+ </option>
+ </select>
+ <br />
+ <?=gettext("This will duplicate the bootup slice to the alternate slice. Use this if you would like to duplicate the known good working boot partition to the alternate.");?>
+ <br /><input type='submit' name='duplicateslice' value='<?php echo gettext("Duplicate slice") ?>'>
+ </form>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Periodic Data Backup");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RRD/DHCP Backup");?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("These options have been relocated to");?> <a href="system_advanced_misc.php"><?=gettext("System > Advanced, Miscellaneous tab")?></a>.
+ </td>
+ </tr>
+<?php if (file_exists("/conf/upgrade_log.txt")): ?>
+ <tr>
+ <td colspan="2" valign="top" class="">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("View upgrade log");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("View previous upgrade log");?></td>
+ <td width="78%" class="vtable">
+ <?php
+ if ($_POST['viewupgradelog']) {
+ echo "<textarea name='log' cols='80' rows='40'>";
+ echo str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/upgrade_log.txt"));
+ echo "\nFile list:\n";
+ echo str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/file_upgrade_log.txt"));
+ echo "\nMisc log:\n";
+ echo str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/firmware_update_misc_log.txt"));
+ echo "\nfdisk/bsdlabel log:\n";
+ echo str_ireplace("pfsense", $g['product_name'], file_get_contents("/conf/fdisk_upgrade_log.txt"));
+ echo "</textarea>";
+ } else {
+ echo "<form action='diag_nanobsd.php' method='post' name='iform'>";
+ echo "<input type='submit' name='viewupgradelog' value='View upgrade log'>";
+ }
+ ?>
+ </td>
+ </tr>
+<?php endif; ?>
+ <tr>
+ <td colspan="2" valign="top" class="">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php require("fend.inc"); ?>
+</body>
+</html>
+
+<?php
+
+// Clear the loading indicator
+echo "<script type=\"text/javascript\">";
+echo "jQuery('#loading').html('');";
+echo "</script>";
+
+?>
diff --git a/src/usr/local/www/diag_ndp.php b/src/usr/local/www/diag_ndp.php
new file mode 100644
index 0000000..233d8ee
--- /dev/null
+++ b/src/usr/local/www/diag_ndp.php
@@ -0,0 +1,184 @@
+<?php
+/*
+ diag_ndp.php
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright (C) 2004-2010 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2011 Seth Mos <seth.mos@dds.nl>
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2005 Paul Taylor (paultaylor@winndixie.com) and Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /bin/cat /usr/sbin/arp
+ pfSense_MODULE: arp
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-ndptable
+##|*NAME=Diagnostics: NDP Table page
+##|*DESCR=Allow access to the 'Diagnostics: NDP Table' page.
+##|*MATCH=diag_ndp.php*
+##|-PRIV
+
+@ini_set('zlib.output_compression', 0);
+@ini_set('implicit_flush', 1);
+
+require("guiconfig.inc");
+
+exec("/usr/sbin/ndp -na", $rawdata);
+
+$i = 0;
+
+/* if list */
+$ifdescrs = get_configured_interface_with_descr();
+
+foreach ($ifdescrs as $key =>$interface) {
+ $hwif[$config['interfaces'][$key]['if']] = $interface;
+}
+
+/* Array ( [0] => Neighbor [1] => Linklayer [2] => Address
+[3] => Netif [4] => Expire [5] => S
+[6] => Flags ) */
+$data = array();
+array_shift($rawdata);
+foreach ($rawdata as $line) {
+ $elements = preg_split('/[ ]+/', $line);
+
+ $ndpent = array();
+ $ndpent['ipv6'] = trim($elements[0]);
+ $ndpent['mac'] = trim($elements[1]);
+ $ndpent['interface'] = trim($elements[2]);
+ $data[] = $ndpent;
+}
+
+/* FIXME: Not ipv6 compatible dns resolving. PHP needs fixing */
+function _getHostName($mac, $ip) {
+ if (is_ipaddr($ip)) {
+ list($ip, $scope) = explode("%", $ip);
+ if (gethostbyaddr($ip) <> "" and gethostbyaddr($ip) <> $ip) {
+ return gethostbyaddr($ip);
+ } else {
+ return "";
+ }
+ }
+}
+
+// Resolve hostnames and replace Z_ with "". The intention
+// is to sort the list by hostnames, alpha and then the non
+// resolvable addresses will appear last in the list.
+foreach ($data as &$entry) {
+ $dns = trim(_getHostName($entry['mac'], $entry['ipv6']));
+ if (trim($dns)) {
+ $entry['dnsresolve'] = "$dns";
+ } else {
+ $entry['dnsresolve'] = "Z_ ";
+ }
+}
+
+// Sort the data alpha first
+$data = msort($data, "dnsresolve");
+
+// Load MAC-Manufacturer table
+$mac_man = load_mac_manufacturer_table();
+
+$pgtitle = array(gettext("Diagnostics"), gettext("NDP Table"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+
+<div id="loading">
+ <img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /><?= gettext("Loading, please wait..."); ?>
+ <p>&nbsp;</p>
+</div>
+
+<?php
+
+// Flush buffers out to client so that they see Loading, please wait....
+for ($i = 0; $i < ob_get_level(); $i++) {
+ ob_end_flush();
+}
+ob_implicit_flush(1);
+
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag ndp">
+ <tr>
+ <td>
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="tabcont">
+ <tr>
+ <td class="listhdrr"><?= gettext("IPv6 address"); ?></td>
+ <td class="listhdrr"><?= gettext("MAC address"); ?></td>
+ <td class="listhdrr"><?= gettext("Hostname"); ?></td>
+ <td class="listhdr"><?= gettext("Interface"); ?></td>
+ <td class="list"></td>
+ </tr>
+ <?php foreach ($data as $entry): ?>
+ <tr>
+ <td class="listlr"><?=$entry['ipv6'];?></td>
+ <td class="listr">
+ <?php
+ $mac=trim($entry['mac']);
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
+ print $mac;
+ if (isset($mac_man[$mac_hi])) {
+ print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>";
+ }
+ ?>
+ </td>
+ <td class="listr">
+ <?php
+ echo "&nbsp;". str_replace("Z_ ", "", $entry['dnsresolve']);
+ ?>
+ </td>
+ <td class="listr">
+ <?php
+ if (isset($hwif[$entry['interface']])) {
+ echo $hwif[$entry['interface']];
+ } else {
+ echo $entry['interface'];
+ }
+ ?>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<?php include("fend.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+ jQuery('#loading').html('');
+//]]>
+</script>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_packet_capture.php b/src/usr/local/www/diag_packet_capture.php
new file mode 100644
index 0000000..14be5d1
--- /dev/null
+++ b/src/usr/local/www/diag_packet_capture.php
@@ -0,0 +1,485 @@
+<?php
+/*
+ diag_packet_capture.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /bin/ps /usr/bin/grep /usr/sbin/tcpdump
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-packetcapture
+##|*NAME=Diagnostics: Packet Capture page
+##|*DESCR=Allow access to the 'Diagnostics: Packet Capture' page.
+##|*MATCH=diag_packet_capture.php*
+##|-PRIV
+
+$allowautocomplete = true;
+
+function fixup_host_logic($value) {
+ return str_replace(array(" ", ",", "+", "|", "!"), array("", "and ", "and ", "or ", "not "), $value);
+}
+function strip_host_logic($value) {
+ return str_replace(array(" ", ",", "+", "|", "!"), array("", "", "", "", ""), $value);
+}
+function get_host_boolean($value, $host) {
+ $value = str_replace(array("!", $host), array("", ""), $value);
+ $andor = "";
+ switch (trim($value)) {
+ case "|":
+ $andor = "or ";
+ break;
+ case ",":
+ case "+":
+ $andor = "and ";
+ break;
+ }
+ return $andor;
+}
+function has_not($value) {
+ return strpos($value, '!') !== false;
+}
+function fixup_not($value) {
+ return str_replace("!", "not ", $value);
+}
+function strip_not($value) {
+ return ltrim(trim($value), '!');
+}
+
+function fixup_host($value, $position) {
+ $host = strip_host_logic($value);
+ $not = has_not($value) ? "not " : "";
+ $andor = ($position > 0) ? get_host_boolean($value, $host) : "";
+ if (is_ipaddr($host)) {
+ return "{$andor}host {$not}" . $host;
+ } elseif (is_subnet($host)) {
+ return "{$andor}net {$not}" . $host;
+ } else {
+ return "";
+ }
+}
+
+if ($_POST['downloadbtn'] == gettext("Download Capture")) {
+ $nocsrf = true;
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Packet Capture"));
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+
+$fp = "/root/";
+$fn = "packetcapture.cap";
+$snaplen = 0;//default packet length
+$count = 100;//default number of packets to capture
+
+$fams = array('ip', 'ip6');
+$protos = array('icmp', 'icmp6', 'tcp', 'udp', 'arp', 'carp', 'esp',
+ '!icmp', '!icmp6', '!tcp', '!udp', '!arp', '!carp', '!esp');
+
+$input_errors = array();
+
+$interfaces = get_configured_interface_with_descr();
+if (isset($config['ipsec']['enable'])) {
+ $interfaces['ipsec'] = "IPsec";
+}
+foreach (array('server', 'client') as $mode) {
+ if (is_array($config['openvpn']["openvpn-{$mode}"])) {
+ foreach ($config['openvpn']["openvpn-{$mode}"] as $id => $setting) {
+ if (!isset($setting['disable'])) {
+ $interfaces['ovpn' . substr($mode, 0, 1) . $setting['vpnid']] = gettext("OpenVPN") . " ".$mode.": ".htmlspecialchars($setting['description']);
+ }
+ }
+ }
+}
+
+if ($_POST) {
+ $host = $_POST['host'];
+ $selectedif = $_POST['interface'];
+ $count = $_POST['count'];
+ $snaplen = $_POST['snaplen'];
+ $port = $_POST['port'];
+ $detail = $_POST['detail'];
+ $fam = $_POST['fam'];
+ $proto = $_POST['proto'];
+
+ if (!array_key_exists($selectedif, $interfaces)) {
+ $input_errors[] = gettext("Invalid interface.");
+ }
+ if ($fam !== "" && $fam !== "ip" && $fam !== "ip6") {
+ $input_errors[] = gettext("Invalid address family.");
+ }
+ if ($proto !== "" && !in_array(strip_not($proto), $protos)) {
+ $input_errors[] = gettext("Invalid protocol.");
+ }
+
+ if ($host != "") {
+ $host_string = str_replace(array(" ", "|", ","), array("", "#|", "#+"), $host);
+ if (strpos($host_string, '#') === false) {
+ $hosts = array($host);
+ } else {
+ $hosts = explode('#', $host_string);
+ }
+ foreach ($hosts as $h) {
+ if (!is_subnet(strip_host_logic($h)) && !is_ipaddr(strip_host_logic($h))) {
+ $input_errors[] = sprintf(gettext("A valid IP address or CIDR block must be specified. [%s]"), $h);
+ }
+ }
+ }
+ if ($port != "") {
+ if (!is_port(strip_not($port))) {
+ $input_errors[] = gettext("Invalid value specified for port.");
+ }
+ }
+ if ($snaplen == "") {
+ $snaplen = 0;
+ } else {
+ if (!is_numeric($snaplen) || $snaplen < 0) {
+ $input_errors[] = gettext("Invalid value specified for packet length.");
+ }
+ }
+ if ($count == "") {
+ $count = 0;
+ } else {
+ if (!is_numeric($count) || $count < 0) {
+ $input_errors[] = gettext("Invalid value specified for packet count.");
+ }
+ }
+
+ if (!count($input_errors)) {
+ $do_tcpdump = true;
+
+ conf_mount_rw();
+
+ if ($_POST['promiscuous']) {
+ //if promiscuous mode is checked
+ $disablepromiscuous = "";
+ } else {
+ //if promiscuous mode is unchecked
+ $disablepromiscuous = "-p";
+ }
+
+ if ($_POST['dnsquery']) {
+ //if dns lookup is checked
+ $disabledns = "";
+ } else {
+ //if dns lookup is unchecked
+ $disabledns = "-n";
+ }
+
+ if ($_POST['startbtn'] != "") {
+ $action = gettext("Start");
+
+ //delete previous packet capture if it exists
+ if (file_exists($fp.$fn)) {
+ unlink ($fp.$fn);
+ }
+
+ } elseif ($_POST['stopbtn'] != "") {
+ $action = gettext("Stop");
+ $processes_running = trim(shell_exec("/bin/ps axw -O pid= | /usr/bin/grep tcpdump | /usr/bin/grep {$fn} | /usr/bin/egrep -v '(pflog|grep)'"));
+
+ //explode processes into an array, (delimiter is new line)
+ $processes_running_array = explode("\n", $processes_running);
+
+ //kill each of the packetcapture processes
+ foreach ($processes_running_array as $process) {
+ $process_id_pos = strpos($process, ' ');
+ $process_id = substr($process, 0, $process_id_pos);
+ exec("kill $process_id");
+ }
+
+ } elseif ($_POST['downloadbtn'] != "") {
+ //download file
+ $fs = filesize($fp.$fn);
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename=$fn");
+ header("Content-Length: $fs");
+ readfile($fp.$fn);
+ exit;
+ }
+ }
+} else {
+ $do_tcpdump = false;
+}
+
+include("head.inc"); ?>
+
+<body link="#000000" vlink="#0000CC" alink="#0000CC">
+
+<?php
+include("fbegin.inc");
+?>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag packet capture">
+ <tr><td>
+ <form action="diag_packet_capture.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="table">
+ <tr>
+ <td colspan="3" valign="top" class="listtopic"><?=gettext("Packet capture");?></td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
+ <td width="32%" class="vtable">
+ <select name="interface">
+ <?php foreach ($interfaces as $iface => $ifacename): ?>
+ <option value="<?=$iface;?>" <?php if ($selectedif == $iface) echo "selected=\"selected\""; ?>>
+ <?php echo $ifacename;?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br /><?=gettext("Select the interface on which to capture traffic.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Promiscuous");?></td>
+ <td width="51%" class="vtable">
+ <input name="promiscuous" type="checkbox"<?php if ($_POST['promiscuous']) echo " checked=\"checked\""; ?> />
+ <br /><?=gettext("If checked, the");?> <a target="_blank" href="http://www.freebsd.org/cgi/man.cgi?query=tcpdump&amp;apropos=0&amp;sektion=0&amp;manpath=FreeBSD+8.3-stable&amp;arch=default&amp;format=html"><?= gettext("packet capture")?></a> <?= gettext("will be performed using promiscuous mode.");?>
+ <br /><b><?=gettext("Note");?>: </b><?=gettext("Some network adapters do not support or work well in promiscuous mode.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Address Family");?></td>
+ <td colspan="2" width="83%" class="vtable">
+ <select name="fam">
+ <option value="">Any</option>
+ <option value="ip" <?php if ($fam == "ip") echo "selected=\"selected\""; ?>>IPv4 Only</option>
+ <option value="ip6" <?php if ($fam == "ip6") echo "selected=\"selected\""; ?>>IPv6 Only</option>
+ </select>
+ <br /><?=gettext("Select the type of traffic to be captured, either Any, IPv4 only or IPv6 only.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
+ <td colspan="2" width="83%" class="vtable">
+ <select name="proto">
+ <option value="">Any</option>
+ <option value="icmp" <?php if ($proto == "icmp") echo "selected=\"selected\""; ?>>ICMP</option>
+ <option value="!icmp" <?php if ($proto == "!icmp") echo "selected=\"selected\""; ?>>Exclude ICMP</option>
+ <option value="icmp6" <?php if ($proto == "icmp6") echo "selected=\"selected\""; ?>>ICMPv6</option>
+ <option value="!icmp6" <?php if ($proto == "!icmp6") echo "selected=\"selected\""; ?>>Exclude ICMPv6</option>
+ <option value="tcp" <?php if ($proto == "tcp") echo "selected=\"selected\""; ?>>TCP</option>
+ <option value="!tcp" <?php if ($proto == "!tcp") echo "selected=\"selected\""; ?>>Exclude TCP</option>
+ <option value="udp" <?php if ($proto == "udp") echo "selected=\"selected\""; ?>>UDP</option>
+ <option value="!udp" <?php if ($proto == "!udp") echo "selected=\"selected\""; ?>>Exclude UDP</option>
+ <option value="arp" <?php if ($proto == "arp") echo "selected=\"selected\""; ?>>ARP</option>
+ <option value="!arp" <?php if ($proto == "!arp") echo "selected=\"selected\""; ?>>Exclude ARP</option>
+ <option value="carp" <?php if ($proto == "carp") echo "selected=\"selected\""; ?>>CARP (VRRP)</option>
+ <option value="!carp" <?php if ($proto == "!carp") echo "selected=\"selected\""; ?>>Exclude CARP (VRRP)</option>
+ <option value="esp" <?php if ($proto == "esp") echo "selected=\"selected\""; ?>>ESP</option>
+ </select>
+ <br /><?=gettext("Select the protocol to capture, or Any.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Host Address");?></td>
+ <td colspan="2" width="83%" class="vtable">
+ <input name="host" class="formfld host" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
+ <br /><?=gettext("This value is either the Source or Destination IP address or subnet in CIDR notation. The packet capture will look for this address in either field.");?>
+ <br /><?=gettext("Matching can be negated by preceding the value with \"!\". Multiple IP addresses or CIDR subnets may be specified. Comma (\",\") separated values perform a boolean \"and\". Separating with a pipe (\"|\") performs a boolean \"or\".");?>
+ <br /><?=gettext("If you leave this field blank, all packets on the specified interface will be captured.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Port");?></td>
+ <td colspan="2" width="83%" class="vtable">
+ <input name="port" class="formfld unknown" id="port" size="5" value="<?=htmlspecialchars($port);?>" />
+ <br /><?=gettext("The port can be either the source or destination port. The packet capture will look for this port in either field.");?>
+ <br /><?=gettext("Leave blank if you do not want to filter by port.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Packet Length");?></td>
+ <td colspan="2" width="83%" class="vtable">
+ <input name="snaplen" class="formfld unknown" id="snaplen" size="5" value="<?=htmlspecialchars($snaplen);?>" />
+ <br /><?=gettext("The Packet length is the number of bytes of each packet that will be captured. Default value is 0, which will capture the entire frame regardless of its size.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Count");?></td>
+ <td colspan="2" width="83%" class="vtable">
+ <input name="count" class="formfld unknown" id="count" size="5" value="<?=htmlspecialchars($count);?>" />
+ <br /><?=gettext("This is the number of packets the packet capture will grab. Default value is 100.") . "<br />" . gettext("Enter 0 (zero) for no count limit.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Level of Detail");?></td>
+ <td colspan="2" width="83%" class="vtable">
+ <select name="detail" class="formselect" id="detail" size="1">
+ <option value="normal" <?php if ($detail == "normal") echo "selected=\"selected\""; ?>><?=gettext("Normal");?></option>
+ <option value="medium" <?php if ($detail == "medium") echo "selected=\"selected\""; ?>><?=gettext("Medium");?></option>
+ <option value="high" <?php if ($detail == "high") echo "selected=\"selected\""; ?>><?=gettext("High");?></option>
+ <option value="full" <?php if ($detail == "full") echo "selected=\"selected\""; ?>><?=gettext("Full");?></option>
+ </select>
+ <br />
+ <?=gettext("This is the level of detail that will be displayed after hitting 'Stop' when the packets have been captured.") . "<br /><b>" .
+ gettext("Note:") . "</b> " .
+ gettext("This option does not affect the level of detail when downloading the packet capture.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top" class="vncellreq"><?=gettext("Reverse DNS Lookup");?></td>
+ <td colspan="2" width="83%" class="vtable">
+ <input name="dnsquery" type="checkbox" <?php if ($_POST['dnsquery']) echo " checked=\"checked\""; ?> />
+ <br /><?=gettext("This check box will cause the packet capture to perform a reverse DNS lookup associated with all IP addresses.");?>
+ <br /><b><?=gettext("Note");?>: </b><?=gettext("This option can cause delays for large packet captures.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="17%" valign="top">&nbsp;</td>
+ <td colspan="2" width="83%">
+<?php
+
+ /* check to see if packet capture tcpdump is already running */
+ $processcheck = (trim(shell_exec("/bin/ps axw -O pid= | /usr/bin/grep tcpdump | /usr/bin/grep {$fn} | /usr/bin/egrep -v '(pflog|grep)'")));
+
+ if ($processcheck != "") {
+ $processisrunning = true;
+ } else {
+ $processisrunning = false;
+ }
+
+ if (($action == gettext("Stop") or $action == "") and $processisrunning != true) {
+ echo "<input type=\"submit\" name=\"startbtn\" value=\"" . gettext("Start") . "\" />&nbsp;";
+ } else {
+ echo "<input type=\"submit\" name=\"stopbtn\" value=\"" . gettext("Stop") . "\" />&nbsp;";
+ }
+ if (file_exists($fp.$fn) and $processisrunning != true) {
+ echo "<input type=\"submit\" name=\"viewbtn\" value=\"" . gettext("View Capture") . "\" />&nbsp;";
+ echo "<input type=\"submit\" name=\"downloadbtn\" value=\"" . gettext("Download Capture") . "\" />";
+ echo "<br />" . gettext("The packet capture file was last updated:") . " " . date("F jS, Y g:i:s a.", filemtime($fp.$fn));
+ }
+?>
+ </td>
+ </tr>
+ </table>
+ </form>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="results">
+ <tr>
+ <td valign="top" colspan="2">
+<?php
+ echo "<font face=\"terminal\" size=\"2\">";
+ if ($processisrunning == true) {
+ echo("<strong>" . gettext("Packet Capture is running.") . "</strong><br />");
+ }
+
+ if ($do_tcpdump) {
+ $matches = array();
+
+ if (in_array($fam, $fams)) {
+ $matches[] = $fam;
+ }
+
+ if (in_array($proto, $protos)) {
+ $matches[] = fixup_not($proto);
+ }
+
+ if ($port != "") {
+ $matches[] = "port ".fixup_not($port);
+ }
+
+ if ($host != "") {
+ $hostmatch = "";
+ $hostcount = 0;
+ foreach ($hosts as $h) {
+ $h = fixup_host($h, $hostcount++);
+ if (!empty($h)) {
+ $hostmatch .= " " . $h;
+ }
+ }
+ if (!empty($hostmatch)) {
+ $matches[] = "({$hostmatch})";
+ }
+ }
+
+ if ($count != "0") {
+ $searchcount = "-c " . $count;
+ } else {
+ $searchcount = "";
+ }
+
+ $selectedif = convert_friendly_interface_to_real_interface_name($selectedif);
+
+ if ($action == gettext("Start")) {
+ $matchstr = implode($matches, " and ");
+ echo("<strong>" . gettext("Packet Capture is running.") . "</strong><br />");
+ $cmd = "/usr/sbin/tcpdump -i {$selectedif} {$disablepromiscuous} {$searchcount} -s {$snaplen} -w {$fp}{$fn} " . escapeshellarg($matchstr);
+ // Debug
+ //echo $cmd;
+ mwexec_bg ($cmd);
+ } else {
+ //action = stop
+ echo("<strong>" . gettext("Packet Capture stopped.") . "<br /><br />" . gettext("Packets Captured:") . "</strong><br />");
+?>
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function() {
+ document.getElementById("packetsCaptured").wrap='off';
+ }
+ //]]>
+ </script>
+ <textarea id="packetsCaptured" style="width:98%" name="code" rows="15" cols="66" readonly="readonly">
+<?php
+ $detail_args = "";
+ switch ($detail) {
+ case "full":
+ $detail_args = "-vv -e";
+ break;
+ case "high":
+ $detail_args = "-vv";
+ break;
+ case "medium":
+ $detail_args = "-v";
+ break;
+ case "normal":
+ default:
+ $detail_args = "-q";
+ break;
+ }
+ system("/usr/sbin/tcpdump {$disabledns} {$detail_args} -r {$fp}{$fn}");
+
+ conf_mount_ro();
+?>
+ </textarea>
+<?php
+ }
+ }
+?>
+ &nbsp;</font>
+ </td>
+ </tr>
+ </table>
+ </td></tr>
+</table>
+
+<?php
+include("fend.inc");
+?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_patterns.php b/src/usr/local/www/diag_patterns.php
new file mode 100644
index 0000000..1c3528d
--- /dev/null
+++ b/src/usr/local/www/diag_patterns.php
@@ -0,0 +1,97 @@
+<?php
+/* $Id$ */
+/*
+ Exec+ v1.02-000 - Copyright 2001-2003, All rights reserved
+ Created by André Ribeiro and Hélder Pereira
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: shaper
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-patters
+##|*NAME=Diagnostics: Patterns page
+##|*DESCR=Allow access to the 'Diagnostics: Patterns' page.
+##|*MATCH=patterns.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+//Move the upload file to /usr/local/share/protocols (is_uploaded_file must use tmp_name as argument)
+if (($_POST['submit'] == gettext("Upload Pattern file")) && is_uploaded_file($_FILES['ulfile']['tmp_name'])) {
+ if (fileExtension($_FILES['ulfile']['name'])) {
+ if (!is_array($config['l7shaper']['custom_pat'])) {
+ $config['l7shaper']['custom_pat'] = array();
+ }
+
+ $config['l7shaper']['custom_pat'][$_FILES['ulfile']['name']] = base64_encode(file_get_contents($_FILES['ulfile']['tmp_name']));
+ write_config(sprintf(gettext("Added custom l7 pattern %s"), $_FILES['ulfile']['name']));
+ move_uploaded_file($_FILES['ulfile']['tmp_name'], "/usr/local/share/protocols/" . $_FILES['ulfile']['name']);
+ $ulmsg = gettext("Uploaded file to") . " /usr/local/share/protocols/" . htmlentities($_FILES['ulfile']['name']);
+ } else {
+ $ulmsg = gettext("Warning: You must upload a file with .pat extension.");
+ }
+}
+
+//Check if file has correct extension (.pat)
+function fileExtension($nameFile) {
+ $format = substr($nameFile, -4);
+ return ($format == ".pat");
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Add layer7 pattern"));
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($ulmsg) echo "<p class=\"red\"><strong>" . $ulmsg . "</strong></p>\n"; ?>
+<div id="mainarea">
+<form action="diag_patterns.php" method="post" enctype="multipart/form-data" name="frmPattern">
+<table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="upload pattern">
+ <tr>
+ <td colspan="4" valign="top" class="listtopic"><?=gettext("Upload layer7 pattern file");?></td>
+ </tr>
+ <tr>
+ <td align="right"><strong><?=gettext("File to upload:");?></strong></td>
+ <td valign="top" class="label">
+ <input name="ulfile" type="file" class="formfld file" id="ulfile" />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">&nbsp;&nbsp;&nbsp;</td>
+ <td valign="top" class="label">
+ <input name="submit" type="submit" class="button" id="upload" value="<?=gettext("Upload Pattern file");?>" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+</table>
+</form>
+</div>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_pf_info.php b/src/usr/local/www/diag_pf_info.php
new file mode 100644
index 0000000..369c0f4
--- /dev/null
+++ b/src/usr/local/www/diag_pf_info.php
@@ -0,0 +1,117 @@
+<?php
+/* $Id$ */
+/*
+ diag_pf_info.php
+ Copyright (C) 2010 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/top
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-pf-info
+##|*NAME=Diagnostics: pfInfo
+##|*DESCR=Allows access to the 'Diagnostics: pfInfo' page
+##|*MATCH=diag_pf_info.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$pgtitle = gettext("Diagnostics: pfInfo");
+
+if ($_REQUEST['getactivity']) {
+ $text = `/sbin/pfctl -vvsi`;
+ $text .= "<p/>";
+ $text .= `/sbin/pfctl -vvsm`;
+ $text .= "<p/>";
+ $text .= `/sbin/pfctl -vvst`;
+ $text .= "<p/>";
+ $text .= `/sbin/pfctl -vvsI`;
+ echo $text;
+ exit;
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+jQuery(document).ready(function() {setTimeout('getpfinfo()', 5000);});
+//<![CDATA[
+ function getpfinfo() {
+ jQuery.ajax({
+ type: "POST",
+ url: "/diag_pf_info.php",
+ data: 'getactivity=yes',
+ async: false,
+ complete: activitycallback
+ });
+ }
+ function activitycallback(transport) {
+ jQuery('#pfactivitydiv').html('<font face="Courier" size="2"><pre style="text-align:left;">' + transport.responseText + '<\/pre><\/font>');
+ setTimeout('getpfinfo()', 2000);
+ }
+//]]>
+</script>
+<div id="maincontent">
+<?php
+ if ($savemsg) {
+ echo "<div id=\"savemsg\">";
+ print_info_box($savemsg);
+ echo "</div>";
+ }
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag pf info">
+ <tr>
+ <td>
+ <table id="backuptable" class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
+ <tr>
+ <td align="center">
+ <table summary="results">
+ <tr>
+ <td>
+ <div id="pfactivitydiv">
+ <?=gettext("Gathering PF information, please wait...");?>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</div>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_ping.php b/src/usr/local/www/diag_ping.php
new file mode 100644
index 0000000..102b097
--- /dev/null
+++ b/src/usr/local/www/diag_ping.php
@@ -0,0 +1,202 @@
+<?php
+/*
+ diag_ping.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2005 Bob Zoller (bob@kludgebox.com) and Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ping /sbin/ping6
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-ping
+##|*NAME=Diagnostics: Ping page
+##|*DESCR=Allow access to the 'Diagnostics: Ping' page.
+##|*MATCH=diag_ping.php*
+##|-PRIV
+
+$allowautocomplete = true;
+$pgtitle = array(gettext("Diagnostics"), gettext("Ping"));
+require_once("guiconfig.inc");
+
+define('MAX_COUNT', 10);
+define('DEFAULT_COUNT', 3);
+
+if ($_POST || $_REQUEST['host']) {
+ unset($input_errors);
+ unset($do_ping);
+
+ /* input validation */
+ $reqdfields = explode(" ", "host count");
+ $reqdfieldsn = array(gettext("Host"), gettext("Count"));
+ do_input_validation($_REQUEST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_REQUEST['count'] < 1) || ($_REQUEST['count'] > MAX_COUNT)) {
+ $input_errors[] = sprintf(gettext("Count must be between 1 and %s"), MAX_COUNT);
+ }
+
+ $host = trim($_REQUEST['host']);
+ $ipproto = $_REQUEST['ipproto'];
+ if (($ipproto == "ipv4") && is_ipaddrv6($host)) {
+ $input_errors[] = gettext("When using IPv4, the target host must be an IPv4 address or hostname.");
+ }
+ if (($ipproto == "ipv6") && is_ipaddrv4($host)) {
+ $input_errors[] = gettext("When using IPv6, the target host must be an IPv6 address or hostname.");
+ }
+
+ if (!$input_errors) {
+ $do_ping = true;
+ $sourceip = $_REQUEST['sourceip'];
+ $count = $_POST['count'];
+ if (preg_match('/[^0-9]/', $count)) {
+ $count = DEFAULT_COUNT;
+ }
+ }
+}
+if (!isset($do_ping)) {
+ $do_ping = false;
+ $host = '';
+ $count = DEFAULT_COUNT;
+}
+
+include("head.inc"); ?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ping">
+<tr><td>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="diag_ping.php" method="post" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Ping"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Host"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="host" type="text" class="formfld unknown" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IP Protocol"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="ipproto" class="formselect">
+ <option value="ipv4" <?php if ($ipproto == "ipv4") echo "selected=\"selected\"" ?>>IPv4</option>
+ <option value="ipv6" <?php if ($ipproto == "ipv6") echo "selected=\"selected\"" ?>>IPv6</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Source Address"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="sourceip" class="formselect">
+ <option value="">Default</option>
+ <?php $sourceips = get_possible_traffic_source_addresses(true);
+ foreach ($sourceips as $sipvalue => $sipname):
+ $selected = "";
+ if (!link_interface_to_bridge($sipvalue) && ($sipvalue == $sourceip)) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$sipvalue;?>" <?=$selected;?>>
+ <?=htmlspecialchars($sipname);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?= gettext("Count"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="count" class="formfld" id="count">
+ <?php for ($i = 1; $i <= MAX_COUNT; $i++): ?>
+ <option value="<?=$i;?>" <?php if ($i == $count) echo "selected=\"selected\""; ?>><?=$i;?></option>
+ <?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Ping"); ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" colspan="2">
+ <?php if ($do_ping) {
+ echo "<font face=\"terminal\" size=\"2\">";
+ echo "<strong>" . gettext("Ping output") . ":</strong><br />";
+ ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function() {
+ document.getElementById("pingCaptured").wrap='off';
+ }
+ //]]>
+ </script>
+ <?php
+ echo "<textarea id=\"pingCaptured\" style=\"width:98%\" name=\"code\" rows=\"15\" cols=\"66\" readonly=\"readonly\">";
+ $ifscope = '';
+ $command = "/sbin/ping";
+ if ($ipproto == "ipv6") {
+ $command .= "6";
+ $ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ipv6($sourceip);
+ if (is_linklocal($ifaddr)) {
+ $ifscope = get_ll_scope($ifaddr);
+ }
+ } else {
+ $ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ip($sourceip);
+ }
+ if ($ifaddr && (is_ipaddr($host) || is_hostname($host))) {
+ $srcip = "-S" . escapeshellarg($ifaddr);
+ if (is_linklocal($host) && !strstr($host, "%") && !empty($ifscope)) {
+ $host .= "%{$ifscope}";
+ }
+ }
+
+ $cmd = "{$command} {$srcip} -c" . escapeshellarg($count) . " " . escapeshellarg($host);
+ //echo "Ping command: {$cmd}\n";
+ system($cmd);
+ echo('</textarea>&nbsp;</font>');
+ }
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">&nbsp;</td>
+ </tr>
+</table>
+</form>
+</td></tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_pkglogs.php b/src/usr/local/www/diag_pkglogs.php
new file mode 100755
index 0000000..6575c48
--- /dev/null
+++ b/src/usr/local/www/diag_pkglogs.php
@@ -0,0 +1,147 @@
+<?php
+/*
+ $Id$
+
+ diag_pkglogs.php
+ Copyright (C) 2005 Colin Smith
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ <logging>
+ <logtab>arpwatch</logtab>
+ <grepfor>arpwatch</logtab>
+ </logging>
+
+ <invertgrep/>
+ <logfile>/var/log/arpwatch.log</logfile>
+
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/netstat
+ pfSense_MODULE: pkgs
+*/
+
+##|+PRIV
+##|*IDENT=page-status-packagelogs
+##|*NAME=Status: Package logs page
+##|*DESCR=Allow access to the 'Status: Package logs' page.
+##|*MATCH=diag_pkglogs.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("pkg-utils.inc");
+
+if (!($nentries = $config['syslog']['nentries'])) {
+ $nentries = 50;
+}
+
+//if ($_POST['clear'])
+// clear_log_file($logfile);
+
+$i = 0;
+$pkgwithlogging = false;
+$apkg = $_GET['pkg'];
+if (!$apkg) { // If we aren't looking for a specific package, locate the first package that handles logging.
+ if ($config['installedpackages']['package'] <> "") {
+ foreach ($config['installedpackages']['package'] as $package) {
+ if (is_array($package['logging'])) {
+ $pkgwithlogging = true;
+ $apkg = $package['name'];
+ $apkgid = $i;
+ break;
+ }
+ $i++;
+ }
+ }
+} elseif ($apkg) {
+ $apkgid = get_package_id($apkg);
+ if ($apkgid != -1) {
+ $pkgwithlogging = true;
+ $i = $apkgid;
+ }
+}
+
+$pgtitle = array(gettext("Status"), gettext("Package logs"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+ <?php
+ if ($pkgwithlogging == false) {
+ print_info_box(gettext("No packages with logging facilities are currently installed."));
+ echo '</ul></td></tr></table>';
+ include("fend.inc");
+ exit;
+ }
+ $tab_array = array();
+ foreach ($config['installedpackages']['package'] as $package) {
+ if (is_array($package['logging'])) {
+ if (!($logtab = $package['logging']['logtab'])) {
+ $logtab = $package['name'];
+ }
+ if ($apkg == $package['name']) {
+ $curtab = $logtab;
+ $tab_array[] = array(sprintf(gettext("%s"), $logtab), true, "diag_pkglogs.php?pkg=".$package['name']);
+ } else {
+ $tab_array[] = array(sprintf(gettext("%s"), $logtab), false, "diag_pkglogs.php?pkg=".$package['name']);
+ }
+ }
+ }
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td colspan="2" class="listtopic">
+ <?php printf(gettext('Last %1$s %2$s log entries'), $nentries, $curtab); ?>
+ </td>
+ </tr>
+ <?php
+ $package =& $config['installedpackages']['package'][$apkgid];
+ dump_clog($g['varlog_path'] . '/' . $package['logging']['logfilename'], $nentries);
+ ?>
+ </table>
+<!--
+<form action="diag_pkglogs.php" method="post">
+<input name="clear" type="submit" class="formbtn" value="Clear log">
+</form>
+-->
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_resetstate.php b/src/usr/local/www/diag_resetstate.php
new file mode 100644
index 0000000..07d3575
--- /dev/null
+++ b/src/usr/local/www/diag_resetstate.php
@@ -0,0 +1,143 @@
+<?php
+/* $Id$ */
+/*
+ diag_resetstate.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2009 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-resetstate
+##|*NAME=Diagnostics: Reset state page
+##|*DESCR=Allow access to the 'Diagnostics: Reset state' page.
+##|*MATCH=diag_resetstate.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter.inc");
+
+if ($_POST) {
+ $savemsg = "";
+ if ($_POST['statetable']) {
+ filter_flush_state_table();
+ if ($savemsg) {
+ $savemsg .= " ";
+ }
+ $savemsg .= gettext("The state table has been flushed successfully.");
+ }
+ if ($_POST['sourcetracking']) {
+ mwexec("/sbin/pfctl -F Sources");
+ if ($savemsg) {
+ $savemsg .= " <br />";
+ }
+ $savemsg .= gettext("The source tracking table has been flushed successfully.");
+ }
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Reset state"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form action="diag_resetstate.php" method="post" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="reset states">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("States"), false, "diag_dump_states.php");
+ if (isset($config['system']['lb_use_sticky'])) {
+ $tab_array[] = array(gettext("Source Tracking"), false, "diag_dump_states_sources.php");
+ }
+ $tab_array[] = array(gettext("Reset States"), true, "diag_resetstate.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable"> <p>
+ <input name="statetable" type="checkbox" id="statetable" value="yes" checked="checked" />
+ <strong><?= gettext("Firewall state table"); ?></strong><br />
+ <span class="vexpl"><br />
+ <?=gettext("Resetting the state tables will remove all entries from " .
+ "the corresponding tables. This means that all open connections " .
+ "will be broken and will have to be re-established. This " .
+ "may be necessary after making substantial changes to the " .
+ "firewall and/or NAT rules, especially if there are IP protocol " .
+ "mappings (e.g. for PPTP or IPv6) with open connections."); ?><br />
+ <br />
+ </span><span class="vexpl"><?=gettext("The firewall will normally leave " .
+ "the state tables intact when changing rules."); ?><br />
+ <br />
+ <?=gettext("NOTE: If you reset the firewall state table, the browser " .
+ "session may appear to be hung after clicking &quot;Reset&quot;. " .
+ "Simply refresh the page to continue."); ?></span></p>
+ </td>
+ </tr>
+ <?php if (isset($config['system']['lb_use_sticky'])): ?>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable"><p>
+ <input name="sourcetracking" type="checkbox" id="sourcetracking" value="yes" checked="checked" />
+ <strong><?= gettext("Firewall Source Tracking"); ?></strong><br />
+ <span class="vexpl"><br />
+ <?=gettext("Resetting the source tracking table will remove all source/destination associations. " .
+ "This means that the \"sticky\" source/destination association " .
+ "will be cleared for all clients."); ?><br />
+ <br />
+ </span><span class="vexpl"><?=gettext("This does not clear active connection states, only source tracking."); ?><br />
+ </p>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Reset"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_routes.php b/src/usr/local/www/diag_routes.php
new file mode 100644
index 0000000..ff2fe8d
--- /dev/null
+++ b/src/usr/local/www/diag_routes.php
@@ -0,0 +1,247 @@
+<?php
+
+/* $Id$ */
+/*
+ diag_routes.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2006 Fernando Lamos
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/netstat
+ pfSense_MODULE: routing
+*/
+##|+PRIV
+##|*IDENT=page-diagnostics-routingtables
+##|*NAME=Diagnostics: Routing tables page
+##|*DESCR=Allow access to the 'Diagnostics: Routing tables' page.
+##|*MATCH=diag_routes.php*
+##|-PRIV
+
+include('guiconfig.inc');
+
+if (isset($_REQUEST['isAjax'])) {
+ $netstat = "/usr/bin/netstat -rW";
+ if (isset($_REQUEST['IPv6'])) {
+ $netstat .= " -f inet6";
+ echo "IPv6\n";
+ } else {
+ $netstat .= " -f inet";
+ echo "IPv4\n";
+ }
+ if (!isset($_REQUEST['resolve'])) {
+ $netstat .= " -n";
+ }
+
+ if (!empty($_REQUEST['filter'])) {
+ $netstat .= " | /usr/bin/sed -e '1,3d; 5,\$ { /" . escapeshellarg(htmlspecialchars($_REQUEST['filter'])) . "/!d; };'";
+ } else {
+ $netstat .= " | /usr/bin/sed -e '1,3d'";
+ }
+
+ if (is_numeric($_REQUEST['limit']) && $_REQUEST['limit'] > 0) {
+ $netstat .= " | /usr/bin/head -n {$_REQUEST['limit']}";
+ }
+
+ echo htmlspecialchars_decode(shell_exec($netstat));
+
+ exit;
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Routing tables"));
+$shortcut_section = "routing";
+
+include('head.inc');
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+
+ function update_routes(section) {
+ var url = "diag_routes.php";
+ var limit = jQuery('#limit option:selected').text();
+ var filter = jQuery('#filter').val();
+ var params = "isAjax=true&limit=" + limit + "&filter=" + filter;
+ if (jQuery('#resolve').is(':checked')) {
+ params += "&resolve=true";
+ }
+ if (section == "IPv6") {
+ params += "&IPv6=true";
+ }
+ var myAjax = new Ajax.Request(
+ url,
+ {
+ method: 'post',
+ parameters: params,
+ onComplete: update_routes_callback
+ });
+ }
+
+ function update_routes_callback(transport) {
+ // First line contains section
+ var responseTextArr = transport.responseText.split("\n");
+ var section = responseTextArr.shift();
+ var tbody = '';
+ var field = '';
+ var elements = 8;
+ var tr_class = '';
+
+ var thead = '<tr><td class="listtopic" colspan="' + elements + '"><strong>' + section + '<\/strong><\/td><\/tr>' + "\n";
+ for (var i = 0; i < responseTextArr.length; i++) {
+ if (responseTextArr[i] == "") {
+ continue;
+ }
+ var tmp = '';
+ if (i == 0) {
+ tr_class = 'listhdrr';
+ tmp += '<tr class="sortableHeaderRowIdentifier">' + "\n";
+ } else {
+ tr_class = 'listlr';
+ tmp += '<tr>' + "\n";
+ }
+ var j = 0;
+ var entry = responseTextArr[i].split(" ");
+ for (var k = 0; k < entry.length; k++) {
+ if (entry[k] == "") {
+ continue;
+ }
+ if (i == 0 && j == (elements - 1)) {
+ tr_class = 'listhdr';
+ }
+ tmp += '<td class="' + tr_class + '">' + entry[k] + '<\/td>' + "\n";
+ if (i > 0) {
+ tr_class = 'listr';
+ }
+ j++;
+ }
+ // The 'Expire' field might be blank
+ if (j == (elements - 1)) {
+ tmp += '<td class="listr">&nbsp;<\/td>' + "\n";
+ }
+ tmp += '<\/tr>' + "\n";
+ if (i == 0) {
+ thead += tmp;
+ } else {
+ tbody += tmp;
+ }
+ }
+ jQuery('#' + section + ' > thead').html(thead);
+ jQuery('#' + section + ' > tbody').html(tbody);
+ }
+
+//]]>
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+
+ function update_all_routes() {
+ update_routes("IPv4");
+ update_routes("IPv6");
+ }
+
+ jQuery(document).ready(function() {setTimeout('update_all_routes()', 5000);});
+
+//]]>
+</script>
+
+<div id="mainarea">
+<form action="diag_routes.php" method="post">
+<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="diag routes">
+ <tr>
+ <td class="vncellreq" width="22%"><?=gettext("Name resolution");?></td>
+ <td class="vtable" width="78%">
+ <input type="checkbox" class="formfld" id="resolve" name="resolve" value="yes" <?php if ($_POST['resolve'] == 'yes') echo "checked=\"checked\""; ?> /><?=gettext("Enable");?>
+ <br />
+ <span class="expl"><?=gettext("Enable this to attempt to resolve names when displaying the tables.");?></span>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="vncellreq" width="22%"><?=gettext("Number of rows");?></td>
+ <td class="vtable" width="78%">
+ <select id="limit" name="limit">
+<?php
+ foreach (array("10", "50", "100", "200", "500", "1000", gettext("all")) as $item) {
+ echo "<option value=\"{$item}\" " . ($item == "100" ? "selected=\"selected\"" : "") . ">{$item}</option>\n";
+ }
+?>
+ </select>
+ <br />
+ <span class="expl"><?=gettext("Select how many rows to display.");?></span>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="vncellreq" width="22%"><?=gettext("Filter expression");?></td>
+ <td class="vtable" width="78%">
+ <input type="text" class="formfld search" name="filter" id="filter" />
+ <br />
+ <span class="expl"><?=gettext("Use a regular expression to filter IP address or hostnames.");?></span>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="vncellreq" width="22%">&nbsp;</td>
+ <td class="vtable" width="78%">
+ <input type="button" class="formbtn" name="update" onclick="update_all_routes();" value="<?=gettext("Update"); ?>" />
+ <br />
+ <br />
+ <span class="vexpl"><span class="red"><strong><?=gettext("Note:")?></strong></span> <?=gettext("By enabling name resolution, the query should take a bit longer. You can stop it at any time by clicking the Stop button in your browser.");?></span>
+ </td>
+ </tr>
+</table>
+</form>
+
+<table class="tabcont sortable" width="100%" cellspacing="0" cellpadding="6" border="0" id="IPv4" summary="ipv4 routes">
+ <thead>
+ <tr><td class="listtopic"><strong>IPv4</strong></td></tr>
+ </thead>
+ <tbody>
+ <tr><td class="listhdrr"><?=gettext("Gathering data, please wait...");?></td></tr>
+ </tbody>
+</table>
+<table class="tabcont sortable" width="100%" cellspacing="0" cellpadding="6" border="0" id="IPv6" summary="ipv6 routes">
+ <thead>
+ <tr><td class="listtopic"><strong>IPv6</strong></td></tr>
+ </thead>
+ <tbody>
+ <tr><td class="listhdrr"><?=gettext("Gathering data, please wait...");?></td></tr>
+ </tbody>
+</table>
+
+</div>
+
+<?php
+include('fend.inc');
+?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/diag_smart.php b/src/usr/local/www/diag_smart.php
new file mode 100644
index 0000000..1cc9161
--- /dev/null
+++ b/src/usr/local/www/diag_smart.php
@@ -0,0 +1,453 @@
+<?php
+/*
+ diag_smart.php
+ Part of pfSense
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved
+
+ Some modifications:
+ Copyright (C) 2010 - Jim Pingle
+
+ Copyright (C) 2006, Eric Friesen
+ All rights reserved
+
+*/
+
+require("guiconfig.inc");
+
+$pgtitle = array(gettext("Diagnostics"), gettext("S.M.A.R.T. Monitor Tools"));
+$smartctl = "/usr/local/sbin/smartctl";
+$smartd = "/usr/local/sbin/smartd";
+$start_script = "/usr/local/etc/rc.d/smartd.sh";
+
+$valid_test_types = array("offline", "short", "long", "conveyance");
+$valid_info_types = array("i", "H", "c", "A", "a");
+$valid_log_types = array("error", "selftest");
+
+$closehead = false;
+include("head.inc");
+?>
+
+<style type="text/css">
+/*<![CDATA[*/
+
+input {
+ font-family: courier new, courier;
+ font-weight: normal;
+ font-size: 9pt;
+}
+
+pre {
+ border: 2px solid #435370;
+ background: #F0F0F0;
+ padding: 1em;
+ font-family: courier new, courier;
+ white-space: pre;
+ line-height: 10pt;
+ font-size: 10pt;
+}
+
+.label {
+ font-family: tahoma, verdana, arial, helvetica;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.button {
+ font-family: tahoma, verdana, arial, helvetica;
+ font-weight: bold;
+ font-size: 11px;
+}
+
+/*]]>*/
+</style>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php
+include("fbegin.inc");
+
+// Highlights the words "PASSED", "FAILED", and "WARNING".
+function add_colors($string) {
+ // To add words keep arrays matched by numbers
+ $patterns[0] = '/PASSED/';
+ $patterns[1] = '/FAILED/';
+ $patterns[2] = '/Warning/';
+ $replacements[0] = '<b><font color="#00ff00">' . gettext("PASSED") . '</font></b>';
+ $replacements[1] = '<b><font color="#ff0000">' . gettext("FAILED") . '</font></b>';
+ $replacements[2] = '<font color="#ff0000">' . gettext("Warning") . '</font>';
+ ksort($patterns);
+ ksort($replacements);
+ return preg_replace($patterns, $replacements, $string);
+}
+
+// Edits smartd.conf file, adds or removes email for failed disk reporting
+function update_email($email) {
+ // Did they pass an email?
+ if (!empty($email)) {
+ // Put it in the smartd.conf file
+ shell_exec("/usr/bin/sed -i old 's/^DEVICESCAN.*/DEVICESCAN -H -m " . escapeshellarg($email) . "/' /usr/local/etc/smartd.conf");
+ } else {
+ // Remove email flags in smartd.conf
+ shell_exec("/usr/bin/sed -i old 's/^DEVICESCAN.*/DEVICESCAN/' /usr/local/etc/smartd.conf");
+ }
+}
+
+function smartmonctl($action) {
+ global $start_script;
+ shell_exec($start_script . escapeshellarg($action));
+}
+
+// What page, aka. action is being wanted
+// If they "get" a page but don't pass all arguments, smartctl will throw an error
+$action = (isset($_POST['action']) ? $_POST['action'] : $_GET['action']);
+$targetdev = basename($_POST['device']);
+if (!file_exists('/dev/' . $targetdev)) {
+ echo "Device does not exist, bailing.";
+ return;
+}
+switch ($action) {
+ // Testing devices
+ case 'test':
+ {
+ $test = $_POST['testType'];
+ if (!in_array($test, $valid_test_types)) {
+ echo "Invalid test type, bailing.";
+ return;
+ }
+ $output = add_colors(shell_exec($smartctl . " -t " . escapeshellarg($test) . " /dev/" . escapeshellarg($targetdev)));
+ echo '<pre>' . $output . '
+ <form action="diag_smart.php" method="post" name="abort">
+ <input type="hidden" name="device" value="' . $targetdev . '" />
+ <input type="hidden" name="action" value="abort" />
+ <input type="submit" name="submit" value="' . gettext("Abort") . '" />
+ </form>
+ </pre>';
+ break;
+ }
+
+ // Info on devices
+ case 'info':
+ {
+ $type = $_POST['type'];
+ if (!in_array($type, $valid_info_types)) {
+ echo "Invalid info type, bailing.";
+ return;
+ }
+ $output = add_colors(shell_exec($smartctl . " -" . escapeshellarg($type) . " /dev/" . escapeshellarg($targetdev)));
+ echo "<pre>$output</pre>";
+ break;
+ }
+
+ // View logs
+ case 'logs':
+ {
+ $type = $_POST['type'];
+ if (!in_array($type, $valid_log_types)) {
+ echo "Invalid log type, bailing.";
+ return;
+ }
+ $output = add_colors(shell_exec($smartctl . " -l " . escapeshellarg($type) . " /dev/" . escapeshellarg($targetdev)));
+ echo "<pre>$output</pre>";
+ break;
+ }
+
+ // Abort tests
+ case 'abort':
+ {
+ $output = shell_exec($smartctl . " -X /dev/" . escapeshellarg($targetdev));
+ echo "<pre>$output</pre>";
+ break;
+ }
+
+ // Config changes, users email in xml config and write changes to smartd.conf
+ case 'config':
+ {
+ if (isset($_POST['submit'])) {
+ // DOES NOT WORK YET...
+ if ($_POST['testemail']) {
+// FIXME shell_exec($smartd . " -M test -m " . $config['system']['smartmonemail']);
+ $savemsg = sprintf(gettext("Email sent to %s"), $config['system']['smartmonemail']);
+ smartmonctl("stop");
+ smartmonctl("start");
+ } else {
+ $config['system']['smartmonemail'] = $_POST['smartmonemail'];
+ write_config();
+
+ // Don't know what all this means, but it adds the config changed header when config is saved
+ $retval = 0;
+ config_lock();
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+ config_unlock();
+
+ if ($_POST['email']) {
+ // Write the changes to the smartd.conf file
+ update_email($_POST['smartmonemail']);
+ }
+
+ // Send sig HUP to smartd, rereads the config file
+ shell_exec("/usr/bin/killall -HUP smartd");
+ }
+ }
+ // Was the config changed? if so , print the message
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+ // Get users email from the xml file
+ $pconfig['smartmonemail'] = $config['system']['smartmonemail'];
+
+ ?>
+ <!-- Print the tabs across the top -->
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tabs">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Information/Tests"), false, $_SERVER['PHP_SELF'] . "?action=default");
+ $tab_array[1] = array(gettext("Config"), true, $_SERVER['PHP_SELF'] . "?action=config");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ </table>
+<!-- user email address -->
+ <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="config">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="e-mail">
+ <tbody>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Config"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Email Address"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="text" name="smartmonemail" value="<?=htmlspecialchars($pconfig['smartmonemail'])?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="action" value="config" />
+ <input type="hidden" name="email" value="true" />
+ <input type="submit" name="submit" value="<?=gettext("Save"); ?>" class="formbtn" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </form>
+
+<!-- test email -->
+ <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="config">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="test e-mail">
+ <tbody>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Test email"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <?php printf(gettext("Send test email to %s"), $config['system']['smartmonemail']); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="action" value="config" />
+ <input type="hidden" name="testemail" value="true" />
+ <input type="submit" name="submit" value="<?=gettext("Send"); ?>" class="formbtn" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </form>
+
+ <?php
+ break;
+ }
+
+ // Default page, prints the forms to view info, test, etc...
+ default:
+ {
+ $devs = get_smart_drive_list();
+ ?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="default page">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Information/Tests"), true, $_SERVER['PHP_SELF']);
+ //$tab_array[1] = array("Config", false, $_SERVER['PHP_SELF'] . "?action=config");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ </table>
+<!--INFO-->
+ <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="info">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="info">
+ <tbody>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Info"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Info type"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="radio" name="type" value="i" /><?=gettext("Info"); ?><br />
+ <input type="radio" name="type" value="H" checked="checked" /><?=gettext("Health"); ?><br />
+ <input type="radio" name="type" value="c" /><?=gettext("SMART Capabilities"); ?><br />
+ <input type="radio" name="type" value="A" /><?=gettext("Attributes"); ?><br />
+ <input type="radio" name="type" value="a" /><?=gettext("All"); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Device: /dev/"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="device">
+ <?php
+ foreach ($devs as $dev) {
+ echo "<option value=\"" . $dev . "\">" . $dev . "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="action" value="info" />
+ <input type="submit" name="submit" value="<?=gettext("View"); ?>" class="formbtn" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </form>
+<!--TESTS-->
+ <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="tests">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tests">
+ <tbody>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Perform Self-tests"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Test type"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="radio" name="testType" value="offline" /><?=gettext("Offline"); ?><br />
+ <input type="radio" name="testType" value="short" checked="checked" /><?=gettext("Short"); ?><br />
+ <input type="radio" name="testType" value="long" /><?=gettext("Long"); ?><br />
+ <input type="radio" name="testType" value="conveyance" /><?=gettext("Conveyance (ATA Disks Only)"); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Device: /dev/"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="device">
+ <?php
+ foreach ($devs as $dev) {
+ echo "<option value=\"" . $dev . "\">" . $dev . "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="action" value="test" />
+ <input type="submit" name="submit" value="<?=gettext("Test"); ?>" class="formbtn" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </form>
+<!--LOGS-->
+ <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="logs">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="logs">
+ <tbody>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("View Logs"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Log type"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="radio" name="type" value="error" checked="checked" /><?=gettext("Error"); ?><br />
+ <input type="radio" name="type" value="selftest" /><?=gettext("Self-test"); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Device: /dev/"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="device">
+ <?php
+ foreach ($devs as $dev) {
+ echo "<option value=\"" . $dev . "\">" . $dev . "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="action" value="logs" />
+ <input type="submit" name="submit" value="<?=gettext("View"); ?>" class="formbtn" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </form>
+<!--ABORT-->
+ <form action="<?= $_SERVER['PHP_SELF']?>" method="post" name="abort">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="abort">
+ <tbody>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Abort tests"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Device: /dev/"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="device">
+ <?php
+ foreach ($devs as $dev) {
+ echo "<option value=\"" . $dev . "\">" . $dev . "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="action" value="abort" />
+ <input type="submit" name="submit" value="<?=gettext("Abort"); ?>" class="formbtn" onclick="return confirm('<?=gettext("Do you really want to abort the test?"); ?>')" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </form>
+
+ <?php
+ break;
+ }
+}
+
+// print back button on pages
+if (isset($_POST['submit']) && $_POST['submit'] != "Save") {
+?>
+ <input type="button" class="formbtn" value="<?=gettext("Back");?>" onclick="window.location.href='<?=$_SERVER['PHP_SELF'];?>'" />
+<?php
+}
+?>
+<br />
+<?php
+if ($ulmsg) {
+ echo "<p><strong>" . $ulmsg . "</strong></p>\n";
+}
+?>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_sockets.php b/src/usr/local/www/diag_sockets.php
new file mode 100644
index 0000000..cdcfeb7
--- /dev/null
+++ b/src/usr/local/www/diag_sockets.php
@@ -0,0 +1,181 @@
+<?php
+
+/* $Id$ */
+/*
+ diag_sockets.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2012
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/sockstat
+*/
+##|+PRIV
+##|*IDENT=page-diagnostics-sockets
+##|*NAME=Diagnostics: Sockets page
+##|*DESCR=Allow access to the 'Diagnostics: Sockets' page.
+##|*MATCH=diag_sockets.php*
+##|-PRIV
+
+include('guiconfig.inc');
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Sockets"));
+
+include('head.inc');
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc");
+
+$showAll = isset($_GET['showAll']);
+$showAllText = $showAll ? "Show only listening sockets" : "Show all socket connections";
+$showAllOption = $showAll ? "" : "?showAll";
+
+?>
+<div id="mainarea">
+<table class="tabcont" width="100%" summary="diag sockets">
+ <tr>
+ <td>Information about listening sockets for both <a href="#IPv4">IPv4</a> and <a href="#IPv6">IPv6</a>.</td>
+ </tr>
+ <tr>
+ <td>For explanation about the meaning of the information listed for each socket click <a href="#about">here</a>.</td>
+ </tr>
+ <tr>
+ <td><input type="button" value="<?=$showAllText?>" onclick="window.location.href='diag_sockets.php<?=$showAllOption?>'"/>To show information about both listening and connected sockets click this.</td>
+ </tr>
+</table>
+
+<?php
+ if (isset($_GET['showAll'])) {
+ $internet4 = shell_exec('sockstat -4');
+ $internet6 = shell_exec('sockstat -6');
+ } else {
+ $internet4 = shell_exec('sockstat -4l');
+ $internet6 = shell_exec('sockstat -6l');
+ }
+ foreach (array(&$internet4, &$internet6) as $tabindex => $table) {
+ $elements = ($tabindex == 0 ? 7 : 7);
+ $name = ($tabindex == 0 ? 'IPv4' : 'IPv6');
+?>
+<a name="<?=$name;?>"></a>
+<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab">
+ <tr>
+ <td class="listtopic" colspan="<?=$elements?>"><strong><?=$name;?></strong></td>
+ </tr>
+ <tr>
+ <td>
+ <table class="tabcont sortable" id="sortabletable" width="100%" cellspacing="0" cellpadding="6" border="0" summary="results">
+ <?php
+ foreach (explode("\n", $table) as $i => $line) {
+ if ($i == 0) {
+ $class = 'listhdrr';
+ } else {
+ $class = 'listlr';
+ }
+
+ if (trim($line) == "") {
+ continue;
+ }
+ print("<tr id=\"$name$i\">\n");
+ $j = 0;
+ foreach (explode(' ', $line) as $entry) {
+ if ($entry == '' || $entry == "ADDRESS") {
+ continue;
+ }
+ if ($i == 0) {
+ print("<th class=\"$class\">$entry</th>\n");
+ } else {
+ print("<td class=\"$class\">$entry</td>\n");
+ }
+ if ($i > 0) {
+ $class = 'listr';
+ }
+ $j++;
+ }
+ print("</tr>\n");
+ }
+ ?>
+ </table>
+ </td>
+ </tr>
+</table>
+<?php
+ }
+?>
+
+<br />
+<a name="about"></a>
+<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="info">
+ <tr>
+ <td colspan="2" class="listtopic" >Socket information explanation</td>
+ </tr>
+ <tr>
+ <td colspan="2" class="listhdrr">
+This page show the output for the commands: "sockstat -4lL" and "sockstat -6lL".<br />
+Or in case of showing all sockets the output for: "sockstat -4" and "sockstat -6".<br />
+<br />
+The information listed for each socket is:
+ </td>
+ </tr>
+ <tr>
+ <td class="listlr">USER </td>
+ <td class="listr">The user who owns the socket.</td>
+ </tr>
+ <tr>
+ <td class="listlr">COMMAND</td>
+ <td class="listr">The command which holds the socket.</td>
+ </tr>
+ <tr>
+ <td class="listlr">PID</td>
+ <td class="listr">The process ID of the command which holds the socket.</td>
+ </tr>
+ <tr>
+ <td class="listlr">FD</td>
+ <td class="listr">The file descriptor number of the socket.</td>
+ </tr>
+ <tr>
+ <td class="listlr">PROTO</td>
+ <td class="listr">The transport protocol associated with the socket for Internet sockets, or the type of socket (stream or data-gram) for UNIX sockets.</td>
+ </tr>
+ <tr>
+ <td class="listlr">ADDRESS</td>
+ <td class="listr">(UNIX sockets only) For bound sockets, this is the file-name of the socket. For other sockets, it is the name, PID and file descriptor number of the peer, or ``(none)'' if the socket is neither bound nor connected.</td>
+ </tr>
+ <tr>
+ <td class="listlr">LOCAL ADDRESS</td>
+ <td class="listr">(Internet sockets only) The address the local end of the socket is bound to (see getsockname(2)).</td>
+ </tr>
+ <tr>
+ <td class="listlr">FOREIGN ADDRESS</td>
+ <td class="listr">(Internet sockets only) The address the foreign end of the socket is bound to (see getpeername(2)).</td>
+ </tr>
+</table>
+</div>
+<?php
+include('fend.inc');
+?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_states_summary.php b/src/usr/local/www/diag_states_summary.php
new file mode 100644
index 0000000..7aa91d6
--- /dev/null
+++ b/src/usr/local/www/diag_states_summary.php
@@ -0,0 +1,206 @@
+<?php
+/*
+ diag_states_summary.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2010-2014 Jim Pingle
+
+ Portions borrowed from diag_dump_states.php:
+ Copyright (C) 2005-2009 Scott Ullrich
+ Copyright (C) 2005 Colin Smith
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/pfctl
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-statessummary
+##|*NAME=Diagnostics: States Summary page
+##|*DESCR=Allow access to the 'Diagnostics: States Summary' page.
+##|*MATCH=diag_states_summary.php*
+##|-PRIV
+
+exec("/sbin/pfctl -s state", $states);
+
+$srcipinfo = array();
+$dstipinfo = array();
+$allipinfo = array();
+$pairipinfo = array();
+
+function addipinfo(&$iparr, $ip, $proto, $srcport, $dstport) {
+ $iparr[$ip]['seen']++;
+ $iparr[$ip]['protos'][$proto]['seen']++;
+ if (!empty($srcport)) {
+ $iparr[$ip]['protos'][$proto]['srcports'][$srcport]++;
+ }
+ if (!empty($dstport)) {
+ $iparr[$ip]['protos'][$proto]['dstports'][$dstport]++;
+ }
+}
+
+$row = 0;
+if (count($states) > 0) {
+ foreach ($states as $line) {
+ $line_split = preg_split("/\s+/", $line);
+ $iface = array_shift($line_split);
+ $proto = array_shift($line_split);
+ $state = array_pop($line_split);
+ $info = implode(" ", $line_split);
+
+ /* Handle NAT cases
+ Replaces an external IP + NAT by the internal IP */
+ if (strpos($info, ') ->') !== FALSE) {
+ /* Outbound NAT */
+ $info = preg_replace('/(\S+) \((\S+)\)/U', "$2", $info);
+ } elseif (strpos($info, ') <-') !== FALSE) {
+ /* Inbound NAT/Port Forward */
+ $info = preg_replace('/(\S+) \((\S+)\)/U', "$1", $info);
+ }
+
+ /* break up info and extract $srcip and $dstip */
+ $ends = preg_split("/\<?-\>?/", $info);
+
+ if (strpos($info, '->') === FALSE) {
+ $srcinfo = $ends[count($ends) - 1];
+ $dstinfo = $ends[0];
+ } else {
+ $srcinfo = $ends[0];
+ $dstinfo = $ends[count($ends) - 1];
+ }
+
+ /* Handle IPv6 */
+ $parts = explode(":", $srcinfo);
+ $partcount = count($parts);
+ if ($partcount <= 2) {
+ $srcip = trim($parts[0]);
+ $srcport = trim($parts[1]);
+ } else {
+ preg_match("/([0-9a-f:]+)(\[([0-9]+)\])?/i", $srcinfo, $matches);
+ $srcip = $matches[1];
+ $srcport = trim($matches[3]);
+ }
+
+ $parts = explode(":", $dstinfo);
+ $partcount = count($parts);
+ if ($partcount <= 2) {
+ $dstip = trim($parts[0]);
+ $dstport = trim($parts[1]);
+ } else {
+ preg_match("/([0-9a-f:]+)(\[([0-9]+)\])?/i", $dstinfo, $matches);
+ $dstip = $matches[1];
+ $dstport = trim($matches[3]);
+ }
+
+ addipinfo($srcipinfo, $srcip, $proto, $srcport, $dstport);
+ addipinfo($dstipinfo, $dstip, $proto, $srcport, $dstport);
+ addipinfo($pairipinfo, "{$srcip} -> {$dstip}", $proto, $srcport, $dstport);
+
+ addipinfo($allipinfo, $srcip, $proto, $srcport, $dstport);
+ addipinfo($allipinfo, $dstip, $proto, $srcport, $dstport);
+
+ }
+}
+
+function sort_by_ip($a, $b) {
+ return ip2ulong($a) < ip2ulong($b) ? -1 : 1;
+}
+
+function build_port_info($portarr, $proto) {
+ if (!$portarr) {
+ return '';
+ }
+ $ports = array();
+ asort($portarr);
+ foreach (array_reverse($portarr, TRUE) as $port => $count) {
+ $str = "";
+ $service = getservbyport($port, strtolower($proto));
+ $port = "{$proto}/{$port}";
+ if ($service) {
+ $port = "{$port} ({$service})";
+ }
+ $ports[] = "{$port}: {$count}";
+ }
+ return implode($ports, ', ');
+}
+
+function print_summary_table($label, $iparr, $sort = TRUE) { ?>
+
+<h3><?php echo $label; ?></h3>
+<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="states summary">
+ <tr>
+ <td class="listhdrr"><?=gettext("IP");?></td>
+ <td class="listhdrr"># <?=gettext("States");?></td>
+ <td class="listhdrr"><?=gettext("Proto");?></td>
+ <td class="listhdrr"># <?=gettext("States");?></td>
+ <td class="listhdrr"><?=gettext("Src Ports");?></td>
+ <td class="listhdrr"><?=gettext("Dst Ports");?></td>
+ </tr>
+<?php
+ if ($sort) {
+ uksort($iparr, "sort_by_ip");
+ }
+ foreach ($iparr as $ip => $ipinfo) { ?>
+ <tr>
+ <td class="vncell"><?php echo $ip; ?></td>
+ <td class="vncell"><?php echo $ipinfo['seen']; ?></td>
+ <td class="vncell">&nbsp;</td>
+ <td class="vncell">&nbsp;</td>
+ <td class="vncell">&nbsp;</td>
+ <td class="vncell">&nbsp;</td>
+ </tr>
+ <?php foreach ($ipinfo['protos'] as $proto => $protoinfo) { ?>
+ <tr>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="listlr"><?php echo $proto; ?></td>
+ <td class="listr" align="center"><?php echo $protoinfo['seen']; ?></td>
+ <td class="listr" align="center"><span title="<?php echo build_port_info($protoinfo['srcports'], $proto); ?>"><?php echo count($protoinfo['srcports']); ?></span></td>
+ <td class="listr" align="center"><span title="<?php echo build_port_info($protoinfo['dstports'], $proto); ?>"><?php echo count($protoinfo['dstports']); ?></span></td>
+ </tr>
+ <?php } ?>
+<?php } ?>
+
+</table>
+
+<?php
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("State Table Summary"));
+require_once("guiconfig.inc");
+include("head.inc");
+echo "<body>";
+include("fbegin.inc");
+
+
+print_summary_table(gettext("By Source IP"), $srcipinfo);
+print_summary_table(gettext("By Destination IP"), $dstipinfo);
+print_summary_table(gettext("Total per IP"), $allipinfo);
+print_summary_table(gettext("By IP Pair"), $pairipinfo, FALSE);
+?>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_system_activity.php b/src/usr/local/www/diag_system_activity.php
new file mode 100644
index 0000000..1f6380f
--- /dev/null
+++ b/src/usr/local/www/diag_system_activity.php
@@ -0,0 +1,115 @@
+<?php
+/* $Id$ */
+/*
+ diag_system_activity.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright (C) 2008-2009 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/top
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-system-activity
+##|*NAME=Diagnostics: System Activity
+##|*DESCR=Allows access to the 'Diagnostics: System Activity' page
+##|*MATCH=diag_system_activity.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$pgtitle = gettext("Diagnostics: System Activity");
+
+if ($_REQUEST['getactivity']) {
+ $text = `/usr/bin/top -aHS | /usr/bin/cut -c1-105`;
+ echo $text;
+ exit;
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+ function getcpuactivity() {
+ scroll(0, 0);
+ var url = "/diag_system_activity.php";
+ var pars = 'getactivity=yes';
+ jQuery.ajax(
+ url,
+ {
+ type: 'post',
+ data: pars,
+ complete: activitycallback
+ });
+ }
+ function activitycallback(transport) {
+ jQuery('#cpuactivitydiv').html('<font face="Courier" size="2"><pre style="text-align:left;">' + transport.responseText + '<\/pre><\/font>');
+ setTimeout('getcpuactivity()', 2500);
+ }
+ setTimeout('getcpuactivity()', 1000);
+//]]>
+</script>
+<div id="maincontent">
+<?php
+ if ($savemsg) {
+ echo "<div id=\"savemsg\">";
+ print_info_box($savemsg);
+ echo "</div>";
+ }
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag system activity">
+ <tr>
+ <td>
+ <table id="backuptable" class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
+ <tr>
+ <td align="center">
+ <table summary="results">
+ <tr>
+ <td>
+ <div id="cpuactivitydiv">
+ <?=gettext("Gathering CPU activity, please wait...");?>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</div>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_system_pftop.php b/src/usr/local/www/diag_system_pftop.php
new file mode 100644
index 0000000..7d51c84
--- /dev/null
+++ b/src/usr/local/www/diag_system_pftop.php
@@ -0,0 +1,216 @@
+<?php
+/* $Id$ */
+/*
+ diag_system_pftop.php
+ Copyright (C) 2008-2009 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-system-pftop
+##|*NAME=Diagnostics: pfTop
+##|*DESCR=Allows access to the 'Diagnostics: pfTop' page
+##|*MATCH=diag_system_pftop.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$pgtitle = gettext("Diagnostics: pfTop");
+
+$sorttypes = array('age', 'bytes', 'dest', 'dport', 'exp', 'none', 'peak', 'pkt', 'rate', 'size', 'sport', 'src');
+$viewtypes = array('default', 'label', 'long', 'queue', 'rules', 'size', 'speed', 'state', 'time');
+$viewall = array('queue', 'label', 'rules');
+$numstates = array('50', '100', '200', '500', '1000', 'all');
+
+if ($_REQUEST['getactivity']) {
+ if ($_REQUEST['sorttype'] && in_array($_REQUEST['sorttype'], $sorttypes) &&
+ $_REQUEST['viewtype'] && in_array($_REQUEST['viewtype'], $viewtypes) &&
+ $_REQUEST['states'] && in_array($_REQUEST['states'], $numstates)) {
+ $viewtype = escapeshellarg($_REQUEST['viewtype']);
+ if (in_array($_REQUEST['viewtype'], $viewall)) {
+ $sorttype = "";
+ $numstate = "-a";
+ } else {
+ $sorttype = "-o " . escapeshellarg($_REQUEST['sorttype']);
+ $numstate = ($_REQUEST['states'] == "all" ? "-a" : escapeshellarg($_REQUEST['states']));
+ }
+ } else {
+ $sorttype = "bytes";
+ $viewtype = "default";
+ $numstate = "100";
+ }
+
+ $text = `pftop -b {$sorttype} -v {$viewtype} {$numstate}`;
+ echo $text;
+ exit;
+}
+
+include("head.inc");
+
+if ($_REQUEST['sorttype'] && in_array($_REQUEST['sorttype'], $sorttypes) &&
+ $_REQUEST['viewtype'] && in_array($_REQUEST['viewtype'], $viewtypes) &&
+ $_REQUEST['states'] && in_array($_REQUEST['states'], $numstates)) {
+ $viewtype = escapeshellarg($_REQUEST['viewtype']);
+ if (in_array($_REQUEST['viewtype'], $viewall)) {
+ $sorttype = "";
+ $numstate = "-a";
+ } else {
+ $sorttype = "-o " . escapeshellarg($_REQUEST['sorttype']);
+ $numstate = ($_REQUEST['states'] == "all" ? "-a" : escapeshellarg($_REQUEST['states']));
+ }
+} else {
+ $sorttype = "bytes";
+ $viewtype = "default";
+ $numstate = "100";
+}
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form method="post" action="diag_system_pftop.php">
+<script type="text/javascript">
+//<![CDATA[
+ function getpftopactivity() {
+ var url = "/diag_system_pftop.php";
+ var pars = 'getactivity=yes&sorttype=' + jQuery('#sorttype').val() + '&viewtype=' + jQuery('#viewtype').val() + '&states=' + jQuery('#states').val();
+ jQuery.ajax(
+ url,
+ {
+ type: 'post',
+ data: pars,
+ complete: activitycallback
+ });
+ }
+ function activitycallback(transport) {
+ jQuery('#pftopactivitydiv').html('<font face="Courier" size="2"><pre style="text-align:left;">' + transport.responseText + '<\/pre><\/font>');
+ setTimeout('getpftopactivity()', 2500);
+ }
+ setTimeout('getpftopactivity()', 1000);
+//]]>
+</script>
+<div id="maincontent">
+<?php
+ if ($savemsg) {
+ echo "<div id=\"savemsg\">";
+ print_info_box($savemsg);
+ echo "</div>";
+ }
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+?>
+ <div id="mainarea" style="padding-bottom: 0px;">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="diag system pftop">
+ <tr>
+ <td class="list">
+ <div id='viewtypediv'><?=gettext("View type:"); ?>
+ <select name='viewtype' id='viewtype'>
+ <option value='default' <?php echo ($viewtype == "default") ? "selected=\"selected\"" : ""; ?>><?=gettext("Default");?></option>
+ <option value='label' <?php echo ($viewtype == "label") ? "selected=\"selected\"" : ""; ?>><?=gettext("Label");?></option>
+ <option value='long' <?php echo ($viewtype == "long") ? "selected=\"selected\"" : ""; ?>><?=gettext("Long");?></option>
+ <option value='queue' <?php echo ($viewtype == "queue") ? "selected=\"selected\"" : ""; ?>><?=gettext("Queue");?></option>
+ <option value='rules' <?php echo ($viewtype == "rules") ? "selected=\"selected\"" : ""; ?>><?=gettext("Rules");?></option>
+ <option value='size' <?php echo ($viewtype == "size") ? "selected=\"selected\"" : ""; ?>><?=gettext("Size");?></option>
+ <option value='speed' <?php echo ($viewtype == "speed") ? "selected=\"selected\"" : ""; ?>><?=gettext("Speed");?></option>
+ <option value='state' <?php echo ($viewtype == "state") ? "selected=\"selected\"" : ""; ?>><?=gettext("State");?></option>
+ <option value='time' <?php echo ($viewtype == "time") ? "selected=\"selected\"" : ""; ?>><?=gettext("Time");?></option>
+ </select>
+ </div>
+ </td>
+ <td class="list">
+ <div id='sorttypediv'><?=gettext("Sort type:"); ?>
+ <select name='sorttype' id='sorttype'>
+ <option value='age' <?php echo ($sorttype == "age") ? "selected=\"selected\"" : ""; ?>><?=gettext("Age");?></option>
+ <option value='bytes' <?php echo ($sorttype == "bytes") ? "selected=\"selected\"" : ""; ?>><?=gettext("Bytes");?></option>
+ <option value='dest' <?php echo ($sorttype == "dest") ? "selected=\"selected\"" : ""; ?>><?=gettext("Destination Address");?></option>
+ <option value='dport' <?php echo ($sorttype == "dport") ? "selected=\"selected\"" : ""; ?>><?=gettext("Destination Port");?></option>
+ <option value='exp' <?php echo ($sorttype == "exp") ? "selected=\"selected\"" : ""; ?>><?=gettext("Expiry");?></option>
+ <option value='none' <?php echo ($sorttype == "none") ? "selected=\"selected\"" : ""; ?>><?=gettext("None");?></option>
+ <option value='peak' <?php echo ($sorttype == "peak") ? "selected=\"selected\"" : ""; ?>><?=gettext("Peak");?></option>
+ <option value='pkt' <?php echo ($sorttype == "pkt") ? "selected=\"selected\"" : ""; ?>><?=gettext("Packet");?></option>
+ <option value='rate' <?php echo ($sorttype == "rate") ? "selected=\"selected\"" : ""; ?>><?=gettext("Rate");?></option>
+ <option value='size' <?php echo ($sorttype == "size") ? "selected=\"selected\"" : ""; ?>><?=gettext("Size");?></option>
+ <option value='sport' <?php echo ($sorttype == "sport") ? "selected=\"selected\"" : ""; ?>><?=gettext("Source Port");?></option>
+ <option value='src' <?php echo ($sorttype == "src") ? "selected=\"selected\"" : ""; ?>><?=gettext("Source Address");?></option>
+ </select>
+ </div>
+ </td>
+ <td class="list">
+ <div id='statesdiv'><?=gettext("Number of States:"); ?>
+ <select name='states' id='states'>
+ <option value='50' <?php echo ($numstate == "50") ? "selected=\"selected\"" : ""; ?>>50</option>
+ <option value='100' <?php echo ($numstate == "100") ? "selected=\"selected\"" : ""; ?>>100</option>
+ <option value='200' <?php echo ($numstate == "200") ? "selected=\"selected\"" : ""; ?>>200</option>
+ <option value='500' <?php echo ($numstate == "500") ? "selected=\"selected\"" : ""; ?>>500</option>
+ <option value='1000' <?php echo ($numstate == "1000") ? "selected=\"selected\"" : ""; ?>>1000</option>
+ <option value='all' <?php echo ($numstate == "all") ? "selected=\"selected\"" : ""; ?>>all</option>
+ </select>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3" align="center">
+ <table id="backuptable" class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabcont">
+ <tr>
+ <td align="center">
+ <table summary="results">
+ <tr>
+ <td>
+ <div id="pftopactivitydiv"><?=gettext("Gathering pfTOP activity, please wait...");?></div>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+</div>
+</form>
+<?php include("fend.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+jQuery("#viewtype").change(function() {
+ var selected = jQuery("#viewtype option:selected");
+ switch (selected.val()) {
+ case "queue":
+ case "label":
+ case "rules":
+ jQuery("#sorttype, #sorttypediv, #statesdiv, #states").hide();
+ break;
+ default:
+ jQuery("#sorttype, #sorttypediv, #statesdiv, #states").show();
+ }
+});
+//]]>
+</script>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_tables.php b/src/usr/local/www/diag_tables.php
new file mode 100644
index 0000000..fe6778f
--- /dev/null
+++ b/src/usr/local/www/diag_tables.php
@@ -0,0 +1,191 @@
+<?php
+/*
+ diag_tables.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2010 Jim Pingle
+
+ Portions borrowed from diag_dump_states.php:
+ Copyright (C) 2010 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /sbin/pfctl
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-tables
+##|*NAME=Diagnostics: PF Table IP addresses
+##|*DESCR=Allow access to the 'Diagnostics: Tables' page.
+##|*MATCH=diag_tables.php*
+##|-PRIV
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Tables"));
+$shortcut_section = "aliases";
+
+require_once("guiconfig.inc");
+
+// Set default table
+$tablename = "sshlockout";
+
+if ($_REQUEST['type']) {
+ $tablename = $_REQUEST['type'];
+}
+
+if ($_REQUEST['delete']) {
+ if (is_ipaddr($_REQUEST['delete']) || is_subnet($_REQUEST['delete'])) {
+ exec("/sbin/pfctl -t " . escapeshellarg($_REQUEST['type']) . " -T delete " . escapeshellarg($_REQUEST['delete']), $delete);
+ echo htmlentities($_REQUEST['delete']);
+ }
+ exit;
+}
+
+if ($_REQUEST['deleteall']) {
+ exec("/sbin/pfctl -t " . escapeshellarg($tablename) . " -T show", $entries);
+ if (is_array($entries)) {
+ foreach ($entries as $entryA) {
+ $entry = trim($entryA);
+ exec("/sbin/pfctl -t " . escapeshellarg($tablename) . " -T delete " . escapeshellarg($entry), $delete);
+ }
+ }
+}
+
+if ((($tablename == "bogons") || ($tablename == "bogonsv6")) && ($_POST['Download'])) {
+ mwexec_bg("/etc/rc.update_bogons.sh now");
+ $maxtimetowait = 0;
+ $loading = true;
+ while ($loading == true) {
+ $isrunning = `/bin/ps awwwux | /usr/bin/grep -v grep | /usr/bin/grep bogons`;
+ if ($isrunning == "") {
+ $loading = false;
+ }
+ $maxtimetowait++;
+ if ($maxtimetowait > 89) {
+ $loading = false;
+ }
+ sleep(1);
+ }
+ if ($maxtimetowait < 90) {
+ $savemsg = gettext("The bogons database has been updated.");
+ }
+}
+
+exec("/sbin/pfctl -t " . escapeshellarg($tablename) . " -T show", $entries);
+exec("/sbin/pfctl -sT", $tables);
+
+include("head.inc");
+?>
+<body>
+<?php include("fbegin.inc"); ?>
+
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form method="post" action="diag_tables.php">
+
+<script type="text/javascript">
+//<![CDATA[
+ function method_change(entrytype) {
+ window.location='diag_tables.php?type=' + entrytype;
+ }
+ function del_entry(entry) {
+ jQuery.ajax("diag_tables.php?type=<?php echo htmlspecialchars($tablename);?>&delete=" + entry, {
+ complete: function(response) {
+ if (200 == response.status) {
+ // Escape all dots to not confuse jQuery selectors
+ name = response.responseText.replace(/\./g,'\\.');
+ name = name.replace(/\//g,'\\-');
+ name = "entry_" + name;
+ jQuery('#' + name).fadeOut(1000);
+ }
+ }
+ });
+ }
+//]]>
+</script>
+
+<?=gettext("Table:");?>
+<select id="type" onchange="method_change(jQuery('#type').val());" name="type">
+ <?php
+ foreach ($tables as $table) {
+ echo "<option value=\"{$table}\"";
+ if ($tablename == $table) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$table}</option>\n";
+ }
+ ?>
+</select>
+
+<br/><br/>
+
+<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="tables">
+ <tr>
+ <td class="listhdrr"><?=gettext("IP Address");?></td>
+ </tr>
+<?php
+ $count = 0;
+ foreach ($entries as $entryA):
+ $entry = trim($entryA);
+?>
+ <tr id="entry_<?=str_replace("/", "-", $entry);?>">
+ <td>
+ <?php echo $entry; ?>
+ </td>
+ <td>
+ <?php if (($tablename != "bogons") && ($tablename != "bogonsv6")) { ?>
+ <a onclick="del_entry('<?=htmlspecialchars($entry)?>');">
+ <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="delete" />
+ </a>
+ <?php } ?>
+ </td>
+ </tr>
+<?php
+ $count++;
+ endforeach;
+ if ($count == 0) {
+ if (($tablename == "bogons") || ($tablename == "bogonsv6")) {
+ echo "<tr><td>" . gettext("No entries exist in this table.") . "&nbsp;&nbsp;" . "<input name=\"Download\" type=\"submit\" class=\"formbtn\" value=\"" . gettext("Download") . "\" /> " . gettext(" the latest bogon data.");
+ } else {
+ echo "<tr><td>" . gettext("No entries exist in this table.");
+ }
+ }
+?>
+
+<?php
+ if ($count > 0) {
+ if (($tablename == "bogons") || ($tablename == "bogonsv6")) {
+ $last_updated = exec('/usr/bin/grep -i -m 1 -E "^# last updated" /etc/' . escapeshellarg($tablename));
+ echo "<tr><td>&nbsp;<b>$count</b> " . gettext("entries in this table.") . "&nbsp;&nbsp;" . "<input name=\"Download\" type=\"submit\" class=\"formbtn\" value=\"" . gettext("Download") . "\" /> " . gettext(" the latest bogon data.") . "<br />" . "$last_updated";
+ } else {
+ echo "<tr><td>" . gettext("Delete") . " <a href=\"diag_tables.php?deleteall=true&amp;type=" . htmlspecialchars($tablename) . "\">" . gettext("all") . "</a> " . "<b>$count</b> " . gettext("entries in this table.");
+ }
+ }
+?>
+</td></tr>
+</table>
+</form>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_testport.php b/src/usr/local/www/diag_testport.php
new file mode 100644
index 0000000..fbc448a
--- /dev/null
+++ b/src/usr/local/www/diag_testport.php
@@ -0,0 +1,290 @@
+<?php
+/*
+ diag_testport.php
+ Copyright (C) 2013 Jim P (jimp@pfsense.org)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Portions based on diag_ping.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2005 Bob Zoller (bob@kludgebox.com) and Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/nc
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-testport
+##|*NAME=Diagnostics: Test Port
+##|*DESCR=Allow access to the 'Diagnostics: Test Port' page.
+##|*MATCH=diag_testport.php*
+##|-PRIV
+
+$allowautocomplete = true;
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Test Port"));
+require("guiconfig.inc");
+
+define('NC_TIMEOUT', 10);
+$do_testport = false;
+
+if ($_POST || $_REQUEST['host']) {
+ unset($input_errors);
+
+ /* input validation */
+ $reqdfields = explode(" ", "host port");
+ $reqdfieldsn = array(gettext("Host"), gettext("Port"));
+ do_input_validation($_REQUEST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!is_ipaddr($_REQUEST['host']) && !is_hostname($_REQUEST['host'])) {
+ $input_errors[] = gettext("Please enter a valid IP or hostname.");
+ }
+
+ if (!is_port($_REQUEST['port'])) {
+ $input_errors[] = gettext("Please enter a valid port number.");
+ }
+
+ if (($_REQUEST['srcport'] != "") && (!is_numeric($_REQUEST['srcport']) || !is_port($_REQUEST['srcport']))) {
+ $input_errors[] = gettext("Please enter a valid source port number, or leave the field blank.");
+ }
+
+ if (is_ipaddrv4($_REQUEST['host']) && ($_REQUEST['ipprotocol'] == "ipv6")) {
+ $input_errors[] = gettext("You cannot connect to an IPv4 address using IPv6.");
+ }
+ if (is_ipaddrv6($_REQUEST['host']) && ($_REQUEST['ipprotocol'] == "ipv4")) {
+ $input_errors[] = gettext("You cannot connect to an IPv6 address using IPv4.");
+ }
+
+ if (!$input_errors) {
+ $do_testport = true;
+ $timeout = NC_TIMEOUT;
+ }
+
+ /* Save these request vars even if there were input errors. Then the fields are refilled for the user to correct. */
+ $host = $_REQUEST['host'];
+ $sourceip = $_REQUEST['sourceip'];
+ $port = $_REQUEST['port'];
+ $srcport = $_REQUEST['srcport'];
+ $showtext = isset($_REQUEST['showtext']);
+ $ipprotocol = $_REQUEST['ipprotocol'];
+}
+
+include("head.inc"); ?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="diag test port">
+<tr><td>
+<?php echo gettext("This page allows you to perform a simple TCP connection test to determine if a host is up and accepting connections on a given port. This test does not function for UDP since there is no way to reliably determine if a UDP port accepts connections in this manner."); ?>
+<br /><br />
+<?php echo gettext("No data is transmitted to the remote host during this test, it will only attempt to open a connection and optionally display the data sent back from the server."); ?>
+<br /><br /><br />
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+ <form action="diag_testport.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Test Port"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Host"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?>
+ <input name="host" type="text" class="formfld unknown" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?= gettext("Port"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="port" type="text" class="formfld unknown" id="port" size="10" value="<?=htmlspecialchars($port);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?= gettext("Source Port"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="srcport" type="text" class="formfld unknown" id="srcport" size="10" value="<?=htmlspecialchars($srcport);?>" />
+ <br /><br /><?php echo gettext("This should typically be left blank."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?= gettext("Show Remote Text"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="showtext" type="checkbox" id="showtext" <?php if ($showtext) echo "checked=\"checked\"" ?> />
+ <br /><br /><?php echo gettext("Shows the text given by the server when connecting to the port. Will take 10+ seconds to display if checked."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Source Address"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="sourceip" class="formselect">
+ <option value="">Any</option>
+ <?php $sourceips = get_possible_traffic_source_addresses(true);
+ foreach ($sourceips as $sipvalue => $sipname):
+ $selected = "";
+ if (!link_interface_to_bridge($sipvalue) && ($sipvalue == $sourceip)) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$sipvalue;?>" <?=$selected;?>>
+ <?=htmlspecialchars($sipname);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IP Protocol"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="ipprotocol" class="formfld">
+ <option value="any" <?php if ("any" == $ipprotocol) echo "selected=\"selected\""; ?>>
+ Any
+ </option>
+ <option value="ipv4" <?php if ($ipprotocol == "ipv4") echo "selected=\"selected\""; ?>>
+ <?=gettext("IPv4");?>
+ </option>
+ <option value="ipv6" <?php if ($ipprotocol == "ipv6") echo "selected=\"selected\""; ?>>
+ <?=gettext("IPv6");?>
+ </option>
+ </select>
+ <br /><br />
+ <?php echo gettext("If you force IPv4 or IPv6 and use a hostname that does not contain a result using that protocol, it will result in an error. For example if you force IPv4 and use a hostname that only returns an AAAA IPv6 IP address, it will not work."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Test"); ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" colspan="2">
+ <?php if ($do_testport) {
+ echo "<font face=\"terminal\" size=\"2\">";
+ echo "<strong>" . gettext("Port Test Results") . ":</strong><br />";
+ ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function() {
+ document.getElementById("testportCaptured").wrap='off';
+ }
+ //]]>
+ </script>
+ <?php
+ echo "<textarea id=\"testportCaptured\" style=\"width:98%\" name=\"code\" rows=\"15\" cols=\"66\" readonly=\"readonly\">";
+ $result = "";
+ $nc_base_cmd = "/usr/bin/nc";
+ $nc_args = "-w " . escapeshellarg($timeout);
+ if (!$showtext) {
+ $nc_args .= " -z ";
+ }
+ if (!empty($srcport)) {
+ $nc_args .= " -p " . escapeshellarg($srcport) . " ";
+ }
+
+ /* Attempt to determine the interface address, if possible. Else try both. */
+ if (is_ipaddrv4($host)) {
+ $ifaddr = ($sourceip == "any") ? "" : get_interface_ip($sourceip);
+ $nc_args .= " -4";
+ } elseif (is_ipaddrv6($host)) {
+ if ($sourceip == "any") {
+ $ifaddr = "";
+ } else if (is_linklocal($sourceip)) {
+ $ifaddr = $sourceip;
+ } else {
+ $ifaddr = get_interface_ipv6($sourceip);
+ }
+ $nc_args .= " -6";
+ } else {
+ switch ($ipprotocol) {
+ case "ipv4":
+ $ifaddr = get_interface_ip($sourceip);
+ $nc_ipproto = " -4";
+ break;
+ case "ipv6":
+ $ifaddr = (is_linklocal($sourceip) ? $sourceip : get_interface_ipv6($sourceip));
+ $nc_ipproto = " -6";
+ break;
+ case "any":
+ $ifaddr = get_interface_ip($sourceip);
+ $nc_ipproto = (!empty($ifaddr)) ? " -4" : "";
+ if (empty($ifaddr)) {
+ $ifaddr = (is_linklocal($sourceip) ? $sourceip : get_interface_ipv6($sourceip));
+ $nc_ipproto = (!empty($ifaddr)) ? " -6" : "";
+ }
+ break;
+ }
+ /* Netcat doesn't like it if we try to connect using a certain type of IP without specifying the family. */
+ if (!empty($ifaddr)) {
+ $nc_args .= $nc_ipproto;
+ } elseif ($sourceip == "any") {
+ switch ($ipprotocol) {
+ case "ipv4":
+ $nc_ipproto = " -4";
+ break;
+ case "ipv6":
+ $nc_ipproto = " -6";
+ break;
+ }
+ $nc_args .= $nc_ipproto;
+ }
+ }
+ /* Only add on the interface IP if we managed to find one. */
+ if (!empty($ifaddr)) {
+ $nc_args .= " -s " . escapeshellarg($ifaddr) . " ";
+ $scope = get_ll_scope($ifaddr);
+ if (!empty($scope) && !strstr($host, "%")) {
+ $host .= "%{$scope}";
+ }
+ }
+
+ $nc_cmd = "{$nc_base_cmd} {$nc_args} " . escapeshellarg($host) . " " . escapeshellarg($port) . " 2>&1";
+ exec($nc_cmd, $result, $retval);
+ //echo "NC CMD: {$nc_cmd}\n\n";
+ if (empty($result)) {
+ if ($showtext) {
+ echo gettext("No output received, or connection failed. Try with \"Show Remote Text\" unchecked first.");
+ } else {
+ echo gettext("Connection failed (Refused/Timeout)");
+ }
+ } else {
+ if (is_array($result)) {
+ foreach ($result as $resline) {
+ echo htmlspecialchars($resline) . "\n";
+ }
+ } else {
+ echo htmlspecialchars($result);
+ }
+ }
+ echo '</textarea>&nbsp;</font>' ;
+ }
+ ?>
+ </td>
+ </tr>
+ </table>
+</form>
+</td></tr></table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/diag_traceroute.php b/src/usr/local/www/diag_traceroute.php
new file mode 100644
index 0000000..d094d49
--- /dev/null
+++ b/src/usr/local/www/diag_traceroute.php
@@ -0,0 +1,218 @@
+<?php
+/*
+ diag_traceroute.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2005 Paul Taylor (paultaylor@winndixie.com) and Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/sbin/traceroute
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-traceroute
+##|*NAME=Diagnostics: Traceroute page
+##|*DESCR=Allow access to the 'Diagnostics: Traceroute' page.
+##|*MATCH=diag_traceroute.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$allowautocomplete = true;
+$pgtitle = array(gettext("Diagnostics"), gettext("Traceroute"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php
+
+define('MAX_TTL', 64);
+define('DEFAULT_TTL', 18);
+
+if ($_POST || $_REQUEST['host']) {
+ unset($input_errors);
+ unset($do_traceroute);
+
+ /* input validation */
+ $reqdfields = explode(" ", "host ttl");
+ $reqdfieldsn = array(gettext("Host"), gettext("ttl"));
+ do_input_validation($_REQUEST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_REQUEST['ttl'] < 1) || ($_REQUEST['ttl'] > MAX_TTL)) {
+ $input_errors[] = sprintf(gettext("Maximum number of hops must be between 1 and %s"), MAX_TTL);
+ }
+ $host = trim($_REQUEST['host']);
+ $ipproto = $_REQUEST['ipproto'];
+ if (($ipproto == "ipv4") && is_ipaddrv6($host)) {
+ $input_errors[] = gettext("When using IPv4, the target host must be an IPv4 address or hostname.");
+ }
+ if (($ipproto == "ipv6") && is_ipaddrv4($host)) {
+ $input_errors[] = gettext("When using IPv6, the target host must be an IPv6 address or hostname.");
+ }
+
+ if (!$input_errors) {
+ $sourceip = $_REQUEST['sourceip'];
+ $do_traceroute = true;
+ $ttl = $_REQUEST['ttl'];
+ $resolve = $_REQUEST['resolve'];
+ }
+} else {
+ $resolve = true;
+}
+
+if (!isset($do_traceroute)) {
+ $do_traceroute = false;
+ $host = '';
+ $ttl = DEFAULT_TTL;
+}
+
+?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="diag_traceroute.php" method="post" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="diag traceroute">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Traceroute");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Host");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="host" type="text" class="formfld unknown" id="host" size="20" value="<?=htmlspecialchars($host);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IP Protocol"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="ipproto" class="formselect">
+ <option value="ipv4" <?php if ($ipproto == "ipv4") echo "selected=\"selected\"" ?>>IPv4</option>
+ <option value="ipv6" <?php if ($ipproto == "ipv6") echo "selected=\"selected\"" ?>>IPv6</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Source Address"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="sourceip" class="formselect">
+ <option value="">Any</option>
+ <?php $sourceips = get_possible_traffic_source_addresses(true);
+ foreach ($sourceips as $sipvalue => $sipname):
+ $selected = "";
+ if (!link_interface_to_bridge($sipvalue) && ($sipvalue == $sourceip)) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$sipvalue;?>" <?=$selected;?>>
+ <?=htmlspecialchars($sipname);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Maximum number of hops");?></td>
+ <td width="78%" class="vtable">
+ <select name="ttl" class="formfld" id="ttl">
+ <?php for ($i = 1; $i <= MAX_TTL; $i++): ?>
+ <option value="<?=$i;?>" <?php if ($i == $ttl) echo "selected=\"selected\""; ?>><?=$i;?></option>
+ <?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Reverse Address Lookup");?></td>
+ <td width="78%" class="vtable">
+ <input name="resolve" type="checkbox"<?php echo (!isset($resolve) ? "" : " checked=\"checked\""); ?> />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Use ICMP");?></td>
+ <td width="78%" class="vtable">
+ <input name="useicmp" type="checkbox"<?php if ($_REQUEST['useicmp']) echo " checked=\"checked\""; ?> />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Traceroute");?>" />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" colspan="2">
+ <span class="vexpl">
+ <span class="red"><b><?=gettext("Note: ");?></b></span>
+ <?=gettext("Traceroute may take a while to complete. You may hit the Stop button on your browser at any time to see the progress of failed traceroutes.");?>
+ <br /><br />
+ <?=gettext("Using a source interface/IP address that does not match selected type (IPv4, IPv6) will result in an error or empty output.");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" colspan="2">
+ <?php
+ if ($do_traceroute) {
+ echo "<font face=\"terminal\" size=\"2\">\n";
+ echo "<strong>" . gettext("Traceroute output:") . "</strong><br />\n";
+ ob_end_flush();
+ ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function() {
+ document.getElementById("tracerouteCaptured").wrap='off';
+ }
+ //]]>
+ </script>
+ <?php
+ echo "<textarea id=\"tracerouteCaptured\" style=\"width:98%\" name=\"code\" rows=\"15\" cols=\"66\" readonly=\"readonly\">";
+ $useicmp = isset($_REQUEST['useicmp']) ? "-I" : "";
+ $n = isset($resolve) ? "" : "-n";
+
+ $command = "/usr/sbin/traceroute";
+ if ($ipproto == "ipv6") {
+ $command .= "6";
+ $ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ipv6($sourceip);
+ } else {
+ $ifaddr = is_ipaddr($sourceip) ? $sourceip : get_interface_ip($sourceip);
+ }
+
+ if ($ifaddr && (is_ipaddr($host) || is_hostname($host))) {
+ $srcip = "-s " . escapeshellarg($ifaddr);
+ }
+
+ $cmd = "{$command} {$n} {$srcip} -w 2 {$useicmp} -m " . escapeshellarg($ttl) . " " . escapeshellarg($host);
+
+ //echo "Traceroute command: {$cmd}\n";
+ system($cmd);
+ echo "</textarea>&nbsp;</font>";
+ } ?>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/easyrule.php b/src/usr/local/www/easyrule.php
new file mode 100644
index 0000000..74b1051
--- /dev/null
+++ b/src/usr/local/www/easyrule.php
@@ -0,0 +1,89 @@
+<?php
+/*
+ easyrule.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009-2010 Jim Pingle (jpingle@gmail.com)
+ Originally Sponsored By Anathematic @ pfSense Forums
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-easyrule
+##|*NAME=Firewall: Easy Rule add/status page
+##|*DESCR=Allow access to the 'Firewall: Easy Rule' add/status page.
+##|*MATCH=easyrule.php*
+##|-PRIV
+
+$pgtitle = gettext("Firewall: EasyRule");
+require_once("guiconfig.inc");
+require_once("easyrule.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$retval = 0;
+$message = "";
+$specialsrcdst = explode(" ", "any pptp pppoe l2tp openvpn");
+
+if ($_GET && isset($_GET['action'])) {
+ switch ($_GET['action']) {
+ case 'block':
+ /* Check that we have a valid host */
+ easyrule_parse_block($_GET['int'], $_GET['src'], $_GET['ipproto']);
+ break;
+ case 'pass':
+ easyrule_parse_pass($_GET['int'], $_GET['proto'], $_GET['src'], $_GET['dst'], $_GET['dstport'], $_GET['ipproto']);
+ break;
+ }
+}
+
+if (stristr($retval, "error") == true) {
+ $message = $retval;
+}
+
+include("head.inc"); ?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<?php if ($message) { ?>
+<br />
+<?=gettext("Message"); ?>: <?php echo $message; ?>
+<br />
+<?php } else { ?>
+<?=gettext("This is the Easy Rule status page, mainly used to display errors when adding rules. " .
+"If you are seeing this, there apparently was not an error, and you navigated to the " .
+"page directly without telling it what to do"); ?>.<br /><br />
+<?=gettext("This page is meant to be called from the block/pass buttons on the Firewall Logs page"); ?>, <a href="diag_logs_filter.php"><?=gettext("Status"); ?> &gt; <?=gettext("System Logs, " .
+"Firewall Tab"); ?></a>.
+<br />
+<?php } ?>
+</td></tr></table>
+<?php include("fend.inc"); ?>
diff --git a/src/usr/local/www/edit.php b/src/usr/local/www/edit.php
new file mode 100644
index 0000000..481b2ce
--- /dev/null
+++ b/src/usr/local/www/edit.php
@@ -0,0 +1,254 @@
+<?php
+/*
+ edit.php
+ Copyright (C) 2004, 2005 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: shell
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-edit
+##|*NAME=Diagnostics: Edit FIle
+##|*DESCR=Allow access to the 'Diagnostics: Edit File' page.
+##|*MATCH=edit.php*
+##|*MATCH=browser.php*
+##|*MATCH=filebrowser/browser.php*
+##|-PRIV
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Edit file"));
+require("guiconfig.inc");
+
+if ($_POST['action']) {
+ switch ($_POST['action']) {
+ case 'load':
+ if (strlen($_POST['file']) < 1) {
+ echo "|5|" . gettext("No file name specified") . ".|";
+ } elseif (is_dir($_POST['file'])) {
+ echo "|4|" . gettext("Loading a directory is not supported") . ".|";
+ } elseif (!is_file($_POST['file'])) {
+ echo "|3|" . gettext("File does not exist or is not a regular file") . ".|";
+ } else {
+ $data = file_get_contents(urldecode($_POST['file']));
+ if ($data === false) {
+ echo "|1|" . gettext("Failed to read file") . ".|";
+ } else {
+ $data = base64_encode($data);
+ echo "|0|{$_POST['file']}|{$data}|";
+ }
+ }
+ exit;
+ case 'save':
+ if (strlen($_POST['file']) < 1) {
+ echo "|" . gettext("No file name specified") . ".|";
+ } else {
+ conf_mount_rw();
+ $_POST['data'] = str_replace("\r", "", base64_decode($_POST['data']));
+ $ret = file_put_contents($_POST['file'], $_POST['data']);
+ conf_mount_ro();
+ if ($_POST['file'] == "/conf/config.xml" || $_POST['file'] == "/cf/conf/config.xml") {
+ if (file_exists("/tmp/config.cache")) {
+ unlink("/tmp/config.cache");
+ }
+ disable_security_checks();
+ }
+ if ($ret === false) {
+ echo "|" . gettext("Failed to write file") . ".|";
+ } elseif ($ret <> strlen($_POST['data'])) {
+ echo "|" . gettext("Error while writing file") . ".|";
+ } else {
+ echo "|" . gettext("File successfully saved") . ".|";
+ }
+ }
+ exit;
+ }
+ exit;
+}
+
+$closehead = false;
+require("head.inc");
+outputCSSFileInline("code-syntax-highlighter/SyntaxHighlighter.css");
+outputJavaScriptFileInline("filebrowser/browser.js");
+outputJavaScriptFileInline("javascript/base64.js");
+
+?>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+ function loadFile() {
+ jQuery("#fileStatus").html("<?=gettext("Loading file"); ?> ...");
+ jQuery("#fileStatusBox").show(500);
+
+ jQuery.ajax(
+ "<?=$_SERVER['SCRIPT_NAME'];?>", {
+ type: "post",
+ data: "action=load&file=" + jQuery("#fbTarget").val(),
+ complete: loadComplete
+ }
+ );
+ }
+
+ function loadComplete(req) {
+ jQuery("#fileContent").show(1000);
+ var values = req.responseText.split("|");
+ values.shift(); values.pop();
+
+ if (values.shift() == "0") {
+ var file = values.shift();
+ var fileContent = Base64.decode(values.join("|"));
+ jQuery("#fileStatus").html("<?=gettext("File successfully loaded"); ?>.");
+ jQuery("#fileContent").val(fileContent);
+
+ var lang = "none";
+ if (file.indexOf(".php") > 0) lang = "php";
+ else if (file.indexOf(".inc") > 0) lang = "php";
+ else if (file.indexOf(".xml") > 0) lang = "xml";
+ else if (file.indexOf(".js") > 0) lang = "js";
+ else if (file.indexOf(".css") > 0) lang = "css";
+
+ if (jQuery("#highlight").checked && lang != "none") {
+ jQuery("fileContent").prop("className", lang + ":showcolumns");
+ dp.SyntaxHighlighter.HighlightAll("fileContent", true, false);
+ }
+ } else {
+ jQuery("#fileStatus").html(values[0]);
+ jQuery("#fileContent").val("");
+ }
+ jQuery("#fileContent").show(1000);
+ }
+
+ function saveFile(file) {
+ jQuery("#fileStatus").html("<?=gettext("Saving file"); ?> ...");
+ jQuery("#fileStatusBox").show(500);
+
+ var fileContent = Base64.encode(jQuery("#fileContent").val());
+ fileContent = fileContent.replace(/\+/g, "%2B");
+
+ jQuery.ajax(
+ "<?=$_SERVER['SCRIPT_NAME'];?>", {
+ type: "post",
+ data: "action=save&file=" + jQuery("#fbTarget").val() +
+ "&data=" + fileContent,
+ complete: function(req) {
+ var values = req.responseText.split("|");
+ jQuery("#fileStatus").html(values[1]);
+ }
+ }
+ );
+ }
+//]]>
+</script>
+
+<!-- file status box -->
+<div style="display:none; background:#eeeeee;" id="fileStatusBox">
+ <div class="vexpl" style="padding-left:15px;">
+ <strong id="fileStatus"></strong>
+ </div>
+</div>
+
+<br />
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="file editor">
+ <tr>
+ <td class="tabcont" align="center">
+
+<!-- controls -->
+<table width="100%" cellpadding="9" cellspacing="9" summary="controls">
+ <tr>
+ <td align="center" class="list">
+ <?=gettext("Save / Load from path"); ?>:
+ <input type="text" class="formfld file" id="fbTarget" size="45" />
+ <input type="button" class="formbtn" onclick="loadFile();" value="<?=gettext('Load');?>" />
+ <input type="button" class="formbtn" id="fbOpen" value="<?=gettext('Browse');?>" />
+ <input type="button" class="formbtn" onclick="saveFile();" value="<?=gettext('Save');?>" />
+ <br />
+ <?php
+ /*
+ <input type="checkbox" id="highlight" /><?=gettext("Enable syntax highlighting");
+ */
+ ?>
+ </td>
+ </tr>
+</table>
+
+<!-- filebrowser -->
+<div id="fbBrowser" style="display:none; border:1px dashed gray; width:98%;"></div>
+
+<!-- file viewer/editor -->
+<table width="100%" summary="file editor">
+ <tr>
+ <td valign="top">
+ <div style="background:#eeeeee;" id="fileOutput">
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function() {
+ document.getElementById("fileContent").wrap='off';
+ }
+ //]]>
+ </script>
+ <textarea id="fileContent" name="fileContent" style="width:100%;" rows="30" cols=""></textarea>
+ </div>
+ </td>
+ </tr>
+</table>
+
+ </td>
+ </tr>
+</table>
+
+<script type="text/javascript" src="/code-syntax-highlighter/shCore.js"></script>
+<script type="text/javascript" src="/code-syntax-highlighter/shBrushCss.js"></script>
+<script type="text/javascript" src="/code-syntax-highlighter/shBrushJScript.js"></script>
+<script type="text/javascript" src="/code-syntax-highlighter/shBrushPhp.js"></script>
+<script type="text/javascript" src="/code-syntax-highlighter/shBrushXml.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+ jQuery(window).load(
+ function() {
+ jQuery("#fbTarget").focus();
+
+ NiftyCheck();
+ Rounded("div#fileStatusBox", "all", "#ffffff", "#eeeeee", "smooth");
+ }
+ );
+
+ <?php if ($_GET['action'] == "load"): ?>
+ jQuery(window).load(
+ function() {
+ jQuery("#fbTarget").val("<?=htmlspecialchars($_GET['path']);?>");
+ loadFile();
+ }
+ );
+ <?php endif; ?>
+//]]>
+</script>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/exec.php b/src/usr/local/www/exec.php
new file mode 100644
index 0000000..e0220b7
--- /dev/null
+++ b/src/usr/local/www/exec.php
@@ -0,0 +1,355 @@
+<?php
+/* $Id$ */
+/*
+ Exec+ v1.02-000 - Copyright 2001-2003, All rights reserved
+ Created by technologEase (http://www.technologEase.com).
+
+ (modified for m0n0wall by Manuel Kasper <mk@neon1.net>)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: shell
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-command
+##|*NAME=Diagnostics: Command page
+##|*DESCR=Allow access to the 'Diagnostics: Command' page.
+##|*MATCH=exec.php*
+##|-PRIV
+
+$allowautocomplete = true;
+
+require("guiconfig.inc");
+
+if (($_POST['submit'] == "Download") && file_exists($_POST['dlPath'])) {
+ session_cache_limiter('public');
+ $fd = fopen($_POST['dlPath'], "rb");
+ header("Content-Type: application/octet-stream");
+ header("Content-Length: " . filesize($_POST['dlPath']));
+ header("Content-Disposition: attachment; filename=\"" .
+ trim(htmlentities(basename($_POST['dlPath']))) . "\"");
+ if (isset($_SERVER['HTTPS'])) {
+ header('Pragma: ');
+ header('Cache-Control: ');
+ } else {
+ header("Pragma: private");
+ header("Cache-Control: private, must-revalidate");
+ }
+
+ fpassthru($fd);
+ exit;
+} else if (($_POST['submit'] == "Upload") && is_uploaded_file($_FILES['ulfile']['tmp_name'])) {
+ move_uploaded_file($_FILES['ulfile']['tmp_name'], "/tmp/" . $_FILES['ulfile']['name']);
+ $ulmsg = "Uploaded file to /tmp/" . htmlentities($_FILES['ulfile']['name']);
+ unset($_POST['txtCommand']);
+}
+
+if ($_POST) {
+ conf_mount_rw();
+}
+
+// Function: is Blank
+// Returns true or false depending on blankness of argument.
+
+function isBlank($arg) {
+ return preg_match("/^\s*$/", $arg);
+}
+
+// Function: Puts
+// Put string, Ruby-style.
+
+function puts($arg) {
+ echo "$arg\n";
+}
+
+// "Constants".
+
+$Version = '';
+$ScriptName = $REQUEST['SCRIPT_NAME'];
+
+// Get year.
+
+$arrDT = localtime();
+$intYear = $arrDT[5] + 1900;
+
+$closehead = false;
+$pgtitle = array(gettext("Diagnostics"), gettext("Execute command"));
+include("head.inc");
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+
+ // Create recall buffer array (of encoded strings).
+
+<?php
+
+if (isBlank($_POST['txtRecallBuffer'])) {
+ puts(" var arrRecallBuffer = new Array;");
+} else {
+ puts(" var arrRecallBuffer = new Array(");
+ $arrBuffer = explode("&", $_POST['txtRecallBuffer']);
+ for ($i = 0; $i < (count($arrBuffer) - 1); $i++) {
+ puts(" '" . htmlspecialchars($arrBuffer[$i], ENT_QUOTES | ENT_HTML401) . "',");
+ }
+ puts(" '" . htmlspecialchars($arrBuffer[count($arrBuffer) - 1], ENT_QUOTES | ENT_HTML401) . "'");
+ puts(" );");
+}
+
+?>
+
+ // Set pointer to end of recall buffer.
+ var intRecallPtr = arrRecallBuffer.length-1;
+
+ // Functions to extend String class.
+ function str_encode() { return escape( this ) }
+ function str_decode() { return unescape( this ) }
+
+ // Extend string class to include encode() and decode() functions.
+ String.prototype.encode = str_encode
+ String.prototype.decode = str_decode
+
+ // Function: is Blank
+ // Returns boolean true or false if argument is blank.
+ function isBlank( strArg ) { return strArg.match( /^\s*$/ ) }
+
+ // Function: frmExecPlus onSubmit (event handler)
+ // Builds the recall buffer from the command string on submit.
+ function frmExecPlus_onSubmit( form ) {
+
+ if (!isBlank(form.txtCommand.value)) {
+ // If this command is repeat of last command, then do not store command.
+ if (form.txtCommand.value.encode() == arrRecallBuffer[arrRecallBuffer.length-1]) { return true }
+
+ // Stuff encoded command string into the recall buffer.
+ if (isBlank(form.txtRecallBuffer.value)) {
+ form.txtRecallBuffer.value = form.txtCommand.value.encode();
+ } else {
+ form.txtRecallBuffer.value += '&' + form.txtCommand.value.encode();
+ }
+ }
+
+ return true;
+ }
+
+ // Function: btnRecall onClick (event handler)
+ // Recalls command buffer going either up or down.
+ function btnRecall_onClick( form, n ) {
+
+ // If nothing in recall buffer, then error.
+ if (!arrRecallBuffer.length) {
+ alert('<?=gettext("Nothing to recall"); ?>!');
+ form.txtCommand.focus();
+ return;
+ }
+
+ // Increment recall buffer pointer in positive or negative direction
+ // according to <n>.
+ intRecallPtr += n;
+
+ // Make sure the buffer stays circular.
+ if (intRecallPtr < 0) { intRecallPtr = arrRecallBuffer.length - 1 }
+ if (intRecallPtr > (arrRecallBuffer.length - 1)) { intRecallPtr = 0 }
+
+ // Recall the command.
+ form.txtCommand.value = arrRecallBuffer[intRecallPtr].decode();
+ }
+
+ // Function: Reset onClick (event handler)
+ // Resets form on reset button click event.
+ function Reset_onClick( form ) {
+
+ // Reset recall buffer pointer.
+ intRecallPtr = arrRecallBuffer.length;
+
+ // Clear form (could have spaces in it) and return focus ready for cmd.
+ form.txtCommand.value = '';
+ form.txtCommand.focus();
+
+ return true;
+ }
+//]]>
+</script>
+<style type="text/css">
+/*<![CDATA[*/
+
+input {
+ font-family: courier new, courier;
+ font-weight: normal;
+ font-size: 9pt;
+}
+
+pre {
+ border: 2px solid #435370;
+ background: #F0F0F0;
+ padding: 1em;
+ font-family: courier new, courier;
+ white-space: pre;
+ line-height: 10pt;
+ font-size: 10pt;
+}
+
+.label {
+ font-family: tahoma, verdana, arial, helvetica;
+ font-size: 11px;
+ font-weight: bold;
+}
+
+.button {
+ font-family: tahoma, verdana, arial, helvetica;
+ font-weight: bold;
+ font-size: 11px;
+}
+
+/*]]>*/
+</style>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if (isBlank($_POST['txtCommand'])): ?>
+<p class="red"><strong><?=gettext("Note: this function is unsupported. Use it " .
+"on your own risk"); ?>!</strong></p>
+<?php endif; ?>
+<?php if ($ulmsg) echo "<p><strong>" . $ulmsg . "</strong></p>\n"; ?>
+<?php
+
+if (!isBlank($_POST['txtCommand'])) {
+ puts("<pre>");
+ puts("\$ " . htmlspecialchars($_POST['txtCommand']));
+ putenv("PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin");
+ putenv("SCRIPT_FILENAME=" . strtok($_POST['txtCommand'], " ")); /* PHP scripts */
+ $ph = popen($_POST['txtCommand'] . ' 2>&1', "r");
+ while ($line = fgets($ph)) {
+ echo htmlspecialchars($line);
+ }
+ pclose($ph);
+ puts("&nbsp;</pre>");
+}
+
+
+if (!isBlank($_POST['txtPHPCommand'])) {
+ puts("<pre>");
+ require_once("config.inc");
+ require_once("functions.inc");
+ echo eval($_POST['txtPHPCommand']);
+ puts("&nbsp;</pre>");
+}
+
+?>
+<div id="niftyOutter">
+<form action="exec.php" method="post" enctype="multipart/form-data" name="frmExecPlus" onsubmit="return frmExecPlus_onSubmit(this);">
+ <table summary="exec">
+ <tr>
+ <td colspan="2" valign="top" class="vnsepcell"><?=gettext("Execute Shell command"); ?></td>
+ </tr>
+ <tr>
+ <td class="label" align="right"><?=gettext("Command"); ?>:</td>
+ <td class="type"><input id="txtCommand" name="txtCommand" type="text" class="formfld unknown" size="80" value="<?=htmlspecialchars($_POST['txtCommand']);?>" /></td>
+ </tr>
+ <tr>
+ <td valign="top">&nbsp;&nbsp;&nbsp;</td>
+ <td valign="top" class="label">
+ <input type="hidden" name="txtRecallBuffer" value="<?=htmlspecialchars($_POST['txtRecallBuffer']) ?>" />
+ <input type="button" class="button" name="btnRecallPrev" value="<" onclick="btnRecall_onClick(this.form, -1);" />
+ <input type="submit" class="button" value="<?=gettext("Execute"); ?>" />
+ <input type="button" class="button" name="btnRecallNext" value=">" onclick="btnRecall_onClick(this.form, 1);" />
+ <input type="button" class="button" value="<?=gettext("Clear"); ?>" onclick="return Reset_onClick(this.form);" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="vnsepcell"><?=gettext("Download"); ?></td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("File to download"); ?>:</td>
+ <td>
+ <input name="dlPath" type="text" class="formfld file" id="dlPath" size="50" value="<?php echo htmlspecialchars($_GET['dlPath']) ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">&nbsp;&nbsp;&nbsp;</td>
+ <td valign="top" class="label">
+ <input name="submit" type="submit" class="button" id="download" value="<?=gettext("Download"); ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="vnsepcell"><?=gettext("Upload"); ?></td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("File to upload"); ?>:</td>
+ <td valign="top" class="label">
+ <input name="ulfile" type="file" class="formfld file" id="ulfile" />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">&nbsp;&nbsp;&nbsp;</td>
+ <td valign="top" class="label">
+ <input name="submit" type="submit" class="button" id="upload" value="<?=gettext("Upload"); ?>" /></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="vnsepcell"><?=gettext("PHP Execute"); ?></td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Command"); ?>:</td>
+ <td class="type"><textarea id="txtPHPCommand" name="txtPHPCommand" rows="9" cols="80"><?=htmlspecialchars($_POST['txtPHPCommand']);?></textarea></td>
+ </tr>
+ <tr>
+ <td valign="top">&nbsp;&nbsp;&nbsp;</td>
+ <td valign="top" class="label">
+ <input type="submit" class="button" value="<?=gettext("Execute"); ?>" />
+ <p>
+ <strong><?=gettext("Example"); ?>:</strong> interfaces_sync_setup();
+ </p>
+ </td>
+ </tr>
+
+ </table>
+</form>
+</div>
+<?php include("fend.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+document.forms[0].txtCommand.focus();
+//]]>
+</script>
+</body>
+</html>
+
+<?php
+
+if ($_POST) {
+ conf_mount_ro();
+}
+
+?>
diff --git a/src/usr/local/www/favicon.ico b/src/usr/local/www/favicon.ico
new file mode 100755
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/fbegin.inc b/src/usr/local/www/fbegin.inc
new file mode 100755
index 0000000..50a3f2e
--- /dev/null
+++ b/src/usr/local/www/fbegin.inc
@@ -0,0 +1,459 @@
+<?php
+/*
+ pfSense_MODULE: header
+*/
+
+require_once("globals.inc");
+require_once("functions.inc");
+require_once("shortcuts.inc");
+require_once("service-utils.inc");
+
+/* $Id$ */
+
+
+/* Determine automated help URL. Should output the page name and
+ parameters separately */
+$uri_split = "";
+preg_match("/\/(.*)\?(.*)/", $_SERVER["REQUEST_URI"], $uri_split);
+
+/* If there was no match, there were no parameters, just grab the filename
+ Otherwise, use the matched filename from above. */
+if (empty($uri_split[0])) {
+ $pagename = ltrim($_SERVER["REQUEST_URI"], '/');
+} else {
+ $pagename = $uri_split[1];
+}
+/* If the page name is still empty, the user must have requested / (index.php) */
+if (empty($pagename)) {
+ $pagename = "index.php";
+}
+
+/* If the filename is pkg_edit.php or wizard.php, reparse looking for the .xml filename */
+if (($pagename == "pkg.php") || ($pagename == "pkg_edit.php") || ($pagename == "wizard.php")) {
+ $param_split = explode('&', $uri_split[2]);
+ foreach ($param_split as $param) {
+ if (substr($param, 0, 4) == "xml=") {
+ $xmlfile = explode('=', $param);
+ $pagename = $xmlfile[1];
+ }
+ }
+}
+
+/* Build the full help URL. */
+$helpurl .= "{$g['help_base_url']}?page={$pagename}";
+
+function return_ext_menu($section) {
+ global $config;
+ $htmltext = "";
+ $extarray = array();
+ if ($config['installedpackages']['menu'] <> "") {
+ foreach ($config['installedpackages']['menu'] as $menuitem) {
+ if ($menuitem['section'] != $section) {
+ continue;
+ }
+ if ($menuitem['url'] <> "") {
+ $test_url=$menuitem['url'];
+ $addresswithport = getenv("HTTP_HOST");
+ $colonpos = strpos($addresswithport, ":");
+ if ($colonpos !== False) {
+ //my url is actually just the IP address of the pfsense box
+ $myurl = substr($addresswithport, 0, $colonpos);
+ } else {
+ $myurl = $addresswithport;
+ }
+ $description = str_replace('$myurl', $myurl, $menuitem['url']);
+ } else {
+ $description = '/pkg.php?xml=' . $menuitem['configfile'];
+ $test_url=$description;
+ }
+ if (isAllowedPage($test_url)) {
+ $extarray[] = array($menuitem['name'], $description);
+ }
+ }
+ }
+ return $extarray;
+}
+
+function output_menu($arrayitem, $target = null) {
+ foreach ($arrayitem as $item) {
+ if (isAllowedPage($item[1]) || $item[1] == "/index.php?logout") {
+ $attr = sprintf("href=\"%s\"", htmlentities($item[1]));
+ if ($target) {
+ $attr .= sprintf(" target=\"%s\"", htmlentities($target));
+ }
+ $class = "navlnk";
+ if ($item['class']) {
+ $class .= " {$item['class']}";
+ }
+ $attr .= sprintf(" class=\"%s\"", htmlentities($class));
+ if ($item['style']) {
+ $attr .= sprintf(" style=\"%s\"", htmlentities($item['style']));
+ }
+ echo "<li>\n";
+ printf("<a %s>%s</a>\n", $attr, $item[0]);
+ echo "</li>\n";
+ }
+ }
+}
+
+// System
+$system_menu = array();
+$system_menu[] = array(gettext("Advanced"), "/system_advanced_admin.php");
+$system_menu[] = array(gettext("Firmware"), "/system_firmware.php");
+$system_menu[] = array(gettext("General Setup"), "/system.php");
+$system_menu[] = array(gettext("High Avail. Sync"), "/system_hasync.php");
+$system_menu[] = array(gettext("Logout"), "/index.php?logout");
+if ($g['platform'] == "pfSense" or $g['platform'] == "nanobsd") {
+ $system_menu[] = array(gettext("Packages"), "/pkg_mgr_installed.php");
+}
+$system_menu[] = array(gettext("Setup Wizard"), "/wizard.php?xml=setup_wizard.xml");
+$system_menu[] = array(gettext("Routing"), "/system_gateways.php");
+$system_menu[] = array(gettext("Cert Manager"), "/system_camanager.php");
+if (!isAllowedPage("system_usermanager.php*")) {
+ $system_menu[] = array(gettext("User Manager"), "/system_usermanager_passwordmg.php");
+} else {
+ $system_menu[] = array(gettext("User Manager"), "/system_usermanager.php");
+}
+$system_menu = msort(array_merge($system_menu, return_ext_menu("System")), 0);
+
+// Interfaces
+$interfaces_menu = array();
+if (!isset($config['system']['webgui']['noassigninterfaces'])) {
+ $interfaces_menu[] = array(gettext("(assign)"), "/interfaces_assign.php");
+}
+$opts = get_configured_interface_with_descr(false, true);
+foreach ($opts as $oif => $odescr) {
+ if (!isset($config['interfaces'][$oif]['ovpn'])) {
+ $interfaces_menu[] = array(htmlspecialchars($odescr), "/interfaces.php?if={$oif}");
+ }
+}
+$interfaces_menu = msort(array_merge($interfaces_menu, return_ext_menu("Interfaces")), 0);
+
+// Firewall
+$firewall_menu = array();
+$firewall_menu[] = array(gettext("Aliases"), "/firewall_aliases.php");
+$firewall_menu[] = array(gettext("NAT"), "/firewall_nat.php");
+$firewall_menu[] = array(gettext("Rules"), "/firewall_rules.php");
+$firewall_menu[] = array(gettext("Schedules"), "/firewall_schedule.php");
+$firewall_menu[] = array(gettext("Traffic Shaper"), "/firewall_shaper.php");
+$firewall_menu[] = array(gettext("Virtual IPs"), "/firewall_virtual_ip.php");
+$firewall_menu = msort(array_merge($firewall_menu, return_ext_menu("Firewall")), 0);
+
+// Services
+$services_menu = array();
+$services_menu[] = array(gettext("Captive Portal"), "/services_captiveportal.php");
+$services_menu[] = array(gettext("DNS Forwarder"), "/services_dnsmasq.php");
+$services_menu[] = array(gettext("DNS Resolver"), "/services_unbound.php");
+$services_menu[] = array(gettext("DHCP Relay"), "/services_dhcp_relay.php");
+$services_menu[] = array(gettext("DHCPv6 Relay"), "/services_dhcpv6_relay.php");
+if ($g['services_dhcp_server_enable']) {
+ $services_menu[] = array(gettext("DHCP Server"), "/services_dhcp.php");
+ $services_menu[] = array(gettext("DHCPv6 Server/RA"), "/services_dhcpv6.php");
+}
+$services_menu[] = array(gettext("Dynamic DNS"), "/services_dyndns.php");
+$services_menu[] = array(gettext("IGMP proxy"), "/services_igmpproxy.php");
+$services_menu[] = array(gettext("Load Balancer"), "/load_balancer_pool.php");
+$services_menu[] = array(gettext("NTP"), "/services_ntpd.php");
+$services_menu[] = array(gettext("PPPoE Server"), "/vpn_pppoe.php");
+$services_menu[] = array(gettext("SNMP"), "/services_snmp.php");
+if (count($config['interfaces']) > 1) {
+ /* no use for UPnP in single-interface deployments
+ remove to reduce user confusion
+ */
+ $services_menu[] = array(gettext("UPnP &amp; NAT-PMP"), "/pkg_edit.php?xml=miniupnpd.xml");
+}
+$services_menu[] = array(gettext("Wake on LAN"), "/services_wol.php");
+$services_menu = msort(array_merge($services_menu, return_ext_menu("Services")), 0);
+
+// VPN
+$vpn_menu = array();
+$vpn_menu[] = array(gettext("IPsec"), "/vpn_ipsec.php");
+$vpn_menu[] = array(gettext("OpenVPN"), "/vpn_openvpn_server.php");
+$vpn_menu[] = array(gettext("PPTP"), "/vpn_pptp.php");
+$vpn_menu[] = array(gettext("L2TP"), "/vpn_l2tp.php");
+$vpn_menu = msort(array_merge($vpn_menu, return_ext_menu("VPN")), 0);
+
+// Status
+$status_menu = array();
+if (count($config['captiveportal']) > 0) {
+ $status_menu[] = array(gettext("Captive Portal"), "/status_captiveportal.php");
+}
+$status_menu[] = array(gettext("CARP (failover)"), "/carp_status.php");
+$status_menu[] = array(gettext("Dashboard"), "/index.php");
+$status_menu[] = array(gettext("Gateways"), "/status_gateways.php");
+$status_menu[] = array(gettext("DHCP Leases"), "/status_dhcp_leases.php");
+$status_menu[] = array(gettext("DHCPv6 Leases"), "/status_dhcpv6_leases.php");
+$status_menu[] = array(gettext("Filter Reload"), "/status_filter_reload.php");
+$status_menu[] = array(gettext("Interfaces"), "/status_interfaces.php");
+$status_menu[] = array(gettext("IPsec"), "/diag_ipsec.php");
+$status_menu[] = array(gettext("Load Balancer"), "/status_lb_pool.php");
+$status_menu[] = array(gettext("NTP"), "/status_ntpd.php");
+$status_menu[] = array(gettext("OpenVPN"), "/status_openvpn.php");
+if ($g['platform'] == "pfSense") {
+ $status_menu[] = array(gettext("Package Logs"), "/diag_pkglogs.php");
+}
+$status_menu[] = array(gettext("Queues"), "/status_queues.php");
+$status_menu[] = array(gettext("RRD Graphs"), "/status_rrd_graph.php");
+$status_menu[] = array(gettext("Services"), "/status_services.php");
+$status_menu[] = array(gettext("System Logs"), "/diag_logs.php");
+$status_menu[] = array(gettext("Traffic Graph"), "/status_graph.php?if=wan");
+if (count($config['interfaces']) > 1) {
+ $status_menu[] = array(gettext("UPnP &amp; NAT-PMP"), "/status_upnp.php");
+}
+$ifentries = get_configured_interface_with_descr();
+foreach ($ifentries as $ent => $entdesc) {
+ if (is_array($config['interfaces'][$ent]['wireless']) &&
+ preg_match($g['wireless_regex'], $config['interfaces'][$ent]['if'])) {
+ $wifdescrs[$ent] = $entdesc;
+ }
+}
+if (count($wifdescrs) > 0) {
+ $status_menu[] = array(gettext("Wireless"), "/status_wireless.php");
+}
+$status_menu = msort(array_merge($status_menu, return_ext_menu("Status")), 0);
+
+// Diagnostics
+$diagnostics_menu = array();
+$diagnostics_menu[] = array(gettext("ARP Table"), "/diag_arp.php");
+$diagnostics_menu[] = array(gettext("Authentication"), "/diag_authentication.php");
+$diagnostics_menu[] = array(gettext("Backup/Restore"), "/diag_backup.php");
+$diagnostics_menu[] = array(gettext("Command Prompt"), "/exec.php");
+$diagnostics_menu[] = array(gettext("DNS Lookup"), "/diag_dns.php");
+$diagnostics_menu[] = array(gettext("Edit File"), "/edit.php");
+$diagnostics_menu[] = array(gettext("Factory Defaults"), "/diag_defaults.php");
+
+if (file_exists("/var/run/gmirror_active")) {
+ $diagnostics_menu[] = array(gettext("GEOM Mirrors"), "/diag_gmirror.php");
+}
+$diagnostics_menu[] = array(gettext("Halt System"), "/halt.php");
+$diagnostics_menu[] = array(gettext("Limiter Info"), "/diag_limiter_info.php");
+$diagnostics_menu[] = array(gettext("NDP Table"), "/diag_ndp.php");
+
+$diagnostics_menu[] = array(gettext("Tables"), "/diag_tables.php");
+$diagnostics_menu[] = array(gettext("Ping"), "/diag_ping.php");
+$diagnostics_menu[] = array(gettext("Test Port"), "/diag_testport.php");
+$diagnostics_menu[] = array(gettext("pfInfo"), "/diag_pf_info.php");
+$diagnostics_menu[] = array(gettext("pfTop"), "/diag_system_pftop.php");
+$diagnostics_menu[] = array(gettext("Reboot"), "/reboot.php");
+$diagnostics_menu[] = array(gettext("Routes"), "/diag_routes.php");
+$diagnostics_menu[] = array(gettext("SMART Status"), "/diag_smart.php");
+$diagnostics_menu[] = array(gettext("Sockets"), "/diag_sockets.php");
+$diagnostics_menu[] = array(gettext("States"), "/diag_dump_states.php");
+$diagnostics_menu[] = array(gettext("States Summary"), "/diag_states_summary.php");
+$diagnostics_menu[] = array(gettext("System Activity"), "/diag_system_activity.php");
+$diagnostics_menu[] = array(gettext("Traceroute"), "/diag_traceroute.php");
+$diagnostics_menu[] = array(gettext("Packet Capture"), "/diag_packet_capture.php");
+if ($g['platform'] == "nanobsd") {
+ $diagnostics_menu[] = array(gettext("NanoBSD"), "/diag_nanobsd.php");
+}
+
+if (isset($config['system']['developer'])) {
+ $diagnostics_menu[] = array(gettext("Restart HTTPD"), "/restart_httpd.php", "style" => "font-weight: bold; color: yellow;");
+}
+$diagnostics_menu = msort(array_merge($diagnostics_menu, return_ext_menu("Diagnostics")), 0);
+
+$gold_menu = array();
+$gold_menu[] = array(gettext("pfSense Gold"), "https://www.pfsense.org/gold");
+$gold_menu = msort(array_merge($gold_menu, return_ext_menu("Gold")), 0);
+
+if (!$g['disablehelpmenu']) {
+ $help_menu = array();
+ $help_menu[] = array(gettext("About this Page"), $helpurl);
+ if ($g['product_name'] == "pfSense") {
+ $help_menu[] = array(gettext("Bug Database"), "https://www.pfsense.org/j.php?jumpto=redmine");
+ }
+ $help_menu[] = array(gettext("User Forum"), "https://www.pfsense.org/j.php?jumpto=forum");
+ $help_menu[] = array(gettext("Documentation"), "https://www.pfsense.org/j.php?jumpto=doc");
+ $help_menu[] = array(gettext("Developers Wiki"), "https://www.pfsense.org/j.php?jumpto=devwiki");
+ $help_menu[] = array(gettext("Paid Support"), "https://www.pfsense.org/j.php?jumpto=portal");
+ $help_menu[] = array(gettext("pfSense Book"), "https://www.pfsense.org/j.php?jumpto=book");
+ $help_menu[] = array(gettext("Search portal"), "https://www.pfsense.org/j.php?jumpto=searchportal");
+ $help_menu[] = array(gettext("FreeBSD Handbook"), "https://www.pfsense.org/j.php?jumpto=fbsdhandbook");
+ $help_menu = msort(array_merge($help_menu, return_ext_menu("Help")), 0);
+}
+
+?>
+
+<div id="wrapper">
+ <div id="header">
+ <div id="header-left"><a href="/index.php" id="status-link"><img src="/themes/<?= $g['theme']; ?>/images/transparent.gif" border="0" alt="transparent" /></a></div>
+ <div id="header-right">
+ <div class="container">
+ <div class="left">webConfigurator</div>
+ <div class="right" id="menu_messages">
+<?php
+ echo get_menu_messages();
+?>
+ </div>
+ </div>
+ </div>
+ </div> <!-- Header DIV -->
+ <div id="content">
+ <div id="left">
+ <div id="navigation" style="z-index:1000;">
+ <ul id="menu">
+ <li class="firstdrop">
+ <div><?php echo gettext("System"); ?></div>
+ <ul class="subdrop">
+ <?php
+ output_menu($system_menu);
+ ?>
+ </ul>
+ </li>
+ <li class="drop">
+ <div><?php echo gettext("Interfaces"); ?></div>
+ <ul class="subdrop">
+ <?php
+ output_menu($interfaces_menu);
+ ?>
+ </ul>
+ </li>
+ <li class="drop">
+ <div><?php echo gettext("Firewall"); ?></div>
+ <ul class="subdrop">
+ <?php
+ output_menu($firewall_menu);
+ ?>
+ </ul>
+ </li>
+ <li class="drop">
+ <div><?php echo gettext("Services"); ?></div>
+ <ul class="subdrop">
+ <?php
+ output_menu($services_menu);
+ ?>
+ </ul>
+ </li>
+ <li class="drop">
+ <div><?php echo gettext("VPN"); ?></div>
+ <ul class="subdrop">
+ <?php
+ output_menu($vpn_menu);
+ ?>
+ </ul>
+ </li>
+ <li class="drop">
+ <div><?php echo gettext("Status"); ?></div>
+ <ul class="subdrop">
+ <?php
+ output_menu($status_menu);
+ ?>
+ </ul>
+ </li>
+ <li class="drop">
+ <div><?php echo gettext("Diagnostics"); ?></div>
+ <ul id="diag" class="subdrop">
+ <?php
+ output_menu($diagnostics_menu);
+ ?>
+ </ul>
+ </li>
+ <li class="drop">
+ <div><?php echo gettext("Gold"); ?></div>
+ <ul id="gold" class="subdrop">
+ <?php
+ output_menu($gold_menu, "_blank");
+ ?>
+ </ul>
+ </li>
+ <?php if (!$g['disablehelpmenu']): ?>
+ <li class="lastdrop">
+ <div><?php echo gettext("Help"); ?></div>
+ <ul id="help" class="subdrop">
+ <?php
+ output_menu($help_menu, "_blank");
+ ?>
+ </ul>
+ </li>
+ <?php endif; ?>
+ </ul>
+ </div>
+
+ </div> <!-- Left DIV -->
+
+ <div id="right">
+
+<?php
+echo "\t<script type=\"text/javascript\" src=\"/javascript/domTT/domLib.js\"></script>\n";
+echo "\t<script type=\"text/javascript\" src=\"/javascript/domTT/domTT.js\"></script>\n";
+echo "\t<script type=\"text/javascript\" src=\"/javascript/domTT/behaviour.js\"></script>\n";
+echo "\t<script type=\"text/javascript\" src=\"/javascript/domTT/fadomatic.js\"></script>\n";
+/* display a top alert bar if need be */
+$need_alert_display = false;
+$found_notices = are_notices_pending();
+if ($found_notices == true) {
+ $notices = get_notices();
+ if (!$notices) {
+ $need_alert_display = true;
+ $display_text = print_notices($notices) . "<br />";
+ }
+}
+if ($need_alert_display == true) {
+ echo "<div style=\"background-color:#000000\" id=\"roundalert\">";
+ echo "<table summary=\"round alert\">";
+ echo "<tr><td><font color=\"#ffffff\">";
+ echo "&nbsp;&nbsp;<img align=\"middle\" src=\"/top_notification.gif\" alt=\"notification\" />&nbsp;&nbsp;&nbsp;";
+ echo $display_text;
+ echo "</font></td>";
+ echo "</tr>";
+ echo "</table>";
+ echo "</div>";
+}
+
+function add_to_menu($url, $name) {
+ if (isAllowedPage($url)) {
+ echo "<li><a href=\"{$url}\" class=\"navlnk\">{$name}</a></li>\n";
+ }
+}
+
+?>
+
+<div>
+<span class="pgtitle"><a href="<?= htmlentities($_SERVER['REQUEST_URI']) ?>"><?=genhtmltitle($pgtitle);?></a></span>
+<span style="float:right; margin: 0 0 20px 20px">
+<?php
+if (!$hide_service_status && !empty($shortcuts[$shortcut_section]['service'])) {
+ $ssvc = array();
+ switch ($shortcut_section) {
+ case "openvpn":
+ $ssvc = find_service_by_openvpn_vpnid($vpnid);
+ break;
+ case "captiveportal":
+ $ssvc = find_service_by_cp_zone($cpzone);
+ break;
+ default:
+ $ssvc = find_service_by_name($shortcuts[$shortcut_section]['service']);
+
+ }
+ if (!empty($ssvc)) {
+ echo get_service_status_icon($ssvc, false);
+ echo get_service_control_links($ssvc, true);
+ }
+}
+
+echo get_shortcut_main_link($shortcut_section, true);
+echo get_shortcut_status_link($shortcut_section, true);
+echo get_shortcut_log_link($shortcut_section, true);
+
+?>
+<?php if (!$g['disablehelpicon']): ?>
+
+<a href="<?php echo $helpurl; ?>" title="<?php echo gettext("Help for items on this page"); ?>"><img style="vertical-align:middle" src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_help.gif" border="0" alt="help" /></a>
+<?php endif; ?>
+</span>
+</div>
+<br />
+
+<?php
+/* if upgrade in progress, alert user */
+if (is_subsystem_dirty('packagelock') || (file_exists('/conf/needs_package_sync') && platform_booting())) {
+ if (file_exists('/conf/needs_package_sync') && platform_booting()) {
+ $info_text = sprintf(gettext("%s is booting then packages will be reinstalled in the background.<p>Do not make changes in the GUI until this is complete."), $g['product_name']);
+ } else {
+ $pgtitle = array(gettext("System"), gettext("Package Manager"));
+ $info_text = gettext("Packages are currently being reinstalled in the background.<p>Do not make changes in the GUI until this is complete.");
+ }
+ print_info_box($info_text . "<p><img src='/themes/{$g['theme']}/images/icons/icon_fw-update.gif' alt='firmware update' />");
+}
+$pgtitle_output = true;
+?>
diff --git a/src/usr/local/www/fend.inc b/src/usr/local/www/fend.inc
new file mode 100755
index 0000000..f1cbdb9
--- /dev/null
+++ b/src/usr/local/www/fend.inc
@@ -0,0 +1,27 @@
+<!--
+ pfSense_MODULE: footer
+-->
+
+ </div> <!-- Right DIV -->
+
+ </div> <!-- Content DIV -->
+
+ <div id="footer">
+ <a target="_blank" href="<?=$g['product_website_footer']?>" class="redlnk"><?=$g['product_name']?></a> is &copy;
+ <?=$g['product_copyright_years']?> by <a href="<?=$g['product_copyright_url']?>" class="tblnk"><?=$g['product_copyright']?></a>. All Rights Reserved.
+ [<a href="/license.php" class="tblnk">view license</a>]
+ </div> <!-- Footer DIV -->
+
+</div> <!-- Wrapper Div -->
+
+<?php outputJavaScriptFileInline("/usr/local/www/themes/{$g['theme']}/bottom-loader.js");
+/* Disable form autocomplete on all but the login screen. */
+if (basename($_SERVER["SCRIPT_FILENAME"] != "index.php") && !$allowautocomplete): ?>
+<script type="text/javascript">
+//<![CDATA[
+(function ($) {
+ $("input").attr("autocomplete","off");
+})(jQuery);
+//]]>
+</script>
+<?php endif; ?>
diff --git a/src/usr/local/www/filebrowser/browser.js b/src/usr/local/www/filebrowser/browser.js
new file mode 100644
index 0000000..2769db3
--- /dev/null
+++ b/src/usr/local/www/filebrowser/browser.js
@@ -0,0 +1,48 @@
+/*
+ pfSense_MODULE: shell
+*/
+
+jQuery(document).ready(
+ function() {
+ jQuery("#fbOpen").click(
+ function() {
+ jQuery("#fbBrowser").fadeIn(750);
+ fbBrowse(jQuery("#fbTarget").val());
+ }
+ );
+ }
+);
+
+function fbBrowse(path) {
+ jQuery("#fileContent").fadeOut();
+
+ if (jQuery("#fbCurrentDir")) {
+ jQuery("#fbCurrentDir").html("Loading ...");
+ }
+
+ jQuery.ajax(
+ "/filebrowser/browser.php?path=" + encodeURI(path ? path : "/"),
+ { type: "get", complete: fbComplete }
+ );
+
+}
+
+function fbComplete(req) {
+ jQuery("#fbBrowser").html(req.responseText);
+
+ var actions = {
+ fbHome: function() { fbBrowse("/"); },
+ fbClose: function() { jQuery("#fbBrowser").fadeOut(750); },
+ fbDir: function() { fbBrowse(this.id); },
+ fbFile: function() { jQuery("#fbTarget").val(this.id); }
+ }
+
+ for (var type in actions) {
+ jQuery("#fbBrowser ." + type).each(
+ function() {
+ jQuery(this).click(actions[type]);
+ jQuery(this).css("cursor","pointer");
+ }
+ );
+ }
+}
diff --git a/src/usr/local/www/filebrowser/browser.php b/src/usr/local/www/filebrowser/browser.php
new file mode 100644
index 0000000..8ab05db
--- /dev/null
+++ b/src/usr/local/www/filebrowser/browser.php
@@ -0,0 +1,165 @@
+<?php
+
+require_once("guiconfig.inc");
+
+/*
+ pfSense_MODULE: shell
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+*/
+// Fetch a list of directories and files inside a given directory
+function get_content($dir) {
+ $dirs = array();
+ $files = array();
+
+ clearstatcache();
+ $fd = @opendir($dir);
+
+ while ($entry = @readdir($fd)) {
+ if ($entry == ".") {
+ continue;
+ }
+ if ($entry == ".." && $dir == "/") {
+ continue;
+ }
+ if (is_dir("{$dir}/{$entry}")) {
+ array_push($dirs, $entry);
+ } else {
+ array_push($files, $entry);
+ }
+ }
+
+ @closedir($fd);
+
+ natsort($dirs);
+ natsort($files);
+
+ return array($dirs, $files);
+}
+
+$path = realpath(strlen($_GET['path']) > 0 ? $_GET['path'] : "/");
+if (is_file($path)) {
+ $path = dirname($path);
+}
+
+// ----- header -----
+?>
+<table width="100%">
+ <tr>
+ <td class="fbHome" width="25px" align="left">
+ <img onClick="jQuery('#fbTarget').val('<?=$realDir?>'); fbBrowse('/');" src="/filebrowser/images/icon_home.gif" alt="Home" title="Home" />
+ </td>
+ <td><b><?=$path;?></b></td>
+ <td class="fbClose" align="right">
+ <img onClick="jQuery('#fbBrowser').fadeOut();" border="0" src="/filebrowser/images/icon_cancel.gif" alt="Close" title="Close" />
+ </td>
+ </tr>
+ <tr>
+ <td id="fbCurrentDir" colspan="3" class="vexpl" align="left">
+<?php
+
+// ----- read contents -----
+if (is_dir($path)) {
+ list($dirs, $files) = get_content($path);
+?>
+
+ </td>
+ </tr>
+<?php
+} else {
+?>
+ Directory does not exist.
+ </td>
+ </tr>
+</table>
+<?php
+ exit;
+}
+
+// ----- directories -----
+foreach ($dirs as $dir):
+ $realDir = realpath("{$path}/{$dir}");
+?>
+ <tr>
+ <td></td>
+ <td class="fbDir vexpl" id="<?=$realDir;?>" align="left">
+ <div onClick="jQuery('#fbTarget').val('<?=$realDir?>'); fbBrowse('<?=$realDir?>');">
+ <img src="/filebrowser/images/folder_generic.gif" />
+ &nbsp;<?=$dir;?>
+ </div>
+ </td>
+ <td></td>
+ </tr>
+<?php
+endforeach;
+
+// ----- files -----
+foreach ($files as $file):
+ $ext = strrchr($file, ".");
+
+ switch ($ext) {
+ case ".css":
+ case ".html":
+ case ".xml":
+ $type = "code";
+ break;
+ case ".rrd":
+ $type = "database";
+ break;
+ case ".gif":
+ case ".jpg":
+ case ".png":
+ $type = "image";
+ break;
+ case ".js":
+ $type = "js";
+ break;
+ case ".pdf":
+ $type = "pdf";
+ break;
+ case ".inc":
+ case ".php":
+ $type = "php";
+ break;
+ case ".conf":
+ case ".pid":
+ case ".sh":
+ $type = "system";
+ break;
+ case ".bz2":
+ case ".gz":
+ case ".tgz":
+ case ".zip":
+ $type = "zip";
+ break;
+ default:
+ $type = "generic";
+ }
+
+ $fqpn = "{$path}/{$file}";
+
+ if (is_file($fqpn)) {
+ $fqpn = realpath($fqpn);
+ $size = sprintf("%.2f KiB", filesize($fqpn) / 1024);
+ } else {
+ $size = "";
+ }
+
+?>
+ <tr>
+ <td></td>
+ <td class="fbFile vexpl" id="<?=$fqpn;?>" align="left">
+ <?php $filename = str_replace("//","/", "{$path}/{$file}"); ?>
+ <div onClick="jQuery('#fbTarget').val('<?=$filename?>'); loadFile(); jQuery('#fbBrowser').fadeOut();">
+ <img src="/filebrowser/images/file_<?=$type;?>.gif" alt="" title="">
+ &nbsp;<?=$file;?>
+ </div>
+ </td>
+ <td align="right" class="vexpl">
+ <?=$size;?>
+ </td>
+ </tr>
+<?php
+endforeach;
+?>
+</table>
diff --git a/src/usr/local/www/filebrowser/images/file_code.gif b/src/usr/local/www/filebrowser/images/file_code.gif
new file mode 100755
index 0000000..f06a205
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_code.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_database.gif b/src/usr/local/www/filebrowser/images/file_database.gif
new file mode 100755
index 0000000..d479c91
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_database.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_doc.gif b/src/usr/local/www/filebrowser/images/file_doc.gif
new file mode 100755
index 0000000..222c31b
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_doc.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_flash.gif b/src/usr/local/www/filebrowser/images/file_flash.gif
new file mode 100755
index 0000000..e565c37
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_flash.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_generic.gif b/src/usr/local/www/filebrowser/images/file_generic.gif
new file mode 100755
index 0000000..5f39482
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_generic.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_image.gif b/src/usr/local/www/filebrowser/images/file_image.gif
new file mode 100755
index 0000000..4960683
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_image.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_js.gif b/src/usr/local/www/filebrowser/images/file_js.gif
new file mode 100755
index 0000000..9b6601f
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_js.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_pdf.gif b/src/usr/local/www/filebrowser/images/file_pdf.gif
new file mode 100755
index 0000000..b01bb23
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_pdf.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_php.gif b/src/usr/local/www/filebrowser/images/file_php.gif
new file mode 100755
index 0000000..ab7f459
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_php.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_ppt.gif b/src/usr/local/www/filebrowser/images/file_ppt.gif
new file mode 100755
index 0000000..0383c98
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_ppt.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_system.gif b/src/usr/local/www/filebrowser/images/file_system.gif
new file mode 100755
index 0000000..f1997c7
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_system.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_xls.gif b/src/usr/local/www/filebrowser/images/file_xls.gif
new file mode 100755
index 0000000..d004013
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_xls.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/file_zip.gif b/src/usr/local/www/filebrowser/images/file_zip.gif
new file mode 100755
index 0000000..ec98255
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/file_zip.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/folder_generic.gif b/src/usr/local/www/filebrowser/images/folder_generic.gif
new file mode 100755
index 0000000..45b191d
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/folder_generic.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/icon_cancel.gif b/src/usr/local/www/filebrowser/images/icon_cancel.gif
new file mode 100755
index 0000000..246a819
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/icon_cancel.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/icon_contract.gif b/src/usr/local/www/filebrowser/images/icon_contract.gif
new file mode 100755
index 0000000..cf82159
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/icon_contract.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/icon_expand.gif b/src/usr/local/www/filebrowser/images/icon_expand.gif
new file mode 100755
index 0000000..06c0c68
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/icon_expand.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/icon_home.gif b/src/usr/local/www/filebrowser/images/icon_home.gif
new file mode 100755
index 0000000..f888434
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/icon_home.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/icon_left.gif b/src/usr/local/www/filebrowser/images/icon_left.gif
new file mode 100755
index 0000000..0d1137c
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/filebrowser/images/icon_magnifier.gif b/src/usr/local/www/filebrowser/images/icon_magnifier.gif
new file mode 100755
index 0000000..e96e548
--- /dev/null
+++ b/src/usr/local/www/filebrowser/images/icon_magnifier.gif
Binary files differ
diff --git a/src/usr/local/www/firewall_aliases.php b/src/usr/local/www/firewall_aliases.php
new file mode 100644
index 0000000..950a8a2
--- /dev/null
+++ b/src/usr/local/www/firewall_aliases.php
@@ -0,0 +1,311 @@
+<?php
+/* $Id$ */
+/*
+ firewall_aliases.php
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: aliases
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-aliases
+##|*NAME=Firewall: Aliases page
+##|*DESCR=Allow access to the 'Firewall: Aliases' page.
+##|*MATCH=firewall_aliases.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+if (!is_array($config['aliases']['alias'])) {
+ $config['aliases']['alias'] = array();
+}
+$a_aliases = &$config['aliases']['alias'];
+
+$tab = ($_REQUEST['tab'] == "" ? "ip" : preg_replace("/\W/", "", $_REQUEST['tab']));
+
+if ($_POST) {
+
+ if ($_POST['apply']) {
+ $retval = 0;
+
+ /* reload all components that use aliases */
+ $retval = filter_configure();
+
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+ if ($retval == 0) {
+ clear_subsystem_dirty('aliases');
+ }
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_aliases[$_GET['id']]) {
+ /* make sure rule is not being referenced by any nat or filter rules */
+ $is_alias_referenced = false;
+ $referenced_by = false;
+ $alias_name = $a_aliases[$_GET['id']]['name'];
+ // Firewall rules
+ find_alias_reference(array('filter', 'rule'), array('source', 'address'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('filter', 'rule'), array('destination', 'address'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('filter', 'rule'), array('source', 'port'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('filter', 'rule'), array('destination', 'port'), $alias_name, $is_alias_referenced, $referenced_by);
+ // NAT Rules
+ find_alias_reference(array('nat', 'rule'), array('source', 'address'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'rule'), array('source', 'port'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'rule'), array('destination', 'address'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'rule'), array('destination', 'port'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'rule'), array('target'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'rule'), array('local-port'), $alias_name, $is_alias_referenced, $referenced_by);
+ // NAT 1:1 Rules
+ //find_alias_reference(array('nat', 'onetoone'), array('external'), $alias_name, $is_alias_referenced, $referenced_by);
+ //find_alias_reference(array('nat', 'onetoone'), array('source', 'address'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'onetoone'), array('destination', 'address'), $alias_name, $is_alias_referenced, $referenced_by);
+ // NAT Outbound Rules
+ find_alias_reference(array('nat', 'outbound', 'rule'), array('source', 'network'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'outbound', 'rule'), array('sourceport'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'outbound', 'rule'), array('destination', 'address'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'outbound', 'rule'), array('dstport'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('nat', 'outbound', 'rule'), array('target'), $alias_name, $is_alias_referenced, $referenced_by);
+ // Alias in an alias
+ find_alias_reference(array('aliases', 'alias'), array('address'), $alias_name, $is_alias_referenced, $referenced_by);
+ // Load Balancer
+ find_alias_reference(array('load_balancer', 'lbpool'), array('port'), $alias_name, $is_alias_referenced, $referenced_by);
+ find_alias_reference(array('load_balancer', 'virtual_server'), array('port'), $alias_name, $is_alias_referenced, $referenced_by);
+ // Static routes
+ find_alias_reference(array('staticroutes', 'route'), array('network'), $alias_name, $is_alias_referenced, $referenced_by);
+ if ($is_alias_referenced == true) {
+ $savemsg = sprintf(gettext("Cannot delete alias. Currently in use by %s"), $referenced_by);
+ } else {
+ unset($a_aliases[$_GET['id']]);
+ if (write_config()) {
+ filter_configure();
+ mark_subsystem_dirty('aliases');
+ }
+ header("Location: firewall_aliases.php?tab=" . $tab);
+ exit;
+ }
+ }
+}
+
+function find_alias_reference($section, $field, $origname, &$is_alias_referenced, &$referenced_by) {
+ global $config;
+ if (!$origname || $is_alias_referenced) {
+ return;
+ }
+
+ $sectionref = &$config;
+ foreach ($section as $sectionname) {
+ if (is_array($sectionref) && isset($sectionref[$sectionname])) {
+ $sectionref = &$sectionref[$sectionname];
+ } else {
+ return;
+ }
+ }
+
+ if (is_array($sectionref)) {
+ foreach ($sectionref as $itemkey => $item) {
+ $fieldfound = true;
+ $fieldref = &$sectionref[$itemkey];
+ foreach ($field as $fieldname) {
+ if (is_array($fieldref) && isset($fieldref[$fieldname])) {
+ $fieldref = &$fieldref[$fieldname];
+ } else {
+ $fieldfound = false;
+ break;
+ }
+ }
+ if ($fieldfound && $fieldref == $origname) {
+ $is_alias_referenced = true;
+ if (is_array($item)) {
+ $referenced_by = $item['descr'];
+ }
+ break;
+ }
+ }
+ }
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("Aliases"));
+$shortcut_section = "aliases";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="firewall_aliases.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('aliases')): ?><p>
+<?php print_info_box_np(gettext("The alias list has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));?>
+<?php endif; ?>
+<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases/pre_table"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall aliases">
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("IP"), ($tab == "ip" ? true : ($tab == "host" ? true : ($tab == "network" ? true : false))), "/firewall_aliases.php?tab=ip");
+ $tab_array[] = array(gettext("Ports"), ($tab == "port"? true : false), "/firewall_aliases.php?tab=port");
+ $tab_array[] = array(gettext("URLs"), ($tab == "url"? true : false), "/firewall_aliases.php?tab=url");
+ $tab_array[] = array(gettext("All"), ($tab == "all"? true : false), "/firewall_aliases.php?tab=all");
+ display_top_tabs($tab_array);
+ ?>
+ <input type="hidden" name="tab" value="<?=htmlspecialchars($tab);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Name"); ?></td>
+ <td width="43%" class="listhdrr"><?=gettext("Values"); ?></td>
+ <td width="30%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="7%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17">&nbsp;</td>
+ <td valign="middle"><a href="firewall_aliases_edit.php?tab=<?=$tab?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" <?=dom_title(gettext("Add a new alias"));?> alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ asort($a_aliases);
+ foreach ($a_aliases as $i=> $alias) {
+ unset ($show_alias);
+ switch ($tab) {
+ case "all":
+ $show_alias= true;
+ break;
+ case "ip":
+ case "host":
+ case "network":
+ if (preg_match("/(host|network)/", $alias["type"])) {
+ $show_alias= true;
+ }
+ break;
+ case "url":
+ if (preg_match("/(url)/i", $alias["type"])) {
+ $show_alias= true;
+ }
+ break;
+ case "port":
+ if ($alias["type"] == "port") {
+ $show_alias= true;
+ }
+ break;
+ }
+ if ($show_alias) {
+ ?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='firewall_aliases_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($alias['name']);?>
+ </td>
+ <td class="listr" ondblclick="document.location='firewall_aliases_edit.php?id=<?=$i;?>';">
+ <?php
+ if ($alias["url"]) {
+ echo $alias["url"] . "<br />";
+ } else {
+ if (is_array($alias["aliasurl"])) {
+ $aliasurls = implode(", ", array_slice($alias["aliasurl"], 0, 10));
+ echo $aliasurls;
+ if (count($aliasurls) > 10) {
+ echo "...<br />";
+ }
+ echo "<br />\n";
+ }
+ $tmpaddr = explode(" ", $alias['address']);
+ $addresses = implode(", ", array_slice($tmpaddr, 0, 10));
+ echo $addresses;
+ if (count($tmpaddr) > 10) {
+ echo "...";
+ }
+ }
+ ?>
+ </td>
+ <td class="listbg" ondblclick="document.location='firewall_aliases_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($alias['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="firewall_aliases_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" <?=dom_title(gettext("Edit alias")." {$alias['name']}");?> alt="edit" /></a></td>
+ <td><a href="firewall_aliases.php?act=del&amp;tab=<?=$tab;?>&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this alias? All elements that still use it will become invalid (e.g. filter rules)!");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" <?=dom_title(gettext("Delete alias")." {$alias['name']}");?> alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ } // if ($show_alias)
+ } // foreach
+ ?>
+
+ <tr>
+ <td colspan="3">&nbsp;</td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tbody>
+ <tr>
+ <td valign="middle">
+ <a href="firewall_aliases_edit.php?tab=<?=$tab?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" <?=dom_title(gettext("Add a new alias")); ?> alt="add" /></a>
+ </td>
+ <td valign="middle">
+ <a href="firewall_aliases_import.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_import_alias.gif" width="17" height="17" border="0" <?=dom_title(gettext("Bulk import aliases from list"));?> alt="import" /></a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="tabcont" colspan="3">
+ <p><span class="vexpl"><span class="red"><strong><?=gettext("Note:"); ?><br /></strong></span></span></p><div style="overflow:hidden; text-align:justify;"><p><span class="vexpl"><?=gettext("Aliases act as placeholders for real hosts, networks or ports. They can be used to minimize the number of changes that have to be made if a host, network or port changes. You can enter the name of an alias instead of the host, network or port in all fields that have a red background. The alias will be resolved according to the list above. If an alias cannot be resolved (e.g. because you deleted it), the corresponding element (e.g. filter/NAT/shaper rule) will be considered invalid and skipped."); ?></span></p></div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_aliases_edit.php b/src/usr/local/www/firewall_aliases_edit.php
new file mode 100755
index 0000000..638d1f1
--- /dev/null
+++ b/src/usr/local/www/firewall_aliases_edit.php
@@ -0,0 +1,890 @@
+<?php
+/* $Id$ */
+/*
+ firewall_aliases_edit.php
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2009 Ermal Luçi
+ Copyright (C) 2010 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm /bin/mkdir /usr/bin/fetch
+ pfSense_MODULE: aliases
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-alias-edit
+##|*NAME=Firewall: Alias: Edit page
+##|*DESCR=Allow access to the 'Firewall: Alias: Edit' page.
+##|*MATCH=firewall_aliases_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$pgtitle = array(gettext("Firewall"), gettext("Aliases"), gettext("Edit"));
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_aliases.php');
+}
+
+// Keywords not allowed in names
+$reserved_keywords = array("all", "pass", "block", "out", "queue", "max", "min", "pptp", "pppoe", "L2TP", "OpenVPN", "IPsec");
+
+// Add all Load balance names to reserved_keywords
+if (is_array($config['load_balancer']['lbpool'])) {
+ foreach ($config['load_balancer']['lbpool'] as $lbpool) {
+ $reserved_keywords[] = $lbpool['name'];
+ }
+}
+
+$reserved_ifs = get_configured_interface_list(false, true);
+$reserved_keywords = array_merge($reserved_keywords, $reserved_ifs, $reserved_table_names);
+$max_alias_addresses = 5000;
+
+if (!is_array($config['aliases']['alias'])) {
+ $config['aliases']['alias'] = array();
+}
+$a_aliases = &$config['aliases']['alias'];
+
+$tab = $_REQUEST['tab'];
+
+if ($_POST) {
+ $origname = $_POST['origname'];
+}
+
+// Debugging
+if ($debug) {
+ unlink_if_exists("{$g['tmp_path']}/alias_rename_log.txt");
+}
+
+function alias_same_type($name, $type) {
+ global $config;
+
+ foreach ($config['aliases']['alias'] as $alias) {
+ if ($name == $alias['name']) {
+ if (in_array($type, array("host", "network")) &&
+ in_array($alias['type'], array("host", "network"))) {
+ return true;
+ }
+ if ($type == $alias['type']) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_aliases[$id]) {
+ $original_alias_name = $a_aliases[$id]['name'];
+ $pconfig['name'] = $a_aliases[$id]['name'];
+ $pconfig['detail'] = $a_aliases[$id]['detail'];
+ $pconfig['address'] = $a_aliases[$id]['address'];
+ $pconfig['type'] = $a_aliases[$id]['type'];
+ $pconfig['descr'] = html_entity_decode($a_aliases[$id]['descr']);
+
+ if (preg_match("/urltable/i", $a_aliases[$id]['type'])) {
+ $pconfig['address'] = $a_aliases[$id]['url'];
+ $pconfig['updatefreq'] = $a_aliases[$id]['updatefreq'];
+ }
+ if ($a_aliases[$id]['aliasurl'] <> "") {
+ if (is_array($a_aliases[$id]['aliasurl'])) {
+ $pconfig['address'] = implode(" ", $a_aliases[$id]['aliasurl']);
+ } else {
+ $pconfig['address'] = $a_aliases[$id]['aliasurl'];
+ }
+ }
+}
+
+if ($_POST) {
+ unset($input_errors);
+ $vertical_bar_err_text = gettext("Vertical bars (|) at start or end, or double in the middle of descriptions not allowed. Descriptions have been cleaned. Check and save again.");
+
+ /* input validation */
+
+ $reqdfields = explode(" ", "name");
+ $reqdfieldsn = array(gettext("Name"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ $x = is_validaliasname($_POST['name']);
+ if (!isset($x)) {
+ $input_errors[] = gettext("Reserved word used for alias name.");
+ } else if ($_POST['type'] == "port" && (getservbyname($_POST['name'], "tcp") || getservbyname($_POST['name'], "udp"))) {
+ $input_errors[] = gettext("Reserved word used for alias name.");
+ } else {
+ if (is_validaliasname($_POST['name']) == false) {
+ $input_errors[] = gettext("The alias name must be less than 32 characters long, may not consist of only numbers, and may only contain the following characters") . " a-z, A-Z, 0-9, _.";
+ }
+ }
+ /* check for name conflicts */
+ if (empty($a_aliases[$id])) {
+ foreach ($a_aliases as $alias) {
+ if ($alias['name'] == $_POST['name']) {
+ $input_errors[] = gettext("An alias with this name already exists.");
+ break;
+ }
+ }
+ }
+
+ /* Check for reserved keyword names */
+ foreach ($reserved_keywords as $rk) {
+ if ($rk == $_POST['name']) {
+ $input_errors[] = sprintf(gettext("Cannot use a reserved keyword as alias name %s"), $rk);
+ }
+ }
+
+ /* check for name interface description conflicts */
+ foreach ($config['interfaces'] as $interface) {
+ if ($interface['descr'] == $_POST['name']) {
+ $input_errors[] = gettext("An interface description with this name already exists.");
+ break;
+ }
+ }
+
+ $alias = array();
+ $address = array();
+ $final_address_details = array();
+ $alias['name'] = $_POST['name'];
+
+ if (preg_match("/urltable/i", $_POST['type'])) {
+ $address = "";
+
+ /* item is a url table type */
+ if ($_POST['address0']) {
+ /* fetch down and add in */
+ $_POST['address0'] = trim($_POST['address0']);
+ $address[] = $_POST['address0'];
+ $alias['url'] = $_POST['address0'];
+ $alias['updatefreq'] = $_POST['address_subnet0'] ? $_POST['address_subnet0'] : 7;
+ if (!is_URL($alias['url']) || empty($alias['url'])) {
+ $input_errors[] = gettext("You must provide a valid URL.");
+ } elseif (!process_alias_urltable($alias['name'], $alias['url'], 0, true)) {
+ $input_errors[] = gettext("Unable to fetch usable data.");
+ }
+ if ($_POST["detail0"] <> "") {
+ if ((strpos($_POST["detail0"], "||") === false) && (substr($_POST["detail0"], 0, 1) != "|") && (substr($_POST["detail0"], -1, 1) != "|")) {
+ $final_address_details[] = $_POST["detail0"];
+ } else {
+ /* Remove leading and trailing vertical bars and replace multiple vertical bars with single, */
+ /* and put in the output array so the text is at least redisplayed for the user. */
+ $final_address_details[] = preg_replace('/\|\|+/', '|', trim($_POST["detail0"], "|"));
+ $input_errors[] = $vertical_bar_err_text;
+ }
+ } else {
+ $final_address_details[] = sprintf(gettext("Entry added %s"), date('r'));
+ }
+ }
+ } else if ($_POST['type'] == "url" || $_POST['type'] == "url_ports") {
+ $desc_fmt_err_found = false;
+
+ /* item is a url type */
+ for ($x = 0; $x < $max_alias_addresses - 1; $x++) {
+ $_POST['address' . $x] = trim($_POST['address' . $x]);
+ if ($_POST['address' . $x]) {
+ /* fetch down and add in */
+ $temp_filename = tempnam("{$g['tmp_path']}/", "alias_import");
+ unlink_if_exists($temp_filename);
+ $verify_ssl = isset($config['system']['checkaliasesurlcert']);
+ mkdir($temp_filename);
+ download_file($_POST['address' . $x], $temp_filename . "/aliases", $verify_ssl);
+
+ /* if the item is tar gzipped then extract */
+ if (stristr($_POST['address' . $x], ".tgz")) {
+ process_alias_tgz($temp_filename);
+ } else if (stristr($_POST['address' . $x], ".zip")) {
+ process_alias_unzip($temp_filename);
+ }
+
+ if (!isset($alias['aliasurl'])) {
+ $alias['aliasurl'] = array();
+ }
+
+ $alias['aliasurl'][] = $_POST['address' . $x];
+ if ($_POST["detail{$x}"] <> "") {
+ if ((strpos($_POST["detail{$x}"], "||") === false) && (substr($_POST["detail{$x}"], 0, 1) != "|") && (substr($_POST["detail{$x}"], -1, 1) != "|")) {
+ $final_address_details[] = $_POST["detail{$x}"];
+ } else {
+ /* Remove leading and trailing vertical bars and replace multiple vertical bars with single, */
+ /* and put in the output array so the text is at least redisplayed for the user. */
+ $final_address_details[] = preg_replace('/\|\|+/', '|', trim($_POST["detail{$x}"], "|"));
+ if (!$desc_fmt_err_found) {
+ $input_errors[] = $vertical_bar_err_text;
+ $desc_fmt_err_found = true;
+ }
+ }
+ } else {
+ $final_address_details[] = sprintf(gettext("Entry added %s"), date('r'));
+ }
+
+ if (file_exists("{$temp_filename}/aliases")) {
+ $address = parse_aliases_file("{$temp_filename}/aliases", $_POST['type'], 3000);
+ if ($address == null) {
+ /* nothing was found */
+ $input_errors[] = sprintf(gettext("You must provide a valid URL. Could not fetch usable data from '%s'."), $_POST['address' . $x]);
+ }
+ mwexec("/bin/rm -rf " . escapeshellarg($temp_filename));
+ } else {
+ $input_errors[] = sprintf(gettext("URL '%s' is not valid."), $_POST['address' . $x]);
+ }
+ }
+ }
+ unset($desc_fmt_err_found);
+ if ($_POST['type'] == "url_ports") {
+ $address = group_ports($address);
+ }
+ } else {
+ /* item is a normal alias type */
+ $wrongaliases = "";
+ $desc_fmt_err_found = false;
+ $alias_address_count = 0;
+ $input_addresses = array();
+
+ // First trim and expand the input data.
+ // Users can paste strings like "10.1.2.0/24 10.3.0.0/16 9.10.11.0/24" into an address box.
+ // They can also put an IP range.
+ // This loop expands out that stuff so it can easily be validated.
+ for ($x = 0; $x < ($max_alias_addresses - 1); $x++) {
+ if ($_POST["address{$x}"] <> "") {
+ if ($_POST["detail{$x}"] <> "") {
+ if ((strpos($_POST["detail{$x}"], "||") === false) && (substr($_POST["detail{$x}"], 0, 1) != "|") && (substr($_POST["detail{$x}"], -1, 1) != "|")) {
+ $detail_text = $_POST["detail{$x}"];
+ } else {
+ /* Remove leading and trailing vertical bars and replace multiple vertical bars with single, */
+ /* and put in the output array so the text is at least redisplayed for the user. */
+ $detail_text = preg_replace('/\|\|+/', '|', trim($_POST["detail{$x}"], "|"));
+ if (!$desc_fmt_err_found) {
+ $input_errors[] = $vertical_bar_err_text;
+ $desc_fmt_err_found = true;
+ }
+ }
+ } else {
+ $detail_text = sprintf(gettext("Entry added %s"), date('r'));
+ }
+ $address_items = explode(" ", trim($_POST["address{$x}"]));
+ foreach ($address_items as $address_item) {
+ $iprange_type = is_iprange($address_item);
+ if ($iprange_type == 4) {
+ list($startip, $endip) = explode('-', $address_item);
+ if ($_POST['type'] == "network") {
+ // For network type aliases, expand an IPv4 range into an array of subnets.
+ $rangesubnets = ip_range_to_subnet_array($startip, $endip);
+ foreach ($rangesubnets as $rangesubnet) {
+ if ($alias_address_count > $max_alias_addresses) {
+ break;
+ }
+ list($address_part, $subnet_part) = explode("/", $rangesubnet);
+ $input_addresses[] = $address_part;
+ $input_address_subnet[] = $subnet_part;
+ $final_address_details[] = $detail_text;
+ $alias_address_count++;
+ }
+ } else {
+ // For host type aliases, expand an IPv4 range into a list of individual IPv4 addresses.
+ $rangeaddresses = ip_range_to_address_array($startip, $endip, $max_alias_addresses - $alias_address_count);
+ if (is_array($rangeaddresses)) {
+ foreach ($rangeaddresses as $rangeaddress) {
+ $input_addresses[] = $rangeaddress;
+ $input_address_subnet[] = "";
+ $final_address_details[] = $detail_text;
+ $alias_address_count++;
+ }
+ } else {
+ $input_errors[] = sprintf(gettext('Range is too large to expand into individual host IP addresses (%s)'), $address_item);
+ $input_errors[] = sprintf(gettext('The maximum number of entries in an alias is %s'), $max_alias_addresses);
+ // Put the user-entered data in the output anyway, so it will be re-displayed for correction.
+ $input_addresses[] = $address_item;
+ $input_address_subnet[] = "";
+ $final_address_details[] = $detail_text;
+ }
+ }
+ } else if ($iprange_type == 6) {
+ $input_errors[] = sprintf(gettext('IPv6 address ranges are not supported (%s)'), $address_item);
+ // Put the user-entered data in the output anyway, so it will be re-displayed for correction.
+ $input_addresses[] = $address_item;
+ $input_address_subnet[] = "";
+ $final_address_details[] = $detail_text;
+ } else {
+ $subnet_type = is_subnet($address_item);
+ if (($_POST['type'] == "host") && $subnet_type) {
+ if ($subnet_type == 4) {
+ // For host type aliases, if the user enters an IPv4 subnet, expand it into a list of individual IPv4 addresses.
+ if (subnet_size($address_item) <= ($max_alias_addresses - $alias_address_count)) {
+ $rangeaddresses = subnetv4_expand($address_item);
+ foreach ($rangeaddresses as $rangeaddress) {
+ $input_addresses[] = $rangeaddress;
+ $input_address_subnet[] = "";
+ $final_address_details[] = $detail_text;
+ $alias_address_count++;
+ }
+ } else {
+ $input_errors[] = sprintf(gettext('Subnet is too large to expand into individual host IP addresses (%s)'), $address_item);
+ $input_errors[] = sprintf(gettext('The maximum number of entries in an alias is %s'), $max_alias_addresses);
+ // Put the user-entered data in the output anyway, so it will be re-displayed for correction.
+ $input_addresses[] = $address_item;
+ $input_address_subnet[] = "";
+ $final_address_details[] = $detail_text;
+ }
+ } else {
+ $input_errors[] = sprintf(gettext('IPv6 subnets are not supported in host aliases (%s)'), $address_item);
+ // Put the user-entered data in the output anyway, so it will be re-displayed for correction.
+ $input_addresses[] = $address_item;
+ $input_address_subnet[] = "";
+ $final_address_details[] = $detail_text;
+ }
+ } else {
+ list($address_part, $subnet_part) = explode("/", $address_item);
+ if (!empty($subnet_part)) {
+ if (is_subnet($address_item)) {
+ $input_addresses[] = $address_part;
+ $input_address_subnet[] = $subnet_part;
+ } else {
+ // The user typed something like "1.2.3.444/24" or "1.2.3.0/36" or similar rubbish.
+ // Feed it through without splitting it apart, then it will be caught by the validation loop below.
+ $input_addresses[] = $address_item;
+ $input_address_subnet[] = "";
+ }
+ } else {
+ $input_addresses[] = $address_part;
+ $input_address_subnet[] = $_POST["address_subnet{$x}"];
+ }
+ $final_address_details[] = $detail_text;
+ $alias_address_count++;
+ }
+ }
+ if ($alias_address_count > $max_alias_addresses) {
+ $input_errors[] = sprintf(gettext('The maximum number of entries in an alias has been exceeded (%s)'), $max_alias_addresses);
+ break;
+ }
+ }
+ }
+ }
+
+ // Validate the input data expanded above.
+ foreach ($input_addresses as $idx => $input_address) {
+ if (is_alias($input_address)) {
+ if (!alias_same_type($input_address, $_POST['type'])) {
+ // But alias type network can include alias type urltable. Feature#1603.
+ if (!($_POST['type'] == 'network' &&
+ preg_match("/urltable/i", alias_get_type($input_address)))) {
+ $wrongaliases .= " " . $input_address;
+ }
+ }
+ } else if ($_POST['type'] == "port") {
+ if (!is_port($input_address) && !is_portrange($input_address)) {
+ $input_errors[] = $input_address . " " . gettext("is not a valid port or alias.");
+ }
+ } else if ($_POST['type'] == "host" || $_POST['type'] == "network") {
+ if (is_subnet($input_address) ||
+ (!is_ipaddr($input_address) && !is_hostname($input_address))) {
+ $input_errors[] = sprintf(gettext('%1$s is not a valid %2$s address, FQDN or alias.'), $input_address, $_POST['type']);
+ }
+ }
+ $tmpaddress = $input_address;
+ if ($_POST['type'] != "host" && is_ipaddr($input_address) && $input_address_subnet[$idx] <> "") {
+ if (!is_subnet($input_address . "/" . $input_address_subnet[$idx])) {
+ $input_errors[] = sprintf(gettext('%s/%s is not a valid subnet.'), $input_address, $input_address_subnet[$idx]);
+ } else {
+ $tmpaddress .= "/" . $input_address_subnet[$idx];
+ }
+ }
+ $address[] = $tmpaddress;
+ }
+ unset($desc_fmt_err_found);
+ if ($wrongaliases <> "") {
+ $input_errors[] = sprintf(gettext('The alias(es): %s cannot be nested because they are not of the same type.'), $wrongaliases);
+ }
+ }
+
+ unset($vertical_bar_err_text);
+
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/input_validation");
+
+ if (!$input_errors) {
+ $alias['address'] = is_array($address) ? implode(" ", $address) : $address;
+ $alias['descr'] = $_POST['descr'];
+ $alias['type'] = $_POST['type'];
+ $alias['detail'] = implode("||", $final_address_details);
+
+ /* Check to see if alias name needs to be
+ * renamed on referenced rules and such
+ */
+ if ($_POST['name'] <> $_POST['origname']) {
+ // Firewall rules
+ update_alias_names_upon_change(array('filter', 'rule'), array('source', 'address'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('filter', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('filter', 'rule'), array('source', 'port'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('filter', 'rule'), array('destination', 'port'), $_POST['name'], $origname);
+ // NAT Rules
+ update_alias_names_upon_change(array('nat', 'rule'), array('source', 'address'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'rule'), array('source', 'port'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'rule'), array('destination', 'port'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'rule'), array('target'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'rule'), array('local-port'), $_POST['name'], $origname);
+ // NAT 1:1 Rules
+ //update_alias_names_upon_change(array('nat', 'onetoone'), array('external'), $_POST['name'], $origname);
+ //update_alias_names_upon_change(array('nat', 'onetoone'), array('source', 'address'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'onetoone'), array('destination', 'address'), $_POST['name'], $origname);
+ // NAT Outbound Rules
+ update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('source', 'network'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('sourceport'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('destination', 'address'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('dstport'), $_POST['name'], $origname);
+ update_alias_names_upon_change(array('nat', 'outbound', 'rule'), array('target'), $_POST['name'], $origname);
+ // Alias in an alias
+ update_alias_names_upon_change(array('aliases', 'alias'), array('address'), $_POST['name'], $origname);
+ }
+
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/pre_write_config");
+
+ if (isset($id) && $a_aliases[$id]) {
+ if ($a_aliases[$id]['name'] <> $alias['name']) {
+ foreach ($a_aliases as $aliasid => $aliasd) {
+ if ($aliasd['address'] <> "") {
+ $tmpdirty = false;
+ $tmpaddr = explode(" ", $aliasd['address']);
+ foreach ($tmpaddr as $tmpidx => $tmpalias) {
+ if ($tmpalias == $a_aliases[$id]['name']) {
+ $tmpaddr[$tmpidx] = $alias['name'];
+ $tmpdirty = true;
+ }
+ }
+ if ($tmpdirty == true) {
+ $a_aliases[$aliasid]['address'] = implode(" ", $tmpaddr);
+ }
+ }
+ }
+ }
+ $a_aliases[$id] = $alias;
+ } else {
+ $a_aliases[] = $alias;
+ }
+
+ // Sort list
+ $a_aliases = msort($a_aliases, "name");
+
+ if (write_config()) {
+ mark_subsystem_dirty('aliases');
+ }
+
+ if (!empty($tab)) {
+ header("Location: firewall_aliases.php?tab=" . htmlspecialchars ($tab));
+ } else {
+ header("Location: firewall_aliases.php");
+ }
+ exit;
+ } else {
+ //we received input errors, copy data to prevent retype
+ $pconfig['name'] = $_POST['name'];
+ $pconfig['descr'] = $_POST['descr'];
+ if (($_POST['type'] == 'url') || ($_POST['type'] == 'url_ports')) {
+ $pconfig['address'] = implode(" ", $alias['aliasurl']);
+ } else {
+ $pconfig['address'] = implode(" ", $address);
+ }
+ $pconfig['type'] = $_POST['type'];
+ $pconfig['detail'] = implode("||", $final_address_details);
+ }
+}
+
+include("head.inc");
+
+$jscriptstr = <<<EOD
+
+<script type="text/javascript">
+//<![CDATA[
+var objAlias = new Array(4999);
+function typesel_change() {
+ var field_disabled = 0;
+ var field_value = "";
+ var set_value = false;
+ switch (document.iform.type.selectedIndex) {
+ case 0: /* host */
+ field_disabled = 1;
+ field_value = "";
+ set_value = true;
+ break;
+ case 1: /* network */
+ field_disabled = 0;
+ break;
+ case 2: /* port */
+ field_disabled = 1;
+ field_value = "128";
+ set_value = true;
+ break;
+ case 3: /* url */
+ field_disabled = 1;
+ break;
+ case 4: /* url_ports */
+ field_disabled = 1;
+ break;
+ case 5: /* urltable */
+ field_disabled = 0;
+ break;
+ case 6: /* urltable_ports */
+ field_disabled = 0;
+ break;
+ }
+
+ jQuery("select[id^='address_subnet']").prop("disabled", field_disabled);
+ if (set_value == true) {
+ jQuery("select[id^='address_subnet']").prop("value", field_value);
+ }
+}
+
+function add_alias_control() {
+ var name = "address" + (totalrows - 1);
+ obj = document.getElementById(name);
+ obj.setAttribute('class', 'formfldalias');
+ obj.setAttribute('autocomplete', 'off');
+ objAlias[totalrows - 1] = new AutoSuggestControl(obj, new StateSuggestions(addressarray));
+}
+EOD;
+
+$network_str = gettext("Network or FQDN");
+$networks_str = gettext("Network(s)");
+$cidr_str = gettext("CIDR");
+$description_str = gettext("Description");
+$hosts_str = gettext("Host(s)");
+$ip_str = gettext("IP or FQDN");
+$ports_str = gettext("Port(s)");
+$port_str = gettext("Port");
+$url_str = gettext("URL (IPs)");
+$url_ports_str = gettext("URL (Ports)");
+$urltable_str = gettext("URL Table (IPs)");
+$urltable_ports_str = gettext("URL Table (Ports)");
+$update_freq_str = gettext("Update Freq. (days)");
+
+$networks_help = gettext("Networks are specified in CIDR format. Select the CIDR mask that pertains to each entry. /32 specifies a single IPv4 host, /128 specifies a single IPv6 host, /24 specifies 255.255.255.0, /64 specifies a normal IPv6 network, etc. Hostnames (FQDNs) may also be specified, using a /32 mask for IPv4 or /128 for IPv6. You may also enter an IP range such as 192.168.1.1-192.168.1.254 and a list of CIDR networks will be derived to fill the range.");
+$hosts_help = gettext("Enter as many hosts as you would like. Hosts must be specified by their IP address or fully qualified domain name (FQDN). FQDN hostnames are periodically re-resolved and updated. If multiple IPs are returned by a DNS query, all are used. You may also enter an IP range such as 192.168.1.1-192.168.1.10 or a small subnet such as 192.168.1.16/28 and a list of individual IP addresses will be generated.");
+$ports_help = gettext("Enter as many ports as you wish. Port ranges can be expressed by separating with a colon.");
+$url_help = sprintf(gettext("Enter as many URLs as you wish. After saving %s will download the URL and import the items into the alias. Use only with small sets of IP addresses (less than 3000)."), $g['product_name']);
+$url_ports_help = sprintf(gettext("Enter as many URLs as you wish. After saving %s will download the URL and import the items into the alias. Use only with small sets of Ports (less than 3000)."), $g['product_name']);
+$urltable_help = sprintf(gettext("Enter a single URL containing a large number of IPs and/or Subnets. After saving %s will download the URL and create a table file containing these addresses. This will work with large numbers of addresses (30,000+) or small numbers."), $g['product_name']);
+$urltable_ports_help = sprintf(gettext("Enter a single URL containing a list of Port numbers and/or Port ranges. After saving %s will download the URL."), $g['product_name']);
+
+$openvpn_str = gettext("Username");
+$openvpn_user_str = gettext("OpenVPN Users");
+$openvpn_help = gettext("Enter as many usernames as you wish.");
+$openvpn_freq = "";
+
+$jscriptstr .= <<<EOD
+
+function update_box_type() {
+ var indexNum = document.forms[0].type.selectedIndex;
+ var selected = document.forms[0].type.options[indexNum].text;
+ if (selected == '{$networks_str}') {
+ document.getElementById ("addressnetworkport").firstChild.data = "{$networks_str}";
+ document.getElementById ("onecolumn").firstChild.data = "{$network_str}";
+ document.getElementById ("twocolumn").firstChild.data = "{$cidr_str}";
+ document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
+ document.getElementById ("threecolumn").style.display = 'block';
+ document.getElementById ("itemhelp").firstChild.data = "{$networks_help}";
+ document.getElementById ("addrowbutton").style.display = 'block';
+ } else if (selected == '{$hosts_str}') {
+ document.getElementById ("addressnetworkport").firstChild.data = "{$hosts_str}";
+ document.getElementById ("onecolumn").firstChild.data = "{$ip_str}";
+ document.getElementById ("twocolumn").firstChild.data = "";
+ document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
+ document.getElementById ("threecolumn").style.display = 'block';
+ document.getElementById ("itemhelp").firstChild.data = "{$hosts_help}";
+ document.getElementById ("addrowbutton").style.display = 'block';
+ } else if (selected == '{$ports_str}') {
+ document.getElementById ("addressnetworkport").firstChild.data = "{$ports_str}";
+ document.getElementById ("onecolumn").firstChild.data = "{$port_str}";
+ document.getElementById ("twocolumn").firstChild.data = "";
+ document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
+ document.getElementById ("threecolumn").style.display = 'block';
+ document.getElementById ("itemhelp").firstChild.data = "{$ports_help}";
+ document.getElementById ("addrowbutton").style.display = 'block';
+ } else if (selected == '{$url_str}') {
+ document.getElementById ("addressnetworkport").firstChild.data = "{$url_str}";
+ document.getElementById ("onecolumn").firstChild.data = "{$url_str}";
+ document.getElementById ("twocolumn").firstChild.data = "";
+ document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
+ document.getElementById ("threecolumn").style.display = 'block';
+ document.getElementById ("itemhelp").firstChild.data = "{$url_help}";
+ document.getElementById ("addrowbutton").style.display = 'block';
+ } else if (selected == '{$url_ports_str}') {
+ document.getElementById ("addressnetworkport").firstChild.data = "{$url_ports_str}";
+ document.getElementById ("onecolumn").firstChild.data = "{$url_ports_str}";
+ document.getElementById ("twocolumn").firstChild.data = "";
+ document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
+ document.getElementById ("threecolumn").style.display = 'block';
+ document.getElementById ("itemhelp").firstChild.data = "{$url_ports_help}";
+ document.getElementById ("addrowbutton").style.display = 'block';
+ } else if (selected == '{$openvpn_user_str}') {
+ document.getElementById ("addressnetworkport").firstChild.data = "{$openvpn_user_str}";
+ document.getElementById ("onecolumn").firstChild.data = "{$openvpn_str}";
+ document.getElementById ("twocolumn").firstChild.data = "{$openvpn_freq}";
+ document.getElementById ("threecolumn").firstChild.data = "{$description_str}";
+ document.getElementById ("threecolumn").style.display = 'block';
+ document.getElementById ("itemhelp").firstChild.data = "{$openvpn_help}";
+ document.getElementById ("addrowbutton").style.display = 'block';
+ } else if (selected == '{$urltable_str}') {
+ if ((typeof(totalrows) == "undefined") || (totalrows < 1)) {
+ addRowTo('maintable', 'formfldalias');
+ typesel_change();
+ add_alias_control(this);
+ }
+ document.getElementById ("addressnetworkport").firstChild.data = "{$urltable_str}";
+ document.getElementById ("onecolumn").firstChild.data = "{$urltable_str}";
+ document.getElementById ("twocolumn").firstChild.data = "{$update_freq_str}";
+ document.getElementById ("threecolumn").firstChild.data = "";
+ document.getElementById ("threecolumn").style.display = 'none';
+ document.getElementById ("itemhelp").firstChild.data = "{$urltable_help}";
+ document.getElementById ("addrowbutton").style.display = 'none';
+ } else if (selected == '{$urltable_ports_str}') {
+ if ((typeof(totalrows) == "undefined") || (totalrows < 1)) {
+ addRowTo('maintable', 'formfldalias');
+ typesel_change();
+ add_alias_control(this);
+ }
+ document.getElementById ("addressnetworkport").firstChild.data = "{$urltable_ports_str}";
+ document.getElementById ("onecolumn").firstChild.data = "{$urltable_ports_str}";
+ document.getElementById ("twocolumn").firstChild.data = "{$update_freq_str}";
+ document.getElementById ("threecolumn").firstChild.data = "";
+ document.getElementById ("threecolumn").style.display = 'none';
+ document.getElementById ("itemhelp").firstChild.data = "{$urltable_ports_help}";
+ document.getElementById ("addrowbutton").style.display = 'none';
+ }
+}
+//]]>
+</script>
+
+EOD;
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php
+ include("fbegin.inc");
+ echo $jscriptstr;
+?>
+
+<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
+<script type="text/javascript" src="/javascript/row_helper.js"></script>
+<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
+<script type="text/javascript" src="/javascript/suggestions.js"></script>
+
+<input type='hidden' name='address_type' value='textbox' />
+<input type='hidden' name='address_subnet_type' value='select' />
+
+<script type="text/javascript">
+//<![CDATA[
+ rowname[0] = "address";
+ rowtype[0] = "textbox,ipv4v6";
+ rowsize[0] = "30";
+
+ rowname[1] = "address_subnet";
+ rowtype[1] = "select,ipv4v6";
+ rowsize[1] = "1";
+
+ rowname[2] = "detail";
+ rowtype[2] = "textbox";
+ rowsize[2] = "50";
+//]]>
+</script>
+
+<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/pre_input_errors"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<div id="inputerrors"></div>
+
+<form action="firewall_aliases_edit.php" method="post" name="iform" id="iform">
+<?php
+if (empty($tab)) {
+ if (preg_match("/url/i", $pconfig['type'])) {
+ $tab = 'url';
+ } else if ($pconfig['type'] == 'host') {
+ $tab = 'ip';
+ } else {
+ $tab = $pconfig['type'];
+ }
+}
+?>
+<input name="tab" type="hidden" id="tab" value="<?=htmlspecialchars($tab);?>" />
+<table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall aliases edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Alias Edit"); ?></td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
+ <td class="vtable">
+ <input name="origname" type="hidden" id="origname" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['name']);?>" />
+ <input name="name" type="text" id="name" class="formfld unknown" size="40" maxlength="31" value="<?=htmlspecialchars($pconfig['name']);?>" />
+ <?php if (isset($id) && $a_aliases[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ <br />
+ <span class="vexpl">
+ <?=gettext("The name of the alias may only consist of the characters \"a-z, A-Z, 0-9 and _\"."); ?>
+ </span>
+ </td>
+ </tr>
+ <?php pfSense_handle_custom_code("/usr/local/pkg/firewall_aliases_edit/after_first_tr"); ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed)."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Type"); ?></td>
+ <td class="vtable">
+ <select name="type" class="formselect" id="type" onchange="update_box_type(); typesel_change();">
+ <option value="host" <?php if ($pconfig['type'] == "host") echo "selected=\"selected\""; ?>><?=gettext("Host(s)"); ?></option>
+ <option value="network" <?php if ($pconfig['type'] == "network") echo "selected=\"selected\""; ?>><?=gettext("Network(s)"); ?></option>
+ <option value="port" <?php if (($pconfig['type'] == "port") || (empty($pconfig['type']) && ($tab == "port"))) echo "selected=\"selected\""; ?>><?=gettext("Port(s)"); ?></option>
+ <!--<option value="openvpn" <?php if ($pconfig['type'] == "openvpn") echo "selected=\"selected\""; ?>><?=gettext("OpenVPN Users"); ?></option> -->
+ <option value="url" <?php if (($pconfig['type'] == "url") || (empty($pconfig['type']) && ($tab == "url"))) echo "selected=\"selected\""; ?>><?=gettext("URL (IPs)");?></option>
+ <option value="url_ports" <?php if ($pconfig['type'] == "url_ports") echo "selected=\"selected\""; ?>><?=gettext("URL (Ports)");?></option>
+ <option value="urltable" <?php if ($pconfig['type'] == "urltable") echo "selected=\"selected\""; ?>><?=gettext("URL Table (IPs)"); ?></option>
+ <option value="urltable_ports" <?php if ($pconfig['type'] == "urltable_ports") echo "selected=\"selected\""; ?>><?=gettext("URL Table (Ports)"); ?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><div id="addressnetworkport"><?=gettext("Host(s)"); ?></div></td>
+ <td width="78%" class="vtable">
+ <table id="maintable" summary="maintable">
+ <tbody>
+ <tr>
+ <td colspan="4">
+ <div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp"><?=gettext("Item information"); ?></div>
+ </td>
+ </tr>
+ <tr>
+ <td><div id="onecolumn"><?=gettext("Network"); ?></div></td>
+ <td><div id="twocolumn">CIDR</div></td>
+ <td><div id="threecolumn"><?=gettext("Description"); ?></div></td>
+ </tr>
+
+ <?php
+ $counter = 0;
+ if ($pconfig['address'] <> ""):
+ $addresses = explode(" ", $pconfig['address']);
+ $details = explode("||", $pconfig['detail']);
+ while ($counter < count($addresses)):
+ if (($pconfig['type'] != "host") && is_subnet($addresses[$counter])) {
+ list($address, $address_subnet) = explode("/", $addresses[$counter]);
+ } else {
+ $address = $addresses[$counter];
+ $address_subnet = "";
+ }
+ ?>
+ <tr>
+ <td>
+ <input autocomplete="off" name="address<?php echo $counter; ?>" type="text" class="formfldalias ipv4v6" id="address<?php echo $counter; ?>" size="30" value="<?=htmlspecialchars($address);?>" />
+ </td>
+ <td>
+ <select name="address_subnet<?php echo $counter; ?>" class="formselect ipv4v6" id="address_subnet<?php echo $counter; ?>">
+ <option></option>
+ <?php for ($i = 128; $i >= 1; $i--): ?>
+ <option value="<?=$i;?>" <?php if (($i == $address_subnet) || ($i == $pconfig['updatefreq'])) echo "selected=\"selected\""; ?>><?=$i;?></option>
+ <?php endfor; ?>
+ </select>
+ </td>
+ <td>
+ <input name="detail<?php echo $counter; ?>" type="text" class="formfld unknown" id="detail<?php echo $counter; ?>" size="50" value="<?=htmlspecialchars($details[$counter]);?>" />
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" /></a>
+ </td>
+ </tr>
+ <?php
+ $counter++;
+
+ endwhile;
+ endif;
+ ?>
+ </tbody>
+ </table>
+ <div id="addrowbutton">
+ <a onclick="javascript:addRowTo('maintable', 'formfldalias'); typesel_change(); add_alias_control(this); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry"); ?>" />
+ </a>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ </td>
+ </tr>
+</table>
+</form>
+
+<script type="text/javascript">
+//<![CDATA[
+ field_counter_js = 3;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+ typesel_change();
+ update_box_type();
+
+ var addressarray = <?= json_encode(array_exclude($pconfig['name'], get_alias_list($pconfig['type']))) ?>;
+
+ function createAutoSuggest() {
+ <?php
+ for ($jv = 0; $jv < $counter; $jv++) {
+ echo "objAlias[{$jv}] = new AutoSuggestControl(document.getElementById(\"address{$jv}\"), new StateSuggestions(addressarray));\n";
+ }
+ ?>
+ }
+
+ setTimeout("createAutoSuggest();", 500);
+//]]>
+</script>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_aliases_import.php b/src/usr/local/www/firewall_aliases_import.php
new file mode 100755
index 0000000..868f5eb
--- /dev/null
+++ b/src/usr/local/www/firewall_aliases_import.php
@@ -0,0 +1,246 @@
+<?php
+/* $Id$ */
+/*
+ firewall_aliases_import.php
+ Copyright (C) 2005 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-alias-import
+##|*NAME=Firewall: Alias: Import page
+##|*DESCR=Allow access to the 'Firewall: Alias: Import' page.
+##|*MATCH=firewall_aliases_import.php*
+##|-PRIV
+
+
+// Keywords not allowed in names
+$reserved_keywords = array("all", "pass", "block", "out", "queue", "max", "min", "pptp", "pppoe", "L2TP", "OpenVPN", "IPsec");
+
+require("guiconfig.inc");
+require_once("util.inc");
+require_once("filter.inc");
+require("shaper.inc");
+
+$pgtitle = array(gettext("Firewall"), gettext("Aliases"), gettext("Bulk import"));
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_aliases.php');
+}
+
+// Add all Load balance names to reserved_keywords
+if (is_array($config['load_balancer']['lbpool'])) {
+ foreach ($config['load_balancer']['lbpool'] as $lbpool) {
+ $reserved_keywords[] = $lbpool['name'];
+ }
+}
+
+$reserved_ifs = get_configured_interface_list(false, true);
+$reserved_keywords = array_merge($reserved_keywords, $reserved_ifs, $reserved_table_names);
+
+if (!is_array($config['aliases']['alias'])) {
+ $config['aliases']['alias'] = array();
+}
+$a_aliases = &$config['aliases']['alias'];
+
+if ($_POST) {
+ $reqdfields = explode(" ", "name aliasimport");
+ $reqdfieldsn = array(gettext("Name"), gettext("Aliases"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (is_validaliasname($_POST['name']) == false) {
+ $input_errors[] = gettext("The alias name may only consist of the characters") . " a-z, A-Z, 0-9, _.";
+ }
+
+ /* check for name duplicates */
+ if (is_alias($_POST['name'])) {
+ $input_errors[] = gettext("An alias with this name already exists.");
+ }
+
+
+ /* Check for reserved keyword names */
+ foreach ($reserved_keywords as $rk) {
+ if ($rk == $_POST['name']) {
+ $input_errors[] = sprintf(gettext("Cannot use a reserved keyword as alias name %s"), $rk);
+ }
+ }
+
+ /* check for name interface description conflicts */
+ foreach ($config['interfaces'] as $interface) {
+ if ($interface['descr'] == $_POST['name']) {
+ $input_errors[] = gettext("An interface description with this name already exists.");
+ break;
+ }
+ }
+
+ if ($_POST['aliasimport']) {
+ $tocheck = explode("\n", $_POST['aliasimport']);
+ $imported_ips = array();
+ $imported_descs = array();
+ $desc_len_err_found = false;
+ $desc_fmt_err_found = false;
+ foreach ($tocheck as $impline) {
+ $implinea = explode(" ", trim($impline), 2);
+ $impip = $implinea[0];
+ $impdesc = trim($implinea[1]);
+ if (strlen($impdesc) < 200) {
+ if ((strpos($impdesc, "||") === false) && (substr($impdesc, 0, 1) != "|") && (substr($impdesc, -1, 1) != "|")) {
+ $iprange_type = is_iprange($impip);
+ if ($iprange_type == 4) {
+ list($startip, $endip) = explode('-', $impip);
+ $rangesubnets = ip_range_to_subnet_array($startip, $endip);
+ $imported_ips = array_merge($imported_ips, $rangesubnets);
+ $rangedescs = array_fill(0, count($rangesubnets), $impdesc);
+ $imported_descs = array_merge($imported_descs, $rangedescs);
+ } else if ($iprange_type == 6) {
+ $input_errors[] = sprintf(gettext('IPv6 address ranges are not supported (%s)'), $impip);
+ } else if (!is_ipaddr($impip) && !is_subnet($impip) && !is_hostname($impip) && !empty($impip)) {
+ $input_errors[] = sprintf(gettext("%s is not an IP address. Please correct the error to continue"), $impip);
+ } elseif (!empty($impip)) {
+ $imported_ips[] = $impip;
+ $imported_descs[] = $impdesc;
+ }
+ } else {
+ if (!$desc_fmt_err_found) {
+ $input_errors[] = gettext("Descriptions may not start or end with vertical bar (|) or contain double vertical bar ||.");
+ $desc_fmt_err_found = true;
+ }
+ }
+ } else {
+ if (!$desc_len_err_found) {
+ /* Note: The 200 character limit is just a practical check to avoid accidents */
+ /* if the user pastes a large number of IP addresses without line breaks. */
+ $input_errors[] = gettext("Descriptions must be less than 200 characters long.");
+ $desc_len_err_found = true;
+ }
+ }
+ }
+ unset($desc_len_err_found, $desc_fmt_err_found);
+ }
+
+ if (!$input_errors && is_array($imported_ips)) {
+ $alias = array();
+ $alias['address'] = implode(" ", $imported_ips);
+ $alias['detail'] = implode("||", $imported_descs);
+ $alias['name'] = $_POST['name'];
+ $alias['type'] = "network";
+ $alias['descr'] = $_POST['descr'];
+ unset($imported_ips, $imported_descs);
+ $a_aliases[] = $alias;
+
+ // Sort list
+ $a_aliases = msort($a_aliases, "name");
+
+ if (write_config()) {
+ mark_subsystem_dirty('aliases');
+ }
+ pfSenseHeader("firewall_aliases.php");
+
+ exit;
+ }
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<div id="niftyOutter">
+<form action="firewall_aliases_import.php" method="post" name="iform" id="iform">
+<div id="inputerrors"></div>
+<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall alias import">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Alias Import"); ?></td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Alias Name"); ?></td>
+ <td class="vtable">
+ <input name="name" type="text" class="formfld unknown" id="name" size="40" maxlength="31" value="<?=htmlspecialchars($_POST['name']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("The name of the alias may only consist of the characters \"a-z, A-Z and 0-9\"."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($_POST['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Aliases to import"); ?></td>
+ <td class="vtable">
+ <textarea name="aliasimport" rows="15" cols="40"><?php echo $_POST['aliasimport']; ?></textarea>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Paste in the aliases to import separated by a carriage return. Common examples are lists of IPs, networks, blacklists, etc."); ?>
+ <br />
+ <?=gettext("The list may contain IP addresses, with or without CIDR prefix, IP ranges, blank lines (ignored) and an optional description after each IP. e.g.:"); ?>
+ <br />172.16.1.2
+ <br />172.16.0.0/24
+ <br />10.11.12.100-10.11.12.200
+ <br />192.168.1.254 Home router
+ <br />10.20.0.0/16 Office network
+ <br />10.40.1.10-10.40.1.19 Managed switches
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ </td>
+ </tr>
+</table>
+
+
+</form>
+</div>
+
+<?php include("fend.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+ NiftyCheck();
+ Rounded("div#nifty","top","#FFF","#EEEEEE","smooth");
+//]]>
+</script>
+
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_nat.php b/src/usr/local/www/firewall_nat.php
new file mode 100644
index 0000000..70c8041
--- /dev/null
+++ b/src/usr/local/www/firewall_nat.php
@@ -0,0 +1,399 @@
+<?php
+/* $Id$ */
+/*
+ firewall_nat.php
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: nat
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-nat-portforward
+##|*NAME=Firewall: NAT: Port Forward page
+##|*DESCR=Allow access to the 'Firewall: NAT: Port Forward' page.
+##|*MATCH=firewall_nat.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("itemid.inc");
+
+if (!is_array($config['nat']['rule'])) {
+ $config['nat']['rule'] = array();
+}
+
+$a_nat = &$config['nat']['rule'];
+
+/* if a custom message has been passed along, lets process it */
+if ($_GET['savemsg']) {
+ $savemsg = $_GET['savemsg'];
+}
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+
+ $retval = 0;
+
+ $retval |= filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/apply");
+
+ if ($retval == 0) {
+ clear_subsystem_dirty('natconf');
+ clear_subsystem_dirty('filter');
+ }
+
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_nat[$_GET['id']]) {
+
+ if (isset($a_nat[$_GET['id']]['associated-rule-id'])) {
+ delete_id($a_nat[$_GET['id']]['associated-rule-id'], $config['filter']['rule']);
+ $want_dirty_filter = true;
+ }
+ unset($a_nat[$_GET['id']]);
+
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ if ($want_dirty_filter) {
+ mark_subsystem_dirty('filter');
+ }
+ }
+ header("Location: firewall_nat.php");
+ exit;
+ }
+}
+
+if (isset($_POST['del_x'])) {
+ /* delete selected rules */
+ if (is_array($_POST['rule']) && count($_POST['rule'])) {
+ foreach ($_POST['rule'] as $rulei) {
+ $target = $rule['target'];
+ // Check for filter rule associations
+ if (isset($a_nat[$rulei]['associated-rule-id'])) {
+ delete_id($a_nat[$rulei]['associated-rule-id'], $config['filter']['rule']);
+
+ mark_subsystem_dirty('filter');
+ }
+ unset($a_nat[$rulei]);
+ }
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat.php");
+ exit;
+ }
+
+} else {
+ /* yuck - IE won't send value attributes for image buttons, while Mozilla does - so we use .x/.y to find move button clicks instead... */
+ unset($movebtn);
+ foreach ($_POST as $pn => $pd) {
+ if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
+ $movebtn = $matches[1];
+ break;
+ }
+ }
+ /* move selected rules before this rule */
+ if (isset($movebtn) && is_array($_POST['rule']) && count($_POST['rule'])) {
+ $a_nat_new = array();
+
+ /* copy all rules < $movebtn and not selected */
+ for ($i = 0; $i < $movebtn; $i++) {
+ if (!in_array($i, $_POST['rule'])) {
+ $a_nat_new[] = $a_nat[$i];
+ }
+ }
+
+ /* copy all selected rules */
+ for ($i = 0; $i < count($a_nat); $i++) {
+ if ($i == $movebtn) {
+ continue;
+ }
+ if (in_array($i, $_POST['rule'])) {
+ $a_nat_new[] = $a_nat[$i];
+ }
+ }
+
+ /* copy $movebtn rule */
+ if ($movebtn < count($a_nat)) {
+ $a_nat_new[] = $a_nat[$movebtn];
+ }
+
+ /* copy all rules > $movebtn and not selected */
+ for ($i = $movebtn+1; $i < count($a_nat); $i++) {
+ if (!in_array($i, $_POST['rule'])) {
+ $a_nat_new[] = $a_nat[$i];
+ }
+ }
+ $a_nat = $a_nat_new;
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat.php");
+ exit;
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("Port Forward"));
+include("head.inc");
+
+echo "<script type=\"text/javascript\" src=\"/javascript/domTT/domLib.js\"></script>";
+echo "<script type=\"text/javascript\" src=\"/javascript/domTT/domTT.js\"></script>";
+echo "<script type=\"text/javascript\" src=\"/javascript/domTT/behaviour.js\"></script>";
+echo "<script type=\"text/javascript\" src=\"/javascript/domTT/fadomatic.js\"></script>";
+
+?>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="firewall_nat.php" method="post" name="iform">
+<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('natconf')): ?>
+<?php print_info_box_np(gettext("The NAT configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall nat">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Port Forward"), true, "firewall_nat.php");
+ $tab_array[] = array(gettext("1:1"), false, "firewall_nat_1to1.php");
+ $tab_array[] = array(gettext("Outbound"), false, "firewall_nat_out.php");
+ $tab_array[] = array(gettext("NPt"), false, "firewall_nat_npt.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr id="frheader">
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="5%" class="listhdrr"><?=gettext("If");?></td>
+ <td width="5%" class="listhdrr"><?=gettext("Proto");?></td>
+ <td width="11%" class="listhdrr nowrap"><?=gettext("Src. addr");?></td>
+ <td width="11%" class="listhdrr nowrap"><?=gettext("Src. ports");?></td>
+ <td width="11%" class="listhdrr nowrap"><?=gettext("Dest. addr");?></td>
+ <td width="11%" class="listhdrr nowrap"><?=gettext("Dest. ports");?></td>
+ <td width="11%" class="listhdrr nowrap"><?=gettext("NAT IP");?></td>
+ <td width="11%" class="listhdrr nowrap"><?=gettext("NAT Ports");?></td>
+ <td width="11%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="5%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="list">
+ <tr>
+ <td width="17">
+ <?php if (count($a_nat) == 0): ?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" border="0" alt="delete" />
+ <?php else: ?>
+ <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" title="<?=gettext("delete selected rules"); ?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected rules?");?>')" />
+ <?php endif; ?>
+ </td>
+ <td><a href="firewall_nat_edit.php?after=-1"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ $nnats = $i = 0;
+ foreach ($a_nat as $natent):
+
+ //build Alias popup box
+ $span_end = "</U></span>";
+
+ $alias_popup = rule_popup($natent['source']['address'], pprint_port($natent['source']['port']), $natent['destination']['address'], pprint_port($natent['destination']['port']));
+
+ $alias_src_span_begin = $alias_popup["src"];
+ $alias_src_port_span_begin = $alias_popup["srcport"];
+ $alias_dst_span_begin = $alias_popup["dst"];
+ $alias_dst_port_span_begin = $alias_popup["dstport"];
+
+ $alias_src_span_end = $alias_popup["src_end"];
+ $alias_src_port_span_end = $alias_popup["srcport_end"];
+ $alias_dst_span_end = $alias_popup["dst_end"];
+ $alias_dst_port_span_end = $alias_popup["dstport_end"];
+
+ $alias_popup = rule_popup("", "", $natent['target'], pprint_port($natent['local-port']));
+
+ $alias_target_span_begin = $alias_popup["dst"];
+ $alias_local_port_span_begin = $alias_popup["dstport"];
+
+ $alias_target_span_end = $alias_popup["dst_end"];
+ $alias_local_port_span_end = $alias_popup["dstport_end"];
+
+ if (isset($natent['disabled'])) {
+ $textss = "<span class=\"gray\">";
+ } else {
+ $textss = "<span>";
+ }
+
+ $textse = "</span>";
+
+ /* if user does not have access to edit an interface skip on to the next record */
+ if (!have_natpfruleint_access($natent['interface'])) {
+ continue;
+ }
+ ?>
+ <tr valign="top" id="fr<?=$nnats;?>">
+ <td class="listt"><input type="checkbox" id="frc<?=$nnats;?>" name="rule[]" value="<?=$i;?>" onClick="fr_bgcolor('<?=$nnats;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" /></td>
+ <td class="listt" align="center">
+ <?php if ($natent['associated-rule-id'] == "pass"): ?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" title="<?=gettext("All traffic matching this NAT entry is passed"); ?>" border="0" alt="pass" />
+ <?php elseif (!empty($natent['associated-rule-id'])): ?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_chain.png" width="17" height="17" title="<?=gettext("Firewall rule ID"); ?> <?=htmlspecialchars($nnatid); ?> <?=gettext("is managed with this rule"); ?>" border="0" alt="change" />
+ <?php endif; ?>
+ </td>
+ <td class="listlr" onClick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
+ <?=$textss;?>
+ <?php
+ if (!$natent['interface']) {
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr("wan"));
+ } else {
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface']));
+ }
+ ?>
+ <?=$textse;?>
+ </td>
+
+ <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
+ <?=$textss;?><?=strtoupper($natent['protocol']);?><?=$textse;?>
+ </td>
+
+ <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
+ <?=$textss;?><?php echo $alias_src_span_begin;?><?php echo htmlspecialchars(pprint_address($natent['source']));?><?php echo $alias_src_span_end;?><?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
+ <?=$textss;?><?php echo $alias_src_port_span_begin;?><?php echo htmlspecialchars(pprint_port($natent['source']['port']));?><?php echo $alias_src_port_span_end;?><?=$textse;?>
+ </td>
+
+ <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
+ <?=$textss;?><?php echo $alias_dst_span_begin;?><?php echo htmlspecialchars(pprint_address($natent['destination']));?><?php echo $alias_dst_span_end;?><?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
+ <?=$textss;?><?php echo $alias_dst_port_span_begin;?><?php echo htmlspecialchars(pprint_port($natent['destination']['port']));?><?php echo $alias_dst_port_span_end;?><?=$textse;?>
+ </td>
+
+ <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
+ <?=$textss;?><?php echo $alias_target_span_begin;?><?php echo htmlspecialchars($natent['target']);?><?php echo $alias_target_span_end;?><?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nnats;?>)" id="frd<?=$nnats;?>" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
+ <?php
+ $localport = $natent['local-port'];
+
+ list($dstbeginport, $dstendport) = explode("-", $natent['destination']['port']);
+
+ if ($dstendport) {
+ $localendport = $natent['local-port'] + $dstendport - $dstbeginport;
+ $localport .= '-' . $localendport;
+ }
+ ?>
+ <?=$textss;?><?php echo $alias_local_port_span_begin;?><?php echo htmlspecialchars(pprint_port($localport));?><?php echo $alias_local_port_span_end;?><?=$textse;?>
+ </td>
+
+ <td class="listbg" onclick="fr_toggle(<?=$nnats;?>)" ondblclick="document.location='firewall_nat_edit.php?id=<?=$nnats;?>';">
+ <?=$textss;?><?=htmlspecialchars($natent['descr']);?>&nbsp;<?=$textse;?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move">
+ <tr>
+ <td><input onmouseover="fr_insline(<?=$nnats;?>, true)" onmouseout="fr_insline(<?=$nnats;?>, false)" name="move_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" title="<?=gettext("move selected rules before this rule");?>" height="17" type="image" width="17" border="0" /></td>
+ <td><a href="firewall_nat_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit rule"); ?>"></a></td>
+ </tr>
+ <tr>
+ <td align="center" valign="middle"><a href="firewall_nat.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this rule?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule");?>" alt="delete" /></a></td>
+ <td><a href="firewall_nat_edit.php?dup=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new NAT based on this one");?>" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ $nnats++;
+ endforeach;
+ ?>
+ <tr>
+ <td class="list" colspan="8"></td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td class="list nowrap" valign="middle">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move">
+ <tr>
+ <td><?php if ($nnats == 0): ?><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules to end"); ?>" border="0" alt="move" /><?php else: ?><input name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17;border:0" title="<?=gettext("move selected rules to end");?>" /><?php endif; ?></td>
+ </tr>
+ <tr>
+ <td width="17">
+ <?php if (count($a_nat) == 0): ?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" border="0" alt="delete" />
+ <?php else: ?>
+ <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" title="<?=gettext("delete selected rules"); ?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected rules?");?>')" />
+ <?php endif; ?>
+ </td>
+ <td><a href="firewall_nat_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td>&nbsp;</td></tr>
+ <tr>
+ <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11" alt="pass" /></td>
+ <td colspan="3"><?=gettext("pass"); ?></td>
+ </tr>
+ <tr>
+ <td width="14"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_chain.png" width="11" height="11" alt="chain" /></td>
+ <td colspan="3"><?=gettext("linked rule");?></td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+
+<?php
+if ($pkg['tabs'] <> "") {
+ echo "</td></tr></table>";
+}
+?>
+
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_nat_1to1.php b/src/usr/local/www/firewall_nat_1to1.php
new file mode 100644
index 0000000..10b48dc
--- /dev/null
+++ b/src/usr/local/www/firewall_nat_1to1.php
@@ -0,0 +1,371 @@
+<?php
+/* $Id$ */
+/*
+ firewall_nat_1to1.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: nat
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-nat-1-1
+##|*NAME=Firewall: NAT: 1:1 page
+##|*DESCR=Allow access to the 'Firewall: NAT: 1:1' page.
+##|*MATCH=firewall_nat_1to1.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+if (!is_array($config['nat']['onetoone'])) {
+ $config['nat']['onetoone'] = array();
+}
+
+$a_1to1 = &$config['nat']['onetoone'];
+
+if ($_POST) {
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval |= filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ if ($retval == 0) {
+ clear_subsystem_dirty('natconf');
+ clear_subsystem_dirty('filter');
+ }
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_1to1[$_GET['id']]) {
+ unset($a_1to1[$_GET['id']]);
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_1to1.php");
+ exit;
+ }
+}
+
+if (isset($_POST['del_x'])) {
+ /* delete selected rules */
+ if (is_array($_POST['rule']) && count($_POST['rule'])) {
+ foreach ($_POST['rule'] as $rulei) {
+ unset($a_1to1[$rulei]);
+ }
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_1to1.php");
+ exit;
+ }
+
+} else if ($_GET['act'] == "toggle") {
+ if ($a_1to1[$_GET['id']]) {
+ if (isset($a_1to1[$_GET['id']]['disabled'])) {
+ unset($a_1to1[$_GET['id']]['disabled']);
+ } else {
+ $a_1to1[$_GET['id']]['disabled'] = true;
+ }
+ if (write_config("Firewall: NAT: Outbound, enable/disable NAT rule")) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_1to1.php");
+ exit;
+ }
+} else {
+ /* yuck - IE won't send value attributes for image buttons, while Mozilla does - so we use .x/.y to find move button clicks instead... */
+ unset($movebtn);
+ foreach ($_POST as $pn => $pd) {
+ if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
+ $movebtn = $matches[1];
+ break;
+ }
+ }
+ /* move selected rules before this rule */
+ if (isset($movebtn) && is_array($_POST['rule']) && count($_POST['rule'])) {
+ $a_1to1_new = array();
+
+ /* copy all rules < $movebtn and not selected */
+ for ($i = 0; $i < $movebtn; $i++) {
+ if (!in_array($i, $_POST['rule'])) {
+ $a_1to1_new[] = $a_1to1[$i];
+ }
+ }
+
+ /* copy all selected rules */
+ for ($i = 0; $i < count($a_1to1); $i++) {
+ if ($i == $movebtn) {
+ continue;
+ }
+ if (in_array($i, $_POST['rule'])) {
+ $a_1to1_new[] = $a_1to1[$i];
+ }
+ }
+
+ /* copy $movebtn rule */
+ if ($movebtn < count($a_1to1)) {
+ $a_1to1_new[] = $a_1to1[$movebtn];
+ }
+
+ /* copy all rules > $movebtn and not selected */
+ for ($i = $movebtn+1; $i < count($a_1to1); $i++) {
+ if (!in_array($i, $_POST['rule'])) {
+ $a_1to1_new[] = $a_1to1[$i];
+ }
+ }
+ if (count($a_1to1_new) > 0) {
+ $a_1to1 = $a_1to1_new;
+ }
+
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_1to1.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("1:1"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="firewall_nat_1to1.php" method="post">
+<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+<?php
+if ($savemsg) {
+ print_info_box($savemsg);
+}
+if (is_subsystem_dirty('natconf')) {
+ print_info_box_np(gettext("The NAT configuration has been changed.") .
+ "<br />" .
+ gettext("You must apply the changes in order for them to take effect."));
+}
+?>
+<br />
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall nat 1to1">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Port Forward"), false, "firewall_nat.php");
+ $tab_array[] = array(gettext("1:1"), true, "firewall_nat_1to1.php");
+ $tab_array[] = array(gettext("Outbound"), false, "firewall_nat_out.php");
+ $tab_array[] = array(gettext("NPt"), false, "firewall_nat_npt.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr><td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr id="frheader">
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="10%" class="listhdrr"><?=gettext("Interface"); ?></td>
+ <td width="15%" class="listhdrr"><?=gettext("External IP"); ?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Internal IP"); ?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Destination IP"); ?></td>
+ <td width="29%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle">
+ <a href="firewall_nat_1to1_edit.php">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add rule"); ?>" alt="add" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $textse = "</span>";
+ $i = 0;
+ foreach ($a_1to1 as $natent):
+ if (isset($natent['disabled'])) {
+ $textss = "<span class=\"gray\">";
+ $iconfn = "pass_d";
+ } else {
+ $textss = "<span>";
+ $iconfn = "pass";
+ }
+?>
+ <tr valign="top" id="fr<?=$i;?>">
+ <td class="listt">
+ <input type="checkbox" id="frc<?=$i;?>" name="rule[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
+ </td>
+ <td class="listt" align="center">
+ <a href="?act=toggle&amp;id=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
+ title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
+ </a>
+ </td>
+ <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ if (!$natent['interface']) {
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr("wan"));
+ } else {
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface']));
+ }
+ echo $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+<?php
+ $source_net = pprint_address($natent['source']);
+ $source_cidr = strstr($source_net, '/');
+ echo $textss . $natent['external'] . $source_cidr . $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss . $source_net . $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss . pprint_address($natent['destination']) . $textse;
+?>
+ </td>
+ <td class="listbg" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss . htmlspecialchars($natent['descr']) . '&nbsp;' . $textse;
+?>
+ </td>
+ <td class="list nowrap" valign="middle">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move">
+ <tr>
+ <td>
+ <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>"
+ src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
+ title="<?=gettext("move selected rules before this rule");?>"
+ type="image" style="height:17;width:17;border:0" />
+ </td>
+ <td>
+ <a href="firewall_nat_1to1_edit.php?id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit rule");?>" alt="edit" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td align="center" valign="middle">
+ <a href="firewall_nat_1to1.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this rule?");?>')">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule");?>" alt="delete" />
+ </a>
+ </td>
+ <td>
+ <a href="firewall_nat_1to1_edit.php?dup=<?=$i;?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0" alt="duplicate" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="7"></td>
+ <td class="list nowrap" valign="middle">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td>
+<?php
+ if ($i == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17"
+ title="<?=gettext("move selected mappings to end");?>" border="0" alt="move" />
+<?php
+ else:
+?>
+ <input name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
+ style="width:17;height:17;border:0" title="<?=gettext("move selected mappings to end");?>" />
+<?php
+ endif;
+?>
+ </td>
+ <td>
+ <a href="firewall_nat_1to1_edit.php">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0"
+ title="<?=gettext("add new mapping");?>" alt="add" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+<?php
+ if ($i == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17"
+ title="<?=gettext("delete selected rules");?>" border="0" alt="delete" />
+<?php
+ else:
+?>
+ <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
+ style="width:17;height:17" title="<?=gettext("delete selected mappings");?>"
+ onclick="return confirm('<?=gettext("Do you really want to delete the selected mappings?");?>')" />
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="7">
+ <p><span class="vexpl">
+ <span class="red"><strong><?=gettext("Note:"); ?><br /></strong></span>
+ <?=gettext("Depending on the way your WAN connection is setup, you may also need a"); ?>
+ <a href="firewall_virtual_ip.php"><?=gettext("Virtual IP."); ?></a><br />
+ <?=gettext("If you add a 1:1 NAT entry for any of the interface IPs on this system, " .
+ "it will make this system inaccessible on that IP address. i.e. if " .
+ "you use your WAN IP address, any services on this system (IPsec, OpenVPN server, etc.) " .
+ "using the WAN IP address will no longer function."); ?>
+ </span></p>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td></tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_nat_1to1_edit.php b/src/usr/local/www/firewall_nat_1to1_edit.php
new file mode 100644
index 0000000..e415015
--- /dev/null
+++ b/src/usr/local/www/firewall_nat_1to1_edit.php
@@ -0,0 +1,592 @@
+<?php
+/* $Id$ */
+/*
+ firewall_nat_1to1_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: nat
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-nat-1-1-edit
+##|*NAME=Firewall: NAT: 1:1: Edit page
+##|*DESCR=Allow access to the 'Firewall: NAT: 1:1: Edit' page.
+##|*MATCH=firewall_nat_1to1_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("interfaces.inc");
+require_once("filter.inc");
+require("shaper.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat_1to1.php');
+}
+
+$specialsrcdst = explode(" ", "any pptp pppoe l2tp openvpn");
+$ifdisp = get_configured_interface_with_descr();
+foreach ($ifdisp as $kif => $kdescr) {
+ $specialsrcdst[] = "{$kif}";
+ $specialsrcdst[] = "{$kif}ip";
+}
+
+if (!is_array($config['nat']['onetoone'])) {
+ $config['nat']['onetoone'] = array();
+}
+
+$a_1to1 = &$config['nat']['onetoone'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+$after = $_GET['after'];
+if (isset($_POST['after'])) {
+ $after = $_POST['after'];
+}
+
+if (isset($_GET['dup'])) {
+ $id = $_GET['dup'];
+ $after = $_GET['dup'];
+}
+
+if (isset($id) && $a_1to1[$id]) {
+ $pconfig['disabled'] = isset($a_1to1[$id]['disabled']);
+
+ address_to_pconfig($a_1to1[$id]['source'], $pconfig['src'],
+ $pconfig['srcmask'], $pconfig['srcnot'],
+ $pconfig['srcbeginport'], $pconfig['srcendport']);
+
+ address_to_pconfig($a_1to1[$id]['destination'], $pconfig['dst'],
+ $pconfig['dstmask'], $pconfig['dstnot'],
+ $pconfig['dstbeginport'], $pconfig['dstendport']);
+
+ $pconfig['interface'] = $a_1to1[$id]['interface'];
+ if (!$pconfig['interface']) {
+ $pconfig['interface'] = "wan";
+ }
+
+ $pconfig['external'] = $a_1to1[$id]['external'];
+ $pconfig['descr'] = $a_1to1[$id]['descr'];
+ $pconfig['natreflection'] = $a_1to1[$id]['natreflection'];
+} else {
+ $pconfig['interface'] = "wan";
+}
+
+if (isset($_GET['dup'])) {
+ unset($id);
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+ /* run through $_POST items encoding HTML entities so that the user
+ * cannot think he is slick and perform a XSS attack on the unwilling
+ */
+ foreach ($_POST as $key => $value) {
+ $temp = str_replace(">", "", $value);
+ $newpost = htmlentities($temp);
+ if ($newpost <> $temp) {
+ $input_errors[] = sprintf(gettext("Invalid characters detected (%s). Please remove invalid characters and save again."), $temp);
+ }
+ }
+
+ /* input validation */
+ $reqdfields = explode(" ", "interface external");
+ $reqdfieldsn = array(gettext("Interface"), gettext("External subnet"));
+ if ($_POST['srctype'] == "single" || $_POST['srctype'] == "network") {
+ $reqdfields[] = "src";
+ $reqdfieldsn[] = gettext("Source address");
+ }
+ if ($_POST['dsttype'] == "single" || $_POST['dsttype'] == "network") {
+ $reqdfields[] = "dst";
+ $reqdfieldsn[] = gettext("Destination address");
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['external']) {
+ $_POST['external'] = trim($_POST['external']);
+ }
+ if ($_POST['src']) {
+ $_POST['src'] = trim($_POST['src']);
+ }
+ if ($_POST['dst']) {
+ $_POST['dst'] = trim($_POST['dst']);
+ }
+
+ if (is_specialnet($_POST['srctype'])) {
+ $_POST['src'] = $_POST['srctype'];
+ $_POST['srcmask'] = 0;
+ } else if ($_POST['srctype'] == "single") {
+ $_POST['srcmask'] = 32;
+ }
+ if (is_specialnet($_POST['dsttype'])) {
+ $_POST['dst'] = $_POST['dsttype'];
+ $_POST['dstmask'] = 0;
+ } else if ($_POST['dsttype'] == "single") {
+ $_POST['dstmask'] = 32;
+ } else if (is_ipaddr($_POST['dsttype'])) {
+ $_POST['dst'] = $_POST['dsttype'];
+ $_POST['dstmask'] = 32;
+ $_POST['dsttype'] = "single";
+ }
+
+ /* For external, user can enter only ip's */
+ if (($_POST['external'] && !is_ipaddr($_POST['external']))) {
+ $input_errors[] = gettext("A valid external subnet must be specified.");
+ }
+
+ /* For dst, if user enters an alias and selects "network" then disallow. */
+ if ($_POST['dsttype'] == "network" && is_alias($_POST['dst'])) {
+ $input_errors[] = gettext("You must specify single host or alias for alias entries.");
+ }
+
+ /* For src, user can enter only ip's or networks */
+ if (!is_specialnet($_POST['srctype'])) {
+ if (($_POST['src'] && !is_ipaddr($_POST['src']))) {
+ $input_errors[] = sprintf(gettext("%s is not a valid internal IP address."), $_POST['src']);
+ }
+ if (($_POST['srcmask'] && !is_numericint($_POST['srcmask']))) {
+ $input_errors[] = gettext("A valid internal bit count must be specified.");
+ }
+ }
+
+ /* For dst, user can enter ip's, networks or aliases */
+ if (!is_specialnet($_POST['dsttype'])) {
+ if (($_POST['dst'] && !is_ipaddroralias($_POST['dst']))) {
+ $input_errors[] = sprintf(gettext("%s is not a valid destination IP address or alias."), $_POST['dst']);
+ }
+ if (($_POST['dstmask'] && !is_numericint($_POST['dstmask']))) {
+ $input_errors[] = gettext("A valid destination bit count must be specified.");
+ }
+ }
+
+ /* check for overlaps with other 1:1 */
+ foreach ($a_1to1 as $natent) {
+ if (isset($id) && ($a_1to1[$id]) && ($a_1to1[$id] === $natent)) {
+ continue;
+ }
+
+ if (check_subnets_overlap($_POST['internal'], $_POST['subnet'], $natent['internal'], $natent['subnet'])) {
+ //$input_errors[] = "Another 1:1 rule overlaps with the specified internal subnet.";
+ //break;
+ }
+ }
+
+ if (!$input_errors) {
+ $natent = array();
+
+ $natent['disabled'] = isset($_POST['disabled']) ? true:false;
+ $natent['external'] = $_POST['external'];
+ $natent['descr'] = $_POST['descr'];
+ $natent['interface'] = $_POST['interface'];
+
+ pconfig_to_address($natent['source'], $_POST['src'],
+ $_POST['srcmask'], $_POST['srcnot']);
+
+ pconfig_to_address($natent['destination'], $_POST['dst'],
+ $_POST['dstmask'], $_POST['dstnot']);
+
+ if ($_POST['natreflection'] == "enable" || $_POST['natreflection'] == "disable") {
+ $natent['natreflection'] = $_POST['natreflection'];
+ } else {
+ unset($natent['natreflection']);
+ }
+
+ if (isset($id) && $a_1to1[$id]) {
+ $a_1to1[$id] = $natent;
+ } else {
+ if (is_numeric($after)) {
+ array_splice($a_1to1, $after+1, 0, array($natent));
+ } else {
+ $a_1to1[] = $natent;
+ }
+ }
+
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_1to1.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("1:1"), gettext("Edit"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script type="text/javascript" src="/javascript/suggestions.js"></script>
+<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
+<script type="text/javascript">
+//<![CDATA[
+function typesel_change() {
+ switch (document.iform.srctype.selectedIndex) {
+ case 1: /* single */
+ document.iform.src.disabled = 0;
+ document.iform.srcmask.value = "";
+ document.iform.srcmask.disabled = 1;
+ break;
+ case 2: /* network */
+ document.iform.src.disabled = 0;
+ document.iform.srcmask.disabled = 0;
+ break;
+ default:
+ document.iform.src.value = "";
+ document.iform.src.disabled = 1;
+ document.iform.srcmask.value = "";
+ document.iform.srcmask.disabled = 1;
+ break;
+ }
+ switch (document.iform.dsttype.selectedIndex) {
+ case 1: /* single */
+ document.iform.dst.disabled = 0;
+ document.iform.dstmask.value = "";
+ document.iform.dstmask.disabled = 1;
+ break;
+ case 2: /* network */
+ document.iform.dst.disabled = 0;
+ document.iform.dstmask.disabled = 0;
+ break;
+ default:
+ document.iform.dst.value = "";
+ document.iform.dst.disabled = 1;
+ document.iform.dstmask.value = "";
+ document.iform.dstmask.disabled = 1;
+ break;
+ }
+}
+//]]>
+</script>
+
+<?php
+include("fbegin.inc");
+if ($input_errors) {
+ print_input_errors($input_errors);
+}
+?>
+<form action="firewall_nat_1to1_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall nat 1to1 edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit NAT 1:1 entry"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable this rule"); ?></strong><br />
+ <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect">
+<?php
+ foreach ($ifdisp as $if => $ifdesc) {
+ if (have_ruleint_access($if)) {
+ $interfaces[$if] = $ifdesc;
+ }
+ }
+
+ if ($config['l2tp']['mode'] == "server") {
+ if (have_ruleint_access("l2tp")) {
+ $interfaces['l2tp'] = "L2TP VPN";
+ }
+ }
+
+ if ($config['pptpd']['mode'] == "server") {
+ if (have_ruleint_access("pptp")) {
+ $interfaces['pptp'] = "PPTP VPN";
+ }
+ }
+
+ if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
+ $interfaces['pppoe'] = "PPPoE Server";
+ }
+
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ if (have_ruleint_access("enc0")) {
+ $interfaces["enc0"] = "IPsec";
+ }
+ }
+
+ /* add openvpn/tun interfaces */
+ if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
+ $interfaces["openvpn"] = "OpenVPN";
+ }
+
+ foreach ($interfaces as $iface => $ifacename):
+?>
+ <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+<?php
+ endforeach;
+?>
+ </select><br />
+ <span class="vexpl"><?=gettext("Choose which interface this rule applies to"); ?>.<br />
+ <?=gettext("Hint: in most cases, you'll want to use WAN here"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("External subnet IP"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="external" type="text" class="formfld unknown" id="external" size="20" value="<?=htmlspecialchars($pconfig['external']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Enter the external (usually on a WAN) subnet's starting address for the 1:1 mapping. " .
+ "The subnet mask from the internal address below will be applied to this IP address."); ?><br />
+ <?=gettext("Hint: this is generally an address owned by the router itself on the selected interface."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Internal IP"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="srcnot" type="checkbox" id="srcnot" value="yes" <?php if ($pconfig['srcnot']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("not"); ?></strong>
+ <br />
+ <?=gettext("Use this option to invert the sense of the match."); ?>
+ <br />
+ <br />
+ <table border="0" cellspacing="0" cellpadding="0" summary="source">
+ <tr>
+ <td><?=gettext("Type:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="srctype" class="formselect" onchange="typesel_change()">
+<?php
+ $sel = is_specialnet($pconfig['src']);
+?>
+ <option value="any" <?php if ($pconfig['src'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any"); ?></option>
+ <option value="single" <?php if ((($pconfig['srcmask'] == 32) || !isset($pconfig['srcmask'])) && !$sel) { echo "selected=\"selected\""; $sel = 1; } ?>>
+ <?=gettext("Single host"); ?>
+ </option>
+ <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network"); ?></option>
+<?php
+ if (have_ruleint_access("pptp")):
+?>
+ <option value="pptp" <?php if ($pconfig['src'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients"); ?></option>
+<?php
+ endif;
+ if (have_ruleint_access("pppoe")):
+?>
+ <option value="pppoe" <?php if ($pconfig['src'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients"); ?></option>
+<?php
+ endif;
+ if (have_ruleint_access("l2tp")):
+?>
+ <option value="l2tp" <?php if ($pconfig['src'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients"); ?></option>
+<?php
+ endif;
+ foreach ($ifdisp as $ifent => $ifdesc):
+ if (have_ruleint_access($ifent)):
+?>
+ <option value="<?=$ifent;?>" <?php if ($pconfig['src'] == $ifent) { echo "selected=\"selected\""; } ?>>
+ <?=htmlspecialchars($ifdesc);?> <?=gettext("net"); ?>
+ </option>
+ <option value="<?=$ifent;?>ip"<?php if ($pconfig['src'] == $ifent . "ip") { echo "selected=\"selected\""; } ?>>
+ <?=$ifdesc?> <?=gettext("address");?>
+ </option>
+<?php
+ endif;
+ endforeach;
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="src" type="text" class="formfld" id="src" size="20" value="<?php if (!is_specialnet($pconfig['src'])) echo htmlspecialchars($pconfig['src']);?>" /> /
+ <select name="srcmask" class="formselect" id="srcmask">
+<?php
+ for ($i = 31; $i > 0; $i--):
+?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['srcmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
+<?php
+ endfor;
+?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl"><?=gettext("Enter the internal (LAN) subnet for the 1:1 mapping. The subnet size specified for the internal subnet will be applied to the external subnet."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dstnot" type="checkbox" id="dstnot" value="yes" <?php if ($pconfig['dstnot']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("not"); ?></strong>
+ <br />
+ <?=gettext("Use this option to invert the sense of the match."); ?>
+ <br />
+ <br />
+ <table border="0" cellspacing="0" cellpadding="0" summary="destination">
+ <tr>
+ <td><?=gettext("Type:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="dsttype" class="formselect" onchange="typesel_change()">
+<?php
+ $sel = is_specialnet($pconfig['dst']); ?>
+ <option value="any" <?php if (empty($pconfig['dst']) || $pconfig['dst'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any"); ?></option>
+ <option value="single" <?php if (($pconfig['dstmask'] == 32) && !$sel) { echo "selected=\"selected\""; $sel = 1; } ?>>
+ <?=gettext("Single host or alias"); ?>
+ </option>
+ <option value="network" <?php if (!$sel && !empty($pconfig['dst'])) echo "selected=\"selected\""; ?>>
+ <?=gettext("Network"); ?>
+ </option>
+<?php
+ if (have_ruleint_access("pptp")):
+?>
+ <option value="pptp" <?php if ($pconfig['dst'] == "pptp") { echo "selected=\"selected\""; } ?>>
+ <?=gettext("PPTP clients"); ?>
+ </option>
+<?php
+ endif;
+ if (have_ruleint_access("pppoe")):
+?>
+ <option value="pppoe" <?php if ($pconfig['dst'] == "pppoe") { echo "selected=\"selected\""; } ?>>
+ <?=gettext("PPPoE clients"); ?>
+ </option>
+<?php
+ endif;
+ if (have_ruleint_access("l2tp")):
+?>
+ <option value="l2tp" <?php if ($pconfig['dst'] == "l2tp") { echo "selected=\"selected\""; } ?>>
+ <?=gettext("L2TP clients"); ?>
+ </option>
+<?php
+ endif;
+
+ foreach ($ifdisp as $if => $ifdesc):
+ if (have_ruleint_access($if)):
+?>
+ <option value="<?=$if;?>" <?php if ($pconfig['dst'] == $if) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?>
+ <?=gettext("net"); ?>
+ </option>
+ <option value="<?=$if;?>ip"<?php if ($pconfig['dst'] == $if . "ip") { echo "selected=\"selected\""; } ?>>
+ <?=$ifdesc;?> <?=gettext("address");?>
+ </option>
+<?php
+ endif;
+ endforeach;
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="dst" type="text" autocomplete="off" class="formfldalias" id="dst" size="20" value="<?php if (!is_specialnet($pconfig['dst'])) echo htmlspecialchars($pconfig['dst']);?>" />
+ /
+ <select name="dstmask" class="formselect" id="dstmask">
+<?php
+ for ($i = 31; $i > 0; $i--):
+?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['dstmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
+<?php
+ endfor;
+?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl">
+ <?=gettext("The 1:1 mapping will only be used for connections to or from the specified destination."); ?><br />
+ <?=gettext("Hint: this is usually 'any'."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed)."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NAT reflection"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="natreflection" class="formselect">
+ <option value="default" <?php if ($pconfig['natreflection'] != "enable" && $pconfig['natreflection'] != "disable") echo "selected=\"selected\""; ?>>
+ <?=gettext("use system default"); ?>
+ </option>
+ <option value="enable" <?php if ($pconfig['natreflection'] == "enable") echo "selected=\"selected\""; ?>>
+ <?=gettext("enable"); ?>
+ </option>
+ <option value="disable" <?php if ($pconfig['natreflection'] == "disable") echo "selected=\"selected\""; ?>>
+ <?=gettext("disable"); ?>
+ </option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_1to1[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+ typesel_change();
+//]]>
+</script>
+<script type="text/javascript">
+//<![CDATA[
+ var addressarray = <?= json_encode(get_alias_list(array("host", "network", "openvpn", "urltable"))) ?>;
+ var oTextbox1 = new AutoSuggestControl(document.getElementById("dst"), new StateSuggestions(addressarray));
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_nat_edit.php b/src/usr/local/www/firewall_nat_edit.php
new file mode 100644
index 0000000..db8a174
--- /dev/null
+++ b/src/usr/local/www/firewall_nat_edit.php
@@ -0,0 +1,1016 @@
+<?php
+/* $Id$ */
+/*
+ firewall_nat_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: nat
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-nat-portforward-edit
+##|*NAME=Firewall: NAT: Port Forward: Edit page
+##|*DESCR=Allow access to the 'Firewall: NAT: Port Forward: Edit' page.
+##|*MATCH=firewall_nat_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("itemid.inc");
+require_once("filter.inc");
+require("shaper.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat.php');
+}
+
+$specialsrcdst = explode(" ", "any (self) pptp pppoe l2tp openvpn");
+$ifdisp = get_configured_interface_with_descr();
+foreach ($ifdisp as $kif => $kdescr) {
+ $specialsrcdst[] = "{$kif}";
+ $specialsrcdst[] = "{$kif}ip";
+}
+
+if (!is_array($config['nat']['rule'])) {
+ $config['nat']['rule'] = array();
+}
+$a_nat = &$config['nat']['rule'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (is_numericint($_GET['after']) || $_GET['after'] == "-1") {
+ $after = $_GET['after'];
+}
+if (isset($_POST['after']) && (is_numericint($_POST['after']) || $_POST['after'] == "-1")) {
+ $after = $_POST['after'];
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ $id = $_GET['dup'];
+ $after = $_GET['dup'];
+}
+
+if (isset($id) && $a_nat[$id]) {
+ if (isset($a_nat[$id]['created']) && is_array($a_nat[$id]['created'])) {
+ $pconfig['created'] = $a_nat[$id]['created'];
+ }
+
+ if (isset($a_nat[$id]['updated']) && is_array($a_nat[$id]['updated'])) {
+ $pconfig['updated'] = $a_nat[$id]['updated'];
+ }
+
+ $pconfig['disabled'] = isset($a_nat[$id]['disabled']);
+ $pconfig['nordr'] = isset($a_nat[$id]['nordr']);
+ address_to_pconfig($a_nat[$id]['source'], $pconfig['src'],
+ $pconfig['srcmask'], $pconfig['srcnot'],
+ $pconfig['srcbeginport'], $pconfig['srcendport']);
+
+ address_to_pconfig($a_nat[$id]['destination'], $pconfig['dst'],
+ $pconfig['dstmask'], $pconfig['dstnot'],
+ $pconfig['dstbeginport'], $pconfig['dstendport']);
+
+ $pconfig['proto'] = $a_nat[$id]['protocol'];
+ $pconfig['localip'] = $a_nat[$id]['target'];
+ $pconfig['localbeginport'] = $a_nat[$id]['local-port'];
+ $pconfig['descr'] = $a_nat[$id]['descr'];
+ $pconfig['interface'] = $a_nat[$id]['interface'];
+ $pconfig['associated-rule-id'] = $a_nat[$id]['associated-rule-id'];
+ $pconfig['nosync'] = isset($a_nat[$id]['nosync']);
+ $pconfig['natreflection'] = $a_nat[$id]['natreflection'];
+
+ if (!$pconfig['interface']) {
+ $pconfig['interface'] = "wan";
+ }
+} else {
+ $pconfig['interface'] = "wan";
+ $pconfig['src'] = "any";
+ $pconfig['srcbeginport'] = "any";
+ $pconfig['srcendport'] = "any";
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ unset($id);
+}
+
+/* run through $_POST items encoding HTML entities so that the user
+ * cannot think he is slick and perform a XSS attack on the unwilling
+ */
+unset($input_errors);
+foreach ($_POST as $key => $value) {
+ $temp = $value;
+ $newpost = htmlentities($temp);
+ if ($newpost <> $temp) {
+ $input_errors[] = sprintf(gettext("Invalid characters detected %s. Please remove invalid characters and save again."), $temp);
+ }
+}
+
+if ($_POST) {
+
+ if (strtoupper($_POST['proto']) == "TCP" || strtoupper($_POST['proto']) == "UDP" || strtoupper($_POST['proto']) == "TCP/UDP") {
+ if ($_POST['srcbeginport_cust'] && !$_POST['srcbeginport']) {
+ $_POST['srcbeginport'] = trim($_POST['srcbeginport_cust']);
+ }
+ if ($_POST['srcendport_cust'] && !$_POST['srcendport']) {
+ $_POST['srcendport'] = trim($_POST['srcendport_cust']);
+ }
+
+ if ($_POST['srcbeginport'] == "any") {
+ $_POST['srcbeginport'] = 0;
+ $_POST['srcendport'] = 0;
+ } else {
+ if (!$_POST['srcendport']) {
+ $_POST['srcendport'] = $_POST['srcbeginport'];
+ }
+ }
+ if ($_POST['srcendport'] == "any") {
+ $_POST['srcendport'] = $_POST['srcbeginport'];
+ }
+
+ if ($_POST['dstbeginport_cust'] && !$_POST['dstbeginport']) {
+ $_POST['dstbeginport'] = trim($_POST['dstbeginport_cust']);
+ }
+ if ($_POST['dstendport_cust'] && !$_POST['dstendport']) {
+ $_POST['dstendport'] = trim($_POST['dstendport_cust']);
+ }
+
+ if ($_POST['dstbeginport'] == "any") {
+ $_POST['dstbeginport'] = 0;
+ $_POST['dstendport'] = 0;
+ } else {
+ if (!$_POST['dstendport']) {
+ $_POST['dstendport'] = $_POST['dstbeginport'];
+ }
+ }
+ if ($_POST['dstendport'] == "any") {
+ $_POST['dstendport'] = $_POST['dstbeginport'];
+ }
+
+ if ($_POST['localbeginport_cust'] && !$_POST['localbeginport']) {
+ $_POST['localbeginport'] = trim($_POST['localbeginport_cust']);
+ }
+
+ /* Make beginning port end port if not defined and endport is */
+ if (!$_POST['srcbeginport'] && $_POST['srcendport']) {
+ $_POST['srcbeginport'] = $_POST['srcendport'];
+ }
+ if (!$_POST['dstbeginport'] && $_POST['dstendport']) {
+ $_POST['dstbeginport'] = $_POST['dstendport'];
+ }
+ } else {
+ $_POST['srcbeginport'] = 0;
+ $_POST['srcendport'] = 0;
+ $_POST['dstbeginport'] = 0;
+ $_POST['dstendport'] = 0;
+ }
+
+ if (is_specialnet($_POST['srctype'])) {
+ $_POST['src'] = $_POST['srctype'];
+ $_POST['srcmask'] = 0;
+ } else if ($_POST['srctype'] == "single") {
+ $_POST['srcmask'] = 32;
+ }
+ if (is_specialnet($_POST['dsttype'])) {
+ $_POST['dst'] = $_POST['dsttype'];
+ $_POST['dstmask'] = 0;
+ } else if ($_POST['dsttype'] == "single") {
+ $_POST['dstmask'] = 32;
+ } else if (is_ipaddr($_POST['dsttype'])) {
+ $_POST['dst'] = $_POST['dsttype'];
+ $_POST['dstmask'] = 32;
+ $_POST['dsttype'] = "single";
+ }
+
+ $pconfig = $_POST;
+
+ /* input validation */
+ if (strtoupper($_POST['proto']) == "TCP" or strtoupper($_POST['proto']) == "UDP" or strtoupper($_POST['proto']) == "TCP/UDP") {
+ $reqdfields = explode(" ", "interface proto dstbeginport dstendport");
+ $reqdfieldsn = array(gettext("Interface"), gettext("Protocol"), gettext("Destination port from"), gettext("Destination port to"));
+ } else {
+ $reqdfields = explode(" ", "interface proto");
+ $reqdfieldsn = array(gettext("Interface"), gettext("Protocol"));
+ }
+
+ if ($_POST['srctype'] == "single" || $_POST['srctype'] == "network") {
+ $reqdfields[] = "src";
+ $reqdfieldsn[] = gettext("Source address");
+ }
+ if ($_POST['dsttype'] == "single" || $_POST['dsttype'] == "network") {
+ $reqdfields[] = "dst";
+ $reqdfieldsn[] = gettext("Destination address");
+ }
+ if (!isset($_POST['nordr'])) {
+ $reqdfields[] = "localip";
+ $reqdfieldsn[] = gettext("Redirect target IP");
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!$_POST['srcbeginport']) {
+ $_POST['srcbeginport'] = 0;
+ $_POST['srcendport'] = 0;
+ }
+ if (!$_POST['dstbeginport']) {
+ $_POST['dstbeginport'] = 0;
+ $_POST['dstendport'] = 0;
+ }
+
+ if ($_POST['src']) {
+ $_POST['src'] = trim($_POST['src']);
+ }
+ if ($_POST['dst']) {
+ $_POST['dst'] = trim($_POST['dst']);
+ }
+ if ($_POST['localip']) {
+ $_POST['localip'] = trim($_POST['localip']);
+ }
+
+ if (!isset($_POST['nordr']) && ($_POST['localip'] && !is_ipaddroralias($_POST['localip']))) {
+ $input_errors[] = sprintf(gettext("\"%s\" is not a valid redirect target IP address or host alias."), $_POST['localip']);
+ }
+
+ if ($_POST['srcbeginport'] && !is_portoralias($_POST['srcbeginport'])) {
+ $input_errors[] = sprintf(gettext("%s is not a valid start source port. It must be a port alias or integer between 1 and 65535."), $_POST['srcbeginport']);
+ }
+ if ($_POST['srcendport'] && !is_portoralias($_POST['srcendport'])) {
+ $input_errors[] = sprintf(gettext("%s is not a valid end source port. It must be a port alias or integer between 1 and 65535."), $_POST['srcendport']);
+ }
+ if ($_POST['dstbeginport'] && !is_portoralias($_POST['dstbeginport'])) {
+ $input_errors[] = sprintf(gettext("%s is not a valid start destination port. It must be a port alias or integer between 1 and 65535."), $_POST['dstbeginport']);
+ }
+ if ($_POST['dstendport'] && !is_portoralias($_POST['dstendport'])) {
+ $input_errors[] = sprintf(gettext("%s is not a valid end destination port. It must be a port alias or integer between 1 and 65535."), $_POST['dstendport']);
+ }
+
+ if ((strtoupper($_POST['proto']) == "TCP" || strtoupper($_POST['proto']) == "UDP" || strtoupper($_POST['proto']) == "TCP/UDP") && (!isset($_POST['nordr']) && !is_portoralias($_POST['localbeginport']))) {
+ $input_errors[] = sprintf(gettext("A valid redirect target port must be specified. It must be a port alias or integer between 1 and 65535."), $_POST['localbeginport']);
+ }
+
+ /* if user enters an alias and selects "network" then disallow. */
+ if (($_POST['srctype'] == "network" && is_alias($_POST['src'])) ||
+ ($_POST['dsttype'] == "network" && is_alias($_POST['dst']))) {
+ $input_errors[] = gettext("You must specify single host or alias for alias entries.");
+ }
+
+ if (!is_specialnet($_POST['srctype'])) {
+ if (($_POST['src'] && !is_ipaddroralias($_POST['src']))) {
+ $input_errors[] = sprintf(gettext("%s is not a valid source IP address or alias."), $_POST['src']);
+ }
+ if (($_POST['srcmask'] && !is_numericint($_POST['srcmask']))) {
+ $input_errors[] = gettext("A valid source bit count must be specified.");
+ }
+ }
+ if (!is_specialnet($_POST['dsttype'])) {
+ if (($_POST['dst'] && !is_ipaddroralias($_POST['dst']))) {
+ $input_errors[] = sprintf(gettext("%s is not a valid destination IP address or alias."), $_POST['dst']);
+ }
+ if (($_POST['dstmask'] && !is_numericint($_POST['dstmask']))) {
+ $input_errors[] = gettext("A valid destination bit count must be specified.");
+ }
+ }
+
+ if ($_POST['srcbeginport'] > $_POST['srcendport']) {
+ /* swap */
+ $tmp = $_POST['srcendport'];
+ $_POST['srcendport'] = $_POST['srcbeginport'];
+ $_POST['srcbeginport'] = $tmp;
+ }
+ if ($_POST['dstbeginport'] > $_POST['dstendport']) {
+ /* swap */
+ $tmp = $_POST['dstendport'];
+ $_POST['dstendport'] = $_POST['dstbeginport'];
+ $_POST['dstbeginport'] = $tmp;
+ }
+
+ if (!$input_errors) {
+ if (!isset($_POST['nordr']) && ($_POST['dstendport'] - $_POST['dstbeginport'] + $_POST['localbeginport']) > 65535) {
+ $input_errors[] = gettext("The target port range must be an integer between 1 and 65535.");
+ }
+ }
+
+ /* check for overlaps */
+ foreach ($a_nat as $natent) {
+ if (isset($id) && ($a_nat[$id]) && ($a_nat[$id] === $natent)) {
+ continue;
+ }
+ if ($natent['interface'] != $_POST['interface']) {
+ continue;
+ }
+ if ($natent['destination']['address'] != $_POST['dst']) {
+ continue;
+ }
+ if (($natent['proto'] != $_POST['proto']) && ($natent['proto'] != "tcp/udp") && ($_POST['proto'] != "tcp/udp")) {
+ continue;
+ }
+
+ list($begp, $endp) = explode("-", $natent['destination']['port']);
+ if (!$endp) {
+ $endp = $begp;
+ }
+
+ if (!((($_POST['dstbeginport'] < $begp) && ($_POST['dstendport'] < $begp)) ||
+ (($_POST['dstbeginport'] > $endp) && ($_POST['dstendport'] > $endp)))) {
+ $input_errors[] = gettext("The destination port range overlaps with an existing entry.");
+ break;
+ }
+ }
+
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/input_validation");
+
+ if (!$input_errors) {
+ $natent = array();
+
+ $natent['disabled'] = isset($_POST['disabled']) ? true:false;
+ $natent['nordr'] = isset($_POST['nordr']) ? true:false;
+
+ if ($natent['nordr']) {
+ $_POST['associated-rule-id'] = '';
+ $_POST['filter-rule-association'] = '';
+ }
+
+ pconfig_to_address($natent['source'], $_POST['src'],
+ $_POST['srcmask'], $_POST['srcnot'],
+ $_POST['srcbeginport'], $_POST['srcendport']);
+
+ pconfig_to_address($natent['destination'], $_POST['dst'],
+ $_POST['dstmask'], $_POST['dstnot'],
+ $_POST['dstbeginport'], $_POST['dstendport']);
+
+ $natent['protocol'] = $_POST['proto'];
+
+ if (!$natent['nordr']) {
+ $natent['target'] = $_POST['localip'];
+ $natent['local-port'] = $_POST['localbeginport'];
+ }
+ $natent['interface'] = $_POST['interface'];
+ $natent['descr'] = $_POST['descr'];
+ $natent['associated-rule-id'] = $_POST['associated-rule-id'];
+
+ if ($_POST['filter-rule-association'] == "pass") {
+ $natent['associated-rule-id'] = "pass";
+ }
+
+ if ($_POST['nosync'] == "yes") {
+ $natent['nosync'] = true;
+ } else {
+ unset($natent['nosync']);
+ }
+
+ if ($_POST['natreflection'] == "enable" || $_POST['natreflection'] == "purenat" || $_POST['natreflection'] == "disable") {
+ $natent['natreflection'] = $_POST['natreflection'];
+ } else {
+ unset($natent['natreflection']);
+ }
+
+ // If we used to have an associated filter rule, but no-longer should have one
+ if (!empty($a_nat[$id]) && (empty($natent['associated-rule-id']) || $natent['associated-rule-id'] != $a_nat[$id]['associated-rule-id'])) {
+ // Delete the previous rule
+ delete_id($a_nat[$id]['associated-rule-id'], $config['filter']['rule']);
+ mark_subsystem_dirty('filter');
+ }
+
+ $need_filter_rule = false;
+ // Updating a rule with a filter rule associated
+ if (!empty($natent['associated-rule-id'])) {
+ $need_filter_rule = true;
+ }
+ // Create a rule or if we want to create a new one
+ if ($natent['associated-rule-id'] == 'new') {
+ $need_filter_rule = true;
+ unset($natent['associated-rule-id']);
+ $_POST['filter-rule-association']='add-associated';
+ }
+ // If creating a new rule, where we want to add the filter rule, associated or not
+ else if (isset($_POST['filter-rule-association']) &&
+ ($_POST['filter-rule-association'] == 'add-associated' ||
+ $_POST['filter-rule-association'] == 'add-unassociated')) {
+ $need_filter_rule = true;
+ }
+
+ if ($need_filter_rule == true) {
+
+ /* auto-generate a matching firewall rule */
+ $filterent = array();
+ unset($filterentid);
+ // If a rule already exists, load it
+ if (!empty($natent['associated-rule-id'])) {
+ $filterentid = get_id($natent['associated-rule-id'], $config['filter']['rule']);
+ if ($filterentid === false) {
+ $filterent['associated-rule-id'] = $natent['associated-rule-id'];
+ } else {
+ $filterent =& $config['filter']['rule'][$filterentid];
+ }
+ }
+ pconfig_to_address($filterent['source'], $_POST['src'],
+ $_POST['srcmask'], $_POST['srcnot'],
+ $_POST['srcbeginport'], $_POST['srcendport']);
+
+ // Update interface, protocol and destination
+ $filterent['interface'] = $_POST['interface'];
+ $filterent['protocol'] = $_POST['proto'];
+ $filterent['destination']['address'] = $_POST['localip'];
+
+ $dstpfrom = $_POST['localbeginport'];
+ $dstpto = $dstpfrom + $_POST['dstendport'] - $_POST['dstbeginport'];
+
+ if ($dstpfrom == $dstpto) {
+ $filterent['destination']['port'] = $dstpfrom;
+ } else {
+ $filterent['destination']['port'] = $dstpfrom . "-" . $dstpto;
+ }
+
+ /*
+ * Our firewall filter description may be no longer than
+ * 63 characters, so don't let it be.
+ */
+ $filterent['descr'] = substr("NAT " . $_POST['descr'], 0, 62);
+
+ // If this is a new rule, create an ID and add the rule
+ if ($_POST['filter-rule-association'] == 'add-associated') {
+ $filterent['associated-rule-id'] = $natent['associated-rule-id'] = get_unique_id();
+ $filterent['created'] = make_config_revision_entry(null, gettext("NAT Port Forward"));
+ $config['filter']['rule'][] = $filterent;
+ }
+
+ mark_subsystem_dirty('filter');
+ }
+
+ if (isset($a_nat[$id]['created']) && is_array($a_nat[$id]['created'])) {
+ $natent['created'] = $a_nat[$id]['created'];
+ }
+
+ $natent['updated'] = make_config_revision_entry();
+
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/pre_write_config");
+
+ // Update the NAT entry now
+ if (isset($id) && $a_nat[$id]) {
+ $a_nat[$id] = $natent;
+ } else {
+ $natent['created'] = make_config_revision_entry();
+ if (is_numeric($after)) {
+ array_splice($a_nat, $after+1, 0, array($natent));
+ } else {
+ $a_nat[] = $natent;
+ }
+ }
+
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+
+ header("Location: firewall_nat.php");
+ exit;
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("Port Forward"), gettext("Edit"));
+include("head.inc");
+
+?>
+<link type="text/css" rel="stylesheet" href="/javascript/chosen/chosen.css" />
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script src="/javascript/chosen/chosen.jquery.js" type="text/javascript"></script>
+<?php
+include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="firewall_nat_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall nat edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Redirect entry"); ?></td>
+ </tr>
+<?php
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/htmlphpearly");
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable this rule"); ?></strong><br />
+ <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("No RDR (NOT)"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" name="nordr" id="nordr" onclick="nordr_change();" <?php if ($pconfig['nordr']) echo "checked=\"checked\""; ?> />
+ <span class="vexpl"><?=gettext("Enabling this option will disable redirection for traffic matching this rule."); ?>
+ <br /><?=gettext("Hint: this option is rarely needed, don't use this unless you know what you're doing."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect" onchange="dst_change(this.value, iface_old, document.iform.dsttype.value);iface_old = document.iform.interface.value;typesel_change();">
+ <?php
+ $iflist = get_configured_interface_with_descr(false, true);
+ // Allow extending of the firewall edit interfaces
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/pre_interfaces_edit");
+ foreach ($iflist as $if => $ifdesc) {
+ if (have_ruleint_access($if)) {
+ $interfaces[$if] = $ifdesc;
+ }
+ }
+
+ if ($config['l2tp']['mode'] == "server") {
+ if (have_ruleint_access("l2tp")) {
+ $interfaces['l2tp'] = "L2TP VPN";
+ }
+ }
+
+ if ($config['pptpd']['mode'] == "server") {
+ if (have_ruleint_access("pptp")) {
+ $interfaces['pptp'] = "PPTP VPN";
+ }
+ }
+
+ if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
+ $interfaces['pppoe'] = "PPPoE Server";
+ }
+
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ if (have_ruleint_access("enc0")) {
+ $interfaces["enc0"] = "IPsec";
+ }
+ }
+
+ /* add openvpn/tun interfaces */
+ if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
+ $interfaces["openvpn"] = "OpenVPN";
+ }
+
+ foreach ($interfaces as $iface => $ifacename): ?>
+ <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php endforeach; ?>
+ </select><br />
+ <span class="vexpl"><?=gettext("Choose which interface this rule applies to."); ?><br />
+ <?=gettext("Hint: in most cases, you'll want to use WAN here."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="proto" class="formselect" onchange="proto_change(); check_for_aliases();">
+ <?php
+ $protocols = explode(" ", "TCP UDP TCP/UDP ICMP ESP AH GRE IPV6 IGMP PIM OSPF");
+ foreach ($protocols as $proto): ?>
+ <option value="<?=strtolower($proto);?>" <?php if (strtolower($proto) == $pconfig['proto']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($proto);?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Choose which IP protocol this rule should match."); ?><br />
+ <?=gettext("Hint: in most cases, you should specify"); ?> <em><?=gettext("TCP"); ?></em> &nbsp;<?=gettext("here."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr id="showadvancedboxsrc" name="showadvancedboxsrc">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Source"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="button" onclick="show_source()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show source address and port range"); ?>
+ </td>
+ </tr>
+ <tr style="display: none;" id="srctable" name="srctable">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Source"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="srcnot" type="checkbox" id="srcnot" value="yes" <?php if ($pconfig['srcnot']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("not"); ?></strong>
+ <br />
+ <?=gettext("Use this option to invert the sense of the match."); ?>
+ <br />
+ <br />
+ <table border="0" cellspacing="0" cellpadding="0" summary="type">
+ <tr>
+ <td><?=gettext("Type:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="srctype" class="formselect" onchange="typesel_change()">
+<?php
+ $sel = is_specialnet($pconfig['src']); ?>
+ <option value="any" <?php if ($pconfig['src'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any"); ?></option>
+ <option value="single" <?php if (($pconfig['srcmask'] == 32) && !$sel) { echo "selected=\"selected\""; $sel = 1; } ?>><?=gettext("Single host or alias"); ?></option>
+ <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network"); ?></option>
+ <?php if (have_ruleint_access("pptp")): ?>
+ <option value="pptp" <?php if ($pconfig['src'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients"); ?></option>
+ <?php endif; ?>
+ <?php if (have_ruleint_access("pppoe")): ?>
+ <option value="pppoe" <?php if ($pconfig['src'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients"); ?></option>
+ <?php endif; ?>
+ <?php if (have_ruleint_access("l2tp")): ?>
+ <option value="l2tp" <?php if ($pconfig['src'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients"); ?></option>
+ <?php endif; ?>
+<?php
+ foreach ($ifdisp as $ifent => $ifdesc):
+ if (have_ruleint_access($ifent)):
+?>
+ <option value="<?=$ifent;?>" <?php if ($pconfig['src'] == $ifent) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?> <?=gettext("net"); ?></option>
+ <option value="<?=$ifent;?>ip"<?php if ($pconfig['src'] == $ifent . "ip") { echo "selected=\"selected\""; } ?>>
+ <?=$ifdesc?> <?=gettext("address");?>
+ </option>
+<?php
+ endif;
+ endforeach;
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input autocomplete='off' name="src" type="text" class="formfldalias" id="src" size="20" value="<?php if (!is_specialnet($pconfig['src'])) echo htmlspecialchars($pconfig['src']);?>" /> /
+ <select name="srcmask" class="formselect" id="srcmask">
+<?php for ($i = 31; $i > 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['srcmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
+<?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable" name="sprtable">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Source port range"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="0" summary="source port range">
+ <tr>
+ <td><?=gettext("from:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="srcbeginport" class="formselect" onchange="src_rep_change();ext_change()">
+ <option value="">(<?=gettext("other"); ?>)</option>
+ <option value="any" <?php $bfound = 0; if ($pconfig['srcbeginport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any"); ?></option>
+<?php foreach ($wkports as $wkport => $wkportdesc): ?>
+ <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['srcbeginport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars($wkportdesc);?></option>
+<?php endforeach; ?>
+ </select>
+ <input autocomplete='off' class="formfldalias" name="srcbeginport_cust" id="srcbeginport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['srcbeginport']) echo htmlspecialchars($pconfig['srcbeginport']); ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("to:"); ?></td>
+ <td>
+ <select name="srcendport" class="formselect" onchange="ext_change()">
+ <option value="">(<?=gettext("other"); ?>)</option>
+ <option value="any" <?php $bfound = 0; if ($pconfig['srcendport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any"); ?></option>
+<?php foreach ($wkports as $wkport => $wkportdesc): ?>
+ <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['srcendport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars($wkportdesc);?></option>
+<?php endforeach; ?>
+ </select>
+ <input autocomplete='off' class="formfldalias" name="srcendport_cust" id="srcendport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['srcendport']) echo htmlspecialchars($pconfig['srcendport']); ?>" />
+ </td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl"><?=gettext("Specify the source port or port range for this rule"); ?>. <b><?=gettext("This is usually"); ?> <em><?=gettext("random"); ?></em> <?=gettext("and almost never equal to the destination port range (and should usually be 'any')"); ?>.</b> <br /> <?=gettext("Hint: you can leave the"); ?> <em>'<?=gettext("to"); ?>'</em> <?=gettext("field empty if you only want to filter a single port."); ?></span><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dstnot" type="checkbox" id="dstnot" value="yes" <?php if ($pconfig['dstnot']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("not"); ?></strong>
+ <br />
+ <?=gettext("Use this option to invert the sense of the match."); ?>
+ <br />
+ <br />
+ <table border="0" cellspacing="0" cellpadding="0" summary="type">
+ <tr>
+ <td><?=gettext("Type:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="dsttype" class="formselect" onchange="typesel_change()">
+ <?php $sel = is_specialnet($pconfig['dst']); ?>
+ <option value="any" <?php if ($pconfig['dst'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any"); ?></option>
+ <option value="single" <?php if (($pconfig['dstmask'] == 32) && !$sel) { echo "selected=\"selected\""; $sel = 1; } ?>><?=gettext("Single host or alias"); ?></option>
+ <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network"); ?></option>
+ <option value="(self)" <?PHP if ($pconfig['dst'] == "(self)") echo "selected=\"selected\""; ?>><?=gettext("This Firewall (self)");?></option>
+ <?php if (have_ruleint_access("pptp")): ?>
+ <option value="pptp" <?php if ($pconfig['dst'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients"); ?></option>
+ <?php endif; ?>
+ <?php if (have_ruleint_access("pppoe")): ?>
+ <option value="pppoe" <?php if ($pconfig['dst'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients"); ?></option>
+ <?php endif; ?>
+ <?php if (have_ruleint_access("l2tp")): ?>
+ <option value="l2tp" <?php if ($pconfig['dst'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients"); ?></option>
+ <?php endif; ?>
+
+<?php foreach ($ifdisp as $if => $ifdesc):
+ if (have_ruleint_access($if)):
+?>
+ <option value="<?=$if;?>" <?php if ($pconfig['dst'] == $if) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?> <?=gettext("net"); ?></option>
+ <option value="<?=$if;?>ip"<?php if ($pconfig['dst'] == $if . "ip") { echo "selected=\"selected\""; } ?>>
+ <?=$ifdesc;?> <?=gettext("address");?>
+ </option>
+<?php
+ endif;
+ endforeach;
+?>
+
+<?php if (is_array($config['virtualip']['vip'])):
+ foreach ($config['virtualip']['vip'] as $sn):
+ if (isset($sn['noexpand'])) {
+ continue;
+ }
+ if ($sn['mode'] == "proxyarp" && $sn['type'] == "network"):
+ $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
+ $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
+ $len = $end - $start;
+ for ($i = 0; $i <= $len; $i++):
+ $snip = long2ip32($start+$i);
+?>
+ <option value="<?=$snip;?>" <?php if ($snip == $pconfig['dst']) echo "selected=\"selected\""; ?>><?=htmlspecialchars("{$snip} ({$sn['descr']})");?></option>
+<?php endfor;
+ else:
+?>
+ <option value="<?=$sn['subnet'];?>" <?php if ($sn['subnet'] == $pconfig['dst']) echo "selected=\"selected\""; ?>><?=htmlspecialchars("{$sn['subnet']} ({$sn['descr']})");?></option>
+<?php endif;
+ endforeach;
+ endif;
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input autocomplete='off' name="dst" type="text" class="formfldalias" id="dst" size="20" value="<?php if (!is_specialnet($pconfig['dst'])) echo htmlspecialchars($pconfig['dst']);?>" />
+ /
+ <select name="dstmask" class="formselect" id="dstmask">
+<?php
+ for ($i = 31; $i > 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['dstmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
+<?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="dprtr" name="dprtr">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination port range"); ?> </td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="0" summary="destination port range">
+ <tr>
+ <td><?=gettext("from:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="dstbeginport" id="dstbeginport" class="formselect" onchange="dst_rep_change();ext_change()">
+ <option value="">(<?=gettext("other"); ?>)</option>
+<?php $bfound = 0;
+ foreach ($wkports as $wkport => $wkportdesc): ?>
+ <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['dstbeginport']) { echo "selected=\"selected\""; $bfound = 1; }?>><?=htmlspecialchars($wkportdesc);?></option>
+<?php endforeach; ?>
+ </select>
+ <input autocomplete='off' class="formfldalias" name="dstbeginport_cust" id="dstbeginport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['dstbeginport']) echo htmlspecialchars($pconfig['dstbeginport']); ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("to:"); ?></td>
+ <td>
+ <select name="dstendport" id="dstendport" class="formselect" onchange="ext_change()">
+ <option value="">(<?=gettext("other"); ?>)</option>
+<?php $bfound = 0;
+ foreach ($wkports as $wkport => $wkportdesc): ?>
+ <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['dstendport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars($wkportdesc);?></option>
+<?php endforeach; ?>
+ </select>
+ <input autocomplete='off' class="formfldalias" name="dstendport_cust" id="dstendport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['dstendport']) echo htmlspecialchars($pconfig['dstendport']); ?>" />
+ </td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Specify the port or port range for the destination of the packet for this mapping."); ?>
+ <br />
+ <?=gettext("Hint: you can leave the"); ?> <em>'<?=gettext("to"); ?>'</em> <?=gettext("field empty if you only want to map a single port"); ?>
+ </span>
+ </td>
+ </tr>
+ <tr name="localiptable" id="localiptable">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Redirect target IP"); ?></td>
+ <td width="78%" class="vtable">
+ <input autocomplete='off' name="localip" type="text" class="formfldalias" id="localip" size="20" value="<?=htmlspecialchars($pconfig['localip']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter the internal IP address of the server on which you want to map the ports."); ?>
+ <br />
+ <?=gettext("e.g."); ?>
+ <em>192.168.1.12</em>
+ </span>
+ </td>
+ </tr>
+ <tr name="lprtr" id="lprtr">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Redirect target port"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="localbeginport" id="localbeginport" class="formselect" onchange="ext_change();check_for_aliases();">
+ <option value="">(<?=gettext("other"); ?>)</option>
+ <?php
+ $bfound = 0;
+ foreach ($wkports as $wkport => $wkportdesc):
+ ?>
+ <option value="<?=$wkport;?>"
+ <?php if ($wkport == $pconfig['localbeginport']) {
+ echo "selected=\"selected\"";
+ $bfound = 1;
+ }?>>
+ <?=htmlspecialchars($wkportdesc);?>
+ </option>
+ <?php endforeach; ?>
+ </select> <input onchange="check_for_aliases();" autocomplete='off' class="formfldalias" name="localbeginport_cust" id="localbeginport_cust" type="text" size="5" value="<?php if (!$bfound) echo htmlspecialchars($pconfig['localbeginport']); ?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Specify the port on the machine with the " .
+ "IP address entered above. In case of a port range, specify " .
+ "the beginning port of the range (the end port will be calculated " .
+ "automatically)."); ?><br />
+ <?=gettext("Hint: this is usually identical to the 'from' port above"); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("No XMLRPC Sync"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" value="yes" name="nosync"<?php if ($pconfig['nosync']) echo " checked=\"checked\""; ?> /><br />
+ <?=gettext("Hint: This prevents the rule on Master from automatically syncing to other CARP members. This does NOT prevent the rule from being overwritten on Slave.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NAT reflection"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="natreflection" class="formselect">
+ <option value="default" <?php if ($pconfig['natreflection'] != "enable" && $pconfig['natreflection'] != "purenat" && $pconfig['natreflection'] != "disable") echo "selected=\"selected\""; ?>><?=gettext("Use system default"); ?></option>
+ <option value="enable" <?php if ($pconfig['natreflection'] == "enable") echo "selected=\"selected\""; ?>><?=gettext("Enable (NAT + Proxy)"); ?></option>
+ <option value="purenat" <?php if ($pconfig['natreflection'] == "purenat") echo "selected=\"selected\""; ?>><?=gettext("Enable (Pure NAT)"); ?></option>
+ <option value="disable" <?php if ($pconfig['natreflection'] == "disable") echo "selected=\"selected\""; ?>><?=gettext("Disable"); ?></option>
+ </select>
+ </td>
+ </tr>
+ <?php if (isset($id) && $a_nat[$id] && (!isset($_GET['dup']) || !is_numericint($_GET['dup']))): ?>
+ <tr name="assoctable" id="assoctable">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Filter rule association"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="associated-rule-id">
+ <option value=""><?=gettext("None"); ?></option>
+ <option value="pass" <?php if ($pconfig['associated-rule-id'] == "pass") echo " selected=\"selected\""; ?>><?=gettext("Pass"); ?></option>
+ <?php
+ $linkedrule = "";
+ if (is_array($config['filter']['rule'])) {
+ filter_rules_sort();
+ foreach ($config['filter']['rule'] as $filter_id => $filter_rule) {
+ if (isset($filter_rule['associated-rule-id'])) {
+ echo "<option value=\"{$filter_rule['associated-rule-id']}\"";
+ if ($filter_rule['associated-rule-id'] == $pconfig['associated-rule-id']) {
+ echo " selected=\"selected\"";
+ $linkedrule = "<br /><a href=\"firewall_rules_edit.php?id={$filter_id}\">" . gettext("View the filter rule") . "</a><br />";
+ }
+ echo ">". htmlspecialchars('Rule ' . $filter_rule['descr']) . "</option>\n";
+ }
+ }
+ }
+ if (isset($pconfig['associated-rule-id'])) {
+ echo "<option value=\"new\">" . gettext("Create new associated filter rule") . "</option>\n";
+ }
+ echo "</select>\n";
+ echo $linkedrule;
+ ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php if ((!(isset($id) && $a_nat[$id])) || (isset($_GET['dup']) && is_numericint($_GET['dup']))): ?>
+ <tr name="assoctable" id="assoctable">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Filter rule association"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="filter-rule-association" id="filter-rule-association">
+ <option value=""><?=gettext("None"); ?></option>
+ <option value="add-associated" selected="selected"><?=gettext("Add associated filter rule"); ?></option>
+ <option value="add-unassociated"><?=gettext("Add unassociated filter rule"); ?></option>
+ <option value="pass"><?=gettext("Pass"); ?></option>
+ </select>
+ <br /><br /><?=gettext("NOTE: The \"pass\" selection does not work properly with Multi-WAN. It will only work on an interface containing the default gateway.")?>
+ </td>
+ </tr>
+ <?php endif; ?>
+<?php
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_nat/htmlphplate");
+?>
+<?php
+ $has_created_time = (isset($a_nat[$id]['created']) && is_array($a_nat[$id]['created']));
+ $has_updated_time = (isset($a_nat[$id]['updated']) && is_array($a_nat[$id]['updated']));
+?>
+ <?php if ($has_created_time || $has_updated_time): ?>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Rule Information");?></td>
+ </tr>
+ <?php if ($has_created_time): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Created");?></td>
+ <td width="78%" class="vtable">
+ <?= date(gettext("n/j/y H:i:s"), $a_nat[$id]['created']['time']) ?> <?= gettext("by") ?> <strong><?= $a_nat[$id]['created']['username'] ?></strong>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php if ($has_updated_time): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Updated");?></td>
+ <td width="78%" class="vtable">
+ <?= date(gettext("n/j/y H:i:s"), $a_nat[$id]['updated']['time']) ?> <?= gettext("by") ?> <strong><?= $a_nat[$id]['updated']['username'] ?></strong>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_nat[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ <input name="after" type="hidden" value="<?=htmlspecialchars($after);?>" />
+ </td>
+ </tr>
+ </table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+ ext_change();
+ dst_change(document.iform.interface.value,'<?=htmlspecialchars($pconfig['interface'])?>','<?=htmlspecialchars($pconfig['dst'])?>');
+ var iface_old = document.iform.interface.value;
+ typesel_change();
+ proto_change();
+ <?php if ($pconfig['srcnot'] || $pconfig['src'] != "any" || $pconfig['srcbeginport'] != "any" || $pconfig['srcendport'] != "any"): ?>
+ show_source();
+ <?php endif; ?>
+ nordr_change();
+//]]>
+</script>
+<script type="text/javascript">
+//<![CDATA[
+ var addressarray = <?= json_encode(get_alias_list(array("host", "network", "openvpn", "urltable"))) ?>;
+ var customarray = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
+
+ var oTextbox1 = new AutoSuggestControl(document.getElementById("localip"), new StateSuggestions(addressarray));
+ var oTextbox2 = new AutoSuggestControl(document.getElementById("src"), new StateSuggestions(addressarray));
+ var oTextbox3 = new AutoSuggestControl(document.getElementById("dst"), new StateSuggestions(addressarray));
+ var oTextbox4 = new AutoSuggestControl(document.getElementById("dstbeginport_cust"), new StateSuggestions(customarray));
+ var oTextbox5 = new AutoSuggestControl(document.getElementById("dstendport_cust"), new StateSuggestions(customarray));
+ var oTextbox6 = new AutoSuggestControl(document.getElementById("srcbeginport_cust"), new StateSuggestions(customarray));
+ var oTextbox7 = new AutoSuggestControl(document.getElementById("srcendport_cust"), new StateSuggestions(customarray));
+ var oTextbox8 = new AutoSuggestControl(document.getElementById("localbeginport_cust"), new StateSuggestions(customarray));
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_nat_npt.php b/src/usr/local/www/firewall_nat_npt.php
new file mode 100644
index 0000000..003bd88
--- /dev/null
+++ b/src/usr/local/www/firewall_nat_npt.php
@@ -0,0 +1,195 @@
+<?php
+/* $Id$ */
+/*
+ firewall_nat_npt.php
+ part of pfSense (https://www.pfsense.org)
+
+ Copyright (C) 2011 Seth Mos <seth.mos@dds.nl>.
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: nat
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-nat-npt
+##|*NAME=Firewall: NAT: NPT page
+##|*DESCR=Allow access to the 'Firewall: NAT: NPT' page.
+##|*MATCH=firewall_nat_npt.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+if (!is_array($config['nat']['npt'])) {
+ $config['nat']['npt'] = array();
+}
+$a_npt = &$config['nat']['npt'];
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval |= filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ if ($retval == 0) {
+ clear_subsystem_dirty('natconf');
+ clear_subsystem_dirty('filter');
+ }
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_npt[$_GET['id']]) {
+ unset($a_npt[$_GET['id']]);
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_npt.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("NPt"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="firewall_nat_npt.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('natconf')): ?>
+<?php print_info_box_np(gettext("The NAT configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall nat npt">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Port Forward"), false, "firewall_nat.php");
+ $tab_array[] = array(gettext("1:1"), false, "firewall_nat_1to1.php");
+ $tab_array[] = array(gettext("Outbound"), false, "firewall_nat_out.php");
+ $tab_array[] = array(gettext("NPt"), true, "firewall_nat_npt.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Interface"); ?></td>
+ <td width="20%" class="listhdrr"><?=gettext("External Prefix"); ?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Internal prefix"); ?></td>
+ <td width="30%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle"><a href="firewall_nat_npt_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add rule"); ?>" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $textse = "</span>";
+
+ $i = 0;
+ foreach ($a_npt as $natent):
+
+ if (isset($natent['disabled'])) {
+ $textss = "<span class=\"gray\">";
+ } else {
+ $textss = "<span>";
+ }
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='firewall_nat_npt_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ if (!$natent['interface']) {
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr("wan"));
+ } else {
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface']));
+ }
+ echo $textse;
+?>
+ </td>
+<?php
+ $source_net = pprint_address($natent['source']);
+ $source_cidr = strstr($source_net, '/');
+ $destination_net = pprint_address($natent['destination']);
+ $destination_cidr = strstr($destination_net, '/');
+?>
+ <td class="listr" ondblclick="document.location='firewall_nat_npt_edit.php?id=<?=$i;?>';">
+ <?php echo $textss . $destination_net . $textse; ?>
+ </td>
+ <td class="listr" ondblclick="document.location='firewall_nat_npt_edit.php?id=<?=$i;?>';">
+ <?php echo $textss . $source_net . $textse; ?>
+ </td>
+ <td class="listbg" ondblclick="document.location='firewall_nat_npt_edit.php?id=<?=$i;?>';">
+ <?=$textss;?>
+ <?=htmlspecialchars($natent['descr']);?>&nbsp;
+ <?=$textse;?>
+ </td>
+ <td class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td valign="middle"><a href="firewall_nat_npt_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit rule"); ?>" alt="edit" /></a></td>
+ <td valign="middle"><a href="firewall_nat_npt.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this mapping?");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule"); ?>" alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle"><a href="firewall_nat_npt_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add rule"); ?>" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_nat_npt_edit.php b/src/usr/local/www/firewall_nat_npt_edit.php
new file mode 100644
index 0000000..addddd2
--- /dev/null
+++ b/src/usr/local/www/firewall_nat_npt_edit.php
@@ -0,0 +1,311 @@
+<?php
+/* $Id$ */
+/*
+ firewall_nat_npt_edit.php
+ part of pfSense (https://www.pfsense.org)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2011 Seth Mos <seth.mos@dds.nl>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: nat
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-nat-npt-edit
+##|*NAME=Firewall: NAT: NPt: Edit page
+##|*DESCR=Allow access to the 'Firewall: NAT: NPt: Edit' page.
+##|*MATCH=firewall_nat_npt_edit.php*
+##|-PRIV
+
+function natnptcmp($a, $b) {
+ return ipcmp($a['external'], $b['external']);
+}
+
+function nat_npt_rules_sort() {
+ global $g, $config;
+
+ if (!is_array($config['nat']['npt'])) {
+ return;
+ }
+
+ usort($config['nat']['npt'], "natnptcmp");
+}
+
+require("guiconfig.inc");
+require_once("interfaces.inc");
+require_once("filter.inc");
+require("shaper.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat_npt.php');
+}
+
+$ifdisp = get_configured_interface_with_descr();
+foreach ($ifdisp as $kif => $kdescr) {
+ $specialsrcdst[] = "{$kif}";
+ $specialsrcdst[] = "{$kif}ip";
+}
+
+if (!is_array($config['nat']['npt'])) {
+ $config['nat']['npt'] = array();
+}
+$a_npt = &$config['nat']['npt'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_npt[$id]) {
+ $pconfig['disabled'] = isset($a_npt[$id]['disabled']);
+
+ address_to_pconfig($a_npt[$id]['source'], $pconfig['src'],
+ $pconfig['srcmask'], $pconfig['srcnot'],
+ $pconfig['srcbeginport'], $pconfig['srcendport']);
+
+ address_to_pconfig($a_npt[$id]['destination'], $pconfig['dst'],
+ $pconfig['dstmask'], $pconfig['dstnot'],
+ $pconfig['dstbeginport'], $pconfig['dstendport']);
+
+ $pconfig['interface'] = $a_npt[$id]['interface'];
+ if (!$pconfig['interface']) {
+ $pconfig['interface'] = "wan";
+ }
+
+ $pconfig['external'] = $a_npt[$id]['external'];
+ $pconfig['descr'] = $a_npt[$id]['descr'];
+} else {
+ $pconfig['interface'] = "wan";
+}
+
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "interface");
+ $reqdfieldsn = array(gettext("Interface"));
+ $reqdfields[] = "src";
+ $reqdfieldsn[] = gettext("Source prefix");
+ $reqdfields[] = "dst";
+ $reqdfieldsn[] = gettext("Destination prefix");
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!$input_errors) {
+ $natent = array();
+
+ $natent['disabled'] = isset($_POST['disabled']) ? true:false;
+ $natent['descr'] = $_POST['descr'];
+ $natent['interface'] = $_POST['interface'];
+
+ if ($_POST['src']) {
+ $_POST['src'] = trim($_POST['src']);
+ }
+ if ($_POST['dst']) {
+ $_POST['dst'] = trim($_POST['dst']);
+ }
+
+ pconfig_to_address($natent['source'], $_POST['src'], $_POST['srcmask'], $_POST['srcnot']);
+
+ pconfig_to_address($natent['destination'], $_POST['dst'], $_POST['dstmask'], $_POST['dstnot']);
+
+ if (isset($id) && $a_npt[$id]) {
+ $a_npt[$id] = $natent;
+ } else {
+ $a_npt[] = $natent;
+ }
+ nat_npt_rules_sort();
+
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+
+ header("Location: firewall_nat_npt.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("NPt"), gettext("Edit"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script type="text/javascript" src="/javascript/suggestions.js"></script>
+<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
+
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="firewall_nat_npt_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall nat npt edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit NAT NPt entry"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable this rule"); ?></strong><br />
+ <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect">
+ <?php
+ foreach ($ifdisp as $if => $ifdesc) {
+ if (have_ruleint_access($if)) {
+ $interfaces[$if] = $ifdesc;
+ }
+ }
+
+ if ($config['l2tp']['mode'] == "server") {
+ if (have_ruleint_access("l2tp")) {
+ $interfaces['l2tp'] = "L2TP VPN";
+ }
+ }
+
+ if ($config['pptpd']['mode'] == "server") {
+ if (have_ruleint_access("pptp")) {
+ $interfaces['pptp'] = "PPTP VPN";
+ }
+ }
+
+ if ($config['pppoe']['mode'] == "server") {
+ if (have_ruleint_access("pppoe")) {
+ $interfaces['pppoe'] = "PPPoE Server";
+ }
+ }
+
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['mobileclients']['enable'])) {
+ if (have_ruleint_access("enc0")) {
+ $interfaces["enc0"] = "IPsec";
+ }
+ }
+
+ /* add openvpn/tun interfaces */
+ if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
+ $interfaces["openvpn"] = "OpenVPN";
+ }
+
+ foreach ($interfaces as $iface => $ifacename):
+ ?>
+ <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php endforeach; ?>
+ </select><br />
+ <span class="vexpl"><?=gettext("Choose which interface this rule applies to"); ?>.<br />
+ <?=gettext("Hint: in most cases, you'll want to use WAN here"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Internal IPv6 Prefix"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="srcnot" type="checkbox" id="srcnot" value="yes" <?php if ($pconfig['srcnot']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("not"); ?></strong>
+ <br />
+ <?=gettext("Use this option to invert the sense of the match."); ?>
+ <br />
+ <br />
+ <table border="0" cellspacing="0" cellpadding="0" summary="internal">
+ <tr>
+ <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="src" type="text" class="formfldalias" id="src" size="20" value="<?php if (!is_specialnet($pconfig['src'])) echo htmlspecialchars($pconfig['src']);?>" /> /
+ <select name="srcmask" class="formselect" id="srcmask">
+<?php for ($i = 128; $i > 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['srcmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
+<?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl"><?=gettext("Enter the internal (LAN) ULA IPv6 Prefix for the Network Prefix translation. The prefix size specified for the internal IPv6 prefix will be applied to the external prefix.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination IPv6 Prefix"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dstnot" type="checkbox" id="dstnot" value="yes" <?php if ($pconfig['dstnot']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("not"); ?></strong>
+ <br />
+ <?=gettext("Use this option to invert the sense of the match."); ?>
+ <br />
+ <br />
+ <table border="0" cellspacing="0" cellpadding="0" summary="destination">
+ <tr>
+ <td><?=gettext("Address:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="dst" type="text" class="formfldalias" id="dst" size="20" value="<?php if (!is_specialnet($pconfig['dst'])) echo htmlspecialchars($pconfig['dst']);?>" />
+ /
+ <select name="dstmask" class="formselect" id="dstmask">
+<?php
+ for ($i = 128; $i > 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['dstmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
+<?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl"><?=gettext("Enter the Global Unicast routable IPv6 prefix here"); ?><br /></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_npt[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_nat_out.php b/src/usr/local/www/firewall_nat_out.php
new file mode 100644
index 0000000..d560abe
--- /dev/null
+++ b/src/usr/local/www/firewall_nat_out.php
@@ -0,0 +1,695 @@
+<?php
+/* $Id$ */
+/*
+ firewall_nat_out.php
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: nat
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-nat-outbound
+##|*NAME=Firewall: NAT: Outbound page
+##|*DESCR=Allow access to the 'Firewall: NAT: Outbound' page.
+##|*MATCH=firewall_nat_out.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+global $FilterIflist;
+global $GatewaysList;
+
+if (!is_array($config['nat']['outbound'])) {
+ $config['nat']['outbound'] = array();
+}
+
+if (!is_array($config['nat']['outbound']['rule'])) {
+ $config['nat']['outbound']['rule'] = array();
+}
+
+$a_out = &$config['nat']['outbound']['rule'];
+
+if (!isset($config['nat']['outbound']['mode'])) {
+ $config['nat']['outbound']['mode'] = "automatic";
+}
+
+$mode = $config['nat']['outbound']['mode'];
+
+if ($_POST['apply']) {
+ $retval = 0;
+ $retval |= filter_configure();
+
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+
+ if ($retval == 0) {
+ clear_subsystem_dirty('natconf');
+ clear_subsystem_dirty('filter');
+ }
+}
+
+if (isset($_POST['save']) && $_POST['save'] == "Save") {
+ /* mutually exclusive settings - if user wants advanced NAT, we don't generate automatic rules */
+ if ($_POST['mode'] == "advanced" && ($mode == "automatic" || $mode == "hybrid")) {
+ /*
+ * user has enabled advanced outbound NAT and doesn't have rules
+ * lets automatically create entries
+ * for all of the interfaces to make life easier on the pip-o-chap
+ */
+ if (empty($FilterIflist)) {
+ filter_generate_optcfg_array();
+ }
+ if (empty($GatewaysList)) {
+ filter_generate_gateways();
+ }
+ $tonathosts = filter_nat_rules_automatic_tonathosts(true);
+ $automatic_rules = filter_nat_rules_outbound_automatic("");
+
+ foreach ($tonathosts as $tonathost) {
+ foreach ($automatic_rules as $natent) {
+ $natent['source']['network'] = $tonathost['subnet'];
+ $natent['descr'] .= sprintf(gettext(' - %1$s to %2$s'),
+ $tonathost['descr'],
+ convert_real_interface_to_friendly_descr($natent['interface']));
+ $natent['created'] = make_config_revision_entry(null, gettext("Manual Outbound NAT Switch"));
+
+ /* Try to detect already auto created rules and avoid duplicating them */
+ $found = false;
+ foreach ($a_out as $rule) {
+ if ($rule['interface'] == $natent['interface'] &&
+ $rule['source']['network'] == $natent['source']['network'] &&
+ $rule['dstport'] == $natent['dstport'] &&
+ $rule['target'] == $natent['target'] &&
+ $rule['descr'] == $natent['descr']) {
+ $found = true;
+ break;
+ }
+ }
+
+ if ($found === false) {
+ $a_out[] = $natent;
+ }
+ }
+ }
+ $savemsg = gettext("Default rules for each interface have been created.");
+ unset($FilterIflist, $GatewaysList);
+ }
+
+ $config['nat']['outbound']['mode'] = $_POST['mode'];
+
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_out.php");
+ exit;
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_out[$_GET['id']]) {
+ unset($a_out[$_GET['id']]);
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_out.php");
+ exit;
+ }
+}
+
+if (isset($_POST['del_x'])) {
+ /* delete selected rules */
+ if (is_array($_POST['rule']) && count($_POST['rule'])) {
+ foreach ($_POST['rule'] as $rulei) {
+ unset($a_out[$rulei]);
+ }
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_out.php");
+ exit;
+ }
+
+} else if ($_GET['act'] == "toggle") {
+ if ($a_out[$_GET['id']]) {
+ if (isset($a_out[$_GET['id']]['disabled'])) {
+ unset($a_out[$_GET['id']]['disabled']);
+ } else {
+ $a_out[$_GET['id']]['disabled'] = true;
+ }
+ if (write_config("Firewall: NAT: Outbound, enable/disable NAT rule")) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_out.php");
+ exit;
+ }
+} else {
+ /* yuck - IE won't send value attributes for image buttons, while Mozilla does - so we use .x/.y to find move button clicks instead... */
+ unset($movebtn);
+ foreach ($_POST as $pn => $pd) {
+ if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
+ $movebtn = $matches[1];
+ break;
+ }
+ }
+ /* move selected rules before this rule */
+ if (isset($movebtn) && is_array($_POST['rule']) && count($_POST['rule'])) {
+ $a_out_new = array();
+
+ /* copy all rules < $movebtn and not selected */
+ for ($i = 0; $i < $movebtn; $i++) {
+ if (!in_array($i, $_POST['rule'])) {
+ $a_out_new[] = $a_out[$i];
+ }
+ }
+
+ /* copy all selected rules */
+ for ($i = 0; $i < count($a_out); $i++) {
+ if ($i == $movebtn) {
+ continue;
+ }
+ if (in_array($i, $_POST['rule'])) {
+ $a_out_new[] = $a_out[$i];
+ }
+ }
+
+ /* copy $movebtn rule */
+ if ($movebtn < count($a_out)) {
+ $a_out_new[] = $a_out[$movebtn];
+ }
+
+ /* copy all rules > $movebtn and not selected */
+ for ($i = $movebtn+1; $i < count($a_out); $i++) {
+ if (!in_array($i, $_POST['rule'])) {
+ $a_out_new[] = $a_out[$i];
+ }
+ }
+ if (count($a_out_new) > 0) {
+ $a_out = $a_out_new;
+ }
+
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_out.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("Outbound"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="firewall_nat_out.php" method="post" name="iform">
+<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+<?php
+if ($savemsg) {
+ print_info_box($savemsg);
+}
+if (is_subsystem_dirty('natconf')) {
+ print_info_box_np(gettext("The NAT configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));
+}
+?>
+<br />
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall nat outbound">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Port Forward"), false, "firewall_nat.php");
+ $tab_array[] = array(gettext("1:1"), false, "firewall_nat_1to1.php");
+ $tab_array[] = array(gettext("Outbound"), true, "firewall_nat_out.php");
+ $tab_array[] = array(gettext("NPt"), false, "firewall_nat_npt.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td rowspan="3" align="right" valign="middle"><b><?=gettext("Mode:"); ?></b></td>
+ <td>
+ <input name="mode" type="radio" id="automatic" value="automatic" <?php if ($mode == "automatic") echo "checked=\"checked\"";?> />
+ </td>
+ <td>
+ <strong>
+ <?=gettext("Automatic outbound NAT rule generation"); ?><br />
+ <?=gettext("(IPsec passthrough included)");?>
+ </strong>
+ </td>
+ <td>
+ <input name="mode" type="radio" id="hybrid" value="hybrid" <?php if ($mode == "hybrid") echo "checked=\"checked\"";?> />
+ </td>
+ <td>
+ <strong>
+ <?=gettext("Hybrid Outbound NAT rule generation"); ?><br />
+ <?=gettext("(Automatic Outbound NAT + rules below)");?>
+ </strong>
+ </td>
+ <td rowspan="3" valign="middle" align="left">
+ <input name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="4">
+ &nbsp;
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="mode" type="radio" id="advanced" value="advanced" <?php if ($mode == "advanced") echo "checked=\"checked\"";?> />
+ </td>
+ <td>
+ <strong>
+ <?=gettext("Manual Outbound NAT rule generation"); ?><br />
+ <?=gettext("(AON - Advanced Outbound NAT)");?>
+ </strong>
+ </td>
+ <td>
+ <input name="mode" type="radio" id="disabled" value="disabled" <?php if ($mode == "disabled") echo "checked=\"checked\"";?> />
+ </td>
+ <td>
+ <strong>
+ <?=gettext("Disable Outbound NAT rule generation"); ?><br />
+ <?=gettext("(No Outbound NAT rules)");?>
+ </strong>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="6">
+ &nbsp;
+ </td>
+ </tr>
+ </table>
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="mappings">
+ <tr><td colspan="5"><b>&nbsp;<?=gettext("Mappings:"); ?></b></td></tr>
+ <tr><td>&nbsp;</td></tr>
+ <tr id="frheader">
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="10%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Source");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Source Port");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Destination");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Destination Port");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("NAT Address");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("NAT Port");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Static Port");?></td>
+ <td width="25%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="5%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td>
+ <a href="firewall_nat_out_edit.php?after=-1">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add new mapping");?>" alt="add" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_out as $natent):
+ $iconfn = "pass";
+ $textss = $textse = "";
+ if ($mode == "disabled" || $mode == "automatic" || isset($natent['disabled'])) {
+ $textss = "<span class=\"gray\">";
+ $textse = "</span>";
+ $iconfn .= "_d";
+ }
+
+ //build Alias popup box
+ $alias_src_span_begin = "";
+ $alias_src_port_span_begin = "";
+ $alias_dst_span_begin = "";
+ $alias_dst_port_span_begin = "";
+
+ $alias_popup = rule_popup($natent['source']['network'], pprint_port($natent['sourceport']), $natent['destination']['address'], pprint_port($natent['dstport']));
+
+ $alias_src_span_begin = $alias_popup["src"];
+ $alias_src_port_span_begin = $alias_popup["srcport"];
+ $alias_dst_span_begin = $alias_popup["dst"];
+ $alias_dst_port_span_begin = $alias_popup["dstport"];
+
+ $alias_src_span_end = $alias_popup["src_end"];
+ $alias_src_port_span_end = $alias_popup["srcport_end"];
+ $alias_dst_span_end = $alias_popup["dst_end"];
+ $alias_dst_port_span_end = $alias_popup["dstport_end"];
+?>
+ <tr valign="top" id="fr<?=$i;?>">
+ <td class="listt">
+ <input type="checkbox" id="frc<?=$i;?>" name="rule[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
+ </td>
+ <td class="listt" align="center">
+<?php
+ if ($mode == "disabled" || $mode == "automatic"):
+?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
+ title="<?=gettext("This rule is being ignored");?>" alt="icon" />
+<?php
+ else:
+?>
+ <a href="?act=toggle&amp;id=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
+ title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
+ </a>
+<?php
+ endif;
+?>
+ </td>
+ <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+ <?php echo $textss . htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])) . $textse; ?>
+ &nbsp;
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+ <?php $natent['source']['network'] = ($natent['source']['network'] == "(self)") ? "This Firewall" : $natent['source']['network']; ?>
+ <?php echo $textss . $alias_src_span_begin . $natent['source']['network'] . $alias_src_span_end . $textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
+ if (!$natent['sourceport']) {
+ echo "*";
+ } else {
+ echo $alias_src_port_span_begin . $natent['sourceport'] . $alias_src_port_span_end;
+ }
+ echo $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ if (isset($natent['destination']['any'])) {
+ echo "*";
+ } else {
+ if (isset($natent['destination']['not'])) {
+ echo "!&nbsp;";
+ }
+ echo $alias_dst_span_begin . $natent['destination']['address'] . $alias_dst_span_end;
+ }
+ echo $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
+ if (!$natent['dstport']) {
+ echo "*";
+ } else {
+ echo $alias_dst_port_span_begin . $natent['dstport'] . $alias_dst_port_span_end;
+ }
+ echo $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ if (isset($natent['nonat'])) {
+ echo '<I>NO NAT</I>';
+ } elseif (!$natent['target']) {
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])) . " address";
+ } elseif ($natent['target'] == "other-subnet") {
+ echo $natent['targetip'] . '/' . $natent['targetip_subnet'];
+ } else {
+ echo $natent['target'];
+ }
+ echo $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ if (!$natent['natport']) {
+ echo "*";
+ } else {
+ echo $natent['natport'];
+ }
+ echo $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';" align="center">
+<?php
+ echo $textss;
+ if (isset($natent['staticnatport'])) {
+ echo gettext("YES");
+ } else {
+ echo gettext("NO");
+ }
+ echo $textse;
+?>
+ </td>
+ <td class="listbg" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='firewall_nat_out_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($natent['descr']);?>&nbsp;
+ </td>
+ <td class="list nowrap" valign="middle">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move">
+ <tr>
+ <td><input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" title="<?=gettext("move selected rules before this rule");?>" type="image" style="height:17;width:17;border:0" /></td>
+ <td>
+ <a href="firewall_nat_out_edit.php?id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit mapping");?>" alt="edit" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td align="center" valign="middle">
+ <a href="firewall_nat_out.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this rule?");?>')">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule");?>" alt="delete" />
+ </a>
+ </td>
+ <td>
+ <a href="firewall_nat_out_edit.php?dup=<?=$i;?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new NAT based on this one");?>" width="17" height="17" border="0" alt="duplicate" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr valign="top" id="fr<?=$i;?>">
+ <td class="list" colspan="11"></td>
+ <td class="list nowrap" valign="middle">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td>
+<?php
+ if ($i == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected mappings to end");?>" border="0" alt="move" />
+<?php
+ else:
+?>
+ <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17;border:0" title="<?=gettext("move selected mappings to end");?>" />
+<?php
+ endif;
+?>
+ </td>
+ <td>
+ <a href="firewall_nat_out_edit.php">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add new mapping");?>" alt="add" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+<?php
+ if ($i == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" border="0" alt="delete" />
+<?php
+ else:
+?>
+ <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected mappings");?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected mappings?");?>')" />
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if ($mode == "automatic" || $mode == "hybrid"):
+ if (empty($FilterIflist)) {
+ filter_generate_optcfg_array();
+ }
+ if (empty($GatewaysList)) {
+ filter_generate_gateways();
+ }
+ $automatic_rules = filter_nat_rules_outbound_automatic(implode(" ", filter_nat_rules_automatic_tonathosts()));
+ unset($FilterIflist, $GatewaysList);
+?>
+ <tr><td colspan="5"><b>&nbsp;<?=gettext("Automatic rules:"); ?></b></td></tr>
+ <tr><td>&nbsp;</td></tr>
+ <tr id="frheader">
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="10%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Source");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Source Port");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Destination");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Destination Port");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("NAT Address");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("NAT Port");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Static Port");?></td>
+ <td width="25%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="5%" class="list">&nbsp;</td>
+ </tr>
+<?php
+ foreach ($automatic_rules as $natent):
+?>
+ <tr valign="top">
+ <td class="list">&nbsp;</td>
+ <td class="listt" align="center">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11" border="0" title="<?=gettext("automatic outbound nat");?>" alt="icon" />
+ </td>
+ <td class="listlr" style="background-color: #E0E0E0">
+ <?php echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])); ?>
+ &nbsp;
+ </td>
+ <td class="listr" style="background-color: #E0E0E0">
+ <?=$natent['source']['network'];?>
+ </td>
+ <td class="listr" style="background-color: #E0E0E0">
+<?php
+ echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
+ if (!$natent['sourceport']) {
+ echo "*";
+ } else {
+ echo $natent['sourceport'];
+ }
+?>
+ </td>
+ <td class="listr" style="background-color: #E0E0E0">
+<?php
+ if (isset($natent['destination']['any'])) {
+ echo "*";
+ } else {
+ if (isset($natent['destination']['not'])) {
+ echo "!&nbsp;";
+ }
+ echo $natent['destination']['address'];
+ }
+?>
+ </td>
+ <td class="listr" style="background-color: #E0E0E0">
+<?php
+ echo ($natent['protocol']) ? $natent['protocol'] . '/' : "" ;
+ if (!$natent['dstport']) {
+ echo "*";
+ } else {
+ echo $natent['dstport'];
+ }
+?>
+ </td>
+ <td class="listr" style="background-color: #E0E0E0">
+<?php
+ if (isset($natent['nonat'])) {
+ echo '<I>NO NAT</I>';
+ } elseif (!$natent['target']) {
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($natent['interface'])) . " address";
+ } elseif ($natent['target'] == "other-subnet") {
+ echo $natent['targetip'] . '/' . $natent['targetip_subnet'];
+ } else {
+ echo $natent['target'];
+ }
+?>
+ </td>
+ <td class="listr" style="background-color: #E0E0E0">
+<?php
+ if (!$natent['natport']) {
+ echo "*";
+ } else {
+ echo $natent['natport'];
+ }
+?>
+ </td>
+ <td class="listr" style="background-color: #E0E0E0">
+<?php
+ if (isset($natent['staticnatport'])) {
+ echo gettext("YES");
+ } else {
+ echo gettext("NO");
+ }
+?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($natent['descr']);?>&nbsp;
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+<?php
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td colspan="12">
+ <p><span class="vexpl">
+ <span class="red"><strong><?=gettext("Note:"); ?><br /></strong></span>
+ <?=gettext("If automatic outbound NAT selected, a mapping is automatically created " .
+ "for each interface's subnet (except WAN-type connections) and the rules " .
+ "on \"Mappings\" section of this page are ignored.<br /><br /> " .
+ "If manual outbound NAT is selected, outbound NAT rules will not be " .
+ "automatically generated and only the mappings you specify on this page " .
+ "will be used. <br /><br /> " .
+ "If hybrid outbound NAT is selected, mappings you specify on this page will " .
+ "be used, followed by the automatically generated ones. <br /><br />" .
+ "If disable outbound NAT is selected, no rules will be used. <br /><br />" .
+ "If a target address other than an interface's IP address is used, " .
+ "then depending on the way the WAN connection is setup, a "); ?>
+ <a href="firewall_virtual_ip.php"><?=gettext("Virtual IP"); ?></a>
+ <?= gettext(" may also be required.") ?>
+ </span></p>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_nat_out_edit.php b/src/usr/local/www/firewall_nat_out_edit.php
new file mode 100644
index 0000000..e99cebb
--- /dev/null
+++ b/src/usr/local/www/firewall_nat_out_edit.php
@@ -0,0 +1,905 @@
+<?php
+/* $Id$ */
+/*
+ firewall_nat_out_edit.php
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: nat
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-nat-outbound-edit
+##|*NAME=Firewall: NAT: Outbound: Edit page
+##|*DESCR=Allow access to the 'Firewall: NAT: Outbound: Edit' page.
+##|*MATCH=firewall_nat_out_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter.inc");
+require("shaper.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_nat_out.php');
+}
+
+if (!is_array($config['nat']['outbound'])) {
+ $config['nat']['outbound'] = array();
+}
+
+if (!is_array($config['nat']['outbound']['rule'])) {
+ $config['nat']['outbound']['rule'] = array();
+}
+
+$a_out = &$config['nat']['outbound']['rule'];
+
+if (!is_array($config['aliases']['alias'])) {
+ $config['aliases']['alias'] = array();
+}
+$a_aliases = &$config['aliases']['alias'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (is_numericint($_GET['after']) || $_GET['after'] == "-1") {
+ $after = $_GET['after'];
+}
+if (isset($_POST['after']) && (is_numericint($_POST['after']) || $_POST['after'] == "-1")) {
+ $after = $_POST['after'];
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ $id = $_GET['dup'];
+ $after = $_GET['dup'];
+}
+
+if (isset($id) && $a_out[$id]) {
+ if (isset($a_out[$id]['created']) && is_array($a_out[$id]['created'])) {
+ $pconfig['created'] = $a_out[$id]['created'];
+ }
+
+ if (isset($a_out[$id]['updated']) && is_array($a_out[$id]['updated'])) {
+ $pconfig['updated'] = $a_out[$id]['updated'];
+ }
+
+ $pconfig['protocol'] = $a_out[$id]['protocol'];
+ list($pconfig['source'], $pconfig['source_subnet']) = explode('/', $a_out[$id]['source']['network']);
+ if (!is_numeric($pconfig['source_subnet'])) {
+ $pconfig['source_subnet'] = 32;
+ }
+ $pconfig['sourceport'] = $a_out[$id]['sourceport'];
+ address_to_pconfig($a_out[$id]['destination'], $pconfig['destination'],
+ $pconfig['destination_subnet'], $pconfig['destination_not'],
+ $none, $none);
+ $pconfig['dstport'] = $a_out[$id]['dstport'];
+ $pconfig['natport'] = $a_out[$id]['natport'];
+ $pconfig['target'] = $a_out[$id]['target'];
+ $pconfig['targetip'] = $a_out[$id]['targetip'];
+ $pconfig['targetip_subnet'] = $a_out[$id]['targetip_subnet'];
+ $pconfig['poolopts'] = $a_out[$id]['poolopts'];
+ $pconfig['interface'] = $a_out[$id]['interface'];
+ if (!$pconfig['interface']) {
+ $pconfig['interface'] = "wan";
+ }
+ $pconfig['descr'] = $a_out[$id]['descr'];
+ $pconfig['nonat'] = $a_out[$id]['nonat'];
+ $pconfig['disabled'] = isset($a_out[$id]['disabled']);
+ $pconfig['staticnatport'] = isset($a_out[$id]['staticnatport']);
+ $pconfig['nosync'] = isset($a_out[$id]['nosync']);
+} else {
+ $pconfig['source_subnet'] = 24;
+ $pconfig['destination'] = "any";
+ $pconfig['destination_subnet'] = 24;
+ $pconfig['interface'] = "wan";
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ unset($id);
+}
+
+if ($_POST) {
+ if ($_POST['destination_type'] == "any") {
+ $_POST['destination'] = "any";
+ $_POST['destination_subnet'] = 24;
+ }
+ if ($_POST['source_type'] == "any") {
+ $_POST['source'] = "any";
+ $_POST['source_subnet'] = 24;
+ } elseif ($_POST['source_type'] == "(self)") {
+ $_POST['source'] = "(self)";
+ $_POST['source_subnet'] = 24;
+ }
+
+ unset($input_errors);
+ $pconfig = $_POST;
+ /* run through $_POST items encoding HTML entitles so that the user
+ * cannot think he is slick and perform a XSS attack on the unwilling
+ */
+ foreach ($_POST as $key => $value) {
+ $temp = str_replace(">", "", $value);
+ $newpost = htmlentities($temp);
+ if ($newpost <> $temp) {
+ $input_errors[] = sprintf(gettext("Invalid characters detected (%s). Please remove invalid characters and save again."), $temp);
+ }
+ }
+
+ /* input validation */
+ $reqdfields = explode(" ", "interface protocol source source_subnet destination destination_subnet");
+ $reqdfieldsn = array(gettext("Interface"), gettext("Protocol"), gettext("Source"), gettext("Source bit count"), gettext("Destination"), gettext("Destination bit count"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ $protocol_uses_ports = in_array($_POST['protocol'], explode(" ", "any tcp udp tcp/udp"));
+
+ if ($_POST['source']) {
+ $_POST['source'] = trim($_POST['source']);
+ }
+ if ($_POST['destination']) {
+ $_POST['destination'] = trim($_POST['destination']);
+ }
+ if ($_POST['targetip']) {
+ $_POST['targetip'] = trim($_POST['targetip']);
+ }
+ if ($_POST['sourceport']) {
+ $_POST['sourceport'] = trim($_POST['sourceport']);
+ }
+ if ($_POST['dstport']) {
+ $_POST['dstport'] = trim($_POST['dstport']);
+ }
+ if ($_POST['natport']) {
+ $_POST['natport'] = trim($_POST['natport']);
+ }
+
+ if ($protocol_uses_ports && $_POST['sourceport'] <> "" && !(is_portoralias($_POST['sourceport']) || is_portrange($_POST['sourceport']))) {
+ $input_errors[] = gettext("You must supply either a valid port or port alias for the source port entry.");
+ }
+
+ if ($protocol_uses_ports && $_POST['dstport'] <> "" && !(is_portoralias($_POST['dstport']) || is_portrange($_POST['dstport']))) {
+ $input_errors[] = gettext("You must supply either a valid port or port alias for the destination port entry.");
+ }
+
+ if ($protocol_uses_ports && $_POST['natport'] <> "" && !is_port($_POST['natport']) && !isset($_POST['nonat'])) {
+ $input_errors[] = gettext("You must supply a valid port for the NAT port entry.");
+ }
+
+ if (($_POST['source_type'] != "any") && ($_POST['source_type'] != "(self)")) {
+ if ($_POST['source'] && !is_ipaddroralias($_POST['source']) && $_POST['source'] <> "any") {
+ $input_errors[] = gettext("A valid source must be specified.");
+ }
+ }
+ if ($_POST['source_subnet'] && !is_numericint($_POST['source_subnet'])) {
+ $input_errors[] = gettext("A valid source bit count must be specified.");
+ }
+ if ($_POST['destination_type'] != "any") {
+ if ($_POST['destination'] && !is_ipaddroralias($_POST['destination'])) {
+ $input_errors[] = gettext("A valid destination must be specified.");
+ }
+ }
+ if ($_POST['destination_subnet'] && !is_numericint($_POST['destination_subnet'])) {
+ $input_errors[] = gettext("A valid destination bit count must be specified.");
+ }
+ if ($_POST['destination_type'] == "any") {
+ if ($_POST['destination_not']) {
+ $input_errors[] = gettext("Negating destination address of \"any\" is invalid.");
+ }
+ }
+
+ if ($_POST['target'] && !is_ipaddr($_POST['target']) && !is_subnet($_POST['target']) && !is_alias($_POST['target']) && !isset($_POST['nonat']) && !($_POST['target'] == "other-subnet")) {
+ $input_errors[] = gettext("A valid target IP address must be specified.");
+ }
+
+ if ($_POST['target'] == "other-subnet") {
+ if (!is_ipaddr($_POST['targetip'])) {
+ $input_errors[] = gettext("A valid target IP must be specified when using the 'Other Subnet' type.");
+ }
+ if (!is_numericint($_POST['targetip_subnet'])) {
+ $input_errors[] = gettext("A valid target bit count must be specified when using the 'Other Subnet' type.");
+ }
+ }
+
+ /* Verify Pool Options */
+ $poolopts = "";
+ if ($_POST['poolopts']) {
+ if (is_subnet($_POST['target']) || ($_POST['target'] == "other-subnet")) {
+ $poolopts = $_POST['poolopts'];
+ } elseif (is_alias($_POST['target'])) {
+ if (substr($_POST['poolopts'], 0, 11) == "round-robin") {
+ $poolopts = $_POST['poolopts'];
+ } else {
+ $input_errors[] = gettext("Only Round Robin pool options may be chosen when selecting an alias.");
+ }
+ }
+ }
+
+ /* if user has selected any as source, set it here */
+ if ($_POST['source_type'] == "any") {
+ $osn = "any";
+ } else if ($_POST['source_type'] == "(self)") {
+ $osn = "(self)";
+ } else if (is_alias($_POST['source'])) {
+ $osn = $_POST['source'];
+ } else {
+ $osn = gen_subnet($_POST['source'], $_POST['source_subnet']) . "/" . $_POST['source_subnet'];
+ }
+
+ /* check for existing entries */
+ if ($_POST['destination_type'] == "any") {
+ $ext = "any";
+ } else if (is_alias($_POST['destination'])) {
+ $ext = $_POST['destination'];
+ } else {
+ $ext = gen_subnet($_POST['destination'], $_POST['destination_subnet']) . "/" . $_POST['destination_subnet'];
+ }
+
+ foreach ($a_out as $natent) {
+ if (isset($id) && ($a_out[$id]) && ($a_out[$id] === $natent)) {
+ continue;
+ }
+
+ if (!$natent['interface']) {
+ $natent['interface'] == "wan";
+ }
+ }
+
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_aon/input_validation");
+
+ if (!$input_errors) {
+ $natent = array();
+ $natent['source']['network'] = $osn;
+ $natent['sourceport'] = ($protocol_uses_ports) ? $_POST['sourceport'] : "";
+ $natent['descr'] = $_POST['descr'];
+ $natent['target'] = (!isset($_POST['nonat'])) ? $_POST['target'] : "";
+ $natent['targetip'] = (!isset($_POST['nonat'])) ? $_POST['targetip'] : "";
+ $natent['targetip_subnet'] = (!isset($_POST['nonat'])) ? $_POST['targetip_subnet'] : "";
+ $natent['interface'] = $_POST['interface'];
+ $natent['poolopts'] = $poolopts;
+
+ /* static-port */
+ if (isset($_POST['staticnatport']) && $protocol_uses_ports && !isset($_POST['nonat'])) {
+ $natent['staticnatport'] = true;
+ } else {
+ unset($natent['staticnatport']);
+ }
+
+ if (isset($_POST['disabled'])) {
+ $natent['disabled'] = true;
+ } else {
+ unset($natent['disabled']);
+ }
+
+ /* if user has selected not nat, set it here */
+ if (isset($_POST['nonat'])) {
+ $natent['nonat'] = true;
+ } else {
+ unset($natent['nonat']);
+ }
+
+ if ($_POST['protocol'] && $_POST['protocol'] != "any") {
+ $natent['protocol'] = $_POST['protocol'];
+ } else {
+ unset($natent['protocol']);
+ }
+
+ if ($ext == "any") {
+ $natent['destination']['any'] = true;
+ } else {
+ $natent['destination']['address'] = $ext;
+ }
+ if ($_POST['natport'] != "" && $protocol_uses_ports && !isset($_POST['nonat'])) {
+ $natent['natport'] = $_POST['natport'];
+ } else {
+ unset($natent['natport']);
+ }
+ if ($_POST['dstport'] != "" && $protocol_uses_ports) {
+ $natent['dstport'] = $_POST['dstport'];
+ } else {
+ unset($natent['dstport']);
+ }
+
+ if ($_POST['nosync'] == "yes") {
+ $natent['nosync'] = true;
+ } else {
+ unset($natent['nosync']);
+ }
+
+ if (isset($_POST['destination_not']) && $ext != "any") {
+ $natent['destination']['not'] = true;
+ }
+
+ if (isset($a_out[$id]['created']) && is_array($a_out[$id]['created'])) {
+ $natent['created'] = $a_out[$id]['created'];
+ }
+
+ $natent['updated'] = make_config_revision_entry();
+
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_aon/pre_write_config");
+
+ if (isset($id) && $a_out[$id]) {
+ $a_out[$id] = $natent;
+ } else {
+ $natent['created'] = make_config_revision_entry();
+ if (is_numeric($after)) {
+ array_splice($a_out, $after+1, 0, array($natent));
+ } else {
+ $a_out[] = $natent;
+ }
+ }
+
+ if (write_config()) {
+ mark_subsystem_dirty('natconf');
+ }
+ header("Location: firewall_nat_out.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("NAT"), gettext("Outbound"), gettext("Edit"));
+$closehead = false;
+include("head.inc");
+
+?>
+
+<script type="text/javascript" src="/javascript/suggestions.js"></script>
+<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
+<script type="text/javascript">
+//<![CDATA[
+var portsenabled = 1;
+function staticportchange() {
+ if (document.iform.staticnatport.checked) {
+ document.iform.natport.value = "";
+ document.iform.natport.disabled = 1;
+ } else {
+ document.iform.natport.disabled = 0;
+ }
+}
+function typesel_change() {
+ switch (document.iform.destination_type.selectedIndex) {
+ case 1: // network
+ document.iform.destination.disabled = 0;
+ document.iform.destination_subnet.disabled = 0;
+ break;
+ default:
+ document.iform.destination.value = "";
+ document.iform.destination.disabled = 1;
+ document.iform.destination_subnet.value = "24";
+ document.iform.destination_subnet.disabled = 1;
+ break;
+ }
+}
+function sourcesel_change() {
+ switch (document.iform.source_type.selectedIndex) {
+ case 2: // network
+ document.iform.source.disabled = 0;
+ document.iform.source_subnet.disabled = 0;
+ break;
+ default:
+ document.iform.source.value = "";
+ document.iform.source.disabled = 1;
+ document.iform.source_subnet.value = "24";
+ document.iform.source_subnet.disabled = 1;
+ break;
+ }
+}
+function nonat_change() {
+ if (document.iform.nonat.checked) {
+ document.getElementById("transtable").style.display = 'none';
+ } else {
+ document.getElementById("transtable").style.display = '';
+ }
+}
+function proto_change() {
+ if (document.iform.protocol.selectedIndex >= 0 && document.iform.protocol.selectedIndex <= 3) {
+ portsenabled = 1;
+ } else {
+ portsenabled = 0;
+ }
+
+ if (portsenabled) {
+ document.getElementById("sport_tr").style.display = '';
+ document.getElementById("dport_tr").style.display = '';
+ document.getElementById("tport_tr").style.display = '';
+ document.getElementById("tporttext_tr").style.display = '';
+ document.getElementById("tportstatic_tr").style.display = '';
+ } else {
+ document.getElementById("sport_tr").style.display = 'none';
+ document.getElementById("dport_tr").style.display = 'none';
+ document.getElementById("tport_tr").style.display = 'none';
+ document.getElementById("tporttext_tr").style.display = 'none';
+ document.getElementById("tportstatic_tr").style.display = 'none';
+ }
+}
+function poolopts_change() {
+ if (jQuery('#target option:selected').text().trim().substring(0, 4) == "Host") {
+ jQuery('#poolopts_tr').css('display', '');
+ jQuery('#target_network').css('display', 'none');
+ } else if (jQuery('#target option:selected').text().trim().substring(0, 6) == "Subnet") {
+ jQuery('#poolopts_tr').css('display', '');
+ jQuery('#target_network').css('display', 'none');
+ } else if (jQuery('#target option:selected').text().trim().substring(0, 5) == "Other") {
+ jQuery('#poolopts_tr').css('display', '');
+ jQuery('#target_network').css('display', '');
+ } else {
+ jQuery('#poolopts').prop('selectedIndex', 0);
+ jQuery('#poolopts_tr').css('display', 'none');
+ jQuery('#target_network').css('display', 'none');
+ jQuery('#targetip').val('');
+ jQuery('#targetip_subnet').val('0');
+ }
+}
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="firewall_nat_out_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="1" summary="firewall nat outbound edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Advanced Outbound NAT entry");?></td>
+ </tr>
+<?php
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/htmlphpearly");
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled");?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable this rule");?></strong><br />
+ <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Do not NAT");?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" name="nonat" id="nonat" onclick="nonat_change();" <?php if (isset($pconfig['nonat'])) echo " checked=\"checked\""; ?> />
+ <span class="vexpl"><?=gettext("Enabling this option will disable NAT for traffic matching this rule and stop processing Outbound NAT rules.");?>
+ <br /><?=gettext("Hint: in most cases, you won't use this option.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect">
+<?php
+ $iflist = get_configured_interface_with_descr(false, true);
+ foreach ($iflist as $if => $ifdesc) {
+ if (have_ruleint_access($if)) {
+ $interfaces[$if] = $ifdesc;
+ }
+ }
+
+ if ($config['l2tp']['mode'] == "server") {
+ if (have_ruleint_access("l2tp")) {
+ $interfaces['l2tp'] = "L2TP VPN";
+ }
+ }
+
+ if ($config['pptpd']['mode'] == "server") {
+ if (have_ruleint_access("pptp")) {
+ $interfaces['pptp'] = "PPTP VPN";
+ }
+ }
+
+ if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
+ $interfaces['pppoe'] = "PPPoE Server";
+ }
+
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ if (have_ruleint_access("enc0")) {
+ $interfaces["enc0"] = "IPsec";
+ }
+ }
+
+ /* add openvpn/tun interfaces */
+ if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
+ $interfaces["openvpn"] = "OpenVPN";
+ }
+
+ foreach ($interfaces as $iface => $ifacename):
+?>
+ <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+<?php
+ endforeach;
+?>
+ </select><br />
+ <span class="vexpl"><?=gettext("Choose which interface this rule applies to.");?><br />
+ <?=gettext("Hint: in most cases, you'll want to use WAN here.");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
+ <td width="78%" class="vtable">
+ <select name="protocol" class="formselect" onchange="proto_change();">
+<?php
+ $protocols = explode(" ", "any TCP UDP TCP/UDP ICMP ESP AH GRE IPV6 IGMP carp pfsync");
+ foreach ($protocols as $proto):
+?>
+ <option value="<?=strtolower($proto);?>" <?php if (strtolower($proto) == $pconfig['protocol']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($proto);?></option>
+<?php
+ endforeach;
+?>
+ </select><br />
+ <span class="vexpl"><?=gettext("Choose which protocol this rule should match.");?><br />
+<?php
+ printf(gettext("Hint: in most cases, you should specify %s any %s here."), "<em>", "</em>&nbsp;");
+?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Source");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="1" cellpadding="1" summary="source">
+ <tr>
+ <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="source_type" class="formselect" onchange="sourcesel_change()">
+ <option value="any" <?php if ($pconfig['source'] == "any") echo "selected=\"selected\""; ?>><?=gettext("any");?></option>
+ <option value="(self)" <?PHP if ($pconfig['source'] == "(self)") echo "selected=\"selected\""; ?>><?=gettext("This Firewall (self)");?></option>
+ <option value="network" <?php if (($pconfig['source'] != "any") && ($pconfig['source'] != "(self)")) echo "selected=\"selected\""; ?>><?=gettext("Network");?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="source" type="text" autocomplete="off" class="formfldalias" id="source" size="20" value="<?=htmlspecialchars($pconfig['source']);?>" />/
+ <select name="source_subnet" class="formfld" id="source_subnet">
+<?php
+ for ($i = 32; $i >= 0; $i--):
+?>
+ <option value="<?=$i;?>"<?php if ($i == $pconfig['source_subnet']) echo " selected=\"selected\""; ?>><?=$i;?></option>
+<?php
+ endfor;
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>
+ <span class="vexpl"><?=gettext("Enter the source network for the outbound NAT mapping.");?></span>
+ </td>
+ </tr>
+ <tr name="sport_tr" id="sport_tr">
+ <td><?=gettext("Source port:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="sourceport" type="text" autocomplete="off" class="formfldalias" id="sourceport" size="5" value="<?=htmlspecialchars($pconfig['sourceport']);?>" />
+ <?=gettext("(leave blank for any)");?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination");?></td>
+ <td width="78%" class="vtable">
+ <input name="destination_not" type="checkbox" id="destination_not" value="yes" <?php if ($pconfig['destination_not']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("not");?></strong><br />
+ <?=gettext("Use this option to invert the sense of the match.");?><br />
+ <br />
+ <table border="0" cellspacing="1" cellpadding="1" summary="destination">
+ <tr>
+ <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="destination_type" class="formselect" onchange="typesel_change()">
+ <option value="any"<?php if ($pconfig['destination'] == "any") echo " selected=\"selected\""; ?>>
+ <?=gettext("any");?>
+ </option>
+ <option value="network"<?php if ($pconfig['destination'] != "any") echo " selected=\"selected\""; ?>>
+ <?=gettext("Network");?>
+ </option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="destination" type="text" autocomplete="off" class="formfldalias" id="destination" size="20" value="<?=htmlspecialchars($pconfig['destination']);?>" />/
+ <select name="destination_subnet" class="formselect" id="destination_subnet">
+<?php
+ for ($i = 32; $i >= 0; $i--):
+?>
+ <option value="<?=$i;?>"<?php if ($i == $pconfig['destination_subnet']) echo " selected=\"selected\""; ?>><?=$i;?></option>
+<?php
+ endfor;
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>
+ <span class="vexpl"><?=gettext("Enter the destination network for the outbound NAT mapping.");?></span>
+ </td>
+ </tr>
+ <tr name="dport_tr" id="dport_tr">
+ <td><?=gettext("Destination port:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="dstport" type="text" autocomplete="off" class="formfldalias" id="dstport" size="5" value="<?=htmlspecialchars($pconfig['dstport']);?>" />
+ <?=gettext("(leave blank for any)");?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr name="transtable" id="transtable">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Translation");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="1" cellpadding="1" summary="translation">
+ <tr>
+ <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="target" class="formselect" id="target" onchange="poolopts_change();">
+ <option value=""<?php if (!$pconfig['target']) echo " selected=\"selected\""; ?>>
+ <?=gettext("Interface address");?>
+ </option>
+<?php
+ if (is_array($config['virtualip']['vip'])):
+ foreach ($config['virtualip']['vip'] as $sn):
+ if (isset($sn['noexpand'])) {
+ continue;
+ }
+ if ($sn['mode'] == "proxyarp" && $sn['type'] == "network"):
+ $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
+ $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
+ $len = $end - $start;
+?>
+ <option value="<?=$sn['subnet'].'/'.$sn['subnet_bits'];?>" <?php if ($sn['subnet'].'/'.$sn['subnet_bits'] == $pconfig['target']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("Subnet: {$sn['subnet']}/{$sn['subnet_bits']} ({$sn['descr']})");?>
+ </option>
+<?php
+ for ($i = 0; $i <= $len; $i++):
+ $snip = long2ip32($start+$i);
+?>
+ <option value="<?=$snip;?>" <?php if ($snip == $pconfig['target']) echo "selected"; ?>>
+ <?=htmlspecialchars("{$snip} ({$sn['descr']})");?>
+ </option>
+<?php
+ endfor;
+?>
+<?php
+ else:
+?>
+ <option value="<?=$sn['subnet'];?>" <?php if ($sn['subnet'] == $pconfig['target']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("{$sn['subnet']} ({$sn['descr']})");?>
+ </option>
+<?php
+ endif;
+ endforeach;
+ endif;
+ foreach ($a_aliases as $alias):
+ if ($alias['type'] != "host") {
+ continue;
+ }
+?>
+ <option value="<?=$alias['name'];?>" <?php if ($alias['name'] == $pconfig['target']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("Host Alias: {$alias['name']} ({$alias['descr']})");?>
+ </option>
+<?php
+ endforeach;
+?>
+ <option value="other-subnet"<?php if ($pconfig['target'] == "other-subnet") echo " selected=\"selected\""; ?>>
+ <?=gettext("Other Subnet (Enter Below)");?>
+ </option>
+ </select>
+ </td>
+ </tr>
+
+ <tr id="target_network">
+ <td><?=gettext("Other Subnet:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="targetip" type="text" class="formfld unknown" id="targetip" size="20" value="<?=htmlspecialchars($pconfig['targetip']);?>" />/
+ <select name="targetip_subnet" class="formfld" id="targetip_subnet">
+<?php
+ for ($i = 32; $i >= 0; $i--):
+?>
+ <option value="<?=$i;?>"<?php if ($i == $pconfig['targetip_subnet']) echo " selected=\"selected\""; ?>><?=$i;?></option>
+<?php
+ endfor;
+?>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td>&nbsp;</td>
+ <td>
+ <span class="vexpl"><?=gettext("Packets matching this rule will be mapped to the IP address given here.");?><br />
+ <?=gettext("If you want this rule to apply to another IP address rather than the IP address of the interface chosen above, ".
+ "select it here (you will need to define ");?>
+ <a href="firewall_virtual_ip.php"><?=gettext("Virtual IP");?></a>
+ <?=gettext("addresses on the interface first).");?>
+ </span><br />
+ </td>
+ </tr>
+ <tr id="poolopts_tr">
+ <td valign="top">Pool Options</td>
+ <td>
+ <select name="poolopts" id="poolopts">
+ <option value="" <?php if ($pconfig['poolopts'] == "") echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("Default");?>
+ </option>
+ <option value="round-robin" <?php if ($pconfig['poolopts'] == "round-robin") echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("Round Robin");?>
+ </option>
+ <option value="round-robin sticky-address" <?php if ($pconfig['poolopts'] == "round-robin sticky-address") echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("Round Robin with Sticky Address");?>
+ </option>
+ <option value="random" <?php if ($pconfig['poolopts'] == "random") echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("Random");?>
+ </option>
+ <option value="random sticky-address" <?php if ($pconfig['poolopts'] == "random sticky-address") echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("Random with Sticky Address");?>
+ </option>
+ <option value="source-hash" <?php if ($pconfig['poolopts'] == "source-hash") echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("Source Hash");?>
+ </option>
+ <option value="bitmask" <?php if ($pconfig['poolopts'] == "bitmask") echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars("Bitmask");?>
+ </option>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Only Round Robin types work with Host Aliases. Any type can be used with a Subnet.");?><br />
+ * <?=gettext("Round Robin: Loops through the translation addresses.");?><br />
+ * <?=gettext("Random: Selects an address from the translation address pool at random.");?><br />
+ * <?=gettext("Source Hash: Uses a hash of the source address to determine the translation address, ensuring that the redirection address is always the same for a given source.");?><br />
+ * <?=gettext("Bitmask: Applies the subnet mask and keeps the last portion identical; 10.0.1.50 -&gt; x.x.x.50.");?><br />
+ * <?=gettext("Sticky Address: The Sticky Address option can be used with the Random and Round Robin pool types to ensure that a particular source address is always mapped to the same translation address.");?><br />
+ </span><br />
+ </td>
+ </tr>
+ <tr name="tport_tr" id="tport_tr">
+ <td><?=gettext("Port:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="natport" type="text" class="formfld unknown" id="natport" size="5" value="<?=htmlspecialchars($pconfig['natport']);?>" />
+ </td>
+ </tr>
+ <tr name="tporttext_tr" id="tporttext_tr">
+ <td>&nbsp;</td>
+ <td>
+ <span class="vexpl"><?=gettext("Enter the source port for the outbound NAT mapping.");?></span>
+ </td>
+ </tr>
+ <tr name="tportstatic_tr" id="tportstatic_tr">
+ <td><?=gettext("Static-port:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input onchange="staticportchange();" name="staticnatport" type="checkbox" class="formfld" id="staticnatport" size="5"<?php if ($pconfig['staticnatport']) echo " checked=\"checked\"";?> />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("No XMLRPC Sync");?></td>
+ <td width="78%" class="vtable">
+ <input value="yes" name="nosync" type="checkbox" class="formfld" id="nosync"<?php if ($pconfig['nosync']) echo " checked=\"checked\""; ?> /><br />
+ <?=gettext("Hint: This prevents the rule on Master from automatically syncing to other CARP members. This does NOT prevent the rule from being overwritten on Slave.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
+ </td>
+ </tr>
+<?php
+ $has_created_time = (isset($a_out[$id]['created']) && is_array($a_out[$id]['created']));
+ $has_updated_time = (isset($a_out[$id]['updated']) && is_array($a_out[$id]['updated']));
+ if ($has_created_time || $has_updated_time):
+?>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Rule Information");?></td>
+ </tr>
+<?php
+ if ($has_created_time):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Created");?></td>
+ <td width="78%" class="vtable">
+ <?= date(gettext("n/j/y H:i:s"), $a_out[$id]['created']['time']) ?> <?= gettext("by") ?> <strong><?= $a_out[$id]['created']['username'] ?></strong>
+ </td>
+ </tr>
+<?php
+ endif;
+
+ if ($has_updated_time):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Updated");?></td>
+ <td width="78%" class="vtable">
+ <?= date(gettext("n/j/y H:i:s"), $a_out[$id]['updated']['time']) ?> <?= gettext("by") ?> <strong><?= $a_out[$id]['updated']['username'] ?></strong>
+ </td>
+ </tr>
+<?php
+ endif;
+ endif;
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_aon/htmlphplate");
+?>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+<?php
+ if (isset($id) && $a_out[$id]):
+?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+<?php
+ endif;
+?>
+ <input name="after" type="hidden" value="<?=htmlspecialchars($after);?>" />
+ </td>
+ </tr>
+ </table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+ sourcesel_change();
+ typesel_change();
+ staticportchange();
+ nonat_change();
+ proto_change();
+ poolopts_change();
+
+ var addressarray = <?= json_encode(get_alias_list(array("host", "network", "openvpn", "urltable"))) ?>;
+ var customarray = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
+
+ var oTextbox1 = new AutoSuggestControl(document.getElementById("source"), new StateSuggestions(addressarray));
+ var oTextbox2 = new AutoSuggestControl(document.getElementById("sourceport"), new StateSuggestions(customarray));
+ var oTextbox3 = new AutoSuggestControl(document.getElementById("destination"), new StateSuggestions(addressarray));
+ var oTextbox4 = new AutoSuggestControl(document.getElementById("dstport"), new StateSuggestions(customarray));
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_rules.php b/src/usr/local/www/firewall_rules.php
new file mode 100644
index 0000000..d3e8f24
--- /dev/null
+++ b/src/usr/local/www/firewall_rules.php
@@ -0,0 +1,944 @@
+<?php
+/* $Id$ */
+/*
+ firewall_rules.php
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-rules
+##|*NAME=Firewall: Rules page
+##|*DESCR=Allow access to the 'Firewall: Rules' page.
+##|*MATCH=firewall_rules.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$pgtitle = array(gettext("Firewall"), gettext("Rules"));
+$shortcut_section = "firewall";
+
+function delete_nat_association($id) {
+ global $config;
+
+ if (!$id || !is_array($config['nat']['rule'])) {
+ return;
+ }
+
+ $a_nat = &$config['nat']['rule'];
+
+ foreach ($a_nat as &$natent) {
+ if ($natent['associated-rule-id'] == $id) {
+ $natent['associated-rule-id'] = '';
+ }
+ }
+}
+
+if (!is_array($config['filter']['rule'])) {
+ $config['filter']['rule'] = array();
+}
+filter_rules_sort();
+$a_filter = &$config['filter']['rule'];
+
+$if = $_GET['if'];
+if ($_POST['if']) {
+ $if = $_POST['if'];
+}
+
+$ifdescs = get_configured_interface_with_descr();
+
+/* add group interfaces */
+if (is_array($config['ifgroups']['ifgroupentry'])) {
+ foreach ($config['ifgroups']['ifgroupentry'] as $ifgen) {
+ if (have_ruleint_access($ifgen['ifname'])) {
+ $iflist[$ifgen['ifname']] = $ifgen['ifname'];
+ }
+ }
+}
+
+foreach ($ifdescs as $ifent => $ifdesc) {
+ if (have_ruleint_access($ifent)) {
+ $iflist[$ifent] = $ifdesc;
+ }
+}
+
+if ($config['l2tp']['mode'] == "server") {
+ if (have_ruleint_access("l2tp")) {
+ $iflist['l2tp'] = "L2TP VPN";
+ }
+}
+
+if ($config['pptpd']['mode'] == "server") {
+ if (have_ruleint_access("pptp")) {
+ $iflist['pptp'] = "PPTP VPN";
+ }
+}
+
+if (is_array($config['pppoes']['pppoe'])) {
+ foreach ($config['pppoes']['pppoe'] as $pppoes) {
+ if (($pppoes['mode'] == 'server') && have_ruleint_access("pppoe")) {
+ $iflist['pppoe'] = "PPPoE Server";
+ }
+ }
+}
+
+/* add ipsec interfaces */
+if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ if (have_ruleint_access("enc0")) {
+ $iflist["enc0"] = "IPsec";
+ }
+}
+
+/* add openvpn/tun interfaces */
+if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
+ $iflist["openvpn"] = "OpenVPN";
+}
+
+pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/interfaces_override");
+
+if (!$if || !isset($iflist[$if])) {
+ if ("any" == $if) {
+ $if = "FloatingRules";
+ } else if ("FloatingRules" != $if) {
+ if (isset($iflist['wan'])) {
+ $if = "wan";
+ } else {
+ $if = "FloatingRules";
+ }
+ }
+}
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval = filter_configure();
+
+ clear_subsystem_dirty('filter');
+
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/apply");
+
+ $savemsg = sprintf(gettext("The settings have been applied. The firewall rules are now reloading in the background.<br />You can also %s monitor %s the reload progress"), "<a href='status_filter_reload.php'>", "</a>");
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_filter[$_GET['id']]) {
+ if (!empty($a_filter[$_GET['id']]['associated-rule-id'])) {
+ delete_nat_association($a_filter[$_GET['id']]['associated-rule-id']);
+ }
+ unset($a_filter[$_GET['id']]);
+ if (write_config()) {
+ mark_subsystem_dirty('filter');
+ }
+ header("Location: firewall_rules.php?if=" . htmlspecialchars($if));
+ exit;
+ }
+}
+
+// Handle save msg if defined
+if ($_REQUEST['savemsg']) {
+ $savemsg = htmlentities($_REQUEST['savemsg']);
+}
+
+if (isset($_POST['del_x'])) {
+ /* delete selected rules */
+ if (is_array($_POST['rule']) && count($_POST['rule'])) {
+ foreach ($_POST['rule'] as $rulei) {
+ delete_nat_association($a_filter[$rulei]['associated-rule-id']);
+ unset($a_filter[$rulei]);
+ }
+ if (write_config()) {
+ mark_subsystem_dirty('filter');
+ }
+ header("Location: firewall_rules.php?if=" . htmlspecialchars($if));
+ exit;
+ }
+} else if ($_GET['act'] == "toggle") {
+ if ($a_filter[$_GET['id']]) {
+ if (isset($a_filter[$_GET['id']]['disabled'])) {
+ unset($a_filter[$_GET['id']]['disabled']);
+ } else {
+ $a_filter[$_GET['id']]['disabled'] = true;
+ }
+ if (write_config()) {
+ mark_subsystem_dirty('filter');
+ }
+ header("Location: firewall_rules.php?if=" . htmlspecialchars($if));
+ exit;
+ }
+} else {
+ /* yuck - IE won't send value attributes for image buttons, while Mozilla does -
+ so we use .x/.y to fine move button clicks instead... */
+ unset($movebtn);
+ foreach ($_POST as $pn => $pd) {
+ if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
+ $movebtn = $matches[1];
+ break;
+ }
+ }
+ /* move selected rules before this rule */
+ if (isset($movebtn) && is_array($_POST['rule']) && count($_POST['rule'])) {
+ $a_filter_new = array();
+
+ /* copy all rules < $movebtn and not selected */
+ for ($i = 0; $i < $movebtn; $i++) {
+ if (!in_array($i, $_POST['rule'])) {
+ $a_filter_new[] = $a_filter[$i];
+ }
+ }
+
+ /* copy all selected rules */
+ for ($i = 0; $i < count($a_filter); $i++) {
+ if ($i == $movebtn) {
+ continue;
+ }
+ if (in_array($i, $_POST['rule'])) {
+ $a_filter_new[] = $a_filter[$i];
+ }
+ }
+
+ /* copy $movebtn rule */
+ if ($movebtn < count($a_filter)) {
+ $a_filter_new[] = $a_filter[$movebtn];
+ }
+
+ /* copy all rules > $movebtn and not selected */
+ for ($i = $movebtn+1; $i < count($a_filter); $i++) {
+ if (!in_array($i, $_POST['rule'])) {
+ $a_filter_new[] = $a_filter[$i];
+ }
+ }
+
+ $a_filter = $a_filter_new;
+ if (write_config()) {
+ mark_subsystem_dirty('filter');
+ }
+ header("Location: firewall_rules.php?if=" . htmlspecialchars($if));
+ exit;
+ }
+}
+$closehead = false;
+
+include("head.inc");
+?>
+<link type="text/css" rel="stylesheet" href="/javascript/chosen/chosen.css" />
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script src="/javascript/chosen/chosen.jquery.js" type="text/javascript"></script>
+<?php include("fbegin.inc"); ?>
+<form action="firewall_rules.php" method="post">
+
+<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('filter')): ?><p>
+<?php print_info_box_np(gettext("The firewall rule configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."), "apply", "", true); ?>
+<br />
+<?php endif; ?>
+<?php
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/before_table");
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall rules">
+ <tr><td class="tabnavtbl">
+ <?php
+ /* active tabs */
+ $tab_array = array();
+ if ("FloatingRules" == $if) {
+ $active = true;
+ } else {
+ $active = false;
+ }
+ $tab_array[] = array(gettext("Floating"), $active, "firewall_rules.php?if=FloatingRules");
+ $tabscounter = 0;
+ $i = 0;
+ foreach ($iflist as $ifent => $ifname) {
+ if ($ifent == $if) {
+ $active = true;
+ } else {
+ $active = false;
+ }
+ $tab_array[] = array($ifname, $active, "firewall_rules.php?if={$ifent}");
+ }
+ display_top_tabs($tab_array);
+ ?>
+ </td></tr>
+ <tr><td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <?php
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/before_first_tr");
+ ?>
+ <tr id="frheader">
+ <td width="3%" class="list">&nbsp;</td>
+ <td width="5%" class="list">&nbsp;</td>
+ <td width="3%" class="listhdrr"><?=gettext("ID");?></td>
+ <?php
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tablehead");
+ ?>
+ <?php
+ if ('FloatingRules' == $if) {
+ ?>
+ <td width="3%" class="listhdrr"><?=gettext('Interfaces');?></td>
+ <?php
+ }
+ ?>
+ <td width="6%" class="listhdrr"><?=gettext("Proto");?></td>
+ <td width="12%" class="listhdrr"><?=gettext("Source");?></td>
+ <td width="6%" class="listhdrr"><?=gettext("Port");?></td>
+ <td width="12%" class="listhdrr"><?=gettext("Destination");?></td>
+ <td width="6%" class="listhdrr"><?=gettext("Port");?></td>
+ <td width="5%" class="listhdrr"><?=gettext("Gateway");?></td>
+ <td width="8%" class="listhdrr"><?=gettext("Queue");?></td>
+ <td width="5%" class="listhdrr"><?=gettext("Schedule");?></td>
+ <?php
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_desc_tablehead");
+ ?>
+ <td width="19%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="delete selected rules">
+ <tr>
+ <?php
+ $nrules = 0;
+ for ($i = 0; isset($a_filter[$i]); $i++) {
+ $filterent = $a_filter[$i];
+ if ($filterent['interface'] != $if && !isset($filterent['floating'])) {
+ continue;
+ }
+ if (isset($filterent['floating']) && "FloatingRules" != $if) {
+ continue;
+ }
+ $nrules++;
+ }
+ ?>
+ <td>
+ <?php if ($nrules == 0): ?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?gettext("delete selected rules"); ?>" border="0" alt="delete" /><?php else: ?>
+ <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected rules");?>" onclick="return confirm('<?=gettext('Do you really want to delete the selected rules?');?>')" />
+ <?php endif; ?>
+ </td>
+ <td align="center" valign="middle">
+ <a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>&amp;after=-1">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add new rule");?>" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php // Show the anti-lockout rule if it's enabled, and we are on LAN with an if count > 1, or WAN with an if count of 1.
+ if (!isset($config['system']['webgui']['noantilockout']) &&
+ (((count($config['interfaces']) > 1) && ($if == 'lan')) ||
+ ((count($config['interfaces']) == 1) && ($if == 'wan')))):
+
+ $alports = implode('<br />', filter_get_antilockout_ports(true));
+ ?>
+ <tr valign="top" id="antilockout">
+ <td class="list">&nbsp;</td>
+ <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11" border="0" alt="pass" /></td>
+ <td class="listlr" style="background-color: #E0E0E0">&nbsp;</td>
+ <?php
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tr_antilockout");
+ ?>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0"><?=$iflist[$if];?> Address</td>
+ <td class="listr" style="background-color: #E0E0E0"><?= $alports ?></td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">&nbsp;</td>
+ <td class="listbg"><?=gettext("Anti-Lockout Rule");?></td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move rules before">
+ <tr>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule");?>" alt="move" /></td>
+ <td><a href="system_advanced_admin.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule");?>" width="17" height="17" border="0" alt="edit" /></a></td>
+ </tr>
+ <tr>
+ <td align="center" valign="middle"></td>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0" alt="add" /></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php endif; ?>
+
+<?php if (isset($config['interfaces'][$if]['blockpriv'])): ?>
+ <tr valign="top" id="frrfc1918">
+ <td class="list">&nbsp;</td>
+ <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" border="0" alt="block" /></td>
+ <td class="listlr" style="background-color: #E0E0E0">&nbsp;</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0"><?=gettext("RFC 1918 networks");?></td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">&nbsp;</td>
+ <td class="listbg"><?=gettext("Block private networks");?></td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move rules before">
+ <tr>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule");?>" alt="edit" /></td>
+ <td><a href="interfaces.php?if=<?=htmlspecialchars($if)?>#rfc1918"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule");?>" width="17" height="17" border="0" alt="edit" /></a></td>
+ </tr>
+ <tr>
+ <td align="center" valign="middle"></td>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0" alt="add" /></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php endif; ?>
+<?php if (isset($config['interfaces'][$if]['blockbogons'])): ?>
+ <tr valign="top" id="frrfc1918">
+ <td class="list">&nbsp;</td>
+ <td class="listt" align="center"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" border="0" alt="block" /></td>
+ <td class="listlr" style="background-color: #E0E0E0">&nbsp;</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0"><?=gettext("Reserved/not assigned by IANA");?></td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listr" style="background-color: #E0E0E0">*</td>
+ <td class="listbg"><?=gettext("Block bogon networks");?></td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move rules before">
+ <tr>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules before this rule");?>" alt="move" /></td>
+ <td><a href="interfaces.php?if=<?=htmlspecialchars($if)?>#rfc1918"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule");?>" width="17" height="17" border="0" alt=" edit" /></a></td>
+ </tr>
+ <tr>
+ <td align="center" valign="middle"></td>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus_d.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0" alt="add" /></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php endif; ?>
+ <tbody>
+<?php
+ $nrules = 0;
+ for ($i = 0; isset($a_filter[$i]); $i++):
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/row_start");
+ $filterent = $a_filter[$i];
+ if ($filterent['interface'] != $if && !isset($filterent['floating'])) {
+ continue;
+ }
+ if (isset($filterent['floating']) && "FloatingRules" != $if) {
+ continue;
+ }
+ $isadvset = firewall_check_for_advanced_options($filterent);
+ if ($isadvset) {
+ $advanced_set = "<img src=\"./themes/{$g['theme']}/images/icons/icon_advanced.gif\" title=\"" . gettext("advanced settings set") . ": {$isadvset}\" border=\"0\" alt=\"advanced\" />";
+ } else {
+ $advanced_set = "";
+ }
+?>
+ <tr valign="top" id="fr<?=$nrules;?>">
+ <td class="listt">
+ <input type="checkbox" id="frc<?=$nrules;?>" name="rule[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$nrules;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
+ <?php echo $advanced_set; ?>
+ </td>
+ <td class="listt" align="center">
+ <?php
+ if ($filterent['type'] == "block") {
+ $iconfn = "block";
+ } else if ($filterent['type'] == "reject") {
+ $iconfn = "reject";
+ } else if ($filterent['type'] == "match") {
+ $iconfn = "match";
+ } else {
+ $iconfn = "pass";
+ }
+ if (isset($filterent['disabled'])) {
+ $textss = "<span class=\"gray\">";
+ $textse = "</span>";
+ $iconfn .= "_d";
+ } else {
+ $textss = $textse = "";
+ }
+ ?>
+ <a href="?if=<?=htmlspecialchars($if);?>&amp;act=toggle&amp;id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0" title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" /></a>
+<?php
+ if (isset($filterent['log'])):
+ $iconfnlog = "log_s";
+ if (isset($filterent['disabled'])) {
+ $iconfnlog .= "_d";
+ }
+?>
+ <br /><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfnlog;?>.gif" width="11" height="15" border="0" alt="icon" />
+<?php endif; ?>
+ </td>
+ <?php
+
+ //build Alias popup box
+ $alias_src_span_begin = "";
+ $alias_src_port_span_begin = "";
+ $alias_dst_span_begin = "";
+ $alias_dst_port_span_begin = "";
+
+ $alias_popup = rule_popup($filterent['source']['address'], pprint_port($filterent['source']['port']), $filterent['destination']['address'], pprint_port($filterent['destination']['port']));
+
+ $alias_src_span_begin = $alias_popup["src"];
+ $alias_src_port_span_begin = $alias_popup["srcport"];
+ $alias_dst_span_begin = $alias_popup["dst"];
+ $alias_dst_port_span_begin = $alias_popup["dstport"];
+
+ $alias_src_span_end = $alias_popup["src_end"];
+ $alias_src_port_span_end = $alias_popup["srcport_end"];
+ $alias_dst_span_end = $alias_popup["dst_end"];
+ $alias_dst_port_span_end = $alias_popup["dstport_end"];
+
+ //build Schedule popup box
+ $a_schedules = &$config['schedules']['schedule'];
+ $schedule_span_begin = "";
+ $schedule_span_end = "";
+ $sched_caption_escaped = "";
+ $sched_content = "";
+ $schedstatus = false;
+ $dayArray = array (gettext('Mon'), gettext('Tues'), gettext('Wed'), gettext('Thur'), gettext('Fri'), gettext('Sat'), gettext('Sun'));
+ $monthArray = array (gettext('January'), gettext('February'), gettext('March'), gettext('April'), gettext('May'), gettext('June'), gettext('July'), gettext('August'), gettext('September'), gettext('October'), gettext('November'), gettext('December'));
+ if ($config['schedules']['schedule'] <> "" and is_array($config['schedules']['schedule'])) {
+ foreach ($a_schedules as $schedule) {
+ if ($schedule['name'] == $filterent['sched']) {
+ $schedstatus = filter_get_time_based_rule_status($schedule);
+
+ foreach ($schedule['timerange'] as $timerange) {
+ $tempFriendlyTime = "";
+ $tempID = "";
+ $firstprint = false;
+ if ($timerange) {
+ $dayFriendly = "";
+ $tempFriendlyTime = "";
+
+ //get hours
+ $temptimerange = $timerange['hour'];
+ $temptimeseparator = strrpos($temptimerange, "-");
+
+ $starttime = substr ($temptimerange, 0, $temptimeseparator);
+ $stoptime = substr ($temptimerange, $temptimeseparator+1);
+
+ if ($timerange['month']) {
+ $tempmontharray = explode(",", $timerange['month']);
+ $tempdayarray = explode(",", $timerange['day']);
+ $arraycounter = 0;
+ $firstDayFound = false;
+ $firstPrint = false;
+ foreach ($tempmontharray as $monthtmp) {
+ $month = $tempmontharray[$arraycounter];
+ $day = $tempdayarray[$arraycounter];
+
+ if (!$firstDayFound) {
+ $firstDay = $day;
+ $firstmonth = $month;
+ $firstDayFound = true;
+ }
+
+ $currentDay = $day;
+ $nextDay = $tempdayarray[$arraycounter+1];
+ $currentDay++;
+ if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])) {
+ if ($firstPrint) {
+ $dayFriendly .= ", ";
+ }
+ $currentDay--;
+ if ($currentDay != $firstDay) {
+ $dayFriendly .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
+ } else {
+ $dayFriendly .= $monthArray[$month-1] . " " . $day;
+ }
+ $firstDayFound = false;
+ $firstPrint = true;
+ }
+ $arraycounter++;
+ }
+ } else {
+ $tempdayFriendly = $timerange['position'];
+ $firstDayFound = false;
+ $tempFriendlyDayArray = explode(",", $tempdayFriendly);
+ $currentDay = "";
+ $firstDay = "";
+ $nextDay = "";
+ $counter = 0;
+ foreach ($tempFriendlyDayArray as $day) {
+ if ($day != "") {
+ if (!$firstDayFound) {
+ $firstDay = $tempFriendlyDayArray[$counter];
+ $firstDayFound = true;
+ }
+ $currentDay =$tempFriendlyDayArray[$counter];
+ //get next day
+ $nextDay = $tempFriendlyDayArray[$counter+1];
+ $currentDay++;
+ if ($currentDay != $nextDay) {
+ if ($firstprint) {
+ $dayFriendly .= ", ";
+ }
+ $currentDay--;
+ if ($currentDay != $firstDay) {
+ $dayFriendly .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
+ } else {
+ $dayFriendly .= $dayArray[$firstDay-1];
+ }
+ $firstDayFound = false;
+ $firstprint = true;
+ }
+ $counter++;
+ }
+ }
+ }
+ $timeFriendly = $starttime . " - " . $stoptime;
+ $description = $timerange['rangedescr'];
+ $sched_content .= $dayFriendly . "; " . $timeFriendly . "<br />";
+ }
+ }
+ $sched_caption_escaped = str_replace("'", "\'", $schedule['descr']);
+ $schedule_span_begin = "<span style=\"cursor: help;\" onmouseover=\"domTT_activate(this, event, 'content', '<h1>{$sched_caption_escaped}</h1><p>{$sched_content}</p>', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\" onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\"><u>";
+ $schedule_span_end = "</u></span>";
+ }
+ }
+ }
+ $printicon = false;
+ $alttext = "";
+ $image = "";
+ if (!isset($filterent['disabled'])) {
+ if ($schedstatus) {
+ if ($iconfn == "block" || $iconfn == "reject") {
+ $image = "icon_block";
+ $alttext = gettext("Traffic matching this rule is currently being denied");
+ } else {
+ $image = "icon_pass";
+ $alttext = gettext("Traffic matching this rule is currently being allowed");
+ }
+ $printicon = true;
+ } else if ($filterent['sched']) {
+ if ($iconfn == "block" || $iconfn == "reject") {
+ $image = "icon_block_d";
+ } else {
+ $image = "icon_block";
+ }
+ $alttext = gettext("This rule is not currently active because its period has expired");
+ $printicon = true;
+ }
+ }
+ ?>
+ <td class="listlr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?><?php if (isset($filterent['id'])) echo $filterent['id']."&nbsp;"; else echo "&nbsp;"; ?><?=$textse;?>
+ </td>
+ <?php
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tr");
+ ?>
+ <?php
+ if ('FloatingRules' == $if) {
+ ?>
+ <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?>
+ <?php
+ if (isset($filterent['interface'])) {
+ $selected_interfaces = explode(',', $filterent['interface']);
+ unset($selected_descs);
+ foreach ($selected_interfaces as $interface) {
+ if (isset($ifdescs[$interface])) {
+ $selected_descs[] = $ifdescs[$interface];
+ } else {
+ switch ($interface) {
+ case 'l2tp':
+ if ($config['l2tp']['mode'] == 'server') {
+ $selected_descs[] = 'L2TP VPN';
+ }
+ break;
+ case 'pptp':
+ if ($config['pptpd']['mode'] == 'server') {
+ $selected_descs[] = 'PPTP VPN';
+ }
+ break;
+ case 'pppoe':
+ if (is_pppoe_server_enabled()) {
+ $selected_descs[] = 'PPPoE Server';
+ }
+ break;
+ case 'enc0':
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ $selected_descs[] = 'IPsec';
+ }
+ break;
+ case 'openvpn':
+ if ($config['openvpn']['openvpn-server'] || $config['openvpn']['openvpn-client']) {
+ $selected_descs[] = 'OpenVPN';
+ }
+ break;
+ default:
+ $selected_descs[] = $interface;
+ break;
+ }
+ }
+ }
+
+ echo implode('<br/>', $selected_descs);
+ }
+ ?>
+ <?=$textse;?>
+ </td>
+ <?php
+ }
+ ?>
+ <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?>
+ <?php
+ if (isset($filterent['ipprotocol'])) {
+ switch ($filterent['ipprotocol']) {
+ case "inet":
+ echo "IPv4 ";
+ break;
+ case "inet6":
+ echo "IPv6 ";
+ break;
+ case "inet46":
+ echo "IPv4+6 ";
+ break;
+ }
+ } else {
+ echo "IPv4 ";
+ }
+ if (isset($filterent['protocol'])) {
+ echo strtoupper($filterent['protocol']);
+ if (strtoupper($filterent['protocol']) == "ICMP" && !empty($filterent['icmptype'])) {
+ echo ' <span style="cursor: help;" title="ICMP type: ' .
+ ($filterent['ipprotocol'] == "inet6" ? $icmp6types[$filterent['icmptype']] : $icmptypes[$filterent['icmptype']]) .
+ '"><u>';
+ echo $filterent['icmptype'];
+ echo '</u></span>';
+ }
+ } else {
+ echo "*";
+ }
+ ?>
+ <?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?><?php echo $alias_src_span_begin;?><?php echo htmlspecialchars(pprint_address($filterent['source']));?><?php echo $alias_src_span_end;?><?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?><?php echo $alias_src_port_span_begin;?><?php echo htmlspecialchars(pprint_port($filterent['source']['port'])); ?><?php echo $alias_src_port_span_end;?><?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?><?php echo $alias_dst_span_begin;?><?php echo htmlspecialchars(pprint_address($filterent['destination'])); ?><?php echo $alias_dst_span_end;?><?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?><?php echo $alias_dst_port_span_begin;?><?php echo htmlspecialchars(pprint_port($filterent['destination']['port'])); ?><?php echo $alias_dst_port_span_end;?><?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?><?php if (isset($config['interfaces'][$filterent['gateway']]['descr'])) echo htmlspecialchars($config['interfaces'][$filterent['gateway']]['descr']); else echo htmlspecialchars(pprint_port($filterent['gateway'])); ?><?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?>
+ <?php
+ if (isset($filterent['ackqueue']) && isset($filterent['defaultqueue'])) {
+ $desc = $filterent['ackqueue'] ;
+ echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['ackqueue']}&amp;action=show\">{$desc}</a>";
+ $desc = $filterent['defaultqueue'];
+ echo "/<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&amp;action=show\">{$desc}</a>";
+ } else if (isset($filterent['defaultqueue'])) {
+ $desc = $filterent['defaultqueue'];
+ echo "<a href=\"firewall_shaper_queues.php?queue={$filterent['defaultqueue']}&amp;action=show\">{$desc}</a>";
+ } else {
+ echo gettext("none");
+ }
+ ?>
+ <?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$nrules;?>)" id="frd<?=$nrules;?>" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <font color="black">
+ <?php if ($printicon) { ?><img src="./themes/<?= $g['theme']; ?>/images/icons/<?php echo $image; ?>.gif" title="<?php echo $alttext;?>" border="0" alt="icon" /><?php } ?><?=$textss;?><?php echo $schedule_span_begin;?><?=htmlspecialchars($filterent['sched']);?>&nbsp;<?php echo $schedule_span_end; ?><?=$textse;?>
+ </font>
+ </td>
+ <?php
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_descr_tr");
+ ?>
+ <td class="listbg descr" onclick="fr_toggle(<?=$nrules;?>)" ondblclick="document.location='firewall_rules_edit.php?id=<?=$i;?>';">
+ <?=$textss;?><?=htmlspecialchars($filterent['descr']);?>&nbsp;<?=$textse;?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move before">
+ <tr>
+ <td><input name="move_<?=$i;?>" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17" title="<?=gettext("move selected rules before this rule"); ?>" onmouseover="fr_insline(<?=$nrules;?>, true)" onmouseout="fr_insline(<?=$nrules;?>, false)" /></td>
+ <td><a href="firewall_rules_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit rule"); ?>" width="17" height="17" border="0" alt="edit" /></a></td>
+ </tr>
+ <tr>
+ <td align="center" valign="middle"><a href="firewall_rules.php?act=del&amp;if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule"); ?>" onclick="return confirm('Do you really want to delete this rule?')" alt="delete" /></a></td>
+ <td><a href="firewall_rules_edit.php?dup=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new rule based on this one"); ?>" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php $nrules++; endfor; ?>
+ <tr><td></td></tr>
+ </tbody>
+<?php if ($nrules == 0): ?>
+ <tr>
+ <td class="listt"></td>
+ <td class="listt"></td>
+ <?php
+ if ($_REQUEST['if'] == "FloatingRules") {
+ $ncolumns = "11";
+ } else {
+ $ncolumns = "10";
+ }
+ ?>
+ <td class="listlr" colspan=<?=$ncolumns;?> align="center" valign="middle">
+ <span class="gray">
+ <?php if ($_REQUEST['if'] == "FloatingRules"): ?>
+ <?=gettext("No floating rules are currently defined."); ?><br /><br />
+ <?php else: ?>
+ <?=gettext("No rules are currently defined for this interface"); ?><br />
+ <?=gettext("All incoming connections on this interface will be blocked until you add pass rules."); ?><br /><br />
+ <?php endif; ?>
+ <?=gettext("Click the"); ?> <a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add new rule");?>" border="0" width="17" height="17" align="middle" alt="add" /></a><?=gettext(" button to add a new rule.");?></span>
+ </td>
+ </tr>
+<?php endif; ?>
+ <tr id="fr<?=$nrules;?>">
+ <td class="list"></td>
+ <td class="list"></td>
+ <?php
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_id_tr_belowtable");
+ ?>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move rules">
+ <tr>
+ <td>
+ <?php if ($nrules == 0): ?><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected rules to end");?>" border="0" alt="move" /><?php else: ?><input name="move_<?=$i;?>" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17" title="<?=gettext("move selected rules to end");?>" onmouseover="fr_insline(<?=$nrules;?>, true)" onmouseout="fr_insline(<?=$nrules;?>, false)" /><?php endif; ?>
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+<?php if ($nrules == 0): ?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected rules");?>" border="0" alt="delete" /><?php else: ?>
+ <input name="del" type="image" src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected rules");?>" onclick="return confirm('<?=gettext('Do you really want to delete the selected rules?');?>')" />
+<?php endif; ?>
+ </td>
+ <td>
+ <a href="firewall_rules_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add new rule");?>" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="icons">
+ <tr>
+ <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass.gif" width="11" height="11" alt="pass" /></td>
+ <td width="100"><?=gettext("pass");?></td>
+ <td width="14"></td>
+ <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_match.gif" width="11" height="11" alt="match" /></td>
+ <td width="100"><?=gettext("match");?></td>
+ <td width="14"></td>
+ <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" width="11" height="11" alt="block" /></td>
+ <td width="100"><?=gettext("block");?></td>
+ <td width="14"></td>
+ <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject.gif" width="11" height="11" alt="reject" /></td>
+ <td width="100"><?=gettext("reject");?></td>
+ <td width="14"></td>
+ <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_log.gif" width="11" height="11" alt="log" /></td>
+ <td width="100"><?=gettext("log");?></td>
+ </tr>
+ <tr>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_pass_d.gif" width="11" height="11" alt="pass disabled" /></td>
+ <td class="nowrap"><?=gettext("pass (disabled)");?></td>
+ <td>&nbsp;</td>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_match_d.gif" width="11" height="11" alt="match disabled" /></td>
+ <td class="nowrap"><?=gettext("match (disabled)");?></td>
+ <td>&nbsp;</td>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block_d.gif" width="11" height="11" alt="block disabled" /></td>
+ <td class="nowrap"><?=gettext("block (disabled)");?></td>
+ <td>&nbsp;</td>
+ <td><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject_d.gif" width="11" height="11" alt="reject disabled" /></td>
+ <td class="nowrap"><?=gettext("reject (disabled)");?></td>
+ <td>&nbsp;</td>
+ <td width="16"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_log_d.gif" width="11" height="11" alt="log disabled" /></td>
+ <td class="nowrap"><?=gettext("log (disabled)");?></td>
+ </tr>
+ <tr>
+ <td colspan="10">
+ <p>&nbsp;</p>
+ <strong>
+ <span class="red"><?=gettext("Hint:");?></span>
+ </strong><br />
+ <ul>
+ <?php if ("FloatingRules" != $if): ?>
+ <li><?=gettext("Rules are evaluated on a first-match basis (i.e. " .
+ "the action of the first rule to match a packet will be executed). " .
+ "This means that if you use block rules, you'll have to pay attention " .
+ "to the rule order. Everything that isn't explicitly passed is blocked " .
+ "by default. ");?>
+ </li>
+ <?php else: ?>
+ <li><?=gettext("Floating rules are evaluated on a first-match basis (i.e. " .
+ "the action of the first rule to match a packet will be executed) only " .
+ "if the 'quick' option is checked on a rule. Otherwise they will only apply if no " .
+ "other rules match. Pay close attention to the rule order and options " .
+ "chosen. If no rule here matches, the per-interface or default rules are used. ");?>
+ </li>
+ <?php endif; ?>
+ </ul>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td></tr>
+</table>
+<input type="hidden" name="if" value="<?=htmlspecialchars($if);?>" />
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_rules_edit.php b/src/usr/local/www/firewall_rules_edit.php
new file mode 100644
index 0000000..b0af4cc
--- /dev/null
+++ b/src/usr/local/www/firewall_rules_edit.php
@@ -0,0 +1,1946 @@
+<?php
+/* $Id$ */
+/*
+ firewall_rules_edit.php
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-rules-edit
+##|*NAME=Firewall: Rules: Edit page
+##|*DESCR=Allow access to the 'Firewall: Rules: Edit' page.
+##|*MATCH=firewall_rules_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter.inc");
+require("shaper.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_rules.php');
+}
+
+function is_posnumericint($arg) {
+ // Note that to be safe we do not allow any leading zero - "01", "007"
+ return (is_numericint($arg) && $arg[0] != '0' && $arg > 0);
+}
+
+function is_aoadv_used($rule_config) {
+ // Note that the user could set "tag" or "tagged" to the string "0", which is valid but empty().
+ // And if the user enters "0" in other fields, we want to present an error message, and keep the Advanced Options section open.
+ if ((isset($rule_config['allowopts'])) ||
+ (isset($rule_config['disablereplyto'])) ||
+ ($rule_config['tag'] != "") ||
+ ($rule_config['tagged'] != "") ||
+ ($rule_config['max'] != "") ||
+ ($rule_config['max-src-nodes'] != "") ||
+ ($rule_config['max-src-conn'] != "") ||
+ ($rule_config['max-src-states'] != "") ||
+ ($rule_config['max-src-conn-rate'] != "") ||
+ ($rule_config['max-src-conn-rates'] != "") ||
+ ($rule_config['statetimeout'] != "")) {
+ return true;
+ }
+ return false;
+}
+
+$ostypes = array();
+exec('/sbin/pfctl -s osfp | /usr/bin/tr \'\t\' \' \'', $ostypes);
+
+if (count($ostypes) > 2) {
+ // Remove header rows from pfctl output
+ array_shift($ostypes);
+ array_shift($ostypes);
+} else {
+ // Fall back to a default list
+ $ostypes = array(
+ "AIX",
+ "Linux",
+ "FreeBSD",
+ "NetBSD",
+ "OpenBSD",
+ "Solaris",
+ "MacOS",
+ "Windows",
+ "Novell",
+ "NMAP"
+ );
+}
+
+$specialsrcdst = explode(" ", "any (self) pptp pppoe l2tp openvpn");
+$ifdisp = get_configured_interface_with_descr();
+foreach ($ifdisp as $kif => $kdescr) {
+ $specialsrcdst[] = "{$kif}";
+ $specialsrcdst[] = "{$kif}ip";
+}
+
+if (!is_array($config['filter']['rule'])) {
+ $config['filter']['rule'] = array();
+}
+filter_rules_sort();
+$a_filter = &$config['filter']['rule'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (is_numericint($_GET['after']) || $_GET['after'] == "-1") {
+ $after = $_GET['after'];
+}
+if (isset($_POST['after']) && (is_numericint($_POST['after']) || $_POST['after'] == "-1")) {
+ $after = $_POST['after'];
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ $id = $_GET['dup'];
+ $after = $_GET['dup'];
+}
+
+if (isset($id) && $a_filter[$id]) {
+ $pconfig['interface'] = $a_filter[$id]['interface'];
+
+ if (isset($a_filter[$id]['id'])) {
+ $pconfig['ruleid'] = $a_filter[$id]['id'];
+ }
+
+ if (isset($a_filter[$id]['created']) && is_array($a_filter[$id]['created'])) {
+ $pconfig['created'] = $a_filter[$id]['created'];
+ }
+
+ if (isset($a_filter[$id]['updated']) && is_array($a_filter[$id]['updated'])) {
+ $pconfig['updated'] = $a_filter[$id]['updated'];
+ }
+
+ if (!isset($a_filter[$id]['type'])) {
+ $pconfig['type'] = "pass";
+ } else {
+ $pconfig['type'] = $a_filter[$id]['type'];
+ }
+
+ if (isset($a_filter[$id]['floating']) || $if == "FloatingRules") {
+ $pconfig['floating'] = $a_filter[$id]['floating'];
+ if (isset($a_filter[$id]['interface']) && $a_filter[$id]['interface'] <> "") {
+ $pconfig['interface'] = $a_filter[$id]['interface'];
+ }
+ }
+
+ if (isset($a_filter['floating'])) {
+ $pconfig['floating'] = "yes";
+ }
+
+ if (isset($a_filter[$id]['direction'])) {
+ $pconfig['direction'] = $a_filter[$id]['direction'];
+ }
+
+ if (isset($a_filter[$id]['ipprotocol'])) {
+ $pconfig['ipprotocol'] = $a_filter[$id]['ipprotocol'];
+ }
+
+ if (isset($a_filter[$id]['protocol'])) {
+ $pconfig['proto'] = $a_filter[$id]['protocol'];
+ } else {
+ $pconfig['proto'] = "any";
+ }
+
+ if ($a_filter[$id]['protocol'] == "icmp") {
+ $pconfig['icmptype'] = $a_filter[$id]['icmptype'];
+ }
+
+ address_to_pconfig($a_filter[$id]['source'], $pconfig['src'],
+ $pconfig['srcmask'], $pconfig['srcnot'],
+ $pconfig['srcbeginport'], $pconfig['srcendport']);
+
+ if ($a_filter[$id]['os'] <> "") {
+ $pconfig['os'] = $a_filter[$id]['os'];
+ }
+
+ address_to_pconfig($a_filter[$id]['destination'], $pconfig['dst'],
+ $pconfig['dstmask'], $pconfig['dstnot'],
+ $pconfig['dstbeginport'], $pconfig['dstendport']);
+
+ if ($a_filter[$id]['dscp'] <> "") {
+ $pconfig['dscp'] = $a_filter[$id]['dscp'];
+ }
+
+ $pconfig['disabled'] = isset($a_filter[$id]['disabled']);
+ $pconfig['log'] = isset($a_filter[$id]['log']);
+ $pconfig['descr'] = $a_filter[$id]['descr'];
+
+ if (isset($a_filter[$id]['tcpflags_any'])) {
+ $pconfig['tcpflags_any'] = true;
+ } else {
+ if (isset($a_filter[$id]['tcpflags1']) && $a_filter[$id]['tcpflags1'] <> "") {
+ $pconfig['tcpflags1'] = $a_filter[$id]['tcpflags1'];
+ }
+ if (isset($a_filter[$id]['tcpflags2']) && $a_filter[$id]['tcpflags2'] <> "") {
+ $pconfig['tcpflags2'] = $a_filter[$id]['tcpflags2'];
+ }
+ }
+
+ if (isset($a_filter[$id]['tag']) && $a_filter[$id]['tag'] <> "") {
+ $pconfig['tag'] = $a_filter[$id]['tag'];
+ }
+ if (isset($a_filter[$id]['tagged']) && $a_filter[$id]['tagged'] <> "") {
+ $pconfig['tagged'] = $a_filter[$id]['tagged'];
+ }
+ if (isset($a_filter[$id]['quick']) && $a_filter[$id]['quick']) {
+ $pconfig['quick'] = $a_filter[$id]['quick'];
+ }
+ if (isset($a_filter[$id]['allowopts'])) {
+ $pconfig['allowopts'] = true;
+ }
+ if (isset($a_filter[$id]['disablereplyto'])) {
+ $pconfig['disablereplyto'] = true;
+ }
+
+ /* advanced */
+ $pconfig['max'] = $a_filter[$id]['max'];
+ $pconfig['max-src-nodes'] = $a_filter[$id]['max-src-nodes'];
+ $pconfig['max-src-conn'] = $a_filter[$id]['max-src-conn'];
+ $pconfig['max-src-states'] = $a_filter[$id]['max-src-states'];
+ $pconfig['statetype'] = $a_filter[$id]['statetype'];
+ $pconfig['statetimeout'] = $a_filter[$id]['statetimeout'];
+ $pconfig['nopfsync'] = isset($a_filter[$id]['nopfsync']);
+
+ /* advanced - nosync */
+ $pconfig['nosync'] = isset($a_filter[$id]['nosync']);
+
+ /* advanced - new connection per second banning*/
+ $pconfig['max-src-conn-rate'] = $a_filter[$id]['max-src-conn-rate'];
+ $pconfig['max-src-conn-rates'] = $a_filter[$id]['max-src-conn-rates'];
+
+ /* Multi-WAN next-hop support */
+ $pconfig['gateway'] = $a_filter[$id]['gateway'];
+
+ /* Shaper support */
+ $pconfig['defaultqueue'] = (($a_filter[$id]['ackqueue'] == "none") ? '' : $a_filter[$id]['defaultqueue']);
+ $pconfig['ackqueue'] = (($a_filter[$id]['ackqueue'] == "none") ? '' : $a_filter[$id]['ackqueue']);
+ $pconfig['dnpipe'] = (($a_filter[$id]['dnpipe'] == "none") ? '' : $a_filter[$id]['dnpipe']);
+ $pconfig['pdnpipe'] = (($a_filter[$id]['pdnpipe'] == "none") ? '' : $a_filter[$id]['pdnpipe']);
+ $pconfig['l7container'] = (($a_filter[$id]['l7container'] == "none") ? '' : $a_filter[$id]['l7container']);
+
+ //schedule support
+ $pconfig['sched'] = (($a_filter[$id]['sched'] == "none") ? '' : $a_filter[$id]['sched']);
+ $pconfig['vlanprio'] = (($a_filter[$id]['vlanprio'] == "none") ? '' : $a_filter[$id]['vlanprio']);
+ $pconfig['vlanprioset'] = (($a_filter[$id]['vlanprioset'] == "none") ? '' : $a_filter[$id]['vlanprioset']);
+ if (!isset($_GET['dup']) || !is_numericint($_GET['dup'])) {
+ $pconfig['associated-rule-id'] = $a_filter[$id]['associated-rule-id'];
+ }
+
+ $pconfig['tracker'] = $a_filter[$id]['tracker'];
+
+} else {
+ /* defaults */
+ if ($_GET['if']) {
+ $pconfig['interface'] = $_GET['if'];
+ }
+ $pconfig['type'] = "pass";
+ $pconfig['src'] = "any";
+ $pconfig['dst'] = "any";
+}
+/* Allow the FloatingRules to work */
+$if = $pconfig['interface'];
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ unset($id);
+}
+
+read_altq_config(); /* XXX: */
+$qlist =& get_unique_queue_list();
+read_dummynet_config(); /* XXX: */
+$dnqlist =& get_unique_dnqueue_list();
+read_layer7_config();
+$l7clist =& get_l7_unique_list();
+$a_gatewaygroups = return_gateway_groups_array();
+
+if ($_POST) {
+ unset($input_errors);
+
+ if (isset($a_filter[$id]['associated-rule-id'])) {
+ $_POST['proto'] = $pconfig['proto'];
+ if ($pconfig['proto'] == "icmp") {
+ $_POST['icmptype'] = $pconfig['icmptype'];
+ }
+ }
+
+ if (($_POST['ipprotocol'] <> "") && ($_POST['gateway'] <> "")) {
+ if (is_array($config['gateways']['gateway_group'])) {
+ foreach ($config['gateways']['gateway_group'] as $gw_group) {
+ if ($gw_group['name'] == $_POST['gateway']) {
+ $family = $a_gatewaygroups[$_POST['gateway']]['ipprotocol'];
+ if ($_POST['ipprotocol'] == $family) {
+ continue;
+ }
+ if (($_POST['ipprotocol'] == "inet46") && ($_POST['ipprotocol'] != $family)) {
+ $input_errors[] = gettext("You can not assign a gateway to a rule that applies to IPv4 and IPv6");
+ }
+ if (($_POST['ipprotocol'] == "inet6") && ($_POST['ipprotocol'] != $family)) {
+ $input_errors[] = gettext("You can not assign an IPv4 gateway group on IPv6 Address Family rule");
+ }
+ if (($_POST['ipprotocol'] == "inet") && ($_POST['ipprotocol'] != $family)) {
+ $input_errors[] = gettext("You can not assign an IPv6 gateway group on IPv4 Address Family rule");
+ }
+ }
+ }
+ }
+ }
+ if (($_POST['ipprotocol'] <> "") && ($_POST['gateway'] <> "") && (is_ipaddr(lookup_gateway_ip_by_name($_POST['gateway'])))) {
+ if (($_POST['ipprotocol'] == "inet46") && ($_POST['gateway'] <> "")) {
+ $input_errors[] = gettext("You can not assign a gateway to a rule that applies to IPv4 and IPv6");
+ }
+ if (($_POST['ipprotocol'] == "inet6") && (!is_ipaddrv6(lookup_gateway_ip_by_name($_POST['gateway'])))) {
+ $input_errors[] = gettext("You can not assign an IPv4 Gateway to an IPv6 Filter rule");
+ }
+ if (($_POST['ipprotocol'] == "inet") && (!is_ipaddrv4(lookup_gateway_ip_by_name($_POST['gateway'])))) {
+ $input_errors[] = gettext("You can not assign an IPv6 Gateway to an IPv4 Filter rule");
+ }
+ }
+ if (($_POST['proto'] == "icmp") && ($_POST['icmptype'] <> "")) {
+ if ($_POST['ipprotocol'] == "inet46") {
+ $input_errors[] = gettext("You can not assign a ICMP type to a rule that applies to IPv4 and IPv6");
+ }
+ }
+
+ if (($_POST['proto'] != "tcp") && ($_POST['proto'] != "udp") && ($_POST['proto'] != "tcp/udp")) {
+ $_POST['srcbeginport'] = 0;
+ $_POST['srcendport'] = 0;
+ $_POST['dstbeginport'] = 0;
+ $_POST['dstendport'] = 0;
+ } else {
+ if ($_POST['srcbeginport_cust'] && !$_POST['srcbeginport']) {
+ $_POST['srcbeginport'] = trim($_POST['srcbeginport_cust']);
+ }
+ if ($_POST['srcendport_cust'] && !$_POST['srcendport']) {
+ $_POST['srcendport'] = trim($_POST['srcendport_cust']);
+ }
+ if ($_POST['srcbeginport'] == "any") {
+ $_POST['srcbeginport'] = 0;
+ $_POST['srcendport'] = 0;
+ } else {
+ if (!$_POST['srcendport']) {
+ $_POST['srcendport'] = $_POST['srcbeginport'];
+ }
+ }
+ if ($_POST['srcendport'] == "any") {
+ $_POST['srcendport'] = $_POST['srcbeginport'];
+ }
+
+ if ($_POST['dstbeginport_cust'] && !$_POST['dstbeginport']) {
+ $_POST['dstbeginport'] = trim($_POST['dstbeginport_cust']);
+ }
+ if ($_POST['dstendport_cust'] && !$_POST['dstendport']) {
+ $_POST['dstendport'] = trim($_POST['dstendport_cust']);
+ }
+
+ if ($_POST['dstbeginport'] == "any") {
+ $_POST['dstbeginport'] = 0;
+ $_POST['dstendport'] = 0;
+ } else {
+ if (!$_POST['dstendport']) {
+ $_POST['dstendport'] = $_POST['dstbeginport'];
+ }
+ }
+ if ($_POST['dstendport'] == "any") {
+ $_POST['dstendport'] = $_POST['dstbeginport'];
+ }
+ }
+
+ if (is_specialnet($_POST['srctype'])) {
+ $_POST['src'] = $_POST['srctype'];
+ $_POST['srcmask'] = 0;
+ } else if ($_POST['srctype'] == "single") {
+ if (is_ipaddrv6($_POST['src'])) {
+ $_POST['srcmask'] = 128;
+ } else {
+ $_POST['srcmask'] = 32;
+ }
+ }
+ if (is_specialnet($_POST['dsttype'])) {
+ $_POST['dst'] = $_POST['dsttype'];
+ $_POST['dstmask'] = 0;
+ } else if ($_POST['dsttype'] == "single") {
+ if (is_ipaddrv6($_POST['dst'])) {
+ $_POST['dstmask'] = 128;
+ } else {
+ $_POST['dstmask'] = 32;
+ }
+ }
+
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "type proto");
+ if (isset($a_filter[$id]['associated-rule-id']) === false) {
+ $reqdfields[] = "src";
+ $reqdfields[] = "dst";
+ }
+ $reqdfieldsn = explode(",", "Type,Protocol");
+ if (isset($a_filter[$id]['associated-rule-id']) === false) {
+ $reqdfieldsn[] = "Source";
+ $reqdfieldsn[] = "Destination";
+ }
+
+ if ($_POST['statetype'] == "modulate state" or $_POST['statetype'] == "synproxy state") {
+ if ($_POST['proto'] != "tcp") {
+ $input_errors[] = sprintf(gettext("%s is only valid with protocol TCP."), $_POST['statetype']);
+ }
+ if (($_POST['statetype'] == "synproxy state") && ($_POST['gateway'] != "")) {
+ $input_errors[] = sprintf(gettext("%s is only valid if the gateway is set to 'default'."), $_POST['statetype']);
+ }
+ }
+
+ if (isset($a_filter[$id]['associated-rule-id']) === false &&
+ (!(is_specialnet($_POST['srctype']) || ($_POST['srctype'] == "single")))) {
+ $reqdfields[] = "srcmask";
+ $reqdfieldsn[] = "Source bit count";
+ }
+ if (isset($a_filter[$id]['associated-rule-id']) === false &&
+ (!(is_specialnet($_POST['dsttype']) || ($_POST['dsttype'] == "single")))) {
+ $reqdfields[] = "dstmask";
+ $reqdfieldsn[] = gettext("Destination bit count");
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!$_POST['srcbeginport']) {
+ $_POST['srcbeginport'] = 0;
+ $_POST['srcendport'] = 0;
+ }
+ if (!$_POST['dstbeginport']) {
+ $_POST['dstbeginport'] = 0;
+ $_POST['dstendport'] = 0;
+ }
+
+ if ($_POST['srcbeginport'] && !is_portoralias($_POST['srcbeginport'])) {
+ $input_errors[] = sprintf(gettext("%s is not a valid start source port. It must be a port alias or integer between 1 and 65535."), $_POST['srcbeginposrt']);
+ }
+ if ($_POST['srcendport'] && !is_portoralias($_POST['srcendport'])) {
+ $input_errors[] = sprintf(gettext("%s is not a valid end source port. It must be a port alias or integer between 1 and 65535."), $_POST['srcendport']);
+ }
+ if ($_POST['dstbeginport'] && !is_portoralias($_POST['dstbeginport'])) {
+ $input_errors[] = sprintf(gettext("%s is not a valid start destination port. It must be a port alias or integer between 1 and 65535."), $_POST['dstbeginport']);
+ }
+ if ($_POST['dstendport'] && !is_portoralias($_POST['dstendport'])) {
+ $input_errors[] = sprintf(gettext("%s is not a valid end destination port. It must be a port alias or integer between 1 and 65535."), $_POST['dstendport']);
+ }
+ if (!$_POST['srcbeginport_cust'] && $_POST['srcendport_cust']) {
+ if (is_alias($_POST['srcendport_cust'])) {
+ $input_errors[] = 'If you put port alias in Source port range to: field you must put the same port alias in from: field';
+ }
+ }
+ if ($_POST['srcbeginport_cust'] && $_POST['srcendport_cust']) {
+ if (is_alias($_POST['srcendport_cust']) && is_alias($_POST['srcendport_cust']) && $_POST['srcbeginport_cust'] != $_POST['srcendport_cust']) {
+ $input_errors[] = 'The same port alias must be used in Source port range from: and to: fields';
+ }
+ if ((is_alias($_POST['srcbeginport_cust']) && (!is_alias($_POST['srcendport_cust']) && $_POST['srcendport_cust'] != '')) ||
+ ((!is_alias($_POST['srcbeginport_cust']) && $_POST['srcbeginport_cust'] != '') && is_alias($_POST['srcendport_cust']))) {
+ $input_errors[] = 'You cannot specify numbers and port aliases at the same time in Source port range from: and to: field';
+ }
+ }
+ if (!$_POST['dstbeginport_cust'] && $_POST['dstendport_cust']) {
+ if (is_alias($_POST['dstendport_cust'])) {
+ $input_errors[] = 'If you put port alias in Destination port range to: field you must put the same port alias in from: field';
+ }
+ }
+ if ($_POST['dstbeginport_cust'] && $_POST['dstendport_cust']) {
+ if (is_alias($_POST['dstendport_cust']) && is_alias($_POST['dstendport_cust']) && $_POST['dstbeginport_cust'] != $_POST['dstendport_cust']) {
+ $input_errors[] = 'The same port alias must be used in Destination port range from: and to: fields';
+ }
+ if ((is_alias($_POST['dstbeginport_cust']) && (!is_alias($_POST['dstendport_cust']) && $_POST['dstendport_cust'] != '')) ||
+ ((!is_alias($_POST['dstbeginport_cust']) && $_POST['dstbeginport_cust'] != '') && is_alias($_POST['dstendport_cust']))) {
+ $input_errors[] = 'You cannot specify numbers and port aliases at the same time in Destination port range from: and to: field';
+ }
+ }
+
+ if ($_POST['src']) {
+ $_POST['src'] = trim($_POST['src']);
+ }
+ if ($_POST['dst']) {
+ $_POST['dst'] = trim($_POST['dst']);
+ }
+
+ /* if user enters an alias and selects "network" then disallow. */
+ if ($_POST['srctype'] == "network") {
+ if (is_alias($_POST['src'])) {
+ $input_errors[] = gettext("You must specify single host or alias for alias entries.");
+ }
+ }
+ if ($_POST['dsttype'] == "network") {
+ if (is_alias($_POST['dst'])) {
+ $input_errors[] = gettext("You must specify single host or alias for alias entries.");
+ }
+ }
+
+ if (!is_specialnet($_POST['srctype'])) {
+ if (($_POST['src'] && !is_ipaddroralias($_POST['src']))) {
+ $input_errors[] = sprintf(gettext("%s is not a valid source IP address or alias."), $_POST['src']);
+ }
+ if (($_POST['srcmask'] && !is_numericint($_POST['srcmask']))) {
+ $input_errors[] = gettext("A valid source bit count must be specified.");
+ }
+ }
+ if (!is_specialnet($_POST['dsttype'])) {
+ if (($_POST['dst'] && !is_ipaddroralias($_POST['dst']))) {
+ $input_errors[] = sprintf(gettext("%s is not a valid destination IP address or alias."), $_POST['dst']);
+ }
+ if (($_POST['dstmask'] && !is_numericint($_POST['dstmask']))) {
+ $input_errors[] = gettext("A valid destination bit count must be specified.");
+ }
+ }
+ if ((is_ipaddr($_POST['src']) && is_ipaddr($_POST['dst']))) {
+ if (!validate_address_family($_POST['src'], $_POST['dst'])) {
+ $input_errors[] = sprintf(gettext("The Source IP address %s Address Family differs from the destination %s."), $_POST['src'], $_POST['dst']);
+ }
+ if ((is_ipaddrv6($_POST['src']) || is_ipaddrv6($_POST['dst'])) && ($_POST['ipprotocol'] == "inet")) {
+ $input_errors[] = gettext("You can not use IPv6 addresses in IPv4 rules.");
+ }
+ if ((is_ipaddrv4($_POST['src']) || is_ipaddrv4($_POST['dst'])) && ($_POST['ipprotocol'] == "inet6")) {
+ $input_errors[] = gettext("You can not use IPv4 addresses in IPv6 rules.");
+ }
+ }
+
+ if ((is_ipaddr($_POST['src']) || is_ipaddr($_POST['dst'])) && ($_POST['ipprotocol'] == "inet46")) {
+ $input_errors[] = gettext("You can not use a IPv4 or IPv6 address in combined IPv4 + IPv6 rules.");
+ }
+
+ if ($_POST['srcbeginport'] > $_POST['srcendport']) {
+ /* swap */
+ $tmp = $_POST['srcendport'];
+ $_POST['srcendport'] = $_POST['srcbeginport'];
+ $_POST['srcbeginport'] = $tmp;
+ }
+ if ($_POST['dstbeginport'] > $_POST['dstendport']) {
+ /* swap */
+ $tmp = $_POST['dstendport'];
+ $_POST['dstendport'] = $_POST['dstbeginport'];
+ $_POST['dstbeginport'] = $tmp;
+ }
+ if ($_POST['os']) {
+ if ($_POST['proto'] != "tcp") {
+ $input_errors[] = gettext("OS detection is only valid with protocol TCP.");
+ }
+ if (!in_array($_POST['os'], $ostypes)) {
+ $input_errors[] = gettext("Invalid OS detection selection. Please select a valid OS.");
+ }
+ }
+
+ if ($_POST['ackqueue'] != "") {
+ if ($_POST['defaultqueue'] == "") {
+ $input_errors[] = gettext("You have to select a queue when you select an acknowledge queue too.");
+ } else if ($_POST['ackqueue'] == $_POST['defaultqueue']) {
+ $input_errors[] = gettext("Acknowledge queue and Queue cannot be the same.");
+ }
+ }
+ if (isset($_POST['floating']) && $_POST['pdnpipe'] != "" && (empty($_POST['direction']) || $_POST['direction'] == "any")) {
+ $input_errors[] = gettext("You can not use limiters in Floating rules without choosing a direction.");
+ }
+ if (isset($_POST['floating']) && $_POST['gateway'] != "" && (empty($_POST['direction']) || $_POST['direction'] == "any")) {
+ $input_errors[] = gettext("You can not use gateways in Floating rules without choosing a direction.");
+ }
+ if ($_POST['pdnpipe'] && $_POST['pdnpipe'] != "") {
+ if ($_POST['dnpipe'] == "") {
+ $input_errors[] = gettext("You must select a queue for the In direction before selecting one for Out too.");
+ } else if ($_POST['pdnpipe'] == $_POST['dnpipe']) {
+ $input_errors[] = gettext("In and Out Queue cannot be the same.");
+ } else if ($dnqlist[$_POST['pdnpipe']][0] == "?" && $dnqlist[$_POST['dnpipe']][0] <> "?") {
+ $input_errors[] = gettext("You cannot select one queue and one virtual interface for IN and Out. Both must be from the same type.");
+ } else if ($dnqlist[$_POST['dnpipe']][0] == "?" && $dnqlist[$_POST['pdnpipe']][0] <> "?") {
+ $input_errors[] = gettext("You cannot select one queue and one virtual interface for IN and Out. Both must be from the same type.");
+ }
+ if ($_POST['direction'] == "out" && empty($_POST['gateway'])) {
+ $input_errors[] = gettext("Please select a gateway, normally the interface selected gateway, so the limiters work correctly");
+ }
+ }
+ if (!empty($_POST['ruleid']) && !ctype_digit($_POST['ruleid'])) {
+ $input_errors[] = gettext('ID must be an integer');
+ }
+ if ($_POST['l7container'] && $_POST['l7container'] != "") {
+ if (!($_POST['proto'] == "tcp" || $_POST['proto'] == "udp" || $_POST['proto'] == "tcp/udp")) {
+ $input_errors[] = gettext("You can only select a layer7 container for TCP and/or UDP protocols");
+ }
+ if ($_POST['type'] <> "pass") {
+ $input_errors[] = gettext("You can only select a layer7 container for Pass type rules.");
+ }
+ }
+
+ if (!in_array($_POST['proto'], array("tcp", "tcp/udp"))) {
+ if (!empty($_POST['max-src-conn'])) {
+ $input_errors[] = gettext("You can only specify the maximum number of established connections per host (advanced option) for TCP protocol.");
+ }
+ if (!empty($_POST['max-src-conn-rate']) || !empty($_POST['max-src-conn-rates'])) {
+ $input_errors[] = gettext("You can only specify the maximum new connections per host / per second(s) (advanced option) for TCP protocol.");
+ }
+ if (!empty($_POST['statetimeout'])) {
+ $input_errors[] = gettext("You can only specify the state timeout (advanced option) for TCP protocol.");
+ }
+ }
+
+ if ($_POST['type'] <> "pass") {
+ if (!empty($_POST['max'])) {
+ $input_errors[] = gettext("You can only specify the maximum state entries (advanced option) for Pass type rules.");
+ }
+ if (!empty($_POST['max-src-nodes'])) {
+ $input_errors[] = gettext("You can only specify the maximum number of unique source hosts (advanced option) for Pass type rules.");
+ }
+ if (!empty($_POST['max-src-conn'])) {
+ $input_errors[] = gettext("You can only specify the maximum number of established connections per host (advanced option) for Pass type rules.");
+ }
+ if (!empty($_POST['max-src-states'])) {
+ $input_errors[] = gettext("You can only specify the maximum state entries per host (advanced option) for Pass type rules.");
+ }
+ if (!empty($_POST['max-src-conn-rate']) || !empty($_POST['max-src-conn-rates'])) {
+ $input_errors[] = gettext("You can only specify the maximum new connections per host / per second(s) (advanced option) for Pass type rules.");
+ }
+ if (!empty($_POST['statetimeout'])) {
+ $input_errors[] = gettext("You can only specify the state timeout (advanced option) for Pass type rules.");
+ }
+ }
+
+ if (($_POST['statetype'] == "none") && (empty($_POST['l7container']))) {
+ if (!empty($_POST['max'])) {
+ $input_errors[] = gettext("You cannot specify the maximum state entries (advanced option) if statetype is none and no L7 container is selected.");
+ }
+ if (!empty($_POST['max-src-nodes'])) {
+ $input_errors[] = gettext("You cannot specify the maximum number of unique source hosts (advanced option) if statetype is none and no L7 container is selected.");
+ }
+ if (!empty($_POST['max-src-conn'])) {
+ $input_errors[] = gettext("You cannot specify the maximum number of established connections per host (advanced option) if statetype is none and no L7 container is selected.");
+ }
+ if (!empty($_POST['max-src-states'])) {
+ $input_errors[] = gettext("You cannot specify the maximum state entries per host (advanced option) if statetype is none and no L7 container is selected.");
+ }
+ if (!empty($_POST['max-src-conn-rate']) || !empty($_POST['max-src-conn-rates'])) {
+ $input_errors[] = gettext("You cannot specify the maximum new connections per host / per second(s) (advanced option) if statetype is none and no L7 container is selected.");
+ }
+ if (!empty($_POST['statetimeout'])) {
+ $input_errors[] = gettext("You cannot specify the state timeout (advanced option) if statetype is none and no L7 container is selected.");
+ }
+ }
+
+ if (($_POST['max'] != "") && !is_posnumericint($_POST['max'])) {
+ $input_errors[] = gettext("Maximum state entries (advanced option) must be a positive integer");
+ }
+
+ if (($_POST['max-src-nodes'] != "") && !is_posnumericint($_POST['max-src-nodes'])) {
+ $input_errors[] = gettext("Maximum number of unique source hosts (advanced option) must be a positive integer");
+ }
+
+ if (($_POST['max-src-conn'] != "") && !is_posnumericint($_POST['max-src-conn'])) {
+ $input_errors[] = gettext("Maximum number of established connections per host (advanced option) must be a positive integer");
+ }
+
+ if (($_POST['max-src-states'] != "") && !is_posnumericint($_POST['max-src-states'])) {
+ $input_errors[] = gettext("Maximum state entries per host (advanced option) must be a positive integer");
+ }
+
+ if (($_POST['max-src-conn-rate'] != "") && !is_posnumericint($_POST['max-src-conn-rate'])) {
+ $input_errors[] = gettext("Maximum new connections per host / per second(s) (advanced option) must be a positive integer");
+ }
+
+ if (($_POST['statetimeout'] != "") && !is_posnumericint($_POST['statetimeout'])) {
+ $input_errors[] = gettext("State timeout (advanced option) must be a positive integer");
+ }
+
+ if ((($_POST['max-src-conn-rate'] <> "" and $_POST['max-src-conn-rates'] == "")) ||
+ (($_POST['max-src-conn-rate'] == "" and $_POST['max-src-conn-rates'] <> ""))) {
+ $input_errors[] = gettext("Both maximum new connections per host and the interval (per second(s)) must be specified");
+ }
+
+ if (!$_POST['tcpflags_any']) {
+ $settcpflags = array();
+ $outoftcpflags = array();
+ foreach ($tcpflags as $tcpflag) {
+ if ($_POST['tcpflags1_' . $tcpflag] == "on") {
+ $settcpflags[] = $tcpflag;
+ }
+ if ($_POST['tcpflags2_' . $tcpflag] == "on") {
+ $outoftcpflags[] = $tcpflag;
+ }
+ }
+ if (empty($outoftcpflags) && !empty($settcpflags)) {
+ $input_errors[] = gettext("If you specify TCP flags that should be set you should specify out of which flags as well.");
+ }
+ }
+
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/input_validation");
+
+ if (!$input_errors) {
+ $filterent = array();
+ $filterent['id'] = $_POST['ruleid']>0?$_POST['ruleid']:'';
+
+ $filterent['tracker'] = empty($_POST['tracker']) ? (int)microtime(true) : $_POST['tracker'];
+
+ $filterent['type'] = $_POST['type'];
+ if (isset($_POST['interface'])) {
+ $filterent['interface'] = $_POST['interface'];
+ }
+
+ if (isset($_POST['ipprotocol'])) {
+ $filterent['ipprotocol'] = $_POST['ipprotocol'];
+ }
+
+ if ($_POST['tcpflags_any']) {
+ $filterent['tcpflags_any'] = true;
+ } else {
+ $settcpflags = array();
+ $outoftcpflags = array();
+ foreach ($tcpflags as $tcpflag) {
+ if ($_POST['tcpflags1_' . $tcpflag] == "on") {
+ $settcpflags[] = $tcpflag;
+ }
+ if ($_POST['tcpflags2_' . $tcpflag] == "on") {
+ $outoftcpflags[] = $tcpflag;
+ }
+ }
+ if (!empty($outoftcpflags)) {
+ $filterent['tcpflags2'] = join(",", $outoftcpflags);
+ if (!empty($settcpflags)) {
+ $filterent['tcpflags1'] = join(",", $settcpflags);
+ }
+ }
+ }
+
+ if (isset($_POST['tag'])) {
+ $filterent['tag'] = $_POST['tag'];
+ }
+ if (isset($_POST['tagged'])) {
+ $filterent['tagged'] = $_POST['tagged'];
+ }
+ if ($if == "FloatingRules" || isset($_POST['floating'])) {
+ $filterent['direction'] = $_POST['direction'];
+ if (isset($_POST['quick']) && $_POST['quick'] <> "") {
+ $filterent['quick'] = $_POST['quick'];
+ }
+ $filterent['floating'] = "yes";
+ if (isset($_POST['interface']) && count($_POST['interface']) > 0) {
+ $filterent['interface'] = implode(",", $_POST['interface']);
+ }
+ }
+
+ /* Advanced options */
+ if ($_POST['allowopts'] == "yes") {
+ $filterent['allowopts'] = true;
+ } else {
+ unset($filterent['allowopts']);
+ }
+ if ($_POST['disablereplyto'] == "yes") {
+ $filterent['disablereplyto'] = true;
+ } else {
+ unset($filterent['disablereplyto']);
+ }
+ $filterent['max'] = $_POST['max'];
+ $filterent['max-src-nodes'] = $_POST['max-src-nodes'];
+ $filterent['max-src-conn'] = $_POST['max-src-conn'];
+ $filterent['max-src-states'] = $_POST['max-src-states'];
+ $filterent['statetimeout'] = $_POST['statetimeout'];
+ $filterent['statetype'] = $_POST['statetype'];
+ $filterent['os'] = $_POST['os'];
+ if ($_POST['nopfsync'] <> "") {
+ $filterent['nopfsync'] = true;
+ } else {
+ unset($filterent['nopfsync']);
+ }
+
+ /* Nosync directive - do not xmlrpc sync this item */
+ if ($_POST['nosync'] <> "") {
+ $filterent['nosync'] = true;
+ } else {
+ unset($filterent['nosync']);
+ }
+
+ /* unless both values are provided, unset the values - ticket #650 */
+ if ($_POST['max-src-conn-rate'] <> "" and $_POST['max-src-conn-rates'] <> "") {
+ $filterent['max-src-conn-rate'] = $_POST['max-src-conn-rate'];
+ $filterent['max-src-conn-rates'] = $_POST['max-src-conn-rates'];
+ } else {
+ unset($filterent['max-src-conn-rate']);
+ unset($filterent['max-src-conn-rates']);
+ }
+
+ if ($_POST['proto'] != "any") {
+ $filterent['protocol'] = $_POST['proto'];
+ } else {
+ unset($filterent['protocol']);
+ }
+
+ if ($_POST['proto'] == "icmp") {
+ if ($filterent['ipprotocol'] == 'inet6' && $_POST['icmp6type']) {
+ $filterent['icmptype'] = $_POST['icmp6type'];
+ } else if ($filterent['ipprotocol'] != 'inet6' && $_POST['icmptype']) {
+ $filterent['icmptype'] = $_POST['icmptype'];
+ } else {
+ unset($filterent['icmptype']);
+ }
+ } else {
+ unset($filterent['icmptype']);
+ }
+
+ pconfig_to_address($filterent['source'], $_POST['src'],
+ $_POST['srcmask'], $_POST['srcnot'],
+ $_POST['srcbeginport'], $_POST['srcendport']);
+
+ pconfig_to_address($filterent['destination'], $_POST['dst'],
+ $_POST['dstmask'], $_POST['dstnot'],
+ $_POST['dstbeginport'], $_POST['dstendport']);
+
+ if ($_POST['disabled']) {
+ $filterent['disabled'] = true;
+ } else {
+ unset($filterent['disabled']);
+ }
+
+ if ($_POST['dscp']) {
+ $filterent['dscp'] = $_POST['dscp'];
+ }
+
+ if ($_POST['log']) {
+ $filterent['log'] = true;
+ } else {
+ unset($filterent['log']);
+ }
+ strncpy($filterent['descr'], $_POST['descr'], 52);
+
+ if ($_POST['gateway'] != "") {
+ $filterent['gateway'] = $_POST['gateway'];
+ }
+
+ if ($_POST['defaultqueue'] != "") {
+ $filterent['defaultqueue'] = $_POST['defaultqueue'];
+ if ($_POST['ackqueue'] != "") {
+ $filterent['ackqueue'] = $_POST['ackqueue'];
+ }
+ }
+
+ if ($_POST['dnpipe'] != "") {
+ $filterent['dnpipe'] = $_POST['dnpipe'];
+ if ($_POST['pdnpipe'] != "") {
+ $filterent['pdnpipe'] = $_POST['pdnpipe'];
+ }
+ }
+
+ if ($_POST['l7container'] != "") {
+ $filterent['l7container'] = $_POST['l7container'];
+ }
+
+ if ($_POST['sched'] != "") {
+ $filterent['sched'] = $_POST['sched'];
+ }
+
+ if ($_POST['vlanprio'] != "") {
+ $filterent['vlanprio'] = $_POST['vlanprio'];
+ }
+ if ($_POST['vlanprioset'] != "") {
+ $filterent['vlanprioset'] = $_POST['vlanprioset'];
+ }
+
+ // If we have an associated nat rule, make sure the source and destination doesn't change
+ if (isset($a_filter[$id]['associated-rule-id'])) {
+ $filterent['interface'] = $a_filter[$id]['interface'];
+ if (isset($a_filter[$id]['protocol'])) {
+ $filterent['protocol'] = $a_filter[$id]['protocol'];
+ } else if (isset($filterent['protocol'])) {
+ unset($filterent['protocol']);
+ }
+ if ($a_filter[$id]['protocol'] == "icmp" && $a_filter[$id]['icmptype']) {
+ $filterent['icmptype'] = $a_filter[$id]['icmptype'];
+ } else if (isset($filterent['icmptype'])) {
+ unset($filterent['icmptype']);
+ }
+
+ $filterent['source'] = $a_filter[$id]['source'];
+ $filterent['destination'] = $a_filter[$id]['destination'];
+ $filterent['associated-rule-id'] = $a_filter[$id]['associated-rule-id'];
+ }
+
+ if (isset($a_filter[$id]['created']) && is_array($a_filter[$id]['created'])) {
+ $filterent['created'] = $a_filter[$id]['created'];
+ }
+
+ $filterent['updated'] = make_config_revision_entry();
+
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_write_config");
+
+ if (isset($id) && $a_filter[$id]) {
+ $a_filter[$id] = $filterent;
+ } else {
+ $filterent['created'] = make_config_revision_entry();
+ if (is_numeric($after)) {
+ array_splice($a_filter, $after+1, 0, array($filterent));
+ } else {
+ $a_filter[] = $filterent;
+ }
+ }
+
+ filter_rules_sort();
+
+ if (write_config()) {
+ mark_subsystem_dirty('filter');
+ }
+
+ if (isset($_POST['floating'])) {
+ header("Location: firewall_rules.php?if=FloatingRules");
+ } else {
+ header("Location: firewall_rules.php?if=" . htmlspecialchars($_POST['interface']));
+ }
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("Rules"), gettext("Edit"));
+$shortcut_section = "firewall";
+
+$closehead = false;
+
+$page_filename = "firewall_rules_edit.php";
+include("head.inc");
+
+?>
+<link rel="stylesheet" href="/javascript/chosen/chosen.css" />
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
+<script src="/javascript/chosen/chosen.jquery.js" type="text/javascript"></script>
+<?php include("fbegin.inc"); ?>
+<?php pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_input_errors"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<form action="firewall_rules_edit.php" method="post" name="iform" id="iform">
+<input type='hidden' name="ruleid" value="<?=(isset($pconfig['ruleid'])&&$pconfig['ruleid']>0)?htmlspecialchars($pconfig['ruleid']):''?>" />
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="firewall rules edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Firewall rule");?></td>
+ </tr>
+<?php
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/htmlphpearly");
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Action");?></td>
+ <td width="78%" class="vtable">
+ <select name="type" class="formselect">
+ <?php $types = explode(" ", "Pass Block Reject"); foreach ($types as $type): ?>
+ <option value="<?=strtolower($type);?>" <?php if (strtolower($type) == strtolower($pconfig['type'])) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($type);?>
+ </option>
+ <?php endforeach; ?>
+<?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
+ <option value="match" <?php if ("match" == strtolower($pconfig['type'])) echo "selected=\"selected\""; ?>>Match</option>
+<?php endif; ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Choose what to do with packets that match the criteria specified below.");?> <br />
+ <?=gettext("Hint: the difference between block and reject is that with reject, a packet (TCP RST or ICMP port unreachable for UDP) is returned to the sender, whereas with block the packet is dropped silently. In either case, the original packet is discarded.");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled");?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable this rule");?></strong><br />
+ <span class="vexpl"><?=gettext("Set this option to disable this rule without removing it from the list.");?></span>
+ </td>
+ </tr>
+<?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">
+ <?=gettext("Quick");?>
+ </td>
+ <td width="78%" class="vtable">
+ <input name="quick" type="checkbox" id="quick" value="yes" <?php if ($pconfig['quick']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Apply the action immediately on match.");?></strong><br />
+ <span class="vexpl"><?=gettext("Set this option if you need to apply this action to traffic that matches this rule immediately.");?></span>
+ </td>
+ </tr>
+<?php endif; ?>
+<?php $edit_disabled = ""; ?>
+<?php if (isset($pconfig['associated-rule-id'])): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Associated filter rule");?></td>
+ <td width="78%" class="vtable">
+ <span class="red"><strong><?=gettext("Note: ");?></strong></span><?=gettext("This is associated to a NAT rule.");?><br />
+ <?=gettext("You cannot edit the interface, protocol, source, or destination of associated filter rules.");?><br />
+ <br />
+ <?php
+ $edit_disabled = "disabled";
+ if (is_array($config['nat']['rule'])) {
+ foreach ($config['nat']['rule'] as $index => $nat_rule) {
+ if (isset($nat_rule['associated-rule-id']) && $nat_rule['associated-rule-id'] == $pconfig['associated-rule-id']) {
+ echo "<a href=\"firewall_nat_edit.php?id={$index}\">" . gettext("View the NAT rule") . "</a><br />";
+ break;
+ }
+ }
+ }
+ echo "<input name='associated-rule-id' id='associated-rule-id' type='hidden' value='{$pconfig['associated-rule-id']}' />";
+ if (!empty($pconfig['interface'])) {
+ echo "<input name='interface' id='interface' type='hidden' value='{$pconfig['interface']}' />";
+ }
+ ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ editenabled = 0;
+ //]]>
+ </script>
+ </td>
+ </tr>
+<?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
+ <td width="78%" class="vtable">
+<?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
+ <select name="interface[]" title="Select interfaces..." multiple="multiple" style="width:350px;" class="chzn-select" tabindex="2" <?=$edit_disabled;?>>
+<?php else: ?>
+ <select name="interface" class="formselect" <?=$edit_disabled;?>>
+<?php endif;
+ /* add group interfaces */
+ if (is_array($config['ifgroups']['ifgroupentry'])) {
+ foreach ($config['ifgroups']['ifgroupentry'] as $ifgen) {
+ if (have_ruleint_access($ifgen['ifname'])) {
+ $interfaces[$ifgen['ifname']] = $ifgen['ifname'];
+ }
+ }
+ }
+ $ifdescs = get_configured_interface_with_descr();
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/pre_interfaces_edit");
+ foreach ($ifdescs as $ifent => $ifdesc) {
+ if (have_ruleint_access($ifent)) {
+ $interfaces[$ifent] = $ifdesc;
+ }
+ }
+ if ($config['l2tp']['mode'] == "server") {
+ if (have_ruleint_access("l2tp")) {
+ $interfaces['l2tp'] = "L2TP VPN";
+ }
+ }
+ if ($config['pptpd']['mode'] == "server") {
+ if (have_ruleint_access("pptp")) {
+ $interfaces['pptp'] = "PPTP VPN";
+ }
+ }
+
+ if (is_pppoe_server_enabled() && have_ruleint_access("pppoe")) {
+ $interfaces['pppoe'] = "PPPoE Server";
+ }
+ /* add ipsec interfaces */
+ if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ if (have_ruleint_access("enc0")) {
+ $interfaces["enc0"] = "IPsec";
+ }
+ }
+ /* add openvpn/tun interfaces */
+ if ($config['openvpn']["openvpn-server"] || $config['openvpn']["openvpn-client"]) {
+ $interfaces["openvpn"] = "OpenVPN";
+ }
+ if (is_array($pconfig['interface'])) {
+ $pconfig['interface'] = implode(",", $pconfig['interface']);
+ }
+ $selected_interfaces = explode(",", $pconfig['interface']);
+ foreach ($interfaces as $iface => $ifacename): ?>
+ <option value="<?=$iface;?>" <?php if ($pconfig['interface'] <> "" && (strcasecmp($pconfig['interface'], $iface) == 0 || in_array($iface, $selected_interfaces))) echo "selected=\"selected\""; ?>><?=$ifacename?></option>
+<?php endforeach; ?>
+ </select>
+ <br />
+ <?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
+ <span class="vexpl"><?=gettext("Choose the interface(s) for this rule.");?></span>
+ <?php else: ?>
+ <span class="vexpl"><?=gettext("Choose which interface packets must be sourced on to match this rule.");?></span>
+ <?php endif; ?>
+ </td>
+ </tr>
+<?php if ($if == "FloatingRules" || isset($pconfig['floating'])): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">
+ <?=gettext("Direction");?>
+ </td>
+ <td width="78%" class="vtable">
+ <select name="direction" class="formselect">
+ <?php $directions = array('any', 'in', 'out');
+ foreach ($directions as $direction): ?>
+ <option value="<?=$direction;?>"
+ <?php if ($direction == $pconfig['direction']): ?>
+ selected="selected"
+ <?php endif; ?>
+ ><?=$direction;?></option>
+ <?php endforeach; ?>
+ </select>
+ <input type="hidden" id="floating" name="floating" value="floating" />
+ </td>
+ </tr>
+<?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("TCP/IP Version");?></td>
+ <td width="78%" class="vtable">
+ <select name="ipprotocol" class="formselect" onchange="proto_change()">
+ <?php
+ $ipproto = array('inet' => 'IPv4', 'inet6' => 'IPv6', 'inet46' => 'IPv4+IPv6');
+ foreach ($ipproto as $proto => $name):
+ ?>
+ <option value="<?=$proto;?>"
+ <?php if ($proto == $pconfig['ipprotocol']): ?>
+ selected="selected"
+ <?php endif; ?>
+ ><?=$name;?></option>
+ <?php endforeach; ?>
+ </select>
+ <strong><?=gettext("Select the Internet Protocol version this rule applies to");?></strong><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
+ <td width="78%" class="vtable">
+ <select <?=$edit_disabled;?> name="proto" class="formselect" onchange="proto_change()">
+<?php
+ $protocols = explode(" ", "TCP UDP TCP/UDP ICMP ESP AH GRE IPV6 IGMP PIM OSPF SCTP any carp pfsync");
+ foreach ($protocols as $proto): ?>
+ <option value="<?=strtolower($proto);?>" <?php if (strtolower($proto) == $pconfig['proto']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($proto);?></option>
+<?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Choose which IP protocol this rule should match.");?> <br /> <?=gettext("Hint: in most cases, you should specify ");?><em>TCP</em> &nbsp;<?=gettext("here.");?></span>
+ </td>
+ </tr>
+ <tr id="icmpbox">
+ <td valign="top" class="vncell"><?=gettext("ICMP type");?></td>
+ <td class="vtable">
+ <select <?=$edit_disabled;?> name="icmptype" class="formselect">
+<?php
+ foreach ($icmptypes as $icmptype => $descr):
+?>
+ <option value="<?=$icmptype;?>" <?php if ($icmptype == $pconfig['icmptype']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($descr);?></option>
+<?php
+ endforeach;
+?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("If you selected ICMP for the protocol above, you may specify an ICMP type here.");?></span>
+ </td>
+ </tr>
+ <tr id="icmp6box">
+ <td valign="top" class="vncell"><?=gettext("ICMPv6 type");?></td>
+ <td class="vtable">
+ <select <?=$edit_disabled;?> name="icmp6type" class="formselect">
+<?php
+ foreach ($icmp6types as $icmptype => $descr):
+?>
+ <option value="<?=$icmptype;?>" <?php if ($icmptype == $pconfig['icmptype']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($descr);?></option>
+<?php
+ endforeach;
+?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("If you selected ICMP for the protocol above, you may specify an ICMP type here.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Source");?></td>
+ <td width="78%" class="vtable">
+ <input <?=$edit_disabled;?> name="srcnot" type="checkbox" id="srcnot" value="yes" <?php if ($pconfig['srcnot']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("not");?></strong>
+ <br />
+ <?=gettext("Use this option to invert the sense of the match.");?>
+ <br />
+ <br />
+ <table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
+ <td>
+ <select <?=$edit_disabled;?> name="srctype" class="formselect" onchange="typesel_change()">
+<?php
+ $sel = is_specialnet($pconfig['src']);
+?>
+ <option value="any" <?php if ($pconfig['src'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any");?></option>
+ <option value="single"
+ <?php
+ if (!$sel &&
+ ((is_ipaddrv6($pconfig['src']) && $pconfig['srcmask'] == 128) ||
+ (is_ipaddrv4($pconfig['src']) && $pconfig['srcmask'] == 32) || is_alias($pconfig['src']))) {
+ echo "selected=\"selected\""; $sel = 1;
+ }
+ ?>
+ > <?=gettext("Single host or alias");?></option>
+ <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network");?></option>
+ <?php if (isset($a_filter[$id]['floating']) || $if == "FloatingRules"): ?>
+ <option value="(self)" <?php if ($pconfig['src'] == "(self)") echo "selected=\"selected\""; ?>><?=gettext("This Firewall (self)");?></option>
+ <?php endif;?>
+ <?php if (have_ruleint_access("pptp")): ?>
+ <option value="pptp" <?php if ($pconfig['src'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients");?></option>
+ <?php endif; ?>
+ <?php if (have_ruleint_access("pppoe")): ?>
+ <option value="pppoe" <?php if ($pconfig['src'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients");?></option>
+ <?php endif; ?>
+ <?php if (have_ruleint_access("l2tp")): ?>
+ <option value="l2tp" <?php if ($pconfig['src'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients");?></option>
+ <?php endif; ?>
+<?php
+ foreach ($ifdisp as $ifent => $ifdesc):
+?>
+ <?php if (have_ruleint_access($ifent)): ?>
+ <option value="<?=$ifent;?>" <?php if ($pconfig['src'] == $ifent) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?> <?=gettext("net");?></option>
+ <option value="<?=$ifent;?>ip"<?php if ($pconfig['src'] == $ifent . "ip") { echo "selected=\"selected\""; } ?>>
+ <?=$ifdesc?> <?=gettext("address");?>
+ </option>
+ <?php endif; ?>
+<?php
+ endforeach;
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input <?=$edit_disabled;?> autocomplete='off' name="src" type="text" class="formfldalias ipv4v6" id="src" size="20" value="<?php if (!is_specialnet($pconfig['src'])) echo htmlspecialchars($pconfig['src']);?>" /> /
+ <select <?=$edit_disabled;?> name="srcmask" class="formselect ipv4v6" id="srcmask">
+<?php for ($i = 127; $i > 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['srcmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
+<?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <div id="showadvancedboxspr">
+ <p>
+ <input <?=$edit_disabled;?> type="button" onclick="show_source_port_range()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show source port range");?>
+ </p>
+ </div>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Source port range");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><?=gettext("from:");?>&nbsp;&nbsp;</td>
+ <td>
+ <select <?=$edit_disabled;?> name="srcbeginport" class="formselect" onchange="src_rep_change();ext_change()">
+ <option value="">(<?=gettext("other"); ?>)</option>
+ <option value="any" <?php $bfound = 0; if ($pconfig['srcbeginport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any");?></option>
+<?php foreach ($wkports as $wkport => $wkportdesc): ?>
+ <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['srcbeginport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars("{$wkportdesc} ({$wkport})");?></option>
+<?php endforeach; ?>
+ </select>
+ <input <?=$edit_disabled;?> autocomplete='off' class="formfldalias" name="srcbeginport_cust" id="srcbeginport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['srcbeginport']) echo htmlspecialchars($pconfig['srcbeginport']); ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("to:");?></td>
+ <td>
+ <select <?=$edit_disabled;?> name="srcendport" class="formselect" onchange="ext_change()">
+ <option value="">(<?=gettext("other"); ?>)</option>
+ <option value="any" <?php $bfound = 0; if ($pconfig['srcendport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any");?></option>
+<?php foreach ($wkports as $wkport => $wkportdesc): ?>
+ <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['srcendport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars("{$wkportdesc} ({$wkport})");?></option>
+<?php endforeach; ?>
+ </select>
+ <input <?=$edit_disabled;?> autocomplete='off' class="formfldalias" name="srcendport_cust" id="srcendport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['srcendport']) echo htmlspecialchars($pconfig['srcendport']); ?>" />
+ </td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl"><?=gettext("Specify the source port or port range for this rule."); ?> <b><?=gettext("This is usually"); ?> <em><?=gettext("random"); ?></em> <?=gettext("and almost never equal to the destination port range (and should usually be"); ?> &quot;<?=gettext("any"); ?>&quot;).</b><br /><?=gettext("Hint: you can leave the"); ?> <em><?=gettext("'to'"); ?></em> <?=gettext("field empty if you only want to filter a single port.");?></span><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination");?></td>
+ <td width="78%" class="vtable">
+ <input <?=$edit_disabled;?> name="dstnot" type="checkbox" id="dstnot" value="yes" <?php if ($pconfig['dstnot']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("not");?></strong>
+ <br />
+ <?=gettext("Use this option to invert the sense of the match.");?>
+ <br />
+ <br />
+ <table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
+ <td>
+ <select <?=$edit_disabled;?> name="dsttype" class="formselect" onchange="typesel_change()">
+<?php
+ $sel = is_specialnet($pconfig['dst']); ?>
+ <option value="any" <?php if ($pconfig['dst'] == "any") { echo "selected=\"selected\""; } ?>><?=gettext("any");?></option>
+ <option value="single"
+ <?php
+ if (!$sel &&
+ ((is_ipaddrv6($pconfig['dst']) && $pconfig['dstmask'] == 128) ||
+ (is_ipaddrv4($pconfig['dst']) && $pconfig['dstmask'] == 32) || is_alias($pconfig['dst']))) {
+ echo "selected=\"selected\""; $sel = 1;
+ }
+ ?>
+ ><?=gettext("Single host or alias");?></option>
+ <option value="network" <?php if (!$sel) echo "selected=\"selected\""; ?>><?=gettext("Network");?></option>
+ <option value="(self)" <?PHP if ($pconfig['dst'] == "(self)") echo "selected=\"selected\""; ?>><?=gettext("This Firewall (self)");?></option>
+ <?php if (have_ruleint_access("pptp")): ?>
+ <option value="pptp" <?php if ($pconfig['dst'] == "pptp") { echo "selected=\"selected\""; } ?>><?=gettext("PPTP clients");?></option>
+ <?php endif; ?>
+ <?php if (have_ruleint_access("pppoe")): ?>
+ <option value="pppoe" <?php if ($pconfig['dst'] == "pppoe") { echo "selected=\"selected\""; } ?>><?=gettext("PPPoE clients");?></option>
+ <?php endif; ?>
+ <?php if (have_ruleint_access("l2tp")): ?>
+ <option value="l2tp" <?php if ($pconfig['dst'] == "l2tp") { echo "selected=\"selected\""; } ?>><?=gettext("L2TP clients");?></option>
+ <?php endif; ?>
+
+<?php foreach ($ifdisp as $if => $ifdesc): ?>
+ <?php if (have_ruleint_access($if)): ?>
+ <option value="<?=$if;?>" <?php if ($pconfig['dst'] == $if) { echo "selected=\"selected\""; } ?>><?=htmlspecialchars($ifdesc);?> <?=gettext("net");?></option>
+ <option value="<?=$if;?>ip"<?php if ($pconfig['dst'] == $if . "ip") { echo "selected=\"selected\""; } ?>>
+ <?=$ifdesc;?> <?=gettext("address");?>
+ </option>
+ <?php endif; ?>
+<?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input <?=$edit_disabled;?> autocomplete='off' name="dst" type="text" class="formfldalias ipv4v6" id="dst" size="20" value="<?php if (!is_specialnet($pconfig['dst'])) echo htmlspecialchars($pconfig['dst']);?>" />
+ /
+ <select <?=$edit_disabled;?> name="dstmask" class="formselect ipv4v6" id="dstmask">
+<?php for ($i = 127; $i > 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['dstmask']) echo "selected=\"selected\""; ?>><?=$i;?></option>
+<?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="dprtr">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination port range ");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><?=gettext("from:");?>&nbsp;&nbsp;</td>
+ <td>
+ <select <?=$edit_disabled;?> name="dstbeginport" class="formselect" onchange="dst_rep_change();ext_change()">
+ <option value="">(<?=gettext("other"); ?>)</option>
+ <option value="any" <?php $bfound = 0; if ($pconfig['dstbeginport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any");?></option>
+<?php foreach ($wkports as $wkport => $wkportdesc): ?>
+ <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['dstbeginport']) { echo "selected=\"selected\""; $bfound = 1; }?>><?=htmlspecialchars("{$wkportdesc} ({$wkport})");?></option>
+<?php endforeach; ?>
+ </select>
+ <input <?=$edit_disabled;?> autocomplete='off' class="formfldalias" name="dstbeginport_cust" id="dstbeginport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['dstbeginport']) echo htmlspecialchars($pconfig['dstbeginport']); ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("to:");?></td>
+ <td>
+ <select <?=$edit_disabled;?> name="dstendport" class="formselect" onchange="ext_change()">
+ <option value="">(<?=gettext("other"); ?>)</option>
+ <option value="any" <?php $bfound = 0; if ($pconfig['dstendport'] == "any") { echo "selected=\"selected\""; $bfound = 1; } ?>><?=gettext("any");?></option>
+<?php foreach ($wkports as $wkport => $wkportdesc): ?>
+ <option value="<?=$wkport;?>" <?php if ($wkport == $pconfig['dstendport']) { echo "selected=\"selected\""; $bfound = 1; } ?>><?=htmlspecialchars("{$wkportdesc} ({$wkport})");?></option>
+<?php endforeach; ?>
+ </select>
+ <input <?=$edit_disabled;?> autocomplete='off' class="formfldalias" name="dstendport_cust" id="dstendport_cust" type="text" size="5" value="<?php if (!$bfound && $pconfig['dstendport']) echo htmlspecialchars($pconfig['dstendport']); ?>" />
+ </td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Specify the port or port range for the destination of the packet for this rule.");?>
+ <br />
+ <?=gettext("Hint: you can leave the"); ?> <em><?=gettext("'to'"); ?></em> <?=gettext("field empty if you only want to filter a single port");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Log");?></td>
+ <td width="78%" class="vtable">
+ <input name="log" type="checkbox" id="log" value="yes" <?php if ($pconfig['log']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Log packets that are handled by this rule");?></strong>
+ <br />
+ <span class="vexpl"><?=gettext("Hint: the firewall has limited local log space. Don't turn on logging for everything. If you want to do a lot of logging, consider using a remote syslog server"); ?> (<?=gettext("see the"); ?> <a href="diag_logs_settings.php"><?=gettext("Diagnostics: System logs: Settings"); ?></a> <?=gettext("page"); ?>).</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="52" maxlength="52" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference.");?></span>
+ </td>
+ </tr>
+<?php if (!isset($id) || !($a_filter[$id] && firewall_check_for_advanced_options($a_filter[$id]) <> "")): ?>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ &nbsp;<br />&nbsp;
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+<?php if (isset($id) && $a_filter[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+<?php endif; ?>
+ <input name="after" type="hidden" value="<?=htmlspecialchars($after);?>" />
+ </td>
+ </tr>
+<?php endif; ?>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced features");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Source OS");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvsourceosbox" <?php if ($pconfig['os']) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_sourceos()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showsourceosadv" <?php if (empty($pconfig['os'])) echo "style='display:none'"; ?>>
+ <?=gettext("OS Type:");?>&nbsp;
+ <select name="os" id="os" class="formselect">
+ <option value="" <?php if (empty($pconfig['os'])) echo "selected=\"selected\""; ?>>Any</option>
+<?php foreach ($ostypes as $ostype): ?>
+ <option value="<?=$ostype;?>" <?php if ($ostype == $pconfig['os']) echo "selected=\"selected\""; ?>><?=htmlspecialchars($ostype);?></option>
+<?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Note: this only works for TCP rules. General OS choice matches all subtypes.");?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Diffserv Code Point");?></td>
+ <td width="78%" class="vtable">
+ <div id="dsadv" <?php if ($pconfig['dscp']) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_dsdiv();" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="dsdivmain" <?php if (empty($pconfig['dscp'])) echo "style='display:none'"; ?>>
+ <select name="dscp" id="dscp">
+ <option value=""></option>
+ <?php foreach ($firewall_rules_dscp_types as $frdt): ?>
+ <option value="<?=$frdt?>"<?php if ($pconfig['dscp'] == $frdt) echo " selected=\"selected\""; ?>><?=$frdt?></option>
+ <?php endforeach; ?>
+ </select>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Advanced Options");?></td>
+ <td width="78%" class="vtable">
+ <div id="aoadv" <?php if (is_aoadv_used($pconfig)) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_aodiv();" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="aodivmain" <?php if (!is_aoadv_used($pconfig)) echo "style='display:none'"; ?>>
+ <input type="checkbox" id="allowopts" value="yes" name="allowopts"<?php if ($pconfig['allowopts'] == true) echo " checked=\"checked\""; ?> />
+ <br /><span class="vexpl"><?=gettext("This allows packets with IP options to pass. Otherwise they are blocked by default. This is usually only seen with multicast traffic.");?>
+ </span><p>
+ <input type="checkbox" id="disablereplyto" value="yes" name="disablereplyto"<?php if ($pconfig['disablereplyto'] == true) echo " checked=\"checked\""; ?> />
+ <br /><span class="vexpl"><?=gettext("This will disable auto generated reply-to for this rule.");?>
+ </span></p><p>
+ <input name="tag" id="tag" value="<?=htmlspecialchars($pconfig['tag']);?>" />
+ <br /><span class="vexpl"><?=gettext("You can mark a packet matching this rule and use this mark to match on other NAT/filter rules. It is called"); ?> <b><?=gettext("Policy filtering"); ?></b>
+ </span></p><p>
+ <input name="tagged" id="tagged" value="<?=htmlspecialchars($pconfig['tagged']);?>" />
+ <br /><span class="vexpl"><?=gettext("You can match packet on a mark placed before on another rule.")?>
+ </span></p><p>
+ <input name="max" id="max" value="<?php echo htmlspecialchars($pconfig['max']) ?>" /><br /><?=gettext(" Maximum state entries this rule can create");?></p><p>
+ <input name="max-src-nodes" id="max-src-nodes" value="<?php echo htmlspecialchars($pconfig['max-src-nodes']) ?>" /><br /><?=gettext(" Maximum number of unique source hosts");?></p><p>
+ <input name="max-src-conn" id="max-src-conn" value="<?php echo htmlspecialchars($pconfig['max-src-conn']) ?>" /><br /><?=gettext(" Maximum number of established connections per host (TCP only)");?></p><p>
+ <input name="max-src-states" id="max-src-states" value="<?php echo htmlspecialchars($pconfig['max-src-states']) ?>" /><br /><?=gettext(" Maximum state entries per host");?></p><p>
+ <input name="max-src-conn-rate" id="max-src-conn-rate" value="<?php echo htmlspecialchars($pconfig['max-src-conn-rate']) ?>" /> /
+ <select name="max-src-conn-rates" id="max-src-conn-rates">
+ <option value=""<?php if (intval($pconfig['max-src-conn-rates']) < 1) echo " selected=\"selected\""; ?>></option>
+<?php for ($x=1; $x<255; $x++) {
+ if ($x == $pconfig['max-src-conn-rates']) $selected = " selected=\"selected\""; else $selected = ""; {
+ echo "<option value=\"{$x}\"{$selected}>{$x}</option>\n";
+ }
+ } ?>
+ </select><br />
+ <?=gettext("Maximum new connections per host / per second(s) (TCP only)");?>
+ </p><p>
+ <input name="statetimeout" value="<?php echo htmlspecialchars($pconfig['statetimeout']) ?>" /><br />
+ <?=gettext("State Timeout in seconds (TCP only)");?>
+ </p>
+ <p><strong><?=gettext("Note: Leave fields blank to disable that feature.");?></strong></p>
+ </div>
+ </td>
+ </tr>
+ <tr id="tcpflags">
+ <td width="22%" valign="top" class="vncell"><?=gettext("TCP flags");?></td>
+ <td width="78%" class="vtable">
+ <div id="showtcpflagsbox" <?php if ($pconfig['tcpflags_any'] || $pconfig['tcpflags1'] || $pconfig['tcpflags2']) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_tcpflags()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showtcpflagsadv" <?php if (empty($pconfig['tcpflags_any']) && empty($pconfig['tcpflags1']) && empty($pconfig['tcpflags2'])) echo "style='display:none'"; ?>>
+ <div id="tcpheader" align="center">
+ <table border="0" cellspacing="0" cellpadding="0">
+ <?php
+ $setflags = explode(",", $pconfig['tcpflags1']);
+ $outofflags = explode(",", $pconfig['tcpflags2']);
+ $header = "<td width='40' class='nowrap'></td>";
+ $tcpflags1 = "<td width='40' class='nowrap'>set</td>";
+ $tcpflags2 = "<td width='40' class='nowrap'>out of</td>";
+ foreach ($tcpflags as $tcpflag) {
+ $header .= "<td width='40' class='nowrap'><strong>" . strtoupper($tcpflag) . "</strong></td>\n";
+ $tcpflags1 .= "<td width='40' class='nowrap'> <input type='checkbox' name='tcpflags1_{$tcpflag}' value='on' ";
+ if (array_search($tcpflag, $setflags) !== false) {
+ $tcpflags1 .= "checked=\"checked\"";
+ }
+ $tcpflags1 .= " /></td>\n";
+ $tcpflags2 .= "<td width='40' class='nowrap'> <input type='checkbox' name='tcpflags2_{$tcpflag}' value='on' ";
+ if (array_search($tcpflag, $outofflags) !== false) {
+ $tcpflags2 .= "checked=\"checked\"";
+ }
+ $tcpflags2 .= " /></td>\n";
+ }
+ echo "<tr id='tcpheader'>{$header}</tr>\n";
+ echo "<tr id='tcpflags1'>{$tcpflags1}</tr>\n";
+ echo "<tr id='tcpflags2'>{$tcpflags2}</tr>\n";
+ ?>
+ </table>
+ </div>
+ <br /><center>
+ <input onclick='tcpflags_anyclick(this);' type='checkbox' name='tcpflags_any' value='on' <?php if ($pconfig['tcpflags_any']) echo "checked=\"checked\""; ?> /><strong><?=gettext("Any flags.");?></strong><br /></center>
+ <br />
+ <span class="vexpl"><?=gettext("Use this to choose TCP flags that must ".
+ "be set or cleared for this rule to match.");?></span>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("State Type");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvstatebox" <?php if (!empty($pconfig['nopfsync']) || (!empty($pconfig['statetype']) && $pconfig['statetype'] != "keep state")) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_state()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showstateadv" <?php if (empty($pconfig['nopfsync']) && (empty($pconfig['statetype']) || $pconfig['statetype'] == "keep state")) echo "style='display:none'"; ?>>
+ <input name="nopfsync" type="checkbox" id="nopfsync" value="yes" <?php if ($pconfig['nopfsync']) echo "checked=\"checked\""; ?> />
+ <span class="vexpl">
+ NO pfsync<br />
+ <?=gettext("Hint: This prevents states created by this rule to be sync'ed over pfsync.");?><br />
+ </span><br />
+ <select name="statetype">
+ <option value="keep state" <?php if (!isset($pconfig['statetype']) or $pconfig['statetype'] == "keep state") echo "selected=\"selected\""; ?>><?=gettext("keep state");?></option>
+ <option value="sloppy state" <?php if ($pconfig['statetype'] == "sloppy state") echo "selected=\"selected\""; ?>><?=gettext("sloppy state");?></option>
+ <option value="synproxy state"<?php if ($pconfig['statetype'] == "synproxy state") echo "selected=\"selected\""; ?>><?=gettext("synproxy state");?></option>
+ <option value="none"<?php if ($pconfig['statetype'] == "none") echo "selected=\"selected\""; ?>><?=gettext("none");?></option>
+ </select><br />
+ <span class="vexpl">
+ <?=gettext("Hint: Select which type of state tracking mechanism you would like to use. If in doubt, use keep state.");?>
+ </span>
+ <table width="90%">
+ <tr><td width="25%"><ul><li><?=gettext("keep state");?></li></ul></td><td><?=gettext("Works with all IP protocols.");?></td></tr>
+ <tr><td width="25%"><ul><li><?=gettext("sloppy state");?></li></ul></td><td><?=gettext("Works with all IP protocols.");?></td></tr>
+ <tr><td width="25%"><ul><li><?=gettext("synproxy state");?></li></ul></td><td><?=gettext("Proxies incoming TCP connections to help protect servers from spoofed TCP SYN floods. This option includes the functionality of keep state and modulate state combined.");?></td></tr>
+ <tr><td width="25%"><ul><li><?=gettext("none");?></li></ul></td><td><?=gettext("Do not use state mechanisms to keep track. This is only useful if you're doing advanced queueing in certain situations. Please check the documentation.");?></td></tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("No XMLRPC Sync");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvnoxmlrpcsyncbox" <?php if ($pconfig['nosync']) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_noxmlrpc()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="shownoxmlrpcadv" <?php if (empty($pconfig['nosync'])) echo "style='display:none'"; ?>>
+ <input type="checkbox" name="nosync"<?php if ($pconfig['nosync']) echo " checked=\"checked\""; ?> /><br />
+ <?=gettext("Hint: This prevents the rule on Master from automatically syncing to other CARP members. This does NOT prevent the rule from being overwritten on Slave.");?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("802.1p");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvvlanpriobox" <?php if (!empty($pconfig['vlanprio'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_vlanprio()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showvlanprioadv" <?php if (empty($pconfig['vlanprio'])) echo "style='display:none'"; ?>>
+ <?php $vlanprio = array("none", "be", "bk", "ee", "ca", "vi", "vo", "ic", "nc"); ?>
+<?php
+ $opts = "";
+ foreach ($vlanprio as $vprio) {
+ if ($vprio == $pconfig['vlanprio']) {
+ $selected = " selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ if ($vprio == "none") {
+ $opts .= "<option value=\"\">{$vprio}</option>\n";
+ } else {
+ $opts .= "<option value=\"{$vprio}\" {$selected}>" . strtoupper($vprio) . "</option>\n";
+ }
+ }
+
+ $optsset = "";
+ foreach ($vlanprio as $vprioset) {
+ if ($vprioset == $pconfig['vlanprioset']) {
+ $selected = " selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ if ($vprioset == "none") {
+ $optsset .= "<option value=\"\">{$vprioset}</option>\n";
+ } else {
+ $optsset .= "<option value=\"{$vprioset}\" {$selected}>" . strtoupper($vprioset) . "</option>\n";
+ }
+ }
+?>
+ <select name='vlanprio'>
+ <?php echo $opts; ?>
+ </select>
+ <p><?=gettext("Choose 802.1p priority to match on");?></p>
+ <select name='vlanprioset'>
+ <?php echo $optsset; ?>
+ </select>
+ <p><?=gettext("Choose 802.1p priority to apply");?></p>
+ </div>
+ </td>
+ </tr>
+ <?php
+ //build list of schedules
+ $schedules = array();
+ $schedules[] = "none";//leave none to leave rule enabled all the time
+ if (is_array($config['schedules']['schedule'])) {
+ foreach ($config['schedules']['schedule'] as $schedule) {
+ if ($schedule['name'] <> "") {
+ $schedules[] = $schedule['name'];
+ }
+ }
+ }
+ ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Schedule");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvschedulebox" <?php if (!empty($pconfig['sched'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_schedule()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showscheduleadv" <?php if (empty($pconfig['sched'])) echo "style='display:none'"; ?>>
+ <select name='sched'>
+<?php
+ foreach ($schedules as $schedule) {
+ if ($schedule == $pconfig['sched']) {
+ $selected = " selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ if ($schedule == "none") {
+ echo "<option value=\"\" {$selected}>{$schedule}</option>\n";
+ } else {
+ echo "<option value=\"{$schedule}\" {$selected}>{$schedule}</option>\n";
+ }
+ }
+?>
+ </select>
+ <p><?=gettext("Leave as 'none' to leave the rule enabled all the time.");?></p>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Gateway");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvgatewaybox" <?php if (!empty($pconfig['gateway'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_gateway()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showgatewayadv" <?php if (empty($pconfig['gateway'])) echo "style='display:none'"; ?>>
+ <select name='gateway'>
+ <option value="" ><?=gettext("default");?></option>
+<?php
+ /* build a list of gateways */
+ $gateways = return_gateways_array();
+ // add statically configured gateways to list
+ foreach ($gateways as $gwname => $gw) {
+ if (($pconfig['ipprotocol'] == "inet46")) {
+ continue;
+ }
+ if (($pconfig['ipprotocol'] == "inet6") && !(($gw['ipprotocol'] == "inet6") || (is_ipaddrv6($gw['gateway'])))) {
+ continue;
+ }
+ if (($pconfig['ipprotocol'] == "inet") && !(($gw['ipprotocol'] == "inet") || (is_ipaddrv4($gw['gateway'])))) {
+ continue;
+ }
+ if ($gw == "") {
+ continue;
+ }
+ if ($gwname == $pconfig['gateway']) {
+ $selected = " selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ $gateway_addr_str = empty($gw['gateway']) ? "" : " - " . $gw[gateway];
+ echo "<option value=\"{$gwname}\" {$selected}>{$gw['name']}{$gateway_addr_str}</option>\n";
+ }
+ /* add gateway groups to the list */
+ if (is_array($a_gatewaygroups)) {
+ foreach ($a_gatewaygroups as $gwg_name => $gwg_data) {
+ if ((empty($pconfig['ipprotocol'])) || ($pconfig['ipprotocol'] == $gwg_data['ipprotocol'])) {
+ if ($pconfig['gateway'] == $gwg_name) {
+ $selected = " selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ echo "<option value=\"{$gwg_name}\" $selected>{$gwg_name}</option>\n";
+ }
+ }
+ }
+?>
+ </select>
+ <p><?=gettext("Leave as 'default' to use the system routing table. Or choose a gateway to utilize policy based routing.");?></p>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("In/Out");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvinoutbox" <?php if (!empty($pconfig['dnpipe'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_inout()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showinoutadv" <?php if (empty($pconfig['dnpipe'])) echo "style='display:none'"; ?>>
+ <select name="dnpipe">
+<?php
+ if (!is_array($dnqlist)) {
+ $dnqlist = array();
+ }
+ echo "<option value=\"\"";
+ if (!$dnqselected) {
+ echo " selected=\"selected\"";
+ }
+ echo " >none</option>";
+ foreach ($dnqlist as $dnq => $dnqkey) {
+ if ($dnq == "") {
+ continue;
+ }
+ echo "<option value=\"$dnq\"";
+ if ($dnq == $pconfig['dnpipe']) {
+ $dnqselected = 1;
+ echo " selected=\"selected\"";
+ }
+ echo ">{$dnq}</option>";
+ }
+?>
+ </select> /
+ <select name="pdnpipe">
+<?php
+ $dnqselected = 0;
+ echo "<option value=\"\"";
+ if (!$dnqselected) {
+ echo " selected=\"selected\"";
+ }
+ echo " >none</option>";
+ foreach ($dnqlist as $dnq => $dnqkey) {
+ if ($dnq == "") {
+ continue;
+ }
+ echo "<option value=\"$dnq\"";
+ if ($dnq == $pconfig['pdnpipe']) {
+ $dnqselected = 1;
+ echo " selected=\"selected\"";
+ }
+ echo ">{$dnq}</option>";
+ }
+?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Choose the Out queue/Virtual interface only if you have also selected In.")."<br />".gettext("The Out selection is applied to traffic leaving the interface where the rule is created, In is applied to traffic coming into the chosen interface.")."<br />".gettext("If you are creating a floating rule, if the direction is In then the same rules apply, if the direction is out the selections are reverted Out is for incoming and In is for outgoing.");?></span>
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Ackqueue/Queue");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvackqueuebox" <?php if (!empty($pconfig['defaultqueue'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_ackqueue()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showackqueueadv" <?php if (empty($pconfig['defaultqueue'])) echo "style='display:none'"; ?>>
+ <select name="ackqueue">
+<?php
+ if (!is_array($qlist)) {
+ $qlist = array();
+ }
+ echo "<option value=\"\"";
+ if (!$qselected) {
+ echo " selected=\"selected\"";
+ }
+ echo " >none</option>";
+ foreach ($qlist as $q => $qkey) {
+ if ($q == "") {
+ continue;
+ }
+ echo "<option value=\"$q\"";
+ if ($q == $pconfig['ackqueue']) {
+ $qselected = 1;
+ echo " selected=\"selected\"";
+ }
+ if (isset($ifdisp[$q])) {
+ echo ">{$ifdisp[$q]}</option>";
+ } else {
+ echo ">{$q}</option>";
+ }
+ }
+?>
+ </select> /
+ <select name="defaultqueue">
+<?php
+ $qselected = 0;
+ echo "<option value=\"\"";
+ if (!$qselected) {
+ echo " selected=\"selected\"";
+ }
+ echo " >none</option>";
+ foreach ($qlist as $q => $qkey) {
+ if ($q == "") {
+ continue;
+ }
+ echo "<option value=\"$q\"";
+ if ($q == $pconfig['defaultqueue']) {
+ $qselected = 1;
+ echo " selected=\"selected\"";
+ }
+ if (isset($ifdisp[$q])) {
+ echo ">{$ifdisp[$q]}</option>";
+ } else {
+ echo ">{$q}</option>";
+ }
+ }
+?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Choose the Acknowledge Queue only if you have selected Queue.");?></span>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Layer7");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvlayer7box" <?php if (!empty($pconfig['l7container'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_layer7()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showlayer7adv" <?php if (empty($pconfig['l7container'])) echo "style='display:none'"; ?>>
+ <select name="l7container">
+<?php
+ if (!is_array($l7clist)) {
+ $l7clist = array();
+ }
+ echo "<option value=\"\"";
+ echo " >none</option>";
+ foreach ($l7clist as $l7ckey) {
+ echo "<option value=\"{$l7ckey}\"";
+ if ($l7ckey == $pconfig['l7container']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$l7ckey}</option>";
+ }
+?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Choose a Layer7 container to apply application protocol inspection rules. " .
+ "These are valid for TCP and UDP protocols only.");?>
+ </span>
+ </div>
+ </td>
+ </tr>
+<?php
+ // Allow extending of the firewall edit page and include custom input validation
+ pfSense_handle_custom_code("/usr/local/pkg/firewall_rules/htmlphplate");
+?>
+<?php
+$has_created_time = (isset($a_filter[$id]['created']) && is_array($a_filter[$id]['created']));
+$has_updated_time = (isset($a_filter[$id]['updated']) && is_array($a_filter[$id]['updated']));
+?>
+ <?php if ($has_created_time || $has_updated_time): ?>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Rule Information");?></td>
+ </tr>
+ <?php if ($has_created_time): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Created");?></td>
+ <td width="78%" class="vtable">
+ <?= date(gettext("n/j/y H:i:s"), $a_filter[$id]['created']['time']) ?> <?= gettext("by") ?> <strong><?= $a_filter[$id]['created']['username'] ?></strong>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php if ($has_updated_time): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Updated");?></td>
+ <td width="78%" class="vtable">
+ <?= date(gettext("n/j/y H:i:s"), $a_filter[$id]['updated']['time']) ?> <?= gettext("by") ?> <strong><?= $a_filter[$id]['updated']['username'] ?></strong>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ &nbsp;<br />&nbsp;
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+<?php if (isset($id) && $a_filter[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <input name="tracker" type="hidden" value="<?=htmlspecialchars($pconfig['tracker']);?>">
+<?php endif; ?>
+ <input name="after" type="hidden" value="<?=htmlspecialchars($after);?>" />
+ </td>
+ </tr>
+ </table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+ ext_change();
+ typesel_change();
+ proto_change();
+ <?php if ((!empty($pconfig['srcbeginport']) && $pconfig['srcbeginport'] != "any") || (!empty($pconfig['srcendport']) && $pconfig['srcendport'] != "any")): ?>
+ show_source_port_range();
+ <?php endif; ?>
+
+ var addressarray = <?= json_encode(get_alias_list(array("host", "network", "openvpn", "urltable"))) ?>;
+ var customarray = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
+
+ var oTextbox1 = new AutoSuggestControl(document.getElementById("src"), new StateSuggestions(addressarray));
+ var oTextbox2 = new AutoSuggestControl(document.getElementById("srcbeginport_cust"), new StateSuggestions(customarray));
+ var oTextbox3 = new AutoSuggestControl(document.getElementById("srcendport_cust"), new StateSuggestions(customarray));
+ var oTextbox4 = new AutoSuggestControl(document.getElementById("dst"), new StateSuggestions(addressarray));
+ var oTextbox5 = new AutoSuggestControl(document.getElementById("dstbeginport_cust"), new StateSuggestions(customarray));
+ var oTextbox6 = new AutoSuggestControl(document.getElementById("dstendport_cust"), new StateSuggestions(customarray));
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_schedule.php b/src/usr/local/www/firewall_schedule.php
new file mode 100644
index 0000000..e6b7a21
--- /dev/null
+++ b/src/usr/local/www/firewall_schedule.php
@@ -0,0 +1,255 @@
+<?php
+/*
+ firewall_schedule.php
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: schedules
+*/
+##|+PRIV
+##|*IDENT=page-firewall-schedules
+##|*NAME=Firewall: Schedules page
+##|*DESCR=Allow access to the 'Firewall: Schedules' page.
+##|*MATCH=firewall_schedule.php*
+##|-PRIV
+
+
+$dayArray = array (gettext('Mon'), gettext('Tues'), gettext('Wed'), gettext('Thur'), gettext('Fri'), gettext('Sat'), gettext('Sun'));
+$monthArray = array (gettext('January'), gettext('February'), gettext('March'), gettext('April'), gettext('May'), gettext('June'), gettext('July'), gettext('August'), gettext('September'), gettext('October'), gettext('November'), gettext('December'));
+
+require("guiconfig.inc");
+require_once("filter.inc");
+require("shaper.inc");
+
+$pgtitle = array(gettext("Firewall"), gettext("Schedules"));
+
+if (!is_array($config['schedules']['schedule'])) {
+ $config['schedules']['schedule'] = array();
+}
+
+$a_schedules = &$config['schedules']['schedule'];
+
+
+if ($_GET['act'] == "del") {
+ if ($a_schedules[$_GET['id']]) {
+ /* make sure rule is not being referenced by any nat or filter rules */
+ $is_schedule_referenced = false;
+ $referenced_by = false;
+ $schedule_name = $a_schedules[$_GET['id']]['name'];
+
+ if (is_array($config['filter']['rule'])) {
+ foreach ($config['filter']['rule'] as $rule) {
+ //check for this later once this is established
+ if ($rule['sched'] == $schedule_name) {
+ $referenced_by = $rule['descr'];
+ $is_schedule_referenced = true;
+ break;
+ }
+ }
+ }
+
+ if ($is_schedule_referenced == true) {
+ $savemsg = sprintf(gettext("Cannot delete Schedule. Currently in use by %s"), $referenced_by);
+ } else {
+ unset($a_schedules[$_GET['id']]);
+ write_config();
+ header("Location: firewall_schedule.php");
+ exit;
+ }
+ }
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form action="firewall_schedule.php" method="post">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall schedule">
+ <tr>
+ <td width="25%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="35%" class="listhdrr"><?=gettext("Time Range(s)");?></td>
+ <td width="35%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="5%" class="list sort_ignore">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle"><a href="firewall_schedule_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new schedule");?>" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php $i = 0; foreach ($a_schedules as $schedule): ?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='firewall_schedule_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($schedule['name']);?>
+ <?php
+ $schedstatus = filter_get_time_based_rule_status($schedule);
+ if ($schedstatus) { ?>
+ &nbsp;<img src="./themes/<?= $g['theme']; ?>/images/icons/icon_frmfld_time.png" title="<?=gettext("Schedule is currently active");?>" width="17" height="17" border="0" alt="schedule" />
+ <?php } ?>
+ </td>
+ <td class="listlr" ondblclick="document.location='firewall_schedule_edit.php?id=<?=$i;?>';">
+ <table width="98%" border="0" cellpadding="0" cellspacing="0" summary="schedule">
+ <?php
+ foreach ($schedule['timerange'] as $timerange) {
+ $tempFriendlyTime = "";
+ $tempID = "";
+ $firstprint = false;
+ if ($timerange) {
+ $dayFriendly = "";
+ $tempFriendlyTime = "";
+
+ //get hours
+ $temptimerange = $timerange['hour'];
+ $temptimeseparator = strrpos($temptimerange, "-");
+
+ $starttime = substr ($temptimerange, 0, $temptimeseparator);
+ $stoptime = substr ($temptimerange, $temptimeseparator+1);
+
+ if ($timerange['month']) {
+ $tempmontharray = explode(",", $timerange['month']);
+ $tempdayarray = explode(",", $timerange['day']);
+ $arraycounter = 0;
+ $firstDayFound = false;
+ $firstPrint = false;
+ foreach ($tempmontharray as $monthtmp) {
+ $month = $tempmontharray[$arraycounter];
+ $day = $tempdayarray[$arraycounter];
+
+ if (!$firstDayFound) {
+ $firstDay = $day;
+ $firstmonth = $month;
+ $firstDayFound = true;
+ }
+
+ $currentDay = $day;
+ $nextDay = $tempdayarray[$arraycounter+1];
+ $currentDay++;
+ if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])) {
+ if ($firstPrint) {
+ $dayFriendly .= "<br />";
+ }
+ $currentDay--;
+ if ($currentDay != $firstDay) {
+ $dayFriendly .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
+ } else {
+ $dayFriendly .= $monthArray[$month-1] . " " . $day;
+ }
+ $firstDayFound = false;
+ $firstPrint = true;
+ }
+ $arraycounter++;
+ }
+ } else {
+ $tempdayFriendly = $timerange['position'];
+ $firstDayFound = false;
+ $tempFriendlyDayArray = explode(",", $tempdayFriendly);
+ $currentDay = "";
+ $firstDay = "";
+ $nextDay = "";
+ $counter = 0;
+ foreach ($tempFriendlyDayArray as $day) {
+ if ($day != "") {
+ if (!$firstDayFound) {
+ $firstDay = $tempFriendlyDayArray[$counter];
+ $firstDayFound = true;
+ }
+ $currentDay =$tempFriendlyDayArray[$counter];
+ //get next day
+ $nextDay = $tempFriendlyDayArray[$counter+1];
+ $currentDay++;
+ if ($currentDay != $nextDay) {
+ if ($firstprint) {
+ $dayFriendly .= "<br />";
+ }
+ $currentDay--;
+ if ($currentDay != $firstDay) {
+ $dayFriendly .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
+ } else {
+ $dayFriendly .= $dayArray[$firstDay-1];
+ }
+ $firstDayFound = false;
+ $firstprint = true;
+ }
+ $counter++;
+ }
+ }
+ }
+ $timeFriendly = $starttime . "-" . $stoptime;
+ $description = $timerange['rangedescr'];
+
+ ?>
+ <tr>
+ <td><?=$dayFriendly;?></td>
+ <td><?=$timeFriendly;?></td>
+ <td><?=$description;?></td>
+ </tr>
+ <?php
+ }
+ }//end for
+ ?>
+ </table>
+ </td>
+ <td class="listbg" ondblclick="document.location='firewall_schedule_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($schedule['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="buttons">
+ <tr>
+ <td valign="middle"><a href="firewall_schedule_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit alias");?>" alt="edit" /></a></td>
+ <td><a href="firewall_schedule.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext('Do you really want to delete this schedule?');?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete alias");?>" alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php $i++; endforeach; ?>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle"><a href="firewall_schedule_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new schedule");?>" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont" colspan="3">
+ <p><span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br /></strong></span><?=gettext("Schedules act as placeholders for time ranges to be used in Firewall Rules.");?></span></p>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_schedule_edit.php b/src/usr/local/www/firewall_schedule_edit.php
new file mode 100644
index 0000000..e7c4bca
--- /dev/null
+++ b/src/usr/local/www/firewall_schedule_edit.php
@@ -0,0 +1,1151 @@
+<?php
+/*
+ firewall_schedule_edit.php
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: schedules
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-schedules-edit
+##|*NAME=Firewall: Schedules: Edit page
+##|*DESCR=Allow access to the 'Firewall: Schedules: Edit' page.
+##|*MATCH=firewall_schedule_edit.php*
+##|-PRIV
+
+function schedulecmp($a, $b) {
+ return strcmp($a['name'], $b['name']);
+}
+
+function schedule_sort() {
+ global $g, $config;
+
+ if (!is_array($config['schedules']['schedule'])) {
+ return;
+ }
+
+ usort($config['schedules']['schedule'], "schedulecmp");
+}
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$pgtitle = array(gettext("Firewall"), gettext("Schedules"), gettext("Edit"));
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_schedule.php');
+}
+
+$dayArray = array (gettext('Mon'), gettext('Tues'), gettext('Wed'), gettext('Thur'), gettext('Fri'), gettext('Sat'), gettext('Sun'));
+$monthArray = array (gettext('January'), gettext('February'), gettext('March'), gettext('April'), gettext('May'), gettext('June'), gettext('July'), gettext('August'), gettext('September'), gettext('October'), gettext('November'), gettext('December'));
+
+if (!is_array($config['schedules']['schedule'])) {
+ $config['schedules']['schedule'] = array();
+}
+
+$a_schedules = &$config['schedules']['schedule'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_schedules[$id]) {
+ $pconfig['name'] = $a_schedules[$id]['name'];
+ $pconfig['descr'] = html_entity_decode($a_schedules[$id]['descr']);
+ $pconfig['timerange'] = $a_schedules[$id]['timerange'];
+ $pconfig['schedlabel'] = $a_schedules[$id]['schedlabel'];
+ $getSchedule = true;
+}
+
+if ($_POST) {
+
+ if (strtolower($_POST['name']) == "lan") {
+ $input_errors[] = gettext("Schedule may not be named LAN.");
+ }
+ if (strtolower($_POST['name']) == "wan") {
+ $input_errors[] = gettext("Schedule may not be named WAN.");
+ }
+ if (strtolower($_POST['name']) == "") {
+ $input_errors[] = gettext("Schedule name cannot be blank.");
+ }
+
+ $x = is_validaliasname($_POST['name']);
+ if (!isset($x)) {
+ $input_errors[] = gettext("Reserved word used for schedule name.");
+ } else {
+ if (is_validaliasname($_POST['name']) == false) {
+ $input_errors[] = gettext("The schedule name may only consist of the characters a-z, A-Z, 0-9");
+ }
+ }
+
+ /* check for name conflicts */
+ foreach ($a_schedules as $schedule) {
+ if (isset($id) && ($a_schedules[$id]) && ($a_schedules[$id] === $schedule)) {
+ continue;
+ }
+
+ if ($schedule['name'] == $_POST['name']) {
+ $input_errors[] = gettext("A Schedule with this name already exists.");
+ break;
+ }
+ }
+ $schedule = array();
+
+ $schedule['name'] = $_POST['name'];
+ $schedule['descr'] = htmlentities($_POST['descr'], ENT_QUOTES, 'UTF-8');
+
+ $timerangeFound = false;
+ for ($x = 0; $x < 99; $x++) {
+ if ($_POST['schedule' . $x]) {
+ if (!preg_match('/^[0-9]+:[0-9]+$/', $_POST['starttime' . $x])) {
+ $input_errors[] = sprintf(gettext("Invalid start time - '%s'"), $_POST['starttime' . $x]);
+ continue;
+ }
+ if (!preg_match('/^[0-9]+:[0-9]+$/', $_POST['stoptime' . $x])) {
+ $input_errors[] = sprintf(gettext("Invalid stop time - '%s'"), $_POST['stoptime' . $x]);
+ continue;
+ }
+ $timerangeFound = true;
+ $timeparts = array();
+ $firstprint = false;
+ $timestr = $_POST['schedule' . $x];
+ $timehourstr = $_POST['starttime' . $x];
+ $timehourstr .= "-";
+ $timehourstr .= $_POST['stoptime' . $x];
+ $timedescrstr = htmlentities($_POST['timedescr' . $x], ENT_QUOTES, 'UTF-8');
+ $dashpos = strpos($timestr, '-');
+ if ($dashpos === false) {
+ $timeparts['position'] = $timestr;
+ } else {
+ $tempindarray = array();
+ $monthstr = "";
+ $daystr = "";
+ $tempindarray = explode(",", $timestr);
+ foreach ($tempindarray as $currentselection) {
+ if ($currentselection) {
+ if ($firstprint) {
+ $monthstr .= ",";
+ $daystr .= ",";
+ }
+ $tempstr = "";
+ $monthpos = strpos($currentselection, "m");
+ $daypos = strpos($currentselection, "d");
+ $monthstr .= substr($currentselection, $monthpos+1, $daypos-$monthpos-1);
+ $daystr .= substr($currentselection, $daypos+1);
+ $firstprint = true;
+ }
+ }
+ $timeparts['month'] = $monthstr;
+ $timeparts['day'] = $daystr;
+ }
+ $timeparts['hour'] = $timehourstr;
+ $timeparts['rangedescr'] = $timedescrstr;
+ $schedule['timerange'][$x] = $timeparts;
+ }
+ }
+
+ if (!$timerangeFound) {
+ $input_errors[] = gettext("The schedule must have at least one time range configured.");
+ }
+
+ if (!$input_errors) {
+
+ if (!empty($pconfig['schedlabel'])) {
+ $schedule['schedlabel'] = $pconfig['schedlabel'];
+ } else {
+ $schedule['schedlabel'] = uniqid();
+ }
+
+ if (isset($id) && $a_schedules[$id]) {
+ $a_schedules[$id] = $schedule;
+ } else {
+ $a_schedules[] = $schedule;
+ }
+ schedule_sort();
+ if (write_config()) {
+ filter_configure();
+ }
+
+ header("Location: firewall_schedule.php");
+ exit;
+ } else {
+ //we received input errors, copy data to prevent retype
+ if (!$_POST['schedule0']) {
+ $getSchedule = false;
+ } else {
+ $getSchedule = true;
+ }
+ $pconfig['name'] = $schedule['name'];
+ $pconfig['descr'] = $schedule['descr'];
+ $pconfig['timerange'] = $schedule['timerange'];
+ }
+
+}
+include("head.inc");
+
+/* put your custom HTML head content here */
+/* using some of the $pfSenseHead function calls */
+$jscriptstr = <<<EOD
+<script type="text/javascript">
+//<![CDATA[
+var daysSelected = "";
+var month_array = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
+var day_array = ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'];
+var schCounter = 0;
+
+function rgb2hex(rgb) {
+ var parts = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
+ if (parts == null) {
+ return;
+ }
+ function hex(x) {
+ return ("0" + parseInt(x).toString(16)).slice(-2);
+ }
+ return ("#" + hex(parts[1]) + hex(parts[2]) + hex(parts[3])).toUpperCase();
+}
+
+function repeatExistingDays() {
+ var tempstr, tempstrdaypos, week, daypos, dayposdone = "";
+
+ var dayarray = daysSelected.split(",");
+ for (i = 0; i <= dayarray.length; i++) {
+ tempstr = dayarray[i];
+ tempstrdaypos = tempstr.search("p");
+ week = tempstr.substring(1, tempstrdaypos);
+ week = parseInt(week);
+ dashpos = tempstr.search("-");
+ daypos = tempstr.substring(tempstrdaypos+1, dashpos);
+ daypos = parseInt(daypos);
+
+ daydone = dayposdone.search(daypos);
+ tempstr = 'w' + week + 'p' + daypos;
+ daycell = eval('document.getElementById(tempstr)');
+ if (daydone == "-1") {
+ if (rgb2hex(daycell.style.backgroundColor) == "#F08080") { // lightcoral
+ daytogglerepeating(week, daypos, true);
+ } else {
+ daytogglerepeating(week, daypos, false);
+ }
+ dayposdone += daypos + ",";
+ }
+ }
+}
+
+function daytogglerepeating(week, daypos, bExists) {
+ var tempstr, daycell, dayoriginal = "";
+ for (j=1; j<=53; j++) {
+ tempstr = 'w' + j + 'p' + daypos;
+ daycell = eval('document.getElementById(tempstr)');
+ dayoriginalpos = daysSelected.indexOf(tempstr);
+
+ //if bExists set to true, means cell is already select it
+ //unselect it and remove original day from daysSelected string
+
+ if (daycell != null) {
+ if (bExists) {
+ daycell.style.backgroundColor = "#FFFFFF"; // white
+ } else {
+ daycell.style.backgroundColor = "#F08080"; // lightcoral
+ }
+
+ if (dayoriginalpos != "-1") {
+ dayoriginalend = daysSelected.indexOf(',', dayoriginalpos);
+ tempstr = daysSelected.substring(dayoriginalpos, dayoriginalend+1);
+ daysSelected = daysSelected.replace(tempstr, "");
+
+ }
+ }
+ }
+}
+
+function daytoggle(id) {
+ var runrepeat, tempstr = "";
+ var bFoundValid = false;
+
+ iddashpos = id.search("-");
+ var tempstrdaypos = id.search("p");
+ var week = id.substring(1, tempstrdaypos);
+ week = parseInt(week);
+
+ if (iddashpos == "-1") {
+ idmod = id;
+ runrepeat = true;
+ var daypos = id.substr(tempstrdaypos+1);
+ } else {
+ idmod = id.substring(0, iddashpos);
+ var daypos = id.substring(tempstrdaypos+1, iddashpos);
+ }
+
+ daypos = parseInt(daypos);
+
+ while (!bFoundValid) {
+ var daycell = document.getElementById(idmod);
+
+ if (daycell != null) {
+ if (rgb2hex(daycell.style.backgroundColor) == "#FF0000") { // red
+ daycell.style.backgroundColor = "#FFFFFF"; // white
+ str = id + ",";
+ daysSelected = daysSelected.replace(str, "");
+ } else if (rgb2hex(daycell.style.backgroundColor) == "#F08080") { // lightcoral
+ daytogglerepeating(week, daypos, true);
+ } else {
+ //color is white cell
+ if (!runrepeat) {
+ daycell.style.backgroundColor = "#FF0000"; // red
+ } else {
+ daycell.style.backgroundColor = "#F08080"; // lightcoral
+ daytogglerepeating(week, daypos, false);
+ }
+ daysSelected += id + ",";
+ }
+ bFoundValid = true;
+ } else {
+ //we found an invalid cell when column was clicked, move up to the next week
+ week++;
+ tempstr = "w" + week + "p" + daypos;
+ idmod = tempstr;
+ }
+ }
+}
+
+function update_month() {
+ var indexNum = document.forms[0].monthsel.selectedIndex;
+ var selected = document.forms[0].monthsel.options[indexNum].text;
+
+ for (i = 0; i <= 11; i++) {
+ option = document.forms[0].monthsel.options[i].text;
+ document.popupMonthLayer = eval('document.getElementById (option)');
+
+ if (selected == option) {
+ document.popupMonthLayer.style.display="block";
+ } else {
+ document.popupMonthLayer.style.display="none";
+ }
+ }
+}
+
+function checkForRanges() {
+ if (daysSelected != "") {
+ alert("You have not saved the specified time range. Please click 'Add Time' button to save the time range.");
+ return false;
+ } else {
+ return true;
+ }
+}
+
+function processEntries() {
+ var tempstr, starttimehour, starttimemin, stoptimehour, stoptimemin, errors = "";
+ var passedValidiation = true;
+
+ //get time specified
+ starttimehour = parseInt(document.getElementById("starttimehour").value);
+ starttimemin = parseInt(document.getElementById("starttimemin").value);
+ stoptimehour = parseInt(document.getElementById("stoptimehour").value);
+ stoptimemin = parseInt(document.getElementById("stoptimemin").value);
+
+
+ //do time checks
+ if (starttimehour > stoptimehour) {
+ errors = "Error: Start Hour cannot be greater than Stop Hour.";
+ passedValidiation = false;
+
+ } else if (starttimehour == stoptimehour) {
+ if (starttimemin > stoptimemin) {
+ errors = "Error: Start Minute cannot be greater than Stop Minute.";
+ passedValidiation = false;
+ }
+ }
+
+ if (passedValidiation) {
+ addTimeRange();
+ } else {
+ if (errors != "") {
+ alert(errors);
+ }
+ }
+}
+
+function addTimeRange() {
+ var tempdayarray = daysSelected.split(",");
+ var tempstr, tempFriendlyDay, starttimehour, starttimemin, stoptimehour, nrtempFriendlyTime, rtempFriendlyTime, nrtempID, rtempID = "";
+ var stoptimemin, timeRange, tempstrdaypos, week, daypos, day, month, dashpos, nrtempTime, rtempTime, monthstr, daystr = "";
+ rtempFriendlyTime = "";
+ nrtempFriendlyTime = "";
+ nrtempID = "";
+ rtempID = "";
+ nrtempTime = "";
+ rtempTime = "";
+ tempdayarray.sort();
+ rtempFriendlyDay = "";
+ monthstr = "";
+ daystr = "";
+
+ //check for existing entries
+ var findCurrentCounter;
+ for (u = 0; u < 99; u++) {
+ findCurrentCounter = document.getElementById("schedule" + u);
+ if (!findCurrentCounter) {
+ schCounter = u;
+ break;
+ }
+ }
+
+ if (daysSelected != "") {
+ //get days selected
+ for (i = 0; i < tempdayarray.length; i++) {
+ tempstr = tempdayarray[i];
+ if (tempstr != "") {
+ tempstrdaypos = tempstr.search("p");
+ week = tempstr.substring(1, tempstrdaypos);
+ week = parseInt(week);
+ dashpos = tempstr.search("-");
+
+ if (dashpos != "-1") {
+ var nonrepeatingfound = true;
+ daypos = tempstr.substring(tempstrdaypos+1, dashpos);
+ daypos = parseInt(daypos);
+ monthpos = tempstr.search("m");
+ tempstrdaypos = tempstr.search("d");
+ month = tempstr.substring(monthpos+1, tempstrdaypos);
+ month = parseInt(month);
+ day = tempstr.substring(tempstrdaypos+1);
+ day = parseInt(day);
+ monthstr += month + ",";
+ daystr += day + ",";
+ nrtempID += tempstr + ",";
+ } else {
+ var repeatingfound = true;
+ daypos = tempstr.substr(tempstrdaypos+1);
+ daypos = parseInt(daypos);
+ rtempFriendlyDay += daypos + ",";
+ rtempID += daypos + ",";
+ }
+ }
+ }
+
+ //code below spits out friendly look format for nonrepeating schedules
+ var foundEnd = false;
+ var firstDayFound = false;
+ var firstprint = false;
+ var tempFriendlyMonthArray = monthstr.split(",");
+ var tempFriendlyDayArray = daystr.split(",");
+ var currentDay, firstDay, nextDay, currentMonth, nextMonth, firstDay, firstMonth = "";
+ for (k = 0; k < tempFriendlyMonthArray.length; k++) {
+ tempstr = tempFriendlyMonthArray[k];
+ if (tempstr != "") {
+ if (!firstDayFound) {
+ firstDay = tempFriendlyDayArray[k];
+ firstDay = parseInt(firstDay);
+ firstMonth = tempFriendlyMonthArray[k];
+ firstMonth = parseInt(firstMonth);
+ firstDayFound = true;
+ }
+ currentDay = tempFriendlyDayArray[k];
+ currentDay = parseInt(currentDay);
+ //get next day
+ nextDay = tempFriendlyDayArray[k+1];
+ nextDay = parseInt(nextDay);
+ //get next month
+
+ currentDay++;
+ if ((currentDay != nextDay) || (tempFriendlyMonthArray[k] != tempFriendlyMonthArray[k+1])) {
+ if (firstprint) {
+ nrtempFriendlyTime += ", ";
+ }
+ currentDay--;
+ if (currentDay != firstDay) {
+ nrtempFriendlyTime += month_array[firstMonth-1] + " " + firstDay + "-" + currentDay;
+ } else {
+ nrtempFriendlyTime += month_array[firstMonth-1] + " " + currentDay;
+ }
+ firstDayFound = false;
+ firstprint = true;
+ }
+ }
+ }
+
+ //code below spits out friendly look format for repeating schedules
+ foundEnd = false;
+ firstDayFound = false;
+ firstprint = false;
+ tempFriendlyDayArray = rtempFriendlyDay.split(",");
+ tempFriendlyDayArray.sort();
+ currentDay, firstDay, nextDay = "";
+ for (k = 0; k < tempFriendlyDayArray.length; k++) {
+ tempstr = tempFriendlyDayArray[k];
+ if (tempstr != "") {
+ if (!firstDayFound) {
+ firstDay = tempFriendlyDayArray[k];
+ firstDay = parseInt(firstDay);
+ firstDayFound = true;
+ }
+ currentDay = tempFriendlyDayArray[k];
+ currentDay = parseInt(currentDay);
+ //get next day
+ nextDay = tempFriendlyDayArray[k+1];
+ nextDay = parseInt(nextDay);
+ currentDay++;
+ if (currentDay != nextDay) {
+ if (firstprint) {
+ rtempFriendlyTime += ", ";
+ }
+ currentDay--;
+ if (currentDay != firstDay) {
+ rtempFriendlyTime += day_array[firstDay-1] + " - " + day_array[currentDay-1];
+ } else {
+ rtempFriendlyTime += day_array[firstDay-1];
+ }
+ firstDayFound = false;
+ firstprint = true;
+ }
+ }
+ }
+
+ //sort the tempID
+ var tempsortArray = rtempID.split(",");
+ var isFirstdone = false;
+ tempsortArray.sort();
+ //clear tempID
+ rtempID = "";
+ for (t = 0; t < tempsortArray.length; t++) {
+ if (tempsortArray[t] != "") {
+ if (!isFirstdone) {
+ rtempID += tempsortArray[t];
+ isFirstdone = true;
+ } else {
+ rtempID += "," + tempsortArray[t];
+ }
+ }
+ }
+
+
+ //get time specified
+ starttimehour = document.getElementById("starttimehour").value
+ starttimemin = document.getElementById("starttimemin").value;
+ stoptimehour = document.getElementById("stoptimehour").value;
+ stoptimemin = document.getElementById("stoptimemin").value;
+
+ timeRange = "||" + starttimehour + ":";
+ timeRange += starttimemin + "-";
+ timeRange += stoptimehour + ":";
+ timeRange += stoptimemin;
+
+ //get description for time range
+ var tempdescr = document.getElementById("timerangedescr").value
+
+ if (nonrepeatingfound) {
+ nrtempTime += nrtempID;
+ //add time ranges
+ nrtempTime += timeRange;
+ //add description
+ nrtempTime += "||" + tempdescr;
+ insertElements(nrtempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, nrtempTime, nrtempID);
+ }
+
+ if (repeatingfound) {
+ rtempTime += rtempID;
+ //add time ranges
+ rtempTime += timeRange;
+ //add description
+ rtempTime += "||" + tempdescr;
+ insertElements(rtempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, rtempTime, rtempID);
+ }
+
+ } else {
+ //no days were selected, alert user
+ alert ("You must select at least 1 day before adding time");
+ }
+}
+
+function insertElements(tempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, tempTime, tempID) {
+
+ //add it to the schedule list
+ d = document;
+ tbody = d.getElementById("scheduletable").getElementsByTagName("tbody").item(0);
+ tr = d.createElement("tr");
+ td = d.createElement("td");
+ td.innerHTML= "<span class='vexpl'>" + tempFriendlyTime + "<\/span>";
+ tr.appendChild(td);
+
+ td = d.createElement("td");
+ td.innerHTML="<input type='text' readonly class='vexpl' name='starttime" + schCounter + "' id='starttime" + schCounter + "' style=' word-wrap:break-word; width:100%; border:0px solid;' value='" + starttimehour + ":" + starttimemin + "' />";
+ tr.appendChild(td);
+
+ td = d.createElement("td");
+ td.innerHTML="<input type='text' readonly class='vexpl' name='stoptime" + schCounter + "' id='stoptime" + schCounter + "' style=' word-wrap:break-word; width:100%; border:0px solid;' value='" + stoptimehour + ":" + stoptimemin + "' />";
+ tr.appendChild(td);
+
+ td = d.createElement("td");
+ td.innerHTML="<input type='text' readonly class='vexpl' name='timedescr" + schCounter + "' id='timedescr" + schCounter + "' style=' word-wrap:break-word; width:100%; border:0px solid;' value='" + tempdescr + "' />";
+ tr.appendChild(td);
+
+ td = d.createElement("td");
+ td.innerHTML = "<a onclick='editRow(\"" + tempTime + "\",this); return false;' href='#'><img border='0' src='/themes/" + theme + "/images/icons/icon_e.gif' alt='edit' /></\a>";
+ tr.appendChild(td);
+
+ td = d.createElement("td");
+ td.innerHTML = "<a onclick='removeRow(this); return false;' href='#'><img border='0' src='/themes/" + theme + "/images/icons/icon_x.gif' alt='remove' /></\a>";
+ tr.appendChild(td);
+
+ td = d.createElement("td");
+ td.innerHTML="<input type='hidden' id='schedule" + schCounter + "' name='schedule" + schCounter + "' value='" + tempID + "' />";
+ tr.appendChild(td);
+ tbody.appendChild(tr);
+
+ schCounter++;
+
+ //reset calendar and time and descr
+ clearCalendar();
+ clearTime();
+ clearDescr();
+}
+
+
+function clearCalendar() {
+ var tempstr, daycell = "";
+ //clear days selected
+ daysSelected = "";
+ //loop through all 52 weeks
+ for (j=1; j<=53; j++) {
+ //loop through all 7 days
+ for (k=1; k<8; k++) {
+ tempstr = 'w' + j + 'p' + k;
+ daycell = eval('document.getElementById(tempstr)');
+ if (daycell != null) {
+ daycell.style.backgroundColor = "#FFFFFF"; // white
+ }
+ }
+ }
+}
+
+function clearTime() {
+ document.getElementById("starttimehour").value = "0";
+ document.getElementById("starttimemin").value = "00";
+ document.getElementById("stoptimehour").value = "23";
+ document.getElementById("stoptimemin").value = "59";
+}
+
+function clearDescr() {
+ document.getElementById("timerangedescr").value = "";
+}
+
+function editRow(incTime, el) {
+ var check = checkForRanges();
+
+ if (check) {
+
+ //reset calendar and time
+ clearCalendar();
+ clearTime();
+
+ var starttimehour, descr, days, tempstr, starttimemin, hours, stoptimehour, stoptimemin = "";
+
+ tempArray = incTime.split ("||");
+
+ days = tempArray[0];
+ hours = tempArray[1];
+ descr = tempArray[2];
+
+ var tempdayArray = days.split(",");
+ var temphourArray = hours.split("-");
+ tempstr = temphourArray[0];
+ var temphourArray2 = tempstr.split(":");
+
+ document.getElementById("starttimehour").value = temphourArray2[0];
+ document.getElementById("starttimemin").value = temphourArray2[1];
+
+ tempstr = temphourArray[1];
+ temphourArray2 = tempstr.split(":");
+
+ document.getElementById("stoptimehour").value = temphourArray2[0];
+ document.getElementById("stoptimemin").value = temphourArray2[1];
+
+ document.getElementById("timerangedescr").value = descr;
+
+ //toggle the appropriate days
+ for (i = 0; i < tempdayArray.length; i++) {
+ if (tempdayArray[i]) {
+ var tempweekstr = tempdayArray[i];
+ dashpos = tempweekstr.search("-");
+
+ if (dashpos == "-1") {
+ tempstr = "w2p" + tempdayArray[i];
+ } else {
+ tempstr = tempdayArray[i];
+ }
+ daytoggle(tempstr);
+ }
+ }
+ removeRownoprompt(el);
+ }
+}
+
+function removeRownoprompt(el) {
+ var cel;
+ while (el && el.nodeName.toLowerCase() != "tr") {
+ el = el.parentNode;
+ }
+
+ if (el && el.parentNode) {
+ cel = el.getElementsByTagName("td").item(0);
+ el.parentNode.removeChild(el);
+ }
+}
+
+
+function removeRow(el) {
+ var check = confirm ("Do you really want to delete this time range?");
+ if (check) {
+ var cel;
+ while (el && el.nodeName.toLowerCase() != "tr") {
+ el = el.parentNode;
+ }
+
+ if (el && el.parentNode) {
+ cel = el.getElementsByTagName("td").item(0);
+ el.parentNode.removeChild(el);
+ }
+ }
+}
+//]]>
+</script>
+EOD;
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+
+
+<?php include("fbegin.inc"); echo $jscriptstr; ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<div id="inputerrors"></div>
+
+<form action="firewall_schedule_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall schedule">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Schedule information");?></td>
+ </tr>
+ <tr>
+ <td>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="15%" valign="top" class="vncellreq"><?=gettext("Schedule Name");?></td>
+ <td width="85%" class="vtable">
+ <?php if (is_schedule_inuse($pconfig['name']) == true): ?>
+ <input name="name" type="hidden" id="name" size="40" value="<?=htmlspecialchars($pconfig['name']);?>" />
+ <?php echo $pconfig['name']; ?>
+ <p>
+ <span class="vexpl"><?=gettext("NOTE: This schedule is in use so the name may not be modified!");?></span>
+ </p>
+ <?php else: ?>
+ <input name="name" type="text" id="name" size="40" maxlength="40" class="formfld unknown" value="<?=htmlspecialchars($pconfig['name']);?>" /><br />
+ <span class="vexpl">
+ <?=gettext("The name of the alias may only consist of the characters a-z, A-Z and 0-9");?>
+ </span>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="15%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="85%" class="vtable"><input name="descr" type="text" id="descr" size="40" maxlength="40" class="formfld unknown" value="<?=htmlspecialchars($pconfig['descr']);?>" /><br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed).");?>
+ </span>
+ </td>
+ </tr>
+ <!-- tr>
+ </tr -->
+ <tr>
+ <td width="15%" valign="top" class="vncellreq"><?=gettext("Month");?></td>
+ <td width="85%" class="vtable">
+ <select name="monthsel" class="formselect" id="monthsel" onchange="update_month();">
+ <?php
+ $monthcounter = date("n");
+ $monthlimit = $monthcounter + 12;
+ $yearcounter = date("Y");
+ for ($k = 0; $k < 12; $k++) {?>
+ <option value="<?php echo $monthcounter;?>"><?php echo date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?></option>
+ <?php
+ if ($monthcounter == 12) {
+ $monthcounter = 1;
+ $yearcounter++;
+ } else {
+ $monthcounter++;
+ }
+ } ?>
+ </select>
+ <br /><br />
+ <?php
+ $firstmonth = TRUE;
+ $monthcounter = date("n");
+ $yearcounter = date("Y");
+ for ($k = 0; $k < 12; $k++) {
+ $firstdayofmonth = date("w", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));
+ if ($firstdayofmonth == 0) {
+ $firstdayofmonth = 7;
+ }
+
+ $daycounter = 1;
+ //number of day in month
+ $numberofdays = date("t", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));
+ $firstdayprinted = FALSE;
+ $lasttr = FALSE;
+ $positioncounter = 1;//7 for Sun, 1 for Mon, 2 for Tues, etc
+ ?>
+ <div id="<?php echo date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?>" style=" position:relative; display:<?php if ($firstmonth)echo "block";else echo "none";?>">
+ <table border="1" cellspacing="1" cellpadding="1" id="calTable<?=$monthcounter . $yearcounter;?>" class="tabcont" summary="month">
+ <tr>
+ <td colspan="7" align="center" class="listbg"><b><?php echo date("F_Y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?></b></td>
+ </tr>
+ <tr>
+ <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p1');"><u><b><?=gettext("Mon");?></b></u></td>
+ <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p2');"><u><b><?=gettext("Tue");?></b></u></td>
+ <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p3');"><u><b><?=gettext("Wed");?></b></u></td>
+ <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p4');"><u><b><?=gettext("Thu");?></b></u></td>
+ <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p5');"><u><b><?=gettext("Fri");?></b></u></td>
+ <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p6');"><u><b><?=gettext("Sat");?></b></u></td>
+ <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p7');"><u><b><?=gettext("Sun");?></b></u></td>
+ </tr>
+ <?php
+ $firstmonth = FALSE;
+ while ($daycounter<=$numberofdays) {
+ $weekcounter = date("W", mktime(0, 0, 0, date($monthcounter), date($daycounter), date($yearcounter)));
+ $weekcounter = ltrim($weekcounter, "0");
+ if ($positioncounter == 1) {
+ echo "<tr>";
+ }
+ if ($firstdayofmonth == $positioncounter) {
+ ?>
+ <td align="center" style="cursor: pointer;" class="listr" id="w<?=$weekcounter;?>p<?=$positioncounter;?>" onclick="daytoggle('w<?=$weekcounter;?>p<?=$positioncounter;?>-m<?=$monthcounter;?>d<?=$daycounter;?>');">
+ <?php
+ echo $daycounter;
+ $daycounter++;
+ $firstdayprinted = TRUE;
+ echo "</td>";
+ } elseif ($firstdayprinted == TRUE && $daycounter <= $numberofdays) {
+ ?>
+ <td align="center" style="cursor: pointer;" class="listr" id="w<?=$weekcounter;?>p<?=$positioncounter;?>" onclick="daytoggle('w<?=$weekcounter;?>p<?=$positioncounter;?>-m<?=$monthcounter;?>d<?=$daycounter;?>');">
+ <?php
+ echo $daycounter;
+ $daycounter++;
+ echo "</td>";
+ } else {
+ echo "<td align=\"center\" class=\"listr\"></td>";
+ }
+
+ if ($positioncounter == 7 || $daycounter > $numberofdays) {
+ $positioncounter = 1;
+ echo "</tr>";
+ } else {
+ $positioncounter++;
+ }
+
+ } //end while loop
+ ?>
+ </table>
+ </div>
+ <?php
+ if ($monthcounter == 12) {
+ $monthcounter = 1;
+ $yearcounter++;
+ } else {
+ $monthcounter++;
+ }
+ } //end for loop
+ ?>
+ <br />
+ <?=gettext("Click individual date to select that date only. Click the appropriate weekday Header to select all occurrences of that weekday.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="15%" valign="top" class="vncellreq"><?=gettext("Time");?></td>
+ <td width="85%" class="vtable">
+ <table cellspacing="2" class="tabcont" summary="time">
+ <tr>
+ <td class="listhdrr" align="center"><?=gettext("Start Time");?></td><td></td><td class="listhdrr" align="center"><?=gettext("Stop Time");?></td>
+ </tr>
+ <tr>
+ <td>
+ <select name="starttimehour" class="formselect" id="starttimehour">
+ <?php
+ for ($i = 0; $i < 24; $i++) {
+ echo "<option value=\"$i\">";
+ echo $i;
+ echo "</option>";
+ }
+ ?>
+ </select>&nbsp;<?=gettext("Hr"); ?>&nbsp;&nbsp;
+ <select name="starttimemin" class="formselect" id="starttimemin">
+ <option value="00">00</option>
+ <option value="15">15</option>
+ <option value="30">30</option>
+ <option value="45">45</option>
+ <option value="59">59</option>
+ </select>&nbsp;<?=gettext("Min"); ?>
+ </td>
+ <td></td>
+ <td>
+ <select name="stoptimehour" class="formselect" id="stoptimehour">
+ <?php
+ for ($i = 0; $i < 24; $i++) {
+ if ($i == 23) {
+ $selected = "selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+
+ echo "<option value=\"$i\" $selected>";
+ echo $i;
+ echo "</option>";
+ }
+ ?>
+ </select>&nbsp;<?=gettext("Hr");?>&nbsp;&nbsp;
+ <select name="stoptimemin" class="formselect" id="stoptimemin">
+ <option value="00">00</option>
+ <option value="15">15</option>
+ <option value="30">30</option>
+ <option value="45">45</option>
+ <option value="59" selected="selected">59</option>
+ </select>&nbsp;<?=gettext("Min");?>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <?=gettext("Select the time range for the day(s) selected on the Month(s) above. A full day is 0:00-23:59.")?>
+ </td>
+ </tr>
+ <tr>
+ <td width="15%" valign="top" class="vncell"><?=gettext("Time Range Description")?></td>
+ <td width="85%" class="vtable"><input name="timerangedescr" type="text" class="formfld unknown" id="timerangedescr" size="40" maxlength="40" /><br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed).")?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="button" value="<?=gettext("Add Time");?>" class="formbtn" onclick="javascript:processEntries();" />&nbsp;&nbsp;&nbsp;
+ <input type="button" value="<?=gettext("Clear Selection");?>" class="formbtn" onclick="javascript:clearCalendar(); clearTime(); clearDescr();" />
+ </td>
+ </tr>
+ <tr>
+ <td width="15%" valign="top" class="vtable"></td>
+ <td width="85%" class="vtable"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Schedule repeat");?></td>
+ </tr>
+ <tr>
+ <td width="15%" valign="top" class="vncellreq"><?=gettext("Configured Ranges");?></td>
+ <td width="85%">
+ <table id="scheduletable" summary="range">
+ <tbody>
+ <tr>
+ <td align="center" class="listbg" width="35%"><?=gettext("Day(s)");?></td>
+ <td align="center" class="listbg" width="12%"><?=gettext("Start Time");?></td>
+ <td align="center" class="listbg" width="11%"><?=gettext("Stop Time");?></td>
+ <td align="center" class="listbg" width="42%"><?=gettext("Description");?></td>
+ </tr>
+ <?php
+ if ($getSchedule) {
+ $counter = 0;
+
+ foreach ($pconfig['timerange'] as $timerange) {
+ $tempFriendlyTime = "";
+ $tempID = "";
+ if ($timerange) {
+ $dayFriendly = "";
+ $tempFriendlyTime = "";
+ $timedescr = $timerange['rangedescr'];
+
+ //get hours
+ $temptimerange = $timerange['hour'];
+ $temptimeseparator = strrpos($temptimerange, "-");
+
+ $starttime = substr ($temptimerange, 0, $temptimeseparator);
+ $stoptime = substr ($temptimerange, $temptimeseparator+1);
+ $currentDay = "";
+ $firstDay = "";
+ $nextDay = "";
+ $foundEnd = false;
+ $firstDayFound = false;
+ $firstPrint = false;
+ $firstprint2 = false;
+
+ if ($timerange['month']) {
+ $tempmontharray = explode(",", $timerange['month']);
+ $tempdayarray = explode(",", $timerange['day']);
+ $arraycounter = 0;
+ foreach ($tempmontharray as $monthtmp) {
+ $month = $tempmontharray[$arraycounter];
+ $day = $tempdayarray[$arraycounter];
+ $daypos = date("w", mktime(0, 0, 0, date($month), date($day), date("Y")));
+ //if sunday, set position to 7 to get correct week number. This is due to php limitations on ISO-8601. When we move to php5.1 we can change this.
+ if ($daypos == 0) {
+ $daypos = 7;
+ }
+ $weeknumber = date("W", mktime(0, 0, 0, date($month), date($day), date("Y")));
+ $weeknumber = ltrim($weeknumber, "0");
+
+ if ($firstPrint) {
+ $tempID .= ",";
+ }
+ $tempID .= "w" . $weeknumber . "p" . $daypos . "-m" . $month . "d" . $day;
+ $firstPrint = true;
+
+ if (!$firstDayFound) {
+ $firstDay = $day;
+ $firstmonth = $month;
+ $firstDayFound = true;
+ }
+
+ $currentDay = $day;
+ $nextDay = $tempdayarray[$arraycounter+1];
+ $currentDay++;
+ if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])) {
+ if ($firstprint2) {
+ $tempFriendlyTime .= ", ";
+ }
+ $currentDay--;
+ if ($currentDay != $firstDay) {
+ $tempFriendlyTime .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ;
+ } else {
+ $tempFriendlyTime .= $monthArray[$month-1] . " " . $day;
+ }
+ $firstDayFound = false;
+ $firstprint2 = true;
+ }
+ $arraycounter++;
+ }
+ } else {
+ $dayFriendly = $timerange['position'];
+ $tempID = $dayFriendly;
+ }
+
+ $tempTime = $tempID . "||" . $starttime . "-" . $stoptime . "||" . $timedescr;
+
+ //following code makes the days friendly appearing, IE instead of Mon, Tues, Wed it will show Mon - Wed
+ $foundEnd = false;
+ $firstDayFound = false;
+ $firstprint = false;
+ $tempFriendlyDayArray = explode(",", $dayFriendly);
+ $currentDay = "";
+ $firstDay = "";
+ $nextDay = "";
+ $i = 0;
+ if (!$timerange['month']) {
+ foreach ($tempFriendlyDayArray as $day) {
+ if ($day != "") {
+ if (!$firstDayFound) {
+ $firstDay = $tempFriendlyDayArray[$i];
+ $firstDayFound = true;
+ }
+ $currentDay =$tempFriendlyDayArray[$i];
+ //get next day
+ $nextDay = $tempFriendlyDayArray[$i+1];
+ $currentDay++;
+ if ($currentDay != $nextDay) {
+ if ($firstprint) {
+ $tempFriendlyTime .= ", ";
+ }
+ $currentDay--;
+ if ($currentDay != $firstDay) {
+ $tempFriendlyTime .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1];
+ } else {
+ $tempFriendlyTime .= $dayArray[$firstDay-1];
+ }
+ $firstDayFound = false;
+ $firstprint = true;
+ }
+ $i++;
+ }
+ }
+ }
+ ?>
+ <tr>
+ <td>
+ <span class="vexpl"><?php echo $tempFriendlyTime; ?></span>
+ </td>
+ <td>
+ <input type='text' readonly='readonly' class='vexpl' name='starttime<?php echo $counter; ?>' id='starttime<?php echo $counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?php echo $starttime; ?>' />
+ </td>
+ <td>
+ <input type='text' readonly='readonly' class='vexpl' name='stoptime<?php echo $counter; ?>' id='stoptime<?php echo $counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?php echo $stoptime; ?>' />
+ </td>
+ <td>
+ <input type='text' readonly='readonly' class='vexpl' name='timedescr<?php echo $counter; ?>' id='timedescr<?php echo $counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?php echo $timedescr; ?>' />
+ </td>
+ <td>
+ <a onclick='editRow("<?php echo $tempTime; ?>",this); return false;' href='#'><img border='0' src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_e.gif' alt='edit' /></a>
+ </td>
+ <td>
+ <a onclick='removeRow(this); return false;' href='#'><img border='0' src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif' alt='remove' /></a>
+ </td>
+ <td>
+ <input type='hidden' id='schedule<?php echo $counter; ?>' name='schedule<?php echo $counter; ?>' value='<?php echo $tempID; ?>' />
+ </td>
+ </tr>
+ <?php
+ $counter++;
+ }//end if
+ } // end foreach
+ }//end if
+ ?>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="15%" valign="top">&nbsp;</td>
+ <td width="85%">
+ <input id="submit" name="submit" type="submit" onclick="return checkForRanges();" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_schedules[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_shaper.php b/src/usr/local/www/firewall_shaper.php
new file mode 100644
index 0000000..7b8f489
--- /dev/null
+++ b/src/usr/local/www/firewall_shaper.php
@@ -0,0 +1,486 @@
+<?php
+/* $Id$ */
+/*
+ firewall_shaper.php
+ Copyright (C) 2004, 2005 Scott Ullrich
+ Copyright (C) 2008 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/killall
+ pfSense_MODULE: shaper
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-trafficshaper
+##|*NAME=Firewall: Traffic Shaper page
+##|*DESCR=Allow access to the 'Firewall: Traffic Shaper' page.
+##|*MATCH=firewall_shaper.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("rrd.inc");
+
+if ($_GET['reset'] <> "") {
+ /* XXX: Huh, why are we killing php? */
+ mwexec("killall -9 pfctl php");
+ exit;
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("Traffic Shaper"));
+$shortcut_section = "trafficshaper";
+
+$shaperIFlist = get_configured_interface_with_descr();
+read_altq_config();
+/*
+ * The whole logic in these code maybe can be specified.
+ * If you find a better way contact me :).
+ */
+
+if ($_GET) {
+ if ($_GET['queue']) {
+ $qname = htmlspecialchars(trim($_GET['queue']));
+ }
+ if ($_GET['interface']) {
+ $interface = htmlspecialchars(trim($_GET['interface']));
+ }
+ if ($_GET['action']) {
+ $action = htmlspecialchars($_GET['action']);
+ }
+}
+if ($_POST) {
+ if ($_POST['name']) {
+ $qname = htmlspecialchars(trim($_POST['name']));
+ }
+ if ($_POST['interface']) {
+ $interface = htmlspecialchars(trim($_POST['interface']));
+ }
+ if ($_POST['parentqueue']) {
+ $parentqueue = htmlspecialchars(trim($_POST['parentqueue']));
+ }
+}
+
+if ($interface) {
+ $altq = $altq_list_queues[$interface];
+ if ($altq) {
+ $queue =& $altq->find_queue($interface, $qname);
+ } else {
+ $addnewaltq = true;
+ }
+}
+
+$dontshow = false;
+$newqueue = false;
+$output_form = "";
+
+if ($_GET) {
+ switch ($action) {
+ case "delete":
+ if ($queue) {
+ $queue->delete_queue();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ }
+ header("Location: firewall_shaper.php");
+ exit;
+ break;
+ case "resetall":
+ foreach ($altq_list_queues as $altq) {
+ $altq->delete_all();
+ }
+ unset($altq_list_queues);
+ $altq_list_queues = array();
+ $tree = "<ul class=\"tree\" >";
+ $tree .= get_interface_list_to_show();
+ $tree .= "</ul>";
+ unset($config['shaper']['queue']);
+ unset($queue);
+ unset($altq);
+ $can_add = false;
+ $can_enable = false;
+ $dontshow = true;
+ foreach ($config['filter']['rule'] as $key => $rule) {
+ if (isset($rule['wizard']) && $rule['wizard'] == "yes") {
+ unset($config['filter']['rule'][$key]);
+ }
+ }
+ if (write_config()) {
+ $retval = 0;
+ $retval |= filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+ } else {
+ $savemsg = gettext("Unable to write config.xml (Access Denied?)");
+ }
+ $output_form = $default_shaper_message;
+
+ break;
+ case "add":
+ /* XXX: Find better way because we shouldn't know about this */
+ if ($altq) {
+ switch ($altq->GetScheduler()) {
+ case "PRIQ":
+ $q = new priq_queue();
+ break;
+ case "FAIRQ":
+ $q = new fairq_queue();
+ break;
+ case "HFSC":
+ $q = new hfsc_queue();
+ break;
+ case "CBQ":
+ $q = new cbq_queue();
+ break;
+ default:
+ /* XXX: Happens when sched == NONE?! */
+ $q = new altq_root_queue();
+ break;
+ }
+ } else if ($addnewaltq) {
+ $q = new altq_root_queue();
+ } else {
+ $input_errors[] = gettext("Could not create new queue/discipline!");
+ }
+
+ if ($q) {
+ $q->SetInterface($interface);
+ $output_form .= $q->build_form();
+ $output_form .= "<input type=\"hidden\" name=\"parentqueue\" id=\"parentqueue\"";
+ $output_form .= " value=\"".htmlspecialchars($qname)."\" />";
+ $newjavascript = $q->build_javascript();
+ unset($q);
+ $newqueue = true;
+ }
+ break;
+ case "show":
+ if ($queue) {
+ $output_form .= $queue->build_form();
+ } else {
+ $input_errors[] = gettext("Queue not found!");
+ }
+ break;
+ case "enable":
+ if ($queue) {
+ $queue->SetEnabled("on");
+ $output_form .= $queue->build_form();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ } else {
+ $input_errors[] = gettext("Queue not found!");
+ }
+ break;
+ case "disable":
+ if ($queue) {
+ $queue->SetEnabled("");
+ $output_form .= $queue->build_form();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ } else {
+ $input_errors[] = gettext("Queue not found!");
+ }
+ break;
+ default:
+ $output_form .= $default_shaper_msg;
+ $dontshow = true;
+ break;
+ }
+} else if ($_POST) {
+ unset($input_errors);
+
+ if ($addnewaltq) {
+ $altq =& new altq_root_queue();
+ $altq->SetInterface($interface);
+
+ switch ($altq->GetBwscale()) {
+ case "Mb":
+ $factor = 1000 * 1000;
+ brak;
+ case "Kb":
+ $factor = 1000;
+ break;
+ case "b":
+ $factor = 1;
+ break;
+ case "Gb":
+ $factor = 1000 * 1000 * 1000;
+ break;
+ case "%": /* We don't use it for root_XXX queues. */
+ default: /* XXX assume Kb by default. */
+ $factor = 1000;
+ break;
+ }
+ $altq->SetAvailableBandwidth($altq->GetBandwidth() * $factor);
+ $altq->ReadConfig($_POST);
+ $altq->validate_input($_POST, $input_errors);
+ if (!$input_errors) {
+ unset($tmppath);
+ $tmppath[] = $altq->GetInterface();
+ $altq->SetLink($tmppath);
+ $altq->wconfig();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ $can_enable = true;
+ $can_add = true;
+ }
+ read_altq_config();
+ $output_form .= $altq->build_form();
+
+ } else if ($parentqueue) { /* Add a new queue */
+ $qtmp =& $altq->find_queue($interface, $parentqueue);
+ if ($qtmp) {
+ $tmppath =& $qtmp->GetLink();
+ array_push($tmppath, $qname);
+ $tmp =& $qtmp->add_queue($interface, $_POST, $tmppath, $input_errors);
+ if (!$input_errors) {
+ array_pop($tmppath);
+ $tmp->wconfig();
+ $can_enable = true;
+ if ($tmp->CanHaveChildren() && $can_enable) {
+ if ($tmp->GetDefault() <> "") {
+ $can_add = false;
+ } else {
+ $can_add = true;
+ }
+ } else {
+ $can_add = false;
+ }
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ $can_enable = true;
+ if ($altq->GetScheduler() != "PRIQ") { /* XXX */
+ if ($tmp->GetDefault() <> "") {
+ $can_add = false;
+ } else {
+ $can_add = true;
+ }
+ }
+ }
+ read_altq_config();
+ $output_form .= $tmp->build_form();
+ } else {
+ $input_errors[] = gettext("Could not add new queue.");
+ }
+ } else if ($_POST['apply']) {
+ write_config();
+
+ $retval = 0;
+ $retval = filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+
+ /* reset rrd queues */
+ system("rm -f /var/db/rrd/*queuedrops.rrd");
+ system("rm -f /var/db/rrd/*queues.rrd");
+ enable_rrd_graphing();
+
+ clear_subsystem_dirty('shaper');
+
+ if ($queue) {
+ $output_form .= $queue->build_form();
+ $dontshow = false;
+ } else {
+ $output_form .= $default_shaper_message;
+ $dontshow = true;
+ }
+ } else if ($queue) {
+ $queue->validate_input($_POST, $input_errors);
+ if (!$input_errors) {
+ $queue->update_altq_queue_data($_POST);
+ $queue->wconfig();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ $dontshow = false;
+ }
+ read_altq_config();
+ $output_form .= $queue->build_form();
+ } else {
+ $output_form .= $default_shaper_msg;
+ $dontshow = true;
+ }
+ mwexec("killall qstats");
+} else {
+ $output_form .= $default_shaper_msg;
+ $dontshow = true;
+}
+
+if ($queue) {
+ if ($queue->GetEnabled()) {
+ $can_enable = true;
+ } else {
+ $can_enable = false;
+ }
+ if ($queue->CanHaveChildren() && $can_enable) {
+ if ($altq->GetQname() <> $queue->GetQname() && $queue->GetDefault() <> "") {
+ $can_add = false;
+ } else {
+ $can_add = true;
+ }
+ } else {
+ $can_add = false;
+ }
+}
+
+$tree = "<ul class=\"tree\" >";
+if (is_array($altq_list_queues)) {
+ foreach ($altq_list_queues as $tmpaltq) {
+ $tree .= $tmpaltq->build_tree();
+ }
+ $tree .= get_interface_list_to_show();
+}
+$tree .= "</ul>";
+
+if (!$dontshow || $newqueue) {
+
+ $output_form .= "<tr><td width=\"22%\" valign=\"middle\" class=\"vncellreq\">";
+ $output_form .= "<br />" . gettext("Queue Actions") . "<br />";
+ $output_form .= "</td><td valign=\"middle\" class=\"vncellreq\" width=\"78%\"><br />";
+
+ $output_form .= "<input type=\"submit\" name=\"Submit\" value=\"" . gettext("Save") . "\" class=\"formbtn\" />";
+ if ($can_add || $addnewaltq) {
+ $output_form .= "<a href=\"firewall_shaper.php?interface=";
+ $output_form .= $interface;
+ if ($queue) {
+ $output_form .= "&amp;queue=" . $queue->GetQname();
+ }
+ $output_form .= "&amp;action=add\">";
+ $output_form .= "<input type=\"button\" class=\"formbtn\" name=\"add\" value=\"" . gettext("Add new queue") . "\" />";
+ $output_form .= "</a>";
+ }
+ $output_form .= "<a href=\"firewall_shaper.php?interface=";
+ $output_form .= $interface . "&amp;queue=";
+ if ($queue) {
+ $output_form .= "&amp;queue=" . $queue->GetQname();
+ }
+ $output_form .= "&amp;action=delete\">";
+ $output_form .= "<input type=\"button\" class=\"formbtn\" name=\"delete\"";
+ if ($queue) {
+ $output_form .= " value=\"" . gettext("Delete this queue") . "\" />";
+ } else {
+ $output_form .= " value=\"" . gettext("Disable shaper on interface") . "\" />";
+ }
+ $output_form .= "</a>";
+ $output_form .= "<br /></td></tr>";
+ $output_form .= "</table>";
+} else {
+ $output_form .= "</table>";
+}
+
+$output = "<table summary=\"output form\">";
+$output .= $output_form;
+
+//$pgtitle = "Firewall: Shaper: By Interface View";
+$closehead = false;
+include("head.inc");
+?>
+<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
+<script type="text/javascript" src="./tree/tree.js"></script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" >
+<?php
+if ($queue) {
+ echo $queue->build_javascript();
+}
+echo $newjavascript;
+
+include("fbegin.inc");
+?>
+<div id="inputerrors"></div>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<form action="firewall_shaper.php" method="post" id="iform" name="iform">
+
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('shaper')): ?><p>
+<?php print_info_box_np(gettext("The traffic shaper configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));?><br /></p>
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("By Interface"), true, "firewall_shaper.php");
+ $tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
+ $tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
+ $tab_array[3] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
+ $tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+<?php if (count($altq_list_queues) > 0): ?>
+ <tr class="tabcont">
+ <td width="25%" align="left">
+ <a href="firewall_shaper.php?action=resetall" >
+ <input type="button" value="<?=gettext("Remove Shaper")?>" class="formbtn" />
+ </a>
+ </td>
+ <td width="75%"> </td>
+ </tr>
+<?php endif; ?>
+ <tr>
+ <td width="25%" valign="top" align="left">
+ <?php
+ echo $tree;
+ ?>
+ </td>
+ <td width="75%" valign="top" align="center">
+ <div id="shaperarea" style="position:relative">
+ <?php
+ echo $output;
+ ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_shaper_layer7.php b/src/usr/local/www/firewall_shaper_layer7.php
new file mode 100644
index 0000000..9a72233
--- /dev/null
+++ b/src/usr/local/www/firewall_shaper_layer7.php
@@ -0,0 +1,584 @@
+<?php
+/* $Id$ */
+/*
+ firewall_shaper_layer7.php
+ Copyright (C) 2008 Helder Pereira, André Ribeiro
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/killall
+ pfSense_MODULE: shaper
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-trafficshaper-layer7
+##|*NAME=Firewall: Traffic Shaper: Layer7 page
+##|*DESCR=Allow access to the 'Firewall: Traffic Shaper: Layer7' page.
+##|*MATCH=firewall_shaper_layer7.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+// Variables protocols (dynamic) and structures (static)
+$avail_protos =& generate_protocols_array();
+$avail_structures = array("action", "queue", "limiter");
+
+// Available behaviours
+$avail_behaviours_action = array("block");
+read_altq_config();
+$avail_behaviours_altq = get_altq_name_list();
+read_dummynet_config();
+$avail_behaviours_limiter = get_dummynet_name_list();
+$show_proto_form = false;
+
+//More variables
+$pgtitle = array(gettext("Firewall"), gettext("Traffic Shaper"), gettext("Layer7"));
+$shortcut_section = "trafficshaper";
+
+$output_form = "";
+
+$default_layer7shaper_msg = "<tr><td colspan=\"4\">";
+$default_layer7shaper_msg .= "<span class=\"vexpl\"><span class=\"red\"><strong>" . gettext("Note") . ":<br />";
+$default_layer7shaper_msg .= "</strong></span>" . gettext("You can add new layer7 protocol patterns by simply uploading the file") . " <a href=\"diag_patterns.php\">" . gettext("here") . ".</a></span><br />";
+$default_layer7shaper_msg .= "</td></tr>";
+
+read_layer7_config();
+
+if ($_GET['reset'] <> "") {
+ // kill all ipfw-classifyd processes
+ mwexec("killall -9 ipfw-classifyd");
+ exit;
+}
+
+if ($_GET) {
+ if ($_GET['container']) {
+ $name = htmlspecialchars(trim($_GET['container']));
+ }
+ if ($_GET['action']) {
+ $action = htmlspecialchars($_GET['action']);
+ }
+}
+
+if ($_POST) {
+ if ($_POST['container']) {
+ $name = htmlspecialchars(trim($_POST['container']));
+ }
+}
+
+if ($name) {
+ //Get the object from the 7rules list
+ $container = $layer7_rules_list[$name];
+}
+
+if ($_GET) {
+ switch ($action) {
+ case "add":
+ $show_proto_form = true;
+ $container = new layer7();
+ $output_form .= $container->build_form(); //constructs the graphical interface on the right side
+ unset($container);
+ break;
+ case "show":
+ $show_proto_form = true;
+ if ($container) {
+ $output_form .= $container->build_form();
+ } else {
+ $show_proto_form = false;
+ $input_errors[] = gettext("Layer7 Rules Container not found!");
+ }
+ break;
+ default:
+ echo log_error("Get default");
+ $show_proto_form = false;
+ $output_form .= $dn_default_shaper_msg . $default_layer7shaper_msg;
+ break;
+ }
+} else if ($_POST) {
+ //add a new l7rules container
+ $show_proto_form = true;
+ unset($input_errors);
+
+ if ($_POST['submit']) {
+ if (isset($layer7_rules_list[$name])) {
+ $l7r = $layer7_rules_list[$name];
+ $_POST['divert_port'] = $l7r->GetRPort();
+ } else {
+ $l7r =& new layer7();
+ $_POST['divert_port'] = $l7r->gen_divert_port();
+ }
+ for ($i = 0; $_POST['protocol'][$i] <> ""; $i++) {
+ $_POST['l7rules'][$i]['protocol'] = $_POST['protocol'][$i];
+ $_POST['l7rules'][$i]['structure'] = $_POST['structure'][$i];
+ $_POST['l7rules'][$i]['behaviour'] = $_POST['behaviour'][$i];
+ }
+ $l7r->validate_input($_POST, $input_errors);
+ $l7r->ReadConfig($_POST['container'], $_POST);
+ //Before writing the results, we need to test for repeated protocols
+ $non_dupes = array();
+ $dupes = array();
+ for ($j = 0; $j < $i; $j++) {
+ if (!$non_dupes[$_POST['protocol'][$j]]) {
+ $non_dupes[$_POST['protocol'][$j]] = true;
+ } else {
+ $dupes[] = $_POST['protocol'][$j];
+ }
+ }
+ unset($non_dupes);
+ if (sizeof($dupes) == 0 && !$input_errors) {
+ $l7r->wconfig();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+
+ read_layer7_config();
+ } else {
+ if (sizeof($dupes) > 0) {
+ $dupe_error = gettext("Found the following repeated protocol definitions") . ": ";
+ foreach ($dupes as $dupe) {
+ $dupe_error .= "$dupe ";
+ }
+ $input_errors[] .= $dupe_error;
+ }
+ }
+ unset($dupes);
+ unset($dupe_error);
+ //Even if there are repeated protocols, we won't lose any previous values
+ //The user will be able to solve the situation
+ $output_form .= $l7r->build_form();
+ //Necessary to correctly build the proto form
+ $container = $layer7_rules_list[$name];
+ if ($input_errors) {
+ $container =& $l7r;
+ }
+ } else if ($_POST['apply']) {
+ write_config();
+
+ $retval = 0;
+ $retval = filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+
+ clear_subsystem_dirty('shaper');
+
+ if ($container) {
+ $output_form .= $container->build_form();
+ } else {
+ $show_proto_form = false;
+ $output_form .= $dn_default_shaper_msg . $default_layer7shaper_msg;
+ }
+ } else if ($_POST['delete']) {
+ $container->delete_l7c();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ unset($container);
+
+ header("Location: firewall_shaper_layer7.php");
+ exit;
+ } else {
+ $show_proto_form = false;
+ }
+} else {
+ $show_proto_form = false;
+ $output_form .= $dn_default_shaper_msg . $default_layer7shaper_msg;
+}
+
+// Builds the left tree
+$tree = "<ul class=\"tree\" >";
+if (is_array($layer7_rules_list)) {
+ foreach ($layer7_rules_list as $tmpl7) {
+ $tree .= $tmpl7->build_tree();
+ }
+}
+$tree .= "</ul>";
+$closehead = false;
+include("head.inc");
+?>
+<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
+<script type="text/javascript" src="./tree/tree.js"></script>
+
+<script type="text/javascript">
+//<![CDATA[
+var initial_count = new Array();
+var rows_limit = 0; // Set to 0 to disable limitation
+
+/* Build the behaviours arrays in javascript */
+var js_behaviours_action = ['block']; //static
+
+var js_behaviours_altq = new Array();
+js_behaviours_altq = array_altq(js_behaviours_altq);
+
+var js_behaviours_limiter = new Array();
+js_behaviours_limiter = array_limiter(js_behaviours_limiter);
+
+function array_altq(a_behav) {
+ var index;
+ <?php
+ if (!empty($avail_behaviours_altq)) {
+ foreach ($avail_behaviours_altq as $key => $queue) { ?>
+ name = "<?= $queue; ?>";
+ index = <?= $key; ?>;
+ a_behav[index] = name;
+ <?php
+ }
+ } ?>
+ return a_behav;
+}
+
+function array_limiter(a_behav) {
+ var index;
+ <?php
+ if (!empty($avail_behaviours_limiter)) {
+ foreach ($avail_behaviours_limiter as $key => $limiter) { ?>
+ name = "<?= $limiter; ?>";
+ index = <?= $key; ?>;
+ a_behav[index] = name;
+ <?php
+ }
+ } ?>
+ return a_behav;
+}
+
+/* Fill the variables with available protocols, structures and behaviours */
+function fillProtocol() {
+ var protocol = '<select name="protocol[]" style="font-size:8pt">';
+ var name;
+
+ <?php foreach ($avail_protos as $key => $proto) { ?>
+ name = "<?= $proto; ?>";
+ protocol += "<option value=" + name + ">" + name + "<\/option>";
+ <?php } ?>
+ protocol += "<\/select>";
+
+ return protocol;
+}
+
+function fillStructure() {
+ var structure = '<select name="structure[]" style="font-size:8pt" onchange="changeBehaviourValues(this.parentNode.parentNode);">';
+ var name;
+ <?php foreach ($avail_structures as $key => $struct) { ?>
+ name = "<?= $struct; ?>";
+ if (name == "queue") {
+ if (js_behaviours_altq != "") {
+ structure += "<option value=" + name + ">" + name + "<\/option>";
+ }
+ } else {
+ if (name == "limiter") {
+ if (js_behaviours_limiter != "") {
+ structure += "<option value=" + name + ">" + name + "<\/option>";
+ }
+ } else {
+ structure += "<option value=" + name + ">" + name + "<\/option>"; //action
+ }
+ }
+ <?php } ?>
+ structure += "<\/select>";
+
+ return structure;
+}
+
+//Used by default to fill the values when inserting a new row.
+function fillBehaviour() {
+ var behaviour = '<select name="behaviour[]" style="width:80px; font-size:8pt">';
+ var name;
+ <?php foreach ($avail_behaviours_action as $key => $behav) { ?>
+ name = "<?= $behav; ?>";
+ behaviour += "<option value=" + name + ">" + name + "<\/option>";
+ <?php } ?>
+ behaviour += "<\/select>";
+
+ return behaviour;
+}
+
+/* Change the values on behaviours select when changing the structure row */
+function changeBehaviourValues(row) {
+ var selectedRow = row.rowIndex - 2; //because row.rowIndex returns 2, not 0
+ var structureSelected = document.getElementsByName("structure[]")[selectedRow].value;
+
+ //Select the behaviours values to array a_behav
+ var a_behav = new Array();
+ if (structureSelected == "action") {
+ a_behav = js_behaviours_action; //static
+ } else {
+ if (structureSelected == "queue") {
+ a_behav = js_behaviours_altq;
+ } else {
+ a_behav = js_behaviours_limiter;
+ }
+ }
+
+ //Build the html statement with the array values previously selected
+ var new_behav;
+ var name;
+ for (i = 0; i < a_behav.length; i++) {
+ new_behav += "<option value=" + a_behav[i] + ">" + a_behav[i] + "<\/option>";
+ }
+
+ document.getElementsByName("behaviour[]")[selectedRow].innerHTML = new_behav;
+}
+
+/* Add row to the table */
+function addRow(table_id) {
+ var tbl = document.getElementById(table_id);
+ // counting rows in table
+ var rows_count = tbl.rows.length;
+ if (initial_count[table_id] == undefined) {
+ // if it is first adding in this table setting initial rows count
+ initial_count[table_id] = rows_count;
+ }
+ // determining real count of added fields
+ var tFielsNum = rows_count - initial_count[table_id];
+ if (rows_limit != 0 && tFielsNum >= rows_limit) return false;
+
+ var remove = '<a onclick="removeRow(\''+table_id+'\',this.parentNode.parentNode)" href="#"><img border="0" src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="x" /><\/a>';
+
+ try {
+ var newRow = tbl.insertRow(rows_count);
+ var newCell = newRow.insertCell(0);
+ newCell.innerHTML = fillProtocol();
+ var newCell = newRow.insertCell(1);
+ newCell.innerHTML = fillStructure();
+ var newCell = newRow.insertCell(2);
+ newCell.innerHTML = fillBehaviour();
+ var newCell = newRow.insertCell(3);
+ newCell.innerHTML = remove;
+ }
+ catch (ex) {
+ //if exception occurs
+ alert(ex);
+ }
+}
+
+/* Remove row from the table */
+function removeRow(tbl, row) {
+ var table = document.getElementById(tbl);
+ try {
+ table.deleteRow(row.rowIndex);
+ } catch (ex) {
+ alert(ex);
+ }
+}
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+<div id="inputerrors"></div>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<form action="firewall_shaper_layer7.php" method="post" id="iform" name="iform">
+
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('shaper')): ?><p>
+<?php print_info_box_np(gettext("The traffic shaper configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br /></p>
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper layer7">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
+ $tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
+ $tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
+ $tab_array[3] = array(gettext("Layer7"), true, "firewall_shaper_layer7.php");
+ $tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+
+ <?php if (count($layer7_rules_list) > 0): ?>
+ <tr class="tabcont">
+ <td width="25%" align="left"></td>
+ <td width="75%"> </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="25%" valign="top" align="left">
+ <?php
+ echo $tree;
+ ?>
+ <br /><br />
+ <a href="firewall_shaper_layer7.php?action=add">
+ <img src="./themes/<?=$g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("Create new l7 rules group"); ?>" width="17" height="17" border="0" alt="add" /> <?=gettext("Create new l7 rules group"); ?>
+ </a>
+ <br />
+ </td>
+ <td width="75%" valign="top" align="center">
+ <div id="shaperarea" style="position:relative">
+ <table summary="output form">
+ <?php
+ echo $output_form;
+ ?>
+
+ <!-- Layer 7 rules form -->
+ <?php if ($show_proto_form): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">
+ <div id="addressnetworkport">
+ <?=gettext("Rule(s)"); ?>
+ </div>
+ </td>
+
+ <td width="78%" class="vtable">
+ <table width="236" id="maintable" summary="main table">
+ <tbody>
+ <tr>
+ <td colspan="4">
+ <div style="font-size: 8pt; padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066;" id="itemhelp">
+ <?=gettext("Add one or more rules"); ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div style="font-size: 8pt; padding:5px;" id="onecolumn">
+ <?=gettext("Protocol"); ?>
+ </div>
+ </td>
+ <td>
+ <div style="font-size: 8pt; padding:5px;" id="twocolumn">
+ <?=gettext("Structure"); ?>
+ </div>
+ </td>
+ <td>
+ <div style="font-size: 8pt; padding:5px;" id="threecolumn">
+ <?=gettext("Behaviour"); ?>
+ </div>
+ </td>
+ </tr>
+ <!-- PHP Code to generate the existing rules -->
+ <?php
+ if ($container) {
+ foreach ($container->rsets as $l7rule) {
+ ?>
+ <tr>
+ <td>
+ <select name="protocol[]" class="formselect" style="font-size:8pt">
+ <?php foreach ($avail_protos as $proto): ?>
+ <option value="<?=$proto;?>" <?php if ($proto == $l7rule->GetRProtocol()) echo "selected=\"selected\""; ?>><?=$proto;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ <td>
+ <select name="structure[]" class="formselect" style="font-size:8pt" onchange="changeBehaviourValues(this.parentNode.parentNode);">
+ <?php foreach ($avail_structures as $struct) {
+ if ($struct == "queue") {
+ if (!empty($avail_behaviours_altq)) { ?>
+ <option value="<?=$struct ?>" <?php if ($struct == $l7rule->GetRStructure()) echo "selected=\"selected\""; ?>><?=$struct;?></option>
+ <?php }
+ } else {
+ if ($struct == "limiter") {
+ if (!empty($avail_behaviours_limiter)) { ?>
+ <option value="<?=$struct ?>" <?php if ($struct == $l7rule->GetRStructure()) echo "selected=\"selected\""; ?>><?=$struct;?></option>
+ <?php }
+ } else {
+ if ($struct == "action") { ?>
+ <option value="<?=$struct ?>" <?php if ($struct == $l7rule->GetRStructure()) echo "selected=\"selected\""; ?>><?=$struct;?></option>
+ <?php }
+ }
+ }
+ } ?>
+ </select>
+ </td>
+ <td>
+ <select name="behaviour[]" class="formselect" style="width:80px; font-size:8pt">
+ <?php if ($l7rule->GetRStructure() == "action"): ?>
+ <?php foreach ($avail_behaviours_action as $behaviour): ?>
+ <option value="<?=$behaviour ?>" <?php if ($behaviour == $l7rule->GetRBehaviour()) echo "selected=\"selected\""; ?>><?=$behaviour;?></option>
+ <?php endforeach; ?>
+ <?php endif; ?>
+ <?php if ($l7rule->GetRStructure() == "queue"): ?>
+ <?php foreach ($avail_behaviours_altq as $behaviour): ?>
+ <option value="<?=$behaviour ?>" <?php if ($behaviour == $l7rule->GetRBehaviour()) echo "selected=\"selected\""; ?>><?=$behaviour;?></option>
+ <?php endforeach; ?>
+ <?php endif; ?>
+ <?php if ($l7rule->GetRStructure() == "limiter"): ?>
+ <?php foreach ($avail_behaviours_limiter as $behaviour): ?>
+ <option value="<?=$behaviour ?>" <?php if ($behaviour == $l7rule->GetRBehaviour()) echo "selected=\"selected\""; ?>><?=$behaviour;?></option>
+ <?php endforeach; ?>
+ <?php endif; ?>
+ </select>
+ </td>
+ <td>
+ <a onclick="removeRow('maintable', this.parentNode.parentNode); return false;" href="#"><img border="0" src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="x" /></a>
+ </td>
+ </tr>
+ <?php
+ } //end foreach
+ } //end if
+ ?>
+ </tbody>
+ </table>
+
+ <a onclick="javascript:addRow('maintable'); return false;" href="#"> <img border="0"
+ src="/themes/<?=$g['theme']; ?>/images/icons/icon_plus.gif"
+ alt="" title="<?=gettext("add another entry"); ?>" /> </a>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">
+ &nbsp;
+ </td>
+ <td width="78%">
+ <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+
+ <a href="firewall_shaper_layer7.php">
+ <input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" />
+
+ <?php if ($container): ?>
+ <input id="delete" type="submit" class="formbtn" name="delete" value="<?=gettext("Delete"); ?>" />
+ <?php endif ?>
+ </a>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <!-- End of layer7 rules form -->
+ </table>
+ </div><!-- end of div:shape area -->
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_shaper_queues.php b/src/usr/local/www/firewall_shaper_queues.php
new file mode 100644
index 0000000..6aa062b
--- /dev/null
+++ b/src/usr/local/www/firewall_shaper_queues.php
@@ -0,0 +1,244 @@
+<?php
+/* $Id$ */
+/*
+ firewall_shaper_queues.php
+ Copyright (C) 2004, 2005 Scott Ullrich
+ Copyright (C) 2008 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/killall
+ pfSense_MODULE: shaper
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-trafficshaper-queues
+##|*NAME=Firewall: Traffic Shaper: Queues page
+##|*DESCR=Allow access to the 'Firewall: Traffic Shaper: Queues' page.
+##|*MATCH=firewall_shaper_queues.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("rrd.inc");
+
+if ($_GET['reset'] <> "") {
+ mwexec("killall -9 pfctl");
+ exit;
+}
+
+$shaperIFlist = get_configured_interface_with_descr();
+read_altq_config();
+$qlist =& get_unique_queue_list();
+
+if (!is_array($qlist)) {
+ $qlist = array();
+}
+
+$tree = "<ul class=\"tree\" >";
+foreach ($qlist as $queue => $qkey) {
+ $tree .= "<li><a href=\"firewall_shaper_queues.php?queue={$queue}&amp;action=show\" >";
+ if (isset($shaperIFlist[$queue])) {
+ $tree .= $shaperIFlist[$queue] . "</a></li>";
+ } else {
+ $tree .= $queue . "</a></li>";
+ }
+}
+$tree .= "</ul>";
+
+if ($_GET) {
+ if ($_GET['queue']) {
+ $qname = htmlspecialchars(trim($_GET['queue']));
+ }
+ if ($_GET['interface']) {
+ $interface = htmlspecialchars(trim($_GET['interface']));
+ }
+ if ($_GET['action']) {
+ $action = htmlspecialchars($_GET['action']);
+ }
+
+ switch ($action) {
+ case "delete":
+ $altq =& $altq_list_queues[$interface];
+ $qtmp =& $altq->find_queue("", $qname);
+ if ($qtmp) {
+ $qtmp->delete_queue();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ }
+ header("Location: firewall_shaper_queues.php");
+ exit;
+ break;
+ case "add":
+ /*
+ * XXX: WARNING: This returns the first it finds.
+ * Maybe the user expects something else?!
+ */
+ foreach ($altq_list_queues as $altq) {
+ $qtmp =& $altq->find_queue("", $qname);
+ if ($qtmp) {
+ $copycfg = array();
+ $qtmp->copy_queue($interface, $copycfg);
+ $aq =& $altq_list_queues[$interface];
+ if ($qname == $qtmp->GetInterface()) {
+ $config['shaper']['queue'][] = $copycfg;
+ } else if ($aq) {
+ $tmp1 =& $qtmp->find_parentqueue($interface, $qname);
+ if ($tmp1) {
+ $tmp =& $aq->find_queue($interface, $tmp1->GetQname());
+ }
+
+ if ($tmp) {
+ $link =& get_reference_to_me_in_config($tmp->GetLink());
+ } else {
+ $link =& get_reference_to_me_in_config($aq->GetLink());
+ }
+ $link['queue'][] = $copycfg;
+ } else {
+ $newroot = array();
+ $newroot['name'] = $interface;
+ $newroot['interface'] = $interface;
+ $newroot['scheduler'] = $altq->GetScheduler();
+ $newroot['queue'] = array();
+ $newroot['queue'][] = $copycfg;
+ $config['shaper']['queue'][] = $newroot;
+ }
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ break;
+ }
+ }
+
+ header("Location: firewall_shaper_queues.php?queue=".$qname."&action=show");
+ exit;
+ break;
+ case "show":
+ foreach ($config['interfaces'] as $if => $ifdesc) {
+ $altq = $altq_list_queues[$if];
+ if ($altq) {
+ $qtmp =& $altq->find_queue("", $qname);
+ if ($qtmp) {
+ $output .= $qtmp->build_shortform();
+ } else {
+ $output .= build_iface_without_this_queue($if, $qname);
+ }
+ } else {
+ if (!is_altq_capable($ifdesc['if'])) {
+ continue;
+ }
+ if (!isset($ifdesc['enable']) && $if != "lan" && $if != "wan") {
+ continue;
+ }
+ $output .= build_iface_without_this_queue($if, $qname);
+ }
+ }
+ break;
+ }
+}
+
+if ($_POST['apply']) {
+ write_config();
+
+ $retval = 0;
+ /* Setup pf rules since the user may have changed the optimization value */
+ $retval = filter_configure();
+ $savemsg = get_std_save_message($retval);
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+
+ /* reset rrd queues */
+ system("rm -f /var/db/rrd/*queuedrops.rrd");
+ system("rm -f /var/db/rrd/*queues.rrd");
+ enable_rrd_graphing();
+
+ clear_subsystem_dirty('shaper');
+}
+
+$pgtitle = gettext("Firewall: Shaper: By Queues View");
+$shortcut_section = "trafficshaper";
+$closehead = false;
+include("head.inc");
+?>
+<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
+<script type="text/javascript" src="./tree/tree.js"></script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<div id="inputerrors"></div>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="firewall_shaper_queues.php" method="post" name="iform" id="iform">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('shaper')): ?><p>
+<?php print_info_box_np(gettext("The traffic shaper configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br /></p>
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper queues">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
+ $tab_array[1] = array(gettext("By Queue"), true, "firewall_shaper_queues.php");
+ $tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
+ $tab_array[3] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
+ $tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td valign="top">
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="30%" valign="top" align="left">
+ <?php echo $tree; ?>
+ </td>
+ <td width="70%" valign="top" align="center">
+ <?php
+ if ($qname) {
+ echo "<p class=\"pgtitle\">" . $qname . "</p><br />";
+ }
+ echo "<table align=\"center\" class=\"tabcont\" width=\"80%\" border=\"0\" cellpadding=\"4\" cellspacing=\"0\" summary=\"output form\">";
+ echo $output;
+ echo "<tr><td>&nbsp;</td></tr>";
+ echo "</table>";
+ ?>
+ </td>
+ </tr>
+ </table><!-- table:main area -->
+ </div><!-- div:main area -->
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_shaper_vinterface.php b/src/usr/local/www/firewall_shaper_vinterface.php
new file mode 100644
index 0000000..ffa3f15
--- /dev/null
+++ b/src/usr/local/www/firewall_shaper_vinterface.php
@@ -0,0 +1,475 @@
+<?php
+/* $Id$ */
+/*
+ firewall_shaper_vinterface.php
+ Copyright (C) 2004, 2005 Scott Ullrich
+ Copyright (C) 2008 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/killall
+ pfSense_MODULE: shaper
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-trafficshaper-limiter
+##|*NAME=Firewall: Traffic Shaper: Limiter page
+##|*DESCR=Allow access to the 'Firewall: Traffic Shaper: Limiter' page.
+##|*MATCH=firewall_shaper_vinterface.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+if ($_GET['reset'] <> "") {
+ mwexec("/usr/bin/killall -9 pfctl");
+ exit;
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("Traffic Shaper"), gettext("Limiter"));
+$shortcut_section = "trafficshaper-limiters";
+
+read_dummynet_config();
+/*
+ * The whole logic in these code maybe can be specified.
+ * If you find a better way contact me :).
+ */
+
+if ($_GET) {
+ if ($_GET['queue']) {
+ $qname = htmlspecialchars(trim($_GET['queue']));
+ }
+ if ($_GET['pipe']) {
+ $pipe = htmlspecialchars(trim($_GET['pipe']));
+ }
+ if ($_GET['action']) {
+ $action = htmlspecialchars($_GET['action']);
+ }
+}
+if ($_POST) {
+ if ($_POST['name']) {
+ $qname = htmlspecialchars(trim($_POST['name']));
+ } else if ($_POST['newname']) {
+ $qname = htmlspecialchars(trim($_POST['newname']));
+ }
+ if ($_POST['pipe']) {
+ $pipe = htmlspecialchars(trim($_POST['pipe']));
+ } else {
+ $pipe = htmlspecialchars(trim($qname));
+ }
+ if ($_POST['parentqueue']) {
+ $parentqueue = htmlspecialchars(trim($_POST['parentqueue']));
+ }
+}
+
+if ($pipe) {
+ $dnpipe = $dummynet_pipe_list[$pipe];
+ if ($dnpipe) {
+ $queue =& $dnpipe->find_queue($pipe, $qname);
+ } else {
+ $addnewpipe = true;
+ }
+}
+
+$dontshow = false;
+$newqueue = false;
+$output_form = "";
+
+if ($_GET) {
+ switch ($action) {
+ case "delete":
+ if ($queue) {
+ if (is_array($config['filter']['rule'])) {
+ foreach ($config['filter']['rule'] as $rule) {
+ if ($rule['dnpipe'] == $queue->GetQname() || $rule['pdnpipe'] == $queue->GetQname()) {
+ $input_errors[] = gettext("This pipe/queue is referenced in filter rules, please remove references from there before deleting.");
+ }
+ }
+ }
+ if (!$input_errors) {
+ $queue->delete_queue();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ header("Location: firewall_shaper_vinterface.php");
+ exit;
+ }
+ $output_form .= $queue->build_form();
+ } else {
+ $input_errors[] = sprintf(gettext("No queue with name %s was found!"), $qname);
+ $output_form .= $dn_default_shaper_msg;
+ $dontshow = true;
+ }
+ break;
+ case "resetall":
+ foreach ($dummynet_pipe_list as $dn) {
+ $dn->delete_queue();
+ }
+ unset($dummynet_pipe_list);
+ $dummynet_pipe_list = array();
+ unset($config['dnshaper']['queue']);
+ unset($queue);
+ unset($pipe);
+ $can_add = false;
+ $can_enable = false;
+ $dontshow = true;
+ foreach ($config['filter']['rule'] as $key => $rule) {
+ if (isset($rule['dnpipe'])) {
+ unset($config['filter']['rule'][$key]['dnpipe']);
+ }
+ if (isset($rule['pdnpipe'])) {
+ unset($config['filter']['rule'][$key]['pdnpipe']);
+ }
+ }
+ if (write_config()) {
+ $retval = 0;
+ $retval = filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+ } else {
+ $savemsg = gettext("Unable to write config.xml (Access Denied?)");
+ }
+ $output_form = $dn_default_shaper_message;
+
+ break;
+ case "add":
+ if ($dnpipe) {
+ $q = new dnqueue_class();
+ $q->SetPipe($pipe);
+ $output_form .= "<input type=\"hidden\" name=\"parentqueue\" id=\"parentqueue\"";
+ $output_form .= " value=\"".$pipe."\" />";
+ } else if ($addnewpipe) {
+ $q = new dnpipe_class();
+ $q->SetQname($pipe);
+ } else {
+ $input_errors[] = gettext("Could not create new queue/discipline!");
+ }
+
+ if ($q) {
+ $output_form .= $q->build_form();
+ $newjavascript = $q->build_javascript();
+ unset($q);
+ $newqueue = true;
+ }
+ break;
+ case "show":
+ if ($queue) {
+ $output_form .= $queue->build_form();
+ } else {
+ $input_errors[] = gettext("Queue not found!");
+ }
+ break;
+ case "enable":
+ if ($queue) {
+ $queue->SetEnabled("on");
+ $output_form .= $queue->build_form();
+ $queue->wconfig();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ } else {
+ $input_errors[] = gettext("Queue not found!");
+ }
+ break;
+ case "disable":
+ if ($queue) {
+ $queue->SetEnabled("");
+ $output_form .= $queue->build_form();
+ $queue->wconfig();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ } else {
+ $input_errors[] = gettext("Queue not found!");
+ }
+ break;
+ default:
+ $output_form .= $dn_default_shaper_msg;
+ $dontshow = true;
+ break;
+ }
+} else if ($_POST) {
+ unset($input_errors);
+
+ if ($addnewpipe) {
+ if (!empty($dummynet_pipe_list[$qname])) {
+ $input_errors[] = gettext("You cannot name a child queue with the same name as a parent limiter");
+ } else {
+ $dnpipe =& new dnpipe_class();
+
+ $dnpipe->ReadConfig($_POST);
+ $dnpipe->validate_input($_POST, $input_errors);
+ if (!$input_errors) {
+ $number = dnpipe_find_nextnumber();
+ $dnpipe->SetNumber($number);
+ unset($tmppath);
+ $tmppath[] = $dnpipe->GetQname();
+ $dnpipe->SetLink($tmppath);
+ $dnpipe->wconfig();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ $can_enable = true;
+ $can_add = true;
+ }
+
+ read_dummynet_config();
+ $output_form .= $dnpipe->build_form();
+ $newjavascript = $dnpipe->build_javascript();
+ }
+ } else if ($parentqueue) { /* Add a new queue */
+ if (!empty($dummynet_pipe_list[$qname])) {
+ $input_errors[] = gettext("You cannot name a child queue with the same name as a parent limiter");
+ } else if ($dnpipe) {
+ $tmppath =& $dnpipe->GetLink();
+ array_push($tmppath, $qname);
+ $tmp =& $dnpipe->add_queue($pipe, $_POST, $tmppath, $input_errors);
+ if (!$input_errors) {
+ array_pop($tmppath);
+ $tmp->wconfig();
+ if (write_config()) {
+ $can_enable = true;
+ $can_add = false;
+ mark_subsystem_dirty('shaper');
+ }
+ }
+ read_dummynet_config();
+ $output_form .= $tmp->build_form();
+ } else {
+ $input_errors[] = gettext("Could not add new queue.");
+ }
+ } else if ($_POST['apply']) {
+ write_config();
+
+ $retval = 0;
+ $retval = filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+
+ /* XXX: TODO Make dummynet pretty graphs */
+ // enable_rrd_graphing();
+
+ clear_subsystem_dirty('shaper');
+
+ if ($queue) {
+ $output_form .= $queue->build_form();
+ $dontshow = false;
+ } else {
+ $output_form .= $dn_default_shaper_message;
+ $dontshow = true;
+ }
+ } else if ($queue) {
+ $queue->validate_input($_POST, $input_errors);
+ if (!$input_errors) {
+ $queue->update_dn_data($_POST);
+ $queue->wconfig();
+ if (write_config()) {
+ mark_subsystem_dirty('shaper');
+ }
+ $dontshow = false;
+ }
+ read_dummynet_config();
+ $output_form .= $queue->build_form();
+ } else {
+ $output_form .= $dn_default_shaper_msg;
+ $dontshow = true;
+ }
+} else {
+ $output_form .= $dn_default_shaper_msg;
+ $dontshow = true;
+}
+
+if ($queue) {
+ if ($queue->GetEnabled()) {
+ $can_enable = true;
+ } else {
+ $can_enable = false;
+ }
+ if ($queue->CanHaveChildren()) {
+ $can_add = true;
+ } else {
+ $can_add = false;
+ }
+}
+
+$tree = "<ul class=\"tree\" >";
+if (is_array($dummynet_pipe_list)) {
+ foreach ($dummynet_pipe_list as $tmpdn) {
+ $tree .= $tmpdn->build_tree();
+ }
+}
+$tree .= "</ul>";
+
+if (!$dontshow || $newqueue) {
+
+$output_form .= "<tr><td width=\"22%\" valign=\"top\" class=\"vncellreq\">";
+$output_form .= gettext("Queue Actions");
+$output_form .= "</td><td valign=\"top\" class=\"vncellreq\" width=\"78%\">";
+
+$output_form .= "<input type=\"submit\" name=\"Submit\" value=\"" . gettext("Save") . "\" class=\"formbtn\" />";
+if ($can_add || $addnewaltq) {
+ $output_form .= "<a href=\"firewall_shaper_vinterface.php?pipe=";
+ $output_form .= $pipe;
+ if ($queue) {
+ $output_form .= "&amp;queue=" . $queue->GetQname();
+ }
+ $output_form .= "&amp;action=add\">";
+ $output_form .= "<input type=\"button\" class=\"formbtn\" name=\"add\" value=\"" . gettext("Add new queue") ."\" />";
+ $output_form .= "</a>";
+}
+$output_form .= "<a href=\"firewall_shaper_vinterface.php?pipe=";
+$output_form .= $pipe;
+if ($queue) {
+ $output_form .= "&amp;queue=" . $queue->GetQname();
+}
+$output_form .= "&amp;action=delete\">";
+$output_form .= "<input type=\"button\" class=\"formbtn\" name=\"delete\"";
+if ($queue) {
+ $output_form .= " value=\"" . gettext("Delete this queue") ."\" />";
+} else {
+ $output_form .= " value=\"" . gettext("Delete Limiter") ."\" />";
+}
+$output_form .= "</a>";
+$output_form .= "</td></tr>";
+$output_form .= "</table>";
+} else {
+ $output_form .= "</table>";
+}
+
+$output = "<table summary=\"output form\">";
+$output .= $output_form;
+$closehead = false;
+include("head.inc");
+?>
+<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
+<script type="text/javascript" src="./tree/tree.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+function show_source_port_range() {
+ document.getElementById("sprtable").style.display = '';
+ document.getElementById("sprtable1").style.display = '';
+ document.getElementById("sprtable2").style.display = '';
+ document.getElementById("sprtable5").style.display = '';
+ document.getElementById("sprtable4").style.display = 'none';
+ document.getElementById("showadvancedboxspr").innerHTML='';
+}
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php
+if ($queue) {
+ echo $queue->build_javascript();
+} else {
+ echo $newjavascript;
+}
+
+include("fbegin.inc");
+?>
+<div id="inputerrors"></div>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<form action="firewall_shaper_vinterface.php" method="post" id="iform" name="iform">
+
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('shaper')): ?><p>
+<?php print_info_box_np(gettext("The traffic shaper configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));?><br /></p>
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper limiter">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
+ $tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
+ $tab_array[2] = array(gettext("Limiter"), true, "firewall_shaper_vinterface.php");
+ $tab_array[3] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
+ $tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+<?php if (count($dummynet_pipe_list) > 0): ?>
+ <tr class="tabcont">
+ <td width="25%" align="left"></td>
+ <td width="75%"> </td>
+ </tr>
+<?php endif; ?>
+ <tr>
+ <td width="25%" valign="top" align="left">
+ <?php
+ echo $tree;
+ ?>
+ <br /><br />
+ <a href="firewall_shaper_vinterface.php?pipe=new&amp;action=add">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("Create new limiter");?>" width="17" height="17" border="0" alt="add" />&nbsp;<?=gettext("Create new limiter");?>
+ </a>
+ <br />
+ </td>
+ <td width="75%" valign="top" align="center">
+ <div id="shaperarea" style="position:relative">
+ <?php
+ echo $output;
+ ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type='text/javascript'>
+//<![CDATA[
+<?php
+ $totalrows = 0;
+ if (is_array($config['dnshaper']) && is_array($config['dnshaper']['queue'])) {
+ $totalrows = count($config['dnshaper']['queue']);
+ }
+ echo "totalrows = {$totalrows}";
+?>
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_shaper_wizards.php b/src/usr/local/www/firewall_shaper_wizards.php
new file mode 100644
index 0000000..583fdef
--- /dev/null
+++ b/src/usr/local/www/firewall_shaper_wizards.php
@@ -0,0 +1,146 @@
+<?php
+/* $Id$ */
+/*
+ firewall_shaper_wizards.php
+ Copyright (C) 2004, 2005 Scott Ullrich
+ Copyright (C) 2008 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/killall
+ pfSense_MODULE: shaper
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-trafficshaper-wizard
+##|*NAME=Firewall: Traffic Shaper: Wizard page
+##|*DESCR=Allow access to the 'Firewall: Traffic Shaper: Wizard' page.
+##|*MATCH=firewall_shaper_wizards.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("util.inc");
+
+if ($_GET['reset'] <> "") {
+ sigkillbyname('pfctl', SIGKILL);
+ exit;
+}
+
+if ($_POST['apply']) {
+ write_config();
+
+ $retval = 0;
+ /* Setup pf rules since the user may have changed the optimization value */
+ $retval = filter_configure();
+ $savemsg = get_std_save_message($retval);
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+
+ /* reset rrd queues */
+ unlink_if_exists("/var/db/rrd/*queuedrops.rrd");
+ unlink_if_exists("/var/db/rrd/*queues.rrd");
+ enable_rrd_graphing();
+
+ clear_subsystem_dirty('shaper');
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("Traffic Shaper"), gettext("Wizards"));
+$shortcut_section = "trafficshaper";
+
+$wizards = array(
+ gettext("Multiple Lan/Wan") => "traffic_shaper_wizard_multi_all.xml",
+ gettext("Dedicated Links") => "traffic_shaper_wizard_dedicated.xml",
+);
+
+$closehead = false;
+include("head.inc");
+?>
+<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" >
+
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<form action="firewall_shaper_wizards.php" method="post" id="iform" name="iform">
+
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('shaper')): ?><p>
+<?php print_info_box_np(gettext("The traffic shaper configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));?><br /></p>
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper wizard">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
+ $tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
+ $tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
+ $tab_array[3] = array(gettext("Layer7"), false, "firewall_shaper_layer7.php");
+ $tab_array[4] = array(gettext("Wizards"), true, "firewall_shaper_wizards.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td class="listhdrr" width="25%" align="center" ><?=gettext("Wizard function");?></td>
+ <td class="listhdrr" width="75%" align="center"><?=gettext("Wizard Link");?></td>
+ </tr>
+<?php
+ foreach ($wizards as $key => $wizard):
+?>
+ <tr class="tabcont">
+ <td class="listlr" style="background-color: #e0e0e0" width="25%" align="center">
+<?php
+ echo $key;
+?>
+ </td>
+ <td class="listr" style="background-color: #e0e0e0" width="75%" align="center">
+<?php
+ echo "<a href=\"wizard.php?xml=" . $wizard ."\" >" .$wizard . "</a>";
+?>
+ </td>
+ </tr>
+<?php
+ endforeach;
+?>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_virtual_ip.php b/src/usr/local/www/firewall_virtual_ip.php
new file mode 100644
index 0000000..148477f
--- /dev/null
+++ b/src/usr/local/www/firewall_virtual_ip.php
@@ -0,0 +1,373 @@
+<?php
+/* $Id$ */
+/*
+ firewall_virtual_ip.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2005 Bill Marquette <bill.marquette@gmail.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Includes code from m0n0wall which is:
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Includes code from pfSense which is:
+ Copyright (C) 2004-2005 Scott Ullrich <geekgod@pfsense.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-virtualipaddresses
+##|*NAME=Firewall: Virtual IP Addresses page
+##|*DESCR=Allow access to the 'Firewall: Virtual IP Addresses' page.
+##|*MATCH=firewall_virtual_ip.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+if (!is_array($config['virtualip']['vip'])) {
+ $config['virtualip']['vip'] = array();
+}
+$a_vip = &$config['virtualip']['vip'];
+
+if ($_POST) {
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $check_carp = false;
+ if (file_exists("{$g['tmp_path']}/.firewall_virtual_ip.apply")) {
+ $toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply"));
+ foreach ($toapplylist as $vid => $ovip) {
+ if (!empty($ovip)) {
+ interface_vip_bring_down($ovip);
+ }
+ if ($a_vip[$vid]) {
+ switch ($a_vip[$vid]['mode']) {
+ case "ipalias":
+ interface_ipalias_configure($a_vip[$vid]);
+ break;
+ case "proxyarp":
+ interface_proxyarp_configure($a_vip[$vid]['interface']);
+ break;
+ case "carp":
+ $check_carp = true;
+ interface_carp_configure($a_vip[$vid]);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ @unlink("{$g['tmp_path']}/.firewall_virtual_ip.apply");
+ }
+ /* Before changing check #4633 */
+ if ($check_carp === true && !get_carp_status()) {
+ set_single_sysctl("net.inet.carp.allow", "1");
+ }
+
+ $retval = 0;
+ $retval |= filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ clear_subsystem_dirty('vip');
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_vip[$_GET['id']]) {
+ /* make sure no inbound NAT mappings reference this entry */
+ if (is_array($config['nat']['rule'])) {
+ foreach ($config['nat']['rule'] as $rule) {
+ if ($rule['destination']['address'] <> "") {
+ if ($rule['destination']['address'] == $a_vip[$_GET['id']]['subnet']) {
+ $input_errors[] = gettext("This entry cannot be deleted because it is still referenced by at least one NAT mapping.");
+ break;
+ }
+ }
+ }
+ }
+
+ /* make sure no OpenVPN server or client references this entry */
+ $openvpn_types_a = array("openvpn-server" => gettext("server"), "openvpn-client" => gettext("client"));
+ foreach ($openvpn_types_a as $openvpn_type => $openvpn_type_text) {
+ if (is_array($config['openvpn'][$openvpn_type])) {
+ foreach ($config['openvpn'][$openvpn_type] as $openvpn) {
+ if ($openvpn['ipaddr'] <> "") {
+ if ($openvpn['ipaddr'] == $a_vip[$_GET['id']]['subnet']) {
+ if (strlen($openvpn['description'])) {
+ $openvpn_desc = $openvpn['description'];
+ } else {
+ $openvpn_desc = $openvpn['ipaddr'] . ":" . $openvpn['local_port'];
+ }
+ $input_errors[] = sprintf(gettext("This entry cannot be deleted because it is still referenced by OpenVPN %s %s."), $openvpn_type_text, $openvpn_desc);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (is_ipaddrv6($a_vip[$_GET['id']]['subnet'])) {
+ $is_ipv6 = true;
+ $subnet = gen_subnetv6($a_vip[$_GET['id']]['subnet'], $a_vip[$_GET['id']]['subnet_bits']);
+ $if_subnet_bits = get_interface_subnetv6($a_vip[$_GET['id']]['interface']);
+ $if_subnet = gen_subnetv6(get_interface_ipv6($a_vip[$_GET['id']]['interface']), $if_subnet_bits);
+ } else {
+ $is_ipv6 = false;
+ $subnet = gen_subnet($a_vip[$_GET['id']]['subnet'], $a_vip[$_GET['id']]['subnet_bits']);
+ $if_subnet_bits = get_interface_subnet($a_vip[$_GET['id']]['interface']);
+ $if_subnet = gen_subnet(get_interface_ip($a_vip[$_GET['id']]['interface']), $if_subnet_bits);
+ }
+
+ $subnet .= "/" . $a_vip[$_GET['id']]['subnet_bits'];
+ $if_subnet .= "/" . $if_subnet_bits;
+
+ if (is_array($config['gateways']['gateway_item'])) {
+ foreach ($config['gateways']['gateway_item'] as $gateway) {
+ if ($a_vip[$_GET['id']]['interface'] != $gateway['interface']) {
+ continue;
+ }
+ if ($is_ipv6 && $gateway['ipprotocol'] == 'inet') {
+ continue;
+ }
+ if (!$is_ipv6 && $gateway['ipprotocol'] == 'inet6') {
+ continue;
+ }
+ if (ip_in_subnet($gateway['gateway'], $if_subnet)) {
+ continue;
+ }
+
+ if (ip_in_subnet($gateway['gateway'], $subnet)) {
+ $input_errors[] = gettext("This entry cannot be deleted because it is still referenced by at least one Gateway.");
+ break;
+ }
+ }
+ }
+
+ if ($a_vip[$_GET['id']]['mode'] == "ipalias") {
+ $subnet = gen_subnet($a_vip[$_GET['id']]['subnet'], $a_vip[$_GET['id']]['subnet_bits']) . "/" . $a_vip[$_GET['id']]['subnet_bits'];
+ $found_if = false;
+ $found_carp = false;
+ $found_other_alias = false;
+
+ if ($subnet == $if_subnet) {
+ $found_if = true;
+ }
+
+ $vipiface = $a_vip[$_GET['id']]['interface'];
+ foreach ($a_vip as $vip_id => $vip) {
+ if ($vip_id == $_GET['id']) {
+ continue;
+ }
+
+ if ($vip['interface'] == $vipiface && ip_in_subnet($vip['subnet'], $subnet)) {
+ if ($vip['mode'] == "carp") {
+ $found_carp = true;
+ } else if ($vip['mode'] == "ipalias") {
+ $found_other_alias = true;
+ }
+ }
+ }
+
+ if ($found_carp === true && $found_other_alias === false && $found_if === false) {
+ $input_errors[] = gettext("This entry cannot be deleted because it is still referenced by a CARP IP with the description") . " {$vip['descr']}.";
+ }
+ } else if ($a_vip[$_GET['id']]['mode'] == "carp") {
+ $vipiface = "{$a_vip[$_GET['id']]['interface']}_vip{$a_vip[$_GET['id']]['vhid']}";
+ foreach ($a_vip as $vip) {
+ if ($vipiface == $vip['interface'] && $vip['mode'] == "ipalias") {
+ $input_errors[] = gettext("This entry cannot be deleted because it is still referenced by an IP alias entry with the description") . " {$vip['descr']}.";
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ if (!session_id()) {
+ session_start();
+ }
+ $user = getUserEntry($_SESSION['Username']);
+ if (is_array($user) && userHasPrivilege($user, "user-config-readonly")) {
+ header("Location: firewall_virtual_ip.php");
+ exit;
+ }
+ session_commit();
+
+ // Special case since every proxyarp vip is handled by the same daemon.
+ if ($a_vip[$_GET['id']]['mode'] == "proxyarp") {
+ $viface = $a_vip[$_GET['id']]['interface'];
+ unset($a_vip[$_GET['id']]);
+ interface_proxyarp_configure($viface);
+ } else {
+ interface_vip_bring_down($a_vip[$_GET['id']]);
+ unset($a_vip[$_GET['id']]);
+ }
+ if (count($config['virtualip']['vip']) == 0) {
+ unset($config['virtualip']['vip']);
+ }
+ write_config();
+ header("Location: firewall_virtual_ip.php");
+ exit;
+ }
+ }
+} else if ($_GET['changes'] == "mods" && is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("Virtual IP Addresses"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="firewall_virtual_ip.php" method="post">
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ } else if ($savemsg) {
+ print_info_box($savemsg);
+ } else if (is_subsystem_dirty('vip')) {
+ print_info_box_np(gettext("The VIP configuration has been changed.")."<br />".gettext("You must apply the changes in order for them to take effect."));
+ }
+?>
+<br />
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="virtual ip">
+ <tr><td class="tabnavtbl">
+ <?php
+ /* active tabs */
+ $tab_array = array();
+ $tab_array[] = array(gettext("Virtual IPs"), true, "firewall_virtual_ip.php");
+ $tab_array[] = array(gettext("CARP Settings"), false, "system_hasync.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td></tr>
+ <tr>
+ <td><input type="hidden" id="id" name="id" value="<?php echo htmlspecialchars($id); ?>" /></td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="30%" class="listhdrr"><?=gettext("Virtual IP address");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Type");?></td>
+ <td width="40%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle"><a href="firewall_virtual_ip_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ $interfaces = get_configured_interface_with_descr(false, true);
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip) {
+ $interfaces[$cif] = $carpip." (".get_vip_descr($carpip).")";
+ }
+ $interfaces['lo0'] = "Localhost";
+ $i = 0;
+ foreach ($a_vip as $vipent):
+ if ($vipent['subnet'] <> "" or $vipent['range'] <> "" or $vipent['subnet_bits'] <> "" or (isset($vipent['range']['from']) && $vipent['range']['from'] <> "")):
+ ?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='firewall_virtual_ip_edit.php?id=<?=$i;?>';">
+ <?php
+ if (($vipent['type'] == "single") || ($vipent['type'] == "network")) {
+ if ($vipent['subnet_bits']) {
+ echo "{$vipent['subnet']}/{$vipent['subnet_bits']}";
+ }
+ }
+ if ($vipent['type'] == "range") {
+ echo "{$vipent['range']['from']}-{$vipent['range']['to']}";
+ }
+ if ($vipent['mode'] == "carp") {
+ echo " (vhid {$vipent['vhid']})";
+ }
+ ?>
+ </td>
+ <td class="listr" ondblclick="document.location='firewall_virtual_ip_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($interfaces[$vipent['interface']]);?>&nbsp;
+ </td>
+ <td class="listr" align="center" ondblclick="document.location='firewall_virtual_ip_edit.php?id=<?=$i;?>';">
+ <?php if ($vipent['mode'] == "proxyarp") echo "<img src='./themes/".$g['theme']."/images/icons/icon_parp.gif' title='Proxy ARP' alt='proxy arp' />"; elseif ($vipent['mode'] == "carp") echo "<img src='./themes/".$g['theme']."/images/icons/icon_carp.gif' title='CARP' alt='carp' />"; elseif ($vipent['mode'] == "other") echo "<img src='./themes/".$g['theme']."/images/icons/icon_other.gif' title='Other' alt='other' />"; elseif ($vipent['mode'] == "ipalias") echo "<img src='./themes/".$g['theme']."/images/icons/icon_ifalias.gif' title='IP Alias' alt='ip alias' />";?>
+ </td>
+ <td class="listbg" ondblclick="document.location='firewall_virtual_ip_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($vipent['descr']);?>&nbsp;
+ </td>
+ <td class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="firewall_virtual_ip_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
+ <td valign="middle"><a href="firewall_virtual_ip.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext('Do you really want to delete this entry?');?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ endif;
+ $i++;
+ endforeach;
+ ?>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle"><a href="firewall_virtual_ip_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="5">
+ <p>
+ <span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br /></strong></span>
+ <?=gettext("The virtual IP addresses defined on this page may be used in");?><a href="firewall_nat.php"> <?=gettext("NAT"); ?> </a><?=gettext("mappings.");?><br />
+ <?=gettext("You can check the status of your CARP Virtual IPs and interfaces ");?><a href="carp_status.php"><?=gettext("here");?></a>.</span>
+ </p>
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ </div><!-- div:mainarea -->
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/firewall_virtual_ip_edit.php b/src/usr/local/www/firewall_virtual_ip_edit.php
new file mode 100644
index 0000000..6021115
--- /dev/null
+++ b/src/usr/local/www/firewall_virtual_ip_edit.php
@@ -0,0 +1,572 @@
+<?php
+/* $Id$ */
+/*
+
+ firewall_virtual_ip_edit.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright (C) 2005 Bill Marquette <bill.marquette@gmail.com>.
+ All rights reserved.
+
+ Includes code from m0n0wall which is:
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Includes code from pfSense which is:
+ Copyright (C) 2004-2005 Scott Ullrich <geekgod@pfsense.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-virtualipaddress-edit
+##|*NAME=Firewall: Virtual IP Address: Edit page
+##|*DESCR=Allow access to the 'Firewall: Virtual IP Address: Edit' page.
+##|*MATCH=firewall_virtual_ip_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter.inc");
+require("shaper.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_virtual_ip.php');
+}
+
+if (!is_array($config['virtualip']['vip'])) {
+ $config['virtualip']['vip'] = array();
+}
+$a_vip = &$config['virtualip']['vip'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+function return_first_two_octets($ip) {
+ $ip_split = explode(".", $ip);
+ return $ip_split[0] . "." . $ip_split[1];
+}
+
+function find_last_used_vhid() {
+ global $config, $g;
+ $vhid = 0;
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['vhid'] > $vhid) {
+ $vhid = $vip['vhid'];
+ }
+ }
+ return $vhid;
+}
+
+if (isset($id) && $a_vip[$id]) {
+ $pconfig['mode'] = $a_vip[$id]['mode'];
+ $pconfig['vhid'] = $a_vip[$id]['vhid'];
+ $pconfig['advskew'] = $a_vip[$id]['advskew'];
+ $pconfig['advbase'] = $a_vip[$id]['advbase'];
+ $pconfig['password'] = $a_vip[$id]['password'];
+ $pconfig['range'] = $a_vip[$id]['range'];
+ $pconfig['subnet'] = $a_vip[$id]['subnet'];
+ $pconfig['subnet_bits'] = $a_vip[$id]['subnet_bits'];
+ $pconfig['noexpand'] = $a_vip[$id]['noexpand'];
+ $pconfig['descr'] = $a_vip[$id]['descr'];
+ $pconfig['type'] = $a_vip[$id]['type'];
+ $pconfig['interface'] = $a_vip[$id]['interface'];
+ $pconfig['uniqid'] = $a_vip[$id]['interface'];
+} else {
+ $lastvhid = find_last_used_vhid();
+ $lastvhid++;
+ $pconfig['vhid'] = $lastvhid;
+ $pconfig['uniqid'] = uniqid();
+}
+
+if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "mode");
+ $reqdfieldsn = array(gettext("Type"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['subnet']) {
+ $_POST['subnet'] = trim($_POST['subnet']);
+ }
+
+ if ($_POST['subnet']) {
+ if (!is_ipaddr($_POST['subnet'])) {
+ $input_errors[] = gettext("A valid IP address must be specified.");
+ } else {
+ if (isset($id) && isset($a_vip[$id])) {
+ $ignore_if = $a_vip[$id]['interface'];
+ $ignore_mode = $a_vip[$id]['mode'];
+ if (isset($a_vip[$id]['vhid'])) {
+ $ignore_vhid = $a_vip[$id]['vhid'];
+ }
+ } else {
+ $ignore_if = $_POST['interface'];
+ $ignore_mode = $_POST['mode'];
+ }
+
+ if (!isset($ignore_vhid)) {
+ $ignore_vhid = $_POST['vhid'];
+ }
+
+ if ($ignore_mode == 'carp') {
+ $ignore_if .= "_vip{$ignore_vhid}";
+ } else {
+ $ignore_if .= "_virtualip{$id}";
+ }
+
+ if (is_ipaddr_configured($_POST['subnet'], $ignore_if)) {
+ $input_errors[] = gettext("This IP address is being used by another interface or VIP.");
+ }
+
+ unset($ignore_if, $ignore_mode);
+ }
+ }
+
+ $natiflist = get_configured_interface_with_descr();
+ foreach ($natiflist as $natif => $natdescr) {
+ if ($_POST['interface'] == $natif && (empty($config['interfaces'][$natif]['ipaddr']) && empty($config['interfaces'][$natif]['ipaddrv6']))) {
+ $input_errors[] = gettext("The interface chosen for the VIP has no IPv4 or IPv6 address configured so it cannot be used as a parent for the VIP.");
+ }
+ }
+
+ /* ipalias and carp should not use network or broadcast address */
+ if ($_POST['mode'] == "ipalias" || $_POST['mode'] == "carp") {
+ if (is_ipaddrv4($_POST['subnet']) && $_POST['subnet_bits'] != "32") {
+ $network_addr = gen_subnet($_POST['subnet'], $_POST['subnet_bits']);
+ $broadcast_addr = gen_subnet_max($_POST['subnet'], $_POST['subnet_bits']);
+ } else if (is_ipaddrv6($_POST['subnet']) && $_POST['subnet_bits'] != "128") {
+ $network_addr = gen_subnetv6($_POST['subnet'], $_POST['subnet_bits']);
+ $broadcast_addr = gen_subnetv6_max($_POST['subnet'], $_POST['subnet_bits']);
+ }
+
+ if (isset($network_addr) && $_POST['subnet'] == $network_addr) {
+ $input_errors[] = gettext("You cannot use the network address for this VIP");
+ } else if (isset($broadcast_addr) && $_POST['subnet'] == $broadcast_addr) {
+ $input_errors[] = gettext("You cannot use the broadcast address for this VIP");
+ }
+ }
+
+ /* make sure new ip is within the subnet of a valid ip
+ * on one of our interfaces (wan, lan optX)
+ */
+ switch ($_POST['mode']) {
+ case 'carp':
+ /* verify against reusage of vhids */
+ $idtracker = 0;
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['vhid'] == $_POST['vhid'] && $vip['interface'] == $_POST['interface'] && $idtracker <> $id) {
+ $input_errors[] = sprintf(gettext("VHID %s is already in use on interface %s. Pick a unique number on this interface."), $_POST['vhid'], convert_friendly_interface_to_friendly_descr($_POST['interface']));
+ }
+ $idtracker++;
+ }
+ if (empty($_POST['password'])) {
+ $input_errors[] = gettext("You must specify a CARP password that is shared between the two VHID members.");
+ }
+
+ if ($_POST['interface'] == 'lo0') {
+ $input_errors[] = gettext("For this type of vip localhost is not allowed.");
+ } else if (strpos($_POST['interface'], '_vip')) {
+ $input_errors[] = gettext("A CARP parent interface can only be used with IP Alias type Virtual IPs.");
+ }
+ break;
+ case 'ipalias':
+ if (strstr($_POST['interface'], "_vip")) {
+ if (is_ipaddrv4($_POST['subnet'])) {
+ $parent_ip = get_interface_ip($_POST['interface']);
+ $parent_sn = get_interface_subnet($_POST['interface']);
+ $subnet = gen_subnet($parent_ip, $parent_sn);
+ } else if (is_ipaddrv6($_POST['subnet'])) {
+ $parent_ip = get_interface_ipv6($_POST['interface']);
+ $parent_sn = get_interface_subnetv6($_POST['interface']);
+ $subnet = gen_subnetv6($parent_ip, $parent_sn);
+ }
+ if (isset($parent_ip) && !ip_in_subnet($_POST['subnet'], "{$subnet}/{$parent_sn}") &&
+ !ip_in_interface_alias_subnet(link_carp_interface_to_parent($_POST['interface']), $_POST['subnet'])) {
+ $cannot_find = $_POST['subnet'] . "/" . $_POST['subnet_bits'] ;
+ $input_errors[] = sprintf(gettext("Sorry, we could not locate an interface with a matching subnet for %s. Please add an IP alias in this subnet on this interface."), $cannot_find);
+ }
+ unset($parent_ip, $parent_sn, $subnet);
+ }
+ break;
+ default:
+ if ($_POST['interface'] == 'lo0') {
+ $input_errors[] = gettext("For this type of vip localhost is not allowed.");
+ } else if (strpos($_POST['interface'], '_vip')) {
+ $input_errors[] = gettext("A CARP parent interface can only be used with IP Alias type Virtual IPs.");
+ }
+ break;
+ }
+
+ if (!$input_errors) {
+ $vipent = array();
+
+ $vipent['mode'] = $_POST['mode'];
+ $vipent['interface'] = $_POST['interface'];
+
+ /* ProxyARP specific fields */
+ if ($_POST['mode'] === "proxyarp") {
+ if ($_POST['type'] == "range") {
+ $vipent['range']['from'] = $_POST['range_from'];
+ $vipent['range']['to'] = $_POST['range_to'];
+
+ }
+ $vipent['noexpand'] = isset($_POST['noexpand']);
+ }
+
+ /* CARP specific fields */
+ if ($_POST['mode'] === "carp") {
+ $vipent['vhid'] = $_POST['vhid'];
+ $vipent['vhid'] = $_POST['uinqid'];
+ $vipent['advskew'] = $_POST['advskew'];
+ $vipent['advbase'] = $_POST['advbase'];
+ $vipent['password'] = $_POST['password'];
+ }
+
+ /* Common fields */
+ $vipent['descr'] = $_POST['descr'];
+ if (isset($_POST['type'])) {
+ $vipent['type'] = $_POST['type'];
+ } else {
+ $vipent['type'] = "single";
+ }
+
+ if ($vipent['type'] == "single" || $vipent['type'] == "network") {
+ if (!isset($_POST['subnet_bits'])) {
+ $vipent['subnet_bits'] = "32";
+ } else {
+ $vipent['subnet_bits'] = $_POST['subnet_bits'];
+ }
+ $vipent['subnet'] = $_POST['subnet'];
+ }
+
+ if (!isset($id)) {
+ $id = count($a_vip);
+ }
+ if (file_exists("{$g['tmp_path']}/.firewall_virtual_ip.apply")) {
+ $toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply"));
+ } else {
+ $toapplylist = array();
+ }
+
+ $toapplylist[$id] = $a_vip[$id];
+ if (!empty($a_vip[$id])) {
+ /* modify all virtual IP rules with this address */
+ for ($i = 0; isset($config['nat']['rule'][$i]); $i++) {
+ if ($config['nat']['rule'][$i]['destination']['address'] == $a_vip[$id]['subnet']) {
+ $config['nat']['rule'][$i]['destination']['address'] = $vipent['subnet'];
+ }
+ }
+ }
+ $a_vip[$id] = $vipent;
+
+ if (write_config()) {
+ mark_subsystem_dirty('vip');
+ file_put_contents("{$g['tmp_path']}/.firewall_virtual_ip.apply", serialize($toapplylist));
+ }
+ header("Location: firewall_virtual_ip.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Firewall"), gettext("Virtual IP Address"), gettext("Edit"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+function get_radio_value(obj) {
+ for (i = 0; i < obj.length; i++) {
+ if (obj[i].checked) {
+ return obj[i].value;
+ }
+ }
+ return null;
+}
+function set_note(noteMessage) {
+ var note = document.getElementById("typenote");
+ if (note.firstChild != null) {
+ note.removeChild(note.firstChild);
+ }
+ if (noteMessage) {
+ note.appendChild(noteMessage);
+ }
+}
+function enable_change() {
+ var carpnote = document.createTextNode("<?=gettext("This must be the network's subnet mask. It does not specify a CIDR range.");?>");
+ var proxyarpnote = document.createTextNode("<?=gettext("This is a CIDR block of proxy ARP addresses.");?>");
+ var ipaliasnote = document.createTextNode("<?=gettext("This must be the network's subnet mask. It does not specify a CIDR range.");?>");
+
+ $mode = get_radio_value(document.iform.mode);
+
+ document.iform.password.disabled = $mode != "carp";
+ document.iform.vhid.disabled = $mode != "carp";
+ document.iform.advskew.disabled = $mode != "carp";
+ document.iform.advbase.disabled = $mode != "carp";
+ document.iform.type.disabled = $mode in {"carp":1, "ipalias":1};
+
+ if ($mode in {"carp":1, "ipalias":1}) {
+ document.iform.type.selectedIndex = 0;// single-adress
+ }
+ switch ($mode) {
+ case "carp" : set_note(carpnote); break;
+ case "ipalias" : set_note(ipaliasnote); break;
+ case "proxyarp": set_note(proxyarpnote); break;
+ default: set_note(undefined);
+ }
+ typesel_change();
+}
+
+function typesel_change() {
+ switch (document.iform.type.selectedIndex) {
+ case 0: // single
+ document.iform.subnet.disabled = 0;
+ document.iform.subnet_bits.disabled = (get_radio_value(document.iform.mode) == "proxyarp") || (get_radio_value(document.iform.mode) == "other");
+ document.iform.noexpand.disabled = 1;
+ jQuery('#noexpandrow').css('display', 'none');
+ break;
+ case 1: // network
+ document.iform.subnet.disabled = 0;
+ document.iform.subnet_bits.disabled = 0;
+ document.iform.noexpand.disabled = 0;
+ jQuery('#noexpandrow').css('display', '');
+ //document.iform.range_from.disabled = 1;
+ //document.iform.range_to.disabled = 1;
+ break;
+ case 2: // range
+ document.iform.subnet.disabled = 1;
+ document.iform.subnet_bits.disabled = 1;
+ document.iform.noexpand.disabled = 1;
+ jQuery('#noexpandrow').css('display', 'none');
+ //document.iform.range_from.disabled = 0;
+ //document.iform.range_to.disabled = 0;
+ break;
+ case 3: // IP alias
+ document.iform.subnet.disabled = 1;
+ document.iform.subnet_bits.disabled = 0;
+ document.iform.noexpand.disabled = 1;
+ jQuery('#noexpandrow').css('display', 'none');
+ //document.iform.range_from.disabled = 0;
+ //document.iform.range_to.disabled = 0;
+ break;
+ }
+}
+//]]>
+</script>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="firewall_virtual_ip_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="virtual IP edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Virtual IP");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Type");?></td>
+ <td width="78%" class="vtable">
+ <input name="mode" type="radio" onclick="enable_change()" value="ipalias"
+ <?php if ($pconfig['mode'] == "ipalias") echo "checked=\"checked\"";?> /> <?=gettext("IP Alias");?>
+ <input name="mode" type="radio" onclick="enable_change()" value="carp"
+ <?php if ($pconfig['mode'] == "carp") echo "checked=\"checked\"";?> /> <?=gettext("CARP"); ?>
+ <input name="mode" type="radio" onclick="enable_change()" value="proxyarp"
+ <?php if ($pconfig['mode'] == "proxyarp") echo "checked=\"checked\"";?> /> <?=gettext("Proxy ARP"); ?>
+ <input name="mode" type="radio" onclick="enable_change()" value="other"
+ <?php if ($pconfig['mode'] == "other") echo "checked=\"checked\"";?> /> <?=gettext("Other");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect">
+ <?php
+ $interfaces = get_configured_interface_with_descr(false, true);
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip) {
+ $interfaces[$cif] = $carpip . ' (' . get_vip_descr($carpip) . ')';
+ }
+ $interfaces['lo0'] = 'Localhost';
+ foreach ($interfaces as $iface => $ifacename): ?>
+ <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("IP Address(es)");?></td>
+ <td class="vtable">
+ <table border="0" cellspacing="0" cellpadding="0" summary="ip addresses">
+ <tr>
+ <td><?=gettext("Type:");?>&nbsp;&nbsp;</td>
+ <td>
+ <select name="type" class="formselect" onchange="typesel_change()">
+ <option value="single" <?php if ((!$pconfig['range'] && $pconfig['subnet_bits'] == 32) || (!isset($pconfig['subnet']))) echo "selected=\"selected\""; ?>>
+ <?=gettext("Single address");?>
+ </option>
+ <option value="network" <?php if (!$pconfig['range'] && $pconfig['subnet_bits'] != 32 && isset($pconfig['subnet'])) echo "selected=\"selected\""; ?>>
+ <?=gettext("Network");?>
+ </option>
+ <!-- XXX: Billm, don't let anyone choose this until NAT configuration screens are ready for it <option value="range" <?php if ($pconfig['range']) echo "selected=\"selected\""; ?>>
+ Range</option> -->
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="subnet" type="text" class="formfld unknown ipv4v6" id="subnet" size="28" value="<?=htmlspecialchars($pconfig['subnet']);?>" />
+ /
+ <select name="subnet_bits" class="formselect ipv4v6" id="select">
+ <?php for ($i = 128; $i >= 1; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['subnet_bits']) echo "selected=\"selected\""; ?>>
+ <?=$i;?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ <i id="typenote"></i>
+ </td>
+ </tr>
+ <tr id="noexpandrow">
+ <td><?=gettext("Expansion:");?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="noexpand" type="checkbox" class="formfld unknown" id="noexpand" <?php echo (isset($pconfig['noexpand'])) ? "checked=\"checked\"" : "" ; ?> />
+ Disable expansion of this entry into IPs on NAT lists (e.g. 192.168.1.0/24 expands to 256 entries.)
+ </td>
+ </tr>
+ <?php
+ /*
+ <tr>
+ <td>Range:&nbsp;&nbsp;</td>
+ <td><input name="range_from" type="text" class="formfld unknown" id="range_from" size="28" value="<?=htmlspecialchars($pconfig['range']['from']);?>" />
+-
+ <input name="range_to" type="text" class="formfld unknown" id="range_to" size="28" value="<?=htmlspecialchars($pconfig['range']['to']);?>" />
+ </td>
+ </tr>
+ */
+?>
+ </table>
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncellreq"><?=gettext("Virtual IP Password");?></td>
+ <td class="vtable"><input type='password' name='password' value="<?=htmlspecialchars($pconfig['password']);?>" />
+ <br /><?=gettext("Enter the VHID group password.");?>
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncellreq"><?=gettext("VHID Group");?></td>
+ <td class="vtable">
+ <select id='vhid' name='vhid'>
+ <?php for ($i = 1; $i <= 255; $i++): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['vhid']) echo "selected=\"selected\""; ?>>
+ <?=$i;?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ <br /><?=gettext("Enter the VHID group that the machines will share");?>
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncellreq"><?=gettext("Advertising Frequency");?></td>
+ <td class="vtable">
+ Base:
+ <select id='advbase' name='advbase'>
+ <?php for ($i = 1; $i <= 254; $i++): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['advbase']) echo "selected=\"selected\""; ?>>
+ <?=$i;?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ Skew:
+ <select id='advskew' name='advskew'>
+ <?php for ($i = 0; $i <= 254; $i++): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['advskew']) echo "selected=\"selected\""; ?>>
+ <?=$i;?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ <br /><br />
+ <?=gettext("The frequency that this machine will advertise. 0 means usually master. Otherwise the lowest combination of both values in the cluster determines the master.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_vip[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ <input name="uniqid" type="hidden" value="<?=$pconfig['uniqid'];?>" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="4">
+ <span class="vexpl">
+ <span class="red">
+ <b><?=gettext("Note:");?><br /></b>
+ </span>&nbsp;&nbsp;
+ <?=gettext("Proxy ARP and Other type Virtual IPs cannot be bound to by anything running on the firewall, such as IPsec, OpenVPN, etc. Use a CARP or IP Alias type address for these cases.");?>
+ <br /><br />&nbsp;&nbsp;&nbsp;<?=gettext("For more information on CARP and the above values, visit the OpenBSD ");?><a href='http://www.openbsd.org/faq/pf/carp.html'> <?=gettext("CARP FAQ"); ?></a>.
+ </span>
+ </td>
+ </tr>
+ </table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change();
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/getserviceproviders.php b/src/usr/local/www/getserviceproviders.php
new file mode 100644
index 0000000..cb456aa
--- /dev/null
+++ b/src/usr/local/www/getserviceproviders.php
@@ -0,0 +1,150 @@
+<?php
+/*
+ getserviceproviders.php
+ Copyright (C) 2010 Vinicius Coque <vinicius.coque@bluepex.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: ajax
+*/
+
+##|+PRIV
+##|*IDENT=page-getserviceproviders
+##|*NAME=AJAX: Get Service Providers
+##|*DESCR=Allow access to the 'AJAX: Service Providers' page.
+##|*MATCH=getserviceproviders.php*
+##|-PRIV
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+
+$serviceproviders_xml = "/usr/local/share/mobile-broadband-provider-info/serviceproviders.xml";
+$serviceproviders_contents = file_get_contents($serviceproviders_xml);
+$serviceproviders_attr = xml2array($serviceproviders_contents, 1, "attr");
+
+$serviceproviders = &$serviceproviders_attr['serviceproviders']['country'];
+
+function get_country_providers($country) {
+ global $serviceproviders;
+ foreach ($serviceproviders as $sp) {
+ if ($sp['attr']['code'] == strtolower($country)) {
+ return is_array($sp['provider'][0]) ? $sp['provider'] : array($sp['provider']);
+ }
+ }
+ return $provider_list;
+}
+
+function country_list() {
+ global $serviceproviders;
+ $country_list = get_country_name("ALL");
+ foreach ($serviceproviders as $sp) {
+ foreach ($country_list as $country) {
+ if (strtoupper($sp['attr']['code']) == $country['code']) {
+ echo $country['name'] . ":" . $country['code'] . "\n";
+ }
+ }
+ }
+}
+
+function providers_list($country) {
+ $serviceproviders = get_country_providers($country);
+ foreach ($serviceproviders as $sp) {
+ echo $sp['name']['value'] . "\n";
+ }
+}
+
+function provider_plan_data($country, $provider, $connection) {
+ header("Content-type: application/xml;");
+ echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ echo "<connection>\n";
+ $serviceproviders = get_country_providers($country);
+ foreach ($serviceproviders as $sp) {
+ if (strtolower($sp['name']['value']) == strtolower($provider)) {
+ if (strtoupper($connection) == "CDMA") {
+ $conndata = $sp['cdma'];
+ } else {
+ if (!is_array($sp['gsm']['apn'][0])) {
+ $conndata = $sp['gsm']['apn'];
+ } else {
+ foreach ($sp['gsm']['apn'] as $apn) {
+ if ($apn['attr']['value'] == $connection) {
+ $conndata = $apn;
+ break;
+ }
+ }
+ }
+ }
+ if (is_array($conndata)) {
+ echo "<apn>" . $connection . "</apn>\n";
+ echo "<username>" . $conndata['username']['value'] . "</username>\n";
+ echo "<password>" . $conndata['password']['value'] . "</password>\n";
+
+ $dns_arr = is_array($conndata['dns'][0]) ? $conndata['dns'] : array($conndata['dns']);
+ foreach ($dns_arr as $dns) {
+ echo '<dns>' . $dns['value'] . "</dns>\n";
+ }
+ }
+ break;
+ }
+ }
+ echo "</connection>";
+}
+
+function provider_plans_list($country, $provider) {
+ $serviceproviders = get_country_providers($country);
+ foreach ($serviceproviders as $sp) {
+ if (strtolower($sp['name']['value']) == strtolower($provider)) {
+ if (array_key_exists('gsm', $sp)) {
+ if (array_key_exists('attr', $sp['gsm']['apn'])) {
+ $name = ($sp['gsm']['apn']['name'] ? $sp['gsm']['apn']['name'] : $sp['name']['value']);
+ echo $name . ":" . $sp['gsm']['apn']['attr']['value'];
+ } else {
+ foreach ($sp['gsm']['apn'] as $apn_info) {
+ $name = ($apn_info['name']['value'] ? $apn_info['name']['value'] : $apn_info['gsm']['apn']['name']);
+ echo $name . ":" . $apn_info['attr']['value'] . "\n";
+ }
+ }
+ }
+ if (array_key_exists('cdma', $sp)) {
+ $name = $sp['cdma']['name']['value'] ? $sp['cdma']['name']['value']:$sp['name']['value'];
+ echo $name . ":" . "CDMA";
+ }
+ }
+ }
+}
+
+$_GET_OR_POST = ($_SERVER['REQUEST_METHOD'] === 'POST') ? $_POST : $_GET;
+
+if (isset($_GET_OR_POST['country']) && !isset($_GET_OR_POST['provider'])) {
+ providers_list($_GET_OR_POST['country']);
+} elseif (isset($_GET_OR_POST['country']) && isset($_GET_OR_POST['provider'])) {
+ if (isset($_GET_OR_POST['plan'])) {
+ provider_plan_data($_GET_OR_POST['country'], $_GET_OR_POST['provider'], $_GET_OR_POST['plan']);
+ } else {
+ provider_plans_list($_GET_OR_POST['country'], $_GET_OR_POST['provider']);
+ }
+} else {
+ country_list();
+}
+?>
diff --git a/src/usr/local/www/getstats.php b/src/usr/local/www/getstats.php
new file mode 100644
index 0000000..886114b
--- /dev/null
+++ b/src/usr/local/www/getstats.php
@@ -0,0 +1,50 @@
+<?php
+/*
+ getstats.php
+ Copyright (C) 2009 Bill Marquette
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: ajax
+*/
+
+##|+PRIV
+##|*IDENT=page-getstats
+##|*NAME=AJAX: Get Stats
+##|*DESCR=Allow access to the 'AJAX: Get Stats' page.
+##|*MATCH=getstats.php*
+##|-PRIV
+
+header("Last-Modified: " . gmdate("D, j M Y H:i:s") . " GMT");
+header("Expires: " . gmdate("D, j M Y H:i:s", time()) . " GMT");
+header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP/1.1
+header("Pragma: no-cache"); // HTTP/1.0
+
+require_once("guiconfig.inc");
+include_once("includes/functions.inc.php");
+
+echo get_stats();
+
+?>
diff --git a/src/usr/local/www/graph.php b/src/usr/local/www/graph.php
new file mode 100755
index 0000000..d637836
--- /dev/null
+++ b/src/usr/local/www/graph.php
@@ -0,0 +1,408 @@
+<?php
+/*
+ graph.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2006 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: graph
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-interfacetraffic
+##|*NAME=Diagnostics: Interface Traffic page
+##|*DESCR=Allow access to the 'Diagnostics: Interface Traffic' page.
+##|*MATCH=graph.php*
+##|-PRIV
+
+require("globals.inc");
+require("guiconfig.inc");
+
+header("Last-Modified: " . gmdate("D, j M Y H:i:s") . " GMT");
+header("Expires: " . gmdate("D, j M Y H:i:s", time()) . " GMT");
+header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP/1.1
+header("Pragma: no-cache"); // HTTP/1.0
+header("Content-type: image/svg+xml");
+
+/********** HTTP GET Based Conf ***********/
+$ifnum = @$_GET["ifnum"]; // BSD / SNMP interface name / number
+$ifnum = get_real_interface($ifnum);
+$ifname = @$_GET["ifname"]?$_GET["ifname"]:"Interface $ifnum"; //Interface name that will be showed on top right of graph
+
+/********* Other conf *******/
+if (isset($config["widgets"]["trafficgraphs"]["scale_type"])) {
+ $scale_type = $config["widgets"]["trafficgraphs"]["scale_type"];
+} else {
+ $scale_type = "up";
+}
+
+$nb_plot=120; //NB plot in graph
+if ($_GET["timeint"]) {
+ $time_interval = $_GET["timeint"]; //Refresh time Interval
+} else {
+ $time_interval = 3;
+}
+
+if ($_GET["initdelay"]) {
+ $init_delay = $_GET["initdelay"]; //Initial Delay
+} else {
+ $init_delay = 3;
+}
+
+//SVG attributes
+$attribs['axis']='fill="black" stroke="black"';
+$attribs['in']='fill="#FF0000" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="7"';
+$attribs['out']='fill="#000000" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="7"';
+$attribs['graph_in']='fill="none" stroke="#FF0000" stroke-opacity="0.8"';
+$attribs['graph_out']='fill="none" stroke="#000000" stroke-opacity="0.8"';
+$attribs['legend']='fill="black" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4"';
+$attribs['graphname']='fill="#FF0000" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="8"';
+$attribs['grid_txt']='fill="gray" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="6"';
+$attribs['grid']='stroke="gray" stroke-opacity="0.5"';
+$attribs['switch_unit']='fill="#FF0000" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4" text-decoration="underline"';
+$attribs['switch_scale']='fill="#FF0000" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4" text-decoration="underline"';
+$attribs['error']='fill="blue" font-family="Arial" font-size="4"';
+$attribs['collect_initial']='fill="gray" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4"';
+
+//Error text if we cannot fetch data : depends on which method is used
+$error_text = "Cannot get data about interface " . htmlspecialchars($ifnum);
+
+$height=100; //SVG internal height : do not modify
+$width=200; //SVG internal width : do not modify
+
+$fetch_link = "ifstats.php?if=" . htmlspecialchars($ifnum);
+
+/* check for custom theme colors */
+if (file_exists("/usr/local/www/themes/{$g['theme']}/graph.php")) {
+ $themetxt = file_get_contents("/usr/local/www/themes/{$g['theme']}/graph.php");
+ eval($themetxt);
+}
+
+/********* Graph DATA **************/
+print('<?xml version="1.0" encoding="UTF-8"?>' . "\n");?>
+<svg width="100%" height="100%" viewBox="0 0 <?=$width?> <?=$height?>" preserveAspectRatio="none" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" onload="init(evt)">
+ <g id="graph">
+ <rect id="bg" x1="0" y1="0" width="100%" height="100%" fill="white"/>
+ <line id="axis_x" x1="0" y1="0" x2="0" y2="100%" <?=$attribs['axis']?>/>
+ <line id="axis_y" x1="0" y1="100%" x2="100%" y2="100%" <?=$attribs['axis']?>/>
+ <path id="graph_out" d="M0 <?=$height?> L 0 <?=$height?>" <?=$attribs['graph_out']?>/>
+ <path id="graph_in" d="M0 <?=$height?> L 0 <?=$height?>" <?=$attribs['graph_in']?>/>
+ <path id="grid" d="M0 <?=$height/4*1?> L <?=$width?> <?=$height/4*1?> M0 <?=$height/4*2?> L <?=$width?> <?=$height/4*2?> M0 <?=$height/4*3?> L <?=$width?> <?=$height/4*3?>" <?=$attribs['grid']?>/>
+ <text id="grid_txt1" x="<?=$width?>" y="<?=$height/4*1?>" <?=$attribs['grid_txt']?> text-anchor="end"> </text>
+ <text id="grid_txt2" x="<?=$width?>" y="<?=$height/4*2?>" <?=$attribs['grid_txt']?> text-anchor="end"> </text>
+ <text id="grid_txt3" x="<?=$width?>" y="<?=$height/4*3?>" <?=$attribs['grid_txt']?> text-anchor="end"> </text>
+ <text id="graph_in_lbl" x="5" y="8" <?=$attribs['in']?>><?=gettext("In"); ?></text>
+ <text id="graph_out_lbl" x="5" y="16" <?=$attribs['out']?>><?=gettext("Out"); ?></text>
+ <text id="graph_in_txt" x="20" y="8" <?=$attribs['in']?>> </text>
+ <text id="graph_out_txt" x="20" y="16" <?=$attribs['out']?>> </text>
+ <text id="ifname" x="<?=$width?>" y="8" <?=$attribs['graphname']?> text-anchor="end"><?=htmlspecialchars($ifname)?></text>
+ <text id="switch_unit" x="<?=$width*0.55?>" y="5" <?=$attribs['switch_unit']?>><?=gettext("Switch to bytes/s"); ?></text>
+ <text id="switch_scale" x="<?=$width*0.55?>" y="11" <?=$attribs['switch_scale']?>><?=gettext("AutoScale"); ?> (<?=$scale_type?>)</text>
+ <text id="date" x="<?=$width*0.33?>" y="5" <?=$attribs['legend']?>> </text>
+ <text id="time" x="<?=$width*0.33?>" y="11" <?=$attribs['legend']?>> </text>
+ <text id="graphlast" x="<?=$width*0.55?>" y="17" <?=$attribs['legend']?>><?=gettext("Graph shows last"); ?> <?=$time_interval*$nb_plot?> <?=gettext("seconds"); ?></text>
+ <polygon id="axis_arrow_x" <?=$attribs['axis']?> points="<?=($width) . "," . ($height)?> <?=($width-2) . "," . ($height-2)?> <?=($width-2) . "," . $height?>"/>
+ <text id="error" x="<?=$width*0.5?>" y="<?=$height*0.5?>" visibility="hidden" <?=$attribs['error']?> text-anchor="middle"><?=$error_text?></text>
+ <text id="collect_initial" x="<?=$width*0.5?>" y="<?=$height*0.5?>" visibility="hidden" <?=$attribs['collect_initial']?> text-anchor="middle"><?=gettext("Collecting initial data, please wait"); ?>...</text>
+ </g>
+ <script type="text/ecmascript">
+ <![CDATA[
+
+/**
+ * getURL is a proprietary Adobe function, but it's simplicity has made it very
+ * popular. If getURL is undefined we spin our own by wrapping XMLHttpRequest.
+ */
+if (typeof getURL == 'undefined') {
+ getURL = function(url, callback) {
+ if (!url) {
+ throw '<?=gettext("No URL for getURL"); ?>';
+ }
+
+ try {
+ if (typeof callback.operationComplete == 'function') {
+ callback = callback.operationComplete;
+ }
+ } catch (e) {}
+ if (typeof callback != 'function') {
+ throw '<?=gettext("No callback function for getURL"); ?>';
+ }
+
+ var http_request = null;
+ if (typeof XMLHttpRequest != 'undefined') {
+ http_request = new XMLHttpRequest();
+ } else if (typeof ActiveXObject != 'undefined') {
+ try {
+ http_request = new ActiveXObject('Msxml2.XMLHTTP');
+ } catch (e) {
+ try {
+ http_request = new ActiveXObject('Microsoft.XMLHTTP');
+ } catch (e) {}
+ }
+ }
+ if (!http_request) {
+ throw '<?=gettext("Both getURL and XMLHttpRequest are undefined"); ?>';
+ }
+
+ http_request.onreadystatechange = function() {
+ if (http_request.readyState == 4) {
+ callback( { success : true,
+ content : http_request.responseText,
+ contentType : http_request.getResponseHeader("Content-Type") } );
+ }
+ }
+ http_request.open('GET', url, true);
+ http_request.send(null);
+ }
+}
+
+var SVGDoc = null;
+var last_ifin = 0;
+var last_ifout = 0;
+var last_ugmt = 0;
+var max = 0;
+var plot_in = new Array();
+var plot_out = new Array();
+
+var max_num_points = <?=$nb_plot?>; // maximum number of plot data points
+var step = <?=$width?> / max_num_points ;
+var unit = 'bits';
+var scale_type = '<?=$scale_type?>';
+
+function init(evt) {
+ SVGDoc = evt.target.ownerDocument;
+ SVGDoc.getElementById("switch_unit").addEventListener("mousedown", switch_unit, false);
+ SVGDoc.getElementById("switch_scale").addEventListener("mousedown", switch_scale, false);
+
+ fetch_data();
+}
+
+function switch_unit(event) {
+ SVGDoc.getElementById('switch_unit').firstChild.data = '<?=gettext("Switch to"); ?> ' + unit + '/s';
+ unit = (unit == 'bits') ? 'bytes' : 'bits';
+}
+
+function switch_scale(event) {
+ scale_type = (scale_type == 'up') ? '<?=gettext("follow"); ?>' : '<?=gettext("up"); ?>';
+ SVGDoc.getElementById('switch_scale').firstChild.data = 'AutoScale (' + scale_type + ')';
+}
+
+function fetch_data() {
+ getURL('<?=$fetch_link?>', plot_data);
+}
+
+function plot_data(obj) {
+ // Show datetimelegend
+ var now = new Date();
+ var time = LZ(now.getHours()) + ":" + LZ(now.getMinutes()) + ":" + LZ(now.getSeconds());
+ SVGDoc.getElementById('time').firstChild.data = time;
+ var date = (now.getMonth()+1) + "/" + now.getDate() + "/" + now.getFullYear();
+ SVGDoc.getElementById('date').firstChild.data = date;
+
+ if (!obj.success) {
+ return handle_error(); // getURL failed to get data
+ }
+
+ var t = obj.content.split("|");
+ var ugmt = parseFloat(t[0]); // ugmt is an unixtimestamp style
+ var ifin = parseInt(t[1], 10); // number of bytes received by the interface
+ var ifout = parseInt(t[2], 10); // number of bytes sent by the interface
+ var scale;
+
+ if (!isNumber(ifin) || !isNumber(ifout)) {
+ return handle_error();
+ }
+
+ var diff_ugmt = ugmt - last_ugmt;
+ var diff_ifin = ifin - last_ifin;
+ var diff_ifout = ifout - last_ifout;
+
+ if (diff_ugmt == 0) {
+ diff_ugmt = 1; /* avoid division by zero */
+ }
+
+ last_ugmt = ugmt;
+ last_ifin = ifin;
+ last_ifout = ifout;
+ var graphTimerId = 0;
+ switch (plot_in.length) {
+ case 0:
+ SVGDoc.getElementById("collect_initial").setAttributeNS(null, 'visibility', 'visible');
+ plot_in[0] = diff_ifin / diff_ugmt;
+ plot_out[0] = diff_ifout / diff_ugmt;
+ setTimeout('fetch_data()', <?=1000*($time_interval + $init_delay)?>);
+ return;
+ case 1:
+ SVGDoc.getElementById("collect_initial").setAttributeNS(null, 'visibility', 'hidden');
+ break;
+ case max_num_points:
+ // shift plot to left if the maximum number of plot points has been reached
+ var i = 0;
+ while (i < max_num_points) {
+ plot_in[i] = plot_in[i+1];
+ plot_out[i] = plot_out[++i];
+ }
+ plot_in.length--;
+ plot_out.length--;
+ }
+
+ plot_in[plot_in.length] = diff_ifin / diff_ugmt;
+ plot_out[plot_out.length]= diff_ifout / diff_ugmt;
+ var index_plot = plot_in.length - 1;
+
+ SVGDoc.getElementById('graph_in_txt').firstChild.data = formatSpeed(plot_in[index_plot], unit);
+ SVGDoc.getElementById('graph_out_txt').firstChild.data = formatSpeed(plot_out[index_plot], unit);
+
+ /* determine peak for sensible scaling */
+ if (scale_type == 'up') {
+ if (plot_in[index_plot] > max) {
+ max = plot_in[index_plot];
+ }
+ if (plot_out[index_plot] > max) {
+ max = plot_out[index_plot];
+ }
+ } else if (scale_type == 'follow') {
+ i = 0;
+ max = 0;
+ while (i < plot_in.length) {
+ if (plot_in[i] > max) {
+ max = plot_in[i];
+ }
+ if (plot_out[i] > max) {
+ max = plot_out[i];
+ }
+ i++;
+ }
+ }
+
+ var rmax; // max, rounded up
+
+ if (unit == 'bits') {
+ /* round up max, such that
+ 100 kbps -> 200 kbps -> 400 kbps -> 800 kbps -> 1 Mbps -> 2 Mbps -> ... */
+ rmax = 12500;
+ i = 0;
+ while (max > rmax) {
+ i++;
+ if (i && (i % 4 == 0)) {
+ rmax *= 1.25;
+ } else {
+ rmax *= 2;
+ }
+ }
+ } else {
+ /* round up max, such that
+ 10 KB/s -> 20 KB/s -> 40 KB/s -> 80 KB/s -> 100 KB/s -> 200 KB/s -> 400 KB/s -> 800 KB/s -> 1 MB/s ... */
+ rmax = 10240;
+ i = 0;
+ while (max > rmax) {
+ i++;
+ if (i && (i % 4 == 0)) {
+ rmax *= 1.25;
+ } else {
+ rmax *= 2;
+ }
+
+ if (i == 8) {
+ rmax *= 1.024;
+ }
+ }
+ }
+
+ scale = <?=$height?> / rmax;
+
+ /* change labels accordingly */
+ SVGDoc.getElementById('grid_txt1').firstChild.data = formatSpeed(3*rmax/4, unit);
+ SVGDoc.getElementById('grid_txt2').firstChild.data = formatSpeed(2*rmax/4, unit);
+ SVGDoc.getElementById('grid_txt3').firstChild.data = formatSpeed(rmax/4, unit);
+
+ var path_in = "M 0 " + (<?=$height?> - (plot_in[0] * scale));
+ var path_out = "M 0 " + (<?=$height?> - (plot_out[0] * scale));
+ for (i = 1; i < plot_in.length; i++) {
+ var x = step * i;
+ var y_in = <?=$height?> - (plot_in[i] * scale);
+ var y_out = <?=$height?> - (plot_out[i] * scale);
+ path_in += " L" + x + " " + y_in;
+ path_out += " L" + x + " " + y_out;
+ }
+
+ SVGDoc.getElementById('error').setAttributeNS(null, 'visibility', 'hidden');
+ SVGDoc.getElementById('graph_in').setAttributeNS(null, 'd', path_in);
+ SVGDoc.getElementById('graph_out').setAttributeNS(null, 'd', path_out);
+
+ setTimeout('fetch_data()', <?=1000*$time_interval?>);
+}
+
+function handle_error() {
+ SVGDoc.getElementById("error").setAttributeNS(null, 'visibility', 'visible');
+ setTimeout('fetch_data()', <?=1000*$time_interval?>);
+}
+
+function isNumber(a) {
+ return typeof a == 'number' && isFinite(a);
+}
+
+function formatSpeed(speed, unit) {
+ if (unit == 'bits') {
+ return formatSpeedBits(speed);
+ }
+ if (unit == 'bytes') {
+ return formatSpeedBytes(speed);
+ }
+}
+
+function formatSpeedBits(speed) {
+ // format speed in bits/sec, input: bytes/sec
+ if (speed < 125000) {
+ return Math.round(speed / 125) + " <?=gettext("Kbps"); ?>";
+ }
+ if (speed < 125000000) {
+ return Math.round(speed / 1250)/100 + " <?=gettext("Mbps"); ?>";
+ }
+ // else
+ return Math.round(speed / 1250000)/100 + " <?=gettext("Gbps"); ?>"; /* wow! */
+}
+
+function formatSpeedBytes(speed) {
+ // format speed in bytes/sec, input: bytes/sec
+ if (speed < 1048576) {
+ return Math.round(speed / 10.24)/100 + " <?=gettext("KB/s"); ?>";
+ }
+ if (speed < 1073741824) {
+ return Math.round(speed / 10485.76)/100 + " <?=gettext("MB/s"); ?>";
+ }
+ // else
+ return Math.round(speed / 10737418.24)/100 + " <?=gettext("GB/s"); ?>"; /* wow! */
+}
+
+function LZ(x) {
+ return (x < 0 || x > 9 ? "" : "0") + x;
+}
+
+ ]]>
+ </script>
+</svg>
diff --git a/src/usr/local/www/graph_cpu.php b/src/usr/local/www/graph_cpu.php
new file mode 100644
index 0000000..80d97f1
--- /dev/null
+++ b/src/usr/local/www/graph_cpu.php
@@ -0,0 +1,211 @@
+<?php
+/*
+ $Id$
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: graph
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-cpuutilization
+##|*NAME=Diagnostics: CPU Utilization page
+##|*DESCR=Allow access to the 'Diagnostics: CPU Utilization' page.
+##|*MATCH=graph_cpu.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+
+header("Last-Modified: " . gmdate("D, j M Y H:i:s") . " GMT");
+header("Expires: " . gmdate("D, j M Y H:i:s", time()) . " GMT");
+header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP/1.1
+header("Pragma: no-cache"); // HTTP/1.0
+header("Content-type: image/svg+xml");
+
+/********* Other conf *******/
+
+$nb_plot = 120; // maximum number of data points to plot in the graph
+$fetch_link = "stats.php?stats=cpu";
+
+//SVG attributes
+$attribs['axis']='fill="black" stroke="black"';
+$attribs['cpu']='fill="#FF0000" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="7"';
+$attribs['graph_cpu']='fill="none" stroke="#FF0000" stroke-opacity="0.8"';
+$attribs['legend']='fill="black" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4"';
+$attribs['grid_txt']='fill="gray" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="6"';
+$attribs['grid']='stroke="gray" stroke-opacity="0.5"';
+$attribs['error']='fill="blue" font-family="Arial" font-size="4"';
+$attribs['collect_initial']='fill="gray" font-family="Tahoma, Verdana, Arial, Helvetica, sans-serif" font-size="4"';
+
+$height=100; // SVG internal height : do not modify
+$width=200; // SVG internal width : do not modify
+
+/********* Graph DATA **************/
+print('<?xml version="1.0" encoding="UTF-8"?>' . "\n");?>
+<svg width="100%" height="100%" viewBox="0 0 <?=$width?> <?=$height?>" preserveAspectRatio="none" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" onload="init(evt);">
+ <g id="graph">
+ <rect id="bg" x1="0" y1="0" width="100%" height="100%" fill="white"/>
+ <line id="axis_x" x1="0" y1="0" x2="0" y2="100%" <?=$attribs['axis']?>/>
+ <line id="axis_y" x1="0" y1="100%" x2="100%" y2="100%" <?=$attribs['axis']?>/>
+ <polygon id="axis_arrow_x" <?=$attribs['axis']?> points="<?=($width) . "," . ($height)?> <?=($width-2) . "," . ($height-2)?> <?=($width-2) . "," . $height?>"/>
+ <path id="graph_cpu" d="" <?=$attribs['graph_cpu']?>/>
+ <path id="grid" d="M0 <?=$height/4*1?> L <?=$width?> <?=$height/4*1?> M0 <?=$height/4*2?> L <?=$width?> <?=$height/4*2?> M0 <?=$height/4*3?> L <?=$width?> <?=$height/4*3?>" <?=$attribs['grid']?>/>
+ <text id="grid_txt1" x="100%" y="25%" <?=$attribs['grid_txt']?> text-anchor="end">75%</text>
+ <text id="grid_txt2" x="100%" y="50%" <?=$attribs['grid_txt']?> text-anchor="end">50%</text>
+ <text id="grid_txt3" x="100%" y="75%" <?=$attribs['grid_txt']?> text-anchor="end">25%</text>
+ <text id="graph_cpu_txt" x="4" y="8" <?=$attribs['cpu']?>> </text>
+ <text id="error" x="50%" y="50%" visibility="hidden" <?=$attribs['error']?> text-anchor="middle"><?=gettext("Cannot get CPU load"); ?></text>
+ <text id="collect_initial" x="50%" y="50%" visibility="hidden" <?=$attribs['collect_initial']?> text-anchor="middle"><?=gettext("Collecting initial data, please wait"); ?>...</text>
+ </g>
+ <script type="text/ecmascript">
+ <![CDATA[
+
+/**
+ * getURL is a proprietary Adobe function, but it's simplicity has made it very
+ * popular. If getURL is undefined we spin our own by wrapping XMLHttpRequest.
+ */
+if (typeof getURL == 'undefined') {
+ getURL = function(url, callback) {
+ if (!url) {
+ throw '<?=gettext("No URL for getURL"); ?>';
+ }
+
+ try {
+ if (typeof callback.operationComplete == 'function') {
+ callback = callback.operationComplete;
+ }
+ } catch (e) {}
+ if (typeof callback != 'function') {
+ throw '<?=gettext("No callback function for getURL"); ?>';
+ }
+
+ var http_request = null;
+ if (typeof XMLHttpRequest != 'undefined') {
+ http_request = new XMLHttpRequest();
+ } else if (typeof ActiveXObject != 'undefined') {
+ try {
+ http_request = new ActiveXObject('Msxml2.XMLHTTP');
+ } catch (e) {
+ try {
+ http_request = new ActiveXObject('Microsoft.XMLHTTP');
+ } catch (e) {}
+ }
+ }
+ if (!http_request) {
+ throw '<?=gettext("Both getURL and XMLHttpRequest are undefined"); ?>';
+ }
+
+ http_request.onreadystatechange = function() {
+ if (http_request.readyState == 4) {
+ callback( { success : true,
+ content : http_request.responseText,
+ contentType : http_request.getResponseHeader("Content-Type") } );
+ }
+ }
+ http_request.open('GET', url, true);
+ http_request.send(null);
+ }
+}
+
+var SVGDoc = null;
+var last_cpu_total = 0;
+var last_cpu_idle = 0;
+var diff_cpu_total = 0;
+var diff_cpu_idle = 0;
+var cpu_data = new Array();
+
+var max_num_points = <?=$nb_plot?>; // maximum number of plot data points
+var step = <?=$width?> / max_num_points; // plot X division size
+var scale = <?=$height?> / 100;
+
+function init(evt) {
+ SVGDoc = evt.target.ownerDocument;
+ fetch_data();
+}
+
+function fetch_data() {
+ getURL('<?=$fetch_link?>', plot_cpu_data);
+}
+
+function plot_cpu_data(obj) {
+ if (!obj.success) {
+ return handle_error(); // getURL failed to get current CPU load data
+ }
+
+ var cpu = parseInt(obj.content);
+ if (!isNumber(cpu)) {
+ return handle_error();
+ }
+
+ switch (cpu_data.length) {
+ case 0:
+ SVGDoc.getElementById("collect_initial").setAttributeNS(null, 'visibility', 'visible');
+ cpu_data[0] = cpu;
+ fetch_data();
+ return;
+ case 1:
+ SVGDoc.getElementById("collect_initial").setAttributeNS(null, 'visibility', 'hidden');
+ break;
+ case max_num_points:
+ // shift plot to left if the maximum number of plot points has been reached
+ var i = 0;
+ while (i < max_num_points) {
+ cpu_data[i] = cpu_data[++i];
+ }
+ --cpu_data.length;
+ }
+
+ cpu_data[cpu_data.length] = cpu;
+
+ var path_data = "M 0 " + (<?=$height?> - (cpu_data[0] * scale));
+ for (var i = 1; i < cpu_data.length; ++i) {
+ var x = step * i;
+ var y_cpu = <?=$height?> - (cpu_data[i] * scale);
+ path_data += " L" + x + " " + y_cpu;
+ }
+
+ SVGDoc.getElementById("error").setAttributeNS(null, 'visibility', 'hidden');
+ SVGDoc.getElementById('graph_cpu_txt').firstChild.data = cpu + '%';
+ SVGDoc.getElementById('graph_cpu').setAttributeNS(null, "d", path_data);
+
+ fetch_data();
+}
+
+function handle_error() {
+ SVGDoc.getElementById("error").setAttributeNS(null, 'visibility', 'visible');
+ fetch_data();
+}
+
+function isNumber(a) {
+ return typeof a == 'number' && isFinite(a);
+}
+
+ ]]>
+ </script>
+</svg>
diff --git a/src/usr/local/www/green_dot.jpg b/src/usr/local/www/green_dot.jpg
new file mode 100755
index 0000000..9df0abf
--- /dev/null
+++ b/src/usr/local/www/green_dot.jpg
Binary files differ
diff --git a/src/usr/local/www/gui.css b/src/usr/local/www/gui.css
new file mode 100755
index 0000000..d93c4d9
--- /dev/null
+++ b/src/usr/local/www/gui.css
@@ -0,0 +1,363 @@
+/*
+ pfSense_MODULE: base
+*/
+
+html,body {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 11px;
+}
+td,th,input,select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 11px;
+}
+form {
+ margin: 0px;
+}
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+a {
+ text-decoration: none;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 0.9em;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listrborder {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
diff --git a/src/usr/local/www/guiconfig.inc b/src/usr/local/www/guiconfig.inc
new file mode 100644
index 0000000..3b36f5f
--- /dev/null
+++ b/src/usr/local/www/guiconfig.inc
@@ -0,0 +1,1252 @@
+<?php
+/*
+ guiconfig.inc
+ by Scott Ullrich, Copyright 2004, All rights reserved.
+ originally based on of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: base
+*/
+
+/* Include authentication routines */
+/* THIS MUST BE ABOVE ALL OTHER CODE */
+if (!$nocsrf) {
+ function csrf_startup() {
+ csrf_conf('rewrite-js', '/csrf/csrf-magic.js');
+ $timeout_minutes = isset($config['system']['webgui']['session_timeout']) ? $config['system']['webgui']['session_timeout'] : 240;
+ csrf_conf('expires', $timeout_minutes * 60);
+ }
+ require_once("csrf/csrf-magic.php");
+}
+
+/* make sure nothing is cached */
+if (!$omit_nocacheheaders) {
+ header("Expires: 0");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+ header("Cache-Control: no-cache, no-store, must-revalidate");
+ header("Pragma: no-cache");
+}
+
+header("X-Frame-Options: SAMEORIGIN");
+require_once("authgui.inc");
+
+/* parse the configuration and include all configuration functions */
+require_once("functions.inc");
+
+/* Pull in all the gui related display classes) */
+foreach (scandir("/usr/local/www/classes/") as $file) {
+ if (substr($file, -4) == ".inc") {
+ require_once("classes/{$file}");
+ }
+}
+
+$g['theme'] = get_current_theme();
+
+/* Set the default interface language */
+if ($config['system']['language'] <> "") {
+ $g['language'] = $config['system']['language'];
+} elseif ($g['language'] == "") {
+ $g['language'] = 'en_US';
+}
+
+set_language($g['language']);
+
+/* used by progress bar */
+$lastseen = "-1";
+
+$navlevelsep = ": "; /* navigation level separator string */
+$mandfldhtml = ""; /* display this before mandatory input fields */
+$mandfldhtmlspc = ""; /* same as above, but with spacing */
+
+/* Some ajax scripts still need access to GUI */
+if (!$ignorefirmwarelock) {
+ if (is_subsystem_dirty('firmwarelock')) {
+ if (!$d_isfwfile) {
+ header("Location: system_firmware.php");
+ exit;
+ } else {
+ return;
+ }
+ }
+}
+
+/* Reserved table names to avoid collision */
+$reserved_table_names = array(
+ "bogons",
+ "bogonsv6",
+ "negate_networks",
+ "snort2c",
+ "sshlockout",
+ "tonatsubnets",
+ "virusprot",
+ "vpn_networks",
+ "webConfiguratorlockout"
+);
+
+$firewall_rules_dscp_types = array(
+ "af11",
+ "af12",
+ "af13",
+ "af21",
+ "af22",
+ "af23",
+ "af31",
+ "af32",
+ "af33",
+ "af41",
+ "af42",
+ "af43",
+ "VA",
+ "EF",
+ "cs1",
+ "cs2",
+ "cs3",
+ "cs4",
+ "cs5",
+ "cs6",
+ "cs7",
+ "0x01",
+ "0x02",
+ "0x04");
+
+$auth_server_types = array(
+ 'ldap' => "LDAP",
+ 'radius' => "Radius");
+
+$ldap_urltypes = array(
+ 'TCP - Standard' => 389,
+ 'SSL - Encrypted' => 636);
+
+$ldap_scopes = array(
+ 'one' => "One Level",
+ 'subtree' => "Entire Subtree");
+
+$ldap_protvers = array(
+ 2,
+ 3);
+
+$ldap_templates = array(
+
+ 'open' => array(
+ 'desc' => "OpenLDAP",
+ 'attr_user' => "cn",
+ 'attr_group' => "cn",
+ 'attr_member' => "member"),
+
+ 'msad' => array(
+ 'desc' => "Microsoft AD",
+ 'attr_user' => "samAccountName",
+ 'attr_group' => "cn",
+ 'attr_member' => "memberOf"),
+
+ 'edir' => array(
+ 'desc' => "Novell eDirectory",
+ 'attr_user' => "cn",
+ 'attr_group' => "cn",
+ 'attr_member' => "uniqueMember"));
+
+$radius_srvcs = array(
+ 'both' => "Authentication and Accounting",
+ 'auth' => "Authentication",
+ 'acct' => "Accounting");
+
+$netbios_nodetypes = array(
+ '0' => "none",
+ '1' => "b-node",
+ '2' => "p-node",
+ '4' => "m-node",
+ '8' => "h-node");
+
+/* some well known ports */
+$wkports = array(
+ 5999 => "CVSup",
+ 53 => "DNS",
+ 21 => "FTP",
+ 3000 => "HBCI",
+ 80 => "HTTP",
+ 443 => "HTTPS",
+ 5190 => "ICQ",
+ 113 => "IDENT/AUTH",
+ 143 => "IMAP",
+ 993 => "IMAP/S",
+ 4500 => "IPsec NAT-T",
+ 500 => "ISAKMP",
+ 1701 => "L2TP",
+ 389 => "LDAP",
+ 1755 => "MMS/TCP",
+ 7000 => "MMS/UDP",
+ 445 => "MS DS",
+ 3389 => "MS RDP",
+ 1512 => "MS WINS",
+ 1863 => "MSN",
+ 119 => "NNTP",
+ 123 => "NTP",
+ 138 => "NetBIOS-DGM",
+ 137 => "NetBIOS-NS",
+ 139 => "NetBIOS-SSN",
+ 1194 => "OpenVPN",
+ 110 => "POP3",
+ 995 => "POP3/S",
+ 1723 => "PPTP",
+ 1812 => "RADIUS",
+ 1813 => "RADIUS accounting",
+ 5004 => "RTP",
+ 5060 => "SIP",
+ 25 => "SMTP",
+ 465 => "SMTP/S",
+ 161 => "SNMP",
+ 162 => "SNMP-Trap",
+ 22 => "SSH",
+ 3478 => "STUN",
+ 587 => "SUBMISSION",
+ 3544 => "Teredo",
+ 23 => "Telnet",
+ 69 => "TFTP",
+ 5900 => "VNC");
+
+/* TCP flags */
+$tcpflags = array("fin", "syn", "rst", "psh", "ack", "urg", "ece", "cwr");
+
+$specialnets = array("(self)" => "This Firewall", "pptp" => "PPTP clients", "pppoe" => "PPPoE clients", "l2tp" => "L2TP clients");
+
+$spiflist = get_configured_interface_with_descr(false, true);
+foreach ($spiflist as $ifgui => $ifdesc) {
+ $specialnets[$ifgui] = $ifdesc . " net";
+ $specialnets[$ifgui . 'ip'] = $ifdesc . " address";
+}
+
+$medias = array(
+ "auto" => "autoselect",
+ "100full" => "100BASE-TX full-duplex",
+ "100half" => "100BASE-TX half-duplex",
+ "10full" => "10BASE-T full-duplex",
+ "10half" => "10BASE-T half-duplex");
+
+$wlan_modes = array(
+ "bss" => "Infrastructure (BSS)",
+ "adhoc" => "Ad-hoc (IBSS)",
+ "hostap" => "Access Point");
+
+function do_input_validation($postdata, $reqdfields, $reqdfieldsn, &$input_errors) {
+
+ /* check for bad control characters */
+ foreach ($postdata as $pn => $pd) {
+ if (is_string($pd) && preg_match("/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/", $pd)) {
+ $input_errors[] = sprintf(gettext("The field %s contains invalid characters."), $pn);
+ }
+ }
+
+ for ($i = 0; $i < count($reqdfields); $i++) {
+ if ($_POST[$reqdfields[$i]] == "" && $_REQUEST[$reqdfields[$i]] == "") {
+ $input_errors[] = sprintf(gettext("The field %s is required."), $reqdfieldsn[$i]);
+ }
+ }
+}
+
+function print_input_errors($input_errors) {
+ global $g;
+
+ print <<<EOF
+ <div id="inputerrorsdiv">
+ <table border="0" cellspacing="0" cellpadding="4" width="100%" summary="input errors">
+ <tr>
+ <td class="inputerrorsleft">
+ <img src="/themes/{$g['theme']}/images/icons/icon_error.gif" alt="errors" />
+ </td>
+ <td class="inputerrorsright errmsg">
+EOF;
+ echo "<p>" . gettext("The following input errors were detected:") . "</p>\n<ul>";
+ foreach ($input_errors as $ierr) {
+ echo "<li>" . htmlspecialchars($ierr) . "</li>";
+ }
+
+ print <<<EOF2
+ </ul>
+ </td>
+ </tr>
+ </table>
+ </div>
+ &nbsp;<br />
+EOF2;
+
+}
+
+function verify_gzip_file($fname) {
+ $returnvar = mwexec("/usr/bin/gzip -t " . escapeshellarg($fname));
+ if ($returnvar != 0) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
+function print_info_box_np($msg, $name = "apply", $value = "", $showapply = false) {
+ global $g, $nifty_redbox, $nifty_blackbox, $nifty_background;
+
+ if (empty($value)) {
+ $value = gettext("Apply changes");
+ }
+
+ // Set the Nifty background color if one is not set already (defaults to white)
+ if ($nifty_background == "") {
+ $nifty_background = "#FFF";
+ }
+
+ if (stristr($msg, gettext("apply")) != false || stristr($msg, gettext("save")) != false || stristr($msg, gettext("create")) != false || $showapply) {
+ $savebutton = "<td class=\"infoboxsave\">";
+ $savebutton .= "<input name=\"{$name}\" type=\"submit\" class=\"formbtn\" id=\"${name}\" value=\"{$value}\" />";
+ if ($_POST['if']) {
+ $savebutton .= "<input type=\"hidden\" name=\"if\" value=\"" . htmlspecialchars($_POST['if']) . "\" />";
+ }
+ $savebutton .= "</td>";
+ }
+ $nifty_redbox = "#990000";
+ $nifty_blackbox = "#000000";
+
+ $themename = $g['theme'];
+
+ if (file_exists("/usr/local/www/themes/{$themename}/tabcontrols.php")) {
+ $toeval = file_get_contents("/usr/local/www/themes/{$themename}/tabcontrols.php");
+ eval($toeval);
+ }
+
+ if (file_exists("/usr/local/www/themes/{$themename}/infobox.php")) {
+ $toeval = file_get_contents("/usr/local/www/themes/{$themename}/infobox.php");
+ eval($toeval);
+ }
+
+ if (!$savebutton) {
+ $savebutton = "<td class=\"infoboxsave\"><input value=\"" . gettext("Close") . "\" type=\"button\" onclick=\"jQuery(this).parents('table[id=redboxtable]').hide();\" /></td>";
+ }
+
+ echo <<<EOFnp
+ <table class="infobox" id="redboxtable" summary="red box table">
+ <tr>
+ <td>
+ <div class="infoboxnp" id="redbox">
+ <table class="infoboxnptable2" summary="message">
+ <tr>
+ <td class="infoboxnptd">
+ &nbsp;&nbsp;&nbsp;<img class="infoboxnpimg" src="/themes/{$g['theme']}/images/icons/icon_exclam.gif" alt="exclamation" />
+ </td>
+ <td class="infoboxnptd2">
+ <b>{$msg}</b>
+ </td>
+ {$savebutton}
+ </tr>
+ </table>
+ </div>
+ <div>
+ <p>&nbsp;</p>
+ </div>
+ </td>
+ </tr>
+ </table>
+ <script type="text/javascript">
+ //<![CDATA[
+ NiftyCheck();
+ Rounded("div#redbox","all","{$nifty_background}","{$nifty_redbox}","smooth");
+ Rounded("td#blackbox","all","{$nifty_background}","{$nifty_blackbox}","smooth");
+ //]]>
+ </script>
+EOFnp;
+
+}
+
+function print_info_box_np_undo($msg, $name = "apply", $value = "Apply changes", $undo) {
+ global $g;
+
+ if (stristr($msg, "apply") != false || stristr($msg, "save") != false || stristr($msg, "create") != false) {
+ $savebutton = "<td class=\"infoboxsave nowrap\">";
+ $savebutton .= "<input type=\"button\" value=\"". gettext("Undo") . "\" onclick=\"document.location='{$undo}'\" />";
+ $savebutton .= "<input name=\"{$name}\" type=\"submit\" class=\"formbtn\" id=\"${name}\" value=\"{$value}\" />";
+ $savebutton .= "</td>";
+ if ($_POST['if']) {
+ $savebutton .= "<input type=\"hidden\" name=\"if\" value=\"" . htmlspecialchars($_POST['if']) . "\" />";
+ }
+ }
+ $nifty_redbox = "#990000";
+ $nifty_blackbox = "#000000";
+
+ $themename = $g['theme'];
+
+ if (file_exists("/usr/local/www/themes/{$themename}/tabcontrols.php")) {
+ $toeval = file_get_contents("/usr/local/www/themes/{$themename}/tabcontrols.php");
+ eval($toeval);
+ }
+
+ if (file_exists("/usr/local/www/themes/{$themename}/infobox.php")) {
+ $toeval = file_get_contents("/usr/local/www/themes/{$themename}/infobox.php");
+ eval($toeval);
+ }
+
+
+ if (!$savebutton) {
+ $savebutton = "<td class=\"infoboxsave\"><input value=\"" . gettext("Close") . "\" type=\"button\" onclick=\"jQuery(this).parents('table[id=redboxtable]').hide();\" /></td>";
+ }
+
+ echo <<<EOFnp
+ <table class="infobox" id="redboxtable" summary="red box table">
+ <tr>
+ <td>
+ <div class="infoboxnp" id="redbox">
+ <table class="infoboxnptable2" summary="message">
+ <tr>
+ <td class="infoboxnptd">
+ &nbsp;&nbsp;&nbsp;<img class="infoboxnpimg" src="/themes/{$g['theme']}/images/icons/icon_exclam.gif" alt="exclamation" />
+ </td>
+ <td class="infoboxnptd2">
+ <b>{$msg}</b>
+ </td>
+ {$savebutton}
+ {$undobutton}
+ </tr>
+ </table>
+ </div>
+ <div>
+ <p>&nbsp;</p>
+ </div>
+ </td>
+ </tr>
+ </table>
+ <script type="text/javascript">
+ //<![CDATA[
+ NiftyCheck();
+ Rounded("div#redbox","all","#FFF","{$nifty_redbox}","smooth");
+ Rounded("td#blackbox","all","#FFF","{$nifty_blackbox}","smooth");
+ //]]>
+ </script>
+EOFnp;
+
+}
+
+function print_info_box($msg) {
+ print_info_box_np($msg);
+}
+
+function get_std_save_message($ok) {
+ global $d_sysrebootreqd_path;
+ $filter_related = false;
+ $filter_pages = array("nat", "filter");
+ $to_return = gettext("The changes have been applied successfully.");
+ foreach ($filter_pages as $fp) {
+ if (stristr($_SERVER['SCRIPT_FILENAME'], $fp)) {
+ $filter_related = true;
+ }
+ }
+ if ($filter_related) {
+ $to_return .= "<br />" . gettext("You can also <a href=\"status_filter_reload.php\">monitor</a> the filter reload progress.");
+ }
+ return $to_return;
+}
+
+function pprint_address($adr) {
+ global $specialnets;
+
+ if (isset($adr['any'])) {
+ $padr = "*";
+ } else if ($adr['network']) {
+ $padr = $specialnets[$adr['network']];
+ } else {
+ $padr = $adr['address'];
+ }
+
+ if (isset($adr['not'])) {
+ $padr = "! " . $padr;
+ }
+
+ return $padr;
+}
+
+function pprint_port($port) {
+ global $wkports;
+
+ $pport = "";
+
+ if (!$port) {
+ return "*";
+ } else {
+ $srcport = explode("-", $port);
+ if ((!$srcport[1]) || ($srcport[0] == $srcport[1])) {
+ $pport = $srcport[0];
+ if ($wkports[$srcport[0]]) {
+ $pport .= " (" . $wkports[$srcport[0]] . ")";
+ }
+ } else {
+ $pport .= $srcport[0] . " - " . $srcport[1];
+ }
+ }
+
+ return $pport;
+}
+
+function firewall_check_for_advanced_options(&$item) {
+ $item_set = "";
+ if ($item['os']) {
+ $item_set .= "os {$item['os']} ";
+ }
+ if ($item['dscp']) {
+ $item_set .= "dscp {$item['dscp']} ";
+ }
+ if ($item['max']) {
+ $item_set .= "max {$item['max']} ";
+ }
+ if ($item['max-src-nodes']) {
+ $item_set .= "max-src-nodes {$item['max-src-nodes']} ";
+ }
+ if ($item['max-src-conn']) {
+ $item_set .= "max-src-conn {$item['max-src-conn']} ";
+ }
+ if ($item['max-src-states']) {
+ $item_set .= "max-src-states {$item['max-src-states']} ";
+ }
+ if (isset($item['nopfsync'])) {
+ $item_set .= "nopfsync ";
+ }
+ if ($item['statetype'] != "keep state" && $item['statetype'] != "") {
+ $item_set .= "statetype {$item['statetype']} ";
+ }
+ if ($item['statetimeout']) {
+ $item_set .= "statetimeout {$item['statetimeout']} ";
+ }
+ if (isset($item['nosync'])) {
+ $item_set .= "no XMLRPC Sync ";
+ }
+ if ($item['max-src-conn-rate']) {
+ $item_set .= "max-src-conn-rate {$item['max-src-conn-rate']} ";
+ }
+ if ($item['max-src-conn-rates']) {
+ $item_set .= "max-src-conn-rates {$item['max-src-conn-rates']} ";
+ }
+ if ($item['vlanprio']) {
+ $item_set .= "vlanprio {$item['vlanprio']} ";
+ }
+ if ($item['vlanprioset']) {
+ $item_set .= "vlanprioset {$item['vlanprioset']} ";
+ }
+ if ($item['gateway']) {
+ $item_set .= "gateway {$item['gateway']} ";
+ }
+ if ($item['dnpipe']) {
+ $item_set .= "limiter {$item['dnpipe']} ";
+ }
+ if ($item['pdnpipe']) {
+ $item_set .= "limiter {$item['pdnpipe']} ";
+ }
+ if ($item['ackqueue']) {
+ $item_set .= "ackqueue {$item['ackqueue']} ";
+ }
+ if ($item['defaultqueue']) {
+ $item_set .= "defaultqueue {$item['defaultqueue']} ";
+ }
+ if ($item['l7container']) {
+ $item_set .= "layer7 {$item['l7container']} ";
+ }
+ if ($item['tag']) {
+ $item_set .= "tag {$item['tag']} ";
+ }
+ if ($item['tagged']) {
+ $item_set .= "tagged {$item['tagged']} ";
+ }
+ if (isset($item['allowopts'])) {
+ $item_set .= "allowopts ";
+ }
+ if (isset($item['disablereplyto'])) {
+ $item_set .= "disable reply-to ";
+ }
+ if ($item['tcpflags_any'] || $item['tcpflags1'] || $item['tcpflags2']) {
+ $item_set .= "tcpflags set";
+ }
+
+ return $item_set;
+}
+
+function gentitle($title) {
+ global $navlevelsep;
+ if (!is_array($title)) {
+ return $title;
+ } else {
+ return join($navlevelsep, $title);
+ }
+}
+
+function genhtmltitle($title) {
+ global $config;
+ return gentitle($title);
+}
+
+/* update the changedesc and changecount(er) variables */
+function update_changedesc($update) {
+ global $changedesc;
+ global $changecount;
+
+ $changedesc .= " {$update}";
+ $changecount++;
+}
+
+function clear_log_file($logfile = "/var/log/system.log", $restart_syslogd = true) {
+ global $config, $g;
+ if ($restart_syslogd) {
+ exec("/usr/bin/killall syslogd");
+ }
+ if (isset($config['system']['disablesyslogclog'])) {
+ unlink($logfile);
+ touch($logfile);
+ } else {
+ $log_size = isset($config['syslog']['logfilesize']) ? $config['syslog']['logfilesize'] : "511488";
+ if (isset($config['system']['usefifolog'])) {
+ exec("/usr/sbin/fifolog_create -s {$log_size} " . escapeshellarg($logfile));
+ } else {
+ exec("/usr/local/sbin/clog -i -s {$log_size} " . escapeshellarg($logfile));
+ }
+ }
+ if ($restart_syslogd) {
+ system_syslogd_start();
+ }
+}
+
+function clear_all_log_files() {
+ global $g;
+ exec("/usr/bin/killall syslogd");
+
+ $log_files = array("system", "filter", "dhcpd", "vpn", "pptps", "poes", "l2tps", "openvpn", "portalauth", "ipsec", "ppp", "relayd", "wireless", "lighttpd", "ntpd", "gateways", "resolver", "routing");
+ foreach ($log_files as $lfile) {
+ clear_log_file("{$g['varlog_path']}/{$lfile}.log", false);
+ }
+
+ system_syslogd_start();
+ killbyname("dhcpd");
+ services_dhcpd_configure();
+ return;
+}
+
+function dump_clog($logfile, $tail, $withorig = true, $grepfor = "", $grepinvert = "") {
+ global $g, $config;
+ $sor = isset($config['syslog']['reverse']) ? "-r" : "";
+ $logarr = "";
+ $grepline = " ";
+ if (is_array($grepfor)) {
+ $grepline .= " | /usr/bin/egrep " . escapeshellarg(implode("|", $grepfor));
+ }
+ if (is_array($grepinvert)) {
+ $grepline .= " | /usr/bin/egrep -v " . escapeshellarg(implode("|", $grepinvert));
+ }
+ if (is_dir($logfile)) {
+ $logarr = array("File $logfile is a directory.");
+ } elseif (file_exists($logfile) && filesize($logfile) == 0) {
+ $logarr = array("Log file started.");
+ } else {
+ if ($config['system']['disablesyslogclog']) {
+ exec("cat " . escapeshellarg($logfile) . "{$grepline} | /usr/bin/tail {$sor} -n " . escapeshellarg($tail), $logarr);
+ } else {
+ if (isset($config['system']['usefifolog'])) {
+ exec("/usr/sbin/fifolog_reader " . escapeshellarg($logfile) . "{$grepline} | /usr/bin/tail {$sor} -n " . escapeshellarg($tail), $logarr);
+ } else {
+ exec("/usr/local/sbin/clog " . escapeshellarg($logfile) . "{$grepline}| grep -v \"CLOG\" | grep -v \"\033\" | /usr/bin/tail {$sor} -n " . escapeshellarg($tail), $logarr);
+ }
+ }
+ }
+ foreach ($logarr as $logent) {
+ $logent = preg_split("/\s+/", $logent, 6);
+ echo "<tr valign=\"top\">\n";
+ if ($withorig) {
+ if (isset($config['system']['usefifolog'])) {
+ $entry_date_time = htmlspecialchars(date("F j, Y, g:i a", "" . $logent[1] . ""));
+ $entry_text = htmlspecialchars($logent[5]);
+ } else {
+ $entry_date_time = htmlspecialchars(join(" ", array_slice($logent, 0, 3)));
+ $entry_text = ($logent[3] == $config['system']['hostname']) ? "" : $logent[3] . " ";
+ $entry_text .= htmlspecialchars($logent[4] . " " . $logent[5]);
+ }
+ echo "<td class=\"listlr nowrap\">{$entry_date_time}</td>\n";
+ echo "<td class=\"listr\">{$entry_text}</td>\n";
+ } else {
+ echo "<td class=\"listlr\" colspan=\"2\">" . htmlspecialchars($logent[5]) . "</td>\n";
+ }
+ echo "</tr>\n";
+ }
+}
+
+function return_clog($logfile, $tail, $withorig = true, $grepfor = "", $grepinvert = "", $grepreverse = false) {
+ global $g, $config;
+ $sor = (isset($config['syslog']['reverse']) || $grepreverse) ? "-r" : "";
+ $logarr = "";
+ $grepline = " ";
+ if (is_array($grepfor)) {
+ $grepline .= " | /usr/bin/egrep " . escapeshellarg(implode("|", $grepfor));
+ }
+ if (is_array($grepinvert)) {
+ $grepline .= " | /usr/bin/egrep -v " . escapeshellarg(implode("|", $grepinvert));
+ }
+ if ($config['system']['disablesyslogclog']) {
+ exec("cat " . escapeshellarg($logfile) . "{$grepline} | /usr/bin/tail {$sor} -n " . escapeshellarg($tail), $logarr);
+ } else {
+ if (isset($config['system']['usefifolog'])) {
+ exec("/usr/sbin/fifolog_reader " . escapeshellarg($logfile) . "{$grepline} | /usr/bin/tail {$sor} -n " . escapeshellarg($tail), $logarr);
+ } else {
+ exec("/usr/local/sbin/clog " . escapeshellarg($logfile) . "{$grepline}| grep -v \"CLOG\" | grep -v \"\033\" | /usr/bin/tail {$sor} -n " . escapeshellarg($tail), $logarr);
+ }
+ }
+ return($logarr);
+}
+
+/* Check if variable has changed, update and log if it has
+ * returns true if var changed
+ * varname = variable name in plain text
+ * orig = original value
+ * new = new value
+ */
+function update_if_changed($varname, & $orig, $new) {
+ if (is_array($orig) && is_array($new)) {
+ $a_diff = array_diff($orig, $new);
+ foreach ($a_diff as $diff) {
+ update_changedesc("removed {$varname}: \"{$diff}\"");
+ }
+ $a_diff = array_diff($new, $orig);
+ foreach ($a_diff as $diff) {
+ update_changedesc("added {$varname}: \"{$diff}\"");
+ }
+ $orig = $new;
+ return true;
+
+ } else {
+ if ($orig != $new) {
+ update_changedesc("{$varname}: \"{$orig}\" -> \"{$new}\"");
+ $orig = $new;
+ return true;
+ }
+ }
+ return false;
+}
+
+function address_to_pconfig($adr, &$padr, &$pmask, &$pnot, &$pbeginport, &$pendport) {
+ if (isset($adr['any'])) {
+ $padr = "any";
+ } else if ($adr['network']) {
+ $padr = $adr['network'];
+ } else if ($adr['address']) {
+ list($padr, $pmask) = explode("/", $adr['address']);
+ if (!$pmask) {
+ if (is_ipaddrv6($padr)) {
+ $pmask = 128;
+ } else {
+ $pmask = 32;
+ }
+ }
+ }
+
+ if (isset($adr['not'])) {
+ $pnot = 1;
+ } else {
+ $pnot = 0;
+ }
+
+ if ($adr['port']) {
+ list($pbeginport, $pendport) = explode("-", $adr['port']);
+ if (!$pendport) {
+ $pendport = $pbeginport;
+ }
+ } else if (!is_alias($pbeginport) && !is_alias($pendport)) {
+ $pbeginport = "any";
+ $pendport = "any";
+ }
+}
+
+function pconfig_to_address(&$adr, $padr, $pmask, $pnot = false, $pbeginport = 0, $pendport = 0) {
+ $adr = array();
+
+ if ($padr == "any") {
+ $adr['any'] = true;
+ } else if (is_specialnet($padr)) {
+ $adr['network'] = $padr;
+ } else {
+ $adr['address'] = $padr;
+ if (is_ipaddrv6($padr)) {
+ if ($pmask != 128) {
+ $adr['address'] .= "/" . $pmask;
+ }
+ } else {
+ if ($pmask != 32) {
+ $adr['address'] .= "/" . $pmask;
+ }
+ }
+ }
+
+ if ($pnot) {
+ $adr['not'] = true;
+ } else {
+ unset($adr['not']);
+ }
+
+ if (($pbeginport != 0) && ($pbeginport != "any")) {
+ if ($pbeginport != $pendport) {
+ $adr['port'] = $pbeginport . "-" . $pendport;
+ } else {
+ $adr['port'] = $pbeginport;
+ }
+ }
+
+ if (is_alias($pbeginport)) {
+ $adr['port'] = $pbeginport;
+ }
+}
+
+function is_specialnet($net) {
+ global $specialsrcdst;
+
+ if (!$net) {
+ return false;
+ }
+ if (in_array($net, $specialsrcdst)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+//function to create widget tabs when called
+function display_widget_tabs(& $tab_array) {
+ echo "<div id=\"tabs\">";
+ $tabscounter = 0;
+ foreach ($tab_array as $ta) {
+ $dashpos = strpos($ta[2], '-');
+ $tabname = $ta[2] . "-tab";
+ $tabclass = substr($ta[2], 0, $dashpos);
+ $tabclass = $tabclass . "-class";
+ if ($ta[1] == true) {
+ $tabActive = "table-cell";
+ $tabNonActive = "none";
+ } else {
+ $tabActive = "none";
+ $tabNonActive = "table-cell";
+ }
+ echo "<div id=\"{$ta[2]}-active\" class=\"{$tabclass}-tabactive\" style=\"display:{$tabActive}; background-color:#EEEEEE; color:black;\">";
+ echo "<b>&nbsp;&nbsp;&nbsp;{$ta[0]}";
+ echo "&nbsp;&nbsp;&nbsp;</b>";
+ echo "</div>";
+
+ echo "<div id=\"{$ta[2]}-deactive\" class=\"{$tabclass}-tabdeactive\" style=\"display:{$tabNonActive}; background-color:#777777; color:white; cursor: pointer;\" onclick=\"return changeTabDIV('{$ta[2]}')\">";
+ echo "<b>&nbsp;&nbsp;&nbsp;{$ta[0]}";
+ echo "&nbsp;&nbsp;&nbsp;</b>";
+ echo "</div>";
+ }
+
+ echo "<script type=\"text/javascript\">";
+ echo "\n//<![CDATA[\n";
+ echo "NiftyCheck();\n";
+ echo "Rounded(\"div.{$tabclass}-tabactive\",\"top\",\"#CCCCCC\",\"#EEEEEE\",\"smooth\");\n";
+ echo "Rounded(\"div.{$tabclass}-tabdeactive\",\"top\",\"#CCCCCC\",\"#777777\",\"smooth\");\n";
+ echo "//]]>\n";
+ echo "</script>";
+ echo "</div>";
+}
+
+
+// Return inline javascript file or CSS to minimize
+// request count going back to server.
+function outputJavaScriptFileInline($javascript) {
+ if (file_exists($javascript)) {
+ echo "\n<script type=\"text/javascript\">\n";
+ include($javascript);
+ echo "\n</script>\n";
+ } else {
+ echo "\n\n<!-- Could not locate file: {$javascript} -->\n\n";
+ }
+}
+
+
+
+function outputCSSPrintFileInline($css) {
+ if (file_exists($css)) {
+ echo "\n<style media=\"print\" type=\"text/css\">\n";
+ include($css);
+ echo "\n</style>\n";
+ } else {
+ echo "\n\n<!-- Could not locate file: {$css} -->\n\n";
+ }
+}
+
+
+function outputCSSFileInline($css) {
+ if (file_exists($css)) {
+ echo "\n<style type=\"text/css\">\n";
+ include($css);
+ echo "\n</style>\n";
+ } else {
+ echo "\n\n<!-- Could not locate file: {$css} -->\n\n";
+ }
+}
+
+$rfc2616 = array(
+ 100 => "100 Continue",
+ 101 => "101 Switching Protocols",
+ 200 => "200 OK",
+ 201 => "201 Created",
+ 202 => "202 Accepted",
+ 203 => "203 Non-Authoritative Information",
+ 204 => "204 No Content",
+ 205 => "205 Reset Content",
+ 206 => "206 Partial Content",
+ 300 => "300 Multiple Choices",
+ 301 => "301 Moved Permanently",
+ 302 => "302 Found",
+ 303 => "303 See Other",
+ 304 => "304 Not Modified",
+ 305 => "305 Use Proxy",
+ 306 => "306 (Unused)",
+ 307 => "307 Temporary Redirect",
+ 400 => "400 Bad Request",
+ 401 => "401 Unauthorized",
+ 402 => "402 Payment Required",
+ 403 => "403 Forbidden",
+ 404 => "404 Not Found",
+ 405 => "405 Method Not Allowed",
+ 406 => "406 Not Acceptable",
+ 407 => "407 Proxy Authentication Required",
+ 408 => "408 Request Timeout",
+ 409 => "409 Conflict",
+ 410 => "410 Gone",
+ 411 => "411 Length Required",
+ 412 => "412 Precondition Failed",
+ 413 => "413 Request Entity Too Large",
+ 414 => "414 Request-URI Too Long",
+ 415 => "415 Unsupported Media Type",
+ 416 => "416 Requested Range Not Satisfiable",
+ 417 => "417 Expectation Failed",
+ 500 => "500 Internal Server Error",
+ 501 => "501 Not Implemented",
+ 502 => "502 Bad Gateway",
+ 503 => "503 Service Unavailable",
+ 504 => "504 Gateway Timeout",
+ 505 => "505 HTTP Version Not Supported"
+);
+
+function is_rfc2616_code($code) {
+ global $rfc2616;
+ if (isset($rfc2616[$code])) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+function print_rfc2616_select($tag, $current) {
+ global $rfc2616;
+
+ /* Default to 200 OK if not set */
+ if ($current == "") {
+ $current = 200;
+ }
+
+ echo "<select id=\"{$tag}\" name=\"{$tag}\">\n";
+ foreach ($rfc2616 as $code => $message) {
+ if ($code == $current) {
+ $sel = " selected=\"selected\"";
+ } else {
+ $sel = "";
+ }
+ echo "<option value=\"{$code}\"{$sel}>{$message}</option>\n";
+ }
+ echo "</select>\n";
+}
+
+// Useful debugging function, much cleaner than print_r
+function echo_array($array, $return_me = false) {
+ if (is_array($array) == false) {
+ $return = "The provided variable is not an array.";
+ } else {
+ foreach ($array as $name=>$value) {
+ if (is_array($value)) {
+ $return .= "";
+ $return .= "['<b>$name</b>'] {<div style=\"margin-left:10px;\">\n";
+ $return .= echo_array($value, true);
+ $return .= "</div>}";
+ $return .= "\n\n";
+ } else {
+ if (is_string($value)) {
+ $value = "\"$value\"";
+ }
+ $return .= "['<b>$name</b>'] = $value\n\n";
+ }
+ }
+ }
+ if ($return_me == true) {
+ return $return;
+ } else {
+ echo "<pre>".$return."</pre>";
+ }
+}
+
+/****f* pfsense-utils/display_top_tabs
+ * NAME
+ * display_top_tabs - display tabs with rounded edges
+ * INPUTS
+ * $text - array of tabs
+ * RESULT
+ * null
+ ******/
+function display_top_tabs(& $tab_array, $no_drop_down = false) {
+ global $config;
+ global $g;
+ global $tab_array_indent;
+ global $tab_array_space;
+ global $tab_array_char_limit;
+
+ /* does the user have access to this tab?
+ * master user has access to everything.
+ * if the user does not have access, simply
+ * unset the tab item.
+ */
+
+ /* empty string code */
+ if ($tab_array_indent == '') {
+ $tab_array_indent = 0;
+ }
+
+ if ($tab_array_space == '') {
+ $tab_array_space = 1;
+ }
+
+ if ($tab_array_char_limit == '') {
+ $tab_array_char_limit = 92;
+ }
+
+ foreach ($tab_array as $tab_id => $ta) {
+ if (!isAllowedPage($ta[2])) {
+ unset ($tab_array[$tab_id]);
+ }
+ }
+
+ $tab_active_bg = "#EEEEEE";
+ $tab_inactive_bg = "#777777";
+ $nifty_tabs_corners = "#FFF";
+ $font_color = "white";
+
+ /* if tabcontrols.php exist for a theme, allow it to be overridden */
+ $themename = $config['theme'];
+ $filename = "/usr/local/www/themes/{$themename}/tabcontrols.php";
+ if (file_exists($filename)) {
+ $eval_code = file_get_contents($filename);
+ eval($eval_code);
+ }
+
+ $tabcharcount = 0;
+ foreach ($tab_array as $ta) {
+ $tabcharcount = $tabcharcount + strlen($ta[0]);
+ }
+
+ if ($no_drop_down == true) {
+ $tabcharcount = 0;
+ unset($tab_array_char_limit);
+ }
+
+ // If the character count of the tab names is > 670
+ // then show a select item dropdown menubox.
+ if ($tabcharcount > $tab_array_char_limit) {
+ echo gettext("Currently viewing: ");
+ echo "<select name=\"TabSelect\" onchange=\"tabs_will_go(this)\">\n";
+ foreach ($tab_array as $ta) {
+ if ($ta[1] == "true") {
+ $selected = " selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ // Onclick in option will not work in some browser
+ // echo "<option onclick=\"document.location='{$ta[2]}';\"{$selected}>{$ta['0']}</option>\n";
+ echo "<option value=\"{$ta[2]}\"{$selected}>{$ta['0']}</option>\n";
+ }
+ echo "</select>\n<p>&nbsp;</p>";
+ echo "<script type=\"text/javascript\">";
+ echo "\n//<![CDATA[\n";
+ echo " function tabs_will_go(obj) { document.location = obj.value; }\n";
+ echo "//]]>\n";
+ echo "</script>";
+ } else {
+ echo "<div class=\"newtabmenu\" style=\"margin:{$tab_array_space}px {$tab_array_indent}px; width:775px;\">\n";
+ echo "<!-- Tabbed bar code-->\n";
+ echo "<ul class=\"newtabmenu\">\n";
+ $tabscounter = 0;
+ foreach ($tab_array as $ta) {
+ if ($ta[1] == true) {
+ echo " <li class=\"newtabmenu_active\"><a href=\"{$ta[2]}\"><span>{$ta[0]}</span></a></li>\n";
+ } else {
+ echo " <li><a href=\"{$ta[2]}\"><span>{$ta[0]}</span></a></li>\n";
+ }
+ $tabscounter++;
+ }
+ echo "</ul>\n</div>\n";
+ }
+}
+
+function add_package_tabs($pkgname, &$tab_array) {
+ global $config, $g;
+
+ $pkg = get_pkg_data($pkgname);
+
+ if (!isset($pkg['configurationfile']) || !file_exists('/usr/local/pkg/' . $pkg['configurationfile'])) {
+ return;
+ }
+
+ $pkg_config = parse_xml_config_pkg('/usr/local/pkg/' . $pkg['configurationfile'], "packagegui");
+
+ if (!isset($pkg_config['tabs']['tab'])) {
+ return;
+ }
+
+ foreach ($pkg_config['tabs']['tab'] as $tab) {
+ $tab_entry = array();
+ if ($tab['name']) {
+ $tab_entry[] = $tab['name'];
+ $tab_entry[] = false;
+ $tab_entry[] = $tab['url'];
+ $tab_array[] = $tab_entry;
+ }
+ }
+}
+
+function alias_info_popup($alias_id) {
+ global $config;
+ $maxlength = 60;
+ $close_title="title='".gettext('move mouse out of this alias to hide')."'";
+ if (is_array($config['aliases']['alias'][$alias_id])) {
+ $alias_name = $config['aliases']['alias'][$alias_id];
+ $alias_objects_with_details = "<table width=\"100%\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\" summary=\"alias info popup\">";
+ if ($alias_name['url']) {
+ // TODO: Change it when pf supports tables with ports
+ if ($alias_name['type'] == "urltable") {
+ exec("/sbin/pfctl -t {$alias_name['name']} -T show | wc -l", $total_entries);
+ $counter = preg_replace("/\D/", "", $total_entries[0]);
+ exec("/sbin/pfctl -t {$alias_name['name']} -T show | head -10002", $alias_addresses);
+ } else {
+ $urlfn = alias_expand_urltable($alias_name['name']);
+ $alias_addresses = explode("\n", file_get_contents($urlfn));
+ $counter = count($alias_addresses);
+ }
+ $alias_objects_with_details .= "<tr><td colspan=\"3\" $close_title class=\"vncell\">{$alias_name['url']}</td></tr>";
+ $x = 0;
+ foreach ($alias_addresses as $alias_ports_address) {
+ switch ($x) {
+ case 0:
+ $x++;
+ $alias_objects_with_details .= "<tr><td $close_title class=\"vncell\" width=\"33%\" style=\"background: #FFFFFF;color: #000000;\">{$alias_ports_address}</td>";
+ break;
+ case 1:
+ $x++;
+ $alias_objects_with_details .= "<td $close_title class=\"vncell\" width=\"33%\" style=\"background: #FFFFFF;color: #000000;\">{$alias_ports_address}</td>";
+ break;
+ default:
+ $x = 0;
+ $alias_objects_with_details .= "<td $close_title class=\"vncell\" width=\"33%\" style=\"background: #FFFFFF;color: #000000;\">{$alias_ports_address}</td><tr>";
+ break;
+ }
+ }
+ for ($y = $x; $y <= $x; $y++) {
+ $alias_objects_with_details .= "<td $close_title class=\"vncell\" width=\"33%\">&nbsp;</td>";
+ }
+ if ($x > 0) {
+ $alias_objects_with_details .= "</tr>";
+ }
+ if ($counter > 10002) {
+ $alias_objects_with_details .= "<tr><td colspan=\"3\"> ". gettext("listing only first 10k items") . "</td><tr>";
+ }
+ } else {
+ $alias_addresses = explode (" ", $alias_name['address']);
+ $alias_details = explode ("||", $alias_name['detail']);
+ $counter = 0;
+ foreach ($alias_addresses as $alias_ports_address) {
+ $alias_objects_with_details .= "<tr><td $close_title width=\"5%\" class=\"vncell\" style=\"background: #FFFFFF;color: #000000;\">{$alias_addresses[$counter]}</td>";
+ $alias_detail_default = strpos ($alias_details[$counter], "Entry added");
+ if ($alias_details[$counter] != "" && $alias_detail_default === False) {
+ $alias_objects_with_details .="<td $close_title width=\"95%\" class=\"vncell\" style=\"background: #FFFFFF;color: #000000;\">{$alias_details[$counter]}</td>";
+ } else {
+ $alias_objects_with_details .="<td $close_title width=\"95%\" class=\"vncell\" style=\"background: #FFFFFF;color: #000000;\">&nbsp;</td>";
+ }
+ $alias_objects_with_details .= "</tr>";
+ $counter++;
+ }
+ }
+ $alias_objects_with_details .= "</table>";
+ }
+ $alias_descr_substr = $alias_name['descr'];
+ if ($strlength >= $maxlength) {
+ $alias_descr_substr = substr($alias_descr_substr, 0, $maxlength) . "...";
+ }
+ $item_text = ($counter > 1 ? "items" : "item");
+ $alias_caption = "{$alias_descr_substr} - {$counter} {$item_text}<a href=\"/firewall_aliases_edit.php?id={$alias_id}\" title=\"".gettext('edit this alias')."\">&nbsp;&nbsp;edit </a>";
+ $strlength = strlen ($alias_caption);
+ print "<h1>{$alias_caption}</h1>" . $alias_objects_with_details;
+}
+
+function rule_popup($src, $srcport, $dst, $dstport) {
+ global $config, $g;
+ $aliases_array = array();
+ if ($config['aliases']['alias'] <> "" and is_array($config['aliases']['alias'])) {
+ $descriptions = array ();
+ foreach ($config['aliases']['alias'] as $alias_id=>$alias_name) {
+ $loading_image="<a><img src=\'/themes/{$g['theme']}/images/misc/loader.gif\' alt=\'loader\' /> " .gettext("loading...")."</a>";
+ switch ($alias_name['type']) {
+ case "port":
+ $width="250";
+ break;
+ case "urltable":
+ $width="500";
+ break;
+ default:
+ $width="350";
+ break;
+ }
+ $span_begin = "<span style=\"cursor: help;\" onmouseover=\"var response_html=domTT_activate(this, event, 'id','ttalias_{$alias_id}','content','{$loading_image}', 'trail', true, 'delay', 300, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle','type','velcro','width',{$width});alias_popup('{$alias_id}','{$g['theme']}','".gettext('loading...')."');\" onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\"><u>";
+ $span_end = "</u></span>";
+ if ($alias_name['name'] == $src) {
+ $descriptions['src'] = $span_begin;
+ $descriptions['src_end'] = $span_end;
+ }
+ if ($alias_name['name'] == $srcport) {
+ $descriptions['srcport'] = $span_begin;
+ $descriptions['srcport_end'] = $span_end;
+ }
+ if ($alias_name['name'] == $dst) {
+ $descriptions['dst'] = $span_begin;
+ $descriptions['dst_end'] = $span_end;
+ }
+ if ($alias_name['name'] == $dstport) {
+ $descriptions['dstport'] = $span_begin;
+ $descriptions['dstport_end'] = $span_end;
+ }
+ }
+ return $descriptions;
+ }
+}
+
+$timezone = $config['system']['timezone'];
+if (!$timezone) {
+ $timezone = "Etc/UTC";
+}
+
+date_default_timezone_set($timezone);
+
+?>
diff --git a/src/usr/local/www/halt.php b/src/usr/local/www/halt.php
new file mode 100755
index 0000000..ab4fe99
--- /dev/null
+++ b/src/usr/local/www/halt.php
@@ -0,0 +1,77 @@
+<?php
+/* $Id$ */
+/*
+ halt.php
+ part of pfSense
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ part of m0n0wall as reboot.php (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: header
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-haltsystem
+##|*NAME=Diagnostics: Halt system page
+##|*DESCR=Allow access to the 'Diagnostics: Halt system' page.
+##|*MATCH=halt.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require("captiveportal.inc");
+
+if ($_POST['Submit'] == " " . gettext("No") . " ") {
+ header("Location: index.php");
+ exit;
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Halt system"));
+include('head.inc');
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($_POST['Submit'] == " " . gettext("Yes") . " "):
+ print_info_box(gettext("The system is halting now. This may take one minute.")); ?>
+<pre>
+<?php system_halt(); ?>
+</pre>
+<?php else: ?>
+<form action="halt.php" method="post">
+ <p><strong><?=gettext("Are you sure you want to halt the system?");?></strong></p>
+ <p>
+ <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("Yes"); ?> " />
+ <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("No"); ?> " />
+ </p>
+</form>
+<?php endif; ?>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/head.inc b/src/usr/local/www/head.inc
new file mode 100755
index 0000000..d8b8867
--- /dev/null
+++ b/src/usr/local/www/head.inc
@@ -0,0 +1,120 @@
+<?php
+/*
+ pfSense_MODULE: header
+*/
+
+$g['theme'] = get_current_theme();
+
+$pagetitle = gentitle($pgtitle);
+
+if (isset($config['system']['webgui']['pagenamefirst'])) {
+ $tabtitle = $pagetitle . " - " . $config['system']['hostname'] . "." . $config['system']['domain'];
+} else {
+ $tabtitle = $config['system']['hostname'] . "." . $config['system']['domain'] . " - " . $pagetitle;
+}
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="<?=system_get_language_code();?>" xml:lang="<?=system_get_language_code();?>">
+<head>
+ <title><?php echo($tabtitle); ?></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=<?=system_get_language_codeset();?>" />
+ <link rel="apple-touch-icon" href="/themes/<?php echo $g['theme']; ?>/apple-touch-icon.png"/>
+ <link rel="shortcut icon" href="/themes/<?php echo $g['theme']; ?>/images/icons/favicon.ico"/>
+ <?php
+ if (file_exists("{$g['www_path']}/themes/{$g['theme']}/table.css")):
+ echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/table.css\" />";
+ else:
+ echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/css/table.css\" media=\"all\" />";
+ endif;
+ ?>
+
+ <?php if (strpos($_SERVER["SCRIPT_FILENAME"], "wizard.php") !== false &&
+ file_exists("{$g['www_path']}/themes/{$g['theme']}/wizard.css")): ?>
+ <?php echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/wizard.css\" />"; ?>
+ <?php else: ?>
+ <link type="text/css" rel="stylesheet" href="/themes/<?php echo $g['theme']; ?>/all.css" media="all" />
+ <?php endif; ?>
+ <link rel="stylesheet" type="text/css" href="/niftycssCode.css" />
+ <link rel="stylesheet" type="text/css" href="/niftycssprintCode.css" media="print" />
+ <link rel="stylesheet" type="text/css" href="/themes/<?=$g['theme']?>/new_tab_menu.css" media="all" />
+ <link rel="stylesheet" type="text/css" href="/themes/<?=$g['theme']?>/styles/jquery-ui-1.11.1.css" />
+ <script type="text/javascript" src="/javascript/niftyjsCode.js"></script>
+ <script type="text/javascript" src="/javascript/jquery-1.11.1.min.js"></script>
+ <script type="text/javascript" src="/javascript/jquery-migrate-1.2.1.min.js"></script>
+ <script type="text/javascript" src="/javascript/jquery/jquery-ui-1.11.1.min.js"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+ var theme = "<?php echo $g['theme']; ?>";
+
+ jQuery.noConflict();
+ //]]>
+ </script>
+
+ <script type="text/javascript" src="/javascript/sorttable.js"></script>
+ <script type="text/javascript" src="/javascript/ticker.js"></script>
+ <style type="text/css" id="antiClickjack">
+ /*<![CDATA[*/
+ body{display:none}
+ /*]]>*/
+ </style>
+ <script type="text/javascript">
+ //<![CDATA[
+ if (self === top) {
+ var antiClickjack = document.getElementById("antiClickjack"); antiClickjack.parentNode.removeChild(antiClickjack);
+ } else {
+ top.location = self.location;
+ }
+ //]]>
+ </script>
+
+<?php
+echo "\t<script type=\"text/javascript\" src=\"/themes/{$g['theme']}/loader.js\"></script>\n";
+if ($_GET['enablefirebuglite']) {
+ echo "\t<script type=\"text/javascript\" src=\"/javascript/pi.js\"></script>\n";
+ echo "\t<script type=\"text/javascript\" src=\"/javascript/firebug-lite.js\"></script>\n";
+}
+echo "\t<script type=\"text/javascript\" src=\"/javascript/scriptaculous/prototype.js\"></script>\n";
+echo "\t<script type=\"text/javascript\" src=\"/javascript/scriptaculous/scriptaculous.js\"></script>\n";
+echo "\t<script type=\"text/javascript\" src=\"/javascript/scriptaculous/effects.js\"></script>\n";
+echo "\t<script type=\"text/javascript\" src=\"/javascript/scriptaculous/dragdrop.js\"></script>\n";
+if (file_exists("{$g['www_path']}/javascript/global.js")) {
+ echo "\t<script type=\"text/javascript\" src=\"/javascript/global.js\"></script>\n";
+}
+/*
+ * Find all javascript files that need to be included
+ * for this page ... from the arrays ... :)
+ * Coded by: Erik Kristensen
+ */
+
+$dir = trim(basename($_SERVER["SCRIPT_FILENAME"], '.php'));
+$path = "{$g['www_path']}/javascript/" . $dir . "/";
+if (is_dir($path)) {
+ if ($dh = opendir($path)) {
+ while (($file = readdir($dh)) !== false) {
+ if (is_dir($file)) {
+ continue;
+ }
+ echo "\t<script type=\"text/javascript\" src=\"/javascript/{$dir}/{$file}?rev=1\"></script>\n";
+ }
+ closedir($dh);
+ }
+}
+
+if (!isset($closehead)) {
+ echo "</head>";
+}
+
+/* If this page is being remotely managed then do not allow the loading of the contents. */
+if ($config['remote_managed_pages']['item']) {
+ foreach ($config['remote_managed_pages']['item'] as $rmp) {
+ if ($rmp == $_SERVER['SCRIPT_NAME']) {
+ include("fbegin.inc");
+ print_info_box_np("This page is currently being managed by a remote machine.");
+ include("fend.inc");
+ exit;
+ }
+ }
+}
+
+?>
diff --git a/src/usr/local/www/headjs.php b/src/usr/local/www/headjs.php
new file mode 100644
index 0000000..5e4148f
--- /dev/null
+++ b/src/usr/local/www/headjs.php
@@ -0,0 +1,186 @@
+<?php
+/*
+ headjs.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: header
+*/
+
+##|+PRIV
+##|*IDENT=page-requiredforjavascript
+##|*NAME=Required for javascript page
+##|*DESCR=Allow access to the 'Required for javascript' page.
+##|*MATCH=headjs.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+
+function getHeadJS() {
+ global $g, $use_loader_tab_gif;
+
+ if (!$use_loader_tab_gif) {
+ $loader_gif = "/themes/{$g['theme']}/images/misc/loader.gif";
+ } else {
+ $loader_gif = "/themes/{$g['theme']}/images/misc/loader_tab.gif";
+ }
+
+ $headjs = "
+ var input_errors = '';
+ jQuery(document).ready(init);
+ ";
+ if (!session_id()) {
+ session_start();
+ }
+ $_SESSION['NO_AJAX'] == "True" ? $noajax = "var noAjaxOnSubmit = true;" : $noajax = "var noAjaxOnSubmit = false;";
+ session_commit();
+
+ $headjs .= "
+ {$noajax}
+
+ function init() {
+ if (jQuery('#submit') && ! noAjaxOnSubmit) {
+ // debugging helper
+ //alert('adding observe event for submit button');
+
+ jQuery(\"#submit\").click(submit_form);
+ jQuery('#submit').click(function() {return false;});
+ var to_insert = \"<div style='visibility:hidden' id='loading' name='loading'><img src='{$loader_gif}' alt='loader' \/><\/div>\";
+ jQuery('#submit').before(to_insert);
+ }
+ }
+
+ function submit_form(e) {
+ // debugging helper
+ //alert(Form.serialize($('iform')));
+
+ if (jQuery('#inputerrors')) {
+ jQuery('#inputerrors').html('<center><b><i>Loading...<\/i><\/b><\/center>');
+ }
+
+ /* dsh: Introduced because pkg_edit tries to set some hidden fields
+ * if executing submit's onclick event. The click gets deleted
+ * by Ajax. Hence using onkeydown instead.
+ */
+ if (jQuery('#submit').prop('keydown')) {
+ jQuery('#submit').keydown();
+ jQuery('#submit').css('visibility','hidden');
+ }
+ if (jQuery('#cancelbutton')) {
+ jQuery('#cancelbutton').css('visibility','hidden');
+ }
+ jQuery('#loading').css('visibility','visible');
+ // submit the form using Ajax
+ }
+
+ function formSubmitted(resp) {
+ var responseText = resp.responseText;
+
+ // debugging helper
+ // alert(responseText);
+
+ if (responseText.indexOf('html') > 0) {
+ /* somehow we have been fed an html page! */
+ //alert('Somehow we have been fed an html page! Forwarding to /.');
+ document.location.href = '/';
+ }
+
+ eval(responseText);
+ }
+
+ /* this function will be called if an HTTP error will be triggered */
+ function formFailure(resp) {
+ showajaxmessage(resp.responseText);
+ if (jQuery('#submit')) {
+ jQuery('#submit').css('visibility','visible');
+ }
+ if (jQuery('#cancelbutton')) {
+ jQuery('#cancelbutton').css('visibility','visible');
+ }
+ if (jQuery('#loading')) {
+ jQuery('#loading').css('visibility','hidden');
+ }
+ }
+
+ function showajaxmessage(message) {
+ var message_html;
+
+ if (message == '') {
+ NiftyCheck();
+ Rounded(\"div#redbox\",\"all\",\"#FFF\",\"#990000\",\"smooth\");
+ Rounded(\"td#blackbox\",\"all\",\"#FFF\",\"#000000\",\"smooth\");
+
+ if (jQuery('#submit')) {
+ jQuery('#submit').css('visibility','visible');
+ }
+ if (jQuery('#cancelbutton')) {
+ jQuery('#cancelbutton').css('visibility','visible');
+ }
+ if (jQuery('#loading')) {
+ jQuery('#loading').css('visibility','hidden');
+ }
+
+ return;
+ }
+
+ message_html = '<table height=\"32\" width=\"100%\" summary=\"redbox\"><tr><td>';
+ message_html += '<div style=\"background-color:#990000\" id=\"redbox\">';
+ message_html += '<table width=\"100%\" summary=\"message\"><tr><td width=\"8%\">';
+ message_html += '<img style=\"vertical-align:center\" src=\"/themes/{$g['theme']}/images/icons/icon_exclam.gif\" width=\"28\" height=\"32\" alt=\"exclamation\" \/>';
+ message_html += '<\/td><td width=\"70%\"><font color=\"white\">';
+ message_html += '<b>' + message + '<\/b><\/font><\/td>';
+
+ if (message.indexOf('apply') > 0) {
+ message_html += '<td>';
+ message_html += '<input name=\"apply\" type=\"submit\" class=\"formbtn\" id=\"apply\" value=\"" . gettext("Apply changes") . "\" \/>';
+ message_html += '<\/td>';
+ }
+
+ message_html += '<\/tr><\/table><\/div><\/td><\/table><br \/>';
+ jQuery('#inputerrors').html(message_html);
+
+ NiftyCheck();
+ Rounded(\"div#redbox\",\"all\",\"#FFF\",\"#990000\",\"smooth\");
+ Rounded(\"td#blackbox\",\"all\",\"#FFF\",\"#000000\",\"smooth\");
+
+ if (jQuery('#submit')) {
+ jQuery('#submit').css('visibility','visible');
+ }
+ if (jQuery('#cancelbutton')) {
+ jQuery('#cancelbutton').css('visibility','visible');
+ }
+ if (jQuery('#loading')) {
+ jQuery('#loading').css('visibility','hidden');
+ }
+ if (jQuery('#inputerrors')) {
+ window.scrollTo(0, 0);
+ }
+ }
+ ";
+
+ return $headjs;
+}
+
+?>
diff --git a/src/usr/local/www/help.php b/src/usr/local/www/help.php
new file mode 100644
index 0000000..8cee1ab
--- /dev/null
+++ b/src/usr/local/www/help.php
@@ -0,0 +1,377 @@
+<?php
+/* Redirector for Contextual Help System
+ * Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ * (c) 2009 Jim Pingle <jimp@pfsense.org>
+ *
+ */
+
+require_once("guiconfig.inc");
+
+/* Define hash of jumpto url maps */
+
+/* Links to categories could probably be more specific. */
+$helppages = array(
+ /* These pages are confirmed to work and have usable content */
+ 'index.php' => 'https://doc.pfsense.org/index.php/Dashboard',
+ 'license.php' => 'https://www.pfsense.org/about-pfsense/#legal',
+ 'miniupnpd.xml' => 'https://doc.pfsense.org/index.php/What_are_UPnP_and_NAT-PMP',
+ 'status_upnp.php' => 'https://doc.pfsense.org/index.php/What_are_UPnP_and_NAT-PMP',
+ 'firewall_virtual_ip.php' => 'https://doc.pfsense.org/index.php/What_are_Virtual_IP_Addresses',
+ 'firewall_virtual_ip_edit.php' => 'https://doc.pfsense.org/index.php/What_are_Virtual_IP_Addresses',
+ 'firewall_aliases.php' => 'https://doc.pfsense.org/index.php/Aliases',
+ 'firewall_aliases_edit.php' => 'https://doc.pfsense.org/index.php/Aliases',
+ 'firewall_aliases_import.php' => 'https://doc.pfsense.org/index.php/Aliases',
+ 'firewall_nat_out.php' => 'https://doc.pfsense.org/index.php/Outbound_NAT',
+ 'firewall_nat_out_edit.php' => 'https://doc.pfsense.org/index.php/Outbound_NAT',
+ 'firewall_rules.php' => 'https://doc.pfsense.org/index.php/Firewall_Rule_Basics',
+ 'firewall_rules_edit.php' => 'https://doc.pfsense.org/index.php/Firewall_Rule_Basics',
+ 'firewall_schedule.php' => 'https://doc.pfsense.org/index.php/Firewall_Rule_Schedules',
+ 'firewall_schedule_edit.php' => 'https://doc.pfsense.org/index.php/Firewall_Rule_Schedules',
+ 'interfaces_vlan.php' => 'https://doc.pfsense.org/index.php/VLAN_Trunking',
+ 'interfaces_vlan_edit.php' => 'https://doc.pfsense.org/index.php/VLAN_Trunking',
+ 'diag_routes.php' => 'https://doc.pfsense.org/index.php/Viewing_Routes',
+ 'diag_packet_capture.php' => 'https://doc.pfsense.org/index.php/Sniffers,_Packet_Capture',
+ 'diag_system_pftop.php' => 'https://doc.pfsense.org/index.php/How_can_I_monitor_bandwidth_usage#pftop',
+ 'status_rrd_graph.php' => 'https://doc.pfsense.org/index.php/RRD_Graphs',
+ 'status_rrd_graph_img.php' => 'https://doc.pfsense.org/index.php/RRD_Graphs',
+ 'status_rrd_graph_settings.php' => 'https://doc.pfsense.org/index.php/RRD_Graphs',
+ 'firewall_nat.php' => 'https://doc.pfsense.org/index.php/How_can_I_forward_ports_with_pfSense',
+ 'firewall_nat_edit.php' => 'https://doc.pfsense.org/index.php/How_can_I_forward_ports_with_pfSense',
+ 'diag_arp.php' => 'https://doc.pfsense.org/index.php/ARP_Table',
+ 'diag_backup.php' => 'https://doc.pfsense.org/index.php/Configuration_Backup_and_Restore',
+ 'diag_confbak.php' => 'https://doc.pfsense.org/index.php/Configuration_History',
+ 'diag_defaults.php' => 'https://doc.pfsense.org/index.php/Factory_Defaults',
+ 'firewall_shaper.php' => 'https://doc.pfsense.org/index.php/Traffic_Shaping_Guide',
+ 'firewall_shaper_layer7.php' => 'https://doc.pfsense.org/index.php/Layer_7',
+ 'firewall_shaper_queues.php' => 'https://doc.pfsense.org/index.php/Traffic_Shaping_Guide',
+ 'firewall_shaper_vinterface.php' => 'https://doc.pfsense.org/index.php/Limiters',
+ 'firewall_shaper_wizards.php' => 'https://doc.pfsense.org/index.php/Traffic_Shaping_Guide',
+ 'status_queues.php' => 'https://doc.pfsense.org/index.php/Traffic_Shaping_Guide',
+ 'status_dhcp_leases.php' => 'https://doc.pfsense.org/index.php/DHCP_Leases',
+ 'diag_dns.php' => 'https://doc.pfsense.org/index.php/DNS_Lookup',
+ 'diag_dump_states.php' => 'https://doc.pfsense.org/index.php/Show_States',
+ 'diag_resetstate.php' => 'https://doc.pfsense.org/index.php/Reset_States',
+ 'diag_logs.php' => 'https://doc.pfsense.org/index.php/System_Logs',
+ 'diag_logs_auth.php' => 'https://doc.pfsense.org/index.php/Captive_Portal_Authentication_Logs',
+ 'diag_logs_dhcp.php' => 'https://doc.pfsense.org/index.php/DHCP_Logs',
+ 'diag_logs_filter.php' => 'https://doc.pfsense.org/index.php/Firewall_Logs',
+ 'diag_logs_filter_dynamic.php' => 'https://doc.pfsense.org/index.php/Firewall_Logs',
+ 'diag_logs_filter_summary.php' => 'https://doc.pfsense.org/index.php/Firewall_Logs',
+ 'diag_logs_ntpd.php' => 'https://doc.pfsense.org/index.php/NTP_Logs',
+ 'diag_logs_ppp.php' => 'https://doc.pfsense.org/index.php/PPP_Logs',
+ 'diag_logs_relayd.php' => 'https://doc.pfsense.org/index.php/Load_Balancer_Logs',
+ 'diag_logs_settings.php' => 'https://doc.pfsense.org/index.php/Log_Settings',
+ 'diag_logs_vpn.php' => 'https://doc.pfsense.org/index.php/PPTP_VPN_Logs',
+ 'diag_logs_ipsec.php' => 'https://doc.pfsense.org/index.php/IPsec_Logs',
+ 'diag_logs_openvpn.php' => 'https://doc.pfsense.org/index.php/OpenVPN_Logs',
+ 'diag_nanobsd.php' => 'https://doc.pfsense.org/index.php/NanoBSD_Diagnostics',
+ 'diag_patterns.php' => 'https://doc.pfsense.org/index.php/Layer7_Pattern_Diagnostics',
+ 'diag_ping.php' => 'https://doc.pfsense.org/index.php/Ping_Host',
+ 'diag_pkglogs.php' => 'https://doc.pfsense.org/index.php/Package_Logs',
+ 'diag_tables.php' => 'https://doc.pfsense.org/index.php/Tables',
+ 'diag_system_activity.php' => 'https://doc.pfsense.org/index.php/System_Activity',
+ 'diag_traceroute.php' => 'https://doc.pfsense.org/index.php/Traceroute',
+ 'easyrule.php' => 'https://doc.pfsense.org/index.php/Easy_Rule',
+ 'edit.php' => 'https://doc.pfsense.org/index.php/Edit_File',
+ 'exec.php' => 'https://doc.pfsense.org/index.php/Execute_Command',
+ 'firewall_nat_1to1.php' => 'https://doc.pfsense.org/index.php/1:1_NAT',
+ 'firewall_nat_1to1_edit.php' => 'https://doc.pfsense.org/index.php/1:1_NAT',
+ 'halt.php' => 'https://doc.pfsense.org/index.php/Halt_System',
+ 'reboot.php' => 'https://doc.pfsense.org/index.php/Reboot_System',
+ 'status_filter_reload.php' => 'https://doc.pfsense.org/index.php/Filter_Reload_Status',
+ 'status_gateway_groups.php' => 'https://doc.pfsense.org/index.php/Gateway_Status',
+ 'status_gateways.php' => 'https://doc.pfsense.org/index.php/Gateway_Status',
+ 'status_graph.php' => 'https://doc.pfsense.org/index.php/Traffic_Graph',
+ 'status_graph_cpu.php' => 'https://doc.pfsense.org/index.php/CPU_Load',
+ 'status_interfaces.php' => 'https://doc.pfsense.org/index.php/Interface_Status',
+ 'status_services.php' => 'https://doc.pfsense.org/index.php/Services_Status',
+ 'status_wireless.php' => 'https://doc.pfsense.org/index.php/Wireless_Status',
+ 'pkg_mgr.php' => 'https://doc.pfsense.org/index.php/Package_Manager',
+ 'pkg_mgr_install.php' => 'https://doc.pfsense.org/index.php/Package_Manager',
+ 'pkg_mgr_installed.php' => 'https://doc.pfsense.org/index.php/Package_Manager',
+ 'pkg_mgr_settings.php' => 'https://doc.pfsense.org/index.php/Package_Manager_Settings',
+ 'interfaces.php' => 'https://doc.pfsense.org/index.php/Interface_Settings',
+ 'interfaces_assign.php' => 'https://doc.pfsense.org/index.php/Assign_Interfaces',
+ 'interfaces_bridge.php' => 'https://doc.pfsense.org/index.php/Interface_Bridges',
+ 'interfaces_bridge_edit.php' => 'https://doc.pfsense.org/index.php/Interface_Bridges',
+ 'interfaces_gif.php' => 'https://doc.pfsense.org/index.php/GIF_Interfaces',
+ 'interfaces_gif_edit.php' => 'https://doc.pfsense.org/index.php/GIF_Interfaces',
+ 'interfaces_gre.php' => 'https://doc.pfsense.org/index.php/GRE_Interfaces',
+ 'interfaces_gre_edit.php' => 'https://doc.pfsense.org/index.php/GRE_Interfaces',
+ 'interfaces_groups.php' => 'https://doc.pfsense.org/index.php/Interface_Groups',
+ 'interfaces_groups_edit.php' => 'https://doc.pfsense.org/index.php/Interface_Groups',
+ 'interfaces_lagg.php' => 'https://doc.pfsense.org/index.php/LAGG_Interfaces',
+ 'interfaces_lagg_edit.php' => 'https://doc.pfsense.org/index.php/LAGG_Interfaces',
+ 'interfaces_ppps.php' => 'https://doc.pfsense.org/index.php/PPP_Interfaces',
+ 'interfaces_ppps_edit.php' => 'https://doc.pfsense.org/index.php/PPP_Interfaces',
+ 'interfaces_qinq.php' => 'https://doc.pfsense.org/index.php/QinQ_Interfaces',
+ 'interfaces_qinq_edit.php' => 'https://doc.pfsense.org/index.php/QinQ_Interfaces',
+ 'services_dyndns.php' => 'https://doc.pfsense.org/index.php/Dynamic_DNS',
+ 'services_dyndns_edit.php' => 'https://doc.pfsense.org/index.php/Dynamic_DNS',
+ 'services_rfc2136.php' => 'https://doc.pfsense.org/index.php/Dynamic_DNS',
+ 'services_rfc2136_edit.php' => 'https://doc.pfsense.org/index.php/Dynamic_DNS',
+ 'services_dhcp.php' => 'https://doc.pfsense.org/index.php/DHCP_Server',
+ 'services_dhcp_edit.php' => 'https://doc.pfsense.org/index.php/DHCP_Server',
+ 'services_dhcp_relay.php' => 'https://doc.pfsense.org/index.php/DHCP_Relay',
+ 'services_dnsmasq.php' => 'https://doc.pfsense.org/index.php/DNS_Forwarder',
+ 'services_dnsmasq_domainoverride_edit.php' => 'https://doc.pfsense.org/index.php/DNS_Forwarder',
+ 'services_dnsmasq_edit.php' => 'https://doc.pfsense.org/index.php/DNS_Forwarder',
+ 'services_igmpproxy.php' => 'https://doc.pfsense.org/index.php/IGMP_Proxy',
+ 'services_igmpproxy_edit.php' => 'https://doc.pfsense.org/index.php/IGMP_Proxy',
+ 'services_snmp.php' => 'https://doc.pfsense.org/index.php/SNMP_Daemon',
+ 'services_wol.php' => 'https://doc.pfsense.org/index.php/Wake_on_LAN',
+ 'services_wol_edit.php' => 'https://doc.pfsense.org/index.php/Wake_on_LAN',
+ 'system.php' => 'https://doc.pfsense.org/index.php/General_Setup',
+ 'system_advanced_admin.php' => 'https://doc.pfsense.org/index.php/Advanced_Setup',
+ 'system_advanced_firewall.php' => 'https://doc.pfsense.org/index.php/Advanced_Setup#Firewall.2FNAT',
+ 'system_advanced_misc.php' => 'https://doc.pfsense.org/index.php/Advanced_Setup#Miscellaneous',
+ 'system_advanced_network.php' => 'https://doc.pfsense.org/index.php/Advanced_Setup#Firewall.2FNAT',
+ 'system_advanced_notifications.php' => 'https://doc.pfsense.org/index.php/Advanced_Setup#Notifications',
+ 'system_advanced_sysctl.php' => 'https://doc.pfsense.org/index.php/Advanced_Setup#System_Tunables',
+ 'system_firmware.php' => 'https://doc.pfsense.org/index.php/Firmware_Updates',
+ 'system_firmware_auto.php' => 'https://doc.pfsense.org/index.php/Firmware_Updates',
+ 'system_firmware_check.php' => 'https://doc.pfsense.org/index.php/Firmware_Updates',
+ 'system_firmware_settings.php' => 'https://doc.pfsense.org/index.php/Firmware_Updates',
+ 'system_gateway_groups.php' => 'https://doc.pfsense.org/index.php/Gateway_Settings',
+ 'system_gateway_groups_edit.php' => 'https://doc.pfsense.org/index.php/Gateway_Settings',
+ 'system_gateways.php' => 'https://doc.pfsense.org/index.php/Gateway_Settings',
+ 'system_gateways_edit.php' => 'https://doc.pfsense.org/index.php/Gateway_Settings',
+ 'system_routes.php' => 'https://doc.pfsense.org/index.php/Static_Routes',
+ 'system_routes_edit.php' => 'https://doc.pfsense.org/index.php/Static_Routes',
+ 'system_authservers.php' => 'https://doc.pfsense.org/index.php/User_Authentication_Servers',
+ 'system_groupmanager.php' => 'https://doc.pfsense.org/index.php/Group_Manager',
+ 'system_groupmanager_addprivs.php' => 'https://doc.pfsense.org/index.php/Group_Manager',
+ 'system_usermanager.php' => 'https://doc.pfsense.org/index.php/User_Manager',
+ 'system_usermanager_addprivs.php' => 'https://doc.pfsense.org/index.php/User_Manager',
+ 'system_usermanager_settings.php' => 'https://doc.pfsense.org/index.php/User_Manager',
+ 'system_usermanager_settings_ldapacpicker.php' => 'https://doc.pfsense.org/index.php/User_Manager',
+ 'system_usermanager_settings_test.php' => 'https://doc.pfsense.org/index.php/User_Manager',
+ 'system_usermanager_passwordmg.php' => 'https://doc.pfsense.org/index.php/User_Manager',
+ 'system_camanager.php' => 'https://doc.pfsense.org/index.php/Certificate_Management',
+ 'system_certmanager.php' => 'https://doc.pfsense.org/index.php/Certificate_Management',
+ 'vpn_l2tp.php' => 'https://doc.pfsense.org/index.php/L2TP_VPN_Settings',
+ 'vpn_l2tp_users.php' => 'https://doc.pfsense.org/index.php/L2TP_VPN_Settings',
+ 'vpn_l2tp_users_edit.php' => 'https://doc.pfsense.org/index.php/L2TP_VPN_Settings',
+ 'vpn_pppoe.php' => 'https://doc.pfsense.org/index.php/PPPoE_Server_Settings',
+ 'vpn_pppoe_edit.php' => 'https://doc.pfsense.org/index.php/PPPoE_Server_Settings',
+ 'vpn_pptp.php' => 'https://doc.pfsense.org/index.php/PPTP_VPN_Settings',
+ 'vpn_pptp_users.php' => 'https://doc.pfsense.org/index.php/PPTP_VPN_Settings',
+ 'vpn_pptp_users_edit.php' => 'https://doc.pfsense.org/index.php/PPTP_VPN_Settings',
+ 'diag_ipsec.php' => 'https://doc.pfsense.org/index.php/IPsec_Status',
+ 'diag_ipsec_sad.php' => 'https://doc.pfsense.org/index.php/IPsec_Status',
+ 'diag_ipsec_spd.php' => 'https://doc.pfsense.org/index.php/IPsec_Status',
+ 'vpn_ipsec.php' => 'https://doc.pfsense.org/index.php/IPsec_Tunnels',
+ 'vpn_ipsec_mobile.php' => 'https://doc.pfsense.org/index.php/IPsec_Mobile_Clients',
+ 'diag_ipsec_leases.php' => 'https://doc.pfsense.org/index.php/IPsec_Mobile_Clients',
+ 'vpn_ipsec_phase1.php' => 'https://doc.pfsense.org/index.php/IPsec_Tunnels',
+ 'vpn_ipsec_phase2.php' => 'https://doc.pfsense.org/index.php/IPsec_Tunnels',
+ 'vpn_ipsec_keys.php' => 'https://doc.pfsense.org/index.php/IPsec_Tunnels',
+ 'vpn_ipsec_keys_edit.php' => 'https://doc.pfsense.org/index.php/IPsec_Tunnels',
+ 'vpn_ipsec_settings.php' => 'https://doc.pfsense.org/index.php/Advanced_IPsec_Settings',
+ 'services_captiveportal.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'services_captiveportal_filemanager.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'services_captiveportal_ip.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'services_captiveportal_ip_edit.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'services_captiveportal_mac.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'services_captiveportal_mac_edit.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'services_captiveportal_hostname.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'services_captiveportal_hostname_edit.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'status_captiveportal.php' => 'https://doc.pfsense.org/index.php/Captive_Portal_Status',
+ 'status_captiveportal_test.php' => 'https://doc.pfsense.org/index.php/Captive_Portal_Status',
+ 'services_captiveportal_vouchers.php' => 'https://doc.pfsense.org/index.php/Captive_Portal_Vouchers',
+ 'services_captiveportal_vouchers_edit.php' => 'https://doc.pfsense.org/index.php/Captive_Portal_Vouchers',
+ 'status_captiveportal_voucher_rolls.php' => 'https://doc.pfsense.org/index.php/Captive_Portal_Vouchers',
+ 'status_captiveportal_vouchers.php' => 'https://doc.pfsense.org/index.php/Captive_Portal_Vouchers',
+ 'status_openvpn.php' => 'https://doc.pfsense.org/index.php/OpenVPN_Status',
+ 'vpn_openvpn_client.php' => 'https://doc.pfsense.org/index.php/OpenVPN_Settings',
+ 'vpn_openvpn_csc.php' => 'https://doc.pfsense.org/index.php/OpenVPN_Settings',
+ 'vpn_openvpn_server.php' => 'https://doc.pfsense.org/index.php/OpenVPN_Settings',
+ 'openvpn-client-export.xml' => 'https://doc.pfsense.org/index.php/OpenVPN_Client_Exporter', /* Package */
+ 'vpn_openvpn_export.php' => 'https://doc.pfsense.org/index.php/OpenVPN_Client_Exporter', /* Package */
+ 'diag_authentication.php' => 'https://doc.pfsense.org/index.php/User_Authentication_Servers',
+ 'diag_limiter_info.php' => 'https://doc.pfsense.org/index.php/Limiters',
+ 'diag_pf_info.php' => 'https://doc.pfsense.org/index.php/Packet_Filter_Information',
+ 'diag_smart.php' => 'https://doc.pfsense.org/index.php/SMART_Status',
+ 'diag_states_summary.php' => 'https://doc.pfsense.org/index.php/States_Summary',
+ 'interfaces_wireless.php' => 'https://doc.pfsense.org/index.php/Wireless_Interfaces',
+ 'interfaces_wireless_edit.php' => 'https://doc.pfsense.org/index.php/Wireless_Interfaces',
+ 'system_crlmanager.php' => 'https://doc.pfsense.org/index.php/Certificate_Management',
+ 'crash_reporter.php' => 'https://doc.pfsense.org/index.php/Unexpected_Reboot_Troubleshooting',
+ 'diag_dump_states_sources.php' => 'https://doc.pfsense.org/index.php/Show_Source_Tracking',
+ 'diag_logs_gateways.php' => 'https://doc.pfsense.org/index.php/Gateway_Logs',
+ 'diag_logs_resolver.php' => 'https://doc.pfsense.org/index.php/Resolver_Logs',
+ 'diag_logs_routing.php' => 'https://doc.pfsense.org/index.php/Routing_Logs',
+ 'diag_logs_wireless.php' => 'https://doc.pfsense.org/index.php/Wireless_Logs',
+ 'diag_ndp.php' => 'https://doc.pfsense.org/index.php/NDP_Table',
+ 'diag_sockets.php' => 'https://doc.pfsense.org/index.php/Diag_Sockets',
+ 'diag_testport.php' => 'https://doc.pfsense.org/index.php/Test_Port',
+ 'firewall_nat_npt.php' => 'https://doc.pfsense.org/index.php/NPt',
+ 'firewall_nat_npt_edit.php' => 'https://doc.pfsense.org/index.php/NPt',
+ 'services_captiveportal_zones.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'services_captiveportal_zones_edit.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'status_captiveportal_expire.php' => 'https://doc.pfsense.org/index.php/Captive_Portal',
+ 'services_ntpd.php' => 'https://doc.pfsense.org/index.php/NTP_Server',
+ 'status_ntpd.php' => 'https://doc.pfsense.org/index.php/NTP_Server',
+ 'services_ntpd_gps.php' => 'https://doc.pfsense.org/index.php/NTP_Server',
+ 'services_ntpd_pps.php' => 'https://doc.pfsense.org/index.php/NTP_Server',
+ 'system_firmware_restorefullbackup.php' => 'https://doc.pfsense.org/index.php/Full_Backup',
+ 'load_balancer_monitor.php' => 'https://doc.pfsense.org/index.php/Inbound_Load_Balancing',
+ 'load_balancer_monitor_edit.php' => 'https://doc.pfsense.org/index.php/Inbound_Load_Balancing',
+ 'load_balancer_pool.php' => 'https://doc.pfsense.org/index.php/Inbound_Load_Balancing#Set_up_Load_Balancing_Pool',
+ 'load_balancer_pool_edit.php' => 'https://doc.pfsense.org/index.php/Inbound_Load_Balancing#Set_up_Load_Balancing_Pool',
+ 'load_balancer_virtual_server.php' => 'https://doc.pfsense.org/index.php/Inbound_Load_Balancing#Set_up_Virtual_Server',
+ 'load_balancer_virtual_server_edit.php' => 'https://doc.pfsense.org/index.php/Inbound_Load_Balancing#Set_up_Virtual_Server',
+ 'load_balancer_setting.php' => 'https://doc.pfsense.org/index.php/Inbound_Load_Balancing#Advanced_Settings',
+ 'status_lb_pool.php' => 'https://doc.pfsense.org/index.php/Inbound_Load_Balancing_Status',
+ 'status_lb_vs.php' => 'https://doc.pfsense.org/index.php/Inbound_Load_Balancing_Status',
+ 'services_dhcpv6_relay.php' => 'https://doc.pfsense.org/index.php/DHCP_Relay',
+ 'status_dhcpv6_leases.php' => 'https://doc.pfsense.org/index.php/DHCPv6_Leases',
+ 'services_dhcpv6.php' => 'https://doc.pfsense.org/index.php/DHCPv6_Server',
+ 'services_dhcpv6_edit.php' => 'https://doc.pfsense.org/index.php/DHCPv6_Server',
+ 'services_router_advertisements.php' => 'https://doc.pfsense.org/index.php/Router_Advertisements',
+ 'carp_status.php' => 'https://doc.pfsense.org/index.php/CARP_Status',
+ 'system_hasync.php' => 'https://doc.pfsense.org/index.php/High_Availability',
+ 'services_unbound.php' => 'https://doc.pfsense.org/index.php/Unbound_DNS_Resolver',
+ 'services_unbound_advanced.php' => 'https://doc.pfsense.org/index.php/Unbound_DNS_Resolver#Advanced_Settings_Tab',
+ 'services_unbound_acls.php' => 'https://doc.pfsense.org/index.php/Unbound_DNS_Resolver#Access_Lists_Tab',
+ 'services_unbound_domainoverride_edit.php' => 'https://doc.pfsense.org/index.php/Unbound_DNS_Resolver',
+ 'services_unbound_host_edit.php' => 'https://doc.pfsense.org/index.php/Unbound_DNS_Resolver',
+ 'diag_gmirror.php' => 'https://doc.pfsense.org/index.php/Create_a_Software_RAID1_%28gmirror%29',
+
+ /* From here down are packages. Not checking these as strictly,
+ any information is better than nothing. */
+ 'olsrd.xml' => 'https://doc.pfsense.org/index.php/OLSR_Daemon',
+ 'routed.xml' => 'https://doc.pfsense.org/index.php/Routing_Information_Protocol_(RIP)', # RIP
+ 'autoconfigbackup.xml' => 'https://doc.pfsense.org/index.php/AutoConfigBackup',
+ 'phpservice.xml' => 'https://doc.pfsense.org/index.php/PHPService',
+ 'anyterm.xml' => 'https://doc.pfsense.org/index.php/AnyTerm_package',
+ 'avahi.xml' => 'https://doc.pfsense.org/index.php/Avahi_package',
+ 'squid.xml' => 'https://doc.pfsense.org/index.php/Category:Squid',
+ 'squid_auth.xml' => 'https://doc.pfsense.org/index.php/Category:Squid',
+ 'squid_cache.xml' => 'https://doc.pfsense.org/index.php/Category:Squid',
+ 'squid_extauth.xml' => 'https://doc.pfsense.org/index.php/Category:Squid',
+ 'squid_nac.xml' => 'https://doc.pfsense.org/index.php/Category:Squid',
+ 'squid_ng.xml' => 'https://doc.pfsense.org/index.php/Category:Squid',
+ 'squid_traffic.xml' => 'https://doc.pfsense.org/index.php/Category:Squid',
+ 'squid_upstream.xml' => 'https://doc.pfsense.org/index.php/Category:Squid',
+ 'squid_users.xml' => 'https://doc.pfsense.org/index.php/Category:Squid',
+ 'squidGuard.xml' => 'https://doc.pfsense.org/index.php/SquidGuard_package',
+ 'squidguard.xml' => 'https://doc.pfsense.org/index.php/SquidGuard_package',
+ 'squidguard_acl.xml' => 'https://doc.pfsense.org/index.php/SquidGuard_package',
+ 'squidguard_default.xml' => 'https://doc.pfsense.org/index.php/SquidGuard_package',
+ 'squidguard_dest.xml' => 'https://doc.pfsense.org/index.php/SquidGuard_package',
+ 'squidguard_log.xml' => 'https://doc.pfsense.org/index.php/SquidGuard_package',
+ 'squidguard_rewr.xml' => 'https://doc.pfsense.org/index.php/SquidGuard_package',
+ 'squidguard_time.xml' => 'https://doc.pfsense.org/index.php/SquidGuard_package',
+ 'bandwidthd.xml' => 'https://doc.pfsense.org/index.php/How_can_I_monitor_bandwidth_usage',
+ 'pfflowd.xml' => 'https://doc.pfsense.org/index.php/How_can_I_monitor_bandwidth_usage',
+ 'darkstat.xml' => 'https://doc.pfsense.org/index.php/How_can_I_monitor_bandwidth_usage',
+ 'rate.xml' => 'https://doc.pfsense.org/index.php/How_can_I_monitor_bandwidth_usage',
+ 'ntop.xml' => 'https://doc.pfsense.org/index.php/How_can_I_monitor_bandwidth_usage',
+ 'ntopng.xml' => 'https://doc.pfsense.org/index.php/How_can_I_monitor_bandwidth_usage',
+ 'vnstat.xml' => 'https://doc.pfsense.org/index.php/How_can_I_monitor_bandwidth_usage',
+ 'widentd.xml' => 'https://doc.pfsense.org/index.php/Widentd_package',
+ 'tinydns.xml' => 'https://doc.pfsense.org/index.php/Tinydns_package',
+ 'tinydns_domains.xml' => 'https://doc.pfsense.org/index.php/Tinydns_package',
+ 'tinydns_sync.xml' => 'https://doc.pfsense.org/index.php/Tinydns_package',
+ 'blinkled.xml' => 'https://doc.pfsense.org/index.php/BlinkLED_Package',
+ 'havp.xml' => 'https://doc.pfsense.org/index.php/HAVP_Package_for_HTTP_Anti-Virus_Scanning',
+ 'havp_avset.xml' => 'https://doc.pfsense.org/index.php/HAVP_Package_for_HTTP_Anti-Virus_Scanning',
+ 'havp_blacklist.xml' => 'https://doc.pfsense.org/index.php/HAVP_Package_for_HTTP_Anti-Virus_Scanning',
+ 'havp_fscan.xml' => 'https://doc.pfsense.org/index.php/HAVP_Package_for_HTTP_Anti-Virus_Scanning',
+ 'havp_trans_exclude.xml' => 'https://doc.pfsense.org/index.php/HAVP_Package_for_HTTP_Anti-Virus_Scanning',
+ 'havp_whitelist.xml' => 'https://doc.pfsense.org/index.php/HAVP_Package_for_HTTP_Anti-Virus_Scanning',
+ 'snort.xml' => 'https://doc.pfsense.org/index.php/Setup_Snort_Package',
+ 'snort/snort_interfaces.php' => 'https://doc.pfsense.org/index.php/Snort_interfaces',
+ 'snort/snort_interfaces_global.php' => 'https://doc.pfsense.org/index.php/Snort_interfaces_global',
+ 'snort/snort_download_updates.php' => 'https://doc.pfsense.org/index.php/Snort_updates',
+ 'snort/snort_alerts.php' => 'https://doc.pfsense.org/index.php/Snort_alerts',
+ 'snort/snort_blocked.php' => 'https://doc.pfsense.org/index.php/Snort_blocked_hosts',
+ 'snort/snort_passlist.php' => 'https://doc.pfsense.org/index.php/Snort_passlist',
+ 'snort/snort_passlist_edit.php' => 'https://doc.pfsense.org/index.php/Snort_passlist',
+ 'snort/snort_interfaces_suppress.php' => 'https://doc.pfsense.org/index.php/Snort_suppress_list',
+ 'snort/snort_interfaces_suppress_edit.php' => 'https://doc.pfsense.org/index.php/Snort_suppress_list',
+ 'snort/snort_interfaces_edit.php' => 'https://doc.pfsense.org/index.php/Snort_interfaces_edit',
+ 'snort/snort_rulesets.php' => 'https://doc.pfsense.org/index.php/Snort_rulesets',
+ 'snort/snort_rules.php' => 'https://doc.pfsense.org/index.php/Snort_rules',
+ 'snort/snort_define_servers.php' => 'https://doc.pfsense.org/index.php/Snort_define_servers',
+ 'snort/snort_preprocessors.php' => 'https://doc.pfsense.org/index.php/Snort_preprocessors',
+ 'snort/snort_barnyard.php' => 'https://doc.pfsense.org/index.php/Snort_barnyard2',
+ 'snort/snort_ip_reputation.php' => 'https://doc.pfsense.org/index.php/Snort_ip_reputation_preprocessor',
+ 'snort/snort_ip_list_mgmt.php' => 'https://doc.pfsense.org/index.php/Snort_ip_list_mgmt',
+ 'snort/snort_sync.xml' => 'https://doc.pfsense.org/index.php/Snort_sync',
+ 'stunnel.xml' => 'https://doc.pfsense.org/index.php/Stunnel_package',
+ 'stunnel_certs.xml' => 'https://doc.pfsense.org/index.php/Stunnel_package',
+ 'openbgpd.xml' => 'https://doc.pfsense.org/index.php/OpenBGPD_package',
+ 'openbgpd_groups.xml' => 'https://doc.pfsense.org/index.php/OpenBGPD_package',
+ 'openbgpd_neighbors.xml' => 'https://doc.pfsense.org/index.php/OpenBGPD_package',
+ 'iperf.xml' => 'https://doc.pfsense.org/index.php/Iperf_package',
+ 'iperfserver.xml' => 'https://doc.pfsense.org/index.php/Iperf_package',
+ 'jail_template.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
+ 'jailctl.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
+ 'jailctl.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
+ 'jailctl_defaults.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
+ 'jailctl_settings.xml' => 'https://doc.pfsense.org/index.php/PfJailctl_package',
+ 'siproxd.xml' => 'https://doc.pfsense.org/index.php/Siproxd_package',
+ 'siproxdusers.xml' => 'https://doc.pfsense.org/index.php/Siproxd_package',
+ 'open-vm-tools.xml' => 'https://doc.pfsense.org/index.php/Open_VM_Tools_package',
+ 'arping.xml' => 'https://doc.pfsense.org/index.php/Arping_package',
+ 'unbound.xml' => 'https://doc.pfsense.org/index.php/Unbound_package',
+ 'nut.xml' => 'https://doc.pfsense.org/index.php/Nut_package',
+
+);
+
+$pagename = "";
+/* Check for parameter "page". */
+if ($_GET && isset($_GET['page'])) {
+ $pagename = $_GET['page'];
+}
+
+/* If "page" is not found, check referring URL */
+if (empty($pagename)) {
+ /* Attempt to parse out filename */
+ $uri_split = "";
+ preg_match("/\/(.*)\?(.*)/", $_SERVER["HTTP_REFERER"], $uri_split);
+
+ /* If there was no match, there were no parameters, just grab the filename
+ Otherwise, use the matched filename from above. */
+ if (empty($uri_split[0])) {
+ $pagename = ltrim(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_PATH), '/');
+ } else {
+ $pagename = $uri_split[1];
+ }
+
+ /* If the page name is still empty, the user must have requested / (index.php) */
+ if (empty($pagename)) {
+ $pagename = "index.php";
+ }
+
+ /* If the filename is pkg_edit.php or wizard.php, reparse looking
+ for the .xml filename */
+ if (($pagename == "pkg.php") || ($pagename == "pkg_edit.php") || ($pagename == "wizard.php")) {
+ $param_split = explode('&', $uri_split[2]);
+ foreach ($param_split as $param) {
+ if (substr($param, 0, 4) == "xml=") {
+ $xmlfile = explode('=', $param);
+ $pagename = $xmlfile[1];
+ }
+ }
+ }
+}
+
+/* Using the derived page name, attempt to find in the URL mapping hash */
+if (array_key_exists($pagename, $helppages)) {
+ $helppage = $helppages[$pagename];
+}
+
+/* If we haven't determined a proper page, use a generic help page
+ stating that a given page does not have help yet. */
+
+if (empty($helppage)) {
+ $helppage = 'https://doc.pfsense.org/index.php/No_Help_Found';
+}
+
+/* Redirect to help page. */
+header("Location: {$helppage}");
+
+?>
diff --git a/src/usr/local/www/ifstats.php b/src/usr/local/www/ifstats.php
new file mode 100644
index 0000000..68cc6d8
--- /dev/null
+++ b/src/usr/local/www/ifstats.php
@@ -0,0 +1,66 @@
+<?php
+/* $Id$ */
+/*
+ ifstats.php
+ part of pfSense (https://www.pfsense.org)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2005-2006 Scott Ullrich (sullrich@gmail.com)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/netstat
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-xmlrpcinterfacestats
+##|*NAME=XMLRPC Interface Stats page
+##|*DESCR=Allow access to the 'XMLRPC Interface Stats' page.
+##|*MATCH=ifstats.php*
+##|-PRIV
+
+ require_once('guiconfig.inc');
+ require_once("interfaces.inc");
+
+ $if = $_GET['if'];
+
+ $realif = get_real_interface($if);
+ if (!$realif) {
+ $realif = $if; // Need for IPsec case interface.
+ }
+
+ $ifinfo = pfSense_get_interface_stats($realif);
+
+ $temp = gettimeofday();
+ $timing = (double)$temp["sec"] + (double)$temp["usec"] / 1000000.0;
+
+ header("Last-Modified: " . gmdate("D, j M Y H:i:s") . " GMT");
+ header("Expires: " . gmdate("D, j M Y H:i:s", time()) . " GMT");
+ header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP/1.1
+ header("Pragma: no-cache"); // HTTP/1.0
+
+ echo "$timing|" . $ifinfo['inbytes'] . "|" . $ifinfo['outbytes'] . "\n";
+
+?>
diff --git a/src/usr/local/www/includes/functions.inc.php b/src/usr/local/www/includes/functions.inc.php
new file mode 100644
index 0000000..2c48543
--- /dev/null
+++ b/src/usr/local/www/includes/functions.inc.php
@@ -0,0 +1,407 @@
+<?
+/*
+ functions.inc.php
+ pfSense_MODULE: ajax
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+*/
+
+if (Connection_Aborted()) {
+ exit;
+}
+
+require_once("config.inc");
+require_once("pfsense-utils.inc");
+
+function get_stats() {
+ $stats['cpu'] = cpu_usage();
+ $stats['mem'] = mem_usage();
+ $stats['uptime'] = get_uptime();
+ $stats['states'] = get_pfstate();
+ $stats['temp'] = get_temp();
+ $stats['datetime'] = update_date_time();
+ $stats['interfacestatistics'] = get_interfacestats();
+ $stats['interfacestatus'] = get_interfacestatus();
+ $stats['gateways'] = get_gatewaystats();
+ $stats['cpufreq'] = get_cpufreq();
+ $stats['load_average'] = get_load_average();
+ $stats['mbuf'] = get_mbuf();
+ $stats['mbufpercent'] = get_mbuf(true);
+ $stats['statepercent'] = get_pfstate(true);
+ $stats = join("|", $stats);
+ return $stats;
+}
+
+function get_gatewaystats() {
+ global $config;
+ if (isset($config["widgets"]["gateways_widget"]["display_type"])) {
+ $display_type = $config["widgets"]["gateways_widget"]["display_type"];
+ } else {
+ $display_type = "gw_ip";
+ }
+
+ $a_gateways = return_gateways_array();
+ $gateways_status = array();
+ $gateways_status = return_gateways_status(true);
+ $data = "";
+ $isfirst = true;
+ foreach ($a_gateways as $gname => $gw) {
+ if (!$isfirst) {
+ $data .= ",";
+ }
+ $isfirst = false;
+ $data .= $gw['name'] . ",";
+
+ $monitor_address = "";
+ $monitor_address_disp = "";
+ if ($display_type == "monitor_ip" || $display_type == "both_ip") {
+ $monitor_address = $gw['monitor'];
+ if ($monitor_address != "" && $display_type == "both_ip") {
+ $monitor_address_disp = " (" . $monitor_address . ")";
+ } else {
+ $monitor_address_disp = $monitor_address;
+ }
+ }
+
+ if ($gateways_status[$gname]) {
+ if ($display_type == "gw_ip" || $display_type == "both_ip" || ($display_type == "monitor_ip" && $monitor_address == "")) {
+ $if_gw = lookup_gateway_ip_by_name($gname);
+ } else {
+ $if_gw = "";
+ }
+ if ($monitor_address == $if_gw) {
+ $monitor_address_disp = "";
+ }
+
+ $data .= "<b>" . $if_gw . $monitor_address_disp . "</b>,";
+ $gws = $gateways_status[$gname];
+ switch (strtolower($gws['status'])) {
+ case "none":
+ $online = "Online";
+ $bgcolor = "#90EE90"; // lightgreen
+ break;
+ case "down":
+ $online = "Offline";
+ $bgcolor = "#F08080"; // lightcoral
+ break;
+ case "delay":
+ $online = "Latency";
+ $bgcolor = "#F0E68C"; // khaki
+ break;
+ case "loss":
+ $online = "Packetloss";
+ $bgcolor = "#F0E68C"; // khaki
+ break;
+ default:
+ $online = "Pending";
+ break;
+ }
+ } else {
+ if ($display_type == "gw_ip" || $display_type == "both_ip" || ($display_type == "monitor_ip" && $monitor_address == "")) {
+ $if_gw = "~";
+ } else {
+ $if_gw = "";
+ }
+ $data .= $if_gw . $monitor_address_disp . ",";
+ $gws['delay'] = "~";
+ $gws['loss'] = "~";
+ $online = "Unknown";
+ $bgcolor = "#ADD8E6"; // lightblue
+ }
+ $data .= ($online == "Pending") ? "{$online},{$online}," : "{$gws['delay']},{$gws['loss']},";
+ $data .= "{$online}^{$bgcolor}";
+ }
+ return $data;
+}
+
+function get_uptime() {
+ $uptime = get_uptime_sec();
+
+ if (intval($uptime) == 0) {
+ return;
+ }
+
+ $updays = (int)($uptime / 86400);
+ $uptime %= 86400;
+ $uphours = (int)($uptime / 3600);
+ $uptime %= 3600;
+ $upmins = (int)($uptime / 60);
+ $uptime %= 60;
+ $upsecs = (int)($uptime);
+
+ $uptimestr = "";
+ if ($updays > 1) {
+ $uptimestr .= "$updays Days ";
+ } else if ($updays > 0) {
+ $uptimestr .= "1 Day ";
+ }
+
+ if ($uphours > 1) {
+ $hours = "s";
+ }
+
+ if ($upmins > 1) {
+ $minutes = "s";
+ }
+
+ if ($upmins > 1) {
+ $seconds = "s";
+ }
+
+ $uptimestr .= sprintf("%02d Hour$hours %02d Minute$minutes %02d Second$seconds", $uphours, $upmins, $upsecs);
+ return $uptimestr;
+}
+
+/* Calculates non-idle CPU time and returns as a percentage */
+function cpu_usage() {
+ $duration = 1;
+ $diff = array('user', 'nice', 'sys', 'intr', 'idle');
+ $cpuTicks = array_combine($diff, explode(" ", get_single_sysctl('kern.cp_time')));
+ sleep($duration);
+ $cpuTicks2 = array_combine($diff, explode(" ", get_single_sysctl('kern.cp_time')));
+
+ $totalStart = array_sum($cpuTicks);
+ $totalEnd = array_sum($cpuTicks2);
+
+ // Something wrapped ?!?!
+ if ($totalEnd <= $totalStart) {
+ return 0;
+ }
+
+ // Calculate total cycles used
+ $totalUsed = ($totalEnd - $totalStart) - ($cpuTicks2['idle'] - $cpuTicks['idle']);
+
+ // Calculate the percentage used
+ $cpuUsage = floor(100 * ($totalUsed / ($totalEnd - $totalStart)));
+
+ return $cpuUsage;
+}
+
+function get_pfstate($percent=false) {
+ global $config;
+ $matches = "";
+ if (isset($config['system']['maximumstates']) and $config['system']['maximumstates'] > 0) {
+ $maxstates="{$config['system']['maximumstates']}";
+ } else {
+ $maxstates=pfsense_default_state_size();
+ }
+ $curentries = `/sbin/pfctl -si |grep current`;
+ if (preg_match("/([0-9]+)/", $curentries, $matches)) {
+ $curentries = $matches[1];
+ }
+ if (!is_numeric($curentries)) {
+ $curentries = 0;
+ }
+ if ($percent) {
+ if (intval($maxstates) > 0) {
+ return round(($curentries / $maxstates) * 100, 0);
+ } else {
+ return "NA";
+ }
+ } else {
+ return $curentries . "/" . $maxstates;
+ }
+}
+
+function has_temp() {
+ /* no known temp monitors available at present */
+
+ /* should only reach here if there is no hardware monitor */
+ return false;
+}
+
+function get_hwtype() {
+ return;
+}
+
+function get_mbuf($percent=false) {
+ $mbufs_output=trim(`/usr/bin/netstat -mb | /usr/bin/grep "mbuf clusters in use" | /usr/bin/awk '{ print $1 }'`);
+ list($mbufs_current, $mbufs_cache, $mbufs_total, $mbufs_max) = explode("/", $mbufs_output);
+ if ($percent) {
+ if ($mbufs_max > 0) {
+ return round(($mbufs_total / $mbufs_max) * 100, 0);
+ } else {
+ return "NA";
+ }
+ } else {
+ return "{$mbufs_total}/{$mbufs_max}";
+ }
+}
+
+function get_temp() {
+ $temp_out = get_single_sysctl("dev.cpu.0.temperature");
+ if ($temp_out == "") {
+ $temp_out = get_single_sysctl("hw.acpi.thermal.tz0.temperature");
+ }
+
+ // Remove 'C' from the end
+ return rtrim($temp_out, 'C');
+}
+
+/* Get mounted filesystems and usage. Do not display entries for virtual filesystems (e.g. devfs, nullfs, unionfs) */
+function get_mounted_filesystems() {
+ $mout = "";
+ $filesystems = array();
+ exec("/bin/df -Tht ufs,zfs,cd9660 | /usr/bin/awk '{print $1, $2, $3, $6, $7;}'", $mout);
+
+ /* Get rid of the header */
+ array_shift($mout);
+ foreach ($mout as $fs) {
+ $f = array();
+ list($f['device'], $f['type'], $f['total_size'], $f['percent_used'], $f['mountpoint']) = explode(' ', $fs);
+
+ /* We dont' want the trailing % sign. */
+ $f['percent_used'] = trim($f['percent_used'], '%');
+
+ $filesystems[] = $f;
+ }
+ return $filesystems;
+}
+
+function disk_usage($slice = '/') {
+ $dfout = "";
+ exec("/bin/df -h {$slice} | /usr/bin/tail -n 1 | /usr/bin/awk '{ print $5 }' | /usr/bin/cut -d '%' -f 1", $dfout);
+ $diskusage = trim($dfout[0]);
+
+ return $diskusage;
+}
+
+function swap_usage() {
+ exec("/usr/sbin/swapinfo", $swap_info);
+ $swap_used = "";
+ foreach ($swap_info as $line) {
+ if (preg_match('/(\d+)%$/', $line, $matches)) {
+ $swap_used = $matches[1];
+ break;
+ }
+ }
+
+ return $swap_used;
+}
+
+function mem_usage() {
+ $totalMem = get_single_sysctl("vm.stats.vm.v_page_count");
+ if ($totalMem > 0) {
+ $inactiveMem = get_single_sysctl("vm.stats.vm.v_inactive_count");
+ $cachedMem = get_single_sysctl("vm.stats.vm.v_cache_count");
+ $freeMem = get_single_sysctl("vm.stats.vm.v_free_count");
+ $usedMem = $totalMem - ($inactiveMem + $cachedMem + $freeMem);
+ $memUsage = round(($usedMem * 100) / $totalMem, 0);
+ } else {
+ $memUsage = "NA";
+ }
+
+ return $memUsage;
+}
+
+function update_date_time() {
+ $datetime = date("D M j G:i:s T Y");
+ return $datetime;
+}
+
+function get_cpufreq() {
+ $cpufreqs = "";
+ $out = "";
+ $cpufreqs = explode(" ", get_single_sysctl('dev.cpu.0.freq_levels'));
+ $maxfreq = explode("/", $cpufreqs[0]);
+ $maxfreq = $maxfreq[0];
+ $curfreq = "";
+ $curfreq = get_single_sysctl('dev.cpu.0.freq');
+ if (($curfreq > 0) && ($curfreq != $maxfreq)) {
+ $out = "Current: {$curfreq} MHz, Max: {$maxfreq} MHz";
+ }
+ return $out;
+}
+
+function get_cpu_count($show_detail = false) {
+ $cpucount = get_single_sysctl('kern.smp.cpus');
+
+ if ($show_detail) {
+ $cpudetail = "";
+ exec("/usr/bin/grep 'SMP.*package.*core' /var/log/dmesg.boot | /usr/bin/cut -f2- -d' '", $cpudetail);
+ $cpucount = $cpudetail[0];
+ }
+ return $cpucount;
+}
+
+function get_load_average() {
+ $load_average = "";
+ exec("/usr/bin/uptime | /usr/bin/sed 's/^.*: //'", $load_average);
+ return $load_average[0];
+}
+
+function get_interfacestats() {
+ global $config;
+ //build interface list for widget use
+ $ifdescrs = get_configured_interface_list();
+
+ $array_in_packets = array();
+ $array_out_packets = array();
+ $array_in_bytes = array();
+ $array_out_bytes = array();
+ $array_in_errors = array();
+ $array_out_errors = array();
+ $array_collisions = array();
+ $array_interrupt = array();
+ $new_data = "";
+
+ //build data arrays
+ foreach ($ifdescrs as $ifdescr => $ifname) {
+ $ifinfo = get_interface_info($ifdescr);
+ $new_data .= "{$ifinfo['inpkts']},";
+ $new_data .= "{$ifinfo['outpkts']},";
+ $new_data .= format_bytes($ifinfo['inbytes']) . ",";
+ $new_data .= format_bytes($ifinfo['outbytes']) . ",";
+ if (isset($ifinfo['inerrs'])) {
+ $new_data .= "{$ifinfo['inerrs']},";
+ $new_data .= "{$ifinfo['outerrs']},";
+ } else {
+ $new_data .= "0,";
+ $new_data .= "0,";
+ }
+ if (isset($ifinfo['collisions'])) {
+ $new_data .= htmlspecialchars($ifinfo['collisions']) . ",";
+ } else {
+ $new_data .= "0,";
+ }
+ }//end for
+
+ return $new_data;
+}
+
+function get_interfacestatus() {
+ $data = "";
+ global $config;
+
+ //build interface list for widget use
+ $ifdescrs = get_configured_interface_with_descr();
+
+ foreach ($ifdescrs as $ifdescr => $ifname) {
+ $ifinfo = get_interface_info($ifdescr);
+ $data .= $ifname . "^";
+ if ($ifinfo['status'] == "up" || $ifinfo['status'] == "associated") {
+ $data .= "up";
+ } else if ($ifinfo['status'] == "no carrier") {
+ $data .= "down";
+ } else if ($ifinfo['status'] == "down") {
+ $data .= "block";
+ }
+ $data .= "^";
+ if ($ifinfo['ipaddr']) {
+ $data .= "<strong>" . htmlspecialchars($ifinfo['ipaddr']) . "</strong>";
+ }
+ $data .= "^";
+ if ($ifinfo['ipaddrv6']) {
+ $data .= "<strong>" . htmlspecialchars($ifinfo['ipaddrv6']) . "</strong>";
+ }
+ $data .= "^";
+ if ($ifinfo['status'] != "down") {
+ $data .= htmlspecialchars($ifinfo['media']);
+ }
+
+ $data .= "~";
+
+ }
+ return $data;
+}
+
+?>
diff --git a/src/usr/local/www/index.php b/src/usr/local/www/index.php
new file mode 100644
index 0000000..ba39623
--- /dev/null
+++ b/src/usr/local/www/index.php
@@ -0,0 +1,799 @@
+<?php
+/* $Id$ */
+/*
+ index.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2012 Scott Ullrich
+ All rights reserved.
+
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ oR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-system-login/logout
+##|*NAME=System: Login / Logout page / Dashboard
+##|*DESCR=Allow access to the 'System: Login / Logout' page and Dashboard.
+##|*MATCH=index.php*
+##|-PRIV
+
+// Turn on buffering to speed up rendering
+ini_set('output_buffering', 'true');
+
+// Start buffering with a cache size of 100000
+ob_start(null, "1000");
+
+
+## Load Essential Includes
+require_once('guiconfig.inc');
+require_once('functions.inc');
+require_once('notices.inc');
+require_once("pkg-utils.inc");
+
+if (isset($_REQUEST['closenotice'])) {
+ close_notice($_REQUEST['closenotice']);
+ echo get_menu_messages();
+ exit;
+}
+if ($_REQUEST['act'] == 'alias_info_popup' && !preg_match("/\D/", $_REQUEST['aliasid'])) {
+ alias_info_popup($_REQUEST['aliasid']);
+ exit;
+}
+
+if ($g['disablecrashreporter'] != true) {
+ // Check to see if we have a crash report
+ $x = 0;
+ if (file_exists("/tmp/PHP_errors.log")) {
+ $total = `/usr/bin/grep -vi warning /tmp/PHP_errors.log | /usr/bin/wc -l | /usr/bin/awk '{ print $1 }'`;
+ if ($total > 0) {
+ $x++;
+ }
+ }
+ $crash = glob("/var/crash/*");
+ $skip_files = array(".", "..", "minfree", "");
+ if (is_array($crash)) {
+ foreach ($crash as $c) {
+ if (!in_array(basename($c), $skip_files)) {
+ $x++;
+ }
+ }
+ if ($x > 0) {
+ $savemsg = "{$g['product_name']} has detected a crash report or programming bug. Click <a href='crash_reporter.php'>here</a> for more information.";
+ }
+ }
+}
+
+##build list of widgets
+$directory = "/usr/local/www/widgets/widgets/";
+$dirhandle = opendir($directory);
+$filename = "";
+$widgetnames = array();
+$widgetfiles = array();
+$widgetlist = array();
+
+while (false !== ($filename = readdir($dirhandle))) {
+ $periodpos = strpos($filename, ".");
+ /* Ignore files not ending in .php */
+ if (substr($filename, -4, 4) != ".php") {
+ continue;
+ }
+ $widgetname = substr($filename, 0, $periodpos);
+ $widgetnames[] = $widgetname;
+ if ($widgetname != "system_information") {
+ $widgetfiles[] = $filename;
+ }
+}
+
+##sort widgets alphabetically
+sort($widgetfiles);
+
+##insert the system information widget as first, so as to be displayed first
+array_unshift($widgetfiles, "system_information.widget.php");
+
+##if no config entry found, initialize config entry
+if (!is_array($config['widgets'])) {
+ $config['widgets'] = array();
+}
+
+if ($_POST && $_POST['submit']) {
+ $config['widgets']['sequence'] = $_POST['sequence'];
+
+ foreach ($widgetnames as $widget) {
+ if ($_POST[$widget . '-config']) {
+ $config['widgets'][$widget . '-config'] = $_POST[$widget . '-config'];
+ }
+ }
+
+ write_config(gettext("Widget configuration has been changed."));
+ header("Location: index.php");
+ exit;
+}
+
+## Load Functions Files
+require_once('includes/functions.inc.php');
+
+## Check to see if we have a swap space,
+## if true, display, if false, hide it ...
+if (file_exists("/usr/sbin/swapinfo")) {
+ $swapinfo = `/usr/sbin/swapinfo`;
+ if (stristr($swapinfo, '%') == true) {
+ $showswap=true;
+ }
+}
+
+## User recently restored his config.
+## If packages are installed lets resync
+if (file_exists('/conf/needs_package_sync')) {
+ if ($config['installedpackages'] <> '' && is_array($config['installedpackages']['package'])) {
+ if ($g['platform'] == "pfSense" || $g['platform'] == "nanobsd") {
+ ## If the user has logged into webGUI quickly while the system is booting then do not redirect them to
+ ## the package reinstall page. That is about to be done by the boot script anyway.
+ ## The code in fbegin.inc will put up a notice to the user.
+ if (!platform_booting()) {
+ header('Location: pkg_mgr_install.php?mode=reinstallall');
+ exit;
+ }
+ }
+ } else {
+ conf_mount_rw();
+ @unlink('/conf/needs_package_sync');
+ conf_mount_ro();
+ }
+}
+
+## If it is the first time webConfigurator has been
+## accessed since initial install show this stuff.
+if (file_exists('/conf/trigger_initial_wizard')) {
+ $lang_code = system_get_language_code();
+ $lang_codeset = system_get_language_codeset();
+ echo <<<EOF
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="$lang_code" xml:lang="$lang_code">
+<head>
+ <title>{$g['product_name']}.localdomain - {$g['product_name']} first time setup</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=$lang_codeset" />
+ <link rel="stylesheet" type="text/css" href="/niftycssprintCode.css" media="print" />
+ <script type="text/javascript">var theme = "{$g['theme']}"</script>
+ <script type="text/javascript" src="/themes/{$g['theme']}/loader.js"></script>
+
+EOF;
+
+ echo "<body link=\"#0000CC\" vlink=\"#0000CC\" alink=\"#0000CC\">\n";
+
+ if (file_exists("/usr/local/www/themes/{$g['theme']}/wizard.css")) {
+ echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/wizard.css\" media=\"all\" />\n";
+ } else {
+ echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/all.css\" media=\"all\" />";
+ }
+
+ echo "<form>\n";
+ echo "<center>\n";
+ echo "<img src=\"/themes/{$g['theme']}/images/logo.gif\" border=\"0\" alt=\"logo\" /><p>\n";
+ echo "<div \" style=\"width:700px;background-color:#ffffff\" id=\"nifty\">\n";
+ echo sprintf(gettext("Welcome to %s!\n"), $g['product_name']) . "<p>";
+ echo gettext("One moment while we start the initial setup wizard.") . "<p>\n";
+ echo gettext("Embedded platform users: Please be patient, the wizard takes a little longer to run than the normal GUI.") . "<p>\n";
+ echo sprintf(gettext("To bypass the wizard, click on the %s logo on the initial page."), $g['product_name']) . "\n";
+ echo "</div>\n";
+ echo "<meta http-equiv=\"refresh\" content=\"1;url=wizard.php?xml=setup_wizard.xml\">\n";
+ echo "<script type=\"text/javascript\">\n";
+ echo "//<![CDATA[\n";
+ echo "NiftyCheck();\n";
+ echo "Rounded(\"div#nifty\",\"all\",\"#AAA\",\"#FFFFFF\",\"smooth\");\n";
+ echo "//]]>\n";
+ echo "</script>\n";
+ exit;
+}
+
+
+## Find out whether there's hardware encryption or not
+unset($hwcrypto);
+$fd = @fopen("{$g['varlog_path']}/dmesg.boot", "r");
+if ($fd) {
+ while (!feof($fd)) {
+ $dmesgl = fgets($fd);
+ if (preg_match("/^hifn.: (.*?),/", $dmesgl, $matches) or
+ preg_match("/.*(VIA Padlock)/", $dmesgl, $matches) or
+ preg_match("/^safe.: (\w.*)/", $dmesgl, $matches) or
+ preg_match("/^ubsec.: (.*?),/", $dmesgl, $matches) or
+ preg_match("/^padlock.: <(.*?)>,/", $dmesgl, $matches) or
+ preg_match("/^glxsb.: (.*?),/", $dmesgl, $matches) or
+ preg_match("/^aesni.: <(.*?)>/", $dmesgl, $matches)) {
+ $hwcrypto = $matches[1];
+ break;
+ }
+ }
+ fclose($fd);
+}
+
+##build widget saved list information
+if ($config['widgets'] && $config['widgets']['sequence'] != "") {
+ $pconfig['sequence'] = $config['widgets']['sequence'];
+
+ $widgetlist = $pconfig['sequence'];
+ $colpos = array();
+ $savedwidgetfiles = array();
+ $widgetname = "";
+ $widgetlist = explode(",", $widgetlist);
+
+ ##read the widget position and display information
+ foreach ($widgetlist as $widget) {
+ $dashpos = strpos($widget, "-");
+ $widgetname = substr($widget, 0, $dashpos);
+ $colposition = strpos($widget, ":");
+ $displayposition = strrpos($widget, ":");
+ $colpos[] = substr($widget, $colposition + 1, $displayposition - $colposition - 1);
+ $displayarray[] = substr($widget, $displayposition + 1);
+ $savedwidgetfiles[] = $widgetname . ".widget.php";
+ }
+
+ ##add widgets that may not be in the saved configuration, in case they are to be displayed later
+ foreach ($widgetfiles as $defaultwidgets) {
+ if (!in_array($defaultwidgets, $savedwidgetfiles)) {
+ $savedwidgetfiles[] = $defaultwidgets;
+ }
+ }
+
+ ##find custom configurations of a particular widget and load its info to $pconfig
+ foreach ($widgetnames as $widget) {
+ if ($config['widgets'][$widget . '-config']) {
+ $pconfig[$widget . '-config'] = $config['widgets'][$widget . '-config'];
+ }
+ }
+
+ $widgetlist = $savedwidgetfiles;
+} else {
+ // no saved widget sequence found, build default list.
+ $widgetlist = $widgetfiles;
+}
+
+##build list of php include files
+$phpincludefiles = array();
+$directory = "/usr/local/www/widgets/include/";
+$dirhandle = opendir($directory);
+$filename = "";
+while (false !== ($filename = readdir($dirhandle))) {
+ $phpincludefiles[] = $filename;
+}
+foreach ($phpincludefiles as $includename) {
+ if (!stristr($includename, ".inc")) {
+ continue;
+ }
+ include($directory . $includename);
+}
+
+##begin AJAX
+$jscriptstr = <<<EOD
+<script type="text/javascript">
+//<![CDATA[
+
+function widgetAjax(widget) {
+ uri = "widgets/widgets/" + widget + ".widget.php";
+ var opt = {
+ // Use GET
+ type: 'get',
+ async: true,
+ // Handle 404
+ statusCode: {
+ 404: function(t) {
+ alert('Error 404: location "' + t.statusText + '" was not found.');
+ }
+ },
+ // Handle other errors
+ error: function(t) {
+ alert('Error ' + t.status + ' -- ' + t.statusText);
+ },
+ success: function(data) {
+ widget2 = '#' + widget + "-loader";
+ jQuery(widget2).fadeOut(1000,function() {
+ jQuery('#' + widget).show();
+ });
+ jQuery('#' + widget).html(data);
+ }
+ }
+ jQuery.ajax(uri, opt);
+}
+
+
+function addWidget(selectedDiv) {
+ selectedDiv2 = '#' + selectedDiv + "-container";
+ if (jQuery(selectedDiv2).css('display') != "none")
+ {
+ jQuery(selectedDiv2).effect('shake',{times: 2}, 100);
+ }
+ else
+ {
+ jQuery(selectedDiv2).show('blind');
+ widgetAjax(selectedDiv);
+ selectIntLink = selectedDiv2 + "-input";
+ jQuery(selectIntLink).val("show");
+ showSave();
+ }
+}
+
+function configureWidget(selectedDiv) {
+ selectIntLink = '#' + selectedDiv + "-settings";
+ if (jQuery(selectIntLink).css('display') == "none") {
+ jQuery(selectIntLink).show();
+ } else {
+ jQuery(selectIntLink).hide();
+ }
+}
+
+function showWidget(selectedDiv, swapButtons) {
+ //appear element
+ jQuery('#' + selectedDiv).show('blind');
+ showSave();
+ d = document;
+ if (swapButtons) {
+ selectIntLink = selectedDiv + "-min";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+
+
+ selectIntLink = selectedDiv + "-open";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "none";
+
+ }
+ selectIntLink = selectedDiv + "-container-input";
+ textlink = d.getElementById(selectIntLink);
+ textlink.value = "show";
+
+}
+
+function minimizeWidget(selectedDiv, swapButtons) {
+ //fade element
+ jQuery('#' + selectedDiv).hide('blind');
+ showSave();
+ d = document;
+ if (swapButtons) {
+ selectIntLink = selectedDiv + "-open";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+
+ selectIntLink = selectedDiv + "-min";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "none";
+ }
+ selectIntLink = selectedDiv + "-container-input";
+ textlink = d.getElementById(selectIntLink);
+ textlink.value = "hide";
+
+}
+
+function closeWidget(selectedDiv) {
+ showSave();
+ selectedDiv2 = "#" + selectedDiv + "-container";
+ jQuery(selectedDiv2).hide('blind');
+ selectIntLink = "#" + selectedDiv + "-container-input";
+ jQuery(selectIntLink).val("close");
+}
+
+function showSave() {
+ d = document;
+ selectIntLink = "submit";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+}
+
+function updatePref() {
+ var widgets = document.getElementsByClassName('widgetdiv');
+ var widgetSequence = "";
+ var firstprint = false;
+ d = document;
+ for (i = 0; i < widgets.length; i++) {
+ if (firstprint) {
+ widgetSequence += ",";
+ }
+ var widget = widgets[i].id;
+ widgetSequence += widget + ":" + widgets[i].parentNode.id + ":";
+ widget = widget + "-input";
+ textlink = d.getElementById(widget).value;
+ widgetSequence += textlink;
+ firstprint = true;
+ }
+ selectLink = "sequence";
+ textlink = d.getElementById(selectLink);
+ textlink.value = widgetSequence;
+ return true;
+}
+
+function hideAllWidgets() {
+ jQuery('#niftyOutter').fadeTo('slow', 0.2);
+}
+
+function showAllWidgets() {
+ jQuery('#niftyOutter').fadeTo('slow', 1.0);
+}
+
+
+function changeTabDIV(selectedDiv) {
+ var dashpos = selectedDiv.indexOf("-");
+ var tabclass = selectedDiv.substring(0, dashpos);
+ d = document;
+
+ //get deactive tabs first
+ tabclass = tabclass + "-class-tabdeactive";
+ var tabs = document.getElementsByClassName(tabclass);
+ var incTabSelected = selectedDiv + "-deactive";
+ for (i = 0; i < tabs.length; i++) {
+ var tab = tabs[i].id;
+ dashpos = tab.lastIndexOf("-");
+ var tab2 = tab.substring(0, dashpos) + "-deactive";
+ if (tab2 == incTabSelected) {
+ tablink = d.getElementById(tab2);
+ tablink.style.display = "none";
+ tab2 = tab.substring(0, dashpos) + "-active";
+ tablink = d.getElementById(tab2);
+ tablink.style.display = "table-cell";
+
+ //now show main div associated with link clicked
+ tabmain = d.getElementById(selectedDiv);
+ tabmain.style.display = "block";
+ }
+ else
+ {
+ tab2 = tab.substring(0, dashpos) + "-deactive";
+ tablink = d.getElementById(tab2);
+ tablink.style.display = "table-cell";
+ tab2 = tab.substring(0, dashpos) + "-active";
+ tablink = d.getElementById(tab2);
+ tablink.style.display = "none";
+
+ //hide sections we don't want to see
+ tab2 = tab.substring(0, dashpos);
+ tabmain = d.getElementById(tab2);
+ tabmain.style.display = "none";
+
+ }
+ }
+}
+//]]>
+</script>
+EOD;
+
+
+## Set Page Title and Include Header
+$pgtitle = array(gettext("Status: Dashboard"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<script type="text/javascript">
+//<![CDATA[
+columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8', 'col9', 'col10'];
+//]]>
+</script>
+
+<?php
+include("fbegin.inc");
+echo $jscriptstr;
+if (!file_exists("/usr/local/www/themes/{$g['theme']}/no_big_logo")) {
+ echo "<center><img src=\"./themes/".$g['theme']."/images/logobig.jpg\" alt=\"big logo\" /></center><br />";
+}
+
+/* Print package server mismatch warning. See https://redmine.pfsense.org/issues/484 */
+if (!verify_all_package_servers()) {
+ print_info_box(package_server_mismatch_message());
+}
+
+if ($savemsg) {
+ print_info_box($savemsg);
+}
+
+pfSense_handle_custom_code("/usr/local/pkg/dashboard/pre_dashboard");
+
+?>
+<div id="widgetcontainer" style="display:none">
+ <div id="content1"><h1><?=gettext("Available Widgets"); ?></h1><p><?php
+ $widgetfiles_add = $widgetfiles;
+ sort($widgetfiles_add);
+ foreach ($widgetfiles_add as $widget) {
+ if (!stristr($widget, "widget.php")) {
+ continue;
+ }
+
+ $periodpos = strpos($widget, ".");
+ $widgetname = substr($widget, 0, $periodpos);
+ $nicename = $widgetname;
+ $nicename = str_replace("_", " ", $nicename);
+ //make the title look nice
+ $nicename = ucwords($nicename);
+
+ $widgettitle = $widgetname . "_title";
+ $widgettitlelink = $widgetname . "_title_link";
+ if ($$widgettitle != "") {
+ //echo widget title
+ ?>
+ <span style="cursor: pointer;" onclick='return addWidget("<?php echo $widgetname; ?>")'>
+ <u><?php echo $$widgettitle; ?></u></span><br />
+ <?php
+ } else {
+ ?>
+ <span style="cursor: pointer;" onclick='return addWidget("<?php echo $widgetname; ?>")'>
+ <u><?php echo $nicename; ?></u></span><br /><?php
+ }
+ }
+ ?>
+ </p>
+ </div>
+</div>
+
+<div id="welcomecontainer" style="display:none">
+ <div id="welcome-container">
+ <div style="float:left;width:100%;padding: 2px">
+ <h1><?=gettext("Welcome to the Dashboard page"); ?>!</h1>
+ </div>
+ <div onclick="domTT_close(this);showAllWidgets();" style="width:87%; position: absolute; cursor:pointer; padding: 10px;" >
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_close.gif" alt="close" style="float:right" />
+ </div>
+ <div style="clear:both;">
+ </div>
+ <p>
+ <?=gettext("This page allows you to customize the information you want to be displayed!");?><br />
+ <?=gettext("To get started click the");?> <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="plus" /> <?=gettext("icon to add widgets.");?><br />
+ <br />
+ <?=gettext("You can move any widget around by clicking and dragging the title.");?>
+ </p>
+ </div>
+</div>
+
+<form action="index.php" method="post">
+ <input type="hidden" value="" name="sequence" id="sequence" />
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="<?=gettext("Click here to add widgets"); ?>" style="cursor: pointer;" onmouseup="domTT_activate(this, event, 'content', document.getElementById('content1'), 'type', 'velcro', 'delay', 0, 'fade', 'both', 'fadeMax', 100, 'styleClass', 'niceTitle');" />
+
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_info_pkg.gif" alt="<?=gettext("Click here for help"); ?>" style="cursor: help;" onmouseup="hideAllWidgets();domTT_activate(this, event, 'content', document.getElementById('welcome-container'), 'type', 'sticky', 'closeLink', '', 'delay', 0, 'fade', 'both', 'fadeMax', 100, 'styleClass', 'niceTitle');" />
+
+&nbsp;&nbsp;&nbsp;
+ <input id="submit" name="submit" type="submit" style="display:none" onclick="return updatePref();" class="formbtn" value="<?=gettext("Save Settings");?>" />
+</form>
+<!-- fakeClass contains no CSS but is used as an identifier in theme pfsense_ng_fs - loader.js -->
+<div id="niftyOutter" class="fakeClass">
+ <?php
+ $totalwidgets = count($widgetfiles);
+ $halftotal = $totalwidgets / 2 - 2;
+ $widgetcounter = 0;
+ $directory = "/usr/local/www/widgets/widgets/";
+ $printed = false;
+ $firstprint = false;
+ ?>
+ <div id="col1" style="float:left;width:49%;padding-bottom:40px" class="ui-sortable">
+ <?php
+
+ foreach ($widgetlist as $widget) {
+
+ if (!stristr($widget, "widget.php")) {
+ continue;
+ }
+ $periodpos = strpos($widget, ".");
+ $widgetname = substr($widget, 0, $periodpos);
+ if ($widgetname != "") {
+ $nicename = $widgetname;
+ $nicename = str_replace("_", " ", $nicename);
+
+ //make the title look nice
+ $nicename = ucwords($nicename);
+ }
+
+ if ($config['widgets'] && $pconfig['sequence'] != "") {
+ switch ($displayarray[$widgetcounter]) {
+ case "show":
+ $divdisplay = "block";
+ $display = "block";
+ $inputdisplay = "show";
+ $showWidget = "none";
+ $mindiv = "inline";
+ break;
+ case "hide":
+ $divdisplay = "block";
+ $display = "none";
+ $inputdisplay = "hide";
+ $showWidget = "inline";
+ $mindiv = "none";
+ break;
+ case "close":
+ $divdisplay = "none";
+ $display = "block";
+ $inputdisplay = "close";
+ $showWidget = "none";
+ $mindiv = "inline";
+ break;
+ default:
+ $divdisplay = "none";
+ $display = "block";
+ $inputdisplay = "none";
+ $showWidget = "none";
+ $mindiv = "inline";
+ break;
+ }
+ } else {
+ if ($firstprint == false) {
+ $divdisplay = "block";
+ $display = "block";
+ $inputdisplay = "show";
+ $showWidget = "none";
+ $mindiv = "inline";
+ $firstprint = true;
+ } else {
+ switch ($widget) {
+ case "interfaces.widget.php":
+ case "traffic_graphs.widget.php":
+ $divdisplay = "block";
+ $display = "block";
+ $inputdisplay = "show";
+ $showWidget = "none";
+ $mindiv = "inline";
+ break;
+ default:
+ $divdisplay = "none";
+ $display = "block";
+ $inputdisplay = "close";
+ $showWidget = "none";
+ $mindiv = "inline";
+ break;
+ }
+ }
+ }
+
+ if (substr($g['theme'], -3) != "_fs") {
+ if ($config['widgets'] && $pconfig['sequence'] != "") {
+ if ($colpos[$widgetcounter] == "col2" && $printed == false) {
+ $printed = true;
+ ?>
+ </div>
+ <div id="col2" style="float:right;width:49%;padding-bottom:40px" class="ui-sortable">
+ <?php
+ }
+ } else if ($widgetcounter >= $halftotal && $printed == false) {
+ $printed = true;
+ ?>
+ </div>
+ <div id="col2" style="float:right;width:49%;padding-bottom:40px" class="ui-sortable">
+ <?php
+ }
+ } else {
+ if ($config['widgets'] && $pconfig['sequence'] != "") {
+ if ($colpos[$widgetcounter] == "col2" && $printed == false) {
+ $printed = true;
+ ?>
+ </div>
+ <div id="col2" style="float:right;width:49%;padding-bottom:40px" class="ui-sortable">
+ <?php
+ } else { ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ var colpos = "<?=$colpos[$widgetcounter]?>";
+ createColumn(colpos);
+ //]]>
+ </script>
+ <?php }
+ }
+ }
+
+ ?>
+ <div style="clear:both;"></div>
+ <div id="<?php echo $widgetname;?>-container" class="widgetdiv" style="display:<?php echo $divdisplay; ?>;">
+ <input type="hidden" value="<?php echo $inputdisplay;?>" id="<?php echo $widgetname;?>-container-input" name="<?php echo $widgetname;?>-container-input" />
+ <div id="<?php echo $widgetname;?>-topic" class="widgetheader" style="cursor:move">
+ <div style="float:left;">
+ <?php
+
+ $widgettitle = $widgetname . "_title";
+ $widgettitlelink = $widgetname . "_title_link";
+ if ($$widgettitle != "") {
+ //only show link if defined
+ if ($$widgettitlelink != "") {?>
+ <u><span onclick="location.href='/<?php echo $$widgettitlelink;?>'" style="cursor:pointer">
+ <?php }
+ //echo widget title
+ echo $$widgettitle;
+ if ($$widgettitlelink != "") { ?>
+ </span></u>
+ <?php }
+ } else {
+ if ($$widgettitlelink != "") {?>
+ <u><span onclick="location.href='/<?php echo $$widgettitlelink;?>'" style="cursor:pointer">
+ <?php }
+ echo $nicename;
+ if ($$widgettitlelink != "") { ?>
+ </span></u>
+ <?php }
+ }
+ ?>
+ </div>
+ <div align="right" style="float:right;">
+ <div id="<?php echo $widgetname;?>-configure" onclick='return configureWidget("<?php echo $widgetname;?>")' style="display:none; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_configure.gif" alt="configure" /></div>
+ <div id="<?php echo $widgetname;?>-open" onclick='return showWidget("<?php echo $widgetname;?>", true)' style="display:<?php echo $showWidget;?>; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_open.gif" alt="open" /></div>
+ <div id="<?php echo $widgetname;?>-min" onclick='return minimizeWidget("<?php echo $widgetname;?>", true)' style="display:<?php echo $mindiv;?>; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_minus.gif" alt="minimize" /></div>
+ <div id="<?php echo $widgetname;?>-close" onclick='return closeWidget("<?php echo $widgetname;?>", true)' style="display:inline; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_close.gif" alt="close" /></div>
+ </div>
+ <div style="clear:both;"></div>
+ </div>
+ <?php if ($divdisplay != "block") { ?>
+ <div id="<?php echo $widgetname;?>-loader" style="display:<?php echo $display; ?>;" align="center">
+ <br />
+ <img src="./themes/<?= $g['theme']; ?>/images/misc/widget_loader.gif" width="25" height="25" alt="<?=gettext("Loading selected widget"); ?>..." />
+ <br />
+ </div> <?php $display = "none"; } ?>
+ <div id="<?php echo $widgetname;?>" style="display:<?php echo $display; ?>;">
+ <?php
+ if ($divdisplay == "block") {
+ include($directory . $widget);
+ }
+ ?>
+ </div>
+ <div style="clear:both;"></div>
+ </div>
+ <?php
+ $widgetcounter++;
+
+ }//end foreach
+ ?>
+ </div>
+ <div style="clear:both;"></div>
+</div>
+
+<?php include("fend.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+ jQuery(document).ready(function(in_event)
+ {
+ jQuery('.ui-sortable').sortable({connectWith: '.ui-sortable', dropOnEmpty: true, handle: '.widgetheader', change: showSave});
+
+ <?php if (!$config['widgets'] && $pconfig['sequence'] != "") { ?>
+ hideAllWidgets();
+ domTT_activate('welcome1', null, 'x', 287, 'y', 107, 'content', document.getElementById('welcome-container'), 'type', 'sticky', 'closeLink', '', 'delay', 1000, 'fade', 'both', 'fadeMax', 100, 'styleClass', 'niceTitle');
+ <?php } ?>
+ });
+//]]>
+</script>
+<?php
+ //build list of javascript include files
+ $jsincludefiles = array();
+ $directory = "widgets/javascript/";
+ $dirhandle = opendir($directory);
+ $filename = "";
+ while (false !== ($filename = readdir($dirhandle))) {
+ $jsincludefiles[] = $filename;
+ }
+ foreach ($jsincludefiles as $jsincludename) {
+ if (!preg_match('/\.js$/', $jsincludename)) {
+ continue;
+ }
+ echo "<script src='{$directory}{$jsincludename}' type='text/javascript'></script>\n";
+ }
+?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces.php b/src/usr/local/www/interfaces.php
new file mode 100644
index 0000000..760d386
--- /dev/null
+++ b/src/usr/local/www/interfaces.php
@@ -0,0 +1,3882 @@
+<?php
+/* $Id$ */
+/*
+ interfaces.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2008 Scott Ullrich
+ Copyright (C) 2006 Daniel S. Haischt.
+ Copyright (C) 2008-2010 Ermal Luçi
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/sbin/arp
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces
+##|*NAME=Interfaces: WAN page
+##|*DESCR=Allow access to the 'Interfaces' page.
+##|*MATCH=interfaces.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("ipsec.inc");
+require_once("functions.inc");
+require_once("captiveportal.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("rrd.inc");
+require_once("vpn.inc");
+require_once("xmlparse_attr.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces.php');
+}
+
+// Get configured interface list
+$ifdescrs = get_configured_interface_with_descr(false, true);
+
+$if = "wan";
+if ($_REQUEST['if']) {
+ $if = $_REQUEST['if'];
+}
+
+if (empty($ifdescrs[$if])) {
+ header("Location: interfaces.php");
+ exit;
+}
+
+define("CRON_MONTHLY_PATTERN", "0 0 1 * *");
+define("CRON_WEEKLY_PATTERN", "0 0 * * 0");
+define("CRON_DAILY_PATTERN", "0 0 * * *");
+define("CRON_HOURLY_PATTERN", "0 * * * *");
+
+if (!is_array($pconfig)) {
+ $pconfig = array();
+}
+
+if (!is_array($config['ppps'])) {
+ $config['ppps'] = array();
+}
+if (!is_array($config['ppps']['ppp'])) {
+ $config['ppps']['ppp'] = array();
+}
+$a_ppps = &$config['ppps']['ppp'];
+
+function remove_bad_chars($string) {
+ return preg_replace('/[^a-z_0-9]/i', '', $string);
+}
+
+if (!is_array($config['gateways']['gateway_item'])) {
+ $config['gateways']['gateway_item'] = array();
+}
+$a_gateways = &$config['gateways']['gateway_item'];
+
+$wancfg = &$config['interfaces'][$if];
+$old_wancfg = $wancfg;
+$old_wancfg['realif'] = get_real_interface($if);
+$old_ppps = $a_ppps;
+// Populate page descr if it does not exist.
+if ($if == "wan" && !$wancfg['descr']) {
+ $wancfg['descr'] = "WAN";
+} else if ($if == "lan" && !$wancfg['descr']) {
+ $wancfg['descr'] = "LAN";
+}
+
+/* NOTE: The code here is used to set the $pppid for the curious */
+foreach ($a_ppps as $pppid => $ppp) {
+ if ($wancfg['if'] == $ppp['if']) {
+ break;
+ }
+}
+
+$type_disabled = (substr($wancfg['if'], 0, 3) == 'gre') ? 'disabled="disabled"' : '';
+
+if ($wancfg['if'] == $a_ppps[$pppid]['if']) {
+ $pconfig['pppid'] = $pppid;
+ $pconfig['ptpid'] = $a_ppps[$pppid]['ptpid'];
+ $pconfig['port'] = $a_ppps[$pppid]['ports'];
+ if ($a_ppps[$pppid]['type'] == "ppp") {
+ $pconfig['ppp_username'] = $a_ppps[$pppid]['username'];
+ $pconfig['ppp_password'] = base64_decode($a_ppps[$pppid]['password']);
+
+ $pconfig['phone'] = $a_ppps[$pppid]['phone'];
+ $pconfig['apn'] = $a_ppps[$pppid]['apn'];
+ } else if ($a_ppps[$pppid]['type'] == "pppoe") {
+ $pconfig['pppoe_username'] = $a_ppps[$pppid]['username'];
+ $pconfig['pppoe_password'] = base64_decode($a_ppps[$pppid]['password']);
+ $pconfig['provider'] = $a_ppps[$pppid]['provider'];
+ $pconfig['pppoe_dialondemand'] = isset($a_ppps[$pppid]['ondemand']);
+ $pconfig['pppoe_idletimeout'] = $a_ppps[$pppid]['idletimeout'];
+
+ /* ================================================ */
+ /* = force a connection reset at a specific time? = */
+ /* ================================================ */
+
+ if (isset($a_ppps[$pppid]['pppoe-reset-type'])) {
+ $pconfig['pppoe-reset-type'] = $a_ppps[$pppid]['pppoe-reset-type'];
+ $itemhash = getMPDCRONSettings($a_ppps[$pppid]['if']);
+ if ($itemhash) {
+ $cronitem = $itemhash['ITEM'];
+ }
+ if (isset($cronitem)) {
+ $resetTime = "{$cronitem['minute']} {$cronitem['hour']} {$cronitem['mday']} {$cronitem['month']} {$cronitem['wday']}";
+ } else {
+ $resetTime = NULL;
+ }
+ //log_error("ResetTime:".$resetTime);
+ if ($a_ppps[$pppid]['pppoe-reset-type'] == "custom") {
+ if ($cronitem) {
+ $pconfig['pppoe_pr_custom'] = true;
+ $pconfig['pppoe_resetminute'] = $cronitem['minute'];
+ $pconfig['pppoe_resethour'] = $cronitem['hour'];
+ if ($cronitem['mday'] <> "*" && $cronitem['month'] <> "*") {
+ $pconfig['pppoe_resetdate'] = "{$cronitem['month']}/{$cronitem['mday']}/" . date("Y");
+ }
+ }
+ } else if ($a_ppps[$pppid]['pppoe-reset-type'] == "preset") {
+ $pconfig['pppoe_pr_preset'] = true;
+ switch ($resetTime) {
+ case CRON_MONTHLY_PATTERN:
+ $pconfig['pppoe_monthly'] = true;
+ break;
+ case CRON_WEEKLY_PATTERN:
+ $pconfig['pppoe_weekly'] = true;
+ break;
+ case CRON_DAILY_PATTERN:
+ $pconfig['pppoe_daily'] = true;
+ break;
+ case CRON_HOURLY_PATTERN:
+ $pconfig['pppoe_hourly'] = true;
+ break;
+ }
+ }
+ } // End force pppoe reset at specific time
+ // End if type == pppoe
+ } else if ($a_ppps[$pppid]['type'] == "pptp" || $a_ppps[$pppid]['type'] == "l2tp") {
+ $pconfig['pptp_username'] = $a_ppps[$pppid]['username'];
+ $pconfig['pptp_password'] = base64_decode($a_ppps[$pppid]['password']);
+ $pconfig['pptp_local'] = explode(",", $a_ppps[$pppid]['localip']);
+ $pconfig['pptp_subnet'] = explode(",", $a_ppps[$pppid]['subnet']);
+ $pconfig['pptp_remote'] = explode(",", $a_ppps[$pppid]['gateway']);
+ $pconfig['pptp_dialondemand'] = isset($a_ppps[$pppid]['ondemand']);
+ $pconfig['pptp_idletimeout'] = $a_ppps[$pppid]['timeout'];
+ }
+} else {
+ $pconfig['ptpid'] = interfaces_ptpid_next();
+ $pppid = count($a_ppps);
+}
+$pconfig['dhcphostname'] = $wancfg['dhcphostname'];
+$pconfig['alias-address'] = $wancfg['alias-address'];
+$pconfig['alias-subnet'] = $wancfg['alias-subnet'];
+$pconfig['dhcprejectfrom'] = $wancfg['dhcprejectfrom'];
+
+$pconfig['adv_dhcp_pt_timeout'] = $wancfg['adv_dhcp_pt_timeout'];
+$pconfig['adv_dhcp_pt_retry'] = $wancfg['adv_dhcp_pt_retry'];
+$pconfig['adv_dhcp_pt_select_timeout'] = $wancfg['adv_dhcp_pt_select_timeout'];
+$pconfig['adv_dhcp_pt_reboot'] = $wancfg['adv_dhcp_pt_reboot'];
+$pconfig['adv_dhcp_pt_backoff_cutoff'] = $wancfg['adv_dhcp_pt_backoff_cutoff'];
+$pconfig['adv_dhcp_pt_initial_interval'] = $wancfg['adv_dhcp_pt_initial_interval'];
+
+$pconfig['adv_dhcp_pt_values'] = $wancfg['adv_dhcp_pt_values'];
+
+$pconfig['adv_dhcp_send_options'] = $wancfg['adv_dhcp_send_options'];
+$pconfig['adv_dhcp_request_options'] = $wancfg['adv_dhcp_request_options'];
+$pconfig['adv_dhcp_required_options'] = $wancfg['adv_dhcp_required_options'];
+$pconfig['adv_dhcp_option_modifiers'] = $wancfg['adv_dhcp_option_modifiers'];
+
+$pconfig['adv_dhcp_config_advanced'] = $wancfg['adv_dhcp_config_advanced'];
+$pconfig['adv_dhcp_config_file_override'] = $wancfg['adv_dhcp_config_file_override'];
+$pconfig['adv_dhcp_config_file_override_path'] = $wancfg['adv_dhcp_config_file_override_path'];
+
+$pconfig['adv_dhcp6_interface_statement_send_options'] = $wancfg['adv_dhcp6_interface_statement_send_options'];
+$pconfig['adv_dhcp6_interface_statement_request_options'] = $wancfg['adv_dhcp6_interface_statement_request_options'];
+$pconfig['adv_dhcp6_interface_statement_information_only_enable'] = $wancfg['adv_dhcp6_interface_statement_information_only_enable'];
+$pconfig['adv_dhcp6_interface_statement_script'] = $wancfg['adv_dhcp6_interface_statement_script'];
+
+$pconfig['adv_dhcp6_id_assoc_statement_address_enable'] = $wancfg['adv_dhcp6_id_assoc_statement_address_enable'];
+$pconfig['adv_dhcp6_id_assoc_statement_address'] = $wancfg['adv_dhcp6_id_assoc_statement_address'];
+$pconfig['adv_dhcp6_id_assoc_statement_address_id'] = $wancfg['adv_dhcp6_id_assoc_statement_address_id'];
+$pconfig['adv_dhcp6_id_assoc_statement_address_pltime'] = $wancfg['adv_dhcp6_id_assoc_statement_address_pltime'];
+$pconfig['adv_dhcp6_id_assoc_statement_address_vltime'] = $wancfg['adv_dhcp6_id_assoc_statement_address_vltime'];
+
+$pconfig['adv_dhcp6_id_assoc_statement_prefix_enable'] = $wancfg['adv_dhcp6_id_assoc_statement_prefix_enable'];
+$pconfig['adv_dhcp6_id_assoc_statement_prefix'] = $wancfg['adv_dhcp6_id_assoc_statement_prefix'];
+$pconfig['adv_dhcp6_id_assoc_statement_prefix_id'] = $wancfg['adv_dhcp6_id_assoc_statement_prefix_id'];
+$pconfig['adv_dhcp6_id_assoc_statement_prefix_pltime'] = $wancfg['adv_dhcp6_id_assoc_statement_prefix_pltime'];
+$pconfig['adv_dhcp6_id_assoc_statement_prefix_vltime'] = $wancfg['adv_dhcp6_id_assoc_statement_prefix_vltime'];
+
+$pconfig['adv_dhcp6_prefix_interface_statement_sla_id'] = $wancfg['adv_dhcp6_prefix_interface_statement_sla_id'];
+$pconfig['adv_dhcp6_prefix_interface_statement_sla_len'] = $wancfg['adv_dhcp6_prefix_interface_statement_sla_len'];
+
+$pconfig['adv_dhcp6_authentication_statement_authname'] = $wancfg['adv_dhcp6_authentication_statement_authname'];
+$pconfig['adv_dhcp6_authentication_statement_protocol'] = $wancfg['adv_dhcp6_authentication_statement_protocol'];
+$pconfig['adv_dhcp6_authentication_statement_algorithm'] = $wancfg['adv_dhcp6_authentication_statement_algorithm'];
+$pconfig['adv_dhcp6_authentication_statement_rdm'] = $wancfg['adv_dhcp6_authentication_statement_rdm'];
+
+$pconfig['adv_dhcp6_key_info_statement_keyname'] = $wancfg['adv_dhcp6_key_info_statement_keyname'];
+$pconfig['adv_dhcp6_key_info_statement_realm'] = $wancfg['adv_dhcp6_key_info_statement_realm'];
+$pconfig['adv_dhcp6_key_info_statement_keyid'] = $wancfg['adv_dhcp6_key_info_statement_keyid'];
+$pconfig['adv_dhcp6_key_info_statement_secret'] = $wancfg['adv_dhcp6_key_info_statement_secret'];
+$pconfig['adv_dhcp6_key_info_statement_expire'] = $wancfg['adv_dhcp6_key_info_statement_expire'];
+
+$pconfig['adv_dhcp6_config_advanced'] = $wancfg['adv_dhcp6_config_advanced'];
+$pconfig['adv_dhcp6_config_file_override'] = $wancfg['adv_dhcp6_config_file_override'];
+$pconfig['adv_dhcp6_config_file_override_path'] = $wancfg['adv_dhcp6_config_file_override_path'];
+
+$pconfig['dhcp_plus'] = isset($wancfg['dhcp_plus']);
+$pconfig['descr'] = remove_bad_chars($wancfg['descr']);
+$pconfig['enable'] = isset($wancfg['enable']);
+
+if (is_array($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $alias) {
+ if ($alias['name'] == $wancfg['descr']) {
+ $input_errors[] = sprintf(gettext("Sorry, an alias with the name %s already exists."), $wancfg['descr']);
+ }
+ }
+}
+
+switch ($wancfg['ipaddr']) {
+ case "dhcp":
+ $pconfig['type'] = "dhcp";
+ break;
+ case "pppoe":
+ case "pptp":
+ case "l2tp":
+ case "ppp":
+ $pconfig['type'] = $wancfg['ipaddr'];
+ break;
+ default:
+ if (is_ipaddrv4($wancfg['ipaddr'])) {
+ $pconfig['type'] = "staticv4";
+ $pconfig['ipaddr'] = $wancfg['ipaddr'];
+ $pconfig['subnet'] = $wancfg['subnet'];
+ $pconfig['gateway'] = $wancfg['gateway'];
+ } else {
+ $pconfig['type'] = "none";
+ }
+ break;
+}
+
+switch ($wancfg['ipaddrv6']) {
+ case "slaac":
+ $pconfig['type6'] = "slaac";
+ break;
+ case "dhcp6":
+ $pconfig['dhcp6-duid'] = $wancfg['dhcp6-duid'];
+ if (!isset($wancfg['dhcp6-ia-pd-len'])) {
+ $wancfg['dhcp6-ia-pd-len'] = "none";
+ }
+ $pconfig['dhcp6-ia-pd-len'] = $wancfg['dhcp6-ia-pd-len'];
+ $pconfig['dhcp6-ia-pd-send-hint'] = isset($wancfg['dhcp6-ia-pd-send-hint']);
+ $pconfig['type6'] = "dhcp6";
+ $pconfig['dhcp6prefixonly'] = isset($wancfg['dhcp6prefixonly']);
+ $pconfig['dhcp6usev4iface'] = isset($wancfg['dhcp6usev4iface']);
+ break;
+ case "6to4":
+ $pconfig['type6'] = "6to4";
+ break;
+ case "track6":
+ $pconfig['type6'] = "track6";
+ $pconfig['track6-interface'] = $wancfg['track6-interface'];
+ if ($wancfg['track6-prefix-id'] == "") {
+ $pconfig['track6-prefix-id'] = 0;
+ } else {
+ $pconfig['track6-prefix-id'] = $wancfg['track6-prefix-id'];
+ }
+ $pconfig['track6-prefix-id--hex'] = sprintf("%x", $pconfig['track6-prefix-id']);
+ break;
+ case "6rd":
+ $pconfig['prefix-6rd'] = $wancfg['prefix-6rd'];
+ if ($wancfg['prefix-6rd-v4plen'] == "") {
+ $wancfg['prefix-6rd-v4plen'] = "0";
+ }
+ $pconfig['prefix-6rd-v4plen'] = $wancfg['prefix-6rd-v4plen'];
+ $pconfig['type6'] = "6rd";
+ $pconfig['gateway-6rd'] = $wancfg['gateway-6rd'];
+ break;
+ default:
+ if (is_ipaddrv6($wancfg['ipaddrv6'])) {
+ $pconfig['type6'] = "staticv6";
+ $pconfig['ipaddrv6'] = $wancfg['ipaddrv6'];
+ $pconfig['subnetv6'] = $wancfg['subnetv6'];
+ $pconfig['gatewayv6'] = $wancfg['gatewayv6'];
+ } else {
+ $pconfig['type6'] = "none";
+ }
+ break;
+}
+
+// print_r($pconfig);
+
+$pconfig['blockpriv'] = isset($wancfg['blockpriv']);
+$pconfig['blockbogons'] = isset($wancfg['blockbogons']);
+$pconfig['spoofmac'] = $wancfg['spoofmac'];
+$pconfig['mtu'] = $wancfg['mtu'];
+$pconfig['mss'] = $wancfg['mss'];
+
+/* Wireless interface? */
+if (isset($wancfg['wireless'])) {
+ /* Sync first to be sure it displays the actual settings that will be used */
+ interface_sync_wireless_clones($wancfg, false);
+ /* Get wireless modes */
+ $wlanif = get_real_interface($if);
+ if (!does_interface_exist($wlanif)) {
+ interface_wireless_clone($wlanif, $wancfg);
+ }
+ $wlanbaseif = interface_get_wireless_base($wancfg['if']);
+ preg_match("/^(.*?)([0-9]*)$/", $wlanbaseif, $wlanbaseif_split);
+ $wl_modes = get_wireless_modes($if);
+ $wl_chaninfo = get_wireless_channel_info($if);
+ $wl_sysctl_prefix = 'dev.' . $wlanbaseif_split[1] . '.' . $wlanbaseif_split[2];
+ $wl_sysctl = get_sysctl(
+ array(
+ "{$wl_sysctl_prefix}.diversity",
+ "{$wl_sysctl_prefix}.txantenna",
+ "{$wl_sysctl_prefix}.rxantenna",
+ "{$wl_sysctl_prefix}.slottime",
+ "{$wl_sysctl_prefix}.acktimeout",
+ "{$wl_sysctl_prefix}.ctstimeout"));
+ $wl_regdomain_xml_attr = array();
+ $wl_regdomain_xml = parse_xml_regdomain($wl_regdomain_xml_attr);
+ $wl_regdomains = &$wl_regdomain_xml['regulatory-domains']['rd'];
+ $wl_regdomains_attr = &$wl_regdomain_xml_attr['regulatory-domains']['rd'];
+ $wl_countries = &$wl_regdomain_xml['country-codes']['country'];
+ $wl_countries_attr = &$wl_regdomain_xml_attr['country-codes']['country'];
+ $pconfig['persistcommonwireless'] = isset($config['wireless']['interfaces'][$wlanbaseif]);
+ $pconfig['standard'] = $wancfg['wireless']['standard'];
+ $pconfig['mode'] = $wancfg['wireless']['mode'];
+ $pconfig['protmode'] = $wancfg['wireless']['protmode'];
+ $pconfig['ssid'] = $wancfg['wireless']['ssid'];
+ $pconfig['channel'] = $wancfg['wireless']['channel'];
+ $pconfig['txpower'] = $wancfg['wireless']['txpower'];
+ $pconfig['diversity'] = $wancfg['wireless']['diversity'];
+ $pconfig['txantenna'] = $wancfg['wireless']['txantenna'];
+ $pconfig['rxantenna'] = $wancfg['wireless']['rxantenna'];
+ $pconfig['distance'] = $wancfg['wireless']['distance'];
+ $pconfig['regdomain'] = $wancfg['wireless']['regdomain'];
+ $pconfig['regcountry'] = $wancfg['wireless']['regcountry'];
+ $pconfig['reglocation'] = $wancfg['wireless']['reglocation'];
+ $pconfig['wme_enable'] = isset($wancfg['wireless']['wme']['enable']);
+ if (isset($wancfg['wireless']['puren']['enable'])) {
+ $pconfig['puremode'] = '11n';
+ } else if (isset($wancfg['wireless']['pureg']['enable'])) {
+ $pconfig['puremode'] = '11g';
+ } else {
+ $pconfig['puremode'] = 'any';
+ }
+ $pconfig['apbridge_enable'] = isset($wancfg['wireless']['apbridge']['enable']);
+ $pconfig['authmode'] = $wancfg['wireless']['authmode'];
+ $pconfig['hidessid_enable'] = isset($wancfg['wireless']['hidessid']['enable']);
+ $pconfig['auth_server_addr'] = $wancfg['wireless']['auth_server_addr'];
+ $pconfig['auth_server_port'] = $wancfg['wireless']['auth_server_port'];
+ $pconfig['auth_server_shared_secret'] = $wancfg['wireless']['auth_server_shared_secret'];
+ $pconfig['auth_server_addr2'] = $wancfg['wireless']['auth_server_addr2'];
+ $pconfig['auth_server_port2'] = $wancfg['wireless']['auth_server_port2'];
+ $pconfig['auth_server_shared_secret2'] = $wancfg['wireless']['auth_server_shared_secret2'];
+ if (is_array($wancfg['wireless']['wpa'])) {
+ $pconfig['debug_mode'] = $wancfg['wireless']['wpa']['debug_mode'];
+ $pconfig['macaddr_acl'] = $wancfg['wireless']['wpa']['macaddr_acl'];
+ $pconfig['mac_acl_enable'] = isset($wancfg['wireless']['wpa']['mac_acl_enable']);
+ $pconfig['auth_algs'] = $wancfg['wireless']['wpa']['auth_algs'];
+ $pconfig['wpa_mode'] = $wancfg['wireless']['wpa']['wpa_mode'];
+ $pconfig['wpa_key_mgmt'] = $wancfg['wireless']['wpa']['wpa_key_mgmt'];
+ $pconfig['wpa_pairwise'] = $wancfg['wireless']['wpa']['wpa_pairwise'];
+ $pconfig['wpa_group_rekey'] = $wancfg['wireless']['wpa']['wpa_group_rekey'];
+ $pconfig['wpa_gmk_rekey'] = $wancfg['wireless']['wpa']['wpa_gmk_rekey'];
+ $pconfig['wpa_strict_rekey'] = isset($wancfg['wireless']['wpa']['wpa_strict_rekey']);
+ $pconfig['passphrase'] = $wancfg['wireless']['wpa']['passphrase'];
+ $pconfig['ieee8021x'] = isset($wancfg['wireless']['wpa']['ieee8021x']['enable']);
+ $pconfig['rsn_preauth'] = isset($wancfg['wireless']['wpa']['rsn_preauth']);
+ $pconfig['ext_wpa_sw'] = $wancfg['wireless']['wpa']['ext_wpa_sw'];
+ $pconfig['wpa_enable'] = isset($wancfg['wireless']['wpa']['enable']);
+ }
+ $pconfig['wep_enable'] = isset($wancfg['wireless']['wep']['enable']);
+ $pconfig['mac_acl'] = $wancfg['wireless']['mac_acl'];
+ if (is_array($wancfg['wireless']['wep']) && is_array($wancfg['wireless']['wep']['key'])) {
+ $i = 1;
+ foreach ($wancfg['wireless']['wep']['key'] as $wepkey) {
+ $pconfig['key' . $i] = $wepkey['value'];
+ if (isset($wepkey['txkey'])) {
+ $pconfig['txkey'] = $i;
+ }
+ $i++;
+ }
+ if (!isset($wepkey['txkey'])) {
+ $pconfig['txkey'] = 1;
+ }
+ }
+}
+
+if ($_POST['apply']) {
+ unset($input_errors);
+ if (!is_subsystem_dirty('interfaces')) {
+ $input_errors[] = gettext("You have already applied your settings!");
+ } else {
+ unlink_if_exists("{$g['tmp_path']}/config.cache");
+ clear_subsystem_dirty('interfaces');
+
+ if (file_exists("{$g['tmp_path']}/.interfaces.apply")) {
+ $toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.interfaces.apply"));
+ foreach ($toapplylist as $ifapply => $ifcfgo) {
+ if (isset($config['interfaces'][$ifapply]['enable'])) {
+ interface_bring_down($ifapply, false, $ifcfgo);
+ interface_configure($ifapply, true);
+ } else {
+ interface_bring_down($ifapply, true, $ifcfgo);
+ if (isset($config['dhcpd'][$ifapply]['enable']) ||
+ isset($config['dhcpdv6'][$ifapply]['enable'])) {
+ services_dhcpd_configure();
+ }
+ }
+ }
+ }
+ /* restart snmp so that it binds to correct address */
+ services_snmpd_configure();
+
+ /* sync filter configuration */
+ setup_gateways_monitor();
+
+ clear_subsystem_dirty('interfaces');
+
+ filter_configure();
+
+ enable_rrd_graphing();
+
+ if (is_subsystem_dirty('staticroutes') && (system_routing_configure() == 0)) {
+ clear_subsystem_dirty('staticroutes');
+ }
+ }
+ @unlink("{$g['tmp_path']}/.interfaces.apply");
+ header("Location: interfaces.php?if={$if}");
+ exit;
+} else if ($_POST && $_POST['enable'] != "yes") {
+ unset($wancfg['enable']);
+ if (isset($wancfg['wireless'])) {
+ interface_sync_wireless_clones($wancfg, false);
+ }
+ write_config("Interface {$_POST['descr']}({$if}) is now disabled.");
+ mark_subsystem_dirty('interfaces');
+ if (file_exists("{$g['tmp_path']}/.interfaces.apply")) {
+ $toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.interfaces.apply"));
+ } else {
+ $toapplylist = array();
+ }
+ $toapplylist[$if]['ifcfg'] = $wancfg;
+ $toapplylist[$if]['ppps'] = $a_ppps;
+ /* we need to be able remove IP aliases for IPv6 */
+ file_put_contents("{$g['tmp_path']}/.interfaces.apply", serialize($toapplylist));
+ header("Location: interfaces.php?if={$if}");
+ exit;
+} else if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (is_numeric("0x" . $_POST['track6-prefix-id--hex'])) {
+ $pconfig['track6-prefix-id'] = intval($_POST['track6-prefix-id--hex'], 16);
+ } else {
+ $pconfig['track6-prefix-id'] = 0;
+ }
+ conf_mount_rw();
+
+ /* filter out spaces from descriptions */
+ $_POST['descr'] = remove_bad_chars($_POST['descr']);
+
+ /* okay first of all, cause we are just hiding the PPPoE HTML
+ * fields related to PPPoE resets, we are going to unset $_POST
+ * vars, if the reset feature should not be used. Otherwise the
+ * data validation procedure below, may trigger a false error
+ * message.
+ */
+ if (empty($_POST['pppoe-reset-type'])) {
+ unset($_POST['pppoe_pr_type']);
+ unset($_POST['pppoe_resethour']);
+ unset($_POST['pppoe_resetminute']);
+ unset($_POST['pppoe_resetdate']);
+ unset($_POST['pppoe_pr_preset_val']);
+ }
+ /* description unique? */
+ foreach ($ifdescrs as $ifent => $ifdescr) {
+ if ($if != $ifent && $ifdescr == $_POST['descr']) {
+ $input_errors[] = gettext("An interface with the specified description already exists.");
+ break;
+ }
+ }
+ if (is_numeric($_POST['descr'])) {
+ $input_errors[] = gettext("The interface description cannot contain only numbers.");
+ }
+ /* input validation */
+ if (isset($config['dhcpd']) && isset($config['dhcpd'][$if]['enable']) && (!preg_match("/^staticv4/", $_POST['type']))) {
+ $input_errors[] = gettext("The DHCP Server is active on this interface and it can be used only with a static IP configuration. Please disable the DHCP Server service on this interface first, then change the interface configuration.");
+ }
+ if (isset($config['dhcpdv6']) && isset($config['dhcpdv6'][$if]['enable']) && (!preg_match("/^staticv6/", $_POST['type6']))) {
+ $input_errors[] = gettext("The DHCP6 Server is active on this interface and it can be used only with a static IPv6 configuration. Please disable the DHCPv6 Server service on this interface first, then change the interface configuration.");
+ }
+
+ switch (strtolower($_POST['type'])) {
+ case "staticv4":
+ $reqdfields = explode(" ", "ipaddr subnet gateway");
+ $reqdfieldsn = array(gettext("IPv4 address"), gettext("Subnet bit count"), gettext("Gateway"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ break;
+ case "none":
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if (is_ipaddrv4($vip['subnet']) && $vip['interface'] == $if) {
+ $input_errors[] = gettext("This interface is referenced by IPv4 VIPs. Please delete those before setting the interface to 'none' configuration.");
+ }
+ }
+ }
+ break;
+ case "ppp":
+ $reqdfields = explode(" ", "port phone");
+ $reqdfieldsn = array(gettext("Modem Port"), gettext("Phone Number"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ break;
+ case "pppoe":
+ if ($_POST['pppoe_dialondemand']) {
+ $reqdfields = explode(" ", "pppoe_username pppoe_password pppoe_dialondemand pppoe_idletimeout");
+ $reqdfieldsn = array(gettext("PPPoE username"), gettext("PPPoE password"), gettext("Dial on demand"), gettext("Idle timeout value"));
+ } else {
+ $reqdfields = explode(" ", "pppoe_username pppoe_password");
+ $reqdfieldsn = array(gettext("PPPoE username"), gettext("PPPoE password"));
+ }
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ break;
+ case "pptp":
+ if ($_POST['pptp_dialondemand']) {
+ $reqdfields = explode(" ", "pptp_username pptp_password pptp_local pptp_subnet pptp_remote pptp_dialondemand pptp_idletimeout");
+ $reqdfieldsn = array(gettext("PPTP username"), gettext("PPTP password"), gettext("PPTP local IP address"), gettext("PPTP subnet"), gettext("PPTP remote IP address"), gettext("Dial on demand"), gettext("Idle timeout value"));
+ } else {
+ $reqdfields = explode(" ", "pptp_username pptp_password pptp_local pptp_subnet pptp_remote");
+ $reqdfieldsn = array(gettext("PPTP username"), gettext("PPTP password"), gettext("PPTP local IP address"), gettext("PPTP subnet"), gettext("PPTP remote IP address"));
+ }
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ break;
+ case "l2tp":
+ if ($_POST['pptp_dialondemand']) {
+ $reqdfields = explode(" ", "pptp_username pptp_password pptp_remote pptp_dialondemand pptp_idletimeout");
+ $reqdfieldsn = array(gettext("L2TP username"), gettext("L2TP password"), gettext("L2TP remote IP address"), gettext("Dial on demand"), gettext("Idle timeout value"));
+ } else {
+ $reqdfields = explode(" ", "pptp_username pptp_password pptp_remote");
+ $reqdfieldsn = array(gettext("L2TP username"), gettext("L2TP password"), gettext("L2TP remote IP address"));
+ }
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ break;
+ }
+ switch (strtolower($_POST['type6'])) {
+ case "staticv6":
+ $reqdfields = explode(" ", "ipaddrv6 subnetv6 gatewayv6");
+ $reqdfieldsn = array(gettext("IPv6 address"), gettext("Subnet bit count"), gettext("Gateway"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ break;
+ case "none":
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if (is_ipaddrv6($vip['subnet']) && $vip['interface'] == $if) {
+ $input_errors[] = gettext("This interface is referenced by IPv6 VIPs. Please delete those before setting the interface to 'none' configuration.");
+ }
+ }
+ }
+ break;
+ case "dhcp6":
+ if (in_array($wancfg['ipaddrv6'], array())) {
+ $input_errors[] = sprintf(gettext("You have to reassign the interface to be able to configure as %s."), $_POST['type6']);
+ }
+ if ($_POST['dhcp6-ia-pd-send-hint'] && strtolower($_POST['dhcp6-ia-pd-len']) == 'none') {
+ $input_errors[] = gettext('DHCPv6 Prefix Delegation size must be provided when Send IPv6 prefix hint flag is checked');
+ }
+ break;
+ case "6rd":
+ foreach ($ifdescrs as $ifent => $ifdescr) {
+ if ($if != $ifent && ($config[interfaces][$ifent]['ipaddrv6'] == $_POST['type6'])) {
+ if ($config[interfaces][$ifent]['prefix-6rd'] == $_POST['prefix-6rd']) {
+ $input_errors[] = gettext("You can only have one interface configured in 6rd with same prefix.");
+ break;
+ }
+ }
+ }
+ if (in_array($wancfg['ipaddrv6'], array())) {
+ $input_errors[] = sprintf(gettext("You have to reassign the interface to be able to configure as %s."), $_POST['type6']);
+ }
+ break;
+ case "6to4":
+ foreach ($ifdescrs as $ifent => $ifdescr) {
+ if ($if != $ifent && ($config[interfaces][$ifent]['ipaddrv6'] == $_POST['type6'])) {
+ $input_errors[] = sprintf(gettext("You can only have one interface configured as 6to4."), $_POST['type6']);
+ break;
+ }
+ }
+ if (in_array($wancfg['ipaddrv6'], array())) {
+ $input_errors[] = sprintf(gettext("You have to reassign the interface to be able to configure as %s."), $_POST['type6']);
+ }
+ break;
+ case "track6":
+ /* needs to check if $track6-prefix-id is used on another interface */
+ if (in_array($wancfg['ipaddrv6'], array())) {
+ $input_errors[] = sprintf(gettext("You have to reassign the interface to be able to configure as %s."), $_POST['type6']);
+ }
+
+ if ($_POST['track6-prefix-id--hex'] != "" && !is_numeric("0x" . $_POST['track6-prefix-id--hex'])) {
+ $input_errors[] = gettext("You must enter a valid hexadecimal number for the IPv6 prefix ID.");
+ } else {
+ $track6_prefix_id = intval($_POST['track6-prefix-id--hex'], 16);
+ if ($track6_prefix_id < 0 || $track6_prefix_id > $_POST['ipv6-num-prefix-ids-' . $_POST['track6-interface']]) {
+ $input_errors[] = gettext("You specified an IPv6 prefix ID that is out of range.") .
+ " ({$_POST['track6-interface']}) - (0) - (" . sprintf('%x', $_POST['ipv6-num-prefix-ids-' . $_POST['track6-interface']]) . ")";
+ } else {
+ foreach ($ifdescrs as $ifent => $ifdescr) {
+ if ($if == $ifent) {
+ continue;
+ }
+ if ($config['interfaces'][$ifent]['ipaddrv6'] == 'track6' &&
+ $config['interfaces'][$ifent]['track6-interface'] == $_POST['track6-interface'] &&
+ $config['interfaces'][$ifent]['track6-prefix-id'] == $track6_prefix_id) {
+ $input_errors[] = sprintf(gettext("This track6 prefix ID is already being used in %s."), $ifdescr);
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ /* normalize MAC addresses - lowercase and convert Windows-ized hyphenated MACs to colon delimited */
+ $staticroutes = get_staticroutes(true);
+ $_POST['spoofmac'] = strtolower(str_replace("-", ":", $_POST['spoofmac']));
+ if ($_POST['ipaddr']) {
+ if (!is_ipaddrv4($_POST['ipaddr'])) {
+ $input_errors[] = gettext("A valid IPv4 address must be specified.");
+ } else {
+ $where_ipaddr_configured = where_is_ipaddr_configured($_POST['ipaddr'], $if, true, true, $_POST['subnet']);
+ if (count($where_ipaddr_configured)) {
+ $subnet_conflict_text = sprintf(gettext("IPv4 address %s is being used by or overlaps with:"), $_POST['ipaddr'] . "/" . $_POST['subnet']);
+ foreach ($where_ipaddr_configured as $subnet_conflict) {
+ $subnet_conflict_text .= " " . convert_friendly_interface_to_friendly_descr($subnet_conflict['if']) . " (" . $subnet_conflict['ip_or_subnet'] . ")";
+ }
+ $input_errors[] = $subnet_conflict_text;
+ }
+
+ /* Do not accept network or broadcast address, except if subnet is 31 or 32 */
+ if ($_POST['subnet'] < 31) {
+ if ($_POST['ipaddr'] == gen_subnet($_POST['ipaddr'], $_POST['subnet'])) {
+ $input_errors[] = gettext("This IPv4 address is the network address and cannot be used");
+ } else if ($_POST['ipaddr'] == gen_subnet_max($_POST['ipaddr'], $_POST['subnet'])) {
+ $input_errors[] = gettext("This IPv4 address is the broadcast address and cannot be used");
+ }
+ }
+
+ foreach ($staticroutes as $route_subnet) {
+ list($network, $subnet) = explode("/", $route_subnet);
+ if ($_POST['subnet'] == $subnet && $network == gen_subnet($_POST['ipaddr'], $_POST['subnet'])) {
+ $input_errors[] = gettext("This IPv4 address conflicts with a Static Route.");
+ break;
+ }
+ unset($network, $subnet);
+ }
+ }
+ }
+ if ($_POST['ipaddrv6']) {
+ if (!is_ipaddrv6($_POST['ipaddrv6'])) {
+ $input_errors[] = gettext("A valid IPv6 address must be specified.");
+ } else {
+ $where_ipaddr_configured = where_is_ipaddr_configured($_POST['ipaddrv6'], $if, true, true, $_POST['subnetv6']);
+ if (count($where_ipaddr_configured)) {
+ $subnet_conflict_text = sprintf(gettext("IPv6 address %s is being used by or overlaps with:"), $_POST['ipaddrv6'] . "/" . $_POST['subnetv6']);
+ foreach ($where_ipaddr_configured as $subnet_conflict) {
+ $subnet_conflict_text .= " " . convert_friendly_interface_to_friendly_descr($subnet_conflict['if']) . " (" . $subnet_conflict['ip_or_subnet'] . ")";
+ }
+ $input_errors[] = $subnet_conflict_text;
+ }
+
+ foreach ($staticroutes as $route_subnet) {
+ list($network, $subnet) = explode("/", $route_subnet);
+ if ($_POST['subnetv6'] == $subnet && $network == gen_subnetv6($_POST['ipaddrv6'], $_POST['subnetv6'])) {
+ $input_errors[] = gettext("This IPv6 address conflicts with a Static Route.");
+ break;
+ }
+ unset($network, $subnet);
+ }
+ }
+ }
+ if (($_POST['subnet'] && !is_numeric($_POST['subnet']))) {
+ $input_errors[] = gettext("A valid subnet bit count must be specified.");
+ }
+ if (($_POST['subnetv6'] && !is_numeric($_POST['subnetv6']))) {
+ $input_errors[] = gettext("A valid subnet bit count must be specified.");
+ }
+ if (($_POST['alias-address'] && !is_ipaddrv4($_POST['alias-address']))) {
+ $input_errors[] = gettext("A valid alias IP address must be specified.");
+ }
+ if (($_POST['alias-subnet'] && !is_numeric($_POST['alias-subnet']))) {
+ $input_errors[] = gettext("A valid alias subnet bit count must be specified.");
+ }
+ if ($_POST['dhcprejectfrom'] && !is_ipaddrv4($_POST['dhcprejectfrom'])) {
+ $input_errors[] = gettext("A valid alias IP address must be specified to reject DHCP Leases from.");
+ }
+ if (($_POST['gateway'] != "none") || ($_POST['gatewayv6'] != "none")) {
+ $match = false;
+ foreach ($a_gateways as $gateway) {
+ if (in_array($_POST['gateway'], $gateway)) {
+ $match = true;
+ }
+ }
+ foreach ($a_gateways as $gateway) {
+ if (in_array($_POST['gatewayv6'], $gateway)) {
+ $match = true;
+ }
+ }
+ if (!$match) {
+ $input_errors[] = gettext("A valid gateway must be specified.");
+ }
+ }
+ if (($_POST['provider'] && !is_domain($_POST['provider']))) {
+ $input_errors[] = gettext("The service name contains invalid characters.");
+ }
+ if (($_POST['pppoe_idletimeout'] != "") && !is_numericint($_POST['pppoe_idletimeout'])) {
+ $input_errors[] = gettext("The idle timeout value must be an integer.");
+ }
+ if ($_POST['pppoe_resethour'] <> "" && !is_numericint($_POST['pppoe_resethour']) &&
+ $_POST['pppoe_resethour'] >= 0 && $_POST['pppoe_resethour'] <=23) {
+ $input_errors[] = gettext("A valid PPPoE reset hour must be specified (0-23).");
+ }
+ if ($_POST['pppoe_resetminute'] <> "" && !is_numericint($_POST['pppoe_resetminute']) &&
+ $_POST['pppoe_resetminute'] >= 0 && $_POST['pppoe_resetminute'] <=59) {
+ $input_errors[] = gettext("A valid PPPoE reset minute must be specified (0-59).");
+ }
+ if ($_POST['pppoe_resetdate'] <> "" && !is_numeric(str_replace("/", "", $_POST['pppoe_resetdate']))) {
+ $input_errors[] = gettext("A valid PPPoE reset date must be specified (mm/dd/yyyy).");
+ }
+ if (($_POST['pptp_local'] && !is_ipaddrv4($_POST['pptp_local']))) {
+ $input_errors[] = gettext("A valid PPTP local IP address must be specified.");
+ }
+ if (($_POST['pptp_subnet'] && !is_numeric($_POST['pptp_subnet']))) {
+ $input_errors[] = gettext("A valid PPTP subnet bit count must be specified.");
+ }
+ if (($_POST['pptp_remote'] && !is_ipaddrv4($_POST['pptp_remote']) && !is_hostname($_POST['gateway'][$iface]))) {
+ $input_errors[] = gettext("A valid PPTP remote IP address must be specified.");
+ }
+ if (($_POST['pptp_idletimeout'] != "") && !is_numericint($_POST['pptp_idletimeout'])) {
+ $input_errors[] = gettext("The idle timeout value must be an integer.");
+ }
+ if (($_POST['spoofmac'] && !is_macaddr($_POST['spoofmac']))) {
+ $input_errors[] = gettext("A valid MAC address must be specified.");
+ }
+ if ($_POST['mtu']) {
+ if (!is_numericint($_POST['mtu'])) {
+ $input_errors[] = "MTU must be an integer.";
+ }
+ if (substr($wancfg['if'], 0, 3) == 'gif') {
+ $min_mtu = 1280;
+ $max_mtu = 8192;
+ } else {
+ $min_mtu = 576;
+ $max_mtu = 9000;
+ }
+
+ if ($_POST['mtu'] < $min_mtu || $_POST['mtu'] > $max_mtu) {
+ $input_errors[] = sprintf(gettext("The MTU must be between %d and %d bytes."), $min_mtu, $max_mtu);
+ }
+
+ unset($min_mtu, $max_mtu);
+
+ if (stristr($wancfg['if'], "_vlan")) {
+ $realhwif_array = get_parent_interface($wancfg['if']);
+ // Need code to handle MLPPP if we ever use $realhwif for MLPPP handling
+ $parent_realhwif = $realhwif_array[0];
+ $parent_if = convert_real_interface_to_friendly_interface_name($parent_realhwif);
+ if (!empty($parent_if) && !empty($config['interfaces'][$parent_if]['mtu'])) {
+ if ($_POST['mtu'] > intval($config['interfaces'][$parent_if]['mtu'])) {
+ $input_errors[] = gettext("The MTU of a VLAN cannot be greater than that of its parent interface.");
+ }
+ }
+ } else {
+ foreach ($config['interfaces'] as $idx => $ifdata) {
+ if (($idx == $if) || !preg_match('/_vlan[0-9]/', $ifdata['if'])) {
+ continue;
+ }
+
+ $realhwif_array = get_parent_interface($ifdata['if']);
+ // Need code to handle MLPPP if we ever use $realhwif for MLPPP handling
+ $parent_realhwif = $realhwif_array[0];
+
+ if ($parent_realhwif != $wancfg['if']) {
+ continue;
+ }
+
+ if (isset($ifdata['mtu']) && $ifdata['mtu'] > $_POST['mtu']) {
+ $input_errors[] = sprintf(gettext("Interface %s (VLAN) has MTU set to a larger value"), $ifdata['descr']);
+ }
+ }
+ }
+ }
+ if ($_POST['mss'] <> '') {
+ if (!is_numericint($_POST['mss']) || ($_POST['mss'] < 576 || $_POST['mss'] > 65535)) {
+ $input_errors[] = gettext("The MSS must be an integer between 576 and 65535 bytes.");
+ }
+ }
+ /* Wireless interface? */
+ if (isset($wancfg['wireless'])) {
+ $reqdfields = array("mode");
+ $reqdfieldsn = array(gettext("Mode"));
+ if ($_POST['mode'] == 'hostap') {
+ $reqdfields[] = "ssid";
+ $reqdfieldsn[] = gettext("SSID");
+ if (isset($_POST['channel']) && $_POST['channel'] == "0") {
+ // auto channel with hostap is broken, prevent this for now.
+ $input_errors[] = gettext("A specific channel, not auto, must be selected for Access Point mode.");
+ }
+ }
+ if (stristr($_POST['standard'], '11n')) {
+ if (!($_POST['wme_enable'])) {
+ $input_errors[] = gettext("802.11n standards require enabling WME.");
+ }
+ }
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ check_wireless_mode();
+ if (isset($_POST['wpa_group_rekey']) && (!is_numericint($_POST['wpa_group_rekey']) || $_POST['wpa_group_rekey'] < 1 || $_POST['wpa_group_rekey'] > 9999)) {
+ $input_errors[] = gettext("Key Rotation must be an integer between 1 and 9999.");
+ }
+ if (isset($_POST['wpa_gmk_rekey']) && (!is_numericint($_POST['wpa_gmk_rekey']) || $_POST['wpa_gmk_rekey'] < 1 || $_POST['wpa_gmk_rekey'] > 9999)) {
+ $input_errors[] = gettext("Master Key Regeneration must be an integer between 1 and 9999.");
+ }
+ if (isset($_POST['wpa_group_rekey']) && isset($_POST['wpa_gmk_rekey'])) {
+ if ($_POST['wpa_group_rekey'] > $_POST['wpa_gmk_rekey']) {
+ $input_errors[] = gettext("Master Key Regeneration must be greater than Key Rotation.");
+ }
+ }
+ if (!empty($_POST['auth_server_addr'])) {
+ if (!is_domain($_POST['auth_server_addr']) && !is_ipaddr($_POST['auth_server_addr'])) {
+ $input_errors[] = gettext("802.1X Authentication Server must be an IP or hostname.");
+ }
+ }
+ if (!empty($_POST['auth_server_addr2'])) {
+ if (!is_domain($_POST['auth_server_addr2']) && !is_ipaddr($_POST['auth_server_addr2'])) {
+ $input_errors[] = gettext("Secondary 802.1X Authentication Server must be an IP or hostname.");
+ }
+ }
+ if (!empty($_POST['auth_server_port'])) {
+ if (!is_port($_POST['auth_server_port'])) {
+ $input_errors[] = gettext("802.1X Authentication Server Port must be a valid port number (1-65535).");
+ }
+ }
+ if (!empty($_POST['auth_server_port2'])) {
+ if (!is_port($_POST['auth_server_port2'])) {
+ $input_errors[] = gettext("Secondary 802.1X Authentication Server Port must be a valid port number (1-65535).");
+ }
+ }
+ if (isset($_POST['channel']) && !is_numericint($_POST['channel'])) {
+ if (!is_numericint($_POST['channel'])) {
+ $input_errors[] = gettext("Invalid channel specified.");
+ } else {
+ if ($_POST['channel'] > 255 || $_POST['channel'] < 0) {
+ $input_errors[] = gettext("Channel must be between 0-255.");
+ }
+ }
+ }
+ if (!empty($_POST['distance']) && !is_numericint($_POST['distance'])) {
+ $input_errors[] = gettext("Distance must be an integer.");
+ }
+ if (isset($_POST['standard']) && (stristr($_POST['standard'], '11na') || stristr($_POST['standard'], '11a'))) {
+ if ($_POST['channel'] != 0 && $_POST['channel'] < 15) {
+ $input_errors[] = gettext("Channel selected is not valid for 802.11a or 802.11na.");
+ }
+ }
+ if (isset($_POST['standard']) && ($_POST['standard'] == "11b" || $_POST['standard'] == "11g")) {
+ if ($_POST['channel'] > 14) {
+ $input_errors[] = gettext("Channel selected is not valid for 802.11b or 802.11g.");
+ }
+ }
+ if (!empty($_POST['protmode']) && !in_array($_POST['protmode'], array("off", "cts", "rtscts"))) {
+ $input_errors[] = gettext("Invalid option chosen for OFDM Protection Mode");
+ }
+ /* loop through keys and enforce size */
+ for ($i = 1; $i <= 4; $i++) {
+ if ($_POST['key' . $i]) {
+ /* 64 bit */
+ if (strlen($_POST['key' . $i]) == 5) {
+ continue;
+ }
+ if (strlen($_POST['key' . $i]) == 10) {
+ /* hex key */
+ if (stristr($_POST['key' . $i], "0x") == false) {
+ $_POST['key' . $i] = "0x" . $_POST['key' . $i];
+ }
+ continue;
+ }
+ if (strlen($_POST['key' . $i]) == 12) {
+ /* hex key */
+ if (stristr($_POST['key' . $i], "0x") == false) {
+ $_POST['key' . $i] = "0x" . $_POST['key' . $i];
+ }
+ continue;
+ }
+ /* 128 bit */
+ if (strlen($_POST['key' . $i]) == 13) {
+ continue;
+ }
+ if (strlen($_POST['key' . $i]) == 26) {
+ /* hex key */
+ if (stristr($_POST['key' . $i], "0x") == false) {
+ $_POST['key' . $i] = "0x" . $_POST['key' . $i];
+ }
+ continue;
+ }
+ if (strlen($_POST['key' . $i]) == 28) {
+ continue;
+ }
+ $input_errors[] = gettext("Invalid WEP key. Enter a valid 40, 64, 104 or 128 bit WEP key.");
+ break;
+ }
+ }
+
+ if ($_POST['passphrase']) {
+ $passlen = strlen($_POST['passphrase']);
+ if ($passlen < 8 || $passlen > 63) {
+ $input_errors[] = gettext("The WPA passphrase must be between 8 and 63 characters long.");
+ }
+ }
+ if ($_POST['wpa_enable'] == "yes") {
+ if (empty($_POST['passphrase']) && stristr($_POST['wpa_key_mgmt'], "WPA-PSK")) {
+ $input_errors[] = gettext("A WPA Passphrase must be specified when WPA PSK is enabled.");
+ }
+ }
+ }
+ if (!$input_errors) {
+ if ($wancfg['ipaddr'] != $_POST['type']) {
+ if (in_array($wancfg['ipaddr'], array("ppp", "pppoe", "pptp", "l2tp"))) {
+ $wancfg['if'] = $a_ppps[$pppid]['ports'];
+ unset($a_ppps[$pppid]);
+ } else if ($wancfg['ipaddr'] == "dhcp") {
+ kill_dhclient_process($wancfg['if']);
+ }
+ if ($wancfg['ipaddrv6'] == "dhcp6") {
+ $pid = find_dhcp6c_process($wancfg['if']);
+ if ($pid) {
+ posix_kill($pid, SIGTERM);
+ }
+ }
+ }
+ $ppp = array();
+ if ($wancfg['ipaddr'] != "ppp") {
+ unset($wancfg['ipaddr']);
+ }
+ if ($wancfg['ipaddrv6'] != "ppp") {
+ unset($wancfg['ipaddrv6']);
+ }
+ unset($wancfg['subnet']);
+ unset($wancfg['gateway']);
+ unset($wancfg['subnetv6']);
+ unset($wancfg['gatewayv6']);
+ unset($wancfg['dhcphostname']);
+ unset($wancfg['dhcprejectfrom']);
+ unset($wancfg['dhcp6-duid']);
+ unset($wancfg['dhcp6-ia-pd-len']);
+ unset($wancfg['dhcp6-ia-pd-send-hint']);
+ unset($wancfg['dhcp6prefixonly']);
+ unset($wancfg['dhcp6usev4iface']);
+ unset($wancfg['track6-interface']);
+ unset($wancfg['track6-prefix-id']);
+ unset($wancfg['prefix-6rd']);
+ unset($wancfg['prefix-6rd-v4plen']);
+ unset($wancfg['gateway-6rd']);
+
+ unset($wancfg['adv_dhcp_pt_timeout']);
+ unset($wancfg['adv_dhcp_pt_retry']);
+ unset($wancfg['adv_dhcp_pt_select_timeout']);
+ unset($wancfg['adv_dhcp_pt_reboot']);
+ unset($wancfg['adv_dhcp_pt_backoff_cutoff']);
+ unset($wancfg['adv_dhcp_pt_initial_interval']);
+
+ unset($wancfg['adv_dhcp_pt_values']);
+
+ unset($wancfg['adv_dhcp_send_options']);
+ unset($wancfg['adv_dhcp_request_options']);
+ unset($wancfg['adv_dhcp_required_options']);
+ unset($wancfg['adv_dhcp_option_modifiers']);
+
+ unset($wancfg['adv_dhcp_config_advanced']);
+ unset($wancfg['adv_dhcp_config_file_override']);
+ unset($wancfg['adv_dhcp_config_file_override_path']);
+
+ unset($wancfg['adv_dhcp6_interface_statement_send_options']);
+ unset($wancfg['adv_dhcp6_interface_statement_request_options']);
+ unset($wancfg['adv_dhcp6_interface_statement_information_only_enable']);
+ unset($wancfg['adv_dhcp6_interface_statement_script']);
+
+ unset($wancfg['adv_dhcp6_id_assoc_statement_address_enable']);
+ unset($wancfg['adv_dhcp6_id_assoc_statement_address']);
+ unset($wancfg['adv_dhcp6_id_assoc_statement_address_id']);
+ unset($wancfg['adv_dhcp6_id_assoc_statement_address_pltime']);
+ unset($wancfg['adv_dhcp6_id_assoc_statement_address_vltime']);
+
+ unset($wancfg['adv_dhcp6_id_assoc_statement_prefix_enable']);
+ unset($wancfg['adv_dhcp6_id_assoc_statement_prefix']);
+ unset($wancfg['adv_dhcp6_id_assoc_statement_prefix_id']);
+ unset($wancfg['adv_dhcp6_id_assoc_statement_prefix_pltime']);
+ unset($wancfg['adv_dhcp6_id_assoc_statement_prefix_vltime']);
+
+ unset($wancfg['adv_dhcp6_prefix_interface_statement_sla_id']);
+ unset($wancfg['adv_dhcp6_prefix_interface_statement_sla_len']);
+
+ unset($wancfg['adv_dhcp6_authentication_statement_authname']);
+ unset($wancfg['adv_dhcp6_authentication_statement_protocol']);
+ unset($wancfg['adv_dhcp6_authentication_statement_algorithm']);
+ unset($wancfg['adv_dhcp6_authentication_statement_rdm']);
+
+ unset($wancfg['adv_dhcp6_key_info_statement_keyname']);
+ unset($wancfg['adv_dhcp6_key_info_statement_realm']);
+ unset($wancfg['adv_dhcp6_key_info_statement_keyid']);
+ unset($wancfg['adv_dhcp6_key_info_statement_secret']);
+ unset($wancfg['adv_dhcp6_key_info_statement_expire']);
+
+ unset($wancfg['adv_dhcp6_config_advanced']);
+ unset($wancfg['adv_dhcp6_config_file_override']);
+ unset($wancfg['adv_dhcp6_config_file_override_path']);
+
+ unset($wancfg['pppoe_password']);
+ unset($wancfg['pptp_username']);
+ unset($wancfg['pptp_password']);
+ unset($wancfg['provider']);
+ unset($wancfg['ondemand']);
+ unset($wancfg['timeout']);
+ if (empty($wancfg['pppoe']['pppoe-reset-type'])) {
+ unset($wancfg['pppoe']['pppoe-reset-type']);
+ }
+ unset($wancfg['local']);
+
+ unset($wancfg['remote']);
+ if (is_array($a_ppps[$pppid]) && in_array($wancfg['ipaddr'], array("ppp", "pppoe", "pptp", "l2tp"))) {
+ if ($wancfg['ipaddr'] != 'ppp') {
+ unset($a_ppps[$pppid]['apn']);
+ unset($a_ppps[$pppid]['phone']);
+ unset($a_ppps[$pppid]['provider']);
+ unset($a_ppps[$pppid]['ondemand']);
+ }
+ if (in_array($wancfg['ipaddr'], array("pppoe", "pptp", "l2tp"))) {
+ unset($a_ppps[$pppid]['localip']);
+ unset($a_ppps[$pppid]['subnet']);
+ unset($a_ppps[$pppid]['gateway']);
+ }
+ if ($wancfg['ipaddr'] != 'pppoe') {
+ unset($a_ppps[$pppid]['pppoe-reset-type']);
+ }
+ if ($wancfg['type'] != $_POST['type']) {
+ unset($a_ppps[$pppid]['idletimeout']);
+ }
+ }
+
+ $wancfg['descr'] = remove_bad_chars($_POST['descr']);
+ $wancfg['enable'] = $_POST['enable'] == "yes" ? true : false;
+
+ /* let return_gateways_array() do the magic on dynamic interfaces for us */
+ switch ($_POST['type']) {
+ case "staticv4":
+ $wancfg['ipaddr'] = $_POST['ipaddr'];
+ $wancfg['subnet'] = $_POST['subnet'];
+ if ($_POST['gateway'] != "none") {
+ $wancfg['gateway'] = $_POST['gateway'];
+ }
+ break;
+ case "dhcp":
+ $wancfg['ipaddr'] = "dhcp";
+ $wancfg['dhcphostname'] = $_POST['dhcphostname'];
+ $wancfg['alias-address'] = $_POST['alias-address'];
+ $wancfg['alias-subnet'] = $_POST['alias-subnet'];
+ $wancfg['dhcprejectfrom'] = $_POST['dhcprejectfrom'];
+
+ $wancfg['adv_dhcp_pt_timeout'] = $_POST['adv_dhcp_pt_timeout'];
+ $wancfg['adv_dhcp_pt_retry'] = $_POST['adv_dhcp_pt_retry'];
+ $wancfg['adv_dhcp_pt_select_timeout'] = $_POST['adv_dhcp_pt_select_timeout'];
+ $wancfg['adv_dhcp_pt_reboot'] = $_POST['adv_dhcp_pt_reboot'];
+ $wancfg['adv_dhcp_pt_backoff_cutoff'] = $_POST['adv_dhcp_pt_backoff_cutoff'];
+ $wancfg['adv_dhcp_pt_initial_interval'] = $_POST['adv_dhcp_pt_initial_interval'];
+
+ $wancfg['adv_dhcp_pt_values'] = $_POST['adv_dhcp_pt_values'];
+
+ $wancfg['adv_dhcp_send_options'] = $_POST['adv_dhcp_send_options'];
+ $wancfg['adv_dhcp_request_options'] = $_POST['adv_dhcp_request_options'];
+ $wancfg['adv_dhcp_required_options'] = $_POST['adv_dhcp_required_options'];
+ $wancfg['adv_dhcp_option_modifiers'] = $_POST['adv_dhcp_option_modifiers'];
+
+ $wancfg['adv_dhcp_config_advanced'] = $_POST['adv_dhcp_config_advanced'];
+ $wancfg['adv_dhcp_config_file_override'] = $_POST['adv_dhcp_config_file_override'];
+ $wancfg['adv_dhcp_config_file_override_path'] = $_POST['adv_dhcp_config_file_override_path'];
+
+ $wancfg['dhcp_plus'] = $_POST['dhcp_plus'] == "yes" ? true : false;
+ if ($gateway_item) {
+ $a_gateways[] = $gateway_item;
+ }
+ break;
+ case "ppp":
+ $a_ppps[$pppid]['ptpid'] = $_POST['ptpid'];
+ $a_ppps[$pppid]['type'] = $_POST['type'];
+ $a_ppps[$pppid]['if'] = $_POST['type'].$_POST['ptpid'];
+ $a_ppps[$pppid]['ports'] = $_POST['port'];
+ $a_ppps[$pppid]['username'] = $_POST['ppp_username'];
+ $a_ppps[$pppid]['password'] = base64_encode($_POST['ppp_password']);
+ $a_ppps[$pppid]['phone'] = $_POST['phone'];
+ $a_ppps[$pppid]['apn'] = $_POST['apn'];
+ $wancfg['if'] = $_POST['type'] . $_POST['ptpid'];
+ $wancfg['ipaddr'] = $_POST['type'];
+ break;
+
+ case "pppoe":
+ $a_ppps[$pppid]['ptpid'] = $_POST['ptpid'];
+ $a_ppps[$pppid]['type'] = $_POST['type'];
+ $a_ppps[$pppid]['if'] = $_POST['type'].$_POST['ptpid'];
+ if (isset($_POST['ppp_port'])) {
+ $a_ppps[$pppid]['ports'] = $_POST['ppp_port'];
+ } else {
+ $a_ppps[$pppid]['ports'] = $wancfg['if'];
+ }
+ $a_ppps[$pppid]['username'] = $_POST['pppoe_username'];
+ $a_ppps[$pppid]['password'] = base64_encode($_POST['pppoe_password']);
+ if (!empty($_POST['provider'])) {
+ $a_ppps[$pppid]['provider'] = $_POST['provider'];
+ } else {
+ $a_ppps[$pppid]['provider'] = true;
+ }
+ $a_ppps[$pppid]['ondemand'] = $_POST['pppoe_dialondemand'] ? true : false;
+ if (!empty($_POST['pppoe_idletimeout'])) {
+ $a_ppps[$pppid]['idletimeout'] = $_POST['pppoe_idletimeout'];
+ } else {
+ unset($a_ppps[$pppid]['idletimeout']);
+ }
+
+ if (!empty($_POST['pppoe-reset-type'])) {
+ $a_ppps[$pppid]['pppoe-reset-type'] = $_POST['pppoe-reset-type'];
+ } else {
+ unset($a_ppps[$pppid]['pppoe-reset-type']);
+ }
+ $wancfg['if'] = $_POST['type'].$_POST['ptpid'];
+ $wancfg['ipaddr'] = $_POST['type'];
+ if ($gateway_item) {
+ $a_gateways[] = $gateway_item;
+ }
+
+ break;
+ case "pptp":
+ case "l2tp":
+ $a_ppps[$pppid]['ptpid'] = $_POST['ptpid'];
+ $a_ppps[$pppid]['type'] = $_POST['type'];
+ $a_ppps[$pppid]['if'] = $_POST['type'].$_POST['ptpid'];
+ if (isset($_POST['ppp_port'])) {
+ $a_ppps[$pppid]['ports'] = $_POST['ppp_port'];
+ } else {
+ $a_ppps[$pppid]['ports'] = $wancfg['if'];
+ }
+ $a_ppps[$pppid]['username'] = $_POST['pptp_username'];
+ $a_ppps[$pppid]['password'] = base64_encode($_POST['pptp_password']);
+ $a_ppps[$pppid]['localip'] = $_POST['pptp_local'];
+ $a_ppps[$pppid]['subnet'] = $_POST['pptp_subnet'];
+ $a_ppps[$pppid]['gateway'] = $_POST['pptp_remote'];
+ $a_ppps[$pppid]['ondemand'] = $_POST['pptp_dialondemand'] ? true : false;
+ if (!empty($_POST['pptp_idletimeout'])) {
+ $a_ppps[$pppid]['idletimeout'] = $_POST['pptp_idletimeout'];
+ } else {
+ unset($a_ppps[$pppid]['idletimeout']);
+ }
+ $wancfg['if'] = $_POST['type'].$_POST['ptpid'];
+ $wancfg['ipaddr'] = $_POST['type'];
+ if ($gateway_item) {
+ $a_gateways[] = $gateway_item;
+ }
+ break;
+ case "none":
+ break;
+ }
+ switch ($_POST['type6']) {
+ case "staticv6":
+ $wancfg['ipaddrv6'] = $_POST['ipaddrv6'];
+ $wancfg['subnetv6'] = $_POST['subnetv6'];
+ if ($_POST['gatewayv6'] != "none") {
+ $wancfg['gatewayv6'] = $_POST['gatewayv6'];
+ }
+ break;
+ case "slaac":
+ $wancfg['ipaddrv6'] = "slaac";
+ break;
+ case "dhcp6":
+ $wancfg['ipaddrv6'] = "dhcp6";
+ $wancfg['dhcp6-duid'] = $_POST['dhcp6-duid'];
+ $wancfg['dhcp6-ia-pd-len'] = $_POST['dhcp6-ia-pd-len'];
+ if ($_POST['dhcp6-ia-pd-send-hint'] == "yes") {
+ $wancfg['dhcp6-ia-pd-send-hint'] = true;
+ }
+ if ($_POST['dhcp6prefixonly'] == "yes") {
+ $wancfg['dhcp6prefixonly'] = true;
+ }
+ if ($_POST['dhcp6usev4iface'] == "yes") {
+ $wancfg['dhcp6usev4iface'] = true;
+ }
+
+ if (!empty($_POST['adv_dhcp6_interface_statement_send_options'])) {
+ $wancfg['adv_dhcp6_interface_statement_send_options'] = $_POST['adv_dhcp6_interface_statement_send_options'];
+ }
+ if (!empty($_POST['adv_dhcp6_interface_statement_request_options'])) {
+ $wancfg['adv_dhcp6_interface_statement_request_options'] = $_POST['adv_dhcp6_interface_statement_request_options'];
+ }
+ if (isset($_POST['adv_dhcp6_interface_statement_information_only_enable'])) {
+ $wancfg['adv_dhcp6_interface_statement_information_only_enable'] = $_POST['adv_dhcp6_interface_statement_information_only_enable'];
+ }
+ if (!empty($_POST['adv_dhcp6_interface_statement_script'])) {
+ $wancfg['adv_dhcp6_interface_statement_script'] = $_POST['adv_dhcp6_interface_statement_script'];
+ }
+
+ if (isset($_POST['adv_dhcp6_id_assoc_statement_address_enable'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_address_enable'] = $_POST['adv_dhcp6_id_assoc_statement_address_enable'];
+ }
+ if (!empty($_POST['adv_dhcp6_id_assoc_statement_address'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_address'] = $_POST['adv_dhcp6_id_assoc_statement_address'];
+ }
+ if (is_numericint($_POST['adv_dhcp6_id_assoc_statement_address_id'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_address_id'] = $_POST['adv_dhcp6_id_assoc_statement_address_id'];
+ }
+ if (!empty($_POST['adv_dhcp6_id_assoc_statement_address_pltime'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_address_pltime'] = $_POST['adv_dhcp6_id_assoc_statement_address_pltime'];
+ }
+ if (!empty($_POST['adv_dhcp6_id_assoc_statement_address_vltime'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_address_vltime'] = $_POST['adv_dhcp6_id_assoc_statement_address_vltime'];
+ }
+
+ if (isset($_POST['adv_dhcp6_id_assoc_statement_prefix_enable'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_prefix_enable'] = $_POST['adv_dhcp6_id_assoc_statement_prefix_enable'];
+ }
+ if (!empty($_POST['adv_dhcp6_id_assoc_statement_prefix'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_prefix'] = $_POST['adv_dhcp6_id_assoc_statement_prefix'];
+ }
+ if (is_numericint($_POST['adv_dhcp6_id_assoc_statement_prefix_id'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_prefix_id'] = $_POST['adv_dhcp6_id_assoc_statement_prefix_id'];
+ }
+ if (!empty($_POST['adv_dhcp6_id_assoc_statement_prefix_pltime'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_prefix_pltime'] = $_POST['adv_dhcp6_id_assoc_statement_prefix_pltime'];
+ }
+ if (!empty($_POST['adv_dhcp6_id_assoc_statement_prefix_vltime'])) {
+ $wancfg['adv_dhcp6_id_assoc_statement_prefix_vltime'] = $_POST['adv_dhcp6_id_assoc_statement_prefix_vltime'];
+ }
+
+ if (is_numericint($_POST['adv_dhcp6_prefix_interface_statement_sla_id'])) {
+ $wancfg['adv_dhcp6_prefix_interface_statement_sla_id'] = $_POST['adv_dhcp6_prefix_interface_statement_sla_id'];
+ }
+ if (is_numericint($_POST['adv_dhcp6_prefix_interface_statement_sla_len'])) {
+ $wancfg['adv_dhcp6_prefix_interface_statement_sla_len'] = $_POST['adv_dhcp6_prefix_interface_statement_sla_len'];
+ }
+
+ if (!empty($_POST['adv_dhcp6_authentication_statement_authname'])) {
+ $wancfg['adv_dhcp6_authentication_statement_authname'] = $_POST['adv_dhcp6_authentication_statement_authname'];
+ }
+ if (!empty($_POST['adv_dhcp6_authentication_statement_protocol'])) {
+ $wancfg['adv_dhcp6_authentication_statement_protocol'] = $_POST['adv_dhcp6_authentication_statement_protocol'];
+ }
+ if (!empty($_POST['adv_dhcp6_authentication_statement_algorithm'])) {
+ $wancfg['adv_dhcp6_authentication_statement_algorithm'] = $_POST['adv_dhcp6_authentication_statement_algorithm'];
+ }
+ if (!empty($_POST['adv_dhcp6_authentication_statement_rdm'])) {
+ $wancfg['adv_dhcp6_authentication_statement_rdm'] = $_POST['adv_dhcp6_authentication_statement_rdm'];
+ }
+
+ if (!empty($_POST['adv_dhcp6_key_info_statement_keyname'])) {
+ $wancfg['adv_dhcp6_key_info_statement_keyname'] = $_POST['adv_dhcp6_key_info_statement_keyname'];
+ }
+ if (!empty($_POST['adv_dhcp6_key_info_statement_realm'])) {
+ $wancfg['adv_dhcp6_key_info_statement_realm'] = $_POST['adv_dhcp6_key_info_statement_realm'];
+ }
+ if (!empty($_POST['adv_dhcp6_key_info_statement_keyid'])) {
+ $wancfg['adv_dhcp6_key_info_statement_keyid'] = $_POST['adv_dhcp6_key_info_statement_keyid'];
+ }
+ if (!empty($_POST['adv_dhcp6_key_info_statement_secret'])) {
+ $wancfg['adv_dhcp6_key_info_statement_secret'] = $_POST['adv_dhcp6_key_info_statement_secret'];
+ }
+ if (!empty($_POST['adv_dhcp6_key_info_statement_expire'])) {
+ $wancfg['adv_dhcp6_key_info_statement_expire'] = $_POST['adv_dhcp6_key_info_statement_expire'];
+ }
+
+ if (!empty($_POST['adv_dhcp6_config_advanced'])) {
+ $wancfg['adv_dhcp6_config_advanced'] = $_POST['adv_dhcp6_config_advanced'];
+ }
+ if (!empty($_POST['adv_dhcp6_config_file_override'])) {
+ $wancfg['adv_dhcp6_config_file_override'] = $_POST['adv_dhcp6_config_file_override'];
+ }
+ if (!empty($_POST['adv_dhcp6_config_file_override_path'])) {
+ $wancfg['adv_dhcp6_config_file_override_path'] = $_POST['adv_dhcp6_config_file_override_path'];
+ }
+
+ if ($gateway_item) {
+ $a_gateways[] = $gateway_item;
+ }
+ break;
+ case "6rd":
+ $wancfg['ipaddrv6'] = "6rd";
+ $wancfg['prefix-6rd'] = $_POST['prefix-6rd'];
+ $wancfg['prefix-6rd-v4plen'] = $_POST['prefix-6rd-v4plen'];
+ $wancfg['gateway-6rd'] = $_POST['gateway-6rd'];
+ if ($gateway_item) {
+ $a_gateways[] = $gateway_item;
+ }
+ break;
+ case "6to4":
+ $wancfg['ipaddrv6'] = "6to4";
+ break;
+ case "track6":
+ $wancfg['ipaddrv6'] = "track6";
+ $wancfg['track6-interface'] = $_POST['track6-interface'];
+ if ($_POST['track6-prefix-id--hex'] === "") {
+ $wancfg['track6-prefix-id'] = 0;
+ } else if (is_numeric("0x" . $_POST['track6-prefix-id--hex'])) {
+ $wancfg['track6-prefix-id'] = intval($_POST['track6-prefix-id--hex'], 16);
+ } else {
+ $wancfg['track6-prefix-id'] = 0;
+ }
+ break;
+ case "none":
+ break;
+ }
+ handle_pppoe_reset($_POST);
+
+ if ($_POST['blockpriv'] == "yes") {
+ $wancfg['blockpriv'] = true;
+ } else {
+ unset($wancfg['blockpriv']);
+ }
+ if ($_POST['blockbogons'] == "yes") {
+ $wancfg['blockbogons'] = true;
+ } else {
+ unset($wancfg['blockbogons']);
+ }
+ $wancfg['spoofmac'] = $_POST['spoofmac'];
+ if (empty($_POST['mtu'])) {
+ unset($wancfg['mtu']);
+ } else {
+ $wancfg['mtu'] = $_POST['mtu'];
+ }
+ if (empty($_POST['mss'])) {
+ unset($wancfg['mss']);
+ } else {
+ $wancfg['mss'] = $_POST['mss'];
+ }
+ if (empty($_POST['mediaopt'])) {
+ unset($wancfg['media']);
+ unset($wancfg['mediaopt']);
+ } else {
+ $mediaopts = explode(' ', $_POST['mediaopt']);
+ if ($mediaopts[0] != '') {
+ $wancfg['media'] = $mediaopts[0];
+ }
+ if ($mediaopts[1] != '') {
+ $wancfg['mediaopt'] = $mediaopts[1];
+ } else {
+ unset($wancfg['mediaopt']);
+ }
+ }
+ if (isset($wancfg['wireless'])) {
+ handle_wireless_post();
+ }
+
+ conf_mount_ro();
+ write_config();
+
+ if (file_exists("{$g['tmp_path']}/.interfaces.apply")) {
+ $toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.interfaces.apply"));
+ } else {
+ $toapplylist = array();
+ }
+ $toapplylist[$if]['ifcfg'] = $old_wancfg;
+ $toapplylist[$if]['ppps'] = $old_ppps;
+ file_put_contents("{$g['tmp_path']}/.interfaces.apply", serialize($toapplylist));
+
+ mark_subsystem_dirty('interfaces');
+
+ /* regenerate cron settings/crontab file */
+ configure_cron();
+
+ header("Location: interfaces.php?if={$if}");
+ exit;
+ }
+
+} // end if ($_POST)
+
+function handle_wireless_post() {
+ global $_POST, $config, $g, $wancfg, $if, $wl_countries_attr, $wlanbaseif;
+ if (!is_array($wancfg['wireless'])) {
+ $wancfg['wireless'] = array();
+ }
+ $wancfg['wireless']['standard'] = $_POST['standard'];
+ $wancfg['wireless']['mode'] = $_POST['mode'];
+ $wancfg['wireless']['protmode'] = $_POST['protmode'];
+ $wancfg['wireless']['ssid'] = $_POST['ssid'];
+ $wancfg['wireless']['channel'] = $_POST['channel'];
+ $wancfg['wireless']['authmode'] = $_POST['authmode'];
+ $wancfg['wireless']['txpower'] = $_POST['txpower'];
+ $wancfg['wireless']['distance'] = $_POST['distance'];
+ $wancfg['wireless']['regdomain'] = $_POST['regdomain'];
+ $wancfg['wireless']['regcountry'] = $_POST['regcountry'];
+ $wancfg['wireless']['reglocation'] = $_POST['reglocation'];
+ if (!empty($wancfg['wireless']['regdomain']) && !empty($wancfg['wireless']['regcountry'])) {
+ foreach ($wl_countries_attr as $wl_country) {
+ if ($wancfg['wireless']['regcountry'] == $wl_country['ID']) {
+ $wancfg['wireless']['regdomain'] = $wl_country['rd'][0]['REF'];
+ break;
+ }
+ }
+ }
+ if (!is_array($wancfg['wireless']['wpa'])) {
+ $wancfg['wireless']['wpa'] = array();
+ }
+ $wancfg['wireless']['wpa']['macaddr_acl'] = $_POST['macaddr_acl'];
+ $wancfg['wireless']['wpa']['auth_algs'] = $_POST['auth_algs'];
+ $wancfg['wireless']['wpa']['wpa_mode'] = $_POST['wpa_mode'];
+ $wancfg['wireless']['wpa']['wpa_key_mgmt'] = $_POST['wpa_key_mgmt'];
+ $wancfg['wireless']['wpa']['wpa_pairwise'] = $_POST['wpa_pairwise'];
+ $wancfg['wireless']['wpa']['wpa_group_rekey'] = $_POST['wpa_group_rekey'];
+ $wancfg['wireless']['wpa']['wpa_gmk_rekey'] = $_POST['wpa_gmk_rekey'];
+ $wancfg['wireless']['wpa']['passphrase'] = $_POST['passphrase'];
+ $wancfg['wireless']['wpa']['ext_wpa_sw'] = $_POST['ext_wpa_sw'];
+ $wancfg['wireless']['auth_server_addr'] = $_POST['auth_server_addr'];
+ $wancfg['wireless']['auth_server_port'] = $_POST['auth_server_port'];
+ $wancfg['wireless']['auth_server_shared_secret'] = $_POST['auth_server_shared_secret'];
+ $wancfg['wireless']['auth_server_addr2'] = $_POST['auth_server_addr2'];
+ $wancfg['wireless']['auth_server_port2'] = $_POST['auth_server_port2'];
+ $wancfg['wireless']['auth_server_shared_secret2'] = $_POST['auth_server_shared_secret2'];
+
+ if ($_POST['persistcommonwireless'] == "yes") {
+ if (!is_array($config['wireless'])) {
+ $config['wireless'] = array();
+ }
+ if (!is_array($config['wireless']['interfaces'])) {
+ $config['wireless']['interfaces'] = array();
+ }
+ if (!is_array($config['wireless']['interfaces'][$wlanbaseif])) {
+ $config['wireless']['interfaces'][$wlanbaseif] = array();
+ }
+ } else if (isset($config['wireless']['interfaces'][$wlanbaseif])) {
+ unset($config['wireless']['interfaces'][$wlanbaseif]);
+ }
+ if (isset($_POST['diversity']) && is_numeric($_POST['diversity'])) {
+ $wancfg['wireless']['diversity'] = $_POST['diversity'];
+ } else if (isset($wancfg['wireless']['diversity'])) {
+ unset($wancfg['wireless']['diversity']);
+ }
+ if (isset($_POST['txantenna']) && is_numeric($_POST['txantenna'])) {
+ $wancfg['wireless']['txantenna'] = $_POST['txantenna'];
+ } else if (isset($wancfg['wireless']['txantenna'])) {
+ unset($wancfg['wireless']['txantenna']);
+ }
+ if (isset($_POST['rxantenna']) && is_numeric($_POST['rxantenna'])) {
+ $wancfg['wireless']['rxantenna'] = $_POST['rxantenna'];
+ } else if (isset($wancfg['wireless']['rxantenna'])) {
+ unset($wancfg['wireless']['rxantenna']);
+ }
+ if ($_POST['hidessid_enable'] == "yes") {
+ $wancfg['wireless']['hidessid']['enable'] = true;
+ } else if (isset($wancfg['wireless']['hidessid']['enable'])) {
+ unset($wancfg['wireless']['hidessid']['enable']);
+ }
+ if ($_POST['mac_acl_enable'] == "yes") {
+ $wancfg['wireless']['wpa']['mac_acl_enable'] = true;
+ } else if (isset($wancfg['wireless']['wpa']['mac_acl_enable'])) {
+ unset($wancfg['wireless']['wpa']['mac_acl_enable']);
+ }
+ if ($_POST['rsn_preauth'] == "yes") {
+ $wancfg['wireless']['wpa']['rsn_preauth'] = true;
+ } else {
+ unset($wancfg['wireless']['wpa']['rsn_preauth']);
+ }
+ if ($_POST['ieee8021x'] == "yes") {
+ $wancfg['wireless']['wpa']['ieee8021x']['enable'] = true;
+ } else if (isset($wancfg['wireless']['wpa']['ieee8021x']['enable'])) {
+ unset($wancfg['wireless']['wpa']['ieee8021x']['enable']);
+ }
+ if ($_POST['wpa_strict_rekey'] == "yes") {
+ $wancfg['wireless']['wpa']['wpa_strict_rekey'] = true;
+ } else if (isset($wancfg['wireless']['wpa']['wpa_strict_rekey'])) {
+ unset($wancfg['wireless']['wpa']['wpa_strict_rekey']);
+ }
+ if ($_POST['debug_mode'] == "yes") {
+ $wancfg['wireless']['wpa']['debug_mode'] = true;
+ } else if (isset($wancfg['wireless']['wpa']['debug_mode'])) {
+ sunset($wancfg['wireless']['wpa']['debug_mode']);
+ }
+ if ($_POST['wpa_enable'] == "yes") {
+ $wancfg['wireless']['wpa']['enable'] = $_POST['wpa_enable'] = true;
+ } else if (isset($wancfg['wireless']['wpa']['enable'])) {
+ unset($wancfg['wireless']['wpa']['enable']);
+ }
+ if ($_POST['wep_enable'] == "yes") {
+ if (!is_array($wancfg['wireless']['wep'])) {
+ $wancfg['wireless']['wep'] = array();
+ }
+ $wancfg['wireless']['wep']['enable'] = $_POST['wep_enable'] = true;
+ } else if (isset($wancfg['wireless']['wep'])) {
+ unset($wancfg['wireless']['wep']);
+ }
+ if ($_POST['wme_enable'] == "yes") {
+ if (!is_array($wancfg['wireless']['wme'])) {
+ $wancfg['wireless']['wme'] = array();
+ }
+ $wancfg['wireless']['wme']['enable'] = $_POST['wme_enable'] = true;
+ } else if (isset($wancfg['wireless']['wme']['enable'])) {
+ unset($wancfg['wireless']['wme']['enable']);
+ }
+ if ($_POST['puremode'] == "11g") {
+ if (!is_array($wancfg['wireless']['pureg'])) {
+ $wancfg['wireless']['pureg'] = array();
+ }
+ $wancfg['wireless']['pureg']['enable'] = true;
+ } else if ($_POST['puremode'] == "11n") {
+ if (!is_array($wancfg['wireless']['puren'])) {
+ $wancfg['wireless']['puren'] = array();
+ }
+ $wancfg['wireless']['puren']['enable'] = true;
+ } else {
+ if (isset($wancfg['wireless']['pureg'])) {
+ unset($wancfg['wireless']['pureg']);
+ }
+ if (isset($wancfg['wireless']['puren'])) {
+ unset($wancfg['wireless']['puren']);
+ }
+ }
+ if ($_POST['apbridge_enable'] == "yes") {
+ if (!is_array($wancfg['wireless']['apbridge'])) {
+ $wancfg['wireless']['apbridge'] = array();
+ }
+ $wancfg['wireless']['apbridge']['enable'] = $_POST['apbridge_enable'] = true;
+ } else if (isset($wancfg['wireless']['apbridge']['enable'])) {
+ unset($wancfg['wireless']['apbridge']['enable']);
+ }
+ if ($_POST['standard'] == "11g Turbo" || $_POST['standard'] == "11a Turbo") {
+ if (!is_array($wancfg['wireless']['turbo'])) {
+ $wancfg['wireless']['turbo'] = array();
+ }
+ $wancfg['wireless']['turbo']['enable'] = true;
+ } else if (isset($wancfg['wireless']['turbo']['enable'])) {
+ unset($wancfg['wireless']['turbo']['enable']);
+ }
+ $wancfg['wireless']['wep']['key'] = array();
+ for ($i = 1; $i <= 4; $i++) {
+ if ($_POST['key' . $i]) {
+ $newkey = array();
+ $newkey['value'] = $_POST['key' . $i];
+ if ($_POST['txkey'] == $i) {
+ $newkey['txkey'] = true;
+ }
+ $wancfg['wireless']['wep']['key'][] = $newkey;
+ }
+ }
+ interface_sync_wireless_clones($wancfg, true);
+}
+
+function check_wireless_mode() {
+ global $_POST, $config, $g, $wlan_modes, $wancfg, $if, $wlanif, $wlanbaseif, $old_wireless_mode, $input_errors;
+
+ if ($wancfg['wireless']['mode'] == $_POST['mode']) {
+ return;
+ }
+
+ if (does_interface_exist(interface_get_wireless_clone($wlanbaseif))) {
+ $clone_count = 1;
+ } else {
+ $clone_count = 0;
+ }
+ if (isset($config['wireless']['clone']) && is_array($config['wireless']['clone'])) {
+ foreach ($config['wireless']['clone'] as $clone) {
+ if ($clone['if'] == $wlanbaseif) {
+ $clone_count++;
+ }
+ }
+ }
+ if ($clone_count > 1) {
+ $old_wireless_mode = $wancfg['wireless']['mode'];
+ $wancfg['wireless']['mode'] = $_POST['mode'];
+ if (!interface_wireless_clone("{$wlanif}_", $wancfg)) {
+ $input_errors[] = sprintf(gettext("Unable to change mode to %s. You may already have the maximum number of wireless clones supported in this mode."), $wlan_modes[$wancfg['wireless']['mode']]);
+ } else {
+ mwexec("/sbin/ifconfig " . escapeshellarg($wlanif) . "_ destroy");
+ }
+ $wancfg['wireless']['mode'] = $old_wireless_mode;
+ }
+}
+
+// Find all possible media options for the interface
+$mediaopts_list = array();
+$intrealname = $config['interfaces'][$if]['if'];
+exec("/sbin/ifconfig -m $intrealname | grep \"media \"", $mediaopts);
+foreach ($mediaopts as $mediaopt) {
+ preg_match("/media (.*)/", $mediaopt, $matches);
+ if (preg_match("/(.*) mediaopt (.*)/", $matches[1], $matches1)) {
+ // there is media + mediaopt like "media 1000baseT mediaopt full-duplex"
+ array_push($mediaopts_list, $matches1[1] . " " . $matches1[2]);
+ } else {
+ // there is only media like "media 1000baseT"
+ array_push($mediaopts_list, $matches[1]);
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), $pconfig['descr']);
+$shortcut_section = "interfaces";
+
+$closehead = false;
+include("head.inc");
+$types4 = array("none" => gettext("None"), "staticv4" => gettext("Static IPv4"), "dhcp" => gettext("DHCP"), "ppp" => gettext("PPP"), "pppoe" => gettext("PPPoE"), "pptp" => gettext("PPTP"), "l2tp" => gettext("L2TP"));
+$types6 = array("none" => gettext("None"), "staticv6" => gettext("Static IPv6"), "dhcp6" => gettext("DHCP6"), "slaac" => gettext("SLAAC"), "6rd" => gettext("6rd Tunnel"), "6to4" => gettext("6to4 Tunnel"), "track6" => gettext("Track Interface"));
+
+?>
+
+<script type="text/javascript" src="/javascript/numericupdown/js/numericupdown.js"></script>
+<link href="/javascript/numericupdown/css/numericupdown.css" rel="stylesheet" type="text/css" />
+<script type="text/javascript" src="/javascript/datepicker/js/datepicker.js"></script>
+<link href="/javascript/datepicker/css/datepicker.css" rel="stylesheet" type="text/css"/>
+
+<script type="text/javascript">
+//<![CDATA[
+ function updateType(t) {
+ switch (t) {
+ case "none": {
+ jQuery('#staticv4, #dhcp, #pppoe, #pptp, #ppp').hide();
+ break;
+ }
+ case "staticv4": {
+ jQuery('#none, #dhcp, #pppoe, #pptp, #ppp').hide();
+ break;
+ }
+ case "dhcp": {
+ jQuery('#none, #staticv4, #pppoe, #pptp, #ppp').hide();
+ break;
+ }
+ case "ppp": {
+ jQuery('#none, #staticv4, #dhcp, #pptp, #pppoe').hide();
+ country_list();
+ break;
+ }
+ case "pppoe": {
+ jQuery('#none, #staticv4, #dhcp, #pptp, #ppp').hide();
+ break;
+ }
+ case "l2tp":
+ case "pptp": {
+ jQuery('#none, #staticv4, #dhcp, #pppoe, #ppp').hide();
+ jQuery('#pptp').show();
+ break;
+ }
+ }
+ if (t != "l2tp" && t != "pptp") {
+ jQuery('#'+t).show();
+ }
+ }
+ function updateTypeSix(t) {
+ if (!isNaN(t[0])) t = '_' + t;
+ switch (t) {
+ case "none": {
+ jQuery('#staticv6, #dhcp6, #_6rd, #_6to4, #track6, #slaac').hide();
+ break;
+ }
+ case "staticv6": {
+ jQuery('#none, #dhcp6, #_6rd, #_6to4, #track6, #slaac').hide();
+ break;
+ }
+ case "slaac": {
+ jQuery('#none, #staticv6, #_6rd, #_6to4, #track6, #dhcp6').hide();
+ break;
+ }
+ case "dhcp6": {
+ jQuery('#none, #staticv6, #_6rd, #_6to4, #track6, #slaac').hide();
+ break;
+ }
+ case "_6rd": {
+ jQuery('#none, #dhcp6, #staticv6, #_6to4, #track6, #slaac').hide();
+ break;
+ }
+ case "_6to4": {
+ jQuery('#none, #dhcp6, #staticv6, #_6rd, #track6, #slaac').hide();
+ break;
+ }
+ case "track6": {
+ jQuery('#none, #dhcp6, #staticv6, #_6rd, #_6to4, #slaac').hide();
+ update_track6_prefix();
+ break;
+ }
+ }
+ if (t != "l2tp" && t != "pptp") {
+ jQuery('#'+t).show();
+ }
+ }
+
+ function show_allcfg(obj) {
+ if (obj.checked) {
+ jQuery('#allcfg').show();
+ } else {
+ jQuery('#allcfg').hide();
+ }
+ }
+
+ function show_reset_settings(reset_type) {
+ if (reset_type == 'preset') {
+ jQuery('#pppoepresetwrap').show();
+ jQuery('#pppoecustomwrap').hide();
+ } else if (reset_type == 'custom') {
+ jQuery('#pppoecustomwrap').show();
+ jQuery('#pppoepresetwrap').hide();
+ } else {
+ jQuery('#pppoecustomwrap').hide();
+ jQuery('#pppoepresetwrap').hide();
+ }
+ }
+
+ function show_mon_config() {
+ jQuery("#showmonbox").html('');
+ jQuery('#showmon').css('display', 'block');
+ }
+
+ function openwindow(url) {
+ var oWin = window.open(url, "pfSensePop", "width=620,height=400,top=150,left=150");
+ if (oWin == null || typeof(oWin) == "undefined") {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ function country_list() {
+ jQuery('#country').children().remove();
+ jQuery('#provider_list').children().remove();
+ jQuery('#providerplan').children().remove();
+ jQuery.ajax("getserviceproviders.php",{
+ success: function(response) {
+ var responseTextArr = response.split("\n");
+ responseTextArr.sort();
+ responseTextArr.each( function(value) {
+ var option = new Element('option');
+ country = value.split(":");
+ option.text = country[0];
+ option.value = country[1];
+ jQuery('#country').append(option);
+ });
+ }
+ });
+ jQuery('#trcountry').css('display', "table-row");
+ }
+
+ function providers_list() {
+ jQuery('#provider_list').children().remove();
+ jQuery('#providerplan').children().remove();
+ jQuery.ajax("getserviceproviders.php",{
+ type: 'post',
+ data: {country : jQuery('#country').val()},
+ success: function(response) {
+ var responseTextArr = response.split("\n");
+ responseTextArr.sort();
+ responseTextArr.each( function(value) {
+ var option = new Element('option');
+ option.text = value;
+ option.value = value;
+ jQuery('#provider_list').append(option);
+ });
+ }
+ });
+ jQuery('#trprovider').css("display", "table-row");
+ jQuery('#trproviderplan').css("display", "none");
+ }
+
+ function providerplan_list() {
+ jQuery('#providerplan').children().remove();
+ jQuery('#providerplan').append( new Element('option') );
+ jQuery.ajax("getserviceproviders.php",{
+ type: 'post',
+ data: {country : jQuery('#country').val(), provider : jQuery('#provider_list').val()},
+ success: function(response) {
+ var responseTextArr = response.split("\n");
+ responseTextArr.sort();
+ responseTextArr.each( function(value) {
+ if (value != "") {
+ providerplan = value.split(":");
+
+ var option = new Element('option');
+ option.text = providerplan[0] + " - " + providerplan[1];
+ option.value = providerplan[1];
+ jQuery('#providerplan').append(option);
+ }
+ });
+ }
+ });
+ jQuery('#trproviderplan').css("display", "table-row");
+ }
+
+ function prefill_provider() {
+ jQuery.ajax("getserviceproviders.php",{
+ type: 'post',
+ data: {country : jQuery('#country').val(), provider : jQuery('#provider_list').val(), plan : jQuery('#providerplan').val()},
+ success: function(data, textStatus, response) {
+ var xmldoc = response.responseXML;
+ var provider = xmldoc.getElementsByTagName('connection')[0];
+ jQuery('#ppp_username').val('');
+ jQuery('#ppp_password').val('');
+ if (provider.getElementsByTagName('apn')[0].firstChild.data == "CDMA") {
+ jQuery('#phone').val('#777');
+ jQuery('#apn').val('');
+ } else {
+ jQuery('#phone').val('*99#');
+ jQuery('#apn').val(provider.getElementsByTagName('apn')[0].firstChild.data);
+ }
+ ppp_username = provider.getElementsByTagName('ppp_username')[0].firstChild.data;
+ ppp_password = provider.getElementsByTagName('ppp_password')[0].firstChild.data;
+ jQuery('#ppp_username').val(ppp_username);
+ jQuery('#ppp_password').val(ppp_password);
+ }
+ });
+ }
+
+ function update_track6_prefix() {
+ var iface = jQuery("#track6-interface").val();
+ if (iface == null) {
+ return;
+ }
+ var track6_prefix_ids = jQuery('#ipv6-num-prefix-ids-' + iface).val();
+ if (track6_prefix_ids == null) {
+ return;
+ }
+ track6_prefix_ids = parseInt(track6_prefix_ids).toString(16);
+ jQuery('#track6-prefix-id-range').html('(<b>hexadecimal</b> from 0 to ' + track6_prefix_ids + ')');
+ }
+
+//]]>
+</script>
+</head>
+ <body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+ <?php include("fbegin.inc"); ?>
+ <form action="interfaces.php" method="post" name="iform" id="iform">
+ <?php if ($input_errors) print_input_errors($input_errors); ?>
+ <?php if (is_subsystem_dirty('interfaces')): ?><p>
+ <?php print_info_box_np(sprintf(gettext("The %s configuration has been changed."), $wancfg['descr']) . "</p><p>" . gettext("You must apply the changes in order for them to take effect.") . "</p><p>" . gettext("Don't forget to adjust the DHCP Server range if needed after applying."));?></p><br />
+ <?php endif; ?>
+ <?php if ($savemsg) print_info_box($savemsg); ?>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces">
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabs">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("General configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Enable"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable'] == true) echo "checked=\"checked\""; ?> onclick="show_allcfg(this);" />
+ <strong><?=gettext("Enable Interface"); ?></strong>
+ </td>
+ </tr>
+ </table>
+ <div style="display:none;" id="allcfg">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="allcfg">
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="30" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br /><span class="vexpl"><?= gettext("Enter a description (name) for the interface here."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="middle" class="vncell"><strong><?=gettext("IPv4 Configuration Type"); ?></strong></td>
+ <td class="vtable">
+ <select name="type" onchange="updateType(this.value);" <?php echo $type_disabled; ?> class="formselect" id="type">
+ <?php
+ foreach ($types4 as $key => $opt) {
+ echo "<option onclick=\"updateType('{$key}');\"";
+ if ($key == $pconfig['type']) {
+ echo " selected=\"selected\"";
+ }
+ echo " value=\"{$key}\" >" . htmlspecialchars($opt);
+ echo "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td valign="middle" class="vncell"><strong><?=gettext("IPv6 Configuration Type"); ?></strong></td>
+ <td class="vtable">
+ <select name="type6" onchange="updateTypeSix(this.value);" <?php echo $type_disabled; ?> class="formselect" id="type6">
+ <?php
+ foreach ($types6 as $key => $opt) {
+ echo "<option onclick=\"updateTypeSix('{$key}');\"";
+ if ($key == $pconfig['type6']) {
+ echo " selected=\"selected\"";
+ }
+ echo " value=\"{$key}\" >" . htmlspecialchars($opt);
+ echo "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("MAC address"); ?></td>
+ <td class="vtable">
+ <input name="spoofmac" type="text" class="formfld unknown" id="spoofmac" size="30" value="<?=htmlspecialchars($pconfig['spoofmac']);?>" />
+ <br />
+ <?=gettext("This field can be used to modify (\"spoof\") the MAC " .
+ "address of this interface"); ?><br />
+ <?=gettext("Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx " .
+ "or leave blank"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("MTU"); ?></td>
+ <td class="vtable">
+ <input name="mtu" type="text" class="formfld unknown" id="mtu" size="8" value="<?=htmlspecialchars($pconfig['mtu']);?>" />
+ <br />
+ <?php
+ print gettext("If you leave this field blank, the adapter's default MTU will " .
+ "be used. This is typically 1500 bytes but can vary in some circumstances.");
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("MSS"); ?></td>
+ <td class="vtable">
+ <input name="mss" type="text" class="formfld unknown" id="mss" size="8" value="<?=htmlspecialchars($pconfig['mss']);?>" />
+ <br />
+ <?=gettext("If you enter a value in this field, then MSS clamping for " .
+ "TCP connections to the value entered above minus 40 (TCP/IP " .
+ "header size) will be in effect."); ?>
+ </td>
+ </tr>
+ <?php
+ if (count($mediaopts_list) > 0) {
+ $mediaopt_from_config = $config['interfaces'][$if]['media'] . ' ' . $config['interfaces'][$if]['mediaopt'];
+ echo "<tr>";
+ echo '<td valign="top" class="vncell">' . gettext("Speed and duplex") . '</td>';
+ echo '<td class="vtable">';
+ echo '<div id="showadvmediabox"';
+ if ($mediaopt_from_config != 'autoselect ' && $mediaopt_from_config != ' ') {
+ echo " style='display:none'>";
+ } else {
+ echo '>';
+ }
+ echo '<input type="button" onclick="show_advanced_media()" value="' . gettext("Advanced") . '" /> - ' . gettext("Show advanced option");
+ echo "</div>";
+ echo '<div id="showmediaadv" ';
+ if ($mediaopt_from_config == 'autoselect ' || $mediaopt_from_config == ' ') {
+ echo "style='display:none'>";
+ } else {
+ echo '>';
+ }
+ echo '<select name="mediaopt" class="formselect" id="mediaopt">';
+ print "<option value=\"\">Default (no preference, typically autoselect)</option>";
+ print "<option value=\"\">------- Media Supported by this interface -------</option>";
+ foreach ($mediaopts_list as $mediaopt) {
+ if ($mediaopt != rtrim($mediaopt_from_config)) {
+ print "<option value=\"$mediaopt\">" . gettext("$mediaopt") . "</option>";
+ } else {
+ print "<option value=\"$mediaopt\" selected=\"selected\">" . gettext("$mediaopt") . "</option>";
+ }
+ }
+ echo '</select><br />';
+ echo gettext("Here you can explicitly set speed and duplex mode for this interface. WARNING: You MUST leave this set to autoselect (automatically negotiate speed) unless the port this interface connects to has its speed and duplex forced.");
+ echo '</div>';
+ echo '</td>';
+ echo '</tr>';
+ }
+ ?>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ <tr style="display:none;" id="none">
+ <td style="display:none;"></td>
+ </tr>
+ <tr style="display:none;" id="staticv4">
+ <td colspan="2" style="padding:0px;">
+ <a name="gatewaysection"></a>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="staticv4">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Static IPv4 configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IPv4 address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="ipaddr" type="text" class="formfld unknown" id="ipaddr" size="20" value="<?=htmlspecialchars($pconfig['ipaddr']);?>" />
+ /
+ <select name="subnet" class="formselect" id="subnet">
+ <?php
+ for ($i = 32; $i > 0; $i--) {
+ echo "<option value=\"{$i}\" ";
+ if ($i == $pconfig['subnet']) {
+ echo "selected=\"selected\"";
+ }
+ echo ">" . $i . "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Upstream Gateway"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="gateway" class="formselect" id="gateway">
+ <option value="none" selected="selected"><?=gettext("None"); ?></option>
+ <?php
+ if (count($a_gateways) > 0) {
+ foreach ($a_gateways as $gateway) {
+ if (($gateway['interface'] == $if) && (is_ipaddrv4($gateway['gateway']))) {
+ ?>
+ <option value="<?=$gateway['name'];?>" <?php if ($gateway['name'] == $pconfig['gateway']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($gateway['name']) . " - " . htmlspecialchars($gateway['gateway']);?>
+ </option>
+ <?php
+ }
+ }
+ }
+ ?>
+ </select>
+ - or <strong><a onclick="show_add_gateway();" href="#gatewaysection"><?=gettext("add a new one."); ?></a></strong>
+ <br />
+ <div id='addgwbox'>
+ <?=gettext("If this interface is an Internet connection, select an existing Gateway from the list or add a new one using the link above."); ?><br />
+ <?=gettext("On local LANs the upstream gateway should be \"none\"."); ?>
+ </div>
+ <div id='notebox'>
+ </div>
+ <div id="status">
+ </div>
+ <div style="display:none" id="addgateway">
+ <p>&nbsp;</p>
+ <table border="1" class="addgatewaybox" summary="addgateway">
+ <tr>
+ <td>
+ <table class="addgatewaybox" cellpadding="1" cellspacing="1" summary="addgateway">
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2"><center><b><font color="white"><?=gettext("Add new gateway:"); ?></font></b></center></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <?php
+ if ($if == "wan" || $if == "WAN") {
+ $checked = " checked=\"checked\"";
+ }
+ ?>
+ <tr>
+ <td width="45%" align="right"><font color="white"><?=gettext("Default gateway:"); ?></font></td><td><input type="checkbox" id="defaultgw" name="defaultgw"<?=$checked?> /></td>
+ </tr>
+ <tr>
+ <td align="right"><font color="white"><?=gettext("Gateway Name:"); ?></font></td><td><input id="name" name="name" value="<?=$wancfg['descr'] . "GW"?>" /></td>
+ </tr>
+ <tr>
+ <td align="right"><font color="white"><?=gettext("Gateway IPv4:"); ?></font></td><td><input id="gatewayip" name="gatewayip" /></td>
+ </tr>
+ <tr>
+ <td align="right"><font color="white"><?=gettext("Description:"); ?></font></td><td><input id="gatewaydescr" name="gatewaydescr" /></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <center>
+ <div id='savebuttondiv'>
+ <input id="gwsave" type="button" value="<?=gettext("Save Gateway"); ?>" onclick='hide_add_gatewaysave();' />
+ <input id="gwcancel" type="button" value="<?=gettext("Cancel"); ?>" onclick='hide_add_gateway();' />
+ </div>
+ </center>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr style="display:none;" id="staticv6">
+ <td colspan="2" style="padding:0px;">
+ <a name="gatewayv6section"></a>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="staticv6">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Static IPv6 configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IPv6 address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="ipaddrv6" type="text" class="formfld unknown" id="ipaddrv6" size="28" value="<?=htmlspecialchars($pconfig['ipaddrv6']);?>" />
+ /
+ <select name="subnetv6" class="formselect" id="subnetv6">
+ <?php
+ for ($i = 128; $i > 0; $i--) {
+ echo "<option value=\"{$i}\" ";
+ if ($i == $pconfig['subnetv6']) {
+ echo "selected=\"selected\"";
+ }
+ echo ">" . $i . "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Upstream Gateway"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="gatewayv6" class="formselect" id="gatewayv6">
+ <option value="none" selected="selected"><?=gettext("None"); ?></option>
+ <?php
+ if (count($a_gateways) > 0) {
+ foreach ($a_gateways as $gateway) {
+ if (($gateway['interface'] == $if) && (is_ipaddrv6($gateway['gateway']))) {
+ ?>
+ <option value="<?=$gateway['name'];?>" <?php if ($gateway['name'] == $pconfig['gatewayv6']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($gateway['name']) . " - " . htmlspecialchars($gateway['gateway']);?>
+ </option>
+ <?php
+ }
+ }
+ }
+ ?>
+ </select>
+ - or <strong><a onclick="show_add_gateway_v6();" href="#gatewayv6section"><?=gettext("add a new one."); ?></a></strong>
+ <br />
+ <div id='addgwboxv6'>
+ <?=gettext("If this interface is an Internet connection, select an existing Gateway from the list or add a new one using the link above."); ?><br />
+ <?=gettext("On local LANs the upstream gateway should be \"none\"."); ?>
+ </div>
+ <div id='noteboxv6'>
+ </div>
+ <div id="statusv6">
+ </div>
+ <div style="display:none" id="addgatewayv6">
+ <p>&nbsp;</p>
+ <table border="1" class="addgatewaybox" summary="addgatewayv6">
+ <tr>
+ <td>
+ <table class="addgatewaybox" cellpadding="1" cellspacing="1" summary="addgatewayv6">
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2"><center><b><font color="white"><?=gettext("Add new v6 gateway:"); ?></font></b></center></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <?php
+ if ($if == "wan" || $if == "WAN") {
+ $checked = " checked=\"checked\"";
+ }
+ ?>
+ <tr>
+ <td width="45%" align="right"><font color="white"><?=gettext("Default v6 gateway:"); ?></font></td><td><input type="checkbox" id="defaultgwv6" name="defaultgwv6"<?=$checked?> /></td>
+ </tr>
+ <tr>
+ <td align="right"><font color="white"><?=gettext("Gateway Name IPv6:"); ?></font></td><td><input id="namev6" name="namev6" value="<?=$wancfg['descr'] . "GWv6"?>" /></td>
+ </tr>
+ <tr>
+ <td align="right"><font color="white"><?=gettext("Gateway IPv6:"); ?></font></td><td><input id="gatewayipv6" name="gatewayipv6" /></td>
+ </tr>
+ <tr>
+ <td align="right"><font color="white"><?=gettext("Description:"); ?></font></td><td><input id="gatewaydescrv6" name="gatewaydescrv6" /></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <center>
+ <div id='savebuttondivv6'>
+ <input id="gwsavev6" type="button" value="<?=gettext("Save Gateway"); ?>" onclick='hide_add_gatewaysave_v6();' />
+ <input id="gwcancelv6" type="button" value="<?=gettext("Cancel"); ?>" onclick='hide_add_gateway_v6();' />
+ </div>
+ </center>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr style="display:none;" id="dhcp">
+ <td colspan="2" style="padding: 0px;">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dhcp">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("DHCP client configuration &nbsp; &nbsp; " .
+ ' <input name="adv_dhcp_config_advanced" type="checkbox" id="adv_dhcp_config_advanced" value="" onclick="show_adv_dhcp_config(this)" /> ' .
+ " Advanced &nbsp; &nbsp; " .
+ ' <input name="adv_dhcp_config_file_override" type="checkbox" id="adv_dhcp_config_file_override" value="" onclick="show_adv_dhcp_config(this)" /> ' .
+ " Config File Override &nbsp; &nbsp; "); ?>
+ </td>
+ </tr>
+ <!-- Uncomment to expose DHCP+ in GUI
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Enable DHCP+"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dhcp_plus" type="checkbox" value="yes" <?php if ($pconfig['dhcp_plus'] == true) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable DHCP+L2TP or DHCP+PPTP."); ?></strong>
+ <br />
+ <?=gettext("Status changes on this interface will trigger reconfiguration (if necessary) of the associated PPTP/L2TP link."); ?>
+ </td>
+ </tr>
+ -->
+ <tr style='display:none' id="show_basic_dhcphostname">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hostname"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dhcphostname" type="text" class="formfld unknown" id="dhcphostname" size="40" value="<?=htmlspecialchars($pconfig['dhcphostname']);?>" />
+ <br />
+ <?=gettext("The value in this field is sent as the DHCP client identifier " .
+ "and hostname when requesting a DHCP lease. Some ISPs may require " .
+ "this (for client identification)."); ?>
+ </td>
+ </tr>
+ <tr style='display:none' id="show_basic_dhcpalias-address">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Alias IPv4 address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="alias-address" type="text" class="formfld unknown" id="alias-address" size="20" value="<?=htmlspecialchars($pconfig['alias-address']);?>" />
+ <select name="alias-subnet" class="formselect" id="alias-subnet">
+ <?php
+ for ($i = 32; $i > 0; $i--) {
+ echo "<option value=\"{$i}\" ";
+ if ($i == $pconfig['alias-subnet']) {
+ echo "selected=\"selected\"";
+ }
+ echo ">" . $i . "</option>";
+ }
+ ?>
+ </select>
+ <?=gettext("The value in this field is used as a fixed alias IPv4 address by the " .
+ "DHCP client."); ?>
+ </td>
+ </tr>
+ <tr style='display:none' id="show_basic_dhcprejectlease">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Reject Leases From"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dhcprejectfrom" type="text" class="formfld unknown" id="dhcprejectfrom" size="20" value="<?=htmlspecialchars($pconfig['dhcprejectfrom']);?>" />
+ <br />
+ <?=gettext("If there is a certain upstream DHCP server that should be ignored, place the IP address or subnet of the DHCP server to be ignored here."); ?>
+ <?=gettext("This is useful for rejecting leases from cable modems that offer private IPs when they lose upstream sync."); ?>
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp_protocol_timing">
+ <td width="22%" valign="top" class="vncell"><a target="_blank" href="http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#PROTOCOL_TIMING"><?=gettext("Protocol Timing"); ?></a></td>
+ <td width="48%" class="vtable">
+ Timeout: <input name="adv_dhcp_pt_timeout" type="text" class="formfld unknown" id="adv_dhcp_pt_timeout" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_timeout']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
+ Retry: <input name="adv_dhcp_pt_retry" type="text" class="formfld unknown" id="adv_dhcp_pt_retry" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_retry']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
+ Select Timeout: <input name="adv_dhcp_pt_select_timeout" type="text" class="formfld unknown" id="adv_dhcp_pt_select_timeout" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_select_timeout']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
+
+ &nbsp; &nbsp; &nbsp; &nbsp;
+ Presets: &nbsp;
+ <input name="adv_dhcp_pt_values" type="radio" value="DHCP" id="customdhcpptdhcpdefaults" onclick="customdhcpptsetvalues(this, iform);" />FreeBSD Default &nbsp;
+ <input name="adv_dhcp_pt_values" type="radio" value="Clear" id="customdhcpptclear" onclick="customdhcpptsetvalues(this, iform);" />Clear
+
+ <br />
+ Reboot: <input name="adv_dhcp_pt_reboot" type="text" class="formfld unknown" id="adv_dhcp_pt_reboot" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_reboot']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
+ Backoff Cutoff: <input name="adv_dhcp_pt_backoff_cutoff" type="text" class="formfld unknown" id="adv_dhcp_pt_backoff_cutoff" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_backoff_cutoff']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
+ Initial Interval: <input name="adv_dhcp_pt_initial_interval" type="text" class="formfld unknown" id="adv_dhcp_pt_initial_interval" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp_pt_initial_interval']);?>" onchange="customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, '');" />
+
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
+ <input name="adv_dhcp_pt_values" type="radio" value="pfSense" id="customdhcpptpfsensedefaults" onclick="customdhcpptsetvalues(this, iform);" />pfSense Default &nbsp;
+ <input name="adv_dhcp_pt_values" type="radio" value="SavedCfg" checked="checked" id="customdhcpptsavedcfg" onclick="customdhcpptsetvalues(this, iform);" />Saved Cfg
+
+ <br />
+ <?=gettext("The values in these fields are DHCP protocol timings used when requesting a lease. <br /> "); ?>
+
+ <script type="text/javascript">
+ //<![CDATA[
+ function customdhcpptcheckradiobuton(T, BUTTON) {
+ for (var i = 0; i < T.length; i++) {
+ T[i].checked = false;
+ if (T[i].value == BUTTON) T[i].checked = true;
+ }
+ T.value = BUTTON;
+ }
+
+ function customdhcpptsetvalues(T, FORM) {
+ // timeout, retry, select-timeout, reboot, backoff-cutoff, initial-interval
+ if (T.value == "DHCP") customdhcpptsetvaluesnow(T, FORM, "60", "300", "0", "10", "120", "10");
+ if (T.value == "pfSense") customdhcpptsetvaluesnow(T, FORM, "60", "15", "0", "", "", "1");
+ if (T.value == "SavedCfg") customdhcpptsetvaluesnow(T, FORM, "<?=htmlspecialchars($pconfig['adv_dhcp_pt_timeout']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_retry']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_select_timeout']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_reboot']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_backoff_cutoff']);?>", "<?=htmlspecialchars($pconfig['adv_dhcp_pt_initial_interval']);?>");
+ if (T.value == "Clear") customdhcpptsetvaluesnow(T, FORM, "", "", "", "", "", "");
+ }
+
+ function customdhcpptsetvaluesnow(T, FORM, timeout, retry, selecttimeout, reboot, backoffcutoff, initialinterval) {
+ FORM.adv_dhcp_pt_timeout.value = timeout;
+ FORM.adv_dhcp_pt_retry.value = retry;
+ FORM.adv_dhcp_pt_select_timeout.value = selecttimeout;
+ FORM.adv_dhcp_pt_reboot.value = reboot;
+ FORM.adv_dhcp_pt_backoff_cutoff.value = backoffcutoff;
+ FORM.adv_dhcp_pt_initial_interval.value = initialinterval;
+
+ FORM.adv_dhcp_pt_values.value = T.value;
+ }
+
+ <!-- Set the adv_dhcp_pt_values radio button from saved config -->
+ var RADIOBUTTON_VALUE = "<?=htmlspecialchars($pconfig['adv_dhcp_pt_values']);?>";
+ if (RADIOBUTTON_VALUE == "") RADIOBUTTON_VALUE = "SavedCfg";
+ customdhcpptcheckradiobuton(document.iform.adv_dhcp_pt_values, RADIOBUTTON_VALUE);
+ //]]>
+ </script>
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp_lease_requirements_and_requests">
+ <td width="22%" valign="top" class="vncell"><?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Lease Requirements and Requests</a>"); ?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Send</a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp-options&amp;sektion=5\">Options</a>"); ?><br />
+ <input name="adv_dhcp_send_options" type="text" class="formfld unknown" id="adv_dhcp_send_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_send_options']);?>" />
+ <br />
+ <?=gettext("The values in this field are DHCP options to be sent when requesting a DHCP lease. [option declaration [, ...]] <br />" .
+ "Value Substitutions: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />" .
+ "Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none). <br />" .
+ "Some ISPs may require certain options be or not be sent. "); ?>
+ <hr/>
+ <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Request</a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp-options&amp;sektion=5\">Options</a>"); ?><br />
+ <input name="adv_dhcp_request_options" type="text" class="formfld unknown" id="adv_dhcp_request_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_request_options']);?>" />
+ <br />
+ <?=gettext("The values in this field are DHCP option 55 to be sent when requesting a DHCP lease. [option [, ...]] <br />" .
+ "Some ISPs may require certain options be or not be requested. "); ?>
+ <hr/>
+ <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#LEASE_REQUIREMENTS_AND_REQUESTS\">Require</a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp-options&amp;sektion=5\">Options</a>"); ?><br />
+ <input name="adv_dhcp_required_options" type="text" class="formfld unknown" id="adv_dhcp_required_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_required_options']);?>" />
+ <br />
+ <?=gettext("The values in this field are DHCP options required by the client when requesting a DHCP lease. [option [, ...]] "); ?>
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp_option_modifiers">
+ <td width="22%" valign="top" class="vncell"><?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp-options&amp;sektion=5\">Option</a> <a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5#OPTION_MODIFIERS\">Modifiers</a>"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="adv_dhcp_option_modifiers" type="text" class="formfld unknown" id="adv_dhcp_option_modifiers" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_option_modifiers']);?>" />
+ <br />
+ <?=gettext("The values in this field are DHCP option modifiers applied to obtained DHCP lease. [modifier option declaration [, ...]] <br /> " .
+ "modifiers: (default, supersede, prepend, append)"); ?>
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp_config_file_override">
+ <td width="22%" valign="top" class="vncell"><?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhclient.conf&amp;sektion=5\">Configuration File</a> Override"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="adv_dhcp_config_file_override_path" type="text" class="formfld unknown" id="adv_dhcp_config_file_override_path" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp_config_file_override_path']);?>" />
+ <br />
+ <?=gettext("The value in this field is the full absolute path to a DHCP client configuration file. [/[dirname/[.../]]filename[.ext]] <br /> " .
+ "Value Substitutions in Config File: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />" .
+ "Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none). <br />" .
+ "Some ISPs may require certain options be or not be sent. "); ?>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+
+ </table>
+
+ <script type="text/javascript">
+ //<![CDATA[
+ function show_adv_dhcp_config(T) {
+
+ if (T.checked) {
+ T.value = "Selected";
+ } else {
+ T.value = "";
+ }
+
+ if (document.iform.adv_dhcp_config_file_override.checked) {
+ show_hide_adv_dhcp('none', 'none', '');
+ } else if (document.iform.adv_dhcp_config_advanced.checked) {
+ show_hide_adv_dhcp('', '', 'none');
+ } else {
+ show_hide_adv_dhcp('', 'none', 'none');
+ }
+ }
+
+ function show_hide_adv_dhcp(basic, advanced, override) {
+
+ document.getElementById("show_basic_dhcphostname").style.display = basic;
+ document.getElementById("show_basic_dhcpalias-address").style.display = basic;
+ document.getElementById("show_basic_dhcprejectlease").style.display = basic;
+
+ document.getElementById("show_adv_dhcp_protocol_timing").style.display = advanced;
+ document.getElementById("show_adv_dhcp_lease_requirements_and_requests").style.display = advanced;
+ document.getElementById("show_adv_dhcp_option_modifiers").style.display = advanced;
+
+ document.getElementById("show_adv_dhcp_config_file_override").style.display = override;
+ }
+
+ <!-- Set the adv_dhcp_config_advanced checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp_config_advanced']);?>" == "Selected") {
+ document.iform.adv_dhcp_config_advanced.checked = true;
+ }
+ show_adv_dhcp_config(document.iform.adv_dhcp_config_advanced);
+
+ <!-- Set the adv_dhcp_config_file_override checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp_config_file_override']);?>" == "Selected") {
+ document.iform.adv_dhcp_config_file_override.checked = true;
+ }
+ show_adv_dhcp_config(document.iform.adv_dhcp_config_file_override);
+ //]]>
+ </script>
+
+ </td>
+ </tr>
+ <tr style="display:none;" id="dhcp6">
+ <td colspan="2" style="padding: 0px;">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dhcp6">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("DHCP6 client configuration &nbsp; &nbsp; " .
+ ' <input name="adv_dhcp6_config_advanced" type="checkbox" id="adv_dhcp6_config_advanced" value="" onclick="show_adv_dhcp6_config(this)" /> ' .
+ " Advanced &nbsp; &nbsp; " .
+ ' <input name="adv_dhcp6_config_file_override" type="checkbox" id="adv_dhcp6_config_file_override" value="" onclick="show_adv_dhcp6_config(this)" /> ' .
+ " Config File Override &nbsp; &nbsp; "); ?>
+ </td>
+ </tr>
+ <!--- Leave commented out for now
+ <tr style='display:none' id="basicdhcp6_show_dhcp6_duid">
+ <td width="22%" valign="top" class="vncell"><?=gettext("DHCPv6 Unique Identifier (DUID)"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dhcp6-duid" type="text" class="formfld unknown" id="dhcp6-duid" size="40" value="<?=htmlspecialchars($pconfig['dhcp6-duid']);?>" />
+ <br />
+ <?=gettext("The value in this field is sent as the DHCPv6 client identifier " .
+ "when requesting a DHCPv6 lease."); ?><br />
+ <?php if (is_readable("/var/db/dhcp6c_duid")) {
+ // $current_duid = file_get_contents("/var/db/dhcp6c_duid");
+ }
+ printf(gettext("The current DUID is: '%s'"), $current_duid);
+ // hexdump -e '"%07.7_ax " 1/2 "%04x" " " 14/1 "%02x:" "\n"'
+ ?>
+ </td>
+ </tr>
+ -->
+ <tr style='display:none' id="basicdhcp6_use_pppoeinterface">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Use IPv4 connectivity as parent interface"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dhcp6usev4iface" type="checkbox" id="dhcp6usev4iface" value="yes" <?php if ($pconfig['dhcp6usev4iface'] == true) echo "checked=\"checked\""; ?> />
+ <?=gettext("Request a IPv6 prefix/information through the IPv4 connectivity link"); ?>
+ </td>
+ </tr>
+ <tr style='display:none' id="basicdhcp6_show_dhcp6_prefix_only">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Request only an IPv6 prefix"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dhcp6prefixonly" type="checkbox" id="dhcp6prefixonly" value="yes" <?php if ($pconfig['dhcp6prefixonly'] == true) echo "checked=\"checked\""; ?> />
+ <?=gettext("Only request an IPv6 prefix, do not request an IPv6 address"); ?>
+ </td>
+ </tr>
+ <tr style='display:none' id="basicdhcp6_show_dhcp6_prefix_delegation_size">
+ <td width="22%" valign="top" class="vncell"><?=gettext("DHCPv6 Prefix Delegation size"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="dhcp6-ia-pd-len" class="formselect" id="dhcp6-ia-pd-len">
+ <?php
+ $sizes = array("none" => "None", 16 => "48", 12 => "52", 8 => "56", 4 => "60", 3 => "61", 2 => "62", 1 => "63", 0 => "64");
+ foreach ($sizes as $bits => $length) {
+ echo "<option value=\"{$bits}\" ";
+ if (is_numeric($pconfig['dhcp6-ia-pd-len']) && ($bits == $pconfig['dhcp6-ia-pd-len'])) {
+ echo "selected=\"selected\"";
+ }
+ echo ">" . $length . "</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <?=gettext("The value in this field is the delegated prefix length provided by the DHCPv6 server. Normally specified by the ISP."); ?>
+ </td>
+ </tr>
+ <tr style='display:none' id="basicdhcp6_show_dhcp6_prefix_send_hint">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Send IPv6 prefix hint"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dhcp6-ia-pd-send-hint" type="checkbox" id="dhcp6-ia-pd-send-hint" value="yes" <?php if ($pconfig['dhcp6-ia-pd-send-hint'] == true) echo "checked=\"checked\""; ?> />
+ <?=gettext("Send an IPv6 prefix hint to indicate the desired prefix size for delegation"); ?>
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp6_interface_statement">
+ <td width="22%" valign="top" class="vncell">
+ <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Interface_statement\">Interface Statement</a>"); ?>
+ <br /><br />
+ <input name="adv_dhcp6_interface_statement_information_only_enable" type="checkbox" id="adv_dhcp6_interface_statement_information_only_enable" value="" onclick="show_adv_dhcp6_config(this)" />
+ <?=gettext("Information Only"); ?>
+ </td>
+ <td width="78%" class="vtable">
+ <?=gettext("Send Options"); ?><br />
+ <input name="adv_dhcp6_interface_statement_send_options" type="text" class="formfld unknown" id="adv_dhcp6_interface_statement_send_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp6_interface_statement_send_options']);?>" />
+ <br />
+ <?=gettext("The values in this field are DHCP send options to be sent when requesting a DHCP lease. [option declaration [, ...]] <br />" .
+ "Value Substitutions: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />" .
+ "Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none). <br />" .
+ "Some DHCP services may require certain options be or not be sent. "); ?>
+ <br />
+ <br />
+ <?=gettext("Request Options"); ?><br />
+ <input name="adv_dhcp6_interface_statement_request_options" type="text" class="formfld unknown" id="adv_dhcp6_interface_statement_request_options" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp6_interface_statement_request_options']);?>" />
+ <br />
+ <?=gettext("The values in this field are DHCP request options to be sent when requesting a DHCP lease. [option [, ...]] <br />" .
+ "Some DHCP services may require certain options be or not be requested. "); ?>
+ <br />
+ <br />
+ <?=gettext("Script"); ?><br />
+ <input name="adv_dhcp6_interface_statement_script" type="text" class="formfld unknown" id="adv_dhcp6_interface_statement_script" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp6_interface_statement_script']);?>" />
+ <br />
+ <?=gettext("The value in this field is the absolute path to a script invoked on certain conditions including when a reply message is received. <br />" .
+ "[/[dirname/[.../]]filename[.ext]] "); ?>
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp6_id_assoc_statement">
+ <td width="22%" valign="top" class="vncell">
+ <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Identity_association_statement\">Identity Association Statement</a>"); ?>
+ </td>
+ <td width="78%" class="vtable">
+
+ <input name="adv_dhcp6_id_assoc_statement_address_enable" type="checkbox" id="adv_dhcp6_id_assoc_statement_address_enable" value="" onclick="show_adv_dhcp6_config(this);" />
+ <?=gettext("Non-Temporary Address Allocation"); ?>
+ <div style='display:none' id="show_adv_dhcp6_id_assoc_statement_address">
+ <?=gettext("id-assoc na"); ?>
+ <?=gettext("<i>ID</i>"); ?>
+ <input name="adv_dhcp6_id_assoc_statement_address_id" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_address_id" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address_id']);?>" />
+ <br />
+ <?=gettext("Address"); ?>
+ <?=gettext("<i>ipv6-address</i>"); ?>
+ <input name="adv_dhcp6_id_assoc_statement_address" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_address" size="34" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address']);?>" />
+ <?=gettext("<i>pltime</i>"); ?>
+ <input name="adv_dhcp6_id_assoc_statement_address_pltime" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_address_pltime" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address_pltime']);?>" />
+ <?=gettext("<i>vltime</i>"); ?>
+ <input name="adv_dhcp6_id_assoc_statement_address_vltime" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_address_vltime" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address_vltime']);?>" />
+ </div>
+ <hr/>
+
+ <input name="adv_dhcp6_id_assoc_statement_prefix_enable" type="checkbox" id="adv_dhcp6_id_assoc_statement_prefix_enable" value="" onclick="show_adv_dhcp6_config(this)" />
+ <?=gettext("Prefix Delegation"); ?>
+ <div style='display:none' id="show_adv_dhcp6_id_assoc_statement_prefix">
+ <?=gettext("id-assoc pd"); ?>
+ <?=gettext("<i>ID</i>"); ?>
+ <input name="adv_dhcp6_id_assoc_statement_prefix_id" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_prefix_id" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix_id']);?>" />
+ <br />
+ <?=gettext("Prefix"); ?>
+ <?=gettext("<i>ipv6-prefix</i>"); ?>
+ <input name="adv_dhcp6_id_assoc_statement_prefix" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_prefix" size="37" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix']);?>" />
+ <?=gettext("<i>pltime</i>"); ?>
+ <input name="adv_dhcp6_id_assoc_statement_prefix_pltime" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_prefix_pltime" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix_pltime']);?>" />
+ <?=gettext("<i>vltime</i>"); ?>
+ <input name="adv_dhcp6_id_assoc_statement_prefix_vltime" type="text" class="formfld unknown" id="adv_dhcp6_id_assoc_statement_prefix_vltime" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix_vltime']);?>" />
+ </div>
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp6_prefix_interface_statement">
+ <td width="22%" valign="top" class="vncell">
+ <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Prefix_interface_statement\">Prefix Interface Statement</a>"); ?>
+ </td>
+ <td width="78%" class="vtable">
+ <?=gettext("Prefix Interface "); ?>
+ <?=gettext("<i>sla-id</i>"); ?>
+ <input name="adv_dhcp6_prefix_interface_statement_sla_id" type="text" class="formfld unknown" id="adv_dhcp6_prefix_interface_statement_sla_id" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_prefix_interface_statement_sla_id']);?>" />
+ <?=gettext("<i>sla-len</i>"); ?>
+ <input name="adv_dhcp6_prefix_interface_statement_sla_len" type="text" class="formfld unknown" id="adv_dhcp6_prefix_interface_statement_sla_len" size="3" value="<?=htmlspecialchars($pconfig['adv_dhcp6_prefix_interface_statement_sla_len']);?>" />
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp6_authentication_statement">
+ <td width="22%" valign="top" class="vncell">
+ <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Authentication_statement\">Authentication Statement</a>"); ?>
+ </td>
+ <td width="78%" class="vtable">
+ <?=gettext("<i>authname</i>"); ?>
+ <input name="adv_dhcp6_authentication_statement_authname" type="text" class="formfld unknown" id="adv_dhcp6_authentication_statement_authname" size="10" value="<?=htmlspecialchars($pconfig['adv_dhcp6_authentication_statement_authname']);?>" />
+ <?=gettext("<i>protocol</i>"); ?>
+ <input name="adv_dhcp6_authentication_statement_protocol" type="text" class="formfld unknown" id="adv_dhcp6_authentication_statement_protocol" size="6" value="<?=htmlspecialchars($pconfig['adv_dhcp6_authentication_statement_protocol']);?>" />
+ <?=gettext("<i>algorithm</i>"); ?>
+ <input name="adv_dhcp6_authentication_statement_algorithm" type="text" class="formfld unknown" id="adv_dhcp6_authentication_statement_algorithm" size="8" value="<?=htmlspecialchars($pconfig['adv_dhcp6_authentication_statement_algorithm']);?>" />
+ <?=gettext("<i>rdm</i>"); ?>
+ <input name="adv_dhcp6_authentication_statement_rdm" type="text" class="formfld unknown" id="adv_dhcp6_authentication_statement_rdm" size="9" value="<?=htmlspecialchars($pconfig['adv_dhcp6_authentication_statement_rdm']);?>" />
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp6_key_info_statement">
+ <td width="22%" valign="top" class="vncell">
+ <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports#Keyinfo_statement\">Keyinfo Statement</a>"); ?>
+ </td>
+ <td width="78%" class="vtable">
+ <?=gettext("<i>keyname</i>"); ?>
+ <input name="adv_dhcp6_key_info_statement_keyname" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_keyname" size="27" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_keyname']);?>" />
+ <?=gettext("<i>realm</i>"); ?>
+ <input name="adv_dhcp6_key_info_statement_realm" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_realm" size="37" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_realm']);?>" />
+ <br />
+ <?=gettext("<i>keyid</i>"); ?>
+ <input name="adv_dhcp6_key_info_statement_keyid" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_keyid" size="2" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_keyid']);?>" />
+ <?=gettext("<i>secret</i>"); ?>
+ <input name="adv_dhcp6_key_info_statement_secret" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_secret" size="36" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_secret']);?>" />
+ <?=gettext("<i>expire</i>"); ?>
+ <input name="adv_dhcp6_key_info_statement_expire" type="text" class="formfld unknown" id="adv_dhcp6_key_info_statement_expire" size="15" value="<?=htmlspecialchars($pconfig['adv_dhcp6_key_info_statement_expire']);?>" />
+ </td>
+ </tr>
+
+ <tr style='display:none' id="show_adv_dhcp6_config_file_override">
+ <td width="22%" valign="top" class="vncell">
+ <?=gettext("<a target=\"FreeBSD_DHCP\" href=\"http://www.freebsd.org/cgi/man.cgi?query=dhcp6c.conf&amp;sektion=5&amp;apropos=0&amp;manpath=FreeBSD+10.1-RELEASE+and+Ports\">Configuration File</a> Override"); ?>
+ </td>
+ <td width="78%" class="vtable">
+ <input name="adv_dhcp6_config_file_override_path" type="text" class="formfld unknown" id="adv_dhcp6_config_file_override_path" size="86" value="<?=htmlspecialchars($pconfig['adv_dhcp6_config_file_override_path']);?>" />
+ <br />
+ <?=gettext("The value in this field is the full absolute path to a DHCP client configuration file. [/[dirname/[.../]]filename[.ext]] <br /> " .
+ "Value Substitutions in Config File: {interface}, {hostname}, {mac_addr_asciiCD}, {mac_addr_hexCD} <br />" .
+ "Where C is U(pper) or L(ower) Case, and D is \" :-.\" Delimiter (space, colon, hyphen, or period) (omitted for none). <br />" .
+ "Some ISPs may require certain options be or not be sent. "); ?>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+
+ </table>
+
+ <script type="text/javascript">
+ //<![CDATA[
+ function show_adv_dhcp6_config(T) {
+
+ if (T.checked) {
+ T.value = "Selected";
+ } else {
+ T.value = "";
+ }
+
+ if (document.iform.adv_dhcp6_config_file_override.checked) {
+ show_hide_adv_dhcp6('none', 'none', '');
+ } else if (document.iform.adv_dhcp6_config_advanced.checked) {
+ show_hide_adv_dhcp6('none', '', 'none');
+ } else {
+ show_hide_adv_dhcp6('', 'none', 'none');
+ }
+ }
+
+ function show_hide_adv_dhcp6(basic, advanced, override) {
+
+ document.getElementById("basicdhcp6_use_pppoeinterface").style.display = basic;
+ document.getElementById("basicdhcp6_show_dhcp6_prefix_delegation_size").style.display = basic;
+ document.getElementById("basicdhcp6_show_dhcp6_prefix_send_hint").style.display = basic;
+ document.getElementById("basicdhcp6_show_dhcp6_prefix_only").style.display = basic;
+
+ document.getElementById("show_adv_dhcp6_interface_statement").style.display = advanced;
+ document.getElementById("show_adv_dhcp6_id_assoc_statement").style.display = advanced;
+
+ document.getElementById("show_adv_dhcp6_id_assoc_statement_address").style.display = 'none';
+ if (document.iform.adv_dhcp6_id_assoc_statement_address_enable.checked) {
+ document.getElementById("show_adv_dhcp6_id_assoc_statement_address").style.display = advanced;
+ }
+
+ document.getElementById("show_adv_dhcp6_id_assoc_statement_prefix").style.display = 'none';
+ document.getElementById("show_adv_dhcp6_prefix_interface_statement").style.display = 'none';
+ if (document.iform.adv_dhcp6_id_assoc_statement_prefix_enable.checked) {
+ document.getElementById("show_adv_dhcp6_id_assoc_statement_prefix").style.display = advanced;
+ document.getElementById("show_adv_dhcp6_prefix_interface_statement").style.display = advanced;
+ }
+
+ document.getElementById("show_adv_dhcp6_authentication_statement").style.display = advanced;
+ document.getElementById("show_adv_dhcp6_key_info_statement").style.display = advanced;
+
+ document.getElementById("show_adv_dhcp6_config_file_override").style.display = override;
+ }
+
+ <!-- Set the adv_dhcp6_config_advanced checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_config_advanced']);?>" == "Selected") {
+ document.iform.adv_dhcp6_config_advanced.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_config_advanced);
+
+ <!-- Set the adv_dhcp6_config_file_override checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_config_file_override']);?>" == "Selected") {
+ document.iform.adv_dhcp6_config_file_override.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_config_file_override);
+
+ <!-- Set the adv_dhcp6_interface_statement_information_only_enable checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_interface_statement_information_only_enable']);?>" == "Selected") {
+ document.iform.adv_dhcp6_interface_statement_information_only_enable.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_interface_statement_information_only_enable);
+
+ <!-- Set the adv_dhcp6_id_assoc_statement_address_enable checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_address_enable']);?>" == "Selected") {
+ document.iform.adv_dhcp6_id_assoc_statement_address_enable.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_id_assoc_statement_address_enable);
+
+ <!-- Set the adv_dhcp6_id_assoc_statement_prefix_enable checkbox from saved config -->
+ if ("<?=htmlspecialchars($pconfig['adv_dhcp6_id_assoc_statement_prefix_enable']);?>" == "Selected") {
+ document.iform.adv_dhcp6_id_assoc_statement_prefix_enable.checked = true;
+ }
+ show_adv_dhcp6_config(document.iform.adv_dhcp6_id_assoc_statement_prefix_enable);
+ //]]>
+ </script>
+
+ </td>
+ </tr>
+ <tr style="display:none;" id="_6rd">
+ <td colspan="2" style="padding: 0px;">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="6rd">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("6RD Configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("6RD prefix"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="prefix-6rd" type="text" class="formfld unknown" id="prefix-6rd" size="40" value="<?=htmlspecialchars($pconfig['prefix-6rd']);?>" />
+ <br />
+ <?=gettext("The value in this field is the 6RD IPv6 prefix assigned by your ISP. e.g. '2001:db8::/32'") ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("6RD Border Relay"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="gateway-6rd" type="text" class="formfld unknown" id="gateway-6rd" size="40" value="<?=htmlspecialchars($pconfig['gateway-6rd']);?>" />
+ <br />
+ <?=gettext("The value in this field is 6RD IPv4 gateway address assigned by your ISP") ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("6RD IPv4 Prefix length"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="prefix-6rd-v4plen" class="formselect" id="prefix-6rd-v4plen">
+ <?php
+ for ($i = 0; $i < 32; $i++) {
+ echo "<option value=\"{$i}\" ";
+ if (is_numeric($pconfig['prefix-6rd-v4plen']) && ($i == $pconfig['prefix-6rd-v4plen'])) {
+ echo "selected=\"selected\"";
+ }
+ echo ">" . $i . " bits</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <?=gettext("The value in this field is the 6RD IPv4 prefix length. Normally specified by the ISP. A value of 0 means we embed the entire IPv4 address in the 6RD prefix."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr style="display:none;" id="track6">
+ <td colspan="2" style="padding: 0px;">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="track6">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Track IPv6 Interface"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="track6-interface" id='track6-interface' class='formselect' onchange="update_track6_prefix();">
+ <?php
+ $interfaces = get_configured_interface_with_descr(false, true);
+ $dynv6ifs = array();
+ foreach ($interfaces as $iface => $ifacename) {
+ switch ($config['interfaces'][$iface]['ipaddrv6']) {
+ case "6to4":
+ case "6rd":
+ case "dhcp6":
+ $dynv6ifs[$iface] = array(
+ 'name' => $ifacename,
+ 'ipv6_num_prefix_ids' => pow(2, calculate_ipv6_delegation_length($iface)) - 1
+ );
+ break;
+ default:
+ continue;
+ }
+ }
+ $rowIndex = 0;
+ foreach ($dynv6ifs as $iface => $ifacedata) {
+ $rowIndex++;
+ echo "<option value=\"{$iface}\"";
+ if ($iface == $pconfig['track6-interface']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($ifacedata['name']) . "</option>";
+ }
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+ ?>
+ </select> <br />
+ <?php
+ foreach ($dynv6ifs as $iface => $ifacedata) {
+ echo "<input type=\"hidden\" name=\"ipv6-num-prefix-ids-{$iface}\" id=\"ipv6-num-prefix-ids-{$iface}\" value=\"{$ifacedata['ipv6_num_prefix_ids']}\">\n";
+ }
+ ?>
+ <br />
+ <?=gettext("This selects the dynamic IPv6 WAN interface to track for configuration") ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Prefix ID"); ?></td>
+ <td width="78%" class="vtable">
+ <?php
+ if ($pconfig['track6-prefix-id'] == "") {
+ $pconfig['track6-prefix-id'] = 0;
+ }
+ $track6_prefix_id_hex = sprintf("%x", $pconfig['track6-prefix-id']);
+ ?>
+ <input name="track6-prefix-id--hex" type="text" class="formfld unknown" id="track6-prefix-id--hex" size="8" value="<?= $track6_prefix_id_hex ?>" />
+ <span id="track6-prefix-id-range"></span>
+ <input type="hidden" id="track6-prefix-id-max" value="0"></input>
+ <br />
+ <?= gettext("The value in this field is the (Delegated) IPv6 prefix ID. This determines the configurable network ID based on the dynamic IPv6 connection"); ?>
+ <br />
+ <?= gettext("default value is 0."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr style="display:none;" id="ppp">
+ <td colspan="2" style="padding: 0px;">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="ppp">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("PPP configuration"); ?></td>
+ </tr>
+ <tr id="ppp_provider">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Service Provider"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="0" cellspacing="0" summary="service provider">
+ <tr id="trcountry">
+ <td><?=gettext("Country:"); ?> &nbsp;&nbsp;</td>
+ <td>
+ <select class="formselect" name="country" id="country" onchange="providers_list()">
+ <option></option>
+ </select>
+ </td>
+ </tr>
+ <tr id="trprovider" style="display:none">
+ <td><?=gettext("Provider:"); ?> &nbsp;&nbsp;</td>
+ <td>
+ <select class="formselect" name="provider_list" id="provider_list" onchange="providerplan_list()">
+ <option></option>
+ </select>
+ </td>
+ </tr>
+ <tr id="trproviderplan" style="display:none">
+ <td><?=gettext("Plan:"); ?> &nbsp;&nbsp;</td>
+ <td>
+ <select class="formselect" name="providerplan" id="providerplan" onchange="prefill_provider()">
+ <option></option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <br /><span class="vexpl"><?=gettext("Select to fill in data for your service provider."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Username"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="ppp_username" type="text" class="formfld user" id="ppp_username" size="20" value="<?=htmlspecialchars($pconfig['ppp_username']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Password"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="ppp_password" type="password" class="formfld pwd" id="ppp_password" size="20" value="<?=htmlspecialchars($pconfig['ppp_password']);?>" />
+ </td>
+ </tr>
+ <tr id="phone_num">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Phone Number"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="phone" type="text" class="formfld unknown" id="phone" size="12" value="<?=htmlspecialchars($pconfig['phone']);?>" />
+ </td>
+ </tr>
+ <tr id="apn_">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Access Point Name (APN)"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="apn" type="text" class="formfld unknown" id="apn" size="40" value="<?=htmlspecialchars($pconfig['apn']);?>" />
+ </td>
+ </tr>
+ <tr id="interface" >
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Modem Port"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="port" id="port" class="formselect">
+ <?php
+ $portlist = glob("/dev/cua*");
+ $modems = glob("/dev/modem*");
+ $portlist = array_merge($portlist, $modems);
+ $rowIndex = 0;
+ foreach ($portlist as $port) {
+ if (preg_match("/\.(lock|init)$/", $port)) {
+ continue;
+ }
+ $rowIndex++;
+ echo "<option value=\"".trim($port)."\"";
+ if ($pconfig['port'] == $port) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$port}</option>";
+ }
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Advanced PPP"); ?></td>
+ <?php if (isset($pconfig['pppid'])): ?>
+ <td width="78%" class="vtable">
+ <a href="/interfaces_ppps_edit.php?id=<?=htmlspecialchars($pconfig['pppid']);?>" class="navlnk"><?=gettext("Click here"); ?> </a>
+ <?=gettext("to edit PPP configuration."); ?>
+ </td>
+ <?php else: ?>
+ <td width="78%" class="vtable">
+ <a href="/interfaces_ppps_edit.php" class="navlnk"><?=gettext("Click here"); ?> </a>
+ <?=gettext("to create a PPP configuration."); ?>
+ </td>
+ <?php endif; ?>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr style="display:none;" id="pppoe">
+ <td colspan="2" style="padding:0px;">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="pppoe">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("PPPoE configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Username"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pppoe_username" type="text" class="formfld user" id="pppoe_username" size="20" value="<?=htmlspecialchars($pconfig['pppoe_username']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Password"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pppoe_password" type="password" class="formfld pwd" id="pppoe_password" size="20" value="<?=htmlspecialchars($pconfig['pppoe_password']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Service name"); ?></td>
+ <td width="78%" class="vtable"><input name="provider" type="text" class="formfld unknown" id="provider" size="20" value="<?=htmlspecialchars($pconfig['provider']);?>" />
+ <br /> <span class="vexpl"><?=gettext("Hint: this field can usually be left empty"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Dial on demand"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pppoe_dialondemand" type="checkbox" id="pppoe_dialondemand" value="enable" <?php if ($pconfig['pppoe_dialondemand']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable Dial-On-Demand mode"); ?></strong><br />
+ <?=gettext("This option causes the interface to operate in dial-on-demand mode, allowing you to have a "); ?><i><?=gettext("virtual full time"); ?></i> <?=gettext("connection. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Idle timeout"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pppoe_idletimeout" type="text" class="formfld unknown" id="pppoe_idletimeout" size="8" value="<?=htmlspecialchars($pconfig['pppoe_idletimeout']);?>" /> <?=gettext("seconds"); ?><br /><?=gettext("If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. An idle timeout of zero disables this feature."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Periodic reset");?></td>
+ <td width="78%" class="vtable">
+ <table id="presetwrap" cellspacing="0" cellpadding="0" width="100%" summary="periodic reset">
+ <tr>
+ <td align="left" valign="top">
+ <p style="margin: 4px; padding: 4px 0 4px 0; width: 94%;">
+ <select style="vertical-align:top" id="reset_type" name="pppoe-reset-type" class="formselect" onchange="show_reset_settings(this.value);">
+ <option value=""><?=gettext("Disabled"); ?></option>
+ <option value="custom" <?php if ($pconfig['pppoe-reset-type'] == "custom") echo "selected=\"selected\""; ?>><?=gettext("Custom"); ?></option>
+ <option value="preset" <?php if ($pconfig['pppoe-reset-type'] == "preset") echo "selected=\"selected\""; ?>><?=gettext("Pre-Set"); ?></option>
+ </select> <?=gettext("Select a reset timing type"); ?>
+ </p>
+ <?php if ($pconfig['pppoe_pr_custom']): ?>
+ <p style="margin: 2px; padding: 4px; width: 94%;" id="pppoecustomwrap">
+ <?php else: ?>
+ <p style="margin: 2px; padding: 4px; width: 94%; display: none;" id="pppoecustomwrap">
+ <?php endif; ?>
+ <input type="text" name="pppoe_resethour" class="fd_incremental_inp_range_0_23 fd_increment_1 fd_classname_dec_buttonDec fd_classname_inc_buttonInc" maxlength="2" id="pppoe_resethour" value="<?= htmlspecialchars($pconfig['pppoe_resethour']); ?>" size="3" />
+ <?=gettext("hour (0-23)"); ?><br />
+ <input type="text" name="pppoe_resetminute" class="fd_incremental_inp_range_0_59 fd_increment_1 fd_classname_dec_buttonDec fd_classname_inc_buttonInc" maxlength="2" id="pppoe_resetminute" value="<?= htmlspecialchars($pconfig['pppoe_resetminute']); ?>" size="3" />
+ <?=gettext("minute (0-59)"); ?><br />
+ <input name="pppoe_resetdate" type="text" class="w8em format-m-d-y highlight-days-67" id="pppoe_resetdate" maxlength="10" size="10" value="<?=htmlspecialchars($pconfig['pppoe_resetdate']);?>" />
+ <?=gettext("reset at a specific date (mm/dd/yyyy)"); ?>
+ <br />&nbsp;<br />
+ <span class="red"><strong><?=gettext("Note:"); ?> </strong></span>
+ <?=gettext("If you leave the date field empty, the reset will be executed each day at the time you did specify using the minutes and hour field."); ?>
+ </p>
+ <?php if ($pconfig['pppoe_pr_preset']): ?>
+ <p style="margin: 2px; padding: 4px; width: 94%;" id="pppoepresetwrap">
+ <?php else: ?>
+ <p style="margin: 2px; padding: 4px; width: 94%; display: none;" id="pppoepresetwrap">
+ <?php endif; ?>
+ <input name="pppoe_pr_preset_val" type="radio" id="pppoe_monthly" value="monthly" <?php if ($pconfig['pppoe_monthly']) echo "checked=\"checked\""; ?> />
+ <?=gettext("reset at each month ('0 0 1 * *')"); ?>
+ <br />
+ <input name="pppoe_pr_preset_val" type="radio" id="pppoe_weekly" value="weekly" <?php if ($pconfig['pppoe_weekly']) echo "checked=\"checked\""; ?> />
+ <?=gettext("reset at each week ('0 0 * * 0')"); ?>
+ <br />
+ <input name="pppoe_pr_preset_val" type="radio" id="pppoe_daily" value="daily" <?php if ($pconfig['pppoe_daily']) echo "checked=\"checked\""; ?> />
+ <?=gettext("reset at each day ('0 0 * * *')"); ?>
+ <br />
+ <input name="pppoe_pr_preset_val" type="radio" id="pppoe_hourly" value="hourly" <?php if ($pconfig['pppoe_hourly']) echo "checked=\"checked\""; ?> />
+ <?=gettext("reset at each hour ('0 * * * *')"); ?>
+ </p>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Advanced and MLPPP"); ?></td>
+ <?php if (isset($pconfig['pppid'])): ?>
+ <td width="78%" class="vtable">
+ <a href="/interfaces_ppps_edit.php?id=<?=htmlspecialchars($pconfig['pppid']);?>" class="navlnk"><?=gettext("Click here"); ?> </a>
+ <?=gettext("for additional PPPoE configuration options. Save first if you made changes."); ?>
+ </td>
+ <?php else: ?>
+ <td width="78%" class="vtable">
+ <a href="/interfaces_ppps_edit.php" class="navlnk"><?=gettext("Click here"); ?> </a>
+ <?=gettext("for advanced PPPoE configuration options and MLPPP configuration."); ?>
+ </td>
+ <?php endif; ?>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr style="display:none;" id="pptp">
+ <td colspan="2" style="padding:0px;">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="pptp">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("PPTP/L2TP configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Username"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pptp_username" type="text" class="formfld user" id="pptp_username" size="20" value="<?=htmlspecialchars($pconfig['pptp_username']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Password"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pptp_password" type="password" class="formfld pwd" id="pptp_password" size="20" value="<?=htmlspecialchars($pconfig['pptp_password']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Local IP address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pptp_local" type="text" class="formfld unknown" id="pptp_local" size="20" value="<?=htmlspecialchars($pconfig['pptp_local'][0]);?>" />
+ /
+ <select name="pptp_subnet" class="formselect" id="pptp_subnet">
+ <?php for ($i = 31; $i > 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['pptp_subnet'][0]) echo "selected=\"selected\""; ?>>
+ <?=$i;?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote IP address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pptp_remote" type="text" class="formfld unknown" id="pptp_remote" size="20" value="<?=htmlspecialchars($pconfig['pptp_remote'][0]);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Dial on demand"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pptp_dialondemand" type="checkbox" id="pptp_dialondemand" value="enable" <?php if ($pconfig['pptp_dialondemand']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable Dial-On-Demand mode"); ?></strong><br />
+ <?=gettext("This option causes the interface to operate in dial-on-demand mode, allowing you to have a"); ?> <i><?=gettext("virtual full time"); ?></i> <?=gettext("connection. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Idle timeout"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pptp_idletimeout" type="text" class="formfld unknown" id="pptp_idletimeout" size="8" value="<?=htmlspecialchars($pconfig['pptp_idletimeout']);?>" /> <?=gettext("seconds"); ?><br /><?=gettext("If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. An idle timeout of zero disables this feature."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Advanced"); ?></td>
+ <?php if (isset($pconfig['pppid'])): ?>
+ <td width="78%" class="vtable">
+ <a href="/interfaces_ppps_edit.php?id=<?=htmlspecialchars($pconfig['pppid']);?>" class="navlnk"><?=gettext("Click here");?></a>
+ <?=gettext("for additional PPTP and L2TP configuration options. Save first if you made changes.");?>
+ </td>
+ <?php else: ?>
+ <td width="78%" class="vtable">
+ <a href="/interfaces_ppps_edit.php" class="navlnk"><?=gettext("Click here");?></a>
+ <?=gettext("for advanced PPTP and L2TP configuration options");?>.
+ </td>
+ <?php endif; ?>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ /* Wireless interface? */
+ if (isset($wancfg['wireless'])):
+ ?>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Common wireless configuration - Settings apply to all wireless networks on"); ?> <?=$wlanbaseif;?>.</td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Persist common settings");?></td>
+ <td class="vtable">
+ <input name="persistcommonwireless" type="checkbox" value="yes" class="formfld" id="persistcommonwireless" <?php if ($pconfig['persistcommonwireless']) echo "checked=\"checked\"";?> />
+ <br /><?=gettext("Enabling this preserves the common wireless configuration through interface deletions and reassignments.");?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Standard"); ?></td>
+ <td class="vtable">
+ <select name="standard" class="formselect" id="standard">
+ <?php
+ $rowIndex = 0;
+ echo "<option ";
+ if ($pconfig['standard'] == "auto") {
+ echo "selected=\"selected\" ";
+ }
+ echo "value=\"auto\">auto</option>\n";
+ foreach ($wl_modes as $wl_standard => $wl_channels) {
+ $rowIndex++;
+ echo "<option ";
+ if ($pconfig['standard'] == "$wl_standard") {
+ echo "selected=\"selected\" ";
+ }
+ if ($pconfig['standard'] == "") {
+ if ($wl_standard == "11ng") {
+ echo "selected=\"selected\" ";
+ }
+ }
+ echo "value=\"$wl_standard\">802.$wl_standard</option>\n";
+ }
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <?php if (isset($wl_modes['11g'])): ?>
+ <tr>
+ <td valign="top" class="vncellreq">802.11g OFDM <?=gettext("Protection Mode"); ?></td>
+ <td class="vtable">
+ <select name="protmode" class="formselect" id="protmode">
+ <option <?php if ($pconfig['protmode'] == 'off') echo "selected=\"selected\"";?> value="off"><?=gettext("Protection mode off"); ?></option>
+ <option <?php if ($pconfig['protmode'] == 'cts') echo "selected=\"selected\"";?> value="cts"><?=gettext("Protection mode CTS to self"); ?></option>
+ <option <?php if ($pconfig['protmode'] == 'rtscts') echo "selected=\"selected\"";?> value="rtscts"><?=gettext("Protection mode RTS and CTS"); ?></option>
+ </select>
+ <br />
+ <?=gettext("For IEEE 802.11g, use the specified technique for protecting OFDM frames in a mixed 11b/11g network."); ?>
+ <br />
+ </td>
+ </tr>
+ <?php else: ?>
+ <input name="protmode" type="hidden" id="protmode" value="off" />
+ <?php endif; ?>
+ <?php /* txpower is disabled because of issues with it.
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Transmit power"); ?></td>
+ <td class="vtable">
+ <select name="txpower" class="formselect" id="txpower">
+ <?
+ for ($x = 99; $x > 0; $x--) {
+ if ($pconfig["txpower"] == $x) {
+ $SELECTED = " selected=\"selected\"";
+ } else {
+ $SELECTED = "";
+ }
+ echo "<option {$SELECTED}>{$x}</option>\n";
+ }
+ ?>
+ </select><br />
+ <?=gettext("Note: Typically only a few discreet power settings are available and the driver will use the setting closest to the specified value. Not all adapters support changing the transmit power setting."); ?>
+ </td>
+ </tr>*/
+ ?>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Channel"); ?></td>
+ <td class="vtable">
+ <select name="channel" class="formselect" id="channel">
+ <option <?php if ($pconfig['channel'] == 0) echo "selected=\"selected\""; ?> value="0"><?=gettext("Auto"); ?></option>
+ <?php
+ foreach ($wl_modes as $wl_standard => $wl_channels) {
+ if ($wl_standard == "11g") {
+ $wl_standard = "11b/g";
+ } else if ($wl_standard == "11ng") {
+ $wl_standard = "11b/g/n";
+ } else if ($wl_standard == "11na") {
+ $wl_standard = "11a/n";
+ }
+ foreach ($wl_channels as $wl_channel) {
+ echo "<option ";
+ if ($pconfig['channel'] == "$wl_channel") {
+ echo "selected=\"selected\" ";
+ }
+ echo "value=\"$wl_channel\">$wl_standard - $wl_channel";
+ if (isset($wl_chaninfo[$wl_channel])) {
+ echo " ({$wl_chaninfo[$wl_channel][1]} @ {$wl_chaninfo[$wl_channel][2]} / {$wl_chaninfo[$wl_channel][3]})";
+ }
+ echo "</option>\n";
+ }
+ }
+ ?>
+ </select>
+ <br />
+ <?=gettext("Legend: wireless standards - channel # (frequency @ max TX power / TX power allowed in reg. domain)"); ?>
+ <br />
+ <?=gettext("Note: Not all channels may be supported by your card. Auto may override the wireless standard selected above."); ?>
+ </td>
+ </tr>
+ <?php if (isset($wl_sysctl["{$wl_sysctl_prefix}.diversity"]) || isset($wl_sysctl["{$wl_sysctl_prefix}.txantenna"]) || isset($wl_sysctl["{$wl_sysctl_prefix}.rxantenna"])): ?>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Antenna settings"); ?></td>
+ <td class="vtable">
+ <table border="0" cellpadding="0" cellspacing="0" summary="antenna settings">
+ <tr>
+ <?php if (isset($wl_sysctl["{$wl_sysctl_prefix}.diversity"])): ?>
+ <td>
+ <?=gettext("Diversity"); ?><br />
+ <select name="diversity" class="formselect" id="diversity">
+ <option <?php if (!isset($pconfig['diversity'])) echo "selected=\"selected\""; ?> value=""><?=gettext("Default"); ?></option>
+ <option <?php if ($pconfig['diversity'] === '0') echo "selected=\"selected\""; ?> value="0"><?=gettext("Off"); ?></option>
+ <option <?php if ($pconfig['diversity'] === '1') echo "selected=\"selected\""; ?> value="1"><?=gettext("On"); ?></option>
+ </select>
+ </td>
+ <td>&nbsp;&nbsp;</td>
+ <?php endif; ?>
+ <?php if (isset($wl_sysctl["{$wl_sysctl_prefix}.txantenna"])): ?>
+ <td>
+ <?=gettext("Transmit antenna"); ?><br />
+ <select name="txantenna" class="formselect" id="txantenna">
+ <option <?php if (!isset($pconfig['txantenna'])) echo "selected=\"selected\""; ?> value=""><?=gettext("Default"); ?></option>
+ <option <?php if ($pconfig['txantenna'] === '0') echo "selected=\"selected\""; ?> value="0"><?=gettext("Auto"); ?></option>
+ <option <?php if ($pconfig['txantenna'] === '1') echo "selected=\"selected\""; ?> value="1"><?=gettext("#1"); ?></option>
+ <option <?php if ($pconfig['txantenna'] === '2') echo "selected=\"selected\""; ?> value="2"><?=gettext("#2"); ?></option>
+ </select>
+ </td>
+ <td>&nbsp;&nbsp;</td>
+ <?php endif; ?>
+ <?php if (isset($wl_sysctl["{$wl_sysctl_prefix}.rxantenna"])): ?>
+ <td>
+ <?=gettext("Receive antenna"); ?><br />
+ <select name="rxantenna" class="formselect" id="rxantenna">
+ <option <?php if (!isset($pconfig['rxantenna'])) echo "selected=\"selected\""; ?> value=""><?=gettext("Default"); ?></option>
+ <option <?php if ($pconfig['rxantenna'] === '0') echo "selected=\"selected\""; ?> value="0"><?=gettext("Auto"); ?></option>
+ <option <?php if ($pconfig['rxantenna'] === '1') echo "selected=\"selected\""; ?> value="1"><?=gettext("#1"); ?></option>
+ <option <?php if ($pconfig['rxantenna'] === '2') echo "selected=\"selected\""; ?> value="2"><?=gettext("#2"); ?></option>
+ </select>
+ </td>
+ <?php endif; ?>
+ </tr>
+ </table>
+ <br />
+ <?=gettext("Note: The antenna numbers do not always match up with the labels on the card."); ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php if (isset($wl_sysctl["{$wl_sysctl_prefix}.slottime"]) && isset($wl_sysctl["{$wl_sysctl_prefix}.acktimeout"]) && isset($wl_sysctl["{$wl_sysctl_prefix}.ctstimeout"])): ?>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Distance setting"); ?></td>
+ <td class="vtable">
+ <input name="distance" type="text" class="formfld unknown" id="distance" size="5" value="<?=htmlspecialchars($pconfig['distance']);?>" />
+ <br />
+ <?=gettext("Note: This field can be used to tune ACK/CTS timers to fit the distance between AP and Client"); ?><br />
+ <?=gettext("(measured in meters)"); ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Regulatory settings"); ?></td>
+ <td class="vtable">
+ <?=gettext("Regulatory domain"); ?><br />
+ <select name="regdomain" class="formselect" id="regdomain">
+ <option <?php if (empty($pconfig['regdomain'])) echo "selected=\"selected\""; ?> value=""><?=gettext("Default"); ?></option>
+ <?php
+ foreach ($wl_regdomains as $wl_regdomain_key => $wl_regdomain) {
+ echo "<option ";
+ if ($pconfig['regdomain'] == $wl_regdomains_attr[$wl_regdomain_key]['ID']) {
+ echo "selected=\"selected\" ";
+ }
+ echo "value=\"{$wl_regdomains_attr[$wl_regdomain_key]['ID']}\">{$wl_regdomain['name']}</option>\n";
+ }
+ ?>
+ </select>
+ <br />
+ <?=gettext("Note: Some cards have a default that is not recognized and require changing the regulatory domain to one in this list for the changes to other regulatory settings to work."); ?>
+ <br /><br />
+ <?=gettext("Country (listed with country code and regulatory domain)"); ?><br />
+ <select name="regcountry" class="formselect" id="regcountry">
+ <option <?php if (empty($pconfig['regcountry'])) echo "selected=\"selected\""; ?> value=""><?=gettext("Default"); ?></option>
+ <?php
+ foreach ($wl_countries as $wl_country_key => $wl_country) {
+ echo "<option ";
+ if ($pconfig['regcountry'] == $wl_countries_attr[$wl_country_key]['ID']) {
+ echo "selected=\"selected\" ";
+ }
+ echo "value=\"{$wl_countries_attr[$wl_country_key]['ID']}\">{$wl_country['name']} -- ({$wl_countries_attr[$wl_country_key]['ID']}, " . strtoupper($wl_countries_attr[$wl_country_key]['rd'][0]['REF']) . ")</option>\n";
+ }
+ ?>
+ </select>
+ <br />
+ <?=gettext("Note: Any country setting other than \"Default\" will override the regulatory domain setting"); ?>.
+ <br /><br />
+ <?=gettext("Location"); ?><br />
+ <select name="reglocation" class="formselect" id="reglocation">
+ <option <?php if (empty($pconfig['reglocation'])) echo "selected=\"selected\""; ?> value=""><?=gettext("Default"); ?></option>
+ <option <?php if ($pconfig['reglocation'] == 'indoor') echo "selected=\"selected\""; ?> value="indoor"><?=gettext("Indoor"); ?></option>
+ <option <?php if ($pconfig['reglocation'] == 'outdoor') echo "selected=\"selected\""; ?> value="outdoor"><?=gettext("Outdoor"); ?></option>
+ <option <?php if ($pconfig['reglocation'] == 'anywhere') echo "selected=\"selected\""; ?> value="anywhere"><?=gettext("Anywhere"); ?></option>
+ </select>
+ <br /><br />
+ <?=gettext("These settings may affect which channels are available and the maximum transmit power allowed on those channels. Using the correct settings to comply with local regulatory requirements is recommended."); ?>
+ <br />
+ <?=gettext("Note: All wireless networks on this interface will be temporarily brought down when changing regulatory settings. Some of the regulatory domains or country codes may not be allowed by some cards. These settings may not be able to add additional channels that are not already supported."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Network-specific wireless configuration");?></td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Mode"); ?></td>
+ <td class="vtable">
+ <select name="mode" class="formselect" id="mode">
+ <option <?php if ($pconfig['mode'] == 'bss') echo "selected=\"selected\"";?> value="bss"><?=gettext("Infrastructure (BSS)"); ?></option>
+ <option <?php if ($pconfig['mode'] == 'adhoc') echo "selected=\"selected\"";?> value="adhoc"><?=gettext("Ad-hoc (IBSS)"); ?></option>
+ <option <?php if ($pconfig['mode'] == 'hostap') echo "selected=\"selected\"";?> value="hostap"><?=gettext("Access Point"); ?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("SSID"); ?></td>
+ <td class="vtable">
+ <input name="ssid" type="text" class="formfld unknown" id="ssid" size="20" value="<?=htmlspecialchars($pconfig['ssid']); ?>" />
+ <br />
+ <?=gettext("Note: Only required in Access Point mode. If left blank in Ad-hoc or Infrastructure mode, this interface will connect to any available SSID"); ?>
+ </td>
+ </tr>
+ <?php if (isset($wl_modes['11ng']) || isset($wl_modes['11na'])): ?>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Minimum wireless standard"); ?></td>
+ <td class="vtable">
+ <select name="puremode" class="formselect" id="puremode">
+ <option <?php if ($pconfig['puremode'] == 'any') echo "selected=\"selected\"";?> value="any"><?=gettext("Any"); ?></option>
+ <?php if (isset($wl_modes['11g'])): ?>
+ <option <?php if ($pconfig['puremode'] == '11g') echo "selected=\"selected\"";?> value="11g"><?=gettext("802.11g"); ?></option>
+ <?php endif; ?>
+ <option <?php if ($pconfig['puremode'] == '11n') echo "selected=\"selected\"";?> value="11n"><?=gettext("802.11n"); ?></option>
+ </select>
+ <br />
+ <?=gettext("When operating as an access point, allow only stations capable of the selected wireless standard to associate (stations not capable are not permitted to associate)."); ?>
+ </td>
+ </tr>
+ <?php elseif (isset($wl_modes['11g'])): ?>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("802.11g only"); ?></td>
+ <td class="vtable">
+ <input name="puremode" type="checkbox" value="11g" class="formfld" id="puremode" <?php if ($pconfig['puremode'] == '11g') echo "checked=\"checked\"";?> />
+ <br /><?=gettext("When operating as an access point in 802.11g mode, allow only 11g-capable stations to associate (11b-only stations are not permitted to associate)."); ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Allow intra-BSS communication"); ?></td>
+ <td class="vtable">
+ <input name="apbridge_enable" type="checkbox" value="yes" class="formfld" id="apbridge_enable" <?php if ($pconfig['apbridge_enable']) echo "checked=\"checked\"";?> />
+ <br />
+ <?=gettext("When operating as an access point, enable this if you want to pass packets between wireless clients directly."); ?>
+ <br />
+ <?=gettext("Disabling the internal bridging is useful when traffic is to be processed with packet filtering."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Enable WME"); ?></td>
+ <td class="vtable">
+ <input name="wme_enable" type="checkbox" class="formfld" id="wme_enable" value="yes" <?php if ($pconfig['wme_enable']) echo "checked=\"checked\"";?> />
+ <br /><?=gettext("Setting this option will force the card to use WME (wireless QoS)."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Enable Hide SSID"); ?></td>
+ <td class="vtable">
+ <input name="hidessid_enable" type="checkbox" class="formfld" id="hidessid_enable" value="yes" <?php if ($pconfig['hidessid_enable']) echo "checked=\"checked\"";?> />
+ <br />
+ <?=gettext("Setting this option will force the card to NOT broadcast its SSID"); ?>
+ <br />
+ <?=gettext("(this might create problems for some clients)."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("WEP"); ?></td>
+ <td class="vtable">
+ <input name="wep_enable" type="checkbox" id="wep_enable" value="yes" <?php if ($pconfig['wep_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable WEP"); ?></strong>
+ <table border="0" cellspacing="0" cellpadding="0" summary="wep">
+ <tr>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;<?=gettext("TX key"); ?>&nbsp;</td>
+ </tr>
+ <tr>
+ <td><?=gettext("Key 1:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="key1" type="text" class="formfld unknown" id="key1" size="30" value="<?=htmlspecialchars($pconfig['key1']);?>" />
+ </td>
+ <td align="center">
+ <input name="txkey" type="radio" value="1" <?php if ($pconfig['txkey'] == 1) echo "checked=\"checked\"";?> />
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Key 2:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="key2" type="text" class="formfld unknown" id="key2" size="30" value="<?=htmlspecialchars($pconfig['key2']);?>" />
+ </td>
+ <td align="center">
+ <input name="txkey" type="radio" value="2" <?php if ($pconfig['txkey'] == 2) echo "checked=\"checked\"";?> />
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Key 3:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="key3" type="text" class="formfld unknown" id="key3" size="30" value="<?=htmlspecialchars($pconfig['key3']);?>" />
+ </td>
+ <td align="center">
+ <input name="txkey" type="radio" value="3" <?php if ($pconfig['txkey'] == 3) echo "checked=\"checked\"";?> />
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Key 4:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="key4" type="text" class="formfld unknown" id="key4" size="30" value="<?=htmlspecialchars($pconfig['key4']);?>" />
+ </td>
+ <td align="center">
+ <input name="txkey" type="radio" value="4" <?php if ($pconfig['txkey'] == 4) echo "checked=\"checked\"";?> />
+ </td>
+ </tr>
+ </table>
+ <br />
+ <?=gettext("40 (64) bit keys may be entered as 5 ASCII characters or 10 hex digits preceded by '0x'."); ?><br />
+ <?=gettext("104 (128) bit keys may be entered as 13 ASCII characters or 26 hex digits preceded by '0x'."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("WPA"); ?></td>
+ <td class="vtable">
+ <input name="wpa_enable" type="checkbox" class="formfld" id="wpa_enable" value="yes" <?php if ($pconfig['wpa_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable WPA"); ?></strong>
+ <br /><br />
+ <table border="0" cellspacing="0" cellpadding="0" summary="wpa">
+ <tr>
+ <td>&nbsp;</td>
+ <td>&nbsp;<?=gettext("WPA Pre-Shared Key"); ?>&nbsp;</td>
+ </tr>
+ <tr>
+ <td><?=gettext("PSK:"); ?>&nbsp;&nbsp;</td>
+ <td>
+ <input name="passphrase" type="text" class="formfld unknown" id="passphrase" size="66" value="<?=htmlspecialchars($pconfig['passphrase']);?>" />
+ </td>
+ </tr>
+ </table>
+ <br /><?=gettext("WPA Passphrase must be between 8 and 63 characters long."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("WPA Mode"); ?></td>
+ <td class="vtable">
+ <select name="wpa_mode" class="formselect" id="wpa_mode">
+ <option <?php if ($pconfig['wpa_mode'] == '1') echo "selected=\"selected\"";?> value="1"><?=gettext("WPA"); ?></option>
+ <option <?php if ($pconfig['wpa_mode'] == '2' || !isset($pconfig['wpa_mode'])) echo "selected=\"selected\"";?> value="2"><?=gettext("WPA2"); ?></option>
+ <option <?php if ($pconfig['wpa_mode'] == '3') echo "selected=\"selected\"";?> value="3"><?=gettext("Both"); ?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("WPA Key Management Mode"); ?></td>
+ <td class="vtable">
+ <select name="wpa_key_mgmt" class="formselect" id="wpa_key_mgmt">
+ <option <?php if ($pconfig['wpa_key_mgmt'] == 'WPA-PSK') echo "selected=\"selected\"";?> value="WPA-PSK"><?=gettext("Pre-Shared Key"); ?></option>
+ <option <?php if ($pconfig['wpa_key_mgmt'] == 'WPA-EAP') echo "selected=\"selected\"";?> value="WPA-EAP"><?=gettext("Extensible Authentication Protocol"); ?></option>
+ <option <?php if ($pconfig['wpa_key_mgmt'] == 'WPA-PSK WPA-EAP') echo "selected=\"selected\"";?> value="WPA-PSK WPA-EAP"><?=gettext("Both"); ?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Authentication"); ?></td>
+ <td class="vtable">
+ <select name="auth_algs" class="formselect" id="auth_algs">
+ <option <?php if ($pconfig['auth_algs'] == '1') echo "selected=\"selected\"";?> value="1"><?=gettext("Open System Authentication"); ?></option>
+ <option <?php if ($pconfig['auth_algs'] == '2') echo "selected=\"selected\"";?> value="2"><?=gettext("Shared Key Authentication"); ?></option>
+ <option <?php if ($pconfig['auth_algs'] == '3') echo "selected=\"selected\"";?> value="3"><?=gettext("Both"); ?></option>
+ </select>
+ <br /><?=gettext("Note: Shared Key Authentication requires WEP."); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("WPA Pairwise"); ?></td>
+ <td class="vtable">
+ <select name="wpa_pairwise" class="formselect" id="wpa_pairwise">
+ <option <?php if ($pconfig['wpa_pairwise'] == 'CCMP TKIP') echo "selected=\"selected\"";?> value="CCMP TKIP"><?=gettext("Both"); ?></option>
+ <option <?php if ($pconfig['wpa_pairwise'] == 'CCMP' || !isset($pconfig['wpa_pairwise'])) echo "selected=\"selected\"";?> value="CCMP"><?=gettext("AES (recommended)"); ?></option>
+ <option <?php if ($pconfig['wpa_pairwise'] == 'TKIP') echo "selected=\"selected\"";?> value="TKIP"><?=gettext("TKIP"); ?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Key Rotation"); ?></td>
+ <td class="vtable">
+ <input name="wpa_group_rekey" type="text" class="formfld unknown" id="wpa_group_rekey" size="30" value="<?php echo htmlspecialchars($pconfig['wpa_group_rekey']) ? $pconfig['wpa_group_rekey'] : "60";?>" />
+ <br /><?=gettext("Specified in seconds. Allowed values are 1-9999. Must be shorter than Master Key Regeneration time."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Master Key Regeneration"); ?></td>
+ <td class="vtable">
+ <input name="wpa_gmk_rekey" type="text" class="formfld" id="wpa_gmk_rekey" size="30" value="<?php echo htmlspecialchars($pconfig['wpa_gmk_rekey']) ? $pconfig['wpa_gmk_rekey'] : "3600";?>" />
+ <br /><?=gettext("Specified in seconds. Allowed values are 1-9999. Must be longer than Key Rotation time."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Strict Key Regeneration"); ?></td>
+ <td class="vtable">
+ <input name="wpa_strict_rekey" type="checkbox" value="yes" class="formfld" id="wpa_strict_rekey" <?php if ($pconfig['wpa_strict_rekey']) echo "checked=\"checked\""; ?> />
+ <br /><?=gettext("Setting this option will force the AP to rekey whenever a client disassociates."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Enable IEEE802.1X Authentication"); ?></td>
+ <td class="vtable">
+ <input name="ieee8021x" type="checkbox" value="yes" class="formfld" id="ieee8021x" <?php if ($pconfig['ieee8021x']) echo "checked=\"checked\"";?> />
+ <br /><?=gettext("Setting this option will enable 802.1X authentication."); ?>
+ <br /><span class="red"><strong><?=gettext("NOTE"); ?>:</strong></span> <?=gettext("this option requires checking the \"Enable WPA box\"."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("802.1X Authentication Server IP Address"); ?></td>
+ <td class="vtable">
+ <input name="auth_server_addr" id="auth_server_addr" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_addr']);?>" />
+ <br /><?=gettext("Enter the IP address of the 802.1X Authentication Server. This is commonly a Radius server (FreeRadius, Internet Authentication Services, etc.)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("802.1X Authentication Server Port"); ?></td>
+ <td class="vtable">
+ <input name="auth_server_port" id="auth_server_port" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_port']);?>" />
+ <br /><?=gettext("Leave blank for the default port 1812."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("802.1X Authentication Server Shared Secret"); ?></td>
+ <td class="vtable">
+ <input name="auth_server_shared_secret" id="auth_server_shared_secret" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_shared_secret']);?>" />
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Secondary 802.1X Authentication Server IP Address"); ?></td>
+ <td class="vtable">
+ <input name="auth_server_addr2" id="auth_server_addr2" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_addr2']);?>" />
+ <br /><?=gettext("Enter the IP address of the 802.1X Authentication Server. This is commonly a Radius server (FreeRadius, Internet Authentication Services, etc.)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Secondary 802.1X Authentication Server Port"); ?></td>
+ <td class="vtable">
+ <input name="auth_server_port2" id="auth_server_port2" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_port2']);?>" />
+ <br /><?=gettext("Leave blank for the default port 1812."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Secondary 802.1X Authentication Server Shared Secret"); ?></td>
+ <td class="vtable">
+ <input name="auth_server_shared_secret2" id="auth_server_shared_secret2" type="text" class="formfld unknown" size="66" value="<?=htmlspecialchars($pconfig['auth_server_shared_secret2']);?>" />
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell">802.1X <?=gettext("Authentication Roaming Preauth"); ?></td>
+ <td class="vtable">
+ <input name="rsn_preauth" id="rsn_preauth" type="checkbox" class="formfld unknown" size="66" value="yes" <?php if ($pconfig['rsn_preauth']) echo "checked=\"checked\""; ?> />
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Private networks"); ?></td>
+ </tr>
+ <tr>
+ <td valign="middle" class="vncell">&nbsp;</td>
+ <td class="vtable">
+ <a name="rfc1918"></a>
+ <input name="blockpriv" type="checkbox" id="blockpriv" value="yes" <?php if ($pconfig['blockpriv']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Block private networks"); ?></strong><br />
+ <?=gettext("When set, this option blocks traffic from IP addresses that are reserved " .
+ "for private networks as per RFC 1918 (10/8, 172.16/12, 192.168/16) as"); ?>
+ <?=gettext("well as loopback addresses (127/8)."); ?>&nbsp;&nbsp; <?=gettext("You should generally " .
+ "leave this option turned on, unless your WAN network lies in such " .
+ "a private address space, too."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="middle" class="vncell">&nbsp;</td>
+ <td class="vtable">
+ <input name="blockbogons" type="checkbox" id="blockbogons" value="yes" <?php if ($pconfig['blockbogons']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Block bogon networks"); ?></strong><br />
+ <?=gettext("When set, this option blocks traffic from IP addresses that are reserved " .
+ "(but not RFC 1918) or not yet assigned by IANA."); ?>&nbsp;&nbsp;
+ <?=gettext("Bogons are prefixes that should never appear in the Internet routing table, " .
+ "and obviously should not appear as the source address in any packets you receive."); ?>
+ <br /><br />
+ <?=gettext("Note: The update frequency can be changed under System->Advanced Firewall/NAT settings.")?>
+ </td>
+ </tr>
+ </table> <!-- End "allcfg" table -->
+ </div> <!-- End "allcfg" div -->
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="buttons">
+ <tr>
+ <td width="22%" valign="top">
+ &nbsp;
+ </td>
+ <td width="78%">
+ <br />
+ <input id="save" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input id="cancel" type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <input name="if" type="hidden" id="if" value="<?=htmlspecialchars($if);?>" />
+ <?php if ($wancfg['if'] == $a_ppps[$pppid]['if']) : ?>
+ <input name="ppp_port" type="hidden" value="<?=htmlspecialchars($pconfig['port']);?>" />
+ <?php endif; ?>
+ <input name="ptpid" type="hidden" value="<?=htmlspecialchars($pconfig['ptpid']);?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </form>
+ <script type="text/javascript">
+ //<![CDATA[
+ var gatewayip;
+ var name;
+ var gatewayipv6;
+ var namev6;
+ function show_add_gateway() {
+ document.getElementById("addgateway").style.display = '';
+ document.getElementById("addgwbox").style.display = 'none';
+ document.getElementById("gateway").style.display = 'none';
+ document.getElementById("save").style.display = 'none';
+ document.getElementById("cancel").style.display = 'none';
+ document.getElementById("gwsave").style.display = '';
+ document.getElementById("gwcancel").style.display = '';
+ jQuery('#notebox').html("");
+ }
+ function show_add_gateway_v6() {
+ document.getElementById("addgatewayv6").style.display = '';
+ document.getElementById("addgwboxv6").style.display = 'none';
+ document.getElementById("gatewayv6").style.display = 'none';
+ document.getElementById("save").style.display = 'none';
+ document.getElementById("cancel").style.display = 'none';
+ document.getElementById("gwsave").style.display = '';
+ document.getElementById("gwcancel").style.display = '';
+ jQuery('#noteboxv6').html("");
+ }
+ function hide_add_gateway() {
+ document.getElementById("addgateway").style.display = 'none';
+ document.getElementById("addgwbox").style.display = '';
+ document.getElementById("gateway").style.display = '';
+ document.getElementById("save").style.display = '';
+ document.getElementById("cancel").style.display = '';
+ document.getElementById("gwsave").style.display = '';
+ document.getElementById("gwcancel").style.display = '';
+ jQuery('#status').html('');
+ }
+ function hide_add_gateway_v6() {
+ document.getElementById("addgatewayv6").style.display = 'none';
+ document.getElementById("addgwboxv6").style.display = '';
+ document.getElementById("gatewayv6").style.display = '';
+ document.getElementById("save").style.display = '';
+ document.getElementById("cancel").style.display = '';
+ document.getElementById("gwsave").style.display = '';
+ document.getElementById("gwcancel").style.display = '';
+ jQuery('#statusv6').html('');
+ }
+ function hide_add_gatewaysave() {
+ document.getElementById("addgateway").style.display = 'none';
+ jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> One moment please...');
+ var iface = jQuery('#if').val();
+ name = jQuery('#name').val();
+ var descr = jQuery('#gatewaydescr').val();
+ gatewayip = jQuery('#gatewayip').val();
+
+ var defaultgw = '';
+ if (jQuery('#defaultgw').is(':checked')) {
+ defaultgw = '&defaultgw=on';
+ }
+ var url = "system_gateways_edit.php";
+ var pars = 'isAjax=true&ipprotocol=inet' + defaultgw + '&interface=' + escape(iface) + '&name=' + escape(name) + '&descr=' + escape(descr) + '&gateway=' + escape(gatewayip);
+ jQuery.ajax(
+ url,
+ {
+ type: 'post',
+ data: pars,
+ error: report_failure,
+ success: save_callback
+ });
+ }
+ function hide_add_gatewaysave_v6() {
+ document.getElementById("addgatewayv6").style.display = 'none';
+ jQuery('#statusv6').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> One moment please...');
+ var iface = jQuery('#if').val();
+ name = jQuery('#namev6').val();
+ var descr = jQuery('#gatewaydescrv6').val();
+ gatewayip = jQuery('#gatewayipv6').val();
+ var defaultgw = '';
+ if (jQuery('#defaultgwv6').is(':checked')) {
+ defaultgw = '&defaultgw=on';
+ }
+ var url_v6 = "system_gateways_edit.php";
+ var pars_v6 = 'isAjax=true&ipprotocol=inet6' + defaultgw + '&interface=' + escape(iface) + '&name=' + escape(name) + '&descr=' + escape(descr) + '&gateway=' + escape(gatewayip);
+ jQuery.ajax(
+ url_v6,
+ {
+ type: 'post',
+ data: pars_v6,
+ error: report_failure_v6,
+ success: save_callback_v6
+ });
+ }
+ function addOption(selectbox, text, value)
+ {
+ var optn = document.createElement("OPTION");
+ optn.text = text;
+ optn.value = value;
+ selectbox.append(optn);
+ selectbox.prop('selectedIndex', selectbox.children().length - 1);
+ jQuery('#notebox').html("<p><strong><?=gettext("NOTE:"); ?><\/strong> <?=gettext("You can manage Gateways"); ?> <a target='_blank' href='system_gateways.php'><?=gettext("here"); ?><\/a>.<\/p>");
+ }
+ function addOption_v6(selectbox, text, value)
+ {
+ var optn = document.createElement("OPTION");
+ optn.text = text;
+ optn.value = value;
+ selectbox.append(optn);
+ selectbox.prop('selectedIndex', selectbox.children().length - 1);
+ jQuery('#noteboxv6').html("<p><strong><?=gettext("NOTE:"); ?><\/strong> <?=gettext("You can manage Gateways"); ?> <a target='_blank' href='system_gateways.php'><?=gettext("here"); ?><\/a>.<\/p>");
+ }
+ function report_failure(request, textStatus, errorThrown) {
+ if (textStatus === "error" && request.getResponseHeader("Content-Type") === "text/plain") {
+ alert(request.responseText);
+ } else {
+ alert("Sorry, we could not create your IPv4 gateway at this time.");
+ }
+ hide_add_gateway();
+ }
+ function report_failure_v6(request, textStatus, errorThrown) {
+ if (textStatus === "error" && request.getResponseHeader("Content-Type") === "text/plain") {
+ alert(request.responseText);
+ } else {
+ alert("Sorry, we could not create your IPv6 gateway at this time.");
+ }
+ hide_add_gateway_v6();
+ }
+ function save_callback(response) {
+ if (response) {
+ document.getElementById("addgateway").style.display = 'none';
+ hide_add_gateway();
+ var gwtext = escape(name) + " - " + gatewayip;
+ addOption(jQuery('#gateway'), gwtext, name);
+ // Auto submit form?
+ //document.iform.submit();
+ //jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader /">');
+ } else {
+ report_failure();
+ }
+ }
+ function show_advanced_media() {
+ document.getElementById("showadvmediabox").innerHTML='';
+ aodiv = document.getElementById('showmediaadv');
+ aodiv.style.display = "block";
+ }
+ function save_callback_v6(response_v6) {
+ if (response_v6) {
+ document.getElementById("addgatewayv6").style.display = 'none';
+ hide_add_gateway_v6();
+ var gwtext_v6 = escape(name) + " - " + gatewayip;
+ addOption_v6(jQuery('#gatewayv6'), gwtext_v6, name);
+ // Auto submit form?
+ //document.iform.submit();
+ //jQuery('#statusv6').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" />');
+ } else {
+ report_failure_v6();
+ }
+ }
+ <?php
+ echo "show_allcfg(document.iform.enable);";
+ echo "updateType('{$pconfig['type']}');\n";
+ echo "updateTypeSix('{$pconfig['type6']}');\n";
+ ?>
+ //]]>
+ </script>
+ <?php include("fend.inc"); ?>
+ </body>
+</html>
diff --git a/src/usr/local/www/interfaces_assign.php b/src/usr/local/www/interfaces_assign.php
new file mode 100644
index 0000000..03fe582
--- /dev/null
+++ b/src/usr/local/www/interfaces_assign.php
@@ -0,0 +1,597 @@
+<?php
+/*
+ interfaces_assign.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ Written by Jim McBeath based on existing m0n0wall files
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-assignnetworkports
+##|*NAME=Interfaces: Assign network ports page
+##|*DESCR=Allow access to the 'Interfaces: Assign network ports' page.
+##|*MATCH=interfaces_assign.php*
+##|-PRIV
+
+$pgtitle = array(gettext("Interfaces"), gettext("Assign network ports"));
+$shortcut_section = "interfaces";
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("ipsec.inc");
+require("vpn.inc");
+require("captiveportal.inc");
+require_once("rrd.inc");
+
+function interface_assign_description($portinfo, $portname) {
+ global $ovpn_descrs;
+ if ($portinfo['isvlan']) {
+ $descr = sprintf(gettext('VLAN %1$s on %2$s'), $portinfo['tag'], $portinfo['if']);
+ if ($portinfo['descr']) {
+ $descr .= " (" . $portinfo['descr'] . ")";
+ }
+ } elseif ($portinfo['iswlclone']) {
+ $descr = $portinfo['cloneif'];
+ if ($portinfo['descr']) {
+ $descr .= " (" . $portinfo['descr'] . ")";
+ }
+ } elseif ($portinfo['isppp']) {
+ $descr = $portinfo['descr'];
+ } elseif ($portinfo['isbridge']) {
+ $descr = strtoupper($portinfo['bridgeif']);
+ if ($portinfo['descr']) {
+ $descr .= " (" . $portinfo['descr'] . ")";
+ }
+ } elseif ($portinfo['isgre']) {
+ $descr = "GRE {$portinfo['remote-addr']}";
+ if ($portinfo['descr']) {
+ $descr .= " (" . $portinfo['descr'] . ")";
+ }
+ } elseif ($portinfo['isgif']) {
+ $descr = "GIF {$portinfo['remote-addr']}";
+ if ($portinfo['descr']) {
+ $descr .= " (" . $portinfo['descr'] . ")";
+ }
+ } elseif ($portinfo['islagg']) {
+ $descr = strtoupper($portinfo['laggif']);
+ if ($portinfo['descr']) {
+ $descr .= " (" . $portinfo['descr'] . ")";
+ }
+ } elseif ($portinfo['isqinq']) {
+ $descr = $portinfo['descr'];
+ } elseif (substr($portname, 0, 4) == 'ovpn') {
+ $descr = $portname . " (" . $ovpn_descrs[substr($portname, 5)] . ")";
+ } else {
+ $descr = $portname . " (" . $portinfo['mac'] . ")";
+ }
+
+ return htmlspecialchars($descr);
+}
+
+/*
+ In this file, "port" refers to the physical port name,
+ while "interface" refers to LAN, WAN, or OPTn.
+*/
+
+/* get list without VLAN interfaces */
+$portlist = get_interface_list();
+
+/* add wireless clone interfaces */
+if (is_array($config['wireless']['clone']) && count($config['wireless']['clone'])) {
+ foreach ($config['wireless']['clone'] as $clone) {
+ $portlist[$clone['cloneif']] = $clone;
+ $portlist[$clone['cloneif']]['iswlclone'] = true;
+ }
+}
+
+/* add VLAN interfaces */
+if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
+ foreach ($config['vlans']['vlan'] as $vlan) {
+ $portlist[$vlan['vlanif']] = $vlan;
+ $portlist[$vlan['vlanif']]['isvlan'] = true;
+ }
+}
+
+/* add Bridge interfaces */
+if (is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
+ foreach ($config['bridges']['bridged'] as $bridge) {
+ $portlist[$bridge['bridgeif']] = $bridge;
+ $portlist[$bridge['bridgeif']]['isbridge'] = true;
+ }
+}
+
+/* add GIF interfaces */
+if (is_array($config['gifs']['gif']) && count($config['gifs']['gif'])) {
+ foreach ($config['gifs']['gif'] as $gif) {
+ $portlist[$gif['gifif']] = $gif;
+ $portlist[$gif['gifif']]['isgif'] = true;
+ }
+}
+
+/* add GRE interfaces */
+if (is_array($config['gres']['gre']) && count($config['gres']['gre'])) {
+ foreach ($config['gres']['gre'] as $gre) {
+ $portlist[$gre['greif']] = $gre;
+ $portlist[$gre['greif']]['isgre'] = true;
+ }
+}
+
+/* add LAGG interfaces */
+if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
+ foreach ($config['laggs']['lagg'] as $lagg) {
+ $portlist[$lagg['laggif']] = $lagg;
+ $portlist[$lagg['laggif']]['islagg'] = true;
+ /* LAGG members cannot be assigned */
+ $lagifs = explode(',', $lagg['members']);
+ foreach ($lagifs as $lagif) {
+ if (isset($portlist[$lagif])) {
+ unset($portlist[$lagif]);
+ }
+ }
+ }
+}
+
+/* add QinQ interfaces */
+if (is_array($config['qinqs']['qinqentry']) && count($config['qinqs']['qinqentry'])) {
+ foreach ($config['qinqs']['qinqentry'] as $qinq) {
+ $portlist["vlan{$qinq['tag']}"]['descr'] = "VLAN {$qinq['tag']}";
+ $portlist["vlan{$qinq['tag']}"]['isqinq'] = true;
+ /* QinQ members */
+ $qinqifs = explode(' ', $qinq['members']);
+ foreach ($qinqifs as $qinqif) {
+ $portlist["vlan{$qinq['tag']}_{$qinqif}"]['descr'] = "QinQ {$qinqif}";
+ $portlist["vlan{$qinq['tag']}_{$qinqif}"]['isqinq'] = true;
+ }
+ }
+}
+
+/* add PPP interfaces */
+if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
+ $portname = $ppp['if'];
+ $portlist[$portname] = $ppp;
+ $portlist[$portname]['isppp'] = true;
+ $ports_base = basename($ppp['ports']);
+ if (isset($ppp['descr'])) {
+ $portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['descr']}";
+ } else if (isset($ppp['username'])) {
+ $portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['username']}";
+ } else {
+ $portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base})";
+ }
+ }
+}
+
+$ovpn_descrs = array();
+if (is_array($config['openvpn'])) {
+ if (is_array($config['openvpn']['openvpn-server'])) {
+ foreach ($config['openvpn']['openvpn-server'] as $s) {
+ $ovpn_descrs[$s['vpnid']] = $s['description'];
+ }
+ }
+ if (is_array($config['openvpn']['openvpn-client'])) {
+ foreach ($config['openvpn']['openvpn-client'] as $c) {
+ $ovpn_descrs[$c['vpnid']] = $c['description'];
+ }
+ }
+}
+
+if (isset($_POST['add_x']) && isset($_POST['if_add'])) {
+ /* Be sure this port is not being used */
+ $portused = false;
+ foreach ($config['interfaces'] as $ifname => $ifdata) {
+ if ($ifdata['if'] == $_POST['if_add']) {
+ $portused = true;
+ break;
+ }
+ }
+
+ if ($portused === false) {
+ /* find next free optional interface number */
+ if (!$config['interfaces']['lan']) {
+ $newifname = gettext("lan");
+ $descr = gettext("LAN");
+ } else {
+ for ($i = 1; $i <= count($config['interfaces']); $i++) {
+ if (!$config['interfaces']["opt{$i}"]) {
+ break;
+ }
+ }
+ $newifname = 'opt' . $i;
+ $descr = "OPT" . $i;
+ }
+
+ $config['interfaces'][$newifname] = array();
+ $config['interfaces'][$newifname]['descr'] = $descr;
+ $config['interfaces'][$newifname]['if'] = $_POST['if_add'];
+ if (preg_match($g['wireless_regex'], $_POST['if_add'])) {
+ $config['interfaces'][$newifname]['wireless'] = array();
+ interface_sync_wireless_clones($config['interfaces'][$newifname], false);
+ }
+
+ uksort($config['interfaces'], "compare_interface_friendly_names");
+
+ /* XXX: Do not remove this. */
+ unlink_if_exists("{$g['tmp_path']}/config.cache");
+
+ write_config();
+
+ $savemsg = gettext("Interface has been added.");
+ }
+
+} else if (isset($_POST['apply'])) {
+ if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
+ system_reboot();
+ $rebootingnow = true;
+ } else {
+ write_config();
+
+ $retval = filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+ }
+
+} else if (isset($_POST['Submit'])) {
+
+ unset($input_errors);
+
+ /* input validation */
+
+ /* Build a list of the port names so we can see how the interfaces map */
+ $portifmap = array();
+ foreach ($portlist as $portname => $portinfo) {
+ $portifmap[$portname] = array();
+ }
+
+ /* Go through the list of ports selected by the user,
+ build a list of port-to-interface mappings in portifmap */
+ foreach ($_POST as $ifname => $ifport) {
+ if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt')) {
+ $portifmap[$ifport][] = strtoupper($ifname);
+ }
+ }
+
+ /* Deliver error message for any port with more than one assignment */
+ foreach ($portifmap as $portname => $ifnames) {
+ if (count($ifnames) > 1) {
+ $errstr = sprintf(gettext('Port %1$s '.
+ ' was assigned to %2$s' .
+ ' interfaces:'), $portname, count($ifnames));
+
+ foreach ($portifmap[$portname] as $ifn) {
+ $errstr .= " " . convert_friendly_interface_to_friendly_descr(strtolower($ifn)) . " (" . $ifn . ")";
+ }
+
+ $input_errors[] = $errstr;
+ } else if (count($ifnames) == 1 && preg_match('/^bridge[0-9]/', $portname) && is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
+ foreach ($config['bridges']['bridged'] as $bridge) {
+ if ($bridge['bridgeif'] != $portname) {
+ continue;
+ }
+
+ $members = explode(",", strtoupper($bridge['members']));
+ foreach ($members as $member) {
+ if ($member == $ifnames[0]) {
+ $input_errors[] = sprintf(gettext("You cannot set port %s to interface %s because this interface is a member of %s."), $portname, $member, $portname);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (is_array($config['vlans']['vlan'])) {
+ foreach ($config['vlans']['vlan'] as $vlan) {
+ if (does_interface_exist($vlan['if']) == false) {
+ $input_errors[] = "Vlan parent interface {$vlan['if']} does not exist anymore so vlan id {$vlan['tag']} cannot be created please fix the issue before continuing.";
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ /* No errors detected, so update the config */
+ foreach ($_POST as $ifname => $ifport) {
+
+ if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt')) {
+
+ if (!is_array($ifport)) {
+ $reloadif = false;
+ if (!empty($config['interfaces'][$ifname]['if']) && $config['interfaces'][$ifname]['if'] <> $ifport) {
+ interface_bring_down($ifname);
+ /* Mark this to be reconfigured in any case. */
+ $reloadif = true;
+ }
+ $config['interfaces'][$ifname]['if'] = $ifport;
+ if (isset($portlist[$ifport]['isppp'])) {
+ $config['interfaces'][$ifname]['ipaddr'] = $portlist[$ifport]['type'];
+ }
+
+ if (substr($ifport, 0, 3) == 'gre' || substr($ifport, 0, 3) == 'gif') {
+ unset($config['interfaces'][$ifname]['ipaddr']);
+ unset($config['interfaces'][$ifname]['subnet']);
+ unset($config['interfaces'][$ifname]['ipaddrv6']);
+ unset($config['interfaces'][$ifname]['subnetv6']);
+ }
+
+ /* check for wireless interfaces, set or clear ['wireless'] */
+ if (preg_match($g['wireless_regex'], $ifport)) {
+ if (!is_array($config['interfaces'][$ifname]['wireless'])) {
+ $config['interfaces'][$ifname]['wireless'] = array();
+ }
+ } else {
+ unset($config['interfaces'][$ifname]['wireless']);
+ }
+
+ /* make sure there is a descr for all interfaces */
+ if (!isset($config['interfaces'][$ifname]['descr'])) {
+ $config['interfaces'][$ifname]['descr'] = strtoupper($ifname);
+ }
+
+ if ($reloadif == true) {
+ if (preg_match($g['wireless_regex'], $ifport)) {
+ interface_sync_wireless_clones($config['interfaces'][$ifname], false);
+ }
+ /* Reload all for the interface. */
+ interface_configure($ifname, true);
+ }
+ }
+ }
+ }
+
+ write_config();
+
+ enable_rrd_graphing();
+ }
+} else {
+ /* yuck - IE won't send value attributes for image buttons, while Mozilla does - so we use .x/.y to find move button clicks instead... */
+ unset($delbtn);
+ foreach ($_POST as $pn => $pd) {
+ if (preg_match("/del_(.+)_x/", $pn, $matches)) {
+ $delbtn = $matches[1];
+ }
+ }
+
+ if (isset($delbtn)) {
+ $id = $delbtn;
+
+ if (link_interface_to_group($id)) {
+ $input_errors[] = gettext("The interface is part of a group. Please remove it from the group to continue");
+ } else if (link_interface_to_bridge($id)) {
+ $input_errors[] = gettext("The interface is part of a bridge. Please remove it from the bridge to continue");
+ } else if (link_interface_to_gre($id)) {
+ $input_errors[] = gettext("The interface is part of a gre tunnel. Please delete the tunnel to continue");
+ } else if (link_interface_to_gif($id)) {
+ $input_errors[] = gettext("The interface is part of a gif tunnel. Please delete the tunnel to continue");
+ } else {
+ unset($config['interfaces'][$id]['enable']);
+ $realid = get_real_interface($id);
+ interface_bring_down($id); /* down the interface */
+
+ unset($config['interfaces'][$id]); /* delete the specified OPTn or LAN*/
+
+ if (is_array($config['dhcpd']) && is_array($config['dhcpd'][$id])) {
+ unset($config['dhcpd'][$id]);
+ services_dhcpd_configure();
+ }
+
+ if (count($config['filter']['rule']) > 0) {
+ foreach ($config['filter']['rule'] as $x => $rule) {
+ if ($rule['interface'] == $id) {
+ unset($config['filter']['rule'][$x]);
+ }
+ }
+ }
+ if (is_array($config['nat']['rule']) && count($config['nat']['rule']) > 0) {
+ foreach ($config['nat']['rule'] as $x => $rule) {
+ if ($rule['interface'] == $id) {
+ unset($config['nat']['rule'][$x]['interface']);
+ }
+ }
+ }
+
+ write_config();
+
+ /* If we are in firewall/routing mode (not single interface)
+ * then ensure that we are not running DHCP on the wan which
+ * will make a lot of ISP's unhappy.
+ */
+ if ($config['interfaces']['lan'] && $config['dhcpd']['wan']) {
+ unset($config['dhcpd']['wan']);
+ }
+
+ link_interface_to_vlans($realid, "update");
+
+ $savemsg = gettext("Interface has been deleted.");
+ }
+ }
+}
+
+/* Create a list of unused ports */
+$unused_portlist = array();
+foreach ($portlist as $portname => $portinfo) {
+ $portused = false;
+ foreach ($config['interfaces'] as $ifname => $ifdata) {
+ if ($ifdata['if'] == $portname) {
+ $portused = true;
+ break;
+ }
+ }
+ if ($portused === false) {
+ $unused_portlist[$portname] = $portinfo;
+ }
+}
+
+include("head.inc");
+
+if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
+ if ($_POST) {
+ if ($rebootingnow) {
+ $savemsg = gettext("The system is now rebooting. Please wait.");
+ } else {
+ $savemsg = gettext("Reboot is needed. Please apply the settings in order to reboot.");
+ }
+ } else {
+ $savemsg = gettext("Interface mismatch detected. Please resolve the mismatch and click 'Apply changes'. The firewall will reboot afterwards.");
+ }
+}
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<form action="interfaces_assign.php" method="post" name="iform" id="iform">
+
+<?php
+if (file_exists("/tmp/reload_interfaces")) {
+ echo "<p>\n";
+ print_info_box_np(gettext("The interface configuration has been changed.<br />You must apply the changes in order for them to take effect."));
+ echo "<br /></p>\n";
+} elseif ($savemsg) {
+ print_info_box($savemsg);
+}
+
+pfSense_handle_custom_code("/usr/local/pkg/interfaces_assign/pre_input_errors");
+if ($input_errors) {
+ print_input_errors($input_errors);
+}
+?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces assign">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), true, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+ $tab_array[7] = array(gettext("GRE"), false, "interfaces_gre.php");
+ $tab_array[8] = array(gettext("GIF"), false, "interfaces_gif.php");
+ $tab_array[9] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+ $tab_array[10] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr><td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td class="listhdrr"><?=gettext("Interface"); ?></td>
+ <td class="listhdr"><?=gettext("Network port"); ?></td>
+ <td class="list">&nbsp;</td>
+ </tr>
+<?php
+ foreach ($config['interfaces'] as $ifname => $iface):
+ if ($iface['descr']) {
+ $ifdescr = $iface['descr'];
+ } else {
+ $ifdescr = strtoupper($ifname);
+ }
+?>
+ <tr>
+ <td class="listlr" valign="middle"><strong><u><span onclick="location.href='/interfaces.php?if=<?=$ifname;?>'" style="cursor: pointer;"><?=$ifdescr;?></span></u></strong></td>
+ <td valign="middle" class="listr">
+ <select onchange="javascript:jQuery('#savediv').show();" name="<?=$ifname;?>" id="<?=$ifname;?>">
+<?php
+ foreach ($portlist as $portname => $portinfo):
+?>
+ <option value="<?=$portname;?>" <?php if ($portname == $iface['if']) echo " selected=\"selected\"";?>>
+ <?=interface_assign_description($portinfo, $portname);?>
+ </option>
+<?php
+ endforeach;
+?>
+ </select>
+ </td>
+ <td valign="middle" class="list">
+<?php
+ if ($ifname != 'wan'):
+?>
+ <input name="del_<?=$ifname;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
+ title="<?=gettext("delete interface");?>"
+ type="image" style="height:17;width:17;border:0"
+ onclick="return confirm('<?=gettext("Do you really want to delete this interface?"); ?>')" />
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+<?php
+ endforeach;
+ if (count($config['interfaces']) < count($portlist)):
+?>
+ <tr>
+ <td class="list">
+ <strong><?=gettext("Available network ports:");?></strong>
+ </td>
+ <td class="list">
+ <select name="if_add" id="if_add">
+<?php
+ foreach ($unused_portlist as $portname => $portinfo):
+?>
+ <option value="<?=$portname;?>" <?php if ($portname == $iface['if']) echo " selected=\"selected\"";?>>
+ <?=interface_assign_description($portinfo, $portname);?>
+ </option>
+<?php
+ endforeach;
+?>
+ </select>
+ </td>
+ <td class="list">
+ <input name="add" type="image" src="/themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" style="width:17;height:17;border:0" title="<?=gettext("add selected interface");?>" />
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ </table>
+ </div>
+ <br />
+ <div id='savediv' style='display:none'>
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" /><br /><br />
+ </div>
+ <ul>
+ <li><span class="vexpl"><?=gettext("Interfaces that are configured as members of a lagg(4) interface will not be shown."); ?></span></li>
+ </ul>
+ </td></tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_bridge.php b/src/usr/local/www/interfaces_bridge.php
new file mode 100644
index 0000000..b7e557f
--- /dev/null
+++ b/src/usr/local/www/interfaces_bridge.php
@@ -0,0 +1,179 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_bridge.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm
+ pfSense_MODULE: interfaces_assign
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-bridge
+##|*NAME=Interfaces: Bridge page
+##|*DESCR=Allow access to the 'Interfaces: Bridge' page.
+##|*MATCH=interfaces_bridge.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['bridges']['bridged'])) {
+ $config['bridges']['bridged'] = array();
+}
+
+$a_bridges = &$config['bridges']['bridged'] ;
+
+function bridge_inuse($num) {
+ global $config, $a_bridges;
+
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if) {
+ if ($config['interfaces'][$if]['if'] == $a_bridges[$num]['bridgeif']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+if ($_GET['act'] == "del") {
+ if (!isset($_GET['id'])) {
+ $input_errors[] = gettext("Wrong parameters supplied");
+ } else if (empty($a_bridges[$_GET['id']])) {
+ $input_errors[] = gettext("Wrong index supplied");
+ /* check if still in use */
+ } else if (bridge_inuse($_GET['id'])) {
+ $input_errors[] = gettext("This bridge cannot be deleted because it is assigned as an interface.");
+ } else {
+ if (!does_interface_exist($a_bridges[$_GET['id']]['bridgeif'])) {
+ log_error("Bridge interface does not exist, skipping ifconfig destroy.");
+ } else {
+ mwexec("/sbin/ifconfig " . $a_bridges[$_GET['id']]['bridgeif'] . " destroy");
+ }
+
+ unset($a_bridges[$_GET['id']]);
+
+ write_config();
+
+ header("Location: interfaces_bridge.php");
+ exit;
+ }
+}
+
+
+$pgtitle = array(gettext("Interfaces"), gettext("Bridge"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces bridge">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+ $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
+ $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
+ $tab_array[8] = array(gettext("Bridges"), true, "interfaces_bridge.php");
+ $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Interface"); ?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Members"); ?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+ <?php
+ $i = 0;
+ $ifdescrs = get_configured_interface_with_descr();
+ foreach ($a_bridges as $bridge):
+ ?>
+ <tr ondblclick="document.location='interfaces_bridge_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+ <?=htmlspecialchars(strtoupper($bridge['bridgeif']));?>
+ </td>
+ <td class="listr">
+ <?php
+ $members = explode(',', $bridge['members']);
+ $j = 0;
+ foreach ($members as $member) {
+ if (isset($ifdescrs[$member])) {
+ echo $ifdescrs[$member];
+ $j++;
+ }
+ if ($j > 0 && $j < count($members)) {
+ echo ", ";
+ }
+ }
+ ?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($bridge['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap"> <a href="interfaces_bridge_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="interfaces_bridge.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this bridge?"); ?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr>
+ <td class="list" colspan="3">&nbsp;</td>
+ <td class="list"> <a href="interfaces_bridge_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ <tr>
+ <td colspan="3" class="list"><p class="vexpl"><span class="red"><strong>
+ <?=gettext("Note:"); ?><br />
+ </strong></span>
+ <?=gettext("Here you can configure bridging of interfaces."); ?></p>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_bridge_edit.php b/src/usr/local/www/interfaces_bridge_edit.php
new file mode 100644
index 0000000..1787ca1
--- /dev/null
+++ b/src/usr/local/www/interfaces_bridge_edit.php
@@ -0,0 +1,708 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_bridge_edit.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-bridge-edit
+##|*NAME=Interfaces: Bridge edit page
+##|*DESCR=Allow access to the 'Interfaces: Bridge : Edit' page.
+##|*MATCH=interfaces_bridge_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_bridge.php');
+}
+
+if (!is_array($config['bridges']['bridged'])) {
+ $config['bridges']['bridged'] = array();
+}
+
+$a_bridges = &$config['bridges']['bridged'];
+
+$ifacelist = get_configured_interface_with_descr();
+foreach ($ifacelist as $bif => $bdescr) {
+ if (substr(get_real_interface($bif), 0, 3) == "gre") {
+ unset($ifacelist[$bif]);
+ }
+}
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_bridges[$id]) {
+ $pconfig['enablestp'] = isset($a_bridges[$id]['enablestp']);
+ $pconfig['descr'] = $a_bridges[$id]['descr'];
+ $pconfig['bridgeif'] = $a_bridges[$id]['bridgeif'];
+ $pconfig['members'] = $a_bridges[$id]['members'];
+ $pconfig['maxaddr'] = $a_bridges[$id]['maxaddr'];
+ $pconfig['timeout'] = $a_bridges[$id]['timeout'];
+ if ($a_bridges[$id]['static']) {
+ $pconfig['static'] = $a_bridges[$id]['static'];
+ }
+ if ($a_bridges[$id]['private']) {
+ $pconfig['private'] = $a_bridges[$id]['private'];
+ }
+ if (isset($a_bridges[$id]['stp'])) {
+ $pconfig['stp'] = $a_bridges[$id]['stp'];
+ }
+ $pconfig['maxage'] = $a_bridges[$id]['maxage'];
+ $pconfig['fwdelay'] = $a_bridges[$id]['fwdelay'];
+ $pconfig['hellotime'] = $a_bridges[$id]['hellotime'];
+ $pconfig['priority'] = $a_bridges[$id]['priority'];
+ $pconfig['proto'] = $a_bridges[$id]['proto'];
+ $pconfig['holdcnt'] = $a_bridges[$id]['holdcnt'];
+ if (!empty($a_bridges[$id]['ifpriority'])) {
+ $pconfig['ifpriority'] = explode(",", $a_bridges[$id]['ifpriority']);
+ $ifpriority = array();
+ foreach ($pconfig['ifpriority'] as $cfg) {
+ list ($key, $value) = explode(":", $cfg);
+ $embprioritycfg[$key] = $value;
+ foreach ($embprioritycfg as $key => $value) {
+ $ifpriority[$key] = $value;
+ }
+ }
+ $pconfig['ifpriority'] = $ifpriority;
+ }
+ if (!empty($a_bridges[$id]['ifpathcost'])) {
+ $pconfig['ifpathcost'] = explode(",", $a_bridges[$id]['ifpathcost']);
+ $ifpathcost = array();
+ foreach ($pconfig['ifpathcost'] as $cfg) {
+ list ($key, $value) = explode(":", $cfg);
+ $embpathcfg[$key] = $value;
+ foreach ($embpathcfg as $key => $value) {
+ $ifpathcost[$key] = $value;
+ }
+ }
+ $pconfig['ifpathcost'] = $ifpathcost;
+ }
+ $pconfig['span'] = $a_bridges[$id]['span'];
+ if (isset($a_bridges[$id]['edge'])) {
+ $pconfig['edge'] = $a_bridges[$id]['edge'];
+ }
+ if (isset($a_bridges[$id]['autoedge'])) {
+ $pconfig['autoedge'] = $a_bridges[$id]['autoedge'];
+ }
+ if (isset($a_bridges[$id]['ptp'])) {
+ $pconfig['ptp'] = $a_bridges[$id]['ptp'];
+ }
+ if (isset($a_bridges[$id]['autoptp'])) {
+ $pconfig['autoptp'] = $a_bridges[$id]['autoptp'];
+ }
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "members");
+ $reqdfieldsn = array(gettext("Member Interfaces"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['maxage'] && !is_numeric($_POST['maxage'])) {
+ $input_errors[] = gettext("Maxage needs to be an integer between 6 and 40.");
+ }
+ if ($_POST['maxaddr'] && !is_numeric($_POST['maxaddr'])) {
+ $input_errors[] = gettext("Maxaddr needs to be an integer.");
+ }
+ if ($_POST['timeout'] && !is_numeric($_POST['timeout'])) {
+ $input_errors[] = gettext("Timeout needs to be an integer.");
+ }
+ if ($_POST['fwdelay'] && !is_numeric($_POST['fwdelay'])) {
+ $input_errors[] = gettext("Forward Delay needs to be an integer between 4 and 30.");
+ }
+ if ($_POST['hellotime'] && !is_numeric($_POST['hellotime'])) {
+ $input_errors[] = gettext("Hello time for STP needs to be an integer between 1 and 2.");
+ }
+ if ($_POST['priority'] && !is_numeric($_POST['priority'])) {
+ $input_errors[] = gettext("Priority for STP needs to be an integer between 0 and 61440.");
+ }
+ if ($_POST['holdcnt'] && !is_numeric($_POST['holdcnt'])) {
+ $input_errors[] = gettext("Transmit Hold Count for STP needs to be an integer between 1 and 10.");
+ }
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ if ($_POST[$ifn] <> "" && !is_numeric($_POST[$ifn])) {
+ $input_errors[] = "{$ifdescr} " . gettext("interface priority for STP needs to be an integer between 0 and 240.");
+ }
+ }
+ $i = 0;
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ if ($_POST["{$ifn}{$i}"] <> "" && !is_numeric($_POST["{$ifn}{$i}"])) {
+ $input_errors[] = "{$ifdescr} " . gettext("interface path cost for STP needs to be an integer between 1 and 200000000.");
+ }
+ $i++;
+ }
+
+ if (!is_array($_POST['members']) || count($_POST['members']) < 1) {
+ $input_errors[] = gettext("You must select at least one member interface for a bridge.");
+ }
+
+ if (is_array($_POST['members'])) {
+ foreach ($_POST['members'] as $ifmembers) {
+ if (empty($config['interfaces'][$ifmembers])) {
+ $input_errors[] = gettext("A member interface passed does not exist in configuration");
+ }
+ if (is_array($config['interfaces'][$ifmembers]['wireless']) &&
+ $config['interfaces'][$ifmembers]['wireless']['mode'] != "hostap") {
+ $input_errors[] = gettext("Bridging a wireless interface is only possible in hostap mode.");
+ }
+ if ($_POST['span'] != "none" && $_POST['span'] == $ifmembers) {
+ $input_errors[] = gettext("Span interface cannot be part of the bridge. Remove the span interface from bridge members to continue.");
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ $bridge = array();
+ $bridge['members'] = implode(',', $_POST['members']);
+ $bridge['enablestp'] = $_POST['enablestp'] ? true : false;
+ $bridge['descr'] = $_POST['descr'];
+ $bridge['maxaddr'] = $_POST['maxaddr'];
+ $bridge['timeout'] = $_POST['timeout'];
+ if ($_POST['static']) {
+ $bridge['static'] = implode(',', $_POST['static']);
+ }
+ if ($_POST['private']) {
+ $bridge['private'] = implode(',', $_POST['private']);
+ }
+ if (isset($_POST['stp'])) {
+ $bridge['stp'] = implode(',', $_POST['stp']);
+ }
+ $bridge['maxage'] = $_POST['maxage'];
+ $bridge['fwdelay'] = $_POST['fwdelay'];
+ $bridge['hellotime'] = $_POST['hellotime'];
+ $bridge['priority'] = $_POST['priority'];
+ $bridge['proto'] = $_POST['proto'];
+ $bridge['holdcnt'] = $_POST['holdcnt'];
+ $i = 0;
+ $ifpriority = "";
+ $ifpathcost = "";
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ if ($_POST[$ifn] <> "") {
+ if ($i > 0) {
+ $ifpriority .= ",";
+ }
+ $ifpriority .= $ifn.":".$_POST[$ifn];
+ }
+ if ($_POST["{$ifn}0"] <> "") {
+ if ($i > 0) {
+ $ifpathcost .= ",";
+ }
+ $ifpathcost .= $ifn.":".$_POST["{$ifn}0"];
+ }
+ $i++;
+ }
+ $bridge['ifpriority'] = $ifpriority;
+ $bridge['ifpathcost'] = $ifpathcost;
+
+ if ($_POST['span'] != "none") {
+ $bridge['span'] = $_POST['span'];
+ } else {
+ unset($bridge['span']);
+ }
+ if (isset($_POST['edge'])) {
+ $bridge['edge'] = implode(',', $_POST['edge']);
+ }
+ if (isset($_POST['autoedge'])) {
+ $bridge['autoedge'] = implode(',', $_POST['autoedge']);
+ }
+ if (isset($_POST['ptp'])) {
+ $bridge['ptp'] = implode(',', $_POST['ptp']);
+ }
+ if (isset($_POST['autoptp'])) {
+ $bridge['autoptp'] = implode(',', $_POST['autoptp']);
+ }
+
+ $bridge['bridgeif'] = $_POST['bridgeif'];
+ interface_bridge_configure($bridge);
+ if ($bridge['bridgeif'] == "" || !stristr($bridge['bridgeif'], "bridge")) {
+ $input_errors[] = gettext("Error occurred creating interface, please retry.");
+ } else {
+ if (isset($id) && $a_bridges[$id]) {
+ $a_bridges[$id] = $bridge;
+ } else {
+ $a_bridges[] = $bridge;
+ }
+
+ write_config();
+
+ $confif = convert_real_interface_to_friendly_interface_name($bridge['bridgeif']);
+ if ($confif <> "") {
+ interface_configure($confif);
+ }
+
+ header("Location: interfaces_bridge.php");
+ exit;
+ }
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("Bridge"), gettext("Edit"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script type="text/javascript">
+//<![CDATA[
+function show_source_port_range() {
+ document.getElementById("sprtable").style.display = 'none';
+ document.getElementById("sprtable1").style.display = '';
+ document.getElementById("sprtable2").style.display = '';
+ document.getElementById("sprtable3").style.display = '';
+ document.getElementById("sprtable4").style.display = '';
+ document.getElementById("sprtable5").style.display = '';
+ document.getElementById("sprtable6").style.display = '';
+ document.getElementById("sprtable7").style.display = '';
+ document.getElementById("sprtable8").style.display = '';
+ document.getElementById("sprtable9").style.display = '';
+ document.getElementById("sprtable10").style.display = '';
+}
+//]]>
+</script>
+
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php $size=count($ifacelist); ?>
+<form action="interfaces_bridge_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces bridge edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Bridge configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Member interfaces"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="members[]" multiple="multiple" class="formselect" size="<?php echo $size; ?>">
+ <?php
+ $members_array = explode(',', $pconfig['members']);
+ foreach ($ifacelist as $ifn => $ifinfo) {
+ echo "<option value=\"{$ifn}\"";
+ if (in_array($ifn, $members_array)) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifinfo}</option>";
+ }
+ unset($members_array);
+ ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Interfaces participating in the bridge."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="text" name="descr" id="descr" class="formfld unknown" size="50" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ </td>
+ </tr>
+ <tr id="sprtable">
+ <td></td>
+ <td>
+ <p><input type="button" onclick="show_source_port_range()" value="<?=gettext("Show advanced options"); ?>" /></p>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable1">
+ <td valign="top" class="vncell" align="center"><?=gettext("RSTP/STP"); ?> </td>
+ <td class="vtable">
+ <input type="checkbox" name="enablestp" id="enablestp" <?php if ($pconfig['enablestp']) echo "checked=\"checked\"";?> />
+ <span class="vexpl"><strong><?=gettext("Enable spanning tree options for this bridge."); ?> </strong></span>
+ <br /><br />
+ <table id="stpoptions" border="0" cellpadding="6" cellspacing="0" summary="protocol">
+ <tr>
+ <td valign="top" class="vncell" width="20%"><?=gettext("Protocol"); ?></td>
+ <td class="vtable" width="80%">
+ <select name="proto" id="proto">
+ <?php
+ foreach (array("rstp", "stp") as $proto) {
+ echo "<option value=\"{$proto}\"";
+ if ($pconfig['proto'] == $proto) {
+ echo " selected=\"selected\"";
+ }
+ echo ">".strtoupper($proto)."</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Protocol used for spanning tree."); ?> </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell" width="20%"><?=gettext("STP interfaces"); ?></td>
+ <td class="vtable" width="80%">
+ <select name="stp[]" class="formselect" multiple="multiple" size="3">
+ <?php
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<option value=\"{$ifn}\"";
+ if (stristr($pconfig['stp'], $ifn)) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl" >
+ <?=gettext("Enable Spanning Tree Protocol on interface. The if_bridge(4) " .
+ "driver has support for the IEEE 802.1D Spanning Tree Protocol " .
+ "(STP). STP is used to detect and remove loops in a " .
+ "network topology."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell" width="20%"><?=gettext("Valid time"); ?></td>
+ <td class="vtable" width="80%">
+ <input name="maxage" type="text" class="formfld unknown" id="maxage" size="8" value="<?=htmlspecialchars($pconfig['maxage']);?>" /> <?=gettext("seconds"); ?>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set the time that a Spanning Tree Protocol configuration is " .
+ "valid. The default is 20 seconds. The minimum is 6 seconds and " .
+ "the maximum is 40 seconds."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell" width="20%"><?=gettext("Forward time"); ?> </td>
+ <td class="vtable" width="80%">
+ <input name="fwdelay" type="text" class="formfld unknown" id="fwdelay" size="8" value="<?=htmlspecialchars($pconfig['fwdelay']);?>" /> <?=gettext("seconds"); ?>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set the time that must pass before an interface begins forwarding " .
+ "packets when Spanning Tree is enabled. The default is 15 seconds. The minimum is 4 seconds and the maximum is 30 seconds."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell" width="20%"><?=gettext("Hello time"); ?></td>
+ <td class="vtable" width="80%">
+ <input name="hellotime" type="text" class="formfld unknown" size="8" id="hellotime" value="<?=htmlspecialchars($pconfig['hellotime']);?>" /> <?=gettext("seconds"); ?>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set the time between broadcasting of Spanning Tree Protocol configuration messages. The hello time may only be changed when " .
+ "operating in legacy STP mode. The default is 2 seconds. The minimum is 1 second and the maximum is 2 seconds."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell" width="20%"><?=gettext("Priority"); ?></td>
+ <td class="vtable" width="80%">
+ <input name="priority" type="text" class="formfld unknown" id="priority" value="<?=htmlspecialchars($pconfig['priority']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set the bridge priority for Spanning Tree. The default is 32768. " .
+ "The minimum is 0 and the maximum is 61440."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell" width="20%"><?=gettext("Hold count"); ?></td>
+ <td class="vtable" width="80%">
+ <input name="holdcnt" type="text" class="formfld unknown" id="holdcnt" value="<?=htmlspecialchars($pconfig['holdcnt']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set the transmit hold count for Spanning Tree. This is the number" .
+ " of packets transmitted before being rate limited. The " .
+ "default is 6. The minimum is 1 and the maximum is 10."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell" width="20%"><?=gettext("Priority"); ?></td>
+ <td class="vtable" width="80%">
+ <table summary="priority">
+ <?php
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<tr><td>{$ifdescr}</td><td><input size=\"5\" name=\"{$ifn}\" type=\"text\" class=\"formfld unknown\" id=\"{$ifn}\" value=\"{$ifpriority[$ifn]}\" /></td></tr>";
+ }
+ ?>
+ <tr>
+ <td></td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl" >
+ <?=gettext("Set the Spanning Tree priority of interface to value. The " .
+ "default is 128. The minimum is 0 and the maximum is 240. Increments of 16."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell" width="20%"><?=gettext("Path cost"); ?></td>
+ <td class="vtable" width="80%">
+ <table summary="path cost">
+ <?php
+ $i = 0;
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<tr><td>{$ifdescr}</td><td><input size=\"8\" name=\"{$ifn}{$i}\" type=\"text\" class=\"formfld unknown\" id=\"{$ifn}{$i}\" value=\"{$ifpathcost[$ifn]}\" /></td></tr>";
+ }
+ ?>
+ <tr>
+ <td></td>
+ </tr>
+ </table>
+ <br />
+ <span class="vexpl" >
+ <?=gettext("Set the Spanning Tree path cost of interface to value. The " .
+ "default is calculated from the link speed. To change a previously selected path cost back to automatic, set the cost to 0. ".
+ "The minimum is 1 and the maximum is 200000000."); ?>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable2">
+ <td valign="top" class="vncell"><?=gettext("Cache size"); ?></td>
+ <td class="vtable">
+ <input name="maxaddr" size="10" type="text" class="formfld unknown" id="maxaddr" value="<?=htmlspecialchars($pconfig['maxaddr']);?>" /> <?=gettext("entries"); ?>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set the size of the bridge address cache to size. The default is " .
+ ".100 entries."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable3">
+ <td valign="top" class="vncell"><?=gettext("Cache entry expire time"); ?></td>
+ <td>
+ <input name="timeout" type="text" class="formfld unknown" id="timeout" size="10" value="<?=htmlspecialchars($pconfig['timeout']);?>" /> <?=gettext("seconds"); ?>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set the timeout of address cache entries to this number of seconds. If " .
+ "seconds is zero, then address cache entries will not be expired. " .
+ "The default is 240 seconds."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable4">
+ <td valign="top" class="vncell"><?=gettext("Span port"); ?></td>
+ <td class="vtable">
+ <select name="span" class="formselect" id="span">
+ <option value="none" selected="selected"><?=gettext("None"); ?></option>
+ <?php
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<option value=\"{$ifn}\"";
+ if ($ifn == $pconfig['span']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Add the interface named by interface as a span port on the " .
+ "bridge. Span ports transmit a copy of every frame received by " .
+ "the bridge. This is most useful for snooping a bridged network " .
+ "passively on another host connected to one of the span ports of " .
+ "the bridge."); ?>
+ </span>
+ <p class="vexpl">
+ <span class="red"><strong>
+ <?=gettext("Note:"); ?><br />
+ </strong></span>
+ <?=gettext("The span interface cannot be part of the bridge member interfaces."); ?>
+ </p>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable5">
+ <td valign="top" class="vncell"><?=gettext("Edge ports"); ?></td>
+ <td class="vtable">
+ <select name="edge[]" class="formselect" multiple="multiple" size="3">
+ <?php
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<option value=\"{$ifn}\"";
+ if (stristr($pconfig['edge'], $ifn)) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set interface as an edge port. An edge port connects directly to " .
+ "end stations and cannot create bridging loops in the network; this " .
+ "allows it to transition straight to forwarding."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable6">
+ <td valign="top" class="vncell"><?=gettext("Auto Edge ports"); ?></td>
+ <td class="vtable">
+ <select name="autoedge[]" class="formselect" multiple="multiple" size="3">
+ <?php
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<option value=\"{$ifn}\"";
+ if (stristr($pconfig['autoedge'], $ifn)) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Allow interface to automatically detect edge status. This is the " .
+ "default for all interfaces added to a bridge."); ?>
+ </span>
+ <p class="vexpl">
+ <span class="red"><strong>
+ <?=gettext("Note:"); ?><br />
+ </strong></span>
+ <?=gettext("This will disable the autoedge status of interfaces."); ?>
+ </p>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable7">
+ <td valign="top" class="vncell"><?=gettext("PTP ports"); ?></td>
+ <td class="vtable">
+ <select name="ptp[]" class="formselect" multiple="multiple" size="3">
+ <?php
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<option value=\"{$ifn}\"";
+ if (stristr($pconfig['ptp'], $ifn)) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set the interface as a point-to-point link. This is required for " .
+ "straight transitions to forwarding and should be enabled on a " .
+ "direct link to another RSTP-capable switch."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable8">
+ <td valign="top" class="vncell"><?=gettext("Auto PTP ports"); ?></td>
+ <td class="vtable">
+ <select name="autoptp[]" class="formselect" multiple="multiple" size="3">
+ <?php
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<option value=\"{$ifn}\"";
+ if (stristr($pconfig['autoptp'], $ifn)) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Automatically detect the point-to-point status on interface by " .
+ "checking the full duplex link status. This is the default for " .
+ "interfaces added to the bridge."); ?>
+ </span>
+ <p class="vexpl">
+ <span class="red"><strong>
+ <?=gettext("Note:"); ?><br />
+ </strong></span>
+ <?=gettext("The interfaces selected here will be removed from default autoedge status."); ?>
+ </p>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable9">
+ <td valign="top" class="vncell"><?=gettext("Sticky ports"); ?></td>
+ <td class="vtable">
+ <select name="static[]" class="formselect" multiple="multiple" size="3">
+ <?php
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<option value=\"{$ifn}\"";
+ if (stristr($pconfig['static'], $ifn)) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Mark an interface as a \"sticky\" interface. Dynamically learned " .
+ "address entries are treated as static once entered into the " .
+ "cache. Sticky entries are never aged out of the cache or " .
+ "replaced, even if the address is seen on a different interface."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr style="display:none" id="sprtable10">
+ <td valign="top" class="vncell"><?=gettext("Private ports"); ?></td>
+ <td class="vtable">
+ <select name="private[]" class="formselect" multiple="multiple" size="3">
+ <?php
+ foreach ($ifacelist as $ifn => $ifdescr) {
+ echo "<option value=\"{$ifn}\"";
+ if (stristr($pconfig['private'], $ifn)) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Mark an interface as a \"private\" interface. A private interface does not forward any traffic to any other port that is also " .
+ "a private interface."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="bridgeif" value="<?=htmlspecialchars($pconfig['bridgeif']); ?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_bridges[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_gif.php b/src/usr/local/www/interfaces_gif.php
new file mode 100644
index 0000000..0730090
--- /dev/null
+++ b/src/usr/local/www/interfaces_gif.php
@@ -0,0 +1,162 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_gif.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-gif
+##|*NAME=Interfaces: GIF page
+##|*DESCR=Allow access to the 'Interfaces: GIF' page.
+##|*MATCH=interfaces_gif.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['gifs']['gif'])) {
+ $config['gifs']['gif'] = array();
+}
+
+$a_gifs = &$config['gifs']['gif'] ;
+
+function gif_inuse($num) {
+ global $config, $a_gifs;
+
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if) {
+ if ($config['interfaces'][$if]['if'] == $a_gifs[$num]['gifif']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+if ($_GET['act'] == "del") {
+ if (!isset($_GET['id'])) {
+ $input_errors[] = gettext("Wrong parameters supplied");
+ } else if (empty($a_gifs[$_GET['id']])) {
+ $input_errors[] = gettext("Wrong index supplied");
+ /* check if still in use */
+ } else if (gif_inuse($_GET['id'])) {
+ $input_errors[] = gettext("This gif TUNNEL cannot be deleted because it is still being used as an interface.");
+ } else {
+ mwexec("/sbin/ifconfig " . $a_gifs[$_GET['id']]['gifif'] . " destroy");
+ unset($a_gifs[$_GET['id']]);
+
+ write_config();
+
+ header("Location: interfaces_gif.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("GIF"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces gif">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+ $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
+ $tab_array[7] = array(gettext("GIF"), true, "interfaces_gif.php");
+ $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+ $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Interface"); ?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Tunnel to..."); ?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+ <?php
+ $i = 0;
+ foreach ($a_gifs as $gif):
+ ?>
+ <tr ondblclick="document.location='interfaces_gif_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($gif['if']));?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($gif['remote-addr']);?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($gif['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap"> <a href="interfaces_gif_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="interfaces_gif.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this gif tunnel?"); ?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr>
+ <td class="list" colspan="3">&nbsp;</td>
+ <td class="list"> <a href="interfaces_gif_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ <tr>
+ <td colspan="3" class="list"><p class="vexpl"><span class="red"><strong>
+ <?=gettext("Note:"); ?><br />
+ </strong></span>
+ <?=gettext("GIF tunnels are configured here."); ?>
+ <br /><br />
+ <?php echo gettext("If you are using a GIF tunnel to connect to a Hurricane Electric (he.net) Tunnel Broker on a WAN with a dynamic IP, you may want to add a"); ?> <a href="services_dyndns.php"><?php echo gettext("HE.net Tunnelbroker type DynDNS Entry"); ?></a> <?php echo gettext("to keep your tunnel functional when your IP changes."); ?></p>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_gif_edit.php b/src/usr/local/www/interfaces_gif_edit.php
new file mode 100644
index 0000000..2870c79
--- /dev/null
+++ b/src/usr/local/www/interfaces_gif_edit.php
@@ -0,0 +1,272 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_gif_edit.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-gif-edit
+##|*NAME=Interfaces: GIF: Edit page
+##|*DESCR=Allow access to the 'Interfaces: GIF: Edit' page.
+##|*MATCH=interfaces_gif_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_gif.php');
+}
+
+if (!is_array($config['gifs']['gif'])) {
+ $config['gifs']['gif'] = array();
+}
+
+$a_gifs = &$config['gifs']['gif'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_gifs[$id]) {
+ $pconfig['if'] = $a_gifs[$id]['if'];
+ if (!empty($a_gifs[$id]['ipaddr'])) {
+ $pconfig['if'] = $pconfig['if'] . '|' . $a_gifs[$id]['ipaddr'];
+ }
+ $pconfig['gifif'] = $a_gifs[$id]['gifif'];
+ $pconfig['remote-addr'] = $a_gifs[$id]['remote-addr'];
+ $pconfig['tunnel-remote-net'] = $a_gifs[$id]['tunnel-remote-net'];
+ $pconfig['tunnel-local-addr'] = $a_gifs[$id]['tunnel-local-addr'];
+ $pconfig['tunnel-remote-addr'] = $a_gifs[$id]['tunnel-remote-addr'];
+ $pconfig['link1'] = isset($a_gifs[$id]['link1']);
+ $pconfig['link0'] = isset($a_gifs[$id]['link0']);
+ $pconfig['descr'] = $a_gifs[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "if remote-addr tunnel-local-addr tunnel-remote-addr tunnel-remote-net");
+ $reqdfieldsn = array(gettext("Parent interface"), gettext("gif remote address"), gettext("gif tunnel local address"), gettext("gif tunnel remote address"), gettext("gif tunnel remote netmask"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ((!is_ipaddr($_POST['tunnel-local-addr'])) ||
+ (!is_ipaddr($_POST['tunnel-remote-addr'])) ||
+ (!is_ipaddr($_POST['remote-addr']))) {
+ $input_errors[] = gettext("The tunnel local and tunnel remote fields must have valid IP addresses.");
+ }
+
+ $alias = strstr($_POST['if'], '|');
+ if ((is_ipaddrv4($alias) && !is_ipaddrv4($_POST['remote-addr'])) ||
+ (is_ipaddrv6($alias) && !is_ipaddrv6($_POST['remote-addr']))) {
+ $input_errors[] = gettext("The alias IP address family has to match the family of the remote peer address.");
+ }
+
+ foreach ($a_gifs as $gif) {
+ if (isset($id) && ($a_gifs[$id]) && ($a_gifs[$id] === $gif)) {
+ continue;
+ }
+
+ /* FIXME: needs to perform proper subnet checks in the future */
+ if (($gif['if'] == $interface) && ($gif['tunnel-remote-addr'] == $_POST['tunnel-remote-addr'])) {
+ $input_errors[] = sprintf(gettext("A gif with the network %s is already defined."), $gif['tunnel-remote-addr']);
+ break;
+ }
+ }
+
+ if (!$input_errors) {
+ $gif = array();
+ list($gif['if'], $gif['ipaddr']) = explode("|", $_POST['if']);
+ $gif['tunnel-local-addr'] = $_POST['tunnel-local-addr'];
+ $gif['tunnel-remote-addr'] = $_POST['tunnel-remote-addr'];
+ $gif['tunnel-remote-net'] = $_POST['tunnel-remote-net'];
+ $gif['remote-addr'] = $_POST['remote-addr'];
+ $gif['descr'] = $_POST['descr'];
+ $gif['link1'] = isset($_POST['link1']);
+ $gif['link0'] = isset($_POST['link0']);
+ $gif['gifif'] = $_POST['gifif'];
+
+ $gif['gifif'] = interface_gif_configure($gif);
+ if ($gif['gifif'] == "" || !stristr($gif['gifif'], "gif")) {
+ $input_errors[] = gettext("Error occurred creating interface, please retry.");
+ } else {
+ if (isset($id) && $a_gifs[$id]) {
+ $a_gifs[$id] = $gif;
+ } else {
+ $a_gifs[] = $gif;
+ }
+
+ write_config();
+
+ $confif = convert_real_interface_to_friendly_interface_name($gif['gifif']);
+ if ($confif <> "") {
+ interface_configure($confif);
+ }
+
+ header("Location: interfaces_gif.php");
+ exit;
+ }
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("GIF"), gettext("Edit"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="interfaces_gif_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces gif edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("GIF configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="if" class="formselect">
+ <?php
+ $portlist = get_possible_listen_ips();
+ foreach ($portlist as $ifn => $ifinfo) {
+ echo "<option value=\"{$ifn}\"";
+ if ($ifn == $pconfig['if']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($ifinfo) . "</option>\n";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("The interface here serves as the local address to be used for the gif tunnel."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("gif remote address"); ?></td>
+ <td class="vtable">
+ <input name="remote-addr" type="text" class="formfld unknown" id="remote-addr" size="24" value="<?=htmlspecialchars($pconfig['remote-addr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Peer address where encapsulated gif packets will be sent. "); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("gif tunnel local address"); ?></td>
+ <td class="vtable">
+ <input name="tunnel-local-addr" type="text" class="formfld unknown" id="tunnel-local-addr" size="24" value="<?=htmlspecialchars($pconfig['tunnel-local-addr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Local gif tunnel endpoint"); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("gif tunnel remote address "); ?></td>
+ <td class="vtable">
+ <input name="tunnel-remote-addr" type="text" class="formfld unknown ipv4v6" id="tunnel-remote-addr" size="24" value="<?=htmlspecialchars($pconfig['tunnel-remote-addr']);?>" />
+ <select name="tunnel-remote-net" class="formselect ipv4v6" id="tunnel-remote-net">
+ <?php
+ for ($i = 128; $i > 0; $i--) {
+ echo "<option value=\"{$i}\"";
+ if ($i == $pconfig['tunnel-remote-net']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . $i . "</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Remote gif address endpoint. The subnet part is used for determining the network that is tunnelled."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Route caching "); ?></td>
+ <td class="vtable">
+ <input name="link0" type="checkbox" id="link0" <?if ($pconfig['link0']) echo "checked=\"checked\"";?> />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Specify if route caching can be enabled. Be careful with these settings on dynamic networks. "); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("ECN friendly behavior"); ?></td>
+ <td class="vtable">
+ <input name="link1" type="checkbox" id="link1" <?if ($pconfig['link1']) echo "checked=\"checked\"";?> />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Note that the ECN friendly behavior violates RFC2893. This should be " .
+ "used in mutual agreement with the peer."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed)."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="gifif" value="<?=htmlspecialchars($pconfig['gifif']); ?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_gifs[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_gre.php b/src/usr/local/www/interfaces_gre.php
new file mode 100644
index 0000000..3431987
--- /dev/null
+++ b/src/usr/local/www/interfaces_gre.php
@@ -0,0 +1,158 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_gre.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-gre
+##|*NAME=Interfaces: GRE page
+##|*DESCR=Allow access to the 'Interfaces: GRE' page.
+##|*MATCH=interfaces_gre.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+
+if (!is_array($config['gres']['gre'])) {
+ $config['gres']['gre'] = array();
+}
+
+$a_gres = &$config['gres']['gre'] ;
+
+function gre_inuse($num) {
+ global $config, $a_gres;
+
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if) {
+ if ($config['interfaces'][$if]['if'] == $a_gres[$num]['greif']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+if ($_GET['act'] == "del") {
+ if (!isset($_GET['id'])) {
+ $input_errors[] = gettext("Wrong parameters supplied");
+ } else if (empty($a_gres[$_GET['id']])) {
+ $input_errors[] = gettext("Wrong index supplied");
+ /* check if still in use */
+ } else if (gre_inuse($_GET['id'])) {
+ $input_errors[] = gettext("This GRE tunnel cannot be deleted because it is still being used as an interface.");
+ } else {
+ mwexec("/sbin/ifconfig " . $a_gres[$_GET['id']]['greif'] . " destroy");
+ unset($a_gres[$_GET['id']]);
+
+ write_config();
+
+ header("Location: interfaces_gre.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("GRE"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces gre">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+ $tab_array[6] = array(gettext("GRE"), true, "interfaces_gre.php");
+ $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
+ $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+ $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Tunnel to...");?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+ <?php
+ $i = 0;
+ foreach ($a_gres as $gre):
+ ?>
+ <tr ondblclick="document.location='interfaces_gre_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($gre['if']));?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($gre['remote-addr']);?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($gre['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap"> <a href="interfaces_gre_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="interfaces_gre.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this GRE tunnel?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr>
+ <td class="list" colspan="3">&nbsp;</td>
+ <td class="list"> <a href="interfaces_gre_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ <tr>
+ <td class="tabcont" colspan="3">
+ <p><span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br /></strong></span><?=gettext("Here you can configure Generic Routing Encapsulation (GRE - RFC 2784) tunnels.");?></span></p>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_gre_edit.php b/src/usr/local/www/interfaces_gre_edit.php
new file mode 100644
index 0000000..a6cde04
--- /dev/null
+++ b/src/usr/local/www/interfaces_gre_edit.php
@@ -0,0 +1,262 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_gre_edit.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-gre-edit
+##|*NAME=Interfaces: GRE: Edit page
+##|*DESCR=Allow access to the 'Interfaces: GRE: Edit' page.
+##|*MATCH=interfaces_gre_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_gre.php');
+}
+
+if (!is_array($config['gres']['gre'])) {
+ $config['gres']['gre'] = array();
+}
+
+$a_gres = &$config['gres']['gre'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_gres[$id]) {
+ $pconfig['if'] = $a_gres[$id]['if'];
+ $pconfig['greif'] = $a_gres[$id]['greif'];
+ $pconfig['remote-addr'] = $a_gres[$id]['remote-addr'];
+ $pconfig['tunnel-remote-net'] = $a_gres[$id]['tunnel-remote-net'];
+ $pconfig['tunnel-local-addr'] = $a_gres[$id]['tunnel-local-addr'];
+ $pconfig['tunnel-remote-addr'] = $a_gres[$id]['tunnel-remote-addr'];
+ $pconfig['link1'] = isset($a_gres[$id]['link1']);
+ $pconfig['link2'] = isset($a_gres[$id]['link2']);
+ $pconfig['link0'] = isset($a_gres[$id]['link0']);
+ $pconfig['descr'] = $a_gres[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "if remote-addr tunnel-local-addr tunnel-remote-addr tunnel-remote-net");
+ $reqdfieldsn = array(gettext("Parent interface"), gettext("Remote tunnel endpoint IP address"), gettext("Local tunnel IP address"), gettext("Remote tunnel IP address"), gettext("Remote tunnel network"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ((!is_ipaddr($_POST['tunnel-local-addr'])) ||
+ (!is_ipaddr($_POST['tunnel-remote-addr'])) ||
+ (!is_ipaddr($_POST['remote-addr']))) {
+ $input_errors[] = gettext("The tunnel local and tunnel remote fields must have valid IP addresses.");
+ }
+
+ foreach ($a_gres as $gre) {
+ if (isset($id) && ($a_gres[$id]) && ($a_gres[$id] === $gre)) {
+ continue;
+ }
+
+ if (($gre['if'] == $_POST['if']) && ($gre['tunnel-remote-addr'] == $_POST['tunnel-remote-addr'])) {
+ $input_errors[] = sprintf(gettext("A GRE tunnel with the network %s is already defined."), $gre['remote-network']);
+ break;
+ }
+ }
+
+ if (!$input_errors) {
+ $gre = array();
+ $gre['if'] = $_POST['if'];
+ $gre['tunnel-local-addr'] = $_POST['tunnel-local-addr'];
+ $gre['tunnel-remote-addr'] = $_POST['tunnel-remote-addr'];
+ $gre['tunnel-remote-net'] = $_POST['tunnel-remote-net'];
+ $gre['remote-addr'] = $_POST['remote-addr'];
+ $gre['descr'] = $_POST['descr'];
+ $gre['link1'] = isset($_POST['link1']);
+ $gre['link2'] = isset($_POST['link2']);
+ $gre['link0'] = isset($_POST['link0']);
+ $gre['greif'] = $_POST['greif'];
+
+ $gre['greif'] = interface_gre_configure($gre);
+ if ($gre['greif'] == "" || !stristr($gre['greif'], "gre")) {
+ $input_errors[] = gettext("Error occurred creating interface, please retry.");
+ } else {
+ if (isset($id) && $a_gres[$id]) {
+ $a_gres[$id] = $gre;
+ } else {
+ $a_gres[] = $gre;
+ }
+
+ write_config();
+
+ $confif = convert_real_interface_to_friendly_interface_name($gre['greif']);
+ if ($confif <> "") {
+ interface_configure($confif);
+ }
+
+ header("Location: interfaces_gre.php");
+ exit;
+ }
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("GRE"), gettext("Edit"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="interfaces_gre_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces gre edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("GRE configuration");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface");?></td>
+ <td width="78%" class="vtable">
+ <select name="if" class="formselect">
+ <?php
+ $portlist = get_possible_listen_ips();
+ foreach ($portlist as $ifn => $ifinfo) {
+ echo "<option value=\"{$ifn}\"";
+ if ($ifn == $pconfig['if']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($ifinfo) . "</option>\n";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("The interface here serves as the local address to be used for the GRE tunnel.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Remote tunnel endpoint IP address");?></td>
+ <td class="vtable">
+ <input name="remote-addr" type="text" class="formfld unknown" id="remote-addr" size="16" value="<?=htmlspecialchars($pconfig['remote-addr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Peer address where encapsulated GRE packets will be sent ");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Local tunnel IP address ");?></td>
+ <td class="vtable">
+ <input name="tunnel-local-addr" type="text" class="formfld unknown" id="tunnel-local-addr" size="16" value="<?=htmlspecialchars($pconfig['tunnel-local-addr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Local IP address assigned inside this tunnel");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Remote tunnel IP address ");?></td>
+ <td class="vtable">
+ <input name="tunnel-remote-addr" type="text" class="formfld unknown ipv4v6" id="tunnel-remote-addr" size="16" value="<?=htmlspecialchars($pconfig['tunnel-remote-addr']);?>" />
+ <select name="tunnel-remote-net" class="formselect ipv4v6" id="tunnel-remote-net">
+ <?php
+ for ($i = 128; $i > 0; $i--) {
+ echo "<option value=\"{$i}\"";
+ if ($i == $pconfig['tunnel-remote-net']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . $i . "</option>";
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("IP address inside this tunnel on the remote end. The subnet part is used for the determining the network that is tunneled.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Mobile encapsulation");?></td>
+ <td class="vtable">
+ <input name="link0" type="checkbox" id="link0" <?if ($pconfig['link0']) echo "checked=\"checked\"";?> />
+ <br />
+ <span class="vexpl"><?=gettext("Check this box to use mobile encapsulation (IP protocol 55, RFC 2004). When unchecked, uses GRE encapsulation (IP protocol 47, RFCs 1701, 1702).");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Route search type");?></td>
+ <td class="vtable">
+ <input name="link1" type="checkbox" id="link1" <?if ($pconfig['link1']) echo "checked=\"checked\"";?> />
+ <br />
+ <span class="vexpl">
+ <?=gettext("For correct operation, the GRE device needs a route to the destination".
+ " that is less specific than the one over the tunnel. (Basically, there".
+ " needs to be a route to the decapsulating host that does not run over the".
+ " tunnel, as this would be a loop.");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("WCCP version");?></td>
+ <td class="vtable">
+ <input name="link2" type="checkbox" id="link2" <?if ($pconfig['link2']) echo "checked=\"checked\"";?> />
+ <br />
+ <span class="vexpl"><?=gettext("Check this box for WCCP encapsulation version 2, or leave unchecked for version 1.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="greif" value="<?=htmlspecialchars($pconfig['greif']); ?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_gres[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_groups.php b/src/usr/local/www/interfaces_groups.php
new file mode 100644
index 0000000..6342bcf
--- /dev/null
+++ b/src/usr/local/www/interfaces_groups.php
@@ -0,0 +1,171 @@
+<?php
+/*
+ interfaces_groups.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009 Ermal Luçi
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-groups
+##|*NAME=Interfaces: Groups page
+##|*DESCR=Create interface groups
+##|*MATCH=interfaces_groups.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+
+if (!is_array($config['ifgroups']['ifgroupentry'])) {
+ $config['ifgroups']['ifgroupentry'] = array();
+}
+
+$a_ifgroups = &$config['ifgroups']['ifgroupentry'];
+
+if ($_GET['act'] == "del") {
+ if ($a_ifgroups[$_GET['id']]) {
+ $members = explode(" ", $a_ifgroups[$_GET['id']]['members']);
+ foreach ($members as $ifs) {
+ $realif = get_real_interface($ifs);
+ if ($realif) {
+ mwexec("/sbin/ifconfig {$realif} -group " . $a_ifgroups[$_GET['id']]['ifname']);
+ }
+ }
+ unset($a_ifgroups[$_GET['id']]);
+ write_config();
+ header("Location: interfaces_groups.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("Groups"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces groups">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), true, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+ $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
+ $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
+ $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+ $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="15%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="35%" class="listhdrr"><?=gettext("Members");?></td>
+ <td width="25%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="5%" class="list"></td>
+ </tr>
+<?php
+ if (count ($a_ifgroups)):
+ $i = 0;
+ foreach ($a_ifgroups as $ifgroupentry):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='interfaces_groups_edit.php?id=<?=$i;?>';">
+ <a href="/firewall_rules.php?if=<?=htmlspecialchars($ifgroupentry['ifname']);?>"><?=htmlspecialchars($ifgroupentry['ifname']);?></a>
+ </td>
+ <td class="listr" ondblclick="document.location='interfaces_groups_edit.php?id=<?=$i;?>';">
+<?php
+ $members_arr = explode(" ", $ifgroupentry['members']);
+ $iflist = get_configured_interface_with_descr(false, true);
+ $memberses_arr = array();
+ foreach ($members_arr as $memb) {
+ $memberses_arr[] = $iflist[$memb] ? $iflist[$memb] : $memb;
+ }
+ unset($iflist);
+ $memberses = implode(", ", $memberses_arr);
+ echo $memberses;
+ if (count($members_arr) < 10) {
+ echo " ";
+ } else {
+ echo "...";
+ }
+?>
+ </td>
+ <td class="listbg" ondblclick="document.location='interfaces_groups_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($ifgroupentry['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="interfaces_groups_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit group");?>" alt="edit" /></a></td>
+ <td><a href="interfaces_groups.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this group? All elements that still use it will become invalid (e.g. filter rules)!");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete ifgroupentry");?>" alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17">&nbsp;</td>
+ <td valign="middle"><a href="interfaces_groups_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new group");?>" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont" colspan="3">
+ <p><span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br /></strong></span><?=gettext("Interface Groups allow you to create rules that apply to multiple interfaces without duplicating the rules. If you remove members from an interface group, the group rules no longer apply to that interface.");?></span></p>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_groups_edit.php b/src/usr/local/www/interfaces_groups_edit.php
new file mode 100644
index 0000000..22b8567
--- /dev/null
+++ b/src/usr/local/www/interfaces_groups_edit.php
@@ -0,0 +1,378 @@
+<?php
+/*
+ interfaces_groups_edit.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009 Ermal Luçi
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-groups-edit
+##|*NAME=Interfaces: Groups: Edit page
+##|*DESCR=Allow access to the 'Interfaces: Groups: Edit' page.
+##|*MATCH=interfaces_groups_edit.php*
+##|-PRIV
+
+
+require("guiconfig.inc");
+require_once("functions.inc");
+
+$pgtitle = array(gettext("Interfaces"), gettext("Groups"), gettext("Edit"));
+$shortcut_section = "interfaces";
+
+if (!is_array($config['ifgroups']['ifgroupentry'])) {
+ $config['ifgroups']['ifgroupentry'] = array();
+}
+
+$a_ifgroups = &$config['ifgroups']['ifgroupentry'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_ifgroups[$id]) {
+ $pconfig['ifname'] = $a_ifgroups[$id]['ifname'];
+ $pconfig['members'] = $a_ifgroups[$id]['members'];
+ $pconfig['descr'] = html_entity_decode($a_ifgroups[$id]['descr']);
+}
+
+$iflist = get_configured_interface_with_descr();
+$iflist_disabled = get_configured_interface_with_descr(false, true);
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (!isset($id)) {
+ foreach ($a_ifgroups as $groupentry) {
+ if ($groupentry['ifname'] == $_POST['ifname']) {
+ $input_errors[] = gettext("Group name already exists!");
+ }
+ }
+ }
+ if (preg_match("/([^a-zA-Z])+/", $_POST['ifname'], $match)) {
+ $input_errors[] = gettext("Only letters A-Z are allowed as the group name.");
+ }
+
+ foreach ($iflist as $gif => $gdescr) {
+ if ($gdescr == $_POST['ifname'] || $gif == $_POST['ifname']) {
+ $input_errors[] = "The specified group name is already used by an interface. Please choose another name.";
+ }
+ }
+ $members = "";
+ $isfirst = 0;
+ /* item is a normal ifgroupentry type */
+ for ($x = 0; $x < 9999; $x++) {
+ if ($_POST["members{$x}"] <> "") {
+ if ($isfirst > 0) {
+ $members .= " ";
+ }
+ $members .= $_POST["members{$x}"];
+ $isfirst++;
+ }
+ }
+
+ if (!$input_errors) {
+ $ifgroupentry = array();
+ $ifgroupentry['members'] = $members;
+ $ifgroupentry['descr'] = $_POST['descr'];
+
+ if (isset($id) && $a_ifgroups[$id] && $_POST['ifname'] != $a_ifgroups[$id]['ifname']) {
+ if (!empty($config['filter']) && is_array($config['filter']['rule'])) {
+ foreach ($config['filter']['rule'] as $ridx => $rule) {
+ if (isset($rule['floating'])) {
+ $rule_ifs = explode(",", $rule['interface']);
+ $rule_changed = false;
+ foreach ($rule_ifs as $rule_if_id => $rule_if) {
+ if ($rule_if == $a_ifgroups[$id]['ifname']) {
+ $rule_ifs[$rule_if_id] = $_POST['ifname'];
+ $rule_changed = true;
+ }
+ }
+ if ($rule_changed) {
+ $config['filter']['rule'][$ridx]['interface'] = implode(",", $rule_ifs);
+ }
+ } else {
+ if ($rule['interface'] == $a_ifgroups[$id]['ifname']) {
+ $config['filter']['rule'][$ridx]['interface'] = $_POST['ifname'];
+ }
+ }
+ }
+ }
+ if (!empty($config['nat']) && is_array($config['nat']['rule'])) {
+ foreach ($config['nat']['rule'] as $ridx => $rule) {
+ if ($rule['interface'] == $a_ifgroups[$id]['ifname']) {
+ $config['nat']['rule'][$ridx]['interface'] = $_POST['ifname'];
+ }
+ }
+ }
+ $omembers = explode(" ", $a_ifgroups[$id]['members']);
+ if (count($omembers) > 0) {
+ foreach ($omembers as $ifs) {
+ $realif = get_real_interface($ifs);
+ if ($realif) {
+ mwexec("/sbin/ifconfig {$realif} -group " . $a_ifgroups[$id]['ifname']);
+ }
+ }
+ }
+ $ifgroupentry['ifname'] = $_POST['ifname'];
+ $a_ifgroups[$id] = $ifgroupentry;
+ } else if (isset($id) && $a_ifgroups[$id]) {
+ $omembers = explode(" ", $a_ifgroups[$id]['members']);
+ $nmembers = explode(" ", $members);
+ $delmembers = array_diff($omembers, $nmembers);
+ if (count($delmembers) > 0) {
+ foreach ($delmembers as $ifs) {
+ $realif = get_real_interface($ifs);
+ if ($realif) {
+ mwexec("/sbin/ifconfig {$realif} -group " . $a_ifgroups[$id]['ifname']);
+ }
+ }
+ }
+ $ifgroupentry['ifname'] = $_POST['ifname'];
+ $a_ifgroups[$id] = $ifgroupentry;
+ } else {
+ $ifgroupentry['ifname'] = $_POST['ifname'];
+ $a_ifgroups[] = $ifgroupentry;
+ }
+
+ write_config();
+
+ interface_group_setup($ifgroupentry);
+
+ header("Location: interfaces_groups.php");
+ exit;
+ } else {
+ $pconfig['descr'] = $_POST['descr'];
+ $pconfig['members'] = $members;
+ }
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+// Global Variables
+var rowname = new Array(9999);
+var rowtype = new Array(9999);
+var newrow = new Array(9999);
+var rowsize = new Array(9999);
+
+for (i = 0; i < 9999; i++) {
+ rowname[i] = '';
+ rowtype[i] = 'select';
+ newrow[i] = '';
+ rowsize[i] = '30';
+}
+
+var field_counter_js = 0;
+var loaded = 0;
+var is_streaming_progress_bar = 0;
+var temp_streaming_text = "";
+
+var addRowTo = (function() {
+ return (function (tableId) {
+ var d, tbody, tr, td, bgc, i, ii, j;
+ d = document;
+ tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
+ tr = d.createElement("tr");
+ for (i = 0; i < field_counter_js; i++) {
+ td = d.createElement("td");
+ <?php
+ $innerHTML="\"<input type='hidden' value='\" + totalrows +\"' name='\" + rowname[i] + \"_row-\" + totalrows + \"' /><select size='1' name='\" + rowname[i] + totalrows + \"'>\" +\"";
+
+ foreach ($iflist as $ifnam => $ifdescr) {
+ $innerHTML .= "<option value='{$ifnam}'>{$ifdescr}<\/option>";
+ }
+ $innerHTML .= "<\/select>\";";
+ ?>
+ td.innerHTML=<?=$innerHTML;?>
+ tr.appendChild(td);
+ }
+ td = d.createElement("td");
+ td.rowSpan = "1";
+
+ td.innerHTML = '<a onclick="removeRow(this);return false;" href="#"><img border="0" src="/themes/' + theme + '/images/icons/icon_x.gif" alt="remove" /><\/a>';
+ tr.appendChild(td);
+ tbody.appendChild(tr);
+ totalrows++;
+ });
+})();
+
+function removeRow(el) {
+ var cel;
+ while (el && el.nodeName.toLowerCase() != "tr") {
+ el = el.parentNode;
+ }
+
+ if (el && el.parentNode) {
+ cel = el.getElementsByTagName("td").item(0);
+ el.parentNode.removeChild(el);
+ }
+}
+
+ rowname[0] = "members";
+ rowtype[0] = "textbox";
+ rowsize[0] = "30";
+
+ rowname[2] = "detail";
+ rowtype[2] = "textbox";
+ rowsize[2] = "50";
+//]]>
+</script>
+<input type='hidden' name='members_type' value='textbox' class="formfld unknown" />
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<div id="inputerrors"></div>
+
+<form action="interfaces_groups_edit.php" method="post" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces groups edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Interface Groups Edit");?></td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Group Name");?></td>
+ <td class="vtable">
+ <input class="formfld unknown" name="ifname" id="ifname" maxlength="15" value="<?=htmlspecialchars($pconfig['ifname']);?>" />
+ <br />
+ <?=gettext("No numbers or spaces are allowed. Only characters in a-zA-Z");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed).");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><div id="membersnetworkport"><?=gettext("Member (s)");?></div></td>
+ <td width="78%" class="vtable">
+ <table id="maintable" summary="main table">
+ <tbody>
+ <tr>
+ <td>
+ <div id="onecolumn"><?=gettext("Interface");?></div>
+ </td>
+ </tr>
+<?php
+ $counter = 0;
+ $members = $pconfig['members'];
+ if ($members <> "") {
+ $item = explode(" ", $members);
+ foreach ($item as $ww) {
+ $members = $item[$counter];
+ $tracker = $counter;
+?>
+ <tr>
+ <td class="vtable">
+ <select name="members<?php echo $tracker; ?>" class="formselect" id="members<?php echo $tracker; ?>">
+<?php
+ $found = false;
+ foreach ($iflist as $ifnam => $ifdescr) {
+ echo "<option value=\"{$ifnam}\"";
+ if ($ifnam == $members) {
+ $found = true;
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+
+ if ($found === false) {
+ foreach ($iflist_disabled as $ifnam => $ifdescr) {
+ if ($ifnam == $members) {
+ echo "<option value=\"{$ifnam}\" selected=\"selected\">{$ifdescr}</option>";
+ }
+ }
+ }
+?>
+ </select>
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="remove" /></a>
+ </td>
+ </tr>
+<?php
+ $counter++;
+ } // end foreach
+ } // end if
+?>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('maintable'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
+ </a>
+ <br /><br />
+ <strong><?php echo gettext("NOTE:");?></strong>
+ <?php echo gettext("Rules for WAN type interfaces in groups do not contain the reply-to mechanism upon which Multi-WAN typically relies.");?>
+ <a href="https://doc.pfsense.org/index.php/Interface_Groups"><?PHP echo gettext("More Information");?></a>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <a href="interfaces_groups.php"><input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
+ <?php if (isset($id) && $a_ifgroups[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+</table>
+</form>
+
+<script type="text/javascript">
+//<![CDATA[
+ field_counter_js = 1;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+//]]>
+</script>
+
+<?php
+ unset($iflist);
+ unset($iflist_disabled);
+ include("fend.inc");
+?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_lagg.php b/src/usr/local/www/interfaces_lagg.php
new file mode 100644
index 0000000..32b2a21
--- /dev/null
+++ b/src/usr/local/www/interfaces_lagg.php
@@ -0,0 +1,169 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_lagg.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-lagg
+##|*NAME=Interfaces: LAGG: page
+##|*DESCR=Allow access to the 'Interfaces: LAGG' page.
+##|*MATCH=interfaces_lagg.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['laggs']['lagg'])) {
+ $config['laggs']['lagg'] = array();
+}
+
+$a_laggs = &$config['laggs']['lagg'] ;
+
+function lagg_inuse($num) {
+ global $config, $a_laggs;
+
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if) {
+ if ($config['interfaces'][$if]['if'] == $a_laggs[$num]['laggif']) {
+ return true;
+ }
+ }
+
+ if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
+ foreach ($config['vlans']['vlan'] as $vlan) {
+ if ($vlan['if'] == $a_laggs[$num]['laggif']) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+if ($_GET['act'] == "del") {
+ if (!isset($_GET['id'])) {
+ $input_errors[] = gettext("Wrong parameters supplied");
+ } else if (empty($a_laggs[$_GET['id']])) {
+ $input_errors[] = gettext("Wrong index supplied");
+ /* check if still in use */
+ } else if (lagg_inuse($_GET['id'])) {
+ $input_errors[] = gettext("This LAGG interface cannot be deleted because it is still being used.");
+ } else {
+ mwexec_bg("/sbin/ifconfig " . $a_laggs[$_GET['id']]['laggif'] . " destroy");
+ unset($a_laggs[$_GET['id']]);
+
+ write_config();
+
+ header("Location: interfaces_lagg.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("LAGG"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces lagg">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+ $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
+ $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
+ $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+ $tab_array[9] = array(gettext("LAGG"), true, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Interface"); ?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Members"); ?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_laggs as $lagg):
+?>
+ <tr ondblclick="document.location='interfaces_lagg_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+ <?=htmlspecialchars(strtoupper($lagg['laggif']));?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($lagg['members']);?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($lagg['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap"> <a href="interfaces_lagg_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="interfaces_lagg.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('Do you really want to delete this LAGG interface?')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="3">&nbsp;</td>
+ <td class="list"> <a href="interfaces_lagg_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ <tr>
+ <td colspan="3" class="list">
+ <p class="vexpl">
+ <span class="red"><strong>
+ <?=gettext("Note:"); ?><br />
+ </strong></span>
+ <?=gettext("LAGG allows for link aggregation, bonding and fault tolerance. Only unassigned interfaces can be added to LAGG."); ?>
+ </p>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_lagg_edit.php b/src/usr/local/www/interfaces_lagg_edit.php
new file mode 100644
index 0000000..d548160
--- /dev/null
+++ b/src/usr/local/www/interfaces_lagg_edit.php
@@ -0,0 +1,278 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_lagg_edit.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-lagg-edit
+##|*NAME=Interfaces: LAGG: Edit page
+##|*DESCR=Allow access to the 'Interfaces: LAGG: Edit' page.
+##|*MATCH=interfaces_lagg_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_lagg.php');
+}
+
+if (!is_array($config['laggs']['lagg'])) {
+ $config['laggs']['lagg'] = array();
+}
+
+$a_laggs = &$config['laggs']['lagg'];
+
+$portlist = get_interface_list();
+
+$realifchecklist = array();
+/* add LAGG interfaces */
+if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
+ foreach ($config['laggs']['lagg'] as $lagg) {
+ unset($portlist[$lagg['laggif']]);
+ $laggiflist = explode(",", $lagg['members']);
+ foreach ($laggiflist as $tmpif) {
+ $realifchecklist[get_real_interface($tmpif)] = $tmpif;
+ }
+ }
+}
+
+$checklist = get_configured_interface_list(false, true);
+foreach ($checklist as $tmpif) {
+ $realifchecklist[get_real_interface($tmpif)] = $tmpif;
+}
+
+$laggprotos = array("none", "lacp", "failover", "fec", "loadbalance", "roundrobin");
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_laggs[$id]) {
+ $pconfig['laggif'] = $a_laggs[$id]['laggif'];
+ $pconfig['members'] = $a_laggs[$id]['members'];
+ $laggiflist = explode(",", $a_laggs[$id]['members']);
+ foreach ($laggiflist as $tmpif) {
+ unset($realifchecklist[get_real_interface($tmpif)]);
+ }
+ $pconfig['proto'] = $a_laggs[$id]['proto'];
+ $pconfig['descr'] = $a_laggs[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "members proto");
+ $reqdfieldsn = array(gettext("Member interfaces"), gettext("Lagg protocol"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (is_array($_POST['members'])) {
+ foreach ($_POST['members'] as $member) {
+ if (!does_interface_exist($member)) {
+ $input_errors[] = gettext("Interface supplied as member is invalid");
+ }
+ }
+ } else if (!does_interface_exist($_POST['members'])) {
+ $input_errors[] = gettext("Interface supplied as member is invalid");
+ }
+
+ if (!in_array($_POST['proto'], $laggprotos)) {
+ $input_errors[] = gettext("Protocol supplied is invalid");
+ }
+
+ if (!$input_errors) {
+ $lagg = array();
+ $lagg['members'] = implode(',', $_POST['members']);
+ $lagg['descr'] = $_POST['descr'];
+ $lagg['laggif'] = $_POST['laggif'];
+ $lagg['proto'] = $_POST['proto'];
+ if (isset($id) && $a_laggs[$id]) {
+ $lagg['laggif'] = $a_laggs[$id]['laggif'];
+ }
+
+ $lagg['laggif'] = interface_lagg_configure($lagg);
+ if ($lagg['laggif'] == "" || !stristr($lagg['laggif'], "lagg")) {
+ $input_errors[] = gettext("Error occurred creating interface, please retry.");
+ } else {
+ if (isset($id) && $a_laggs[$id]) {
+ $a_laggs[$id] = $lagg;
+ } else {
+ $a_laggs[] = $lagg;
+ }
+
+ write_config();
+
+ $confif = convert_real_interface_to_friendly_interface_name($lagg['laggif']);
+ if ($confif <> "") {
+ interface_configure($confif);
+ }
+
+ header("Location: interfaces_lagg.php");
+ exit;
+ }
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("LAGG"), gettext("Edit"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="interfaces_lagg_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces lagg edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("LAGG configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="members[]" multiple="multiple" size="4" class="formselect">
+<?php
+ foreach ($portlist as $ifn => $ifinfo) {
+ if (array_key_exists($ifn, $realifchecklist)) {
+ continue;
+ }
+ echo "<option value=\"{$ifn}\"";
+ if (stristr($pconfig['members'], $ifn)) {
+ echo " selected=\"selected\"";
+ }
+ echo ">". $ifn ."(".$ifinfo['mac'] .")</option>";
+ }
+?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Choose the members that will be used for the link aggregation"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Lag proto"); ?></td>
+ <td class="vtable">
+ <select name="proto" class="formselect" id="proto">
+<?php
+ foreach ($laggprotos as $proto) {
+ echo "<option value=\"{$proto}\"";
+ if ($proto == $pconfig['proto']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">".strtoupper($proto)."</option>";
+ }
+?>
+ </select>
+ <br />
+ <ul class="vexpl">
+ <li>
+ <b><?=gettext("failover"); ?></b><br />
+ <?=gettext("Sends and receives traffic only through the master port. If " .
+ "the master port becomes unavailable, the next active port is " .
+ "used. The first interface added is the master port; any " .
+ "interfaces added after that are used as failover devices."); ?>
+ </li>
+ <li>
+ <b><?=gettext("fec"); ?></b><br />
+ <?=gettext("Supports Cisco EtherChannel. This is a static setup and " .
+ "does not negotiate aggregation with the peer or exchange " .
+ "frames to monitor the link."); ?>
+ </li>
+ <li>
+ <b><?=gettext("lacp"); ?></b><br />
+ <?=gettext("Supports the IEEE 802.3ad Link Aggregation Control Protocol " .
+ "(LACP) and the Marker Protocol. LACP will negotiate a set " .
+ "of aggregable links with the peer in to one or more Link " .
+ "Aggregated Groups. Each LAG is composed of ports of the " .
+ "same speed, set to full-duplex operation. The traffic will " .
+ "be balanced across the ports in the LAG with the greatest " .
+ "total speed, in most cases there will only be one LAG which " .
+ "contains all ports. In the event of changes in physical " .
+ "connectivity, Link Aggregation will quickly converge to a " .
+ "new configuration."); ?>
+ </li>
+ <li>
+ <b><?=gettext("loadbalance"); ?></b><br />
+ <?=gettext("Balances outgoing traffic across the active ports based on " .
+ "hashed protocol header information and accepts incoming " .
+ "traffic from any active port. This is a static setup and " .
+ "does not negotiate aggregation with the peer or exchange " .
+ "frames to monitor the link. The hash includes the Ethernet " .
+ "source and destination address, and, if available, the VLAN " .
+ "tag, and the IP source and destination address") ?>.
+ </li>
+ <li>
+ <b><?=gettext("roundrobin"); ?></b><br />
+ <?=gettext("Distributes outgoing traffic using a round-robin scheduler " .
+ "through all active ports and accepts incoming traffic from " .
+ "any active port"); ?>.
+ </li>
+ <li>
+ <b><?=gettext("none"); ?></b><br />
+ <?=gettext("This protocol is intended to do nothing: it disables any " .
+ "traffic without disabling the lagg interface itself"); ?>.
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="laggif" value="<?=htmlspecialchars($pconfig['laggif']); ?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_laggs[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_ppps.php b/src/usr/local/www/interfaces_ppps.php
new file mode 100644
index 0000000..85b5181
--- /dev/null
+++ b/src/usr/local/www/interfaces_ppps.php
@@ -0,0 +1,159 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_ppps.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-ppps
+##|*NAME=Interfaces: ppps page
+##|*DESCR=Allow access to the 'Interfaces: ppps' page.
+##|*MATCH=interfaces_ppps.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+
+function ppp_inuse($num) {
+ global $config, $g;
+ $iflist = get_configured_interface_list(false, true);
+ if (!is_array($config['ppps']['ppp'])) {
+ return false;
+ }
+
+ foreach ($iflist as $if) {
+ if ($config['interfaces'][$if]['if'] == $config['ppps']['ppp'][$num]['if']) {
+ return true;
+ }
+ }
+ return false;
+}
+
+if ($_GET['act'] == "del") {
+ /* check if still in use */
+ if (ppp_inuse($_GET['id'])) {
+ $input_errors[] = gettext("This point-to-point link cannot be deleted because it is still being used as an interface.");
+ } elseif (is_array($config['ppps']['ppp']) && is_array($config['ppps']['ppp'][$_GET['id']])) {
+
+ unset($config['ppps']['ppp'][$_GET['id']]['pppoe-reset-type']);
+ handle_pppoe_reset($config['ppps']['ppp'][$_GET['id']]);
+ unset($config['ppps']['ppp'][$_GET['id']]);
+ write_config();
+ header("Location: interfaces_ppps.php");
+ exit;
+ }
+}
+
+if (!is_array($config['ppps']['ppp'])) {
+ $config['ppps']['ppp'] = array();
+}
+$a_ppps = $config['ppps']['ppp'];
+
+$pgtitle = gettext("Interfaces: PPPs");
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces ppps">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), true, "interfaces_ppps.php");
+ $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
+ $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
+ $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+ $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Interface(s)/Port(s)");?></td>
+ <td width="40%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_ppps as $id => $ppp):
+?>
+ <tr ondblclick="document.location='interfaces_ppps_edit.php?id=<?=$i;?>'">
+ <td class="listr">
+ <?=htmlspecialchars($ppp['if']);?>
+ </td>
+ <td class="listr">
+<?php
+ $portlist = explode(",", $ppp['ports']);
+ foreach ($portlist as $portid => $port) {
+ if ($port != get_real_interface($port) && $ppp['type'] != "ppp") {
+ $portlist[$portid] = convert_friendly_interface_to_friendly_descr($port);
+ }
+ }
+ echo htmlspecialchars(implode(",", $portlist));
+?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($ppp['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap"> <a href="interfaces_ppps_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="interfaces_ppps.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this PPP interface?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="remove" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="3">&nbsp;</td>
+ <td class="list"> <a href="interfaces_ppps_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_ppps_edit.php b/src/usr/local/www/interfaces_ppps_edit.php
new file mode 100644
index 0000000..2a7eaf9
--- /dev/null
+++ b/src/usr/local/www/interfaces_ppps_edit.php
@@ -0,0 +1,903 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_ppps_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+ Copyright (C) 2010 Gabriel B. <gnoahb@gmail.com>.
+ All rights reserved.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-ppps-edit
+##|*NAME=Interfaces: PPPs: Edit page
+##|*DESCR=Allow access to the 'Interfaces: PPPs: Edit' page.
+##|*MATCH=interfaces_ppps_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_ppps.php');
+}
+
+define("CRON_MONTHLY_PATTERN", "0 0 1 * *");
+define("CRON_WEEKLY_PATTERN", "0 0 * * 0");
+define("CRON_DAILY_PATTERN", "0 0 * * *");
+define("CRON_HOURLY_PATTERN", "0 * * * *");
+
+if (!is_array($config['ppps']['ppp'])) {
+ $config['ppps']['ppp'] = array();
+}
+
+$a_ppps = &$config['ppps']['ppp'];
+
+$iflist = get_configured_interface_with_descr();
+$portlist = get_interface_list();
+$portlist = array_merge($portlist, $iflist);
+
+if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
+ foreach ($config['vlans']['vlan'] as $vlan) {
+ $portlist[$vlan['vlanif']] = $vlan;
+ }
+}
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_ppps[$id]) {
+ $pconfig['ptpid'] = $a_ppps[$id]['ptpid'];
+ $pconfig['type'] = $a_ppps[$id]['type'];
+ //$pconfig['if'] = $a_ppps[$id]['if'];
+ $pconfig['interfaces'] = $a_ppps[$id]['ports'];
+ $pconfig['username'] = $a_ppps[$id]['username'];
+ $pconfig['password'] = base64_decode($a_ppps[$id]['password']);
+ if (isset($a_ppps[$id]['ondemand'])) {
+ $pconfig['ondemand'] = true;
+ }
+ $pconfig['idletimeout'] = $a_ppps[$id]['idletimeout'];
+ $pconfig['uptime'] = $a_ppps[$id]['uptime'];
+ $pconfig['descr'] = $a_ppps[$id]['descr'];
+ $pconfig['bandwidth'] = explode(",", $a_ppps[$id]['bandwidth']);
+ $pconfig['mtu'] = explode(",", $a_ppps[$id]['mtu']);
+ $pconfig['mru'] = explode(",", $a_ppps[$id]['mru']);
+ $pconfig['mrru'] = explode(",", $a_ppps[$id]['mrru']);
+ if (isset($a_ppps[$id]['shortseq'])) {
+ $pconfig['shortseq'] = true;
+ }
+ if (isset($a_ppps[$id]['acfcomp'])) {
+ $pconfig['acfcomp'] = true;
+ }
+ if (isset($a_ppps[$id]['protocomp'])) {
+ $pconfig['protocomp'] = true;
+ }
+ if (isset($a_ppps[$id]['vjcomp'])) {
+ $pconfig['vjcomp'] = true;
+ }
+ if (isset($a_ppps[$id]['tcpmssfix'])) {
+ $pconfig['tcpmssfix'] = true;
+ }
+ switch ($a_ppps[$id]['type']) {
+ case "ppp":
+ $pconfig['initstr'] = base64_decode($a_ppps[$id]['initstr']);
+ $pconfig['simpin'] = $a_ppps[$id]['simpin'];
+ $pconfig['pin-wait'] = $a_ppps[$id]['pin-wait'];
+ $pconfig['apn'] = $a_ppps[$id]['apn'];
+ $pconfig['apnum'] = $a_ppps[$id]['apnum'];
+ $pconfig['phone'] = $a_ppps[$id]['phone'];
+ $pconfig['connect-timeout'] = $a_ppps[$id]['connect-timeout'];
+ $pconfig['localip'] = explode(",", $a_ppps[$id]['localip']);
+ $pconfig['gateway'] = explode(",", $a_ppps[$id]['gateway']);
+ break;
+ case "l2tp":
+ case "pptp":
+ $pconfig['localip'] = explode(",", $a_ppps[$id]['localip']);
+ $pconfig['subnet'] = explode(",", $a_ppps[$id]['subnet']);
+ $pconfig['gateway'] = explode(",", $a_ppps[$id]['gateway']);
+ case "pppoe":
+ $pconfig['provider'] = $a_ppps[$id]['provider'];
+ if (isset($a_ppps[$id]['provider']) and empty($a_ppps[$id]['provider'])) {
+ $pconfig['null_service'] = true;
+ }
+ /* ================================================ */
+ /* = force a connection reset at a specific time? = */
+ /* ================================================ */
+
+ if (isset($a_ppps[$id]['pppoe-reset-type'])) {
+ $pconfig['pppoe-reset-type'] = $a_ppps[$id]['pppoe-reset-type'];
+ $itemhash = getMPDCRONSettings($a_ppps[$id]['if']);
+ $cronitem = $itemhash['ITEM'];
+ if (isset($cronitem)) {
+ $resetTime = "{$cronitem['minute']} {$cronitem['hour']} {$cronitem['mday']} {$cronitem['month']} {$cronitem['wday']}";
+ } else {
+ $resetTime = NULL;
+ }
+
+ if ($a_ppps[$id]['pppoe-reset-type'] == "custom") {
+ $resetTime_a = explode(" ", $resetTime);
+ $pconfig['pppoe_pr_custom'] = true;
+ $pconfig['pppoe_resetminute'] = $resetTime_a[0];
+ $pconfig['pppoe_resethour'] = $resetTime_a[1];
+ /* just initialize $pconfig['pppoe_resetdate'] if the
+ * corresponding item contains appropriate numeric values.
+ */
+ if ($resetTime_a[2] <> "*" && $resetTime_a[3] <> "*") {
+ $pconfig['pppoe_resetdate'] = "{$resetTime_a[3]}/{$resetTime_a[2]}/" . date("Y");
+ }
+ } else if ($a_ppps[$id]['pppoe-reset-type'] == "preset") {
+ $pconfig['pppoe_pr_preset'] = true;
+ switch ($resetTime) {
+ case CRON_MONTHLY_PATTERN:
+ $pconfig['pppoe_monthly'] = true;
+ break;
+ case CRON_WEEKLY_PATTERN:
+ $pconfig['pppoe_weekly'] = true;
+ break;
+ case CRON_DAILY_PATTERN:
+ $pconfig['pppoe_daily'] = true;
+ break;
+ case CRON_HOURLY_PATTERN:
+ $pconfig['pppoe_hourly'] = true;
+ break;
+ }
+ }
+ }
+ break;
+ }
+
+} else {
+ $pconfig['ptpid'] = interfaces_ptpid_next();
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* okay first of all, cause we are just hiding the PPPoE HTML
+ * fields related to PPPoE resets, we are going to unset $_POST
+ * vars, if the reset feature should not be used. Otherwise the
+ * data validation procedure below, may trigger a false error
+ * message.
+ */
+ if (empty($_POST['pppoe-reset-type'])) {
+ unset($_POST['pppoe_resethour']);
+ unset($_POST['pppoe_resetminute']);
+ unset($_POST['pppoe_resetdate']);
+ unset($_POST['pppoe_pr_preset_val']);
+ }
+
+ /* input validation */
+ switch ($_POST['type']) {
+ case "ppp":
+ $reqdfields = explode(" ", "interfaces phone");
+ $reqdfieldsn = array(gettext("Link Interface(s)"), gettext("Phone Number"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ break;
+ case "pppoe":
+ if ($_POST['ondemand']) {
+ $reqdfields = explode(" ", "interfaces username passwordfld ondemand idletimeout");
+ $reqdfieldsn = array(gettext("Link Interface(s)"), gettext("Username"), gettext("Password"), gettext("Dial on demand"), gettext("Idle timeout value"));
+ } else {
+ $reqdfields = explode(" ", "interfaces username passwordfld");
+ $reqdfieldsn = array(gettext("Link Interface(s)"), gettext("Username"), gettext("Password"));
+ }
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ break;
+ case "l2tp":
+ case "pptp":
+ if ($_POST['ondemand']) {
+ $reqdfields = explode(" ", "interfaces username passwordfld localip subnet gateway ondemand idletimeout");
+ $reqdfieldsn = array(gettext("Link Interface(s)"), gettext("Username"), gettext("Password"), gettext("Local IP address"), gettext("Subnet"), gettext("Remote IP address"), gettext("Dial on demand"), gettext("Idle timeout value"));
+ } else {
+ $reqdfields = explode(" ", "interfaces username passwordfld localip subnet gateway");
+ $reqdfieldsn = array(gettext("Link Interface(s)"), gettext("Username"), gettext("Password"), gettext("Local IP address"), gettext("Subnet"), gettext("Remote IP address"));
+ }
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ break;
+ default:
+ $input_errors[] = gettext("Please choose a Link Type.");
+ break;
+ }
+ if ($_POST['type'] == "ppp" && count($_POST['interfaces']) > 1) {
+ $input_errors[] = gettext("Multilink connections (MLPPP) using the PPP link type is not currently supported. Please select only one Link Interface.");
+ }
+ if ($_POST['provider'] && !is_domain($_POST['provider'])) {
+ $input_errors[] = gettext("The Service name contains invalid characters.");
+ }
+ if ($_POST['provider'] && $_POST['null_service']) {
+ $input_errors[] = gettext("Do not specify both a Service name and a NULL Service name.");
+ }
+ if (($_POST['idletimeout'] != "") && !is_numericint($_POST['idletimeout'])) {
+ $input_errors[] = gettext("The idle timeout value must be an integer.");
+ }
+ if ($_POST['pppoe-reset-type'] == "custom" && $_POST['pppoe_resethour'] <> "" && !is_numericint($_POST['pppoe_resethour']) &&
+ $_POST['pppoe_resethour'] >= 0 && $_POST['pppoe_resethour'] <=23) {
+ $input_errors[] = gettext("A valid PPPoE reset hour must be specified (0-23).");
+ }
+ if ($_POST['pppoe-reset-type'] == "custom" && $_POST['pppoe_resetminute'] <> "" && !is_numericint($_POST['pppoe_resetminute']) &&
+ $_POST['pppoe_resetminute'] >= 0 && $_POST['pppoe_resetminute'] <=59) {
+ $input_errors[] = gettext("A valid PPPoE reset minute must be specified (0-59).");
+ }
+ if ($_POST['pppoe-reset-type'] == "custom" && $_POST['pppoe_resetdate'] <> "" && !is_numeric(str_replace("/", "", $_POST['pppoe_resetdate']))) {
+ $input_errors[] = gettext("A valid PPPoE reset date must be specified (mm/dd/yyyy).");
+ }
+ if ($_POST['pppoe-reset-type'] == "custom" && $_POST['pppoe_resetdate'] <> "" && is_numeric(str_replace("/", "", $_POST['pppoe_resetdate']))) {
+ $date_nums = explode("/", $_POST['pppoe_resetdate']);
+ if ($date_nums[0] < 1 || $date_nums[0] > 12) {
+ $input_errors[] = gettext("A valid PPPoE reset month must be specified (1-12) in the Custom PPPoE Periodic reset fields.");
+ }
+ if ($date_nums[1] < 1 || $date_nums[1] > 31) {
+ $input_errors[] = gettext("A valid PPPoE reset day of month must be specified (1-31) in the Custom PPPoE Periodic reset fields. No checks are done on valid # of days per month");
+ }
+ if ($date_nums[2] < date("Y")) {
+ $input_errors[] = gettext("A valid PPPoE reset year must be specified. Don't select a year in the past!");
+ }
+ }
+
+ if (is_array($_POST['interfaces'])) {
+ foreach ($_POST['interfaces'] as $iface) {
+ if ($_POST['localip'][$iface] && !is_ipaddr($_POST['localip'][$iface])) {
+ $input_errors[] = sprintf(gettext("A valid local IP address must be specified for %s."), $iface);
+ }
+ if ($_POST['gateway'][$iface] && !is_ipaddr($_POST['gateway'][$iface]) && !is_hostname($_POST['gateway'][$iface])) {
+ $input_errors[] = sprintf(gettext("A valid gateway IP address OR hostname must be specified for %s."), $iface);
+ }
+ if ($_POST['bandwidth'][$iface] && !is_numericint($_POST['bandwidth'][$iface])) {
+ $input_errors[] = sprintf(gettext("The bandwidth value for %s must be an integer."), $iface);
+ }
+ if ($_POST['mtu'][$iface] && ($_POST['mtu'][$iface] < 576)) {
+ $input_errors[] = sprintf(gettext("The MTU for %s must be greater than 576 bytes."), $iface);
+ }
+ if ($_POST['mru'][$iface] && ($_POST['mru'][$iface] < 576)) {
+ $input_errors[] = sprintf(gettext("The MRU for %s must be greater than 576 bytes."), $iface);
+ }
+ }
+ }
+
+/*
+ foreach ($a_ppps as $ppp) {
+ if (isset($id) && ($a_ppps[$id]) && ($a_ppps[$id] === $ppp)) {
+ continue;
+ }
+
+ if ($ppp['serialport'] == $_POST['serialport']) {
+ $input_errors[] = "Serial port is in use";
+ break;
+ }
+ }
+*/
+
+ if (!$input_errors) {
+ $ppp = array();
+ $ppp['ptpid'] = $_POST['ptpid'];
+ $ppp['type'] = $_POST['type'];
+ $ppp['if'] = $ppp['type'].$ppp['ptpid'];
+ $ppp['ports'] = implode(',', $_POST['interfaces']);
+ $ppp['username'] = $_POST['username'];
+ $ppp['password'] = base64_encode($_POST['passwordfld']);
+ $ppp['ondemand'] = $_POST['ondemand'] ? true : false;
+ if (!empty($_POST['idletimeout'])) {
+ $ppp['idletimeout'] = $_POST['idletimeout'];
+ } else {
+ unset($ppp['idletimeout']);
+ }
+ $ppp['uptime'] = $_POST['uptime'] ? true : false;
+ if (!empty($_POST['descr'])) {
+ $ppp['descr'] = $_POST['descr'];
+ } else {
+ unset($ppp['descr']);
+ }
+
+ // Loop through fields associated with an individual link/port and make an array of the data
+ $port_fields = array("localip", "gateway", "subnet", "bandwidth", "mtu", "mru", "mrru");
+ foreach ($_POST['interfaces'] as $iface) {
+ foreach ($port_fields as $field_label) {
+ if (isset($_POST[$field_label][$iface])) {
+ $port_data[$field_label][] = $_POST[$field_label][$iface];
+ }
+ }
+ }
+
+ switch ($_POST['type']) {
+ case "ppp":
+ if (!empty($_POST['initstr'])) {
+ $ppp['initstr'] = base64_encode($_POST['initstr']);
+ } else {
+ unset($ppp['initstr']);
+ }
+ if (!empty($_POST['simpin'])) {
+ $ppp['simpin'] = $_POST['simpin'];
+ $ppp['pin-wait'] = $_POST['pin-wait'];
+ } else {
+ unset($ppp['simpin']);
+ unset($ppp['pin-wait']);
+ }
+
+ if (!empty($_POST['apn'])) {
+ $ppp['apn'] = $_POST['apn'];
+ $ppp['apnum'] = $_POST['apnum'];
+ } else {
+ unset($ppp['apn']);
+ unset($ppp['apnum']);
+ }
+ $ppp['phone'] = $_POST['phone'];
+ $ppp['localip'] = implode(',', $port_data['localip']);
+ $ppp['gateway'] = implode(',', $port_data['gateway']);
+ if (!empty($_POST['connect-timeout'])) {
+ $ppp['connect-timeout'] = $_POST['connect-timeout'];
+ } else {
+ unset($ppp['connect-timeout']);
+ }
+ break;
+ case "pppoe":
+ if (!empty($_POST['provider'])) {
+ $ppp['provider'] = $_POST['provider'];
+ } else {
+ unset($ppp['provider']);
+ $ppp['provider'] = $_POST['null_service'] ? true : false;
+ }
+ if (!empty($_POST['pppoe-reset-type'])) {
+ $ppp['pppoe-reset-type'] = $_POST['pppoe-reset-type'];
+ } else {
+ unset($ppp['pppoe-reset-type']);
+ }
+
+ break;
+ case "pptp":
+ case "l2tp":
+ $ppp['localip'] = implode(',', $port_data['localip']);
+ $ppp['subnet'] = implode(',', $port_data['subnet']);
+ $ppp['gateway'] = implode(',', $port_data['gateway']);
+ break;
+ default:
+ break;
+
+ }
+
+ $ppp['shortseq'] = $_POST['shortseq'] ? true : false;
+ $ppp['acfcomp'] = $_POST['acfcomp'] ? true : false;
+ $ppp['protocomp'] = $_POST['protocomp'] ? true : false;
+ $ppp['vjcomp'] = $_POST['vjcomp'] ? true : false;
+ $ppp['tcpmssfix'] = $_POST['tcpmssfix'] ? true : false;
+ $ppp['bandwidth'] = implode(',', $port_data['bandwidth']);
+ if (is_array($port_data['mtu'])) {
+ $ppp['mtu'] = implode(',', $port_data['mtu']);
+ }
+ if (is_array($port_data['mru'])) {
+ $ppp['mru'] = implode(',', $port_data['mru']);
+ }
+ if (is_array($port_data['mrru'])) {
+ $ppp['mrru'] = implode(',', $port_data['mrru']);
+ }
+
+ /* handle_pppoe_reset is called here because if user changes Link Type from PPPoE to another type we
+ must be able to clear the config data in the <cron> section of config.xml if it exists
+ */
+ handle_pppoe_reset($_POST);
+
+ if (isset($id) && $a_ppps[$id]) {
+ $a_ppps[$id] = $ppp;
+ } else {
+ $a_ppps[] = $ppp;
+ }
+
+ write_config();
+ configure_cron();
+
+ foreach ($iflist as $pppif => $ifdescr) {
+ if ($config['interfaces'][$pppif]['if'] == $ppp['if']) {
+ interface_ppps_configure($pppif);
+ }
+ }
+ header("Location: interfaces_ppps.php");
+ exit;
+ }
+} // end if ($_POST)
+
+$closehead = false;
+$pgtitle = array(gettext("Interfaces"), gettext("PPPs"), gettext("Edit"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+$types = array("select" => gettext("Select"), "ppp" => "PPP", "pppoe" => "PPPoE", "pptp" => "PPTP", "l2tp" => "L2TP"/*, "tcp" => "TCP", "udp" => "UDP"*/);
+
+?>
+ <script type="text/javascript" src="/javascript/numericupdown/js/numericupdown.js"></script>
+ <link href="/javascript/numericupdown/css/numericupdown.css" rel="stylesheet" type="text/css" />
+ <script type="text/javascript" src="/javascript/datepicker/js/datepicker.js"></script>
+ <link href="/javascript/datepicker/css/datepicker.css" rel="stylesheet" type="text/css"/>
+ <script type="text/javascript">
+ //<![CDATA[
+ jQuery(document).ready(function() { updateType(<?php echo "'{$pconfig['type']}'";?>); });
+ //]]>
+ </script>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" >
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="interfaces_ppps_edit.php" method="post" name="iform" id="iform">
+ <table id="interfacetable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces ppps edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?= gettext("PPPs configuration"); ?></td>
+ </tr>
+ <tr>
+ <td valign="middle" class="vncell"><strong><?= gettext("Link Type"); ?></strong></td>
+ <td class="vtable">
+ <select name="type" onchange="updateType(this.value);" class="formselect" id="type">
+ <?php
+ foreach ($types as $key => $opt) {
+ echo "<option onclick=\"updateType('{$key}');\"";
+ if ($key == $pconfig['type']) {
+ echo " selected=\"selected\"";
+ }
+ echo " value=\"{$key}\" >" . htmlspecialchars($opt) . "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr name="interface" id="interface" >
+ <td width="22%" valign="top" class="vncellreq"><?= gettext("Link interface(s)"); ?></td>
+ <td width="78%" class="vtable">
+ <select style="vertical-align:top" name="interfaces[]" multiple="multiple" class="formselect" size="4" onchange="show_hide_linkfields(this.options);">
+ <option></option>
+ </select>
+ <br />
+ <span class="vexpl"><?= gettext("Select at least two interfaces for Multilink (MLPPP) connections."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" name="portlists" id="portlists">
+ <td id="serialports">
+ <?php
+ $selected_ports = explode(',', $pconfig['interfaces']);
+ if (!is_dir("/var/spool/lock")) {
+ mwexec("/bin/mkdir -p /var/spool/lock");
+ }
+ // $serialports = pfSense_get_modem_devices();
+ // Match files in /dev starting with "cua" then:
+ // [a-zA-Z] = any single alpha character e.g. like "cuau"
+ // [0-9] = a digit from 0 to 9
+ // stuff in {} = the various possible digit and dot combinations to allow an optional 2nd digit, dot, followed by 1 or 2 optional digits
+ // This supports up to 100 device numbers (0 to 99), e.g. cuau0 cuau1 ... cuau10 cuau11 ... cuau99 and also possibilities like cuau1.1 cuau1.11 cuau11.1 cuau11.11
+ $serialports = glob("/dev/cua[a-zA-Z][0-9]{,.[0-9],.[0-9][0-9],[0-9],[0-9].[0-9],[0-9].[0-9][0-9]}", GLOB_BRACE);
+ $serport_count = 0;
+ foreach ($serialports as $port) {
+ $serport_count++;
+ echo $port . "," . trim($port);
+ if (in_array($port, $selected_ports)) {
+ echo ",1|";
+ } else {
+ echo ",|";
+ }
+ }
+ echo $serport_count;
+ ?>
+ </td>
+ <td id="ports">
+ <?php
+ $port_count = 0;
+ foreach ($portlist as $ifn => $ifinfo) {
+ $port_count++;
+ $string = "";
+ if (is_array($ifinfo)) {
+ $string .= $ifn;
+ if ($ifinfo['mac']) {
+ $string .= " ({$ifinfo['mac']})";
+ }
+ } else {
+ $string .= $ifinfo;
+ }
+ $string .= ",{$ifn}";
+ echo htmlspecialchars($string);
+ if (in_array($ifn, $selected_ports)) {
+ echo ",1|";
+ } else {
+ echo ",|";
+ }
+ }
+ echo $port_count;
+ if ($serport_count > $port_count) {
+ $port_count = $serport_count;
+ }
+ ?>
+ </td>
+ <td style="display:none" name="port_count" id="port_count"><?=htmlspecialchars($port_count);?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?= gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?= gettext("You may enter a description here for your reference. Description will appear in the \"Interfaces Assign\" select lists."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" name="select" id="select"><td style="display:none"></td></tr>
+ <?php
+ $k = 0;
+ ?>
+ <tr style="display:none" name="ppp_provider" id="ppp_provider">
+ <td width="22%" valign="top" class="vncell">
+ <?= gettext("Service Provider"); ?>
+ </td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="0" cellspacing="0" summary="service provider">
+ <tr id="trcountry" style="display:none">
+ <td><?= gettext("Country:"); ?> &nbsp;&nbsp;</td>
+ <td>
+ <select class="formselect" name="country" id="country" onchange="providers_list()">
+ <option></option>
+ </select>
+ </td>
+ </tr>
+ <tr id="trprovider" style="display:none">
+ <td><?= gettext("Provider:"); ?> &nbsp;&nbsp;</td>
+ <td>
+ <select class="formselect" name="provider" id="provider" onchange="providerplan_list()">
+ <option></option>
+ </select>
+ </td>
+ </tr>
+ <tr id="trproviderplan" style="display:none">
+ <td><?= gettext("Plan:"); ?> &nbsp;&nbsp;</td>
+ <td>
+ <select class="formselect" name="providerplan" id="providerplan" onchange="prefill_provider()">
+ <option></option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <br /><span class="vexpl"><?= gettext("Select to fill in data for your service provider."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?= gettext("Username"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="username" type="text" class="formfld user" id="username" size="20" value="<?=htmlspecialchars($pconfig['username']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?= gettext("Password"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="passwordfld" type="password" class="formfld pwd" id="passwordfld" size="20" value="<?=htmlspecialchars($pconfig['password']);?>" />
+ </td>
+ </tr>
+
+ <tr style="display:none" name="phone_num" id="phone_num">
+ <td width="22%" valign="top" class="vncellreq"><?= gettext("Phone Number"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="phone" type="text" class="formfld unknown" id="phone" size="40" value="<?=htmlspecialchars($pconfig['phone']);?>" />
+ <br />
+ <span class="vexpl"><?= gettext("Note: Typically *99# for GSM networks and #777 for CDMA networks"); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" name="apn_" id="apn_">
+ <td width="22%" valign="top" class="vncell"><?= gettext("Access Point Name (APN)"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="apn" type="text" class="formfld unknown" id="apn" size="40" value="<?=htmlspecialchars($pconfig['apn']);?>" />
+ </td>
+ </tr>
+
+ <tr style="display:none" name="ppp" id="ppp">
+ <td colspan="2" style="padding:0px;">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="advanced">
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?= gettext("APN number (optional)"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="apnum" type="text" class="formfld unknown" id="apnum" size="2" value="<?=htmlspecialchars($pconfig['apnum']);?>" />
+ <br />
+ <span class="vexpl"><?= gettext("Note: Defaults to 1 if you set APN above. Ignored if you set no APN above."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?= gettext("SIM PIN"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="simpin" type="text" class="formfld unknown" id="simpin" size="12" value="<?=htmlspecialchars($pconfig['simpin']);?>" />
+ </td>
+ </tr>
+
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?= gettext("SIM PIN wait"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pin-wait" type="text" class="formfld unknown" id="pin-wait" size="2" value="<?=htmlspecialchars($pconfig['pin-wait']);?>" />
+ <br />
+ <span class="vexpl"><?= gettext("Note: Time to wait for SIM to discover network after PIN is sent to SIM (seconds)."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?= gettext("Init String"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="text" size="40" class="formfld unknown" id="initstr" name="initstr" value="<?=htmlspecialchars($pconfig['initstr']);?>" />
+ <br />
+ <span class="vexpl"><?= gettext("Note: Enter the modem initialization string here. Do NOT include the \"AT\"" .
+ " string at the beginning of the command. Many modern USB 3G modems don't need an initialization string."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?= gettext("Connection Timeout"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="connect-timeout" type="text" class="formfld unknown" id="connect-timeout" size="2" value="<?=htmlspecialchars($pconfig['connect-timeout']);?>" />
+ <br />
+ <span class="vexpl"><?= gettext("Note: Enter timeout in seconds for connection to be established (sec.) Default is 45 sec."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td valign="top" class="vncell"><?= gettext("Uptime Logging"); ?></td>
+ <td class="vtable">
+ <input type="checkbox" value="on" id="uptime" name="uptime" <?php if (isset($pconfig['uptime'])) echo "checked=\"checked\""; ?> /> <?= gettext("Enable persistent logging of connection uptime."); ?>
+ <br />
+ <span class="vexpl"><?= gettext("This option causes cumulative uptime to be recorded and displayed on the Status Interfaces page."); ?></span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr style="display:none" name="pppoe" id="pppoe">
+ <td colspan="2" style="padding:0px;">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="service name">
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?= gettext("Service name"); ?></td>
+ <td width="78%" class="vtable"><input name="provider" type="text" class="formfld unknown" id="provider" size="20" value="<?=htmlspecialchars($pconfig['provider']);?>" />&nbsp;&nbsp;
+ <input type="checkbox" value="on" id="null_service" name="null_service" <?php if (isset($pconfig['null_service'])) echo "checked=\"checked\""; ?> /> <?= gettext("Configure a NULL Service name"); ?>
+ <br />
+ <span class="vexpl"><?= gettext("Hint: this field can usually be left empty. Service name will not be configured if this field is empty. Check the \"Configure NULL\" box to configure a blank Service name."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Periodic reset");?></td>
+ <td width="78%" class="vtable">
+ <table id="presetwrap" cellspacing="0" cellpadding="0" width="100%" summary="periodic reset">
+ <tr>
+ <td align="left" valign="top">
+ <p style="margin: 4px; padding: 4px 0 4px 0; width: 94%;">
+ <select style="vertical-align:top" id="reset_type" name="pppoe-reset-type" class="formselect" onchange="show_reset_settings(this.value);">
+ <option value = ""><?= gettext("Disabled"); ?></option>
+ <option value="custom" <?php if ($pconfig['pppoe-reset-type'] == "custom") echo "selected=\"selected\""; ?>><?= gettext("Custom"); ?></option>
+ <option value="preset" <?php if ($pconfig['pppoe-reset-type'] == "preset") echo "selected=\"selected\""; ?>><?= gettext("Pre-Set"); ?></option>
+ </select> <?= gettext("Select a reset timing type"); ?>
+ </p>
+ <?php if ($pconfig['pppoe_pr_custom']): ?>
+ <p style="margin: 2px; padding: 4px; width: 94%;" id="pppoecustomwrap">
+ <?php else: ?>
+ <p style="margin: 2px; padding: 4px; width: 94%; display: none;" id="pppoecustomwrap">
+ <?php endif; ?>
+ <input type="text" name="pppoe_resethour" class="fd_incremental_inp_range_0_23 fd_increment_1 fd_classname_dec_buttonDec fd_classname_inc_buttonInc" maxlength="2" id="pppoe_resethour" value="<?= htmlspecialchars($pconfig['pppoe_resethour']); ?>" size="3" />
+ <?= gettext("hour (0-23)"); ?><br />
+ <input type="text" name="pppoe_resetminute" class="fd_incremental_inp_range_0_59 fd_increment_1 fd_classname_dec_buttonDec fd_classname_inc_buttonInc" maxlength="2" id="pppoe_resetminute" value="<?= htmlspecialchars($pconfig['pppoe_resetminute']); ?>" size="3" />
+ <?= gettext("minute (0-59)"); ?><br />
+ <input name="pppoe_resetdate" type="text" class="w8em format-m-d-y highlight-days-67" id="pppoe_resetdate" maxlength="10" size="10" value="<?=htmlspecialchars($pconfig['pppoe_resetdate']);?>" />
+ <?= gettext("reset at a specific date (mm/dd/yyyy)"); ?>
+ <br />&nbsp;<br />
+ <span class="red"><strong><?=gettext("Note:");?></strong></span>
+ <?= gettext("If you leave the date field empty, the reset will be executed each day at the time you did specify using the minutes and hour field."); ?>
+ </p>
+ <?php if ($pconfig['pppoe_pr_preset']): ?>
+ <p style="margin: 2px; padding: 4px; width: 94%;" id="pppoepresetwrap">
+ <?php else: ?>
+ <p style="margin: 2px; padding: 4px; width: 94%; display: none;" id="pppoepresetwrap">
+ <?php endif; ?>
+ <input name="pppoe_pr_preset_val" type="radio" id="pppoe_monthly" value="monthly" <?php if ($pconfig['pppoe_monthly']) echo "checked=\"checked\""; ?> />
+ <?= gettext("reset at each month ('0 0 1 * *')"); ?>
+ <br />
+ <input name="pppoe_pr_preset_val" type="radio" id="pppoe_weekly" value="weekly" <?php if ($pconfig['pppoe_weekly']) echo "checked=\"checked\""; ?> />
+ <?= gettext("reset at each week ('0 0 * * 0')"); ?>
+ <br />
+ <input name="pppoe_pr_preset_val" type="radio" id="pppoe_daily" value="daily" <?php if ($pconfig['pppoe_daily']) echo "checked=\"checked\""; ?> />
+ <?= gettext("reset at each day ('0 0 * * *')"); ?>
+ <br />
+ <input name="pppoe_pr_preset_val" type="radio" id="pppoe_hourly" value="hourly" <?php if ($pconfig['pppoe_hourly']) echo "checked=\"checked\""; ?> />
+ <?= gettext("reset at each hour ('0 * * * *')"); ?>
+ </p>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+<?php
+ for ($j = 0; $j < $port_count; $j++) :
+?>
+
+ <tr style="display:none" id="gw_fields<?=$j;?>">
+ <td width="22%" id="localiplabel<?=$j;?>" valign="top" class="vncell"><?= gettext("Local IP"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="localip[]" type="text" class="formfld unknown" id="localip<?=$j;?>" size="20" value="<?=htmlspecialchars($pconfig['localip'][$j]);?>" />
+ /
+ <select name="subnet[]" class="formselect" id="subnet<?=$j;?>" disabled="disabled">
+ <?php for ($i = 31; $i > 0; $i--): ?>
+ <option value="<?=$i;?>"<?php if ($i == $pconfig['subnet'][$j]) echo " selected=\"selected\""; ?>><?=$i;?></option>
+ <?php endfor; ?>
+ </select> <?= gettext("IP Address"); ?>
+ </td>
+ </tr>
+ <tr style="display:none" id="ip_fields<?=$j;?>">
+ <td width="22%" id="gatewaylabel<?=$j;?>" valign="top" class="vncell"></td>
+ <td width="78%" class="vtable">
+ <input name="gateway[]" type="text" class="formfld unknown" id="gateway<?=$j;?>" size="20" value="<?=htmlspecialchars($pconfig['gateway'][$j]);?>" /><?= gettext("IP Address OR Hostname"); ?>
+ </td>
+ </tr>
+<?php
+ endfor;
+?>
+
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td colspan="2" valign="top" height="16"></td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td colspan="2" valign="top" class="listtopic"><?= gettext("Advanced Options"); ?></td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td valign="top" class="vncell"><?= gettext("Dial On Demand"); ?></td>
+ <td class="vtable">
+ <input type="checkbox" value="on" id="ondemand" name="ondemand" <?php if (isset($pconfig['ondemand'])) echo "checked=\"checked\""; ?> /> <?= gettext("Enable Dial-on-Demand mode"); ?>
+ <br />
+ <span class="vexpl"><?= gettext("This option causes the interface to operate in dial-on-demand mode. Do NOT enable if you want your link to be always up. " .
+ "The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected."); ?> </span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td valign="top" class="vncell"><?= gettext("Idle Timeout"); ?></td>
+ <td class="vtable">
+ <input name="idletimeout" type="text" class="formfld unknown" id="idletimeout" size="12" value="<?=htmlspecialchars($pconfig['idletimeout']);?>" /> <?= gettext("(seconds) Default is 0, which disables the timeout feature."); ?>
+ <br />
+ <span class="vexpl"><?= gettext("If no incoming or outgoing packets are transmitted for the entered number of seconds the connection is brought down.");?>
+ <br />
+ <?=gettext("When the idle timeout occurs, if the dial-on-demand option is enabled, mpd goes back into dial-on-demand mode. Otherwise, the interface is brought down and all associated routes removed."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?= gettext("Compression"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" value="on" id="vjcomp" name="vjcomp" <?php if (isset($pconfig['vjcomp'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable vjcomp(compression) (auto-negotiated by default)."); ?>
+ <br />
+ <span class="vexpl"><?=gettext("This option enables Van Jacobson TCP header compression, which saves several bytes per TCP data packet. " .
+ "You almost always want this option. This compression ineffective for TCP connections with enabled modern extensions like time " .
+ "stamping or SACK, which modify TCP options between sequential packets.");?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?= gettext("TCPmssFix"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" value="on" id="tcpmssfix" name="tcpmssfix" <?php if (isset($pconfig['tcpmssfix'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable tcpmssfix (enabled by default)."); ?>
+ <br />
+ <span class="vexpl"><?=gettext("This option causes mpd to adjust incoming and outgoing TCP SYN segments so that the requested maximum segment size is not greater than the amount ".
+ "allowed by the interface MTU. This is necessary in many setups to avoid problems caused by routers that drop ICMP Datagram Too Big messages. Without these messages, ".
+ "the originating machine sends data, it passes the rogue router then hits a machine that has an MTU that is not big enough for the data. Because the IP Don't Fragment option is set, ".
+ "this machine sends an ICMP Datagram Too Big message back to the originator and drops the packet. The rogue router drops the ICMP message and the originator never ".
+ "gets to discover that it must reduce the fragment size or drop the IP Don't Fragment option from its outgoing data.");?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?=gettext("ShortSeq");?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" value="on" id="shortseq" name="shortseq" <?php if (isset($pconfig['shortseq'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable shortseq (auto-negotiated by default)."); ?>
+ <br />
+ <span class="vexpl"><?= gettext("This option is only meaningful if multi-link PPP is negotiated. It proscribes shorter multi-link fragment headers, saving two bytes on every frame. " .
+ "It is not necessary to disable this for connections that are not multi-link."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?=gettext("ACFComp"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" value="on" id="acfcomp" name="acfcomp" <?php if (isset($pconfig['acfcomp'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable acfcomp (compression) (auto-negotiated by default)."); ?>
+ <br />
+ <span class="vexpl"><?= gettext("Address and control field compression. This option only applies to asynchronous link types. It saves two bytes per frame."); ?></span>
+ </td>
+ </tr>
+ <tr style="display:none" id="advanced_<?=$k;?>" name="advanced_<?=$k;$k++;?>">
+ <td width="22%" valign="top" class="vncell"><?=gettext("ProtoComp"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" value="on" id="protocomp" name="protocomp" <?php if (isset($pconfig['protocomp'])) echo "checked=\"checked\""; ?> />&nbsp;<?= gettext("Disable protocomp (compression) (auto-negotiated by default)."); ?>
+ <br />
+ <span class="vexpl"><?= gettext("Protocol field compression. This option saves one byte per frame for most frames."); ?></span>
+ </td>
+ </tr>
+ <tr id="advanced_" name="advanced_">
+ <td>&nbsp;</td>
+ <td>
+ <p><input type="button" onclick="show_advanced(1)" value="<?=gettext("Show advanced options"); ?>" /></p>
+ </td>
+ <td style="display:none" id="adv_rows" name="adv_rows"><?=$k;?></td>
+ <td style="display:none" id="adv_show" name="adv_show">0</td>
+ </tr>
+<?php
+ for ($i = 0; $i < $port_count; $i++) :
+?>
+ <tr style="display:none" id="link<?=$i;?>">
+ <td width="22%" valign="top" id="linklabel<?=$i;?>" class="vncell"> <?=gettext("Link Parameters");?></td>
+ <td class="vtable">
+ <table name="link_parameters" border="0" cellpadding="6" cellspacing="0" summary="link parameters">
+ <tr>
+ <td width="22%" id="bwlabel<?=$i;?>" valign="top"class="vncell"> <?=gettext("Bandwidth");?></td>
+ <td width="78%" class="vtable">
+ <br />
+ <input name="bandwidth[]" id="bandwidth<?=$i;?>" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['bandwidth'][$i]);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Set ONLY for MLPPP connections and ONLY when links have different bandwidths.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" id="mtulabel<?=$i;?>" valign="top" class="vncell"> <?=gettext("MTU"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="mtu[]" id="mtu<?=$i;?>" type="text" class="formfld unknown" size="6" value="<?=htmlspecialchars($pconfig['mtu'][$i]);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("MTU will default to 1492.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" id="mrulabel<?=$i;?>" valign="top" class="vncell"> <?=gettext("MRU"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="mru[]" id="mru<?=$i;?>" type="text" class="formfld unknown" size="6" value="<?=htmlspecialchars($pconfig['mru'][$i]);?>" />
+ <br />
+ <span class="vexpl">MRU <?=gettext("will be auto-negotiated by default.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" id="mrrulabel<?=$i;?>" valign="top" class="vncell"> <?=gettext("MRRU"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="mrru[]" id="mrru<?=$i;?>" type="text" class="formfld unknown" size="6" value="<?=htmlspecialchars($pconfig['mrru'][$i]);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Set ONLY for MLPPP connections.");?> MRRU <?=gettext("will be auto-negotiated by default.");?></span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endfor;
+?>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <input name="ptpid" type="hidden" value="<?=htmlspecialchars($pconfig['ptpid']);?>" />
+ <?php if (isset($id) && $a_ppps[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_qinq.php b/src/usr/local/www/interfaces_qinq.php
new file mode 100644
index 0000000..dac5801
--- /dev/null
+++ b/src/usr/local/www/interfaces_qinq.php
@@ -0,0 +1,181 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_qinq.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/sbin/ngctl
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-qinq
+##|*NAME=Interfaces: QinQ page
+##|*DESCR=Allow access to the 'Interfaces: QinQ' page.
+##|*MATCH=interfaces_qinq.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+
+if (!is_array($config['qinqs']['qinqentry'])) {
+ $config['qinqs']['qinqentry'] = array();
+}
+
+$a_qinqs = &$config['qinqs']['qinqentry'];
+
+function qinq_inuse($num) {
+ global $config, $a_qinqs;
+
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if) {
+ if ($config['interfaces'][$if]['if'] == $a_qinqs[$num]['qinqif']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+if ($_GET['act'] == "del") {
+ $id = $_GET['id'];
+
+ /* check if still in use */
+ if (qinq_inuse($id)) {
+ $input_errors[] = gettext("This QinQ cannot be deleted because it is still being used as an interface.");
+ } else {
+ $qinq =& $a_qinqs[$id];
+
+ $delmembers = explode(" ", $qinq['members']);
+ if (count($delmembers) > 0) {
+ foreach ($delmembers as $tag) {
+ mwexec("/usr/sbin/ngctl shutdown {$qinq['vlanif']}h{$tag}:");
+ }
+ }
+ mwexec("/usr/sbin/ngctl shutdown {$qinq['vlanif']}qinq:");
+ mwexec("/usr/sbin/ngctl shutdown {$qinq['vlanif']}:");
+ mwexec("/sbin/ifconfig {$qinq['vlanif']} destroy");
+ unset($a_qinqs[$id]);
+
+ write_config();
+
+ header("Location: interfaces_qinq.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("QinQ"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces qinqs">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), true, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+ $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
+ $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
+ $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+ $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="15%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Tag");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("QinQ members");?></td>
+ <td width="45%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_qinqs as $qinq):
+?>
+ <tr ondblclick="document.location='interfaces_qinq_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+ <?=htmlspecialchars($qinq['if']);?>
+ </td>
+ <td class="listlr">
+ <?=htmlspecialchars($qinq['tag']);?>
+ </td>
+ <td class="listr">
+ <?php
+ if (strlen($qinq['members']) > 20) {
+ echo substr(htmlspecialchars($qinq['members']), 0, 20) . "...";
+ } else {
+ echo htmlspecialchars($qinq['members']);
+ }
+ ?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($qinq['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap"> <a href="interfaces_qinq_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="interfaces_qinq.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this QinQ?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="remove" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="4">&nbsp;</td>
+ <td class="list"> <a href="interfaces_qinq_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ <tr>
+ <td colspan="4" class="list">
+ <p class="vexpl">
+ <span class="red"><strong>
+ <?=gettext("Note:");?><br />
+ </strong></span>
+ <?php printf(gettext("Not all drivers/NICs support 802.1Q QinQ tagging properly. On cards that do not explicitly support it, QinQ tagging will still work, but the reduced MTU may cause problems. See the %s handbook for information on supported cards."), $g['product_name']);?>
+ </p>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_qinq_edit.php b/src/usr/local/www/interfaces_qinq_edit.php
new file mode 100644
index 0000000..93048a9
--- /dev/null
+++ b/src/usr/local/www/interfaces_qinq_edit.php
@@ -0,0 +1,444 @@
+<?php
+/*
+ interfaces_qinq_edit.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/sbin/ngctl
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-qinq-edit
+##|*NAME=Interfaces: QinQ: Edit page
+##|*DESCR=Allow access to 'Interfaces: QinQ: Edit' page
+##|*MATCH=interfaces_qinq_edit.php*
+##|-PRIV
+
+$pgtitle = array(gettext("Interfaces"), gettext("QinQ"), gettext("Edit"));
+$shortcut_section = "interfaces";
+
+require("guiconfig.inc");
+
+if (!is_array($config['qinqs']['qinqentry'])) {
+ $config['qinqs']['qinqentry'] = array();
+}
+
+$a_qinqs = &$config['qinqs']['qinqentry'];
+
+$portlist = get_interface_list();
+
+/* add LAGG interfaces */
+if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
+ foreach ($config['laggs']['lagg'] as $lagg) {
+ $portlist[$lagg['laggif']] = $lagg;
+ }
+}
+
+if (count($portlist) < 1) {
+ header("Location: interfaces_qinq.php");
+ exit;
+}
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_qinqs[$id]) {
+ $pconfig['if'] = $a_qinqs[$id]['if'];
+ $pconfig['tag'] = $a_qinqs[$id]['tag'];
+ $pconfig['members'] = $a_qinqs[$id]['members'];
+ $pconfig['descr'] = html_entity_decode($a_qinqs[$id]['descr']);
+/*
+ $pconfig['autoassign'] = isset($a_qinqs[$id]['autoassign']);
+ $pconfig['autoenable'] = isset($a_qinqs[$id]['autoenable']);
+*/
+ $pconfig['autogroup'] = isset($a_qinqs[$id]['autogroup']);
+ $pconfig['autoadjustmtu'] = isset($a_qinqs[$id]['autoadjustmtu']);
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (empty($_POST['tag'])) {
+ $input_errors[] = gettext("First level tag cannot be empty.");
+ }
+ if (isset($id) && $a_qinqs[$id]['tag'] != $_POST['tag']) {
+ $input_errors[] = gettext("You are editing an existing entry and modifying the first level tag is not allowed.");
+ }
+ if (isset($id) && $a_qinqs[$id]['if'] != $_POST['if']) {
+ $input_errors[] = gettext("You are editing an existing entry and modifying the interface is not allowed.");
+ }
+ if (!isset($id)) {
+ foreach ($a_qinqs as $qinqentry) {
+ if ($qinqentry['tag'] == $_POST['tag'] && $qinqentry['if'] == $_POST['if']) {
+ $input_errors[] = gettext("QinQ level already exists for this interface, edit it!");
+ }
+ }
+ if (is_array($config['vlans']['vlan'])) {
+ foreach ($config['vlans']['vlan'] as $vlan) {
+ if ($vlan['tag'] == $_POST['tag'] && $vlan['if'] == $_POST['if']) {
+ $input_errors[] = gettext("A normal VLAN exists with this tag please remove it to use this tag for QinQ first level.");
+ }
+ }
+ }
+ }
+
+ $qinqentry = array();
+ $qinqentry['if'] = $_POST['if'];
+ $qinqentry['tag'] = $_POST['tag'];
+/*
+ if ($_POST['autoassign'] == "yes") { {
+ $qinqentry['autoassign'] = true;
+ }
+ if ($_POST['autoenable'] == "yes") {
+ $qinqentry['autoenable'] = true;
+ }
+ if ($_POST['autoadjust'] == "yes") {
+ $qinqentry['autoadjustmtu'] = true;
+ }
+*/
+ if ($_POST['autogroup'] == "yes") {
+ $qinqentry['autogroup'] = true;
+ }
+
+ $members = "";
+ $isfirst = 0;
+ /* item is a normal qinqentry type */
+ for ($x = 0; $x < 9999; $x++) {
+ if ($_POST["members{$x}"] <> "") {
+ $member = explode("-", $_POST["members{$x}"]);
+ if (count($member) > 1) {
+ if (preg_match("/([^0-9])+/", $member[0], $match) ||
+ preg_match("/([^0-9])+/", $member[1], $match)) {
+ $input_errors[] = gettext("Tags can contain only numbers or a range in format #-#.");
+ }
+
+ for ($i = $member[0]; $i <= $member[1]; $i++) {
+ if ($isfirst > 0) {
+ $members .= " ";
+ }
+ $members .= $i;
+ $isfirst++;
+ }
+ } else {
+ if (preg_match("/([^0-9])+/", $_POST["members{$x}"], $match)) {
+ $input_errors[] = gettext("Tags can contain only numbers or a range in format #-#.");
+ }
+
+ if ($isfirst > 0) {
+ $members .= " ";
+ }
+ $members .= $_POST["members{$x}"];
+ $isfirst++;
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ $qinqentry['members'] = $members;
+ $qinqentry['descr'] = $_POST['descr'];
+ $qinqentry['vlanif'] = "{$_POST['if']}_{$_POST['tag']}";
+ $nmembers = explode(" ", $members);
+
+ if (isset($id) && $a_qinqs[$id]) {
+ $omembers = explode(" ", $a_qinqs[$id]['members']);
+ $delmembers = array_diff($omembers, $nmembers);
+ $addmembers = array_diff($nmembers, $omembers);
+
+ if ((count($delmembers) > 0) || (count($addmembers) > 0)) {
+ $fd = fopen("{$g['tmp_path']}/netgraphcmd", "w");
+ foreach ($delmembers as $tag) {
+ fwrite($fd, "shutdown {$qinqentry['vlanif']}h{$tag}:\n");
+ fwrite($fd, "msg {$qinqentry['vlanif']}qinq: delfilter \\\"{$qinqentry['vlanif']}{$tag}\\\"\n");
+ }
+
+ foreach ($addmembers as $member) {
+ $qinq = array();
+ $qinq['if'] = $qinqentry['vlanif'];
+ $qinq['tag'] = $member;
+ $macaddr = get_interface_mac($qinqentry['vlanif']);
+ interface_qinq2_configure($qinq, $fd, $macaddr);
+ }
+
+ fclose($fd);
+ mwexec("/usr/sbin/ngctl -f {$g['tmp_path']}/netgraphcmd");
+ }
+ $a_qinqs[$id] = $qinqentry;
+ } else {
+ interface_qinq_configure($qinqentry);
+ $a_qinqs[] = $qinqentry;
+ }
+ if ($_POST['autogroup'] == "yes") {
+ if (!is_array($config['ifgroups']['ifgroupentry'])) {
+ $config['ifgroups']['ifgroupentry'] = array();
+ }
+ foreach ($config['ifgroups']['ifgroupentry'] as $gid => $group) {
+ if ($group['ifname'] == "QinQ") {
+ $found = true;
+ break;
+ }
+ }
+ $additions = "";
+ foreach ($nmembers as $qtag) {
+ $additions .= "{$qinqentry['vlanif']}_{$qtag} ";
+ }
+ $additions .= "{$qinqentry['vlanif']}";
+ if ($found == true) {
+ $config['ifgroups']['ifgroupentry'][$gid]['members'] .= " {$additions}";
+ } else {
+ $gentry = array();
+ $gentry['ifname'] = "QinQ";
+ $gentry['members'] = "{$additions}";
+ $gentry['descr'] = gettext("QinQ VLANs group");
+ $config['ifgroups']['ifgroupentry'][] = $gentry;
+ }
+ }
+
+ write_config();
+
+ header("Location: interfaces_qinq.php");
+ exit;
+ } else {
+ $pconfig['descr'] = $_POST['descr'];
+ $pconfig['tag'] = $_POST['tag'];
+ $pconfig['members'] = $members;
+ }
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+// Global Variables
+var rowname = new Array(9999);
+var rowtype = new Array(9999);
+var newrow = new Array(9999);
+var rowsize = new Array(9999);
+
+for (i = 0; i < 9999; i++) {
+ rowname[i] = 'members';
+ rowtype[i] = 'select';
+ newrow[i] = '';
+ rowsize[i] = '30';
+}
+
+var field_counter_js = 0;
+var loaded = 0;
+var is_streaming_progress_bar = 0;
+var temp_streaming_text = "";
+
+var addRowTo = (function() {
+ return (function (tableId) {
+ var d, tbody, tr, td, bgc, i, ii, j;
+ d = document;
+ tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
+ tr = d.createElement("tr");
+ for (i = 0; i < field_counter_js; i++) {
+ td = d.createElement("td");
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input size='" + rowsize[i] + "' class='formfld unknown' name='" + rowname[i] + totalrows + "' /> ";
+ tr.appendChild(td);
+ }
+ td = d.createElement("td");
+ td.rowSpan = "1";
+
+ td.innerHTML = '<a onclick="removeRow(this);return false;" href="#"><img border="0" src="/themes/' + theme + '/images/icons/icon_x.gif" alt="remove" /><\/a>';
+ tr.appendChild(td);
+ tbody.appendChild(tr);
+ totalrows++;
+ });
+})();
+
+function removeRow(el) {
+ var cel;
+ while (el && el.nodeName.toLowerCase() != "tr") {
+ el = el.parentNode;
+ }
+
+ if (el && el.parentNode) {
+ cel = el.getElementsByTagName("td").item(0);
+ el.parentNode.removeChild(el);
+ }
+}
+
+ rowname[0] = <?=gettext("members");?>;
+ rowtype[0] = "textbox";
+ rowsize[0] = "30";
+
+ rowname[2] = <?=gettext("detail");?>;
+ rowtype[2] = "textbox";
+ rowsize[2] = "50";
+//]]>
+</script>
+<input type='hidden' name='members_type' value='textbox' class="formfld unknown" />
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<div id="inputerrors"></div>
+
+<form action="interfaces_qinq_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces qinq edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Interface QinQ Edit");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface");?></td>
+ <td width="78%" class="vtable">
+ <select name="if" id="if" class="formselect">
+ <?php
+ foreach ($portlist as $ifn => $ifinfo) {
+ if (is_jumbo_capable($ifn)) {
+ echo "<option value=\"{$ifn}\"";
+ if ($ifn == $pconfig['if']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">";
+ echo htmlspecialchars($ifn . " (" . $ifinfo['mac'] . ")");
+ echo "</option>";
+ }
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Only QinQ capable interfaces will be shown.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("First level tag");?></td>
+ <td width="78%" class="vtable">
+ <input name="tag" type="text" class="formfld unknown" id="tag" size="10" value="<?=htmlspecialchars($pconfig['tag']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("This is the first level VLAN tag. On top of this are stacked the member VLANs defined below.");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Options");?></td>
+ <td width="78%" class="vtable">
+<?php /* ?>
+ <br />
+ <input type="checkbox" value="yes" name="autoassign" id="autoassign" <?php if ($pconfig['autoassign']) echo "checked=\"checked\""; ?> />
+ <span class="vexpl"> Auto assign interface so it can be configured with ip etc...</span>
+ <br />
+ <input type="checkbox" value="yes" name="autoenable" id="autoenable" <?php if ($pconfig['autoenable']) echo "checked=\"checked\""; ?> />
+ <span class="vexpl"> Auto enable interface so it can be used on filter rules.</span>
+ <br />
+ <input type="checkbox" value="yes" name="autoadjustmtu" id="autoadjustmtu" <?php if ($pconfig['autoadjustmtu']) echo "checked=\"checked\""; ?> />
+ <span class="vexpl"> Allows to keep clients mtu unchanged(1500). <br />NOTE: if you are using jumbo frames this option is not needed and may produce incorrect results!</span>
+<?php */ ?>
+ <br />
+ <input name="autogroup" type="checkbox" value="yes" id="autogroup" <?php if ($pconfig['autogroup']) echo "checked=\"checked\""; ?> />
+ <span class="vexpl"><?=gettext("Adds interface to QinQ interface groups so you can write filter rules easily.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed).");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><div id="membersnetworkport"><?=gettext("Member (s)");?></div></td>
+ <td width="78%" class="vtable">
+ <span class="vexpl">
+ <?=gettext("You can specify ranges in the input below. The format is pretty simple i.e 9-100 or 10.20...");?>
+ </span>
+ <br />
+ <table id="maintable" summary="main table">
+ <tbody>
+ <tr>
+ <td><div id="onecolumn"><?=gettext("Tag");?></div></td>
+ </tr>
+
+<?php
+ $counter = 0;
+ $members = $pconfig['members'];
+ if ($members <> "") {
+ $item = explode(" ", $members);
+ foreach ($item as $ww) {
+ $member = $item[$counter];
+?>
+ <tr>
+ <td class="vtable">
+ <input name="members<?php echo $counter; ?>" class="formselect" id="members<?php echo $counter; ?>" value="<?php echo htmlspecialchars($member);?>" />
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="remove" /></a>
+ </td>
+ </tr>
+<?php
+ $counter++;
+
+ } // end foreach
+ } // end if
+?>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('maintable'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <a href="interfaces_qinq.php"><input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
+ <?php if (isset($id) && $a_qinqs[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+
+<script type="text/javascript">
+//<![CDATA[
+ field_counter_js = 1;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+//]]>
+</script>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_vlan.php b/src/usr/local/www/interfaces_vlan.php
new file mode 100644
index 0000000..20453b4
--- /dev/null
+++ b/src/usr/local/www/interfaces_vlan.php
@@ -0,0 +1,165 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_vlan.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-vlan
+##|*NAME=Interfaces: VLAN page
+##|*DESCR=Allow access to the 'Interfaces: VLAN' page.
+##|*MATCH=interfaces_vlan.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['vlans']['vlan'])) {
+ $config['vlans']['vlan'] = array();
+}
+
+$a_vlans = &$config['vlans']['vlan'] ;
+
+function vlan_inuse($num) {
+ global $config, $a_vlans;
+
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if) {
+ if ($config['interfaces'][$if]['if'] == $a_vlans[$num]['vlanif']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+if ($_GET['act'] == "del") {
+ if (!isset($_GET['id'])) {
+ $input_errors[] = gettext("Wrong parameters supplied");
+ } else if (empty($a_vlans[$_GET['id']])) {
+ $input_errors[] = gettext("Wrong index supplied");
+ /* check if still in use */
+ } else if (vlan_inuse($_GET['id'])) {
+ $input_errors[] = gettext("This VLAN cannot be deleted because it is still being used as an interface.");
+ } else {
+ if (does_interface_exist($a_vlans[$_GET['id']]['vlanif'])) {
+ pfSense_interface_destroy($a_vlans[$_GET['id']]['vlanif']);
+ }
+ unset($a_vlans[$_GET['id']]);
+
+ write_config();
+
+ header("Location: interfaces_vlan.php");
+ exit;
+ }
+}
+
+
+$pgtitle = array(gettext("Interfaces"), gettext("VLAN"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces vlan">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), true, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+ $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
+ $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
+ $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+ $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("VLAN tag");?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_vlans as $vlan):
+?>
+ <tr ondblclick="document.location='interfaces_vlan_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+ <?=htmlspecialchars($vlan['if']);?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($vlan['tag']);?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($vlan['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap"> <a href="interfaces_vlan_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="interfaces_vlan.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this VLAN?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="3">&nbsp;</td>
+ <td class="list"> <a href="interfaces_vlan_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ <tr>
+ <td colspan="3" class="list"><p class="vexpl">
+ <span class="red"><strong>
+ <?=gettext("Note:");?><br />
+ </strong></span>
+ <?php printf(gettext("Not all drivers/NICs support 802.1Q VLAN tagging properly. On cards that do not explicitly support it, VLAN tagging will still work, but the reduced MTU may cause problems. See the %s handbook for information on supported cards."), $g['product_name']);?> </p>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_vlan_edit.php b/src/usr/local/www/interfaces_vlan_edit.php
new file mode 100644
index 0000000..dd9f1a7
--- /dev/null
+++ b/src/usr/local/www/interfaces_vlan_edit.php
@@ -0,0 +1,236 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_vlan_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-vlan-edit
+##|*NAME=Interfaces: VLAN: Edit page
+##|*DESCR=Allow access to the 'Interfaces: VLAN: Edit' page.
+##|*MATCH=interfaces_vlan_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_vlan.php');
+}
+
+if (!is_array($config['vlans']['vlan'])) {
+ $config['vlans']['vlan'] = array();
+}
+
+$a_vlans = &$config['vlans']['vlan'];
+
+$portlist = get_interface_list();
+
+/* add LAGG interfaces */
+if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
+ foreach ($config['laggs']['lagg'] as $lagg) {
+ $portlist[$lagg['laggif']] = $lagg;
+ }
+}
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_vlans[$id]) {
+ $pconfig['if'] = $a_vlans[$id]['if'];
+ $pconfig['vlanif'] = $a_vlans[$id]['vlanif'];
+ $pconfig['tag'] = $a_vlans[$id]['tag'];
+ $pconfig['descr'] = $a_vlans[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "if tag");
+ $reqdfieldsn = array(gettext("Parent interface"), gettext("VLAN tag"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (isset($_POST['tag']) && (!is_numericint($_POST['tag']) || ($_POST['tag'] < '1') || ($_POST['tag'] > '4094'))) {
+ $input_errors[] = gettext("The VLAN tag must be an integer between 1 and 4094.");
+ }
+
+ if (!does_interface_exist($_POST['if'])) {
+ $input_errors[] = gettext("Interface supplied as parent is invalid");
+ }
+
+ if (isset($id)) {
+ if ($_POST['tag'] && $_POST['tag'] != $a_vlans[$id]['tag']) {
+ if (!empty($a_vlans[$id]['vlanif']) && convert_real_interface_to_friendly_interface_name($a_vlans[$id]['vlanif']) != NULL) {
+ $input_errors[] = gettext("Interface is assigned and you cannot change the VLAN tag while assigned.");
+ }
+ }
+ }
+ foreach ($a_vlans as $vlan) {
+ if (isset($id) && ($a_vlans[$id]) && ($a_vlans[$id] === $vlan)) {
+ continue;
+ }
+
+ if (($vlan['if'] == $_POST['if']) && ($vlan['tag'] == $_POST['tag'])) {
+ $input_errors[] = sprintf(gettext("A VLAN with the tag %s is already defined on this interface."), $vlan['tag']);
+ break;
+ }
+ }
+ if (is_array($config['qinqs']['qinqentry'])) {
+ foreach ($config['qinqs']['qinqentry'] as $qinq) {
+ if ($qinq['tag'] == $_POST['tag'] && $qinq['if'] == $_POST['if']) {
+ $input_errors[] = gettext("A QinQ VLAN exists with this tag please remove it to use this tag with.");
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ if (isset($id) && $a_vlans[$id]) {
+ if (($a_vlans[$id]['if'] != $_POST['if']) || ($a_vlans[$id]['tag'] != $_POST['tag'])) {
+ if (!empty($a_vlans[$id]['vlanif'])) {
+ $confif = convert_real_interface_to_friendly_interface_name($vlan['vlanif']);
+ // Destroy previous vlan
+ pfSense_interface_destroy($a_vlans[$id]['vlanif']);
+ } else {
+ pfSense_interface_destroy("{$a_vlans[$id]['if']}_vlan{$a_vlans[$id]['tag']}");
+ $confif = convert_real_interface_to_friendly_interface_name("{$a_vlans[$id]['if']}_vlan{$a_vlans[$id]['tag']}");
+ }
+ if ($confif <> "") {
+ $config['interfaces'][$confif]['if'] = "{$_POST['if']}_vlan{$_POST['tag']}";
+ }
+ }
+ }
+ $vlan = array();
+ $vlan['if'] = $_POST['if'];
+ $vlan['tag'] = $_POST['tag'];
+ $vlan['descr'] = $_POST['descr'];
+ $vlan['vlanif'] = "{$_POST['if']}_vlan{$_POST['tag']}";
+
+ $vlan['vlanif'] = interface_vlan_configure($vlan);
+ if ($vlan['vlanif'] == "" || !stristr($vlan['vlanif'], "vlan")) {
+ $input_errors[] = gettext("Error occurred creating interface, please retry.");
+ } else {
+ if (isset($id) && $a_vlans[$id]) {
+ $a_vlans[$id] = $vlan;
+ } else {
+ $a_vlans[] = $vlan;
+ }
+
+ write_config();
+
+ if ($confif <> "") {
+ interface_configure($confif);
+ }
+
+ header("Location: interfaces_vlan.php");
+ exit;
+ }
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("VLAN"), gettext("Edit"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="interfaces_vlan_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces vlan edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("VLAN configuration");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface");?></td>
+ <td width="78%" class="vtable">
+ <select name="if" class="formselect">
+ <?php
+ foreach ($portlist as $ifn => $ifinfo) {
+ if (is_jumbo_capable($ifn)) {
+ echo "<option value=\"{$ifn}\"";
+ if ($ifn == $pconfig['if']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">";
+ echo htmlspecialchars($ifn . " (" . $ifinfo['mac'] . ")");
+ echo "</option>";
+ }
+ }
+ ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Only VLAN capable interfaces will be shown.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("VLAN tag ");?></td>
+ <td class="vtable">
+ <input name="tag" type="text" class="formfld unknown" id="tag" size="6" value="<?=htmlspecialchars($pconfig['tag']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("802.1Q VLAN tag (between 1 and 4094) ");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="vlanif" value="<?=htmlspecialchars($pconfig['vlanif']); ?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_vlans[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_wireless.php b/src/usr/local/www/interfaces_wireless.php
new file mode 100644
index 0000000..86fc077
--- /dev/null
+++ b/src/usr/local/www/interfaces_wireless.php
@@ -0,0 +1,160 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_wireless.php
+
+ Copyright (C) 2010 Erik Fonnesbeck
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces_assign
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-wireless
+##|*NAME=Interfaces: Wireless page
+##|*DESCR=Allow access to the 'Interfaces: Wireless' page.
+##|*MATCH=interfaces_wireless.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['wireless'])) {
+ $config['wireless'] = array();
+}
+if (!is_array($config['wireless']['clone'])) {
+ $config['wireless']['clone'] = array();
+}
+
+$a_clones = &$config['wireless']['clone'];
+
+function clone_inuse($num) {
+ global $config, $a_clones;
+
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if) {
+ if ($config['interfaces'][$if]['if'] == $a_clones[$num]['cloneif']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+if ($_GET['act'] == "del") {
+ /* check if still in use */
+ if (clone_inuse($_GET['id'])) {
+ $input_errors[] = gettext("This wireless clone cannot be deleted because it is assigned as an interface.");
+ } else {
+ mwexec("/sbin/ifconfig " . $a_clones[$_GET['id']]['cloneif'] . " destroy");
+ unset($a_clones[$_GET['id']]);
+
+ write_config();
+
+ header("Location: interfaces_wireless.php");
+ exit;
+ }
+}
+
+
+$pgtitle = array(gettext("Interfaces"), gettext("Wireless"));
+$shortcut_section = "wireless";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces wireless">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Interface assignments"), false, "interfaces_assign.php");
+ $tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
+ $tab_array[2] = array(gettext("Wireless"), true, "interfaces_wireless.php");
+ $tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
+ $tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
+ $tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
+ $tab_array[6] = array(gettext("GRE"), false, "interfaces_gre.php");
+ $tab_array[7] = array(gettext("GIF"), false, "interfaces_gif.php");
+ $tab_array[8] = array(gettext("Bridges"), false, "interfaces_bridge.php");
+ $tab_array[9] = array(gettext("LAGG"), false, "interfaces_lagg.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main table">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Mode");?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_clones as $clone):
+?>
+ <tr ondblclick="document.location='interfaces_wireless_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+ <?=htmlspecialchars($clone['cloneif']);?>
+ </td>
+ <td class="listr">
+ <?= $wlan_modes[$clone['mode']]; ?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($clone['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap"> <a href="interfaces_wireless_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" ></a>
+ &nbsp;<a href="interfaces_wireless.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this wireless clone?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="3">&nbsp;</td>
+ <td class="list"> <a href="interfaces_wireless_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a></td>
+ </tr>
+ <tr>
+ <td colspan="3" class="list"><p class="vexpl">
+ <span class="red"><strong>
+ <?=gettext("Note");?>:<br />
+ </strong></span>
+ <?=gettext("Here you can configure clones of wireless interfaces, which can be assigned as separate independent interfaces. Only available on wireless chipsets that support this, with limitations on the number that can be created in each mode.");?></p>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/interfaces_wireless_edit.php b/src/usr/local/www/interfaces_wireless_edit.php
new file mode 100644
index 0000000..6ccce5c
--- /dev/null
+++ b/src/usr/local/www/interfaces_wireless_edit.php
@@ -0,0 +1,230 @@
+<?php
+/* $Id$ */
+/*
+ interfaces_wireless_edit.php
+
+ Copyright (C) 2010 Erik Fonnesbeck
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-interfaces-wireless-edit
+##|*NAME=Interfaces: Wireless edit page
+##|*DESCR=Allow access to the 'Interfaces: Wireless : Edit' page.
+##|*MATCH=interfaces_wireless_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_wireless.php');
+}
+
+if (!is_array($config['wireless'])) {
+ $config['wireless'] = array();
+}
+if (!is_array($config['wireless']['clone'])) {
+ $config['wireless']['clone'] = array();
+}
+
+$a_clones = &$config['wireless']['clone'];
+
+function clone_inuse($num) {
+ global $config, $a_clones;
+
+ $iflist = get_configured_interface_list(false, true);
+ foreach ($iflist as $if) {
+ if ($config['interfaces'][$if]['if'] == $a_clones[$num]['cloneif']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function clone_compare($a, $b) {
+ return strnatcmp($a['cloneif'], $b['cloneif']);
+}
+
+$portlist = get_interface_list();
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_clones[$id]) {
+ $pconfig['if'] = $a_clones[$id]['if'];
+ $pconfig['cloneif'] = $a_clones[$id]['cloneif'];
+ $pconfig['mode'] = $a_clones[$id]['mode'];
+ $pconfig['descr'] = $a_clones[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "if mode");
+ $reqdfieldsn = array(gettext("Parent interface"), gettext("Mode"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!$input_errors) {
+ $clone = array();
+ $clone['if'] = $_POST['if'];
+ $clone['mode'] = $_POST['mode'];
+ $clone['descr'] = $_POST['descr'];
+
+ if (isset($id) && $a_clones[$id]) {
+ if ($clone['if'] == $a_clones[$id]['if']) {
+ $clone['cloneif'] = $a_clones[$id]['cloneif'];
+ }
+ }
+ if (!$clone['cloneif']) {
+ $clone_id = 1;
+ do {
+ $clone_exists = false;
+ $clone['cloneif'] = "{$_POST['if']}_wlan{$clone_id}";
+ foreach ($a_clones as $existing) {
+ if ($clone['cloneif'] == $existing['cloneif']) {
+ $clone_exists = true;
+ $clone_id++;
+ break;
+ }
+ }
+ } while ($clone_exists);
+ }
+
+ if (isset($id) && $a_clones[$id]) {
+ if (clone_inuse($id)) {
+ if ($clone['if'] != $a_clones[$id]['if']) {
+ $input_errors[] = gettext("This wireless clone cannot be modified because it is still assigned as an interface.");
+ } else if ($clone['mode'] != $a_clones[$id]['mode']) {
+ $input_errors[] = gettext("Use the configuration page for the assigned interface to change the mode.");
+ }
+ }
+ }
+ if (!$input_errors) {
+ if (!interface_wireless_clone($clone['cloneif'], $clone)) {
+ $input_errors[] = sprintf(gettext('Error creating interface with mode %1$s. The %2$s interface may not support creating more clones with the selected mode.'), $wlan_modes[$clone['mode']], $clone['if']);
+ } else {
+ if (isset($id) && $a_clones[$id]) {
+ if ($clone['if'] != $a_clones[$id]['if']) {
+ mwexec("/sbin/ifconfig " . $a_clones[$id]['cloneif'] . " destroy");
+ }
+ $input_errors[] = sprintf(gettext("Created with id %s"), $id);
+ $a_clones[$id] = $clone;
+ } else {
+ $input_errors[] = gettext("Created without id");
+ $a_clones[] = $clone;
+ }
+
+ usort($a_clones, "clone_compare");
+ write_config();
+
+ header("Location: interfaces_wireless.php");
+ exit;
+ }
+ }
+ }
+}
+
+$pgtitle = array(gettext("Interfaces"), gettext("Wireless"), gettext("Edit"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="interfaces_wireless_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="interfaces wireless edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Wireless clone configuration");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface");?></td>
+ <td width="78%" class="vtable">
+ <select name="if" class="formselect">
+ <?php
+ foreach ($portlist as $ifn => $ifinfo) {
+ if (preg_match($g['wireless_regex'], $ifn)) {
+ echo "<option value=\"{$ifn}\"";
+ if ($ifn == $pconfig['if']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">";
+ echo htmlspecialchars($ifn . " (" . $ifinfo['mac'] . ")");
+ echo "</option>";
+ }
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Mode");?></td>
+ <td class="vtable">
+ <select name="mode" class="formselect">
+ <option <?php if ($pconfig['mode'] == 'bss') echo "selected=\"selected\"";?> value="bss"><?=gettext("Infrastructure (BSS)");?></option>
+ <option <?php if ($pconfig['mode'] == 'adhoc') echo "selected=\"selected\"";?> value="adhoc"><?=gettext("Ad-hoc (IBSS)");?></option>
+ <option <?php if ($pconfig['mode'] == 'hostap') echo "selected=\"selected\"";?> value="hostap"><?=gettext("Access Point");?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="cloneif" value="<?=htmlspecialchars($pconfig['cloneif']); ?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_clones[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/javascript/autosuggest.js b/src/usr/local/www/javascript/autosuggest.js
new file mode 100644
index 0000000..d9b5ac0
--- /dev/null
+++ b/src/usr/local/www/javascript/autosuggest.js
@@ -0,0 +1,337 @@
+
+/**
+ * An autosuggest textbox control.
+ * @class
+ * @scope public
+ */
+function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
+ oProvider /*:SuggestionProvider*/) {
+
+ /**
+ * The currently selected suggestions.
+ * @scope private
+ */
+ this.cur /*:int*/ = -1;
+
+ /**
+ * The dropdown list layer.
+ * @scope private
+ */
+ this.layer = null;
+
+ /**
+ * Suggestion provider for the autosuggest feature.
+ * @scope private.
+ */
+ this.provider /*:SuggestionProvider*/ = oProvider;
+
+ /**
+ * The textbox to capture.
+ * @scope private
+ */
+ this.textbox /*:HTMLInputElement*/ = oTextbox;
+
+ //initialize the control
+ this.init();
+
+}
+
+/**
+ * Autosuggests one or more suggestions for what the user has typed.
+ * If no suggestions are passed in, then no autosuggest occurs.
+ * @scope private
+ * @param aSuggestions An array of suggestion strings.
+ * @param bTypeAhead If the control should provide a type ahead suggestion.
+ */
+AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
+ bTypeAhead /*:boolean*/) {
+
+ //make sure there's at least one suggestion
+ if (aSuggestions.length > 0) {
+ if (bTypeAhead) {
+ this.typeAhead(aSuggestions[0]);
+ }
+
+ this.showSuggestions(aSuggestions);
+ } else {
+ this.hideSuggestions();
+ }
+};
+
+/**
+ * Creates the dropdown layer to display multiple suggestions.
+ * @scope private
+ */
+AutoSuggestControl.prototype.createDropDown = function () {
+
+ var oThis = this;
+
+ //create the layer and assign styles
+ this.layer = document.createElement("div");
+ this.layer.className = "suggestions";
+ this.layer.style.visibility = "hidden";
+ this.layer.style.width = this.textbox.offsetWidth;
+
+ //when the user clicks on the a suggestion, get the text (innerHTML)
+ //and place it into a textbox
+ this.layer.onmousedown =
+ this.layer.onmouseup =
+ this.layer.onmouseover = function (oEvent) {
+ oEvent = oEvent || window.event;
+ oTarget = oEvent.target || oEvent.srcElement;
+
+ if (oEvent.type == "mousedown") {
+ oThis.textbox.value = oTarget.firstChild.nodeValue;
+ oThis.hideSuggestions();
+ } else if (oEvent.type == "mouseover") {
+ oThis.highlightSuggestion(oTarget);
+ } else {
+ oThis.textbox.focus();
+ }
+ };
+
+
+ document.body.appendChild(this.layer);
+};
+
+/**
+ * Gets the left coordinate of the textbox.
+ * @scope private
+ * @return The left coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iLeft = 0;
+
+ while(oNode.tagName != "BODY") {
+ iLeft += oNode.offsetLeft;
+ oNode = oNode.offsetParent;
+ }
+
+ return iLeft;
+};
+
+/**
+ * Gets the top coordinate of the textbox.
+ * @scope private
+ * @return The top coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getTop = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iTop = 0;
+
+ while(oNode.tagName != "BODY") {
+ iTop += oNode.offsetTop;
+ oNode = oNode.offsetParent;
+ }
+
+ return iTop;
+};
+
+/**
+ * Handles three keydown events.
+ * @scope private
+ * @param oEvent The event object for the keydown event.
+ */
+AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
+
+ switch(oEvent.keyCode) {
+ case 38: //up arrow
+ this.previousSuggestion();
+ break;
+ case 40: //down arrow
+ this.nextSuggestion();
+ break;
+ case 13: //enter
+ this.hideSuggestions();
+ break;
+ }
+
+};
+
+/**
+ * Handles keyup events.
+ * @scope private
+ * @param oEvent The event object for the keyup event.
+ */
+AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
+
+ var iKeyCode = oEvent.keyCode;
+
+ //for backspace (8) and delete (46), shows suggestions without typeahead
+ if (iKeyCode == 8 || iKeyCode == 46) {
+ this.provider.requestSuggestions(this, false);
+
+ //make sure not to interfere with non-character keys
+ } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
+ //ignore
+ } else {
+ //request suggestions from the suggestion provider with typeahead
+ this.provider.requestSuggestions(this, true);
+ }
+};
+
+/**
+ * Hides the suggestion dropdown.
+ * @scope private
+ */
+AutoSuggestControl.prototype.hideSuggestions = function () {
+ this.layer.style.visibility = "hidden";
+};
+
+/**
+ * Highlights the given node in the suggestions dropdown.
+ * @scope private
+ * @param oSuggestionNode The node representing a suggestion in the dropdown.
+ */
+AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
+
+ for (var i=0; i < this.layer.childNodes.length; i++) {
+ var oNode = this.layer.childNodes[i];
+ if (oNode == oSuggestionNode) {
+ oNode.className = "current";
+ } else if (oNode.className == "current") {
+ oNode.className = "";
+ }
+ }
+};
+
+/**
+ * Initializes the textbox with event handlers for
+ * auto suggest functionality.
+ * @scope private
+ */
+AutoSuggestControl.prototype.init = function () {
+
+ //save a reference to this object
+ var oThis = this;
+
+ //assign the onkeyup event handler
+ this.textbox.onkeyup = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyUp() method with the event object
+ oThis.handleKeyUp(oEvent);
+ };
+
+ //assign onkeydown event handler
+ this.textbox.onkeydown = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyDown() method with the event object
+ oThis.handleKeyDown(oEvent);
+ };
+
+ //assign onblur event handler (hides suggestions)
+ this.textbox.onblur = function () {
+ oThis.hideSuggestions();
+ };
+
+ //create the suggestions dropdown
+ this.createDropDown();
+};
+
+/**
+ * Highlights the next suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.nextSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
+ var oNode = cSuggestionNodes[++this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Highlights the previous suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.previousSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur > 0) {
+ var oNode = cSuggestionNodes[--this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Selects a range of text in the textbox.
+ * @scope public
+ * @param iStart The start index (base 0) of the selection.
+ * @param iLength The number of characters to select.
+ */
+AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
+
+ //use text ranges for Internet Explorer
+ if (this.textbox.createTextRange) {
+ var oRange = this.textbox.createTextRange();
+ oRange.moveStart("character", iStart);
+ oRange.moveEnd("character", iLength - this.textbox.value.length);
+ oRange.select();
+
+ //use setSelectionRange() for Mozilla
+ } else if (this.textbox.setSelectionRange) {
+ this.textbox.setSelectionRange(iStart, iLength);
+ }
+
+ //set focus back to the textbox
+ this.textbox.focus();
+};
+
+/**
+ * Builds the suggestion layer contents, moves it into position,
+ * and displays the layer.
+ * @scope private
+ * @param aSuggestions An array of suggestions for the control.
+ */
+AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
+
+ var oDiv = null;
+ this.layer.innerHTML = ""; //clear contents of the layer
+
+ for (var i=0; i < aSuggestions.length; i++) {
+ oDiv = document.createElement("div");
+ oDiv.appendChild(document.createTextNode(aSuggestions[i]));
+ this.layer.appendChild(oDiv);
+ }
+
+ this.layer.style.left = this.getLeft() + "px";
+ this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
+ this.layer.style.width = this.textbox.offsetWidth + "px";
+ this.layer.style.visibility = "visible";
+
+};
+
+/**
+ * Inserts a suggestion into the textbox, highlighting the
+ * suggested part of the text.
+ * @scope private
+ * @param sSuggestion The suggestion for the textbox.
+ */
+AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
+
+ //check for support of typeahead functionality
+ if (this.textbox.createTextRange || this.textbox.setSelectionRange){
+ var iLen = this.textbox.value.length;
+ this.textbox.value = sSuggestion;
+ this.selectRange(iLen, sSuggestion.length);
+ }
+};
+
diff --git a/src/usr/local/www/javascript/base64.js b/src/usr/local/www/javascript/base64.js
new file mode 100644
index 0000000..48d5f33
--- /dev/null
+++ b/src/usr/local/www/javascript/base64.js
@@ -0,0 +1,142 @@
+/**
+ *
+ * Base64 encode / decode
+ * http://www.webtoolkit.info/
+ * http://www.webtoolkit.info/licence
+ **/
+
+var Base64 = {
+
+ // private property
+ _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
+
+ // public method for encoding
+ encode : function (input) {
+ var output = "";
+ var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
+ var i = 0;
+
+ input = Base64._utf8_encode(input);
+
+ while (i < input.length) {
+
+ chr1 = input.charCodeAt(i++);
+ chr2 = input.charCodeAt(i++);
+ chr3 = input.charCodeAt(i++);
+
+ enc1 = chr1 >> 2;
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+ enc4 = chr3 & 63;
+
+ if (isNaN(chr2)) {
+ enc3 = enc4 = 64;
+ } else if (isNaN(chr3)) {
+ enc4 = 64;
+ }
+
+ output = output +
+ this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
+ this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
+
+ }
+
+ return output;
+ },
+
+ // public method for decoding
+ decode : function (input) {
+ var output = "";
+ var chr1, chr2, chr3;
+ var enc1, enc2, enc3, enc4;
+ var i = 0;
+
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+ while (i < input.length) {
+
+ enc1 = this._keyStr.indexOf(input.charAt(i++));
+ enc2 = this._keyStr.indexOf(input.charAt(i++));
+ enc3 = this._keyStr.indexOf(input.charAt(i++));
+ enc4 = this._keyStr.indexOf(input.charAt(i++));
+
+ chr1 = (enc1 << 2) | (enc2 >> 4);
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+ chr3 = ((enc3 & 3) << 6) | enc4;
+
+ output = output + String.fromCharCode(chr1);
+
+ if (enc3 != 64) {
+ output = output + String.fromCharCode(chr2);
+ }
+ if (enc4 != 64) {
+ output = output + String.fromCharCode(chr3);
+ }
+
+ }
+
+ output = Base64._utf8_decode(output);
+
+ return output;
+
+ },
+
+ // private method for UTF-8 encoding
+ _utf8_encode : function (string) {
+ string = string.replace(/\r\n/g,"\n");
+ var utftext = "";
+
+ for (var n = 0; n < string.length; n++) {
+
+ var c = string.charCodeAt(n);
+
+ if (c < 128) {
+ utftext += String.fromCharCode(c);
+ }
+ else if((c > 127) && (c < 2048)) {
+ utftext += String.fromCharCode((c >> 6) | 192);
+ utftext += String.fromCharCode((c & 63) | 128);
+ }
+ else {
+ utftext += String.fromCharCode((c >> 12) | 224);
+ utftext += String.fromCharCode(((c >> 6) & 63) | 128);
+ utftext += String.fromCharCode((c & 63) | 128);
+ }
+
+ }
+
+ return utftext;
+ },
+
+ // private method for UTF-8 decoding
+ _utf8_decode : function (utftext) {
+ var string = "";
+ var i = 0;
+ var c = c1 = c2 = 0;
+
+ while ( i < utftext.length ) {
+
+ c = utftext.charCodeAt(i);
+
+ if (c < 128) {
+ string += String.fromCharCode(c);
+ i++;
+ }
+ else if((c > 191) && (c < 224)) {
+ c2 = utftext.charCodeAt(i+1);
+ string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
+ i += 2;
+ }
+ else {
+ c2 = utftext.charCodeAt(i+1);
+ c3 = utftext.charCodeAt(i+2);
+ string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
+ i += 3;
+ }
+
+ }
+
+ return string;
+ }
+
+}; \ No newline at end of file
diff --git a/src/usr/local/www/javascript/carp_status/carp_status.js b/src/usr/local/www/javascript/carp_status/carp_status.js
new file mode 100644
index 0000000..c14201d
--- /dev/null
+++ b/src/usr/local/www/javascript/carp_status/carp_status.js
@@ -0,0 +1,5 @@
+
+window.onLoad = function () {
+ NiftyCheck();
+ Rounded("div#mainlevel","all","#FFF","#eeeeee","smooth");
+};
diff --git a/src/usr/local/www/javascript/chosen/chosen-sprite.png b/src/usr/local/www/javascript/chosen/chosen-sprite.png
new file mode 100644
index 0000000..6ec9bbf
--- /dev/null
+++ b/src/usr/local/www/javascript/chosen/chosen-sprite.png
Binary files differ
diff --git a/src/usr/local/www/javascript/chosen/chosen.css b/src/usr/local/www/javascript/chosen/chosen.css
new file mode 100644
index 0000000..d2b1eb4
--- /dev/null
+++ b/src/usr/local/www/javascript/chosen/chosen.css
@@ -0,0 +1,317 @@
+div.chzn-container {
+ font-size: 13px;
+ position: relative;
+}
+
+div.chzn-container input {
+ background: #fff;
+ background: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+ background: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+ background: -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+ border: 1px solid #aaa;
+ font-family: sans-serif;
+ font-size: 1em;
+ margin: 0px;
+ padding: 4px 5px;
+ outline: none;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ -o-border-radius: 3px;
+ -ms-border-radius: 3px;
+ -khtml-border-radius: 3px;
+ border-radius: 3px;
+}
+div.chzn-container textarea:focus {
+ border-color: #058cf5;
+ -moz-box-shadow: 0px 0px 3px #aaa;
+ -webkit-box-shadow: 0px 0px 3px #aaa;
+ box-shadow: 0px 0px 3px #aaa;
+}
+
+
+div.chzn-container div.chzn-drop {
+ background: #FFF;
+ border: 1px solid #aaa;
+ border-width: 0 1px 1px;
+ left: 0;
+ position: absolute;
+ top: 29px;
+ -webkit-box-shadow: 0px 4px 5px rgba(0, 0, 0, 0.15);
+ -moz-box-shadow: 0px 4px 5px rgba(0, 0, 0, 0.15);
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.15);
+ z-index: 20;
+}
+div.chzn-container-single div.chzn-drop {
+ -moz-border-radius: 0 0 4px 4px;
+ -webkit-border-radius: 0 0 4px 4px;
+ -o-border-radius: 0 0 4px 4px;
+ -ms-border-radius: 0 0 4px 4px;
+ -khtml-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+}
+
+
+/* SINGLE */
+div.chzn-container a.chzn-single {
+ background: #FFF;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
+ background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
+ background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 50%);
+ border: 1px solid #aaa;
+ display: block;
+ overflow: hidden;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ -o-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -khtml-border-radius: 4px;
+ border-radius: 4px;
+ height: 25px;
+ color: #444;
+ line-height: 26px;
+ padding: 0px 0px 0px 8px;
+ position: relative;
+ text-decoration: none;
+ z-index: 19;
+ white-space: nowrap;
+}
+div.chzn-container a.chzn-single span {
+ display: block;
+ margin-right: 26px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+div.chzn-container a.chzn-single div {
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -o-border-top-right-radius: 4px;
+ -ms-border-top-right-radius: 4px;
+ -khtml-border-top-right-radius: 4px;
+ border-top-right-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -o-border-bottom-right-radius: 4px;
+ -ms-border-bottom-right-radius: 4px;
+ -khtml-border-bottom-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ background: #ccc;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
+ background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
+ background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
+ border-left: 1px solid #aaa;
+ display: block;
+ height: 100%;
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: 18px;
+}
+div.chzn-container a.chzn-single div b {
+ background: url('chosen-sprite.png') no-repeat 0 1px;
+ display: block;
+ width: 100%;
+ height: 100%;
+}
+div.chzn-container div.chzn-search {
+ padding: 3px 4px;
+ margin: 0px;
+ white-space: nowrap;
+}
+div.chzn-container div.chzn-search input {
+ background: url('chosen-sprite.png') no-repeat 97% -35px, #ffffff;
+ background: url('chosen-sprite.png') no-repeat 97% -35px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+ background: url('chosen-sprite.png') no-repeat 97% -35px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat 97% -35px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+ -moz-border-radius: 0px;
+ -webkit-border-radius: 0px;
+ -o-border-radius: 0px;
+ -ms-border-radius: 0px;
+ -khtml-border-radius: 0px;
+ border-radius: 0px;
+ margin: 1px 0;
+ outline: 0;
+}
+
+
+/* Multi */
+div.chzn-container ul.chzn-choices {
+ background: #fff;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+ background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+ background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+ margin: 0;
+ cursor: text;
+ border: 1px solid #aaa;
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ padding: 0;
+ position: relative;
+}
+div.chzn-container ul.chzn-choices:focus {
+ border-color: #058cf5;
+ -moz-box-shadow: 0px 0px 5px #999;
+ -webkit-box-shadow: 0px 0px 5px #999;
+ box-shadow: 0px 0px 5px #999;
+}
+div.chzn-container ul.chzn-choices li {
+ float: left;
+ list-style-type: none;
+ margin: 0px;
+}
+div.chzn-container ul.chzn-choices li.search-field {
+ margin: 0px;
+ white-space: nowrap;
+ padding: 0px;
+}
+div.chzn-container ul.chzn-choices li.search-field input {
+ color: #666;
+ background: transparent !important;
+ border: 0px !important;
+ padding: 5px;
+ margin: 1px 0;
+ outline: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+div.chzn-container ul.chzn-choices li.search-field input.default {
+ color: #999;
+}
+div.chzn-container ul.chzn-choices li.search-choice {
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ background: #e4e4e4;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e4e4e4), color-stop(0.7, #eeeeee));
+ background-image: -moz-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
+ background-image: -o-linear-gradient(bottom, #e4e4e4 0%, #eeeeee 70%);
+ color: #333;
+ border: 1px solid #b4b4b4;
+ line-height: 13px;
+ padding: 3px 19px 3px 6px;
+ position: relative;
+ margin: 3px 0px 3px 5px;
+}
+div.chzn-container ul.chzn-choices li.search-choice span {
+ cursor: default;
+}
+div.chzn-container ul.chzn-choices li.search-choice.search-choice-focus {
+ background: #d4d4d4;
+}
+div.chzn-container ul.chzn-choices li.search-choice a.search-choice-close {
+ position: absolute;
+ right: 5px;
+ top: 6px;
+ display: block;
+ width: 8px;
+ height: 9px;
+ font-size: 1px;
+ background: url(chosen-sprite.png) right top no-repeat;
+}
+div.chzn-container ul.chzn-choices li.search-choice a.search-choice-close:hover {
+ background-position: right -9px;
+}
+div.chzn-container ul.chzn-choices li.search-choice.search-choice-focus a.search-choice-close {
+ background-position: right -9px;
+}
+
+
+/* Results */
+div.chzn-container ul.chzn-results {
+ margin: 0 4px 4px 0;
+ max-height: 190px;
+ padding: 0 0 0 4px;
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+ z-index: 20;
+}
+div.chzn-container-multi ul.chzn-results {
+ margin: -1px 0 0;
+ padding: 0;
+}
+div.chzn-container-multi ul.chzn-results li {
+ border-left: 0px !important;
+ border-right: 0px !important;
+}
+div.chzn-container ul.chzn-results li {
+ line-height: 80%;
+ padding: 7px 7px 8px;
+ z-index: 22;
+ margin: 0;
+ list-style-type: none;
+}
+div.chzn-container ul.chzn-results li.active-result {
+ cursor: pointer;
+}
+div.chzn-container ul.chzn-results li em {
+ font-style: normal;
+ background: #FEFFDC;
+}
+div.chzn-container ul.chzn-results li.highlighted {
+ background: #3875d7;
+ color: #fff;
+}
+div.chzn-container ul.chzn-results li.highlighted em {
+ background: transparent;
+}
+div.chzn-container ul.chzn-results li.no-results {
+ background: #F4F4F4;
+}
+div.chzn-container ul.chzn-results li.group-result {
+ cursor: default;
+ color: #999;
+ font-weight: bold;
+}
+div.chzn-container ul.chzn-results li.group-option {
+ padding-left: 20px;
+}
+
+div.chzn-container-multi div.chzn-drop li.result-selected {
+ display: none;
+}
+
+
+
+/* Active */
+div.chzn-container-active a.chzn-single {
+ -webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
+ box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
+ border: 1px solid #5897fb;
+}
+div.chzn-container-active a.chzn-single-with-drop {
+ border: 1px solid #aaa;
+ border-width: 1px 1px 1px;
+ -moz-box-shadow: 0px 1px 0px #FFF inset;
+ -webkit-box-shadow: 0px 1px 0px #FFF inset;
+ box-shadow: 0px 1px 0px #FFF inset;
+ background: #EEE;
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
+ background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
+ background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
+ -webkit-border-bottom-left-radius: 0px;
+ -webkit-border-bottom-right-radius: 0px;
+ -moz-border-radius-bottomleft: 0px;
+ -moz-border-radius-bottomright: 0px;
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+}
+div.chzn-container-active a.chzn-single-with-drop div {
+ background: transparent;
+ border-left: none;
+}
+div.chzn-container-active a.chzn-single-with-drop div b {
+ background-position: -18px 1px;
+}
+div.chzn-container-active ul.chzn-choices {
+ z-index: 21;
+ -webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
+ box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
+ border: 1px solid #5897fb;
+}
+div.chzn-container-active ul.chzn-choices input {
+ color: #111 !important;
+}
diff --git a/src/usr/local/www/javascript/chosen/chosen.jquery.js b/src/usr/local/www/javascript/chosen/chosen.jquery.js
new file mode 100644
index 0000000..21e822a
--- /dev/null
+++ b/src/usr/local/www/javascript/chosen/chosen.jquery.js
@@ -0,0 +1,755 @@
+(function() {
+ /*
+ Chosen, a Select Box Enhancer for jQuery and Protoype
+ by Patrick Filler for Harvest, http://getharvest.com
+
+ Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
+
+ Copyright (c) 2011 by Harvest
+ */ var $, Chosen, SelectParser, get_side_border_padding, root;
+ var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+ root = typeof exports !== "undefined" && exports !== null ? exports : this;
+ $ = jQuery;
+ $.fn.extend({
+ chosen: function(data, options) {
+ return $(this).each(function(input_field) {
+ if (!($(this)).hasClass("chzn-done")) {
+ return new Chosen(this, data, options);
+ }
+ });
+ }
+ });
+ Chosen = (function() {
+ function Chosen(elmn) {
+ this.set_default_values();
+ this.form_field = elmn;
+ this.form_field_jq = $(this.form_field);
+ this.is_multiple = this.form_field.multiple;
+ this.default_text_default = this.form_field.multiple ? "Select Some Options" : "Select an Option";
+ this.set_up_html();
+ this.register_observers();
+ this.form_field_jq.addClass("chzn-done");
+ }
+ Chosen.prototype.set_default_values = function() {
+ this.click_test_action = __bind(function(evt) {
+ return this.test_active_click(evt);
+ }, this);
+ this.active_field = false;
+ this.mouse_on_container = false;
+ this.results_showing = false;
+ this.result_highlighted = null;
+ this.result_single_selected = null;
+ return this.choices = 0;
+ };
+ Chosen.prototype.set_up_html = function() {
+ var container_div, dd_top, dd_width, sf_width;
+ this.container_id = this.form_field.id + "_chzn";
+ this.f_width = this.form_field_jq.width();
+ this.default_text = this.form_field_jq.attr('title') ? this.form_field_jq.attr('title') : this.default_text_default;
+ container_div = $("<div />", {
+ id: this.container_id,
+ "class": 'chzn-container',
+ style: 'width: ' + this.f_width + 'px;'
+ });
+ if (this.is_multiple) {
+ container_div.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');
+ } else {
+ container_div.html('<a href="javascript:void(0)" class="chzn-single"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>');
+ }
+ this.form_field_jq.hide().after(container_div);
+ this.container = $('#' + this.container_id);
+ this.container.addClass("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+ this.dropdown = this.container.find('div.chzn-drop').first();
+ dd_top = this.container.height();
+ dd_width = this.f_width - get_side_border_padding(this.dropdown);
+ this.dropdown.css({
+ "width": dd_width + "px",
+ "top": dd_top + "px"
+ });
+ this.search_field = this.container.find('input').first();
+ this.search_results = this.container.find('ul.chzn-results').first();
+ this.search_field_scale();
+ this.search_no_results = this.container.find('li.no-results').first();
+ if (this.is_multiple) {
+ this.search_choices = this.container.find('ul.chzn-choices').first();
+ this.search_container = this.container.find('li.search-field').first();
+ } else {
+ this.search_container = this.container.find('div.chzn-search').first();
+ this.selected_item = this.container.find('.chzn-single').first();
+ sf_width = dd_width - get_side_border_padding(this.search_container) - get_side_border_padding(this.search_field);
+ this.search_field.css({
+ "width": sf_width + "px"
+ });
+ }
+ this.results_build();
+ return this.set_tab_index();
+ };
+ Chosen.prototype.register_observers = function() {
+ this.container.click(__bind(function(evt) {
+ return this.container_click(evt);
+ }, this));
+ this.container.mouseenter(__bind(function(evt) {
+ return this.mouse_enter(evt);
+ }, this));
+ this.container.mouseleave(__bind(function(evt) {
+ return this.mouse_leave(evt);
+ }, this));
+ this.search_results.click(__bind(function(evt) {
+ return this.search_results_click(evt);
+ }, this));
+ this.search_results.mouseover(__bind(function(evt) {
+ return this.search_results_mouseover(evt);
+ }, this));
+ this.search_results.mouseout(__bind(function(evt) {
+ return this.search_results_mouseout(evt);
+ }, this));
+ this.form_field_jq.bind("liszt:updated", __bind(function(evt) {
+ return this.results_update_field(evt);
+ }, this));
+ this.search_field.blur(__bind(function(evt) {
+ return this.input_blur(evt);
+ }, this));
+ this.search_field.keyup(__bind(function(evt) {
+ return this.keyup_checker(evt);
+ }, this));
+ this.search_field.keydown(__bind(function(evt) {
+ return this.keydown_checker(evt);
+ }, this));
+ if (this.is_multiple) {
+ this.search_choices.click(__bind(function(evt) {
+ return this.choices_click(evt);
+ }, this));
+ return this.search_field.focus(__bind(function(evt) {
+ return this.input_focus(evt);
+ }, this));
+ } else {
+ return this.selected_item.focus(__bind(function(evt) {
+ return this.activate_field(evt);
+ }, this));
+ }
+ };
+ Chosen.prototype.container_click = function(evt) {
+ if (evt && evt.type === "click") {
+ evt.stopPropagation();
+ }
+ if (!this.pending_destroy_click) {
+ if (!this.active_field) {
+ if (this.is_multiple) {
+ this.search_field.val("");
+ }
+ $(document).click(this.click_test_action);
+ this.results_show();
+ } else if (!this.is_multiple && evt && ($(evt.target) === this.selected_item || $(evt.target).parents("a.chzn-single").length)) {
+ evt.preventDefault();
+ this.results_toggle();
+ }
+ return this.activate_field();
+ } else {
+ return this.pending_destroy_click = false;
+ }
+ };
+ Chosen.prototype.mouse_enter = function() {
+ return this.mouse_on_container = true;
+ };
+ Chosen.prototype.mouse_leave = function() {
+ return this.mouse_on_container = false;
+ };
+ Chosen.prototype.input_focus = function(evt) {
+ if (!this.active_field) {
+ return setTimeout((__bind(function() {
+ return this.container_click();
+ }, this)), 50);
+ }
+ };
+ Chosen.prototype.input_blur = function(evt) {
+ if (!this.mouse_on_container) {
+ this.active_field = false;
+ return setTimeout((__bind(function() {
+ return this.blur_test();
+ }, this)), 100);
+ }
+ };
+ Chosen.prototype.blur_test = function(evt) {
+ if (!this.active_field && this.container.hasClass("chzn-container-active")) {
+ return this.close_field();
+ }
+ };
+ Chosen.prototype.close_field = function() {
+ $(document).unbind("click", this.click_test_action);
+ if (!this.is_multiple) {
+ this.selected_item.attr("tabindex", this.search_field.attr("tabindex"));
+ this.search_field.attr("tabindex", -1);
+ }
+ this.active_field = false;
+ this.results_hide();
+ this.container.removeClass("chzn-container-active");
+ this.winnow_results_clear();
+ this.clear_backstroke();
+ this.show_search_field_default();
+ return this.search_field_scale();
+ };
+ Chosen.prototype.activate_field = function() {
+ if (!this.is_multiple && !this.active_field) {
+ this.search_field.attr("tabindex", this.selected_item.attr("tabindex"));
+ this.selected_item.attr("tabindex", -1);
+ }
+ this.container.addClass("chzn-container-active");
+ this.active_field = true;
+ this.search_field.val(this.search_field.val());
+ return this.search_field.focus();
+ };
+ Chosen.prototype.test_active_click = function(evt) {
+ if ($(evt.target).parents('#' + this.container.id).length) {
+ return this.active_field = true;
+ } else {
+ return this.close_field();
+ }
+ };
+ Chosen.prototype.results_build = function() {
+ var content, data, startTime, _i, _len, _ref;
+ startTime = new Date();
+ this.parsing = true;
+ this.results_data = SelectParser.select_to_array(this.form_field);
+ if (this.is_multiple && this.choices > 0) {
+ this.search_choices.find("li.search-choice").remove();
+ this.choices = 0;
+ } else if (!this.is_multiple) {
+ this.selected_item.find("span").text(this.default_text);
+ }
+ content = '';
+ _ref = this.results_data;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ data = _ref[_i];
+ if (data.group) {
+ content += this.result_add_group(data);
+ } else if (!data.empty) {
+ content += this.result_add_option(data);
+ if (data.selected && this.is_multiple) {
+ this.choice_build(data);
+ } else if (data.selected && !this.is_multiple) {
+ this.selected_item.find("span").text(data.text);
+ }
+ }
+ }
+ this.show_search_field_default();
+ this.search_field_scale();
+ this.search_results.html(content);
+ return this.parsing = false;
+ };
+ Chosen.prototype.result_add_group = function(group) {
+ if (!group.disabled) {
+ group.dom_id = this.form_field.id + "chzn_g_" + group.array_index;
+ return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
+ } else {
+ return "";
+ }
+ };
+ Chosen.prototype.result_add_option = function(option) {
+ var classes;
+ if (!option.disabled) {
+ option.dom_id = this.form_field.id + "chzn_o_" + option.array_index;
+ classes = option.selected && this.is_multiple ? [] : ["active-result"];
+ if (option.selected) {
+ classes.push("result-selected");
+ }
+ if (option.group_array_index != null) {
+ classes.push("group-option");
+ }
+ return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + $("<div />").text(option.text).html() + '</li>';
+ } else {
+ return "";
+ }
+ };
+ Chosen.prototype.results_update_field = function() {
+ this.result_clear_highlight();
+ this.result_single_selected = null;
+ return this.results_build();
+ };
+ Chosen.prototype.result_do_highlight = function(el) {
+ var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
+ if (el.length) {
+ this.result_clear_highlight();
+ this.result_highlight = el;
+ this.result_highlight.addClass("highlighted");
+ maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
+ visible_top = this.search_results.scrollTop();
+ visible_bottom = maxHeight + visible_top;
+ high_top = this.result_highlight.position().top + this.search_results.scrollTop();
+ high_bottom = high_top + this.result_highlight.outerHeight();
+ if (high_bottom >= visible_bottom) {
+ return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
+ } else if (high_top < visible_top) {
+ return this.search_results.scrollTop(high_top);
+ }
+ }
+ };
+ Chosen.prototype.result_clear_highlight = function() {
+ if (this.result_highlight) {
+ this.result_highlight.removeClass("highlighted");
+ }
+ return this.result_highlight = null;
+ };
+ Chosen.prototype.results_toggle = function() {
+ if (this.results_showing) {
+ return this.results_hide();
+ } else {
+ return this.results_show();
+ }
+ };
+ Chosen.prototype.results_show = function() {
+ var dd_top;
+ if (!this.is_multiple) {
+ this.selected_item.addClass("chzn-single-with-drop");
+ if (this.result_single_selected) {
+ this.result_do_highlight(this.result_single_selected);
+ }
+ }
+ dd_top = this.is_multiple ? this.container.height() : this.container.height() - 1;
+ this.dropdown.css({
+ "top": dd_top + "px",
+ "left": 0
+ });
+ this.results_showing = true;
+ this.search_field.focus();
+ this.search_field.val(this.search_field.val());
+ return this.winnow_results();
+ };
+ Chosen.prototype.results_hide = function() {
+ if (!this.is_multiple) {
+ this.selected_item.removeClass("chzn-single-with-drop");
+ }
+ this.result_clear_highlight();
+ this.dropdown.css({
+ "left": "-9000px"
+ });
+ return this.results_showing = false;
+ };
+ Chosen.prototype.set_tab_index = function(el) {
+ var ti;
+ if (this.form_field_jq.attr("tabindex")) {
+ ti = this.form_field_jq.attr("tabindex");
+ this.form_field_jq.attr("tabindex", -1);
+ if (this.is_multiple) {
+ return this.search_field.attr("tabindex", ti);
+ } else {
+ this.selected_item.attr("tabindex", ti);
+ return this.search_field.attr("tabindex", -1);
+ }
+ }
+ };
+ Chosen.prototype.show_search_field_default = function() {
+ if (this.is_multiple && this.choices < 1 && !this.active_field) {
+ this.search_field.val(this.default_text);
+ return this.search_field.addClass("default");
+ } else {
+ this.search_field.val("");
+ return this.search_field.removeClass("default");
+ }
+ };
+ Chosen.prototype.search_results_click = function(evt) {
+ var target;
+ target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+ if (target.length) {
+ this.result_highlight = target;
+ return this.result_select();
+ }
+ };
+ Chosen.prototype.search_results_mouseover = function(evt) {
+ var target;
+ target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+ if (target) {
+ return this.result_do_highlight(target);
+ }
+ };
+ Chosen.prototype.search_results_mouseout = function(evt) {
+ if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
+ return this.result_clear_highlight();
+ }
+ };
+ Chosen.prototype.choices_click = function(evt) {
+ evt.preventDefault();
+ if (this.active_field && !($(evt.target).hasClass("search-choice" || $(evt.target).parents('.search-choice').first)) && !this.results_showing) {
+ return this.results_show();
+ }
+ };
+ Chosen.prototype.choice_build = function(item) {
+ var choice_id, link;
+ choice_id = this.form_field.id + "_chzn_c_" + item.array_index;
+ this.choices += 1;
+ this.search_container.before('<li class="search-choice" id="' + choice_id + '"><span>' + item.text + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>');
+ link = $('#' + choice_id).find("a").first();
+ return link.click(__bind(function(evt) {
+ return this.choice_destroy_link_click(evt);
+ }, this));
+ };
+ Chosen.prototype.choice_destroy_link_click = function(evt) {
+ evt.preventDefault();
+ this.pending_destroy_click = true;
+ return this.choice_destroy($(evt.target));
+ };
+ Chosen.prototype.choice_destroy = function(link) {
+ this.choices -= 1;
+ this.show_search_field_default();
+ if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
+ this.results_hide();
+ }
+ this.result_deselect(link.attr("rel"));
+ return link.parents('li').first().remove();
+ };
+ Chosen.prototype.result_select = function() {
+ var high, high_id, item, position;
+ if (this.result_highlight) {
+ high = this.result_highlight;
+ high_id = high.attr("id");
+ this.result_clear_highlight();
+ high.addClass("result-selected");
+ if (this.is_multiple) {
+ this.result_deactivate(high);
+ } else {
+ this.result_single_selected = high;
+ }
+ position = high_id.substr(high_id.lastIndexOf("_") + 1);
+ item = this.results_data[position];
+ item.selected = true;
+ this.form_field.options[item.options_index].selected = true;
+ if (this.is_multiple) {
+ this.choice_build(item);
+ } else {
+ this.selected_item.find("span").first().text(item.text);
+ }
+ this.results_hide();
+ this.search_field.val("");
+ this.form_field_jq.trigger("change");
+ return this.search_field_scale();
+ }
+ };
+ Chosen.prototype.result_activate = function(el) {
+ return el.addClass("active-result").show();
+ };
+ Chosen.prototype.result_deactivate = function(el) {
+ return el.removeClass("active-result").hide();
+ };
+ Chosen.prototype.result_deselect = function(pos) {
+ var result, result_data;
+ result_data = this.results_data[pos];
+ result_data.selected = false;
+ this.form_field.options[result_data.options_index].selected = false;
+ result = $("#" + this.form_field.id + "chzn_o_" + pos);
+ result.removeClass("result-selected").addClass("active-result").show();
+ this.result_clear_highlight();
+ this.winnow_results();
+ this.form_field_jq.trigger("change");
+ return this.search_field_scale();
+ };
+ Chosen.prototype.results_search = function(evt) {
+ if (this.results_showing) {
+ return this.winnow_results();
+ } else {
+ return this.results_show();
+ }
+ };
+ Chosen.prototype.winnow_results = function() {
+ var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref;
+ startTime = new Date();
+ this.no_results_clear();
+ results = 0;
+ searchText = this.search_field.val() === this.default_text ? "" : $.trim(this.search_field.val());
+ regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+ zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+ _ref = this.results_data;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ option = _ref[_i];
+ if (!option.disabled && !option.empty) {
+ if (option.group) {
+ $('#' + option.dom_id).hide();
+ } else if (!(this.is_multiple && option.selected)) {
+ found = false;
+ result_id = option.dom_id;
+ if (regex.test(option.text)) {
+ found = true;
+ results += 1;
+ } else if (option.text.indexOf(" ") >= 0 || option.text.indexOf("[") === 0) {
+ parts = option.text.replace(/\[|\]/g, "").split(" ");
+ if (parts.length) {
+ for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
+ part = parts[_j];
+ if (regex.test(part)) {
+ found = true;
+ results += 1;
+ }
+ }
+ }
+ }
+ if (found) {
+ if (searchText.length) {
+ startpos = option.text.search(zregex);
+ text = option.text.substr(0, startpos + searchText.length) + '</em>' + option.text.substr(startpos + searchText.length);
+ text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+ } else {
+ text = option.text;
+ }
+ if ($("#" + result_id).html !== text) {
+ $("#" + result_id).html(text);
+ }
+ this.result_activate($("#" + result_id));
+ if (option.group_array_index != null) {
+ $("#" + this.results_data[option.group_array_index].dom_id).show();
+ }
+ } else {
+ if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
+ this.result_clear_highlight();
+ }
+ this.result_deactivate($("#" + result_id));
+ }
+ }
+ }
+ }
+ if (results < 1 && searchText.length) {
+ return this.no_results(searchText);
+ } else {
+ return this.winnow_results_set_highlight();
+ }
+ };
+ Chosen.prototype.winnow_results_clear = function() {
+ var li, lis, _i, _len, _results;
+ this.search_field.val("");
+ lis = this.search_results.find("li");
+ _results = [];
+ for (_i = 0, _len = lis.length; _i < _len; _i++) {
+ li = lis[_i];
+ li = $(li);
+ _results.push(li.hasClass("group-result") ? li.show() : !this.is_multiple || !li.hasClass("result-selected") ? this.result_activate(li) : void 0);
+ }
+ return _results;
+ };
+ Chosen.prototype.winnow_results_set_highlight = function() {
+ var do_high;
+ if (!this.result_highlight) {
+ do_high = this.search_results.find(".active-result").first();
+ if (do_high) {
+ return this.result_do_highlight(do_high);
+ }
+ }
+ };
+ Chosen.prototype.no_results = function(terms) {
+ var no_results_html;
+ no_results_html = $('<li class="no-results">No results match "<span></span>"</li>');
+ no_results_html.find("span").first().text(terms);
+ return this.search_results.append(no_results_html);
+ };
+ Chosen.prototype.no_results_clear = function() {
+ return this.search_results.find(".no-results").remove();
+ };
+ Chosen.prototype.keydown_arrow = function() {
+ var first_active, next_sib;
+ if (!this.result_highlight) {
+ first_active = this.search_results.find("li.active-result").first();
+ if (first_active) {
+ this.result_do_highlight($(first_active));
+ }
+ } else if (this.results_showing) {
+ next_sib = this.result_highlight.nextAll("li.active-result").first();
+ if (next_sib) {
+ this.result_do_highlight(next_sib);
+ }
+ }
+ if (!this.results_showing) {
+ return this.results_show();
+ }
+ };
+ Chosen.prototype.keyup_arrow = function() {
+ var prev_sibs;
+ if (!this.results_showing && !this.is_multiple) {
+ return this.results_show();
+ } else if (this.result_highlight) {
+ prev_sibs = this.result_highlight.prevAll("li.active-result");
+ if (prev_sibs.length) {
+ return this.result_do_highlight(prev_sibs.first());
+ } else {
+ if (this.choices > 0) {
+ this.results_hide();
+ }
+ return this.result_clear_highlight();
+ }
+ }
+ };
+ Chosen.prototype.keydown_backstroke = function() {
+ if (this.pending_backstroke) {
+ this.choice_destroy(this.pending_backstroke.find("a").first());
+ return this.clear_backstroke();
+ } else {
+ this.pending_backstroke = this.search_container.siblings("li.search-choice").last();
+ return this.pending_backstroke.addClass("search-choice-focus");
+ }
+ };
+ Chosen.prototype.clear_backstroke = function() {
+ if (this.pending_backstroke) {
+ this.pending_backstroke.removeClass("search-choice-focus");
+ }
+ return this.pending_backstroke = null;
+ };
+ Chosen.prototype.keyup_checker = function(evt) {
+ var stroke, _ref;
+ stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+ this.search_field_scale();
+ switch (stroke) {
+ case 8:
+ if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
+ return this.keydown_backstroke();
+ } else if (!this.pending_backstroke) {
+ this.result_clear_highlight();
+ return this.results_search();
+ }
+ break;
+ case 13:
+ evt.preventDefault();
+ if (this.results_showing) {
+ return this.result_select();
+ }
+ break;
+ case 27:
+ if (this.results_showing) {
+ return this.results_hide();
+ }
+ break;
+ case 9:
+ case 38:
+ case 40:
+ case 16:
+ break;
+ default:
+ return this.results_search();
+ }
+ };
+ Chosen.prototype.keydown_checker = function(evt) {
+ var stroke, _ref;
+ stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+ this.search_field_scale();
+ if (stroke !== 8 && this.pending_backstroke) {
+ this.clear_backstroke();
+ }
+ switch (stroke) {
+ case 8:
+ this.backstroke_length = this.search_field.val().length;
+ break;
+ case 9:
+ this.mouse_on_container = false;
+ break;
+ case 13:
+ evt.preventDefault();
+ break;
+ case 38:
+ evt.preventDefault();
+ this.keyup_arrow();
+ break;
+ case 40:
+ this.keydown_arrow();
+ break;
+ }
+ };
+ Chosen.prototype.search_field_scale = function() {
+ var dd_top, div, h, style, style_block, styles, w, _i, _len;
+ if (this.is_multiple) {
+ h = 0;
+ w = 0;
+ style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
+ styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
+ for (_i = 0, _len = styles.length; _i < _len; _i++) {
+ style = styles[_i];
+ style_block += style + ":" + this.search_field.css(style) + ";";
+ }
+ div = $('<div />', {
+ 'style': style_block
+ });
+ div.text(this.search_field.val());
+ $('body').append(div);
+ w = div.width() + 25;
+ div.remove();
+ if (w > this.f_width - 10) {
+ w = this.f_width - 10;
+ }
+ this.search_field.css({
+ 'width': w + 'px'
+ });
+ dd_top = this.container.height();
+ return this.dropdown.css({
+ "top": dd_top + "px"
+ });
+ }
+ };
+ return Chosen;
+ })();
+ get_side_border_padding = function(elmt) {
+ var side_border_padding;
+ return side_border_padding = elmt.outerWidth() - elmt.width();
+ };
+ root.get_side_border_padding = get_side_border_padding;
+ SelectParser = (function() {
+ function SelectParser() {
+ this.options_index = 0;
+ this.parsed = [];
+ }
+ SelectParser.prototype.add_node = function(child) {
+ if (child.nodeName === "OPTGROUP") {
+ return this.add_group(child);
+ } else {
+ return this.add_option(child);
+ }
+ };
+ SelectParser.prototype.add_group = function(group) {
+ var group_position, option, _i, _len, _ref, _results;
+ group_position = this.parsed.length;
+ this.parsed.push({
+ array_index: group_position,
+ group: true,
+ label: group.label,
+ children: 0,
+ disabled: group.disabled
+ });
+ _ref = group.childNodes;
+ _results = [];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ option = _ref[_i];
+ _results.push(this.add_option(option, group_position, group.disabled));
+ }
+ return _results;
+ };
+ SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+ if (option.nodeName === "OPTION") {
+ if (option.text !== "") {
+ if (group_position != null) {
+ this.parsed[group_position].children += 1;
+ }
+ this.parsed.push({
+ array_index: this.parsed.length,
+ options_index: this.options_index,
+ value: option.value,
+ text: option.text,
+ selected: option.selected,
+ disabled: group_disabled === true ? group_disabled : option.disabled,
+ group_array_index: group_position
+ });
+ } else {
+ this.parsed.push({
+ array_index: this.parsed.length,
+ options_index: this.options_index,
+ empty: true
+ });
+ }
+ return this.options_index += 1;
+ }
+ };
+ return SelectParser;
+ })();
+ SelectParser.select_to_array = function(select) {
+ var child, parser, _i, _len, _ref;
+ parser = new SelectParser();
+ _ref = select.childNodes;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ child = _ref[_i];
+ parser.add_node(child);
+ }
+ return parser.parsed;
+ };
+ root.SelectParser = SelectParser;
+}).call(this);
diff --git a/src/usr/local/www/javascript/chosen/chosen.jquery.min.js b/src/usr/local/www/javascript/chosen/chosen.jquery.min.js
new file mode 100644
index 0000000..ae69f22
--- /dev/null
+++ b/src/usr/local/www/javascript/chosen/chosen.jquery.min.js
@@ -0,0 +1,9 @@
+/*
+Chosen, a Select Box Enhancer for jQuery and Protoype
+by Patrick Filler for Harvest, http://getharvest.com
+
+Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
+
+Copyright (c) 2011 by Harvest
+*/
+(function(){var $,Chosen,SelectParser,get_side_border_padding,root;var __bind=function(fn,me){return function(){return fn.apply(me,arguments);};};root=typeof exports!=="undefined"&&exports!==null?exports:this;$=jQuery;$.fn.extend({chosen:function(data,options){return $(this).each(function(input_field){if(!($(this)).hasClass("chzn-done")){return new Chosen(this,data,options);}});}});Chosen=(function(){function Chosen(elmn){this.set_default_values();this.form_field=elmn;this.form_field_jq=$(this.form_field);this.is_multiple=this.form_field.multiple;this.default_text_default=this.form_field.multiple?"Select Some Options":"Select an Option";this.set_up_html();this.register_observers();this.form_field_jq.addClass("chzn-done");}Chosen.prototype.set_default_values=function(){this.click_test_action=__bind(function(evt){return this.test_active_click(evt);},this);this.active_field=false;this.mouse_on_container=false;this.results_showing=false;this.result_highlighted=null;this.result_single_selected=null;return this.choices=0;};Chosen.prototype.set_up_html=function(){var container_div,dd_top,dd_width,sf_width;this.container_id=this.form_field.id+"_chzn";this.f_width=this.form_field_jq.width();this.default_text=this.form_field_jq.attr("title")?this.form_field_jq.attr("title"):this.default_text_default;container_div=$("<div />",{id:this.container_id,"class":"chzn-container",style:"width: "+this.f_width+"px;"});if(this.is_multiple){container_div.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');}else{container_div.html('<a href="javascript:void(0)" class="chzn-single"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>');}this.form_field_jq.hide().after(container_div);this.container=$("#"+this.container_id);this.container.addClass("chzn-container-"+(this.is_multiple?"multi":"single"));this.dropdown=this.container.find("div.chzn-drop").first();dd_top=this.container.height();dd_width=this.f_width-get_side_border_padding(this.dropdown);this.dropdown.css({width:dd_width+"px",top:dd_top+"px"});this.search_field=this.container.find("input").first();this.search_results=this.container.find("ul.chzn-results").first();this.search_field_scale();this.search_no_results=this.container.find("li.no-results").first();if(this.is_multiple){this.search_choices=this.container.find("ul.chzn-choices").first();this.search_container=this.container.find("li.search-field").first();}else{this.search_container=this.container.find("div.chzn-search").first();this.selected_item=this.container.find(".chzn-single").first();sf_width=dd_width-get_side_border_padding(this.search_container)-get_side_border_padding(this.search_field);this.search_field.css({width:sf_width+"px"});}this.results_build();return this.set_tab_index();};Chosen.prototype.register_observers=function(){this.container.click(__bind(function(evt){return this.container_click(evt);},this));this.container.mouseenter(__bind(function(evt){return this.mouse_enter(evt);},this));this.container.mouseleave(__bind(function(evt){return this.mouse_leave(evt);},this));this.search_results.click(__bind(function(evt){return this.search_results_click(evt);},this));this.search_results.mouseover(__bind(function(evt){return this.search_results_mouseover(evt);},this));this.search_results.mouseout(__bind(function(evt){return this.search_results_mouseout(evt);},this));this.form_field_jq.bind("liszt:updated",__bind(function(evt){return this.results_update_field(evt);},this));this.search_field.blur(__bind(function(evt){return this.input_blur(evt);},this));this.search_field.keyup(__bind(function(evt){return this.keyup_checker(evt);},this));this.search_field.keydown(__bind(function(evt){return this.keydown_checker(evt);},this));if(this.is_multiple){this.search_choices.click(__bind(function(evt){return this.choices_click(evt);},this));return this.search_field.focus(__bind(function(evt){return this.input_focus(evt);},this));}else{return this.selected_item.focus(__bind(function(evt){return this.activate_field(evt);},this));}};Chosen.prototype.container_click=function(evt){if(evt&&evt.type==="click"){evt.stopPropagation();}if(!this.pending_destroy_click){if(!this.active_field){if(this.is_multiple){this.search_field.val("");}$(document).click(this.click_test_action);this.results_show();}else{if(!this.is_multiple&&evt&&($(evt.target)===this.selected_item||$(evt.target).parents("a.chzn-single").length)){evt.preventDefault();this.results_toggle();}}return this.activate_field();}else{return this.pending_destroy_click=false;}};Chosen.prototype.mouse_enter=function(){return this.mouse_on_container=true;};Chosen.prototype.mouse_leave=function(){return this.mouse_on_container=false;};Chosen.prototype.input_focus=function(evt){if(!this.active_field){return setTimeout((__bind(function(){return this.container_click();},this)),50);}};Chosen.prototype.input_blur=function(evt){if(!this.mouse_on_container){this.active_field=false;return setTimeout((__bind(function(){return this.blur_test();},this)),100);}};Chosen.prototype.blur_test=function(evt){if(!this.active_field&&this.container.hasClass("chzn-container-active")){return this.close_field();}};Chosen.prototype.close_field=function(){$(document).unbind("click",this.click_test_action);if(!this.is_multiple){this.selected_item.attr("tabindex",this.search_field.attr("tabindex"));this.search_field.attr("tabindex",-1);}this.active_field=false;this.results_hide();this.container.removeClass("chzn-container-active");this.winnow_results_clear();this.clear_backstroke();this.show_search_field_default();return this.search_field_scale();};Chosen.prototype.activate_field=function(){if(!this.is_multiple&&!this.active_field){this.search_field.attr("tabindex",this.selected_item.attr("tabindex"));this.selected_item.attr("tabindex",-1);}this.container.addClass("chzn-container-active");this.active_field=true;this.search_field.val(this.search_field.val());return this.search_field.focus();};Chosen.prototype.test_active_click=function(evt){if($(evt.target).parents("#"+this.container.id).length){return this.active_field=true;}else{return this.close_field();}};Chosen.prototype.results_build=function(){var content,data,startTime,_i,_len,_ref;startTime=new Date();this.parsing=true;this.results_data=SelectParser.select_to_array(this.form_field);if(this.is_multiple&&this.choices>0){this.search_choices.find("li.search-choice").remove();this.choices=0;}else{if(!this.is_multiple){this.selected_item.find("span").text(this.default_text);}}content="";_ref=this.results_data;for(_i=0,_len=_ref.length;_i<_len;_i++){data=_ref[_i];if(data.group){content+=this.result_add_group(data);}else{if(!data.empty){content+=this.result_add_option(data);if(data.selected&&this.is_multiple){this.choice_build(data);}else{if(data.selected&&!this.is_multiple){this.selected_item.find("span").text(data.text);}}}}}this.show_search_field_default();this.search_field_scale();this.search_results.html(content);return this.parsing=false;};Chosen.prototype.result_add_group=function(group){if(!group.disabled){group.dom_id=this.form_field.id+"chzn_g_"+group.array_index;return'<li id="'+group.dom_id+'" class="group-result">'+$("<div />").text(group.label).html()+"</li>";}else{return"";}};Chosen.prototype.result_add_option=function(option){var classes;if(!option.disabled){option.dom_id=this.form_field.id+"chzn_o_"+option.array_index;classes=option.selected&&this.is_multiple?[]:["active-result"];if(option.selected){classes.push("result-selected");}if(option.group_array_index!=null){classes.push("group-option");}return'<li id="'+option.dom_id+'" class="'+classes.join(" ")+'">'+$("<div />").text(option.text).html()+"</li>";}else{return"";}};Chosen.prototype.results_update_field=function(){this.result_clear_highlight();this.result_single_selected=null;return this.results_build();};Chosen.prototype.result_do_highlight=function(el){var high_bottom,high_top,maxHeight,visible_bottom,visible_top;if(el.length){this.result_clear_highlight();this.result_highlight=el;this.result_highlight.addClass("highlighted");maxHeight=parseInt(this.search_results.css("maxHeight"),10);visible_top=this.search_results.scrollTop();visible_bottom=maxHeight+visible_top;high_top=this.result_highlight.position().top+this.search_results.scrollTop();high_bottom=high_top+this.result_highlight.outerHeight();if(high_bottom>=visible_bottom){return this.search_results.scrollTop((high_bottom-maxHeight)>0?high_bottom-maxHeight:0);}else{if(high_top<visible_top){return this.search_results.scrollTop(high_top);}}}};Chosen.prototype.result_clear_highlight=function(){if(this.result_highlight){this.result_highlight.removeClass("highlighted");}return this.result_highlight=null;};Chosen.prototype.results_toggle=function(){if(this.results_showing){return this.results_hide();}else{return this.results_show();}};Chosen.prototype.results_show=function(){var dd_top;if(!this.is_multiple){this.selected_item.addClass("chzn-single-with-drop");if(this.result_single_selected){this.result_do_highlight(this.result_single_selected);}}dd_top=this.is_multiple?this.container.height():this.container.height()-1;this.dropdown.css({top:dd_top+"px",left:0});this.results_showing=true;this.search_field.focus();this.search_field.val(this.search_field.val());return this.winnow_results();};Chosen.prototype.results_hide=function(){if(!this.is_multiple){this.selected_item.removeClass("chzn-single-with-drop");}this.result_clear_highlight();this.dropdown.css({left:"-9000px"});return this.results_showing=false;};Chosen.prototype.set_tab_index=function(el){var ti;if(this.form_field_jq.attr("tabindex")){ti=this.form_field_jq.attr("tabindex");this.form_field_jq.attr("tabindex",-1);if(this.is_multiple){return this.search_field.attr("tabindex",ti);}else{this.selected_item.attr("tabindex",ti);return this.search_field.attr("tabindex",-1);}}};Chosen.prototype.show_search_field_default=function(){if(this.is_multiple&&this.choices<1&&!this.active_field){this.search_field.val(this.default_text);return this.search_field.addClass("default");}else{this.search_field.val("");return this.search_field.removeClass("default");}};Chosen.prototype.search_results_click=function(evt){var target;target=$(evt.target).hasClass("active-result")?$(evt.target):$(evt.target).parents(".active-result").first();if(target.length){this.result_highlight=target;return this.result_select();}};Chosen.prototype.search_results_mouseover=function(evt){var target;target=$(evt.target).hasClass("active-result")?$(evt.target):$(evt.target).parents(".active-result").first();if(target){return this.result_do_highlight(target);}};Chosen.prototype.search_results_mouseout=function(evt){if($(evt.target).hasClass("active-result"||$(evt.target).parents(".active-result").first())){return this.result_clear_highlight();}};Chosen.prototype.choices_click=function(evt){evt.preventDefault();if(this.active_field&&!($(evt.target).hasClass("search-choice"||$(evt.target).parents(".search-choice").first))&&!this.results_showing){return this.results_show();}};Chosen.prototype.choice_build=function(item){var choice_id,link;choice_id=this.form_field.id+"_chzn_c_"+item.array_index;this.choices+=1;this.search_container.before('<li class="search-choice" id="'+choice_id+'"><span>'+item.text+'</span><a href="javascript:void(0)" class="search-choice-close" rel="'+item.array_index+'"></a></li>');link=$("#"+choice_id).find("a").first();return link.click(__bind(function(evt){return this.choice_destroy_link_click(evt);},this));};Chosen.prototype.choice_destroy_link_click=function(evt){evt.preventDefault();this.pending_destroy_click=true;return this.choice_destroy($(evt.target));};Chosen.prototype.choice_destroy=function(link){this.choices-=1;this.show_search_field_default();if(this.is_multiple&&this.choices>0&&this.search_field.val().length<1){this.results_hide();}this.result_deselect(link.attr("rel"));return link.parents("li").first().remove();};Chosen.prototype.result_select=function(){var high,high_id,item,position;if(this.result_highlight){high=this.result_highlight;high_id=high.attr("id");this.result_clear_highlight();high.addClass("result-selected");if(this.is_multiple){this.result_deactivate(high);}else{this.result_single_selected=high;}position=high_id.substr(high_id.lastIndexOf("_")+1);item=this.results_data[position];item.selected=true;this.form_field.options[item.options_index].selected=true;if(this.is_multiple){this.choice_build(item);}else{this.selected_item.find("span").first().text(item.text);}this.results_hide();this.search_field.val("");this.form_field_jq.trigger("change");return this.search_field_scale();}};Chosen.prototype.result_activate=function(el){return el.addClass("active-result").show();};Chosen.prototype.result_deactivate=function(el){return el.removeClass("active-result").hide();};Chosen.prototype.result_deselect=function(pos){var result,result_data;result_data=this.results_data[pos];result_data.selected=false;this.form_field.options[result_data.options_index].selected=false;result=$("#"+this.form_field.id+"chzn_o_"+pos);result.removeClass("result-selected").addClass("active-result").show();this.result_clear_highlight();this.winnow_results();this.form_field_jq.trigger("change");return this.search_field_scale();};Chosen.prototype.results_search=function(evt){if(this.results_showing){return this.winnow_results();}else{return this.results_show();}};Chosen.prototype.winnow_results=function(){var found,option,part,parts,regex,result_id,results,searchText,startTime,startpos,text,zregex,_i,_j,_len,_len2,_ref;startTime=new Date();this.no_results_clear();results=0;searchText=this.search_field.val()===this.default_text?"":$.trim(this.search_field.val());regex=new RegExp("^"+searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");zregex=new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");_ref=this.results_data;for(_i=0,_len=_ref.length;_i<_len;_i++){option=_ref[_i];if(!option.disabled&&!option.empty){if(option.group){$("#"+option.dom_id).hide();}else{if(!(this.is_multiple&&option.selected)){found=false;result_id=option.dom_id;if(regex.test(option.text)){found=true;results+=1;}else{if(option.text.indexOf(" ")>=0||option.text.indexOf("[")===0){parts=option.text.replace(/\[|\]/g,"").split(" ");if(parts.length){for(_j=0,_len2=parts.length;_j<_len2;_j++){part=parts[_j];if(regex.test(part)){found=true;results+=1;}}}}}if(found){if(searchText.length){startpos=option.text.search(zregex);text=option.text.substr(0,startpos+searchText.length)+"</em>"+option.text.substr(startpos+searchText.length);text=text.substr(0,startpos)+"<em>"+text.substr(startpos);}else{text=option.text;}if($("#"+result_id).html!==text){$("#"+result_id).html(text);}this.result_activate($("#"+result_id));if(option.group_array_index!=null){$("#"+this.results_data[option.group_array_index].dom_id).show();}}else{if(this.result_highlight&&result_id===this.result_highlight.attr("id")){this.result_clear_highlight();}this.result_deactivate($("#"+result_id));}}}}}if(results<1&&searchText.length){return this.no_results(searchText);}else{return this.winnow_results_set_highlight();}};Chosen.prototype.winnow_results_clear=function(){var li,lis,_i,_len,_results;this.search_field.val("");lis=this.search_results.find("li");_results=[];for(_i=0,_len=lis.length;_i<_len;_i++){li=lis[_i];li=$(li);_results.push(li.hasClass("group-result")?li.show():!this.is_multiple||!li.hasClass("result-selected")?this.result_activate(li):void 0);}return _results;};Chosen.prototype.winnow_results_set_highlight=function(){var do_high;if(!this.result_highlight){do_high=this.search_results.find(".active-result").first();if(do_high){return this.result_do_highlight(do_high);}}};Chosen.prototype.no_results=function(terms){var no_results_html;no_results_html=$('<li class="no-results">No results match "<span></span>"</li>');no_results_html.find("span").first().text(terms);return this.search_results.append(no_results_html);};Chosen.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove();};Chosen.prototype.keydown_arrow=function(){var first_active,next_sib;if(!this.result_highlight){first_active=this.search_results.find("li.active-result").first();if(first_active){this.result_do_highlight($(first_active));}}else{if(this.results_showing){next_sib=this.result_highlight.nextAll("li.active-result").first();if(next_sib){this.result_do_highlight(next_sib);}}}if(!this.results_showing){return this.results_show();}};Chosen.prototype.keyup_arrow=function(){var prev_sibs;if(!this.results_showing&&!this.is_multiple){return this.results_show();}else{if(this.result_highlight){prev_sibs=this.result_highlight.prevAll("li.active-result");if(prev_sibs.length){return this.result_do_highlight(prev_sibs.first());}else{if(this.choices>0){this.results_hide();}return this.result_clear_highlight();}}}};Chosen.prototype.keydown_backstroke=function(){if(this.pending_backstroke){this.choice_destroy(this.pending_backstroke.find("a").first());return this.clear_backstroke();}else{this.pending_backstroke=this.search_container.siblings("li.search-choice").last();return this.pending_backstroke.addClass("search-choice-focus");}};Chosen.prototype.clear_backstroke=function(){if(this.pending_backstroke){this.pending_backstroke.removeClass("search-choice-focus");}return this.pending_backstroke=null;};Chosen.prototype.keyup_checker=function(evt){var stroke,_ref;stroke=(_ref=evt.which)!=null?_ref:evt.keyCode;this.search_field_scale();switch(stroke){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0){return this.keydown_backstroke();}else{if(!this.pending_backstroke){this.result_clear_highlight();return this.results_search();}}break;case 13:evt.preventDefault();if(this.results_showing){return this.result_select();}break;case 27:if(this.results_showing){return this.results_hide();}break;case 9:case 38:case 40:case 16:break;default:return this.results_search();}};Chosen.prototype.keydown_checker=function(evt){var stroke,_ref;stroke=(_ref=evt.which)!=null?_ref:evt.keyCode;this.search_field_scale();if(stroke!==8&&this.pending_backstroke){this.clear_backstroke();}switch(stroke){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.mouse_on_container=false;break;case 13:evt.preventDefault();break;case 38:evt.preventDefault();this.keyup_arrow();break;case 40:this.keydown_arrow();break;}};Chosen.prototype.search_field_scale=function(){var dd_top,div,h,style,style_block,styles,w,_i,_len;if(this.is_multiple){h=0;w=0;style_block="position:absolute; left: -1000px; top: -1000px; display:none;";styles=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(_i=0,_len=styles.length;_i<_len;_i++){style=styles[_i];style_block+=style+":"+this.search_field.css(style)+";";}div=$("<div />",{style:style_block});div.text(this.search_field.val());$("body").append(div);w=div.width()+25;div.remove();if(w>this.f_width-10){w=this.f_width-10;}this.search_field.css({width:w+"px"});dd_top=this.container.height();return this.dropdown.css({top:dd_top+"px"});}};return Chosen;})();get_side_border_padding=function(elmt){var side_border_padding;return side_border_padding=elmt.outerWidth()-elmt.width();};root.get_side_border_padding=get_side_border_padding;SelectParser=(function(){function SelectParser(){this.options_index=0;this.parsed=[];}SelectParser.prototype.add_node=function(child){if(child.nodeName==="OPTGROUP"){return this.add_group(child);}else{return this.add_option(child);}};SelectParser.prototype.add_group=function(group){var group_position,option,_i,_len,_ref,_results;group_position=this.parsed.length;this.parsed.push({array_index:group_position,group:true,label:group.label,children:0,disabled:group.disabled});_ref=group.childNodes;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){option=_ref[_i];_results.push(this.add_option(option,group_position,group.disabled));}return _results;};SelectParser.prototype.add_option=function(option,group_position,group_disabled){if(option.nodeName==="OPTION"){if(option.text!==""){if(group_position!=null){this.parsed[group_position].children+=1;}this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:option.value,text:option.text,selected:option.selected,disabled:group_disabled===true?group_disabled:option.disabled,group_array_index:group_position});}else{this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:true});}return this.options_index+=1;}};return SelectParser;})();SelectParser.select_to_array=function(select){var child,parser,_i,_len,_ref;parser=new SelectParser();_ref=select.childNodes;for(_i=0,_len=_ref.length;_i<_len;_i++){child=_ref[_i];parser.add_node(child);}return parser.parsed;};root.SelectParser=SelectParser;}).call(this); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/chosen/chosen.proto.js b/src/usr/local/www/javascript/chosen/chosen.proto.js
new file mode 100644
index 0000000..e3c0fbd
--- /dev/null
+++ b/src/usr/local/www/javascript/chosen/chosen.proto.js
@@ -0,0 +1,765 @@
+(function() {
+ /*
+ Chosen, a Select Box Enhancer for jQuery and Protoype
+ by Patrick Filler for Harvest, http://getharvest.com
+
+ Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
+
+ Copyright (c) 2011 by Harvest
+ */ var Chosen, SelectParser, get_side_border_padding, root;
+ var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+ root = typeof exports !== "undefined" && exports !== null ? exports : this;
+ Chosen = (function() {
+ function Chosen(elmn) {
+ this.set_default_values();
+ this.form_field = elmn;
+ this.is_multiple = this.form_field.multiple;
+ this.default_text_default = this.form_field.multiple ? "Select Some Options" : "Select an Option";
+ this.set_up_html();
+ this.register_observers();
+ }
+ Chosen.prototype.set_default_values = function() {
+ this.click_test_action = __bind(function(evt) {
+ return this.test_active_click(evt);
+ }, this);
+ this.active_field = false;
+ this.mouse_on_container = false;
+ this.results_showing = false;
+ this.result_highlighted = null;
+ this.result_single_selected = null;
+ this.choices = 0;
+ this.single_temp = new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>');
+ this.multi_temp = new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');
+ this.choice_temp = new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>');
+ return this.no_results_temp = new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>');
+ };
+ Chosen.prototype.set_up_html = function() {
+ var base_template, container_props, dd_top, dd_width, sf_width;
+ this.container_id = this.form_field.id + "_chzn";
+ this.f_width = this.form_field.getStyle("width") ? parseInt(this.form_field.getStyle("width"), 10) : this.form_field.getWidth();
+ container_props = {
+ 'id': this.container_id,
+ 'class': 'chzn-container',
+ 'style': 'width: ' + this.f_width + 'px'
+ };
+ this.default_text = this.form_field.readAttribute('title') ? this.form_field.readAttribute('title') : this.default_text_default;
+ base_template = this.is_multiple ? new Element('div', container_props).update(this.multi_temp.evaluate({
+ "default": this.default_text
+ })) : new Element('div', container_props).update(this.single_temp.evaluate({
+ "default": this.default_text
+ }));
+ this.form_field.hide().insert({
+ after: base_template
+ });
+ this.container = $(this.container_id);
+ this.container.addClassName("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+ this.dropdown = this.container.down('div.chzn-drop');
+ dd_top = this.container.getHeight();
+ dd_width = this.f_width - get_side_border_padding(this.dropdown);
+ this.dropdown.setStyle({
+ "width": dd_width + "px",
+ "top": dd_top + "px"
+ });
+ this.search_field = this.container.down('input');
+ this.search_results = this.container.down('ul.chzn-results');
+ this.search_field_scale();
+ this.search_no_results = this.container.down('li.no-results');
+ if (this.is_multiple) {
+ this.search_choices = this.container.down('ul.chzn-choices');
+ this.search_container = this.container.down('li.search-field');
+ } else {
+ this.search_container = this.container.down('div.chzn-search');
+ this.selected_item = this.container.down('.chzn-single');
+ sf_width = dd_width - get_side_border_padding(this.search_container) - get_side_border_padding(this.search_field);
+ this.search_field.setStyle({
+ "width": sf_width + "px"
+ });
+ }
+ this.results_build();
+ return this.set_tab_index();
+ };
+ Chosen.prototype.register_observers = function() {
+ this.container.observe("click", __bind(function(evt) {
+ return this.container_click(evt);
+ }, this));
+ this.container.observe("mouseenter", __bind(function(evt) {
+ return this.mouse_enter(evt);
+ }, this));
+ this.container.observe("mouseleave", __bind(function(evt) {
+ return this.mouse_leave(evt);
+ }, this));
+ this.search_results.observe("click", __bind(function(evt) {
+ return this.search_results_click(evt);
+ }, this));
+ this.search_results.observe("mouseover", __bind(function(evt) {
+ return this.search_results_mouseover(evt);
+ }, this));
+ this.search_results.observe("mouseout", __bind(function(evt) {
+ return this.search_results_mouseout(evt);
+ }, this));
+ this.form_field.observe("liszt:updated", __bind(function(evt) {
+ return this.results_update_field(evt);
+ }, this));
+ this.search_field.observe("blur", __bind(function(evt) {
+ return this.input_blur(evt);
+ }, this));
+ this.search_field.observe("keyup", __bind(function(evt) {
+ return this.keyup_checker(evt);
+ }, this));
+ this.search_field.observe("keydown", __bind(function(evt) {
+ return this.keydown_checker(evt);
+ }, this));
+ if (this.is_multiple) {
+ this.search_choices.observe("click", __bind(function(evt) {
+ return this.choices_click(evt);
+ }, this));
+ return this.search_field.observe("focus", __bind(function(evt) {
+ return this.input_focus(evt);
+ }, this));
+ } else {
+ return this.selected_item.observe("focus", __bind(function(evt) {
+ return this.activate_field(evt);
+ }, this));
+ }
+ };
+ Chosen.prototype.container_click = function(evt) {
+ if (evt && evt.type === "click") {
+ evt.stop();
+ }
+ if (!this.pending_destroy_click) {
+ if (!this.active_field) {
+ if (this.is_multiple) {
+ this.search_field.clear();
+ }
+ document.observe("click", this.click_test_action);
+ this.results_show();
+ } else if (!this.is_multiple && evt && (evt.target === this.selected_item || evt.target.up("a.chzn-single"))) {
+ this.results_toggle();
+ }
+ return this.activate_field();
+ } else {
+ return this.pending_destroy_click = false;
+ }
+ };
+ Chosen.prototype.mouse_enter = function() {
+ return this.mouse_on_container = true;
+ };
+ Chosen.prototype.mouse_leave = function() {
+ return this.mouse_on_container = false;
+ };
+ Chosen.prototype.input_focus = function(evt) {
+ if (!this.active_field) {
+ return setTimeout(this.container_click.bind(this), 50);
+ }
+ };
+ Chosen.prototype.input_blur = function(evt) {
+ if (!this.mouse_on_container) {
+ this.active_field = false;
+ return setTimeout(this.blur_test.bind(this), 100);
+ }
+ };
+ Chosen.prototype.blur_test = function(evt) {
+ if (!this.active_field && this.container.hasClassName("chzn-container-active")) {
+ return this.close_field();
+ }
+ };
+ Chosen.prototype.close_field = function() {
+ document.stopObserving("click", this.click_test_action);
+ if (!this.is_multiple) {
+ this.selected_item.tabIndex = this.search_field.tabIndex;
+ this.search_field.tabIndex = -1;
+ }
+ this.active_field = false;
+ this.results_hide();
+ this.container.removeClassName("chzn-container-active");
+ this.winnow_results_clear();
+ this.clear_backstroke();
+ this.show_search_field_default();
+ return this.search_field_scale();
+ };
+ Chosen.prototype.activate_field = function() {
+ if (!this.is_multiple && !this.active_field) {
+ this.search_field.tabIndex = this.selected_item.tabIndex;
+ this.selected_item.tabIndex = -1;
+ }
+ this.container.addClassName("chzn-container-active");
+ this.active_field = true;
+ this.search_field.value = this.search_field.value;
+ return this.search_field.focus();
+ };
+ Chosen.prototype.test_active_click = function(evt) {
+ if (evt.target.up('#' + this.container.id)) {
+ return this.active_field = true;
+ } else {
+ return this.close_field();
+ }
+ };
+ Chosen.prototype.results_build = function() {
+ var content, data, startTime, _i, _len, _ref;
+ startTime = new Date();
+ this.parsing = true;
+ this.results_data = SelectParser.select_to_array(this.form_field);
+ if (this.is_multiple && this.choices > 0) {
+ this.search_choices.select("li.search-choice").invoke("remove");
+ this.choices = 0;
+ } else if (!this.is_multiple) {
+ this.selected_item.down("span").update(this.default_text);
+ }
+ content = '';
+ _ref = this.results_data;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ data = _ref[_i];
+ if (data.group) {
+ content += this.result_add_group(data);
+ } else if (!data.empty) {
+ content += this.result_add_option(data);
+ if (data.selected && this.is_multiple) {
+ this.choice_build(data);
+ } else if (data.selected && !this.is_multiple) {
+ this.selected_item.down("span").update(data.text);
+ }
+ }
+ }
+ this.show_search_field_default();
+ this.search_field_scale();
+ this.search_results.update(content);
+ return this.parsing = false;
+ };
+ Chosen.prototype.result_add_group = function(group) {
+ if (!group.disabled) {
+ group.dom_id = this.form_field.id + "chzn_g_" + group.array_index;
+ return '<li id="' + group.dom_id + '" class="group-result">' + group.label.escapeHTML() + '</li>';
+ } else {
+ return "";
+ }
+ };
+ Chosen.prototype.result_add_option = function(option) {
+ var classes;
+ if (!option.disabled) {
+ option.dom_id = this.form_field.id + "chzn_o_" + option.array_index;
+ classes = option.selected && this.is_multiple ? [] : ["active-result"];
+ if (option.selected) {
+ classes.push("result-selected");
+ }
+ if (option.group_array_index != null) {
+ classes.push("group-option");
+ }
+ return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + option.text.escapeHTML() + '</li>';
+ } else {
+ return "";
+ }
+ };
+ Chosen.prototype.results_update_field = function() {
+ this.result_clear_highlight();
+ this.result_single_selected = null;
+ return this.results_build();
+ };
+ Chosen.prototype.result_do_highlight = function(el) {
+ var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
+ this.result_clear_highlight();
+ this.result_highlight = el;
+ this.result_highlight.addClassName("highlighted");
+ maxHeight = parseInt(this.search_results.getStyle('maxHeight'), 10);
+ visible_top = this.search_results.scrollTop;
+ visible_bottom = maxHeight + visible_top;
+ high_top = this.result_highlight.positionedOffset().top;
+ high_bottom = high_top + this.result_highlight.getHeight();
+ if (high_bottom >= visible_bottom) {
+ return this.search_results.scrollTop = (high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0;
+ } else if (high_top < visible_top) {
+ return this.search_results.scrollTop = high_top;
+ }
+ };
+ Chosen.prototype.result_clear_highlight = function() {
+ if (this.result_highlight) {
+ this.result_highlight.removeClassName('highlighted');
+ }
+ return this.result_highlight = null;
+ };
+ Chosen.prototype.results_toggle = function() {
+ if (this.results_showing) {
+ return this.results_hide();
+ } else {
+ return this.results_show();
+ }
+ };
+ Chosen.prototype.results_show = function() {
+ var dd_top;
+ if (!this.is_multiple) {
+ this.selected_item.addClassName('chzn-single-with-drop');
+ if (this.result_single_selected) {
+ this.result_do_highlight(this.result_single_selected);
+ }
+ }
+ dd_top = this.is_multiple ? this.container.getHeight() : this.container.getHeight() - 1;
+ this.dropdown.setStyle({
+ "top": dd_top + "px",
+ "left": 0
+ });
+ this.results_showing = true;
+ this.search_field.focus();
+ this.search_field.value = this.search_field.value;
+ return this.winnow_results();
+ };
+ Chosen.prototype.results_hide = function() {
+ if (!this.is_multiple) {
+ this.selected_item.removeClassName('chzn-single-with-drop');
+ }
+ this.result_clear_highlight();
+ this.dropdown.setStyle({
+ "left": "-9000px"
+ });
+ return this.results_showing = false;
+ };
+ Chosen.prototype.set_tab_index = function(el) {
+ var ti;
+ if (this.form_field.tabIndex) {
+ ti = this.form_field.tabIndex;
+ this.form_field.tabIndex = -1;
+ if (this.is_multiple) {
+ return this.search_field.tabIndex = ti;
+ } else {
+ this.selected_item.tabIndex = ti;
+ return this.search_field.tabIndex = -1;
+ }
+ }
+ };
+ Chosen.prototype.show_search_field_default = function() {
+ if (this.is_multiple && this.choices < 1 && !this.active_field) {
+ this.search_field.value = this.default_text;
+ return this.search_field.addClassName("default");
+ } else {
+ this.search_field.value = "";
+ return this.search_field.removeClassName("default");
+ }
+ };
+ Chosen.prototype.search_results_click = function(evt) {
+ var target;
+ target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
+ if (target) {
+ this.result_highlight = target;
+ return this.result_select();
+ }
+ };
+ Chosen.prototype.search_results_mouseover = function(evt) {
+ var target;
+ target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
+ if (target) {
+ return this.result_do_highlight(target);
+ }
+ };
+ Chosen.prototype.search_results_mouseout = function(evt) {
+ if (evt.target.hasClassName('active-result') || evt.target.up('.active-result')) {
+ return this.result_clear_highlight();
+ }
+ };
+ Chosen.prototype.choices_click = function(evt) {
+ evt.preventDefault();
+ if (this.active_field && !(evt.target.hasClassName('search-choice') || evt.target.up('.search-choice')) && !this.results_showing) {
+ return this.results_show();
+ }
+ };
+ Chosen.prototype.choice_build = function(item) {
+ var choice_id, link;
+ choice_id = this.form_field.id + "_chzn_c_" + item.array_index;
+ this.choices += 1;
+ this.search_container.insert({
+ before: this.choice_temp.evaluate({
+ "id": choice_id,
+ "choice": item.text,
+ "position": item.array_index
+ })
+ });
+ link = $(choice_id).down('a');
+ return link.observe("click", __bind(function(evt) {
+ return this.choice_destroy_link_click(evt);
+ }, this));
+ };
+ Chosen.prototype.choice_destroy_link_click = function(evt) {
+ evt.preventDefault();
+ this.pending_destroy_click = true;
+ return this.choice_destroy(evt.target);
+ };
+ Chosen.prototype.choice_destroy = function(link) {
+ this.choices -= 1;
+ this.show_search_field_default();
+ if (this.is_multiple && this.choices > 0 && this.search_field.value.length < 1) {
+ this.results_hide();
+ }
+ this.result_deselect(link.readAttribute("rel"));
+ return link.up('li').remove();
+ };
+ Chosen.prototype.result_select = function() {
+ var high, item, position;
+ if (this.result_highlight) {
+ high = this.result_highlight;
+ this.result_clear_highlight();
+ high.addClassName("result-selected");
+ if (this.is_multiple) {
+ this.result_deactivate(high);
+ } else {
+ this.result_single_selected = high;
+ }
+ position = high.id.substr(high.id.lastIndexOf("_") + 1);
+ item = this.results_data[position];
+ item.selected = true;
+ this.form_field.options[item.options_index].selected = true;
+ if (this.is_multiple) {
+ this.choice_build(item);
+ } else {
+ this.selected_item.down("span").update(item.text);
+ }
+ this.results_hide();
+ this.search_field.value = "";
+ if (typeof Event.simulate === 'function') {
+ this.form_field.simulate("change");
+ }
+ return this.search_field_scale();
+ }
+ };
+ Chosen.prototype.result_activate = function(el) {
+ return el.addClassName("active-result").show();
+ };
+ Chosen.prototype.result_deactivate = function(el) {
+ return el.removeClassName("active-result").hide();
+ };
+ Chosen.prototype.result_deselect = function(pos) {
+ var result, result_data;
+ result_data = this.results_data[pos];
+ result_data.selected = false;
+ this.form_field.options[result_data.options_index].selected = false;
+ result = $(this.form_field.id + "chzn_o_" + pos);
+ result.removeClassName("result-selected").addClassName("active-result").show();
+ this.result_clear_highlight();
+ this.winnow_results();
+ if (typeof Event.simulate === 'function') {
+ this.form_field.simulate("change");
+ }
+ return this.search_field_scale();
+ };
+ Chosen.prototype.results_search = function(evt) {
+ if (this.results_showing) {
+ return this.winnow_results();
+ } else {
+ return this.results_show();
+ }
+ };
+ Chosen.prototype.winnow_results = function() {
+ var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref;
+ startTime = new Date();
+ this.no_results_clear();
+ results = 0;
+ searchText = this.search_field.value === this.default_text ? "" : this.search_field.value.strip();
+ regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+ zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+ _ref = this.results_data;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ option = _ref[_i];
+ if (!option.disabled && !option.empty) {
+ if (option.group) {
+ $(option.dom_id).hide();
+ } else if (!(this.is_multiple && option.selected)) {
+ found = false;
+ result_id = option.dom_id;
+ if (regex.test(option.text)) {
+ found = true;
+ results += 1;
+ } else if (option.text.indexOf(" ") >= 0 || option.text.indexOf("[") === 0) {
+ parts = option.text.replace(/\[|\]/g, "").split(" ");
+ if (parts.length) {
+ for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
+ part = parts[_j];
+ if (regex.test(part)) {
+ found = true;
+ results += 1;
+ }
+ }
+ }
+ }
+ if (found) {
+ if (searchText.length) {
+ startpos = option.text.search(zregex);
+ text = option.text.substr(0, startpos + searchText.length) + '</em>' + option.text.substr(startpos + searchText.length);
+ text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+ } else {
+ text = option.text;
+ }
+ if ($(result_id).innerHTML !== text) {
+ $(result_id).update(text);
+ }
+ this.result_activate($(result_id));
+ if (option.group_array_index != null) {
+ $(this.results_data[option.group_array_index].dom_id).show();
+ }
+ } else {
+ if ($(result_id) === this.result_highlight) {
+ this.result_clear_highlight();
+ }
+ this.result_deactivate($(result_id));
+ }
+ }
+ }
+ }
+ if (results < 1 && searchText.length) {
+ return this.no_results(searchText);
+ } else {
+ return this.winnow_results_set_highlight();
+ }
+ };
+ Chosen.prototype.winnow_results_clear = function() {
+ var li, lis, _i, _len, _results;
+ this.search_field.clear();
+ lis = this.search_results.select("li");
+ _results = [];
+ for (_i = 0, _len = lis.length; _i < _len; _i++) {
+ li = lis[_i];
+ _results.push(li.hasClassName("group-result") ? li.show() : !this.is_multiple || !li.hasClassName("result-selected") ? this.result_activate(li) : void 0);
+ }
+ return _results;
+ };
+ Chosen.prototype.winnow_results_set_highlight = function() {
+ var do_high;
+ if (!this.result_highlight) {
+ do_high = this.search_results.down(".active-result");
+ if (do_high) {
+ return this.result_do_highlight(do_high);
+ }
+ }
+ };
+ Chosen.prototype.no_results = function(terms) {
+ return this.search_results.insert(this.no_results_temp.evaluate({
+ "terms": terms.escapeHTML()
+ }));
+ };
+ Chosen.prototype.no_results_clear = function() {
+ var nr, _results;
+ nr = null;
+ _results = [];
+ while (nr = this.search_results.down(".no-results")) {
+ _results.push(nr.remove());
+ }
+ return _results;
+ };
+ Chosen.prototype.keydown_arrow = function() {
+ var actives, nexts, sibs;
+ actives = this.search_results.select("li.active-result");
+ if (actives.length) {
+ if (!this.result_highlight) {
+ this.result_do_highlight(actives.first());
+ } else if (this.results_showing) {
+ sibs = this.result_highlight.nextSiblings();
+ nexts = sibs.intersect(actives);
+ if (nexts.length) {
+ this.result_do_highlight(nexts.first());
+ }
+ }
+ if (!this.results_showing) {
+ return this.results_show();
+ }
+ }
+ };
+ Chosen.prototype.keyup_arrow = function() {
+ var actives, prevs, sibs;
+ if (!this.results_showing && !this.is_multiple) {
+ return this.results_show();
+ } else if (this.result_highlight) {
+ sibs = this.result_highlight.previousSiblings();
+ actives = this.search_results.select("li.active-result");
+ prevs = sibs.intersect(actives);
+ if (prevs.length) {
+ return this.result_do_highlight(prevs.first());
+ } else {
+ if (this.choices > 0) {
+ this.results_hide();
+ }
+ return this.result_clear_highlight();
+ }
+ }
+ };
+ Chosen.prototype.keydown_backstroke = function() {
+ if (this.pending_backstroke) {
+ this.choice_destroy(this.pending_backstroke.down("a"));
+ return this.clear_backstroke();
+ } else {
+ this.pending_backstroke = this.search_container.siblings("li.search-choice").last();
+ return this.pending_backstroke.addClassName("search-choice-focus");
+ }
+ };
+ Chosen.prototype.clear_backstroke = function() {
+ if (this.pending_backstroke) {
+ this.pending_backstroke.removeClassName("search-choice-focus");
+ }
+ return this.pending_backstroke = null;
+ };
+ Chosen.prototype.keyup_checker = function(evt) {
+ var stroke, _ref;
+ stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+ this.search_field_scale();
+ switch (stroke) {
+ case 8:
+ if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
+ return this.keydown_backstroke();
+ } else if (!this.pending_backstroke) {
+ this.result_clear_highlight();
+ return this.results_search();
+ }
+ break;
+ case 13:
+ evt.preventDefault();
+ if (this.results_showing) {
+ return this.result_select();
+ }
+ break;
+ case 27:
+ if (this.results_showing) {
+ return this.results_hide();
+ }
+ break;
+ case 9:
+ case 38:
+ case 40:
+ case 16:
+ break;
+ default:
+ return this.results_search();
+ }
+ };
+ Chosen.prototype.keydown_checker = function(evt) {
+ var stroke, _ref;
+ stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+ this.search_field_scale();
+ if (stroke !== 8 && this.pending_backstroke) {
+ this.clear_backstroke();
+ }
+ switch (stroke) {
+ case 8:
+ return this.backstroke_length = this.search_field.value.length;
+ case 9:
+ return this.mouse_on_container = false;
+ case 13:
+ return evt.preventDefault();
+ case 38:
+ evt.preventDefault();
+ return this.keyup_arrow();
+ case 40:
+ return this.keydown_arrow();
+ }
+ };
+ Chosen.prototype.search_field_scale = function() {
+ var dd_top, div, h, style, style_block, styles, w, _i, _len;
+ if (this.is_multiple) {
+ h = 0;
+ w = 0;
+ style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
+ styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
+ for (_i = 0, _len = styles.length; _i < _len; _i++) {
+ style = styles[_i];
+ style_block += style + ":" + this.search_field.getStyle(style) + ";";
+ }
+ div = new Element('div', {
+ 'style': style_block
+ }).update(this.search_field.value);
+ document.body.appendChild(div);
+ w = Element.measure(div, 'width') + 25;
+ div.remove();
+ if (w > this.f_width - 10) {
+ w = this.f_width - 10;
+ }
+ this.search_field.setStyle({
+ 'width': w + 'px'
+ });
+ dd_top = this.container.getHeight();
+ return this.dropdown.setStyle({
+ "top": dd_top + "px"
+ });
+ }
+ };
+ return Chosen;
+ })();
+ root.Chosen = Chosen;
+ document.observe('dom:loaded', function(evt) {
+ var select, selects, _i, _len, _results;
+ selects = $$(".chzn-select");
+ _results = [];
+ for (_i = 0, _len = selects.length; _i < _len; _i++) {
+ select = selects[_i];
+ _results.push(new Chosen(select));
+ }
+ return _results;
+ });
+ get_side_border_padding = function(elmt) {
+ var layout, side_border_padding;
+ layout = new Element.Layout(elmt);
+ return side_border_padding = layout.get("border-left") + layout.get("border-right") + layout.get("padding-left") + layout.get("padding-right");
+ };
+ root.get_side_border_padding = get_side_border_padding;
+ root = typeof exports !== "undefined" && exports !== null ? exports : this;
+ SelectParser = (function() {
+ function SelectParser() {
+ this.options_index = 0;
+ this.parsed = [];
+ }
+ SelectParser.prototype.add_node = function(child) {
+ if (child.nodeName === "OPTGROUP") {
+ return this.add_group(child);
+ } else {
+ return this.add_option(child);
+ }
+ };
+ SelectParser.prototype.add_group = function(group) {
+ var group_position, option, _i, _len, _ref, _results;
+ group_position = this.parsed.length;
+ this.parsed.push({
+ array_index: group_position,
+ group: true,
+ label: group.label,
+ children: 0,
+ disabled: group.disabled
+ });
+ _ref = group.childNodes;
+ _results = [];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ option = _ref[_i];
+ _results.push(this.add_option(option, group_position, group.disabled));
+ }
+ return _results;
+ };
+ SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+ if (option.nodeName === "OPTION") {
+ if (option.text !== "") {
+ if (group_position != null) {
+ this.parsed[group_position].children += 1;
+ }
+ this.parsed.push({
+ array_index: this.parsed.length,
+ options_index: this.options_index,
+ value: option.value,
+ text: option.text,
+ selected: option.selected,
+ disabled: group_disabled === true ? group_disabled : option.disabled,
+ group_array_index: group_position
+ });
+ } else {
+ this.parsed.push({
+ array_index: this.parsed.length,
+ options_index: this.options_index,
+ empty: true
+ });
+ }
+ return this.options_index += 1;
+ }
+ };
+ return SelectParser;
+ })();
+ SelectParser.select_to_array = function(select) {
+ var child, parser, _i, _len, _ref;
+ parser = new SelectParser();
+ _ref = select.childNodes;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ child = _ref[_i];
+ parser.add_node(child);
+ }
+ return parser.parsed;
+ };
+ root.SelectParser = SelectParser;
+}).call(this);
diff --git a/src/usr/local/www/javascript/chosen/chosen.proto.min.js b/src/usr/local/www/javascript/chosen/chosen.proto.min.js
new file mode 100644
index 0000000..79109c5
--- /dev/null
+++ b/src/usr/local/www/javascript/chosen/chosen.proto.min.js
@@ -0,0 +1,9 @@
+/*
+Chosen, a Select Box Enhancer for jQuery and Protoype
+by Patrick Filler for Harvest, http://getharvest.com
+
+Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
+
+Copyright (c) 2011 by Harvest
+*/
+(function(){var Chosen,SelectParser,get_side_border_padding,root;var __bind=function(fn,me){return function(){return fn.apply(me,arguments);};};root=typeof exports!=="undefined"&&exports!==null?exports:this;Chosen=(function(){function Chosen(elmn){this.set_default_values();this.form_field=elmn;this.is_multiple=this.form_field.multiple;this.default_text_default=this.form_field.multiple?"Select Some Options":"Select an Option";this.set_up_html();this.register_observers();}Chosen.prototype.set_default_values=function(){this.click_test_action=__bind(function(evt){return this.test_active_click(evt);},this);this.active_field=false;this.mouse_on_container=false;this.results_showing=false;this.result_highlighted=null;this.result_single_selected=null;this.choices=0;this.single_temp=new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>');this.multi_temp=new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');this.choice_temp=new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>');return this.no_results_temp=new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>');};Chosen.prototype.set_up_html=function(){var base_template,container_props,dd_top,dd_width,sf_width;this.container_id=this.form_field.id+"_chzn";this.f_width=this.form_field.getStyle("width")?parseInt(this.form_field.getStyle("width"),10):this.form_field.getWidth();container_props={id:this.container_id,"class":"chzn-container",style:"width: "+this.f_width+"px"};this.default_text=this.form_field.readAttribute("title")?this.form_field.readAttribute("title"):this.default_text_default;base_template=this.is_multiple?new Element("div",container_props).update(this.multi_temp.evaluate({"default":this.default_text})):new Element("div",container_props).update(this.single_temp.evaluate({"default":this.default_text}));this.form_field.hide().insert({after:base_template});this.container=$(this.container_id);this.container.addClassName("chzn-container-"+(this.is_multiple?"multi":"single"));this.dropdown=this.container.down("div.chzn-drop");dd_top=this.container.getHeight();dd_width=this.f_width-get_side_border_padding(this.dropdown);this.dropdown.setStyle({width:dd_width+"px",top:dd_top+"px"});this.search_field=this.container.down("input");this.search_results=this.container.down("ul.chzn-results");this.search_field_scale();this.search_no_results=this.container.down("li.no-results");if(this.is_multiple){this.search_choices=this.container.down("ul.chzn-choices");this.search_container=this.container.down("li.search-field");}else{this.search_container=this.container.down("div.chzn-search");this.selected_item=this.container.down(".chzn-single");sf_width=dd_width-get_side_border_padding(this.search_container)-get_side_border_padding(this.search_field);this.search_field.setStyle({width:sf_width+"px"});}this.results_build();return this.set_tab_index();};Chosen.prototype.register_observers=function(){this.container.observe("click",__bind(function(evt){return this.container_click(evt);},this));this.container.observe("mouseenter",__bind(function(evt){return this.mouse_enter(evt);},this));this.container.observe("mouseleave",__bind(function(evt){return this.mouse_leave(evt);},this));this.search_results.observe("click",__bind(function(evt){return this.search_results_click(evt);},this));this.search_results.observe("mouseover",__bind(function(evt){return this.search_results_mouseover(evt);},this));this.search_results.observe("mouseout",__bind(function(evt){return this.search_results_mouseout(evt);},this));this.form_field.observe("liszt:updated",__bind(function(evt){return this.results_update_field(evt);},this));this.search_field.observe("blur",__bind(function(evt){return this.input_blur(evt);},this));this.search_field.observe("keyup",__bind(function(evt){return this.keyup_checker(evt);},this));this.search_field.observe("keydown",__bind(function(evt){return this.keydown_checker(evt);},this));if(this.is_multiple){this.search_choices.observe("click",__bind(function(evt){return this.choices_click(evt);},this));return this.search_field.observe("focus",__bind(function(evt){return this.input_focus(evt);},this));}else{return this.selected_item.observe("focus",__bind(function(evt){return this.activate_field(evt);},this));}};Chosen.prototype.container_click=function(evt){if(evt&&evt.type==="click"){evt.stop();}if(!this.pending_destroy_click){if(!this.active_field){if(this.is_multiple){this.search_field.clear();}document.observe("click",this.click_test_action);this.results_show();}else{if(!this.is_multiple&&evt&&(evt.target===this.selected_item||evt.target.up("a.chzn-single"))){this.results_toggle();}}return this.activate_field();}else{return this.pending_destroy_click=false;}};Chosen.prototype.mouse_enter=function(){return this.mouse_on_container=true;};Chosen.prototype.mouse_leave=function(){return this.mouse_on_container=false;};Chosen.prototype.input_focus=function(evt){if(!this.active_field){return setTimeout(this.container_click.bind(this),50);}};Chosen.prototype.input_blur=function(evt){if(!this.mouse_on_container){this.active_field=false;return setTimeout(this.blur_test.bind(this),100);}};Chosen.prototype.blur_test=function(evt){if(!this.active_field&&this.container.hasClassName("chzn-container-active")){return this.close_field();}};Chosen.prototype.close_field=function(){document.stopObserving("click",this.click_test_action);if(!this.is_multiple){this.selected_item.tabIndex=this.search_field.tabIndex;this.search_field.tabIndex=-1;}this.active_field=false;this.results_hide();this.container.removeClassName("chzn-container-active");this.winnow_results_clear();this.clear_backstroke();this.show_search_field_default();return this.search_field_scale();};Chosen.prototype.activate_field=function(){if(!this.is_multiple&&!this.active_field){this.search_field.tabIndex=this.selected_item.tabIndex;this.selected_item.tabIndex=-1;}this.container.addClassName("chzn-container-active");this.active_field=true;this.search_field.value=this.search_field.value;return this.search_field.focus();};Chosen.prototype.test_active_click=function(evt){if(evt.target.up("#"+this.container.id)){return this.active_field=true;}else{return this.close_field();}};Chosen.prototype.results_build=function(){var content,data,startTime,_i,_len,_ref;startTime=new Date();this.parsing=true;this.results_data=SelectParser.select_to_array(this.form_field);if(this.is_multiple&&this.choices>0){this.search_choices.select("li.search-choice").invoke("remove");this.choices=0;}else{if(!this.is_multiple){this.selected_item.down("span").update(this.default_text);}}content="";_ref=this.results_data;for(_i=0,_len=_ref.length;_i<_len;_i++){data=_ref[_i];if(data.group){content+=this.result_add_group(data);}else{if(!data.empty){content+=this.result_add_option(data);if(data.selected&&this.is_multiple){this.choice_build(data);}else{if(data.selected&&!this.is_multiple){this.selected_item.down("span").update(data.text);}}}}}this.show_search_field_default();this.search_field_scale();this.search_results.update(content);return this.parsing=false;};Chosen.prototype.result_add_group=function(group){if(!group.disabled){group.dom_id=this.form_field.id+"chzn_g_"+group.array_index;return'<li id="'+group.dom_id+'" class="group-result">'+group.label.escapeHTML()+"</li>";}else{return"";}};Chosen.prototype.result_add_option=function(option){var classes;if(!option.disabled){option.dom_id=this.form_field.id+"chzn_o_"+option.array_index;classes=option.selected&&this.is_multiple?[]:["active-result"];if(option.selected){classes.push("result-selected");}if(option.group_array_index!=null){classes.push("group-option");}return'<li id="'+option.dom_id+'" class="'+classes.join(" ")+'">'+option.text.escapeHTML()+"</li>";}else{return"";}};Chosen.prototype.results_update_field=function(){this.result_clear_highlight();this.result_single_selected=null;return this.results_build();};Chosen.prototype.result_do_highlight=function(el){var high_bottom,high_top,maxHeight,visible_bottom,visible_top;this.result_clear_highlight();this.result_highlight=el;this.result_highlight.addClassName("highlighted");maxHeight=parseInt(this.search_results.getStyle("maxHeight"),10);visible_top=this.search_results.scrollTop;visible_bottom=maxHeight+visible_top;high_top=this.result_highlight.positionedOffset().top;high_bottom=high_top+this.result_highlight.getHeight();if(high_bottom>=visible_bottom){return this.search_results.scrollTop=(high_bottom-maxHeight)>0?high_bottom-maxHeight:0;}else{if(high_top<visible_top){return this.search_results.scrollTop=high_top;}}};Chosen.prototype.result_clear_highlight=function(){if(this.result_highlight){this.result_highlight.removeClassName("highlighted");}return this.result_highlight=null;};Chosen.prototype.results_toggle=function(){if(this.results_showing){return this.results_hide();}else{return this.results_show();}};Chosen.prototype.results_show=function(){var dd_top;if(!this.is_multiple){this.selected_item.addClassName("chzn-single-with-drop");if(this.result_single_selected){this.result_do_highlight(this.result_single_selected);}}dd_top=this.is_multiple?this.container.getHeight():this.container.getHeight()-1;this.dropdown.setStyle({top:dd_top+"px",left:0});this.results_showing=true;this.search_field.focus();this.search_field.value=this.search_field.value;return this.winnow_results();};Chosen.prototype.results_hide=function(){if(!this.is_multiple){this.selected_item.removeClassName("chzn-single-with-drop");}this.result_clear_highlight();this.dropdown.setStyle({left:"-9000px"});return this.results_showing=false;};Chosen.prototype.set_tab_index=function(el){var ti;if(this.form_field.tabIndex){ti=this.form_field.tabIndex;this.form_field.tabIndex=-1;if(this.is_multiple){return this.search_field.tabIndex=ti;}else{this.selected_item.tabIndex=ti;return this.search_field.tabIndex=-1;}}};Chosen.prototype.show_search_field_default=function(){if(this.is_multiple&&this.choices<1&&!this.active_field){this.search_field.value=this.default_text;return this.search_field.addClassName("default");}else{this.search_field.value="";return this.search_field.removeClassName("default");}};Chosen.prototype.search_results_click=function(evt){var target;target=evt.target.hasClassName("active-result")?evt.target:evt.target.up(".active-result");if(target){this.result_highlight=target;return this.result_select();}};Chosen.prototype.search_results_mouseover=function(evt){var target;target=evt.target.hasClassName("active-result")?evt.target:evt.target.up(".active-result");if(target){return this.result_do_highlight(target);}};Chosen.prototype.search_results_mouseout=function(evt){if(evt.target.hasClassName("active-result")||evt.target.up(".active-result")){return this.result_clear_highlight();}};Chosen.prototype.choices_click=function(evt){evt.preventDefault();if(this.active_field&&!(evt.target.hasClassName("search-choice")||evt.target.up(".search-choice"))&&!this.results_showing){return this.results_show();}};Chosen.prototype.choice_build=function(item){var choice_id,link;choice_id=this.form_field.id+"_chzn_c_"+item.array_index;this.choices+=1;this.search_container.insert({before:this.choice_temp.evaluate({id:choice_id,choice:item.text,position:item.array_index})});link=$(choice_id).down("a");return link.observe("click",__bind(function(evt){return this.choice_destroy_link_click(evt);},this));};Chosen.prototype.choice_destroy_link_click=function(evt){evt.preventDefault();this.pending_destroy_click=true;return this.choice_destroy(evt.target);};Chosen.prototype.choice_destroy=function(link){this.choices-=1;this.show_search_field_default();if(this.is_multiple&&this.choices>0&&this.search_field.value.length<1){this.results_hide();}this.result_deselect(link.readAttribute("rel"));return link.up("li").remove();};Chosen.prototype.result_select=function(){var high,item,position;if(this.result_highlight){high=this.result_highlight;this.result_clear_highlight();high.addClassName("result-selected");if(this.is_multiple){this.result_deactivate(high);}else{this.result_single_selected=high;}position=high.id.substr(high.id.lastIndexOf("_")+1);item=this.results_data[position];item.selected=true;this.form_field.options[item.options_index].selected=true;if(this.is_multiple){this.choice_build(item);}else{this.selected_item.down("span").update(item.text);}this.results_hide();this.search_field.value="";if(typeof Event.simulate==="function"){this.form_field.simulate("change");}return this.search_field_scale();}};Chosen.prototype.result_activate=function(el){return el.addClassName("active-result").show();};Chosen.prototype.result_deactivate=function(el){return el.removeClassName("active-result").hide();};Chosen.prototype.result_deselect=function(pos){var result,result_data;result_data=this.results_data[pos];result_data.selected=false;this.form_field.options[result_data.options_index].selected=false;result=$(this.form_field.id+"chzn_o_"+pos);result.removeClassName("result-selected").addClassName("active-result").show();this.result_clear_highlight();this.winnow_results();if(typeof Event.simulate==="function"){this.form_field.simulate("change");}return this.search_field_scale();};Chosen.prototype.results_search=function(evt){if(this.results_showing){return this.winnow_results();}else{return this.results_show();}};Chosen.prototype.winnow_results=function(){var found,option,part,parts,regex,result_id,results,searchText,startTime,startpos,text,zregex,_i,_j,_len,_len2,_ref;startTime=new Date();this.no_results_clear();results=0;searchText=this.search_field.value===this.default_text?"":this.search_field.value.strip();regex=new RegExp("^"+searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");zregex=new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i");_ref=this.results_data;for(_i=0,_len=_ref.length;_i<_len;_i++){option=_ref[_i];if(!option.disabled&&!option.empty){if(option.group){$(option.dom_id).hide();}else{if(!(this.is_multiple&&option.selected)){found=false;result_id=option.dom_id;if(regex.test(option.text)){found=true;results+=1;}else{if(option.text.indexOf(" ")>=0||option.text.indexOf("[")===0){parts=option.text.replace(/\[|\]/g,"").split(" ");if(parts.length){for(_j=0,_len2=parts.length;_j<_len2;_j++){part=parts[_j];if(regex.test(part)){found=true;results+=1;}}}}}if(found){if(searchText.length){startpos=option.text.search(zregex);text=option.text.substr(0,startpos+searchText.length)+"</em>"+option.text.substr(startpos+searchText.length);text=text.substr(0,startpos)+"<em>"+text.substr(startpos);}else{text=option.text;}if($(result_id).innerHTML!==text){$(result_id).update(text);}this.result_activate($(result_id));if(option.group_array_index!=null){$(this.results_data[option.group_array_index].dom_id).show();}}else{if($(result_id)===this.result_highlight){this.result_clear_highlight();}this.result_deactivate($(result_id));}}}}}if(results<1&&searchText.length){return this.no_results(searchText);}else{return this.winnow_results_set_highlight();}};Chosen.prototype.winnow_results_clear=function(){var li,lis,_i,_len,_results;this.search_field.clear();lis=this.search_results.select("li");_results=[];for(_i=0,_len=lis.length;_i<_len;_i++){li=lis[_i];_results.push(li.hasClassName("group-result")?li.show():!this.is_multiple||!li.hasClassName("result-selected")?this.result_activate(li):void 0);}return _results;};Chosen.prototype.winnow_results_set_highlight=function(){var do_high;if(!this.result_highlight){do_high=this.search_results.down(".active-result");if(do_high){return this.result_do_highlight(do_high);}}};Chosen.prototype.no_results=function(terms){return this.search_results.insert(this.no_results_temp.evaluate({terms:terms.escapeHTML()}));};Chosen.prototype.no_results_clear=function(){var nr,_results;nr=null;_results=[];while(nr=this.search_results.down(".no-results")){_results.push(nr.remove());}return _results;};Chosen.prototype.keydown_arrow=function(){var actives,nexts,sibs;actives=this.search_results.select("li.active-result");if(actives.length){if(!this.result_highlight){this.result_do_highlight(actives.first());}else{if(this.results_showing){sibs=this.result_highlight.nextSiblings();nexts=sibs.intersect(actives);if(nexts.length){this.result_do_highlight(nexts.first());}}}if(!this.results_showing){return this.results_show();}}};Chosen.prototype.keyup_arrow=function(){var actives,prevs,sibs;if(!this.results_showing&&!this.is_multiple){return this.results_show();}else{if(this.result_highlight){sibs=this.result_highlight.previousSiblings();actives=this.search_results.select("li.active-result");prevs=sibs.intersect(actives);if(prevs.length){return this.result_do_highlight(prevs.first());}else{if(this.choices>0){this.results_hide();}return this.result_clear_highlight();}}}};Chosen.prototype.keydown_backstroke=function(){if(this.pending_backstroke){this.choice_destroy(this.pending_backstroke.down("a"));return this.clear_backstroke();}else{this.pending_backstroke=this.search_container.siblings("li.search-choice").last();return this.pending_backstroke.addClassName("search-choice-focus");}};Chosen.prototype.clear_backstroke=function(){if(this.pending_backstroke){this.pending_backstroke.removeClassName("search-choice-focus");}return this.pending_backstroke=null;};Chosen.prototype.keyup_checker=function(evt){var stroke,_ref;stroke=(_ref=evt.which)!=null?_ref:evt.keyCode;this.search_field_scale();switch(stroke){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0){return this.keydown_backstroke();}else{if(!this.pending_backstroke){this.result_clear_highlight();return this.results_search();}}break;case 13:evt.preventDefault();if(this.results_showing){return this.result_select();}break;case 27:if(this.results_showing){return this.results_hide();}break;case 9:case 38:case 40:case 16:break;default:return this.results_search();}};Chosen.prototype.keydown_checker=function(evt){var stroke,_ref;stroke=(_ref=evt.which)!=null?_ref:evt.keyCode;this.search_field_scale();if(stroke!==8&&this.pending_backstroke){this.clear_backstroke();}switch(stroke){case 8:return this.backstroke_length=this.search_field.value.length;case 9:return this.mouse_on_container=false;case 13:return evt.preventDefault();case 38:evt.preventDefault();return this.keyup_arrow();case 40:return this.keydown_arrow();}};Chosen.prototype.search_field_scale=function(){var dd_top,div,h,style,style_block,styles,w,_i,_len;if(this.is_multiple){h=0;w=0;style_block="position:absolute; left: -1000px; top: -1000px; display:none;";styles=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(_i=0,_len=styles.length;_i<_len;_i++){style=styles[_i];style_block+=style+":"+this.search_field.getStyle(style)+";";}div=new Element("div",{style:style_block}).update(this.search_field.value);document.body.appendChild(div);w=Element.measure(div,"width")+25;div.remove();if(w>this.f_width-10){w=this.f_width-10;}this.search_field.setStyle({width:w+"px"});dd_top=this.container.getHeight();return this.dropdown.setStyle({top:dd_top+"px"});}};return Chosen;})();root.Chosen=Chosen;document.observe("dom:loaded",function(evt){var select,selects,_i,_len,_results;selects=$$(".chzn-select");_results=[];for(_i=0,_len=selects.length;_i<_len;_i++){select=selects[_i];_results.push(new Chosen(select));}return _results;});get_side_border_padding=function(elmt){var layout,side_border_padding;layout=new Element.Layout(elmt);return side_border_padding=layout.get("border-left")+layout.get("border-right")+layout.get("padding-left")+layout.get("padding-right");};root.get_side_border_padding=get_side_border_padding;root=typeof exports!=="undefined"&&exports!==null?exports:this;SelectParser=(function(){function SelectParser(){this.options_index=0;this.parsed=[];}SelectParser.prototype.add_node=function(child){if(child.nodeName==="OPTGROUP"){return this.add_group(child);}else{return this.add_option(child);}};SelectParser.prototype.add_group=function(group){var group_position,option,_i,_len,_ref,_results;group_position=this.parsed.length;this.parsed.push({array_index:group_position,group:true,label:group.label,children:0,disabled:group.disabled});_ref=group.childNodes;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){option=_ref[_i];_results.push(this.add_option(option,group_position,group.disabled));}return _results;};SelectParser.prototype.add_option=function(option,group_position,group_disabled){if(option.nodeName==="OPTION"){if(option.text!==""){if(group_position!=null){this.parsed[group_position].children+=1;}this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:option.value,text:option.text,selected:option.selected,disabled:group_disabled===true?group_disabled:option.disabled,group_array_index:group_position});}else{this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:true});}return this.options_index+=1;}};return SelectParser;})();SelectParser.select_to_array=function(select){var child,parser,_i,_len,_ref;parser=new SelectParser();_ref=select.childNodes;for(_i=0,_len=_ref.length;_i<_len;_i++){child=_ref[_i];parser.add_node(child);}return parser.parsed;};root.SelectParser=SelectParser;}).call(this); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/chosen/coffee/chosen.jquery.coffee b/src/usr/local/www/javascript/chosen/coffee/chosen.jquery.coffee
new file mode 100644
index 0000000..0d6596a
--- /dev/null
+++ b/src/usr/local/www/javascript/chosen/coffee/chosen.jquery.coffee
@@ -0,0 +1,633 @@
+###
+Chosen, a Select Box Enhancer for jQuery and Protoype
+by Patrick Filler for Harvest, http://getharvest.com
+
+Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
+
+Copyright (c) 2011 by Harvest
+###
+
+root = exports ? this
+$ = jQuery
+
+$.fn.extend({
+ chosen: (data, options) ->
+ $(this).each((input_field) ->
+ new Chosen(this, data, options) unless ($ this).hasClass "chzn-done"
+ )
+})
+
+class Chosen
+
+ constructor: (elmn) ->
+ this.set_default_values()
+
+ @form_field = elmn
+ @form_field_jq = $ @form_field
+ @is_multiple = @form_field.multiple
+
+ @default_text_default = if @form_field.multiple then "Select Some Options" else "Select an Option"
+
+ this.set_up_html()
+ this.register_observers()
+ @form_field_jq.addClass "chzn-done"
+
+ set_default_values: ->
+
+ @click_test_action = (evt) => this.test_active_click(evt)
+ @active_field = false
+ @mouse_on_container = false
+ @results_showing = false
+ @result_highlighted = null
+ @result_single_selected = null
+ @choices = 0
+
+ set_up_html: ->
+ @container_id = @form_field.id + "_chzn"
+
+ @f_width = @form_field_jq.width()
+
+ @default_text = if @form_field_jq.attr 'title' then @form_field_jq.attr 'title' else @default_text_default
+
+ container_div = ($ "<div />", {
+ id: @container_id
+ class: 'chzn-container'
+ style: 'width: ' + (@f_width) + 'px;' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter
+ })
+
+ if @is_multiple
+ container_div.html '<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + @default_text + '" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'
+ else
+ container_div.html '<a href="javascript:void(0)" class="chzn-single"><span>' + @default_text + '</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>'
+
+ @form_field_jq.hide().after container_div
+ @container = ($ '#' + @container_id)
+ @container.addClass( "chzn-container-" + (if @is_multiple then "multi" else "single") )
+ @dropdown = @container.find('div.chzn-drop').first()
+
+ dd_top = @container.height()
+ dd_width = (@f_width - get_side_border_padding(@dropdown))
+
+ @dropdown.css({"width": dd_width + "px", "top": dd_top + "px"})
+
+ @search_field = @container.find('input').first()
+ @search_results = @container.find('ul.chzn-results').first()
+ this.search_field_scale()
+
+ @search_no_results = @container.find('li.no-results').first()
+
+ if @is_multiple
+ @search_choices = @container.find('ul.chzn-choices').first()
+ @search_container = @container.find('li.search-field').first()
+ else
+ @search_container = @container.find('div.chzn-search').first()
+ @selected_item = @container.find('.chzn-single').first()
+ sf_width = dd_width - get_side_border_padding(@search_container) - get_side_border_padding(@search_field)
+ @search_field.css( {"width" : sf_width + "px"} )
+
+ this.results_build()
+ this.set_tab_index()
+
+
+ register_observers: ->
+ @container.click (evt) => this.container_click(evt)
+ @container.mouseenter (evt) => this.mouse_enter(evt)
+ @container.mouseleave (evt) => this.mouse_leave(evt)
+
+ @search_results.click (evt) => this.search_results_click(evt)
+ @search_results.mouseover (evt) => this.search_results_mouseover(evt)
+ @search_results.mouseout (evt) => this.search_results_mouseout(evt)
+
+ @form_field_jq.bind "liszt:updated", (evt) => this.results_update_field(evt)
+
+ @search_field.blur (evt) => this.input_blur(evt)
+ @search_field.keyup (evt) => this.keyup_checker(evt)
+ @search_field.keydown (evt) => this.keydown_checker(evt)
+
+ if @is_multiple
+ @search_choices.click (evt) => this.choices_click(evt)
+ @search_field.focus (evt) => this.input_focus(evt)
+ else
+ @selected_item.focus (evt) => this.activate_field(evt)
+
+ container_click: (evt) ->
+ if evt and evt.type is "click"
+ evt.stopPropagation()
+ if not @pending_destroy_click
+ if not @active_field
+ @search_field.val "" if @is_multiple
+ $(document).click @click_test_action
+ this.results_show()
+ else if not @is_multiple and evt and ($(evt.target) is @selected_item || $(evt.target).parents("a.chzn-single").length)
+ evt.preventDefault()
+ this.results_toggle()
+
+ this.activate_field()
+ else
+ @pending_destroy_click = false
+
+ mouse_enter: -> @mouse_on_container = true
+ mouse_leave: -> @mouse_on_container = false
+
+ input_focus: (evt) ->
+ setTimeout (=> this.container_click()), 50 unless @active_field
+
+ input_blur: (evt) ->
+ if not @mouse_on_container
+ @active_field = false
+ setTimeout (=> this.blur_test()), 100
+
+ blur_test: (evt) ->
+ this.close_field() if not @active_field and @container.hasClass "chzn-container-active"
+
+ close_field: ->
+ $(document).unbind "click", @click_test_action
+
+ if not @is_multiple
+ @selected_item.attr "tabindex", @search_field.attr("tabindex")
+ @search_field.attr "tabindex", -1
+
+ @active_field = false
+ this.results_hide()
+
+ @container.removeClass "chzn-container-active"
+ this.winnow_results_clear()
+ this.clear_backstroke()
+
+ this.show_search_field_default()
+ this.search_field_scale()
+
+ activate_field: ->
+ if not @is_multiple and not @active_field
+ @search_field.attr "tabindex", (@selected_item.attr "tabindex")
+ @selected_item.attr "tabindex", -1
+
+ @container.addClass "chzn-container-active"
+ @active_field = true
+
+ @search_field.val(@search_field.val())
+ @search_field.focus()
+
+
+ test_active_click: (evt) ->
+ if $(evt.target).parents('#' + @container.id).length
+ @active_field = true
+ else
+ this.close_field()
+
+ results_build: ->
+ startTime = new Date()
+ @parsing = true
+ @results_data = SelectParser.select_to_array @form_field
+
+ if @is_multiple and @choices > 0
+ @search_choices.find("li.search-choice").remove()
+ @choices = 0
+ else if not @is_multiple
+ @selected_item.find("span").text @default_text
+
+ content = ''
+ for data in @results_data
+ if data.group
+ content += this.result_add_group data
+ else if !data.empty
+ content += this.result_add_option data
+ if data.selected and @is_multiple
+ this.choice_build data
+ else if data.selected and not @is_multiple
+ @selected_item.find("span").text data.text
+
+ this.show_search_field_default()
+ this.search_field_scale()
+
+ @search_results.html content
+ @parsing = false
+
+
+ result_add_group: (group) ->
+ if not group.disabled
+ group.dom_id = @form_field.id + "chzn_g_" + group.array_index
+ '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>'
+ else
+ ""
+
+ result_add_option: (option) ->
+ if not option.disabled
+ option.dom_id = @form_field.id + "chzn_o_" + option.array_index
+
+ classes = if option.selected and @is_multiple then [] else ["active-result"]
+ classes.push "result-selected" if option.selected
+ classes.push "group-option" if option.group_array_index?
+
+ '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + $("<div />").text(option.text).html() + '</li>'
+ else
+ ""
+
+ results_update_field: ->
+ this.result_clear_highlight()
+ @result_single_selected = null
+ this.results_build()
+
+ result_do_highlight: (el) ->
+ if el.length
+ this.result_clear_highlight()
+
+ @result_highlight = el
+ @result_highlight.addClass "highlighted"
+
+ maxHeight = parseInt @search_results.css("maxHeight"), 10
+ visible_top = @search_results.scrollTop()
+ visible_bottom = maxHeight + visible_top
+
+ high_top = @result_highlight.position().top + @search_results.scrollTop()
+ high_bottom = high_top + @result_highlight.outerHeight()
+
+ if high_bottom >= visible_bottom
+ @search_results.scrollTop if (high_bottom - maxHeight) > 0 then (high_bottom - maxHeight) else 0
+ else if high_top < visible_top
+ @search_results.scrollTop high_top
+
+ result_clear_highlight: ->
+ @result_highlight.removeClass "highlighted" if @result_highlight
+ @result_highlight = null
+
+ results_toggle: ->
+ if @results_showing
+ this.results_hide()
+ else
+ this.results_show()
+
+ results_show: ->
+ if not @is_multiple
+ @selected_item.addClass "chzn-single-with-drop"
+ if @result_single_selected
+ this.result_do_highlight( @result_single_selected )
+
+ dd_top = if @is_multiple then @container.height() else (@container.height() - 1)
+ @dropdown.css {"top": dd_top + "px", "left":0}
+ @results_showing = true
+
+ @search_field.focus()
+ @search_field.val @search_field.val()
+
+ this.winnow_results()
+
+ results_hide: ->
+ @selected_item.removeClass "chzn-single-with-drop" unless @is_multiple
+ this.result_clear_highlight()
+ @dropdown.css {"left":"-9000px"}
+ @results_showing = false
+
+
+ set_tab_index: (el) ->
+ if @form_field_jq.attr "tabindex"
+ ti = @form_field_jq.attr "tabindex"
+ @form_field_jq.attr "tabindex", -1
+
+ if @is_multiple
+ @search_field.attr "tabindex", ti
+ else
+ @selected_item.attr "tabindex", ti
+ @search_field.attr "tabindex", -1
+
+ show_search_field_default: ->
+ if @is_multiple and @choices < 1 and not @active_field
+ @search_field.val(@default_text)
+ @search_field.addClass "default"
+ else
+ @search_field.val("")
+ @search_field.removeClass "default"
+
+ search_results_click: (evt) ->
+ target = if $(evt.target).hasClass "active-result" then $(evt.target) else $(evt.target).parents(".active-result").first()
+ if target.length
+ @result_highlight = target
+ this.result_select()
+
+ search_results_mouseover: (evt) ->
+ target = if $(evt.target).hasClass "active-result" then $(evt.target) else $(evt.target).parents(".active-result").first()
+ this.result_do_highlight( target ) if target
+
+ search_results_mouseout: (evt) ->
+ this.result_clear_highlight() if $(evt.target).hasClass "active-result" or $(evt.target).parents('.active-result').first()
+
+
+ choices_click: (evt) ->
+ evt.preventDefault()
+ if( @active_field and not($(evt.target).hasClass "search-choice" or $(evt.target).parents('.search-choice').first) and not @results_showing )
+ this.results_show()
+
+ choice_build: (item) ->
+ choice_id = @form_field.id + "_chzn_c_" + item.array_index
+ @choices += 1
+ @search_container.before '<li class="search-choice" id="' + choice_id + '"><span>' + item.text + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>'
+ link = $('#' + choice_id).find("a").first()
+ link.click (evt) => this.choice_destroy_link_click(evt)
+
+ choice_destroy_link_click: (evt) ->
+ evt.preventDefault()
+ @pending_destroy_click = true
+ this.choice_destroy $(evt.target)
+
+ choice_destroy: (link) ->
+ @choices -= 1
+ this.show_search_field_default()
+
+ this.results_hide() if @is_multiple and @choices > 0 and @search_field.val().length < 1
+
+ this.result_deselect (link.attr "rel")
+ link.parents('li').first().remove()
+
+ result_select: ->
+ if @result_highlight
+ high = @result_highlight
+ high_id = high.attr "id"
+
+ this.result_clear_highlight()
+
+ high.addClass "result-selected"
+
+ if @is_multiple
+ this.result_deactivate high
+ else
+ @result_single_selected = high
+
+ position = high_id.substr(high_id.lastIndexOf("_") + 1 )
+ item = @results_data[position]
+ item.selected = true
+
+ @form_field.options[item.options_index].selected = true
+
+ if @is_multiple
+ this.choice_build item
+ else
+ @selected_item.find("span").first().text item.text
+
+ this.results_hide()
+ @search_field.val ""
+
+ @form_field_jq.trigger "change"
+ this.search_field_scale()
+
+ result_activate: (el) ->
+ el.addClass("active-result").show()
+
+ result_deactivate: (el) ->
+ el.removeClass("active-result").hide()
+
+ result_deselect: (pos) ->
+ result_data = @results_data[pos]
+ result_data.selected = false
+
+ @form_field.options[result_data.options_index].selected = false
+ result = $("#" + @form_field.id + "chzn_o_" + pos)
+ result.removeClass("result-selected").addClass("active-result").show()
+
+ this.result_clear_highlight()
+ this.winnow_results()
+
+ @form_field_jq.trigger "change"
+ this.search_field_scale()
+
+ results_search: (evt) ->
+ if @results_showing
+ this.winnow_results()
+ else
+ this.results_show()
+
+ winnow_results: ->
+ startTime = new Date()
+ this.no_results_clear()
+
+ results = 0
+
+ searchText = if @search_field.val() is @default_text then "" else $.trim @search_field.val()
+ regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
+ zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
+
+ for option in @results_data
+ if not option.disabled and not option.empty
+ if option.group
+ $('#' + option.dom_id).hide()
+ else if not (@is_multiple and option.selected)
+ found = false
+ result_id = option.dom_id
+
+ if regex.test option.text
+ found = true
+ results += 1
+ else if option.text.indexOf(" ") >= 0 or option.text.indexOf("[") == 0
+ #TODO: replace this substitution of /\[\]/ with a list of characters to skip.
+ parts = option.text.replace(/\[|\]/g, "").split(" ")
+ if parts.length
+ for part in parts
+ if regex.test part
+ found = true
+ results += 1
+
+ if found
+ if searchText.length
+ startpos = option.text.search zregex
+ text = option.text.substr(0, startpos + searchText.length) + '</em>' + option.text.substr(startpos + searchText.length)
+ text = text.substr(0, startpos) + '<em>' + text.substr(startpos)
+ else
+ text = option.text
+
+ $("#" + result_id).html text if $("#" + result_id).html != text
+
+ this.result_activate $("#" + result_id)
+
+ $("#" + @results_data[option.group_array_index].dom_id).show() if option.group_array_index?
+ else
+ this.result_clear_highlight() if @result_highlight and result_id is @result_highlight.attr 'id'
+ this.result_deactivate $("#" + result_id)
+
+ if results < 1 and searchText.length
+ this.no_results searchText
+ else
+ this.winnow_results_set_highlight()
+
+ winnow_results_clear: ->
+ @search_field.val ""
+ lis = @search_results.find("li")
+
+ for li in lis
+ li = $(li)
+ if li.hasClass "group-result"
+ li.show()
+ else if not @is_multiple or not li.hasClass "result-selected"
+ this.result_activate li
+
+ winnow_results_set_highlight: ->
+ if not @result_highlight
+ do_high = @search_results.find(".active-result").first()
+ if(do_high)
+ this.result_do_highlight do_high
+
+ no_results: (terms) ->
+ no_results_html = $('<li class="no-results">No results match "<span></span>"</li>')
+ no_results_html.find("span").first().text(terms)
+
+ @search_results.append no_results_html
+
+ no_results_clear: ->
+ @search_results.find(".no-results").remove()
+
+ keydown_arrow: ->
+ if not @result_highlight
+ first_active = @search_results.find("li.active-result").first()
+ this.result_do_highlight $(first_active) if first_active
+ else if @results_showing
+ next_sib = @result_highlight.nextAll("li.active-result").first()
+ this.result_do_highlight next_sib if next_sib
+ this.results_show() if not @results_showing
+
+ keyup_arrow: ->
+ if not @results_showing and not @is_multiple
+ this.results_show()
+ else if @result_highlight
+ prev_sibs = @result_highlight.prevAll("li.active-result")
+
+ if prev_sibs.length
+ this.result_do_highlight prev_sibs.first()
+ else
+ this.results_hide() if @choices > 0
+ this.result_clear_highlight()
+
+ keydown_backstroke: ->
+ if @pending_backstroke
+ this.choice_destroy @pending_backstroke.find("a").first()
+ this.clear_backstroke()
+ else
+ @pending_backstroke = @search_container.siblings("li.search-choice").last()
+ @pending_backstroke.addClass "search-choice-focus"
+
+ clear_backstroke: ->
+ @pending_backstroke.removeClass "search-choice-focus" if @pending_backstroke
+ @pending_backstroke = null
+
+ keyup_checker: (evt) ->
+ stroke = evt.which ? evt.keyCode
+ this.search_field_scale()
+
+ switch stroke
+ when 8
+ if @is_multiple and @backstroke_length < 1 and @choices > 0
+ this.keydown_backstroke()
+ else if not @pending_backstroke
+ this.result_clear_highlight()
+ this.results_search()
+ when 13
+ evt.preventDefault()
+ this.result_select() if this.results_showing
+ when 27
+ this.results_hide() if @results_showing
+ when 9, 38, 40, 16
+ # don't do anything on these keys
+ else this.results_search()
+
+
+ keydown_checker: (evt) ->
+ stroke = evt.which ? evt.keyCode
+ this.search_field_scale()
+
+ this.clear_backstroke() if stroke != 8 and this.pending_backstroke
+
+ switch stroke
+ when 8
+ @backstroke_length = this.search_field.val().length
+ break
+ when 9
+ @mouse_on_container = false
+ break
+ when 13
+ evt.preventDefault()
+ break
+ when 38
+ evt.preventDefault()
+ this.keyup_arrow()
+ break
+ when 40
+ this.keydown_arrow()
+ break
+
+
+ search_field_scale: ->
+ if @is_multiple
+ h = 0
+ w = 0
+
+ style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"
+ styles = ['font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing']
+
+ for style in styles
+ style_block += style + ":" + @search_field.css(style) + ";"
+
+ div = $('<div />', { 'style' : style_block })
+ div.text @search_field.val()
+ $('body').append div
+
+ w = div.width() + 25
+ div.remove()
+
+ if( w > @f_width-10 )
+ w = @f_width - 10
+
+ @search_field.css({'width': w + 'px'})
+
+ dd_top = @container.height()
+ @dropdown.css({"top": dd_top + "px"})
+
+get_side_border_padding = (elmt) ->
+ side_border_padding = elmt.outerWidth() - elmt.width()
+
+root.get_side_border_padding = get_side_border_padding
+
+class SelectParser
+
+ constructor: ->
+ @options_index = 0
+ @parsed = []
+
+ add_node: (child) ->
+ if child.nodeName is "OPTGROUP"
+ this.add_group child
+ else
+ this.add_option child
+
+ add_group: (group) ->
+ group_position = @parsed.length
+ @parsed.push
+ array_index: group_position
+ group: true
+ label: group.label
+ children: 0
+ disabled: group.disabled
+ this.add_option( option, group_position, group.disabled ) for option in group.childNodes
+
+ add_option: (option, group_position, group_disabled) ->
+ if option.nodeName is "OPTION"
+ if option.text != ""
+ if group_position?
+ @parsed[group_position].children += 1
+ @parsed.push
+ array_index: @parsed.length
+ options_index: @options_index
+ value: option.value
+ text: option.text
+ selected: option.selected
+ disabled: if group_disabled is true then group_disabled else option.disabled
+ group_array_index: group_position
+ else
+ @parsed.push
+ array_index: @parsed.length
+ options_index: @options_index
+ empty: true
+ @options_index += 1
+
+SelectParser.select_to_array = (select) ->
+ parser = new SelectParser()
+ parser.add_node( child ) for child in select.childNodes
+ parser.parsed
+
+root.SelectParser = SelectParser
diff --git a/src/usr/local/www/javascript/chosen/coffee/chosen.proto.coffee b/src/usr/local/www/javascript/chosen/coffee/chosen.proto.coffee
new file mode 100644
index 0000000..87a22b6
--- /dev/null
+++ b/src/usr/local/www/javascript/chosen/coffee/chosen.proto.coffee
@@ -0,0 +1,629 @@
+###
+Chosen, a Select Box Enhancer for jQuery and Protoype
+by Patrick Filler for Harvest, http://getharvest.com
+
+Available for use under the MIT License, http://en.wikipedia.org/wiki/MIT_License
+
+Copyright (c) 2011 by Harvest
+###
+
+root = exports ? this
+
+class Chosen
+
+ constructor: (elmn) ->
+ this.set_default_values()
+
+ @form_field = elmn
+ @is_multiple = @form_field.multiple
+
+ @default_text_default = if @form_field.multiple then "Select Some Options" else "Select an Option"
+
+ this.set_up_html()
+ this.register_observers()
+
+
+ set_default_values: ->
+
+ @click_test_action = (evt) => this.test_active_click(evt)
+ @active_field = false
+ @mouse_on_container = false
+ @results_showing = false
+ @result_highlighted = null
+ @result_single_selected = null
+ @choices = 0
+
+ # HTML Templates
+ @single_temp = new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" /></div><ul class="chzn-results"></ul></div>')
+ @multi_temp = new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>')
+ @choice_temp = new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>')
+ @no_results_temp = new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>')
+
+
+ set_up_html: ->
+ @container_id = @form_field.id + "_chzn"
+
+ @f_width = if @form_field.getStyle("width") then parseInt @form_field.getStyle("width"), 10 else @form_field.getWidth()
+
+ container_props =
+ 'id': @container_id
+ 'class': 'chzn-container'
+ 'style': 'width: ' + (@f_width) + 'px' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter
+
+ @default_text = if @form_field.readAttribute 'title' then @form_field.readAttribute 'title' else @default_text_default
+
+ base_template = if @is_multiple then new Element('div', container_props).update( @multi_temp.evaluate({ "default": @default_text}) ) else new Element('div', container_props).update( @single_temp.evaluate({ "default":@default_text }) )
+
+ @form_field.hide().insert({ after: base_template })
+ @container = $(@container_id)
+ @container.addClassName( "chzn-container-" + (if @is_multiple then "multi" else "single") )
+ @dropdown = @container.down('div.chzn-drop')
+
+ dd_top = @container.getHeight()
+ dd_width = (@f_width - get_side_border_padding(@dropdown))
+
+ @dropdown.setStyle({"width": dd_width + "px", "top": dd_top + "px"})
+
+ @search_field = @container.down('input')
+ @search_results = @container.down('ul.chzn-results')
+ this.search_field_scale()
+
+ @search_no_results = @container.down('li.no-results')
+
+ if @is_multiple
+ @search_choices = @container.down('ul.chzn-choices')
+ @search_container = @container.down('li.search-field')
+ else
+ @search_container = @container.down('div.chzn-search')
+ @selected_item = @container.down('.chzn-single')
+ sf_width = dd_width - get_side_border_padding(@search_container) - get_side_border_padding(@search_field)
+ @search_field.setStyle( {"width" : sf_width + "px"} )
+
+ this.results_build()
+ this.set_tab_index()
+
+
+ register_observers: ->
+ @container.observe "click", (evt) => this.container_click(evt)
+ @container.observe "mouseenter", (evt) => this.mouse_enter(evt)
+ @container.observe "mouseleave", (evt) => this.mouse_leave(evt)
+
+ @search_results.observe "click", (evt) => this.search_results_click(evt)
+ @search_results.observe "mouseover", (evt) => this.search_results_mouseover(evt)
+ @search_results.observe "mouseout", (evt) => this.search_results_mouseout(evt)
+
+ @form_field.observe "liszt:updated", (evt) => this.results_update_field(evt)
+
+ @search_field.observe "blur", (evt) => this.input_blur(evt)
+ @search_field.observe "keyup", (evt) => this.keyup_checker(evt)
+ @search_field.observe "keydown", (evt) => this.keydown_checker(evt)
+
+ if @is_multiple
+ @search_choices.observe "click", (evt) => this.choices_click(evt)
+ @search_field.observe "focus", (evt) => this.input_focus(evt)
+ else
+ @selected_item.observe "focus", (evt) => this.activate_field(evt)
+
+
+ container_click: (evt) ->
+ if evt and evt.type is "click"
+ evt.stop()
+ if not @pending_destroy_click
+ if not @active_field
+ @search_field.clear() if @is_multiple
+ document.observe "click", @click_test_action
+ this.results_show()
+ else if not @is_multiple and evt and (evt.target is @selected_item || evt.target.up("a.chzn-single"))
+ this.results_toggle()
+
+ this.activate_field()
+ else
+ @pending_destroy_click = false
+
+ mouse_enter: -> @mouse_on_container = true
+ mouse_leave: -> @mouse_on_container = false
+
+ input_focus: (evt) ->
+ setTimeout this.container_click.bind(this), 50 unless @active_field
+
+ input_blur: (evt) ->
+ if not @mouse_on_container
+ @active_field = false
+ setTimeout this.blur_test.bind(this), 100
+
+ blur_test: (evt) ->
+ this.close_field() if not @active_field and @container.hasClassName("chzn-container-active")
+
+ close_field: ->
+ document.stopObserving "click", @click_test_action
+
+ if not @is_multiple
+ @selected_item.tabIndex = @search_field.tabIndex
+ @search_field.tabIndex = -1
+
+ @active_field = false
+ this.results_hide()
+
+ @container.removeClassName "chzn-container-active"
+ this.winnow_results_clear()
+ this.clear_backstroke()
+
+ this.show_search_field_default()
+ this.search_field_scale()
+
+ activate_field: ->
+ if not @is_multiple and not @active_field
+ @search_field.tabIndex = @selected_item.tabIndex
+ @selected_item.tabIndex = -1
+
+ @container.addClassName "chzn-container-active"
+ @active_field = true
+
+ @search_field.value = @search_field.value
+ @search_field.focus()
+
+
+ test_active_click: (evt) ->
+ if evt.target.up('#' + @container.id)
+ @active_field = true
+ else
+ this.close_field()
+
+ results_build: ->
+ startTime = new Date()
+ @parsing = true
+ @results_data = SelectParser.select_to_array @form_field
+
+ if @is_multiple and @choices > 0
+ @search_choices.select("li.search-choice").invoke("remove")
+ @choices = 0
+ else if not @is_multiple
+ @selected_item.down("span").update(@default_text)
+
+ content = ''
+ for data in @results_data
+ if data.group
+ content += this.result_add_group data
+ else if !data.empty
+ content += this.result_add_option data
+ if data.selected and @is_multiple
+ this.choice_build data
+ else if data.selected and not @is_multiple
+ @selected_item.down("span").update( data.text )
+
+ this.show_search_field_default()
+ this.search_field_scale()
+
+ @search_results.update content
+ @parsing = false
+
+
+ result_add_group: (group) ->
+ if not group.disabled
+ group.dom_id = @form_field.id + "chzn_g_" + group.array_index
+ '<li id="' + group.dom_id + '" class="group-result">' + group.label.escapeHTML() + '</li>'
+ else
+ ""
+
+ result_add_option: (option) ->
+ if not option.disabled
+ option.dom_id = @form_field.id + "chzn_o_" + option.array_index
+
+ classes = if option.selected and @is_multiple then [] else ["active-result"]
+ classes.push "result-selected" if option.selected
+ classes.push "group-option" if option.group_array_index?
+
+ '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + option.text.escapeHTML() + '</li>'
+ else
+ ""
+
+ results_update_field: ->
+ this.result_clear_highlight()
+ @result_single_selected = null
+ this.results_build()
+
+ result_do_highlight: (el) ->
+ this.result_clear_highlight()
+
+ @result_highlight = el
+ @result_highlight.addClassName "highlighted"
+
+ maxHeight = parseInt @search_results.getStyle('maxHeight'), 10
+ visible_top = @search_results.scrollTop
+ visible_bottom = maxHeight + visible_top
+
+ high_top = @result_highlight.positionedOffset().top
+ high_bottom = high_top + @result_highlight.getHeight()
+
+ if high_bottom >= visible_bottom
+ @search_results.scrollTop = if (high_bottom - maxHeight) > 0 then (high_bottom - maxHeight) else 0
+ else if high_top < visible_top
+ @search_results.scrollTop = high_top
+
+ result_clear_highlight: ->
+ @result_highlight.removeClassName('highlighted') if @result_highlight
+ @result_highlight = null
+
+ results_toggle: ->
+ if @results_showing
+ this.results_hide()
+ else
+ this.results_show()
+
+ results_show: ->
+ if not @is_multiple
+ @selected_item.addClassName('chzn-single-with-drop')
+ if @result_single_selected
+ this.result_do_highlight( @result_single_selected )
+
+ dd_top = if @is_multiple then @container.getHeight() else (@container.getHeight() - 1)
+ @dropdown.setStyle {"top": dd_top + "px", "left":0}
+ @results_showing = true
+
+ @search_field.focus()
+ @search_field.value = @search_field.value
+
+ this.winnow_results()
+
+ results_hide: ->
+ @selected_item.removeClassName('chzn-single-with-drop') unless @is_multiple
+ this.result_clear_highlight()
+ @dropdown.setStyle({"left":"-9000px"})
+ @results_showing = false
+
+
+ set_tab_index: (el) ->
+ if @form_field.tabIndex
+ ti = @form_field.tabIndex
+ @form_field.tabIndex = -1
+
+ if @is_multiple
+ @search_field.tabIndex = ti
+ else
+ @selected_item.tabIndex = ti
+ @search_field.tabIndex = -1
+
+ show_search_field_default: ->
+ if @is_multiple and @choices < 1 and not @active_field
+ @search_field.value = @default_text
+ @search_field.addClassName "default"
+ else
+ @search_field.value = ""
+ @search_field.removeClassName "default"
+
+ search_results_click: (evt) ->
+ target = if evt.target.hasClassName("active-result") then evt.target else evt.target.up(".active-result")
+ if target
+ @result_highlight = target
+ this.result_select()
+
+ search_results_mouseover: (evt) ->
+ target = if evt.target.hasClassName("active-result") then evt.target else evt.target.up(".active-result")
+ this.result_do_highlight( target ) if target
+
+ search_results_mouseout: (evt) ->
+ this.result_clear_highlight() if evt.target.hasClassName('active-result') or evt.target.up('.active-result')
+
+
+ choices_click: (evt) ->
+ evt.preventDefault()
+ if( @active_field and not(evt.target.hasClassName('search-choice') or evt.target.up('.search-choice')) and not @results_showing )
+ this.results_show()
+
+ choice_build: (item) ->
+ choice_id = @form_field.id + "_chzn_c_" + item.array_index
+ @choices += 1
+ @search_container.insert { before: @choice_temp.evaluate({"id":choice_id, "choice":item.text, "position":item.array_index}) }
+ link = $(choice_id).down('a')
+ link.observe "click", (evt) => this.choice_destroy_link_click(evt)
+
+ choice_destroy_link_click: (evt) ->
+ evt.preventDefault()
+ @pending_destroy_click = true
+ this.choice_destroy evt.target
+
+ choice_destroy: (link) ->
+ @choices -= 1
+ this.show_search_field_default()
+
+ this.results_hide() if @is_multiple and @choices > 0 and @search_field.value.length < 1
+
+ this.result_deselect link.readAttribute("rel")
+ link.up('li').remove()
+
+ result_select: ->
+ if @result_highlight
+ high = @result_highlight
+ this.result_clear_highlight()
+
+ high.addClassName("result-selected")
+
+ if @is_multiple
+ this.result_deactivate high
+ else
+ @result_single_selected = high
+
+ position = high.id.substr(high.id.lastIndexOf("_") + 1 )
+ item = @results_data[position]
+ item.selected = true
+
+ @form_field.options[item.options_index].selected = true
+
+ if @is_multiple
+ this.choice_build item
+ else
+ @selected_item.down("span").update(item.text)
+
+ this.results_hide()
+ @search_field.value = ""
+
+ @form_field.simulate("change") if typeof Event.simulate is 'function'
+ this.search_field_scale()
+
+ result_activate: (el) ->
+ el.addClassName("active-result").show()
+
+ result_deactivate: (el) ->
+ el.removeClassName("active-result").hide()
+
+ result_deselect: (pos) ->
+ result_data = @results_data[pos]
+ result_data.selected = false
+
+ @form_field.options[result_data.options_index].selected = false
+ result = $(@form_field.id + "chzn_o_" + pos)
+ result.removeClassName("result-selected").addClassName("active-result").show()
+
+ this.result_clear_highlight()
+ this.winnow_results()
+
+ @form_field.simulate("change") if typeof Event.simulate is 'function'
+ this.search_field_scale()
+
+ results_search: (evt) ->
+ if @results_showing
+ this.winnow_results()
+ else
+ this.results_show()
+
+ winnow_results: ->
+ startTime = new Date()
+ this.no_results_clear()
+
+ results = 0
+
+ searchText = if @search_field.value is @default_text then "" else @search_field.value.strip()
+ regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
+ zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i')
+
+ for option in @results_data
+ if not option.disabled and not option.empty
+ if option.group
+ $(option.dom_id).hide()
+ else if not (@is_multiple and option.selected)
+ found = false
+ result_id = option.dom_id
+
+ if regex.test option.text
+ found = true
+ results += 1
+ else if option.text.indexOf(" ") >= 0 or option.text.indexOf("[") == 0
+ #TODO: replace this substitution of /\[\]/ with a list of characters to skip.
+ parts = option.text.replace(/\[|\]/g, "").split(" ")
+ if parts.length
+ for part in parts
+ if regex.test part
+ found = true
+ results += 1
+
+ if found
+ if searchText.length
+ startpos = option.text.search zregex
+ text = option.text.substr(0, startpos + searchText.length) + '</em>' + option.text.substr(startpos + searchText.length)
+ text = text.substr(0, startpos) + '<em>' + text.substr(startpos)
+ else
+ text = option.text
+
+ $(result_id).update text if $(result_id).innerHTML != text
+
+ this.result_activate $(result_id)
+
+ $(@results_data[option.group_array_index].dom_id).show() if option.group_array_index?
+ else
+ this.result_clear_highlight() if $(result_id) is @result_highlight
+ this.result_deactivate $(result_id)
+
+ if results < 1 and searchText.length
+ this.no_results(searchText)
+ else
+ this.winnow_results_set_highlight()
+
+ winnow_results_clear: ->
+ @search_field.clear()
+ lis = @search_results.select("li")
+
+ for li in lis
+ if li.hasClassName("group-result")
+ li.show()
+ else if not @is_multiple or not li.hasClassName("result-selected")
+ this.result_activate li
+
+ winnow_results_set_highlight: ->
+ if not @result_highlight
+ do_high = @search_results.down(".active-result")
+ if(do_high)
+ this.result_do_highlight do_high
+
+ no_results: (terms) ->
+ @search_results.insert @no_results_temp.evaluate({"terms":terms.escapeHTML()})
+
+ no_results_clear: ->
+ nr = null
+ nr.remove() while nr = @search_results.down(".no-results")
+
+
+ keydown_arrow: ->
+ actives = @search_results.select("li.active-result")
+ if actives.length
+ if not @result_highlight
+ this.result_do_highlight actives.first()
+ else if @results_showing
+ sibs = @result_highlight.nextSiblings()
+ nexts = sibs.intersect(actives)
+ this.result_do_highlight nexts.first() if nexts.length
+ this.results_show() if not @results_showing
+
+ keyup_arrow: ->
+ if not @results_showing and not @is_multiple
+ this.results_show()
+ else if @result_highlight
+ sibs = @result_highlight.previousSiblings()
+ actives = @search_results.select("li.active-result")
+ prevs = sibs.intersect(actives)
+
+ if prevs.length
+ this.result_do_highlight prevs.first()
+ else
+ this.results_hide() if @choices > 0
+ this.result_clear_highlight()
+
+ keydown_backstroke: ->
+ if @pending_backstroke
+ this.choice_destroy @pending_backstroke.down("a")
+ this.clear_backstroke()
+ else
+ @pending_backstroke = @search_container.siblings("li.search-choice").last()
+ @pending_backstroke.addClassName("search-choice-focus")
+
+ clear_backstroke: ->
+ @pending_backstroke.removeClassName("search-choice-focus") if @pending_backstroke
+ @pending_backstroke = null
+
+ keyup_checker: (evt) ->
+ stroke = evt.which ? evt.keyCode
+ this.search_field_scale()
+
+ switch stroke
+ when 8
+ if @is_multiple and @backstroke_length < 1 and @choices > 0
+ this.keydown_backstroke()
+ else if not @pending_backstroke
+ this.result_clear_highlight()
+ this.results_search()
+ when 13
+ evt.preventDefault()
+ this.result_select() if this.results_showing
+ when 27
+ this.results_hide() if @results_showing
+ when 9, 38, 40, 16
+ # don't do anything on these keys
+ else this.results_search()
+
+
+ keydown_checker: (evt) ->
+ stroke = evt.which ? evt.keyCode
+ this.search_field_scale()
+
+ this.clear_backstroke() if stroke != 8 and this.pending_backstroke
+
+ switch stroke
+ when 8
+ @backstroke_length = this.search_field.value.length
+ when 9
+ @mouse_on_container = false
+ when 13
+ evt.preventDefault()
+ when 38
+ evt.preventDefault()
+ this.keyup_arrow()
+ when 40
+ this.keydown_arrow()
+
+
+ search_field_scale: ->
+ if @is_multiple
+ h = 0
+ w = 0
+
+ style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"
+ styles = ['font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing']
+
+ for style in styles
+ style_block += style + ":" + @search_field.getStyle(style) + ";"
+
+ div = new Element('div', { 'style' : style_block }).update(@search_field.value)
+ document.body.appendChild(div)
+
+ w = Element.measure(div, 'width') + 25
+ div.remove()
+
+ if( w > @f_width-10 )
+ w = @f_width - 10
+
+ @search_field.setStyle({'width': w + 'px'})
+
+ dd_top = @container.getHeight()
+ @dropdown.setStyle({"top": dd_top + "px"})
+
+root.Chosen = Chosen
+
+document.observe 'dom:loaded', (evt) ->
+ selects = $$(".chzn-select")
+ new Chosen select for select in selects
+
+get_side_border_padding = (elmt) ->
+ layout = new Element.Layout(elmt)
+ side_border_padding = layout.get("border-left") + layout.get("border-right") + layout.get("padding-left") + layout.get("padding-right")
+
+root.get_side_border_padding = get_side_border_padding
+
+root = exports ? this
+
+class SelectParser
+
+ constructor: ->
+ @options_index = 0
+ @parsed = []
+
+ add_node: (child) ->
+ if child.nodeName is "OPTGROUP"
+ this.add_group child
+ else
+ this.add_option child
+
+ add_group: (group) ->
+ group_position = @parsed.length
+ @parsed.push
+ array_index: group_position
+ group: true
+ label: group.label
+ children: 0
+ disabled: group.disabled
+ this.add_option( option, group_position, group.disabled ) for option in group.childNodes
+
+ add_option: (option, group_position, group_disabled) ->
+ if option.nodeName is "OPTION"
+ if option.text != ""
+ if group_position?
+ @parsed[group_position].children += 1
+ @parsed.push
+ array_index: @parsed.length
+ options_index: @options_index
+ value: option.value
+ text: option.text
+ selected: option.selected
+ disabled: if group_disabled is true then group_disabled else option.disabled
+ group_array_index: group_position
+ else
+ @parsed.push
+ array_index: @parsed.length
+ options_index: @options_index
+ empty: true
+ @options_index += 1
+
+SelectParser.select_to_array = (select) ->
+ parser = new SelectParser()
+ parser.add_node( child ) for child in select.childNodes
+ parser.parsed
+
+root.SelectParser = SelectParser
diff --git a/src/usr/local/www/javascript/datepicker/css/datepicker.css b/src/usr/local/www/javascript/datepicker/css/datepicker.css
new file mode 100644
index 0000000..0773fa6
--- /dev/null
+++ b/src/usr/local/www/javascript/datepicker/css/datepicker.css
@@ -0,0 +1,178 @@
+/* This is a very basic stylesheet for the date-picker. Feel free to create your own. */
+
+/* The wrapper div */
+.datePicker
+ {
+ position:absolute;
+ min-width:21em;
+ width:21em;
+ z-index:9999;
+ text-align:center;
+ font:900 0.8em/0.8em Verdana, Sans-Serif;
+ background:transparent;
+ }
+/*
+ Quirksmode necessity
+ --------------------
+
+ If your HTML document renders in quirksmode (i.e. has no doctype declaration)
+ then uncomment the following CSS rule or the datePicker will be HUGE...
+
+.datePicker th,
+.datePicker td
+ {
+ font-size:11px;
+ }
+*/
+/* The iframe hack to cover selectlists in Internet Explorer <= v6 */
+.iehack
+ {
+ position:absolute;
+ background:#fff;
+ z-index:9998;
+ padding:0;
+ border:0;
+ display:none;
+ }
+/* The button created beside each input */
+.date-picker-control
+ {
+ border:0 none;
+ padding:0;
+ margin-left:4px;
+ background:transparent url(../media/cal.gif) no-repeat 0 0;
+ width:16px;
+ height:16px;
+ margin-top:0;
+ vertical-align:top;
+ cursor:pointer;
+ }
+/* The next & previous buttons */
+.datePicker th button
+ {
+ display:inline;
+ padding:0;
+ margin:0;
+ color:#000;
+ height:1em;
+ width:0.8em;
+ line-height:0.8em;
+ border-width:0;
+ font-family: georgia, times new roman, palatino, times, bookman, serif;
+ background:transparent;
+ font-weight:bold;
+ cursor:pointer;
+ }
+.datePicker th button:active,
+.datePicker th button:focus,
+.date-picker-control:active,
+.date-picker-control:focus
+ {
+ outline:none;
+ }
+.datePicker th button.prev-but
+ {
+ text-align:left;
+ }
+.datePicker th button.next-but
+ {
+ text-align:right;
+ }
+/* The mon, tue, wed etc day buttons */
+.datePicker th button.fd-day-header
+ {
+ text-align:center;
+ margin:0 auto;
+ font:900 1em Verdana, Sans-Serif;
+ height:auto;
+ width:auto;
+ text-decoration:none;
+ line-height:1.4em;
+ }
+/* The table */
+.datePicker table
+ {
+ position:relative;
+ margin:0;
+ padding:0;
+ border:1px solid #ccc;
+ background:#fff url(../media/gradient-e5e5e5-ffffff.gif) repeat-x 0 -20px;
+ text-align:center;
+ width:100%;
+ }
+.datePicker table tfoot td
+ {
+ background:#fff url(../media/gradient-e5e5e5-ffffff.gif) repeat-x 0 -40px;
+ }
+/* Common TD & TH styling */
+.datePicker table td
+ {
+ border: 1px solid #ccc;
+ padding:0.6em 0.5em 0.5em 0.5em;
+ /* Opera requires a line-height bigger than 1em in order to redraw properly */
+ line-height:1.2em;
+ cursor:default;
+ background:#fff url(../media/gradient-e5e5e5-ffffff.gif) repeat-x 0 -50px;
+ }
+.datePicker table th
+ {
+ border:0 none;
+ padding:0;
+ line-height:1em;
+ font-weight:bold;
+ color:#222;
+ text-align:center;
+ }
+/* The "mon tue wed etc" day header button styles */
+.datePicker table th.date-picker-day-header
+ {
+ text-transform:lowercase;
+ cursor:help;
+ }
+/* The "todays date" style */
+.datePicker table td.date-picker-today
+ {
+ background:#fff url(../media/bullet2.gif) no-repeat 0 0;
+ color:rgb(100,100,100) !important;
+ }
+/* The "selected date" style */
+.datePicker table td.date-picker-selected-date
+ {
+ color:#333 !important;
+ border-color:#333 !important;
+ }
+/* the "highlight days" style */
+td.date-picker-highlight
+ {
+ color:#a86666;
+ }
+/* The date "out of range" style */
+.datePicker table td.out-of-range
+ {
+ color:#ccc !important;
+ font-style:oblique;
+ background:transparent !important;
+ cursor:default !important;
+ }
+/* The "disabled days" style */
+.datePicker table td.day-disabled
+ {
+ color:#aaa !important;
+ background:transparent !important;
+ cursor:default !important;
+ }
+/* The "active cursor" style */
+.datePicker table td#date-picker-hover
+ {
+ background:#fff url(../media/bg_header.jpg) no-repeat 0 0;
+ cursor:pointer;
+ border-color:rgb(100,130,170);
+ color:rgb(100,130,170);
+ }
+/* Remove the images for Internet Explorer <= v6 using the "* html" hack */
+* html .datePicker table td.date-picker-selected,
+* html .datePicker table td.date-picker-hover,
+* html .datePicker table td
+ {
+ background-image:none;
+ }
diff --git a/src/usr/local/www/javascript/datepicker/js/blank.html b/src/usr/local/www/javascript/datepicker/js/blank.html
new file mode 100644
index 0000000..53a7f24
--- /dev/null
+++ b/src/usr/local/www/javascript/datepicker/js/blank.html
@@ -0,0 +1,6 @@
+<html>
+<head>
+</head>
+<body>
+</body>
+</html>
diff --git a/src/usr/local/www/javascript/datepicker/js/datepicker.js b/src/usr/local/www/javascript/datepicker/js/datepicker.js
new file mode 100644
index 0000000..3d6dbd3
--- /dev/null
+++ b/src/usr/local/www/javascript/datepicker/js/datepicker.js
@@ -0,0 +1,1111 @@
+/*
+ DatePicker v2.5 by frequency-decoder.com (2006/12/01)
+
+ Released under a creative commons Attribution-ShareAlike 2.5 license (http://creativecommons.org/licenses/by-sa/2.5/)
+
+ Please credit frequency-decoder in any derivative work - thanks.
+
+ You are free:
+
+ * to copy, distribute, display, and perform the work
+ * to make derivative works
+ * to make commercial use of the work
+
+ Under the following conditions:
+
+ by Attribution.
+ --------------
+ You must attribute the work in the manner specified by the author or licensor.
+
+ sa
+ --
+ Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one.
+
+ * For any reuse or distribution, you must make clear to others the license terms of this work.
+ * Any of these conditions can be waived if you get permission from the copyright holder.
+*/
+var datePickerController;
+
+(function() {
+
+datePicker.isSupported = typeof document.createElement != "undefined" &&
+ typeof document.documentElement != "undefined" &&
+ typeof document.documentElement.offsetWidth == "number";
+
+// Detect the users language
+datePicker.languageinfo = navigator.language ? navigator.language : navigator.userLanguage;
+datePicker.languageinfo = datePicker.languageinfo ? datePicker.languageinfo.toLowerCase().replace(/-[a-z]+$/, "") : 'en';
+
+if(datePicker.languageinfo != 'en') {
+ // Load the appropriate language file
+ var scriptFiles = document.getElementsByTagName('head')[0].getElementsByTagName('script');
+ var loc = "";
+
+ for(var i = 0, scriptFile; scriptFile = scriptFiles[i]; i++) {
+ if(scriptFile.src && scriptFile.src.match(/datepicker/)) {
+ loc = scriptFile.src.replace("datepicker", "lang/" + datePicker.languageinfo);
+ break;
+ };
+ };
+
+ if(loc != "") {
+ var script = document.createElement('script');
+ script.type = "text/javascript";
+ script.src = loc;
+ // Hopefully this allows a UTF-8 js file to be imported into a non-UTF HTML document
+ script.setAttribute("charset", "utf-8");
+ document.getElementsByTagName('head')[0].appendChild(script);
+ };
+};
+
+// Defaults for the language should the locale file not load
+datePicker.months = [
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December"];
+datePicker.fullDay = [
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+ "Sunday"];
+datePicker.titles = [
+ "Previous month",
+ "Next month",
+ "Previous year",
+ "Next year"];
+datePicker.daysPerMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
+
+datePicker.getDaysPerMonth = function (nMonth, nYear) {
+ nMonth = (nMonth + 12) % 12;
+ var res = datePicker.daysPerMonth[nMonth];
+ if(((0 == (nYear%4)) && ((0 != (nYear%100)) || (0 == (nYear%400)))) && nMonth == 1) {
+ res = 29;
+ };
+ return res;
+};
+
+function datePicker(options) {
+
+ this.defaults = {};
+
+ for(opt in options) {
+ this[opt] = this.defaults[opt] = options[opt];
+ };
+
+ this.date = new Date();
+ this.yearinc = 1;
+ this.timer = null;
+ this.pause = 1000;
+ this.timerSet = false;
+ this.opacity = 0;
+ this.opacityTo = 0;
+ this.fadeTimer = null;
+ this.interval = new Date();
+ this.firstDayOfWeek = this.defaults.firstDayOfWeek = 0;
+ this.dateSet = null;
+ this.visible = false;
+ this.div;
+ this.table;
+
+ var o = this;
+
+ o.reset = function() {
+ for(def in o.defaults) {
+ o[def] = o.defaults[def];
+ };
+ };
+ o.setOpacity = function(op) {
+ o.div.style.opacity = + op/100;
+ o.div.style.filter = 'alpha(opacity=' + op + ')';
+ o.opacity = op;
+ };
+ o.fade = function() {
+
+ window.clearTimeout(o.fadeTimer);
+ var diff = Math.round(o.opacity + ((o.opacityTo - o.opacity) / 4));
+
+ o.setOpacity(diff);
+
+ if(Math.abs(o.opacityTo - diff) > 3) {
+ o.fadeTimer = window.setTimeout(function () { o.fade(); }, 50);
+ } else {
+ o.setOpacity(o.opacityTo);
+ if(o.opacityTo == 0) o.div.style.display = "none";
+ };
+ };
+ o.killEvent = function(e) {
+ if (e == null) e = document.parentWindow.event;
+
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ /*@cc_on@*/
+ /*@if(@_win32)
+ e.cancelBubble = true;
+ e.returnValue = false;
+ /*@end@*/
+ return false;
+ };
+ o.startTimer = function () {
+ if (o.timerSet) o.stopTimer();
+ o.timer = window.setTimeout(function () { o.onTimer(); }, o.timerInc);
+ o.timerSet = true;
+ };
+ o.stopTimer = function () {
+ if (o.timer != null) window.clearTimeout(o.timer);
+ o.timerSet = false;
+ };
+ o.events = {
+ onkeydown: function (e) {
+
+ if(!o.visible) return false;
+
+ if (e == null) e = document.parentWindow.event;
+ var kc = e.keyCode ? e.keyCode : e.charCode;
+
+ if ( kc == 13 ) {
+ // close with update
+ o.returnFormattedDate();
+ o.hide();
+ return o.killEvent(e);
+ } else if ( kc == 27 ) {
+ // close
+ o.hide();
+ return o.killEvent(e);
+ } else if ( kc == 32 || kc == 0 ) {
+ // close
+ o.date = new Date( );
+ o.updateTable();
+ return o.killEvent(e);
+ };
+
+ // Internet Explorer fires the keydown event faster than the JavaScript engine can
+ // update the interface. The following attempts to fix this.
+
+ /*@cc_on@*/
+ /*@if(@_win32)
+ if(new Date().getTime() - o.interval.getTime() < 100) return o.killEvent(e);
+ o.interval = new Date();
+ /*@end@*/
+
+ if ((kc > 49 && kc < 56) || (kc > 97 && kc < 104)) {
+ if (kc > 96) kc -= (96-48);
+ kc -= 49;
+ o.firstDayOfWeek = (o.firstDayOfWeek + kc) % 7;
+ o.updateTable();
+ return o.killEvent(e);
+ };
+
+ if ( kc < 37 || kc > 40 ) return true;
+
+ var d = new Date( o.date ).valueOf();
+
+ if ( kc == 37 ) {
+ // ctrl + left = previous month
+ if( e.ctrlKey ) {
+ d = new Date( o.date );
+ d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth() - 1,d.getFullYear())) ); // no need to catch dec -> jan for the year
+ d.setMonth( d.getMonth() - 1 );
+ } else {
+ d -= 24 * 60 * 60 * 1000;
+ };
+ } else if ( kc == 39 ) {
+ // ctrl + right = next month
+ if( e.ctrlKey ) {
+ d = new Date( o.date );
+ d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth() + 1,d.getFullYear())) ); // no need to catch dec -> jan for the year
+ d.setMonth( d.getMonth() + 1 );
+ } else {
+ d += 24 * 60 * 60 * 1000;
+ };
+ } else if ( kc == 38 ) {
+ // ctrl + up = next year
+ if( e.ctrlKey ) {
+ d = new Date( o.date );
+ d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth(),d.getFullYear() + 1)) ); // no need to catch dec -> jan for the year
+ d.setFullYear( d.getFullYear() + 1 );
+ } else {
+ d -= 7 * 24 * 60 * 60 * 1000;
+ };
+ } else if ( kc == 40 ) {
+ // ctrl + down = prev year
+ if( e.ctrlKey ) {
+ d = new Date( o.date );
+ d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth(),d.getFullYear() - 1)) ); // no need to catch dec -> jan for the year
+ d.setFullYear( d.getFullYear() - 1 );
+ } else {
+ d += 7 * 24 * 60 * 60 * 1000;
+ };
+ };
+
+ var tmpDate = new Date( d );
+ if(!o.outOfRange(tmpDate)) {
+ o.date = tmpDate;
+ };
+
+ o.updateTable();
+
+ return o.killEvent(e);
+ },
+ onmousedown: function(e) {
+ if ( e == null ) e = document.parentWindow.event;
+ var el = e.target != null ? e.target : e.srcElement;
+
+ var found = false;
+
+ while(el.parentNode) {
+ if(el.id && (el.id == "fd-"+o.id || el.id == "fd-but-"+o.id)) {
+ found = true;
+ break;
+ }
+ try {
+ el = el.parentNode;
+ } catch(err) {
+ break;
+ }
+ }
+ if(found) return true;
+ datePickerController.hideAll();
+ },
+ onmouseover: function(e) {
+ if(document.getElementById("date-picker-hover")) {
+ document.getElementById("date-picker-hover").id = "";
+ };
+
+ this.id = "date-picker-hover";
+
+ o.date.setDate(this.firstChild.nodeValue);
+ },
+ onclick: function (e) {
+ if(o.opacity != o.opacityTo) return false;
+ if ( e == null ) e = document.parentWindow.event;
+ var el = e.target != null ? e.target : e.srcElement;
+ while ( el.nodeType != 1 ) el = el.parentNode;
+
+ var d = new Date( o.date );
+ var n = Number( el.firstChild.data );
+
+ if(isNaN(n)) { return true; };
+
+ d.setDate( n );
+ o.date = d;
+
+ o.returnFormattedDate();
+ o.hide();
+ return o.killEvent(e);
+ },
+ incDec:function(e) {
+ if(o.timerSet) {
+ o.stopTimer();
+ };
+
+ datePickerController.addEvent(document, "mouseup", o.events.clearTimer);
+
+ o.timerInc = 1000;
+ o.dayInc = arguments[1];
+ o.yearInc = arguments[2];
+ o.monthInc = arguments[3];
+ o.onTimer();
+ return o.killEvent(e);
+ },
+ clearTimer:function() {
+ o.stopped = true;
+ o.timerInc = 1000;
+ o.yearInc = 0;
+ o.monthInc = 0;
+ o.dayInc = 0;
+ try {
+ datePickerController.removeEvent(document, "mouseup", o.events.clearTimer);
+ } catch(e) { };
+ o.stopTimer();
+ }
+ };
+ o.onTimer = function() {
+ var d = new Date( o.date );
+
+ d.setDate( Math.min(d.getDate()+o.dayInc, datePicker.getDaysPerMonth(d.getMonth()+o.monthInc,d.getFullYear()+o.yearInc)) ); // no need to catch dec -> jan for the year
+ d.setMonth( d.getMonth() + o.monthInc );
+ d.setFullYear( d.getFullYear() + o.yearInc );
+
+ o.date = d;
+
+ if(o.timerInc > 50) {
+ o.timerInc = 50 + Math.round(((o.timerInc - 50) / 1.8));
+ };
+ o.startTimer();
+ o.updateTable();
+ };
+ o.getElem = function() {
+ return document.getElementById(o.id.replace(/^fd-/, '')) || false;
+ };
+ o.setRangeLow = function(range) {
+ if(String(range).search(/^(\d\d?\d\d)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$/) == -1) range = '';
+ o.low = o.defaults.low = range;
+ };
+ o.setRangeHigh = function(range) {
+ if(String(range).search(/^(\d\d?\d\d)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$/) == -1) range = '';
+ o.high = o.defaults.high = range;
+ };
+ o.setDisabledDays = function(dayArray) {
+ o.disableDays = o.defaults.disableDays = dayArray;
+ };
+ o.setFirstDayOfWeek = function(e) {
+ if ( e == null ) e = document.parentWindow.event;
+ var elem = e.target != null ? e.target : e.srcElement;
+
+ if(elem.tagName.toLowerCase() != "th") {
+ while(elem.tagName.toLowerCase() != "th") elem = elem.parentNode;
+ }
+
+ var cnt = 0;
+
+ while(elem.previousSibling) {
+ elem = elem.previousSibling;
+ if(elem.tagName.toLowerCase() == "th") cnt++;
+ }
+
+ o.firstDayOfWeek = (o.firstDayOfWeek + cnt) % 7;
+ o.updateTable();
+
+ return o.killEvent(e);
+ };
+ o.trueBody = function() {
+ return;
+ };
+ o.resize = function() {
+ if(!o.created || !o.getElem()) return;
+
+ o.div.style.visibility = "hidden";
+ o.div.style.display = "block";
+
+ var osh = o.div.offsetHeight;
+ var osw = o.div.offsetWidth;
+
+ o.div.style.visibility = "visible";
+ o.div.style.display = "none";
+
+ var elem = document.getElementById('fd-but-' + o.id);
+ var pos = datePickerController.findPosition(elem);
+ var trueBody = (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;
+
+ if ( parseInt(trueBody.clientWidth+trueBody.scrollLeft) < parseInt(osw+pos[0])) {
+ o.div.style.left = Math.abs(parseInt((trueBody.clientWidth+trueBody.scrollLeft) - osw)) + "px";
+ } else {
+ o.div.style.left = pos[0] + "px";
+ };
+
+ if ( parseInt(trueBody.clientHeight+trueBody.scrollTop) < parseInt(osh+pos[1]+elem.offsetHeight+2)) {
+ o.div.style.top = Math.abs(parseInt(pos[1] - (osh + 2))) + "px";
+ } else {
+ o.div.style.top = Math.abs(parseInt(pos[1] + elem.offsetHeight + 2)) + "px";
+ };
+ };
+ o.equaliseDates = function() {
+ var clearDayFound = false;
+ var tmpDate;
+ for(var i = o.low; i <= o.high; i++) {
+ tmpDate = String(i);
+ if(!o.disableDays[new Date(tmpDate.substr(4,2) + '/' + tmpDate.substr(6,2) + '/' + tmpDate.substr(0,4)).getDay() - 1]) {
+ clearDayFound = true;
+ break;
+ };
+ };
+ if(!clearDayFound) o.disableDays = o.defaults.disableDays = [0,0,0,0,0,0,0];
+ };
+ o.outOfRange = function(tmpDate) {
+ if(!o.low && !o.high) return false;
+
+ var level = false;
+ if(!tmpDate) {
+ level = true;
+ tmpDate = o.date;
+ };
+
+ var d = (tmpDate.getDate() < 10) ? "0" + tmpDate.getDate() : tmpDate.getDate();
+ var m = ((tmpDate.getMonth() + 1) < 10) ? "0" + (tmpDate.getMonth() + 1) : tmpDate.getMonth() + 1;
+ var y = tmpDate.getFullYear();
+ var dt = (y+' '+m+' '+d).replace(/ /g,'');
+
+ if(o.low) {
+ if(parseInt(dt) < parseInt(o.low)) {
+ if(!level) return true;
+ o.date = new Date( o.low.substr(4,2) + '/' + o.low.substr(6,2) + '/' + o.low.substr(0,4) );
+ return false;
+ };
+ };
+ if(o.high) {
+ if(parseInt(dt) > parseInt(o.high)) {
+ if(!level) return true;
+ o.date = new Date( o.high.substr(4,2) + '/' + o.high.substr(6,2) + '/' + o.high.substr(0,4) );
+ };
+ };
+ return false;
+ };
+ o.create = function() {
+
+ /*@cc_on@*/
+ /*@if(@_jscript_version <= 5.6)
+ if(!document.getElementById("iePopUpHack")) {
+ var loc = "./blank.html";
+ var scriptFiles = document.getElementsByTagName('head')[0].getElementsByTagName('script');
+ for(var i = 0, scriptFile; scriptFile = scriptFiles[i]; i++) {
+ if(scriptFile.src && scriptFile.src.match(/datepicker.js$/)) {
+ loc = scriptFile.src.replace("datepicker.js", "blank.html");
+ break;
+ };
+ };
+
+ o.iePopUp = document.createElement('iframe');
+ o.iePopUp.src = loc;
+ o.iePopUp.setAttribute('className','iehack');
+ o.iePopUp.scrolling="no";
+ o.iePopUp.frameBorder="0";
+ o.iePopUp.name = o.iePopUp.id = "iePopUpHack";
+ document.body.appendChild(o.iePopUp);
+ } else {
+ o.iePopUp = document.getElementById("iePopUpHack");
+ };
+ /*@end@*/
+
+ if(typeof(fdLocale) == "object" && o.locale) {
+ datePicker.titles = fdLocale.titles;
+ datePicker.months = fdLocale.months;
+ datePicker.fullDay = fdLocale.fullDay;
+ // Optional parameters
+ if(fdLocale.dayAbbr) datePicker.dayAbbr = fdLocale.dayAbbr;
+ if(fdLocale.firstDayOfWeek) o.firstDayOfWeek = o.defaults.firstDayOfWeek = fdLocale.firstDayOfWeek;
+ };
+
+ o.div = document.createElement('div');
+ o.div.style.zIndex = 9999;
+ o.div.id = "fd-"+o.id;
+ var tableBody = document.createElement('tbody');
+ var tableHead = document.createElement('thead');
+ var nbsp = String.fromCharCode( 160 );
+
+ o.table = document.createElement('table');
+ o.div.className = "datePicker";
+
+ var tr = document.createElement('tr');
+ var th = document.createElement('th');
+
+ // previous year
+ var tmpelem = document.createElement('button');
+ tmpelem.setAttribute("type", "button");
+ tmpelem.className = "prev-but";
+ tmpelem.appendChild(document.createTextNode('\u00AB'));
+ tmpelem.title = datePicker.titles[2];
+ tmpelem.onmousedown = function(e) { this.blur(); o.events.incDec(e,0,-1,0); };
+ tmpelem.onmouseup = o.events.clearTimer;
+ th.appendChild( tmpelem );
+
+ // previous month
+ var tmpelem = document.createElement('button');
+ tmpelem.setAttribute("type", "button");
+ tmpelem.className = "prev-but";
+ tmpelem.appendChild(document.createTextNode("\u2039"));
+ tmpelem.title = datePicker.titles[0];
+ tmpelem.onmousedown = function(e) { this.blur(); o.events.incDec(e,0,0,-1); };
+ tmpelem.onmouseup = o.events.clearTimer;
+ th.appendChild( tmpelem );
+ tr.appendChild( th );
+
+ // title bar
+ o.titleBar = document.createElement('th');
+
+ /*@cc_on
+ /*@if (@_win32)
+ o.titleBar.setAttribute('colSpan','5');
+ @else @*/
+ o.titleBar.setAttribute('colspan','5');
+ /*@end
+ @*/
+
+ o.titleBar.setAttribute('text-align','center');
+ tr.appendChild( o.titleBar );
+
+ th = document.createElement('th');
+
+ // next month
+ var tmpelem = document.createElement('button');
+ tmpelem.setAttribute("type", "button");
+ tmpelem.className = "next-but";
+ tmpelem.appendChild(document.createTextNode('\u203A'));
+ tmpelem.title = datePicker.titles[1];
+ tmpelem.onmousedown = function(e) { this.blur(); o.events.incDec(e,0,0,1); };
+ tmpelem.onmouseup = o.events.clearTimer;
+
+ th.appendChild( tmpelem );
+
+ // next year
+ var tmpelem = document.createElement('button');
+ tmpelem.setAttribute("type", "button");
+ tmpelem.className = "next-but";
+ tmpelem.appendChild(document.createTextNode('\u00BB'));
+ tmpelem.title = datePicker.titles[3];
+ tmpelem.onmousedown = function(e) { this.blur(); o.events.incDec(e,0,1,0); };
+ tmpelem.onmouseup = o.events.clearTimer;
+ th.appendChild( tmpelem );
+
+ tr.appendChild( th );
+
+ tableHead.appendChild(tr);
+
+ var row, col;
+
+ for(var rows = 0; rows < 7; rows++) {
+ row = document.createElement('tr');
+ for(var cols = 0; cols < 7; cols++) {
+ col = (rows == 0) ? document.createElement('th') : document.createElement('td');
+ if(rows != 0) {
+ col.appendChild(document.createTextNode(nbsp));
+ } else {
+ col.className = "date-picker-day-header";
+ col.scope = "col";
+ };
+
+ row.appendChild(col);
+ }
+ if(rows != 0) tableBody.appendChild(row);
+ else tableHead.appendChild(row);
+ };
+ o.table.appendChild( tableHead );
+ o.table.appendChild( tableBody );
+
+ o.div.appendChild( o.table );
+ o.created = true;
+
+ document.getElementsByTagName('body')[0].appendChild( o.div );
+ };
+ o.setDateFromInput = function() {
+ o.dateSet = null;
+
+ var elem = o.getElem();
+ if(!elem) return;
+
+ var date = elem.value;
+
+ var d,m,y,dt,dates;
+
+ d = o.format.replace(/-/g,'').indexOf('d');
+ m = o.format.replace(/-/g,'').indexOf('m');
+ y = o.format.replace(/-/g,'').indexOf('y');
+
+ if(o.splitDate) {
+ dates = [];
+
+ dates[m] = document.getElementById(o.id+'-mm').value;
+ if(dates[m] < 1 || dates[m] > 12) dates[m] = "";
+
+ dates[d] = document.getElementById(o.id+'-dd').value;
+ if(dates[d] < 1 || dates[d] > datePicker.daysPerMonth[dates[m]-1]) dates[d] = "";
+
+ dates[y] = date;
+ } else {
+ if(date.match(/^[0-9]{4}$/)) {
+ if(date > 1600 && date < 2030) {
+ o.date.setFullYear(date);
+ return;
+ };
+ };
+
+ dates = date.split(o.divider);
+
+ if(dates.length != 3) {
+ o.date = new Date();
+ return;
+ };
+ };
+
+ var check = new Date( dates[y] + "/" + dates[m] + "/" + dates[d] );
+ if(check == 'Invalid Date' /*@cc_on@*/ /*@if(@_win32) || check == 'NaN' /*@end@*/) {
+ o.date = new Date();
+ return;
+ };
+
+ o.date.setMonth(dates[m]-1);
+ o.date.setFullYear(dates[y]);
+ o.date.setDate(dates[d]);
+
+ o.dateSet = new Date(o.date);
+ };
+ o.returnFormattedDate = function() {
+ var elem = o.getElem();
+ if(!elem) return;
+
+ var d = (o.date.getDate() < 10) ? "0" + o.date.getDate() : o.date.getDate();
+ var m = ((o.date.getMonth() + 1) < 10) ? "0" + (o.date.getMonth() + 1) : o.date.getMonth() + 1;
+ var yyyy = o.date.getFullYear();
+
+ var weekDay = ( o.date.getDay() + 6 ) % 7;
+
+ if(!(o.disableDays[weekDay])) {
+ if(o.splitDate) {
+ document.getElementById(o.id+"-dd").value = d;
+ document.getElementById(o.id+"-mm").value = m;
+ elem.value = yyyy;
+
+ document.getElementById(o.id+"-dd").focus();
+ if(document.getElementById(o.id+"-dd").onchange) document.getElementById(o.id+"-dd").onchange();
+ if(document.getElementById(o.id+"-mm").onchange) document.getElementById(o.id+"-mm").onchange();
+ } else {
+ elem.value = o.format.replace('y',yyyy).replace('m',m).replace('d',d).replace(/-/g,o.divider);
+ elem.focus();
+ };
+ if(elem.onchange) elem.onchange();
+ };
+ };
+ // Credit where credit's due:
+
+ // Most of the logic for this method from the webfx date-picker
+ // http://webfx.eae.net/
+
+ o.updateTable = function() {
+
+ if(document.getElementById("date-picker-hover")) {
+ document.getElementById("date-picker-hover").id = "";
+ };
+
+ var i;
+ var str = "";
+ var rows = 6;
+ var cols = 7;
+ var currentWeek = 0;
+ var nbsp = String.fromCharCode( 160 );
+
+ var cells = new Array( rows );
+
+ for ( i = 0; i < rows; i++ ) {
+ cells[i] = new Array( cols );
+ };
+
+ o.outOfRange();
+
+ // Set the tmpDate to this month
+ var tmpDate = new Date( o.date.getFullYear(), o.date.getMonth(), 1 );
+ var today = new Date();
+
+ // titleBar
+ var titleText = datePicker.months[o.date.getMonth()] + nbsp + o.date.getFullYear();
+ while(o.titleBar.firstChild) o.titleBar.removeChild(o.titleBar.firstChild);
+ o.titleBar.appendChild(document.createTextNode(titleText));
+
+ for ( i = 1; i < 32; i++ ) {
+
+ tmpDate.setDate( i );
+ var weekDay = ( tmpDate.getDay() + 6 ) % 7;
+ var colIndex = ( (weekDay - o.firstDayOfWeek) + 7 ) % 7;
+ var cell = { text:"", className:"", id:"" };
+
+ if ( tmpDate.getMonth() == o.date.getMonth() ) {
+
+ cells[currentWeek][colIndex] = { text:"", className:"", id:"" };
+
+ var isToday = tmpDate.getDate() == today.getDate() &&
+ tmpDate.getMonth() == today.getMonth() &&
+ tmpDate.getFullYear() == today.getFullYear();
+
+ if ( o.dateSet != null && o.dateSet.getDate() == tmpDate.getDate() && o.dateSet.getMonth() == tmpDate.getMonth() && o.dateSet.getFullYear() == tmpDate.getFullYear()) {
+ cells[currentWeek][colIndex].className = "date-picker-selected-date";
+ };
+ if ( o.date.getDate() == tmpDate.getDate() && o.date.getFullYear() == tmpDate.getFullYear()) {
+ cells[currentWeek][colIndex].id = "date-picker-hover";
+ };
+
+ if(o.highlightDays[weekDay]) {
+ cells[currentWeek][colIndex].className += " date-picker-highlight";
+ };
+ if ( isToday ) {
+ cells[currentWeek][colIndex].className = "date-picker-today";
+ };
+ if(o.outOfRange(tmpDate)) {
+ cells[currentWeek][colIndex].className = "out-of-range";
+ } else if(o.disableDays[weekDay]) {
+ cells[currentWeek][colIndex].className = "day-disabled";
+ };
+ cells[currentWeek][colIndex].text = tmpDate.getDate();
+ if ( colIndex == 6 ) currentWeek++;
+ };
+ };
+
+ // Table headers
+ var lnk, d;
+ var ths = o.table.getElementsByTagName('thead')[0].getElementsByTagName('tr')[1].getElementsByTagName('th');
+ for ( var y = 0; y < 7; y++ ) {
+ d = (o.firstDayOfWeek + y) % 7;
+
+ while(ths[y].firstChild) ths[y].removeChild(ths[y].firstChild);
+
+ ths[y].title = datePicker.fullDay[d];
+
+ // Don't create a button for the first day header
+ if(y > 0) {
+ but = document.createElement("BUTTON");
+ but.className = "fd-day-header";
+ but.onclick = but.onkeypress = ths[y].onclick = o.setFirstDayOfWeek;
+ but.appendChild(document.createTextNode(datePicker.dayAbbr ? datePicker.dayAbbr[d] : datePicker.fullDay[d].charAt(0)));
+ ths[y].appendChild(but);
+ but.title = datePicker.fullDay[d];
+ } else {
+ ths[y].appendChild(document.createTextNode(datePicker.dayAbbr ? datePicker.dayAbbr[d] : datePicker.fullDay[d].charAt(0)));
+ ths[y].onclick = null;
+ };
+ };
+
+
+ var trs = o.table.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
+
+ var tmpCell;
+
+ for ( var y = 0; y < rows; y++ ) {
+ var tds = trs[y].getElementsByTagName('td');
+ for (var x = 0; x < cols; x++) {
+ tmpCell = tds[x];
+
+ while(tmpCell.firstChild) tmpCell.removeChild(tmpCell.firstChild);
+
+ if ( typeof cells[y][x] != "undefined" ) {
+ tmpCell.className = cells[y][x].className;
+ tmpCell.id = cells[y][x].id;
+
+ tmpCell.appendChild(document.createTextNode(cells[y][x].text));
+
+ if(cells[y][x].className != "out-of-range") {
+ tmpCell.onmouseover = o.events.onmouseover;
+ tmpCell.onclick = cells[y][x].className == "day-disabled" ? o.killEvent : o.events.onclick;
+ tmpCell.title = datePicker.months[o.date.getMonth()] + nbsp + cells[y][x].text + "," + nbsp + o.date.getFullYear();
+ } else {
+ tmpCell.onmouseover = null;
+ tmpCell.onclick = o.killEvent;
+ tmpCell.title = "";
+ };
+ } else {
+ tmpCell.className = "";
+ tmpCell.id = "";
+ tmpCell.onmouseover = null;
+ tmpCell.onclick = function(e) { return o.killEvent(e); };
+ tmpCell.appendChild(document.createTextNode(nbsp));
+ tmpCell.title = "";
+ };
+ };
+ };
+ };
+ o.init = function() {
+ if(o.low && o.high && (o.high - o.low < 7)) {
+ o.equaliseDates();
+ };
+ o.resize();
+ o.setDateFromInput();
+ o.fade();
+ o.ieHack(true);
+ };
+ o.ieHack = function(cleanup) {
+ // IE hack
+ if(o.iePopUp) {
+ o.iePopUp.style.display = "block";
+ o.iePopUp.style.top = (o.div.offsetTop + 2) + "px";
+ o.iePopUp.style.left = o.div.offsetLeft + "px";
+ o.iePopUp.style.width = o.div.clientWidth + "px";
+ o.iePopUp.style.height = (o.div.clientHeight - 2) + "px";
+ if(cleanup) o.iePopUp.style.display = "none";
+ }
+ };
+ o.show = function() {
+ var elem = o.getElem();
+ if(!elem || o.visible || elem.disabled) return;
+
+ o.reset();
+ o.setDateFromInput();
+ o.updateTable();
+ o.resize();
+ o.ieHack(false);
+
+ datePickerController.addEvent(document, "mousedown", o.events.onmousedown);
+ datePickerController.addEvent(document, "keypress", o.events.onkeydown);
+
+ // Internet Explorer requires the keydown event in order to catch arrow keys
+
+ /*@cc_on@*/
+ /*@if(@_win32)
+ datePickerController.removeEvent(document, "keypress", o.events.onkeydown);
+ datePickerController.addEvent(document, "keydown", o.events.onkeydown);
+ /*@end@*/
+
+ o.opacityTo = 90;
+ o.div.style.display = "block";
+ o.ieHack(false);
+ o.fade();
+ o.visible = true;
+
+ };
+ o.hide = function() {
+ try {
+ datePickerController.removeEvent(document, "mousedown", o.events.onmousedown);
+ datePickerController.removeEvent(document, "keypress", o.events.onkeydown);
+ datePickerController.removeEvent(document, "keydown", o.events.onkeydown);
+ } catch(e) {
+
+ };
+ if(o.iePopUp) {
+ o.iePopUp.style.display = "none";
+ };
+ o.opacityTo = 0;
+ o.fade();
+ o.visible = false;
+ };
+ o.create();
+ o.init();
+};
+
+datePickerController = {
+ datePickers: {},
+ addEvent: function(obj, type, fn, tmp) {
+ tmp || (tmp = true);
+ if( obj.attachEvent ) {
+ obj["e"+type+fn] = fn;
+ obj[type+fn] = function(){obj["e"+type+fn]( window.event );};
+ obj.attachEvent( "on"+type, obj[type+fn] );
+ } else {
+ obj.addEventListener( type, fn, true );
+ };
+ },
+ removeEvent: function(obj, type, fn, tmp) {
+ tmp || (tmp = true);
+ if( obj.detachEvent ) {
+ obj.detachEvent( "on"+type, obj[type+fn] );
+ obj[type+fn] = null;
+ } else {
+ obj.removeEventListener( type, fn, true );
+ };
+ },
+ findPosition: function(obj) {
+ var curleft = 0;
+ var curtop = 0;
+ var orig = obj;
+
+ if(obj.offsetParent) {
+ while(obj.offsetParent) {
+ curleft += obj.offsetLeft;
+ curtop += obj.offsetTop;
+ obj = obj.offsetParent;
+ };
+ } else if (obj.x) {
+ curleft += obj.x;
+ curtop += obj.y;
+ };
+ return [ curleft, curtop ];
+ },
+ hideAll: function(exception) {
+ for(dp in datePickerController.datePickers) {
+ if(exception && exception == datePickerController.datePickers[dp].id) continue;
+ datePickerController.datePickers[dp].hide();
+ };
+ },
+ cleanUp: function() {
+ var dp;
+ for(dp in datePickerController.datePickers) {
+ if(!document.getElementById(datePickerController.datePickers[dp].id)) {
+ dpElem = document.getElementById("fd-"+datePickerController.datePickers[dp].id);
+ if(dpElem) {
+ dpElem.parentNode.removeChild(dpElem);
+ };
+ datePickerController.datePickers[dp] = null;
+ delete datePickerController.datePickers[dp];
+ };
+ };
+ },
+ dateFormat: function(dateIn, favourMDY) {
+ var dateTest = [
+ { regExp:/^(0[1-9]|[12][0-9]|3[01])([- \/.])(0[1-9]|1[012])([- \/.])(\d\d?\d\d)$/, d:1, m:3, y:5 }, // dmy
+ { regExp:/^(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])([- \/.])(\d\d?\d\d)$/, d:3, m:1, y:5 }, // mdy
+ { regExp:/^(\d\d?\d\d)([- \/.])(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])$/, d:5, m:3, y:1 } // ymd
+ ];
+
+ var start;
+ var cnt = 0;
+
+ while(cnt < 3) {
+ start = (cnt + (favourMDY ? 4 : 3)) % 3;
+
+ if(dateIn.match(dateTest[start].regExp)) {
+ res = dateIn.match(dateTest[start].regExp);
+ y = res[dateTest[start].y];
+ m = res[dateTest[start].m];
+ d = res[dateTest[start].d];
+ if(m.length == 1) m = "0" + m;
+ if(d.length == 1) d = "0" + d;
+ if(y.length != 4) y = (parseInt(y) < 50) ? '20' + y : '19' + y;
+
+ return y+m+d;
+ };
+
+ cnt++;
+ };
+
+ return 0;
+ },
+ create: function() {
+ if(!datePicker.isSupported) return;
+
+ datePickerController.cleanUp();
+
+ var inputs = document.getElementsByTagName('input');
+
+ var regExp1 = /disable-days-([1-7]){1,6}/g; // the days to disable
+ var regExp3 = /highlight-days-([1-7]){1,7}/g; // the days to highlight in red
+ var regExp4 = /range-low-([0-9\-]){10}/g; // the lowest selectable date
+ var regExp5 = /range-high-([0-9\-]){10}/g; // the highest selectable date
+ var regExp6 = /format-([dmy\-]{5})/g; // the input/output date format
+ var regExp7 = /divider-(dot|slash|space|dash)/g; // the character used to divide the date
+ var regExp8 = /no-locale/g; // do not attempt to detect the browser language
+
+ for(var i=0, inp; inp = inputs[i]; i++) {
+ if(inp.className && (inp.className.search(regExp6) != -1 || inp.className.search(/split-date/) != -1) && inp.type == "text" && inp.name) {
+
+ if(!inp.id) {
+ // Internet explorer requires you to give each input a unique ID attribute.
+ if(document.getElementById(inp.name)) continue;
+ inp.id = inp.name;
+ };
+
+ var options = {
+ id:inp.id,
+ low:"",
+ high:"",
+ divider:"/",
+ format:"d-m-y",
+ highlightDays:[0,0,0,0,0,1,1],
+ disableDays:[0,0,0,0,0,0,0],
+ locale:inp.className.search(regExp8) == -1,
+ splitDate:0
+ };
+
+ // Split the date into three parts ?
+ if(inp.className.search(/split-date/) != -1) {
+ if(document.getElementById(inp.id+'-dd') && document.getElementById(inp.id+'-mm') && document.getElementById(inp.id+'-dd').tagName.toLowerCase() == "input" && document.getElementById(inp.id+'-mm').tagName.toLowerCase() == "input") {
+ options.splitDate = 1;
+ };
+ };
+
+ // Date format(variations of d-m-y)
+ if(inp.className.search(regExp6) != -1) {
+ options.format = inp.className.match(regExp6)[0].replace('format-','');
+ };
+
+ // What divider to use, a "/", "-", "." or " "
+ if(inp.className.search(regExp7) != -1) {
+ var divider = inp.className.match(regExp7)[0].replace('divider-','');
+ switch(divider.toLowerCase()) {
+ case "dot":
+ options.divider = ".";
+ break;
+ case "space":
+ options.divider = " ";
+ break;
+ case "dash":
+ options.divider = "-";
+ break;
+ default:
+ options.divider = "/";
+ };
+ };
+
+ // The days to highlight
+ if(inp.className.search(regExp3) != -1) {
+ var tmp = inp.className.match(regExp3)[0].replace(/highlight-days-/, '');
+ options.highlightDays = [0,0,0,0,0,0,0];
+ for(var j = 0; j < tmp.length; j++) {
+ options.highlightDays[tmp.charAt(j) - 1] = 1;
+ };
+ };
+
+ // The days to disable
+ if(inp.className.search(regExp1) != -1) {
+ var tmp = inp.className.match(regExp1)[0].replace(/disable-days-/, '');
+ options.disableDays = [0,0,0,0,0,0,0];
+ for(var j = 0; j < tmp.length; j++) {
+ options.disableDays[tmp.charAt(j) - 1] = 1;
+ };
+ };
+
+ // The lower limit
+ if(inp.className.search(regExp4) != -1) {
+ options.low = datePickerController.dateFormat(inp.className.match(regExp4)[0].replace(/range-low-/, ''), options.format.charAt(0) == "m");
+ if(options.low == 0) {
+ options.low = '';
+ };
+ };
+
+ // The higher limit
+ if(inp.className.search(regExp5) != -1) {
+ options.high = datePickerController.dateFormat(inp.className.match(regExp5)[0].replace(/range-high-/, ''), options.format.charAt(0) == "m");
+ if(options.high == 0) {
+ options.high = '';
+ };
+ };
+
+ // Datepicker is already created so reset it's defaults
+ if(document.getElementById('fd-'+inp.id)) {
+ for(var opt in options) {
+ datePickerController.datePickers[inp.id].defaults[opt] = options[opt];
+ };
+ };
+
+ // Create the button (if needs be)
+ if(!document.getElementById("fd-but-" + inp.id)) {
+ var but = document.createElement('button');
+ but.setAttribute("type", "button");
+ but.className = "date-picker-control";
+
+ but.id = "fd-but-" + inp.id;
+ but.appendChild(document.createTextNode(String.fromCharCode( 160 )));
+
+ if(inp.nextSibling) {
+ inp.parentNode.insertBefore(but, inp.nextSibling);
+ } else {
+ inp.parentNode.appendChild(but);
+ };
+
+ } else {
+ var but = document.getElementById("fd-but-" + inp.id);
+ };
+
+ // Add button events
+ but.onclick = but.onpress = function() {
+ var inpId = this.id.replace('fd-but-','');
+
+ datePickerController.hideAll(inpId);
+ if(inpId in datePickerController.datePickers && !datePickerController.datePickers[inpId].visible) {
+ datePickerController.datePickers[inpId].show();
+ };
+ return false;
+ };
+
+ // Create the datePicker (if needs be)
+ if(!document.getElementById('fd-'+inp.id)) {
+ datePickerController.datePickers[inp.id] = new datePicker(options);
+ };
+ };
+ };
+ }
+
+};
+
+
+})();
+
+datePickerController.addEvent(window, 'load', datePickerController.create);
+
diff --git a/src/usr/local/www/javascript/datepicker/media/bg_header.jpg b/src/usr/local/www/javascript/datepicker/media/bg_header.jpg
new file mode 100755
index 0000000..10dbd74
--- /dev/null
+++ b/src/usr/local/www/javascript/datepicker/media/bg_header.jpg
Binary files differ
diff --git a/src/usr/local/www/javascript/datepicker/media/bullet1.gif b/src/usr/local/www/javascript/datepicker/media/bullet1.gif
new file mode 100755
index 0000000..ae352c2
--- /dev/null
+++ b/src/usr/local/www/javascript/datepicker/media/bullet1.gif
Binary files differ
diff --git a/src/usr/local/www/javascript/datepicker/media/bullet2.gif b/src/usr/local/www/javascript/datepicker/media/bullet2.gif
new file mode 100755
index 0000000..04b293d
--- /dev/null
+++ b/src/usr/local/www/javascript/datepicker/media/bullet2.gif
Binary files differ
diff --git a/src/usr/local/www/javascript/datepicker/media/cal.gif b/src/usr/local/www/javascript/datepicker/media/cal.gif
new file mode 100755
index 0000000..8526cf5
--- /dev/null
+++ b/src/usr/local/www/javascript/datepicker/media/cal.gif
Binary files differ
diff --git a/src/usr/local/www/javascript/datepicker/media/gradient-e5e5e5-ffffff.gif b/src/usr/local/www/javascript/datepicker/media/gradient-e5e5e5-ffffff.gif
new file mode 100755
index 0000000..72a0d3e
--- /dev/null
+++ b/src/usr/local/www/javascript/datepicker/media/gradient-e5e5e5-ffffff.gif
Binary files differ
diff --git a/src/usr/local/www/javascript/domTT/LICENSE b/src/usr/local/www/javascript/domTT/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/src/usr/local/www/javascript/domTT/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/src/usr/local/www/javascript/domTT/behaviour.js b/src/usr/local/www/javascript/domTT/behaviour.js
new file mode 100644
index 0000000..21b28d7
--- /dev/null
+++ b/src/usr/local/www/javascript/domTT/behaviour.js
@@ -0,0 +1,254 @@
+/*
+ Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
+ of Simon Willison (see comments by Simon below).
+
+ Description:
+
+ Uses css selectors to apply javascript behaviours to enable
+ unobtrusive javascript in html documents.
+
+ Usage:
+
+ var myrules = {
+ 'b.someclass' : function(element){
+ element.onclick = function(){
+ alert(this.innerHTML);
+ }
+ },
+ '#someid u' : function(element){
+ element.onmouseover = function(){
+ this.innerHTML = "BLAH!";
+ }
+ }
+ };
+
+ Behaviour.register(myrules);
+
+ // Call Behaviour.apply() to re-apply the rules (if you
+ // update the dom, etc).
+
+ License:
+
+ This file is entirely BSD licensed.
+
+ More information:
+
+ http://ripcord.co.nz/behaviour/
+
+*/
+
+var Behaviour = {
+ list : new Array,
+
+ register : function(sheet){
+ Behaviour.list.push(sheet);
+ },
+
+ start : function(){
+ Behaviour.addLoadEvent(function(){
+ Behaviour.apply();
+ });
+ },
+
+ apply : function(){
+ for (h=0;sheet=Behaviour.list[h];h++){
+ for (selector in sheet){
+ list = document.getElementsBySelector(selector);
+
+ if (!list){
+ continue;
+ }
+
+ for (i=0;element=list[i];i++){
+ sheet[selector](element);
+ }
+ }
+ }
+ },
+
+ addLoadEvent : function(func){
+ var oldonload = window.onload;
+
+ if (typeof window.onload != 'function') {
+ window.onload = func;
+ } else {
+ window.onload = function() {
+ oldonload();
+ func();
+ };
+ }
+ }
+};
+
+Behaviour.start();
+
+/*
+ The following code is Copyright (C) Simon Willison 2004.
+
+ document.getElementsBySelector(selector)
+ - returns an array of element objects from the current document
+ matching the CSS selector. Selectors can contain element names,
+ class names and ids and can be nested. For example:
+
+ elements = document.getElementsBySelect('div#main p a.external')
+
+ Will return an array of all 'a' elements with 'external' in their
+ class attribute that are contained inside 'p' elements that are
+ contained inside the 'div' element which has id="main"
+
+ New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
+ See http://www.w3.org/TR/css3-selectors/#attribute-selectors
+
+ Version 0.4 - Simon Willison, March 25th 2003
+ -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows
+ -- Opera 7 fails
+*/
+
+function getAllChildren(e) {
+ // Returns all children of element. Workaround required for IE5/Windows. Ugh.
+ return e.all ? e.all : e.getElementsByTagName('*');
+}
+
+document.getElementsBySelector = function(selector) {
+ // Attempt to fail gracefully in lesser browsers
+ if (!document.getElementsByTagName) {
+ return new Array();
+ }
+ // Split selector in to tokens
+ var tokens = selector.split(' ');
+ var currentContext = new Array(document);
+ for (var i = 0; i < tokens.length; i++) {
+ token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
+ if (token.indexOf('#') > -1) {
+ // Token is an ID selector
+ var bits = token.split('#');
+ var tagName = bits[0];
+ var id = bits[1];
+ var element = document.getElementById(id);
+ if (tagName && element.nodeName.toLowerCase() != tagName) {
+ // tag with that ID not found, return false
+ return new Array();
+ }
+ // Set currentContext to contain just this element
+ currentContext = new Array(element);
+ continue; // Skip to next token
+ }
+ if (token.indexOf('.') > -1) {
+ // Token contains a class selector
+ var bits = token.split('.');
+ var tagName = bits[0];
+ var className = bits[1];
+ if (!tagName) {
+ tagName = '*';
+ }
+ // Get elements matching tag, filter them for class selector
+ var found = new Array;
+ var foundCount = 0;
+ for (var h = 0; h < currentContext.length; h++) {
+ var elements;
+ if (tagName == '*') {
+ elements = getAllChildren(currentContext[h]);
+ } else {
+ elements = currentContext[h].getElementsByTagName(tagName);
+ }
+ for (var j = 0; j < elements.length; j++) {
+ found[foundCount++] = elements[j];
+ }
+ }
+ currentContext = new Array;
+ var currentContextIndex = 0;
+ for (var k = 0; k < found.length; k++) {
+ if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
+ currentContext[currentContextIndex++] = found[k];
+ }
+ }
+ continue; // Skip to next token
+ }
+ // Code to deal with attribute selectors
+ if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
+ var tagName = RegExp.$1;
+ var attrName = RegExp.$2;
+ var attrOperator = RegExp.$3;
+ var attrValue = RegExp.$4;
+ if (!tagName) {
+ tagName = '*';
+ }
+ // Grab all of the tagName elements within current context
+ var found = new Array;
+ var foundCount = 0;
+ for (var h = 0; h < currentContext.length; h++) {
+ var elements;
+ if (tagName == '*') {
+ elements = getAllChildren(currentContext[h]);
+ } else {
+ elements = currentContext[h].getElementsByTagName(tagName);
+ }
+ for (var j = 0; j < elements.length; j++) {
+ found[foundCount++] = elements[j];
+ }
+ }
+ currentContext = new Array;
+ var currentContextIndex = 0;
+ var checkFunction; // This function will be used to filter the elements
+ switch (attrOperator) {
+ case '=': // Equality
+ checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
+ break;
+ case '~': // Match one of space separated words
+ checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
+ break;
+ case '|': // Match start with value followed by optional hyphen
+ checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
+ break;
+ case '^': // Match starts with value
+ checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
+ break;
+ case '$': // Match ends with value - fails with "Warning" in Opera 7
+ checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
+ break;
+ case '*': // Match ends with value
+ checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
+ break;
+ default :
+ // Just test for existence of attribute
+ checkFunction = function(e) { return e.getAttribute(attrName); };
+ }
+ currentContext = new Array;
+ var currentContextIndex = 0;
+ for (var k = 0; k < found.length; k++) {
+ if (checkFunction(found[k])) {
+ currentContext[currentContextIndex++] = found[k];
+ }
+ }
+ // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
+ continue; // Skip to next token
+ }
+
+ if (!currentContext[0]){
+ return;
+ }
+
+ // If we get here, token is JUST an element (not a class or ID selector)
+ tagName = token;
+ var found = new Array;
+ var foundCount = 0;
+ for (var h = 0; h < currentContext.length; h++) {
+ var elements = currentContext[h].getElementsByTagName(tagName);
+ for (var j = 0; j < elements.length; j++) {
+ found[foundCount++] = elements[j];
+ }
+ }
+ currentContext = found;
+ }
+ return currentContext;
+}
+
+/* That revolting regular expression explained
+/^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/
+ \---/ \---/\-------------/ \-------/
+ | | | |
+ | | | The value
+ | | ~,|,^,$,* or =
+ | Attribute
+ Tag
+*/
diff --git a/src/usr/local/www/javascript/domTT/domLib.js b/src/usr/local/www/javascript/domTT/domLib.js
new file mode 100644
index 0000000..9a51a34
--- /dev/null
+++ b/src/usr/local/www/javascript/domTT/domLib.js
@@ -0,0 +1,706 @@
+/** $Id: domLib.js 2321 2006-06-12 06:45:41Z dallen $ */
+// {{{ license
+
+/*
+ * Copyright 2002-2005 Dan Allen, Mojavelinux.com (dan.allen@mojavelinux.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// }}}
+// {{{ intro
+
+/**
+ * Title: DOM Library Core
+ * Version: 0.70
+ *
+ * Summary:
+ * A set of commonly used functions that make it easier to create javascript
+ * applications that rely on the DOM.
+ *
+ * Updated: 2005/05/17
+ *
+ * Maintainer: Dan Allen <dan.allen@mojavelinux.com>
+ * Maintainer: Jason Rust <jrust@rustyparts.com>
+ *
+ * License: Apache 2.0
+ */
+
+// }}}
+// {{{ global constants (DO NOT EDIT)
+
+// -- Browser Detection --
+var domLib_userAgent = navigator.userAgent.toLowerCase();
+var domLib_isMac = navigator.appVersion.indexOf('Mac') != -1;
+var domLib_isWin = domLib_userAgent.indexOf('windows') != -1;
+// NOTE: could use window.opera for detecting Opera
+var domLib_isOpera = domLib_userAgent.indexOf('opera') != -1;
+var domLib_isOpera7up = domLib_userAgent.match(/opera.(7|8)/i);
+var domLib_isSafari = domLib_userAgent.indexOf('safari') != -1;
+var domLib_isKonq = domLib_userAgent.indexOf('konqueror') != -1;
+// Both konqueror and safari use the khtml rendering engine
+var domLib_isKHTML = (domLib_isKonq || domLib_isSafari || domLib_userAgent.indexOf('khtml') != -1);
+var domLib_isIE = (!domLib_isKHTML && !domLib_isOpera && (domLib_userAgent.indexOf('msie 5') != -1 || domLib_userAgent.indexOf('msie 6') != -1 || domLib_userAgent.indexOf('msie 7') != -1 || domLib_userAgent.indexOf('msie 8') != -1));
+var domLib_isIE5up = domLib_isIE;
+var domLib_isIE50 = (domLib_isIE && domLib_userAgent.indexOf('msie 5.0') != -1);
+var domLib_isIE55 = (domLib_isIE && domLib_userAgent.indexOf('msie 5.5') != -1);
+var domLib_isIE5 = (domLib_isIE50 || domLib_isIE55);
+// safari and konq may use string "khtml, like gecko", so check for destinctive /
+var domLib_isGecko = domLib_userAgent.indexOf('gecko/') != -1;
+var domLib_isMacIE = (domLib_isIE && domLib_isMac);
+var domLib_isIE55up = domLib_isIE5up && !domLib_isIE50 && !domLib_isMacIE;
+var domLib_isIE6up = domLib_isIE55up && !domLib_isIE55;
+
+// -- Browser Abilities --
+var domLib_standardsMode = (document.compatMode && document.compatMode == 'CSS1Compat');
+var domLib_useLibrary = (domLib_isOpera7up || domLib_isKHTML || domLib_isIE5up || domLib_isGecko || domLib_isMacIE || document.defaultView);
+// fixed in Konq3.2
+var domLib_hasBrokenTimeout = (domLib_isMacIE || (domLib_isKonq && domLib_userAgent.match(/konqueror\/3.([2-9])/) == null));
+var domLib_canFade = (domLib_isGecko || domLib_isIE || domLib_isSafari || domLib_isOpera);
+var domLib_canDrawOverSelect = (domLib_isMac || domLib_isOpera || domLib_isGecko);
+var domLib_canDrawOverFlash = (domLib_isMac || domLib_isWin);
+
+// -- Event Variables --
+var domLib_eventTarget = domLib_isIE ? 'srcElement' : 'currentTarget';
+var domLib_eventButton = domLib_isIE ? 'button' : 'which';
+var domLib_eventTo = domLib_isIE ? 'toElement' : 'relatedTarget';
+var domLib_stylePointer = domLib_isIE ? 'hand' : 'pointer';
+// NOTE: a bug exists in Opera that prevents maxWidth from being set to 'none', so we make it huge
+var domLib_styleNoMaxWidth = domLib_isOpera ? '10000px' : 'none';
+var domLib_hidePosition = '-1000px';
+var domLib_scrollbarWidth = 14;
+var domLib_autoId = 1;
+var domLib_zIndex = 1010;
+
+// -- Detection --
+var domLib_collisionElements;
+var domLib_collisionsCached = false;
+
+var domLib_timeoutStateId = 0;
+var domLib_timeoutStates = new domTT_Hash();
+
+// }}}
+// {{{ DOM enhancements
+
+if (!document.ELEMENT_NODE)
+{
+ document.ELEMENT_NODE = 1;
+ document.ATTRIBUTE_NODE = 2;
+ document.TEXT_NODE = 3;
+ document.DOCUMENT_NODE = 9;
+ document.DOCUMENT_FRAGMENT_NODE = 11;
+}
+
+function domLib_clone(obj)
+{
+ var copy = {};
+ for (var i in obj)
+ {
+ var value = obj[i];
+ try
+ {
+ if (value != null && typeof(value) == 'object' && value != window && !value.nodeType)
+ {
+ copy[i] = domLib_clone(value);
+ }
+ else
+ {
+ copy[i] = value;
+ }
+ }
+ catch(e)
+ {
+ copy[i] = value;
+ }
+ }
+
+ return copy;
+}
+
+// }}}
+// {{{ class domTT_Hash()
+
+function domTT_Hash()
+{
+ this.length = 0;
+ this.numericLength = 0;
+ this.elementData = [];
+ for (var i = 0; i < arguments.length; i += 2)
+ {
+ if (typeof(arguments[i + 1]) != 'undefined')
+ {
+ this.elementData[arguments[i]] = arguments[i + 1];
+ this.length++;
+ if (arguments[i] == parseInt(arguments[i]))
+ {
+ this.numericLength++;
+ }
+ }
+ }
+}
+
+// using prototype as opposed to inner functions saves on memory
+domTT_Hash.prototype.get = function(in_key)
+{
+ if (typeof(this.elementData[in_key]) != 'undefined') {
+ return this.elementData[in_key];
+ }
+
+ return null;
+};
+
+domTT_Hash.prototype.set = function(in_key, in_value)
+{
+ if (typeof(in_value) != 'undefined')
+ {
+ if (typeof(this.elementData[in_key]) == 'undefined')
+ {
+ this.length++;
+ if (in_key == parseInt(in_key))
+ {
+ this.numericLength++;
+ }
+ }
+
+ return this.elementData[in_key] = in_value;
+ }
+
+ return false;
+};
+
+domTT_Hash.prototype.remove = function(in_key)
+{
+ var tmp_value;
+ if (typeof(this.elementData[in_key]) != 'undefined')
+ {
+ this.length--;
+ if (in_key == parseInt(in_key))
+ {
+ this.numericLength--;
+ }
+
+ tmp_value = this.elementData[in_key];
+ delete this.elementData[in_key];
+ }
+
+ return tmp_value;
+};
+
+domTT_Hash.prototype.size = function()
+{
+ return this.length;
+};
+
+domTT_Hash.prototype.has = function(in_key)
+{
+ return typeof(this.elementData[in_key]) != 'undefined';
+};
+
+domTT_Hash.prototype.find = function(in_obj)
+{
+ for (var tmp_key in this.elementData)
+ {
+ if (this.elementData[tmp_key] == in_obj)
+ {
+ return tmp_key;
+ }
+ }
+
+ return null;
+};
+
+domTT_Hash.prototype.merge = function(in_hash)
+{
+ for (var tmp_key in in_hash.elementData)
+ {
+ if (typeof(this.elementData[tmp_key]) == 'undefined')
+ {
+ this.length++;
+ if (tmp_key == parseInt(tmp_key))
+ {
+ this.numericLength++;
+ }
+ }
+
+ this.elementData[tmp_key] = in_hash.elementData[tmp_key];
+ }
+};
+
+domTT_Hash.prototype.compare = function(in_hash)
+{
+ if (this.length != in_hash.length)
+ {
+ return false;
+ }
+
+ for (var tmp_key in this.elementData)
+ {
+ if (this.elementData[tmp_key] != in_hash.elementData[tmp_key])
+ {
+ return false;
+ }
+ }
+
+ return true;
+};
+
+// }}}
+// {{{ domLib_isDescendantOf()
+
+function domLib_isDescendantOf(in_object, in_ancestor, in_bannedTags)
+{
+ if (in_object == null)
+ {
+ return false;
+ }
+
+ if (in_object == in_ancestor)
+ {
+ return true;
+ }
+
+ if (typeof(in_bannedTags) != 'undefined' &&
+ (',' + in_bannedTags.join(',') + ',').indexOf(',' + in_object.tagName + ',') != -1)
+ {
+ return false;
+ }
+
+ while (in_object != document.documentElement)
+ {
+ try
+ {
+ if ((tmp_object = in_object.offsetParent) && tmp_object == in_ancestor)
+ {
+ return true;
+ }
+ else if ((tmp_object = in_object.parentNode) == in_ancestor)
+ {
+ return true;
+ }
+ else
+ {
+ in_object = tmp_object;
+ }
+ }
+ // in case we get some wierd error, assume we left the building
+ catch(e)
+ {
+ return false;
+ }
+ }
+
+ return false;
+}
+
+// }}}
+// {{{ domLib_detectCollisions()
+
+/**
+ * For any given target element, determine if elements on the page
+ * are colliding with it that do not obey the rules of z-index.
+ */
+function domLib_detectCollisions(in_object, in_recover, in_useCache)
+{
+ // the reason for the cache is that if the root menu is built before
+ // the page is done loading, then it might not find all the elements.
+ // so really the only time you don't use cache is when building the
+ // menu as part of the page load
+ if (!domLib_collisionsCached)
+ {
+ var tags = [];
+
+ if (!domLib_canDrawOverFlash)
+ {
+ tags[tags.length] = 'object';
+ }
+
+ if (!domLib_canDrawOverSelect)
+ {
+ tags[tags.length] = 'select';
+ }
+
+ domLib_collisionElements = domLib_getElementsByTagNames(tags, true);
+ domLib_collisionsCached = in_useCache;
+ }
+
+ // if we don't have a tip, then unhide selects
+ if (in_recover)
+ {
+ for (var cnt = 0; cnt < domLib_collisionElements.length; cnt++)
+ {
+ var thisElement = domLib_collisionElements[cnt];
+
+ if (!thisElement.hideList)
+ {
+ thisElement.hideList = new domTT_Hash();
+ }
+
+ thisElement.hideList.remove(in_object.id);
+ if (!thisElement.hideList.length)
+ {
+ domLib_collisionElements[cnt].style.visibility = 'visible';
+ if (domLib_isKonq)
+ {
+ domLib_collisionElements[cnt].style.display = '';
+ }
+ }
+ }
+
+ return;
+ }
+ else if (domLib_collisionElements.length == 0)
+ {
+ return;
+ }
+
+ // okay, we have a tip, so hunt and destroy
+ var objectOffsets = domLib_getOffsets(in_object);
+
+ for (var cnt = 0; cnt < domLib_collisionElements.length; cnt++)
+ {
+ var thisElement = domLib_collisionElements[cnt];
+
+ // if collision element is in active element, move on
+ // WARNING: is this too costly?
+ if (domLib_isDescendantOf(thisElement, in_object))
+ {
+ continue;
+ }
+
+ // konqueror only has trouble with multirow selects
+ if (domLib_isKonq &&
+ thisElement.tagName == 'SELECT' &&
+ (thisElement.size <= 1 && !thisElement.multiple))
+ {
+ continue;
+ }
+
+ if (!thisElement.hideList)
+ {
+ thisElement.hideList = new domTT_Hash();
+ }
+
+ var selectOffsets = domLib_getOffsets(thisElement);
+ var center2centerDistance = Math.sqrt(Math.pow(selectOffsets.get('leftCenter') - objectOffsets.get('leftCenter'), 2) + Math.pow(selectOffsets.get('topCenter') - objectOffsets.get('topCenter'), 2));
+ var radiusSum = selectOffsets.get('radius') + objectOffsets.get('radius');
+ // the encompassing circles are overlapping, get in for a closer look
+ if (center2centerDistance < radiusSum)
+ {
+ // tip is left of select
+ if ((objectOffsets.get('leftCenter') <= selectOffsets.get('leftCenter') && objectOffsets.get('right') < selectOffsets.get('left')) ||
+ // tip is right of select
+ (objectOffsets.get('leftCenter') > selectOffsets.get('leftCenter') && objectOffsets.get('left') > selectOffsets.get('right')) ||
+ // tip is above select
+ (objectOffsets.get('topCenter') <= selectOffsets.get('topCenter') && objectOffsets.get('bottom') < selectOffsets.get('top')) ||
+ // tip is below select
+ (objectOffsets.get('topCenter') > selectOffsets.get('topCenter') && objectOffsets.get('top') > selectOffsets.get('bottom')))
+ {
+ thisElement.hideList.remove(in_object.id);
+ if (!thisElement.hideList.length)
+ {
+ thisElement.style.visibility = 'visible';
+ if (domLib_isKonq)
+ {
+ thisElement.style.display = '';
+ }
+ }
+ }
+ else
+ {
+ thisElement.hideList.set(in_object.id, true);
+ thisElement.style.visibility = 'hidden';
+ if (domLib_isKonq)
+ {
+ thisElement.style.display = 'none';
+ }
+ }
+ }
+ }
+}
+
+// }}}
+// {{{ domLib_getOffsets()
+
+function domLib_getOffsets(in_object, in_preserveScroll)
+{
+ if (typeof(in_preserveScroll) == 'undefined') {
+ in_preserveScroll = false;
+ }
+
+ var originalObject = in_object;
+ var originalWidth = in_object.offsetWidth;
+ var originalHeight = in_object.offsetHeight;
+ var offsetLeft = 0;
+ var offsetTop = 0;
+
+ while (in_object)
+ {
+ offsetLeft += in_object.offsetLeft;
+ offsetTop += in_object.offsetTop;
+ in_object = in_object.offsetParent;
+ // consider scroll offset of parent elements
+ if (in_object && !in_preserveScroll)
+ {
+ offsetLeft -= in_object.scrollLeft;
+ offsetTop -= in_object.scrollTop;
+ }
+ }
+
+ // MacIE misreports the offsets (even with margin: 0 in body{}), still not perfect
+ if (domLib_isMacIE) {
+ offsetLeft += 10;
+ offsetTop += 10;
+ }
+
+ return new domTT_Hash(
+ 'left', offsetLeft,
+ 'top', offsetTop,
+ 'right', offsetLeft + originalWidth,
+ 'bottom', offsetTop + originalHeight,
+ 'leftCenter', offsetLeft + originalWidth/2,
+ 'topCenter', offsetTop + originalHeight/2,
+ 'radius', Math.max(originalWidth, originalHeight)
+ );
+}
+
+// }}}
+// {{{ domLib_setTimeout()
+
+function domLib_setTimeout(in_function, in_timeout, in_args)
+{
+ if (typeof(in_args) == 'undefined')
+ {
+ in_args = [];
+ }
+
+ if (in_timeout == -1)
+ {
+ // timeout event is disabled
+ return 0;
+ }
+ else if (in_timeout == 0)
+ {
+ in_function(in_args);
+ return 0;
+ }
+
+ // must make a copy of the arguments so that we release the reference
+ var args = domLib_clone(in_args);
+
+ if (!domLib_hasBrokenTimeout)
+ {
+ return setTimeout(function() { in_function(args); }, in_timeout);
+ }
+ else
+ {
+ var id = domLib_timeoutStateId++;
+ var data = new domTT_Hash();
+ data.set('function', in_function);
+ data.set('args', args);
+ domLib_timeoutStates.set(id, data);
+
+ data.set('timeoutId', setTimeout('domLib_timeoutStates.get(' + id + ').get(\'function\')(domLib_timeoutStates.get(' + id + ').get(\'args\')); domLib_timeoutStates.remove(' + id + ');', in_timeout));
+ return id;
+ }
+}
+
+// }}}
+// {{{ domLib_clearTimeout()
+
+function domLib_clearTimeout(in_id)
+{
+ if (!domLib_hasBrokenTimeout)
+ {
+ if (in_id > 0) {
+ clearTimeout(in_id);
+ }
+ }
+ else
+ {
+ if (domLib_timeoutStates.has(in_id))
+ {
+ clearTimeout(domLib_timeoutStates.get(in_id).get('timeoutId'));
+ domLib_timeoutStates.remove(in_id);
+ }
+ }
+}
+
+// }}}
+// {{{ domLib_getEventPosition()
+
+function domLib_getEventPosition(in_eventObj)
+{
+ var eventPosition = new domTT_Hash('x', 0, 'y', 0, 'scrollX', 0, 'scrollY', 0);
+
+ // IE varies depending on standard compliance mode
+ if (domLib_isIE)
+ {
+ var doc = (domLib_standardsMode ? document.documentElement : document.body);
+ // NOTE: events may fire before the body has been loaded
+ if (doc)
+ {
+ eventPosition.set('x', in_eventObj.clientX + doc.scrollLeft);
+ eventPosition.set('y', in_eventObj.clientY + doc.scrollTop);
+ eventPosition.set('scrollX', doc.scrollLeft);
+ eventPosition.set('scrollY', doc.scrollTop);
+ }
+ }
+ else
+ {
+ eventPosition.set('x', in_eventObj.pageX);
+ eventPosition.set('y', in_eventObj.pageY);
+ eventPosition.set('scrollX', in_eventObj.pageX - in_eventObj.clientX);
+ eventPosition.set('scrollY', in_eventObj.pageY - in_eventObj.clientY);
+ }
+
+ return eventPosition;
+}
+
+// }}}
+// {{{ domLib_cancelBubble()
+
+function domLib_cancelBubble(in_event)
+{
+ var eventObj = in_event ? in_event : window.event;
+ eventObj.cancelBubble = true;
+}
+
+// }}}
+// {{{ domLib_getIFrameReference()
+
+function domLib_getIFrameReference(in_frame)
+{
+ if (domLib_isGecko || domLib_isIE)
+ {
+ return in_frame.frameElement;
+ }
+ else
+ {
+ // we could either do it this way or require an id on the frame
+ // equivalent to the name
+ var name = in_frame.name;
+ if (!name || !in_frame.parent)
+ {
+ return null;
+ }
+
+ var candidates = in_frame.parent.document.getElementsByTagName('iframe');
+ for (var i = 0; i < candidates.length; i++)
+ {
+ if (candidates[i].name == name)
+ {
+ return candidates[i];
+ }
+ }
+
+ return null;
+ }
+}
+
+// }}}
+// {{{ domLib_getElementsByClass()
+
+function domLib_getElementsByClass(in_class)
+{
+ var elements = domLib_isIE5 ? document.all : document.getElementsByTagName('*');
+ var matches = [];
+ var cnt = 0;
+ for (var i = 0; i < elements.length; i++)
+ {
+ if ((" " + elements[i].className + " ").indexOf(" " + in_class + " ") != -1)
+ {
+ matches[cnt++] = elements[i];
+ }
+ }
+
+ return matches;
+}
+
+// }}}
+// {{{ domLib_getElementsByTagNames()
+
+function domLib_getElementsByTagNames(in_list, in_excludeHidden)
+{
+ var elements = [];
+ for (var i = 0; i < in_list.length; i++)
+ {
+ var matches = document.getElementsByTagName(in_list[i]);
+ for (var j = 0; j < matches.length; j++)
+ {
+ // skip objects that have nested embeds, or else we get "flashing"
+ if (matches[j].tagName == 'OBJECT' && domLib_isGecko)
+ {
+ var kids = matches[j].childNodes;
+ var skip = false;
+ for (var k = 0; k < kids.length; k++)
+ {
+ if (kids[k].tagName == 'EMBED')
+ {
+ skip = true;
+ break;
+ }
+ }
+ if (skip) continue;
+ }
+
+ if (in_excludeHidden && domLib_getComputedStyle(matches[j], 'visibility') == 'hidden')
+ {
+ continue;
+ }
+
+ elements[elements.length] = matches[j];
+ }
+ }
+
+ return elements;
+}
+
+// }}}
+// {{{ domLib_getComputedStyle()
+
+function domLib_getComputedStyle(in_obj, in_property)
+{
+ if (domLib_isIE)
+ {
+ var humpBackProp = in_property.replace(/-(.)/, function (a, b) { return b.toUpperCase(); });
+ return eval('in_obj.currentStyle.' + humpBackProp);
+ }
+ // getComputedStyle() is broken in konqueror, so let's go for the style object
+ else if (domLib_isKonq)
+ {
+ //var humpBackProp = in_property.replace(/-(.)/, function (a, b) { return b.toUpperCase(); });
+ return eval('in_obj.style.' + in_property);
+ }
+ else
+ {
+ return document.defaultView.getComputedStyle(in_obj, null).getPropertyValue(in_property);
+ }
+}
+
+// }}}
+// {{{ makeTrue()
+
+function makeTrue()
+{
+ return true;
+}
+
+// }}}
+// {{{ makeFalse()
+
+function makeFalse()
+{
+ return false;
+}
+
+// }}}
diff --git a/src/usr/local/www/javascript/domTT/domTT.js b/src/usr/local/www/javascript/domTT/domTT.js
new file mode 100644
index 0000000..fc9bf6a
--- /dev/null
+++ b/src/usr/local/www/javascript/domTT/domTT.js
@@ -0,0 +1,1132 @@
+/** $Id: domTT.js 2324 2006-06-12 07:06:39Z dallen $ */
+// {{{ license
+
+/*
+ * Copyright 2002-2005 Dan Allen, Mojavelinux.com (dan.allen@mojavelinux.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// }}}
+// {{{ intro
+
+/**
+ * Title: DOM Tooltip Library
+ * Version: 0.7.3
+ *
+ * Summary:
+ * Allows developers to add custom tooltips to the webpages. Tooltips are
+ * generated using the domTT_activate() function and customized by setting
+ * a handful of options.
+ *
+ * Maintainer: Dan Allen <dan.allen@mojavelinux.com>
+ * Contributors:
+ * Josh Gross <josh@jportalhome.com>
+ * Jason Rust <jason@rustyparts.com>
+ *
+ * License: Apache 2.0
+ * However, if you use this library, you earn the position of official bug
+ * reporter :) Please post questions or problem reports to the newsgroup:
+ *
+ * http://groups-beta.google.com/group/dom-tooltip
+ *
+ * If you are doing this for commercial work, perhaps you could send me a few
+ * Starbucks Coffee gift dollars or PayPal bucks to encourage future
+ * developement (NOT REQUIRED). E-mail me for my snail mail address.
+
+ *
+ * Homepage: http://www.mojavelinux.com/projects/domtooltip/
+ *
+ * Newsgroup: http://groups-beta.google.com/group/dom-tooltip
+ *
+ * Freshmeat Project: http://freshmeat.net/projects/domtt/?topic_id=92
+ *
+ * Updated: 2005/07/16
+ *
+ * Supported Browsers:
+ * Mozilla (Gecko), IE 5.5+, IE on Mac, Safari, Konqueror, Opera 7
+ *
+ * Usage:
+ * Please see the HOWTO documentation.
+**/
+
+// }}}
+// {{{ settings (editable)
+
+// IE mouse events seem to be off by 2 pixels
+var domTT_offsetX = (domLib_isIE ? -2 : 0);
+var domTT_offsetY = (domLib_isIE ? 4 : 2);
+var domTT_direction = 'southeast';
+var domTT_mouseHeight = domLib_isIE ? 13 : 19;
+var domTT_closeLink = 'X';
+var domTT_closeAction = 'hide';
+var domTT_activateDelay = 500;
+var domTT_maxWidth = false;
+var domTT_styleClass = 'domTT';
+var domTT_fade = 'neither';
+var domTT_lifetime = 0;
+var domTT_grid = 0;
+var domTT_trailDelay = 200;
+var domTT_useGlobalMousePosition = true;
+var domTT_postponeActivation = false;
+var domTT_tooltipIdPrefix = '[domTT]';
+var domTT_screenEdgeDetection = true;
+var domTT_screenEdgePadding = 4;
+var domTT_oneOnly = false;
+var domTT_cloneNodes = false;
+var domTT_detectCollisions = true;
+var domTT_bannedTags = ['OPTION'];
+var domTT_draggable = false;
+if (typeof(domTT_dragEnabled) == 'undefined')
+{
+ domTT_dragEnabled = false;
+}
+
+// }}}
+// {{{ globals (DO NOT EDIT)
+
+var domTT_predefined = new domTT_Hash();
+// tooltips are keyed on both the tip id and the owner id,
+// since events can originate on either object
+var domTT_tooltips = new domTT_Hash();
+var domTT_lastOpened = 0;
+var domTT_documentLoaded = false;
+var domTT_mousePosition = null;
+
+// }}}
+// {{{ document.onmousemove
+
+if (domLib_useLibrary && domTT_useGlobalMousePosition)
+{
+ document.onmousemove = function(in_event)
+ {
+ if (typeof(in_event) == 'undefined') { in_event = window.event; }
+
+ domTT_mousePosition = domLib_getEventPosition(in_event);
+ if (domTT_dragEnabled && domTT_dragMouseDown)
+ {
+ domTT_dragUpdate(in_event);
+ }
+ };
+}
+
+// }}}
+// {{{ domTT_activate()
+
+function domTT_activate(in_this, in_event)
+{
+ if (!domLib_useLibrary || (domTT_postponeActivation && !domTT_documentLoaded)) { return false; }
+
+ // make sure in_event is set (for IE, some cases we have to use window.event)
+ if (typeof(in_event) == 'undefined') { in_event = window.event; }
+
+ // don't allow tooltips on banned tags (such as OPTION)
+ if (in_event != null) {
+ var target = in_event.srcElement ? in_event.srcElement : in_event.target;
+ if (target != null && (',' + domTT_bannedTags.join(',') + ',').indexOf(',' + target.tagName + ',') != -1)
+ {
+ return false;
+ }
+ }
+
+ var owner = document.body;
+ // we have an active event so get the owner
+ if (in_event != null && in_event.type.match(/key|mouse|click|contextmenu/i))
+ {
+ // make sure we have nothing higher than the body element
+ if (in_this.nodeType && in_this.nodeType != document.DOCUMENT_NODE)
+ {
+ owner = in_this;
+ }
+ }
+ // non active event (make sure we were passed a string id)
+ else
+ {
+ if (typeof(in_this) != 'object' && !(owner = domTT_tooltips.get(in_this)))
+ {
+ // NOTE: two steps to avoid "flashing" in gecko
+ var embryo = document.createElement('div');
+ owner = document.body.appendChild(embryo);
+ owner.style.display = 'none';
+ owner.id = in_this;
+ }
+ }
+
+ // make sure the owner has a unique id
+ if (!owner.id)
+ {
+ owner.id = '__autoId' + domLib_autoId++;
+ }
+
+ // see if we should only be opening one tip at a time
+ // NOTE: this is not "perfect" yet since it really steps on any other
+ // tip working on fade out or delayed close, but it get's the job done
+ if (domTT_oneOnly && domTT_lastOpened)
+ {
+ domTT_deactivate(domTT_lastOpened);
+ }
+
+ domTT_lastOpened = owner.id;
+
+ var tooltip = domTT_tooltips.get(owner.id);
+ if (tooltip)
+ {
+ if (tooltip.get('eventType') != in_event.type)
+ {
+ if (tooltip.get('type') == 'greasy')
+ {
+ tooltip.set('closeAction', 'destroy');
+ domTT_deactivate(owner.id);
+ }
+ else if (tooltip.get('status') != 'inactive')
+ {
+ return owner.id;
+ }
+ }
+ else
+ {
+ if (tooltip.get('status') == 'inactive')
+ {
+ tooltip.set('status', 'pending');
+ tooltip.set('activateTimeout', domLib_setTimeout(domTT_runShow, tooltip.get('delay'), [owner.id, in_event]));
+
+ return owner.id;
+ }
+ // either pending or active, let it be
+ else
+ {
+ return owner.id;
+ }
+ }
+ }
+
+ // setup the default options hash
+ var options = new domTT_Hash(
+ 'caption', '',
+ 'content', '',
+ 'clearMouse', true,
+ 'closeAction', domTT_closeAction,
+ 'closeLink', domTT_closeLink,
+ 'delay', domTT_activateDelay,
+ 'direction', domTT_direction,
+ 'draggable', domTT_draggable,
+ 'fade', domTT_fade,
+ 'fadeMax', 100,
+ 'grid', domTT_grid,
+ 'id', domTT_tooltipIdPrefix + owner.id,
+ 'inframe', false,
+ 'lifetime', domTT_lifetime,
+ 'offsetX', domTT_offsetX,
+ 'offsetY', domTT_offsetY,
+ 'parent', document.body,
+ 'position', 'absolute',
+ 'styleClass', domTT_styleClass,
+ 'type', 'greasy',
+ 'trail', false,
+ 'lazy', false
+ );
+
+ // load in the options from the function call
+ for (var i = 2; i < arguments.length; i += 2)
+ {
+ // load in predefined
+ if (arguments[i] == 'predefined')
+ {
+ var predefinedOptions = domTT_predefined.get(arguments[i + 1]);
+ for (var j in predefinedOptions.elementData)
+ {
+ options.set(j, predefinedOptions.get(j));
+ }
+ }
+ // set option
+ else
+ {
+ options.set(arguments[i], arguments[i + 1]);
+ }
+ }
+
+ options.set('eventType', in_event != null ? in_event.type : null);
+
+ // immediately set the status text if provided
+ if (options.has('statusText'))
+ {
+ try { window.status = options.get('statusText'); } catch(e) {}
+ }
+
+ // if we didn't give content...assume we just wanted to change the status and return
+ if (!options.has('content') || options.get('content') == '' || options.get('content') == null)
+ {
+ if (typeof(owner.onmouseout) != 'function')
+ {
+ owner.onmouseout = function(in_event) { domTT_mouseout(this, in_event); };
+ }
+
+ return owner.id;
+ }
+
+ options.set('owner', owner);
+
+ domTT_create(options);
+
+ // determine the show delay
+ options.set('delay', (in_event != null && in_event.type.match(/click|mousedown|contextmenu/i)) ? 0 : parseInt(options.get('delay')));
+ domTT_tooltips.set(owner.id, options);
+ domTT_tooltips.set(options.get('id'), options);
+ options.set('status', 'pending');
+ options.set('activateTimeout', domLib_setTimeout(domTT_runShow, options.get('delay'), [owner.id, in_event]));
+
+ return owner.id;
+}
+
+// }}}
+// {{{ domTT_create()
+
+function domTT_create(in_options)
+{
+ var tipOwner = in_options.get('owner');
+ var parentObj = in_options.get('parent');
+ var parentDoc = parentObj.ownerDocument || parentObj.document;
+
+ // create the tooltip and hide it
+ // NOTE: two steps to avoid "flashing" in gecko
+ var embryo = parentDoc.createElement('div');
+ var tipObj = parentObj.appendChild(embryo);
+ tipObj.style.position = 'absolute';
+ tipObj.style.left = '0px';
+ tipObj.style.top = '0px';
+ tipObj.style.visibility = 'hidden';
+ tipObj.id = in_options.get('id');
+ tipObj.className = in_options.get('styleClass');
+
+ var contentBlock;
+ var tableLayout = false;
+
+ if (in_options.get('caption') || (in_options.get('type') == 'sticky' && in_options.get('caption') !== false))
+ {
+ tableLayout = true;
+ // layout the tip with a hidden formatting table
+ var tipLayoutTable = tipObj.appendChild(parentDoc.createElement('table'));
+ tipLayoutTable.style.borderCollapse = 'collapse';
+ if (domLib_isKHTML)
+ {
+ tipLayoutTable.cellSpacing = 0;
+ }
+
+ var tipLayoutTbody = tipLayoutTable.appendChild(parentDoc.createElement('tbody'));
+
+ var numCaptionCells = 0;
+ var captionRow = tipLayoutTbody.appendChild(parentDoc.createElement('tr'));
+ var captionCell = captionRow.appendChild(parentDoc.createElement('td'));
+ captionCell.style.padding = '0px';
+ var caption = captionCell.appendChild(parentDoc.createElement('div'));
+ caption.className = 'caption';
+ if (domLib_isIE50)
+ {
+ caption.style.height = '100%';
+ }
+
+ if (in_options.get('caption').nodeType)
+ {
+ caption.appendChild(domTT_cloneNodes ? in_options.get('caption').cloneNode(1) : in_options.get('caption'));
+ }
+ else
+ {
+ caption.innerHTML = in_options.get('caption');
+ }
+
+ if (in_options.get('type') == 'sticky')
+ {
+ var numCaptionCells = 2;
+ var closeLinkCell = captionRow.appendChild(parentDoc.createElement('td'));
+ closeLinkCell.style.padding = '0px';
+ var closeLink = closeLinkCell.appendChild(parentDoc.createElement('div'));
+ closeLink.className = 'caption';
+ if (domLib_isIE50)
+ {
+ closeLink.style.height = '100%';
+ }
+
+ closeLink.style.textAlign = 'right';
+ closeLink.style.cursor = domLib_stylePointer;
+ // merge the styles of the two cells
+ closeLink.style.borderLeftWidth = caption.style.borderRightWidth = '0px';
+ closeLink.style.paddingLeft = caption.style.paddingRight = '0px';
+ closeLink.style.marginLeft = caption.style.marginRight = '0px';
+ if (in_options.get('closeLink').nodeType)
+ {
+ closeLink.appendChild(in_options.get('closeLink').cloneNode(1));
+ }
+ else
+ {
+ closeLink.innerHTML = in_options.get('closeLink');
+ }
+
+ closeLink.onclick = function()
+ {
+ domTT_deactivate(tipOwner.id);
+ };
+ closeLink.onmousedown = function(in_event)
+ {
+ if (typeof(in_event) == 'undefined') { in_event = window.event; }
+ in_event.cancelBubble = true;
+ };
+ // MacIE has to have a newline at the end and must be made with createTextNode()
+ if (domLib_isMacIE)
+ {
+ closeLinkCell.appendChild(parentDoc.createTextNode("\n"));
+ }
+ }
+
+ // MacIE has to have a newline at the end and must be made with createTextNode()
+ if (domLib_isMacIE)
+ {
+ captionCell.appendChild(parentDoc.createTextNode("\n"));
+ }
+
+ var contentRow = tipLayoutTbody.appendChild(parentDoc.createElement('tr'));
+ var contentCell = contentRow.appendChild(parentDoc.createElement('td'));
+ contentCell.style.padding = '0px';
+ if (numCaptionCells)
+ {
+ if (domLib_isIE || domLib_isOpera)
+ {
+ contentCell.colSpan = numCaptionCells;
+ }
+ else
+ {
+ contentCell.setAttribute('colspan', numCaptionCells);
+ }
+ }
+
+ contentBlock = contentCell.appendChild(parentDoc.createElement('div'));
+ if (domLib_isIE50)
+ {
+ contentBlock.style.height = '100%';
+ }
+ }
+ else
+ {
+ contentBlock = tipObj.appendChild(parentDoc.createElement('div'));
+ }
+
+ contentBlock.className = 'contents';
+
+ var content = in_options.get('content');
+ // allow content has a function to return the actual content
+ if (typeof(content) == 'function') {
+ content = content(in_options.get('id'));
+ }
+
+ if (content != null && content.nodeType)
+ {
+ contentBlock.appendChild(domTT_cloneNodes ? content.cloneNode(1) : content);
+ }
+ else
+ {
+ contentBlock.innerHTML = content;
+ }
+
+ // adjust the width if specified
+ if (in_options.has('width'))
+ {
+ tipObj.style.width = parseInt(in_options.get('width')) + 'px';
+ }
+
+ // check if we are overridding the maxWidth
+ // if the browser supports maxWidth, the global setting will be ignored (assume stylesheet)
+ var maxWidth = domTT_maxWidth;
+ if (in_options.has('maxWidth'))
+ {
+ if ((maxWidth = in_options.get('maxWidth')) === false)
+ {
+ tipObj.style.maxWidth = domLib_styleNoMaxWidth;
+ }
+ else
+ {
+ maxWidth = parseInt(in_options.get('maxWidth'));
+ tipObj.style.maxWidth = maxWidth + 'px';
+ }
+ }
+
+ // HACK: fix lack of maxWidth in CSS for KHTML and IE
+ if (maxWidth !== false && (domLib_isIE || domLib_isKHTML) && tipObj.offsetWidth > maxWidth)
+ {
+ tipObj.style.width = maxWidth + 'px';
+ }
+
+ in_options.set('offsetWidth', tipObj.offsetWidth);
+ in_options.set('offsetHeight', tipObj.offsetHeight);
+
+ // konqueror miscalcuates the width of the containing div when using the layout table based on the
+ // border size of the containing div
+ if (domLib_isKonq && tableLayout && !tipObj.style.width)
+ {
+ var left = document.defaultView.getComputedStyle(tipObj, '').getPropertyValue('border-left-width');
+ var right = document.defaultView.getComputedStyle(tipObj, '').getPropertyValue('border-right-width');
+
+ left = left.substring(left.indexOf(':') + 2, left.indexOf(';'));
+ right = right.substring(right.indexOf(':') + 2, right.indexOf(';'));
+ var correction = 2 * ((left ? parseInt(left) : 0) + (right ? parseInt(right) : 0));
+ tipObj.style.width = (tipObj.offsetWidth - correction) + 'px';
+ }
+
+ // if a width is not set on an absolutely positioned object, both IE and Opera
+ // will attempt to wrap when it spills outside of body...we cannot have that
+ if (domLib_isIE || domLib_isOpera)
+ {
+ if (!tipObj.style.width)
+ {
+ // HACK: the correction here is for a border
+ tipObj.style.width = (tipObj.offsetWidth - 2) + 'px';
+ }
+
+ // HACK: the correction here is for a border
+ tipObj.style.height = (tipObj.offsetHeight - 2) + 'px';
+ }
+
+ // store placement offsets from event position
+ var offsetX, offsetY;
+
+ // tooltip floats
+ if (in_options.get('position') == 'absolute' && !(in_options.has('x') && in_options.has('y')))
+ {
+ // determine the offset relative to the pointer
+ switch (in_options.get('direction'))
+ {
+ case 'northeast':
+ offsetX = in_options.get('offsetX');
+ offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');
+ break;
+ case 'northwest':
+ offsetX = 0 - tipObj.offsetWidth - in_options.get('offsetX');
+ offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');
+ break;
+ case 'north':
+ offsetX = 0 - parseInt(tipObj.offsetWidth/2);
+ offsetY = 0 - tipObj.offsetHeight - in_options.get('offsetY');
+ break;
+ case 'southwest':
+ offsetX = 0 - tipObj.offsetWidth - in_options.get('offsetX');
+ offsetY = in_options.get('offsetY');
+ break;
+ case 'southeast':
+ offsetX = in_options.get('offsetX');
+ offsetY = in_options.get('offsetY');
+ break;
+ case 'south':
+ offsetX = 0 - parseInt(tipObj.offsetWidth/2);
+ offsetY = in_options.get('offsetY');
+ break;
+ }
+
+ // if we are in an iframe, get the offsets of the iframe in the parent document
+ if (in_options.get('inframe'))
+ {
+ var iframeObj = domLib_getIFrameReference(window);
+ if (iframeObj)
+ {
+ var frameOffsets = domLib_getOffsets(iframeObj);
+ offsetX += frameOffsets.get('left');
+ offsetY += frameOffsets.get('top');
+ }
+ }
+ }
+ // tooltip is fixed
+ else
+ {
+ offsetX = 0;
+ offsetY = 0;
+ in_options.set('trail', false);
+ }
+
+ // set the direction-specific offsetX/Y
+ in_options.set('offsetX', offsetX);
+ in_options.set('offsetY', offsetY);
+ if (in_options.get('clearMouse') && in_options.get('direction').indexOf('south') != -1)
+ {
+ in_options.set('mouseOffset', domTT_mouseHeight);
+ }
+ else
+ {
+ in_options.set('mouseOffset', 0);
+ }
+
+ if (domLib_canFade && typeof(Fadomatic) == 'function')
+ {
+ if (in_options.get('fade') != 'neither')
+ {
+ var fadeHandler = new Fadomatic(tipObj, 10, 0, 0, in_options.get('fadeMax'));
+ in_options.set('fadeHandler', fadeHandler);
+ }
+ }
+ else
+ {
+ in_options.set('fade', 'neither');
+ }
+
+ // setup mouse events
+ if (in_options.get('trail') && typeof(tipOwner.onmousemove) != 'function')
+ {
+ tipOwner.onmousemove = function(in_event) { domTT_mousemove(this, in_event); };
+ }
+
+ if (typeof(tipOwner.onmouseout) != 'function')
+ {
+ tipOwner.onmouseout = function(in_event) { domTT_mouseout(this, in_event); };
+ }
+
+ if (in_options.get('type') == 'sticky')
+ {
+ if (in_options.get('position') == 'absolute' && domTT_dragEnabled && in_options.get('draggable'))
+ {
+ if (domLib_isIE)
+ {
+ captionRow.onselectstart = function() { return false; };
+ }
+
+ // setup drag
+ captionRow.onmousedown = function(in_event) { domTT_dragStart(tipObj, in_event); };
+ captionRow.onmousemove = function(in_event) { domTT_dragUpdate(in_event); };
+ captionRow.onmouseup = function() { domTT_dragStop(); };
+ }
+ }
+ else if (in_options.get('type') == 'velcro')
+ {
+ /* can use once we have deactivateDelay
+ tipObj.onmouseover = function(in_event)
+ {
+ if (typeof(in_event) == 'undefined') { in_event = window.event; }
+ var tooltip = domTT_tooltips.get(tipObj.id);
+ if (in_options.get('lifetime')) {
+ domLib_clearTimeout(in_options.get('lifetimeTimeout');
+ }
+ };
+ */
+ tipObj.onmouseout = function(in_event)
+ {
+ if (typeof(in_event) == 'undefined') { in_event = window.event; }
+ if (!domLib_isDescendantOf(in_event[domLib_eventTo], tipObj, domTT_bannedTags)) {
+ domTT_deactivate(tipOwner.id);
+ }
+ };
+ // NOTE: this might interfere with links in the tip
+ tipObj.onclick = function(in_event)
+ {
+ domTT_deactivate(tipOwner.id);
+ };
+ }
+
+ if (in_options.get('position') == 'relative')
+ {
+ tipObj.style.position = 'relative';
+ }
+
+ in_options.set('node', tipObj);
+ in_options.set('status', 'inactive');
+}
+
+// }}}
+// {{{ domTT_show()
+
+// in_id is either tip id or the owner id
+function domTT_show(in_id, in_event)
+{
+
+ // should always find one since this call would be cancelled if tip was killed
+ var tooltip = domTT_tooltips.get(in_id);
+ var status = tooltip.get('status');
+ var tipObj = tooltip.get('node');
+
+ if (tooltip.get('position') == 'absolute')
+ {
+ var mouseX, mouseY;
+
+ if (tooltip.has('x') && tooltip.has('y'))
+ {
+ mouseX = tooltip.get('x');
+ mouseY = tooltip.get('y');
+ }
+ else if (!domTT_useGlobalMousePosition || domTT_mousePosition == null || status == 'active' || tooltip.get('delay') == 0)
+ {
+ var eventPosition = domLib_getEventPosition(in_event);
+ var eventX = eventPosition.get('x');
+ var eventY = eventPosition.get('y');
+ if (tooltip.get('inframe'))
+ {
+ eventX -= eventPosition.get('scrollX');
+ eventY -= eventPosition.get('scrollY');
+ }
+
+ // only move tip along requested trail axis when updating position
+ if (status == 'active' && tooltip.get('trail') !== true)
+ {
+ var trail = tooltip.get('trail');
+ if (trail == 'x')
+ {
+ mouseX = eventX;
+ mouseY = tooltip.get('mouseY');
+ }
+ else if (trail == 'y')
+ {
+ mouseX = tooltip.get('mouseX');
+ mouseY = eventY;
+ }
+ }
+ else
+ {
+ mouseX = eventX;
+ mouseY = eventY;
+ }
+ }
+ else
+ {
+ mouseX = domTT_mousePosition.get('x');
+ mouseY = domTT_mousePosition.get('y');
+ if (tooltip.get('inframe'))
+ {
+ mouseX -= domTT_mousePosition.get('scrollX');
+ mouseY -= domTT_mousePosition.get('scrollY');
+ }
+ }
+
+ // we are using a grid for updates
+ if (tooltip.get('grid'))
+ {
+ // if this is not a mousemove event or it is a mousemove event on an active tip and
+ // the movement is bigger than the grid
+ if (in_event.type != 'mousemove' || (status == 'active' && (Math.abs(tooltip.get('lastX') - mouseX) > tooltip.get('grid') || Math.abs(tooltip.get('lastY') - mouseY) > tooltip.get('grid'))))
+ {
+ tooltip.set('lastX', mouseX);
+ tooltip.set('lastY', mouseY);
+ }
+ // did not satisfy the grid movement requirement
+ else
+ {
+ return false;
+ }
+ }
+
+ // mouseX and mouseY store the last acknowleged mouse position,
+ // good for trailing on one axis
+ tooltip.set('mouseX', mouseX);
+ tooltip.set('mouseY', mouseY);
+
+ var coordinates;
+ if (domTT_screenEdgeDetection)
+ {
+ coordinates = domTT_correctEdgeBleed(
+ tooltip.get('offsetWidth'),
+ tooltip.get('offsetHeight'),
+ mouseX,
+ mouseY,
+ tooltip.get('offsetX'),
+ tooltip.get('offsetY'),
+ tooltip.get('mouseOffset'),
+ tooltip.get('inframe') ? window.parent : window
+ );
+ }
+ else
+ {
+ coordinates = {
+ 'x' : mouseX + tooltip.get('offsetX'),
+ 'y' : mouseY + tooltip.get('offsetY') + tooltip.get('mouseOffset')
+ };
+ }
+
+ // update the position
+ tipObj.style.left = coordinates.x + 'px';
+ tipObj.style.top = coordinates.y + 'px';
+
+ // increase the tip zIndex so it goes over previously shown tips
+ tipObj.style.zIndex = domLib_zIndex++;
+ }
+
+ // if tip is not active, active it now and check for a fade in
+ if (status == 'pending')
+ {
+ // unhide the tooltip
+ tooltip.set('status', 'active');
+ tipObj.style.display = '';
+ tipObj.style.visibility = 'visible';
+
+ var fade = tooltip.get('fade');
+ if (fade != 'neither')
+ {
+ var fadeHandler = tooltip.get('fadeHandler');
+ if (fade == 'out' || fade == 'both')
+ {
+ fadeHandler.haltFade();
+ if (fade == 'out')
+ {
+ fadeHandler.halt();
+ }
+ }
+
+ if (fade == 'in' || fade == 'both')
+ {
+ fadeHandler.fadeIn();
+ }
+ }
+
+ if (tooltip.get('type') == 'greasy' && tooltip.get('lifetime') != 0)
+ {
+ tooltip.set('lifetimeTimeout', domLib_setTimeout(domTT_runDeactivate, tooltip.get('lifetime'), [tipObj.id]));
+ }
+ }
+
+ if (tooltip.get('position') == 'absolute' && domTT_detectCollisions)
+ {
+ // utilize original collision element cache
+ domLib_detectCollisions(tipObj, false, true);
+ }
+}
+
+// }}}
+// {{{ domTT_close()
+
+// in_handle can either be an child object of the tip, the tip id or the owner id
+function domTT_close(in_handle)
+{
+ var id;
+ if (typeof(in_handle) == 'object' && in_handle.nodeType)
+ {
+ var obj = in_handle;
+ while (!obj.id || !domTT_tooltips.get(obj.id))
+ {
+ obj = obj.parentNode;
+
+ if (obj.nodeType != document.ELEMENT_NODE) { return; }
+ }
+
+ id = obj.id;
+ }
+ else
+ {
+ id = in_handle;
+ }
+
+ domTT_deactivate(id);
+}
+
+// }}}
+// {{{ domTT_closeAll()
+
+// run through the tooltips and close them all
+function domTT_closeAll()
+{
+ // NOTE: this will iterate 2x # of tooltips
+ for (var id in domTT_tooltips.elementData) {
+ domTT_close(id);
+ }
+}
+
+// }}}
+// {{{ domTT_deactivate()
+
+// in_id is either the tip id or the owner id
+function domTT_deactivate(in_id)
+{
+ var tooltip = domTT_tooltips.get(in_id);
+ if (tooltip)
+ {
+ var status = tooltip.get('status');
+ if (status == 'pending')
+ {
+ // cancel the creation of this tip if it is still pending
+ domLib_clearTimeout(tooltip.get('activateTimeout'));
+ tooltip.set('status', 'inactive');
+ }
+ else if (status == 'active')
+ {
+ if (tooltip.get('lifetime'))
+ {
+ domLib_clearTimeout(tooltip.get('lifetimeTimeout'));
+ }
+
+ var tipObj = tooltip.get('node');
+ if (tooltip.get('closeAction') == 'hide')
+ {
+ var fade = tooltip.get('fade');
+ if (fade != 'neither')
+ {
+ var fadeHandler = tooltip.get('fadeHandler');
+ if (fade == 'out' || fade == 'both')
+ {
+ fadeHandler.fadeOut();
+ }
+ else
+ {
+ fadeHandler.hide();
+ }
+ }
+ else
+ {
+ tipObj.style.display = 'none';
+ }
+ }
+ else
+ {
+ tooltip.get('parent').removeChild(tipObj);
+ domTT_tooltips.remove(tooltip.get('owner').id);
+ domTT_tooltips.remove(tooltip.get('id'));
+ }
+
+ tooltip.set('status', 'inactive');
+ if (domTT_detectCollisions) {
+ // unhide all of the selects that are owned by this object
+ // utilize original collision element cache
+ domLib_detectCollisions(tipObj, true, true);
+ }
+ }
+ }
+}
+
+// }}}
+// {{{ domTT_mouseout()
+
+function domTT_mouseout(in_owner, in_event)
+{
+ if (!domLib_useLibrary) { return false; }
+
+ if (typeof(in_event) == 'undefined') { in_event = window.event; }
+
+ var toChild = domLib_isDescendantOf(in_event[domLib_eventTo], in_owner, domTT_bannedTags);
+ var tooltip = domTT_tooltips.get(in_owner.id);
+ if (tooltip && (tooltip.get('type') == 'greasy' || tooltip.get('status') != 'active'))
+ {
+ // deactivate tip if exists and we moved away from the owner
+ if (!toChild)
+ {
+ domTT_deactivate(in_owner.id);
+ try { window.status = window.defaultStatus; } catch(e) {}
+ }
+ }
+ else if (!toChild)
+ {
+ try { window.status = window.defaultStatus; } catch(e) {}
+ }
+}
+
+// }}}
+// {{{ domTT_mousemove()
+
+function domTT_mousemove(in_owner, in_event)
+{
+ if (!domLib_useLibrary) { return false; }
+
+ if (typeof(in_event) == 'undefined') { in_event = window.event; }
+
+ var tooltip = domTT_tooltips.get(in_owner.id);
+ if (tooltip && tooltip.get('trail') && tooltip.get('status') == 'active')
+ {
+ // see if we are trailing lazy
+ if (tooltip.get('lazy'))
+ {
+ domLib_setTimeout(domTT_runShow, domTT_trailDelay, [in_owner.id, in_event]);
+ }
+ else
+ {
+ domTT_show(in_owner.id, in_event);
+ }
+ }
+}
+
+// }}}
+// {{{ domTT_addPredefined()
+
+function domTT_addPredefined(in_id)
+{
+ var options = new domTT_Hash();
+ for (var i = 1; i < arguments.length; i += 2)
+ {
+ options.set(arguments[i], arguments[i + 1]);
+ }
+
+ domTT_predefined.set(in_id, options);
+}
+
+// }}}
+// {{{ domTT_correctEdgeBleed()
+
+function domTT_correctEdgeBleed(in_width, in_height, in_x, in_y, in_offsetX, in_offsetY, in_mouseOffset, in_window)
+{
+ var win, doc;
+ var bleedRight, bleedBottom;
+ var pageHeight, pageWidth, pageYOffset, pageXOffset;
+
+ var x = in_x + in_offsetX;
+ var y = in_y + in_offsetY + in_mouseOffset;
+
+ win = (typeof(in_window) == 'undefined' ? window : in_window);
+
+ // Gecko and IE swaps values of clientHeight, clientWidth properties when
+ // in standards compliance mode from documentElement to document.body
+ doc = ((domLib_standardsMode && (domLib_isIE || domLib_isGecko)) ? win.document.documentElement : win.document.body);
+
+ // for IE in compliance mode
+ if (domLib_isIE)
+ {
+ pageHeight = doc.clientHeight;
+ pageWidth = doc.clientWidth;
+ pageYOffset = doc.scrollTop;
+ pageXOffset = doc.scrollLeft;
+ }
+ else
+ {
+ pageHeight = doc.clientHeight;
+ pageWidth = doc.clientWidth;
+
+ if (domLib_isKHTML)
+ {
+ pageHeight = win.innerHeight;
+ }
+
+ pageYOffset = win.pageYOffset;
+ pageXOffset = win.pageXOffset;
+ }
+
+ // we are bleeding off the right, move tip over to stay on page
+ // logic: take x position, add width and subtract from effective page width
+ if ((bleedRight = (x - pageXOffset) + in_width - (pageWidth - domTT_screenEdgePadding)) > 0)
+ {
+ x -= bleedRight;
+ }
+
+ // we are bleeding to the left, move tip over to stay on page
+ // if tip doesn't fit, we will go back to bleeding off the right
+ // logic: take x position and check if less than edge padding
+ if ((x - pageXOffset) < domTT_screenEdgePadding)
+ {
+ x = domTT_screenEdgePadding + pageXOffset;
+ }
+
+ // if we are bleeding off the bottom, flip to north
+ // logic: take y position, add height and subtract from effective page height
+ if ((bleedBottom = (y - pageYOffset) + in_height - (pageHeight - domTT_screenEdgePadding)) > 0)
+ {
+ y = in_y - in_height - in_offsetY;
+ }
+
+ // if we are bleeding off the top, flip to south
+ // if tip doesn't fit, we will go back to bleeding off the bottom
+ // logic: take y position and check if less than edge padding
+ if ((y - pageYOffset) < domTT_screenEdgePadding)
+ {
+ y = in_y + domTT_mouseHeight + in_offsetY;
+ }
+
+ return {'x' : x, 'y' : y};
+}
+
+// }}}
+// {{{ domTT_isActive()
+
+// in_id is either the tip id or the owner id
+function domTT_isActive(in_id)
+{
+ var tooltip = domTT_tooltips.get(in_id);
+ if (!tooltip || tooltip.get('status') != 'active')
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+// }}}
+// {{{ domTT_runXXX()
+
+// All of these domMenu_runXXX() methods are used by the event handling sections to
+// avoid the circular memory leaks caused by inner functions
+function domTT_runDeactivate(args) { domTT_deactivate(args[0]); }
+function domTT_runShow(args) { domTT_show(args[0], args[1]); }
+
+// }}}
+// {{{ domTT_replaceTitles()
+
+function domTT_replaceTitles(in_decorator)
+{
+ var elements = domLib_getElementsByClass('tooltip');
+ for (var i = 0; i < elements.length; i++)
+ {
+ if (elements[i].title)
+ {
+ var content;
+ if (typeof(in_decorator) == 'function')
+ {
+ content = in_decorator(elements[i]);
+ }
+ else
+ {
+ content = elements[i].title;
+ }
+
+ content = content.replace(new RegExp('\'', 'g'), '\\\'');
+ elements[i].onmouseover = new Function('in_event', "domTT_activate(this, in_event, 'content', '" + content + "')");
+ elements[i].title = '';
+ }
+ }
+}
+
+// }}}
+// {{{ domTT_update()
+
+// Allow authors to update the contents of existing tips using the DOM
+// Unfortunately, the tip must already exist, or else no work is done.
+// TODO: make getting at content or caption cleaner
+function domTT_update(handle, content, type)
+{
+ // type defaults to 'content', can also be 'caption'
+ if (typeof(type) == 'undefined')
+ {
+ type = 'content';
+ }
+
+ var tip = domTT_tooltips.get(handle);
+ if (!tip)
+ {
+ return;
+ }
+
+ var tipObj = tip.get('node');
+ var updateNode;
+ if (type == 'content')
+ {
+ // <div class="contents">...
+ updateNode = tipObj.firstChild;
+ if (updateNode.className != 'contents')
+ {
+ // <table><tbody><tr>...</tr><tr><td><div class="contents">...
+ updateNode = updateNode.firstChild.firstChild.nextSibling.firstChild.firstChild;
+ }
+ }
+ else
+ {
+ updateNode = tipObj.firstChild;
+ if (updateNode.className == 'contents')
+ {
+ // missing caption
+ return;
+ }
+
+ // <table><tbody><tr><td><div class="caption">...
+ updateNode = updateNode.firstChild.firstChild.firstChild.firstChild;
+ }
+
+ // TODO: allow for a DOM node as content
+ updateNode.innerHTML = content;
+}
+
+// }}}
diff --git a/src/usr/local/www/javascript/domTT/fadomatic.js b/src/usr/local/www/javascript/domTT/fadomatic.js
new file mode 100644
index 0000000..2c67d0b
--- /dev/null
+++ b/src/usr/local/www/javascript/domTT/fadomatic.js
@@ -0,0 +1,180 @@
+/** $Id$ */
+// Title: Fadomatic
+// Version: 1.2
+// Homepage: http://chimpen.com/fadomatic
+// Author: Philip McCarthy <fadomatic@chimpen.com>
+
+// Fade interval in milliseconds
+// Make this larger if you experience performance issues
+Fadomatic.INTERVAL_MILLIS = 50;
+
+// Creates a fader
+// element - The element to fade
+// speed - The speed to fade at, from 0.0 to 100.0
+// initialOpacity (optional, default 100) - element's starting opacity, 0 to 100
+// minOpacity (optional, default 0) - element's minimum opacity, 0 to 100
+// maxOpacity (optional, default 0) - element's minimum opacity, 0 to 100
+function Fadomatic (element, rate, initialOpacity, minOpacity, maxOpacity) {
+ this._element = element;
+ this._intervalId = null;
+ this._rate = rate;
+ this._isFadeOut = true;
+
+ // Set initial opacity and bounds
+ // NB use 99 instead of 100 to avoid flicker at start of fade
+ this._minOpacity = 0;
+ this._maxOpacity = 99;
+ this._opacity = 99;
+
+ if (typeof minOpacity != 'undefined') {
+ if (minOpacity < 0) {
+ this._minOpacity = 0;
+ } else if (minOpacity > 99) {
+ this._minOpacity = 99;
+ } else {
+ this._minOpacity = minOpacity;
+ }
+ }
+
+ if (typeof maxOpacity != 'undefined') {
+ if (maxOpacity < 0) {
+ this._maxOpacity = 0;
+ } else if (maxOpacity > 99) {
+ this._maxOpacity = 99;
+ } else {
+ this._maxOpacity = maxOpacity;
+ }
+
+ if (this._maxOpacity < this._minOpacity) {
+ this._maxOpacity = this._minOpacity;
+ }
+ }
+
+ if (typeof initialOpacity != 'undefined') {
+ if (initialOpacity > this._maxOpacity) {
+ this._opacity = this._maxOpacity;
+ } else if (initialOpacity < this._minOpacity) {
+ this._opacity = this._minOpacity;
+ } else {
+ this._opacity = initialOpacity;
+ }
+ }
+
+ // See if we're using W3C opacity, MSIE filter, or just
+ // toggling visiblity
+ if(typeof element.style.opacity != 'undefined') {
+
+ this._updateOpacity = this._updateOpacityW3c;
+
+ } else if(typeof element.style.filter != 'undefined') {
+
+ // If there's not an alpha filter on the element already,
+ // add one
+ if (element.style.filter.indexOf("alpha") == -1) {
+
+ // Attempt to preserve existing filters
+ var existingFilters="";
+ if (element.style.filter) {
+ existingFilters = element.style.filter+" ";
+ }
+ element.style.filter = existingFilters+"alpha(opacity="+this._opacity+")";
+ }
+
+ this._updateOpacity = this._updateOpacityMSIE;
+
+ } else {
+
+ this._updateOpacity = this._updateVisibility;
+ }
+
+ this._updateOpacity();
+}
+
+// Initiates a fade out
+Fadomatic.prototype.fadeOut = function () {
+ this._isFadeOut = true;
+ this._beginFade();
+};
+
+// Initiates a fade in
+Fadomatic.prototype.fadeIn = function () {
+ this._isFadeOut = false;
+ this._beginFade();
+};
+
+// Makes the element completely opaque, stops any fade in progress
+Fadomatic.prototype.show = function () {
+ this.haltFade();
+ this._opacity = this._maxOpacity;
+ this._updateOpacity();
+};
+
+// Makes the element completely transparent, stops any fade in progress
+Fadomatic.prototype.hide = function () {
+ this.haltFade();
+ this._opacity = 0;
+ this._updateOpacity();
+};
+
+// Halts any fade in progress
+Fadomatic.prototype.haltFade = function () {
+
+ clearInterval(this._intervalId);
+};
+
+// Resumes a fade where it was halted
+Fadomatic.prototype.resumeFade = function () {
+
+ this._beginFade();
+};
+
+// Pseudo-private members
+
+Fadomatic.prototype._beginFade = function () {
+
+ this.haltFade();
+ var objref = this;
+ this._intervalId = setInterval(function() { objref._tickFade(); },Fadomatic.INTERVAL_MILLIS);
+};
+
+Fadomatic.prototype._tickFade = function () {
+
+ if (this._isFadeOut) {
+ this._opacity -= this._rate;
+ if (this._opacity < this._minOpacity) {
+ this._opacity = this._minOpacity;
+ this.haltFade();
+ }
+ } else {
+ this._opacity += this._rate;
+ if (this._opacity > this._maxOpacity ) {
+ this._opacity = this._maxOpacity;
+ this.haltFade();
+ }
+ }
+
+ this._updateOpacity();
+};
+
+Fadomatic.prototype._updateVisibility = function () {
+
+ if (this._opacity > 0) {
+ this._element.style.visibility = 'visible';
+ } else {
+ this._element.style.visibility = 'hidden';
+ }
+};
+
+Fadomatic.prototype._updateOpacityW3c = function () {
+
+ this._element.style.opacity = this._opacity/100;
+ this._updateVisibility();
+};
+
+Fadomatic.prototype._updateOpacityMSIE = function () {
+
+ this._element.filters.alpha.opacity = this._opacity;
+ this._updateVisibility();
+};
+
+Fadomatic.prototype._updateOpacity = null;
diff --git a/src/usr/local/www/javascript/filter_log.js b/src/usr/local/www/javascript/filter_log.js
new file mode 100644
index 0000000..66a7309
--- /dev/null
+++ b/src/usr/local/www/javascript/filter_log.js
@@ -0,0 +1,168 @@
+if (typeof getURL == 'undefined') {
+ getURL = function(url, callback) {
+ if (!url)
+ throw 'No URL for getURL';
+ try {
+ if (typeof callback.operationComplete == 'function')
+ callback = callback.operationComplete;
+ } catch (e) {}
+ if (typeof callback != 'function')
+ throw 'No callback function for getURL';
+ var http_request = null;
+ if (typeof XMLHttpRequest != 'undefined') {
+ http_request = new XMLHttpRequest();
+ }
+ else if (typeof ActiveXObject != 'undefined') {
+ try {
+ http_request = new ActiveXObject('Msxml2.XMLHTTP');
+ } catch (e) {
+ try {
+ http_request = new ActiveXObject('Microsoft.XMLHTTP');
+ } catch (e) {}
+ }
+ }
+ if (!http_request)
+ throw 'Both getURL and XMLHttpRequest are undefined';
+ http_request.onreadystatechange = function() {
+ if (http_request.readyState == 4) {
+ callback( { success : true,
+ content : http_request.responseText,
+ contentType : http_request.getResponseHeader("Content-Type") } );
+ }
+ };
+ http_request.open('GET', url, true);
+ http_request.send(null);
+ };
+}
+
+function outputrule(req) {
+ alert(req.content);
+}
+function fetch_new_rules() {
+ if(isPaused)
+ return;
+ if(isBusy)
+ return;
+ isBusy = true;
+ getURL('diag_logs_filter_dynamic.php?lastsawtime=' + lastsawtime, fetch_new_rules_callback);
+}
+function fetch_new_rules_callback(callback_data) {
+ if(isPaused)
+ return;
+
+ var data_split;
+ var new_data_to_add = Array();
+ var data = callback_data.content;
+
+ data_split = data.split("\n");
+
+ for(var x=0; x<data_split.length-1; x++) {
+ /* loop through rows */
+ row_split = data_split[x].split("||");
+ lastsawtime = row_split[9];
+
+ var tmp = format_log_line(row_split);
+ if ( !(tmp) ) continue;
+
+ new_data_to_add[new_data_to_add.length] = tmp;
+ }
+ update_table_rows(new_data_to_add);
+ isBusy = false;
+}
+
+function in_arrayi(needle, haystack) {
+ var i = haystack.length;
+ while (i--) {
+ if (haystack[i].toLowerCase() === needle.toLowerCase()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function update_table_rows(data) {
+ if(isPaused)
+ return;
+
+ var isIE = navigator.appName.indexOf('Microsoft') != -1;
+ var isSafari = navigator.userAgent.indexOf('Safari') != -1;
+ var isOpera = navigator.userAgent.indexOf('Opera') != -1;
+ var showanim = 1;
+ if (isIE) {
+ showanim = 0;
+ }
+
+ var startat = data.length - nentries;
+ if (startat < 0) {
+ startat = 0;
+ }
+ data = data.slice(startat, data.length);
+
+ var rows = jQuery('#filter-log-entries>tr');
+
+ // Number of rows to move by
+ var move = rows.length + data.length - nentries;
+ if (move < 0)
+ move = 0;
+
+ if (isReverse == false) {
+ for (var i = move; i < rows.length; i++) {
+ jQuery(rows[i - move]).html(jQuery(rows[i]).html());
+ }
+
+ var tbody = jQuery('#filter-log-entries');
+ for (var i = 0; i < data.length; i++) {
+ var rowIndex = rows.length - move + i;
+ if (rowIndex < rows.length) {
+ jQuery(rows[rowIndex]).html(data[i]);
+ } else {
+ jQuery(tbody).append('<tr>' + data[i] + '</tr>');
+ }
+ }
+ } else {
+ for (var i = rows.length - 1; i >= move; i--) {
+ jQuery(rows[i]).html(jQuery(rows[i - move]).html());
+ }
+
+ var tbody = jQuery('#filter-log-entries');
+ for (var i = 0; i < data.length; i++) {
+ var rowIndex = move - 1 - i;
+ if (rowIndex >= 0) {
+ jQuery(rows[rowIndex]).html(data[i]);
+ } else {
+ jQuery(tbody).prepend('<tr>' + data[i] + '</tr>');
+ }
+ }
+ }
+
+ // Much easier to go through each of the rows once they've all be added.
+ rows = jQuery('#filter-log-entries>tr');
+ for (var i = 0; i < rows.length; i++) {
+ rows[i].className = i % 2 == 0 ? 'listMRodd' : 'listMReven';
+ }
+}
+
+function toggle_pause() {
+ if(isPaused) {
+ isPaused = false;
+ fetch_new_rules();
+ } else {
+ isPaused = true;
+ }
+}
+/* start local AJAX engine */
+if (typeof updateDelay != 'undefined') {
+ timer = setInterval('fetch_new_rules()', updateDelay);
+}
+
+function toggleListDescriptions(){
+ var ss = document.styleSheets;
+ for (var i=0; i<ss.length; i++) {
+ var rules = ss[i].cssRules || ss[i].rules;
+ for (var j=0; j<rules.length; j++) {
+ if (rules[j].selectorText === ".listMRDescriptionL" || rules[j].selectorText === ".listMRDescriptionR") {
+ rules[j].style.display = rules[j].style.display === "none" ? "table-cell" : "none";
+ }
+ }
+ }
+}
diff --git a/src/usr/local/www/javascript/firebug-lite.js b/src/usr/local/www/javascript/firebug-lite.js
new file mode 100644
index 0000000..135b9e6
--- /dev/null
+++ b/src/usr/local/www/javascript/firebug-lite.js
@@ -0,0 +1,1000 @@
+/**
+ * firebug lite <http://www.getfirebug.com/lite.html>
+ * v1.0
+ * 04.11.2008, 8:25 PM ~
+ * v1.0a
+ * 03.27.2008, 5:44 AM ~ 04.01.2008, 21:32 PM
+ * Azer Koçulu <http://azer.kodfabrik.com>
+ */
+
+var firebug = {
+ env:{ "cache":{}, "ctmp":[], "dIndex":"console", "init":false, "ml":false, "objCn":[] },
+ init:function(){
+ firebug.el = {}; // elements
+ firebug.el.content = {};
+ with(firebug){
+
+ document.documentElement.childNodes[0].appendChild(
+ new pi.element("link").attribute.set("rel","stylesheet").attribute.set("href","http://firebuglite.appspot.com/firebug-lite.css").environment.getElement()
+ );
+
+ /*
+ * main interface
+ */
+ el.main = new pi.element("DIV").attribute.set("id","Firebug").environment.addStyle({ "width":pi.util.GetWindowSize().width+"px" }).insert(document.body);
+ el.header = new pi.element("DIV").attribute.addClass("Header").insert(el.main);
+ el.left = {};
+ el.left.container = new pi.element("DIV").attribute.addClass("Left").insert(el.main);
+ el.right = {};
+ el.right.container = new pi.element("DIV").attribute.addClass("Right").insert(el.main);
+ el.main.child.add(new pi.element("DIV").environment.addStyle({ "clear":"both" }));
+
+ /*
+ * buttons
+ */
+ el.button = {};
+ el.button.container = new pi.element("DIV").attribute.addClass("ButtonContainer").insert(el.header);
+ el.button.logo = new pi.element("A").attribute.set("title","Firebug Lite").attribute.set("target","_blank").attribute.set("href","http://getfirebug.com/lite.html").update("&nbsp;").attribute.addClass("Button Logo").insert(el.button.container);
+ el.button.inspect = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.inspector.toggle).update("Inspect").insert(el.button.container);
+ el.button.maximize = new pi.element("A").attribute.addClass("Button Maximize").event.addListener("click",win.maximize).insert(el.button.container);
+ el.button.minimize = new pi.element("A").attribute.addClass("Button Minimize").event.addListener("click",win.minimize).insert(el.button.container);
+ el.button.close = new pi.element("A").attribute.addClass("Button Close").event.addListener("click",win.close).insert(el.button.container);
+
+ if(pi.env.ie||pi.env.webkit){
+ el.button.container.environment.addStyle({ "paddingTop":"12px" });
+ }
+
+ /*
+ * navigation
+ */
+ el.nav = {};
+ el.nav.container = new pi.element("DIV").attribute.addClass("Nav").insert(el.left.container);
+ el.nav.console = new pi.element("A").attribute.addClass("Tab Selected").event.addListener("click",d.navigate.curry(window,"console")).update("Console").insert(el.nav.container);
+ el.nav.html = new pi.element("A").attribute.addClass("Tab").update("HTML").event.addListener("click",d.navigate.curry(window,"html")).insert(el.nav.container);
+ el.nav.css = new pi.element("A").attribute.addClass("Tab").update("CSS").event.addListener("click",d.navigate.curry(window,"css")).insert(el.nav.container);
+ el.nav.scripts = new pi.element("A").attribute.addClass("Tab").update("Script").event.addListener("click",d.navigate.curry(window,"scripts")).insert(el.nav.container);
+ el.nav.dom = new pi.element("A").attribute.addClass("Tab").update("DOM").event.addListener("click",d.navigate.curry(window,"dom")).insert(el.nav.container);
+ el.nav.xhr = new pi.element("A").attribute.addClass("Tab").update("XHR").event.addListener("click",d.navigate.curry(window,"xhr")).insert(el.nav.container);
+
+ /*
+ * inspector
+ */
+
+ el.borderInspector = new pi.element("DIV").attribute.set("id","FirebugBorderInspector").event.addListener("click",listen.inspector).insert(document.body);
+ el.bgInspector = new pi.element("DIV").attribute.set("id","FirebugBGInspector").insert(document.body);
+
+ /*
+ * console
+ */
+ el.left.console = {};
+ el.left.console.container = new pi.element("DIV").attribute.addClass("Console").insert(el.left.container);
+ el.left.console.mlButton = new pi.element("A").attribute.addClass("MLButton").event.addListener("click",d.console.toggleML).insert(el.left.console.container);
+ el.left.console.monitor = new pi.element("DIV").insert(
+ new pi.element("DIV").attribute.addClass("Monitor").insert(el.left.console.container)
+ );
+ el.left.console.container.child.add(
+ new pi.element("DIV").attribute.addClass("InputArrow").update(">>>")
+ );
+ el.left.console.input = new pi.element("INPUT").attribute.set("type","text").attribute.addClass("Input").event.addListener("keydown",listen.consoleTextbox).insert(
+ new pi.element("DIV").attribute.addClass("InputContainer").insert(el.left.console.container)
+ );
+
+ el.right.console = {};
+ el.right.console.container = new pi.element("DIV").attribute.addClass("Console Container").insert(el.right.container);
+ el.right.console.mlButton = new pi.element("A").attribute.addClass("MLButton CloseML").event.addListener("click",d.console.toggleML).insert(el.right.console.container);
+ el.right.console.input = new pi.element("TEXTAREA").attribute.addClass("Input").insert(el.right.console.container);
+ el.right.console.run = new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.runMultiline).update("Run").insert(el.right.console.container);
+
+ el.right.console.clear = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.right.console.input)).update("Clear").insert(el.right.console.container);
+
+ el.button.console = {};
+ el.button.console.container = new pi.element("DIV").attribute.addClass("ButtonSet").insert(el.button.container);
+ el.button.console.clear = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.left.console.monitor)).update("Clear").insert(el.button.console.container);
+
+ /*
+ * html
+ */
+
+ el.left.html = {};
+ el.left.html.container = new pi.element("DIV").attribute.addClass("HTML").insert(el.left.container);
+
+ el.right.html = {};
+ el.right.html.container = new pi.element("DIV").attribute.addClass("HTML Container").insert(el.right.container);
+
+ el.right.html.nav = {};
+ el.right.html.nav.container = new pi.element("DIV").attribute.addClass("Nav").insert(el.right.html.container);
+ el.right.html.nav.computedStyle = new pi.element("A").attribute.addClass("Tab Selected").event.addListener("click",d.html.navigate.curry(firebug,"computedStyle")).update("Computed Style").insert(el.right.html.nav.container);
+ if(!pi.env.ie6)
+ el.right.html.nav.dom = new pi.element("A").attribute.addClass("Tab").event.addListener("click",d.html.navigate.curry(firebug,"dom")).update("DOM").insert(el.right.html.nav.container);
+
+ el.right.html.content = new pi.element("DIV").attribute.addClass("Content").insert(el.right.html.container);
+
+ el.button.html = {};
+ el.button.html.container = new pi.element("DIV").attribute.addClass("ButtonSet HTML").insert(el.button.container);
+
+ /*
+ * css
+ */
+
+ el.left.css = {};
+ el.left.css.container = new pi.element("DIV").attribute.addClass("CSS").insert(el.left.container);
+
+ el.right.css = {};
+ el.right.css.container = new pi.element("DIV").attribute.addClass("CSS Container").insert(el.right.container);
+
+ el.right.css.nav = {};
+ el.right.css.nav.container = new pi.element("DIV").attribute.addClass("Nav").insert(el.right.css.container);
+ el.right.css.nav.runCSS = new pi.element("A").attribute.addClass("Tab Selected").update("Run CSS").insert(el.right.css.nav.container);
+
+ el.right.css.mlButton = new pi.element("A").attribute.addClass("MLButton CloseML").event.addListener("click",d.console.toggleML).insert(el.right.css.container);
+ el.right.css.input = new pi.element("TEXTAREA").attribute.addClass("Input").insert(el.right.css.container);
+ el.right.css.run = new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.runCSS).update("Run").insert(el.right.css.container);
+ el.right.css.clear = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.clean.curry(window,el.right.css.input)).update("Clear").insert(el.right.css.container);
+
+ el.button.css = {};
+ el.button.css.container = new pi.element("DIV").attribute.addClass("ButtonSet CSS").insert(el.button.container);
+ el.button.css.selectbox = new pi.element("SELECT").event.addListener("change",listen.cssSelectbox).insert(el.button.css.container);
+
+ /*
+ * scripts
+ */
+
+ el.left.scripts = {};
+ el.left.scripts.container = new pi.element("DIV").attribute.addClass("Scripts").insert(el.left.container);
+
+ el.right.scripts = {};
+ el.right.scripts.container = new pi.element("DIV").attribute.addClass("Scripts Container").insert(el.right.container);
+
+ el.button.scripts = {};
+ el.button.scripts.container = new pi.element("DIV").attribute.addClass("ButtonSet Scripts").insert(el.button.container);
+ el.button.scripts.selectbox = new pi.element("SELECT").event.addListener("change",listen.scriptsSelectbox).insert(el.button.scripts.container);
+ el.button.scripts.lineNumbers = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.scripts.toggleLineNumbers).update("Show Line Numbers").insert(el.button.scripts.container);
+
+ /*
+ * dom
+ */
+
+ el.left.dom = {};
+ el.left.dom.container = new pi.element("DIV").attribute.addClass("DOM").insert(el.left.container);
+
+ el.right.dom = {};
+ el.right.dom.container = new pi.element("DIV").attribute.addClass("DOM Container").insert(el.right.container);
+
+ el.button.dom = {};
+ el.button.dom.container = new pi.element("DIV").attribute.addClass("ButtonSet DOM").insert(el.button.container);
+ el.button.dom.label = new pi.element("LABEL").update("Object Path:").insert(el.button.dom.container);
+ el.button.dom.textbox = new pi.element("INPUT").event.addListener("keydown",listen.domTextbox).update("window").insert(el.button.dom.container);
+
+ /*
+ * str
+ */
+
+ el.left.str = {};
+ el.left.str.container = new pi.element("DIV").attribute.addClass("STR").insert(el.left.container);
+
+ el.right.str = {};
+ el.right.str.container = new pi.element("DIV").attribute.addClass("STR").insert(el.left.container);
+
+ el.button.str = {};
+ el.button.str.container = new pi.element("DIV").attribute.addClass("ButtonSet XHR").insert(el.button.container);
+ el.button.str.watch = new pi.element("A").attribute.addClass("Button").event.addListener("click",d.navigate.curry(window,"xhr")).update("Back").insert(el.button.str.container);
+
+ /*
+ * xhr
+ */
+
+ el.left.xhr = {};
+ el.left.xhr.container = new pi.element("DIV").attribute.addClass("XHR").insert(el.left.container);
+
+ el.right.xhr = {};
+ el.right.xhr.container = new pi.element("DIV").attribute.addClass("XHR").insert(el.left.container);
+
+
+ el.button.xhr = {};
+ el.button.xhr.container = new pi.element("DIV").attribute.addClass("ButtonSet XHR").insert(el.button.container);
+ el.button.xhr.label = new pi.element("LABEL").update("XHR Path:").insert(el.button.xhr.container);
+ el.button.xhr.textbox = new pi.element("INPUT").event.addListener("keydown",listen.xhrTextbox).insert(el.button.xhr.container);
+ el.button.xhr.watch = new pi.element("A").attribute.addClass("Button").event.addListener("click",listen.addXhrObject).update("Watch").insert(el.button.xhr.container);
+
+ // fix ie6 a:hover bug
+ if(pi.env.ie6)
+ {
+ var buttons = [
+ el.button.inspect,
+ el.button.close,
+ el.button.inspect,
+ el.button.console.clear,
+ el.right.console.run,
+ el.right.console.clear,
+ el.right.css.run,
+ el.right.css.clear
+ ];
+ for(var i=0; i<buttons.length; i++)
+ buttons[i].attribute.set("href","#");
+ }
+ //
+
+ env.init = true;
+
+ for(var i=0; i<env.ctmp.length; i++)
+ {
+ d.console.log.apply(window,env.ctmp[i]);
+ }
+ }
+ },
+ win:{
+ close:function(){
+ with(firebug){
+ el.main.update("");
+ el.main.remove();
+ }
+ },
+ minimize:function(){
+ with(firebug){
+ el.main.environment.addStyle({ "height":"35px" });
+ el.button.maximize.environment.addStyle({ "display":"block" });
+ el.button.minimize.environment.addStyle({ "display":"none" });
+ d.refreshSize();
+ }
+ },
+ maximize:function(){
+ with(firebug){
+ el.main.environment.addStyle({ "height":"295px" });
+ el.button.minimize.environment.addStyle({ "display":"block" });
+ el.button.maximize.environment.addStyle({ "display":"none" });
+ d.refreshSize();
+ }
+ }
+ },
+ watchXHR:function(){
+ with(firebug){
+ d.xhr.addObject.apply(window,arguments);
+ if(env.dIndex!="xhr"){
+ d.navigate("xhr");
+ }
+ }
+ },
+ d: {
+ clean:function(_element){
+ with(firebug){
+ _element.update("");
+ }
+ },
+ console:{
+ dir:function(_value){
+ with(firebug){
+ d.console.addLine().attribute.addClass("Arrow").update(">>> console.dir("+_value+")");
+ d.dom.open(_value,d.console.addLine());
+ }
+ },
+ addLine:function(){
+ with (firebug) {
+ return new pi.element("DIV").attribute.addClass("Row").insert(el.left.console.monitor);
+ }
+ },
+ openObject:function(_index){
+ with (firebug) {
+ d.dom.open(env.objCn[_index], el.left.dom.container, pi.env.ie);
+ d.navigate("dom");
+ }
+ },
+ historyIndex:0,
+ history:[],
+ log:function(_values){
+ with (firebug) {
+ if(env.init==false){
+ env.ctmp.push(arguments);
+ return;
+ }
+
+ var value = "";
+ for(var i=0; i<arguments.length; i++){
+ value += (i>0?" ":"")+d.highlight(arguments[i],false,false,true);
+ }
+
+ d.console.addLine().update(value);
+ d.console.scroll();
+
+ }
+ },
+ print: function(_cmd,_text){
+ with (firebug){
+ d.console.addLine().attribute.addClass("Arrow").update(">>> "+_cmd);
+ d.console.addLine().update(d.highlight(_text,false,false,true));
+ d.console.scroll();
+ d.console.historyIndex = d.console.history.push(_cmd);
+ }
+ },
+ run:function(cmd){
+ with(firebug){
+ if(cmd.length==0)return;
+ el.left.console.input.environment.getElement().value = "";
+ try {
+ var result = eval.call(window,cmd);
+ d.console.print(cmd,result);
+ } catch(e){
+ d.console.addLine().attribute.addClass("Arrow").update(">>> "+cmd);
+ if(!pi.env.ff){
+ d.console.scroll();
+ return d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+(e.description||e),true);
+ }
+ if(e.fileName==null){
+ d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+e.message,true);
+ }
+ var fileName = e.fileName.split("\/").getLastItem();
+ d.console.addLine().attribute.addClass("Error").update("<strong>Error: </strong>"+e.message+" (<em>"+fileName+"</em>,"+e.lineNumber+")",true);
+ d.console.scroll();
+ }
+ d.console.scroll();
+ }
+ },
+ scroll:function(){
+ with(firebug){
+ el.left.console.monitor.environment.getElement().parentNode.scrollTop = Math.abs(el.left.console.monitor.environment.getSize().offsetHeight-200);
+ }
+ },
+ toggleML:function(){
+ with(firebug){
+ var open = !env.ml;
+ env.ml = !env.ml;
+ d.navigateRightColumn("console",open);
+ el[open?"left":"right"].console.mlButton.environment.addStyle({ display:"none" });
+ el[!open?"left":"right"].console.mlButton.environment.addStyle({ display:"block" });
+ el.left.console.monitor.environment.addStyle({ "height":(open?233:210)+"px" });
+ el.left.console.mlButton.attribute[(open?"add":"remove")+"Class"]("CloseML");
+ }
+ }
+ },
+ css:{
+ index:-1,
+ open:function(_index){
+ with (firebug) {
+ var item = document.styleSheets[_index];
+ var uri = item.href;
+ if(uri.indexOf("http:\/\/")>-1&&getDomain(uri)!=document.domain){
+ el.left.css.container.update("<em>Access to restricted URI denied</em>");
+ return;
+ }
+ var rules = item[pi.env.ie ? "rules" : "cssRules"];
+ var str = "";
+ for (var i=0; i<rules.length; i++) {
+ var item = rules[i];
+ var selector = item.selectorText;
+ var cssText = pi.env.ie?item.style.cssText:item.cssText.match(/\{(.*)\}/)[1];
+ str+=d.css.printRule(selector, cssText.split(";"), el.left.css.container);
+ }
+ el.left.css.container.update(str);
+ }
+ },
+ printRule:function(_selector,_css,_layer){
+ with(firebug){
+ var str = "<div class='Selector'>"+_selector+" {</div>";
+ for(var i=0; i<_css.length; i++){
+ var item = _css[i];
+ str += "<div class='CSSText'>"+item.replace(/(.+\:)(.+)/,"<span class='CSSProperty'>$1</span><span class='CSSValue'>$2;</span>")+"</div>";
+ }
+ str+="<div class='Selector'>}</div>";
+ return str;
+ }
+ },
+ refresh:function(){
+ with(firebug){
+ el.button.css.selectbox.update("");
+ var collection = document.styleSheets;
+ for(var i=0; i<collection.length; i++){
+ var uri = collection[i].href;
+ d.css.index=d.css.index<0?i:d.css.index;
+ el.button.css.selectbox.child.add(
+ new pi.element("OPTION").attribute.set("value",i).update(uri)
+ );
+ };
+ d.css.open(d.css.index);
+ }
+ }
+ },
+ dom: {
+ open: function(_object,_layer){
+ with (firebug) {
+ _layer.clean();
+ var container = new pi.element("DIV").attribute.addClass("DOMContent").insert(_layer);
+ d.dom.print(_object, container);
+ }
+ },
+ print:function(_object,_parent, _inTree){
+ with (firebug) {
+ var obj = _object || window, parentElement = _parent;
+ parentElement.update("");
+
+ if(parentElement.opened&&parentElement!=el.left.dom.container){
+ parentElement.environment.getParent().pi.child.get()[0].pi.child.get()[0].pi.attribute.removeClass("Opened");
+ parentElement.opened = false;
+ parentElement.environment.addStyle({ "display":"none" });
+ return;
+ }
+ if(_inTree)
+ parentElement.environment.getParent().pi.child.get()[0].pi.child.get()[0].pi.attribute.addClass("Opened");
+ parentElement.opened = true;
+
+ for (var key in obj) {
+ try {
+
+ var value = obj[key], property = key, container = new pi.element("DIV").attribute.addClass("DOMRow").insert(parentElement),
+ left = new pi.element("DIV").attribute.addClass("DOMRowLeft").insert(container), right = new pi.element("DIV").attribute.addClass("DOMRowRight").insert(container);
+
+ container.child.add(
+ new pi.element("DIV").environment.addStyle({ "clear":"both" })
+ );
+
+ var link = new pi.element("A").attribute.addClass(
+ typeof value=="object"&&Boolean(value)?"Property Object":"Property"
+ ).update(property).insert(left);
+
+ right.update(
+ d.highlight(value,false,true)
+ );
+
+ var subContainer = new pi.element("DIV").attribute.addClass("DOMRowSubContainer").insert(container);
+
+ if(typeof value!="object"||Boolean(value)==false)
+ continue;
+
+ link.event.addListener("click",d.dom.print.curry(window,value, subContainer, true));
+ }catch(e){
+ }
+ }
+ parentElement.environment.addStyle({ "display":"block" });
+ }
+ }
+ },
+ highlight:function(_value,_inObject,_inArray,_link){
+ with(firebug){
+ var isArray = false, isElement = false;
+ try {
+ isArray = pi.util.IsArray(_value);
+ isElement = _value!=undefined&&Boolean(_value.nodeName)&&Boolean(_value.nodeType);
+ }catch(e){};
+
+ // number, string, boolean, null, function
+ if(_value==null||["boolean","function","number","string"].indexOf(typeof _value)>-1){
+ // NULL
+ if(_value==null){
+ return "<span class='Null'>null</span>";
+ }
+
+ // BOOLEAN & NUMBER
+ if (["boolean", "number"].indexOf(typeof _value) > -1) {
+ return "<span class='DarkBlue'>" + _value + "</span>";
+ }
+
+ // FUNCTION
+ if(typeof _value=="function"){
+ return "<span class='"+(_inObject?"Italic Gray":"Green")+"'>function()</span>";
+ }
+
+ // STRING
+ return "<span class='Red'>\""+( !_inObject&&!_inArray?_value : _value.substring(0,35) ).replace(/\n/g,"\\n").replace(/\s/g,"&nbsp;").replace(/>/g,"&#62;").replace(/</g,"&#60;")+"\"</span>";
+ }
+ // element
+ else if(isElement){
+ if(_value.nodeType==3)return d.highlight(_value.nodeValue);
+
+ if(_inArray||_inObject){
+ var result = "<span class='Blue'>"+_value.nodeName.toLowerCase();
+ if(_value.getAttribute&&_value.getAttribute("id"))result += "<span class='DarkBlue'>#"+_value.getAttribute("id")+"</span>";
+ var elClass = _value.getAttribute?_value.getAttribute(pi.env.ie?"className":"class"):"";
+ if(elClass)result += "<span class='Red'>."+elClass.split(" ")[0]+"</span>";
+ return result+"</span>";
+ }
+
+ var result = "<span class='Blue'>&#60;"+_value.nodeName.toLowerCase()+"";
+ if(_value.attributes)
+ for(var i=0; i<_value.attributes.length; i++){
+ var item = _value.attributes[i];
+ if(pi.env.ie&&Boolean(item.nodeValue)==false)continue;
+ result += " <span class='DarkBlue'>"+item.nodeName+"=\"<span class='Red'>"+item.nodeValue+"</span>\"</span>";
+ }
+ result += "&#62;</span>";
+ return result;
+ }
+ // array & object
+ else if(isArray||["object","array"].indexOf(typeof _value)>-1){
+ var result = "";
+ if(isArray||_value instanceof Array){
+ if(_inObject)return "<span class='Gray Italic'>["+_value.length+"]</span>";
+ result += "<span class='Strong'>[ ";
+
+ for(var i=0; i<_value.length; i++){
+ if((_inObject||_inArray)&&pi.env.ie&&i>3)break;
+ result += (i > 0 ? ", " : "") + d.highlight(_value[i], false, true, true);
+ }
+ result += " ]</span>";
+ return result;
+ }
+ if(_inObject)return "<span class='Gray Italic'>Object</span>";
+ result += "<span class='Strong Green"+ ( !_link?"'":" ObjectLink' onmouseover='this.className=this.className.replace(\"ObjectLink\",\"ObjectLinkHover\")' onmouseout='this.className=this.className.replace(\"ObjectLinkHover\",\"ObjectLink\")' onclick='firebug.d.console.openObject(" +( env.objCn.push( _value ) -1 )+")'" ) + ">Object";
+ var i=0;
+ for(var key in _value){
+ var value = _value[key];
+ if((_inObject||_inArray)&&pi.env.ie&&i>3)
+ break;
+ result += " "+key+"="+d.highlight(value,true);
+ i++;
+ };
+ result += "</span>";
+ return result;
+ } else {
+ if(_inObject)
+ return "<span class='Gray Italic'>"+_value+"</span>";
+ return _value;
+ }
+
+ }
+ },
+ html:{
+ nIndex:"computedStyle",
+ current:null,
+ highlight:function(_element,_clear,_event){
+ with(firebug){
+ if(_clear){
+ el.bgInspector.environment.addStyle({ "display":"none" });
+ return;
+ }
+ d.inspector.inspect(_element,true);
+ }
+ },
+ inspect:function(_element){
+ var el = _element, map = [], parent = _element;
+ while(parent){
+ map.push(parent);
+ if(parent==document.body)break;
+ parent = parent.parentNode;
+ }
+ map = map.reverse();
+ with(firebug){
+ d.inspector.toggle();
+ var parentLayer = el.left.html.container.child.get()[1].childNodes[1].pi;
+ for(var t=0; map[t];){
+ if(t==map.length-1){
+
+ var link = parentLayer.environment.getElement().previousSibling.pi;
+ link.attribute.addClass("Selected");
+
+ if(d.html.current)d.html.current[1].attribute.removeClass("Selected");
+
+ d.html.current = [_element,link];
+
+ return t;
+ }
+ parentLayer = d.html.openHtmlTree(map[t],parentLayer,map[t+1]);
+ t++;
+ }
+ }
+ },
+ navigate:function(_index,_element){
+ with(firebug){
+ el.right.html.nav[d.html.nIndex].attribute.removeClass("Selected");
+ el.right.html.nav[_index].attribute.addClass("Selected");
+ d.html.nIndex = _index;
+ d.html.openProperties();
+
+ }
+ },
+ openHtmlTree:function(_element,_parent,_returnParentElementByElement,_event){
+ with(firebug){
+ var element = _element || document.documentElement,
+ parent = _parent || el.left.html.container,
+ returnParentEl = _returnParentElementByElement || null,
+ returnParentVal = null;
+
+ if(parent!=el.left.html.container){
+ var nodeLink = parent.environment.getParent().pi.child.get()[0].pi;
+ if(d.html.current)d.html.current[1].attribute.removeClass("Selected");
+ nodeLink.attribute.addClass("Selected");
+
+ d.html.current = [_element,nodeLink];
+ d.html.openProperties();
+ }
+
+ if(element.childNodes&&(element.childNodes.length==0||(element.childNodes.length==1&&element.childNodes[0].nodeType==3)))return;
+ parent.clean();
+
+ if(parent.opened&&Boolean(_returnParentElementByElement)==false){
+ parent.opened = false;
+ parent.environment.getParent().pi.child.get()[0].pi.attribute.removeClass("Open");
+ return;
+ }
+ if (parent != el.left.html.container) {
+ parent.environment.getParent().pi.child.get()[0].pi.attribute.addClass("Open");
+ parent.opened = true;
+
+ }
+
+ for(var i=0; i<element.childNodes.length; i++){
+ var item = element.childNodes[i];
+
+ if(item.nodeType==3)continue;
+ var container = new pi.element().attribute.addClass("Block").insert(parent);
+ var link = new pi.element("A").attribute.addClass("Link").update(d.highlight(item)).insert(container);
+ var subContainer = new pi.element("DIV").attribute.addClass("SubContainer").insert(container);
+ link.event.addListener("click",d.html.openHtmlTree.curry(window,item,subContainer,false));
+ link.event.addListener("mouseover",d.html.highlight.curry(window,item, false));
+ link.event.addListener("mouseout",d.html.highlight.curry(window,item,true));
+
+ returnParentVal = returnParentEl==item?subContainer:returnParentVal;
+
+ if(d.html.current==null&&item==document.body){
+ link.attribute.addClass("Selected");
+ d.html.current = [item,link];
+ d.html.openHtmlTree(item,subContainer);
+ }
+
+ if(item.childNodes&&item.childNodes.length==1&&item.childNodes[0].nodeType==3){
+ link.child.get()[0].appendChild(document.createTextNode(item.childNodes[0].nodeValue.substring(0,100)));
+ link.child.get()[0].appendChild(document.createTextNode("</"));
+ link.child.get()[0].appendChild(new pi.element("span").attribute.addClass("Blue").update(item.nodeName.toLowerCase()).environment.getElement());
+ link.child.get()[0].appendChild(document.createTextNode(">"));
+ continue;
+ }
+ else if(item.childNodes&&item.childNodes.length==0)continue;
+ link.attribute.addClass("ParentLink");
+
+ }
+ return returnParentVal;
+ }
+ },
+ openProperties:function(){
+ with(firebug){
+
+ var index = d.html.nIndex;
+ var node = d.html.current[0];
+ d.clean(el.right.html.content);
+ var str = "";
+ switch(index){
+ case "computedStyle":
+ var property = ["opacity","filter","azimuth","background","backgroundAttachment","backgroundColor","backgroundImage","backgroundPosition","backgroundRepeat","border","borderCollapse","borderColor","borderSpacing","borderStyle","borderTop","borderRight","borderBottom","borderLeft","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","borderTopStyle","borderRightStyle","borderBottomStyle","borderLeftStyle","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderWidth","bottom","captionSide","clear","clip","color","content","counterIncrement","counterReset","cue","cueAfter","cueBefore","cursor","direction","display","elevation","emptyCells","cssFloat","font","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","height","left","letterSpacing","lineHeight","listStyle","listStyleImage","listStylePosition","listStyleType","margin","marginTop","marginRight","marginBottom","marginLeft","markerOffset","marks","maxHeight","maxWidth","minHeight","minWidth","orphans","outline","outlineColor","outlineStyle","outlineWidth","overflow","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","page","pageBreakAfter","pageBreakBefore","pageBreakInside","pause","pauseAfter","pauseBefore","pitch","pitchRange","playDuring","position","quotes","richness","right","size","speak","speakHeader","speakNumeral","speakPunctuation","speechRate","stress","tableLayout","textAlign","textDecoration","textIndent","textShadow","textTransform","top","unicodeBidi","verticalAlign","visibility","voiceFamily","volume","whiteSpace","widows","width","wordSpacing","zIndex"].sort();
+ var view = document.defaultView?document.defaultView.getComputedStyle(node,null):node.currentStyle;
+ for(var i=0; i<property.length; i++){
+ var item = property[i];
+ if(!view[item])continue;
+ str+="<div class='CSSItem'><div class='CSSProperty'>"+item+"</div><div class='CSSValue'>"+d.highlight(view[item])+"</div></div>";
+ }
+ el.right.html.content.update(str);
+ break;
+ case "dom":
+ d.dom.open(node,el.right.html.content,pi.env.ie);
+ break;
+ }
+ }
+ }
+ },
+ inspector:{
+ enabled:false,
+ el:null,
+ inspect:function(_element,_bgInspector){
+ var el = _element, top = el.offsetTop, left = el.offsetLeft, parent = _element.offsetParent;
+ while(Boolean(parent)&&parent!=document.firstChild){
+ top += parent.offsetTop;
+ left += parent.offsetLeft;
+ parent = parent.offsetParent;
+ if(parent==document.body)break;
+ };
+
+ with(firebug){
+ el[_bgInspector?"bgInspector":"borderInspector"].environment.addStyle({
+ "width":_element.offsetWidth+"px", "height":_element.offsetHeight+"px",
+ "top":top-(_bgInspector?0:2)+"px", "left":left-(_bgInspector?0:2)+"px",
+ "display":"block"
+ });
+
+ if(!_bgInspector){
+ d.inspector.el = _element;
+ }
+ };
+ },
+ toggle:function(){
+ with (firebug) {
+ d.inspector.enabled = !d.inspector.enabled;
+ el.button.inspect.attribute[(d.inspector.enabled ? "add" : "remove") + "Class"]("Enabled");
+ if(d.inspector.enabled==false){
+ el.borderInspector.environment.addStyle({ "display":"none" });
+ d.inspector.el = null;
+ } else if(pi.env.dIndex!="html") {
+ d.navigate("html");
+ }
+ }
+ }
+ },
+ scripts:{
+ index:-1,
+ lineNumbers:false,
+ open:function(_index){
+ with(firebug){
+ d.scripts.index = _index;
+ el.left.scripts.container.update("");
+ var script = document.getElementsByTagName("script")[_index],uri = script.src||document.location.href,source;
+
+ if(uri.indexOf("http:\/\/")>-1&&getDomain(uri)!=document.domain){
+ el.left.scripts.container.update("<em>Access to restricted URI denied</em>");
+ return;
+ }
+
+ if(uri!=document.location.href){
+ source = env.cache[uri]||pi.xhr.get(uri).responseText;
+ env.cache[uri] = source;
+ } else
+ source = script.innerHTML;
+ source = source.replace(/\n|\t|<|>/g,function(_ch){
+ return ({"<":"&#60;",">":"&#62;","\t":"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;","\n":"<br />"})[_ch];
+ });
+
+ if (!d.scripts.lineNumbers)
+ el.left.scripts.container.child.add(
+ new pi.element("DIV").attribute.addClass("CodeContainer").update(source)
+ );
+ else {
+ source = source.split("<br />");
+ for (var i = 0; i < source.length; i++) {
+ el.left.scripts.container.child.add(new pi.element("DIV").child.add(new pi.element("DIV").attribute.addClass("LineNumber").update(i + 1), new pi.element("DIV").attribute.addClass("Code").update("&nbsp;" + source[i]), new pi.element("DIV").environment.addStyle({
+ "clear": "both"
+ })));
+ };
+ };
+ }
+ },
+ toggleLineNumbers:function(){
+ with(firebug){
+ d.scripts.lineNumbers = !d.scripts.lineNumbers;
+ el.button.scripts.lineNumbers.attribute[(d.scripts.lineNumbers ? "add" : "remove") + "Class"]("Enabled");
+ d.scripts.open( d.scripts.index );
+
+ }
+ },
+ refresh:function(){
+ with(firebug){
+ el.button.scripts.selectbox.clean();
+ var collection = document.getElementsByTagName("script");
+ for(var i=0; i<collection.length; i++){
+ var item = collection[i];
+ d.scripts.index=d.scripts.index<0?i:d.scripts.index;
+ el.button.scripts.selectbox.child.add(
+ new pi.element("OPTION").attribute.set("value",i).update(item.src||item.baseURI||"..")
+ );
+ }
+ d.scripts.open( d.scripts.index );
+ }
+ }
+ },
+ str: {
+ open:function(_str){
+ with(firebug){
+ d.navigate("str");
+ el.left.str.container.update(_str.replace(/\n/g,"<br />"))
+ }
+ }
+ },
+ xhr:{
+ objects:[],
+ addObject:function(){
+ with(firebug){
+ for(var i=0; i<arguments.length; i++){
+ try {
+ var item = arguments[i];
+ var val = eval(item);
+ d.xhr.objects.push([
+ item, val
+ ]);
+ } catch(e){
+ continue;
+ }
+ }
+ }
+ },
+ open:function(){
+ with(firebug){
+ el.left.xhr.container.update("");
+ el.left.xhr.name = new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").attribute.addClass("Block").environment.addStyle({ "width":"20%" }).insert(el.left.xhr.container));
+ el.left.xhr.nameTitle = new pi.element("STRONG").update("Object Name:").insert(el.left.xhr.name);
+ el.left.xhr.nameContent = new pi.element("DIV").insert(el.left.xhr.name);
+ el.left.xhr.status = new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").attribute.addClass("Block").environment.addStyle({ "width":"10%" }).insert(el.left.xhr.container));
+ el.left.xhr.statusTitle = new pi.element("STRONG").update("Status:").insert(el.left.xhr.status);
+ el.left.xhr.statusContent = new pi.element("DIV").insert(el.left.xhr.status);
+ el.left.xhr.readystate = new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").environment.addStyle({ "width":"15%" }).attribute.addClass("Block").insert(el.left.xhr.container));
+ el.left.xhr.readystateTitle =el.left.xhr.nameTitle = new pi.element("STRONG").update("Ready State:").insert(el.left.xhr.readystate);
+ el.left.xhr.readystateContent = new pi.element("DIV").insert(el.left.xhr.readystate);
+ el.left.xhr.response = new pi.element("DIV").attribute.addClass("BlockContent").insert(new pi.element("DIV").environment.addStyle({ "width":(pi.env.ie?"50":"55")+"%" }).attribute.addClass("Block").insert(el.left.xhr.container));
+ el.left.xhr.responseTitle = new pi.element("STRONG").update("Response:").insert(el.left.xhr.response);
+ el.left.xhr.responseContent = new pi.element("DIV").insert(el.left.xhr.response);
+ setTimeout(d.xhr.refresh,500);
+ }
+ },
+ refresh:function(){
+ with(firebug){
+ el.left.xhr.nameContent.update("");
+ el.left.xhr.statusContent.update("");
+ el.left.xhr.readystateContent.update("");
+ el.left.xhr.responseContent.update("");
+ for(var i=0; i<d.xhr.objects.length; i++){
+ var item = d.xhr.objects[i];
+ var response = item[1].responseText;
+ if(Boolean(item[1])==false)continue;
+ el.left.xhr.nameContent.child.add(new pi.element("span").update(item[0]));
+ try { 
+ el.left.xhr.statusContent.child.add(new pi.element("span").update(item[1].status));
+ } catch(e){ el.left.xhr.statusContent.child.add(new pi.element("span").update("&nbsp;")); }
+ el.left.xhr.readystateContent.child.add(new pi.element("span").update(item[1].readyState));
+
+ el.left.xhr.responseContent.child.add(new pi.element("span").child.add(
+ new pi.element("A").event.addListener("click",d.str.open.curry(window,response)).update("&nbsp;"+response.substring(0,50))
+ ));
+ };
+ if(env.dIndex=="xhr")
+ setTimeout(d.xhr.refresh,500);
+ }
+ }
+ },
+ navigateRightColumn:function(_index,_open){
+ with(firebug){
+ el.left.container.environment.addStyle({ "width":_open?"70%":"100%" });
+ el.right.container.environment.addStyle({ "display":_open?"block":"none" });
+ }
+ },
+ navigate:function(_index){
+ with(firebug){
+
+ var open = _index, close = env.dIndex;
+ env.dIndex = open;
+
+ el.button[close].container.environment.addStyle({ "display":"none" });
+ el.left[close].container.environment.addStyle({ "display":"none" });
+ el.right[close].container.environment.addStyle({ "display":"none" });
+
+ el.button[open].container.environment.addStyle({ "display":"inline" });
+ el.left[open].container.environment.addStyle({ "display":"block" });
+ el.right[open].container.environment.addStyle({ "display":"block" });
+
+ if(el.nav[close])
+ el.nav[close].attribute.removeClass("Selected");
+ if(el.nav[open])
+ el.nav[open].attribute.addClass("Selected");
+
+ switch(open){
+ case "console":
+ d.navigateRightColumn(_index);
+ break;
+ case "html":
+ d.navigateRightColumn(_index,true);
+ d.html.openHtmlTree();
+ break;
+ case "css":
+ d.navigateRightColumn(_index,true);
+ d.css.refresh();
+ break;
+ case "scripts":
+ d.navigateRightColumn(_index);
+ d.scripts.refresh();
+ break;
+ case "dom":
+ d.navigateRightColumn(_index);
+ if(el.left.dom.container.environment.getElement().innerHTML=="")
+ d.dom.open(eval(el.button.dom.textbox.environment.getElement().value),el.left.dom.container);
+ break;
+ case "xhr":
+ d.navigateRightColumn(_index);
+ d.xhr.open();
+ break;
+ }
+
+ }
+ },
+ refreshSize:function(){
+ with(firebug){
+ el.main.environment.addStyle({ "width":pi.util.GetWindowSize().width+"px"});
+ if(pi.env.ie6)
+ el.main.environment.addStyle({ "top":pi.util.GetWindowSize().height-el.main.environment.getSize().offsetHeight+"px" });
+ }
+ }
+ },
+ getDomain:function(_url){
+ return _url.match(/http:\/\/(www.)?([\.\w]+)/)[2];
+ },
+ listen: {
+ addXhrObject:function(){
+ with(firebug){
+ d.xhr.addObject.apply(window, el.button.xhr.textbox.environment.getElement().value.split(","));
+ }
+ },
+ consoleTextbox:function(_event){
+ with(firebug){
+ if(_event.keyCode==13&&(env.multilinemode==false||_event.shiftKey==false)){
+ d.console.historyIndex = d.console.history.length;
+ d.console.run(el.left.console.input.environment.getElement().value);
+ return false;
+ }
+ if([13,38,40].indexOf(_event.keyCode)==-1)
+ return;
+ d.console.historyIndex+=_event.keyCode!=40?0:d.console.historyIndex==d.console.history.length?0:1;
+ d.console.historyIndex-=_event.keyCode!=38?0:d.console.historyIndex==0?0:1;
+ el.left.console.input.update(
+ d.console.history.length > d.console.historyIndex ?
+ d.console.history[d.console.historyIndex] :
+ ""
+ );
+ }
+ },
+ cssSelectbox:function(){
+ with(firebug){
+ d.css.open(el.button.css.selectbox.environment.getElement().selectedIndex);
+ }
+ },
+ domTextbox:function(_event){
+ with(firebug){
+ if(_event.keyCode==13){
+ d.dom.open(eval(el.button.dom.textbox.environment.getElement().value),el.left.dom.container);
+ }
+ }
+ },
+ inspector:function(){
+ with(firebug){
+ d.html.inspect(d.inspector.el);
+ }
+ },
+ keyboard:function(_event){
+ with(firebug){
+ if(_event.keyCode==27&&d.inspector.enabled)
+ d.inspector.toggle();
+ }
+ },
+ mouse:function(_event){
+ with(firebug){
+ var target = _event[pi.env.ie?"srcElement":"target"];
+ if(
+ d.inspector.enabled&&
+ target!=document.body&&
+ target!=document.firstChild&&
+ target!=document.childNodes[1]&&
+ target!=el.borderInspector.environment.getElement()&&
+ target!=el.main.environment.getElement()&&
+ target.offsetParent!=el.main.environment.getElement()
+ )
+ d.inspector.inspect(target);
+ }
+ },
+ runMultiline:function(){
+ with(firebug){
+ d.console.run.call(window,el.right.console.input.environment.getElement().value);
+ }
+ },
+ runCSS:function(){
+ with(firebug){
+ var source = el.right.css.input.environment.getElement().value.replace(/\n|\t/g,"").split("}");
+ for(var i=0; i<source.length; i++){
+ var item = source[i]+"}", rule = !pi.env.ie?item:item.split(/{|}/), collection = document.getElementsByTagName("style"),
+ style = collection.length>0?collection[0]:document.body.appendChild( document.createElement("style") );
+ if(!item.match(/.+\{.+\}/))continue;
+ if(pi.env.ie)
+ style.styleSheet.addRule(rule[0],rule[1]);
+ else
+ style.sheet.insertRule( rule, style.sheet.cssRules.length );
+ }
+ }
+ },
+ scriptsSelectbox:function(){
+ with(firebug){
+ d.scripts.open(parseInt(el.button.scripts.selectbox.environment.getElement().value));
+ }
+ },
+ xhrTextbox:function(_event){
+ with(firebug){
+ if(_event.keyCode==13){
+ d.xhr.addObject.apply(window, el.button.xhr.textbox.environment.getElement().value.split(","));
+ }
+ }
+ }
+ }
+};
+
+window.console = firebug.d.console;
+pi.util.AddEvent(window,"resize",firebug.d.refreshSize);
+pi.util.AddEvent(document,"mousemove",firebug.listen.mouse);
+pi.util.AddEvent(document,"keydown",firebug.listen.keyboard);
+pi.util.DOMContentLoaded.push(firebug.init); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_nat_edit/autosuggest.js b/src/usr/local/www/javascript/firewall_nat_edit/autosuggest.js
new file mode 100644
index 0000000..d9b5ac0
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_nat_edit/autosuggest.js
@@ -0,0 +1,337 @@
+
+/**
+ * An autosuggest textbox control.
+ * @class
+ * @scope public
+ */
+function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
+ oProvider /*:SuggestionProvider*/) {
+
+ /**
+ * The currently selected suggestions.
+ * @scope private
+ */
+ this.cur /*:int*/ = -1;
+
+ /**
+ * The dropdown list layer.
+ * @scope private
+ */
+ this.layer = null;
+
+ /**
+ * Suggestion provider for the autosuggest feature.
+ * @scope private.
+ */
+ this.provider /*:SuggestionProvider*/ = oProvider;
+
+ /**
+ * The textbox to capture.
+ * @scope private
+ */
+ this.textbox /*:HTMLInputElement*/ = oTextbox;
+
+ //initialize the control
+ this.init();
+
+}
+
+/**
+ * Autosuggests one or more suggestions for what the user has typed.
+ * If no suggestions are passed in, then no autosuggest occurs.
+ * @scope private
+ * @param aSuggestions An array of suggestion strings.
+ * @param bTypeAhead If the control should provide a type ahead suggestion.
+ */
+AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
+ bTypeAhead /*:boolean*/) {
+
+ //make sure there's at least one suggestion
+ if (aSuggestions.length > 0) {
+ if (bTypeAhead) {
+ this.typeAhead(aSuggestions[0]);
+ }
+
+ this.showSuggestions(aSuggestions);
+ } else {
+ this.hideSuggestions();
+ }
+};
+
+/**
+ * Creates the dropdown layer to display multiple suggestions.
+ * @scope private
+ */
+AutoSuggestControl.prototype.createDropDown = function () {
+
+ var oThis = this;
+
+ //create the layer and assign styles
+ this.layer = document.createElement("div");
+ this.layer.className = "suggestions";
+ this.layer.style.visibility = "hidden";
+ this.layer.style.width = this.textbox.offsetWidth;
+
+ //when the user clicks on the a suggestion, get the text (innerHTML)
+ //and place it into a textbox
+ this.layer.onmousedown =
+ this.layer.onmouseup =
+ this.layer.onmouseover = function (oEvent) {
+ oEvent = oEvent || window.event;
+ oTarget = oEvent.target || oEvent.srcElement;
+
+ if (oEvent.type == "mousedown") {
+ oThis.textbox.value = oTarget.firstChild.nodeValue;
+ oThis.hideSuggestions();
+ } else if (oEvent.type == "mouseover") {
+ oThis.highlightSuggestion(oTarget);
+ } else {
+ oThis.textbox.focus();
+ }
+ };
+
+
+ document.body.appendChild(this.layer);
+};
+
+/**
+ * Gets the left coordinate of the textbox.
+ * @scope private
+ * @return The left coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iLeft = 0;
+
+ while(oNode.tagName != "BODY") {
+ iLeft += oNode.offsetLeft;
+ oNode = oNode.offsetParent;
+ }
+
+ return iLeft;
+};
+
+/**
+ * Gets the top coordinate of the textbox.
+ * @scope private
+ * @return The top coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getTop = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iTop = 0;
+
+ while(oNode.tagName != "BODY") {
+ iTop += oNode.offsetTop;
+ oNode = oNode.offsetParent;
+ }
+
+ return iTop;
+};
+
+/**
+ * Handles three keydown events.
+ * @scope private
+ * @param oEvent The event object for the keydown event.
+ */
+AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
+
+ switch(oEvent.keyCode) {
+ case 38: //up arrow
+ this.previousSuggestion();
+ break;
+ case 40: //down arrow
+ this.nextSuggestion();
+ break;
+ case 13: //enter
+ this.hideSuggestions();
+ break;
+ }
+
+};
+
+/**
+ * Handles keyup events.
+ * @scope private
+ * @param oEvent The event object for the keyup event.
+ */
+AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
+
+ var iKeyCode = oEvent.keyCode;
+
+ //for backspace (8) and delete (46), shows suggestions without typeahead
+ if (iKeyCode == 8 || iKeyCode == 46) {
+ this.provider.requestSuggestions(this, false);
+
+ //make sure not to interfere with non-character keys
+ } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
+ //ignore
+ } else {
+ //request suggestions from the suggestion provider with typeahead
+ this.provider.requestSuggestions(this, true);
+ }
+};
+
+/**
+ * Hides the suggestion dropdown.
+ * @scope private
+ */
+AutoSuggestControl.prototype.hideSuggestions = function () {
+ this.layer.style.visibility = "hidden";
+};
+
+/**
+ * Highlights the given node in the suggestions dropdown.
+ * @scope private
+ * @param oSuggestionNode The node representing a suggestion in the dropdown.
+ */
+AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
+
+ for (var i=0; i < this.layer.childNodes.length; i++) {
+ var oNode = this.layer.childNodes[i];
+ if (oNode == oSuggestionNode) {
+ oNode.className = "current";
+ } else if (oNode.className == "current") {
+ oNode.className = "";
+ }
+ }
+};
+
+/**
+ * Initializes the textbox with event handlers for
+ * auto suggest functionality.
+ * @scope private
+ */
+AutoSuggestControl.prototype.init = function () {
+
+ //save a reference to this object
+ var oThis = this;
+
+ //assign the onkeyup event handler
+ this.textbox.onkeyup = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyUp() method with the event object
+ oThis.handleKeyUp(oEvent);
+ };
+
+ //assign onkeydown event handler
+ this.textbox.onkeydown = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyDown() method with the event object
+ oThis.handleKeyDown(oEvent);
+ };
+
+ //assign onblur event handler (hides suggestions)
+ this.textbox.onblur = function () {
+ oThis.hideSuggestions();
+ };
+
+ //create the suggestions dropdown
+ this.createDropDown();
+};
+
+/**
+ * Highlights the next suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.nextSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
+ var oNode = cSuggestionNodes[++this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Highlights the previous suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.previousSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur > 0) {
+ var oNode = cSuggestionNodes[--this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Selects a range of text in the textbox.
+ * @scope public
+ * @param iStart The start index (base 0) of the selection.
+ * @param iLength The number of characters to select.
+ */
+AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
+
+ //use text ranges for Internet Explorer
+ if (this.textbox.createTextRange) {
+ var oRange = this.textbox.createTextRange();
+ oRange.moveStart("character", iStart);
+ oRange.moveEnd("character", iLength - this.textbox.value.length);
+ oRange.select();
+
+ //use setSelectionRange() for Mozilla
+ } else if (this.textbox.setSelectionRange) {
+ this.textbox.setSelectionRange(iStart, iLength);
+ }
+
+ //set focus back to the textbox
+ this.textbox.focus();
+};
+
+/**
+ * Builds the suggestion layer contents, moves it into position,
+ * and displays the layer.
+ * @scope private
+ * @param aSuggestions An array of suggestions for the control.
+ */
+AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
+
+ var oDiv = null;
+ this.layer.innerHTML = ""; //clear contents of the layer
+
+ for (var i=0; i < aSuggestions.length; i++) {
+ oDiv = document.createElement("div");
+ oDiv.appendChild(document.createTextNode(aSuggestions[i]));
+ this.layer.appendChild(oDiv);
+ }
+
+ this.layer.style.left = this.getLeft() + "px";
+ this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
+ this.layer.style.width = this.textbox.offsetWidth + "px";
+ this.layer.style.visibility = "visible";
+
+};
+
+/**
+ * Inserts a suggestion into the textbox, highlighting the
+ * suggested part of the text.
+ * @scope private
+ * @param sSuggestion The suggestion for the textbox.
+ */
+AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
+
+ //check for support of typeahead functionality
+ if (this.textbox.createTextRange || this.textbox.setSelectionRange){
+ var iLen = this.textbox.value.length;
+ this.textbox.value = sSuggestion;
+ this.selectRange(iLen, sSuggestion.length);
+ }
+};
+
diff --git a/src/usr/local/www/javascript/firewall_nat_edit/disablekeys.js b/src/usr/local/www/javascript/firewall_nat_edit/disablekeys.js
new file mode 100644
index 0000000..5d6c87a
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_nat_edit/disablekeys.js
@@ -0,0 +1,6 @@
+function kH(e) {
+ var pK = document.all? window.event.keyCode:e.which;
+ return pK != 13;
+}
+document.onkeypress = kH;
+if (document.layers) document.captureEvents(Event.KEYPRESS); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_nat_edit/firewall_nat_edit.js b/src/usr/local/www/javascript/firewall_nat_edit/firewall_nat_edit.js
new file mode 100644
index 0000000..7007b40
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_nat_edit/firewall_nat_edit.js
@@ -0,0 +1,203 @@
+//<![CDATA[
+var portsenabled = 1;
+var dstenabled = 1;
+var showsource = 0;
+
+function ext_change() {
+ if ((document.iform.srcbeginport.selectedIndex == 0) && portsenabled) {
+ document.iform.srcbeginport_cust.disabled = 0;
+ } else {
+ document.iform.srcbeginport_cust.value = "";
+ document.iform.srcbeginport_cust.disabled = 1;
+ }
+ if ((document.iform.srcendport.selectedIndex == 0) && portsenabled) {
+ document.iform.srcendport_cust.disabled = 0;
+ } else {
+ document.iform.srcendport_cust.value = "";
+ document.iform.srcendport_cust.disabled = 1;
+ }
+ if ((document.iform.dstbeginport.selectedIndex == 0) && portsenabled && dstenabled) {
+ document.iform.dstbeginport_cust.disabled = 0;
+ } else {
+ document.iform.dstbeginport_cust.value = "";
+ document.iform.dstbeginport_cust.disabled = 1;
+ }
+ if ((document.iform.dstendport.selectedIndex == 0) && portsenabled && dstenabled) {
+ document.iform.dstendport_cust.disabled = 0;
+ } else {
+ document.iform.dstendport_cust.value = "";
+ document.iform.dstendport_cust.disabled = 1;
+ }
+
+ if ((document.iform.localbeginport.selectedIndex == 0) && portsenabled) {
+ document.iform.localbeginport_cust.disabled = 0;
+ } else {
+ document.iform.localbeginport_cust.value = "";
+ document.iform.localbeginport_cust.disabled = 1;
+ }
+
+ if (!portsenabled) {
+ document.iform.srcbeginport.disabled = 1;
+ document.iform.srcendport.disabled = 1;
+ document.iform.dstbeginport.disabled = 1;
+ document.iform.dstendport.disabled = 1;
+ document.iform.localbeginport_cust.disabled = 1;
+ } else {
+ document.iform.srcbeginport.disabled = 0;
+ document.iform.srcendport.disabled = 0;
+ document.iform.localbeginport_cust.disabled = 0;
+ if( dstenabled ) {
+ document.iform.dstbeginport.disabled = 0;
+ document.iform.dstendport.disabled = 0;
+ }
+ }
+}
+
+function nordr_change() {
+ if (document.iform.nordr.checked) {
+ document.getElementById("localiptable").style.display = 'none';
+ document.getElementById("lprtr").style.display = 'none';
+ document.getElementById("assoctable").style.display = 'none';
+ } else {
+ document.getElementById("localiptable").style.display = '';
+ document.getElementById("lprtr").style.display = portsenabled ? '' : 'none';
+ document.getElementById("assoctable").style.display = '';
+ }
+}
+
+function show_source() {
+ if(portsenabled)
+ document.getElementById("sprtable").style.display = '';
+
+ document.getElementById("srctable").style.display = '';
+ document.getElementById("showadvancedboxsrc").style.display = 'none';
+ showsource = 1;
+}
+
+function check_for_aliases() {
+ /* if External port range is an alias, then disallow
+ * entry of Local port
+ */
+ for(i=0; i<customarray.length; i++) {
+ if(document.iform.dstbeginport_cust.value == customarray[i]) {
+ document.iform.dstendport_cust.value = customarray[i];
+ document.iform.localbeginport_cust.value = customarray[i];
+ document.iform.dstendport_cust.disabled = 1;
+ document.iform.localbeginport.disabled = 1;
+ document.iform.localbeginport_cust.disabled = 1;
+ document.iform.dstendport_cust.disabled = 0;
+ document.iform.localbeginport.disabled = 0;
+ document.iform.localbeginport_cust.disabled = 0;
+ }
+ if(document.iform.dstbeginport.value == customarray[i]) {
+ document.iform.dstendport_cust.value = customarray[i];
+ document.iform.localbeginport_cust.value = customarray[i];
+ document.iform.dstendport_cust.disabled = 1;
+ document.iform.localbeginport.disabled = 1;
+ document.iform.localbeginport_cust.disabled = 1;
+ document.iform.dstendport_cust.disabled = 0;
+ document.iform.localbeginport.disabled = 0;
+ document.iform.localbeginport_cust.disabled = 0;
+ }
+ if(document.iform.dstendport_cust.value == customarray[i]) {
+ document.iform.dstendport_cust.value = customarray[i];
+ document.iform.localbeginport_cust.value = customarray[i];
+ document.iform.dstendport_cust.disabled = 1;
+ document.iform.localbeginport.disabled = 1;
+ document.iform.localbeginport_cust.disabled = 1;
+ document.iform.dstendport_cust.disabled = 0;
+ document.iform.localbeginport.disabled = 0;
+ document.iform.localbeginport_cust.disabled = 0;
+ }
+ if(document.iform.dstendport.value == customarray[i]) {
+ document.iform.dstendport_cust.value = customarray[i];
+ document.iform.localbeginport_cust.value = customarray[i];
+ document.iform.dstendport_cust.disabled = 1;
+ document.iform.localbeginport.disabled = 1;
+ document.iform.localbeginport_cust.disabled = 1;
+ document.iform.dstendport_cust.disabled = 0;
+ document.iform.localbeginport.disabled = 0;
+ document.iform.localbeginport_cust.disabled = 0;
+ }
+
+ }
+}
+
+function proto_change() {
+ if (document.iform.proto.selectedIndex >= 0 && document.iform.proto.selectedIndex <= 2) {
+ portsenabled = 1;
+ } else {
+ portsenabled = 0;
+ }
+
+ if (portsenabled) {
+ document.getElementById("sprtable").style.display = showsource == 1 ? '':'none';
+ document.getElementById("dprtr").style.display = '';
+ document.getElementById("lprtr").style.display = document.iform.nordr.checked ? 'none' : '';
+ } else {
+ document.getElementById("sprtable").style.display = 'none';
+ document.getElementById("dprtr").style.display = 'none';
+ document.getElementById("lprtr").style.display = 'none';
+ document.getElementById("dstbeginport").selectedIndex = 0;
+ document.getElementById("dstbeginport_cust").value = "";
+ document.getElementById("dstendport").selectedIndex = 0;
+ document.getElementById("dstendport_cust").value = "";
+ document.getElementById("localbeginport").selectedIndex = 0;
+ document.getElementById("localbeginport_cust").value = "";
+ }
+}
+
+function typesel_change() {
+ switch (document.iform.srctype.selectedIndex) {
+ case 1: /* single */
+ document.iform.src.disabled = 0;
+ document.iform.srcmask.value = "";
+ document.iform.srcmask.disabled = 1;
+ break;
+ case 2: /* network */
+ document.iform.src.disabled = 0;
+ document.iform.srcmask.disabled = 0;
+ break;
+ default:
+ document.iform.src.value = "";
+ document.iform.src.disabled = 1;
+ document.iform.srcmask.value = "";
+ document.iform.srcmask.disabled = 1;
+ break;
+ }
+ if( dstenabled )
+ {
+ switch (document.iform.dsttype.selectedIndex) {
+ case 1: /* single */
+ document.iform.dst.disabled = 0;
+ document.iform.dstmask.value = "";
+ document.iform.dstmask.disabled = 1;
+ break;
+ case 2: /* network */
+ document.iform.dst.disabled = 0;
+ document.iform.dstmask.disabled = 0;
+ break;
+ default:
+ document.iform.dst.value = "";
+ document.iform.dst.disabled = 1;
+ document.iform.dstmask.value = "";
+ document.iform.dstmask.disabled = 1;
+ break;
+ }
+ }
+}
+
+function src_rep_change() {
+ document.iform.srcendport.selectedIndex = document.iform.srcbeginport.selectedIndex;
+}
+
+function dst_rep_change() {
+ document.iform.dstendport.selectedIndex = document.iform.dstbeginport.selectedIndex;
+}
+
+function dst_change( iface, old_iface, old_dst ) {
+ if ( ( old_dst == "" ) || ( old_iface.concat("ip") == old_dst ) ) {
+ document.iform.dsttype.value = iface.concat("ip");
+ }
+}
+//]]>
diff --git a/src/usr/local/www/javascript/firewall_nat_edit/suggestions.js b/src/usr/local/www/javascript/firewall_nat_edit/suggestions.js
new file mode 100644
index 0000000..4d1e127
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_nat_edit/suggestions.js
@@ -0,0 +1,33 @@
+
+/**
+ * Provides suggestions for state names (USA).
+ * @class
+ * @scope public
+ */
+function StateSuggestions(text) {
+ this.states = text;
+}
+
+/**
+ * Request suggestions for the given autosuggest control.
+ * @scope protected
+ * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
+ */
+StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
+ bTypeAhead /*:boolean*/) {
+ var aSuggestions = [];
+ var sTextboxValue = oAutoSuggestControl.textbox.value;
+
+ if (sTextboxValue.length > 0){
+
+ //search for matching states
+ for (var i=0; i < this.states.length; i++) {
+ if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
+ aSuggestions.push(this.states[i]);
+ }
+ }
+ }
+
+ //provide suggestions to the control
+ oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
+};
diff --git a/src/usr/local/www/javascript/firewall_rules_edit/autosuggest.js b/src/usr/local/www/javascript/firewall_rules_edit/autosuggest.js
new file mode 100644
index 0000000..d9b5ac0
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_rules_edit/autosuggest.js
@@ -0,0 +1,337 @@
+
+/**
+ * An autosuggest textbox control.
+ * @class
+ * @scope public
+ */
+function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
+ oProvider /*:SuggestionProvider*/) {
+
+ /**
+ * The currently selected suggestions.
+ * @scope private
+ */
+ this.cur /*:int*/ = -1;
+
+ /**
+ * The dropdown list layer.
+ * @scope private
+ */
+ this.layer = null;
+
+ /**
+ * Suggestion provider for the autosuggest feature.
+ * @scope private.
+ */
+ this.provider /*:SuggestionProvider*/ = oProvider;
+
+ /**
+ * The textbox to capture.
+ * @scope private
+ */
+ this.textbox /*:HTMLInputElement*/ = oTextbox;
+
+ //initialize the control
+ this.init();
+
+}
+
+/**
+ * Autosuggests one or more suggestions for what the user has typed.
+ * If no suggestions are passed in, then no autosuggest occurs.
+ * @scope private
+ * @param aSuggestions An array of suggestion strings.
+ * @param bTypeAhead If the control should provide a type ahead suggestion.
+ */
+AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
+ bTypeAhead /*:boolean*/) {
+
+ //make sure there's at least one suggestion
+ if (aSuggestions.length > 0) {
+ if (bTypeAhead) {
+ this.typeAhead(aSuggestions[0]);
+ }
+
+ this.showSuggestions(aSuggestions);
+ } else {
+ this.hideSuggestions();
+ }
+};
+
+/**
+ * Creates the dropdown layer to display multiple suggestions.
+ * @scope private
+ */
+AutoSuggestControl.prototype.createDropDown = function () {
+
+ var oThis = this;
+
+ //create the layer and assign styles
+ this.layer = document.createElement("div");
+ this.layer.className = "suggestions";
+ this.layer.style.visibility = "hidden";
+ this.layer.style.width = this.textbox.offsetWidth;
+
+ //when the user clicks on the a suggestion, get the text (innerHTML)
+ //and place it into a textbox
+ this.layer.onmousedown =
+ this.layer.onmouseup =
+ this.layer.onmouseover = function (oEvent) {
+ oEvent = oEvent || window.event;
+ oTarget = oEvent.target || oEvent.srcElement;
+
+ if (oEvent.type == "mousedown") {
+ oThis.textbox.value = oTarget.firstChild.nodeValue;
+ oThis.hideSuggestions();
+ } else if (oEvent.type == "mouseover") {
+ oThis.highlightSuggestion(oTarget);
+ } else {
+ oThis.textbox.focus();
+ }
+ };
+
+
+ document.body.appendChild(this.layer);
+};
+
+/**
+ * Gets the left coordinate of the textbox.
+ * @scope private
+ * @return The left coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iLeft = 0;
+
+ while(oNode.tagName != "BODY") {
+ iLeft += oNode.offsetLeft;
+ oNode = oNode.offsetParent;
+ }
+
+ return iLeft;
+};
+
+/**
+ * Gets the top coordinate of the textbox.
+ * @scope private
+ * @return The top coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getTop = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iTop = 0;
+
+ while(oNode.tagName != "BODY") {
+ iTop += oNode.offsetTop;
+ oNode = oNode.offsetParent;
+ }
+
+ return iTop;
+};
+
+/**
+ * Handles three keydown events.
+ * @scope private
+ * @param oEvent The event object for the keydown event.
+ */
+AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
+
+ switch(oEvent.keyCode) {
+ case 38: //up arrow
+ this.previousSuggestion();
+ break;
+ case 40: //down arrow
+ this.nextSuggestion();
+ break;
+ case 13: //enter
+ this.hideSuggestions();
+ break;
+ }
+
+};
+
+/**
+ * Handles keyup events.
+ * @scope private
+ * @param oEvent The event object for the keyup event.
+ */
+AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
+
+ var iKeyCode = oEvent.keyCode;
+
+ //for backspace (8) and delete (46), shows suggestions without typeahead
+ if (iKeyCode == 8 || iKeyCode == 46) {
+ this.provider.requestSuggestions(this, false);
+
+ //make sure not to interfere with non-character keys
+ } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
+ //ignore
+ } else {
+ //request suggestions from the suggestion provider with typeahead
+ this.provider.requestSuggestions(this, true);
+ }
+};
+
+/**
+ * Hides the suggestion dropdown.
+ * @scope private
+ */
+AutoSuggestControl.prototype.hideSuggestions = function () {
+ this.layer.style.visibility = "hidden";
+};
+
+/**
+ * Highlights the given node in the suggestions dropdown.
+ * @scope private
+ * @param oSuggestionNode The node representing a suggestion in the dropdown.
+ */
+AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
+
+ for (var i=0; i < this.layer.childNodes.length; i++) {
+ var oNode = this.layer.childNodes[i];
+ if (oNode == oSuggestionNode) {
+ oNode.className = "current";
+ } else if (oNode.className == "current") {
+ oNode.className = "";
+ }
+ }
+};
+
+/**
+ * Initializes the textbox with event handlers for
+ * auto suggest functionality.
+ * @scope private
+ */
+AutoSuggestControl.prototype.init = function () {
+
+ //save a reference to this object
+ var oThis = this;
+
+ //assign the onkeyup event handler
+ this.textbox.onkeyup = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyUp() method with the event object
+ oThis.handleKeyUp(oEvent);
+ };
+
+ //assign onkeydown event handler
+ this.textbox.onkeydown = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyDown() method with the event object
+ oThis.handleKeyDown(oEvent);
+ };
+
+ //assign onblur event handler (hides suggestions)
+ this.textbox.onblur = function () {
+ oThis.hideSuggestions();
+ };
+
+ //create the suggestions dropdown
+ this.createDropDown();
+};
+
+/**
+ * Highlights the next suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.nextSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
+ var oNode = cSuggestionNodes[++this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Highlights the previous suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.previousSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur > 0) {
+ var oNode = cSuggestionNodes[--this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Selects a range of text in the textbox.
+ * @scope public
+ * @param iStart The start index (base 0) of the selection.
+ * @param iLength The number of characters to select.
+ */
+AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
+
+ //use text ranges for Internet Explorer
+ if (this.textbox.createTextRange) {
+ var oRange = this.textbox.createTextRange();
+ oRange.moveStart("character", iStart);
+ oRange.moveEnd("character", iLength - this.textbox.value.length);
+ oRange.select();
+
+ //use setSelectionRange() for Mozilla
+ } else if (this.textbox.setSelectionRange) {
+ this.textbox.setSelectionRange(iStart, iLength);
+ }
+
+ //set focus back to the textbox
+ this.textbox.focus();
+};
+
+/**
+ * Builds the suggestion layer contents, moves it into position,
+ * and displays the layer.
+ * @scope private
+ * @param aSuggestions An array of suggestions for the control.
+ */
+AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
+
+ var oDiv = null;
+ this.layer.innerHTML = ""; //clear contents of the layer
+
+ for (var i=0; i < aSuggestions.length; i++) {
+ oDiv = document.createElement("div");
+ oDiv.appendChild(document.createTextNode(aSuggestions[i]));
+ this.layer.appendChild(oDiv);
+ }
+
+ this.layer.style.left = this.getLeft() + "px";
+ this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
+ this.layer.style.width = this.textbox.offsetWidth + "px";
+ this.layer.style.visibility = "visible";
+
+};
+
+/**
+ * Inserts a suggestion into the textbox, highlighting the
+ * suggested part of the text.
+ * @scope private
+ * @param sSuggestion The suggestion for the textbox.
+ */
+AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
+
+ //check for support of typeahead functionality
+ if (this.textbox.createTextRange || this.textbox.setSelectionRange){
+ var iLen = this.textbox.value.length;
+ this.textbox.value = sSuggestion;
+ this.selectRange(iLen, sSuggestion.length);
+ }
+};
+
diff --git a/src/usr/local/www/javascript/firewall_rules_edit/disablekeys.js b/src/usr/local/www/javascript/firewall_rules_edit/disablekeys.js
new file mode 100644
index 0000000..5d6c87a
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_rules_edit/disablekeys.js
@@ -0,0 +1,6 @@
+function kH(e) {
+ var pK = document.all? window.event.keyCode:e.which;
+ return pK != 13;
+}
+document.onkeypress = kH;
+if (document.layers) document.captureEvents(Event.KEYPRESS); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_rules_edit/firewall_rules_edit.js b/src/usr/local/www/javascript/firewall_rules_edit/firewall_rules_edit.js
new file mode 100644
index 0000000..de1ff0c
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_rules_edit/firewall_rules_edit.js
@@ -0,0 +1,237 @@
+//<![CDATA[
+var portsenabled = 1;
+var editenabled = 1;
+
+function ext_change() {
+ if ((document.iform.srcbeginport.selectedIndex == 0) && portsenabled && editenabled) {
+ document.iform.srcbeginport_cust.disabled = 0;
+ } else {
+ if (editenabled)
+ document.iform.srcbeginport_cust.value = "";
+ document.iform.srcbeginport_cust.disabled = 1;
+ }
+ if ((document.iform.srcendport.selectedIndex == 0) && portsenabled && editenabled) {
+ document.iform.srcendport_cust.disabled = 0;
+ } else {
+ if (editenabled)
+ document.iform.srcendport_cust.value = "";
+ document.iform.srcendport_cust.disabled = 1;
+ }
+ if ((document.iform.dstbeginport.selectedIndex == 0) && portsenabled && editenabled) {
+ document.iform.dstbeginport_cust.disabled = 0;
+ } else {
+ if (editenabled)
+ document.iform.dstbeginport_cust.value = "";
+ document.iform.dstbeginport_cust.disabled = 1;
+ }
+ if ((document.iform.dstendport.selectedIndex == 0) && portsenabled && editenabled) {
+ document.iform.dstendport_cust.disabled = 0;
+ } else {
+ if (editenabled)
+ document.iform.dstendport_cust.value = "";
+ document.iform.dstendport_cust.disabled = 1;
+ }
+
+ if (!portsenabled) {
+ document.iform.srcbeginport.disabled = 1;
+ document.iform.srcendport.disabled = 1;
+ document.iform.dstbeginport.disabled = 1;
+ document.iform.dstendport.disabled = 1;
+ } else {
+ if( editenabled ) {
+ document.iform.srcbeginport.disabled = 0;
+ document.iform.srcendport.disabled = 0;
+ document.iform.dstbeginport.disabled = 0;
+ document.iform.dstendport.disabled = 0;
+ }
+ }
+}
+
+function show_source_port_range() {
+ if (portsenabled) {
+ document.getElementById("sprtable").style.display = '';
+ document.getElementById("showadvancedboxspr").style.display = 'none';
+ }
+}
+
+function typesel_change() {
+ if( editenabled ) {
+ switch (document.iform.srctype.selectedIndex) {
+ case 1: /* single */
+ document.iform.src.disabled = 0;
+ document.iform.srcmask.value = "";
+ document.iform.srcmask.disabled = 1;
+ break;
+ case 2: /* network */
+ document.iform.src.disabled = 0;
+ document.iform.srcmask.disabled = 0;
+ break;
+ default:
+ document.iform.src.value = "";
+ document.iform.src.disabled = 1;
+ document.iform.srcmask.value = "";
+ document.iform.srcmask.disabled = 1;
+ break;
+ }
+ switch (document.iform.dsttype.selectedIndex) {
+ case 1: /* single */
+ document.iform.dst.disabled = 0;
+ document.iform.dstmask.value = "";
+ document.iform.dstmask.disabled = 1;
+ break;
+ case 2: /* network */
+ document.iform.dst.disabled = 0;
+ document.iform.dstmask.disabled = 0;
+ break;
+ default:
+ document.iform.dst.value = "";
+ document.iform.dst.disabled = 1;
+ document.iform.dstmask.value = "";
+ document.iform.dstmask.disabled = 1;
+ break;
+ }
+ }
+}
+
+function proto_change() {
+ if (document.iform.proto.selectedIndex < 3) {
+ portsenabled = 1;
+ document.getElementById("tcpflags").style.display = '';
+ } else {
+ portsenabled = 0;
+ document.getElementById("tcpflags").style.display = 'none';
+ }
+
+ /* Disable OS knob if the proto is not TCP. */
+ if (document.iform.proto.selectedIndex < 1) {
+ document.forms[0].os.disabled = 0;
+ } else {
+ document.forms[0].os.disabled = 1;
+ }
+
+ if (document.iform.proto.selectedIndex == 3) {
+ document.iform.icmptype.disabled = 0;
+ document.iform.icmp6type.disabled = 0;
+ } else {
+ document.iform.icmptype.disabled = 1;
+ document.iform.icmp6type.disabled = 1;
+ }
+
+ ext_change();
+
+ if(document.iform.proto.selectedIndex == 3 || document.iform.proto.selectedIndex == 4) {
+ if(document.iform.ipprotocol.selectedIndex == 0) { // IPv4
+ document.getElementById("icmpbox").style.display = '';
+ document.getElementById("icmp6box").style.display = 'none';
+ } else if(document.iform.ipprotocol.selectedIndex == 1) { // IPv6
+ document.getElementById("icmpbox").style.display = 'none';
+ document.getElementById("icmp6box").style.display = '';
+ } else { // IPv4 + IPv6
+ document.getElementById("icmpbox").style.display = 'none';
+ document.getElementById("icmp6box").style.display = 'none';
+ }
+ } else {
+ document.getElementById("icmpbox").style.display = 'none';
+ document.getElementById("icmp6box").style.display = 'none';
+ }
+
+ if(document.iform.proto.selectedIndex >= 0 && document.iform.proto.selectedIndex <= 2) {
+ document.getElementById("dprtr").style.display = '';
+ if (editenabled) {
+ document.getElementById("showadvancedboxspr").style.display = 'table-row';
+ }
+ } else {
+ document.getElementById("sprtable").style.display = 'none';
+ document.getElementById("dprtr").style.display = 'none';
+ document.getElementById("showadvancedboxspr").style.display = 'none';
+ }
+}
+
+function show_aodiv() {
+ document.getElementById("aoadv").innerHTML='';
+ aodiv = document.getElementById('aodivmain');
+ aodiv.style.display = "block";
+}
+
+function show_dsdiv() {
+ document.getElementById("dsadv").innerHTML='';
+ dsdiv = document.getElementById('dsdivmain');
+ dsdiv.style.display = "block";
+}
+
+function show_advanced_noxmlrpc() {
+ document.getElementById("showadvnoxmlrpcsyncbox").innerHTML='';
+ aodiv = document.getElementById('shownoxmlrpcadv');
+ aodiv.style.display = "block";
+}
+
+function show_advanced_vlanprio() {
+ document.getElementById("showadvvlanpriobox").innerHTML='';
+ aodiv = document.getElementById('showvlanprioadv');
+ aodiv.style.display = "block";
+}
+
+function show_advanced_schedule() {
+ document.getElementById("showadvschedulebox").innerHTML='';
+ aodiv = document.getElementById('showscheduleadv');
+ aodiv.style.display = "block";
+}
+
+function show_advanced_gateway() {
+ document.getElementById("showadvgatewaybox").innerHTML='';
+ aodiv = document.getElementById('showgatewayadv');
+ aodiv.style.display = "block";
+}
+
+function show_advanced_sourceos() {
+ document.getElementById("showadvsourceosbox").innerHTML='';
+ aodiv = document.getElementById('showsourceosadv');
+ aodiv.style.display = "block";
+}
+
+function show_advanced_ackqueue() {
+ document.getElementById("showadvackqueuebox").innerHTML='';
+ aodiv = document.getElementById('showackqueueadv');
+ aodiv.style.display = "block";
+}
+
+function show_advanced_inout() {
+ document.getElementById("showadvinoutbox").innerHTML='';
+ aodiv = document.getElementById('showinoutadv');
+ aodiv.style.display = "block";
+}
+
+function show_advanced_state() {
+ document.getElementById("showadvstatebox").innerHTML='';
+ aodiv = document.getElementById('showstateadv');
+ aodiv.style.display = "block";
+}
+
+function show_advanced_tcpflags() {
+ document.getElementById("showtcpflagsbox").innerHTML='';
+ aodiv = document.getElementById('showtcpflagsadv');
+ aodiv.style.display = "block";
+}
+
+function show_advanced_layer7() {
+ document.getElementById("showadvlayer7box").innerHTML='';
+ aodiv = document.getElementById('showlayer7adv');
+ aodiv.style.display = "block";
+}
+
+function src_rep_change() {
+ document.iform.srcendport.selectedIndex = document.iform.srcbeginport.selectedIndex;
+}
+
+function dst_rep_change() {
+ document.iform.dstendport.selectedIndex = document.iform.dstbeginport.selectedIndex;
+}
+
+function tcpflags_anyclick(obj) {
+ if (obj.checked) {
+ document.getElementById('tcpheader').style.display= 'none';
+ } else {
+ document.getElementById('tcpheader').style.display= "";
+ }
+}
+//]]>
diff --git a/src/usr/local/www/javascript/firewall_rules_edit/suggestions.js b/src/usr/local/www/javascript/firewall_rules_edit/suggestions.js
new file mode 100644
index 0000000..4d1e127
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_rules_edit/suggestions.js
@@ -0,0 +1,33 @@
+
+/**
+ * Provides suggestions for state names (USA).
+ * @class
+ * @scope public
+ */
+function StateSuggestions(text) {
+ this.states = text;
+}
+
+/**
+ * Request suggestions for the given autosuggest control.
+ * @scope protected
+ * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
+ */
+StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
+ bTypeAhead /*:boolean*/) {
+ var aSuggestions = [];
+ var sTextboxValue = oAutoSuggestControl.textbox.value;
+
+ if (sTextboxValue.length > 0){
+
+ //search for matching states
+ for (var i=0; i < this.states.length; i++) {
+ if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
+ aSuggestions.push(this.states[i]);
+ }
+ }
+ }
+
+ //provide suggestions to the control
+ oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
+};
diff --git a/src/usr/local/www/javascript/firewall_shaper_edit/autosuggest.js b/src/usr/local/www/javascript/firewall_shaper_edit/autosuggest.js
new file mode 100644
index 0000000..d9b5ac0
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_shaper_edit/autosuggest.js
@@ -0,0 +1,337 @@
+
+/**
+ * An autosuggest textbox control.
+ * @class
+ * @scope public
+ */
+function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
+ oProvider /*:SuggestionProvider*/) {
+
+ /**
+ * The currently selected suggestions.
+ * @scope private
+ */
+ this.cur /*:int*/ = -1;
+
+ /**
+ * The dropdown list layer.
+ * @scope private
+ */
+ this.layer = null;
+
+ /**
+ * Suggestion provider for the autosuggest feature.
+ * @scope private.
+ */
+ this.provider /*:SuggestionProvider*/ = oProvider;
+
+ /**
+ * The textbox to capture.
+ * @scope private
+ */
+ this.textbox /*:HTMLInputElement*/ = oTextbox;
+
+ //initialize the control
+ this.init();
+
+}
+
+/**
+ * Autosuggests one or more suggestions for what the user has typed.
+ * If no suggestions are passed in, then no autosuggest occurs.
+ * @scope private
+ * @param aSuggestions An array of suggestion strings.
+ * @param bTypeAhead If the control should provide a type ahead suggestion.
+ */
+AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
+ bTypeAhead /*:boolean*/) {
+
+ //make sure there's at least one suggestion
+ if (aSuggestions.length > 0) {
+ if (bTypeAhead) {
+ this.typeAhead(aSuggestions[0]);
+ }
+
+ this.showSuggestions(aSuggestions);
+ } else {
+ this.hideSuggestions();
+ }
+};
+
+/**
+ * Creates the dropdown layer to display multiple suggestions.
+ * @scope private
+ */
+AutoSuggestControl.prototype.createDropDown = function () {
+
+ var oThis = this;
+
+ //create the layer and assign styles
+ this.layer = document.createElement("div");
+ this.layer.className = "suggestions";
+ this.layer.style.visibility = "hidden";
+ this.layer.style.width = this.textbox.offsetWidth;
+
+ //when the user clicks on the a suggestion, get the text (innerHTML)
+ //and place it into a textbox
+ this.layer.onmousedown =
+ this.layer.onmouseup =
+ this.layer.onmouseover = function (oEvent) {
+ oEvent = oEvent || window.event;
+ oTarget = oEvent.target || oEvent.srcElement;
+
+ if (oEvent.type == "mousedown") {
+ oThis.textbox.value = oTarget.firstChild.nodeValue;
+ oThis.hideSuggestions();
+ } else if (oEvent.type == "mouseover") {
+ oThis.highlightSuggestion(oTarget);
+ } else {
+ oThis.textbox.focus();
+ }
+ };
+
+
+ document.body.appendChild(this.layer);
+};
+
+/**
+ * Gets the left coordinate of the textbox.
+ * @scope private
+ * @return The left coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iLeft = 0;
+
+ while(oNode.tagName != "BODY") {
+ iLeft += oNode.offsetLeft;
+ oNode = oNode.offsetParent;
+ }
+
+ return iLeft;
+};
+
+/**
+ * Gets the top coordinate of the textbox.
+ * @scope private
+ * @return The top coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getTop = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iTop = 0;
+
+ while(oNode.tagName != "BODY") {
+ iTop += oNode.offsetTop;
+ oNode = oNode.offsetParent;
+ }
+
+ return iTop;
+};
+
+/**
+ * Handles three keydown events.
+ * @scope private
+ * @param oEvent The event object for the keydown event.
+ */
+AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
+
+ switch(oEvent.keyCode) {
+ case 38: //up arrow
+ this.previousSuggestion();
+ break;
+ case 40: //down arrow
+ this.nextSuggestion();
+ break;
+ case 13: //enter
+ this.hideSuggestions();
+ break;
+ }
+
+};
+
+/**
+ * Handles keyup events.
+ * @scope private
+ * @param oEvent The event object for the keyup event.
+ */
+AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
+
+ var iKeyCode = oEvent.keyCode;
+
+ //for backspace (8) and delete (46), shows suggestions without typeahead
+ if (iKeyCode == 8 || iKeyCode == 46) {
+ this.provider.requestSuggestions(this, false);
+
+ //make sure not to interfere with non-character keys
+ } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
+ //ignore
+ } else {
+ //request suggestions from the suggestion provider with typeahead
+ this.provider.requestSuggestions(this, true);
+ }
+};
+
+/**
+ * Hides the suggestion dropdown.
+ * @scope private
+ */
+AutoSuggestControl.prototype.hideSuggestions = function () {
+ this.layer.style.visibility = "hidden";
+};
+
+/**
+ * Highlights the given node in the suggestions dropdown.
+ * @scope private
+ * @param oSuggestionNode The node representing a suggestion in the dropdown.
+ */
+AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
+
+ for (var i=0; i < this.layer.childNodes.length; i++) {
+ var oNode = this.layer.childNodes[i];
+ if (oNode == oSuggestionNode) {
+ oNode.className = "current";
+ } else if (oNode.className == "current") {
+ oNode.className = "";
+ }
+ }
+};
+
+/**
+ * Initializes the textbox with event handlers for
+ * auto suggest functionality.
+ * @scope private
+ */
+AutoSuggestControl.prototype.init = function () {
+
+ //save a reference to this object
+ var oThis = this;
+
+ //assign the onkeyup event handler
+ this.textbox.onkeyup = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyUp() method with the event object
+ oThis.handleKeyUp(oEvent);
+ };
+
+ //assign onkeydown event handler
+ this.textbox.onkeydown = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyDown() method with the event object
+ oThis.handleKeyDown(oEvent);
+ };
+
+ //assign onblur event handler (hides suggestions)
+ this.textbox.onblur = function () {
+ oThis.hideSuggestions();
+ };
+
+ //create the suggestions dropdown
+ this.createDropDown();
+};
+
+/**
+ * Highlights the next suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.nextSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
+ var oNode = cSuggestionNodes[++this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Highlights the previous suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.previousSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur > 0) {
+ var oNode = cSuggestionNodes[--this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Selects a range of text in the textbox.
+ * @scope public
+ * @param iStart The start index (base 0) of the selection.
+ * @param iLength The number of characters to select.
+ */
+AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
+
+ //use text ranges for Internet Explorer
+ if (this.textbox.createTextRange) {
+ var oRange = this.textbox.createTextRange();
+ oRange.moveStart("character", iStart);
+ oRange.moveEnd("character", iLength - this.textbox.value.length);
+ oRange.select();
+
+ //use setSelectionRange() for Mozilla
+ } else if (this.textbox.setSelectionRange) {
+ this.textbox.setSelectionRange(iStart, iLength);
+ }
+
+ //set focus back to the textbox
+ this.textbox.focus();
+};
+
+/**
+ * Builds the suggestion layer contents, moves it into position,
+ * and displays the layer.
+ * @scope private
+ * @param aSuggestions An array of suggestions for the control.
+ */
+AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
+
+ var oDiv = null;
+ this.layer.innerHTML = ""; //clear contents of the layer
+
+ for (var i=0; i < aSuggestions.length; i++) {
+ oDiv = document.createElement("div");
+ oDiv.appendChild(document.createTextNode(aSuggestions[i]));
+ this.layer.appendChild(oDiv);
+ }
+
+ this.layer.style.left = this.getLeft() + "px";
+ this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
+ this.layer.style.width = this.textbox.offsetWidth + "px";
+ this.layer.style.visibility = "visible";
+
+};
+
+/**
+ * Inserts a suggestion into the textbox, highlighting the
+ * suggested part of the text.
+ * @scope private
+ * @param sSuggestion The suggestion for the textbox.
+ */
+AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
+
+ //check for support of typeahead functionality
+ if (this.textbox.createTextRange || this.textbox.setSelectionRange){
+ var iLen = this.textbox.value.length;
+ this.textbox.value = sSuggestion;
+ this.selectRange(iLen, sSuggestion.length);
+ }
+};
+
diff --git a/src/usr/local/www/javascript/firewall_shaper_edit/disablekeys.js b/src/usr/local/www/javascript/firewall_shaper_edit/disablekeys.js
new file mode 100644
index 0000000..5d6c87a
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_shaper_edit/disablekeys.js
@@ -0,0 +1,6 @@
+function kH(e) {
+ var pK = document.all? window.event.keyCode:e.which;
+ return pK != 13;
+}
+document.onkeypress = kH;
+if (document.layers) document.captureEvents(Event.KEYPRESS); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_shaper_edit/firewall_shaper_edit.js b/src/usr/local/www/javascript/firewall_shaper_edit/firewall_shaper_edit.js
new file mode 100644
index 0000000..b1b8df0
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_shaper_edit/firewall_shaper_edit.js
@@ -0,0 +1,37 @@
+//<![CDATA[
+function ext_change() {
+ if (document.iform.beginport.selectedIndex == 0) {
+ document.iform.beginport_cust.disabled = 0;
+ } else {
+ document.iform.beginport_cust.value = "";
+ document.iform.beginport_cust.disabled = 1;
+ }
+ if (document.iform.endport.selectedIndex == 0) {
+ document.iform.endport_cust.disabled = 0;
+ } else {
+ document.iform.endport_cust.value = "";
+ document.iform.endport_cust.disabled = 1;
+ }
+ if (document.iform.localbeginport.selectedIndex == 0) {
+ document.iform.localbeginport_cust.disabled = 0;
+ } else {
+ document.iform.localbeginport_cust.value = "";
+ document.iform.localbeginport_cust.disabled = 1;
+ }
+};
+function ext_rep_change() {
+ document.iform.endport.selectedIndex = document.iform.beginport.selectedIndex;
+ document.iform.localbeginport.selectedIndex = document.iform.beginport.selectedIndex;
+}
+
+
+window.onload = function () {
+ var oTextbox1 = new AutoSuggestControl(document.getElementById("src"), new StateSuggestions(addressarray));
+ var oTextbox2 = new AutoSuggestControl(document.getElementById("srcbeginport_cust"), new StateSuggestions(customarray));
+ var oTextbox3 = new AutoSuggestControl(document.getElementById("srcendport_cust"), new StateSuggestions(customarray));
+ var oTextbox1 = new AutoSuggestControl(document.getElementById("dst"), new StateSuggestions(addressarray));
+ var oTextbox2 = new AutoSuggestControl(document.getElementById("dstbeginport_cust"), new StateSuggestions(customarray));
+ var oTextbox3 = new AutoSuggestControl(document.getElementById("dstendport_cust"), new StateSuggestions(customarray));
+};
+
+//]]> \ No newline at end of file
diff --git a/src/usr/local/www/javascript/firewall_shaper_edit/suggestions.js b/src/usr/local/www/javascript/firewall_shaper_edit/suggestions.js
new file mode 100644
index 0000000..4d1e127
--- /dev/null
+++ b/src/usr/local/www/javascript/firewall_shaper_edit/suggestions.js
@@ -0,0 +1,33 @@
+
+/**
+ * Provides suggestions for state names (USA).
+ * @class
+ * @scope public
+ */
+function StateSuggestions(text) {
+ this.states = text;
+}
+
+/**
+ * Request suggestions for the given autosuggest control.
+ * @scope protected
+ * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
+ */
+StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
+ bTypeAhead /*:boolean*/) {
+ var aSuggestions = [];
+ var sTextboxValue = oAutoSuggestControl.textbox.value;
+
+ if (sTextboxValue.length > 0){
+
+ //search for matching states
+ for (var i=0; i < this.states.length; i++) {
+ if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
+ aSuggestions.push(this.states[i]);
+ }
+ }
+ }
+
+ //provide suggestions to the control
+ oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
+};
diff --git a/src/usr/local/www/javascript/global.js b/src/usr/local/www/javascript/global.js
new file mode 100644
index 0000000..0b67f58
--- /dev/null
+++ b/src/usr/local/www/javascript/global.js
@@ -0,0 +1,43 @@
+var AjaxQueue = {
+ batchSize: 1, //No.of simultaneous AJAX requests allowed, Default : 1
+ urlQueue: [], //Request URLs will be pushed into this array
+ elementsQueue: [], //Element IDs of elements to be updated on completion of a request
+ optionsQueue: [], //Request options will be pushed into this array
+ currentRequest: null,
+ setBatchSize: function(bSize){ //Method to set a different batch size. Recommended: Set batchSize before making requests
+ this.batchSize = bSize;
+ },
+ push: function(url, options, elementID){ //Push the request in the queue. elementID is optional and required only for Ajax requests that updates the element
+ this.urlQueue.push(url);
+ this.optionsQueue.push(options);
+ if(elementID!=null){
+ this.elementsQueue.push(elementID);
+ } else {
+ this.elementsQueue.push("NOTSPECIFIED");
+ }
+
+ this._processNext();
+ },
+ _processNext: function() { // Method for processing the requests in the queue. Private method. Don't call it explicitly
+ if(this.currentRequest == null && this.urlQueue.length > 0) // Check if the currently processing request count is less than batch size
+ {
+ // Call jQuery.ajax on the first item in the queue and remove it from the queue
+ AjaxQueue.currentRequest = jQuery.ajax(AjaxQueue.urlQueue.shift(), AjaxQueue.optionsQueue.shift());
+ AjaxQueue.currentRequest.complete( function() {
+ //Call AjaxQueue._processNext on completion ( success / failure) of this AJAX request.
+ AjaxQueue.currentRequest = null;
+ AjaxQueue._processNext();
+ });
+ if(this.elementsQueue[0]=="NOTSPECIFIED") { //Check if an elementID was specified
+ // If no ElementID was specified remove the first item from the queue
+ var junk = AjaxQueue.elementsQueue.shift();
+ } else {
+ // If ElementID was specified update the first item in the queue and remove it from the queue
+ AjaxQueue.currentRequest.success( function(data) {
+ jQuery(AjaxQueue.elementsQueue.shift()).html(data);
+ });
+ }
+ }
+ }
+};
+
diff --git a/src/usr/local/www/javascript/index/ajax.js b/src/usr/local/www/javascript/index/ajax.js
new file mode 100644
index 0000000..274b8c0
--- /dev/null
+++ b/src/usr/local/www/javascript/index/ajax.js
@@ -0,0 +1,196 @@
+/* Most widgets update their backend data every 10 seconds. 11 seconds
+ * will ensure that we update the GUI right after the stats are updated.
+ * Seconds * 1000 = value
+ */
+var Seconds = 11;
+var update_interval = (Math.abs(Math.ceil(Seconds))-1)*1000 + 990;
+
+function updateMeters() {
+ url = '/getstats.php';
+
+ jQuery.ajax(url, {
+ type: 'get',
+ success: function(data) {
+ response = data || "";
+ if (response != "")
+ stats(data);
+ }
+ });
+ setTimer();
+}
+
+function setTimer() {
+ timeout = window.setTimeout('updateMeters()', update_interval);
+}
+
+function stats(x) {
+ var values = x.split("|");
+ if (jQuery.each(values,function(key,value){
+ if (value == 'undefined' || value == null)
+ return true;
+ else
+ return false;
+ }))
+
+ updateUptime(values[2]);
+ updateDateTime(values[5]);
+ updateCPU(values[0]);
+ updateMemory(values[1]);
+ updateState(values[3]);
+ updateTemp(values[4]);
+ updateInterfaceStats(values[6]);
+ updateInterfaces(values[7]);
+ updateGatewayStats(values[8]);
+ updateCpuFreq(values[9]);
+ updateLoadAverage(values[10]);
+ updateMbuf(values[11]);
+ updateMbufMeter(values[12]);
+ updateStateMeter(values[13]);
+}
+
+function updateMemory(x) {
+ if(jQuery('#memusagemeter'))
+ jQuery("#memusagemeter").html(x + '%');
+ if(jQuery('#memUsagePB'))
+ jQuery('#memUsagePB').progressbar( { value: parseInt(x) } );
+}
+
+function updateMbuf(x) {
+ if(jQuery('#mbuf'))
+ jQuery("#mbuf").html(x);
+}
+
+function updateMbufMeter(x) {
+ if(jQuery('#mbufusagemeter'))
+ jQuery("#mbufusagemeter").html(x + '%');
+ if(jQuery('#mbufPB'))
+ jQuery('#mbufPB').progressbar( { value: parseInt(x) } );
+}
+
+function updateCPU(x) {
+ if(jQuery('#cpumeter'))
+ jQuery("#cpumeter").html(x + '%');
+ if(jQuery('#cpuPB'))
+ jQuery('#cpuPB').progressbar( { value: parseInt(x) } );
+ /* Load CPU Graph widget if enabled */
+ if(widgetActive('cpu_graphs')) {
+ GraphValue(graph[0], x);
+ }
+}
+
+function updateTemp(x) {
+ if(jQuery("#tempmeter"))
+ jQuery("#tempmeter").html(x + '\u00B0' + 'C');
+ if(jQuery('#tempPB'))
+ jQuery("#tempPB").progressbar( { value: parseInt(x) } );
+}
+
+function updateDateTime(x) {
+ if(jQuery('#datetime'))
+ jQuery("#datetime").html(x);
+}
+
+function updateUptime(x) {
+ if(jQuery('#uptime'))
+ jQuery("#uptime").html(x);
+}
+
+function updateState(x) {
+ if(jQuery('#pfstate'))
+ jQuery("#pfstate").html(x);
+}
+
+function updateStateMeter(x) {
+ if(jQuery('#pfstateusagemeter'))
+ jQuery("#pfstateusagemeter").html(x + '%');
+ if(jQuery('#statePB'))
+ jQuery('#statePB').progressbar( { value: parseInt(x) } );
+}
+
+function updateGatewayStats(x){
+ if (widgetActive("gateways")){
+ gateways_split = x.split(",");
+ for (var y=0; y<gateways_split.length; y++){
+ gateways_field_split = gateways_split[y].split("^");
+ if(jQuery('#gateway' + (y + 1))) {
+ jQuery('#gateway' + (y + 1)).html(gateways_field_split[0]);
+ if(gateways_field_split[1]) {
+ jQuery('#gateway' + (y + 1)).css('background-color',gateways_field_split[1]);
+ }
+ }
+ }
+ }
+}
+
+function updateCpuFreq(x) {
+ if(jQuery('#cpufreq'))
+ jQuery("#cpufreq").html(x);
+}
+
+function updateLoadAverage(x) {
+ if(jQuery('#load_average'))
+ jQuery("#load_average").html(x);
+}
+
+function updateInterfaceStats(x){
+ if (widgetActive("interface_statistics")){
+ statistics_split = x.split(",");
+ var counter = 1;
+ for (var y=0; y<statistics_split.length-1; y++){
+ if(jQuery('#stat' + counter)) {
+ jQuery('#stat' + counter).html(statistics_split[y]);
+ counter++;
+ }
+ }
+ }
+}
+
+function updateInterfaces(x){
+ if (widgetActive("interfaces")){
+ interfaces_split = x.split("~");
+ interfaces_split.each(function(iface){
+ details = iface.split("^");
+ if (details[2] == '')
+ ipv4_details = '';
+ else
+ ipv4_details = details[2] + '<br />';
+ switch(details[1]) {
+ case "up":
+ jQuery('#' + details[0] + '-up').css("display","inline");
+ jQuery('#' + details[0] + '-down').css("display","none");
+ jQuery('#' + details[0] + '-block').css("display","none");
+ jQuery('#' + details[0] + '-ip').html(ipv4_details);
+ jQuery('#' + details[0] + '-ipv6').html(details[3]);
+ jQuery('#' + details[0] + '-media').html(details[4]);
+ break;
+ case "down":
+ jQuery('#' + details[0] + '-down').css("display","inline");
+ jQuery('#' + details[0] + '-up').css("display","none");
+ jQuery('#' + details[0] + '-block').css("display","none");
+ jQuery('#' + details[0] + '-ip').html(ipv4_details);
+ jQuery('#' + details[0] + '-ipv6').html(details[3]);
+ jQuery('#' + details[0] + '-media').html(details[4]);
+ break;
+ case "block":
+ jQuery('#' + details[0] + '-block').css("display","inline");
+ jQuery('#' + details[0] + '-down').css("display","none");
+ jQuery('#' + details[0] + '-up').css("display","none");
+ break;
+ }
+ });
+ }
+}
+
+function widgetActive(x) {
+ var widget = jQuery('#' + x + '-container');
+ if ((widget != null) && (widget.css('display') != null) && (widget.css('display') != "none"))
+ return true;
+ else
+ return false;
+}
+
+/* start updater */
+jQuery(document).ready(function(){
+ setTimer();
+});
+
diff --git a/src/usr/local/www/javascript/interfaces_ppps_edit/ppps_edit.js b/src/usr/local/www/javascript/interfaces_ppps_edit/ppps_edit.js
new file mode 100644
index 0000000..45b529b
--- /dev/null
+++ b/src/usr/local/www/javascript/interfaces_ppps_edit/ppps_edit.js
@@ -0,0 +1,253 @@
+/*jslint white: true, sloppy: true, vars: true, eqeq: true */
+/*jslint browser: true, devel: true */
+/*global show_hide_linkfields, jQuery, country_list */
+
+function update_select_list(new_options, select_list){
+ var option_array = new_options.split("|");
+ var i = 0;
+ var j;
+ select_list.length = 0;
+ for(j=0; j < option_array.length-1; j++){
+ var option = option_array[j].split(",");
+ var selected = Boolean(parseInt(option[2], 10));
+ select_list[j] = new Option(option[0], option[1], false, selected);
+ //for testing and debugging
+ //select_list.options[option_array.length-1+j] = new Option(option[2].toString() +" "+ selected.toString());
+ //select_list.options[option_array.length-1+j] = new Option("Link Label: " + linklabel + " Label Text:" + label_text);
+ }
+ show_hide_linkfields(select_list);
+}
+
+function show_advanced(hide){
+ var select_list = document.iform["interfaces[]"].options;
+ var adv_rows = parseInt(jQuery('#adv_rows').html(), 10);
+ var adv_show = Boolean(parseInt(jQuery('#adv_show').html(), 10));
+ var status = Boolean(parseInt(hide, 10));
+ var j, advanced;
+ if (status){
+ jQuery('#advanced_').hide();
+ for(j=0; j < adv_rows; j++){
+ advanced = "#advanced_" + j.toString();
+ jQuery(advanced).show();
+ }
+ jQuery('#adv_show').html("1");
+ show_hide_linkfields(select_list);
+ } else {
+ jQuery('#advanced_').show();
+ for(j=0; j < adv_rows; j++){
+ advanced = "#advanced_" + j.toString();
+ jQuery(advanced).hide();
+ }
+ jQuery('#adv_show').html("0");
+ show_hide_linkfields(select_list);
+ }
+}
+
+function show_hide_linkfields(options){
+ var i = 0;
+ var port_count = parseInt(jQuery('#port_count').html(), 10);
+ var adv_show = Boolean(parseInt(jQuery('#adv_show').html(), 10));
+ var j, count, type, link, lnklabel, bw, bwlabel, mtu, mru, mrru, ipfields, gwfields, localip,
+ localiplabel, subnet, gateway, gatewaylabel;
+ for(j=0; j < port_count; j++){
+ count = j.toString();
+ type = jQuery('#type').val();
+ link = "#link" + count;
+ lnklabel = "#linklabel" + count;
+ bw = "#bandwidth" + count;
+ bwlabel = "#bwlabel" + count;
+ mtu = "#mtu" + count;
+ mru = "#mru" + count;
+ mrru = "#mrru" + count;
+ ipfields = "#ip_fields" + count;
+ gwfields = "#gw_fields" + count;
+ localip = "#localip" + count;
+ localiplabel = "#localiplabel" + count;
+ subnet = "#subnet" + count;
+ gateway = "#gateway" + count;
+ gatewaylabel = "#gatewaylabel" + count;
+
+ jQuery(ipfields + ',' + gwfields + ',' + link).hide();
+ jQuery(subnet).prop('disabled',true);
+
+ jQuery(bw).attr("name","bandwidth[]");
+ jQuery(mtu).attr("name","mtu[]");
+ jQuery(mru).attr("name","mru[]");
+ jQuery(mrru).attr("name","mrru[]");
+ jQuery(localip).attr("name","localip[]");
+ jQuery(subnet).attr("name","subnet[]");
+ jQuery(gateway).attr("name","gateway[]");
+
+ while(i < options.length){
+ if (options[i].selected ){
+ jQuery(lnklabel).html("Link Parameters (" + options[i].value + ")");
+ jQuery(bwlabel).html("Bandwidth (" + options[i].value + ")");
+ jQuery(bw).attr("name","bandwidth[" + options[i].value + "]");
+ jQuery(mtu).attr("name","mtu[" + options[i].value + "]");
+ jQuery(mru).attr("name","mru[" + options[i].value + "]");
+ jQuery(mrru).attr("name","mrru[" + options[i].value + "]");
+ jQuery(localiplabel).html("Local IP (" + options[i].value + ")");
+ jQuery(gatewaylabel).html("Gateway (" + options[i].value + ")");
+ jQuery(localip).attr("name","localip[" + options[i].value + "]");
+ jQuery(subnet).attr("name","subnet[" + options[i].value + "]");
+ jQuery(gateway).attr("name","gateway[" + options[i].value + "]");
+ if (type == 'ppp' && adv_show){
+ jQuery(ipfields + ',' + gwfields).show();
+ }
+ if (type == 'pptp' || type == 'l2tp'){
+ jQuery(subnet).prop("disabled",false);
+ jQuery(ipfields + ',' + gwfields).show();
+ }
+ if (adv_show){
+ jQuery(link).show();
+ }
+ i++;
+ break;
+ }
+ i++;
+ }
+ }
+}
+
+
+function updateType(t){
+ var serialports = jQuery('#serialports').html();
+ var ports = jQuery('#ports').html();
+ var select_list = document.iform["interfaces[]"].options;
+ jQuery('#adv_show').html("0");
+ show_advanced('0');
+ jQuery("#select").show();
+ switch(t) {
+ case "select":
+ jQuery('#ppp,#pppoe,#ppp_provider,#phone_num,#apn_').hide();
+ select_list.length = 0;
+ select_list[0] = new Option("Select Link Type First","");
+ break;
+ case "ppp":
+ update_select_list(serialports, select_list);
+ jQuery('#select,#pppoe').hide();
+ jQuery('#ppp_provider,#phone_num,#apn_').show();
+ country_list();
+ break;
+ case "pppoe":
+ update_select_list(ports, select_list);
+ jQuery('#select,#ppp,#ppp_provider,#phone_num,#apn_').hide();
+ break;
+ case "l2tp":
+ case "pptp":
+ update_select_list(ports, select_list);
+ jQuery('#select,#ppp,#pppoe,#ppp_provider,#phone_num,#apn_').hide();
+ break;
+ default:
+ select_list.length = 0;
+ select_list[0] = new Option("Select Link Type First","");
+ break;
+ }
+ if (t == "pppoe" || t == "ppp"){
+ jQuery("#" + t).show();
+ }
+}
+
+function show_reset_settings(reset_type) {
+ if (reset_type == 'preset') {
+ jQuery('#pppoepresetwrap').show(0);
+ jQuery('#pppoecustomwrap').hide(0);
+ }
+ else if (reset_type == 'custom') {
+ jQuery('#pppoecustomwrap').show(0);
+ jQuery('#pppoepresetwrap').hide(0);
+ } else {
+ jQuery('#pppoecustomwrap').hide(0);
+ jQuery('#pppoepresetwrap').hide(0);
+ }
+}
+
+function country_list() {
+ jQuery('#country option').remove();
+ jQuery('#provider option').remove();
+ jQuery('#providerplan option').remove();
+ jQuery('#country').append(new Option('', ''));
+ jQuery.ajax("getserviceproviders.php",{
+ success: function(responseText) {
+ var responseTextArr = responseText.split("\n");
+ var value, i, country;
+ responseTextArr.sort();
+ for (i = 0; i < responseTextArr.length; i += 1) {
+ value = responseTextArr[i];
+ if (/\S/.test(value)) {
+ country = value.split(":");
+ jQuery('#country').append(new Option(country[0],country[1]));
+ }
+ }
+ }
+ });
+ jQuery('#trcountry').css("display","table-row");
+}
+
+function providers_list() {
+ jQuery('#provider option').remove();
+ jQuery('#providerplan option').remove();
+ jQuery('#provider').append(new Option('', ''));
+ jQuery.ajax("getserviceproviders.php",{
+ type: 'POST',
+ data: {country : jQuery('#country').val()},
+ success: function(responseText) {
+ var responseTextArr = responseText.split("\n");
+ var value, i;
+ responseTextArr.sort();
+ for (i = 0; i < responseTextArr.length; i += 1) {
+ value = responseTextArr[i];
+ if (/\S/.test(value)) {
+ jQuery('#provider').append(new Option(value, value));
+ }
+ }
+ }
+ });
+ jQuery('#trprovider').css("display","table-row");
+ jQuery('#trproviderplan').css("display","none");
+}
+
+function providerplan_list() {
+ jQuery('#providerplan option').remove();
+ jQuery('#providerplan').append( new Option('','') );
+ jQuery.ajax("getserviceproviders.php",{
+ type: 'POST',
+ data: {country : jQuery('#country').val(), provider : jQuery('#provider').val()},
+ success: function(responseText) {
+ var responseTextArr = responseText.split("\n");
+ var value, providerplan, i;
+ responseTextArr.sort();
+ for (i = 0; i < responseTextArr.length; i += 1) {
+ value = responseTextArr[i];
+ if (/\S/.test(value)) {
+ providerplan = value.split(":");
+ jQuery('#providerplan').append(new Option(providerplan[0] + " - " + providerplan[1],
+ providerplan[1]));
+ }
+ }
+ }
+ });
+ jQuery('#trproviderplan').css("display","table-row");
+}
+
+function prefill_provider() {
+ jQuery.ajax("getserviceproviders.php",{
+ type: "POST",
+ data: {country : jQuery('#country').val(), provider : jQuery('#provider').val(), plan : jQuery('#providerplan').val()},
+ success: function(responseXML) {
+ var xmldoc = responseXML;
+ var provider = xmldoc.getElementsByTagName('connection')[0];
+ jQuery('#username').val('');
+ jQuery('#password').val('');
+ if(provider.getElementsByTagName('apn')[0].firstChild.data == "CDMA") {
+ jQuery('#phone').val('#777');
+ jQuery('#apn').val('');
+ } else {
+ jQuery('#phone').val('*99#');
+ jQuery('#apn').val(provider.getElementsByTagName('apn')[0].firstChild.data);
+ }
+ jQuery('#username').val(provider.getElementsByTagName('username')[0].firstChild.data);
+ jQuery('#password').val(provider.getElementsByTagName('password')[0].firstChild.data);
+ }
+ });
+}
diff --git a/src/usr/local/www/javascript/jquery-1.11.1.min.js b/src/usr/local/www/javascript/jquery-1.11.1.min.js
new file mode 100644
index 0000000..ab28a24
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery-1.11.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
+if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"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){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")
+},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.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){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
diff --git a/src/usr/local/www/javascript/jquery-migrate-1.2.1.min.js b/src/usr/local/www/javascript/jquery-migrate-1.2.1.min.js
new file mode 100644
index 0000000..62149c2
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery-migrate-1.2.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery Migrate v1.2.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */
+jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){var r=t.console;i[n]||(i[n]=!0,e.migrateWarnings.push(n),r&&r.warn&&!e.migrateMute&&(r.warn("JQMIGRATE: "+n),e.migrateTrace&&r.trace&&r.trace()))}function a(t,a,i,o){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(o),i},set:function(e){r(o),i=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=i}var i={};e.migrateWarnings=[],!e.migrateMute&&t.console&&t.console.log&&t.console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){i={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var o=e("<input/>",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",o||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,i,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(o?a in o:e.isFunction(e.fn[a])))?e(t)[a](i):("type"===a&&i!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,i=e.prop(t,r);return i===!0||"boolean"!=typeof i&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,i))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^([^<]*)(<[\w\W]+>)([^>]*)$/;e.fn.init=function(t,n,a){var i;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(i=y.exec(e.trim(t)))&&i[0]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),i[3]&&r("$(html) HTML text after last tag is ignored"),"#"===i[0].charAt(0)&&(r("HTML string cannot start with a '#' character"),e.error("JQMIGRATE: Invalid selector string (XSS)")),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(i[2],n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,i,o=this[0];return!o||"events"!==t||1!==arguments.length||(a=e.data(o,t),i=e._data(o,t),a!==n&&a!==i||i===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),i)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,i,o){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),i)for(c=function(e){return!e.type||j.test(e.type)?o?o.push(e.parentNode?e.parentNode.removeChild(e):e):i.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(i.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,T=e.fn.live,M=e.fn.die,S="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",C=RegExp("\\b(?:"+S+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,i){e!==document&&C.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,i)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,i=t.guid||e.guid++,o=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%o;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=i;a.length>o;)a[o++].guid=i;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),T?T.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),M?M.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||C.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(S.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css b/src/usr/local/www/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css
new file mode 100644
index 0000000..1af3008
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css
@@ -0,0 +1,7 @@
+/* css for timepicker */
+.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
+.ui-timepicker-div dl { text-align: left; }
+.ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; }
+.ui-timepicker-div dl dd { margin: 0 10px 10px 65px; }
+.ui-timepicker-div td { font-size: 90%; }
+.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
diff --git a/src/usr/local/www/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js b/src/usr/local/www/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js
new file mode 100644
index 0000000..33cd3ae
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js
@@ -0,0 +1,1326 @@
+/*
+* jQuery timepicker addon
+* By: Trent Richardson [http://trentrichardson.com]
+* Version 0.9.9
+* Last Modified: 02/05/2012
+*
+* Copyright 2012 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; margin-bottom: -25px; }
+* .ui-timepicker-div dl dd { margin: 0 10px 10px 65px; }
+* .ui-timepicker-div td { font-size: 90%; }
+* .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
+*/
+
+(function($) {
+
+$.extend($.ui, { timepicker: { version: "0.9.9" } });
+
+/* 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,
+ amNames: ['AM', 'A'],
+ pmNames: ['PM', 'P'],
+ timeFormat: 'hh:mm tt',
+ timeSuffix: '',
+ timeOnlyTitle: 'Choose Time',
+ timeText: 'Time',
+ hourText: 'Hour',
+ minuteText: 'Minute',
+ secondText: 'Second',
+ millisecText: 'Millisecond',
+ timezoneText: 'Time Zone'
+ };
+ this._defaults = { // Global defaults for all the datetime picker instances
+ showButtonPanel: true,
+ timeOnly: false,
+ showHour: true,
+ showMinute: true,
+ showSecond: false,
+ showMillisec: false,
+ showTimezone: false,
+ showTime: true,
+ stepHour: 1,
+ stepMinute: 1,
+ stepSecond: 1,
+ stepMillisec: 1,
+ hour: 0,
+ minute: 0,
+ second: 0,
+ millisec: 0,
+ timezone: '+0000',
+ hourMin: 0,
+ minuteMin: 0,
+ secondMin: 0,
+ millisecMin: 0,
+ hourMax: 23,
+ minuteMax: 59,
+ secondMax: 59,
+ millisecMax: 999,
+ minDateTime: null,
+ maxDateTime: null,
+ onSelect: null,
+ hourGrid: 0,
+ minuteGrid: 0,
+ secondGrid: 0,
+ millisecGrid: 0,
+ alwaysSetTime: true,
+ separator: ' ',
+ altFieldTimeOnly: true,
+ showTimepicker: true,
+ timezoneIso8609: false,
+ timezoneList: null,
+ addSliderAccess: false,
+ sliderAccessArgs: null
+ };
+ $.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,
+ millisec_slider: null,
+ timezone_select: null,
+ hour: 0,
+ minute: 0,
+ second: 0,
+ millisec: 0,
+ timezone: '+0000',
+ hourMinOriginal: null,
+ minuteMinOriginal: null,
+ secondMinOriginal: null,
+ millisecMinOriginal: null,
+ hourMaxOriginal: null,
+ minuteMaxOriginal: null,
+ secondMaxOriginal: null,
+ millisecMaxOriginal: null,
+ ampm: '',
+ formattedDate: '',
+ formattedTime: '',
+ formattedDateTime: '',
+ timezoneList: null,
+
+ /* 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))
+ return 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.amNames = $.map(tp_inst._defaults.amNames, function(val) { return val.toUpperCase() ;});
+ tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) { return val.toUpperCase() ;});
+
+ if (tp_inst._defaults.timezoneList === null) {
+ var timezoneList = [];
+ for (var i = -11; i <= 12; i++)
+ timezoneList.push((i >= 0 ? '+' : '-') + ('0' + Math.abs(i).toString()).slice(-2) + '00');
+ if (tp_inst._defaults.timezoneIso8609)
+ timezoneList = $.map(timezoneList, function(val) {
+ return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3));
+ });
+ tp_inst._defaults.timezoneList = timezoneList;
+ }
+
+ tp_inst.hour = tp_inst._defaults.hour;
+ tp_inst.minute = tp_inst._defaults.minute;
+ tp_inst.second = tp_inst._defaults.second;
+ tp_inst.millisec = tp_inst._defaults.millisec;
+ tp_inst.ampm = '';
+ tp_inst.$input = $input;
+
+ if (o.altField)
+ tp_inst.$altInput = $(o.altField)
+ .css({ cursor: 'pointer' })
+ .focus(function(){ $input.trigger("focus"); });
+
+ if(tp_inst._defaults.minDate==0 || tp_inst._defaults.minDateTime==0)
+ {
+ tp_inst._defaults.minDate=new Date();
+ }
+ if(tp_inst._defaults.maxDate==0 || tp_inst._defaults.maxDateTime==0)
+ {
+ tp_inst._defaults.maxDate=new Date();
+ }
+
+ // 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(/l{1}/ig, '(\\d?\\d?\\d)')
+ .replace(/t{1,2}/ig, this._getPatternAmpm())
+ .replace(/z{1}/ig, '(z|[-+]\\d\\d:?\\d\\d)?')
+ .replace(/\s/g, '\\s?') + this._defaults.timeSuffix + '$',
+ order = this._getFormatPositions(),
+ ampm = '',
+ 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 separator
+ 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) {
+ if (treg[order.t] === undefined || treg[order.t].length === 0) {
+ ampm = '';
+ this.ampm = '';
+ } else {
+ ampm = $.inArray(treg[order.t].toUpperCase(), this.amNames) !== -1 ? 'AM' : 'PM';
+ this.ampm = this._defaults[ampm == 'AM' ? 'amNames' : 'pmNames'][0];
+ }
+ }
+
+ if (order.h !== -1) {
+ if (ampm == 'AM' && treg[order.h] == '12')
+ this.hour = 0; // 12am = 0 hour
+ else if (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.l !== -1) this.millisec = Number(treg[order.l]);
+ if (order.z !== -1 && treg[order.z] !== undefined) {
+ var tz = treg[order.z].toUpperCase();
+ switch (tz.length) {
+ case 1: // Z
+ tz = this._defaults.timezoneIso8609 ? 'Z' : '+0000';
+ break;
+ case 5: // +hhmm
+ if (this._defaults.timezoneIso8609)
+ tz = tz.substring(1) == '0000'
+ ? 'Z'
+ : tz.substring(0, 3) + ':' + tz.substring(3);
+ break;
+ case 6: // +hh:mm
+ if (!this._defaults.timezoneIso8609)
+ tz = tz == 'Z' || tz.substring(1) == '00:00'
+ ? '+0000'
+ : tz.replace(/:/, '');
+ else if (tz.substring(1) == '00:00')
+ tz = 'Z';
+ break;
+ }
+ this.timezone = tz;
+ }
+
+ return true;
+
+ }
+ return false;
+ },
+
+ //########################################################################
+ // pattern for standard and localized AM/PM markers
+ //########################################################################
+ _getPatternAmpm: function() {
+ var markers = [];
+ o = this._defaults;
+ if (o.amNames)
+ $.merge(markers, o.amNames);
+ if (o.pmNames)
+ $.merge(markers, o.pmNames);
+ markers = $.map(markers, function(val) { return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&') });
+ return '(' + markers.join('|') + ')?';
+ },
+
+ //########################################################################
+ // 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}|l{1}|t{1,2}|z)/g),
+ orders = { h: -1, m: -1, s: -1, l: -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 = parseInt((o.hourMax - ((o.hourMax - o.hourMin) % o.stepHour)) ,10),
+ minMax = parseInt((o.minuteMax - ((o.minuteMax - o.minuteMin) % o.stepMinute)) ,10),
+ secMax = parseInt((o.secondMax - ((o.secondMax - o.secondMin) % o.stepSecond)) ,10),
+ millisecMax = parseInt((o.millisecMax - ((o.millisecMax - o.millisecMin) % o.stepMillisec)) ,10),
+ 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,
+ millisecGridSize = 0,
+ size;
+
+ // Hours
+ html += '<dd class="ui_tpicker_hour"><div id="ui_tpicker_hour_' + dp_id + '"' +
+ ((o.showHour) ? '' : noDisplay) + '></div>';
+ if (o.showHour && o.hourGrid > 0) {
+ html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
+
+ for (var h = o.hourMin; h <= hourMax; h += parseInt(o.hourGrid,10)) {
+ 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>';
+ }
+ html += '</dd>';
+
+ // Minutes
+ html += '<dt class="ui_tpicker_minute_label" id="ui_tpicker_minute_label_' + dp_id + '"' +
+ ((o.showMinute) ? '' : noDisplay) + '>' + o.minuteText + '</dt>'+
+ '<dd class="ui_tpicker_minute"><div id="ui_tpicker_minute_' + dp_id + '"' +
+ ((o.showMinute) ? '' : noDisplay) + '></div>';
+
+ if (o.showMinute && o.minuteGrid > 0) {
+ html += '<div style="padding-left: 1px"><table class="ui-tpicker-grid-label"><tr>';
+
+ for (var m = o.minuteMin; m <= minMax; m += parseInt(o.minuteGrid,10)) {
+ minuteGridSize++;
+ html += '<td>' + ((m < 10) ? '0' : '') + m + '</td>';
+ }
+
+ html += '</tr></table></div>';
+ }
+ html += '</dd>';
+
+ // Seconds
+ html += '<dt class="ui_tpicker_second_label" id="ui_tpicker_second_label_' + dp_id + '"' +
+ ((o.showSecond) ? '' : noDisplay) + '>' + o.secondText + '</dt>'+
+ '<dd class="ui_tpicker_second"><div id="ui_tpicker_second_' + dp_id + '"'+
+ ((o.showSecond) ? '' : noDisplay) + '></div>';
+
+ if (o.showSecond && o.secondGrid > 0) {
+ html += '<div style="padding-left: 1px"><table><tr>';
+
+ for (var s = o.secondMin; s <= secMax; s += parseInt(o.secondGrid,10)) {
+ secondGridSize++;
+ html += '<td>' + ((s < 10) ? '0' : '') + s + '</td>';
+ }
+
+ html += '</tr></table></div>';
+ }
+ html += '</dd>';
+
+ // Milliseconds
+ html += '<dt class="ui_tpicker_millisec_label" id="ui_tpicker_millisec_label_' + dp_id + '"' +
+ ((o.showMillisec) ? '' : noDisplay) + '>' + o.millisecText + '</dt>'+
+ '<dd class="ui_tpicker_millisec"><div id="ui_tpicker_millisec_' + dp_id + '"'+
+ ((o.showMillisec) ? '' : noDisplay) + '></div>';
+
+ if (o.showMillisec && o.millisecGrid > 0) {
+ html += '<div style="padding-left: 1px"><table><tr>';
+
+ for (var l = o.millisecMin; l <= millisecMax; l += parseInt(o.millisecGrid,10)) {
+ millisecGridSize++;
+ html += '<td>' + ((l < 10) ? '0' : '') + l + '</td>';
+ }
+
+ html += '</tr></table></div>';
+ }
+ html += '</dd>';
+
+ // Timezone
+ 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) {
+ 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.millisec_slider = $tp.find('#ui_tpicker_millisec_'+ dp_id).slider({
+ orientation: "horizontal",
+ value: this.millisec,
+ min: o.millisecMin,
+ max: millisecMax,
+ step: o.stepMillisec,
+ slide: function(event, ui) {
+ tp_inst.millisec_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'
+ });
+ });
+ }
+
+ if (o.showMillisec && o.millisecGrid > 0) {
+ $tp.find(".ui_tpicker_millisec table").css({
+ width: size + "%",
+ marginLeft: (size / (-2 * millisecGridSize)) + "%",
+ borderCollapse: 'collapse'
+ }).find("td").each(function(index) {
+ $(this).click(function() {
+ tp_inst.millisec_slider.slider("option", "value", $(this).html());
+ tp_inst._onTimeChange();
+ tp_inst._onSelectHandler();
+ }).css({
+ cursor: 'pointer',
+ width: (100 / millisecGridSize) + '%',
+ 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.millisec_slider.bind('slidestop',onSelectDelegate);
+
+ // slideAccess integration: http://trentrichardson.com/2011/11/11/jquery-ui-sliders-and-touch-accessibility/
+ if (this._defaults.addSliderAccess){
+ var sliderAccessArgs = this._defaults.sliderAccessArgs;
+ setTimeout(function(){ // fix for inline mode
+ if($tp.find('.ui-slider-access').length == 0){
+ $tp.find('.ui-slider:visible').sliderAccess(sliderAccessArgs);
+
+ // fix any grids since sliders are shorter
+ var sliderAccessWidth = $tp.find('.ui-slider-access:eq(0)').outerWidth(true);
+ if(sliderAccessWidth){
+ $tp.find('table:visible').each(function(){
+ var $g = $(this),
+ oldWidth = $g.outerWidth(),
+ oldMarginLeft = $g.css('marginLeft').toString().replace('%',''),
+ newWidth = oldWidth - sliderAccessWidth,
+ newMarginLeft = ((oldMarginLeft * newWidth)/oldWidth) + '%';
+
+ $g.css({ width: newWidth, marginLeft: newMarginLeft });
+ });
+ }
+ }
+ },0);
+ }
+ // end slideAccess integration
+
+ }
+ },
+
+ //########################################################################
+ // 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 && $.datepicker._get(dp_inst, 'minDateTime') !== undefined && 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.millisecMinOriginal === null){
+ this.hourMinOriginal = o.hourMin;
+ this.minuteMinOriginal = o.minuteMin;
+ this.secondMinOriginal = o.secondMin;
+ this.millisecMinOriginal = o.millisecMin;
+ }
+
+ 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.millisecMin = minDateTime.getMilliseconds();
+ } else {
+ if(this.millisec < this._defaults.millisecMin)
+ this.millisec = this._defaults.millisecMin;
+ this._defaults.millisecMin = this.millisecMinOriginal;
+ }
+ } else {
+ this._defaults.minuteMin = this.minuteMinOriginal;
+ this._defaults.secondMin = this.secondMinOriginal;
+ this._defaults.millisecMin = this.millisecMinOriginal;
+ }
+ }else{
+ this._defaults.hourMin = this.hourMinOriginal;
+ this._defaults.minuteMin = this.minuteMinOriginal;
+ this._defaults.secondMin = this.secondMinOriginal;
+ this._defaults.millisecMin = this.millisecMinOriginal;
+ }
+ }
+
+ if($.datepicker._get(dp_inst, 'maxDateTime') !== null && $.datepicker._get(dp_inst, 'maxDateTime') !== undefined && 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;
+ this.millisecMaxOriginal = o.millisecMax;
+ }
+
+ 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.millisecMax = maxDateTime.getMilliseconds();
+ } else {
+ if(this.millisec > this._defaults.millisecMax) this.millisec = this._defaults.millisecMax;
+ this._defaults.millisecMax = this.millisecMaxOriginal;
+ }
+ } else {
+ this._defaults.minuteMax = this.minuteMaxOriginal;
+ this._defaults.secondMax = this.secondMaxOriginal;
+ this._defaults.millisecMax = this.millisecMaxOriginal;
+ }
+ }else{
+ this._defaults.hourMax = this.hourMaxOriginal;
+ this._defaults.minuteMax = this.minuteMaxOriginal;
+ this._defaults.secondMax = this.secondMaxOriginal;
+ this._defaults.millisecMax = this.millisecMaxOriginal;
+ }
+ }
+
+ if(adjustSliders !== undefined && adjustSliders === true){
+ var hourMax = parseInt((this._defaults.hourMax - ((this._defaults.hourMax - this._defaults.hourMin) % this._defaults.stepHour)) ,10),
+ minMax = parseInt((this._defaults.minuteMax - ((this._defaults.minuteMax - this._defaults.minuteMin) % this._defaults.stepMinute)) ,10),
+ secMax = parseInt((this._defaults.secondMax - ((this._defaults.secondMax - this._defaults.secondMin) % this._defaults.stepSecond)) ,10),
+ millisecMax = parseInt((this._defaults.millisecMax - ((this._defaults.millisecMax - this._defaults.millisecMin) % this._defaults.stepMillisec)) ,10);
+
+ 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);
+ if(this.millisec_slider)
+ this.millisec_slider.slider("option", { min: this._defaults.millisecMin, max: millisecMax }).slider('value', this.millisec);
+ }
+
+ },
+
+
+ //########################################################################
+ // 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,
+ millisec = (this.millisec_slider) ? this.millisec_slider.slider('value') : false,
+ timezone = (this.timezone_select) ? this.timezone_select.val() : false,
+ o = this._defaults;
+
+ if (typeof(hour) == 'object') hour = false;
+ if (typeof(minute) == 'object') minute = false;
+ if (typeof(second) == 'object') second = false;
+ if (typeof(millisec) == 'object') millisec = 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);
+ if (millisec !== false) millisec = parseInt(millisec,10);
+
+ var ampm = o[hour < 12 ? 'amNames' : 'pmNames'][0];
+
+ // 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 || millisec != this.millisec
+ || (this.ampm.length > 0
+ && (hour < 12) != ($.inArray(this.ampm.toUpperCase(), this.amNames) !== -1))
+ || timezone != this.timezone);
+
+ if (hasChanged) {
+
+ if (hour !== false)this.hour = hour;
+ if (minute !== false) this.minute = minute;
+ if (second !== false) this.second = second;
+ if (millisec !== false) this.millisec = millisec;
+ if (timezone !== false) this.timezone = timezone;
+
+ if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);
+
+ this._limitMinMaxDateTime(this.inst, true);
+ }
+ if (o.ampm) this.ampm = ampm;
+
+ //this._formatTime();
+ this.formattedTime = $.datepicker.formatTime(this._defaults.timeFormat, this, this._defaults);
+ if (this.$timeObj) this.$timeObj.text(this.formattedTime + o.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]);
+ }
+ },
+
+ //########################################################################
+ // left for any backwards compatibility
+ //########################################################################
+ _formatTime: function(time, format) {
+ time = time || { hour: this.hour, minute: this.minute, second: this.second, millisec: this.millisec, ampm: this.ampm, timezone: this.timezone };
+ var tmptime = (format || this._defaults.timeFormat).toString();
+
+ tmptime = $.datepicker.formatTime(tmptime, time, this._defaults);
+
+ 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;
+ var dt = $.datepicker._daylightSavingAdjust(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);
+ });
+ }
+});
+
+//########################################################################
+// format the time all pretty...
+// format = string format of the time
+// time = a {}, not a Date() for timezones
+// options = essentially the regional[].. amNames, pmNames, ampm
+//########################################################################
+$.datepicker.formatTime = function(format, time, options) {
+ options = options || {};
+ options = $.extend($.timepicker._defaults, options);
+ time = $.extend({hour:0, minute:0, second:0, millisec:0, timezone:'+0000'}, time);
+
+ var tmptime = format;
+ var ampmName = options['amNames'][0];
+
+ var hour = parseInt(time.hour, 10);
+ if (options.ampm) {
+ if (hour > 11){
+ ampmName = options['pmNames'][0];
+ if(hour > 12)
+ hour = hour % 12;
+ }
+ if (hour === 0)
+ hour = 12;
+ }
+ tmptime = tmptime.replace(/(?:hh?|mm?|ss?|[tT]{1,2}|[lz])/g, function(match) {
+ switch (match.toLowerCase()) {
+ case 'hh': return ('0' + hour).slice(-2);
+ case 'h': return hour;
+ case 'mm': return ('0' + time.minute).slice(-2);
+ case 'm': return time.minute;
+ case 'ss': return ('0' + time.second).slice(-2);
+ case 's': return time.second;
+ case 'l': return ('00' + time.millisec).slice(-3);
+ case 'z': return time.timezone;
+ case 't': case 'tt':
+ if (options.ampm) {
+ if (match.length == 1)
+ ampmName = ampmName.charAt(0);
+ return match.charAt(0) == 'T' ? ampmName.toUpperCase() : ampmName.toLowerCase();
+ }
+ return '';
+ }
+ });
+
+ tmptime = $.trim(tmptime);
+ return tmptime;
+};
+
+//########################################################################
+// 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);
+ 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('') : '') +
+ (tp_inst._defaults.amNames.join('')) +
+ (tp_inst._defaults.pmNames.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) {
+ var inst = this._getInst($(id)[0]),
+ $dp = inst.dpDiv;
+ this._base_gotoToday(id);
+ var now = new Date();
+ var tp_inst = this._get(inst, 'timepicker');
+ if (tp_inst && tp_inst._defaults.showTimezone && tp_inst.timezone_select) {
+ var tzoffset = now.getTimezoneOffset(); // If +0100, returns -60
+ var tzsign = tzoffset > 0 ? '-' : '+';
+ tzoffset = Math.abs(tzoffset);
+ var tzmin = tzoffset % 60;
+ tzoffset = tzsign + ('0' + (tzoffset - tzmin) / 60).slice(-2) + ('0' + tzmin).slice(-2);
+ if (tp_inst._defaults.timezoneIso8609)
+ tzoffset = tzoffset.substring(0, 3) + ':' + tzoffset.substring(3);
+ tp_inst.timezone_select.val(tzoffset);
+ }
+ this._setTime(inst, now);
+ $( '.ui-datepicker-today', $dp).click();
+};
+
+//#######################################################################################
+// 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,
+ millisec = date ? date.getMilliseconds() : defaults.millisec;
+
+ //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) || (millisec < defaults.millisecMin || millisec > defaults.millisecMax)) {
+ hour = defaults.hourMin;
+ minute = defaults.minuteMin;
+ second = defaults.secondMin;
+ millisec = defaults.millisecMin;
+ }
+
+ tp_inst.hour = hour;
+ tp_inst.minute = minute;
+ tp_inst.second = second;
+ tp_inst.millisec = millisec;
+
+ 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);
+ if (tp_inst.millisec_slider) tp_inst.millisec_slider.slider('value', millisec);
+
+ 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, tp_inst.millisec);
+ }
+ 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, tp_inst.millisec);
+ 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) {
+ if (err.indexOf(":") >= 0) {
+ // 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);
+ } else {
+ // The underlying error was not related to the time
+ throw err;
+ }
+ }
+ return date;
+};
+
+//#######################################################################################
+// override formatDate to set date with time to the input
+//#######################################################################################
+$.datepicker._base_formatDate=$.datepicker._formatDate;
+$.datepicker._formatDate = function(inst, day, month, year){
+ var tp_inst = this._get(inst, 'timepicker');
+ if(tp_inst)
+ {
+ if(day)
+ var b = this._base_formatDate(inst, day, month, year);
+ tp_inst._updateDateTime(inst);
+ return tp_inst.$input.val();
+ }
+ return this._base_formatDate(inst);
+};
+
+//#######################################################################################
+// override options setter to add time to maxDate(Time) and minDate(Time). MaxDate
+//#######################################################################################
+$.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;
+$.datepicker._optionDatepicker = function(target, name, value) {
+ var inst = this._getInst(target),
+ tp_inst = this._get(inst, 'timepicker');
+ if (tp_inst) {
+ var min,max,onselect;
+ if (typeof name == 'string') { // if min/max was set with the string
+ if (name==='minDate' || name==='minDateTime' )
+ min = value;
+ else if (name==='maxDate' || name==='maxDateTime')
+ max = value;
+ else if (name==='onSelect')
+ onselect=value;
+ } else if (typeof name == 'object') { //if min/max was set with the JSON
+ if(name.minDate)
+ min = name.minDate;
+ else if (name.minDateTime)
+ min = name.minDateTime;
+ else if (name.maxDate)
+ max = name.maxDate;
+ else if (name.maxDateTime)
+ max = name.maxDateTime;
+ }
+ if(min){ //if min was set
+ if(min==0)
+ min=new Date();
+ else
+ min= new Date(min);
+
+ tp_inst._defaults.minDate = min;
+ tp_inst._defaults.minDateTime = min;
+ } else if (max){ //if max was set
+ if(max==0)
+ max=new Date();
+ else
+ max= new Date(max);
+ tp_inst._defaults.maxDate = max;
+ tp_inst._defaults.maxDateTime = max;
+ }
+ else if (onselect)
+ tp_inst._defaults.onSelect=onselect;
+ }
+ if (value === undefined)
+ return this._base_optionDatepicker(target, name);
+ return this._base_optionDatepicker(target, name, value);
+};
+
+//#######################################################################################
+// 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.9";
+
+})(jQuery);
+
diff --git a/src/usr/local/www/javascript/jquery.ipv4v6ify.js b/src/usr/local/www/javascript/jquery.ipv4v6ify.js
new file mode 100755
index 0000000..93a513a
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery.ipv4v6ify.js
@@ -0,0 +1,140 @@
+/*jslint browser: true, eqeqeq: true, undef: true */
+/*global jQuery */
+/******************************************************************************
+Lines above are for jslint, the JavaScript verifier. http://www.jslint.com/
+******************************************************************************/
+
+/* MIT-licensed code from https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some */
+/* (C) 2007 Mozilla Developer Network and/or Jeff Walden */
+if (!Array.prototype.some) {
+ Array.prototype.some = function(fun /*, thisp */) {
+ "use strict";
+ if (!this) {
+ throw new TypeError();
+ }
+ var t = Object(this);
+ var len = t.length >>> 0;
+ if (typeof fun !== "function") {
+ throw new TypeError();
+ }
+ var thisp = arguments[1];
+ for (var i = 0; i < len; i++) {
+ if (i in t && fun.call(thisp, t[i], i, t)) {
+ return true;
+ }
+ }
+ return false;
+ };
+}
+
+(function ($) {
+ // --------------------------------------------------------------------
+ // find pairs of <input class='ipv4v6'> (textbox for IPv4 or IPv6 addr)
+ // and <select class='ipv4v6'> (dropdown for # bits in CIDR) and
+ // activate behavior that restricts options in the <select> when an
+ // ipv4 address is typed in the <input>.
+ // --------------------------------------------------------------------
+ var _ipv4v6ify = function (input1, input2) {
+ var options = Array.prototype.slice.call(input2.options, 0);
+ var has_128 = options.some(function (x) { return parseInt(x.value, 10) === 128; });
+ var has_0 = options.some(function (x) { return parseInt(x.value, 10) === 0; });
+ var max_ipv6 = has_128 ? 128 : 127;
+ var min_ipv6 = has_0 ? 0 : 1;
+ var max_ipv4 = has_128 ? 32 : 31;
+ var min_ipv4 = has_0 ? 0 : 1;
+ var was_ipv4 = undefined;
+ var is_ipv4 = undefined;
+ var restrict_bits_to_ipv4 = function () {
+ input2.options.length = 0;
+ for (var i = 0; i < options.length; i += 1) {
+ var val = parseInt(options[i].value, 10);
+ if (val >= min_ipv4 && val <= max_ipv4) {
+ input2.options.add(options[i]);
+ }
+ }
+ };
+ var unrestrict_bits = function () {
+ input2.options.length = 0;
+ for (var i = 0; i < options.length; i += 1) {
+ input2.options.add(options[i]);
+ }
+ };
+ var onchange_handler = function () {
+ was_ipv4 = is_ipv4;
+ is_ipv4 = /\./.test(input1.value) && !/\:/.test(input1.value);
+ // handle state transitions to gracefully change the
+ // value in the dropdown.
+ var bits = parseInt($(input2).val(), 10);
+ if (was_ipv4 === false && is_ipv4 === true) {
+ restrict_bits_to_ipv4();
+ /* min_ipv4 -> min_ipv4 */
+ /* ... -> ... */
+ /* max_ipv4 -> max_ipv4 */
+ /* ... -> ... */
+ /* max_ipv6 -> max_ipv4 */
+ if (bits < min_ipv4) {
+ $(input2).val(min_ipv4);
+ }
+ else if (bits < max_ipv4) {
+ $(input2).val(bits);
+ }
+ else {
+ $(input2).val(max_ipv4);
+ }
+ }
+ else if (was_ipv4 === true && is_ipv4 === false) {
+ unrestrict_bits();
+ /* min_ipv4 -> min_ipv4 */
+ /* ... -> ... */
+ /* max_ipv4 -> max_ipv4 */
+ if (bits < min_ipv4) {
+ $(input2).val(min_ipv6);
+ }
+ else if (bits < max_ipv4) {
+ $(input2).val(bits);
+ }
+ else {
+ $(input2).val(max_ipv6);
+ }
+ }
+ else if (was_ipv4 === undefined && is_ipv4 === true) {
+ // initial value is an ipv4 address
+ restrict_bits_to_ipv4();
+ /* min_ipv4 -> min_ipv4 */
+ /* ... -> ... */
+ /* max_ipv4 -> max_ipv4 */
+ /* ... -> ... */
+ /* max_ipv6 -> max_ipv4 */
+ if (bits < min_ipv4) {
+ $(input2).val(min_ipv4);
+ }
+ else if (bits < max_ipv4) {
+ $(input2).val(bits);
+ }
+ else {
+ $(input2).val(max_ipv4);
+ }
+ }
+ };
+ $(input1).unbind("change").bind("change", onchange_handler).trigger("change");
+ };
+ $.fn.extend({
+ "ipv4v6ify": function () {
+ return this.each(function () {
+ var inputs, i, input1, input2;
+ inputs = $(this).find(":input.ipv4v6").toArray();
+ for (i = 0; i < inputs.length - 1; i += 1) {
+ input1 = inputs[i];
+ input2 = inputs[i + 1];
+ if (input1.type === "text" && input2.type === "select-one") {
+ _ipv4v6ify(input1, input2);
+ }
+ }
+ });
+ }
+ });
+ $(function () {
+ $(document).ipv4v6ify();
+ });
+})(jQuery);
+
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_18_b81900_40x40.png
new file mode 100755
index 0000000..954e22d
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_18_b81900_40x40.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_20_666666_40x40.png b/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_20_666666_40x40.png
new file mode 100755
index 0000000..64ece57
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_diagonals-thick_20_666666_40x40.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100755
index 0000000..5b5dab2
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png
new file mode 100755
index 0000000..e44f861
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_10_000000_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_10_000000_40x100.png
new file mode 100755
index 0000000..abdc010
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_10_000000_40x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png
new file mode 100755
index 0000000..b8c9bb1
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png
new file mode 100755
index 0000000..e44f861
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f6f6f6_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f6f6f6_1x400.png
new file mode 100755
index 0000000..9b383f4
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f6f6f6_1x400.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png
new file mode 100755
index 0000000..cd79e9f
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_fdf5ce_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_fdf5ce_1x400.png
new file mode 100755
index 0000000..a23baad
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_100_fdf5ce_1x400.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png
new file mode 100755
index 0000000..3550f06
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png
new file mode 100755
index 0000000..8ad921a
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_glass_65_ffffff_1x400.png b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100755
index 0000000..42ccba2
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_glass_65_ffffff_1x400.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_gloss-wave_35_f6a828_500x100.png
new file mode 100755
index 0000000..39d5824
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_gloss-wave_35_f6a828_500x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
new file mode 100755
index 0000000..f127367
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
new file mode 100755
index 0000000..359397a
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png
new file mode 100755
index 0000000..89b88d8
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png b/src/usr/local/www/javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png
new file mode 100755
index 0000000..a265c62
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_222222_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_222222_256x240.png
new file mode 100755
index 0000000..b273ff1
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_222222_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_228ef1_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_228ef1_256x240.png
new file mode 100755
index 0000000..a641a37
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_228ef1_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_3383bb_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_3383bb_256x240.png
new file mode 100755
index 0000000..905274f
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_3383bb_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_454545_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_454545_256x240.png
new file mode 100755
index 0000000..59bd45b
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_454545_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_70b2e1_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_70b2e1_256x240.png
new file mode 100755
index 0000000..ed8543e
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_70b2e1_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_999999_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_999999_256x240.png
new file mode 100755
index 0000000..50ff803
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_999999_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_ef8c08_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_ef8c08_256x240.png
new file mode 100755
index 0000000..85e63e9
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_ef8c08_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_fbc856_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_fbc856_256x240.png
new file mode 100755
index 0000000..18e65a1
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_fbc856_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_ffd27a_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_ffd27a_256x240.png
new file mode 100755
index 0000000..e117eff
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_ffd27a_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/images/ui-icons_ffffff_256x240.png b/src/usr/local/www/javascript/jquery/images/ui-icons_ffffff_256x240.png
new file mode 100755
index 0000000..42f8f99
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/images/ui-icons_ffffff_256x240.png
Binary files differ
diff --git a/src/usr/local/www/javascript/jquery/jquery-ui-1.11.1.min.js b/src/usr/local/www/javascript/jquery/jquery-ui-1.11.1.min.js
new file mode 100644
index 0000000..6a4e1d1
--- /dev/null
+++ b/src/usr/local/www/javascript/jquery/jquery-ui-1.11.1.min.js
@@ -0,0 +1,13 @@
+/*! jQuery UI - v1.11.1 - 2014-09-21
+* http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){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},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.1",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return n=!a&&o.length?e.widget.extend.apply(null,[n].concat(o)):n,a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))}),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.1",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):t.which?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),N=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=N[0],M.top+=N[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+N[0],p[1]+N[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,e.top+p+f+m>u&&(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,e.top+p+f+m>d&&(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.1",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,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?: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._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.document[0],s=this.options;try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(n){}return this.helper||s.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(e(s.iframeFix===!0?"iframe":s.iframeFix).each(function(){e("<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(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_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 t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}
+},_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,this.destroyOnClear&&this.destroy()},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),"drag"===t&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=s.options,a=e.extend({},i,{item:s.element});s.sortables=[],e(n.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",t,a))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});e.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,n))})},drag:function(t,i,s){var n=this;e.each(s.sortables,function(){var a=!1,o=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(a=!0,e.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==o&&this.instance._intersectsWith(this.instance.containerCache)&&e.contains(o.instance.element[0],this.instance.element[0])&&(a=!1),a})),a?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",t),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",t),s.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left,l=h+s.snapElements[c].width,u=s.snapElements[c].top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left-s.margins.left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left-s.margins.left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.droppable",{version:"1.11.1",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left,o=(t.positionAbs||t.position.absolute).top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.1",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:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("<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("ui-resizable",this.element.resizable("instance")),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=r.handles||(e(".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"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=this.element.children(this.handles[i]).first().show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,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}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0},h=function(t,s){e(t).each(function(){var t=e(this),n=e(this).data("ui-resizable-alsoresize"),a={},o=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var i=(n[t]||0)+(r[t]||0);i&&i>=0&&(a[t]=i||null)}),t.css(a)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):e.each(n.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=u-t.height,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.selectable",e.ui.mouse,{version:"1.11.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;
+this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(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,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.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),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.1",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,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===e.axis||this._isFloating(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),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},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-e(document).scrollTop()<o.scrollSensitivity?r=e(document).scrollTop(e(document).scrollTop()-o.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<o.scrollSensitivity&&(r=e(document).scrollTop(e(document).scrollTop()+o.scrollSpeed)),t.pageX-e(document).scrollLeft()<o.scrollSensitivity?r=e(document).scrollLeft(e(document).scrollLeft()-o.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<o.scrollSensitivity&&(r=e(document).scrollLeft(e(document).scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?t.currentItem.children().each(function(){e("<td>&#160;</td>",t.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[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")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.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 t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,e("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(e("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!t){for(this._trigger("beforeStop",e,this._uiHash()),s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!1}if(t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.accordion",{version:"1.11.1",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");
+t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true",tabIndex:0,"aria-expanded":"true"})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.length&&(!t.length||e.index()<t.index()),l=this.options.animate||{},u=h&&l.down||l,d=function(){o._toggleComplete(i)};return"number"==typeof u&&(a=u),"string"==typeof u&&(n=u),n=n||u.easing||l.easing,a=a||u.duration||l.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:d,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?r+=i.now:"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,d):e.animate(this.showProps,a,n,d)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var i=e(t.currentTarget);i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){function i(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,a,o,r,h=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:h=!1,n=this.previousFilter||"",a=String.fromCharCode(t.keyCode),o=!1,clearTimeout(this.filterTimer),a===n?o=!0:a=n+a,r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())}),s=o&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(a=String.fromCharCode(t.keyCode),r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())})),s.length?(this.focus(t,s),s.length>1?(this.previousFilter=a,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}h&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)}}),e.widget("ui.autocomplete",{version:"1.11.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="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",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.1",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(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("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.1",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.1"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())
+},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},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:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,N,C,A,I,P,z,H,F,E,j,O,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",N=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)C=(x+u)%7,N+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[C]+"'>"+p[C]+"</span></th>";for(M+=N+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),I=(this._getFirstDayOfMonth(et,Z)-u+7)%7,P=Math.ceil((I+A)/7),z=Q?this.maxRows>P?this.maxRows:P:P,this.maxRows=z,H=this._daylightSavingAdjust(new Date(et,Z,1-I)),F=0;z>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(H)+"</td>":"",x=0;7>x;x++)j=g?g.apply(e.input?e.input[0]:null,[H]):[!0,""],O=H.getMonth()!==Z,W=O&&!y||!j[0]||X&&X>H||$&&H>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(O?" ui-datepicker-other-month":"")+(H.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===H.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(O&&!v?"":" "+j[1]+(H.getTime()===G.getTime()?" "+this._currentClass:"")+(H.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(O&&!v||!j[2]?"":" title='"+j[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+H.getMonth()+"' data-year='"+H.getFullYear()+"'")+">"+(O&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+H.getDate()+"</span>":"<a class='ui-state-default"+(H.getTime()===R.getTime()?" ui-state-highlight":"")+(H.getTime()===G.getTime()?" ui-state-active":"")+(O?" ui-priority-secondary":"")+"' href='#'>"+H.getDate()+"</a>")+"</td>",H.setDate(H.getDate()+1),H=this._daylightSavingAdjust(H);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.1",e.datepicker,e.widget("ui.dialog",{version:"1.11.1",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;
+e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.progressbar",{version:"1.11.1",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),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()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectmenu",{version:"1.11.1",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this,i=this.element.attr("tabindex");this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:i||this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(e){e.preventDefault()},click:"_toggle",keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.attr("value"),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){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"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.spinner",{version:"1.11.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;
+return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.1",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){o.html(e),s._trigger("load",i,r)},1)}).complete(function(e,t){setTimeout(function(){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.1",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){e.data("ui-tooltip-open")&&n._delay(function(){t&&(t.type=a),this._open(t,e,i)})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,a.is(":hidden")||a.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i),a.length)return a.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):a.position(e.extend({of:i},this.options.position)),this.hiding=!1,this.closing=!1,a.hide(),this._show(a,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:a}),o={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}},i[0]!==this.element[0]&&(o.remove=function(){this._removeTooltip(a)}),t&&"mouseover"!==t.type||(o.mouseleave="close"),t&&"focusin"!==t.type||(o.focusout="close"),this._on(!0,i,o)}},close:function(t){var i=this,s=e(t?t.currentTarget:this.element),n=this._find(s);this.closing||(clearInterval(this.delayedShow),s.data("ui-tooltip-title")&&!s.attr("title")&&s.attr("title",s.data("ui-tooltip-title")),this._removeDescribedBy(s),this.hiding=!0,n.stop(!0),this._hide(n,this.options.hide,function(){i._removeTooltip(e(this)),this.hiding=!1,this.closing=!1}),s.removeData("ui-tooltip-open"),this._off(s,"mouseleave focusout keyup"),s[0]!==this.element[0]&&this._off(s,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,s){e(s.element).attr("title",s.title),delete i.parents[t]}),this.closing=!0,this._trigger("close",t,{tooltip:n}),this.hiding||(this.closing=!1))},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]=t,i},_find:function(t){var i=t.data("ui-tooltip-id");return i?e("#"+i):e()},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s[0],t.close(n,!0),e("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title")||s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}});var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.1",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)
+},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})}}); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/load_balancer_pool_edit/pool.js b/src/usr/local/www/javascript/load_balancer_pool_edit/pool.js
new file mode 100644
index 0000000..98e317c
--- /dev/null
+++ b/src/usr/local/www/javascript/load_balancer_pool_edit/pool.js
@@ -0,0 +1,191 @@
+/*
+ pool.js
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* Add server to virtual server pool
+ * operates on whatever form is passed to it
+ */
+function AddServerToPool(form) {
+ var ServerPort = form.ipaddr.value;
+ form['servers[]'].options[form['servers[]'].options.length] = new Option(ServerPort,ServerPort);
+}
+
+
+function AllServers(id, selectAll) {
+ var opts = document.getElementById(id).getElementsByTagName('option');
+ for (i = 0; i < opts.length; i++)
+ {
+ opts[i].selected = selectAll;
+ }
+}
+
+
+function RemoveServerFromPool(form, field)
+{
+ var theSel = form[field];
+ var selIndex = theSel.selectedIndex;
+ if (selIndex != -1) {
+ for(i=theSel.length-1; i>=0; i--)
+ {
+ if(theSel.options[i].selected)
+ {
+ theSel.options[i] = null;
+ }
+ }
+ if (theSel.length > 0) {
+ theSel.selectedIndex = selIndex == 0 ? 0 : selIndex - 1;
+ }
+ }
+}
+
+function addOption(theSel, theText, theValue)
+{
+ var newOpt = new Option(theText, theValue);
+ var selLength = theSel.length;
+ theSel.options[selLength] = newOpt;
+}
+
+function deleteOption(theSel, theIndex)
+{
+ var selLength = theSel.length;
+ if(selLength>0)
+ {
+ theSel.options[theIndex] = null;
+ }
+}
+
+function moveOptions(theSelFrom, theSelTo)
+{
+ var selLength = theSelFrom.length;
+ var selectedText = new Array();
+ var selectedValues = new Array();
+ var selectedCount = 0;
+
+ var i;
+
+ // Find the selected Options in reverse order
+ // and delete them from the 'from' Select.
+ for(i=selLength-1; i>=0; i--)
+ {
+ if(theSelFrom.options[i].selected)
+ {
+ selectedText[selectedCount] = theSelFrom.options[i].text;
+ selectedValues[selectedCount] = theSelFrom.options[i].value;
+ deleteOption(theSelFrom, i);
+ selectedCount++;
+ }
+ }
+
+ // Add the selected text/values in reverse order.
+ // This will add the Options to the 'to' Select
+ // in the same order as they were in the 'from' Select.
+ for(i=selectedCount-1; i>=0; i--)
+ {
+ addOption(theSelTo, selectedText[i], selectedValues[i]);
+ }
+}
+
+function checkPoolControls() {
+ var active = document.iform.serversSelect;
+ var inactive = document.iform.serversDisabledSelect;
+ if (jQuery("#mode").val() == "failover") {
+ if (jQuery("#serversSelect option").length > 0) {
+ jQuery("#moveToEnabled").prop("disabled",true);
+ } else {
+ jQuery("#moveToEnabled").prop("disabled",false);
+ }
+ } else {
+ jQuery("#moveToEnabled").prop("disabled",false);
+ }
+}
+
+function enforceFailover() {
+ if (jQuery("#mode").val() != "failover") {
+ return;
+ }
+ var active = document.iform.serversSelect;
+ var inactive = document.iform.serversDisabledSelect;
+ var count = 0;
+ var moveText = new Array();
+ var moveVals = new Array();
+ var i;
+ if (active.length > 1) {
+ // Move all but one entry to the disabled list
+ for (i=active.length-1; i>0; i--) {
+ moveText[count] = active.options[i].text;
+ moveVals[count] = active.options[i].value;
+ deleteOption(active, i);
+ count++;
+ }
+ for (i=count-1; i>=0; i--) {
+ addOption(inactive, moveText[i], moveVals[i]);
+ }
+ }
+}
+
+// functions up() and down() modified from http://www.babailiica.com/js/sorter/
+
+function up(obj) {
+ var sel = new Array();
+ for (var i=0; i<obj.length; i++) {
+ if (obj[i].selected == true) {
+ sel[sel.length] = i;
+ }
+ }
+ for (i in sel) {
+ if (sel[i] != 0 && !obj[sel[i]-1].selected) {
+ var tmp = new Array(obj[sel[i]-1].text, obj[sel[i]-1].value);
+ obj[sel[i]-1].text = obj[sel[i]].text;
+ obj[sel[i]-1].value = obj[sel[i]].value;
+ obj[sel[i]].text = tmp[0];
+ obj[sel[i]].value = tmp[1];
+ obj[sel[i]-1].selected = true;
+ obj[sel[i]].selected = false;
+ }
+ }
+}
+
+function down(obj) {
+ var sel = new Array();
+ for (var i=obj.length-1; i>-1; i--) {
+ if (obj[i].selected == true) {
+ sel[sel.length] = i;
+ }
+ }
+ for (i in sel) {
+ if (sel[i] != obj.length-1 && !obj[sel[i]+1].selected) {
+ var tmp = new Array(obj[sel[i]+1].text, obj[sel[i]+1].value);
+ obj[sel[i]+1].text = obj[sel[i]].text;
+ obj[sel[i]+1].value = obj[sel[i]].value;
+ obj[sel[i]].text = tmp[0];
+ obj[sel[i]].value = tmp[1];
+ obj[sel[i]+1].selected = true;
+ obj[sel[i]].selected = false;
+ }
+ }
+}
diff --git a/src/usr/local/www/javascript/load_balancer_relay_protocol_edit/load_balancer_relay_protocol_edit.js b/src/usr/local/www/javascript/load_balancer_relay_protocol_edit/load_balancer_relay_protocol_edit.js
new file mode 100644
index 0000000..6c44272
--- /dev/null
+++ b/src/usr/local/www/javascript/load_balancer_relay_protocol_edit/load_balancer_relay_protocol_edit.js
@@ -0,0 +1,56 @@
+/*
+ pool.js
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ * This code makes use of prototype shortcuts and will not work
+ * without prototype being loaded prior to it.
+ */
+
+function copyOption(theSrc, theDst)
+{
+ var selOption = theSrc[theSrc.selectedIndex];
+ theDst.options[theDst.length] = new Option(selOption.text, selOption.value);
+}
+
+function deleteOption(theSel)
+{
+ var theIndex = theSel.selectedIndex;
+ var selLength = theSel.length;
+ if(selLength>0)
+ {
+ theSel.options[theIndex] = null;
+ }
+}
+
+function AllOptions(el, selectAll) {
+ el.select('option').each(function(opt) {
+ opt.selected = selectAll;
+ });
+}
+
diff --git a/src/usr/local/www/javascript/niftyjsCode.js b/src/usr/local/www/javascript/niftyjsCode.js
new file mode 100644
index 0000000..75ef8b0
--- /dev/null
+++ b/src/usr/local/www/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/javascript/numericupdown/css/numericupdown.css b/src/usr/local/www/javascript/numericupdown/css/numericupdown.css
new file mode 100644
index 0000000..429619b
--- /dev/null
+++ b/src/usr/local/www/javascript/numericupdown/css/numericupdown.css
@@ -0,0 +1,40 @@
+.buttonInc,
+.buttonDec
+ {
+ margin:0;
+ padding:0;
+ width:11px;
+ height:8px;
+ vertical-align:top;
+ background-color:#ccc;
+ text-indent:-999px;
+ overflow:hidden;
+ background:#ccc url(../images/up.gif) no-repeat 50% 50%;
+ border-top:1px solid #eee;
+ border-left:1px solid #eee;
+ border-bottom:1px solid #777;
+ border-right:1px solid #777;
+ voice-family: inherit;
+ height:9px;
+ }
+html>body .buttonInc,
+html>body .buttonDec
+ {
+ height:9px;
+ }
+.buttonDec
+ {
+ margin:9px 0 0 -11px;
+ background:#ccc url(../images/down.gif) no-repeat 50% 50%;
+ voice-family: inherit;
+ margin:10px 0 0 -11px;
+ }
+html>body .buttonDec
+ {
+ margin:10px 0 0 -11px;
+ }
+button
+ {
+ font-family:monospace;
+ line-height:1em;
+ }
diff --git a/src/usr/local/www/javascript/numericupdown/images/down.gif b/src/usr/local/www/javascript/numericupdown/images/down.gif
new file mode 100755
index 0000000..278664a
--- /dev/null
+++ b/src/usr/local/www/javascript/numericupdown/images/down.gif
Binary files differ
diff --git a/src/usr/local/www/javascript/numericupdown/images/up.gif b/src/usr/local/www/javascript/numericupdown/images/up.gif
new file mode 100755
index 0000000..ad33679
--- /dev/null
+++ b/src/usr/local/www/javascript/numericupdown/images/up.gif
Binary files differ
diff --git a/src/usr/local/www/javascript/numericupdown/js/numericupdown.js b/src/usr/local/www/javascript/numericupdown/js/numericupdown.js
new file mode 100644
index 0000000..a6af0d4
--- /dev/null
+++ b/src/usr/local/www/javascript/numericupdown/js/numericupdown.js
@@ -0,0 +1,287 @@
+// As usual, we keep the generic functions out of the namespace
+function addEvent(obj, evType, fn, useCapture){
+ if (obj.addEventListener){
+ obj.addEventListener(evType, fn, useCapture);
+ return true;
+ } else if (obj.attachEvent){
+ var r = obj.attachEvent("on"+evType, fn);
+ return r;
+ }
+ return false;
+}
+
+function removeEvent(obj, evType, fn, useCapture){
+ if (obj.removeEventListener){
+ obj.removeEventListener(evType, fn, useCapture);
+ return true;
+ } else if (obj.detachEvent){
+ var r = obj.detachEvent("on"+evType, fn);
+ return r;
+ }
+ return false;
+}
+
+if(!String.prototype.trim) String.prototype.trim = function() { return this.replace(/^\s*/,'').replace(/\s*$/, ''); };
+
+var incrementalInputController;
+
+// Encapsulate the Timer and incrementalInput objects
+(function() {
+
+// WEBFX Timer : http://www.webfx.com/
+function Timer(nPauseTime) {
+ this._pauseTime = typeof nPauseTime == "undefined" ? 1000 : nPauseTime;
+ this._timer = null;
+ this._isStarted = false;
+}
+
+Timer.prototype.start = function () {
+ if (this.isStarted())
+ this.stop();
+ var oThis = this;
+ this._timer = window.setTimeout(function () {
+ if (typeof oThis.ontimer == "function")
+ oThis.ontimer();
+ }, this._pauseTime);
+ this._isStarted = false;
+};
+
+Timer.prototype.stop = function () {
+ if (this._timer != null)
+ window.clearTimeout(this._timer);
+ this._isStarted = false;
+};
+
+Timer.prototype.isStarted = function () {
+ return this._isStarted;
+};
+
+Timer.prototype.getPauseTime = function () {
+ return this._pauseTime;
+};
+
+Timer.prototype.setPauseTime = function (nPauseTime) {
+ this._pauseTime = nPauseTime;
+};
+
+function incrementalInput(inp, range, increment, classInc, classDec) {
+ if(!inp || !range) return;
+
+ this._inp = inp;
+ this._buttonInc;
+ this._buttonDec;
+ this._value;
+ this._classInc = classInc;
+ this._classDec = classDec;
+ this._minv = Number(range[0]);
+ this._maxv = Number(range[1]);
+ this._incBase = Number(increment) || 1;
+ this._precision = 0;
+ if(increment.indexOf('.') != -1) {
+ this._precision = increment.substr(increment.indexOf('.')+1, increment.length);
+ this._precision = this._precision.length;
+ }
+
+ this._increment;
+ this._timerInc = 1000;
+ this._timer = new Timer(1000);
+ this._stop = false;
+ this._key = false;
+
+ this._events = {
+
+ dec: function(e) {
+ self._increment = -self._incBase;
+ self.updateValue();
+ return false;
+ },
+ inc: function(e) {
+ self._increment = self._incBase;
+ self.updateValue();
+ return false;
+ },
+ keydec: function(e) {
+ var kc;
+ if (!e) var e = window.event;
+
+ if (e.keyCode) kc = e.keyCode;
+ else if (e.charCode) kc = e.charCode;
+
+ if ( kc != 13 || self._key ) return true;
+
+ self._key = true;
+ self._increment = -self._incBase;
+ self._timerInc = 1000;
+ self.updateValue();
+ return false;
+ },
+ keyinc: function(e) {
+ var kc;
+ if (!e) var e = window.event;
+
+ if (e.keyCode) kc = e.keyCode;
+ else if (e.charCode) kc = e.charCode;
+
+ if ( kc != 13 || self._key ) return true;
+
+ self._key = true;
+ self._increment = self._incBase;
+ self._timerInc = 1000;
+ self.updateValue();
+ return false;
+ },
+ clearTimer: function(e) {
+ self._key = false;
+ self._events.stopTimer();
+ },
+ stopTimer: function(e) {
+ self._timer.stop();
+ self._timerInc = 1000;
+ self._timer.setPauseTime(self._timerInc);
+ },
+ onchange: function(e){
+ var value = Number(parseFloat(self._inp.value).toFixed(self._precision));
+
+ if( Number(value % self._incBase).toFixed(self._precision) != self._incBase ) {
+ value -= Number(parseFloat(value % self._incBase)).toFixed(self._precision);
+ };
+ if(value < self._minv) value = self._minv;
+ else if(value > self._maxv) value = self._maxv;
+ self._inp.value = parseFloat(value).toFixed(self._precision);
+ }
+ };
+
+ this.updateValue = function() {
+ if(self._inp.disabled) {
+ stopTimer();
+ return;
+ }
+
+
+ var value = Number(parseFloat(self._inp.value).toFixed(self._precision));
+ var stop = self._timerInc == 0 ? true : false;
+
+ if( Math.abs(Number(value % self._incBase).toFixed(self._precision)) != self._incBase ) {
+ value -= Number(parseFloat(value % self._incBase)).toFixed(self._precision);
+ }
+
+ value += Number(parseFloat(self._increment).toFixed(self._precision));
+
+ if(value < self._minv) {
+ value = self._minv;
+ stop = true;
+ } else if(value > self._maxv) {
+ value = self._maxv;
+ stop = true;
+ }
+
+ self._inp.value = parseFloat(value).toFixed(self._precision);
+
+ if(self._timerInc > 50) {
+ self._timerInc = 50 + Math.round(((self._timerInc - 50) / 1.8));
+ }
+
+ self._timer.setPauseTime(self._timerInc);
+ if(!stop) self._timer.start();
+ };
+
+ this.construct = function() {
+ var h = self._inp.offsetHeight;
+
+ self._inp.onchange = self._events.onchange;
+
+ self._buttonInc = document.createElement('button');
+ self._buttonDec = document.createElement('button');
+
+ if(self._classDec) self._buttonDec.className = self._classDec;
+ if(self._classInc) self._buttonInc.className = self._classInc;
+
+ self._buttonDec.setAttribute('type','button');
+ self._buttonInc.setAttribute('type','button');
+
+ self._buttonDec.appendChild(document.createTextNode('-'));
+ self._buttonInc.appendChild(document.createTextNode('+'));
+
+ self._buttonDec.onmousedown = self._events.dec;
+ self._buttonInc.onmousedown = self._events.inc;
+
+ addEvent(self._buttonDec, "keypress", self._events.keydec, true);
+ addEvent(self._buttonDec, "keyup", self._events.clearTimer, true);
+ addEvent(self._buttonInc, "keypress", self._events.keyinc, true);
+ addEvent(self._buttonInc, "keyup", self._events.clearTimer, true);
+
+ self._buttonInc.onmouseout = self._events.stopTimer;
+ self._buttonDec.onmouseout = self._events.stopTimer;
+
+ addEvent(document, 'mouseup', self._events.stopTimer, false);
+
+ if(self._inp.nextSibling) {
+ self._inp.parentNode.insertBefore( self._buttonDec, self._inp.nextSibling );
+ self._inp.parentNode.insertBefore( self._buttonInc, self._inp.nextSibling );
+ } else {
+ self._inp.parentNode.appendChild( self._buttonInc );
+ self._inp.parentNode.appendChild( self._buttonDec );
+ };
+ };
+
+ var self = this;
+
+ self._timer.ontimer = function() { self.updateValue(); };
+ self.construct();
+}
+
+incremetalInputController = {
+ inputCollection: [],
+ constructor: function() {
+
+ if(!document.getElementById || !document.createElement) return;
+
+ // TODO : cut the regExps down to readable levels - they are hideous at present...
+ var regExp_1 = /fd_incremental_inp_range_([-]{0,1}[0-9]+(f[0-9]+){0,1}){1}_([-]{0,1}[0-9]+(f[0-9]+){0,1}){1}/ig;
+ var regExp_2 = /fd_increment_([0-9]+(f[0-9]+){0,1}){1}/ig;
+ var regExp_3 = /fd_classname_inc_([\-_0-9a-zA-Z]+){1}/ig;
+ var regExp_4 = /fd_classname_dec_([\-_0-9a-zA-Z]+){1}/ig;
+
+ var inputCollection = document.getElementsByTagName('input');
+ var obj, range, classname, classes, classInc, classDec, increment;
+
+ for(var i = 0, inp; inp = inputCollection[i]; i++) {
+ if(inp.type == 'text' && inp.className && inp.className.search(regExp_1) != -1) {
+ classes = inp.className.split(' ');
+ increment = 1;
+ range = [0,0];
+ classInc = "";
+ classDec = "";
+
+ for(var z = 0, classname; classname = classes[z]; z++) {
+ if(classname.search(regExp_1) != -1) {
+ range = classname.trim();
+ range = range.replace(/fd_incremental_inp_range_/ig, '');
+ range = range.replace(/f/g,'.');
+ range = range.split('_');
+ } else if(classname.search(regExp_2) != -1) {
+ increment = classname.trim();
+ increment = increment.replace(/fd_increment_/ig, '');
+ increment = increment.replace('f','.');
+ } else if(classname.search(regExp_3) != -1) {
+ classInc = classname.trim();
+ classInc = classInc.replace(/fd_classname_inc_/ig, '');
+ } else if(classname.search(regExp_4) != -1) {
+ classDec = classname.trim();
+ classDec = classDec.replace(/fd_classname_dec_/ig, '');
+ }
+ }
+
+ if (inp.value.length == 0 || isNaN(inp.value) == true) { inp.value = 0; }
+
+ obj = new incrementalInput(inp, range, increment, classInc, classDec);
+ incremetalInputController.inputCollection.push(obj);
+ }
+ }
+ }
+};
+
+// Close and call anonymous function
+})();
+
+addEvent(window, 'load', incremetalInputController.constructor, true); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/pi.js b/src/usr/local/www/javascript/pi.js
new file mode 100644
index 0000000..8a3a3c3
--- /dev/null
+++ b/src/usr/local/www/javascript/pi.js
@@ -0,0 +1,682 @@
+(function(_scope){
+
+ /*
+ * pi.js
+ * 1.0
+ * Azer Koçulu <http://azer.kodfabrik.com>
+ * http://pi-js.googlecode.com
+ */
+
+ _scope.pi = Object(3.14159265358979323846);
+ var pi = _scope.pi;
+ pi.version = 1.0;
+
+ pi.env = {
+ ie: /MSIE/i.test(navigator.userAgent),
+ ie6: /MSIE 6/i.test(navigator.userAgent),
+ ie7: /MSIE 7/i.test(navigator.userAgent),
+ ie8: /MSIE 8/i.test(navigator.userAgent),
+ firefox: /Firefox/i.test(navigator.userAgent),
+ opera: /Opera/i.test(navigator.userAgent),
+ webkit: /Webkit/i.test(navigator.userAgent)
+ };
+
+ pi.util = {
+ IsArray:function(_object){
+ return _object && _object != window && ( _object instanceof Array || ( typeof _object.length == "number" && typeof _object.item =="function" ) );
+ },
+ IsHash:function(_object){
+ return _object && typeof _object=="object"&&(_object==window||_object instanceof Object)&&!_object.nodeName&&!pi.util.IsArray(_object);
+ },
+ DOMContentLoaded:[],
+ AddEvent: function(_element,_eventName,_fn,_useCapture){
+ _element[pi.env.ie.toggle("attachEvent","addEventListener")](pi.env.ie.toggle("on","")+_eventName,_fn,_useCapture||false);
+ return pi.util.AddEvent.curry(this,_element);
+ },
+ RemoveEvent: function(_element,_eventName,_fn,_useCapture){
+ return _element[pi.env.ie.toggle("detachEvent","removeEventListener")](pi.env.ie.toggle("on","")+_eventName,_fn,_useCapture||false);
+ },
+ GetWindowSize:function(){
+ return {
+ height:pi.env.ie?Math.max(document.documentElement.clientHeight,document.body.clientHeight):window.innerHeight,
+ width:pi.env.ie?Math.max(document.documentElement.clientWidth,document.body.clientWidth):window.innerWidth
+ };
+ },
+ Include:function(_url,_callback){
+ var script = new pi.element("script").attribute.set("src",_url), callback = _callback||new Function, done = false, head = pi.get.byTag("head")[0];
+ script.environment.getElement().onload = script.environment.getElement().onreadystatechange = function(){
+ if(!done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")){
+ callback.call(this);
+ done = true;
+ head.removeChild(script.environment.getElement());
+ }
+ };
+ script.insert(head);
+ },
+ Element:{
+ addClass:function(_element,_class){
+ if( !pi.util.Element.hasClass(_element,_class) )
+ pi.util.Element.setClass(_element, pi.util.Element.getClass(_element) + " " + _class );
+ },
+ getClass:function(_element){
+ return _element.getAttribute(pi.env.ie.toggle("className","class"))||"";
+ },
+ hasClass:function(_element,_class){
+ return pi.util.Element.getClass(_element).split(" ").indexOf(_class)>-1;
+ },
+ removeClass:function(_element,_class){
+ if( pi.util.Element.hasClass(_element,_class) )
+ pi.util.Element.setClass(
+ _element,
+ pi.util.Element.getClass(_element,_class).split(" ").removeValue(_class).join(" ")
+ );
+ },
+ setClass:function(_element,_value){
+ _element.setAttribute( pi.env.ie.toggle("className","class"), _value );
+ },
+ toggleClass:function(){
+ if(pi.util.Element.hasClass.apply(this,arguments))
+ pi.util.Element.removeClass.apply(this,arguments);
+ else
+ pi.util.Element.addClass.apply(this,arguments);
+ },
+ getOpacity:function(_styleObject){
+ var styleObject = _styleObject;
+ if(!pi.env.ie)
+ return styleObject["opacity"];
+
+ var alpha = styleObject["filter"].match(/opacity\=(\d+)/i);
+ return alpha?alpha[1]/100:1;
+ },
+ setOpacity:function(_element,_value){
+ if(!pi.env.ie)
+ return pi.util.Element.addStyle(_element,{ "opacity":_value });
+ _value*=100;
+ pi.util.Element.addStyle(_element,{ "filter":"alpha(opacity="+_value+")" });
+ return this._parent_;
+ },
+ getPosition:function(_element){
+ var parent = _element,offsetLeft = 0, offsetTop = 0, view = pi.util.Element.getView(_element);
+ while(parent&&parent!=document.body&&parent!=document.firstChild){
+ offsetLeft +=parseInt(parent.offsetLeft);
+ offsetTop += parseInt(parent.offsetTop);
+ parent = parent.offsetParent;
+ };
+ return {
+ "bottom":view["bottom"],
+ "left":view["left"],
+ "marginTop":view["marginTop"],
+ "marginLeft":view["marginLeft"],
+ "offsetLeft":offsetLeft,
+ "offsetTop":offsetTop,
+ "position":view["position"],
+ "right":view["right"],
+ "top":view["top"],
+ "z-index":view["zIndex"]
+ };
+ },
+ getSize:function(_element){
+ var view = pi.util.Element.getView(_element);
+ return {
+ "height":view["height"],
+ "offsetHeight":_element.offsetHeight,
+ "offsetWidth":_element.offsetWidth,
+ "width":view["width"]
+ };
+ },
+ addStyle:function(_element,_style){
+ for(var key in _style){
+ key = key=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):key;
+ if (key == "opacity" && pi.env.ie) {
+ pi.util.Element.setOpacity(_element,_style[key]);
+ continue;
+ }
+ _element.style[key] = _style[key];
+ }
+ },
+ getStyle:function(_element,_property){
+ _property = _property=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):_property;
+ if(_property=="opacity"&&pi.env.ie)
+ return pi.util.Element.getOpacity(_element.style);
+ return typeof _property=="string"?_element.style[_property]:_element.style;
+ },
+ getView:function(_element,_property){
+ var view = document.defaultView?document.defaultView.getComputedStyle(_element,null):_element.currentStyle;
+ _property = _property=="float"?pi.env.ie.toggle("styleFloat","cssFloat"):_property;
+ if(_property=="opacity"&&pi.env.ie)
+ return pi.util.Element.getOpacity(_element,view);
+ return typeof _property=="string"?view[_property]:view;
+ }
+ },
+ CloneObject:function(_object,_fn){
+ var tmp = {};
+ for(var key in _object)
+ {
+ if( pi.util.IsArray( _object[key] ) ){
+ tmp[key] = Array.prototype.clone.apply( _object[key] );
+ } else
+ if( pi.util.IsHash( _object[key] ) ){
+ tmp[ key ] = pi.util.CloneObject(_object[key]);
+ if(_fn)_fn.call(tmp,key,_object);
+ } else
+ tmp[key] = _object[key];
+ }
+ return tmp;
+ },
+ MergeObjects:function(_object,_source){
+ for(var key in _source){
+ var value = _source[key];
+ if (pi.util.IsArray(_source[key])) {
+ if(pi.util.IsArray( _object[key] )){
+ Array.prototype.push.apply( _source[key], _object[key] );
+ }
+ else
+ value = _source[key].clone();
+ }
+ else
+ if (pi.util.IsHash(_source[key])) {
+ if (pi.util.IsHash(_object[key])) {
+ value = pi.util.MergeObjects(_object[key], _source[key]);
+ } else {
+ value = pi.util.CloneObject( _source[key] );
+ }
+ }
+ _object[key] = value;
+ };
+ return _object;
+ }
+ };
+
+ pi.get = function(){
+ return document.getElementById(arguments[0]);
+ };
+ pi.get.byTag = function(){
+ return document.getElementsByTagName(arguments[0]);
+ };
+ pi.get.byClass = function(){ return document.getElementsByClassName.apply(document,arguments); };
+
+ pi.base = function(){
+ this.body = {};
+ this.constructor = null;
+
+ this.build = function(_skipClonning){
+ var base = this, skipClonning = _skipClonning||false, _private = {},
+ fn = function(){
+ var _p = pi.util.CloneObject(_private);
+ if(!skipClonning){
+ for(var key in this){
+
+ if(pi.util.IsArray( this[ key ] ) ){
+ this[key] = Array.prototype.clone.apply( this[key] );
+ } else
+ if( pi.util.IsHash(this[key]) ){
+ this[key] = pi.util.CloneObject(
+ this[ key ],
+ function(_key,_object){
+ this[ _key ]._parent_ = this;
+ }
+ );
+ this[key]._parent_ = this;
+ }
+ }
+ };
+ base.createAccessors( _p, this );
+ if(base.constructor)
+ return base.constructor.apply(this,arguments);
+ return this;
+ };
+ this.movePrivateMembers(this.body,_private);
+ if(this.constructor){
+ fn["$Constructor"] = this.constructor;
+ }
+ fn.prototype = this.body;
+ return fn;
+ };
+
+ this.createAccessors = function(_p, _branch){
+ var getter = function(_property){ return this[_property]; },
+ setter = function(_property,_value){ this[_property] = _value; return _branch._parent_||_branch; };
+
+ for (var name in _p) {
+ var isPrivate = name.substring(0, 1) == "_", title = name.substring(1, 2).toUpperCase() + name.substring(2);
+ if (isPrivate) {
+ _branch["get" + title] = getter.curry(_p,name);
+ _branch["set" + title] = setter.curry(_p,name);
+ }
+ else
+ if (pi.util.IsHash(_p[name])){
+ if(!_branch[name])
+ _branch[name] = {};
+ this.createAccessors(_p[name], _branch[name]);
+ }
+ };
+ };
+
+ this.movePrivateMembers = function(_object, _branch){
+ for (var name in _object) {
+ var isPrivate = name.substring(0, 1) == "_";
+
+ if (isPrivate) {
+ _branch[name] = _object[name];
+ delete _object[name];
+ }
+ else
+ if (pi.util.IsHash(_object[name])){
+ _branch[name] = {};
+ this.movePrivateMembers(_object[name], _branch[name]);
+ }
+ };
+ };
+ };
+
+ Function.prototype.extend = function(_prototype,_skipClonning){
+ var object = new pi.base, superClass = this;
+ if(_prototype["$Constructor"]){
+ object.constructor = _prototype["$Constructor"];
+ delete _prototype["$Constructor"];
+ };
+
+ object.body = superClass==pi.base?_prototype:pi.util.MergeObjects(_prototype,superClass.prototype,2);
+ object.constructor=object.constructor||function(){
+ if(superClass!=pi.base)
+ superClass.apply(this,arguments);
+ };
+
+ return object.build(_skipClonning);
+ };
+
+ Function.prototype.curry = function(_scope){
+ var fn = this, scope = _scope||window, args = Array.prototype.slice.call(arguments,1);
+ return function(){
+ return fn.apply(scope,args.concat( Array.prototype.slice.call(arguments,0) ));
+ };
+ };
+
+ pi.element = pi.base.extend({
+ "$Constructor":function(_tag){
+ this.environment.setElement(document.createElement(_tag||"DIV"));
+ this.environment.getElement().pi = this;
+ return this;
+ },
+ "clean":function(){
+ var childs = this.child.get();
+ while(childs.length){
+ childs[0].parentNode.removeChild(childs[0]);
+ }
+ },
+ "clone":function(_deep){
+ return this.environment.getElement().cloneNode(_deep);
+ },
+ "insert":function(_element){
+ _element = _element.environment?_element.environment.getElement():_element;
+ _element.appendChild(this.environment.getElement());
+ return this;
+ },
+ "insertAfter":function(_referenceElement){
+ _referenceElement = _referenceElement.environment?_referenceElement.environment.getElement():_referenceElement;
+ _referenceElement.nextSibling?this.insertBefore(_referenceElement.nextSibling):this.insert(_referenceElement.parentNode);
+ return this;
+ },
+ "insertBefore":function(_referenceElement){
+ _referenceElement = _referenceElement.environment?_referenceElement.environment.getElement():_referenceElement;
+ _referenceElement.parentNode.insertBefore(this.environment.getElement(),_referenceElement);
+ return this;
+ },
+ "query":function(_expression,_resultType,namespaceResolver,_result){
+ return pi.xpath(_expression,_resultType||"ORDERED_NODE_SNAPSHOT_TYPE",this.environment.getElement(),_namespaceResolver,_result);
+ },
+ "remove":function(){
+ this.environment.getParent().removeChild(
+ this.environment.getElement()
+ );
+ },
+ "update":function(_value){
+ ["textarea","input"].indexOf(this.environment.getName())>-1?
+ (this.environment.getElement().value = _value):
+ (this.environment.getElement().innerHTML = _value);
+ return this;
+ },
+ "attribute":{
+ "getAll":function(_name){
+ return this._parent_.environment.getElement().attributes;
+ },
+ "clear":function(_name){
+ this.set(_name,"");
+ return this._parent_;
+ },
+ "get":function(_name){
+ return this._parent_.environment.getElement().getAttribute(_name);
+ },
+ "has":function(_name){
+ return pi.env.ie?(this.get(_name)!=null):this._parent_.environment.getElement().hasAttribute(_name);
+ },
+ "remove":function(_name){
+ this._parent_.environment.getElement().removeAttribute(_name);
+ return this._parent_;
+ },
+ "set":function(_name,_value){
+ this._parent_.environment.getElement().setAttribute(_name,_value);
+ return this._parent_;
+ },
+ "addClass":function(_classes){
+ for (var i = 0; i < arguments.length; i++) {
+ pi.util.Element.addClass(this._parent_.environment.getElement(),arguments[i]);
+ };
+ return this._parent_;
+ },
+ "clearClass":function(){
+ this.setClass("");
+ this._parent_;
+ },
+ "getClass":function(){
+ return pi.util.Element.getClass( this._parent_.environment.getElement() );
+ },
+ "hasClass":function(_class){
+ return pi.util.Element.hasClass( this._parent_.environment.getElement(), _class );
+ },
+ "setClass":function(_value){
+ return pi.util.Element.setClass( this._parent_.environment.getElement(), _value );
+ },
+ "removeClass":function(_class){
+ pi.util.Element.removeClass( this._parent_.environment.getElement(), _class );
+ return this._parent_;
+ },
+ "toggleClass":function(_class){
+ pi.util.Element.toggleClass( this._parent_.environment.getElement(), _class );
+ }
+ },
+ "child":{
+ "get":function(){
+ return this._parent_.environment.getElement().childNodes;
+ },
+ "add":function(_elements){
+ for (var i = 0; i < arguments.length; i++) {
+ var el = arguments[i];
+ this._parent_.environment.getElement().appendChild(
+ el.environment ? el.environment.getElement() : el
+ );
+ }
+ return this._parent_;
+ },
+ "addAfter":function(_element,_referenceElement){
+ this.addBefore(
+ _element.environment?_element.environment.getElement():_element,
+ (_referenceElement.environment?_referenceElement.environment.getElement():_referenceElement).nextSibling
+ );
+ return this._parent_;
+ },
+ "addBefore":function(_element,_referenceElement){
+ this._parent_.environment.getElement().insertBefore(
+ _element.environment?_element.environment.getElement():_element,
+ _referenceElement.environment?_referenceElement.environment.getElement():_referenceElement
+ );
+ return this._parent_;
+ },
+ "query":function(_tag,_attributeName,_attributeValue){
+ return this._parent_.query(
+ "{0}{1}".format( (_tag?"{0}".format(_tag):"/*"), _attributeName||_attributeValue?"[contains(concat(' ', @{0}, ' '),' {1} ')]".format(_attributeName||"",_attributeValue||""):"" )
+ );
+ },
+ "remove":function(_element){
+ this._parent_.environment.getElement().removeChild(_element.environment?_element.environment.getElement():_element);
+ }
+ },
+ "environment":{
+ "_element":null,
+ "getParent":function(){
+ return this.getElement().parentNode;
+ },
+ "getPosition":function(){
+ return pi.util.Element.getPosition(this.getElement());
+ },
+ "getSize":function(){
+ return pi.util.Element.getSize( this.getElement() );
+ },
+ "addStyle":function(_styleObject){
+ pi.util.Element.addStyle(this.getElement(),_styleObject);
+ return this._parent_;
+ },
+ "getStyle":function(_property){
+ return pi.util.Element.getStyle(_property);
+ },
+ "getName":function(){
+ return this.getElement().nodeName;
+ },
+ "getType":function(){
+ return this.getElement().nodeType;
+ },
+ "getView":function(_property){
+ return pi.util.Element.getView(this.getElement(),_property);
+ }
+ },
+ "event":{
+ "addListener":function(_event,_fn,_useCapture){
+ pi.util.AddEvent(this._parent_.environment.getElement(),_event,_fn,_useCapture);
+ return this._parent_;
+ },
+ "removeListener":function(_event,_fn,_useCapture){
+ pi.util.RemoveEvent(this._parent_.environment.getElement(),_event,_fn,_useCapture);
+ return this._parent_;
+ }
+ }
+ });
+
+ pi.xhr = new pi.base;
+ pi.xhr.constructor = function(){
+ var api;
+ if(!window.XMLHttpRequest){
+ var names = ["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
+ for (var i = 0; i < names.length; i++) {
+ try {
+ this.environment.setApi(new ActiveXObject(names[i]));
+ break;
+ } catch (e) { continue; }
+ }
+ }
+ else
+ this.environment.setApi(new XMLHttpRequest());
+ this.environment.getApi().onreadystatechange=this.event.readystatechange.curry(this);
+ return this;
+ };
+ pi.xhr.body = {
+ "abort":function(){
+ this.environment.getApi().abort();
+ },
+ "send":function(){
+ var url = this.environment.getUrl(), data = this.environment.getData(),dataUrl = "";
+
+ for (var key in data)
+ dataUrl += "{0}={1}&".format(key, data[key]);
+
+ if (this.environment.getType()=="GET")
+ url += (url.search("\\?")==-1?"?":"&")+"{0}".format(dataUrl);
+
+ this.environment.getApi().open(this.environment.getType(),url,this.environment.getAsync());
+
+ for(var key in this.environment.getHeader())
+ this.environment.getApi().setRequestHeader(key,this.environment.getHeader()[key]);
+
+ this.environment.getApi().send(this.environment.getType()=="GET"?"":dataUrl);
+ }
+ };
+ pi.xhr.body.environment = {
+ "_async":true, "_api":null, "_cache":true, "_callback":[], "_channel":null, "_data":{}, "_header":{}, "_mimeType":null, "_multipart":false, "_type":"GET", "_timeout":0, "_url":"",
+ "addCallback": function(_options,_fn){
+ this.getCallback().push({ "fn":_fn, "options":_options });
+ },
+ "addHeader": function(_key,_value){
+ this.getHeader()[_key] = _value;
+ },
+ "addData": function(_key,_value){
+ this.getData()[_key] = _value;
+ },
+ "changeCache":function(_value){
+ if(_value==false){
+ this.addData("forceCache",Math.round(Math.random()*10000));
+ }
+ this.setCache(_value);
+ },
+ "changeType": function(_value){
+ if(_value=="POST"){
+ this.addHeader("Content-Type","application/x-www-form-urlencoded");
+ }
+ this.setType(_value);
+ }
+ };
+ pi.xhr.body.event = {
+ "readystatechange":function(){
+ var readyState = this.environment.getApi().readyState;
+ var callback=this.environment.getCallback();
+
+ for (var i = 0; i < callback.length; i++) {
+ if(callback[i].options.readyState.indexOf(readyState)>-1)
+ callback[i].fn.apply(this);
+ }
+ }
+ };
+ pi.xhr = pi.xhr.build();
+
+ /*
+ * xml.xhr.get
+ */
+
+ pi.xhr.get = function(_url,_returnPiObject){
+ var request = new pi.xhr();
+ request.environment.setAsync(false);
+ request.environment.setUrl(_url);
+ request.send();
+ return _returnPiObject?request:request.environment.getApi();
+ };
+
+ /*
+ * pi.xpath
+ */
+
+ pi.xpath = function(_expression,_resultType,_contextNode,_namespaceResolver,_result){
+ var contextNode = _contextNode||document,
+ expression = _expression||"",
+ namespaceResolver = _namespaceResolver||null,
+ result=_result||null,
+ resultType=_resultType||"ANY_TYPE";
+ return document.evaluate(expression, contextNode, namespaceResolver, XPathResult[resultType], result);
+ };
+
+ Array.prototype.clone = function(){
+ var tmp = [];
+ Array.prototype.push.apply(tmp,this);
+ tmp.forEach(function(item,index,object){
+ if(item instanceof Array)
+ object[index] = object[index].clone();
+ });
+ return tmp;
+ };
+ Array.prototype.count = function(_value){
+ var count = 0;
+ this.forEach(function(){
+ count+=Number(arguments[0]==_value);
+ });
+ return count;
+ };
+
+ Array.prototype.forEach = Array.prototype.forEach||function(_function){
+ for(var i=0; i<this.length; i++)
+ _function.apply(this,[this[i],i,this]);
+ };
+
+ Array.prototype.getLastItem = function(){
+ return this[this.length-1];
+ };
+
+ Array.prototype.indexOf = Array.prototype.indexOf||function(_value){
+ var index = -1;
+ for(var i=0; i<this.length; i++)
+ if(this[i]==_value){
+ index = i;
+ break;
+ }
+ return index;
+ };
+
+ Array.prototype.remove = function(_index){
+ var array = this.slice(0,_index);
+ Array.prototype.push.apply(array,this.slice(_index+1));
+ return array;
+ };
+
+ Array.prototype.removeValue = function(_value){
+ return this.remove(this.indexOf(_value));
+ };
+
+ Boolean.prototype.toggle = function(){
+ return this==true?arguments[0]:arguments[1];
+ };
+
+ Number.prototype.base = function(_system){
+ var remain = this%_system;
+ if(this==remain)return String.fromCharCode(this+(this>9?87:48));
+ return ((this-remain)/_system).base(_system)+String.fromCharCode(remain+(remain>9?87:48));
+ };
+ Number.prototype.decimal = function(_system){
+ var result = 0, digit = String(this).split("");
+ for(var i=0; i<digit.length; i++)
+ {
+ digit[i]=parseInt((digit[i].charCodeAt(0)>58)?digit[i].charCodeAt(0)-87:digit[i]);
+ result += digit[i]*(Math.pow(_system,digit.length-1-i));
+ }
+ return result;
+ };
+ Number.prototype.range = function(_pattern){
+ for(
+ var value = String(this), isFloat = /\./i.test(value),
+ i = isFloat.toggle(parseInt(value.split(".")[0]),0),
+ end = parseInt(value.split(".")[isFloat.toggle(1,0)]),
+ array = []; i<end; i++
+ ){
+ array.push(
+ Boolean(_pattern)==false?i:(typeof _pattern=="function"?_pattern(i):_pattern[i])
+ );
+ }
+ return array;
+ };
+
+ String.prototype.escape = function(){
+ return escape(this);
+ };
+
+ String.prototype.format = function(){
+ var values = arguments;
+ return this.replace(/\{(\d)\}/g,function(){
+ return values[arguments[1]];
+ });
+ };
+
+ String.prototype.leftpad = function(_len,_ch){
+ var str=this;
+ var ch = Boolean(_ch)==false?" ":_ch;
+ while(str.length<_len)
+ str=ch+str;
+ return str;
+ };
+
+ String.prototype.toggle = function(_value,_other){
+ return this==_value?_value:_other;
+ };
+
+ String.prototype.unicode = function(){
+ var str="", obj = this.split("");
+ for(var i=obj.length-1; i>=0; i--)
+ str="\\u{0}{1}".format(String(obj[i].charCodeAt(0).base(16)).leftpad(4,"0"),str);
+ return str;
+ };
+
+ pi.util.AddEvent(
+ pi.env.ie?window:document,
+ pi.env.ie?"load":"DOMContentLoaded",
+ function(){
+ for(var i=0; i<pi.util.DOMContentLoaded.length; i++){
+ pi.util.DOMContentLoaded[ i ]();
+ }
+ }
+ );
+
+})(window); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/row_helper.js b/src/usr/local/www/javascript/row_helper.js
new file mode 100644
index 0000000..07d4bfc
--- /dev/null
+++ b/src/usr/local/www/javascript/row_helper.js
@@ -0,0 +1,97 @@
+// Global Variables
+var rowname = new Array(4999);
+var rowtype = new Array(4999);
+var newrow = new Array(4999);
+var rowsize = new Array(4999);
+
+for (i = 0; i < 4999; i++) {
+ rowname[i] = '';
+ rowtype[i] = '';
+ newrow[i] = '';
+ rowsize[i] = '30';
+}
+
+var field_counter_js = 0;
+var loaded = 0;
+var is_streaming_progress_bar = 0;
+var temp_streaming_text = "";
+
+var addRowTo = (function() {
+ return (function (tableId) {
+ var $ = jQuery;
+ var d, tbody, tr, td, bgc, i, ii, j;
+ d = document;
+ tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
+ tr = d.createElement("tr");
+ for (i = 0; i < field_counter_js; i++) {
+ td = d.createElement("td");
+ if(typeof(rowtype[i]) == 'function') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' />" + rowtype[i](rowname[i], rowsize[i], totalrows) + " ";
+ } else if(rowtype[i] == 'textbox') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input size='" + rowsize[i] + "' class='formfld unknown' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
+ } else if(rowtype[i] == 'textbox,ipv4v6') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input size='" + rowsize[i] + "' class='formfld unknown ipv4v6' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
+ } else if(rowtype[i] == 'password') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input type='password' size='" + rowsize[i] + "' class='formfld pwd' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
+ } else if(rowtype[i] == 'select') {
+ var cidr;
+ var str;
+ for (cidr = 128; cidr>= 1; cidr--) {
+ str=str + "<option value=\"" + cidr + "\" >" + cidr + "</option>";
+ }
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select size='1' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + str + "</select> ";
+ } else if(rowtype[i] == 'select,ipv4v6') {
+ var cidr;
+ var str;
+ for (cidr = 128; cidr>= 1; cidr--) {
+ str=str + "<option value=\"" + cidr + "\" >" + cidr + "</option>";
+ }
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select class='ipv4v6' size='1' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + str + "</select> ";
+ } else if(rowtype[i] == 'select_source') {
+ var cidr;
+ var str;
+ for (cidr = 128; cidr>= 1; cidr--) {
+ str=str + "<option value=\"" + cidr + "\" >" + cidr + "</option>";
+ }
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select size='1' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + str + "</select> ";
+ } else {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input type='checkbox' name='" + rowname[i] + totalrows + "' /> ";
+ }
+ tr.appendChild(td);
+ }
+ td = d.createElement("td");
+ td.rowSpan = "1";
+
+ td.innerHTML = '<a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/' + theme + '/images/icons/icon_x.gif" /></a>';
+ tr.appendChild(td);
+ tbody.appendChild(tr);
+ totalrows++;
+ if($(tr).ipv4v6ify)
+ $(tr).ipv4v6ify();
+ });
+})();
+
+function removeRow(el) {
+ var cel;
+ while (el && el.nodeName.toLowerCase() != "tr")
+ el = el.parentNode;
+
+ if (el && el.parentNode) {
+ cel = el.getElementsByTagName("td").item(0);
+ el.parentNode.removeChild(el);
+ }
+}
+
+function find_unique_field_name(field_name) {
+ // loop through field_name and strip off -NUMBER
+ var last_found_dash = 0;
+ for (var i = 0; i < field_name.length; i++) {
+ // is this a dash, if so, update
+ // last_found_dash
+ if (field_name.substr(i,1) == "-" )
+ last_found_dash = i;
+ }
+ if (last_found_dash < 1)
+ return field_name;
+ return(field_name.substr(0,last_found_dash));
+}
diff --git a/src/usr/local/www/javascript/row_helper_dynamic.js b/src/usr/local/www/javascript/row_helper_dynamic.js
new file mode 100644
index 0000000..d144093
--- /dev/null
+++ b/src/usr/local/www/javascript/row_helper_dynamic.js
@@ -0,0 +1,98 @@
+// Global Variables
+var rowname = new Array(99);
+var rowtype = new Array(99);
+var newrow = new Array(99);
+var rowsize = new Array(99);
+
+// Global variables. Set to javascript code
+// that will be eval() after change, add & delete.
+var rowhelper_onChange = '';
+var rowhelper_onAdd = '';
+var rowhelper_onDelete = '';
+
+for (i = 0; i < 99; i++) {
+ rowname[i] = '';
+ rowtype[i] = '';
+ newrow[i] = '';
+ rowsize[i] = '25';
+}
+
+var field_counter_js = 0;
+var loaded = 0;
+var is_streaming_progress_bar = 0;
+var temp_streaming_text = "";
+
+var addRowTo = (function() {
+ return (function (tableId, objectSize) {
+ var $ = jQuery;
+ var d, tbody, tr, td, bgc, i, ii, j, size, className;
+ d = document;
+ tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
+ tr = d.createElement("tr");
+ totalrows++;
+ size = objectSize;
+ for (i = 0; i < field_counter_js; i++) {
+ if (!objectSize)
+ size = rowsize[i];
+ td = d.createElement("td");
+ if(typeof(rowtype[i]) == 'function') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' />" + rowtype[i](rowname[i], size, totalrows) + " ";
+ } else if(rowtype[i] == 'textbox') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " size='" + rowsize[i] + "' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
+ } else if(rowtype[i] == 'textbox,ipv4v6') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " size='" + rowsize[i] + "' name='" + rowname[i] + totalrows + "' class='ipv4v6' id='" + rowname[i] + totalrows + "' /> ";
+ } else if(rowtype[i] == 'select') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select " + rowhelper_onChange + " name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + newrow[i] + "</select> ";
+ } else if(rowtype[i] == 'select,ipv4v6') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select " + rowhelper_onChange + " name='" + rowname[i] + totalrows + "' class='ipv4v6' id='" + rowname[i] + totalrows + "'>" + newrow[i] + "</select> ";
+ } else if(rowtype[i] == 'interfaces_selection') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select " + rowhelper_onChange + " name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + newrow[i] + "</select> ";
+ } else if(rowtype[i] == 'select_source') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><select " + rowhelper_onChange + " name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "'>" + newrow[i] + "</select> ";
+ } else if(rowtype[i] == 'checkbox') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " type='checkbox'name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
+ } else if(rowtype[i] == 'input') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " class='formfld unknown' size='" + size + "' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
+ } else if(rowtype[i] == 'password') {
+ td.innerHTML="<input type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "' /><input " + rowhelper_onChange + " class='formfld pwd' type='password' name='" + rowname[i] + totalrows + "' id='" + rowname[i] + totalrows + "' /> ";
+ }
+ tr.appendChild(td);
+ }
+ td = d.createElement("td");
+ td.rowSpan = "1";
+ td.innerHTML = '<a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/' + theme + '/images/icons/icon_x.gif" /></a>';
+ tr.appendChild(td);
+ tbody.appendChild(tr);
+ if(rowhelper_onAdd != '')
+ eval(rowhelper_onAdd);
+ if($(tr).ipv4v6ify)
+ $(tr).ipv4v6ify();
+ });
+})();
+
+function removeRow(el) {
+ var cel;
+ while (el && el.nodeName.toLowerCase() != "tr")
+ el = el.parentNode;
+
+ if (el && el.parentNode) {
+ cel = el.getElementsByTagName("td").item(0);
+ el.parentNode.removeChild(el);
+ }
+ if(rowhelper_onDelete != '')
+ eval(rowhelper_onDelete);
+}
+
+function find_unique_field_name(field_name) {
+ // loop through field_name and strip off -NUMBER
+ var last_found_dash = 0;
+ for (var i = 0; i < field_name.length; i++) {
+ // is this a dash, if so, update
+ // last_found_dash
+ if (field_name.substr(i,1) == "-" )
+ last_found_dash = i;
+ }
+ if (last_found_dash < 1)
+ return field_name;
+ return(field_name.substr(0,last_found_dash));
+}
diff --git a/src/usr/local/www/javascript/row_toggle.js b/src/usr/local/www/javascript/row_toggle.js
new file mode 100644
index 0000000..350743e
--- /dev/null
+++ b/src/usr/local/www/javascript/row_toggle.js
@@ -0,0 +1,66 @@
+function fr_toggle(id, prefix) {
+ if (!prefix)
+ prefix = 'fr';
+
+ var checkbox = document.getElementById(prefix + 'c' + id);
+ checkbox.checked = !checkbox.checked;
+ fr_bgcolor(id, prefix);
+}
+
+function fr_bgcolor(id, prefix) {
+ if (!prefix)
+ prefix = 'fr';
+
+ var row = document.getElementById(prefix + id);
+ var checkbox = document.getElementById(prefix + 'c' + id);
+ var cells = row.getElementsByTagName('td');
+ var cellcnt = cells.length;
+
+ for (i = 0; i < cellcnt; i++) {
+ // Check for cells with frd id only
+ if (cells[i].id == prefix + 'd' + id)
+ cells[i].style.backgroundColor = checkbox.checked ? "#FFFFBB" : "#FFFFFF";
+ }
+ //cells[7].style.backgroundColor = checkbox.checked ? "#FFFFBB" : "#990000";
+}
+
+function fr_insline(id, on, prefix) {
+ if (!prefix)
+ prefix = 'fr';
+
+ var row = document.getElementById(prefix + id);
+ var prevrow;
+ if (id != 0) {
+ prevrow = document.getElementById(prefix + (id-1));
+ } else {
+ prevrow = document.getElementById(prefix + 'header');
+ }
+
+ var cells = row.getElementsByTagName("td");
+ var prevcells = prevrow.getElementsByTagName("td");
+
+ for (i = 0; i <= prevcells.length - 1; i++) {
+ if (prevcells[i].id == prefix + 'd' + (id-1)) {
+ if (on) {
+ prevcells[i].style.borderBottom = "3px solid #990000";
+ prevcells[i].style.paddingBottom = ((id != 0) ? 2 : 3) + "px";
+ } else {
+ prevcells[i].style.borderBottom = "1px solid #999999";
+ prevcells[i].style.borderBottomWidth = "1px";
+ prevcells[i].style.paddingBottom = ((id != 0) ? 4 : 5) + "px";
+ }
+ }
+ }
+
+ for (i = 0; i <= cells.length - 1; i++) {
+ if (cells[i].id == prefix + 'd' + (id)) {
+ if (on) {
+ cells[i].style.borderTop = "2px solid #990000";
+ cells[i].style.paddingTop = "2px";
+ } else {
+ cells[i].style.borderTopWidth = 0;
+ cells[i].style.paddingTop = "4px";
+ }
+ }
+ }
+}
diff --git a/src/usr/local/www/javascript/scriptaculous/builder.js b/src/usr/local/www/javascript/scriptaculous/builder.js
new file mode 100644
index 0000000..b0dd14e
--- /dev/null
+++ b/src/usr/local/www/javascript/scriptaculous/builder.js
@@ -0,0 +1,136 @@
+// script.aculo.us builder.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
+
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Builder = {
+ NODEMAP: {
+ AREA: 'map',
+ CAPTION: 'table',
+ COL: 'table',
+ COLGROUP: 'table',
+ LEGEND: 'fieldset',
+ OPTGROUP: 'select',
+ OPTION: 'select',
+ PARAM: 'object',
+ TBODY: 'table',
+ TD: 'table',
+ TFOOT: 'table',
+ TH: 'table',
+ THEAD: 'table',
+ TR: 'table'
+ },
+ // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
+ // due to a Firefox bug
+ node: function(elementName) {
+ elementName = elementName.toUpperCase();
+
+ // try innerHTML approach
+ var parentTag = this.NODEMAP[elementName] || 'div';
+ var parentElement = document.createElement(parentTag);
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+ parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
+ } catch(e) {}
+ var element = parentElement.firstChild || null;
+
+ // see if browser added wrapping tags
+ if(element && (element.tagName.toUpperCase() != elementName))
+ element = element.getElementsByTagName(elementName)[0];
+
+ // fallback to createElement approach
+ if(!element) element = document.createElement(elementName);
+
+ // abort if nothing could be created
+ if(!element) return;
+
+ // attributes (or text)
+ if(arguments[1])
+ if(this._isStringOrNumber(arguments[1]) ||
+ (arguments[1] instanceof Array) ||
+ arguments[1].tagName) {
+ this._children(element, arguments[1]);
+ } else {
+ var attrs = this._attributes(arguments[1]);
+ if(attrs.length) {
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+ parentElement.innerHTML = "<" +elementName + " " +
+ attrs + "></" + elementName + ">";
+ } catch(e) {}
+ element = parentElement.firstChild || null;
+ // workaround firefox 1.0.X bug
+ if(!element) {
+ element = document.createElement(elementName);
+ for(attr in arguments[1])
+ element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
+ }
+ if(element.tagName.toUpperCase() != elementName)
+ element = parentElement.getElementsByTagName(elementName)[0];
+ }
+ }
+
+ // text, or array of children
+ if(arguments[2])
+ this._children(element, arguments[2]);
+
+ return $(element);
+ },
+ _text: function(text) {
+ return document.createTextNode(text);
+ },
+
+ ATTR_MAP: {
+ 'className': 'class',
+ 'htmlFor': 'for'
+ },
+
+ _attributes: function(attributes) {
+ var attrs = [];
+ for(attribute in attributes)
+ attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
+ '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
+ return attrs.join(" ");
+ },
+ _children: function(element, children) {
+ if(children.tagName) {
+ element.appendChild(children);
+ return;
+ }
+ if(typeof children=='object') { // array can hold nodes and text
+ children.flatten().each( function(e) {
+ if(typeof e=='object')
+ element.appendChild(e);
+ else
+ if(Builder._isStringOrNumber(e))
+ element.appendChild(Builder._text(e));
+ });
+ } else
+ if(Builder._isStringOrNumber(children))
+ element.appendChild(Builder._text(children));
+ },
+ _isStringOrNumber: function(param) {
+ return(typeof param=='string' || typeof param=='number');
+ },
+ build: function(html) {
+ var element = this.node('div');
+ $(element).update(html.strip());
+ return element.down();
+ },
+ dump: function(scope) {
+ if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
+
+ var tags = ("a abbr acronym address applet area b base basefont bdo big blockquote body " +
+ "br button caption center cite code col colgroup dd del dfn dir div dl dt em fieldset " +
+ "font form frame frameset h1 h2 h3 h4 h5 h6 head hr html i iframe img input ins isindex "+
+ "kbd label legend li link map menu meta noframes noscript object ol optgroup option p "+
+ "param pre q s samp script select small span strike strong style sub sup table tbody td "+
+ "textarea tfoot th thead title tr tt u ul var").split(/\s+/);
+
+ tags.each( function(tag){
+ scope[tag] = function() {
+ return Builder.node.apply(Builder, [tag].concat($A(arguments)));
+ };
+ });
+ }
+}; \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/controls.js b/src/usr/local/www/javascript/scriptaculous/controls.js
new file mode 100644
index 0000000..59815cb
--- /dev/null
+++ b/src/usr/local/www/javascript/scriptaculous/controls.js
@@ -0,0 +1,965 @@
+// script.aculo.us controls.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
+
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// (c) 2005-2009 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+// (c) 2005-2009 Jon Tirsen (http://www.tirsen.com)
+// Contributors:
+// Richard Livsey
+// Rahul Bhargava
+// Rob Wills
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// Autocompleter.Base handles all the autocompletion functionality
+// that's independent of the data source for autocompletion. This
+// includes drawing the autocompletion menu, observing keyboard
+// and mouse events, and similar.
+//
+// Specific autocompleters need to provide, at the very least,
+// a getUpdatedChoices function that will be invoked every time
+// the text inside the monitored textbox changes. This method
+// should get the text for which to provide autocompletion by
+// invoking this.getToken(), NOT by directly accessing
+// this.element.value. This is to allow incremental tokenized
+// autocompletion. Specific auto-completion logic (AJAX, etc)
+// belongs in getUpdatedChoices.
+//
+// Tokenized incremental autocompletion is enabled automatically
+// when an autocompleter is instantiated with the 'tokens' option
+// in the options parameter, e.g.:
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
+// will incrementally autocomplete with a comma as the token.
+// Additionally, ',' in the above example can be replaced with
+// a token array, e.g. { tokens: [',', '\n'] } which
+// enables autocompletion on multiple tokens. This is most
+// useful when one of the tokens is \n (a newline), as it
+// allows smart autocompletion after linebreaks.
+
+if(typeof Effect == 'undefined')
+ throw("controls.js requires including script.aculo.us' effects.js library");
+
+var Autocompleter = { };
+Autocompleter.Base = Class.create({
+ baseInitialize: function(element, update, options) {
+ element = $(element);
+ this.element = element;
+ this.update = $(update);
+ this.hasFocus = false;
+ this.changed = false;
+ this.active = false;
+ this.index = 0;
+ this.entryCount = 0;
+ this.oldElementValue = this.element.value;
+
+ if(this.setOptions)
+ this.setOptions(options);
+ else
+ this.options = options || { };
+
+ this.options.paramName = this.options.paramName || this.element.name;
+ this.options.tokens = this.options.tokens || [];
+ this.options.frequency = this.options.frequency || 0.4;
+ this.options.minChars = this.options.minChars || 1;
+ this.options.onShow = this.options.onShow ||
+ function(element, update){
+ if(!update.style.position || update.style.position=='absolute') {
+ update.style.position = 'absolute';
+ Position.clone(element, update, {
+ setHeight: false,
+ offsetTop: element.offsetHeight
+ });
+ }
+ Effect.Appear(update,{duration:0.15});
+ };
+ this.options.onHide = this.options.onHide ||
+ function(element, update){ new Effect.Fade(update,{duration:0.15}); };
+
+ if(typeof(this.options.tokens) == 'string')
+ this.options.tokens = new Array(this.options.tokens);
+ // Force carriage returns as token delimiters anyway
+ if (!this.options.tokens.include('\n'))
+ this.options.tokens.push('\n');
+
+ this.observer = null;
+
+ this.element.setAttribute('autocomplete','off');
+
+ Element.hide(this.update);
+
+ Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
+ Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
+ },
+
+ show: function() {
+ if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+ if(!this.iefix &&
+ (Prototype.Browser.IE) &&
+ (Element.getStyle(this.update, 'position')=='absolute')) {
+ new Insertion.After(this.update,
+ '<iframe id="' + this.update.id + '_iefix" '+
+ 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
+ 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
+ this.iefix = $(this.update.id+'_iefix');
+ }
+ if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
+ },
+
+ fixIEOverlapping: function() {
+ Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
+ this.iefix.style.zIndex = 1;
+ this.update.style.zIndex = 2;
+ Element.show(this.iefix);
+ },
+
+ hide: function() {
+ this.stopIndicator();
+ if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
+ if(this.iefix) Element.hide(this.iefix);
+ },
+
+ startIndicator: function() {
+ if(this.options.indicator) Element.show(this.options.indicator);
+ },
+
+ stopIndicator: function() {
+ if(this.options.indicator) Element.hide(this.options.indicator);
+ },
+
+ onKeyPress: function(event) {
+ if(this.active)
+ switch(event.keyCode) {
+ case Event.KEY_TAB:
+ case Event.KEY_RETURN:
+ this.selectEntry();
+ Event.stop(event);
+ case Event.KEY_ESC:
+ this.hide();
+ this.active = false;
+ Event.stop(event);
+ return;
+ case Event.KEY_LEFT:
+ case Event.KEY_RIGHT:
+ return;
+ case Event.KEY_UP:
+ this.markPrevious();
+ this.render();
+ Event.stop(event);
+ return;
+ case Event.KEY_DOWN:
+ this.markNext();
+ this.render();
+ Event.stop(event);
+ return;
+ }
+ else
+ if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
+ (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;
+
+ this.changed = true;
+ this.hasFocus = true;
+
+ if(this.observer) clearTimeout(this.observer);
+ this.observer =
+ setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+ },
+
+ activate: function() {
+ this.changed = false;
+ this.hasFocus = true;
+ this.getUpdatedChoices();
+ },
+
+ onHover: function(event) {
+ var element = Event.findElement(event, 'LI');
+ if(this.index != element.autocompleteIndex)
+ {
+ this.index = element.autocompleteIndex;
+ this.render();
+ }
+ Event.stop(event);
+ },
+
+ onClick: function(event) {
+ var element = Event.findElement(event, 'LI');
+ this.index = element.autocompleteIndex;
+ this.selectEntry();
+ this.hide();
+ },
+
+ onBlur: function(event) {
+ // needed to make click events working
+ setTimeout(this.hide.bind(this), 250);
+ this.hasFocus = false;
+ this.active = false;
+ },
+
+ render: function() {
+ if(this.entryCount > 0) {
+ for (var i = 0; i < this.entryCount; i++)
+ this.index==i ?
+ Element.addClassName(this.getEntry(i),"selected") :
+ Element.removeClassName(this.getEntry(i),"selected");
+ if(this.hasFocus) {
+ this.show();
+ this.active = true;
+ }
+ } else {
+ this.active = false;
+ this.hide();
+ }
+ },
+
+ markPrevious: function() {
+ if(this.index > 0) this.index--;
+ else this.index = this.entryCount-1;
+ this.getEntry(this.index).scrollIntoView(true);
+ },
+
+ markNext: function() {
+ if(this.index < this.entryCount-1) this.index++;
+ else this.index = 0;
+ this.getEntry(this.index).scrollIntoView(false);
+ },
+
+ getEntry: function(index) {
+ return this.update.firstChild.childNodes[index];
+ },
+
+ getCurrentEntry: function() {
+ return this.getEntry(this.index);
+ },
+
+ selectEntry: function() {
+ this.active = false;
+ this.updateElement(this.getCurrentEntry());
+ },
+
+ updateElement: function(selectedElement) {
+ if (this.options.updateElement) {
+ this.options.updateElement(selectedElement);
+ return;
+ }
+ var value = '';
+ if (this.options.select) {
+ var nodes = $(selectedElement).select('.' + this.options.select) || [];
+ if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
+ } else
+ value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+
+ var bounds = this.getTokenBounds();
+ if (bounds[0] != -1) {
+ var newValue = this.element.value.substr(0, bounds[0]);
+ var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
+ if (whitespace)
+ newValue += whitespace[0];
+ this.element.value = newValue + value + this.element.value.substr(bounds[1]);
+ } else {
+ this.element.value = value;
+ }
+ this.oldElementValue = this.element.value;
+ this.element.focus();
+
+ if (this.options.afterUpdateElement)
+ this.options.afterUpdateElement(this.element, selectedElement);
+ },
+
+ updateChoices: function(choices) {
+ if(!this.changed && this.hasFocus) {
+ this.update.innerHTML = choices;
+ Element.cleanWhitespace(this.update);
+ Element.cleanWhitespace(this.update.down());
+
+ if(this.update.firstChild && this.update.down().childNodes) {
+ this.entryCount =
+ this.update.down().childNodes.length;
+ for (var i = 0; i < this.entryCount; i++) {
+ var entry = this.getEntry(i);
+ entry.autocompleteIndex = i;
+ this.addObservers(entry);
+ }
+ } else {
+ this.entryCount = 0;
+ }
+
+ this.stopIndicator();
+ this.index = 0;
+
+ if(this.entryCount==1 && this.options.autoSelect) {
+ this.selectEntry();
+ this.hide();
+ } else {
+ this.render();
+ }
+ }
+ },
+
+ addObservers: function(element) {
+ Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
+ Event.observe(element, "click", this.onClick.bindAsEventListener(this));
+ },
+
+ onObserverEvent: function() {
+ this.changed = false;
+ this.tokenBounds = null;
+ if(this.getToken().length>=this.options.minChars) {
+ this.getUpdatedChoices();
+ } else {
+ this.active = false;
+ this.hide();
+ }
+ this.oldElementValue = this.element.value;
+ },
+
+ getToken: function() {
+ var bounds = this.getTokenBounds();
+ return this.element.value.substring(bounds[0], bounds[1]).strip();
+ },
+
+ getTokenBounds: function() {
+ if (null != this.tokenBounds) return this.tokenBounds;
+ var value = this.element.value;
+ if (value.strip().empty()) return [-1, 0];
+ var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
+ var offset = (diff == this.oldElementValue.length ? 1 : 0);
+ var prevTokenPos = -1, nextTokenPos = value.length;
+ var tp;
+ for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
+ tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
+ if (tp > prevTokenPos) prevTokenPos = tp;
+ tp = value.indexOf(this.options.tokens[index], diff + offset);
+ if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
+ }
+ return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
+ }
+});
+
+Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
+ var boundary = Math.min(newS.length, oldS.length);
+ for (var index = 0; index < boundary; ++index)
+ if (newS[index] != oldS[index])
+ return index;
+ return boundary;
+};
+
+Ajax.Autocompleter = Class.create(Autocompleter.Base, {
+ initialize: function(element, update, url, options) {
+ this.baseInitialize(element, update, options);
+ this.options.asynchronous = true;
+ this.options.onComplete = this.onComplete.bind(this);
+ this.options.defaultParams = this.options.parameters || null;
+ this.url = url;
+ },
+
+ getUpdatedChoices: function() {
+ this.startIndicator();
+
+ var entry = encodeURIComponent(this.options.paramName) + '=' +
+ encodeURIComponent(this.getToken());
+
+ this.options.parameters = this.options.callback ?
+ this.options.callback(this.element, entry) : entry;
+
+ if(this.options.defaultParams)
+ this.options.parameters += '&' + this.options.defaultParams;
+
+ new Ajax.Request(this.url, this.options);
+ },
+
+ onComplete: function(request) {
+ this.updateChoices(request.responseText);
+ }
+});
+
+// The local array autocompleter. Used when you'd prefer to
+// inject an array of autocompletion options into the page, rather
+// than sending out Ajax queries, which can be quite slow sometimes.
+//
+// The constructor takes four parameters. The first two are, as usual,
+// the id of the monitored textbox, and id of the autocompletion menu.
+// The third is the array you want to autocomplete from, and the fourth
+// is the options block.
+//
+// Extra local autocompletion options:
+// - choices - How many autocompletion choices to offer
+//
+// - partialSearch - If false, the autocompleter will match entered
+// text only at the beginning of strings in the
+// autocomplete array. Defaults to true, which will
+// match text at the beginning of any *word* in the
+// strings in the autocomplete array. If you want to
+// search anywhere in the string, additionally set
+// the option fullSearch to true (default: off).
+//
+// - fullSsearch - Search anywhere in autocomplete array strings.
+//
+// - partialChars - How many characters to enter before triggering
+// a partial match (unlike minChars, which defines
+// how many characters are required to do any match
+// at all). Defaults to 2.
+//
+// - ignoreCase - Whether to ignore case when autocompleting.
+// Defaults to true.
+//
+// It's possible to pass in a custom function as the 'selector'
+// option, if you prefer to write your own autocompletion logic.
+// In that case, the other options above will not apply unless
+// you support them.
+
+Autocompleter.Local = Class.create(Autocompleter.Base, {
+ initialize: function(element, update, array, options) {
+ this.baseInitialize(element, update, options);
+ this.options.array = array;
+ },
+
+ getUpdatedChoices: function() {
+ this.updateChoices(this.options.selector(this));
+ },
+
+ setOptions: function(options) {
+ this.options = Object.extend({
+ choices: 10,
+ partialSearch: true,
+ partialChars: 2,
+ ignoreCase: true,
+ fullSearch: false,
+ selector: function(instance) {
+ var ret = []; // Beginning matches
+ var partial = []; // Inside matches
+ var entry = instance.getToken();
+ var count = 0;
+
+ for (var i = 0; i < instance.options.array.length &&
+ ret.length < instance.options.choices ; i++) {
+
+ var elem = instance.options.array[i];
+ var foundPos = instance.options.ignoreCase ?
+ elem.toLowerCase().indexOf(entry.toLowerCase()) :
+ elem.indexOf(entry);
+
+ while (foundPos != -1) {
+ if (foundPos == 0 && elem.length != entry.length) {
+ ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
+ elem.substr(entry.length) + "</li>");
+ break;
+ } else if (entry.length >= instance.options.partialChars &&
+ instance.options.partialSearch && foundPos != -1) {
+ if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
+ partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
+ elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
+ foundPos + entry.length) + "</li>");
+ break;
+ }
+ }
+
+ foundPos = instance.options.ignoreCase ?
+ elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
+ elem.indexOf(entry, foundPos + 1);
+
+ }
+ }
+ if (partial.length)
+ ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
+ return "<ul>" + ret.join('') + "</ul>";
+ }
+ }, options || { });
+ }
+});
+
+// AJAX in-place editor and collection editor
+// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007).
+
+// Use this if you notice weird scrolling problems on some browsers,
+// the DOM might be a bit confused when this gets called so do this
+// waits 1 ms (with setTimeout) until it does the activation
+Field.scrollFreeActivate = function(field) {
+ setTimeout(function() {
+ Field.activate(field);
+ }, 1);
+};
+
+Ajax.InPlaceEditor = Class.create({
+ initialize: function(element, url, options) {
+ this.url = url;
+ this.element = element = $(element);
+ this.prepareOptions();
+ this._controls = { };
+ arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
+ Object.extend(this.options, options || { });
+ if (!this.options.formId && this.element.id) {
+ this.options.formId = this.element.id + '-inplaceeditor';
+ if ($(this.options.formId))
+ this.options.formId = '';
+ }
+ if (this.options.externalControl)
+ this.options.externalControl = $(this.options.externalControl);
+ if (!this.options.externalControl)
+ this.options.externalControlOnly = false;
+ this._originalBackground = this.element.getStyle('background-color') || 'transparent';
+ this.element.title = this.options.clickToEditText;
+ this._boundCancelHandler = this.handleFormCancellation.bind(this);
+ this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
+ this._boundFailureHandler = this.handleAJAXFailure.bind(this);
+ this._boundSubmitHandler = this.handleFormSubmission.bind(this);
+ this._boundWrapperHandler = this.wrapUp.bind(this);
+ this.registerListeners();
+ },
+ checkForEscapeOrReturn: function(e) {
+ if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
+ if (Event.KEY_ESC == e.keyCode)
+ this.handleFormCancellation(e);
+ else if (Event.KEY_RETURN == e.keyCode)
+ this.handleFormSubmission(e);
+ },
+ createControl: function(mode, handler, extraClasses) {
+ var control = this.options[mode + 'Control'];
+ var text = this.options[mode + 'Text'];
+ if ('button' == control) {
+ var btn = document.createElement('input');
+ btn.type = 'submit';
+ btn.value = text;
+ btn.className = 'editor_' + mode + '_button';
+ if ('cancel' == mode)
+ btn.onclick = this._boundCancelHandler;
+ this._form.appendChild(btn);
+ this._controls[mode] = btn;
+ } else if ('link' == control) {
+ var link = document.createElement('a');
+ link.href = '#';
+ link.appendChild(document.createTextNode(text));
+ link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
+ link.className = 'editor_' + mode + '_link';
+ if (extraClasses)
+ link.className += ' ' + extraClasses;
+ this._form.appendChild(link);
+ this._controls[mode] = link;
+ }
+ },
+ createEditField: function() {
+ var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
+ var fld;
+ if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
+ fld = document.createElement('input');
+ fld.type = 'text';
+ var size = this.options.size || this.options.cols || 0;
+ if (0 < size) fld.size = size;
+ } else {
+ fld = document.createElement('textarea');
+ fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
+ fld.cols = this.options.cols || 40;
+ }
+ fld.name = this.options.paramName;
+ fld.value = text; // No HTML breaks conversion anymore
+ fld.className = 'editor_field';
+ if (this.options.submitOnBlur)
+ fld.onblur = this._boundSubmitHandler;
+ this._controls.editor = fld;
+ if (this.options.loadTextURL)
+ this.loadExternalText();
+ this._form.appendChild(this._controls.editor);
+ },
+ createForm: function() {
+ var ipe = this;
+ function addText(mode, condition) {
+ var text = ipe.options['text' + mode + 'Controls'];
+ if (!text || condition === false) return;
+ ipe._form.appendChild(document.createTextNode(text));
+ };
+ this._form = $(document.createElement('form'));
+ this._form.id = this.options.formId;
+ this._form.addClassName(this.options.formClassName);
+ this._form.onsubmit = this._boundSubmitHandler;
+ this.createEditField();
+ if ('textarea' == this._controls.editor.tagName.toLowerCase())
+ this._form.appendChild(document.createElement('br'));
+ if (this.options.onFormCustomization)
+ this.options.onFormCustomization(this, this._form);
+ addText('Before', this.options.okControl || this.options.cancelControl);
+ this.createControl('ok', this._boundSubmitHandler);
+ addText('Between', this.options.okControl && this.options.cancelControl);
+ this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
+ addText('After', this.options.okControl || this.options.cancelControl);
+ },
+ destroy: function() {
+ if (this._oldInnerHTML)
+ this.element.innerHTML = this._oldInnerHTML;
+ this.leaveEditMode();
+ this.unregisterListeners();
+ },
+ enterEditMode: function(e) {
+ if (this._saving || this._editing) return;
+ this._editing = true;
+ this.triggerCallback('onEnterEditMode');
+ if (this.options.externalControl)
+ this.options.externalControl.hide();
+ this.element.hide();
+ this.createForm();
+ this.element.parentNode.insertBefore(this._form, this.element);
+ if (!this.options.loadTextURL)
+ this.postProcessEditField();
+ if (e) Event.stop(e);
+ },
+ enterHover: function(e) {
+ if (this.options.hoverClassName)
+ this.element.addClassName(this.options.hoverClassName);
+ if (this._saving) return;
+ this.triggerCallback('onEnterHover');
+ },
+ getText: function() {
+ return this.element.innerHTML.unescapeHTML();
+ },
+ handleAJAXFailure: function(transport) {
+ this.triggerCallback('onFailure', transport);
+ if (this._oldInnerHTML) {
+ this.element.innerHTML = this._oldInnerHTML;
+ this._oldInnerHTML = null;
+ }
+ },
+ handleFormCancellation: function(e) {
+ this.wrapUp();
+ if (e) Event.stop(e);
+ },
+ handleFormSubmission: function(e) {
+ var form = this._form;
+ var value = $F(this._controls.editor);
+ this.prepareSubmission();
+ var params = this.options.callback(form, value) || '';
+ if (Object.isString(params))
+ params = params.toQueryParams();
+ params.editorId = this.element.id;
+ if (this.options.htmlResponse) {
+ var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: params,
+ onComplete: this._boundWrapperHandler,
+ onFailure: this._boundFailureHandler
+ });
+ new Ajax.Updater({ success: this.element }, this.url, options);
+ } else {
+ var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: params,
+ onComplete: this._boundWrapperHandler,
+ onFailure: this._boundFailureHandler
+ });
+ new Ajax.Request(this.url, options);
+ }
+ if (e) Event.stop(e);
+ },
+ leaveEditMode: function() {
+ this.element.removeClassName(this.options.savingClassName);
+ this.removeForm();
+ this.leaveHover();
+ this.element.style.backgroundColor = this._originalBackground;
+ this.element.show();
+ if (this.options.externalControl)
+ this.options.externalControl.show();
+ this._saving = false;
+ this._editing = false;
+ this._oldInnerHTML = null;
+ this.triggerCallback('onLeaveEditMode');
+ },
+ leaveHover: function(e) {
+ if (this.options.hoverClassName)
+ this.element.removeClassName(this.options.hoverClassName);
+ if (this._saving) return;
+ this.triggerCallback('onLeaveHover');
+ },
+ loadExternalText: function() {
+ this._form.addClassName(this.options.loadingClassName);
+ this._controls.editor.disabled = true;
+ var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: 'editorId=' + encodeURIComponent(this.element.id),
+ onComplete: Prototype.emptyFunction,
+ onSuccess: function(transport) {
+ this._form.removeClassName(this.options.loadingClassName);
+ var text = transport.responseText;
+ if (this.options.stripLoadedTextTags)
+ text = text.stripTags();
+ this._controls.editor.value = text;
+ this._controls.editor.disabled = false;
+ this.postProcessEditField();
+ }.bind(this),
+ onFailure: this._boundFailureHandler
+ });
+ new Ajax.Request(this.options.loadTextURL, options);
+ },
+ postProcessEditField: function() {
+ var fpc = this.options.fieldPostCreation;
+ if (fpc)
+ $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
+ },
+ prepareOptions: function() {
+ this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
+ Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
+ [this._extraDefaultOptions].flatten().compact().each(function(defs) {
+ Object.extend(this.options, defs);
+ }.bind(this));
+ },
+ prepareSubmission: function() {
+ this._saving = true;
+ this.removeForm();
+ this.leaveHover();
+ this.showSaving();
+ },
+ registerListeners: function() {
+ this._listeners = { };
+ var listener;
+ $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
+ listener = this[pair.value].bind(this);
+ this._listeners[pair.key] = listener;
+ if (!this.options.externalControlOnly)
+ this.element.observe(pair.key, listener);
+ if (this.options.externalControl)
+ this.options.externalControl.observe(pair.key, listener);
+ }.bind(this));
+ },
+ removeForm: function() {
+ if (!this._form) return;
+ this._form.remove();
+ this._form = null;
+ this._controls = { };
+ },
+ showSaving: function() {
+ this._oldInnerHTML = this.element.innerHTML;
+ this.element.innerHTML = this.options.savingText;
+ this.element.addClassName(this.options.savingClassName);
+ this.element.style.backgroundColor = this._originalBackground;
+ this.element.show();
+ },
+ triggerCallback: function(cbName, arg) {
+ if ('function' == typeof this.options[cbName]) {
+ this.options[cbName](this, arg);
+ }
+ },
+ unregisterListeners: function() {
+ $H(this._listeners).each(function(pair) {
+ if (!this.options.externalControlOnly)
+ this.element.stopObserving(pair.key, pair.value);
+ if (this.options.externalControl)
+ this.options.externalControl.stopObserving(pair.key, pair.value);
+ }.bind(this));
+ },
+ wrapUp: function(transport) {
+ this.leaveEditMode();
+ // Can't use triggerCallback due to backward compatibility: requires
+ // binding + direct element
+ this._boundComplete(transport, this.element);
+ }
+});
+
+Object.extend(Ajax.InPlaceEditor.prototype, {
+ dispose: Ajax.InPlaceEditor.prototype.destroy
+});
+
+Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
+ initialize: function($super, element, url, options) {
+ this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
+ $super(element, url, options);
+ },
+
+ createEditField: function() {
+ var list = document.createElement('select');
+ list.name = this.options.paramName;
+ list.size = 1;
+ this._controls.editor = list;
+ this._collection = this.options.collection || [];
+ if (this.options.loadCollectionURL)
+ this.loadCollection();
+ else
+ this.checkForExternalText();
+ this._form.appendChild(this._controls.editor);
+ },
+
+ loadCollection: function() {
+ this._form.addClassName(this.options.loadingClassName);
+ this.showLoadingText(this.options.loadingCollectionText);
+ var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: 'editorId=' + encodeURIComponent(this.element.id),
+ onComplete: Prototype.emptyFunction,
+ onSuccess: function(transport) {
+ var js = transport.responseText.strip();
+ if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
+ throw('Server returned an invalid collection representation.');
+ this._collection = eval(js);
+ this.checkForExternalText();
+ }.bind(this),
+ onFailure: this.onFailure
+ });
+ new Ajax.Request(this.options.loadCollectionURL, options);
+ },
+
+ showLoadingText: function(text) {
+ this._controls.editor.disabled = true;
+ var tempOption = this._controls.editor.firstChild;
+ if (!tempOption) {
+ tempOption = document.createElement('option');
+ tempOption.value = '';
+ this._controls.editor.appendChild(tempOption);
+ tempOption.selected = true;
+ }
+ tempOption.update((text || '').stripScripts().stripTags());
+ },
+
+ checkForExternalText: function() {
+ this._text = this.getText();
+ if (this.options.loadTextURL)
+ this.loadExternalText();
+ else
+ this.buildOptionList();
+ },
+
+ loadExternalText: function() {
+ this.showLoadingText(this.options.loadingText);
+ var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: 'editorId=' + encodeURIComponent(this.element.id),
+ onComplete: Prototype.emptyFunction,
+ onSuccess: function(transport) {
+ this._text = transport.responseText.strip();
+ this.buildOptionList();
+ }.bind(this),
+ onFailure: this.onFailure
+ });
+ new Ajax.Request(this.options.loadTextURL, options);
+ },
+
+ buildOptionList: function() {
+ this._form.removeClassName(this.options.loadingClassName);
+ this._collection = this._collection.map(function(entry) {
+ return 2 === entry.length ? entry : [entry, entry].flatten();
+ });
+ var marker = ('value' in this.options) ? this.options.value : this._text;
+ var textFound = this._collection.any(function(entry) {
+ return entry[0] == marker;
+ }.bind(this));
+ this._controls.editor.update('');
+ var option;
+ this._collection.each(function(entry, index) {
+ option = document.createElement('option');
+ option.value = entry[0];
+ option.selected = textFound ? entry[0] == marker : 0 == index;
+ option.appendChild(document.createTextNode(entry[1]));
+ this._controls.editor.appendChild(option);
+ }.bind(this));
+ this._controls.editor.disabled = false;
+ Field.scrollFreeActivate(this._controls.editor);
+ }
+});
+
+//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****
+//**** This only exists for a while, in order to let ****
+//**** users adapt to the new API. Read up on the new ****
+//**** API and convert your code to it ASAP! ****
+
+Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
+ if (!options) return;
+ function fallback(name, expr) {
+ if (name in options || expr === undefined) return;
+ options[name] = expr;
+ };
+ fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
+ options.cancelLink == options.cancelButton == false ? false : undefined)));
+ fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
+ options.okLink == options.okButton == false ? false : undefined)));
+ fallback('highlightColor', options.highlightcolor);
+ fallback('highlightEndColor', options.highlightendcolor);
+};
+
+Object.extend(Ajax.InPlaceEditor, {
+ DefaultOptions: {
+ ajaxOptions: { },
+ autoRows: 3, // Use when multi-line w/ rows == 1
+ cancelControl: 'link', // 'link'|'button'|false
+ cancelText: 'cancel',
+ clickToEditText: 'Click to edit',
+ externalControl: null, // id|elt
+ externalControlOnly: false,
+ fieldPostCreation: 'activate', // 'activate'|'focus'|false
+ formClassName: 'inplaceeditor-form',
+ formId: null, // id|elt
+ highlightColor: '#ffff99',
+ highlightEndColor: '#ffffff',
+ hoverClassName: '',
+ htmlResponse: true,
+ loadingClassName: 'inplaceeditor-loading',
+ loadingText: 'Loading...',
+ okControl: 'button', // 'link'|'button'|false
+ okText: 'ok',
+ paramName: 'value',
+ rows: 1, // If 1 and multi-line, uses autoRows
+ savingClassName: 'inplaceeditor-saving',
+ savingText: 'Saving...',
+ size: 0,
+ stripLoadedTextTags: false,
+ submitOnBlur: false,
+ textAfterControls: '',
+ textBeforeControls: '',
+ textBetweenControls: ''
+ },
+ DefaultCallbacks: {
+ callback: function(form) {
+ return Form.serialize(form);
+ },
+ onComplete: function(transport, element) {
+ // For backward compatibility, this one is bound to the IPE, and passes
+ // the element directly. It was too often customized, so we don't break it.
+ new Effect.Highlight(element, {
+ startcolor: this.options.highlightColor, keepBackgroundImage: true });
+ },
+ onEnterEditMode: null,
+ onEnterHover: function(ipe) {
+ ipe.element.style.backgroundColor = ipe.options.highlightColor;
+ if (ipe._effect)
+ ipe._effect.cancel();
+ },
+ onFailure: function(transport, ipe) {
+ alert('Error communication with the server: ' + transport.responseText.stripTags());
+ },
+ onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
+ onLeaveEditMode: null,
+ onLeaveHover: function(ipe) {
+ ipe._effect = new Effect.Highlight(ipe.element, {
+ startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
+ restorecolor: ipe._originalBackground, keepBackgroundImage: true
+ });
+ }
+ },
+ Listeners: {
+ click: 'enterEditMode',
+ keydown: 'checkForEscapeOrReturn',
+ mouseover: 'enterHover',
+ mouseout: 'leaveHover'
+ }
+});
+
+Ajax.InPlaceCollectionEditor.DefaultOptions = {
+ loadingCollectionText: 'Loading options...'
+};
+
+// Delayed observer, like Form.Element.Observer,
+// but waits for delay after last key input
+// Ideal for live-search fields
+
+Form.Element.DelayedObserver = Class.create({
+ initialize: function(element, delay, callback) {
+ this.delay = delay || 0.5;
+ this.element = $(element);
+ this.callback = callback;
+ this.timer = null;
+ this.lastValue = $F(this.element);
+ Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
+ },
+ delayedListener: function(event) {
+ if(this.lastValue == $F(this.element)) return;
+ if(this.timer) clearTimeout(this.timer);
+ this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
+ this.lastValue = $F(this.element);
+ },
+ onTimerEvent: function() {
+ this.timer = null;
+ this.callback(this.element, $F(this.element));
+ }
+}); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/dragdrop.js b/src/usr/local/www/javascript/scriptaculous/dragdrop.js
new file mode 100644
index 0000000..452601e
--- /dev/null
+++ b/src/usr/local/www/javascript/scriptaculous/dragdrop.js
@@ -0,0 +1,974 @@
+// script.aculo.us dragdrop.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
+
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+if(Object.isUndefined(Effect))
+ throw("dragdrop.js requires including script.aculo.us' effects.js library");
+
+var Droppables = {
+ drops: [],
+
+ remove: function(element) {
+ this.drops = this.drops.reject(function(d) { return d.element==$(element); });
+ },
+
+ add: function(element) {
+ element = $(element);
+ var options = Object.extend({
+ greedy: true,
+ hoverclass: null,
+ tree: false
+ }, arguments[1] || { });
+
+ // cache containers
+ if(options.containment) {
+ options._containers = [];
+ var containment = options.containment;
+ if(Object.isArray(containment)) {
+ containment.each( function(c) { options._containers.push($(c)); });
+ } else {
+ options._containers.push($(containment));
+ }
+ }
+
+ if(options.accept) options.accept = [options.accept].flatten();
+
+ Element.makePositioned(element); // fix IE
+ options.element = element;
+
+ this.drops.push(options);
+ },
+
+ findDeepestChild: function(drops) {
+ deepest = drops[0];
+
+ for (i = 1; i < drops.length; ++i)
+ if (Element.isParent(drops[i].element, deepest.element))
+ deepest = drops[i];
+
+ return deepest;
+ },
+
+ isContained: function(element, drop) {
+ var containmentNode;
+ if(drop.tree) {
+ containmentNode = element.treeNode;
+ } else {
+ containmentNode = element.parentNode;
+ }
+ return drop._containers.detect(function(c) { return containmentNode == c; });
+ },
+
+ isAffected: function(point, element, drop) {
+ return (
+ (drop.element!=element) &&
+ ((!drop._containers) ||
+ this.isContained(element, drop)) &&
+ ((!drop.accept) ||
+ (Element.classNames(element).detect(
+ function(v) { return drop.accept.include(v); } ) )) &&
+ Position.within(drop.element, point[0], point[1]) );
+ },
+
+ deactivate: function(drop) {
+ if(drop.hoverclass)
+ Element.removeClassName(drop.element, drop.hoverclass);
+ this.last_active = null;
+ },
+
+ activate: function(drop) {
+ if(drop.hoverclass)
+ Element.addClassName(drop.element, drop.hoverclass);
+ this.last_active = drop;
+ },
+
+ show: function(point, element) {
+ if(!this.drops.length) return;
+ var drop, affected = [];
+
+ this.drops.each( function(drop) {
+ if(Droppables.isAffected(point, element, drop))
+ affected.push(drop);
+ });
+
+ if(affected.length>0)
+ drop = Droppables.findDeepestChild(affected);
+
+ if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
+ if (drop) {
+ Position.within(drop.element, point[0], point[1]);
+ if(drop.onHover)
+ drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+
+ if (drop != this.last_active) Droppables.activate(drop);
+ }
+ },
+
+ fire: function(event, element) {
+ if(!this.last_active) return;
+ Position.prepare();
+
+ if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
+ if (this.last_active.onDrop) {
+ this.last_active.onDrop(element, this.last_active.element, event);
+ return true;
+ }
+ },
+
+ reset: function() {
+ if(this.last_active)
+ this.deactivate(this.last_active);
+ }
+};
+
+var Draggables = {
+ drags: [],
+ observers: [],
+
+ register: function(draggable) {
+ if(this.drags.length == 0) {
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);
+ this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
+ this.eventKeypress = this.keyPress.bindAsEventListener(this);
+
+ Event.observe(document, "mouseup", this.eventMouseUp);
+ Event.observe(document, "mousemove", this.eventMouseMove);
+ Event.observe(document, "keypress", this.eventKeypress);
+ }
+ this.drags.push(draggable);
+ },
+
+ unregister: function(draggable) {
+ this.drags = this.drags.reject(function(d) { return d==draggable; });
+ if(this.drags.length == 0) {
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);
+ Event.stopObserving(document, "keypress", this.eventKeypress);
+ }
+ },
+
+ activate: function(draggable) {
+ if(draggable.options.delay) {
+ this._timeout = setTimeout(function() {
+ Draggables._timeout = null;
+ window.focus();
+ Draggables.activeDraggable = draggable;
+ }.bind(this), draggable.options.delay);
+ } else {
+ window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
+ this.activeDraggable = draggable;
+ }
+ },
+
+ deactivate: function() {
+ this.activeDraggable = null;
+ },
+
+ updateDrag: function(event) {
+ if(!this.activeDraggable) return;
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ // Mozilla-based browsers fire successive mousemove events with
+ // the same coordinates, prevent needless redrawing (moz bug?)
+ if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
+ this._lastPointer = pointer;
+
+ this.activeDraggable.updateDrag(event, pointer);
+ },
+
+ endDrag: function(event) {
+ if(this._timeout) {
+ clearTimeout(this._timeout);
+ this._timeout = null;
+ }
+ if(!this.activeDraggable) return;
+ this._lastPointer = null;
+ this.activeDraggable.endDrag(event);
+ this.activeDraggable = null;
+ },
+
+ keyPress: function(event) {
+ if(this.activeDraggable)
+ this.activeDraggable.keyPress(event);
+ },
+
+ addObserver: function(observer) {
+ this.observers.push(observer);
+ this._cacheObserverCallbacks();
+ },
+
+ removeObserver: function(element) { // element instead of observer fixes mem leaks
+ this.observers = this.observers.reject( function(o) { return o.element==element; });
+ this._cacheObserverCallbacks();
+ },
+
+ notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
+ if(this[eventName+'Count'] > 0)
+ this.observers.each( function(o) {
+ if(o[eventName]) o[eventName](eventName, draggable, event);
+ });
+ if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
+ },
+
+ _cacheObserverCallbacks: function() {
+ ['onStart','onEnd','onDrag'].each( function(eventName) {
+ Draggables[eventName+'Count'] = Draggables.observers.select(
+ function(o) { return o[eventName]; }
+ ).length;
+ });
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Draggable = Class.create({
+ initialize: function(element) {
+ var defaults = {
+ handle: false,
+ reverteffect: function(element, top_offset, left_offset) {
+ var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
+ new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
+ queue: {scope:'_draggable', position:'end'}
+ });
+ },
+ endeffect: function(element) {
+ var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
+ new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
+ queue: {scope:'_draggable', position:'end'},
+ afterFinish: function(){
+ Draggable._dragging[element] = false;
+ }
+ });
+ },
+ zindex: 1000,
+ revert: false,
+ quiet: false,
+ scroll: false,
+ scrollSensitivity: 20,
+ scrollSpeed: 15,
+ snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
+ delay: 0
+ };
+
+ if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
+ Object.extend(defaults, {
+ starteffect: function(element) {
+ element._opacity = Element.getOpacity(element);
+ Draggable._dragging[element] = true;
+ new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
+ }
+ });
+
+ var options = Object.extend(defaults, arguments[1] || { });
+
+ this.element = $(element);
+
+ if(options.handle && Object.isString(options.handle))
+ this.handle = this.element.down('.'+options.handle, 0);
+
+ if(!this.handle) this.handle = $(options.handle);
+ if(!this.handle) this.handle = this.element;
+
+ if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
+ options.scroll = $(options.scroll);
+ this._isScrollChild = Element.childOf(this.element, options.scroll);
+ }
+
+ Element.makePositioned(this.element); // fix IE
+
+ this.options = options;
+ this.dragging = false;
+
+ this.eventMouseDown = this.initDrag.bindAsEventListener(this);
+ Event.observe(this.handle, "mousedown", this.eventMouseDown);
+
+ Draggables.register(this);
+ },
+
+ destroy: function() {
+ Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
+ Draggables.unregister(this);
+ },
+
+ currentDelta: function() {
+ return([
+ parseInt(Element.getStyle(this.element,'left') || '0'),
+ parseInt(Element.getStyle(this.element,'top') || '0')]);
+ },
+
+ initDrag: function(event) {
+ if(!Object.isUndefined(Draggable._dragging[this.element]) &&
+ Draggable._dragging[this.element]) return;
+ if(Event.isLeftClick(event)) {
+ // abort on form elements, fixes a Firefox issue
+ var src = Event.element(event);
+ if((tag_name = src.tagName.toUpperCase()) && (
+ tag_name=='input' ||
+ tag_name=='select' ||
+ tag_name=='option' ||
+ tag_name=='button' ||
+ tag_name=='textarea')) return;
+
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ var pos = this.element.cumulativeOffset();
+ this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]); });
+
+ Draggables.activate(this);
+ Event.stop(event);
+ }
+ },
+
+ startDrag: function(event) {
+ this.dragging = true;
+ if(!this.delta)
+ this.delta = this.currentDelta();
+
+ if(this.options.zindex) {
+ this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
+ this.element.style.zIndex = this.options.zindex;
+ }
+
+ if(this.options.ghosting) {
+ this._clone = this.element.cloneNode(true);
+ this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
+ if (!this._originallyAbsolute)
+ Position.absolutize(this.element);
+ this.element.parentNode.insertBefore(this._clone, this.element);
+ }
+
+ if(this.options.scroll) {
+ if (this.options.scroll == window) {
+ var where = this._getWindowScroll(this.options.scroll);
+ this.originalScrollLeft = where.left;
+ this.originalScrollTop = where.top;
+ } else {
+ this.originalScrollLeft = this.options.scroll.scrollLeft;
+ this.originalScrollTop = this.options.scroll.scrollTop;
+ }
+ }
+
+ Draggables.notify('onStart', this, event);
+
+ if(this.options.starteffect) this.options.starteffect(this.element);
+ },
+
+ updateDrag: function(event, pointer) {
+ if(!this.dragging) this.startDrag(event);
+
+ if(!this.options.quiet){
+ Position.prepare();
+ Droppables.show(pointer, this.element);
+ }
+
+ Draggables.notify('onDrag', this, event);
+
+ this.draw(pointer);
+ if(this.options.change) this.options.change(this);
+
+ if(this.options.scroll) {
+ this.stopScrolling();
+
+ var p;
+ if (this.options.scroll == window) {
+ with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
+ } else {
+ p = Position.page(this.options.scroll);
+ p[0] += this.options.scroll.scrollLeft + Position.deltaX;
+ p[1] += this.options.scroll.scrollTop + Position.deltaY;
+ p.push(p[0]+this.options.scroll.offsetWidth);
+ p.push(p[1]+this.options.scroll.offsetHeight);
+ }
+ var speed = [0,0];
+ if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
+ if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
+ if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
+ if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
+ this.startScrolling(speed);
+ }
+
+ // fix AppleWebKit rendering
+ if(Prototype.Browser.WebKit) window.scrollBy(0,0);
+
+ Event.stop(event);
+ },
+
+ finishDrag: function(event, success) {
+ this.dragging = false;
+
+ if(this.options.quiet){
+ Position.prepare();
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ Droppables.show(pointer, this.element);
+ }
+
+ if(this.options.ghosting) {
+ if (!this._originallyAbsolute)
+ Position.relativize(this.element);
+ delete this._originallyAbsolute;
+ Element.remove(this._clone);
+ this._clone = null;
+ }
+
+ var dropped = false;
+ if(success) {
+ dropped = Droppables.fire(event, this.element);
+ if (!dropped) dropped = false;
+ }
+ if(dropped && this.options.onDropped) this.options.onDropped(this.element);
+ Draggables.notify('onEnd', this, event);
+
+ var revert = this.options.revert;
+ if(revert && Object.isFunction(revert)) revert = revert(this.element);
+
+ var d = this.currentDelta();
+ if(revert && this.options.reverteffect) {
+ if (dropped == 0 || revert != 'failure')
+ this.options.reverteffect(this.element,
+ d[1]-this.delta[1], d[0]-this.delta[0]);
+ } else {
+ this.delta = d;
+ }
+
+ if(this.options.zindex)
+ this.element.style.zIndex = this.originalZ;
+
+ if(this.options.endeffect)
+ this.options.endeffect(this.element);
+
+ Draggables.deactivate(this);
+ Droppables.reset();
+ },
+
+ keyPress: function(event) {
+ if(event.keyCode!=Event.KEY_ESC) return;
+ this.finishDrag(event, false);
+ Event.stop(event);
+ },
+
+ endDrag: function(event) {
+ if(!this.dragging) return;
+ this.stopScrolling();
+ this.finishDrag(event, true);
+ Event.stop(event);
+ },
+
+ draw: function(point) {
+ var pos = this.element.cumulativeOffset();
+ if(this.options.ghosting) {
+ var r = Position.realOffset(this.element);
+ pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
+ }
+
+ var d = this.currentDelta();
+ pos[0] -= d[0]; pos[1] -= d[1];
+
+ if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
+ pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
+ pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
+ }
+
+ var p = [0,1].map(function(i){
+ return (point[i]-pos[i]-this.offset[i]);
+ }.bind(this));
+
+ if(this.options.snap) {
+ if(Object.isFunction(this.options.snap)) {
+ p = this.options.snap(p[0],p[1],this);
+ } else {
+ if(Object.isArray(this.options.snap)) {
+ p = p.map( function(v, i) {
+ return (v/this.options.snap[i]).round()*this.options.snap[i]; }.bind(this));
+ } else {
+ p = p.map( function(v) {
+ return (v/this.options.snap).round()*this.options.snap; }.bind(this));
+ }
+ }}
+
+ var style = this.element.style;
+ if((!this.options.constraint) || (this.options.constraint=='horizontal'))
+ style.left = p[0] + "px";
+ if((!this.options.constraint) || (this.options.constraint=='vertical'))
+ style.top = p[1] + "px";
+
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
+ },
+
+ stopScrolling: function() {
+ if(this.scrollInterval) {
+ clearInterval(this.scrollInterval);
+ this.scrollInterval = null;
+ Draggables._lastScrollPointer = null;
+ }
+ },
+
+ startScrolling: function(speed) {
+ if(!(speed[0] || speed[1])) return;
+ this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
+ this.lastScrolled = new Date();
+ this.scrollInterval = setInterval(this.scroll.bind(this), 10);
+ },
+
+ scroll: function() {
+ var current = new Date();
+ var delta = current - this.lastScrolled;
+ this.lastScrolled = current;
+ if(this.options.scroll == window) {
+ with (this._getWindowScroll(this.options.scroll)) {
+ if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
+ var d = delta / 1000;
+ this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
+ }
+ }
+ } else {
+ this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
+ this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
+ }
+
+ Position.prepare();
+ Droppables.show(Draggables._lastPointer, this.element);
+ Draggables.notify('onDrag', this);
+ if (this._isScrollChild) {
+ Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
+ Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
+ Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
+ if (Draggables._lastScrollPointer[0] < 0)
+ Draggables._lastScrollPointer[0] = 0;
+ if (Draggables._lastScrollPointer[1] < 0)
+ Draggables._lastScrollPointer[1] = 0;
+ this.draw(Draggables._lastScrollPointer);
+ }
+
+ if(this.options.change) this.options.change(this);
+ },
+
+ _getWindowScroll: function(w) {
+ var T, L, W, H;
+ with (w.document) {
+ if (w.document.documentElement && documentElement.scrollTop) {
+ T = documentElement.scrollTop;
+ L = documentElement.scrollLeft;
+ } else if (w.document.body) {
+ T = body.scrollTop;
+ L = body.scrollLeft;
+ }
+ if (w.innerWidth) {
+ W = w.innerWidth;
+ H = w.innerHeight;
+ } else if (w.document.documentElement && documentElement.clientWidth) {
+ W = documentElement.clientWidth;
+ H = documentElement.clientHeight;
+ } else {
+ W = body.offsetWidth;
+ H = body.offsetHeight;
+ }
+ }
+ return { top: T, left: L, width: W, height: H };
+ }
+});
+
+Draggable._dragging = { };
+
+/*--------------------------------------------------------------------------*/
+
+var SortableObserver = Class.create({
+ initialize: function(element, observer) {
+ this.element = $(element);
+ this.observer = observer;
+ this.lastValue = Sortable.serialize(this.element);
+ },
+
+ onStart: function() {
+ this.lastValue = Sortable.serialize(this.element);
+ },
+
+ onEnd: function() {
+ Sortable.unmark();
+ if(this.lastValue != Sortable.serialize(this.element))
+ this.observer(this.element);
+ }
+});
+
+var Sortable = {
+ SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
+
+ sortables: { },
+
+ _findRootElement: function(element) {
+ while (element.tagName.toUpperCase() != "BODY") {
+ if(element.id && Sortable.sortables[element.id]) return element;
+ element = element.parentNode;
+ }
+ },
+
+ options: function(element) {
+ element = Sortable._findRootElement($(element));
+ if(!element) return;
+ return Sortable.sortables[element.id];
+ },
+
+ destroy: function(element){
+ element = $(element);
+ var s = Sortable.sortables[element.id];
+
+ if(s) {
+ Draggables.removeObserver(s.element);
+ s.droppables.each(function(d){ Droppables.remove(d); });
+ s.draggables.invoke('destroy');
+
+ delete Sortable.sortables[s.element.id];
+ }
+ },
+
+ create: function(element) {
+ element = $(element);
+ var options = Object.extend({
+ element: element,
+ tag: 'li', // assumes li children, override with tag: 'tagname'
+ dropOnEmpty: false,
+ tree: false,
+ treeTag: 'ul',
+ overlap: 'vertical', // one of 'vertical', 'horizontal'
+ constraint: 'vertical', // one of 'vertical', 'horizontal', false
+ containment: element, // also takes array of elements (or id's); or false
+ handle: false, // or a CSS class
+ only: false,
+ delay: 0,
+ hoverclass: null,
+ ghosting: false,
+ quiet: false,
+ scroll: false,
+ scrollSensitivity: 20,
+ scrollSpeed: 15,
+ format: this.SERIALIZE_RULE,
+
+ // these take arrays of elements or ids and can be
+ // used for better initialization performance
+ elements: false,
+ handles: false,
+
+ onChange: Prototype.emptyFunction,
+ onUpdate: Prototype.emptyFunction
+ }, arguments[1] || { });
+
+ // clear any old sortable with same element
+ this.destroy(element);
+
+ // build options for the draggables
+ var options_for_draggable = {
+ revert: true,
+ quiet: options.quiet,
+ scroll: options.scroll,
+ scrollSpeed: options.scrollSpeed,
+ scrollSensitivity: options.scrollSensitivity,
+ delay: options.delay,
+ ghosting: options.ghosting,
+ constraint: options.constraint,
+ handle: options.handle };
+
+ if(options.starteffect)
+ options_for_draggable.starteffect = options.starteffect;
+
+ if(options.reverteffect)
+ options_for_draggable.reverteffect = options.reverteffect;
+ else
+ if(options.ghosting) options_for_draggable.reverteffect = function(element) {
+ element.style.top = 0;
+ element.style.left = 0;
+ };
+
+ if(options.endeffect)
+ options_for_draggable.endeffect = options.endeffect;
+
+ if(options.zindex)
+ options_for_draggable.zindex = options.zindex;
+
+ // build options for the droppables
+ var options_for_droppable = {
+ overlap: options.overlap,
+ containment: options.containment,
+ tree: options.tree,
+ hoverclass: options.hoverclass,
+ onHover: Sortable.onHover
+ };
+
+ var options_for_tree = {
+ onHover: Sortable.onEmptyHover,
+ overlap: options.overlap,
+ containment: options.containment,
+ hoverclass: options.hoverclass
+ };
+
+ // fix for gecko engine
+ Element.cleanWhitespace(element);
+
+ options.draggables = [];
+ options.droppables = [];
+
+ // drop on empty handling
+ if(options.dropOnEmpty || options.tree) {
+ Droppables.add(element, options_for_tree);
+ options.droppables.push(element);
+ }
+
+ (options.elements || this.findElements(element, options) || []).each( function(e,i) {
+ var handle = options.handles ? $(options.handles[i]) :
+ (options.handle ? $(e).select('.' + options.handle)[0] : e);
+ options.draggables.push(
+ new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
+ Droppables.add(e, options_for_droppable);
+ if(options.tree) e.treeNode = element;
+ options.droppables.push(e);
+ });
+
+ if(options.tree) {
+ (Sortable.findTreeElements(element, options) || []).each( function(e) {
+ Droppables.add(e, options_for_tree);
+ e.treeNode = element;
+ options.droppables.push(e);
+ });
+ }
+
+ // keep reference
+ this.sortables[element.identify()] = options;
+
+ // for onupdate
+ Draggables.addObserver(new SortableObserver(element, options.onUpdate));
+
+ },
+
+ // return all suitable-for-sortable elements in a guaranteed order
+ findElements: function(element, options) {
+ return Element.findChildren(
+ element, options.only, options.tree ? true : false, options.tag);
+ },
+
+ findTreeElements: function(element, options) {
+ return Element.findChildren(
+ element, options.only, options.tree ? true : false, options.treeTag);
+ },
+
+ onHover: function(element, dropon, overlap) {
+ if(Element.isParent(dropon, element)) return;
+
+ if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
+ return;
+ } else if(overlap>0.5) {
+ Sortable.mark(dropon, 'before');
+ if(dropon.previousSibling != element) {
+ var oldParentNode = element.parentNode;
+ element.style.visibility = "hidden"; // fix gecko rendering
+ dropon.parentNode.insertBefore(element, dropon);
+ if(dropon.parentNode!=oldParentNode)
+ Sortable.options(oldParentNode).onChange(element);
+ Sortable.options(dropon.parentNode).onChange(element);
+ }
+ } else {
+ Sortable.mark(dropon, 'after');
+ var nextElement = dropon.nextSibling || null;
+ if(nextElement != element) {
+ var oldParentNode = element.parentNode;
+ element.style.visibility = "hidden"; // fix gecko rendering
+ dropon.parentNode.insertBefore(element, nextElement);
+ if(dropon.parentNode!=oldParentNode)
+ Sortable.options(oldParentNode).onChange(element);
+ Sortable.options(dropon.parentNode).onChange(element);
+ }
+ }
+ },
+
+ onEmptyHover: function(element, dropon, overlap) {
+ var oldParentNode = element.parentNode;
+ var droponOptions = Sortable.options(dropon);
+
+ if(!Element.isParent(dropon, element)) {
+ var index;
+
+ var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
+ var child = null;
+
+ if(children) {
+ var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
+
+ for (index = 0; index < children.length; index += 1) {
+ if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
+ offset -= Element.offsetSize (children[index], droponOptions.overlap);
+ } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
+ child = index + 1 < children.length ? children[index + 1] : null;
+ break;
+ } else {
+ child = children[index];
+ break;
+ }
+ }
+ }
+
+ dropon.insertBefore(element, child);
+
+ Sortable.options(oldParentNode).onChange(element);
+ droponOptions.onChange(element);
+ }
+ },
+
+ unmark: function() {
+ if(Sortable._marker) Sortable._marker.hide();
+ },
+
+ mark: function(dropon, position) {
+ // mark on ghosting only
+ var sortable = Sortable.options(dropon.parentNode);
+ if(sortable && !sortable.ghosting) return;
+
+ if(!Sortable._marker) {
+ Sortable._marker =
+ ($('dropmarker') || Element.extend(document.createElement('DIV'))).
+ hide().addClassName('dropmarker').setStyle({position:'absolute'});
+ document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
+ }
+ var offsets = dropon.cumulativeOffset();
+ Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
+
+ if(position=='after')
+ if(sortable.overlap == 'horizontal')
+ Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
+ else
+ Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
+
+ Sortable._marker.show();
+ },
+
+ _tree: function(element, options, parent) {
+ var children = Sortable.findElements(element, options) || [];
+
+ for (var i = 0; i < children.length; ++i) {
+ var match = children[i].id.match(options.format);
+
+ if (!match) continue;
+
+ var child = {
+ id: encodeURIComponent(match ? match[1] : null),
+ element: element,
+ parent: parent,
+ children: [],
+ position: parent.children.length,
+ container: $(children[i]).down(options.treeTag)
+ };
+
+ /* Get the element containing the children and recurse over it */
+ if (child.container)
+ this._tree(child.container, options, child);
+
+ parent.children.push (child);
+ }
+
+ return parent;
+ },
+
+ tree: function(element) {
+ element = $(element);
+ var sortableOptions = this.options(element);
+ var options = Object.extend({
+ tag: sortableOptions.tag,
+ treeTag: sortableOptions.treeTag,
+ only: sortableOptions.only,
+ name: element.id,
+ format: sortableOptions.format
+ }, arguments[1] || { });
+
+ var root = {
+ id: null,
+ parent: null,
+ children: [],
+ container: element,
+ position: 0
+ };
+
+ return Sortable._tree(element, options, root);
+ },
+
+ /* Construct a [i] index for a particular node */
+ _constructIndex: function(node) {
+ var index = '';
+ do {
+ if (node.id) index = '[' + node.position + ']' + index;
+ } while ((node = node.parent) != null);
+ return index;
+ },
+
+ sequence: function(element) {
+ element = $(element);
+ var options = Object.extend(this.options(element), arguments[1] || { });
+
+ return $(this.findElements(element, options) || []).map( function(item) {
+ return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
+ });
+ },
+
+ setSequence: function(element, new_sequence) {
+ element = $(element);
+ var options = Object.extend(this.options(element), arguments[2] || { });
+
+ var nodeMap = { };
+ this.findElements(element, options).each( function(n) {
+ if (n.id.match(options.format))
+ nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
+ n.parentNode.removeChild(n);
+ });
+
+ new_sequence.each(function(ident) {
+ var n = nodeMap[ident];
+ if (n) {
+ n[1].appendChild(n[0]);
+ delete nodeMap[ident];
+ }
+ });
+ },
+
+ serialize: function(element) {
+ element = $(element);
+ var options = Object.extend(Sortable.options(element), arguments[1] || { });
+ var name = encodeURIComponent(
+ (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
+
+ if (options.tree) {
+ return Sortable.tree(element, arguments[1]).children.map( function (item) {
+ return [name + Sortable._constructIndex(item) + "[id]=" +
+ encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
+ }).flatten().join('&');
+ } else {
+ return Sortable.sequence(element, arguments[1]).map( function(item) {
+ return name + "[]=" + encodeURIComponent(item);
+ }).join('&');
+ }
+ }
+};
+
+// Returns true if child is contained within element
+Element.isParent = function(child, element) {
+ if (!child.parentNode || child == element) return false;
+ if (child.parentNode == element) return true;
+ return Element.isParent(child.parentNode, element);
+};
+
+Element.findChildren = function(element, only, recursive, tagName) {
+ if(!element.hasChildNodes()) return null;
+ tagName = tagName.toUpperCase();
+ if(only) only = [only].flatten();
+ var elements = [];
+ $A(element.childNodes).each( function(e) {
+ if(e.tagName && e.tagName.toUpperCase()==tagName &&
+ (!only || (Element.classNames(e).detect(function(v) { return only.include(v); }))))
+ elements.push(e);
+ if(recursive) {
+ var grandchildren = Element.findChildren(e, only, recursive, tagName);
+ if(grandchildren) elements.push(grandchildren);
+ }
+ });
+
+ return (elements.length>0 ? elements.flatten() : []);
+};
+
+Element.offsetSize = function (element, type) {
+ return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
+}; \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/effects.js b/src/usr/local/www/javascript/scriptaculous/effects.js
new file mode 100644
index 0000000..7d5192c
--- /dev/null
+++ b/src/usr/local/www/javascript/scriptaculous/effects.js
@@ -0,0 +1,1123 @@
+// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
+
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+// Justin Palmer (http://encytemedia.com/)
+// Mark Pilgrim (http://diveintomark.org/)
+// Martin Bialasinki
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// converts rgb() and #xxx to #xxxxxx format,
+// returns self (or first argument) if not convertable
+String.prototype.parseColor = function() {
+ var color = '#';
+ if (this.slice(0,4) == 'rgb(') {
+ var cols = this.slice(4,this.length-1).split(',');
+ var i=0; do { color += parseInt(cols[i]).toColorPart(); } while (++i<3);
+ } else {
+ if (this.slice(0,1) == '#') {
+ if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
+ if (this.length==7) color = this.toLowerCase();
+ }
+ }
+ return (color.length==7 ? color : (arguments[0] || this));
+};
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {
+ return $A($(element).childNodes).collect( function(node) {
+ return (node.nodeType==3 ? node.nodeValue :
+ (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+ }).flatten().join('');
+};
+
+Element.collectTextNodesIgnoreClass = function(element, className) {
+ return $A($(element).childNodes).collect( function(node) {
+ return (node.nodeType==3 ? node.nodeValue :
+ ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
+ Element.collectTextNodesIgnoreClass(node, className) : ''));
+ }).flatten().join('');
+};
+
+Element.setContentZoom = function(element, percent) {
+ element = $(element);
+ element.setStyle({fontSize: (percent/100) + 'em'});
+ if (Prototype.Browser.WebKit) window.scrollBy(0,0);
+ return element;
+};
+
+Element.getInlineOpacity = function(element){
+ return $(element).style.opacity || '';
+};
+
+Element.forceRerendering = function(element) {
+ try {
+ element = $(element);
+ var n = document.createTextNode(' ');
+ element.appendChild(n);
+ element.removeChild(n);
+ } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+ _elementDoesNotExistError: {
+ name: 'ElementDoesNotExistError',
+ message: 'The specified DOM element does not exist, but is required for this effect to operate'
+ },
+ Transitions: {
+ linear: Prototype.K,
+ sinoidal: function(pos) {
+ return (-Math.cos(pos*Math.PI)/2) + .5;
+ },
+ reverse: function(pos) {
+ return 1-pos;
+ },
+ flicker: function(pos) {
+ var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
+ return pos > 1 ? 1 : pos;
+ },
+ wobble: function(pos) {
+ return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
+ },
+ pulse: function(pos, pulses) {
+ return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
+ },
+ spring: function(pos) {
+ return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
+ },
+ none: function(pos) {
+ return 0;
+ },
+ full: function(pos) {
+ return 1;
+ }
+ },
+ DefaultOptions: {
+ duration: 1.0, // seconds
+ fps: 100, // 100= assume 66fps max.
+ sync: false, // true for combining
+ from: 0.0,
+ to: 1.0,
+ delay: 0.0,
+ queue: 'parallel'
+ },
+ tagifyText: function(element) {
+ var tagifyStyle = 'position:relative';
+ if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
+
+ element = $(element);
+ $A(element.childNodes).each( function(child) {
+ if (child.nodeType==3) {
+ child.nodeValue.toArray().each( function(character) {
+ element.insertBefore(
+ new Element('span', {style: tagifyStyle}).update(
+ character == ' ' ? String.fromCharCode(160) : character),
+ child);
+ });
+ Element.remove(child);
+ }
+ });
+ },
+ multiple: function(element, effect) {
+ var elements;
+ if (((typeof element == 'object') ||
+ Object.isFunction(element)) &&
+ (element.length))
+ elements = element;
+ else
+ elements = $(element).childNodes;
+
+ var options = Object.extend({
+ speed: 0.1,
+ delay: 0.0
+ }, arguments[2] || { });
+ var masterDelay = options.delay;
+
+ $A(elements).each( function(element, index) {
+ new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+ });
+ },
+ PAIRS: {
+ 'slide': ['SlideDown','SlideUp'],
+ 'blind': ['BlindDown','BlindUp'],
+ 'appear': ['Appear','Fade']
+ },
+ toggle: function(element, effect, options) {
+ element = $(element);
+ effect = (effect || 'appear').toLowerCase();
+
+ return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({
+ queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+ }, options || {}));
+ }
+};
+
+Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create(Enumerable, {
+ initialize: function() {
+ this.effects = [];
+ this.interval = null;
+ },
+ _each: function(iterator) {
+ this.effects._each(iterator);
+ },
+ add: function(effect) {
+ var timestamp = new Date().getTime();
+
+ var position = Object.isString(effect.options.queue) ?
+ effect.options.queue : effect.options.queue.position;
+
+ switch(position) {
+ case 'front':
+ // move unstarted effects after this effect
+ this.effects.findAll(function(e){ return e.state=='idle'; }).each( function(e) {
+ e.startOn += effect.finishOn;
+ e.finishOn += effect.finishOn;
+ });
+ break;
+ case 'with-last':
+ timestamp = this.effects.pluck('startOn').max() || timestamp;
+ break;
+ case 'end':
+ // start effect after last queued effect has finished
+ timestamp = this.effects.pluck('finishOn').max() || timestamp;
+ break;
+ }
+
+ effect.startOn += timestamp;
+ effect.finishOn += timestamp;
+
+ if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+ this.effects.push(effect);
+
+ if (!this.interval)
+ this.interval = setInterval(this.loop.bind(this), 15);
+ },
+ remove: function(effect) {
+ this.effects = this.effects.reject(function(e) { return e==effect; });
+ if (this.effects.length == 0) {
+ clearInterval(this.interval);
+ this.interval = null;
+ }
+ },
+ loop: function() {
+ var timePos = new Date().getTime();
+ for(var i=0, len=this.effects.length;i<len;i++)
+ this.effects[i] && this.effects[i].loop(timePos);
+ }
+});
+
+Effect.Queues = {
+ instances: $H(),
+ get: function(queueName) {
+ if (!Object.isString(queueName)) return queueName;
+
+ return this.instances.get(queueName) ||
+ this.instances.set(queueName, new Effect.ScopedQueue());
+ }
+};
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.Base = Class.create({
+ position: null,
+ start: function(options) {
+ if (options && options.transition === false) options.transition = Effect.Transitions.linear;
+ this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
+ this.currentFrame = 0;
+ this.state = 'idle';
+ this.startOn = this.options.delay*1000;
+ this.finishOn = this.startOn+(this.options.duration*1000);
+ this.fromToDelta = this.options.to-this.options.from;
+ this.totalTime = this.finishOn-this.startOn;
+ this.totalFrames = this.options.fps*this.options.duration;
+
+ this.render = (function() {
+ function dispatch(effect, eventName) {
+ if (effect.options[eventName + 'Internal'])
+ effect.options[eventName + 'Internal'](effect);
+ if (effect.options[eventName])
+ effect.options[eventName](effect);
+ }
+
+ return function(pos) {
+ if (this.state === "idle") {
+ this.state = "running";
+ dispatch(this, 'beforeSetup');
+ if (this.setup) this.setup();
+ dispatch(this, 'afterSetup');
+ }
+ if (this.state === "running") {
+ pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
+ this.position = pos;
+ dispatch(this, 'beforeUpdate');
+ if (this.update) this.update(pos);
+ dispatch(this, 'afterUpdate');
+ }
+ };
+ })();
+
+ this.event('beforeStart');
+ if (!this.options.sync)
+ Effect.Queues.get(Object.isString(this.options.queue) ?
+ 'global' : this.options.queue.scope).add(this);
+ },
+ loop: function(timePos) {
+ if (timePos >= this.startOn) {
+ if (timePos >= this.finishOn) {
+ this.render(1.0);
+ this.cancel();
+ this.event('beforeFinish');
+ if (this.finish) this.finish();
+ this.event('afterFinish');
+ return;
+ }
+ var pos = (timePos - this.startOn) / this.totalTime,
+ frame = (pos * this.totalFrames).round();
+ if (frame > this.currentFrame) {
+ this.render(pos);
+ this.currentFrame = frame;
+ }
+ }
+ },
+ cancel: function() {
+ if (!this.options.sync)
+ Effect.Queues.get(Object.isString(this.options.queue) ?
+ 'global' : this.options.queue.scope).remove(this);
+ this.state = 'finished';
+ },
+ event: function(eventName) {
+ if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+ if (this.options[eventName]) this.options[eventName](this);
+ },
+ inspect: function() {
+ var data = $H();
+ for(property in this)
+ if (!Object.isFunction(this[property])) data.set(property, this[property]);
+ return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
+ }
+});
+
+Effect.Parallel = Class.create(Effect.Base, {
+ initialize: function(effects) {
+ this.effects = effects || [];
+ this.start(arguments[1]);
+ },
+ update: function(position) {
+ this.effects.invoke('render', position);
+ },
+ finish: function(position) {
+ this.effects.each( function(effect) {
+ effect.render(1.0);
+ effect.cancel();
+ effect.event('beforeFinish');
+ if (effect.finish) effect.finish(position);
+ effect.event('afterFinish');
+ });
+ }
+});
+
+Effect.Tween = Class.create(Effect.Base, {
+ initialize: function(object, from, to) {
+ object = Object.isString(object) ? $(object) : object;
+ var args = $A(arguments), method = args.last(),
+ options = args.length == 5 ? args[3] : null;
+ this.method = Object.isFunction(method) ? method.bind(object) :
+ Object.isFunction(object[method]) ? object[method].bind(object) :
+ function(value) { object[method] = value; };
+ this.start(Object.extend({ from: from, to: to }, options || { }));
+ },
+ update: function(position) {
+ this.method(position);
+ }
+});
+
+Effect.Event = Class.create(Effect.Base, {
+ initialize: function() {
+ this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
+ },
+ update: Prototype.emptyFunction
+});
+
+Effect.Opacity = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ // make this work on IE on elements without 'layout'
+ if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+ this.element.setStyle({zoom: 1});
+ var options = Object.extend({
+ from: this.element.getOpacity() || 0.0,
+ to: 1.0
+ }, arguments[1] || { });
+ this.start(options);
+ },
+ update: function(position) {
+ this.element.setOpacity(position);
+ }
+});
+
+Effect.Move = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({
+ x: 0,
+ y: 0,
+ mode: 'relative'
+ }, arguments[1] || { });
+ this.start(options);
+ },
+ setup: function() {
+ this.element.makePositioned();
+ this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+ this.originalTop = parseFloat(this.element.getStyle('top') || '0');
+ if (this.options.mode == 'absolute') {
+ this.options.x = this.options.x - this.originalLeft;
+ this.options.y = this.options.y - this.originalTop;
+ }
+ },
+ update: function(position) {
+ this.element.setStyle({
+ left: (this.options.x * position + this.originalLeft).round() + 'px',
+ top: (this.options.y * position + this.originalTop).round() + 'px'
+ });
+ }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+ return new Effect.Move(element,
+ Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
+};
+
+Effect.Scale = Class.create(Effect.Base, {
+ initialize: function(element, percent) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({
+ scaleX: true,
+ scaleY: true,
+ scaleContent: true,
+ scaleFromCenter: false,
+ scaleMode: 'box', // 'box' or 'contents' or { } with provided values
+ scaleFrom: 100.0,
+ scaleTo: percent
+ }, arguments[2] || { });
+ this.start(options);
+ },
+ setup: function() {
+ this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+ this.elementPositioning = this.element.getStyle('position');
+
+ this.originalStyle = { };
+ ['top','left','width','height','fontSize'].each( function(k) {
+ this.originalStyle[k] = this.element.style[k];
+ }.bind(this));
+
+ this.originalTop = this.element.offsetTop;
+ this.originalLeft = this.element.offsetLeft;
+
+ var fontSize = this.element.getStyle('font-size') || '100%';
+ ['em','px','%','pt'].each( function(fontSizeType) {
+ if (fontSize.indexOf(fontSizeType)>0) {
+ this.fontSize = parseFloat(fontSize);
+ this.fontSizeType = fontSizeType;
+ }
+ }.bind(this));
+
+ this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+
+ this.dims = null;
+ if (this.options.scaleMode=='box')
+ this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+ if (/^content/.test(this.options.scaleMode))
+ this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+ if (!this.dims)
+ this.dims = [this.options.scaleMode.originalHeight,
+ this.options.scaleMode.originalWidth];
+ },
+ update: function(position) {
+ var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+ if (this.options.scaleContent && this.fontSize)
+ this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+ this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+ },
+ finish: function(position) {
+ if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+ },
+ setDimensions: function(height, width) {
+ var d = { };
+ if (this.options.scaleX) d.width = width.round() + 'px';
+ if (this.options.scaleY) d.height = height.round() + 'px';
+ if (this.options.scaleFromCenter) {
+ var topd = (height - this.dims[0])/2;
+ var leftd = (width - this.dims[1])/2;
+ if (this.elementPositioning == 'absolute') {
+ if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
+ if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+ } else {
+ if (this.options.scaleY) d.top = -topd + 'px';
+ if (this.options.scaleX) d.left = -leftd + 'px';
+ }
+ }
+ this.element.setStyle(d);
+ }
+});
+
+Effect.Highlight = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
+ this.start(options);
+ },
+ setup: function() {
+ // Prevent executing on elements not in the layout flow
+ if (this.element.getStyle('display')=='none') { this.cancel(); return; }
+ // Disable background image during the effect
+ this.oldStyle = { };
+ if (!this.options.keepBackgroundImage) {
+ this.oldStyle.backgroundImage = this.element.getStyle('background-image');
+ this.element.setStyle({backgroundImage: 'none'});
+ }
+ if (!this.options.endcolor)
+ this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+ if (!this.options.restorecolor)
+ this.options.restorecolor = this.element.getStyle('background-color');
+ // init color calculations
+ this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16); }.bind(this));
+ this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i]; }.bind(this));
+ },
+ update: function(position) {
+ this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+ return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
+ },
+ finish: function() {
+ this.element.setStyle(Object.extend(this.oldStyle, {
+ backgroundColor: this.options.restorecolor
+ }));
+ }
+});
+
+Effect.ScrollTo = function(element) {
+ var options = arguments[1] || { },
+ scrollOffsets = document.viewport.getScrollOffsets(),
+ elementOffsets = $(element).cumulativeOffset();
+
+ if (options.offset) elementOffsets[1] += options.offset;
+
+ return new Effect.Tween(null,
+ scrollOffsets.top,
+ elementOffsets[1],
+ options,
+ function(p){ scrollTo(scrollOffsets.left, p.round()); }
+ );
+};
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+ element = $(element);
+ var oldOpacity = element.getInlineOpacity();
+ var options = Object.extend({
+ from: element.getOpacity() || 1.0,
+ to: 0.0,
+ afterFinishInternal: function(effect) {
+ if (effect.options.to!=0) return;
+ effect.element.hide().setStyle({opacity: oldOpacity});
+ }
+ }, arguments[1] || { });
+ return new Effect.Opacity(element,options);
+};
+
+Effect.Appear = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+ to: 1.0,
+ // force Safari to render floated elements properly
+ afterFinishInternal: function(effect) {
+ effect.element.forceRerendering();
+ },
+ beforeSetup: function(effect) {
+ effect.element.setOpacity(effect.options.from).show();
+ }}, arguments[1] || { });
+ return new Effect.Opacity(element,options);
+};
+
+Effect.Puff = function(element) {
+ element = $(element);
+ var oldStyle = {
+ opacity: element.getInlineOpacity(),
+ position: element.getStyle('position'),
+ top: element.style.top,
+ left: element.style.left,
+ width: element.style.width,
+ height: element.style.height
+ };
+ return new Effect.Parallel(
+ [ new Effect.Scale(element, 200,
+ { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
+ new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
+ Object.extend({ duration: 1.0,
+ beforeSetupInternal: function(effect) {
+ Position.absolutize(effect.effects[0].element);
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide().setStyle(oldStyle); }
+ }, arguments[1] || { })
+ );
+};
+
+Effect.BlindUp = function(element) {
+ element = $(element);
+ element.makeClipping();
+ return new Effect.Scale(element, 0,
+ Object.extend({ scaleContent: false,
+ scaleX: false,
+ restoreAfterFinish: true,
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping();
+ }
+ }, arguments[1] || { })
+ );
+};
+
+Effect.BlindDown = function(element) {
+ element = $(element);
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, 100, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ scaleFrom: 0,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makeClipping().setStyle({height: '0px'}).show();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.undoClipping();
+ }
+ }, arguments[1] || { }));
+};
+
+Effect.SwitchOff = function(element) {
+ element = $(element);
+ var oldOpacity = element.getInlineOpacity();
+ return new Effect.Appear(element, Object.extend({
+ duration: 0.4,
+ from: 0,
+ transition: Effect.Transitions.flicker,
+ afterFinishInternal: function(effect) {
+ new Effect.Scale(effect.element, 1, {
+ duration: 0.3, scaleFromCenter: true,
+ scaleX: false, scaleContent: false, restoreAfterFinish: true,
+ beforeSetup: function(effect) {
+ effect.element.makePositioned().makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
+ }
+ });
+ }
+ }, arguments[1] || { }));
+};
+
+Effect.DropOut = function(element) {
+ element = $(element);
+ var oldStyle = {
+ top: element.getStyle('top'),
+ left: element.getStyle('left'),
+ opacity: element.getInlineOpacity() };
+ return new Effect.Parallel(
+ [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
+ new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+ Object.extend(
+ { duration: 0.5,
+ beforeSetup: function(effect) {
+ effect.effects[0].element.makePositioned();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
+ }
+ }, arguments[1] || { }));
+};
+
+Effect.Shake = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ distance: 20,
+ duration: 0.5
+ }, arguments[1] || {});
+ var distance = parseFloat(options.distance);
+ var split = parseFloat(options.duration) / 10.0;
+ var oldStyle = {
+ top: element.getStyle('top'),
+ left: element.getStyle('left') };
+ return new Effect.Move(element,
+ { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
+ effect.element.undoPositioned().setStyle(oldStyle);
+ }}); }}); }}); }}); }}); }});
+};
+
+Effect.SlideDown = function(element) {
+ element = $(element).cleanWhitespace();
+ // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+ var oldInnerBottom = element.down().getStyle('bottom');
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, 100, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ scaleFrom: window.opera ? 0 : 1,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makePositioned();
+ effect.element.down().makePositioned();
+ if (window.opera) effect.element.setStyle({top: ''});
+ effect.element.makeClipping().setStyle({height: '0px'}).show();
+ },
+ afterUpdateInternal: function(effect) {
+ effect.element.down().setStyle({bottom:
+ (effect.dims[0] - effect.element.clientHeight) + 'px' });
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.undoClipping().undoPositioned();
+ effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
+ }, arguments[1] || { })
+ );
+};
+
+Effect.SlideUp = function(element) {
+ element = $(element).cleanWhitespace();
+ var oldInnerBottom = element.down().getStyle('bottom');
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, window.opera ? 0 : 1,
+ Object.extend({ scaleContent: false,
+ scaleX: false,
+ scaleMode: 'box',
+ scaleFrom: 100,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makePositioned();
+ effect.element.down().makePositioned();
+ if (window.opera) effect.element.setStyle({top: ''});
+ effect.element.makeClipping().show();
+ },
+ afterUpdateInternal: function(effect) {
+ effect.element.down().setStyle({bottom:
+ (effect.dims[0] - effect.element.clientHeight) + 'px' });
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping().undoPositioned();
+ effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
+ }
+ }, arguments[1] || { })
+ );
+};
+
+// Bug in opera makes the TD containing this element expand for a instance after finish
+Effect.Squish = function(element) {
+ return new Effect.Scale(element, window.opera ? 1 : 0, {
+ restoreAfterFinish: true,
+ beforeSetup: function(effect) {
+ effect.element.makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping();
+ }
+ });
+};
+
+Effect.Grow = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ direction: 'center',
+ moveTransition: Effect.Transitions.sinoidal,
+ scaleTransition: Effect.Transitions.sinoidal,
+ opacityTransition: Effect.Transitions.full
+ }, arguments[1] || { });
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ height: element.style.height,
+ width: element.style.width,
+ opacity: element.getInlineOpacity() };
+
+ var dims = element.getDimensions();
+ var initialMoveX, initialMoveY;
+ var moveX, moveY;
+
+ switch (options.direction) {
+ case 'top-left':
+ initialMoveX = initialMoveY = moveX = moveY = 0;
+ break;
+ case 'top-right':
+ initialMoveX = dims.width;
+ initialMoveY = moveY = 0;
+ moveX = -dims.width;
+ break;
+ case 'bottom-left':
+ initialMoveX = moveX = 0;
+ initialMoveY = dims.height;
+ moveY = -dims.height;
+ break;
+ case 'bottom-right':
+ initialMoveX = dims.width;
+ initialMoveY = dims.height;
+ moveX = -dims.width;
+ moveY = -dims.height;
+ break;
+ case 'center':
+ initialMoveX = dims.width / 2;
+ initialMoveY = dims.height / 2;
+ moveX = -dims.width / 2;
+ moveY = -dims.height / 2;
+ break;
+ }
+
+ return new Effect.Move(element, {
+ x: initialMoveX,
+ y: initialMoveY,
+ duration: 0.01,
+ beforeSetup: function(effect) {
+ effect.element.hide().makeClipping().makePositioned();
+ },
+ afterFinishInternal: function(effect) {
+ new Effect.Parallel(
+ [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+ new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+ new Effect.Scale(effect.element, 100, {
+ scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
+ sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+ ], Object.extend({
+ beforeSetup: function(effect) {
+ effect.effects[0].element.setStyle({height: '0px'}).show();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
+ }
+ }, options)
+ );
+ }
+ });
+};
+
+Effect.Shrink = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ direction: 'center',
+ moveTransition: Effect.Transitions.sinoidal,
+ scaleTransition: Effect.Transitions.sinoidal,
+ opacityTransition: Effect.Transitions.none
+ }, arguments[1] || { });
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ height: element.style.height,
+ width: element.style.width,
+ opacity: element.getInlineOpacity() };
+
+ var dims = element.getDimensions();
+ var moveX, moveY;
+
+ switch (options.direction) {
+ case 'top-left':
+ moveX = moveY = 0;
+ break;
+ case 'top-right':
+ moveX = dims.width;
+ moveY = 0;
+ break;
+ case 'bottom-left':
+ moveX = 0;
+ moveY = dims.height;
+ break;
+ case 'bottom-right':
+ moveX = dims.width;
+ moveY = dims.height;
+ break;
+ case 'center':
+ moveX = dims.width / 2;
+ moveY = dims.height / 2;
+ break;
+ }
+
+ return new Effect.Parallel(
+ [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+ new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+ new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+ ], Object.extend({
+ beforeStartInternal: function(effect) {
+ effect.effects[0].element.makePositioned().makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
+ }, options)
+ );
+};
+
+Effect.Pulsate = function(element) {
+ element = $(element);
+ var options = arguments[1] || { },
+ oldOpacity = element.getInlineOpacity(),
+ transition = options.transition || Effect.Transitions.linear,
+ reverser = function(pos){
+ return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
+ };
+
+ return new Effect.Opacity(element,
+ Object.extend(Object.extend({ duration: 2.0, from: 0,
+ afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+ }, options), {transition: reverser}));
+};
+
+Effect.Fold = function(element) {
+ element = $(element);
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ width: element.style.width,
+ height: element.style.height };
+ element.makeClipping();
+ return new Effect.Scale(element, 5, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ afterFinishInternal: function(effect) {
+ new Effect.Scale(element, 1, {
+ scaleContent: false,
+ scaleY: false,
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping().setStyle(oldStyle);
+ } });
+ }}, arguments[1] || { }));
+};
+
+Effect.Morph = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({
+ style: { }
+ }, arguments[1] || { });
+
+ if (!Object.isString(options.style)) this.style = $H(options.style);
+ else {
+ if (options.style.include(':'))
+ this.style = options.style.parseStyle();
+ else {
+ this.element.addClassName(options.style);
+ this.style = $H(this.element.getStyles());
+ this.element.removeClassName(options.style);
+ var css = this.element.getStyles();
+ this.style = this.style.reject(function(style) {
+ return style.value == css[style.key];
+ });
+ options.afterFinishInternal = function(effect) {
+ effect.element.addClassName(effect.options.style);
+ effect.transforms.each(function(transform) {
+ effect.element.style[transform.style] = '';
+ });
+ };
+ }
+ }
+ this.start(options);
+ },
+
+ setup: function(){
+ function parseColor(color){
+ if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+ color = color.parseColor();
+ return $R(0,2).map(function(i){
+ return parseInt( color.slice(i*2+1,i*2+3), 16 );
+ });
+ }
+ this.transforms = this.style.map(function(pair){
+ var property = pair[0], value = pair[1], unit = null;
+
+ if (value.parseColor('#zzzzzz') != '#zzzzzz') {
+ value = value.parseColor();
+ unit = 'color';
+ } else if (property == 'opacity') {
+ value = parseFloat(value);
+ if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+ this.element.setStyle({zoom: 1});
+ } else if (Element.CSS_LENGTH.test(value)) {
+ var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
+ value = parseFloat(components[1]);
+ unit = (components.length == 3) ? components[2] : null;
+ }
+
+ var originalValue = this.element.getStyle(property);
+ return {
+ style: property.camelize(),
+ originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
+ targetValue: unit=='color' ? parseColor(value) : value,
+ unit: unit
+ };
+ }.bind(this)).reject(function(transform){
+ return (
+ (transform.originalValue == transform.targetValue) ||
+ (
+ transform.unit != 'color' &&
+ (isNaN(transform.originalValue) || isNaN(transform.targetValue))
+ )
+ );
+ });
+ },
+ update: function(position) {
+ var style = { }, transform, i = this.transforms.length;
+ while(i--)
+ style[(transform = this.transforms[i]).style] =
+ transform.unit=='color' ? '#'+
+ (Math.round(transform.originalValue[0]+
+ (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
+ (Math.round(transform.originalValue[1]+
+ (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
+ (Math.round(transform.originalValue[2]+
+ (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
+ (transform.originalValue +
+ (transform.targetValue - transform.originalValue) * position).toFixed(3) +
+ (transform.unit === null ? '' : transform.unit);
+ this.element.setStyle(style, true);
+ }
+});
+
+Effect.Transform = Class.create({
+ initialize: function(tracks){
+ this.tracks = [];
+ this.options = arguments[1] || { };
+ this.addTracks(tracks);
+ },
+ addTracks: function(tracks){
+ tracks.each(function(track){
+ track = $H(track);
+ var data = track.values().first();
+ this.tracks.push($H({
+ ids: track.keys().first(),
+ effect: Effect.Morph,
+ options: { style: data }
+ }));
+ }.bind(this));
+ return this;
+ },
+ play: function(){
+ return new Effect.Parallel(
+ this.tracks.map(function(track){
+ var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
+ var elements = [$(ids) || $$(ids)].flatten();
+ return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)); });
+ }).flatten(),
+ this.options
+ );
+ }
+});
+
+Element.CSS_PROPERTIES = $w(
+ 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
+ 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
+ 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
+ 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
+ 'fontSize fontWeight height left letterSpacing lineHeight ' +
+ 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
+ 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
+ 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
+ 'right textIndent top width wordSpacing zIndex');
+
+Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
+
+String.__parseStyleElement = document.createElement('div');
+String.prototype.parseStyle = function(){
+ var style, styleRules = $H();
+ if (Prototype.Browser.WebKit)
+ style = new Element('div',{style:this}).style;
+ else {
+ String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
+ style = String.__parseStyleElement.childNodes[0].style;
+ }
+
+ Element.CSS_PROPERTIES.each(function(property){
+ if (style[property]) styleRules.set(property, style[property]);
+ });
+
+ if (Prototype.Browser.IE && this.include('opacity'))
+ styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
+
+ return styleRules;
+};
+
+if (document.defaultView && document.defaultView.getComputedStyle) {
+ Element.getStyles = function(element) {
+ var css = document.defaultView.getComputedStyle($(element), null);
+ return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
+ styles[property] = css[property];
+ return styles;
+ });
+ };
+} else {
+ Element.getStyles = function(element) {
+ element = $(element);
+ var css = element.currentStyle, styles;
+ styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
+ results[property] = css[property];
+ return results;
+ });
+ if (!styles.opacity) styles.opacity = element.getOpacity();
+ return styles;
+ };
+}
+
+Effect.Methods = {
+ morph: function(element, style) {
+ element = $(element);
+ new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
+ return element;
+ },
+ visualEffect: function(element, effect, options) {
+ element = $(element);
+ var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
+ new Effect[klass](element, options);
+ return element;
+ },
+ highlight: function(element, options) {
+ element = $(element);
+ new Effect.Highlight(element, options);
+ return element;
+ }
+};
+
+$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
+ 'pulsate shake puff squish switchOff dropOut').each(
+ function(effect) {
+ Effect.Methods[effect] = function(element, options){
+ element = $(element);
+ Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
+ return element;
+ };
+ }
+);
+
+$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
+ function(f) { Effect.Methods[f] = Element[f]; }
+);
+
+Element.addMethods(Effect.Methods); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/prototype.js b/src/usr/local/www/javascript/scriptaculous/prototype.js
new file mode 100644
index 0000000..9cb702c
--- /dev/null
+++ b/src/usr/local/www/javascript/scriptaculous/prototype.js
@@ -0,0 +1,6079 @@
+/* Prototype JavaScript framework, version 1.7
+ * (c) 2005-2010 Sam Stephenson
+ *
+ * Prototype is freely distributable under the terms of an MIT-style license.
+ * For details, see the Prototype web site: http://www.prototypejs.org/
+ *
+ *--------------------------------------------------------------------------*/
+
+var Prototype = {
+
+ Version: '1.7',
+
+ Browser: (function(){
+ var ua = navigator.userAgent;
+ var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
+ return {
+ IE: !!window.attachEvent && !isOpera,
+ Opera: isOpera,
+ WebKit: ua.indexOf('AppleWebKit/') > -1,
+ Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
+ MobileSafari: /Apple.*Mobile/.test(ua)
+ };
+ })(),
+
+ BrowserFeatures: {
+ XPath: !!document.evaluate,
+
+ SelectorsAPI: !!document.querySelector,
+
+ ElementExtensions: (function() {
+ var constructor = window.Element || window.HTMLElement;
+ return !!(constructor && constructor.prototype);
+ })(),
+ SpecificElementExtensions: (function() {
+ if (typeof window.HTMLDivElement !== 'undefined')
+ return true;
+
+ var div = document.createElement('div'),
+ form = document.createElement('form'),
+ isSupported = false;
+
+ if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) {
+ isSupported = true;
+ }
+
+ div = form = null;
+
+ return isSupported;
+ })()
+ },
+
+ ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
+ JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+ emptyFunction: function() { },
+
+ K: function(x) { return x; }
+};
+
+if (Prototype.Browser.MobileSafari)
+ Prototype.BrowserFeatures.SpecificElementExtensions = false;
+
+
+var Abstract = { };
+
+
+var Try = {
+ these: function() {
+ var returnValue;
+
+ for (var i = 0, length = arguments.length; i < length; i++) {
+ var lambda = arguments[i];
+ try {
+ returnValue = lambda();
+ break;
+ } catch (e) { }
+ }
+
+ return returnValue;
+ }
+};
+
+/* Based on Alex Arnell's inheritance implementation. */
+
+var Class = (function() {
+
+ var IS_DONTENUM_BUGGY = (function(){
+ for (var p in { toString: 1 }) {
+ if (p === 'toString') return false;
+ }
+ return true;
+ })();
+
+ function subclass() {};
+ function create() {
+ var parent = null, properties = $A(arguments);
+ if (Object.isFunction(properties[0]))
+ parent = properties.shift();
+
+ function klass() {
+ this.initialize.apply(this, arguments);
+ }
+
+ Object.extend(klass, Class.Methods);
+ klass.superclass = parent;
+ klass.subclasses = [];
+
+ if (parent) {
+ subclass.prototype = parent.prototype;
+ klass.prototype = new subclass;
+ parent.subclasses.push(klass);
+ }
+
+ for (var i = 0, length = properties.length; i < length; i++)
+ klass.addMethods(properties[i]);
+
+ if (!klass.prototype.initialize)
+ klass.prototype.initialize = Prototype.emptyFunction;
+
+ klass.prototype.constructor = klass;
+ return klass;
+ }
+
+ function addMethods(source) {
+ var ancestor = this.superclass && this.superclass.prototype,
+ properties = Object.keys(source);
+
+ if (IS_DONTENUM_BUGGY) {
+ if (source.toString != Object.prototype.toString)
+ properties.push("toString");
+ if (source.valueOf != Object.prototype.valueOf)
+ properties.push("valueOf");
+ }
+
+ for (var i = 0, length = properties.length; i < length; i++) {
+ var property = properties[i], value = source[property];
+ if (ancestor && Object.isFunction(value) &&
+ value.argumentNames()[0] == "$super") {
+ var method = value;
+ value = (function(m) {
+ return function() { return ancestor[m].apply(this, arguments); };
+ })(property).wrap(method);
+
+ value.valueOf = method.valueOf.bind(method);
+ value.toString = method.toString.bind(method);
+ }
+ this.prototype[property] = value;
+ }
+
+ return this;
+ }
+
+ return {
+ create: create,
+ Methods: {
+ addMethods: addMethods
+ }
+ };
+})();
+(function() {
+
+ var _toString = Object.prototype.toString,
+ NULL_TYPE = 'Null',
+ UNDEFINED_TYPE = 'Undefined',
+ BOOLEAN_TYPE = 'Boolean',
+ NUMBER_TYPE = 'Number',
+ STRING_TYPE = 'String',
+ OBJECT_TYPE = 'Object',
+ FUNCTION_CLASS = '[object Function]',
+ BOOLEAN_CLASS = '[object Boolean]',
+ NUMBER_CLASS = '[object Number]',
+ STRING_CLASS = '[object String]',
+ ARRAY_CLASS = '[object Array]',
+ DATE_CLASS = '[object Date]',
+ NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON &&
+ typeof JSON.stringify === 'function' &&
+ JSON.stringify(0) === '0' &&
+ typeof JSON.stringify(Prototype.K) === 'undefined';
+
+ function Type(o) {
+ switch(o) {
+ case null: return NULL_TYPE;
+ case (void 0): return UNDEFINED_TYPE;
+ }
+ var type = typeof o;
+ switch(type) {
+ case 'boolean': return BOOLEAN_TYPE;
+ case 'number': return NUMBER_TYPE;
+ case 'string': return STRING_TYPE;
+ }
+ return OBJECT_TYPE;
+ }
+
+ function extend(destination, source) {
+ for (var property in source)
+ destination[property] = source[property];
+ return destination;
+ }
+
+ function inspect(object) {
+ try {
+ if (isUndefined(object)) return 'undefined';
+ if (object === null) return 'null';
+ return object.inspect ? object.inspect() : String(object);
+ } catch (e) {
+ if (e instanceof RangeError) return '...';
+ throw e;
+ }
+ }
+
+ function toJSON(value) {
+ return Str('', { '': value }, []);
+ }
+
+ function Str(key, holder, stack) {
+ var value = holder[key],
+ type = typeof value;
+
+ if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+
+ var _class = _toString.call(value);
+
+ switch (_class) {
+ case NUMBER_CLASS:
+ case BOOLEAN_CLASS:
+ case STRING_CLASS:
+ value = value.valueOf();
+ }
+
+ switch (value) {
+ case null: return 'null';
+ case true: return 'true';
+ case false: return 'false';
+ }
+
+ type = typeof value;
+ switch (type) {
+ case 'string':
+ return value.inspect(true);
+ case 'number':
+ return isFinite(value) ? String(value) : 'null';
+ case 'object':
+
+ for (var i = 0, length = stack.length; i < length; i++) {
+ if (stack[i] === value) { throw new TypeError(); }
+ }
+ stack.push(value);
+
+ var partial = [];
+ if (_class === ARRAY_CLASS) {
+ for (var i = 0, length = value.length; i < length; i++) {
+ var str = Str(i, value, stack);
+ partial.push(typeof str === 'undefined' ? 'null' : str);
+ }
+ partial = '[' + partial.join(',') + ']';
+ } else {
+ var keys = Object.keys(value);
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i], str = Str(key, value, stack);
+ if (typeof str !== "undefined") {
+ partial.push(key.inspect(true)+ ':' + str);
+ }
+ }
+ partial = '{' + partial.join(',') + '}';
+ }
+ stack.pop();
+ return partial;
+ }
+ }
+
+ function stringify(object) {
+ return JSON.stringify(object);
+ }
+
+ function toQueryString(object) {
+ return $H(object).toQueryString();
+ }
+
+ function toHTML(object) {
+ return object && object.toHTML ? object.toHTML() : String.interpret(object);
+ }
+
+ function keys(object) {
+ if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); }
+ var results = [];
+ for (var property in object) {
+ if (object.hasOwnProperty(property)) {
+ results.push(property);
+ }
+ }
+ return results;
+ }
+
+ function values(object) {
+ var results = [];
+ for (var property in object)
+ results.push(object[property]);
+ return results;
+ }
+
+ function clone(object) {
+ return extend({ }, object);
+ }
+
+ function isElement(object) {
+ return !!(object && object.nodeType == 1);
+ }
+
+ function isArray(object) {
+ return _toString.call(object) === ARRAY_CLASS;
+ }
+
+ var hasNativeIsArray = (typeof Array.isArray == 'function')
+ && Array.isArray([]) && !Array.isArray({});
+
+ if (hasNativeIsArray) {
+ isArray = Array.isArray;
+ }
+
+ function isHash(object) {
+ return object instanceof Hash;
+ }
+
+ function isFunction(object) {
+ return _toString.call(object) === FUNCTION_CLASS;
+ }
+
+ function isString(object) {
+ return _toString.call(object) === STRING_CLASS;
+ }
+
+ function isNumber(object) {
+ return _toString.call(object) === NUMBER_CLASS;
+ }
+
+ function isDate(object) {
+ return _toString.call(object) === DATE_CLASS;
+ }
+
+ function isUndefined(object) {
+ return typeof object === "undefined";
+ }
+
+ extend(Object, {
+ extend: extend,
+ inspect: inspect,
+ toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON,
+ toQueryString: toQueryString,
+ toHTML: toHTML,
+ keys: Object.keys || keys,
+ values: values,
+ clone: clone,
+ isElement: isElement,
+ isArray: isArray,
+ isHash: isHash,
+ isFunction: isFunction,
+ isString: isString,
+ isNumber: isNumber,
+ isDate: isDate,
+ isUndefined: isUndefined
+ });
+})();
+Object.extend(Function.prototype, (function() {
+ var slice = Array.prototype.slice;
+
+ function update(array, args) {
+ var arrayLength = array.length, length = args.length;
+ while (length--) array[arrayLength + length] = args[length];
+ return array;
+ }
+
+ function merge(array, args) {
+ array = slice.call(array, 0);
+ return update(array, args);
+ }
+
+ function argumentNames() {
+ var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
+ .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
+ .replace(/\s+/g, '').split(',');
+ return names.length == 1 && !names[0] ? [] : names;
+ }
+
+ function bind(context) {
+ if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
+ var __method = this, args = slice.call(arguments, 1);
+ return function() {
+ var a = merge(args, arguments);
+ return __method.apply(context, a);
+ };
+ }
+
+ function bindAsEventListener(context) {
+ var __method = this, args = slice.call(arguments, 1);
+ return function(event) {
+ var a = update([event || window.event], args);
+ return __method.apply(context, a);
+ };
+ }
+
+ function curry() {
+ if (!arguments.length) return this;
+ var __method = this, args = slice.call(arguments, 0);
+ return function() {
+ var a = merge(args, arguments);
+ return __method.apply(this, a);
+ };
+ }
+
+ function delay(timeout) {
+ var __method = this, args = slice.call(arguments, 1);
+ timeout = timeout * 1000;
+ return window.setTimeout(function() {
+ return __method.apply(__method, args);
+ }, timeout);
+ }
+
+ function defer() {
+ var args = update([0.01], arguments);
+ return this.delay.apply(this, args);
+ }
+
+ function wrap(wrapper) {
+ var __method = this;
+ return function() {
+ var a = update([__method.bind(this)], arguments);
+ return wrapper.apply(this, a);
+ };
+ }
+
+ function methodize() {
+ if (this._methodized) return this._methodized;
+ var __method = this;
+ return this._methodized = function() {
+ var a = update([this], arguments);
+ return __method.apply(null, a);
+ };
+ }
+
+ return {
+ argumentNames: argumentNames,
+ bind: bind,
+ bindAsEventListener: bindAsEventListener,
+ curry: curry,
+ delay: delay,
+ defer: defer,
+ wrap: wrap,
+ methodize: methodize
+ };
+})());
+
+
+
+(function(proto) {
+
+ function toISOString() {
+ return this.getUTCFullYear() + '-' +
+ (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
+ this.getUTCDate().toPaddedString(2) + 'T' +
+ this.getUTCHours().toPaddedString(2) + ':' +
+ this.getUTCMinutes().toPaddedString(2) + ':' +
+ this.getUTCSeconds().toPaddedString(2) + 'Z';
+ }
+
+
+ function toJSON() {
+ return this.toISOString();
+ }
+
+ if (!proto.toISOString) proto.toISOString = toISOString;
+ if (!proto.toJSON) proto.toJSON = toJSON;
+
+})(Date.prototype);
+
+
+RegExp.prototype.match = RegExp.prototype.test;
+
+RegExp.escape = function(str) {
+ return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+};
+var PeriodicalExecuter = Class.create({
+ initialize: function(callback, frequency) {
+ this.callback = callback;
+ this.frequency = frequency;
+ this.currentlyExecuting = false;
+
+ this.registerCallback();
+ },
+
+ registerCallback: function() {
+ this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+ },
+
+ execute: function() {
+ this.callback(this);
+ },
+
+ stop: function() {
+ if (!this.timer) return;
+ clearInterval(this.timer);
+ this.timer = null;
+ },
+
+ onTimerEvent: function() {
+ if (!this.currentlyExecuting) {
+ try {
+ this.currentlyExecuting = true;
+ this.execute();
+ this.currentlyExecuting = false;
+ } catch(e) {
+ this.currentlyExecuting = false;
+ throw e;
+ }
+ }
+ }
+});
+Object.extend(String, {
+ interpret: function(value) {
+ return value == null ? '' : String(value);
+ },
+ specialChar: {
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '\\': '\\\\'
+ }
+});
+
+Object.extend(String.prototype, (function() {
+ var NATIVE_JSON_PARSE_SUPPORT = window.JSON &&
+ typeof JSON.parse === 'function' &&
+ JSON.parse('{"test": true}').test;
+
+ function prepareReplacement(replacement) {
+ if (Object.isFunction(replacement)) return replacement;
+ var template = new Template(replacement);
+ return function(match) { return template.evaluate(match); };
+ }
+
+ function gsub(pattern, replacement) {
+ var result = '', source = this, match;
+ replacement = prepareReplacement(replacement);
+
+ if (Object.isString(pattern))
+ pattern = RegExp.escape(pattern);
+
+ if (!(pattern.length || pattern.source)) {
+ replacement = replacement('');
+ return replacement + source.split('').join(replacement) + replacement;
+ }
+
+ while (source.length > 0) {
+ if (match = source.match(pattern)) {
+ result += source.slice(0, match.index);
+ result += String.interpret(replacement(match));
+ source = source.slice(match.index + match[0].length);
+ } else {
+ result += source, source = '';
+ }
+ }
+ return result;
+ }
+
+ function sub(pattern, replacement, count) {
+ replacement = prepareReplacement(replacement);
+ count = Object.isUndefined(count) ? 1 : count;
+
+ return this.gsub(pattern, function(match) {
+ if (--count < 0) return match[0];
+ return replacement(match);
+ });
+ }
+
+ function scan(pattern, iterator) {
+ this.gsub(pattern, iterator);
+ return String(this);
+ }
+
+ function truncate(length, truncation) {
+ length = length || 30;
+ truncation = Object.isUndefined(truncation) ? '...' : truncation;
+ return this.length > length ?
+ this.slice(0, length - truncation.length) + truncation : String(this);
+ }
+
+ function strip() {
+ return this.replace(/^\s+/, '').replace(/\s+$/, '');
+ }
+
+ function stripTags() {
+ return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, '');
+ }
+
+ function stripScripts() {
+ return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+ }
+
+ function extractScripts() {
+ var matchAll = new RegExp(Prototype.ScriptFragment, 'img'),
+ matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+ return (this.match(matchAll) || []).map(function(scriptTag) {
+ return (scriptTag.match(matchOne) || ['', ''])[1];
+ });
+ }
+
+ function evalScripts() {
+ return this.extractScripts().map(function(script) { return eval(script); });
+ }
+
+ function escapeHTML() {
+ return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+ }
+
+ function unescapeHTML() {
+ return this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
+ }
+
+
+ function toQueryParams(separator) {
+ var match = this.strip().match(/([^?#]*)(#.*)?$/);
+ if (!match) return { };
+
+ return match[1].split(separator || '&').inject({ }, function(hash, pair) {
+ if ((pair = pair.split('='))[0]) {
+ var key = decodeURIComponent(pair.shift()),
+ value = pair.length > 1 ? pair.join('=') : pair[0];
+
+ if (value != undefined) value = decodeURIComponent(value);
+
+ if (key in hash) {
+ if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
+ hash[key].push(value);
+ }
+ else hash[key] = value;
+ }
+ return hash;
+ });
+ }
+
+ function toArray() {
+ return this.split('');
+ }
+
+ function succ() {
+ return this.slice(0, this.length - 1) +
+ String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+ }
+
+ function times(count) {
+ return count < 1 ? '' : new Array(count + 1).join(this);
+ }
+
+ function camelize() {
+ return this.replace(/-+(.)?/g, function(match, chr) {
+ return chr ? chr.toUpperCase() : '';
+ });
+ }
+
+ function capitalize() {
+ return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+ }
+
+ function underscore() {
+ return this.replace(/::/g, '/')
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
+ .replace(/([a-z\d])([A-Z])/g, '$1_$2')
+ .replace(/-/g, '_')
+ .toLowerCase();
+ }
+
+ function dasherize() {
+ return this.replace(/_/g, '-');
+ }
+
+ function inspect(useDoubleQuotes) {
+ var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) {
+ if (character in String.specialChar) {
+ return String.specialChar[character];
+ }
+ return '\\u00' + character.charCodeAt().toPaddedString(2, 16);
+ });
+ if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
+ return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+ }
+
+ function unfilterJSON(filter) {
+ return this.replace(filter || Prototype.JSONFilter, '$1');
+ }
+
+ function isJSON() {
+ var str = this;
+ if (str.blank()) return false;
+ str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
+ str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
+ str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
+ return (/^[\],:{}\s]*$/).test(str);
+ }
+
+ function evalJSON(sanitize) {
+ var json = this.unfilterJSON(),
+ cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+ if (cx.test(json)) {
+ json = json.replace(cx, function (a) {
+ return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ });
+ }
+ try {
+ if (!sanitize || json.isJSON()) return eval('(' + json + ')');
+ } catch (e) { }
+ throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
+ }
+
+ function parseJSON() {
+ var json = this.unfilterJSON();
+ return JSON.parse(json);
+ }
+
+ function include(pattern) {
+ return this.indexOf(pattern) > -1;
+ }
+
+ function startsWith(pattern) {
+ return this.lastIndexOf(pattern, 0) === 0;
+ }
+
+ function endsWith(pattern) {
+ var d = this.length - pattern.length;
+ return d >= 0 && this.indexOf(pattern, d) === d;
+ }
+
+ function empty() {
+ return this == '';
+ }
+
+ function blank() {
+ return /^\s*$/.test(this);
+ }
+
+ function interpolate(object, pattern) {
+ return new Template(this, pattern).evaluate(object);
+ }
+
+ return {
+ gsub: gsub,
+ sub: sub,
+ scan: scan,
+ truncate: truncate,
+ strip: String.prototype.trim || strip,
+ stripTags: stripTags,
+ stripScripts: stripScripts,
+ extractScripts: extractScripts,
+ evalScripts: evalScripts,
+ escapeHTML: escapeHTML,
+ unescapeHTML: unescapeHTML,
+ toQueryParams: toQueryParams,
+ parseQuery: toQueryParams,
+ toArray: toArray,
+ succ: succ,
+ times: times,
+ camelize: camelize,
+ capitalize: capitalize,
+ underscore: underscore,
+ dasherize: dasherize,
+ inspect: inspect,
+ unfilterJSON: unfilterJSON,
+ isJSON: isJSON,
+ evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON,
+ include: include,
+ startsWith: startsWith,
+ endsWith: endsWith,
+ empty: empty,
+ blank: blank,
+ interpolate: interpolate
+ };
+})());
+
+var Template = Class.create({
+ initialize: function(template, pattern) {
+ this.template = template.toString();
+ this.pattern = pattern || Template.Pattern;
+ },
+
+ evaluate: function(object) {
+ if (object && Object.isFunction(object.toTemplateReplacements))
+ object = object.toTemplateReplacements();
+
+ return this.template.gsub(this.pattern, function(match) {
+ if (object == null) return (match[1] + '');
+
+ var before = match[1] || '';
+ if (before == '\\') return match[2];
+
+ var ctx = object, expr = match[3],
+ pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
+
+ match = pattern.exec(expr);
+ if (match == null) return before;
+
+ while (match != null) {
+ var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
+ ctx = ctx[comp];
+ if (null == ctx || '' == match[3]) break;
+ expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
+ match = pattern.exec(expr);
+ }
+
+ return before + String.interpret(ctx);
+ });
+ }
+});
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+
+var $break = { };
+
+var Enumerable = (function() {
+ function each(iterator, context) {
+ var index = 0;
+ try {
+ this._each(function(value) {
+ iterator.call(context, value, index++);
+ });
+ } catch (e) {
+ if (e != $break) throw e;
+ }
+ return this;
+ }
+
+ function eachSlice(number, iterator, context) {
+ var index = -number, slices = [], array = this.toArray();
+ if (number < 1) return array;
+ while ((index += number) < array.length)
+ slices.push(array.slice(index, index+number));
+ return slices.collect(iterator, context);
+ }
+
+ function all(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var result = true;
+ this.each(function(value, index) {
+ result = result && !!iterator.call(context, value, index);
+ if (!result) throw $break;
+ });
+ return result;
+ }
+
+ function any(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var result = false;
+ this.each(function(value, index) {
+ if (result = !!iterator.call(context, value, index))
+ throw $break;
+ });
+ return result;
+ }
+
+ function collect(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var results = [];
+ this.each(function(value, index) {
+ results.push(iterator.call(context, value, index));
+ });
+ return results;
+ }
+
+ function detect(iterator, context) {
+ var result;
+ this.each(function(value, index) {
+ if (iterator.call(context, value, index)) {
+ result = value;
+ throw $break;
+ }
+ });
+ return result;
+ }
+
+ function findAll(iterator, context) {
+ var results = [];
+ this.each(function(value, index) {
+ if (iterator.call(context, value, index))
+ results.push(value);
+ });
+ return results;
+ }
+
+ function grep(filter, iterator, context) {
+ iterator = iterator || Prototype.K;
+ var results = [];
+
+ if (Object.isString(filter))
+ filter = new RegExp(RegExp.escape(filter));
+
+ this.each(function(value, index) {
+ if (filter.match(value))
+ results.push(iterator.call(context, value, index));
+ });
+ return results;
+ }
+
+ function include(object) {
+ if (Object.isFunction(this.indexOf))
+ if (this.indexOf(object) != -1) return true;
+
+ var found = false;
+ this.each(function(value) {
+ if (value == object) {
+ found = true;
+ throw $break;
+ }
+ });
+ return found;
+ }
+
+ function inGroupsOf(number, fillWith) {
+ fillWith = Object.isUndefined(fillWith) ? null : fillWith;
+ return this.eachSlice(number, function(slice) {
+ while(slice.length < number) slice.push(fillWith);
+ return slice;
+ });
+ }
+
+ function inject(memo, iterator, context) {
+ this.each(function(value, index) {
+ memo = iterator.call(context, memo, value, index);
+ });
+ return memo;
+ }
+
+ function invoke(method) {
+ var args = $A(arguments).slice(1);
+ return this.map(function(value) {
+ return value[method].apply(value, args);
+ });
+ }
+
+ function max(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var result;
+ this.each(function(value, index) {
+ value = iterator.call(context, value, index);
+ if (result == null || value >= result)
+ result = value;
+ });
+ return result;
+ }
+
+ function min(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var result;
+ this.each(function(value, index) {
+ value = iterator.call(context, value, index);
+ if (result == null || value < result)
+ result = value;
+ });
+ return result;
+ }
+
+ function partition(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var trues = [], falses = [];
+ this.each(function(value, index) {
+ (iterator.call(context, value, index) ?
+ trues : falses).push(value);
+ });
+ return [trues, falses];
+ }
+
+ function pluck(property) {
+ var results = [];
+ this.each(function(value) {
+ results.push(value[property]);
+ });
+ return results;
+ }
+
+ function reject(iterator, context) {
+ var results = [];
+ this.each(function(value, index) {
+ if (!iterator.call(context, value, index))
+ results.push(value);
+ });
+ return results;
+ }
+
+ function sortBy(iterator, context) {
+ return this.map(function(value, index) {
+ return {
+ value: value,
+ criteria: iterator.call(context, value, index)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ }).pluck('value');
+ }
+
+ function toArray() {
+ return this.map();
+ }
+
+ function zip() {
+ var iterator = Prototype.K, args = $A(arguments);
+ if (Object.isFunction(args.last()))
+ iterator = args.pop();
+
+ var collections = [this].concat(args).map($A);
+ return this.map(function(value, index) {
+ return iterator(collections.pluck(index));
+ });
+ }
+
+ function size() {
+ return this.toArray().length;
+ }
+
+ function inspect() {
+ return '#<Enumerable:' + this.toArray().inspect() + '>';
+ }
+
+
+
+
+
+
+
+
+
+ return {
+ each: each,
+ eachSlice: eachSlice,
+ all: all,
+ every: all,
+ any: any,
+ some: any,
+ collect: collect,
+ map: collect,
+ detect: detect,
+ findAll: findAll,
+ select: findAll,
+ filter: findAll,
+ grep: grep,
+ include: include,
+ member: include,
+ inGroupsOf: inGroupsOf,
+ inject: inject,
+ invoke: invoke,
+ max: max,
+ min: min,
+ partition: partition,
+ pluck: pluck,
+ reject: reject,
+ sortBy: sortBy,
+ toArray: toArray,
+ entries: toArray,
+ zip: zip,
+ size: size,
+ inspect: inspect,
+ find: detect
+ };
+})();
+
+function $A(iterable) {
+ if (!iterable) return [];
+ if ('toArray' in Object(iterable)) return iterable.toArray();
+ var length = iterable.length || 0, results = new Array(length);
+ while (length--) results[length] = iterable[length];
+ return results;
+}
+
+
+function $w(string) {
+ if (!Object.isString(string)) return [];
+ string = string.strip();
+ return string ? string.split(/\s+/) : [];
+}
+
+Array.from = $A;
+
+
+(function() {
+ var arrayProto = Array.prototype,
+ slice = arrayProto.slice,
+ _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available
+
+ function each(iterator, context) {
+ for (var i = 0, length = this.length >>> 0; i < length; i++) {
+ if (i in this) iterator.call(context, this[i], i, this);
+ }
+ }
+ if (!_each) _each = each;
+
+ function clear() {
+ this.length = 0;
+ return this;
+ }
+
+ function first() {
+ return this[0];
+ }
+
+ function last() {
+ return this[this.length - 1];
+ }
+
+ function compact() {
+ return this.select(function(value) {
+ return value != null;
+ });
+ }
+
+ function flatten() {
+ return this.inject([], function(array, value) {
+ if (Object.isArray(value))
+ return array.concat(value.flatten());
+ array.push(value);
+ return array;
+ });
+ }
+
+ function without() {
+ var values = slice.call(arguments, 0);
+ return this.select(function(value) {
+ return !values.include(value);
+ });
+ }
+
+ function reverse(inline) {
+ return (inline === false ? this.toArray() : this)._reverse();
+ }
+
+ function uniq(sorted) {
+ return this.inject([], function(array, value, index) {
+ if (0 == index || (sorted ? array.last() != value : !array.include(value)))
+ array.push(value);
+ return array;
+ });
+ }
+
+ function intersect(array) {
+ return this.uniq().findAll(function(item) {
+ return array.detect(function(value) { return item === value; });
+ });
+ }
+
+
+ function clone() {
+ return slice.call(this, 0);
+ }
+
+ function size() {
+ return this.length;
+ }
+
+ function inspect() {
+ return '[' + this.map(Object.inspect).join(', ') + ']';
+ }
+
+ function indexOf(item, i) {
+ i || (i = 0);
+ var length = this.length;
+ if (i < 0) i = length + i;
+ for (; i < length; i++)
+ if (this[i] === item) return i;
+ return -1;
+ }
+
+ function lastIndexOf(item, i) {
+ i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+ var n = this.slice(0, i).reverse().indexOf(item);
+ return (n < 0) ? n : i - n - 1;
+ }
+
+ function concat() {
+ var array = slice.call(this, 0), item;
+ for (var i = 0, length = arguments.length; i < length; i++) {
+ item = arguments[i];
+ if (Object.isArray(item) && !('callee' in item)) {
+ for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
+ array.push(item[j]);
+ } else {
+ array.push(item);
+ }
+ }
+ return array;
+ }
+
+ Object.extend(arrayProto, Enumerable);
+
+ if (!arrayProto._reverse)
+ arrayProto._reverse = arrayProto.reverse;
+
+ Object.extend(arrayProto, {
+ _each: _each,
+ clear: clear,
+ first: first,
+ last: last,
+ compact: compact,
+ flatten: flatten,
+ without: without,
+ reverse: reverse,
+ uniq: uniq,
+ intersect: intersect,
+ clone: clone,
+ toArray: clone,
+ size: size,
+ inspect: inspect
+ });
+
+ var CONCAT_ARGUMENTS_BUGGY = (function() {
+ return [].concat(arguments)[0][0] !== 1;
+ })(1,2);
+
+ if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;
+
+ if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;
+ if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf;
+})();
+function $H(object) {
+ return new Hash(object);
+};
+
+var Hash = Class.create(Enumerable, (function() {
+ function initialize(object) {
+ this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+ }
+
+
+ function _each(iterator) {
+ for (var key in this._object) {
+ var value = this._object[key], pair = [key, value];
+ pair.key = key;
+ pair.value = value;
+ iterator(pair);
+ }
+ }
+
+ function set(key, value) {
+ return this._object[key] = value;
+ }
+
+ function get(key) {
+ if (this._object[key] !== Object.prototype[key])
+ return this._object[key];
+ }
+
+ function unset(key) {
+ var value = this._object[key];
+ delete this._object[key];
+ return value;
+ }
+
+ function toObject() {
+ return Object.clone(this._object);
+ }
+
+
+
+ function keys() {
+ return this.pluck('key');
+ }
+
+ function values() {
+ return this.pluck('value');
+ }
+
+ function index(value) {
+ var match = this.detect(function(pair) {
+ return pair.value === value;
+ });
+ return match && match.key;
+ }
+
+ function merge(object) {
+ return this.clone().update(object);
+ }
+
+ function update(object) {
+ return new Hash(object).inject(this, function(result, pair) {
+ result.set(pair.key, pair.value);
+ return result;
+ });
+ }
+
+ function toQueryPair(key, value) {
+ if (Object.isUndefined(value)) return key;
+ return key + '=' + encodeURIComponent(String.interpret(value));
+ }
+
+ function toQueryString() {
+ return this.inject([], function(results, pair) {
+ var key = encodeURIComponent(pair.key), values = pair.value;
+
+ if (values && typeof values == 'object') {
+ if (Object.isArray(values)) {
+ var queryValues = [];
+ for (var i = 0, len = values.length, value; i < len; i++) {
+ value = values[i];
+ queryValues.push(toQueryPair(key, value));
+ }
+ return results.concat(queryValues);
+ }
+ } else results.push(toQueryPair(key, values));
+ return results;
+ }).join('&');
+ }
+
+ function inspect() {
+ return '#<Hash:{' + this.map(function(pair) {
+ return pair.map(Object.inspect).join(': ');
+ }).join(', ') + '}>';
+ }
+
+ function clone() {
+ return new Hash(this);
+ }
+
+ return {
+ initialize: initialize,
+ _each: _each,
+ set: set,
+ get: get,
+ unset: unset,
+ toObject: toObject,
+ toTemplateReplacements: toObject,
+ keys: keys,
+ values: values,
+ index: index,
+ merge: merge,
+ update: update,
+ toQueryString: toQueryString,
+ inspect: inspect,
+ toJSON: toObject,
+ clone: clone
+ };
+})());
+
+Hash.from = $H;
+Object.extend(Number.prototype, (function() {
+ function toColorPart() {
+ return this.toPaddedString(2, 16);
+ }
+
+ function succ() {
+ return this + 1;
+ }
+
+ function times(iterator, context) {
+ $R(0, this, true).each(iterator, context);
+ return this;
+ }
+
+ function toPaddedString(length, radix) {
+ var string = this.toString(radix || 10);
+ return '0'.times(length - string.length) + string;
+ }
+
+ function abs() {
+ return Math.abs(this);
+ }
+
+ function round() {
+ return Math.round(this);
+ }
+
+ function ceil() {
+ return Math.ceil(this);
+ }
+
+ function floor() {
+ return Math.floor(this);
+ }
+
+ return {
+ toColorPart: toColorPart,
+ succ: succ,
+ times: times,
+ toPaddedString: toPaddedString,
+ abs: abs,
+ round: round,
+ ceil: ceil,
+ floor: floor
+ };
+})());
+
+function $R(start, end, exclusive) {
+ return new ObjectRange(start, end, exclusive);
+}
+
+var ObjectRange = Class.create(Enumerable, (function() {
+ function initialize(start, end, exclusive) {
+ this.start = start;
+ this.end = end;
+ this.exclusive = exclusive;
+ }
+
+ function _each(iterator) {
+ var value = this.start;
+ while (this.include(value)) {
+ iterator(value);
+ value = value.succ();
+ }
+ }
+
+ function include(value) {
+ if (value < this.start)
+ return false;
+ if (this.exclusive)
+ return value < this.end;
+ return value <= this.end;
+ }
+
+ return {
+ initialize: initialize,
+ _each: _each,
+ include: include
+ };
+})());
+
+
+
+var Ajax = {
+ getTransport: function() {
+ return Try.these(
+ function() {return new XMLHttpRequest();},
+ function() {return new ActiveXObject('Msxml2.XMLHTTP');},
+ function() {return new ActiveXObject('Microsoft.XMLHTTP');}
+ ) || false;
+ },
+
+ activeRequestCount: 0
+};
+
+Ajax.Responders = {
+ responders: [],
+
+ _each: function(iterator) {
+ this.responders._each(iterator);
+ },
+
+ register: function(responder) {
+ if (!this.include(responder))
+ this.responders.push(responder);
+ },
+
+ unregister: function(responder) {
+ this.responders = this.responders.without(responder);
+ },
+
+ dispatch: function(callback, request, transport, json) {
+ this.each(function(responder) {
+ if (Object.isFunction(responder[callback])) {
+ try {
+ responder[callback].apply(responder, [request, transport, json]);
+ } catch (e) { }
+ }
+ });
+ }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+ onCreate: function() { Ajax.activeRequestCount++; },
+ onComplete: function() { Ajax.activeRequestCount--; }
+});
+Ajax.Base = Class.create({
+ initialize: function(options) {
+ this.options = {
+ method: 'post',
+ asynchronous: true,
+ contentType: 'application/x-www-form-urlencoded',
+ encoding: 'UTF-8',
+ parameters: '',
+ evalJSON: true,
+ evalJS: true
+ };
+ Object.extend(this.options, options || { });
+
+ this.options.method = this.options.method.toLowerCase();
+
+ if (Object.isHash(this.options.parameters))
+ this.options.parameters = this.options.parameters.toObject();
+ }
+});
+Ajax.Request = Class.create(Ajax.Base, {
+ _complete: false,
+
+ initialize: function($super, url, options) {
+ $super(options);
+ this.transport = Ajax.getTransport();
+ this.request(url);
+ },
+
+ request: function(url) {
+ this.url = url;
+ this.method = this.options.method;
+ var params = Object.isString(this.options.parameters) ?
+ this.options.parameters :
+ Object.toQueryString(this.options.parameters);
+
+ if (!['get', 'post'].include(this.method)) {
+ params += (params ? '&' : '') + "_method=" + this.method;
+ this.method = 'post';
+ }
+
+ if (params && this.method === 'get') {
+ this.url += (this.url.include('?') ? '&' : '?') + params;
+ }
+
+ this.parameters = params.toQueryParams();
+
+ try {
+ var response = new Ajax.Response(this);
+ if (this.options.onCreate) this.options.onCreate(response);
+ Ajax.Responders.dispatch('onCreate', this, response);
+
+ this.transport.open(this.method.toUpperCase(), this.url,
+ this.options.asynchronous);
+
+ if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
+
+ this.transport.onreadystatechange = this.onStateChange.bind(this);
+ this.setRequestHeaders();
+
+ this.body = this.method == 'post' ? (this.options.postBody || params) : null;
+ this.transport.send(this.body);
+
+ /* Force Firefox to handle ready state 4 for synchronous requests */
+ if (!this.options.asynchronous && this.transport.overrideMimeType)
+ this.onStateChange();
+
+ }
+ catch (e) {
+ this.dispatchException(e);
+ }
+ },
+
+ onStateChange: function() {
+ var readyState = this.transport.readyState;
+ if (readyState > 1 && !((readyState == 4) && this._complete))
+ this.respondToReadyState(this.transport.readyState);
+ },
+
+ setRequestHeaders: function() {
+ var headers = {
+ 'X-Requested-With': 'XMLHttpRequest',
+ 'X-Prototype-Version': Prototype.Version,
+ 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+ };
+
+ if (this.method == 'post') {
+ headers['Content-type'] = this.options.contentType +
+ (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+ /* Force "Connection: close" for older Mozilla browsers to work
+ * around a bug where XMLHttpRequest sends an incorrect
+ * Content-length header. See Mozilla Bugzilla #246651.
+ */
+ if (this.transport.overrideMimeType &&
+ (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+ headers['Connection'] = 'close';
+ }
+
+ if (typeof this.options.requestHeaders == 'object') {
+ var extras = this.options.requestHeaders;
+
+ if (Object.isFunction(extras.push))
+ for (var i = 0, length = extras.length; i < length; i += 2)
+ headers[extras[i]] = extras[i+1];
+ else
+ $H(extras).each(function(pair) { headers[pair.key] = pair.value; });
+ }
+
+ for (var name in headers)
+ this.transport.setRequestHeader(name, headers[name]);
+ },
+
+ success: function() {
+ var status = this.getStatus();
+ return !status || (status >= 200 && status < 300) || status == 304;
+ },
+
+ getStatus: function() {
+ try {
+ if (this.transport.status === 1223) return 204;
+ return this.transport.status || 0;
+ } catch (e) { return 0; }
+ },
+
+ respondToReadyState: function(readyState) {
+ var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
+
+ if (state == 'Complete') {
+ try {
+ this._complete = true;
+ (this.options['on' + response.status]
+ || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+ || Prototype.emptyFunction)(response, response.headerJSON);
+ } catch (e) {
+ this.dispatchException(e);
+ }
+
+ var contentType = response.getHeader('Content-type');
+ if (this.options.evalJS == 'force'
+ || (this.options.evalJS && this.isSameOrigin() && contentType
+ && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
+ this.evalResponse();
+ }
+
+ try {
+ (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
+ Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
+ } catch (e) {
+ this.dispatchException(e);
+ }
+
+ if (state == 'Complete') {
+ this.transport.onreadystatechange = Prototype.emptyFunction;
+ }
+ },
+
+ isSameOrigin: function() {
+ var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
+ return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
+ protocol: location.protocol,
+ domain: document.domain,
+ port: location.port ? ':' + location.port : ''
+ }));
+ },
+
+ getHeader: function(name) {
+ try {
+ return this.transport.getResponseHeader(name) || null;
+ } catch (e) { return null; }
+ },
+
+ evalResponse: function() {
+ try {
+ return eval((this.transport.responseText || '').unfilterJSON());
+ } catch (e) {
+ this.dispatchException(e);
+ }
+ },
+
+ dispatchException: function(exception) {
+ (this.options.onException || Prototype.emptyFunction)(this, exception);
+ Ajax.Responders.dispatch('onException', this, exception);
+ }
+});
+
+Ajax.Request.Events =
+ ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+
+
+
+
+
+
+
+Ajax.Response = Class.create({
+ initialize: function(request){
+ this.request = request;
+ var transport = this.transport = request.transport,
+ readyState = this.readyState = transport.readyState;
+
+ if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
+ this.status = this.getStatus();
+ this.statusText = this.getStatusText();
+ this.responseText = String.interpret(transport.responseText);
+ this.headerJSON = this._getHeaderJSON();
+ }
+
+ if (readyState == 4) {
+ var xml = transport.responseXML;
+ this.responseXML = Object.isUndefined(xml) ? null : xml;
+ this.responseJSON = this._getResponseJSON();
+ }
+ },
+
+ status: 0,
+
+ statusText: '',
+
+ getStatus: Ajax.Request.prototype.getStatus,
+
+ getStatusText: function() {
+ try {
+ return this.transport.statusText || '';
+ } catch (e) { return ''; }
+ },
+
+ getHeader: Ajax.Request.prototype.getHeader,
+
+ getAllHeaders: function() {
+ try {
+ return this.getAllResponseHeaders();
+ } catch (e) { return null; }
+ },
+
+ getResponseHeader: function(name) {
+ return this.transport.getResponseHeader(name);
+ },
+
+ getAllResponseHeaders: function() {
+ return this.transport.getAllResponseHeaders();
+ },
+
+ _getHeaderJSON: function() {
+ var json = this.getHeader('X-JSON');
+ if (!json) return null;
+ json = decodeURIComponent(escape(json));
+ try {
+ return json.evalJSON(this.request.options.sanitizeJSON ||
+ !this.request.isSameOrigin());
+ } catch (e) {
+ this.request.dispatchException(e);
+ }
+ },
+
+ _getResponseJSON: function() {
+ var options = this.request.options;
+ if (!options.evalJSON || (options.evalJSON != 'force' &&
+ !(this.getHeader('Content-type') || '').include('application/json')) ||
+ this.responseText.blank())
+ return null;
+ try {
+ return this.responseText.evalJSON(options.sanitizeJSON ||
+ !this.request.isSameOrigin());
+ } catch (e) {
+ this.request.dispatchException(e);
+ }
+ }
+});
+
+Ajax.Updater = Class.create(Ajax.Request, {
+ initialize: function($super, container, url, options) {
+ this.container = {
+ success: (container.success || container),
+ failure: (container.failure || (container.success ? null : container))
+ };
+
+ options = Object.clone(options);
+ var onComplete = options.onComplete;
+ options.onComplete = (function(response, json) {
+ this.updateContent(response.responseText);
+ if (Object.isFunction(onComplete)) onComplete(response, json);
+ }).bind(this);
+
+ $super(url, options);
+ },
+
+ updateContent: function(responseText) {
+ var receiver = this.container[this.success() ? 'success' : 'failure'],
+ options = this.options;
+
+ if (!options.evalScripts) responseText = responseText.stripScripts();
+
+ if (receiver = $(receiver)) {
+ if (options.insertion) {
+ if (Object.isString(options.insertion)) {
+ var insertion = { }; insertion[options.insertion] = responseText;
+ receiver.insert(insertion);
+ }
+ else options.insertion(receiver, responseText);
+ }
+ else receiver.update(responseText);
+ }
+ }
+});
+
+Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
+ initialize: function($super, container, url, options) {
+ $super(options);
+ this.onComplete = this.options.onComplete;
+
+ this.frequency = (this.options.frequency || 2);
+ this.decay = (this.options.decay || 1);
+
+ this.updater = { };
+ this.container = container;
+ this.url = url;
+
+ this.start();
+ },
+
+ start: function() {
+ this.options.onComplete = this.updateComplete.bind(this);
+ this.onTimerEvent();
+ },
+
+ stop: function() {
+ this.updater.options.onComplete = undefined;
+ clearTimeout(this.timer);
+ (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+ },
+
+ updateComplete: function(response) {
+ if (this.options.decay) {
+ this.decay = (response.responseText == this.lastText ?
+ this.decay * this.options.decay : 1);
+
+ this.lastText = response.responseText;
+ }
+ this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
+ },
+
+ onTimerEvent: function() {
+ this.updater = new Ajax.Updater(this.container, this.url, this.options);
+ }
+});
+
+
+function $(element) {
+ if (arguments.length > 1) {
+ for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+ elements.push($(arguments[i]));
+ return elements;
+ }
+ if (Object.isString(element))
+ element = document.getElementById(element);
+ return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+ document._getElementsByXPath = function(expression, parentElement) {
+ var results = [];
+ var query = document.evaluate(expression, $(parentElement) || document,
+ null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+ for (var i = 0, length = query.snapshotLength; i < length; i++)
+ results.push(Element.extend(query.snapshotItem(i)));
+ return results;
+ };
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!Node) var Node = { };
+
+if (!Node.ELEMENT_NODE) {
+ Object.extend(Node, {
+ ELEMENT_NODE: 1,
+ ATTRIBUTE_NODE: 2,
+ TEXT_NODE: 3,
+ CDATA_SECTION_NODE: 4,
+ ENTITY_REFERENCE_NODE: 5,
+ ENTITY_NODE: 6,
+ PROCESSING_INSTRUCTION_NODE: 7,
+ COMMENT_NODE: 8,
+ DOCUMENT_NODE: 9,
+ DOCUMENT_TYPE_NODE: 10,
+ DOCUMENT_FRAGMENT_NODE: 11,
+ NOTATION_NODE: 12
+ });
+}
+
+
+
+(function(global) {
+ function shouldUseCache(tagName, attributes) {
+ if (tagName === 'select') return false;
+ if ('type' in attributes) return false;
+ return true;
+ }
+
+ var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){
+ try {
+ var el = document.createElement('<input name="x">');
+ return el.tagName.toLowerCase() === 'input' && el.name === 'x';
+ }
+ catch(err) {
+ return false;
+ }
+ })();
+
+ var element = global.Element;
+
+ global.Element = function(tagName, attributes) {
+ attributes = attributes || { };
+ tagName = tagName.toLowerCase();
+ var cache = Element.cache;
+
+ if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) {
+ tagName = '<' + tagName + ' name="' + attributes.name + '">';
+ delete attributes.name;
+ return Element.writeAttribute(document.createElement(tagName), attributes);
+ }
+
+ if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
+
+ var node = shouldUseCache(tagName, attributes) ?
+ cache[tagName].cloneNode(false) : document.createElement(tagName);
+
+ return Element.writeAttribute(node, attributes);
+ };
+
+ Object.extend(global.Element, element || { });
+ if (element) global.Element.prototype = element.prototype;
+
+})(this);
+
+Element.idCounter = 1;
+Element.cache = { };
+
+Element._purgeElement = function(element) {
+ var uid = element._prototypeUID;
+ if (uid) {
+ Element.stopObserving(element);
+ element._prototypeUID = void 0;
+ delete Element.Storage[uid];
+ }
+};
+
+Element.Methods = {
+ visible: function(element) {
+ return $(element).style.display != 'none';
+ },
+
+ toggle: function(element) {
+ element = $(element);
+ Element[Element.visible(element) ? 'hide' : 'show'](element);
+ return element;
+ },
+
+ hide: function(element) {
+ element = $(element);
+ element.style.display = 'none';
+ return element;
+ },
+
+ show: function(element) {
+ element = $(element);
+ element.style.display = '';
+ return element;
+ },
+
+ remove: function(element) {
+ element = $(element);
+ element.parentNode.removeChild(element);
+ return element;
+ },
+
+ update: (function(){
+
+ var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){
+ var el = document.createElement("select"),
+ isBuggy = true;
+ el.innerHTML = "<option value=\"test\">test</option>";
+ if (el.options && el.options[0]) {
+ isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION";
+ }
+ el = null;
+ return isBuggy;
+ })();
+
+ var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){
+ try {
+ var el = document.createElement("table");
+ if (el && el.tBodies) {
+ el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>";
+ var isBuggy = typeof el.tBodies[0] == "undefined";
+ el = null;
+ return isBuggy;
+ }
+ } catch (e) {
+ return true;
+ }
+ })();
+
+ var LINK_ELEMENT_INNERHTML_BUGGY = (function() {
+ try {
+ var el = document.createElement('div');
+ el.innerHTML = "<link>";
+ var isBuggy = (el.childNodes.length === 0);
+ el = null;
+ return isBuggy;
+ } catch(e) {
+ return true;
+ }
+ })();
+
+ var ANY_INNERHTML_BUGGY = SELECT_ELEMENT_INNERHTML_BUGGY ||
+ TABLE_ELEMENT_INNERHTML_BUGGY || LINK_ELEMENT_INNERHTML_BUGGY;
+
+ var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () {
+ var s = document.createElement("script"),
+ isBuggy = false;
+ try {
+ s.appendChild(document.createTextNode(""));
+ isBuggy = !s.firstChild ||
+ s.firstChild && s.firstChild.nodeType !== 3;
+ } catch (e) {
+ isBuggy = true;
+ }
+ s = null;
+ return isBuggy;
+ })();
+
+
+ function update(element, content) {
+ element = $(element);
+ var purgeElement = Element._purgeElement;
+
+ var descendants = element.getElementsByTagName('*'),
+ i = descendants.length;
+ while (i--) purgeElement(descendants[i]);
+
+ if (content && content.toElement)
+ content = content.toElement();
+
+ if (Object.isElement(content))
+ return element.update().insert(content);
+
+ content = Object.toHTML(content);
+
+ var tagName = element.tagName.toUpperCase();
+
+ if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) {
+ element.text = content;
+ return element;
+ }
+
+ if (ANY_INNERHTML_BUGGY) {
+ if (tagName in Element._insertionTranslations.tags) {
+ while (element.firstChild) {
+ element.removeChild(element.firstChild);
+ }
+ Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+ .each(function(node) {
+ element.appendChild(node);
+ });
+ } else if (LINK_ELEMENT_INNERHTML_BUGGY && Object.isString(content) && content.indexOf('<link') > -1) {
+ while (element.firstChild) {
+ element.removeChild(element.firstChild);
+ }
+ var nodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts(), true);
+ nodes.each(function(node) { element.appendChild(node); });
+ }
+ else {
+ element.innerHTML = content.stripScripts();
+ }
+ }
+ else {
+ element.innerHTML = content.stripScripts();
+ }
+
+ content.evalScripts.bind(content).defer();
+ return element;
+ }
+
+ return update;
+ })(),
+
+ replace: function(element, content) {
+ element = $(element);
+ if (content && content.toElement) content = content.toElement();
+ else if (!Object.isElement(content)) {
+ content = Object.toHTML(content);
+ var range = element.ownerDocument.createRange();
+ range.selectNode(element);
+ content.evalScripts.bind(content).defer();
+ content = range.createContextualFragment(content.stripScripts());
+ }
+ element.parentNode.replaceChild(content, element);
+ return element;
+ },
+
+ insert: function(element, insertions) {
+ element = $(element);
+
+ if (Object.isString(insertions) || Object.isNumber(insertions) ||
+ Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+ insertions = {bottom:insertions};
+
+ var content, insert, tagName, childNodes;
+
+ for (var position in insertions) {
+ content = insertions[position];
+ position = position.toLowerCase();
+ insert = Element._insertionTranslations[position];
+
+ if (content && content.toElement) content = content.toElement();
+ if (Object.isElement(content)) {
+ insert(element, content);
+ continue;
+ }
+
+ content = Object.toHTML(content);
+
+ tagName = ((position == 'before' || position == 'after')
+ ? element.parentNode : element).tagName.toUpperCase();
+
+ childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+
+ if (position == 'top' || position == 'after') childNodes.reverse();
+ childNodes.each(insert.curry(element));
+
+ content.evalScripts.bind(content).defer();
+ }
+
+ return element;
+ },
+
+ wrap: function(element, wrapper, attributes) {
+ element = $(element);
+ if (Object.isElement(wrapper))
+ $(wrapper).writeAttribute(attributes || { });
+ else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
+ else wrapper = new Element('div', wrapper);
+ if (element.parentNode)
+ element.parentNode.replaceChild(wrapper, element);
+ wrapper.appendChild(element);
+ return wrapper;
+ },
+
+ inspect: function(element) {
+ element = $(element);
+ var result = '<' + element.tagName.toLowerCase();
+ $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+ var property = pair.first(),
+ attribute = pair.last(),
+ value = (element[property] || '').toString();
+ if (value) result += ' ' + attribute + '=' + value.inspect(true);
+ });
+ return result + '>';
+ },
+
+ recursivelyCollect: function(element, property, maximumLength) {
+ element = $(element);
+ maximumLength = maximumLength || -1;
+ var elements = [];
+
+ while (element = element[property]) {
+ if (element.nodeType == 1)
+ elements.push(Element.extend(element));
+ if (elements.length == maximumLength)
+ break;
+ }
+
+ return elements;
+ },
+
+ ancestors: function(element) {
+ return Element.recursivelyCollect(element, 'parentNode');
+ },
+
+ descendants: function(element) {
+ return Element.select(element, "*");
+ },
+
+ firstDescendant: function(element) {
+ element = $(element).firstChild;
+ while (element && element.nodeType != 1) element = element.nextSibling;
+ return $(element);
+ },
+
+ immediateDescendants: function(element) {
+ var results = [], child = $(element).firstChild;
+ while (child) {
+ if (child.nodeType === 1) {
+ results.push(Element.extend(child));
+ }
+ child = child.nextSibling;
+ }
+ return results;
+ },
+
+ previousSiblings: function(element, maximumLength) {
+ return Element.recursivelyCollect(element, 'previousSibling');
+ },
+
+ nextSiblings: function(element) {
+ return Element.recursivelyCollect(element, 'nextSibling');
+ },
+
+ siblings: function(element) {
+ element = $(element);
+ return Element.previousSiblings(element).reverse()
+ .concat(Element.nextSiblings(element));
+ },
+
+ match: function(element, selector) {
+ element = $(element);
+ if (Object.isString(selector))
+ return Prototype.Selector.match(element, selector);
+ return selector.match(element);
+ },
+
+ up: function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return $(element.parentNode);
+ var ancestors = Element.ancestors(element);
+ return Object.isNumber(expression) ? ancestors[expression] :
+ Prototype.Selector.find(ancestors, expression, index);
+ },
+
+ down: function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return Element.firstDescendant(element);
+ return Object.isNumber(expression) ? Element.descendants(element)[expression] :
+ Element.select(element, expression)[index || 0];
+ },
+
+ previous: function(element, expression, index) {
+ element = $(element);
+ if (Object.isNumber(expression)) index = expression, expression = false;
+ if (!Object.isNumber(index)) index = 0;
+
+ if (expression) {
+ return Prototype.Selector.find(element.previousSiblings(), expression, index);
+ } else {
+ return element.recursivelyCollect("previousSibling", index + 1)[index];
+ }
+ },
+
+ next: function(element, expression, index) {
+ element = $(element);
+ if (Object.isNumber(expression)) index = expression, expression = false;
+ if (!Object.isNumber(index)) index = 0;
+
+ if (expression) {
+ return Prototype.Selector.find(element.nextSiblings(), expression, index);
+ } else {
+ var maximumLength = Object.isNumber(index) ? index + 1 : 1;
+ return element.recursivelyCollect("nextSibling", index + 1)[index];
+ }
+ },
+
+
+ select: function(element) {
+ element = $(element);
+ var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
+ return Prototype.Selector.select(expressions, element);
+ },
+
+ adjacent: function(element) {
+ element = $(element);
+ var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
+ return Prototype.Selector.select(expressions, element.parentNode).without(element);
+ },
+
+ identify: function(element) {
+ element = $(element);
+ var id = Element.readAttribute(element, 'id');
+ if (id) return id;
+ do { id = 'anonymous_element_' + Element.idCounter++; } while ($(id));
+ Element.writeAttribute(element, 'id', id);
+ return id;
+ },
+
+ readAttribute: function(element, name) {
+ element = $(element);
+ if (Prototype.Browser.IE) {
+ var t = Element._attributeTranslations.read;
+ if (t.values[name]) return t.values[name](element, name);
+ if (t.names[name]) name = t.names[name];
+ if (name.include(':')) {
+ return (!element.attributes || !element.attributes[name]) ? null :
+ element.attributes[name].value;
+ }
+ }
+ return element.getAttribute(name);
+ },
+
+ writeAttribute: function(element, name, value) {
+ element = $(element);
+ var attributes = { }, t = Element._attributeTranslations.write;
+
+ if (typeof name == 'object') attributes = name;
+ else attributes[name] = Object.isUndefined(value) ? true : value;
+
+ for (var attr in attributes) {
+ name = t.names[attr] || attr;
+ value = attributes[attr];
+ if (t.values[attr]) name = t.values[attr](element, value);
+ if (value === false || value === null)
+ element.removeAttribute(name);
+ else if (value === true)
+ element.setAttribute(name, name);
+ else element.setAttribute(name, value);
+ }
+ return element;
+ },
+
+ getHeight: function(element) {
+ return Element.getDimensions(element).height;
+ },
+
+ getWidth: function(element) {
+ return Element.getDimensions(element).width;
+ },
+
+ classNames: function(element) {
+ return new Element.ClassNames(element);
+ },
+
+ hasClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ var elementClassName = element.className;
+ return (elementClassName.length > 0 && (elementClassName == className ||
+ new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
+ },
+
+ addClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ if (!Element.hasClassName(element, className))
+ element.className += (element.className ? ' ' : '') + className;
+ return element;
+ },
+
+ removeClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ element.className = element.className.replace(
+ new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
+ return element;
+ },
+
+ toggleClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ return Element[Element.hasClassName(element, className) ?
+ 'removeClassName' : 'addClassName'](element, className);
+ },
+
+ cleanWhitespace: function(element) {
+ element = $(element);
+ var node = element.firstChild;
+ while (node) {
+ var nextNode = node.nextSibling;
+ if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+ element.removeChild(node);
+ node = nextNode;
+ }
+ return element;
+ },
+
+ empty: function(element) {
+ return $(element).innerHTML.blank();
+ },
+
+ descendantOf: function(element, ancestor) {
+ element = $(element), ancestor = $(ancestor);
+
+ if (element.compareDocumentPosition)
+ return (element.compareDocumentPosition(ancestor) & 8) === 8;
+
+ if (ancestor.contains)
+ return ancestor.contains(element) && ancestor !== element;
+
+ while (element = element.parentNode)
+ if (element == ancestor) return true;
+
+ return false;
+ },
+
+ scrollTo: function(element) {
+ element = $(element);
+ var pos = Element.cumulativeOffset(element);
+ window.scrollTo(pos[0], pos[1]);
+ return element;
+ },
+
+ getStyle: function(element, style) {
+ element = $(element);
+ style = style == 'float' ? 'cssFloat' : style.camelize();
+ var value = element.style[style];
+ if (!value || value == 'auto') {
+ var css = document.defaultView.getComputedStyle(element, null);
+ value = css ? css[style] : null;
+ }
+ if (style == 'opacity') return value ? parseFloat(value) : 1.0;
+ return value == 'auto' ? null : value;
+ },
+
+ getOpacity: function(element) {
+ return $(element).getStyle('opacity');
+ },
+
+ setStyle: function(element, styles) {
+ element = $(element);
+ var elementStyle = element.style, match;
+ if (Object.isString(styles)) {
+ element.style.cssText += ';' + styles;
+ return styles.include('opacity') ?
+ element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
+ }
+ for (var property in styles)
+ if (property == 'opacity') element.setOpacity(styles[property]);
+ else
+ elementStyle[(property == 'float' || property == 'cssFloat') ?
+ (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
+ property] = styles[property];
+
+ return element;
+ },
+
+ setOpacity: function(element, value) {
+ element = $(element);
+ element.style.opacity = (value == 1 || value === '') ? '' :
+ (value < 0.00001) ? 0 : value;
+ return element;
+ },
+
+ makePositioned: function(element) {
+ element = $(element);
+ var pos = Element.getStyle(element, 'position');
+ if (pos == 'static' || !pos) {
+ element._madePositioned = true;
+ element.style.position = 'relative';
+ if (Prototype.Browser.Opera) {
+ element.style.top = 0;
+ element.style.left = 0;
+ }
+ }
+ return element;
+ },
+
+ undoPositioned: function(element) {
+ element = $(element);
+ if (element._madePositioned) {
+ element._madePositioned = undefined;
+ element.style.position =
+ element.style.top =
+ element.style.left =
+ element.style.bottom =
+ element.style.right = '';
+ }
+ return element;
+ },
+
+ makeClipping: function(element) {
+ element = $(element);
+ if (element._overflow) return element;
+ element._overflow = Element.getStyle(element, 'overflow') || 'auto';
+ if (element._overflow !== 'hidden')
+ element.style.overflow = 'hidden';
+ return element;
+ },
+
+ undoClipping: function(element) {
+ element = $(element);
+ if (!element._overflow) return element;
+ element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+ element._overflow = null;
+ return element;
+ },
+
+ clonePosition: function(element, source) {
+ var options = Object.extend({
+ setLeft: true,
+ setTop: true,
+ setWidth: true,
+ setHeight: true,
+ offsetTop: 0,
+ offsetLeft: 0
+ }, arguments[2] || { });
+
+ source = $(source);
+ var p = Element.viewportOffset(source), delta = [0, 0], parent = null;
+
+ element = $(element);
+
+ if (Element.getStyle(element, 'position') == 'absolute') {
+ parent = Element.getOffsetParent(element);
+ delta = Element.viewportOffset(parent);
+ }
+
+ if (parent == document.body) {
+ delta[0] -= document.body.offsetLeft;
+ delta[1] -= document.body.offsetTop;
+ }
+
+ if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
+ if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
+ if (options.setWidth) element.style.width = source.offsetWidth + 'px';
+ if (options.setHeight) element.style.height = source.offsetHeight + 'px';
+ return element;
+ }
+};
+
+Object.extend(Element.Methods, {
+ getElementsBySelector: Element.Methods.select,
+
+ childElements: Element.Methods.immediateDescendants
+});
+
+Element._attributeTranslations = {
+ write: {
+ names: {
+ className: 'class',
+ htmlFor: 'for'
+ },
+ values: { }
+ }
+};
+
+if (Prototype.Browser.Opera) {
+ Element.Methods.getStyle = Element.Methods.getStyle.wrap(
+ function(proceed, element, style) {
+ switch (style) {
+ case 'height': case 'width':
+ if (!Element.visible(element)) return null;
+
+ var dim = parseInt(proceed(element, style), 10);
+
+ if (dim !== element['offset' + style.capitalize()])
+ return dim + 'px';
+
+ var properties;
+ if (style === 'height') {
+ properties = ['border-top-width', 'padding-top',
+ 'padding-bottom', 'border-bottom-width'];
+ }
+ else {
+ properties = ['border-left-width', 'padding-left',
+ 'padding-right', 'border-right-width'];
+ }
+ return properties.inject(dim, function(memo, property) {
+ var val = proceed(element, property);
+ return val === null ? memo : memo - parseInt(val, 10);
+ }) + 'px';
+ default: return proceed(element, style);
+ }
+ }
+ );
+
+ Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
+ function(proceed, element, attribute) {
+ if (attribute === 'title') return element.title;
+ return proceed(element, attribute);
+ }
+ );
+}
+
+else if (Prototype.Browser.IE) {
+ Element.Methods.getStyle = function(element, style) {
+ element = $(element);
+ style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
+ var value = element.style[style];
+ if (!value && element.currentStyle) value = element.currentStyle[style];
+
+ if (style == 'opacity') {
+ if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+ if (value[1]) return parseFloat(value[1]) / 100;
+ return 1.0;
+ }
+
+ if (value == 'auto') {
+ if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
+ return element['offset' + style.capitalize()] + 'px';
+ return null;
+ }
+ return value;
+ };
+
+ Element.Methods.setOpacity = function(element, value) {
+ function stripAlpha(filter){
+ return filter.replace(/alpha\([^\)]*\)/gi,'');
+ }
+ element = $(element);
+ var currentStyle = element.currentStyle;
+ if ((currentStyle && !currentStyle.hasLayout) ||
+ (!currentStyle && element.style.zoom == 'normal'))
+ element.style.zoom = 1;
+
+ var filter = element.getStyle('filter'), style = element.style;
+ if (value == 1 || value === '') {
+ (filter = stripAlpha(filter)) ?
+ style.filter = filter : style.removeAttribute('filter');
+ return element;
+ } else if (value < 0.00001) value = 0;
+ style.filter = stripAlpha(filter) +
+ 'alpha(opacity=' + (value * 100) + ')';
+ return element;
+ };
+
+ Element._attributeTranslations = (function(){
+
+ var classProp = 'className',
+ forProp = 'for',
+ el = document.createElement('div');
+
+ el.setAttribute(classProp, 'x');
+
+ if (el.className !== 'x') {
+ el.setAttribute('class', 'x');
+ if (el.className === 'x') {
+ classProp = 'class';
+ }
+ }
+ el = null;
+
+ el = document.createElement('label');
+ el.setAttribute(forProp, 'x');
+ if (el.htmlFor !== 'x') {
+ el.setAttribute('htmlFor', 'x');
+ if (el.htmlFor === 'x') {
+ forProp = 'htmlFor';
+ }
+ }
+ el = null;
+
+ return {
+ read: {
+ names: {
+ 'class': classProp,
+ 'className': classProp,
+ 'for': forProp,
+ 'htmlFor': forProp
+ },
+ values: {
+ _getAttr: function(element, attribute) {
+ return element.getAttribute(attribute);
+ },
+ _getAttr2: function(element, attribute) {
+ return element.getAttribute(attribute, 2);
+ },
+ _getAttrNode: function(element, attribute) {
+ var node = element.getAttributeNode(attribute);
+ return node ? node.value : "";
+ },
+ _getEv: (function(){
+
+ var el = document.createElement('div'), f;
+ el.onclick = Prototype.emptyFunction;
+ var value = el.getAttribute('onclick');
+
+ if (String(value).indexOf('{') > -1) {
+ f = function(element, attribute) {
+ attribute = element.getAttribute(attribute);
+ if (!attribute) return null;
+ attribute = attribute.toString();
+ attribute = attribute.split('{')[1];
+ attribute = attribute.split('}')[0];
+ return attribute.strip();
+ };
+ }
+ else if (value === '') {
+ f = function(element, attribute) {
+ attribute = element.getAttribute(attribute);
+ if (!attribute) return null;
+ return attribute.strip();
+ };
+ }
+ el = null;
+ return f;
+ })(),
+ _flag: function(element, attribute) {
+ return $(element).hasAttribute(attribute) ? attribute : null;
+ },
+ style: function(element) {
+ return element.style.cssText.toLowerCase();
+ },
+ title: function(element) {
+ return element.title;
+ }
+ }
+ }
+ };
+ })();
+
+ Element._attributeTranslations.write = {
+ names: Object.extend({
+ cellpadding: 'cellPadding',
+ cellspacing: 'cellSpacing'
+ }, Element._attributeTranslations.read.names),
+ values: {
+ checked: function(element, value) {
+ element.checked = !!value;
+ },
+
+ style: function(element, value) {
+ element.style.cssText = value ? value : '';
+ }
+ }
+ };
+
+ Element._attributeTranslations.has = {};
+
+ $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
+ 'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
+ Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
+ Element._attributeTranslations.has[attr.toLowerCase()] = attr;
+ });
+
+ (function(v) {
+ Object.extend(v, {
+ href: v._getAttr2,
+ src: v._getAttr2,
+ type: v._getAttr,
+ action: v._getAttrNode,
+ disabled: v._flag,
+ checked: v._flag,
+ readonly: v._flag,
+ multiple: v._flag,
+ onload: v._getEv,
+ onunload: v._getEv,
+ onclick: v._getEv,
+ ondblclick: v._getEv,
+ onmousedown: v._getEv,
+ onmouseup: v._getEv,
+ onmouseover: v._getEv,
+ onmousemove: v._getEv,
+ onmouseout: v._getEv,
+ onfocus: v._getEv,
+ onblur: v._getEv,
+ onkeypress: v._getEv,
+ onkeydown: v._getEv,
+ onkeyup: v._getEv,
+ onsubmit: v._getEv,
+ onreset: v._getEv,
+ onselect: v._getEv,
+ onchange: v._getEv
+ });
+ })(Element._attributeTranslations.read.values);
+
+ if (Prototype.BrowserFeatures.ElementExtensions) {
+ (function() {
+ function _descendants(element) {
+ var nodes = element.getElementsByTagName('*'), results = [];
+ for (var i = 0, node; node = nodes[i]; i++)
+ if (node.tagName !== "!") // Filter out comment nodes.
+ results.push(node);
+ return results;
+ }
+
+ Element.Methods.down = function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return element.firstDescendant();
+ return Object.isNumber(expression) ? _descendants(element)[expression] :
+ Element.select(element, expression)[index || 0];
+ };
+ })();
+ }
+
+}
+
+else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
+ Element.Methods.setOpacity = function(element, value) {
+ element = $(element);
+ element.style.opacity = (value == 1) ? 0.999999 :
+ (value === '') ? '' : (value < 0.00001) ? 0 : value;
+ return element;
+ };
+}
+
+else if (Prototype.Browser.WebKit) {
+ Element.Methods.setOpacity = function(element, value) {
+ element = $(element);
+ element.style.opacity = (value == 1 || value === '') ? '' :
+ (value < 0.00001) ? 0 : value;
+
+ if (value == 1)
+ if (element.tagName.toUpperCase() == 'IMG' && element.width) {
+ element.width++; element.width--;
+ } else try {
+ var n = document.createTextNode(' ');
+ element.appendChild(n);
+ element.removeChild(n);
+ } catch (e) { }
+
+ return element;
+ };
+}
+
+if ('outerHTML' in document.documentElement) {
+ Element.Methods.replace = function(element, content) {
+ element = $(element);
+
+ if (content && content.toElement) content = content.toElement();
+ if (Object.isElement(content)) {
+ element.parentNode.replaceChild(content, element);
+ return element;
+ }
+
+ content = Object.toHTML(content);
+ var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
+
+ if (Element._insertionTranslations.tags[tagName]) {
+ var nextSibling = element.next(),
+ fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+ parent.removeChild(element);
+ if (nextSibling)
+ fragments.each(function(node) { parent.insertBefore(node, nextSibling); });
+ else
+ fragments.each(function(node) { parent.appendChild(node); });
+ }
+ else element.outerHTML = content.stripScripts();
+
+ content.evalScripts.bind(content).defer();
+ return element;
+ };
+}
+
+Element._returnOffset = function(l, t) {
+ var result = [l, t];
+ result.left = l;
+ result.top = t;
+ return result;
+};
+
+Element._getContentFromAnonymousElement = function(tagName, html, force) {
+ var div = new Element('div'),
+ t = Element._insertionTranslations.tags[tagName];
+
+ var workaround = false;
+ if (t) workaround = true;
+ else if (force) {
+ workaround = true;
+ t = ['', '', 0];
+ }
+
+ if (workaround) {
+ div.innerHTML = '&nbsp;' + t[0] + html + t[1];
+ div.removeChild(div.firstChild);
+ for (var i = t[2]; i--; ) {
+ div = div.firstChild;
+ }
+ }
+ else {
+ div.innerHTML = html;
+ }
+ return $A(div.childNodes);
+};
+
+Element._insertionTranslations = {
+ before: function(element, node) {
+ element.parentNode.insertBefore(node, element);
+ },
+ top: function(element, node) {
+ element.insertBefore(node, element.firstChild);
+ },
+ bottom: function(element, node) {
+ element.appendChild(node);
+ },
+ after: function(element, node) {
+ element.parentNode.insertBefore(node, element.nextSibling);
+ },
+ tags: {
+ TABLE: ['<table>', '</table>', 1],
+ TBODY: ['<table><tbody>', '</tbody></table>', 2],
+ TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],
+ TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
+ SELECT: ['<select>', '</select>', 1]
+ }
+};
+
+(function() {
+ var tags = Element._insertionTranslations.tags;
+ Object.extend(tags, {
+ THEAD: tags.TBODY,
+ TFOOT: tags.TBODY,
+ TH: tags.TD
+ });
+})();
+
+Element.Methods.Simulated = {
+ hasAttribute: function(element, attribute) {
+ attribute = Element._attributeTranslations.has[attribute] || attribute;
+ var node = $(element).getAttributeNode(attribute);
+ return !!(node && node.specified);
+ }
+};
+
+Element.Methods.ByTag = { };
+
+Object.extend(Element, Element.Methods);
+
+(function(div) {
+
+ if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
+ window.HTMLElement = { };
+ window.HTMLElement.prototype = div['__proto__'];
+ Prototype.BrowserFeatures.ElementExtensions = true;
+ }
+
+ div = null;
+
+})(document.createElement('div'));
+
+Element.extend = (function() {
+
+ function checkDeficiency(tagName) {
+ if (typeof window.Element != 'undefined') {
+ var proto = window.Element.prototype;
+ if (proto) {
+ var id = '_' + (Math.random()+'').slice(2),
+ el = document.createElement(tagName);
+ proto[id] = 'x';
+ var isBuggy = (el[id] !== 'x');
+ delete proto[id];
+ el = null;
+ return isBuggy;
+ }
+ }
+ return false;
+ }
+
+ function extendElementWith(element, methods) {
+ for (var property in methods) {
+ var value = methods[property];
+ if (Object.isFunction(value) && !(property in element))
+ element[property] = value.methodize();
+ }
+ }
+
+ var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object');
+
+ if (Prototype.BrowserFeatures.SpecificElementExtensions) {
+ if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) {
+ return function(element) {
+ if (element && typeof element._extendedByPrototype == 'undefined') {
+ var t = element.tagName;
+ if (t && (/^(?:object|applet|embed)$/i.test(t))) {
+ extendElementWith(element, Element.Methods);
+ extendElementWith(element, Element.Methods.Simulated);
+ extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]);
+ }
+ }
+ return element;
+ };
+ }
+ return Prototype.K;
+ }
+
+ var Methods = { }, ByTag = Element.Methods.ByTag;
+
+ var extend = Object.extend(function(element) {
+ if (!element || typeof element._extendedByPrototype != 'undefined' ||
+ element.nodeType != 1 || element == window) return element;
+
+ var methods = Object.clone(Methods),
+ tagName = element.tagName.toUpperCase();
+
+ if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
+
+ extendElementWith(element, methods);
+
+ element._extendedByPrototype = Prototype.emptyFunction;
+ return element;
+
+ }, {
+ refresh: function() {
+ if (!Prototype.BrowserFeatures.ElementExtensions) {
+ Object.extend(Methods, Element.Methods);
+ Object.extend(Methods, Element.Methods.Simulated);
+ }
+ }
+ });
+
+ extend.refresh();
+ return extend;
+})();
+
+if (document.documentElement.hasAttribute) {
+ Element.hasAttribute = function(element, attribute) {
+ return element.hasAttribute(attribute);
+ };
+}
+else {
+ Element.hasAttribute = Element.Methods.Simulated.hasAttribute;
+}
+
+Element.addMethods = function(methods) {
+ var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
+
+ if (!methods) {
+ Object.extend(Form, Form.Methods);
+ Object.extend(Form.Element, Form.Element.Methods);
+ Object.extend(Element.Methods.ByTag, {
+ "FORM": Object.clone(Form.Methods),
+ "INPUT": Object.clone(Form.Element.Methods),
+ "SELECT": Object.clone(Form.Element.Methods),
+ "TEXTAREA": Object.clone(Form.Element.Methods),
+ "BUTTON": Object.clone(Form.Element.Methods)
+ });
+ }
+
+ if (arguments.length == 2) {
+ var tagName = methods;
+ methods = arguments[1];
+ }
+
+ if (!tagName) Object.extend(Element.Methods, methods || { });
+ else {
+ if (Object.isArray(tagName)) tagName.each(extend);
+ else extend(tagName);
+ }
+
+ function extend(tagName) {
+ tagName = tagName.toUpperCase();
+ if (!Element.Methods.ByTag[tagName])
+ Element.Methods.ByTag[tagName] = { };
+ Object.extend(Element.Methods.ByTag[tagName], methods);
+ }
+
+ function copy(methods, destination, onlyIfAbsent) {
+ onlyIfAbsent = onlyIfAbsent || false;
+ for (var property in methods) {
+ var value = methods[property];
+ if (!Object.isFunction(value)) continue;
+ if (!onlyIfAbsent || !(property in destination))
+ destination[property] = value.methodize();
+ }
+ }
+
+ function findDOMClass(tagName) {
+ var klass;
+ var trans = {
+ "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
+ "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
+ "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
+ "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
+ "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
+ "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
+ "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
+ "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
+ "FrameSet", "IFRAME": "IFrame"
+ };
+ if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
+ if (window[klass]) return window[klass];
+ klass = 'HTML' + tagName + 'Element';
+ if (window[klass]) return window[klass];
+ klass = 'HTML' + tagName.capitalize() + 'Element';
+ if (window[klass]) return window[klass];
+
+ var element = document.createElement(tagName),
+ proto = element['__proto__'] || element.constructor.prototype;
+
+ element = null;
+ return proto;
+ }
+
+ var elementPrototype = window.HTMLElement ? HTMLElement.prototype :
+ Element.prototype;
+
+ if (F.ElementExtensions) {
+ copy(Element.Methods, elementPrototype);
+ copy(Element.Methods.Simulated, elementPrototype, true);
+ }
+
+ if (F.SpecificElementExtensions) {
+ for (var tag in Element.Methods.ByTag) {
+ var klass = findDOMClass(tag);
+ if (Object.isUndefined(klass)) continue;
+ copy(T[tag], klass.prototype);
+ }
+ }
+
+ Object.extend(Element, Element.Methods);
+ delete Element.ByTag;
+
+ if (Element.extend.refresh) Element.extend.refresh();
+ Element.cache = { };
+};
+
+
+document.viewport = {
+
+ getDimensions: function() {
+ return { width: this.getWidth(), height: this.getHeight() };
+ },
+
+ getScrollOffsets: function() {
+ return Element._returnOffset(
+ window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
+ window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
+ }
+};
+
+(function(viewport) {
+ var B = Prototype.Browser, doc = document, element, property = {};
+
+ function getRootElement() {
+ if (B.WebKit && !doc.evaluate)
+ return document;
+
+ if (B.Opera && window.parseFloat(window.opera.version()) < 9.5)
+ return document.body;
+
+ return document.documentElement;
+ }
+
+ function define(D) {
+ if (!element) element = getRootElement();
+
+ property[D] = 'client' + D;
+
+ viewport['get' + D] = function() { return element[property[D]]; };
+ return viewport['get' + D]();
+ }
+
+ viewport.getWidth = define.curry('Width');
+
+ viewport.getHeight = define.curry('Height');
+})(document.viewport);
+
+
+Element.Storage = {
+ UID: 1
+};
+
+Element.addMethods({
+ getStorage: function(element) {
+ if (!(element = $(element))) return;
+
+ var uid;
+ if (element === window) {
+ uid = 0;
+ } else {
+ if (typeof element._prototypeUID === "undefined")
+ element._prototypeUID = Element.Storage.UID++;
+ uid = element._prototypeUID;
+ }
+
+ if (!Element.Storage[uid])
+ Element.Storage[uid] = $H();
+
+ return Element.Storage[uid];
+ },
+
+ store: function(element, key, value) {
+ if (!(element = $(element))) return;
+
+ if (arguments.length === 2) {
+ Element.getStorage(element).update(key);
+ } else {
+ Element.getStorage(element).set(key, value);
+ }
+
+ return element;
+ },
+
+ retrieve: function(element, key, defaultValue) {
+ if (!(element = $(element))) return;
+ var hash = Element.getStorage(element), value = hash.get(key);
+
+ if (Object.isUndefined(value)) {
+ hash.set(key, defaultValue);
+ value = defaultValue;
+ }
+
+ return value;
+ },
+
+ clone: function(element, deep) {
+ if (!(element = $(element))) return;
+ var clone = element.cloneNode(deep);
+ clone._prototypeUID = void 0;
+ if (deep) {
+ var descendants = Element.select(clone, '*'),
+ i = descendants.length;
+ while (i--) {
+ descendants[i]._prototypeUID = void 0;
+ }
+ }
+ return Element.extend(clone);
+ },
+
+ purge: function(element) {
+ if (!(element = $(element))) return;
+ var purgeElement = Element._purgeElement;
+
+ purgeElement(element);
+
+ var descendants = element.getElementsByTagName('*'),
+ i = descendants.length;
+
+ while (i--) purgeElement(descendants[i]);
+
+ return null;
+ }
+});
+
+(function() {
+
+ function toDecimal(pctString) {
+ var match = pctString.match(/^(\d+)%?$/i);
+ if (!match) return null;
+ return (Number(match[1]) / 100);
+ }
+
+ function getPixelValue(value, property, context) {
+ var element = null;
+ if (Object.isElement(value)) {
+ element = value;
+ value = element.getStyle(property);
+ }
+
+ if (value === null) {
+ return null;
+ }
+
+ if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) {
+ return window.parseFloat(value);
+ }
+
+ var isPercentage = value.include('%'), isViewport = (context === document.viewport);
+
+ if (/\d/.test(value) && element && element.runtimeStyle && !(isPercentage && isViewport)) {
+ var style = element.style.left, rStyle = element.runtimeStyle.left;
+ element.runtimeStyle.left = element.currentStyle.left;
+ element.style.left = value || 0;
+ value = element.style.pixelLeft;
+ element.style.left = style;
+ element.runtimeStyle.left = rStyle;
+
+ return value;
+ }
+
+ if (element && isPercentage) {
+ context = context || element.parentNode;
+ var decimal = toDecimal(value);
+ var whole = null;
+ var position = element.getStyle('position');
+
+ var isHorizontal = property.include('left') || property.include('right') ||
+ property.include('width');
+
+ var isVertical = property.include('top') || property.include('bottom') ||
+ property.include('height');
+
+ if (context === document.viewport) {
+ if (isHorizontal) {
+ whole = document.viewport.getWidth();
+ } else if (isVertical) {
+ whole = document.viewport.getHeight();
+ }
+ } else {
+ if (isHorizontal) {
+ whole = $(context).measure('width');
+ } else if (isVertical) {
+ whole = $(context).measure('height');
+ }
+ }
+
+ return (whole === null) ? 0 : whole * decimal;
+ }
+
+ return 0;
+ }
+
+ function toCSSPixels(number) {
+ if (Object.isString(number) && number.endsWith('px')) {
+ return number;
+ }
+ return number + 'px';
+ }
+
+ function isDisplayed(element) {
+ var originalElement = element;
+ while (element && element.parentNode) {
+ var display = element.getStyle('display');
+ if (display === 'none') {
+ return false;
+ }
+ element = $(element.parentNode);
+ }
+ return true;
+ }
+
+ var hasLayout = Prototype.K;
+ if ('currentStyle' in document.documentElement) {
+ hasLayout = function(element) {
+ if (!element.currentStyle.hasLayout) {
+ element.style.zoom = 1;
+ }
+ return element;
+ };
+ }
+
+ function cssNameFor(key) {
+ if (key.include('border')) key = key + '-width';
+ return key.camelize();
+ }
+
+ Element.Layout = Class.create(Hash, {
+ initialize: function($super, element, preCompute) {
+ $super();
+ this.element = $(element);
+
+ Element.Layout.PROPERTIES.each( function(property) {
+ this._set(property, null);
+ }, this);
+
+ if (preCompute) {
+ this._preComputing = true;
+ this._begin();
+ Element.Layout.PROPERTIES.each( this._compute, this );
+ this._end();
+ this._preComputing = false;
+ }
+ },
+
+ _set: function(property, value) {
+ return Hash.prototype.set.call(this, property, value);
+ },
+
+ set: function(property, value) {
+ throw "Properties of Element.Layout are read-only.";
+ },
+
+ get: function($super, property) {
+ var value = $super(property);
+ return value === null ? this._compute(property) : value;
+ },
+
+ _begin: function() {
+ if (this._prepared) return;
+
+ var element = this.element;
+ if (isDisplayed(element)) {
+ this._prepared = true;
+ return;
+ }
+
+ var originalStyles = {
+ position: element.style.position || '',
+ width: element.style.width || '',
+ visibility: element.style.visibility || '',
+ display: element.style.display || ''
+ };
+
+ element.store('prototype_original_styles', originalStyles);
+
+ var position = element.getStyle('position'),
+ width = element.getStyle('width');
+
+ if (width === "0px" || width === null) {
+ element.style.display = 'block';
+ width = element.getStyle('width');
+ }
+
+ var context = (position === 'fixed') ? document.viewport :
+ element.parentNode;
+
+ element.setStyle({
+ position: 'absolute',
+ visibility: 'hidden',
+ display: 'block'
+ });
+
+ var positionedWidth = element.getStyle('width');
+
+ var newWidth;
+ if (width && (positionedWidth === width)) {
+ newWidth = getPixelValue(element, 'width', context);
+ } else if (position === 'absolute' || position === 'fixed') {
+ newWidth = getPixelValue(element, 'width', context);
+ } else {
+ var parent = element.parentNode, pLayout = $(parent).getLayout();
+
+ newWidth = pLayout.get('width') -
+ this.get('margin-left') -
+ this.get('border-left') -
+ this.get('padding-left') -
+ this.get('padding-right') -
+ this.get('border-right') -
+ this.get('margin-right');
+ }
+
+ element.setStyle({ width: newWidth + 'px' });
+
+ this._prepared = true;
+ },
+
+ _end: function() {
+ var element = this.element;
+ var originalStyles = element.retrieve('prototype_original_styles');
+ element.store('prototype_original_styles', null);
+ element.setStyle(originalStyles);
+ this._prepared = false;
+ },
+
+ _compute: function(property) {
+ var COMPUTATIONS = Element.Layout.COMPUTATIONS;
+ if (!(property in COMPUTATIONS)) {
+ throw "Property not found.";
+ }
+
+ return this._set(property, COMPUTATIONS[property].call(this, this.element));
+ },
+
+ toObject: function() {
+ var args = $A(arguments);
+ var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
+ args.join(' ').split(' ');
+ var obj = {};
+ keys.each( function(key) {
+ if (!Element.Layout.PROPERTIES.include(key)) return;
+ var value = this.get(key);
+ if (value != null) obj[key] = value;
+ }, this);
+ return obj;
+ },
+
+ toHash: function() {
+ var obj = this.toObject.apply(this, arguments);
+ return new Hash(obj);
+ },
+
+ toCSS: function() {
+ var args = $A(arguments);
+ var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
+ args.join(' ').split(' ');
+ var css = {};
+
+ keys.each( function(key) {
+ if (!Element.Layout.PROPERTIES.include(key)) return;
+ if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return;
+
+ var value = this.get(key);
+ if (value != null) css[cssNameFor(key)] = value + 'px';
+ }, this);
+ return css;
+ },
+
+ inspect: function() {
+ return "#<Element.Layout>";
+ }
+ });
+
+ Object.extend(Element.Layout, {
+ PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'),
+
+ COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'),
+
+ COMPUTATIONS: {
+ 'height': function(element) {
+ if (!this._preComputing) this._begin();
+
+ var bHeight = this.get('border-box-height');
+ if (bHeight <= 0) {
+ if (!this._preComputing) this._end();
+ return 0;
+ }
+
+ var bTop = this.get('border-top'),
+ bBottom = this.get('border-bottom');
+
+ var pTop = this.get('padding-top'),
+ pBottom = this.get('padding-bottom');
+
+ if (!this._preComputing) this._end();
+
+ return bHeight - bTop - bBottom - pTop - pBottom;
+ },
+
+ 'width': function(element) {
+ if (!this._preComputing) this._begin();
+
+ var bWidth = this.get('border-box-width');
+ if (bWidth <= 0) {
+ if (!this._preComputing) this._end();
+ return 0;
+ }
+
+ var bLeft = this.get('border-left'),
+ bRight = this.get('border-right');
+
+ var pLeft = this.get('padding-left'),
+ pRight = this.get('padding-right');
+
+ if (!this._preComputing) this._end();
+
+ return bWidth - bLeft - bRight - pLeft - pRight;
+ },
+
+ 'padding-box-height': function(element) {
+ var height = this.get('height'),
+ pTop = this.get('padding-top'),
+ pBottom = this.get('padding-bottom');
+
+ return height + pTop + pBottom;
+ },
+
+ 'padding-box-width': function(element) {
+ var width = this.get('width'),
+ pLeft = this.get('padding-left'),
+ pRight = this.get('padding-right');
+
+ return width + pLeft + pRight;
+ },
+
+ 'border-box-height': function(element) {
+ if (!this._preComputing) this._begin();
+ var height = element.offsetHeight;
+ if (!this._preComputing) this._end();
+ return height;
+ },
+
+ 'border-box-width': function(element) {
+ if (!this._preComputing) this._begin();
+ var width = element.offsetWidth;
+ if (!this._preComputing) this._end();
+ return width;
+ },
+
+ 'margin-box-height': function(element) {
+ var bHeight = this.get('border-box-height'),
+ mTop = this.get('margin-top'),
+ mBottom = this.get('margin-bottom');
+
+ if (bHeight <= 0) return 0;
+
+ return bHeight + mTop + mBottom;
+ },
+
+ 'margin-box-width': function(element) {
+ var bWidth = this.get('border-box-width'),
+ mLeft = this.get('margin-left'),
+ mRight = this.get('margin-right');
+
+ if (bWidth <= 0) return 0;
+
+ return bWidth + mLeft + mRight;
+ },
+
+ 'top': function(element) {
+ var offset = element.positionedOffset();
+ return offset.top;
+ },
+
+ 'bottom': function(element) {
+ var offset = element.positionedOffset(),
+ parent = element.getOffsetParent(),
+ pHeight = parent.measure('height');
+
+ var mHeight = this.get('border-box-height');
+
+ return pHeight - mHeight - offset.top;
+ },
+
+ 'left': function(element) {
+ var offset = element.positionedOffset();
+ return offset.left;
+ },
+
+ 'right': function(element) {
+ var offset = element.positionedOffset(),
+ parent = element.getOffsetParent(),
+ pWidth = parent.measure('width');
+
+ var mWidth = this.get('border-box-width');
+
+ return pWidth - mWidth - offset.left;
+ },
+
+ 'padding-top': function(element) {
+ return getPixelValue(element, 'paddingTop');
+ },
+
+ 'padding-bottom': function(element) {
+ return getPixelValue(element, 'paddingBottom');
+ },
+
+ 'padding-left': function(element) {
+ return getPixelValue(element, 'paddingLeft');
+ },
+
+ 'padding-right': function(element) {
+ return getPixelValue(element, 'paddingRight');
+ },
+
+ 'border-top': function(element) {
+ return getPixelValue(element, 'borderTopWidth');
+ },
+
+ 'border-bottom': function(element) {
+ return getPixelValue(element, 'borderBottomWidth');
+ },
+
+ 'border-left': function(element) {
+ return getPixelValue(element, 'borderLeftWidth');
+ },
+
+ 'border-right': function(element) {
+ return getPixelValue(element, 'borderRightWidth');
+ },
+
+ 'margin-top': function(element) {
+ return getPixelValue(element, 'marginTop');
+ },
+
+ 'margin-bottom': function(element) {
+ return getPixelValue(element, 'marginBottom');
+ },
+
+ 'margin-left': function(element) {
+ return getPixelValue(element, 'marginLeft');
+ },
+
+ 'margin-right': function(element) {
+ return getPixelValue(element, 'marginRight');
+ }
+ }
+ });
+
+ if ('getBoundingClientRect' in document.documentElement) {
+ Object.extend(Element.Layout.COMPUTATIONS, {
+ 'right': function(element) {
+ var parent = hasLayout(element.getOffsetParent());
+ var rect = element.getBoundingClientRect(),
+ pRect = parent.getBoundingClientRect();
+
+ return (pRect.right - rect.right).round();
+ },
+
+ 'bottom': function(element) {
+ var parent = hasLayout(element.getOffsetParent());
+ var rect = element.getBoundingClientRect(),
+ pRect = parent.getBoundingClientRect();
+
+ return (pRect.bottom - rect.bottom).round();
+ }
+ });
+ }
+
+ Element.Offset = Class.create({
+ initialize: function(left, top) {
+ this.left = left.round();
+ this.top = top.round();
+
+ this[0] = this.left;
+ this[1] = this.top;
+ },
+
+ relativeTo: function(offset) {
+ return new Element.Offset(
+ this.left - offset.left,
+ this.top - offset.top
+ );
+ },
+
+ inspect: function() {
+ return "#<Element.Offset left: #{left} top: #{top}>".interpolate(this);
+ },
+
+ toString: function() {
+ return "[#{left}, #{top}]".interpolate(this);
+ },
+
+ toArray: function() {
+ return [this.left, this.top];
+ }
+ });
+
+ function getLayout(element, preCompute) {
+ return new Element.Layout(element, preCompute);
+ }
+
+ function measure(element, property) {
+ return $(element).getLayout().get(property);
+ }
+
+ function getDimensions(element) {
+ element = $(element);
+ var display = Element.getStyle(element, 'display');
+
+ if (display && display !== 'none') {
+ return { width: element.offsetWidth, height: element.offsetHeight };
+ }
+
+ var style = element.style;
+ var originalStyles = {
+ visibility: style.visibility,
+ position: style.position,
+ display: style.display
+ };
+
+ var newStyles = {
+ visibility: 'hidden',
+ display: 'block'
+ };
+
+ if (originalStyles.position !== 'fixed')
+ newStyles.position = 'absolute';
+
+ Element.setStyle(element, newStyles);
+
+ var dimensions = {
+ width: element.offsetWidth,
+ height: element.offsetHeight
+ };
+
+ Element.setStyle(element, originalStyles);
+
+ return dimensions;
+ }
+
+ function getOffsetParent(element) {
+ element = $(element);
+
+ if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
+ return $(document.body);
+
+ var isInline = (Element.getStyle(element, 'display') === 'inline');
+ if (!isInline && element.offsetParent) return $(element.offsetParent);
+
+ while ((element = element.parentNode) && element !== document.body) {
+ if (Element.getStyle(element, 'position') !== 'static') {
+ return isHtml(element) ? $(document.body) : $(element);
+ }
+ }
+
+ return $(document.body);
+ }
+
+
+ function cumulativeOffset(element) {
+ element = $(element);
+ var valueT = 0, valueL = 0;
+ if (element.parentNode) {
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ element = element.offsetParent;
+ } while (element);
+ }
+ return new Element.Offset(valueL, valueT);
+ }
+
+ function positionedOffset(element) {
+ element = $(element);
+
+ var layout = element.getLayout();
+
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ element = element.offsetParent;
+ if (element) {
+ if (isBody(element)) break;
+ var p = Element.getStyle(element, 'position');
+ if (p !== 'static') break;
+ }
+ } while (element);
+
+ valueL -= layout.get('margin-top');
+ valueT -= layout.get('margin-left');
+
+ return new Element.Offset(valueL, valueT);
+ }
+
+ function cumulativeScrollOffset(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.scrollTop || 0;
+ valueL += element.scrollLeft || 0;
+ element = element.parentNode;
+ } while (element);
+ return new Element.Offset(valueL, valueT);
+ }
+
+ function viewportOffset(forElement) {
+ element = $(element);
+ var valueT = 0, valueL = 0, docBody = document.body;
+
+ var element = forElement;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ if (element.offsetParent == docBody &&
+ Element.getStyle(element, 'position') == 'absolute') break;
+ } while (element = element.offsetParent);
+
+ element = forElement;
+ do {
+ if (element != docBody) {
+ valueT -= element.scrollTop || 0;
+ valueL -= element.scrollLeft || 0;
+ }
+ } while (element = element.parentNode);
+ return new Element.Offset(valueL, valueT);
+ }
+
+ function absolutize(element) {
+ element = $(element);
+
+ if (Element.getStyle(element, 'position') === 'absolute') {
+ return element;
+ }
+
+ var offsetParent = getOffsetParent(element);
+ var eOffset = element.viewportOffset(),
+ pOffset = offsetParent.viewportOffset();
+
+ var offset = eOffset.relativeTo(pOffset);
+ var layout = element.getLayout();
+
+ element.store('prototype_absolutize_original_styles', {
+ left: element.getStyle('left'),
+ top: element.getStyle('top'),
+ width: element.getStyle('width'),
+ height: element.getStyle('height')
+ });
+
+ element.setStyle({
+ position: 'absolute',
+ top: offset.top + 'px',
+ left: offset.left + 'px',
+ width: layout.get('width') + 'px',
+ height: layout.get('height') + 'px'
+ });
+
+ return element;
+ }
+
+ function relativize(element) {
+ element = $(element);
+ if (Element.getStyle(element, 'position') === 'relative') {
+ return element;
+ }
+
+ var originalStyles =
+ element.retrieve('prototype_absolutize_original_styles');
+
+ if (originalStyles) element.setStyle(originalStyles);
+ return element;
+ }
+
+ if (Prototype.Browser.IE) {
+ getOffsetParent = getOffsetParent.wrap(
+ function(proceed, element) {
+ element = $(element);
+
+ if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
+ return $(document.body);
+
+ var position = element.getStyle('position');
+ if (position !== 'static') return proceed(element);
+
+ element.setStyle({ position: 'relative' });
+ var value = proceed(element);
+ element.setStyle({ position: position });
+ return value;
+ }
+ );
+
+ positionedOffset = positionedOffset.wrap(function(proceed, element) {
+ element = $(element);
+ if (!element.parentNode) return new Element.Offset(0, 0);
+ var position = element.getStyle('position');
+ if (position !== 'static') return proceed(element);
+
+ var offsetParent = element.getOffsetParent();
+ if (offsetParent && offsetParent.getStyle('position') === 'fixed')
+ hasLayout(offsetParent);
+
+ element.setStyle({ position: 'relative' });
+ var value = proceed(element);
+ element.setStyle({ position: position });
+ return value;
+ });
+ } else if (Prototype.Browser.Webkit) {
+ cumulativeOffset = function(element) {
+ element = $(element);
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ if (element.offsetParent == document.body)
+ if (Element.getStyle(element, 'position') == 'absolute') break;
+
+ element = element.offsetParent;
+ } while (element);
+
+ return new Element.Offset(valueL, valueT);
+ };
+ }
+
+
+ Element.addMethods({
+ getLayout: getLayout,
+ measure: measure,
+ getDimensions: getDimensions,
+ getOffsetParent: getOffsetParent,
+ cumulativeOffset: cumulativeOffset,
+ positionedOffset: positionedOffset,
+ cumulativeScrollOffset: cumulativeScrollOffset,
+ viewportOffset: viewportOffset,
+ absolutize: absolutize,
+ relativize: relativize
+ });
+
+ function isBody(element) {
+ return element.nodeName.toUpperCase() === 'BODY';
+ }
+
+ function isHtml(element) {
+ return element.nodeName.toUpperCase() === 'HTML';
+ }
+
+ function isDocument(element) {
+ return element.nodeType === Node.DOCUMENT_NODE;
+ }
+
+ function isDetached(element) {
+ return element !== document.body &&
+ !Element.descendantOf(element, document.body);
+ }
+
+ if ('getBoundingClientRect' in document.documentElement) {
+ Element.addMethods({
+ viewportOffset: function(element) {
+ element = $(element);
+ if (isDetached(element)) return new Element.Offset(0, 0);
+
+ var rect = element.getBoundingClientRect(),
+ docEl = document.documentElement;
+ return new Element.Offset(rect.left - docEl.clientLeft,
+ rect.top - docEl.clientTop);
+ }
+ });
+ }
+})();
+window.$$ = function() {
+ var expression = $A(arguments).join(', ');
+ return Prototype.Selector.select(expression, document);
+};
+
+Prototype.Selector = (function() {
+
+ function select() {
+ throw new Error('Method "Prototype.Selector.select" must be defined.');
+ }
+
+ function match() {
+ throw new Error('Method "Prototype.Selector.match" must be defined.');
+ }
+
+ function find(elements, expression, index) {
+ index = index || 0;
+ var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i;
+
+ for (i = 0; i < length; i++) {
+ if (match(elements[i], expression) && index == matchIndex++) {
+ return Element.extend(elements[i]);
+ }
+ }
+ }
+
+ function extendElements(elements) {
+ for (var i = 0, length = elements.length; i < length; i++) {
+ Element.extend(elements[i]);
+ }
+ return elements;
+ }
+
+
+ var K = Prototype.K;
+
+ return {
+ select: select,
+ match: match,
+ find: find,
+ extendElements: (Element.extend === K) ? K : extendElements,
+ extendElement: Element.extend
+ };
+})();
+Prototype._original_property = window.Sizzle;
+/*!
+ * Sizzle CSS Selector Engine - v1.0
+ * Copyright 2009, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+ done = 0,
+ toString = Object.prototype.toString,
+ hasDuplicate = false,
+ baseHasDuplicate = true;
+
+[0, 0].sort(function(){
+ baseHasDuplicate = false;
+ return 0;
+});
+
+var Sizzle = function(selector, context, results, seed) {
+ results = results || [];
+ var origContext = context = context || document;
+
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context),
+ soFar = selector;
+
+ while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
+ soFar = m[3];
+
+ parts.push( m[1] );
+
+ if ( m[2] ) {
+ extra = m[3];
+ break;
+ }
+ }
+
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+ set = posProcess( parts[0] + parts[1], context );
+ } else {
+ set = Expr.relative[ parts[0] ] ?
+ [ context ] :
+ Sizzle( parts.shift(), context );
+
+ while ( parts.length ) {
+ selector = parts.shift();
+
+ if ( Expr.relative[ selector ] )
+ selector += parts.shift();
+
+ set = posProcess( selector, set );
+ }
+ }
+ } else {
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+ var ret = Sizzle.find( parts.shift(), context, contextXML );
+ context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
+ }
+
+ if ( context ) {
+ var ret = seed ?
+ { expr: parts.pop(), set: makeArray(seed) } :
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+ set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
+
+ if ( parts.length > 0 ) {
+ checkSet = makeArray(set);
+ } else {
+ prune = false;
+ }
+
+ while ( parts.length ) {
+ var cur = parts.pop(), pop = cur;
+
+ if ( !Expr.relative[ cur ] ) {
+ cur = "";
+ } else {
+ pop = parts.pop();
+ }
+
+ if ( pop == null ) {
+ pop = context;
+ }
+
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
+ }
+ } else {
+ checkSet = parts = [];
+ }
+ }
+
+ if ( !checkSet ) {
+ checkSet = set;
+ }
+
+ if ( !checkSet ) {
+ throw "Syntax error, unrecognized expression: " + (cur || selector);
+ }
+
+ if ( toString.call(checkSet) === "[object Array]" ) {
+ if ( !prune ) {
+ results.push.apply( results, checkSet );
+ } else if ( context && context.nodeType === 1 ) {
+ for ( var i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
+ results.push( set[i] );
+ }
+ }
+ } else {
+ for ( var i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+ results.push( set[i] );
+ }
+ }
+ }
+ } else {
+ makeArray( checkSet, results );
+ }
+
+ if ( extra ) {
+ Sizzle( extra, origContext, results, seed );
+ Sizzle.uniqueSort( results );
+ }
+
+ return results;
+};
+
+Sizzle.uniqueSort = function(results){
+ if ( sortOrder ) {
+ hasDuplicate = baseHasDuplicate;
+ results.sort(sortOrder);
+
+ if ( hasDuplicate ) {
+ for ( var i = 1; i < results.length; i++ ) {
+ if ( results[i] === results[i-1] ) {
+ results.splice(i--, 1);
+ }
+ }
+ }
+ }
+
+ return results;
+};
+
+Sizzle.matches = function(expr, set){
+ return Sizzle(expr, null, null, set);
+};
+
+Sizzle.find = function(expr, context, isXML){
+ var set, match;
+
+ if ( !expr ) {
+ return [];
+ }
+
+ for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+ var type = Expr.order[i], match;
+
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+ var left = match[1];
+ match.splice(1,1);
+
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
+ match[1] = (match[1] || "").replace(/\\/g, "");
+ set = Expr.find[ type ]( match, context, isXML );
+ if ( set != null ) {
+ expr = expr.replace( Expr.match[ type ], "" );
+ break;
+ }
+ }
+ }
+ }
+
+ if ( !set ) {
+ set = context.getElementsByTagName("*");
+ }
+
+ return {set: set, expr: expr};
+};
+
+Sizzle.filter = function(expr, set, inplace, not){
+ var old = expr, result = [], curLoop = set, match, anyFound,
+ isXMLFilter = set && set[0] && isXML(set[0]);
+
+ while ( expr && set.length ) {
+ for ( var type in Expr.filter ) {
+ if ( (match = Expr.match[ type ].exec( expr )) != null ) {
+ var filter = Expr.filter[ type ], found, item;
+ anyFound = false;
+
+ if ( curLoop == result ) {
+ result = [];
+ }
+
+ if ( Expr.preFilter[ type ] ) {
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+ if ( !match ) {
+ anyFound = found = true;
+ } else if ( match === true ) {
+ continue;
+ }
+ }
+
+ if ( match ) {
+ for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+ if ( item ) {
+ found = filter( item, match, i, curLoop );
+ var pass = not ^ !!found;
+
+ if ( inplace && found != null ) {
+ if ( pass ) {
+ anyFound = true;
+ } else {
+ curLoop[i] = false;
+ }
+ } else if ( pass ) {
+ result.push( item );
+ anyFound = true;
+ }
+ }
+ }
+ }
+
+ if ( found !== undefined ) {
+ if ( !inplace ) {
+ curLoop = result;
+ }
+
+ expr = expr.replace( Expr.match[ type ], "" );
+
+ if ( !anyFound ) {
+ return [];
+ }
+
+ break;
+ }
+ }
+ }
+
+ if ( expr == old ) {
+ if ( anyFound == null ) {
+ throw "Syntax error, unrecognized expression: " + expr;
+ } else {
+ break;
+ }
+ }
+
+ old = expr;
+ }
+
+ return curLoop;
+};
+
+var Expr = Sizzle.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|)\s*\]/,
+ TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
+ CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
+ },
+ leftMatch: {},
+ attrMap: {
+ "class": "className",
+ "for": "htmlFor"
+ },
+ attrHandle: {
+ href: function(elem){
+ return elem.getAttribute("href");
+ }
+ },
+ relative: {
+ "+": function(checkSet, part, isXML){
+ var isPartStr = typeof part === "string",
+ isTag = isPartStr && !/\W/.test(part),
+ isPartStrNotTag = isPartStr && !isTag;
+
+ if ( isTag && !isXML ) {
+ part = part.toUpperCase();
+ }
+
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+ if ( (elem = checkSet[i]) ) {
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
+ elem || false :
+ elem === part;
+ }
+ }
+
+ if ( isPartStrNotTag ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ },
+ ">": function(checkSet, part, isXML){
+ var isPartStr = typeof part === "string";
+
+ if ( isPartStr && !/\W/.test(part) ) {
+ part = isXML ? part : part.toUpperCase();
+
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ var parent = elem.parentNode;
+ checkSet[i] = parent.nodeName === part ? parent : false;
+ }
+ }
+ } else {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ checkSet[i] = isPartStr ?
+ elem.parentNode :
+ elem.parentNode === part;
+ }
+ }
+
+ if ( isPartStr ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ }
+ },
+ "": function(checkSet, part, isXML){
+ var doneName = done++, checkFn = dirCheck;
+
+ if ( !/\W/.test(part) ) {
+ var nodeCheck = part = isXML ? part : part.toUpperCase();
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
+ },
+ "~": function(checkSet, part, isXML){
+ var doneName = done++, checkFn = dirCheck;
+
+ if ( typeof part === "string" && !/\W/.test(part) ) {
+ var nodeCheck = part = isXML ? part : part.toUpperCase();
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
+ }
+ },
+ find: {
+ ID: function(match, context, isXML){
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ return m ? [m] : [];
+ }
+ },
+ NAME: function(match, context, isXML){
+ if ( typeof context.getElementsByName !== "undefined" ) {
+ var ret = [], results = context.getElementsByName(match[1]);
+
+ for ( var i = 0, l = results.length; i < l; i++ ) {
+ if ( results[i].getAttribute("name") === match[1] ) {
+ ret.push( results[i] );
+ }
+ }
+
+ return ret.length === 0 ? null : ret;
+ }
+ },
+ TAG: function(match, context){
+ return context.getElementsByTagName(match[1]);
+ }
+ },
+ preFilter: {
+ CLASS: function(match, curLoop, inplace, result, not, isXML){
+ match = " " + match[1].replace(/\\/g, "") + " ";
+
+ if ( isXML ) {
+ return match;
+ }
+
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+ if ( elem ) {
+ if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
+ if ( !inplace )
+ result.push( elem );
+ } else if ( inplace ) {
+ curLoop[i] = false;
+ }
+ }
+ }
+
+ return false;
+ },
+ ID: function(match){
+ return match[1].replace(/\\/g, "");
+ },
+ TAG: function(match, curLoop){
+ for ( var i = 0; curLoop[i] === false; i++ ){}
+ return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
+ },
+ CHILD: function(match){
+ if ( match[1] == "nth" ) {
+ var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+ match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+ match[2] = (test[1] + (test[2] || 1)) - 0;
+ match[3] = test[3] - 0;
+ }
+
+ match[0] = done++;
+
+ return match;
+ },
+ ATTR: function(match, curLoop, inplace, result, not, isXML){
+ var name = match[1].replace(/\\/g, "");
+
+ if ( !isXML && Expr.attrMap[name] ) {
+ match[1] = Expr.attrMap[name];
+ }
+
+ if ( match[2] === "~=" ) {
+ match[4] = " " + match[4] + " ";
+ }
+
+ return match;
+ },
+ PSEUDO: function(match, curLoop, inplace, result, not){
+ if ( match[1] === "not" ) {
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+ match[3] = Sizzle(match[3], null, null, curLoop);
+ } else {
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+ if ( !inplace ) {
+ result.push.apply( result, ret );
+ }
+ return false;
+ }
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+ return true;
+ }
+
+ return match;
+ },
+ POS: function(match){
+ match.unshift( true );
+ return match;
+ }
+ },
+ filters: {
+ enabled: function(elem){
+ return elem.disabled === false && elem.type !== "hidden";
+ },
+ disabled: function(elem){
+ return elem.disabled === true;
+ },
+ checked: function(elem){
+ return elem.checked === true;
+ },
+ selected: function(elem){
+ elem.parentNode.selectedIndex;
+ return elem.selected === true;
+ },
+ parent: function(elem){
+ return !!elem.firstChild;
+ },
+ empty: function(elem){
+ return !elem.firstChild;
+ },
+ has: function(elem, i, match){
+ return !!Sizzle( match[3], elem ).length;
+ },
+ header: function(elem){
+ return /h\d/i.test( elem.nodeName );
+ },
+ text: function(elem){
+ return "text" === elem.type;
+ },
+ radio: function(elem){
+ return "radio" === elem.type;
+ },
+ checkbox: function(elem){
+ return "checkbox" === elem.type;
+ },
+ file: function(elem){
+ return "file" === elem.type;
+ },
+ password: function(elem){
+ return "password" === elem.type;
+ },
+ submit: function(elem){
+ return "submit" === elem.type;
+ },
+ image: function(elem){
+ return "image" === elem.type;
+ },
+ reset: function(elem){
+ return "reset" === elem.type;
+ },
+ button: function(elem){
+ return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
+ },
+ input: function(elem){
+ return /input|select|textarea|button/i.test(elem.nodeName);
+ }
+ },
+ setFilters: {
+ first: function(elem, i){
+ return i === 0;
+ },
+ last: function(elem, i, match, array){
+ return i === array.length - 1;
+ },
+ even: function(elem, i){
+ return i % 2 === 0;
+ },
+ odd: function(elem, i){
+ return i % 2 === 1;
+ },
+ lt: function(elem, i, match){
+ return i < match[3] - 0;
+ },
+ gt: function(elem, i, match){
+ return i > match[3] - 0;
+ },
+ nth: function(elem, i, match){
+ return match[3] - 0 == i;
+ },
+ eq: function(elem, i, match){
+ return match[3] - 0 == i;
+ }
+ },
+ filter: {
+ PSEUDO: function(elem, match, i, array){
+ var name = match[1], filter = Expr.filters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ } else if ( name === "contains" ) {
+ return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
+ } else if ( name === "not" ) {
+ var not = match[3];
+
+ for ( var i = 0, l = not.length; i < l; i++ ) {
+ if ( not[i] === elem ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ },
+ CHILD: function(elem, match){
+ var type = match[1], node = elem;
+ switch (type) {
+ case 'only':
+ case 'first':
+ while ( (node = node.previousSibling) ) {
+ if ( node.nodeType === 1 ) return false;
+ }
+ if ( type == 'first') return true;
+ node = elem;
+ case 'last':
+ while ( (node = node.nextSibling) ) {
+ if ( node.nodeType === 1 ) return false;
+ }
+ return true;
+ case 'nth':
+ var first = match[2], last = match[3];
+
+ if ( first == 1 && last == 0 ) {
+ return true;
+ }
+
+ var doneName = match[0],
+ parent = elem.parentNode;
+
+ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+ var count = 0;
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
+ if ( node.nodeType === 1 ) {
+ node.nodeIndex = ++count;
+ }
+ }
+ parent.sizcache = doneName;
+ }
+
+ var diff = elem.nodeIndex - last;
+ if ( first == 0 ) {
+ return diff == 0;
+ } else {
+ return ( diff % first == 0 && diff / first >= 0 );
+ }
+ }
+ },
+ ID: function(elem, match){
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
+ },
+ TAG: function(elem, match){
+ return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
+ },
+ CLASS: function(elem, match){
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
+ .indexOf( match ) > -1;
+ },
+ ATTR: function(elem, match){
+ var name = match[1],
+ result = Expr.attrHandle[ name ] ?
+ Expr.attrHandle[ name ]( elem ) :
+ elem[ name ] != null ?
+ elem[ name ] :
+ elem.getAttribute( name ),
+ value = result + "",
+ type = match[2],
+ check = match[4];
+
+ return result == null ?
+ type === "!=" :
+ type === "=" ?
+ value === check :
+ type === "*=" ?
+ value.indexOf(check) >= 0 :
+ type === "~=" ?
+ (" " + value + " ").indexOf(check) >= 0 :
+ !check ?
+ value && result !== false :
+ type === "!=" ?
+ value != check :
+ type === "^=" ?
+ value.indexOf(check) === 0 :
+ type === "$=" ?
+ value.substr(value.length - check.length) === check :
+ type === "|=" ?
+ value === check || value.substr(0, check.length + 1) === check + "-" :
+ false;
+ },
+ POS: function(elem, match, i, array){
+ var name = match[2], filter = Expr.setFilters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ }
+ }
+ }
+};
+
+var origPOS = Expr.match.POS;
+
+for ( var type in Expr.match ) {
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source );
+}
+
+var makeArray = function(array, results) {
+ array = Array.prototype.slice.call( array, 0 );
+
+ if ( results ) {
+ results.push.apply( results, array );
+ return results;
+ }
+
+ return array;
+};
+
+try {
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 );
+
+} catch(e){
+ makeArray = function(array, results) {
+ var ret = results || [];
+
+ if ( toString.call(array) === "[object Array]" ) {
+ Array.prototype.push.apply( ret, array );
+ } else {
+ if ( typeof array.length === "number" ) {
+ for ( var i = 0, l = array.length; i < l; i++ ) {
+ ret.push( array[i] );
+ }
+ } else {
+ for ( var i = 0; array[i]; i++ ) {
+ ret.push( array[i] );
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var sortOrder;
+
+if ( document.documentElement.compareDocumentPosition ) {
+ sortOrder = function( a, b ) {
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+ if ( a == b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ }
+
+ var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
+ if ( ret === 0 ) {
+ hasDuplicate = true;
+ }
+ return ret;
+ };
+} else if ( "sourceIndex" in document.documentElement ) {
+ sortOrder = function( a, b ) {
+ if ( !a.sourceIndex || !b.sourceIndex ) {
+ if ( a == b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ }
+
+ var ret = a.sourceIndex - b.sourceIndex;
+ if ( ret === 0 ) {
+ hasDuplicate = true;
+ }
+ return ret;
+ };
+} else if ( document.createRange ) {
+ sortOrder = function( a, b ) {
+ if ( !a.ownerDocument || !b.ownerDocument ) {
+ if ( a == b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ }
+
+ var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
+ aRange.setStart(a, 0);
+ aRange.setEnd(a, 0);
+ bRange.setStart(b, 0);
+ bRange.setEnd(b, 0);
+ var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
+ if ( ret === 0 ) {
+ hasDuplicate = true;
+ }
+ return ret;
+ };
+}
+
+(function(){
+ var form = document.createElement("div"),
+ id = "script" + (new Date).getTime();
+ form.innerHTML = "<a name='" + id + "'/>";
+
+ var root = document.documentElement;
+ root.insertBefore( form, root.firstChild );
+
+ if ( !!document.getElementById( id ) ) {
+ Expr.find.ID = function(match, context, isXML){
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
+ }
+ };
+
+ Expr.filter.ID = function(elem, match){
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+ return elem.nodeType === 1 && node && node.nodeValue === match;
+ };
+ }
+
+ root.removeChild( form );
+ root = form = null; // release memory in IE
+})();
+
+(function(){
+
+ var div = document.createElement("div");
+ div.appendChild( document.createComment("") );
+
+ if ( div.getElementsByTagName("*").length > 0 ) {
+ Expr.find.TAG = function(match, context){
+ var results = context.getElementsByTagName(match[1]);
+
+ if ( match[1] === "*" ) {
+ var tmp = [];
+
+ for ( var i = 0; results[i]; i++ ) {
+ if ( results[i].nodeType === 1 ) {
+ tmp.push( results[i] );
+ }
+ }
+
+ results = tmp;
+ }
+
+ return results;
+ };
+ }
+
+ div.innerHTML = "<a href='#'></a>";
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+ div.firstChild.getAttribute("href") !== "#" ) {
+ Expr.attrHandle.href = function(elem){
+ return elem.getAttribute("href", 2);
+ };
+ }
+
+ div = null; // release memory in IE
+})();
+
+if ( document.querySelectorAll ) (function(){
+ var oldSizzle = Sizzle, div = document.createElement("div");
+ div.innerHTML = "<p class='TEST'></p>";
+
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+ return;
+ }
+
+ Sizzle = function(query, context, extra, seed){
+ context = context || document;
+
+ if ( !seed && context.nodeType === 9 && !isXML(context) ) {
+ try {
+ return makeArray( context.querySelectorAll(query), extra );
+ } catch(e){}
+ }
+
+ return oldSizzle(query, context, extra, seed);
+ };
+
+ for ( var prop in oldSizzle ) {
+ Sizzle[ prop ] = oldSizzle[ prop ];
+ }
+
+ div = null; // release memory in IE
+})();
+
+if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
+ var div = document.createElement("div");
+ div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+ if ( div.getElementsByClassName("e").length === 0 )
+ return;
+
+ div.lastChild.className = "e";
+
+ if ( div.getElementsByClassName("e").length === 1 )
+ return;
+
+ Expr.order.splice(1, 0, "CLASS");
+ Expr.find.CLASS = function(match, context, isXML) {
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+ return context.getElementsByClassName(match[1]);
+ }
+ };
+
+ div = null; // release memory in IE
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ var sibDir = dir == "previousSibling" && !isXML;
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ if ( sibDir && elem.nodeType === 1 ){
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+ elem = elem[dir];
+ var match = false;
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 && !isXML ){
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+
+ if ( elem.nodeName === cur ) {
+ match = elem;
+ break;
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ var sibDir = dir == "previousSibling" && !isXML;
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ if ( sibDir && elem.nodeType === 1 ) {
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+ elem = elem[dir];
+ var match = false;
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 ) {
+ if ( !isXML ) {
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+ if ( typeof cur !== "string" ) {
+ if ( elem === cur ) {
+ match = true;
+ break;
+ }
+
+ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+ match = elem;
+ break;
+ }
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+var contains = document.compareDocumentPosition ? function(a, b){
+ return a.compareDocumentPosition(b) & 16;
+} : function(a, b){
+ return a !== b && (a.contains ? a.contains(b) : true);
+};
+
+var isXML = function(elem){
+ return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
+ !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";
+};
+
+var posProcess = function(selector, context){
+ var tmpSet = [], later = "", match,
+ root = context.nodeType ? [context] : context;
+
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+ later += match[0];
+ selector = selector.replace( Expr.match.PSEUDO, "" );
+ }
+
+ selector = Expr.relative[selector] ? selector + "*" : selector;
+
+ for ( var i = 0, l = root.length; i < l; i++ ) {
+ Sizzle( selector, root[i], tmpSet );
+ }
+
+ return Sizzle.filter( later, tmpSet );
+};
+
+
+window.Sizzle = Sizzle;
+
+})();
+
+;(function(engine) {
+ var extendElements = Prototype.Selector.extendElements;
+
+ function select(selector, scope) {
+ return extendElements(engine(selector, scope || document));
+ }
+
+ function match(element, selector) {
+ return engine.matches(selector, [element]).length == 1;
+ }
+
+ Prototype.Selector.engine = engine;
+ Prototype.Selector.select = select;
+ Prototype.Selector.match = match;
+})(Sizzle);
+
+window.Sizzle = Prototype._original_property;
+delete Prototype._original_property;
+
+var Form = {
+ reset: function(form) {
+ form = $(form);
+ form.reset();
+ return form;
+ },
+
+ serializeElements: function(elements, options) {
+ if (typeof options != 'object') options = { hash: !!options };
+ else if (Object.isUndefined(options.hash)) options.hash = true;
+ var key, value, submitted = false, submit = options.submit, accumulator, initial;
+
+ if (options.hash) {
+ initial = {};
+ accumulator = function(result, key, value) {
+ if (key in result) {
+ if (!Object.isArray(result[key])) result[key] = [result[key]];
+ result[key].push(value);
+ } else result[key] = value;
+ return result;
+ };
+ } else {
+ initial = '';
+ accumulator = function(result, key, value) {
+ return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value);
+ };
+ }
+
+ return elements.inject(initial, function(result, element) {
+ if (!element.disabled && element.name) {
+ key = element.name; value = $(element).getValue();
+ if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
+ submit !== false && (!submit || key == submit) && (submitted = true)))) {
+ result = accumulator(result, key, value);
+ }
+ }
+ return result;
+ });
+ }
+};
+
+Form.Methods = {
+ serialize: function(form, options) {
+ return Form.serializeElements(Form.getElements(form), options);
+ },
+
+ getElements: function(form) {
+ var elements = $(form).getElementsByTagName('*'),
+ element,
+ arr = [ ],
+ serializers = Form.Element.Serializers;
+ for (var i = 0; element = elements[i]; i++) {
+ arr.push(element);
+ }
+ return arr.inject([], function(elements, child) {
+ if (serializers[child.tagName.toLowerCase()])
+ elements.push(Element.extend(child));
+ return elements;
+ });
+ },
+
+ getInputs: function(form, typeName, name) {
+ form = $(form);
+ var inputs = form.getElementsByTagName('input');
+
+ if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+ for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+ var input = inputs[i];
+ if ((typeName && input.type != typeName) || (name && input.name != name))
+ continue;
+ matchingInputs.push(Element.extend(input));
+ }
+
+ return matchingInputs;
+ },
+
+ disable: function(form) {
+ form = $(form);
+ Form.getElements(form).invoke('disable');
+ return form;
+ },
+
+ enable: function(form) {
+ form = $(form);
+ Form.getElements(form).invoke('enable');
+ return form;
+ },
+
+ findFirstElement: function(form) {
+ var elements = $(form).getElements().findAll(function(element) {
+ return 'hidden' != element.type && !element.disabled;
+ });
+ var firstByIndex = elements.findAll(function(element) {
+ return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
+ }).sortBy(function(element) { return element.tabIndex; }).first();
+
+ return firstByIndex ? firstByIndex : elements.find(function(element) {
+ return /^(?:input|select|textarea)$/i.test(element.tagName);
+ });
+ },
+
+ focusFirstElement: function(form) {
+ form = $(form);
+ var element = form.findFirstElement();
+ if (element) element.activate();
+ return form;
+ },
+
+ request: function(form, options) {
+ form = $(form), options = Object.clone(options || { });
+
+ var params = options.parameters, action = form.readAttribute('action') || '';
+ if (action.blank()) action = window.location.href;
+ options.parameters = form.serialize(true);
+
+ if (params) {
+ if (Object.isString(params)) params = params.toQueryParams();
+ Object.extend(options.parameters, params);
+ }
+
+ if (form.hasAttribute('method') && !options.method)
+ options.method = form.method;
+
+ return new Ajax.Request(action, options);
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+
+Form.Element = {
+ focus: function(element) {
+ $(element).focus();
+ return element;
+ },
+
+ select: function(element) {
+ $(element).select();
+ return element;
+ }
+};
+
+Form.Element.Methods = {
+
+ serialize: function(element) {
+ element = $(element);
+ if (!element.disabled && element.name) {
+ var value = element.getValue();
+ if (value != undefined) {
+ var pair = { };
+ pair[element.name] = value;
+ return Object.toQueryString(pair);
+ }
+ }
+ return '';
+ },
+
+ getValue: function(element) {
+ element = $(element);
+ var method = element.tagName.toLowerCase();
+ return Form.Element.Serializers[method](element);
+ },
+
+ setValue: function(element, value) {
+ element = $(element);
+ var method = element.tagName.toLowerCase();
+ Form.Element.Serializers[method](element, value);
+ return element;
+ },
+
+ clear: function(element) {
+ $(element).value = '';
+ return element;
+ },
+
+ present: function(element) {
+ return $(element).value != '';
+ },
+
+ activate: function(element) {
+ element = $(element);
+ try {
+ element.focus();
+ if (element.select && (element.tagName.toLowerCase() != 'input' ||
+ !(/^(?:button|reset|submit)$/i.test(element.type))))
+ element.select();
+ } catch (e) { }
+ return element;
+ },
+
+ disable: function(element) {
+ element = $(element);
+ element.disabled = true;
+ return element;
+ },
+
+ enable: function(element) {
+ element = $(element);
+ element.disabled = false;
+ return element;
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Field = Form.Element;
+
+var $F = Form.Element.Methods.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = (function() {
+ function input(element, value) {
+ switch (element.type.toLowerCase()) {
+ case 'checkbox':
+ case 'radio':
+ return inputSelector(element, value);
+ default:
+ return valueSelector(element, value);
+ }
+ }
+
+ function inputSelector(element, value) {
+ if (Object.isUndefined(value))
+ return element.checked ? element.value : null;
+ else element.checked = !!value;
+ }
+
+ function valueSelector(element, value) {
+ if (Object.isUndefined(value)) return element.value;
+ else element.value = value;
+ }
+
+ function select(element, value) {
+ if (Object.isUndefined(value))
+ return (element.type === 'select-one' ? selectOne : selectMany)(element);
+
+ var opt, currentValue, single = !Object.isArray(value);
+ for (var i = 0, length = element.length; i < length; i++) {
+ opt = element.options[i];
+ currentValue = this.optionValue(opt);
+ if (single) {
+ if (currentValue == value) {
+ opt.selected = true;
+ return;
+ }
+ }
+ else opt.selected = value.include(currentValue);
+ }
+ }
+
+ function selectOne(element) {
+ var index = element.selectedIndex;
+ return index >= 0 ? optionValue(element.options[index]) : null;
+ }
+
+ function selectMany(element) {
+ var values, length = element.length;
+ if (!length) return null;
+
+ for (var i = 0, values = []; i < length; i++) {
+ var opt = element.options[i];
+ if (opt.selected) values.push(optionValue(opt));
+ }
+ return values;
+ }
+
+ function optionValue(opt) {
+ return Element.hasAttribute(opt, 'value') ? opt.value : opt.text;
+ }
+
+ return {
+ input: input,
+ inputSelector: inputSelector,
+ textarea: valueSelector,
+ select: select,
+ selectOne: selectOne,
+ selectMany: selectMany,
+ optionValue: optionValue,
+ button: valueSelector
+ };
+})();
+
+/*--------------------------------------------------------------------------*/
+
+
+Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
+ initialize: function($super, element, frequency, callback) {
+ $super(callback, frequency);
+ this.element = $(element);
+ this.lastValue = this.getValue();
+ },
+
+ execute: function() {
+ var value = this.getValue();
+ if (Object.isString(this.lastValue) && Object.isString(value) ?
+ this.lastValue != value : String(this.lastValue) != String(value)) {
+ this.callback(this.element, value);
+ this.lastValue = value;
+ }
+ }
+});
+
+Form.Element.Observer = Class.create(Abstract.TimedObserver, {
+ getValue: function() {
+ return Form.Element.getValue(this.element);
+ }
+});
+
+Form.Observer = Class.create(Abstract.TimedObserver, {
+ getValue: function() {
+ return Form.serialize(this.element);
+ }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = Class.create({
+ initialize: function(element, callback) {
+ this.element = $(element);
+ this.callback = callback;
+
+ this.lastValue = this.getValue();
+ if (this.element.tagName.toLowerCase() == 'form')
+ this.registerFormCallbacks();
+ else
+ this.registerCallback(this.element);
+ },
+
+ onElementEvent: function() {
+ var value = this.getValue();
+ if (this.lastValue != value) {
+ this.callback(this.element, value);
+ this.lastValue = value;
+ }
+ },
+
+ registerFormCallbacks: function() {
+ Form.getElements(this.element).each(this.registerCallback, this);
+ },
+
+ registerCallback: function(element) {
+ if (element.type) {
+ switch (element.type.toLowerCase()) {
+ case 'checkbox':
+ case 'radio':
+ Event.observe(element, 'click', this.onElementEvent.bind(this));
+ break;
+ default:
+ Event.observe(element, 'change', this.onElementEvent.bind(this));
+ break;
+ }
+ }
+ }
+});
+
+Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
+ getValue: function() {
+ return Form.Element.getValue(this.element);
+ }
+});
+
+Form.EventObserver = Class.create(Abstract.EventObserver, {
+ getValue: function() {
+ return Form.serialize(this.element);
+ }
+});
+(function() {
+
+ var Event = {
+ KEY_BACKSPACE: 8,
+ KEY_TAB: 9,
+ KEY_RETURN: 13,
+ KEY_ESC: 27,
+ KEY_LEFT: 37,
+ KEY_UP: 38,
+ KEY_RIGHT: 39,
+ KEY_DOWN: 40,
+ KEY_DELETE: 46,
+ KEY_HOME: 36,
+ KEY_END: 35,
+ KEY_PAGEUP: 33,
+ KEY_PAGEDOWN: 34,
+ KEY_INSERT: 45,
+
+ cache: {}
+ };
+
+ var docEl = document.documentElement;
+ var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl
+ && 'onmouseleave' in docEl;
+
+
+
+ var isIELegacyEvent = function(event) { return false; };
+
+ if (window.attachEvent) {
+ if (window.addEventListener) {
+ isIELegacyEvent = function(event) {
+ return !(event instanceof window.Event);
+ };
+ } else {
+ isIELegacyEvent = function(event) { return true; };
+ }
+ }
+
+ var _isButton;
+
+ function _isButtonForDOMEvents(event, code) {
+ return event.which ? (event.which === code + 1) : (event.button === code);
+ }
+
+ var legacyButtonMap = { 0: 1, 1: 4, 2: 2 };
+ function _isButtonForLegacyEvents(event, code) {
+ return event.button === legacyButtonMap[code];
+ }
+
+ function _isButtonForWebKit(event, code) {
+ switch (code) {
+ case 0: return event.which == 1 && !event.metaKey;
+ case 1: return event.which == 2 || (event.which == 1 && event.metaKey);
+ case 2: return event.which == 3;
+ default: return false;
+ }
+ }
+
+ if (window.attachEvent) {
+ if (!window.addEventListener) {
+ _isButton = _isButtonForLegacyEvents;
+ } else {
+ _isButton = function(event, code) {
+ return isIELegacyEvent(event) ? _isButtonForLegacyEvents(event, code) :
+ _isButtonForDOMEvents(event, code);
+ };
+ }
+ } else if (Prototype.Browser.WebKit) {
+ _isButton = _isButtonForWebKit;
+ } else {
+ _isButton = _isButtonForDOMEvents;
+ }
+
+ function isLeftClick(event) { return _isButton(event, 0); }
+
+ function isMiddleClick(event) { return _isButton(event, 1); }
+
+ function isRightClick(event) { return _isButton(event, 2); }
+
+ function element(event) {
+ event = Event.extend(event);
+
+ var node = event.target, type = event.type,
+ currentTarget = event.currentTarget;
+
+ if (currentTarget && currentTarget.tagName) {
+ if (type === 'load' || type === 'error' ||
+ (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
+ && currentTarget.type === 'radio'))
+ node = currentTarget;
+ }
+
+ if (node.nodeType == Node.TEXT_NODE)
+ node = node.parentNode;
+
+ return Element.extend(node);
+ }
+
+ function findElement(event, expression) {
+ var element = Event.element(event);
+
+ if (!expression) return element;
+ while (element) {
+ if (Object.isElement(element) && Prototype.Selector.match(element, expression)) {
+ return Element.extend(element);
+ }
+ element = element.parentNode;
+ }
+ }
+
+ function pointer(event) {
+ return { x: pointerX(event), y: pointerY(event) };
+ }
+
+ function pointerX(event) {
+ var docElement = document.documentElement,
+ body = document.body || { scrollLeft: 0 };
+
+ return event.pageX || (event.clientX +
+ (docElement.scrollLeft || body.scrollLeft) -
+ (docElement.clientLeft || 0));
+ }
+
+ function pointerY(event) {
+ var docElement = document.documentElement,
+ body = document.body || { scrollTop: 0 };
+
+ return event.pageY || (event.clientY +
+ (docElement.scrollTop || body.scrollTop) -
+ (docElement.clientTop || 0));
+ }
+
+ function stop(event) {
+ Event.extend(event);
+ event.preventDefault();
+ event.stopPropagation();
+
+ event.stopped = true;
+ }
+
+ Event.Methods = {
+ isLeftClick: isLeftClick,
+ isMiddleClick: isMiddleClick,
+ isRightClick: isRightClick,
+
+ element: element,
+ findElement: findElement,
+
+ pointer: pointer,
+ pointerX: pointerX,
+ pointerY: pointerY,
+
+ stop: stop
+ };
+
+ var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
+ m[name] = Event.Methods[name].methodize();
+ return m;
+ });
+
+ if (window.attachEvent) {
+ function _relatedTarget(event) {
+ var element;
+ switch (event.type) {
+ case 'mouseover':
+ case 'mouseenter':
+ element = event.fromElement;
+ break;
+ case 'mouseout':
+ case 'mouseleave':
+ element = event.toElement;
+ break;
+ default:
+ return null;
+ }
+ return Element.extend(element);
+ }
+
+ var additionalMethods = {
+ stopPropagation: function() { this.cancelBubble = true; },
+ preventDefault: function() { this.returnValue = false; },
+ inspect: function() { return '[object Event]'; }
+ };
+
+ Event.extend = function(event, element) {
+ if (!event) return false;
+
+ if (!isIELegacyEvent(event)) return event;
+
+ if (event._extendedByPrototype) return event;
+ event._extendedByPrototype = Prototype.emptyFunction;
+
+ var pointer = Event.pointer(event);
+
+ Object.extend(event, {
+ target: event.srcElement || element,
+ relatedTarget: _relatedTarget(event),
+ pageX: pointer.x,
+ pageY: pointer.y
+ });
+
+ Object.extend(event, methods);
+ Object.extend(event, additionalMethods);
+
+ return event;
+ };
+ } else {
+ Event.extend = Prototype.K;
+ }
+
+ if (window.addEventListener) {
+ Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__;
+ Object.extend(Event.prototype, methods);
+ }
+
+ function _createResponder(element, eventName, handler) {
+ var registry = Element.retrieve(element, 'prototype_event_registry');
+
+ if (Object.isUndefined(registry)) {
+ CACHE.push(element);
+ registry = Element.retrieve(element, 'prototype_event_registry', $H());
+ }
+
+ var respondersForEvent = registry.get(eventName);
+ if (Object.isUndefined(respondersForEvent)) {
+ respondersForEvent = [];
+ registry.set(eventName, respondersForEvent);
+ }
+
+ if (respondersForEvent.pluck('handler').include(handler)) return false;
+
+ var responder;
+ if (eventName.include(":")) {
+ responder = function(event) {
+ if (Object.isUndefined(event.eventName))
+ return false;
+
+ if (event.eventName !== eventName)
+ return false;
+
+ Event.extend(event, element);
+ handler.call(element, event);
+ };
+ } else {
+ if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED &&
+ (eventName === "mouseenter" || eventName === "mouseleave")) {
+ if (eventName === "mouseenter" || eventName === "mouseleave") {
+ responder = function(event) {
+ Event.extend(event, element);
+
+ var parent = event.relatedTarget;
+ while (parent && parent !== element) {
+ try { parent = parent.parentNode; }
+ catch(e) { parent = element; }
+ }
+
+ if (parent === element) return;
+
+ handler.call(element, event);
+ };
+ }
+ } else {
+ responder = function(event) {
+ Event.extend(event, element);
+ handler.call(element, event);
+ };
+ }
+ }
+
+ responder.handler = handler;
+ respondersForEvent.push(responder);
+ return responder;
+ }
+
+ function _destroyCache() {
+ for (var i = 0, length = CACHE.length; i < length; i++) {
+ Event.stopObserving(CACHE[i]);
+ CACHE[i] = null;
+ }
+ }
+
+ var CACHE = [];
+
+ if (Prototype.Browser.IE)
+ window.attachEvent('onunload', _destroyCache);
+
+ if (Prototype.Browser.WebKit)
+ window.addEventListener('unload', Prototype.emptyFunction, false);
+
+
+ var _getDOMEventName = Prototype.K,
+ translations = { mouseenter: "mouseover", mouseleave: "mouseout" };
+
+ if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) {
+ _getDOMEventName = function(eventName) {
+ return (translations[eventName] || eventName);
+ };
+ }
+
+ function observe(element, eventName, handler) {
+ element = $(element);
+
+ var responder = _createResponder(element, eventName, handler);
+
+ if (!responder) return element;
+
+ if (eventName.include(':')) {
+ if (element.addEventListener)
+ element.addEventListener("dataavailable", responder, false);
+ else {
+ element.attachEvent("ondataavailable", responder);
+ element.attachEvent("onlosecapture", responder);
+ }
+ } else {
+ var actualEventName = _getDOMEventName(eventName);
+
+ if (element.addEventListener)
+ element.addEventListener(actualEventName, responder, false);
+ else
+ element.attachEvent("on" + actualEventName, responder);
+ }
+
+ return element;
+ }
+
+ function stopObserving(element, eventName, handler) {
+ element = $(element);
+
+ var registry = Element.retrieve(element, 'prototype_event_registry');
+ if (!registry) return element;
+
+ if (!eventName) {
+ registry.each( function(pair) {
+ var eventName = pair.key;
+ stopObserving(element, eventName);
+ });
+ return element;
+ }
+
+ var responders = registry.get(eventName);
+ if (!responders) return element;
+
+ if (!handler) {
+ responders.each(function(r) {
+ stopObserving(element, eventName, r.handler);
+ });
+ return element;
+ }
+
+ var i = responders.length, responder;
+ while (i--) {
+ if (responders[i].handler === handler) {
+ responder = responders[i];
+ break;
+ }
+ }
+ if (!responder) return element;
+
+ if (eventName.include(':')) {
+ if (element.removeEventListener)
+ element.removeEventListener("dataavailable", responder, false);
+ else {
+ element.detachEvent("ondataavailable", responder);
+ element.detachEvent("onlosecapture", responder);
+ }
+ } else {
+ var actualEventName = _getDOMEventName(eventName);
+ if (element.removeEventListener)
+ element.removeEventListener(actualEventName, responder, false);
+ else
+ element.detachEvent('on' + actualEventName, responder);
+ }
+
+ registry.set(eventName, responders.without(responder));
+
+ return element;
+ }
+
+ function fire(element, eventName, memo, bubble) {
+ element = $(element);
+
+ if (Object.isUndefined(bubble))
+ bubble = true;
+
+ if (element == document && document.createEvent && !element.dispatchEvent)
+ element = document.documentElement;
+
+ var event;
+ if (document.createEvent) {
+ event = document.createEvent('HTMLEvents');
+ event.initEvent('dataavailable', bubble, true);
+ } else {
+ event = document.createEventObject();
+ event.eventType = bubble ? 'ondataavailable' : 'onlosecapture';
+ }
+
+ event.eventName = eventName;
+ event.memo = memo || { };
+
+ if (document.createEvent)
+ element.dispatchEvent(event);
+ else
+ element.fireEvent(event.eventType, event);
+
+ return Event.extend(event);
+ }
+
+ Event.Handler = Class.create({
+ initialize: function(element, eventName, selector, callback) {
+ this.element = $(element);
+ this.eventName = eventName;
+ this.selector = selector;
+ this.callback = callback;
+ this.handler = this.handleEvent.bind(this);
+ },
+
+ start: function() {
+ Event.observe(this.element, this.eventName, this.handler);
+ return this;
+ },
+
+ stop: function() {
+ Event.stopObserving(this.element, this.eventName, this.handler);
+ return this;
+ },
+
+ handleEvent: function(event) {
+ var element = Event.findElement(event, this.selector);
+ if (element) this.callback.call(this.element, event, element);
+ }
+ });
+
+ function on(element, eventName, selector, callback) {
+ element = $(element);
+ if (Object.isFunction(selector) && Object.isUndefined(callback)) {
+ callback = selector, selector = null;
+ }
+
+ return new Event.Handler(element, eventName, selector, callback).start();
+ }
+
+ Object.extend(Event, Event.Methods);
+
+ Object.extend(Event, {
+ fire: fire,
+ observe: observe,
+ stopObserving: stopObserving,
+ on: on
+ });
+
+ Element.addMethods({
+ fire: fire,
+
+ observe: observe,
+
+ stopObserving: stopObserving,
+
+ on: on
+ });
+
+ Object.extend(document, {
+ fire: fire.methodize(),
+
+ observe: observe.methodize(),
+
+ stopObserving: stopObserving.methodize(),
+
+ on: on.methodize(),
+
+ loaded: false
+ });
+
+ if (window.Event) Object.extend(window.Event, Event);
+ else window.Event = Event;
+})();
+
+(function() {
+ /* Support for the DOMContentLoaded event is based on work by Dan Webb,
+ Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */
+
+ var timer;
+
+ function fireContentLoadedEvent() {
+ if (document.loaded) return;
+ if (timer) window.clearTimeout(timer);
+ document.loaded = true;
+ document.fire('dom:loaded');
+ }
+
+ function checkReadyState() {
+ if (document.readyState === 'complete') {
+ document.stopObserving('readystatechange', checkReadyState);
+ fireContentLoadedEvent();
+ }
+ }
+
+ function pollDoScroll() {
+ try { document.documentElement.doScroll('left'); }
+ catch(e) {
+ timer = pollDoScroll.defer();
+ return;
+ }
+ fireContentLoadedEvent();
+ }
+
+ if (document.addEventListener) {
+ document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
+ } else {
+ document.observe('readystatechange', checkReadyState);
+ if (window == top)
+ timer = pollDoScroll.defer();
+ }
+
+ Event.observe(window, 'load', fireContentLoadedEvent);
+})();
+
+Element.addMethods();
+
+/*------------------------------- DEPRECATED -------------------------------*/
+
+Hash.toQueryString = Object.toQueryString;
+
+var Toggle = { display: Element.toggle };
+
+Element.Methods.childOf = Element.Methods.descendantOf;
+
+var Insertion = {
+ Before: function(element, content) {
+ return Element.insert(element, {before:content});
+ },
+
+ Top: function(element, content) {
+ return Element.insert(element, {top:content});
+ },
+
+ Bottom: function(element, content) {
+ return Element.insert(element, {bottom:content});
+ },
+
+ After: function(element, content) {
+ return Element.insert(element, {after:content});
+ }
+};
+
+var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
+
+var Position = {
+ includeScrollOffsets: false,
+
+ prepare: function() {
+ this.deltaX = window.pageXOffset
+ || document.documentElement.scrollLeft
+ || document.body.scrollLeft
+ || 0;
+ this.deltaY = window.pageYOffset
+ || document.documentElement.scrollTop
+ || document.body.scrollTop
+ || 0;
+ },
+
+ within: function(element, x, y) {
+ if (this.includeScrollOffsets)
+ return this.withinIncludingScrolloffsets(element, x, y);
+ this.xcomp = x;
+ this.ycomp = y;
+ this.offset = Element.cumulativeOffset(element);
+
+ return (y >= this.offset[1] &&
+ y < this.offset[1] + element.offsetHeight &&
+ x >= this.offset[0] &&
+ x < this.offset[0] + element.offsetWidth);
+ },
+
+ withinIncludingScrolloffsets: function(element, x, y) {
+ var offsetcache = Element.cumulativeScrollOffset(element);
+
+ this.xcomp = x + offsetcache[0] - this.deltaX;
+ this.ycomp = y + offsetcache[1] - this.deltaY;
+ this.offset = Element.cumulativeOffset(element);
+
+ return (this.ycomp >= this.offset[1] &&
+ this.ycomp < this.offset[1] + element.offsetHeight &&
+ this.xcomp >= this.offset[0] &&
+ this.xcomp < this.offset[0] + element.offsetWidth);
+ },
+
+ overlap: function(mode, element) {
+ if (!mode) return 0;
+ if (mode == 'vertical')
+ return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+ element.offsetHeight;
+ if (mode == 'horizontal')
+ return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+ element.offsetWidth;
+ },
+
+
+ cumulativeOffset: Element.Methods.cumulativeOffset,
+
+ positionedOffset: Element.Methods.positionedOffset,
+
+ absolutize: function(element) {
+ Position.prepare();
+ return Element.absolutize(element);
+ },
+
+ relativize: function(element) {
+ Position.prepare();
+ return Element.relativize(element);
+ },
+
+ realOffset: Element.Methods.cumulativeScrollOffset,
+
+ offsetParent: Element.Methods.getOffsetParent,
+
+ page: Element.Methods.viewportOffset,
+
+ clone: function(source, target, options) {
+ options = options || { };
+ return Element.clonePosition(target, source, options);
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
+ function iter(name) {
+ return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
+ }
+
+ instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
+ function(element, className) {
+ className = className.toString().strip();
+ var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
+ return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
+ } : function(element, className) {
+ className = className.toString().strip();
+ var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
+ if (!classNames && !className) return elements;
+
+ var nodes = $(element).getElementsByTagName('*');
+ className = ' ' + className + ' ';
+
+ for (var i = 0, child, cn; child = nodes[i]; i++) {
+ if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
+ (classNames && classNames.all(function(name) {
+ return !name.toString().blank() && cn.include(' ' + name + ' ');
+ }))))
+ elements.push(Element.extend(child));
+ }
+ return elements;
+ };
+
+ return function(className, parentElement) {
+ return $(parentElement || document.body).getElementsByClassName(className);
+ };
+}(Element.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+ initialize: function(element) {
+ this.element = $(element);
+ },
+
+ _each: function(iterator) {
+ this.element.className.split(/\s+/).select(function(name) {
+ return name.length > 0;
+ })._each(iterator);
+ },
+
+ set: function(className) {
+ this.element.className = className;
+ },
+
+ add: function(classNameToAdd) {
+ if (this.include(classNameToAdd)) return;
+ this.set($A(this).concat(classNameToAdd).join(' '));
+ },
+
+ remove: function(classNameToRemove) {
+ if (!this.include(classNameToRemove)) return;
+ this.set($A(this).without(classNameToRemove).join(' '));
+ },
+
+ toString: function() {
+ return $A(this).join(' ');
+ }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+
+/*--------------------------------------------------------------------------*/
+
+(function() {
+ window.Selector = Class.create({
+ initialize: function(expression) {
+ this.expression = expression.strip();
+ },
+
+ findElements: function(rootElement) {
+ return Prototype.Selector.select(this.expression, rootElement);
+ },
+
+ match: function(element) {
+ return Prototype.Selector.match(element, this.expression);
+ },
+
+ toString: function() {
+ return this.expression;
+ },
+
+ inspect: function() {
+ return "#<Selector: " + this.expression + ">";
+ }
+ });
+
+ Object.extend(Selector, {
+ matchElements: function(elements, expression) {
+ var match = Prototype.Selector.match,
+ results = [];
+
+ for (var i = 0, length = elements.length; i < length; i++) {
+ var element = elements[i];
+ if (match(element, expression)) {
+ results.push(Element.extend(element));
+ }
+ }
+ return results;
+ },
+
+ findElement: function(elements, expression, index) {
+ index = index || 0;
+ var matchIndex = 0, element;
+ for (var i = 0, length = elements.length; i < length; i++) {
+ element = elements[i];
+ if (Prototype.Selector.match(element, expression) && index === matchIndex++) {
+ return Element.extend(element);
+ }
+ }
+ },
+
+ findChildElements: function(element, expressions) {
+ var selector = expressions.toArray().join(', ');
+ return Prototype.Selector.select(selector, element || document);
+ }
+ });
+})();
diff --git a/src/usr/local/www/javascript/scriptaculous/scriptaculous.js b/src/usr/local/www/javascript/scriptaculous/scriptaculous.js
new file mode 100644
index 0000000..6bf437a
--- /dev/null
+++ b/src/usr/local/www/javascript/scriptaculous/scriptaculous.js
@@ -0,0 +1,68 @@
+// script.aculo.us scriptaculous.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
+
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Scriptaculous = {
+ Version: '1.8.3',
+ require: function(libraryName) {
+ try{
+ // inserting via DOM fails in Safari 2.0, so brute force approach
+ document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');
+ } catch(e) {
+ // for xhtml+xml served content, fall back to DOM methods
+ var script = document.createElement('script');
+ script.type = 'text/javascript';
+ script.src = libraryName;
+ document.getElementsByTagName('head')[0].appendChild(script);
+ }
+ },
+ REQUIRED_PROTOTYPE: '1.6.0.3',
+ load: function() {
+ function convertVersionString(versionString) {
+ var v = versionString.replace(/_.*|\./g, '');
+ v = parseInt(v + '0'.times(4-v.length));
+ return versionString.indexOf('_') > -1 ? v-1 : v;
+ }
+
+ if((typeof Prototype=='undefined') ||
+ (typeof Element == 'undefined') ||
+ (typeof Element.Methods=='undefined') ||
+ (convertVersionString(Prototype.Version) <
+ convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
+ throw("script.aculo.us requires the Prototype JavaScript framework >= " +
+ Scriptaculous.REQUIRED_PROTOTYPE);
+
+ var js = /scriptaculous\.js(\?.*)?$/;
+ $$('head script[src]').findAll(function(s) {
+ return s.src.match(js);
+ }).each(function(s) {
+ var path = s.src.replace(js, ''),
+ includes = s.src.match(/\?.*load=([a-z,]*)/);
+ (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
+ function(include) { Scriptaculous.require(path+include+'.js') });
+ });
+ }
+};
+
+Scriptaculous.load(); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/slider.js b/src/usr/local/www/javascript/scriptaculous/slider.js
new file mode 100644
index 0000000..5fd0347
--- /dev/null
+++ b/src/usr/local/www/javascript/scriptaculous/slider.js
@@ -0,0 +1,275 @@
+// script.aculo.us slider.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
+
+// Copyright (c) 2005-2009 Marty Haught, Thomas Fuchs
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+if (!Control) var Control = { };
+
+// options:
+// axis: 'vertical', or 'horizontal' (default)
+//
+// callbacks:
+// onChange(value)
+// onSlide(value)
+Control.Slider = Class.create({
+ initialize: function(handle, track, options) {
+ var slider = this;
+
+ if (Object.isArray(handle)) {
+ this.handles = handle.collect( function(e) { return $(e); });
+ } else {
+ this.handles = [$(handle)];
+ }
+
+ this.track = $(track);
+ this.options = options || { };
+
+ this.axis = this.options.axis || 'horizontal';
+ this.increment = this.options.increment || 1;
+ this.step = parseInt(this.options.step || '1');
+ this.range = this.options.range || $R(0,1);
+
+ this.value = 0; // assure backwards compat
+ this.values = this.handles.map( function() { return 0; });
+ this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s); }) : false;
+ this.options.startSpan = $(this.options.startSpan || null);
+ this.options.endSpan = $(this.options.endSpan || null);
+
+ this.restricted = this.options.restricted || false;
+
+ this.maximum = this.options.maximum || this.range.end;
+ this.minimum = this.options.minimum || this.range.start;
+
+ // Will be used to align the handle onto the track, if necessary
+ this.alignX = parseInt(this.options.alignX || '0');
+ this.alignY = parseInt(this.options.alignY || '0');
+
+ this.trackLength = this.maximumOffset() - this.minimumOffset();
+
+ this.handleLength = this.isVertical() ?
+ (this.handles[0].offsetHeight != 0 ?
+ this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
+ (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
+ this.handles[0].style.width.replace(/px$/,""));
+
+ this.active = false;
+ this.dragging = false;
+ this.disabled = false;
+
+ if (this.options.disabled) this.setDisabled();
+
+ // Allowed values array
+ this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
+ if (this.allowedValues) {
+ this.minimum = this.allowedValues.min();
+ this.maximum = this.allowedValues.max();
+ }
+
+ this.eventMouseDown = this.startDrag.bindAsEventListener(this);
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);
+ this.eventMouseMove = this.update.bindAsEventListener(this);
+
+ // Initialize handles in reverse (make sure first handle is active)
+ this.handles.each( function(h,i) {
+ i = slider.handles.length-1-i;
+ slider.setValue(parseFloat(
+ (Object.isArray(slider.options.sliderValue) ?
+ slider.options.sliderValue[i] : slider.options.sliderValue) ||
+ slider.range.start), i);
+ h.makePositioned().observe("mousedown", slider.eventMouseDown);
+ });
+
+ this.track.observe("mousedown", this.eventMouseDown);
+ document.observe("mouseup", this.eventMouseUp);
+ document.observe("mousemove", this.eventMouseMove);
+
+ this.initialized = true;
+ },
+ dispose: function() {
+ var slider = this;
+ Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);
+ this.handles.each( function(h) {
+ Event.stopObserving(h, "mousedown", slider.eventMouseDown);
+ });
+ },
+ setDisabled: function(){
+ this.disabled = true;
+ },
+ setEnabled: function(){
+ this.disabled = false;
+ },
+ getNearestValue: function(value){
+ if (this.allowedValues){
+ if (value >= this.allowedValues.max()) return(this.allowedValues.max());
+ if (value <= this.allowedValues.min()) return(this.allowedValues.min());
+
+ var offset = Math.abs(this.allowedValues[0] - value);
+ var newValue = this.allowedValues[0];
+ this.allowedValues.each( function(v) {
+ var currentOffset = Math.abs(v - value);
+ if (currentOffset <= offset){
+ newValue = v;
+ offset = currentOffset;
+ }
+ });
+ return newValue;
+ }
+ if (value > this.range.end) return this.range.end;
+ if (value < this.range.start) return this.range.start;
+ return value;
+ },
+ setValue: function(sliderValue, handleIdx){
+ if (!this.active) {
+ this.activeHandleIdx = handleIdx || 0;
+ this.activeHandle = this.handles[this.activeHandleIdx];
+ this.updateStyles();
+ }
+ handleIdx = handleIdx || this.activeHandleIdx || 0;
+ if (this.initialized && this.restricted) {
+ if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
+ sliderValue = this.values[handleIdx-1];
+ if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
+ sliderValue = this.values[handleIdx+1];
+ }
+ sliderValue = this.getNearestValue(sliderValue);
+ this.values[handleIdx] = sliderValue;
+ this.value = this.values[0]; // assure backwards compat
+
+ this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
+ this.translateToPx(sliderValue);
+
+ this.drawSpans();
+ if (!this.dragging || !this.event) this.updateFinished();
+ },
+ setValueBy: function(delta, handleIdx) {
+ this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
+ handleIdx || this.activeHandleIdx || 0);
+ },
+ translateToPx: function(value) {
+ return Math.round(
+ ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
+ (value - this.range.start)) + "px";
+ },
+ translateToValue: function(offset) {
+ return ((offset/(this.trackLength-this.handleLength) *
+ (this.range.end-this.range.start)) + this.range.start);
+ },
+ getRange: function(range) {
+ var v = this.values.sortBy(Prototype.K);
+ range = range || 0;
+ return $R(v[range],v[range+1]);
+ },
+ minimumOffset: function(){
+ return(this.isVertical() ? this.alignY : this.alignX);
+ },
+ maximumOffset: function(){
+ return(this.isVertical() ?
+ (this.track.offsetHeight != 0 ? this.track.offsetHeight :
+ this.track.style.height.replace(/px$/,"")) - this.alignY :
+ (this.track.offsetWidth != 0 ? this.track.offsetWidth :
+ this.track.style.width.replace(/px$/,"")) - this.alignX);
+ },
+ isVertical: function(){
+ return (this.axis == 'vertical');
+ },
+ drawSpans: function() {
+ var slider = this;
+ if (this.spans)
+ $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)); });
+ if (this.options.startSpan)
+ this.setSpan(this.options.startSpan,
+ $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
+ if (this.options.endSpan)
+ this.setSpan(this.options.endSpan,
+ $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
+ },
+ setSpan: function(span, range) {
+ if (this.isVertical()) {
+ span.style.top = this.translateToPx(range.start);
+ span.style.height = this.translateToPx(range.end - range.start + this.range.start);
+ } else {
+ span.style.left = this.translateToPx(range.start);
+ span.style.width = this.translateToPx(range.end - range.start + this.range.start);
+ }
+ },
+ updateStyles: function() {
+ this.handles.each( function(h){ Element.removeClassName(h, 'selected'); });
+ Element.addClassName(this.activeHandle, 'selected');
+ },
+ startDrag: function(event) {
+ if (Event.isLeftClick(event)) {
+ if (!this.disabled){
+ this.active = true;
+
+ var handle = Event.element(event);
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ var track = handle;
+ if (track==this.track) {
+ var offsets = this.track.cumulativeOffset();
+ this.event = event;
+ this.setValue(this.translateToValue(
+ (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
+ ));
+ var offsets = this.activeHandle.cumulativeOffset();
+ this.offsetX = (pointer[0] - offsets[0]);
+ this.offsetY = (pointer[1] - offsets[1]);
+ } else {
+ // find the handle (prevents issues with Safari)
+ while((this.handles.indexOf(handle) == -1) && handle.parentNode)
+ handle = handle.parentNode;
+
+ if (this.handles.indexOf(handle)!=-1) {
+ this.activeHandle = handle;
+ this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
+ this.updateStyles();
+
+ var offsets = this.activeHandle.cumulativeOffset();
+ this.offsetX = (pointer[0] - offsets[0]);
+ this.offsetY = (pointer[1] - offsets[1]);
+ }
+ }
+ }
+ Event.stop(event);
+ }
+ },
+ update: function(event) {
+ if (this.active) {
+ if (!this.dragging) this.dragging = true;
+ this.draw(event);
+ if (Prototype.Browser.WebKit) window.scrollBy(0,0);
+ Event.stop(event);
+ }
+ },
+ draw: function(event) {
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ var offsets = this.track.cumulativeOffset();
+ pointer[0] -= this.offsetX + offsets[0];
+ pointer[1] -= this.offsetY + offsets[1];
+ this.event = event;
+ this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
+ if (this.initialized && this.options.onSlide)
+ this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
+ },
+ endDrag: function(event) {
+ if (this.active && this.dragging) {
+ this.finishDrag(event, true);
+ Event.stop(event);
+ }
+ this.active = false;
+ this.dragging = false;
+ },
+ finishDrag: function(event, success) {
+ this.active = false;
+ this.dragging = false;
+ this.updateFinished();
+ },
+ updateFinished: function() {
+ if (this.initialized && this.options.onChange)
+ this.options.onChange(this.values.length>1 ? this.values : this.value, this);
+ this.event = null;
+ }
+}); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/sound.js b/src/usr/local/www/javascript/scriptaculous/sound.js
new file mode 100644
index 0000000..a3bf4cd
--- /dev/null
+++ b/src/usr/local/www/javascript/scriptaculous/sound.js
@@ -0,0 +1,59 @@
+// script.aculo.us sound.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
+
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// Based on code created by Jules Gravinese (http://www.webveteran.com/)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+Sound = {
+ tracks: {},
+ _enabled: true,
+ template:
+ new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'),
+ enable: function(){
+ Sound._enabled = true;
+ },
+ disable: function(){
+ Sound._enabled = false;
+ },
+ play: function(url){
+ if(!Sound._enabled) return;
+ var options = Object.extend({
+ track: 'global', url: url, replace: false
+ }, arguments[1] || {});
+
+ if(options.replace && this.tracks[options.track]) {
+ $R(0, this.tracks[options.track].id).each(function(id){
+ var sound = $('sound_'+options.track+'_'+id);
+ sound.Stop && sound.Stop();
+ sound.remove();
+ });
+ this.tracks[options.track] = null;
+ }
+
+ if(!this.tracks[options.track])
+ this.tracks[options.track] = { id: 0 };
+ else
+ this.tracks[options.track].id++;
+
+ options.id = this.tracks[options.track].id;
+ $$('body')[0].insert(
+ Prototype.Browser.IE ? new Element('bgsound',{
+ id: 'sound_'+options.track+'_'+options.id,
+ src: options.url, loop: 1, autostart: true
+ }) : Sound.template.evaluate(options));
+ }
+};
+
+if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){
+ if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1; }))
+ Sound.template = new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>');
+ else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('Windows Media') != -1; }))
+ Sound.template = new Template('<object id="sound_#{track}_#{id}" type="application/x-mplayer2" data="#{url}"></object>');
+ else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('RealPlayer') != -1; }))
+ Sound.template = new Template('<embed type="audio/x-pn-realaudio-plugin" style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>');
+ else
+ Sound.play = function(){};
+} \ No newline at end of file
diff --git a/src/usr/local/www/javascript/scriptaculous/unittest.js b/src/usr/local/www/javascript/scriptaculous/unittest.js
new file mode 100644
index 0000000..e18b08e
--- /dev/null
+++ b/src/usr/local/www/javascript/scriptaculous/unittest.js
@@ -0,0 +1,568 @@
+// script.aculo.us unittest.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009
+
+// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// (c) 2005-2009 Jon Tirsen (http://www.tirsen.com)
+// (c) 2005-2009 Michael Schuerig (http://www.schuerig.de/michael/)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// experimental, Firefox-only
+Event.simulateMouse = function(element, eventName) {
+ var options = Object.extend({
+ pointerX: 0,
+ pointerY: 0,
+ buttons: 0,
+ ctrlKey: false,
+ altKey: false,
+ shiftKey: false,
+ metaKey: false
+ }, arguments[2] || {});
+ var oEvent = document.createEvent("MouseEvents");
+ oEvent.initMouseEvent(eventName, true, true, document.defaultView,
+ options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element));
+
+ if(this.mark) Element.remove(this.mark);
+ this.mark = document.createElement('div');
+ this.mark.appendChild(document.createTextNode(" "));
+ document.body.appendChild(this.mark);
+ this.mark.style.position = 'absolute';
+ this.mark.style.top = options.pointerY + "px";
+ this.mark.style.left = options.pointerX + "px";
+ this.mark.style.width = "5px";
+ this.mark.style.height = "5px;";
+ this.mark.style.borderTop = "1px solid red;";
+ this.mark.style.borderLeft = "1px solid red;";
+
+ if(this.step)
+ alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
+
+ $(element).dispatchEvent(oEvent);
+};
+
+// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
+// You need to downgrade to 1.0.4 for now to get this working
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
+Event.simulateKey = function(element, eventName) {
+ var options = Object.extend({
+ ctrlKey: false,
+ altKey: false,
+ shiftKey: false,
+ metaKey: false,
+ keyCode: 0,
+ charCode: 0
+ }, arguments[2] || {});
+
+ var oEvent = document.createEvent("KeyEvents");
+ oEvent.initKeyEvent(eventName, true, true, window,
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
+ options.keyCode, options.charCode );
+ $(element).dispatchEvent(oEvent);
+};
+
+Event.simulateKeys = function(element, command) {
+ for(var i=0; i<command.length; i++) {
+ Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
+ }
+};
+
+var Test = {};
+Test.Unit = {};
+
+// security exception workaround
+Test.Unit.inspect = Object.inspect;
+
+Test.Unit.Logger = Class.create();
+Test.Unit.Logger.prototype = {
+ initialize: function(log) {
+ this.log = $(log);
+ if (this.log) {
+ this._createLogTable();
+ }
+ },
+ start: function(testName) {
+ if (!this.log) return;
+ this.testName = testName;
+ this.lastLogLine = document.createElement('tr');
+ this.statusCell = document.createElement('td');
+ this.nameCell = document.createElement('td');
+ this.nameCell.className = "nameCell";
+ this.nameCell.appendChild(document.createTextNode(testName));
+ this.messageCell = document.createElement('td');
+ this.lastLogLine.appendChild(this.statusCell);
+ this.lastLogLine.appendChild(this.nameCell);
+ this.lastLogLine.appendChild(this.messageCell);
+ this.loglines.appendChild(this.lastLogLine);
+ },
+ finish: function(status, summary) {
+ if (!this.log) return;
+ this.lastLogLine.className = status;
+ this.statusCell.innerHTML = status;
+ this.messageCell.innerHTML = this._toHTML(summary);
+ this.addLinksToResults();
+ },
+ message: function(message) {
+ if (!this.log) return;
+ this.messageCell.innerHTML = this._toHTML(message);
+ },
+ summary: function(summary) {
+ if (!this.log) return;
+ this.logsummary.innerHTML = this._toHTML(summary);
+ },
+ _createLogTable: function() {
+ this.log.innerHTML =
+ '<div id="logsummary"></div>' +
+ '<table id="logtable">' +
+ '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
+ '<tbody id="loglines"></tbody>' +
+ '</table>';
+ this.logsummary = $('logsummary');
+ this.loglines = $('loglines');
+ },
+ _toHTML: function(txt) {
+ return txt.escapeHTML().replace(/\n/g,"<br />");
+ },
+ addLinksToResults: function(){
+ $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log
+ td.title = "Run only this test";
+ Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;});
+ });
+ $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log
+ td.title = "Run all tests";
+ Event.observe(td, 'click', function(){ window.location.search = "";});
+ });
+ }
+};
+
+Test.Unit.Runner = Class.create();
+Test.Unit.Runner.prototype = {
+ initialize: function(testcases) {
+ this.options = Object.extend({
+ testLog: 'testlog'
+ }, arguments[1] || {});
+ this.options.resultsURL = this.parseResultsURLQueryParameter();
+ this.options.tests = this.parseTestsQueryParameter();
+ if (this.options.testLog) {
+ this.options.testLog = $(this.options.testLog) || null;
+ }
+ if(this.options.tests) {
+ this.tests = [];
+ for(var i = 0; i < this.options.tests.length; i++) {
+ if(/^test/.test(this.options.tests[i])) {
+ this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
+ }
+ }
+ } else {
+ if (this.options.test) {
+ this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
+ } else {
+ this.tests = [];
+ for(var testcase in testcases) {
+ if(/^test/.test(testcase)) {
+ this.tests.push(
+ new Test.Unit.Testcase(
+ this.options.context ? ' -> ' + this.options.titles[testcase] : testcase,
+ testcases[testcase], testcases["setup"], testcases["teardown"]
+ ));
+ }
+ }
+ }
+ }
+ this.currentTest = 0;
+ this.logger = new Test.Unit.Logger(this.options.testLog);
+ setTimeout(this.runTests.bind(this), 1000);
+ },
+ parseResultsURLQueryParameter: function() {
+ return window.location.search.parseQuery()["resultsURL"];
+ },
+ parseTestsQueryParameter: function(){
+ if (window.location.search.parseQuery()["tests"]){
+ return window.location.search.parseQuery()["tests"].split(',');
+ };
+ },
+ // Returns:
+ // "ERROR" if there was an error,
+ // "FAILURE" if there was a failure, or
+ // "SUCCESS" if there was neither
+ getResult: function() {
+ var hasFailure = false;
+ for(var i=0;i<this.tests.length;i++) {
+ if (this.tests[i].errors > 0) {
+ return "ERROR";
+ }
+ if (this.tests[i].failures > 0) {
+ hasFailure = true;
+ }
+ }
+ if (hasFailure) {
+ return "FAILURE";
+ } else {
+ return "SUCCESS";
+ }
+ },
+ postResults: function() {
+ if (this.options.resultsURL) {
+ new Ajax.Request(this.options.resultsURL,
+ { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
+ }
+ },
+ runTests: function() {
+ var test = this.tests[this.currentTest];
+ if (!test) {
+ // finished!
+ this.postResults();
+ this.logger.summary(this.summary());
+ return;
+ }
+ if(!test.isWaiting) {
+ this.logger.start(test.name);
+ }
+ test.run();
+ if(test.isWaiting) {
+ this.logger.message("Waiting for " + test.timeToWait + "ms");
+ setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
+ } else {
+ this.logger.finish(test.status(), test.summary());
+ this.currentTest++;
+ // tail recursive, hopefully the browser will skip the stackframe
+ this.runTests();
+ }
+ },
+ summary: function() {
+ var assertions = 0;
+ var failures = 0;
+ var errors = 0;
+ var messages = [];
+ for(var i=0;i<this.tests.length;i++) {
+ assertions += this.tests[i].assertions;
+ failures += this.tests[i].failures;
+ errors += this.tests[i].errors;
+ }
+ return (
+ (this.options.context ? this.options.context + ': ': '') +
+ this.tests.length + " tests, " +
+ assertions + " assertions, " +
+ failures + " failures, " +
+ errors + " errors");
+ }
+};
+
+Test.Unit.Assertions = Class.create();
+Test.Unit.Assertions.prototype = {
+ initialize: function() {
+ this.assertions = 0;
+ this.failures = 0;
+ this.errors = 0;
+ this.messages = [];
+ },
+ summary: function() {
+ return (
+ this.assertions + " assertions, " +
+ this.failures + " failures, " +
+ this.errors + " errors" + "\n" +
+ this.messages.join("\n"));
+ },
+ pass: function() {
+ this.assertions++;
+ },
+ fail: function(message) {
+ this.failures++;
+ this.messages.push("Failure: " + message);
+ },
+ info: function(message) {
+ this.messages.push("Info: " + message);
+ },
+ error: function(error) {
+ this.errors++;
+ this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
+ },
+ status: function() {
+ if (this.failures > 0) return 'failed';
+ if (this.errors > 0) return 'error';
+ return 'passed';
+ },
+ assert: function(expression) {
+ var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
+ try { expression ? this.pass() :
+ this.fail(message); }
+ catch(e) { this.error(e); }
+ },
+ assertEqual: function(expected, actual) {
+ var message = arguments[2] || "assertEqual";
+ try { (expected == actual) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertInspect: function(expected, actual) {
+ var message = arguments[2] || "assertInspect";
+ try { (expected == actual.inspect()) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertEnumEqual: function(expected, actual) {
+ var message = arguments[2] || "assertEnumEqual";
+ try { $A(expected).length == $A(actual).length &&
+ expected.zip(actual).all(function(pair) { return pair[0] == pair[1]; }) ?
+ this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) +
+ ', actual ' + Test.Unit.inspect(actual)); }
+ catch(e) { this.error(e); }
+ },
+ assertNotEqual: function(expected, actual) {
+ var message = arguments[2] || "assertNotEqual";
+ try { (expected != actual) ? this.pass() :
+ this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertIdentical: function(expected, actual) {
+ var message = arguments[2] || "assertIdentical";
+ try { (expected === actual) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertNotIdentical: function(expected, actual) {
+ var message = arguments[2] || "assertNotIdentical";
+ try { !(expected === actual) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertNull: function(obj) {
+ var message = arguments[1] || 'assertNull';
+ try { (obj==null) ? this.pass() :
+ this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertMatch: function(expected, actual) {
+ var message = arguments[2] || 'assertMatch';
+ var regex = new RegExp(expected);
+ try { (regex.exec(actual)) ? this.pass() :
+ this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertHidden: function(element) {
+ var message = arguments[1] || 'assertHidden';
+ this.assertEqual("none", element.style.display, message);
+ },
+ assertNotNull: function(object) {
+ var message = arguments[1] || 'assertNotNull';
+ this.assert(object != null, message);
+ },
+ assertType: function(expected, actual) {
+ var message = arguments[2] || 'assertType';
+ try {
+ (actual.constructor == expected) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + (actual.constructor) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertNotOfType: function(expected, actual) {
+ var message = arguments[2] || 'assertNotOfType';
+ try {
+ (actual.constructor != expected) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + (actual.constructor) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertInstanceOf: function(expected, actual) {
+ var message = arguments[2] || 'assertInstanceOf';
+ try {
+ (actual instanceof expected) ? this.pass() :
+ this.fail(message + ": object was not an instance of the expected type"); }
+ catch(e) { this.error(e); }
+ },
+ assertNotInstanceOf: function(expected, actual) {
+ var message = arguments[2] || 'assertNotInstanceOf';
+ try {
+ !(actual instanceof expected) ? this.pass() :
+ this.fail(message + ": object was an instance of the not expected type"); }
+ catch(e) { this.error(e); }
+ },
+ assertRespondsTo: function(method, obj) {
+ var message = arguments[2] || 'assertRespondsTo';
+ try {
+ (obj[method] && typeof obj[method] == 'function') ? this.pass() :
+ this.fail(message + ": object doesn't respond to [" + method + "]"); }
+ catch(e) { this.error(e); }
+ },
+ assertReturnsTrue: function(method, obj) {
+ var message = arguments[2] || 'assertReturnsTrue';
+ try {
+ var m = obj[method];
+ if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+ m() ? this.pass() :
+ this.fail(message + ": method returned false"); }
+ catch(e) { this.error(e); }
+ },
+ assertReturnsFalse: function(method, obj) {
+ var message = arguments[2] || 'assertReturnsFalse';
+ try {
+ var m = obj[method];
+ if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+ !m() ? this.pass() :
+ this.fail(message + ": method returned true"); }
+ catch(e) { this.error(e); }
+ },
+ assertRaise: function(exceptionName, method) {
+ var message = arguments[2] || 'assertRaise';
+ try {
+ method();
+ this.fail(message + ": exception expected but none was raised"); }
+ catch(e) {
+ ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e);
+ }
+ },
+ assertElementsMatch: function() {
+ var expressions = $A(arguments), elements = $A(expressions.shift());
+ if (elements.length != expressions.length) {
+ this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
+ return false;
+ }
+ elements.zip(expressions).all(function(pair, index) {
+ var element = $(pair.first()), expression = pair.last();
+ if (element.match(expression)) return true;
+ this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
+ }.bind(this)) && this.pass();
+ },
+ assertElementMatches: function(element, expression) {
+ this.assertElementsMatch([element], expression);
+ },
+ benchmark: function(operation, iterations) {
+ var startAt = new Date();
+ (iterations || 1).times(operation);
+ var timeTaken = ((new Date())-startAt);
+ this.info((arguments[2] || 'Operation') + ' finished ' +
+ iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+ return timeTaken;
+ },
+ _isVisible: function(element) {
+ element = $(element);
+ if(!element.parentNode) return true;
+ this.assertNotNull(element);
+ if(element.style && Element.getStyle(element, 'display') == 'none')
+ return false;
+
+ return this._isVisible(element.parentNode);
+ },
+ assertNotVisible: function(element) {
+ this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
+ },
+ assertVisible: function(element) {
+ this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
+ },
+ benchmark: function(operation, iterations) {
+ var startAt = new Date();
+ (iterations || 1).times(operation);
+ var timeTaken = ((new Date())-startAt);
+ this.info((arguments[2] || 'Operation') + ' finished ' +
+ iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+ return timeTaken;
+ }
+};
+
+Test.Unit.Testcase = Class.create();
+Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
+ initialize: function(name, test, setup, teardown) {
+ Test.Unit.Assertions.prototype.initialize.bind(this)();
+ this.name = name;
+
+ if(typeof test == 'string') {
+ test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
+ test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
+ this.test = function() {
+ eval('with(this){'+test+'}');
+ };
+ } else {
+ this.test = test || function() {};
+ }
+
+ this.setup = setup || function() {};
+ this.teardown = teardown || function() {};
+ this.isWaiting = false;
+ this.timeToWait = 1000;
+ },
+ wait: function(time, nextPart) {
+ this.isWaiting = true;
+ this.test = nextPart;
+ this.timeToWait = time;
+ },
+ run: function() {
+ try {
+ try {
+ if (!this.isWaiting) this.setup.bind(this)();
+ this.isWaiting = false;
+ this.test.bind(this)();
+ } finally {
+ if(!this.isWaiting) {
+ this.teardown.bind(this)();
+ }
+ }
+ }
+ catch(e) { this.error(e); }
+ }
+});
+
+// *EXPERIMENTAL* BDD-style testing to please non-technical folk
+// This draws many ideas from RSpec http://rspec.rubyforge.org/
+
+Test.setupBDDExtensionMethods = function(){
+ var METHODMAP = {
+ shouldEqual: 'assertEqual',
+ shouldNotEqual: 'assertNotEqual',
+ shouldEqualEnum: 'assertEnumEqual',
+ shouldBeA: 'assertType',
+ shouldNotBeA: 'assertNotOfType',
+ shouldBeAn: 'assertType',
+ shouldNotBeAn: 'assertNotOfType',
+ shouldBeNull: 'assertNull',
+ shouldNotBeNull: 'assertNotNull',
+
+ shouldBe: 'assertReturnsTrue',
+ shouldNotBe: 'assertReturnsFalse',
+ shouldRespondTo: 'assertRespondsTo'
+ };
+ var makeAssertion = function(assertion, args, object) {
+ this[assertion].apply(this,(args || []).concat([object]));
+ };
+
+ Test.BDDMethods = {};
+ $H(METHODMAP).each(function(pair) {
+ Test.BDDMethods[pair.key] = function() {
+ var args = $A(arguments);
+ var scope = args.shift();
+ makeAssertion.apply(scope, [pair.value, args, this]); };
+ });
+
+ [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each(
+ function(p){ Object.extend(p, Test.BDDMethods); }
+ );
+};
+
+Test.context = function(name, spec, log){
+ Test.setupBDDExtensionMethods();
+
+ var compiledSpec = {};
+ var titles = {};
+ for(specName in spec) {
+ switch(specName){
+ case "setup":
+ case "teardown":
+ compiledSpec[specName] = spec[specName];
+ break;
+ default:
+ var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
+ var body = spec[specName].toString().split('\n').slice(1);
+ if(/^\{/.test(body[0])) body = body.slice(1);
+ body.pop();
+ body = body.map(function(statement){
+ return statement.strip();
+ });
+ compiledSpec[testName] = body.join('\n');
+ titles[testName] = specName;
+ }
+ }
+ new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
+}; \ No newline at end of file
diff --git a/src/usr/local/www/javascript/sorttable.js b/src/usr/local/www/javascript/sorttable.js
new file mode 100644
index 0000000..f150e56
--- /dev/null
+++ b/src/usr/local/www/javascript/sorttable.js
@@ -0,0 +1,584 @@
+/*
+ SortTable
+ version 2
+ 7th April 2007
+ Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/
+
+ Instructions:
+ Download this file
+ Add <script src="sorttable.js"></script> to your HTML
+ Add class="sortable" to any table you'd like to make sortable
+ Click on the headers to sort
+
+ Thanks to many, many people for contributions and suggestions.
+ Licenced as X11: http://www.kryogenix.org/code/browser/licence.html
+ This basically means: do what you want with it.
+
+ -- pfSense modifications --
+ Allow for sorting of IP adresses
+ 2012-09-15 Allow for multiple header rows, using "sortableHeaderRowIdentifier" class for the TR that has the column headers. (used in firewall-log)
+ 2012-09-15 Allow sorting multiple dual/mutlti rows together, using sortablemultirow="2" attribute for the table
+ 2012-09-15 Allow sorting of IP:Port texts, changed sort compare function
+ 2012-11-05 Allow sorting of IP:Port and *:port texts toghether also AAA_23 AAA_123 in 'numeric order' (used in Diagnostics\Sockets column LOCAL)
+*/
+
+
+var stIsIE = /*@cc_on!@*/false;
+
+sorttable = {
+ init: function() {
+ // quit if this function has already been called
+ if (arguments.callee.done) return;
+ // flag this function so we don't do the same thing twice
+ arguments.callee.done = true;
+ // kill the timer
+ if (_timer) clearInterval(_timer);
+
+ if (!document.createElement || !document.getElementsByTagName) return;
+
+ sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/;
+
+ forEach(document.getElementsByTagName('table'), function(table) {
+ if (table.className.search(/\bsortable\b/) != -1) {
+ sorttable.makeSortable(table);
+ }
+ });
+
+ },
+
+ makeSortable: function(table) {
+ if (table.getElementsByTagName('thead').length == 0) {
+ // table doesn't have a tHead. Since it should have, create one and
+ // put the first table row in it.
+ the = document.createElement('thead');
+ the.appendChild(table.rows[0]);
+ table.insertBefore(the,table.firstChild);
+ }
+ // Safari doesn't support table.tHead, sigh
+ if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];
+
+ headrow = undefined;
+ if (table.tHead.rows.length == 1)
+ headrow = table.tHead.rows[0].cells;
+ else
+ {
+ //if multiple rows are found one must be marked with class <tr class="sortableHeaderRowIdentifier">
+ for (var i=0; i<table.tHead.rows.length; i++) {
+ if (table.tHead.rows[i].className.search(/\bsortableHeaderRowIdentifier\b/) != -1)
+ {
+ headrow = table.tHead.rows[i].cells;
+ break;
+ }
+ }
+ }
+ if (headrow == undefined)
+ return;
+
+ if (table.getAttribute("sortableMultirow") != undefined)
+ sortableMultirow = parseInt(table.getAttribute("sortableMultirow"));
+ else
+ sortableMultirow = 1;
+
+ // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as
+ // "total" rows, for example). This is B&R, since what you're supposed
+ // to do is put them in a tfoot. So, if there are sortbottom rows,
+ // for backwards compatibility, move them to tfoot (creating it if needed).
+ sortbottomrows = [];
+ for (var i=0; i<table.rows.length; i++) {
+ if (table.rows[i].className.search(/\bsortbottom\b/) != -1) {
+ sortbottomrows[sortbottomrows.length] = table.rows[i];
+ }
+ }
+ if (sortbottomrows) {
+ if (table.tFoot == null) {
+ // table doesn't have a tfoot. Create one.
+ tfo = document.createElement('tfoot');
+ table.appendChild(tfo);
+ }
+ for (var i=0; i<sortbottomrows.length; i++) {
+ tfo.appendChild(sortbottomrows[i]);
+ }
+ delete sortbottomrows;
+ }
+
+ // work through each column and calculate its type
+ for (var i=0; i<headrow.length; i++) {
+ // manually override the type with a sorttable_type attribute
+ if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col
+ mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/);
+ if (mtch) { override = mtch[1]; }
+ if (mtch && typeof sorttable["sort_"+override] == 'function') {
+ headrow[i].sorttable_sortfunction = sorttable["sort_"+override];
+ } else {
+ headrow[i].sorttable_sortfunction = sorttable.guessType(table,i, sortableMultirow);
+ }
+ // make it clickable to sort
+ headrow[i].sorttable_columnindex = i;
+ headrow[i].sorttable_tbody = table.tBodies[0];
+ dean_addEvent(headrow[i],"click", function(e) {
+
+ if (this.className.search(/\bsorttable_sorted\b/) != -1) {
+ // if we're already sorted by this column, just
+ // reverse the table, which is quicker
+ sorttable.reverse(this.sorttable_tbody, sortableMultirow);
+ this.className = this.className.replace('sorttable_sorted',
+ 'sorttable_sorted_reverse');
+ this.removeChild(document.getElementById('sorttable_sortfwdind'));
+ sortrevind = document.createElement('span');
+ sortrevind.id = "sorttable_sortrevind";
+ sortrevind.innerHTML = stIsIE ? '&nbsp<font face="webdings">5</font>' : '&nbsp;&#x25B4;';
+ this.appendChild(sortrevind);
+ return;
+ }
+ if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) {
+ // if we're already sorted by this column in reverse, just
+ // re-reverse the table, which is quicker
+ sorttable.reverse(this.sorttable_tbody, sortableMultirow);
+ this.className = this.className.replace('sorttable_sorted_reverse',
+ 'sorttable_sorted');
+ this.removeChild(document.getElementById('sorttable_sortrevind'));
+ sortfwdind = document.createElement('span');
+ sortfwdind.id = "sorttable_sortfwdind";
+ sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
+ this.appendChild(sortfwdind);
+ return;
+ }
+
+ // remove sorttable_sorted classes
+ theadrow = this.parentNode;
+ forEach(theadrow.childNodes, function(cell) {
+ if (cell.nodeType == 1) { // an element
+ cell.className = cell.className.replace('sorttable_sorted_reverse','');
+ cell.className = cell.className.replace('sorttable_sorted','');
+ }
+ });
+ sortfwdind = document.getElementById('sorttable_sortfwdind');
+ if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); }
+ sortrevind = document.getElementById('sorttable_sortrevind');
+ if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); }
+
+ this.className += ' sorttable_sorted';
+ sortfwdind = document.createElement('span');
+ sortfwdind.id = "sorttable_sortfwdind";
+ sortfwdind.innerHTML = stIsIE ? '&nbsp<font face="webdings">6</font>' : '&nbsp;&#x25BE;';
+ this.appendChild(sortfwdind);
+
+ // build an array to sort. This is a Schwartzian transform thing,
+ // i.e., we "decorate" each row with the actual sort key,
+ // sort based on the sort keys, and then put the rows back in order
+ // which is a lot faster because you only do getInnerText once per row
+ row_array = [];
+ col = this.sorttable_columnindex;
+ rows = this.sorttable_tbody.rows;
+ for (var j=0; j<rows.length; j+=sortableMultirow) {
+ row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]];
+ for(var k=1; k < sortableMultirow;k++)
+ {
+ row_array[row_array.length-1][k+1]=rows[j+k];
+ }
+ }
+ /* If you want a stable sort, uncomment the following line */
+ //sorttable.shaker_sort(row_array, this.sorttable_sortfunction);
+ /* and comment out this one */
+ row_array.sort(this.sorttable_sortfunction);
+
+ tb = this.sorttable_tbody;
+ for (var j=0; j<row_array.length; j++) {
+ for(var k=0; k<sortableMultirow; k++) {
+ row = row_array[j][k+1];
+ if (j % 2 == 0)
+ row.className = row.className.replace(' listMReven',' listMRodd');
+ else
+ row.className = row.className.replace(' listMRodd',' listMReven');
+
+ tb.appendChild(row);
+ }
+ }
+
+ delete row_array;
+ });
+ }
+ }
+ },
+
+ guessType: function(table, column, sortableMultirow) {
+ // guess the type of a column based on its first non-blank row
+ sortfn = sorttable.sort_alpha;
+ for (var i=0; i<table.tBodies[0].rows.length; i+=sortableMultirow) {
+ text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]);
+ if (text != '') {
+ if (text.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\:[0-9]{1,5})?\b/)) {
+ return sorttable.sort_ipaddr;
+ }
+ if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {
+ return sorttable.sort_numeric;
+ }
+ // check for a date: dd/mm/yyyy or dd/mm/yy
+ // can have / or . or - as separator
+ // can be mm/dd as well
+ possdate = text.match(sorttable.DATE_RE);
+ if (possdate) {
+ // looks like a date
+ first = parseInt(possdate[1]);
+ second = parseInt(possdate[2]);
+ if (first > 12) {
+ // definitely dd/mm
+ return sorttable.sort_ddmm;
+ } else if (second > 12) {
+ return sorttable.sort_mmdd;
+ } else {
+ // looks like a date, but we can't tell which, so assume
+ // that it's dd/mm (English imperialism!) and keep looking
+ sortfn = sorttable.sort_ddmm;
+ }
+ }
+ }
+ }
+ return sortfn;
+ },
+
+ getInnerText: function(node) {
+ // gets the text we want to use for sorting for a cell.
+ // strips leading and trailing whitespace.
+ // this is *not* a generic getInnerText function; it's special to sorttable.
+ // for example, you can override the cell text with a customkey attribute.
+ // it also gets .value for <input> fields.
+
+ hasInputs = (typeof node.getElementsByTagName == 'function') &&
+ node.getElementsByTagName('input').length;
+
+ if (node.getAttribute("sorttable_customkey") != null) {
+ return node.getAttribute("sorttable_customkey");
+ }
+ else if (typeof node.textContent != 'undefined' && !hasInputs) {
+ return node.textContent.replace(/^\s+|\s+$/g, '');
+ }
+ else if (typeof node.innerText != 'undefined' && !hasInputs) {
+ return node.innerText.replace(/^\s+|\s+$/g, '');
+ }
+ else if (typeof node.text != 'undefined' && !hasInputs) {
+ return node.text.replace(/^\s+|\s+$/g, '');
+ }
+ else {
+ switch (node.nodeType) {
+ case 3:
+ if (node.nodeName.toLowerCase() == 'input') {
+ return node.value.replace(/^\s+|\s+$/g, '');
+ }
+ case 4:
+ return node.nodeValue.replace(/^\s+|\s+$/g, '');
+ break;
+ case 1:
+ case 11:
+ var innerText = '';
+ for (var i = 0; i < node.childNodes.length; i++) {
+ innerText += sorttable.getInnerText(node.childNodes[i]);
+ }
+ return innerText.replace(/^\s+|\s+$/g, '');
+ break;
+ default:
+ return '';
+ }
+ }
+ },
+
+ reverse: function(tbody, sortableMultirow) {
+ // reverse the rows in a tbody
+ newrows = [];
+ for (var i=0; i<tbody.rows.length; i++) {
+ newrows[newrows.length] = tbody.rows[i];
+ }
+ for (var i=newrows.length-1; i>=0; i-=sortableMultirow) {
+ for(var j=sortableMultirow-1;j>=0;j--)
+ {
+ tbody.appendChild(newrows[i-j]);
+ }
+ }
+ delete newrows;
+ },
+
+ /* sort functions
+ each sort function takes two parameters, a and b
+ you are comparing a[0] and b[0] */
+ sort_numeric: function(a,b) {
+ aa = parseFloat(a[0].replace(/[^0-9.-]/g,''));
+ if (isNaN(aa)) aa = 0;
+ bb = parseFloat(b[0].replace(/[^0-9.-]/g,''));
+ if (isNaN(bb)) bb = 0;
+ return aa-bb;
+ },
+ sort_alpha: function(a,b) {
+ if (a[0]==b[0]) return 0;
+ if (a[0]<b[0]) return -1;
+ return 1;
+ },
+ sort_ddmm: function(a,b) {
+ mtch = a[0].match(sorttable.DATE_RE);
+ y = mtch[3]; m = mtch[2]; d = mtch[1];
+ if (m.length == 1) m = '0'+m;
+ if (d.length == 1) d = '0'+d;
+ dt1 = y+m+d;
+ mtch = b[0].match(sorttable.DATE_RE);
+ y = mtch[3]; m = mtch[2]; d = mtch[1];
+ if (m.length == 1) m = '0'+m;
+ if (d.length == 1) d = '0'+d;
+ dt2 = y+m+d;
+ if (dt1==dt2) return 0;
+ if (dt1<dt2) return -1;
+ return 1;
+ },
+ sort_mmdd: function(a,b) {
+ mtch = a[0].match(sorttable.DATE_RE);
+ y = mtch[3]; d = mtch[2]; m = mtch[1];
+ if (m.length == 1) m = '0'+m;
+ if (d.length == 1) d = '0'+d;
+ dt1 = y+m+d;
+ mtch = b[0].match(sorttable.DATE_RE);
+ y = mtch[3]; d = mtch[2]; m = mtch[1];
+ if (m.length == 1) m = '0'+m;
+ if (d.length == 1) d = '0'+d;
+ dt2 = y+m+d;
+ if (dt1==dt2) return 0;
+ if (dt1<dt2) return -1;
+ return 1;
+ },
+ sortWithNumber: function(a,b) {
+ amatch = a[0].match(/.*?(?=[0-9])/);
+ bmatch = b[0].match(/.*?(?=[0-9])/);
+ if (amatch && bmatch && amatch[0] == bmatch[0])
+ {
+ anumber = a[0].substring(amatch.length+1);
+ bnumber = b[0].substring(bmatch.length+1);
+ a2match = parseInt(anumber.match(/[0-9]*/));
+ b2match = parseInt(bnumber.match(/[0-9]*/));
+ if (a2match > b2match) return 1;
+ if (a2match < b2match) return -1;
+ }
+ if (a[0] == b[0]) return 0;
+ if (a[0] < b[0]) return -1;
+ return 1;
+ },
+ sort_ipaddr: function(a,b) {
+ aip = ip2ulong(a[0]);
+ bip = ip2ulong(b[0]);
+ if (aip && bip)
+ {
+ if (aip == bip) return 0;
+ if (aip < bip) return -1;
+ return 1;
+ } else {
+ if (aip !== false || bip !== false)
+ return aip === false ? -1 : 1;
+ else
+ {
+ return sorttable.sortWithNumber(a,b);
+ }
+ }
+ },
+
+ shaker_sort: function(list, comp_func) {
+ // A stable sort function to allow multi-level sorting of data
+ // see: http://en.wikipedia.org/wiki/Cocktail_sort
+ // thanks to Joseph Nahmias
+ var b = 0;
+ var t = list.length - 1;
+ var swap = true;
+
+ while(swap) {
+ swap = false;
+ for(var i = b; i < t; ++i) {
+ if ( comp_func(list[i], list[i+1]) > 0 ) {
+ var q = list[i]; list[i] = list[i+1]; list[i+1] = q;
+ swap = true;
+ }
+ } // for
+ t--;
+
+ if (!swap) break;
+
+ for(var i = t; i > b; --i) {
+ if ( comp_func(list[i], list[i-1]) < 0 ) {
+ var q = list[i]; list[i] = list[i-1]; list[i-1] = q;
+ swap = true;
+ }
+ } // for
+ b++;
+
+ } // while(swap)
+ }
+};
+
+/* ******************************************************************
+ Supporting functions: bundled here to avoid depending on a library
+ ****************************************************************** */
+
+function ip2ulong(ip) {
+ ip += "";
+ var ulip = false;
+ var octets = [];
+ ipportmatch = ip.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:[0-9]{1,5}\b/);// IP:port
+ if (ipportmatch) {
+ ipportmatch += "";
+ ipport = ipportmatch.split(':');
+ octets = ipport[0].split('.');
+ for (i=0; i < 4; i++) {
+ ulip += octets[i] * Math.pow(256, (5-i));
+ }
+ ulip += parseInt(ipport[1]);
+ } else {
+ ipmatch = ip.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/);// IP only
+ if (ipmatch) {
+ ipmatch+="";
+ octets = ipmatch.split('.');
+ for (i=0; i < 4; i++) {
+ ulip += octets[i] * Math.pow(256, (5-i));
+ }
+ }
+ }
+ return ulip;
+}
+
+// Dean Edwards/Matthias Miller/John Resig
+
+/* for Mozilla/Opera9 */
+if (document.addEventListener) {
+ document.addEventListener("DOMContentLoaded", sorttable.init, false);
+}
+
+/* for Safari */
+if (/WebKit/i.test(navigator.userAgent)) { // sniff
+ var _timer = setInterval(function() {
+ if (/loaded|complete/.test(document.readyState)) {
+ sorttable.init(); // call the onload handler
+ }
+ }, 10);
+}
+
+/* for other browsers */
+window.onload = sorttable.init;
+
+// written by Dean Edwards, 2005
+// with input from Tino Zijdel, Matthias Miller, Diego Perini
+
+// http://dean.edwards.name/weblog/2005/10/add-event/
+
+function dean_addEvent(element, type, handler) {
+ if (element.addEventListener) {
+ element.addEventListener(type, handler, false);
+ } else {
+ // assign each event handler a unique ID
+ if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++;
+ // create a hash table of event types for the element
+ if (!element.events) element.events = {};
+ // create a hash table of event handlers for each element/event pair
+ var handlers = element.events[type];
+ if (!handlers) {
+ handlers = element.events[type] = {};
+ // store the existing event handler (if there is one)
+ if (element["on" + type]) {
+ handlers[0] = element["on" + type];
+ }
+ }
+ // store the event handler in the hash table
+ handlers[handler.$$guid] = handler;
+ // assign a global event handler to do all the work
+ element["on" + type] = handleEvent;
+ }
+};
+// a counter used to create unique IDs
+dean_addEvent.guid = 1;
+
+function removeEvent(element, type, handler) {
+ if (element.removeEventListener) {
+ element.removeEventListener(type, handler, false);
+ } else {
+ // delete the event handler from the hash table
+ if (element.events && element.events[type]) {
+ delete element.events[type][handler.$$guid];
+ }
+ }
+};
+
+function handleEvent(event) {
+ var returnValue = true;
+ // grab the event object (IE uses a global event object)
+ event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
+ // get a reference to the hash table of event handlers
+ var handlers = this.events[event.type];
+ // execute each event handler
+ for (var i in handlers) {
+ this.$$handleEvent = handlers[i];
+ if (this.$$handleEvent(event) === false) {
+ returnValue = false;
+ }
+ }
+ return returnValue;
+};
+
+function fixEvent(event) {
+ // add W3C standard event methods
+ event.preventDefault = fixEvent.preventDefault;
+ event.stopPropagation = fixEvent.stopPropagation;
+ return event;
+};
+fixEvent.preventDefault = function() {
+ this.returnValue = false;
+};
+fixEvent.stopPropagation = function() {
+ this.cancelBubble = true;
+};
+
+// Dean's forEach: http://dean.edwards.name/base/forEach.js
+/*
+ forEach, version 1.0
+ Copyright 2006, Dean Edwards
+ License: http://www.opensource.org/licenses/mit-license.php
+*/
+
+// array-like enumeration
+if (!Array.forEach) { // mozilla already supports this
+ Array.forEach = function(array, block, context) {
+ for (var i = 0; i < array.length; i++) {
+ block.call(context, array[i], i, array);
+ }
+ };
+}
+
+// generic enumeration
+Function.prototype.forEach = function(object, block, context) {
+ for (var key in object) {
+ if (typeof this.prototype[key] == "undefined") {
+ block.call(context, object[key], key, object);
+ }
+ }
+};
+
+// character enumeration
+String.forEach = function(string, block, context) {
+ Array.forEach(string.split(""), function(chr, index) {
+ block.call(context, chr, index, string);
+ });
+};
+
+// globally resolve forEach enumeration
+var forEach = function(object, block, context) {
+ if (object) {
+ var resolve = Object; // default
+ if (object instanceof Function) {
+ // functions have a "length" property
+ resolve = Function;
+ } else if (object.forEach instanceof Function) {
+ // the object implements a custom forEach method so use that
+ object.forEach(block, context);
+ return;
+ } else if (typeof object == "string") {
+ // the object is a string
+ resolve = String;
+ } else if (typeof object.length == "number") {
+ // the object is array-like
+ resolve = Array;
+ }
+ resolve.forEach(object, block, context);
+ }
+};
+
diff --git a/src/usr/local/www/javascript/suggestions.js b/src/usr/local/www/javascript/suggestions.js
new file mode 100644
index 0000000..682a352
--- /dev/null
+++ b/src/usr/local/www/javascript/suggestions.js
@@ -0,0 +1,33 @@
+
+/**
+ * Provides suggestions for state names (USA).
+ * @class
+ * @scope public
+ */
+function StateSuggestions(text) {
+ this.states = text;
+}
+
+/**
+ * Request suggestions for the given autosuggest control.
+ * @scope protected
+ * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
+ */
+StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
+ bTypeAhead /*:boolean*/) {
+ var aSuggestions = [];
+ var sTextboxValue = oAutoSuggestControl.textbox.value;
+
+ if (sTextboxValue.length > 0){
+
+ //search for matching states
+ for (var i=0; i < this.states.length; i++) {
+ if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
+ aSuggestions.push(this.states[i]);
+ }
+ }
+ }
+
+ //provide suggestions to the control
+ oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
+};
diff --git a/src/usr/local/www/javascript/ticker.js b/src/usr/local/www/javascript/ticker.js
new file mode 100644
index 0000000..defb1d8
--- /dev/null
+++ b/src/usr/local/www/javascript/ticker.js
@@ -0,0 +1,73 @@
+/* $Id$ */
+/*
+ ticker.js
+ Copyright (C) 2012 Marcello Coutinho
+ Copyright (C) 2012 Carlos Cesario - carloscesario@gmail.com
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_MODULE: utils
+
+*/
+function notice_action(action,msgid) {
+ jQuery.ajax({
+ type: 'post',
+ cache: false,
+ url: 'index.php',
+ data: {closenotice: msgid},
+ success: function(response) {
+ jQuery('#menu_messages').html(response);
+ }
+ });
+}
+
+function pulsateText(elem) {
+ jQuery(elem).effect("pulsate", { times:12 }, 500);
+ jQuery(elem).effect("pulsate", { times:6 }, 1500);
+ jQuery(elem).effect("pulsate", { times:3 }, 2500);
+}
+
+jQuery(document).ready(function() {
+ pulsateText('#marquee-text');
+ jQuery('#marquee-text a').hover(function () {
+ jQuery(this).css('cursor','pointer');
+ });
+});
+
+function alias_popup(alias_id,theme,loading) {
+ domTT_update('ttalias_'+alias_id,"<a><img src='/themes/"+theme+"/images/misc/loader.gif'>"+loading+"</a>");
+ jQuery.ajax({
+ type: 'post',
+ cache: false,
+ url: "/index.php",
+ data: {aliasid:alias_id, act:'alias_info_popup'},
+ success: function(response) {
+ //alert('<div>'+response.match(/<h1>.*<\/table>/i)+'<div>');
+ domTT_update('ttalias_'+alias_id,'<div>'+response.match(/<h1>.*<\/table>/i)+'<div>');
+ }
+ });
+} \ No newline at end of file
diff --git a/src/usr/local/www/javascript/wizard/autosuggest.js b/src/usr/local/www/javascript/wizard/autosuggest.js
new file mode 100644
index 0000000..d9b5ac0
--- /dev/null
+++ b/src/usr/local/www/javascript/wizard/autosuggest.js
@@ -0,0 +1,337 @@
+
+/**
+ * An autosuggest textbox control.
+ * @class
+ * @scope public
+ */
+function AutoSuggestControl(oTextbox /*:HTMLInputElement*/,
+ oProvider /*:SuggestionProvider*/) {
+
+ /**
+ * The currently selected suggestions.
+ * @scope private
+ */
+ this.cur /*:int*/ = -1;
+
+ /**
+ * The dropdown list layer.
+ * @scope private
+ */
+ this.layer = null;
+
+ /**
+ * Suggestion provider for the autosuggest feature.
+ * @scope private.
+ */
+ this.provider /*:SuggestionProvider*/ = oProvider;
+
+ /**
+ * The textbox to capture.
+ * @scope private
+ */
+ this.textbox /*:HTMLInputElement*/ = oTextbox;
+
+ //initialize the control
+ this.init();
+
+}
+
+/**
+ * Autosuggests one or more suggestions for what the user has typed.
+ * If no suggestions are passed in, then no autosuggest occurs.
+ * @scope private
+ * @param aSuggestions An array of suggestion strings.
+ * @param bTypeAhead If the control should provide a type ahead suggestion.
+ */
+AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/,
+ bTypeAhead /*:boolean*/) {
+
+ //make sure there's at least one suggestion
+ if (aSuggestions.length > 0) {
+ if (bTypeAhead) {
+ this.typeAhead(aSuggestions[0]);
+ }
+
+ this.showSuggestions(aSuggestions);
+ } else {
+ this.hideSuggestions();
+ }
+};
+
+/**
+ * Creates the dropdown layer to display multiple suggestions.
+ * @scope private
+ */
+AutoSuggestControl.prototype.createDropDown = function () {
+
+ var oThis = this;
+
+ //create the layer and assign styles
+ this.layer = document.createElement("div");
+ this.layer.className = "suggestions";
+ this.layer.style.visibility = "hidden";
+ this.layer.style.width = this.textbox.offsetWidth;
+
+ //when the user clicks on the a suggestion, get the text (innerHTML)
+ //and place it into a textbox
+ this.layer.onmousedown =
+ this.layer.onmouseup =
+ this.layer.onmouseover = function (oEvent) {
+ oEvent = oEvent || window.event;
+ oTarget = oEvent.target || oEvent.srcElement;
+
+ if (oEvent.type == "mousedown") {
+ oThis.textbox.value = oTarget.firstChild.nodeValue;
+ oThis.hideSuggestions();
+ } else if (oEvent.type == "mouseover") {
+ oThis.highlightSuggestion(oTarget);
+ } else {
+ oThis.textbox.focus();
+ }
+ };
+
+
+ document.body.appendChild(this.layer);
+};
+
+/**
+ * Gets the left coordinate of the textbox.
+ * @scope private
+ * @return The left coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getLeft = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iLeft = 0;
+
+ while(oNode.tagName != "BODY") {
+ iLeft += oNode.offsetLeft;
+ oNode = oNode.offsetParent;
+ }
+
+ return iLeft;
+};
+
+/**
+ * Gets the top coordinate of the textbox.
+ * @scope private
+ * @return The top coordinate of the textbox in pixels.
+ */
+AutoSuggestControl.prototype.getTop = function () /*:int*/ {
+
+ var oNode = this.textbox;
+ var iTop = 0;
+
+ while(oNode.tagName != "BODY") {
+ iTop += oNode.offsetTop;
+ oNode = oNode.offsetParent;
+ }
+
+ return iTop;
+};
+
+/**
+ * Handles three keydown events.
+ * @scope private
+ * @param oEvent The event object for the keydown event.
+ */
+AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) {
+
+ switch(oEvent.keyCode) {
+ case 38: //up arrow
+ this.previousSuggestion();
+ break;
+ case 40: //down arrow
+ this.nextSuggestion();
+ break;
+ case 13: //enter
+ this.hideSuggestions();
+ break;
+ }
+
+};
+
+/**
+ * Handles keyup events.
+ * @scope private
+ * @param oEvent The event object for the keyup event.
+ */
+AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) {
+
+ var iKeyCode = oEvent.keyCode;
+
+ //for backspace (8) and delete (46), shows suggestions without typeahead
+ if (iKeyCode == 8 || iKeyCode == 46) {
+ this.provider.requestSuggestions(this, false);
+
+ //make sure not to interfere with non-character keys
+ } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) {
+ //ignore
+ } else {
+ //request suggestions from the suggestion provider with typeahead
+ this.provider.requestSuggestions(this, true);
+ }
+};
+
+/**
+ * Hides the suggestion dropdown.
+ * @scope private
+ */
+AutoSuggestControl.prototype.hideSuggestions = function () {
+ this.layer.style.visibility = "hidden";
+};
+
+/**
+ * Highlights the given node in the suggestions dropdown.
+ * @scope private
+ * @param oSuggestionNode The node representing a suggestion in the dropdown.
+ */
+AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) {
+
+ for (var i=0; i < this.layer.childNodes.length; i++) {
+ var oNode = this.layer.childNodes[i];
+ if (oNode == oSuggestionNode) {
+ oNode.className = "current";
+ } else if (oNode.className == "current") {
+ oNode.className = "";
+ }
+ }
+};
+
+/**
+ * Initializes the textbox with event handlers for
+ * auto suggest functionality.
+ * @scope private
+ */
+AutoSuggestControl.prototype.init = function () {
+
+ //save a reference to this object
+ var oThis = this;
+
+ //assign the onkeyup event handler
+ this.textbox.onkeyup = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyUp() method with the event object
+ oThis.handleKeyUp(oEvent);
+ };
+
+ //assign onkeydown event handler
+ this.textbox.onkeydown = function (oEvent) {
+
+ //check for the proper location of the event object
+ if (!oEvent) {
+ oEvent = window.event;
+ }
+
+ //call the handleKeyDown() method with the event object
+ oThis.handleKeyDown(oEvent);
+ };
+
+ //assign onblur event handler (hides suggestions)
+ this.textbox.onblur = function () {
+ oThis.hideSuggestions();
+ };
+
+ //create the suggestions dropdown
+ this.createDropDown();
+};
+
+/**
+ * Highlights the next suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.nextSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) {
+ var oNode = cSuggestionNodes[++this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Highlights the previous suggestion in the dropdown and
+ * places the suggestion into the textbox.
+ * @scope private
+ */
+AutoSuggestControl.prototype.previousSuggestion = function () {
+ var cSuggestionNodes = this.layer.childNodes;
+
+ if (cSuggestionNodes.length > 0 && this.cur > 0) {
+ var oNode = cSuggestionNodes[--this.cur];
+ this.highlightSuggestion(oNode);
+ this.textbox.value = oNode.firstChild.nodeValue;
+ }
+};
+
+/**
+ * Selects a range of text in the textbox.
+ * @scope public
+ * @param iStart The start index (base 0) of the selection.
+ * @param iLength The number of characters to select.
+ */
+AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) {
+
+ //use text ranges for Internet Explorer
+ if (this.textbox.createTextRange) {
+ var oRange = this.textbox.createTextRange();
+ oRange.moveStart("character", iStart);
+ oRange.moveEnd("character", iLength - this.textbox.value.length);
+ oRange.select();
+
+ //use setSelectionRange() for Mozilla
+ } else if (this.textbox.setSelectionRange) {
+ this.textbox.setSelectionRange(iStart, iLength);
+ }
+
+ //set focus back to the textbox
+ this.textbox.focus();
+};
+
+/**
+ * Builds the suggestion layer contents, moves it into position,
+ * and displays the layer.
+ * @scope private
+ * @param aSuggestions An array of suggestions for the control.
+ */
+AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) {
+
+ var oDiv = null;
+ this.layer.innerHTML = ""; //clear contents of the layer
+
+ for (var i=0; i < aSuggestions.length; i++) {
+ oDiv = document.createElement("div");
+ oDiv.appendChild(document.createTextNode(aSuggestions[i]));
+ this.layer.appendChild(oDiv);
+ }
+
+ this.layer.style.left = this.getLeft() + "px";
+ this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px";
+ this.layer.style.width = this.textbox.offsetWidth + "px";
+ this.layer.style.visibility = "visible";
+
+};
+
+/**
+ * Inserts a suggestion into the textbox, highlighting the
+ * suggested part of the text.
+ * @scope private
+ * @param sSuggestion The suggestion for the textbox.
+ */
+AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) {
+
+ //check for support of typeahead functionality
+ if (this.textbox.createTextRange || this.textbox.setSelectionRange){
+ var iLen = this.textbox.value.length;
+ this.textbox.value = sSuggestion;
+ this.selectRange(iLen, sSuggestion.length);
+ }
+};
+
diff --git a/src/usr/local/www/javascript/wizard/disablekeys.js b/src/usr/local/www/javascript/wizard/disablekeys.js
new file mode 100644
index 0000000..5d6c87a
--- /dev/null
+++ b/src/usr/local/www/javascript/wizard/disablekeys.js
@@ -0,0 +1,6 @@
+function kH(e) {
+ var pK = document.all? window.event.keyCode:e.which;
+ return pK != 13;
+}
+document.onkeypress = kH;
+if (document.layers) document.captureEvents(Event.KEYPRESS); \ No newline at end of file
diff --git a/src/usr/local/www/javascript/wizard/suggestions.js b/src/usr/local/www/javascript/wizard/suggestions.js
new file mode 100644
index 0000000..4d1e127
--- /dev/null
+++ b/src/usr/local/www/javascript/wizard/suggestions.js
@@ -0,0 +1,33 @@
+
+/**
+ * Provides suggestions for state names (USA).
+ * @class
+ * @scope public
+ */
+function StateSuggestions(text) {
+ this.states = text;
+}
+
+/**
+ * Request suggestions for the given autosuggest control.
+ * @scope protected
+ * @param oAutoSuggestControl The autosuggest control to provide suggestions for.
+ */
+StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/,
+ bTypeAhead /*:boolean*/) {
+ var aSuggestions = [];
+ var sTextboxValue = oAutoSuggestControl.textbox.value;
+
+ if (sTextboxValue.length > 0){
+
+ //search for matching states
+ for (var i=0; i < this.states.length; i++) {
+ if (this.states[i].toLowerCase().indexOf(sTextboxValue.toLowerCase()) == 0) {
+ aSuggestions.push(this.states[i]);
+ }
+ }
+ }
+
+ //provide suggestions to the control
+ oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead);
+};
diff --git a/src/usr/local/www/license.php b/src/usr/local/www/license.php
new file mode 100644
index 0000000..2247d6a
--- /dev/null
+++ b/src/usr/local/www/license.php
@@ -0,0 +1,133 @@
+<?php
+/* $Id$ */
+/*
+ license.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-system-license
+##|*NAME=System: License page
+##|*DESCR=Allow access to the 'System: License' page.
+##|*MATCH=license.php*
+##|-PRIV
+
+require("guiconfig.inc");
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+ <?php include("fbegin.inc"); ?>
+ <p class="pgtitle"><?=gettext("License");?></p>
+
+ <p><strong><?=$g['product_name'];?> <?=gettext("is Copyright");?> &copy; <?=$g['product_copyright_years'];?> <?=gettext("by");?> <?=$g['product_copyright'];?><br />
+ <?=gettext("All rights reserved");?>.</strong></p>
+
+ <p><strong><?=gettext("m0n0wall is Copyright ");?>&copy; <?=gettext("2002-2015 by Manuel Kasper");?>
+ (<a href="mailto:mk@neon1.net">mk@neon1.net</a>).<br />
+ <?=gettext("All rights reserved");?>.</strong></p>
+ <p> <?=gettext("Redistribution and use in source and binary forms, with or without");?><br />
+ <?=gettext("modification, are permitted provided that the following conditions are met");?>:<br />
+ <br />
+ <?=gettext("1. Redistributions of source code must retain the above copyright notice,");?><br />
+ <?=gettext("this list of conditions and the following disclaimer");?>.<br />
+ <br />
+ <?=gettext("2. Redistributions in binary form must reproduce the above copyright");?><br />
+ <?=gettext("notice, this list of conditions and the following disclaimer in the");?><br />
+ <?=gettext("documentation and/or other materials provided with the distribution.");?><br />
+ <br />
+ <strong><?=gettext("THIS SOFTWARE IS PROVIDED ");?>&quot;<?=gettext("AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,");?><br />
+ <?=gettext("INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY");?><br />
+ <?=gettext("AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE");?><br />
+ <?=gettext("AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,");?><br />
+ <?=gettext("OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF");?><br />
+ <?=gettext("SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS");?><br />
+ <?=gettext("INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN");?><br />
+ <?=gettext("CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)");?><br />
+ <?=gettext("ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE");?><br />
+ <?=gettext("POSSIBILITY OF SUCH DAMAGE");?></strong>.</p>
+ <hr size="1">
+ <p><?= "{$g['product_name']} " . gettext("is based upon/includes various free software packages, listed below.");?><br />
+ <?php printf(gettext("The authors of %s would like to thank the authors of these software packages for their efforts"), $g['product_name']);?>.</p>
+ <p>FreeBSD (<a href="http://www.freebsd.org" target="_blank">http://www.freebsd.org</a>)<br />
+ <?=gettext("Copyright");?> &copy;<?=gettext("1992-2015 The FreeBSD Project. All rights reserved");?>.<br />
+ <br />
+ <?=gettext("This product includes PHP, freely available from");?> <a href="http://www.php.net/" target="_blank">http://www.php.net</a>.<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1999-2015 The PHP Group. All rights reserved.");?>.<br />
+ <br />
+ <?=gettext("LightTPD"); ?> (<a href="http://www.lighttpd.net" target="_blank">http://www.lighttpd.net)</a><br />
+ <?=gettext("Copyright"); ?> &copy;<?=gettext("2004, Jan Knescke, incremental");?><jan@kneschke.de>
+ <?=gettext("All rights reserved.");?><br />
+ <br />
+ <?=gettext("ISC DHCP server ");?>(<a href="http://www.isc.org/products/DHCP/" target="_blank">http://www.isc.org/products/DHCP</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("2004-2012 Internet Software Consortium, Inc.");?><br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1995-2003 Internet Software Consortium");?><br />
+ <br />
+ <?=gettext("PF"); ?> (<a href="http://www.openbsd.org/faq/pf" target="_blank">http://www.openbsd.org</a>)<br />
+ <br />
+ <?=gettext("MPD - Multi-link PPP daemon for FreeBSD");?> (<a href="http://www.dellroad.org/mpd" target="_blank">http://www.dellroad.org/mpd</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 2003-2004, Archie L. Cobbs, Michael Bretterklieber, Alexander Motin<br />
+ <?=gettext("All rights reserved.");?><br />
+ <br />
+ <?=gettext("Circular log support for FreeBSD syslogd ");?>(<a href="http://software.wheelhouse.org/syslogd/" target="_blank">http://software.wheelhouse.org/syslogd/</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 2001 Jeff Wheelhouse (jdw@wwwi.com)<br />
+ <br />
+ <?=gettext("Dnsmasq - a DNS forwarder for NAT firewalls");?> (<a href="http://www.thekelleys.org.uk" target="_blank">http://www.thekelleys.org.uk</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 2000-2012 Simon Kelley.<br />
+ <br />
+ <?=gettext("IPsec-Tools"); ?> (<a href="http://ipsec-tools.sourceforge.net/" target="_blank">http://ipsec-tools.sourceforge.net/</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1995-2002 WIDE Project. All rights reserved.");?><br />
+ <br />
+ <?=gettext("msntp"); ?> (<a href="http://www.hpcf.cam.ac.uk/export" target="_blank">http://www.hpcf.cam.ac.uk/export</a>)<br />
+ <?=gettext("Copyright"); ?> &copy;<?=gettext(" 1996, 1997, 2000 N.M. Maclaren, University of Cambridge. ".
+ "All rights reserved.");?><br />
+ <br />
+ <?=gettext("UCD-SNMP"); ?> (<a href="http://www.ece.ucdavis.edu/ucd-snmp" target="_blank">http://www.ece.ucdavis.edu/ucd-snmp</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1989, 1991, 1992 by Carnegie Mellon University.");?><br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("1996, 1998-2000 The Regents of the University of California. All rights reserved");?>.<br />
+ <?=gettext("Copyright"); ?> &copy; <?=gettext("2001-2002, Network Associates Technology, Inc. All rights reserved.");?><br />
+ <?=gettext("Portions of this code are copyright");?> &copy; <?=gettext("2001-2002, Cambridge Broadband Ltd. All rights reserved.");?><br />
+ <br />
+ <?=gettext("choparp"); ?> (<a href="http://choparp.sourceforge.net/" target="_blank">http://choparp.sourceforge.net</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 1997 Takamichi Tateoka (tree@mma.club.uec.ac.jp)<br />
+ <?=gettext("Copyright"); ?> &copy; 2002 Thomas Quinot (thomas@cuivre.fr.eu.org)<br />
+ <br />
+ <?=gettext("php-radius"); ?> (<a href="http://www.mavetju.org/programming/php.php" target="_blank">http://www.mavetju.org/programming/php.php</a>)<br />
+ <?=gettext("Copyright 2000, 2001, 2002 by Edwin Groothuis. All rights reserved.");?><br />
+ <?=gettext("This product includes software developed by Edwin Groothuis.");?><br />
+ <br />
+ <?=gettext("wol"); ?> (<a href="http://ahh.sourceforge.net/wol" target="_blank">http://ahh.sourceforge.net/wol</a>)<br />
+ <?=gettext("Copyright"); ?> &copy; 2000,2001,2002,2003,2004 Thomas Krennwallner &lt;krennwallner@aon.at&gt;
+ <br />
+ <?=gettext("OpenVPN"); ?> (<a href="http://openvpn.net/" target="_blank">http://openvpn.net/</a>)
+ <?=gettext("Copyright (C) 2002-2005 OpenVPN Solutions LLC ");?>
+ </p>
+ <?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/load_balancer_monitor.php b/src/usr/local/www/load_balancer_monitor.php
new file mode 100644
index 0000000..87884e5
--- /dev/null
+++ b/src/usr/local/www/load_balancer_monitor.php
@@ -0,0 +1,138 @@
+<?php
+/* $Id$ */
+/*
+ load_balancer_monitor.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Bill Marquette <bill.marquette@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-services-loadbalancer-monitor
+##|*NAME=Services: Load Balancer: Monitors page
+##|*DESCR=Allow access to the 'Services: Load Balancer: Monitors' page.
+##|*MATCH=load_balancer_monitor.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("util.inc");
+
+if (!is_array($config['load_balancer']['monitor_type'])) {
+ $config['load_balancer']['monitor_type'] = array();
+}
+$a_monitor = &$config['load_balancer']['monitor_type'];
+
+if ($_POST) {
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval |= filter_configure();
+ $retval |= relayd_configure();
+
+ $savemsg = get_std_save_message($retval);
+ clear_subsystem_dirty('loadbalancer');
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if (array_key_exists($_GET['id'], $a_monitor)) {
+ /* make sure no pools reference this entry */
+ if (is_array($config['load_balancer']['lbpool'])) {
+ foreach ($config['load_balancer']['lbpool'] as $pool) {
+ if ($pool['monitor'] == $a_monitor[$_GET['id']]['name']) {
+ $input_errors[] = gettext("This entry cannot be deleted because it is still referenced by at least one pool.");
+ break;
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ unset($a_monitor[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('loadbalancer');
+ header("Location: load_balancer_monitor.php");
+ exit;
+ }
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Monitor"));
+$shortcut_section = "relayd";
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="load_balancer_monitor.php" method="post">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
+<?php print_info_box_np(gettext("The load balancer configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer monitor">
+ <tr><td class="tabnavtbl">
+ <?php
+ /* active tabs */
+ $tab_array = array();
+ $tab_array[] = array(gettext("Pools"), false, "load_balancer_pool.php");
+ $tab_array[] = array(gettext("Virtual Servers"), false, "load_balancer_virtual_server.php");
+ $tab_array[] = array(gettext("Monitors"), true, "load_balancer_monitor.php");
+ $tab_array[] = array(gettext("Settings"), false, "load_balancer_setting.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+<?php
+ $t = new MainTable();
+ $t->edit_uri('load_balancer_monitor_edit.php');
+ $t->my_uri('load_balancer_monitor.php');
+ $t->add_column(gettext('Name'), 'name', 20);
+ $t->add_column(gettext('Type'), 'type', 10);
+ $t->add_column(gettext('Description'), 'descr', 30);
+ $t->add_button('edit');
+ $t->add_button('dup');
+ $t->add_button('del');
+ $t->add_content_array($a_monitor);
+ $t->display();
+?>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/load_balancer_monitor_edit.php b/src/usr/local/www/load_balancer_monitor_edit.php
new file mode 100644
index 0000000..532136b
--- /dev/null
+++ b/src/usr/local/www/load_balancer_monitor_edit.php
@@ -0,0 +1,390 @@
+<?php
+/* $Id$ */
+/*
+ load_balancer_monitor_edit.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2008 Bill Marquette <bill.marquette@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-services-loadbalancer-monitor-edit
+##|*NAME=Services: Load Balancer: Monitor: Edit page
+##|*DESCR=Allow access to the 'Services: Load Balancer: Monitor: Edit' page.
+##|*MATCH=load_balancer_monitor_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_monitor.php');
+}
+
+if (!is_array($config['load_balancer']['monitor_type'])) {
+ $config['load_balancer']['monitor_type'] = array();
+}
+$a_monitor = &$config['load_balancer']['monitor_type'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_monitor[$id]) {
+ $pconfig['name'] = $a_monitor[$id]['name'];
+ $pconfig['type'] = $a_monitor[$id]['type'];
+ $pconfig['descr'] = $a_monitor[$id]['descr'];
+ $pconfig['options'] = array();
+ $pconfig['options'] = $a_monitor[$id]['options'];
+} else {
+ /* Some sane page defaults */
+ $pconfig['options']['path'] = '/';
+ $pconfig['options']['code'] = 200;
+}
+
+$changedesc = gettext("Load Balancer: Monitor:") . " ";
+$changecount = 0;
+
+if ($_POST) {
+ $changecount++;
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* turn $_POST['http_options_*'] into $pconfig['options'][*] */
+ foreach ($_POST as $key => $val) {
+ if (stristr($key, 'options') !== false) {
+ if (stristr($key, $pconfig['type'].'_') !== false) {
+ $opt = explode('_', $key);
+ $pconfig['options'][$opt[2]] = $val;
+ }
+ unset($pconfig[$key]);
+ }
+ }
+
+ /* input validation */
+ $reqdfields = explode(" ", "name type descr");
+ $reqdfieldsn = array(gettext("Name"), gettext("Type"), gettext("Description"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ /* Ensure that our monitor names are unique */
+ for ($i = 0; isset($config['load_balancer']['monitor_type'][$i]); $i++) {
+ if (($_POST['name'] == $config['load_balancer']['monitor_type'][$i]['name']) && ($i != $id)) {
+ $input_errors[] = gettext("This monitor name has already been used. Monitor names must be unique.");
+ }
+ }
+
+ if (preg_match('/[ \/]/', $_POST['name'])) {
+ $input_errors[] = gettext("You cannot use spaces or slashes in the 'name' field.");
+ }
+
+ if (strlen($_POST['name']) > 16) {
+ $input_errors[] = gettext("The 'name' field must be 16 characters or less.");
+ }
+
+ switch ($_POST['type']) {
+ case 'icmp': {
+ break;
+ }
+ case 'tcp': {
+ break;
+ }
+ case 'http':
+ case 'https': {
+ if (is_array($pconfig['options'])) {
+ if (isset($pconfig['options']['host']) && $pconfig['options']['host'] != "") {
+ if (!is_hostname($pconfig['options']['host'])) {
+ $input_errors[] = gettext("The hostname can only contain the characters A-Z, 0-9 and '-'.");
+ }
+ }
+ if (isset($pconfig['options']['code']) && $pconfig['options']['code'] != "") {
+ // Check code
+ if (!is_rfc2616_code($pconfig['options']['code'])) {
+ $input_errors[] = gettext("HTTP(s) codes must be from RFC2616.");
+ }
+ }
+ if (!isset($pconfig['options']['path']) || $pconfig['options']['path'] == "") {
+ $input_errors[] = gettext("The path to monitor must be set.");
+ }
+ }
+ break;
+ }
+ case 'send': {
+ if (is_array($pconfig['options'])) {
+ if (isset($pconfig['options']['send']) && $pconfig['options']['send'] != "") {
+ // Check send
+ }
+ if (isset($pconfig['options']['expect']) && $pconfig['options']['expect'] != "") {
+ // Check expect
+ }
+ }
+ break;
+ }
+ }
+
+ if (!$input_errors) {
+ $monent = array();
+ if (isset($id) && $a_monitor[$id]) {
+ $monent = $a_monitor[$id];
+ }
+ if ($monent['name'] != "") {
+ $changedesc .= " " . sprintf(gettext("modified '%s' monitor:"), $monent['name']);
+ }
+
+ update_if_changed("name", $monent['name'], $pconfig['name']);
+ update_if_changed("type", $monent['type'], $pconfig['type']);
+ update_if_changed("description", $monent['descr'], $pconfig['descr']);
+ if ($pconfig['type'] == "http" || $pconfig['type'] == "https") {
+ /* log updates, then clear array and reassign - dumb, but easiest way to have a clear array */
+ update_if_changed("path", $monent['options']['path'], $pconfig['options']['path']);
+ update_if_changed("host", $monent['options']['host'], $pconfig['options']['host']);
+ update_if_changed("code", $monent['options']['code'], $pconfig['options']['code']);
+ $monent['options'] = array();
+ $monent['options']['path'] = $pconfig['options']['path'];
+ $monent['options']['host'] = $pconfig['options']['host'];
+ $monent['options']['code'] = $pconfig['options']['code'];
+ }
+ if ($pconfig['type'] == "send") {
+ /* log updates, then clear array and reassign - dumb, but easiest way to have a clear array */
+ update_if_changed("send", $monent['options']['send'], $pconfig['options']['send']);
+ update_if_changed("expect", $monent['options']['expect'], $pconfig['options']['expect']);
+ $monent['options'] = array();
+ $monent['options']['send'] = $pconfig['options']['send'];
+ $monent['options']['expect'] = $pconfig['options']['expect'];
+ }
+ if ($pconfig['type'] == "tcp" || $pconfig['type'] == "icmp") {
+ $monent['options'] = array();
+ }
+
+ if (isset($id) && $a_monitor[$id]) {
+ /* modify all pools with this name */
+ for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
+ if ($config['load_balancer']['lbpool'][$i]['monitor'] == $a_monitor[$id]['name']) {
+ $config['load_balancer']['lbpool'][$i]['monitor'] = $monent['name'];
+ }
+ }
+ $a_monitor[$id] = $monent;
+ } else {
+ $a_monitor[] = $monent;
+ }
+
+ if ($changecount > 0) {
+ /* Mark config dirty */
+ mark_subsystem_dirty('loadbalancer');
+ write_config($changedesc);
+ }
+
+ header("Location: load_balancer_monitor.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Monitor"), gettext("Edit"));
+$shortcut_section = "relayd";
+
+include("head.inc");
+$types = array("icmp" => gettext("ICMP"), "tcp" => gettext("TCP"), "http" => gettext("HTTP"), "https" => gettext("HTTPS"), "send" => gettext("Send/Expect"));
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+function updateType(t) {
+ switch (t) {
+<?php
+ /* OK, so this is sick using php to generate javascript, but it needed to be done */
+ foreach ($types as $key => $val) {
+ echo " case \"{$key}\": {\n";
+ $t = $types;
+ foreach ($t as $k => $v) {
+ if ($k != $key) {
+ echo " jQuery('#{$k}').hide();\n";
+ }
+ }
+ echo " }\n";
+ }
+?>
+ }
+ jQuery('#' + t).show();
+}
+//]]>
+</script>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<form action="load_balancer_monitor_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="monitor entry">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Load Balancer - Monitor entry"); ?></td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="name" type="text" <?if (isset($pconfig['name'])) echo "value=\"" . htmlspecialchars($pconfig['name']) . "\"";?> size="16" maxlength="16" />
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="descr" type="text" <?if (isset($pconfig['descr'])) echo "value=\"" . htmlspecialchars($pconfig['descr']) . "\"";?> size="64" />
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Type"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <select id="type" name="type">
+<?
+ foreach ($types as $key => $val) {
+ if (isset($pconfig['type']) && $pconfig['type'] == $key) {
+ $selected = " selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ echo "<option value=\"{$key}\" onclick=\"updateType('{$key}');\"{$selected}>{$val}</option>\n";
+ }
+?>
+ </select>
+ </td>
+ </tr>
+ <tr align="left" id="icmp"<?= $pconfig['type'] == "icmp" ? "" : " style=\"display:none;\""?>>
+ <td></td>
+ </tr>
+ <tr align="left" id="tcp"<?= $pconfig['type'] == "tcp" ? "" : " style=\"display:none;\""?>>
+ <td></td>
+ </tr>
+ <tr align="left" id="http"<?= $pconfig['type'] == "http" ? "" : " style=\"display:none;\""?>>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("HTTP"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="http">
+ <tr align="left">
+ <td valign="top" align="right" class="vtable"><?=gettext("Path"); ?></td>
+ <td class="vtable" colspan="2">
+ <input name="http_options_path" type="text" <?if (isset($pconfig['options']['path'])) echo "value=\"" . htmlspecialchars($pconfig['options']['path']) . "\"";?> size="64" />
+ </td>
+ </tr>
+ <tr align="left">
+ <td valign="top" align="right" class="vtable"><?=gettext("Host"); ?></td>
+ <td class="vtable" colspan="2">
+ <input name="http_options_host" type="text" <?if (isset($pconfig['options']['host'])) echo "value=\"" . htmlspecialchars($pconfig['options']['host']) . "\"";?> size="64" /><br /><?=gettext("Hostname for Host: header if needed."); ?>
+ </td>
+ </tr>
+ <tr align="left">
+ <td valign="top" align="right" class="vtable"><?=gettext("HTTP Code"); ?></td>
+ <td class="vtable" colspan="2">
+ <?= print_rfc2616_select("http_options_code", $pconfig['options']['code']); ?>
+ </td>
+ </tr>
+<!-- BILLM: XXX not supported digest checking just yet
+ <tr align="left">
+ <td width="22%" valign="top" class="vncell">MD5 Page Digest</td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="digest" type="text" <?if (isset($pconfig['digest'])) echo "value=\"" . htmlspecialchars($pconfig['digest']) . "\"";?>size="32"><br /><b>TODO: add fetch functionality here</b>
+ </td>
+ </tr>
+-->
+ </table>
+ </td>
+ </tr>
+ <tr align="left" id="https"<?= $pconfig['type'] == "https" ? "" : " style=\"display:none;\""?>>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("HTTPS"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="https">
+ <tr align="left">
+ <td valign="top" align="right" class="vtable"><?=gettext("Path"); ?></td>
+ <td class="vtable" colspan="2">
+ <input name="https_options_path" type="text" <?if (isset($pconfig['options']['path'])) echo "value=\"" . htmlspecialchars($pconfig['options']['path']) ."\"";?> size="64" />
+ </td>
+ </tr>
+ <tr align="left">
+ <td valign="top" align="right" class="vtable"><?=gettext("Host"); ?></td>
+ <td class="vtable" colspan="2">
+ <input name="https_options_host" type="text" <?if (isset($pconfig['options']['host'])) echo "value=\"" . htmlspecialchars($pconfig['options']['host']) . "\"";?> size="64" /><br /><?=gettext("Hostname for Host: header if needed."); ?>
+ </td>
+ </tr>
+ <tr align="left">
+ <td valign="top" align="right" class="vtable"><?=gettext("HTTP Code"); ?></td>
+ <td class="vtable" colspan="2">
+ <?= print_rfc2616_select("https_options_code", $pconfig['options']['code']); ?>
+ </td>
+ </tr>
+<!-- BILLM: XXX not supported digest checking just yet
+
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq">MD5 Page Digest</td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="digest" type="text" <?if (isset($pconfig['digest'])) echo "value=\"" . htmlspecialchars($pconfig['digest']) . "\"";?>size="32"><br /><b>TODO: add fetch functionality here</b>
+ </td>
+ </tr>
+-->
+ </table>
+ </td>
+ </tr>
+ <tr align="left" id="send"<?= $pconfig['type'] == "send" ? "" : " style=\"display:none;\""?>>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Send/Expect"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="send expect">
+ <tr align="left">
+ <td valign="top" align="right" class="vtable"><?=gettext("Send string"); ?></td>
+ <td class="vtable" colspan="2">
+ <input name="send_options_send" type="text" <?if (isset($pconfig['options']['send'])) echo "value=\"" . htmlspecialchars($pconfig['options']['send']) . "\"";?> size="64" />
+ </td>
+ </tr>
+ <tr align="left">
+ <td valign="top" align="right" class="vtable"><?=gettext("Expect string"); ?></td>
+ <td class="vtable" colspan="2">
+ <input name="send_options_expect" type="text" <?if (isset($pconfig['options']['expect'])) echo "value=\"" . htmlspecialchars($pconfig['options']['expect']) . "\"";?> size="64" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_monitor[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<br />
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/load_balancer_pool.php b/src/usr/local/www/load_balancer_pool.php
new file mode 100644
index 0000000..47f3a89
--- /dev/null
+++ b/src/usr/local/www/load_balancer_pool.php
@@ -0,0 +1,159 @@
+<?php
+/* $Id$ */
+/*
+ load_balancer_pool.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-loadbalancer-pool
+##|*NAME=Load Balancer: Pool page
+##|*DESCR=Allow access to the 'Load Balancer: Pool' page.
+##|*MATCH=load_balancer_pool.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+if (!is_array($config['load_balancer']['lbpool'])) {
+ $config['load_balancer']['lbpool'] = array();
+}
+$a_pool = &$config['load_balancer']['lbpool'];
+
+
+if ($_POST) {
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval |= filter_configure();
+ $retval |= relayd_configure();
+
+ $savemsg = get_std_save_message($retval);
+ clear_subsystem_dirty('loadbalancer');
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if (array_key_exists($_GET['id'], $a_pool)) {
+ /* make sure no virtual servers reference this entry */
+ if (is_array($config['load_balancer']['virtual_server'])) {
+ foreach ($config['load_balancer']['virtual_server'] as $vs) {
+ if ($vs['poolname'] == $a_pool[$_GET['id']]['name']) {
+ $input_errors[] = gettext("This entry cannot be deleted because it is still referenced by at least one virtual server.");
+ break;
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ unset($a_pool[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('loadbalancer');
+ header("Location: load_balancer_pool.php");
+ exit;
+ }
+ }
+}
+
+/* Index monitor_type array for easy hyperlinking */
+$mondex = array();
+for ($i = 0; isset($config['load_balancer']['monitor_type'][$i]); $i++) {
+ $mondex[$config['load_balancer']['monitor_type'][$i]['name']] = $i;
+}
+for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
+ $a_pool[$i]['monitor'] = "<a href=\"/load_balancer_monitor_edit.php?id={$mondex[$a_pool[$i]['monitor']]}\">" . htmlspecialchars($a_pool[$i]['monitor']) . "</a>";
+}
+
+$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Pool"));
+$shortcut_section = "relayd";
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="load_balancer_pool.php" method="post">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
+<?php print_info_box_np(sprintf(gettext("The load balancer configuration has been changed%sYou must apply the changes in order for them to take effect."), "<br />"));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer pools">
+ <tr><td class="tabnavtbl">
+ <?php
+ /* active tabs */
+ $tab_array = array();
+ $tab_array[] = array(gettext("Pools"), true, "load_balancer_pool.php");
+ $tab_array[] = array(gettext("Virtual Servers"), false, "load_balancer_virtual_server.php");
+ $tab_array[] = array(gettext("Monitors"), false, "load_balancer_monitor.php");
+ $tab_array[] = array(gettext("Settings"), false, "load_balancer_setting.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+<?php
+ $t = new MainTable();
+ $t->edit_uri('load_balancer_pool_edit.php');
+ $t->my_uri('load_balancer_pool.php');
+ $t->add_column(gettext('Name'), 'name', 10);
+ $t->add_column(gettext('Mode'), 'mode', 10);
+ $t->add_column(gettext('Servers'), 'servers', 15);
+ $t->add_column(gettext('Port'), 'port', 10);
+ $t->add_column(gettext('Monitor'), 'monitor', 10);
+ $t->add_column(gettext('Description'), 'descr', 25);
+ $t->add_button('edit');
+ $t->add_button('dup');
+ $t->add_button('del');
+ $t->add_content_array($a_pool);
+ $t->display();
+?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <br />
+ <span class="red"><strong><?=gettext("Hint:");?></strong></span>
+ <br />
+ <?= sprintf(gettext("The Load Balancer in %s 2.0 is for server load balancing, not Multi-WAN. For load balancing or failover for multiple WANs, use "), $g['product_name']);?>
+ <a href="/system_gateway_groups.php"><?= gettext("Gateway Groups"); ?></a>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/load_balancer_pool_edit.php b/src/usr/local/www/load_balancer_pool_edit.php
new file mode 100644
index 0000000..cf5c72f
--- /dev/null
+++ b/src/usr/local/www/load_balancer_pool_edit.php
@@ -0,0 +1,368 @@
+<?php
+/* $Id$ */
+/*
+ load_balancer_pool_edit.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-loadbalancer-pool-edit
+##|*NAME=Load Balancer: Pool: Edit page
+##|*DESCR=Allow access to the 'Load Balancer: Pool: Edit' page.
+##|*MATCH=load_balancer_pool_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter.inc");
+require_once("util.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_pool.php');
+}
+
+if (!is_array($config['load_balancer']['lbpool'])) {
+ $config['load_balancer']['lbpool'] = array();
+}
+$a_pool = &$config['load_balancer']['lbpool'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_pool[$id]) {
+ $pconfig['name'] = $a_pool[$id]['name'];
+ $pconfig['mode'] = $a_pool[$id]['mode'];
+ $pconfig['descr'] = $a_pool[$id]['descr'];
+ $pconfig['port'] = $a_pool[$id]['port'];
+ $pconfig['retry'] = $a_pool[$id]['retry'];
+ $pconfig['servers'] = &$a_pool[$id]['servers'];
+ $pconfig['serversdisabled'] = &$a_pool[$id]['serversdisabled'];
+ $pconfig['monitor'] = $a_pool[$id]['monitor'];
+}
+
+$changedesc = gettext("Load Balancer: Pool:") . " ";
+$changecount = 0;
+
+if ($_POST) {
+ $changecount++;
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "name mode port monitor servers");
+ $reqdfieldsn = array(gettext("Name"), gettext("Mode"), gettext("Port"), gettext("Monitor"), gettext("Server List"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ /* Ensure that our pool names are unique */
+ for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
+ if (($_POST['name'] == $config['load_balancer']['lbpool'][$i]['name']) && ($i != $id)) {
+ $input_errors[] = gettext("This pool name has already been used. Pool names must be unique.");
+ }
+ }
+
+ if (preg_match('/[ \/]/', $_POST['name'])) {
+ $input_errors[] = gettext("You cannot use spaces or slashes in the 'name' field.");
+ }
+
+ if (strlen($_POST['name']) > 16) {
+ $input_errors[] = gettext("The 'name' field must be 16 characters or less.");
+ }
+
+ if (in_array($_POST['name'], $reserved_table_names)) {
+ $input_errors[] = sprintf(gettext("The name '%s' is a reserved word and cannot be used."), $_POST['name']);
+ }
+
+ if (is_alias($_POST['name'])) {
+ $input_errors[] = sprintf(gettext("Sorry, an alias is already named %s."), $_POST['name']);
+ }
+
+ if (!is_portoralias($_POST['port'])) {
+ $input_errors[] = gettext("The port must be an integer between 1 and 65535, or a port alias.");
+ }
+
+ // May as well use is_port as we want a positive integer and such.
+ if (!empty($_POST['retry']) && !is_port($_POST['retry'])) {
+ $input_errors[] = gettext("The retry value must be an integer between 1 and 65535.");
+ }
+
+ if (is_array($_POST['servers'])) {
+ foreach ($pconfig['servers'] as $svrent) {
+ if (!is_ipaddr($svrent) && !is_subnetv4($svrent)) {
+ $input_errors[] = sprintf(gettext("%s is not a valid IP address or IPv4 subnet (in \"enabled\" list)."), $svrent);
+ } else if (is_subnetv4($svrent) && subnet_size($svrent) > 64) {
+ $input_errors[] = sprintf(gettext("%s is a subnet containing more than 64 IP addresses (in \"enabled\" list)."), $svrent);
+ }
+ }
+ }
+ if (is_array($_POST['serversdisabled'])) {
+ foreach ($pconfig['serversdisabled'] as $svrent) {
+ if (!is_ipaddr($svrent) && !is_subnetv4($svrent)) {
+ $input_errors[] = sprintf(gettext("%s is not a valid IP address or IPv4 subnet (in \"disabled\" list)."), $svrent);
+ } else if (is_subnetv4($svrent) && subnet_size($svrent) > 64) {
+ $input_errors[] = sprintf(gettext("%s is a subnet containing more than 64 IP addresses (in \"disabled\" list)."), $svrent);
+ }
+ }
+ }
+ $m = array();
+ for ($i = 0; isset($config['load_balancer']['monitor_type'][$i]); $i++) {
+ $m[$config['load_balancer']['monitor_type'][$i]['name']] = $config['load_balancer']['monitor_type'][$i];
+ }
+
+ if (!isset($m[$_POST['monitor']])) {
+ $input_errors[] = gettext("Invalid monitor chosen.");
+ }
+
+ if (!$input_errors) {
+ $poolent = array();
+ if (isset($id) && $a_pool[$id]) {
+ $poolent = $a_pool[$id];
+ }
+ if ($poolent['name'] != "") {
+ $changedesc .= sprintf(gettext(" modified '%s' pool:"), $poolent['name']);
+ }
+
+ update_if_changed("name", $poolent['name'], $_POST['name']);
+ update_if_changed("mode", $poolent['mode'], $_POST['mode']);
+ update_if_changed("description", $poolent['descr'], $_POST['descr']);
+ update_if_changed("port", $poolent['port'], $_POST['port']);
+ update_if_changed("retry", $poolent['retry'], $_POST['retry']);
+ update_if_changed("servers", $poolent['servers'], $_POST['servers']);
+ update_if_changed("serversdisabled", $poolent['serversdisabled'], $_POST['serversdisabled']);
+ update_if_changed("monitor", $poolent['monitor'], $_POST['monitor']);
+
+ if (isset($id) && $a_pool[$id]) {
+ /* modify all virtual servers with this name */
+ for ($i = 0; isset($config['load_balancer']['virtual_server'][$i]); $i++) {
+ if ($config['load_balancer']['virtual_server'][$i]['lbpool'] == $a_pool[$id]['name']) {
+ $config['load_balancer']['virtual_server'][$i]['lbpool'] = $poolent['name'];
+ }
+ }
+ $a_pool[$id] = $poolent;
+ } else {
+ $a_pool[] = $poolent;
+ }
+
+ if ($changecount > 0) {
+ /* Mark pool dirty */
+ mark_subsystem_dirty('loadbalancer');
+ write_config($changedesc);
+ }
+
+ header("Location: load_balancer_pool.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Pool"), gettext("Edit"));
+$shortcut_section = "relayd";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+function clearcombo() {
+ for (var i = document.iform.serversSelect.options.length - 1; i >= 0; i--) {
+ document.iform.serversSelect.options[i] = null;
+ }
+ document.iform.serversSelect.selectedIndex = -1;
+}
+//]]>
+</script>
+
+<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
+<script type="text/javascript" src="/javascript/suggestions.js"></script>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<form action="load_balancer_pool_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="load balancer pool entry">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Add/edit Load Balancer - Pool entry"); ?></td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="name" type="text" <?if (isset($pconfig['name'])) echo "value=\"" . htmlspecialchars($pconfig['name']) . "\"";?> size="16" maxlength="16" />
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Mode"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <select id="mode" name="mode" onchange="enforceFailover(); checkPoolControls();">
+ <option value="loadbalance" <?if (!isset($pconfig['mode']) || ($pconfig['mode'] == "loadbalance")) echo "selected=\"selected\"";?>><?=gettext("Load Balance");?></option>
+ <option value="failover" <?if ($pconfig['mode'] == "failover") echo "selected=\"selected\"";?>><?=gettext("Manual Failover");?></option>
+ </select>
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="descr" type="text" <?if (isset($pconfig['descr'])) echo "value=\"" . htmlspecialchars($pconfig['descr']) . "\"";?> size="64" />
+ </td>
+ </tr>
+
+ <tr align="left">
+ <td width="22%" valign="top" id="monitorport_text" class="vncellreq"><?=gettext("Port"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input class="formfldalias" id="port" name="port" type="text" <?if (isset($pconfig['port'])) echo "value=\"" . htmlspecialchars($pconfig['port']) . "\"";?> size="16" maxlength="16" /><br />
+ <div id="monitorport_desc">
+ <?=gettext("This is the port your servers are listening on."); ?><br />
+ <?=gettext("You may also specify a port alias listed in Firewall -&gt; Aliases here."); ?>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ var addressarray = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
+ var oTextbox1 = new AutoSuggestControl(document.getElementById("port"), new StateSuggestions(addressarray));
+ //]]>
+ </script>
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" id="retry_text" class="vncell"><?=gettext("Retry"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="retry" type="text" <?if (isset($pconfig['retry'])) echo "value=\"" . htmlspecialchars($pconfig['retry']) . "\"";?> size="16" maxlength="16" /><br />
+ <div id="retry_desc"><?=gettext("Optionally specify how many times to retry checking a server before declaring it down."); ?></div>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Add item to pool"); ?></td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Monitor"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <?php if (count($config['load_balancer']['monitor_type'])): ?>
+ <select id="monitor" name="monitor">
+ <?php
+ foreach ($config['load_balancer']['monitor_type'] as $monitor) {
+ if ($monitor['name'] == $pconfig['monitor']) {
+ $selected=" selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ echo "<option value=\"{$monitor['name']}\"{$selected}>{$monitor['name']}</option>";
+ }
+ ?>
+ </select>
+ <?php else: ?>
+ <b><?=gettext("NOTE"); ?>:</b> <?=gettext("Please add a monitor IP address on the monitors tab if you wish to use this feature."); ?>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server IP Address"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="ipaddr" type="text" size="16" style="float: left;" />
+ <input class="formbtn" type="button" name="button1" value="<?=gettext("Add to pool"); ?>" onclick="AddServerToPool(document.iform); enforceFailover(); checkPoolControls();" /><br />
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Current Pool Members"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Members"); ?></td>
+ <td width="78%" class="vtable" colspan="2" valign="top">
+ <table summary="members">
+ <tbody>
+ <tr>
+ <td align="center">
+ <b><?=gettext("Pool Disabled"); ?></b>
+ <br/>
+ <select id="serversDisabledSelect" name="serversdisabled[]" multiple="multiple" size="5">
+<?php
+ if (is_array($pconfig['serversdisabled'])) {
+ foreach ($pconfig['serversdisabled'] as $svrent) {
+ if ($svrent != '') echo " <option value=\"{$svrent}\">{$svrent}</option>\n";
+ }
+ }
+?>
+ </select>
+ <input class="formbtn" type="button" name="removeDisabled" value="<?=gettext("Remove"); ?>" onclick="RemoveServerFromPool(document.iform, 'serversdisabled[]');" />
+ </td>
+
+ <td valign="middle">
+ <input class="formbtn" type="button" id="moveToEnabled" name="moveToEnabled" value=">" onclick="moveOptions(document.iform.serversDisabledSelect, document.iform.serversSelect); checkPoolControls();" /><br />
+ <input class="formbtn" type="button" id="moveToDisabled" name="moveToDisabled" value="<" onclick="moveOptions(document.iform.serversSelect, document.iform.serversDisabledSelect); checkPoolControls();" />
+ </td>
+
+ <td align="center">
+ <b><?=gettext("Enabled (default)"); ?></b>
+ <br/>
+ <select id="serversSelect" name="servers[]" multiple="multiple" size="5">
+<?php
+ if (is_array($pconfig['servers'])) {
+ foreach ($pconfig['servers'] as $svrent) {
+ echo " <option value=\"{$svrent}\">{$svrent}</option>\n";
+ }
+ }
+?>
+ </select>
+ <input class="formbtn" type="button" name="removeEnabled" value="<?=gettext("Remove"); ?>" onclick="RemoveServerFromPool(document.iform, 'servers[]');" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <br />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="AllServers('serversSelect', true); AllServers('serversDisabledSelect', true);" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_pool[$id] && $_GET['act'] != 'dup'): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<br />
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/load_balancer_setting.php b/src/usr/local/www/load_balancer_setting.php
new file mode 100644
index 0000000..d82f341
--- /dev/null
+++ b/src/usr/local/www/load_balancer_setting.php
@@ -0,0 +1,173 @@
+<?php
+/* $Id$ */
+/*
+ load_balancer_setting.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2008 Bill Marquette <bill.marquette@gmail.com>.
+ Copyright (C) 2012 Pierre POMES <pierre.pomes@gmail.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-services-loadbalancer-setting
+##|*NAME=Services: Load Balancer: setting page
+##|*DESCR=Allow access to the 'Settings: Load Balancer: Settings' page.
+##|*MATCH=load_balancer_setting.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("util.inc");
+
+if (!is_array($config['load_balancer']['setting'])) {
+ $config['load_balancer']['setting'] = array();
+}
+$lbsetting = &$config['load_balancer']['setting'];
+
+if ($_POST) {
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval |= filter_configure();
+ $retval |= relayd_configure();
+
+ $savemsg = get_std_save_message($retval);
+ clear_subsystem_dirty('loadbalancer');
+ } else {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['timeout'] && !is_numeric($_POST['timeout'])) {
+ $input_errors[] = gettext("Timeout must be a numeric value");
+ }
+
+ if ($_POST['interval'] && !is_numeric($_POST['interval'])) {
+ $input_errors[] = gettext("Interval must be a numeric value");
+ }
+
+ if ($_POST['prefork']) {
+ if (!is_numeric($_POST['prefork'])) {
+ $input_errors[] = gettext("Prefork must be a numeric value");
+ } else {
+ if (($_POST['prefork'] <= 0) || ($_POST['prefork'] > 32)) {
+ $input_errors[] = gettext("Prefork value must be between 1 and 32");
+ }
+ }
+ }
+
+ /* update config if user entry is valid */
+ if (!$input_errors) {
+ $lbsetting['timeout'] = $_POST['timeout'];
+ $lbsetting['interval'] = $_POST['interval'];
+ $lbsetting['prefork'] = $_POST['prefork'];
+
+ write_config();
+ mark_subsystem_dirty('loadbalancer');
+ }
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Settings"));
+$shortcut_section = "relayd";
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="load_balancer_setting.php" method="post">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
+<?php print_info_box_np(gettext("The load balancer configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer settings">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ /* active tabs */
+ $tab_array = array();
+ $tab_array[] = array(gettext("Pools"), false, "load_balancer_pool.php");
+ $tab_array[] = array(gettext("Virtual Servers"), false, "load_balancer_virtual_server.php");
+ $tab_array[] = array(gettext("Monitors"), false, "load_balancer_monitor.php");
+ $tab_array[] = array(gettext("Settings"), true, "load_balancer_setting.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Relayd global settings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("timeout") ; ?></td>
+ <td width="78%" class="vtable">
+ <input name="timeout" id="timeout" value="<?php if ($lbsetting['timeout'] <> "") echo $lbsetting['timeout']; ?>" class="formfld unknown" />
+ <br />
+ <?=gettext("Set the global timeout in milliseconds for checks. Leave blank to use the default value of 1000 ms "); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("interval") ; ?></td>
+ <td width="78%" class="vtable">
+ <input name="interval" id="interval" value="<?php if ($lbsetting['interval'] <> "") echo $lbsetting['interval']; ?>" class="formfld unknown" />
+ <br />
+ <?=gettext("Set the interval in seconds at which the member of a pool will be checked. Leave blank to use the default interval of 10 seconds"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("prefork") ; ?></td>
+ <td width="78%" class="vtable">
+ <input name="prefork" id="prefork" value="<?php if ($lbsetting['prefork'] <> "") echo $lbsetting['prefork']; ?>" class="formfld unknown" />
+ <br />
+ <?=gettext("Number of processes used by relayd for dns protocol. Leave blank to use the default value of 5 processes"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/load_balancer_virtual_server.php b/src/usr/local/www/load_balancer_virtual_server.php
new file mode 100644
index 0000000..dec55f1
--- /dev/null
+++ b/src/usr/local/www/load_balancer_virtual_server.php
@@ -0,0 +1,152 @@
+<?php
+/* $Id$ */
+/*
+ load_balancer_virtual_server.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-services-loadbalancer-virtualservers
+##|*NAME=Services: Load Balancer: Virtual Servers page
+##|*DESCR=Allow access to the 'Services: Load Balancer: Virtual Servers' page.
+##|*MATCH=load_balancer_virtual_server.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("vslb.inc");
+
+if (!is_array($config['load_balancer']['virtual_server'])) {
+ $config['load_balancer']['virtual_server'] = array();
+}
+$a_vs = &$config['load_balancer']['virtual_server'];
+
+if ($_POST) {
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval |= filter_configure();
+ $retval |= relayd_configure();
+ $savemsg = get_std_save_message($retval);
+ /* Wipe out old relayd anchors no longer in use. */
+ cleanup_lb_marked();
+ clear_subsystem_dirty('loadbalancer');
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if (array_key_exists($_GET['id'], $a_vs)) {
+
+ if (!$input_errors) {
+ cleanup_lb_mark_anchor($a_vs[$_GET['id']]['name']);
+ unset($a_vs[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('loadbalancer');
+ header("Location: load_balancer_virtual_server.php");
+ exit;
+ }
+ }
+}
+
+/* Index lbpool array for easy hyperlinking */
+$poodex = array();
+for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
+ $poodex[$config['load_balancer']['lbpool'][$i]['name']] = $i;
+}
+for ($i = 0; isset($config['load_balancer']['virtual_server'][$i]); $i++) {
+ if ($a_vs[$i]) {
+ $a_vs[$i]['poolname'] = "<a href=\"/load_balancer_pool_edit.php?id={$poodex[$a_vs[$i]['poolname']]}\">" . htmlspecialchars($a_vs[$i]['poolname']) . "</a>";
+ if ($a_vs[$i]['sitedown'] != '') {
+ $a_vs[$i]['sitedown'] = "<a href=\"/load_balancer_pool_edit.php?id={$poodex[$a_vs[$i]['sitedown']]}\">" . htmlspecialchars($a_vs[$i]['sitedown']) . "</a>";
+ } else {
+ $a_vs[$i]['sitedown'] = 'none';
+ }
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Virtual Servers"));
+$shortcut_section = "relayd-virtualservers";
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="load_balancer_virtual_server.php" method="post">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
+<?php print_info_box_np(gettext("The virtual server configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="load balancer virtual server">
+ <tr><td class="tabnavtbl">
+<?php
+ /* active tabs */
+ $tab_array = array();
+ $tab_array[] = array(gettext("Pools"), false, "load_balancer_pool.php");
+ $tab_array[] = array(gettext("Virtual Servers"), true, "load_balancer_virtual_server.php");
+ $tab_array[] = array(gettext("Monitors"), false, "load_balancer_monitor.php");
+ $tab_array[] = array(gettext("Settings"), false, "load_balancer_setting.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+<?php
+ $t = new MainTable();
+ $t->edit_uri('load_balancer_virtual_server_edit.php');
+ $t->my_uri('load_balancer_virtual_server.php');
+ $t->add_column(gettext('Name'), 'name', 10);
+ $t->add_column(gettext('Protocol'), 'relay_protocol', 10);
+ $t->add_column(gettext('IP Address'), 'ipaddr', 15);
+ $t->add_column(gettext('Port'), 'port', 10);
+ $t->add_column(gettext('Pool'), 'poolname', 15);
+ $t->add_column(gettext('Fall Back Pool'), 'sitedown', 15);
+ $t->add_column(gettext('Description'), 'descr', 30);
+ $t->add_button('edit');
+ $t->add_button('dup');
+ $t->add_button('del');
+ $t->add_content_array($a_vs);
+ $t->display();
+?>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/load_balancer_virtual_server_edit.php b/src/usr/local/www/load_balancer_virtual_server_edit.php
new file mode 100644
index 0000000..39bc6c9
--- /dev/null
+++ b/src/usr/local/www/load_balancer_virtual_server_edit.php
@@ -0,0 +1,315 @@
+<?php
+/* $Id$ */
+/*
+ load_balancer_virtual_server_edit.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-loadbalancer-virtualserver-edit
+##|*NAME=Load Balancer: Virtual Server: Edit page
+##|*DESCR=Allow access to the 'Load Balancer: Virtual Server: Edit' page.
+##|*MATCH=load_balancer_virtual_server_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_virtual_server.php');
+}
+
+if (!is_array($config['load_balancer']['virtual_server'])) {
+ $config['load_balancer']['virtual_server'] = array();
+}
+$a_vs = &$config['load_balancer']['virtual_server'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_vs[$id]) {
+ $pconfig = $a_vs[$id];
+} else {
+ // Sane defaults
+ $pconfig['mode'] = 'redirect_mode';
+}
+
+$changedesc = gettext("Load Balancer: Virtual Server:") . " ";
+$changecount = 0;
+
+if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ switch ($pconfig['mode']) {
+ case "redirect_mode": {
+ $reqdfields = explode(" ", "ipaddr name mode");
+ $reqdfieldsn = array(gettext("IP Address"), gettext("Name"), gettext("Mode"));
+ break;
+ }
+ case "relay_mode": {
+ $reqdfields = explode(" ", "ipaddr name mode relay_protocol");
+ $reqdfieldsn = array(gettext("IP Address"), gettext("Name"), gettext("Mode"), gettext("Relay Protocol"));
+ break;
+ }
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ for ($i = 0; isset($config['load_balancer']['virtual_server'][$i]); $i++) {
+ if (($_POST['name'] == $config['load_balancer']['virtual_server'][$i]['name']) && ($i != $id)) {
+ $input_errors[] = gettext("This virtual server name has already been used. Virtual server names must be unique.");
+ }
+ }
+
+ if (preg_match('/[ \/]/', $_POST['name'])) {
+ $input_errors[] = gettext("You cannot use spaces or slashes in the 'name' field.");
+ }
+
+ if (strlen($_POST['name']) > 32) {
+ $input_errors[] = gettext("The 'name' field must be 32 characters or less.");
+ }
+
+ if ($_POST['port'] != "" && !is_portoralias($_POST['port'])) {
+ $input_errors[] = gettext("The port must be an integer between 1 and 65535, a port alias, or left blank.");
+ }
+
+ if (!is_ipaddroralias($_POST['ipaddr']) && !is_subnetv4($_POST['ipaddr'])) {
+ $input_errors[] = sprintf(gettext("%s is not a valid IP address, IPv4 subnet, or alias."), $_POST['ipaddr']);
+ } else if (is_subnetv4($_POST['ipaddr']) && subnet_size($_POST['ipaddr']) > 64) {
+ $input_errors[] = sprintf(gettext("%s is a subnet containing more than 64 IP addresses."), $_POST['ipaddr']);
+ }
+
+ if ((strtolower($_POST['relay_protocol']) == "dns") && !empty($_POST['sitedown'])) {
+ $input_errors[] = gettext("You cannot select a Fall Back Pool when using the DNS relay protocol.");
+ }
+
+ if (!$input_errors) {
+ $vsent = array();
+ if (isset($id) && $a_vs[$id]) {
+ $vsent = $a_vs[$id];
+ }
+ if ($vsent['name'] != "") {
+ $changedesc .= " " . sprintf(gettext("modified '%s' vs:"), $vsent['name']);
+ } else {
+ $changedesc .= " " . sprintf(gettext("created '%s' vs:"), $_POST['name']);
+ }
+
+ update_if_changed("name", $vsent['name'], $_POST['name']);
+ update_if_changed("descr", $vsent['descr'], $_POST['descr']);
+ update_if_changed("poolname", $vsent['poolname'], $_POST['poolname']);
+ update_if_changed("port", $vsent['port'], $_POST['port']);
+ update_if_changed("sitedown", $vsent['sitedown'], $_POST['sitedown']);
+ update_if_changed("ipaddr", $vsent['ipaddr'], $_POST['ipaddr']);
+ update_if_changed("mode", $vsent['mode'], $_POST['mode']);
+ update_if_changed("relay protocol", $vsent['relay_protocol'], $_POST['relay_protocol']);
+
+ if ($_POST['sitedown'] == "") {
+ unset($vsent['sitedown']);
+ }
+
+ if (isset($id) && $a_vs[$id]) {
+ if ($a_vs[$id]['name'] != $_POST['name']) {
+ /* Because the VS name changed, mark the old name for cleanup. */
+ cleanup_lb_mark_anchor($a_vs[$id]['name']);
+ }
+ $a_vs[$id] = $vsent;
+ } else {
+ $a_vs[] = $vsent;
+ }
+
+ if ($changecount > 0) {
+ /* Mark virtual server dirty */
+ mark_subsystem_dirty('loadbalancer');
+ write_config($changedesc);
+ }
+
+ header("Location: load_balancer_virtual_server.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Load Balancer"), gettext("Virtual Server"), gettext("Edit"));
+$shortcut_section = "relayd-virtualservers";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
+<script type="text/javascript" src="/javascript/suggestions.js"></script>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="load_balancer_virtual_server_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="load balancer server entry">
+ <tr>
+ <td colspan="3" valign="top" class="listtopic"><?=gettext("Edit Load Balancer - Virtual Server entry"); ?></td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="name" type="text" <?if (isset($pconfig['name'])) echo "value=\"" . htmlspecialchars($pconfig['name']) . "\"";?> size="32" maxlength="32" />
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input name="descr" type="text" <?if (isset($pconfig['descr'])) echo "value=\"" . htmlspecialchars($pconfig['descr']) . "\"";?> size="64" />
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IP Address"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input class="formfldalias" id="ipaddr" name="ipaddr" type="text" <?if (isset($pconfig['ipaddr'])) echo "value=\"" . htmlspecialchars($pconfig['ipaddr']) . "\"";?> size="39" maxlength="39" />
+ <br /><?=gettext("This is normally the WAN IP address that you would like the server to listen on. All connections to this IP and port will be forwarded to the pool cluster."); ?>
+ <br /><?=gettext("You may also specify a host alias listed in Firewall -&gt; Aliases here."); ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ var host_aliases = <?= json_encode(get_alias_list(array("host", "network", "url", "urltable"))) ?>;
+ var oTextbox1 = new AutoSuggestControl(document.getElementById("ipaddr"), new StateSuggestions(host_aliases));
+ //]]>
+ </script>
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Port"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <input class="formfldalias" name="port" id="port" type="text" <?if (isset($pconfig['port'])) echo "value=\"" . htmlspecialchars($pconfig['port']) . "\"";?> size="16" maxlength="16" />
+ <br /><?=gettext("This is the port that the clients will connect to. All connections to this port will be forwarded to the pool cluster."); ?>
+ <br /><?=gettext("If left blank, listening ports from the pool will be used."); ?>
+ <br /><?=gettext("You may also specify a port alias listed in Firewall -&gt; Aliases here."); ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ var port_aliases = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
+ var oTextbox2 = new AutoSuggestControl(document.getElementById("port"), new StateSuggestions(port_aliases));
+ //]]>
+ </script>
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Virtual Server Pool"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <?php if (count($config['load_balancer']['lbpool']) == 0): ?>
+ <b><?=gettext("NOTE:"); ?></b> <?=gettext("Please add a pool on the Pools tab to use this feature."); ?>
+ <?php else: ?>
+ <select id="poolname" name="poolname">
+ <?php
+ for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
+ $selected = "";
+ if ($config['load_balancer']['lbpool'][$i]['name'] == $pconfig['poolname']) {
+ $selected = " selected=\"selected\"";
+ }
+ echo "<option value=\"" . htmlspecialchars($config['load_balancer']['lbpool'][$i]['name']) . "\"{$selected}>{$config['load_balancer']['lbpool'][$i]['name']}</option>";
+ }
+ ?>
+ </select>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Fall Back Pool"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <?php if (count($config['load_balancer']['lbpool']) == 0): ?>
+ <b><?=gettext("NOTE:"); ?></b> <?=gettext("Please add a pool on the Pools tab to use this feature."); ?>
+ <?php else: ?>
+ <select id="sitedown" name="sitedown">
+ <option value=""<?=htmlspecialchars($pconfig['sitedown']) == '' ? ' selected' : ''?>><?=gettext("none"); ?></option>
+ <?php
+ for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
+ $selected = "";
+ if ($config['load_balancer']['lbpool'][$i]['name'] == $pconfig['sitedown']) {
+ $selected = " selected=\"selected\"";
+ }
+ echo "<option value=\"" . htmlspecialchars($config['load_balancer']['lbpool'][$i]['name']) . "\"{$selected}>{$config['load_balancer']['lbpool'][$i]['name']}</option>";
+ }
+ ?>
+ </select>
+ <br /><?=gettext("The server pool to which clients will be redirected if *ALL* servers in the Virtual Server Pool are offline."); ?>
+ <br /><?=gettext("This option is NOT compatible with the DNS relay protocol."); ?>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr style="display:none;"><td><input type="hidden" name="mode" value="redirect_mode" /></td></tr>
+<!--
+ <tr align="left">
+ <td width="22%" valign="top" class="vncellreq">Mode</td>
+ <td width="78%" class="vtable" colspan="2">
+ <input id="redirect_mode" type="radio" name="mode" value="redirect"<?=htmlspecialchars($pconfig['mode']) == 'redirect' ? ' checked="checked"': ''?> /> Redirect
+ <input id="relay_mode" type="radio" name="mode" value="relay"<?=htmlspecialchars($pconfig['mode']) == 'relay' ? ' checked="checked"': ''?> /> Relay
+ <br />
+ </td>
+ </tr>
+-->
+ <tr id="relay" align="left">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Relay Protocol"); ?></td>
+ <td width="78%" class="vtable" colspan="2">
+ <select id="relay_protocol" name="relay_protocol">
+ <?php
+ $lb_def_protos = array("tcp", "dns");
+ foreach ($lb_def_protos as $lb_proto) {
+ $selected = "";
+ if ($pconfig['relay_protocol'] == $lb_proto) {
+ $selected = " selected=\"selected\"";
+ }
+ echo "<option value=\"{$lb_proto}\"{$selected}>{$lb_proto}</option>";
+ }
+ ?>
+ </select>
+ <br />
+ </td>
+ </tr>
+ <tr align="left">
+ <td width="22%" valign="top">&nbsp;</td>
+ <td align="left" valign="bottom" width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Submit"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_vs[$id] && $_GET['act'] != 'dup'): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<br />
+<span class="red"><strong><?=gettext("Note:"); ?></strong></span> <?=gettext("Don't forget to add a firewall rule for the virtual server/pool after you're finished setting it up."); ?>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/logobig.jpg b/src/usr/local/www/logobig.jpg
new file mode 100755
index 0000000..2ef196d
--- /dev/null
+++ b/src/usr/local/www/logobig.jpg
Binary files differ
diff --git a/src/usr/local/www/niftycssCode.css b/src/usr/local/www/niftycssCode.css
new file mode 100755
index 0000000..ec4af80
--- /dev/null
+++ b/src/usr/local/www/niftycssCode.css
@@ -0,0 +1,21 @@
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 0px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px} \ No newline at end of file
diff --git a/src/usr/local/www/niftycssprintCode.css b/src/usr/local/www/niftycssprintCode.css
new file mode 100755
index 0000000..e856b5b
--- /dev/null
+++ b/src/usr/local/www/niftycssprintCode.css
@@ -0,0 +1 @@
+.rtop,.rbottom,.artop,.arbottom{display: none}
diff --git a/src/usr/local/www/pkg.php b/src/usr/local/www/pkg.php
new file mode 100755
index 0000000..c56ece5
--- /dev/null
+++ b/src/usr/local/www/pkg.php
@@ -0,0 +1,582 @@
+<?php
+/* $Id$ */
+/*
+ pkg.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2012 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: pkgs
+*/
+
+##|+PRIV
+##|*IDENT=page-package-settings
+##|*NAME=Package: Settings page
+##|*DESCR=Allow access to the 'Package: Settings' page.
+##|*MATCH=pkg.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("pkg-utils.inc");
+
+function gentitle_pkg($pgname) {
+ global $config;
+ return $config['system']['hostname'] . "." . $config['system']['domain'] . " - " . $pgname;
+}
+
+function domTT_title($title_msg) {
+ print "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '".gettext($title_msg)."', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\"";
+}
+
+$xml = $_REQUEST['xml'];
+
+if ($xml == "") {
+ print_info_box_np(gettext("ERROR: No package defined."));
+ exit;
+} else {
+ if (file_exists("/usr/local/pkg/" . $xml)) {
+ $pkg = parse_xml_config_pkg("/usr/local/pkg/" . $xml, "packagegui");
+ } else {
+ echo "File not found " . htmlspecialchars($xml);
+ exit;
+ }
+}
+
+if ($pkg['donotsave'] <> "") {
+ header("Location: pkg_edit.php?xml=" . $xml);
+ exit;
+}
+
+if ($pkg['include_file'] != "") {
+ require_once($pkg['include_file']);
+}
+
+$package_name = $pkg['menu'][0]['name'];
+$section = $pkg['menu'][0]['section'];
+$config_path = $pkg['configpath'];
+$title = $pkg['title'];
+
+if ($_REQUEST['startdisplayingat']) {
+ $startdisplayingat = $_REQUEST['startdisplayingat'];
+}
+
+if ($_REQUEST['display_maximum_rows']) {
+ if ($_REQUEST['display_maximum_rows']) {
+ $display_maximum_rows = $_REQUEST['display_maximum_rows'];
+ }
+}
+
+$evaledvar = $config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
+
+if ($_GET['act'] == "update") {
+
+ if (is_array($config['installedpackages'][$pkg['name']]) && $pkg['name'] != "" && $_REQUEST['ids'] !="") {
+ #get current values
+ $current_values=$config['installedpackages'][$pkg['name']]['config'];
+ #get updated ids
+ parse_str($_REQUEST['ids'], $update_list);
+ #sort ids to know what to change
+ #useful to do not lose data when using sorting and paging
+ $sort_list=$update_list['ids'];
+ sort($sort_list);
+ #apply updates
+ foreach ($update_list['ids'] as $key=> $value) {
+ $config['installedpackages'][$pkg['name']]['config'][$sort_list[$key]]=$current_values[$update_list['ids'][$key]];
+ }
+ #save current config
+ write_config();
+ #sync package
+ eval ("{$pkg['custom_php_resync_config_command']}");
+ }
+ #function called via jquery, no need to continue after save changes.
+ exit;
+}
+if ($_GET['act'] == "del") {
+ // loop through our fieldnames and automatically setup the fieldnames
+ // in the environment. ie: a fieldname of username with a value of
+ // testuser would automatically eval $username = "testuser";
+ foreach ($evaledvar as $ip) {
+ if ($pkg['adddeleteeditpagefields']['columnitem']) {
+ foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
+ ${xml_safe_fieldname($column['fielddescr'])} = $ip[xml_safe_fieldname($column['fieldname'])];
+ }
+ }
+ }
+
+ $a_pkg = &$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
+
+ if ($a_pkg[$_GET['id']]) {
+ unset($a_pkg[$_GET['id']]);
+ write_config();
+ if ($pkg['custom_delete_php_command'] <> "") {
+ if ($pkg['custom_php_command_before_form'] <> "") {
+ eval($pkg['custom_php_command_before_form']);
+ }
+ eval($pkg['custom_delete_php_command']);
+ }
+ header("Location: pkg.php?xml=" . $xml);
+ exit;
+ }
+}
+
+ob_start();
+
+$iflist = get_configured_interface_with_descr(false, true);
+$evaledvar = $config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
+
+if ($pkg['custom_php_global_functions'] <> "") {
+ eval($pkg['custom_php_global_functions']);
+}
+
+if ($pkg['custom_php_command_before_form'] <> "") {
+ eval($pkg['custom_php_command_before_form']);
+}
+
+$pgtitle = array($title);
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript" src="javascript/domTT/domLib.js"></script>
+<script type="text/javascript" src="javascript/domTT/domTT.js"></script>
+<script type="text/javascript" src="javascript/domTT/behaviour.js"></script>
+<script type="text/javascript" src="javascript/domTT/fadomatic.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+ function setFilter(filtertext) {
+ jQuery('#pkg_filter').val(filtertext);
+ document.pkgform.submit();
+ }
+
+ <?php
+ if ($pkg['adddeleteeditpagefields']['movable']) {
+ ?>
+ jQuery(document).ready(function() {
+ jQuery('#mainarea table tbody').sortable({
+ items: 'tr.sortable',
+ cursor: 'move',
+ distance: 10,
+ opacity: 0.8,
+ helper: function(e, ui) {
+ ui.children().each(function() {
+ jQuery(this).width(jQuery(this).width());
+ });
+ return ui;
+ },
+ });
+ });
+ function save_changes_to_xml(xml) {
+ var ids=jQuery('#mainarea table tbody').sortable('serialize', {key:"ids[]"});
+ var strloading="<img src='/themes/<?= $g['theme']; ?>/images/misc/loader.gif' alt='loader' /> " + "<?=gettext('Saving changes...');?>";
+ if (confirm("<?=gettext("Do you really want to save changes?");?>")) {
+ jQuery.ajax({
+ type: 'get',
+ cache: false,
+ url: "<?=$_SERVER['SCRIPT_NAME'];?>",
+ data: {xml:'<?=$xml?>', act:'update', ids: ids},
+ beforeSend: function() {
+ jQuery('#savemsg').empty().html(strloading);
+ },
+ error: function(data) {
+ jQuery('#savemsg').empty().html('Error:' + data);
+ },
+ success: function(data) {
+ jQuery('#savemsg').empty().html(data);
+ }
+ });
+ }
+ }
+ <?php
+ }
+ ?>
+//]]>
+</script>
+<form action="pkg.php" name="pkgform" method="get">
+<input type='hidden' name='xml' value='<?=$_REQUEST['xml']?>' />
+<?php if ($_GET['savemsg'] <> "") $savemsg = htmlspecialchars($_GET['savemsg']); ?>
+<div id="savemsg"></div>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package settings">
+<?php
+ if ($pkg['tabs'] <> "") {
+ $tab_array = array();
+ foreach ($pkg['tabs']['tab'] as $tab) {
+ if ($tab['tab_level']) {
+ $tab_level = $tab['tab_level'];
+ } else {
+ $tab_level = 1;
+ }
+ if (isset($tab['active'])) {
+ $active = true;
+ } else {
+ $active = false;
+ }
+ if (isset($tab['no_drop_down'])) {
+ $no_drop_down = true;
+ }
+ $urltmp = "";
+ if ($tab['url'] <> "") {
+ $urltmp = $tab['url'];
+ }
+ if ($tab['xml'] <> "") {
+ $urltmp = "pkg_edit.php?xml=" . $tab['xml'];
+ }
+
+ $addresswithport = getenv("HTTP_HOST");
+ $colonpos = strpos($addresswithport, ":");
+ if ($colonpos !== False) {
+ //my url is actually just the IP address of the pfsense box
+ $myurl = substr($addresswithport, 0, $colonpos);
+ } else {
+ $myurl = $addresswithport;
+ }
+ // eval url so that above $myurl item can be processed if need be.
+ $url = str_replace('$myurl', $myurl, $urltmp);
+
+ $tab_array[$tab_level][] = array(
+ $tab['text'],
+ $active,
+ $url
+ );
+ }
+
+ ksort($tab_array);
+ foreach ($tab_array as $tab) {
+ echo '<tr><td>';
+ display_top_tabs($tab, $no_drop_down);
+ echo '</td></tr>';
+ }
+ }
+?>
+<tr><td><div id="mainarea"><table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabs">
+<?php
+ /* Handle filtering bar A-Z */
+ $include_filtering_inputbox = false;
+ $colspan = 0;
+ if ($pkg['adddeleteeditpagefields']['columnitem'] <> "") {
+ foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
+ $colspan++;
+ }
+ }
+ if ($pkg['fields']['field']) {
+ // First find the sorting type field if it exists
+ foreach ($pkg['fields']['field'] as $field) {
+ if ($field['type'] == "sorting") {
+ if (isset($field['include_filtering_inputbox'])) {
+ $include_filtering_inputbox = true;
+ }
+ if ($display_maximum_rows < 1) {
+ if ($field['display_maximum_rows']) {
+ $display_maximum_rows = $field['display_maximum_rows'];
+ }
+ }
+ echo "<tr><td class='listhdrr' colspan='$colspan' align='center'>";
+ echo "Filter by: ";
+ $isfirst = true;
+ for ($char = 65; $char < 91; $char++) {
+ if (!$isfirst) {
+ echo " | ";
+ }
+ echo "<a href=\"#\" onclick=\"setFilter('" . chr($char) . "');\">" . chr($char) . "</a>";
+ $isfirst = false;
+ }
+ echo "</td></tr>";
+ echo "<tr><td class='listhdrr' colspan='$colspan' align='center'>";
+ if ($field['sortablefields']) {
+ echo "Filter field: <select name='pkg_filter_type'>";
+ foreach ($field['sortablefields']['item'] as $si) {
+ if ($si['name'] == $_REQUEST['pkg_filter_type']) {
+ $SELECTED = "selected=\"selected\"";
+ } else {
+ $SELECTED = "";
+ }
+ echo "<option value='{$si['name']}' {$SELECTED}>{$si['name']}</option>";
+ }
+ echo "</select>";
+ }
+ if ($include_filtering_inputbox) {
+ echo "&nbsp;&nbsp;Filter text: <input id='pkg_filter' name='pkg_filter' value='" . $_REQUEST['pkg_filter'] . "' /> <input type='submit' value='Filter' />";
+ }
+ echo "</td></tr><tr><td><font size='-3'>&nbsp;</font></td></tr>";
+ }
+ }
+ }
+?>
+ <tr>
+<?php
+ if ($display_maximum_rows) {
+ $totalpages = ceil(round((count($evaledvar) / $display_maximum_rows), 9));
+ $page = 1;
+ $tmpcount = 0;
+ $tmppp = 0;
+ if (is_array($evaledvar)) {
+ foreach ($evaledvar as $ipa) {
+ if ($tmpcount == $display_maximum_rows) {
+ $page++;
+ $tmpcount = 0;
+ }
+ if ($tmppp == $startdisplayingat) {
+ break;
+ }
+ $tmpcount++;
+ $tmppp++;
+ }
+ }
+ echo "<tr><td colspan='" . count($pkg['adddeleteeditpagefields']['columnitem']) . "'>";
+ echo "<table width='100%' summary=''>";
+ echo "<tr>";
+ echo "<td align='left'>Displaying page $page of $totalpages</b></td>";
+ echo "<td align='right'>Rows per page: <select onchange='document.pkgform.submit();' name='display_maximum_rows'>";
+ for ($x = 0; $x < 250; $x++) {
+ if ($x == $display_maximum_rows) {
+ $SELECTED = "selected=\"selected\"";
+ } else {
+ $SELECTED = "";
+ }
+ echo "<option value='$x' $SELECTED>$x</option>\n";
+ $x = $x + 4;
+ }
+ echo "</select></td></tr>";
+ echo "</table>";
+ echo "</td></tr>";
+ }
+ $cols = 0;
+ if ($pkg['adddeleteeditpagefields']['columnitem'] <> "") {
+ foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
+ echo "<td class=\"listhdrr\">" . $column['fielddescr'] . "</td>";
+ $cols++;
+ }
+ }
+?>
+ </tr>
+<?php
+ $i = 0;
+ $pagination_startingrow = 0;
+ $pagination_counter = 0;
+ if ($evaledvar) {
+ foreach ($evaledvar as $ip) {
+ if ($startdisplayingat) {
+ if ($i < $startdisplayingat) {
+ $i++;
+ continue;
+ }
+ }
+ if ($_REQUEST['pkg_filter']) {
+ // Handle filtered items
+ if ($pkg['fields']['field'] && !$filter_regex) {
+ // First find the sorting type field if it exists
+ foreach ($pkg['fields']['field'] as $field) {
+ if ($field['type'] == "sorting") {
+ if ($field['sortablefields']['item']) {
+ foreach ($field['sortablefields']['item'] as $sf) {
+ if ($sf['name'] == $_REQUEST['pkg_filter_type']) {
+ $filter_fieldname = $sf['fieldname'];
+ #Use a default regex on sortable fields when none is declared
+ if ($sf['regex']) {
+ $filter_regex = str_replace("%FILTERTEXT%", $_REQUEST['pkg_filter'], trim($sf['regex']));
+ } else {
+ $filter_regex = "/{$_REQUEST['pkg_filter']}/i";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // Do we have something to filter on?
+ unset($filter_matches);
+ if ($pkg['adddeleteeditpagefields']['columnitem'] <> "") {
+ foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
+ $fieldname = $ip[xml_safe_fieldname($column['fieldname'])];
+ if ($column['fieldname'] == $filter_fieldname) {
+ if ($filter_regex) {
+ //echo "$filter_regex - $fieldname<p/>";
+ preg_match($filter_regex, $fieldname, $filter_matches);
+ break;
+ }
+ }
+ }
+ }
+ if (!$filter_matches) {
+ $i++;
+ continue;
+ }
+ }
+ if ($pkg['adddeleteeditpagefields']['movable']) {
+ echo "<tr valign=\"top\" class=\"sortable\" id=\"id_{$i}\">\n";
+ } else {
+ echo "<tr valign=\"top\">\n";
+ }
+ if ($pkg['adddeleteeditpagefields']['columnitem'] <> "") {
+ foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
+ if ($column['fieldname'] == "description") {
+ $class = "listbg";
+ } else {
+ $class = "listlr";
+ }
+?>
+ <td class="<?=$class;?>" ondblclick="document.location='pkg_edit.php?xml=<?=$xml?>&amp;act=edit&amp;id=<?=$i;?>';">
+<?php
+ $fieldname = $ip[xml_safe_fieldname($column['fieldname'])];
+ #Check if columnitem has a type field declared
+ if ($column['type'] == "checkbox") {
+ if ($fieldname == "") {
+ echo gettext("No");
+ } else {
+ echo gettext("Yes");
+ }
+ } else if ($column['type'] == "interface") {
+ echo $column['prefix'] . $iflist[$fieldname] . $column['suffix'];
+ } else {
+ #Check if columnitem has an encoding field declared
+ if ($column['encoding'] == "base64") {
+ echo $column['prefix'] . base64_decode($fieldname) . $column['suffix'];
+ #Check if there is a custom info to show when $fieldname is not empty
+ } else if ($column['listmodeon'] && $fieldname != "") {
+ echo $column['prefix'] . gettext($column['listmodeon']). $column['suffix'];
+ #Check if there is a custom info to show when $fieldname is empty
+ } else if ($column['listmodeoff'] && $fieldname == "") {
+ echo $column['prefix'] .gettext($column['listmodeoff']). $column['suffix'];
+ } else {
+ echo $column['prefix'] . $fieldname ." ". $column['suffix'];
+ }
+ }
+?>
+ </td>
+<?php
+ } // foreach columnitem
+ } // if columnitem
+?>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+<?php
+ #Show custom description to edit button if defined
+ $edit_msg=($pkg['adddeleteeditpagefields']['edittext']?$pkg['adddeleteeditpagefields']['edittext']:"Edit this item");
+?>
+ <td valign="middle"><a href="pkg_edit.php?xml=<?=$xml?>&amp;act=edit&amp;id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" <?=domTT_title($edit_msg)?> alt="edit" /></a></td>
+<?php
+ #Show custom description to delete button if defined
+ $delete_msg=($pkg['adddeleteeditpagefields']['deletetext']?$pkg['adddeleteeditpagefields']['deletetext']:"Delete this item");
+?>
+ <td valign="middle"><a href="pkg.php?xml=<?=$xml?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this item?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" <?=domTT_title($delete_msg)?> alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+<?php
+ echo "</tr>\n"; // Pairs with an echo tr some way above
+ // Handle pagination and display_maximum_rows
+ if ($display_maximum_rows) {
+ if ($pagination_counter == ($display_maximum_rows-1) or
+ $i == (count($evaledvar)-1)) {
+ $colcount = count($pkg['adddeleteeditpagefields']['columnitem']);
+ $final_footer = "";
+ $final_footer .= "<tr><td colspan='$colcount'>";
+ $final_footer .= "<table width='100%' summary=''><tr>";
+ $final_footer .= "<td align='left'>";
+ $startingat = $startdisplayingat - $display_maximum_rows;
+ if ($startingat > -1) {
+ $final_footer .= "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat={$startingat}&amp;display_maximum_rows={$display_maximum_rows}'>";
+ } else if ($startdisplayingat > 1) {
+ $final_footer .= "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat=0&amp;display_maximum_rows={$display_maximum_rows}'>";
+ }
+ $final_footer .= "<font size='2'><< Previous page</font></a>";
+ if ($tmppp + $display_maximum_rows > count($evaledvar)) {
+ $endingrecord = count($evaledvar);
+ } else {
+ $endingrecord = $tmppp + $display_maximum_rows;
+ }
+ $final_footer .= "</td><td align='center'>";
+ $tmppp++;
+ $final_footer .= "<font size='2'>Displaying {$tmppp} - {$endingrecord} / " . count($evaledvar) . " records";
+ $final_footer .= "</font></td><td align='right'>&nbsp;";
+ if (($i+1) < count($evaledvar)) {
+ $final_footer .= "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat=" . ($startdisplayingat + $display_maximum_rows) . "&amp;display_maximum_rows={$display_maximum_rows}'>";
+ }
+ $final_footer .= "<font size='2'>Next page >></font></a>";
+ $final_footer .= "</td></tr></table></td></tr>";
+ $i = count($evaledvar);
+ break;
+ }
+ }
+ $i++;
+ $pagination_counter++;
+ } // foreach evaledvar
+ } // if evaledvar
+?>
+ <tr>
+ <td colspan="<?=$cols?>"></td>
+ <td>
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+<?php
+ #Show custom description to add button if defined
+ $add_msg=($pkg['adddeleteeditpagefields']['addtext']?$pkg['adddeleteeditpagefields']['addtext']:"Add a new item");
+?>
+ <td valign="middle"><a href="pkg_edit.php?xml=<?=$xml?>&amp;id=<?=$i?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" <?=domTT_title($add_msg)?> alt="add" /></a></td>
+<?php
+ #Show description button and info if defined
+ if ($pkg['adddeleteeditpagefields']['description']) {
+?>
+ <td valign="middle"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_info_pkg.gif" width="17" height="17" border="0" <?=domTT_title($pkg['adddeleteeditpagefields']['description'])?> alt="info" /></td>
+<?php
+ }
+?>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?=$final_footer?>
+<?php
+ #Show save button only when movable is defined
+ if ($pkg['adddeleteeditpagefields']['movable']) {
+?>
+ <tr>
+ <td><input class="formbtn" type="button" value="Save" name="Submit" onclick="save_changes_to_xml('<?=$xml?>')" /></td>
+ </tr>
+<?php
+ }
+?>
+ </table>
+ </td>
+ </tr>
+</table></div></td></tr>
+</table>
+
+</form>
+<?php include("fend.inc"); ?>
+
+<?php
+ echo "<!-- filter_fieldname: {$filter_fieldname} -->";
+ echo "<!-- filter_regex: {$filter_regex} -->";
+?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/pkg_edit.php b/src/usr/local/www/pkg_edit.php
new file mode 100644
index 0000000..0b01a28
--- /dev/null
+++ b/src/usr/local/www/pkg_edit.php
@@ -0,0 +1,1267 @@
+<?php
+/* $Id$ */
+/*
+ pkg_edit.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2012 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: pkgs
+*/
+
+##|+PRIV
+##|*IDENT=page-package-edit
+##|*NAME=Package: Edit page
+##|*DESCR=Allow access to the 'Package: Edit' page.
+##|*MATCH=pkg_edit.php*
+##|-PRIV
+
+ini_set('max_execution_time', '0');
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("pkg-utils.inc");
+
+/* dummy stubs needed by some code that was MFC'd */
+function pfSenseHeader($location) {
+ header("Location: " . $location);
+}
+
+function gentitle_pkg($pgname) {
+ global $pfSense_config;
+ return $pfSense_config['system']['hostname'] . "." . $pfSense_config['system']['domain'] . " - " . $pgname;
+}
+
+function domTT_title($title_msg) {
+ if (!empty($title_msg)) {
+ $title_msg = preg_replace("/\s+/", " ", $title_msg);
+ $title_msg = preg_replace("/'/", "\'", $title_msg);
+ return "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '{$title_msg}', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'delay', 300, 'styleClass', 'niceTitle');\"";
+ }
+}
+
+$xml = htmlspecialchars($_GET['xml']);
+if ($_POST['xml']) {
+ $xml = htmlspecialchars($_POST['xml']);
+}
+
+$xml_fullpath = realpath('/usr/local/pkg/' . $xml);
+
+if ($xml == "" || $xml_fullpath === false ||
+ substr($xml_fullpath, 0, strlen('/usr/local/pkg/')) != '/usr/local/pkg/') {
+ print_info_box_np(gettext("ERROR: No valid package defined."));
+ die;
+} else {
+ $pkg = parse_xml_config_pkg($xml_fullpath, "packagegui");
+}
+
+if ($pkg['include_file'] <> "") {
+ require_once($pkg['include_file']);
+}
+
+if (!isset($pkg['adddeleteeditpagefields'])) {
+ $only_edit = true;
+} else {
+ $only_edit = false;
+}
+
+$package_name = $pkg['menu'][0]['name'];
+$section = $pkg['menu'][0]['section'];
+$config_path = $pkg['configpath'];
+$name = $pkg['name'];
+$title = $pkg['title'];
+$pgtitle = $title;
+
+$id = $_GET['id'];
+if (isset($_POST['id'])) {
+ $id = htmlspecialchars($_POST['id']);
+}
+
+// Not posting? Then user is editing a record. There must be a valid id
+// when editing a record.
+if (!$id && !$_POST) {
+ $id = "0";
+}
+
+if (!is_numeric($id)) {
+ header("Location: /");
+ exit;
+}
+
+if ($pkg['custom_php_global_functions'] <> "") {
+ eval($pkg['custom_php_global_functions']);
+}
+
+// grab the installedpackages->package_name section.
+if ($config['installedpackages'] && !is_array($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'])) {
+ $config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'] = array();
+}
+
+// If the first entry in the array is an empty <config/> tag, kill it.
+if ($config['installedpackages'] && (count($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']) > 0)
+ && ($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'][0] == "")) {
+ array_shift($config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config']);
+}
+
+$a_pkg = &$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
+
+if ($_GET['savemsg'] <> "") {
+ $savemsg = htmlspecialchars($_GET['savemsg']);
+}
+
+if ($pkg['custom_php_command_before_form'] <> "") {
+ eval($pkg['custom_php_command_before_form']);
+}
+
+if ($_POST) {
+ $firstfield = "";
+ $rows = 0;
+
+ $input_errors = array();
+ $reqfields = array();
+ $reqfieldsn = array();
+ foreach ($pkg['fields']['field'] as $field) {
+ if (($field['type'] == 'input') && isset($field['required'])) {
+ if ($field['fieldname']) {
+ $reqfields[] = $field['fieldname'];
+ }
+ if ($field['fielddescr']) {
+ $reqfieldsn[] = $field['fielddescr'];
+ }
+ }
+ }
+ do_input_validation($_POST, $reqfields, $reqfieldsn, $input_errors);
+
+ if ($pkg['custom_php_validation_command']) {
+ eval($pkg['custom_php_validation_command']);
+ }
+
+ if ($_POST['act'] == "del") {
+ if ($pkg['custom_delete_php_command']) {
+ if ($pkg['custom_php_command_before_form'] <> "") {
+ eval($pkg['custom_php_command_before_form']);
+ }
+ eval($pkg['custom_delete_php_command']);
+ }
+ write_config($pkg['delete_string']);
+ // resync the configuration file code if defined.
+ if ($pkg['custom_php_resync_config_command'] <> "") {
+ if ($pkg['custom_php_command_before_form'] <> "") {
+ eval($pkg['custom_php_command_before_form']);
+ }
+ eval($pkg['custom_php_resync_config_command']);
+ }
+ } else {
+ if (!$input_errors && $pkg['custom_add_php_command']) {
+ if ($pkg['donotsave'] <> "" or $pkg['preoutput'] <> "") {
+ ?>
+
+<?php include("head.inc"); ?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php
+ }
+ if ($pkg['preoutput']) {
+ echo "<pre>";
+ }
+ eval($pkg['custom_add_php_command']);
+ if ($pkg['preoutput']) {
+ echo "</pre>";
+ }
+ }
+ }
+
+ // donotsave is enabled. lets simply exit.
+ if (empty($pkg['donotsave'])) {
+
+ // store values in xml configuration file.
+ if (!$input_errors) {
+ $pkgarr = array();
+ foreach ($pkg['fields']['field'] as $fields) {
+ switch ($fields['type']) {
+ case "rowhelper":
+ // save rowhelper items.
+ #$rowhelpername=($fields['fieldname'] ? $fields['fieldname'] : "row");
+ $rowhelpername="row";
+ foreach ($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
+ foreach ($_POST as $key => $value) {
+ if (preg_match("/^{$rowhelperfield['fieldname']}(\d+)$/", $key, $matches)) {
+ $pkgarr[$rowhelpername][$matches[1]][$rowhelperfield['fieldname']] = $value;
+ }
+ }
+ }
+ break;
+ default:
+ $fieldname = $fields['fieldname'];
+ if ($fieldname == "interface_array") {
+ $fieldvalue = $_POST[$fieldname];
+ } elseif (is_array($_POST[$fieldname])) {
+ $fieldvalue = implode(',', $_POST[$fieldname]);
+ } else {
+ $fieldvalue = trim($_POST[$fieldname]);
+ if ($fields['encoding'] == 'base64') {
+ $fieldvalue = base64_encode($fieldvalue);
+ }
+ }
+ if ($fieldname) {
+ $pkgarr[$fieldname] = $fieldvalue;
+ }
+ }
+ }
+
+ if (isset($id) && $a_pkg[$id]) {
+ $a_pkg[$id] = $pkgarr;
+ } else {
+ $a_pkg[] = $pkgarr;
+ }
+
+ write_config($pkg['addedit_string']);
+ // late running code
+ if ($pkg['custom_add_php_command_late'] <> "") {
+ eval($pkg['custom_add_php_command_late']);
+ }
+
+ if (isset($pkg['filter_rules_needed'])) {
+ filter_configure();
+ }
+
+ // resync the configuration file code if defined.
+ if ($pkg['custom_php_resync_config_command'] <> "") {
+ eval($pkg['custom_php_resync_config_command']);
+ }
+
+ parse_package_templates();
+
+ /* if start_command is defined, restart w/ this */
+ if ($pkg['start_command'] <> "") {
+ exec($pkg['start_command'] . ">/dev/null 2&>1");
+ }
+
+ /* if restart_command is defined, restart w/ this */
+ if ($pkg['restart_command'] <> "") {
+ exec($pkg['restart_command'] . ">/dev/null 2&>1");
+ }
+
+ if ($pkg['aftersaveredirect'] <> "") {
+ pfSenseHeader($pkg['aftersaveredirect']);
+ } elseif (!$pkg['adddeleteeditpagefields']) {
+ pfSenseHeader("pkg_edit.php?xml={$xml}&amp;id=0");
+ } elseif (!$pkg['preoutput']) {
+ pfSenseHeader("pkg.php?xml=" . $xml);
+ }
+ exit;
+ } else {
+ $get_from_post = true;
+ }
+ } elseif (!$input_errors) {
+ exit;
+ }
+}
+
+if ($pkg['title'] <> "") {
+ $edit = ($only_edit ? '' : ": " . gettext("Edit"));
+ $title = $pkg['title'] . $edit;
+} else {
+ $title = gettext("Package Editor");
+}
+
+$pgtitle = $title;
+
+if ($pkg['custom_php_after_head_command']) {
+ $closehead = false;
+ include("head.inc");
+ eval($pkg['custom_php_after_head_command']);
+ echo "</head>\n";
+} else {
+ include("head.inc");
+}
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
+<script type="text/javascript" src="/javascript/suggestions.js"></script>
+
+<?php if ($pkg['fields']['field'] <> "") { ?>
+<script type="text/javascript">
+//<![CDATA[
+ //Everything inside it will load as soon as the DOM is loaded and before the page contents are loaded
+ jQuery(document).ready(function() {
+
+ //Sortable function
+ jQuery('#mainarea table tbody').sortable({
+ items: 'tr.sortable',
+ cursor: 'move',
+ distance: 10,
+ opacity: 0.8,
+ helper: function(e, ui) {
+ ui.children().each(function() {
+ jQuery(this).width(jQuery(this).width());
+ });
+ return ui;
+ },
+ });
+
+ //delete current line jQuery function
+ jQuery('#maintable td .delete').live('click', function() {
+ //do not remove first line
+ if (jQuery("#maintable tr").length > 2) {
+ jQuery(this).parent().parent().remove();
+ return false;
+ }
+ });
+
+ //add new line jQuery function
+ jQuery('#mainarea table .add').click(function() {
+ //get table size and assign as new id
+ var c_id=jQuery("#maintable tr").length;
+ var new_row=jQuery("table#maintable tr:last").html().replace(/(name|id)="(\w+)(\d+)"/g,"$1='$2"+c_id+"'");
+ //apply new id to created line rowhelperid
+ jQuery("table#maintable tr:last").after("<tr>"+new_row+"<\/tr>");
+ return false;
+ });
+ // Call enablechange function
+ enablechange();
+ });
+
+ function enablechange() {
+ <?php
+ foreach ($pkg['fields']['field'] as $field) {
+ if (isset($field['enablefields']) or isset($field['checkenablefields'])) {
+ echo "\tif (jQuery('form[name=\"iform\"] input[name=\"{$field['fieldname']}\"]').prop('checked') == false) {\n";
+
+ if (isset($field['enablefields'])) {
+ foreach (explode(',', $field['enablefields']) as $enablefield) {
+ echo "\t\tif (jQuery('form[name=\"iform\"] input[name=\"{$enablefield}\"]').length > 0) {\n";
+ echo "\t\t\tjQuery('form[name=\"iform\"] input[name=\"{$enablefield}\"]').prop('disabled',true);\n";
+ echo "\t\t}\n";
+ }
+ }
+
+ if (isset($field['checkenablefields'])) {
+ foreach (explode(',', $field['checkenablefields']) as $checkenablefield) {
+ echo "\t\tif (jQuery('form[name=\"iform\"] input[name=\"{$checkenablefield}\"]').length > 0) {\n";
+ echo "\t\t\tjQuery('form[name=\"iform\"] input[name=\"{$checkenablefield}\"]').prop('checked',true);\n";
+ echo "\t\t}\n";
+ }
+ }
+
+ echo "\t}\n\telse {\n";
+
+ if (isset($field['enablefields'])) {
+ foreach (explode(',', $field['enablefields']) as $enablefield) {
+ echo "\t\tif (jQuery('form[name=\"iform\"] input[name=\"{$enablefield}\"]').length > 0) {\n";
+ echo "\t\t\tjQuery('form[name=\"iform\"] input[name=\"{$enablefield}\"]').prop('disabled',false);\n";
+ echo "\t\t}\n";
+ }
+ }
+
+ if (isset($field['checkenablefields'])) {
+ foreach (explode(',', $field['checkenablefields']) as $checkenablefield) {
+ echo "\t\tif (jQuery('form[name=\"iform\"] input[name=\"{$checkenablefield}\"]').length > 0) {\n";
+ echo "\t\t\tjQuery('form[name=\"iform\"] input[name=\"{$checkenablefield}\"]').prop('checked',false);\n";
+ echo "\t\t}\n";
+ }
+ }
+
+ echo "\t}\n";
+ }
+ }
+ ?>
+ }
+//]]>
+</script>
+<?php } ?>
+<script type="text/javascript" src="javascript/domTT/domLib.js"></script>
+<script type="text/javascript" src="javascript/domTT/domTT.js"></script>
+<script type="text/javascript" src="javascript/domTT/behaviour.js"></script>
+<script type="text/javascript" src="javascript/domTT/fadomatic.js"></script>
+<script type="text/javascript" src="/javascript/row_helper_dynamic.js"></script>
+
+<?php if (!empty($input_errors)) print_input_errors($input_errors); ?>
+<form name="iform" action="pkg_edit.php" method="post">
+<input type="hidden" name="xml" value="<?= htmlspecialchars($xml) ?>" />
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package edit">
+<?php
+if ($pkg['tabs'] <> "") {
+ $tab_array = array();
+ foreach ($pkg['tabs']['tab'] as $tab) {
+ if ($tab['tab_level']) {
+ $tab_level = $tab['tab_level'];
+ } else {
+ $tab_level = 1;
+ }
+ if (isset($tab['active'])) {
+ $active = true;
+ } else {
+ $active = false;
+ }
+ if (isset($tab['no_drop_down'])) {
+ $no_drop_down = true;
+ }
+ $urltmp = "";
+ if ($tab['url'] <> "") {
+ $urltmp = $tab['url'];
+ }
+ if ($tab['xml'] <> "") {
+ $urltmp = "pkg_edit.php?xml=" . $tab['xml'];
+ }
+
+ $addresswithport = getenv("HTTP_HOST");
+ $colonpos = strpos($addresswithport, ":");
+ if ($colonpos !== False) {
+ //my url is actually just the IP address of the pfsense box
+ $myurl = substr($addresswithport, 0, $colonpos);
+ } else {
+ $myurl = $addresswithport;
+ }
+ // eval url so that above $myurl item can be processed if need be.
+ $url = str_replace('$myurl', $myurl, $urltmp);
+
+ $tab_array[$tab_level][] = array(
+ $tab['text'],
+ $active,
+ $url
+ );
+ }
+
+ ksort($tab_array);
+ foreach ($tab_array as $tabid => $tab) {
+ echo '<tr><td>';
+ display_top_tabs($tab, $no_drop_down, $tabid);
+ echo '</td></tr>';
+ }
+}
+
+?>
+<tr><td><div id="mainarea"><table id="t" class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+<?php
+ $cols = 0;
+ $savevalue = gettext("Save");
+ if ($pkg['savetext'] <> "") {
+ $savevalue = $pkg['savetext'];
+ }
+ /* If a package's XML has <advanced_options/> configured, then setup
+ * the table rows for the fields that have <advancedfield/> set.
+ * These fields will be placed below other fields in a separate area titled 'Advanced Features'.
+ * These advanced fields are not normally configured and generally left to default to 'default settings'.
+ */
+
+ if ($pkg['advanced_options'] == "enabled") {
+ $adv_filed_count = 0;
+ $advanced = "<td>&nbsp;</td>";
+ $advanced .= "<tr><td colspan=\"2\" class=\"listtopic\">". gettext("Advanced features") . "<br /></td></tr>\n";
+ }
+ foreach ($pkg['fields']['field'] as $pkga) {
+ if ($pkga['type'] == "sorting") {
+ continue;
+ }
+
+ if ($pkga['type'] == "listtopic") {
+ $input = "<tr id='td_{$pkga['fieldname']}'><td>&nbsp;</td></tr>";
+ $input .= "<tr id='tr_{$pkga['fieldname']}'><td colspan=\"2\" class=\"listtopic\">{$pkga['name']}<br /></td></tr>\n";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= $input;
+ $adv_filed_count++;
+ } else {
+ echo $input;
+ }
+ continue;
+ }
+
+ if ($pkga['combinefields'] == "begin") {
+ $input="<tr valign='top' id='tr_{$pkga['fieldname']}'>";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= $input;
+ } else {
+ echo $input;
+ }
+ }
+
+ $size = "";
+ $colspan="";
+ if (isset($pkga['dontdisplayname'])) {
+ $input="";
+ // If this is in a set of combined fields and;
+ // - it is a "begin" (case already handled above) or
+ // - usecolspan2 is in effect (so we want to spread all the combined fields horizontally)
+ // then we do not want this "tr" to be inserted.
+ // Thus only insert the "tr" if the not (!) of the above condition.
+ if (!((isset($pkga['combinefields'])) && (($pkga['combinefields'] == "begin") || (isset($pkga['usecolspan2']))))) {
+ $input .= "<tr valign='top' id='tr_{$pkga['fieldname']}'>";
+ }
+ if (isset($pkga['usecolspan2'])) {
+ $colspan="colspan='2'";
+ } else {
+ $input .= "<td width='22%' class='vncell{$req}'>&nbsp;</td>";
+ }
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= $input;
+ $adv_filed_count++;
+ } else {
+ echo $input;
+ }
+ } else if (!isset($pkga['placeonbottom'])) {
+ unset($req);
+ if (isset($pkga['required'])) {
+ $req = 'req';
+ }
+ $input="";
+ // If this is in a set of combined fields and;
+ // - it is a "begin" (case already handled above) or
+ // - usecolspan2 is in effect (so we want to spread all the combined fields horizontally)
+ // then we do not want this "tr" to be inserted.
+ // Thus only insert the "tr" if the not (!) of the above condition.
+ if (!((isset($pkga['combinefields'])) && (($pkga['combinefields'] == "begin") || (isset($pkga['usecolspan2']))))) {
+ $input .= "<tr>";
+ }
+ $input .= "<td valign='top' width=\"22%\" class=\"vncell{$req}\">";
+ $input .= fixup_string($pkga['fielddescr']);
+ $input .= "</td>";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= $input;
+ $adv_filed_count++;
+ } else {
+ echo $input;
+ }
+ }
+ if ($pkga['combinefields'] == "begin") {
+ $input="<td class=\"vncell\"><table summary=\"advanced\"><tr>";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= $input;
+ } else {
+ echo $input;
+ }
+ }
+
+ $class=(isset($pkga['combinefields']) ? '' : 'class="vtable"');
+ if (!isset($pkga['placeonbottom'])) {
+ $input="<td valign='top' {$colspan} {$class}>";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= $input;
+ $adv_filed_count++;
+ } else {
+ echo $input;
+ }
+ }
+
+ // if user is editing a record, load in the data.
+ $fieldname = $pkga['fieldname'];
+ if ($get_from_post) {
+ $value = $_POST[$fieldname];
+ if (is_array($value)) {
+ $value = implode(',', $value);
+ }
+ } else {
+ if (isset($id) && $a_pkg[$id]) {
+ $value = $a_pkg[$id][$fieldname];
+ } else {
+ $value = $pkga['default_value'];
+ }
+ }
+ switch ($pkga['type']) {
+ case "input":
+ $size = ($pkga['size'] ? " size='{$pkga['size']}' " : "");
+ $input = "<input {$size} id='{$pkga['fieldname']}' name='{$pkga['fieldname']}' class='formfld unknown' value=\"" . htmlspecialchars($value) ."\" />\n";
+ $input .= "<br />" . fixup_string($pkga['description']) . "\n";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $js_array[] = $pkga['fieldname'];
+ $advanced .= display_advanced_field($pkga['fieldname']).$input ."</div>\n";
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "password":
+ $size = ($pkga['size'] ? " size='{$pkga['size']}' " : "");
+ $input = "<input " . $size . " id='" . $pkga['fieldname'] . "' type='password' name='" . $pkga['fieldname'] . "' class='formfld pwd' value=\"" . htmlspecialchars($value) . "\" />\n";
+ $input .= "<br />" . fixup_string($pkga['description']) . "\n";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $js_array[] = $pkga['fieldname'];
+ $advanced .= display_advanced_field($pkga['fieldname']).$input ."</div>\n";
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "info":
+ $input = fixup_string($pkga['description']) . "\n";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $js_array[] = $pkga['fieldname'];
+ $advanced .= display_advanced_field($pkga['fieldname']).$input ."</div>\n";
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "select":
+ $fieldname = $pkga['fieldname'];
+ if (isset($pkga['multiple'])) {
+ $multiple = 'multiple="multiple"';
+ $items = explode(',', $value);
+ $fieldname .= "[]";
+ } else {
+ $multiple = '';
+ $items = array($value);
+ }
+ $size = ($pkga['size'] ? " size='{$pkga['size']}' " : "");
+ $onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
+ $input = "<select id='" . $pkga['fieldname'] . "' $multiple $size $onchange name=\"$fieldname\">\n";
+ foreach ($pkga['options']['option'] as $opt) {
+ $selected = (in_array($opt['value'], $items) ? 'selected="selected"' : '');
+ $input .= "\t<option value=\"{$opt['value']}\" {$selected}>{$opt['name']}</option>\n";
+ }
+ $input .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $js_array[] = $pkga['fieldname'];
+ $advanced .= display_advanced_field($pkga['fieldname']).$input;
+ $advanced .= "</div>\n";
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "select_source":
+ $fieldname = $pkga['fieldname'];
+ if (isset($pkga['multiple'])) {
+ $multiple = 'multiple="multiple"';
+ $items = explode(',', $value);
+ $fieldname .= "[]";
+ } else {
+ $multiple = '';
+ $items = array($value);
+ }
+ $size = (isset($pkga['size']) ? "size=\"{$pkga['size']}\"" : '');
+ $onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
+ $input = "<select id='{$pkga['fieldname']}' {$multiple} {$size} {$onchange} name=\"{$fieldname}\">\n";
+
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $js_array[] = $pkga['fieldname'];
+ $advanced .= display_advanced_field($pkga['fieldname']) .$input;
+ $advanced .= "</div>\n";
+ } else {
+ echo $input;
+ }
+ $source_url = $pkga['source'];
+ eval("\$pkg_source_txt = &$source_url;");
+ $input="";
+ #check if show disable option is present on xml
+ if (isset($pkga['show_disable_value'])) {
+ array_push($pkg_source_txt,
+ array(($pkga['source_name']? $pkga['source_name'] : $pkga['name'])=> $pkga['show_disable_value'], ($pkga['source_value']? $pkga['source_value'] : $pkga['value'])=> $pkga['show_disable_value']));
+ }
+ foreach ($pkg_source_txt as $opt) {
+ $source_name =($pkga['source_name']? $opt[$pkga['source_name']] : $opt[$pkga['name']]);
+ $source_value =($pkga['source_value'] ? $opt[$pkga['source_value']] : $opt[$pkga['value']]);
+ $selected = (in_array($source_value, $items)? 'selected="selected"' : '');
+ $input .= "\t<option value=\"{$source_value}\" $selected>{$source_name}</option>\n";
+ }
+ $input .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= $input;
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "vpn_selection" :
+ $input = "<select id='{$pkga['fieldname']}' name='{$vpn['name']}'>\n";
+ foreach ($config['ipsec']['phase1'] as $vpn) {
+ $input .= "\t<option value=\"{$vpn['descr']}\">{$vpn['descr']}</option>\n";
+ }
+ $input .= "</select>\n";
+ $input .= "<br />" . fixup_string($pkga['description']) . "\n";
+
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $js_array[] = $pkga['fieldname'];
+ $advanced .= display_advanced_field($pkga['fieldname']).$input;
+ $advanced .= "</div>\n";
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "checkbox":
+ $checkboxchecked =($value == "on" ? " checked=\"checked\"" : "");
+ $onchange = (isset($pkga['onchange']) ? "onchange=\"{$pkga['onchange']}\"" : '');
+ if (isset($pkga['enablefields']) || isset($pkga['checkenablefields'])) {
+ $onclick = ' onclick="javascript:enablechange();"';
+ }
+ $input = "<input id='{$pkga['fieldname']}' type='checkbox' name='{$pkga['fieldname']}' {$checkboxchecked} {$onclick} {$onchange} />\n";
+ $input .= "<br />" . fixup_string($pkga['description']) . "\n";
+
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $js_array[] = $pkga['fieldname'];
+ $advanced .= display_advanced_field($pkga['fieldname']).$input;
+ $advanced .= "</div>\n";
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "textarea":
+ if ($pkga['rows']) {
+ $rows = " rows='{$pkga['rows']}' ";
+ }
+ if ($pkga['cols']) {
+ $cols = " cols='{$pkga['cols']}' ";
+ }
+ if (($pkga['encoding'] == 'base64') && !$get_from_post && !empty($value)) {
+ $value = base64_decode($value);
+ }
+ $wrap =($pkga['wrap'] == "off" ? 'wrap="off" style="white-space:nowrap;"' : '');
+ $input = "<textarea {$rows} {$cols} name='{$pkga['fieldname']}'{$wrap}>{$value}</textarea>\n";
+ $input .= "<br />" . fixup_string($pkga['description']) . "\n";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $js_array[] = $pkga['fieldname'];
+ $advanced .= display_advanced_field($pkga['fieldname']).$input;
+ $advanced .= "</div>\n";
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "aliases":
+ // Use xml tag <typealiases> to filter type aliases
+ $size = ($pkga['size'] ? "size=\"{$pkga['size']}\"" : '');
+ $fieldname = $pkga['fieldname'];
+ $a_aliases = &$config['aliases']['alias'];
+ $addrisfirst = 0;
+ $aliasesaddr = "";
+ $value = "value='{$value}'";
+
+ if (isset($a_aliases)) {
+ if (!empty($pkga['typealiases'])) {
+ foreach ($a_aliases as $alias) {
+ if ($alias['type'] == $pkga['typealiases']) {
+ if ($addrisfirst == 1) {
+ $aliasesaddr .= ",";
+ }
+ $aliasesaddr .= "'" . $alias['name'] . "'";
+ $addrisfirst = 1;
+ }
+ }
+ } else {
+ foreach ($a_aliases as $alias) {
+ if ($addrisfirst == 1) {
+ $aliasesaddr .= ",";
+ }
+ $aliasesaddr .= "'" . $alias['name'] . "'";
+ $addrisfirst = 1;
+ }
+ }
+ }
+
+ $input = "<input name='{$fieldname}' type='text' class='formfldalias' id='{$fieldname}' {$size} {$value} />\n<br />";
+ $input .= fixup_string($pkga['description']) . "\n";
+
+ $script = "<script type='text/javascript'>\n";
+ $script .= "//<![CDATA[\n";
+ $script .= "var aliasarray = new Array({$aliasesaddr})\n";
+ $script .= "var oTextbox1 = new AutoSuggestControl(document.getElementById('{$fieldname}'), new StateSuggestions(aliasarray))\n";
+ $script .= "//]]>\n";
+ $script .= "</script>";
+
+ echo $input;
+ echo $script;
+ break;
+
+ case "interfaces_selection":
+ $ips = array();
+ $interface_regex=(isset($pkga['hideinterfaceregex']) ? $pkga['hideinterfaceregex'] : "nointerfacestohide");
+ if (is_array($config['interfaces'])) {
+ foreach ($config['interfaces'] as $iface_key=>$iface_value) {
+ if (isset($iface_value['enable']) && !preg_match("/$interface_regex/", $iface_key)) {
+ $iface_description=($iface_value['descr'] !="" ? strtoupper($iface_value['descr']) : strtoupper($iface_key));
+ if (isset($pkga['showips'])) {
+ $iface_description .= " address";
+ }
+ $ips[] = array('ip'=> $iface_key, 'description'=> $iface_description);
+ }
+ }
+ }
+ if (is_array($config['virtualip']) && isset($pkga['showvirtualips'])) {
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if (!preg_match("/$interface_regex/", $vip['interface'])) {
+ $vip_description=($vip['descr'] !="" ? " ({$vip['descr']}) " : " ");
+ }
+ switch ($vip['mode']) {
+ case "ipalias":
+ case "carp":
+ $ips[] = array('ip' => $vip['subnet'], 'description' => "{$vip['subnet']} $vip_description");
+ break;
+ case "proxyarp":
+ if ($vip['type'] == "network") {
+ $start = ip2long32(gen_subnet($vip['subnet'], $vip['subnet_bits']));
+ $end = ip2long32(gen_subnet_max($vip['subnet'], $vip['subnet_bits']));
+ $len = $end - $start;
+ for ($i = 0; $i <= $len; $i++) {
+ $ips[]= array('ip' => long2ip32($start+$i), 'description' => long2ip32($start+$i)." from {$vip['subnet']}/{$vip['subnet_bits']} {$vip_description}");
+ }
+ } else {
+ $ips[]= array('ip' => $vip['subnet'], 'description' => "{$vip['subnet']} $vip_description");
+ }
+ break;
+ }
+ }
+ }
+ sort($ips);
+ if (isset($pkga['showlistenall'])) {
+ array_unshift($ips, array('ip' => 'All', 'description' => 'Listen on All interfaces/ip addresses '));
+ }
+ if (!preg_match("/$interface_regex/", "loopback")) {
+ $iface_description=(isset($pkga['showips']) ? "127.0.0.1 (loopback)" : "loopback");
+ array_push($ips, array('ip' => 'lo0', 'description' => $iface_description));
+ }
+
+ #show interfaces array on gui
+ $size = ($pkga['size'] ? "size=\"{$pkga['size']}\"" : '');
+ $multiple = '';
+ $fieldname = $pkga['fieldname'];
+ if (isset($pkga['multiple'])) {
+ $fieldname .= '[]';
+ $multiple = 'multiple="multiple"';
+ }
+ $input = "<select id='{$pkga['fieldname']}' name=\"{$fieldname}\" {$size} {$multiple}>\n";
+ if (is_array($value)) {
+ $values = $value;
+ } else {
+ $values = explode(',', $value);
+ }
+ foreach ($ips as $iface) {
+ $selected = (in_array($iface['ip'], $values) ? 'selected="selected"' : '');
+ $input .= "<option value=\"{$iface['ip']}\" {$selected}>{$iface['description']}</option>\n";
+ }
+ $input .= "</select>\n<br />" . fixup_string($pkga['description']) . "\n";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= $input;
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "radio":
+ $input = "<input type='radio' id='{$pkga['fieldname']}' name='{$pkga['fieldname']}' value='{$value}' />";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= $input;
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "button":
+ $input = "<input type='submit' id='{$pkga['fieldname']}' name='{$pkga['fieldname']}' class='formbtn' value='{$pkga['fieldname']}' />\n";
+ if (isset($pkga['placeonbottom'])) {
+ $pkg_buttons .= $input;
+ } else {
+ echo $input ."\n<br />" . fixup_string($pkga['description']) . "\n";
+ }
+ break;
+
+ case "schedule_selection":
+ $input = "<select id='{$pkga['fieldname']}' name='{$pkga['fieldname']}'>\n";
+ $schedules = array();
+ $schedules[] = "none";
+ if (is_array($config['schedules']['schedule'])) {
+ foreach ($config['schedules']['schedule'] as $schedule) {
+ if ($schedule['name'] <> "") {
+ $schedules[] = $schedule['name'];
+ }
+ }
+ }
+ foreach ($schedules as $schedule) {
+ $selected = ($value == $schedule ? "selected=\"selected\"" : "");
+ if ($schedule == "none") {
+ $input .= "<option value=\"\" {$selected}>{$schedule}</option>\n";
+ } else {
+ $input .= "<option value=\"{$schedule}\" {$selected}>{$schedule}</option>\n";
+ }
+ }
+ $input .= "</select>\n<br />\n" . fixup_string($pkga['description']) . "\n";
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $js_array[] = $pkga['fieldname'];
+ $advanced .= display_advanced_field($pkga['fieldname']).$input;
+ $advanced .= "</div>\n";
+ } else {
+ echo $input;
+ }
+ break;
+
+ case "rowhelper":
+ #$rowhelpername=($fields['fieldname'] ? $fields['fieldname'] : "row");
+ $rowhelpername="row";
+ ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ <?php
+ $rowcounter = 0;
+ $fieldcounter = 0;
+ foreach ($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
+ echo "rowname[{$fieldcounter}] = \"{$rowhelper['fieldname']}\";\n";
+ echo "rowtype[{$fieldcounter}] = \"{$rowhelper['type']}\";\n";
+ echo "rowsize[{$fieldcounter}] = \"{$rowhelper['size']}\";\n";
+ $fieldcounter++;
+ }
+ ?>
+ //]]>
+ </script>
+ <table id="maintable" summary="main table">
+ <tr id='<?="tr_{$pkga['fieldname']}";?>'>
+ <?php
+ foreach ($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
+ echo "<td ".domTT_title($rowhelper['description'])."><b>" . fixup_string($rowhelper['fielddescr']) . "</b></td>\n";
+ }
+
+ $rowcounter = 0;
+ $trc = 0;
+
+ //Use assigned $a_pkg or create an empty array to enter loop
+ if (isset($a_pkg[$id][$rowhelpername])) {
+ $saved_rows=$a_pkg[$id][$rowhelpername];
+ } else {
+ $saved_rows[] = array();
+ }
+
+ foreach ($saved_rows as $row) {
+ echo "</tr>\n<tr class=\"sortable\" id=\"id_{$rowcounter}\">\n";
+ foreach ($pkga['rowhelper']['rowhelperfield'] as $rowhelper) {
+ unset($value);
+ if ($rowhelper['value'] <> "") {
+ $value = $rowhelper['value'];
+ }
+ $fieldname = $rowhelper['fieldname'];
+ // if user is editing a record, load in the data.
+ if (isset($id) && $a_pkg[$id]) {
+ $value = $row[$fieldname];
+ }
+ $options = "";
+ $type = $rowhelper['type'];
+ $description = $rowhelper['description'];
+ $fieldname = $rowhelper['fieldname'];
+ if ($type == "option") {
+ $options = &$rowhelper['options']['option'];
+ }
+ if ($rowhelper['size']) {
+ $size = $rowhelper['size'];
+ } else if ($pkga['size']) {
+ $size = $pkga['size'];
+ } else {
+ $size = "8";
+ }
+ display_row($rowcounter, $value, $fieldname, $type, $rowhelper, $size);
+
+ $text = "";
+ $trc++;
+ }
+ $rowcounter++;
+ echo "<td>";
+ #echo "<a onclick=\"removeRow(this); return false;\" href=\"#\"><img border=\"0\" src=\"./themes/".$g['theme']."/images/icons/icon_x.gif\" alt=\"remove\" /></a>";
+ echo "<a class='delete' href=\"#\"><img border='0' src='./themes/{$g['theme']}/images/icons/icon_x.gif' alt='delete' /></a>";
+ echo "</td>\n";
+ }
+ ?>
+ </tr>
+ <tbody></tbody>
+ </table>
+
+ <!-- <br /><a onclick="javascript:addRowTo('maintable'); return false;" href="#"><img border="0" src="./themes/<?#= $g['theme']; ?>/images/icons/icon_plus.gif" alt="add" /></a>-->
+ <br /><a class="add" href="#"><img border="0" src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="add" /></a>
+ <br /><?php if ($pkga['description'] != "") echo $pkga['description']; ?>
+ <script type="text/javascript">
+ //<![CDATA[
+ field_counter_js = <?= $fieldcounter ?>;
+ rows = <?= $rowcounter ?>;
+ totalrows = <?php echo $rowcounter; ?>;
+ loaded = <?php echo $rowcounter; ?>;
+ //typesel_change();
+ //]]>
+ </script>
+
+ <?php
+ break;
+ }
+ #check typehint value
+ if ($pkga['typehint']) {
+ echo " " . $pkga['typehint'];
+ }
+ #check combinefields options
+ if (isset($pkga['combinefields'])) {
+ // At the end of each combined-fields field we always want to end a td tag.
+ $input = "</td>";
+ // The tr tag end is used to end the whole set of combined fields,
+ // but also if usecolspan2 is not in effect then we also put each combined field in its own tr.
+ if (($pkga['combinefields'] == "end") || (!isset($pkga['usecolspan2']))) {
+ $input .= "</tr>";
+ }
+ // At the end of the combined fields we finish up the table that encloses the combined fields...
+ if ($pkga['combinefields'] == "end") {
+ $input .= "</table></td></tr>";
+ }
+ } else {
+ $input = "</td></tr>";
+ if ($pkga['usecolspan2']) {
+ $input .= "</tr><br />";
+ }
+ }
+ if (isset($pkga['advancedfield']) && isset($adv_filed_count)) {
+ $advanced .= "{$input}\n";
+ } else {
+ echo "{$input}\n";
+ }
+ #increment counter
+ $i++;
+ }
+
+ #print advanced settings if any after reading all fields
+ if (isset($advanced) && $adv_filed_count > 0) {
+ echo $advanced;
+ }
+
+ ?>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <div id="buttons">
+ <?php
+ if ($pkg['note'] != "") {
+ echo "<p><span class=\"red\"><strong>" . gettext("Note") . ":</strong></span> {$pkg['note']}</p>";
+ }
+ //if (isset($id) && $a_pkg[$id]) // We'll always have a valid ID in our hands
+ echo "<input name='id' type='hidden' value=\"" . htmlspecialchars($id) . "\" />";
+ echo "<input name='Submit' type='submit' class='formbtn' value=\"" . htmlspecialchars($savevalue) . "\" />\n{$pkg_buttons}\n";
+ if (!$only_edit) {
+ echo "<input class=\"formbtn\" type=\"button\" value=\"".gettext("Cancel")."\" onclick=\"window.location.href='" . $_SERVER['HTTP_REFERER'] . "'\" />";
+ }
+ ?>
+ </div>
+ </td>
+ </tr>
+
+</table>
+</div></td></tr>
+</table>
+</form>
+
+<?php if ($pkg['custom_php_after_form_command']) eval($pkg['custom_php_after_form_command']); ?>
+
+<?php
+ /* JavaScript to handle the advanced fields. */
+ if ($pkg['advanced_options'] == "enabled") {
+ echo "<script type=\"text/javascript\">\n";
+ echo "//<![CDATA[\n";
+ foreach ($js_array as $advfieldname) {
+ echo "function show_" . $advfieldname . "() {\n";
+ echo "\tjQuery('#showadv_{$advfieldname}').empty();\n";
+ echo "\tjQuery('#show_{$advfieldname}').css('display', 'block');\n";
+ echo "}\n\n";
+ }
+ echo "//]]>\n";
+ echo "</script>\n";
+ }
+?>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
+
+<?php
+/*
+ * ROW Helpers function
+ */
+function display_row($trc, $value, $fieldname, $type, $rowhelper, $size) {
+ global $text, $config;
+ echo "<td>\n";
+ switch ($type) {
+ case "input":
+ echo "<input size='{$size}' name='{$fieldname}{$trc}' id='{$fieldname}{$trc}' class='formfld unknown' value=\"" . htmlspecialchars($value) . "\" />\n";
+ break;
+ case "checkbox":
+ echo "<input size='{$size}' type='checkbox' id='{$fieldname}{$trc}' name='{$fieldname}{$trc}' value='ON' ".($value?"CHECKED":"")." />\n";
+ break;
+ case "password":
+ echo "<input size='{$size}' type='password' id='{$fieldname}{$trc}' name='{$fieldname}{$trc}' class='formfld pwd' value=\"" . htmlspecialchars($value) . "\" />\n";
+ break;
+ case "textarea":
+ echo "<textarea rows='2' cols='12' id='{$fieldname}{$trc}' class='formfld unknown' name='{$fieldname}{$trc}'>{$value}</textarea>\n";
+ case "select":
+ echo "<select style='height:22px;' id='{$fieldname}{$trc}' name='{$fieldname}{$trc}' {$title}>\n";
+ foreach ($rowhelper['options']['option'] as $rowopt) {
+ $text .= "<option value='{$rowopt['value']}'>{$rowopt['name']}</option>";
+ echo "<option value='{$rowopt['value']}'".($rowopt['value'] == $value?" selected=\"selected\"":"").">{$rowopt['name']}</option>\n";
+ }
+ echo "</select>\n";
+ break;
+ case "interfaces_selection":
+ $size = ($size ? "size=\"{$size}\"" : '');
+ $multiple = '';
+ if (isset($rowhelper['multiple'])) {
+ $fieldname .= '[]';
+ $multiple = "multiple=\"multiple\"";
+ }
+ echo "<select style='height:22px;' id='{$fieldname}{$trc}' name='{$fieldname}{$trc}' {$size} {$multiple}>\n";
+ $ifaces = get_configured_interface_with_descr();
+ $additional_ifaces = $rowhelper['add_to_interfaces_selection'];
+ if (!empty($additional_ifaces)) {
+ $ifaces = array_merge($ifaces, explode(',', $additional_ifaces));
+ }
+ if (is_array($value)) {
+ $values = $value;
+ } else {
+ $values = explode(',', $value);
+ }
+ $ifaces["lo0"] = "loopback";
+ echo "<option><name></name><value></value></option>/n";
+ foreach ($ifaces as $ifname => $iface) {
+ $text .="<option value=\"{$ifname}\">$iface</option>";
+ echo "<option value=\"{$ifname}\" ".(in_array($ifname, $values) ? 'selected="selected"' : '').">{$iface}</option>\n";
+ }
+ echo "</select>\n";
+ break;
+ case "select_source":
+ echo "<select style='height:22px;' id='{$fieldname}{$trc}' name='{$fieldname}{$trc}'>\n";
+ if (isset($rowhelper['show_disable_value'])) {
+ echo "<option value='{$rowhelper['show_disable_value']}'>{$rowhelper['show_disable_value']}</option>\n";
+ }
+ $source_url = $rowhelper['source'];
+ eval("\$pkg_source_txt = &$source_url;");
+ foreach ($pkg_source_txt as $opt) {
+ $source_name = ($rowhelper['source_name'] ? $opt[$rowhelper['source_name']] : $opt[$rowhelper['name']]);
+ $source_value = ($rowhelper['source_value'] ? $opt[$rowhelper['source_value']] : $opt[$rowhelper['value']]);
+ $text .= "<option value='{$source_value}'>{$source_name}</option>";
+ echo "<option value='{$source_value}'".($source_value == $value?" selected=\"selected\"":"").">{$source_name}</option>\n";
+ }
+ echo "</select>\n";
+ break;
+ }
+ echo "</td>\n";
+}
+
+function fixup_string($string) {
+ global $config;
+ // fixup #1: $myurl -> http[s]://ip_address:port/
+ $https = "";
+ $port = $config['system']['webguiport'];
+ if ($port <> "443" and $port <> "80") {
+ $urlport = ":" . $port;
+ } else {
+ $urlport = "";
+ }
+
+ if ($config['system']['webgui']['protocol'] == "https") {
+ $https = "s";
+ }
+ $myurl = "http" . $https . "://" . getenv("HTTP_HOST") . $urlport;
+ $newstring = str_replace("\$myurl", $myurl, $string);
+ $string = $newstring;
+ // fixup #2: $wanip
+ $curwanip = get_interface_ip();
+ $newstring = str_replace("\$wanip", $curwanip, $string);
+ $string = $newstring;
+ // fixup #3: $lanip
+ $lancfg = $config['interfaces']['lan'];
+ $lanip = $lancfg['ipaddr'];
+ $newstring = str_replace("\$lanip", $lanip, $string);
+ $string = $newstring;
+ // fixup #4: fix'r'up here.
+ return $newstring;
+}
+
+/*
+ * Parse templates if they are defined
+ */
+function parse_package_templates() {
+ global $pkg, $config;
+ $rows = 0;
+ if ($pkg['templates']['template'] <> "") {
+ foreach ($pkg['templates']['template'] as $pkg_template_row) {
+ $filename = $pkg_template_row['filename'];
+ $template_text = $pkg_template_row['templatecontents'];
+ $firstfield = "";
+ /* calculate total row helpers count and */
+ /* change fields defined as fieldname_fieldvalue to their value */
+ foreach ($pkg['fields']['field'] as $fields) {
+ switch ($fields['type']) {
+ case "rowhelper":
+ // save rowhelper items.
+ $row_helper_total_rows = 0;
+ $row_helper_data = "";
+ foreach ($fields['rowhelper']['rowhelperfield'] as $rowhelperfield) {
+ foreach ($_POST as $key => $value) {
+ if (preg_match("/^{$rowhelperfield['fieldname']}(\d+)$/", $key, $matches)) {
+ $row_helper_total_rows++;
+ $row_helper_data .= $value;
+ $sep = "";
+ ereg($rowhelperfield['fieldname'] . "_fieldvalue\[(.*)\]", $template_text, $sep);
+ foreach ($sep as $se) {
+ $separator = $se;
+ }
+ if ($separator <> "") {
+ $row_helper_data = ereg_replace(" ", $separator, $row_helper_data);
+ $template_text = ereg_replace("\[{$separator}\]", "", $template_text);
+ }
+ $template_text = str_replace($rowhelperfield['fieldname'] . "_fieldvalue", $row_helper_data, $template_text);
+ }
+ }
+ }
+ break;
+ default:
+ $fieldname = $fields['fieldname'];
+ $fieldvalue = $_POST[$fieldname];
+ $template_text = str_replace($fieldname . "_fieldvalue", $fieldvalue, $template_text);
+ }
+ }
+ /* replace $domain_total_rows with total rows */
+ $template_text = str_replace("$domain_total_rows", $row_helper_total_rows, $template_text);
+
+ /* replace cr's */
+ $template_text = str_replace("\\n", "\n", $template_text);
+
+ /* write out new template file */
+ $fout = fopen($filename, "w");
+ fwrite($fout, $template_text);
+ fclose($fout);
+ }
+ }
+}
+
+/* Return html div fields */
+function display_advanced_field($fieldname) {
+ $div = "<div id='showadv_{$fieldname}'>\n";
+ $div .= "<input type='button' onclick='show_{$fieldname}()' value='" . gettext("Advanced") . "' /> - " . gettext("Show advanced option") ."</div>\n";
+ $div .= "<div id='show_{$fieldname}' style='display:none'>\n";
+ return $div;
+}
+
+?>
diff --git a/src/usr/local/www/pkg_mgr.php b/src/usr/local/www/pkg_mgr.php
new file mode 100644
index 0000000..85f378f
--- /dev/null
+++ b/src/usr/local/www/pkg_mgr.php
@@ -0,0 +1,221 @@
+<?php
+/* $Id$ */
+/*
+ pkg_mgr.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2012 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013 Marcello Coutinho
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ifconfig
+ pfSense_MODULE: pkgs
+*/
+
+##|+PRIV
+##|*IDENT=page-system-packagemanager
+##|*NAME=System: Package Manager page
+##|*DESCR=Allow access to the 'System: Package Manager' page.
+##|*MATCH=pkg_mgr.php*
+##|-PRIV
+
+ini_set('max_execution_time', '0');
+
+require_once("globals.inc");
+require_once("guiconfig.inc");
+require_once("pkg-utils.inc");
+
+/* if upgrade in progress, alert user */
+if (is_subsystem_dirty('packagelock')) {
+ $pgtitle = array(gettext("System"), gettext("Package Manager"));
+ include("head.inc");
+ echo "<body link=\"#0000CC\" vlink=\"#0000CC\" alink=\"#0000CC\">\n";
+ include("fbegin.inc");
+ echo "Please wait while packages are reinstalled in the background.";
+ include("fend.inc");
+ echo "</body>";
+ echo "</html>";
+ exit;
+}
+function domTT_title($title_msg) {
+ if (!empty($title_msg)) {
+ $title_msg = preg_replace("/\s+/", " ", $title_msg);
+ $title_msg = preg_replace("/'/", "\'", $title_msg);
+ echo "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '{$title_msg}', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\"";
+ }
+}
+
+$pkg_info = get_pkg_info();
+
+$closehead = false;
+$pgtitle = array(gettext("System"), gettext("Package Manager"));
+include("head.inc");
+
+?>
+<script type="text/javascript" src="javascript/domTT/domLib.js"></script>
+<script type="text/javascript" src="javascript/domTT/domTT.js"></script>
+<script type="text/javascript" src="javascript/domTT/behaviour.js"></script>
+<script type="text/javascript" src="javascript/domTT/fadomatic.js"></script>
+<script type="text/javascript" src="/javascript/row_helper_dynamic.js"></script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php
+ include("fbegin.inc");
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package manager">
+ <tr><td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Available Packages"), true, "pkg_mgr.php");
+ $tab_array[] = array(gettext("Installed Packages"), false, "pkg_mgr_installed.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr><td>
+<?php
+ if ($pkg_info) {
+ //Check categories
+ $categories = array();
+ foreach ($pkg_info as $pkg_data) {
+ if (isset($pkg_data['categories'][0])) {
+ $categories[$pkg_data['categories'][0]]++;
+ }
+ }
+ ksort($categories);
+ $cm_count = 0;
+ $tab_array = array();
+ $visible_categories = array();
+ $categories_min_count = ($g['pkg_categories_min_count'] ? $g['pkg_categories_min_count'] : 3);
+ $categories_max_display = ($g['pkg_categories_max_display'] ? $g['pkg_categories_max_display'] : 6);
+
+ /* check selected category or define default category to show */
+ if (isset($_REQUEST['category'])) {
+ $menu_category = $_REQUEST['category'];
+ } else if (isset($g['pkg_default_category'])) {
+ $menu_category = $g['pkg_default_category'];
+ } else {
+ $menu_category = "All";
+ }
+
+ $menu_category = (isset($_REQUEST['category']) ? $_REQUEST['category'] : "All");
+ $show_category = ($menu_category == "Other" || $menu_category == "All");
+
+ $tab_array[] = array(gettext("All"), $menu_category == "All" ? true : false, "pkg_mgr.php?category=All");
+ foreach ($categories as $category => $c_count) {
+ if ($c_count >= $categories_min_count && $cm_count <= $categories_max_display) {
+ $tab_array[] = array(gettext($category) , $menu_category == $category ? true : false, "pkg_mgr.php?category={$category}");
+ $visible_categories[]=$category;
+ $cm_count++;
+ }
+ }
+ $tab_array[] = array(gettext("Other Categories"), $menu_category == "Other" ? true : false, "pkg_mgr.php?category=Other");
+ if (count($categories) > 1) {
+ display_top_tabs($tab_array);
+ }
+ }
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Name"); ?></td>
+<?php
+ if ($show_category) {
+ print '<td width="18%" class="listhdr">'.gettext("Category").'</td>'."\n";
+ }
+?>
+ <td width="<?php print $show_category ? "15%" : "20%"; ?>" class="listhdr"><?=gettext("Version"); ?></td>
+ <td width="<?php print $show_category ? "58%" : "70%"; ?>" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="17">&nbsp;</td>
+ </tr>
+<?php
+ if (!$pkg_info) {
+ echo "<tr><td colspan=\"5\"><center>" . gettext("There are currently no packages available for installation.") . "</td></tr>";
+ } else {
+ if (is_array($pkg_info)) {
+ foreach ($pkg_info as $index):
+ if (get_package_id($index['name']) >= 0) {
+ continue;
+ }
+
+ $shortname = $index['name'];
+ pkg_remove_prefix($shortname);
+
+ /* Check package info link */
+ if ($index['www'] && $index['www'] != 'UNKNOWN') {
+ $pkginfolink = $index['www'];
+ $pkginfo=gettext("Package info");
+ } else {
+ $pkginfolink = "https://forum.pfsense.org/index.php/board,15.0.html";
+ $pkginfo=gettext("No package info, check the forum");
+ }
+
+ if ($menu_category == "All" || $index['categories'][0] == $menu_category || ($menu_category == "Other" && !in_array($index['categories'][0], $visible_categories))):
+?>
+ <tr valign="top" class="<?= $index['categories'][0] ?>">
+ <td class="listlr" <?=domTT_title(gettext("Click on package name to access its website."))?>>
+ <a target="_blank" href="<?= $index['www'] ?>"><?=$shortname;?></a>
+ </td>
+<?php
+ if ($show_category) {
+ print '<td class="listr">'.gettext($index['categories'][0]).'</td>'."\n";
+ }
+
+?>
+ <td class="listr"><?=$index['version'];?></td>
+ <td class="listbg" style="overflow:hidden; text-align:justify;" <?=domTT_title(gettext("Click package info for more details about ".ucfirst($shortname)." package."))?>>
+ <?=str_replace("\n", '<br />', $index['desc']);?>
+<?php
+ if (!$g['disablepackageinfo']):
+?>
+ <br /><br />
+ <a target='_blank' href='<?=$pkginfolink?>' style='align:center;color:#ffffff; filter:Glow(color=#ff0000, strength=12);'><?=$pkginfo?></a>
+<?php
+ endif;
+?>
+ </td>
+ <td valign="middle" class="list nowrap" width="17">
+ <a href="pkg_mgr_install.php?id=<?=$shortname;?>"><img <?=domTT_title(gettext("Install ".ucfirst($shortname)." package."))?> src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+<?php
+ endif;
+ endforeach;
+ } else {
+ echo "<tr><td colspan='5' align='center'>" . gettext("There are currently no packages available for installation.") . "</td></tr>";
+ } /* if (is_array($pkg_info)) */
+ } /* if (!$pkg_info) */
+?>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/pkg_mgr_install.php b/src/usr/local/www/pkg_mgr_install.php
new file mode 100644
index 0000000..1de2a40
--- /dev/null
+++ b/src/usr/local/www/pkg_mgr_install.php
@@ -0,0 +1,323 @@
+<?php
+/* $Id$ */
+/*
+ pkg_mgr_install.php
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2010 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2005 Colin Smith
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm
+ pfSense_MODULE: pkgs
+*/
+
+##|+PRIV
+##|*IDENT=page-system-packagemanager-installpackage
+##|*NAME=System: Package Manager: Install Package page
+##|*DESCR=Allow access to the 'System: Package Manager: Install Package' page.
+##|*MATCH=pkg_mgr_install.php*
+##|-PRIV
+
+ini_set('max_execution_time', '0');
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("pkg-utils.inc");
+
+global $static_output;
+
+$static_output = "";
+$static_status = "";
+$sendto = "output";
+
+$pgtitle = array(gettext("System"), gettext("Package Manager"), gettext("Install Package"));
+include("head.inc");
+
+if ($_POST) {
+ if (isset($_POST['pkgcancel']) || (empty($_POST['id']) && $_POST['mode'] != 'reinstallall')) {
+ header("Location: pkg_mgr_installed.php");
+ return;
+ }
+} else if ($_GET) {
+ switch ($_GET['mode']) {
+ case 'reinstallall':
+ case 'showlog':
+ break;
+ case 'installedinfo':
+ case 'reinstallxml':
+ case 'reinstallpkg':
+ case 'delete':
+ if (empty($_GET['pkg'])) {
+ header("Location: pkg_mgr_installed.php");
+ return;
+ }
+ break;
+ default:
+ if (empty($_GET['id'])) {
+ header("Location: pkg_mgr_installed.php");
+ return;
+ }
+ break;
+ }
+}
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+ <form action="pkg_mgr_install.php" method="post">
+ <div id="mainareapkg">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package manager install">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Available packages"), false, "pkg_mgr.php");
+ $tab_array[] = array(gettext("Installed packages"), false, "pkg_mgr_installed.php");
+ $tab_array[] = array(gettext("Package Installer"), true, "");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+<?php
+if ((empty($_GET['mode']) && $_GET['id']) || (!empty($_GET['mode']) && (!empty($_GET['pkg']) || $_GET['mode'] == 'reinstallall') && ($_GET['mode'] != 'installedinfo' && $_GET['mode'] != 'showlog'))):
+ if (empty($_GET['mode']) && $_GET['id']) {
+ $pkgname = str_replace(array("<", ">", ";", "&", "'", '"', '.', '/'), "", htmlspecialchars_decode($_GET['id'], ENT_QUOTES | ENT_HTML401));
+ $pkgmode = 'installed';
+ } else if (!empty($_GET['mode']) && !empty($_GET['pkg'])) {
+ $pkgname = str_replace(array("<", ">", ";", "&", "'", '"', '.', '/'), "", htmlspecialchars_decode($_GET['pkg'], ENT_QUOTES | ENT_HTML401));
+ $pkgmode = str_replace(array("<", ">", ";", "&", "'", '"', '.', '/'), "", htmlspecialchars_decode($_GET['mode'], ENT_QUOTES | ENT_HTML401));
+ } else if ($_GET['mode'] == 'reinstallall') {
+ $pkgmode = 'reinstallall';
+ }
+ $pkg_gui_xml_text = "";
+ switch ($pkgmode) {
+ case 'reinstallall':
+ $pkgname = 'All packages';
+ $pkgtxt = 'reinstalled';
+ break;
+ case 'reinstallxml':
+ $pkg_gui_xml_text = " GUI XML components";
+ case 'reinstallpkg':
+ $pkgtxt = 'reinstalled';
+ break;
+ case 'delete':
+ $pkgtxt = 'deleted';
+ break;
+ default:
+ $pkgtxt = $pkgmode;
+ break;
+ }
+?>
+ <tr>
+ <td class="tabcont" align="center">
+ <table style="height:15;colspacing:0" width="420" border="0" cellpadding="0" cellspacing="0" summary="images">
+ <tr>
+ <td class="tabcont" align="center">Package: <b><?=$pkgname;?></b><?=$pkg_gui_xml_text;?> will be <?=$pkgtxt;?>.<br/>
+ Please confirm the action.<br/>
+ </td>
+ <td class="tabcont" align="center">
+ <input type="hidden" name="id" value="<?=$pkgname;?>" />
+ <input type="hidden" name="mode" value="<?=$pkgmode;?>" />
+ <input type="submit" name="pkgconfirm" id="pkgconfirm" value="Confirm"/>
+ <input type="submit" name="pkgcancel" id="pkgcancel" value="Cancel"/>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+endif;
+if (!empty($_POST['id']) || $_GET['mode'] == 'showlog' || ($_GET['mode'] == 'installedinfo' && !empty($_GET['pkg']))):
+?>
+ <tr>
+ <td class="tabcont" align="center">
+ <table style="height:15;colspacing:0" width="420" border="0" cellpadding="0" cellspacing="0" summary="images">
+ <tr>
+ <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_left.gif')" height="15" width="5"></td>
+ <td>
+ <table id="progholder" style="height:15;colspacing:0" width="410" border="0" cellpadding="0" cellspacing="0" summary="progress bar">
+ <tr>
+ <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_gray.gif')" valign="top" align="left">
+ <img src='./themes/<?= $g['theme']; ?>/images/misc/bar_blue.gif' width="0" height="15" name="progressbar" id="progressbar" alt="progress bar" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_right.gif')" height="15" width="5">
+ </td>
+ </tr>
+ </table>
+ <br />
+ <!-- status box -->
+ <textarea cols="80" rows="1" name="status" id="status" wrap="hard"><?=gettext("Beginning package installation.");?></textarea>
+ <br />
+ <!-- command output box -->
+ <textarea cols="80" rows="35" name="output" id="output" wrap="hard"></textarea>
+ </td>
+ </tr>
+<?php endif; ?>
+ </table>
+ </div>
+ </form>
+<?php include("fend.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+NiftyCheck();
+Rounded("div#mainareapkg","bl br","#FFF","#eeeeee","smooth");
+//]]>
+</script>
+
+<?php
+
+ob_flush();
+
+if ($_GET) {
+ $pkgname = str_replace(array("<", ">", ";", "&", "'", '"', '.', '/'), "", htmlspecialchars_decode($_GET['pkg'], ENT_QUOTES | ENT_HTML401));
+ switch ($_GET['mode']) {
+ case 'showlog':
+ if (strpos($pkgname, ".")) {
+ update_output_window(gettext("Something is wrong on the request."));
+ } else if (file_exists("/tmp/pkg_mgr_{$pkgname}.log")) {
+ update_output_window(@file_get_contents("/tmp/pkg_mgr_{$pkgname}.log"));
+ } else {
+ update_output_window(gettext("Log was not retrievable."));
+ }
+ break;
+ case 'installedinfo':
+ if (file_exists("/tmp/{$pkgname}.info")) {
+ $status = @file_get_contents("/tmp/{$pkgname}.info");
+ update_status("{$pkgname} " . gettext("installation completed."));
+ update_output_window($status);
+ } else {
+ update_output_window(sprintf(gettext("Could not find %s."), $pkgname));
+ }
+ break;
+ default:
+ break;
+ }
+} else if ($_POST) {
+ $pkgid = str_replace(array("<", ">", ";", "&", "'", '"', '.', '/'), "", htmlspecialchars_decode($_POST['id'], ENT_QUOTES | ENT_HTML401));
+
+ /* All other cases make changes, so mount rw fs */
+ conf_mount_rw();
+ /* Write out configuration to create a backup prior to pkg install. */
+ write_config(gettext("Creating restore point before package installation."));
+
+ switch ($_POST['mode']) {
+ case 'delete':
+ uninstall_package($pkgid);
+ update_status(gettext("Package deleted."));
+ $static_output .= "\n" . gettext("Package deleted.");
+ update_output_window($static_output);
+ filter_configure();
+ break;
+ case 'reinstallxml':
+ pkg_fetch_config_file($pkgid);
+ pkg_fetch_additional_files($pkgid);
+ break;
+ case 'reinstallpkg':
+ delete_package_xml($pkgid);
+ if (install_package($pkgid) != 0) {
+ update_status(gettext("Package reinstallation failed."));
+ $static_output .= "\n" . gettext("Package reinstallation failed.");
+ update_output_window($static_output);
+ } else {
+ update_status(gettext("Package reinstalled."));
+ $static_output .= "\n" . gettext("Package reinstalled.");
+ update_output_window($static_output);
+ filter_configure();
+ }
+ @file_put_contents("/tmp/{$pkgid}.info", $static_output);
+ $pkgid = htmlspecialchars($pkgid);
+ echo "<script type='text/javascript'>document.location=\"pkg_mgr_install.php?mode=installedinfo&pkg={$pkgid}\";</script>";
+ send_event("service restart packages");
+ break;
+ case 'reinstallall':
+ if (is_array($config['installedpackages']) && is_array($config['installedpackages']['package'])) {
+ $todo = array();
+ foreach ($config['installedpackages']['package'] as $package) {
+ $todo[] = array('name' => $package['name'], 'version' => $package['version']);
+ }
+ foreach ($todo as $pkgtodo) {
+ $static_output = "";
+ if ($pkgtodo['name']) {
+ update_output_window($static_output);
+ uninstall_package($pkgtodo['name']);
+ install_package($pkgtodo['name']);
+ }
+ }
+ update_status(gettext("All packages reinstalled."));
+ $static_output .= "\n" . gettext("All packages reinstalled.");
+ update_output_window($static_output);
+ filter_configure();
+ send_event("service restart packages");
+ } else {
+ update_output_window(gettext("No packages are installed."));
+ }
+ break;
+ case 'installed':
+ default:
+ $status = install_package($pkgid);
+ if ($status != 0) {
+ update_status(gettext("Installation of") . " {$pkgid} " . gettext("FAILED!"));
+ $static_output .= "\n" . gettext("Installation halted.");
+ update_output_window($static_output);
+ } else {
+ $status_a = gettext(sprintf("Installation of %s completed.", $pkgid));
+ update_status($status_a);
+ $status = get_after_install_info($pkgid);
+ if ($status) {
+ $static_output .= "\n" . gettext("Installation completed.") . "\n{$pkgid} " . gettext("setup instructions") . ":\n{$status}";
+ } else {
+ $static_output .= "\n" . gettext("Installation completed. Please check to make sure that the package is configured from the respective menu then start the package.");
+ }
+
+ @file_put_contents("/tmp/{$pkgid}.info", $static_output);
+ echo "<script type='text/javascript'>document.location=\"pkg_mgr_install.php?mode=installedinfo&pkg={$pkgid}\";</script>";
+ }
+ filter_configure();
+ break;
+ }
+
+ // Delete all temporary package tarballs and staging areas.
+ unlink_if_exists("/tmp/apkg_*");
+ rmdir_recursive("/var/tmp/instmp*");
+
+ // close log
+ if ($fd_log) {
+ fclose($fd_log);
+ }
+
+ /* Restore to read only fs */
+ conf_mount_ro();
+}
+?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/pkg_mgr_installed.php b/src/usr/local/www/pkg_mgr_installed.php
new file mode 100644
index 0000000..3801271
--- /dev/null
+++ b/src/usr/local/www/pkg_mgr_installed.php
@@ -0,0 +1,259 @@
+<?php
+/* $Id$ */
+/*
+ pkg_mgr_installed.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2012 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: pkgs
+*/
+
+##|+PRIV
+##|*IDENT=page-system-packagemanager-installed
+##|*NAME=System: Package Manager: Installed page
+##|*DESCR=Allow access to the 'System: Package Manager: Installed' page.
+##|*MATCH=pkg_mgr_installed.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("pkg-utils.inc");
+
+$timezone = $config['system']['timezone'];
+if (!$timezone) {
+ $timezone = "Etc/UTC";
+}
+
+date_default_timezone_set($timezone);
+
+/* if upgrade in progress, alert user */
+if (is_subsystem_dirty('packagelock')) {
+ $pgtitle = array(gettext("System"), gettext("Package Manager"));
+ include("head.inc");
+ echo "<body link=\"#0000CC\" vlink=\"#0000CC\" alink=\"#0000CC\">\n";
+ include("fbegin.inc");
+ echo "Please wait while packages are reinstalled in the background.";
+ include("fend.inc");
+ echo "</body>";
+ echo "</html>";
+ exit;
+}
+
+function domTT_title($title_msg, $return="echo") {
+ if (!empty($title_msg)) {
+ $title_msg = preg_replace("/\s+/", " ", $title_msg);
+ $title_msg = preg_replace("/'/", "\'", $title_msg);
+ $title= "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '{$title_msg}', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\"";
+ if ($return =="echo") {
+ echo $title;
+ } else {
+ return $title;
+ }
+ }
+}
+if (is_array($config['installedpackages']['package'])) {
+ foreach ($config['installedpackages']['package'] as $instpkg) {
+ $tocheck[] = $instpkg['name'];
+ }
+ $currentvers = get_pkg_info($tocheck, array('version', 'xmlver', 'pkginfolink', 'descr'));
+}
+$closehead = false;
+$pgtitle = array(gettext("System"), gettext("Package Manager"));
+include("head.inc");
+
+?>
+<script type="text/javascript" src="javascript/domTT/domLib.js"></script>
+<script type="text/javascript" src="javascript/domTT/domTT.js"></script>
+<script type="text/javascript" src="javascript/domTT/behaviour.js"></script>
+<script type="text/javascript" src="javascript/domTT/fadomatic.js"></script>
+<script type="text/javascript" src="/javascript/row_helper_dynamic.js"></script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+ <?php include("fbegin.inc");
+
+ /* Print package server mismatch warning. See https://redmine.pfsense.org/issues/484 */
+ if (!verify_all_package_servers()) {
+ print_info_box(package_server_mismatch_message());
+ }
+
+ /* Print package server SSL warning. See https://redmine.pfsense.org/issues/484 */
+ if (check_package_server_ssl() === false) {
+ print_info_box(package_server_ssl_failure_message());
+ }
+?>
+
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="packages installed">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Available Packages"), false, "pkg_mgr.php");
+// $tab_array[] = array("{$g['product_version']} " . gettext("packages"), false, "pkg_mgr.php");
+// $tab_array[] = array("Packages for any platform", false, "pkg_mgr.php?ver=none");
+// $tab_array[] = array("Packages for a different platform", $requested_version == "other" ? true : false, "pkg_mgr.php?ver=other");
+ $tab_array[] = array(gettext("Installed Packages"), true, "pkg_mgr_installed.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="12%" class="listhdrr"><?=gettext("Name"); ?></td>
+ <td width="16%" class="listhdrr"><?=gettext("Category"); ?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Version"); ?></td>
+ <td width="53%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="40">&nbsp;</td>
+ </tr>
+ <?php
+ if (is_array($config['installedpackages']['package'])):
+
+ $instpkgs = array();
+ foreach ($config['installedpackages']['package'] as $instpkg) {
+ $instpkgs[] = $instpkg['name'];
+ }
+ natcasesort($instpkgs);
+
+ foreach ($instpkgs as $index => $pkgname):
+
+ $pkg = $config['installedpackages']['package'][$index];
+ if (!$pkg['name']) {
+ continue;
+ }
+
+ // get history/changelog git dir
+ $commit_dir = explode("/", $pkg['config_file']);
+ $changeloglink = "https://github.com/pfsense/pfsense-packages/commits/master/config/" . $commit_dir[(count($commit_dir)-2)];
+ #check package version
+ $latest_package = $currentvers[$pkg['name']]['version'];
+ if ($latest_package) {
+ // we're running a newer version of the package
+ if (strcmp($pkg['version'], $latest_package) > 0) {
+ $tdclass = "listbggrey";
+ if ($g['disablepackagehistory']) {
+ $pkgver = "<a>" . gettext("Available") . ": " . $latest_package . "<br />";
+ } else {
+ $pkgver = "<a target='_blank' href='$changeloglink'>" . gettext("Available") . ": " . $latest_package . "<br />";
+ }
+ $pkgver .= gettext("Installed") . ": " . $pkg['version'] . "</a>";
+ }
+ // we're running an older version of the package
+ if (strcmp($pkg['version'], $latest_package) < 0) {
+ $tdclass = "listbg";
+ if ($g['disablepackagehistory']) {
+ $pkgver = "<a><font color='#ffffff'>" . gettext("Available") . ": " . $latest_package . "</font><br />";
+ } else {
+ $pkgver = "<a target='_blank' href='$changeloglink'><font color='#ffffff'>" . gettext("Available") . ": " . $latest_package . "<br />";
+ }
+ $pkgver .= gettext("Installed") . ": " . $pkg['version'] . "</font></a>";
+ }
+ // we're running the current version
+ if (!strcmp($pkg['version'], $latest_package)) {
+ $tdclass = "listr";
+ if ($g['disablepackagehistory']) {
+ $pkgver = "<a>{$pkg['version']}</a>";
+ } else {
+ $pkgver = "<a target='_blank' href='$changeloglink'>{$pkg['version']}</a>";
+ }
+ }
+ $pkgdescr = $currentvers[$pkg['name']]['descr'];
+ } else {
+ // unknown available package version
+ $tdclass = "listbg";
+ if ($g['disablepackagehistory']) {
+ $pkgver = "<a><font color='#ffffff'>" . gettext("Latest") . ": " . gettext("N/A") . "</font><br />";
+ } else {
+ $pkgver = "<a target='_blank' href='$changeloglink'><font color='#ffffff'>" . gettext("Latest") . ": " . gettext("N/A") . "<br />";
+ }
+ $pkgver .= gettext("Installed") . ": " . $pkg['version'] . "</font></a>";
+ $pkgdescr = $pkg['descr'];
+ }
+ /* Check package info link */
+ if ($pkg['pkginfolink']) {
+ $pkginfolink = $pkg['pkginfolink'];
+ $pkginfo=gettext("Package info");
+ } else {
+ $pkginfolink = "https://forum.pfsense.org/index.php/board,15.0.html";
+ $pkginfo=gettext("No package info, check the forum");
+ }
+
+ ?>
+ <tr valign="top">
+ <td class="listlr">
+ <?=$pkg['name'];?>
+ </td>
+ <td class="listr">
+ <?=$pkg['category'];?>
+ </td>
+ <?php
+ if (isset($g['disablepackagehistory'])) {
+ echo "<td class='{$tdclass}'>{$pkgver}</td>";
+ } else {
+ echo "<td class='{$tdclass}' " . domTT_title(gettext("Click on " . ucfirst($pkg['name']) . " version to check its change log."), "return").">{$pkgver}</td>";
+ }
+ ?>
+ <td class="listbg" style="overflow:hidden; text-align:justify;" <?=domTT_title(gettext("Click package info for more details about " . ucfirst($pkg['name']) . " package."))?>>
+ <?=$pkgdescr;?>
+ <?php if (!$g['disablepackageinfo']): ?>
+ <br /><br />
+ <a target='_blank' href='<?=$pkginfolink?>' style='align:center;color:#ffffff; filter:Glow(color=#ff0000, strength=12);'><?=$pkginfo?></a>
+ <?php endif; ?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="pkg_mgr_install.php?mode=delete&amp;pkg=<?= $pkg['name']; ?>">
+ <img <?=domTT_title(gettext("Remove " . ucfirst($pkg['name']) . " package."))?> src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" />
+ </a>
+ <br />
+ <a href="pkg_mgr_install.php?mode=reinstallpkg&amp;pkg=<?= $pkg['name']; ?>">
+ <img <?=domTT_title(gettext("Reinstall " . ucfirst($pkg['name']) . " package."));?> src="./themes/<?= $g['theme']; ?>/images/icons/icon_reinstall_pkg.gif" width="17" height="17" border="0" alt="reinstall" />
+ </a>
+ <a href="pkg_mgr_install.php?mode=reinstallxml&amp;pkg=<?= $pkg['name']; ?>">
+ <img <?=domTT_title(gettext("Reinstall " . ucfirst($pkg['name']) . "'s GUI components."));?> src="./themes/<?= $g['theme']; ?>/images/icons/icon_reinstall_xml.gif" width="17" height="17" border="0" alt="reinstall" />
+ </a>
+ </td>
+ </tr>
+ <?php
+ endforeach;
+ else:
+ ?>
+ <tr>
+ <td colspan="5" align="center">
+ <?=gettext("There are no packages currently installed."); ?>
+ </td>
+ </tr>
+ <?php
+ endif;
+ ?>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/pkg_mgr_settings.php b/src/usr/local/www/pkg_mgr_settings.php
new file mode 100644
index 0000000..04a5151
--- /dev/null
+++ b/src/usr/local/www/pkg_mgr_settings.php
@@ -0,0 +1,163 @@
+<?php
+/* $Id$ */
+/*
+ pkg_mgr_settings.php
+ part of pfSense
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009 Jim Pingle <jimp@pfsense.org>
+ Copyright (C) 2004-2010 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2005 Colin Smith
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: pkgs
+*/
+
+##|+PRIV
+##|*IDENT=page-pkg-mgr-settings
+##|*NAME=Packages: Settings page
+##|*DESCR=Allow access to the 'Packages: Settings' page.
+##|*MATCH=pkg_mgr_settings.php*
+##|-PRIV
+
+ini_set('max_execution_time', '0');
+
+require_once("globals.inc");
+require_once("guiconfig.inc");
+require_once("pkg-utils.inc");
+
+if ($_POST) {
+ if (!$input_errors) {
+ if ($_POST['alturlenable'] == "yes") {
+ $config['system']['altpkgrepo']['enable'] = true;
+ $config['system']['altpkgrepo']['xmlrpcbaseurl'] = $_POST['pkgrepourl'];
+ } else {
+ unset($config['system']['altpkgrepo']['enable']);
+ }
+ write_config();
+ }
+}
+
+$curcfg = $config['system']['altpkgrepo'];
+$closehead = false;
+$pgtitle = array(gettext("System"), gettext("Package Settings"));
+include("head.inc");
+?>
+<script type="text/javascript">
+//<![CDATA[
+
+function enable_altpkgrepourl(enable_over) {
+ if (document.iform.alturlenable.checked || enable_over) {
+ document.iform.pkgrepourl.disabled = 0;
+ } else {
+ document.iform.pkgrepourl.disabled = 1;
+ }
+}
+
+//]]>
+</script>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc");
+
+ /* Print package server mismatch warning. See https://redmine.pfsense.org/issues/484 */
+ if (!verify_all_package_servers()) {
+ print_info_box(package_server_mismatch_message());
+ }
+
+ /* Print package server SSL warning. See https://redmine.pfsense.org/issues/484 */
+ if (check_package_server_ssl() === false) {
+ print_info_box(package_server_ssl_failure_message());
+ }
+?>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<form action="pkg_mgr_settings.php" method="post" name="iform" id="iform">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package manager settings">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(sprintf(gettext("%s packages"), $g['product_version']), false, "pkg_mgr.php");
+ $tab_array[] = array(gettext("Installed Packages"), false, "pkg_mgr_installed.php");
+ $tab_array[] = array(gettext("Package Settings"), true, "pkg_mgr_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="vncell">
+ <?php echo gettext("This page allows an alternate package repository to be configured, primarily for temporary use as a testing mechanism."); ?>
+ <?php echo gettext("The contents of unofficial packages servers cannot be verified and may contain malicious files."); ?>
+ <?php echo gettext("The package server settings should remain at their default values to ensure that verifiable and trusted packages are recevied."); ?>
+ <br/><br/>
+ <?php echo gettext("A warning is printed on the Dashboard and in the package manager when an unofficial package server is in use."); ?>
+ <br/><br/>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Package Repository URL");?></td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Package Repository URL");?></td>
+ <td class="vtable">
+ <input name="alturlenable" type="checkbox" id="alturlenable" value="yes" onclick="enable_altpkgrepourl()" <?php if (isset($curcfg['enable'])) echo "checked=\"checked\""; ?> /> <?=gettext("Use a non-official server for packages");?> <br />
+ <table summary="alternative URL">
+ <tr>
+ <td><?=gettext("Base URL:");?></td>
+ <td>
+ <input name="pkgrepourl" type="text" class="formfld url" id="pkgrepourl" size="64" value="<?php if ($curcfg['xmlrpcbaseurl']) echo htmlspecialchars($curcfg['xmlrpcbaseurl']); else echo $g['']; ?>" />
+ </td>
+ </tr>
+ </table>
+ <span class="vexpl">
+ <?php printf(gettext("This is where %s will check for packages when the"), $g['product_name']);?> <a href="pkg_mgr.php"><?=gettext("System: Packages");?></a> <?=gettext("page is viewed.");?>
+ </span>
+ </td>
+ </tr>
+ <script type="text/javascript">
+ //<![CDATA[
+ enable_altpkgrepourl();
+ //]]>
+ </script>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/protochart/ProtoChart.js b/src/usr/local/www/protochart/ProtoChart.js
new file mode 100644
index 0000000..4e60f18
--- /dev/null
+++ b/src/usr/local/www/protochart/ProtoChart.js
@@ -0,0 +1,2653 @@
+/**
+ * Class: ProtoChart
+ * Version: v0.5 beta
+ *
+ * ProtoChart is a charting lib on top of Prototype.
+ * This library is heavily motivated by excellent work done by:
+ * * Flot <http://code.google.com/p/flot/>
+ * * Flotr <http://solutoire.com/flotr/>
+ *
+ * Complete examples can be found at: <http://www.deensoft.com/lab/protochart>
+ */
+
+/**
+ * Events:
+ * ProtoChart:mousemove - Fired when mouse is moved over the chart
+ * ProtoChart:plotclick - Fired when graph is clicked
+ * ProtoChart:dataclick - Fired when graph is clicked AND the click is on a data point
+ * ProtoChart:selected - Fired when certain region on the graph is selected
+ * ProtoChart:hit - Fired when mouse is moved near or over certain data point on the graph
+ */
+
+
+if(!Proto) var Proto = {};
+
+Proto.Chart = Class.create({
+ /**
+ * Function:
+ * {Object} elem
+ * {Object} data
+ * {Object} options
+ */
+ initialize: function(elem, data, options)
+ {
+ options = options || {};
+ this.graphData = [];
+ /**
+ * Property: options
+ *
+ * Description: Various options can be set. More details in description.
+ *
+ * colors:
+ * {Array} - pass in a array which contains strings of colors you want to use. Default has 6 color set.
+ *
+ * legend:
+ * {BOOL} - show - if you want to show the legend. Default is false
+ * {integer} - noColumns - Number of columns for the legend. Default is 1
+ * {function} - labelFormatter - A function that returns a string. The function is called with a string and is expected to return a string. Default = null
+ * {string} - labelBoxBorderColor - border color for the little label boxes. Default #CCC
+ * {HTMLElem} - container - an HTML id or HTML element where the legend should be rendered. If left null means to put the legend on top of the Chart
+ * {string} - position - position for the legend on the Chart. Default value 'ne'
+ * {integer} - margin - default valud of 5
+ * {string} - backgroundColor - default to null (which means auto-detect)
+ * {float} - backgroundOpacity - leave it 0 to avoid background
+ *
+ * xaxis (yaxis) options:
+ * {string} - mode - default is null but you can pass a string "time" to indicate time series
+ * {integer} - min
+ * {integer} - max
+ * {float} - autoscaleMargin - in % to add if auto-setting min/max
+ * {mixed} - ticks - either [1, 3] or [[1, "a"], 3] or a function which gets axis info and returns ticks
+ * {function} - tickFormatter - A function that returns a string as a tick label. Default is null
+ * {float} - tickDecimals
+ * {integer} - tickSize
+ * {integer} - minTickSize
+ * {array} - monthNames
+ * {string} - timeformat
+ *
+ * Points / Lines / Bars options:
+ * {bool} - show, default is false
+ * {integer} - radius: default is 3
+ * {integer} - lineWidth : default is 2
+ * {bool} - fill : default is true
+ * {string} - fillColor: default is #ffffff
+ *
+ * Grid options:
+ * {string} - color
+ * {string} - backgroundColor - defualt is *null*
+ * {string} - tickColor - default is *#dddddd*
+ * {integer} - labelMargin - should be in pixels default is 3
+ * {integer} - borderWidth - default *1*
+ * {bool} - clickable - default *null* - pass in TRUE if you wish to monitor click events
+ * {mixed} - coloredAreas - default *null* - pass in mixed object eg. {x1, x2}
+ * {string} - coloredAreasColor - default *#f4f4f4*
+ * {bool} - drawXAxis - default *true*
+ * {bool} - drawYAxis - default *true*
+ *
+ * selection options:
+ * {string} - mode : either "x", "y" or "xy"
+ * {string} - color : string
+ */
+ this.options = this.merge(options,{
+ colors: ["#edc240", "#00A8F0", "#C0D800", "#cb4b4b", "#4da74d", "#9440ed"],
+ legend: {
+ show: false,
+ noColumns: 1,
+ labelFormatter: null,
+ labelBoxBorderColor: "#ccc",
+ container: null,
+ position: "ne",
+ margin: 5,
+ backgroundColor: null,
+ backgroundOpacity: 0.85
+ },
+ xaxis: {
+ mode: null,
+ min: null,
+ max: null,
+ autoscaleMargin: null,
+ ticks: null,
+ tickFormatter: null,
+ tickDecimals: null,
+ tickSize: null,
+ minTickSize: null,
+ monthNames: null,
+ timeformat: null
+ },
+ yaxis: {
+ mode: null,
+ min: null,
+ max: null,
+ ticks: null,
+ tickFormatter: null,
+ tickDecimals: null,
+ tickSize: null,
+ minTickSize: null,
+ monthNames: null,
+ timeformat: null,
+ autoscaleMargin: 0.02
+ },
+
+ points: {
+ show: false,
+ radius: 3,
+ lineWidth: 2,
+ fill: true,
+ fillColor: "#ffffff"
+ },
+ lines: {
+ show: false,
+ lineWidth: 2,
+ fill: false,
+ fillColor: null
+ },
+ bars: {
+ show: false,
+ lineWidth: 2,
+ barWidth: 1,
+ fill: true,
+ fillColor: null,
+ showShadow: false,
+ fillOpacity: 0.4,
+ autoScale: true
+ },
+ pies: {
+ show: false,
+ radius: 50,
+ borderWidth: 1,
+ fill: true,
+ fillColor: null,
+ fillOpacity: 0.90,
+ labelWidth: 30,
+ fontSize: 11,
+ autoScale: true
+ },
+ grid: {
+ color: "#545454",
+ backgroundColor: null,
+ tickColor: "#dddddd",
+ labelMargin: 3,
+ borderWidth: 1,
+ clickable: null,
+ coloredAreas: null,
+ coloredAreasColor: "#f4f4f4",
+ drawXAxis: true,
+ drawYAxis: true
+ },
+ mouse: {
+ track: false,
+ position: 'se',
+ fixedPosition: true,
+ clsName: 'mouseValHolder',
+ trackFormatter: this.defaultTrackFormatter,
+ margin: 3,
+ color: '#ff3f19',
+ trackDecimals: 1,
+ sensibility: 2,
+ radius: 5,
+ lineColor: '#cb4b4b'
+ },
+ selection: {
+ mode: null,
+ color: "#97CBFF"
+ },
+ allowDataClick: true,
+ makeRandomColor: false,
+ shadowSize: 4
+ });
+
+ /*
+ * Local variables.
+ */
+ this.canvas = null;
+ this.overlay = null;
+ this.eventHolder = null;
+ this.context = null;
+ this.overlayContext = null;
+
+ this.domObj = $(elem);
+
+ this.xaxis = {};
+ this.yaxis = {};
+ this.chartOffset = {left: 0, right: 0, top: 0, bottom: 0};
+ this.yLabelMaxWidth = 0;
+ this.yLabelMaxHeight = 0;
+ this.xLabelBoxWidth = 0;
+ this.canvasWidth = 0;
+ this.canvasHeight = 0;
+ this.chartWidth = 0;
+ this.chartHeight = 0;
+ this.hozScale = 0;
+ this.vertScale = 0;
+ this.workarounds = {};
+
+ this.domObj = $(elem);
+
+ this.barDataRange = [];
+
+ this.lastMousePos = { pageX: null, pageY: null };
+ this.selection = { first: { x: -1, y: -1}, second: { x: -1, y: -1} };
+ this.prevSelection = null;
+ this.selectionInterval = null;
+ this.ignoreClick = false;
+ this.prevHit = null;
+
+ if(this.options.makeRandomColor)
+ this.options.color = this.makeRandomColor(this.options.colors);
+
+ this.setData(data);
+ this.constructCanvas();
+ this.setupGrid();
+ this.draw();
+ },
+ /**
+ * Private function internally used.
+ */
+ merge: function(src, dest)
+ {
+ var result = dest || {};
+ for(var i in src){
+ result[i] = (typeof(src[i]) == 'object' && !(src[i].constructor == Array || src[i].constructor == RegExp)) ? this.merge(src[i], dest[i]) : result[i] = src[i];
+ }
+ return result;
+ },
+ /**
+ * Function: setData
+ * {Object} data
+ *
+ * Description:
+ * Sets datasoruces properly then sets the Bar Width accordingly, then copies the default data options and then processes the graph data
+ *
+ * Returns: none
+ *
+ */
+ setData: function(data)
+ {
+ this.graphData = this.parseData(data);
+ this.setBarWidth();
+ this.copyGraphDataOptions();
+ this.processGraphData();
+ },
+ /**
+ * Function: parseData
+ * {Object} data
+ *
+ * Return:
+ * {Object} result
+ *
+ * Description:
+ * Takes the provided data object and converts it into generic data that we can understand. User can pass in data in 3 different ways:
+ * - [d1, d2]
+ * - [{data: d1, label: "data1"}, {data: d2, label: "data2"}]
+ * - [d1, {data: d1, label: "data1"}]
+ *
+ * This function parses these senarios and makes it readable
+ */
+ parseData: function(data)
+ {
+ var res = [];
+ data.each(function(d){
+ var s;
+ if(d.data) {
+ s = {};
+ for(var v in d) {
+ s[v] = d[v];
+ }
+ }
+ else {
+ s = {data: d};
+ }
+ res.push(s);
+ }.bind(this));
+ return res;
+ },
+ /**
+ * function: makeRandomColor
+ * {Object} colorSet
+ *
+ * Return:
+ * {Array} result - array containing random colors
+ */
+ makeRandomColor: function(colorSet)
+ {
+ var randNum = Math.floor(Math.random() * colorSet.length);
+ var randArr = [];
+ var newArr = [];
+ randArr.push(randNum);
+
+ while(randArr.length < colorSet.length)
+ {
+ var tempNum = Math.floor(Math.random() * colorSet.length);
+
+ while(checkExisted(tempNum, randArr))
+ tempNum = Math.floor(Math.random() * colorSet.length);
+
+ randArr.push(tempNum);
+ }
+
+ randArr.each(function(ra){
+ newArr.push(colorSet[ra]);
+
+ }.bind(this));
+ return newArr;
+ },
+ /**
+ * function: checkExisted
+ * {Object} needle
+ * {Object} haystack
+ *
+ * return:
+ * {bool} existed - true if it finds needle in the haystack
+ */
+ checkExisted: function(needle, haystack)
+ {
+ var existed = false;
+ haystack.each(function(aNeedle){
+ if(aNeedle == needle) {
+ existed = true;
+ throw $break;
+ }
+ }.bind(this));
+ return existed;
+ },
+ /**
+ * function: setBarWidth
+ *
+ * Description: sets the bar width for Bar Graph, you should enable *autoScale* property for bar graph
+ */
+ setBarWidth: function()
+ {
+ if(this.options.bars.show && this.options.bars.autoScale)
+ {
+ this.options.bars.barWidth = 1 / this.graphData.length / 1.2;
+ }
+ },
+ /**
+ * Function: copyGraphDataOptions
+ *
+ * Description: Private function that goes through each graph data (series) and assigned the graph
+ * properties to it.
+ */
+ copyGraphDataOptions: function()
+ {
+ var i, neededColors = this.graphData.length, usedColors = [], assignedColors = [];
+
+ this.graphData.each(function(gd){
+ var sc = gd.color;
+ if(sc) {
+ --neededColors;
+ if(Object.isNumber(sc)) {
+ assignedColors.push(sc);
+ }
+ else {
+ usedColors.push(this.parseColor(sc));
+ }
+ }
+ }.bind(this));
+
+
+ assignedColors.each(function(ac){
+ neededColors = Math.max(neededColors, ac + 1);
+ });
+
+ var colors = [];
+ var variation = 0;
+ i = 0;
+ while (colors.length < neededColors) {
+ var c;
+ if (this.options.colors.length == i) {
+ c = new Proto.Color(100, 100, 100);
+ }
+ else {
+ c = this.parseColor(this.options.colors[i]);
+ }
+
+ var sign = variation % 2 == 1 ? -1 : 1;
+ var factor = 1 + sign * Math.ceil(variation / 2) * 0.2;
+ c.scale(factor, factor, factor);
+
+ colors.push(c);
+
+ ++i;
+ if (i >= this.options.colors.length) {
+ i = 0;
+ ++variation;
+ }
+ }
+
+ var colorIndex = 0, s;
+
+ this.graphData.each(function(gd){
+ if(gd.color == null)
+ {
+ gd.color = colors[colorIndex].toString();
+ ++colorIndex;
+ }
+ else if(Object.isNumber(gd.color)) {
+ gd.color = colors[gd.color].toString();
+ }
+
+ gd.lines = Object.extend(Object.clone(this.options.lines), gd.lines);
+ gd.points = Object.extend(Object.clone(this.options.points), gd.points);
+ gd.bars = Object.extend(Object.clone(this.options.bars), gd.bars);
+ gd.mouse = Object.extend(Object.clone(this.options.mouse), gd.mouse);
+ if (gd.shadowSize == null) {
+ gd.shadowSize = this.options.shadowSize;
+ }
+ }.bind(this));
+
+ },
+ /**
+ * Function: processGraphData
+ *
+ * Description: processes graph data, setup xaxis and yaxis min and max points.
+ */
+ processGraphData: function() {
+
+ this.xaxis.datamin = this.yaxis.datamin = Number.MAX_VALUE;
+ this.xaxis.datamax = this.yaxis.datamax = Number.MIN_VALUE;
+
+ this.graphData.each(function(gd) {
+ var data = gd.data;
+ data.each(function(d){
+ if(d == null) {
+ return;
+ }
+
+ var x = d[0], y = d[1];
+ if(!x || !y || isNaN(x = +x) || isNaN(y = +y)) {
+ d = null;
+ return;
+ }
+
+ if (x < this.xaxis.datamin)
+ this.xaxis.datamin = x;
+ if (x > this.xaxis.datamax)
+ this.xaxis.datamax = x;
+ if (y < this.yaxis.datamin)
+ this.yaxis.datamin = y;
+ if (y > this.yaxis.datamax)
+ this.yaxis.datamax = y;
+ }.bind(this));
+ }.bind(this));
+
+
+ if (this.xaxis.datamin == Number.MAX_VALUE)
+ this.xaxis.datamin = 0;
+ if (this.yaxis.datamin == Number.MAX_VALUE)
+ this.yaxis.datamin = 0;
+ if (this.xaxis.datamax == Number.MIN_VALUE)
+ this.xaxis.datamax = 1;
+ if (this.yaxis.datamax == Number.MIN_VALUE)
+ this.yaxis.datamax = 1;
+ },
+ /**
+ * Function: constructCanvas
+ *
+ * Description: constructs the main canvas for drawing. It replicates the HTML elem (usually DIV) passed
+ * in via constructor. If there is no height/width assigned to the HTML elem then we take a default size
+ * of 400px (width) and 300px (height)
+ */
+ constructCanvas: function() {
+
+ this.canvasWidth = this.domObj.getWidth();
+ this.canvasHeight = this.domObj.getHeight();
+ this.domObj.update(""); // clear target
+ this.domObj.setStyle({
+ "position": "relative"
+ });
+
+ if (this.canvasWidth <= 0) {
+ this.canvasWdith = 400;
+ }
+ if(this.canvasHeight <= 0) {
+ this.canvasHeight = 300;
+ }
+
+ this.canvas = (Prototype.Browser.IE) ? document.createElement("canvas") : new Element("CANVAS", {'width': this.canvasWidth, 'height': this.canvasHeight});
+ Element.extend(this.canvas);
+ this.canvas.style.width = this.canvasWidth + "px";
+ this.canvas.style.height = this.canvasHeight + "px";
+
+ this.domObj.appendChild(this.canvas);
+
+ if (Prototype.Browser.IE) // excanvas hack
+ {
+ this.canvas = $(window.G_vmlCanvasManager.initElement(this.canvas));
+ }
+ this.canvas = $(this.canvas);
+
+ this.context = this.canvas.getContext("2d");
+
+ this.overlay = (Prototype.Browser.IE) ? document.createElement("canvas") : new Element("CANVAS", {'width': this.canvasWidth, 'height': this.canvasHeight});
+ Element.extend(this.overlay);
+ this.overlay.style.width = this.canvasWidth + "px";
+ this.overlay.style.height = this.canvasHeight + "px";
+ this.overlay.style.position = "absolute";
+ this.overlay.style.left = "0px";
+ this.overlay.style.right = "0px";
+
+ this.overlay.setStyle({
+ 'position': 'absolute',
+ 'left': '0px',
+ 'right': '0px'
+ });
+ this.domObj.appendChild(this.overlay);
+
+ if (Prototype.Browser.IE) {
+ this.overlay = $(window.G_vmlCanvasManager.initElement(this.overlay));
+ }
+
+ this.overlay = $(this.overlay);
+ this.overlayContext = this.overlay.getContext("2d");
+
+ if(this.options.selection.mode)
+ {
+ this.overlay.observe('mousedown', this.onMouseDown.bind(this));
+ this.overlay.observe('mousemove', this.onMouseMove.bind(this));
+ }
+ if(this.options.grid.clickable) {
+ this.overlay.observe('click', this.onClick.bind(this));
+ }
+ if(this.options.mouse.track)
+ {
+ this.overlay.observe('mousemove', this.onMouseMove.bind(this));
+ }
+ },
+ /**
+ * function: setupGrid
+ *
+ * Description: a container function that does a few interesting things.
+ *
+ * 1. calls <extendXRangeIfNeededByBar> function which makes sure that our axis are expanded if needed
+ *
+ * 2. calls <setRange> function providing xaxis options which fixes the ranges according to data points
+ *
+ * 3. calls <prepareTickGeneration> function for xaxis which generates ticks according to options provided by user
+ *
+ * 4. calls <setTicks> function for xaxis that sets the ticks
+ *
+ * similar sequence is called for y-axis.
+ *
+ * At the end if this is a pie chart than we insert Labels (around the pie chart) via <insertLabels> and we also call <insertLegend>
+ */
+ setupGrid: function()
+ {
+ if(this.options.bars.show)
+ {
+ this.xaxis.max += 0.5;
+ this.xaxis.min -= 0.5;
+ }
+ //x-axis
+ this.extendXRangeIfNeededByBar();
+ this.setRange(this.xaxis, this.options.xaxis);
+ this.prepareTickGeneration(this.xaxis, this.options.xaxis);
+ this.setTicks(this.xaxis, this.options.xaxis);
+
+
+ //y-axis
+ this.setRange(this.yaxis, this.options.yaxis);
+ this.prepareTickGeneration(this.yaxis, this.options.yaxis);
+ this.setTicks(this.yaxis, this.options.yaxis);
+ this.setSpacing();
+
+ if(!this.options.pies.show)
+ {
+ this.insertLabels();
+ }
+ this.insertLegend();
+ },
+ /**
+ * function: setRange
+ *
+ * parameters:
+ * {Object} axis
+ * {Object} axisOptions
+ */
+ setRange: function(axis, axisOptions) {
+ var min = axisOptions.min != null ? axisOptions.min : axis.datamin;
+ var max = axisOptions.max != null ? axisOptions.max : axis.datamax;
+
+ if (max - min == 0.0) {
+ // degenerate case
+ var widen;
+ if (max == 0.0)
+ widen = 1.0;
+ else
+ widen = 0.01;
+
+ min -= widen;
+ max += widen;
+ }
+ else {
+ // consider autoscaling
+ var margin = axisOptions.autoscaleMargin;
+ if (margin != null) {
+ if (axisOptions.min == null) {
+ min -= (max - min) * margin;
+ // make sure we don't go below zero if all values
+ // are positive
+ if (min < 0 && axis.datamin >= 0)
+ min = 0;
+ }
+ if (axisOptions.max == null) {
+ max += (max - min) * margin;
+ if (max > 0 && axis.datamax <= 0)
+ max = 0;
+ }
+ }
+ }
+ axis.min = min;
+ axis.max = max;
+ },
+ /**
+ * function: prepareTickGeneration
+ *
+ * Parameters:
+ * {Object} axis
+ * {Object} axisOptions
+ */
+ prepareTickGeneration: function(axis, axisOptions) {
+ // estimate number of ticks
+ var noTicks;
+ if (Object.isNumber(axisOptions.ticks) && axisOptions.ticks > 0)
+ noTicks = axisOptions.ticks;
+ else if (axis == this.xaxis)
+ noTicks = this.canvasWidth / 100;
+ else
+ noTicks = this.canvasHeight / 60;
+
+ var delta = (axis.max - axis.min) / noTicks;
+ var size, generator, unit, formatter, i, magn, norm;
+
+ if (axisOptions.mode == "time") {
+ function formatDate(d, fmt, monthNames) {
+ var leftPad = function(n) {
+ n = "" + n;
+ return n.length == 1 ? "0" + n : n;
+ };
+
+ var r = [];
+ var escape = false;
+ if (monthNames == null)
+ monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
+ for (var i = 0; i < fmt.length; ++i) {
+ var c = fmt.charAt(i);
+
+ if (escape) {
+ switch (c) {
+ case 'h': c = "" + d.getHours(); break;
+ case 'H': c = leftPad(d.getHours()); break;
+ case 'M': c = leftPad(d.getMinutes()); break;
+ case 'S': c = leftPad(d.getSeconds()); break;
+ case 'd': c = "" + d.getDate(); break;
+ case 'm': c = "" + (d.getMonth() + 1); break;
+ case 'y': c = "" + d.getFullYear(); break;
+ case 'b': c = "" + monthNames[d.getMonth()]; break;
+ }
+ r.push(c);
+ escape = false;
+ }
+ else {
+ if (c == "%")
+ escape = true;
+ else
+ r.push(c);
+ }
+ }
+ return r.join("");
+ }
+
+
+ // map of app. size of time units in milliseconds
+ var timeUnitSize = {
+ "second": 1000,
+ "minute": 60 * 1000,
+ "hour": 60 * 60 * 1000,
+ "day": 24 * 60 * 60 * 1000,
+ "month": 30 * 24 * 60 * 60 * 1000,
+ "year": 365.2425 * 24 * 60 * 60 * 1000
+ };
+
+
+ // the allowed tick sizes, after 1 year we use
+ // an integer algorithm
+ var spec = [
+ [1, "second"], [2, "second"], [5, "second"], [10, "second"],
+ [30, "second"],
+ [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"],
+ [30, "minute"],
+ [1, "hour"], [2, "hour"], [4, "hour"],
+ [8, "hour"], [12, "hour"],
+ [1, "day"], [2, "day"], [3, "day"],
+ [0.25, "month"], [0.5, "month"], [1, "month"],
+ [2, "month"], [3, "month"], [6, "month"],
+ [1, "year"]
+ ];
+
+ var minSize = 0;
+ if (axisOptions.minTickSize != null) {
+ if (typeof axisOptions.tickSize == "number")
+ minSize = axisOptions.tickSize;
+ else
+ minSize = axisOptions.minTickSize[0] * timeUnitSize[axisOptions.minTickSize[1]];
+ }
+
+ for (i = 0; i < spec.length - 1; ++i) {
+ if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {
+ break;
+ }
+ }
+
+ size = spec[i][0];
+ unit = spec[i][1];
+
+ // special-case the possibility of several years
+ if (unit == "year") {
+ magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10));
+ norm = (delta / timeUnitSize.year) / magn;
+ if (norm < 1.5)
+ size = 1;
+ else if (norm < 3)
+ size = 2;
+ else if (norm < 7.5)
+ size = 5;
+ else
+ size = 10;
+
+ size *= magn;
+ }
+
+ if (axisOptions.tickSize) {
+ size = axisOptions.tickSize[0];
+ unit = axisOptions.tickSize[1];
+ }
+
+ var floorInBase = this.floorInBase; //gives us a reference to a global function..
+
+ generator = function(axis) {
+ var ticks = [],
+ tickSize = axis.tickSize[0], unit = axis.tickSize[1],
+ d = new Date(axis.min);
+
+ var step = tickSize * timeUnitSize[unit];
+
+
+
+ if (unit == "second")
+ d.setSeconds(floorInBase(d.getSeconds(), tickSize));
+ if (unit == "minute")
+ d.setMinutes(floorInBase(d.getMinutes(), tickSize));
+ if (unit == "hour")
+ d.setHours(floorInBase(d.getHours(), tickSize));
+ if (unit == "month")
+ d.setMonth(floorInBase(d.getMonth(), tickSize));
+ if (unit == "year")
+ d.setFullYear(floorInBase(d.getFullYear(), tickSize));
+
+ // reset smaller components
+ d.setMilliseconds(0);
+ if (step >= timeUnitSize.minute)
+ d.setSeconds(0);
+ if (step >= timeUnitSize.hour)
+ d.setMinutes(0);
+ if (step >= timeUnitSize.day)
+ d.setHours(0);
+ if (step >= timeUnitSize.day * 4)
+ d.setDate(1);
+ if (step >= timeUnitSize.year)
+ d.setMonth(0);
+
+
+ var carry = 0, v;
+ do {
+ v = d.getTime();
+ ticks.push({ v: v, label: axis.tickFormatter(v, axis) });
+ if (unit == "month") {
+ if (tickSize < 1) {
+ d.setDate(1);
+ var start = d.getTime();
+ d.setMonth(d.getMonth() + 1);
+ var end = d.getTime();
+ d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);
+ carry = d.getHours();
+ d.setHours(0);
+ }
+ else
+ d.setMonth(d.getMonth() + tickSize);
+ }
+ else if (unit == "year") {
+ d.setFullYear(d.getFullYear() + tickSize);
+ }
+ else
+ d.setTime(v + step);
+ } while (v < axis.max);
+
+ return ticks;
+ };
+
+ formatter = function (v, axis) {
+ var d = new Date(v);
+
+ // first check global format
+ if (axisOptions.timeformat != null)
+ return formatDate(d, axisOptions.timeformat, axisOptions.monthNames);
+
+ var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];
+ var span = axis.max - axis.min;
+
+ if (t < timeUnitSize.minute)
+ fmt = "%h:%M:%S";
+ else if (t < timeUnitSize.day) {
+ if (span < 2 * timeUnitSize.day)
+ fmt = "%h:%M";
+ else
+ fmt = "%b %d %h:%M";
+ }
+ else if (t < timeUnitSize.month)
+ fmt = "%b %d";
+ else if (t < timeUnitSize.year) {
+ if (span < timeUnitSize.year)
+ fmt = "%b";
+ else
+ fmt = "%b %y";
+ }
+ else
+ fmt = "%y";
+
+ return formatDate(d, fmt, axisOptions.monthNames);
+ };
+ }
+ else {
+ // pretty rounding of base-10 numbers
+ var maxDec = axisOptions.tickDecimals;
+ var dec = -Math.floor(Math.log(delta) / Math.LN10);
+ if (maxDec != null && dec > maxDec)
+ dec = maxDec;
+
+ magn = Math.pow(10, -dec);
+ norm = delta / magn; // norm is between 1.0 and 10.0
+
+ if (norm < 1.5)
+ size = 1;
+ else if (norm < 3) {
+ size = 2;
+ // special case for 2.5, requires an extra decimal
+ if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
+ size = 2.5;
+ ++dec;
+ }
+ }
+ else if (norm < 7.5)
+ size = 5;
+ else
+ size = 10;
+
+ size *= magn;
+
+ if (axisOptions.minTickSize != null && size < axisOptions.minTickSize)
+ size = axisOptions.minTickSize;
+
+ if (axisOptions.tickSize != null)
+ size = axisOptions.tickSize;
+
+ axis.tickDecimals = Math.max(0, (maxDec != null) ? maxDec : dec);
+
+ var floorInBase = this.floorInBase;
+
+ generator = function (axis) {
+ var ticks = [];
+ var start = floorInBase(axis.min, axis.tickSize);
+ // then spew out all possible ticks
+ var i = 0, v;
+ do {
+ v = start + i * axis.tickSize;
+ ticks.push({ v: v, label: axis.tickFormatter(v, axis) });
+ ++i;
+ } while (v < axis.max);
+ return ticks;
+ };
+
+ formatter = function (v, axis) {
+ if(v) {
+ return v.toFixed(axis.tickDecimals);
+ }
+ return 0;
+ };
+ }
+
+ axis.tickSize = unit ? [size, unit] : size;
+ axis.tickGenerator = generator;
+ if (Object.isFunction(axisOptions.tickFormatter))
+ axis.tickFormatter = function (v, axis) { return "" + axisOptions.tickFormatter(v, axis); };
+ else
+ axis.tickFormatter = formatter;
+ },
+ /**
+ * function: extendXRangeIfNeededByBar
+ */
+ extendXRangeIfNeededByBar: function() {
+
+ if (this.options.xaxis.max == null) {
+ // great, we're autoscaling, check if we might need a bump
+ var newmax = this.xaxis.max;
+ this.graphData.each(function(gd){
+ if(gd.bars.show && gd.bars.barWidth + this.xaxis.datamax > newmax)
+ {
+ newmax = this.xaxis.datamax + gd.bars.barWidth;
+ }
+ }.bind(this));
+ this.xaxis.nax = newmax;
+
+ }
+ },
+ /**
+ * function: setTicks
+ *
+ * parameters:
+ * {Object} axis
+ * {Object} axisOptions
+ */
+ setTicks: function(axis, axisOptions) {
+ axis.ticks = [];
+
+ if (axisOptions.ticks == null)
+ axis.ticks = axis.tickGenerator(axis);
+ else if (typeof axisOptions.ticks == "number") {
+ if (axisOptions.ticks > 0)
+ axis.ticks = axis.tickGenerator(axis);
+ }
+ else if (axisOptions.ticks) {
+ var ticks = axisOptions.ticks;
+
+ if (Object.isFunction(ticks))
+ // generate the ticks
+ ticks = ticks({ min: axis.min, max: axis.max });
+
+ // clean up the user-supplied ticks, copy them over
+ //var i, v;
+ ticks.each(function(t, i){
+ var v = null;
+ var label = null;
+ if(typeof t == 'object') {
+ v = t[0];
+ if(t.length > 1) { label = t[1]; }
+ }
+ else {
+ v = t;
+ }
+ if(!label) {
+ label = axis.tickFormatter(v, axis);
+ }
+ axis.ticks[i] = {v: v, label: label}
+ }.bind(this));
+
+ }
+
+ if (axisOptions.autoscaleMargin != null && axis.ticks.length > 0) {
+ if (axisOptions.min == null)
+ axis.min = Math.min(axis.min, axis.ticks[0].v);
+ if (axisOptions.max == null && axis.ticks.length > 1)
+ axis.max = Math.min(axis.max, axis.ticks[axis.ticks.length - 1].v);
+ }
+ },
+ /**
+ * Function: setSpacing
+ *
+ * Parameters: none
+ */
+ setSpacing: function() {
+ // calculate y label dimensions
+ var i, labels = [], l;
+ for (i = 0; i < this.yaxis.ticks.length; ++i) {
+ l = this.yaxis.ticks[i].label;
+
+ if (l)
+ labels.push('<div class="tickLabel">' + l + '</div>');
+ }
+
+ if (labels.length > 0) {
+ var dummyDiv = new Element('div', {'style': 'position:absolute;top:-10000px;font-size:smaller'});
+ dummyDiv.update(labels.join(""));
+ this.domObj.insert(dummyDiv);
+ this.yLabelMaxWidth = dummyDiv.getWidth();
+ this.yLabelMaxHeight = dummyDiv.select('div')[0].getHeight();
+ dummyDiv.remove();
+ }
+
+ var maxOutset = this.options.grid.borderWidth;
+ if (this.options.points.show)
+ maxOutset = Math.max(maxOutset, this.options.points.radius + this.options.points.lineWidth/2);
+ for (i = 0; i < this.graphData.length; ++i) {
+ if (this.graphData[i].points.show)
+ maxOutset = Math.max(maxOutset, this.graphData[i].points.radius + this.graphData[i].points.lineWidth/2);
+ }
+
+ this.chartOffset.left = this.chartOffset.right = this.chartOffset.top = this.chartOffset.bottom = maxOutset;
+
+ this.chartOffset.left += this.yLabelMaxWidth + this.options.grid.labelMargin;
+ this.chartWidth = this.canvasWidth - this.chartOffset.left - this.chartOffset.right;
+
+ this.xLabelBoxWidth = this.chartWidth / 6;
+ labels = [];
+
+ for (i = 0; i < this.xaxis.ticks.length; ++i) {
+ l = this.xaxis.ticks[i].label;
+ if (l) {
+ labels.push('<span class="tickLabel" width="' + this.xLabelBoxWidth + '">' + l + '</span>');
+ }
+ }
+
+ var xLabelMaxHeight = 0;
+ if (labels.length > 0) {
+ var dummyDiv = new Element('div', {'style': 'position:absolute;top:-10000px;font-size:smaller'});
+ dummyDiv.update(labels.join(""));
+ this.domObj.appendChild(dummyDiv);
+ xLabelMaxHeight = dummyDiv.getHeight();
+ dummyDiv.remove();
+ }
+
+ this.chartOffset.bottom += xLabelMaxHeight + this.options.grid.labelMargin;
+ this.chartHeight = this.canvasHeight - this.chartOffset.bottom - this.chartOffset.top;
+ this.hozScale = this.chartWidth / (this.xaxis.max - this.xaxis.min);
+ this.vertScale = this.chartHeight / (this.yaxis.max - this.yaxis.min);
+ },
+ /**
+ * function: draw
+ */
+ draw: function() {
+ if(this.options.bars.show)
+ {
+ this.extendXRangeIfNeededByBar();
+ this.setSpacing();
+ this.drawGrid();
+ this.drawBarGraph(this.graphData, this.barDataRange);
+ }
+ else if(this.options.pies.show)
+ {
+ this.preparePieData(this.graphData);
+ this.drawPieGraph(this.graphData);
+ }
+ else
+ {
+ this.drawGrid();
+ for (var i = 0; i < this.graphData.length; i++) {
+ this.drawGraph(this.graphData[i]);
+ }
+ }
+ },
+ /**
+ * function: translateHoz
+ *
+ * Paramters:
+ * {Object} x
+ *
+ * Description: Given a value this function translate it to relative x coord on canvas
+ */
+ translateHoz: function(x) {
+ return (x - this.xaxis.min) * this.hozScale;
+ },
+ /**
+ * function: translateVert
+ *
+ * parameters:
+ * {Object} y
+ *
+ * Description: Given a value this function translate it to relative y coord on canvas
+ */
+ translateVert: function(y) {
+ return this.chartHeight - (y - this.yaxis.min) * this.vertScale;
+ },
+ /**
+ * function: drawGrid
+ *
+ * parameters: none
+ *
+ * description: draws the actual grid on the canvas
+ */
+ drawGrid: function() {
+ var i;
+
+ this.context.save();
+ this.context.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
+ this.context.translate(this.chartOffset.left, this.chartOffset.top);
+
+ // draw background, if any
+ if (this.options.grid.backgroundColor != null) {
+ this.context.fillStyle = this.options.grid.backgroundColor;
+ this.context.fillRect(0, 0, this.chartWidth, this.chartHeight);
+ }
+
+ // draw colored areas
+ if (this.options.grid.coloredAreas) {
+ var areas = this.options.grid.coloredAreas;
+ if (Object.isFunction(areas)) {
+ areas = areas({ xmin: this.xaxis.min, xmax: this.xaxis.max, ymin: this.yaxis.min, ymax: this.yaxis.max });
+ }
+
+ areas.each(function(a){
+ // clip
+ if (a.x1 == null || a.x1 < this.xaxis.min)
+ a.x1 = this.xaxis.min;
+ if (a.x2 == null || a.x2 > this.xaxis.max)
+ a.x2 = this.xaxis.max;
+ if (a.y1 == null || a.y1 < this.yaxis.min)
+ a.y1 = this.yaxis.min;
+ if (a.y2 == null || a.y2 > this.yaxis.max)
+ a.y2 = this.yaxis.max;
+
+ var tmp;
+ if (a.x1 > a.x2) {
+ tmp = a.x1;
+ a.x1 = a.x2;
+ a.x2 = tmp;
+ }
+ if (a.y1 > a.y2) {
+ tmp = a.y1;
+ a.y1 = a.y2;
+ a.y2 = tmp;
+ }
+
+ if (a.x1 >= this.xaxis.max || a.x2 <= this.xaxis.min || a.x1 == a.x2
+ || a.y1 >= this.yaxis.max || a.y2 <= this.yaxis.min || a.y1 == a.y2)
+ return;
+
+ this.context.fillStyle = a.color || this.options.grid.coloredAreasColor;
+ this.context.fillRect(Math.floor(this.translateHoz(a.x1)), Math.floor(this.translateVert(a.y2)),
+ Math.floor(this.translateHoz(a.x2) - this.translateHoz(a.x1)), Math.floor(this.translateVert(a.y1) - this.translateVert(a.y2)));
+ }.bind(this));
+
+
+ }
+
+ // draw the inner grid
+ this.context.lineWidth = 1;
+ this.context.strokeStyle = this.options.grid.tickColor;
+ this.context.beginPath();
+ var v;
+ if (this.options.grid.drawXAxis) {
+ this.xaxis.ticks.each(function(aTick){
+ v = aTick.v;
+ if(v <= this.xaxis.min || v >= this.xaxis.max) {
+ return;
+ }
+ this.context.moveTo(Math.floor(this.translateHoz(v)) + this.context.lineWidth / 2, 0);
+ this.context.lineTo(Math.floor(this.translateHoz(v)) + this.context.lineWidth / 2, this.chartHeight);
+ }.bind(this));
+
+ }
+
+ if (this.options.grid.drawYAxis) {
+ this.yaxis.ticks.each(function(aTick){
+ v = aTick.v;
+ if(v <= this.yaxis.min || v >= this.yaxis.max) {
+ return;
+ }
+ this.context.moveTo(0, Math.floor(this.translateVert(v)) + this.context.lineWidth / 2);
+ this.context.lineTo(this.chartWidth, Math.floor(this.translateVert(v)) + this.context.lineWidth / 2);
+ }.bind(this));
+
+ }
+ this.context.stroke();
+
+ if (this.options.grid.borderWidth) {
+ // draw border
+ this.context.lineWidth = this.options.grid.borderWidth;
+ this.context.strokeStyle = this.options.grid.color;
+ this.context.lineJoin = "round";
+ this.context.strokeRect(0, 0, this.chartWidth, this.chartHeight);
+ this.context.restore();
+ }
+ },
+ /**
+ * function: insertLabels
+ *
+ * parameters: none
+ *
+ * description: inserts the label with proper spacing. Both on X and Y axis
+ */
+ insertLabels: function() {
+ this.domObj.select(".tickLabels").invoke('remove');
+
+ var i, tick;
+ var html = '<div class="tickLabels" style="font-size:smaller;color:' + this.options.grid.color + '">';
+
+ // do the x-axis
+ this.xaxis.ticks.each(function(tick){
+ if (!tick.label || tick.v < this.xaxis.min || tick.v > this.xaxis.max)
+ return;
+ html += '<div style="position:absolute;top:' + (this.chartOffset.top + this.chartHeight + this.options.grid.labelMargin) + 'px;left:' + (this.chartOffset.left + this.translateHoz(tick.v) - this.xLabelBoxWidth/2) + 'px;width:' + this.xLabelBoxWidth + 'px;text-align:center" class="tickLabel">' + tick.label + "</div>";
+
+ }.bind(this));
+
+ // do the y-axis
+ this.yaxis.ticks.each(function(tick){
+ if (!tick.label || tick.v < this.yaxis.min || tick.v > this.yaxis.max)
+ return;
+ html += '<div id="ylabels" style="position:absolute;top:' + (this.chartOffset.top + this.translateVert(tick.v) - this.yLabelMaxHeight/2) + 'px;left:0;width:' + this.yLabelMaxWidth + 'px;text-align:right" class="tickLabel">' + tick.label + "</div>";
+ }.bind(this));
+
+ html += '</div>';
+
+ this.domObj.insert(html);
+ },
+ /**
+ * function: drawGraph
+ *
+ * Paramters:
+ * {Object} graphData
+ *
+ * Description: given a graphData (series) this function calls a proper lower level method to draw it.
+ */
+ drawGraph: function(graphData) {
+ if (graphData.lines.show || (!graphData.bars.show && !graphData.points.show))
+ this.drawGraphLines(graphData);
+ if (graphData.bars.show)
+ this.drawGraphBar(graphData);
+ if (graphData.points.show)
+ this.drawGraphPoints(graphData);
+ },
+ /**
+ * function: plotLine
+ *
+ * parameters:
+ * {Object} data
+ * {Object} offset
+ *
+ * description:
+ * Helper function that plots a line based on the data provided
+ */
+ plotLine: function(data, offset) {
+ var prev, cur = null, drawx = null, drawy = null;
+
+ this.context.beginPath();
+ for (var i = 0; i < data.length; ++i) {
+ prev = cur;
+ cur = data[i];
+
+ if (prev == null || cur == null)
+ continue;
+
+ var x1 = prev[0], y1 = prev[1],
+ x2 = cur[0], y2 = cur[1];
+
+ // clip with ymin
+ if (y1 <= y2 && y1 < this.yaxis.min) {
+ if (y2 < this.yaxis.min)
+ continue; // line segment is outside
+ // compute new intersection point
+ x1 = (this.yaxis.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+ y1 = this.yaxis.min;
+ }
+ else if (y2 <= y1 && y2 < this.yaxis.min) {
+ if (y1 < this.yaxis.min)
+ continue;
+ x2 = (this.yaxis.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+ y2 = this.yaxis.min;
+ }
+
+ // clip with ymax
+ if (y1 >= y2 && y1 > this.yaxis.max) {
+ if (y2 > this.yaxis.max)
+ continue;
+ x1 = (this.yaxis.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+ y1 = this.yaxis.max;
+ }
+ else if (y2 >= y1 && y2 > this.yaxis.max) {
+ if (y1 > this.yaxis.max)
+ continue;
+ x2 = (this.yaxis.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+ y2 = this.yaxis.max;
+ }
+
+ // clip with xmin
+ if (x1 <= x2 && x1 < this.xaxis.min) {
+ if (x2 < this.xaxis.min)
+ continue;
+ y1 = (this.xaxis.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+ x1 = this.xaxis.min;
+ }
+ else if (x2 <= x1 && x2 < this.xaxis.min) {
+ if (x1 < this.xaxis.min)
+ continue;
+ y2 = (this.xaxis.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+ x2 = this.xaxis.min;
+ }
+
+ // clip with xmax
+ if (x1 >= x2 && x1 > this.xaxis.max) {
+ if (x2 > this.xaxis.max)
+ continue;
+ y1 = (this.xaxis.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+ x1 = this.xaxis.max;
+ }
+ else if (x2 >= x1 && x2 > this.xaxis.max) {
+ if (x1 > this.xaxis.max)
+ continue;
+ y2 = (this.xaxis.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+ x2 = this.xaxis.max;
+ }
+
+ if (drawx != this.translateHoz(x1) || drawy != this.translateVert(y1) + offset)
+ this.context.moveTo(this.translateHoz(x1), this.translateVert(y1) + offset);
+
+ drawx = this.translateHoz(x2);
+ drawy = this.translateVert(y2) + offset;
+ this.context.lineTo(drawx, drawy);
+ }
+ this.context.stroke();
+ },
+ /**
+ * function: plotLineArea
+ *
+ * parameters:
+ * {Object} data
+ *
+ * description:
+ * Helper functoin that plots a colored line graph. This function
+ * takes the data nad then fill in the area on the graph properly
+ */
+ plotLineArea: function(data) {
+ var prev, cur = null;
+
+ var bottom = Math.min(Math.max(0, this.yaxis.min), this.yaxis.max);
+ var top, lastX = 0;
+
+ var areaOpen = false;
+
+ for (var i = 0; i < data.length; ++i) {
+ prev = cur;
+ cur = data[i];
+
+ if (areaOpen && prev != null && cur == null) {
+ // close area
+ this.context.lineTo(this.translateHoz(lastX), this.translateVert(bottom));
+ this.context.fill();
+ areaOpen = false;
+ continue;
+ }
+
+ if (prev == null || cur == null)
+ continue;
+
+ var x1 = prev[0], y1 = prev[1],
+ x2 = cur[0], y2 = cur[1];
+
+ // clip x values
+
+ // clip with xmin
+ if (x1 <= x2 && x1 < this.xaxis.min) {
+ if (x2 < this.xaxis.min)
+ continue;
+ y1 = (this.xaxis.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+ x1 = this.xaxis.min;
+ }
+ else if (x2 <= x1 && x2 < this.xaxis.min) {
+ if (x1 < this.xaxis.min)
+ continue;
+ y2 = (this.xaxis.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+ x2 = this.xaxis.min;
+ }
+
+ // clip with xmax
+ if (x1 >= x2 && x1 > this.xaxis.max) {
+ if (x2 > this.xaxis.max)
+ continue;
+ y1 = (this.xaxis.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+ x1 = this.xaxis.max;
+ }
+ else if (x2 >= x1 && x2 > this.xaxis.max) {
+ if (x1 > this.xaxis.max)
+ continue;
+ y2 = (this.xaxis.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+ x2 = this.xaxis.max;
+ }
+
+ if (!areaOpen) {
+ // open area
+ this.context.beginPath();
+ this.context.moveTo(this.translateHoz(x1), this.translateVert(bottom));
+ areaOpen = true;
+ }
+
+ // now first check the case where both is outside
+ if (y1 >= this.yaxis.max && y2 >= this.yaxis.max) {
+ this.context.lineTo(this.translateHoz(x1), this.translateVert(this.yaxis.max));
+ this.context.lineTo(this.translateHoz(x2), this.translateVert(this.yaxis.max));
+ continue;
+ }
+ else if (y1 <= this.yaxis.min && y2 <= this.yaxis.min) {
+ this.context.lineTo(this.translateHoz(x1), this.translateVert(this.yaxis.min));
+ this.context.lineTo(this.translateHoz(x2), this.translateVert(this.yaxis.min));
+ continue;
+ }
+
+ var x1old = x1, x2old = x2;
+
+ // clip with ymin
+ if (y1 <= y2 && y1 < this.yaxis.min && y2 >= this.yaxis.min) {
+ x1 = (this.yaxis.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+ y1 = this.yaxis.min;
+ }
+ else if (y2 <= y1 && y2 < this.yaxis.min && y1 >= this.yaxis.min) {
+ x2 = (this.yaxis.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+ y2 = this.yaxis.min;
+ }
+
+ // clip with ymax
+ if (y1 >= y2 && y1 > this.yaxis.max && y2 <= this.yaxis.max) {
+ x1 = (this.yaxis.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+ y1 = this.yaxis.max;
+ }
+ else if (y2 >= y1 && y2 > this.yaxis.max && y1 <= this.yaxis.max) {
+ x2 = (this.yaxis.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+ y2 = this.yaxis.max;
+ }
+
+
+ // if the x value was changed we got a rectangle
+ // to fill
+ if (x1 != x1old) {
+ if (y1 <= this.yaxis.min)
+ top = this.yaxis.min;
+ else
+ top = this.yaxis.max;
+
+ this.context.lineTo(this.translateHoz(x1old), this.translateVert(top));
+ this.context.lineTo(this.translateHoz(x1), this.translateVert(top));
+ }
+
+ // fill the triangles
+ this.context.lineTo(this.translateHoz(x1), this.translateVert(y1));
+ this.context.lineTo(this.translateHoz(x2), this.translateVert(y2));
+
+ // fill the other rectangle if it's there
+ if (x2 != x2old) {
+ if (y2 <= this.yaxis.min)
+ top = this.yaxis.min;
+ else
+ top = this.yaxis.max;
+
+ this.context.lineTo(this.translateHoz(x2old), this.translateVert(top));
+ this.context.lineTo(this.translateHoz(x2), this.translateVert(top));
+ }
+
+ lastX = Math.max(x2, x2old);
+ }
+
+ if (areaOpen) {
+ this.context.lineTo(this.translateHoz(lastX), this.translateVert(bottom));
+ this.context.fill();
+ }
+ },
+ /**
+ * function: drawGraphLines
+ *
+ * parameters:
+ * {Object} graphData
+ *
+ * description:
+ * Main function that daws the line graph. This function is called
+ * if <options> lines property is set to show or no other type of
+ * graph is specified. This function depends on <plotLineArea> and
+ * <plotLine> functions.
+ */
+ drawGraphLines: function(graphData) {
+ this.context.save();
+ this.context.translate(this.chartOffset.left, this.chartOffset.top);
+ this.context.lineJoin = "round";
+
+ var lw = graphData.lines.lineWidth;
+ var sw = graphData.shadowSize;
+ // FIXME: consider another form of shadow when filling is turned on
+ if (sw > 0) {
+ // draw shadow in two steps
+ this.context.lineWidth = sw / 2;
+ this.context.strokeStyle = "rgba(0,0,0,0.1)";
+ this.plotLine(graphData.data, lw/2 + sw/2 + this.context.lineWidth/2);
+
+ this.context.lineWidth = sw / 2;
+ this.context.strokeStyle = "rgba(0,0,0,0.2)";
+ this.plotLine(graphData.data, lw/2 + this.context.lineWidth/2);
+ }
+
+ this.context.lineWidth = lw;
+ this.context.strokeStyle = graphData.color;
+ if (graphData.lines.fill) {
+ this.context.fillStyle = graphData.lines.fillColor != null ? graphData.lines.fillColor : this.parseColor(graphData.color).scale(null, null, null, 0.4).toString();
+ this.plotLineArea(graphData.data, 0);
+ }
+
+ this.plotLine(graphData.data, 0);
+ this.context.restore();
+ },
+ /**
+ * function: plotPoints
+ *
+ * parameters:
+ * {Object} data
+ * {Object} radius
+ * {Object} fill
+ *
+ * description:
+ * Helper function that draws the point graph according to the data provided. Size of each
+ * point is provided by radius variable and fill specifies if points
+ * are filled
+ */
+ plotPoints: function(data, radius, fill) {
+ for (var i = 0; i < data.length; ++i) {
+ if (data[i] == null)
+ continue;
+
+ var x = data[i][0], y = data[i][1];
+ if (x < this.xaxis.min || x > this.xaxis.max || y < this.yaxis.min || y > this.yaxis.max)
+ continue;
+
+ this.context.beginPath();
+ this.context.arc(this.translateHoz(x), this.translateVert(y), radius, 0, 2 * Math.PI, true);
+ if (fill)
+ this.context.fill();
+ this.context.stroke();
+ }
+ },
+ /**
+ * function: plotPointShadows
+ *
+ * parameters:
+ * {Object} data
+ * {Object} offset
+ * {Object} radius
+ *
+ * description:
+ * Helper function that draws the shadows for the points.
+ */
+ plotPointShadows: function(data, offset, radius) {
+ for (var i = 0; i < data.length; ++i) {
+ if (data[i] == null)
+ continue;
+
+ var x = data[i][0], y = data[i][1];
+ if (x < this.xaxis.min || x > this.xaxis.max || y < this.yaxis.min || y > this.yaxis.max)
+ continue;
+ this.context.beginPath();
+ this.context.arc(this.translateHoz(x), this.translateVert(y) + offset, radius, 0, Math.PI, false);
+ this.context.stroke();
+ }
+ },
+ /**
+ * function: drawGraphPoints
+ *
+ * paramters:
+ * {Object} graphData
+ *
+ * description:
+ * Draws the point graph onto the canvas. This function depends on helper
+ * functions <plotPointShadows> and <plotPoints>
+ */
+ drawGraphPoints: function(graphData) {
+ this.context.save();
+ this.context.translate(this.chartOffset.left, this.chartOffset.top);
+
+ var lw = graphData.lines.lineWidth;
+ var sw = graphData.shadowSize;
+ if (sw > 0) {
+ // draw shadow in two steps
+ this.context.lineWidth = sw / 2;
+ this.context.strokeStyle = "rgba(0,0,0,0.1)";
+ this.plotPointShadows(graphData.data, sw/2 + this.context.lineWidth/2, graphData.points.radius);
+
+ this.context.lineWidth = sw / 2;
+ this.context.strokeStyle = "rgba(0,0,0,0.2)";
+ this.plotPointShadows(graphData.data, this.context.lineWidth/2, graphData.points.radius);
+ }
+
+ this.context.lineWidth = graphData.points.lineWidth;
+ this.context.strokeStyle = graphData.color;
+ this.context.fillStyle = graphData.points.fillColor != null ? graphData.points.fillColor : graphData.color;
+ this.plotPoints(graphData.data, graphData.points.radius, graphData.points.fill);
+ this.context.restore();
+ },
+ /**
+ * function: preparePieData
+ *
+ * parameters:
+ * {Object} graphData
+ *
+ * Description:
+ * Helper function that manipulates the given data stream so that it can
+ * be plotted as a Pie Chart
+ */
+ preparePieData: function(graphData)
+ {
+ for(i = 0; i < graphData.length; i++)
+ {
+ var data = 0;
+ for(j = 0; j < graphData[i].data.length; j++){
+ data += parseInt(graphData[i].data[j][1]);
+ }
+ graphData[i].data = data;
+ }
+ },
+ /**
+ * function: drawPieShadow
+ *
+ * {Object} anchorX
+ * {Object} anchorY
+ * {Object} radius
+ *
+ * description:
+ * Helper function that draws a shadow for the Pie Chart. This just draws
+ * a circle with offset that simulates shadow. We do not give each piece
+ * of the pie an individual shadow.
+ */
+ drawPieShadow: function(anchorX, anchorY, radius)
+ {
+ this.context.beginPath();
+ this.context.moveTo(anchorX, anchorY);
+ this.context.fillStyle = 'rgba(0,0,0,' + 0.1 + ')';
+ startAngle = 0;
+ endAngle = (Math.PI/180)*360;
+ this.context.arc(anchorX + 2, anchorY +2, radius + (this.options.shadowSize/2), startAngle, endAngle, false);
+ this.context.fill();
+ this.context.closePath();
+ },
+ /**
+ * function: drawPieGraph
+ *
+ * parameters:
+ * {Object} graphData
+ *
+ * description:
+ * Draws the actual pie chart. This function depends on helper function
+ * <drawPieShadow> to draw the actual shadow
+ */
+ drawPieGraph: function(graphData)
+ {
+ var sumData = 0;
+ var radius = 0;
+ var centerX = this.chartWidth/2;
+ var centerY = this.chartHeight/2;
+ var startAngle = 0;
+ var endAngle = 0;
+ var fontSize = this.options.pies.fontSize;
+ var labelWidth = this.options.pies.labelWidth;
+
+ //determine Pie Radius
+ if(!this.options.pies.autoScale)
+ radius = this.options.pies.radius;
+ else
+ radius = (this.chartHeight * 0.85)/2;
+
+ var labelRadius = radius * 1.05;
+
+ for(i = 0; i < graphData.length; i++)
+ sumData += graphData[i].data;
+
+ // used to adjust labels so that everything adds up to 100%
+ totalPct = 0;
+
+ //lets draw the shadow first.. we don't need an individual shadow to every pie rather we just
+ //draw a circle underneath to simulate the shadow...
+ this.drawPieShadow(centerX, centerY, radius, 0, 0);
+
+ //lets draw the actual pie chart now.
+ graphData.each(function(gd, j){
+ var pct = gd.data / sumData;
+ startAngle = endAngle;
+ endAngle += pct * (2 * Math.PI);
+ var sliceMiddle = (endAngle - startAngle) / 2 + startAngle;
+ var labelX = centerX + Math.cos(sliceMiddle) * labelRadius;
+ var labelY = centerY + Math.sin(sliceMiddle) * labelRadius;
+ var anchorX = centerX;
+ var anchorY = centerY;
+ var textAlign = null;
+ var verticalAlign = null;
+ var left = 0;
+ var top = 0;
+
+ //draw pie:
+ //drawing pie
+ this.context.beginPath();
+ this.context.moveTo(anchorX, anchorY);
+ this.context.arc(anchorX, anchorY, radius, startAngle, endAngle, false);
+ this.context.closePath();
+ this.context.fillStyle = this.parseColor(gd.color).scale(null, null, null, this.options.pies.fillOpacity).toString();
+
+ if(this.options.pies.fill) { this.context.fill(); }
+
+ // drawing labels
+ if (sliceMiddle <= 0.25 * (2 * Math.PI))
+ {
+ // text on top and align left
+ textAlign = "left";
+ verticalAlign = "top";
+ left = labelX;
+ top = labelY + fontSize;
+ }
+ else if (sliceMiddle > 0.25 * (2 * Math.PI) && sliceMiddle <= 0.5 * (2 * Math.PI))
+ {
+ // text on bottom and align left
+ textAlign = "left";
+ verticalAlign = "bottom";
+ left = labelX - labelWidth;
+ top = labelY;
+ }
+ else if (sliceMiddle > 0.5 * (2 * Math.PI) && sliceMiddle <= 0.75 * (2 * Math.PI))
+ {
+ // text on bottom and align right
+ textAlign = "right";
+ verticalAlign = "bottom";
+ left = labelX - labelWidth;
+ top = labelY - fontSize;
+ }
+ else
+ {
+ // text on top and align right
+ textAlign = "right";
+ verticalAlign = "bottom";
+ left = labelX;
+ top = labelY - fontSize;
+ }
+
+ left = left + "px";
+ top = top + "px";
+ var textVal = Math.round(pct * 100);
+
+ if (j == graphData.length - 1) {
+ if (textVal + totalPct < 100) {
+ textVal = textVal + 1;
+ } else if (textVal + totalPct > 100) {
+ textVal = textVal - 1;
+ };
+ }
+
+ var html = "<div style=\"position: absolute;zindex:11; width:" + labelWidth + "px;fontSize:" + fontSize + "px;overflow:hidden;top:"+ top + ";left:"+ left + ";textAlign:" + textAlign + ";verticalAlign:" + verticalAlign +"\">" + textVal + "%</div>";
+ //$(html).appendTo(target);
+ this.domObj.insert(html);
+
+ totalPct = totalPct + textVal;
+ }.bind(this));
+
+ },
+ /**
+ * function: drawBarGraph
+ *
+ * parameters:
+ * {Object} graphData
+ * {Object} barDataRange
+ *
+ * description:
+ * Goes through each series in graphdata and passes it onto <drawBarGraphs> function
+ */
+ drawBarGraph: function(graphData, barDataRange)
+ {
+ graphData.each(function(gd, i){
+ this.drawGraphBars(gd, i, graphData.size(), barDataRange);
+ }.bind(this));
+ },
+ /**
+ * function: drawGraphBar
+ *
+ * parameters:
+ * {Object} graphData
+ *
+ * description:
+ * This function is called when an individual series in GraphData is bar graph and plots it
+ */
+ drawGraphBar: function(graphData)
+ {
+ this.drawGraphBars(graphData, 0, this.graphData.length, this.barDataRange);
+ },
+ /**
+ * function: plotBars
+ *
+ * parameters:
+ * {Object} graphData
+ * {Object} data
+ * {Object} barWidth
+ * {Object} offset
+ * {Object} fill
+ * {Object} counter
+ * {Object} total
+ * {Object} barDataRange
+ *
+ * description:
+ * Helper function that draws the bar graph based on data.
+ */
+ plotBars: function(graphData, data, barWidth, offset, fill,counter, total, barDataRange) {
+ var shift = 0;
+
+ if(total % 2 == 0)
+ {
+ shift = (1 + ((counter - total /2 ) - 1)) * barWidth;
+ }
+ else
+ {
+ var interval = 0.5;
+ if(counter == (total/2 - interval )) {
+ shift = - barWidth * interval;
+ }
+ else {
+ shift = (interval + (counter - Math.round(total/2))) * barWidth;
+ }
+ }
+
+ var rangeData = [];
+ data.each(function(d){
+ if(!d) return;
+
+ var x = d[0], y = d[1];
+ var drawLeft = true, drawTop = true, drawRight = true;
+ var left = x + shift, right = x + barWidth + shift, bottom = 0, top = y;
+ var rangeDataPoint = {};
+ rangeDataPoint.left = left;
+ rangeDataPoint.right = right;
+ rangeDataPoint.value = top;
+ rangeData.push(rangeDataPoint);
+
+ if (right < this.xaxis.min || left > this.xaxis.max || top < this.yaxis.min || bottom > this.yaxis.max)
+ return;
+
+ // clip
+ if (left < this.xaxis.min) {
+ left = this.xaxis.min;
+ drawLeft = false;
+ }
+
+ if (right > this.xaxis.max) {
+ right = this.xaxis.max;
+ drawRight = false;
+ }
+
+ if (bottom < this.yaxis.min)
+ bottom = this.yaxis.min;
+
+ if (top > this.yaxis.max) {
+ top = this.yaxis.max;
+ drawTop = false;
+ }
+
+ if(graphData.bars.showShadow && graphData.shadowSize > 0)
+ this.plotShadowOutline(graphData, this.context.strokeStyle, left, bottom, top, right, drawLeft, drawRight, drawTop);
+
+ // fill the bar
+ if (fill) {
+ this.context.beginPath();
+ this.context.moveTo(this.translateHoz(left), this.translateVert(bottom) + offset);
+ this.context.lineTo(this.translateHoz(left), this.translateVert(top) + offset);
+ this.context.lineTo(this.translateHoz(right), this.translateVert(top) + offset);
+ this.context.lineTo(this.translateHoz(right), this.translateVert(bottom) + offset);
+ this.context.fill();
+ }
+
+ // draw outline
+ if (drawLeft || drawRight || drawTop) {
+ this.context.beginPath();
+ this.context.moveTo(this.translateHoz(left), this.translateVert(bottom) + offset);
+ if (drawLeft)
+ this.context.lineTo(this.translateHoz(left), this.translateVert(top) + offset);
+ else
+ this.context.moveTo(this.translateHoz(left), this.translateVert(top) + offset);
+
+ if (drawTop)
+ this.context.lineTo(this.translateHoz(right), this.translateVert(top) + offset);
+ else
+ this.context.moveTo(this.translateHoz(right), this.translateVert(top) + offset);
+ if (drawRight)
+ this.context.lineTo(this.translateHoz(right), this.translateVert(bottom) + offset);
+ else
+ this.context.moveTo(this.translateHoz(right), this.translateVert(bottom) + offset);
+ this.context.stroke();
+ }
+ }.bind(this));
+
+ barDataRange.push(rangeData);
+ },
+ /**
+ * function: plotShadowOutline
+ *
+ * parameters:
+ * {Object} graphData
+ * {Object} orgStrokeStyle
+ * {Object} left
+ * {Object} bottom
+ * {Object} top
+ * {Object} right
+ * {Object} drawLeft
+ * {Object} drawRight
+ * {Object} drawTop
+ *
+ * description:
+ * Helper function that draws a outline simulating shadow for bar chart
+ */
+ plotShadowOutline: function(graphData, orgStrokeStyle, left, bottom, top, right, drawLeft, drawRight, drawTop)
+ {
+ var orgOpac = 0.3;
+
+ for(var n = 1; n <= this.options.shadowSize/2; n++)
+ {
+ var opac = orgOpac * n;
+ this.context.beginPath();
+ this.context.strokeStyle = "rgba(0,0,0," + opac + ")";
+
+ this.context.moveTo(this.translateHoz(left) + n, this.translateVert(bottom));
+
+ if(drawLeft)
+ this.context.lineTo(this.translateHoz(left) + n, this.translateVert(top) - n);
+ else
+ this.context.moveTo(this.translateHoz(left) + n, this.translateVert(top) - n);
+
+ if(drawTop)
+ this.context.lineTo(this.translateHoz(right) + n, this.translateVert(top) - n);
+ else
+ this.context.moveTo(this.translateHoz(right) + n, this.translateVert(top) - n);
+
+ if(drawRight)
+ this.context.lineTo(this.translateHoz(right) + n, this.translateVert(bottom));
+ else
+ this.context.lineTo(this.translateHoz(right) + n, this.translateVert(bottom));
+
+ this.context.stroke();
+ this.context.closePath();
+ }
+
+ this.context.strokeStyle = orgStrokeStyle;
+ },
+ /**
+ * function: drawGraphBars
+ *
+ * parameters:
+ * {Object} graphData
+ * {Object} counter
+ * {Object} total
+ * {Object} barDataRange
+ *
+ * description:
+ * Draws the actual bar graphs. Calls <plotBars> to draw the individual bar
+ */
+ drawGraphBars: function(graphData, counter, total, barDataRange){
+ this.context.save();
+ this.context.translate(this.chartOffset.left, this.chartOffset.top);
+ this.context.lineJoin = "round";
+
+ var bw = graphData.bars.barWidth;
+ var lw = Math.min(graphData.bars.lineWidth, bw);
+
+
+ this.context.lineWidth = lw;
+ this.context.strokeStyle = graphData.color;
+ if (graphData.bars.fill) {
+ this.context.fillStyle = graphData.bars.fillColor != null ? graphData.bars.fillColor : this.parseColor(graphData.color).scale(null, null, null, this.options.bars.fillOpacity).toString();
+ }
+ this.plotBars(graphData, graphData.data, bw, 0, graphData.bars.fill, counter, total, barDataRange);
+ this.context.restore();
+ },
+ /**
+ * function: insertLegend
+ *
+ * description:
+ * inserts legend onto the graph. *legend: {show: true}* must be set in <options>
+ * for for this to work.
+ */
+ insertLegend: function() {
+ this.domObj.select(".legend").invoke('remove');
+
+ if (!this.options.legend.show)
+ return;
+
+ var fragments = [];
+ var rowStarted = false;
+ this.graphData.each(function(gd, index){
+ if(!gd.label) {
+ return;
+ }
+ if(index % this.options.legend.noColumns == 0) {
+ if(rowStarted) {
+ fragments.push('</tr>');
+ }
+ fragments.push('<tr>');
+ rowStarted = true;
+ }
+ var label = gd.label;
+ if(this.options.legend.labelFormatter != null) {
+ label = this.options.legend.labelFormatter(label);
+ }
+
+ fragments.push(
+ '<td class="legendColorBox"><div style="border:1px solid ' + this.options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:14px;height:10px;background-color:' + gd.color + ';overflow:hidden"></div></div></td>' +
+ '<td class="legendLabel">' + label + '</td>');
+
+ }.bind(this));
+
+ if (rowStarted)
+ fragments.push('</tr>');
+
+ if(fragments.length > 0){
+ var table = '<table style="font-size:smaller;color:' + this.options.grid.color + '">' + fragments.join("") + '</table>';
+ if($(this.options.legend.container) != null){
+ $(this.options.legend.container).insert(table);
+ }else{
+ var pos = '';
+ var p = this.options.legend.position, m = this.options.legend.margin;
+
+ if(p.charAt(0) == 'n') pos += 'top:' + (m + this.chartOffset.top) + 'px;';
+ else if(p.charAt(0) == 's') pos += 'bottom:' + (m + this.chartOffset.bottom) + 'px;';
+ if(p.charAt(1) == 'e') pos += 'right:' + (m + this.chartOffset.right) + 'px;';
+ else if(p.charAt(1) == 'w') pos += 'left:' + (m + this.chartOffset.bottom) + 'px;';
+ var div = this.domObj.insert('<div class="ProtoChart-legend" style="border: 1px solid '+this.options.legend.borderColor+'; position:absolute;z-index:2;' + pos +'">' + table + '</div>').getElementsBySelector('div.ProtoChart-legend').first();
+
+ if(this.options.legend.backgroundOpacity != 0.0){
+ var c = this.options.legend.backgroundColor;
+ if(c == null){
+ var tmp = (this.options.grid.backgroundColor != null) ? this.options.grid.backgroundColor : this.extractColor(div);
+ c = this.parseColor(tmp).adjust(null, null, null, 1).toString();
+ }
+ this.domObj.insert('<div class="ProtoChart-legend-bg" style="position:absolute;width:' + div.getWidth() + 'px;height:' + div.getHeight() + 'px;' + pos +'background-color:' + c + ';"> </div>').select('div.ProtoChart-legend-bg').first().setStyle({
+ 'opacity': this.options.legend.backgroundOpacity
+ });
+ }
+ }
+ }
+ },
+ /**
+ * Function: onMouseMove
+ *
+ * parameters:
+ * event: {Object} ev
+ *
+ * Description:
+ * Called whenever the mouse is moved on the graph. This takes care of the mousetracking.
+ * This event also fires <ProtoChart:mousemove> event, which gets current position of the
+ * mouse as a parameters.
+ */
+ onMouseMove: function(ev) {
+ var e = ev || window.event;
+ if (e.pageX == null && e.clientX != null) {
+ var de = document.documentElement, b = $(document.body);
+ this.lastMousePos.pageX = e.clientX + (de && de.scrollLeft || b.scrollLeft || 0);
+ this.lastMousePos.pageY = e.clientY + (de && de.scrollTop || b.scrollTop || 0);
+ }
+ else {
+ this.lastMousePos.pageX = e.pageX;
+ this.lastMousePos.pageY = e.pageY;
+ }
+
+ var offset = this.overlay.cumulativeOffset();
+ var pos = {
+ x: this.xaxis.min + (e.pageX - offset.left - this.chartOffset.left) / this.hozScale,
+ y: this.yaxis.max - (e.pageY - offset.top - this.chartOffset.top) / this.vertScale
+ };
+
+ if(this.options.mouse.track && this.selectionInterval == null) {
+ this.hit(ev, pos);
+ }
+ this.domObj.fire("ProtoChart:mousemove", [ pos ]);
+ },
+ /**
+ * Function: onMouseDown
+ *
+ * Parameters:
+ * Event - {Object} e
+ *
+ * Description:
+ * Called whenever the mouse is clicked.
+ */
+ onMouseDown: function(e) {
+ if (e.which != 1) // only accept left-click
+ return;
+
+ document.body.focus();
+
+ if (document.onselectstart !== undefined && this.workarounds.onselectstart == null) {
+ this.workarounds.onselectstart = document.onselectstart;
+ document.onselectstart = function () { return false; };
+ }
+ if (document.ondrag !== undefined && this.workarounds.ondrag == null) {
+ this.workarounds.ondrag = document.ondrag;
+ document.ondrag = function () { return false; };
+ }
+
+ this.setSelectionPos(this.selection.first, e);
+
+ if (this.selectionInterval != null)
+ clearInterval(this.selectionInterval);
+ this.lastMousePos.pageX = null;
+ this.selectionInterval = setInterval(this.updateSelectionOnMouseMove.bind(this), 200);
+
+ this.overlay.observe("mouseup", this.onSelectionMouseUp.bind(this));
+ },
+ /**
+ * Function: onClick
+ * parameters:
+ * Event - {Object} e
+ * Description:
+ * Handles the "click" event on the chart. This function fires <ProtoChart:plotclick> event. If
+ * <options.allowDataClick> is enabled then it also fires <ProtoChart:dataclick> event which gives
+ * you access to exact data point where user clicked.
+ */
+ onClick: function(e) {
+ if (this.ignoreClick) {
+ this.ignoreClick = false;
+ return;
+ }
+ var offset = this.overlay.cumulativeOffset();
+ var pos ={
+ x: this.xaxis.min + (e.pageX - offset.left - this.chartOffset.left) / this.hozScale,
+ y: this.yaxis.max - (e.pageY - offset.top - this.chartOffset.top) / this.vertScale
+ };
+ this.domObj.fire("ProtoChart:plotclick", [ pos ]);
+
+ if(this.options.allowDataClick)
+ {
+ var dataPoint = {};
+ if(this.options.points.show)
+ {
+ dataPoint = this.getDataClickPoint(pos, this.options);
+ this.domObj.fire("ProtoChart:dataclick", [dataPoint]);
+ }
+ else if(this.options.lines.show && this.options.points.show)
+ {
+ dataPoint = this.getDataClickPoint(pos, this.options);
+ this.domObj.fire("ProtoChart:dataclick", [dataPoint]);
+ }
+ else if(this.options.bars.show)
+ {
+ if(this.barDataRange.length > 0)
+ {
+ dataPoint = this.getDataClickPoint(pos, this.options, this.barDataRange);
+ this.domObj.fire("ProtoChart:dataclick", [dataPoint]);
+ }
+ }
+ }
+ },
+ /**
+ * Internal function used by onClick method.
+ */
+ getDataClickPoint: function(pos, options, barDataRange)
+ {
+ pos.x = parseInt(pos.x);
+ pos.y = parseInt(pos.y);
+ var yClick = pos.y.toFixed(0);
+ var dataVal = {};
+
+ dataVal.position = pos;
+ dataVal.value = '';
+
+ if(options.points.show)
+ {
+ this.graphData.each(function(gd){
+ var temp = gd.data;
+ var xClick = parseInt(pos.x.toFixed(0));
+ if(xClick < 0) { xClick = 0; }
+ if(temp[xClick] && yClick >= temp[xClick][1] - (this.options.points.radius * 10) && yClick <= temp[xClick][1] + (this.options.points.radius * 10)) {
+ dataVal.value = temp[xClick][1];
+ throw $break;
+ }
+
+ }.bind(this));
+ }
+ else if(options.bars.show)
+ {
+ xClick = pos.x;
+ this.barDataRange.each(function(barData){
+ barData.each(function(data){
+ var temp = data;
+ if(xClick > temp.left && xClick < temp.right) {
+ dataVal.value = temp.value;
+ throw $break;
+ }
+ }.bind(this));
+ }.bind(this));
+
+ }
+
+ return dataVal;
+ },
+ /**
+ * Function: triggerSelectedEvent
+ *
+ * Description:
+ * Internal function called when a selection on the graph is made. This function
+ * fires <ProtoChart:selected> event which has a parameter representing the selection
+ * {
+ * x1: {int}, y1: {int},
+ * x2: {int}, y2: {int}
+ * }
+ */
+ triggerSelectedEvent: function() {
+ var x1, x2, y1, y2;
+ if (this.selection.first.x <= this.selection.second.x) {
+ x1 = this.selection.first.x;
+ x2 = this.selection.second.x;
+ }
+ else {
+ x1 = this.selection.second.x;
+ x2 = this.selection.first.x;
+ }
+
+ if (this.selection.first.y >= this.selection.second.y) {
+ y1 = this.selection.first.y;
+ y2 = this.selection.second.y;
+ }
+ else {
+ y1 = this.selection.second.y;
+ y2 = this.selection.first.y;
+ }
+
+ x1 = this.xaxis.min + x1 / this.hozScale;
+ x2 = this.xaxis.min + x2 / this.hozScale;
+
+ y1 = this.yaxis.max - y1 / this.vertScale;
+ y2 = this.yaxis.max - y2 / this.vertScale;
+
+ this.domObj.fire("ProtoChart:selected", [ { x1: x1, y1: y1, x2: x2, y2: y2 } ]);
+ },
+ /**
+ * Internal function
+ */
+ onSelectionMouseUp: function(e) {
+ if (document.onselectstart !== undefined)
+ document.onselectstart = this.workarounds.onselectstart;
+ if (document.ondrag !== undefined)
+ document.ondrag = this.workarounds.ondrag;
+
+ if (this.selectionInterval != null) {
+ clearInterval(this.selectionInterval);
+ this.selectionInterval = null;
+ }
+
+ this.setSelectionPos(this.selection.second, e);
+ this.clearSelection();
+ if (!this.selectionIsSane() || e.which != 1)
+ return false;
+
+ this.drawSelection();
+ this.triggerSelectedEvent();
+ this.ignoreClick = true;
+
+ return false;
+ },
+ setSelectionPos: function(pos, e) {
+ var offset = $(this.overlay).cumulativeOffset();
+ if (this.options.selection.mode == "y") {
+ if (pos == this.selection.first)
+ pos.x = 0;
+ else
+ pos.x = this.chartWidth;
+ }
+ else {
+ pos.x = e.pageX - offset.left - this.chartOffset.left;
+ pos.x = Math.min(Math.max(0, pos.x), this.chartWidth);
+ }
+
+ if (this.options.selection.mode == "x") {
+ if (pos == this.selection.first)
+ pos.y = 0;
+ else
+ pos.y = this.chartHeight;
+ }
+ else {
+ pos.y = e.pageY - offset.top - this.chartOffset.top;
+ pos.y = Math.min(Math.max(0, pos.y), this.chartHeight);
+ }
+ },
+ updateSelectionOnMouseMove: function() {
+ if (this.lastMousePos.pageX == null)
+ return;
+
+ this.setSelectionPos(this.selection.second, this.lastMousePos);
+ this.clearSelection();
+ if (this.selectionIsSane())
+ this.drawSelection();
+ },
+ clearSelection: function() {
+ if (this.prevSelection == null)
+ return;
+
+ var x = Math.min(this.prevSelection.first.x, this.prevSelection.second.x),
+ y = Math.min(this.prevSelection.first.y, this.prevSelection.second.y),
+ w = Math.abs(this.prevSelection.second.x - this.prevSelection.first.x),
+ h = Math.abs(this.prevSelection.second.y - this.prevSelection.first.y);
+
+ this.overlayContext.clearRect(x + this.chartOffset.left - this.overlayContext.lineWidth,
+ y + this.chartOffset.top - this.overlayContext.lineWidth,
+ w + this.overlayContext.lineWidth*2,
+ h + this.overlayContext.lineWidth*2);
+
+ this.prevSelection = null;
+ },
+ /**
+ * Function: setSelection
+ *
+ * Parameters:
+ * Area - {Object} area represented as a range like: {x1: 3, y1: 3, x2: 4, y2: 8}
+ *
+ * Description:
+ * Sets the current graph selection to the provided range. Calls <drawSelection> and
+ * <triggerSelectedEvent> functions internally.
+ */
+ setSelection: function(area) {
+ this.clearSelection();
+
+ if (this.options.selection.mode == "x") {
+ this.selection.first.y = 0;
+ this.selection.second.y = this.chartHeight;
+ }
+ else {
+ this.selection.first.y = (this.yaxis.max - area.y1) * this.vertScale;
+ this.selection.second.y = (this.yaxis.max - area.y2) * this.vertScale;
+ }
+ if (this.options.selection.mode == "y") {
+ this.selection.first.x = 0;
+ this.selection.second.x = this.chartWidth;
+ }
+ else {
+ this.selection.first.x = (area.x1 - this.xaxis.min) * this.hozScale;
+ this.selection.second.x = (area.x2 - this.xaxis.min) * this.hozScale;
+ }
+
+ this.drawSelection();
+ this.triggerSelectedEvent();
+ },
+ /**
+ * Function: drawSelection
+ * Description: Internal function called to draw the selection made on the graph.
+ */
+ drawSelection: function() {
+ if (this.prevSelection != null &&
+ this.selection.first.x == this.prevSelection.first.x &&
+ this.selection.first.y == this.prevSelection.first.y &&
+ this.selection.second.x == this.prevSelection.second.x &&
+ this.selection.second.y == this.prevSelection.second.y)
+ {
+ return;
+ }
+
+ this.overlayContext.strokeStyle = this.parseColor(this.options.selection.color).scale(null, null, null, 0.8).toString();
+ this.overlayContext.lineWidth = 1;
+ this.context.lineJoin = "round";
+ this.overlayContext.fillStyle = this.parseColor(this.options.selection.color).scale(null, null, null, 0.4).toString();
+
+ this.prevSelection = { first: { x: this.selection.first.x,
+ y: this.selection.first.y },
+ second: { x: this.selection.second.x,
+ y: this.selection.second.y } };
+
+ var x = Math.min(this.selection.first.x, this.selection.second.x),
+ y = Math.min(this.selection.first.y, this.selection.second.y),
+ w = Math.abs(this.selection.second.x - this.selection.first.x),
+ h = Math.abs(this.selection.second.y - this.selection.first.y);
+
+ this.overlayContext.fillRect(x + this.chartOffset.left, y + this.chartOffset.top, w, h);
+ this.overlayContext.strokeRect(x + this.chartOffset.left, y + this.chartOffset.top, w, h);
+ },
+ /**
+ * Internal function
+ */
+ selectionIsSane: function() {
+ var minSize = 5;
+ return Math.abs(this.selection.second.x - this.selection.first.x) >= minSize &&
+ Math.abs(this.selection.second.y - this.selection.first.y) >= minSize;
+ },
+ /**
+ * Internal function that formats the track. This is the format the text is shown when mouse
+ * tracking is enabled.
+ */
+ defaultTrackFormatter: function(val)
+ {
+ return '['+val.x+', '+val.y+']';
+ },
+ /**
+ * Function: clearHit
+ */
+ clearHit: function(){
+ if(this.prevHit){
+ this.overlayContext.clearRect(
+ this.translateHoz(this.prevHit.x) + this.chartOffset.left - this.options.mouse.radius*2,
+ this.translateVert(this.prevHit.y) + this.chartOffset.top - this.options.mouse.radius*2,
+ this.options.mouse.radius*3 + this.options.points.lineWidth*3,
+ this.options.mouse.radius*3 + this.options.points.lineWidth*3
+ );
+ this.prevHit = null;
+ }
+ },
+ /**
+ * Function: hit
+ *
+ * Parameters:
+ * event - {Object} event object
+ * mouse - {Object} mouse object that is used to keep track of mouse movement
+ *
+ * Description:
+ * If hit occurs this function will fire a ProtoChart:hit event.
+ */
+ hit: function(event, mouse){
+ /**
+ * Nearest data element.
+ */
+ var n = {
+ dist:Number.MAX_VALUE,
+ x:null,
+ y:null,
+ mouse:null
+ };
+
+
+ for(var i = 0, data, xsens, ysens; i < this.graphData.length; i++){
+ if(!this.graphData[i].mouse.track) continue;
+ data = this.graphData[i].data;
+ xsens = (this.hozScale*this.graphData[i].mouse.sensibility);
+ ysens = (this.vertScale*this.graphData[i].mouse.sensibility);
+ for(var j = 0, xabs, yabs; j < data.length; j++){
+ xabs = this.hozScale*Math.abs(data[j][0] - mouse.x);
+ yabs = this.vertScale*Math.abs(data[j][1] - mouse.y);
+
+ if(xabs < xsens && yabs < ysens && (xabs+yabs) < n.dist){
+ n.dist = (xabs+yabs);
+ n.x = data[j][0];
+ n.y = data[j][1];
+ n.mouse = this.graphData[i].mouse;
+ }
+ }
+ }
+
+ if(n.mouse && n.mouse.track && !this.prevHit || (this.prevHit && n.x != this.prevHit.x && n.y != this.prevHit.y)){
+ var el = this.domObj.select('.'+this.options.mouse.clsName).first();
+ if(!el){
+ var pos = '', p = this.options.mouse.position, m = this.options.mouse.margin;
+ if(p.charAt(0) == 'n') pos += 'top:' + (m + this.chartOffset.top) + 'px;';
+ else if(p.charAt(0) == 's') pos += 'bottom:' + (m + this.chartOffset.bottom) + 'px;';
+ if(p.charAt(1) == 'e') pos += 'right:' + (m + this.chartOffset.right) + 'px;';
+ else if(p.charAt(1) == 'w') pos += 'left:' + (m + this.chartOffset.bottom) + 'px;';
+
+ this.domObj.insert('<div class="'+this.options.mouse.clsName+'" style="display:none;position:absolute;'+pos+'"></div>');
+ return;
+ }
+ if(n.x !== null && n.y !== null){
+ el.setStyle({display:'block'});
+
+ this.clearHit();
+ if(n.mouse.lineColor != null){
+ this.overlayContext.save();
+ this.overlayContext.translate(this.chartOffset.left, this.chartOffset.top);
+ this.overlayContext.lineWidth = this.options.points.lineWidth;
+ this.overlayContext.strokeStyle = n.mouse.lineColor;
+ this.overlayContext.fillStyle = '#ffffff';
+ this.overlayContext.beginPath();
+
+
+ this.overlayContext.arc(this.translateHoz(n.x), this.translateVert(n.y), this.options.mouse.radius, 0, 2 * Math.PI, true);
+ this.overlayContext.fill();
+ this.overlayContext.stroke();
+ this.overlayContext.restore();
+ }
+ this.prevHit = n;
+
+ var decimals = n.mouse.trackDecimals;
+ if(decimals == null || decimals < 0) decimals = 0;
+ if(!this.options.mouse.fixedPosition)
+ {
+ el.setStyle({
+ left: (this.translateHoz(n.x) + this.options.mouse.radius + 10) + "px",
+ top: (this.translateVert(n.y) + this.options.mouse.radius + 10) + "px"
+ });
+ }
+ el.innerHTML = n.mouse.trackFormatter({x: n.x.toFixed(decimals), y: n.y.toFixed(decimals)});
+ this.domObj.fire( 'ProtoChart:hit', [n] )
+ }else if(this.options.prevHit){
+ el.setStyle({display:'none'});
+ this.clearHit();
+ }
+ }
+ },
+ /**
+ * Internal function
+ */
+ floorInBase: function(n, base) {
+ return base * Math.floor(n / base);
+ },
+ /**
+ * Function: extractColor
+ *
+ * Parameters:
+ * element - HTML element or ID of an HTML element
+ *
+ * Returns:
+ * color in string format
+ */
+ extractColor: function(element)
+ {
+ var color;
+ do
+ {
+ color = $(element).getStyle('background-color').toLowerCase();
+ if(color != '' && color != 'transparent')
+ {
+ break;
+ }
+ element = element.up(0); //or else just get the parent ....
+ } while(element.nodeName.toLowerCase() != 'body');
+
+ //safari fix
+ if(color == 'rgba(0, 0, 0, 0)')
+ return 'transparent';
+ return color;
+ },
+ /**
+ * Function: parseColor
+ *
+ * Parameters:
+ * str - color string in different formats
+ *
+ * Returns:
+ * a Proto.Color Object - use toString() function to retreive the color in rgba/rgb format
+ */
+ parseColor: function(str)
+ {
+ var result;
+
+ /**
+ * rgb(num,num,num)
+ */
+ if((result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)))
+ return new Proto.Color(parseInt(result[1]), parseInt(result[2]), parseInt(result[3]));
+
+ /**
+ * rgba(num,num,num,num)
+ */
+ if((result = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)))
+ return new Proto.Color(parseInt(result[1]), parseInt(result[2]), parseInt(result[3]), parseFloat(result[4]));
+
+ /**
+ * rgb(num%,num%,num%)
+ */
+ if((result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)))
+ return new Proto.Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55);
+
+ /**
+ * rgba(num%,num%,num%,num)
+ */
+ if((result = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)))
+ return new Proto.Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55, parseFloat(result[4]));
+
+ /**
+ * #a0b1c2
+ */
+ if((result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)))
+ return new Proto.Color(parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16));
+
+ /**
+ * #fff
+ */
+ if((result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)))
+ return new Proto.Color(parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16));
+
+ /**
+ * Otherwise, check if user wants transparent .. or we just return a standard color;
+ */
+ var name = str.strip().toLowerCase();
+ if(name == 'transparent'){
+ return new Proto.Color(255, 255, 255, 0);
+ }
+
+ return new Proto.Color(100,100,100, 1);
+
+ }
+});
+
+if(!Proto) var Proto = {};
+
+/**
+ * Class: Proto.Color
+ *
+ * Helper class that manipulates colors using RGBA values.
+ *
+ */
+
+Proto.Color = Class.create({
+ initialize: function(r, g, b, a) {
+ this.rgba = ['r', 'g', 'b', 'a'];
+ var x = 4;
+ while(-1<--x) {
+ this[this.rgba[x]] = arguments[x] || ((x==3) ? 1.0 : 0);
+ }
+ },
+ toString: function() {
+ if(this.a >= 1.0) {
+ return "rgb(" + [this.r, this.g, this.b].join(",") +")";
+ }
+ else {
+ return "rgba("+[this.r, this.g, this.b, this.a].join(",")+")";
+ }
+ },
+ scale: function(rf, gf, bf, af) {
+ x = 4;
+ while(-1<--x) {
+ if(arguments[x] != null) {
+ this[this.rgba[x]] *= arguments[x];
+ }
+ }
+ return this.normalize();
+ },
+ adjust: function(rd, gd, bd, ad) {
+ x = 4; //rgba.length
+ while (-1<--x) {
+ if (arguments[x] != null)
+ this[this.rgba[x]] += arguments[x];
+ }
+ return this.normalize();
+ },
+ clone: function() {
+ return new Proto.Color(this.r, this.b, this.g, this.a);
+ },
+ limit: function(val,minVal,maxVal) {
+ return Math.max(Math.min(val, maxVal), minVal);
+ },
+ normalize: function() {
+ this.r = this.limit(parseInt(this.r), 0, 255);
+ this.g = this.limit(parseInt(this.g), 0, 255);
+ this.b = this.limit(parseInt(this.b), 0, 255);
+ this.a = this.limit(this.a, 0, 1);
+ return this;
+ }
+}); \ No newline at end of file
diff --git a/src/usr/local/www/protochart/excanvas-compressed.js b/src/usr/local/www/protochart/excanvas-compressed.js
new file mode 100644
index 0000000..9d71658
--- /dev/null
+++ b/src/usr/local/www/protochart/excanvas-compressed.js
@@ -0,0 +1,19 @@
+if(!window.CanvasRenderingContext2D){(function(){var I=Math,i=I.round,L=I.sin,M=I.cos,m=10,A=m/2,Q={init:function(a){var b=a||document;if(/MSIE/.test(navigator.userAgent)&&!window.opera){var c=this;b.attachEvent("onreadystatechange",function(){c.r(b)})}},r:function(a){if(a.readyState=="complete"){if(!a.namespaces["s"]){a.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml")}var b=a.createStyleSheet();b.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}";
+var c=a.getElementsByTagName("canvas");for(var d=0;d<c.length;d++){if(!c[d].getContext){this.initElement(c[d])}}}},q:function(a){var b=a.outerHTML,c=a.ownerDocument.createElement(b);if(b.slice(-2)!="/>"){var d="/"+a.tagName,e;while((e=a.nextSibling)&&e.tagName!=d){e.removeNode()}if(e){e.removeNode()}}a.parentNode.replaceChild(c,a);return c},initElement:function(a){a=this.q(a);a.getContext=function(){if(this.l){return this.l}return this.l=new K(this)};a.attachEvent("onpropertychange",V);a.attachEvent("onresize",
+W);var b=a.attributes;if(b.width&&b.width.specified){a.style.width=b.width.nodeValue+"px"}else{a.width=a.clientWidth}if(b.height&&b.height.specified){a.style.height=b.height.nodeValue+"px"}else{a.height=a.clientHeight}return a}};function V(a){var b=a.srcElement;switch(a.propertyName){case "width":b.style.width=b.attributes.width.nodeValue+"px";b.getContext().clearRect();break;case "height":b.style.height=b.attributes.height.nodeValue+"px";b.getContext().clearRect();break}}function W(a){var b=a.srcElement;
+if(b.firstChild){b.firstChild.style.width=b.clientWidth+"px";b.firstChild.style.height=b.clientHeight+"px"}}Q.init();var R=[];for(var E=0;E<16;E++){for(var F=0;F<16;F++){R[E*16+F]=E.toString(16)+F.toString(16)}}function J(){return[[1,0,0],[0,1,0],[0,0,1]]}function G(a,b){var c=J();for(var d=0;d<3;d++){for(var e=0;e<3;e++){var g=0;for(var h=0;h<3;h++){g+=a[d][h]*b[h][e]}c[d][e]=g}}return c}function N(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=
+a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX=a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.d=a.d;b.e=a.e}function O(a){var b,c=1;a=String(a);if(a.substring(0,3)=="rgb"){var d=a.indexOf("(",3),e=a.indexOf(")",d+1),g=a.substring(d+1,e).split(",");b="#";for(var h=0;h<3;h++){b+=R[Number(g[h])]}if(g.length==4&&a.substr(3,1)=="a"){c=g[3]}}else{b=a}return[b,c]}function S(a){switch(a){case "butt":return"flat";case "round":return"round";
+case "square":default:return"square"}}function K(a){this.a=J();this.m=[];this.k=[];this.c=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=m*1;this.globalAlpha=1;this.canvas=a;var b=a.ownerDocument.createElement("div");b.style.width=a.clientWidth+"px";b.style.height=a.clientHeight+"px";b.style.overflow="hidden";b.style.position="absolute";a.appendChild(b);this.j=b;this.d=1;this.e=1}var j=K.prototype;j.clearRect=function(){this.j.innerHTML=
+"";this.c=[]};j.beginPath=function(){this.c=[]};j.moveTo=function(a,b){this.c.push({type:"moveTo",x:a,y:b});this.f=a;this.g=b};j.lineTo=function(a,b){this.c.push({type:"lineTo",x:a,y:b});this.f=a;this.g=b};j.bezierCurveTo=function(a,b,c,d,e,g){this.c.push({type:"bezierCurveTo",cp1x:a,cp1y:b,cp2x:c,cp2y:d,x:e,y:g});this.f=e;this.g=g};j.quadraticCurveTo=function(a,b,c,d){var e=this.f+0.6666666666666666*(a-this.f),g=this.g+0.6666666666666666*(b-this.g),h=e+(c-this.f)/3,l=g+(d-this.g)/3;this.bezierCurveTo(e,
+g,h,l,c,d)};j.arc=function(a,b,c,d,e,g){c*=m;var h=g?"at":"wa",l=a+M(d)*c-A,n=b+L(d)*c-A,o=a+M(e)*c-A,f=b+L(e)*c-A;if(l==o&&!g){l+=0.125}this.c.push({type:h,x:a,y:b,radius:c,xStart:l,yStart:n,xEnd:o,yEnd:f})};j.rect=function(a,b,c,d){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath()};j.strokeRect=function(a,b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.stroke()};j.fillRect=function(a,
+b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.fill()};j.createLinearGradient=function(a,b,c,d){var e=new H("gradient");return e};j.createRadialGradient=function(a,b,c,d,e,g){var h=new H("gradientradial");h.n=c;h.o=g;h.i.x=a;h.i.y=b;return h};j.drawImage=function(a,b){var c,d,e,g,h,l,n,o,f=a.runtimeStyle.width,k=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var q=a.width,r=a.height;a.runtimeStyle.width=
+f;a.runtimeStyle.height=k;if(arguments.length==3){c=arguments[1];d=arguments[2];h=(l=0);n=(e=q);o=(g=r)}else if(arguments.length==5){c=arguments[1];d=arguments[2];e=arguments[3];g=arguments[4];h=(l=0);n=q;o=r}else if(arguments.length==9){h=arguments[1];l=arguments[2];n=arguments[3];o=arguments[4];c=arguments[5];d=arguments[6];e=arguments[7];g=arguments[8]}else{throw"Invalid number of arguments";}var s=this.b(c,d),t=[],v=10,w=10;t.push(" <g_vml_:group",' coordsize="',m*v,",",m*w,'"',' coordorigin="0,0"',
+' style="width:',v,";height:",w,";position:absolute;");if(this.a[0][0]!=1||this.a[0][1]){var x=[];x.push("M11='",this.a[0][0],"',","M12='",this.a[1][0],"',","M21='",this.a[0][1],"',","M22='",this.a[1][1],"',","Dx='",i(s.x/m),"',","Dy='",i(s.y/m),"'");var p=s,y=this.b(c+e,d),z=this.b(c,d+g),B=this.b(c+e,d+g);p.x=Math.max(p.x,y.x,z.x,B.x);p.y=Math.max(p.y,y.y,z.y,B.y);t.push("padding:0 ",i(p.x/m),"px ",i(p.y/m),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",x.join(""),", sizingmethod='clip');")}else{t.push("top:",
+i(s.y/m),"px;left:",i(s.x/m),"px;")}t.push(' ">','<g_vml_:image src="',a.src,'"',' style="width:',m*e,";"," height:",m*g,';"',' cropleft="',h/q,'"',' croptop="',l/r,'"',' cropright="',(q-h-n)/q,'"',' cropbottom="',(r-l-o)/r,'"'," />","</g_vml_:group>");this.j.insertAdjacentHTML("BeforeEnd",t.join(""))};j.stroke=function(a){var b=[],c=O(a?this.fillStyle:this.strokeStyle),d=c[0],e=c[1]*this.globalAlpha,g=10,h=10;b.push("<g_vml_:shape",' fillcolor="',d,'"',' filled="',Boolean(a),'"',' style="position:absolute;width:',
+g,";height:",h,';"',' coordorigin="0 0" coordsize="',m*g," ",m*h,'"',' stroked="',!a,'"',' strokeweight="',this.lineWidth,'"',' strokecolor="',d,'"',' path="');var l={x:null,y:null},n={x:null,y:null};for(var o=0;o<this.c.length;o++){var f=this.c[o];if(f.type=="moveTo"){b.push(" m ");var k=this.b(f.x,f.y);b.push(i(k.x),",",i(k.y))}else if(f.type=="lineTo"){b.push(" l ");var k=this.b(f.x,f.y);b.push(i(k.x),",",i(k.y))}else if(f.type=="close"){b.push(" x ")}else if(f.type=="bezierCurveTo"){b.push(" c ");
+var k=this.b(f.x,f.y),q=this.b(f.cp1x,f.cp1y),r=this.b(f.cp2x,f.cp2y);b.push(i(q.x),",",i(q.y),",",i(r.x),",",i(r.y),",",i(k.x),",",i(k.y))}else if(f.type=="at"||f.type=="wa"){b.push(" ",f.type," ");var k=this.b(f.x,f.y),s=this.b(f.xStart,f.yStart),t=this.b(f.xEnd,f.yEnd);b.push(i(k.x-this.d*f.radius),",",i(k.y-this.e*f.radius)," ",i(k.x+this.d*f.radius),",",i(k.y+this.e*f.radius)," ",i(s.x),",",i(s.y)," ",i(t.x),",",i(t.y))}if(k){if(l.x==null||k.x<l.x){l.x=k.x}if(n.x==null||k.x>n.x){n.x=k.x}if(l.y==
+null||k.y<l.y){l.y=k.y}if(n.y==null||k.y>n.y){n.y=k.y}}}b.push(' ">');if(typeof this.fillStyle=="object"){var v={x:"50%",y:"50%"},w=n.x-l.x,x=n.y-l.y,p=w>x?w:x;v.x=i(this.fillStyle.i.x/w*100+50)+"%";v.y=i(this.fillStyle.i.y/x*100+50)+"%";var y=[];if(this.fillStyle.p=="gradientradial"){var z=this.fillStyle.n/p*100,B=this.fillStyle.o/p*100-z}else{var z=0,B=100}var C={offset:null,color:null},D={offset:null,color:null};this.fillStyle.h.sort(function(T,U){return T.offset-U.offset});for(var o=0;o<this.fillStyle.h.length;o++){var u=
+this.fillStyle.h[o];y.push(u.offset*B+z,"% ",u.color,",");if(u.offset>C.offset||C.offset==null){C.offset=u.offset;C.color=u.color}if(u.offset<D.offset||D.offset==null){D.offset=u.offset;D.color=u.color}}y.pop();b.push("<g_vml_:fill",' color="',D.color,'"',' color2="',C.color,'"',' type="',this.fillStyle.p,'"',' focusposition="',v.x,", ",v.y,'"',' colors="',y.join(""),'"',' opacity="',e,'" />')}else if(a){b.push('<g_vml_:fill color="',d,'" opacity="',e,'" />')}else{b.push("<g_vml_:stroke",' opacity="',
+e,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',S(this.lineCap),'"',' weight="',this.lineWidth,'px"',' color="',d,'" />')}b.push("</g_vml_:shape>");this.j.insertAdjacentHTML("beforeEnd",b.join(""));this.c=[]};j.fill=function(){this.stroke(true)};j.closePath=function(){this.c.push({type:"close"})};j.b=function(a,b){return{x:m*(a*this.a[0][0]+b*this.a[1][0]+this.a[2][0])-A,y:m*(a*this.a[0][1]+b*this.a[1][1]+this.a[2][1])-A}};j.save=function(){var a={};N(this,a);
+this.k.push(a);this.m.push(this.a);this.a=G(J(),this.a)};j.restore=function(){N(this.k.pop(),this);this.a=this.m.pop()};j.translate=function(a,b){var c=[[1,0,0],[0,1,0],[a,b,1]];this.a=G(c,this.a)};j.rotate=function(a){var b=M(a),c=L(a),d=[[b,c,0],[-c,b,0],[0,0,1]];this.a=G(d,this.a)};j.scale=function(a,b){this.d*=a;this.e*=b;var c=[[a,0,0],[0,b,0],[0,0,1]];this.a=G(c,this.a)};j.clip=function(){};j.arcTo=function(){};j.createPattern=function(){return new P};function H(a){this.p=a;this.n=0;this.o=
+0;this.h=[];this.i={x:0,y:0}}H.prototype.addColorStop=function(a,b){b=O(b);this.h.push({offset:1-a,color:b})};function P(){}G_vmlCanvasManager=Q;CanvasRenderingContext2D=K;CanvasGradient=H;CanvasPattern=P})()};
diff --git a/src/usr/local/www/protochart/excanvas.js b/src/usr/local/www/protochart/excanvas.js
new file mode 100644
index 0000000..f8780b6
--- /dev/null
+++ b/src/usr/local/www/protochart/excanvas.js
@@ -0,0 +1,785 @@
+// Copyright 2006 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// Known Issues:
+//
+// * Patterns are not implemented.
+// * Radial gradient are not implemented. The VML version of these look very
+// different from the canvas one.
+// * Clipping paths are not implemented.
+// * Coordsize. The width and height attribute have higher priority than the
+// width and height style values which isn't correct.
+// * Painting mode isn't implemented.
+// * Canvas width/height should is using content-box by default. IE in
+// Quirks mode will draw the canvas using border-box. Either change your
+// doctype to HTML5
+// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)
+// or use Box Sizing Behavior from WebFX
+// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)
+// * Optimize. There is always room for speed improvements.
+
+// only add this code if we do not already have a canvas implementation
+if (!window.CanvasRenderingContext2D) {
+
+(function () {
+
+ // alias some functions to make (compiled) code shorter
+ var m = Math;
+ var mr = m.round;
+ var ms = m.sin;
+ var mc = m.cos;
+
+ // this is used for sub pixel precision
+ var Z = 10;
+ var Z2 = Z / 2;
+
+ var G_vmlCanvasManager_ = {
+ init: function (opt_doc) {
+ var doc = opt_doc || document;
+ if (/MSIE/.test(navigator.userAgent) && !window.opera) {
+ var self = this;
+ doc.attachEvent("onreadystatechange", function () {
+ self.init_(doc);
+ });
+ }
+ },
+
+ init_: function (doc) {
+ if (doc.readyState == "complete") {
+ // create xmlns
+ if (!doc.namespaces["g_vml_"]) {
+ doc.namespaces.add("g_vml_", "urn:schemas-microsoft-com:vml");
+ }
+
+ // setup default css
+ var ss = doc.createStyleSheet();
+ ss.cssText = "canvas{display:inline-block;overflow:hidden;" +
+ // default size is 300x150 in Gecko and Opera
+ "text-align:left;width:300px;height:150px}" +
+ "g_vml_\\:*{behavior:url(#default#VML)}";
+
+ // find all canvas elements
+ var els = doc.getElementsByTagName("canvas");
+ for (var i = 0; i < els.length; i++) {
+ if (!els[i].getContext) {
+ this.initElement(els[i]);
+ }
+ }
+ }
+ },
+
+ fixElement_: function (el) {
+ // in IE before version 5.5 we would need to add HTML: to the tag name
+ // but we do not care about IE before version 6
+ var outerHTML = el.outerHTML;
+
+ var newEl = el.ownerDocument.createElement(outerHTML);
+ // if the tag is still open IE has created the children as siblings and
+ // it has also created a tag with the name "/FOO"
+ if (outerHTML.slice(-2) != "/>") {
+ var tagName = "/" + el.tagName;
+ var ns;
+ // remove content
+ while ((ns = el.nextSibling) && ns.tagName != tagName) {
+ ns.removeNode();
+ }
+ // remove the incorrect closing tag
+ if (ns) {
+ ns.removeNode();
+ }
+ }
+ el.parentNode.replaceChild(newEl, el);
+ return newEl;
+ },
+
+ /**
+ * Public initializes a canvas element so that it can be used as canvas
+ * element from now on. This is called automatically before the page is
+ * loaded but if you are creating elements using createElement you need to
+ * make sure this is called on the element.
+ * @param {HTMLElement} el The canvas element to initialize.
+ * @return {HTMLElement} the element that was created.
+ */
+ initElement: function (el) {
+ el = this.fixElement_(el);
+ el.getContext = function () {
+ if (this.context_) {
+ return this.context_;
+ }
+ return this.context_ = new CanvasRenderingContext2D_(this);
+ };
+
+ // do not use inline function because that will leak memory
+ el.attachEvent('onpropertychange', onPropertyChange);
+ el.attachEvent('onresize', onResize);
+
+ var attrs = el.attributes;
+ if (attrs.width && attrs.width.specified) {
+ // TODO: use runtimeStyle and coordsize
+ // el.getContext().setWidth_(attrs.width.nodeValue);
+ el.style.width = attrs.width.nodeValue + "px";
+ } else {
+ el.width = el.clientWidth;
+ }
+ if (attrs.height && attrs.height.specified) {
+ // TODO: use runtimeStyle and coordsize
+ // el.getContext().setHeight_(attrs.height.nodeValue);
+ el.style.height = attrs.height.nodeValue + "px";
+ } else {
+ el.height = el.clientHeight;
+ }
+ //el.getContext().setCoordsize_()
+ return el;
+ }
+ };
+
+ function onPropertyChange(e) {
+ var el = e.srcElement;
+
+ switch (e.propertyName) {
+ case 'width':
+ el.style.width = el.attributes.width.nodeValue + "px";
+ el.getContext().clearRect();
+ break;
+ case 'height':
+ el.style.height = el.attributes.height.nodeValue + "px";
+ el.getContext().clearRect();
+ break;
+ }
+ }
+
+ function onResize(e) {
+ var el = e.srcElement;
+ if (el.firstChild) {
+ el.firstChild.style.width = el.clientWidth + 'px';
+ el.firstChild.style.height = el.clientHeight + 'px';
+ }
+ }
+
+ G_vmlCanvasManager_.init();
+
+ // precompute "00" to "FF"
+ var dec2hex = [];
+ for (var i = 0; i < 16; i++) {
+ for (var j = 0; j < 16; j++) {
+ dec2hex[i * 16 + j] = i.toString(16) + j.toString(16);
+ }
+ }
+
+ function createMatrixIdentity() {
+ return [
+ [1, 0, 0],
+ [0, 1, 0],
+ [0, 0, 1]
+ ];
+ }
+
+ function matrixMultiply(m1, m2) {
+ var result = createMatrixIdentity();
+
+ for (var x = 0; x < 3; x++) {
+ for (var y = 0; y < 3; y++) {
+ var sum = 0;
+
+ for (var z = 0; z < 3; z++) {
+ sum += m1[x][z] * m2[z][y];
+ }
+
+ result[x][y] = sum;
+ }
+ }
+ return result;
+ }
+
+ function copyState(o1, o2) {
+ o2.fillStyle = o1.fillStyle;
+ o2.lineCap = o1.lineCap;
+ o2.lineJoin = o1.lineJoin;
+ o2.lineWidth = o1.lineWidth;
+ o2.miterLimit = o1.miterLimit;
+ o2.shadowBlur = o1.shadowBlur;
+ o2.shadowColor = o1.shadowColor;
+ o2.shadowOffsetX = o1.shadowOffsetX;
+ o2.shadowOffsetY = o1.shadowOffsetY;
+ o2.strokeStyle = o1.strokeStyle;
+ o2.arcScaleX_ = o1.arcScaleX_;
+ o2.arcScaleY_ = o1.arcScaleY_;
+ }
+
+ function processStyle(styleString) {
+ var str, alpha = 1;
+
+ styleString = String(styleString);
+ if (styleString.substring(0, 3) == "rgb") {
+ var start = styleString.indexOf("(", 3);
+ var end = styleString.indexOf(")", start + 1);
+ var guts = styleString.substring(start + 1, end).split(",");
+
+ str = "#";
+ for (var i = 0; i < 3; i++) {
+ str += dec2hex[Number(guts[i])];
+ }
+
+ if ((guts.length == 4) && (styleString.substr(3, 1) == "a")) {
+ alpha = guts[3];
+ }
+ } else {
+ str = styleString;
+ }
+
+ return [str, alpha];
+ }
+
+ function processLineCap(lineCap) {
+ switch (lineCap) {
+ case "butt":
+ return "flat";
+ case "round":
+ return "round";
+ case "square":
+ default:
+ return "square";
+ }
+ }
+
+ /**
+ * This class implements CanvasRenderingContext2D interface as described by
+ * the WHATWG.
+ * @param {HTMLElement} surfaceElement The element that the 2D context should
+ * be associated with
+ */
+ function CanvasRenderingContext2D_(surfaceElement) {
+ this.m_ = createMatrixIdentity();
+
+ this.mStack_ = [];
+ this.aStack_ = [];
+ this.currentPath_ = [];
+
+ // Canvas context properties
+ this.strokeStyle = "#000";
+ this.fillStyle = "#000";
+
+ this.lineWidth = 1;
+ this.lineJoin = "miter";
+ this.lineCap = "butt";
+ this.miterLimit = Z * 1;
+ this.globalAlpha = 1;
+ this.canvas = surfaceElement;
+
+ var el = surfaceElement.ownerDocument.createElement('div');
+ el.style.width = surfaceElement.clientWidth + 'px';
+ el.style.height = surfaceElement.clientHeight + 'px';
+ el.style.overflow = 'hidden';
+ el.style.position = 'absolute';
+ surfaceElement.appendChild(el);
+
+ this.element_ = el;
+ this.arcScaleX_ = 1;
+ this.arcScaleY_ = 1;
+ }
+
+ var contextPrototype = CanvasRenderingContext2D_.prototype;
+ contextPrototype.clearRect = function() {
+ this.element_.innerHTML = "";
+ this.currentPath_ = [];
+ };
+
+ contextPrototype.beginPath = function() {
+ // TODO: Branch current matrix so that save/restore has no effect
+ // as per safari docs.
+
+ this.currentPath_ = [];
+ };
+
+ contextPrototype.moveTo = function(aX, aY) {
+ this.currentPath_.push({type: "moveTo", x: aX, y: aY});
+ this.currentX_ = aX;
+ this.currentY_ = aY;
+ };
+
+ contextPrototype.lineTo = function(aX, aY) {
+ this.currentPath_.push({type: "lineTo", x: aX, y: aY});
+ this.currentX_ = aX;
+ this.currentY_ = aY;
+ };
+
+ contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
+ aCP2x, aCP2y,
+ aX, aY) {
+ this.currentPath_.push({type: "bezierCurveTo",
+ cp1x: aCP1x,
+ cp1y: aCP1y,
+ cp2x: aCP2x,
+ cp2y: aCP2y,
+ x: aX,
+ y: aY});
+ this.currentX_ = aX;
+ this.currentY_ = aY;
+ };
+
+ contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
+ // the following is lifted almost directly from
+ // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes
+ var cp1x = this.currentX_ + 2.0 / 3.0 * (aCPx - this.currentX_);
+ var cp1y = this.currentY_ + 2.0 / 3.0 * (aCPy - this.currentY_);
+ var cp2x = cp1x + (aX - this.currentX_) / 3.0;
+ var cp2y = cp1y + (aY - this.currentY_) / 3.0;
+ this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, aX, aY);
+ };
+
+ contextPrototype.arc = function(aX, aY, aRadius,
+ aStartAngle, aEndAngle, aClockwise) {
+ aRadius *= Z;
+ var arcType = aClockwise ? "at" : "wa";
+
+ var xStart = aX + (mc(aStartAngle) * aRadius) - Z2;
+ var yStart = aY + (ms(aStartAngle) * aRadius) - Z2;
+
+ var xEnd = aX + (mc(aEndAngle) * aRadius) - Z2;
+ var yEnd = aY + (ms(aEndAngle) * aRadius) - Z2;
+
+ // IE won't render arches drawn counter clockwise if xStart == xEnd.
+ if (xStart == xEnd && !aClockwise) {
+ xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something
+ // that can be represented in binary
+ }
+
+ this.currentPath_.push({type: arcType,
+ x: aX,
+ y: aY,
+ radius: aRadius,
+ xStart: xStart,
+ yStart: yStart,
+ xEnd: xEnd,
+ yEnd: yEnd});
+
+ };
+
+ contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
+ this.moveTo(aX, aY);
+ this.lineTo(aX + aWidth, aY);
+ this.lineTo(aX + aWidth, aY + aHeight);
+ this.lineTo(aX, aY + aHeight);
+ this.closePath();
+ };
+
+ contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
+ // Will destroy any existing path (same as FF behaviour)
+ this.beginPath();
+ this.moveTo(aX, aY);
+ this.lineTo(aX + aWidth, aY);
+ this.lineTo(aX + aWidth, aY + aHeight);
+ this.lineTo(aX, aY + aHeight);
+ this.closePath();
+ this.stroke();
+ };
+
+ contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
+ // Will destroy any existing path (same as FF behaviour)
+ this.beginPath();
+ this.moveTo(aX, aY);
+ this.lineTo(aX + aWidth, aY);
+ this.lineTo(aX + aWidth, aY + aHeight);
+ this.lineTo(aX, aY + aHeight);
+ this.closePath();
+ this.fill();
+ };
+
+ contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
+ var gradient = new CanvasGradient_("gradient");
+ return gradient;
+ };
+
+ contextPrototype.createRadialGradient = function(aX0, aY0,
+ aR0, aX1,
+ aY1, aR1) {
+ var gradient = new CanvasGradient_("gradientradial");
+ gradient.radius1_ = aR0;
+ gradient.radius2_ = aR1;
+ gradient.focus_.x = aX0;
+ gradient.focus_.y = aY0;
+ return gradient;
+ };
+
+ contextPrototype.drawImage = function (image, var_args) {
+ var dx, dy, dw, dh, sx, sy, sw, sh;
+
+ // to find the original width we overide the width and height
+ var oldRuntimeWidth = image.runtimeStyle.width;
+ var oldRuntimeHeight = image.runtimeStyle.height;
+ image.runtimeStyle.width = 'auto';
+ image.runtimeStyle.height = 'auto';
+
+ // get the original size
+ var w = image.width;
+ var h = image.height;
+
+ // and remove overides
+ image.runtimeStyle.width = oldRuntimeWidth;
+ image.runtimeStyle.height = oldRuntimeHeight;
+
+ if (arguments.length == 3) {
+ dx = arguments[1];
+ dy = arguments[2];
+ sx = sy = 0;
+ sw = dw = w;
+ sh = dh = h;
+ } else if (arguments.length == 5) {
+ dx = arguments[1];
+ dy = arguments[2];
+ dw = arguments[3];
+ dh = arguments[4];
+ sx = sy = 0;
+ sw = w;
+ sh = h;
+ } else if (arguments.length == 9) {
+ sx = arguments[1];
+ sy = arguments[2];
+ sw = arguments[3];
+ sh = arguments[4];
+ dx = arguments[5];
+ dy = arguments[6];
+ dw = arguments[7];
+ dh = arguments[8];
+ } else {
+ throw "Invalid number of arguments";
+ }
+
+ var d = this.getCoords_(dx, dy);
+
+ var w2 = sw / 2;
+ var h2 = sh / 2;
+
+ var vmlStr = [];
+
+ var W = 10;
+ var H = 10;
+
+ // For some reason that I've now forgotten, using divs didn't work
+ vmlStr.push(' <g_vml_:group',
+ ' coordsize="', Z * W, ',', Z * H, '"',
+ ' coordorigin="0,0"' ,
+ ' style="width:', W, ';height:', H, ';position:absolute;');
+
+ // If filters are necessary (rotation exists), create them
+ // filters are bog-slow, so only create them if abbsolutely necessary
+ // The following check doesn't account for skews (which don't exist
+ // in the canvas spec (yet) anyway.
+
+ if (this.m_[0][0] != 1 || this.m_[0][1]) {
+ var filter = [];
+
+ // Note the 12/21 reversal
+ filter.push("M11='", this.m_[0][0], "',",
+ "M12='", this.m_[1][0], "',",
+ "M21='", this.m_[0][1], "',",
+ "M22='", this.m_[1][1], "',",
+ "Dx='", mr(d.x / Z), "',",
+ "Dy='", mr(d.y / Z), "'");
+
+ // Bounding box calculation (need to minimize displayed area so that
+ // filters don't waste time on unused pixels.
+ var max = d;
+ var c2 = this.getCoords_(dx + dw, dy);
+ var c3 = this.getCoords_(dx, dy + dh);
+ var c4 = this.getCoords_(dx + dw, dy + dh);
+
+ max.x = Math.max(max.x, c2.x, c3.x, c4.x);
+ max.y = Math.max(max.y, c2.y, c3.y, c4.y);
+
+ vmlStr.push("padding:0 ", mr(max.x / Z), "px ", mr(max.y / Z),
+ "px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",
+ filter.join(""), ", sizingmethod='clip');");
+ } else {
+ vmlStr.push("top:", mr(d.y / Z), "px;left:", mr(d.x / Z), "px;");
+ }
+
+ vmlStr.push(' ">' ,
+ '<g_vml_:image src="', image.src, '"',
+ ' style="width:', Z * dw, ';',
+ ' height:', Z * dh, ';"',
+ ' cropleft="', sx / w, '"',
+ ' croptop="', sy / h, '"',
+ ' cropright="', (w - sx - sw) / w, '"',
+ ' cropbottom="', (h - sy - sh) / h, '"',
+ ' />',
+ '</g_vml_:group>');
+
+ this.element_.insertAdjacentHTML("BeforeEnd",
+ vmlStr.join(""));
+ };
+
+ contextPrototype.stroke = function(aFill) {
+ var lineStr = [];
+ var lineOpen = false;
+ var a = processStyle(aFill ? this.fillStyle : this.strokeStyle);
+ var color = a[0];
+ var opacity = a[1] * this.globalAlpha;
+
+ var W = 10;
+ var H = 10;
+
+ lineStr.push('<g_vml_:shape',
+ ' fillcolor="', color, '"',
+ ' filled="', Boolean(aFill), '"',
+ ' style="position:absolute;width:', W, ';height:', H, ';"',
+ ' coordorigin="0 0" coordsize="', Z * W, ' ', Z * H, '"',
+ ' stroked="', !aFill, '"',
+ ' strokeweight="', this.lineWidth, '"',
+ ' strokecolor="', color, '"',
+ ' path="');
+
+ var newSeq = false;
+ var min = {x: null, y: null};
+ var max = {x: null, y: null};
+
+ for (var i = 0; i < this.currentPath_.length; i++) {
+ var p = this.currentPath_[i];
+
+ if (p.type == "moveTo") {
+ lineStr.push(" m ");
+ var c = this.getCoords_(p.x, p.y);
+ lineStr.push(mr(c.x), ",", mr(c.y));
+ } else if (p.type == "lineTo") {
+ lineStr.push(" l ");
+ var c = this.getCoords_(p.x, p.y);
+ lineStr.push(mr(c.x), ",", mr(c.y));
+ } else if (p.type == "close") {
+ lineStr.push(" x ");
+ } else if (p.type == "bezierCurveTo") {
+ lineStr.push(" c ");
+ var c = this.getCoords_(p.x, p.y);
+ var c1 = this.getCoords_(p.cp1x, p.cp1y);
+ var c2 = this.getCoords_(p.cp2x, p.cp2y);
+ lineStr.push(mr(c1.x), ",", mr(c1.y), ",",
+ mr(c2.x), ",", mr(c2.y), ",",
+ mr(c.x), ",", mr(c.y));
+ } else if (p.type == "at" || p.type == "wa") {
+ lineStr.push(" ", p.type, " ");
+ var c = this.getCoords_(p.x, p.y);
+ var cStart = this.getCoords_(p.xStart, p.yStart);
+ var cEnd = this.getCoords_(p.xEnd, p.yEnd);
+
+ lineStr.push(mr(c.x - this.arcScaleX_ * p.radius), ",",
+ mr(c.y - this.arcScaleY_ * p.radius), " ",
+ mr(c.x + this.arcScaleX_ * p.radius), ",",
+ mr(c.y + this.arcScaleY_ * p.radius), " ",
+ mr(cStart.x), ",", mr(cStart.y), " ",
+ mr(cEnd.x), ",", mr(cEnd.y));
+ }
+
+
+ // TODO: Following is broken for curves due to
+ // move to proper paths.
+
+ // Figure out dimensions so we can do gradient fills
+ // properly
+ if(c) {
+ if (min.x == null || c.x < min.x) {
+ min.x = c.x;
+ }
+ if (max.x == null || c.x > max.x) {
+ max.x = c.x;
+ }
+ if (min.y == null || c.y < min.y) {
+ min.y = c.y;
+ }
+ if (max.y == null || c.y > max.y) {
+ max.y = c.y;
+ }
+ }
+ }
+ lineStr.push(' ">');
+
+ if (typeof this.fillStyle == "object") {
+ var focus = {x: "50%", y: "50%"};
+ var width = (max.x - min.x);
+ var height = (max.y - min.y);
+ var dimension = (width > height) ? width : height;
+
+ focus.x = mr((this.fillStyle.focus_.x / width) * 100 + 50) + "%";
+ focus.y = mr((this.fillStyle.focus_.y / height) * 100 + 50) + "%";
+
+ var colors = [];
+
+ // inside radius (%)
+ if (this.fillStyle.type_ == "gradientradial") {
+ var inside = (this.fillStyle.radius1_ / dimension * 100);
+
+ // percentage that outside radius exceeds inside radius
+ var expansion = (this.fillStyle.radius2_ / dimension * 100) - inside;
+ } else {
+ var inside = 0;
+ var expansion = 100;
+ }
+
+ var insidecolor = {offset: null, color: null};
+ var outsidecolor = {offset: null, color: null};
+
+ // We need to sort 'colors' by percentage, from 0 > 100 otherwise ie
+ // won't interpret it correctly
+ this.fillStyle.colors_.sort(function (cs1, cs2) {
+ return cs1.offset - cs2.offset;
+ });
+
+ for (var i = 0; i < this.fillStyle.colors_.length; i++) {
+ var fs = this.fillStyle.colors_[i];
+
+ colors.push( (fs.offset * expansion) + inside, "% ", fs.color, ",");
+
+ if (fs.offset > insidecolor.offset || insidecolor.offset == null) {
+ insidecolor.offset = fs.offset;
+ insidecolor.color = fs.color;
+ }
+
+ if (fs.offset < outsidecolor.offset || outsidecolor.offset == null) {
+ outsidecolor.offset = fs.offset;
+ outsidecolor.color = fs.color;
+ }
+ }
+ colors.pop();
+
+ lineStr.push('<g_vml_:fill',
+ ' color="', outsidecolor.color, '"',
+ ' color2="', insidecolor.color, '"',
+ ' type="', this.fillStyle.type_, '"',
+ ' focusposition="', focus.x, ', ', focus.y, '"',
+ ' colors="', colors.join(""), '"',
+ ' opacity="', opacity, '" />');
+ } else if (aFill) {
+ lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity, '" />');
+ } else {
+ lineStr.push(
+ '<g_vml_:stroke',
+ ' opacity="', opacity,'"',
+ ' joinstyle="', this.lineJoin, '"',
+ ' miterlimit="', this.miterLimit, '"',
+ ' endcap="', processLineCap(this.lineCap) ,'"',
+ ' weight="', this.lineWidth, 'px"',
+ ' color="', color,'" />'
+ );
+ }
+
+ lineStr.push("</g_vml_:shape>");
+
+ this.element_.insertAdjacentHTML("beforeEnd", lineStr.join(""));
+
+ //this.currentPath_ = [];
+ };
+
+ contextPrototype.fill = function() {
+ this.stroke(true);
+ };
+
+ contextPrototype.closePath = function() {
+ this.currentPath_.push({type: "close"});
+ };
+
+ /**
+ * @private
+ */
+ contextPrototype.getCoords_ = function(aX, aY) {
+ return {
+ x: Z * (aX * this.m_[0][0] + aY * this.m_[1][0] + this.m_[2][0]) - Z2,
+ y: Z * (aX * this.m_[0][1] + aY * this.m_[1][1] + this.m_[2][1]) - Z2
+ };
+ };
+
+ contextPrototype.save = function() {
+ var o = {};
+ copyState(this, o);
+ this.aStack_.push(o);
+ this.mStack_.push(this.m_);
+ this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
+ };
+
+ contextPrototype.restore = function() {
+ copyState(this.aStack_.pop(), this);
+ this.m_ = this.mStack_.pop();
+ };
+
+ contextPrototype.translate = function(aX, aY) {
+ var m1 = [
+ [1, 0, 0],
+ [0, 1, 0],
+ [aX, aY, 1]
+ ];
+
+ this.m_ = matrixMultiply(m1, this.m_);
+ };
+
+ contextPrototype.rotate = function(aRot) {
+ var c = mc(aRot);
+ var s = ms(aRot);
+
+ var m1 = [
+ [c, s, 0],
+ [-s, c, 0],
+ [0, 0, 1]
+ ];
+
+ this.m_ = matrixMultiply(m1, this.m_);
+ };
+
+ contextPrototype.scale = function(aX, aY) {
+ this.arcScaleX_ *= aX;
+ this.arcScaleY_ *= aY;
+ var m1 = [
+ [aX, 0, 0],
+ [0, aY, 0],
+ [0, 0, 1]
+ ];
+
+ this.m_ = matrixMultiply(m1, this.m_);
+ };
+
+ /******** STUBS ********/
+ contextPrototype.clip = function() {
+ // TODO: Implement
+ };
+
+ contextPrototype.arcTo = function() {
+ // TODO: Implement
+ };
+
+ contextPrototype.createPattern = function() {
+ return new CanvasPattern_;
+ };
+
+ // Gradient / Pattern Stubs
+ function CanvasGradient_(aType) {
+ this.type_ = aType;
+ this.radius1_ = 0;
+ this.radius2_ = 0;
+ this.colors_ = [];
+ this.focus_ = {x: 0, y: 0};
+ }
+
+ CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
+ aColor = processStyle(aColor);
+ this.colors_.push({offset: 1-aOffset, color: aColor});
+ };
+
+ function CanvasPattern_() {}
+
+ // set up externs
+ G_vmlCanvasManager = G_vmlCanvasManager_;
+ CanvasRenderingContext2D = CanvasRenderingContext2D_;
+ CanvasGradient = CanvasGradient_;
+ CanvasPattern = CanvasPattern_;
+
+})();
+
+} // if
diff --git a/src/usr/local/www/reboot.php b/src/usr/local/www/reboot.php
new file mode 100755
index 0000000..3a986ac
--- /dev/null
+++ b/src/usr/local/www/reboot.php
@@ -0,0 +1,72 @@
+<?php
+/* $Id$ */
+/*
+ reboot.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-rebootsystem
+##|*NAME=Diagnostics: Reboot System page
+##|*DESCR=Allow access to the 'Diagnostics: Reboot System' page.
+##|*MATCH=reboot.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require("captiveportal.inc");
+
+if ($_POST['Submit'] == " " . gettext("No") . " ") {
+ header("Location: index.php");
+ exit;
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Reboot System"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($_POST['Submit'] == " " . gettext("Yes") . " "): ?>
+<meta http-equiv=\"refresh\" content=\"70;url=/\">
+<?php print_info_box(gettext("The system is rebooting now. This may take one minute.")); ?>
+<pre>
+<?php system_reboot(); ?>
+</pre>
+<?php else: ?>
+<form action="reboot.php" method="post">
+ <p><strong><?=gettext("Are you sure you want to reboot the system?");?></strong></p>
+ <p>
+ <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("Yes");?> " />
+ <input name="Submit" type="submit" class="formbtn" value=" <?=gettext("No");?> " />
+ </p>
+</form>
+<?php endif; ?>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/restart_httpd.php b/src/usr/local/www/restart_httpd.php
new file mode 100644
index 0000000..2f59bbf
--- /dev/null
+++ b/src/usr/local/www/restart_httpd.php
@@ -0,0 +1,68 @@
+<?php
+/* $Id$ */
+/*
+ restart_httpd.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2005 Bill Marquette <bill.marquette@gmail.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/chmod
+ pfSense_MODULE: pkgs
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-restart-httpd
+##|*NAME=Diagnostics: Restart HTTPD : System page
+##|*DESCR=Allow access to the 'Diagnostics: Restart HTTPD: System' page.
+##|*MATCH=restart_httpd.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+
+$pgtitle = array(gettext("Restarting httpd"));
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<form>
+<?php include("fbegin.inc"); ?>
+
+<?=gettext("Mounting file systems read/write");?>...
+<?php flush(); sleep(1); conf_mount_rw(); ?>
+<?=gettext("Done");?>.<br />
+<?=gettext("Forcing all PHP file permissions to 0755");?>...
+<?php flush(); sleep(1); system('/bin/chmod -R 0755 /usr/local/www/*.php'); ?>
+<?=gettext("Done");?>.<br />
+<?=gettext("Mounting file systems read only");?>...
+<?php flush(); sleep(1); conf_mount_ro(); ?>
+<?=gettext("Done");?>.<br />
+<?=gettext("Restarting mini_httpd");?>...
+<?php flush(); sleep(1); system_webgui_start(); ?>
+<?=gettext("Done");?>.<br />
+
+<?php
+include("fend.inc");
+?>
diff --git a/src/usr/local/www/services_captiveportal.php b/src/usr/local/www/services_captiveportal.php
new file mode 100644
index 0000000..515bcbb
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal.php
@@ -0,0 +1,1253 @@
+<?php
+/*
+ services_captiveportal.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal
+##|*NAME=Services: Captive portal page
+##|*DESCR=Allow access to the 'Services: Captive portal' page.
+##|*MATCH=services_captiveportal.php*
+##|-PRIV
+
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("captiveportal.inc");
+
+if (substr($_GET['act'], 0, 3) == "get") {
+ $nocsrf = true;
+}
+
+require_once("guiconfig.inc");
+
+global $cpzone;
+global $cpzoneid;
+
+$cpzoneid = 1; /* Just a default */
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone) || empty($config['captiveportal'][$cpzone])) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), $a_cp[$cpzone]['zone']);
+$shortcut_section = "captiveportal";
+
+if ($_GET['act'] == "viewhtml") {
+ if ($a_cp[$cpzone] && $a_cp[$cpzone]['page']['htmltext']) {
+ echo base64_decode($a_cp[$cpzone]['page']['htmltext']);
+ }
+ exit;
+} else if ($_GET['act'] == "gethtmlhtml" && $a_cp[$cpzone] && $a_cp[$cpzone]['page']['htmltext']) {
+ $file_data = base64_decode($a_cp[$cpzone]['page']['htmltext']);
+ $file_size = strlen($file_data);
+
+ header("Content-Type: text/html");
+ header("Content-Disposition: attachment; filename=portal.html");
+ header("Content-Length: $file_size");
+ echo $file_data;
+
+ exit;
+} else if ($_GET['act'] == "delhtmlhtml" && $a_cp[$cpzone] && $a_cp[$cpzone]['page']['htmltext']) {
+ unset($a_cp[$cpzone]['page']['htmltext']);
+ write_config(sprintf(gettext("Captive Portal: zone %s: Restore default portal page"), $cpzone));
+ header("Location: services_captiveportal.php?zone={$cpzone}");
+ exit;
+} else if ($_GET['act'] == "viewerrhtml") {
+ if ($a_cp[$cpzone] && $a_cp[$cpzone]['page']['errtext']) {
+ echo base64_decode($a_cp[$cpzone]['page']['errtext']);
+ }
+ exit;
+} else if ($_GET['act'] == "geterrhtml" && $a_cp[$cpzone] && $a_cp[$cpzone]['page']['errtext']) {
+ $file_data = base64_decode($a_cp[$cpzone]['page']['errtext']);
+ $file_size = strlen($file_data);
+
+ header("Content-Type: text/html");
+ header("Content-Disposition: attachment; filename=err.html");
+ header("Content-Length: $file_size");
+ echo $file_data;
+
+ exit;
+} else if ($_GET['act'] == "delerrhtml" && $a_cp[$cpzone] && $a_cp[$cpzone]['page']['errtext']) {
+ unset($a_cp[$cpzone]['page']['errtext']);
+ write_config(sprintf(gettext("Captive Portal: zone %s: Restore default error page"), $cpzone));
+ header("Location: services_captiveportal.php?zone={$cpzone}");
+ exit;
+} else if ($_GET['act'] == "viewlogouthtml") {
+ if ($a_cp[$cpzone] && $a_cp[$cpzone]['page']['logouttext']) {
+ echo base64_decode($a_cp[$cpzone]['page']['logouttext']);
+ }
+ exit;
+} else if ($_GET['act'] == "getlogouthtml" && $a_cp[$cpzone] && $a_cp[$cpzone]['page']['logouttext']) {
+ $file_data = base64_decode($a_cp[$cpzone]['page']['logouttext']);
+ $file_size = strlen($file_data);
+
+ header("Content-Type: text/html");
+ header("Content-Disposition: attachment; filename=logout.html");
+ header("Content-Length: $file_size");
+ echo $file_data;
+
+ exit;
+} else if ($_GET['act'] == "dellogouthtml" && $a_cp[$cpzone] && $a_cp[$cpzone]['page']['logouttext']) {
+ unset($a_cp[$cpzone]['page']['logouttext']);
+ write_config(sprintf(gettext("Captive Portal: zone %s: Restore default logout page"), $cpzone));
+ header("Location: services_captiveportal.php?zone={$cpzone}");
+ exit;
+}
+
+if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+}
+
+$a_ca =& $config['ca'];
+
+if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+}
+
+$a_cert =& $config['cert'];
+
+if ($a_cp[$cpzone]) {
+ $cpzoneid = $pconfig['zoneid'] = $a_cp[$cpzone]['zoneid'];
+ $pconfig['cinterface'] = $a_cp[$cpzone]['interface'];
+ $pconfig['maxproc'] = $a_cp[$cpzone]['maxproc'];
+ $pconfig['maxprocperip'] = $a_cp[$cpzone]['maxprocperip'];
+ $pconfig['timeout'] = $a_cp[$cpzone]['timeout'];
+ $pconfig['idletimeout'] = $a_cp[$cpzone]['idletimeout'];
+ $pconfig['freelogins_count'] = $a_cp[$cpzone]['freelogins_count'];
+ $pconfig['freelogins_resettimeout'] = $a_cp[$cpzone]['freelogins_resettimeout'];
+ $pconfig['freelogins_updatetimeouts'] = isset($a_cp[$cpzone]['freelogins_updatetimeouts']);
+ $pconfig['enable'] = isset($a_cp[$cpzone]['enable']);
+ $pconfig['auth_method'] = $a_cp[$cpzone]['auth_method'];
+ $pconfig['localauth_priv'] = isset($a_cp[$cpzone]['localauth_priv']);
+ $pconfig['radacct_enable'] = isset($a_cp[$cpzone]['radacct_enable']);
+ $pconfig['radmac_enable'] = isset($a_cp[$cpzone]['radmac_enable']);
+ $pconfig['radmac_secret'] = $a_cp[$cpzone]['radmac_secret'];
+ $pconfig['reauthenticate'] = isset($a_cp[$cpzone]['reauthenticate']);
+ $pconfig['reauthenticateacct'] = $a_cp[$cpzone]['reauthenticateacct'];
+ $pconfig['httpslogin_enable'] = isset($a_cp[$cpzone]['httpslogin']);
+ $pconfig['httpsname'] = $a_cp[$cpzone]['httpsname'];
+ $pconfig['preauthurl'] = strtolower($a_cp[$cpzone]['preauthurl']);
+ $pconfig['blockedmacsurl'] = strtolower($a_cp[$cpzone]['blockedmacsurl']);
+ $pconfig['certref'] = $a_cp[$cpzone]['certref'];
+ $pconfig['nohttpsforwards'] = isset($a_cp[$cpzone]['nohttpsforwards']);
+ $pconfig['logoutwin_enable'] = isset($a_cp[$cpzone]['logoutwin_enable']);
+ $pconfig['peruserbw'] = isset($a_cp[$cpzone]['peruserbw']);
+ $pconfig['bwdefaultdn'] = $a_cp[$cpzone]['bwdefaultdn'];
+ $pconfig['bwdefaultup'] = $a_cp[$cpzone]['bwdefaultup'];
+ $pconfig['nomacfilter'] = isset($a_cp[$cpzone]['nomacfilter']);
+ $pconfig['noconcurrentlogins'] = isset($a_cp[$cpzone]['noconcurrentlogins']);
+ $pconfig['radius_protocol'] = $a_cp[$cpzone]['radius_protocol'];
+ $pconfig['redirurl'] = $a_cp[$cpzone]['redirurl'];
+ $pconfig['radiusip'] = $a_cp[$cpzone]['radiusip'];
+ $pconfig['radiusip2'] = $a_cp[$cpzone]['radiusip2'];
+ $pconfig['radiusip3'] = $a_cp[$cpzone]['radiusip3'];
+ $pconfig['radiusip4'] = $a_cp[$cpzone]['radiusip4'];
+ $pconfig['radiusport'] = $a_cp[$cpzone]['radiusport'];
+ $pconfig['radiusport2'] = $a_cp[$cpzone]['radiusport2'];
+ $pconfig['radiusport3'] = $a_cp[$cpzone]['radiusport3'];
+ $pconfig['radiusport4'] = $a_cp[$cpzone]['radiusport4'];
+ $pconfig['radiusacctport'] = $a_cp[$cpzone]['radiusacctport'];
+ $pconfig['radiuskey'] = $a_cp[$cpzone]['radiuskey'];
+ $pconfig['radiuskey2'] = $a_cp[$cpzone]['radiuskey2'];
+ $pconfig['radiuskey3'] = $a_cp[$cpzone]['radiuskey3'];
+ $pconfig['radiuskey4'] = $a_cp[$cpzone]['radiuskey4'];
+ $pconfig['radiusvendor'] = $a_cp[$cpzone]['radiusvendor'];
+ $pconfig['radiussession_timeout'] = isset($a_cp[$cpzone]['radiussession_timeout']);
+ $pconfig['radiussrcip_attribute'] = $a_cp[$cpzone]['radiussrcip_attribute'];
+ $pconfig['passthrumacadd'] = isset($a_cp[$cpzone]['passthrumacadd']);
+ $pconfig['passthrumacaddusername'] = isset($a_cp[$cpzone]['passthrumacaddusername']);
+ $pconfig['radmac_format'] = $a_cp[$cpzone]['radmac_format'];
+ $pconfig['reverseacct'] = isset($a_cp[$cpzone]['reverseacct']);
+ $pconfig['radiusnasid'] = $a_cp[$cpzone]['radiusnasid'];
+ $pconfig['page'] = array();
+ if ($a_cp[$cpzone]['page']['htmltext']) {
+ $pconfig['page']['htmltext'] = $a_cp[$cpzone]['page']['htmltext'];
+ }
+ if ($a_cp[$cpzone]['page']['errtext']) {
+ $pconfig['page']['errtext'] = $a_cp[$cpzone]['page']['errtext'];
+ }
+ if ($a_cp[$cpzone]['page']['logouttext']) {
+ $pconfig['page']['logouttext'] = $a_cp[$cpzone]['page']['logouttext'];
+ }
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['enable']) {
+ $reqdfields = explode(" ", "zone cinterface");
+ $reqdfieldsn = array(gettext("Zone name"), gettext("Interface"));
+
+ if (isset($_POST['auth_method']) && $_POST['auth_method'] == "radius") {
+ $reqdfields[] = "radius_protocol";
+ $reqdfieldsn[] = gettext("RADIUS Protocol");
+ $reqdfields[] = "radiusip";
+ $reqdfieldsn[] = gettext("Primary RADIUS server IP address");
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ /* make sure no interfaces are bridged or used on other zones */
+ if (is_array($_POST['cinterface'])) {
+ foreach ($pconfig['cinterface'] as $cpbrif) {
+ if (link_interface_to_bridge($cpbrif)) {
+ $input_errors[] = sprintf(gettext("The captive portal cannot be used on interface %s since it is part of a bridge."), $cpbrif);
+ }
+ foreach ($a_cp as $cpkey => $cp) {
+ if ($cpkey != $cpzone || empty($cpzone)) {
+ if (in_array($cpbrif, explode(",", $cp['interface']))) {
+ $input_errors[] = sprintf(gettext("The captive portal cannot be used on interface %s since it is used already on %s instance."), $cpbrif, $cp['zone']);
+ }
+ }
+ }
+ }
+ }
+
+ if ($_POST['httpslogin_enable']) {
+ if (!$_POST['certref']) {
+ $input_errors[] = gettext("Certificate must be specified for HTTPS login.");
+ }
+ if (!$_POST['httpsname'] || !is_domain($_POST['httpsname'])) {
+ $input_errors[] = gettext("The HTTPS server name must be specified for HTTPS login.");
+ }
+ }
+ }
+
+ if ($_POST['timeout']) {
+ if (!is_numeric($_POST['timeout']) || ($_POST['timeout'] < 1)) {
+ $input_errors[] = gettext("The timeout must be at least 1 minute.");
+ } else if (isset($config['dhcpd']) && is_array($config['dhcpd'])) {
+ foreach ($config['dhcpd'] as $dhcpd_if => $dhcpd_data) {
+ if (!isset($dhcpd_data['enable'])) {
+ continue;
+ }
+ if (!is_array($_POST['cinterface']) || !in_array($dhcpd_if, $_POST['cinterface'])) {
+ continue;
+ }
+
+ $deftime = 7200; // Default lease time
+ if (isset($dhcpd_data['defaultleasetime']) && is_numeric($dhcpd_data['defaultleasetime'])) {
+ $deftime = $dhcpd_data['defaultleasetime'];
+ }
+
+ if ($_POST['timeout'] > $deftime) {
+ $input_errors[] = gettext("Hard timeout must be less or equal Default lease time set on DHCP Server");
+ }
+ }
+ }
+ }
+ if ($_POST['idletimeout'] && (!is_numeric($_POST['idletimeout']) || ($_POST['idletimeout'] < 1))) {
+ $input_errors[] = gettext("The idle timeout must be at least 1 minute.");
+ }
+ if ($_POST['freelogins_count'] && (!is_numeric($_POST['freelogins_count']))) {
+ $input_errors[] = gettext("The pass-through credit count must be a number or left blank.");
+ } else if ($_POST['freelogins_count'] && is_numeric($_POST['freelogins_count']) && ($_POST['freelogins_count'] >= 1)) {
+ if (empty($_POST['freelogins_resettimeout']) || !is_numeric($_POST['freelogins_resettimeout']) || ($_POST['freelogins_resettimeout'] <= 0)) {
+ $input_errors[] = gettext("The waiting period to restore pass-through credits must be above 0 hours.");
+ }
+ }
+ if (($_POST['radiusip'] && !is_ipaddr($_POST['radiusip']))) {
+ $input_errors[] = sprintf(gettext("A valid IP address must be specified. [%s]"), $_POST['radiusip']);
+ }
+ if (($_POST['radiusip2'] && !is_ipaddr($_POST['radiusip2']))) {
+ $input_errors[] = sprintf(gettext("A valid IP address must be specified. [%s]"), $_POST['radiusip2']);
+ }
+ if (($_POST['radiusip3'] && !is_ipaddr($_POST['radiusip3']))) {
+ $input_errors[] = sprintf(gettext("A valid IP address must be specified. [%s]"), $_POST['radiusip3']);
+ }
+ if (($_POST['radiusip4'] && !is_ipaddr($_POST['radiusip4']))) {
+ $input_errors[] = sprintf(gettext("A valid IP address must be specified. [%s]"), $_POST['radiusip4']);
+ }
+ if (($_POST['radiusport'] && !is_port($_POST['radiusport']))) {
+ $input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusport']);
+ }
+ if (($_POST['radiusport2'] && !is_port($_POST['radiusport2']))) {
+ $input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusport2']);
+ }
+ if (($_POST['radiusport3'] && !is_port($_POST['radiusport3']))) {
+ $input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusport3']);
+ }
+ if (($_POST['radiusport4'] && !is_port($_POST['radiusport4']))) {
+ $input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusport4']);
+ }
+ if (($_POST['radiusacctport'] && !is_port($_POST['radiusacctport']))) {
+ $input_errors[] = sprintf(gettext("A valid port number must be specified. [%s]"), $_POST['radiusacctport']);
+ }
+ if ($_POST['maxproc'] && (!is_numeric($_POST['maxproc']) || ($_POST['maxproc'] < 4) || ($_POST['maxproc'] > 100))) {
+ $input_errors[] = gettext("The maximum number of concurrent connections per client IP address may not be larger than the global maximum.");
+ }
+ if (trim($_POST['radiusnasid']) !== "" && !preg_match("/^[\x21-\x7e]{3,253}$/i", trim($_POST['radiusnasid']))) {
+ $input_errors[] = gettext("The NAS-Identifier must be 3-253 characters long and should only contain ASCII characters.");
+ }
+
+ if (!$input_errors) {
+ $newcp =& $a_cp[$cpzone];
+ //$newcp['zoneid'] = $a_cp[$cpzone]['zoneid'];
+ if (empty($newcp['zoneid'])) {
+ $newcp['zoneid'] = 2;
+ foreach ($a_cp as $keycpzone => $cp) {
+ if ($cp['zoneid'] == $newcp['zoneid'] && $keycpzone != $cpzone) {
+ $newcp['zoneid'] += 2; /* Reserve space for SSL config if needed */
+ }
+ }
+ $cpzoneid = $newcp['zoneid'];
+ }
+ $oldifaces = explode(",", $newcp['interface']);
+ if (is_array($_POST['cinterface'])) {
+ $newcp['interface'] = implode(",", $_POST['cinterface']);
+ }
+ $newcp['maxproc'] = $_POST['maxproc'];
+ $newcp['maxprocperip'] = $_POST['maxprocperip'] ? $_POST['maxprocperip'] : false;
+ $newcp['timeout'] = $_POST['timeout'];
+ $newcp['idletimeout'] = $_POST['idletimeout'];
+ $newcp['freelogins_count'] = $_POST['freelogins_count'];
+ $newcp['freelogins_resettimeout'] = $_POST['freelogins_resettimeout'];
+ $newcp['freelogins_updatetimeouts'] = $_POST['freelogins_updatetimeouts'] ? true : false;
+ if ($_POST['enable']) {
+ $newcp['enable'] = true;
+ } else {
+ unset($newcp['enable']);
+ }
+ $newcp['auth_method'] = $_POST['auth_method'];
+ $newcp['localauth_priv'] = isset($_POST['localauth_priv']);
+ $newcp['radacct_enable'] = $_POST['radacct_enable'] ? true : false;
+ $newcp['reauthenticate'] = $_POST['reauthenticate'] ? true : false;
+ $newcp['radmac_enable'] = $_POST['radmac_enable'] ? true : false;
+ $newcp['radmac_secret'] = $_POST['radmac_secret'] ? $_POST['radmac_secret'] : false;
+ $newcp['reauthenticateacct'] = $_POST['reauthenticateacct'];
+ if ($_POST['httpslogin_enable']) {
+ $newcp['httpslogin'] = true;
+ } else {
+ unset($newcp['httpslogin']);
+ }
+ $newcp['httpsname'] = $_POST['httpsname'];
+ $newcp['preauthurl'] = $_POST['preauthurl'];
+ $newcp['blockedmacsurl'] = $_POST['blockedmacsurl'];
+ $newcp['peruserbw'] = $_POST['peruserbw'] ? true : false;
+ if (isset($_POST['bwdefaultdn'])) {
+ $newcp['bwdefaultdn'] = $_POST['bwdefaultdn'];
+ } else {
+ unset($newcp['bwdefaultdn']);
+ }
+ if (isset($_POST['bwdefaultup'])) {
+ $newcp['bwdefaultup'] = $_POST['bwdefaultup'];
+ } else {
+ unset($newcp['bwdefaultup']);
+ }
+ $newcp['certref'] = $_POST['certref'];
+ $newcp['nohttpsforwards'] = $_POST['nohttpsforwards'] ? true : false;
+ $newcp['logoutwin_enable'] = $_POST['logoutwin_enable'] ? true : false;
+ $newcp['nomacfilter'] = $_POST['nomacfilter'] ? true : false;
+ $newcp['noconcurrentlogins'] = $_POST['noconcurrentlogins'] ? true : false;
+ $newcp['radius_protocol'] = $_POST['radius_protocol'];
+ $newcp['redirurl'] = $_POST['redirurl'];
+ if (isset($_POST['radiusip'])) {
+ $newcp['radiusip'] = $_POST['radiusip'];
+ } else {
+ unset($newcp['radiusip']);
+ }
+ if (isset($_POST['radiusip2'])) {
+ $newcp['radiusip2'] = $_POST['radiusip2'];
+ } else {
+ unset($newcp['radiusip2']);
+ }
+ if (isset($_POST['radiusip3'])) {
+ $newcp['radiusip3'] = $_POST['radiusip3'];
+ } else {
+ unset($newcp['radiusip3']);
+ }
+ if (isset($_POST['radiusip4'])) {
+ $newcp['radiusip4'] = $_POST['radiusip4'];
+ } else {
+ unset($newcp['radiusip4']);
+ }
+ $newcp['radiusport'] = $_POST['radiusport'];
+ $newcp['radiusport2'] = $_POST['radiusport2'];
+ if (isset($_POST['radiusport3'])) {
+ $newcp['radiusport3'] = $_POST['radiusport3'];
+ }
+ if (isset($_POST['radiusport4'])) {
+ $newcp['radiusport4'] = $_POST['radiusport4'];
+ }
+ $newcp['radiusacctport'] = $_POST['radiusacctport'];
+ $newcp['radiuskey'] = $_POST['radiuskey'];
+ $newcp['radiuskey2'] = $_POST['radiuskey2'];
+ $newcp['radiuskey3'] = $_POST['radiuskey3'];
+ $newcp['radiuskey4'] = $_POST['radiuskey4'];
+ $newcp['radiusvendor'] = $_POST['radiusvendor'] ? $_POST['radiusvendor'] : false;
+ $newcp['radiussession_timeout'] = $_POST['radiussession_timeout'] ? true : false;
+ $newcp['radiussrcip_attribute'] = $_POST['radiussrcip_attribute'];
+ $newcp['passthrumacadd'] = $_POST['passthrumacadd'] ? true : false;
+ $newcp['passthrumacaddusername'] = $_POST['passthrumacaddusername'] ? true : false;
+ $newcp['radmac_format'] = $_POST['radmac_format'] ? $_POST['radmac_format'] : false;
+ $newcp['reverseacct'] = $_POST['reverseacct'] ? true : false;
+ $newcp['radiusnasid'] = trim($_POST['radiusnasid']);
+ if (!is_array($newcp['page'])) {
+ $newcp['page'] = array();
+ }
+
+ /* file upload? */
+ if (is_uploaded_file($_FILES['htmlfile']['tmp_name'])) {
+ $newcp['page']['htmltext'] = base64_encode(file_get_contents($_FILES['htmlfile']['tmp_name']));
+ }
+ if (is_uploaded_file($_FILES['errfile']['tmp_name'])) {
+ $newcp['page']['errtext'] = base64_encode(file_get_contents($_FILES['errfile']['tmp_name']));
+ }
+ if (is_uploaded_file($_FILES['logoutfile']['tmp_name'])) {
+ $newcp['page']['logouttext'] = base64_encode(file_get_contents($_FILES['logoutfile']['tmp_name']));
+ }
+
+ write_config();
+
+ /* Clear up unselected interfaces */
+ $newifaces = explode(",", $newcp['interface']);
+ $toremove = array_diff($oldifaces, $newifaces);
+ if (!empty($toremove)) {
+ foreach ($toremove as $removeif) {
+ $removeif = get_real_interface($removeif);
+ mwexec("/sbin/ipfw zone {$cpzoneid} mdel {$removeif}");
+ }
+ }
+ captiveportal_configure_zone($newcp);
+ unset($newcp, $newifaces, $toremove);
+ filter_configure();
+ header("Location: services_captiveportal_zones.php");
+ exit;
+ } else {
+ if (is_array($_POST['cinterface'])) {
+ $pconfig['cinterface'] = implode(",", $_POST['cinterface']);
+ }
+ }
+}
+$closehead = false;
+include("head.inc");
+?>
+<script type="text/javascript">
+//<![CDATA[
+function enable_change(enable_change) {
+ var endis, radius_endis;
+ endis = !(document.iform.enable.checked || enable_change);
+ localauth_endis = !((!endis && document.iform.auth_method[1].checked) || enable_change);
+ radius_endis = !((!endis && document.iform.auth_method[2].checked) || enable_change);
+ https_endis = !((!endis && document.iform.httpslogin_enable.checked) || enable_change);
+
+ document.iform.cinterface.disabled = endis;
+ //document.iform.maxproc.disabled = endis;
+ document.iform.maxprocperip.disabled = endis;
+ document.iform.idletimeout.disabled = endis;
+ document.iform.freelogins_count.disabled = endis;
+ document.iform.freelogins_resettimeout.disabled = endis;
+ document.iform.freelogins_updatetimeouts.disabled = endis;
+ document.iform.timeout.disabled = endis;
+ document.iform.preauthurl.disabled = endis;
+ document.iform.blockedmacsurl.disabled = endis;
+ document.iform.redirurl.disabled = endis;
+ document.iform.localauth_priv.disabled = localauth_endis;
+ document.iform.radiusip.disabled = radius_endis;
+ document.iform.radiusip2.disabled = radius_endis;
+ document.iform.radiusip3.disabled = radius_endis;
+ document.iform.radiusip4.disabled = radius_endis;
+ document.iform.radiusport.disabled = radius_endis;
+ document.iform.radiusport3.disabled = radius_endis;
+ document.iform.radiusport4.disabled = radius_endis;
+ document.iform.radiusport2.disabled = radius_endis;
+ document.iform.radiuskey.disabled = radius_endis;
+ document.iform.radiuskey2.disabled = radius_endis;
+ document.iform.radiuskey3.disabled = radius_endis;
+ document.iform.radiuskey4.disabled = radius_endis;
+ document.iform.radacct_enable.disabled = radius_endis;
+ document.iform.peruserbw.disabled = endis;
+ document.iform.bwdefaultdn.disabled = endis;
+ document.iform.bwdefaultup.disabled = endis;
+ document.iform.reauthenticate.disabled = radius_endis;
+ document.iform.auth_method[0].disabled = endis;
+ document.iform.auth_method[1].disabled = endis;
+ document.iform.auth_method[2].disabled = endis;
+ document.iform.radius_protocol[0].disabled = radius_endis;
+ document.iform.radius_protocol[1].disabled = radius_endis;
+ document.iform.radius_protocol[2].disabled = radius_endis;
+ document.iform.radius_protocol[3].disabled = radius_endis;
+ document.iform.radmac_enable.disabled = radius_endis;
+ document.iform.httpslogin_enable.disabled = endis;
+ document.iform.radmac_format.disabled = radius_endis;
+ document.iform.httpsname.disabled = https_endis;
+ document.iform.certref.disabled = https_endis;
+ document.iform.nohttpsforwards.disabled = https_endis;
+ document.iform.logoutwin_enable.disabled = endis;
+ document.iform.nomacfilter.disabled = endis;
+ document.iform.noconcurrentlogins.disabled = endis;
+ document.iform.radiusvendor.disabled = radius_endis;
+ document.iform.radiussession_timeout.disabled = radius_endis;
+ document.iform.radiussrcip_attribute.disabled = radius_endis;
+ document.iform.htmlfile.disabled = endis;
+ document.iform.errfile.disabled = endis;
+ document.iform.logoutfile.disabled = endis;
+
+ document.iform.radiusacctport.disabled = (radius_endis || !document.iform.radacct_enable.checked) && !enable_change;
+
+ document.iform.radmac_secret.disabled = (radius_endis || !document.iform.radmac_enable.checked) && !enable_change;
+
+ var radacct_dis = (radius_endis || !document.iform.radacct_enable.checked) && !enable_change;
+ document.iform.reauthenticateacct[0].disabled = radacct_dis;
+ document.iform.reauthenticateacct[1].disabled = radacct_dis;
+ document.iform.reauthenticateacct[2].disabled = radacct_dis;
+ document.iform.reverseacct.disabled = (radius_endis || !document.iform.radacct_enable.checked) && !enable_change;
+ document.iform.radiusnasid.disabled = radius_endis;
+}
+//]]>
+</script>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form action="services_captiveportal.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captive portal">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Captive portal(s)"), true, "services_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+ display_top_tabs($tab_array, true);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main">
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
+ <strong><?=gettext("Enable captive portal"); ?> </strong>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interfaces"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="cinterface[]" multiple="multiple" size="<?php echo count($config['interfaces']); ?>" class="formselect" id="cinterface">
+ <?php
+ $interfaces = get_configured_interface_with_descr();
+ $cselected = explode(",", $pconfig['cinterface']);
+ foreach ($interfaces as $iface => $ifacename): ?>
+ <option value="<?=$iface;?>" <?php if (in_array($iface, $cselected)) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Select the interface(s) to enable for captive portal."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Maximum concurrent connections"); ?></td>
+ <td class="vtable">
+ <table cellpadding="0" cellspacing="0" summary="connections">
+ <tr>
+ <td>
+ <input name="maxprocperip" type="text" class="formfld unknown" id="maxprocperip" size="5" value="<?=htmlspecialchars($pconfig['maxprocperip']);?>" /> <?=gettext("per client IP address (0 = no limit)"); ?>
+ </td>
+ </tr>
+ </table>
+ <?=gettext("This setting limits the number of concurrent connections to the captive portal HTTP(S) server. This does not set how many users can be logged in " .
+ "to the captive portal, but rather how many users can load the portal page or authenticate at the same time! " .
+ "Possible setting allowed is: minimum 4 connections per client IP address, with a total maximum of 100 connections."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Idle timeout"); ?></td>
+ <td class="vtable">
+ <input name="idletimeout" type="text" class="formfld unknown" id="idletimeout" size="6" value="<?=htmlspecialchars($pconfig['idletimeout']);?>" />
+ <?=gettext("minutes"); ?><br />
+ <?=gettext("Clients will be disconnected after this amount of inactivity. They may log in again immediately, though. Leave this field blank for no idle timeout."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hard timeout"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="timeout" type="text" class="formfld unknown" id="timeout" size="6" value="<?=htmlspecialchars($pconfig['timeout']);?>" />
+ <?=gettext("minutes"); ?><br />
+ <?=gettext("Clients will be disconnected after this amount of time, regardless of activity. They may log in again immediately, though. Leave this field blank for no hard timeout (not recommended unless an idle timeout is set)."); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Pass-through credits allowed per MAC address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="freelogins_count" type="text" class="formfld unknown" id="freelogins_count" size="6" value="<?=htmlspecialchars($pconfig['freelogins_count']);?>" />
+ <?=gettext("per client MAC address (0 or blank = none)"); ?><br />
+ <?=gettext("This setting allows passing through the captive portal without authentication a limited number of times per MAC address. Once used up, the client can only log in with valid credentials until the waiting period specified below has expired. Recommended to set a hard timeout and/or idle timeout when using this for it to be effective."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Waiting period to restore pass-through credits"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="freelogins_resettimeout" type="text" class="formfld unknown" id="freelogins_resettimeout" size="6" value="<?=htmlspecialchars($pconfig['freelogins_resettimeout']);?>" />
+ <?=gettext("hours"); ?><br />
+ <?=gettext("Clients will have their available pass-through credits restored to the original count after this amount of time since using the first one. This must be above 0 hours if pass-through credits are enabled."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Reset waiting period on attempted access"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="freelogins_updatetimeouts" type="checkbox" class="formfld" id="freelogins_updatetimeouts" value="yes" <?php if ($pconfig['freelogins_updatetimeouts']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable waiting period reset on attempted access"); ?></strong><br />
+ <?=gettext("If enabled, the waiting period is reset to the original duration if access is attempted when all pass-through credits have already been exhausted."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Logout popup window"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="logoutwin_enable" type="checkbox" class="formfld" id="logoutwin_enable" value="yes" <?php if ($pconfig['logoutwin_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable logout popup window"); ?></strong><br />
+ <?=gettext("If enabled, a popup window will appear when clients are allowed through the captive portal. This allows clients to explicitly disconnect themselves before the idle or hard timeout occurs."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Pre-authentication redirect URL"); ?> </td>
+ <td class="vtable">
+ <input name="preauthurl" type="text" class="formfld url" id="preauthurl" size="60" value="<?=htmlspecialchars($pconfig['preauthurl']);?>" /><br />
+ <?php printf(gettext("Use this field to set \$PORTAL_REDIRURL\$ variable which can be accessed using your custom captive portal index.php page or error pages."));?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("After authentication Redirection URL"); ?></td>
+ <td class="vtable">
+ <input name="redirurl" type="text" class="formfld url" id="redirurl" size="60" value="<?=htmlspecialchars($pconfig['redirurl']);?>" />
+ <br />
+ <?=gettext("If you provide a URL here, clients will be redirected to that URL instead of the one they initially tried to access after they've authenticated."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Blocked MAC address redirect URL"); ?> </td>
+ <td class="vtable">
+ <input name="blockedmacsurl" type="text" class="formfld url" id="blockedmacsurl" size="60" value="<?=htmlspecialchars($pconfig['blockedmacsurl']);?>" /><br />
+ <?php printf(gettext("If you provide a URL here, MAC addresses set to be blocked will be redirect to that URL when attempt to access anything."));?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Concurrent user logins"); ?></td>
+ <td class="vtable">
+ <input name="noconcurrentlogins" type="checkbox" class="formfld" id="noconcurrentlogins" value="yes" <?php if ($pconfig['noconcurrentlogins']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable concurrent logins"); ?></strong><br />
+ <?=gettext("If this option is set, only the most recent login per username will be active. Subsequent logins will cause machines previously logged in with the same username to be disconnected."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("MAC filtering"); ?> </td>
+ <td class="vtable">
+ <input name="nomacfilter" type="checkbox" class="formfld" id="nomacfilter" value="yes" <?php if ($pconfig['nomacfilter']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable MAC filtering"); ?></strong><br />
+ <?=gettext("If this option is set, no attempts will be made to ensure that the MAC address of clients stays the same while they're logged in." .
+ "This is required when the MAC address of the client cannot be determined (usually because there are routers between"); ?> <?php echo $g['product_name'] ?> <?=gettext("and the clients)."); ?>
+ <?=gettext("If this is enabled, RADIUS MAC authentication cannot be used."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Pass-through MAC Auto Entry"); ?></td>
+ <td class="vtable">
+ <input name="passthrumacadd" type="checkbox" class="formfld" id="passthrumacadd" value="yes" <?php if ($pconfig['passthrumacadd']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable Pass-through MAC automatic additions"); ?></strong><br />
+ <?=gettext("If this option is set, a MAC passthrough entry is automatically added after the user has successfully authenticated. Users of that MAC address will never have to authenticate again."); ?>
+ <?=gettext("To remove the passthrough MAC entry you either have to log in and remove it manually from the"); ?> <a href="services_captiveportal_mac.php"><?=gettext("MAC tab"); ?></a> <?=gettext("or send a POST from another system to remove it."); ?>
+ <?=gettext("If this is enabled, RADIUS MAC authentication cannot be used. Also, the logout window will not be shown."); ?>
+ <br /><br />
+ <input name="passthrumacaddusername" type="checkbox" class="formfld" id="passthrumacaddusername" value="yes" <?php if ($pconfig['passthrumacaddusername']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable Pass-through MAC automatic addition with username"); ?></strong><br />
+ <?=gettext("If this option is set, with the automatically MAC passthrough entry created the username, used during authentication, will be saved."); ?>
+ <?=gettext("To remove the passthrough MAC entry you either have to log in and remove it manually from the"); ?> <a href="services_captiveportal_mac.php"><?=gettext("MAC tab"); ?></a> <?=gettext("or send a POST from another system to remove it."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Per-user bandwidth restriction"); ?></td>
+ <td class="vtable">
+ <input name="peruserbw" type="checkbox" class="formfld" id="peruserbw" value="yes" <?php if ($pconfig['peruserbw']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable per-user bandwidth restriction"); ?></strong><br /><br />
+ <table cellpadding="0" cellspacing="0" summary="bandwidth">
+ <tr>
+ <td><?=gettext("Default download"); ?></td>
+ <td>
+ <input type="text" class="formfld unknown" name="bwdefaultdn" id="bwdefaultdn" size="10" value="<?=htmlspecialchars($pconfig['bwdefaultdn']);?>" /> <?=gettext("Kbit/s"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Default upload"); ?></td>
+ <td>
+ <input type="text" class="formfld unknown" name="bwdefaultup" id="bwdefaultup" size="10" value="<?=htmlspecialchars($pconfig['bwdefaultup']);?>" /> <?=gettext("Kbit/s"); ?>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <?=gettext("If this option is set, the captive portal will restrict each user who logs in to the specified default bandwidth. RADIUS can override the default settings. Leave empty or set to 0 for no limit."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Authentication"); ?></td>
+ <td width="78%" class="vtable">
+ <table cellpadding="0" cellspacing="0" summary="authentication">
+ <tr>
+ <td colspan="2">
+ <input name="auth_method" type="radio" id="auth_method" value="none" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] != "local" && $pconfig['auth_method'] != "radius") echo "checked=\"checked\""; ?> />
+ <?=gettext("No Authentication"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input name="auth_method" type="radio" id="auth_method" value="local" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "local") echo "checked=\"checked\""; ?> />
+ <?=gettext("Local"); ?> <a href="system_usermanager.php"><?=gettext("User Manager"); ?></a> / <?=gettext("Vouchers"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>
+ <input name="localauth_priv" type="checkbox" id="localauth_priv" value="yes" onclick="enable_change(false)" <?php if ($pconfig['localauth_priv'] == "yes") echo "checked=\"checked\""; ?> />
+ <?=gettext("Allow only users/groups with 'Captive portal login' privilege set"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input name="auth_method" type="radio" id="auth_method" value="radius" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius") echo "checked=\"checked\""; ?> />
+ <?=gettext("RADIUS Authentication"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Protocol"); ?></td>
+ <td width="78%" class="vtable">
+ <table cellpadding="0" cellspacing="0" summary="radius">
+ <tr>
+ <td colspan="2">
+ <input name="radius_protocol" type="radio" id="radius_protocol" value="PAP" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius" && $pconfig['radius_protocol'] != "CHAP_MD5" && $pconfig['radius_protocol'] != "MSCHAPv1" && $pconfig['radius_protocol'] != "MSCHAPv2") echo "checked=\"checked\""; ?> />
+ <?=gettext("PAP"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input name="radius_protocol" type="radio" id="radius_protocol" value="CHAP_MD5" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius" && $pconfig['radius_protocol'] == "CHAP_MD5") echo "checked=\"checked\""; ?> />
+ <?=gettext("CHAP_MD5"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input name="radius_protocol" type="radio" id="radius_protocol" value="MSCHAPv1" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius" && $pconfig['radius_protocol'] == "MSCHAPv1") echo "checked=\"checked\""; ?> />
+ <?=gettext("MSCHAPv1"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input name="radius_protocol" type="radio" id="radius_protocol" value="MSCHAPv2" onclick="enable_change(false)" <?php if ($pconfig['auth_method'] == "radius" && $pconfig['radius_protocol'] == "MSCHAPv2") echo "checked=\"checked\""; ?> />
+ <?=gettext("MSCHAPv2"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ </table>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="primary athentication">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic">Primary Authentication Source</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t2"><?=gettext("Primary RADIUS server"); ?></td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("IP address"); ?></td>
+ <td class="vtable">
+ <input name="radiusip" type="text" class="formfld unknown" id="radiusip" size="20" value="<?=htmlspecialchars($pconfig['radiusip']);?>" /><br />
+ <?=gettext("Enter the IP address of the RADIUS server which users of the captive portal have to authenticate against."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Port"); ?></td>
+ <td class="vtable">
+ <input name="radiusport" type="text" class="formfld unknown" id="radiusport" size="5" value="<?=htmlspecialchars($pconfig['radiusport']);?>" /><br />
+ <?=gettext("Leave this field blank to use the default port (1812)."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Shared secret"); ?>&nbsp;&nbsp;</td>
+ <td class="vtable">
+ <input name="radiuskey" type="text" class="formfld unknown" id="radiuskey" size="16" value="<?=htmlspecialchars($pconfig['radiuskey']);?>" /><br />
+ <?=gettext("Leave this field blank to not use a RADIUS shared secret (not recommended)."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t2"><?=gettext("Secondary RADIUS server"); ?></td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("IP address"); ?></td>
+ <td class="vtable">
+ <input name="radiusip2" type="text" class="formfld unknown" id="radiusip2" size="20" value="<?=htmlspecialchars($pconfig['radiusip2']);?>" /><br />
+ <?=gettext("If you have a second RADIUS server, you can activate it by entering its IP address here."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Port"); ?></td>
+ <td class="vtable">
+ <input name="radiusport2" type="text" class="formfld unknown" id="radiusport2" size="5" value="<?=htmlspecialchars($pconfig['radiusport2']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Shared secret"); ?>&nbsp;&nbsp;</td>
+ <td class="vtable">
+ <input name="radiuskey2" type="text" class="formfld unknown" id="radiuskey2" size="16" value="<?=htmlspecialchars($pconfig['radiuskey2']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic">Secondary Authentication Source</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t2"><?=gettext("Primary RADIUS server"); ?></td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("IP address"); ?></td>
+ <td class="vtable">
+ <input name="radiusip3" type="text" class="formfld unknown" id="radiusip3" size="20" value="<?=htmlspecialchars($pconfig['radiusip3']);?>" /><br />
+ <?=gettext("If you have a third RADIUS server, you can activate it by entering its IP address here."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Port"); ?></td>
+ <td class="vtable">
+ <input name="radiusport3" type="text" class="formfld unknown" id="radiusport3" size="5" value="<?=htmlspecialchars($pconfig['radiusport3']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Shared secret"); ?>&nbsp;&nbsp;</td>
+ <td class="vtable">
+ <input name="radiuskey3" type="text" class="formfld unknown" id="radiuskey3" size="16" value="<?=htmlspecialchars($pconfig['radiuskey3']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t2"><?=gettext("Secondary RADIUS server"); ?></td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("IP address"); ?></td>
+ <td class="vtable">
+ <input name="radiusip4" type="text" class="formfld unknown" id="radiusip4" size="20" value="<?=htmlspecialchars($pconfig['radiusip4']);?>" /><br />
+ <?=gettext("If you have a fourth RADIUS server, you can activate it by entering its IP address here."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Port"); ?></td>
+ <td class="vtable">
+ <input name="radiusport4" type="text" class="formfld unknown" id="radiusport4" size="5" value="<?=htmlspecialchars($pconfig['radiusport4']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Shared secret"); ?>&nbsp;&nbsp;</td>
+ <td class="vtable">
+ <input name="radiuskey4" type="text" class="formfld unknown" id="radiuskey4" size="16" value="<?=htmlspecialchars($pconfig['radiuskey4']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Accounting"); ?></td>
+ </tr>
+ <tr>
+ <td class="vncell">&nbsp;</td>
+ <td class="vtable">
+ <input name="radacct_enable" type="checkbox" id="radacct_enable" value="yes" onclick="enable_change(false)" <?php if ($pconfig['radacct_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("send RADIUS accounting packets"); ?></strong><br />
+ <?=gettext("If this is enabled, RADIUS accounting packets will be sent to the primary RADIUS server."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Accounting port"); ?></td>
+ <td class="vtable">
+ <input name="radiusacctport" type="text" class="formfld unknown" id="radiusacctport" size="5" value="<?=htmlspecialchars($pconfig['radiusacctport']);?>" /><br />
+ <?=gettext("Leave blank to use the default port (1813)."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Accounting updates"); ?></td>
+ <td class="vtable">
+ <input name="reauthenticateacct" type="radio" value="" <?php if (!$pconfig['reauthenticateacct']) echo "checked=\"checked\""; ?> /> <?=gettext("no accounting updates"); ?><br />
+ <input name="reauthenticateacct" type="radio" value="stopstart" <?php if ($pconfig['reauthenticateacct'] == "stopstart") echo "checked=\"checked\""; ?> /> <?=gettext("stop/start accounting"); ?><br />
+ <input name="reauthenticateacct" type="radio" value="interimupdate" <?php if ($pconfig['reauthenticateacct'] == "interimupdate") echo "checked=\"checked\""; ?> /> <?=gettext("interim update"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("RADIUS options"); ?></td>
+ </tr>
+ <tr>
+ <td class="vncell"><?=gettext("Reauthentication"); ?></td>
+ <td class="vtable">
+ <input name="reauthenticate" type="checkbox" id="reauthenticate" value="yes" onclick="enable_change(false)" <?php if ($pconfig['reauthenticate']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Reauthenticate connected users every minute"); ?></strong><br />
+ <?=gettext("If reauthentication is enabled, Access-Requests will be sent to the RADIUS server for each user that is " .
+ "logged in every minute. If an Access-Reject is received for a user, that user is disconnected from the captive portal immediately."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class=""><?=gettext("RADIUS MAC authentication"); ?></td>
+ <td class="">
+ <input name="radmac_enable" type="checkbox" id="radmac_enable" value="yes" onclick="enable_change(false)" <?php if ($pconfig['radmac_enable']) echo "checked=\"checked\""; ?> /><strong><?=gettext("Enable RADIUS MAC authentication"); ?></strong><br />
+ <?=gettext("If this option is enabled, the captive portal will try to authenticate users by sending their MAC address as the username and the password " .
+ "entered below to the RADIUS server."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell"><?=gettext("MAC authentication secret"); ?></td>
+ <td class="vtable">
+ <input name="radmac_secret" type="text" class="formfld unknown" id="radmac_secret" size="16" value="<?=htmlspecialchars($pconfig['radmac_secret']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("RADIUS NAS IP attribute"); ?></td>
+ <td class="vtable">
+ <select name="radiussrcip_attribute" id="radiussrcip_attribute">
+ <?php
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $ifdesc => $ifdescr) {
+ $ipaddr = get_interface_ip($ifdesc);
+ if (is_ipaddr($ipaddr)) {
+ $selected = "";
+ if ($ifdesc == $pconfig['radiussrcip_attribute']) {
+ $selected= "selected=\"selected\"";
+ }
+ echo "<option value='{$ifdesc}' {$selected}>{$ifdescr} - {$ipaddr}</option>\n";
+ }
+ }
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $sn) {
+ if ($sn['mode'] == "proxyarp" && $sn['type'] == "network") {
+ $start = ip2long32(gen_subnet($sn['subnet'], $sn['subnet_bits']));
+ $end = ip2long32(gen_subnet_max($sn['subnet'], $sn['subnet_bits']));
+ $len = $end - $start;
+
+ for ($i = 0; $i <= $len; $i++) {
+ $snip = long2ip32($start+$i);
+ echo "<option value='{$snip}' {$selected}>" . htmlspecialchars("{$sn['descr']} - {$snip}") . "></option>\n";
+ }
+ } else {
+ echo "<option value='{$sn['subnet']}' {$selected}>" . htmlspecialchars("{$sn['descr']} - {$sn['subnet']}") . "></option>\n";
+ }
+ }
+ }
+ ?>
+ </select><br />
+ <?=gettext("Choose the IP to use for calling station attribute."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Session-Timeout"); ?></td>
+ <td class="vtable">
+ <input name="radiussession_timeout" type="checkbox" id="radiussession_timeout" value="yes" <?php if ($pconfig['radiussession_timeout']) echo "checked=\"checked\""; ?> /><strong><?=gettext("Use RADIUS Session-Timeout attributes"); ?></strong><br />
+ <?=gettext("When this is enabled, clients will be disconnected after the amount of time retrieved from the RADIUS Session-Timeout attribute."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Type"); ?></td>
+ <td class="vtable">
+ <select name="radiusvendor" id="radiusvendor">
+ <option value="default"><?php echo gettext("default"); ?></option>
+ <?php
+ $radiusvendors = array("cisco");
+ foreach ($radiusvendors as $radiusvendor) {
+ if ($pconfig['radiusvendor'] == $radiusvendor) {
+ echo "<option selected=\"selected\" value=\"$radiusvendor\">$radiusvendor</option>\n";
+ } else {
+ echo "<option value=\"$radiusvendor\">$radiusvendor</option>\n";
+ }
+ }
+ ?>
+ </select><br />
+ <?php printf(gettext("If RADIUS type is set to Cisco, in Access-Requests the value of Calling-Station-Id will be set to the client's IP address and " .
+ "the Called-Station-Id to the client's MAC address. Default behavior is Calling-Station-Id = client's MAC address and Called-Station-Id = %s's WAN IP address."),
+ $g['product_name']);?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("Accounting Style"); ?></td>
+ <td class="vtable">
+ <input name="reverseacct" type="checkbox" id="reverseacct" value="yes" <?php if ($pconfig['reverseacct']) echo "checked=\"checked\""; ?> /><strong><?=gettext("Invert Acct-Input-Octets and Acct-Output-Octets"); ?></strong><br />
+ <?=gettext("When this is enabled, data counts for RADIUS accounting packets will be taken from the client perspective, not the NAS. Acct-Input-Octets will represent download, and Acct-Output-Octets will represent upload."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("NAS Identifier"); ?></td>
+ <td class="vtable">
+ <input name="radiusnasid" type="text" maxlength="253" class="formfld unknown" id="radiusnasid" value="<?=htmlspecialchars($pconfig['radiusnasid']);?>" /><br />
+ <?=gettext("Specify a NAS identifier to override the default value") . " (" . php_uname("n") . ")"; ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="vncell" valign="top"><?=gettext("MAC address format"); ?></td>
+ <td class="vtable">
+ <select name="radmac_format" id="radmac_format">
+ <option value="default"><?php echo gettext("default"); ?></option>
+ <?php
+ $macformats = array("singledash", "ietf", "cisco", "unformatted");
+ foreach ($macformats as $macformat) {
+ if ($pconfig['radmac_format'] == $macformat) {
+ echo "<option selected=\"selected\" value=\"$macformat\">", gettext($macformat), "</option>\n";
+ } else {
+ echo "<option value=\"$macformat\">", gettext($macformat), "</option>\n";
+ }
+ }
+ ?>
+ </select><br />
+ <?=gettext("This option changes the MAC address format used in the whole RADIUS system. Change this if you also"); ?>
+ <?=gettext("need to change the username format for RADIUS MAC authentication."); ?><br />
+ <?=gettext("default:"); ?> 00:11:22:33:44:55<br />
+ <?=gettext("singledash:"); ?> 001122-334455<br />
+ <?=gettext("ietf:"); ?> 00-11-22-33-44-55<br />
+ <?=gettext("cisco:"); ?> 0011.2233.4455<br />
+ <?=gettext("unformatted:"); ?> 001122334455
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("HTTPS login"); ?></td>
+ <td class="vtable">
+ <input name="httpslogin_enable" type="checkbox" class="formfld" id="httpslogin_enable" value="yes" onclick="enable_change(false)" <?php if ($pconfig['httpslogin_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable HTTPS login"); ?></strong><br />
+ <?=gettext("If enabled, the username and password will be transmitted over an HTTPS connection to protect against eavesdroppers. A server name and certificate must also be specified below."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("HTTPS server name"); ?> </td>
+ <td class="vtable">
+ <input name="httpsname" type="text" class="formfld unknown" id="httpsname" size="30" value="<?=htmlspecialchars($pconfig['httpsname']);?>" /><br />
+ <?php printf(gettext("This name will be used in the form action for the HTTPS POST and should match the Common Name (CN) in your certificate (otherwise, the client browser will most likely display a security warning). Make sure captive portal clients can resolve this name in DNS and verify on the client that the IP resolves to the correct interface IP on %s."), $g['product_name']);?>
+ </td>
+ </tr>
+ <tr id="ssl_opts">
+ <td width="22%" valign="top" class="vncell"><?=gettext("SSL Certificate"); ?></td>
+ <td width="78%" class="vtable">
+ <?php if (count($a_cert)): ?>
+ <select name="certref" id="certref" class="formselect">
+ <?php
+ foreach ($a_cert as $cert):
+ $selected = "";
+ if ($pconfig['certref'] == $cert['refid']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$cert['refid'];?>"<?=$selected;?>><?=htmlspecialchars($cert['descr']);?></option>
+ <?php endforeach; ?>
+ </select>
+ <?php else: ?>
+ <b><?=gettext("No Certificates defined."); ?></b> <br />Create one under <a href="system_certmanager.php">System &gt; Cert Manager</a>.
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Disable HTTPS forwards"); ?></td>
+ <td class="vtable">
+ <input name="nohttpsforwards" type="checkbox" class="formfld" id="nohttpsforwards" value="yes" <?php if ($pconfig['nohttpsforwards']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable HTTPS forwards"); ?></strong><br/>
+ <?=gettext("If this option is set, attempts to connect to SSL/HTTPS (Port 443) sites will not be forwarded to the captive portal. This prevents certificate errors from being presented to the user even if HTTPS logins are enabled. Users must attempt a connecton to an HTTP (Port 80) site to get forwarded to the captive portal. If HTTPS logins are enabled, the user will be redirected to the HTTPS login page."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Portal page contents"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input type="file" name="htmlfile" class="formfld file" id="htmlfile" /><br />
+ <?php
+ list($host) = explode(":", $_SERVER['HTTP_HOST']);
+ $zoneid = $pconfig['zoneid'] ? $pconfig['zoneid'] : 8000;
+ if ($pconfig['httpslogin_enable']) {
+ $port = $pconfig['listenporthttps'] ? $pconfig['listenporthttps'] : ($zoneid + 8001);
+ $href = "https://{$host}:{$port}";
+ } else {
+ $port = $pconfig['listenporthttp'] ? $pconfig['listenporthttp'] : ($zoneid + 8000);
+ $href = "http://{$host}:{$port}";
+ }
+ ?>
+ <?php if ($pconfig['page']['htmltext']): ?>
+ <a href="<?=$href?>" target="_blank"><?=gettext("View current page"); ?></a>
+ <br />
+ <a href="?zone=<?=$cpzone?>&amp;act=gethtmlhtml" target="_blank"><?=gettext("Download current page"); ?></a>
+ <br />
+ <a href="?zone=<?=$cpzone?>&amp;act=delhtmlhtml" onclick="return confirm('Do you really want to restore default page?')" target="_blank">
+ <?=gettext("Restore default portal page"); ?>
+ </a>
+ <br />
+ <br />
+ <?php endif; ?>
+ <?php
+ printf(
+ gettext('Upload an HTML/PHP file for the portal page here (leave blank to keep the current one). ' .
+ 'Make sure to include a form (POST to %1$s) with a submit button (%2$s) and a hidden field with %3$s and %4$s. ' .
+ 'Include the %5$s and %6$s and/or %7$s input fields if authentication is enabled, otherwise it will always fail.'),
+ '&quot;$PORTAL_ACTION$&quot;',
+ "name=&quot;accept&quot;",
+ "name=&quot;redirurl&quot;",
+ 'value=&quot;$PORTAL_REDIRURL$&quot;',
+ "&quot;auth_user&quot;",
+ "&quot;auth_pass&quot;",
+ "&quot;auth_voucher&quot;");
+ ?>
+ <?=gettext("Example code for the form:"); ?><br />
+ <br />
+ <tt>&lt;form method=&quot;post&quot; action=&quot;$PORTAL_ACTION$&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;auth_user&quot; type=&quot;text&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;auth_pass&quot; type=&quot;password&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;auth_voucher&quot; type=&quot;text&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;redirurl&quot; type=&quot;hidden&quot; value=&quot;$PORTAL_REDIRURL$&quot;&gt;<br />
+ &nbsp;&nbsp;&nbsp;&lt;input name=&quot;accept&quot; type=&quot;submit&quot; value=&quot;Continue&quot;&gt;<br />
+ &lt;/form&gt;</tt>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Authentication"); ?><br />
+ <?=gettext("error page"); ?><br />
+ <?=gettext("contents"); ?>
+ </td>
+ <td class="vtable">
+ <input name="errfile" type="file" class="formfld file" id="errfile" /><br />
+ <?php if ($pconfig['page']['errtext']): ?>
+ <a href="?zone=<?=$cpzone?>&amp;act=viewerrhtml" target="_blank"><?=gettext("View current page"); ?></a>
+ <br />
+ <a href="?zone=<?=$cpzone?>&amp;act=geterrhtml" target="_blank"><?=gettext("Download current page"); ?></a>
+ <br />
+ <a href="?zone=<?=$cpzone?>&amp;act=delerrhtml" onclick="return confirm('Do you really want to restore default page?')" target="_blank">
+ <?=gettext("Restore default error page"); ?>
+ </a>
+ <br />
+ <br />
+ <?php endif; ?>
+ <?=gettext("The contents of the HTML/PHP file that you upload here are displayed when an authentication error occurs. " .
+ "You may include"); ?> &quot;$PORTAL_MESSAGE$&quot;, <?=gettext("which will be replaced by the error or reply messages from the RADIUS server, if any."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Logout"); ?><br />
+ <?=gettext("page"); ?><br />
+ <?=gettext("contents"); ?></td>
+ <td class="vtable">
+ <input name="logoutfile" type="file" class="formfld file" id="logoutfile" /><br />
+ <?php if ($pconfig['page']['logouttext']): ?>
+ <a href="?zone=<?=$cpzone?>&amp;act=viewlogouthtml" target="_blank"><?=gettext("View current page"); ?></a>
+ <br />
+ <a href="?zone=<?=$cpzone?>&amp;act=getlogouthtml" target="_blank"><?=gettext("Download current page"); ?></a>
+ <br />
+ <a href="?zone=<?=$cpzone?>&amp;act=dellogouthtml" onclick="return confirm('Do you really want to restore default page?')" target="_blank">
+ <?=gettext("Restore default logout page"); ?>
+ </a>
+ <br />
+ <br />
+ <?php endif; ?>
+ <?=gettext("The contents of the HTML/PHP file that you upload here are displayed on authentication success when the logout popup is enabled."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <?php echo "<input name='zone' id='zone' type='hidden' value='" . htmlspecialchars($cpzone, ENT_QUOTES | ENT_HTML401) . "' />"; ?>
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
+ <a href="services_captiveportal_zones.php"><input name="Cancel" type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" onclick="enable_change(true)" /></a>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:"); ?><br />
+ </strong>
+ </span>
+ <?=gettext("Changing any settings on this page will disconnect all clients! Don't forget to enable the DHCP server on your captive portal interface! Make sure that the default/maximum DHCP lease time is higher than the timeout entered on this page. Also, the DNS Forwarder or Resolver needs to be enabled for DNS lookups by unauthenticated clients to work."); ?>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_filemanager.php b/src/usr/local/www/services_captiveportal_filemanager.php
new file mode 100644
index 0000000..f672938
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_filemanager.php
@@ -0,0 +1,267 @@
+<?php
+/*
+ services_captiveportal_filemanager.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2005-2006 Jonathan De Graeve (jonathan.de.graeve@imelda.be)
+ and Paul Taylor (paultaylor@winn-dixie.com).
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-filemanager
+##|*NAME=Services: Captive portal: File Manager page
+##|*DESCR=Allow access to the 'Services: Captive portal: File Manager' page.
+##|*MATCH=services_captiveportal_filemanager.php*
+##|-PRIV
+
+function cpelementscmp($a, $b) {
+ return strcasecmp($a['name'], $b['name']);
+}
+
+function cpelements_sort() {
+ global $config, $cpzone;
+
+ usort($config['captiveportal'][$cpzone]['element'], "cpelementscmp");
+}
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone)) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), $a_cp[$cpzone]['zone']);
+$shortcut_section = "captiveportal";
+
+if (!is_array($a_cp[$cpzone]['element'])) {
+ $a_cp[$cpzone]['element'] = array();
+}
+$a_element =& $a_cp[$cpzone]['element'];
+
+// Calculate total size of all files
+$total_size = 0;
+foreach ($a_element as $element) {
+ $total_size += $element['size'];
+}
+
+if ($_POST) {
+ unset($input_errors);
+
+ if (is_uploaded_file($_FILES['new']['tmp_name'])) {
+
+ if (!stristr($_FILES['new']['name'], "captiveportal-")) {
+ $name = "captiveportal-" . $_FILES['new']['name'];
+ } else {
+ $name = $_FILES['new']['name'];
+ }
+ $size = filesize($_FILES['new']['tmp_name']);
+
+ // is there already a file with that name?
+ foreach ($a_element as $element) {
+ if ($element['name'] == $name) {
+ $input_errors[] = sprintf(gettext("A file with the name '%s' already exists."), $name);
+ break;
+ }
+ }
+
+ // check total file size
+ if (($total_size + $size) > $g['captiveportal_element_sizelimit']) {
+ $input_errors[] = gettext("The total size of all files uploaded may not exceed ") .
+ format_bytes($g['captiveportal_element_sizelimit']) . ".";
+ }
+
+ if (!$input_errors) {
+ $element = array();
+ $element['name'] = $name;
+ $element['size'] = $size;
+ $element['content'] = base64_encode(file_get_contents($_FILES['new']['tmp_name']));
+
+ $a_element[] = $element;
+ cpelements_sort();
+
+ write_config();
+ captiveportal_write_elements();
+ header("Location: services_captiveportal_filemanager.php?zone={$cpzone}");
+ exit;
+ }
+ }
+} else if (($_GET['act'] == "del") && !empty($cpzone) && $a_element[$_GET['id']]) {
+ conf_mount_rw();
+ @unlink("{$g['captiveportal_element_path']}/" . $a_element[$_GET['id']]['name']);
+ @unlink("{$g['captiveportal_path']}/" . $a_element[$_GET['id']]['name']);
+ conf_mount_ro();
+ unset($a_element[$_GET['id']]);
+ write_config();
+ header("Location: services_captiveportal_filemanager.php?zone={$cpzone}");
+ exit;
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_captiveportal_filemanager.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
+<input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captiveportal file manager">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("File Manager"), true, "services_captiveportal_filemanager.php?zone={$cpzone}");
+ display_top_tabs($tab_array, true);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="80%" border="0" cellpadding="0" cellspacing="0" summary="main">
+ <tr>
+ <td width="70%" class="listhdrr"><?=gettext("Name"); ?></td>
+ <td width="20%" class="listhdr"><?=gettext("Size"); ?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td width="17" height="17"></td>
+ <td>
+ <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone;?>&amp;act=add"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add file"); ?>" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if (is_array($a_cp[$cpzone]['element'])):
+ $i = 0;
+ foreach ($a_cp[$cpzone]['element'] as $element):
+?>
+ <tr>
+ <td class="listlr"><?=htmlspecialchars($element['name']);?></td>
+ <td class="listr" align="right"><?=format_bytes($element['size']);?></td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this file?"); ?>')"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete file"); ?>" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+ endif;
+?>
+
+<?php
+ if ($total_size > 0):
+?>
+ <tr>
+ <td class="listlr" style="background-color: #eee"><strong><?=gettext("TOTAL"); ?></strong></td>
+ <td class="listr" style="background-color: #eee" align="right"><strong><?=format_bytes($total_size);?></strong></td>
+ <td valign="middle" class="list nowrap"></td>
+ </tr>
+<?php
+ endif;
+
+ if ($_GET['act'] == 'add'):
+?>
+ <tr>
+ <td class="listlr" colspan="2">
+ <input type="file" name="new" class="formfld file" size="40" id="new" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Upload"); ?>" />
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("cancel"); ?>" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ else:
+?>
+ <tr>
+ <td class="list" colspan="2"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17" height="17"></td>
+ <td>
+ <a href="services_captiveportal_filemanager.php?zone=<?=$cpzone;?>&amp;act=add"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add file"); ?>" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ </table>
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:"); ?><br />
+ </strong>
+ </span>
+ <?=gettext("Any files that you upload here with the filename prefix of captiveportal- will " .
+ "be made available in the root directory of the captive portal HTTP(S) server. " .
+ "You may reference them directly from your portal page HTML code using relative paths. " .
+ "Example: you've uploaded an image with the name 'captiveportal-test.jpg' using the " .
+ "file manager. Then you can include it in your portal page like this:"); ?>
+ <br /><br />
+ <tt>&lt;img src=&quot;captiveportal-test.jpg&quot; width=... height=...&gt;</tt>
+ <br /><br />
+ <?=gettext("In addition, you can also upload .php files for execution. You can pass the filename " .
+ "to your custom page from the initial page by using text similar to:"); ?>
+ <br /><br />
+ <tt>&lt;a href="/captiveportal-aup.php?zone=$PORTAL_ZONE$&amp;redirurl=$PORTAL_REDIRURL$"&gt;<?=gettext("Acceptable usage policy"); ?>&lt;/a&gt;</tt>
+ <br /><br />
+ <?php printf(gettext("The total size limit for all files is %s."), format_bytes($g['captiveportal_element_sizelimit']));?>
+ </span>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_hostname.php b/src/usr/local/www/services_captiveportal_hostname.php
new file mode 100644
index 0000000..939fb23
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_hostname.php
@@ -0,0 +1,232 @@
+<?php
+/*
+ services_captiveportal_hostname.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2011 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2004 Dinesh Nair <dinesh@alphaque.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ipfw
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-allowedhostnames
+##|*NAME=Services: Captive portal: Allowed Hostnames page
+##|*DESCR=Allow access to the 'Services: Captive portal: Allowed Hostnames' page.
+##|*MATCH=services_captiveportal_hostname.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone) || empty($config['captiveportal'][$cpzone])) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+if (isset($cpzone) && !empty($cpzone) && isset($a_cp[$cpzone]['zoneid'])) {
+ $cpzoneid = $a_cp[$cpzone]['zoneid'];
+}
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), $a_cp[$cpzone]['zone']);
+$shortcut_section = "captiveportal";
+
+if ($_GET['act'] == "del" && !empty($cpzone) && isset($cpzoneid)) {
+ $a_allowedhostnames =& $a_cp[$cpzone]['allowedhostname'];
+ if ($a_allowedhostnames[$_GET['id']]) {
+ $ipent = $a_allowedhostnames[$_GET['id']];
+
+ if (isset($a_cp[$cpzone]['enable'])) {
+ if (is_ipaddr($ipent['hostname'])) {
+ $ip = $ipent['hostname'];
+ } else {
+ $ip = gethostbyname($ipent['hostname']);
+ }
+ $sn = (is_ipaddrv6($ip)) ? 128 : 32;
+ if (is_ipaddr($ip)) {
+ $ipfw = pfSense_ipfw_getTablestats($cpzoneid, IP_FW_TABLE_XLISTENTRY, 3, $ip);
+ if (is_array($ipfw)) {
+ captiveportal_free_dn_ruleno($ipfw['dnpipe']);
+ pfSense_pipe_action("pipe delete {$ipfw['dnpipe']}");
+ pfSense_pipe_action("pipe delete " . ($ipfw['dnpipe']+1));
+ }
+ pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XDEL, 3, $ip, $sn);
+ pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XDEL, 4, $ip, $sn);
+ }
+ }
+
+ unset($a_allowedhostnames[$_GET['id']]);
+ write_config();
+ captiveportal_allowedhostname_configure();
+ header("Location: services_captiveportal_hostname.php?zone={$cpzone}");
+ exit;
+ }
+}
+
+
+include("head.inc");
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_captiveportal_hostname.php" method="post">
+<input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captiveportal hostname">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed IP Addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed Hostnames"), true, "services_captiveportal_hostname.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+ display_top_tabs($tab_array, true);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main">
+ <tr>
+ <td width="60%" class="listhdrr"><?=gettext("Hostname"); ?></td>
+ <td width="40%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17" height="17"></td>
+ <td>
+ <a href="services_captiveportal_hostname_edit.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add address"); ?>" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if (is_array($a_cp[$cpzone]['allowedhostname'])):
+ $i = 0;
+ foreach ($a_cp[$cpzone]['allowedhostname'] as $ip):
+?>
+ <tr ondblclick="document.location='services_captiveportal_hostname_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>'">
+ <td class="listlr">
+<?php
+ if ($ip['dir'] == "to") {
+ echo "any <img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"in\" /> ";
+ }
+ if ($ip['dir'] == "both") {
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_pass.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"pass\" /> ";
+ }
+ echo strtolower($ip['hostname']);
+ if ($ip['dir'] == "from") {
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"in\" /> any";
+ }
+?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($ip['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_captiveportal_hostname_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit address"); ?>" width="17" height="17" border="0" alt="add" /></a>
+ &nbsp;<a href="services_captiveportal_hostname.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this address?"); ?>')"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete address"); ?>" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="2">&nbsp;</td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17" height="17"></td>
+ <td>
+ <a href="services_captiveportal_hostname_edit.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add address"); ?>" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list">
+ <p class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:"); ?><br />
+ </strong>
+ </span>
+ <?=gettext("Adding allowed Hostnames will allow a DNS hostname access to/from access through the captive portal without being taken to the portal page. This can be used for a web server serving images for the portal page or a DNS server on another network, for example. By specifying <em>from</em> addresses, it may be used to always allow pass-through access from a client behind the captive portal."); ?>
+ </p>
+ <table border="0" cellspacing="0" cellpadding="0" summary="icons">
+ <tr>
+ <td>
+ <span class="vexpl"><?=gettext("any"); ?> <img src="/themes/<?=$g['theme'];?>/images/icons/icon_in.gif" width="11" height="11" align="middle" alt="in" /> x.x.x.x </span>
+ </td>
+ <td>
+ <span class="vexpl"><?=gettext("All connections"); ?> <strong><?=gettext("to"); ?></strong> <?=gettext("the Hostname are allowed"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="5" height="4"></td>
+ </tr>
+ <tr>
+ <td>x.x.x.x <span class="vexpl"><img src="/themes/<?=$g['theme'];?>/images/icons/icon_in.gif" width="11" height="11" align="middle" alt="in" /></span> <?=gettext("any"); ?>&nbsp;&nbsp;&nbsp; </td>
+ <td><span class="vexpl"><?=gettext("All connections"); ?> <strong><?=gettext("from"); ?></strong> <?=gettext("the Hostname are allowed"); ?> </span></td>
+ </tr>
+ <tr>
+ <td><span class="vexpl"><img src="/themes/<?=$g['theme'];?>/images/icons/icon_pass.gif" width="11" height="11" align="right" alt="pass" /></span>&nbsp;&nbsp;&nbsp;&nbsp; </td>
+ <td><span class="vexpl"> All connections <strong>to</strong> and <strong>from</strong> the Hostname are allowed </span></td>
+ </tr>
+ </table>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_hostname_edit.php b/src/usr/local/www/services_captiveportal_hostname_edit.php
new file mode 100644
index 0000000..674e220
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_hostname_edit.php
@@ -0,0 +1,244 @@
+<?php
+/*
+ services_captiveportal_hostname_edit.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2011 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2004 Dinesh Nair <dinesh@alphaque.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ipfw
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-editallowedhostnames
+##|*NAME=Services: Captive portal: Edit Allowed Hostnames page
+##|*DESCR=Allow access to the 'Services: Captive portal: Edit Allowed Hostnames' page.
+##|*MATCH=services_captiveportal_hostname_edit.php*
+##|-PRIV
+
+function allowedhostnamescmp($a, $b) {
+ return strcmp($a['hostname'], $b['hostname']);
+}
+
+function allowedhostnames_sort() {
+ global $g, $config, $cpzone;
+ usort($config['captiveportal'][$cpzone]['allowedhostname'], "allowedhostnamescmp");
+}
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+global $cpzone, $cpzoneid;
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), gettext("Edit allowed Hostname"));
+$shortcut_section = "captiveportal";
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+$cpzoneid = $config['captiveportal'][$cpzone]['zoneid'];
+
+if (empty($cpzone) || empty($config['captiveportal'][$cpzone])) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (!is_array($a_cp[$cpzone]['allowedhostname'])) {
+ $a_cp[$cpzone]['allowedhostname'] = array();
+}
+$a_allowedhostnames = &$a_cp[$cpzone]['allowedhostname'];
+
+if (isset($id) && $a_allowedhostnames[$id]) {
+ $pconfig['zone'] = $a_allowedhostnames[$id]['zone'];
+ $pconfig['hostname'] = $a_allowedhostnames[$id]['hostname'];
+ $pconfig['sn'] = $a_allowedhostnames[$id]['sn'];
+ $pconfig['dir'] = $a_allowedhostnames[$id]['dir'];
+ $pconfig['bw_up'] = $a_allowedhostnames[$id]['bw_up'];
+ $pconfig['bw_down'] = $a_allowedhostnames[$id]['bw_down'];
+ $pconfig['descr'] = $a_allowedhostnames[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "hostname");
+ $reqdfieldsn = array(gettext("Allowed Hostname"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_POST['hostname'] && !is_hostname($_POST['hostname']))) {
+ $input_errors[] = sprintf(gettext("A valid Hostname must be specified. [%s]"), $_POST['hostname']);
+ }
+
+ if ($_POST['bw_up'] && !is_numeric($_POST['bw_up'])) {
+ $input_errors[] = gettext("Upload speed needs to be an integer");
+ }
+ if ($_POST['bw_down'] && !is_numeric($_POST['bw_down'])) {
+ $input_errors[] = gettext("Download speed needs to be an integer");
+ }
+
+ foreach ($a_allowedhostnames as $ipent) {
+ if (isset($id) && ($a_allowedhostnames[$id]) && ($a_allowedhostnames[$id] === $ipent)) {
+ continue;
+ }
+
+ if ($ipent['hostname'] == $_POST['hostname']) {
+ $input_errors[] = sprintf("[%s] %s.", $_POST['hostname'], gettext("already allowed")) ;
+ break ;
+ }
+ }
+
+ if (!$input_errors) {
+ $ip = array();
+ $ip['hostname'] = $_POST['hostname'];
+ $ip['sn'] = $_POST['sn'];
+ $ip['dir'] = $_POST['dir'];
+ $ip['descr'] = $_POST['descr'];
+ if ($_POST['bw_up']) {
+ $ip['bw_up'] = $_POST['bw_up'];
+ }
+ if ($_POST['bw_down']) {
+ $ip['bw_down'] = $_POST['bw_down'];
+ }
+ if (isset($id) && $a_allowedhostnames[$id]) {
+ $a_allowedhostnames[$id] = $ip;
+ } else {
+ $a_allowedhostnames[] = $ip;
+ }
+
+ allowedhostnames_sort();
+
+ write_config();
+
+ $rules = captiveportal_allowedhostname_configure();
+ @file_put_contents("{$g['tmp_path']}/hostname_rules", $rules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} {$g['tmp_path']}/hostname_rules", true);
+ unset($rules);
+
+ header("Location: services_captiveportal_hostname.php?zone={$cpzone}");
+ exit;
+ }
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="services_captiveportal_hostname_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="captiveportal hostname edit">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Direction"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="dir" class="formfld">
+ <?php
+ $dirs = array(gettext("Both"), gettext("From"), gettext("To")) ;
+ foreach ($dirs as $dir):
+ ?>
+ <option value="<?=strtolower($dir);?>" <?php if (strtolower($dir) == strtolower($pconfig['dir'])) echo "selected=\"selected\"";?> >
+ <?=htmlspecialchars($dir);?>
+ </option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Use"); ?> <em><?=gettext("From"); ?></em> <?=gettext("to always allow an Hostname through the captive portal (without authentication)"); ?>.
+ <?=gettext("Use"); ?> <em><?=gettext("To"); ?></em> <?=gettext("to allow access from all clients (even non-authenticated ones) behind the portal to this Hostname"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="hostname" type="text" class="formfld unknown" id="hostname" size="17" value="<?=htmlspecialchars($pconfig['hostname']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Hostname");?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth up"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="bw_up" type="text" class="formfld unknown" id="bw_up" size="10" value="<?=htmlspecialchars($pconfig['bw_up']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter a upload limit to be enforced on this Hostname in Kbit/s"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth down"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="bw_down" type="text" class="formfld unknown" id="bw_down" size="10" value="<?=htmlspecialchars($pconfig['bw_down']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter a download limit to be enforced on this Hostname in Kbit/s"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
+ <?php if (isset($id) && $a_allowedhostnames[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_ip.php b/src/usr/local/www/services_captiveportal_ip.php
new file mode 100644
index 0000000..c475aeb
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_ip.php
@@ -0,0 +1,208 @@
+<?php
+/*
+ services_captiveportal_ip.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004 Dinesh Nair <dinesh@alphaque.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ipfw
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-allowedips
+##|*NAME=Services: Captive portal: Allowed IPs page
+##|*DESCR=Allow access to the 'Services: Captive portal: Allowed IPs' page.
+##|*MATCH=services_captiveportal_ip.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone) || empty($config['captiveportal'][$cpzone])) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+if (isset($cpzone) && !empty($cpzone) && isset($a_cp[$cpzone]['zoneid'])) {
+ $cpzoneid = $a_cp[$cpzone]['zoneid'];
+}
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), $a_cp[$cpzone]['zone']);
+$shortcut_section = "captiveportal";
+
+if ($_GET['act'] == "del" && !empty($cpzone) && isset($cpzoneid)) {
+ $a_allowedips =& $config['captiveportal'][$cpzone]['allowedip'];
+ if ($a_allowedips[$_GET['id']]) {
+ $ipent = $a_allowedips[$_GET['id']];
+
+ if (isset($config['captiveportal'][$cpzone]['enable'])) {
+ $mask = (!empty($ipent['sn'])) ? $ipent['sn'] : 32;
+
+ $ipfw = pfSense_ipfw_getTablestats($cpzoneid, IP_FW_TABLE_XLISTENTRY, 3, $ipent['ip']);
+ pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XDEL, 3, $ipent['ip'], $mask);
+ pfSense_ipfw_Tableaction($cpzoneid, IP_FW_TABLE_XDEL, 4, $ipent['ip'], $mask);
+
+ if (is_array($ipfw)) {
+ captiveportal_free_dn_ruleno($ipfw['dnpipe']);
+ pfSense_pipe_action("pipe delete {$ipfw['dnpipe']}");
+ pfSense_pipe_action("pipe delete " . ($ipfw['dnpipe']+1));
+ }
+ }
+
+ unset($a_allowedips[$_GET['id']]);
+ write_config();
+ header("Location: services_captiveportal_ip.php?zone={$cpzone}");
+ exit;
+ }
+}
+
+
+include("head.inc");
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_captiveportal_ip.php" method="post">
+ <input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
+ <?php if ($savemsg) print_info_box($savemsg); ?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captiveportal ip addresses">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed IP addresses"), true, "services_captiveportal_ip.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+ display_top_tabs($tab_array, true);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main">
+ <tr>
+ <td width="40%" class="listhdrr"><?=gettext("IP address"); ?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17" height="17"></td>
+ <td>
+ <a href="services_captiveportal_ip_edit.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add address"); ?>" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if (is_array($a_cp[$cpzone]['allowedip'])):
+ $i = 0;
+ foreach ($a_cp[$cpzone]['allowedip'] as $ip):
+?>
+ <tr ondblclick="document.location='services_captiveportal_ip_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>'">
+ <td class="listlr">
+<?php
+ if ($ip['dir'] == "to") {
+ echo "any <img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"in\" /> ";
+ }
+ if ($ip['dir'] == "both") {
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_pass.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"pass\" /> ";
+ }
+ echo strtolower($ip['ip']);
+ if ($ip['sn'] != "32" && is_numeric($ip['sn'])) {
+ $sn = $ip['sn'];
+ echo "/$sn";
+ }
+ if ($ip['dir'] == "from") {
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_in.gif\" width=\"11\" height=\"11\" align=\"middle\" alt=\"any\" /> any";
+ }
+?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($ip['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_captiveportal_ip_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit address"); ?>" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;
+ <a href="services_captiveportal_ip.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this address?"); ?>')"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete address"); ?>" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="2">&nbsp;</td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17" height="17"></td>
+ <td>
+ <a href="services_captiveportal_ip_edit.php?zone=<?=$cpzone;?>"><img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add address"); ?>" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list">
+ <p class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:"); ?><br />
+ </strong>
+ </span>
+ <?=gettext("Adding allowed IP addresses will allow IP access to/from these addresses through the captive portal without being taken to the portal page. This can be used for a web server serving images for the portal page or a DNS server on another network, for example."); ?>
+ </p>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_ip_edit.php b/src/usr/local/www/services_captiveportal_ip_edit.php
new file mode 100644
index 0000000..c5e5544
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_ip_edit.php
@@ -0,0 +1,253 @@
+<?php
+/*
+ services_captiveportal_ip_edit.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2011 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2004 Dinesh Nair <dinesh@alphaque.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/ipfw
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-editallowedips
+##|*NAME=Services: Captive portal: Edit Allowed IPs page
+##|*DESCR=Allow access to the 'Services: Captive portal: Edit Allowed IPs' page.
+##|*MATCH=services_captiveportal_ip_edit.php*
+##|-PRIV
+
+function allowedipscmp($a, $b) {
+ return strcmp($a['ip'], $b['ip']);
+}
+
+function allowedips_sort() {
+ global $g, $config, $cpzone;
+
+ usort($config['captiveportal'][$cpzone]['allowedip'], "allowedipscmp");
+}
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), gettext("Edit allowed IP address"));
+$shortcut_section = "captiveportal";
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone) || empty($config['captiveportal'][$cpzone])) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (!is_array($config['captiveportal'][$cpzone]['allowedip'])) {
+ $config['captiveportal'][$cpzone]['allowedip'] = array();
+}
+$a_allowedips =& $config['captiveportal'][$cpzone]['allowedip'];
+
+if (isset($id) && $a_allowedips[$id]) {
+ $pconfig['ip'] = $a_allowedips[$id]['ip'];
+ $pconfig['sn'] = $a_allowedips[$id]['sn'];
+ $pconfig['bw_up'] = $a_allowedips[$id]['bw_up'];
+ $pconfig['bw_down'] = $a_allowedips[$id]['bw_down'];
+ $pconfig['descr'] = $a_allowedips[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "ip sn");
+ $reqdfieldsn = array(gettext("Allowed IP address"), gettext("Subnet mask"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['ip'] && !is_ipaddr($_POST['ip'])) {
+ $input_errors[] = sprintf(gettext("A valid IP address must be specified. [%s]"), $_POST['ip']);
+ }
+
+ if ($_POST['sn'] && (!is_numeric($_POST['sn']) || ($_POST['sn'] < 1) || ($_POST['sn'] > 32))) {
+ $input_errors[] = gettext("A valid subnet mask must be specified");
+ }
+
+ if ($_POST['bw_up'] && !is_numeric($_POST['bw_up'])) {
+ $input_errors[] = gettext("Upload speed needs to be an integer");
+ }
+
+ if ($_POST['bw_down'] && !is_numeric($_POST['bw_down'])) {
+ $input_errors[] = gettext("Download speed needs to be an integer");
+ }
+
+ foreach ($a_allowedips as $ipent) {
+ if (isset($id) && ($a_allowedips[$id]) && ($a_allowedips[$id] === $ipent)) {
+ continue;
+ }
+
+ if ($ipent['ip'] == $_POST['ip']) {
+ $input_errors[] = sprintf("[%s] %s.", $_POST['ip'], gettext("already allowed")) ;
+ break ;
+ }
+ }
+
+ if (!$input_errors) {
+ $ip = array();
+ $ip['ip'] = $_POST['ip'];
+ $ip['sn'] = $_POST['sn'];
+ $ip['descr'] = $_POST['descr'];
+ if ($_POST['bw_up']) {
+ $ip['bw_up'] = $_POST['bw_up'];
+ }
+ if ($_POST['bw_down']) {
+ $ip['bw_down'] = $_POST['bw_down'];
+ }
+ if (isset($id) && $a_allowedips[$id]) {
+ $oldip = $a_allowedips[$id]['ip'];
+ if (!empty($a_allowedips[$id]['sn'])) {
+ $oldmask = $a_allowedips[$id]['sn'];
+ } else {
+ $oldmask = 32;
+ }
+ $a_allowedips[$id] = $ip;
+ } else {
+ $a_allowedips[] = $ip;
+ }
+ allowedips_sort();
+
+ write_config();
+
+ if (isset($a_cp[$cpzone]['enable']) && is_module_loaded("ipfw.ko")) {
+ $rules = "";
+ $cpzoneid = $a_cp[$cpzone]['zoneid'];
+ unset($ipfw);
+ if (isset($oldip) && isset($oldmask)) {
+ $ipfw = pfSense_ipfw_getTablestats($cpzoneid, IP_FW_TABLE_XLISTENTRY, 3, $oldip);
+ $rules .= "table 3 delete {$oldip}/{$oldmask}\n";
+ $rules .= "table 4 delete {$oldip}/{$oldmask}\n";
+ if (is_array($ipfw)) {
+ $rules .= "pipe delete {$ipfw['dnpipe']}\n";
+ $rules .= "pipe delete " . ($ipfw['dnpipe']+1 . "\n");
+ }
+ }
+ $rules .= captiveportal_allowedip_configure_entry($ip);
+ if (is_array($ipfw)) {
+ captiveportal_free_dn_ruleno($ipfw['dnpipe']);
+ }
+ $uniqid = uniqid("{$cpzone}_allowed");
+ @file_put_contents("{$g['tmp_path']}/{$uniqid}_tmp", $rules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} -q {$g['tmp_path']}/{$uniqid}_tmp");
+ @unlink("{$g['tmp_path']}/{$uniqid}_tmp");
+ }
+
+ header("Location: services_captiveportal_ip.php?zone={$cpzone}");
+ exit;
+ }
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="services_captiveportal_ip_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="captiveportal allow ip edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit allowed ip rule");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="ip" type="text" class="formfld unknown" id="ip" size="17" value="<?=htmlspecialchars($pconfig['ip']);?>" />
+ /<select name='sn' class="formselect" id='sn'>
+ <?php for ($i = 32; $i >= 1; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['sn']) echo "selected=\"selected\""; ?>><?=$i;?></option>
+ <?php endfor; ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("IP address and subnet mask. Use /32 for a single IP");?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth up"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="bw_up" type="text" class="formfld unknown" id="bw_up" size="10" value="<?=htmlspecialchars($pconfig['bw_up']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter a upload limit to be enforced on this IP address in Kbit/s"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth down"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="bw_down" type="text" class="formfld unknown" id="bw_down" size="10" value="<?=htmlspecialchars($pconfig['bw_down']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter a download limit to be enforced on this IP address in Kbit/s"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
+ <?php if (isset($id) && $a_allowedips[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_mac.php b/src/usr/local/www/services_captiveportal_mac.php
new file mode 100644
index 0000000..d6c1af3
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_mac.php
@@ -0,0 +1,244 @@
+<?php
+/*
+ services_captiveportal_mac.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004 Dinesh Nair <dinesh@alphaque.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-macaddresses
+##|*NAME=Services: Captive portal: Mac Addresses page
+##|*DESCR=Allow access to the 'Services: Captive portal: Mac Addresses' page.
+##|*MATCH=services_captiveportal_mac.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+global $cpzone;
+global $cpzoneid;
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone) || empty($config['captiveportal'][$cpzone])) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), $a_cp[$cpzone]['zone']);
+$shortcut_section = "captiveportal";
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = 0;
+
+ if (is_array($a_cp[$cpzone]['passthrumac'])) {
+ $cpzoneid = $a_cp[$cpzone]['cpzoneid'];
+ $rules = captiveportal_passthrumac_configure();
+ if (!empty($rules)) {
+ @file_put_contents("{$g['tmp_path']}/passthrumac_gui", $rules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} {$g['tmp_path']}/passthrumac_gui");
+ @unlink("{$g['tmp_path']}/passthrumac_gui");
+ }
+ $savemsg = get_std_save_message($retval);
+ if ($retval == 0) {
+ clear_subsystem_dirty('passthrumac');
+ }
+ }
+ }
+
+ if ($_POST['postafterlogin']) {
+ if (!is_array($a_passthrumacs)) {
+ echo gettext("No entry exists yet!") ."\n";
+ exit;
+ }
+ if (empty($_POST['zone'])) {
+ echo gettext("Please set the zone on which the operation should be allowed");
+ exit;
+ }
+ if (!is_array($a_cp[$cpzone]['passthrumac'])) {
+ $a_cp[$cpzone]['passthrumac'] = array();
+ }
+ $a_passthrumacs =& $a_cp[$cpzone]['passthrumac'];
+
+ if ($_POST['username']) {
+ $mac = captiveportal_passthrumac_findbyname($_POST['username']);
+ if (!empty($mac)) {
+ $_POST['delmac'] = $mac['mac'];
+ } else {
+ echo gettext("No entry exists for this username:") . " " . $_POST['username'] . "\n";
+ }
+ }
+ if ($_POST['delmac']) {
+ $found = false;
+ foreach ($a_passthrumacs as $idx => $macent) {
+ if ($macent['mac'] == $_POST['delmac']) {
+ $found = true;
+ break;
+ }
+ }
+ if ($found == true) {
+ $cpzoneid = $a_cp[$cpzone]['zoneid'];
+ $rules = captiveportal_passthrumac_delete_entry($a_passthrumacs[$idx]);
+ $uniqid = uniqid("{$cpzone}_mac");
+ file_put_contents("{$g['tmp_path']}/{$uniqid}_tmp", $rules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} -q {$g['tmp_path']}/{$uniqid}_tmp");
+ @unlink("{$g['tmp_path']}/{$uniqid}_tmp");
+ unset($a_passthrumacs[$idx]);
+ write_config();
+ echo gettext("The entry was successfully deleted") . "\n";
+ } else {
+ echo gettext("No entry exists for this mac address:") . " " . $_POST['delmac'] . "\n";
+ }
+ }
+ exit;
+ }
+}
+
+if ($_GET['act'] == "del") {
+ $a_passthrumacs =& $a_cp[$cpzone]['passthrumac'];
+ if ($a_passthrumacs[$_GET['id']]) {
+ $cpzoneid = $a_cp[$cpzone]['zoneid'];
+ $rules = captiveportal_passthrumac_delete_entry($a_passthrumacs[$_GET['id']]);
+ $uniqid = uniqid("{$cpzone}_mac");
+ file_put_contents("{$g['tmp_path']}/{$uniqid}_tmp", $rules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} -q {$g['tmp_path']}/{$uniqid}_tmp");
+ @unlink("{$g['tmp_path']}/{$uniqid}_tmp");
+ unset($a_passthrumacs[$_GET['id']]);
+ write_config();
+ header("Location: services_captiveportal_mac.php?zone={$cpzone}");
+ exit;
+ }
+}
+
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_captiveportal_mac.php" method="post">
+<input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('passthrumac')): ?><p>
+<?php print_info_box_np(gettext("The captive portal MAC address configuration has been changed.<br />You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="captiveportal mac">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("MAC"), true, "services_captiveportal_mac.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Vouchers"), false, "services_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+ display_top_tabs($tab_array, true);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main">
+ <tr>
+ <td width="3%" class="list"></td>
+ <td width="37%" class="listhdrr"><?=gettext("MAC address"); ?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+<?php
+ if (is_array($a_cp[$cpzone]['passthrumac'])):
+ $i = 0;
+ foreach ($a_cp[$cpzone]['passthrumac'] as $mac):
+?>
+ <tr ondblclick="document.location='services_captiveportal_mac_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>'">
+ <td valign="middle" class="list nowrap">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$mac['action'];?>.gif" width="11" height="11" border="0" alt="icon" />
+ </td>
+ <td class="listlr">
+ <?=$mac['mac'];?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($mac['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_captiveportal_mac_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i;?>">
+ <img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit host"); ?>" width="17" height="17" border="0" alt="edit" />
+ </a>
+ &nbsp;
+ <a href="services_captiveportal_mac.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this host?"); ?>')">
+ <img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete host"); ?>" width="17" height="17" border="0" alt="delte" />
+ </a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="3">&nbsp;</td>
+ <td class="list">
+ <a href="services_captiveportal_mac_edit.php?zone=<?=$cpzone;?>">
+ <img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add host"); ?>" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3" class="list">
+ <span class="vexpl">
+ <span class="red"><strong><?=gettext("Note:"); ?><br /></strong></span>
+ <?=gettext("Adding MAC addresses as 'pass' MACs allows them access through the captive portal automatically without being taken to the portal page."); ?>
+ </span>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_mac_edit.php b/src/usr/local/www/services_captiveportal_mac_edit.php
new file mode 100644
index 0000000..191c9bb
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_mac_edit.php
@@ -0,0 +1,270 @@
+<?php
+/*
+ services_captiveportal_mac_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004 Dinesh Nair <dinesh@alphaque.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-editmacaddresses
+##|*NAME=Services: Captive portal: Edit MAC Addresses page
+##|*DESCR=Allow access to the 'Services: Captive portal: Edit MAC Addresses' page.
+##|*MATCH=services_captiveportal_mac_edit.php*
+##|-PRIV
+
+function passthrumacscmp($a, $b) {
+ return strcmp($a['mac'], $b['mac']);
+}
+
+function passthrumacs_sort() {
+ global $config, $cpzone;
+
+ usort($config['captiveportal'][$cpzone]['passthrumac'], "passthrumacscmp");
+}
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+global $cpzone;
+global $cpzoneid;
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), gettext("Edit MAC address rules"));
+$shortcut_section = "captiveportal";
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone) || empty($config['captiveportal'][$cpzone])) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (!is_array($a_cp[$cpzone]['passthrumac'])) {
+ $a_cp[$cpzone]['passthrumac'] = array();
+}
+$a_passthrumacs = &$a_cp[$cpzone]['passthrumac'];
+
+if (isset($id) && $a_passthrumacs[$id]) {
+ $pconfig['action'] = $a_passthrumacs[$id]['action'];
+ $pconfig['mac'] = $a_passthrumacs[$id]['mac'];
+ $pconfig['bw_up'] = $a_passthrumacs[$id]['bw_up'];
+ $pconfig['bw_down'] = $a_passthrumacs[$id]['bw_down'];
+ $pconfig['descr'] = $a_passthrumacs[$id]['descr'];
+ $pconfig['username'] = $a_passthrumacs[$id]['username'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "action mac");
+ $reqdfieldsn = array(gettext("Action"), gettext("MAC address"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ $_POST['mac'] = strtolower(str_replace("-", ":", $_POST['mac']));
+
+ if ($_POST['mac']) {
+ if (is_macaddr($_POST['mac'])) {
+ $iflist = get_interface_list();
+ foreach ($iflist as $if) {
+ if ($_POST['mac'] == strtolower($if['mac'])) {
+ $input_errors[] = sprintf(gettext("The MAC address %s belongs to a local interface, you cannot use it here."), $_POST['mac']);
+ break;
+ }
+ }
+ } else {
+ $input_errors[] = sprintf("%s. [%s]", gettext("A valid MAC address must be specified"), $_POST['mac']);
+ }
+ }
+ if ($_POST['bw_up'] && !is_numeric($_POST['bw_up'])) {
+ $input_errors[] = gettext("Upload speed needs to be an integer");
+ }
+ if ($_POST['bw_down'] && !is_numeric($_POST['bw_down'])) {
+ $input_errors[] = gettext("Download speed needs to be an integer");
+ }
+
+ foreach ($a_passthrumacs as $macent) {
+ if (isset($id) && ($a_passthrumacs[$id]) && ($a_passthrumacs[$id] === $macent)) {
+ continue;
+ }
+
+ if ($macent['mac'] == $_POST['mac']) {
+ $input_errors[] = sprintf("[%s] %s.", $_POST['mac'], gettext("already exists"));
+ break;
+ }
+ }
+
+ if (!$input_errors) {
+ $mac = array();
+ $mac['action'] = $_POST['action'];
+ $mac['mac'] = $_POST['mac'];
+ if ($_POST['bw_up']) {
+ $mac['bw_up'] = $_POST['bw_up'];
+ }
+ if ($_POST['bw_down']) {
+ $mac['bw_down'] = $_POST['bw_down'];
+ }
+ if ($_POST['username']) {
+ $mac['username'] = $_POST['username'];
+ }
+
+ $mac['descr'] = $_POST['descr'];
+
+ if (isset($id) && $a_passthrumacs[$id]) {
+ $oldmac = $a_passthrumacs[$id];
+ $a_passthrumacs[$id] = $mac;
+ } else {
+ $oldmac = $mac;
+ $a_passthrumacs[] = $mac;
+ }
+ passthrumacs_sort();
+
+ write_config();
+
+ if (isset($config['captiveportal'][$cpzone]['enable'])) {
+ $cpzoneid = $config['captiveportal'][$cpzone]['zoneid'];
+ $rules = captiveportal_passthrumac_delete_entry($oldmac);
+ $rules .= captiveportal_passthrumac_configure_entry($mac);
+ $uniqid = uniqid("{$cpzone}_macedit");
+ file_put_contents("{$g['tmp_path']}/{$uniqid}_tmp", $rules);
+ mwexec("/sbin/ipfw -x {$cpzoneid} -q {$g['tmp_path']}/{$uniqid}_tmp");
+ @unlink("{$g['tmp_path']}/{$uniqid}_tmp");
+ unset($cpzoneid);
+ }
+
+ header("Location: services_captiveportal_mac.php?zone={$cpzone}");
+ exit;
+ }
+}
+include("head.inc");
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="services_captiveportal_mac_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="captiveportal mac edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit MAC address rules");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Action"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="action" class="formselect">
+<?php
+ $actions = explode(" ", "Pass Block");
+ foreach ($actions as $action):
+?>
+ <option value="<?=strtolower($action);?>"<?php if (strtolower($action) == strtolower($pconfig['action'])) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($action);?>
+ </option>
+<?php
+ endforeach;
+?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Choose what to do with packets coming from this MAC address"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("MAC address"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="mac" type="text" class="formfld unknown" id="mac" size="17" value="<?=htmlspecialchars($pconfig['mac']);?>" />
+<?php
+ $ip = getenv('REMOTE_ADDR');
+ $mac = `/usr/sbin/arp -an | grep {$ip} | cut -d" " -f4`;
+ $mac = str_replace("\n", "", $mac);
+?>
+ <a onclick="document.forms[0].mac.value='<?=$mac?>';" href="#"><?=gettext("Copy my MAC address");?></a>
+ <br />
+ <span class="vexpl"><?=gettext("MAC address (6 hex octets separated by colons)"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth up"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="bw_up" type="text" class="formfld unknown" id="bw_up" size="10" value="<?=htmlspecialchars($pconfig['bw_up']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter a upload limit to be enforced on this MAC address in Kbit/s"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bandwidth down"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="bw_down" type="text" class="formfld unknown" id="bw_down" size="10" value="<?=htmlspecialchars($pconfig['bw_down']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter a download limit to be enforced on this MAC address in Kbit/s"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
+ <?php if (isset($id) && $a_passthrumacs[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ <?php if (isset($pconfig['username']) && $pconfig['username']): ?>
+ <input name="username" type="hidden" value="<?=htmlspecialchars($pconfig['username']);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_vouchers.php b/src/usr/local/www/services_captiveportal_vouchers.php
new file mode 100644
index 0000000..0bc7dae
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_vouchers.php
@@ -0,0 +1,715 @@
+<?php
+/*
+ services_captiveportal_vouchers.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2007 Marcel Wiget <mwiget@mac.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/local/bin/voucher /usr/bin/openssl
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-vouchers
+##|*NAME=Services: Captive portal Vouchers page
+##|*DESCR=Allow access to the 'Services: Captive portal Vouchers' page.
+##|*MATCH=services_captiveportal_vouchers.php*
+##|-PRIV
+
+if ($_POST['postafterlogin']) {
+ $nocsrf= true;
+}
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+require_once("voucher.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_captiveportal_vouchers.php');
+}
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone)) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if ($_REQUEST['generatekey']) {
+ exec("/usr/bin/openssl genrsa 64 > /tmp/key64.private");
+ exec("/usr/bin/openssl rsa -pubout < /tmp/key64.private > /tmp/key64.public");
+ $privatekey = str_replace("\n", "\\n", file_get_contents("/tmp/key64.private"));
+ $publickey = str_replace("\n", "\\n", file_get_contents("/tmp/key64.public"));
+ exec("rm /tmp/key64.private /tmp/key64.public");
+ $alertmessage = gettext("You will need to recreate any existing Voucher Rolls due to the public and private key changes. Click cancel if you do not wish to recreate the vouchers.");
+ echo <<<EOF
+ jQuery('#publickey').val('{$publickey}');
+ jQuery('#privatekey').val('{$privatekey}');
+ alert('{$alertmessage}');
+ jQuery('#publickey').effect('highlight');
+ jQuery('#privatekey').effect('highlight');
+EOF;
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+if (!is_array($config['voucher'])) {
+ $config['voucher'] = array();
+}
+
+if (empty($a_cp[$cpzone])) {
+ log_error("Submission on captiveportal page with unknown zone parameter: " . htmlspecialchars($cpzone));
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), gettext("Vouchers"), $a_cp[$cpzone]['zone']);
+$shortcut_section = "captiveportal-vouchers";
+
+if (!is_array($config['voucher'][$cpzone]['roll'])) {
+ $config['voucher'][$cpzone]['roll'] = array();
+}
+if (!isset($config['voucher'][$cpzone]['charset'])) {
+ $config['voucher'][$cpzone]['charset'] = '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
+}
+if (!isset($config['voucher'][$cpzone]['rollbits'])) {
+ $config['voucher'][$cpzone]['rollbits'] = 16;
+}
+if (!isset($config['voucher'][$cpzone]['ticketbits'])) {
+ $config['voucher'][$cpzone]['ticketbits'] = 10;
+}
+if (!isset($config['voucher'][$cpzone]['checksumbits'])) {
+ $config['voucher'][$cpzone]['checksumbits'] = 5;
+}
+if (!isset($config['voucher'][$cpzone]['magic'])) {
+ $config['voucher'][$cpzone]['magic'] = rand(); // anything slightly random will do
+}
+if (!isset($config['voucher'][$cpzone]['exponent'])) {
+ while (true) {
+ while (($exponent = rand()) % 30000 < 5000) {
+ continue;
+ }
+ $exponent = ($exponent * 2) + 1; // Make it odd number
+ if ($exponent <= 65537) {
+ break;
+ }
+ }
+ $config['voucher'][$cpzone]['exponent'] = $exponent;
+ unset($exponent);
+}
+
+if (!isset($config['voucher'][$cpzone]['publickey'])) {
+ /* generate a random 64 bit RSA key pair using the voucher binary */
+ $fd = popen("/usr/local/bin/voucher -g 64 -e " . $config['voucher'][$cpzone]['exponent'], "r");
+ if ($fd !== false) {
+ $output = fread($fd, 16384);
+ pclose($fd);
+ list($privkey, $pubkey) = explode("\0", $output);
+ $config['voucher'][$cpzone]['publickey'] = base64_encode($pubkey);
+ $config['voucher'][$cpzone]['privatekey'] = base64_encode($privkey);
+ }
+}
+
+// Check for invalid or expired vouchers
+if (!isset($config['voucher'][$cpzone]['descrmsgnoaccess'])) {
+ $config['voucher'][$cpzone]['descrmsgnoaccess'] = gettext("Voucher invalid");
+}
+if (!isset($config['voucher'][$cpzone]['descrmsgexpired'])) {
+ $config['voucher'][$cpzone]['descrmsgexpired'] = gettext("Voucher expired");
+}
+
+$a_roll = &$config['voucher'][$cpzone]['roll'];
+
+if ($_GET['act'] == "del") {
+ $id = $_GET['id'];
+ if ($a_roll[$id]) {
+ $roll = $a_roll[$id]['number'];
+ $voucherlck = lock("voucher{$cpzone}");
+ unset($a_roll[$id]);
+ voucher_unlink_db($roll);
+ unlock($voucherlck);
+ write_config();
+ }
+ header("Location: services_captiveportal_vouchers.php?zone={$cpzone}");
+ exit;
+} else if ($_GET['act'] == "csv") {
+ /* print all vouchers of the selected roll */
+ $privkey = base64_decode($config['voucher'][$cpzone]['privatekey']);
+ if (strstr($privkey, "BEGIN RSA PRIVATE KEY")) {
+ $fd = fopen("{$g['varetc_path']}/voucher_{$cpzone}.private", "w");
+ if (!$fd) {
+ $input_errors[] = gettext("Cannot write private key file") . ".\n";
+ } else {
+ chmod("{$g['varetc_path']}/voucher_{$cpzone}.private", 0600);
+ fwrite($fd, $privkey);
+ fclose($fd);
+ $a_voucher = &$config['voucher'][$cpzone]['roll'];
+ $id = $_GET['id'];
+ if (isset($id) && $a_voucher[$id]) {
+ $number = $a_voucher[$id]['number'];
+ $count = $a_voucher[$id]['count'];
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename=vouchers_{$cpzone}_roll{$number}.csv");
+ if (file_exists("{$g['varetc_path']}/voucher_{$cpzone}.cfg")) {
+ system("/usr/local/bin/voucher -c {$g['varetc_path']}/voucher_{$cpzone}.cfg -p {$g['varetc_path']}/voucher_{$cpzone}.private $number $count");
+ }
+ @unlink("{$g['varetc_path']}/voucher_{$cpzone}.private");
+ } else {
+ header("Location: services_captiveportal_vouchers.php?zone={$cpzone}");
+ }
+ exit;
+ }
+ } else {
+ $input_errors[] = gettext("Need private RSA key to print vouchers") . "\n";
+ }
+}
+
+$pconfig['enable'] = isset($config['voucher'][$cpzone]['enable']);
+$pconfig['charset'] = $config['voucher'][$cpzone]['charset'];
+$pconfig['rollbits'] = $config['voucher'][$cpzone]['rollbits'];
+$pconfig['ticketbits'] = $config['voucher'][$cpzone]['ticketbits'];
+$pconfig['checksumbits'] = $config['voucher'][$cpzone]['checksumbits'];
+$pconfig['magic'] = $config['voucher'][$cpzone]['magic'];
+$pconfig['exponent'] = $config['voucher'][$cpzone]['exponent'];
+$pconfig['publickey'] = base64_decode($config['voucher'][$cpzone]['publickey']);
+$pconfig['privatekey'] = base64_decode($config['voucher'][$cpzone]['privatekey']);
+$pconfig['msgnoaccess'] = $config['voucher'][$cpzone]['descrmsgnoaccess'];
+$pconfig['msgexpired'] = $config['voucher'][$cpzone]['descrmsgexpired'];
+$pconfig['vouchersyncdbip'] = $config['voucher'][$cpzone]['vouchersyncdbip'];
+$pconfig['vouchersyncport'] = $config['voucher'][$cpzone]['vouchersyncport'];
+$pconfig['vouchersyncpass'] = $config['voucher'][$cpzone]['vouchersyncpass'];
+$pconfig['vouchersyncusername'] = $config['voucher'][$cpzone]['vouchersyncusername'];
+
+if ($_POST) {
+
+ unset($input_errors);
+
+ if ($_POST['postafterlogin']) {
+ voucher_expire($_POST['voucher_expire']);
+ exit;
+ }
+
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['enable'] == "yes") {
+ if (!$_POST['vouchersyncusername']) {
+ $reqdfields = explode(" ", "charset rollbits ticketbits checksumbits publickey magic");
+ $reqdfieldsn = array(gettext("charset"), gettext("rollbits"), gettext("ticketbits"), gettext("checksumbits"), gettext("publickey"), gettext("magic"));
+ } else {
+ $reqdfields = explode(" ", "vouchersyncdbip vouchersyncport vouchersyncpass vouchersyncusername");
+ $reqdfieldsn = array(gettext("Synchronize Voucher Database IP"), gettext("Sync port"), gettext("Sync password"), gettext("Sync username"));
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ }
+
+ if (!$_POST['vouchersyncusername']) {
+ // Check for form errors
+ if ($_POST['charset'] && (strlen($_POST['charset'] < 2))) {
+ $input_errors[] = gettext("Need at least 2 characters to create vouchers.");
+ }
+ if ($_POST['charset'] && (strpos($_POST['charset'], "\"") > 0)) {
+ $input_errors[] = gettext("Double quotes aren't allowed.");
+ }
+ if ($_POST['charset'] && (strpos($_POST['charset'], ",") > 0)) {
+ $input_errors[] = "',' " . gettext("aren't allowed.");
+ }
+ if ($_POST['rollbits'] && (!is_numeric($_POST['rollbits']) || ($_POST['rollbits'] < 1) || ($_POST['rollbits'] > 31))) {
+ $input_errors[] = gettext("# of Bits to store Roll Id needs to be between 1..31.");
+ }
+ if ($_POST['ticketbits'] && (!is_numeric($_POST['ticketbits']) || ($_POST['ticketbits'] < 1) || ($_POST['ticketbits'] > 16))) {
+ $input_errors[] = gettext("# of Bits to store Ticket Id needs to be between 1..16.");
+ }
+ if ($_POST['checksumbits'] && (!is_numeric($_POST['checksumbits']) || ($_POST['checksumbits'] < 1) || ($_POST['checksumbits'] > 31))) {
+ $input_errors[] = gettext("# of Bits to store checksum needs to be between 1..31.");
+ }
+ if ($_POST['publickey'] && (!strstr($_POST['publickey'], "BEGIN PUBLIC KEY"))) {
+ $input_errors[] = gettext("This doesn't look like an RSA Public key.");
+ }
+ if ($_POST['privatekey'] && (!strstr($_POST['privatekey'], "BEGIN RSA PRIVATE KEY"))) {
+ $input_errors[] = gettext("This doesn't look like an RSA Private key.");
+ }
+ if ($_POST['vouchersyncdbip'] && (is_ipaddr_configured($_POST['vouchersyncdbip']))) {
+ $input_errors[] = gettext("You cannot sync the voucher database to this host (itself).");
+ }
+ }
+
+ if (!$input_errors) {
+ if (empty($config['voucher'][$cpzone])) {
+ $newvoucher = array();
+ } else {
+ $newvoucher = $config['voucher'][$cpzone];
+ }
+ if ($_POST['enable'] == "yes") {
+ $newvoucher['enable'] = true;
+ } else {
+ unset($newvoucher['enable']);
+ }
+ if (empty($_POST['vouchersyncusername'])) {
+ unset($newvoucher['vouchersyncdbip']);
+ unset($newvoucher['vouchersyncport']);
+ unset($newvoucher['vouchersyncusername']);
+ unset($newvoucher['vouchersyncpass']);
+ $newvoucher['charset'] = $_POST['charset'];
+ $newvoucher['rollbits'] = $_POST['rollbits'];
+ $newvoucher['ticketbits'] = $_POST['ticketbits'];
+ $newvoucher['checksumbits'] = $_POST['checksumbits'];
+ $newvoucher['magic'] = $_POST['magic'];
+ $newvoucher['exponent'] = $_POST['exponent'];
+ $newvoucher['publickey'] = base64_encode($_POST['publickey']);
+ $newvoucher['privatekey'] = base64_encode($_POST['privatekey']);
+ $newvoucher['descrmsgnoaccess'] = $_POST['msgnoaccess'];
+ $newvoucher['descrmsgexpired'] = $_POST['msgexpired'];
+ $config['voucher'][$cpzone] = $newvoucher;
+ write_config();
+ voucher_configure_zone();
+ } else {
+ $newvoucher['vouchersyncdbip'] = $_POST['vouchersyncdbip'];
+ $newvoucher['vouchersyncport'] = $_POST['vouchersyncport'];
+ $newvoucher['vouchersyncusername'] = $_POST['vouchersyncusername'];
+ $newvoucher['vouchersyncpass'] = $_POST['vouchersyncpass'];
+ if ($newvoucher['vouchersyncpass'] && $newvoucher['vouchersyncusername'] &&
+ $newvoucher['vouchersyncport'] && $newvoucher['vouchersyncdbip']) {
+ // Synchronize the voucher DB from the master node
+ require_once("xmlrpc.inc");
+
+ $protocol = "http";
+ if (is_array($config['system']) && is_array($config['system']['webgui']) && !empty($config['system']['webgui']['protocol']) &&
+ $config['system']['webgui']['protocol'] == "https") {
+ $protocol = "https";
+ }
+ if ($protocol == "https" || $newvoucher['vouchersyncport'] == "443") {
+ $url = "https://{$newvoucher['vouchersyncdbip']}";
+ } else {
+ $url = "http://{$newvoucher['vouchersyncdbip']}";
+ }
+
+ $execcmd = <<<EOF
+ \$toreturn = array();
+ \$toreturn['voucher'] = \$config['voucher']['$cpzone'];
+ unset(\$toreturn['vouchersyncport'], \$toreturn['vouchersyncpass'], \$toreturn['vouchersyncusername'], \$toreturn['vouchersyncdbip']);
+
+EOF;
+
+ /* assemble xmlrpc payload */
+ $params = array(
+ XML_RPC_encode($newvoucher['vouchersyncpass']),
+ XML_RPC_encode($execcmd)
+ );
+ $port = $newvoucher['vouchersyncport'];
+ log_error("voucher XMLRPC sync data {$url}:{$port}.");
+ $msg = new XML_RPC_Message('pfsense.exec_php', $params);
+ $cli = new XML_RPC_Client('/xmlrpc.php', $url, $port);
+ $cli->setCredentials($newvoucher['vouchersyncusername'], $newvoucher['vouchersyncpass']);
+ $resp = $cli->send($msg, "250");
+ if (!is_object($resp)) {
+ $error = "A communications error occurred while attempting CaptivePortalVoucherSync XMLRPC sync with {$url}:{$port} (pfsense.exec_php).";
+ log_error($error);
+ file_notice("CaptivePortalVoucherSync", $error, "Communications error occurred", "");
+ $input_errors[] = $error;
+ } elseif ($resp->faultCode()) {
+ $cli->setDebug(1);
+ $resp = $cli->send($msg, "250");
+ $error = "An error code was received while attempting CaptivePortalVoucherSync XMLRPC sync with {$url}:{$port} - Code " . $resp->faultCode() . ": " . $resp->faultString();
+ log_error($error);
+ file_notice("CaptivePortalVoucherSync", $error, "Error code received", "");
+ $input_errors[] = $error;
+ } else {
+ log_error("The Captive Portal voucher database has been synchronized with {$url}:{$port} (pfsense.exec_php).");
+ }
+ if (!$input_errors) {
+ $toreturn = XML_RPC_Decode($resp->value());
+ if (!is_array($toreturn)) {
+ if ($toreturn == "Authentication failed") {
+ $input_errors[] = "Could not synchronize the voucher database: Authentication Failed.";
+ }
+ } else {
+ // If we received back the voucher roll and other information then store it.
+ if ($toreturn['voucher']['roll']) {
+ $newvoucher['roll'] = $toreturn['voucher']['roll'];
+ }
+ if ($toreturn['voucher']['rollbits']) {
+ $newvoucher['rollbits'] = $toreturn['voucher']['rollbits'];
+ }
+ if ($toreturn['voucher']['ticketbits']) {
+ $newvoucher['ticketbits'] = $toreturn['voucher']['ticketbits'];
+ }
+ if ($toreturn['voucher']['checksumbits']) {
+ $newvoucher['checksumbits'] = $toreturn['voucher']['checksumbits'];
+ }
+ if ($toreturn['voucher']['magic']) {
+ $newvoucher['magic'] = $toreturn['voucher']['magic'];
+ }
+ if ($toreturn['voucher']['exponent']) {
+ $newvoucher['exponent'] = $toreturn['voucher']['exponent'];
+ }
+ if ($toreturn['voucher']['publickey']) {
+ $newvoucher['publickey'] = $toreturn['voucher']['publickey'];
+ }
+ if ($toreturn['voucher']['privatekey']) {
+ $newvoucher['privatekey'] = $toreturn['voucher']['privatekey'];
+ }
+ if ($toreturn['voucher']['descrmsgnoaccess']) {
+ $newvoucher['descrmsgnoaccess'] = $toreturn['voucher']['descrmsgnoaccess'];
+ }
+ if ($toreturn['voucher']['descrmsgexpired']) {
+ $newvoucher['descrmsgexpired'] = $toreturn['voucher']['descrmsgexpired'];
+ }
+ $savemsg = gettext("Voucher database has been synchronized from {$url}:{$port}");
+
+ $config['voucher'][$cpzone] = $newvoucher;
+ write_config();
+ voucher_configure_zone(true);
+ }
+ }
+ }
+ }
+ if (!$input_errors) {
+ header("Location: services_captiveportal_vouchers.php?zone={$cpzone}");
+ exit;
+ }
+ }
+}
+$closehead = false;
+include("head.inc");
+?>
+<script type="text/javascript">
+//<![CDATA[
+function generatenewkey() {
+ jQuery('#publickey').val('One moment please...');
+ jQuery('#privatekey').val('One moment please...');
+ jQuery.ajax("services_captiveportal_vouchers.php?zone=<?php echo($cpzone); ?>&generatekey=true", {
+ type: 'get',
+ success: function(data) {
+ eval(data);
+ }
+ });
+}
+function before_save() {
+ document.iform.charset.disabled = false;
+ document.iform.rollbits.disabled = false;
+ document.iform.ticketbits.disabled = false;
+ document.iform.checksumbits.disabled = false;
+ document.iform.magic.disabled = false;
+ document.iform.publickey.disabled = false;
+ document.iform.privatekey.disabled = false;
+ document.iform.msgnoaccess.disabled = false;
+ document.iform.msgexpired.disabled = false;
+ for (var x = 0; x < <?php echo count($a_roll); ?>; x++) {
+ jQuery('#addeditdelete' + x).show();
+ }
+ jQuery('#addnewroll').show();
+}
+function enable_change(enable_change) {
+ var endis;
+ endis = !(document.iform.enable.checked || enable_change);
+ document.iform.charset.disabled = endis;
+ document.iform.rollbits.disabled = endis;
+ document.iform.ticketbits.disabled = endis;
+ document.iform.checksumbits.disabled = endis;
+ document.iform.magic.disabled = endis;
+ document.iform.publickey.disabled = endis;
+ document.iform.privatekey.disabled = endis;
+ document.iform.msgnoaccess.disabled = endis;
+ document.iform.msgexpired.disabled = endis;
+ document.iform.vouchersyncdbip.disabled = endis;
+ document.iform.vouchersyncport.disabled = endis;
+ document.iform.vouchersyncpass.disabled = endis;
+ document.iform.vouchersyncusername.disabled = endis;
+ if (document.iform.vouchersyncusername.value != "") {
+ document.iform.charset.disabled = true;
+ document.iform.rollbits.disabled = true;
+ document.iform.ticketbits.disabled = true;
+ document.iform.checksumbits.disabled = true;
+ document.iform.magic.disabled = true;
+ document.iform.publickey.disabled = true;
+ document.iform.privatekey.disabled = true;
+ document.iform.msgnoaccess.disabled = true;
+ document.iform.msgexpired.disabled = true;
+ for (var x = 0; x < <?php echo count($a_roll); ?>; x++) {
+ jQuery('#addeditdelete' + x).hide();
+ }
+ jQuery('#addnewroll').hide();
+ } else {
+ for (var x = 0; x < <?php echo count($a_roll); ?>; x++) {
+ jQuery('#addeditdelete' + x).show();
+ }
+ jQuery('#addnewroll').show();
+ }
+}
+//]]>
+</script>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form action="services_captiveportal_vouchers.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Captive portal(s)"), false, "services_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("MAC"), false, "services_captiveportal_mac.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed IP addresses"), false, "services_captiveportal_ip.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Allowed Hostnames"), false, "services_captiveportal_hostname.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Vouchers"), true, "services_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("File Manager"), false, "services_captiveportal_filemanager.php?zone={$cpzone}");
+ display_top_tabs($tab_array, true);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="checkbox pane">
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
+ <strong><?=gettext("Enable Vouchers"); ?></strong>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell">
+ <?=gettext("Voucher Rolls"); ?>
+ <?php
+ if ($pconfig['vouchersyncdbip']) {
+ echo "<br />(Synchronized from {$pconfig['vouchersyncdbip']})";
+ }
+ ?>
+ </td>
+ <td class="vtable">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="content pane">
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Roll"); ?> #</td>
+ <td width="20%" class="listhdrr"><?=gettext("Minutes/Ticket"); ?></td>
+ <td width="20%" class="listhdrr"># <?=gettext("of Tickets"); ?></td>
+ <td width="35%" class="listhdr"><?=gettext("Comment"); ?></td>
+ <td width="15%" class="list"></td>
+ </tr>
+ <?php $i = 0; foreach ($a_roll as $rollent): ?>
+ <tr>
+ <td class="listlr">
+ <?=htmlspecialchars($rollent['number']); ?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($rollent['minutes']);?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($rollent['count']);?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($rollent['descr']); ?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <div id='addeditdelete<?=$i?>'>
+ <?php if ($pconfig['enable']): ?>
+ <a href="services_captiveportal_vouchers_edit.php?zone=<?=$cpzone;?>&amp;id=<?=$i; ?>"><img src="/themes/<?=$g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit voucher"); ?>" width="17" height="17" border="0" alt="<?=gettext("edit voucher"); ?>" /></a>
+ <a href="services_captiveportal_vouchers.php?zone=<?=$cpzone;?>&amp;act=del&amp;id=<?=$i; ?>" onclick="return confirm('<?=gettext("Do you really want to delete this voucher? This makes all vouchers from this roll invalid"); ?>')"><img src="/themes/<?=$g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete vouchers"); ?>" width="17" height="17" border="0" alt="<?=gettext("delete vouchers"); ?>" /></a>
+ <a href="services_captiveportal_vouchers.php?zone=<?=$cpzone;?>&amp;act=csv&amp;id=<?=$i; ?>"><img src="/themes/<?=$g['theme']; ?>/images/icons/icon_log_s.gif" title="<?=gettext("generate vouchers for this roll to CSV file"); ?>" width="11" height="15" border="0" alt="<?=gettext("generate vouchers for this roll to CSV file"); ?>" /></a>
+ <?php endif;?>
+ </div>
+ </td>
+ </tr>
+ <?php $i++; endforeach; ?>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <?php
+ if ($pconfig['enable']) {
+ echo "<td class=\"list\"><div id='addnewroll'> <a href=\"services_captiveportal_vouchers_edit.php?zone={$cpzone}\"><img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" title=\"" . gettext("add voucher") . "\" width=\"17\" height=\"17\" border=\"0\" alt=\"" . gettext("add voucher") . "\" /></a></div></td>";
+ }
+ ?>
+ </tr>
+ </table>
+ <?php if ($pconfig['enable']): ?>
+ <?=gettext("Create, generate and activate Rolls with Vouchers that allow access through the " .
+ "captive portal for the configured time. Once a voucher is activated, " .
+ "its clock is started and runs uninterrupted until it expires. During that " .
+ "time, the voucher can be re-used from the same or a different computer. If the voucher " .
+ "is used again from another computer, the previous session is stopped."); ?>
+ <?php else: ?>
+ <?=gettext("Enable Voucher support first using the checkbox above and hit Save at the bottom."); ?>
+ <?php endif;?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq">
+ <?=gettext("Voucher public key"); ?>
+ </td>
+ <td class="vtable">
+ <textarea name="publickey" cols="65" rows="4" id="publickey" class="formpre"><?=htmlspecialchars($pconfig['publickey']);?></textarea>
+ <br />
+ <?=gettext("Paste an RSA public key (64 Bit or smaller) in PEM format here. This key is used to decrypt vouchers."); ?> <a href='#' onclick='generatenewkey();'><?=gettext('Generate');?></a> <?=gettext('new key');?>.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Voucher private key"); ?></td>
+ <td class="vtable">
+ <textarea name="privatekey" cols="65" rows="5" id="privatekey" class="formpre"><?=htmlspecialchars($pconfig['privatekey']);?></textarea>
+ <br />
+ <?=gettext("Paste an RSA private key (64 Bit or smaller) in PEM format here. This key is only used to generate encrypted vouchers and doesn't need to be available if the vouchers have been generated offline."); ?> <a href='#' onclick='generatenewkey();'> <?=gettext('Generate');?></a> <?=gettext('new key');?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Character set"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="charset" type="text" class="formfld" id="charset" size="80" value="<?=htmlspecialchars($pconfig['charset']);?>" />
+ <br />
+ <?=gettext("Tickets are generated with the specified character set. It should contain printable characters (numbers, lower case and upper case letters) that are hard to confuse with others. Avoid e.g. 0/O and l/1."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"># <?=gettext("of Roll Bits"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="rollbits" type="text" class="formfld" id="rollbits" size="2" value="<?=htmlspecialchars($pconfig['rollbits']);?>" />
+ <br />
+ <?=gettext("Reserves a range in each voucher to store the Roll # it belongs to. Allowed range: 1..31. Sum of Roll+Ticket+Checksum bits must be one Bit less than the RSA key size."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"># <?=gettext("of Ticket Bits"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="ticketbits" type="text" class="formfld" id="ticketbits" size="2" value="<?=htmlspecialchars($pconfig['ticketbits']);?>" />
+ <br />
+ <?=gettext("Reserves a range in each voucher to store the Ticket# it belongs to. Allowed range: 1..16. Using 16 bits allows a roll to have up to 65535 vouchers. A bit array, stored in RAM and in the config, is used to mark if a voucher has been used. A bit array for 65535 vouchers requires 8 KB of storage."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"># <?=gettext("of Checksum Bits"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="checksumbits" type="text" class="formfld" id="checksumbits" size="2" value="<?=htmlspecialchars($pconfig['checksumbits']);?>" />
+ <br />
+ <?=gettext("Reserves a range in each voucher to store a simple checksum over Roll # and Ticket#. Allowed range is 0..31."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Magic Number"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="magic" type="text" class="formfld" id="magic" size="20" value="<?=htmlspecialchars($pconfig['magic']);?>" />
+ <br />
+ <?=gettext("Magic number stored in every voucher. Verified during voucher check. Size depends on how many bits are left by Roll+Ticket+Checksum bits. If all bits are used, no magic number will be used and checked."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Invalid Voucher Message"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="msgnoaccess" type="text" class="formfld" id="msgnoaccess" size="80" value="<?=htmlspecialchars($pconfig['msgnoaccess']);?>" />
+ <br /><?=gettext("Error message displayed for invalid vouchers on captive portal error page"); ?> ($PORTAL_MESSAGE$).
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Expired Voucher Message"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="msgexpired" type="text" class="formfld" id="msgexpired" size="80" value="<?=htmlspecialchars($pconfig['msgexpired']);?>" />
+ <br /><?=gettext("Error message displayed for expired vouchers on captive portal error page"); ?> ($PORTAL_MESSAGE$).
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ &nbsp;
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Voucher database synchronization"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Synchronize Voucher Database IP"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="vouchersyncdbip" type="text" class="formfld" id="vouchersyncdbip" size="17" value="<?=htmlspecialchars($pconfig['vouchersyncdbip']);?>" />
+ <br /><?=gettext("IP address of master nodes webConfigurator to synchronize voucher database and used vouchers from."); ?>
+ <br /><?=gettext("NOTE: this should be setup on the slave nodes and not the primary node!"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Voucher sync port"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="vouchersyncport" type="text" class="formfld" id="vouchersyncport" size="7" value="<?=htmlspecialchars($pconfig['vouchersyncport']);?>" />
+ <br /><?=gettext("This is the port of the master voucher nodes webConfigurator. Example: 443"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Voucher sync username"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="vouchersyncusername" type="text" class="formfld" id="vouchersyncusername" size="25" value="<?=htmlspecialchars($pconfig['vouchersyncusername']);?>" autocomplete="off" />
+ <br /><?=gettext("This is the username of the master voucher nodes webConfigurator."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Voucher sync password"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="vouchersyncpass" type="password" class="formfld" id="vouchersyncpass" size="25" value="<?=htmlspecialchars($pconfig['vouchersyncpass']);?>" autocomplete="off" />
+ <br /><?=gettext("This is the password of the master voucher nodes webConfigurator."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input type="hidden" name="zone" id="zone" value="<?=htmlspecialchars($cpzone);?>" />
+ <input type="hidden" name="exponent" id="exponent" value="<?=$pconfig['exponent'];?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true); before_save();" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list">
+ <p class="vexpl">
+ <span class="red"><strong> <?=gettext("Note:"); ?><br /> </strong></span>
+ <?=gettext("Changing any Voucher parameter (apart from managing the list of Rolls) on this page will render existing vouchers useless if they were generated with different settings."); ?>
+ <br />
+ <?=gettext("Specifying the Voucher Database Synchronization options will not record any other value from the other options. They will be retrieved/synced from the master."); ?>
+ </p>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_vouchers_edit.php b/src/usr/local/www/services_captiveportal_vouchers_edit.php
new file mode 100644
index 0000000..0aa6a45
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_vouchers_edit.php
@@ -0,0 +1,230 @@
+<?php
+/*
+ services_captiveportal_vouchers_edit.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2007 Marcel Wiget <mwiget@mac.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-voucher-edit
+##|*NAME=Services: Captive portal Voucher Rolls page
+##|*DESCR=Allow access to the 'Services: Captive portal Edit Voucher Rolls' page.
+##|*MATCH=services_captiveportal_vouchers_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+require_once("voucher.inc");
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), gettext("Edit Voucher Rolls"));
+$shortcut_section = "captiveportal-vouchers";
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone) || empty($config['captiveportal'][$cpzone])) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+if (!is_array($config['voucher'])) {
+ $config['voucher'] = array();
+}
+
+if (!is_array($config['voucher'][$cpzone]['roll'])) {
+ $config['voucher'][$cpzone]['roll'] = array();
+}
+$a_roll = &$config['voucher'][$cpzone]['roll'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_roll[$id]) {
+ $pconfig['zone'] = $a_roll[$id]['zone'];
+ $pconfig['number'] = $a_roll[$id]['number'];
+ $pconfig['count'] = $a_roll[$id]['count'];
+ $pconfig['minutes'] = $a_roll[$id]['minutes'];
+ $pconfig['descr'] = $a_roll[$id]['descr'];
+}
+
+$maxnumber = (1<<$config['voucher'][$cpzone]['rollbits']) -1; // Highest Roll#
+$maxcount = (1<<$config['voucher'][$cpzone]['ticketbits']) -1; // Highest Ticket#
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "number count minutes");
+ $reqdfieldsn = array(gettext("Number"), gettext("Count"), gettext("minutes"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ // Look for duplicate roll #
+ foreach ($a_roll as $re) {
+ if ($re['number'] == $_POST['number']) {
+ $input_errors[] = sprintf(gettext("Roll number %s already exists."), $_POST['number']);
+ break;
+ }
+ }
+
+ if (!is_numeric($_POST['number']) || $_POST['number'] >= $maxnumber) {
+ $input_errors[] = sprintf(gettext("Roll number must be numeric and less than %s"), $maxnumber);
+ }
+
+ if (!is_numeric($_POST['count']) || $_POST['count'] < 1 || $_POST['count'] > $maxcount) {
+ $input_errors[] = sprintf(gettext("A roll has at least one voucher and less than %s."), $maxcount);
+ }
+
+ if (!is_numeric($_POST['minutes']) || $_POST['minutes'] < 1) {
+ $input_errors[] = gettext("Each voucher must be good for at least 1 minute.");
+ }
+
+ if (!$input_errors) {
+
+ if (isset($id) && $a_roll[$id]) {
+ $rollent = $a_roll[$id];
+ }
+
+ $rollent['zone'] = $_POST['zone'];
+ $rollent['number'] = $_POST['number'];
+ $rollent['minutes'] = $_POST['minutes'];
+ $rollent['descr'] = $_POST['descr'];
+
+ /* New Roll or modified voucher count: create bitmask */
+ $voucherlck = lock("voucher{$cpzone}");
+ if ($_POST['count'] != $rollent['count']) {
+ $rollent['count'] = $_POST['count'];
+ $len = ($rollent['count']>>3) + 1; // count / 8 +1
+ $rollent['used'] = base64_encode(str_repeat("\000", $len)); // 4 bitmask
+ $rollent['active'] = array();
+ voucher_write_used_db($rollent['number'], $rollent['used']);
+ voucher_write_active_db($rollent['number'], array()); // create empty DB
+ voucher_log(LOG_INFO, sprintf(gettext('All %1$s vouchers from Roll %2$s marked unused'), $rollent['count'], $rollent['number']));
+ } else {
+ // existing roll has been modified but without changing the count
+ // read active and used DB from ramdisk and store it in XML config
+ $rollent['used'] = base64_encode(voucher_read_used_db($rollent['number']));
+ $activent = array();
+ $db = array();
+ $active_vouchers = voucher_read_active_db($rollent['number'], $rollent['minutes']);
+ foreach ($active_vouchers as $voucher => $line) {
+ list($timestamp, $minutes) = explode(",", $line);
+ $activent['voucher'] = $voucher;
+ $activent['timestamp'] = $timestamp;
+ $activent['minutes'] = $minutes;
+ $db[] = $activent;
+ }
+ $rollent['active'] = $db;
+ }
+ unlock($voucherlck);
+
+ if (isset($id) && $a_roll[$id]) {
+ $a_roll[$id] = $rollent;
+ } else {
+ $a_roll[] = $rollent;
+ }
+
+ write_config();
+
+ header("Location: services_captiveportal_vouchers.php?zone={$cpzone}");
+ exit;
+ }
+}
+
+include("head.inc");
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form action="services_captiveportal_vouchers_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="content pane">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Roll"); ?>#</td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="number" type="text" class="formfld" id="number" size="10" value="<?=htmlspecialchars($pconfig['number']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter the Roll"); ?># (0..<?=htmlspecialchars($maxnumber);?>) <?=gettext("found on top of the generated/printed vouchers"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Minutes per Ticket"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="minutes" type="text" class="formfld" id="minutes" size="10" value="<?=htmlspecialchars($pconfig['minutes']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Defines the time in minutes that a user is allowed access. The clock starts ticking the first time a voucher is used for authentication"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Count"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="count" type="text" class="formfld" id="count" size="10" value="<?=htmlspecialchars($pconfig['count']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter the number of vouchers"); ?> (1..<?=htmlspecialchars($maxcount);?>) <?=gettext("found on top of the generated/printed vouchers. WARNING: Changing this number for an existing Roll will mark all vouchers as unused again"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Comment"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="descr" type="text" class="formfld" id="descr" size="60" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Can be used to further identify this roll. Ignored by the system"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
+ <?php if (isset($id) && $a_roll[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_zones.php b/src/usr/local/www/services_captiveportal_zones.php
new file mode 100644
index 0000000..6d956b5
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_zones.php
@@ -0,0 +1,154 @@
+<?php
+/*
+ services_captiveportal_zones.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-zones
+##|*NAME=Services: Captive portal Zones page
+##|*DESCR=Allow access to the 'Services: Captive portal Zones' page.
+##|*MATCH=services_captiveportal_zones.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+global $cpzone;
+global $cpzoneid;
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp = &$config['captiveportal'];
+
+if ($_GET['act'] == "del" && !empty($_GET['zone'])) {
+ $cpzone = htmlspecialchars($_GET['zone']);
+ if ($a_cp[$cpzone]) {
+ $cpzoneid = $a_cp[$cpzone]['zoneid'];
+ unset($a_cp[$cpzone]['enable']);
+ captiveportal_configure_zone($a_cp[$cpzone]);
+ unset($a_cp[$cpzone]);
+ if (isset($config['voucher'][$cpzone])) {
+ unset($config['voucher'][$cpzone]);
+ }
+ write_config();
+ }
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+$pgtitle = array(gettext("Captive Portal"), gettext("Zones"));
+$shortcut_section = "captiveportal";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_captiveportal_zones.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('captiveportal')): ?><p>
+<?php print_info_box_np(gettext("The CaptivePortal entry list has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?>
+<?php endif; ?>
+
+<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="captive portal">
+ <tr>
+ <td width="15%" class="listhdrr"><?=gettext("Zone");?></td>
+ <td width="30%" class="listhdrr"><?=gettext("Interfaces");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Number of users");?></td>
+ <td width="40%" class="listhdrr"><?=gettext("Description");?></td>
+ <td width="5%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle" width="17">&nbsp;</td>
+ <td valign="middle">
+ <a href="services_captiveportal_zones_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new captiveportal instance");?>" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ foreach ($a_cp as $cpzone => $cpitem):
+ if (!is_array($cpitem)) {
+ continue;
+ }
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='services_captiveportal.php?zone=<?=$cpzone;?>';">
+ <?=htmlspecialchars($cpitem['zone']);?>
+ </td>
+ <td class="listlr" ondblclick="document.location='services_captiveportal.php?zone=<?=$cpzone;?>';">
+<?php
+ $cpifaces = explode(",", $cpitem['interface']);
+ foreach ($cpifaces as $cpiface) {
+ echo convert_friendly_interface_to_friendly_descr($cpiface) . " ";
+ }
+?>
+ </td>
+ <td class="listr" ondblclick="document.location='services_captiveportal.php?zone=<?=$cpzone;?>';">
+ <?=count(captiveportal_read_db());?>
+ </td>
+ <td class="listbg" ondblclick="document.location='services_captiveportal.php?zone=<?=$cpzone;?>';">
+ <?=htmlspecialchars($cpitem['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="services_captiveportal.php?zone=<?=$cpzone?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit captiveportal instance"); ?>" alt="edit" /></a></td>
+ <td>
+ <a href="services_captiveportal_zones.php?act=del&amp;zone=<?=$cpzone;?>" onclick="return confirm('<?=gettext("Do you really want to delete this entry?");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete captiveportal instance");?>" alt="delete" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17">&nbsp;</td>
+ <td valign="middle">
+ <a href="services_captiveportal_zones_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new captiveportal instance");?>" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_captiveportal_zones_edit.php b/src/usr/local/www/services_captiveportal_zones_edit.php
new file mode 100644
index 0000000..fa37c80
--- /dev/null
+++ b/src/usr/local/www/services_captiveportal_zones_edit.php
@@ -0,0 +1,124 @@
+<?php
+/*
+ services_captiveportal_zones_edit.php
+ Copyright (C) 2011 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-services-captiveportal-editzones
+##|*NAME=Services: Captive portal: Edit Zones page
+##|*DESCR=Allow access to the 'Services: Captive portal: Edit Zones' page.
+##|*MATCH=services_captiveportal_zones_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+$pgtitle = array(gettext("Services"), gettext("Captive portal"), gettext("Edit Zones"));
+$shortcut_section = "captiveportal";
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "zone");
+ $reqdfieldsn = array(gettext("Zone name"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (preg_match('/[^A-Za-z0-9_]/', $_POST['zone'])) {
+ $input_errors[] = gettext("The zone name can only contain letters, digits, and underscores (_).");
+ }
+
+ foreach ($a_cp as $cpkey => $cpent) {
+ if ($cpent['zone'] == $_POST['zone']) {
+ $input_errors[] = sprintf("[%s] %s.", $_POST['zone'], gettext("already exists"));
+ break;
+ }
+ }
+
+ if (!$input_errors) {
+ $cpzone = strtolower($_POST['zone']);
+ $a_cp[$cpzone] = array();
+ $a_cp[$cpzone]['zone'] = str_replace(" ", "", $_POST['zone']);
+ $a_cp[$cpzone]['descr'] = $_POST['descr'];
+ $a_cp[$cpzone]['localauth_priv'] = true;
+ write_config();
+
+ header("Location: services_captiveportal.php?zone={$cpzone}");
+ exit;
+ }
+}
+include("head.inc");
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+ <form action="services_captiveportal_zones_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="captive portal edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Captive Portal Zones");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Zone name"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="zone" type="text" class="formfld unknown" id="zone" size="64" />
+ <br />
+ <span class="vexpl"><?=gettext("Zone name. Can only contain letters, digits, and underscores (_)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Continue"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dhcp.php b/src/usr/local/www/services_dhcp.php
new file mode 100644
index 0000000..3061812
--- /dev/null
+++ b/src/usr/local/www/services_dhcp.php
@@ -0,0 +1,1442 @@
+<?php
+/* $Id$ */
+/*
+ services_dhcp.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dhcpserver
+##|*NAME=Services: DHCP server page
+##|*DESCR=Allow access to the 'Services: DHCP server' page.
+##|*MATCH=services_dhcp.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter.inc");
+
+if (!$g['services_dhcp_server_enable']) {
+ header("Location: /");
+ exit;
+}
+
+$if = $_GET['if'];
+if (!empty($_POST['if'])) {
+ $if = $_POST['if'];
+}
+
+/* if OLSRD is enabled, allow WAN to house DHCP. */
+if ($config['installedpackages']['olsrd']) {
+ foreach ($config['installedpackages']['olsrd']['config'] as $olsrd) {
+ if ($olsrd['enable']) {
+ $is_olsr_enabled = true;
+ break;
+ }
+ }
+}
+
+$iflist = get_configured_interface_with_descr();
+
+/* set the starting interface */
+if (!$if || !isset($iflist[$if])) {
+ foreach ($iflist as $ifent => $ifname) {
+ $oc = $config['interfaces'][$ifent];
+ if ((is_array($config['dhcpd'][$ifent]) && !isset($config['dhcpd'][$ifent]['enable']) && (!is_ipaddrv4($oc['ipaddr']))) ||
+ (!is_array($config['dhcpd'][$ifent]) && (!is_ipaddrv4($oc['ipaddr'])))) {
+ continue;
+ }
+ $if = $ifent;
+ break;
+ }
+}
+
+$act = $_GET['act'];
+if (!empty($_POST['act'])) {
+ $act = $_POST['act'];
+}
+
+$a_pools = array();
+
+if (is_array($config['dhcpd'][$if])) {
+ $pool = $_GET['pool'];
+ if (is_numeric($_POST['pool'])) {
+ $pool = $_POST['pool'];
+ }
+
+ // If we have a pool but no interface name, that's not valid. Redirect away.
+ if (is_numeric($pool) && empty($if)) {
+ header("Location: services_dhcp.php");
+ exit;
+ }
+
+ if (!is_array($config['dhcpd'][$if]['pool'])) {
+ $config['dhcpd'][$if]['pool'] = array();
+ }
+ $a_pools = &$config['dhcpd'][$if]['pool'];
+
+ if (is_numeric($pool) && $a_pools[$pool]) {
+ $dhcpdconf = &$a_pools[$pool];
+ } elseif ($act == "newpool") {
+ $dhcpdconf = array();
+ } else {
+ $dhcpdconf = &$config['dhcpd'][$if];
+ }
+}
+if (is_array($dhcpdconf)) {
+ // Global Options
+ if (!is_numeric($pool) && !($act == "newpool")) {
+ $pconfig['enable'] = isset($dhcpdconf['enable']);
+ $pconfig['staticarp'] = isset($dhcpdconf['staticarp']);
+ // No reason to specify this per-pool, per the dhcpd.conf man page it needs to be in every
+ // pool and should be specified in every pool both nodes share, so we'll treat it as global
+ $pconfig['failover_peerip'] = $dhcpdconf['failover_peerip'];
+
+ // dhcpleaseinlocaltime is global to all interfaces. So if it is selected on any interface,
+ // then show it true/checked.
+ foreach ($config['dhcpd'] as $dhcpdifitem) {
+ $dhcpleaseinlocaltime = $dhcpdifitem['dhcpleaseinlocaltime'];
+ if ($dhcpleaseinlocaltime) {
+ break;
+ }
+ }
+
+ $pconfig['dhcpleaseinlocaltime'] = $dhcpleaseinlocaltime;
+
+ if (!is_array($dhcpdconf['staticmap'])) {
+ $dhcpdconf['staticmap'] = array();
+ }
+ $a_maps = &$dhcpdconf['staticmap'];
+ } else {
+ // Options that exist only in pools
+ $pconfig['descr'] = $dhcpdconf['descr'];
+ }
+
+ // Options that can be global or per-pool.
+ if (is_array($dhcpdconf['range'])) {
+ $pconfig['range_from'] = $dhcpdconf['range']['from'];
+ $pconfig['range_to'] = $dhcpdconf['range']['to'];
+ }
+ $pconfig['deftime'] = $dhcpdconf['defaultleasetime'];
+ $pconfig['maxtime'] = $dhcpdconf['maxleasetime'];
+ $pconfig['gateway'] = $dhcpdconf['gateway'];
+ $pconfig['domain'] = $dhcpdconf['domain'];
+ $pconfig['domainsearchlist'] = $dhcpdconf['domainsearchlist'];
+ list($pconfig['wins1'], $pconfig['wins2']) = $dhcpdconf['winsserver'];
+ list($pconfig['dns1'], $pconfig['dns2'], $pconfig['dns3'], $pconfig['dns4']) = $dhcpdconf['dnsserver'];
+ $pconfig['denyunknown'] = isset($dhcpdconf['denyunknown']);
+ $pconfig['ddnsdomain'] = $dhcpdconf['ddnsdomain'];
+ $pconfig['ddnsdomainprimary'] = $dhcpdconf['ddnsdomainprimary'];
+ $pconfig['ddnsdomainkeyname'] = $dhcpdconf['ddnsdomainkeyname'];
+ $pconfig['ddnsdomainkey'] = $dhcpdconf['ddnsdomainkey'];
+ $pconfig['ddnsupdate'] = isset($dhcpdconf['ddnsupdate']);
+ $pconfig['mac_allow'] = $dhcpdconf['mac_allow'];
+ $pconfig['mac_deny'] = $dhcpdconf['mac_deny'];
+ list($pconfig['ntp1'], $pconfig['ntp2']) = $dhcpdconf['ntpserver'];
+ $pconfig['tftp'] = $dhcpdconf['tftp'];
+ $pconfig['ldap'] = $dhcpdconf['ldap'];
+ $pconfig['netboot'] = isset($dhcpdconf['netboot']);
+ $pconfig['nextserver'] = $dhcpdconf['nextserver'];
+ $pconfig['filename'] = $dhcpdconf['filename'];
+ $pconfig['filename32'] = $dhcpdconf['filename32'];
+ $pconfig['filename64'] = $dhcpdconf['filename64'];
+ $pconfig['rootpath'] = $dhcpdconf['rootpath'];
+ $pconfig['netmask'] = $dhcpdconf['netmask'];
+ $pconfig['numberoptions'] = $dhcpdconf['numberoptions'];
+}
+
+$ifcfgip = $config['interfaces'][$if]['ipaddr'];
+$ifcfgsn = $config['interfaces'][$if]['subnet'];
+
+function validate_partial_mac_list($maclist) {
+ $macs = explode(',', $maclist);
+
+ // Loop through and look for invalid MACs.
+ foreach ($macs as $mac) {
+ if (!is_macaddr($mac, true)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+if (isset($_POST['submit'])) {
+
+ unset($input_errors);
+
+ $pconfig = $_POST;
+
+ $numberoptions = array();
+ for ($x = 0; $x < 99; $x++) {
+ if (isset($_POST["number{$x}"]) && ctype_digit($_POST["number{$x}"])) {
+ $numbervalue = array();
+ $numbervalue['number'] = htmlspecialchars($_POST["number{$x}"]);
+ $numbervalue['type'] = htmlspecialchars($_POST["itemtype{$x}"]);
+ $numbervalue['value'] = str_replace('&quot;', '"', htmlspecialchars($_POST["value{$x}"]));
+ $numberoptions['item'][] = $numbervalue;
+ }
+ }
+ // Reload the new pconfig variable that the form uses.
+ $pconfig['numberoptions'] = $numberoptions;
+
+ /* input validation */
+ if ($_POST['enable'] || is_numeric($pool) || $act == "newpool") {
+ $reqdfields = explode(" ", "range_from range_to");
+ $reqdfieldsn = array(gettext("Range begin"), gettext("Range end"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_POST['range_from'] && !is_ipaddrv4($_POST['range_from']))) {
+ $input_errors[] = gettext("A valid range must be specified.");
+ }
+ if (($_POST['range_to'] && !is_ipaddrv4($_POST['range_to']))) {
+ $input_errors[] = gettext("A valid range must be specified.");
+ }
+ if (($_POST['gateway'] && $_POST['gateway'] != "none" && !is_ipaddrv4($_POST['gateway']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for the gateway.");
+ }
+ if (($_POST['wins1'] && !is_ipaddrv4($_POST['wins1'])) || ($_POST['wins2'] && !is_ipaddrv4($_POST['wins2']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for the primary/secondary WINS servers.");
+ }
+ $parent_ip = get_interface_ip($_POST['if']);
+ if (is_ipaddrv4($parent_ip) && $_POST['gateway'] && $_POST['gateway'] != "none") {
+ $parent_sn = get_interface_subnet($_POST['if']);
+ if (!ip_in_subnet($_POST['gateway'], gen_subnet($parent_ip, $parent_sn) . "/" . $parent_sn) && !ip_in_interface_alias_subnet($_POST['if'], $_POST['gateway'])) {
+ $input_errors[] = sprintf(gettext("The gateway address %s does not lie within the chosen interface's subnet."), $_POST['gateway']);
+ }
+ }
+ if (($_POST['dns1'] && !is_ipaddrv4($_POST['dns1'])) || ($_POST['dns2'] && !is_ipaddrv4($_POST['dns2'])) || ($_POST['dns3'] && !is_ipaddrv4($_POST['dns3'])) || ($_POST['dns4'] && !is_ipaddrv4($_POST['dns4']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for each of the DNS servers.");
+ }
+
+ if ($_POST['deftime'] && (!is_numeric($_POST['deftime']) || ($_POST['deftime'] < 60))) {
+ $input_errors[] = gettext("The default lease time must be at least 60 seconds.");
+ }
+
+ if (isset($config['captiveportal']) && is_array($config['captiveportal'])) {
+ $deftime = 7200; // Default value if it's empty
+ if (is_numeric($_POST['deftime'])) {
+ $deftime = $_POST['deftime'];
+ }
+
+ foreach ($config['captiveportal'] as $cpZone => $cpdata) {
+ if (!isset($cpdata['enable'])) {
+ continue;
+ }
+ if (!isset($cpdata['timeout']) || !is_numeric($cpdata['timeout'])) {
+ continue;
+ }
+ $cp_ifs = explode(',', $cpdata['interface']);
+ if (!in_array($if, $cp_ifs)) {
+ continue;
+ }
+ if ($cpdata['timeout'] > $deftime) {
+ $input_errors[] = sprintf(gettext(
+ "The Captive Portal zone '%s' has Hard Timeout parameter set to a value bigger than Default lease time (%s)."), $cpZone, $deftime);
+ }
+ }
+ }
+
+ if ($_POST['maxtime'] && (!is_numeric($_POST['maxtime']) || ($_POST['maxtime'] < 60) || ($_POST['maxtime'] <= $_POST['deftime']))) {
+ $input_errors[] = gettext("The maximum lease time must be at least 60 seconds and higher than the default lease time.");
+ }
+ if (($_POST['ddnsdomain'] && !is_domain($_POST['ddnsdomain']))) {
+ $input_errors[] = gettext("A valid domain name must be specified for the dynamic DNS registration.");
+ }
+ if (($_POST['ddnsdomain'] && !is_ipaddrv4($_POST['ddnsdomainprimary']))) {
+ $input_errors[] = gettext("A valid primary domain name server IP address must be specified for the dynamic domain name.");
+ }
+ if (($_POST['ddnsdomainkey'] && !$_POST['ddnsdomainkeyname']) ||
+ ($_POST['ddnsdomainkeyname'] && !$_POST['ddnsdomainkey'])) {
+ $input_errors[] = gettext("You must specify both a valid domain key and key name.");
+ }
+ if ($_POST['domainsearchlist']) {
+ $domain_array = preg_split("/[ ;]+/", $_POST['domainsearchlist']);
+ foreach ($domain_array as $curdomain) {
+ if (!is_domain($curdomain)) {
+ $input_errors[] = gettext("A valid domain search list must be specified.");
+ break;
+ }
+ }
+ }
+
+ // Validate MACs
+ if (!empty($_POST['mac_allow']) && !validate_partial_mac_list($_POST['mac_allow'])) {
+ $input_errors[] = gettext("If you specify a mac allow list, it must contain only valid partial MAC addresses.");
+ }
+ if (!empty($_POST['mac_deny']) && !validate_partial_mac_list($_POST['mac_deny'])) {
+ $input_errors[] = gettext("If you specify a mac deny list, it must contain only valid partial MAC addresses.");
+ }
+
+ if (($_POST['ntp1'] && !is_ipaddrv4($_POST['ntp1'])) || ($_POST['ntp2'] && !is_ipaddrv4($_POST['ntp2']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for the primary/secondary NTP servers.");
+ }
+ if (($_POST['domain'] && !is_domain($_POST['domain']))) {
+ $input_errors[] = gettext("A valid domain name must be specified for the DNS domain.");
+ }
+ if ($_POST['tftp'] && !is_ipaddrv4($_POST['tftp']) && !is_domain($_POST['tftp']) && !is_URL($_POST['tftp'])) {
+ $input_errors[] = gettext("A valid IP address or hostname must be specified for the TFTP server.");
+ }
+ if (($_POST['nextserver'] && !is_ipaddrv4($_POST['nextserver']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for the network boot server.");
+ }
+
+ if (gen_subnet($ifcfgip, $ifcfgsn) == $_POST['range_from']) {
+ $input_errors[] = gettext("You cannot use the network address in the starting subnet range.");
+ }
+ if (gen_subnet_max($ifcfgip, $ifcfgsn) == $_POST['range_to']) {
+ $input_errors[] = gettext("You cannot use the broadcast address in the ending subnet range.");
+ }
+
+ // Disallow a range that includes the virtualip
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['interface'] == $if) {
+ if ($vip['subnet'] && is_inrange_v4($vip['subnet'], $_POST['range_from'], $_POST['range_to'])) {
+ $input_errors[] = sprintf(gettext("The subnet range cannot overlap with virtual IP address %s."), $vip['subnet']);
+ }
+ }
+ }
+ }
+
+ $noip = false;
+ if (is_array($a_maps)) {
+ foreach ($a_maps as $map) {
+ if (empty($map['ipaddr'])) {
+ $noip = true;
+ }
+ }
+ }
+ if ($_POST['staticarp'] && $noip) {
+ $input_errors[] = "Cannot enable static ARP when you have static map entries without IP addresses. Ensure all static maps have IP addresses and try again.";
+ }
+
+ if (is_array($pconfig['numberoptions']['item'])) {
+ foreach ($pconfig['numberoptions']['item'] as $numberoption) {
+ if ($numberoption['type'] == 'text' && strstr($numberoption['value'], '"')) {
+ $input_errors[] = gettext("Text type cannot include quotation marks.");
+ } else if ($numberoption['type'] == 'string' && !preg_match('/^"[^"]*"$/', $numberoption['value']) && !preg_match('/^[0-9a-f]{2}(?:\:[0-9a-f]{2})*$/i', $numberoption['value'])) {
+ $input_errors[] = gettext("String type must be enclosed in quotes like \"this\" or must be a series of octets specified in hexadecimal, separated by colons, like 01:23:45:67:89:ab:cd:ef");
+ } else if ($numberoption['type'] == 'boolean' && $numberoption['value'] != 'true' && $numberoption['value'] != 'false' && $numberoption['value'] != 'on' && $numberoption['value'] != 'off') {
+ $input_errors[] = gettext("Boolean type must be true, false, on, or off.");
+ } else if ($numberoption['type'] == 'unsigned integer 8' && (!is_numeric($numberoption['value']) || $numberoption['value'] < 0 || $numberoption['value'] > 255)) {
+ $input_errors[] = gettext("Unsigned 8-bit integer type must be a number in the range 0 to 255.");
+ } else if ($numberoption['type'] == 'unsigned integer 16' && (!is_numeric($numberoption['value']) || $numberoption['value'] < 0 || $numberoption['value'] > 65535)) {
+ $input_errors[] = gettext("Unsigned 16-bit integer type must be a number in the range 0 to 65535.");
+ } else if ($numberoption['type'] == 'unsigned integer 32' && (!is_numeric($numberoption['value']) || $numberoption['value'] < 0 || $numberoption['value'] > 4294967295)) {
+ $input_errors[] = gettext("Unsigned 32-bit integer type must be a number in the range 0 to 4294967295.");
+ } else if ($numberoption['type'] == 'signed integer 8' && (!is_numeric($numberoption['value']) || $numberoption['value'] < -128 || $numberoption['value'] > 127)) {
+ $input_errors[] = gettext("Signed 8-bit integer type must be a number in the range -128 to 127.");
+ } else if ($numberoption['type'] == 'signed integer 16' && (!is_numeric($numberoption['value']) || $numberoption['value'] < -32768 || $numberoption['value'] > 32767)) {
+ $input_errors[] = gettext("Signed 16-bit integer type must be a number in the range -32768 to 32767.");
+ } else if ($numberoption['type'] == 'signed integer 32' && (!is_numeric($numberoption['value']) || $numberoption['value'] < -2147483648 || $numberoption['value'] > 2147483647)) {
+ $input_errors[] = gettext("Signed 32-bit integer type must be a number in the range -2147483648 to 2147483647.");
+ } else if ($numberoption['type'] == 'ip-address' && !is_ipaddrv4($numberoption['value']) && !is_hostname($numberoption['value'])) {
+ $input_errors[] = gettext("IP address or host type must be an IP address or host name.");
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ /* make sure the range lies within the current subnet */
+ $subnet_start = ip2ulong(long2ip32(ip2long($ifcfgip) & gen_subnet_mask_long($ifcfgsn)));
+ $subnet_end = ip2ulong(long2ip32(ip2long($ifcfgip) | (~gen_subnet_mask_long($ifcfgsn))));
+
+ if ((ip2ulong($_POST['range_from']) < $subnet_start) || (ip2ulong($_POST['range_from']) > $subnet_end) ||
+ (ip2ulong($_POST['range_to']) < $subnet_start) || (ip2ulong($_POST['range_to']) > $subnet_end)) {
+ $input_errors[] = gettext("The specified range lies outside of the current subnet.");
+ }
+
+ if (ip2ulong($_POST['range_from']) > ip2ulong($_POST['range_to'])) {
+ $input_errors[] = gettext("The range is invalid (first element higher than second element).");
+ }
+
+ if (is_numeric($pool) || ($act == "newpool")) {
+ $rfrom = $config['dhcpd'][$if]['range']['from'];
+ $rto = $config['dhcpd'][$if]['range']['to'];
+
+ if (is_inrange_v4($_POST['range_from'], $rfrom, $rto) || is_inrange_v4($_POST['range_to'], $rfrom, $rto)) {
+ $input_errors[] = gettext("The specified range must not be within the DHCP range for this interface.");
+ }
+ }
+
+ foreach ($a_pools as $id => $p) {
+ if (is_numeric($pool) && ($id == $pool)) {
+ continue;
+ }
+
+ if (is_inrange_v4($_POST['range_from'], $p['range']['from'], $p['range']['to']) ||
+ is_inrange_v4($_POST['range_to'], $p['range']['from'], $p['range']['to'])) {
+ $input_errors[] = gettext("The specified range must not be within the range configured on a DHCP pool for this interface.");
+ break;
+ }
+ }
+
+ /* make sure that the DHCP Relay isn't enabled on this interface */
+ if (isset($config['dhcrelay']['enable']) && (stristr($config['dhcrelay']['interface'], $if) !== false)) {
+ $input_errors[] = sprintf(gettext("You must disable the DHCP relay on the %s interface before enabling the DHCP server."), $iflist[$if]);
+ }
+
+ $dynsubnet_start = ip2ulong($_POST['range_from']);
+ $dynsubnet_end = ip2ulong($_POST['range_to']);
+ if (is_array($a_maps)) {
+ foreach ($a_maps as $map) {
+ if (empty($map['ipaddr'])) {
+ continue;
+ }
+ if ((ip2ulong($map['ipaddr']) > $dynsubnet_start) &&
+ (ip2ulong($map['ipaddr']) < $dynsubnet_end)) {
+ $input_errors[] = sprintf(gettext("The DHCP range cannot overlap any static DHCP mappings."));
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ if (!is_numeric($pool)) {
+ if ($act == "newpool") {
+ $dhcpdconf = array();
+ } else {
+ if (!is_array($config['dhcpd'][$if])) {
+ $config['dhcpd'][$if] = array();
+ }
+ $dhcpdconf = $config['dhcpd'][$if];
+ }
+ } else {
+ if (is_array($a_pools[$pool])) {
+ $dhcpdconf = $a_pools[$pool];
+ } else {
+ // Someone specified a pool but it doesn't exist. Punt.
+ header("Location: services_dhcp.php");
+ exit;
+ }
+ }
+ if (!is_array($dhcpdconf['range'])) {
+ $dhcpdconf['range'] = array();
+ }
+
+ $dhcpd_enable_changed = false;
+
+ // Global Options
+ if (!is_numeric($pool) && !($act == "newpool")) {
+ $old_dhcpd_enable = isset($dhcpdconf['enable']);
+ $new_dhcpd_enable = ($_POST['enable']) ? true : false;
+ if ($old_dhcpd_enable != $new_dhcpd_enable) {
+ /* DHCP has been enabled or disabled. The pf ruleset will need to be rebuilt to allow or disallow DHCP. */
+ $dhcpd_enable_changed = true;
+ }
+ $dhcpdconf['enable'] = $new_dhcpd_enable;
+ $dhcpdconf['staticarp'] = ($_POST['staticarp']) ? true : false;
+ $previous = $dhcpdconf['failover_peerip'];
+ if ($previous <> $_POST['failover_peerip']) {
+ mwexec("/bin/rm -rf /var/dhcpd/var/db/*");
+ }
+ $dhcpdconf['failover_peerip'] = $_POST['failover_peerip'];
+ // dhcpleaseinlocaltime is global to all interfaces. So update the setting on all interfaces.
+ foreach ($config['dhcpd'] as &$dhcpdifitem) {
+ $dhcpdifitem['dhcpleaseinlocaltime'] = $_POST['dhcpleaseinlocaltime'];
+ }
+ } else {
+ // Options that exist only in pools
+ $dhcpdconf['descr'] = $_POST['descr'];
+ }
+
+ // Options that can be global or per-pool.
+ $dhcpdconf['range']['from'] = $_POST['range_from'];
+ $dhcpdconf['range']['to'] = $_POST['range_to'];
+ $dhcpdconf['defaultleasetime'] = $_POST['deftime'];
+ $dhcpdconf['maxleasetime'] = $_POST['maxtime'];
+ $dhcpdconf['netmask'] = $_POST['netmask'];
+
+ unset($dhcpdconf['winsserver']);
+ if ($_POST['wins1']) {
+ $dhcpdconf['winsserver'][] = $_POST['wins1'];
+ }
+ if ($_POST['wins2']) {
+ $dhcpdconf['winsserver'][] = $_POST['wins2'];
+ }
+
+ unset($dhcpdconf['dnsserver']);
+ if ($_POST['dns1']) {
+ $dhcpdconf['dnsserver'][] = $_POST['dns1'];
+ }
+ if ($_POST['dns2']) {
+ $dhcpdconf['dnsserver'][] = $_POST['dns2'];
+ }
+ if ($_POST['dns3']) {
+ $dhcpdconf['dnsserver'][] = $_POST['dns3'];
+ }
+ if ($_POST['dns4']) {
+ $dhcpdconf['dnsserver'][] = $_POST['dns4'];
+ }
+
+ $dhcpdconf['gateway'] = $_POST['gateway'];
+ $dhcpdconf['domain'] = $_POST['domain'];
+ $dhcpdconf['domainsearchlist'] = $_POST['domainsearchlist'];
+ $dhcpdconf['denyunknown'] = ($_POST['denyunknown']) ? true : false;
+ $dhcpdconf['ddnsdomain'] = $_POST['ddnsdomain'];
+ $dhcpdconf['ddnsdomainprimary'] = $_POST['ddnsdomainprimary'];
+ $dhcpdconf['ddnsdomainkeyname'] = $_POST['ddnsdomainkeyname'];
+ $dhcpdconf['ddnsdomainkey'] = $_POST['ddnsdomainkey'];
+ $dhcpdconf['ddnsupdate'] = ($_POST['ddnsupdate']) ? true : false;
+ $dhcpdconf['mac_allow'] = $_POST['mac_allow'];
+ $dhcpdconf['mac_deny'] = $_POST['mac_deny'];
+
+ unset($dhcpdconf['ntpserver']);
+ if ($_POST['ntp1']) {
+ $dhcpdconf['ntpserver'][] = $_POST['ntp1'];
+ }
+ if ($_POST['ntp2']) {
+ $dhcpdconf['ntpserver'][] = $_POST['ntp2'];
+ }
+
+ $dhcpdconf['tftp'] = $_POST['tftp'];
+ $dhcpdconf['ldap'] = $_POST['ldap'];
+ $dhcpdconf['netboot'] = ($_POST['netboot']) ? true : false;
+ $dhcpdconf['nextserver'] = $_POST['nextserver'];
+ $dhcpdconf['filename'] = $_POST['filename'];
+ $dhcpdconf['filename32'] = $_POST['filename32'];
+ $dhcpdconf['filename64'] = $_POST['filename64'];
+ $dhcpdconf['rootpath'] = $_POST['rootpath'];
+
+ // Handle the custom options rowhelper
+ if (isset($dhcpdconf['numberoptions']['item'])) {
+ unset($dhcpdconf['numberoptions']['item']);
+ }
+
+ $dhcpdconf['numberoptions'] = $numberoptions;
+
+ if (is_numeric($pool) && is_array($a_pools[$pool])) {
+ $a_pools[$pool] = $dhcpdconf;
+ } elseif ($act == "newpool") {
+ $a_pools[] = $dhcpdconf;
+ } else {
+ $config['dhcpd'][$if] = $dhcpdconf;
+ }
+
+ write_config();
+ }
+}
+
+if ((isset($_POST['submit']) || isset($_POST['apply'])) && (!$input_errors)) {
+ $retval = 0;
+ $retvaldhcp = 0;
+ $retvaldns = 0;
+ /* dnsmasq_configure calls dhcpd_configure */
+ /* no need to restart dhcpd twice */
+ if (isset($config['dnsmasq']['enable']) && isset($config['dnsmasq']['regdhcpstatic'])) {
+ $retvaldns = services_dnsmasq_configure();
+ if ($retvaldns == 0) {
+ clear_subsystem_dirty('hosts');
+ clear_subsystem_dirty('staticmaps');
+ }
+ } else if (isset($config['unbound']['enable']) && isset($config['unbound']['regdhcpstatic'])) {
+ $retvaldns = services_unbound_configure();
+ if ($retvaldns == 0) {
+ clear_subsystem_dirty('unbound');
+ clear_subsystem_dirty('hosts');
+ clear_subsystem_dirty('staticmaps');
+ }
+ } else {
+ $retvaldhcp = services_dhcpd_configure();
+ if ($retvaldhcp == 0) {
+ clear_subsystem_dirty('staticmaps');
+ }
+ }
+ if ($dhcpd_enable_changed) {
+ $retvalfc = filter_configure();
+ }
+
+ if ($retvaldhcp == 1 || $retvaldns == 1 || $retvalfc == 1) {
+ $retval = 1;
+ }
+ $savemsg = get_std_save_message($retval);
+}
+
+if ($act == "delpool") {
+ if ($a_pools[$_GET['id']]) {
+ unset($a_pools[$_GET['id']]);
+ write_config();
+ header("Location: services_dhcp.php?if={$if}");
+ exit;
+ }
+}
+
+if ($act == "del") {
+ if ($a_maps[$_GET['id']]) {
+ unset($a_maps[$_GET['id']]);
+ write_config();
+ if (isset($config['dhcpd'][$if]['enable'])) {
+ mark_subsystem_dirty('staticmaps');
+ if (isset($config['dnsmasq']['enable']) && isset($config['dnsmasq']['regdhcpstatic'])) {
+ mark_subsystem_dirty('hosts');
+ }
+ }
+ header("Location: services_dhcp.php?if={$if}");
+ exit;
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Services"), gettext("DHCP server"));
+$shortcut_section = "dhcp";
+
+include("head.inc");
+
+?>
+
+<script type="text/javascript" src="/javascript/row_helper.js">
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+ function itemtype_field(fieldname, fieldsize, n) {
+ return '<select name="' + fieldname + n + '" class="formselect" id="' + fieldname + n + '"><?php
+ $customitemtypes = array('text' => gettext('Text'), 'string' => gettext('String'), 'boolean' => gettext('Boolean'),
+ 'unsigned integer 8' => gettext('Unsigned 8-bit integer'), 'unsigned integer 16' => gettext('Unsigned 16-bit integer'), 'unsigned integer 32' => gettext('Unsigned 32-bit integer'),
+ 'signed integer 8' => gettext('Signed 8-bit integer'), 'signed integer 16' => gettext('Signed 16-bit integer'), 'signed integer 32' => gettext('Signed 32-bit integer'), 'ip-address' => gettext('IP address or host'));
+ foreach ($customitemtypes as $typename => $typedescr) {
+ echo "<option value=\"{$typename}\">{$typedescr}<\/option>";
+ }
+ ?><\/select>';
+ }
+
+ rowname[0] = "number";
+ rowtype[0] = "textbox";
+ rowsize[0] = "10";
+ rowname[1] = "itemtype";
+ rowtype[1] = itemtype_field;
+ rowname[2] = "value";
+ rowtype[2] = "textbox";
+ rowsize[2] = "40";
+//]]>
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+ function enable_change(enable_over) {
+ var endis;
+ <?php if (is_numeric($pool) || ($act == "newpool")): ?>
+ enable_over = true;
+ <?php endif; ?>
+ endis = !(document.iform.enable.checked || enable_over);
+ <?php if (is_numeric($pool) || ($act == "newpool")): ?>
+ document.iform.descr.disabled = endis;
+ <?php endif; ?>
+ document.iform.range_from.disabled = endis;
+ document.iform.range_to.disabled = endis;
+ document.iform.wins1.disabled = endis;
+ document.iform.wins2.disabled = endis;
+ document.iform.dns1.disabled = endis;
+ document.iform.dns2.disabled = endis;
+ document.iform.dns3.disabled = endis;
+ document.iform.dns4.disabled = endis;
+ document.iform.deftime.disabled = endis;
+ document.iform.maxtime.disabled = endis;
+ document.iform.gateway.disabled = endis;
+ document.iform.failover_peerip.disabled = endis;
+ document.iform.domain.disabled = endis;
+ document.iform.domainsearchlist.disabled = endis;
+ document.iform.staticarp.disabled = endis;
+ document.iform.dhcpleaseinlocaltime.disabled = endis;
+ document.iform.ddnsdomain.disabled = endis;
+ document.iform.ddnsdomainprimary.disabled = endis;
+ document.iform.ddnsdomainkeyname.disabled = endis;
+ document.iform.ddnsdomainkey.disabled = endis;
+ document.iform.ddnsupdate.disabled = endis;
+ document.iform.mac_allow.disabled = endis;
+ document.iform.mac_deny.disabled = endis;
+ document.iform.ntp1.disabled = endis;
+ document.iform.ntp2.disabled = endis;
+ document.iform.tftp.disabled = endis;
+ document.iform.ldap.disabled = endis;
+ document.iform.netboot.disabled = endis;
+ document.iform.nextserver.disabled = endis;
+ document.iform.filename.disabled = endis;
+ document.iform.filename32.disabled = endis;
+ document.iform.filename64.disabled = endis;
+ document.iform.rootpath.disabled = endis;
+ document.iform.denyunknown.disabled = endis;
+ }
+
+ function show_shownumbervalue() {
+ document.getElementById("shownumbervaluebox").innerHTML='';
+ aodiv = document.getElementById('shownumbervalue');
+ aodiv.style.display = "block";
+ }
+
+ function show_ddns_config() {
+ document.getElementById("showddnsbox").innerHTML='';
+ aodiv = document.getElementById('showddns');
+ aodiv.style.display = "block";
+ }
+
+ function show_maccontrol_config() {
+ document.getElementById("showmaccontrolbox").innerHTML='';
+ aodiv = document.getElementById('showmaccontrol');
+ aodiv.style.display = "block";
+ }
+
+ function show_ntp_config() {
+ document.getElementById("showntpbox").innerHTML='';
+ aodiv = document.getElementById('showntp');
+ aodiv.style.display = "block";
+ }
+
+ function show_tftp_config() {
+ document.getElementById("showtftpbox").innerHTML='';
+ aodiv = document.getElementById('showtftp');
+ aodiv.style.display = "block";
+ }
+
+ function show_ldap_config() {
+ document.getElementById("showldapbox").innerHTML='';
+ aodiv = document.getElementById('showldap');
+ aodiv.style.display = "block";
+ }
+
+ function show_netboot_config() {
+ document.getElementById("shownetbootbox").innerHTML='';
+ aodiv = document.getElementById('shownetboot');
+ aodiv.style.display = "block";
+ }
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_dhcp.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php
+ if (isset($config['dhcrelay']['enable'])) {
+ echo gettext("DHCP Relay is currently enabled. Cannot enable the DHCP Server service while the DHCP Relay is enabled on any interface.");
+ include("fend.inc");
+ echo "</body>";
+ echo "</html>";
+ exit;
+ }
+?>
+<?php if (is_subsystem_dirty('staticmaps')): ?><br/>
+<?php print_info_box_np(gettext("The static mapping configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp server">
+ <tr>
+ <td>
+<?php
+ /* active tabs */
+ $tab_array = array();
+ $tabscounter = 0;
+ $i = 0;
+ foreach ($iflist as $ifent => $ifname) {
+ $oc = $config['interfaces'][$ifent];
+ if ((is_array($config['dhcpd'][$ifent]) && !isset($config['dhcpd'][$ifent]['enable']) && (!is_ipaddrv4($oc['ipaddr']))) ||
+ (!is_array($config['dhcpd'][$ifent]) && (!is_ipaddrv4($oc['ipaddr'])))) {
+ continue;
+ }
+ if ($ifent == $if) {
+ $active = true;
+ } else {
+ $active = false;
+ }
+ $tab_array[] = array($ifname, $active, "services_dhcp.php?if={$ifent}");
+ $tabscounter++;
+ }
+ if ($tabscounter == 0) {
+ echo "<b>" . gettext("The DHCP Server can only be enabled on interfaces configured with a static IPv4 address. This system has none.") . "<br/><br/>";
+ echo "</td></tr></table></form>";
+ include("fend.inc");
+ echo "</body>";
+ echo "</html>";
+ exit;
+ }
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <?php if (!is_numeric($pool) && !($act == "newpool")): ?>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
+ <strong><?php printf(gettext("Enable DHCP server on %s interface"), htmlspecialchars($iflist[$if]));?></strong>
+ </td>
+ </tr>
+ <?php else: ?>
+ <tr>
+ <td colspan="2" class="listtopic"><?php echo gettext("Editing Pool-Specific Options. To return to the Interface, click its tab above."); ?></td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="denyunknown" id="denyunknown" type="checkbox" value="yes" <?php if ($pconfig['denyunknown']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Deny unknown clients");?></strong><br />
+ <?=gettext("If this is checked, only the clients defined below will get DHCP leases from this server. ");?>
+ </td>
+ </tr>
+ <?php if (is_numeric($pool) || ($act == "newpool")): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Pool Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet");?></td>
+ <td width="78%" class="vtable">
+ <?=gen_subnet($ifcfgip, $ifcfgsn);?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet mask");?></td>
+ <td width="78%" class="vtable">
+ <?=gen_subnet_mask($ifcfgsn);?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Available range");?></td>
+ <td width="78%" class="vtable">
+ <?php
+ $range_from = ip2long(long2ip32(ip2long($ifcfgip) & gen_subnet_mask_long($ifcfgsn)));
+ $range_from++;
+ echo long2ip32($range_from);
+ ?>
+ -
+ <?php
+ $range_to = ip2long(long2ip32(ip2long($ifcfgip) | (~gen_subnet_mask_long($ifcfgsn))));
+ $range_to--;
+ echo long2ip32($range_to);
+ if (is_numeric($pool) || ($act == "newpool")):
+ ?>
+ <br />In-use DHCP Pool Ranges:
+ <?php
+ if (is_array($config['dhcpd'][$if]['range'])):
+ ?>
+ <br />
+ <?php
+ echo $config['dhcpd'][$if]['range']['from'];
+ ?>
+ -
+ <?php
+ echo $config['dhcpd'][$if]['range']['to'];
+ endif;
+ ?>
+ <?php
+ foreach ($a_pools as $p):
+ if (is_array($p['range'])):
+ ?>
+ <br />
+ <?php
+ echo $p['range']['from'];
+ ?>
+ -
+ <?php
+ echo $p['range']['to'];
+ endif;
+ endforeach;
+ endif;
+ ?>
+ </td>
+ </tr>
+<?php if ($is_olsr_enabled): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet Mask");?></td>
+ <td width="78%" class="vtable">
+ <select name="netmask" class="formselect" id="netmask">
+ <?php
+ for ($i = 32; $i > 0; $i--) {
+ if ($i <> 31) {
+ echo "<option value=\"{$i}\" ";
+ if ($i == $pconfig['netmask']) {
+ echo "selected=\"selected\"";
+ }
+ echo ">" . $i . "</option>";
+ }
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+<?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Range");?></td>
+ <td width="78%" class="vtable">
+ <input name="range_from" type="text" class="formfld unknown" id="range_from" size="20" value="<?=htmlspecialchars($pconfig['range_from']);?>" />
+ &nbsp;<?=gettext("to"); ?>&nbsp; <input name="range_to" type="text" class="formfld unknown" id="range_to" size="20" value="<?=htmlspecialchars($pconfig['range_to']);?>" />
+ </td>
+ </tr>
+<?php
+ if (!is_numeric($pool) && !($act == "newpool")):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell">
+ <?=gettext("Additional Pools");?>
+ </td>
+ <td width="78%" class="vtable">
+ <?php echo gettext("If you need additional pools of addresses inside of this subnet outside the above Range, they may be specified here."); ?>
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="subnet">
+ <tr>
+ <td width="35%" class="listhdrr"><?=gettext("Pool Start");?></td>
+ <td width="35%" class="listhdrr"><?=gettext("Pool End");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="pool">
+ <tr>
+ <td valign="middle" width="17"></td>
+ <td valign="middle">
+ <a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&amp;act=newpool"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="plus" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if (is_array($a_pools)):
+ $i = 0;
+ foreach ($a_pools as $poolent):
+ if (!empty($poolent['range']['from']) && !empty($poolent['range']['to'])):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='services_dhcp.php?if=<?=htmlspecialchars($if);?>&amp;pool=<?=$i;?>';">
+ <?=htmlspecialchars($poolent['range']['from']);?>
+ </td>
+ <td class="listr" ondblclick="document.location='services_dhcp.php?if=<?=htmlspecialchars($if);?>&amp;pool=<?=$i;?>';">
+ <?=htmlspecialchars($poolent['range']['to']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_dhcp.php?if=<?=htmlspecialchars($if);?>&amp;pool=<?=$i;?>';">
+ <?=htmlspecialchars($poolent['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle">
+ <a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&amp;pool=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ </td>
+ <td valign="middle">
+ <a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&amp;act=delpool&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this pool?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+ $i++;
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17"></td>
+ <td valign="middle">
+ <a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&amp;act=newpool"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("WINS servers");?></td>
+ <td width="78%" class="vtable">
+ <input name="wins1" type="text" class="formfld unknown" id="wins1" size="20" value="<?=htmlspecialchars($pconfig['wins1']);?>" /><br />
+ <input name="wins2" type="text" class="formfld unknown" id="wins2" size="20" value="<?=htmlspecialchars($pconfig['wins2']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers");?></td>
+ <td width="78%" class="vtable">
+ <input name="dns1" type="text" class="formfld unknown" id="dns1" size="20" value="<?=htmlspecialchars($pconfig['dns1']);?>" /><br />
+ <input name="dns2" type="text" class="formfld unknown" id="dns2" size="20" value="<?=htmlspecialchars($pconfig['dns2']);?>" /><br />
+ <input name="dns3" type="text" class="formfld unknown" id="dns3" size="20" value="<?=htmlspecialchars($pconfig['dns3']);?>" /><br />
+ <input name="dns4" type="text" class="formfld unknown" id="dns4" size="20" value="<?=htmlspecialchars($pconfig['dns4']);?>" /><br />
+ <?=gettext("NOTE: leave blank to use the system default DNS servers - this interface's IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the General page.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Gateway");?></td>
+ <td width="78%" class="vtable">
+ <input name="gateway" type="text" class="formfld host" id="gateway" size="20" value="<?=htmlspecialchars($pconfig['gateway']);?>" /><br />
+ <?=gettext("The default is to use the IP on this interface of the firewall as the gateway. Specify an alternate gateway here if this is not the correct gateway for your network. Type \"none\" for no gateway assignment.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Domain name");?></td>
+ <td width="78%" class="vtable">
+ <input name="domain" type="text" class="formfld unknown" id="domain" size="20" value="<?=htmlspecialchars($pconfig['domain']);?>" /><br />
+ <?=gettext("The default is to use the domain name of this system as the default domain name provided by DHCP. You may specify an alternate domain name here.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Domain search list");?></td>
+ <td width="78%" class="vtable">
+ <input name="domainsearchlist" type="text" class="formfld unknown" id="domainsearchlist" size="20" value="<?=htmlspecialchars($pconfig['domainsearchlist']);?>" /><br />
+ <?=gettext("The DHCP server can optionally provide a domain search list. Use the semicolon character as separator ");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Default lease time");?></td>
+ <td width="78%" class="vtable">
+ <input name="deftime" type="text" class="formfld unknown" id="deftime" size="10" value="<?=htmlspecialchars($pconfig['deftime']);?>" />
+ <?=gettext("seconds");?><br />
+ <?=gettext("This is used for clients that do not ask for a specific expiration time."); ?><br />
+ <?=gettext("The default is 7200 seconds.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Maximum lease time");?></td>
+ <td width="78%" class="vtable">
+ <input name="maxtime" type="text" class="formfld unknown" id="maxtime" size="10" value="<?=htmlspecialchars($pconfig['maxtime']);?>" />
+ <?=gettext("seconds");?><br />
+ <?=gettext("This is the maximum lease time for clients that ask for a specific expiration time."); ?><br />
+ <?=gettext("The default is 86400 seconds.");?>
+ </td>
+ </tr>
+<?php
+ if (!is_numeric($pool) && !($act == "newpool")):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Failover peer IP:");?></td>
+ <td width="78%" class="vtable">
+ <input name="failover_peerip" type="text" class="formfld host" id="failover_peerip" size="20" value="<?=htmlspecialchars($pconfig['failover_peerip']);?>" /><br />
+ <?=gettext("Leave blank to disable. Enter the interface IP address of the other machine. Machines must be using CARP. Interface's advskew determines whether the DHCPd process is Primary or Secondary. Ensure one machine's advskew<20 (and the other is >20).");?>
+ </td>
+ </tr>
+<?php
+ endif;
+
+ if (!is_numeric($pool) && !($act == "newpool")):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Static ARP");?></td>
+ <td width="78%" class="vtable">
+ <table summary="static arp">
+ <tr>
+ <td>
+ <input style="vertical-align:middle" type="checkbox" value="yes" name="staticarp" id="staticarp" <?php if ($pconfig['staticarp']) echo " checked=\"checked\""; ?> />&nbsp;
+ </td>
+ <td><b><?=gettext("Enable Static ARP entries");?></b></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>
+ <span class="red">
+ <strong><?=gettext("Note:");?></strong>
+ </span>
+ <?=gettext("This option persists even if DHCP server is disabled. Only the machines listed below will be able to communicate with the firewall on this NIC.");?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+
+ if (!is_numeric($pool) && !($act == "newpool")): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Time format change"); ?></td>
+ <td width="78%" class="vtable">
+ <table summary="time format">
+ <tr>
+ <td>
+ <input name="dhcpleaseinlocaltime" type="checkbox" id="dhcpleaseinlocaltime" value="yes" <?php if ($pconfig['dhcpleaseinlocaltime']) echo "checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <strong>
+ <?=gettext("Change DHCP display lease time from UTC to local time."); ?>
+ </strong>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>
+ <span class="red">
+ <strong><?=gettext("Note:");?></strong>
+ </span>
+ <?=gettext("By default DHCP leases are displayed in UTC time. By checking this box DHCP lease time will be displayed in local time and set to time zone selected. This will be used for all DHCP interfaces lease time."); ?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Dynamic DNS");?></td>
+ <td width="78%" class="vtable">
+ <div id="showddnsbox" <?php if ($pconfig['ddnsupdate'] || !empty($pconfig['ddnsdomain']) || !empty($pconfig['ddnsdomainprimary']) || !empty($pconfig['ddnsdomainkeyname']) || !empty($pconfig['ddnsdomainkey'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_ddns_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Dynamic DNS");?>
+ </div>
+ <div id="showddns" <?php if (!$pconfig['ddnsupdate'] && empty($pconfig['ddnsdomain']) && empty($pconfig['ddnsdomainprimary']) && empty($pconfig['ddnsdomainkeyname']) && empty($pconfig['ddnsdomainkey'])) echo "style='display:none'"; ?>>
+ <input style="vertical-align:middle" type="checkbox" value="yes" name="ddnsupdate" id="ddnsupdate" <?php if ($pconfig['ddnsupdate']) echo " checked=\"checked\""; ?> />&nbsp;
+ <b><?=gettext("Enable registration of DHCP client names in DNS.");?></b><br />
+ <br/>
+ <input name="ddnsdomain" type="text" class="formfld unknown" id="ddnsdomain" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomain']);?>" /><br />
+ <?=gettext("Note: Leave blank to disable dynamic DNS registration.");?><br />
+ <?=gettext("Enter the dynamic DNS domain which will be used to register client names in the DNS server.");?><br />
+ <input name="ddnsdomainprimary" type="text" class="formfld unknown" id="ddnsdomainprimary" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainprimary']);?>" /><br />
+ <?=gettext("Enter the primary domain name server IP address for the dynamic domain name.");?><br />
+ <input name="ddnsdomainkeyname" type="text" class="formfld unknown" id="ddnsdomainkeyname" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkeyname']);?>" /><br />
+ <?=gettext("Enter the dynamic DNS domain key name which will be used to register client names in the DNS server.");?><br />
+ <input name="ddnsdomainkey" type="text" class="formfld unknown" id="ddnsdomainkey" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkey']);?>" /><br />
+ <?=gettext("Enter the dynamic DNS domain key secret which will be used to register client names in the DNS server.");?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("MAC Address Control");?></td>
+ <td width="78%" class="vtable">
+ <div id="showmaccontrolbox" <?php if (!empty($pconfig['mac_allow']) || !empty($pconfig['mac_deny'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_maccontrol_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show MAC Address Control");?>
+ </div>
+ <div id="showmaccontrol" <?php if (empty($pconfig['mac_allow']) && empty($pconfig['mac_deny'])) echo "style='display:none'"; ?>>
+ <input name="mac_allow" type="text" class="formfld unknown" id="mac_allow" size="20" value="<?=htmlspecialchars($pconfig['mac_allow']);?>" /><br />
+ <?=gettext("Enter a list of partial MAC addresses to allow, comma separated, no spaces, such as ");?>00:00:00,01:E5:FF<br />
+ <input name="mac_deny" type="text" class="formfld unknown" id="mac_deny" size="20" value="<?=htmlspecialchars($pconfig['mac_deny']);?>" /><br />
+ <?=gettext("Enter a list of partial MAC addresses to deny access, comma separated, no spaces, such as ");?>00:00:00,01:E5:FF
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NTP servers");?></td>
+ <td width="78%" class="vtable">
+ <div id="showntpbox" <?php if (!empty($pconfig['ntp1']) || !empty($pconfig['ntp2'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_ntp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show NTP configuration");?>
+ </div>
+ <div id="showntp" <?php if (empty($pconfig['ntp1']) && empty($pconfig['ntp2'])) echo "style='display:none'"; ?>>
+ <input name="ntp1" type="text" class="formfld unknown" id="ntp1" size="20" value="<?=htmlspecialchars($pconfig['ntp1']);?>" /><br />
+ <input name="ntp2" type="text" class="formfld unknown" id="ntp2" size="20" value="<?=htmlspecialchars($pconfig['ntp2']);?>" />
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("TFTP server");?></td>
+ <td width="78%" class="vtable">
+ <div id="showtftpbox" <?php if (!empty($pconfig['tftp'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_tftp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show TFTP configuration");?>
+ </div>
+ <div id="showtftp" <?php if (empty($pconfig['tftp'])) echo "style='display:none'"; ?>>
+ <input name="tftp" type="text" class="formfld unknown" id="tftp" size="50" value="<?=htmlspecialchars($pconfig['tftp']);?>" /><br />
+ <?=gettext("Leave blank to disable. Enter a full hostname or IP for the TFTP server.");?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("LDAP URI");?></td>
+ <td width="78%" class="vtable">
+ <div id="showldapbox" <?php if (!empty($pconfig['ldap'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_ldap_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show LDAP configuration");?>
+ </div>
+ <div id="showldap" <?php if (empty($pconfig['ldap'])) echo "style='display:none'"; ?>>
+ <input name="ldap" type="text" class="formfld unknown" id="ldap" size="80" value="<?=htmlspecialchars($pconfig['ldap']);?>" /><br />
+ <?=gettext("Leave blank to disable. Enter a full URI for the LDAP server in the form ldap://ldap.example.com/dc=example,dc=com");?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Enable network booting");?></td>
+ <td width="78%" class="vtable">
+ <div id="shownetbootbox" <?php if ($pconfig['netboot'] || !empty($pconfig['nextserver']) || !empty($pconfig['filename']) || !empty($pconfig['filename32']) || !empty($pconfig['filename64']) || !empty($pconfig['rootpath'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_netboot_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Network booting");?>
+ </div>
+ <div id="shownetboot" <?php if (!$pconfig['netboot'] && empty($pconfig['nextserver']) && empty($pconfig['filename']) && empty($pconfig['filename32']) && empty($pconfig['filename64']) && empty($pconfig['rootpath'])) echo "style='display:none'"; ?>>
+ <input style="vertical-align:middle" type="checkbox" value="yes" name="netboot" id="netboot" <?php if ($pconfig['netboot']) echo " checked=\"checked\""; ?> />&nbsp;
+ <b><?=gettext("Enables network booting.");?></b>
+ <br/>
+ <table border="0" cellspacing="0" cellpadding="2" summary="network booting">
+ <tr>
+ <td>
+ <?=gettext("Enter the IP of the"); ?> <b><?=gettext("next-server"); ?></b>
+ </td>
+ <td>
+ <input name="nextserver" type="text" class="formfld unknown" id="nextserver" size="20" value="<?=htmlspecialchars($pconfig['nextserver']);?>" /><br />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <?=gettext("and the default bios filename");?>
+ </td>
+ <td>
+ <input name="filename" type="text" class="formfld unknown" id="filename" size="20" value="<?=htmlspecialchars($pconfig['filename']);?>" /><br />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <?=gettext("and the UEFI 32bit filename ");?>
+ </td>
+ <td>
+ <input name="filename32" type="text" class="formfld unknown" id="filename32" size="20" value="<?=htmlspecialchars($pconfig['filename32']);?>" /><br />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <?=gettext("and the UEFI 64bit filename ");?>
+ </td>
+ <td>
+ <input name="filename64" type="text" class="formfld unknown" id="filename64" size="20" value="<?=htmlspecialchars($pconfig['filename64']);?>" /><br />
+ </td>
+ </tr>
+ </table>
+ <?=gettext("Note: You need both a filename and a boot server configured for this to work!");?>
+ <?=gettext("You will need all three filenames and a boot server configured for UEFI to work!");?>
+ <?=gettext("Enter the"); ?> <b><?=gettext("root-path"); ?></b>-<?=gettext("string");?>
+ <input name="rootpath" type="text" class="formfld unknown" id="rootpath" size="90" value="<?=htmlspecialchars($pconfig['rootpath']);?>" /><br />
+ <?=gettext("Note: string-format: iscsi:(servername):(protocol):(port):(LUN):targetname");?>
+ </div>
+ </td>
+ </tr>
+<?php
+ if (!is_numeric($pool) && !($act == "newpool")):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Additional BOOTP/DHCP Options");?></td>
+ <td width="78%" class="vtable">
+ <div id="shownumbervaluebox" <?php if (!empty($pconfig['numberoptions'])) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_shownumbervalue()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Additional BOOTP/DHCP Options");?>
+ </div>
+ <div id="shownumbervalue" <?php if (empty($pconfig['numberoptions'])) echo "style='display:none'"; ?>>
+ <table id="maintable" summary="bootp-dhcp options">
+ <tbody>
+ <tr>
+ <td colspan="3">
+ <div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp">
+ <?=gettext("Enter the DHCP option number and the value for each item you would like to include in the DHCP lease information. For a list of available options please visit this"); ?> <a href="http://www.iana.org/assignments/bootp-dhcp-parameters/" target="_blank"><?=gettext("URL"); ?></a>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td><div id="onecolumn"><?=gettext("Number");?></div></td>
+ <td><div id="twocolumn"><?=gettext("Type");?></div></td>
+ <td><div id="threecolumn"><?=gettext("Value");?></div></td>
+ </tr>
+<?php
+ $counter = 0;
+ if ($pconfig['numberoptions']):
+ foreach ($pconfig['numberoptions']['item'] as $item):
+ $number = $item['number'];
+ $itemtype = $item['type'];
+ $value = $item['value'];
+?>
+ <tr>
+ <td>
+ <input autocomplete="off" name="number<?php echo $counter; ?>" type="text" class="formfld unknown" id="number<?php echo $counter; ?>" size="10" value="<?=htmlspecialchars($number);?>" />
+ </td>
+ <td>
+ <select name="itemtype<?php echo $counter; ?>" class="formselect" id="itemtype<?php echo $counter; ?>">
+<?php
+ foreach ($customitemtypes as $typename => $typedescr) {
+ echo "<option value=\"{$typename}\" ";
+ if ($itemtype == $typename) {
+ echo "selected=\"selected\"";
+ }
+ echo ">" . $typedescr . "</option>";
+ }
+?>
+ </select>
+ </td>
+ <td>
+ <input autocomplete="off" name="value<?php echo $counter; ?>" type="text" class="formfld unknown" id="value<?php echo $counter; ?>" size="40" value="<?=htmlspecialchars($value);?>" />
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $counter++;
+ endforeach;
+ endif; // numberoptions
+?>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
+ </a>
+ <script type="text/javascript">
+ //<![CDATA[
+ field_counter_js = 3;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+ //]]>
+ </script>
+ </div>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <?php if ($act == "newpool"): ?>
+ <input type="hidden" name="act" value="newpool" />
+ <?php endif; ?>
+ <?php if (is_numeric($pool)): ?>
+ <input type="hidden" name="pool" value="<?php echo $pool; ?>" />
+ <?php endif; ?>
+ <input name="if" type="hidden" value="<?=htmlspecialchars($if);?>" />
+ <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <p>
+ <span class="vexpl">
+ <span class="red"><strong><?=gettext("Note:");?>
+ <br />
+ </strong>
+ </span>
+ <?=gettext("The DNS servers entered in"); ?>
+ <a href="system.php"><?=gettext("System: General setup"); ?></a>
+ <?=gettext("(or the"); ?> <a href="services_dnsmasq.php"><?=gettext("DNS forwarder"); ?></a>, <?=gettext("if enabled)"); ?>
+ </span>
+ <span class="vexpl">
+ <?=gettext("will be assigned to clients by the DHCP server."); ?>
+ <br />
+ <br />
+ <?=gettext("The DHCP lease table can be viewed on the"); ?>
+ <a href="status_dhcp_leases.php"><?=gettext("Status: DHCP leases"); ?></a>
+ <?=gettext("page."); ?>
+ <br />
+ </span>
+ </p>
+ </td>
+ </tr>
+ </table>
+<?php
+ if (!is_numeric($pool) && !($act == "newpool")):
+?>
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="static mappings">
+ <tr>
+ <td colspan="5" valign="top" class="listtopic"><?=gettext("DHCP Static Mappings for this interface.");?></td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="7%" class="listhdrr"><?=gettext("Static ARP");?></td>
+ <td width="18%" class="listhdrr"><?=gettext("MAC address");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("IP address");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Hostname");?></td>
+ <td width="30%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17"></td>
+ <td valign="middle">
+ <a href="services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if (is_array($a_maps)):
+ $i = 0;
+ foreach ($a_maps as $mapent):
+?>
+ <tr>
+ <td align="center" class="listlr" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>';">
+ <?php if (isset($mapent['arp_table_static_entry'])): ?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_alert.gif" alt="ARP Table Static Entry" width="17" height="17" border="0" alt="alert" />
+ <?php endif; ?>
+ </td>
+ <td class="listlr" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>';">
+ <?=htmlspecialchars($mapent['mac']);?>
+ </td>
+ <td class="listr" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>';">
+ <?=htmlspecialchars($mapent['ipaddr']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>';">
+ <?=htmlspecialchars($mapent['hostname']);?>&nbsp;
+ </td>
+ <td class="listbg" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>';">
+ <?=htmlspecialchars($mapent['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&amp;id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
+ <td valign="middle"><a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this mapping?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="5"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17"></td>
+ <td valign="middle"><a href="services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+<?php
+ endif;
+?>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dhcp_edit.php b/src/usr/local/www/services_dhcp_edit.php
new file mode 100644
index 0000000..1fc947b
--- /dev/null
+++ b/src/usr/local/www/services_dhcp_edit.php
@@ -0,0 +1,625 @@
+<?php
+/* $Id$ */
+/*
+ services_dhcp_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/sbin/arp
+ pfSense_MODULE: dhcpserver
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dhcpserver-editstaticmapping
+##|*NAME=Services: DHCP Server : Edit static mapping page
+##|*DESCR=Allow access to the 'Services: DHCP Server : Edit static mapping' page.
+##|*MATCH=services_dhcp_edit.php*
+##|-PRIV
+
+function staticmapcmp($a, $b) {
+ return ipcmp($a['ipaddr'], $b['ipaddr']);
+}
+
+function staticmaps_sort($ifgui) {
+ global $g, $config;
+
+ usort($config['dhcpd'][$ifgui]['staticmap'], "staticmapcmp");
+}
+
+require_once('globals.inc');
+
+if (!$g['services_dhcp_server_enable']) {
+ header("Location: /");
+ exit;
+}
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_dhcp.php');
+}
+
+$if = $_GET['if'];
+if ($_POST['if']) {
+ $if = $_POST['if'];
+}
+
+if (!$if) {
+ header("Location: services_dhcp.php");
+ exit;
+}
+
+if (!is_array($config['dhcpd'])) {
+ $config['dhcpd'] = array();
+}
+if (!is_array($config['dhcpd'][$if])) {
+ $config['dhcpd'][$if] = array();
+}
+if (!is_array($config['dhcpd'][$if]['staticmap'])) {
+ $config['dhcpd'][$if]['staticmap'] = array();
+}
+
+if (!is_array($config['dhcpd'][$if]['pool'])) {
+ $config['dhcpd'][$if]['pool'] = array();
+}
+$a_pools = &$config['dhcpd'][$if]['pool'];
+
+$static_arp_enabled=isset($config['dhcpd'][$if]['staticarp']);
+$netboot_enabled=isset($config['dhcpd'][$if]['netboot']);
+$a_maps = &$config['dhcpd'][$if]['staticmap'];
+$ifcfgip = get_interface_ip($if);
+$ifcfgsn = get_interface_subnet($if);
+$ifcfgdescr = convert_friendly_interface_to_friendly_descr($if);
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_maps[$id]) {
+ $pconfig['mac'] = $a_maps[$id]['mac'];
+ $pconfig['cid'] = $a_maps[$id]['cid'];
+ $pconfig['hostname'] = $a_maps[$id]['hostname'];
+ $pconfig['ipaddr'] = $a_maps[$id]['ipaddr'];
+ $pconfig['filename'] = $a_maps[$id]['filename'];
+ $pconfig['rootpath'] = $a_maps[$id]['rootpath'];
+ $pconfig['descr'] = $a_maps[$id]['descr'];
+ $pconfig['arp_table_static_entry'] = isset($a_maps[$id]['arp_table_static_entry']);
+ $pconfig['deftime'] = $a_maps[$id]['defaultleasetime'];
+ $pconfig['maxtime'] = $a_maps[$id]['maxleasetime'];
+ $pconfig['gateway'] = $a_maps[$id]['gateway'];
+ $pconfig['domain'] = $a_maps[$id]['domain'];
+ $pconfig['domainsearchlist'] = $a_maps[$id]['domainsearchlist'];
+ list($pconfig['wins1'], $pconfig['wins2']) = $a_maps[$id]['winsserver'];
+ list($pconfig['dns1'], $pconfig['dns2'], $pconfig['dns3'], $pconfig['dns4']) = $a_maps[$id]['dnsserver'];
+ $pconfig['ddnsdomain'] = $a_maps[$id]['ddnsdomain'];
+ $pconfig['ddnsdomainprimary'] = $a_maps[$id]['ddnsdomainprimary'];
+ $pconfig['ddnsdomainkeyname'] = $a_maps[$id]['ddnsdomainkeyname'];
+ $pconfig['ddnsdomainkey'] = $a_maps[$id]['ddnsdomainkey'];
+ $pconfig['ddnsupdate'] = isset($a_maps[$id]['ddnsupdate']);
+ list($pconfig['ntp1'], $pconfig['ntp2']) = $a_maps[$id]['ntpserver'];
+ $pconfig['tftp'] = $a_maps[$id]['tftp'];
+} else {
+ $pconfig['mac'] = $_GET['mac'];
+ $pconfig['cid'] = $_GET['cid'];
+ $pconfig['hostname'] = $_GET['hostname'];
+ $pconfig['filename'] = $_GET['filename'];
+ $pconfig['rootpath'] = $_GET['rootpath'];
+ $pconfig['descr'] = $_GET['descr'];
+ $pconfig['arp_table_static_entry'] = $_GET['arp_table_static_entry'];
+ $pconfig['deftime'] = $_GET['defaultleasetime'];
+ $pconfig['maxtime'] = $_GET['maxleasetime'];
+ $pconfig['gateway'] = $_GET['gateway'];
+ $pconfig['domain'] = $_GET['domain'];
+ $pconfig['domainsearchlist'] = $_GET['domainsearchlist'];
+ $pconfig['wins1'] = $_GET['wins1'];
+ $pconfig['wins2'] = $_GET['wins2'];
+ $pconfig['dns1'] = $_GET['dns1'];
+ $pconfig['dns2'] = $_GET['dns2'];
+ $pconfig['dns3'] = $_GET['dns3'];
+ $pconfig['dns4'] = $_GET['dns4'];
+ $pconfig['ddnsdomain'] = $_GET['ddnsdomain'];
+ $pconfig['ddnsdomainprimary'] = $_GET['ddnsdomainprimary'];
+ $pconfig['ddnsdomainkeyname'] = $_GET['ddnsdomainkeyname'];
+ $pconfig['ddnsdomainkey'] = $_GET['ddnsdomainkey'];
+ $pconfig['ddnsupdate'] = isset($_GET['ddnsupdate']);
+ $pconfig['ntp1'] = $_GET['ntp1'];
+ $pconfig['ntp2'] = $_GET['ntp2'];
+ $pconfig['tftp'] = $_GET['tftp'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = array();
+ $reqdfieldsn = array();
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ /* either MAC or Client-ID must be specified */
+ if (empty($_POST['mac']) && empty($_POST['cid'])) {
+ $input_errors[] = gettext("Either MAC address or Client identifier must be specified");
+ }
+
+ /* normalize MAC addresses - lowercase and convert Windows-ized hyphenated MACs to colon delimited */
+ $_POST['mac'] = strtolower(str_replace("-", ":", $_POST['mac']));
+
+ if ($_POST['hostname']) {
+ preg_match("/\-\$/", $_POST['hostname'], $matches);
+ if ($matches) {
+ $input_errors[] = gettext("The hostname cannot end with a hyphen according to RFC952");
+ }
+ if (!is_hostname($_POST['hostname'])) {
+ $input_errors[] = gettext("The hostname can only contain the characters A-Z, 0-9 and '-'.");
+ } else {
+ if (!is_unqualified_hostname($_POST['hostname'])) {
+ $input_errors[] = gettext("A valid hostname is specified, but the domain name part should be omitted");
+ }
+ }
+ }
+ if (($_POST['ipaddr'] && !is_ipaddr($_POST['ipaddr']))) {
+ $input_errors[] = gettext("A valid IP address must be specified.");
+ }
+ if (($_POST['mac'] && !is_macaddr($_POST['mac']))) {
+ $input_errors[] = gettext("A valid MAC address must be specified.");
+ }
+ if ($static_arp_enabled && !$_POST['ipaddr']) {
+ $input_errors[] = gettext("Static ARP is enabled. You must specify an IP address.");
+ }
+
+ /* check for overlaps */
+ foreach ($a_maps as $mapent) {
+ if (isset($id) && ($a_maps[$id]) && ($a_maps[$id] === $mapent)) {
+ continue;
+ }
+ /* The fully qualified hostname (hostname + '.' + domainname) must be unique.
+ * The unqualified hostname does not have to be unique as long as the fully
+ * qualified hostname is unique. */
+ $existingFqn = "{$mapent['hostname']}.{$mapent['domain']}";
+ $candidateFqn = "{$_POST['hostname']}.{$_POST['domain']}";
+ if ((($existingFqn == $candidateFqn) && $mapent['hostname']) ||
+ (($mapent['mac'] == $_POST['mac']) && $mapent['mac']) ||
+ (($mapent['ipaddr'] == $_POST['ipaddr']) && $mapent['ipaddr']) ||
+ (($mapent['cid'] == $_POST['cid']) && $mapent['cid'])) {
+ $input_errors[] = gettext("This fully qualified hostname (Hostname + Domainname), IP, MAC address or Client identifier already exists.");
+ break;
+ }
+ }
+
+ /* make sure it's not within the dynamic subnet */
+ if ($_POST['ipaddr']) {
+ $dynsubnet_start = ip2ulong($config['dhcpd'][$if]['range']['from']);
+ $dynsubnet_end = ip2ulong($config['dhcpd'][$if]['range']['to']);
+ if ((ip2ulong($_POST['ipaddr']) >= $dynsubnet_start) &&
+ (ip2ulong($_POST['ipaddr']) <= $dynsubnet_end)) {
+ $input_errors[] = sprintf(gettext("The IP address must not be within the DHCP range for this interface."));
+ }
+
+ foreach ($a_pools as $pidx => $p) {
+ if (is_inrange_v4($_POST['ipaddr'], $p['range']['from'], $p['range']['to'])) {
+ $input_errors[] = gettext("The IP address must not be within the range configured on a DHCP pool for this interface.");
+ break;
+ }
+ }
+
+ $lansubnet_start = ip2ulong(long2ip32(ip2long($ifcfgip) & gen_subnet_mask_long($ifcfgsn)));
+ $lansubnet_end = ip2ulong(long2ip32(ip2long($ifcfgip) | (~gen_subnet_mask_long($ifcfgsn))));
+ if ((ip2ulong($_POST['ipaddr']) < $lansubnet_start) ||
+ (ip2ulong($_POST['ipaddr']) > $lansubnet_end)) {
+ $input_errors[] = sprintf(gettext("The IP address must lie in the %s subnet."), $ifcfgdescr);
+ }
+ }
+
+ if (($_POST['gateway'] && !is_ipaddrv4($_POST['gateway']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for the gateway.");
+ }
+ if (($_POST['wins1'] && !is_ipaddrv4($_POST['wins1'])) || ($_POST['wins2'] && !is_ipaddrv4($_POST['wins2']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for the primary/secondary WINS servers.");
+ }
+
+ $parent_ip = get_interface_ip($POST['if']);
+ if (is_ipaddrv4($parent_ip) && $_POST['gateway']) {
+ $parent_sn = get_interface_subnet($_POST['if']);
+ if (!ip_in_subnet($_POST['gateway'], gen_subnet($parent_ip, $parent_sn) . "/" . $parent_sn) && !ip_in_interface_alias_subnet($_POST['if'], $_POST['gateway'])) {
+ $input_errors[] = sprintf(gettext("The gateway address %s does not lie within the chosen interface's subnet."), $_POST['gateway']);
+ }
+ }
+ if (($_POST['dns1'] && !is_ipaddrv4($_POST['dns1'])) ||
+ ($_POST['dns2'] && !is_ipaddrv4($_POST['dns2'])) ||
+ ($_POST['dns3'] && !is_ipaddrv4($_POST['dns3'])) ||
+ ($_POST['dns4'] && !is_ipaddrv4($_POST['dns4']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for each of the DNS servers.");
+ }
+
+ if ($_POST['deftime'] && (!is_numeric($_POST['deftime']) || ($_POST['deftime'] < 60))) {
+ $input_errors[] = gettext("The default lease time must be at least 60 seconds.");
+ }
+ if ($_POST['maxtime'] && (!is_numeric($_POST['maxtime']) || ($_POST['maxtime'] < 60) || ($_POST['maxtime'] <= $_POST['deftime']))) {
+ $input_errors[] = gettext("The maximum lease time must be at least 60 seconds and higher than the default lease time.");
+ }
+ if (($_POST['ddnsdomain'] && !is_domain($_POST['ddnsdomain']))) {
+ $input_errors[] = gettext("A valid domain name must be specified for the dynamic DNS registration.");
+ }
+ if (($_POST['ddnsdomain'] && !is_ipaddrv4($_POST['ddnsdomainprimary']))) {
+ $input_errors[] = gettext("A valid primary domain name server IP address must be specified for the dynamic domain name.");
+ }
+ if (($_POST['ddnsdomainkey'] && !$_POST['ddnsdomainkeyname']) ||
+ ($_POST['ddnsdomainkeyname'] && !$_POST['ddnsdomainkey'])) {
+ $input_errors[] = gettext("You must specify both a valid domain key and key name.");
+ }
+ if ($_POST['domainsearchlist']) {
+ $domain_array=preg_split("/[ ;]+/", $_POST['domainsearchlist']);
+ foreach ($domain_array as $curdomain) {
+ if (!is_domain($curdomain)) {
+ $input_errors[] = gettext("A valid domain search list must be specified.");
+ break;
+ }
+ }
+ }
+
+ if (($_POST['ntp1'] && !is_ipaddrv4($_POST['ntp1'])) || ($_POST['ntp2'] && !is_ipaddrv4($_POST['ntp2']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for the primary/secondary NTP servers.");
+ }
+ if ($_POST['tftp'] && !is_ipaddrv4($_POST['tftp']) && !is_domain($_POST['tftp']) && !is_URL($_POST['tftp'])) {
+ $input_errors[] = gettext("A valid IP address or hostname must be specified for the TFTP server.");
+ }
+ if (($_POST['nextserver'] && !is_ipaddrv4($_POST['nextserver']))) {
+ $input_errors[] = gettext("A valid IP address must be specified for the network boot server.");
+ }
+
+ if (!$input_errors) {
+ $mapent = array();
+ $mapent['mac'] = $_POST['mac'];
+ $mapent['cid'] = $_POST['cid'];
+ $mapent['ipaddr'] = $_POST['ipaddr'];
+ $mapent['hostname'] = $_POST['hostname'];
+ $mapent['descr'] = $_POST['descr'];
+ $mapent['arp_table_static_entry'] = ($_POST['arp_table_static_entry']) ? true : false;
+ $mapent['filename'] = $_POST['filename'];
+ $mapent['rootpath'] = $_POST['rootpath'];
+ $mapent['defaultleasetime'] = $_POST['deftime'];
+ $mapent['maxleasetime'] = $_POST['maxtime'];
+
+ unset($mapent['winsserver']);
+ if ($_POST['wins1']) {
+ $mapent['winsserver'][] = $_POST['wins1'];
+ }
+ if ($_POST['wins2']) {
+ $mapent['winsserver'][] = $_POST['wins2'];
+ }
+
+ unset($mapent['dnsserver']);
+ if ($_POST['dns1']) {
+ $mapent['dnsserver'][] = $_POST['dns1'];
+ }
+ if ($_POST['dns2']) {
+ $mapent['dnsserver'][] = $_POST['dns2'];
+ }
+ if ($_POST['dns3']) {
+ $mapent['dnsserver'][] = $_POST['dns3'];
+ }
+ if ($_POST['dns4']) {
+ $mapent['dnsserver'][] = $_POST['dns4'];
+ }
+
+ $mapent['gateway'] = $_POST['gateway'];
+ $mapent['domain'] = $_POST['domain'];
+ $mapent['domainsearchlist'] = $_POST['domainsearchlist'];
+ $mapent['ddnsdomain'] = $_POST['ddnsdomain'];
+ $mapent['ddnsdomainprimary'] = $_POST['ddnsdomainprimary'];
+ $mapent['ddnsdomainkeyname'] = $_POST['ddnsdomainkeyname'];
+ $mapent['ddnsdomainkey'] = $_POST['ddnsdomainkey'];
+ $mapent['ddnsupdate'] = ($_POST['ddnsupdate']) ? true : false;
+
+ unset($mapent['ntpserver']);
+ if ($_POST['ntp1']) {
+ $mapent['ntpserver'][] = $_POST['ntp1'];
+ }
+ if ($_POST['ntp2']) {
+ $mapent['ntpserver'][] = $_POST['ntp2'];
+ }
+
+ $mapent['tftp'] = $_POST['tftp'];
+ $mapent['ldap'] = $_POST['ldap'];
+
+ if (isset($id) && $a_maps[$id]) {
+ $a_maps[$id] = $mapent;
+ } else {
+ $a_maps[] = $mapent;
+ }
+ staticmaps_sort($if);
+
+ write_config();
+
+ if (isset($config['dhcpd'][$if]['enable'])) {
+ mark_subsystem_dirty('staticmaps');
+ if (isset($config['dnsmasq']['enable']) && isset($config['dnsmasq']['regdhcpstatic'])) {
+ mark_subsystem_dirty('hosts');
+ }
+ if (isset($config['unbound']['enable']) && isset($config['unbound']['regdhcpstatic'])) {
+ mark_subsystem_dirty('unbound');
+ }
+ }
+
+ header("Location: services_dhcp.php?if={$if}");
+ exit;
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Services"), gettext("DHCP"), gettext("Edit static mapping"));
+$shortcut_section = "dhcp";
+
+include("head.inc");
+
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+ function show_ddns_config() {
+ document.getElementById("showddnsbox").innerHTML='';
+ aodiv = document.getElementById('showddns');
+ aodiv.style.display = "block";
+ }
+
+ function show_ntp_config() {
+ document.getElementById("showntpbox").innerHTML='';
+ aodiv = document.getElementById('showntp');
+ aodiv.style.display = "block";
+ }
+
+ function show_tftp_config() {
+ document.getElementById("showtftpbox").innerHTML='';
+ aodiv = document.getElementById('showtftp');
+ aodiv.style.display = "block";
+ }
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="services_dhcp_edit.php" method="post" name="iform" id="iform">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="static mapping">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=sprintf(gettext("Static DHCP Mapping on %s"), $ifcfgdescr);?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("MAC address");?></td>
+ <td width="78%" class="vtable">
+ <input name="mac" type="text" class="formfld unknown" id="mac" size="30" value="<?=htmlspecialchars($pconfig['mac']);?>" />
+ <?php
+ $ip = getenv('REMOTE_ADDR');
+ $mac = `/usr/sbin/arp -an | grep {$ip} | cut -d" " -f4`;
+ $mac = str_replace("\n", "", $mac);
+ ?>
+ <a onclick="document.forms[0].mac.value='<?=$mac?>';" href="#"><?=gettext("Copy my MAC address");?></a>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Client identifier");?></td>
+ <td width="78%" class="vtable">
+ <input name="cid" type="text" class="formfld unknown" id="cid" size="30" value="<?=htmlspecialchars($pconfig['cid']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IP address");?></td>
+ <td width="78%" class="vtable">
+ <input name="ipaddr" type="text" class="formfld unknown" id="ipaddr" size="20" value="<?=htmlspecialchars($pconfig['ipaddr']);?>" />
+ <br />
+ <?=gettext("If an IPv4 address is entered, the address must be outside of the pool.");?>
+ <br />
+ <?=gettext("If no IPv4 address is given, one will be dynamically allocated from the pool.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hostname");?></td>
+ <td width="78%" class="vtable">
+ <input name="hostname" type="text" class="formfld unknown" id="hostname" size="20" value="<?=htmlspecialchars($pconfig['hostname']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Name of the host, without domain part.");?>
+ </span>
+ </td>
+ </tr>
+<?php
+ if ($netboot_enabled) {
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell">Netboot Filename</td>
+ <td width="78%" class="vtable">
+ <input name="filename" type="text" class="formfld unknown" id="filename" size="20" value="<?=htmlspecialchars($pconfig['filename']);?>" />
+ <br />
+ <span class="vexpl">Name of the file that should be loaded when this host boots off of the network, overrides setting on main page.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">Root Path</td>
+ <td width="78%" class="vtable">
+ <input name="rootpath" type="text" class="formfld unknown" id="rootpath" size="90" value="<?=htmlspecialchars($pconfig['rootpath']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Enter the"); ?> <b><?=gettext("root-path"); ?></b>-<?=gettext("string");?>, overrides setting on main page.
+ </span>
+ </td>
+ </tr>
+<?php
+ }
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed).");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("ARP Table Static Entry");?></td>
+ <td width="78%" class="vtable">
+ <input name="arp_table_static_entry" id="arp_table_static_entry" type="checkbox" value="yes" <?php if ($pconfig['arp_table_static_entry']) echo "checked=\"checked\""; ?> />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Create an ARP Table Static Entry for this MAC &amp; IP Address pair. ");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("WINS servers");?></td>
+ <td width="78%" class="vtable">
+ <input name="wins1" type="text" class="formfld unknown" id="wins1" size="20" value="<?=htmlspecialchars($pconfig['wins1']);?>" /><br />
+ <input name="wins2" type="text" class="formfld unknown" id="wins2" size="20" value="<?=htmlspecialchars($pconfig['wins2']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers");?></td>
+ <td width="78%" class="vtable">
+ <input name="dns1" type="text" class="formfld unknown" id="dns1" size="20" value="<?=htmlspecialchars($pconfig['dns1']);?>" /><br />
+ <input name="dns2" type="text" class="formfld unknown" id="dns2" size="20" value="<?=htmlspecialchars($pconfig['dns2']);?>" /><br />
+ <input name="dns3" type="text" class="formfld unknown" id="dns3" size="20" value="<?=htmlspecialchars($pconfig['dns3']);?>" /><br />
+ <input name="dns4" type="text" class="formfld unknown" id="dns4" size="20" value="<?=htmlspecialchars($pconfig['dns4']);?>" /><br />
+ <?=gettext("NOTE: leave blank to use the system default DNS servers - this interface's IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the General page.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Gateway");?></td>
+ <td width="78%" class="vtable">
+ <input name="gateway" type="text" class="formfld host" id="gateway" size="20" value="<?=htmlspecialchars($pconfig['gateway']);?>" /><br />
+ <?=gettext("The default is to use the IP on this interface of the firewall as the gateway. Specify an alternate gateway here if this is not the correct gateway for your network.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Domain name");?></td>
+ <td width="78%" class="vtable">
+ <input name="domain" type="text" class="formfld unknown" id="domain" size="20" value="<?=htmlspecialchars($pconfig['domain']);?>" /><br />
+ <?=gettext("The default is to use the domain name of this system as the default domain name provided by DHCP. You may specify an alternate domain name here.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Domain search list");?></td>
+ <td width="78%" class="vtable">
+ <input name="domainsearchlist" type="text" class="formfld unknown" id="domainsearchlist" size="20" value="<?=htmlspecialchars($pconfig['domainsearchlist']);?>" /><br />
+ <?=gettext("The DHCP server can optionally provide a domain search list. Use the semicolon character as separator ");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Default lease time");?></td>
+ <td width="78%" class="vtable">
+ <input name="deftime" type="text" class="formfld unknown" id="deftime" size="10" value="<?=htmlspecialchars($pconfig['deftime']);?>" />
+ <?=gettext("seconds");?><br />
+ <?=gettext("This is used for clients that do not ask for a specific expiration time."); ?><br />
+ <?=gettext("The default is 7200 seconds.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Maximum lease time");?></td>
+ <td width="78%" class="vtable">
+ <input name="maxtime" type="text" class="formfld unknown" id="maxtime" size="10" value="<?=htmlspecialchars($pconfig['maxtime']);?>" />
+ <?=gettext("seconds");?><br />
+ <?=gettext("This is the maximum lease time for clients that ask for a specific expiration time."); ?><br />
+ <?=gettext("The default is 86400 seconds.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Dynamic DNS");?></td>
+ <td width="78%" class="vtable">
+ <div id="showddnsbox">
+ <input type="button" onclick="show_ddns_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Dynamic DNS");?>
+ </div>
+ <div id="showddns" style="display:none">
+ <input style="vertical-align:middle" type="checkbox" value="yes" name="ddnsupdate" id="ddnsupdate" <?php if ($pconfig['ddnsupdate']) echo "checked=\"checked\""; ?> />&nbsp;
+ <b><?=gettext("Enable registration of DHCP client names in DNS.");?></b><br />
+ <p>
+ <input name="ddnsdomain" type="text" class="formfld unknown" id="ddnsdomain" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomain']);?>" /><br />
+ <?=gettext("Note: Leave blank to disable dynamic DNS registration.");?><br />
+ <?=gettext("Enter the dynamic DNS domain which will be used to register client names in the DNS server.");?><br />
+ <input name="ddnsdomainprimary" type="text" class="formfld unknown" id="ddnsdomainprimary" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainprimary']);?>" /><br />
+ <?=gettext("Enter the primary domain name server IP address for the dynamic domain name.");?><br />
+ <input name="ddnsdomainkeyname" type="text" class="formfld unknown" id="ddnsdomainkeyname" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkeyname']);?>" /><br />
+ <?=gettext("Enter the dynamic DNS domain key name which will be used to register client names in the DNS server.");?><br />
+ <input name="ddnsdomainkey" type="text" class="formfld unknown" id="ddnsdomainkey" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkey']);?>" /><br />
+ <?=gettext("Enter the dynamic DNS domain key secret which will be used to register client names in the DNS server.");?>
+ </p>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NTP servers");?></td>
+ <td width="78%" class="vtable">
+ <div id="showntpbox">
+ <input type="button" onclick="show_ntp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show NTP configuration");?>
+ </div>
+ <div id="showntp" style="display:none">
+ <input name="ntp1" type="text" class="formfld unknown" id="ntp1" size="20" value="<?=htmlspecialchars($pconfig['ntp1']);?>" /><br />
+ <input name="ntp2" type="text" class="formfld unknown" id="ntp2" size="20" value="<?=htmlspecialchars($pconfig['ntp2']);?>" />
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("TFTP server");?></td>
+ <td width="78%" class="vtable">
+ <div id="showtftpbox">
+ <input type="button" onclick="show_tftp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show TFTP configuration");?>
+ </div>
+ <div id="showtftp" style="display:none">
+ <input name="tftp" type="text" class="formfld unknown" id="tftp" size="50" value="<?=htmlspecialchars($pconfig['tftp']);?>" /><br />
+ <?=gettext("Leave blank to disable. Enter a full hostname or IP for the TFTP server.");?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_maps[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ <input name="if" type="hidden" value="<?=htmlspecialchars($if);?>" />
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dhcp_relay.php b/src/usr/local/www/services_dhcp_relay.php
new file mode 100644
index 0000000..ae69c3a
--- /dev/null
+++ b/src/usr/local/www/services_dhcp_relay.php
@@ -0,0 +1,216 @@
+<?php
+/*
+ services_dhcp_relay.php
+
+ Copyright (C) 2003-2004 Justin Ellison <justin@techadvise.com>.
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dhcprelay
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dhcprelay
+##|*NAME=Services: DHCP Relay page
+##|*DESCR=Allow access to the 'Services: DHCP Relay' page.
+##|*MATCH=services_dhcp_relay.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$pconfig['enable'] = isset($config['dhcrelay']['enable']);
+if (empty($config['dhcrelay']['interface'])) {
+ $pconfig['interface'] = array();
+} else {
+ $pconfig['interface'] = explode(",", $config['dhcrelay']['interface']);
+}
+$pconfig['server'] = $config['dhcrelay']['server'];
+$pconfig['agentoption'] = isset($config['dhcrelay']['agentoption']);
+
+$iflist = get_configured_interface_with_descr();
+
+/* set the enabled flag which will tell us if DHCP server is enabled
+ * on any interface. We will use this to disable dhcp-relay since
+ * the two are not compatible with each other.
+ */
+$dhcpd_enabled = false;
+if (is_array($config['dhcpd'])) {
+ foreach ($config['dhcpd'] as $dhcpif => $dhcp) {
+ if (isset($dhcp['enable']) && isset($config['interfaces'][$dhcpif]['enable'])) {
+ $dhcpd_enabled = true;
+ break;
+ }
+ }
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['enable']) {
+ $reqdfields = explode(" ", "server interface");
+ $reqdfieldsn = array(gettext("Destination Server"), gettext("Interface"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['server']) {
+ $checksrv = explode(",", $_POST['server']);
+ foreach ($checksrv as $srv) {
+ if (!is_ipaddr($srv)) {
+ $input_errors[] = gettext("A valid Destination Server IP address must be specified.");
+ }
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ $config['dhcrelay']['enable'] = $_POST['enable'] ? true : false;
+ $config['dhcrelay']['interface'] = implode(",", $_POST['interface']);
+ $config['dhcrelay']['agentoption'] = $_POST['agentoption'] ? true : false;
+ $config['dhcrelay']['server'] = $_POST['server'];
+
+ write_config();
+
+ $retval = 0;
+ $retval = services_dhcrelay_configure();
+ $savemsg = get_std_save_message($retval);
+
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Services"), gettext("DHCP Relay"));
+$shortcut_section = "dhcp";
+include("head.inc");
+
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+function enable_change(enable_over) {
+ if (document.iform.enable.checked || enable_over) {
+ document.iform.server.disabled = 0;
+ document.iform.interface.disabled = 0;
+ document.iform.agentoption.disabled = 0;
+ } else {
+ document.iform.server.disabled = 1;
+ document.iform.interface.disabled = 1;
+ document.iform.agentoption.disabled = 1;
+ }
+}
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_dhcp_relay.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp relay">
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+<?php
+ if ($dhcpd_enabled) {
+ echo "<td>DHCP Server is currently enabled. Cannot enable the DHCP Relay service while the DHCP Server is enabled on any interface.";
+ echo "</td></tr></table></div></td></tr></table></form>";
+ include("fend.inc");
+ echo "</body></html>";
+ exit;
+ }
+?>
+
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("DHCP Relay configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Enable</td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
+ <strong><?php printf(gettext("Enable DHCP relay on interface"));?></strong>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Interface(s)</td>
+ <td width="78%" class="vtable">
+ <select id="interface" name="interface[]" multiple="multiple" class="formselect" size="3">
+ <?php
+ foreach ($iflist as $ifent => $ifdesc) {
+ if (!is_ipaddr(get_interface_ip($ifent))) {
+ continue;
+ }
+ echo "<option value=\"{$ifent}\"";
+ if (in_array($ifent, $pconfig['interface'])) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdesc}</option>\n";
+ }
+ ?>
+ </select>
+ <br />Interfaces without an IP address will not be shown.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="agentoption" type="checkbox" value="yes" <?php if ($pconfig['agentoption']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Append circuit ID and agent ID to requests"); ?></strong><br />
+ <?php printf(gettext("If this is checked, the DHCP relay will append the circuit ID (%s interface number) and the agent ID to the DHCP request."), $g['product_name']); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination server");?></td>
+ <td width="78%" class="vtable">
+ <input name="server" type="text" class="formfld unknown" id="server" size="20" value="<?=htmlspecialchars($pconfig['server']);?>" />
+ <br />
+ <?=gettext("This is the IP address of the server to which DHCP requests are relayed. You can enter multiple server IP addresses, separated by commas.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dhcpv6.php b/src/usr/local/www/services_dhcpv6.php
new file mode 100644
index 0000000..51a6ada
--- /dev/null
+++ b/src/usr/local/www/services_dhcpv6.php
@@ -0,0 +1,995 @@
+<?php
+/* $Id$ */
+/*
+ services_dhcpv6.php
+ parts of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dhcpv6server
+##|*NAME=Services: DHCPv6 server page
+##|*DESCR=Allow access to the 'Services: DHCPv6 server' page.
+##|*MATCH=services_dhcpv6.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter.inc");
+
+if (!$g['services_dhcp_server_enable']) {
+ header("Location: /");
+ exit;
+}
+
+/* Fix failover DHCP problem
+ * http://article.gmane.org/gmane.comp.security.firewalls.pfsense.support/18749
+ */
+ini_set("memory_limit", "64M");
+
+$if = $_GET['if'];
+if ($_POST['if']) {
+ $if = $_POST['if'];
+}
+
+/* if OLSRD is enabled, allow WAN to house DHCP. */
+if ($config['installedpackages']['olsrd']) {
+ foreach ($config['installedpackages']['olsrd']['config'] as $olsrd) {
+ if ($olsrd['enable']) {
+ $is_olsr_enabled = true;
+ break;
+ }
+ }
+}
+
+$iflist = get_configured_interface_with_descr();
+$iflist = array_merge($iflist, get_configured_pppoe_server_interfaces());
+
+/* set the starting interface */
+if (!$if || !isset($iflist[$if])) {
+ foreach ($iflist as $ifent => $ifname) {
+ $oc = $config['interfaces'][$ifent];
+ if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
+ (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
+ continue;
+ }
+ $if = $ifent;
+ break;
+ }
+}
+
+if (is_array($config['dhcpdv6'][$if])) {
+ /* DHCPv6 */
+ if (is_array($config['dhcpdv6'][$if]['range'])) {
+ $pconfig['range_from'] = $config['dhcpdv6'][$if]['range']['from'];
+ $pconfig['range_to'] = $config['dhcpdv6'][$if]['range']['to'];
+ }
+ if (is_array($config['dhcpdv6'][$if]['prefixrange'])) {
+ $pconfig['prefixrange_from'] = $config['dhcpdv6'][$if]['prefixrange']['from'];
+ $pconfig['prefixrange_to'] = $config['dhcpdv6'][$if]['prefixrange']['to'];
+ $pconfig['prefixrange_length'] = $config['dhcpdv6'][$if]['prefixrange']['prefixlength'];
+ }
+ $pconfig['deftime'] = $config['dhcpdv6'][$if]['defaultleasetime'];
+ $pconfig['maxtime'] = $config['dhcpdv6'][$if]['maxleasetime'];
+ $pconfig['domain'] = $config['dhcpdv6'][$if]['domain'];
+ $pconfig['domainsearchlist'] = $config['dhcpdv6'][$if]['domainsearchlist'];
+ list($pconfig['wins1'], $pconfig['wins2']) = $config['dhcpdv6'][$if]['winsserver'];
+ list($pconfig['dns1'], $pconfig['dns2'], $pconfig['dns3'], $pconfig['dns4']) = $config['dhcpdv6'][$if]['dnsserver'];
+ $pconfig['enable'] = isset($config['dhcpdv6'][$if]['enable']);
+ $pconfig['ddnsdomain'] = $config['dhcpdv6'][$if]['ddnsdomain'];
+ $pconfig['ddnsdomainprimary'] = $config['dhcpdv6'][$if]['ddnsdomainprimary'];
+ $pconfig['ddnsdomainkeyname'] = $config['dhcpdv6'][$if]['ddnsdomainkeyname'];
+ $pconfig['ddnsdomainkey'] = $config['dhcpdv6'][$if]['ddnsdomainkey'];
+ $pconfig['ddnsupdate'] = isset($config['dhcpdv6'][$if]['ddnsupdate']);
+ list($pconfig['ntp1'], $pconfig['ntp2']) = $config['dhcpdv6'][$if]['ntpserver'];
+ $pconfig['tftp'] = $config['dhcpdv6'][$if]['tftp'];
+ $pconfig['ldap'] = $config['dhcpdv6'][$if]['ldap'];
+ $pconfig['netboot'] = isset($config['dhcpdv6'][$if]['netboot']);
+ $pconfig['bootfile_url'] = $config['dhcpdv6'][$if]['bootfile_url'];
+ $pconfig['netmask'] = $config['dhcpdv6'][$if]['netmask'];
+ $pconfig['numberoptions'] = $config['dhcpdv6'][$if]['numberoptions'];
+ $pconfig['dhcpv6leaseinlocaltime'] = $config['dhcpdv6'][$if]['dhcpv6leaseinlocaltime'];
+ if (!is_array($config['dhcpdv6'][$if]['staticmap'])) {
+ $config['dhcpdv6'][$if]['staticmap'] = array();
+ }
+ $a_maps = &$config['dhcpdv6'][$if]['staticmap'];
+}
+
+$ifcfgip = get_interface_ipv6($if);
+$ifcfgsn = get_interface_subnetv6($if);
+
+/* set the enabled flag which will tell us if DHCP relay is enabled
+ * on any interface. We will use this to disable DHCP server since
+ * the two are not compatible with each other.
+ */
+
+$dhcrelay_enabled = false;
+$dhcrelaycfg = $config['dhcrelay6'];
+
+if (is_array($dhcrelaycfg)) {
+ foreach ($dhcrelaycfg as $dhcrelayif => $dhcrelayifconf) {
+ if (isset($dhcrelayifconf['enable']) && isset($iflist[$dhcrelayif]) &&
+ (!link_interface_to_bridge($dhcrelayif))) {
+ $dhcrelay_enabled = true;
+ }
+ }
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+
+ $old_dhcpdv6_enable = ($pconfig['enable'] == true);
+ $new_dhcpdv6_enable = ($_POST['enable'] ? true : false);
+ $dhcpdv6_enable_changed = ($old_dhcpdv6_enable != $new_dhcpdv6_enable);
+
+ $pconfig = $_POST;
+
+ $numberoptions = array();
+ for ($x = 0; $x < 99; $x++) {
+ if (isset($_POST["number{$x}"]) && ctype_digit($_POST["number{$x}"])) {
+ $numbervalue = array();
+ $numbervalue['number'] = htmlspecialchars($_POST["number{$x}"]);
+ $numbervalue['value'] = htmlspecialchars($_POST["value{$x}"]);
+ $numberoptions['item'][] = $numbervalue;
+ }
+ }
+ // Reload the new pconfig variable that the forum uses.
+ $pconfig['numberoptions'] = $numberoptions;
+
+ /* input validation */
+ if ($_POST['enable']) {
+ $reqdfields = explode(" ", "range_from range_to");
+ $reqdfieldsn = array(gettext("Range begin"), gettext("Range end"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_POST['prefixrange_from'] && !is_ipaddrv6($_POST['prefixrange_from']))) {
+ $input_errors[] = gettext("A valid range must be specified.");
+ }
+ if (($_POST['prefixrange_to'] && !is_ipaddrv6($_POST['prefixrange_to']))) {
+ $input_errors[] = gettext("A valid prefix range must be specified.");
+ }
+ if (($_POST['range_from'] && !is_ipaddrv6($_POST['range_from']))) {
+ $input_errors[] = gettext("A valid range must be specified.");
+ }
+ if (($_POST['range_to'] && !is_ipaddrv6($_POST['range_to']))) {
+ $input_errors[] = gettext("A valid range must be specified.");
+ }
+ if (($_POST['gateway'] && !is_ipaddrv6($_POST['gateway']))) {
+ $input_errors[] = gettext("A valid IPv6 address must be specified for the gateway.");
+ }
+ if (($_POST['dns1'] && !is_ipaddrv6($_POST['dns1'])) ||
+ ($_POST['dns2'] && !is_ipaddrv6($_POST['dns2'])) ||
+ ($_POST['dns3'] && !is_ipaddrv6($_POST['dns3'])) ||
+ ($_POST['dns4'] && !is_ipaddrv6($_POST['dns4']))) {
+ $input_errors[] = gettext("A valid IPv6 address must be specified for each of the DNS servers.");
+ }
+
+ if ($_POST['deftime'] && (!is_numeric($_POST['deftime']) || ($_POST['deftime'] < 60))) {
+ $input_errors[] = gettext("The default lease time must be at least 60 seconds.");
+ }
+ if ($_POST['maxtime'] && (!is_numeric($_POST['maxtime']) || ($_POST['maxtime'] < 60) || ($_POST['maxtime'] <= $_POST['deftime']))) {
+ $input_errors[] = gettext("The maximum lease time must be at least 60 seconds and higher than the default lease time.");
+ }
+ if (($_POST['ddnsdomain'] && !is_domain($_POST['ddnsdomain']))) {
+ $input_errors[] = gettext("A valid domain name must be specified for the dynamic DNS registration.");
+ }
+ if (($_POST['ddnsdomain'] && !is_ipaddrv4($_POST['ddnsdomainprimary']))) {
+ $input_errors[] = gettext("A valid primary domain name server IPv4 address must be specified for the dynamic domain name.");
+ }
+ if (($_POST['ddnsdomainkey'] && !$_POST['ddnsdomainkeyname']) ||
+ ($_POST['ddnsdomainkeyname'] && !$_POST['ddnsdomainkey'])) {
+ $input_errors[] = gettext("You must specify both a valid domain key and key name.");
+ }
+ if ($_POST['domainsearchlist']) {
+ $domain_array=preg_split("/[ ;]+/", $_POST['domainsearchlist']);
+ foreach ($domain_array as $curdomain) {
+ if (!is_domain($curdomain)) {
+ $input_errors[] = gettext("A valid domain search list must be specified.");
+ break;
+ }
+ }
+ }
+
+ if (($_POST['ntp1'] && !is_ipaddrv6($_POST['ntp1'])) || ($_POST['ntp2'] && !is_ipaddrv6($_POST['ntp2']))) {
+ $input_errors[] = gettext("A valid IPv6 address must be specified for the primary/secondary NTP servers.");
+ }
+ if (($_POST['domain'] && !is_domain($_POST['domain']))) {
+ $input_errors[] = gettext("A valid domain name must be specified for the DNS domain.");
+ }
+ if ($_POST['tftp'] && !is_ipaddr($_POST['tftp']) && !is_domain($_POST['tftp']) && !is_URL($_POST['tftp'])) {
+ $input_errors[] = gettext("A valid IPv6 address or hostname must be specified for the TFTP server.");
+ }
+ if (($_POST['bootfile_url'] && !is_URL($_POST['bootfile_url']))) {
+ $input_errors[] = gettext("A valid URL must be specified for the network bootfile.");
+ }
+
+ // Disallow a range that includes the virtualip
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['interface'] == $if) {
+ if ($vip['subnetv6'] && is_inrange_v6($vip['subnetv6'], $_POST['range_from'], $_POST['range_to'])) {
+ $input_errors[] = sprintf(gettext("The subnet range cannot overlap with virtual IPv6 address %s."), $vip['subnetv6']);
+ }
+ }
+ }
+ }
+
+ $noip = false;
+ if (is_array($a_maps)) {
+ foreach ($a_maps as $map) {
+ if (empty($map['ipaddrv6'])) {
+ $noip = true;
+ }
+ }
+ }
+ if (!$input_errors) {
+ /* make sure the range lies within the current subnet */
+ $subnet_start = gen_subnetv6($ifcfgip, $ifcfgsn);
+ $subnet_end = gen_subnetv6_max($ifcfgip, $ifcfgsn);
+
+ if (is_ipaddrv6($ifcfgip)) {
+ if ((!is_inrange_v6($_POST['range_from'], $subnet_start, $subnet_end)) ||
+ (!is_inrange_v6($_POST['range_to'], $subnet_start, $subnet_end))) {
+ $input_errors[] = gettext("The specified range lies outside of the current subnet.");
+ }
+ }
+ /* "from" cannot be higher than "to" */
+ if (inet_pton($_POST['range_from']) > inet_pton($_POST['range_to'])) {
+ $input_errors[] = gettext("The range is invalid (first element higher than second element).");
+ }
+
+ /* make sure that the DHCP Relay isn't enabled on this interface */
+ if (isset($config['dhcrelay'][$if]['enable'])) {
+ $input_errors[] = sprintf(gettext("You must disable the DHCP relay on the %s interface before enabling the DHCP server."), $iflist[$if]);
+ }
+
+
+ /* Verify static mappings do not overlap:
+ - available DHCP range
+ - prefix delegation range (FIXME: still need to be completed) */
+ $dynsubnet_start = inet_pton($_POST['range_from']);
+ $dynsubnet_end = inet_pton($_POST['range_to']);
+
+ if (is_array($a_maps)) {
+ foreach ($a_maps as $map) {
+ if (empty($map['ipaddrv6'])) {
+ continue;
+ }
+ if ((inet_pton($map['ipaddrv6']) > $dynsubnet_start) &&
+ (inet_pton($map['ipaddrv6']) < $dynsubnet_end)) {
+ $input_errors[] = sprintf(gettext("The DHCP range cannot overlap any static DHCP mappings."));
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ if (!is_array($config['dhcpdv6'][$if])) {
+ $config['dhcpdv6'][$if] = array();
+ }
+ if (!is_array($config['dhcpdv6'][$if]['range'])) {
+ $config['dhcpdv6'][$if]['range'] = array();
+ }
+ if (!is_array($config['dhcpdv6'][$if]['prefixrange'])) {
+ $config['dhcpdv6'][$if]['prefixrange'] = array();
+ }
+
+ $config['dhcpdv6'][$if]['range']['from'] = $_POST['range_from'];
+ $config['dhcpdv6'][$if]['range']['to'] = $_POST['range_to'];
+ $config['dhcpdv6'][$if]['prefixrange']['from'] = $_POST['prefixrange_from'];
+ $config['dhcpdv6'][$if]['prefixrange']['to'] = $_POST['prefixrange_to'];
+ $config['dhcpdv6'][$if]['prefixrange']['prefixlength'] = $_POST['prefixrange_length'];
+ $config['dhcpdv6'][$if]['defaultleasetime'] = $_POST['deftime'];
+ $config['dhcpdv6'][$if]['maxleasetime'] = $_POST['maxtime'];
+ $config['dhcpdv6'][$if]['netmask'] = $_POST['netmask'];
+
+ unset($config['dhcpdv6'][$if]['winsserver']);
+
+ unset($config['dhcpdv6'][$if]['dnsserver']);
+ if ($_POST['dns1']) {
+ $config['dhcpdv6'][$if]['dnsserver'][] = $_POST['dns1'];
+ }
+ if ($_POST['dns2']) {
+ $config['dhcpdv6'][$if]['dnsserver'][] = $_POST['dns2'];
+ }
+ if ($_POST['dns3']) {
+ $config['dhcpdv6'][$if]['dnsserver'][] = $_POST['dns3'];
+ }
+ if ($_POST['dns4']) {
+ $config['dhcpdv6'][$if]['dnsserver'][] = $_POST['dns4'];
+ }
+
+ $config['dhcpdv6'][$if]['domain'] = $_POST['domain'];
+ $config['dhcpdv6'][$if]['domainsearchlist'] = $_POST['domainsearchlist'];
+ $config['dhcpdv6'][$if]['enable'] = ($_POST['enable']) ? true : false;
+ $config['dhcpdv6'][$if]['ddnsdomain'] = $_POST['ddnsdomain'];
+ $config['dhcpdv6'][$if]['ddnsdomainprimary'] = $_POST['ddnsdomainprimary'];
+ $config['dhcpdv6'][$if]['ddnsdomainkeyname'] = $_POST['ddnsdomainkeyname'];
+ $config['dhcpdv6'][$if]['ddnsdomainkey'] = $_POST['ddnsdomainkey'];
+ $config['dhcpdv6'][$if]['ddnsupdate'] = ($_POST['ddnsupdate']) ? true : false;
+
+ unset($config['dhcpdv6'][$if]['ntpserver']);
+ if ($_POST['ntp1']) {
+ $config['dhcpdv6'][$if]['ntpserver'][] = $_POST['ntp1'];
+ }
+ if ($_POST['ntp2']) {
+ $config['dhcpdv6'][$if]['ntpserver'][] = $_POST['ntp2'];
+ }
+
+ $config['dhcpdv6'][$if]['tftp'] = $_POST['tftp'];
+ $config['dhcpdv6'][$if]['ldap'] = $_POST['ldap'];
+ $config['dhcpdv6'][$if]['netboot'] = ($_POST['netboot']) ? true : false;
+ $config['dhcpdv6'][$if]['bootfile_url'] = $_POST['bootfile_url'];
+ $config['dhcpdv6'][$if]['dhcpv6leaseinlocaltime'] = $_POST['dhcpv6leaseinlocaltime'];
+
+ // Handle the custom options rowhelper
+ if (isset($config['dhcpdv6'][$if]['numberoptions']['item'])) {
+ unset($config['dhcpdv6'][$if]['numberoptions']['item']);
+ }
+
+ $config['dhcpdv6'][$if]['numberoptions'] = $numberoptions;
+
+ write_config();
+
+ $retval = 0;
+ $retvaldhcp = 0;
+ $retvaldns = 0;
+ /* Stop DHCPv6 so we can cleanup leases */
+ killbypid("{$g['dhcpd_chroot_path']}{$g['varrun_path']}/dhcpdv6.pid");
+ // dhcp_clean_leases();
+ /* dnsmasq_configure calls dhcpd_configure */
+ /* no need to restart dhcpd twice */
+ if (isset($config['dnsmasq']['enable']) && isset($config['dnsmasq']['regdhcpstatic'])) {
+ $retvaldns = services_dnsmasq_configure();
+ if ($retvaldns == 0) {
+ clear_subsystem_dirty('hosts');
+ clear_subsystem_dirty('staticmaps');
+ }
+ } else if (isset($config['unbound']['enable']) && isset($config['unbound']['regdhcpstatic'])) {
+ $retvaldns = services_unbound_configure();
+ if ($retvaldns == 0) {
+ clear_subsystem_dirty('unbound');
+ clear_subsystem_dirty('staticmaps');
+ }
+ } else {
+ $retvaldhcp = services_dhcpd_configure();
+ if ($retvaldhcp == 0) {
+ clear_subsystem_dirty('staticmaps');
+ }
+ }
+ if ($dhcpdv6_enable_changed) {
+ $retvalfc = filter_configure();
+ }
+ if ($retvaldhcp == 1 || $retvaldns == 1 || $retvalfc == 1) {
+ $retval = 1;
+ }
+ $savemsg = get_std_save_message($retval);
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_maps[$_GET['id']]) {
+ unset($a_maps[$_GET['id']]);
+ write_config();
+ if (isset($config['dhcpdv6'][$if]['enable'])) {
+ mark_subsystem_dirty('staticmapsv6');
+ if (isset($config['dnsmasq']['enable']) && isset($config['dnsmasq']['regdhcpstaticv6'])) {
+ mark_subsystem_dirty('hosts');
+ }
+ }
+ header("Location: services_dhcpv6.php?if={$if}");
+ exit;
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Services"), gettext("DHCPv6 server"));
+$shortcut_section = "dhcp6";
+
+include("head.inc");
+
+?>
+
+<script type="text/javascript" src="/javascript/row_helper.js">
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+ rowname[0] = "number";
+ rowtype[0] = "textbox";
+ rowsize[0] = "10";
+ rowname[1] = "value";
+ rowtype[1] = "textbox";
+ rowsize[1] = "55";
+//]]>
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+ function enable_change(enable_over) {
+ var endis;
+ endis = !(document.iform.enable.checked || enable_over);
+ document.iform.range_from.disabled = endis;
+ document.iform.range_to.disabled = endis;
+ document.iform.prefixrange_from.disabled = endis;
+ document.iform.prefixrange_to.disabled = endis;
+ document.iform.prefixrange_length.disabled = endis;
+ document.iform.dns1.disabled = endis;
+ document.iform.dns2.disabled = endis;
+ document.iform.dns3.disabled = endis;
+ document.iform.dns4.disabled = endis;
+ document.iform.deftime.disabled = endis;
+ document.iform.maxtime.disabled = endis;
+ //document.iform.gateway.disabled = endis;
+ document.iform.dhcpv6leaseinlocaltime.disabled = endis;
+ document.iform.domain.disabled = endis;
+ document.iform.domainsearchlist.disabled = endis;
+ document.iform.ddnsdomain.disabled = endis;
+ document.iform.ddnsdomainprimary.disabled = endis;
+ document.iform.ddnsdomainkeyname.disabled = endis;
+ document.iform.ddnsdomainkey.disabled = endis;
+ document.iform.ddnsupdate.disabled = endis;
+ document.iform.ntp1.disabled = endis;
+ document.iform.ntp2.disabled = endis;
+ //document.iform.tftp.disabled = endis;
+ document.iform.ldap.disabled = endis;
+ document.iform.netboot.disabled = endis;
+ document.iform.bootfile_url.disabled = endis;
+ }
+
+ function show_shownumbervalue() {
+ document.getElementById("shownumbervaluebox").innerHTML='';
+ aodiv = document.getElementById('shownumbervalue');
+ aodiv.style.display = "block";
+ }
+
+ function show_ddns_config() {
+ document.getElementById("showddnsbox").innerHTML='';
+ aodiv = document.getElementById('showddns');
+ aodiv.style.display = "block";
+ }
+ function show_ntp_config() {
+ document.getElementById("showntpbox").innerHTML='';
+ aodiv = document.getElementById('showntp');
+ aodiv.style.display = "block";
+ }
+ /*
+ function show_tftp_config() {
+ document.getElementById("showtftpbox").innerHTML='';
+ aodiv = document.getElementById('showtftp');
+ aodiv.style.display = "block";
+ }
+ */
+ function show_ldap_config() {
+ document.getElementById("showldapbox").innerHTML='';
+ aodiv = document.getElementById('showldap');
+ aodiv.style.display = "block";
+ }
+
+ function show_netboot_config() {
+ document.getElementById("shownetbootbox").innerHTML='';
+ aodiv = document.getElementById('shownetboot');
+ aodiv.style.display = "block";
+ }
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_dhcpv6.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php
+ if ($dhcrelay_enabled) {
+ echo gettext("DHCP Relay is currently enabled. Cannot enable the DHCP Server service while the DHCP Relay is enabled on any interface.");
+ include("fend.inc");
+ echo "</body>";
+ echo "</html>";
+ exit;
+ }
+?>
+<?php if (is_subsystem_dirty('staticmaps')): ?><p>
+<?php print_info_box_np(gettext("The static mapping configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcpv6 server">
+ <tr>
+ <td>
+<?php
+ /* active tabs */
+ $tab_array = array();
+ $tabscounter = 0;
+ $i = 0;
+ foreach ($iflist as $ifent => $ifname) {
+ $oc = $config['interfaces'][$ifent];
+ if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
+ (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
+ continue;
+ }
+ if ($ifent == $if) {
+ $active = true;
+ } else {
+ $active = false;
+ }
+ $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
+ $tabscounter++;
+ }
+ /* tack on PPPoE or PPtP servers here */
+ /* pppoe server */
+ if (is_array($config['pppoes']['pppoe'])) {
+ foreach ($config['pppoes']['pppoe'] as $pppoe) {
+ if ($pppoe['mode'] == "server") {
+ $ifent = "poes". $pppoe['pppoeid'];
+ $ifname = strtoupper($ifent);
+ if ($ifent == $if) {
+ $active = true;
+ } else {
+ $active = false;
+ }
+ $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
+ $tabscounter++;
+ }
+ }
+ }
+ if ($tabscounter == 0) {
+ echo "<b>" . gettext("The DHCPv6 Server can only be enabled on interfaces configured with a static IPv6 address. This system has none.") . "<br/><br/>";
+ echo "</td></tr></table></form>";
+ include("fend.inc");
+ echo "</body>";
+ echo "</html>";
+ exit;
+ }
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("DHCPv6 Server"), true, "services_dhcpv6.php?if={$if}");
+ $tab_array[] = array(gettext("Router Advertisements"), false, "services_router_advertisements.php?if={$if}");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("DHCPv6 Server");?></td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false);" />
+ <strong><?php printf(gettext("Enable DHCPv6 server on %s interface"), htmlspecialchars($iflist[$if]));?></strong>
+ </td>
+ </tr>
+<?php
+ /* the PPPoE Server could well have no IPv6 address and operate fine with just link-local, just hide these */
+ if (is_ipaddrv6($ifcfgip)) {
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet");?></td>
+ <td width="78%" class="vtable">
+ <?=gen_subnetv6($ifcfgip, $ifcfgsn);?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet mask");?></td>
+ <td width="78%" class="vtable">
+ <?=$ifcfgsn;?> bits
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Available range");?></td>
+ <td width="78%" class="vtable">
+ <?php
+ $range_from = gen_subnetv6($ifcfgip, $ifcfgsn);
+ echo $range_from;
+ ?>
+ -
+ <?php
+ $range_to = gen_subnetv6_max($ifcfgip, $ifcfgsn);
+ echo $range_to;
+ ?>
+ </td>
+ </tr>
+<?php
+ }
+
+ if ($is_olsr_enabled):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet Mask");?></td>
+ <td width="78%" class="vtable">
+ <select name="netmask" class="formselect" id="netmask">
+ <?php
+ for ($i = 128; $i > 0; $i--) {
+ if ($i <> 127) {
+ echo "<option value=\"{$i}\" ";
+ if ($i == $pconfig['netmask']) {
+ echo "selected";
+ }
+ echo ">" . $i . "</option>";
+ }
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Range");?></td>
+ <td width="78%" class="vtable">
+ <input name="range_from" type="text" class="formfld unknown" id="range_from" size="28" value="<?=htmlspecialchars($pconfig['range_from']);?>" />
+ &nbsp;<?=gettext("to"); ?>&nbsp; <input name="range_to" type="text" class="formfld unknown" id="range_to" size="28" value="<?=htmlspecialchars($pconfig['range_to']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Prefix Delegation Range");?></td>
+ <td width="78%" class="vtable">
+ <input name="prefixrange_from" type="text" class="formfld unknown" id="prefixrange_from" size="28" value="<?=htmlspecialchars($pconfig['prefixrange_from']);?>" />
+ &nbsp;<?=gettext("to"); ?>&nbsp; <input name="prefixrange_to" type="text" class="formfld unknown" id="prefixrange_to" size="28" value="<?=htmlspecialchars($pconfig['prefixrange_to']);?>" />
+ &nbsp;<br /><?=gettext("Prefix Delegation Size"); ?>:&nbsp;
+ <select name="prefixrange_length" class="formselect" id="prefixrange_length">
+ <option value="48" <?php if ($pconfig['prefixrange_length'] == 48) echo "selected=\"selected\""; ?>>48</option>
+ <option value="52" <?php if ($pconfig['prefixrange_length'] == 52) echo "selected=\"selected\""; ?>>52</option>
+ <option value="56" <?php if ($pconfig['prefixrange_length'] == 56) echo "selected=\"selected\""; ?>>56</option>
+ <option value="60" <?php if ($pconfig['prefixrange_length'] == 60) echo "selected=\"selected\""; ?>>60</option>
+ <option value="62" <?php if ($pconfig['prefixrange_length'] == 62) echo "selected=\"selected\""; ?>>62</option>
+ <option value="63" <?php if ($pconfig['prefixrange_length'] == 63) echo "selected=\"selected\""; ?>>63</option>
+ <option value="64" <?php if ($pconfig['prefixrange_length'] == 64) echo "selected=\"selected\""; ?>>64</option>
+ </select> <br />
+ <?php echo gettext("You can define a Prefix range here for DHCP Prefix Delegation. This allows for
+ assigning networks to subrouters. The start and end of the range must end on boundaries of the prefix delegation size."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers");?></td>
+ <td width="78%" class="vtable">
+ <input name="dns1" type="text" class="formfld unknown" id="dns1" size="28" value="<?=htmlspecialchars($pconfig['dns1']);?>" /><br />
+ <input name="dns2" type="text" class="formfld unknown" id="dns2" size="28" value="<?=htmlspecialchars($pconfig['dns2']);?>" /><br />
+ <input name="dns3" type="text" class="formfld unknown" id="dns3" size="28" value="<?=htmlspecialchars($pconfig['dns3']);?>" /><br />
+ <input name="dns4" type="text" class="formfld unknown" id="dns4" size="28" value="<?=htmlspecialchars($pconfig['dns4']);?>" /><br />
+ <?=gettext("NOTE: leave blank to use the system default DNS servers - this interface's IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the General page.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Domain name");?></td>
+ <td width="78%" class="vtable">
+ <input name="domain" type="text" class="formfld unknown" id="domain" size="28" value="<?=htmlspecialchars($pconfig['domain']);?>" /><br />
+ <?=gettext("The default is to use the domain name of this system as the default domain name provided by DHCP. You may specify an alternate domain name here.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Domain search list");?></td>
+ <td width="78%" class="vtable">
+ <input name="domainsearchlist" type="text" class="formfld unknown" id="domainsearchlist" size="28" value="<?=htmlspecialchars($pconfig['domainsearchlist']);?>" /><br />
+ <?=gettext("The DHCP server can optionally provide a domain search list. Use the semicolon character as separator");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Default lease time");?></td>
+ <td width="78%" class="vtable">
+ <input name="deftime" type="text" class="formfld unknown" id="deftime" size="10" value="<?=htmlspecialchars($pconfig['deftime']);?>" />
+ <?=gettext("seconds");?><br />
+ <?=gettext("This is used for clients that do not ask for a specific expiration time."); ?><br />
+ <?=gettext("The default is 7200 seconds.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Maximum lease time");?></td>
+ <td width="78%" class="vtable">
+ <input name="maxtime" type="text" class="formfld unknown" id="maxtime" size="10" value="<?=htmlspecialchars($pconfig['maxtime']);?>" />
+ <?=gettext("seconds");?><br />
+ <?=gettext("This is the maximum lease time for clients that ask for a specific expiration time."); ?><br />
+ <?=gettext("The default is 86400 seconds.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Time format change"); ?></td>
+ <td width="78%" class="vtable">
+ <table summary="time format change">
+ <tr>
+ <td>
+ <input name="dhcpv6leaseinlocaltime" type="checkbox" id="dhcpv6leaseinlocaltime" value="yes" <?php if ($pconfig['dhcpv6leaseinlocaltime']) echo "checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <strong>
+ <?=gettext("Change DHCPv6 display lease time from UTC to local time."); ?>
+ </strong>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>
+ <span class="red">
+ <strong><?=gettext("Note:");?></strong>
+ </span>
+ <?=gettext("By default DHCPv6 leases are displayed in UTC time. By checking this box DHCPv6 lease time will be displayed in local time and set to time zone selected. This will be used for all DHCPv6 interfaces lease time."); ?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Dynamic DNS");?></td>
+ <td width="78%" class="vtable">
+ <div id="showddnsbox">
+ <input type="button" onclick="show_ddns_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Dynamic DNS");?>
+ </div>
+ <div id="showddns" style="display:none">
+ <input style="vertical-align:middle" type="checkbox" value="yes" name="ddnsupdate" id="ddnsupdate" <?php if ($pconfig['ddnsupdate']) echo " checked=\"checked\""; ?> />&nbsp;
+ <b><?=gettext("Enable registration of DHCP client names in DNS.");?></b><br />
+ <p>
+ <input name="ddnsdomain" type="text" class="formfld unknown" id="ddnsdomain" size="28" value="<?=htmlspecialchars($pconfig['ddnsdomain']);?>" /><br />
+ <?=gettext("Note: Leave blank to disable dynamic DNS registration.");?><br />
+ <?=gettext("Enter the dynamic DNS domain which will be used to register client names in the DNS server.");?><br />
+ <input name="ddnsdomainprimary" type="text" class="formfld unknown" id="ddnsdomainprimary" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainprimary']);?>" /><br />
+ <?=gettext("Enter the primary domain name server IP address for the dynamic domain name.");?><br />
+ <input name="ddnsdomainkeyname" type="text" class="formfld unknown" id="ddnsdomainkeyname" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkeyname']);?>" /><br />
+ <?=gettext("Enter the dynamic DNS domain key name which will be used to register client names in the DNS server.");?><br />
+ <input name="ddnsdomainkey" type="text" class="formfld unknown" id="ddnsdomainkey" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomainkey']);?>" /><br />
+ <?=gettext("Enter the dynamic DNS domain key secret which will be used to register client names in the DNS server.");?>
+ </p>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NTP servers");?></td>
+ <td width="78%" class="vtable">
+ <div id="showntpbox">
+ <input type="button" onclick="show_ntp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show NTP configuration");?>
+ </div>
+ <div id="showntp" style="display:none">
+ <input name="ntp1" type="text" class="formfld unknown" id="ntp1" size="28" value="<?=htmlspecialchars($pconfig['ntp1']);?>" /><br />
+ <input name="ntp2" type="text" class="formfld unknown" id="ntp2" size="28" value="<?=htmlspecialchars($pconfig['ntp2']);?>" />
+ </div>
+ </td>
+ </tr>
+ <!-- ISC dhcpd does not support tftp for ipv6 yet. See redmine #2016
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("TFTP server");?></td>
+ <td width="78%" class="vtable">
+ <div id="showtftpbox">
+ <input type="button" onclick="show_tftp_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show TFTP configuration");?>
+ </div>
+ <div id="showtftp" style="display:none">
+ <input name="tftp" type="text" class="formfld unknown" id="tftp" size="50" value="<?=htmlspecialchars($pconfig['tftp']);?>" /><br />
+ <?=gettext("Leave blank to disable. Enter a full hostname or IP for the TFTP server.");?>
+ </div>
+ </td>
+ </tr>
+ -->
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("LDAP URI");?></td>
+ <td width="78%" class="vtable">
+ <div id="showldapbox">
+ <input type="button" onclick="show_ldap_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show LDAP configuration");?>
+ </div>
+ <div id="showldap" style="display:none">
+ <input name="ldap" type="text" class="formfld unknown" id="ldap" size="80" value="<?=htmlspecialchars($pconfig['ldap']);?>" /><br />
+ <?=gettext("Leave blank to disable. Enter a full URI for the LDAP server in the form ldap://ldap.example.com/dc=example,dc=com");?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Enable network booting");?></td>
+ <td width="78%" class="vtable">
+ <div id="shownetbootbox">
+ <input type="button" onclick="show_netboot_config()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Network booting");?>
+ </div>
+ <div id="shownetboot" style="display:none">
+ <input style="vertical-align:middle" type="checkbox" value="yes" name="netboot" id="netboot" <?php if ($pconfig['netboot']) echo " checked=\"checked\""; ?> />&nbsp;
+ <b><?=gettext("Enables network booting.");?></b>
+ <br/>
+ <?=gettext("Enter the Bootfile URL");?>
+ <input name="bootfile_url" type="text" class="formfld unknown" id="bootfile_url" size="28" value="<?=htmlspecialchars($pconfig['bootfile_url']);?>" />
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Additional BOOTP/DHCP Options");?></td>
+ <td width="78%" class="vtable">
+ <div id="shownumbervaluebox">
+ <input type="button" onclick="show_shownumbervalue()" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Additional BOOTP/DHCP Options");?>
+ </div>
+ <div id="shownumbervalue" style="display:none">
+ <table id="maintable" summary="bootp-dhcp options">
+ <tbody>
+ <tr>
+ <td colspan="3">
+ <div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp">
+ <?=gettext("Enter the DHCP option number and the value for each item you would like to include in the DHCP lease information. For a list of available options please visit this"); ?> <a href="http://www.iana.org/assignments/bootp-dhcp-parameters/" target="_blank"><?=gettext("URL"); ?></a>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td><div id="onecolumn"><?=gettext("Number");?></div></td>
+ <td><div id="twocolumn"><?=gettext("Value");?></div></td>
+ </tr>
+<?php
+ $counter = 0;
+ if ($pconfig['numberoptions']):
+ foreach ($pconfig['numberoptions']['item'] as $item):
+ $number = $item['number'];
+ $value = $item['value'];
+?>
+ <tr>
+ <td>
+ <input autocomplete="off" name="number<?php echo $counter; ?>" type="text" class="formfld" id="number<?php echo $counter; ?>" size="10" value="<?=htmlspecialchars($number);?>" />
+ </td>
+ <td>
+ <input autocomplete="off" name="value<?php echo $counter; ?>" type="text" class="formfld" id="value<?php echo $counter; ?>" size="55" value="<?=htmlspecialchars($value);?>" />
+ </td>
+ <td>
+ <input type="image" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" onclick="removeRow(this); return false;" value="<?=gettext("Delete");?>" />
+ </td>
+ </tr>
+<?php
+ $counter++;
+ endforeach;
+ endif;
+?>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
+ </a>
+ <script type="text/javascript">
+ //<![CDATA[
+ field_counter_js = 2;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+ //]]>
+ </script>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="if" type="hidden" value="<?=$if;?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <p>
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:");?><br />
+ </strong>
+ </span>
+ <?=gettext("The DNS servers entered in"); ?> <a href="system.php"><?=gettext("System: General setup"); ?></a>\
+ <?=gettext("(or the"); ?> <a href="services_dnsmasq.php"><?=gettext("DNS forwarder"); ?></a>, <?=gettext("if enabled)"); ?>
+ </span>
+ <span class="vexpl">
+ <?=gettext("will be assigned to clients by the DHCP server."); ?><br />
+ <br />
+ <?=gettext("The DHCP lease table can be viewed on the"); ?> <a href="status_dhcpv6_leases.php"><?=gettext("Status: DHCPv6 leases"); ?></a> <?=gettext("page."); ?><br />
+ </span>
+ </p>
+ </td>
+ </tr>
+ </table>
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="static mappings">
+ <tr>
+ <td colspan="4" valign="top" class="listtopic"><?=gettext("DHCPv6 Static Mappings for this interface.");?></td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="25%" class="listhdrr"><?=gettext("DUID");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("IPv6 address");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Hostname");?></td>
+ <td width="30%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17"></td>
+ <td valign="middle">
+ <a href="services_dhcpv6_edit.php?if=<?=$if;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if (is_array($a_maps)):
+ $i = 0;
+ foreach ($a_maps as $mapent):
+ if ($mapent['duid'] <> "" or $mapent['ipaddrv6'] <> ""):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>';">
+ <?=htmlspecialchars($mapent['duid']);?>
+ </td>
+ <td class="listr" ondblclick="document.location='services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>';">
+ <?=htmlspecialchars($mapent['ipaddrv6']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>';">
+ <?=htmlspecialchars($mapent['hostname']);?>&nbsp;
+ </td>
+ <td class="listbg" ondblclick="document.location='services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>';">
+ <?=htmlspecialchars($mapent['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="services_dhcpv6_edit.php?if=<?=$if;?>&amp;id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
+ <td valign="middle"><a href="services_dhcpv6.php?if=<?=$if;?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this mapping?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+ $i++;
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17"></td>
+ <td valign="middle"><a href="services_dhcpv6_edit.php?if=<?=$if;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dhcpv6_edit.php b/src/usr/local/www/services_dhcpv6_edit.php
new file mode 100644
index 0000000..2034049
--- /dev/null
+++ b/src/usr/local/www/services_dhcpv6_edit.php
@@ -0,0 +1,285 @@
+<?php
+/* $Id$ */
+/*
+ services_dhcpv6_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2011 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/sbin/arp
+ pfSense_MODULE: dhcpserver
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dhcpserverv6-editstaticmapping
+##|*NAME=Services: DHCPv6 Server : Edit static mapping page
+##|*DESCR=Allow access to the 'Services: DHCPv6 Server : Edit static mapping' page.
+##|*MATCH=services_dhcpv6_edit.php*
+##|-PRIV
+
+function staticmapcmp($a, $b) {
+ return ipcmp($a['ipaddrv6'], $b['ipaddrv6']);
+}
+
+function staticmaps_sort($ifgui) {
+ global $g, $config;
+
+ usort($config['dhcpdv6'][$ifgui]['staticmap'], "staticmapcmp");
+}
+
+require_once('globals.inc');
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_dhcpv6.php');
+}
+
+if (!$g['services_dhcp_server_enable']) {
+ header("Location: /");
+ exit;
+}
+
+require("guiconfig.inc");
+
+$if = $_GET['if'];
+if ($_POST['if']) {
+ $if = $_POST['if'];
+}
+
+if (!$if) {
+ header("Location: services_dhcpv6.php");
+ exit;
+}
+
+if (!is_array($config['dhcpdv6'])) {
+ $config['dhcpdv6'] = array();
+}
+if (!is_array($config['dhcpdv6'][$if])) {
+ $config['dhcpdv6'][$if] = array();
+}
+if (!is_array($config['dhcpdv6'][$if]['staticmap'])) {
+ $config['dhcpdv6'][$if]['staticmap'] = array();
+}
+
+$netboot_enabled = isset($config['dhcpdv6'][$if]['netboot']);
+$a_maps = &$config['dhcpdv6'][$if]['staticmap'];
+$ifcfgipv6 = get_interface_ipv6($if);
+$ifcfgsnv6 = get_interface_subnetv6($if);
+$ifcfgdescr = convert_friendly_interface_to_friendly_descr($if);
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_maps[$id]) {
+ $pconfig['duid'] = $a_maps[$id]['duid'];
+ $pconfig['hostname'] = $a_maps[$id]['hostname'];
+ $pconfig['ipaddrv6'] = $a_maps[$id]['ipaddrv6'];
+ $pconfig['filename'] = $a_maps[$id]['filename'];
+ $pconfig['rootpath'] = $a_maps[$id]['rootpath'];
+ $pconfig['descr'] = $a_maps[$id]['descr'];
+} else {
+ $pconfig['duid'] = $_GET['duid'];
+ $pconfig['hostname'] = $_GET['hostname'];
+ $pconfig['filename'] = $_GET['filename'];
+ $pconfig['rootpath'] = $a_maps[$id]['rootpath'];
+ $pconfig['descr'] = $_GET['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "duid");
+ $reqdfieldsn = array(gettext("DUID"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['hostname']) {
+ preg_match("/\-\$/", $_POST['hostname'], $matches);
+ if ($matches) {
+ $input_errors[] = gettext("The hostname cannot end with a hyphen according to RFC952");
+ }
+ if (!is_hostname($_POST['hostname'])) {
+ $input_errors[] = gettext("The hostname can only contain the characters A-Z, 0-9 and '-'.");
+ } else {
+ if (!is_unqualified_hostname($_POST['hostname'])) {
+ $input_errors[] = gettext("A valid hostname is specified, but the domain name part should be omitted");
+ }
+ }
+ }
+ if (($_POST['ipaddrv6'] && !is_ipaddrv6($_POST['ipaddrv6']))) {
+ $input_errors[] = gettext("A valid IPv6 address must be specified.");
+ }
+ if (empty($_POST['duid'])) {
+ $input_errors[] = gettext("A valid DUID must be specified.");
+ }
+
+ /* check for overlaps */
+ foreach ($a_maps as $mapent) {
+ if (isset($id) && ($a_maps[$id]) && ($a_maps[$id] === $mapent)) {
+ continue;
+ }
+
+ if ((($mapent['hostname'] == $_POST['hostname']) && $mapent['hostname']) || ($mapent['duid'] == $_POST['duid'])) {
+ $input_errors[] = gettext("This Hostname, IP or DUID already exists.");
+ break;
+ }
+ }
+
+ /* make sure it's not within the dynamic subnet */
+ if ($_POST['ipaddrv6']) {
+ /* oh boy, we need to be able to somehow do this at some point. skip */
+ }
+
+ if (!$input_errors) {
+ $mapent = array();
+ $mapent['duid'] = $_POST['duid'];
+ $mapent['ipaddrv6'] = $_POST['ipaddrv6'];
+ $mapent['hostname'] = $_POST['hostname'];
+ $mapent['descr'] = $_POST['descr'];
+ $mapent['filename'] = $_POST['filename'];
+ $mapent['rootpath'] = $_POST['rootpath'];
+
+ if (isset($id) && $a_maps[$id]) {
+ $a_maps[$id] = $mapent;
+ } else {
+ $a_maps[] = $mapent;
+ }
+ staticmaps_sort($if);
+
+ write_config();
+
+ if (isset($config['dhcpdv6'][$if]['enable'])) {
+ mark_subsystem_dirty('staticmaps');
+ if (isset($config['dnsmasq']['enable']) && isset($config['dnsmasq']['regdhcpstatic'])) {
+ mark_subsystem_dirty('hosts');
+ }
+ if (isset($config['unbound']['enable']) && isset($config['unbound']['regdhcpstatic'])) {
+ mark_subsystem_dirty('unbound');
+ }
+
+ }
+
+ header("Location: services_dhcpv6.php?if={$if}");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("DHCPv6"), gettext("Edit static mapping"));
+$shortcut_section = "dhcp6";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="services_dhcpv6_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="static mapping">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Static DHCPv6 Mapping");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("DUID");?></td>
+ <td width="78%" class="vtable">
+ <input name="duid" type="text" class="formfld unknown" id="duid" size="40" value="<?=htmlspecialchars($pconfig['duid']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter a DUID in the following format: ");?><br />
+"DUID-LLT - ETH -- TIME --- ---- address ----" <br />
+"xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 address");?></td>
+ <td width="78%" class="vtable">
+ <input name="ipaddrv6" type="text" class="formfld unknown" id="ipaddrv6" size="28" value="<?=htmlspecialchars($pconfig['ipaddrv6']);?>" />
+ <br />
+ <?=gettext("If an IPv6 address is entered, the address must be outside of the pool.");?>
+ <br />
+ <?=gettext("If no IPv6 address is given, one will be dynamically allocated from the pool.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hostname");?></td>
+ <td width="78%" class="vtable">
+ <input name="hostname" type="text" class="formfld unknown" id="hostname" size="28" value="<?=htmlspecialchars($pconfig['hostname']);?>" />
+ <br /> <span class="vexpl"><?=gettext("Name of the host, without domain part.");?></span>
+ </td>
+ </tr>
+<?php
+ if ($netboot_enabled) {
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell">Netboot filename</td>
+ <td width="78%" class="vtable">
+ <input name="filename" type="text" class="formfld unknown" id="filename" size="28" value="<?=htmlspecialchars($pconfig['filename']);?>" />
+ <br /> <span class="vexpl">Name of the file that should be loaded when this host boots off of the network, overrides setting on main page.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">Root Path</td>
+ <td width="78%" class="vtable">
+ <input name="rootpath" type="text" class="formfld unknown" id="rootpath" size="90" value="<?=htmlspecialchars($pconfig['rootpath']);?>" />
+ <br /> <span class="vexpl"><?=gettext("Enter the"); ?> <b><?=gettext("root-path"); ?></b>-<?=gettext("string");?>, overrides setting on main page.</span>
+ </td>
+ </tr>
+<?php
+ }
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_maps[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ <input name="if" type="hidden" value="<?=htmlspecialchars($if);?>" />
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dhcpv6_relay.php b/src/usr/local/www/services_dhcpv6_relay.php
new file mode 100644
index 0000000..c6e5daf
--- /dev/null
+++ b/src/usr/local/www/services_dhcpv6_relay.php
@@ -0,0 +1,216 @@
+<?php
+/*
+ services_dhcpv6_relay.php
+
+ Copyright (C) 2003-2004 Justin Ellison <justin@techadvise.com>.
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2010 Seth Mos
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dhcpv6relay
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dhcpv6relay
+##|*NAME=Services: DHCPv6 Relay page
+##|*DESCR=Allow access to the 'Services: DHCPv6 Relay' page.
+##|*MATCH=services_dhcpv6_relay.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$pconfig['enable'] = isset($config['dhcrelay6']['enable']);
+if (empty($config['dhcrelay6']['interface'])) {
+ $pconfig['interface'] = array();
+} else {
+ $pconfig['interface'] = explode(",", $config['dhcrelay6']['interface']);
+}
+$pconfig['server'] = $config['dhcrelay6']['server'];
+$pconfig['agentoption'] = isset($config['dhcrelay6']['agentoption']);
+
+$iflist = get_configured_interface_with_descr();
+
+/* set the enabled flag which will tell us if DHCP server is enabled
+ * on any interface. We will use this to disable dhcp-relay since
+ * the two are not compatible with each other.
+ */
+$dhcpd_enabled = false;
+if (is_array($config['dhcpdv6'])) {
+ foreach ($config['dhcpdv6'] as $dhcp) {
+ if (isset($dhcp['enable']) && isset($config['interfaces'][$dhcpif]['enable'])) {
+ $dhcpd_enabled = true;
+ break;
+ }
+ }
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['enable']) {
+ $reqdfields = explode(" ", "server interface");
+ $reqdfieldsn = array(gettext("Destination Server"), gettext("Interface"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['server']) {
+ $checksrv = explode(",", $_POST['server']);
+ foreach ($checksrv as $srv) {
+ if (!is_ipaddrv6($srv)) {
+ $input_errors[] = gettext("A valid Destination Server IPv6 address must be specified.");
+ }
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ $config['dhcrelay6']['enable'] = $_POST['enable'] ? true : false;
+ $config['dhcrelay6']['interface'] = implode(",", $_POST['interface']);
+ $config['dhcrelay6']['agentoption'] = $_POST['agentoption'] ? true : false;
+ $config['dhcrelay6']['server'] = $_POST['server'];
+
+ write_config();
+
+ $retval = 0;
+ $retval = services_dhcrelay6_configure();
+ $savemsg = get_std_save_message($retval);
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Services"), gettext("DHCPv6 Relay"));
+$shortcut_section = "dhcp6";
+include("head.inc");
+
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+function enable_change(enable_over) {
+ if (document.iform.enable.checked || enable_over) {
+ document.iform.server.disabled = 0;
+ document.iform.interface.disabled = 0;
+ document.iform.agentoption.disabled = 0;
+ } else {
+ document.iform.server.disabled = 1;
+ document.iform.interface.disabled = 1;
+ document.iform.agentoption.disabled = 1;
+ }
+}
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_dhcpv6_relay.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcpv6 relay">
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+<?php
+ if ($dhcpd_enabled) {
+ echo "<td>DHCPv6 Server is currently enabled. Cannot enable the DHCPv6 Relay service while the DHCPv6 Server is enabled on any interface.";
+ echo "</td></tr></table></div></td></tr></table></form>";
+ include("fend.inc");
+ echo "</body></html>";
+ exit;
+ }
+?>
+
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("DHCPv6 Relay configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Enable</td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
+ <strong><?php printf(gettext("Enable DHCPv6 relay on interface"));?></strong>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Interface(s)</td>
+ <td width="78%" class="vtable">
+ <select id="interface" name="interface[]" multiple="multiple" class="formselect" size="3">
+ <?php
+ foreach ($iflist as $ifent => $ifdesc) {
+ if (!is_ipaddrv6(get_interface_ipv6($ifent))) {
+ continue;
+ }
+ echo "<option value=\"{$ifent}\"";
+ if (in_array($ifent, $pconfig['interface'])) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdesc}</option>\n";
+ }
+ ?>
+ </select>
+ <br /><?=gettext("Interfaces without an IPv6 address will not be shown."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="agentoption" type="checkbox" value="yes" <?php if ($pconfig['agentoption']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Append circuit ID and agent ID to requests"); ?></strong><br />
+ <?php printf(gettext("If this is checked, the DHCPv6 relay will append the circuit ID (%s interface number) and the agent ID to the DHCPv6 request."), $g['product_name']); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Destination server");?></td>
+ <td width="78%" class="vtable">
+ <input name="server" type="text" class="formfld unknown" id="server" size="20" value="<?=htmlspecialchars($pconfig['server']);?>" />
+ <br />
+ <?=gettext("This is the IPv6 address of the server to which DHCPv6 requests are relayed. You can enter multiple server IPv6 addresses, separated by commas. ");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dnsmasq.php b/src/usr/local/www/services_dnsmasq.php
new file mode 100644
index 0000000..4abf4d7
--- /dev/null
+++ b/src/usr/local/www/services_dnsmasq.php
@@ -0,0 +1,582 @@
+<?php
+/* $Id$ */
+/*
+ services_dnsmasq.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Bob Zoller <bob@kludgebox.com> and Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dnsforwarder
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dnsforwarder
+##|*NAME=Services: DNS Forwarder page
+##|*DESCR=Allow access to the 'Services: DNS Forwarder' page.
+##|*MATCH=services_dnsmasq.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("system.inc");
+
+$pconfig['enable'] = isset($config['dnsmasq']['enable']);
+$pconfig['regdhcp'] = isset($config['dnsmasq']['regdhcp']);
+$pconfig['regdhcpstatic'] = isset($config['dnsmasq']['regdhcpstatic']);
+$pconfig['dhcpfirst'] = isset($config['dnsmasq']['dhcpfirst']);
+$pconfig['strict_order'] = isset($config['dnsmasq']['strict_order']);
+$pconfig['domain_needed'] = isset($config['dnsmasq']['domain_needed']);
+$pconfig['no_private_reverse'] = isset($config['dnsmasq']['no_private_reverse']);
+$pconfig['port'] = $config['dnsmasq']['port'];
+$pconfig['custom_options'] = $config['dnsmasq']['custom_options'];
+
+$pconfig['strictbind'] = isset($config['dnsmasq']['strictbind']);
+if (!empty($config['dnsmasq']['interface'])) {
+ $pconfig['interface'] = explode(",", $config['dnsmasq']['interface']);
+} else {
+ $pconfig['interface'] = array();
+}
+
+if (!is_array($config['dnsmasq']['hosts'])) {
+ $config['dnsmasq']['hosts'] = array();
+}
+
+if (!is_array($config['dnsmasq']['domainoverrides'])) {
+ $config['dnsmasq']['domainoverrides'] = array();
+}
+
+$a_hosts = &$config['dnsmasq']['hosts'];
+$a_domainOverrides = &$config['dnsmasq']['domainoverrides'];
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+ unset($input_errors);
+
+ $config['dnsmasq']['enable'] = ($_POST['enable']) ? true : false;
+ $config['dnsmasq']['regdhcp'] = ($_POST['regdhcp']) ? true : false;
+ $config['dnsmasq']['regdhcpstatic'] = ($_POST['regdhcpstatic']) ? true : false;
+ $config['dnsmasq']['dhcpfirst'] = ($_POST['dhcpfirst']) ? true : false;
+ $config['dnsmasq']['strict_order'] = ($_POST['strict_order']) ? true : false;
+ $config['dnsmasq']['domain_needed'] = ($_POST['domain_needed']) ? true : false;
+ $config['dnsmasq']['no_private_reverse'] = ($_POST['no_private_reverse']) ? true : false;
+ $config['dnsmasq']['custom_options'] = str_replace("\r\n", "\n", $_POST['custom_options']);
+ $config['dnsmasq']['strictbind'] = ($_POST['strictbind']) ? true : false;
+
+ if (isset($_POST['enable']) && isset($config['unbound']['enable'])) {
+ if ($_POST['port'] == $config['unbound']['port']) {
+ $input_errors[] = "The DNS Resolver is enabled using this port. Choose a non-conflicting port, or disable DNS Resolver.";
+ }
+ }
+
+ if ($_POST['port']) {
+ if (is_port($_POST['port'])) {
+ $config['dnsmasq']['port'] = $_POST['port'];
+ } else {
+ $input_errors[] = gettext("You must specify a valid port number");
+ }
+ } else if (isset($config['dnsmasq']['port'])) {
+ unset($config['dnsmasq']['port']);
+ }
+
+ if (is_array($_POST['interface'])) {
+ $config['dnsmasq']['interface'] = implode(",", $_POST['interface']);
+ } elseif (isset($config['dnsmasq']['interface'])) {
+ unset($config['dnsmasq']['interface']);
+ }
+
+ if ($config['dnsmasq']['custom_options']) {
+ $args = '';
+ foreach (preg_split('/\s+/', $config['dnsmasq']['custom_options']) as $c) {
+ $args .= escapeshellarg("--{$c}") . " ";
+ }
+ exec("/usr/local/sbin/dnsmasq --test $args", $output, $rc);
+ if ($rc != 0) {
+ $input_errors[] = gettext("Invalid custom options");
+ }
+ }
+
+ if (!$input_errors) {
+ write_config();
+
+ $retval = 0;
+ $retval = services_dnsmasq_configure();
+ $savemsg = get_std_save_message($retval);
+
+ // Reload filter (we might need to sync to CARP hosts)
+ filter_configure();
+ /* Update resolv.conf in case the interface bindings exclude localhost. */
+ system_resolvconf_generate();
+ /* Start or restart dhcpleases when it's necessary */
+ system_dhcpleases_configure();
+
+ if ($retval == 0) {
+ clear_subsystem_dirty('hosts');
+ }
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($_GET['type'] == 'host') {
+ if ($a_hosts[$_GET['id']]) {
+ unset($a_hosts[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('hosts');
+ header("Location: services_dnsmasq.php");
+ exit;
+ }
+ }
+ elseif ($_GET['type'] == 'doverride') {
+ if ($a_domainOverrides[$_GET['id']]) {
+ unset($a_domainOverrides[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('hosts');
+ header("Location: services_dnsmasq.php");
+ exit;
+ }
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Services"), gettext("DNS forwarder"));
+$shortcut_section = "forwarder";
+include("head.inc");
+
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+function enable_change(enable_over) {
+ var endis;
+ endis = !(document.iform.enable.checked || enable_over);
+ document.iform.regdhcp.disabled = endis;
+ document.iform.regdhcpstatic.disabled = endis;
+ document.iform.dhcpfirst.disabled = endis;
+}
+function show_advanced_dns() {
+ document.getElementById("showadvbox").innerHTML='';
+ aodiv = document.getElementById('showadv');
+ aodiv.style.display = "block";
+}
+//]]>
+</script>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_dnsmasq.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('hosts')): ?><br/>
+<?php print_info_box_np(gettext("The DNS forwarder configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dns forwarder">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("General DNS Forwarder Options");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Enable");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable'] == "yes") echo "checked=\"checked\"";?> onclick="enable_change(false)" />
+ <strong>
+ <?=gettext("Enable DNS forwarder");?><br />
+ </strong>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("DHCP Registration");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="regdhcp" type="checkbox" id="regdhcp" value="yes" <?php if ($pconfig['regdhcp'] == "yes") echo "checked=\"checked\"";?> />
+ <strong>
+ <?=gettext("Register DHCP leases in DNS forwarder");?><br />
+ </strong>
+ <?php printf(gettext("If this option is set, then machines that specify".
+ " their hostname when requesting a DHCP lease will be registered".
+ " in the DNS forwarder, so that their name can be resolved.".
+ " You should also set the domain in %sSystem:".
+ " General setup%s to the proper value."), '<a href="system.php">', '</a>')?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Static DHCP");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="regdhcpstatic" type="checkbox" id="regdhcpstatic" value="yes" <?php if ($pconfig['regdhcpstatic'] == "yes") echo "checked=\"checked\"";?> />
+ <strong>
+ <?=gettext("Register DHCP static mappings in DNS forwarder");?><br />
+ </strong>
+ <?php printf(gettext("If this option is set, then DHCP static mappings will ".
+ "be registered in the DNS forwarder, so that their name can be ".
+ "resolved. You should also set the domain in %s".
+ "System: General setup%s to the proper value."), '<a href="system.php">', '</a>');?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Prefer DHCP");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="dhcpfirst" type="checkbox" id="dhcpfirst" value="yes" <?php if ($pconfig['dhcpfirst'] == "yes") echo "checked=\"checked\"";?> />
+ <strong>
+ <?=gettext("Resolve DHCP mappings first");?><br />
+ </strong>
+ <?php printf(gettext("If this option is set, then DHCP mappings will ".
+ "be resolved before the manual list of names below. This only ".
+ "affects the name given for a reverse lookup (PTR)."));?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td rowspan="3" width="22%" valign="top" class="vncellreq"><?=gettext("DNS Query Forwarding");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="strict_order" type="checkbox" id="strict_order" value="yes" <?php if ($pconfig['strict_order'] == "yes") echo "checked=\"checked\"";?> />
+ <strong>
+ <?=gettext("Query DNS servers sequentially");?><br />
+ </strong>
+ <?php printf(gettext("If this option is set, %s DNS Forwarder (dnsmasq) will ".
+ "query the DNS servers sequentially in the order specified (<i>System - General Setup - DNS Servers</i>), ".
+ "rather than all at once in parallel. "), $g['product_name']); ?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="domain_needed" type="checkbox" id="domain_needed" value="yes" <?php if ($pconfig['domain_needed'] == "yes") echo "checked=\"checked\"";?> />
+ <strong>
+ <?=gettext("Require domain");?><br />
+ </strong>
+ <?php printf(gettext("If this option is set, %s DNS Forwarder (dnsmasq) will ".
+ "not forward A or AAAA queries for plain names, without dots or domain parts, to upstream name servers. ".
+ "If the name is not known from /etc/hosts or DHCP then a \"not found\" answer is returned. "), $g['product_name']); ?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="no_private_reverse" type="checkbox" id="no_private_reverse" value="yes" <?php if ($pconfig['no_private_reverse'] == "yes") echo "checked=\"checked\"";?> />
+ <strong>
+ <?=gettext("Do not forward private reverse lookups");?><br />
+ </strong>
+ <?php printf(gettext("If this option is set, %s DNS Forwarder (dnsmasq) will ".
+ "not forward reverse DNS lookups (PTR) for private addresses (RFC 1918) to upstream name servers. ".
+ "Any entries in the Domain Overrides section forwarding private \"n.n.n.in-addr.arpa\" names to a specific server are still forwarded. ".
+ "If the IP to name is not known from /etc/hosts, DHCP or a specific domain override then a \"not found\" answer is immediately returned. "), $g['product_name']); ?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Listen Port");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="port" type="text" id="port" size="6" <?php if ($pconfig['port']) echo "value=\"" . htmlspecialchars($pconfig['port']) . "\"";?> />
+ <br /><br />
+ <?=gettext("The port used for responding to DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 53.");?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" rowspan="2" class="vncellreq"><?=gettext("Interfaces"); ?></td>
+ <td width="78%" class="vtable">
+ <?php
+ $interface_addresses = get_possible_listen_ips(true);
+ ?>
+ <?=gettext("Interface IPs used by the DNS Forwarder for responding to queries from clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries to other interface IPs not selected below are discarded. The default behavior is to respond to queries on every available IPv4 and IPv6 address.");?>
+ <br /><br />
+ <select id="interface" name="interface[]" multiple="multiple" class="formselect" size="5">
+ <option value="" <?php if (empty($pconfig['interface']) || empty($pconfig['interface'][0])) echo 'selected="selected"'; ?>>All</option>
+ <?php
+ foreach ($interface_addresses as $laddr => $ldescr):
+ $selected = "";
+ if (in_array($laddr, $pconfig['interface'])) {
+ $selected = 'selected="selected"';
+ }
+ ?>
+ <option value="<?=$laddr;?>" <?=$selected;?>>
+ <?=htmlspecialchars($ldescr);?>
+ </option>
+ <?php
+ endforeach;
+ unset($interface_addresses);
+ ?>
+ </select>
+ <br /><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="strictbind" type="checkbox" id="strictbind" value="yes" <?php if ($pconfig['strictbind'] == "yes") echo "checked=\"checked\"";?> />
+ <strong><?=gettext("Strict Interface Binding");?></strong>
+ <br />
+ <?= gettext("If this option is set, the DNS forwarder will only bind to the interfaces containing the IP addresses selected above, rather than binding to all interfaces and discarding queries to other addresses."); ?>
+ <br /><br />
+ <?= gettext("NOTE: This option does NOT work with IPv6. If set, dnsmasq will not bind to IPv6 addresses."); ?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Advanced");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvbox" <?php if ($pconfig['custom_options']) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_dns()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showadv" <?php if (empty($pconfig['custom_options'])) echo "style='display:none'"; ?>>
+ <strong><?=gettext("Advanced");?><br /></strong>
+ <textarea rows="6" cols="78" name="custom_options" id="custom_options"><?=htmlspecialchars($pconfig['custom_options']);?></textarea><br />
+ <?=gettext("Enter any additional options you would like to add to the dnsmasq configuration here, separated by a space or newline"); ?><br />
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+</table>
+
+<p>
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:");?><br />
+ </strong>
+ </span>
+ <?php printf(gettext("If the DNS forwarder is enabled, the DHCP".
+ " service (if enabled) will automatically serve the LAN IP".
+ " address as a DNS server to DHCP clients so they will use".
+ " the forwarder. The DNS forwarder will use the DNS servers".
+ " entered in %sSystem: General setup%s".
+ " or those obtained via DHCP or PPP on WAN if the &quot;Allow".
+ " DNS server list to be overridden by DHCP/PPP on WAN&quot;".
+ " is checked. If you don't use that option (or if you use".
+ " a static IP address on WAN), you must manually specify at".
+ " least one DNS server on the %sSystem:".
+ "General setup%s page."), '<a href="system.php">', '</a>', '<a href="system.php">', '</a>');?><br />
+ </span>
+</p>
+
+&nbsp;<br />
+<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="host overrides">
+ <tr>
+ <td colspan="5" valign="top" class="listtopic"><?=gettext("Host Overrides");?></td>
+ </tr>
+ <tr>
+ <td>
+ <br />
+ <?=gettext("Entries in this section override individual results from the forwarders.");?>
+ <?=gettext("Use these for changing DNS results or for adding custom DNS records.");?>
+ </td>
+ </tr>
+</table>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" summary="results">
+ <thead>
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Host");?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Domain");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("IP");?></td>
+ <td width="25%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle">
+ <a href="services_dnsmasq_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle">
+ <a href="services_dnsmasq_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+<?php
+ $i = 0;
+ foreach ($a_hosts as $hostent):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
+ <?=strtolower($hostent['host']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
+ <?=strtolower($hostent['domain']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
+ <?=$hostent['ip'];?>&nbsp;
+ </td>
+ <td class="listbg" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($hostent['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="services_dnsmasq_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
+ <td>
+ <a href="services_dnsmasq.php?type=host&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this host?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if ($hostent['aliases']['item'] && is_array($hostent['aliases']['item'])):
+ foreach ($hostent['aliases']['item'] as $alias):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
+ <?=strtolower($alias['host']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
+ <?=strtolower($alias['domain']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
+ Alias for <?=$hostent['host'] ? $hostent['host'] . '.' . $hostent['domain'] : $hostent['domain'];?>&nbsp;
+ </td>
+ <td class="listbg" ondblclick="document.location='services_dnsmasq_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($alias['description']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_dnsmasq_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ </td>
+ </tr>
+<?php
+ endforeach;
+ endif;
+ $i++;
+ endforeach;
+?>
+ <tr style="display:none">
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+<br />
+<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="domain overrides">
+ <tr>
+ <td colspan="5" valign="top" class="listtopic"><?=gettext("Domain Overrides");?></td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <?=gettext("Entries in this area override an entire domain, and subdomains, by specifying an".
+ " authoritative DNS server to be queried for that domain.");?>
+ </p>
+ </td>
+ </tr>
+</table>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" summary="results">
+ <thead>
+ <tr>
+ <td width="35%" class="listhdrr"><?=gettext("Domain");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("IP");?></td>
+ <td width="35%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17" height="17"></td>
+ <td>
+ <a href="services_dnsmasq_domainoverride_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17" height="17"></td>
+ <td>
+ <a href="services_dnsmasq_domainoverride_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+<?php
+ $i = 0;
+ foreach ($a_domainOverrides as $doment):
+?>
+ <tr>
+ <td class="listlr">
+ <?=strtolower($doment['domain']);?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=$doment['ip'];?>&nbsp;
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($doment['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_dnsmasq_domainoverride_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="services_dnsmasq.php?act=del&amp;type=doverride&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this domain override?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr style="display:none">
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dnsmasq_domainoverride_edit.php b/src/usr/local/www/services_dnsmasq_domainoverride_edit.php
new file mode 100644
index 0000000..ca66b49
--- /dev/null
+++ b/src/usr/local/www/services_dnsmasq_domainoverride_edit.php
@@ -0,0 +1,197 @@
+<?php
+/*
+ services_dnsmasq_domainoverride_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2005 Bob Zoller <bob@kludgebox.com> and Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dnsforwarder
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dnsforwarder-editdomainoverride
+##|*NAME=Services: DNS Forwarder: Edit Domain Override page
+##|*DESCR=Allow access to the 'Services: DNS Forwarder: Edit Domain Override' page.
+##|*MATCH=services_dnsmasq_domainoverride_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_dnsmasq.php');
+}
+
+if (!is_array($config['dnsmasq']['domainoverrides'])) {
+ $config['dnsmasq']['domainoverrides'] = array();
+}
+$a_domainOverrides = &$config['dnsmasq']['domainoverrides'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_domainOverrides[$id]) {
+ $pconfig['domain'] = $a_domainOverrides[$id]['domain'];
+ if (is_ipaddr($a_domainOverrides[$id]['ip']) && ($a_domainOverrides[$id]['ip'] != '#')) {
+ $pconfig['ip'] = $a_domainOverrides[$id]['ip'];
+ } else {
+ $dnsmasqpieces = explode('@', $a_domainOverrides[$id]['ip'], 2);
+ $pconfig['ip'] = $dnsmasqpieces[0];
+ $pconfig['dnssrcip'] = $dnsmasqpieces[1];
+ }
+ $pconfig['descr'] = $a_domainOverrides[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "domain ip");
+ $reqdfieldsn = array(gettext("Domain"), gettext("IP address"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ function String_Begins_With($needle, $haystack) {
+ return (substr($haystack, 0, strlen($needle)) == $needle);
+ }
+
+ if (String_Begins_With(_msdcs, $_POST['domain'])) {
+ $subdomainstr = substr($_POST['domain'], 7);
+ if ($subdomainstr && !is_domain($subdomainstr)) {
+ $input_errors[] = gettext("A valid domain must be specified after _msdcs.");
+ }
+ } elseif ($_POST['domain'] && !is_domain($_POST['domain'])) {
+ $input_errors[] = gettext("A valid domain must be specified.");
+ }
+ if ($_POST['ip'] && !is_ipaddr($_POST['ip']) && ($_POST['ip'] != '#') && ($_POST['ip'] != '!')) {
+ $input_errors[] = gettext("A valid IP address must be specified, or # for an exclusion or ! to not forward at all.");
+ }
+ if ($_POST['dnssrcip'] && !in_array($_POST['dnssrcip'], get_configured_ip_addresses())) {
+ $input_errors[] = gettext("An interface IP address must be specified for the DNS query source.");
+ }
+ if (!$input_errors) {
+ $doment = array();
+ $doment['domain'] = $_POST['domain'];
+ if (empty($_POST['dnssrcip'])) {
+ $doment['ip'] = $_POST['ip'];
+ } else {
+ $doment['ip'] = $_POST['ip'] . "@" . $_POST['dnssrcip'];
+ }
+ $doment['descr'] = $_POST['descr'];
+
+ if (isset($id) && $a_domainOverrides[$id]) {
+ $a_domainOverrides[$id] = $doment;
+ } else {
+ $a_domainOverrides[] = $doment;
+ }
+
+ $retval = services_dnsmasq_configure();
+
+ write_config();
+
+ header("Location: services_dnsmasq.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("DNS forwarder"), gettext("Edit Domain Override"));
+$shortcut_section = "forwarder";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="services_dnsmasq_domainoverride_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="domain override">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Domain to override (NOTE: this does not have to be a valid TLD!)"); ?><br />
+ <?=gettext("e.g."); ?> <em><?=gettext("test"); ?></em> <?=gettext("or"); ?> <em>mycompany.localdomain</em> <?=gettext("or"); ?> <em>1.168.192.in-addr.arpa</em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="ip" type="text" class="formfld unknown" id="ip" size="40" value="<?=htmlspecialchars($pconfig['ip']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("IP address of the authoritative DNS server for this domain"); ?><br />
+ <?=gettext("e.g."); ?> <em>192.168.100.100</em><br /><?=gettext("Or enter # for an exclusion to pass through this host/subdomain to standard nameservers instead of a previous override."); ?><br /><?=gettext("Or enter ! for lookups for this host/subdomain to NOT be forwarded anywhere."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Source IP");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="dnssrcip" type="text" class="formfld unknown" id="dnssrcip" size="40" value="<?=htmlspecialchars($pconfig['dnssrcip']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Source IP address for queries to the DNS server for the override domain."); ?><br />
+ <?=gettext("Leave blank unless your DNS server is accessed through a VPN tunnel."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed).");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_domainOverrides[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dnsmasq_edit.php b/src/usr/local/www/services_dnsmasq_edit.php
new file mode 100644
index 0000000..4b4c1c4
--- /dev/null
+++ b/src/usr/local/www/services_dnsmasq_edit.php
@@ -0,0 +1,345 @@
+<?php
+/* $Id$ */
+/*
+ services_dnsmasq_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Bob Zoller <bob@kludgebox.com> and Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dnsforwarder
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dnsforwarder-edithost
+##|*NAME=Services: DNS Forwarder: Edit host page
+##|*DESCR=Allow access to the 'Services: DNS Forwarder: Edit host' page.
+##|*MATCH=services_dnsmasq_edit.php*
+##|-PRIV
+
+function hostcmp($a, $b) {
+ return strcasecmp($a['host'], $b['host']);
+}
+
+function hosts_sort() {
+ global $g, $config;
+
+ if (!is_array($config['dnsmasq']['hosts'])) {
+ return;
+ }
+
+ usort($config['dnsmasq']['hosts'], "hostcmp");
+}
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_dnsmasq.php');
+}
+
+if (!is_array($config['dnsmasq']['hosts'])) {
+ $config['dnsmasq']['hosts'] = array();
+}
+
+$a_hosts = &$config['dnsmasq']['hosts'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_hosts[$id]) {
+ $pconfig['host'] = $a_hosts[$id]['host'];
+ $pconfig['domain'] = $a_hosts[$id]['domain'];
+ $pconfig['ip'] = $a_hosts[$id]['ip'];
+ $pconfig['descr'] = $a_hosts[$id]['descr'];
+ $pconfig['aliases'] = $a_hosts[$id]['aliases'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "domain ip");
+ $reqdfieldsn = array(gettext("Domain"), gettext("IP address"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['host']) {
+ if (!is_hostname($_POST['host'])) {
+ $input_errors[] = gettext("The hostname can only contain the characters A-Z, 0-9 and '-'. It may not start or end with '-'.");
+ } else {
+ if (!is_unqualified_hostname($_POST['host'])) {
+ $input_errors[] = gettext("A valid hostname is specified, but the domain name part should be omitted");
+ }
+ }
+ }
+
+ if (($_POST['domain'] && !is_domain($_POST['domain']))) {
+ $input_errors[] = gettext("A valid domain must be specified.");
+ }
+
+ if (($_POST['ip'] && !is_ipaddr($_POST['ip']))) {
+ $input_errors[] = gettext("A valid IP address must be specified.");
+ }
+
+ /* collect aliases */
+ $aliases = array();
+ foreach ($_POST as $key => $value) {
+ $entry = '';
+ if (!substr_compare('aliashost', $key, 0, 9)) {
+ $entry = substr($key, 9);
+ $field = 'host';
+ }
+ elseif (!substr_compare('aliasdomain', $key, 0, 11)) {
+ $entry = substr($key, 11);
+ $field = 'domain';
+ }
+ elseif (!substr_compare('aliasdescription', $key, 0, 16)) {
+ $entry = substr($key, 16);
+ $field = 'description';
+ }
+ if (ctype_digit($entry)) {
+ $aliases[$entry][$field] = $value;
+ }
+ }
+ $pconfig['aliases']['item'] = $aliases;
+
+ /* validate aliases */
+ foreach ($aliases as $idx => $alias) {
+ $aliasreqdfields = array('aliasdomain' . $idx);
+ $aliasreqdfieldsn = array(gettext("Alias Domain"));
+
+ do_input_validation($_POST, $aliasreqdfields, $aliasreqdfieldsn, $input_errors);
+ if ($alias['host']) {
+ if (!is_hostname($alias['host'])) {
+ $input_errors[] = gettext("Hostnames in an alias list can only contain the characters A-Z, 0-9 and '-'. They may not start or end with '-'.");
+ } else {
+ if (!is_unqualified_hostname($alias['host'])) {
+ $input_errors[] = gettext("A valid alias hostname is specified, but the domain name part should be omitted");
+ }
+ }
+ }
+ if (($alias['domain'] && !is_domain($alias['domain']))) {
+ $input_errors[] = gettext("A valid domain must be specified in alias list.");
+ }
+ }
+
+ /* check for overlaps */
+ foreach ($a_hosts as $hostent) {
+ if (isset($id) && ($a_hosts[$id]) && ($a_hosts[$id] === $hostent)) {
+ continue;
+ }
+
+ if (($hostent['host'] == $_POST['host']) &&
+ ($hostent['domain'] == $_POST['domain']) &&
+ ((is_ipaddrv4($hostent['ip']) && is_ipaddrv4($_POST['ip'])) ||
+ (is_ipaddrv6($hostent['ip']) && is_ipaddrv6($_POST['ip'])))) {
+ $input_errors[] = gettext("This host/domain already exists.");
+ break;
+ }
+ }
+
+ if (!$input_errors) {
+ $hostent = array();
+ $hostent['host'] = $_POST['host'];
+ $hostent['domain'] = $_POST['domain'];
+ $hostent['ip'] = $_POST['ip'];
+ $hostent['descr'] = $_POST['descr'];
+ $hostent['aliases']['item'] = $aliases;
+
+ if (isset($id) && $a_hosts[$id]) {
+ $a_hosts[$id] = $hostent;
+ } else {
+ $a_hosts[] = $hostent;
+ }
+ hosts_sort();
+
+ mark_subsystem_dirty('hosts');
+
+ write_config();
+
+ header("Location: services_dnsmasq.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("DNS forwarder"), gettext("Edit host"));
+$shortcut_section = "forwarder";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript" src="/javascript/row_helper.js">
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+ rowname[0] = "aliashost";
+ rowtype[0] = "textbox";
+ rowsize[0] = "20";
+ rowname[1] = "aliasdomain";
+ rowtype[1] = "textbox";
+ rowsize[1] = "20";
+ rowname[2] = "aliasdescription";
+ rowtype[2] = "textbox";
+ rowsize[2] = "20";
+//]]>
+</script>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="services_dnsmasq_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dns edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit DNS Forwarder entry");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Host");?></td>
+ <td width="78%" class="vtable">
+ <input name="host" type="text" class="formfld unknown" id="host" size="40" value="<?=htmlspecialchars($pconfig['host']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Name of the host, without domain part"); ?><br />
+ <?=gettext("e.g."); ?> <em><?=gettext("myhost"); ?></em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain");?></td>
+ <td width="78%" class="vtable">
+ <input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Domain of the host"); ?><br />
+ <?=gettext("e.g."); ?> <em><?=gettext("example.com"); ?></em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address");?></td>
+ <td width="78%" class="vtable">
+ <input name="ip" type="text" class="formfld unknown" id="ip" size="40" value="<?=htmlspecialchars($pconfig['ip']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("IP address of the host"); ?><br />
+ <?=gettext("e.g."); ?> <em>192.168.100.100</em> <?=gettext("or"); ?> <em>fd00:abcd::1</em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed).");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><div id="addressnetworkport"><?=gettext("Aliases"); ?></div></td>
+ <td width="78%" class="vtable">
+ <table id="maintable" summary="aliases">
+ <tbody>
+ <tr>
+ <td colspan="4">
+ <div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp">
+ <?=gettext("Enter additional names for this host."); ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td><div id="onecolumn"><?=gettext("Host");?></div></td>
+ <td><div id="twocolumn"><?=gettext("Domain");?></div></td>
+ <td><div id="threecolumn"><?=gettext("Description");?></div></td>
+ </tr>
+<?php
+ $counter = 0;
+ if ($pconfig['aliases']['item']):
+ foreach ($pconfig['aliases']['item'] as $item):
+ $host = $item['host'];
+ $domain = $item['domain'];
+ $description = $item['description'];
+?>
+ <tr>
+ <td>
+ <input autocomplete="off" name="aliashost<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliashost<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($host);?>" />
+ </td>
+ <td>
+ <input autocomplete="off" name="aliasdomain<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliasdomain<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($domain);?>" />
+ </td>
+ <td>
+ <input name="aliasdescription<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliasdescription<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($description);?>" />
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" /></a>
+ </td>
+ </tr>
+<?php
+ $counter++;
+ endforeach;
+ endif;
+?>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
+ </a>
+ <script type="text/javascript">
+ //<![CDATA[
+ field_counter_js = 3;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+ //]]>
+ </script>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_hosts[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dyndns.php b/src/usr/local/www/services_dyndns.php
new file mode 100644
index 0000000..5051f00
--- /dev/null
+++ b/src/usr/local/www/services_dyndns.php
@@ -0,0 +1,229 @@
+<?php
+/* $Id$ */
+/*
+ services_dyndns.php
+
+ Copyright (C) 2008 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/host
+ pfSense_MODULE: dyndns
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dynamicdnsclients
+##|*NAME=Services: Dynamic DNS clients page
+##|*DESCR=Allow access to the 'Services: Dynamic DNS clients' page.
+##|*MATCH=services_dyndns.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['dyndnses']['dyndns'])) {
+ $config['dyndnses']['dyndns'] = array();
+}
+
+$a_dyndns = &$config['dyndnses']['dyndns'];
+
+if ($_GET['act'] == "del") {
+
+ $conf = $a_dyndns[$_GET['id']];
+ @unlink("{$g['conf_path']}/dyndns_{$conf['interface']}{$conf['type']}" . escapeshellarg($conf['host']) . "{$conf['id']}.cache");
+ unset($a_dyndns[$_GET['id']]);
+
+ write_config();
+ services_dyndns_configure();
+
+ header("Location: services_dyndns.php");
+ exit;
+}
+
+$pgtitle = array(gettext("Services"), gettext("Dynamic DNS clients"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_dyndns.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="dynamic dns">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("DynDns"), true, "services_dyndns.php");
+ $tab_array[] = array(gettext("RFC 2136"), false, "services_rfc2136.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="5%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Service");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Hostname");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Cached IP");?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_dyndns as $dyndns):
+?>
+ <tr ondblclick="document.location='services_dyndns_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+<?php
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $if => $ifdesc) {
+ if ($dyndns['interface'] == $if) {
+ if (!isset($dyndns['enable'])) {
+ echo "<span class=\"gray\">{$ifdesc}</span>";
+ } else {
+ echo "{$ifdesc}";
+ }
+ break;
+ }
+ }
+ $groupslist = return_gateway_groups_array();
+ foreach ($groupslist as $if => $group) {
+ if ($dyndns['interface'] == $if) {
+ if (!isset($dyndns['enable'])) {
+ echo "<span class=\"gray\">{$if}</span>";
+ } else {
+ echo "{$if}";
+ }
+ break;
+ }
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ $types = explode(",", DYNDNS_PROVIDER_DESCRIPTIONS);
+ $vals = explode(" ", DYNDNS_PROVIDER_VALUES);
+ for ($j = 0; $j < count($vals); $j++) {
+ if ($vals[$j] == $dyndns['type']) {
+ if (!isset($dyndns['enable'])) {
+ echo "<span class=\"gray\">" . htmlspecialchars($types[$j]) . "</span>";
+ } else {
+ echo htmlspecialchars($types[$j]);
+ }
+ break;
+ }
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ if (!isset($dyndns['enable'])) {
+ echo "<span class=\"gray\">" . htmlspecialchars($dyndns['host']) . "</span>";
+ } else {
+ echo htmlspecialchars($dyndns['host']);
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ $filename = "{$g['conf_path']}/dyndns_{$dyndns['interface']}{$dyndns['type']}" . escapeshellarg($dyndns['host']) . "{$dyndns['id']}.cache";
+ $filename_v6 = "{$g['conf_path']}/dyndns_{$dyndns['interface']}{$dyndns['type']}" . escapeshellarg($dyndns['host']) . "{$dyndns['id']}_v6.cache";
+ if (file_exists($filename)) {
+ $ipaddr = dyndnsCheckIP($dyndns['interface']);
+ $cached_ip_s = explode(":", file_get_contents($filename));
+ $cached_ip = $cached_ip_s[0];
+ if ($ipaddr <> $cached_ip) {
+ echo "<font color='red'>";
+ } else {
+ echo "<font color='green'>";
+ }
+ echo htmlspecialchars($cached_ip);
+ echo "</font>";
+ } else if (file_exists($filename_v6)) {
+ $ipv6addr = get_interface_ipv6($dyndns['interface']);
+ $cached_ipv6_s = explode("|", file_get_contents($filename_v6));
+ $cached_ipv6 = $cached_ipv6_s[0];
+ if ($ipv6addr <> $cached_ipv6) {
+ echo "<font color='red'>";
+ } else {
+ echo "<font color='green'>";
+ }
+ echo htmlspecialchars($cached_ipv6);
+ echo "</font>";
+ } else {
+ echo "N/A";
+ }
+?>
+ </td>
+ <td class="listbg">
+<?php
+ if (!isset($dyndns['enable'])) {
+ echo "<span class=\"gray\">".htmlspecialchars($dyndns['descr'])."</span>";
+ } else {
+ echo htmlspecialchars($dyndns['descr']);
+ }
+?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_dyndns_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="services_dyndns.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this entry?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="5"></td>
+ <td class="list">
+ <a href="services_dyndns_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="5" class="list">
+ <p class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:");?><br />
+ </strong>
+ </span>
+ <?=gettext("IP addresses appearing in green are up to date with Dynamic DNS provider.");?><br />
+ <?=gettext("You can force an update for an IP address on the edit page for that service.");?>
+ </p>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_dyndns_edit.php b/src/usr/local/www/services_dyndns_edit.php
new file mode 100644
index 0000000..a619ce9
--- /dev/null
+++ b/src/usr/local/www/services_dyndns_edit.php
@@ -0,0 +1,485 @@
+<?php
+/* $Id$ */
+/*
+ services_dyndns_edit.php
+
+ Copyright (C) 2008 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm
+ pfSense_MODULE: dyndns
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dynamicdnsclient
+##|*NAME=Services: Dynamic DNS client page
+##|*DESCR=Allow access to the 'Services: Dynamic DNS client' page.
+##|*MATCH=services_dyndns_edit.php*
+##|-PRIV
+
+/* returns true if $uname is a valid DynDNS username */
+function is_dyndns_username($uname) {
+ if (!is_string($uname)) {
+ return false;
+ }
+
+ if (preg_match("/[^a-z0-9\-\+.@_:]/i", $uname)) {
+ return false;
+ } else {
+ return true;
+ }
+}
+
+require("guiconfig.inc");
+
+if (!is_array($config['dyndnses']['dyndns'])) {
+ $config['dyndnses']['dyndns'] = array();
+}
+
+$a_dyndns = &$config['dyndnses']['dyndns'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && isset($a_dyndns[$id])) {
+ $pconfig['username'] = $a_dyndns[$id]['username'];
+ $pconfig['password'] = $a_dyndns[$id]['password'];
+ $pconfig['host'] = $a_dyndns[$id]['host'];
+ $pconfig['mx'] = $a_dyndns[$id]['mx'];
+ $pconfig['type'] = $a_dyndns[$id]['type'];
+ $pconfig['enable'] = !isset($a_dyndns[$id]['enable']);
+ $pconfig['interface'] = $a_dyndns[$id]['interface'];
+ $pconfig['wildcard'] = isset($a_dyndns[$id]['wildcard']);
+ $pconfig['verboselog'] = isset($a_dyndns[$id]['verboselog']);
+ $pconfig['curl_ipresolve_v4'] = isset($a_dyndns[$id]['curl_ipresolve_v4']);
+ $pconfig['curl_ssl_verifypeer'] = isset($a_dyndns[$id]['curl_ssl_verifypeer']);
+ $pconfig['zoneid'] = $a_dyndns[$id]['zoneid'];
+ $pconfig['ttl'] = $a_dyndns[$id]['ttl'];
+ $pconfig['updateurl'] = $a_dyndns[$id]['updateurl'];
+ $pconfig['resultmatch'] = $a_dyndns[$id]['resultmatch'];
+ $pconfig['requestif'] = $a_dyndns[$id]['requestif'];
+ $pconfig['descr'] = $a_dyndns[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (($pconfig['type'] == "freedns" || $pconfig['type'] == "namecheap") && $_POST['username'] == "") {
+ $_POST['username'] = "none";
+ }
+
+ /* input validation */
+ $reqdfields = array();
+ $reqdfieldsn = array();
+ $reqdfields = array("type");
+ $reqdfieldsn = array(gettext("Service type"));
+ if ($pconfig['type'] != "custom" && $pconfig['type'] != "custom-v6") {
+ $reqdfields[] = "host";
+ $reqdfieldsn[] = gettext("Hostname");
+ $reqdfields[] = "passwordfld";
+ $reqdfieldsn[] = gettext("Password");
+ $reqdfields[] = "username";
+ $reqdfieldsn[] = gettext("Username");
+ } else {
+ $reqdfields[] = "updateurl";
+ $reqdfieldsn[] = gettext("Update URL");
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (isset($_POST['host']) && in_array("host", $reqdfields)) {
+ /* Namecheap can have a @. in hostname */
+ if ($pconfig['type'] == "namecheap" && substr($_POST['host'], 0, 2) == '@.') {
+ $host_to_check = substr($_POST['host'], 2);
+ } else {
+ $host_to_check = $_POST['host'];
+ }
+
+ if ($pconfig['type'] != "custom" && $pconfig['type'] != "custom-v6") {
+ if (!is_domain($host_to_check)) {
+ $input_errors[] = gettext("The hostname contains invalid characters.");
+ }
+ }
+
+ unset($host_to_check);
+ }
+ if (($_POST['mx'] && !is_domain($_POST['mx']))) {
+ $input_errors[] = gettext("The MX contains invalid characters.");
+ }
+ if ((in_array("username", $reqdfields) && $_POST['username'] && !is_dyndns_username($_POST['username'])) || ((in_array("username", $reqdfields)) && ($_POST['username'] == ""))) {
+ $input_errors[] = gettext("The username contains invalid characters.");
+ }
+
+ if (!$input_errors) {
+ $dyndns = array();
+ $dyndns['type'] = $_POST['type'];
+ $dyndns['username'] = $_POST['username'];
+ $dyndns['password'] = $_POST['passwordfld'];
+ $dyndns['host'] = $_POST['host'];
+ $dyndns['mx'] = $_POST['mx'];
+ $dyndns['wildcard'] = $_POST['wildcard'] ? true : false;
+ $dyndns['verboselog'] = $_POST['verboselog'] ? true : false;
+ $dyndns['curl_ipresolve_v4'] = $_POST['curl_ipresolve_v4'] ? true : false;
+ $dyndns['curl_ssl_verifypeer'] = $_POST['curl_ssl_verifypeer'] ? true : false;
+ /* In this place enable means disabled */
+ if ($_POST['enable']) {
+ unset($dyndns['enable']);
+ } else {
+ $dyndns['enable'] = true;
+ }
+ $dyndns['interface'] = $_POST['interface'];
+ $dyndns['zoneid'] = $_POST['zoneid'];
+ $dyndns['ttl'] = $_POST['ttl'];
+ $dyndns['updateurl'] = $_POST['updateurl'];
+ // Trim hard-to-type but sometimes returned characters
+ $dyndns['resultmatch'] = trim($_POST['resultmatch'], "\t\n\r");
+ ($dyndns['type'] == "custom" || $dyndns['type'] == "custom-v6") ? $dyndns['requestif'] = $_POST['requestif'] : $dyndns['requestif'] = $_POST['interface'];
+ $dyndns['descr'] = $_POST['descr'];
+ $dyndns['force'] = isset($_POST['force']);
+
+ if ($dyndns['username'] == "none") {
+ $dyndns['username'] = "";
+ }
+
+ if (isset($id) && $a_dyndns[$id]) {
+ $a_dyndns[$id] = $dyndns;
+ } else {
+ $a_dyndns[] = $dyndns;
+ $id = count($a_dyndns) - 1;
+ }
+
+ $dyndns['id'] = $id;
+ //Probably overkill, but its better to be safe
+ for ($i = 0; $i < count($a_dyndns); $i++) {
+ $a_dyndns[$i]['id'] = $i;
+ }
+
+ write_config();
+
+ services_dyndns_configure_client($dyndns);
+
+ header("Location: services_dyndns.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Dynamic DNS client"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<script type="text/javascript">
+//<![CDATA[
+function _onTypeChange(type) {
+ switch (type) {
+ case "custom":
+ case "custom-v6":
+ document.getElementById("_resulttr").style.display = '';
+ document.getElementById("_urltr").style.display = '';
+ document.getElementById("_requestiftr").style.display = '';
+ document.getElementById("_curloptions").style.display = '';
+ document.getElementById("_hostnametr").style.display = 'none';
+ document.getElementById("_mxtr").style.display = 'none';
+ document.getElementById("_wildcardtr").style.display = 'none';
+ document.getElementById("r53_zoneid").style.display='none';
+ document.getElementById("r53_ttl").style.display='none';
+ break;
+ case "dnsimple":
+ case "route53":
+ document.getElementById("_resulttr").style.display = 'none';
+ document.getElementById("_urltr").style.display = 'none';
+ document.getElementById("_requestiftr").style.display = 'none';
+ document.getElementById("_curloptions").style.display = 'none';
+ document.getElementById("_hostnametr").style.display = '';
+ document.getElementById("_mxtr").style.display = '';
+ document.getElementById("_wildcardtr").style.display = '';
+ document.getElementById("r53_zoneid").style.display='';
+ document.getElementById("r53_ttl").style.display='';
+ break;
+ default:
+ document.getElementById("_resulttr").style.display = 'none';
+ document.getElementById("_urltr").style.display = 'none';
+ document.getElementById("_requestiftr").style.display = 'none';
+ document.getElementById("_curloptions").style.display = 'none';
+ document.getElementById("_hostnametr").style.display = '';
+ document.getElementById("_mxtr").style.display = '';
+ document.getElementById("_wildcardtr").style.display = '';
+ document.getElementById("r53_zoneid").style.display='none';
+ document.getElementById("r53_ttl").style.display='none';
+ }
+}
+//]]>
+</script>
+<form action="services_dyndns_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="dynamic dns edit">
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t">
+ <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="title">
+ <tr>
+ <td class="optsect_s"><strong><?=gettext("Dynamic DNS client");?></strong></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable");?></td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" id="enable" value="<?=gettext("yes");?>" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Service type");?></td>
+ <td width="78%" class="vtable">
+ <select name="type" class="formselect" id="type" onchange="_onTypeChange(this.options[this.selectedIndex].value);">
+ <?php
+ $types = explode(",", DYNDNS_PROVIDER_DESCRIPTIONS);
+ $vals = explode(" ", DYNDNS_PROVIDER_VALUES);
+ $j = 0;
+ for ($j = 0; $j < count($vals); $j++):
+ ?>
+ <option value="<?=$vals[$j];?>" <?php if ($vals[$j] == $pconfig['type']) echo "selected=\"selected\"";?>>
+ <?=htmlspecialchars($types[$j]);?>
+ </option>
+ <?php
+ endfor;
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to monitor");?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect" id="interface">
+ <?php
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $if => $ifdesc) {
+ echo "<option value=\"{$if}\"";
+ if ($pconfig['interface'] == $if) {
+ echo "selected=\"selected\"";
+ }
+ echo ">{$ifdesc}</option>\n";
+ }
+ unset($iflist);
+ $grouplist = return_gateway_groups_array();
+ foreach ($grouplist as $name => $group) {
+ echo "<option value=\"{$name}\"";
+ if ($pconfig['interface'] == $name) {
+ echo "selected=\"selected\"";
+ }
+ echo ">GW Group {$name}</option>\n";
+ }
+ unset($grouplist);
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr id="_requestiftr">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to send update from");?></td>
+ <td width="78%" class="vtable">
+ <select name="requestif" class="formselect" id="requestif">
+ <?php
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $if => $ifdesc) {
+ echo "<option value=\"{$if}\"";
+ if ($pconfig['requestif'] == $if) {
+ echo "selected=\"selected\"";
+ }
+ echo ">{$ifdesc}</option>\n";
+ }
+ unset($iflist);
+ $grouplist = return_gateway_groups_array();
+ foreach ($grouplist as $name => $group) {
+ echo "<option value=\"{$name}\"";
+ if ($pconfig['requestif'] == $name) {
+ echo "selected=\"selected\"";
+ }
+ echo ">GW Group {$name}</option>\n";
+ }
+ unset($grouplist);
+ ?>
+ </select>
+ <br /><?=gettext("Note: This is almost always the same as the Interface to Monitor.");?>
+ </td>
+ </tr>
+ <tr id="_hostnametr">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname");?></td>
+ <td width="78%" class="vtable">
+ <input name="host" type="text" class="formfld unknown" id="host" size="30" value="<?=htmlspecialchars($pconfig['host']);?>" />
+ <br />
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("Note:");?><br /></strong>
+ </span>
+ <?=gettext("Enter the complete host/domain name. example: myhost.dyndns.org");?><br />
+ <?=gettext("he.net tunnelbroker: Enter your tunnel ID");?><br />
+ <?=gettext("GleSYS: Enter your record ID");?><br />
+ <?=gettext("DNSimple: Enter only the domain name");?><br />
+ <?=gettext("DNS Made Easy: Enter your record ID separated by commas if more than one at a time");?>
+ </span>
+ </td>
+ </tr>
+ <tr id="_mxtr">
+ <td width="22%" valign="top" class="vncell"><?=gettext("MX"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="mx" type="text" class="formfld unknown" id="mx" size="30" value="<?=htmlspecialchars($pconfig['mx']);?>" />
+ <br />
+ <?=gettext("Note: With DynDNS service you can only use a hostname, not an IP address.");?>
+ <br />
+ <?=gettext("Set this option only if you need a special MX record. Not all services support this.");?>
+ </td>
+ </tr>
+ <tr id="_wildcardtr">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Wildcards"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="wildcard" type="checkbox" id="wildcard" value="yes" <?php if ($pconfig['wildcard']) echo "checked=\"checked\""; ?> />
+ <?=gettext("Enable ");?><?=gettext("Wildcard"); ?>
+ </td>
+ </tr>
+ <tr id="_verboselogtr">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Verbose logging"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="verboselog" type="checkbox" id="verboselog" value="yes" <?php if ($pconfig['verboselog']) echo "checked=\"checked\""; ?> />
+ <?=gettext("Enable ");?><?=gettext("verbose logging"); ?>
+ </td>
+ </tr>
+ <tr id="_curloptions">
+ <td width="22%" valign="top" class="vncell"><?=gettext("CURL options"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="curl_ipresolve_v4" type="checkbox" id="curl_ipresolve_v4" value="yes" <?php if ($pconfig['curl_ipresolve_v4']) echo "checked=\"checked\""; ?> />
+ <?=gettext("Force IPv4 resolving"); ?><br />
+ <input name="curl_ssl_verifypeer" type="checkbox" id="curl_ssl_verifypeer" value="yes" <?php if ($pconfig['curl_ssl_verifypeer']) echo "checked=\"checked\""; ?> />
+ <?=gettext("Verify SSL peer"); ?>
+ </td>
+ </tr>
+ <tr id="_usernametr">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
+ <td width="78%" class="vtable">
+ <input name="username" type="text" class="formfld user" id="username" size="20" value="<?=htmlspecialchars($pconfig['username']);?>" />
+ <br /><?=gettext("Username is required for all types except Namecheap, FreeDNS and Custom Entries.");?>
+ <br /><?=gettext("Route 53: Enter your Access Key ID.");?>
+ <br /><?=gettext("GleSYS: Enter your API user.");?>
+ <br /><?=gettext("For Custom Entries, Username and Password represent HTTP Authentication username and passwords.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Password");?></td>
+ <td width="78%" class="vtable">
+ <input name="passwordfld" type="password" class="formfld pwd" id="passwordfld" size="20" value="<?=htmlspecialchars($pconfig['password']);?>" />
+ <br />
+ <?=gettext("FreeDNS (freedns.afraid.org): Enter your \"Authentication Token\" provided by FreeDNS.");?>
+ <br /><?=gettext("Route 53: Enter your Secret Access Key.");?>
+ <br /><?=gettext("GleSYS: Enter your API key.");?>
+ <br /><?=gettext("DNSimple: Enter your API token.");?>
+ </td>
+ </tr>
+ <tr id="r53_zoneid" style="display:none">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Zone ID");?></td>
+ <td width="78%" class="vtable">
+ <input name="zoneid" type="text" class="formfld user" id="zoneid" size="20" value="<?=htmlspecialchars($pconfig['zoneid']);?>" />
+ <br /><?=gettext("Enter Zone ID that you received when you created your domain in Route 53.");?>
+ <br /><?=gettext("DNSimple: Enter the Record ID of record to update.");?>
+ </td>
+ </tr>
+ <tr id="_urltr">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Update URL");?></td>
+ <td width="78%" class="vtable">
+ <input name="updateurl" type="text" class="formfld unknown" id="updateurl" size="60" value="<?=htmlspecialchars($pconfig['updateurl']);?>" />
+ <br /><?=gettext("This is the only field required by for Custom Dynamic DNS, and is only used by Custom Entries.");?>
+ <br /><?=gettext("If you need the new IP to be included in the request, put %IP% in its place.");?>
+ </td>
+ </tr>
+ <tr id="_resulttr">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Result Match");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="resultmatch" class="formpre" id="resultmatch" cols="65" rows="7"><?=htmlspecialchars($pconfig['resultmatch']);?></textarea>
+ <br /><?=gettext("This field is only used by Custom Dynamic DNS Entries.");?>
+ <br /><?=gettext("This field should be identical to what your DDNS Provider will return if the update succeeds, leave it blank to disable checking of returned results.");?>
+ <br /><?=gettext("If you need the new IP to be included in the request, put %IP% in its place.");?>
+ <br /><?=gettext("If you need to include multiple possible values, separate them with a |. If your provider includes a |, escape it with \\|");?>
+ <br /><?=gettext("Tabs (\\t), newlines (\\n) and carriage returns (\\r) at the beginning or end of the returned results are removed before comparison.");?>
+ </td>
+ </tr>
+ <tr id="r53_ttl" style="display:none">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("TTL");?></td>
+ <td width="78%" class="vtable">
+ <input name="ttl" type="text" class="formfld user" id="ttl" size="20" value="<?=htmlspecialchars($pconfig['ttl']);?>" />
+ <br /><?=gettext("Choose TTL for your dns record.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="60" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
+ <a href="services_dyndns.php"><input name="cancel" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
+ <?php if (isset($id) && $a_dyndns[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <input name="force" type="submit" class="formbtn" value="<?=gettext("Save & Force Update");?>" onclick="enable_change(true)" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:");?><br />
+ </strong>
+ </span>
+ <?php printf(gettext("You must configure a DNS server in %sSystem:
+ General setup%s or allow the DNS server list to be overridden
+ by DHCP/PPP on WAN for dynamic DNS updates to work."), '<a href="system.php">', '</a>');?>
+ </span>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+_onTypeChange("<?php echo $pconfig['type']; ?>");
+//]]>
+</script>
+
+</body>
+</html>
diff --git a/src/usr/local/www/services_igmpproxy.php b/src/usr/local/www/services_igmpproxy.php
new file mode 100644
index 0000000..8749b2d
--- /dev/null
+++ b/src/usr/local/www/services_igmpproxy.php
@@ -0,0 +1,189 @@
+<?php
+/* $Id$ */
+/*
+ services_igmpproxy.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009 Ermal Luçi
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: igmpproxy
+*/
+
+##|+PRIV
+##|*IDENT=page-services-igmpproxy
+##|*NAME=Services: Igmpproxy page
+##|*DESCR=Allow access to the 'Services: Igmpproxy' page.
+##|*MATCH=services_igmpproxy.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['igmpproxy']['igmpentry'])) {
+ $config['igmpproxy']['igmpentry'] = array();
+}
+
+//igmpproxy_sort();
+$a_igmpproxy = &$config['igmpproxy']['igmpentry'];
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ $retval = 0;
+ /* reload all components that use igmpproxy */
+ $retval = services_igmpproxy_configure();
+
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+
+ clear_subsystem_dirty('igmpproxy');
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_igmpproxy[$_GET['id']]) {
+ unset($a_igmpproxy[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('igmpproxy');
+ header("Location: services_igmpproxy.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("IGMP Proxy"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_igmpproxy.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('igmpproxy')): ?><br/>
+<?php print_info_box_np(gettext("The IGMP entry list has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?>
+<?php endif; ?>
+
+<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="igmp proxy">
+ <tr>
+ <td width="15%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Type");?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Values");?></td>
+ <td width="25%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="5%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17">&nbsp;</td>
+ <td valign="middle">
+ <a href="services_igmpproxy_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new igmpentry");?>" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_igmpproxy as $igmpentry):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='services_igmpproxy_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($igmpentry['ifname']));?>
+ </td>
+ <td class="listlr" ondblclick="document.location='services_igmpproxy_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($igmpentry['type']);?>
+ </td>
+ <td class="listr" ondblclick="document.location='services_igmpproxy_edit.php?id=<?=$i;?>';">
+<?php
+ $addresses = implode(", ", array_slice(explode(" ", $igmpentry['address']), 0, 10));
+ echo $addresses;
+ if (count($addresses) < 10) {
+ echo " ";
+ } else {
+ echo "...";
+ }
+?>
+ </td>
+ <td class="listbg" ondblclick="document.location='services_igmpproxy_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($igmpentry['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="services_igmpproxy_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit igmpentry"); ?>" alt="edit" /></a></td>
+ <td>
+ <a href="services_igmpproxy.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this igmp entry? All elements that still use it will become invalid (e.g. filter rules)!");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete igmpentry");?>" alt="delete" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1">
+ <tr>
+ <td valign="middle" width="17">&nbsp;</td>
+ <td valign="middle"><a href="services_igmpproxy_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new igmpentry");?>" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" width="78%">
+ <br />
+ <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont" colspan="4">
+ <p>
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:");?><br />
+ </strong>
+ </span>
+ <?=gettext("Please add the interface for upstream, the allowed subnets, and the downstream interfaces you would like the proxy to allow. Only one 'upstream' interface can be configured.");?>
+ </span>
+ </p>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_igmpproxy_edit.php b/src/usr/local/www/services_igmpproxy_edit.php
new file mode 100644
index 0000000..2d299c0
--- /dev/null
+++ b/src/usr/local/www/services_igmpproxy_edit.php
@@ -0,0 +1,312 @@
+<?php
+/* $Id$ */
+/*
+ services_igmpproxy_edit.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009 Ermal Luçi
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: igmpproxy
+*/
+
+##|+PRIV
+##|*IDENT=page-services-igmpproxy-edit
+##|*NAME=Firewall: Igmpproxy: Edit page
+##|*DESCR=Allow access to the 'Services: Igmpproxy: Edit' page.
+##|*MATCH=services_igmpproxy_edit.php*
+##|-PRIV
+
+$pgtitle = array(gettext("Firewall"), gettext("IGMP Proxy"), gettext("Edit"));
+
+require("guiconfig.inc");
+
+if (!is_array($config['igmpproxy']['igmpentry'])) {
+ $config['igmpproxy']['igmpentry'] = array();
+}
+
+//igmpproxy_sort();
+$a_igmpproxy = &$config['igmpproxy']['igmpentry'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_igmpproxy[$id]) {
+ $pconfig['ifname'] = $a_igmpproxy[$id]['ifname'];
+ $pconfig['threshold'] = $a_igmpproxy[$id]['threshold'];
+ $pconfig['type'] = $a_igmpproxy[$id]['type'];
+ $pconfig['address'] = $a_igmpproxy[$id]['address'];
+ $pconfig['descr'] = html_entity_decode($a_igmpproxy[$id]['descr']);
+
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if ($_POST['type'] == "upstream") {
+ foreach ($a_igmpproxy as $pid => $proxyentry) {
+ if (isset($id) && $id == $pid) {
+ continue;
+ }
+ if ($proxyentry['type'] == "upstream" && $proxyentry['ifname'] != $_POST['interface']) {
+ $input_errors[] = gettext("Only one 'upstream' interface can be configured.");
+ }
+ }
+ }
+ $igmpentry = array();
+ $igmpentry['ifname'] = $_POST['ifname'];
+ $igmpentry['threshold'] = $_POST['threshold'];
+ $igmpentry['type'] = $_POST['type'];
+ $address = "";
+ $isfirst = 0;
+ /* item is a normal igmpentry type */
+ for ($x = 0; $x < 4999; $x++) {
+ if ($_POST["address{$x}"] <> "") {
+ if ($isfirst > 0) {
+ $address .= " ";
+ }
+ $address .= $_POST["address{$x}"];
+ $address .= "/" . $_POST["address_subnet{$x}"];
+ $isfirst++;
+ }
+ }
+
+ if (!$input_errors) {
+ $igmpentry['address'] = $address;
+ $igmpentry['descr'] = $_POST['descr'];
+
+ if (isset($id) && $a_igmpproxy[$id]) {
+ $a_igmpproxy[$id] = $igmpentry;
+ } else {
+ $a_igmpproxy[] = $igmpentry;
+ }
+
+ write_config();
+
+ mark_subsystem_dirty('igmpproxy');
+ header("Location: services_igmpproxy.php");
+ exit;
+ } else {
+ //we received input errors, copy data to prevent retype
+ $pconfig['descr'] = $_POST['descr'];
+ $pconfig['address'] = $address;
+ $pconfig['type'] = $_POST['type'];
+ }
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php
+ include("fbegin.inc");
+?>
+
+<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js">
+</script>
+<script type="text/javascript" src="/javascript/row_helper.js">
+</script>
+
+<input type="hidden" name="address_type" value="textbox" class="formfld unknown" />
+<input type="hidden" name="address_subnet_type" value="select" />
+
+<script type="text/javascript">
+//<![CDATA[
+ rowname[0] = "address";
+ rowtype[0] = "textbox,ipv4v6";
+ rowsize[0] = "30";
+
+ rowname[1] = "address_subnet";
+ rowtype[1] = "select,ipv4v6";
+ rowsize[1] = "1";
+
+ rowname[2] = "detail";
+ rowtype[2] = "textbox";
+ rowsize[2] = "50";
+//]]>
+</script>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<div id="inputerrors"></div>
+
+<form action="services_igmpproxy_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="igmp proxy edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("IGMP Proxy Edit");?></td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Interface");?></td>
+ <td class="vtable">
+ <select name="ifname" id="ifname" >
+<?php
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $ifnam => $ifdescr) {
+ echo "<option value=\"{$ifnam}\"";
+ if ($ifnam == $pconfig['ifname']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">{$ifdescr}</option>";
+ }
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed).");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Type");?></td>
+ <td class="vtable">
+ <select name="type" class="formselect" id="type" >
+ <option value="upstream" <?php if ($pconfig['type'] == "upstream") echo "selected=\"selected\""; ?>><?=gettext("Upstream Interface");?></option>
+ <option value="downstream" <?php if ($pconfig['type'] == "downstream") echo "selected=\"selected\""; ?>><?=gettext("Downstream Interface");?></option>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("The <b>upstream</b> network interface is the outgoing interface which is" .
+ " responsible for communicating to available multicast data sources." .
+ " There can only be one upstream interface.");?>
+ </span>
+ <br />
+ <span class="vexpl">
+ <b><?=gettext("Downstream"); ?></b>
+ <?=gettext("network interfaces are the distribution interfaces to the" .
+ " destination networks, where multicast clients can join groups and" .
+ " receive multicast data. One or more downstream interfaces must be configured.");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Threshold");?></td>
+ <td class="vtable">
+ <input name="threshold" class="formfld unknown" id="threshold" value="<?php echo htmlspecialchars($pconfig['threshold']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Defines the TTL threshold for the network interface. Packets" .
+ " with a lower TTL than the threshold value will be ignored. This" .
+ " setting is optional, and by default the threshold is 1.");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><div id="addressnetworkport"><?=gettext("Network (s)");?></div></td>
+ <td width="78%" class="vtable">
+ <table id="maintable">
+ <tbody>
+ <tr>
+ <td><div id="onecolumn"><?=gettext("Network");?></div></td>
+ <td><div id="twocolumn"><?=gettext("CIDR");?></div></td>
+ </tr>
+
+<?php
+ $counter = 0;
+ $address = $pconfig['address'];
+ if ($address <> "") {
+ $item = explode(" ", $address);
+ foreach ($item as $ww) {
+ $address = $item[$counter];
+ $address_subnet = "";
+ $item2 = explode("/", $address);
+ foreach ($item2 as $current) {
+ if ($item2[1] <> "") {
+ $address = $item2[0];
+ $address_subnet = $item2[1];
+ }
+ }
+ $item4 = $item3[$counter];
+ $tracker = $counter;
+?>
+ <tr>
+ <td>
+ <input name="address<?php echo $tracker; ?>" type="text" class="formfld unknown" id="address<?php echo $tracker; ?>" size="30" value="<?=htmlspecialchars($address);?>" />
+ </td>
+ <td>
+ <select name="address_subnet<?php echo $tracker; ?>" class="formselect" id="address_subnet<?php echo $tracker; ?>">
+ <option></option>
+ <?php for ($i = 32; $i >= 1; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $address_subnet) echo "selected=\"selected\""; ?>><?=$i;?></option>
+ <?php endfor; ?>
+ </select>
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $counter++;
+
+ } // end foreach
+ } // end if
+?>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('maintable'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="add" title="<?=gettext("add another entry");?>" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <a href="services_igmpproxy.php"><input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
+ <?php if (isset($id) && $a_igmpproxy[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+
+<script type="text/javascript">
+//<![CDATA[
+ field_counter_js = 2;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+//]]>
+</script>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_ntpd.php b/src/usr/local/www/services_ntpd.php
new file mode 100644
index 0000000..1f4dd86
--- /dev/null
+++ b/src/usr/local/www/services_ntpd.php
@@ -0,0 +1,462 @@
+<?php
+/*
+ services_ntpd.php
+
+ Copyright (C) 2013 Dagorlad
+ Copyright (C) 2012 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: ntpd
+*/
+
+##|+PRIV
+##|*IDENT=page-services-ntpd
+##|*NAME=Services: NTP
+##|*DESCR=Allow access to the 'Services: NTP' page.
+##|*MATCH=services_ntpd.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once('rrd.inc');
+require_once("shaper.inc");
+
+if (!is_array($config['ntpd'])) {
+ $config['ntpd'] = array();
+}
+
+if (empty($config['ntpd']['interface'])) {
+ if (is_array($config['installedpackages']['openntpd']) && is_array($config['installedpackages']['openntpd']['config']) &&
+ is_array($config['installedpackages']['openntpd']['config'][0]) && !empty($config['installedpackages']['openntpd']['config'][0]['interface'])) {
+ $pconfig['interface'] = explode(",", $config['installedpackages']['openntpd']['config'][0]['interface']);
+ unset($config['installedpackages']['openntpd']);
+ write_config("Upgraded settings from openttpd");
+ } else {
+ $pconfig['interface'] = array();
+ }
+} else {
+ $pconfig['interface'] = explode(",", $config['ntpd']['interface']);
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (!$input_errors) {
+ if (is_array($_POST['interface'])) {
+ $config['ntpd']['interface'] = implode(",", $_POST['interface']);
+ } elseif (isset($config['ntpd']['interface'])) {
+ unset($config['ntpd']['interface']);
+ }
+
+ if (!empty($_POST['gpsport']) && file_exists('/dev/'.$_POST['gpsport'])) {
+ $config['ntpd']['gpsport'] = $_POST['gpsport'];
+ } elseif (isset($config['ntpd']['gpsport'])) {
+ unset($config['ntpd']['gpsport']);
+ }
+
+ unset($config['ntpd']['prefer']);
+ unset($config['ntpd']['noselect']);
+ $timeservers = '';
+ for ($i = 0; $i < 10; $i++) {
+ $tserver = trim($_POST["server{$i}"]);
+ if (!empty($tserver)) {
+ $timeservers .= "{$tserver} ";
+ if (!empty($_POST["servprefer{$i}"])) {
+ $config['ntpd']['prefer'] .= "{$tserver} ";
+ }
+ if (!empty($_POST["servselect{$i}"])) {
+ $config['ntpd']['noselect'] .= "{$tserver} ";
+ }
+ }
+ }
+ if (trim($timeservers) == "") {
+ $timeservers = "pool.ntp.org";
+ }
+ $config['system']['timeservers'] = trim($timeservers);
+
+ if (!empty($_POST['ntporphan']) && ($_POST['ntporphan'] < 17) && ($_POST['ntporphan'] != '12')) {
+ $config['ntpd']['orphan'] = $_POST['ntporphan'];
+ } elseif (isset($config['ntpd']['orphan'])) {
+ unset($config['ntpd']['orphan']);
+ }
+
+ if (!empty($_POST['logpeer'])) {
+ $config['ntpd']['logpeer'] = $_POST['logpeer'];
+ } elseif (isset($config['ntpd']['logpeer'])) {
+ unset($config['ntpd']['logpeer']);
+ }
+
+ if (!empty($_POST['logsys'])) {
+ $config['ntpd']['logsys'] = $_POST['logsys'];
+ } elseif (isset($config['ntpd']['logsys'])) {
+ unset($config['ntpd']['logsys']);
+ }
+
+ if (!empty($_POST['clockstats'])) {
+ $config['ntpd']['clockstats'] = $_POST['clockstats'];
+ } elseif (isset($config['ntpd']['clockstats'])) {
+ unset($config['ntpd']['clockstats']);
+ }
+
+ if (!empty($_POST['loopstats'])) {
+ $config['ntpd']['loopstats'] = $_POST['loopstats'];
+ } elseif (isset($config['ntpd']['loopstats'])) {
+ unset($config['ntpd']['loopstats']);
+ }
+
+ if (!empty($_POST['peerstats'])) {
+ $config['ntpd']['peerstats'] = $_POST['peerstats'];
+ } elseif (isset($config['ntpd']['peerstats'])) {
+ unset($config['ntpd']['peerstats']);
+ }
+
+ if (empty($_POST['kod'])) {
+ $config['ntpd']['kod'] = 'on';
+ } elseif (isset($config['ntpd']['kod'])) {
+ unset($config['ntpd']['kod']);
+ }
+
+ if (empty($_POST['nomodify'])) {
+ $config['ntpd']['nomodify'] = 'on';
+ } elseif (isset($config['ntpd']['nomodify'])) {
+ unset($config['ntpd']['nomodify']);
+ }
+
+ if (!empty($_POST['noquery'])) {
+ $config['ntpd']['noquery'] = $_POST['noquery'];
+ } elseif (isset($config['ntpd']['noquery'])) {
+ unset($config['ntpd']['noquery']);
+ }
+
+ if (!empty($_POST['noserve'])) {
+ $config['ntpd']['noserve'] = $_POST['noserve'];
+ } elseif (isset($config['ntpd']['noserve'])) {
+ unset($config['ntpd']['noserve']);
+ }
+
+ if (empty($_POST['nopeer'])) {
+ $config['ntpd']['nopeer'] = 'on';
+ } elseif (isset($config['ntpd']['nopeer'])) {
+ unset($config['ntpd']['nopeer']);
+ }
+
+ if (empty($_POST['notrap'])) {
+ $config['ntpd']['notrap'] = 'on';
+ } elseif (isset($config['ntpd']['notrap'])) {
+ unset($config['ntpd']['notrap']);
+ }
+
+ if ((empty($_POST['statsgraph'])) == (isset($config['ntpd']['statsgraph']))) {
+ $enable_rrd_graphing = true;
+ }
+ if (!empty($_POST['statsgraph'])) {
+ $config['ntpd']['statsgraph'] = $_POST['statsgraph'];
+ } elseif (isset($config['ntpd']['statsgraph'])) {
+ unset($config['ntpd']['statsgraph']);
+ }
+ if (isset($enable_rrd_graphing)) {
+ enable_rrd_graphing();
+ }
+
+ if (!empty($_POST['leaptxt'])) {
+ $config['ntpd']['leapsec'] = base64_encode($_POST['leaptxt']);
+ } elseif (isset($config['ntpd']['leapsec'])) {
+ unset($config['ntpd']['leapsec']);
+ }
+
+ if (is_uploaded_file($_FILES['leapfile']['tmp_name'])) {
+ $config['ntpd']['leapsec'] = base64_encode(file_get_contents($_FILES['leapfile']['tmp_name']));
+ }
+
+ write_config("Updated NTP Server Settings");
+
+ $retval = 0;
+ $retval = system_ntp_configure();
+ $savemsg = get_std_save_message($retval);
+ }
+}
+$closehead = false;
+$pconfig = &$config['ntpd'];
+if (empty($pconfig['interface'])) {
+ $pconfig['interface'] = array();
+} else {
+ $pconfig['interface'] = explode(",", $pconfig['interface']);
+}
+$pgtitle = array(gettext("Services"), gettext("NTP"));
+$shortcut_section = "ntp";
+include("head.inc");
+
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+ //Generic show an advanced option function
+ function show_advanced(showboxID, configvalueID) {
+ document.getElementById(showboxID).innerHTML='';
+ aodiv = document.getElementById(configvalueID);
+ aodiv.style.display = "block";
+ }
+
+ //Insure only one of two mutually exclusive options are checked
+ function CheckOffOther(clicked, checkOff) {
+ if (document.getElementById(clicked).checked) {
+ document.getElementById(checkOff).checked=false;
+ }
+ }
+
+ //Show another time server line, limited to 10 servers
+ function NewTimeServer(add) {
+ //If the last line has a value
+ var CheckServer = 'server' + (add - 1);
+ var LastId = document.getElementById(CheckServer);
+ if (document.getElementById(CheckServer).value != '') {
+ if (add < 10) {
+ var TimeServerID = 'timeserver' + add;
+ document.getElementById(TimeServerID).style.display = 'block';
+ //then revise the add another server line
+ if (add < 9) {
+ var next = add + 1;
+ var newdiv = '<img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?php echo gettext("Add another Time server");?>" onclick="NewTimeServer(' + next + ')" alt="add" />\n';
+ document.getElementById('addserver').innerHTML=newdiv;
+ } else {
+ document.getElementById('addserver').style.display = 'none';
+ }
+ }
+ }
+ }
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_ntpd.php" method="post" name="iform" id="iform" enctype="multipart/form-data" accept-charset="utf-8">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ntpd">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("NTP"), true, "services_ntpd.php");
+ $tab_array[] = array(gettext("Serial GPS"), false, "services_ntpd_gps.php");
+ $tab_array[] = array(gettext("PPS"), false, "services_ntpd_pps.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("NTP Server Configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Interface(s)</td>
+ <td width="78%" class="vtable">
+<?php
+ $interfaces = get_configured_interface_with_descr();
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip) {
+ $interfaces[$cif] = $carpip." (".get_vip_descr($carpip).")";
+ }
+ $aliaslist = get_configured_ip_aliases_list();
+ foreach ($aliaslist as $aliasip => $aliasif) {
+ $interfaces[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+ }
+ $size = (count($interfaces) < 10) ? count($interfaces) : 10;
+?>
+ <select id="interface" name="interface[]" multiple="multiple" class="formselect" size="<?php echo $size; ?>">
+<?php
+ foreach ($interfaces as $iface => $ifacename) {
+ if (!is_ipaddr(get_interface_ip($iface)) && !is_ipaddr($iface)) {
+ continue;
+ }
+ echo "<option value='{$iface}'";
+ if (is_array($pconfig['interface'])) {
+ if (in_array($iface, $pconfig['interface'])) {
+ echo " selected=\"selected\"";
+ }
+ }
+ echo ">" . htmlspecialchars($ifacename) . "</option>\n";
+ }
+?>
+ </select>
+ <br />
+ <br /><?php echo gettext("Interfaces without an IP address will not be shown."); ?>
+ <br />
+ <br /><?php echo gettext("Selecting no interfaces will listen on all interfaces with a wildcard."); ?>
+ <br /><?php echo gettext("Selecting all interfaces will explicitly listen on only the interfaces/IPs specified."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Time servers</td>
+ <td width="78%" class="vtable">
+ <?php
+ $timeservers = explode(' ', $config['system']['timeservers']);
+ for ($i = $j = 0; $i < 10; $i++) {
+ echo "<div id=\"timeserver{$i}\"";
+ if ((isset($timeservers[$i])) || ($i < 3)) {
+ $j++;
+ } else {
+ echo " style=\"display:none\"";
+ }
+ echo ">\n";
+
+ echo "<input name=\"server{$i}\" class=\"formfld unknown\" id=\"server{$i}\" size=\"30\" value=\"" . htmlspecialchars($timeservers[$i]) . "\" type=\"text\" />&emsp;";
+ echo "\n<input name=\"servprefer{$i}\" class=\"formcheckbox\" id=\"servprefer{$i}\" onclick=\"CheckOffOther('servprefer{$i}', 'servselect{$i}')\" type=\"checkbox\"";
+ if (isset($config['ntpd']['prefer']) && isset($timeservers[$i]) && substr_count($config['ntpd']['prefer'], $timeservers[$i])) {
+ echo " checked=\"checked\"";
+ }
+ echo " />&nbsp;prefer&emsp;";
+ echo "\n<input name=\"servselect{$i}\" class=\"formcheckbox\" id=\"servselect{$i}\" onclick=\"CheckOffOther('servselect{$i}', 'servprefer{$i}')\" type=\"checkbox\"";
+ if (isset($config['ntpd']['noselect']) && isset($timeservers[$i]) && substr_count($config['ntpd']['noselect'], $timeservers[$i])) {
+ echo " checked=\"checked\"";
+ }
+ echo " />&nbsp;noselect\n<br />\n</div>\n";
+ }
+ ?>
+ <div id="addserver">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?php echo gettext("Add another Time server");?>" onclick="NewTimeServer(<?php echo $j;?>)" alt="add" />
+ </div>
+ <br />
+ <?php echo gettext('For best results three to five servers should be configured here.'); ?>
+ <br />
+ <?php echo gettext('The <i>prefer</i> option indicates that NTP should favor the use of this server more than all others.'); ?>
+ <br />
+ <?php echo gettext('The <i>noselect</i> option indicates that NTP should not use this server for time, but stats for this server will be collected and displayed.'); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Orphan mode</td>
+ <td width="78%" class="vtable">
+ <input name="ntporphan" type="text" class="formfld unknown" id="ntporphan" min="1" max="16" size="20" value="<?=htmlspecialchars($pconfig['orphan']);?>" /><?php echo gettext("(0-15)");?><br />
+ <?php echo gettext("Orphan mode allows the system clock to be used when no other clocks are available. The number here specifies the stratum reported during orphan mode and should normally be set to a number high enough to insure that any other servers available to clients are preferred over this server. (default: 12)."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">NTP graphs</td>
+ <td width="78%" class="vtable">
+ <input name="statsgraph" type="checkbox" class="formcheckbox" id="statsgraph" <?php if ($pconfig['statsgraph']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Enable RRD graphs of NTP statistics (default: disabled)."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Syslog logging</td>
+ <td width="78%" class="vtable">
+ <?php echo gettext("These options enable additional messages from NTP to be written to the System Log");?> (<a href="diag_logs_ntpd.php"><?php echo gettext("Status > System Logs > NTP"); ?></a>).
+ <br /><br />
+ <input name="logpeer" type="checkbox" class="formcheckbox" id="logpeer"<?php if ($pconfig['logpeer']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Enable logging of peer messages (default: disabled)."); ?>
+ <br />
+ <input name="logsys" type="checkbox" class="formcheckbox" id="logsys"<?php if ($pconfig['logsys']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Enable logging of system messages (default: disabled)."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Statistics logging</td>
+ <td width="78%" class="vtable">
+ <div id="showstatisticsbox">
+ <input type="button" onclick="show_advanced('showstatisticsbox', 'showstatistics')" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show statistics logging options");?>
+ </div>
+ <div id="showstatistics" style="display:none">
+ <strong><?php echo gettext("Warning: ")?></strong><?php echo gettext("these options will create persistent daily log files in /var/log/ntp."); ?>
+ <br /><br />
+ <input name="clockstats" type="checkbox" class="formcheckbox" id="clockstats"<?php if ($pconfig['clockstats']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Enable logging of reference clock statistics (default: disabled)."); ?>
+ <br />
+ <input name="loopstats" type="checkbox" class="formcheckbox" id="loopstats"<?php if ($pconfig['loopstats']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Enable logging of clock discipline statistics (default: disabled)."); ?>
+ <br />
+ <input name="peerstats" type="checkbox" class="formcheckbox" id="peerstats"<?php if ($pconfig['peerstats']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Enable logging of NTP peer statistics (default: disabled)."); ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Access restrictions</td>
+ <td width="78%" class="vtable">
+ <div id="showrestrictbox">
+ <input type="button" onclick="show_advanced('showrestrictbox', 'showrestrict')" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show access restriction options");?>
+ </div>
+ <div id="showrestrict" style="display:none">
+ <?php echo gettext("these options control access to NTP from the WAN."); ?>
+ <br /><br />
+ <input name="kod" type="checkbox" class="formcheckbox" id="kod"<?php if (!$pconfig['kod']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Enable Kiss-o'-death packets (default: enabled)."); ?>
+ <br />
+ <input name="nomodify" type="checkbox" class="formcheckbox" id="nomodify"<?php if (!$pconfig['nomodify']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Deny state modifications (i.e. run time configuration) by ntpq and ntpdc (default: enabled)."); ?>
+ <br />
+ <input name="noquery" type="checkbox" class="formcheckbox" id="noquery"<?php if ($pconfig['noquery']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Disable ntpq and ntpdc queries (default: disabled)."); ?>
+ <br />
+ <input name="noserve" type="checkbox" class="formcheckbox" id="noserve"<?php if ($pconfig['noserve']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Disable all except ntpq and ntpdc queries (default: disabled)."); ?>
+ <br />
+ <input name="nopeer" type="checkbox" class="formcheckbox" id="nopeer"<?php if (!$pconfig['nopeer']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Deny packets that attempt a peer association (default: enabled)."); ?>
+ <br />
+ <input name="notrap" type="checkbox" class="formcheckbox" id="notrap"<?php if (!$pconfig['notrap']) echo " checked=\"checked\""; ?> />
+ <?php echo gettext("Deny mode 6 control message trap service (default: enabled)."); ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Leap seconds</td>
+ <td width="78%" class="vtable">
+ <div id="showleapsecbox">
+ <input type="button" onclick="show_advanced('showleapsecbox', 'showleapsec')" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show Leap second configuration");?>
+ </div>
+ <div id="showleapsec" style="display:none">
+ <?php echo gettext("A leap second file allows NTP to advertise an upcoming leap second addition or subtraction.");?>
+ <?php echo gettext("Normally this is only useful if this server is a stratum 1 time server.");?>
+ <br /><br />
+ <?php echo gettext("Enter Leap second configuration as text:");?><br />
+ <textarea name="leaptxt" class="formpre" id="leaptxt" cols="65" rows="7"><?php $text = base64_decode(chunk_split($pconfig['leapsec'])); echo $text;?></textarea><br />
+ <strong><?php echo gettext("Or");?></strong>, <?php echo gettext("select a file to upload:");?>
+ <input type="file" name="leapfile" class="formfld file" id="leapfile" />
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_ntpd_gps.php b/src/usr/local/www/services_ntpd_gps.php
new file mode 100644
index 0000000..c8098c1
--- /dev/null
+++ b/src/usr/local/www/services_ntpd_gps.php
@@ -0,0 +1,619 @@
+<?php
+/* $Id$ */
+/*
+ services_ntpd_gps.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2013 Dagorlad
+ Copyright (C) 2012 Jim Pingle
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: ntpd_gps
+*/
+
+##|+PRIV
+##|*IDENT=page-services-ntpd-gps
+##|*NAME=Services: NTP Serial GPS page
+##|*DESCR=Allow access to the 'Services: NTP Serial GPS' page..
+##|*MATCH=services_ntpd_gps.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+
+function set_default_gps() {
+ global $config;
+
+ if (!is_array($config['ntpd'])) {
+ $config['ntpd'] = array();
+ }
+ if (is_array($config['ntpd']['gps'])) {
+ unset($config['ntpd']['gps']);
+ }
+
+ $config['ntpd']['gps'] = array();
+ $config['ntpd']['gps']['type'] = 'Default';
+ /* copy an existing configured GPS port if it exists, the unset may be uncommented post production */
+ if (!empty($config['ntpd']['gpsport']) && empty($config['ntpd']['gps']['port'])) {
+ $config['ntpd']['gps']['port'] = $config['ntpd']['gpsport'];
+ unset($config['ntpd']['gpsport']); /* this removes the original port config from config.xml */
+ $config['ntpd']['gps']['speed'] = 0;
+ $config['ntpd']['gps']['nmea'] = 0;
+ }
+
+ write_config("Setting default NTPd settings");
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+
+ if (!empty($_POST['gpsport']) && file_exists('/dev/'.$_POST['gpsport'])) {
+ $config['ntpd']['gps']['port'] = $_POST['gpsport'];
+ } else {
+ /* if port is not set, remove all the gps config */
+ unset($config['ntpd']['gps']);
+ }
+
+ if (!empty($_POST['gpstype'])) {
+ $config['ntpd']['gps']['type'] = $_POST['gpstype'];
+ } elseif (isset($config['ntpd']['gps']['type'])) {
+ unset($config['ntpd']['gps']['type']);
+ }
+
+ if (!empty($_POST['gpsspeed'])) {
+ $config['ntpd']['gps']['speed'] = $_POST['gpsspeed'];
+ } elseif (isset($config['ntpd']['gps']['speed'])) {
+ unset($config['ntpd']['gps']['speed']);
+ }
+
+ if (!empty($_POST['gpsnmea']) && ($_POST['gpsnmea'][0] === "0")) {
+ $config['ntpd']['gps']['nmea'] = "0";
+ } else {
+ $config['ntpd']['gps']['nmea'] = strval(array_sum($_POST['gpsnmea']));
+ }
+
+ if (!empty($_POST['gpsfudge1'])) {
+ $config['ntpd']['gps']['fudge1'] = $_POST['gpsfudge1'];
+ } elseif (isset($config['ntpd']['gps']['fudge1'])) {
+ unset($config['ntpd']['gps']['fudge1']);
+ }
+
+ if (!empty($_POST['gpsfudge2'])) {
+ $config['ntpd']['gps']['fudge2'] = $_POST['gpsfudge2'];
+ } elseif (isset($config['ntpd']['gps']['fudge2'])) {
+ unset($config['ntpd']['gps']['fudge2']);
+ }
+
+ if (!empty($_POST['gpsstratum']) && ($_POST['gpsstratum']) < 17) {
+ $config['ntpd']['gps']['stratum'] = $_POST['gpsstratum'];
+ } elseif (isset($config['ntpd']['gps']['stratum'])) {
+ unset($config['ntpd']['gps']['stratum']);
+ }
+
+ if (empty($_POST['gpsprefer'])) {
+ $config['ntpd']['gps']['prefer'] = 'on';
+ } elseif (isset($config['ntpd']['gps']['prefer'])) {
+ unset($config['ntpd']['gps']['prefer']);
+ }
+
+ if (!empty($_POST['gpsselect'])) {
+ $config['ntpd']['gps']['noselect'] = $_POST['gpsselect'];
+ } elseif (isset($config['ntpd']['gps']['noselect'])) {
+ unset($config['ntpd']['gps']['noselect']);
+ }
+
+ if (!empty($_POST['gpsflag1'])) {
+ $config['ntpd']['gps']['flag1'] = $_POST['gpsflag1'];
+ } elseif (isset($config['ntpd']['gps']['flag1'])) {
+ unset($config['ntpd']['gps']['flag1']);
+ }
+
+ if (!empty($_POST['gpsflag2'])) {
+ $config['ntpd']['gps']['flag2'] = $_POST['gpsflag2'];
+ } elseif (isset($config['ntpd']['gps']['flag2'])) {
+ unset($config['ntpd']['gps']['flag2']);
+ }
+
+ if (!empty($_POST['gpsflag3'])) {
+ $config['ntpd']['gps']['flag3'] = $_POST['gpsflag3'];
+ } elseif (isset($config['ntpd']['gps']['flag3'])) {
+ unset($config['ntpd']['gps']['flag3']);
+ }
+
+ if (!empty($_POST['gpsflag4'])) {
+ $config['ntpd']['gps']['flag4'] = $_POST['gpsflag4'];
+ } elseif (isset($config['ntpd']['gps']['flag4'])) {
+ unset($config['ntpd']['gps']['flag4']);
+ }
+
+ if (!empty($_POST['gpssubsec'])) {
+ $config['ntpd']['gps']['subsec'] = $_POST['gpssubsec'];
+ } elseif (isset($config['ntpd']['gps']['subsec'])) {
+ unset($config['ntpd']['gps']['subsec']);
+ }
+
+ if (!empty($_POST['gpsrefid'])) {
+ $config['ntpd']['gps']['refid'] = $_POST['gpsrefid'];
+ } elseif (isset($config['ntpd']['gps']['refid'])) {
+ unset($config['ntpd']['gps']['refid']);
+ }
+
+ if (!empty($_POST['gpsinitcmd'])) {
+ $config['ntpd']['gps']['initcmd'] = base64_encode($_POST['gpsinitcmd']);
+ } elseif (isset($config['ntpd']['gps']['initcmd'])) {
+ unset($config['ntpd']['gps']['initcmd']);
+ }
+
+ write_config("Updated NTP GPS Settings");
+
+ $retval = system_ntp_configure();
+ $savemsg = get_std_save_message($retval);
+} else {
+ /* set defaults if they do not already exist */
+ if (!is_array($config['ntpd']) || !is_array($config['ntpd']['gps']) || empty($config['ntpd']['gps']['type'])) {
+ set_default_gps();
+ }
+}
+$closehead = false;
+$pconfig = &$config['ntpd']['gps'];
+$pgtitle = array(gettext("Services"), gettext("NTP GPS"));
+$shortcut_section = "ntp";
+include("head.inc");
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+ function show_advanced(showboxID, configvalueID) {
+ document.getElementById(showboxID).innerHTML='';
+ aodiv = document.getElementById(configvalueID);
+ aodiv.style.display = "block";
+ }
+
+ function ToggleOther(clicked, checkOff) {
+ if (document.getElementById(clicked).checked) {
+ document.getElementById(checkOff).checked=false;
+ }
+ }
+
+/*
+init commands are Base64 encoded
+Default = #Sponsored, probably a Ublox
+ $PUBX,40,GSV,0,0,0,0*59
+ $PUBX,40,GLL,0,0,0,0*5C
+ $PUBX,40,ZDA,0,0,0,0*44
+ $PUBX,40,VTG,0,0,0,0*5E
+ $PUBX,40,GSV,0,0,0,0*59
+ $PUBX,40,GSA,0,0,0,0*4E
+ $PUBX,40,GGA,0,0,0,0
+ $PUBX,40,TXT,0,0,0,0
+ $PUBX,40,RMC,0,0,0,0*46
+ $PUBX,41,1,0007,0003,4800,0
+ $PUBX,40,ZDA,1,1,1,1
+
+Generic = #do nothing
+
+Garmin = #most Garmin
+ $PGRMC,,,,,,,,,,3,,2,4*52 #enable PPS @ 100ms
+ $PGRMC1,,1,,,,,,W,,,,,,,*30 #enable WAAS
+ $PGRMO,,3*74 #turn off all sentences
+ $PGRMO,GPRMC,1*3D #enable RMC
+ $PGRMO,GPGGA,1*20 #enable GGA
+ $PGRMO,GPGLL,1*26 #enable GLL
+
+MediaTek = #Adafruit, Fastrax, some Garmin and others
+ $PMTK225,0*2B #normal power mode
+ $PMTK314,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0*28 #enable GLL, RMC, GGA and ZDA
+ $PMTK301,2*2E #enable WAAS
+ $PMTK320,0*2F #power save off
+ $PMTK330,0*2E #set WGS84 datum
+ $PMTK386,0*23 #disable static navigation (MT333X)
+ $PMTK397,0*23 #disable static navigation (MT332X)
+ $PMTK251,4800*14 #4800 baud rate
+
+SiRF = #used by many devices
+ $PSRF103,00,00,01,01*25 #turn on GGA
+ $PSRF103,01,00,01,01*24 #turn on GLL
+ $PSRF103,02,00,00,01*24 #turn off GSA
+ $PSRF103,03,00,00,01*24 #turn off GSV
+ $PSRF103,04,00,01,01*24 #turn on RMC
+ $PSRF103,05,00,00,01*24 #turn off VTG
+ $PSRF100,1,4800,8,1,0*0E #set port to 4800,N,8,1
+
+U-Blox = #U-Blox 5, 6 and probably 7
+ $PUBX,40,GGA,1,1,1,1,0,0*5A #turn on GGA all ports
+ $PUBX,40,GLL,1,1,1,1,0,0*5C #turn on GLL all ports
+ $PUBX,40,GSA,0,0,0,0,0,0*4E #turn off GSA all ports
+ $PUBX,40,GSV,0,0,0,0,0,0*59 #turn off GSV all ports
+ $PUBX,40,RMC,1,1,1,1,0,0*47 #turn on RMC all ports
+ $PUBX,40,VTG,0,0,0,0,0,0*5E #turn off VTG all ports
+ $PUBX,40,GRS,0,0,0,0,0,0*5D #turn off GRS all ports
+ $PUBX,40,GST,0,0,0,0,0,0*5B #turn off GST all ports
+ $PUBX,40,ZDA,1,1,1,1,0,0*44 #turn on ZDA all ports
+ $PUBX,40,GBS,0,0,0,0,0,0*4D #turn off GBS all ports
+ $PUBX,40,DTM,0,0,0,0,0,0*46 #turn off DTM all ports
+ $PUBX,40,GPQ,0,0,0,0,0,0*5D #turn off GPQ all ports
+ $PUBX,40,TXT,0,0,0,0,0,0*43 #turn off TXT all ports
+ $PUBX,40,THS,0,0,0,0,0,0*54 #turn off THS all ports (U-Blox 6)
+ $PUBX,41,1,0007,0003,4800,0*13 # set port 1 to 4800 baud
+
+SureGPS = #Sure Electronics SKG16B
+ $PMTK225,0*2B
+ $PMTK314,1,1,0,1,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0*2D
+ $PMTK301,2*2E
+ $PMTK397,0*23
+ $PMTK102*31
+ $PMTK313,1*2E
+ $PMTK513,1*28
+ $PMTK319,0*25
+ $PMTK527,0.00*00
+ $PMTK251,9600*17 #really needs to work at 9600 baud
+
+*/
+
+ function set_gps_default(form) {
+ //This handles a new config and also a reset to a defined default config
+ var gpsdef = new Object();
+ //get the text description of the selected type
+ var e = document.getElementById("gpstype");
+ var type = e.options[e.selectedIndex].text;
+
+ //stuff the JS object as needed for each type
+ switch (type) {
+ case "Default":
+ gpsdef['nmea'] = 0;
+ gpsdef['speed'] = 0;
+ gpsdef['fudge1'] = "0.155";
+ gpsdef['fudge2'] = "";
+ gpsdef['inittxt'] = "JFBVQlgsNDAsR1NWLDAsMCwwLDAqNTkNCiRQVUJYLDQwLEdMTCwwLDAsMCwwKjVDDQokUFVCWCw0MCxaREEsMCwwLDAsMCo0NA0KJFBVQlgsNDAsVlRHLDAsMCwwLDAqNUUNCiRQVUJYLDQwLEdTViwwLDAsMCwwKjU5DQokUFVCWCw0MCxHU0EsMCwwLDAsMCo0RQ0KJFBVQlgsNDAsR0dBLDAsMCwwLDANCiRQVUJYLDQwLFRYVCwwLDAsMCwwDQokUFVCWCw0MCxSTUMsMCwwLDAsMCo0Ng0KJFBVQlgsNDEsMSwwMDA3LDAwMDMsNDgwMCwwDQokUFVCWCw0MCxaREEsMSwxLDEsMQ0K";
+ break;
+
+ case "Garmin":
+ gpsdef['nmea'] = 0;
+ gpsdef['speed'] = 0;
+ gpsdef['fudge1'] = "";
+ gpsdef['fudge2'] = "0.600";
+ gpsdef['inittxt'] = "JFBHUk1DLCwsLCwsLCwsLDMsLDIsOCo1RQ0KJFBHUk1DMSwsMSwsLCwsLFcsLCwsLCwsKjMwDQokUEdSTU8sLDMqNzQNCiRQR1JNTyxHUFJNQywxKjNEDQokUEdSTU8sR1BHR0EsMSoyMA0KJFBHUk1PLEdQR0xMLDEqMjYNCg==";
+ break;
+
+ case "Generic":
+ gpsdef['nmea'] = 0;
+ gpsdef['speed'] = 0;
+ gpsdef['fudge1'] = "";
+ gpsdef['fudge2'] = "0.400";
+ gpsdef['inittxt'] = "";
+ break;
+
+ case "MediaTek":
+ gpsdef['nmea'] = 0;
+ gpsdef['speed'] = 0;
+ gpsdef['fudge1'] = "";
+ gpsdef['fudge2'] = "0.400";
+ gpsdef['inittxt'] = "JFBNVEsyMjUsMCoyQg0KJFBNVEszMTQsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCoyOA0KJFBNVEszMDEsMioyRQ0KJFBNVEszMjAsMCoyRg0KJFBNVEszMzAsMCoyRQ0KJFBNVEszODYsMCoyMw0KJFBNVEszOTcsMCoyMw0KJFBNVEsyNTEsNDgwMCoxNA0K";
+ break;
+
+ case "SiRF":
+ gpsdef['nmea'] = 0;
+ gpsdef['speed'] = 0;
+ gpsdef['fudge1'] = "";
+ gpsdef['fudge2'] = "0.704"; //valid for 4800, 0.688 @ 9600, 0.640 @ USB
+ gpsdef['inittxt'] = "JFBTUkYxMDMsMDAsMDAsMDEsMDEqMjUNCiRQU1JGMTAzLDAxLDAwLDAxLDAxKjI0DQokUFNSRjEwMywwMiwwMCwwMCwwMSoyNA0KJFBTUkYxMDMsMDMsMDAsMDAsMDEqMjQNCiRQU1JGMTAzLDA0LDAwLDAxLDAxKjI0DQokUFNSRjEwMywwNSwwMCwwMCwwMSoyNA0KJFBTUkYxMDAsMSw0ODAwLDgsMSwwKjBFDQo=";
+ break;
+
+ case "U-Blox":
+ gpsdef['nmea'] = 0;
+ gpsdef['speed'] = 0;
+ gpsdef['fudge1'] = "";
+ gpsdef['fudge2'] = "0.400";
+ gpsdef['inittxt'] = "JFBVQlgsNDAsR0dBLDEsMSwxLDEsMCwwKjVBDQokUFVCWCw0MCxHTEwsMSwxLDEsMSwwLDAqNUMNCiRQVUJYLDQwLEdTQSwwLDAsMCwwLDAsMCo0RQ0KJFBVQlgsNDAsR1NWLDAsMCwwLDAsMCwwKjU5DQokUFVCWCw0MCxSTUMsMSwxLDEsMSwwLDAqNDcNCiRQVUJYLDQwLFZURywwLDAsMCwwLDAsMCo1RQ0KJFBVQlgsNDAsR1JTLDAsMCwwLDAsMCwwKjVEDQokUFVCWCw0MCxHU1QsMCwwLDAsMCwwLDAqNUINCiRQVUJYLDQwLFpEQSwxLDEsMSwxLDAsMCo0NA0KJFBVQlgsNDAsR0JTLDAsMCwwLDAsMCwwKjREDQokUFVCWCw0MCxEVE0sMCwwLDAsMCwwLDAqNDYNCiRQVUJYLDQwLEdQUSwwLDAsMCwwLDAsMCo1RA0KJFBVQlgsNDAsVFhULDAsMCwwLDAsMCwwKjQzDQokUFVCWCw0MCxUSFMsMCwwLDAsMCwwLDAqNTQNCiRQVUJYLDQxLDEsMDAwNywwMDAzLDQ4MDAsMCoxMw0K";
+ break;
+
+ case "SureGPS":
+ gpsdef['nmea'] = 1;
+ gpsdef['speed'] = 16;
+ gpsdef['fudge1'] = "";
+ gpsdef['fudge2'] = "0.407";
+ gpsdef['inittxt'] = "JFBNVEsyMjUsMCoyQg0KJFBNVEszMTQsMSwxLDAsMSwwLDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCoyRA0KJFBNVEszMDEsMioyRQ0KJFBNVEszOTcsMCoyMw0KJFBNVEsxMDIqMzENCiRQTVRLMzEzLDEqMkUNCiRQTVRLNTEzLDEqMjgNCiRQTVRLMzE5LDAqMjUNCiRQTVRLNTI3LDAuMDAqMDANCiRQTVRLMjUxLDk2MDAqMTcNCg==";
+ break;
+ default:
+ return;
+ }
+
+ //then update the html and set the common stuff
+ document.getElementById("gpsnmea").selectedIndex = gpsdef['nmea'];
+ document.getElementById("gpsspeed").selectedIndex = gpsdef['speed'];
+ form.gpsfudge1.value = gpsdef['fudge1'];
+ form.gpsfudge2.value = gpsdef['fudge2'];
+ form.gpsstratum.value = "";
+ form.gpsrefid.value = "";
+ form.gpsspeed.value = gpsdef['speed'];
+ document.getElementById("gpsflag1").checked=true
+ document.getElementById("gpsflag2").checked=false
+ document.getElementById("gpsflag3").checked=true
+ document.getElementById("gpsflag4").checked=false
+ document.getElementById("gpssubsec").checked=false
+ form.gpsinitcmd.value = atob(gpsdef['inittxt']);
+ }
+
+ //function to compute a NMEA checksum derived from the public domain function at http://www.hhhh.org/wiml/proj/nmeaxor.html
+ function NMEAChecksum(cmd) {
+ // Compute the checksum by XORing all the character values in the string.
+ var checksum = 0;
+ for (var i = 0; i < cmd.length; i++) {
+ checksum = checksum ^ cmd.charCodeAt(i);
+ }
+ // Convert it to hexadecimal (base-16, upper case, most significant byte first).
+ var hexsum = Number(checksum).toString(16).toUpperCase();
+ if (hexsum.length < 2) {
+ hexsum = ("00" + hexsum).slice(-2);
+ }
+ // Display the result
+ document.getElementById("nmeachecksum").innerHTML = hexsum;
+ }
+//]]>
+</script>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_ntpd_gps.php" method="post" name="iform" id="iform" accept-charset="utf-8">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ntpd gps">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("NTP"), false, "services_ntpd.php");
+ $tab_array[] = array(gettext("Serial GPS"), true, "services_ntpd_gps.php");
+ $tab_array[] = array(gettext("PPS"), false, "services_ntpd_pps.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("NTP Serial GPS Configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">
+ </td>
+ <td width="78%" class="vtable">A GPS connected via a serial port may be used as a reference clock for NTP. If the GPS also supports PPS and is properly configured, and connected, that GPS may also be used as a Pulse Per Second clock reference. NOTE: a USB GPS may work, but is not recommended due to USB bus timing issues.
+ <br />
+ <br /><?php echo gettext("For the best results, NTP should have at least three sources of time. So it is best to configure at least 2 servers under"); ?> <a href="services_ntpd.php"><?php echo gettext("Services > NTP"); ?></a> <?php echo gettext("to minimize clock drift if the GPS data is not valid over time. Otherwise ntpd may only use values from the unsynchronized local clock when providing time to clients."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("GPS"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <!-- Start with the original "Default", list a "Generic" and then specific configs alphabetically -->
+ <select id="gpstype" name="gpstype" class="formselect" onchange="set_gps_default(this.form)">
+ <option value="Custom"<?php if ($pconfig['type'] == 'Custom') echo " selected=\"selected\""; ?>>Custom</option>
+ <option value="Default"<?php if ($pconfig['type'] == 'Default') echo " selected=\"selected\""; ?>>Default</option>
+ <option value="Generic" title="Generic"<?php if ($pconfig['type'] == 'Generic') echo " selected=\"selected\"";?>>Generic</option>
+ <option value="Garmin" title="$PGRM... Most Garmin"<?php if ($pconfig['type'] == 'Garmin') echo " selected=\"selected\"";?>>Garmin</option>
+ <option value="MediaTek" title="$PMTK... Adafruit, Fastrax, some Garmin and others"<?php if ($pconfig['type'] == 'MediaTek') echo " selected=\"selected\"";?>>MediaTek</option>
+ <option value="SiRF" title="$PSRF... Used by many devices"<?php if ($pconfig['type'] == 'sirf') echo " selected=\"selected\"";?>>SiRF</option>
+ <option value="U-Blox" title="$PUBX... U-Blox 5, 6 and probably 7"<?php if ($pconfig['type'] == 'U-Blox') echo " selected=\"selected\"";?>>U-Blox</option>
+ <option value="SureGPS" title="$PMTK... Sure Electronics SKG16B"<?php if ($pconfig['type'] == 'SureGPS') echo " selected=\"selected\"";?>>SureGPS</option>
+ </select>
+ <?php echo gettext("This option allows you to select a predefined configuration.");?>
+ <br />
+ <br />
+ <strong><?php echo gettext("Note: ");?></strong><?php echo gettext("Default is the configuration of pfSense 2.1 and earlier"); ?>
+ <?php echo gettext(" (not recommended). Select Generic if your GPS is not listed.)"); ?><br />
+ <strong><?php echo gettext("Note: ");?></strong><?php echo gettext("The perdefined configurations assume your GPS has already been set to NMEA mode."); ?>
+ </td>
+ </tr>
+<?php
+ /* Probing would be nice, but much more complex. Would need to listen to each port for 1s+ and watch for strings. */
+ $serialports = glob("/dev/cua?[0-9]{,.[0-9]}", GLOB_BRACE);
+ if (!empty($serialports)):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Serial port</td>
+ <td width="78%" class="vtable">
+ <select name="gpsport" class="formselect">
+ <option value="">none</option>
+<?php
+ foreach ($serialports as $port):
+ $shortport = substr($port, 5);
+ $selected = ($shortport == $pconfig['port']) ? " selected=\"selected\"" : "";
+?>
+ <option value="<?php echo $shortport;?>"<?php echo $selected;?>><?php echo $shortport;?></option>
+<?php
+ endforeach;
+?>
+ </select>&nbsp;
+ <?php echo gettext("All serial ports are listed, be sure to pick the port with the GPS attached."); ?>
+ <br /><br />
+ <select id="gpsspeed" name="gpsspeed" class="formselect">
+ <option value="0"<?php if (!$pconfig['speed']) echo " selected=\"selected\""; ?>>4800</option>
+ <option value="16"<?php if ($pconfig['speed'] === '16') echo " selected=\"selected\"";?>>9600</option>
+ <option value="32"<?php if ($pconfig['speed'] === '32') echo " selected=\"selected\"";?>>19200</option>
+ <option value="48"<?php if ($pconfig['speed'] === '48') echo " selected=\"selected\"";?>>38400</option>
+ <option value="64"<?php if ($pconfig['speed'] === '64') echo " selected=\"selected\"";?>>57600</option>
+ <option value="80"<?php if ($pconfig['speed'] === '80') echo " selected=\"selected\"";?>>115200</option>
+ </select>&nbsp;<?php echo gettext("Serial port baud rate."); ?>
+ <br />
+ <br />
+ <?php echo gettext("Note: A higher baud rate is generally only helpful if the GPS is sending too many sentences. It is recommended to configure the GPS to send only one sentence at a baud rate of 4800 or 9600."); ?>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <!-- 1 = RMC, 2 = GGA, 4 = GLL, 8 = ZDA or ZDG -->
+ <td width="22%" valign="top" class="vncellreq">NMEA sentences</td>
+ <td width="78%" class="vtable">
+ <select id="gpsnmea" name="gpsnmea[]" multiple="multiple" class="formselect" size="5">
+ <option value="0"<?php if (!$pconfig['nmea']) echo " selected=\"selected\""; ?>>All</option>
+ <option value="1"<?php if ($pconfig['nmea'] & 1) echo " selected=\"selected\"";?>>RMC</option>
+ <option value="2"<?php if ($pconfig['nmea'] & 2) echo " selected=\"selected\"";?>>GGA</option>
+ <option value="4"<?php if ($pconfig['nmea'] & 4) echo " selected=\"selected\"";?>>GLL</option>
+ <option value="8"<?php if ($pconfig['nmea'] & 8) echo " selected=\"selected\"";?>>ZDA or ZDG</option>
+ </select><br />
+ <?php echo gettext("By default NTP will listen for all supported NMEA sentences. Here one or more sentences to listen for may be specified."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Fudge time 1</td>
+ <td width="78%" class="vtable">
+ <input name="gpsfudge1" type="text" class="formfld unknown" id="gpsfudge1" min="-1" max="1" size="20" value="<?=htmlspecialchars($pconfig['fudge1']);?>" />(<?php echo gettext("seconds");?>)<br />
+ <?php echo gettext("Fudge time 1 is used to specify the GPS PPS signal offset");?> (<?php echo gettext("default");?>: 0.0).
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Fudge time 2</td>
+ <td width="78%" class="vtable">
+ <input name="gpsfudge2" type="text" class="formfld unknown" id="gpsfudge2" min="-1" max="1" size="20" value="<?=htmlspecialchars($pconfig['fudge2']);?>" />(<?php echo gettext("seconds");?>)<br />
+ <?php echo gettext("Fudge time 2 is used to specify the GPS time offset");?> (<?php echo gettext("default");?>: 0.0).
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Stratum</td>
+ <td width="78%" class="vtable">
+ <input name="gpsstratum" type="text" class="formfld unknown" id="gpsstratum" max="16" size="20" value="<?=htmlspecialchars($pconfig['stratum']);?>" /><?php echo gettext("(0-16)");?><br />
+ <?php echo gettext("This may be used to change the GPS Clock stratum");?> (<?php echo gettext("default");?>: 0). <?php echo gettext("This may be useful if, for some reason, you want ntpd to prefer a different clock"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Flags</td>
+ <td width="78%" class="vtable">
+ <table>
+ <tr>
+ <td>
+ <?php echo gettext("Normally there should be no need to change these options from the defaults."); ?><br />
+ </td>
+ </tr>
+ </table>
+ <table>
+ <tr>
+ <td>
+ <input name="gpsprefer" type="checkbox" class="formcheckbox" id="gpsprefer" onclick="ToggleOther('gpsprefer', 'gpsselect')"<?php if (!$pconfig['prefer']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("NTP should prefer this clock (default: enabled)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="gpsselect" type="checkbox" class="formcheckbox" id="gpsselect" onclick="ToggleOther('gpsselect', 'gpsprefer')"<?php if ($pconfig['noselect']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("NTP should not use this clock, it will be displayed for reference only(default: disabled)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="gpsflag1" type="checkbox" class="formcheckbox" id="gpsflag1"<?php if ($pconfig['flag1']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("Enable PPS signal processing (default: enabled)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="gpsflag2" type="checkbox" class="formcheckbox" id="gpsflag2"<?php if ($pconfig['flag2']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("Enable falling edge PPS signal processing (default: rising edge)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="gpsflag3" type="checkbox" class="formcheckbox" id="gpsflag3"<?php if ($pconfig['flag3']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("Enable kernel PPS clock discipline (default: enabled)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="gpsflag4" type="checkbox" class="formcheckbox" id="gpsflag4"<?php if ($pconfig['flag4']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("Obscure location in timestamp (default: unobscured)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="gpssubsec" type="checkbox" class="formcheckbox" id="gpssubsec"<?php if ($pconfig['subsec']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("Log the sub-second fraction of the received time stamp (default: Not logged).<br />Note: enabling this will rapidly fill the log, but is useful for tuning Fudge time 2."); ?></span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Clock ID</td>
+ <td width="78%" class="vtable">
+ <input name="gpsrefid" type="text" class="formfld unknown" id="gpsrefid" maxlength= "4" size="20" value="<?=htmlspecialchars($pconfig['refid']);?>" /><?php echo gettext("(1 to 4 charactors)");?><br />
+ <?php echo gettext("This may be used to change the GPS Clock ID");?> (<?php echo gettext("default");?>: GPS).
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">GPS Initialization</td>
+ <td width="78%" class="vtable">
+ <div id="showgpsinitbox">
+ <input type="button" onclick="show_advanced('showgpsinitbox', 'showgpsinit')" value="<?=gettext("Advanced");?>" /> - <?=gettext("Show GPS Initialization commands");?>
+ </div>
+ <div id="showgpsinit" style="display:none">
+ <p>
+ <textarea name="gpsinitcmd" class="formpre" id="gpsinitcmd" cols="65" rows="7"><?=htmlspecialchars(base64_decode($pconfig['initcmd'])); /*resultmatch*/?></textarea><br />
+ <?php echo gettext("Note: Commands entered here will be sent to the GPS during initialization. Please read and understand your GPS documentation before making any changes here.");?><br /><br />
+ <strong><?php echo gettext("NMEA checksum calculator");?>:</strong>
+ <br />
+ <?php echo gettext("Enter the text between &quot;$&quot; and &quot;*&quot; of a NMEA command string:");?><br /> $<input name="nmeastring" type="text" class="formfld unknown" id="nmeastring" size="30" value="" />*<span id="nmeachecksum"><?php echo gettext("checksum");?></span>&nbsp;&nbsp;
+ <input type="button" onclick="NMEAChecksum(nmeastring.value)" value="<?=gettext("Calculate NMEA checksum");?>" /><br />
+ </p>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<script type="text/javascript">
+//<![CDATA[
+set_gps_default(this.form);
+//]]>
+</script>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_ntpd_pps.php b/src/usr/local/www/services_ntpd_pps.php
new file mode 100644
index 0000000..e4abce0
--- /dev/null
+++ b/src/usr/local/www/services_ntpd_pps.php
@@ -0,0 +1,251 @@
+<?php
+/* $Id$ */
+/*
+ services_ntpd_pps.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2013 Dagorlad
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: ntpd_pps
+*/
+
+##|+PRIV
+##|*IDENT=page-services-ntpd-pps
+##|*NAME=Services: NTP PPS page
+##|*DESCR=Allow access to the 'Services: NTP PPS' page..
+##|*MATCH=services_ntpd_pps.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+
+if (!is_array($config['ntpd'])) {
+ $config['ntpd'] = array();
+}
+if (!is_array($config['ntpd']['pps'])) {
+ $config['ntpd']['pps'] = array();
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+
+ if (!$input_errors) {
+ if (!empty($_POST['ppsport']) && file_exists('/dev/'.$_POST['ppsport'])) {
+ $config['ntpd']['pps']['port'] = $_POST['ppsport'];
+ } else {
+ /* if port is not set, remove all the pps config */
+ unset($config['ntpd']['pps']);
+ }
+
+ if (!empty($_POST['ppsfudge1'])) {
+ $config['ntpd']['pps']['fudge1'] = $_POST['ppsfudge1'];
+ } elseif (isset($config['ntpd']['pps']['fudge1'])) {
+ unset($config['ntpd']['pps']['fudge1']);
+ }
+
+ if (!empty($_POST['ppsstratum']) && ($_POST['ppsstratum']) < 17) {
+ $config['ntpd']['pps']['stratum'] = $_POST['ppsstratum'];
+ } elseif (isset($config['ntpd']['pps']['stratum'])) {
+ unset($config['ntpd']['pps']['stratum']);
+ }
+
+ if (!empty($_POST['ppsselect'])) {
+ $config['ntpd']['pps']['noselect'] = $_POST['ppsselect'];
+ } elseif (isset($config['ntpd']['pps']['noselect'])) {
+ unset($config['ntpd']['pps']['noselect']);
+ }
+
+ if (!empty($_POST['ppsflag2'])) {
+ $config['ntpd']['pps']['flag2'] = $_POST['ppsflag2'];
+ } elseif (isset($config['ntpd']['pps']['flag2'])) {
+ unset($config['ntpd']['pps']['flag2']);
+ }
+
+ if (!empty($_POST['ppsflag3'])) {
+ $config['ntpd']['pps']['flag3'] = $_POST['ppsflag3'];
+ } elseif (isset($config['ntpd']['pps']['flag3'])) {
+ unset($config['ntpd']['pps']['flag3']);
+ }
+
+ if (!empty($_POST['ppsflag4'])) {
+ $config['ntpd']['pps']['flag4'] = $_POST['ppsflag4'];
+ } elseif (isset($config['ntpd']['pps']['flag4'])) {
+ unset($config['ntpd']['pps']['flag4']);
+ }
+
+ if (!empty($_POST['ppsrefid'])) {
+ $config['ntpd']['pps']['refid'] = $_POST['ppsrefid'];
+ } elseif (isset($config['ntpd']['pps']['refid'])) {
+ unset($config['ntpd']['pps']['refid']);
+ }
+
+ write_config("Updated NTP PPS Settings");
+
+ $retval = 0;
+ $retval = system_ntp_configure();
+ $savemsg = get_std_save_message($retval);
+ }
+}
+$pconfig = &$config['ntpd']['pps'];
+
+$pgtitle = array(gettext("Services"), gettext("NTP PPS"));
+$shortcut_section = "ntp";
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_ntpd_pps.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ntpd pps">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("NTP"), false, "services_ntpd.php");
+ $tab_array[] = array(gettext("Serial GPS"), false, "services_ntpd_gps.php");
+ $tab_array[] = array(gettext("PPS"), true, "services_ntpd_pps.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("NTP PPS Configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">
+ </td>
+ <td width="78%" class="vtable"><?php echo gettext("Devices with a Pulse Per Second output such as radios that receive a time signal from DCF77 (DE), JJY (JP), MSF (GB) or WWVB (US) may be used as a PPS reference for NTP.");?>
+ <?php echo gettext("A serial GPS may also be used, but the serial GPS driver would usually be the better option.");?>
+ <?php echo gettext("A PPS signal only provides a reference to the change of a second, so at least one other source to number the seconds is required.");?>
+ <br />
+ <br /><strong><?php echo gettext("Note");?>:</strong> <?php echo gettext("At least 3 additional time sources should be configured under"); ?> <a href="services_ntpd.php"><?php echo gettext("Services > NTP"); ?></a> <?php echo gettext("to reliably supply the time of each PPS pulse."); ?>
+ </td>
+ </tr>
+<?php
+ $serialports = glob("/dev/cua?[0-9]{,.[0-9]}", GLOB_BRACE);
+ if (!empty($serialports)):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Serial port</td>
+ <td width="78%" class="vtable">
+ <select name="ppsport" class="formselect">
+ <option value="">none</option>
+ <?php
+ foreach ($serialports as $port):
+ $shortport = substr($port, 5);
+ $selected = ($shortport == $pconfig['port']) ? " selected=\"selected\"" : "";?>
+ <option value="<?php echo $shortport;?>"<?php echo $selected;?>><?php echo $shortport;?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>&nbsp;
+ <?php echo gettext("All serial ports are listed, be sure to pick the port with the PPS source attached."); ?>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Fudge time</td>
+ <td width="78%" class="vtable">
+ <input name="ppsfudge1" type="text" class="formfld unknown" id="ppsfudge1" min="-1" max="1" size="20" value="<?=htmlspecialchars($pconfig['fudge1']);?>" />(<?php echo gettext("seconds");?>)<br />
+ <?php echo gettext("Fudge time is used to specify the PPS signal offset from the actual second such as the transmission delay between the transmitter and the receiver.");?> (<?php echo gettext("default");?>: 0.0).
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Stratum</td>
+ <td width="78%" class="vtable">
+ <input name="ppsstratum" type="text" class="formfld unknown" id="ppsstratum" max="16" size="20" value="<?=htmlspecialchars($pconfig['stratum']);?>" /><?php echo gettext("(0-16)");?><br />
+ <?php echo gettext("This may be used to change the PPS Clock stratum");?> (<?php echo gettext("default");?>: 0). <?php echo gettext("This may be useful if, for some reason, you want ntpd to prefer a different clock and just monitor this source."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Flags</td>
+ <td width="78%" class="vtable">
+ <table summary="flags">
+ <tr>
+ <td>
+ <?php echo gettext("Normally there should be no need to change these options from the defaults."); ?><br />
+ </td>
+ </tr>
+ </table>
+ <table>
+ <tr>
+ <td>
+ <input name="ppsflag2" type="checkbox" class="formcheckbox" id="ppsflag2"<?php if ($pconfig['flag2']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("Enable falling edge PPS signal processing (default: rising edge)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="ppsflag3" type="checkbox" class="formcheckbox" id="ppsflag3"<?php if ($pconfig['flag3']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("Enable kernel PPS clock discipline (default: disabled)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="ppsflag4" type="checkbox" class="formcheckbox" id="ppsflag4"<?php if ($pconfig['flag4']) echo " checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <span class="vexpl"><?php echo gettext("Record a timestamp once for each second, useful for constructing Allan deviation plots (default: disabled)."); ?></span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq">Clock ID</td>
+ <td width="78%" class="vtable">
+ <input name="ppsrefid" type="text" class="formfld unknown" id="ppsrefid" maxlength= "4" size="20" value="<?php htmlspecialchars($pconfig['refid']);?>" /><?php echo gettext("(1 to 4 charactors)");?><br />
+ <?php echo gettext("This may be used to change the PPS Clock ID");?> (<?php echo gettext("default");?>: PPS).
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_rfc2136.php b/src/usr/local/www/services_rfc2136.php
new file mode 100644
index 0000000..87d4770
--- /dev/null
+++ b/src/usr/local/www/services_rfc2136.php
@@ -0,0 +1,206 @@
+<?php
+/* $Id$ */
+/*
+ services_rfc2136.php
+
+ Copyright (C) 2008 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dnsupdate
+*/
+
+##|+PRIV
+##|*IDENT=page-services-rfc2136clients
+##|*NAME=Services: RFC 2136 clients page
+##|*DESCR=Allow access to the 'Services: RFC 2136 clients' page.
+##|*MATCH=services_rfc2136.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['dnsupdates']['dnsupdate'])) {
+ $config['dnsupdates']['dnsupdate'] = array();
+}
+
+$a_rfc2136 = &$config['dnsupdates']['dnsupdate'];
+
+if ($_GET['act'] == "del") {
+ unset($a_rfc2136[$_GET['id']]);
+
+ write_config();
+
+ header("Location: services_rfc2136.php");
+ exit;
+}
+
+$pgtitle = array(gettext("Services"), gettext("RFC 2136 clients"));
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="services_rfc2136.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="rfc2136">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("DynDns"), false, "services_dyndns.php");
+ $tab_array[] = array(gettext("RFC 2136"), true, "services_rfc2136.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="5%" class="listhdrr"><?=gettext("If");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Server");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Hostname");?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Cached IP");?></td>
+ <td width="25%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_rfc2136 as $rfc2136):
+?>
+ <tr ondblclick="document.location='services_rfc2136_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+<?php
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $if => $ifdesc) {
+ if ($rfc2136['interface'] == $if) {
+ if (!isset($rfc2136['enable'])) {
+ echo "<span class=\"gray\">{$ifdesc}</span>";
+ } else {
+ echo "{$ifdesc}";
+ }
+ break;
+ }
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ if (!isset($rfc2136['enable'])) {
+ echo "<span class=\"gray\">" . htmlspecialchars($rfc2136['server']) . "</span>";
+ } else {
+ echo htmlspecialchars($rfc2136['server']);
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ if (!isset($rfc2136['enable'])) {
+ echo "<span class=\"gray\">" . htmlspecialchars($rfc2136['host']) . "</span>";
+ } else {
+ echo htmlspecialchars($rfc2136['host']);
+ }
+?>
+ </td>
+ <td class="listr">
+<?php
+ $filename = "{$g['conf_path']}/dyndns_{$rfc2136['interface']}_rfc2136_" . escapeshellarg($rfc2136['host']) . "_{$rfc2136['server']}.cache";
+ if (file_exists($filename)) {
+ echo "IPv4: ";
+ if (isset($rfc2136['usepublicip'])) {
+ $ipaddr = dyndnsCheckIP($rfc2136['interface']);
+ } else {
+ $ipaddr = get_interface_ip($rfc2136['interface']);
+ }
+ $cached_ip_s = explode("|", file_get_contents($filename));
+ $cached_ip = $cached_ip_s[0];
+ if ($ipaddr <> $cached_ip) {
+ echo "<font color='red'>";
+ } else {
+ echo "<font color='green'>";
+ }
+ echo htmlspecialchars($cached_ip);
+ echo "</font>";
+ } else {
+ echo "IPv4: N/A";
+ }
+ echo "<br />";
+ if (file_exists("{$filename}.ipv6")) {
+ echo "IPv6: ";
+ $ipaddr = get_interface_ipv6($rfc2136['interface']);
+ $cached_ip_s = explode("|", file_get_contents("{$filename}.ipv6"));
+ $cached_ip = $cached_ip_s[0];
+ if ($ipaddr <> $cached_ip) {
+ echo "<font color='red'>";
+ } else {
+ echo "<font color='green'>";
+ }
+ echo htmlspecialchars($cached_ip);
+ echo "</font>";
+ } else {
+ echo "IPv6: N/A";
+ }
+?>
+ </td>
+ <td class="listbg">
+<?php
+ if (!isset($rfc2136['enable'])) {
+ echo "<span class=\"gray\">" . htmlspecialchars($rfc2136['descr']) . "</span>";
+ } else {
+ echo htmlspecialchars($rfc2136['descr']);
+ }
+?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_rfc2136_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="services_rfc2136.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this client?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="5">&nbsp;</td>
+ <td class="list">
+ <a href="services_rfc2136_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3" class="list">
+ <p class="vexpl"><span class="red"><strong><br /></strong></span></p>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_rfc2136_edit.php b/src/usr/local/www/services_rfc2136_edit.php
new file mode 100644
index 0000000..686ca27
--- /dev/null
+++ b/src/usr/local/www/services_rfc2136_edit.php
@@ -0,0 +1,276 @@
+<?php
+/* $Id$ */
+/*
+ services_rfc2136_edit.php
+
+ Copyright (C) 2008 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dnsupdate
+*/
+
+require("guiconfig.inc");
+
+if (!is_array($config['dnsupdates']['dnsupdate'])) {
+ $config['dnsupdates']['dnsupdate'] = array();
+}
+
+$a_rfc2136 = &$config['dnsupdates']['dnsupdate'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && isset($a_rfc2136[$id])) {
+ $pconfig['enable'] = isset($a_rfc2136[$id]['enable']);
+ $pconfig['host'] = $a_rfc2136[$id]['host'];
+ $pconfig['ttl'] = $a_rfc2136[$id]['ttl'];
+ if (!$pconfig['ttl']) {
+ $pconfig['ttl'] = 60;
+ }
+ $pconfig['keydata'] = $a_rfc2136[$id]['keydata'];
+ $pconfig['keyname'] = $a_rfc2136[$id]['keyname'];
+ $pconfig['keytype'] = $a_rfc2136[$id]['keytype'];
+ if (!$pconfig['keytype']) {
+ $pconfig['keytype'] = "zone";
+ }
+ $pconfig['server'] = $a_rfc2136[$id]['server'];
+ $pconfig['interface'] = $a_rfc2136[$id]['interface'];
+ $pconfig['usetcp'] = isset($a_rfc2136[$id]['usetcp']);
+ $pconfig['usepublicip'] = isset($a_rfc2136[$id]['usepublicip']);
+ $pconfig['recordtype'] = $a_rfc2136[$id]['recordtype'];
+ if (!$pconfig['recordtype']) {
+ $pconfig['recordtype'] = "both";
+ }
+ $pconfig['descr'] = $a_rfc2136[$id]['descr'];
+
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = array();
+ $reqdfieldsn = array();
+ $reqdfields = array_merge($reqdfields, explode(" ", "host ttl keyname keydata"));
+ $reqdfieldsn = array_merge($reqdfieldsn, array(gettext("Hostname"), gettext("TTL"), gettext("Key name"), gettext("Key")));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_POST['host'] && !is_domain($_POST['host']))) {
+ $input_errors[] = gettext("The DNS update host name contains invalid characters.");
+ }
+ if (($_POST['ttl'] && !is_numericint($_POST['ttl']))) {
+ $input_errors[] = gettext("The DNS update TTL must be an integer.");
+ }
+ if (($_POST['keyname'] && !is_domain($_POST['keyname']))) {
+ $input_errors[] = gettext("The DNS update key name contains invalid characters.");
+ }
+
+ if (!$input_errors) {
+ $rfc2136 = array();
+ $rfc2136['enable'] = $_POST['enable'] ? true : false;
+ $rfc2136['host'] = $_POST['host'];
+ $rfc2136['ttl'] = $_POST['ttl'];
+ $rfc2136['keyname'] = $_POST['keyname'];
+ $rfc2136['keytype'] = $_POST['keytype'];
+ $rfc2136['keydata'] = $_POST['keydata'];
+ $rfc2136['server'] = $_POST['server'];
+ $rfc2136['usetcp'] = $_POST['usetcp'] ? true : false;
+ $rfc2136['usepublicip'] = $_POST['usepublicip'] ? true : false;
+ $rfc2136['recordtype'] = $_POST['recordtype'];
+ $rfc2136['interface'] = $_POST['interface'];
+ $rfc2136['descr'] = $_POST['descr'];
+
+ if (isset($id) && $a_rfc2136[$id]) {
+ $a_rfc2136[$id] = $rfc2136;
+ } else {
+ $a_rfc2136[] = $rfc2136;
+ }
+
+ write_config(gettext("New/Edited RFC2136 dnsupdate entry was posted."));
+
+ if ($_POST['Submit'] == gettext("Save & Force Update")) {
+ $retval = services_dnsupdate_process("", $rfc2136['host'], true);
+ } else {
+ $retval = services_dnsupdate_process();
+ }
+
+ header("Location: services_rfc2136.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("RFC 2136 client"), gettext("Edit"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form action="services_rfc2136_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="rfs2136 edit">
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t">
+ <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="title">
+ <tr>
+ <td class="optsect_s">
+ <strong><?=gettext("RFC 2136 client");?></strong>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Enable");?></td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface to monitor");?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect" id="interface">
+ <?php
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $if => $ifdesc):?>
+ <option value="<?=$if;?>" <?php if ($pconfig['interface'] == $if) echo "selected=\"selected\"";?>><?=$ifdesc;?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname");?></td>
+ <td width="78%" class="vtable">
+ <input name="host" type="text" class="formfld unknown" id="host" size="30" value="<?=htmlspecialchars($pconfig['host']);?>" />
+ <br /><span>Fully qualified hostname of the host to be updated</span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("TTL"); ?></td>
+ <td class="vtable">
+ <input name="ttl" type="text" class="formfld unknown" id="ttl" size="6" value="<?=htmlspecialchars($pconfig['ttl']);?>" />
+ <?=gettext("seconds");?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Key name");?></td>
+ <td class="vtable">
+ <input name="keyname" type="text" class="formfld unknown" id="keyname" size="30" value="<?=htmlspecialchars($pconfig['keyname']);?>" />
+ <br />
+ <?=gettext("This must match the setting on the DNS server.");?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Key type");?> </td>
+ <td class="vtable">
+ <input name="keytype" type="radio" value="zone" <?php if ($pconfig['keytype'] == "zone") echo "checked=\"checked\""; ?> /> <?=gettext("Zone");?> &nbsp;
+ <input name="keytype" type="radio" value="host" <?php if ($pconfig['keytype'] == "host") echo "checked=\"checked\""; ?> /> <?=gettext("Host");?> &nbsp;
+ <input name="keytype" type="radio" value="user" <?php if ($pconfig['keytype'] == "user") echo "checked=\"checked\""; ?> /><?=gettext(" User");?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Key");?></td>
+ <td class="vtable">
+ <input name="keydata" type="text" class="formfld unknown" id="keydata" size="70" value="<?=htmlspecialchars($pconfig['keydata']);?>" />
+ <br />
+ <?=gettext("Paste an HMAC-MD5 key here.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server");?></td>
+ <td width="78%" class="vtable">
+ <input name="server" type="text" class="formfld unknown" id="server" size="30" value="<?=htmlspecialchars($pconfig['server'])?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
+ <td width="78%" class="vtable">
+ <input name="usetcp" type="checkbox" id="usetcp" value="<?=gettext("yes");?>" <?php if ($pconfig['usetcp']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Use TCP instead of UDP");?></strong>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Use Public IP");?></td>
+ <td width="78%" class="vtable">
+ <input name="usepublicip" type="checkbox" id="usepublicip" value="<?=gettext("yes");?>" <?php if ($pconfig['usepublicip']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("If the interface IP is private, attempt to fetch and use the public IP instead.");?></strong>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Record Type");?> </td>
+ <td class="vtable">
+ <input name="recordtype" type="radio" value="A" <?php if ($pconfig['recordtype'] == "A") echo "checked=\"checked\""; ?> /> <?=gettext("A (IPv4)");?> &nbsp;
+ <input name="recordtype" type="radio" value="AAAA" <?php if ($pconfig['recordtype'] == "AAAA") echo "checked=\"checked\""; ?> /> <?=gettext("AAAA (IPv6)");?> &nbsp;
+ <input name="recordtype" type="radio" value="both" <?php if ($pconfig['recordtype'] == "both") echo "checked=\"checked\""; ?> /> <?=gettext("Both");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="60" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
+ <a href="services_rfc2136.php"><input name="Cancel" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save &amp; Force Update");?>" onclick="enable_change(true)" />
+ <?php if (isset($id) && $a_rfc2136[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:");?><br />
+ </strong>
+ </span>
+ <?php printf(gettext("You must configure a DNS server in %sSystem: " .
+ "General setup %sor allow the DNS server list to be overridden " .
+ "by DHCP/PPP on WAN for dynamic DNS updates to work."), '<a href="system.php">', '</a>');?>
+ </span>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_router_advertisements.php b/src/usr/local/www/services_router_advertisements.php
new file mode 100644
index 0000000..3cf9dbb
--- /dev/null
+++ b/src/usr/local/www/services_router_advertisements.php
@@ -0,0 +1,480 @@
+<?php
+/* $Id$ */
+/*
+ services_router_advertisements.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-services-router-advertisements
+##|*NAME=Services: Router advertisementspage
+##|*DESCR=Allow access to the 'Services: Router Advertisements' page.
+##|*MATCH=services_router_advertisements.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!$g['services_dhcp_server_enable']) {
+ header("Location: /");
+ exit;
+}
+
+/* Fix failover DHCP problem
+ * http://article.gmane.org/gmane.comp.security.firewalls.pfsense.support/18749
+ */
+ini_set("memory_limit", "64M");
+
+$if = $_GET['if'];
+if ($_POST['if']) {
+ $if = $_POST['if'];
+}
+
+/* if OLSRD is enabled, allow WAN to house DHCP. */
+if ($config['installedpackages']['olsrd']) {
+ foreach ($config['installedpackages']['olsrd']['config'] as $olsrd) {
+ if ($olsrd['enable']) {
+ $is_olsr_enabled = true;
+ break;
+ }
+ }
+}
+
+if (!$_GET['if']) {
+ $savemsg = "<p><b>" . gettext("The DHCPv6 Server can only be enabled on interfaces configured with static IP addresses") . ".</b></p>" .
+ "<p><b>" . gettext("Only interfaces configured with a static IP will be shown") . ".</b></p>";
+}
+
+$iflist = get_configured_interface_with_descr();
+
+/* set the starting interface */
+if (!$if || !isset($iflist[$if])) {
+ foreach ($iflist as $ifent => $ifname) {
+ $oc = $config['interfaces'][$ifent];
+ if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
+ (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
+ continue;
+ }
+ $if = $ifent;
+ break;
+ }
+}
+
+if (is_array($config['dhcpdv6'][$if])) {
+ /* RA specific */
+ $pconfig['ramode'] = $config['dhcpdv6'][$if]['ramode'];
+ $pconfig['rapriority'] = $config['dhcpdv6'][$if]['rapriority'];
+ if ($pconfig['rapriority'] == "") {
+ $pconfig['rapriority'] = "medium";
+ }
+ $pconfig['rainterface'] = $config['dhcpdv6'][$if]['rainterface'];
+ $pconfig['radomainsearchlist'] = $config['dhcpdv6'][$if]['radomainsearchlist'];
+ list($pconfig['radns1'], $pconfig['radns2'], $pconfig['radns3'], $pconfig['radns4']) = $config['dhcpdv6'][$if]['radnsserver'];
+ $pconfig['rasamednsasdhcp6'] = isset($config['dhcpdv6'][$if]['rasamednsasdhcp6']);
+
+ $pconfig['subnets'] = $config['dhcpdv6'][$if]['subnets']['item'];
+}
+if (!is_array($pconfig['subnets'])) {
+ $pconfig['subnets'] = array();
+}
+
+$advertise_modes = array("disabled" => "Disabled",
+ "router" => "Router Only",
+ "unmanaged" => "Unmanaged",
+ "managed" => "Managed",
+ "assist" => "Assisted",
+ "stateless_dhcp" => "Stateless DHCP");
+$priority_modes = array("low" => "Low",
+ "medium" => "Normal",
+ "high" => "High");
+$carplist = get_configured_carp_interface_list();
+
+$subnets_help = gettext("Subnets are specified in CIDR format. " .
+ "Select the CIDR mask that pertains to each entry. " .
+ "/128 specifies a single IPv6 host; /64 specifies a normal IPv6 network; etc. " .
+ "If no subnets are specified here, the Router Advertisement (RA) Daemon will advertise to the subnet to which the router's interface is assigned.");
+
+if ($_POST) {
+ unset($input_errors);
+
+ $pconfig = $_POST;
+
+ /* input validation */
+
+ $pconfig['subnets'] = array();
+ for ($x = 0; $x < 5000; $x += 1) {
+ $address = trim($_POST['subnet_address' . $x]);
+ if ($address === "") {
+ continue;
+ }
+
+ $bits = trim($_POST['subnet_bits' . $x]);
+ if ($bits === "") {
+ $bits = "128";
+ }
+
+ if (is_alias($address)) {
+ $pconfig['subnets'][] = $address;
+ } else {
+ $pconfig['subnets'][] = $address . "/" . $bits;
+ if (!is_ipaddrv6($address)) {
+ $input_errors[] = sprintf(gettext("An invalid subnet or alias was specified. [%s/%s]"), $address, $bits);
+ }
+ }
+ }
+
+ if (($_POST['radns1'] && !is_ipaddrv6($_POST['radns1'])) || ($_POST['radns2'] && !is_ipaddrv6($_POST['radns2'])) || ($_POST['radns3'] && !is_ipaddrv6($_POST['radns3'])) || ($_POST['radns4'] && !is_ipaddrv6($_POST['radns4']))) {
+ $input_errors[] = gettext("A valid IPv6 address must be specified for each of the DNS servers.");
+ }
+ if ($_POST['radomainsearchlist']) {
+ $domain_array=preg_split("/[ ;]+/", $_POST['radomainsearchlist']);
+ foreach ($domain_array as $curdomain) {
+ if (!is_domain($curdomain)) {
+ $input_errors[] = gettext("A valid domain search list must be specified.");
+ break;
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ if (!is_array($config['dhcpdv6'][$if])) {
+ $config['dhcpdv6'][$if] = array();
+ }
+
+ $config['dhcpdv6'][$if]['ramode'] = $_POST['ramode'];
+ $config['dhcpdv6'][$if]['rapriority'] = $_POST['rapriority'];
+ $config['dhcpdv6'][$if]['rainterface'] = $_POST['rainterface'];
+
+ $config['dhcpdv6'][$if]['radomainsearchlist'] = $_POST['radomainsearchlist'];
+ unset($config['dhcpdv6'][$if]['radnsserver']);
+ if ($_POST['radns1']) {
+ $config['dhcpdv6'][$if]['radnsserver'][] = $_POST['radns1'];
+ }
+ if ($_POST['radns2']) {
+ $config['dhcpdv6'][$if]['radnsserver'][] = $_POST['radns2'];
+ }
+ if ($_POST['radns3']) {
+ $config['dhcpdv6'][$if]['radnsserver'][] = $_POST['radns3'];
+ }
+ if ($_POST['radns4']) {
+ $config['dhcpdv6'][$if]['radnsserver'][] = $_POST['radns4'];
+ }
+
+ $config['dhcpdv6'][$if]['rasamednsasdhcp6'] = ($_POST['rasamednsasdhcp6']) ? true : false;
+
+ if (count($pconfig['subnets'])) {
+ $config['dhcpdv6'][$if]['subnets']['item'] = $pconfig['subnets'];
+ } else {
+ unset($config['dhcpdv6'][$if]['subnets']);
+ }
+
+ write_config();
+ $retval = services_radvd_configure();
+ $savemsg = get_std_save_message($retval);
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Router advertisements"));
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript" src="/javascript/row_helper.js">
+</script>
+<script type="text/javascript" src="/javascript/autosuggest.js?rev=1">
+</script>
+<script type="text/javascript" src="/javascript/suggestions.js">
+</script>
+<script type="text/javascript">
+//<![CDATA[
+ rowname[0] = "subnet_address";
+ rowtype[0] = "textbox";
+ rowsize[0] = "30";
+ rowname[1] = "subnet_bits";
+ rowtype[1] = "select";
+ rowsize[1] = "1";
+ function add_alias_control() {
+ var name = "subnet_address" + (totalrows - 1);
+ obj = document.getElementById(name);
+ obj.setAttribute('class', 'formfldalias');
+ obj.setAttribute('autocomplete', 'off');
+ objAlias[totalrows - 1] = new AutoSuggestControl(obj, new StateSuggestions(addressarray));
+ }
+//]]>
+</script>
+
+<form action="services_router_advertisements.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="router advert">
+ <tr>
+ <td>
+<?php
+ /* active tabs */
+ $tab_array = array();
+ $tabscounter = 0;
+ $i = 0;
+ foreach ($iflist as $ifent => $ifname) {
+ $oc = $config['interfaces'][$ifent];
+ if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) ||
+ (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) {
+ continue;
+ }
+ if ($ifent == $if) {
+ $active = true;
+ } else {
+ $active = false;
+ }
+ $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}");
+ $tabscounter++;
+ }
+ if ($tabscounter == 0) {
+ echo "</td></tr></table></form>";
+ include("fend.inc");
+ echo "</body>";
+ echo "</html>";
+ exit;
+ }
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("DHCPv6 Server"), false, "services_dhcpv6.php?if={$if}");
+ $tab_array[] = array(gettext("Router Advertisements"), true, "services_router_advertisements.php?if={$if}");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Router Advertisements");?></td>
+ <td width="78%" class="vtable">
+ <select name="ramode" id="ramode">
+ <?php foreach ($advertise_modes as $name => $value) { ?>
+ <option value="<?=$name ?>" <?php if ($pconfig['ramode'] == $name) echo "selected=\"selected\""; ?> > <?=$value ?></option>
+ <?php } ?>
+ </select>
+ <br />
+ <strong><?php printf(gettext("Select the Operating Mode for the Router Advertisement (RA) Daemon."))?></strong>
+ <?php printf(gettext("Use \"Router Only\" to only advertise this router, \"Unmanaged\" for Router Advertising with Stateless Autoconfig, \"Managed\" for assignment through (a) DHCPv6 Server, \"Assisted\" for DHCPv6 Server assignment combined with Stateless Autoconfig"));?>
+ <?php printf(gettext("It is not required to activate this DHCPv6 server when set to \"Managed\", this can be another host on the network")); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Router Priority");?></td>
+ <td width="78%" class="vtable">
+ <select name="rapriority" id="rapriority">
+ <?php foreach ($priority_modes as $name => $value) { ?>
+ <option value="<?=$name ?>" <?php if ($pconfig['rapriority'] == $name) echo "selected=\"selected\""; ?> > <?=$value ?></option>
+ <?php } ?>
+ </select>
+ <br />
+ <strong><?php printf(gettext("Select the Priority for the Router Advertisement (RA) Daemon."))?></strong>
+ </td>
+ </tr>
+<?php
+ $carplistif = array();
+ if (count($carplist) > 0) {
+ foreach ($carplist as $ifname => $vip) {
+ if ((preg_match("/^{$if}_/", $ifname)) && (is_ipaddrv6($vip))) {
+ $carplistif[$ifname] = $vip;
+ }
+ }
+ }
+ if (count($carplistif) > 0) {
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RA Interface");?></td>
+ <td width="78%" class="vtable">
+ <select name="rainterface" id="rainterface">
+ <?php foreach ($carplistif as $ifname => $vip) { ?>
+ <option value="interface" <?php if ($pconfig['rainterface'] == "interface") echo "selected=\"selected\""; ?> > <?=strtoupper($if); ?></option>
+ <option value="<?=$ifname ?>" <?php if ($pconfig['rainterface'] == $ifname) echo "selected=\"selected\""; ?> > <?="$ifname - $vip"; ?></option>
+ <?php } ?>
+ </select>
+ <br />
+ <strong><?php printf(gettext("Select the Interface for the Router Advertisement (RA) Daemon."))?></strong>
+ </td>
+ </tr>
+<?php
+ }
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RA Subnet(s)");?></td>
+ <td width="78%" class="vtable">
+ <div><?= htmlentities($subnets_help) ?></div>
+ <table id="maintable" summary="subnets">
+ <tbody>
+<?php
+ $counter = 0;
+ foreach ($pconfig['subnets'] as $subnet) {
+ $address_name = "subnet_address" . $counter;
+ $bits_name = "subnet_bits" . $counter;
+ list($address, $subnet) = explode("/", $subnet);
+?>
+ <tr>
+ <td>
+ <input autocomplete="off" name="<?= $address_name ?>" type="text" class="formfldalias" id="<?= $address_name ?>" size="30" value="<?= htmlentities($address) ?>" />
+ </td>
+ <td>
+ <select name="<?= $bits_name ?>" class="formselect" id="<?= $bits_name ?>">
+ <option value="">
+ <?php for ($i = 128; $i >= 0; $i -= 1) { ?>
+ <option value="<?= $i ?>" <?= ("$subnet" === "$i") ? "selected='selected'" : "" ?>><?= $i ?></option>
+ <?php } ?>
+ </select>
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" /></a>
+ </td>
+ </tr>
+<?php
+ $counter += 1;
+ }
+?>
+ <tr style="display:none">
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ <script type="text/javascript">
+ //<![CDATA[
+ field_counter_js = 2;
+ totalrows = <?= $counter ?>;
+ //]]>
+ </script>
+ <div id="addrowbutton">
+ <a onclick="javascript:addRowTo('maintable'); add_alias_control(); return false;" href="#"><!--
+ --><img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry"); ?>" /></a>
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+
+ <tr>
+ <td colspan="2" valign="top" class="listtopic">DNS</td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers");?></td>
+ <td width="78%" class="vtable">
+ <input name="radns1" type="text" class="formfld unknown" id="radns1" size="28" value="<?=htmlspecialchars($pconfig['radns1']);?>" /><br />
+ <input name="radns2" type="text" class="formfld unknown" id="radns2" size="28" value="<?=htmlspecialchars($pconfig['radns2']);?>" /><br />
+ <input name="radns3" type="text" class="formfld unknown" id="radns3" size="28" value="<?=htmlspecialchars($pconfig['radns3']);?>" /><br />
+ <input name="radns4" type="text" class="formfld unknown" id="radns4" size="28" value="<?=htmlspecialchars($pconfig['radns4']);?>" /><br />
+ <?=gettext("NOTE: leave blank to use the system default DNS servers - this interface's IP if DNS Forwarder or Resolver is enabled, otherwise the servers configured on the General page.");?>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Domain search list");?></td>
+ <td width="78%" class="vtable">
+ <input name="radomainsearchlist" type="text" class="formfld unknown" id="radomainsearchlist" size="28" value="<?=htmlspecialchars($pconfig['radomainsearchlist']);?>" /><br />
+ <?=gettext("The RA server can optionally provide a domain search list. Use the semicolon character as separator");?>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input id="rasamednsasdhcp6" name="rasamednsasdhcp6" type="checkbox" value="yes" <?php if ($pconfig['rasamednsasdhcp6']) { echo "checked='checked'"; } ?> />
+ <strong><?= gettext("Use same settings as DHCPv6 server"); ?></strong>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="if" type="hidden" value="<?=$if;?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+
+<script type="text/javascript">
+//<![CDATA[
+ jQuery(function ($) {
+ var $rasamednsasdhcp6 = $("#rasamednsasdhcp6");
+ var $triggered_checkboxes = $("#radns1, #radns2, #radns3, #radns4, #radomainsearchlist");
+ if ($rasamednsasdhcp6.length !== 1) { return; }
+ var onchange = function () {
+ var checked = $rasamednsasdhcp6.is(":checked");
+ if (checked) {
+ $triggered_checkboxes.each(function () { this.disabled = true; });
+ } else {
+ $triggered_checkboxes.each(function () { this.disabled = false; });
+ }
+ };
+ $rasamednsasdhcp6.bind("change", onchange);
+ onchange();
+ });
+
+ var addressarray = <?= json_encode(get_alias_list("host", "network", "openvpn", "urltable")); ?>;
+ var objAlias = [];
+ function createAutoSuggest () {
+ <?php for ($i = 0; $i < $counter; $i += 1) { ?>
+ objAlias.push(new AutoSuggestControl(document.getElementById('subnet_address<?= $i ?>'), new StateSuggestions(addressarray)));
+ <?php } ?>
+ new AutoSuggestControl(document.getElementById('radns1'), new StateSuggestions(addressarray));
+ new AutoSuggestControl(document.getElementById('radns2'), new StateSuggestions(addressarray));
+ new AutoSuggestControl(document.getElementById('radns3'), new StateSuggestions(addressarray));
+ new AutoSuggestControl(document.getElementById('radns4'), new StateSuggestions(addressarray));
+ }
+ setTimeout(createAutoSuggest, 500);
+//]]>
+</script>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_snmp.php b/src/usr/local/www/services_snmp.php
new file mode 100644
index 0000000..a29ade0
--- /dev/null
+++ b/src/usr/local/www/services_snmp.php
@@ -0,0 +1,443 @@
+<?php
+/* $Id$ */
+/*
+ services_snmp.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ part of pfSense
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: snmp
+*/
+
+##|+PRIV
+##|*IDENT=page-services-snmp
+##|*NAME=Services: SNMP page
+##|*DESCR=Allow access to the 'Services: SNMP' page.
+##|*MATCH=services_snmp.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+
+if (!is_array($config['snmpd'])) {
+ $config['snmpd'] = array();
+ $config['snmpd']['rocommunity'] = "public";
+ $config['snmpd']['pollport'] = "161";
+}
+
+if (!is_array($config['snmpd']['modules'])) {
+ $config['snmpd']['modules'] = array();
+ $config['snmpd']['modules']['mibii'] = true;
+ $config['snmpd']['modules']['netgraph'] = true;
+ $config['snmpd']['modules']['pf'] = true;
+ $config['snmpd']['modules']['hostres'] = true;
+ $config['snmpd']['modules']['bridge'] = true;
+ $config['snmpd']['modules']['ucd'] = true;
+ $config['snmpd']['modules']['regex'] = true;
+}
+$pconfig['enable'] = isset($config['snmpd']['enable']);
+$pconfig['pollport'] = $config['snmpd']['pollport'];
+$pconfig['syslocation'] = $config['snmpd']['syslocation'];
+$pconfig['syscontact'] = $config['snmpd']['syscontact'];
+$pconfig['rocommunity'] = $config['snmpd']['rocommunity'];
+/* disabled until some docs show up on what this does.
+$pconfig['rwenable'] = isset($config['snmpd']['rwenable']);
+$pconfig['rwcommunity'] = $config['snmpd']['rwcommunity'];
+*/
+$pconfig['trapenable'] = isset($config['snmpd']['trapenable']);
+$pconfig['trapserver'] = $config['snmpd']['trapserver'];
+$pconfig['trapserverport'] = $config['snmpd']['trapserverport'];
+$pconfig['trapstring'] = $config['snmpd']['trapstring'];
+
+$pconfig['mibii'] = isset($config['snmpd']['modules']['mibii']);
+$pconfig['netgraph'] = isset($config['snmpd']['modules']['netgraph']);
+$pconfig['pf'] = isset($config['snmpd']['modules']['pf']);
+$pconfig['hostres'] = isset($config['snmpd']['modules']['hostres']);
+$pconfig['bridge'] = isset($config['snmpd']['modules']['bridge']);
+$pconfig['ucd'] = isset($config['snmpd']['modules']['ucd']);
+$pconfig['regex'] = isset($config['snmpd']['modules']['regex']);
+$pconfig['bindip'] = $config['snmpd']['bindip'];
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['enable']) {
+ if (strstr($_POST['syslocation'], "#")) {
+ $input_errors[] = gettext("Invalid character '#' in system location");
+ }
+ if (strstr($_POST['syscontact'], "#")) {
+ $input_errors[] = gettext("Invalid character '#' in system contact");
+ }
+ if (strstr($_POST['rocommunity'], "#")) {
+ $input_errors[] = gettext("Invalid character '#' in read community string");
+ }
+
+ $reqdfields = explode(" ", "rocommunity");
+ $reqdfieldsn = array(gettext("Community"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ $reqdfields = explode(" ", "pollport");
+ $reqdfieldsn = array(gettext("Polling Port"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+
+ }
+
+ if ($_POST['trapenable']) {
+ if (strstr($_POST['trapstring'], "#")) {
+ $input_errors[] = gettext("Invalid character '#' in SNMP trap string");
+ }
+
+ $reqdfields = explode(" ", "trapserver");
+ $reqdfieldsn = array(gettext("Trap server"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ $reqdfields = explode(" ", "trapserverport");
+ $reqdfieldsn = array(gettext("Trap server port"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ $reqdfields = explode(" ", "trapstring");
+ $reqdfieldsn = array(gettext("Trap string"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ }
+
+
+/* disabled until some docs show up on what this does.
+ if ($_POST['rwenable']) {
+ $reqdfields = explode(" ", "rwcommunity");
+ $reqdfieldsn = explode(",", "Write community string");
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ }
+*/
+
+
+
+ if (!$input_errors) {
+ $config['snmpd']['enable'] = $_POST['enable'] ? true : false;
+ $config['snmpd']['pollport'] = $_POST['pollport'];
+ $config['snmpd']['syslocation'] = $_POST['syslocation'];
+ $config['snmpd']['syscontact'] = $_POST['syscontact'];
+ $config['snmpd']['rocommunity'] = $_POST['rocommunity'];
+ /* disabled until some docs show up on what this does.
+ $config['snmpd']['rwenable'] = $_POST['rwenable'] ? true : false;
+ $config['snmpd']['rwcommunity'] = $_POST['rwcommunity'];
+ */
+ $config['snmpd']['trapenable'] = $_POST['trapenable'] ? true : false;
+ $config['snmpd']['trapserver'] = $_POST['trapserver'];
+ $config['snmpd']['trapserverport'] = $_POST['trapserverport'];
+ $config['snmpd']['trapstring'] = $_POST['trapstring'];
+
+ $config['snmpd']['modules']['mibii'] = $_POST['mibii'] ? true : false;
+ $config['snmpd']['modules']['netgraph'] = $_POST['netgraph'] ? true : false;
+ $config['snmpd']['modules']['pf'] = $_POST['pf'] ? true : false;
+ $config['snmpd']['modules']['hostres'] = $_POST['hostres'] ? true : false;
+ $config['snmpd']['modules']['bridge'] = $_POST['bridge'] ? true : false;
+ $config['snmpd']['modules']['ucd'] = $_POST['ucd'] ? true : false;
+ $config['snmpd']['modules']['regex'] = $_POST['regex'] ? true : false;
+ $config['snmpd']['bindip'] = $_POST['bindip'];
+
+ write_config();
+
+ $retval = 0;
+ $retval = services_snmpd_configure();
+ $savemsg = get_std_save_message($retval);
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Services"), gettext("SNMP"));
+$shortcut_section = "snmp";
+include("head.inc");
+
+?>
+<script type="text/javascript">
+//<![CDATA[
+function check_deps() {
+ if (jQuery('#hostres').prop('checked') == true) {
+ jQuery('#mibii').prop('checked', true);
+ }
+}
+
+function enable_change(whichone) {
+
+ if (whichone.name == "trapenable") {
+ if (whichone.checked == true) {
+ document.iform.trapserver.disabled = false;
+ document.iform.trapserverport.disabled = false;
+ document.iform.trapstring.disabled = false;
+ } else {
+ document.iform.trapserver.disabled = true;
+ document.iform.trapserverport.disabled = true;
+ document.iform.trapstring.disabled = true;
+ }
+ }
+
+ /* disabled until some docs show up on what this does.
+ if (whichone.name == "rwenable") {
+ if (whichone.checked == true) {
+ document.iform.rwcommunity.disabled = false;
+ } else {
+ document.iform.rwcommunity.disabled = true;
+ }
+ }
+ */
+
+ if (document.iform.enable.checked == true) {
+ document.iform.pollport.disabled = false;
+ document.iform.syslocation.disabled = false;
+ document.iform.syscontact.disabled = false;
+ document.iform.rocommunity.disabled = false;
+ document.iform.trapenable.disabled = false;
+ /* disabled until some docs show up on what this does.
+ document.iform.rwenable.disabled = false;
+ if (document.iform.rwenable.checked == true) {
+ document.iform.rwcommunity.disabled = false;
+ } else {
+ document.iform.rwcommunity.disabled = true;
+ }
+ */
+ if (document.iform.trapenable.checked == true) {
+ document.iform.trapserver.disabled = false;
+ document.iform.trapserverport.disabled = false;
+ document.iform.trapstring.disabled = false;
+ } else {
+ document.iform.trapserver.disabled = true;
+ document.iform.trapserverport.disabled = true;
+ document.iform.trapstring.disabled = true;
+ }
+ document.iform.mibii.disabled = false;
+ document.iform.netgraph.disabled = false;
+ document.iform.pf.disabled = false;
+ document.iform.hostres.disabled = false;
+ document.iform.ucd.disabled = false;
+ document.iform.regex.disabled = false;
+ //document.iform.bridge.disabled = false;
+ } else {
+ document.iform.pollport.disabled = true;
+ document.iform.syslocation.disabled = true;
+ document.iform.syscontact.disabled = true;
+ document.iform.rocommunity.disabled = true;
+ /*
+ document.iform.rwenable.disabled = true;
+ document.iform.rwcommunity.disabled = true;
+ */
+ document.iform.trapenable.disabled = true;
+ document.iform.trapserver.disabled = true;
+ document.iform.trapserverport.disabled = true;
+ document.iform.trapstring.disabled = true;
+
+ document.iform.mibii.disabled = true;
+ document.iform.netgraph.disabled = true;
+ document.iform.pf.disabled = true;
+ document.iform.hostres.disabled = true;
+ document.iform.ucd.disabled = true;
+ document.iform.regex.disabled = true;
+ //document.iform.bridge.disabled = true;
+ }
+}
+//]]>
+</script>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form action="services_snmp.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="snmp">
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t">
+ <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="enable">
+ <tr>
+ <td class="optsect_s"><strong><?=gettext("SNMP Daemon");?></strong></td>
+ <td align="right" class="optsect_s">
+ <input name="enable" id="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\""; ?> onclick="enable_change(this)" /> <strong><?=gettext("Enable");?></strong>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Polling Port ");?></td>
+ <td width="78%" class="vtable">
+ <input name="pollport" type="text" class="formfld unknown" id="pollport" size="40" value="<?=htmlspecialchars($pconfig['pollport']) ? htmlspecialchars($pconfig['pollport']) : htmlspecialchars(161);?>" />
+ <br /><?=gettext("Enter the port to accept polling events on (default 161)");?><br />
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("System location");?></td>
+ <td width="78%" class="vtable">
+ <input name="syslocation" type="text" class="formfld unknown" id="syslocation" size="40" value="<?=htmlspecialchars($pconfig['syslocation']);?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("System contact");?></td>
+ <td width="78%" class="vtable">
+ <input name="syscontact" type="text" class="formfld unknown" id="syscontact" size="40" value="<?=htmlspecialchars($pconfig['syscontact']);?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Read Community String");?></td>
+ <td width="78%" class="vtable">
+ <input name="rocommunity" type="text" class="formfld unknown" id="rocommunity" size="40" value="<?=htmlspecialchars($pconfig['rocommunity']);?>" />
+ <br /><?=gettext("The community string is like a password, restricting access to querying SNMP to hosts knowing the community string. Use a strong value here to protect from unauthorized information disclosure.");?><br />
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t">
+ <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="enable">
+ <tr>
+ <td class="optsect_s"><strong><?=gettext("SNMP Traps");?></strong></td>
+ <td align="right" class="optsect_s">
+ <input name="trapenable" id="trapenable" type="checkbox" value="yes" <?php if ($pconfig['trapenable']) echo "checked=\"checked\""; ?> onclick="enable_change(this)" /> <strong><?=gettext("Enable");?></strong>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Trap server");?></td>
+ <td width="78%" class="vtable">
+ <input name="trapserver" type="text" class="formfld unknown" id="trapserver" size="40" value="<?=htmlspecialchars($pconfig['trapserver']);?>" />
+ <br /><?=gettext("Enter trap server name");?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Trap server port ");?></td>
+ <td width="78%" class="vtable">
+ <input name="trapserverport" type="text" class="formfld unknown" id="trapserverport" size="40" value="<?=htmlspecialchars($pconfig['trapserverport']) ? htmlspecialchars($pconfig['trapserverport']) : htmlspecialchars(162);?>" />
+ <br /><?=gettext("Enter the port to send the traps to (default 162)");?><br />
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Enter the SNMP trap string");?></td>
+ <td width="78%" class="vtable">
+ <input name="trapstring" type="text" class="formfld unknown" id="trapstring" size="40" value="<?=htmlspecialchars($pconfig['trapstring']);?>" />
+ <br /><?=gettext("Trap string");?><br />
+ </td>
+ </tr>
+
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t">
+ <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="modules">
+ <tr>
+ <td class="optsect_s"><strong><?=gettext("Modules");?></strong></td>
+ <td align="right" class="optsect_s">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("SNMP Modules");?></td>
+ <td width="78%" class="vtable">
+ <input name="mibii" type="checkbox" id="mibii" value="yes" onclick="check_deps()" <?php if ($pconfig['mibii']) echo "checked=\"checked\""; ?> /><?=gettext("MibII"); ?>
+ <br />
+ <input name="netgraph" type="checkbox" id="netgraph" value="yes" <?php if ($pconfig['netgraph']) echo "checked=\"checked\""; ?> /><?=gettext("Netgraph"); ?>
+ <br />
+ <input name="pf" type="checkbox" id="pf" value="yes" <?php if ($pconfig['pf']) echo "checked=\"checked\""; ?> /><?=gettext("PF"); ?>
+ <br />
+ <input name="hostres" type="checkbox" id="hostres" value="yes" onclick="check_deps()" <?php if ($pconfig['hostres']) echo "checked=\"checked\""; ?> /><?=gettext("Host Resources (Requires MibII)");?>
+ <br />
+ <input name="ucd" type="checkbox" id="ucd" value="yes" <?php if ($pconfig['ucd']) echo "checked=\"checked\""; ?> /><?=gettext("UCD"); ?>
+ <br />
+ <input name="regex" type="checkbox" id="regex" value="yes" <?php if ($pconfig['regex']) echo "checked=\"checked\""; ?> /><?=gettext("Regex"); ?>
+ <br />
+ </td>
+ </tr>
+
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+
+ <tr>
+ <td colspan="2" valign="top" class="optsect_t">
+ <table border="0" cellspacing="0" cellpadding="0" width="100%" summary="interface">
+ <tr>
+ <td class="optsect_s"><strong><?=gettext("Interface Binding");?></strong></td>
+ <td align="right" class="optsect_s">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Bind Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="bindip" class="formselect">
+ <option value="">All</option>
+ <?php
+ $listenips = get_possible_listen_ips();
+ foreach ($listenips as $lip => $ldescr):
+ $selected = "";
+ if ($lip == $pconfig['bindip']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$lip;?>" <?=$selected;?>>
+ <?=htmlspecialchars($ldescr);?>
+ </option>
+ <?php
+ endforeach;
+ unset($listenips);
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ </table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(this);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_unbound.php b/src/usr/local/www/services_unbound.php
new file mode 100644
index 0000000..a197c8c
--- /dev/null
+++ b/src/usr/local/www/services_unbound.php
@@ -0,0 +1,626 @@
+<?php
+/* $Id$ */
+/*
+ services_unbound.php
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright (C) 2014 Warren Baker (warren@pfsense.org)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dnsresolver
+*/
+
+##|+PRIV
+##|*IDENT=page-services-unbound
+##|*NAME=Services: DNS Resolver page
+##|*DESCR=Allow access to the 'Services: DNS Resolver' page.
+##|*MATCH=services_unbound.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("unbound.inc");
+require_once("system.inc");
+
+if (!is_array($config['unbound'])) {
+ $config['unbound'] = array();
+}
+
+$a_unboundcfg =& $config['unbound'];
+
+if (!is_array($config['unbound']['hosts'])) {
+ $config['unbound']['hosts'] = array();
+}
+
+$a_hosts =& $config['unbound']['hosts'];
+
+if (!is_array($config['unbound']['domainoverrides'])) {
+ $config['unbound']['domainoverrides'] = array();
+}
+
+$a_domainOverrides = &$config['unbound']['domainoverrides'];
+
+if (isset($config['unbound']['enable'])) {
+ $pconfig['enable'] = true;
+}
+if (isset($config['unbound']['dnssec'])) {
+ $pconfig['dnssec'] = true;
+}
+if (isset($config['unbound']['forwarding'])) {
+ $pconfig['forwarding'] = true;
+}
+if (isset($config['unbound']['regdhcp'])) {
+ $pconfig['regdhcp'] = true;
+}
+if (isset($config['unbound']['regdhcpstatic'])) {
+ $pconfig['regdhcpstatic'] = true;
+}
+if (isset($config['unbound']['txtsupport'])) {
+ $pconfig['txtsupport'] = true;
+}
+
+$pconfig['port'] = $config['unbound']['port'];
+$pconfig['custom_options'] = base64_decode($config['unbound']['custom_options']);
+
+if (empty($config['unbound']['active_interface'])) {
+ $pconfig['active_interface'] = array();
+} else {
+ $pconfig['active_interface'] = explode(",", $config['unbound']['active_interface']);
+}
+if (empty($config['unbound']['outgoing_interface'])) {
+ $pconfig['outgoing_interface'] = array();
+} else {
+ $pconfig['outgoing_interface'] = explode(",", $config['unbound']['outgoing_interface']);
+}
+
+if ($_POST) {
+ $pconfig = $_POST;
+ unset($input_errors);
+
+ if ($_POST['apply']) {
+ $retval = services_unbound_configure();
+ $savemsg = get_std_save_message($retval);
+ if ($retval == 0) {
+ clear_subsystem_dirty('unbound');
+ }
+ /* Update resolv.conf in case the interface bindings exclude localhost. */
+ system_resolvconf_generate();
+ /* Start or restart dhcpleases when it's necessary */
+ system_dhcpleases_configure();
+ } else {
+ if (isset($_POST['enable']) && isset($config['dnsmasq']['enable'])) {
+ if ($_POST['port'] == $config['dnsmasq']['port']) {
+ $input_errors[] = "The DNS Forwarder is enabled using this port. Choose a non-conflicting port, or disable the DNS Forwarder.";
+ }
+ }
+
+ if (empty($_POST['active_interface'])) {
+ $input_errors[] = "One or more Network Interfaces must be selected for binding.";
+ } else if (!isset($config['system']['dnslocalhost']) && (!in_array("lo0", $_POST['active_interface']) && !in_array("all", $_POST['active_interface']))) {
+ $input_errors[] = "This system is configured to use the DNS Resolver as its DNS server, so Localhost or All must be selected in Network Interfaces.";
+ }
+
+ if (empty($_POST['outgoing_interface'])) {
+ $input_errors[] = "One or more Outgoing Network Interfaces must be selected.";
+ }
+
+ if ($_POST['port']) {
+ if (is_port($_POST['port'])) {
+ $a_unboundcfg['port'] = $_POST['port'];
+ } else {
+ $input_errors[] = gettext("You must specify a valid port number.");
+ }
+ } else if (isset($config['unbound']['port'])) {
+ unset($config['unbound']['port']);
+ }
+
+ if (isset($_POST['enable'])) {
+ $a_unboundcfg['enable'] = true;
+ } else {
+ unset($a_unboundcfg['enable']);
+ }
+ if (isset($_POST['dnssec'])) {
+ $a_unboundcfg['dnssec'] = true;
+ } else {
+ unset($a_unboundcfg['dnssec']);
+ }
+ if (isset($_POST['forwarding'])) {
+ $a_unboundcfg['forwarding'] = true;
+ } else {
+ unset($a_unboundcfg['forwarding']);
+ }
+ if (isset($_POST['regdhcp'])) {
+ $a_unboundcfg['regdhcp'] = true;
+ } else {
+ unset($a_unboundcfg['regdhcp']);
+ }
+ if (isset($_POST['regdhcpstatic'])) {
+ $a_unboundcfg['regdhcpstatic'] = true;
+ } else {
+ unset($a_unboundcfg['regdhcpstatic']);
+ }
+ if (isset($_POST['txtsupport'])) {
+ $a_unboundcfg['txtsupport'] = true;
+ } else {
+ unset($a_unboundcfg['txtsupport']);
+ }
+ if (is_array($_POST['active_interface']) && !empty($_POST['active_interface'])) {
+ $a_unboundcfg['active_interface'] = implode(",", $_POST['active_interface']);
+ }
+
+ if (is_array($_POST['outgoing_interface']) && !empty($_POST['outgoing_interface'])) {
+ $a_unboundcfg['outgoing_interface'] = implode(",", $_POST['outgoing_interface']);
+ }
+
+ $a_unboundcfg['custom_options'] = base64_encode(str_replace("\r\n", "\n", $_POST['custom_options']));
+
+ if (!$input_errors) {
+ write_config("DNS Resolver configured.");
+ mark_subsystem_dirty('unbound');
+ }
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($_GET['type'] == 'host') {
+ if ($a_hosts[$_GET['id']]) {
+ unset($a_hosts[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('unbound');
+ header("Location: services_unbound.php");
+ exit;
+ }
+ } elseif ($_GET['type'] == 'doverride') {
+ if ($a_domainOverrides[$_GET['id']]) {
+ unset($a_domainOverrides[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('unbound');
+ header("Location: services_unbound.php");
+ exit;
+ }
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Services"), gettext("DNS Resolver"));
+$shortcut_section = "resolver";
+include_once("head.inc");
+
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+function enable_change(enable_over) {
+ var endis;
+ endis = !(jQuery('#enable').is(":checked") || enable_over);
+ jQuery("#active_interface,#outgoing_interface,#dnssec,#forwarding,#regdhcp,#regdhcpstatic,#dhcpfirst,#port,#txtsupport,#custom_options").prop('disabled', endis);
+}
+function show_advanced_dns() {
+ jQuery("#showadv").show();
+ jQuery("#showadvbox").hide();
+}
+//]]>
+</script>
+</head>
+
+<body>
+<?php include("fbegin.inc"); ?>
+<form action="services_unbound.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('unbound')): ?><br/>
+<?php print_info_box_np(gettext("The configuration of the DNS Resolver has been changed") . ".<br />" . gettext("You must apply changes for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="services unbound">
+ <tbody>
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("General settings"), true, "services_unbound.php");
+ $tab_array[] = array(gettext("Advanced settings"), false, "services_unbound_advanced.php");
+ $tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
+ display_top_tabs($tab_array, true);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tbody>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("General DNS Resolver Options");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Enable");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="enable" type="checkbox" id="enable" value="yes" <?php if (isset($pconfig['enable'])) echo "checked=\"checked\"";?> onclick="enable_change(false)" />
+ <strong>
+ <?=gettext("Enable DNS Resolver");?><br />
+ </strong>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Listen Port");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="port" type="text" id="port" size="6" <?php if ($pconfig['port']) echo "value=\"" . htmlspecialchars($pconfig['port']) . "\"";?> />
+ <br /><br />
+ <?=gettext("The port used for responding to DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 53.");?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Network Interfaces"); ?></td>
+ <td width="78%" class="vtable">
+ <?php
+ $interface_addresses = get_possible_listen_ips(true);
+ ?>
+ <?=gettext("Interface IPs used by the DNS Resolver for responding to queries from clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries to other interface IPs not selected below are discarded. The default behavior is to respond to queries on every available IPv4 and IPv6 address.");?>
+ <br /><br />
+ <select id="active_interface" name="active_interface[]" multiple="multiple" size="<?php echo $size; ?>">
+ <option value="all" <?php if (empty($pconfig['active_interface']) || empty($pconfig['active_interface'][0]) || in_array("all", $pconfig['active_interface'], true)) echo 'selected="selected"'; ?>>All</option>
+ <?php
+ foreach ($interface_addresses as $laddr => $ldescr):
+ $selected = "";
+ if (in_array($laddr, $pconfig['active_interface'])) {
+ $selected = 'selected="selected"';
+ }
+ ?>
+ <option value="<?=$laddr;?>" <?=$selected;?>>
+ <?=htmlspecialchars($ldescr);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br /><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Outgoing Network Interfaces"); ?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("Utilize different network interface(s) that the DNS Resolver will use to send queries to authoritative servers and receive their replies. By default all interfaces are used.");?>
+ <br /><br />
+ <select id="outgoing_interface" name="outgoing_interface[]" multiple="multiple" size="<?php echo $size; ?>">
+ <option value="" <?php if (empty($pconfig['outgoing_interface']) || empty($pconfig['outgoing_interface'][0])) echo 'selected="selected"'; ?>>All</option>
+ <?php
+ foreach ($interface_addresses as $laddr => $ldescr):
+ $selected = "";
+ if (in_array($laddr, $pconfig['outgoing_interface'])) {
+ $selected = 'selected="selected"';
+ }
+ ?>
+ <option value="<?=$laddr;?>" <?=$selected;?>>
+ <?=htmlspecialchars($ldescr);?>
+ </option>
+ <?php
+ endforeach;
+ unset($interface_addresses);
+ ?>
+ </select>
+ <br /><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("DNSSEC");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="dnssec" type="checkbox" id="dnssec" value="yes" <?php echo (isset($pconfig['dnssec']) ? "checked=\"checked\"" : "");?> />
+ <strong>
+ <?=gettext("Enable DNSSEC Support");?><br />
+ </strong>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("DNS Query Forwarding");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="forwarding" type="checkbox" id="forwarding" value="yes" <?php echo (isset($pconfig['forwarding']) ? "checked=\"checked\"" : "");?> />
+ <strong><?=gettext("Enable Forwarding Mode");?></strong><br />
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("DHCP Registration");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="regdhcp" type="checkbox" id="regdhcp" value="yes" <?php if (isset($pconfig['regdhcp'])) echo "checked=\"checked\"";?> />
+ <strong>
+ <?=gettext("Register DHCP leases in the DNS Resolver");?><br />
+ </strong>
+ <?php printf(gettext("If this option is set, then machines that specify".
+ " their hostname when requesting a DHCP lease will be registered".
+ " in the DNS Resolver, so that their name can be resolved.".
+ " You should also set the domain in %sSystem:".
+ " General setup%s to the proper value."), '<a href="system.php">', '</a>')?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Static DHCP");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="regdhcpstatic" type="checkbox" id="regdhcpstatic" value="yes" <?php if (isset($pconfig['regdhcpstatic'])) echo "checked=\"checked\"";?> />
+ <strong>
+ <?=gettext("Register DHCP static mappings in the DNS Resolver");?><br />
+ </strong>
+ <?php printf(gettext("If this option is set, then DHCP static mappings will ".
+ "be registered in the DNS Resolver, so that their name can be ".
+ "resolved. You should also set the domain in %s".
+ "System: General setup%s to the proper value."), '<a href="system.php">', '</a>');?>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("TXT Comment Support");?></td>
+ <td width="78%" class="vtable">
+ <p>
+ <input name="txtsupport" type="checkbox" id="txtsupport" value="yes" <?php echo (isset($pconfig['txtsupport']) ? "checked=\"checked\"" : "");?> />
+ <strong>
+ <?=gettext("If this option is set, then any descriptions associated with Host entries and DHCP Static mappings will create a corresponding TXT record.");?><br />
+ </strong>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Advanced");?></td>
+ <td width="78%" class="vtable">
+ <div id="showadvbox" <?php if ($pconfig['custom_options']) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_dns()" value="<?=gettext("Advanced"); ?>" /> - <?=gettext("Show advanced option");?>
+ </div>
+ <div id="showadv" <?php if (empty($pconfig['custom_options'])) echo "style='display:none'"; ?>>
+ <strong><?=gettext("Advanced");?><br /></strong>
+ <textarea rows="6" cols="78" name="custom_options" id="custom_options"><?=htmlspecialchars($pconfig['custom_options']);?></textarea><br />
+ <?=gettext("Enter any additional configuration parameters to add to the DNS Resolver configuration here, separated by a newline"); ?><br />
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+
+<p>
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:");?><br />
+ </strong>
+ </span>
+ <?php printf(gettext("If the DNS Resolver is enabled, the DHCP".
+ " service (if enabled) will automatically serve the LAN IP".
+ " address as a DNS server to DHCP clients so they will use".
+ " the DNS Resolver. If Forwarding, is enabled, the DNS Resolver will use the DNS servers".
+ " entered in %sSystem: General setup%s".
+ " or those obtained via DHCP or PPP on WAN if the &quot;Allow".
+ " DNS server list to be overridden by DHCP/PPP on WAN&quot;".
+ " is checked."), '<a href="system.php">', '</a>');?>
+ <br />
+ </span>
+</p>
+
+&nbsp;<br />
+<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="host overrides">
+ <tr>
+ <td colspan="5" valign="top" class="listtopic"><?=gettext("Host Overrides");?></td>
+ </tr>
+ <tr>
+ <td>
+ <br />
+ <?=gettext("Entries in this section override individual results from the forwarders.");?>
+ <?=gettext("Use these for changing DNS results or for adding custom DNS records.");?>
+ </td>
+ </tr>
+</table>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" summary="results">
+ <thead>
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Host");?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Domain");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("IP");?></td>
+ <td width="30%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="5%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle"><a href="services_unbound_host_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td valign="middle"><a href="services_unbound_host_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+<?php
+ $i = 0;
+ foreach ($a_hosts as $hostent):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
+ <?=strtolower($hostent['host']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
+ <?=strtolower($hostent['domain']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
+ <?=$hostent['ip'];?>&nbsp;
+ </td>
+ <td class="listbg" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($hostent['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="services_unbound_host_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
+ <td><a href="services_unbound.php?type=host&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this host?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ if ($hostent['aliases']['item'] && is_array($hostent['aliases']['item'])):
+ foreach ($hostent['aliases']['item'] as $alias):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
+ <?=strtolower($alias['host']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
+ <?=strtolower($alias['domain']);?>&nbsp;
+ </td>
+ <td class="listr" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
+ Alias for <?=$hostent['host'] ? $hostent['host'] . '.' . $hostent['domain'] : $hostent['domain'];?>&nbsp;
+ </td>
+ <td class="listbg" ondblclick="document.location='services_unbound_host_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($alias['description']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="services_unbound_host_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ </td>
+ </tr>
+<?php
+ endforeach;
+ endif;
+ $i++;
+ endforeach;
+?>
+ <tr style="display:none"><td></td></tr>
+ </tbody>
+</table>
+<br />
+<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="domain overrides">
+<tr>
+ <td colspan="5" valign="top" class="listtopic"><?=gettext("Domain Overrides");?></td>
+</tr>
+<tr>
+ <td>
+ <p>
+ <?=gettext("Entries in this area override an entire domain by specifying an".
+ " authoritative DNS server to be queried for that domain.");?>
+ <?=gettext("If there are multiple authoritative DNS servers available for a domain then make a separate entry for each, using the same domain name.");?>
+ </p>
+ </td>
+</tr>
+</table>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" summary="results">
+ <thead>
+ <tr>
+ <td width="35%" class="listhdrr"><?=gettext("Domain");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("IP");?></td>
+ <td width="40%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="5%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17" height="17"></td>
+ <td><a href="services_unbound_domainoverride_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17" height="17"></td>
+ <td><a href="services_unbound_domainoverride_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+<?php
+ $i = 0;
+ foreach ($a_domainOverrides as $doment):
+?>
+ <tr>
+ <td class="listlr">
+ <?=strtolower($doment['domain']);?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=$doment['ip'];?>&nbsp;
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($doment['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle">
+ <a href="services_unbound_domainoverride_edit.php?id=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" />
+ </a>
+ </td>
+ <td valign="middle">
+ <a href="services_unbound.php?act=del&amp;type=doverride&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this domain override?");?>')">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr style="display:none"><td></td></tr>
+ </tbody>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_unbound_acls.php b/src/usr/local/www/services_unbound_acls.php
new file mode 100644
index 0000000..3a51b3e
--- /dev/null
+++ b/src/usr/local/www/services_unbound_acls.php
@@ -0,0 +1,421 @@
+<?php
+/* $Id$ */
+/*
+ services_unbound_acls.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2011 Warren Baker <warren@decoy.co.za>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require("guiconfig.inc");
+require("unbound.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_unbound_acls.php');
+}
+
+if (!is_array($config['unbound']['acls'])) {
+ $config['unbound']['acls'] = array();
+}
+
+$a_acls = &$config['unbound']['acls'];
+
+$id = $_GET['id'];
+if (isset($_POST['aclid'])) {
+ $id = $_POST['aclid'];
+}
+
+if (!empty($id) && !is_numeric($id)) {
+ pfSenseHeader("services_unbound_acls.php");
+ exit;
+}
+
+$act = $_GET['act'];
+if (isset($_POST['act'])) {
+ $act = $_POST['act'];
+}
+
+if ($act == "del") {
+ if (!$a_acls[$id]) {
+ pfSenseHeader("services_unbound_acls.php");
+ exit;
+ }
+
+ unset($a_acls[$id]);
+ write_config();
+ mark_subsystem_dirty('unbound');
+}
+
+if ($act == "new") {
+ $id = unbound_get_next_id();
+}
+
+if ($act == "edit") {
+ if (isset($id) && $a_acls[$id]) {
+ $pconfig = $a_acls[$id];
+ $networkacl = $a_acls[$id]['row'];
+ }
+}
+
+if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = services_unbound_configure();
+ $savemsg = get_std_save_message($retval);
+ if ($retval == 0) {
+ clear_subsystem_dirty('unbound');
+ }
+ } else {
+
+ // input validation - only allow 50 entries in a single ACL
+ for ($x = 0; $x < 50; $x++) {
+ if (isset($pconfig["acl_network{$x}"])) {
+ $networkacl[$x] = array();
+ $networkacl[$x]['acl_network'] = $pconfig["acl_network{$x}"];
+ $networkacl[$x]['mask'] = $pconfig["mask{$x}"];
+ $networkacl[$x]['description'] = $pconfig["description{$x}"];
+ if (!is_ipaddr($networkacl[$x]['acl_network'])) {
+ $input_errors[] = gettext("You must enter a valid IP address for each row under Networks.");
+ }
+
+ if (is_ipaddr($networkacl[$x]['acl_network'])) {
+ if (!is_subnet($networkacl[$x]['acl_network']."/".$networkacl[$x]['mask'])) {
+ $input_errors[] = gettext("You must enter a valid IPv4 netmask for each IPv4 row under Networks.");
+ }
+ } else if (function_exists("is_ipaddrv6")) {
+ if (!is_ipaddrv6($networkacl[$x]['acl_network'])) {
+ $input_errors[] = gettext("You must enter a valid IPv6 address for {$networkacl[$x]['acl_network']}.");
+ } else if (!is_subnetv6($networkacl[$x]['acl_network']."/".$networkacl[$x]['mask'])) {
+ $input_errors[] = gettext("You must enter a valid IPv6 netmask for each IPv6 row under Networks.");
+ }
+ } else {
+ $input_errors[] = gettext("You must enter a valid IP address for each row under Networks.");
+ }
+ } else if (isset($networkacl[$x])) {
+ unset($networkacl[$x]);
+ }
+ }
+
+ if (!$input_errors) {
+ if ($pconfig['Submit'] == gettext("Save")) {
+ $acl_entry = array();
+ $acl_entry['aclid'] = $pconfig['aclid'];
+ $acl_entry['aclname'] = $pconfig['aclname'];
+ $acl_entry['aclaction'] = $pconfig['aclaction'];
+ $acl_entry['description'] = $pconfig['description'];
+ $acl_entry['aclid'] = $pconfig['aclid'];
+ $acl_entry['row'] = array();
+ foreach ($networkacl as $acl) {
+ $acl_entry['row'][] = $acl;
+ }
+
+ if (isset($id) && $a_acls[$id]) {
+ $a_acls[$id] = $acl_entry;
+ } else {
+ $a_acls[] = $acl_entry;
+ }
+
+ mark_subsystem_dirty("unbound");
+ write_config();
+
+ pfSenseHeader("/services_unbound_acls.php");
+ exit;
+ }
+ }
+ }
+}
+
+$closehead = false;
+$pgtitle = "Services: DNS Resolver: Access Lists";
+$shortcut_section = "resolver";
+include("head.inc");
+
+?>
+
+<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
+<script type="text/javascript" src="/javascript/row_helper.js"></script>
+
+<script type="text/javascript">
+//<![CDATA[
+ rowname[0] = "acl_network";
+ rowtype[0] = "textbox,ipv4v6";
+ rowsize[0] = "30";
+
+ rowname[1] = "mask";
+ rowtype[1] = "select,ipv4v6";
+ rowsize[1] = "1";
+
+ rowname[2] = "description";
+ rowtype[2] = "textbox";
+ rowsize[2] = "40";
+//]]>
+</script>
+</head>
+
+<body>
+
+<?php include("fbegin.inc"); ?>
+<form action="services_unbound_acls.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('unbound')): ?><br/>
+<?php print_info_box_np(gettext("The configuration of the DNS Resolver, has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="services unbound acls">
+ <tbody>
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("General Settings"), false, "/services_unbound.php");
+ $tab_array[] = array(gettext("Advanced settings"), false, "services_unbound_advanced.php");
+ $tab_array[] = array(gettext("Access Lists"), true, "/services_unbound_acls.php");
+ display_top_tabs($tab_array, true);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+<?php
+ if ($act == "new" || $act == "edit"):
+?>
+ <input name="aclid" type="hidden" value="<?=$id;?>" />
+ <input name="act" type="hidden" value="<?=$act;?>" />
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=ucwords(sprintf(gettext("%s Access List"), $act));?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Access List name");?></td>
+ <td width="78%" class="vtable">
+ <input name="aclname" type="text" class="formfld" id="aclname" size="30" maxlength="30" value="<?=htmlspecialchars($pconfig['aclname']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Provide an Access List name.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Action");?></td>
+ <td width="78%" class="vtable">
+ <select name="aclaction" class="formselect">
+ <?php
+ $types = explode(",", "Allow,Deny,Refuse,Allow Snoop");
+ foreach ($types as $type):
+ ?>
+ <option value="<?=strtolower($type);?>" <?php if (strtolower($type) == strtolower($pconfig['aclaction'])) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($type);?>
+ </option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Choose what to do with DNS requests that match the criteria specified below.");?> <br />
+ <?=gettext("<b>Deny:</b> This action stops queries from hosts within the netblock defined below.");?> <br />
+ <?=gettext("<b>Refuse:</b> This action also stops queries from hosts within the netblock defined below, but sends a DNS rcode REFUSED error message back to the client.");?> <br />
+ <?=gettext("<b>Allow:</b> This action allows queries from hosts within the netblock defined below.");?> <br />
+ <?=gettext("<b>Allow Snoop:</b> This action allows recursive and nonrecursive access from hosts within the netblock defined below. Used for cache snooping and ideally should only be configured for your administrative host.");?> <br />
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Networks");?></td>
+ <td width="78%" class="vtable">
+ <table id="maintable" summary="networks">
+ <tbody>
+ <tr>
+ <td><div id="onecolumn"><?=gettext("Network");?></div></td>
+ <td><div id="twocolumn"><?=gettext("CIDR");?></div></td>
+ <td><div id="threecolumn"><?=gettext("Description");?></div></td>
+ </tr>
+ <?php
+ $counter = 0;
+ if ($networkacl) {
+ foreach ($networkacl as $item):
+ $network = $item['acl_network'];
+ $cidr = $item['mask'];
+ $description = $item['description'];
+ ?>
+ <tr>
+ <td>
+ <input name="acl_network<?=$counter;?>" type="text" class="formfld unknown ipv4v6" id="acl_network<?=$counter;?>" size="30" value="<?=htmlspecialchars($network);?>" />
+ </td>
+ <td>
+ <select name="mask<?=$counter;?>" class="formselect ipv4v6" id="mask<?=$counter;?>">
+ <?php
+ for ($i = 128; $i > 0; $i--) {
+ echo "<option value=\"$i\" ";
+ if ($i == $cidr) echo "selected=\"selected\"";
+ echo ">" . $i . "</option>";
+ }
+ ?>
+ </select>
+ </td>
+ <td>
+ <input name="description<?=$counter;?>" type="text" class="formfld unknown" id="description<?=$counter;?>" size="40" value="<?=htmlspecialchars($description);?>" />
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="delete" /></a>
+ </td>
+ </tr>
+ <?php
+ $counter++;
+ endforeach;
+ }
+ ?>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
+ </a>
+ <script type="text/javascript">
+ //<![CDATA[
+ field_counter_js = 3;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+ //]]>
+ </script>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="description" type="text" class="formfld unknown" id="description" size="52" maxlength="52" value="<?=htmlspecialchars($pconfig['description']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ &nbsp;<br />&nbsp;
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ </td>
+ </tr>
+ </table>
+<?php
+ else:
+?>
+ <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="results">
+ <thead>
+ <tr>
+ <td width="25%" class="listhdrr"><?=gettext("Access List Name"); ?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Action"); ?></td>
+ <td width="45%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="5%" class="list">&nbsp;</td>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="3">&nbsp;</td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td width="17">&nbsp;</td>
+ <td valign="middle">
+ <a href="services_unbound_acls.php?act=new">
+ <img src="./themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("Add new Access List"); ?>" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="4">
+ <p>
+ <?=gettext("Access Lists to control access to the DNS Resolver can be defined here.");?>
+ </p>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+ <?php
+ $i = 0;
+ foreach ($a_acls as $acl):
+ ?>
+ <tr ondblclick="document.location='services_unbound_acls.php?act=edit&amp;id=<?=$i;?>'">
+ <td class="listlr">
+ <?=htmlspecialchars($acl['aclname']);?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($acl['aclaction']);?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($acl['description']);?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle">
+ <a href="services_unbound_acls.php?act=edit&amp;id=<?=$i;?>">
+ <img src="./themes/<?=$g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit access list"); ?>" width="17" height="17" border="0" alt="edit" />
+ </a>
+ </td>
+ <td valign="middle">
+ <a href="services_unbound_acls.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this access list?"); ?>')">
+ <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete access list"); ?>" width="17" height="17" border="0" alt="delete" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr style="display:none"><td></td></tr>
+ </tbody>
+ </table>
+<?php
+ endif;
+?>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</form>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_unbound_advanced.php b/src/usr/local/www/services_unbound_advanced.php
new file mode 100644
index 0000000..5fc4aed
--- /dev/null
+++ b/src/usr/local/www/services_unbound_advanced.php
@@ -0,0 +1,469 @@
+<?php
+/* $Id$ */
+/*
+ services_unbound_advanced.php
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright (C) 2015 Warren Baker (warren@percol8.co.za)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dnsresolver
+*/
+
+##|+PRIV
+##|*IDENT=page-services-unbound
+##|*NAME=Services: DNS Resolver Advanced page
+##|*DESCR=Allow access to the 'Services: DNS Resolver Advanced' page.
+##|*MATCH=services_unbound.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("unbound.inc");
+
+if (!is_array($config['unbound'])) {
+ $config['unbound'] = array();
+}
+
+if (isset($config['unbound']['hideidentity'])) {
+ $pconfig['hideidentity'] = true;
+}
+if (isset($config['unbound']['hideversion'])) {
+ $pconfig['hideversion'] = true;
+}
+if (isset($config['unbound']['prefetch'])) {
+ $pconfig['prefetch'] = true;
+}
+if (isset($config['unbound']['prefetchkey'])) {
+ $pconfig['prefetchkey'] = true;
+}
+if (isset($config['unbound']['dnssecstripped'])) {
+ $pconfig['dnssecstripped'] = true;
+}
+
+$pconfig['msgcachesize'] = $config['unbound']['msgcachesize'];
+$pconfig['outgoing_num_tcp'] = isset($config['unbound']['outgoing_num_tcp']) ? $config['unbound']['outgoing_num_tcp'] : '10';
+$pconfig['incoming_num_tcp'] = isset($config['unbound']['incoming_num_tcp']) ? $config['unbound']['incoming_num_tcp'] : '10';
+$pconfig['edns_buffer_size'] = isset($config['unbound']['edns_buffer_size']) ? $config['unbound']['edns_buffer_size'] : '4096';
+$pconfig['num_queries_per_thread'] = $config['unbound']['num_queries_per_thread'];
+$pconfig['jostle_timeout'] = isset($config['unbound']['jostle_timeout']) ? $config['unbound']['jostle_timeout'] : '200';
+$pconfig['cache_max_ttl'] = isset($config['unbound']['cache_max_ttl']) ? $config['unbound']['cache_max_ttl'] : '86400';
+$pconfig['cache_min_ttl'] = isset($config['unbound']['cache_min_ttl']) ? $config['unbound']['cache_min_ttl'] : '0';
+$pconfig['infra_host_ttl'] = isset($config['unbound']['infra_host_ttl']) ? $config['unbound']['infra_host_ttl'] : '900';
+$pconfig['infra_cache_numhosts'] = isset($config['unbound']['infra_cache_numhosts']) ? $config['unbound']['infra_cache_numhosts'] : '10000';
+$pconfig['unwanted_reply_threshold'] = isset($config['unbound']['unwanted_reply_threshold']) ? $config['unbound']['unwanted_reply_threshold'] : 'disabled';
+$pconfig['log_verbosity'] = isset($config['unbound']['log_verbosity']) ? $config['unbound']['log_verbosity'] : "1";
+
+if (isset($config['unbound']['disable_auto_added_access_control'])) {
+ $pconfig['disable_auto_added_access_control'] = true;
+}
+
+if (isset($config['unbound']['use_caps'])) {
+ $pconfig['use_caps'] = true;
+}
+
+if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = services_unbound_configure();
+ $savemsg = get_std_save_message($retval);
+ if ($retval == 0) {
+ clear_subsystem_dirty('unbound');
+ }
+ } else {
+ if (isset($_POST['msgcachesize']) && !in_array($_POST['msgcachesize'], array('4', '10', '20', '50', '100', '250', '512'), true)) {
+ $input_errors[] = "A valid value for Message Cache Size must be specified.";
+ }
+ if (isset($_POST['outgoing_num_tcp']) && !in_array($_POST['outgoing_num_tcp'], array('0', '10', '20', '30', '40', '50'), true)) {
+ $input_errors[] = "A valid value must be specified for Outgoing TCP Buffers.";
+ }
+ if (isset($_POST['outgoing_num_tcp']) && !in_array($_POST['incoming_num_tcp'], array('0', '10', '20', '30', '40', '50'), true)) {
+ $input_errors[] = "A valid value must be specified for Incoming TCP Buffers.";
+ }
+ if (isset($_POST['edns_buffer_size']) && !in_array($_POST['edns_buffer_size'], array('512', '1480', '4096'), true)) {
+ $input_errors[] = "A valid value must be specified for EDNS Buffer Size.";
+ }
+ if (isset($_POST['num_queries_per_thread']) && !in_array($_POST['num_queries_per_thread'], array('512', '1024', '2048'), true)) {
+ $input_errors[] = "A valid value must be specified for Number of queries per thread.";
+ }
+ if (isset($_POST['jostle_timeout']) && !in_array($_POST['jostle_timeout'], array('100', '200', '500', '1000'), true)) {
+ $input_errors[] = "A valid value must be specified for Jostle Timeout.";
+ }
+ if (isset($_POST['cache_max_ttl']) && (!is_numericint($_POST['cache_max_ttl']) || ($_POST['cache_max_ttl'] < 0))) {
+ $input_errors[] = "'Maximum TTL for RRsets and messages' must be a positive integer.";
+ }
+ if (isset($_POST['cache_min_ttl']) && (!is_numericint($_POST['cache_min_ttl']) || ($_POST['cache_min_ttl'] < 0))) {
+ $input_errors[] = "'Minimum TTL for RRsets and messages' must be a positive integer.";
+ }
+ if (isset($_POST['infra_host_ttl']) && !in_array($_POST['infra_host_ttl'], array('60', '120', '300', '600', '900'), true)) {
+ $input_errors[] = "A valid value must be specified for TTL for Host cache entries.";
+ }
+ if (isset($_POST['infra_cache_numhosts']) && !in_array($_POST['infra_cache_numhosts'], array('1000', '5000', '10000', '20000', '50000'), true)) {
+ $input_errors[] = "A valid value must be specified for Number of Hosts to cache.";
+ }
+ if (isset($_POST['unwanted_reply_threshold']) && !in_array($_POST['unwanted_reply_threshold'], array('disabled', '5000000', '10000000', '20000000', '40000000', '50000000'), true)) {
+ $input_errors[] = "A valid value must be specified for Unwanted Reply Threshold.";
+ }
+ if (isset($_POST['log_verbosity']) && !in_array($_POST['log_verbosity'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Log level verbosity.";
+ }
+ if (isset($_POST['dnssecstripped']) && !isset($config['unbound']['dnssec'])) {
+ $input_errors[] = "Harden DNSSEC Data option can only be enabled if DNSSEC support is enabled.";
+ }
+
+ if (!$input_errors) {
+
+ if (isset($_POST['hideidentity'])) {
+ $config['unbound']['hideidentity'] = true;
+ } else {
+ unset($config['unbound']['hideidentity']);
+ }
+ if (isset($_POST['hideversion'])) {
+ $config['unbound']['hideversion'] = true;
+ } else {
+ unset($config['unbound']['hideversion']);
+ }
+ if (isset($_POST['prefetch'])) {
+ $config['unbound']['prefetch'] = true;
+ } else {
+ unset($config['unbound']['prefetch']);
+ }
+ if (isset($_POST['prefetchkey'])) {
+ $config['unbound']['prefetchkey'] = true;
+ } else {
+ unset($config['unbound']['prefetchkey']);
+ }
+ if (isset($_POST['dnssecstripped'])) {
+ $config['unbound']['dnssecstripped'] = true;
+ } else {
+ unset($config['unbound']['dnssecstripped']);
+ }
+ $config['unbound']['msgcachesize'] = $_POST['msgcachesize'];
+ $config['unbound']['outgoing_num_tcp'] = $_POST['outgoing_num_tcp'];
+ $config['unbound']['incoming_num_tcp'] = $_POST['incoming_num_tcp'];
+ $config['unbound']['edns_buffer_size'] = $_POST['edns_buffer_size'];
+ $config['unbound']['num_queries_per_thread'] = $_POST['num_queries_per_thread'];
+ $config['unbound']['jostle_timeout'] = $_POST['jostle_timeout'];
+ $config['unbound']['cache_max_ttl'] = $_POST['cache_max_ttl'];
+ $config['unbound']['cache_min_ttl'] = $_POST['cache_min_ttl'];
+ $config['unbound']['infra_host_ttl'] = $_POST['infra_host_ttl'];
+ $config['unbound']['infra_cache_numhosts'] = $_POST['infra_cache_numhosts'];
+ $config['unbound']['unwanted_reply_threshold'] = $_POST['unwanted_reply_threshold'];
+ $config['unbound']['log_verbosity'] = $_POST['log_verbosity'];
+ if (isset($_POST['disable_auto_added_access_control'])) {
+ $config['unbound']['disable_auto_added_access_control'] = true;
+ } else {
+ unset($config['unbound']['disable_auto_added_access_control']);
+ }
+ if (isset($_POST['use_caps'])) {
+ $config['unbound']['use_caps'] = true;
+ } else {
+ unset($config['unbound']['use_caps']);
+ }
+ write_config("DNS Resolver configured.");
+
+ mark_subsystem_dirty('unbound');
+ }
+ }
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("Advanced"));
+$shortcut_section = "resolver";
+include_once("head.inc");
+
+?>
+
+</head>
+
+<body>
+<?php include("fbegin.inc"); ?>
+<form action="services_unbound_advanced.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('unbound')): ?><br/>
+<?php print_info_box_np(gettext("The configuration of the DNS Resolver, has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="services unbound advanced">
+ <tbody>
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("General settings"), false, "services_unbound.php");
+ $tab_array[] = array(gettext("Advanced settings"), true, "services_unbound_advanced.php");
+ $tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
+ display_top_tabs($tab_array, true);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tbody>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced Resolver Options");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hide Identity");?></td>
+ <td width="78%" class="vtable">
+ <input name="hideidentity" type="checkbox" id="hideidentity" value="yes" <?php if (isset($pconfig['hideidentity'])) echo "checked=\"checked\"";?> /><br />
+ <?=gettext("If enabled, id.server and hostname.bind queries are refused.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hide Version");?></td>
+ <td width="78%" class="vtable">
+ <input name="hideversion" type="checkbox" id="hideversion" value="yes" <?php if (isset($pconfig['hideversion'])) echo "checked=\"checked\"";?> /><br />
+ <?=gettext("If enabled, version.server and version.bind queries are refused.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Prefetch Support");?></td>
+ <td width="78%" class="vtable">
+ <input name="prefetch" type="checkbox" id="prefetch" value="yes" <?php if (isset($pconfig['prefetch'])) echo "checked=\"checked\"";?> /><br />
+ <?=gettext("Message cache elements are prefetched before they expire to help keep the cache up to date. When enabled, this option can cause an increase of around 10% more DNS traffic and load on the server, but frequently requested items will not expire from the cache.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Prefetch DNS Key Support");?></td>
+ <td width="78%" class="vtable">
+ <input name="prefetchkey" type="checkbox" id="prefetchkey" value="yes" <?php if (isset($pconfig['prefetchkey'])) echo "checked=\"checked\"";?> /><br />
+ <?=sprintf(gettext("DNSKEYs are fetched earlier in the validation process when a %sDelegation signer%s is encountered. This helps lower the latency of requests but does utilize a little more CPU."), "<a href='http://en.wikipedia.org/wiki/List_of_DNS_record_types'>", "</a>");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Harden DNSSEC data");?></td>
+ <td width="78%" class="vtable">
+ <input name="dnssecstripped" type="checkbox" id="dnssecstripped" value="yes" <?php if (isset($pconfig['dnssecstripped'])) echo "checked=\"checked\"";?> /><br />
+ <?=gettext("DNSSEC data is required for trust-anchored zones. If such data is absent, the zone becomes bogus. If this is disabled and no DNSSEC data is received, then the zone is made insecure.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Message Cache Size");?></td>
+ <td width="78%" class="vtable">
+ <select id="msgcachesize" name="msgcachesize">
+<?php
+ foreach (array("4", "10", "20", "50", "100", "250", "512") as $size) :
+?>
+ <option value="<?php echo $size; ?>" <?php if ($pconfig['msgcachesize'] == "{$size}") echo "selected=\"selected\""; ?>>
+ <?php echo $size; ?>MB
+ </option>
+<?php
+ endforeach;
+?>
+ </select><br />
+ <?=gettext("Size of the message cache. The message cache stores DNS rcodes and validation statuses. The RRSet cache will automatically be set to twice this amount. The RRSet cache contains the actual RR data. The default is 4 megabytes.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Outgoing TCP Buffers");?></td>
+ <td width="78%" class="vtable">
+ <select id="outgoing_num_tcp" name="outgoing_num_tcp">
+<?php
+ for ($num_tcp = 0; $num_tcp <= 50; $num_tcp += 10):
+?>
+ <option value="<?php echo $num_tcp; ?>" <?php if ($pconfig['outgoing_num_tcp'] == "{$num_tcp}") echo "selected=\"selected\""; ?>>
+ <?php echo $num_tcp; ?>
+ </option>
+<?php
+ endfor;
+?>
+ </select><br />
+ <?=gettext("The number of outgoing TCP buffers to allocate per thread. The default value is 10. If 0 is selected then no TCP queries, to authoritative servers, are done.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Incoming TCP Buffers");?></td>
+ <td width="78%" class="vtable">
+ <select id="incoming_num_tcp" name="incoming_num_tcp">
+<?php
+ for ($num_tcp = 0; $num_tcp <= 50; $num_tcp += 10):
+?>
+ <option value="<?php echo $num_tcp; ?>" <?php if ($pconfig['incoming_num_tcp'] == "{$num_tcp}") echo "selected=\"selected\""; ?>>
+ <?php echo $num_tcp; ?>
+ </option>
+<?php
+ endfor;
+?>
+ </select><br />
+ <?=gettext("The number of incoming TCP buffers to allocate per thread. The default value is 10. If 0 is selected then no TCP queries, from clients, are accepted.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("EDNS Buffer Size");?></td>
+ <td width="78%" class="vtable">
+ <select id="edns_buffer_size" name="edns_buffer_size">
+<?php
+ foreach (array("512", "1480", "4096") as $size) :
+?>
+ <option value="<?php echo $size; ?>" <?php if ($pconfig['edns_buffer_size'] == "{$size}") echo "selected=\"selected\""; ?>>
+ <?php echo $size; ?>
+ </option>
+<?php
+ endforeach;
+?>
+ </select><br />
+ <?=gettext("Number of bytes size to advertise as the EDNS reassembly buffer size. This is the value that is used in UDP datagrams sent to peers. RFC recommendation is 4096 (which is the default). If you have fragmentation reassemble problems, usually seen as timeouts, then a value of 1480 should help. The 512 value bypasses most MTU path problems, but it can generate an excessive amount of TCP fallback.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Number of queries per thread");?></td>
+ <td width="78%" class="vtable">
+ <select id="num_queries_per_thread" name="num_queries_per_thread">
+<?php
+ foreach (array("512", "1024", "2048") as $queries) :
+?>
+ <option value="<?php echo $queries; ?>" <?php if ($pconfig['num_queries_per_thread'] == "{$queries}") echo "selected=\"selected\""; ?>>
+ <?php echo $queries; ?>
+ </option>
+<?php
+ endforeach;
+?>
+ </select><br />
+ <?=gettext("The number of queries that every thread will service simultaneously. If more queries arrive that need to be serviced, and no queries can be jostled, then these queries are dropped.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Jostle Timeout");?></td>
+ <td width="78%" class="vtable">
+ <select id="jostle_timeout" name="jostle_timeout">
+<?php
+ foreach (array("100", "200", "500", "1000") as $timeout) :
+?>
+ <option value="<?php echo $timeout; ?>" <?php if ($pconfig['jostle_timeout'] == "{$timeout}") echo "selected=\"selected\""; ?>>
+ <?php echo $timeout; ?>
+ </option>
+<?php
+ endforeach;
+?>
+ </select><br />
+ <?=gettext("This timeout is used for when the server is very busy. This protects against denial of service by slow queries or high query rates. The default value is 200 milliseconds.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Maximum TTL for RRsets and messages");?></td>
+ <td width="78%" class="vtable">
+ <input type="text" id="cache_max_ttl" name="cache_max_ttl" size="5" value="<?php if (isset($pconfig['cache_max_ttl'])) echo htmlspecialchars($pconfig['cache_max_ttl']); ?>" /><br />
+ <?=gettext("Configure a maximum Time to live for RRsets and messages in the cache. The default is 86400 seconds (1 day). When the internal TTL expires the cache item is expired. This can be configured to force the resolver to query for data more often and not trust (very large) TTL values.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Minimum TTL for RRsets and messages");?></td>
+ <td width="78%" class="vtable">
+ <input type="text" id="cache_min_ttl" name="cache_min_ttl" size="5" value="<?php if (isset($pconfig['cache_min_ttl'])) echo htmlspecialchars($pconfig['cache_min_ttl']); ?>" /><br />
+ <?=gettext("Configure a minimum Time to live for RRsets and messages in the cache. The default is 0 seconds. If the minimum value kicks in, the data is cached for longer than the domain owner intended, and thus less queries are made to look up the data. The 0 value ensures the data in the cache is as the domain owner intended. High values can lead to trouble as the data in the cache might not match up with the actual data anymore.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("TTL for Host cache entries");?></td>
+ <td width="78%" class="vtable">
+ <select id="infra_host_ttl" name="infra_host_ttl">
+ <option value="60" <?php if ($pconfig['infra_host_ttl'] == "60") echo "selected=\"selected\""; ?>>1 minute</option>
+ <option value="120" <?php if ($pconfig['infra_host_ttl'] == "120") echo "selected=\"selected\""; ?>>2 minutes</option>
+ <option value="300" <?php if ($pconfig['infra_host_ttl'] == "300") echo "selected=\"selected\""; ?>>5 minutes</option>
+ <option value="600" <?php if ($pconfig['infra_host_ttl'] == "600") echo "selected=\"selected\""; ?>>10 minutes</option>
+ <option value="900" <?php if ($pconfig['infra_host_ttl'] == "900") echo "selected=\"selected\""; ?>>15 minutes</option>
+ </select><br />
+ <?=gettext("Time to live for entries in the host cache. The host cache contains roundtrip timing, lameness and EDNS support information. The default is 15 minutes.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Number of Hosts to cache");?></td>
+ <td width="78%" class="vtable">
+ <select id="infra_cache_numhosts" name="infra_cache_numhosts">
+ <option value="1000" <?php if ($pconfig['infra_cache_numhosts'] == "1000") echo "selected=\"selected\""; ?>>1000</option>
+ <option value="5000" <?php if ($pconfig['infra_cache_numhosts'] == "5000") echo "selected=\"selected\""; ?>>5000</option>
+ <option value="10000" <?php if ($pconfig['infra_cache_numhosts'] == "10000") echo "selected=\"selected\""; ?>>10 000</option>
+ <option value="20000" <?php if ($pconfig['infra_cache_numhosts'] == "20000") echo "selected=\"selected\""; ?>>20 000</option>
+ <option value="50000" <?php if ($pconfig['infra_cache_numhosts'] == "50000") echo "selected=\"selected\""; ?>>50 000</option>
+ </select><br />
+ <?=gettext("Number of hosts for which information is cached. The default is 10,000.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Unwanted Reply Threshold");?></td>
+ <td width="78%" class="vtable">
+ <select id="unwanted_reply_threshold" name="unwanted_reply_threshold">
+ <option value="disabled" <?php if ($pconfig['unwanted_reply_threshold'] == "disabled") echo "selected=\"selected\""; ?>>disabled</option>
+ <option value="5000000" <?php if ($pconfig['unwanted_reply_threshold'] == "5000000") echo "selected=\"selected\""; ?>>5 million</option>
+ <option value="10000000" <?php if ($pconfig['unwanted_reply_threshold'] == "10000000") echo "selected=\"selected\""; ?>>10 million</option>
+ <option value="20000000" <?php if ($pconfig['unwanted_reply_threshold'] == "20000000") echo "selected=\"selected\""; ?>>20 million</option>
+ <option value="40000000" <?php if ($pconfig['unwanted_reply_threshold'] == "40000000") echo "selected=\"selected\""; ?>>40 million</option>
+ <option value="50000000" <?php if ($pconfig['unwanted_reply_threshold'] == "50000000") echo "selected=\"selected\""; ?>>50 million</option>
+ </select><br />
+ <?=gettext("If enabled, a total number of unwanted replies is kept track of in every thread. When it reaches the threshold, a defensive action is taken and a warning is printed to the log file. This defensive action is to clear the RRSet and message caches, hopefully flushing away any poison. The default is disabled, but if enabled a value of 10 million is suggested.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Log level verbosity");?></td>
+ <td width="78%" class="vtable">
+ <select id="log_verbosity" name="log_verbosity">
+<?php
+ for ($level = 0; $level <= 5; $level++):
+?>
+ <option value="<?php echo $level; ?>" <?php if ($pconfig['log_verbosity'] == "{$level}") echo "selected=\"selected\""; ?>>
+ Level <?php echo $level; ?>
+ </option>
+<?php
+ endfor;
+?>
+ </select><br />
+ <?=gettext("Select the log verbosity.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable auto-added access control");?></td>
+ <td width="78%" class="vtable">
+ <input name="disable_auto_added_access_control" type="checkbox" id="disable_auto_added_access_control" value="yes" <?php if (isset($pconfig['disable_auto_added_access_control'])) echo "checked=\"checked\"";?> />
+ <?=gettext("Check this box to disable the automatically-added access control entries. By default, IPv4 and IPv6 networks residing on internal interfaces of this system are permitted. Allowed networks must be manually configured on the Access Lists tab if the auto-added entries are disabled.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Experimental Bit 0x20 Support");?></td>
+ <td width="78%" class="vtable">
+ <input name="use_caps" type="checkbox" id="use_caps" value="yes" <?php if (isset($pconfig['use_caps'])) echo "checked=\"checked\"";?> /> <br />
+ <?=sprintf(gettext("Use 0x-20 encoded random bits in the DNS query to foil spoofing attempts. See the implementation %sdraft dns-0x20%s for more information."), "<a href='https://tools.ietf.org/html/draft-vixie-dnsext-dns0x20-00'>", "</a>");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%"></td>
+ <td width="78%">
+ <input type="submit" name="Save" class="formbtn" id="save" value="Save" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_unbound_domainoverride_edit.php b/src/usr/local/www/services_unbound_domainoverride_edit.php
new file mode 100644
index 0000000..28a8424
--- /dev/null
+++ b/src/usr/local/www/services_unbound_domainoverride_edit.php
@@ -0,0 +1,183 @@
+<?php
+/*
+ services_unbound_domainoverride_edit.php
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright (C) 2014 Warren Baker (warren@decoy.co.za)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Copyright (C) 2003-2005 Bob Zoller <bob@kludgebox.com> and Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dnsresolver
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dnsresolver-editdomainoverride
+##|*NAME=Services: DNS Resolver: Edit Domain Override page
+##|*DESCR=Allow access to the 'Services: DNS Resolver: Edit Domain Override' page.
+##|*MATCH=services_unbound_domainoverride_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_unbound.php');
+}
+
+if (!is_array($config['unbound']['domainoverrides'])) {
+ $config['unbound']['domainoverrides'] = array();
+}
+
+$a_domainOverrides = &$config['unbound']['domainoverrides'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_domainOverrides[$id]) {
+ $pconfig['domain'] = $a_domainOverrides[$id]['domain'];
+ $pconfig['ip'] = $a_domainOverrides[$id]['ip'];
+ $pconfig['descr'] = $a_domainOverrides[$id]['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "domain ip");
+ $reqdfieldsn = array(gettext("Domain"), gettext("IP address"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ function String_Begins_With($needle, $haystack) {
+ return (substr($haystack, 0, strlen($needle)) == $needle);
+ }
+
+ if (String_Begins_With(_msdcs, $_POST['domain'])) {
+ $subdomainstr = substr($_POST['domain'], 7);
+ if ($subdomainstr && !is_domain($subdomainstr)) {
+ $input_errors[] = gettext("A valid domain must be specified after _msdcs.");
+ }
+ } elseif ($_POST['domain'] && !is_domain($_POST['domain'])) {
+ $input_errors[] = gettext("A valid domain must be specified.");
+ }
+
+ if ($_POST['ip']) {
+ if (strpos($_POST['ip'], '@') !== false) {
+ $ip_details = explode("@", $_POST['ip']);
+ if (!is_ipaddr($ip_details[0]) || !is_port($ip_details[1])) {
+ $input_errors[] = gettext("A valid IP address and port must be specified, for example 192.168.100.10@5353.");
+ }
+ } else if (!is_ipaddr($_POST['ip'])) {
+ $input_errors[] = gettext("A valid IP address must be specified, for example 192.168.100.10.");
+ }
+ }
+
+ if (!$input_errors) {
+ $doment = array();
+ $doment['domain'] = $_POST['domain'];
+ $doment['ip'] = $_POST['ip'];
+ $doment['descr'] = $_POST['descr'];
+
+ if (isset($id) && $a_domainOverrides[$id]) {
+ $a_domainOverrides[$id] = $doment;
+ } else {
+ $a_domainOverrides[] = $doment;
+ }
+
+ mark_subsystem_dirty('unbound');
+
+ write_config();
+
+ header("Location: services_unbound.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("Edit Domain Override"));
+$shortcut_section = "resolver";
+include("head.inc");
+
+?>
+
+<body>
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+ <form action="services_unbound_domainoverride_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="domain override">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" /><br />
+ <span class="vexpl">
+ <?=gettext("Domain to override (NOTE: this does not have to be a valid TLD!)"); ?><br />
+ <?=gettext("e.g."); ?> <em><?=gettext("test"); ?></em> <?=gettext("or"); ?> <em>mycompany.localdomain</em> <?=gettext("or"); ?> <em>1.168.192.in-addr.arpa</em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="ip" type="text" class="formfld unknown" id="ip" size="40" value="<?=htmlspecialchars($pconfig['ip']);?>" /><br />
+ <span class="vexpl">
+ <?=gettext("IP address of the authoritative DNS server for this domain"); ?><br />
+ <?=gettext("e.g."); ?> <em>192.168.100.100</em><br />
+ <?=gettext("To use a nondefault port for communication, append an '@' with the port number."); ?><br />
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" /><br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed).");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_domainOverrides[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_unbound_host_edit.php b/src/usr/local/www/services_unbound_host_edit.php
new file mode 100644
index 0000000..6b365f2
--- /dev/null
+++ b/src/usr/local/www/services_unbound_host_edit.php
@@ -0,0 +1,337 @@
+<?php
+/* $Id$ */
+/*
+ services_unbound_host_edit.php
+ part of the pfSense project (https://www.pfsense.org)
+ Copyright (C) 2014 Warren Baker (warren@decoy.co.za)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Copyright (C) 2003-2004 Bob Zoller <bob@kludgebox.com> and Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: dnsresolver
+*/
+
+##|+PRIV
+##|*IDENT=page-services-dnsresolver-edithost
+##|*NAME=Services: DNS Resolver: Edit host page
+##|*DESCR=Allow access to the 'Services: DNS Resolver: Edit host' page.
+##|*MATCH=services_unbound_host_edit.php*
+##|-PRIV
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_unbound.php');
+}
+
+function hostcmp($a, $b) {
+ return strcasecmp($a['host'], $b['host']);
+}
+
+function hosts_sort() {
+ global $g, $config;
+
+ if (!is_array($config['unbound']['hosts'])) {
+ return;
+ }
+
+ usort($config['unbound']['hosts'], "hostcmp");
+}
+
+require("guiconfig.inc");
+
+if (!is_array($config['unbound']['hosts'])) {
+ $config['unbound']['hosts'] = array();
+}
+
+$a_hosts = &$config['unbound']['hosts'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_hosts[$id]) {
+ $pconfig['host'] = $a_hosts[$id]['host'];
+ $pconfig['domain'] = $a_hosts[$id]['domain'];
+ $pconfig['ip'] = $a_hosts[$id]['ip'];
+ $pconfig['descr'] = $a_hosts[$id]['descr'];
+ $pconfig['aliases'] = $a_hosts[$id]['aliases'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "domain ip");
+ $reqdfieldsn = array(gettext("Domain"), gettext("IP address"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['host']) {
+ if (!is_hostname($_POST['host'])) {
+ $input_errors[] = gettext("The hostname can only contain the characters A-Z, 0-9, '_' and '-'. It may not start or end with '-'.");
+ } else {
+ if (!is_unqualified_hostname($_POST['host'])) {
+ $input_errors[] = gettext("A valid hostname is specified, but the domain name part should be omitted");
+ }
+ }
+ }
+
+ if (($_POST['domain'] && !is_domain($_POST['domain']))) {
+ $input_errors[] = gettext("A valid domain must be specified.");
+ }
+
+ if (($_POST['ip'] && !is_ipaddr($_POST['ip']))) {
+ $input_errors[] = gettext("A valid IP address must be specified.");
+ }
+
+ /* collect aliases */
+ $aliases = array();
+ foreach ($_POST as $key => $value) {
+ $entry = '';
+ if (!substr_compare('aliashost', $key, 0, 9)) {
+ $entry = substr($key, 9);
+ $field = 'host';
+ } elseif (!substr_compare('aliasdomain', $key, 0, 11)) {
+ $entry = substr($key, 11);
+ $field = 'domain';
+ } elseif (!substr_compare('aliasdescription', $key, 0, 16)) {
+ $entry = substr($key, 16);
+ $field = 'description';
+ }
+ if (ctype_digit($entry)) {
+ $aliases[$entry][$field] = $value;
+ }
+ }
+ $pconfig['aliases']['item'] = $aliases;
+
+ /* validate aliases */
+ foreach ($aliases as $idx => $alias) {
+ $aliasreqdfields = array('aliasdomain' . $idx);
+ $aliasreqdfieldsn = array(gettext("Alias Domain"));
+
+ do_input_validation($_POST, $aliasreqdfields, $aliasreqdfieldsn, $input_errors);
+ if ($alias['host']) {
+ if (!is_hostname($alias['host'])) {
+ $input_errors[] = gettext("Hostnames in an alias list can only contain the characters A-Z, 0-9 and '-'. They may not start or end with '-'.");
+ } else {
+ if (!is_unqualified_hostname($alias['host'])) {
+ $input_errors[] = gettext("A valid alias hostname is specified, but the domain name part should be omitted");
+ }
+ }
+ }
+ if (($alias['domain'] && !is_domain($alias['domain']))) {
+ $input_errors[] = gettext("A valid domain must be specified in alias list.");
+ }
+ }
+
+ /* check for overlaps */
+ foreach ($a_hosts as $hostent) {
+ if (isset($id) && ($a_hosts[$id]) && ($a_hosts[$id] === $hostent)) {
+ continue;
+ }
+
+ if (($hostent['host'] == $_POST['host']) &&
+ ($hostent['domain'] == $_POST['domain']) &&
+ ((is_ipaddrv4($hostent['ip']) && is_ipaddrv4($_POST['ip'])) || (is_ipaddrv6($hostent['ip']) && is_ipaddrv6($_POST['ip'])))) {
+ $input_errors[] = gettext("This host/domain already exists.");
+ break;
+ }
+ }
+
+ if (!$input_errors) {
+ $hostent = array();
+ $hostent['host'] = $_POST['host'];
+ $hostent['domain'] = $_POST['domain'];
+ $hostent['ip'] = $_POST['ip'];
+ $hostent['descr'] = $_POST['descr'];
+ $hostent['aliases']['item'] = $aliases;
+
+ if (isset($id) && $a_hosts[$id]) {
+ $a_hosts[$id] = $hostent;
+ } else {
+ $a_hosts[] = $hostent;
+ }
+ hosts_sort();
+
+ mark_subsystem_dirty('unbound');
+
+ write_config();
+
+ header("Location: services_unbound.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("Edit host"));
+$shortcut_section = "resolver";
+include("head.inc");
+
+?>
+
+<body onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript" src="/javascript/row_helper.js">
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+ rowname[0] = "aliashost";
+ rowtype[0] = "textbox";
+ rowsize[0] = "20";
+ rowname[1] = "aliasdomain";
+ rowtype[1] = "textbox";
+ rowsize[1] = "20";
+ rowname[2] = "aliasdescription";
+ rowtype[2] = "textbox";
+ rowsize[2] = "20";
+//]]>
+</script>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+ <form action="services_unbound_host_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="host edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit DNS Resolver entry");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Host");?></td>
+ <td width="78%" class="vtable">
+ <input name="host" type="text" class="formfld unknown" id="host" size="40" value="<?=htmlspecialchars($pconfig['host']);?>" /><br />
+ <span class="vexpl"><?=gettext("Name of the host, without domain part"); ?><br />
+ <?=gettext("e.g."); ?> <em><?=gettext("myhost"); ?></em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain");?></td>
+ <td width="78%" class="vtable">
+ <input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" /><br />
+ <span class="vexpl"><?=gettext("Domain of the host"); ?><br />
+ <?=gettext("e.g."); ?> <em><?=gettext("example.com"); ?></em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IP address");?></td>
+ <td width="78%" class="vtable">
+ <input name="ip" type="text" class="formfld unknown" id="ip" size="40" value="<?=htmlspecialchars($pconfig['ip']);?>" /><br />
+ <span class="vexpl"><?=gettext("IP address of the host"); ?><br />
+ <?=gettext("e.g."); ?> <em>192.168.100.100</em> <?=gettext("or"); ?> <em>fd00:abcd::1</em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" /><br />
+ <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><div id="addressnetworkport"><?=gettext("Aliases"); ?></div></td>
+ <td width="78%" class="vtable">
+ <table id="maintable" summary="aliases">
+ <tbody>
+ <tr>
+ <td colspan="4">
+ <div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp">
+ <?=gettext("Enter additional names for this host."); ?>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td><div id="onecolumn"><?=gettext("Host");?></div></td>
+ <td><div id="twocolumn"><?=gettext("Domain");?></div></td>
+ <td><div id="threecolumn"><?=gettext("Description");?></div></td>
+ </tr>
+ <?php
+ $counter = 0;
+ if ($pconfig['aliases']['item']):
+ foreach ($pconfig['aliases']['item'] as $item):
+ $host = $item['host'];
+ $domain = $item['domain'];
+ $description = $item['description'];
+ ?>
+ <tr>
+ <td>
+ <input autocomplete="off" name="aliashost<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliashost<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($host);?>" />
+ </td>
+ <td>
+ <input autocomplete="off" name="aliasdomain<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliasdomain<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($domain);?>" />
+ </td>
+ <td>
+ <input name="aliasdescription<?php echo $counter; ?>" type="text" class="formfld unknown" id="aliasdescription<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($description);?>" />
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#">
+ <img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" />
+ </a>
+ </td>
+ </tr>
+ <?php
+ $counter++;
+ endforeach;
+ endif;
+ ?>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
+ </a>
+ <script type="text/javascript">
+ //<![CDATA[
+ field_counter_js = 3;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+ //]]>
+ </script>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_hosts[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_wol.php b/src/usr/local/www/services_wol.php
new file mode 100644
index 0000000..e443ab0
--- /dev/null
+++ b/src/usr/local/www/services_wol.php
@@ -0,0 +1,233 @@
+<?php
+/* $Id$ */
+/*
+ services_wol.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/local/bin/wol
+ pfSense_MODULE: wol
+*/
+
+##|+PRIV
+##|*IDENT=page-services-wakeonlan
+##|*NAME=Services: Wake on LAN page
+##|*DESCR=Allow access to the 'Services: Wake on LAN' page.
+##|*MATCH=services_wol.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['wol']['wolentry'])) {
+ $config['wol']['wolentry'] = array();
+}
+$a_wol = &$config['wol']['wolentry'];
+
+if ($_GET['wakeall'] <> "") {
+ $i = 0;
+ $savemsg = "";
+ foreach ($a_wol as $wolent) {
+ $mac = $wolent['mac'];
+ $if = $wolent['interface'];
+ $description = $wolent['descr'];
+ $ipaddr = get_interface_ip($if);
+ if (!is_ipaddr($ipaddr)) {
+ continue;
+ }
+ $bcip = gen_subnet_max($ipaddr, get_interface_subnet($if));
+ /* Execute wol command and check return code. */
+ if (!mwexec("/usr/local/bin/wol -i {$bcip} {$mac}")) {
+ $savemsg .= sprintf(gettext('Sent magic packet to %1$s (%2$s)%3$s'), $mac, $description, ".<br />");
+ } else {
+ $savemsg .= sprintf(gettext('Please check the %1$ssystem log%2$s, the wol command for %3$s (%4$s) did not complete successfully%5$s'), '<a href="/diag_logs.php">', '</a>', $description, $mac, ".<br />");
+ }
+ }
+}
+
+if ($_POST || $_GET['mac']) {
+ unset($input_errors);
+
+ if ($_GET['mac']) {
+ /* normalize MAC addresses - lowercase and convert Windows-ized hyphenated MACs to colon delimited */
+ $_GET['mac'] = strtolower(str_replace("-", ":", $_GET['mac']));
+ $mac = $_GET['mac'];
+ $if = $_GET['if'];
+ } else {
+ /* normalize MAC addresses - lowercase and convert Windows-ized hyphenated MACs to colon delimited */
+ $_POST['mac'] = strtolower(str_replace("-", ":", $_POST['mac']));
+ $mac = $_POST['mac'];
+ $if = $_POST['interface'];
+ }
+
+ /* input validation */
+ if (!$mac || !is_macaddr($mac)) {
+ $input_errors[] = gettext("A valid MAC address must be specified.");
+ }
+ if (!$if) {
+ $input_errors[] = gettext("A valid interface must be specified.");
+ }
+
+ if (!$input_errors) {
+ /* determine broadcast address */
+ $ipaddr = get_interface_ip($if);
+ if (!is_ipaddr($ipaddr)) {
+ $input_errors[] = gettext("A valid ip could not be found!");
+ } else {
+ $bcip = gen_subnet_max($ipaddr, get_interface_subnet($if));
+ /* Execute wol command and check return code. */
+ if (!mwexec("/usr/local/bin/wol -i {$bcip} " . escapeshellarg($mac))) {
+ $savemsg .= sprintf(gettext("Sent magic packet to %s."), $mac);
+ } else {
+ $savemsg .= sprintf(gettext('Please check the %1$ssystem log%2$s, the wol command for %3$s did not complete successfully%4$s'), '<a href="/diag_logs.php">', '</a>', $mac, ".<br />");
+ }
+ }
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_wol[$_GET['id']]) {
+ unset($a_wol[$_GET['id']]);
+ write_config();
+ header("Location: services_wol.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Wake on LAN"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form action="services_wol.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="wake on lan">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Wake on LAN");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect">
+ <?php
+ $interfaces = get_configured_interface_with_descr();
+ foreach ($interfaces as $iface => $ifacename): ?>
+ <option value="<?=$iface;?>" <?php if (!link_interface_to_bridge($iface) && $iface == $if) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Choose which interface the host to be woken up is connected to.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("MAC address");?></td>
+ <td width="78%" class="vtable">
+ <input name="mac" type="text" class="formfld unknown" id="mac" size="20" value="<?=htmlspecialchars($mac);?>" />
+ <br />
+ <?=gettext("Enter a MAC address ");?><span class="vexpl"> <?=gettext("in the following format: xx:xx:xx:xx:xx:xx");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Send");?>" />
+ </td>
+ </tr>
+ </table>
+ &nbsp;<br />
+ <?=gettext("Wake all clients at once: ");?><a href="services_wol.php?wakeall=true"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_wol_all.gif" width="17" height="17" border="0" alt="wol all" /></a><br/>
+ <?=gettext("Or Click the MAC address to wake up an individual device:");?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont" summary="clients">
+ <tr>
+ <td width="15%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="25%" class="listhdrr"><?=gettext("MAC address");?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17"></td>
+ <td valign="middle"><a href="services_wol_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_wol as $wolent):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='services_wol_edit.php?id=<?=$i;?>';">
+ <?=convert_friendly_interface_to_friendly_descr($wolent['interface']);?>
+ </td>
+ <td class="listr" ondblclick="document.location='services_wol_edit.php?id=<?=$i;?>';">
+ <a href="?mac=<?=$wolent['mac'];?>&amp;if=<?=$wolent['interface'];?>"><?=strtolower($wolent['mac']);?></a>
+ </td>
+ <td class="listbg" ondblclick="document.location='services_wol_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($wolent['descr']);?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="services_wol_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a></td>
+ <td valign="middle"><a href="services_wol.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this entry?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17"></td>
+ <td valign="middle"><a href="services_wol_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Note:");?><br />
+ </strong>
+ </span>
+ <?=gettext("This service can be used to wake up (power on) computers by sending special"); ?> &quot;<?=gettext("Magic Packets"); ?>&quot;. <?=gettext("The NIC in the computer that is to be woken up must support Wake on LAN and has to be configured properly (WOL cable, BIOS settings). ");?>
+ </span>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/services_wol_edit.php b/src/usr/local/www/services_wol_edit.php
new file mode 100644
index 0000000..031ba83
--- /dev/null
+++ b/src/usr/local/www/services_wol_edit.php
@@ -0,0 +1,180 @@
+<?php
+/* $Id$ */
+/*
+ services_wol_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: wol
+*/
+
+##|+PRIV
+##|*IDENT=page-services-wakeonlan-edit
+##|*NAME=Services: Wake on LAN: Edit page
+##|*DESCR=Allow access to the 'Services: Wake on LAN: Edit' page.
+##|*MATCH=services_wol_edit.php*
+##|-PRIV
+
+function wolcmp($a, $b) {
+ return strcmp($a['descr'], $b['descr']);
+}
+
+function wol_sort() {
+ global $config;
+
+ usort($config['wol']['wolentry'], "wolcmp");
+}
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/services_wol.php');
+}
+
+if (!is_array($config['wol']['wolentry'])) {
+ $config['wol']['wolentry'] = array();
+}
+$a_wol = &$config['wol']['wolentry'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_wol[$id]) {
+ $pconfig['interface'] = $a_wol[$id]['interface'];
+ $pconfig['mac'] = $a_wol[$id]['mac'];
+ $pconfig['descr'] = $a_wol[$id]['descr'];
+} else {
+ $pconfig['interface'] = $_GET['if'];
+ $pconfig['mac'] = $_GET['mac'];
+ $pconfig['descr'] = $_GET['descr'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "interface mac");
+ $reqdfieldsn = array(gettext("Interface"), gettext("MAC address"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ /* normalize MAC addresses - lowercase and convert Windows-ized hyphenated MACs to colon delimited */
+ $_POST['mac'] = strtolower(str_replace("-", ":", $_POST['mac']));
+
+ if (($_POST['mac'] && !is_macaddr($_POST['mac']))) {
+ $input_errors[] = gettext("A valid MAC address must be specified.");
+ }
+
+ if (!$input_errors) {
+ $wolent = array();
+ $wolent['interface'] = $_POST['interface'];
+ $wolent['mac'] = $_POST['mac'];
+ $wolent['descr'] = $_POST['descr'];
+
+ if (isset($id) && $a_wol[$id]) {
+ $a_wol[$id] = $wolent;
+ } else {
+ $a_wol[] = $wolent;
+ }
+ wol_sort();
+
+ write_config();
+
+ header("Location: services_wol.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("Wake on LAN"), gettext("Edit"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="services_wol_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="wol edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit WOL entry");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface");?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formfld">
+ <?php
+ $interfaces = get_configured_interface_with_descr();
+ foreach ($interfaces as $iface => $ifacename): ?>
+ <option value="<?=$iface;?>" <?php if (!link_interface_to_bridge($iface) && $iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Choose which interface this host is connected to.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("MAC address");?></td>
+ <td width="78%" class="vtable">
+ <input name="mac" type="text" class="formfld unknown" id="mac" size="20" value="<?=htmlspecialchars($pconfig['mac']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed).");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_wol[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/shortcuts.inc b/src/usr/local/www/shortcuts.inc
new file mode 100644
index 0000000..c4bf48e
--- /dev/null
+++ b/src/usr/local/www/shortcuts.inc
@@ -0,0 +1,289 @@
+<?php
+/* $Id$ */
+/*
+ Copyright (C) 2012 Jim Pingle
+ All rights reserved.
+
+ Copyright (C) 2007, 2008 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/*
+ pfSense_MODULE: system
+*/
+
+// On the page, add in like so:
+// $shortcut_section = "relayd";
+
+$shortcuts = array();
+
+/* Load and process custom shortcuts. */
+function get_shortcut_files($directory) {
+ $dir_array = array();
+ if (!is_dir($directory)) {
+ return;
+ }
+ if ($dh = opendir($directory)) {
+ while (($file = readdir($dh)) !== false) {
+ $canadd = 0;
+ if ($file == ".") {
+ $canadd = 1;
+ }
+ if ($file == "..") {
+ $canadd = 1;
+ }
+ if ($canadd == 0) {
+ array_push($dir_array, $file);
+ }
+ }
+ closedir($dh);
+ }
+ if (!is_array($dir_array)) {
+ return;
+ }
+ return $dir_array;
+}
+
+function get_shortcut_by_service_name($servicename) {
+ global $shortcuts;
+ foreach ($shortcuts as $name => $shortcut) {
+ if (!empty($shortcut['service']) && ($shortcut['service'] == $servicename)) {
+ return $name;
+ }
+ }
+ return null;
+}
+
+function get_shortcut_main_link($shortcut_section, $addspace = true, $service = array()) {
+ global $g, $shortcuts;
+ if (empty($shortcut_section)) {
+ return "";
+ }
+ $space = ($addspace) ? "&nbsp;" : "" ;
+ switch ($shortcut_section) {
+ case "openvpn":
+ if (!empty($service['mode']) && is_numeric($service['id'])) {
+ $link = "vpn_openvpn_{$service['mode']}.php?act=edit&amp;id={$service['id']}";
+ } else {
+ $link = $shortcuts[$shortcut_section]['main'];
+ }
+ break;
+ case "captiveportal":
+ if (!empty($service['zone'])) {
+ $link = "services_captiveportal.php?zone={$service['zone']}";
+ } else {
+ $link = $shortcuts[$shortcut_section]['main'];
+ }
+ break;
+ default:
+ $link = $shortcuts[$shortcut_section]['main'];
+ break;
+ }
+ if (!empty($link) && ($_SERVER['REQUEST_URI'] != "/{$link}")) {
+ return "{$space}<a href=\"{$link}\" title=\"" . gettext("Main page for this section") . "\"><img style=\"vertical-align:middle\" src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" border=\"0\" alt=\"plus\" /></a>";
+ }
+}
+
+function get_shortcut_status_link($shortcut_section, $addspace = true, $service = array()) {
+ global $g, $shortcuts, $cpzone;
+ if (empty($shortcut_section)) {
+ return "";
+ }
+ $space = ($addspace) ? "&nbsp;" : "" ;
+ if (!empty($cpzone)) {
+ $zone = $cpzone;
+ } elseif (!empty($service['zone'])) {
+ $zone = $service['zone'];
+ }
+ switch ($shortcut_section) {
+ case "captiveportal":
+ if (!empty($zone)) {
+ $link = "status_captiveportal.php?zone={$zone}";
+ } else {
+ $link = $shortcuts[$shortcut_section]['status'];
+ }
+ break;
+ default:
+ $link = $shortcuts[$shortcut_section]['status'];
+ break;
+ }
+ if (!empty($link)) {
+ return "{$space}<a href=\"{$link}\" title=\"" . gettext("Status of items on this page") . "\"><img style=\"vertical-align:middle\" src=\"/themes/{$g['theme']}/images/icons/icon_service_status.gif\" border=\"0\" alt=\"status\" /></a>";
+ }
+}
+
+function get_shortcut_log_link($shortcut_section, $addspace = true) {
+ global $g, $shortcuts;
+ $space = ($addspace) ? "&nbsp;" : "" ;
+ if (!empty($shortcut_section) && !empty($shortcuts[$shortcut_section]['log'])) {
+ return "{$space}<a href=\"{$shortcuts[$shortcut_section]['log']}\" title=\"" . gettext("Log entries for items on this page") . "\"><img style=\"vertical-align:middle\" src=\"/themes/{$g['theme']}/images/icons/icon_logs.gif\" border=\"0\" alt=\"logs\" /></a>";
+ }
+}
+
+// Load shortcuts
+$dir_array = get_shortcut_files("/usr/local/www/shortcuts");
+foreach ($dir_array as $file) {
+ if (!is_dir("/usr/local/www/shortcuts/{$file}") && stristr($file, ".inc")) {
+ include("/usr/local/www/shortcuts/{$file}");
+ }
+}
+if (is_dir("/usr/local/pkg/shortcuts")) {
+ $dir_array = get_shortcut_files("/usr/local/pkg/shortcuts");
+ foreach ($dir_array as $file) {
+ if (!is_dir("/usr/local/pkg/shortcuts/{$file}") && stristr($file, ".inc")) {
+ include("/usr/local/pkg/shortcuts/{$file}");
+ }
+ }
+}
+
+$shortcuts['relayd'] = array();
+$shortcuts['relayd']['main'] = "load_balancer_pool.php";
+$shortcuts['relayd']['log'] = "diag_logs_relayd.php";
+$shortcuts['relayd']['status'] = "status_lb_pool.php";
+$shortcuts['relayd']['service'] = "relayd";
+
+$shortcuts['relayd-virtualservers'] = array();
+$shortcuts['relayd-virtualservers']['main'] = "load_balancer_virtual_server.php";
+$shortcuts['relayd-virtualservers']['log'] = "diag_logs_relayd.php";
+$shortcuts['relayd-virtualservers']['status'] = "status_lb_vs.php";
+$shortcuts['relayd-virtualservers']['service'] = "relayd";
+
+$shortcuts['captiveportal'] = array();
+$shortcuts['captiveportal']['main'] = "services_captiveportal_zones.php";
+$shortcuts['captiveportal']['log'] = "diag_logs_auth.php";
+$shortcuts['captiveportal']['status'] = "status_captiveportal.php";
+$shortcuts['captiveportal']['service'] = "captiveportal";
+
+$shortcuts['captiveportal-vouchers'] = array();
+$shortcuts['captiveportal-vouchers']['log'] = "diag_logs_auth.php";
+$shortcuts['captiveportal-vouchers']['status'] = "status_captiveportal_vouchers.php";
+$shortcuts['captiveportal-vouchers']['service'] = "captiveportal";
+
+$shortcuts['dhcp'] = array();
+$shortcuts['dhcp']['main'] = "services_dhcp.php";
+$shortcuts['dhcp']['log'] = "diag_logs_dhcp.php";
+$shortcuts['dhcp']['status'] = "status_dhcp_leases.php";
+$shortcuts['dhcp']['service'] = "dhcpd";
+
+$shortcuts['dhcp6'] = array();
+$shortcuts['dhcp6']['main'] = "services_dhcpv6.php";
+$shortcuts['dhcp6']['log'] = "diag_logs_dhcp.php";
+$shortcuts['dhcp6']['status'] = "status_dhcpv6_leases.php";
+
+
+$shortcuts['ipsec'] = array();
+$shortcuts['ipsec']['main'] = "vpn_ipsec.php";
+$shortcuts['ipsec']['log'] = "diag_logs_ipsec.php";
+$shortcuts['ipsec']['status'] = "diag_ipsec.php";
+$shortcuts['ipsec']['service'] = "ipsec";
+
+$shortcuts['openvpn'] = array();
+$shortcuts['openvpn']['main'] = "vpn_openvpn_server.php";
+$shortcuts['openvpn']['log'] = "diag_logs_openvpn.php";
+$shortcuts['openvpn']['status'] = "status_openvpn.php";
+$shortcuts['openvpn']['service'] = "openvpn";
+
+$shortcuts['firewall'] = array();
+$shortcuts['firewall']['main'] = "firewall_rules.php";
+$shortcuts['firewall']['log'] = "diag_logs_filter.php";
+$shortcuts['firewall']['status'] = "status_filter_reload.php";
+
+$shortcuts['routing'] = array();
+$shortcuts['routing']['main'] = "system_routes.php";
+$shortcuts['routing']['log'] = "diag_logs_routing.php";
+$shortcuts['routing']['status'] = "diag_routes.php";
+
+$shortcuts['gateways'] = array();
+$shortcuts['gateways']['main'] = "system_gateways.php";
+$shortcuts['gateways']['log'] = "diag_logs_gateways.php";
+$shortcuts['gateways']['status'] = "status_gateways.php";
+$shortcuts['gateways']['service'] = "apinger";
+
+$shortcuts['gateway-groups'] = array();
+$shortcuts['gateway-groups']['main'] = "system_gateway_groups.php";
+$shortcuts['gateway-groups']['log'] = "diag_logs_gateways.php";
+$shortcuts['gateway-groups']['status'] = "status_gateway_groups.php";
+
+$shortcuts['interfaces'] = array();
+$shortcuts['interfaces']['main'] = "interfaces_assign.php";
+$shortcuts['interfaces']['status'] = "status_interfaces.php";
+
+$shortcuts['trafficshaper'] = array();
+$shortcuts['trafficshaper']['main'] = "firewall_shaper.php";
+$shortcuts['trafficshaper']['status'] = "status_queues.php";
+
+$shortcuts['trafficshaper-limiters'] = array();
+$shortcuts['trafficshaper-limiters']['main'] = "firewall_shaper_vinterface.php";
+$shortcuts['trafficshaper-limiters']['status'] = "diag_limiter_info.php";
+
+$shortcuts['forwarder'] = array();
+$shortcuts['forwarder']['main'] = "services_dnsmasq.php";
+$shortcuts['forwarder']['log'] = "diag_logs_resolver.php";
+$shortcuts['forwarder']['service'] = "dnsmasq";
+
+$shortcuts['resolver'] = array();
+$shortcuts['resolver']['main'] = "services_unbound.php";
+$shortcuts['resolver']['log'] = "diag_logs_resolver.php";
+$shortcuts['resolver']['service'] = "unbound";
+
+$shortcuts['wireless'] = array();
+$shortcuts['wireless']['main'] = "interfaces_wireless.php";
+$shortcuts['wireless']['log'] = "diag_logs_wireless.php";
+$shortcuts['wireless']['status'] = "status_wireless.php";
+
+$shortcuts['ntp'] = array();
+$shortcuts['ntp']['main'] = "services_ntpd.php";
+$shortcuts['ntp']['log'] = "diag_logs_ntpd.php";
+$shortcuts['ntp']['status'] = "status_ntpd.php";
+$shortcuts['ntp']['service'] = "ntpd";
+
+$shortcuts['pptps'] = array();
+$shortcuts['pptps']['main'] = "vpn_pptp.php";
+$shortcuts['pptps']['log'] = "diag_logs_vpn.php";
+
+$shortcuts['pppoes'] = array();
+$shortcuts['pppoes']['main'] = "vpn_pppoe.php";
+$shortcuts['pppoes']['log'] = "diag_logs_vpn.php?vpntype=poes";
+
+$shortcuts['l2tps'] = array();
+$shortcuts['l2tps']['main'] = "vpn_l2tp.php";
+$shortcuts['l2tps']['log'] = "diag_logs_vpn.php?vpntype=l2tp";
+
+$shortcuts['carp'] = array();
+$shortcuts['carp']['main'] = "system_hasync.php";
+$shortcuts['carp']['status'] = "carp_status.php";
+
+$shortcuts['snmp'] = array();
+$shortcuts['snmp']['main'] = "services_snmp.php";
+$shortcuts['snmp']['service'] = "bsnmpd";
+
+$shortcuts['authentication'] = array();
+$shortcuts['authentication']['main'] = "system_authservers.php";
+$shortcuts['authentication']['status'] = "diag_authentication.php";
+
+$shortcuts['aliases'] = array();
+$shortcuts['aliases']['main'] = "firewall_aliases.php";
+$shortcuts['aliases']['status'] = "diag_tables.php";
+?>
diff --git a/src/usr/local/www/shortcuts/pkg_upnp.inc b/src/usr/local/www/shortcuts/pkg_upnp.inc
new file mode 100644
index 0000000..2b068a7
--- /dev/null
+++ b/src/usr/local/www/shortcuts/pkg_upnp.inc
@@ -0,0 +1,11 @@
+<?php
+
+global $shortcuts;
+
+$shortcuts['upnp'] = array();
+$shortcuts['upnp']['main'] = "pkg_edit.php?xml=miniupnpd.xml";
+$shortcuts['upnp']['log'] = "diag_logs_routing.php";
+$shortcuts['upnp']['status'] = "status_upnp.php";
+$shortcuts['upnp']['service'] = "miniupnpd";
+
+?>
diff --git a/src/usr/local/www/stats.php b/src/usr/local/www/stats.php
new file mode 100644
index 0000000..6f34673
--- /dev/null
+++ b/src/usr/local/www/stats.php
@@ -0,0 +1,46 @@
+<?php
+/*
+ $Id$
+ part of pfSense (https://www.pfsense.org)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2007 Scott Ullrich <sullrich@gmail.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-cpuutilization
+##|*NAME=Diagnostics: CPU Utilization page
+##|*DESCR=Allow access to the 'Diagnostics: CPU Utilization' page.
+##|*MATCH=stats.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("includes/functions.inc.php");
+
+$cpu = cpu_usage();
+
+echo $cpu;
+exit;
+
+?>
diff --git a/src/usr/local/www/status.php b/src/usr/local/www/status.php
new file mode 100755
index 0000000..6561c98
--- /dev/null
+++ b/src/usr/local/www/status.php
@@ -0,0 +1,281 @@
+<?php
+/* $Id$ */
+/* Run various commands and collect their output into HTML tables.
+ * Jim McBeath <jimmc@macrovision.com> Nov 2003
+ *
+ * (modified for m0n0wall by Manuel Kasper <mk@neon1.net>)
+ * (modified for pfSense by Scott Ullrich geekgod@pfsense.com)
+ *
+ */
+/*
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/vmstat /usr/bin/netstat /sbin/dmesg /sbin/mount /sbin/setkey /usr/local/sbin/pftop
+ pfSense_BUILDER_BINARIES: /sbin/pfctl /sbin/sysctl /usr/bin/top /usr/bin/netstat /sbin/pfctl /sbin/ifconfig
+ pfSense_MODULE: support
+*/
+
+##|+PRIV
+##|*IDENT=page-hidden-detailedstatus
+##|*NAME=Hidden: Detailed Status page
+##|*DESCR=Allow access to the 'Hidden: Detailed Status' page.
+##|*MATCH=status.php*
+##|-PRIV
+
+/* Execute a command, with a title, and generate an HTML table
+ * showing the results.
+ */
+
+/* include all configuration functions */
+require_once("guiconfig.inc");
+require_once("functions.inc");
+$output_path = "/tmp/status_output/";
+$output_file = "/tmp/status_output.tgz";
+
+if (is_dir($output_path)) {
+ unlink_if_exists("{$output_path}/*");
+ @rmdir($output_path);
+}
+unlink_if_exists($output_file);
+mkdir($output_path);
+
+function doCmdT($title, $command) {
+ global $output_path, $output_file;
+ /* Fixup output directory */
+
+ $rubbish = array('|', '-', '/', '.', ' '); /* fixes the <a> tag to be W3C compliant */
+ echo "\n<a name=\"" . str_replace($rubbish, '', $title) . "\" id=\"" . str_replace($rubbish, '', $title) . "\"></a>\n";
+ echo "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"" . $title . "\">\n";
+ echo "\t<tr><td class=\"listtopic\">" . $title . "</td></tr>\n";
+ echo "\t<tr>\n\t\t<td class=\"listlr\">\n\t\t\t<pre>"; /* no newline after pre */
+
+ if ($command == "dumpconfigxml") {
+ $ofd = @fopen("{$output_path}/config-sanitized.xml", "w");
+ $fd = @fopen("/conf/config.xml", "r");
+ if ($fd) {
+ while (!feof($fd)) {
+ $line = fgets($fd);
+ /* remove sensitive contents */
+ $line = preg_replace("/<password>.*?<\\/password>/", "<password>xxxxx</password>", $line);
+ $line = preg_replace("/<pre-shared-key>.*?<\\/pre-shared-key>/", "<pre-shared-key>xxxxx</pre-shared-key>", $line);
+ $line = preg_replace("/<rocommunity>.*?<\\/rocommunity>/", "<rocommunity>xxxxx</rocommunity>", $line);
+ $line = preg_replace("/<prv>.*?<\\/prv>/", "<prv>xxxxx</prv>", $line);
+ $line = preg_replace("/<shared_key>.*?<\\/shared_key>/", "<shared_key>xxxxx</shared_key>", $line);
+ $line = preg_replace("/<tls>.*?<\\/tls>/", "<tls>xxxxx</tls>", $line);
+ $line = preg_replace("/<ipsecpsk>.*?<\\/ipsecpsk>/", "<ipsecpsk>xxxxx</ipsecpsk>", $line);
+ $line = preg_replace("/<md5-hash>.*?<\\/md5-hash>/", "<md5-hash>xxxxx</md5-hash>", $line);
+ $line = preg_replace("/<md5password>.*?<\\/md5password>/", "<md5password>xxxxx</md5password>", $line);
+ $line = preg_replace("/<radius_secret>.*?<\\/radius_secret>/", "<radius_secret>xxxxx</radius_secret>", $line);
+ $line = preg_replace("/<ldap_bindpw>.*?<\\/ldap_bindpw>/", "<ldap_bindpw>xxxxx</ldap_bindpw>", $line);
+ $line = preg_replace("/<passwordagain>.*?<\\/passwordagain>/", "<passwordagain>xxxxx</passwordagain>", $line);
+ $line = preg_replace("/<crypto_password>.*?<\\/crypto_password>/", "<crypto_password>xxxxx</crypto_password>", $line);
+ $line = preg_replace("/<crypto_password2>.*?<\\/crypto_password2>/", "<crypto_password2>xxxxx</crypto_password2>", $line);
+ $line = str_replace("\t", " ", $line);
+ echo htmlspecialchars($line, ENT_NOQUOTES);
+ fwrite($ofd, $line);
+ }
+ }
+ fclose($fd);
+ fclose($ofd);
+ } else {
+ $ofd = @fopen("{$output_path}/{$title}.txt", "w");
+ $execOutput = "";
+ $execStatus = "";
+ exec ($command . " 2>&1", $execOutput, $execStatus);
+ for ($i = 0; isset($execOutput[$i]); $i++) {
+ if ($i > 0) {
+ echo "\n";
+ }
+ echo htmlspecialchars($execOutput[$i], ENT_NOQUOTES);
+ fwrite($ofd, $execOutput[$i] . "\n");
+ }
+ fclose($ofd);
+ }
+ echo "\n\t\t\t</pre>\n\t\t</td>\n\t</tr>\n";
+ echo "</table>\n";
+}
+
+/* Define a command, with a title, to be executed later. */
+function defCmdT($title, $command) {
+ global $commands;
+ $title = htmlspecialchars($title, ENT_NOQUOTES);
+ $commands[] = array($title, $command);
+}
+
+/* List all of the commands as an index. */
+function listCmds() {
+ global $commands;
+ $rubbish = array('|', '-', '/', '.', ' '); /* fixes the <a> tag to be W3C compliant */
+ echo "\n<p>" . gettext("This status page includes the following information") . ":\n";
+ echo "<ul>\n";
+ for ($i = 0; isset($commands[$i]); $i++) {
+ echo "\t<li><strong><a href=\"#" . str_replace($rubbish, '', $commands[$i][0]) . "\">" . $commands[$i][0] . "</a></strong></li>\n";
+ }
+ echo "</ul>\n";
+}
+
+/* Execute all of the commands which were defined by a call to defCmd. */
+function execCmds() {
+ global $commands;
+ for ($i = 0; isset($commands[$i]); $i++) {
+ doCmdT($commands[$i][0], $commands[$i][1]);
+ }
+}
+
+global $g, $config;
+
+/* Set up all of the commands we want to execute. */
+
+/* System stats/info */
+defCmdT("System uptime", "/usr/bin/uptime");
+defCmdT("Interfaces", "/sbin/ifconfig -a");
+defCmdT("Interface Statistics","/usr/bin/netstat -ni");
+defCmdT("Top Process Info", "/usr/bin/top | /usr/bin/head -n5");
+defCmdT("Processes", "/bin/ps xauww");
+defCmdT("Mounted Filesystems", "/sbin/mount");
+defCmdT("Free Disk Space", "/bin/df -hi");
+defCmdT("Routing tables", "/usr/bin/netstat -nWr");
+defCmdT("Mbuf Usage", "/usr/bin/netstat -mb");
+defCmdT("VMStat", "/usr/bin/vmstat -afimsz");
+defCmdT("Sockets", "/usr/bin/sockstat");
+
+/* Firewall rules and info */
+defCmdT("Generated Ruleset", "/bin/cat {$g['tmp_path']}/rules.debug");
+defCmdT("Generated Ruleset Limiters", "/bin/cat {$g['tmp_path']}/rules.limiter");
+defCmdT("Generated Ruleset Limits", "/bin/cat {$g['tmp_path']}/rules.limits");
+defCmdT("pf NAT Rules", "/sbin/pfctl -vvsn");
+defCmdT("pf Firewall Rules", "/sbin/pfctl -vvsr");
+defCmdT("pf Tables", "/sbin/pfctl -vs Tables");
+defCmdT("pf State Table Contents", "/sbin/pfctl -ss");
+defCmdT("pf Info", "/sbin/pfctl -si");
+defCmdT("pf Show All", "/sbin/pfctl -sa");
+defCmdT("pf Queues", "/sbin/pfctl -s queue -v");
+defCmdT("pf OSFP", "/sbin/pfctl -s osfp");
+defCmdT("pfsync stats", "/usr/bin/netstat -s -ppfsync");
+defCmdT("pftop Default", "/usr/local/sbin/pftop -a -b");
+defCmdT("pftop Long", "/usr/local/sbin/pftop -w 150 -a -b -v long");
+defCmdT("pftop Queue", "/usr/local/sbin/pftop -w 150 -a -b -v queue");
+defCmdT("pftop Rules", "/usr/local/sbin/pftop -w 150 -a -b -v rules");
+defCmdT("pftop Size", "/usr/local/sbin/pftop -w 150 -a -b -v size");
+defCmdT("pftop Speed", "/usr/local/sbin/pftop -w 150 -a -b -v speed");
+if (isset($config['captiveportal']) && is_array($config['captiveportal'])) {
+ foreach ($config['captiveportal'] as $cpZone => $cpdata) {
+ if (isset($cpdata['enable'])) {
+ defCmdT("IPFW rules for {$cpdata['zoneid']}", "/sbin/ipfw -x " . escapeshellarg($cpdata['zoneid']) . " show");
+ }
+ }
+}
+
+/* Configuration Files */
+defCmdT("Contents of /var/run", "/bin/ls /var/run");
+defCmdT("Contents of /conf", "/bin/ls /conf");
+defCmdT("config.xml", "dumpconfigxml");
+defCmdT("resolv.conf", "/bin/cat /etc/resolv.conf");
+defCmdT("DHCP Configuration", "/bin/cat /var/dhcpd/etc/dhcpd.conf");
+defCmdT("DHCPv6 Configuration", "/bin/cat /var/dhcpd/etc/dhcpdv6.conf");
+defCmdT("strongSwan config", "/bin/cat /var/etc/ipsec/strongswan.conf");
+defCmdT("IPsec config", "/bin/cat /var/etc/ipsec/ipsec.conf");
+defCmdT("SPD", "/sbin/setkey -DP");
+defCmdT("SAD", "/sbin/setkey -D");
+if (file_exists("/cf/conf/upgrade_log.txt")) {
+ defCmdT("Upgrade Log", "/bin/cat /cf/conf/upgrade_log.txt");
+}
+if (file_exists("/boot/loader.conf")) {
+ defCmdT("Loader Configuration", "/bin/cat /boot/loader.conf");
+}
+if (file_exists("/boot/loader.conf.local")) {
+ defCmdT("Loader Configuration (Local)", "/bin/cat /boot/loader.conf.local");
+}
+if (file_exists("/var/run/apinger.status")) {
+ defCmdT("Gateway Status", "/bin/cat /var/run/apinger.status");
+}
+if (file_exists("/var/etc/apinger.conf")) {
+ defCmdT("Gateway Monitoring Config", "/bin/cat /var/etc/apinger.conf");
+}
+if (file_exists("/var/etc/filterdns.conf")) {
+ defCmdT("Filter DNS Daemon Config", "/bin/cat /var/etc/filterdns.conf");
+}
+if (isset($config['system']['usefifolog'])) {
+ defCmdT("last 200 system log entries", "/usr/sbin/fifolog_reader /var/log/system.log 2>&1 | tail -n 200");
+ defCmdT("last 50 filter log entries", "/usr/sbin/fifolog_reader /var/log/filter.log 2>&1 | tail -n 50");
+} else {
+ defCmdT("last 200 system log entries", "/usr/local/sbin/clog /var/log/system.log 2>&1 | tail -n 200");
+ defCmdT("last 50 filter log entries", "/usr/local/sbin/clog /var/log/filter.log 2>&1 | tail -n 50");
+}
+if (file_exists("/tmp/PHP_errors.log")) {
+ defCmdT("PHP Error Log", "/bin/cat /tmp/PHP_errors.log");
+}
+defCmdT("System Message Buffer", "/sbin/dmesg -a");
+defCmdT("System Message Buffer (Boot)", "/bin/cat /var/log/dmesg.boot");
+defCmdT("sysctl values", "/sbin/sysctl -a");
+
+exec("/bin/date", $dateOutput, $dateStatus);
+$currentDate = $dateOutput[0];
+
+$pgtitle = array("{$g['product_name']}", "status");
+include("head.inc");
+
+?>
+<style type="text/css">
+/*<![CDATA[*/
+pre {
+ margin: 0px;
+ font-family: courier new, courier;
+ font-weight: normal;
+ font-size: 9pt;
+}
+/*]]>*/
+</style>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<strong><?=$currentDate;?></strong>
+<p><span class="red"><strong><?=gettext("Note: make sure to remove any sensitive information " .
+"(passwords, maybe also IP addresses) before posting " .
+"information from this page in public places (like mailing lists)"); ?>!</strong></span><br />
+<?=gettext("Passwords in config.xml have been automatically removed"); ?>.<br /><br />
+<?=gettext("When the page has finished loading, the output will be stored in {$output_file}. It may be downloaded via scp or "); ?>
+<a href="/exec.php?dlPath=<?= $output_file ?>"><?=gettext("Diagnostics > Command Prompt")?></a>
+
+<div id="cmdspace" style="width:700px">
+<?php listCmds(); ?>
+
+<?php execCmds(); ?>
+</div>
+<br />
+<?=gettext("Saving output to archive...");?>
+<?php
+if (is_dir($output_path)) {
+ mwexec("/usr/bin/tar czpf " . escapeshellarg($output_file) . " -C " . escapeshellarg(dirname($output_path)) . " " . escapeshellarg(basename($output_path)));
+ unlink_if_exists("{$output_path}/*");
+ @rmdir($output_path);
+}
+?>
+<?=gettext("Done.");?>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_captiveportal.php b/src/usr/local/www/status_captiveportal.php
new file mode 100644
index 0000000..d88a452
--- /dev/null
+++ b/src/usr/local/www/status_captiveportal.php
@@ -0,0 +1,260 @@
+<?php
+/* $Id$ */
+/*
+ status_captiveportal.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-status-captiveportal
+##|*NAME=Status: Captive portal page
+##|*DESCR=Allow access to the 'Status: Captive portal' page.
+##|*MATCH=status_captiveportal.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+$pgtitle = array(gettext("Status: Captive portal"));
+$shortcut_section = "captiveportal";
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+if (count($a_cp) == 1) {
+ $cpzone = current(array_keys($a_cp));
+}
+
+/* If the zone does not exist, do not display the invalid zone */
+if (!array_key_exists($cpzone, $a_cp)) {
+ $cpzone = "";
+}
+
+if (isset($cpzone) && !empty($cpzone) && isset($a_cp[$cpzone]['zoneid'])) {
+ $cpzoneid = $a_cp[$cpzone]['zoneid'];
+}
+
+if ($_GET['act'] == "del" && !empty($cpzone) && isset($cpzoneid) && isset($_GET['id'])) {
+ captiveportal_disconnect_client($_GET['id']);
+ header("Location: status_captiveportal.php?zone={$cpzone}");
+ exit;
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php
+
+flush();
+
+function clientcmp($a, $b) {
+ global $order;
+ return strcmp($a[$order], $b[$order]);
+}
+
+if (!empty($cpzone)) {
+ $cpdb = captiveportal_read_db();
+
+ if ($_GET['order']) {
+ if ($_GET['order'] == "ip") {
+ $order = 2;
+ } else if ($_GET['order'] == "mac") {
+ $order = 3;
+ } else if ($_GET['order'] == "user") {
+ $order = 4;
+ } else if ($_GET['order'] == "lastact") {
+ $order = 5;
+ } else {
+ $order = 0;
+ }
+ usort($cpdb, "clientcmp");
+ }
+}
+
+// Load MAC-Manufacturer table
+$mac_man = load_mac_manufacturer_table();
+
+?>
+
+<?php if (!empty($cpzone) && isset($config['voucher'][$cpzone]['enable'])): ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Active Users"), true, "status_captiveportal.php?zone=" . htmlspecialchars($cpzone));
+ $tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone=" . htmlspecialchars($cpzone));
+ $tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone=" . htmlspecialchars($cpzone));
+ $tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone=" . htmlspecialchars($cpzone));
+ $tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone=" . htmlspecialchars($cpzone));
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td class="tabcont">
+<?php endif; ?>
+
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="20%" class="vncell" valign="top">
+ <br /><?=gettext("Captive Portal Zone"); ?><br/><br />
+ </td>
+ <td class="vncell" width="30%" align="center">
+<?php
+ if (count($a_cp) > 1) {
+?>
+ <form action="status_captiveportal.php" method="post" enctype="multipart/form-data" name="form1" id="form1">
+ <select name="zone" class="formselect" onchange="document.form1.submit()">
+ <option value="">none</option>
+<?php
+ foreach ($a_cp as $cpkey => $cp) {
+ echo "<option value=\"" . htmlspecialchars($cpkey) . "\" ";
+ if ($cpzone == $cpkey) {
+ echo "selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($cp['zone']) . "</option>\n";
+ }
+?>
+ </select>
+ <br />
+ </form>
+<?php
+ } else {
+ echo htmlspecialchars($a_cp[$cpzone]['zone']);
+ }
+?>
+ </td>
+ <td colspan="3" width="50%"></td>
+ </tr>
+ <tr>
+ <td colspan="5"><br /></td>
+ </tr>
+<?php
+ if (!empty($cpzone)):
+?>
+ <tr>
+ <td colspan="5" valign="top" class="listtopic"><?=gettext("Captive Portal status");?></td>
+ </tr>
+ <tr>
+ <td class="listhdrr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=ip&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("IP address");?></a></td>
+ <td class="listhdrr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=mac&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("MAC address");?></a></td>
+ <td class="listhdrr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=user&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Username");?></a></td>
+<?php
+ if ($_GET['showact']):
+?>
+ <td class="listhdrr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=start&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Session start");?></a></td>
+ <td class="listhdr"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=lastact&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Last activity");?></a></td>
+<?php
+ else:
+?>
+ <td class="listhdr" colspan="2"><a href="?zone=<?=htmlspecialchars($cpzone)?>&amp;order=start&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Session start");?></a></td>
+<?php
+ endif;
+?>
+ <td class="list sort_ignore"></td>
+ </tr>
+<?php
+ foreach ($cpdb as $cpent):
+?>
+ <tr>
+ <td class="listlr"><?=$cpent[2];?></td>
+ <td class="listr">
+<?php
+ $mac=trim($cpent[3]);
+ if (!empty($mac)) {
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
+ print htmlentities($mac);
+ if (isset($mac_man[$mac_hi])) {
+ print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>";
+ }
+ }
+?>
+ &nbsp;
+ </td>
+ <td class="listr"><?=htmlspecialchars($cpent[4]);?>&nbsp;</td>
+<?php
+ if ($_GET['showact']):
+ $last_act = captiveportal_get_last_activity($cpent[2], $cpent[3]);
+?>
+ <td class="listr"><?=htmlspecialchars(date("m/d/Y H:i:s", $cpent[0]));?></td>
+ <td class="listr"><?php if ($last_act != 0) echo htmlspecialchars(date("m/d/Y H:i:s", $last_act));?></td>
+<?php
+ else:
+?>
+ <td class="listr" colspan="2"><?=htmlspecialchars(date("m/d/Y H:i:s", $cpent[0]));?></td>
+<?php
+ endif;
+?>
+ <td valign="middle" class="list nowrap">
+ <a href="?zone=<?=htmlspecialchars($cpzone);?>&amp;order=<?=$_GET['order'];?>&amp;showact=<?=htmlspecialchars($_GET['showact']);?>&amp;act=del&amp;id=<?=$cpent[5];?>" onclick="return confirm('<?=gettext("Do you really want to disconnect this client?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("Disconnect");?>"></a>
+ </td>
+ </tr>
+<?php
+ endforeach;
+ endif;
+?>
+ </table>
+
+<?php if (!empty($cpzone) && isset($config['voucher'][$cpzone]['enable'])): ?>
+ </td>
+ </tr>
+</table>
+<?php endif; ?>
+
+<form action="status_captiveportal.php" method="get" style="margin: 14px;">
+ <input type="hidden" name="order" value="<?=htmlspecialchars($_GET['order']);?>" />
+<?php if (!empty($cpzone)): ?>
+<?php if ($_GET['showact']): ?>
+ <input type="hidden" name="showact" value="0" />
+ <input type="submit" class="formbtn" value="<?=gettext("Don't show last activity");?>" />
+<?php else: ?>
+ <input type="hidden" name="showact" value="1" />
+ <input type="submit" class="formbtn" value="<?=gettext("Show last activity");?>" />
+<?php endif; ?>
+ <input type="hidden" name="zone" value="<?=htmlspecialchars($cpzone);?>" />
+<?php endif; ?>
+</form>
+<?php include("fend.inc"); ?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/status_captiveportal_expire.php b/src/usr/local/www/status_captiveportal_expire.php
new file mode 100644
index 0000000..7d786b4
--- /dev/null
+++ b/src/usr/local/www/status_captiveportal_expire.php
@@ -0,0 +1,126 @@
+<?php
+/*
+ Copyright (C) 2007 Marcel Wiget <mwiget@mac.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-status-captiveportal-expire
+##|*NAME=Status: Captive portal Expire Vouchers page
+##|*DESCR=Allow access to the 'Status: Captive portal Expire Vouchers' page.
+##|*MATCH=status_captiveportal_expire.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+require_once("voucher.inc");
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone)) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+$pgtitle = array(gettext("Status"), gettext("Captive portal"), gettext("Expire Vouchers"), $a_cp[$cpzone]['zone']);
+
+include("head.inc");
+?>
+<body>
+<?php include("fbegin.inc"); ?>
+
+<form action="status_captiveportal_expire.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Expire Vouchers"), true, "status_captiveportal_expire.php?zone={$cpzone}");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td class="tabcont">
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="content pane">
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Voucher(s)"); ?></td>
+ <td class="vtable">
+ <textarea name="vouchers" cols="65" rows="3" id="vouchers" class="formpre"><?=htmlspecialchars($_POST['vouchers']);?></textarea>
+ <br />
+ <?=gettext("Enter multiple vouchers separated by space or newline. All valid vouchers will be marked as expired"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Submit"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<br/>
+<?php
+if ($_POST) {
+ if ($_POST['vouchers']) {
+ $result = voucher_expire($_POST['vouchers']);
+ echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"4\" width=\"100%\" summary=\"results\">\n";
+ if ($result) {
+ echo "<tr><td bgcolor=\"#D9DEE8\"><img src=\"/themes/{$g['theme']}/images/icons/icon_pass.gif\" alt=\"pass\" /></td>";
+ echo "<td bgcolor=\"#D9DEE8\">Success</td></tr>";
+ } else {
+ echo "<tr><td bgcolor=\"#FFD9D1\"><img src=\"/themes/{$g['theme']}/images/icons/icon_block.gif\" alt=\"block\" /></td>";
+ echo "<td bgcolor=\"#FFD9D1\">Error</td></tr>";
+ }
+ echo "</table>";
+ }
+}
+
+include("fend.inc");
+?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_captiveportal_test.php b/src/usr/local/www/status_captiveportal_test.php
new file mode 100644
index 0000000..2a3dfc3
--- /dev/null
+++ b/src/usr/local/www/status_captiveportal_test.php
@@ -0,0 +1,128 @@
+<?php
+/*
+ status_captiveportal_test.php
+ Copyright (C) 2007 Marcel Wiget <mwiget@mac.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-status-captiveportal-test
+##|*NAME=Status: Captive portal test Vouchers page
+##|*DESCR=Allow access to the 'Status: Captive portal Test Vouchers' page.
+##|*MATCH=status_captiveportal_test.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+require_once("voucher.inc");
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone)) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+$pgtitle = array(gettext("Status"), gettext("Captive portal"), gettext("Test Vouchers"), $a_cp[$cpzone]['zone']);
+$shortcut_section = "captiveportal-vouchers";
+
+include("head.inc");
+?>
+<body>
+<?php include("fbegin.inc"); ?>
+
+<form action="status_captiveportal_test.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Test Vouchers"), true, "status_captiveportal_test.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone={$cpzone}");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="content pane">
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Voucher(s)"); ?></td>
+ <td class="vtable">
+ <textarea name="vouchers" cols="65" rows="3" id="vouchers" class="formpre"><?=htmlspecialchars($_POST['vouchers']);?></textarea>
+ <br />
+ <?=gettext("Enter multiple vouchers separated by space or newline. The remaining time, if valid, will be shown for each voucher"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="zone" type="hidden" value="<?=htmlspecialchars($cpzone);?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Submit"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<br/>
+<?php
+if ($_POST) {
+ if ($_POST['vouchers']) {
+ $test_results = voucher_auth($_POST['vouchers'], 1);
+ echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"4\" width=\"100%\" summary=\"results\">\n";
+ foreach ($test_results as $result) {
+ if (strpos($result, " good ") || strpos($result, " granted ")) {
+ echo "<tr><td bgcolor=\"#D9DEE8\"><img src=\"/themes/{$g['theme']}/images/icons/icon_pass.gif\" alt=\"pass\" /></td>";
+ echo "<td bgcolor=\"#D9DEE8\">$result</td></tr>";
+ } else {
+ echo "<tr><td bgcolor=\"#FFD9D1\"><img src=\"/themes/{$g['theme']}/images/icons/icon_block.gif\" alt=\"block\" /></td>";
+ echo "<td bgcolor=\"#FFD9D1\">$result</td></tr>";
+ }
+ }
+ echo "</table>";
+ }
+}
+
+include("fend.inc");
+?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_captiveportal_voucher_rolls.php b/src/usr/local/www/status_captiveportal_voucher_rolls.php
new file mode 100644
index 0000000..512356b
--- /dev/null
+++ b/src/usr/local/www/status_captiveportal_voucher_rolls.php
@@ -0,0 +1,147 @@
+<?php
+/*
+ status_captiveportal_voucher_rolls.php
+
+ Copyright (C) 2007 Marcel Wiget <mwiget@mac.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-status-captiveportal-voucher-rolls
+##|*NAME=Status: Captive portal Voucher Rolls page
+##|*DESCR=Allow access to the 'Status: Captive portal Voucher Rolls' page.
+##|*MATCH=status_captiveportal_voucher_rolls.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+require_once("voucher.inc");
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone)) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+$pgtitle = array(gettext("Status"), gettext("Captive portal"), gettext("Voucher Rolls"), $a_cp[$cpzone]['zone']);
+$shortcut_section = "captiveportal-vouchers";
+
+if (!is_array($config['voucher'][$cpzone]['roll'])) {
+ $config['voucher'][$cpzone]['roll'] = array();
+}
+$a_roll = &$config['voucher'][$cpzone]['roll'];
+
+include("head.inc");
+?>
+<body>
+<?php include("fbegin.inc"); ?>
+
+<form action="status_captiveportal_voucher_rolls.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Active Vouchers"), false, "status_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Voucher Rolls"), true, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone={$cpzone}");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="content pane">
+ <tr>
+ <td class="listhdrr"><?=gettext("Roll#"); ?></td>
+ <td class="listhdrr"><?=gettext("Minutes/Ticket"); ?></td>
+ <td class="listhdrr"><?=gettext("# of Tickets"); ?></td>
+ <td class="listhdrr"><?=gettext("Comment"); ?></td>
+ <td class="listhdrr"><?=gettext("used"); ?></td>
+ <td class="listhdrr"><?=gettext("active"); ?></td>
+ <td class="listhdr"><?=gettext("ready"); ?></td>
+ </tr>
+ <?php
+ $voucherlck = lock("vouche{$cpzone}r");
+ $i = 0;
+ foreach ($a_roll as $rollent):
+ $used = voucher_used_count($rollent['number']);
+ $active = count(voucher_read_active_db($rollent['number']), $rollent['minutes']);
+ $ready = $rollent['count'] - $used;
+ /* used also count active vouchers, remove them */
+ $used = $used - $active;
+ ?>
+ <tr>
+ <td class="listlr">
+ <?=htmlspecialchars($rollent['number']); ?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($rollent['minutes']);?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($rollent['count']);?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($rollent['comment']); ?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($used); ?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($active); ?>&nbsp;
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($ready); ?>&nbsp;
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ unlock($voucherlck);
+ ?>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_captiveportal_vouchers.php b/src/usr/local/www/status_captiveportal_vouchers.php
new file mode 100644
index 0000000..a7ab959
--- /dev/null
+++ b/src/usr/local/www/status_captiveportal_vouchers.php
@@ -0,0 +1,150 @@
+<?php
+/*
+ status_captiveportal_vouchers.php
+ Copyright (C) 2007 Marcel Wiget <mwiget@mac.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: captiveportal
+*/
+
+##|+PRIV
+##|*IDENT=page-status-captiveportal-vouchers
+##|*NAME=Status: Captive portal Vouchers page
+##|*DESCR=Allow access to the 'Status: Captive portal Vouchers' page.
+##|*MATCH=status_captiveportal_vouchers.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require("captiveportal.inc");
+require_once("voucher.inc");
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (empty($cpzone)) {
+ header("Location: services_captiveportal_zones.php");
+ exit;
+}
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+$pgtitle = array(gettext("Status"), gettext("Captive portal"), gettext("Vouchers"), $a_cp[$cpzone]['zone']);
+$shortcut_section = "captiveportal-vouchers";
+
+function clientcmp($a, $b) {
+ global $order;
+ return strcmp($a[$order], $b[$order]);
+}
+
+if (!is_array($config['voucher'][$cpzone]['roll'])) {
+ $config['voucher'][$cpzone]['roll'] = array();
+}
+$a_roll = $config['voucher'][$cpzone]['roll'];
+
+$db = array();
+
+foreach ($a_roll as $rollent) {
+ $roll = $rollent['number'];
+ $minutes = $rollent['minutes'];
+
+ if (!file_exists("{$g['vardb_path']}/voucher_{$cpzone}_active_$roll.db")) {
+ continue;
+ }
+
+ $active_vouchers = file("{$g['vardb_path']}/voucher_{$cpzone}_active_$roll.db", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ foreach ($active_vouchers as $voucher => $line) {
+ list($voucher, $timestamp, $minutes) = explode(",", $line);
+ $remaining = (($timestamp + 60*$minutes) - time());
+ if ($remaining > 0) {
+ $dbent[0] = $voucher;
+ $dbent[1] = $roll;
+ $dbent[2] = $timestamp;
+ $dbent[3] = intval($remaining/60);
+ $dbent[4] = $timestamp + 60*$minutes; // expires at
+ $db[] = $dbent;
+ }
+ }
+}
+
+if ($_GET['order']) {
+ $order = $_GET['order'];
+ usort($db, "clientcmp");
+}
+
+include("head.inc");
+?>
+<body>
+<?php include("fbegin.inc"); ?>
+
+<form action="status_captiveportal_vouchers.php" method="post" enctype="multipart/form-data" name="iform" id="iform">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="tab pane">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Active Users"), false, "status_captiveportal.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Active Vouchers"), true, "status_captiveportal_vouchers.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Voucher Rolls"), false, "status_captiveportal_voucher_rolls.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Test Vouchers"), false, "status_captiveportal_test.php?zone={$cpzone}");
+ $tab_array[] = array(gettext("Expire Vouchers"), false, "status_captiveportal_expire.php?zone={$cpzone}");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="content pane">
+ <tr>
+ <td class="listhdrr"><a href="?order=0&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Voucher"); ?></a></td>
+ <td class="listhdrr"><a href="?order=1&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Roll"); ?></a></td>
+ <td class="listhdrr"><a href="?order=2&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Activated at"); ?></a></td>
+ <td class="listhdrr"><a href="?order=3&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Expires in"); ?></a></td>
+ <td class="listhdr"><a href="?order=4&amp;showact=<?=htmlspecialchars($_GET['showact']);?>"><?=gettext("Expires at"); ?></a></td>
+ <td class="list"></td>
+ </tr>
+<?php foreach ($db as $dbent): ?>
+ <tr>
+ <td class="listlr"><?=$dbent[0];?></td>
+ <td class="listr"><?=$dbent[1];?></td>
+ <td class="listr"><?=htmlspecialchars(date("m/d/Y H:i:s", $dbent[2]));?></td>
+ <td class="listr"><?=$dbent[3];?> <?=gettext("min"); ?></td>
+ <td class="listr"><?=htmlspecialchars(date("m/d/Y H:i:s", $dbent[4]));?></td>
+ <td class="list"></td>
+ </tr>
+<?php endforeach; ?>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_dhcp_leases.php b/src/usr/local/www/status_dhcp_leases.php
new file mode 100644
index 0000000..4c37f21
--- /dev/null
+++ b/src/usr/local/www/status_dhcp_leases.php
@@ -0,0 +1,457 @@
+<?php
+/* $Id$ */
+/*
+ status_dhcp_leases.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004-2009 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/awk /bin/cat /usr/sbin/arp /usr/bin/wc /usr/bin/grep
+ pfSense_MODULE: dhcpserver
+*/
+
+##|+PRIV
+##|*IDENT=page-status-dhcpleases
+##|*NAME=Status: DHCP leases page
+##|*DESCR=Allow access to the 'Status: DHCP leases' page.
+##|*MATCH=status_dhcp_leases.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("config.inc");
+
+$pgtitle = array(gettext("Status"), gettext("DHCP leases"));
+$shortcut_section = "dhcp";
+
+$leasesfile = "{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases";
+
+if (($_GET['deleteip']) && (is_ipaddr($_GET['deleteip']))) {
+ /* Stop DHCPD */
+ killbyname("dhcpd");
+
+ /* Read existing leases */
+ /* $leases_contents has the lines of the file, including the newline char at the end of each line. */
+ $leases_contents = file($leasesfile);
+ $newleases_contents = array();
+ $i = 0;
+ while ($i < count($leases_contents)) {
+ /* Find the lease(s) we want to delete */
+ if ($leases_contents[$i] == "lease {$_GET['deleteip']} {\n") {
+ /* Skip to the end of the lease declaration */
+ do {
+ $i++;
+ } while ($leases_contents[$i] != "}\n");
+ } else {
+ /* It's a line we want to keep, copy it over. */
+ $newleases_contents[] = $leases_contents[$i];
+ }
+ $i++;
+ }
+
+ /* Write out the new leases file */
+ $fd = fopen($leasesfile, 'w');
+ fwrite($fd, implode("\n", $newleases_contents));
+ fclose($fd);
+
+ /* Restart DHCP Service */
+ services_dhcpd_configure();
+ header("Location: status_dhcp_leases.php?all={$_GET['all']}");
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php
+
+function leasecmp($a, $b) {
+ return strcmp($a[$_GET['order']], $b[$_GET['order']]);
+}
+
+function adjust_gmt($dt) {
+ global $config;
+ $dhcpd = $config['dhcpd'];
+ foreach ($dhcpd as $dhcpditem) {
+ $dhcpleaseinlocaltime = $dhcpditem['dhcpleaseinlocaltime'];
+ if ($dhcpleaseinlocaltime == "yes") {
+ break;
+ }
+ }
+ if ($dhcpleaseinlocaltime == "yes") {
+ $ts = strtotime($dt . " GMT");
+ if ($ts !== false) {
+ return strftime("%Y/%m/%d %I:%M:%S%p", $ts);
+ }
+ }
+ /* If we did not need to convert to local time or the conversion failed, just return the input. */
+ return $dt;
+}
+
+function remove_duplicate($array, $field) {
+ foreach ($array as $sub) {
+ $cmp[] = $sub[$field];
+ }
+ $unique = array_unique(array_reverse($cmp, true));
+ foreach ($unique as $k => $rien) {
+ $new[] = $array[$k];
+ }
+ return $new;
+}
+
+$awk = "/usr/bin/awk";
+/* this pattern sticks comments into a single array item */
+$cleanpattern = "'{ gsub(\"#.*\", \"\");} { gsub(\";\", \"\"); print;}'";
+/* We then split the leases file by } */
+$splitpattern = "'BEGIN { RS=\"}\";} {for (i=1; i<=NF; i++) printf \"%s \", \$i; printf \"}\\n\";}'";
+
+/* stuff the leases file in a proper format into a array by line */
+exec("/bin/cat {$leasesfile} | {$awk} {$cleanpattern} | {$awk} {$splitpattern}", $leases_content);
+$leases_count = count($leases_content);
+exec("/usr/sbin/arp -an", $rawdata);
+$arpdata_ip = array();
+$arpdata_mac = array();
+foreach ($rawdata as $line) {
+ $elements = explode(' ', $line);
+ if ($elements[3] != "(incomplete)") {
+ $arpent = array();
+ $arpdata_ip[] = trim(str_replace(array('(', ')'), '', $elements[1]));
+ $arpdata_mac[] = strtolower(trim($elements[3]));
+ }
+}
+unset($rawdata);
+$pools = array();
+$leases = array();
+$i = 0;
+$l = 0;
+$p = 0;
+
+// Put everything together again
+foreach ($leases_content as $lease) {
+ /* split the line by space */
+ $data = explode(" ", $lease);
+ /* walk the fields */
+ $f = 0;
+ $fcount = count($data);
+ /* with less than 20 fields there is nothing useful */
+ if ($fcount < 20) {
+ $i++;
+ continue;
+ }
+ while ($f < $fcount) {
+ switch ($data[$f]) {
+ case "failover":
+ $pools[$p]['name'] = trim($data[$f+2], '"');
+ $pools[$p]['name'] = "{$pools[$p]['name']} (" . convert_friendly_interface_to_friendly_descr(substr($pools[$p]['name'], 5)) . ")";
+ $pools[$p]['mystate'] = $data[$f+7];
+ $pools[$p]['peerstate'] = $data[$f+14];
+ $pools[$p]['mydate'] = $data[$f+10];
+ $pools[$p]['mydate'] .= " " . $data[$f+11];
+ $pools[$p]['peerdate'] = $data[$f+17];
+ $pools[$p]['peerdate'] .= " " . $data[$f+18];
+ $p++;
+ $i++;
+ continue 3;
+ case "lease":
+ $leases[$l]['ip'] = $data[$f+1];
+ $leases[$l]['type'] = "dynamic";
+ $f = $f+2;
+ break;
+ case "starts":
+ $leases[$l]['start'] = $data[$f+2];
+ $leases[$l]['start'] .= " " . $data[$f+3];
+ $f = $f+3;
+ break;
+ case "ends":
+ if ($data[$f+1] == "never") {
+ // Quote from dhcpd.leases(5) man page:
+ // If a lease will never expire, date is never instead of an actual date.
+ $leases[$l]['end'] = gettext("Never");
+ $f = $f+1;
+ } else {
+ $leases[$l]['end'] = $data[$f+2];
+ $leases[$l]['end'] .= " " . $data[$f+3];
+ $f = $f+3;
+ }
+ break;
+ case "tstp":
+ $f = $f+3;
+ break;
+ case "tsfp":
+ $f = $f+3;
+ break;
+ case "atsfp":
+ $f = $f+3;
+ break;
+ case "cltt":
+ $f = $f+3;
+ break;
+ case "binding":
+ switch ($data[$f+2]) {
+ case "active":
+ $leases[$l]['act'] = "active";
+ break;
+ case "free":
+ $leases[$l]['act'] = "expired";
+ $leases[$l]['online'] = "offline";
+ break;
+ case "backup":
+ $leases[$l]['act'] = "reserved";
+ $leases[$l]['online'] = "offline";
+ break;
+ }
+ $f = $f+1;
+ break;
+ case "next":
+ /* skip the next binding statement */
+ $f = $f+3;
+ break;
+ case "rewind":
+ /* skip the rewind binding statement */
+ $f = $f+3;
+ break;
+ case "hardware":
+ $leases[$l]['mac'] = $data[$f+2];
+ /* check if it's online and the lease is active */
+ if (in_array($leases[$l]['ip'], $arpdata_ip)) {
+ $leases[$l]['online'] = 'online';
+ } else {
+ $leases[$l]['online'] = 'offline';
+ }
+ $f = $f+2;
+ break;
+ case "client-hostname":
+ if ($data[$f+1] <> "") {
+ $leases[$l]['hostname'] = preg_replace('/"/', '', $data[$f+1]);
+ } else {
+ $hostname = gethostbyaddr($leases[$l]['ip']);
+ if ($hostname <> "") {
+ $leases[$l]['hostname'] = $hostname;
+ }
+ }
+ $f = $f+1;
+ break;
+ case "uid":
+ $f = $f+1;
+ break;
+ }
+ $f++;
+ }
+ $l++;
+ $i++;
+ /* slowly chisel away at the source array */
+ array_shift($leases_content);
+}
+/* remove the old array */
+unset($lease_content);
+
+/* remove duplicate items by mac address */
+if (count($leases) > 0) {
+ $leases = remove_duplicate($leases, "ip");
+}
+
+if (count($pools) > 0) {
+ $pools = remove_duplicate($pools, "name");
+ asort($pools);
+}
+
+foreach ($config['interfaces'] as $ifname => $ifarr) {
+ if (is_array($config['dhcpd'][$ifname]) &&
+ is_array($config['dhcpd'][$ifname]['staticmap'])) {
+ $staticmap_array_index = 0;
+ foreach ($config['dhcpd'][$ifname]['staticmap'] as $static) {
+ $slease = array();
+ $slease['ip'] = $static['ipaddr'];
+ $slease['type'] = "static";
+ $slease['mac'] = $static['mac'];
+ $slease['if'] = $ifname;
+ $slease['start'] = "";
+ $slease['end'] = "";
+ $slease['hostname'] = htmlentities($static['hostname']);
+ $slease['act'] = "static";
+ $slease['online'] = in_array(strtolower($slease['mac']), $arpdata_mac) ? 'online' : 'offline';
+ $slease['staticmap_array_index'] = $staticmap_array_index;
+ $leases[] = $slease;
+ $staticmap_array_index++;
+ }
+ }
+}
+
+if ($_GET['order']) {
+ usort($leases, "leasecmp");
+}
+
+/* only print pool status when we have one */
+if (count($pools) > 0) {
+?>
+<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp leases">
+ <tr>
+ <td class="listhdrr"><?=gettext("Failover Group"); ?></a></td>
+ <td class="listhdrr"><?=gettext("My State"); ?></a></td>
+ <td class="listhdrr"><?=gettext("Since"); ?></a></td>
+ <td class="listhdrr"><?=gettext("Peer State"); ?></a></td>
+ <td class="listhdrr"><?=gettext("Since"); ?></a></td>
+ </tr>
+<?php
+ foreach ($pools as $data) {
+ echo "<tr>\n";
+ echo "<td class=\"listlr\">{$fspans}{$data['name']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['mystate']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['mydate']) . "{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['peerstate']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['peerdate']) . "{$fspane}</td>\n";
+ echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
+ echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
+ echo "</tr>\n";
+ }
+?>
+</table>
+
+<?php
+/* only print pool status when we have one */
+}
+?>
+
+<br/>
+
+<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp leases">
+ <tr>
+ <td class="listhdrr"><a href="#"><?=gettext("IP address"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("MAC address"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("Hostname"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("Start"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("End"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("Online"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("Lease Type"); ?></a></td>
+ </tr>
+<?php
+// Load MAC-Manufacturer table
+$mac_man = load_mac_manufacturer_table();
+foreach ($leases as $data) {
+ if (($data['act'] == "active") || ($data['act'] == "static" && !empty($data['ip'])) || ($_GET['all'] == 1)) {
+ if ($data['act'] != "active" && $data['act'] != "static") {
+ $fspans = "<span class=\"gray\">";
+ $fspane = "&nbsp;</span>";
+ } else {
+ $fspans = "";
+ $fspane = "&nbsp;";
+ }
+ $lip = ip2ulong($data['ip']);
+ if ($data['act'] != "static") {
+ foreach ($config['dhcpd'] as $dhcpif => $dhcpifconf) {
+ if (!is_array($dhcpifconf['range'])) {
+ continue;
+ }
+ if (($lip >= ip2ulong($dhcpifconf['range']['from'])) && ($lip <= ip2ulong($dhcpifconf['range']['to']))) {
+ $data['if'] = $dhcpif;
+ break;
+ }
+ // Check if the IP is in the range of any DHCP pools
+ if (is_array($dhcpifconf['pool'])) {
+ foreach ($dhcpifconf['pool'] as $dhcppool) {
+ if (is_array($dhcppool['range'])) {
+ if (($lip >= ip2ulong($dhcppool['range']['from'])) && ($lip <= ip2ulong($dhcppool['range']['to']))) {
+ $data['if'] = $dhcpif;
+ break 2;
+ }
+ }
+ }
+ }
+ }
+ }
+ echo "<tr>\n";
+ echo "<td class=\"listlr\">{$fspans}{$data['ip']}{$fspane}</td>\n";
+ $mac=$data['mac'];
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
+ if ($data['online'] != "online") {
+ if (isset($mac_man[$mac_hi])) { // Manufacturer for this MAC is defined
+ echo "<td class=\"listr\">{$fspans}<a href=\"services_wol.php?if={$data['if']}&amp;mac=$mac\" title=\"" . gettext("$mac - send Wake on LAN packet to this MAC address") ."\">{$mac}</a><br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>{$fspane}</td>\n";
+ } else {
+ echo "<td class=\"listr\">{$fspans}<a href=\"services_wol.php?if={$data['if']}&amp;mac={$data['mac']}\" title=\"" . gettext("send Wake on LAN packet to this MAC address") ."\">{$data['mac']}</a>{$fspane}</td>\n";
+ }
+ } else {
+ if (isset($mac_man[$mac_hi])) { // Manufacturer for this MAC is defined
+ echo "<td class=\"listr\">{$fspans}{$mac}<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>{$fspane}</td>\n";
+ } else {
+ echo "<td class=\"listr\">{$fspans}{$data['mac']}{$fspane}</td>\n";
+ }
+ }
+ echo "<td class=\"listr\">{$fspans}" . htmlentities($data['hostname']) . "{$fspane}</td>\n";
+ if ($data['type'] != "static") {
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['start']) . "{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['end']) . "{$fspane}</td>\n";
+ } else {
+ echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
+ }
+ echo "<td class=\"listr\">{$fspans}{$data['online']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['act']}{$fspane}</td>\n";
+ echo "<td valign=\"middle\">&nbsp;";
+ if ($data['type'] == "dynamic") {
+ echo "<a href=\"services_dhcp_edit.php?if={$data['if']}&amp;mac={$data['mac']}&amp;hostname={$data['hostname']}\">";
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("add a static mapping for this MAC address") ."\" alt=\"add\" /></a>&nbsp;\n";
+ } else {
+ echo "<a href=\"services_dhcp_edit.php?if={$data['if']}&amp;id={$data['staticmap_array_index']}\">";
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_e.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("edit the static mapping for this entry") ."\" alt=\"add\" />&nbsp;\n";
+ }
+
+ echo "<a href=\"services_wol_edit.php?if={$data['if']}&amp;mac={$data['mac']}&amp;descr={$data['hostname']}\">";
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_wol_all.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("add a Wake on LAN mapping for this MAC address") ."\" alt=\"add\" /></a>&nbsp;\n";
+
+ /* Only show the button for offline dynamic leases */
+ if (($data['type'] == "dynamic") && ($data['online'] != "online")) {
+ echo "<a href=\"status_dhcp_leases.php?deleteip={$data['ip']}&amp;all=" . htmlspecialchars($_GET['all']) . "\">";
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_x.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("delete this DHCP lease") . "\" alt=\"delete\" /></a>&nbsp;\n";
+ }
+ echo "</td></tr>\n";
+ }
+}
+
+?>
+</table>
+<br/>
+<form action="status_dhcp_leases.php" method="get">
+ <input type="hidden" name="order" value="<?=htmlspecialchars($_GET['order']);?>" />
+<?php if ($_GET['all']): ?>
+ <input type="hidden" name="all" value="0" />
+ <input type="submit" class="formbtn" value="<?=gettext("Show active and static leases only"); ?>" />
+<?php else: ?>
+ <input type="hidden" name="all" value="1" />
+ <input type="submit" class="formbtn" value="<?=gettext("Show all configured leases"); ?>" />
+<?php endif; ?>
+</form>
+<?php if ($leases == 0): ?>
+<p><strong><?=gettext("No leases file found. Is the DHCP server active"); ?>?</strong></p>
+<?php endif; ?>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_dhcpv6_leases.php b/src/usr/local/www/status_dhcpv6_leases.php
new file mode 100644
index 0000000..63f1946
--- /dev/null
+++ b/src/usr/local/www/status_dhcpv6_leases.php
@@ -0,0 +1,581 @@
+<?php
+/* $Id$ */
+/*
+ status_dhcpv6_leases.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2011 Seth Mos
+ Copyright (C) 2004-2009 Scott Ullrich
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/awk /bin/cat /usr/sbin/ndp /usr/bin/wc /usr/bin/grep
+ pfSense_MODULE: dhcpserver
+*/
+
+##|+PRIV
+##|*IDENT=page-status-dhcpv6leases
+##|*NAME=Status: DHCPv6 leases page
+##|*DESCR=Allow access to the 'Status: DHCPv6 leases' page.
+##|*MATCH=status_dhcpv6_leases.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("config.inc");
+
+$pgtitle = array(gettext("Status"), gettext("DHCPv6 leases"));
+$shortcut_section = "dhcp6";
+
+$leasesfile = "{$g['dhcpd_chroot_path']}/var/db/dhcpd6.leases";
+
+if (($_GET['deleteip']) && (is_ipaddr($_GET['deleteip']))) {
+ /* Stop DHCPD */
+ killbyname("dhcpd");
+
+ /* Read existing leases */
+ $leases_contents = explode("\n", file_get_contents($leasesfile));
+ $newleases_contents = array();
+ $i = 0;
+ while ($i < count($leases_contents)) {
+ /* Find the lease(s) we want to delete */
+ if ($leases_contents[$i] == " iaaddr {$_GET['deleteip']} {") {
+ /* The iaaddr line is two lines down from the start of the lease, so remove those two lines. */
+ array_pop($newleases_contents);
+ array_pop($newleases_contents);
+ /* Skip to the end of the lease declaration */
+ do {
+ $i++;
+ } while ($leases_contents[$i] != "}");
+ } else {
+ /* It's a line we want to keep, copy it over. */
+ $newleases_contents[] = $leases_contents[$i];
+ }
+ $i++;
+ }
+
+ /* Write out the new leases file */
+ $fd = fopen($leasesfile, 'w');
+ fwrite($fd, implode("\n", $newleases_contents));
+ fclose($fd);
+
+ /* Restart DHCP Service */
+ services_dhcpd_configure();
+ header("Location: status_dhcpv6_leases.php?all={$_GET['all']}");
+}
+
+// Load MAC-Manufacturer table
+$mac_man = load_mac_manufacturer_table();
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php
+
+function leasecmp($a, $b) {
+ return strcmp($a[$_GET['order']], $b[$_GET['order']]);
+}
+
+function adjust_gmt($dt) {
+ global $config;
+
+ $dhcpv6leaseinlocaltime == "no";
+ if (is_array($config['dhcpdv6'])) {
+ $dhcpdv6 = $config['dhcpdv6'];
+ foreach ($dhcpdv6 as $dhcpv6leaseinlocaltime) {
+ $dhcpv6leaseinlocaltime = $dhcpv6leaseinlocaltime['dhcpv6leaseinlocaltime'];
+ if ($dhcpv6leaseinlocaltime == "yes") {
+ break;
+ }
+ }
+ }
+
+ $timezone = $config['system']['timezone'];
+ $ts = strtotime($dt . " GMT");
+ if ($dhcpv6leaseinlocaltime == "yes") {
+ $this_tz = new DateTimeZone($timezone);
+ $dhcp_lt = new DateTime(strftime("%I:%M:%S%p", $ts), $this_tz);
+ $offset = $this_tz->getOffset($dhcp_lt);
+ $ts = $ts + $offset;
+ return strftime("%Y/%m/%d %I:%M:%S%p", $ts);
+ } else {
+ return strftime("%Y/%m/%d %H:%M:%S", $ts);
+ }
+}
+
+function remove_duplicate($array, $field) {
+ foreach ($array as $sub) {
+ $cmp[] = $sub[$field];
+ }
+ $unique = array_unique(array_reverse($cmp, true));
+ foreach ($unique as $k => $rien) {
+ $new[] = $array[$k];
+ }
+ return $new;
+}
+
+function parse_duid($duid_string) {
+ $parsed_duid = array();
+ for ($i = 0; $i < strlen($duid_string); $i++) {
+ $s = substr($duid_string, $i, 1);
+ if ($s == '\\') {
+ $n = substr($duid_string, $i+1, 1);
+ if (($n == '\\') || ($n == '"')) {
+ $parsed_duid[] = sprintf("%02x", ord($n));
+ } elseif (is_numeric($n)) {
+ $parsed_duid[] = sprintf("%02x", octdec(substr($duid_string, $i+1, 3)));
+ $i += 3;
+ }
+ } else {
+ $parsed_duid[] = sprintf("%02x", ord($s));
+ }
+ }
+ $iaid = array_slice($parsed_duid, 0, 4);
+ $duid = array_slice($parsed_duid, 4);
+ return array($iaid, $duid);
+}
+
+$awk = "/usr/bin/awk";
+
+/* this pattern sticks comments into a single array item */
+$cleanpattern = "'{ gsub(\"^#.*\", \"\");} { gsub(\"^server-duid.*\", \"\");} { gsub(\";$\", \"\"); print;}'";
+/* We then split the leases file by } */
+$splitpattern = "'BEGIN { RS=\"}\";} {for (i=1; i<=NF; i++) printf \"%s \", \$i; printf \"}\\n\";}'";
+
+/* stuff the leases file in a proper format into a array by line */
+exec("/bin/cat {$leasesfile} | {$awk} {$cleanpattern} | {$awk} {$splitpattern} | /usr/bin/grep '^ia-.. '", $leases_content);
+$leases_count = count($leases_content);
+exec("/usr/sbin/ndp -an", $rawdata);
+$ndpdata = array();
+foreach ($rawdata as $line) {
+ $elements = preg_split('/\s+/ ', $line);
+ if ($elements[1] != "(incomplete)") {
+ $ndpent = array();
+ $ip = trim(str_replace(array('(', ')'), '', $elements[0]));
+ $ndpent['mac'] = trim($elements[1]);
+ $ndpent['interface'] = trim($elements[2]);
+ $ndpdata[$ip] = $ndpent;
+ }
+}
+
+$pools = array();
+$leases = array();
+$prefixes = array();
+$mappings = array();
+$i = 0;
+$l = 0;
+$p = 0;
+
+// Put everything together again
+while ($i < $leases_count) {
+ $entry = array();
+ /* split the line by space */
+ $duid_split = array();
+ preg_match('/ia-.. "(.*)" { (.*)/ ', $leases_content[$i], $duid_split);
+ if (!empty($duid_split[1])) {
+ $iaid_duid = parse_duid($duid_split[1]);
+ $entry['iaid'] = hexdec(implode("", array_reverse($iaid_duid[0])));
+ $entry['duid'] = implode(":", $iaid_duid[1]);
+ $data = explode(" ", $duid_split[2]);
+ } else {
+ $data = explode(" ", $leases_content[$i]);
+ }
+ /* walk the fields */
+ $f = 0;
+ $fcount = count($data);
+ /* with less then 12 fields there is nothing useful */
+ if ($fcount < 12) {
+ $i++;
+ continue;
+ }
+ while ($f < $fcount) {
+ switch ($data[$f]) {
+ case "failover":
+ $pools[$p]['name'] = $data[$f+2];
+ $pools[$p]['mystate'] = $data[$f+7];
+ $pools[$p]['peerstate'] = $data[$f+14];
+ $pools[$p]['mydate'] = $data[$f+10];
+ $pools[$p]['mydate'] .= " " . $data[$f+11];
+ $pools[$p]['peerdate'] = $data[$f+17];
+ $pools[$p]['peerdate'] .= " " . $data[$f+18];
+ $p++;
+ $i++;
+ continue 3;
+ case "ia-pd":
+ $is_prefix = true;
+ case "ia-na":
+ $entry['iaid'] = $tmp_iaid;
+ $entry['duid'] = $tmp_duid;
+ if ($data[$f+1][0] == '"') {
+ $duid = "";
+ /* FIXME: This needs a safety belt to prevent an infinite loop */
+ while ($data[$f][strlen($data[$f])-1] != '"') {
+ $duid .= " " . $data[$f+1];
+ $f++;
+ }
+ $entry['duid'] = $duid;
+ } else {
+ $entry['duid'] = $data[$f+1];
+ }
+ $entry['type'] = "dynamic";
+ $f = $f+2;
+ break;
+ case "iaaddr":
+ $entry['ip'] = $data[$f+1];
+ $entry['type'] = "dynamic";
+ if (in_array($entry['ip'], array_keys($ndpdata))) {
+ $entry['online'] = 'online';
+ } else {
+ $entry['online'] = 'offline';
+ }
+ $f = $f+2;
+ break;
+ case "iaprefix":
+ $is_prefix = true;
+ $entry['prefix'] = $data[$f+1];
+ $entry['type'] = "dynamic";
+ $f = $f+2;
+ break;
+ case "starts":
+ $entry['start'] = $data[$f+2];
+ $entry['start'] .= " " . $data[$f+3];
+ $f = $f+3;
+ break;
+ case "ends":
+ $entry['end'] = $data[$f+2];
+ $entry['end'] .= " " . $data[$f+3];
+ $f = $f+3;
+ break;
+ case "tstp":
+ $f = $f+3;
+ break;
+ case "tsfp":
+ $f = $f+3;
+ break;
+ case "atsfp":
+ $f = $f+3;
+ break;
+ case "cltt":
+ $entry['start'] = $data[$f+2];
+ $entry['start'] .= " " . $data[$f+3];
+ $f = $f+3;
+ break;
+ case "binding":
+ switch ($data[$f+2]) {
+ case "active":
+ $entry['act'] = "active";
+ break;
+ case "free":
+ $entry['act'] = "expired";
+ $entry['online'] = "offline";
+ break;
+ case "backup":
+ $entry['act'] = "reserved";
+ $entry['online'] = "offline";
+ break;
+ case "released":
+ $entry['act'] = "released";
+ $entry['online'] = "offline";
+ }
+ $f = $f+1;
+ break;
+ case "next":
+ /* skip the next binding statement */
+ $f = $f+3;
+ break;
+ case "hardware":
+ $f = $f+2;
+ break;
+ case "client-hostname":
+ if ($data[$f+1] <> "") {
+ $entry['hostname'] = preg_replace('/"/', '', $data[$f+1]);
+ } else {
+ $hostname = gethostbyaddr($entry['ip']);
+ if ($hostname <> "") {
+ $entry['hostname'] = $hostname;
+ }
+ }
+ $f = $f+1;
+ break;
+ case "uid":
+ $f = $f+1;
+ break;
+ }
+ $f++;
+ }
+ if ($is_prefix) {
+ $prefixes[] = $entry;
+ } else {
+ $leases[] = $entry;
+ $mappings[$entry['iaid'] . $entry['duid']] = $entry['ip'];
+ }
+ $l++;
+ $i++;
+ $is_prefix = false;
+}
+
+if (count($leases) > 0) {
+ $leases = remove_duplicate($leases, "ip");
+}
+
+if (count($prefixes) > 0) {
+ $prefixes = remove_duplicate($prefixes, "prefix");
+}
+
+if (count($pools) > 0) {
+ $pools = remove_duplicate($pools, "name");
+ asort($pools);
+}
+
+foreach ($config['interfaces'] as $ifname => $ifarr) {
+ if (is_array($config['dhcpdv6'][$ifname]) &&
+ is_array($config['dhcpdv6'][$ifname]['staticmap'])) {
+ foreach ($config['dhcpdv6'][$ifname]['staticmap'] as $static) {
+ $slease = array();
+ $slease['ip'] = $static['ipaddrv6'];
+ $slease['type'] = "static";
+ $slease['duid'] = $static['duid'];
+ $slease['start'] = "";
+ $slease['end'] = "";
+ $slease['hostname'] = htmlentities($static['hostname']);
+ $slease['act'] = "static";
+ if (in_array($slease['ip'], array_keys($ndpdata))) {
+ $slease['online'] = 'online';
+ } else {
+ $slease['online'] = 'offline';
+ }
+
+ $leases[] = $slease;
+ }
+ }
+}
+
+if ($_GET['order']) {
+ usort($leases, "leasecmp");
+}
+
+/* only print pool status when we have one */
+if (count($pools) > 0) {
+?>
+<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp leases">
+ <tr>
+ <td class="listhdrr"><?=gettext("Failover Group"); ?></a></td>
+ <td class="listhdrr"><?=gettext("My State"); ?></a></td>
+ <td class="listhdrr"><?=gettext("Since"); ?></a></td>
+ <td class="listhdrr"><?=gettext("Peer State"); ?></a></td>
+ <td class="listhdrr"><?=gettext("Since"); ?></a></td>
+ </tr>
+<?php
+ foreach ($pools as $data) {
+ echo "<tr>\n";
+ echo "<td class=\"listlr\">{$fspans}{$data['name']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['mystate']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['mydate']) . "{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['peerstate']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['peerdate']) . "{$fspane}</td>\n";
+ echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
+ echo "<td class=\"list\" valign=\"middle\" width=\"17\">&nbsp;</td>\n";
+ echo "</tr>\n";
+ }
+?>
+</table>
+
+<?php
+/* only print pool status when we have one */
+}
+?>
+
+<br/>
+
+<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="dhcp leases">
+ <tr>
+ <td class="listhdrr"><a href="#"><?=gettext("IPv6 address"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("IAID"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("DUID"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("Hostname/MAC"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("Start"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("End"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("Online"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("Lease Type"); ?></a></td>
+ </tr>
+<?php
+foreach ($leases as $data) {
+ if (($data['act'] == "active") || ($data['act'] == "static") || ($_GET['all'] == 1)) {
+ if ($data['act'] != "active" && $data['act'] != "static") {
+ $fspans = "<span class=\"gray\">";
+ $fspane = "&nbsp;</span>";
+ } else {
+ $fspans = "";
+ $fspane = "&nbsp;";
+ }
+
+ if ($data['act'] == "static") {
+ foreach ($config['dhcpdv6'] as $dhcpif => $dhcpifconf) {
+ if (is_array($dhcpifconf['staticmap'])) {
+ foreach ($dhcpifconf['staticmap'] as $staticent) {
+ if ($data['ip'] == $staticent['ipaddr']) {
+ $data['if'] = $dhcpif;
+ break;
+ }
+ }
+ }
+ /* exit as soon as we have an interface */
+ if ($data['if'] != "") {
+ break;
+ }
+ }
+ } else {
+ $data['if'] = convert_real_interface_to_friendly_interface_name(guess_interface_from_ip($data['ip']));
+ }
+ echo "<tr>\n";
+ echo "<td class=\"listlr\">{$fspans}{$data['ip']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['iaid']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['duid']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}";
+ if (!empty($data['hostname'])) {
+ echo htmlentities($data['hostname']) . "<br />";
+ }
+
+ $mac=trim($ndpdata[$data['ip']]['mac']);
+ if (!empty($mac)) {
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
+ print htmlentities($mac);
+ if (isset($mac_man[$mac_hi])) {
+ print "<br /><font size=\"-2\"><i>{$mac_man[$mac_hi]}</i></font>";
+ }
+ }
+
+ echo "{$fspane}&nbsp;</td>\n";
+ if ($data['type'] != "static") {
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['start']) . "{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['end']) . "{$fspane}</td>\n";
+ } else {
+ echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
+ }
+ echo "<td class=\"listr\">{$fspans}{$data['online']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['act']}{$fspane}</td>\n";
+
+ if ($data['type'] == "dynamic") {
+ echo "<td valign=\"middle\"><a href=\"services_dhcpv6_edit.php?if={$data['if']}&amp;duid={$data['duid']}&amp;hostname={$data['hostname']}\">";
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_plus.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("add a static mapping for this MAC address") ."\" alt=\"add\" /></a></td>\n";
+ } else {
+ echo "<td class=\"list\" valign=\"middle\">";
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_plus_mo.gif\" width=\"17\" height=\"17\" border=\"0\" alt=\"add\" /></td>\n";
+ }
+
+ /* Only show the button for offline dynamic leases */
+ if (($data['type'] == "dynamic") && ($data['online'] != "online")) {
+ echo "<td class=\"list\" valign=\"middle\"><a href=\"status_dhcpv6_leases.php?deleteip={$data['ip']}&amp;all=" . htmlspecialchars($_GET['all']) . "\">";
+ echo "<img src=\"/themes/{$g['theme']}/images/icons/icon_x.gif\" width=\"17\" height=\"17\" border=\"0\" title=\"" . gettext("delete this DHCP lease") . "\" alt=\"delete\" /></a></td>\n";
+ }
+ echo "</tr>\n";
+ }
+}
+?>
+</table>
+<br/>
+<h3>Delegated Prefixes</h3>
+<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="prefixes">
+ <tr>
+ <td class="listhdrr"><a href="#"><?=gettext("IPv6 Prefix"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("IAID"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("DUID"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("Start"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("End"); ?></a></td>
+ <td class="listhdrr"><a href="#"><?=gettext("State"); ?></a></td>
+ </tr>
+<?php
+foreach ($prefixes as $data) {
+ if (($data['act'] == "active") || ($data['act'] == "static") || ($_GET['all'] == 1)) {
+ if ($data['act'] != "active" && $data['act'] != "static") {
+ $fspans = "<span class=\"gray\">";
+ $fspane = "&nbsp;</span>";
+ } else {
+ $fspans = "";
+ $fspane = "&nbsp;";
+ }
+
+ if ($data['act'] == "static") {
+ foreach ($config['dhcpdv6'] as $dhcpif => $dhcpifconf) {
+ if (is_array($dhcpifconf['staticmap'])) {
+ foreach ($dhcpifconf['staticmap'] as $staticent) {
+ if ($data['ip'] == $staticent['ipaddr']) {
+ $data['if'] = $dhcpif;
+ break;
+ }
+ }
+ }
+ /* exit as soon as we have an interface */
+ if ($data['if'] != "") {
+ break;
+ }
+ }
+ } else {
+ $data['if'] = convert_real_interface_to_friendly_interface_name(guess_interface_from_ip($data['ip']));
+ }
+ echo "<tr>\n";
+ if ($mappings[$data['iaid'] . $data['duid']]) {
+ $dip = "<br />Routed To: {$mappings[$data['iaid'] . $data['duid']]}";
+ }
+ echo "<td class=\"listlr\">{$fspans}{$data['prefix']}{$dip}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['iaid']}{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}{$data['duid']}{$fspane}</td>\n";
+ if ($data['type'] != "static") {
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['start']) . "{$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans}" . adjust_gmt($data['end']) . "{$fspane}</td>\n";
+ } else {
+ echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
+ echo "<td class=\"listr\">{$fspans} n/a {$fspane}</td>\n";
+ }
+ echo "<td class=\"listr\">{$fspans}{$data['act']}{$fspane}</td>\n";
+ echo "</tr>\n";
+ }
+}
+?>
+</table>
+<br/>
+<form action="status_dhcpv6_leases.php" method="get">
+ <input type="hidden" name="order" value="<?=htmlspecialchars($_GET['order']);?>" />
+<?php if ($_GET['all']): ?>
+ <input type="hidden" name="all" value="0" />
+ <input type="submit" class="formbtn" value="<?=gettext("Show active and static leases only"); ?>" />
+<?php else: ?>
+ <input type="hidden" name="all" value="1" />
+ <input type="submit" class="formbtn" value="<?=gettext("Show all configured leases"); ?>" />
+<?php endif; ?>
+</form>
+<?php if ($leases == 0): ?>
+<p><strong><?=gettext("No leases file found. Is the DHCP server active"); ?>?</strong></p>
+<?php endif; ?>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_filter_reload.php b/src/usr/local/www/status_filter_reload.php
new file mode 100644
index 0000000..8844a48
--- /dev/null
+++ b/src/usr/local/www/status_filter_reload.php
@@ -0,0 +1,179 @@
+<?php
+/* $Id$ */
+/*
+ status_filter_reload.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2006 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: filter
+*/
+
+##|+PRIV
+##|*IDENT=page-status-filterreloadstatus
+##|*NAME=Status: Filter Reload Status page
+##|*DESCR=Allow access to the 'Status: Filter Reload Status' page.
+##|*MATCH=status_filter_reload.php*
+##|-PRIV
+
+require_once("globals.inc");
+require_once("guiconfig.inc");
+require_once("functions.inc");
+
+$pgtitle = array(gettext("Status"), gettext("Filter Reload Status"));
+$shortcut_section = "firewall";
+
+if (file_exists("{$g['varrun_path']}/filter_reload_status")) {
+ $status = file_get_contents("{$g['varrun_path']}/filter_reload_status");
+}
+
+if ($_GET['getstatus']) {
+ echo "|{$status}|";
+ exit;
+}
+if ($_POST['reloadfilter']) {
+ send_event("filter reload");
+ header("Location: status_filter_reload.php");
+ exit;
+}
+if ($_POST['syncfilter']) {
+ send_event("filter sync");
+ header("Location: status_filter_reload.php");
+ exit;
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+<br />
+<form action="status_filter_reload.php" method="post" name="filter">
+ <input type="submit" value="Reload Filter" name="reloadfilter" id="reloadfilter" />
+<?php if ($config['hasync'] && $config['hasync']["synchronizetoip"] != ""): ?>
+ &nbsp;&nbsp;&nbsp;&nbsp;
+ <input type="submit" value="Force Config Sync" name="syncfilter" id="syncfilter" />
+<?php endif; ?>
+</form>
+<br /><br /><br />
+<div id="status" style="padding:5px; border:1px dashed #990000; background-color: #ffffff; color: #000000;">
+ <?php echo $status; ?>
+</div>
+
+<div id="doneurl">
+</div>
+
+<br/>
+
+<div id="reloadinfo"><?=gettext("This page will automatically refresh every 3 seconds until the filter is done reloading"); ?>.</div>
+
+<script type="text/javascript">
+//<![CDATA[
+/* init update "thread */
+function update_status_thread() {
+ getURL('status_filter_reload.php?getstatus=true', update_data);
+}
+function update_data(obj) {
+ var result_text = obj.content;
+ var result_text_split = result_text.split("|");
+ result_text = result_text_split[1];
+ result_text = result_text.replace("\n", "");
+ result_text = result_text.replace("\r", "");
+ if (result_text) {
+ jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> ' + result_text + '...');
+ } else {
+ jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> Obtaining filter status...');
+ }
+ if (result_text == "Initializing") {
+ jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif" alt="loader" /> Initializing...');
+ } else if (result_text == "Done") {
+ jQuery('#status').effect('highlight');
+ jQuery('#status').html('Done. The filter rules have been reloaded.');
+ jQuery('#reloadinfo').css("visibility", "hidden");
+ jQuery('#doneurl').css("visibility", "visible");
+ jQuery('#doneurl').html("<p><a href='status_queues.php'>Queue Status<\/a><\/p>");
+ }
+ window.setTimeout('update_status_thread()', 2500);
+}
+//]]>
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+/*
+ * getURL is a proprietary Adobe function, but it's simplicity has made it very
+ * popular. If getURL is undefined we spin our own by wrapping XMLHttpRequest.
+ */
+if (typeof getURL == 'undefined') {
+ getURL = function(url, callback) {
+ if (!url) {
+ throw 'No URL for getURL';
+ }
+
+ try {
+ if (typeof callback.operationComplete == 'function') {
+ callback = callback.operationComplete;
+ }
+ } catch (e) {}
+ if (typeof callback != 'function') {
+ throw 'No callback function for getURL';
+ }
+
+ var http_request = null;
+ if (typeof XMLHttpRequest != 'undefined') {
+ http_request = new XMLHttpRequest();
+ } else if (typeof ActiveXObject != 'undefined') {
+ try {
+ http_request = new ActiveXObject('Msxml2.XMLHTTP');
+ } catch (e) {
+ try {
+ http_request = new ActiveXObject('Microsoft.XMLHTTP');
+ } catch (e) {}
+ }
+ }
+ if (!http_request) {
+ throw 'Both getURL and XMLHttpRequest are undefined';
+ }
+
+ http_request.onreadystatechange = function() {
+ if (http_request.readyState == 4) {
+ callback( { success : true,
+ content : http_request.responseText,
+ contentType : http_request.getResponseHeader("Content-Type") } );
+ }
+ }
+ http_request.open('GET', url, true);
+ http_request.send(null);
+ }
+}
+window.setTimeout('update_status_thread()', 2500);
+//]]>
+</script>
+
+<?php include("fend.inc"); ?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/status_gateway_groups.php b/src/usr/local/www/status_gateway_groups.php
new file mode 100755
index 0000000..e9011c8
--- /dev/null
+++ b/src/usr/local/www/status_gateway_groups.php
@@ -0,0 +1,173 @@
+<?php
+/* $Id$ */
+/*
+ status_gateway_groups.php
+ part of pfSense (https://www.pfsense.org)
+
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-status-gatewaygroups
+##|*NAME=Status: Gateway Groups page
+##|*DESCR=Allow access to the 'Status: Gateway Groups' page.
+##|*MATCH=status_gateway_groups.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (!is_array($config['gateways']['gateway_group'])) {
+ $config['gateways']['gateway_group'] = array();
+}
+
+$a_gateway_groups = &$config['gateways']['gateway_group'];
+$changedesc = gettext("Gateway Groups") . ": ";
+
+$gateways_status = return_gateways_status();
+
+$pgtitle = array(gettext("Status"), gettext("Gateway Groups"));
+$shortcut_section = "gateway-groups";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Gateways"), false, "status_gateways.php");
+ $tab_array[1] = array(gettext("Gateway Groups"), true, "status_gateway_groups.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Group Name"); ?></td>
+ <td width="50%" class="listhdrr"><?=gettext("Gateways"); ?></td>
+ <td width="30%" class="listhdr"><?=gettext("Description"); ?></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_gateway_groups as $gateway_group):
+?>
+ <tr>
+ <td class="listlr">
+<?php
+ echo $gateway_group['name'];
+?>
+ </td>
+ <td class="listr">
+ <table border='0'>
+<?php
+ /* process which priorities we have */
+ $priorities = array();
+ foreach ($gateway_group['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ $priorities[$itemsplit[1]] = true;
+ }
+ $priority_count = count($priorities);
+ ksort($priorities);
+
+ echo "<tr>";
+ foreach ($priorities as $number => $tier) {
+ echo "<td width='120'>" . sprintf(gettext("Tier %s"), $number) . "</td>";
+ }
+ echo "</tr>\n";
+
+ /* inverse gateway group to gateway priority */
+ $priority_arr = array();
+ foreach ($gateway_group['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ $priority_arr[$itemsplit[1]][] = $itemsplit[0];
+ }
+ ksort($priority_arr);
+ $p = 1;
+ foreach ($priority_arr as $number => $tier) {
+ /* for each priority process the gateways */
+ foreach ($tier as $member) {
+ /* we always have $priority_count fields */
+ echo "<tr>";
+ $c = 1;
+ while ($c <= $priority_count) {
+ $monitor = lookup_gateway_monitor_ip_by_name($member);
+ if ($p == $c) {
+ $status = $gateways_status[$monitor]['status'];
+ if (stristr($status, "down")) {
+ $online = gettext("Offline");
+ $bgcolor = "#F08080"; // lightcoral
+ } elseif (stristr($status, "loss")) {
+ $online = gettext("Warning, Packetloss");
+ $bgcolor = "#F0E68C"; // khaki
+ } elseif (stristr($status, "delay")) {
+ $online = gettext("Warning, Latency");
+ $bgcolor = "#F0E68C"; // khaki
+ } elseif ($status == "none") {
+ $online = gettext("Online");
+ $bgcolor = "#90EE90"; // lightgreen
+ } else {
+ $online = gettext("Gathering data");
+ $bgcolor = "#ADD8E6"; // lightblue
+ }
+ echo "<td bgcolor='$bgcolor'>&nbsp;". htmlspecialchars($member) .", $online&nbsp;</td>";
+ } else {
+ echo "<td>&nbsp;</td>";
+ }
+ $c++;
+ }
+ echo "</tr>\n";
+ }
+ $p++;
+ }
+?>
+ </table>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($gateway_group['descr']);?>&nbsp;
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_gateways.php b/src/usr/local/www/status_gateways.php
new file mode 100644
index 0000000..e6fcf9d
--- /dev/null
+++ b/src/usr/local/www/status_gateways.php
@@ -0,0 +1,169 @@
+<?php
+/* $Id$ */
+/*
+ status_gateways.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-status-gateways
+##|*NAME=Status: Gateways page
+##|*DESCR=Allow access to the 'Status: Gateways' page.
+##|*MATCH=status_gateways.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$a_gateways = return_gateways_array();
+$gateways_status = array();
+$gateways_status = return_gateways_status(true);
+
+$now = time();
+$year = date("Y");
+
+$pgtitle = array(gettext("Status"), gettext("Gateways"));
+$shortcut_section = "gateways";
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr><td class="tabnavtbl">
+ <?php
+ /* active tabs */
+ $tab_array = array();
+ $tab_array[] = array(gettext("Gateways"), true, "status_gateways.php");
+ $tab_array[] = array(gettext("Gateway Groups"), false, "status_gateway_groups.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Name"); ?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Gateway"); ?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Monitor"); ?></td>
+ <td width="8%" class="listhdrr"><?=gettext("RTT"); ?></td>
+ <td width="7%" class="listhdrr"><?=gettext("Loss"); ?></td>
+ <td width="35%" class="listhdrr"><?=gettext("Status"); ?></td>
+ <td width="20%" class="listhdr"><?=gettext("Description"); ?></td>
+ </tr>
+<?php
+ foreach ($a_gateways as $gname => $gateway) {
+?>
+ <tr>
+ <td class="listlr">
+ <?=$gateway['name'];?>
+ </td>
+ <td class="listr" align="center" >
+ <?php echo lookup_gateway_ip_by_name($gname);?>
+ </td>
+ <td class="listr" align="center" >
+ <?php
+ if ($gateways_status[$gname]) {
+ echo $gateways_status[$gname]['monitorip'];
+ } else {
+ echo $gateway['monitorip'];
+ }
+ ?>
+ </td>
+ <td class="listr" align="center">
+ <?php
+ if ($gateways_status[$gname]) {
+ echo $gateways_status[$gname]['delay'];
+ } else {
+ echo gettext("Pending");
+ }
+ ?>
+ </td>
+ <td class="listr" align="center">
+ <?php
+ if ($gateways_status[$gname]) {
+ echo $gateways_status[$gname]['loss'];
+ } else {
+ echo gettext("Pending");
+ }
+ ?>
+ </td>
+ <td class="listr" >
+ <table border="0" cellpadding="0" cellspacing="2">
+ <?php
+ if ($gateways_status[$gname]) {
+ $status = $gateways_status[$gname];
+ if (stristr($status['status'], "force_down")) {
+ $online = gettext("Offline (forced)");
+ $bgcolor = "#F08080"; // lightcoral
+ } elseif (stristr($status['status'], "down")) {
+ $online = gettext("Offline");
+ $bgcolor = "#F08080"; // lightcoral
+ } elseif (stristr($status['status'], "loss")) {
+ $online = gettext("Warning, Packetloss").': '.$status['loss'];
+ $bgcolor = "#F0E68C"; // khaki
+ } elseif (stristr($status['status'], "delay")) {
+ $online = gettext("Warning, Latency").': '.$status['delay'];
+ $bgcolor = "#F0E68C"; // khaki
+ } elseif ($status['status'] == "none") {
+ $online = gettext("Online");
+ $bgcolor = "#90EE90"; // lightgreen
+ }
+ } else if (isset($gateway['monitor_disable'])) {
+ $online = gettext("Online");
+ $bgcolor = "#90EE90"; // lightgreen
+ } else {
+ $online = gettext("Pending");
+ $bgcolor = "#D3D3D3"; // lightgray
+ }
+ echo "<tr><td><table width='100%'><tr><td bgcolor=\"$bgcolor\">&nbsp;$online&nbsp;</td></tr><tr><td>";
+ $lastchange = $gateways_status[$gname]['lastcheck'];
+ if (!empty($lastchange)) {
+ echo gettext("Last check:") . '<br />' . $lastchange;
+ }
+ echo "</td></tr></table></td></tr>";
+ ?>
+ </table>
+ </td>
+ <td class="listbg"> <?=$gateway['descr']; ?></td>
+ </tr>
+<?php
+ } // foreach gateway
+?>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_graph.php b/src/usr/local/www/status_graph.php
new file mode 100644
index 0000000..056c297
--- /dev/null
+++ b/src/usr/local/www/status_graph.php
@@ -0,0 +1,352 @@
+<?php
+/* $Id$ */
+/*
+ status_graph.php
+ Part of pfSense
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-status-trafficgraph
+##|*NAME=Status: Traffic Graph page
+##|*DESCR=Allow access to the 'Status: Traffic Graph' page.
+##|*MATCH=status_graph.php*
+##|*MATCH=bandwidth_by_ip.php*
+##|*MATCH=graph.php*
+##|*MATCH=ifstats.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if ($_POST['width']) {
+ $width = $_POST['width'];
+} else {
+ $width = "100%";
+}
+
+if ($_POST['height']) {
+ $height = $_POST['height'];
+} else {
+ $height = "200";
+}
+
+// Get configured interface list
+$ifdescrs = get_configured_interface_with_descr();
+if (isset($config['ipsec']['enable'])) {
+ $ifdescrs['enc0'] = "IPsec";
+}
+foreach (array('server', 'client') as $mode) {
+ if (is_array($config['openvpn']["openvpn-{$mode}"])) {
+ foreach ($config['openvpn']["openvpn-{$mode}"] as $id => $setting) {
+ if (!isset($setting['disable'])) {
+ $ifdescrs['ovpn' . substr($mode, 0, 1) . $setting['vpnid']] = gettext("OpenVPN") . " ".$mode.": ".htmlspecialchars($setting['description']);
+ }
+ }
+ }
+}
+
+if ($_GET['if']) {
+ $curif = $_GET['if'];
+ $found = false;
+ foreach ($ifdescrs as $descr => $ifdescr) {
+ if ($descr == $curif) {
+ $found = true;
+ break;
+ }
+ }
+ if ($found === false) {
+ header("Location: status_graph.php");
+ exit;
+ }
+} else {
+ if (empty($ifdescrs["wan"])) {
+ /* Handle the case when WAN has been disabled. Use the first key in ifdescrs. */
+ reset($ifdescrs);
+ $curif = key($ifdescrs);
+ } else {
+ $curif = "wan";
+ }
+}
+if ($_GET['sort']) {
+ $cursort = $_GET['sort'];
+} else {
+ $cursort = "";
+}
+if ($_GET['filter']) {
+ $curfilter = $_GET['filter'];
+} else {
+ $curfilter = "";
+}
+if ($_GET['hostipformat']) {
+ $curhostipformat = $_GET['hostipformat'];
+} else {
+ $curhostipformat = "";
+}
+
+$pgtitle = array(gettext("Status"), gettext("Traffic Graph"));
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+function updateBandwidth() {
+ var hostinterface = jQuery("#if").val();
+ var sorting = jQuery("#sort").val();
+ var filter = jQuery("#filter").val();
+ var hostipformat = jQuery("#hostipformat").val();
+ bandwidthAjax(hostinterface, sorting, filter, hostipformat);
+}
+
+function bandwidthAjax(hostinterface, sorting, filter, hostipformat) {
+ uri = "bandwidth_by_ip.php?if=" + hostinterface + "&sort=" + sorting + "&filter=" + filter + "&hostipformat=" + hostipformat;
+ var opt = {
+ // Use GET
+ type: 'get',
+ error: function(req) {
+ /* XXX: Leave this for debugging purposes: Handle 404
+ if (req.status == 404)
+ alert('Error 404: location "' + uri + '" was not found.');
+ */
+ /* Handle other errors
+ else
+ alert('Error ' + req.status + ' -- ' + req.statusText + ' -- ' + uri);
+ */
+ },
+ success: function(data) {
+ updateBandwidthHosts(data);
+ }
+ }
+ jQuery.ajax(uri, opt);
+}
+
+function updateBandwidthHosts(data) {
+ var hosts_split = data.split("|");
+ d = document;
+ //parse top ten bandwidth abuser hosts
+ for (var y = 0; y < 10; y++) {
+ if ((y < hosts_split.length) && (hosts_split[y] != "") && (hosts_split[y] != "no info")) {
+ hostinfo = hosts_split[y].split(";");
+
+ //update host ip info
+ var HostIpID = "hostip" + y;
+ var hostip = d.getElementById(HostIpID);
+ hostip.innerHTML = hostinfo[0];
+
+ //update bandwidth inbound to host
+ var hostbandwidthInID = "bandwidthin" + y;
+ var hostbandwidthin = d.getElementById(hostbandwidthInID);
+ hostbandwidthin.innerHTML = hostinfo[1] + " Bits/sec";
+
+ //update bandwidth outbound from host
+ var hostbandwidthOutID = "bandwidthout" + y;
+ var hostbandwidthOut = d.getElementById(hostbandwidthOutID);
+ hostbandwidthOut.innerHTML = hostinfo[2] + " Bits/sec";
+
+ //make the row appear if hidden
+ var rowid = "#host" + y;
+ if (jQuery(rowid).css('display') == "none") {
+ //hide rows that contain no data
+ jQuery(rowid).show(1000);
+ }
+ } else {
+ var rowid = "#host" + y;
+ if (jQuery(rowid).css('display') != "none") {
+ //hide rows that contain no data
+ jQuery(rowid).fadeOut(2000);
+ }
+ }
+ }
+
+ setTimeout('updateBandwidth()', 1000);
+}
+//]]>
+</script>
+
+<?php
+
+/* link the ipsec interface magically */
+if (isset($config['ipsec']['enable']) || isset($config['ipsec']['client']['enable'])) {
+ $ifdescrs['enc0'] = "IPsec";
+}
+
+?>
+<form name="form1" action="status_graph.php" method="get" style="padding-bottom: 10px; margin-bottom: 14px; border-bottom: 1px solid #999999">
+<?=gettext("Interface"); ?>:
+ <select id="if" name="if" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
+<?php
+ foreach ($ifdescrs as $ifn => $ifd) {
+ echo "<option value=\"$ifn\"";
+ if ($ifn == $curif) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($ifd) . "</option>\n";
+ }
+?>
+ </select>
+, Sort by:
+ <select id="sort" name="sort" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
+ <option value="">Bw In</option>
+ <option value="out"<?php if ($cursort == "out") echo " selected=\"selected\"";?>>Bw Out</option>
+ </select>
+, Filter:
+ <select id="filter" name="filter" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
+ <option value="local"<?php if ($curfilter == "local") echo " selected=\"selected\"";?>>Local</option>
+ <option value="remote"<?php if ($curfilter == "remote") echo " selected=\"selected\"";?>>Remote</option>
+ <option value="all"<?php if ($curfilter == "all") echo " selected=\"selected\"";?>>All</option>
+ </select>
+, Display:
+ <select id="hostipformat" name="hostipformat" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
+ <option value="">IP Address</option>
+ <option value="hostname"<?php if ($curhostipformat == "hostname") echo " selected";?>>Host Name</option>
+ <option value="descr"<?php if ($curhostipformat == "descr") echo " selected=\"selected\"";?>>Description</option>
+ <option value="fqdn"<?php if ($curhostipformat == "fqdn") echo " selected=\"selected\"";?>>FQDN</option>
+ </select>
+</form>
+<p>&nbsp;</p>
+<div id="niftyOutter">
+ <div id="col1" style="float: left; width: 46%; padding: 5px; position: relative;">
+ <object data="graph.php?ifnum=<?=htmlspecialchars($curif);?>&amp;ifname=<?=rawurlencode($ifdescrs[htmlspecialchars($curif)]);?>">
+ <param name="id" value="graph" />
+ <param name="type" value="image/svg+xml" />
+ <param name="width" value="<? echo $width; ?>" />
+ <param name="height" value="<? echo $height; ?>" />
+ <param name="pluginspage" value="http://www.adobe.com/svg/viewer/install/auto" />
+ </object>
+ </div>
+ <div id="col2" style="float: right; width: 48%; padding: 5px; position: relative;">
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="status">
+ <tr>
+ <td class="listtopic" valign="top"><?=(($curhostipformat == "") ? gettext("Host IP") : gettext("Host Name or IP")); ?></td>
+ <td class="listtopic" valign="top"><?=gettext("Bandwidth In"); ?></td>
+ <td class="listtopic" valign="top"><?=gettext("Bandwidth Out"); ?></td>
+ </tr>
+ <tr id="host0" style="display:none">
+ <td id="hostip0" class="vncell">
+ </td>
+ <td id="bandwidthin0" class="listr">
+ </td>
+ <td id="bandwidthout0" class="listr">
+ </td>
+ </tr>
+ <tr id="host1" style="display:none">
+ <td id="hostip1" class="vncell">
+ </td>
+ <td id="bandwidthin1" class="listr">
+ </td>
+ <td id="bandwidthout1" class="listr">
+ </td>
+ </tr>
+ <tr id="host2" style="display:none">
+ <td id="hostip2" class="vncell">
+ </td>
+ <td id="bandwidthin2" class="listr">
+ </td>
+ <td id="bandwidthout2" class="listr">
+ </td>
+ </tr>
+ <tr id="host3" style="display:none">
+ <td id="hostip3" class="vncell">
+ </td>
+ <td id="bandwidthin3" class="listr">
+ </td>
+ <td id="bandwidthout3" class="listr">
+ </td>
+ </tr>
+ <tr id="host4" style="display:none">
+ <td id="hostip4" class="vncell">
+ </td>
+ <td id="bandwidthin4" class="listr">
+ </td>
+ <td id="bandwidthout4" class="listr">
+ </td>
+ </tr>
+ <tr id="host5" style="display:none">
+ <td id="hostip5" class="vncell">
+ </td>
+ <td id="bandwidthin5" class="listr">
+ </td>
+ <td id="bandwidthout5" class="listr">
+ </td>
+ </tr>
+ <tr id="host6" style="display:none">
+ <td id="hostip6" class="vncell">
+ </td>
+ <td id="bandwidthin6" class="listr">
+ </td>
+ <td id="bandwidthout6" class="listr">
+ </td>
+ </tr>
+ <tr id="host7" style="display:none">
+ <td id="hostip7" class="vncell">
+ </td>
+ <td id="bandwidthin7" class="listr">
+ </td>
+ <td id="bandwidthout7" class="listr">
+ </td>
+ </tr>
+ <tr id="host8" style="display:none">
+ <td id="hostip8" class="vncell">
+ </td>
+ <td id="bandwidthin8" class="listr">
+ </td>
+ <td id="bandwidthout8" class="listr">
+ </td>
+ </tr>
+ <tr id="host9" style="display:none">
+ <td id="hostip9" class="vncell">
+ </td>
+ <td id="bandwidthin9" class="listr">
+ </td>
+ <td id="bandwidthout9" class="listr">
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div style="clear: both;"></div>
+</div>
+<p><span class="red"><strong><?=gettext("Note"); ?>:</strong></span> <?=gettext("the"); ?> <a href="http://www.adobe.com/svg/viewer/install/" target="_blank"><?=gettext("Adobe SVG Viewer"); ?></a>, <?=gettext("Firefox 1.5 or later or other browser supporting SVG is required to view the graph"); ?>.</p>
+
+<?php include("fend.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+jQuery(document).ready(updateBandwidth);
+//]]>
+</script>
+</body>
+</html>
diff --git a/src/usr/local/www/status_graph_cpu.php b/src/usr/local/www/status_graph_cpu.php
new file mode 100644
index 0000000..6712508
--- /dev/null
+++ b/src/usr/local/www/status_graph_cpu.php
@@ -0,0 +1,55 @@
+<?php
+/*
+ $Id$
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-status-cpuload
+##|*NAME=Status: CPU load page
+##|*DESCR=Allow access to the 'Status: CPU load' page.
+##|*MATCH=status_graph_cpu.php*
+##|-PRIV
+
+$pgtitle = array(gettext("Status"), gettext("CPU load"));
+require("guiconfig.inc");
+include("head.inc");
+include("fbegin.inc");
+
+$pgtitle = gettext("Status: CPU Graph");
+
+?>
+<div align="center">
+ <embed src="graph_cpu.php" type="image/svg+xml"
+ width="550" height="275" pluginspage="http://www.adobe.com/svg/viewer/install/auto" />
+</div>
+<br /><span class="red"><strong><?=gettext("Note"); ?>:</strong></span> <?=gettext("if you can't see the graph, you may have to install the"); ?> <a href="http://www.adobe.com/svg/viewer/install/" target="_blank"><?=gettext("Adobe SVG viewer"); ?></a>.
+<?php include("fend.inc"); ?>
diff --git a/src/usr/local/www/status_interfaces.php b/src/usr/local/www/status_interfaces.php
new file mode 100644
index 0000000..67ab96f
--- /dev/null
+++ b/src/usr/local/www/status_interfaces.php
@@ -0,0 +1,607 @@
+<?php
+/* $Id$ */
+/*
+ status_interfaces.php
+ part of pfSense
+ Copyright (C) 2009 Scott Ullrich <sullrich@gmail.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-status-interfaces
+##|*NAME=Status: Interfaces page
+##|*DESCR=Allow access to the 'Status: Interfaces' page.
+##|*MATCH=status_interfaces.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("shaper.inc");
+require_once("filter.inc");
+
+if ($_POST['if'] && $_POST['submit']) {
+ $interface = $_POST['if'];
+ if ($_POST['status'] == "up") {
+ interface_bring_down($interface);
+ } else {
+ interface_configure($interface);
+ }
+ header("Location: status_interfaces.php");
+ exit;
+}
+
+$pgtitle = array(gettext("Status"), gettext("Interfaces"));
+$shortcut_section = "interfaces";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="status interfaces">
+<?php
+ $i = 0;
+ $ifdescrs = get_configured_interface_with_descr(false, true);
+ foreach ($ifdescrs as $ifdescr => $ifname):
+ $ifinfo = get_interface_info($ifdescr);
+ // Load MAC-Manufacturer table
+ $mac_man = load_mac_manufacturer_table();
+?>
+<?php
+ if ($i):
+?>
+ <tr>
+ <td colspan="8" class="list" height="12"></td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td colspan="2" class="listtopic">
+ <?=htmlspecialchars($ifname);?> <?=gettext("interface"); ?> (<?=htmlspecialchars($ifdescr);?>, <?=htmlspecialchars($ifinfo['hwif']);?>)
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Status"); ?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['status']);?>
+ </td>
+ </tr>
+<?php
+ if ($ifinfo['dhcplink']):
+?>
+ <tr>
+ <td width="22%" class="vncellt">
+ DHCP
+ </td>
+ <td width="78%" class="listr">
+ <form name="dhcplink_form" action="status_interfaces.php" method="post">
+ <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
+ <input type="hidden" name="status" value="<?php echo $ifinfo['dhcplink']; ?>" />
+ <?=htmlspecialchars($ifinfo['dhcplink']);?>&nbsp;&nbsp;
+ <?php $action = ($ifinfo['dhcplink'] == "up" ? gettext("Release") : gettext("Renew")); ?>
+ <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
+ </form>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['dhcp6link']):
+?>
+ <tr>
+ <td width="22%" class="vncellt">
+ DHCP6
+ </td>
+ <td width="78%" class="listr">
+ <form name="dhcp6link_form" action="status_interfaces.php" method="post">
+ <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
+ <input type="hidden" name="status" value="<?php echo $ifinfo['dhcp6link']; ?>" />
+ <?=htmlspecialchars($ifinfo['dhcp6link']);?>&nbsp;&nbsp;
+ <?php $action = ($ifinfo['dhcp6link'] == "up" ? gettext("Release") : gettext("Renew")); ?>
+ <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
+ </form>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['pppoelink']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("PPPoE"); ?></td>
+ <td width="78%" class="listr">
+ <form name="pppoelink_form" action="status_interfaces.php" method="post">
+ <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
+ <input type="hidden" name="status" value="<?php echo $ifinfo['pppoelink']; ?>" />
+ <?=htmlspecialchars($ifinfo['pppoelink']);?>&nbsp;&nbsp;
+ <?php $action = ($ifinfo['pppoelink'] == "up" ? gettext("Disconnect") : gettext("Connect")); ?>
+ <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
+ </form>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['pptplink']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("PPTP"); ?></td>
+ <td width="78%" class="listr">
+ <form name="pptplink_form" action="status_interfaces.php" method="post">
+ <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
+ <input type="hidden" name="status" value="<?php echo $ifinfo['pptplink']; ?>" />
+ <?=htmlspecialchars($ifinfo['pptplink']);?>&nbsp;&nbsp;
+ <?php $action = ($ifinfo['pptplink'] == "up" ? gettext("Disconnect") : gettext("Connect")); ?>
+ <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
+ </form>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['l2tplink']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("L2TP"); ?></td>
+ <td width="78%" class="listr">
+ <form name="l2tplink_form" action="status_interfaces.php" method="post">
+ <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
+ <input type="hidden" name="status" value="<?php echo $ifinfo['l2tplink']; ?>" />
+ <?=htmlspecialchars($ifinfo['l2tplink']);?>&nbsp;&nbsp;
+ <?php $action = ($ifinfo['l2tplink'] == "up" ? gettext("Disconnect") : gettext("Connect")); ?>
+ <input type="submit" name="submit" class="formbtn" value="<?php echo $action; ?>" />
+ </form>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['ppplink']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("PPP"); ?></td>
+ <td width="78%" class="listr">
+ <form name="ppplink_form" action="status_interfaces.php" method="post">
+ <input type="hidden" name="if" value="<?php echo $ifdescr; ?>" />
+ <input type="hidden" name="status" value="<?php echo $ifinfo['ppplink']; ?>" />
+ <?=htmlspecialchars($ifinfo['ppplink']);?>
+ <?php if ($ifinfo['ppplink'] == "up"): ?>
+ <input type="submit" name="submit" class="formbtn" value="<?php echo gettext("Disconnect"); ?>" />
+ <?php else: ?>
+ <?php if (!$ifinfo['nodevice']): ?>
+ <input type="submit" name="submit" class="formbtn" value="<?php echo gettext("Connect"); ?>" />
+ <?php endif; ?>
+ <?php endif; ?>
+ </form>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['ppp_uptime'] || $ifinfo['ppp_uptime_accumulated']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Uptime ");?><?php if ($ifinfo['ppp_uptime_accumulated']) echo "(historical)"; ?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['ppp_uptime']);?> <?=htmlspecialchars($ifinfo['ppp_uptime_accumulated']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['cell_rssi']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Cell Signal (RSSI)");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['cell_rssi']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['cell_mode']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Cell Mode");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['cell_mode']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['cell_simstate']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Cell SIM State");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['cell_simstate']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['cell_service']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Cell Service");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['cell_service']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['cell_bwupstream']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Cell Upstream");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['cell_bwupstream']);?> kbit/s
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['cell_bwdownstream']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Cell Downstream");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['cell_bwdownstream']);?> kbit/s
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['cell_upstream']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Cell Current Up");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['cell_upstream']);?> kbit/s
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['cell_downstream']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Cell Current Down");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['cell_downstream']);?> kbit/s
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['macaddr']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("MAC address");?></td>
+ <td width="78%" class="listr">
+ <?php
+ $mac=$ifinfo['macaddr'];
+ $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
+ if (isset($mac_man[$mac_hi])) {
+ print "<span>" . $mac . " - " . htmlspecialchars($mac_man[$mac_hi]); print "</span>";
+ } else {
+ print htmlspecialchars($mac);
+ }
+ ?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['status'] != "down"):
+?>
+<?php
+ if ($ifinfo['dhcplink'] != "down" && $ifinfo['pppoelink'] != "down" && $ifinfo['pptplink'] != "down"):
+ if ($ifinfo['ipaddr']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("IPv4 address");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['ipaddr']);?>
+ &nbsp;
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['subnet']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Subnet mask IPv4");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['subnet']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['gateway']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Gateway IPv4");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($config['interfaces'][$ifdescr]['gateway']);?>
+ <?=htmlspecialchars($ifinfo['gateway']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['linklocal']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("IPv6 Link Local");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['linklocal']);?>
+ &nbsp;
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['ipaddrv6']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("IPv6 address");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['ipaddrv6']);?>
+ &nbsp;
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['subnetv6']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Subnet mask IPv6");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['subnetv6']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['gatewayv6']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Gateway IPv6");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($config['interfaces'][$ifdescr]['gatewayv6']);?>
+ <?=htmlspecialchars($ifinfo['gatewayv6']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifdescr == "wan" && file_exists("{$g['varetc_path']}/resolv.conf")):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("ISP DNS servers");?></td>
+ <td width="78%" class="listr">
+ <?php
+ $dns_servers = get_dns_servers();
+ foreach ($dns_servers as $dns) {
+ echo "{$dns}<br />";
+ }
+ ?>
+ </td>
+ </tr>
+<?php
+ endif;
+ endif;
+ if ($ifinfo['mtu']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("MTU");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['mtu']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['media']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Media");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['media']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['laggproto']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("LAGG Protocol");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['laggproto']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if (is_array($ifinfo['laggport'])):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("LAGG Ports");?></td>
+ <td width="78%" class="listr">
+ <?php
+ foreach ($ifinfo['laggport'] as $laggport) {
+ echo htmlspecialchars($laggport);
+ ?>
+ <br />
+ <?php
+ }
+ ?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['channel']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Channel");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['channel']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['ssid']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("SSID");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['ssid']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['bssid']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("BSSID");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['bssid']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['rate']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Rate");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['rate']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($ifinfo['rssi']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("RSSI");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['rssi']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("In/out packets");?></td>
+ <td width="78%" class="listr">
+ <?php
+ echo htmlspecialchars($ifinfo['inpkts'] . "/" . $ifinfo['outpkts'] . " (");
+ echo htmlspecialchars(format_bytes($ifinfo['inbytes']) . "/" . format_bytes($ifinfo['outbytes']) . ")");
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("In/out packets (pass)");?></td>
+ <td width="78%" class="listr">
+ <?php
+ echo htmlspecialchars($ifinfo['inpktspass'] . "/" . $ifinfo['outpktspass'] . " (");
+ echo htmlspecialchars(format_bytes($ifinfo['inbytespass']) . "/" . format_bytes($ifinfo['outbytespass']) . ")");
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("In/out packets (block)");?></td>
+ <td width="78%" class="listr">
+ <?php
+ echo htmlspecialchars($ifinfo['inpktsblock'] . "/" . $ifinfo['outpktsblock'] . " (");
+ echo htmlspecialchars(format_bytes($ifinfo['inbytesblock']) . "/" . format_bytes($ifinfo['outbytesblock']) . ")");
+ ?>
+ </td>
+ </tr>
+<?php
+ if (isset($ifinfo['inerrs'])):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("In/out errors");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['inerrs'] . "/" . $ifinfo['outerrs']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if (isset($ifinfo['collisions'])):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Collisions");?></td>
+ <td width="78%" class="listr">
+ <?=htmlspecialchars($ifinfo['collisions']);?>
+ </td>
+ </tr>
+<?php
+ endif;
+ endif;
+?>
+<?php
+ if ($ifinfo['bridge']):
+?>
+ <tr>
+ <td width="22%" class="vncellt"><?php printf(gettext("Bridge (%s)"), $ifinfo['bridgeint']);?></td>
+ <td width="78%" class="listr">
+ <?=$ifinfo['bridge'];?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if (file_exists("/usr/bin/vmstat")):
+ $real_interface = "";
+ $interrupt_total = "";
+ $interrupt_sec = "";
+ $real_interface = $ifinfo['hwif'];
+ $interrupt_total = `vmstat -i | grep $real_interface | awk '{ print $3 }'`;
+ $interrupt_sec = `vmstat -i | grep $real_interface | awk '{ print $4 }'`;
+ if (strstr($interrupt_total, "hci")) {
+ $interrupt_total = `vmstat -i | grep $real_interface | awk '{ print $4 }'`;
+ $interrupt_sec = `vmstat -i | grep $real_interface | awk '{ print $5 }'`;
+ }
+ unset($interrupt_total); // XXX: FIX ME! Need a regex and parse correct data 100% of the time.
+ if ($interrupt_total): ?>
+ <tr>
+ <td width="22%" class="vncellt"><?=gettext("Interrupts/Second");?></td>
+ <td width="78%" class="listr">
+ <?php
+ echo $interrupt_total . " " . gettext("total");
+ echo "<br />";
+ echo $interrupt_sec . " " . gettext("rate");
+ ?>
+ </td>
+ </tr>
+<?php
+ endif;
+ endif;
+ $i++;
+ endforeach;
+?>
+</table>
+
+<br />
+
+<?php printf(gettext("Using dial-on-demand will bring the connection up again if any packet ".
+"triggers it. To substantiate this point: disconnecting manually ".
+"will %snot%s prevent dial-on-demand from making connections ".
+"to the outside! Don't use dial-on-demand if you want to make sure that the line ".
+"is kept disconnected."), '<strong>', '</strong>')?>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_lb_pool.php b/src/usr/local/www/status_lb_pool.php
new file mode 100644
index 0000000..984ab9e
--- /dev/null
+++ b/src/usr/local/www/status_lb_pool.php
@@ -0,0 +1,231 @@
+<?php
+/* $Id$ */
+/*
+ status_lb_pool.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-status-loadbalancer-pool
+##|*NAME=Status: Load Balancer: Pool page
+##|*DESCR=Allow access to the 'Status: Load Balancer: Pool' page.
+##|*MATCH=status_lb_pool.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("vslb.inc");
+
+if (!is_array($config['load_balancer']['lbpool'])) {
+ $config['load_balancer']['lbpool'] = array();
+}
+$a_pool = &$config['load_balancer']['lbpool'];
+
+$lb_logfile = "{$g['varlog_path']}/relayd.log";
+
+$now = time();
+$year = date("Y");
+
+$pgtitle = array(gettext("Status"), gettext("Load Balancer"), gettext("Pool"));
+$shortcut_section = "relayd";
+include("head.inc");
+
+$relay_hosts = get_lb_summary();
+
+if ($_POST) {
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval |= filter_configure();
+ $retval |= relayd_configure();
+ $savemsg = get_std_save_message($retval);
+ clear_subsystem_dirty('loadbalancer');
+ } else {
+ /* Keep a list of servers we find in POST variables */
+ $newservers = array();
+ foreach ($_POST as $name => $value) {
+ /* Look through the POST vars to find the pool data */
+ if (strpos($name, '|') !== false) {
+ list($poolname, $ip) = explode("|", $name);
+ $ip = str_replace('_', '.', $ip);
+ $newservers[$poolname][] = $ip;
+ } elseif (is_ipaddr($value)) {
+ $newservers[$name][] = $value;
+ }
+ }
+ foreach ($a_pool as & $pool) {
+ if (is_array($pool['servers']) && is_array($pool['serversdisabled'])) {
+ $oldservers = array_merge($pool['servers'], $pool['serversdisabled']);
+ } elseif (is_array($pool['servers'])) {
+ $oldservers = $pool['servers'];
+ } elseif (is_array($pool['serversdisabled'])) {
+ $oldservers = $pool['serversdisabled'];
+ } else {
+ $oldservers = array();
+ }
+ if (is_array($newservers[$pool['name']])) {
+ $pool['servers'] = $newservers[$pool['name']];
+ $pool['serversdisabled'] = array_diff($oldservers, $newservers[$pool['name']]);
+ }
+ }
+ mark_subsystem_dirty('loadbalancer');
+ write_config("Updated load balancer pools via status screen.");
+ }
+}
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="status_lb_pool.php" method="post">
+<?php if (is_subsystem_dirty('loadbalancer')): ?><br/>
+<?php print_info_box_np(sprintf(gettext("The load balancer configuration has been changed%sYou must apply the changes in order for them to take effect."), "<br />"));?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status load balancer pools">
+ <tr><td class="tabnavtbl">
+ <?php
+ /* active tabs */
+ $tab_array = array();
+ $tab_array[] = array(gettext("Pools"), true, "status_lb_pool.php");
+ $tab_array[] = array(gettext("Virtual Servers"), false, "status_lb_vs.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont sortable" id="sortabletable" summary="main area">
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Mode");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Servers");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Monitor");?></td>
+ <td width="30%" class="listhdr"><?=gettext("Description");?></td>
+ </tr>
+<?php
+ foreach ($a_pool as & $pool):
+?>
+ <tr>
+ <td class="listlr">
+ <?=$pool['name'];?>
+ </td>
+ <td class="listr" align="center" >
+<?php
+ switch ($pool['mode']) {
+ case "loadbalance":
+ echo "Load balancing";
+ break;
+ case "failover":
+ echo "Manual failover";
+ break;
+ default:
+ echo "(default)";
+ }
+?>
+ </td>
+ <td class="listr" align="center">
+ <table border="0" cellpadding="2" cellspacing="0" summary="status">
+<?php
+ $pool_hosts = array();
+ foreach ((array) $pool['servers'] as $server) {
+ $svr['ip']['addr'] = $server;
+ $svr['ip']['state'] = $relay_hosts[$pool['name'] . ":" . $pool['port']][$server]['state'];
+ $svr['ip']['avail'] = $relay_hosts[$pool['name'] . ":" . $pool['port']][$server]['avail'];
+ $pool_hosts[]=$svr;
+ }
+ foreach ((array) $pool['serversdisabled'] as $server) {
+ $svr['ip']['addr'] = "$server";
+ $svr['ip']['state'] = 'disabled';
+ $svr['ip']['avail'] = 'disabled';
+ $pool_hosts[]=$svr;
+ }
+ asort($pool_hosts);
+
+ foreach ((array) $pool_hosts as $server) {
+ if ($server['ip']['addr'] != "") {
+ switch ($server['ip']['state']) {
+ case 'up':
+ $bgcolor = "#90EE90"; // lightgreen
+ $checked = "checked=\"checked\"";
+ break;
+ case 'disabled':
+ $bgcolor = "white";
+ $checked = "";
+ break;
+ default:
+ $bgcolor = "#F08080"; // lightcoral
+ $checked = "checked=\"checked\"";
+ }
+ echo "<tr>";
+ switch ($pool['mode']) {
+ case 'loadbalance':
+ echo "<td><input type=\"checkbox\" name=\"{$pool['name']}|" . str_replace('.', '_', $server['ip']['addr']) . "\" {$checked} /></td>\n";
+ break;
+ case 'failover':
+ echo "<td><input type=\"radio\" name=\"{$pool['name']}\" value=\"{$server['ip']['addr']}\" {$checked} /></td>\n";
+ break;
+ }
+ echo "<td bgcolor=\"{$bgcolor}\">&nbsp;{$server['ip']['addr']}:{$pool['port']}&nbsp;</td><td bgcolor=\"{$bgcolor}\">&nbsp;";
+# echo "<td bgcolor=\"{$bgcolor}\">&nbsp;{$server['ip']['addr']}:{$pool['port']} ";
+ if ($server['ip']['avail']) {
+ echo " ({$server['ip']['avail']}) ";
+ }
+ echo "&nbsp;</td></tr>";
+ }
+ }
+?>
+ </table>
+ </td>
+ <td class="listr" >
+ <?php echo $pool['monitor']; ?>
+ </td>
+ <td class="listbg" >
+ <?=$pool['descr'];?>
+ </td>
+ </tr>
+<?php
+ endforeach;
+?>
+ <tr>
+ <td colspan="5">
+ <input name="Submit" type="submit" class="formbtn" value="<?= gettext("Save"); ?>" />
+ <input name="Reset" type="reset" class="formbtn" value="<?= gettext("Reset"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_lb_vs.php b/src/usr/local/www/status_lb_vs.php
new file mode 100644
index 0000000..0d0bd60
--- /dev/null
+++ b/src/usr/local/www/status_lb_vs.php
@@ -0,0 +1,158 @@
+<?php
+/* $Id$ */
+/*
+ status_lb_vs.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/relayctl
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-status-loadbalancer-virtualserver
+##|*NAME=Status: Load Balancer: Virtual Server page
+##|*DESCR=Allow access to the 'Status: Load Balancer: Virtual Server' page.
+##|*MATCH=status_lb_vs.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("vslb.inc");
+
+if (!is_array($config['load_balancer']['lbpool'])) {
+ $config['load_balancer']['lbpool'] = array();
+}
+if (!is_array($config['load_balancer']['virtual_server'])) {
+ $config['load_balancer']['virtual_server'] = array();
+}
+$a_vs = &$config['load_balancer']['virtual_server'];
+$a_pool = &$config['load_balancer']['lbpool'];
+$rdr_a = get_lb_redirects();
+
+$pgtitle = array(gettext("Status"), gettext("Load Balancer"), gettext("Virtual Server"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status load balancer virtual servers">
+ <tr><td class="tabnavtbl">
+ <?php
+ /* active tabs */
+ $tab_array = array();
+ $tab_array[] = array(gettext("Pools"), false, "status_lb_pool.php");
+ $tab_array[] = array(gettext("Virtual Servers"), true, "status_lb_vs.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Name"); ?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Address"); ?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Servers"); ?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Status"); ?></td>
+ <td width="25%" class="listhdr"><?=gettext("Description"); ?></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_vs as $vsent):
+?>
+ <tr>
+ <td class="listlr">
+ <?=$vsent['name'];?>
+ </td>
+ <td class="listr" align="center" >
+ <?=$vsent['ipaddr']." : ".$vsent['port'];?>
+ <br />
+ </td>
+ <td class="listr" align="center" >
+ <table border="0" cellpadding="0" cellspacing="2" summary="servers">
+<?php
+ foreach ($a_pool as $vipent) {
+ if ($vipent['name'] == $vsent['poolname']) {
+ foreach ((array) $vipent['servers'] as $server) {
+ print "<tr><td> {$server} </td></tr>";
+ }
+ }
+ }
+ ?>
+ </table>
+ </td>
+<?php
+ switch (trim($rdr_a[$vsent['name']]['status'])) {
+ case 'active':
+ $bgcolor = "#90EE90"; // lightgreen
+ $rdr_a[$vsent['name']]['status'] = "Active";
+ break;
+ case 'down':
+ $bgcolor = "#F08080"; // lightcoral
+ $rdr_a[$vsent['name']]['status'] = "Down";
+ break;
+ default:
+ $bgcolor = "#D3D3D3"; // lightgray
+ $rdr_a[$vsent['name']]['status'] = 'Unknown - relayd not running?';
+ }
+?>
+ <td class="listr nowrap">
+ <table border="0" cellpadding="3" cellspacing="2" summary="status">
+ <tr>
+ <td bgcolor="<?=$bgcolor?>"><?=$rdr_a[$vsent['name']]['status']?> </td>
+ </tr>
+ </table>
+<?php
+ if (!empty($rdr_a[$vsent['name']]['total'])) {
+ echo "Total Sessions: {$rdr_a[$vsent['name']]['total']}\n";
+ }
+ if (!empty($rdr_a[$vsent['name']]['last'])) {
+ echo "<br />Last: {$rdr_a[$vsent['name']]['last']}\n";
+ }
+ if (!empty($rdr_a[$vsent['name']]['average'])) {
+ echo "<br />Average: {$rdr_a[$vsent['name']]['average']}\n";
+ }
+?>
+ </td>
+ <td class="listbg" >
+ <?=$vsent['descr'];?>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_ntpd.php b/src/usr/local/www/status_ntpd.php
new file mode 100644
index 0000000..329764b
--- /dev/null
+++ b/src/usr/local/www/status_ntpd.php
@@ -0,0 +1,320 @@
+<?php
+/* $Id$ */
+/*
+ status_ntpd.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2013 Dagorlad
+ Copyright (C) 2012 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/ntpd /usr/local/sbin/ntpq
+ pfSense_MODULE: ntpd
+*/
+
+##|+PRIV
+##|*IDENT=page-status-ntp
+##|*NAME=Status: NTP page
+##|*DESCR=Allow access to the 'Status: NTP' page.
+##|*MATCH=status_ntpd.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+
+if (!isset($config['ntpd']['noquery'])) {
+ if (isset($config['system']['ipv6allow'])) {
+ $inet_version = "";
+ } else {
+ $inet_version = " -4";
+ }
+
+ exec("/usr/local/sbin/ntpq -pn $inet_version | /usr/bin/tail +3", $ntpq_output);
+
+ $ntpq_servers = array();
+ foreach ($ntpq_output as $line) {
+ $server = array();
+
+ switch (substr($line, 0, 1)) {
+ case " ":
+ $server['status'] = "Unreach/Pending";
+ break;
+ case "*":
+ $server['status'] = "Active Peer";
+ break;
+ case "+":
+ $server['status'] = "Candidate";
+ break;
+ case "o":
+ $server['status'] = "PPS Peer";
+ break;
+ case "#":
+ $server['status'] = "Selected";
+ break;
+ case ".":
+ $server['status'] = "Excess Peer";
+ break;
+ case "x":
+ $server['status'] = "False Ticker";
+ break;
+ case "-":
+ $server['status'] = "Outlier";
+ break;
+ }
+
+ $line = substr($line, 1);
+ $peerinfo = preg_split("/[\s\t]+/", $line);
+
+ $server['server'] = $peerinfo[0];
+ $server['refid'] = $peerinfo[1];
+ $server['stratum'] = $peerinfo[2];
+ $server['type'] = $peerinfo[3];
+ $server['when'] = $peerinfo[4];
+ $server['poll'] = $peerinfo[5];
+ $server['reach'] = $peerinfo[6];
+ $server['delay'] = $peerinfo[7];
+ $server['offset'] = $peerinfo[8];
+ $server['jitter'] = $peerinfo[9];
+
+ $ntpq_servers[] = $server;
+ }
+
+ exec("/usr/local/sbin/ntpq -c clockvar $inet_version", $ntpq_clockvar_output);
+ foreach ($ntpq_clockvar_output as $line) {
+ if (substr($line, 0, 9) == "timecode=") {
+ $tmp = explode('"', $line);
+ $tmp = $tmp[1];
+ if (substr($tmp, 0, 6) == '$GPRMC') {
+ $gps_vars = explode(",", $tmp);
+ $gps_ok = ($gps_vars[2] == "A");
+ $gps_lat_deg = substr($gps_vars[3], 0, 2);
+ $gps_lat_min = substr($gps_vars[3], 2) / 60.0;
+ $gps_lon_deg = substr($gps_vars[5], 0, 3);
+ $gps_lon_min = substr($gps_vars[5], 3) / 60.0;
+ $gps_lat = $gps_lat_deg + $gps_lat_min;
+ $gps_lat = $gps_lat * (($gps_vars[4] == "N") ? 1 : -1);
+ $gps_lon = $gps_lon_deg + $gps_lon_min;
+ $gps_lon = $gps_lon * (($gps_vars[6] == "E") ? 1 : -1);
+ } elseif (substr($tmp, 0, 6) == '$GPGGA') {
+ $gps_vars = explode(",", $tmp);
+ $gps_ok = $gps_vars[6];
+ $gps_lat_deg = substr($gps_vars[2], 0, 2);
+ $gps_lat_min = substr($gps_vars[2], 2) / 60.0;
+ $gps_lon_deg = substr($gps_vars[4], 0, 3);
+ $gps_lon_min = substr($gps_vars[4], 3) / 60.0;
+ $gps_lat = $gps_lat_deg + $gps_lat_min;
+ $gps_lat = $gps_lat * (($gps_vars[3] == "N") ? 1 : -1);
+ $gps_lon = $gps_lon_deg + $gps_lon_min;
+ $gps_lon = $gps_lon * (($gps_vars[5] == "E") ? 1 : -1);
+ $gps_alt = $gps_vars[9];
+ $gps_alt_unit = $gps_vars[10];
+ $gps_sat = $gps_vars[7];
+ } elseif (substr($tmp, 0, 6) == '$GPGLL') {
+ $gps_vars = explode(",", $tmp);
+ $gps_ok = ($gps_vars[6] == "A");
+ $gps_lat_deg = substr($gps_vars[1], 0, 2);
+ $gps_lat_min = substr($gps_vars[1], 2) / 60.0;
+ $gps_lon_deg = substr($gps_vars[3], 0, 3);
+ $gps_lon_min = substr($gps_vars[3], 3) / 60.0;
+ $gps_lat = $gps_lat_deg + $gps_lat_min;
+ $gps_lat = $gps_lat * (($gps_vars[2] == "N") ? 1 : -1);
+ $gps_lon = $gps_lon_deg + $gps_lon_min;
+ $gps_lon = $gps_lon * (($gps_vars[4] == "E") ? 1 : -1);
+ }
+ }
+ }
+
+}
+
+if (isset($config['ntpd']['gps']['type']) && ($config['ntpd']['gps']['type'] == 'SureGPS') && (isset($gps_ok))) {
+ //GSV message is only enabled by init commands in services_ntpd_gps.php for SureGPS board
+ $gpsport = fopen("/dev/gps0", "r+");
+ while ($gpsport) {
+ $buffer = fgets($gpsport);
+ if (substr($buffer, 0, 6) == '$GPGSV') {
+ //echo $buffer."\n";
+ $gpgsv = explode(',', $buffer);
+ $gps_satview = $gpgsv[3];
+ break;
+ }
+ }
+}
+
+$pgtitle = array(gettext("Status"), gettext("NTP"));
+$shortcut_section = "ntp";
+include("head.inc");
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="status ntpd">
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="heading">
+ <tr>
+ <td class="listtopic">Network Time Protocol Status</td>
+ </tr>
+ </table>
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <thead>
+ <tr>
+ <th class="listhdrr"><?=gettext("Status"); ?></th>
+ <th class="listhdrr"><?=gettext("Server"); ?></th>
+ <th class="listhdrr"><?=gettext("Ref ID"); ?></th>
+ <th class="listhdrr"><?=gettext("Stratum"); ?></th>
+ <th class="listhdrr"><?=gettext("Type"); ?></th>
+ <th class="listhdrr"><?=gettext("When"); ?></th>
+ <th class="listhdrr"><?=gettext("Poll"); ?></th>
+ <th class="listhdrr"><?=gettext("Reach"); ?></th>
+ <th class="listhdrr"><?=gettext("Delay"); ?></th>
+ <th class="listhdrr"><?=gettext("Offset"); ?></th>
+ <th class="listhdr"><?=gettext("Jitter"); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ if (isset($config['ntpd']['noquery'])):
+?>
+ <tr>
+ <td class="listlr" colspan="11" align="center">
+ Statistics unavailable because ntpq and ntpdc queries are disabled in the <a href="services_ntpd.php">NTP service settings</a>.
+ </td>
+ </tr>
+<?php
+ elseif (count($ntpq_servers) == 0):
+?>
+ <tr>
+ <td class="listlr" colspan="11" align="center">
+ No peers found, <a href="status_services.php">is the ntp service running?</a>.
+ </td>
+ </tr>
+<?php
+ else:
+ $i = 0;
+ foreach ($ntpq_servers as $server):
+?>
+ <tr>
+ <td class="listlr nowrap">
+ <?=$server['status'];?>
+ </td>
+ <td class="listr">
+ <?=$server['server'];?>
+ </td>
+ <td class="listr">
+ <?=$server['refid'];?>
+ </td>
+ <td class="listr">
+ <?=$server['stratum'];?>
+ </td>
+ <td class="listr">
+ <?=$server['type'];?>
+ </td>
+ <td class="listr">
+ <?=$server['when'];?>
+ </td>
+ <td class="listr">
+ <?=$server['poll'];?>
+ </td>
+ <td class="listr">
+ <?=$server['reach'];?>
+ </td>
+ <td class="listr">
+ <?=$server['delay'];?>
+ </td>
+ <td class="listr">
+ <?=$server['offset'];?>
+ </td>
+ <td class="listr">
+ <?=$server['jitter'];?>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+ endif;
+?>
+ </tbody>
+ </table>
+<?php
+ if (($gps_ok) && ($gps_lat) && ($gps_lon)):
+ $gps_goo_lnk = 2;
+?>
+ <table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="gps status">
+ <thead>
+ <tr>
+ <th class="listhdrr"><?=gettext("Clock Latitude"); ?></th>
+ <th class="listhdrr"><?=gettext("Clock Longitude"); ?></th>
+<?php
+ if (isset($gps_alt)) {
+ echo '<th class="listhdrr">' . gettext("Clock Altitude") . '</th>';
+ $gps_goo_lnk++;
+ }
+
+ if (isset($gps_sat) || isset($gps_satview)) {
+ echo '<th class="listhdrr">' . gettext("Satellites") . '</th>';
+ $gps_goo_lnk++;
+ }
+?>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="listlr" align="center"><?php echo sprintf("%.5f", $gps_lat); ?> (<?php echo sprintf("%d", $gps_lat_deg); ?>&deg; <?php echo sprintf("%.5f", $gps_lat_min*60); ?><?php echo $gps_vars[4]; ?>)</td>
+ <td class="listlr" align="center"><?php echo sprintf("%.5f", $gps_lon); ?> (<?php echo sprintf("%d", $gps_lon_deg); ?>&deg; <?php echo sprintf("%.5f", $gps_lon_min*60); ?><?php echo $gps_vars[6]; ?>)</td>
+<?php
+ if (isset($gps_alt)) {
+ echo '<td class="listlr" align="center">' . $gps_alt . ' ' . $gps_alt_unit . '</td>';
+ }
+
+ if (isset($gps_sat) || isset($gps_satview)) {
+ echo '<td class="listr" align="center">';
+ if (isset($gps_satview)) {
+ echo 'in view ' . intval($gps_satview);
+ }
+ if (isset($gps_sat) && isset($gps_satview)) {
+ echo ', ';
+ }
+ if (isset($gps_sat)) {
+ echo 'in use ' . $gps_sat;
+ }
+ echo '</td>';
+ }
+?>
+ </tr>
+ <tr>
+ <td class="listlr" colspan="<?php echo $gps_goo_lnk; ?>" align="center"><a target="_gmaps" href="http://maps.google.com/?q=<?php echo $gps_lat; ?>,<?php echo $gps_lon; ?>">Google Maps Link</a></td>
+ </tr>
+ </tbody>
+ </table>
+<?php
+ endif;
+?>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_openvpn.php b/src/usr/local/www/status_openvpn.php
new file mode 100644
index 0000000..e9d2073
--- /dev/null
+++ b/src/usr/local/www/status_openvpn.php
@@ -0,0 +1,443 @@
+<?php
+/*
+ status_openvpn.php
+
+ Copyright (C) 2005 Scott Ullrich, Colin Smith
+ Copyright (C) 2008 Shrew Soft Inc.
+ Copyright (C) 2010 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ AJAX bits borrowed from diag_dump_states.php
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: openvpn
+*/
+
+##|+PRIV
+##|*IDENT=page-status-openvpn
+##|*NAME=Status: OpenVPN page
+##|*DESCR=Allow access to the 'Status: OpenVPN' page.
+##|*MATCH=status_openvpn.php*
+##|-PRIV
+
+$pgtitle = array(gettext("Status"), gettext("OpenVPN"));
+$shortcut_section = "openvpn";
+
+require("guiconfig.inc");
+require_once("openvpn.inc");
+require_once("shortcuts.inc");
+require_once("service-utils.inc");
+
+/* Handle AJAX */
+if ($_GET['action']) {
+ if ($_GET['action'] == "kill") {
+ $port = $_GET['port'];
+ $remipp = $_GET['remipp'];
+ if (!empty($port) and !empty($remipp)) {
+ $retval = kill_client($port, $remipp);
+ echo htmlentities("|{$port}|{$remipp}|{$retval}|");
+ } else {
+ echo gettext("invalid input");
+ }
+ exit;
+ }
+}
+
+
+function kill_client($port, $remipp) {
+ global $g;
+
+ //$tcpsrv = "tcp://127.0.0.1:{$port}";
+ $tcpsrv = "unix://{$g['varetc_path']}/openvpn/{$port}.sock";
+ $errval;
+ $errstr;
+
+ /* open a tcp connection to the management port of each server */
+ $fp = @stream_socket_client($tcpsrv, $errval, $errstr, 1);
+ $killed = -1;
+ if ($fp) {
+ stream_set_timeout($fp, 1);
+ fputs($fp, "kill {$remipp}\n");
+ while (!feof($fp)) {
+ $line = fgets($fp, 1024);
+
+ $info = stream_get_meta_data($fp);
+ if ($info['timed_out']) {
+ break;
+ }
+
+ /* parse header list line */
+ if (strpos($line, "INFO:") !== false) {
+ continue;
+ }
+ if (strpos($line, "SUCCESS") !== false) {
+ $killed = 0;
+ }
+ break;
+ }
+ fclose($fp);
+ }
+ return $killed;
+}
+
+$servers = openvpn_get_active_servers();
+$sk_servers = openvpn_get_active_servers("p2p");
+$clients = openvpn_get_active_clients();
+
+include("head.inc"); ?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?=$jsevents["body"]["onload"];?>">
+<?php include("fbegin.inc"); ?>
+<form action="status_openvpn.php" method="get" name="iform">
+<script type="text/javascript">
+//<![CDATA[
+ function killClient(mport, remipp) {
+ var busy = function(index, icon) {
+ jQuery(icon).bind("onclick", "");
+ jQuery(icon).attr('src', jQuery(icon).attr('src').replace("\.gif", "_d.gif"));
+ jQuery(icon).css("cursor", "wait");
+ }
+
+ jQuery('img[name="i:' + mport + ":" + remipp + '"]').each(busy);
+
+ jQuery.ajax(
+ "<?=$_SERVER['SCRIPT_NAME'];?>" +
+ "?action=kill&port=" + mport + "&remipp=" + remipp,
+ { type: "get", complete: killComplete }
+ );
+ }
+
+ function killComplete(req) {
+ var values = req.responseText.split("|");
+ if (values[3] != "0") {
+ alert('<?=gettext("An error occurred.");?>' + ' (' + values[3] + ')');
+ return;
+ }
+
+ jQuery('tr[name="r:' + values[1] + ":" + values[2] + '"]').each(
+ function(index, row) { jQuery(row).fadeOut(1000); }
+ );
+ }
+//]]>
+</script>
+<?php
+ $i = 0;
+ foreach ($servers as $server):
+?>
+
+<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0" summary="status openvpn">
+ <tr>
+ <td colspan="6" class="listtopic">
+ <?=$server['name'];?> <?=gettext("Client connections"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="connections">
+ <tr>
+ <td class="listhdrr"><?=gettext("Common Name"); ?></td>
+ <td class="listhdrr"><?=gettext("Real Address"); ?></td>
+ <td class="listhdrr"><?=gettext("Virtual Address"); ?></td>
+ <td class="listhdrr"><?=gettext("Connected Since"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Sent"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Received"); ?></td>
+ </tr>
+<?php
+ foreach ($server['conns'] as $conn):
+?>
+ <tr id="<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>">
+ <td class="listlr">
+ <?=$conn['common_name'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['remote_host'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['virtual_addr'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['connect_time'];?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($conn['bytes_sent']);?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($conn['bytes_recv']);?>
+ </td>
+ <td class="list">
+ <img src="/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif" height="17" width="17" border="0"
+ onclick="killClient('<?php echo $server['mgmt']; ?>', '<?php echo $conn['remote_host']; ?>');" style="cursor:pointer;"
+ id="<?php echo "i:{$server['mgmt']}:{$conn['remote_host']}"; ?>"
+ title="<?php echo gettext("Kill client connection from") . " " . $conn['remote_host']; ?>" alt="delete" />
+ </td>
+ </tr>
+<?php
+ endforeach;
+?>
+ <tfoot>
+ <tr>
+ <td colspan="2" class="list" height="12">
+ <table>
+ <tr>
+ <td><?php $ssvc = find_service_by_openvpn_vpnid($server['vpnid']); ?>
+ <?= get_service_status_icon($ssvc, true, true); ?>
+ <?= get_service_control_links($ssvc, true); ?></td>
+ </tr>
+ </table>
+ </td>
+ <td colspan="4" class="list" height="12">&nbsp;</td>
+ </tr>
+ </tfoot>
+ </table>
+ </td>
+ </tr>
+</table>
+<?php
+ if (is_array($server['routes']) && count($server['routes'])):
+?>
+<div id="shroutebut-<?= $i ?>">
+ <input type="button" onClick="show_routes('tabroute-<?= $i ?>', 'shroutebut-<?= $i ?>')" value="<?php echo gettext("Show Routing Table"); ?>" /> - <?= gettext("Display OpenVPN's internal routing table for this server.") ?>
+ <br /><br />
+</div>
+<table style="display: none; padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0" id="tabroute-<?= $i ?>" summary="routing table">
+ <tr>
+ <td colspan="6" class="listtopic">
+ <?=$server['name'];?> <?=gettext("Routing Table"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="results">
+ <tr>
+ <td class="listhdrr"><?=gettext("Common Name"); ?></td>
+ <td class="listhdrr"><?=gettext("Real Address"); ?></td>
+ <td class="listhdrr"><?=gettext("Target Network"); ?></td>
+ <td class="listhdrr"><?=gettext("Last Used"); ?></td>
+ </tr>
+
+<?php
+ foreach ($server['routes'] as $conn):
+?>
+ <tr id="<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>">
+ <td class="listlr">
+ <?=$conn['common_name'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['remote_host'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['virtual_addr'];?>
+ </td>
+ <td class="listr">
+ <?=$conn['last_time'];?>
+ </td>
+ </tr>
+<?php
+ endforeach;
+?>
+ <tfoot>
+ <tr>
+ <td colspan="6" class="list" height="12"><?= gettext("An IP address followed by C indicates a host currently connected through the VPN.") ?></td>
+ </tr>
+ </tfoot>
+ </table>
+ </td>
+ </tr>
+</table>
+<?php
+ endif;
+?>
+<br />
+<?php
+ $i++;
+ endforeach;
+?>
+<br />
+
+<?php
+ if (!empty($sk_servers)) {
+?>
+<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0" summary="peer to peer stats">
+ <tr>
+ <td colspan="6" class="listtopic">
+ <?=gettext("Peer to Peer Server Instance Statistics"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="results">
+ <tr>
+ <td class="listhdrr"><?=gettext("Name"); ?></td>
+ <td class="listhdrr"><?=gettext("Status"); ?></td>
+ <td class="listhdrr"><?=gettext("Connected Since"); ?></td>
+ <td class="listhdrr"><?=gettext("Virtual Addr"); ?></td>
+ <td class="listhdrr"><?=gettext("Remote Host"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Sent"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Rcvd"); ?></td>
+ <td class="listhdrr"><?=gettext("Service"); ?></td>
+ </tr>
+
+<?php
+ foreach ($sk_servers as $sk_server):
+?>
+ <tr id="<?php echo "r:{$sk_server['port']}:{$sk_server['vpnid']}"; ?>">
+ <td class="listlr">
+ <?=$sk_server['name'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['status'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['connect_time'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['virtual_addr'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['remote_host'];?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($sk_server['bytes_sent']);?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($sk_server['bytes_recv']);?>
+ </td>
+ <td class="listr">
+ <table>
+ <tr>
+ <td><?php $ssvc = find_service_by_openvpn_vpnid($sk_server['vpnid']); ?>
+ <?= get_service_status_icon($ssvc, false, true); ?>
+ <?= get_service_control_links($ssvc, true); ?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endforeach;
+?>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<?php
+ }
+?>
+<br />
+<?php
+ if (!empty($clients)) {
+?>
+<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0" summary="client stats">
+ <tr>
+ <td colspan="6" class="listtopic">
+ <?=gettext("Client Instance Statistics"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="results">
+ <tr>
+ <td class="listhdrr"><?=gettext("Name"); ?></td>
+ <td class="listhdrr"><?=gettext("Status"); ?></td>
+ <td class="listhdrr"><?=gettext("Connected Since"); ?></td>
+ <td class="listhdrr"><?=gettext("Virtual Addr"); ?></td>
+ <td class="listhdrr"><?=gettext("Remote Host"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Sent"); ?></td>
+ <td class="listhdrr"><?=gettext("Bytes Rcvd"); ?></td>
+ <td class="listhdrr"><?=gettext("Service"); ?></td>
+ </tr>
+
+<?php
+ foreach ($clients as $client):
+?>
+ <tr id="<?php echo "r:{$client['port']}:{$client['vpnid']}"; ?>">
+ <td class="listlr">
+ <?=$client['name'];?>
+ </td>
+ <td class="listr">
+ <?=$client['status'];?>
+ </td>
+ <td class="listr">
+ <?=$client['connect_time'];?>
+ </td>
+ <td class="listr">
+ <?=$client['virtual_addr'];?>
+ </td>
+ <td class="listr">
+ <?=$client['remote_host'];?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($client['bytes_sent']);?>
+ </td>
+ <td class="listr">
+ <?=format_bytes($client['bytes_recv']);?>
+ </td>
+ <td class="listr" height="12">
+ <table>
+ <tr>
+ <td>
+ <?php $ssvc = find_service_by_openvpn_vpnid($client['vpnid']); ?>
+ <?= get_service_status_icon($ssvc, false, true); ?>
+ <?= get_service_control_links($ssvc, true); ?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endforeach;
+?>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<?php
+ }
+
+ if ($DisplayNote) {
+ echo "<br /><b>" . gettext("NOTE") . ":</b> " . gettext("If you have custom options that override the management features of OpenVPN on a client or server, they will cause that OpenVPN instance to not work correctly with this status page.");
+ }
+
+ if ((empty($clients)) && (empty($servers)) && (empty($sk_servers))) {
+ echo gettext("No OpenVPN instances defined");
+ }
+?>
+</form>
+
+<?php include("fend.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+function show_routes(id, buttonid) {
+ document.getElementById(buttonid).innerHTML='';
+ aodiv = document.getElementById(id);
+ aodiv.style.display = "block";
+}
+//]]>
+</script>
+</body>
+</html>
diff --git a/src/usr/local/www/status_queues.php b/src/usr/local/www/status_queues.php
new file mode 100644
index 0000000..42789bf
--- /dev/null
+++ b/src/usr/local/www/status_queues.php
@@ -0,0 +1,310 @@
+#!/usr/local/bin/php
+<?php
+/* $Id$ */
+/*
+ status_queues.php
+ Part of the pfSense project
+ Copyright (C) 2004, 2005 Scott Ullrich
+ Copyright (C) 2009 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/pfctl
+ pfSense_MODULE: shaper
+*/
+
+##|+PRIV
+##|*IDENT=page-status-trafficshaper-queues
+##|*NAME=Status: Traffic shaper: Queues page
+##|*DESCR=Allow access to the 'Status: Traffic shaper: Queues' page.
+##|*MATCH=status_queues.php*
+##|-PRIV
+
+header("Last-Modified: " . gmdate("D, j M Y H:i:s") . " GMT");
+header("Expires: " . gmdate("D, j M Y H:i:s", time()) . " GMT");
+header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP/1.1
+header("Pragma: no-cache"); // HTTP/1.0
+
+require("guiconfig.inc");
+class QueueStats {
+ public $queuename;
+ public $queuelength;
+ public $pps;
+ public $bandwidth;
+ public $borrows;
+ public $suspends;
+ public $drops;
+}
+if (!file_exists("{$g['varrun_path']}/qstats.pid") || !isvalidpid("{$g['varrun_path']}/qstats.pid")) {
+ /* Start in the background so we don't hang up the GUI */
+ mwexec_bg("/usr/local/sbin/qstats -p {$g['varrun_path']}/qstats.pid");
+ /* Give it a moment to start up */
+ sleep(1);
+}
+$fd = @fsockopen("unix://{$g['varrun_path']}/qstats");
+if (!$fd) {
+ $error = "Something wrong happened during communication with stat gathering";
+} else {
+ $stats = "";
+ while (!feof($fd)) {
+ $stats .= fread($fd, 4096);
+ }
+ fclose($fd);
+ @file_put_contents("{$g['tmp_path']}/qstats", $stats);
+ $altqstats = @parse_xml_config("{$g['tmp_path']}/qstats", array("altqstats"));
+ if ($altqstats == -1) {
+ $error = "No queue statistics could be read.";
+ }
+}
+if ($_REQUEST['getactivity']) {
+ $statistics = array();
+ $bigger_stat = 0;
+ $stat_type = $_REQUEST['stats'];
+ /* build the queue stats. */
+ foreach ($altqstats['queue'] as $q) {
+ statsQueues($q);
+ }
+ /* calculate the bigger amount of packets or bandwidth being moved through all queues. */
+ if ($stat_type == "0") {
+ foreach ($statistics as $q) {
+ if ($bigger_stat < $q->pps) {
+ $bigger_stat = $q->pps;
+ }
+ }
+ } else {
+ foreach ($statistics as $q) {
+ if ($bigger_stat < $q->bandwidth) {
+ $bigger_stat = $q->bandwidth;
+ }
+ }
+ }
+ $finscript = "";
+ foreach ($statistics as $q) {
+ if ($stat_type == "0") {
+ $packet_s = round(150 * (1 - $q->pps / $bigger_stat), 0);
+ } else {
+ $packet_s = round(150 * (1 - $q->bandwidth / $bigger_stat), 0);
+ }
+ if ($packet_s < 0) {
+ $packet_s = 0;
+ }
+ $finscript .= "jQuery('#queue{$q->queuename}widthb').width('{$packet_s}');";
+ $finscript .= "jQuery('#queue{$q->queuename}widtha').width('" . (150 - $packet_s) . "');";
+ $finscript .= "jQuery('#queue{$q->queuename}pps').val('" . number_format($q->pps, 1) . "');";
+ $finscript .= "jQuery('#queue{$q->queuename}bps').val('" . format_bits($q->bandwidth) . "');";
+ $finscript .= "jQuery('#queue{$q->queuename}borrows').val('{$q->borrows}');";
+ $finscript .= "jQuery('#queue{$q->queuename}suspends').val('{$q->suspends}');";
+ $finscript .= "jQuery('#queue{$q->queuename}drops').val('{$q->drops}');";
+ $finscript .= "jQuery('#queue{$q->queuename}length').val('{$q->queuelength}');";
+ }
+ unset($statistics, $altqstats);
+ header("Content-type: text/javascript");
+ echo $finscript;
+ exit;
+}
+$pgtitle = array(gettext("Status"), gettext("Traffic shaper"), gettext("Queues"));
+$shortcut_section = "trafficshaper";
+include("head.inc");
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php
+if (!is_array($config['shaper']['queue']) || count($config['shaper']['queue']) < 1) {
+ echo gettext("Traffic shaping is not configured.");
+ include("fend.inc");
+ echo "</body></html>";
+ exit;
+}
+?>
+<?php if (!$error): ?>
+<form action="status_queues.php" method="post">
+<script type="text/javascript">
+//<![CDATA[
+ function getqueueactivity() {
+ var url = "/status_queues.php";
+ var pars = "getactivity=yes&stats=" + jQuery("#selStatistic").val();
+ jQuery.ajax(
+ url,
+ {
+ type: 'post',
+ data: pars,
+ complete: activitycallback
+ });
+ }
+ function activitycallback(transport) {
+ setTimeout('getqueueactivity()', 5100);
+ }
+ jQuery(document).ready(function() {
+ setTimeout('getqueueactivity()', 150);
+ });
+//]]>
+</script>
+<?php endif; ?>
+<table width="100%" border="1" cellpadding="0" cellspacing="0" summary="status queues">
+<?php if ($error): ?>
+ <tr><td><?php echo $error; ?></td></tr>
+<?php else: ?>
+ <tr>
+ <td class="listhdr"><?=gettext("Queue"); ?></td>
+ <td class="listhdr">
+ <?=gettext("Statistics"); ?>
+ <select id="selStatistic">
+ <option value="0">PPS</option>
+ <option value="1">Bandwidth</option>
+ </select>
+ </td>
+ <td class="listhdr" width="1%"><?=gettext("PPS"); ?></td>
+ <td class="listhdr" width="1%"><?=gettext("Bandwidth"); ?></td>
+ <td class="listhdr" width="1%"><?=gettext("Borrows"); ?></td>
+ <td class="listhdr" width="1%"><?=gettext("Suspends"); ?></td>
+ <td class="listhdr" width="1%"><?=gettext("Drops"); ?></td>
+ <td class="listhdr" width="1%"><?=gettext("Length"); ?></td>
+ </tr>
+<?php
+ $if_queue_list = get_configured_interface_list_by_realif(false, true);
+ processQueues($altqstats, 0, "");
+?>
+<?php endif; ?>
+</table>
+<p>
+ <strong><span class="red"><?=gettext("Note"); ?>:</span></strong><br />
+ <?=gettext("Queue graphs take 5 seconds to sample data"); ?>.<br />
+ <?=gettext("You can configure the Traffic Shaper"); ?> <a href="/firewall_shaper_wizards.php"><?=gettext("here"); ?></a>.
+</p>
+<script type="text/javascript">
+//<![CDATA[
+ function StatsShowHide(classname) {
+ var firstrow = jQuery("." + classname).first();
+ if (firstrow.is(':visible')) {
+ jQuery("." + classname).hide();
+ } else {
+ jQuery("." + classname).show();
+ }
+ }
+//]]>
+</script>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
+<?php
+function processQueues($altqstats, $level, $parent_name) {
+ global $g;
+ global $if_queue_list;
+ $gray_value = 190 + $level * 10;
+ if ($gray_value > 250) {
+ $gray_value = 255;
+ }
+ $row_background = str_repeat(dechex($gray_value), 3);
+ $parent_name = $parent_name . " queuerow" . $altqstats['name'] . $altqstats['interface'];
+ $prev_if = $altqstats['interface'];
+ foreach ($altqstats['queue'] as $q) {
+ $if_name = "";
+ foreach ($if_queue_list as $oif => $real_name) {
+ if ($oif == $q['interface']) {
+ $if_name = $real_name;
+ break;
+ }
+ }
+ if ($prev_if != $q['interface']) {
+ echo "<tr><td colspan=\"8\" style=\"padding: 2px;\"><b>Interface ". htmlspecialchars(convert_real_interface_to_friendly_descr($q['interface'])) . "</b></td></tr>";
+ $prev_if = $q['interface'];
+ }
+?>
+ <tr class="<?php echo $parent_name?>">
+ <td bgcolor="#<?php echo $row_background?>" style="padding-left: <?php echo $level * 20?>px;">
+ <font color="#000000">
+ <?
+ if (strstr($q['name'], "root_")) {
+ echo "<a href=\"firewall_shaper.php?interface={$if_name}&amp;queue={$if_name}&amp;action=show\">Root queue</a>";
+ } else {
+ echo "<a href=\"firewall_shaper.php?interface={$if_name}&amp;queue={$q['name']}&amp;action=show\">" . htmlspecialchars($q['name']) . "</a>";
+ }
+ ?>
+ </font>
+ </td>
+<?php
+ $cpuUsage = 0;
+ echo "<td class=\"nowrap\" width=\"1%\" bgcolor=\"#{$row_background}\">";
+ echo "<img src='./themes/".$g['theme']."/images/misc/bar_left.gif' height='10' width='4' border='0' align='middle' alt='' />";
+ echo "<img src='./themes/".$g['theme']."/images/misc/bar_blue.gif' height='10' name='queue{$q['name']}{$q['interface']}widtha' id='queue{$q['name']}{$q['interface']}widtha' width='" . $cpuUsage . "' border='0' align='middle' alt='" . htmlspecialchars($q['name']) . "' />";
+ echo "<img src='./themes/".$g['theme']."/images/misc/bar_gray.gif' height='10' name='queue{$q['name']}{$q['interface']}widthb' id='queue{$q['name']}{$q['interface']}widthb' width='" . (150 - $cpuUsage) . "' border='0' align='middle' alt='" . htmlspecialchars($q['name']) . "' />";
+ echo "<img src='./themes/".$g['theme']."/images/misc/bar_right.gif' height='10' width='5' border='0' align='middle' alt='' /> ";
+ if (is_array($q['queue'])) {
+ echo "<a href=\"#\" onclick=\"StatsShowHide('queuerow{$q['name']}{$q['interface']}');return false\">+/-</a> ";
+ }
+ echo " </td>";
+ echo "<td width=\"1%\" bgcolor=\"#{$row_background}\"><input style='border: 0px solid white; background-color:#{$row_background}; color:#000000;width:70px;text-align:right;' size='10' name='queue{$q['name']}{$q['interface']}pps' id='queue{$q['name']}{$q['interface']}pps' value='(" . gettext("Loading") . ")' align='left' /></td>";
+ echo "<td width=\"1%\" bgcolor=\"#{$row_background}\"><input style='border: 0px solid white; background-color:#{$row_background}; color:#000000;width:80px;text-align:right;' size='10' name='queue{$q['name']}{$q['interface']}bps' id='queue{$q['name']}{$q['interface']}bps' value='' align='right' /></td>";
+ echo "<td width=\"1%\" bgcolor=\"#{$row_background}\"><input style='border: 0px solid white; background-color:#{$row_background}; color:#000000;width:70px;text-align:right;' size='10' name='queue{$q['name']}{$q['interface']}borrows' id='queue{$q['name']}{$q['interface']}borrows' value='' align='right' /></td>";
+ echo "<td width=\"1%\" bgcolor=\"#{$row_background}\"><input style='border: 0px solid white; background-color:#{$row_background}; color:#000000;width:70px;text-align:right;' size='10' name='queue{$q['name']}{$q['interface']}suspends' id='queue{$q['name']}{$q['interface']}suspends' value='' align='right' /></td>";
+ echo "<td width=\"1%\" bgcolor=\"#{$row_background}\"><input style='border: 0px solid white; background-color:#{$row_background}; color:#000000;width:70px;text-align:right;' size='10' name='queue{$q['name']}{$q['interface']}drops' id='queue{$q['name']}{$q['interface']}drops' value='' align='right' /></td>";
+ echo "<td width=\"1%\" bgcolor=\"#{$row_background}\"><input style='border: 0px solid white; background-color:#{$row_background}; color:#000000;width:70px;text-align:right;' size='10' name='queue{$q['name']}{$q['interface']}length' id='queue{$q['name']}{$q['interface']}length' value='' align='right' /></td>";
+?>
+ </tr>
+<?php
+ if (is_array($q['queue'])) {
+ processQueues($q, $level + 1, $parent_name);
+ }
+ };
+}
+function statsQueues($xml) {
+ global $statistics;
+
+ $current = new QueueStats();
+ $child = new QueueStats();
+ $current->queuename = $xml['name'] . $xml['interface'];
+ $current->queuelength = $xml['qlength'];
+ $current->pps = $xml['measured'];
+ $current->bandwidth = $xml['measuredspeedint'];
+ $current->borrows = intval($xml['borrows']);
+ $current->suspends = intval($xml['suspends']);
+ $current->drops = intval($xml['droppedpkts']);
+ if (is_array($xml['queue'])) {
+ foreach ($xml['queue'] as $q) {
+ $child = statsQueues($q);
+ $current->pps += $child->pps;
+ $current->bandwidth += $child->bandwidth;
+ $current->borrows += $child->borrows;
+ $current->suspends += $child->suspends;
+ $current->drops += $child->drops;
+ }
+ }
+ unset($child);
+ $statistics[] = $current;
+ return $current;
+}
+function format_bits($bits) {
+ if ($bits >= 1000000000) {
+ return sprintf("%.2f Gbps", $bits/1000000000);
+ } else if ($bits >= 1000000) {
+ return sprintf("%.2f Mbps", $bits/1000000);
+ } else if ($bits >= 1000) {
+ return sprintf("%.2f Kbps", $bits/1000);
+ } else {
+ return sprintf("%d bps", $bits);
+ }
+}
+?>
diff --git a/src/usr/local/www/status_rrd_graph.php b/src/usr/local/www/status_rrd_graph.php
new file mode 100644
index 0000000..ae9c709
--- /dev/null
+++ b/src/usr/local/www/status_rrd_graph.php
@@ -0,0 +1,834 @@
+<?php
+/* $Id$ */
+/*
+ status_rrd_graph.php
+ Part of pfSense
+ Copyright (C) 2007 Seth Mos <seth.mos@dds.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-status-rrdgraphs
+##|*NAME=Status: RRD Graphs page
+##|*DESCR=Allow access to the 'Status: RRD Graphs' page.
+##|*MATCH=status_rrd_graph.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require_once("rrd.inc");
+
+unset($input_errors);
+
+/* if the rrd graphs are not enabled redirect to settings page */
+if (!isset($config['rrd']['enable'])) {
+ header("Location: status_rrd_graph_settings.php");
+}
+
+$rrddbpath = "/var/db/rrd/";
+chdir($rrddbpath);
+$databases = glob("*.rrd");
+
+
+if ($_GET['cat']) {
+ $curcat = htmlspecialchars($_GET['cat']);
+} else {
+ if (!empty($config['rrd']['category'])) {
+ $curcat = $config['rrd']['category'];
+ } else {
+ $curcat = "system";
+ }
+}
+
+if ($_GET['zone']) {
+ $curzone = $_GET['zone'];
+} else {
+ $curzone = '';
+}
+
+if ($_GET['period']) {
+ $curperiod = $_GET['period'];
+} else {
+ if (!empty($config['rrd']['period'])) {
+ $curperiod = $config['rrd']['period'];
+ } else {
+ $curperiod = "absolute";
+ }
+}
+
+if ($_GET['option']) {
+ $curoption = $_GET['option'];
+} else {
+ switch ($curcat) {
+ case "system":
+ $curoption = "processor";
+ break;
+ case "queues":
+ $curoption = "queues";
+ break;
+ case "queuedrops":
+ $curoption = "queuedrops";
+ break;
+ case "quality":
+ foreach ($databases as $database) {
+ if (preg_match("/[-]quality\.rrd/i", $database)) {
+ /* pick off the 1st database we find that matches the quality graph */
+ $name = explode("-", $database);
+ $curoption = "$name[0]";
+ continue 2;
+ }
+ }
+ case "wireless":
+ foreach ($databases as $database) {
+ if (preg_match("/[-]wireless\.rrd/i", $database)) {
+ /* pick off the 1st database we find that matches the wireless graph */
+ $name = explode("-", $database);
+ $curoption = "$name[0]";
+ continue 2;
+ }
+ }
+ case "cellular":
+ foreach ($databases as $database) {
+ if (preg_match("/[-]cellular\.rrd/i", $database)) {
+ /* pick off the 1st database we find that matches the celullar graph */
+ $name = explode("-", $database);
+ $curoption = "$name[0]";
+ continue 2;
+ }
+ }
+ case "vpnusers":
+ foreach ($databases as $database) {
+ if (preg_match("/[-]vpnusers\.rrd/i", $database)) {
+ /* pick off the 1st database we find that matches the VPN graphs */
+ $name = explode("-", $database);
+ $curoption = "$name[0]";
+ continue 2;
+ }
+ }
+ case "captiveportal":
+ $curoption = "allgraphs";
+ break;
+ case "ntpd":
+ if (isset($config['ntpd']['statsgraph'])) {
+ $curoption = "allgraphs";
+ } else {
+ $curoption = "processor";
+ $curcat = "system";
+ }
+ break;
+ default:
+ $curoption = "wan";
+ break;
+ }
+}
+
+$now = time();
+if ($curcat == "custom") {
+ if (is_numeric($_GET['start'])) {
+ if ($start < ($now - (3600 * 24 * 365 * 5))) {
+ $start = $now - (8 * 3600);
+ }
+ $start = $_GET['start'];
+ } else if ($_GET['start']) {
+ $start = strtotime($_GET['start']);
+ if ($start === FALSE || $start === -1) {
+ $input_errors[] = gettext("Invalid start date/time:") . " '{$_GET['start']}'";
+ $start = $now - (8 * 3600);
+ }
+ } else {
+ $start = $now - (8 * 3600);
+ }
+}
+
+if (is_numeric($_GET['end'])) {
+ $end = $_GET['end'];
+} else if ($_GET['end']) {
+ $end = strtotime($_GET['end']);
+ if ($end === FALSE || $end === -1) {
+ $input_errors[] = gettext("Invalid end date/time:") . " '{$_GET['end']}'";
+ $end = $now;
+ }
+} else {
+ $end = $now;
+}
+
+/* this should never happen */
+if ($end < $start) {
+ log_error("start $start is smaller than end $end");
+ $end = $now;
+}
+
+$seconds = $end - $start;
+
+$styles = array('inverse' => gettext('Inverse'),
+ 'absolute' => gettext('Absolute'));
+
+// Set default and override later
+$curstyle = "inverse";
+
+if ($_GET['style']) {
+ foreach ($styles as $style) {
+ if (strtoupper($style) == strtoupper($_GET['style'])) {
+ $curstyle = $_GET['style'];
+ }
+ }
+} else {
+ if (!empty($config['rrd']['style'])) {
+ $curstyle = $config['rrd']['style'];
+ } else {
+ $curstyle = "inverse";
+ }
+}
+
+/* sort names reverse so WAN comes first */
+rsort($databases);
+
+/* these boilerplate databases are required for the other menu choices */
+$dbheader = array("allgraphs-traffic.rrd",
+ "allgraphs-quality.rrd",
+ "allgraphs-wireless.rrd",
+ "allgraphs-cellular.rrd",
+ "allgraphs-vpnusers.rrd",
+ "allgraphs-packets.rrd",
+ "system-allgraphs.rrd",
+ "system-throughput.rrd",
+ "outbound-quality.rrd",
+ "outbound-packets.rrd",
+ "outbound-traffic.rrd");
+
+/* additional menu choices for the custom tab */
+$dbheader_custom = array("system-throughput.rrd");
+
+foreach ($databases as $database) {
+ if (stristr($database, "-wireless")) {
+ $wireless = true;
+ }
+ if (stristr($database, "-queues")) {
+ $queues = true;
+ }
+ if (stristr($database, "-cellular") && !empty($config['ppps'])) {
+ $cellular = true;
+ }
+ if (stristr($database, "-vpnusers")) {
+ $vpnusers = true;
+ }
+ if (stristr($database, "captiveportal-") && is_array($config['captiveportal'])) {
+ $captiveportal = true;
+ }
+ if (stristr($database, "ntpd") && isset($config['ntpd']['statsgraph'])) {
+ $ntpd = true;
+ }
+}
+/* append the existing array to the header */
+$ui_databases = array_merge($dbheader, $databases);
+$custom_databases = array_merge($dbheader_custom, $databases);
+
+$graphs = array("eighthour", "day", "week", "month", "quarter", "year", "fouryear");
+$periods = array("absolute" => gettext("Absolute Timespans"), "current" => gettext("Current Period"), "previous" => gettext("Previous Period"));
+$graph_length = array(
+ "eighthour" => 28800,
+ "day" => 86400,
+ "week" => 604800,
+ "month" => 2678400,
+ "quarter" => 7948800,
+ "year" => 31622400,
+ "fouryear" => 126230400);
+
+$pgtitle = array(gettext("Status"), gettext("RRD Graphs"));
+
+$closehead = false;
+
+/* Load all CP zones */
+if ($captiveportal && is_array($config['captiveportal'])) {
+ $cp_zones_tab_array = array();
+ foreach ($config['captiveportal'] as $cpkey => $cp) {
+ if (!isset($cp['enable'])) {
+ continue;
+ }
+
+ if ($curzone == '') {
+ $tabactive = true;
+ $curzone = $cpkey;
+ } elseif ($curzone == $cpkey) {
+ $tabactive = true;
+ } else {
+ $tabactive = false;
+ }
+
+ $cp_zones_tab_array[] = array($cp['zone'], $tabactive, "status_rrd_graph.php?cat=captiveportal&zone=$cpkey");
+ }
+}
+
+include("head.inc");
+?>
+
+<?php if ($curcat === "custom") { ?>
+ <link rel="stylesheet" type="text/css" href="/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css" />
+ <?php if (file_exists("{$g['www_path']}/themes/{$g['theme']}/jquery-ui-1.11.1.css")) { ?>
+ <link rel="stylesheet" type="text/css" href="/themes/<?= $g['theme'] ?>/jquery-ui-1.11.1.css" />
+ <?php } else { ?>
+ <link rel="stylesheet" type="text/css" href="/javascript/jquery/jquery-ui-1.11.1.css" />
+ <?php } ?>
+ <script type="text/javascript" src="/javascript/jquery-ui-timepicker-addon/js/jquery-ui-timepicker-addon.js"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+ jQuery(function ($) {
+ var options = {
+ dateFormat: 'mm/dd/yy',
+ timeFormat: 'hh:mm:ss',
+ showSecond: true
+ };
+ $("#startDateTime").datetimepicker(options);
+ $("#endDateTime").datetimepicker(options);
+ });
+ //]]>
+ </script>
+<?php } ?>
+
+<?php
+
+function get_dates($curperiod, $graph) {
+ global $graph_length;
+ $now = time();
+ $end = $now;
+
+ if ($curperiod == "absolute") {
+ $start = $end - $graph_length[$graph];
+ } else {
+ $curyear = date('Y', $now);
+ $curmonth = date('m', $now);
+ $curweek = date('W', $now);
+ $curweekday = date('N', $now) - 1; // We want to start on monday
+ $curday = date('d', $now);
+ $curhour = date('G', $now);
+
+ switch ($curperiod) {
+ case "previous":
+ $offset = -1;
+ break;
+ default:
+ $offset = 0;
+ }
+ switch ($graph) {
+ case "eighthour":
+ if ($curhour < 24) {
+ $starthour = 16;
+ }
+ if ($curhour < 16) {
+ $starthour = 8;
+ }
+ if ($curhour < 8) {
+ $starthour = 0;
+ }
+
+ switch ($offset) {
+ case 0:
+ $houroffset = $starthour;
+ break;
+ default:
+ $houroffset = $starthour + ($offset * 8);
+ break;
+ }
+ $start = mktime($houroffset, 0, 0, $curmonth, $curday, $curyear);
+ if ($offset != 0) {
+ $end = mktime(($houroffset + 8), 0, 0, $curmonth, $curday, $curyear);
+ }
+ break;
+ case "day":
+ $start = mktime(0, 0, 0, $curmonth, ($curday + $offset), $curyear);
+ if ($offset != 0) {
+ $end = mktime(0, 0, 0, $curmonth, (($curday + $offset) + 1), $curyear);
+ }
+ break;
+ case "week":
+ switch ($offset) {
+ case 0:
+ $weekoffset = 0;
+ break;
+ default:
+ $weekoffset = ($offset * 7) - 7;
+ break;
+ }
+ $start = mktime(0, 0, 0, $curmonth, (($curday - $curweekday) + $weekoffset), $curyear);
+ if ($offset != 0) {
+ $end = mktime(0, 0, 0, $curmonth, (($curday - $curweekday) + $weekoffset + 7), $curyear);
+ }
+ break;
+ case "month":
+ $start = mktime(0, 0, 0, ($curmonth + $offset), 0, $curyear);
+ if ($offset != 0) {
+ $end = mktime(0, 0, 0, (($curmonth + $offset) + 1), 0, $curyear);
+ }
+ break;
+ case "quarter":
+ $start = mktime(0, 0, 0, (($curmonth - 2) + $offset), 0, $curyear);
+ if ($offset != 0) {
+ $end = mktime(0, 0, 0, (($curmonth + $offset) + 1), 0, $curyear);
+ }
+ break;
+ case "year":
+ $start = mktime(0, 0, 0, 1, 0, ($curyear + $offset));
+ if ($offset != 0) {
+ $end = mktime(0, 0, 0, 1, 0, (($curyear + $offset) +1));
+ }
+ break;
+ case "fouryear":
+ $start = mktime(0, 0, 0, 1, 0, (($curyear - 3) + $offset));
+ if ($offset != 0) {
+ $end = mktime(0, 0, 0, 1, 0, (($curyear + $offset) +1));
+ }
+ break;
+ }
+ }
+ // echo "start $start ". date('l jS \of F Y h:i:s A', $start) .", end $end ". date('l jS \of F Y h:i:s A', $end) ."<br />";
+ $dates = array();
+ $dates['start'] = $start;
+ $dates['end'] = $end;
+ return $dates;
+}
+
+?>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors && count($input_errors)) { print_input_errors($input_errors); } ?>
+<form name="form1" action="status_rrd_graph.php" method="get">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="rrd graphs">
+ <tr>
+ <td>
+ <input type="hidden" name="cat" value="<?php echo "$curcat"; ?>" />
+ <?php
+ $tab_array = array();
+ if ($curcat == "system") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("System"), $tabactive, "status_rrd_graph.php?cat=system");
+ if ($curcat == "traffic") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Traffic"), $tabactive, "status_rrd_graph.php?cat=traffic");
+ if ($curcat == "packets") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Packets"), $tabactive, "status_rrd_graph.php?cat=packets");
+ if ($curcat == "quality") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Quality"), $tabactive, "status_rrd_graph.php?cat=quality");
+ if ($queues) {
+ if ($curcat == "queues") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Queues"), $tabactive, "status_rrd_graph.php?cat=queues");
+ if ($curcat == "queuedrops") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("QueueDrops"), $tabactive, "status_rrd_graph.php?cat=queuedrops");
+ }
+ if ($wireless) {
+ if ($curcat == "wireless") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Wireless"), $tabactive, "status_rrd_graph.php?cat=wireless");
+ }
+ if ($cellular) {
+ if ($curcat == "cellular") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Cellular"), $tabactive, "status_rrd_graph.php?cat=cellular");
+ }
+ if ($vpnusers) {
+ if ($curcat == "vpnusers") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array("VPN", $tabactive, "status_rrd_graph.php?cat=vpnusers");
+ }
+ if ($captiveportal) {
+ if ($curcat == "captiveportal") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array("Captive Portal", $tabactive, "status_rrd_graph.php?cat=captiveportal");
+ }
+ if ($ntpd) {
+ if ($curcat == "ntpd") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array("NTP", $tabactive, "status_rrd_graph.php?cat=ntpd");
+ }
+ if ($curcat == "custom") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Custom"), $tabactive, "status_rrd_graph.php?cat=custom");
+ if ($curcat == "settings") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Settings"), $tabactive, "status_rrd_graph_settings.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+<?php if ($curcat == "captiveportal") : ?>
+ <tr>
+ <td class="tabnavtbl">
+ <?php display_top_tabs($cp_zones_tab_array); ?>
+ </td>
+ </tr>
+<?php endif; ?>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="main area">
+ <tr>
+ <td colspan="2" class="list"><p><b><?=gettext("Note: Change of color and/or style may not take effect until the next refresh");?></b></p></td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list">
+ <?=gettext("Graphs:");?>
+ <?php if (!empty($curzone)): ?>
+ <input type="hidden" name="zone" value="<?= htmlspecialchars($curzone) ?>" />
+ <?php endif; ?>
+ <select name="option" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
+ <?php
+ if ($curcat == "custom") {
+ foreach ($custom_databases as $db => $database) {
+ $optionc = explode("-", $database);
+ $friendly = convert_friendly_interface_to_friendly_descr(strtolower($optionc[0]));
+ if (empty($friendly)) {
+ $friendly = $optionc[0];
+ }
+ $search = array("-", ".rrd", $optionc[0]);
+ $replace = array(" :: ", "", $friendly);
+ echo "<option value=\"{$database}\"";
+ $prettyprint = ucwords(str_replace($search, $replace, $database));
+ if ($curoption == $database) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($prettyprint) . "</option>\n";
+ }
+ }
+ foreach ($ui_databases as $db => $database) {
+ if (!preg_match("/($curcat)/i", $database)) {
+ continue;
+ }
+
+ if (($curcat == "captiveportal") && !empty($curzone) && !preg_match("/captiveportal-{$curzone}/i", $database)) {
+ continue;
+ }
+
+ $optionc = explode("-", $database);
+ $search = array("-", ".rrd", $optionc);
+ $replace = array(" :: ", "", $friendly);
+
+ switch ($curcat) {
+ case "captiveportal":
+ $optionc = str_replace($search, $replace, $optionc[2]);
+ echo "<option value=\"$optionc\"";
+ $prettyprint = ucwords(str_replace($search, $replace, $optionc));
+ break;
+ case "system":
+ $optionc = str_replace($search, $replace, $optionc[1]);
+ echo "<option value=\"$optionc\"";
+ $prettyprint = ucwords(str_replace($search, $replace, $optionc));
+ break;
+ default:
+ /* Deduce a interface if possible and use the description */
+ $optionc = "$optionc[0]";
+ $friendly = convert_friendly_interface_to_friendly_descr(strtolower($optionc));
+ if (empty($friendly)) {
+ $friendly = $optionc;
+ }
+ $search = array("-", ".rrd", $optionc);
+ $replace = array(" :: ", "", $friendly);
+ echo "<option value=\"$optionc\"";
+ $prettyprint = ucwords(str_replace($search, $replace, $friendly));
+ }
+ if ($curoption == $optionc) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($prettyprint) . "</option>\n";
+ }
+ ?>
+ </select>
+
+ <?=gettext("Style:");?>
+ <select name="style" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
+ <?php
+ foreach ($styles as $style => $styled) {
+ echo "<option value=\"$style\"";
+ if ($style == $curstyle) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($styled) . "</option>\n";
+ }
+ ?>
+ </select>
+
+<?php
+ if ($curcat == "custom") {
+ // Custom tab displays start and end time selectors.
+ $tz = date_default_timezone_get();
+ $tz_msg = gettext("Enter date and/or time. Current timezone:") . " $tz";
+ $start_fmt = strftime("%m/%d/%Y %H:%M:%S", $start);
+ $end_fmt = strftime("%m/%d/%Y %H:%M:%S", $end);
+?>
+ <?=gettext("Start:");?>
+ <input id="startDateTime" title="<?= htmlentities($tz_msg); ?>." type="text" name="start" class="formfld unknown" size="24" value="<?= htmlentities($start_fmt); ?>" />
+ <?=gettext("End:");?>
+ <input id="endDateTime" title="<?= htmlentities($tz_msg); ?>." type="text" name="end" class="formfld unknown" size="24" value="<?= htmlentities($end_fmt); ?>" />
+ <input type="submit" name="Submit" value="<?=gettext("Go"); ?>" />
+<?php
+ } else {
+ // Not on the custom tab - show the Period selector
+?>
+ <?=gettext("Period:");?>
+ <select name="period" class="formselect" style="z-index: -10;" onchange="document.form1.submit()">
+ <?php
+ foreach ($periods as $period => $value) {
+ echo "<option value=\"$period\"";
+ if ($period == $curperiod) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($value) . "</option>\n";
+ }
+ ?>
+ </select>
+<?php
+ }
+?>
+ </td>
+ </tr>
+<?php
+ if ($curcat == "custom") {
+ // Insert the chosen graph
+ $curdatabase = $curoption;
+ $graph = "custom-$curdatabase";
+ if (in_array($curdatabase, $custom_databases)) {
+ $id = "{$graph}-{$curoption}-{$curdatabase}";
+ $id = preg_replace('/\./', '_', $id);
+
+ echo "<tr><td colspan=\"2\" class=\"list\">\n";
+ echo "<img border=\"0\" name=\"{$id}\" ";
+ echo "id=\"{$id}\" alt=\"$prettydb Graph\" ";
+ echo "src=\"status_rrd_graph_img.php?start={$start}&amp;end={$end}&amp;database={$curdatabase}&amp;style={$curstyle}&amp;graph={$graph}\" />\n";
+ echo "<br /><hr /><br />\n";
+ echo "</td></tr>\n";
+ }
+ } else {
+ // Insert each of the graphs for the various set time periods
+ foreach ($graphs as $graph) {
+ /* check which databases are valid for our category */
+ foreach ($ui_databases as $curdatabase) {
+ if (!preg_match("/($curcat)/i", $curdatabase)) {
+ continue;
+ }
+
+ if (($curcat == "captiveportal") && !empty($curzone) && !preg_match("/captiveportal-{$curzone}/i", $curdatabase)) {
+ continue;
+ }
+
+ $optionc = explode("-", $curdatabase);
+ $search = array("-", ".rrd", $optionc);
+ $replace = array(" :: ", "", $friendly);
+ switch ($curoption) {
+ case "outbound":
+ /* make sure we do not show the placeholder databases in the outbound view */
+ if ((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
+ continue 2;
+ }
+ /* only show interfaces with a gateway */
+ $optionc = "$optionc[0]";
+ if (!interface_has_gateway($optionc)) {
+ if (!isset($gateways_arr)) {
+ if (preg_match("/quality/i", $curdatabase)) {
+ $gateways_arr = return_gateways_array();
+ } else {
+ $gateways_arr = array();
+ }
+ }
+ $found_gateway = false;
+ foreach ($gateways_arr as $gw) {
+ if ($gw['name'] == $optionc) {
+ $found_gateway = true;
+ break;
+ }
+ }
+ if (!$found_gateway) {
+ continue 2;
+ }
+ }
+ if (!preg_match("/(^$optionc-|-$optionc\\.)/i", $curdatabase)) {
+ continue 2;
+ }
+ break;
+ case "allgraphs":
+ /* make sure we do not show the placeholder databases in the all view */
+ if ((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
+ continue 2;
+ }
+ break;
+ default:
+ /* just use the name here */
+ if (!preg_match("/(^$curoption-|-$curoption\\.)/i", $curdatabase)) {
+ continue 2;
+ }
+ }
+ if (in_array($curdatabase, $ui_databases)) {
+ $id = "{$graph}-{$curoption}-{$curdatabase}";
+ $id = preg_replace('/\./', '_', $id);
+
+ $dates = get_dates($curperiod, $graph);
+ $start = $dates['start'];
+ $end = $dates['end'];
+ echo "<tr><td colspan=\"2\" class=\"list\">\n";
+ echo "<img border=\"0\" name=\"{$id}\" ";
+ echo "id=\"{$id}\" alt=\"$prettydb Graph\" ";
+ echo "src=\"status_rrd_graph_img.php?start={$start}&amp;end={$end}&amp;database={$curdatabase}&amp;style={$curstyle}&amp;graph={$graph}\" />\n";
+ echo "<br /><hr /><br />\n";
+ echo "</td></tr>\n";
+ }
+ }
+ }
+ }
+?>
+ <tr>
+ <td colspan="2" class="list">
+ <script type="text/javascript">
+ //<![CDATA[
+ function update_graph_images() {
+ //alert('updating');
+ var randomid = Math.floor(Math.random()*11);
+ <?php
+ foreach ($graphs as $graph) {
+ /* check which databases are valid for our category */
+ foreach ($ui_databases as $curdatabase) {
+ if (!stristr($curdatabase, $curcat)) {
+ continue;
+ }
+ $optionc = explode("-", $curdatabase);
+ $search = array("-", ".rrd", $optionc);
+ $replace = array(" :: ", "", $friendly);
+ switch ($curoption) {
+ case "outbound":
+ /* make sure we do not show the placeholder databases in the outbound view */
+ if ((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
+ continue 2;
+ }
+ /* only show interfaces with a gateway */
+ $optionc = "$optionc[0]";
+ if (!interface_has_gateway($optionc)) {
+ if (!isset($gateways_arr)) {
+ if (preg_match("/quality/i", $curdatabase)) {
+ $gateways_arr = return_gateways_array();
+ } else {
+ $gateways_arr = array();
+ }
+ }
+ $found_gateway = false;
+ foreach ($gateways_arr as $gw) {
+ if ($gw['name'] == $optionc) {
+ $found_gateway = true;
+ break;
+ }
+ }
+ if (!$found_gateway) {
+ continue 2;
+ }
+ }
+ if (!preg_match("/(^$optionc-|-$optionc\\.)/i", $curdatabase)) {
+ continue 2;
+ }
+ break;
+ case "allgraphs":
+ /* make sure we do not show the placeholder databases in the all view */
+ if ((stristr($curdatabase, "outbound")) || (stristr($curdatabase, "allgraphs"))) {
+ continue 2;
+ }
+ break;
+ default:
+ /* just use the name here */
+ if (!preg_match("/(^$curoption-|-$curoption\\.)/i", $curdatabase)) {
+ continue 2;
+ }
+ }
+ $dates = get_dates($curperiod, $graph);
+ $start = $dates['start'];
+ if ($curperiod == "current") {
+ $end = $dates['end'];
+ }
+ /* generate update events utilizing jQuery('') feature */
+ $id = "{$graph}-{$curoption}-{$curdatabase}";
+ $id = preg_replace('/\./', '_', $id);
+
+ echo "\n";
+ echo "\t\tjQuery('#{$id}').attr('src','status_rrd_graph_img.php?start={$start}&graph={$graph}&database={$curdatabase}&style={$curstyle}&tmp=' + randomid);\n";
+ }
+ }
+ ?>
+ window.setTimeout('update_graph_images()', 355000);
+ }
+ window.setTimeout('update_graph_images()', 355000);
+ //]]>
+ </script>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_rrd_graph_img.php b/src/usr/local/www/status_rrd_graph_img.php
new file mode 100644
index 0000000..d28472f
--- /dev/null
+++ b/src/usr/local/www/status_rrd_graph_img.php
@@ -0,0 +1,1278 @@
+<?php
+/* $Id$ */
+/*
+ status_rrd_graph_img.php
+ Part of pfSense
+ Copyright (C) 2009 Seth Mos <seth.mos@dds.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/rm /usr/local/bin/rrdtool
+ pfSense_MODULE: system
+*/
+
+require_once("globals.inc");
+require_once("guiconfig.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("rrd.inc");
+
+global $g;
+
+$pgtitle = array(gettext("System"), gettext("RRD Graphs"), gettext("Image viewer"));
+
+if ($_GET['database']) {
+ $curdatabase = basename($_GET['database']);
+ $curdatabase = str_replace(array("<", ">", ";", "&", "'", '"'), "", htmlspecialchars_decode($curdatabase, ENT_QUOTES | ENT_HTML401));
+} else {
+ $curdatabase = "wan-traffic.rrd";
+}
+
+if ($_GET['style']) {
+ $curstyle = $_GET['style'];
+} else {
+ $curstyle = "inverse";
+}
+
+/* this is used for temp name */
+if ($_GET['graph']) {
+ $curgraph = str_replace(array("<", ">", ";", "&", "'", '"', '.', '/'), "", htmlspecialchars_decode($_GET['graph'], ENT_QUOTES | ENT_HTML401));
+} else {
+ $curgraph = "custom";
+}
+
+$now = time();
+
+if (is_numeric($_GET['start'])) {
+ $start = $_GET['start'];
+} else {
+ $start = $now - (8 * 3600);
+}
+
+if (is_numeric($_GET['end'])) {
+ $end = $_GET['end'];
+} else {
+ $end = $now;
+}
+
+/* this should never happen */
+if ($end < $start) {
+ log_error("start $start is smaller than end $end");
+ $end = $now;
+}
+
+$seconds = $end - $start;
+
+$scales = array();
+$scales[14400] = "MINUTE:5:MINUTE:10:MINUTE:30:0:%H%:%M";
+$scales[57600] = "MINUTE:30:HOUR:1:HOUR:1:0:%H";
+$scales[172800] = "HOUR:1:HOUR:6:HOUR:2:0:%H";
+$scales[691200] = "HOUR:2:HOUR:12:DAY:1:0:%D %d";
+$scales[2764800] = "DAY:1:WEEK:1:WEEK:1:0:Week %W";
+$scales[16070400] = "WEEK:1:MONTH:1:MONTH:1:0:%b";
+$scales[42854400] = "MONTH:1:MONTH:1:MONTH:1:0:%b";
+
+$archives = array();
+$archives[1] = 1200;
+$archives[5] = 720;
+$archives[60] = 1860;
+$archives[1440] = 2284;
+
+$defOptions = array(
+ 'to' => 1,
+ 'parts' => 1,
+ 'precision' => 'minute',
+ 'distance' => FALSE,
+ 'separator' => ', '
+);
+
+/* always set the average to the highest value as a fallback */
+$average = 1440 * 60;
+foreach ($archives as $rra => $value) {
+ $archivestart = $now - ($rra * 60 * $value);
+ if ($archivestart <= $start) {
+ $average = $rra * 60;
+ break;
+ }
+}
+
+foreach ($scales as $scalelength => $value) {
+ if ($scalelength >= $seconds) {
+ $scale = $value;
+ break;
+ }
+}
+
+// log_error("start $start, end $end, archivestart $archivestart, average $average, scale $scale, seconds $seconds");
+
+/* Deduce a interface if possible and use the description */
+$curif = explode("-", $curdatabase);
+$curif = "$curif[0]";
+$friendly = convert_friendly_interface_to_friendly_descr(strtolower($curif));
+if ($friendly == "") {
+ $friendly = $curif;
+}
+$search = array("-", ".rrd", $curif);
+$replace = array(" :: ", "", $friendly);
+$prettydb = ucwords(str_replace($search, $replace, $curdatabase));
+
+$rrddbpath = "/var/db/rrd/";
+$rrdtmppath = "/tmp/";
+$rrdtool = "/usr/bin/nice -n20 /usr/local/bin/rrdtool";
+$uptime = "/usr/bin/uptime";
+$sed = "/usr/bin/sed";
+
+$havg = timeDiff($average, $defOptions);
+$hperiod = timeDiff($seconds, $defOptions);
+$data = true;
+
+/* Don't leave it up to RRD Tool to select the RRA and resolution to use. */
+/* Specify the RRA and resolution to use per the graph havg value. */
+switch ($havg) {
+ case "1 minute": $step = 60; break;
+ case "5 minutes": $step = 300; break;
+ case "1 hour": $step = 3600; break;
+ case "1 day": $step = 86400; break;
+ default: $step = 0; break;
+}
+
+$rrddbpath = "/var/db/rrd/";
+chdir($rrddbpath);
+$databases = glob("*.rrd");
+rsort($databases);
+
+/* compare bytes/sec counters, divide bps by 8 */
+read_altq_config();
+if ($altq_list_queues[$curif]) {
+ $altq =& $altq_list_queues[$curif];
+ switch ($altq->GetBwscale()) {
+ case "Gb":
+ $factor = 1024 * 1024 * 1024;
+ break;
+ case "Mb":
+ $factor = 1024 * 1024;
+ break;
+ case "Kb":
+ $factor = 1024;
+ break;
+ case "b":
+ default:
+ $factor = 1;
+ break;
+ }
+ $upstream = (($altq->GetBandwidth()*$factor)/8);
+ if ($upstream != 0) {
+ $downstream = $upstream; /* XXX: Ugly hack */
+ } else {
+ $downstream = $upstream = 12500000;
+ }
+ $upif = $curif;
+ $downif = "lan"; /* XXX should this be set to something else?! */
+} else {
+ $altq = null;
+ $downstream = 12500000;
+ $upstream = 12500000;
+ $upif = "wan";
+ $downif = "lan";
+}
+
+$speedlimit = ($upstream + $downstream);
+
+/* Set default colors explicitly, the theme can then override them below.
+ This prevents missing colors in themes from crashing the graphs. */
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00', '990000', '0000FF', '000000', 'DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00', '990000', '0000FF', 'DD9B00', '000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00', '990000', '0000FF', '666666', 'DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF', '00E344', 'FF0000', '000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000', '7B0000', '0080FF', '00E344', 'FF0000', '2217AA', 'FFC875', 'FF9900', 'CC0000');
+$colorqueuesdown = array('000000', '7B7B7B', '999999', 'BBBBBB', 'CCCCCC', 'D9D9D9', 'EEEEEE', 'FFFFFF', 'CCCCCC');
+
+$colorqueuesdropup = array('000000', '7B0000', '0080FF', '00E344', 'FF0000', '2217AA', 'FFC875', 'FF9900', 'CC0000');
+$colorqueuesdropdown = array('000000', '7B7B7B', '999999', 'BBBBBB', 'CCCCCC', 'D9D9D9', 'EEEEEE', 'FFFFFF', 'CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000', 'a83c3c', 'b36666', 'bd9090', 'cccccc', '000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333', 'a83c3c', '999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* NTPD stats offset, clk jit, sys jit, wander */
+$colorntpd = array('0080FF', '00E344', 'FF0000', '000000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+/* select theme colors if the inclusion file exists */
+$rrdcolors = "{$g['www_path']}/themes/{$g['theme']}/rrdcolors.inc.php";
+if (file_exists($rrdcolors)) {
+ include($rrdcolors);
+} else {
+ log_error(sprintf(gettext("rrdcolors.inc.php for theme %s does not exist, using defaults!"), $g['theme']));
+}
+
+switch ($curstyle) {
+ case "absolute":
+ $multiplier = 1;
+ $AREA = "LINE1";
+ break;
+ default:
+ $multiplier = -1;
+ $AREA = "AREA";
+ break;
+}
+
+function timeDiff($time, $opt = array()) {
+ // The default values
+ $defOptions = array(
+ 'to' => 0,
+ 'parts' => 1,
+ 'precision' => 'second',
+ 'distance' => TRUE,
+ 'separator' => ', '
+ );
+ $opt = array_merge($defOptions, $opt);
+ // Default to current time if no to point is given
+ (!$opt['to']) && ($opt['to'] = time());
+ // Init an empty string
+ $str = '';
+ // To or From computation
+ $diff = ($opt['to'] > $time) ? $opt['to'] - $time : $time - $opt['to'];
+ // An array of label => periods of seconds;
+ $periods = array(
+ 'decade' => 315569260,
+ 'year' => 31539600,
+ 'month' => 2629744,
+ 'week' => 604800,
+ 'day' => 86400,
+ 'hour' => 3600,
+ 'minute' => 60,
+ 'second' => 1
+ );
+ // 31539600, 31556926, 31622400
+ // Round to precision
+ if ($opt['precision'] != 'second') {
+ $diff = round(($diff / $periods[$opt['precision']])) * $periods[$opt['precision']];
+ }
+ // Report the value is 'less than 1 ' precision period away
+ (0 == $diff) && ($str = 'less than 1 ' . $opt['precision']);
+ // Loop over each period
+ foreach ($periods as $label => $value) {
+ // Stitch together the time difference string
+ (($x = round($diff / $value)) && $opt['parts']--) && $str .= ($str ? $opt['separator'] : '') . ($x .' '. $label. ($x > 1 ? 's' : ''));
+ // Stop processing if no more parts are going to be reported.
+ if ($opt['parts'] == 0 || $label == $opt['precision']) {
+ break;
+ }
+ // Get ready for the next pass
+ $diff -= $x * $value;
+ }
+ $opt['distance'] && $str .= ($str && $opt['to'] >= $time) ? ' ago' : ' away';
+ return $str;
+}
+
+
+if ((strstr($curdatabase, "-traffic.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for traffic stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step --vertical-label \"bits/sec\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:$curif-in_bytes_pass=$rrddbpath$curdatabase:inpass:AVERAGE:step=$step ";
+ $graphcmd .= "DEF:$curif-out_bytes_pass=$rrddbpath$curdatabase:outpass:AVERAGE:step=$step ";
+ $graphcmd .= "DEF:$curif-in_bytes_block=$rrddbpath$curdatabase:inblock:AVERAGE:step=$step ";
+ $graphcmd .= "DEF:$curif-out_bytes_block=$rrddbpath$curdatabase:outblock:AVERAGE:step=$step ";
+
+ $graphcmd .= "DEF:$curif-in6_bytes_pass=$rrddbpath$curdatabase:inpass6:AVERAGE:step=$step ";
+ $graphcmd .= "DEF:$curif-out6_bytes_pass=$rrddbpath$curdatabase:outpass6:AVERAGE:step=$step ";
+ $graphcmd .= "DEF:$curif-in6_bytes_block=$rrddbpath$curdatabase:inblock6:AVERAGE:step=$step ";
+ $graphcmd .= "DEF:$curif-out6_bytes_block=$rrddbpath$curdatabase:outblock6:AVERAGE:step=$step ";
+
+ $graphcmd .= "CDEF:\"$curif-in_bits_pass=$curif-in_bytes_pass,8,*\" ";
+ $graphcmd .= "CDEF:\"$curif-out_bits_pass=$curif-out_bytes_pass,8,*\" ";
+ $graphcmd .= "CDEF:\"$curif-in_bits_block=$curif-in_bytes_block,8,*\" ";
+ $graphcmd .= "CDEF:\"$curif-out_bits_block=$curif-out_bytes_block,8,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-in6_bits_pass=$curif-in6_bytes_pass,8,*\" ";
+ $graphcmd .= "CDEF:\"$curif-out6_bits_pass=$curif-out6_bytes_pass,8,*\" ";
+ $graphcmd .= "CDEF:\"$curif-in6_bits_block=$curif-in6_bytes_block,8,*\" ";
+ $graphcmd .= "CDEF:\"$curif-out6_bits_block=$curif-out6_bytes_block,8,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-in_bytes=$curif-in_bytes_pass,$curif-in_bytes_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out_bytes=$curif-out_bytes_pass,$curif-out_bytes_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-in_bits=$curif-in_bits_pass,$curif-in_bits_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out_bits=$curif-out_bits_pass,$curif-out_bits_block,+\" ";
+
+ $graphcmd .= "CDEF:\"$curif-in6_bytes=$curif-in6_bytes_pass,$curif-in6_bytes_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out6_bytes=$curif-out6_bytes_pass,$curif-out6_bytes_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-in6_bits=$curif-in6_bits_pass,$curif-in6_bits_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out6_bits=$curif-out6_bits_pass,$curif-out6_bits_block,+\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bits_io=$curif-in_bits,$curif-out_bits,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out_bits_block_neg=$curif-out_bits_block,$multiplier,*\" ";
+ $graphcmd .= "CDEF:\"$curif-out_bits_pass_neg=$curif-out_bits_pass,$multiplier,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bits6_io=$curif-in6_bits,$curif-out6_bits,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out6_bits_block_neg=$curif-out6_bits_block,$multiplier,*\" ";
+ $graphcmd .= "CDEF:\"$curif-out6_bits_pass_neg=$curif-out6_bits_pass,$multiplier,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bytes_in_pass=$curif-in_bytes_pass,0,$speedlimit,LIMIT,UN,0,$curif-in_bytes_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_out_pass=$curif-out_bytes_pass,0,$speedlimit,LIMIT,UN,0,$curif-out_bytes_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_in_block=$curif-in_bytes_block,0,$speedlimit,LIMIT,UN,0,$curif-in_bytes_block,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_out_block=$curif-out_bytes_block,0,$speedlimit,LIMIT,UN,0,$curif-out_bytes_block,IF,$average,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bytes_in6_pass=$curif-in6_bytes_pass,0,$speedlimit,LIMIT,UN,0,$curif-in6_bytes_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_out6_pass=$curif-out6_bytes_pass,0,$speedlimit,LIMIT,UN,0,$curif-out6_bytes_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_in6_block=$curif-in6_bytes_block,0,$speedlimit,LIMIT,UN,0,$curif-in6_bytes_block,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_out6_block=$curif-out6_bytes_block,0,$speedlimit,LIMIT,UN,0,$curif-out6_bytes_block,IF,$average,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bytes_pass=$curif-bytes_in_pass,$curif-bytes_out_pass,+\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_block=$curif-bytes_in_block,$curif-bytes_out_block,+\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bytes_pass6=$curif-bytes_in6_pass,$curif-bytes_out6_pass,+\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_block6=$curif-bytes_in6_block,$curif-bytes_out6_block,+\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bytes_in_t_pass=$curif-in_bytes_pass,0,$speedlimit,LIMIT,UN,0,$curif-in_bytes_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_out_t_pass=$curif-out_bytes_pass,0,$speedlimit,LIMIT,UN,0,$curif-out_bytes_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_in_t_block=$curif-in_bytes_block,0,$speedlimit,LIMIT,UN,0,$curif-in_bytes_block,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_out_t_block=$curif-out_bytes_block,0,$speedlimit,LIMIT,UN,0,$curif-out_bytes_block,IF,$seconds,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bytes_in6_t_pass=$curif-in6_bytes_pass,0,$speedlimit,LIMIT,UN,0,$curif-in6_bytes_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_out6_t_pass=$curif-out6_bytes_pass,0,$speedlimit,LIMIT,UN,0,$curif-out6_bytes_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_in6_t_block=$curif-in6_bytes_block,0,$speedlimit,LIMIT,UN,0,$curif-in6_bytes_block,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_out6_t_block=$curif-out6_bytes_block,0,$speedlimit,LIMIT,UN,0,$curif-out6_bytes_block,IF,$seconds,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bytes_t_pass=$curif-bytes_in_t_pass,$curif-bytes_out_t_pass,+\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_t_block=$curif-bytes_in_t_block,$curif-bytes_out_t_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_t=$curif-bytes_t_pass,$curif-bytes_t_block,+\" ";
+
+ $graphcmd .= "CDEF:\"$curif-bytes_t_pass6=$curif-bytes_in6_t_pass,$curif-bytes_out6_t_pass,+\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_t_block6=$curif-bytes_in6_t_block,$curif-bytes_out6_t_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-bytes_t6=$curif-bytes_t_pass6,$curif-bytes_t_block6,+\" ";
+ $graphcmd .= "VDEF:\"$curif-in_bits_95=$curif-in_bits,95,PERCENT\" ";
+ $graphcmd .= "CDEF:\"$curif-out_bits_mul=$curif-out_bits,$multiplier,*\" ";
+ $perc = $multiplier > 0 ? "95" : "5";
+ $graphcmd .= "VDEF:\"$curif-out_bits_95=$curif-out_bits_mul,{$perc},PERCENT\" ";
+
+ $graphcmd .= "AREA:\"$curif-in_bits_block#{$colortrafficdown[1]}:$curif-in-block\" ";
+ $graphcmd .= "AREA:\"$curif-in_bits_pass#{$colortrafficdown[0]}:$curif-in-pass:STACK\" ";
+ $graphcmd .= "AREA:\"$curif-in6_bits_block#{$colortrafficdown[3]}:$curif-in6-block:STACK\" ";
+ $graphcmd .= "AREA:\"$curif-in6_bits_pass#{$colortrafficdown[2]}:$curif-in6-pass:STACK\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+
+ $graphcmd .= "{$AREA}:\"$curif-out_bits_block_neg#{$colortrafficup[1]}:$curif-out-block\" ";
+ $graphcmd .= "{$AREA}:\"$curif-out_bits_pass_neg#{$colortrafficup[0]}:$curif-out-pass:STACK\" ";
+ $graphcmd .= "{$AREA}:\"$curif-out6_bits_block_neg#{$colortrafficup[3]}:$curif-out6-block:STACK\" ";
+ $graphcmd .= "{$AREA}:\"$curif-out6_bits_pass_neg#{$colortrafficup[2]}:$curif-out6-pass:STACK\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "HRULE:\"$curif-in_bits_95#{$colortraffic95[1]}:$curif-in (95%)\" ";
+ $graphcmd .= "HRULE:\"$curif-out_bits_95#{$colortraffic95[0]}:$curif-out (95%)\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t maximum\t average\t\t current\t period\t 95th percentile\\n\" ";
+ $graphcmd .= "COMMENT:\"IPv4 in-pass\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_bits_pass:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_bits_pass:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_bits_pass:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-bytes_in_t_pass:AVERAGE:%7.2lf %sB i\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_bits_95:%7.2lf %sb/s\" ";
+
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"IPv4 out-pass\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_bits_pass:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_bits_pass:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_bits_pass:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-bytes_out_t_pass:AVERAGE:%7.2lf %sB o\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_bits_95:%7.2lf %sb/s\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"IPv4 in-block\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_bits_block:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_bits_block:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_bits_block:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-bytes_in_t_block:AVERAGE:%7.2lf %sB i\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"IPv4 out-block\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_bits_block:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_bits_block:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_bits_block:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-bytes_out_t_block:AVERAGE:%7.2lf %sB o\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"IPv6 in-pass\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_bits_pass:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_bits_pass:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_bits_pass:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-bytes_in6_t_pass:AVERAGE:%7.2lf %sB i\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"IPv6 out-pass\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_bits_pass:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_bits_pass:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_bits_pass:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-bytes_out6_t_pass:AVERAGE:%7.2lf %sB o\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"IPv6 in-block\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_bits_block:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_bits_block:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_bits_block:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-bytes_in6_t_block:AVERAGE:%7.2lf %sB i\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"IPv6 out-block\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_bits_block:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_bits_block:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_bits_block:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"$curif-bytes_out6_t_block:AVERAGE:%7.2lf %sB o\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif (strstr($curdatabase, "-throughput.rrd")) {
+ /* define graphcmd for throughput stats */
+ /* this gathers all interface statistics, the database does not actually exist */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"bits/sec\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+
+ $iflist = get_configured_interface_list();
+ $g = 0;
+ $operand = "";
+ $comma = "";
+ $graphtputbip = "";
+ $graphtputbop = "";
+ $graphtputbtp = "";
+ $graphtputbib = "";
+ $graphtputbob = "";
+ $graphtputbtb = "";
+ $graphtputbyip = "";
+ $graphtputbyop = "";
+ $graphtputbytp = "";
+ $graphtputbyib = "";
+ $graphtputbyob = "";
+ $graphtputbytb = "";
+ foreach ($iflist as $ifname) {
+ /* collect all interface stats */
+ $graphcmd .= "DEF:\"{$ifname}-in_bytes_pass={$rrddbpath}{$ifname}-traffic.rrd:inpass:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"{$ifname}-out_bytes_pass={$rrddbpath}{$ifname}-traffic.rrd:outpass:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"{$ifname}-in_bytes_block={$rrddbpath}{$ifname}-traffic.rrd:inblock:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"{$ifname}-out_bytes_block={$rrddbpath}{$ifname}-traffic.rrd:outblock:AVERAGE:step=$step\" ";
+
+ $graphcmd .= "CDEF:\"{$ifname}-in_bytes={$ifname}-in_bytes_pass,{$ifname}-in_bytes_block,+\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-out_bytes={$ifname}-out_bytes_pass,{$ifname}-out_bytes_block,+\" ";
+
+ $graphcmd .= "CDEF:\"{$ifname}-in_bits_pass={$ifname}-in_bytes_pass,8,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-out_bits_pass={$ifname}-out_bytes_pass,8,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bits_io_pass={$ifname}-in_bits_pass,{$ifname}-out_bits_pass,+\" ";
+
+ $graphcmd .= "CDEF:\"{$ifname}-in_bits_block={$ifname}-in_bytes_block,8,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-out_bits_block={$ifname}-out_bytes_block,8,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bits_io_block={$ifname}-in_bits_block,{$ifname}-out_bits_block,+\" ";
+
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_in_pass={$ifname}-in_bytes_pass,0,$speedlimit,LIMIT,UN,0,{$ifname}-in_bytes_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_out_pass={$ifname}-out_bytes_pass,0,$speedlimit,LIMIT,UN,0,{$ifname}-out_bytes_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_in_block={$ifname}-in_bytes_block,0,$speedlimit,LIMIT,UN,0,{$ifname}-in_bytes_block,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_out_block={$ifname}-out_bytes_block,0,$speedlimit,LIMIT,UN,0,{$ifname}-out_bytes_block,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_pass={$ifname}-bytes_in_pass,{$ifname}-bytes_out_pass,+\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_block={$ifname}-bytes_in_pass,{$ifname}-bytes_out_block,+\" ";
+
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_in_t_pass={$ifname}-in_bytes,0,$speedlimit,LIMIT,UN,0,{$ifname}-in_bytes_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_in_t_block={$ifname}-in_bytes,0,$speedlimit,LIMIT,UN,0,{$ifname}-in_bytes_block,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_out_t_pass={$ifname}-out_bytes,0,$speedlimit,LIMIT,UN,0,{$ifname}-out_bytes_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_out_t_block={$ifname}-out_bytes,0,$speedlimit,LIMIT,UN,0,{$ifname}-out_bytes_block,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_t_pass={$ifname}-bytes_in_t_pass,{$ifname}-bytes_out_t_pass,+\" ";
+ $graphcmd .= "CDEF:\"{$ifname}-bytes_t_block={$ifname}-bytes_in_t_block,{$ifname}-bytes_out_t_block,+\" ";
+ if ($g > 0) {
+ $operand .= ",+";
+ $comma = ",";
+ }
+ $graphtputbip .= "{$comma}{$ifname}-in_bits_pass";
+ $graphtputbop .= "{$comma}{$ifname}-out_bits_pass";
+ $graphtputbtp .= "{$comma}{$ifname}-bits_io_pass";
+ $graphtputbib .= "{$comma}{$ifname}-in_bits_block";
+ $graphtputbob .= "{$comma}{$ifname}-out_bits_block";
+ $graphtputbtb .= "{$comma}{$ifname}-bits_io_block";
+ $graphtputbyip .= "{$comma}{$ifname}-bytes_in_t_pass";
+ $graphtputbyop .= "{$comma}{$ifname}-bytes_out_t_pass";
+ $graphtputbyib .= "{$comma}{$ifname}-bytes_in_t_block";
+ $graphtputbyob .= "{$comma}{$ifname}-bytes_out_t_block";
+ $graphtputbytp .= "{$comma}{$ifname}-bytes_t_pass";
+ $graphtputbytb .= "{$comma}{$ifname}-bytes_t_block";
+ $g++;
+ }
+ $graphcmd .= "CDEF:\"tput-in_bits_pass={$graphtputbip}{$operand}\" ";
+ $graphcmd .= "CDEF:\"tput-out_bits_pass={$graphtputbop}{$operand}\" ";
+ $graphcmd .= "CDEF:\"tput-bits_io_pass={$graphtputbtp}{$operand}\" ";
+
+ $graphcmd .= "CDEF:\"tput-in_bits_block={$graphtputbib}{$operand}\" ";
+ $graphcmd .= "CDEF:\"tput-out_bits_block={$graphtputbob}{$operand}\" ";
+ $graphcmd .= "CDEF:\"tput-bits_io_block={$graphtputbtb}{$operand}\" ";
+
+ $graphcmd .= "CDEF:\"tput-out_bits_pass_neg=tput-out_bits_pass,$multiplier,*\" ";
+ $graphcmd .= "CDEF:\"tput-out_bits_block_neg=tput-out_bits_block,$multiplier,*\" ";
+
+ $graphcmd .= "CDEF:\"tput-bytes_in_t_pass={$graphtputbyip}{$operand}\" ";
+ $graphcmd .= "CDEF:\"tput-bytes_out_t_pass={$graphtputbyop}{$operand}\" ";
+ $graphcmd .= "CDEF:\"tput-bytes_t_pass={$graphtputbytp}{$operand}\" ";
+
+ $graphcmd .= "CDEF:\"tput-bytes_in_t_block={$graphtputbyib}{$operand}\" ";
+ $graphcmd .= "CDEF:\"tput-bytes_out_t_block={$graphtputbyob}{$operand}\" ";
+ $graphcmd .= "CDEF:\"tput-bytes_t_block={$graphtputbytb}{$operand}\" ";
+
+ $graphcmd .= "AREA:\"tput-in_bits_block#{$colortrafficdown[0]}:in-block \" ";
+ $graphcmd .= "AREA:\"tput-in_bits_pass#{$colortrafficdown[1]}:in-pass \" ";
+
+ $graphcmd .= "{$AREA}:\"tput-out_bits_block_neg#{$colortrafficup[1]}:out-block \" ";
+ $graphcmd .= "{$AREA}:\"tput-out_bits_pass_neg#{$colortrafficup[0]}:out-pass \" ";
+
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t maximum average current period\\n\" ";
+ $graphcmd .= "COMMENT:\"in-pass\t\" ";
+ $graphcmd .= "GPRINT:\"tput-in_bits_pass:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-in_bits_pass:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-in_bits_pass:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-bytes_in_t_pass:AVERAGE:%7.2lf %sB i\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"out-pass\t\" ";
+ $graphcmd .= "GPRINT:\"tput-out_bits_pass:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-out_bits_pass:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-out_bits_pass:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-bytes_out_t_pass:AVERAGE:%7.2lf %sB o\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"in-block\t\" ";
+ $graphcmd .= "GPRINT:\"tput-in_bits_block:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-in_bits_block:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-in_bits_block:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-bytes_in_t_block:AVERAGE:%7.2lf %sB i\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"out-block\t\" ";
+ $graphcmd .= "GPRINT:\"tput-out_bits_block:MAX:%7.2lf %sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-out_bits_block:AVERAGE:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-out_bits_block:LAST:%7.2lf %Sb/s\" ";
+ $graphcmd .= "GPRINT:\"tput-bytes_out_t_block:AVERAGE:%7.2lf %sB o\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-packets.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for packets stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"packets/sec\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"$curif-in_pps_pass=$rrddbpath$curdatabase:inpass:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-out_pps_pass=$rrddbpath$curdatabase:outpass:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-in_pps_block=$rrddbpath$curdatabase:inblock:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-out_pps_block=$rrddbpath$curdatabase:outblock:AVERAGE:step=$step\" ";
+
+ $graphcmd .= "DEF:\"$curif-in6_pps_pass=$rrddbpath$curdatabase:inpass6:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-out6_pps_pass=$rrddbpath$curdatabase:outpass6:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-in6_pps_block=$rrddbpath$curdatabase:inblock6:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-out6_pps_block=$rrddbpath$curdatabase:outblock6:AVERAGE:step=$step\" ";
+
+ $graphcmd .= "CDEF:\"$curif-in_pps=$curif-in_pps_pass,$curif-in_pps_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out_pps=$curif-out_pps_pass,$curif-out_pps_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out_pps_pass_neg=$curif-out_pps_pass,$multiplier,*\" ";
+ $graphcmd .= "CDEF:\"$curif-out_pps_block_neg=$curif-out_pps_block,$multiplier,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-in6_pps=$curif-in6_pps_pass,$curif-in6_pps_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out6_pps=$curif-out6_pps_pass,$curif-out6_pps_block,+\" ";
+ $graphcmd .= "CDEF:\"$curif-out6_pps_pass_neg=$curif-out6_pps_pass,$multiplier,*\" ";
+ $graphcmd .= "CDEF:\"$curif-out6_pps_block_neg=$curif-out6_pps_block,$multiplier,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-pps_in_pass=$curif-in_pps_pass,0,12500000,LIMIT,UN,0,$curif-in_pps_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_out_pass=$curif-out_pps_pass,0,12500000,LIMIT,UN,0,$curif-out_pps_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_in_block=$curif-in_pps_block,0,12500000,LIMIT,UN,0,$curif-in_pps_block,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_out_block=$curif-out_pps_block,0,12500000,LIMIT,UN,0,$curif-out_pps_block,IF,$average,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-pps_in6_pass=$curif-in6_pps_pass,0,12500000,LIMIT,UN,0,$curif-in6_pps_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_out6_pass=$curif-out6_pps_pass,0,12500000,LIMIT,UN,0,$curif-out6_pps_pass,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_in6_block=$curif-in6_pps_block,0,12500000,LIMIT,UN,0,$curif-in6_pps_block,IF,$average,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_out6_block=$curif-out6_pps_block,0,12500000,LIMIT,UN,0,$curif-out6_pps_block,IF,$average,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-pps_io=$curif-in_pps,$curif-out_pps,+\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_pass=$curif-pps_in_pass,$curif-pps_out_pass,+\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_block=$curif-pps_in_block,$curif-pps_out_block,+\" ";
+
+ $graphcmd .= "CDEF:\"$curif-pps_io6=$curif-in6_pps,$curif-out6_pps,+\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_pass6=$curif-pps_in6_pass,$curif-pps_out6_pass,+\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_block6=$curif-pps_in6_block,$curif-pps_out6_block,+\" ";
+
+ $graphcmd .= "CDEF:\"$curif-pps_in_t_pass=$curif-in_pps_pass,0,12500000,LIMIT,UN,0,$curif-in_pps_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_out_t_pass=$curif-out_pps_pass,0,12500000,LIMIT,UN,0,$curif-out_pps_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_in_t_block=$curif-in_pps_block,0,12500000,LIMIT,UN,0,$curif-in_pps_block,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_out_t_block=$curif-out_pps_block,0,12500000,LIMIT,UN,0,$curif-out_pps_block,IF,$seconds,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-pps_in6_t_pass=$curif-in6_pps_pass,0,12500000,LIMIT,UN,0,$curif-in6_pps_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_out6_t_pass=$curif-out6_pps_pass,0,12500000,LIMIT,UN,0,$curif-out6_pps_pass,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_in6_t_block=$curif-in6_pps_block,0,12500000,LIMIT,UN,0,$curif-in6_pps_block,IF,$seconds,*\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_out6_t_block=$curif-out6_pps_block,0,12500000,LIMIT,UN,0,$curif-out6_pps_block,IF,$seconds,*\" ";
+
+ $graphcmd .= "CDEF:\"$curif-pps_t_pass=$curif-pps_in_t_pass,$curif-pps_out_t_pass,+\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_t_block=$curif-pps_in_t_block,$curif-pps_out_t_block,+\" ";
+
+ $graphcmd .= "CDEF:\"$curif-pps_t_pass6=$curif-pps_in6_t_pass,$curif-pps_out6_t_pass,+\" ";
+ $graphcmd .= "CDEF:\"$curif-pps_t_block6=$curif-pps_in6_t_block,$curif-pps_out6_t_block,+\" ";
+
+ $graphcmd .= "AREA:\"$curif-in_pps_block#{$colorpacketsdown[1]}:$curif-in-block\" ";
+ $graphcmd .= "AREA:\"$curif-in_pps_pass#{$colorpacketsdown[0]}:$curif-in-pass:STACK\" ";
+ $graphcmd .= "AREA:\"$curif-in6_pps_block#{$colorpacketsdown[3]}:$curif-in6-block:STACK\" ";
+ $graphcmd .= "AREA:\"$curif-in6_pps_pass#{$colorpacketsdown[2]}:$curif-in6-pass:STACK\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "$AREA:\"$curif-out_pps_block_neg#{$colorpacketsup[1]}:$curif-out-block\" ";
+ $graphcmd .= "$AREA:\"$curif-out_pps_pass_neg#{$colorpacketsup[0]}:$curif-out-pass:STACK\" ";
+ $graphcmd .= "$AREA:\"$curif-out6_pps_block_neg#{$colorpacketsup[3]}:$curif-out6-block:STACK\" ";
+ $graphcmd .= "$AREA:\"$curif-out6_pps_pass_neg#{$colorpacketsup[2]}:$curif-out6-pass:STACK\" ";
+
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t maximum\t\t average\t current\t period\\n\" ";
+ $graphcmd .= "COMMENT:\"in-pass\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_pps_pass:MAX:%7.2lf %s pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_pps_pass:AVERAGE:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_pps_pass:LAST:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pps_in_t_pass:AVERAGE:%7.2lf %s pkts\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"out-pass\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_pps_pass:MAX:%7.2lf %s pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_pps_pass:AVERAGE:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_pps_pass:LAST:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pps_out_t_pass:AVERAGE:%7.2lf %s pkts\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"in-block\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_pps_block:MAX:%7.2lf %s pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_pps_block:AVERAGE:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-in_pps_block:LAST:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pps_in_t_block:AVERAGE:%7.2lf %s pkts\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"out-block\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_pps_block:MAX:%7.2lf %s pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_pps_block:AVERAGE:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-out_pps_block:LAST:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pps_out_t_block:AVERAGE:%7.2lf %s pkts\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"in-pass6\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_pps_pass:MAX:%7.2lf %s pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_pps_pass:AVERAGE:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_pps_pass:LAST:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pps_in6_t_pass:AVERAGE:%7.2lf %s pkts\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"out-pass6\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_pps_pass:MAX:%7.2lf %s pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_pps_pass:AVERAGE:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_pps_pass:LAST:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pps_out6_t_pass:AVERAGE:%7.2lf %s pkts\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"in-block6\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_pps_block:MAX:%7.2lf %s pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_pps_block:AVERAGE:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-in6_pps_block:LAST:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pps_in6_t_block:AVERAGE:%7.2lf %s pkts\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"out-pass6\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_pps_block:MAX:%7.2lf %s pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_pps_block:AVERAGE:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-out6_pps_block:LAST:%7.2lf %S pps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pps_out6_t_block:AVERAGE:%7.2lf %s pkts\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-wireless.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for packets stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"snr/channel/rate\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"$curif-snr=$rrddbpath$curdatabase:snr:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-rate=$rrddbpath$curdatabase:rate:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-channel=$rrddbpath$curdatabase:channel:AVERAGE:step=$step\" ";
+ $graphcmd .= "LINE2:\"$curif-snr#{$colorwireless[0]}:$curif-snr\" ";
+ $graphcmd .= "LINE2:\"$curif-rate#{$colorwireless[1]}:$curif-rate\" ";
+ $graphcmd .= "LINE2:\"$curif-channel#{$colorwireless[2]}:$curif-channel\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t maximum\t\t average\t current\\n\" ";
+ $graphcmd .= "COMMENT:\"SNR\t\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-snr:MAX:%7.2lf dBi \" ";
+ $graphcmd .= "GPRINT:\"$curif-snr:AVERAGE:%7.2lf dBi \" ";
+ $graphcmd .= "GPRINT:\"$curif-snr:LAST:%7.2lf dBi\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"RATE\t\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-rate:MAX:%7.2lf Mb \" ";
+ $graphcmd .= "GPRINT:\"$curif-rate:AVERAGE:%7.2lf Mb \" ";
+ $graphcmd .= "GPRINT:\"$curif-rate:LAST:%7.2lf Mb\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Channel\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-channel:MAX:%7.2lf \" ";
+ $graphcmd .= "GPRINT:\"$curif-channel:AVERAGE:%7.2lf \" ";
+ $graphcmd .= "GPRINT:\"$curif-channel:LAST:%7.2lf\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-vpnusers.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for vpn users stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"users\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"$curif-users=$rrddbpath$curdatabase:users:AVERAGE:step=$step\" ";
+ $graphcmd .= "LINE2:\"$curif-users#{$colorvpnusers[0]}:$curif-users\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t maximum\t\t average\t current\\n\" ";
+ $graphcmd .= "COMMENT:\"Users Online\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-users:MAX:%7.2lf \" ";
+ $graphcmd .= "GPRINT:\"$curif-users:AVERAGE:%7.2lf \" ";
+ $graphcmd .= "GPRINT:\"$curif-users:LAST:%7.2lf \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-states.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for states stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start -$seconds -e -$average --step $step ";
+ $graphcmd .= "--vertical-label \"states, ip\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"$curif-pfrate=$rrddbpath$curdatabase:pfrate:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-pfstates=$rrddbpath$curdatabase:pfstates:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-pfnat=$rrddbpath$curdatabase:pfnat:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-srcip=$rrddbpath$curdatabase:srcip:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"$curif-dstip=$rrddbpath$curdatabase:dstip:AVERAGE:step=$step\" ";
+ $graphcmd .= "CDEF:\"$curif-pfrate_t=$curif-pfrate,0,1000000,LIMIT,UN,0,$curif-pfrate,IF,$seconds,*\" ";
+ $graphcmd .= "LINE1:\"$curif-pfrate#{$colorstates[0]}:$curif-pfrate\" ";
+ $graphcmd .= "LINE1:\"$curif-pfstates#{$colorstates[1]}:$curif-pfstates\" ";
+ $graphcmd .= "LINE1:\"$curif-pfnat#{$colorstates[2]}:$curif-pfnat\" ";
+ $graphcmd .= "LINE1:\"$curif-srcip#{$colorstates[3]}:$curif-srcip\" ";
+ $graphcmd .= "LINE1:\"$curif-dstip#{$colorstates[4]}:$curif-dstip\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t minimum average maximum current period\\n\" ";
+ $graphcmd .= "COMMENT:\"state changes\" ";
+ $graphcmd .= "GPRINT:\"$curif-pfrate:MIN:%7.2lf %s cps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pfrate:AVERAGE:%7.2lf %s cps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pfrate:MAX:%7.2lf %s cps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pfrate:LAST:%7.2lf %S cps\" ";
+ $graphcmd .= "GPRINT:\"$curif-pfrate_t:AVERAGE:%7.2lf %s chg\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"filter states\" ";
+ $graphcmd .= "GPRINT:\"$curif-pfstates:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-pfstates:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-pfstates:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-pfstates:LAST:%7.2lf %s \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"nat states \" ";
+ $graphcmd .= "GPRINT:\"$curif-pfnat:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-pfnat:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-pfnat:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-pfnat:LAST:%7.2lf %s \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Source addr. \" ";
+ $graphcmd .= "GPRINT:\"$curif-srcip:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-srcip:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-srcip:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-srcip:LAST:%7.2lf %s \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Dest. addr. \" ";
+ $graphcmd .= "GPRINT:\"$curif-dstip:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-dstip:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-dstip:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"$curif-dstip:LAST:%7.2lf %s \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-processor.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for processor stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"utilization, number\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"user=$rrddbpath$curdatabase:user:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"nice=$rrddbpath$curdatabase:nice:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"system=$rrddbpath$curdatabase:system:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"interrupt=$rrddbpath$curdatabase:interrupt:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"processes=$rrddbpath$curdatabase:processes:AVERAGE:step=$step\" ";
+ $graphcmd .= "AREA:\"user#{$colorprocessor[0]}:user\" ";
+ $graphcmd .= "AREA:\"nice#{$colorprocessor[1]}:nice:STACK\" ";
+ $graphcmd .= "AREA:\"system#{$colorprocessor[2]}:system:STACK\" ";
+ $graphcmd .= "AREA:\"interrupt#{$colorprocessor[3]}:interrupt:STACK\" ";
+ $graphcmd .= "LINE2:\"processes#{$colorprocessor[4]}:processes\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t minimum average maximum current\\n\" ";
+ $graphcmd .= "COMMENT:\"User util. \" ";
+ $graphcmd .= "GPRINT:\"user:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"user:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"user:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"user:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Nice util. \" ";
+ $graphcmd .= "GPRINT:\"nice:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"nice:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"nice:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"nice:LAST:%7.2lf %s \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"System util. \" ";
+ $graphcmd .= "GPRINT:\"system:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"system:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"system:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"system:LAST:%7.2lf %s \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Interrupt \" ";
+ $graphcmd .= "GPRINT:\"interrupt:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"interrupt:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"interrupt:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"interrupt:LAST:%7.2lf %s \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Processes \" ";
+ $graphcmd .= "GPRINT:\"processes:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"processes:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"processes:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"processes:LAST:%7.2lf %s \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-memory.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for memory usage stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"utilization, percent\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"active=$rrddbpath$curdatabase:active:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"inactive=$rrddbpath$curdatabase:inactive:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"free=$rrddbpath$curdatabase:free:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"cache=$rrddbpath$curdatabase:cache:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"wire=$rrddbpath$curdatabase:wire:AVERAGE:step=$step\" ";
+ $graphcmd .= "LINE2:\"active#{$colormemory[0]}:active\" ";
+ $graphcmd .= "LINE2:\"inactive#{$colormemory[1]}:inactive\" ";
+ $graphcmd .= "LINE2:\"free#{$colormemory[2]}:free\" ";
+ $graphcmd .= "LINE2:\"cache#{$colormemory[3]}:cache\" ";
+ $graphcmd .= "LINE2:\"wire#{$colormemory[4]}:wire\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t minimum average maximum current\\n\" ";
+ $graphcmd .= "COMMENT:\"Active. \" ";
+ $graphcmd .= "GPRINT:\"active:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"active:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"active:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"active:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Inactive. \" ";
+ $graphcmd .= "GPRINT:\"inactive:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"inactive:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"inactive:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"inactive:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Free. \" ";
+ $graphcmd .= "GPRINT:\"free:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"free:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"free:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"free:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Cached. \" ";
+ $graphcmd .= "GPRINT:\"cache:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"cache:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"cache:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"cache:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Wired. \" ";
+ $graphcmd .= "GPRINT:\"wire:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"wire:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"wire:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"wire:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-mbuf.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for mbuf usage stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"utilization, percent\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} clusters - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"current=$rrddbpath$curdatabase:current:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"cache=$rrddbpath$curdatabase:cache:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"total=$rrddbpath$curdatabase:total:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"max=$rrddbpath$curdatabase:max:AVERAGE:step=$step\" ";
+ $graphcmd .= "LINE2:\"current#{$colormbuf[0]}:current\" ";
+ $graphcmd .= "LINE2:\"cache#{$colormbuf[1]}:cache\" ";
+ $graphcmd .= "LINE2:\"total#{$colormbuf[2]}:total\" ";
+ $graphcmd .= "LINE2:\"max#{$colormbuf[3]}:max\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t minimum average maximum current\\n\" ";
+ $graphcmd .= "COMMENT:\"Current. \" ";
+ $graphcmd .= "GPRINT:\"current:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"current:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"current:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"current:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Cache. \" ";
+ $graphcmd .= "GPRINT:\"cache:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"cache:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"cache:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"cache:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Total. \" ";
+ $graphcmd .= "GPRINT:\"total:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"total:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"total:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"total:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Max. \" ";
+ $graphcmd .= "GPRINT:\"max:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"max:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"max:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"max:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-queues.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for queue stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"bits/sec\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ if ($altq) {
+ $a_queues =& $altq->get_queue_list();
+ $t = 0;
+ } else {
+ $a_queues = array();
+ $i = 0;
+ $t = 0;
+ }
+ foreach ($a_queues as $name => $q) {
+ $color = "$colorqueuesup[$t]";
+ if ($t > 0) {
+ $stack = ":STACK";
+ }
+ $graphcmd .= "DEF:\"$name=$rrddbpath$curdatabase:$name:AVERAGE:step=$step\" ";
+ $graphcmd .= "CDEF:\"$name-bytes_out=$name,0,$speedlimit,LIMIT,UN,0,$name,IF\" ";
+ $graphcmd .= "CDEF:\"$name-bits_out=$name-bytes_out,8,*\" ";
+ $graphcmd .= "$AREA:\"$name-bits_out#${color}:$name$stack\" ";
+ $t++;
+ if ($t > 7) {
+ $t = 0;
+ }
+ }
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-queuedrops.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for queuedrop stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"drops / sec\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ if ($altq) {
+ $a_queues =& $altq->get_queue_list();
+ $t = 0;
+ } else {
+ $a_queues = array();
+ $i = 0;
+ $t = 0;
+ }
+ foreach ($a_queues as $name => $q) {
+ $color = "$colorqueuesdropup[$t]";
+ if ($t > 0) {
+ $stack = ":STACK";
+ }
+ $graphcmd .= "DEF:\"$name=$rrddbpath$curdatabase:$name:AVERAGE:step=$step\" ";
+ $graphcmd .= "CDEF:\"$name-bytes_out=$name,0,$speedlimit,LIMIT,UN,0,$name,IF\" ";
+ $graphcmd .= "CDEF:\"$name-bits_out=$name-bytes_out,8,*\" ";
+ $graphcmd .= "CDEF:\"$name-bits_out_neg=$name-bits_out,$multiplier,*\" ";
+ $graphcmd .= "$AREA:\"$name-bits_out_neg#${color}:$name$stack\" ";
+ $t++;
+ if ($t > 7) {
+ $t = 0;
+ }
+ }
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-quality.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* make a link quality graphcmd */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png \\
+ --start $start --end $end --step $step \\
+ --title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" \\
+ --color SHADEA#eeeeee --color SHADEB#eeeeee \\
+ --vertical-label \"ms / %\" \\
+ --height 200 --width 620 \\
+ --lower-limit 0 \\
+ DEF:delayraw=$rrddbpath$curdatabase:delay:AVERAGE:step=$step \\
+ DEF:loss=$rrddbpath$curdatabase:loss:AVERAGE:step=$step \\
+ \"CDEF:delay=delayraw,1000,*\" \\
+ \"CDEF:roundavg=delay,PREV(delay),+,2,/\" \\
+ \"CDEF:loss10=loss,$multiplier,*\" \\
+ \"CDEF:r0=delay,20,MIN\" \\
+ \"CDEF:r1=delay,60,MIN\" \\
+ \"CDEF:r2=delay,180,MIN\" \\
+ \"CDEF:r3=delay,420,MIN\" \\
+ COMMENT:\"\t\t\t\t\tDelay\t\t\tPacket loss\\n\" \\
+ AREA:delay#$colorqualityrtt[0]:\"> 420 ms\" \\
+ GPRINT:delay:MIN:\"\t\tMin\\: %7.2lf ms\" \\
+ GPRINT:loss:MIN:\"\tMin\\: %3.1lf %%\\n\" \\
+ AREA:r3#$colorqualityrtt[1]:\"180-420 ms\" \\
+ GPRINT:delay:AVERAGE:\"\t\tAvg\\: %7.2lf ms\" \\
+ GPRINT:loss:AVERAGE:\"\tAvg\\: %3.1lf %%\\n\" \\
+ AREA:r2#$colorqualityrtt[2]:\"60-180 ms\" \\
+ GPRINT:delay:MAX:\"\t\tMax\\: %7.2lf ms\" \\
+ GPRINT:loss:MAX:\"\tMax\\: %3.1lf %%\\n\" \\
+ AREA:r1#$colorqualityrtt[3]:\"20-60 ms\\n\" \\
+ AREA:r0#$colorqualityrtt[4]:\"< 20 ms\" \\
+ GPRINT:delay:LAST:\"\t\tLast\\: %7.2lf ms\" \\
+ GPRINT:loss:LAST:\"\tLast\: %3.1lf %%\\n\" \\
+ AREA:loss10#$colorqualityloss:\"Packet loss\\n\" \\
+ LINE1:delay#$colorqualityrtt[5]:\"Delay average\\n\" \\
+ COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\"";
+} elseif ((strstr($curdatabase, "spamd.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* graph a spamd statistics graph */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png \\
+ --start $start --end $end --step $step \\
+ --title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" \\
+ --color SHADEA#eeeeee --color SHADEB#eeeeee \\
+ --vertical-label=\"Conn / Time, sec.\" \\
+ --height 200 --width 620 --no-gridfit \\
+ --lower-limit 0 \\
+ DEF:consmin=$rrddbpath$curdatabase:conn:MIN:step=$step \\
+ DEF:consavg=$rrddbpath$curdatabase:conn:AVERAGE:step=$step \\
+ DEF:consmax=$rrddbpath$curdatabase:conn:MAX:step=$step \\
+ DEF:timemin=$rrddbpath$curdatabase:time:MIN:step=$step \\
+ DEF:timeavg=$rrddbpath$curdatabase:time:AVERAGE:step=$step \\
+ DEF:timemax=$rrddbpath$curdatabase:time:MAX:step=$step \\
+ \"CDEF:timeminadj=timemin,0,86400,LIMIT,UN,0,timemin,IF\" \\
+ \"CDEF:timeavgadj=timeavg,0,86400,LIMIT,UN,0,timeavg,IF\" \\
+ \"CDEF:timemaxadj=timemax,0,86400,LIMIT,UN,0,timemax,IF\" \\
+ \"CDEF:t1=timeminadj,timeavgadj,+,2,/,timeminadj,-\" \\
+ \"CDEF:t2=timeavgadj,timemaxadj,+,2,/,timeminadj,-,t1,-\" \\
+ \"CDEF:t3=timemaxadj,timeminadj,-,t1,-,t2,-\" \\
+ AREA:timeminadj \\
+ AREA:t1#$colorspamdtime[0]::STACK \\
+ AREA:t2#$colorspamdtime[1]::STACK \\
+ AREA:t3#$colorspamdtime[2]::STACK \\
+ LINE2:timeavgadj#$colorspamdtime[3]:\"Time \" \\
+ GPRINT:timeminadj:MIN:\"Min\\:%6.2lf\\t\" \\
+ GPRINT:timeavgadj:AVERAGE:\"Avg\\:%6.2lf\\t\" \\
+ GPRINT:timemaxadj:MAX:\"Max\\:%6.2lf\\n\" \\
+ AREA:consmax#$colorspamdconn[0] \\
+ AREA:consmin#$colorspamdconn[1] \\
+ LINE1:consmin#$colorspamdconn[2] \\
+ LINE1:consmax#$colorspamdconn[3] \\
+ LINE1:consavg#$colorspamdconn[4]:\"Cons \" \\
+ GPRINT:consmin:MIN:\"Min\\:%6.2lf\\t\" \\
+ GPRINT:consavg:AVERAGE:\"Avg\\:%6.2lf\\t\" \\
+ GPRINT:consmax:MAX:\"Max\\:%6.2lf\\n\" \\
+ COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-cellular.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"signal\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"$curif-rssi=$rrddbpath$curdatabase:rssi:AVERAGE:step=$step\" ";
+ $graphcmd .= "LINE2:\"$curif-rssi#{$colorwireless[0]}:$curif-rssi\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t maximum\t\t average\t current\\n\" ";
+ $graphcmd .= "COMMENT:\"RSSI\t\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-rssi:MAX:%7.2lf \" ";
+ $graphcmd .= "GPRINT:\"$curif-rssi:AVERAGE:%7.2lf \" ";
+ $graphcmd .= "GPRINT:\"$curif-rssi:LAST:%7.2lf \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-loggedin.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for online Captive Portal users stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"Captive Portal Users\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--base=1000 ";
+ $graphcmd .= "--lower-limit=0 ";
+ $graphcmd .= "--slope-mode ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"$curif-loggedinusers=$rrddbpath$curdatabase:loggedinusers:AVERAGE:step=$step\" ";
+ $graphcmd .= "CDEF:\"$curif-totalusers_t=PREV,UN,0,PREV,IF,$curif-loggedinusers,+\" ";
+ $graphcmd .= "CDEF:\"$curif-totalusers_d=$curif-totalusers_t,FLOOR\" ";
+ $graphcmd .= "AREA:\"$curif-totalusers_d#{$colorcaptiveportalusers[0]}:Total logged in users\" ";
+ $graphcmd .= "GPRINT:\"$curif-totalusers_d:MAX:%8.0lf \\n\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "-concurrent.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for online Captive Portal users stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"Captive Portal Users\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--base=1000 ";
+ $graphcmd .= "--lower-limit=0 ";
+ $graphcmd .= "--slope-mode ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"$curif-concurrentusers=$rrddbpath$curdatabase:concurrentusers:AVERAGE:step=$step\" ";
+ $graphcmd .= "AREA:\"$curif-concurrentusers#{$colorcaptiveportalusers[0]}:Concurrent Users\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t current\t\t average\t maximum\\n\" ";
+ $graphcmd .= "COMMENT:\"Users Online\t\" ";
+ $graphcmd .= "GPRINT:\"$curif-concurrentusers:LAST:%8.0lf \" ";
+ $graphcmd .= "GPRINT:\"$curif-concurrentusers:AVERAGE:%8.0lf \" ";
+ $graphcmd .= "GPRINT:\"$curif-concurrentusers:MAX:%8.0lf \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} elseif ((strstr($curdatabase, "ntpd.rrd")) && (file_exists("$rrddbpath$curdatabase"))) {
+ /* define graphcmd for ntpd (was: mbuf) usage stats */
+ $graphcmd = "$rrdtool graph $rrdtmppath$curdatabase-$curgraph.png ";
+ $graphcmd .= "--start $start --end $end --step $step ";
+ $graphcmd .= "--vertical-label \"time\" ";
+ $graphcmd .= "--color SHADEA#eeeeee --color SHADEB#eeeeee ";
+ $graphcmd .= "--title \"" . php_uname('n') . " - {$prettydb} - {$hperiod} - {$havg} average\" ";
+ $graphcmd .= "--height 200 --width 620 ";
+ $graphcmd .= "DEF:\"offset=$rrddbpath$curdatabase:offset:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"sjit=$rrddbpath$curdatabase:sjit:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"cjit=$rrddbpath$curdatabase:cjit:AVERAGE:step=$step\" ";
+ $graphcmd .= "DEF:\"wander=$rrddbpath$curdatabase:wander:AVERAGE:step=$step\" ";
+ $graphcmd .= "LINE2:\"offset#{$colorntpd[0]}:offset\" ";
+ $graphcmd .= "LINE2:\"sjit#{$colorntpd[1]}:sjit\" ";
+ $graphcmd .= "LINE2:\"cjit#{$colorntpd[2]}:cjit\" ";
+ $graphcmd .= "LINE2:\"wander#{$colorntpd[3]}:wander\" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t minimum average maximum current\\n\" ";
+ $graphcmd .= "COMMENT:\"Offset \" ";
+ $graphcmd .= "GPRINT:\"offset:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"offset:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"offset:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"offset:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"System jitter \" ";
+ $graphcmd .= "GPRINT:\"sjit:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"sjit:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"sjit:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"sjit:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Clock jitter \" ";
+ $graphcmd .= "GPRINT:\"cjit:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"cjit:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"cjit:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"cjit:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"Clk freq wander\" ";
+ $graphcmd .= "GPRINT:\"wander:MIN:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"wander:AVERAGE:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"wander:MAX:%7.2lf %s \" ";
+ $graphcmd .= "GPRINT:\"wander:LAST:%7.2lf %S \" ";
+ $graphcmd .= "COMMENT:\"\\n\" ";
+ $graphcmd .= "COMMENT:\"\t\t\t\t\t\t\t\t\t\t\t\t\t" . strftime('%b %d %H\:%M\:%S %Y') . "\" ";
+} else {
+ $data = false;
+ log_error(sprintf(gettext("Sorry we do not have data to graph for %s"),$curdatabase));
+}
+
+/* check modification time to see if we need to generate image */
+if (file_exists("$rrdtmppath$curdatabase-$curgraph.png")) {
+ if ((time() - filemtime("$rrdtmppath$curdatabase-$curgraph.png")) >= 15) {
+ if ($data) {
+ $_gb = exec("$graphcmd 2>&1", $graphcmdoutput, $graphcmdreturn);
+ $graphcmdoutput = implode(" ", $graphcmdoutput) . $graphcmd;
+ flush();
+ usleep(500);
+ }
+ }
+} else {
+ if ($data) {
+ $_gb = exec("$graphcmd 2>&1", $graphcmdoutput, $graphcmdreturn);
+ $graphcmdoutput = implode(" ", $graphcmdoutput) . $graphcmd;
+ flush();
+ usleep(500);
+ }
+}
+if (($graphcmdreturn <> 0) || (!$data)) {
+ log_error(sprintf(gettext('Failed to create graph with error code %1$s, the error is: %2$s'), $graphcmdreturn, $graphcmdoutput));
+ if (strstr($curdatabase, "queues")) {
+ log_error(sprintf(gettext("failed to create graph from %s%s, removing database"), $rrddbpath, $curdatabase));
+ unlink_if_exists($rrddbpath . $curif . $queues);
+ flush();
+ usleep(500);
+ enable_rrd_graphing();
+ }
+ if (strstr($curdatabase, "queuesdrop")) {
+ log_error(sprintf(gettext("failed to create graph from %s%s, removing database"), $rrddbpath, $curdatabase));
+ unlink_if_exists($rrddbpath . $curdatabase);
+ flush();
+ usleep(500);
+ enable_rrd_graphing();
+ }
+ header("Content-type: image/png");
+ header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+ header("Cache-Control: no-cache, no-store, must-revalidate");
+ header("Pragma: no-cache");
+ $file= "/usr/local/www/themes/{$g['theme']}/images/misc/rrd_error.png";
+ readfile($file);
+} else {
+ $file = "$rrdtmppath$curdatabase-$curgraph.png";
+ if (file_exists("$file")) {
+ header("Content-type: image/png");
+ header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+ header("Cache-Control: no-cache, no-store, must-revalidate");
+ header("Pragma: no-cache");
+ readfile($file);
+ }
+}
+
+?>
diff --git a/src/usr/local/www/status_rrd_graph_settings.php b/src/usr/local/www/status_rrd_graph_settings.php
new file mode 100644
index 0000000..ede9f41
--- /dev/null
+++ b/src/usr/local/www/status_rrd_graph_settings.php
@@ -0,0 +1,316 @@
+<?php
+/* $Id$ */
+/*
+ status_rrd_graph_settings.php
+ Part of pfSense
+ Copyright (C) 2007 Seth Mos <seth.mos@dds.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/find
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-status-rrdgraph-settings
+##|*NAME=Status: RRD Graphs settings page
+##|*DESCR=Allow access to the 'Status: RRD Graphs: settings' page.
+##|*MATCH=status_rrd_graph_settings.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require_once("rrd.inc");
+
+$pconfig['enable'] = isset($config['rrd']['enable']);
+$pconfig['category'] = $config['rrd']['category'];
+$pconfig['style'] = $config['rrd']['style'];
+$pconfig['period'] = $config['rrd']['period'];
+
+$curcat = "settings";
+$categories = array('system' => gettext("System"),
+ 'traffic' => gettext("Traffic"),
+ 'packets' => gettext("Packets"),
+ 'quality' => gettext("Quality"),
+ 'queues' => gettext("Queues"),
+ 'captiveportal' => gettext("Captive Portal"));
+
+if (isset($config['ntpd']['statsgraph'])) {
+ $categories['ntpd'] = gettext("NTP");
+}
+
+$styles = array('inverse' => gettext("Inverse"),
+ 'absolute' => gettext("Absolute"));
+$periods = array("absolute" => gettext("Absolute Timespans"),
+ "current" => gettext("Current Period"),
+ "previous" => gettext("Previous Period"));
+
+if ($_POST['ResetRRD']) {
+ mwexec('/bin/rm /var/db/rrd/*');
+ enable_rrd_graphing();
+ setup_gateways_monitor();
+ $savemsg = "RRD data has been cleared. New RRD files have been generated.";
+} elseif ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ /* none */
+
+ if (!$input_errors) {
+ $config['rrd']['enable'] = $_POST['enable'] ? true : false;
+ $config['rrd']['category'] = $_POST['category'];
+ $config['rrd']['style'] = $_POST['style'];
+ $config['rrd']['period'] = $_POST['period'];
+ write_config();
+
+ $retval = 0;
+ $retval = enable_rrd_graphing();
+ $savemsg = get_std_save_message($retval);
+ }
+}
+
+$rrddbpath = "/var/db/rrd/";
+chdir($rrddbpath);
+$databases = glob("*.rrd");
+
+foreach ($databases as $database) {
+ if (stristr($database, "wireless")) {
+ $wireless = true;
+ }
+ if (stristr($database, "queues")) {
+ $queues = true;
+ }
+ if (stristr($database, "-cellular") && !empty($config['ppps'])) {
+ $cellular = true;
+ }
+ if (stristr($database, "-vpnusers")) {
+ $vpnusers = true;
+ }
+ if (stristr($database, "captiveportal-") && is_array($config['captiveportal'])) {
+ $captiveportal = true;
+ }
+}
+
+$pgtitle = array(gettext("Status"), gettext("RRD Graphs"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<form action="status_rrd_graph_settings.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="rrd graph settings">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ if ($curcat == "system") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("System"), $tabactive, "status_rrd_graph.php?cat=system");
+ if ($curcat == "traffic") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Traffic"), $tabactive, "status_rrd_graph.php?cat=traffic");
+ if ($curcat == "packets") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Packets"), $tabactive, "status_rrd_graph.php?cat=packets");
+ if ($curcat == "quality") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Quality"), $tabactive, "status_rrd_graph.php?cat=quality");
+ if ($queues) {
+ if ($curcat == "queues") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Queues"), $tabactive, "status_rrd_graph.php?cat=queues");
+ if ($curcat == "queuedrops") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("QueueDrops"), $tabactive, "status_rrd_graph.php?cat=queuedrops");
+ }
+ if ($wireless) {
+ if ($curcat == "wireless") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Wireless"), $tabactive, "status_rrd_graph.php?cat=wireless");
+ }
+ if ($cellular) {
+ if ($curcat == "cellular") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Cellular"), $tabactive, "status_rrd_graph.php?cat=cellular");
+ }
+ if ($vpnusers) {
+ if ($curcat == "vpnusers") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("VPN"), $tabactive, "status_rrd_graph.php?cat=vpnusers");
+ }
+ if ($captiveportal) {
+ if ($curcat == "captiveportal") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Captive Portal"), $tabactive, "status_rrd_graph.php?cat=captiveportal");
+ }
+ if (isset($config['ntpd']['statsgraph'])) {
+ if ($curcat == "ntpd") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array("NTP", $tabactive, "status_rrd_graph.php?cat=ntpd");
+ }
+ if ($curcat == "custom") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Custom"), $tabactive, "status_rrd_graph.php?cat=custom");
+ if ($curcat == "settings") {
+ $tabactive = True;
+ } else {
+ $tabactive = False;
+ }
+ $tab_array[] = array(gettext("Settings"), $tabactive, "status_rrd_graph_settings.php");
+
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vtable"><?=gettext("RRD Graphs");?></td>
+ <td width="78%" class="vtable">
+ <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\"" ?> onclick="enable_change(false)" />
+ <b><?=gettext("Enables the RRD graphing backend.");?></b>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable"><?=gettext("Default category");?></td>
+ <td width="78%" class="vtable">
+ <select name="category" id="category" class="formselect" style="z-index: -10;" >
+ <?php
+ foreach ($categories as $category => $categoryd) {
+ echo "<option value=\"$category\"";
+ if ($category == $pconfig['category']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($categoryd) . "</option>\n";
+ }
+ ?>
+ </select>
+ <b><?=gettext("This selects default category.");?></b>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable"><?=gettext("Default style");?></td>
+ <td width="78%" class="vtable">
+ <select name="style" class="formselect" style="z-index: -10;" >
+ <?php
+ foreach ($styles as $style => $styled) {
+ echo "<option value=\"$style\"";
+ if ($style == $pconfig['style']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($styled) . "</option>\n";
+ }
+ ?>
+ </select>
+ <b><?=gettext("This selects the default style.");?></b>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable"><?=gettext("Default period");?></td>
+ <td width="78%" class="vtable">
+ <select name="period" class="formselect" style="z-index: -10;" >
+ <?php
+ foreach ($periods as $period => $periodd) {
+ echo "<option value=\"$period\"";
+ if ($period == $pconfig['period']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($periodd) . "</option>\n";
+ }
+ ?>
+ </select>
+ <b><?=gettext("This selects the default period.");?></b>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="ResetRRD" type="submit" class="formbtn" value="<?=gettext("Reset RRD Data");?>" onclick="return confirm('<?=gettext('Do you really want to reset the RRD graphs? This will erase all graph data.');?>')" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" height="53" valign="top">&nbsp;</td>
+ <td width="78%"><strong><span class="red"><?=gettext("Note:");?></span></strong><br />
+ <?=gettext("Graphs will not be allowed to be recreated within a 1 minute interval, please " .
+ "take this into account after changing the style.");?>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_services.php b/src/usr/local/www/status_services.php
new file mode 100755
index 0000000..ac13b32
--- /dev/null
+++ b/src/usr/local/www/status_services.php
@@ -0,0 +1,135 @@
+<?php
+/*
+ status_services.php
+ Copyright (C) 2004, 2005 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/local/sbin/openvpn /usr/bin/killall /bin/ps
+ pfSense_MODULE: services
+*/
+
+##|+PRIV
+##|*IDENT=page-status-services
+##|*NAME=Status: Services page
+##|*DESCR=Allow access to the 'Status: Services' page.
+##|*MATCH=status_services.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("service-utils.inc");
+require_once("shortcuts.inc");
+
+$service_name = '';
+if (isset($_GET['service'])) {
+ $service_name = htmlspecialchars($_GET['service']);
+}
+
+if (!empty($service_name)) {
+ switch ($_GET['mode']) {
+ case "restartservice":
+ $savemsg = service_control_restart($service_name, $_GET);
+ break;
+ case "startservice":
+ $savemsg = service_control_start($service_name, $_GET);
+ break;
+ case "stopservice":
+ $savemsg = service_control_stop($service_name, $_GET);
+ break;
+ }
+ sleep(5);
+}
+
+/* batch mode, allow other scripts to call this script */
+if ($_GET['batch']) {
+ exit;
+}
+
+$pgtitle = array(gettext("Status"), gettext("Services"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php
+include("fbegin.inc");
+?>
+<form action="status_services.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+
+<div id="boxarea">
+<table class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="status services">
+ <thead>
+ <tr>
+ <td class="listhdrr" align="center"><?=gettext("Service");?></td>
+ <td class="listhdrr" align="center"><?=gettext("Description");?></td>
+ <td class="listhdrr" align="center"><?=gettext("Status");?></td>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+
+$services = get_services();
+
+if (count($services) > 0) {
+ uasort($services, "service_name_compare");
+ foreach ($services as $service) {
+ if (empty($service['name'])) {
+ continue;
+ }
+ if (empty($service['description'])) {
+ $service['description'] = get_pkg_descr($service['name']);
+ }
+ echo "<tr><td class=\"listlr\" width=\"20%\">" . $service['name'] . "</td>\n";
+ echo "<td class=\"listr\" width=\"55%\">" . $service['description'] . "</td>\n";
+ // if service is running then listr else listbg
+ $bgclass = null;
+ if (get_service_status($service)) {
+ $bgclass = "listr";
+ } else {
+ $bgclass = "listbg";
+ }
+ echo "<td class=\"" . $bgclass . "\" align=\"center\">" . get_service_status_icon($service, true, true) . "</td>\n";
+ echo "<td valign=\"middle\" class=\"list nowrap\">" . get_service_control_links($service);
+ $scut = get_shortcut_by_service_name($service['name']);
+ if (!empty($scut)) {
+ echo get_shortcut_main_link($scut, true, $service);
+ echo get_shortcut_status_link($scut, true, $service);
+ echo get_shortcut_log_link($scut, true);
+ }
+ echo "</td></tr>\n";
+ }
+} else {
+ echo "<tr><td colspan=\"3\" align=\"center\">" . gettext("No services found") . " . </td></tr>\n";
+}
+
+?>
+ </tbody>
+</table>
+</div>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_upnp.php b/src/usr/local/www/status_upnp.php
new file mode 100644
index 0000000..62349df
--- /dev/null
+++ b/src/usr/local/www/status_upnp.php
@@ -0,0 +1,130 @@
+<?php
+/* $Id$ */
+/*
+ status_upnp.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /sbin/pfctl
+ pfSense_MODULE: upnp
+*/
+
+##|+PRIV
+##|*IDENT=page-status-upnpstatus
+##|*NAME=Status: UPnP Status page
+##|*DESCR=Allow access to the 'Status: UPnP Status' page.
+##|*MATCH=status_upnp.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if ($_POST) {
+ if ($_POST['clear'] == "Clear") {
+ upnp_action('restart');
+ $savemsg = gettext("Rules have been cleared and the daemon restarted");
+ }
+}
+
+$rdr_entries = array();
+exec("/sbin/pfctl -aminiupnpd -sn", $rdr_entries, $pf_ret);
+
+$now = time();
+$year = date("Y");
+
+$pgtitle = array(gettext("Status"), gettext("UPnP &amp; NAT-PMP Status"));
+$shortcut_section = "upnp";
+include("head.inc");
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php
+if (!$config['installedpackages'] || !$config['installedpackages']['miniupnpd']['config'][0]['iface_array'] ||
+ !$config['installedpackages']['miniupnpd']['config'][0]['enable']) {
+ echo gettext("UPnP is currently disabled.");
+ include("fend.inc");
+ exit;
+}
+?>
+<div id="mainlevel">
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td class="tabcont" >
+ <form action="status_upnp.php" method="post">
+ <input type="submit" name="clear" id="clear" value="<?=gettext("Clear");?>" /> <?=gettext("all currently connected sessions");?>.
+ </form>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont" >
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" class="tabcont">
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Port");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Protocol");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Internal IP");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Int. Port");?></td>
+ <td width="50%" class="listhdr"><?=gettext("Description");?></td>
+ </tr>
+<?php
+ foreach ($rdr_entries as $rdr_entry) {
+ if (preg_match("/on (.*) inet proto (.*) from any to any port = (.*) keep state label \"(.*)\" rtable [0-9] -> (.*) port (.*)/", $rdr_entry, $matches)) {
+ $rdr_proto = $matches[2];
+ $rdr_port = $matches[3];
+ $rdr_label =$matches[4];
+ $rdr_ip = $matches[5];
+ $rdr_iport = $matches[6];
+?>
+ <tr>
+ <td class="listlr">
+ <?php print $rdr_port;?>
+ </td>
+ <td class="listr">
+ <?php print $rdr_proto;?>
+ </td>
+ <td class="listr">
+ <?php print $rdr_ip;?>
+ </td>
+ <td class="listr">
+ <?php print $rdr_iport;?>
+ </td>
+ <td class="listr">
+ <?php print $rdr_label;?>
+ </td>
+ </tr>
+<?php
+ }
+ }
+?>
+ </table>
+ </td>
+ </tr>
+</table>
+</div>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/status_wireless.php b/src/usr/local/www/status_wireless.php
new file mode 100644
index 0000000..be51458
--- /dev/null
+++ b/src/usr/local/www/status_wireless.php
@@ -0,0 +1,201 @@
+<?php
+/*
+ status_wireless.php
+ Copyright (C) 2004 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: interfaces
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-wirelessstatus
+##|*NAME=Status: Wireless page
+##|*DESCR=Allow access to the 'Status: Wireless' page.
+##|*MATCH=status_wireless.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+
+$pgtitle = array(gettext("Status"), gettext("Wireless"));
+$shortcut_section = "wireless";
+include("head.inc");
+
+$if = $_POST['if'];
+if ($_GET['if'] <> "") {
+ $if = $_GET['if'];
+}
+
+$ciflist = get_configured_interface_with_descr();
+if (empty($if)) {
+ /* Find the first interface
+ that is wireless */
+ foreach ($ciflist as $interface => $ifdescr) {
+ if (is_interface_wireless(get_real_interface($interface))) {
+ $if = $interface;
+ break;
+ }
+ }
+}
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php
+include("fbegin.inc");
+?>
+<form action="status_wireless.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr><td>
+<?php
+ $tab_array = array();
+ foreach ($ciflist as $interface => $ifdescr) {
+ if (is_interface_wireless(get_real_interface($interface))) {
+ $enabled = false;
+ if ($if == $interface) {
+ $enabled = true;
+ }
+ $tab_array[] = array(gettext("Status") . " ({$ifdescr})", $enabled, "status_wireless.php?if={$interface}");
+ }
+ }
+ $rwlif = get_real_interface($if);
+ if ($_POST['rescanwifi'] <> "") {
+ mwexec_bg("/sbin/ifconfig {$rwlif} scan 2>&1");
+ $savemsg = gettext("Rescan has been initiated in the background. Refresh this page in 10 seconds to see the results.");
+ }
+ if ($savemsg) print_info_box($savemsg);
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea" class="tabcont">
+ <input type="hidden" name="if" id="if" value="<?php echo htmlspecialchars($if); ?>">
+ <b><input type="submit" name="rescanwifi" id="rescanwifi" value="Rescan"></b><br /><br />
+ <b><?php echo gettext("Nearby access points or ad-hoc peers"); ?></b>
+ <table class="tabcont sortable" colspan="3" cellpadding="3" width="100%">
+ <thead>
+ <tr bgcolor='#990000'>
+ <td><b><font color='#ffffff'>SSID</font></b></td>
+ <td><b><font color='#ffffff'>BSSID</font></b></td>
+ <td><b><font color='#ffffff'>CHAN</font></b></td>
+ <td><b><font color='#ffffff'>RATE</font></b></td>
+ <td><b><font color='#ffffff'>RSSI</font></b></td>
+ <td><b><font color='#ffffff'>INT</font></b></td>
+ <td><b><font color='#ffffff'>CAPS</font></b></td>
+ </tr>
+ </thead>
+ <tbody>
+<?php
+ exec("/sbin/ifconfig {$rwlif} list scan 2>&1", $states, $ret);
+ /* Skip Header */
+ array_shift($states);
+
+ $counter = 0;
+ foreach ($states as $state) {
+ /* Split by Mac address for the SSID Field */
+ $split = preg_split("/([0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f])/i", $state);
+ preg_match("/([0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f]\:[0-9a-f][[0-9a-f])/i", $state, $bssid);
+ $ssid = htmlspecialchars($split[0]);
+ $bssid = $bssid[0];
+ /* Split the rest by using spaces for this line using the 2nd part */
+ $split = preg_split("/[ ]+/i", $split[1]);
+ $channel = $split[1];
+ $rate = $split[2];
+ $rssi = $split[3];
+ $int = $split[4];
+ $caps = "$split[5] $split[6] $split[7] $split[8] $split[9] $split[10] $split[11] ";
+
+ print "<tr>";
+ print "<td>{$ssid}</td>";
+ print "<td>{$bssid}</td>";
+ print "<td>{$channel}</td>";
+ print "<td>{$rate}</td>";
+ print "<td>{$rssi}</td>";
+ print "<td>{$int}</td>";
+ print "<td>{$caps}</td>";
+ print "</tr>\n";
+ }
+?>
+ </tbody>
+ </table>
+ <b><?php echo gettext("Associated or ad-hoc peers"); ?></b><br />
+ <table class="tabcont sortable" colspan="3" cellpadding="3" width="100%">
+ <thead>
+ <tr bgcolor='#990000'>
+ <td><b><font color='#ffffff'>ADDR</font></b></td>
+ <td><b><font color='#ffffff'>AID</font></b></td>
+ <td><b><font color='#ffffff'>CHAN</font></b></td>
+ <td><b><font color='#ffffff'>RATE</font></b></td>
+ <td><b><font color='#ffffff'>RSSI</font></b></td>
+ <td><b><font color='#ffffff'>IDLE</font></b></td>
+ <td><b><font color='#ffffff'>TXSEQ</font></b></td>
+ <td><b><font color='#ffffff'>RXSEQ</font></b></td>
+ <td><b><font color='#ffffff'>CAPS</font></b></td>
+ <td><b><font color='#ffffff'>ERP</font></b></td>
+ </tr>
+ </thead>
+ <tbody>
+
+<?php
+ $states = array();
+ exec("/sbin/ifconfig {$rwlif} list sta 2>&1", $states, $ret);
+ array_shift($states);
+
+ $counter = 0;
+ foreach ($states as $state) {
+ $split = preg_split("/[ ]+/i", $state);
+ /* Split the rest by using spaces for this line using the 2nd part */
+ print "<tr>";
+ print "<td>{$split[0]}</td>";
+ print "<td>{$split[1]}</td>";
+ print "<td>{$split[2]}</td>";
+ print "<td>{$split[3]}</td>";
+ print "<td>{$split[4]}</td>";
+ print "<td>{$split[5]}</td>";
+ print "<td>{$split[6]}</td>";
+ print "<td>{$split[7]}</td>";
+ print "<td>{$split[8]}</td>";
+ print "<td>{$split[9]}</td>";
+ print "</tr>\n";
+ }
+
+/* XXX: what stats to we get for adhoc mode? */
+
+?>
+ </tbody>
+ </table>
+ </div>
+ <br />
+ <b>Flags:</b> A = Authorized, E = Extended Rate (802.11g), P = Power save mode, H = High Throughput (HT), Q = QoS (WME)<br />
+ <b>Capabilities:</b> WME = Wireless Multimedia Extensions (QoS), WPA = Wi-Fi Protected Access, RSN = 802.11i, HTCAP = 802.11n High Throughput, ATH = Atheros protocol extensions<br />
+ </td>
+ </tr>
+</table>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system.php b/src/usr/local/www/system.php
new file mode 100644
index 0000000..b275129
--- /dev/null
+++ b/src/usr/local/www/system.php
@@ -0,0 +1,565 @@
+<?php
+/* $Id$ */
+/*
+ system.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /bin/kill /usr/bin/tar
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-system-generalsetup
+##|*NAME=System: General Setup page
+##|*DESCR=Allow access to the 'System: General Setup' page.
+##|*MATCH=system.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$pconfig['hostname'] = $config['system']['hostname'];
+$pconfig['domain'] = $config['system']['domain'];
+list($pconfig['dns1'], $pconfig['dns2'], $pconfig['dns3'], $pconfig['dns4']) = $config['system']['dnsserver'];
+
+$arr_gateways = return_gateways_array();
+
+$pconfig['dns1gw'] = $config['system']['dns1gw'];
+$pconfig['dns2gw'] = $config['system']['dns2gw'];
+$pconfig['dns3gw'] = $config['system']['dns3gw'];
+$pconfig['dns4gw'] = $config['system']['dns4gw'];
+
+$pconfig['dnsallowoverride'] = isset($config['system']['dnsallowoverride']);
+$pconfig['timezone'] = $config['system']['timezone'];
+$pconfig['timeupdateinterval'] = $config['system']['time-update-interval'];
+$pconfig['timeservers'] = $config['system']['timeservers'];
+$pconfig['theme'] = $config['system']['theme'];
+$pconfig['language'] = $config['system']['language'];
+
+$pconfig['dnslocalhost'] = isset($config['system']['dnslocalhost']);
+
+if (!isset($pconfig['timeupdateinterval'])) {
+ $pconfig['timeupdateinterval'] = 300;
+}
+if (!$pconfig['timezone']) {
+ $pconfig['timezone'] = "Etc/UTC";
+}
+if (!$pconfig['timeservers']) {
+ $pconfig['timeservers'] = "pool.ntp.org";
+}
+
+$changedesc = gettext("System") . ": ";
+$changecount = 0;
+
+function is_timezone($elt) {
+ return !preg_match("/\/$/", $elt);
+}
+
+if ($pconfig['timezone'] <> $_POST['timezone']) {
+ filter_pflog_start(true);
+}
+
+exec('/usr/bin/tar -tzf /usr/share/zoneinfo.tgz', $timezonelist);
+$timezonelist = array_filter($timezonelist, 'is_timezone');
+sort($timezonelist);
+
+$multiwan = false;
+$interfaces = get_configured_interface_list();
+foreach ($interfaces as $interface) {
+ if (interface_has_gateway($interface)) {
+ $multiwan = true;
+ }
+}
+
+if ($_POST) {
+
+ $changecount++;
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "hostname domain");
+ $reqdfieldsn = array(gettext("Hostname"), gettext("Domain"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['hostname']) {
+ if (!is_hostname($_POST['hostname'])) {
+ $input_errors[] = gettext("The hostname can only contain the characters A-Z, 0-9 and '-'. It may not start or end with '-'.");
+ } else {
+ if (!is_unqualified_hostname($_POST['hostname'])) {
+ $input_errors[] = gettext("A valid hostname is specified, but the domain name part should be omitted");
+ }
+ }
+ }
+ if ($_POST['domain'] && !is_domain($_POST['domain'])) {
+ $input_errors[] = gettext("The domain may only contain the characters a-z, 0-9, '-' and '.'.");
+ }
+
+ $ignore_posted_dnsgw = array();
+
+ for ($dnscounter=1; $dnscounter<5; $dnscounter++) {
+ $dnsname="dns{$dnscounter}";
+ $dnsgwname="dns{$dnscounter}gw";
+ if (($_POST[$dnsname] && !is_ipaddr($_POST[$dnsname]))) {
+ $input_errors[] = gettext("A valid IP address must be specified for DNS server $dnscounter.");
+ } else {
+ if (($_POST[$dnsgwname] <> "") && ($_POST[$dnsgwname] <> "none")) {
+ // A real gateway has been selected.
+ if (is_ipaddr($_POST[$dnsname])) {
+ if ((is_ipaddrv4($_POST[$dnsname])) && (validate_address_family($_POST[$dnsname], $_POST[$dnsgwname]) === false)) {
+ $input_errors[] = gettext("You can not specify IPv6 gateway '{$_POST[$dnsgwname]}' for IPv4 DNS server '{$_POST[$dnsname]}'");
+ }
+ if ((is_ipaddrv6($_POST[$dnsname])) && (validate_address_family($_POST[$dnsname], $_POST[$dnsgwname]) === false)) {
+ $input_errors[] = gettext("You can not specify IPv4 gateway '{$_POST[$dnsgwname]}' for IPv6 DNS server '{$_POST[$dnsname]}'");
+ }
+ } else {
+ // The user selected a gateway but did not provide a DNS address. Be nice and set the gateway back to "none".
+ $ignore_posted_dnsgw[$dnsgwname] = true;
+ }
+ }
+ }
+ }
+
+ $direct_networks_list = explode(" ", filter_get_direct_networks_list());
+ for ($dnscounter=1; $dnscounter<5; $dnscounter++) {
+ $dnsitem = "dns{$dnscounter}";
+ $dnsgwitem = "dns{$dnscounter}gw";
+ if ($_POST[$dnsgwitem]) {
+ if (interface_has_gateway($_POST[$dnsgwitem])) {
+ foreach ($direct_networks_list as $direct_network) {
+ if (ip_in_subnet($_POST[$dnsitem], $direct_network)) {
+ $input_errors[] = sprintf(gettext("You can not assign a gateway to DNS '%s' server which is on a directly connected network."), $_POST[$dnsitem]);
+ }
+ }
+ }
+ }
+ }
+
+ $t = (int)$_POST['timeupdateinterval'];
+ if (($t < 0) || (($t > 0) && ($t < 6)) || ($t > 1440)) {
+ $input_errors[] = gettext("The time update interval must be either 0 (disabled) or between 6 and 1440.");
+ }
+ # it's easy to have a little too much whitespace in the field, clean it up for the user before processing.
+ $_POST['timeservers'] = preg_replace('/[[:blank:]]+/', ' ', $_POST['timeservers']);
+ $_POST['timeservers'] = trim($_POST['timeservers']);
+ foreach (explode(' ', $_POST['timeservers']) as $ts) {
+ if (!is_domain($ts)) {
+ $input_errors[] = gettext("A NTP Time Server name may only contain the characters a-z, 0-9, '-' and '.'.");
+ }
+ }
+
+ if (!$input_errors) {
+ update_if_changed("hostname", $config['system']['hostname'], $_POST['hostname']);
+ update_if_changed("domain", $config['system']['domain'], $_POST['domain']);
+
+ update_if_changed("timezone", $config['system']['timezone'], $_POST['timezone']);
+ update_if_changed("NTP servers", $config['system']['timeservers'], strtolower($_POST['timeservers']));
+ update_if_changed("NTP update interval", $config['system']['time-update-interval'], $_POST['timeupdateinterval']);
+
+ if ($_POST['language'] && $_POST['language'] != $config['system']['language']) {
+ $config['system']['language'] = $_POST['language'];
+ set_language($config['system']['language']);
+ }
+
+ /* pfSense themes */
+ if (!$g['disablethemeselection']) {
+ update_if_changed("System Theme", $config['theme'], $_POST['theme']);
+ }
+
+ /* XXX - billm: these still need updating after figuring out how to check if they actually changed */
+ $olddnsservers = $config['system']['dnsserver'];
+ unset($config['system']['dnsserver']);
+ if ($_POST['dns1']) {
+ $config['system']['dnsserver'][] = $_POST['dns1'];
+ }
+ if ($_POST['dns2']) {
+ $config['system']['dnsserver'][] = $_POST['dns2'];
+ }
+ if ($_POST['dns3']) {
+ $config['system']['dnsserver'][] = $_POST['dns3'];
+ }
+ if ($_POST['dns4']) {
+ $config['system']['dnsserver'][] = $_POST['dns4'];
+ }
+
+ $olddnsallowoverride = $config['system']['dnsallowoverride'];
+
+ unset($config['system']['dnsallowoverride']);
+ $config['system']['dnsallowoverride'] = $_POST['dnsallowoverride'] ? true : false;
+
+ if ($_POST['dnslocalhost'] == "yes") {
+ $config['system']['dnslocalhost'] = true;
+ } else {
+ unset($config['system']['dnslocalhost']);
+ }
+
+ /* which interface should the dns servers resolve through? */
+ $outdnscounter = 0;
+ for ($dnscounter=1; $dnscounter<5; $dnscounter++) {
+ $dnsname="dns{$dnscounter}";
+ $dnsgwname="dns{$dnscounter}gw";
+ $olddnsgwname = $config['system'][$dnsgwname];
+
+ if ($ignore_posted_dnsgw[$dnsgwname]) {
+ $thisdnsgwname = "none";
+ } else {
+ $thisdnsgwname = $pconfig[$dnsgwname];
+ }
+
+ // "Blank" out the settings for this index, then we set them below using the "outdnscounter" index.
+ $config['system'][$dnsgwname] = "none";
+ $pconfig[$dnsgwname] = "none";
+ $pconfig[$dnsname] = "";
+
+ if ($_POST[$dnsname]) {
+ // Only the non-blank DNS servers were put into the config above.
+ // So we similarly only add the corresponding gateways sequentially to the config (and to pconfig), as we find non-blank DNS servers.
+ // This keeps the DNS server IP and corresponding gateway "lined up" when the user blanks out a DNS server IP in the middle of the list.
+ $outdnscounter++;
+ $outdnsname="dns{$outdnscounter}";
+ $outdnsgwname="dns{$outdnscounter}gw";
+ $pconfig[$outdnsname] = $_POST[$dnsname];
+ if ($_POST[$dnsgwname]) {
+ $config['system'][$outdnsgwname] = $thisdnsgwname;
+ $pconfig[$outdnsgwname] = $thisdnsgwname;
+ } else {
+ // Note: when no DNS GW name is chosen, the entry is set to "none", so actually this case never happens.
+ unset($config['system'][$outdnsgwname]);
+ $pconfig[$outdnsgwname] = "";
+ }
+ }
+ if (($olddnsgwname != "") && ($olddnsgwname != "none") && (($olddnsgwname != $thisdnsgwname) || ($olddnsservers[$dnscounter-1] != $_POST[$dnsname]))) {
+ // A previous DNS GW name was specified. It has now gone or changed, or the DNS server address has changed.
+ // Remove the route. Later calls will add the correct new route if needed.
+ if (is_ipaddrv4($olddnsservers[$dnscounter-1])) {
+ mwexec("/sbin/route delete " . escapeshellarg($olddnsservers[$dnscounter-1]));
+ } else {
+ if (is_ipaddrv6($olddnsservers[$dnscounter-1])) {
+ mwexec("/sbin/route delete -inet6 " . escapeshellarg($olddnsservers[$dnscounter-1]));
+ }
+ }
+ }
+ }
+
+ if ($changecount > 0) {
+ write_config($changedesc);
+ }
+
+ $retval = 0;
+ $retval = system_hostname_configure();
+ $retval |= system_hosts_generate();
+ $retval |= system_resolvconf_generate();
+ if (isset($config['dnsmasq']['enable'])) {
+ $retval |= services_dnsmasq_configure();
+ } elseif (isset($config['unbound']['enable'])) {
+ $retval |= services_unbound_configure();
+ }
+ $retval |= system_timezone_configure();
+ $retval |= system_ntp_configure();
+
+ if ($olddnsallowoverride != $config['system']['dnsallowoverride']) {
+ $retval |= send_event("service reload dns");
+ }
+
+ // Reload the filter - plugins might need to be run.
+ $retval |= filter_configure();
+
+ $savemsg = get_std_save_message($retval);
+ }
+
+ unset($ignore_posted_dnsgw);
+}
+
+$pgtitle = array(gettext("System"), gettext("General Setup"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php
+ include("fbegin.inc");
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+ <form action="system.php" method="post">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="general setup">
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("System"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname"); ?></td>
+ <td width="78%" class="vtable"> <input name="hostname" type="text" class="formfld unknown" id="hostname" size="40" value="<?=htmlspecialchars($pconfig['hostname']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Name of the firewall host, without domain part"); ?>
+ <br />
+ <?=gettext("e.g."); ?> <em>firewall</em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Domain"); ?></td>
+ <td width="78%" class="vtable"> <input name="domain" type="text" class="formfld unknown" id="domain" size="40" value="<?=htmlspecialchars($pconfig['domain']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Do not use 'local' as a domain name. It will cause local hosts running mDNS (avahi, bonjour, etc.) to be unable to resolve local hosts not running mDNS."); ?>
+ <br />
+ <?=gettext("e.g."); ?> <em><?=gettext("mycorp.com, home, office, private, etc."); ?></em>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers"); ?></td>
+ <td width="78%" class="vtable">
+ <br />
+ <table summary="dns servers and gateways">
+ <tr>
+ <td><b><?=gettext("DNS Server"); ?></b></td>
+ <?php if ($multiwan): ?>
+ <td><b><?=gettext("Use gateway"); ?></b></td>
+ <?php endif; ?>
+ </tr>
+<?php
+ for ($dnscounter = 1; $dnscounter < 5; $dnscounter++):
+ $fldname="dns{$dnscounter}gw";
+?>
+ <tr>
+ <td>
+ <input name="dns<?php echo $dnscounter;?>" type="text" class="formfld unknown" id="dns<?php echo $dnscounter;?>" size="28" value="<?php echo $pconfig['dns'.$dnscounter];?>" />
+ </td>
+ <td>
+<?php
+ if ($multiwan):
+?>
+ <select name='<?=$fldname;?>'>
+<?php
+ $gwname = "none";
+ $dnsgw = "dns{$dnscounter}gw";
+ if ($pconfig[$dnsgw] == $gwname) {
+ $selected = "selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ echo "<option value='$gwname' $selected>$gwname</option>\n";
+ foreach ($arr_gateways as $gwname => $gwitem) {
+ //echo $pconfig[$dnsgw];
+ if ((is_ipaddrv4(lookup_gateway_ip_by_name($pconfig[$dnsgw])) && (is_ipaddrv6($gwitem['gateway'])))) {
+ continue;
+ }
+ if ((is_ipaddrv6(lookup_gateway_ip_by_name($pconfig[$dnsgw])) && (is_ipaddrv4($gwitem['gateway'])))) {
+ continue;
+ }
+ if ($pconfig[$dnsgw] == $gwname) {
+ $selected = "selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ echo "<option value='$gwname' $selected>$gwname - {$gwitem['friendlyiface']} - {$gwitem['gateway']}</option>\n";
+ }
+?>
+ </select>
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+<?php
+ endfor;
+?>
+ </table>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Enter IP addresses to be used by the system for DNS resolution. " .
+ "These are also used for the DHCP service, DNS forwarder and for PPTP VPN clients."); ?>
+ <br />
+ <?php if ($multiwan): ?>
+ <br />
+ <?=gettext("In addition, optionally select the gateway for each DNS server. " .
+ "When using multiple WAN connections there should be at least one unique DNS server per gateway."); ?>
+ <br />
+ <?php endif; ?>
+ <br />
+ <input name="dnsallowoverride" type="checkbox" id="dnsallowoverride" value="yes" <?php if ($pconfig['dnsallowoverride']) echo "checked=\"checked\""; ?> />
+ <strong>
+ <?=gettext("Allow DNS server list to be overridden by DHCP/PPP on WAN"); ?>
+ </strong>
+ <br />
+ <?php printf(gettext("If this option is set, %s will " .
+ "use DNS servers assigned by a DHCP/PPP server on WAN " .
+ "for its own purposes (including the DNS forwarder). " .
+ "However, they will not be assigned to DHCP and PPTP " .
+ "VPN clients."), $g['product_name']); ?>
+ <br />
+ <br />
+ <input name="dnslocalhost" type="checkbox" id="dnslocalhost" value="yes" <?php if ($pconfig['dnslocalhost']) echo "checked=\"checked\""; ?> />
+ <strong>
+ <?=gettext("Do not use the DNS Forwarder or Resolver as a DNS server for the firewall"); ?>
+ </strong>
+ <br />
+ <?=gettext("By default localhost (127.0.0.1) will be used as the first DNS server where the DNS Forwarder or DNS Resolver is enabled and set to listen on Localhost, so system can use the local DNS service to perform lookups. ".
+ "Checking this box omits localhost from the list of DNS servers."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Time zone"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="timezone" id="timezone">
+ <?php foreach ($timezonelist as $value): ?>
+ <?php if (strstr($value, "GMT")) continue; ?>
+ <option value="<?=htmlspecialchars($value);?>" <?php if ($value == $pconfig['timezone']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($value);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Select the location closest to you"); ?>
+ </span>
+ </td>
+ </tr>
+<!--
+ <tr>
+ <td width="22%" valign="top" class="vncell">Time update interval</td>
+ <td width="78%" class="vtable">
+ <input name="timeupdateinterval" type="text" class="formfld unknown" id="timeupdateinterval" size="4" value="<?=htmlspecialchars($pconfig['timeupdateinterval']);?>" />
+ <br />
+ <span class="vexpl">
+ Minutes between network time sync. 300 recommended,
+ or 0 to disable
+ </span>
+ </td>
+ </tr>
+-->
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NTP time server"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="timeservers" type="text" class="formfld unknown" id="timeservers" size="40" value="<?=htmlspecialchars($pconfig['timeservers']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Use a space to separate multiple hosts (only one " .
+ "required). Remember to set up at least one DNS server " .
+ "if you enter a host name here!"); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?php echo gettext("Language");?></td>
+ <td width="78%" class="vtable">
+ <select name="language">
+ <?php
+ foreach (get_locale_list() as $lcode => $ldesc) {
+ $selected = ' selected="selected"';
+ if ($lcode != $pconfig['language']) {
+ $selected = '';
+ }
+ echo "<option value=\"{$lcode}\"{$selected}>{$ldesc}</option>";
+ }
+ ?>
+ </select>
+ <strong>
+ <?=gettext("Choose a language for the webConfigurator"); ?>
+ </strong>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+<?php
+ if (!$g['disablethemeselection']):
+?>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Theme"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <select name="theme">
+<?php
+ $files = return_dir_as_array("/usr/local/www/themes/");
+ foreach ($files as $f):
+ if ((substr($f, 0, 1) == "_") && !isset($config['system']['developer'])) {
+ continue;
+ }
+ if ($f == "CVS") {
+ continue;
+ }
+ $curtheme = "pfsense";
+ if ($config['theme']) {
+ $curtheme = $config['theme'];
+ }
+ $selected = "";
+ if ($f == $curtheme) {
+ $selected = " selected=\"selected\"";
+ }
+?>
+ <option <?=$selected;?>><?=$f;?></option>
+<?php
+ endforeach;
+?>
+ </select>
+ <strong>
+ <?=gettext("This will change the look and feel of"); ?>
+ <?=$g['product_name'];?>.
+ </strong>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_advanced_admin.php b/src/usr/local/www/system_advanced_admin.php
new file mode 100644
index 0000000..a449452
--- /dev/null
+++ b/src/usr/local/www/system_advanced_admin.php
@@ -0,0 +1,657 @@
+<?php
+/* $Id$ */
+/*
+ system_advanced_admin.php
+ part of pfSense
+ Copyright (C) 2005-2010 Scott Ullrich
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/killall
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-system-advanced-admin
+##|*NAME=System: Advanced: Admin Access Page
+##|*DESCR=Allow access to the 'System: Advanced: Admin Access' page.
+##|*MATCH=system_advanced_admin.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$pconfig['webguiproto'] = $config['system']['webgui']['protocol'];
+$pconfig['webguiport'] = $config['system']['webgui']['port'];
+$pconfig['max_procs'] = ($config['system']['webgui']['max_procs']) ? $config['system']['webgui']['max_procs'] : 2;
+$pconfig['ssl-certref'] = $config['system']['webgui']['ssl-certref'];
+$pconfig['disablehttpredirect'] = isset($config['system']['webgui']['disablehttpredirect']);
+$pconfig['disableconsolemenu'] = isset($config['system']['disableconsolemenu']);
+$pconfig['noantilockout'] = isset($config['system']['webgui']['noantilockout']);
+$pconfig['nodnsrebindcheck'] = isset($config['system']['webgui']['nodnsrebindcheck']);
+$pconfig['nohttpreferercheck'] = isset($config['system']['webgui']['nohttpreferercheck']);
+$pconfig['pagenamefirst'] = isset($config['system']['webgui']['pagenamefirst']);
+$pconfig['loginautocomplete'] = isset($config['system']['webgui']['loginautocomplete']);
+$pconfig['althostnames'] = $config['system']['webgui']['althostnames'];
+$pconfig['enableserial'] = $config['system']['enableserial'];
+$pconfig['serialspeed'] = $config['system']['serialspeed'];
+$pconfig['primaryconsole'] = $config['system']['primaryconsole'];
+$pconfig['enablesshd'] = $config['system']['enablesshd'];
+$pconfig['sshport'] = $config['system']['ssh']['port'];
+$pconfig['sshdkeyonly'] = isset($config['system']['ssh']['sshdkeyonly']);
+$pconfig['quietlogin'] = isset($config['system']['webgui']['quietlogin']);
+
+$a_cert =& $config['cert'];
+
+$certs_available = false;
+if (is_array($a_cert) && count($a_cert)) {
+ $certs_available = true;
+}
+
+if (!$pconfig['webguiproto'] || !$certs_available) {
+ $pconfig['webguiproto'] = "http";
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['webguiport']) {
+ if (!is_port($_POST['webguiport'])) {
+ $input_errors[] = gettext("You must specify a valid webConfigurator port number");
+ }
+ }
+
+ if ($_POST['max_procs']) {
+ if (!is_numericint($_POST['max_procs']) || ($_POST['max_procs'] < 1) || ($_POST['max_procs'] > 500)) {
+ $input_errors[] = gettext("Max Processes must be a number 1 or greater");
+ }
+ }
+
+ if ($_POST['althostnames']) {
+ $althosts = explode(" ", $_POST['althostnames']);
+ foreach ($althosts as $ah) {
+ if (!is_hostname($ah)) {
+ $input_errors[] = sprintf(gettext("Alternate hostname %s is not a valid hostname."), htmlspecialchars($ah));
+ }
+ }
+ }
+
+ if ($_POST['sshport']) {
+ if (!is_port($_POST['sshport'])) {
+ $input_errors[] = gettext("You must specify a valid port number");
+ }
+ }
+
+ if ($_POST['sshdkeyonly'] == "yes") {
+ $config['system']['ssh']['sshdkeyonly'] = "enabled";
+ } else if (isset($config['system']['ssh']['sshdkeyonly'])) {
+ unset($config['system']['ssh']['sshdkeyonly']);
+ }
+
+ ob_flush();
+ flush();
+
+ if (!$input_errors) {
+
+ if (update_if_changed("webgui protocol", $config['system']['webgui']['protocol'], $_POST['webguiproto'])) {
+ $restart_webgui = true;
+ }
+ if (update_if_changed("webgui port", $config['system']['webgui']['port'], $_POST['webguiport'])) {
+ $restart_webgui = true;
+ }
+ if (update_if_changed("webgui certificate", $config['system']['webgui']['ssl-certref'], $_POST['ssl-certref'])) {
+ $restart_webgui = true;
+ }
+ if (update_if_changed("webgui max processes", $config['system']['webgui']['max_procs'], $_POST['max_procs'])) {
+ $restart_webgui = true;
+ }
+
+ if ($_POST['disablehttpredirect'] == "yes") {
+ $config['system']['webgui']['disablehttpredirect'] = true;
+ $restart_webgui = true;
+ } else {
+ unset($config['system']['webgui']['disablehttpredirect']);
+ $restart_webgui = true;
+ }
+ if ($_POST['quietlogin'] == "yes") {
+ $config['system']['webgui']['quietlogin'] = true;
+ } else {
+ unset($config['system']['webgui']['quietlogin']);
+ }
+
+ if ($_POST['disableconsolemenu'] == "yes") {
+ $config['system']['disableconsolemenu'] = true;
+ } else {
+ unset($config['system']['disableconsolemenu']);
+ }
+
+ if ($_POST['noantilockout'] == "yes") {
+ $config['system']['webgui']['noantilockout'] = true;
+ } else {
+ unset($config['system']['webgui']['noantilockout']);
+ }
+
+ if ($_POST['enableserial'] == "yes" || $g['enableserial_force']) {
+ $config['system']['enableserial'] = true;
+ } else {
+ unset($config['system']['enableserial']);
+ }
+
+ if (is_numericint($_POST['serialspeed'])) {
+ $config['system']['serialspeed'] = $_POST['serialspeed'];
+ } else {
+ unset($config['system']['serialspeed']);
+ }
+
+ if ($_POST['primaryconsole']) {
+ $config['system']['primaryconsole'] = $_POST['primaryconsole'];
+ } else {
+ unset($config['system']['primaryconsole']);
+ }
+
+ if ($_POST['nodnsrebindcheck'] == "yes") {
+ $config['system']['webgui']['nodnsrebindcheck'] = true;
+ } else {
+ unset($config['system']['webgui']['nodnsrebindcheck']);
+ }
+
+ if ($_POST['nohttpreferercheck'] == "yes") {
+ $config['system']['webgui']['nohttpreferercheck'] = true;
+ } else {
+ unset($config['system']['webgui']['nohttpreferercheck']);
+ }
+
+ if ($_POST['pagenamefirst'] == "yes") {
+ $config['system']['webgui']['pagenamefirst'] = true;
+ } else {
+ unset($config['system']['webgui']['pagenamefirst']);
+ }
+
+ if ($_POST['loginautocomplete'] == "yes") {
+ $config['system']['webgui']['loginautocomplete'] = true;
+ } else {
+ unset($config['system']['webgui']['loginautocomplete']);
+ }
+
+ if ($_POST['althostnames']) {
+ $config['system']['webgui']['althostnames'] = $_POST['althostnames'];
+ } else {
+ unset($config['system']['webgui']['althostnames']);
+ }
+
+ $sshd_enabled = $config['system']['enablesshd'];
+ if ($_POST['enablesshd']) {
+ $config['system']['enablesshd'] = "enabled";
+ } else {
+ unset($config['system']['enablesshd']);
+ }
+
+ $sshd_keyonly = isset($config['system']['sshdkeyonly']);
+ if ($_POST['sshdkeyonly']) {
+ $config['system']['sshdkeyonly'] = true;
+ } else {
+ unset($config['system']['sshdkeyonly']);
+ }
+
+ $sshd_port = $config['system']['ssh']['port'];
+ if ($_POST['sshport']) {
+ $config['system']['ssh']['port'] = $_POST['sshport'];
+ } else if (isset($config['system']['ssh']['port'])) {
+ unset($config['system']['ssh']['port']);
+ }
+
+ if (($sshd_enabled != $config['system']['enablesshd']) ||
+ ($sshd_keyonly != $config['system']['sshdkeyonly']) ||
+ ($sshd_port != $config['system']['ssh']['port'])) {
+ $restart_sshd = true;
+ }
+
+ if ($restart_webgui) {
+ global $_SERVER;
+ $http_host_port = explode("]", $_SERVER['HTTP_HOST']);
+ /* IPv6 address check */
+ if (strstr($_SERVER['HTTP_HOST'], "]")) {
+ if (count($http_host_port) > 1) {
+ array_pop($http_host_port);
+ $host = str_replace(array("[", "]"), "", implode(":", $http_host_port));
+ $host = "[{$host}]";
+ } else {
+ $host = str_replace(array("[", "]"), "", implode(":", $http_host_port));
+ $host = "[{$host}]";
+ }
+ } else {
+ list($host) = explode(":", $_SERVER['HTTP_HOST']);
+ }
+ $prot = $config['system']['webgui']['protocol'];
+ $port = $config['system']['webgui']['port'];
+ if ($port) {
+ $url = "{$prot}://{$host}:{$port}/system_advanced_admin.php";
+ } else {
+ $url = "{$prot}://{$host}/system_advanced_admin.php";
+ }
+ }
+
+ write_config();
+
+ $retval = filter_configure();
+ $savemsg = get_std_save_message($retval);
+
+ if ($restart_webgui) {
+ $savemsg .= sprintf("<br />" . gettext("One moment...redirecting to %s in 20 seconds."), $url);
+ }
+
+ conf_mount_rw();
+ setup_serial_port();
+ // Restart DNS in case dns rebinding toggled
+ if (isset($config['dnsmasq']['enable'])) {
+ services_dnsmasq_configure();
+ } elseif (isset($config['unbound']['enable'])) {
+ services_unbound_configure();
+ }
+ conf_mount_ro();
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Advanced: Admin Access"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function prot_change() {
+
+ if (document.iform.https_proto.checked) {
+ document.getElementById("ssl_opts").style.display="";
+ } else {
+ document.getElementById("ssl_opts").style.display="none";
+ }
+}
+
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+ <form action="system_advanced_admin.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced admin">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("NOTE:"); ?>&nbsp;</strong>
+ </span>
+ <?=gettext("The options on this page are intended for use by advanced users only."); ?>
+ <br />
+ </span>
+ <br />
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("webConfigurator"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Protocol"); ?></td>
+ <td width="78%" class="vtable">
+ <?php
+ if ($pconfig['webguiproto'] == "http") {
+ $http_chk = "checked=\"checked\"";
+ }
+ if ($pconfig['webguiproto'] == "https") {
+ $https_chk = "checked=\"checked\"";
+ }
+ if (!$certs_available) {
+ $https_disabled = "disabled=\"disabled\"";
+ }
+ ?>
+ <input name="webguiproto" id="http_proto" type="radio" value="http" <?=$http_chk;?> onclick="prot_change()" />
+ <?=gettext("HTTP"); ?>
+ &nbsp;&nbsp;&nbsp;
+ <input name="webguiproto" id="https_proto" type="radio" value="https" <?=$https_chk;?> <?=$https_disabled;?> onclick="prot_change()" />
+ <?=gettext("HTTPS"); ?>
+ <?php if (!$certs_available): ?>
+ <br />
+ <?=gettext("No Certificates have been defined. You must"); ?>
+ <a href="system_certmanager.php"><?=gettext("Create or Import"); ?></a>
+ <?=gettext("a Certificate before SSL can be enabled."); ?>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr id="ssl_opts">
+ <td width="22%" valign="top" class="vncell"><?=gettext("SSL Certificate"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="ssl-certref" id="ssl-certref" class="formselect">
+ <?php
+ foreach ($a_cert as $cert):
+ $selected = "";
+ if ($pconfig['ssl-certref'] == $cert['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$cert['refid'];?>" <?=$selected;?>><?=htmlspecialchars($cert['descr']);?></option>
+ <?php
+ endforeach;
+ if (!count($a_cert)) {
+ echo "<option></option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("TCP port"); ?></td>
+ <td class="vtable">
+ <input name="webguiport" type="text" class="formfld unknown" id="webguiport" size="5" value="<?=htmlspecialchars($config['system']['webgui']['port']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Enter a custom port number for the webConfigurator " .
+ "above if you want to override the default (80 for HTTP, 443 " .
+ "for HTTPS). Changes will take effect immediately after save."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Max Processes"); ?></td>
+ <td class="vtable">
+ <input name="max_procs" type="text" class="formfld unknown" id="max_procs" size="5" value="<?=htmlspecialchars($pconfig['max_procs']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("Enter the number of webConfigurator processes you " .
+ "want to run. This defaults to 2. Increasing this will allow more " .
+ "users/browsers to access the GUI concurrently."); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("WebGUI redirect"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disablehttpredirect" type="checkbox" id="disablehttpredirect" value="yes" <?php if ($pconfig['disablehttpredirect']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable webConfigurator redirect rule"); ?></strong>
+ <br />
+ <?php echo gettext("When this is unchecked, access to the webConfigurator " .
+ "is always permitted even on port 80, regardless of the listening port configured. " .
+ "Check this box to disable this automatically added redirect rule. ");
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("WebGUI Login Autocomplete"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="loginautocomplete" type="checkbox" id="loginautocomplete" value="yes" <?php if ($pconfig['loginautocomplete']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable webConfigurator login autocomplete"); ?></strong>
+ <br />
+ <?php echo gettext("When this is checked, login credentials for the webConfigurator " .
+ "may be saved by the browser. While convenient, some security standards require this to be disabled. " .
+ "Check this box to enable autocomplete on the login form so that browsers will prompt to save credentials (NOTE: Some browsers do not respect this option). ");
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("WebGUI login messages"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="quietlogin" type="checkbox" id="quietlogin" value="yes" <?php if ($pconfig['quietlogin']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable logging of webConfigurator successful logins"); ?></strong>
+ <br />
+ <?php echo gettext("When this is checked, successful logins to the webConfigurator " .
+ "will not be logged.");
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Anti-lockout"); ?></td>
+ <td width="78%" class="vtable">
+ <?php
+ if ($config['interfaces']['lan']) {
+ $lockout_interface = "LAN";
+ } else {
+ $lockout_interface = "WAN";
+ }
+ ?>
+ <input name="noantilockout" type="checkbox" id="noantilockout" value="yes" <?php if ($pconfig['noantilockout']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable webConfigurator anti-lockout rule"); ?></strong>
+ <br />
+ <?php printf(gettext("When this is unchecked, access to the webConfigurator " .
+ "on the %s interface is always permitted, regardless of the user-defined firewall " .
+ "rule set. Check this box to disable this automatically added rule, so access " .
+ "to the webConfigurator is controlled by the user-defined firewall rules " .
+ "(ensure you have a firewall rule in place that allows you in, or you will " .
+ "lock yourself out!)"), $lockout_interface); ?>
+ <em> <?=gettext("Hint: the &quot;Set interface(s) IP address&quot; option in the console menu resets this setting as well."); ?> </em>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS Rebind Check"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="nodnsrebindcheck" type="checkbox" id="nodnsrebindcheck" value="yes" <?php if ($pconfig['nodnsrebindcheck']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable DNS Rebinding Checks"); ?></strong>
+ <br />
+ <?php echo gettext("When this is unchecked, your system " .
+ "is protected against <a href=\"http://en.wikipedia.org/wiki/DNS_rebinding\">DNS Rebinding attacks</a>. " .
+ "This blocks private IP responses from your configured DNS servers. Check this box to disable this protection if it interferes with " .
+ "webConfigurator access or name resolution in your environment. "); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Alternate Hostnames"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="althostnames" type="text" class="formfld unknown" id="althostnames" size="75" value="<?=htmlspecialchars($pconfig['althostnames']);?>"/>
+ <br />
+ <strong><?=gettext("Alternate Hostnames for DNS Rebinding and HTTP_REFERER Checks"); ?></strong>
+ <br />
+ <?php echo gettext("Here you can specify alternate hostnames by which the router may be queried, to " .
+ "bypass the DNS Rebinding Attack checks. Separate hostnames with spaces."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Browser HTTP_REFERER enforcement"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="nohttpreferercheck" type="checkbox" id="nohttpreferercheck" value="yes" <?php if ($pconfig['nohttpreferercheck']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable HTTP_REFERER enforcement check"); ?></strong>
+ <br />
+ <?php echo gettext("When this is unchecked, access to the webConfigurator " .
+ "is protected against HTTP_REFERER redirection attempts. " .
+ "Check this box to disable this protection if you find that it interferes with " .
+ "webConfigurator access in certain corner cases such as using external scripts to interact with this system. More information on HTTP_REFERER is available from <a target='_blank' href='http://en.wikipedia.org/wiki/HTTP_referrer'>Wikipedia</a>."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Browser tab text"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pagenamefirst" type="checkbox" id="pagenamefirst" value="yes" <?php if ($pconfig['pagenamefirst']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Display page name first in browser tab"); ?></strong>
+ <br />
+ <?php echo gettext("When this is unchecked, the browser tab shows the host name followed by the current page. "); ?>
+ <br />
+ <?php echo gettext("Check this box to display the current page followed by the host name."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Secure Shell"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Secure Shell Server"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="enablesshd" type="checkbox" id="enablesshd" value="yes" <?php if (isset($pconfig['enablesshd'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable Secure Shell"); ?></strong>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Authentication Method"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="sshdkeyonly" type="checkbox" id="sshdkeyonly" value="yes" <?php if ($pconfig['sshdkeyonly']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable password login for Secure Shell (RSA/DSA key only)"); ?></strong>
+ <br />
+ <?=gettext("When enabled, authorized keys need to be configured for each"); ?>
+ <a href="system_usermanager.php"><?=gettext("user"); ?></a>
+ <?=gettext("that has been granted secure shell access."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("SSH port"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="sshport" type="text" id="sshport" value="<?php echo htmlspecialchars($pconfig['sshport']); ?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Note: Leave this blank for the default of 22."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Serial Communications"); ?></td>
+ </tr>
+ <?php if (!$g['enableserial_force'] && ($g['platform'] == "pfSense" || $g['platform'] == "cdrom" || file_exists("/etc/nano_use_vga.txt"))): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Serial Terminal"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="enableserial" type="checkbox" id="enableserial" value="yes" <?php if (isset($pconfig['enableserial'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enables the first serial port with 115200/8/N/1 by default, or another speed selectable below."); ?></strong>
+ <span class="vexpl"><?=gettext("Note: This will redirect the console output and messages to the serial port. You can still access the console menu from the internal video card/keyboard. A <b>null modem</b> serial cable or adapter is required to use the serial console."); ?></span>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Serial Speed")?></td>
+ <td width="78%" class="vtable">
+ <select name="serialspeed" id="serialspeed" class="formselect">
+ <option value="115200" <?php if ($pconfig['serialspeed'] == "115200") echo "selected=\"selected\"";?>>115200</option>
+ <option value="57600" <?php if ($pconfig['serialspeed'] == "57600") echo "selected=\"selected\"";?>>57600</option>
+ <option value="38400" <?php if ($pconfig['serialspeed'] == "38400") echo "selected=\"selected\"";?>>38400</option>
+ <option value="19200" <?php if ($pconfig['serialspeed'] == "19200") echo "selected=\"selected\"";?>>19200</option>
+ <option value="14400" <?php if ($pconfig['serialspeed'] == "14400") echo "selected=\"selected\"";?>>14400</option>
+ <option value="9600" <?php if ($pconfig['serialspeed'] == "9600") echo "selected=\"selected\"";?>>9600</option>
+ </select> bps
+ <br /><?=gettext("Allows selection of different speeds for the serial console port."); ?>
+ </td>
+ </tr>
+ <?php if (!$g['primaryconsole_force'] && ($g['platform'] == "pfSense" || $g['platform'] == "cdrom" || file_exists("/etc/nano_use_vga.txt"))): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Primary Console")?></td>
+ <td width="78%" class="vtable">
+ <select name="primaryconsole" id="primaryconsole" class="formselect">
+ <option value="serial" <?php if ($pconfig['primaryconsole'] == "serial") echo "selected=\"selected\"";?>>Serial Console</option>
+ <option value="video" <?php if ($pconfig['primaryconsole'] == "video") echo "selected=\"selected\"";?>>VGA Console</option>
+ </select>
+ <br /><?=gettext("Select the preferred console if multiple consoles are present. The preferred console will show pfSense boot script output. All consoles display OS boot messages, console messages, and the console menu."); ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Console Options"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Console menu"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disableconsolemenu" type="checkbox" id="disableconsolemenu" value="yes" <?php if ($pconfig['disableconsolemenu']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Password protect the console menu"); ?></strong>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%"><input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" /></td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </form>
+ <script type="text/javascript">
+ //<![CDATA[
+ prot_change();
+ //]]>
+ </script>
+
+<?php include("fend.inc"); ?>
+<?php
+ if ($restart_webgui) {
+ echo "<meta http-equiv=\"refresh\" content=\"20;url={$url}\" />";
+ }
+?>
+</body>
+</html>
+
+<?php
+if ($restart_sshd) {
+
+ killbyname("sshd");
+ log_error(gettext("secure shell configuration has changed. Stopping sshd."));
+
+ if ($config['system']['enablesshd']) {
+ log_error(gettext("secure shell configuration has changed. Restarting sshd."));
+ send_event("service restart sshd");
+ }
+}
+if ($restart_webgui) {
+ ob_flush();
+ flush();
+ log_error(gettext("webConfigurator configuration has changed. Restarting webConfigurator."));
+ send_event("service restart webgui");
+}
+
+?>
diff --git a/src/usr/local/www/system_advanced_firewall.php b/src/usr/local/www/system_advanced_firewall.php
new file mode 100644
index 0000000..fc6b0ed
--- /dev/null
+++ b/src/usr/local/www/system_advanced_firewall.php
@@ -0,0 +1,807 @@
+<?php
+/* $Id$ */
+/*
+ system_advanced_firewall.php
+ part of pfSense
+ Copyright (C) 2005-2007 Scott Ullrich
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-system-advanced-firewall
+##|*NAME=System: Advanced: Firewall and NAT page
+##|*DESCR=Allow access to the 'System: Advanced: Firewall and NAT' page.
+##|*MATCH=system_advanced_firewall.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$pconfig['disablefilter'] = $config['system']['disablefilter'];
+$pconfig['rfc959workaround'] = $config['system']['rfc959workaround'];
+$pconfig['scrubnodf'] = $config['system']['scrubnodf'];
+$pconfig['scrubrnid'] = $config['system']['scrubrnid'];
+$pconfig['tcpidletimeout'] = $config['filter']['tcpidletimeout'];
+$pconfig['optimization'] = $config['filter']['optimization'];
+$pconfig['adaptivestart'] = $config['system']['adaptivestart'];
+$pconfig['adaptiveend'] = $config['system']['adaptiveend'];
+$pconfig['maximumstates'] = $config['system']['maximumstates'];
+$pconfig['aliasesresolveinterval'] = $config['system']['aliasesresolveinterval'];
+$old_aliasesresolveinterval = $config['system']['aliasesresolveinterval'];
+$pconfig['checkaliasesurlcert'] = isset($config['system']['checkaliasesurlcert']);
+$pconfig['maximumtableentries'] = $config['system']['maximumtableentries'];
+$pconfig['maximumfrags'] = $config['system']['maximumfrags'];
+$pconfig['disablereplyto'] = isset($config['system']['disablereplyto']);
+$pconfig['disablenegate'] = isset($config['system']['disablenegate']);
+$pconfig['bogonsinterval'] = $config['system']['bogons']['interval'];
+$pconfig['disablenatreflection'] = $config['system']['disablenatreflection'];
+$pconfig['enablebinatreflection'] = $config['system']['enablebinatreflection'];
+$pconfig['reflectiontimeout'] = $config['system']['reflectiontimeout'];
+$pconfig['bypassstaticroutes'] = isset($config['filter']['bypassstaticroutes']);
+$pconfig['disablescrub'] = isset($config['system']['disablescrub']);
+$pconfig['tftpinterface'] = explode(",", $config['system']['tftpinterface']);
+$pconfig['disablevpnrules'] = isset($config['system']['disablevpnrules']);
+$pconfig['tcpfirsttimeout'] = $config['system']['tcpfirsttimeout'];
+$pconfig['tcpopeningtimeout'] = $config['system']['tcpopeningtimeout'];
+$pconfig['tcpestablishedtimeout'] = $config['system']['tcpestablishedtimeout'];
+$pconfig['tcpclosingtimeout'] = $config['system']['tcpclosingtimeout'];
+$pconfig['tcpfinwaittimeout'] = $config['system']['tcpfinwaittimeout'];
+$pconfig['tcpclosedtimeout'] = $config['system']['tcpclosedtimeout'];
+$pconfig['udpfirsttimeout'] = $config['system']['udpfirsttimeout'];
+$pconfig['udpsingletimeout'] = $config['system']['udpsingletimeout'];
+$pconfig['udpmultipletimeout'] = $config['system']['udpmultipletimeout'];
+$pconfig['icmpfirsttimeout'] = $config['system']['icmpfirsttimeout'];
+$pconfig['icmperrortimeout'] = $config['system']['icmperrortimeout'];
+$pconfig['otherfirsttimeout'] = $config['system']['otherfirsttimeout'];
+$pconfig['othersingletimeout'] = $config['system']['othersingletimeout'];
+$pconfig['othermultipletimeout'] = $config['system']['othermultipletimeout'];
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ((empty($_POST['adaptivestart']) && !empty($_POST['adaptiveend'])) || (!empty($_POST['adaptivestart']) && empty($_POST['adaptiveend']))) {
+ $input_errors[] = gettext("The Firewall Adaptive values must be set together.");
+ }
+ if (!empty($_POST['adaptivestart']) && !is_numericint($_POST['adaptivestart'])) {
+ $input_errors[] = gettext("The Firewall Adaptive Start value must be an integer.");
+ }
+ if (!empty($_POST['adaptiveend']) && !is_numericint($_POST['adaptiveend'])) {
+ $input_errors[] = gettext("The Firewall Adaptive End value must be an integer.");
+ }
+ if ($_POST['maximumstates'] && !is_numericint($_POST['maximumstates'])) {
+ $input_errors[] = gettext("The Firewall Maximum States value must be an integer.");
+ }
+ if ($_POST['aliasesresolveinterval'] && !is_numericint($_POST['aliasesresolveinterval'])) {
+ $input_errors[] = gettext("The Aliases Hostname Resolve Interval value must be an integer.");
+ }
+ if ($_POST['maximumtableentries'] && !is_numericint($_POST['maximumtableentries'])) {
+ $input_errors[] = gettext("The Firewall Maximum Table Entries value must be an integer.");
+ }
+ if ($_POST['maximumfrags'] && !is_numericint($_POST['maximumfrags'])) {
+ $input_errors[] = gettext("The Firewall Maximum Fragment Entries value must be an integer.");
+ }
+ if ($_POST['tcpidletimeout'] && !is_numericint($_POST['tcpidletimeout'])) {
+ $input_errors[] = gettext("The TCP idle timeout must be an integer.");
+ }
+ if ($_POST['reflectiontimeout'] && !is_numericint($_POST['reflectiontimeout'])) {
+ $input_errors[] = gettext("The Reflection timeout must be an integer.");
+ }
+ if ($_POST['tcpfirsttimeout'] && !is_numericint($_POST['tcpfirsttimeout'])) {
+ $input_errors[] = gettext("The TCP first timeout value must be an integer.");
+ }
+ if ($_POST['tcpopeningtimeout'] && !is_numericint($_POST['tcpopeningtimeout'])) {
+ $input_errors[] = gettext("The TCP opening timeout value must be an integer.");
+ }
+ if ($_POST['tcpestablishedtimeout'] && !is_numericint($_POST['tcpestablishedtimeout'])) {
+ $input_errors[] = gettext("The TCP established timeout value must be an integer.");
+ }
+ if ($_POST['tcpclosingtimeout'] && !is_numericint($_POST['tcpclosingtimeout'])) {
+ $input_errors[] = gettext("The TCP closing timeout value must be an integer.");
+ }
+ if ($_POST['tcpfinwaittimeout'] && !is_numericint($_POST['tcpfinwaittimeout'])) {
+ $input_errors[] = gettext("The TCP FIN wait timeout value must be an integer.");
+ }
+ if ($_POST['tcpclosedtimeout'] && !is_numericint($_POST['tcpclosedtimeout'])) {
+ $input_errors[] = gettext("The TCP closed timeout value must be an integer.");
+ }
+ if ($_POST['udpfirsttimeout'] && !is_numericint($_POST['udpfirsttimeout'])) {
+ $input_errors[] = gettext("The UDP first timeout value must be an integer.");
+ }
+ if ($_POST['udpsingletimeout'] && !is_numericint($_POST['udpsingletimeout'])) {
+ $input_errors[] = gettext("The UDP single timeout value must be an integer.");
+ }
+ if ($_POST['udpmultipletimeout'] && !is_numericint($_POST['udpmultipletimeout'])) {
+ $input_errors[] = gettext("The UDP multiple timeout value must be an integer.");
+ }
+ if ($_POST['icmpfirsttimeout'] && !is_numericint($_POST['icmpfirsttimeout'])) {
+ $input_errors[] = gettext("The ICMP first timeout value must be an integer.");
+ }
+ if ($_POST['icmperrortimeout'] && !is_numericint($_POST['icmperrortimeout'])) {
+ $input_errors[] = gettext("The ICMP error timeout value must be an integer.");
+ }
+ if ($_POST['otherfirsttimeout'] && !is_numericint($_POST['otherfirsttimeout'])) {
+ $input_errors[] = gettext("The Other first timeout value must be an integer.");
+ }
+ if ($_POST['othersingletimeout'] && !is_numericint($_POST['othersingletimeout'])) {
+ $input_errors[] = gettext("The Other single timeout value must be an integer.");
+ }
+ if ($_POST['othermultipletimeout'] && !is_numericint($_POST['othermultipletimeout'])) {
+ $input_errors[] = gettext("The Other multiple timeout value must be an integer.");
+ }
+
+ ob_flush();
+ flush();
+
+ if (!$input_errors) {
+
+ if ($_POST['disablefilter'] == "yes") {
+ $config['system']['disablefilter'] = "enabled";
+ } else {
+ unset($config['system']['disablefilter']);
+ }
+
+ if ($_POST['disablevpnrules'] == "yes") {
+ $config['system']['disablevpnrules'] = true;
+ } else {
+ unset($config['system']['disablevpnrules']);
+ }
+ if ($_POST['rfc959workaround'] == "yes") {
+ $config['system']['rfc959workaround'] = "enabled";
+ } else {
+ unset($config['system']['rfc959workaround']);
+ }
+
+ if ($_POST['scrubnodf'] == "yes") {
+ $config['system']['scrubnodf'] = "enabled";
+ } else {
+ unset($config['system']['scrubnodf']);
+ }
+
+ if ($_POST['scrubrnid'] == "yes") {
+ $config['system']['scrubrnid'] = "enabled";
+ } else {
+ unset($config['system']['scrubrnid']);
+ }
+
+ if (!empty($_POST['adaptiveend'])) {
+ $config['system']['adaptiveend'] = $_POST['adaptiveend'];
+ } else {
+ unset($config['system']['adaptiveend']);
+ }
+ if (!empty($_POST['adaptivestart'])) {
+ $config['system']['adaptivestart'] = $_POST['adaptivestart'];
+ } else {
+ unset($config['system']['adaptivestart']);
+ }
+
+ if ($_POST['checkaliasesurlcert'] == "yes") {
+ $config['system']['checkaliasesurlcert'] = true;
+ } else {
+ unset($config['system']['checkaliasesurlcert']);
+ }
+
+ $config['system']['optimization'] = $_POST['optimization'];
+ $config['system']['maximumstates'] = $_POST['maximumstates'];
+ $config['system']['aliasesresolveinterval'] = $_POST['aliasesresolveinterval'];
+ $config['system']['maximumtableentries'] = $_POST['maximumtableentries'];
+ $config['system']['maximumfrags'] = $_POST['maximumfrags'];
+
+ if (!empty($_POST['tcpfirsttimeout'])) {
+ $config['system']['tcpfirsttimeout'] = $_POST['tcpfirsttimeout'];
+ } else {
+ unset($config['system']['tcpfirsttimeout']);
+ }
+ if (!empty($_POST['tcpopeningtimeout'])) {
+ $config['system']['tcpopeningtimeout'] = $_POST['tcpopeningtimeout'];
+ } else {
+ unset($config['system']['tcpopeningtimeout']);
+ }
+ if (!empty($_POST['tcpestablishedtimeout'])) {
+ $config['system']['tcpestablishedtimeout'] = $_POST['tcpestablishedtimeout'];
+ } else {
+ unset($config['system']['tcpestablishedtimeout']);
+ }
+ if (!empty($_POST['tcpclosingtimeout'])) {
+ $config['system']['tcpclosingtimeout'] = $_POST['tcpclosingtimeout'];
+ } else {
+ unset($config['system']['tcpclosingtimeout']);
+ }
+ if (!empty($_POST['tcpfinwaittimeout'])) {
+ $config['system']['tcpfinwaittimeout'] = $_POST['tcpfinwaittimeout'];
+ } else {
+ unset($config['system']['tcpfinwaittimeout']);
+ }
+ if (!empty($_POST['tcpclosedtimeout'])) {
+ $config['system']['tcpclosedtimeout'] = $_POST['tcpclosedtimeout'];
+ } else {
+ unset($config['system']['tcpclosedtimeout']);
+ }
+ if (!empty($_POST['udpfirsttimeout'])) {
+ $config['system']['udpfirsttimeout'] = $_POST['udpfirsttimeout'];
+ } else {
+ unset($config['system']['udpfirsttimeout']);
+ }
+ if (!empty($_POST['udpsingletimeout'])) {
+ $config['system']['udpsingletimeout'] = $_POST['udpsingletimeout'];
+ } else {
+ unset($config['system']['udpsingletimeout']);
+ }
+ if (!empty($_POST['udpmultipletimeout'])) {
+ $config['system']['udpmultipletimeout'] = $_POST['udpmultipletimeout'];
+ } else {
+ unset($config['system']['udpmultipletimeout']);
+ }
+ if (!empty($_POST['icmpfirsttimeout'])) {
+ $config['system']['icmpfirsttimeout'] = $_POST['icmpfirsttimeout'];
+ } else {
+ unset($config['system']['icmpfirsttimeout']);
+ }
+ if (!empty($_POST['icmperrortimeout'])) {
+ $config['system']['icmperrortimeout'] = $_POST['icmperrortimeout'];
+ } else {
+ unset($config['system']['icmperrortimeout']);
+ }
+ if (!empty($_POST['otherfirsttimeout'])) {
+ $config['system']['otherfirsttimeout'] = $_POST['otherfirsttimeout'];
+ } else {
+ unset($config['system']['otherfirsttimeout']);
+ }
+ if (!empty($_POST['othersingletimeout'])) {
+ $config['system']['othersingletimeout'] = $_POST['othersingletimeout'];
+ } else {
+ unset($config['system']['othersingletimeout']);
+ }
+ if (!empty($_POST['othermultipletimeout'])) {
+ $config['system']['othermultipletimeout'] = $_POST['othermultipletimeout'];
+ } else {
+ unset($config['system']['othermultipletimeout']);
+ }
+
+ if ($_POST['natreflection'] == "proxy") {
+ unset($config['system']['disablenatreflection']);
+ unset($config['system']['enablenatreflectionpurenat']);
+ } else if ($_POST['natreflection'] == "purenat") {
+ unset($config['system']['disablenatreflection']);
+ $config['system']['enablenatreflectionpurenat'] = "yes";
+ } else {
+ $config['system']['disablenatreflection'] = "yes";
+ unset($config['system']['enablenatreflectionpurenat']);
+ }
+
+ if ($_POST['enablebinatreflection'] == "yes") {
+ $config['system']['enablebinatreflection'] = "yes";
+ } else {
+ unset($config['system']['enablebinatreflection']);
+ }
+
+ if ($_POST['disablereplyto'] == "yes") {
+ $config['system']['disablereplyto'] = $_POST['disablereplyto'];
+ } else {
+ unset($config['system']['disablereplyto']);
+ }
+
+ if ($_POST['disablenegate'] == "yes") {
+ $config['system']['disablenegate'] = $_POST['disablenegate'];
+ } else {
+ unset($config['system']['disablenegate']);
+ }
+
+ if ($_POST['enablenatreflectionhelper'] == "yes") {
+ $config['system']['enablenatreflectionhelper'] = "yes";
+ } else {
+ unset($config['system']['enablenatreflectionhelper']);
+ }
+
+ $config['system']['reflectiontimeout'] = $_POST['reflectiontimeout'];
+
+ if ($_POST['bypassstaticroutes'] == "yes") {
+ $config['filter']['bypassstaticroutes'] = $_POST['bypassstaticroutes'];
+ } elseif (isset($config['filter']['bypassstaticroutes'])) {
+ unset($config['filter']['bypassstaticroutes']);
+ }
+
+ if ($_POST['disablescrub'] == "yes") {
+ $config['system']['disablescrub'] = $_POST['disablescrub'];
+ } else {
+ unset($config['system']['disablescrub']);
+ }
+
+ if ($_POST['tftpinterface']) {
+ $config['system']['tftpinterface'] = implode(",", $_POST['tftpinterface']);
+ } else {
+ unset($config['system']['tftpinterface']);
+ }
+
+ if ($_POST['bogonsinterval'] != $config['system']['bogons']['interval']) {
+ switch ($_POST['bogonsinterval']) {
+ case 'daily':
+ install_cron_job("/usr/bin/nice -n20 /etc/rc.update_bogons.sh", true, "1", "3", "*", "*", "*");
+ break;
+ case 'weekly':
+ install_cron_job("/usr/bin/nice -n20 /etc/rc.update_bogons.sh", true, "1", "3", "*", "*", "0");
+ break;
+ case 'monthly':
+ // fall through
+ default:
+ install_cron_job("/usr/bin/nice -n20 /etc/rc.update_bogons.sh", true, "1", "3", "1", "*", "*");
+ }
+ $config['system']['bogons']['interval'] = $_POST['bogonsinterval'];
+ }
+
+ write_config();
+
+ // Kill filterdns when value changes, filter_configure() will restart it
+ if (($old_aliasesresolveinterval != $config['system']['aliasesresolveinterval']) &&
+ isvalidpid("{$g['varrun_path']}/filterdns.pid")) {
+ killbypid("{$g['varrun_path']}/filterdns.pid");
+ }
+
+ $retval = 0;
+ $retval = filter_configure();
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message($retval);
+ } else {
+ $savemsg = $retval;
+ }
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Advanced: Firewall and NAT"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+
+var descs=new Array(5);
+descs[0]="<?=gettext("as the name says, it's the normal optimization algorithm");?>";
+descs[1]="<?=gettext("used for high latency links, such as satellite links. Expires idle connections later than default");?>";
+descs[2]="<?=gettext("expires idle connections quicker. More efficient use of CPU and memory but can drop legitimate idle connections");?>";
+descs[3]="<?=gettext("tries to avoid dropping any legitimate idle connections at the expense of increased memory usage and CPU utilization.");?>";
+
+function update_description(itemnum) {
+ document.forms[0].info.value=descs[itemnum];
+
+}
+
+//]]>
+</script>
+
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+ <form action="system_advanced_firewall.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced firewall/nat">
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), true, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("NOTE:");?>&nbsp;</strong>
+ </span>
+ <?=gettext("The options on this page are intended for use by advanced users only.");?>
+ <br />
+ </span>
+ <br />
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Firewall Advanced");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IP Do-Not-Fragment compatibility");?></td>
+ <td width="78%" class="vtable">
+ <input name="scrubnodf" type="checkbox" id="scrubnodf" value="yes" <?php if (isset($config['system']['scrubnodf'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Clear invalid DF bits instead of dropping the packets");?></strong><br />
+ <?=gettext("This allows for communications with hosts that generate fragmented " .
+ "packets with the don't fragment (DF) bit set. Linux NFS is known to " .
+ "do this. This will cause the filter to not drop such packets but " .
+ "instead clear the don't fragment bit.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IP Random id generation");?></td>
+ <td width="78%" class="vtable">
+ <input name="scrubrnid" type="checkbox" id="scrubrnid" value="yes" <?php if (isset($config['system']['scrubrnid'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Insert a stronger id into IP header of packets passing through the filter.");?></strong><br />
+ <?=gettext("Replaces the IP identification field of packets with random values to " .
+ "compensate for operating systems that use predictable values. " .
+ "This option only applies to packets that are not fragmented after the " .
+ "optional packet reassembly.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Optimization Options");?></td>
+ <td width="78%" class="vtable">
+ <select onchange="update_description(this.selectedIndex);" name="optimization" id="optimization">
+ <option value="normal"<?php if ($config['system']['optimization'] == "normal") echo " selected=\"selected\""; ?>><?=gettext("normal");?></option>
+ <option value="high-latency"<?php if ($config['system']['optimization'] == "high-latency") echo " selected=\"selected\""; ?>><?=gettext("high-latency");?></option>
+ <option value="aggressive"<?php if ($config['system']['optimization'] == "aggressive") echo " selected=\"selected\""; ?>><?=gettext("aggressive");?></option>
+ <option value="conservative"<?php if ($config['system']['optimization'] == "conservative") echo " selected=\"selected\""; ?>><?=gettext("conservative");?></option>
+ </select>
+ <br />
+ <textarea readonly="readonly" cols="60" rows="2" id="info" name="info" style="padding:5px; border:1px dashed #990000; background-color: #ffffff; color: #000000; font-size: 8pt;"></textarea>
+ <script type="text/javascript">
+ //<![CDATA[
+ update_description(document.forms[0].optimization.selectedIndex);
+ //]]>
+ </script>
+ <br />
+ <?=gettext("Select the type of state table optimization to use");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable Firewall");?></td>
+ <td width="78%" class="vtable">
+ <input name="disablefilter" type="checkbox" id="disablefilter" value="yes" <?php if (isset($config['system']['disablefilter'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable all packet filtering.");?></strong>
+ <br />
+ <span class="vexpl"><?php printf(gettext("Note: This converts %s into a routing only platform!"), $g['product_name']);?><br />
+ <?=gettext("Note: This will also turn off NAT!");?>
+ <br /><?=gettext("If you only want to disable NAT, and not firewall rules, visit the");?> <a href="firewall_nat_out.php"><?=gettext("Outbound NAT");?></a> <?=gettext("page");?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable Firewall Scrub");?></td>
+ <td width="78%" class="vtable">
+ <input name="disablescrub" type="checkbox" id="disablescrub" value="yes" <?php if (isset($config['system']['disablescrub'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disables the PF scrubbing option which can sometimes interfere with NFS and PPTP traffic.");?></strong>
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Adaptive Timeouts");?></td>
+ <td width="78%" class="vtable">
+ <strong><?=gettext("Timeouts for states can be scaled adaptively as the number of state table entries grows.");?></strong>
+ <br />
+ <input name="adaptivestart" type="text" id="adaptivestart" value="<?php echo htmlspecialchars($pconfig['adaptivestart']); ?>" />
+ <br /><?=gettext("When the number of state entries exceeds this value, adaptive scaling begins. All timeout values are scaled linearly with factor (adaptive.end - number of states) / (adaptive.end - adaptive.start).");?>
+
+ <br />
+ <input name="adaptiveend" type="text" id="adaptiveend" value="<?php echo htmlspecialchars($pconfig['adaptiveend']); ?>" />
+ <br /><?=gettext("When reaching this number of state entries, all timeout values become zero, effectively purging all state entries immediately. This value is used to define the scale factor, it should not actually be reached (set a lower state limit, see below).");?>
+ <br />
+ <span class="vexpl"><?=gettext("Note: Leave this blank for the default, which auto-calculates these values from your maximum state table size. Adaptive start is 60% and end is 120% of the state table size by default.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Maximum States");?></td>
+ <td width="78%" class="vtable">
+ <input name="maximumstates" type="text" id="maximumstates" value="<?php echo htmlspecialchars($pconfig['maximumstates']); ?>" />
+ <br />
+ <strong><?=gettext("Maximum number of connections to hold in the firewall state table.");?></strong>
+ <br />
+ <span class="vexpl"><?=gettext("Note: Leave this blank for the default. On your system the default size is:");?> <?= pfsense_default_state_size() ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Maximum Table Entries");?></td>
+ <td width="78%" class="vtable">
+ <input name="maximumtableentries" type="text" id="maximumtableentries" value="<?php echo htmlspecialchars($pconfig['maximumtableentries']); ?>" />
+ <br />
+ <strong><?=gettext("Maximum number of table entries for systems such as aliases, sshlockout, snort, etc, combined.");?></strong>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Note: Leave this blank for the default.");?>
+ <?php if (empty($pconfig['maximumtableentries'])): ?>
+ <?= gettext("On your system the default size is:");?> <?= pfsense_default_table_entries_size(); ?>
+ <?php endif; ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Firewall Maximum Fragment Entries");?></td>
+ <td width="78%" class="vtable">
+ <input name="maximumfrags" type="text" id="maximumfrags" value="<?php echo htmlspecialchars($pconfig['maximumfrags']); ?>" />
+ <br />
+ <strong><?=gettext("Maximum number of packet fragments to hold for reassembly by scrub rules.");?></strong>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Note: Leave this blank for the default (5000).");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Static route filtering");?></td>
+ <td width="78%" class="vtable">
+ <input name="bypassstaticroutes" type="checkbox" id="bypassstaticroutes" value="yes" <?php if ($pconfig['bypassstaticroutes']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Bypass firewall rules for traffic on the same interface");?></strong>
+ <br />
+ <?=gettext("This option only applies if you have defined one or more static routes. If it is enabled, traffic that enters and " .
+ "leaves through the same interface will not be checked by the firewall. This may be desirable in some situations where " .
+ "multiple subnets are connected to the same interface.");?>
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">Disable Auto-added VPN rules</td>
+ <td width="78%" class="vtable">
+ <input name="disablevpnrules" type="checkbox" id="disablevpnrules" value="yes" <?php if (isset($config['system']['disablevpnrules'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable all auto-added VPN rules.");?></strong>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Note: This disables automatically added rules for IPsec, PPTP.");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">Disable reply-to</td>
+ <td width="78%" class="vtable">
+ <input name="disablereplyto" type="checkbox" id="disablereplyto" value="yes" <?php if ($pconfig['disablereplyto']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable reply-to on WAN rules");?></strong>
+ <br />
+ <?=gettext("With Multi-WAN you generally want to ensure traffic leaves the same interface it arrives on, hence reply-to is added automatically by default. " .
+ "When using bridging, you must disable this behavior if the WAN gateway IP is different from the gateway IP of the hosts behind the bridged interface.");?>
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">Disable Negate rules</td>
+ <td width="78%" class="vtable">
+ <input name="disablenegate" type="checkbox" id="disablenegate" value="yes" <?php if ($pconfig['disablenegate']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable Negate rule on policy routing rules");?></strong>
+ <br />
+ <?=gettext("With Multi-WAN you generally want to ensure traffic reaches directly connected networks and VPN networks when using policy routing. You can disable this for special purposes but it requires manually creating rules for these networks");?>
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Aliases Hostnames Resolve Interval");?></td>
+ <td width="78%" class="vtable">
+ <input name="aliasesresolveinterval" type="text" id="aliasesresolveinterval" value="<?php echo htmlspecialchars($pconfig['aliasesresolveinterval']); ?>" />
+ <br />
+ <strong><?=gettext("Interval, in seconds, that will be used to resolve hostnames configured on aliases.");?></strong>
+ <br />
+ <span class="vexpl"><?=gettext("Note: Leave this blank for the default (300s).");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Check certificate of aliases URLs");?></td>
+ <td width="78%" class="vtable">
+ <input name="checkaliasesurlcert" type="checkbox" id="checkaliasesurlcert" value="yes" <?php if ($pconfig['checkaliasesurlcert']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Verify HTTPS certificates when downloading alias URLs");?></strong>
+ <br />
+ <?=gettext("Make sure the certificate is valid for all HTTPS addresses on aliases. If it's not valid or is revoked, do not download it.");?>
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Bogon Networks");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Update Frequency");?></td>
+ <td width="78%" class="vtable">
+ <select name="bogonsinterval" class="formselect">
+ <option value="monthly" <?php if (empty($pconfig['bogonsinterval']) || $pconfig['bogonsinterval'] == 'monthly') echo "selected=\"selected\""; ?>><?=gettext("Monthly"); ?></option>
+ <option value="weekly" <?php if ($pconfig['bogonsinterval'] == 'weekly') echo "selected=\"selected\""; ?>><?=gettext("Weekly"); ?></option>
+ <option value="daily" <?php if ($pconfig['bogonsinterval'] == 'daily') echo "selected=\"selected\""; ?>><?=gettext("Daily"); ?></option>
+ </select>
+ <br />
+ <?=gettext("The frequency of updating the lists of IP addresses that are reserved (but not RFC 1918) or not yet assigned by IANA.");?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+<?php
+ if (count($config['interfaces']) > 1):
+?>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Network Address Translation");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NAT Reflection mode for port forwards");?></td>
+ <td width="78%" class="vtable">
+ <select name="natreflection" class="formselect">
+ <option value="disable" <?php if (isset($config['system']['disablenatreflection'])) echo "selected=\"selected\""; ?>><?=gettext("Disable"); ?></option>
+ <option value="proxy" <?php if (!isset($config['system']['disablenatreflection']) && !isset($config['system']['enablenatreflectionpurenat'])) echo "selected=\"selected\""; ?>><?=gettext("Enable (NAT + Proxy)"); ?></option>
+ <option value="purenat" <?php if (!isset($config['system']['disablenatreflection']) && isset($config['system']['enablenatreflectionpurenat'])) echo "selected=\"selected\""; ?>><?=gettext("Enable (Pure NAT)"); ?></option>
+ </select>
+ <br />
+ <strong><?=gettext("When enabled, this automatically creates additional NAT redirect rules for access to port forwards on your external IP addresses from within your internal networks.");?></strong>
+ <br /><br />
+ <?=gettext("The NAT + proxy mode uses a helper program to send packets to the target of the port forward. It is useful in setups where the interface and/or gateway IP used for communication with the target cannot be accurately determined at the time the rules are loaded. Reflection rules are not created for ranges larger than 500 ports and will not be used for more than 1000 ports total between all port forwards. Only TCP and UDP protocols are supported.");?>
+ <br /><br />
+ <?=gettext("The pure NAT mode uses a set of NAT rules to direct packets to the target of the port forward. It has better scalability, but it must be possible to accurately determine the interface and gateway IP used for communication with the target at the time the rules are loaded. There are no inherent limits to the number of ports other than the limits of the protocols. All protocols available for port forwards are supported.");?>
+ <br /><br />
+ <?=gettext("Individual rules may be configured to override this system setting on a per-rule basis.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Reflection Timeout");?></td>
+ <td width="78%" class="vtable">
+ <input name="reflectiontimeout" id="reflectiontimeout" value="<?php echo $config['system']['reflectiontimeout']; ?>" /><br />
+ <strong><?=gettext("Enter value for Reflection timeout in seconds.");?></strong>
+ <br /><br />
+ <?=gettext("Note: Only applies to Reflection on port forwards in NAT + proxy mode.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Enable NAT Reflection for 1:1 NAT");?></td>
+ <td width="78%" class="vtable">
+ <input name="enablebinatreflection" type="checkbox" id="enablebinatreflection" value="yes" <?php if (isset($config['system']['enablebinatreflection'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enables the automatic creation of additional NAT redirect rules for access to 1:1 mappings of your external IP addresses from within your internal networks.");?></strong>
+ <br /><br />
+ <?=gettext("Note: Reflection on 1:1 mappings is only for the inbound component of the 1:1 mappings. This functions the same as the pure NAT mode for port forwards. For more details, refer to the pure NAT mode description above.");?>
+ <br /><br />
+ <?=gettext("Individual rules may be configured to override this system setting on a per-rule basis.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Enable automatic outbound NAT for Reflection");?></td>
+ <td width="78%" class="vtable">
+ <input name="enablenatreflectionhelper" type="checkbox" id="enablenatreflectionhelper" value="yes" <?php if (isset($config['system']['enablenatreflectionhelper'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Automatically create outbound NAT rules which assist inbound NAT rules that direct traffic back out to the same subnet it originated from.");?></strong>
+ <br />
+ <?=gettext("Required for full functionality of the pure NAT mode of NAT Reflection for port forwards or NAT Reflection for 1:1 NAT.");?>
+ <br /><br />
+ <?=gettext("Note: This only works for assigned interfaces. Other interfaces require manually creating the outbound NAT rules that direct the reply packets back through the router.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("TFTP Proxy");?></td>
+ <td width="78%" class="vtable">
+ <select name="tftpinterface[]" multiple="multiple" class="formselect" size="3">
+<?php
+ $ifdescs = get_configured_interface_with_descr();
+ $rowIndex = 0;
+ foreach ($ifdescs as $ifent => $ifdesc):
+ $rowIndex++;
+?>
+ <option value="<?=$ifent;?>" <?php if (in_array($ifent, $pconfig['tftpinterface'])) echo "selected=\"selected\""; ?>><?=gettext($ifdesc);?></option>
+<?php endforeach;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+ ?>
+ </select>
+ <br/><strong><?=gettext("Choose the interfaces where you want TFTP proxy helper to be enabled.");?></strong>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("State Timeouts");?></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <strong><?=gettext("NOTE: The options below should usually be left at their defaults, as chosen by Firewall Optimization Options above. Click the Help link on this page for information.");?>&nbsp;</strong>
+ </td>
+ <br />
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("TCP Timeouts");?></td>
+ <td width="78%" class="vtable">
+ <strong><?=gettext("TCP First: ");?></strong><input name="tcpfirsttimeout" id="tcpfirsttimeout" value="<?php echo $config['system']['tcpfirsttimeout']; ?>" /> <br/>
+ <?=gettext("Enter value for TCP first timeout in seconds. Leave blank for default (recommended).");?>
+ <br/><br/>
+ <strong><?=gettext("TCP Opening: ");?></strong><input name="tcpopeningtimeout" id="tcpopeningtimeout" value="<?php echo $config['system']['tcpopeningtimeout']; ?>" /><br />
+ <?=gettext("Enter value for TCP opening timeout in seconds. Leave blank for default (recommended).");?>
+ <br/><br/>
+ <strong><?=gettext("TCP Established: ");?></strong><input name="tcpestablishedtimeout" id="tcpestablishedtimeout" value="<?php echo $config['system']['tcpestablishedtimeout']; ?>" /><br />
+ <?=gettext("Enter value for TCP established timeout in seconds. Leave blank for default (recommended).");?>
+ <br/><br/>
+ <strong><?=gettext("TCP Closing: ");?></strong><input name="tcpclosingtimeout" id="tcpclosingtimeout" value="<?php echo $config['system']['tcpclosingtimeout']; ?>" /><br />
+ <?=gettext("Enter value for TCP closing timeout in seconds. Leave blank for default (recommended).");?>
+ <br/><br/>
+ <strong><?=gettext("TCP FIN Wait: ");?></strong><input name="tcpfinwaittimeout" id="tcpfinwaittimeout" value="<?php echo $config['system']['tcpfinwaittimeout']; ?>" /><br />
+ <?=gettext("Enter value for TCP FIN wait timeout in seconds. Leave blank for default (recommended).");?>
+ <br/><br/>
+ <strong><?=gettext("TCP Closed: ");?></strong><input name="tcpclosedtimeout" id="tcpclosedtimeout" value="<?php echo $config['system']['tcpclosedtimeout']; ?>" /><br />
+ <?=gettext("Enter value for TCP closed timeout in seconds. Leave blank for default (recommended).");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("UDP Timeouts");?></td>
+ <td width="78%" class="vtable">
+ <strong><?=gettext("UDP First: ");?></strong><input name="udpfirsttimeout" id="udpfirsttimeout" value="<?php echo $config['system']['udpfirsttimeout']; ?>" /><br />
+ <?=gettext("Enter value for UDP first timeout in seconds. Leave blank for default (recommended).");?>
+ <br /><br />
+ <strong><?=gettext("UDP Single: ");?></strong><input name="udpsingletimeout" id="udpsingletimeout" value="<?php echo $config['system']['udpsingletimeout']; ?>" /><br />
+ <?=gettext("Enter value for UDP single timeout in seconds. Leave blank for default (recommended).");?>
+ <br /><br />
+ <strong><?=gettext("UDP Multiple: ");?></strong><input name="udpmultipletimeout" id="udpmultipletimeout" value="<?php echo $config['system']['udpmultipletimeout']; ?>" /><br />
+ <?=gettext("Enter value for UDP multiple timeout in seconds. Leave blank for default (recommended).");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("ICMP Timeouts");?></td>
+ <td width="78%" class="vtable">
+ <strong><?=gettext("ICMP First: ");?></strong><input name="icmpfirsttimeout" id="icmpfirsttimeout" value="<?php echo $config['system']['icmpfirsttimeout']; ?>" /><br />
+ <?=gettext("Enter value for ICMP first timeout in seconds. Leave blank for default (recommended).");?>
+ <br /><br />
+ <strong><?=gettext("ICMP Error: ");?></strong><input name="icmperrortimeout" id="icmperrortimeout" value="<?php echo $config['system']['icmperrortimeout']; ?>" /><br />
+ <?=gettext("Enter value for ICMP error timeout in seconds. Leave blank for default (recommended).");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Other Timeouts");?></td>
+ <td width="78%" class="vtable">
+ <strong><?=gettext("Other First: ");?></strong><input name="otherfirsttimeout" id="otherfirsttimeout" value="<?php echo $config['system']['otherfirsttimeout']; ?>" /><br />
+ <?=gettext("Enter value for Other first timeout in seconds. Leave blank for default (recommended).");?>
+ <br /><br />
+ <strong><?=gettext("Other Single: ");?></strong><input name="othersingletimeout" id="othersingletimeout" value="<?php echo $config['system']['othersingletimeout']; ?>" /><br />
+ <?=gettext("Enter value for Other single timeout in seconds. Leave blank for default (recommended).");?>
+ <br /><br />
+ <strong><?=gettext("Other Multiple: ");?></strong><input name="othermultipletimeout" id="othermultipletimeout" value="<?php echo $config['system']['othermultipletimeout']; ?>" /><br />
+ <?=gettext("Enter value for Other multiple timeout in seconds. Leave blank for default (recommended).");?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%"><input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" /></td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_advanced_misc.php b/src/usr/local/www/system_advanced_misc.php
new file mode 100644
index 0000000..72f4833
--- /dev/null
+++ b/src/usr/local/www/system_advanced_misc.php
@@ -0,0 +1,738 @@
+<?php
+/* $Id$ */
+/*
+ system_advanced_misc.php
+ part of pfSense
+ Copyright (C) 2005-2007 Scott Ullrich
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-system-advanced-misc
+##|*NAME=System: Advanced: Miscellaneous page
+##|*DESCR=Allow access to the 'System: Advanced: Miscellaneous' page.
+##|*MATCH=system_advanced_misc.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("vpn.inc");
+require_once("vslb.inc");
+
+$pconfig['proxyurl'] = $config['system']['proxyurl'];
+$pconfig['proxyport'] = $config['system']['proxyport'];
+$pconfig['proxyuser'] = $config['system']['proxyuser'];
+$pconfig['proxypass'] = $config['system']['proxypass'];
+$pconfig['harddiskstandby'] = $config['system']['harddiskstandby'];
+$pconfig['lb_use_sticky'] = isset($config['system']['lb_use_sticky']);
+$pconfig['srctrack'] = $config['system']['srctrack'];
+$pconfig['gw_switch_default'] = isset($config['system']['gw_switch_default']);
+$pconfig['powerd_enable'] = isset($config['system']['powerd_enable']);
+$pconfig['crypto_hardware'] = $config['system']['crypto_hardware'];
+$pconfig['thermal_hardware'] = $config['system']['thermal_hardware'];
+$pconfig['schedule_states'] = isset($config['system']['schedule_states']);
+$pconfig['kill_states'] = isset($config['system']['kill_states']);
+$pconfig['skip_rules_gw_down'] = isset($config['system']['skip_rules_gw_down']);
+$pconfig['apinger_debug'] = isset($config['system']['apinger_debug']);
+$pconfig['use_mfs_tmpvar'] = isset($config['system']['use_mfs_tmpvar']);
+$pconfig['use_mfs_tmp_size'] = $config['system']['use_mfs_tmp_size'];
+$pconfig['use_mfs_var_size'] = $config['system']['use_mfs_var_size'];
+$pconfig['pkg_nochecksig'] = isset($config['system']['pkg_nochecksig']);
+$pconfig['host_uuid'] = !isset($config['system']['host_uuid']);
+
+$pconfig['powerd_ac_mode'] = "hadp";
+if (!empty($config['system']['powerd_ac_mode'])) {
+ $pconfig['powerd_ac_mode'] = $config['system']['powerd_ac_mode'];
+}
+
+$pconfig['powerd_battery_mode'] = "hadp";
+if (!empty($config['system']['powerd_battery_mode'])) {
+ $pconfig['powerd_battery_mode'] = $config['system']['powerd_battery_mode'];
+}
+
+$pconfig['powerd_normal_mode'] = "hadp";
+if (!empty($config['system']['powerd_normal_mode'])) {
+ $pconfig['powerd_normal_mode'] = $config['system']['powerd_normal_mode'];
+}
+
+$crypto_modules = array(
+ 'glxsb' => gettext("AMD Geode LX Security Block"),
+ 'aesni' => gettext("AES-NI CPU-based Acceleration"));
+
+$thermal_hardware_modules = array(
+ 'coretemp' => gettext("Intel Core* CPU on-die thermal sensor"),
+ 'amdtemp' => gettext("AMD K8, K10 and K11 CPU on-die thermal sensor"));
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ ob_flush();
+ flush();
+
+ if (!empty($_POST['crypto_hardware']) && !array_key_exists($_POST['crypto_hardware'], $crypto_modules)) {
+ $input_errors[] = gettext("Please select a valid Cryptographic Accelerator.");
+ }
+
+ if (!empty($_POST['thermal_hardware']) && !array_key_exists($_POST['thermal_hardware'], $thermal_hardware_modules)) {
+ $input_errors[] = gettext("Please select a valid Thermal Hardware Sensor.");
+ }
+
+ if (!empty($_POST['use_mfs_tmp_size']) && (!is_numeric($_POST['use_mfs_tmp_size']) || ($_POST['use_mfs_tmp_size'] < 40))) {
+ $input_errors[] = gettext("/tmp Size must be numeric and should not be less than 40MB.");
+ }
+
+ if (!empty($_POST['use_mfs_var_size']) && (!is_numeric($_POST['use_mfs_var_size']) || ($_POST['use_mfs_var_size'] < 60))) {
+ $input_errors[] = gettext("/var Size must be numeric and should not be less than 60MB.");
+ }
+
+ if (!empty($_POST['proxyport']) && !is_port($_POST['proxyport'])) {
+ $input_errors[] = gettext("Proxy port must be a valid port number, 1-65535.");
+ }
+
+ if (!empty($_POST['proxyurl']) && !is_fqdn($_POST['proxyurl']) && !is_ipaddr($_POST['proxyurl'])) {
+ $input_errors[] = gettext("Proxy URL must be a valid IP address or FQDN.");
+ }
+
+ if (!empty($_POST['proxyuser']) && preg_match("/[^a-zA-Z0-9\.\-_@]/", $_POST['proxyuser'])) {
+ $input_errors[] = gettext("The proxy username contains invalid characters.");
+ }
+
+ if (!$input_errors) {
+
+ if ($_POST['harddiskstandby'] <> "") {
+ $config['system']['harddiskstandby'] = $_POST['harddiskstandby'];
+ system_set_harddisk_standby();
+ } else {
+ unset($config['system']['harddiskstandby']);
+ }
+
+ if ($_POST['proxyurl'] <> "") {
+ $config['system']['proxyurl'] = $_POST['proxyurl'];
+ } else {
+ unset($config['system']['proxyurl']);
+ }
+
+ if ($_POST['proxyport'] <> "") {
+ $config['system']['proxyport'] = $_POST['proxyport'];
+ } else {
+ unset($config['system']['proxyport']);
+ }
+
+ if ($_POST['proxyuser'] <> "") {
+ $config['system']['proxyuser'] = $_POST['proxyuser'];
+ } else {
+ unset($config['system']['proxyuser']);
+ }
+
+ if ($_POST['proxypass'] <> "") {
+ $config['system']['proxypass'] = $_POST['proxypass'];
+ } else {
+ unset($config['system']['proxypass']);
+ }
+
+ $need_relayd_restart = false;
+ if ($_POST['lb_use_sticky'] == "yes") {
+ if (!isset($config['system']['lb_use_sticky'])) {
+ $config['system']['lb_use_sticky'] = true;
+ $need_relayd_restart = true;
+ }
+ if ($config['system']['srctrack'] != $_POST['srctrack']) {
+ $config['system']['srctrack'] = $_POST['srctrack'];
+ $need_relayd_restart = true;
+ }
+ } else {
+ if (isset($config['system']['lb_use_sticky'])) {
+ unset($config['system']['lb_use_sticky']);
+ $need_relayd_restart = true;
+ }
+ }
+
+ if ($_POST['gw_switch_default'] == "yes") {
+ $config['system']['gw_switch_default'] = true;
+ } else {
+ unset($config['system']['gw_switch_default']);
+ }
+
+ if ($_POST['pkg_nochecksig'] == "yes") {
+ $config['system']['pkg_nochecksig'] = true;
+ } elseif (isset($config['system']['pkg_nochecksig'])) {
+ unset($config['system']['pkg_nochecksig']);
+ }
+
+ if ($_POST['host_uuid'] == "yes") {
+ unset($config['system']['host_uuid']);
+ } else {
+ $config['system']['host_uuid'] = true;
+ }
+
+ if ($_POST['powerd_enable'] == "yes") {
+ $config['system']['powerd_enable'] = true;
+ } else {
+ unset($config['system']['powerd_enable']);
+ }
+
+ $config['system']['powerd_ac_mode'] = $_POST['powerd_ac_mode'];
+ $config['system']['powerd_battery_mode'] = $_POST['powerd_battery_mode'];
+ $config['system']['powerd_normal_mode'] = $_POST['powerd_normal_mode'];
+
+ if ($_POST['crypto_hardware']) {
+ $config['system']['crypto_hardware'] = $_POST['crypto_hardware'];
+ } else {
+ unset($config['system']['crypto_hardware']);
+ }
+
+ if ($_POST['thermal_hardware']) {
+ $config['system']['thermal_hardware'] = $_POST['thermal_hardware'];
+ } else {
+ unset($config['system']['thermal_hardware']);
+ }
+
+ if ($_POST['schedule_states'] == "yes") {
+ $config['system']['schedule_states'] = true;
+ } else {
+ unset($config['system']['schedule_states']);
+ }
+
+ if ($_POST['kill_states'] == "yes") {
+ $config['system']['kill_states'] = true;
+ } else {
+ unset($config['system']['kill_states']);
+ }
+
+ if ($_POST['skip_rules_gw_down'] == "yes") {
+ $config['system']['skip_rules_gw_down'] = true;
+ } else {
+ unset($config['system']['skip_rules_gw_down']);
+ }
+
+ $need_apinger_restart = false;
+ if ($_POST['apinger_debug'] == "yes") {
+ if (!isset($config['system']['apinger_debug'])) {
+ $need_apinger_restart = true;
+ }
+ $config['system']['apinger_debug'] = true;
+ } else {
+ if (isset($config['system']['apinger_debug'])) {
+ $need_apinger_restart = true;
+ }
+ unset($config['system']['apinger_debug']);
+ }
+
+ if ($_POST['use_mfs_tmpvar'] == "yes") {
+ $config['system']['use_mfs_tmpvar'] = true;
+ } else {
+ unset($config['system']['use_mfs_tmpvar']);
+ }
+
+ $config['system']['use_mfs_tmp_size'] = $_POST['use_mfs_tmp_size'];
+ $config['system']['use_mfs_var_size'] = $_POST['use_mfs_var_size'];
+
+ if (isset($_POST['rrdbackup'])) {
+ $config['system']['rrdbackup'] = $_POST['rrdbackup'];
+ install_cron_job("/etc/rc.backup_rrd.sh", ($config['system']['rrdbackup'] > 0), $minute="0", "*/{$config['system']['rrdbackup']}");
+ }
+ if (isset($_POST['dhcpbackup'])) {
+ $config['system']['dhcpbackup'] = $_POST['dhcpbackup'];
+ install_cron_job("/etc/rc.backup_dhcpleases.sh", ($config['system']['dhcpbackup'] > 0), $minute="0", "*/{$config['system']['dhcpbackup']}");
+ }
+
+ write_config();
+
+ $retval = 0;
+ system_resolvconf_generate(true);
+ $retval = filter_configure();
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message(gettext($retval));
+ } else {
+ $savemsg = gettext($retval);
+ }
+
+ activate_powerd();
+ load_crypto();
+ load_thermal_hardware();
+ if ($need_relayd_restart) {
+ relayd_configure();
+ }
+ if ($need_apinger_restart) {
+ setup_gateways_monitor();
+ }
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Advanced: Miscellaneous"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php
+ include("fbegin.inc");
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+<script type="text/javascript">
+//<![CDATA[
+function sticky_checked(obj) {
+ if (obj.checked) {
+ jQuery('#srctrack').attr('disabled', false);
+ } else {
+ jQuery('#srctrack').attr('disabled', 'true');
+ }
+}
+function tmpvar_checked(obj) {
+ if (obj.checked) {
+ jQuery('#use_mfs_tmp_size').attr('disabled', false);
+ jQuery('#use_mfs_var_size').attr('disabled', false);
+ jQuery('#rrdbackup').attr('disabled', false);
+ jQuery('#dhcpbackup').attr('disabled', false);
+ } else {
+ jQuery('#use_mfs_tmp_size').attr('disabled', 'true');
+ jQuery('#use_mfs_var_size').attr('disabled', 'true');
+ jQuery('#rrdbackup').attr('disabled', 'true');
+ jQuery('#dhcpbackup').attr('disabled', 'true');
+ }
+}
+//]]>
+</script>
+ <form action="system_advanced_misc.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced misc">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), true, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("NOTE:"); ?>&nbsp;</strong>
+ </span>
+ <?=gettext("The options on this page are intended for use by advanced users only."); ?>
+ <br />
+ </span>
+ <br />
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Proxy support"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Proxy URL"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="proxyurl" id="proxyurl" value="<?php if ($pconfig['proxyurl'] <> "") echo htmlspecialchars($pconfig['proxyurl']); ?>" class="formfld unknown" />
+ <br />
+ <?php printf(gettext("Hostname or IP address of proxy server this system will use for its outbound Internet access.")); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Proxy Port"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="proxyport" id="proxyport" value="<?php if ($pconfig['proxyport'] <> "") echo htmlspecialchars($pconfig['proxyport']); ?>" class="formfld unknown" />
+ <br />
+ <?php printf(gettext("Port where proxy server is listening.")); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Proxy Username"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="proxyuser" id="proxyuser" value="<?php if ($pconfig['proxyuser'] <> "") echo htmlspecialchars($pconfig['proxyuser']); ?>" class="formfld unknown" />
+ <br />
+ <?php printf(gettext("Username for authentication to proxy server. Optional, leave blank to not use authentication.")); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Proxy Password"); ?></td>
+ <td width="78%" class="vtable">
+ <input type="password" name="proxypass" id="proxypass" value="<?php if ($pconfig['proxypass'] <> "") echo htmlspecialchars($pconfig['proxypass']); ?>" class="formfld unknown" />
+ <br />
+ <?php printf(gettext("Password for authentication to proxy server.")); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Load Balancing"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Load Balancing"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="lb_use_sticky" type="checkbox" id="lb_use_sticky" value="yes" <?php if ($pconfig['lb_use_sticky']) echo "checked=\"checked\""; ?> onclick="sticky_checked(this)" />
+ <strong><?=gettext("Use sticky connections"); ?></strong><br />
+ <?=gettext("Successive connections will be redirected to the servers " .
+ "in a round-robin manner with connections from the same " .
+ "source being sent to the same web server. This 'sticky " .
+ "connection' will exist as long as there are states that " .
+ "refer to this connection. Once the states expire, so will " .
+ "the sticky connection. Further connections from that host " .
+ "will be redirected to the next web server in the round " .
+ "robin. Changing this option will restart the Load Balancing service."); ?>
+ <br />
+ <input name="srctrack" id="srctrack" value="<?php if ($pconfig['srctrack'] <> "") echo htmlspecialchars($pconfig['srctrack']); else "1400"; ?>" class="formfld unknown" <?php if ($pconfig['lb_use_sticky'] == false) echo "disabled=\"disabled\""; ?> />
+ <br />
+ <?=gettext("Set the source tracking timeout for sticky connections. " .
+ "By default this is 0, so source tracking is removed as soon as the state expires. " .
+ "Setting this timeout higher will cause the source/destination relationship to persist for longer periods of time."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Load Balancing"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="gw_switch_default" type="checkbox" id="gw_switch_default" value="yes" <?php if ($pconfig['gw_switch_default']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable default gateway switching"); ?></strong><br />
+ <?=gettext("If the default gateway goes down, switch the default gateway to another available one. This is not enabled by default, as it's unnecessary in most all scenarios, which instead use gateway groups."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Power savings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("PowerD"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="powerd_enable" type="checkbox" id="powerd_enable" value="yes" <?php if ($pconfig['powerd_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Use PowerD"); ?></strong><br />
+ <br />
+ <table border="0" cellspacing="0" cellpadding="2" summary="powerd">
+ <tr>
+ <td><?=gettext("On AC Power Mode:");?> &nbsp;</td>
+ <td>
+ <select name="powerd_ac_mode" id="powerd_ac_mode">
+ <option value="hadp"<?php if ($pconfig['powerd_ac_mode'] == "hadp") echo " selected=\"selected\""; ?>><?=gettext("Hiadaptive");?></option>
+ <option value="adp"<?php if ($pconfig['powerd_ac_mode'] == "adp") echo " selected=\"selected\""; ?>><?=gettext("Adaptive");?></option>
+ <option value="min"<?php if ($pconfig['powerd_ac_mode'] == "min") echo " selected=\"selected\""; ?>><?=gettext("Minimum");?></option>
+ <option value="max"<?php if ($pconfig['powerd_ac_mode'] == "max") echo " selected=\"selected\""; ?>><?=gettext("Maximum");?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("On Battery Power Mode:");?> &nbsp;</td>
+ <td>
+ <select name="powerd_battery_mode" id="powerd_battery_mode">
+ <option value="hadp"<?php if ($pconfig['powerd_battery_mode'] == "hadp") echo " selected=\"selected\""; ?>><?=gettext("Hiadaptive");?></option>
+ <option value="adp"<?php if ($pconfig['powerd_battery_mode'] == "adp") echo " selected=\"selected\""; ?>><?=gettext("Adaptive");?></option>
+ <option value="min"<?php if ($pconfig['powerd_battery_mode'] == "min") echo " selected=\"selected\""; ?>><?=gettext("Minimum");?></option>
+ <option value="max"<?php if ($pconfig['powerd_battery_mode'] == "max") echo " selected=\"selected\""; ?>><?=gettext("Maximum");?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("On Unknown Power Mode:");?> &nbsp;</td>
+ <td>
+ <select name="powerd_normal_mode" id="powerd_normal_mode">
+ <option value="hadp"<?php if ($pconfig['powerd_normal_mode'] == "hadp") echo " selected=\"selected\""; ?>><?=gettext("Hiadaptive");?></option>
+ <option value="adp"<?php if ($pconfig['powerd_normal_mode'] == "adp") echo " selected=\"selected\""; ?>><?=gettext("Adaptive");?></option>
+ <option value="min"<?php if ($pconfig['powerd_normal_mode'] == "min") echo " selected=\"selected\""; ?>><?=gettext("Minimum");?></option>
+ <option value="max"<?php if ($pconfig['powerd_normal_mode'] == "max") echo " selected=\"selected\""; ?>><?=gettext("Maximum");?></option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <?=gettext("The powerd utility monitors the system state and sets various power control " .
+ "options accordingly. It offers four modes (maximum, minimum, adaptive " .
+ "and hiadaptive) that can be individually selected while on AC power or batteries. " .
+ "The modes maximum, minimum, adaptive and hiadaptive may be abbreviated max, " .
+ "min, adp, hadp. Maximum mode chooses the highest performance values. Minimum " .
+ "mode selects the lowest performance values to get the most power savings. " .
+ "Adaptive mode attempts to strike a balance by degrading performance when " .
+ "the system appears idle and increasing it when the system is busy. It " .
+ "offers a good balance between a small performance loss for greatly " .
+ "increased power savings. Hiadaptive mode is alike adaptive mode, but " .
+ "tuned for systems where performance and interactivity are more important " .
+ "than power consumption. It raises frequency faster, drops slower and " .
+ "keeps twice lower CPU load."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Cryptographic Hardware Acceleration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Cryptographic Hardware"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="crypto_hardware" id="crypto_hardware">
+ <option value=""><?php echo gettext("None"); ?></option>
+ <?php foreach ($crypto_modules as $cryptomod_name => $cryptomod_descr): ?>
+ <option value="<?php echo $cryptomod_name; ?>" <?php if ($pconfig['crypto_hardware'] == $cryptomod_name) echo " selected=\"selected\""; ?>><?php echo "{$cryptomod_descr} ({$cryptomod_name})"; ?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("A cryptographic accelerator module will use hardware support to speed up some " .
+ "cryptographic functions on systems which have the chip. Do not enable this " .
+ "option if you have a Hifn cryptographic acceleration card, as this will take " .
+ "precedence and the Hifn card will not be used. Acceleration should be automatic " .
+ "for IPsec when using a cipher supported by your chip, such as AES-128. OpenVPN " .
+ "should be set for AES-128-CBC and have cryptodev enabled for hardware " .
+ "acceleration."); ?>
+ <br /><br />
+ <?=gettext("If you do not have a crypto chip in your system, this option will have no " .
+ "effect. To unload the selected module, set this option to 'none' and then reboot."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Thermal Sensors"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Thermal Sensors"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="thermal_hardware" id="thermal_hardware">
+ <option value=""><?php echo gettext("None/ACPI"); ?></option>
+ <?php foreach ($thermal_hardware_modules as $themalmod_name => $themalmod_descr): ?>
+ <option value="<?php echo $themalmod_name; ?>" <?php if ($pconfig['thermal_hardware'] == $themalmod_name) echo " selected=\"selected\""; ?>><?php echo "{$themalmod_descr} ({$themalmod_name})"; ?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("If you have a supported CPU, selecting a themal sensor will load the appropriate " .
+ "driver to read its temperature. Setting this to 'None' will attempt to read the " .
+ "temperature from an ACPI-compliant motherboard sensor instead, if one is present."); ?>
+ <br /><br />
+ <?=gettext("If you do not have a supported thermal sensor chip in your system, this option will have no " .
+ "effect. To unload the selected module, set this option to 'none' and then reboot."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("IP Security"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <?=gettext("These settings have moved to <a href=\"vpn_ipsec_settings.php\">VPN &gt; IPsec on the Advanced Settings tab</a>."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Schedules"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Schedule States"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="schedule_states" type="checkbox" id="schedule_states" value="yes" <?php if ($pconfig['schedule_states']) echo "checked=\"checked\""; ?> />
+ <br />
+ <?=gettext("By default, when a schedule expires, connections permitted by that schedule are killed. ".
+ "This option overrides that behavior by not clearing states for existing connections."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Gateway Monitoring"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("State Killing on Gateway Failure"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="kill_states" type="checkbox" id="kill_states" value="yes" <?php if ($pconfig['kill_states']) echo "checked=\"checked\""; ?> />
+ <br />
+ <?=gettext("The monitoring process will flush states for a gateway that goes down if this box is not checked. Check this box to disable this behavior."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Skip rules when gateway is down"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="skip_rules_gw_down" type="checkbox" id="skip_rules_gw_down" value="yes" <?php if ($pconfig['skip_rules_gw_down']) echo "checked=\"checked\""; ?> />
+ <br />
+ <?=gettext("By default, when a rule has a gateway specified and this gateway is down, ".
+ "the rule is created omitting the gateway. This option overrides that behavior by omitting ".
+ "the entire rule instead."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Enable gateway monitoring debug logging"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="apinger_debug" type="checkbox" id="apinger_debug" value="yes" <?php if ($pconfig['apinger_debug']) echo "checked=\"checked\""; ?> />
+ <br />
+ <?=gettext("Enable this setting to log debug information from the gateway monitoring process to the system logs."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("RAM Disk Settings (Reboot to Apply Changes)"); ?></td>
+ </tr>
+ <?php if ($g['platform'] == "pfSense"): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Use RAM Disks"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="use_mfs_tmpvar" type="checkbox" id="use_mfs_tmpvar" value="yes" <?php if ($pconfig['use_mfs_tmpvar']) echo "checked=\"checked\""; ?> onclick="tmpvar_checked(this)" />
+ <strong><?=gettext("Use memory file system for /tmp and /var"); ?></strong><br />
+ <?=gettext("Set this if you wish to use /tmp and /var as RAM disks (memory file system disks) on a full install " .
+ "rather than use the hard disk. Setting this will cause the data in /tmp and /var to be lost at reboot, including log data. RRD and DHCP Leases will be retained."); ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("/tmp RAM Disk Size"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="use_mfs_tmp_size" id="use_mfs_tmp_size" value="<?php if ($pconfig['use_mfs_tmp_size'] <> "") echo htmlspecialchars($pconfig['use_mfs_tmp_size']); ?>" class="formfld unknown" <?php if (($g['platform'] == "pfSense") && ($pconfig['use_mfs_tmpvar'] == false)) echo "disabled=\"disabled\""; ?> /> MB
+ <br />
+ <?=gettext("Set the size, in MB, for the /tmp RAM disk. " .
+ "Leave blank for 40MB. Do not set lower than 40."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("/var RAM Disk Size"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="use_mfs_var_size" id="use_mfs_var_size" value="<?php if ($pconfig['use_mfs_var_size'] <> "") echo htmlspecialchars($pconfig['use_mfs_var_size']); ?>" class="formfld unknown" <?php if (($g['platform'] == "pfSense") && ($pconfig['use_mfs_tmpvar'] == false)) echo "disabled=\"disabled\""; ?> /> MB
+ <br />
+ <?=gettext("Set the size, in MB, for the /var RAM disk. " .
+ "Leave blank for 60MB. Do not set lower than 60."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Periodic RRD Backup");?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("Frequency:");?>
+ <select name="rrdbackup" id="rrdbackup" <?php if (($g['platform'] == "pfSense") && ($pconfig['use_mfs_tmpvar'] == false)) echo "disabled=\"disabled\""; ?> >
+ <option value='0' <?php if (!isset($config['system']['rrdbackup']) || ($config['system']['rrdbackup'] == 0)) echo "selected='selected'"; ?>><?=gettext("Disable"); ?></option>
+ <?php for ($x=1; $x<=24; $x++) { ?>
+ <option value='<?= $x ?>' <?php if ($config['system']['rrdbackup'] == $x) echo "selected='selected'"; ?>><?= $x ?> <?=gettext("hour"); ?><?php if ($x>1) echo "s"; ?></option>
+ <?php } ?>
+ </select>
+ <br />
+ <?=gettext("This will periodically backup the RRD data so it can be restored automatically on the next boot. Keep in mind that the more frequent the backup, the more writes will happen to your media.");?>
+ <br />
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Periodic DHCP Leases Backup");?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("Frequency:");?>
+ <select name="dhcpbackup" id="dhcpbackup" <?php if (($g['platform'] == "pfSense") && ($pconfig['use_mfs_tmpvar'] == false)) echo "disabled=\"disabled\""; ?> >
+ <option value='0' <?php if (!isset($config['system']['dhcpbackup']) || ($config['system']['dhcpbackup'] == 0)) echo "selected='selected'"; ?>><?=gettext("Disable"); ?></option>
+ <?php for ($x=1; $x<=24; $x++) { ?>
+ <option value='<?= $x ?>' <?php if ($config['system']['dhcpbackup'] == $x) echo "selected='selected'"; ?>><?= $x ?> <?=gettext("hour"); ?><?php if ($x>1) echo "s"; ?></option>
+ <?php } ?>
+ </select>
+ <br />
+ <?=gettext("This will periodically backup the DHCP leases data so it can be restored automatically on the next boot. Keep in mind that the more frequent the backup, the more writes will happen to your media.");?>
+ <br />
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <?php if ($g['platform'] == "pfSenseDISABLED"): ?>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Hardware Settings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hard disk standby time "); ?></td>
+ <td width="78%" class="vtable">
+ <select name="harddiskstandby" class="formselect">
+ <?php
+ ## Values from ATA-2 http://www.t13.org/project/d0948r3-ATA-2.pdf (Page 66)
+ $sbvals = explode(" ", "0.5,6 1,12 2,24 3,36 4,48 5,60 7.5,90 10,120 15,180 20,240 30,241 60,242");
+ ?>
+ <option value="" <?php if (!$pconfig['harddiskstandby']) echo('selected="selected"');?>><?=gettext("Always on"); ?></option>
+ <?php
+ foreach ($sbvals as $sbval):
+ list($min, $val) = explode(",", $sbval);
+ ?>
+ <option value="<?=$val;?>" <?php if ($pconfig['harddiskstandby'] == $val) echo('selected="selected"');?>><?=$min;?> <?=gettext("minutes"); ?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Puts the hard disk into standby mode when the selected amount of time after the last ".
+ "access has elapsed."); ?> <em><?=gettext("Do not set this for CF cards."); ?></em>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <?php endif; ?>
+
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Package settings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Package signature"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pkg_nochecksig" type="checkbox" id="pkg_nochecksig" value="yes" <?php if ($pconfig['pkg_nochecksig']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Do NOT check package signature"); ?></strong><br />
+ <?=gettext("Enable this option to allow pfSense to install any package without checking its signature."); ?>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Installation Feedback"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Host UUID"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="host_uuid" type="checkbox" id="host_uuid" value="yes" <?php if ($pconfig['host_uuid']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Do NOT send HOST UUID with user agent"); ?></strong><br />
+ <?=gettext("Enable this option to not send HOST UUID to pfSense as part of User-Agent header."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_advanced_network.php b/src/usr/local/www/system_advanced_network.php
new file mode 100644
index 0000000..4b3b7ce
--- /dev/null
+++ b/src/usr/local/www/system_advanced_network.php
@@ -0,0 +1,320 @@
+<?php
+/*
+ system_advanced_network.php
+ part of pfSense
+ Copyright (C) 2005-2007 Scott Ullrich
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-system-advanced-network
+##|*NAME=System: Advanced: Network page
+##|*DESCR=Allow access to the 'System: Advanced: Networking' page.
+##|*MATCH=system_advanced_network.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+
+$pconfig['ipv6nat_enable'] = isset($config['diag']['ipv6nat']['enable']);
+$pconfig['ipv6nat_ipaddr'] = $config['diag']['ipv6nat']['ipaddr'];
+$pconfig['ipv6allow'] = isset($config['system']['ipv6allow']);
+$pconfig['prefer_ipv4'] = isset($config['system']['prefer_ipv4']);
+$pconfig['polling_enable'] = isset($config['system']['polling']);
+$pconfig['sharednet'] = $config['system']['sharednet'];
+$pconfig['disablechecksumoffloading'] = isset($config['system']['disablechecksumoffloading']);
+$pconfig['disablesegmentationoffloading'] = isset($config['system']['disablesegmentationoffloading']);
+$pconfig['disablelargereceiveoffloading'] = isset($config['system']['disablelargereceiveoffloading']);
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if ($_POST['ipv6nat_enable'] && !is_ipaddr($_POST['ipv6nat_ipaddr'])) {
+ $input_errors[] = gettext("You must specify an IP address to NAT IPv6 packets.");
+ }
+
+ ob_flush();
+ flush();
+ if (!$input_errors) {
+
+ if ($_POST['ipv6nat_enable'] == "yes") {
+ $config['diag']['ipv6nat']['enable'] = true;
+ $config['diag']['ipv6nat']['ipaddr'] = $_POST['ipv6nat_ipaddr'];
+ } else {
+ if ($config['diag']) {
+ if ($config['diag']['ipv6nat']) {
+ unset($config['diag']['ipv6nat']['enable']);
+ unset($config['diag']['ipv6nat']['ipaddr']);
+ }
+ }
+ }
+
+ if ($_POST['ipv6allow'] == "yes") {
+ $config['system']['ipv6allow'] = true;
+ } else {
+ unset($config['system']['ipv6allow']);
+ }
+
+ if ($_POST['prefer_ipv4'] == "yes") {
+ $config['system']['prefer_ipv4'] = true;
+ } else {
+ unset($config['system']['prefer_ipv4']);
+ }
+
+ if ($_POST['sharednet'] == "yes") {
+ $config['system']['sharednet'] = true;
+ system_disable_arp_wrong_if();
+ } else {
+ unset($config['system']['sharednet']);
+ system_enable_arp_wrong_if();
+ }
+
+ if ($_POST['polling_enable'] == "yes") {
+ $config['system']['polling'] = true;
+ setup_polling();
+ } else {
+ unset($config['system']['polling']);
+ setup_polling();
+ }
+
+ if ($_POST['disablechecksumoffloading'] == "yes") {
+ $config['system']['disablechecksumoffloading'] = true;
+ } else {
+ unset($config['system']['disablechecksumoffloading']);
+ }
+
+ if ($_POST['disablesegmentationoffloading'] == "yes") {
+ $config['system']['disablesegmentationoffloading'] = true;
+ } else {
+ unset($config['system']['disablesegmentationoffloading']);
+ }
+
+ if ($_POST['disablelargereceiveoffloading'] == "yes") {
+ $config['system']['disablelargereceiveoffloading'] = true;
+ } else {
+ unset($config['system']['disablelargereceiveoffloading']);
+ }
+
+ setup_microcode();
+
+ // Write out configuration (config.xml)
+ write_config();
+
+ // Set preferred protocol
+ prefer_ipv4_or_ipv6();
+
+ $retval = filter_configure();
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message(gettext($retval));
+ } else {
+ $savemsg = gettext($retval);
+ }
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Advanced: Networking"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+
+function enable_change(enable_over) {
+ if (document.iform.ipv6nat_enable.checked || enable_over) {
+ document.iform.ipv6nat_ipaddr.disabled = 0;
+ } else {
+ document.iform.ipv6nat_ipaddr.disabled = 1;
+ }
+}
+
+//]]>
+</script>
+
+
+<?
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+ <form action="system_advanced_network.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced newtwork">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), true, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("NOTE:"); ?>&nbsp;</strong>
+ </span>
+ <?=gettext("The options on this page are intended for use by advanced users only."); ?>
+ <br />
+ </span>
+ <br />
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("IPv6 Options"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Allow IPv6"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="ipv6allow" type="checkbox" id="ipv6allow" value="yes" <?php if ($pconfig['ipv6allow']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
+ <strong><?=gettext("Allow IPv6"); ?></strong><br />
+ <?=gettext("All IPv6 traffic will be blocked by the firewall unless this box is checked."); ?><br />
+ <?=gettext("NOTE: This does not disable any IPv6 features on the firewall, it only blocks traffic."); ?><br />
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 over IPv4 Tunneling"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="ipv6nat_enable" type="checkbox" id="ipv6nat_enable" value="yes" <?php if ($pconfig['ipv6nat_enable']) echo "checked=\"checked\""; ?> onclick="enable_change(false)" />
+ <strong><?=gettext("Enable IPv4 NAT encapsulation of IPv6 packets"); ?></strong><br />
+ <?=gettext("This provides an RFC 2893 compatibility mechanism ".
+ "that can be used to tunnel IPv6 packets over IPv4 ".
+ "routing infrastructures. If enabled, don't forget to ".
+ "add a firewall rule to permit IPv6 packets."); ?><br />
+ <br />
+ <?=gettext("IP address"); ?>&nbsp;:&nbsp;
+ <input name="ipv6nat_ipaddr" type="text" class="formfld unknown" id="ipv6nat_ipaddr" size="20" value="<?=htmlspecialchars($pconfig['ipv6nat_ipaddr']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Prefer IPv4 over IPv6"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="prefer_ipv4" type="checkbox" id="prefer_ipv4" value="yes" <?php if ($pconfig['prefer_ipv4']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Prefer to use IPv4 even if IPv6 is available"); ?></strong><br />
+ <?=gettext("By default, if a hostname resolves IPv6 and IPv4 addresses IPv6 will be used. " .
+ "If you check this option, IPv4 will be used instead of IPv6."); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Network Interfaces"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Device polling"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="polling_enable" type="checkbox" id="polling_enable" value="yes" <?php if ($pconfig['polling_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable device polling"); ?></strong><br />
+ <?php printf(gettext("Device polling is a technique that lets the system periodically poll network devices for new data instead of relying on interrupts. This prevents your webConfigurator, SSH, etc. from being inaccessible due to interrupt floods when under extreme load. Generally this is not recommended. Not all NICs support polling; see the %s homepage for a list of supported cards."), $g['product_name']); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hardware Checksum Offloading"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disablechecksumoffloading" type="checkbox" id="disablechecksumoffloading" value="yes" <?php if (isset($config['system']['disablechecksumoffloading'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable hardware checksum offload"); ?></strong><br />
+ <?=gettext("Checking this option will disable hardware checksum offloading. Checksum offloading is broken in some hardware, particularly some Realtek cards. Rarely, drivers may have problems with checksum offloading and some specific NICs."); ?>
+ <br />
+ <span class="red"><strong><?=gettext("Note:");?>&nbsp;</strong></span>
+ <?=gettext("This will take effect after you reboot the machine or re-configure each interface.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hardware TCP Segmentation Offloading"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disablesegmentationoffloading" type="checkbox" id="disablesegmentationoffloading" value="yes" <?php if (isset($config['system']['disablesegmentationoffloading'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable hardware TCP segmentation offload"); ?></strong><br />
+ <?=gettext("Checking this option will disable hardware TCP segmentation offloading (TSO, TSO4, TSO6). This offloading is broken in some hardware drivers, and may impact performance with some specific NICs."); ?>
+ <br />
+ <span class="red"><strong><?=gettext("Note:");?>&nbsp;</strong></span>
+ <?=gettext("This will take effect after you reboot the machine or re-configure each interface.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Hardware Large Receive Offloading"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disablelargereceiveoffloading" type="checkbox" id="disablelargereceiveoffloading" value="yes" <?php if (isset($config['system']['disablelargereceiveoffloading'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable hardware large receive offload"); ?></strong><br />
+ <?=gettext("Checking this option will disable hardware large receive offloading (LRO). This offloading is broken in some hardware drivers, and may impact performance with some specific NICs."); ?>
+ <br />
+ <span class="red"><strong><?=gettext("Note:");?>&nbsp;</strong></span>
+ <?=gettext("This will take effect after you reboot the machine or re-configure each interface.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("ARP Handling"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="sharednet" type="checkbox" id="sharednet" value="yes" <?php if (isset($pconfig['sharednet'])) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Suppress ARP messages"); ?></strong><br />
+ <?=gettext("This option will suppress ARP log messages when multiple interfaces reside on the same broadcast domain"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%"><input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" /></td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </form>
+ <script type="text/javascript">
+ //<![CDATA[
+ enable_change(false);
+ //]]>
+ </script>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_advanced_notifications.php b/src/usr/local/www/system_advanced_notifications.php
new file mode 100644
index 0000000..45ac501
--- /dev/null
+++ b/src/usr/local/www/system_advanced_notifications.php
@@ -0,0 +1,413 @@
+<?php
+/* $Id$ */
+/*
+ system_advanced_notifications.php
+ part of pfSense
+ Copyright (C) 2009 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-system-advanced-notifications
+##|*NAME=System: Advanced: Notifications page
+##|*DESCR=Allow access to the 'System: Advanced: Notifications' page.
+##|*MATCH=system_advanced_notifications.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("notices.inc");
+
+// Growl
+$pconfig['disable_growl'] = isset($config['notifications']['growl']['disable']);
+if ($config['notifications']['growl']['password']) {
+ $pconfig['password'] = $config['notifications']['growl']['password'];
+}
+if ($config['notifications']['growl']['ipaddress']) {
+ $pconfig['ipaddress'] = $config['notifications']['growl']['ipaddress'];
+}
+
+if ($config['notifications']['growl']['notification_name']) {
+ $pconfig['notification_name'] = $config['notifications']['growl']['notification_name'];
+} else {
+ $pconfig['notification_name'] = "{$g['product_name']} growl alert";
+}
+
+if ($config['notifications']['growl']['name']) {
+ $pconfig['name'] = $config['notifications']['growl']['name'];
+} else {
+ $pconfig['name'] = 'PHP-Growl';
+}
+
+
+// SMTP
+$pconfig['disable_smtp'] = isset($config['notifications']['smtp']['disable']);
+if ($config['notifications']['smtp']['ipaddress']) {
+ $pconfig['smtpipaddress'] = $config['notifications']['smtp']['ipaddress'];
+}
+if ($config['notifications']['smtp']['port']) {
+ $pconfig['smtpport'] = $config['notifications']['smtp']['port'];
+}
+if (isset($config['notifications']['smtp']['ssl'])) {
+ $pconfig['smtpssl'] = true;
+}
+if (isset($config['notifications']['smtp']['tls'])) {
+ $pconfig['smtptls'] = true;
+}
+if ($config['notifications']['smtp']['notifyemailaddress']) {
+ $pconfig['smtpnotifyemailaddress'] = $config['notifications']['smtp']['notifyemailaddress'];
+}
+if ($config['notifications']['smtp']['username']) {
+ $pconfig['smtpusername'] = $config['notifications']['smtp']['username'];
+}
+if ($config['notifications']['smtp']['password']) {
+ $pconfig['smtppassword'] = $config['notifications']['smtp']['password'];
+}
+if ($config['notifications']['smtp']['authentication_mechanism']) {
+ $pconfig['smtpauthmech'] = $config['notifications']['smtp']['authentication_mechanism'];
+}
+if ($config['notifications']['smtp']['fromaddress']) {
+ $pconfig['smtpfromaddress'] = $config['notifications']['smtp']['fromaddress'];
+}
+
+// System Sounds
+$pconfig['disablebeep'] = isset($config['system']['disablebeep']);
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ system_setup_sysctl();
+ $savemsg = get_std_save_message($retval);
+ }
+
+ if ($_POST['Submit'] == gettext("Save")) {
+ $tunableent = array();
+
+ // Growl
+ $config['notifications']['growl']['ipaddress'] = $_POST['ipaddress'];
+ $config['notifications']['growl']['password'] = $_POST['password'];
+ $config['notifications']['growl']['name'] = $_POST['name'];
+ $config['notifications']['growl']['notification_name'] = $_POST['notification_name'];
+
+ if ($_POST['disable_growl'] == "yes") {
+ $config['notifications']['growl']['disable'] = true;
+ } else {
+ unset($config['notifications']['growl']['disable']);
+ }
+
+ // SMTP
+ $config['notifications']['smtp']['ipaddress'] = $_POST['smtpipaddress'];
+ $config['notifications']['smtp']['port'] = $_POST['smtpport'];
+ if (isset($_POST['smtpssl'])) {
+ $config['notifications']['smtp']['ssl'] = true;
+ } else {
+ unset($config['notifications']['smtp']['ssl']);
+ }
+ if (isset($_POST['smtptls'])) {
+ $config['notifications']['smtp']['tls'] = true;
+ } else {
+ unset($config['notifications']['smtp']['tls']);
+ }
+ $config['notifications']['smtp']['notifyemailaddress'] = $_POST['smtpnotifyemailaddress'];
+ $config['notifications']['smtp']['username'] = $_POST['smtpusername'];
+ $config['notifications']['smtp']['password'] = $_POST['smtppassword'];
+ $config['notifications']['smtp']['authentication_mechanism'] = $_POST['smtpauthmech'];
+ $config['notifications']['smtp']['fromaddress'] = $_POST['smtpfromaddress'];
+
+ if ($_POST['disable_smtp'] == "yes") {
+ $config['notifications']['smtp']['disable'] = true;
+ } else {
+ unset($config['notifications']['smtp']['disable']);
+ }
+
+ // System Sounds
+ if ($_POST['disablebeep'] == "yes") {
+ $config['system']['disablebeep'] = true;
+ } else {
+ unset($config['system']['disablebeep']);
+ }
+
+ write_config();
+ pfSenseHeader("system_advanced_notifications.php");
+ return;
+
+ }
+ if ($_POST['test_growl'] == gettext("Test Growl")) {
+ // Send test message via growl
+ if ($config['notifications']['growl']['ipaddress'] &&
+ $config['notifications']['growl']['password'] = $_POST['password']) {
+ unlink_if_exists($g['vardb_path'] . "/growlnotices_lastmsg.txt");
+ register_via_growl();
+ notify_via_growl(sprintf(gettext("This is a test message from %s. It is safe to ignore this message."), $g['product_name']), true);
+ }
+ }
+ if ($_POST['test_smtp'] == gettext("Test SMTP")) {
+ // Send test message via smtp
+ if (file_exists("/var/db/notices_lastmsg.txt")) {
+ unlink("/var/db/notices_lastmsg.txt");
+ }
+ $savemsg = notify_via_smtp(sprintf(gettext("This is a test message from %s. It is safe to ignore this message."), $g['product_name']), true);
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Advanced: Notifications"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+ <form action="system_advanced_notifications.php" method="post">
+ <?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+ ?>
+ </form>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced notifications">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), true, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <form action="system_advanced_notifications.php" method="post" name="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <!-- GROWL -->
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Growl"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable Growl Notifications"); ?></td>
+ <td width="78%" class="vtable">
+ <input type='checkbox' name='disable_growl' value="yes" <?php if ($pconfig['disable_growl']) {?>checked="checked"<?php } ?> /><br />
+ <?=gettext("Check this option to disable growl notifications but preserve the settings below."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Registration Name"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='name' value='<?php echo htmlspecialchars($pconfig['name'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=gettext("Enter the name to register with the Growl server (default: PHP-Growl)."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Notification Name"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='notification_name' value='<?php echo htmlspecialchars($pconfig['notification_name'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=sprintf(gettext("Enter a name for the Growl notifications (default: %s growl alert)."), $g['product_name']); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IP Address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='ipaddress' value='<?php echo htmlspecialchars($pconfig['ipaddress'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=gettext("This is the IP address that you would like to send growl notifications to."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Password"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='password' type='password' value='<?php echo htmlspecialchars($pconfig['password'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=gettext("Enter the password of the remote growl notification device."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="">
+ &nbsp;
+ </td>
+ <td>
+ <input type='submit' id='test_growl' name='test_growl' value='<?=gettext("Test Growl"); ?>' />
+ <br /><?= gettext("NOTE: A test notification will be sent even if the service is marked as disabled.") ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <!-- SMTP -->
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("SMTP E-Mail"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable SMTP Notifications"); ?></td>
+ <td width="78%" class="vtable">
+ <input type='checkbox' name='disable_smtp' value="yes" <?php if ($pconfig['disable_smtp']) {?>checked="checked"<?php } ?> /><br />
+ <?=gettext("Check this option to disable SMTP notifications but preserve the settings below. Some other mechanisms, such as packages, may need these settings in place to function."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("E-Mail server"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='smtpipaddress' value='<?php echo htmlspecialchars($pconfig['smtpipaddress'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=gettext("This is the FQDN or IP address of the SMTP E-Mail server to which notifications will be sent."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("SMTP Port of E-Mail server"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='smtpport' value='<?php echo htmlspecialchars($pconfig['smtpport'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=gettext("This is the port of the SMTP E-Mail server, typically 25, 587 (submission) or 465 (smtps)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Secure SMTP Connection"); ?></td>
+ <td width="78%" class="vtable">
+ <input type='checkbox' id='smtpssl' name='smtpssl' <?php if (isset($pconfig['smtpssl'])) echo "checked=\"checked\""; ?> />Enable SMTP over SSL/TLS<br />
+ <input type='checkbox' id='smtptls' name='smtptls' <?php if (isset($pconfig['smtptls'])) echo "checked=\"checked\""; ?> />Enable STARTTLS<br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("From e-mail address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='smtpfromaddress' type='text' value='<?php echo htmlspecialchars($pconfig['smtpfromaddress'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=gettext("This is the e-mail address that will appear in the from field."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Notification E-Mail address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='smtpnotifyemailaddress' type='text' value='<?php echo htmlspecialchars($pconfig['smtpnotifyemailaddress'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=gettext("Enter the e-mail address that you would like email notifications sent to."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Notification E-Mail auth username (optional)"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='smtpusername' type='text' value='<?php echo htmlspecialchars($pconfig['smtpusername'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=gettext("Enter the e-mail address username for SMTP authentication."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Notification E-Mail auth password"); ?></td>
+ <td width="78%" class="vtable">
+ <input name='smtppassword' type='password' value='<?php echo htmlspecialchars($pconfig['smtppassword'], ENT_QUOTES | ENT_HTML401); ?>' /><br />
+ <?=gettext("Enter the e-mail address password for SMTP authentication."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Notification E-Mail auth mechanism"); ?></td>
+ <td width="78%" class="vtable">
+ <select name='smtpauthmech' id='smtpauthmech' class="formselect">
+ <?php
+ foreach ($smtp_authentication_mechanisms as $name => $desc):
+ $selected = "";
+ if ($pconfig['smtpauthmech'] == $name) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>" <?=$selected;?>><?=$desc;?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Select the authentication mechanism used by the SMTP server. Most work with PLAIN, some servers like Exchange or Office365 might require LOGIN."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" class="">
+ &nbsp;
+ </td>
+ <td>
+ <input type='submit' id='test_smtp' name='test_smtp' value='<?=gettext("Test SMTP"); ?>' />
+ <br /><?= gettext("NOTE: A test message will be sent even if the service is marked as disabled.") ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <!-- System Sounds -->
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("System Sounds"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Startup/Shutdown Sound"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disablebeep" type="checkbox" id="disablebeep" value="yes" <?php if ($pconfig['disablebeep']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable the startup/shutdown beep"); ?></strong>
+ <br />
+ <span class="vexpl"><?=gettext("When this is checked, startup and shutdown sounds will no longer play."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td valign="top" class="">
+ &nbsp;
+ </td>
+ <td>
+ <input type='submit' id='Submit' name='Submit' value='<?=gettext("Save"); ?>' />
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+ </td>
+ </tr>
+ </table>
+<script type="text/javascript">
+//<![CDATA[
+ jQuery(document).ready(function() {
+ if (jQuery('#smtpssl').is(':checked')) {
+ jQuery('#smtptls').prop('disabled', true);
+ } else if (jQuery('#smtptls').is(':checked')) {
+ jQuery('#smtpssl').prop('disabled', true);
+ }
+ });
+ jQuery('#smtpssl').change( function() {
+ jQuery('#smtptls').prop('disabled', this.checked);
+ });
+ jQuery('#smtptls').change( function() {
+ jQuery('#smtpssl').prop('disabled', this.checked);
+ });
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_advanced_sysctl.php b/src/usr/local/www/system_advanced_sysctl.php
new file mode 100644
index 0000000..1992cc1
--- /dev/null
+++ b/src/usr/local/www/system_advanced_sysctl.php
@@ -0,0 +1,305 @@
+<?php
+/* $Id$ */
+/*
+ system_advanced_sysctl.php
+ part of pfSense
+ Copyright (C) 2005-2007 Scott Ullrich
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-system-advanced-sysctl
+##|*NAME=System: Advanced: Tunables page
+##|*DESCR=Allow access to the 'System: Advanced: Tunables' page.
+##|*MATCH=system_advanced_sysctl.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_advanced_sysctl.php');
+}
+
+if (!is_array($config['sysctl'])) {
+ $config['sysctl'] = array();
+}
+if (!is_array($config['sysctl']['item'])) {
+ $config['sysctl']['item'] = array();
+}
+
+$a_tunable = &$config['sysctl']['item'];
+$tunables = system_get_sysctls();
+
+if (isset($_GET['id'])) {
+ $id = htmlspecialchars_decode($_GET['id']);
+}
+if (isset($_POST['id'])) {
+ $id = htmlspecialchars_decode($_POST['id']);
+}
+
+$act = $_GET['act'];
+if (isset($_POST['act'])) {
+ $act = $_POST['act'];
+}
+
+if ($act == "edit") {
+ if (isset($a_tunable[$id])) {
+ $pconfig['tunable'] = $a_tunable[$id]['tunable'];
+ $pconfig['value'] = $a_tunable[$id]['value'];
+ $pconfig['descr'] = $a_tunable[$id]['descr'];
+ } else if (isset($tunables[$id])) {
+ $pconfig['tunable'] = $tunables[$id]['tunable'];
+ $pconfig['value'] = $tunables[$id]['value'];
+ $pconfig['descr'] = $tunables[$id]['descr'];
+ }
+}
+
+if ($act == "del") {
+ if ($a_tunable[$id]) {
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+ if (!$input_errors) {
+ unset($a_tunable[$id]);
+ write_config();
+ mark_subsystem_dirty('sysctl');
+ pfSenseHeader("system_advanced_sysctl.php");
+ exit;
+ }
+ }
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ system_setup_sysctl();
+ $savemsg = get_std_save_message($retval);
+ clear_subsystem_dirty('sysctl');
+ }
+
+ if ($_POST['Submit'] == gettext("Save")) {
+ $tunableent = array();
+
+ $tunableent['tunable'] = $_POST['tunable'];
+ $tunableent['value'] = $_POST['value'];
+ $tunableent['descr'] = $_POST['descr'];
+
+ if (isset($id) && isset($a_tunable[$id])) {
+ $a_tunable[$id] = $tunableent;
+ } else {
+ $a_tunable[] = $tunableent;
+ }
+
+ mark_subsystem_dirty('sysctl');
+
+ write_config();
+
+ pfSenseHeader("system_advanced_sysctl.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Advanced: System Tunables"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+ <form action="system_advanced_sysctl.php" method="post">
+ <?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+ if (is_subsystem_dirty('sysctl') && ($act != "edit")) {
+ print_info_box_np(gettext("The firewall tunables have changed. You must apply the configuration to take affect."));
+ }
+ ?>
+ </form>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system advanced tunables">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), false, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), true, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <?php if ($act != "edit"): ?>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("NOTE:"); ?>&nbsp;</strong>
+ </span>
+ <?=gettext("The options on this page are intended for use by advanced users only."); ?>
+ <br />
+ </span>
+ <br />
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Tunable Name"); ?></td>
+ <td width="60%" class="listhdrr"><?=gettext("Description"); ?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Value"); ?></td>
+ </tr>
+ <?php foreach ($tunables as $i => $tunable):
+
+ if (!isset($tunable['modified'])) {
+ $i = urlencode($tunable['tunable']);
+ }
+ ?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='system_advanced_sysctl.php?act=edit&amp;id=<?=$i;?>';">
+ <?php echo htmlspecialchars($tunable['tunable']); ?>
+ </td>
+ <td class="listr" align="left" ondblclick="document.location='system_advanced_sysctl.php?act=edit&amp;id=<?=$i;?>';">
+ <?php echo htmlspecialchars($tunable['descr']); ?>
+ </td>
+ <td class="listr" align="left" ondblclick="document.location='system_advanced_sysctl.php?act=edit&amp;id=<?=$i;?>';">
+ <?php echo htmlspecialchars($tunable['value']); ?>
+ <?php
+ if ($tunable['value'] == "default") {
+ echo "(" . get_default_sysctl_value($tunable['tunable']) . ")";
+ }
+ ?>
+ </td>
+ <td class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit delete">
+ <tr>
+ <td valign="middle">
+ <a href="system_advanced_sysctl.php?act=edit&amp;id=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="" />
+ </a>
+ </td>
+ <?php if (isset($tunable['modified'])): ?>
+ <td valign="middle">
+ <a href="system_advanced_sysctl.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this entry?"); ?>')">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="" />
+ </a>
+ </td>
+ <?php endif; ?>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php endforeach; unset($tunables); ?>
+ <tr>
+ <td class="list" colspan="3">
+ </td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td valign="middle">
+ <a href="system_advanced_sysctl.php?act=edit">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <?php else: ?>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <form action="system_advanced_sysctl.php" method="post" name="iform" id="iform">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="edit system tunable">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit system tunable"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Tunable"); ?></td>
+ <td width="78%" class="vtable">
+ <input size="65" name="tunable" value="<?php echo htmlspecialchars($pconfig['tunable']); ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <textarea rows="7" cols="50" name="descr"><?php echo htmlspecialchars($pconfig['descr']); ?></textarea>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Value"); ?></td>
+ <td width="78%" class="vtable">
+ <input size="65" name="value" value="<?php echo htmlspecialchars($pconfig['value']); ?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_tunable[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+ </td>
+ </tr>
+ <?php endif; ?>
+ </table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_authservers.php b/src/usr/local/www/system_authservers.php
new file mode 100644
index 0000000..0b7c81d
--- /dev/null
+++ b/src/usr/local/www/system_authservers.php
@@ -0,0 +1,912 @@
+<?php
+/*
+ system_authservers.php
+
+ Copyright (C) 2008 Shrew Soft Inc.
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: auth
+*/
+
+##|+PRIV
+##|*IDENT=page-system-authservers
+##|*NAME=System: Authentication Servers
+##|*DESCR=Allow access to the 'System: Authentication Servers' page.
+##|*MATCH=system_authservers.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("auth.inc");
+
+$pgtitle = array(gettext("System"), gettext("Authentication Servers"));
+$shortcut_section = "authentication";
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (!is_array($config['system']['authserver'])) {
+ $config['system']['authserver'] = array();
+}
+
+$a_servers = auth_get_authserver_list();
+foreach ($a_servers as $servers) {
+ $a_server[] = $servers;
+}
+
+if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+}
+$a_ca =& $config['ca'];
+
+$act = $_GET['act'];
+if ($_POST['act']) {
+ $act = $_POST['act'];
+}
+
+if ($act == "del") {
+
+ if (!$a_server[$_GET['id']]) {
+ pfSenseHeader("system_authservers.php");
+ exit;
+ }
+
+ /* Remove server from main list. */
+ $serverdeleted = $a_server[$_GET['id']]['name'];
+ foreach ($config['system']['authserver'] as $k => $as) {
+ if ($config['system']['authserver'][$k]['name'] == $serverdeleted) {
+ unset($config['system']['authserver'][$k]);
+ }
+ }
+
+ /* Remove server from temp list used later on this page. */
+ unset($a_server[$_GET['id']]);
+
+ $savemsg = gettext("Authentication Server") . " " . htmlspecialchars($serverdeleted) . " " . gettext("deleted") . "<br />";
+ write_config($savemsg);
+}
+
+if ($act == "edit") {
+ if (isset($id) && $a_server[$id]) {
+
+ $pconfig['type'] = $a_server[$id]['type'];
+ $pconfig['name'] = $a_server[$id]['name'];
+
+ if ($pconfig['type'] == "ldap") {
+ $pconfig['ldap_caref'] = $a_server[$id]['ldap_caref'];
+ $pconfig['ldap_host'] = $a_server[$id]['host'];
+ $pconfig['ldap_port'] = $a_server[$id]['ldap_port'];
+ $pconfig['ldap_urltype'] = $a_server[$id]['ldap_urltype'];
+ $pconfig['ldap_protver'] = $a_server[$id]['ldap_protver'];
+ $pconfig['ldap_scope'] = $a_server[$id]['ldap_scope'];
+ $pconfig['ldap_basedn'] = $a_server[$id]['ldap_basedn'];
+ $pconfig['ldap_authcn'] = $a_server[$id]['ldap_authcn'];
+ $pconfig['ldap_extended_enabled'] = $a_server[$id]['ldap_extended_enabled'];
+ $pconfig['ldap_extended_query'] = $a_server[$id]['ldap_extended_query'];
+ $pconfig['ldap_binddn'] = $a_server[$id]['ldap_binddn'];
+ $pconfig['ldap_bindpw'] = $a_server[$id]['ldap_bindpw'];
+ $pconfig['ldap_attr_user'] = $a_server[$id]['ldap_attr_user'];
+ $pconfig['ldap_attr_group'] = $a_server[$id]['ldap_attr_group'];
+ $pconfig['ldap_attr_member'] = $a_server[$id]['ldap_attr_member'];
+ $pconfig['ldap_utf8'] = isset($a_server[$id]['ldap_utf8']);
+ $pconfig['ldap_nostrip_at'] = isset($a_server[$id]['ldap_nostrip_at']);
+
+ if (!$pconfig['ldap_binddn'] || !$pconfig['ldap_bindpw']) {
+ $pconfig['ldap_anon'] = true;
+ }
+ }
+
+ if ($pconfig['type'] == "radius") {
+ $pconfig['radius_host'] = $a_server[$id]['host'];
+ $pconfig['radius_auth_port'] = $a_server[$id]['radius_auth_port'];
+ $pconfig['radius_acct_port'] = $a_server[$id]['radius_acct_port'];
+ $pconfig['radius_secret'] = $a_server[$id]['radius_secret'];
+ $pconfig['radius_timeout'] = $a_server[$id]['radius_timeout'];
+
+ if ($pconfig['radius_auth_port'] &&
+ $pconfig['radius_acct_port']) {
+ $pconfig['radius_srvcs'] = "both";
+ }
+
+ if ($pconfig['radius_auth_port'] &&
+ !$pconfig['radius_acct_port']) {
+ $pconfig['radius_srvcs'] = "auth";
+ $pconfig['radius_acct_port'] = 1813;
+ }
+
+ if (!$pconfig['radius_auth_port'] &&
+ $pconfig['radius_acct_port']) {
+ $pconfig['radius_srvcs'] = "acct";
+ $pconfig['radius_auth_port'] = 1812;
+ }
+
+ }
+ }
+}
+
+if ($act == "new") {
+ $pconfig['ldap_protver'] = 3;
+ $pconfig['ldap_anon'] = true;
+ $pconfig['radius_srvcs'] = "both";
+ $pconfig['radius_auth_port'] = "1812";
+ $pconfig['radius_acct_port'] = "1813";
+}
+
+if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+
+ if ($pconfig['type'] == "ldap") {
+ $reqdfields = explode(" ",
+ "name type ldap_host ldap_port " .
+ "ldap_urltype ldap_protver ldap_scope " .
+ "ldap_attr_user ldap_attr_group ldap_attr_member ldapauthcontainers");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Type"),
+ gettext("Hostname or IP"),
+ gettext("Port value"),
+ gettext("Transport"),
+ gettext("Protocol version"),
+ gettext("Search level"),
+ gettext("User naming Attribute"),
+ gettext("Group naming Attribute"),
+ gettext("Group member attribute"),
+ gettext("Authentication container"));
+
+ if (!$pconfig['ldap_anon']) {
+ $reqdfields[] = "ldap_binddn";
+ $reqdfields[] = "ldap_bindpw";
+ $reqdfieldsn[] = gettext("Bind user DN");
+ $reqdfieldsn[] = gettext("Bind Password");
+ }
+ }
+
+ if ($pconfig['type'] == "radius") {
+ $reqdfields = explode(" ", "name type radius_host radius_srvcs");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Type"),
+ gettext("Hostname or IP"),
+ gettext("Services"));
+
+ if ($pconfig['radisu_srvcs'] == "both" ||
+ $pconfig['radisu_srvcs'] == "auth") {
+ $reqdfields[] = "radius_auth_port";
+ $reqdfieldsn[] = gettext("Authentication port value");
+ }
+
+ if ($pconfig['radisu_srvcs'] == "both" ||
+ $pconfig['radisu_srvcs'] == "acct") {
+ $reqdfields[] = "radius_acct_port";
+ $reqdfieldsn[] = gettext("Accounting port value");
+ }
+
+ if (!isset($id)) {
+ $reqdfields[] = "radius_secret";
+ $reqdfieldsn[] = gettext("Shared Secret");
+ }
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['host'])) {
+ $input_errors[] = gettext("The host name contains invalid characters.");
+ }
+
+ if (auth_get_authserver($pconfig['name']) && !isset($id)) {
+ $input_errors[] = gettext("An authentication server with the same name already exists.");
+ }
+
+ if (($pconfig['type'] == "radius") && isset($_POST['radius_timeout']) && !empty($_POST['radius_timeout']) && (!is_numeric($_POST['radius_timeout']) || (is_numeric($_POST['radius_timeout']) && ($_POST['radius_timeout'] <= 0)))) {
+ $input_errors[] = gettext("RADIUS Timeout value must be numeric and positive.");
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if (!$input_errors) {
+ $server = array();
+ $server['refid'] = uniqid();
+ if (isset($id) && $a_server[$id]) {
+ $server = $a_server[$id];
+ }
+
+ $server['type'] = $pconfig['type'];
+ $server['name'] = $pconfig['name'];
+
+ if ($server['type'] == "ldap") {
+
+ if (!empty($pconfig['ldap_caref'])) {
+ $server['ldap_caref'] = $pconfig['ldap_caref'];
+ }
+ $server['host'] = $pconfig['ldap_host'];
+ $server['ldap_port'] = $pconfig['ldap_port'];
+ $server['ldap_urltype'] = $pconfig['ldap_urltype'];
+ $server['ldap_protver'] = $pconfig['ldap_protver'];
+ $server['ldap_scope'] = $pconfig['ldap_scope'];
+ $server['ldap_basedn'] = $pconfig['ldap_basedn'];
+ $server['ldap_authcn'] = $pconfig['ldapauthcontainers'];
+ $server['ldap_extended_enabled'] = $pconfig['ldap_extended_enabled'];
+ $server['ldap_extended_query'] = $pconfig['ldap_extended_query'];
+ $server['ldap_attr_user'] = $pconfig['ldap_attr_user'];
+ $server['ldap_attr_group'] = $pconfig['ldap_attr_group'];
+ $server['ldap_attr_member'] = $pconfig['ldap_attr_member'];
+ if ($pconfig['ldap_utf8'] == "yes") {
+ $server['ldap_utf8'] = true;
+ } else {
+ unset($server['ldap_utf8']);
+ }
+ if ($pconfig['ldap_nostrip_at'] == "yes") {
+ $server['ldap_nostrip_at'] = true;
+ } else {
+ unset($server['ldap_nostrip_at']);
+ }
+
+
+ if (!$pconfig['ldap_anon']) {
+ $server['ldap_binddn'] = $pconfig['ldap_binddn'];
+ $server['ldap_bindpw'] = $pconfig['ldap_bindpw'];
+ } else {
+ unset($server['ldap_binddn']);
+ unset($server['ldap_bindpw']);
+ }
+ }
+
+ if ($server['type'] == "radius") {
+
+ $server['host'] = $pconfig['radius_host'];
+
+ if ($pconfig['radius_secret']) {
+ $server['radius_secret'] = $pconfig['radius_secret'];
+ }
+
+ if ($pconfig['radius_timeout']) {
+ $server['radius_timeout'] = $pconfig['radius_timeout'];
+ } else {
+ $server['radius_timeout'] = 5;
+ }
+
+ if ($pconfig['radius_srvcs'] == "both") {
+ $server['radius_auth_port'] = $pconfig['radius_auth_port'];
+ $server['radius_acct_port'] = $pconfig['radius_acct_port'];
+ }
+
+ if ($pconfig['radius_srvcs'] == "auth") {
+ $server['radius_auth_port'] = $pconfig['radius_auth_port'];
+ unset($server['radius_acct_port']);
+ }
+
+ if ($pconfig['radius_srvcs'] == "acct") {
+ $server['radius_acct_port'] = $pconfig['radius_acct_port'];
+ unset($server['radius_auth_port']);
+ }
+ }
+
+ if (isset($id) && $config['system']['authserver'][$id]) {
+ $config['system']['authserver'][$id] = $server;
+ } else {
+ $config['system']['authserver'][] = $server;
+ }
+
+ write_config();
+
+ pfSenseHeader("system_authservers.php");
+ }
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function server_typechange(typ) {
+
+ var idx = 0;
+ if (!typ) {
+ idx = document.getElementById("type").selectedIndex;
+ typ = document.getElementById("type").options[idx].value;
+ }
+
+ switch (typ) {
+ case "ldap":
+ document.getElementById("ldap").style.display="";
+ document.getElementById("radius").style.display="none";
+ break;
+ case "radius":
+ document.getElementById("ldap").style.display="none";
+ document.getElementById("radius").style.display="";
+ break;
+ }
+}
+
+function ldap_urlchange() {
+ switch (document.getElementById("ldap_urltype").selectedIndex) {
+<?php
+ $index = 0;
+ foreach ($ldap_urltypes as $urltype => $urlport):
+?>
+ case <?=$index;?>:
+ document.getElementById("ldap_port").value = "<?=$urlport;?>";
+ break;
+<?php
+ $index++;
+ endforeach;
+?>
+ }
+}
+
+function ldap_bindchange() {
+
+ if (document.getElementById("ldap_anon").checked) {
+ document.getElementById("ldap_bind").style.display="none";
+ } else {
+ document.getElementById("ldap_bind").style.display="";
+ }
+}
+
+function ldap_tmplchange() {
+ switch (document.getElementById("ldap_tmpltype").selectedIndex) {
+<?php
+ $index = 0;
+ foreach ($ldap_templates as $tmpldata):
+?>
+ case <?=$index;?>:
+ document.getElementById("ldap_attr_user").value = "<?=$tmpldata['attr_user'];?>";
+ document.getElementById("ldap_attr_group").value = "<?=$tmpldata['attr_group'];?>";
+ document.getElementById("ldap_attr_member").value = "<?=$tmpldata['attr_member'];?>";
+ break;
+<?php
+ $index++;
+ endforeach;
+?>
+ }
+}
+
+function radius_srvcschange() {
+ switch (document.getElementById("radius_srvcs").selectedIndex) {
+ case 0: // both
+ document.getElementById("radius_auth").style.display="";
+ document.getElementById("radius_acct").style.display="";
+ break;
+ case 1: // authentication
+ document.getElementById("radius_auth").style.display="";
+ document.getElementById("radius_acct").style.display="none";
+ break;
+ case 2: // accounting
+ document.getElementById("radius_auth").style.display="none";
+ document.getElementById("radius_acct").style.display="";
+ break;
+ }
+}
+
+function select_clicked() {
+ if (document.getElementById("ldap_port").value == '' ||
+ document.getElementById("ldap_host").value == '' ||
+ document.getElementById("ldap_scope").value == '' ||
+ document.getElementById("ldap_basedn").value == '' ||
+ document.getElementById("ldapauthcontainers").value == '') {
+ alert("<?=gettext("Please fill the required values.");?>");
+ return;
+ }
+ if (!document.getElementById("ldap_anon").checked) {
+ if (document.getElementById("ldap_binddn").value == '' ||
+ document.getElementById("ldap_bindpw").value == '') {
+ alert("<?=gettext("Please fill the bind username/password.");?>");
+ return;
+ }
+ }
+ var url = 'system_usermanager_settings_ldapacpicker.php?';
+ url += 'port=' + document.getElementById("ldap_port").value;
+ url += '&host=' + document.getElementById("ldap_host").value;
+ url += '&scope=' + document.getElementById("ldap_scope").value;
+ url += '&basedn=' + document.getElementById("ldap_basedn").value;
+ url += '&binddn=' + document.getElementById("ldap_binddn").value;
+ url += '&bindpw=' + document.getElementById("ldap_bindpw").value;
+ url += '&urltype=' + document.getElementById("ldap_urltype").value;
+ url += '&proto=' + document.getElementById("ldap_protver").value;
+ url += '&authcn=' + document.getElementById("ldapauthcontainers").value;
+ <?php if (count($a_ca) > 0): ?>
+ url += '&cert=' + document.getElementById("ldap_caref").value;
+ <?php else: ?>
+ url += '&cert=';
+ <?php endif; ?>
+
+ var oWin = window.open(url, "pfSensePop", "width=620,height=400,top=150,left=150");
+ if (oWin == null || typeof(oWin) == "undefined") {
+ alert("<?=gettext('Popup blocker detected. Action aborted.');?>");
+ }
+}
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="auth servers">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
+ $tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
+ $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+ $tab_array[] = array(gettext("Servers"), true, "system_authservers.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+
+ <?php if ($act == "new" || $act == "edit" || $input_errors): ?>
+
+ <form action="system_authservers.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
+ <td width="78%" class="vtable">
+ <?php if (!isset($id)): ?>
+ <input name="name" type="text" class="formfld unknown" id="name" size="20" value="<?=htmlspecialchars($pconfig['name']);?>"/>
+ <?php else: ?>
+ <strong><?=htmlspecialchars($pconfig['name']);?></strong>
+ <input name='name' type='hidden' id='name' value="<?=htmlspecialchars($pconfig['name']);?>"/>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Type");?></td>
+ <td width="78%" class="vtable">
+ <?php if (!isset($id)): ?>
+ <select name='type' id='type' class="formselect" onchange='server_typechange()'>
+ <?php
+ foreach ($auth_server_types as $typename => $typedesc):
+ $selected = "";
+ if ($pconfig['type'] == $typename) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$typename;?>" <?=$selected;?>><?=$typedesc;?></option>
+ <?php endforeach; ?>
+ </select>
+ <?php else: ?>
+ <strong><?=$auth_server_types[$pconfig['type']];?></strong>
+ <input name='type' type='hidden' id='type' value="<?=htmlspecialchars($pconfig['type']);?>"/>
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="ldap" style="display:none" summary="">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("LDAP Server Settings");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname or IP address");?></td>
+ <td width="78%" class="vtable">
+ <input name="ldap_host" type="text" class="formfld unknown" id="ldap_host" size="20" value="<?=htmlspecialchars($pconfig['ldap_host']);?>"/>
+ <br /><?= gettext("NOTE: When using SSL, this hostname MUST match the Common Name (CN) of the LDAP server's SSL Certificate."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Port value");?></td>
+ <td width="78%" class="vtable">
+ <input name="ldap_port" type="text" class="formfld unknown" id="ldap_port" size="5" value="<?=htmlspecialchars($pconfig['ldap_port']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Transport");?></td>
+ <td width="78%" class="vtable">
+ <select name='ldap_urltype' id='ldap_urltype' class="formselect" onchange='ldap_urlchange()'>
+ <?php
+ foreach ($ldap_urltypes as $urltype => $urlport):
+ $selected = "";
+ if ($pconfig['ldap_urltype'] == $urltype) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$urltype;?>" <?=$selected;?>><?=$urltype;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr id="tls_ca">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Peer Certificate Authority"); ?></td>
+ <td width="78%" class="vtable">
+ <?php if (count($a_ca)): ?>
+ <select id='ldap_caref' name='ldap_caref' class="formselect">
+ <?php
+ foreach ($a_ca as $ca):
+ $selected = "";
+ if ($pconfig['ldap_caref'] == $ca['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
+ <?php endforeach; ?>
+ </select>
+ <br /><span><?=gettext("This option is used if 'SSL Encrypted' option is chosen.");?> <br />
+ <?=gettext("It must match with the CA in the AD otherwise problems will arise.");?></span>
+ <?php else: ?>
+ <b>No Certificate Authorities defined.</b> <br />Create one under <a href="system_camanager.php">System &gt; Cert Manager</a>.
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol version");?></td>
+ <td width="78%" class="vtable">
+ <select name='ldap_protver' id='ldap_protver' class="formselect">
+ <?php
+ foreach ($ldap_protvers as $version):
+ $selected = "";
+ if ($pconfig['ldap_protver'] == $version) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$version;?>" <?=$selected;?>><?=$version;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Search scope");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="2" summary="search scope">
+ <tr>
+ <td><?=gettext("Level:");?> &nbsp;</td>
+ <td>
+ <select name='ldap_scope' id='ldap_scope' class="formselect">
+ <?php
+ foreach ($ldap_scopes as $scopename => $scopedesc):
+ $selected = "";
+ if ($pconfig['ldap_scope'] == $scopename) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$scopename;?>" <?=$selected;?>><?=$scopedesc;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Base DN:");?> &nbsp;</td>
+ <td>
+ <input name="ldap_basedn" type="text" class="formfld unknown" id="ldap_basedn" size="40" value="<?=htmlspecialchars($pconfig['ldap_basedn']);?>"/>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication containers");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="2" summary="auth containers">
+ <tr>
+ <td><?=gettext("Containers:");?> &nbsp;</td>
+ <td>
+ <input name="ldapauthcontainers" type="text" class="formfld unknown" id="ldapauthcontainers" size="40" value="<?=htmlspecialchars($pconfig['ldap_authcn']);?>"/>
+ <input type="button" onclick="select_clicked();" value="<?=gettext("Select");?>" />
+ <br /><?=gettext("Note: Semi-Colon separated. This will be prepended to the search base dn above or you can specify full container path containing a dc= component.");?>
+ <br /><?=gettext("Example:");?> CN=Users;DC=example,DC=com
+ <br /><?=gettext("Example:");?> OU=Staff;OU=Freelancers
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Extended Query");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="2" summary="query">
+ <tr>
+ <td>
+ <input name="ldap_extended_enabled" type="checkbox" id="ldap_extended_enabled" value="no" <?php if ($pconfig['ldap_extended_enabled']) echo "checked=\"checked\""; ?> />
+ </td>
+ <td>
+
+ <input name="ldap_extended_query" type="text" class="formfld unknown" id="ldap_extended_query" size="40" value="<?=htmlspecialchars($pconfig['ldap_extended_query']);?>"/>
+ <br /><?=gettext("Example:");?> &amp;(objectClass=inetOrgPerson)(mail=*@example.com)
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bind credentials");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="2" summary="bind credentials">
+ <tr>
+ <td>
+ <input name="ldap_anon" type="checkbox" id="ldap_anon" value="yes" <?php if ($pconfig['ldap_anon']) echo "checked=\"checked\""; ?> onclick="ldap_bindchange()" />
+ </td>
+ <td>
+ <?=gettext("Use anonymous binds to resolve distinguished names");?>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="0" cellpadding="2" id="ldap_bind" summary="bind">
+ <tr>
+ <td colspan="2"></td>
+ </tr>
+ <tr>
+ <td><?=gettext("User DN:");?> &nbsp;</td>
+ <td>
+ <input name="ldap_binddn" type="text" class="formfld unknown" id="ldap_binddn" size="40" value="<?=htmlspecialchars($pconfig['ldap_binddn']);?>"/><br />
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Password:");?> &nbsp;</td>
+ <td>
+ <input name="ldap_bindpw" type="password" class="formfld pwd" id="ldap_bindpw" size="20" value="<?=htmlspecialchars($pconfig['ldap_bindpw']);?>"/><br />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php if (!isset($id)): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Initial Template");?></td>
+ <td width="78%" class="vtable">
+ <select name='ldap_tmpltype' id='ldap_tmpltype' class="formselect" onchange='ldap_tmplchange()'>
+ <?php
+ foreach ($ldap_templates as $tmplname => $tmpldata):
+ $selected = "";
+ if ($pconfig['ldap_template'] == $tmplname) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$tmplname;?>" <?=$selected;?>><?=$tmpldata['desc'];?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("User naming attribute");?></td>
+ <td width="78%" class="vtable">
+ <input name="ldap_attr_user" type="text" class="formfld unknown" id="ldap_attr_user" size="20" value="<?=htmlspecialchars($pconfig['ldap_attr_user']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Group naming attribute");?></td>
+ <td width="78%" class="vtable">
+ <input name="ldap_attr_group" type="text" class="formfld unknown" id="ldap_attr_group" size="20" value="<?=htmlspecialchars($pconfig['ldap_attr_group']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Group member attribute");?></td>
+ <td width="78%" class="vtable">
+ <input name="ldap_attr_member" type="text" class="formfld unknown" id="ldap_attr_member" size="20" value="<?=htmlspecialchars($pconfig['ldap_attr_member']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("UTF8 Encode");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="2" summary="utf8 encoding">
+ <tr>
+ <td>
+ <input name="ldap_utf8" type="checkbox" id="ldap_utf8" value="yes" <?php if ($pconfig['ldap_utf8']) echo "checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <?=gettext("UTF8 encode LDAP parameters before sending them to the server. Required to support international characters, but may not be supported by every LDAP server.");?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Username Alterations");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="2" summary="username alterations">
+ <tr>
+ <td>
+ <input name="ldap_nostrip_at" type="checkbox" id="ldap_nostrip_at" value="yes" <?php if ($pconfig['ldap_nostrip_at']) echo "checked=\"checked\""; ?> />
+ </td>
+ <td>
+ <?=gettext("Do not strip away parts of the username after the @ symbol, e.g. user@host becomes user when unchecked.");?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="radius" style="display:none" summary="">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Radius Server Settings");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hostname or IP address");?></td>
+ <td width="78%" class="vtable">
+ <input name="radius_host" type="text" class="formfld unknown" id="radius_host" size="20" value="<?=htmlspecialchars($pconfig['radius_host']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Shared Secret");?></td>
+ <td width="78%" class="vtable">
+ <input name="radius_secret" type="password" class="formfld pwd" id="radius_secret" size="20" value="<?=htmlspecialchars($pconfig['radius_secret']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Services offered");?></td>
+ <td width="78%" class="vtable">
+ <select name='radius_srvcs' id='radius_srvcs' class="formselect" onchange='radius_srvcschange()'>
+ <?php
+ foreach ($radius_srvcs as $srvcname => $srvcdesc):
+ $selected = "";
+ if ($pconfig['radius_srvcs'] == $srvcname) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$srvcname;?>" <?=$selected;?>><?=$srvcdesc;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr id="radius_auth">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication port value");?></td>
+ <td width="78%" class="vtable">
+ <input name="radius_auth_port" type="text" class="formfld unknown" id="radius_auth_port" size="5" value="<?=htmlspecialchars($pconfig['radius_auth_port']);?>"/>
+ </td>
+ </tr>
+ <tr id="radius_acct">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Accounting port value");?></td>
+ <td width="78%" class="vtable">
+ <input name="radius_acct_port" type="text" class="formfld unknown" id="radius_acct_port" size="5" value="<?=htmlspecialchars($pconfig['radius_acct_port']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication Timeout");?></td>
+ <td width="78%" class="vtable">
+ <input name="radius_timeout" type="text" class="formfld unknown" id="radius_timeout" size="20" value="<?=htmlspecialchars($pconfig['radius_timeout']);?>"/>
+ <br /><?= gettext("This value controls how long, in seconds, that the RADIUS server may take to respond to an authentication request.") ?>
+ <br /><?= gettext("If left blank, the default value is 5 seconds.") ?>
+ <br /><br /><?= gettext("NOTE: If you are using an interactive two-factor authentication system, increase this timeout to account for how long it will take the user to receive and enter a token.") ?>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="">
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <?php if (isset($id) && $a_server[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif;?>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+ <?php else: ?>
+
+ <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
+ <thead>
+ <tr>
+ <th width="25%" class="listhdrr"><?=gettext("Server Name");?></th>
+ <th width="25%" class="listhdrr"><?=gettext("Type");?></th>
+ <th width="35%" class="listhdrr"><?=gettext("Host Name");?></th>
+ <th width="10%" class="list"></th>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <a href="system_authservers.php?act=new">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add server");?>" alt="<?=gettext("add server");?>" width="17" height="17" border="0" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <p>
+ <?=gettext("Additional authentication servers can be added here.");?>
+ </p>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+ <?php
+ $i = 0;
+ foreach ($a_server as $server):
+ $name = htmlspecialchars($server['name']);
+ $type = htmlspecialchars($auth_server_types[$server['type']]);
+ $host = htmlspecialchars($server['host']);
+ ?>
+ <tr <?php if ($i < (count($a_server) - 1)): ?> ondblclick="document.location='system_authservers.php?act=edit&amp;id=<?=$i;?>'" <?php endif; ?>>
+ <td class="listlr"><?=$name?>&nbsp;</td>
+ <td class="listr"><?=$type;?>&nbsp;</td>
+ <td class="listr"><?=$host;?>&nbsp;</td>
+ <td valign="middle" class="list nowrap">
+ <?php if ($i < (count($a_server) - 1)): ?>
+ <a href="system_authservers.php?act=edit&amp;id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit server");?>" alt="<?=gettext("edit server");?>" width="17" height="17" border="0" />
+ </a>
+ &nbsp;
+ <a href="system_authservers.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this Server?");?>')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete server");?>" alt="<?=gettext("delete server");?>" width="17" height="17" border="0" />
+ </a>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ </tbody>
+ </table>
+
+ <?php endif; ?>
+
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+server_typechange('<?=htmlspecialchars($pconfig['type']);?>');
+<?php if (!isset($id) || $pconfig['type'] == "ldap"): ?>
+ldap_bindchange();
+if (document.getElementById("ldap_port").value == "") {
+ ldap_urlchange();
+}
+<?php if (!isset($id)): ?>
+ldap_tmplchange();
+<?php endif; ?>
+<?php endif; ?>
+<?php if (!isset($id) || $pconfig['type'] == "radius"): ?>
+radius_srvcschange();
+<?php endif; ?>
+//]]>
+</script>
+</body>
+</html>
diff --git a/src/usr/local/www/system_camanager.php b/src/usr/local/www/system_camanager.php
new file mode 100644
index 0000000..368b30c
--- /dev/null
+++ b/src/usr/local/www/system_camanager.php
@@ -0,0 +1,770 @@
+<?php
+/*
+ system_camanager.php
+
+ Copyright (C) 2008 Shrew Soft Inc.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: certificate_manager
+*/
+
+##|+PRIV
+##|*IDENT=page-system-camanager
+##|*NAME=System: CA Manager
+##|*DESCR=Allow access to the 'System: CA Manager' page.
+##|*MATCH=system_camanager.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("certs.inc");
+
+$ca_methods = array(
+ "existing" => gettext("Import an existing Certificate Authority"),
+ "internal" => gettext("Create an internal Certificate Authority"),
+ "intermediate" => gettext("Create an intermediate Certificate Authority"));
+
+$ca_keylens = array("512", "1024", "2048", "4096");
+$openssl_digest_algs = array("sha1", "sha224", "sha256", "sha384", "sha512");
+
+$pgtitle = array(gettext("System"), gettext("Certificate Authority Manager"));
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+}
+
+$a_ca =& $config['ca'];
+
+if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+}
+
+$a_cert =& $config['cert'];
+
+if (!is_array($config['crl'])) {
+ $config['crl'] = array();
+}
+
+$a_crl =& $config['crl'];
+
+$act = $_GET['act'];
+if ($_POST['act']) {
+ $act = $_POST['act'];
+}
+
+if ($act == "del") {
+
+ if (!isset($a_ca[$id])) {
+ pfSenseHeader("system_camanager.php");
+ exit;
+ }
+
+ $index = count($a_cert) - 1;
+ for (;$index >= 0; $index--) {
+ if ($a_cert[$index]['caref'] == $a_ca[$id]['refid']) {
+ unset($a_cert[$index]);
+ }
+ }
+
+ $index = count($a_crl) - 1;
+ for (;$index >= 0; $index--) {
+ if ($a_crl[$index]['caref'] == $a_ca[$id]['refid']) {
+ unset($a_crl[$index]);
+ }
+ }
+
+ $name = $a_ca[$id]['descr'];
+ unset($a_ca[$id]);
+ write_config();
+ $savemsg = sprintf(gettext("Certificate Authority %s and its CRLs (if any) successfully deleted"), htmlspecialchars($name)) . "<br />";
+ pfSenseHeader("system_camanager.php");
+ exit;
+}
+
+if ($act == "edit") {
+ if (!$a_ca[$id]) {
+ pfSenseHeader("system_camanager.php");
+ exit;
+ }
+ $pconfig['descr'] = $a_ca[$id]['descr'];
+ $pconfig['refid'] = $a_ca[$id]['refid'];
+ $pconfig['cert'] = base64_decode($a_ca[$id]['crt']);
+ $pconfig['serial'] = $a_ca[$id]['serial'];
+ if (!empty($a_ca[$id]['prv'])) {
+ $pconfig['key'] = base64_decode($a_ca[$id]['prv']);
+ }
+}
+
+if ($act == "new") {
+ $pconfig['method'] = $_GET['method'];
+ $pconfig['keylen'] = "2048";
+ $pconfig['digest_alg'] = "sha256";
+ $pconfig['lifetime'] = "3650";
+ $pconfig['dn_commonname'] = "internal-ca";
+}
+
+if ($act == "exp") {
+
+ if (!$a_ca[$id]) {
+ pfSenseHeader("system_camanager.php");
+ exit;
+ }
+
+ $exp_name = urlencode("{$a_ca[$id]['descr']}.crt");
+ $exp_data = base64_decode($a_ca[$id]['crt']);
+ $exp_size = strlen($exp_data);
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$exp_name}");
+ header("Content-Length: $exp_size");
+ echo $exp_data;
+ exit;
+}
+
+if ($act == "expkey") {
+
+ if (!$a_ca[$id]) {
+ pfSenseHeader("system_camanager.php");
+ exit;
+ }
+
+ $exp_name = urlencode("{$a_ca[$id]['descr']}.key");
+ $exp_data = base64_decode($a_ca[$id]['prv']);
+ $exp_size = strlen($exp_data);
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$exp_name}");
+ header("Content-Length: $exp_size");
+ echo $exp_data;
+ exit;
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $input_errors = array();
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($pconfig['method'] == "existing") {
+ $reqdfields = explode(" ", "descr cert");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Certificate data"));
+ if ($_POST['cert'] && (!strstr($_POST['cert'], "BEGIN CERTIFICATE") || !strstr($_POST['cert'], "END CERTIFICATE"))) {
+ $input_errors[] = gettext("This certificate does not appear to be valid.");
+ }
+ if ($_POST['key'] && strstr($_POST['key'], "ENCRYPTED")) {
+ $input_errors[] = gettext("Encrypted private keys are not yet supported.");
+ }
+ }
+ if ($pconfig['method'] == "internal") {
+ $reqdfields = explode(" ",
+ "descr keylen lifetime dn_country dn_state dn_city ".
+ "dn_organization dn_email dn_commonname");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Key length"),
+ gettext("Lifetime"),
+ gettext("Distinguished name Country Code"),
+ gettext("Distinguished name State or Province"),
+ gettext("Distinguished name City"),
+ gettext("Distinguished name Organization"),
+ gettext("Distinguished name Email Address"),
+ gettext("Distinguished name Common Name"));
+ }
+ if ($pconfig['method'] == "intermediate") {
+ $reqdfields = explode(" ",
+ "descr caref keylen lifetime dn_country dn_state dn_city ".
+ "dn_organization dn_email dn_commonname");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Signing Certificate Authority"),
+ gettext("Key length"),
+ gettext("Lifetime"),
+ gettext("Distinguished name Country Code"),
+ gettext("Distinguished name State or Province"),
+ gettext("Distinguished name City"),
+ gettext("Distinguished name Organization"),
+ gettext("Distinguished name Email Address"),
+ gettext("Distinguished name Common Name"));
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ if ($pconfig['method'] != "existing") {
+ /* Make sure we do not have invalid characters in the fields for the certificate */
+ if (preg_match("/[\?\>\<\&\/\\\"\']/", $_POST['descr'])) {
+ array_push($input_errors, "The field 'Descriptive Name' contains invalid characters.");
+ }
+
+ for ($i = 0; $i < count($reqdfields); $i++) {
+ if ($reqdfields[$i] == 'dn_email') {
+ if (preg_match("/[\!\#\$\%\^\(\)\~\?\>\<\&\/\\\,\"\']/", $_POST["dn_email"])) {
+ array_push($input_errors, "The field 'Distinguished name Email Address' contains invalid characters.");
+ }
+ } else if ($reqdfields[$i] == 'dn_commonname') {
+ if (preg_match("/[\!\@\#\$\%\^\(\)\~\?\>\<\&\/\\\,\"\']/", $_POST["dn_commonname"])) {
+ array_push($input_errors, "The field 'Distinguished name Common Name' contains invalid characters.");
+ }
+ } else if (($reqdfields[$i] != "descr") && preg_match("/[\!\@\#\$\%\^\(\)\~\?\>\<\&\/\\\,\.\"\']/", $_POST["$reqdfields[$i]"])) {
+ array_push($input_errors, "The field '" . $reqdfieldsn[$i] . "' contains invalid characters.");
+ }
+ }
+ if (!in_array($_POST["keylen"], $ca_keylens)) {
+ array_push($input_errors, gettext("Please select a valid Key Length."));
+ }
+ if (!in_array($_POST["digest_alg"], $openssl_digest_algs)) {
+ array_push($input_errors, gettext("Please select a valid Digest Algorithm."));
+ }
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ /* save modifications */
+ if (!$input_errors) {
+
+ $ca = array();
+ if (!isset($pconfig['refid']) || empty($pconfig['refid'])) {
+ $ca['refid'] = uniqid();
+ } else {
+ $ca['refid'] = $pconfig['refid'];
+ }
+
+ if (isset($id) && $a_ca[$id]) {
+ $ca = $a_ca[$id];
+ }
+
+ $ca['descr'] = $pconfig['descr'];
+
+ if ($_POST['edit'] == "edit") {
+ $ca['descr'] = $pconfig['descr'];
+ $ca['refid'] = $pconfig['refid'];
+ $ca['serial'] = $pconfig['serial'];
+ $ca['crt'] = base64_encode($pconfig['cert']);
+ if (!empty($pconfig['key'])) {
+ $ca['prv'] = base64_encode($pconfig['key']);
+ }
+ } else {
+ $old_err_level = error_reporting(0); /* otherwise openssl_ functions throw warnings directly to a page screwing menu tab */
+ if ($pconfig['method'] == "existing") {
+ ca_import($ca, $pconfig['cert'], $pconfig['key'], $pconfig['serial']);
+ } else if ($pconfig['method'] == "internal") {
+ $dn = array(
+ 'countryName' => $pconfig['dn_country'],
+ 'stateOrProvinceName' => $pconfig['dn_state'],
+ 'localityName' => $pconfig['dn_city'],
+ 'organizationName' => $pconfig['dn_organization'],
+ 'emailAddress' => $pconfig['dn_email'],
+ 'commonName' => $pconfig['dn_commonname']);
+ if (!ca_create($ca, $pconfig['keylen'], $pconfig['lifetime'], $dn, $pconfig['digest_alg'])) {
+ while ($ssl_err = openssl_error_string()) {
+ $input_errors = array();
+ array_push($input_errors, "openssl library returns: " . $ssl_err);
+ }
+ }
+ }
+ else if ($pconfig['method'] == "intermediate") {
+ $dn = array(
+ 'countryName' => $pconfig['dn_country'],
+ 'stateOrProvinceName' => $pconfig['dn_state'],
+ 'localityName' => $pconfig['dn_city'],
+ 'organizationName' => $pconfig['dn_organization'],
+ 'emailAddress' => $pconfig['dn_email'],
+ 'commonName' => $pconfig['dn_commonname']);
+ if (!ca_inter_create($ca, $pconfig['keylen'], $pconfig['lifetime'], $dn, $pconfig['caref'], $pconfig['digest_alg'])) {
+ while ($ssl_err = openssl_error_string()) {
+ $input_errors = array();
+ array_push($input_errors, "openssl library returns: " . $ssl_err);
+ }
+ }
+ }
+ error_reporting($old_err_level);
+ }
+
+ if (isset($id) && $a_ca[$id]) {
+ $a_ca[$id] = $ca;
+ } else {
+ $a_ca[] = $ca;
+ }
+
+ if (!$input_errors) {
+ write_config();
+ }
+
+// pfSenseHeader("system_camanager.php");
+ }
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function method_change() {
+
+ method = document.iform.method.selectedIndex;
+
+ switch (method) {
+ case 0:
+ document.getElementById("existing").style.display="";
+ document.getElementById("internal").style.display="none";
+ document.getElementById("intermediate").style.display="none";
+ break;
+ case 1:
+ document.getElementById("existing").style.display="none";
+ document.getElementById("internal").style.display="";
+ document.getElementById("intermediate").style.display="none";
+ break;
+ case 2:
+ document.getElementById("existing").style.display="none";
+ document.getElementById("internal").style.display="";
+ document.getElementById("intermediate").style.display="";
+ break;
+ }
+}
+
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+
+ // Load valid country codes
+ $dn_cc = array();
+ if (file_exists("/etc/ca_countries")) {
+ $dn_cc_file=file("/etc/ca_countries");
+ foreach ($dn_cc_file as $line) {
+ if (preg_match('/^(\S*)\s(.*)$/', $line, $matches)) {
+ array_push($dn_cc, $matches[1]);
+ }
+ }
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="CA manager">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("CAs"), true, "system_camanager.php");
+ $tab_array[] = array(gettext("Certificates"), false, "system_certmanager.php");
+ $tab_array[] = array(gettext("Certificate Revocation"), false, "system_crlmanager.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+
+ <?php if ($act == "new" || $act == "edit" || $act == gettext("Save") || $input_errors): ?>
+
+ <form action="system_camanager.php" method="post" name="iform" id="iform">
+ <?php if ($act == "edit"): ?>
+ <input type="hidden" name="edit" value="edit" id="edit" />
+ <input type="hidden" name="id" value="<?php echo htmlspecialchars($id); ?>" id="id" />
+ <input type="hidden" name="refid" value="<?php echo $pconfig['refid']; ?>" id="refid" />
+ <?php endif; ?>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>"/>
+ </td>
+ </tr>
+ <?php if (!isset($id) || $act == "edit"): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Method");?></td>
+ <td width="78%" class="vtable">
+ <select name='method' id='method' class="formselect" onchange='method_change()'>
+ <?php
+ foreach ($ca_methods as $method => $desc):
+ $selected = "";
+ if ($pconfig['method'] == $method) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$method;?>"<?=$selected;?>><?=$desc;?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ </td>
+ </tr>
+ <?php endif; ?>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="existing" summary="existing">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Existing Certificate Authority");?></td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate data");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="cert" id="cert" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['cert']);?></textarea>
+ <br />
+ <?=gettext("Paste a certificate in X.509 PEM format here.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate Private Key");?><br /><?=gettext("(optional)");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="key" id="key" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['key']);?></textarea>
+ <br />
+ <?=gettext("Paste the private key for the above certificate here. This is optional in most cases, but required if you need to generate a Certificate Revocation List (CRL).");?>
+ </td>
+ </tr>
+
+ <?php if (!isset($id) || $act == "edit"): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Serial for next certificate");?></td>
+ <td width="78%" class="vtable">
+ <input name="serial" type="text" class="formfld unknown" id="serial" size="20" value="<?=htmlspecialchars($pconfig['serial']);?>"/>
+ <br /><?=gettext("Enter a decimal number to be used as the serial number for the next certificate to be created using this CA.");?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="internal" summary="internal">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Internal Certificate Authority");?></td>
+ </tr>
+ <tr id='intermediate'>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Signing Certificate Authority");?></td>
+ <td width="78%" class="vtable">
+ <select name='caref' id='caref' class="formselect" onchange='internalca_change()'>
+ <?php
+ foreach ($a_ca as $ca):
+ if (!$ca['prv']) {
+ continue;
+ }
+ $selected = "";
+ if ($pconfig['caref'] == $ca['refid']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$ca['refid'];?>"<?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Key length");?></td>
+ <td width="78%" class="vtable">
+ <select name='keylen' id='keylen' class="formselect">
+ <?php
+ foreach ($ca_keylens as $len):
+ $selected = "";
+ if ($pconfig['keylen'] == $len) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$len;?>"<?=$selected;?>><?=$len;?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <?=gettext("bits");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Digest Algorithm");?></td>
+ <td width="78%" class="vtable">
+ <select name='digest_alg' id='digest_alg' class="formselect">
+ <?php
+ foreach ($openssl_digest_algs as $digest_alg):
+ $selected = "";
+ if ($pconfig['digest_alg'] == $digest_alg) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$digest_alg;?>"<?=$selected;?>><?=strtoupper($digest_alg);?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <br /><?= gettext("NOTE: It is recommended to use an algorithm stronger than SHA1 when possible.") ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
+ <td width="78%" class="vtable">
+ <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>"/>
+ <?=gettext("days");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Distinguished name");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="2" summary="name">
+ <tr>
+ <td align="right"><?=gettext("Country Code");?> : &nbsp;</td>
+ <td align="left">
+ <select name='dn_country' class="formselect">
+ <?php
+ foreach ($dn_cc as $cc) {
+ $selected = "";
+ if ($pconfig['dn_country'] == $cc) {
+ $selected = " selected=\"selected\"";
+ }
+ print "<option value=\"$cc\"$selected>$cc</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("State or Province");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_state" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_state']);?>"/>
+ &nbsp;
+ <em><?=gettext("ex:");?></em>
+ &nbsp;
+ <?=gettext("Texas");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("City");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_city" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_city']);?>"/>
+ &nbsp;
+ <em><?=gettext("ex:");?></em>
+ &nbsp;
+ <?=gettext("Austin");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Organization");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_organization" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_organization']);?>"/>
+ &nbsp;
+ <em><?=gettext("ex:");?></em>
+ &nbsp;
+ <?=gettext("My Company Inc.");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Email Address");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_email" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['dn_email']);?>"/>
+ &nbsp;
+ <em><?=gettext("ex:");?></em>
+ &nbsp;
+ <?=gettext("admin@mycompany.com");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Common Name");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_commonname" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['dn_commonname']);?>"/>
+ &nbsp;
+ <em><?=gettext("ex:");?></em>
+ &nbsp;
+ <?=gettext("internal-ca");?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="save">
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <?php if (isset($id) && $a_ca[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif;?>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+ <?php else: ?>
+
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Internal");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Issuer");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Certificates");?></td>
+ <td width="40%" class="listhdrr"><?=gettext("Distinguished Name");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+ <?php
+ $i = 0;
+ foreach ($a_ca as $ca):
+ $name = htmlspecialchars($ca['descr']);
+ $subj = cert_get_subject($ca['crt']);
+ $issuer = cert_get_issuer($ca['crt']);
+ list($startdate, $enddate) = cert_get_dates($ca['crt']);
+ if ($subj == $issuer) {
+ $issuer_name = "<em>" . gettext("self-signed") . "</em>";
+ } else {
+ $issuer_name = "<em>" . gettext("external") . "</em>";
+ }
+ $subj = htmlspecialchars($subj);
+ $issuer = htmlspecialchars($issuer);
+ $certcount = 0;
+
+ $issuer_ca = lookup_ca($ca['caref']);
+ if ($issuer_ca) {
+ $issuer_name = htmlspecialchars($issuer_ca['descr']);
+ }
+
+ // TODO : Need gray certificate icon
+
+ if ($ca['prv']) {
+ $caimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
+ $internal = "YES";
+
+ } else {
+ $caimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
+ $internal = "NO";
+ }
+ foreach ($a_cert as $cert) {
+ if ($cert['caref'] == $ca['refid']) {
+ $certcount++;
+ }
+ }
+ foreach ($a_ca as $cert) {
+ if ($cert['caref'] == $ca['refid']) {
+ $certcount++;
+ }
+ }
+ ?>
+ <tr>
+ <td class="listlr">
+ <table border="0" cellpadding="0" cellspacing="0" summary="icon">
+ <tr>
+ <td align="left" valign="middle">
+ <img src="<?=$caimg;?>" alt="CA" title="CA" border="0" height="16" width="16" />
+ </td>
+ <td align="left" valign="middle">
+ <?=$name;?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td class="listr"><?=$internal;?>&nbsp;</td>
+ <td class="listr"><?=$issuer_name;?>&nbsp;</td>
+ <td class="listr"><?=$certcount;?>&nbsp;</td>
+ <td class="listr"><?=$subj;?><br />
+ <table width="100%" style="font-size: 9px" summary="valid">
+ <tr>
+ <td width="10%">&nbsp;</td>
+ <td width="20%"><?=gettext("Valid From")?>:</td>
+ <td width="70%"><?= $startdate ?></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td><?=gettext("Valid Until")?>:</td>
+ <td><?= $enddate ?></td>
+ </tr>
+ </table>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="system_camanager.php?act=edit&amp;id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit CA");?>" alt="<?=gettext("edit CA");?>" width="17" height="17" border="0" />
+ </a>
+ <a href="system_camanager.php?act=exp&amp;id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export CA cert");?>" alt="<?=gettext("export CA cert");?>" width="17" height="17" border="0" />
+ </a>
+ <?php if ($ca['prv']): ?>
+ <a href="system_camanager.php?act=expkey&amp;id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export CA private key");?>" alt="<?=gettext("export CA private key");?>" width="17" height="17" border="0" />
+ </a>
+ <?php endif; ?>
+ <a href="system_camanager.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate Authority and its CRLs, and unreference any associated certificates?");?>')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete ca");?>" alt="<?=gettext("delete ca"); ?>" width="17" height="17" border="0" />
+ </a>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr>
+ <td class="list" colspan="5"></td>
+ <td class="list">
+ <a href="system_camanager.php?act=new">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add or import ca");?>" alt="<?=gettext("add ca");?>" width="17" height="17" border="0" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="5">
+ <p>
+ <?=gettext("Additional trusted Certificate Authorities can be added here.");?>
+ </p>
+ </td>
+ </tr>
+ </table>
+
+ <?php endif; ?>
+
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc");?>
+<script type="text/javascript">
+//<![CDATA[
+
+method_change();
+
+//]]>
+</script>
+
+</body>
+</html>
diff --git a/src/usr/local/www/system_certmanager.php b/src/usr/local/www/system_certmanager.php
new file mode 100644
index 0000000..cd553e6
--- /dev/null
+++ b/src/usr/local/www/system_certmanager.php
@@ -0,0 +1,1349 @@
+<?php
+/*
+ system_certmanager.php
+
+ Copyright (C) 2008 Shrew Soft Inc.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: certificate_manager
+*/
+
+##|+PRIV
+##|*IDENT=page-system-certmanager
+##|*NAME=System: Certificate Manager
+##|*DESCR=Allow access to the 'System: Certificate Manager' page.
+##|*MATCH=system_certmanager.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("certs.inc");
+
+$cert_methods = array(
+ "import" => gettext("Import an existing Certificate"),
+ "internal" => gettext("Create an internal Certificate"),
+ "external" => gettext("Create a Certificate Signing Request"),
+);
+
+$cert_keylens = array("512", "1024", "2048", "4096");
+$cert_types = array(
+ "ca" => "Certificate Authority",
+ "server" => "Server Certificate",
+ "user" => "User Certificate");
+
+$altname_types = array("DNS", "IP", "email", "URI");
+$openssl_digest_algs = array("sha1", "sha224", "sha256", "sha384", "sha512");
+
+$pgtitle = array(gettext("System"), gettext("Certificate Manager"));
+
+if (is_numericint($_GET['userid'])) {
+ $userid = $_GET['userid'];
+}
+if (isset($_POST['userid']) && is_numericint($_POST['userid'])) {
+ $userid = $_POST['userid'];
+}
+
+if (isset($userid)) {
+ $cert_methods["existing"] = gettext("Choose an existing certificate");
+ if (!is_array($config['system']['user'])) {
+ $config['system']['user'] = array();
+ }
+ $a_user =& $config['system']['user'];
+}
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+}
+
+$a_ca =& $config['ca'];
+
+if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+}
+
+$a_cert =& $config['cert'];
+
+$internal_ca_count = 0;
+foreach ($a_ca as $ca) {
+ if ($ca['prv']) {
+ $internal_ca_count++;
+ }
+}
+
+$act = $_GET['act'];
+if ($_POST['act']) {
+ $act = $_POST['act'];
+}
+
+if ($act == "del") {
+
+ if (!isset($a_cert[$id])) {
+ pfSenseHeader("system_certmanager.php");
+ exit;
+ }
+
+ unset($a_cert[$id]);
+ write_config();
+ $savemsg = sprintf(gettext("Certificate %s successfully deleted"), htmlspecialchars($a_cert[$id]['descr'])) . "<br />";
+ pfSenseHeader("system_certmanager.php");
+ exit;
+}
+
+if ($act == "new") {
+ $pconfig['method'] = $_GET['method'];
+ $pconfig['keylen'] = "2048";
+ $pconfig['digest_alg'] = "sha256";
+ $pconfig['csr_keylen'] = "2048";
+ $pconfig['csr_digest_alg'] = "sha256";
+ $pconfig['type'] = "user";
+ $pconfig['lifetime'] = "3650";
+}
+
+if ($act == "exp") {
+
+ if (!$a_cert[$id]) {
+ pfSenseHeader("system_certmanager.php");
+ exit;
+ }
+
+ $exp_name = urlencode("{$a_cert[$id]['descr']}.crt");
+ $exp_data = base64_decode($a_cert[$id]['crt']);
+ $exp_size = strlen($exp_data);
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$exp_name}");
+ header("Content-Length: $exp_size");
+ echo $exp_data;
+ exit;
+}
+
+if ($act == "key") {
+
+ if (!$a_cert[$id]) {
+ pfSenseHeader("system_certmanager.php");
+ exit;
+ }
+
+ $exp_name = urlencode("{$a_cert[$id]['descr']}.key");
+ $exp_data = base64_decode($a_cert[$id]['prv']);
+ $exp_size = strlen($exp_data);
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$exp_name}");
+ header("Content-Length: $exp_size");
+ echo $exp_data;
+ exit;
+}
+
+if ($act == "p12") {
+ if (!$a_cert[$id]) {
+ pfSenseHeader("system_certmanager.php");
+ exit;
+ }
+
+ $exp_name = urlencode("{$a_cert[$id]['descr']}.p12");
+ $args = array();
+ $args['friendly_name'] = $a_cert[$id]['descr'];
+
+ $ca = lookup_ca($a_cert[$id]['caref']);
+ if ($ca) {
+ $args['extracerts'] = openssl_x509_read(base64_decode($ca['crt']));
+ }
+
+ $res_crt = openssl_x509_read(base64_decode($a_cert[$id]['crt']));
+ $res_key = openssl_pkey_get_private(array(0 => base64_decode($a_cert[$id]['prv']) , 1 => ""));
+
+ $exp_data = "";
+ openssl_pkcs12_export($res_crt, $exp_data, $res_key, null, $args);
+ $exp_size = strlen($exp_data);
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$exp_name}");
+ header("Content-Length: $exp_size");
+ echo $exp_data;
+ exit;
+}
+
+if ($act == "csr") {
+
+ if (!$a_cert[$id]) {
+ pfSenseHeader("system_certmanager.php");
+ exit;
+ }
+
+ $pconfig['descr'] = $a_cert[$id]['descr'];
+ $pconfig['csr'] = base64_decode($a_cert[$id]['csr']);
+}
+
+if ($_POST) {
+ if ($_POST['save'] == gettext("Save")) {
+ $input_errors = array();
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($pconfig['method'] == "import") {
+ $reqdfields = explode(" ",
+ "descr cert key");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Certificate data"),
+ gettext("Key data"));
+ if ($_POST['cert'] && (!strstr($_POST['cert'], "BEGIN CERTIFICATE") || !strstr($_POST['cert'], "END CERTIFICATE"))) {
+ $input_errors[] = gettext("This certificate does not appear to be valid.");
+ }
+ }
+
+ if ($pconfig['method'] == "internal") {
+ $reqdfields = explode(" ",
+ "descr caref keylen type lifetime dn_country dn_state dn_city ".
+ "dn_organization dn_email dn_commonname");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Certificate authority"),
+ gettext("Key length"),
+ gettext("Certificate Type"),
+ gettext("Lifetime"),
+ gettext("Distinguished name Country Code"),
+ gettext("Distinguished name State or Province"),
+ gettext("Distinguished name City"),
+ gettext("Distinguished name Organization"),
+ gettext("Distinguished name Email Address"),
+ gettext("Distinguished name Common Name"));
+ }
+
+ if ($pconfig['method'] == "external") {
+ $reqdfields = explode(" ",
+ "descr csr_keylen csr_dn_country csr_dn_state csr_dn_city ".
+ "csr_dn_organization csr_dn_email csr_dn_commonname");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Key length"),
+ gettext("Distinguished name Country Code"),
+ gettext("Distinguished name State or Province"),
+ gettext("Distinguished name City"),
+ gettext("Distinguished name Organization"),
+ gettext("Distinguished name Email Address"),
+ gettext("Distinguished name Common Name"));
+ }
+
+ if ($pconfig['method'] == "existing") {
+ $reqdfields = array("certref");
+ $reqdfieldsn = array(gettext("Existing Certificate Choice"));
+ }
+
+ $altnames = array();
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+ if ($pconfig['method'] != "import" && $pconfig['method'] != "existing") {
+ /* subjectAltNames */
+ foreach ($_POST as $key => $value) {
+ $entry = '';
+ if (!substr_compare('altname_type', $key, 0, 12)) {
+ $entry = substr($key, 12);
+ $field = 'type';
+ }
+ elseif (!substr_compare('altname_value', $key, 0, 13)) {
+ $entry = substr($key, 13);
+ $field = 'value';
+ }
+ if (ctype_digit($entry)) {
+ $altnames[$entry][$field] = $value;
+ }
+ }
+ $pconfig['altnames']['item'] = $altnames;
+
+ /* Input validation for subjectAltNames */
+ foreach ($altnames as $idx => $altname) {
+ switch ($altname['type']) {
+ case "DNS":
+ if (!is_hostname($altname['value'])) {
+ array_push($input_errors, "DNS subjectAltName values must be valid hostnames or FQDNs");
+ }
+ break;
+ case "IP":
+ if (!is_ipaddr($altname['value'])) {
+ array_push($input_errors, "IP subjectAltName values must be valid IP Addresses");
+ }
+ break;
+ case "email":
+ if (empty($altname['value'])) {
+ array_push($input_errors, "You must provide an e-mail address for this type of subjectAltName");
+ }
+ if (preg_match("/[\!\#\$\%\^\(\)\~\?\>\<\&\/\\\,\"\']/", $altname['value'])) {
+ array_push($input_errors, "The e-mail provided in a subjectAltName contains invalid characters.");
+ }
+ break;
+ case "URI":
+ /* Close enough? */
+ if (!is_URL($altname['value'])) {
+ $input_errors[] = "URI subjectAltName types must be a valid URI";
+ }
+ break;
+ default:
+ $input_errors[] = "Unrecognized subjectAltName type.";
+ }
+ }
+
+ /* Make sure we do not have invalid characters in the fields for the certificate */
+
+ if (preg_match("/[\?\>\<\&\/\\\"\']/", $_POST['descr'])) {
+ array_push($input_errors, "The field 'Descriptive Name' contains invalid characters.");
+ }
+
+ for ($i = 0; $i < count($reqdfields); $i++) {
+ if (preg_match('/email/', $reqdfields[$i])) { /* dn_email or csr_dn_name */
+ if (preg_match("/[\!\#\$\%\^\(\)\~\?\>\<\&\/\\\,\"\']/", $_POST[$reqdfields[$i]])) {
+ array_push($input_errors, "The field 'Distinguished name Email Address' contains invalid characters.");
+ }
+ } else if (preg_match('/commonname/', $reqdfields[$i])) { /* dn_commonname or csr_dn_commonname */
+ if (preg_match("/[\!\@\#\$\%\^\(\)\~\?\>\<\&\/\\\,\"\']/", $_POST[$reqdfields[$i]])) {
+ array_push($input_errors, "The field 'Distinguished name Common Name' contains invalid characters.");
+ }
+ } else if (($reqdfields[$i] != "descr") && preg_match("/[\!\@\#\$\%\^\(\)\~\?\>\<\&\/\\\,\.\"\']/", $_POST[$reqdfields[$i]])) {
+ array_push($input_errors, "The field '" . $reqdfieldsn[$i] . "' contains invalid characters.");
+ }
+ }
+
+ if (($pconfig['method'] != "external") && isset($_POST["keylen"]) && !in_array($_POST["keylen"], $cert_keylens)) {
+ array_push($input_errors, gettext("Please select a valid Key Length."));
+ }
+ if (($pconfig['method'] != "external") && !in_array($_POST["digest_alg"], $openssl_digest_algs)) {
+ array_push($input_errors, gettext("Please select a valid Digest Algorithm."));
+ }
+
+ if (($pconfig['method'] == "external") && isset($_POST["csr_keylen"]) && !in_array($_POST["csr_keylen"], $cert_keylens)) {
+ array_push($input_errors, gettext("Please select a valid Key Length."));
+ }
+ if (($pconfig['method'] == "external") && !in_array($_POST["csr_digest_alg"], $openssl_digest_algs)) {
+ array_push($input_errors, gettext("Please select a valid Digest Algorithm."));
+ }
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ /* save modifications */
+ if (!$input_errors) {
+
+ if ($pconfig['method'] == "existing") {
+ $cert = lookup_cert($pconfig['certref']);
+ if ($cert && $a_user) {
+ $a_user[$userid]['cert'][] = $cert['refid'];
+ }
+ } else {
+ $cert = array();
+ $cert['refid'] = uniqid();
+ if (isset($id) && $a_cert[$id]) {
+ $cert = $a_cert[$id];
+ }
+
+ $cert['descr'] = $pconfig['descr'];
+
+ $old_err_level = error_reporting(0); /* otherwise openssl_ functions throw warnings directly to a page screwing menu tab */
+
+ if ($pconfig['method'] == "import") {
+ cert_import($cert, $pconfig['cert'], $pconfig['key']);
+ }
+
+ if ($pconfig['method'] == "internal") {
+ $dn = array(
+ 'countryName' => $pconfig['dn_country'],
+ 'stateOrProvinceName' => $pconfig['dn_state'],
+ 'localityName' => $pconfig['dn_city'],
+ 'organizationName' => $pconfig['dn_organization'],
+ 'emailAddress' => $pconfig['dn_email'],
+ 'commonName' => $pconfig['dn_commonname']);
+ if (count($altnames)) {
+ $altnames_tmp = "";
+ foreach ($altnames as $altname) {
+ $altnames_tmp[] = "{$altname['type']}:{$altname['value']}";
+ }
+ $dn['subjectAltName'] = implode(",", $altnames_tmp);
+ }
+ if (!cert_create($cert, $pconfig['caref'], $pconfig['keylen'],
+ $pconfig['lifetime'], $dn, $pconfig['type'], $pconfig['digest_alg'])) {
+ while ($ssl_err = openssl_error_string()) {
+ $input_errors = array();
+ array_push($input_errors, "openssl library returns: " . $ssl_err);
+ }
+ }
+ }
+
+ if ($pconfig['method'] == "external") {
+ $dn = array(
+ 'countryName' => $pconfig['csr_dn_country'],
+ 'stateOrProvinceName' => $pconfig['csr_dn_state'],
+ 'localityName' => $pconfig['csr_dn_city'],
+ 'organizationName' => $pconfig['csr_dn_organization'],
+ 'emailAddress' => $pconfig['csr_dn_email'],
+ 'commonName' => $pconfig['csr_dn_commonname']);
+ if (count($altnames)) {
+ $altnames_tmp = "";
+ foreach ($altnames as $altname) {
+ $altnames_tmp[] = "{$altname['type']}:{$altname['value']}";
+ }
+ $dn['subjectAltName'] = implode(",", $altnames_tmp);
+ }
+ if (!csr_generate($cert, $pconfig['csr_keylen'], $dn, $pconfig['csr_digest_alg'])) {
+ while ($ssl_err = openssl_error_string()) {
+ $input_errors = array();
+ array_push($input_errors, "openssl library returns: " . $ssl_err);
+ }
+ }
+ }
+ error_reporting($old_err_level);
+
+ if (isset($id) && $a_cert[$id]) {
+ $a_cert[$id] = $cert;
+ } else {
+ $a_cert[] = $cert;
+ }
+ if (isset($a_user) && isset($userid)) {
+ $a_user[$userid]['cert'][] = $cert['refid'];
+ }
+ }
+
+ if (!$input_errors) {
+ write_config();
+ }
+
+ if ($userid) {
+ post_redirect("system_usermanager.php", array('act' => 'edit', 'userid' => $userid));
+ exit;
+ }
+ }
+ }
+
+ if ($_POST['save'] == gettext("Update")) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "descr cert");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Final Certificate data"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (preg_match("/[\?\>\<\&\/\\\"\']/", $_POST['descr'])) {
+ array_push($input_errors, "The field 'Descriptive Name' contains invalid characters.");
+ }
+
+// old way
+ /* make sure this csr and certificate subjects match */
+// $subj_csr = csr_get_subject($pconfig['csr'], false);
+// $subj_cert = cert_get_subject($pconfig['cert'], false);
+//
+// if (!isset($_POST['ignoresubjectmismatch']) && !($_POST['ignoresubjectmismatch'] == "yes")) {
+// if (strcmp($subj_csr, $subj_cert)) {
+// $input_errors[] = sprintf(gettext("The certificate subject '%s' does not match the signing request subject."), $subj_cert);
+// $subject_mismatch = true;
+// }
+// }
+ $mod_csr = csr_get_modulus($pconfig['csr'], false);
+ $mod_cert = cert_get_modulus($pconfig['cert'], false);
+
+ if (strcmp($mod_csr, $mod_cert)) {
+ // simply: if the moduli don't match, then the private key and public key won't match
+ $input_errors[] = sprintf(gettext("The certificate modulus does not match the signing request modulus."), $subj_cert);
+ $subject_mismatch = true;
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ /* save modifications */
+ if (!$input_errors) {
+
+ $cert = $a_cert[$id];
+
+ $cert['descr'] = $pconfig['descr'];
+
+ csr_complete($cert, $pconfig['cert']);
+
+ $a_cert[$id] = $cert;
+
+ write_config();
+
+ pfSenseHeader("system_certmanager.php");
+ }
+ }
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function method_change() {
+
+<?php
+ if ($internal_ca_count) {
+ $submit_style = "";
+ } else {
+ $submit_style = "none";
+ }
+?>
+
+ method = document.iform.method.selectedIndex;
+
+ switch (method) {
+ case 0:
+ document.getElementById("import").style.display="";
+ document.getElementById("internal").style.display="none";
+ document.getElementById("external").style.display="none";
+ document.getElementById("existing").style.display="none";
+ document.getElementById("descriptivename").style.display="";
+ document.getElementById("submit").style.display="";
+ break;
+ case 1:
+ document.getElementById("import").style.display="none";
+ document.getElementById("internal").style.display="";
+ document.getElementById("external").style.display="none";
+ document.getElementById("existing").style.display="none";
+ document.getElementById("descriptivename").style.display="";
+ document.getElementById("submit").style.display="<?=$submit_style;?>";
+ break;
+ case 2:
+ document.getElementById("import").style.display="none";
+ document.getElementById("internal").style.display="none";
+ document.getElementById("external").style.display="";
+ document.getElementById("existing").style.display="none";
+ document.getElementById("descriptivename").style.display="";
+ document.getElementById("submit").style.display="";
+ break;
+ case 3:
+ document.getElementById("import").style.display="none";
+ document.getElementById("internal").style.display="none";
+ document.getElementById("external").style.display="none";
+ document.getElementById("existing").style.display="";
+ document.getElementById("descriptivename").style.display="none";
+ document.getElementById("submit").style.display="";
+ break;
+ }
+}
+
+<?php if ($internal_ca_count): ?>
+function internalca_change() {
+
+ index = document.iform.caref.selectedIndex;
+ caref = document.iform.caref[index].value;
+
+ switch (caref) {
+<?php
+ foreach ($a_ca as $ca):
+ if (!$ca['prv']) {
+ continue;
+ }
+ $subject = cert_get_subject_array($ca['crt']);
+?>
+ case "<?=$ca['refid'];?>":
+ document.iform.dn_country.value = "<?=$subject[0]['v'];?>";
+ document.iform.dn_state.value = "<?=$subject[1]['v'];?>";
+ document.iform.dn_city.value = "<?=$subject[2]['v'];?>";
+ document.iform.dn_organization.value = "<?=$subject[3]['v'];?>";
+ document.iform.dn_email.value = "<?=$subject[4]['v'];?>";
+ break;
+<?php
+ endforeach;
+?>
+ }
+}
+<?php endif; ?>
+
+//]]>
+</script>
+<script type="text/javascript" src="/javascript/row_helper_dynamic.js"></script>
+<input type='hidden' name='altname_value_type' value='select' />
+<input type='hidden' name='altname_type_type' value='textbox' />
+<script type="text/javascript">
+//<![CDATA[
+ rowname[0] = "altname_type";
+ rowtype[0] = "textbox";
+ rowsize[0] = "10";
+ rowname[1] = "altname_value";
+ rowtype[1] = "textbox";
+ rowsize[1] = "30";
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+
+ // Load valid country codes
+ $dn_cc = array();
+ if (file_exists("/etc/ca_countries")) {
+ $dn_cc_file=file("/etc/ca_countries");
+ foreach ($dn_cc_file as $line) {
+ if (preg_match('/^(\S*)\s(.*)$/', $line, $matches)) {
+ array_push($dn_cc, $matches[1]);
+ }
+ }
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="cert manager">
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("CAs"), false, "system_camanager.php");
+ $tab_array[] = array(gettext("Certificates"), true, "system_certmanager.php");
+ $tab_array[] = array(gettext("Certificate Revocation"), false, "system_crlmanager.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+
+ <?php if ($act == "new" || (($_POST['save'] == gettext("Save")) && $input_errors)): ?>
+
+ <form action="system_certmanager.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <?php if (!isset($id)): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Method");?></td>
+ <td width="78%" class="vtable">
+ <select name='method' id='method' class="formselect" onchange='method_change()'>
+ <?php
+ foreach ($cert_methods as $method => $desc):
+ $selected = "";
+ if ($pconfig['method'] == $method) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$method;?>"<?=$selected;?>><?=$desc;?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr id="descriptivename">
+ <?php
+ if ($a_user && empty($pconfig['descr'])) {
+ $pconfig['descr'] = $a_user[$userid]['name'];
+ }
+ ?>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>"/>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="import" summary="import">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Import Certificate");?></td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate data");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="cert" id="cert" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['cert']);?></textarea>
+ <br />
+ <?=gettext("Paste a certificate in X.509 PEM format here.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Private key data");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="key" id="key" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['key']);?></textarea>
+ <br />
+ <?=gettext("Paste a private key in X.509 PEM format here.");?>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="internal" summary="internal">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Internal Certificate");?></td>
+ </tr>
+
+ <?php if (!$internal_ca_count): ?>
+
+ <tr>
+ <td colspan="2" align="center" class="vtable">
+ <?=gettext("No internal Certificate Authorities have been defined. You must");?>
+ <a href="system_camanager.php?act=new&amp;method=internal"><?=gettext("create");?></a>
+ <?=gettext("an internal CA before creating an internal certificate.");?>
+ </td>
+ </tr>
+
+ <?php else: ?>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate authority");?></td>
+ <td width="78%" class="vtable">
+ <select name='caref' id='caref' class="formselect" onchange='internalca_change()'>
+ <?php
+ foreach ($a_ca as $ca):
+ if (!$ca['prv']) {
+ continue;
+ }
+ $selected = "";
+ if ($pconfig['caref'] == $ca['refid']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$ca['refid'];?>"<?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Key length");?></td>
+ <td width="78%" class="vtable">
+ <select name='keylen' class="formselect">
+ <?php
+ foreach ($cert_keylens as $len):
+ $selected = "";
+ if ($pconfig['keylen'] == $len) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$len;?>"<?=$selected;?>><?=$len;?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <?=gettext("bits");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Digest Algorithm");?></td>
+ <td width="78%" class="vtable">
+ <select name='digest_alg' id='digest_alg' class="formselect">
+ <?php
+ foreach ($openssl_digest_algs as $digest_alg):
+ $selected = "";
+ if ($pconfig['digest_alg'] == $digest_alg) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$digest_alg;?>"<?=$selected;?>><?=strtoupper($digest_alg);?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <br /><?= gettext("NOTE: It is recommended to use an algorithm stronger than SHA1 when possible.") ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate Type");?></td>
+ <td width="78%" class="vtable">
+ <select name='type' class="formselect">
+ <?php
+ foreach ($cert_types as $ct => $ctdesc):
+ $selected = "";
+ if ($pconfig['type'] == $ct) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$ct;?>"<?=$selected;?>><?=$ctdesc;?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <br />
+ <?=gettext("Type of certificate to generate. Used for placing restrictions on the usage of the generated certificate.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
+ <td width="78%" class="vtable">
+ <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>"/>
+ <?=gettext("days");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Distinguished name");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="2" summary="name">
+ <tr>
+ <td align="right"><?=gettext("Country Code");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_country" type="text" class="formfld unknown" maxlength="2" size="2" value="<?=htmlspecialchars($pconfig['dn_country']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("State or Province");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_state" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_state']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("City");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_city" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_city']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Organization");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_organization" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['dn_organization']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Email Address");?> : &nbsp;</td>
+ <td align="left">
+ <input name="dn_email" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['dn_email']);?>"/>
+ &nbsp;
+ <em>ex:</em>
+ &nbsp;
+ <?=gettext("webadmin@mycompany.com");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Common Name");?> : &nbsp;</td>
+ <td align="left">
+ <?php
+ if ($a_user && empty($pconfig['dn_commonname'])) {
+ $pconfig['dn_commonname'] = $a_user[$userid]['name'];
+ }
+ ?>
+ <input name="dn_commonname" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['dn_commonname']);?>"/>
+ &nbsp;
+ <em>ex:</em>
+ &nbsp;
+ <?=gettext("www.example.com");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Alternative Names");?> : &nbsp;</td>
+ <td align="left">
+ <table id="altNametable">
+ <thead>
+ <tr>
+ <th><div id="onecolumn"><?=gettext("Type");?></div></th>
+ <th><div id="twocolumn"><?=gettext("Value");?></div></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ $counter = 0;
+ if ($pconfig['altnames']['item']):
+ foreach ($pconfig['altnames']['item'] as $item):
+ $type = $item['type'];
+ $value = $item['value'];
+ ?>
+ <tr>
+ <td>
+ <input autocomplete="off" name="altname_type<?php echo $counter; ?>" type="text" class="formfld unknown" id="altname_type<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($type);?>" />
+ </td>
+ <td>
+ <input autocomplete="off" name="altname_value<?php echo $counter; ?>" type="text" class="formfld unknown" id="altname_value<?php echo $counter; ?>" size="20" value="<?=htmlspecialchars($value);?>" />
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="" title="<?=gettext("remove this entry"); ?>" /></a>
+ </td>
+ </tr>
+ <?php
+ $counter++;
+ endforeach;
+ endif;
+ ?>
+ <tr><td>&nbsp;</td></tr>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('altNametable', 'formfldalias'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
+ </a>
+ <script type="text/javascript">
+ //<![CDATA[
+ field_counter_js = 3;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+ //]]>
+ </script>
+ <br />NOTE: Type must be one of DNS (FQDN or Hostname), IP (IP address), URI, or email.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <?php endif; ?>
+
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="external" summary="external">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("External Signing Request");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Key length");?></td>
+ <td width="78%" class="vtable">
+ <select name='csr_keylen' class="formselect">
+ <?php
+ if (!isset($pconfig['csr_keylen']) && isset($pconfig['csr_keylen'])) {
+ $pconfig['csr_keylen'] = $pconfig['csr_keylen'];
+ }
+ foreach ($cert_keylens as $len):
+ $selected = "";
+ if ($pconfig['csr_keylen'] == $len) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$len;?>"<?=$selected;?>><?=$len;?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ bits
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Digest Algorithm");?></td>
+ <td width="78%" class="vtable">
+ <select name='csr_digest_alg' id='csr_digest_alg' class="formselect">
+ <?php
+ foreach ($openssl_digest_algs as $csr_digest_alg):
+ $selected = "";
+ if ($pconfig['csr_digest_alg'] == $csr_digest_alg) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$csr_digest_alg;?>"<?=$selected;?>><?=strtoupper($csr_digest_alg);?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ <br /><?= gettext("NOTE: It is recommended to use an algorithm stronger than SHA1 when possible.") ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Distinguished name");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="2" summary="name">
+ <tr>
+ <td align="right"><?=gettext("Country Code");?> : &nbsp;</td>
+ <td align="left">
+ <select name='csr_dn_country' class="formselect">
+ <?php
+ foreach ($dn_cc as $cc) {
+ $selected = "";
+ if ($pconfig['csr_dn_country'] == $cc) {
+ $selected = " selected=\"selected\"";
+ }
+ print "<option value=\"$cc\"$selected>$cc</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("State or Province");?> : &nbsp;</td>
+ <td align="left">
+ <input name="csr_dn_state" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['csr_dn_state']);?>" />
+ &nbsp;
+ <em>ex:</em>
+ &nbsp;
+ <?=gettext("Texas");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("City");?> : &nbsp;</td>
+ <td align="left">
+ <input name="csr_dn_city" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['csr_dn_city']);?>" />
+ &nbsp;
+ <em>ex:</em>
+ &nbsp;
+ <?=gettext("Austin");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Organization");?> : &nbsp;</td>
+ <td align="left">
+ <input name="csr_dn_organization" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['csr_dn_organization']);?>" />
+ &nbsp;
+ <em>ex:</em>
+ &nbsp;
+ <?=gettext("My Company Inc.");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Email Address");?> : &nbsp;</td>
+ <td align="left">
+ <input name="csr_dn_email" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['csr_dn_email']);?>"/>
+ &nbsp;
+ <em>ex:</em>
+ &nbsp;
+ <?=gettext("webadmin@mycompany.com");?>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><?=gettext("Common Name");?> : &nbsp;</td>
+ <td align="left">
+ <input name="csr_dn_commonname" type="text" class="formfld unknown" size="25" value="<?=htmlspecialchars($pconfig['csr_dn_commonname']);?>"/>
+ &nbsp;
+ <em>ex:</em>
+ &nbsp;
+ <?=gettext("www.example.com");?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="existing" summary="existing">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Choose an Existing Certificate");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Existing Certificates");?></td>
+ <td width="78%" class="vtable">
+ <?php if (isset($userid) && $a_user): ?>
+ <input name="userid" type="hidden" value="<?=htmlspecialchars($userid);?>" />
+ <?php endif;?>
+ <select name='certref' class="formselect">
+ <?php
+ foreach ($config['cert'] as $cert):
+ $selected = "";
+ $caname = "";
+ $inuse = "";
+ $revoked = "";
+ if (isset($userid) && in_array($cert['refid'], $config['system']['user'][$userid]['cert'])) {
+ continue;
+ }
+ $ca = lookup_ca($cert['caref']);
+ if ($ca) {
+ $caname = " (CA: " . htmlspecialchars($ca['descr']) . ")";
+ }
+ if ($pconfig['certref'] == $cert['refid']) {
+ $selected = " selected=\"selected\"";
+ }
+ if (cert_in_use($cert['refid'])) {
+ $inuse = " *In Use";
+ }
+ if (is_cert_revoked($cert)) {
+ $revoked = " *Revoked";
+ }
+ ?>
+ <option value="<?=$cert['refid'];?>"<?=$selected;?>><?=htmlspecialchars($cert['descr']) . $caname . $inuse . $revoked;?></option>
+ <?php
+ endforeach;
+ ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="save">
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <?php if (isset($id) && $a_cert[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif;?>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+ <?php elseif ($act == "csr" || (($_POST['save'] == gettext("Update")) && $input_errors)):?>
+
+ <form action="system_certmanager.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="name">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Complete Signing Request");?></td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Signing request data");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="csr" id="csr" cols="65" rows="7" class="formfld_cert" readonly="readonly"><?=htmlspecialchars($pconfig['csr']);?></textarea>
+ <br />
+ <?=gettext("Copy the certificate signing data from here and forward it to your certificate authority for signing.");?></td>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Final certificate data");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="cert" id="cert" cols="65" rows="7" class="formfld_cert"><?=htmlspecialchars($pconfig['cert']);?></textarea>
+ <br />
+ <?=gettext("Paste the certificate received from your certificate authority here.");?></td>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <?php /* if (isset($subject_mismatch) && $subject_mismatch === true): ?>
+ <input id="ignoresubjectmismatch" name="ignoresubjectmismatch" type="checkbox" class="formbtn" value="yes" />
+ <label for="ignoresubjectmismatch"><strong><?=gettext("Ignore certificate subject mismatch"); ?></strong></label><br />
+ <?php echo gettext("Warning: Using this option may create an " .
+ "invalid certificate. Check this box to disable the request -> " .
+ "response subject verification. ");
+ ?><br />
+ <?php endif; */ ?>
+ <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Update");?>" />
+ <?php if (isset($id) && $a_cert[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <input name="act" type="hidden" value="csr" />
+ <?php endif;?>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+ <?php else:?>
+
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="details">
+ <tr>
+ <td width="15%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Issuer");?></td>
+ <td width="40%" class="listhdrr"><?=gettext("Distinguished Name");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("In Use");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+ <?php
+ $pluginparams = array();
+ $pluginparams['type'] = 'certificates';
+ $pluginparams['event'] = 'used_certificates';
+ $certificates_used_by_packages = pkg_call_plugins('plugin_certificates', $pluginparams);
+ $i = 0;
+ foreach ($a_cert as $cert):
+ $name = htmlspecialchars($cert['descr']);
+
+ if ($cert['crt']) {
+ $subj = cert_get_subject($cert['crt']);
+ $issuer = cert_get_issuer($cert['crt']);
+ $purpose = cert_get_purpose($cert['crt']);
+ list($startdate, $enddate) = cert_get_dates($cert['crt']);
+ if ($subj == $issuer) {
+ $caname = "<em>" . gettext("self-signed") . "</em>";
+ } else {
+ $caname = "<em>" . gettext("external"). "</em>";
+ }
+ $subj = htmlspecialchars($subj);
+ }
+
+ if ($cert['csr']) {
+ $subj = htmlspecialchars(csr_get_subject($cert['csr']));
+ $caname = "<em>" . gettext("external - signature pending") . "</em>";
+ }
+
+ $ca = lookup_ca($cert['caref']);
+ if ($ca) {
+ $caname = htmlspecialchars($ca['descr']);
+ }
+
+ if ($cert['prv']) {
+ $certimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
+ } else {
+ $certimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
+ }
+ ?>
+ <tr>
+ <td class="listlr">
+ <table border="0" cellpadding="0" cellspacing="0" summary="icon">
+ <tr>
+ <td align="left" valign="middle">
+ <img src="<?=$certimg;?>" alt="CA" title="CA" border="0" height="16" width="16" />
+ </td>
+ <td align="left" valign="middle">
+ <?=$name;?>
+ </td>
+ </tr>
+ <tr><td>&nbsp;</td></tr>
+ <?php if ($cert['type']): ?>
+ <tr>
+ <td colspan="2"><em><?php echo $cert_types[$cert['type']]; ?></em></td>
+ </tr>
+ <?php endif; ?>
+ <?php if (is_array($purpose)): ?>
+ <tr>
+ <td colspan="2">
+ CA: <?php echo $purpose['ca']; ?>,
+ Server: <?php echo $purpose['server']; ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ </table>
+ </td>
+ <td class="listr"><?=$caname;?>&nbsp;</td>
+ <td class="listr"><?=$subj;?>&nbsp;<br />
+ <table width="100%" style="font-size: 9px" summary="valid">
+ <tr>
+ <td width="10%">&nbsp;</td>
+ <td width="20%"><?=gettext("Valid From")?>:</td>
+ <td width="70%"><?= $startdate ?></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td><?=gettext("Valid Until")?>:</td>
+ <td><?= $enddate ?></td>
+ </tr>
+ </table>
+ </td>
+ <td class="listr">
+ <?php if (is_cert_revoked($cert)): ?>
+ <b>Revoked</b><br />
+ <?php endif; ?>
+ <?php if (is_webgui_cert($cert['refid'])): ?>
+ webConfigurator<br />
+ <?php endif; ?>
+ <?php if (is_user_cert($cert['refid'])): ?>
+ User Cert<br />
+ <?php endif; ?>
+ <?php if (is_openvpn_server_cert($cert['refid'])): ?>
+ OpenVPN Server<br />
+ <?php endif; ?>
+ <?php if (is_openvpn_client_cert($cert['refid'])): ?>
+ OpenVPN Client<br />
+ <?php endif; ?>
+ <?php if (is_ipsec_cert($cert['refid'])): ?>
+ IPsec Tunnel<br />
+ <?php endif; ?>
+ <?php if (is_captiveportal_cert($cert['refid'])): ?>
+ Captive Portal<br />
+ <?php endif; ?>
+ <?
+ $refid = $cert['refid'];
+ if (is_array($certificates_used_by_packages)) {
+ foreach ($certificates_used_by_packages as $name => $package) {
+ if (isset($package['certificatelist'][$refid])) {
+ $hint = "" ;
+ if (is_array($package['certificatelist'][$refid])) {
+ foreach ($package['certificatelist'][$refid] as $cert_used) {
+ $hint = $hint . $cert_used['usedby']."\n";
+ }
+ }
+ $count = count($package['certificatelist'][$refid]);
+ echo "<div title='".htmlspecialchars($hint)."'>";
+ echo htmlspecialchars($package['pkgname'])." ($count)<br />";
+ echo "</div>";
+ }
+ }
+ }
+ ?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="system_certmanager.php?act=exp&amp;id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export cert");?>" alt="<?=gettext("export ca");?>" width="17" height="17" border="0" />
+ </a>
+ <a href="system_certmanager.php?act=key&amp;id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export key");?>" alt="<?=gettext("export ca");?>" width="17" height="17" border="0" />
+ </a>
+ <a href="system_certmanager.php?act=p12&amp;id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("export ca cert+user cert+user cert key in .p12 format");?>" alt="<?=gettext("export ca cert+user cert+user cert key in .p12 format");?>" width="17" height="17" border="0" />
+ </a>
+ <?php if (!cert_in_use($cert['refid'])): ?>
+ <a href="system_certmanager.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate?");?>')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete cert");?>" alt="<?=gettext("delete cert");?>" width="17" height="17" border="0" />
+ </a>
+ <?php endif; ?>
+ <?php if ($cert['csr']): ?>
+ &nbsp;
+ <a href="system_certmanager.php?act=csr&amp;id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("update csr");?>" alt="<?=gettext("update csr");?>" width="17" height="17" border="0" />
+ </a>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <a href="system_certmanager.php?act=new">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add or import certificate");?>" alt="<?=gettext("add certificate");?>" width="17" height="17" border="0" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td colspan="3"><?=gettext("Note: You can only delete a certificate if it is not currently in use.");?></td>
+ </tr>
+ </table>
+
+ <?php endif; ?>
+
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc");?>
+<script type="text/javascript">
+//<![CDATA[
+
+method_change();
+internalca_change();
+
+//]]>
+</script>
+
+</body>
+</html>
diff --git a/src/usr/local/www/system_crlmanager.php b/src/usr/local/www/system_crlmanager.php
new file mode 100644
index 0000000..ff70e9b
--- /dev/null
+++ b/src/usr/local/www/system_crlmanager.php
@@ -0,0 +1,722 @@
+<?php
+/*
+ system_crlmanager.php
+
+ Copyright (C) 2010 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: certificate_manager
+*/
+
+##|+PRIV
+##|*IDENT=page-system-crlmanager
+##|*NAME=System: CRL Manager
+##|*DESCR=Allow access to the 'System: CRL Manager' page.
+##|*MATCH=system_crlmanager.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("certs.inc");
+require_once("openvpn.inc");
+require_once("vpn.inc");
+
+global $openssl_crl_status;
+
+$pgtitle = array(gettext("System"), gettext("Certificate Revocation List Manager"));
+
+$crl_methods = array(
+ "internal" => gettext("Create an internal Certificate Revocation List"),
+ "existing" => gettext("Import an existing Certificate Revocation List"));
+
+if (ctype_alnum($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && ctype_alnum($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+}
+
+$a_ca =& $config['ca'];
+
+if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+}
+
+$a_cert =& $config['cert'];
+
+if (!is_array($config['crl'])) {
+ $config['crl'] = array();
+}
+
+$a_crl =& $config['crl'];
+
+foreach ($a_crl as $cid => $acrl) {
+ if (!isset($acrl['refid'])) {
+ unset ($a_crl[$cid]);
+ }
+}
+
+$act = $_GET['act'];
+if ($_POST['act']) {
+ $act = $_POST['act'];
+}
+
+if (!empty($id)) {
+ $thiscrl =& lookup_crl($id);
+}
+
+// If we were given an invalid crlref in the id, no sense in continuing as it would only cause errors.
+if (!$thiscrl && (($act != "") && ($act != "new"))) {
+ pfSenseHeader("system_crlmanager.php");
+ $act="";
+ $savemsg = gettext("Invalid CRL reference.");
+}
+
+if ($act == "del") {
+ $name = htmlspecialchars($thiscrl['descr']);
+ if (crl_in_use($id)) {
+ $savemsg = sprintf(gettext("Certificate Revocation List %s is in use and cannot be deleted"), $name) . "<br />";
+ } else {
+ foreach ($a_crl as $cid => $acrl) {
+ if ($acrl['refid'] == $thiscrl['refid']) {
+ unset($a_crl[$cid]);
+ }
+ }
+ write_config("Deleted CRL {$name}.");
+ $savemsg = sprintf(gettext("Certificate Revocation List %s successfully deleted"), $name) . "<br />";
+ }
+}
+
+if ($act == "new") {
+ $pconfig['method'] = $_GET['method'];
+ $pconfig['caref'] = $_GET['caref'];
+ $pconfig['lifetime'] = "9999";
+ $pconfig['serial'] = "0";
+}
+
+if ($act == "exp") {
+ crl_update($thiscrl);
+ $exp_name = urlencode("{$thiscrl['descr']}.crl");
+ $exp_data = base64_decode($thiscrl['text']);
+ $exp_size = strlen($exp_data);
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$exp_name}");
+ header("Content-Length: $exp_size");
+ echo $exp_data;
+ exit;
+}
+
+if ($act == "addcert") {
+ if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (!$pconfig['crlref'] || !$pconfig['certref']) {
+ pfSenseHeader("system_crlmanager.php");
+ exit;
+ }
+
+ // certref, crlref
+ $crl =& lookup_crl($pconfig['crlref']);
+ $cert = lookup_cert($pconfig['certref']);
+
+ if (!$crl['caref'] || !$cert['caref']) {
+ $input_errors[] = gettext("Both the Certificate and CRL must be specified.");
+ }
+
+ if ($crl['caref'] != $cert['caref']) {
+ $input_errors[] = gettext("CA mismatch between the Certificate and CRL. Unable to Revoke.");
+ }
+ if (!is_crl_internal($crl)) {
+ $input_errors[] = gettext("Cannot revoke certificates for an imported/external CRL.");
+ }
+
+ if (!$input_errors) {
+ $reason = (empty($pconfig['crlreason'])) ? OCSP_REVOKED_STATUS_UNSPECIFIED : $pconfig['crlreason'];
+ cert_revoke($cert, $crl, $reason);
+ // refresh IPsec and OpenVPN CRLs
+ openvpn_refresh_crls();
+ vpn_ipsec_configure();
+ write_config("Revoked cert {$cert['descr']} in CRL {$crl['descr']}.");
+ pfSenseHeader("system_crlmanager.php");
+ exit;
+ }
+ }
+}
+
+if ($act == "delcert") {
+ if (!is_array($thiscrl['cert'])) {
+ pfSenseHeader("system_crlmanager.php");
+ exit;
+ }
+ $found = false;
+ foreach ($thiscrl['cert'] as $acert) {
+ if ($acert['refid'] == $_GET['certref']) {
+ $found = true;
+ $thiscert = $acert;
+ }
+ }
+ if (!$found) {
+ pfSenseHeader("system_crlmanager.php");
+ exit;
+ }
+ $certname = htmlspecialchars($thiscert['descr']);
+ $crlname = htmlspecialchars($thiscrl['descr']);
+ if (cert_unrevoke($thiscert, $thiscrl)) {
+ $savemsg = sprintf(gettext("Deleted Certificate %s from CRL %s"), $certname, $crlname) . "<br />";
+ // refresh IPsec and OpenVPN CRLs
+ openvpn_refresh_crls();
+ vpn_ipsec_configure();
+ write_config(sprintf(gettext("Deleted Certificate %s from CRL %s"), $certname, $crlname));
+ } else {
+ $savemsg = sprintf(gettext("Failed to delete Certificate %s from CRL %s"), $certname, $crlname) . "<br />";
+ }
+ $act="edit";
+}
+
+if ($_POST) {
+ $input_errors = array();
+ $pconfig = $_POST;
+
+ /* input validation */
+ if (($pconfig['method'] == "existing") || ($act == "editimported")) {
+ $reqdfields = explode(" ", "descr crltext");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Certificate Revocation List data"));
+ }
+ if ($pconfig['method'] == "internal") {
+ $reqdfields = explode(" ", "descr caref");
+ $reqdfieldsn = array(
+ gettext("Descriptive name"),
+ gettext("Certificate Authority"));
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (preg_match("/[\?\>\<\&\/\\\"\']/", $pconfig['descr'])) {
+ array_push($input_errors, "The field 'Descriptive Name' contains invalid characters.");
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ /* save modifications */
+ if (!$input_errors) {
+ $result = false;
+
+ if ($thiscrl) {
+ $crl =& $thiscrl;
+ } else {
+ $crl = array();
+ $crl['refid'] = uniqid();
+ }
+
+ $crl['descr'] = $pconfig['descr'];
+ if ($act != "editimported") {
+ $crl['caref'] = $pconfig['caref'];
+ $crl['method'] = $pconfig['method'];
+ }
+
+ if (($pconfig['method'] == "existing") || ($act == "editimported")) {
+ $crl['text'] = base64_encode($pconfig['crltext']);
+ }
+
+ if ($pconfig['method'] == "internal") {
+ $crl['serial'] = empty($pconfig['serial']) ? 9999 : $pconfig['serial'];
+ $crl['lifetime'] = empty($pconfig['lifetime']) ? 9999 : $pconfig['lifetime'];
+ $crl['cert'] = array();
+ }
+
+ if (!$thiscrl) {
+ $a_crl[] = $crl;
+ }
+
+ write_config("Saved CRL {$crl['descr']}");
+ // refresh IPsec and OpenVPN CRLs
+ openvpn_refresh_crls();
+ vpn_ipsec_configure();
+ pfSenseHeader("system_crlmanager.php");
+ }
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function method_change() {
+
+ method = document.iform.method.value;
+
+ switch (method) {
+ case "internal":
+ document.getElementById("existing").style.display="none";
+ document.getElementById("internal").style.display="";
+ break;
+ case "existing":
+ document.getElementById("existing").style.display="";
+ document.getElementById("internal").style.display="none";
+ break;
+ }
+}
+
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="CRL manager">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("CAs"), false, "system_camanager.php");
+ $tab_array[] = array(gettext("Certificates"), false, "system_certmanager.php");
+ $tab_array[] = array(gettext("Certificate Revocation"), true, "system_crlmanager.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+
+<?php
+ if ($act == "new" || $act == gettext("Save") || $input_errors):
+?>
+
+ <form action="system_crlmanager.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <?php if (!isset($id)): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Method");?></td>
+ <td width="78%" class="vtable">
+ <select name='method' id='method' class="formselect" onchange='method_change()'>
+ <?php
+ $rowIndex = 0;
+ foreach ($crl_methods as $method => $desc):
+ if (($_GET['importonly'] == "yes") && ($method != "existing")) {
+ continue;
+ }
+ $selected = "";
+ if ($pconfig['method'] == $method) {
+ $selected = "selected=\"selected\"";
+ }
+ $rowIndex++;
+ ?>
+ <option value="<?=$method;?>" <?=$selected;?>><?=$desc;?></option>
+ <?php
+ endforeach;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate Authority");?></td>
+ <td width="78%" class="vtable">
+ <select name='caref' id='caref' class="formselect">
+ <?php
+ $rowIndex = 0;
+ foreach ($a_ca as $ca):
+ $selected = "";
+ if ($pconfig['caref'] == $ca['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ $rowIndex++;
+ ?>
+ <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
+ <?php
+ endforeach;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="existing" summary="existing">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Existing Certificate Revocation List");?></td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("CRL data");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="crltext" id="crltext" cols="65" rows="7" class="formfld_crl"><?=$pconfig['crltext'];?></textarea>
+ <br />
+ <?=gettext("Paste a Certificate Revocation List in X.509 CRL format here.");?>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="internal" summary="internal">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Internal Certificate Revocation List");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
+ <td width="78%" class="vtable">
+ <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>"/>
+ <?=gettext("days");?><br />
+ <?=gettext("Default: 9999");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Serial");?></td>
+ <td width="78%" class="vtable">
+ <input name="serial" type="text" class="formfld unknown" id="serial" size="5" value="<?=htmlspecialchars($pconfig['serial']);?>"/>
+ <br />
+ <?=gettext("Default: 0");?>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="save">
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <?php if (isset($id) && $thiscrl): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif;?>
+ </td>
+ </tr>
+ </table>
+ </form>
+<?php
+ elseif ($act == "editimported"):
+ $crl = $thiscrl;
+?>
+ <form action="system_crlmanager.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="editimported" summary="import">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit Imported Certificate Revocation List");?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($crl['descr']);?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("CRL data");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="crltext" id="crltext" cols="65" rows="7" class="formfld_crl"><?=base64_decode($crl['text']);?></textarea>
+ <br />
+ <?=gettext("Paste a Certificate Revocation List in X.509 CRL format here.");?></td>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <input name="act" type="hidden" value="editimported" />
+ </td>
+ </tr>
+ </table>
+ </form>
+
+<?php
+ elseif ($act == "edit"):
+ $crl = $thiscrl;
+?>
+ <form action="system_crlmanager.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="revoke">
+ <thead>
+ <tr>
+ <th width="90%" class="listhdrr" colspan="3"><b><?php echo gettext("Currently Revoked Certificates for CRL") . ': ' . htmlspecialchars($crl['descr']); ?></b></th>
+ <th width="10%" class="list"></th>
+ </tr>
+ <tr>
+ <th width="30%" class="listhdrr"><b><?php echo gettext("Certificate Name")?></b></th>
+ <th width="30%" class="listhdrr"><b><?php echo gettext("Revocation Reason")?></b></th>
+ <th width="30%" class="listhdrr"><b><?php echo gettext("Revoked At")?></b></th>
+ <th width="10%" class="list"></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php /* List Certs on CRL */
+ if (!is_array($crl['cert']) || (count($crl['cert']) == 0)):
+ ?>
+ <tr>
+ <td class="listlr" colspan="3">
+ &nbsp;&nbsp;&nbsp;&nbsp;<?php echo gettext("No Certificates Found for this CRL."); ?>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ <?php
+ else:
+ foreach ($crl['cert'] as $i => $cert):
+ $name = htmlspecialchars($cert['descr']);
+ ?>
+ <tr>
+ <td class="listlr">
+ <?php echo $name; ?>
+ </td>
+ <td class="listlr">
+ <?php echo $openssl_crl_status[$cert["reason"]]; ?>
+ </td>
+ <td class="listlr">
+ <?php echo date("D M j G:i:s T Y", $cert["revoke_time"]); ?>
+ </td>
+ <td class="list">
+ <a href="system_crlmanager.php?act=delcert&amp;id=<?php echo $crl['refid']; ?>&amp;certref=<?php echo $cert['refid']; ?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate from the CRL?");?>')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("Delete this certificate from the CRL ");?>" alt="<?=gettext("Delete this certificate from the CRL ");?>" width="17" height="17" border="0" />
+ </a>
+ </td>
+ </tr>
+ <?php
+ endforeach;
+ endif;
+ ?>
+ <?php /* Drop-down with other certs from this CA. */
+ // Map Certs to CAs in one pass
+ $ca_certs = array();
+ foreach ($a_cert as $cert) {
+ if ($cert['caref'] == $crl['caref']) {
+ $ca_certs[] = $cert;
+ }
+ }
+ if (count($ca_certs) == 0): ?>
+ <tr>
+ <td class="listlr" colspan="3">
+ &nbsp;&nbsp;&nbsp;&nbsp;<?php echo gettext("No Certificates Found for this CA."); ?>
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ <?php
+ else:
+ ?>
+ <tr>
+ <td class="listlr" colspan="3" align="center">
+ <b><?php echo gettext("Choose a Certificate to Revoke"); ?></b>:
+ <select name='certref' id='certref' class="formselect">
+ <?php $rowIndex = 0;
+ foreach ($ca_certs as $cert):
+ $rowIndex++;
+ ?>
+ <option value="<?=$cert['refid'];?>"><?=htmlspecialchars($cert['descr'])?></option>
+ <?php
+ endforeach;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+ ?>
+ </select>
+ <b><?php echo gettext("Reason");?></b>:
+ <select name='crlreason' id='crlreason' class="formselect">
+ <?php $rowIndex = 0;
+ foreach ($openssl_crl_status as $code => $reason):
+ $rowIndex++;
+ ?>
+ <option value="<?= $code ?>"><?= htmlspecialchars($reason) ?></option>
+ <?php
+ endforeach;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+ ?>
+ </select>
+ <input name="act" type="hidden" value="addcert" />
+ <input name="crlref" type="hidden" value="<?=$crl['refid'];?>" />
+ <input name="id" type="hidden" value="<?=$crl['refid'];?>" />
+ <input id="submit" name="add" type="submit" class="formbtn" value="<?=gettext("Add"); ?>" />
+ </td>
+ <td class="list">&nbsp;</td>
+ </tr>
+ <?php
+ endif;
+ ?>
+ </tbody>
+ </table>
+ </form>
+<?php
+ else:
+?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="ocpms">
+ <thead>
+ <tr>
+ <td width="35%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Internal");?></td>
+ <td width="35%" class="listhdrr"><?=gettext("Certificates");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("In Use");?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td colspan="5">
+ <p>
+ <?=gettext("Additional Certificate Revocation Lists can be added here.");?>
+ </p>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+ <?php
+ $caimg = "/themes/{$g['theme']}/images/icons/icon_frmfld_cert.png";
+ // Map CRLs to CAs in one pass
+ $ca_crl_map = array();
+ foreach ($a_crl as $crl) {
+ $ca_crl_map[$crl['caref']][] = $crl['refid'];
+ }
+
+ $i = 0;
+ foreach ($a_ca as $ca):
+ $name = htmlspecialchars($ca['descr']);
+
+ if ($ca['prv']) {
+ $cainternal = "YES";
+ } else {
+ $cainternal = "NO";
+ }
+ ?>
+ <tr>
+ <td class="listlr" colspan="4">
+ <table border="0" cellpadding="0" cellspacing="0" summary="icon">
+ <tr>
+ <td align="left" valign="middle">
+ <img src="<?=$caimg;?>" alt="CA" title="CA" border="0" height="16" width="16" />
+ </td>
+ <td align="left" valign="middle">
+ <?=$name;?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td class="list">
+ <?php if ($cainternal == "YES"): ?>
+ <a href="system_crlmanager.php?act=new&amp;caref=<?php echo $ca['refid']; ?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?php printf(gettext("Add or Import CRL for %s"), htmlspecialchars($ca['descr']));?>" alt="<?=gettext("add crl");?>" width="17" height="17" border="0" />
+ </a>
+ <?php else: ?>
+ <a href="system_crlmanager.php?act=new&amp;caref=<?php echo $ca['refid']; ?>&amp;importonly=yes">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="<?php printf(gettext("Import CRL for %s"), htmlspecialchars($ca['descr']));?>" alt="<?=gettext("add crl");?>" width="17" height="17" border="0" />
+ </a>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php
+ if (is_array($ca_crl_map[$ca['refid']])):
+ foreach ($ca_crl_map[$ca['refid']] as $crl):
+ $tmpcrl = lookup_crl($crl);
+ $internal = is_crl_internal($tmpcrl);
+ $inuse = crl_in_use($tmpcrl['refid']);
+ ?>
+ <tr>
+ <td class="listlr"><?php echo htmlspecialchars($tmpcrl['descr']); ?></td>
+ <td class="listr"><?php echo ($internal) ? "YES" : "NO"; ?></td>
+ <td class="listr"><?php echo ($internal) ? count($tmpcrl['cert']) : "Unknown (imported)"; ?></td>
+ <td class="listr"><?php echo ($inuse) ? "YES" : "NO"; ?></td>
+ <td valign="middle" class="list nowrap">
+ <a href="system_crlmanager.php?act=exp&amp;id=<?=$tmpcrl['refid'];?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_down.gif" title="<?=gettext("Export CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Export CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" width="17" height="17" border="0" />
+ </a>
+ <?php if ($internal): ?>
+ <a href="system_crlmanager.php?act=edit&amp;id=<?=$tmpcrl['refid'];?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" width="17" height="17" border="0" />
+ </a>
+ <?php else: ?>
+ <a href="system_crlmanager.php?act=editimported&amp;id=<?=$tmpcrl['refid'];?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Edit CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" width="17" height="17" border="0" />
+ </a>
+ <?php endif; ?>
+ <?php if (!$inuse): ?>
+ <a href="system_crlmanager.php?act=del&amp;id=<?=$tmpcrl['refid'];?>" onclick="return confirm('<?=gettext("Do you really want to delete this Certificate Revocation List?") . ' (' . htmlspecialchars($tmpcrl['descr']) . ')';?>')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("Delete CRL") . " " . htmlspecialchars($tmpcrl['descr']);?>" alt="<?=gettext("Delete CRL") . " " . htmlspecialchars($tmpcrl['descr']); ?>" width="17" height="17" border="0" />
+ </a>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ endif;
+ ?>
+ <tr>
+ <td colspan="5">&nbsp;</td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ </tbody>
+ </table>
+
+<?php
+ endif;
+?>
+
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc");?>
+<script type="text/javascript">
+//<![CDATA[
+
+method_change();
+
+//]]>
+</script>
+
+</body>
+</html>
diff --git a/src/usr/local/www/system_firmware.php b/src/usr/local/www/system_firmware.php
new file mode 100644
index 0000000..d6d48ee
--- /dev/null
+++ b/src/usr/local/www/system_firmware.php
@@ -0,0 +1,343 @@
+<?php
+/* $Id$ */
+/*
+ system_firmware.php
+ Copyright (C) 2008 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/tar
+ pfSense_MODULE: firmware
+*/
+
+##|+PRIV
+##|*IDENT=page-system-firmware-manualupdate
+##|*NAME=System: Firmware: Manual Update page
+##|*DESCR=Allow access to the 'System: Firmware: Manual Update' page.
+##|*MATCH=system_firmware.php*
+##|-PRIV
+
+$d_isfwfile = 1;
+$nocsrf = true;
+
+require_once("globals.inc");
+require_once("functions.inc");
+require_once("guiconfig.inc");
+require_once("xmlrpc_client.inc");
+
+$curcfg = $config['system']['firmware'];
+
+/* Allow additional execution time 0 = no limit. */
+ini_set('max_execution_time', '9999');
+ini_set('max_input_time', '9999');
+
+function file_is_for_platform($filename, $ul_name) {
+ global $g;
+ if ($g['platform'] == "nanobsd") {
+ if (stristr($ul_name, "nanobsd")) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ $_gb = exec("/usr/bin/tar xzf $filename -C /tmp/ etc/platform");
+ unset($_gb);
+ if (!file_exists("/tmp/etc/platform")) {
+ return false;
+ }
+ $upgrade_is_for_platform = trim(file_get_contents("/tmp/etc/platform", " \n\t\r"));
+ if ($g['platform'] == $upgrade_is_for_platform) {
+ @unlink("/tmp/etc/platform");
+ return true;
+ }
+ return false;
+}
+
+function file_upload_error_message($error_code) {
+ switch ($error_code) {
+ case UPLOAD_ERR_INI_SIZE:
+ return gettext('The uploaded file exceeds the upload_max_filesize directive in php.ini');
+ case UPLOAD_ERR_FORM_SIZE:
+ return gettext('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form');
+ case UPLOAD_ERR_PARTIAL:
+ return gettext('The uploaded file was only partially uploaded');
+ case UPLOAD_ERR_NO_FILE:
+ return gettext('No file was uploaded');
+ case UPLOAD_ERR_NO_TMP_DIR:
+ return gettext('Missing a temporary folder');
+ case UPLOAD_ERR_CANT_WRITE:
+ return gettext('Failed to write file to disk');
+ case UPLOAD_ERR_EXTENSION:
+ return gettext('File upload stopped by extension');
+ default:
+ return gettext('Unknown upload error');
+ }
+}
+
+/* if upgrade in progress, alert user */
+if (is_subsystem_dirty('firmwarelock')) {
+ $pgtitle = array(gettext("System"), gettext("Firmware"), gettext("Manual Update"));
+ include("head.inc");
+ echo "<body link=\"#0000CC\" vlink=\"#0000CC\" alink=\"#0000CC\">\n";
+ include("fbegin.inc");
+ echo "<div>\n";
+ print_info_box(gettext("An upgrade is currently in progress.<p>The firewall will reboot when the operation is complete.") . "</p><p><img src='/themes/{$g['theme']}/images/icons/icon_fw-update.gif' alt='update' /></p>");
+ echo "</div>\n";
+ include("fend.inc");
+ echo "</body>";
+ echo "</html>";
+ exit;
+}
+
+if ($_POST['backupbeforeupgrade']) {
+ touch("/tmp/perform_full_backup.txt");
+}
+
+/* Handle manual upgrade */
+if ($_POST && !is_subsystem_dirty('firmwarelock')) {
+
+ unset($input_errors);
+ unset($sig_warning);
+
+ if (stristr($_POST['Submit'], gettext("Enable"))) {
+ $mode = "enable";
+ } else if (stristr($_POST['Submit'], gettext("Disable"))) {
+ $mode = "disable";
+ } else if (stristr($_POST['Submit'], gettext("Upgrade")) || $_POST['sig_override']) {
+ $mode = "upgrade";
+ } else if ($_POST['sig_no']) {
+ if (file_exists("{$g['upload_path']}/firmware.tgz")) {
+ unlink("{$g['upload_path']}/firmware.tgz");
+ }
+ }
+ if ($mode) {
+ if ($mode == "enable") {
+ conf_mount_rw();
+ mark_subsystem_dirty('firmware');
+ } else if ($mode == "disable") {
+ conf_mount_ro();
+ clear_subsystem_dirty('firmware');
+ } else if ($mode == "upgrade") {
+ if ($_FILES['ulfile']['error']) {
+ $errortext = "(" . file_upload_error_message($_FILES['ulfile']['error']) . ")";
+ }
+ if (is_uploaded_file($_FILES['ulfile']['tmp_name'])) {
+ /* verify firmware image(s) */
+ if (file_is_for_platform($_FILES['ulfile']['tmp_name'], $_FILES['ulfile']['name']) == false && !$_POST['sig_override']) {
+ $input_errors[] = gettext("The uploaded image file is not for this platform.");
+ } else if (!file_exists($_FILES['ulfile']['tmp_name'])) {
+ /* probably out of memory for the MFS */
+ $input_errors[] = gettext("Image upload failed (out of memory?)");
+ mwexec("/etc/rc.firmware disable");
+ clear_subsystem_dirty('firmware');
+ } else {
+ /* move the image so PHP won't delete it */
+ rename($_FILES['ulfile']['tmp_name'], "{$g['upload_path']}/firmware.tgz");
+
+ /* check digital signature */
+ $sigchk = verify_digital_signature("{$g['upload_path']}/firmware.tgz");
+
+ if ($sigchk == 1) {
+ $sig_warning = gettext("The digital signature on this image is invalid.");
+ } else if ($sigchk == 2 && !isset($config['system']['firmware']['allowinvalidsig'])) {
+ $sig_warning = gettext("This image is not digitally signed.");
+ } else if (($sigchk >= 3)) {
+ $sig_warning = gettext("There has been an error verifying the signature on this image.");
+ }
+
+ if (!verify_gzip_file("{$g['upload_path']}/firmware.tgz")) {
+ $input_errors[] = gettext("The image file is corrupt.");
+ unlink("{$g['upload_path']}/firmware.tgz");
+ }
+ }
+ }
+
+ run_plugins("/usr/local/pkg/firmware_upgrade");
+
+ /* Check for input errors, firmware locks, warnings, then check for firmware if sig_override is set */
+ if (!$input_errors && !is_subsystem_dirty('firmwarelock') && (!$sig_warning || $_POST['sig_override'])) {
+ if (file_exists("{$g['upload_path']}/firmware.tgz")) {
+ /* fire up the update script in the background */
+ mark_subsystem_dirty('firmwarelock');
+ $savemsg = gettext("The firmware is now being updated. The firewall will reboot automatically.");
+ if (stristr($_FILES['ulfile']['name'], "nanobsd") or $_POST['isnano'] == "yes") {
+ mwexec_bg("/etc/rc.firmware pfSenseNanoBSDupgrade {$g['upload_path']}/firmware.tgz");
+ } else {
+ if ($g['platform'] == "nanobsd") {
+ $whichone = "pfSenseNanoBSDupgrade";
+ } else {
+ $whichone = "pfSenseupgrade";
+ }
+ mwexec_bg("/etc/rc.firmware {$whichone} {$g['upload_path']}/firmware.tgz");
+ unset($whichone);
+ }
+ } else {
+ $savemsg = sprintf(gettext("Firmware image missing or other error, please try again %s."), $errortext);
+ }
+ }
+ }
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Firmware"));
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<form action="system_firmware.php" method="post" enctype="multipart/form-data">
+<?php
+ /* Construct an upload_id for this session */
+ if (!session_id()) {
+ $upload_id = uniqid();
+ } else {
+ $upload_id = session_id();
+ }
+?>
+<input type="hidden" name="UPLOAD_IDENTIFIER" value="<?php echo $upload_id;?>" />
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if ($fwinfo <> "") print_info_box($fwinfo); ?>
+<?php
+ if ($sig_warning && !$input_errors):
+ $sig_warning = "<strong>" . $sig_warning . "</strong><br />" . gettext("This means that the image you uploaded " .
+ "is not an official/supported image and may lead to unexpected behavior or security " .
+ "compromises. Only install images that come from sources that you trust, and make sure " .
+ "that the image has not been tampered with.") . "<br /><br />" .
+ gettext("Do you want to install this image anyway (on your own risk)?");
+ print_info_box($sig_warning);
+ if (stristr($_FILES['ulfile']['name'], "nanobsd")) {
+ echo "<input type='hidden' name='isnano' id='isnano' value='yes' />\n";
+ }
+?>
+<input name="sig_override" type="submit" class="formbtn" id="sig_override" value=" <?=gettext("Yes");?> " />
+<input name="sig_no" type="submit" class="formbtn" id="sig_no" value=" <?=gettext("No"); ?> " />
+<?php
+ else:
+ if (!is_subsystem_dirty('firmwarelock')):
+?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firmware">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Manual Update"), true, "system_firmware.php");
+ $tab_array[] = array(gettext("Auto Update"), false, "system_firmware_check.php");
+ $tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
+ if ($g['hidedownloadbackup'] == false) {
+ $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+ }
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic"><?=gettext("Invoke") ." ". $g['product_name'] . " " . gettext("Manual Upgrade"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+<?php
+ if (!is_subsystem_dirty('rebootreq')):
+ if (!is_subsystem_dirty('firmware')):
+?>
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Enable firmware upload");?>" />
+ <br />
+ <?php printf(gettext('Click "Enable firmware upload" to begin.'), $g['firmware_update_text']);?>
+ <br />
+<?php
+ else:
+?>
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Disable firmware upload");?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="baseline" class="vncell">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <?php
+ if ($g['platform'] == "nanobsd") {
+ $type = "*.img.gz";
+ } else {
+ $type = "*.tgz";
+ }
+ ?>
+ <strong><?=gettext("Firmware image file ($type):");?> </strong>
+ <input name="ulfile" type="file" class="formfld" />
+ <br />
+ <?php if ($g['hidebackupbeforeupgrade'] === false): ?>
+ <input type="checkbox" name='backupbeforeupgrade' id='backupbeforeupgrade' /> <?=gettext("Perform full backup prior to upgrade");?>
+ <br />
+ <?php endif; ?>
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Upgrade firmware");?>" />
+ <?=gettext('Click "Upgrade firmware" to start the upgrade process.');?>
+<?php
+ endif;
+ else:
+?>
+ <strong><?=gettext("You must reboot the system before you can upgrade the firmware.");?></strong>
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <?php if (is_subsystem_dirty('firmware')): ?>
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ <?=gettext("Warning:");?><br />
+ </strong>
+ </span>
+ <?=gettext("DO NOT abort the firmware upgrade once it " .
+ "has started. The firewall will reboot automatically after " .
+ "storing the new firmware. The configuration will be maintained.");?>
+ </span>
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+<?php
+ endif;
+ endif;
+?>
+<?php include("fend.inc"); ?>
+</form>
+</body>
+</html>
diff --git a/src/usr/local/www/system_firmware_auto.php b/src/usr/local/www/system_firmware_auto.php
new file mode 100755
index 0000000..e2970fa
--- /dev/null
+++ b/src/usr/local/www/system_firmware_auto.php
@@ -0,0 +1,296 @@
+<?php
+/* $Id$ */
+/*
+ system_firmware_auto.php
+ Copyright (C) 2005 Scott Ullrich
+ Copyright (C) 2008 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Based originally on system_firmware.php
+ (C)2003-2004 Manuel Kasper
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/tar /usr/bin/nohup /bin/cat /sbin/sha256
+ pfSense_MODULE: firmware
+*/
+
+##|+PRIV
+##|*IDENT=page-system-firmware-checkforupdate
+##|*NAME=System: Firmware: Check For Update page
+##|*DESCR=Allow access to the 'System: Firmware: Check For Update' page.
+##|*MATCH=system_firmware_auto.php*
+##|-PRIV
+
+$nocsrf = true;
+
+require("guiconfig.inc");
+require_once("pfsense-utils.inc");
+
+$curcfg = $config['system']['firmware'];
+
+if (isset($curcfg['alturl']['enable'])) {
+ $updater_url = "{$config['system']['firmware']['alturl']['firmwareurl']}";
+} else {
+ $updater_url = $g['update_url'];
+}
+
+if ($_POST['backupbeforeupgrade']) {
+ touch("/tmp/perform_full_backup.txt");
+}
+
+$closehead = false;
+$pgtitle = array(gettext("Diagnostics"), gettext("Firmware"), gettext("Auto Update"));
+include("head.inc");
+
+?>
+
+<meta http-equiv="Content-Type" content="text/html; charset=<?=system_get_language_codeset();?>" />
+<link href="gui.css" rel="stylesheet" type="text/css" />
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+
+<form action="system_firmware_auto.php" method="post">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firmware auto-check">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
+ $tab_array[] = array(gettext("Auto Update"), true, "system_firmware_check.php");
+ $tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
+ if ($g['hidedownloadbackup'] == false) {
+ $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+ }
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="outer">
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="inner">
+ <tr>
+ <td align="center">
+ <table style="height:15;colspacing:0" width="420" border="0" cellpadding="0" cellspacing="0" summary="images">
+ <tr>
+ <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_left.gif')" height="15" width="5"> </td>
+ <td>
+ <table id="progholder" style="height:15;colspacing:0" width="410" border="0" cellpadding="0" cellspacing="0" summary="">
+ <tr>
+ <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_gray.gif')" valign="top" align="left">
+ <img src="./themes/<?=$g['theme'];?>/images/misc/bar_blue.gif" width="0" height="15" name="progressbar" id="progressbar" alt="" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_right.gif')" height="15" width="5"></td>
+ </tr>
+ </table>
+ <br />
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function() {
+ document.getElementById("status").wrap='hard';
+ document.getElementById("output").wrap='hard';
+ }
+ //]]>
+ </script>
+ <!-- status box -->
+ <textarea cols="90" rows="1" name="status" id="status"><?=gettext("Beginning firmware upgrade"); ?>.</textarea>
+ <br />
+ <!-- command output box -->
+ <textarea cols="90" rows="25" name="output" id="output"></textarea>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+
+<?php include("fend.inc"); ?>
+
+<?php
+
+update_status(gettext("Downloading current version information") . "...");
+$nanosize = "";
+if ($g['platform'] == "nanobsd") {
+ if (file_exists("/etc/nano_use_vga.txt")) {
+ $nanosize = "-nanobsd-vga-";
+ } else {
+ $nanosize = "-nanobsd-";
+ }
+
+ $nanosize .= strtolower(trim(file_get_contents("/etc/nanosize.txt")));
+}
+
+@unlink("/tmp/{$g['product_name']}_version");
+download_file_with_progress_bar("{$updater_url}/version{$nanosize}", "/tmp/{$g['product_name']}_version");
+$latest_version = str_replace("\n", "", @file_get_contents("/tmp/{$g['product_name']}_version"));
+if (!$latest_version) {
+ update_output_window(gettext("Unable to check for updates."));
+ require("fend.inc");
+ exit;
+} else {
+ $current_installed_buildtime = trim(file_get_contents("/etc/version.buildtime"));
+ $latest_version = trim(@file_get_contents("/tmp/{$g['product_name']}_version"));
+ $latest_version_pfsense = strtotime($latest_version);
+ if (!$latest_version) {
+ update_output_window(gettext("Unable to check for updates."));
+ require("fend.inc");
+ exit;
+ } else {
+ if (pfs_version_compare($current_installed_buildtime, $g['product_version'], $latest_version) == -1) {
+ update_status(gettext("Downloading updates") . "...");
+ conf_mount_rw();
+ if ($g['platform'] == "nanobsd") {
+ $update_filename = "latest{$nanosize}.img.gz";
+ } else {
+ $update_filename = "latest.tgz";
+ }
+ $status = download_file_with_progress_bar("{$updater_url}/{$update_filename}", "{$g['upload_path']}/latest.tgz", "read_body_firmware");
+ $status = download_file_with_progress_bar("{$updater_url}/{$update_filename}.sha256", "{$g['upload_path']}/latest.tgz.sha256");
+ conf_mount_ro();
+ update_output_window("{$g['product_name']} " . gettext("download complete."));
+ } else {
+ update_output_window(gettext("You are on the latest version."));
+ require("fend.inc");
+ exit;
+ }
+ }
+}
+
+/* launch external upgrade helper */
+$external_upgrade_helper_text = "/etc/rc.firmware ";
+
+if ($g['platform'] == "nanobsd") {
+ $external_upgrade_helper_text .= "pfSenseNanoBSDupgrade ";
+} else {
+ $external_upgrade_helper_text .= "pfSenseupgrade ";
+}
+
+$external_upgrade_helper_text .= "{$g['upload_path']}/latest.tgz";
+
+$downloaded_latest_tgz_sha256 = str_replace("\n", "", `/sbin/sha256 -q {$g['upload_path']}/latest.tgz`);
+$upgrade_latest_tgz_sha256 = str_replace("\n", "", `/bin/cat {$g['upload_path']}/latest.tgz.sha256 | awk '{ print $4 }'`);
+
+$sigchk = 0;
+
+if (!isset($curcfg['alturl']['enable'])) {
+ $sigchk = verify_digital_signature("{$g['upload_path']}/latest.tgz");
+}
+
+$exitstatus = 0;
+if ($sigchk == 1) {
+ $sig_warning = gettext("The digital signature on this image is invalid.");
+ $exitstatus = 1;
+} else if ($sigchk == 2) {
+ $sig_warning = gettext("This image is not digitally signed.");
+ if (!isset($config['system']['firmware']['allowinvalidsig'])) {
+ $exitstatus = 1;
+ }
+} else if (($sigchk >= 3)) {
+ $sig_warning = gettext("There has been an error verifying the signature on this image.");
+ $exitstatus = 1;
+}
+
+if ($exitstatus) {
+ update_status($sig_warning);
+ update_output_window(gettext("Update cannot continue. You can disable this check on the Updater Settings tab."));
+ require("fend.inc");
+ exit;
+} else if ($sigchk == 2) {
+ update_status("Upgrade in progress...");
+ update_output_window("\n" . gettext("Upgrade Image does not contain a signature but the system has been configured to allow unsigned images. One moment please...") . "\n");
+}
+
+if (!verify_gzip_file("{$g['upload_path']}/latest.tgz")) {
+ update_status(gettext("The image file is corrupt."));
+ update_output_window(gettext("Update cannot continue"));
+ if (file_exists("{$g['upload_path']}/latest.tgz")) {
+ conf_mount_rw();
+ unlink("{$g['upload_path']}/latest.tgz");
+ conf_mount_ro();
+ }
+ require("fend.inc");
+ exit;
+}
+
+if ($downloaded_latest_tgz_sha256 <> $upgrade_latest_tgz_sha256) {
+ update_status(gettext("Downloading complete but sha256 does not match."));
+ update_output_window(gettext("Auto upgrade aborted.") . " \n\n" . gettext("Downloaded SHA256") . ": " . $downloaded_latest_tgz_sha256 . "\n\n" . gettext("Needed SHA256") . ": " . $upgrade_latest_tgz_sha256);
+} else {
+ update_output_window($g['product_name'] . " " . gettext("is now upgrading.") . "\\n\\n" . gettext("The firewall will reboot once the operation is completed."));
+ echo "\n<script type=\"text/javascript\">";
+ echo "\n//<![CDATA[";
+ echo "\ndocument.progressbar.style.visibility='hidden';";
+ echo "\n//]]>";
+ echo "\n</script>";
+ mwexec_bg($external_upgrade_helper_text);
+}
+
+/*
+ Helper functions
+*/
+
+function read_body_firmware($ch, $string) {
+ global $g, $fout, $file_size, $downloaded, $counter, $version, $latest_version;
+ $length = strlen($string);
+ $downloaded += intval($length);
+ $downloadProgress = round(100 * (1 - $downloaded / $file_size), 0);
+ $downloadProgress = 100 - $downloadProgress;
+ $a = $file_size;
+ $b = $downloaded;
+ $c = $downloadProgress;
+ $text = " " . gettext("Auto Update Download Status") . "\\n";
+ $text .= "----------------------------------------------------\\n";
+ $text .= " " . gettext("Current Version") . " : {$g['product_version']}\\n";
+ $text .= " " . gettext("Latest Version") . " : {$latest_version}\\n";
+ $text .= " " . gettext("File size") . " : {$a}\\n";
+ $text .= " " . gettext("Downloaded") . " : {$b}\\n";
+ $text .= " " . gettext("Percent") . " : {$c}%\\n";
+ $text .= "----------------------------------------------------\\n";
+ $counter++;
+ if ($counter > 150) {
+ update_output_window($text);
+ update_progress_bar($downloadProgress);
+ $counter = 0;
+ }
+ fwrite($fout, $string);
+ return $length;
+}
+
+?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/system_firmware_check.php b/src/usr/local/www/system_firmware_check.php
new file mode 100644
index 0000000..2e56943
--- /dev/null
+++ b/src/usr/local/www/system_firmware_check.php
@@ -0,0 +1,206 @@
+<?php
+/* $Id$ */
+/*
+ system_firmware_check.php
+ Copyright (C) 2008 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: firmware
+*/
+
+##|+PRIV
+##|*IDENT=page-system-firmware-autoupdate
+##|*NAME=System: Firmware: Auto Update page
+##|*DESCR=Allow access to the 'System: Firmware: Auto Update' page.
+##|*MATCH=system_firmware_check.php*
+##|-PRIV
+
+$d_isfwfile = 1;
+require("guiconfig.inc");
+require_once("pfsense-utils.inc");
+
+$curcfg = $config['system']['firmware'];
+$pgtitle = array(gettext("System"), gettext("Firmware"), gettext("Auto Update"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php include("fbegin.inc"); ?>
+
+<form action="system_firmware_auto.php" method="post">
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firmware check">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
+ $tab_array[] = array(gettext("Auto Update"), true, "system_firmware_check.php");
+ $tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
+ if ($g['hidedownloadbackup'] == false) {
+ $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+ }
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="">
+ <tr>
+ <td align="center">
+ <!-- progress bar -->
+ <table style="height:15;colspacing:0" width="420" border="0" cellpadding="0" cellspacing="0" summary="images">
+
+ <tr>
+ <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_left.gif')" height="15" width="5"></td>
+ <td>
+ <table id="progholder" style="height:15;colspacing:0" width="410" border="0" cellpadding="0" cellspacing="0" summary="">
+ <tr>
+ <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_gray.gif')" valign="top" align="left">
+ <img src="./themes/<?=$g['theme'];?>/images/misc/bar_blue.gif" width="0" height="15" name="progressbar" id="progressbar" alt="" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td style="background:url('./themes/<?=$g['theme'];?>/images/misc/bar_right.gif')" height="15" width="5"></td>
+ </tr>
+ </table>
+ <br />
+ <!-- command output box -->
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function() {
+ document.getElementById("output").wrap='hard';
+ }
+ //]]>
+ </script>
+ <textarea style="border:1;bordercolordark:#000000;bordercolorlight:#000000" cols="90" rows="9" name="output" id="output"></textarea>
+ <div id="backupdiv" style="visibility:hidden">
+ <?php if ($g['hidebackupbeforeupgrade'] === false): ?>
+ <br /><input type="checkbox" name="backupbeforeupgrade" id="backupbeforeupgrade" /><?=gettext("Perform full backup prior to upgrade");?>
+ <?php endif; ?>
+ </div>
+ <input id='invokeupgrade' style='visibility:hidden' type="submit" value="<?=gettext("Invoke Auto Upgrade"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<p>
+
+<?php
+
+/* Define necessary variables. */
+if (isset($curcfg['alturl']['enable'])) {
+ $updater_url = "{$config['system']['firmware']['alturl']['firmwareurl']}";
+} else {
+ $updater_url = $g['update_url'];
+}
+$needs_system_upgrade = false;
+$static_text .= gettext("Downloading new version information...");
+
+$nanosize = "";
+if ($g['platform'] == "nanobsd") {
+ if (file_exists("/etc/nano_use_vga.txt")) {
+ $nanosize = "-nanobsd-vga-";
+ } else {
+ $nanosize = "-nanobsd-";
+ }
+
+ $nanosize .= strtolower(trim(file_get_contents("/etc/nanosize.txt")));
+}
+
+if (download_file_with_progress_bar("{$updater_url}/version{$nanosize}", "/tmp/{$g['product_name']}_version", 'read_body', 5, 5) === true) {
+ $remote_version = trim(@file_get_contents("/tmp/{$g['product_name']}_version"));
+}
+$static_text .= gettext("done") . "\\n";
+if (!$remote_version) {
+ $static_text .= gettext("Unable to check for updates.") . "\\n";
+ if (isset($curcfg['alturl']['enable'])) {
+ $static_text .= gettext("Could not contact custom update server.") . "\\n";
+ } else {
+ $static_text .= sprintf(gettext('Could not contact %1$s update server %2$s%3$s'), $g['product_name'], $updater_url, "\\n");
+ }
+} else {
+ $static_text .= gettext("Obtaining current version information...");
+ update_output_window($static_text);
+
+ $current_installed_buildtime = trim(file_get_contents("/etc/version.buildtime"));
+
+ $static_text .= "done\\n";
+ update_output_window($static_text);
+
+ if (pfs_version_compare($current_installed_buildtime, $g['product_version'], $remote_version) == -1) {
+ $needs_system_upgrade = true;
+ } else {
+ $static_text .= "\\n" . gettext("You are on the latest version.") . "\\n";
+ }
+}
+
+update_output_window($static_text);
+if ($needs_system_upgrade == false) {
+ echo "</p>";
+ echo "</form>";
+ require("fend.inc");
+ echo "</body>";
+ echo "</html>";
+ exit;
+}
+
+echo "\n<script type=\"text/javascript\">\n";
+echo "//<![CDATA[\n";
+echo "jQuery('#invokeupgrade').css('visibility','visible');\n";
+echo "//]]>\n";
+echo "</script>\n";
+echo "\n<script type=\"text/javascript\">\n";
+echo "//<![CDATA[\n";
+echo "jQuery('#backupdiv').css('visibility','visible');\n";
+echo "//]]>\n";
+echo "</script>\n";
+
+$txt = gettext("A new version is now available") . "\\n\\n";
+$txt .= gettext("Current version") . ": " . $g['product_version'] . "\\n";
+if ($g['platform'] == "nanobsd") {
+ $txt .= " " . gettext("NanoBSD Size") . " : " . trim(file_get_contents("/etc/nanosize.txt")) . "\\n";
+}
+$txt .= " " . gettext("Built On") . ": " . $current_installed_buildtime . "\\n";
+$txt .= " " . gettext("New version") . ": " . htmlspecialchars($remote_version, ENT_QUOTES | ENT_HTML401). "\\n\\n";
+$txt .= " " . gettext("Update source") . ": " . $updater_url . "\\n";
+update_output_window($txt);
+?>
+</p>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_firmware_restorefullbackup.php b/src/usr/local/www/system_firmware_restorefullbackup.php
new file mode 100644
index 0000000..3cf3f83
--- /dev/null
+++ b/src/usr/local/www/system_firmware_restorefullbackup.php
@@ -0,0 +1,220 @@
+<?php
+/* $Id$ */
+/*
+ system_firmware_restorefullbackup.php
+ Copyright (C) 2011 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ pfSense_BUILDER_BINARIES: /etc/rc.restore_full_backup
+ pfSense_MODULE: backup
+*/
+
+##|+PRIV
+##|*IDENT=page-diagnostics-restore-full-backup
+##|*NAME=Diagnostics: Restore full backup
+##|*DESCR=Allow access to the 'Diagnostics: Restore Full Backup' page.
+##|*MATCH=system_firmware_restorefullbackup.php
+##|-PRIV
+
+/* Allow additional execution time 0 = no limit. */
+ini_set('max_execution_time', '0');
+ini_set('max_input_time', '0');
+
+require_once("functions.inc");
+require("guiconfig.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+if ($_POST['overwriteconfigxml']) {
+ touch("/tmp/do_not_restore_config.xml");
+}
+
+if ($_GET['backupnow']) {
+ mwexec_bg("/etc/rc.create_full_backup");
+}
+
+if ($_GET['downloadbackup']) {
+ $filename = basename($_GET['downloadbackup']);
+ $path = "/root/{$filename}";
+ if (file_exists($path)) {
+ session_write_close();
+ ob_end_clean();
+ session_cache_limiter('public');
+ //$fd = fopen("/root/{$filename}", "rb");
+ $filesize = filesize("/root/{$filename}");
+ header("Cache-Control: ");
+ header("Pragma: ");
+ header("Content-Type: application/octet-stream");
+ header("Content-Length: " .(string)(filesize($path)));
+ header('Content-Disposition: attachment; filename="'.$filename.'"');
+ header("Content-Transfer-Encoding: binary\n");
+ if ($file = fopen("/root/{$filename}", 'rb')) {
+ while ((!feof($file)) && (connection_status() == 0)) {
+ print(fread($file, 1024*8));
+ flush();
+ }
+ fclose($file);
+ }
+
+ exit;
+ }
+}
+
+if ($_GET['deletefile']) {
+ $filename = basename($_GET['deletefile']);
+ if (file_exists("/root/{$filename}") && (preg_match("/pfSense-full-backup-\d+-\d+\.tgz/", $filename) == 1)) {
+ unlink("/root/" . $filename);
+ $savemsg = htmlspecialchars($filename) . " " . gettext("has been deleted.");
+ } else {
+ $savemsg = htmlspecialchars($filename) . " " . gettext("has not been been deleted (invalid backup file or file does not exist).");
+ }
+}
+
+if ($_POST['restorefile']) {
+ $filename = basename($_POST['restorefile']);
+ if (file_exists("/root/{$filename}") && (preg_match("/pfSense-full-backup-\d+-\d+\.tgz/", $filename) == 1)) {
+ mwexec_bg("/etc/rc.restore_full_backup /root/" . escapeshellcmd($filename));
+ $savemsg = gettext("The firewall is currently restoring") . " " . htmlspecialchars($filename);
+ } else {
+ $savemsg = htmlspecialchars($filename) . " " . gettext("has not been been restored (invalid backup file or file does not exist).");
+ }
+}
+
+$pgtitle = array(gettext("Diagnostics"), gettext("Restore full backup"));
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('restore')): ?>
+<p>
+ <form action="reboot.php" method="post">
+ <input name="Submit" type="hidden" value="Yes" />
+ <?php print_info_box(gettext("The firewall configuration has been changed.") . "<br />" . gettext("The firewall is now rebooting."));?><br />
+ </form>
+</p>
+<?php endif; ?>
+<form action="system_firmware_restorefullbackup.php" method="post">
+<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="restore full backup">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
+ $tab_array[] = array(gettext("Auto Update"), false, "system_firmware_check.php");
+ $tab_array[] = array(gettext("Updater Settings"), false, "system_firmware_settings.php");
+ if ($g['hidedownloadbackup'] == false) {
+ $tab_array[] = array(gettext("Restore Full Backup"), true, "system_firmware_restorefullbackup.php");
+ }
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" align="center" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="1" class="listtopic"><?=gettext("Filename"); ?></td>
+ <td colspan="1" class="listtopic"><?=gettext("Date"); ?></td>
+ <td colspan="1" class="listtopic"><?=gettext("Size"); ?></td>
+ <td colspan="1" class="listtopic"></td>
+ </tr>
+<?php
+ chdir("/root");
+ $available_restore_files = glob("pfSense-full-backup-*");
+ $counter = 0;
+ foreach ($available_restore_files as $arf) {
+ $counter++;
+ $size = exec("gzip -l /root/$arf | grep -v compressed | awk '{ print $2 }'");
+ echo "<tr>";
+ echo "<td class='listlr' width='50%' colspan='1'>";
+ echo "<input type='radio' name='restorefile' value='$arf' /> $arf";
+ echo "</td>";
+ echo "<td class='listr' width='30%' colspan='1'>";
+ echo date ("F d Y H:i:s", filemtime($arf));
+ echo "</td>";
+ echo "<td class='listr' width='40%' colspan='1'>";
+ echo format_bytes($size);
+ echo "</td>";
+ echo "<td class='listr nowrap' width='20%' colspan='1'>";
+ echo "<a onclick=\"return confirm('" . gettext("Do you really want to delete this backup?") . "')\" href='system_firmware_restorefullbackup.php?deletefile=" . htmlspecialchars($arf) . "'>";
+ echo gettext("Delete");
+ echo "</a> | ";
+ echo "<a href='system_firmware_restorefullbackup.php?downloadbackup=" . htmlspecialchars($arf) . "'>";
+ echo gettext("Download");
+ echo "</a>";
+ echo "</td>";
+ echo "</tr>";
+ }
+ if ($counter == 0) {
+ echo "<tr>";
+ echo "<td class='listlr' width='100%' colspan='4' align='center'>";
+ echo gettext("Could not locate any previous backups.");
+ echo "</td>";
+ echo "</tr>";
+ }
+?>
+ <tr>
+ <td width="78%" colspan="3">
+ &nbsp;<br />
+ <input type="checkbox" name="overwriteconfigxml" id="overwriteconfigxml" checked="checked" /> <?=gettext("do not restore config.xml."); ?>
+ <br />
+ <input name="Restore" type="submit" class="formbtn" id="restore" value="<?=gettext("Restore"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+
+<script type="text/javascript">
+//<![CDATA[
+encrypt_change();
+decrypt_change();
+//]]>
+</script>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
+<?php
+
+if (is_subsystem_dirty('restore')) {
+ system_reboot();
+}
+
+?>
diff --git a/src/usr/local/www/system_firmware_settings.php b/src/usr/local/www/system_firmware_settings.php
new file mode 100644
index 0000000..9f6c5e0
--- /dev/null
+++ b/src/usr/local/www/system_firmware_settings.php
@@ -0,0 +1,318 @@
+<?php
+/* $Id$ */
+/*
+ system_firmware_settings.php
+ part of pfSense
+ Copyright (C) 2005 Colin Smith
+ Copyright (C) 2008 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/fetch
+ pfSense_MODULE: firmware
+*/
+
+##|+PRIV
+##|*IDENT=page-system-firmware-settings
+##|*NAME=System: Firmware: Settings page
+##|*DESCR=Allow access to the 'System: Firmware: Settings' page.
+##|*MATCH=system_firmware_settings.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if ($_POST) {
+ unset($input_errors);
+
+ /* input validation */
+ if (($_POST['alturlenable'] == "yes") && (empty($_POST['firmwareurl']))) {
+ $input_errors[] = gettext("A Firmware Auto Update Base URL must be specified when \"Use an unofficial server for firmware upgrades\" is enabled.");
+ }
+
+ if (!$input_errors) {
+ if ($_POST['alturlenable'] == "yes") {
+ $config['system']['firmware']['alturl']['enable'] = true;
+ $config['system']['firmware']['alturl']['firmwareurl'] = $_POST['firmwareurl'];
+ } else {
+ unset($config['system']['firmware']['alturl']['enable']);
+ unset($config['system']['firmware']['alturl']['firmwareurl']);
+ unset($config['system']['firmware']['alturl']);
+ unset($config['system']['firmware']);
+ }
+ if ($_POST['allowinvalidsig'] == "yes") {
+ $config['system']['firmware']['allowinvalidsig'] = true;
+ } else {
+ unset($config['system']['firmware']['allowinvalidsig']);
+ }
+
+ if ($_POST['disablecheck'] == "yes") {
+ $config['system']['firmware']['disablecheck'] = true;
+ } else {
+ unset($config['system']['firmware']['disablecheck']);
+ }
+
+ if ($_POST['synconupgrade'] == "yes") {
+ $config['system']['gitsync']['synconupgrade'] = true;
+ } else {
+ unset($config['system']['gitsync']['synconupgrade']);
+ }
+ $config['system']['gitsync']['repositoryurl'] = $_POST['repositoryurl'];
+ $config['system']['gitsync']['branch'] = $_POST['branch'];
+
+ write_config();
+ }
+}
+
+$curcfg = $config['system']['firmware'];
+$gitcfg = $config['system']['gitsync'];
+
+$pgtitle = array(gettext("System"), gettext("Firmware"), gettext("Settings"));
+$closehead = false;
+include("head.inc");
+
+exec("/usr/bin/fetch -q -o {$g['tmp_path']}/manifest \"{$g['update_manifest']}\"");
+if (file_exists("{$g['tmp_path']}/manifest")) {
+ $preset_urls_split = explode("\n", file_get_contents("{$g['tmp_path']}/manifest"));
+}
+
+?>
+<script type="text/javascript">
+//<![CDATA[
+
+
+function enable_altfirmwareurl(enable_over) {
+ if (document.iform.alturlenable.checked || enable_over) {
+ document.iform.firmwareurl.disabled = 0;
+ } else {
+ document.iform.firmwareurl.disabled = 1;
+ document.iform.firmwareurl.value = '';
+ }
+}
+
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc");?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<form action="system_firmware_settings.php" method="post" name="iform" id="iform">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firmware settings">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Manual Update"), false, "system_firmware.php");
+ $tab_array[] = array(gettext("Auto Update"), false, "system_firmware_check.php");
+ $tab_array[] = array(gettext("Updater Settings"), true, "system_firmware_settings.php");
+ if ($g['hidedownloadbackup'] == false) {
+ $tab_array[] = array(gettext("Restore Full Backup"), false, "system_firmware_restorefullbackup.php");
+ }
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Firmware Branch"); ?></td>
+ </tr>
+<?php if (is_array($preset_urls_split)): ?>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Default Auto Update URLs"); ?></td>
+ <td class="vtable">
+ <select name='preseturls' id='preseturls' onchange="firmwareurl.value = preseturls.value; document.iform.firmwareurl.disabled = 0; alturlenable.checked=true; jQuery('#preseturls').parent().effect('highlight');">
+ <option></option>
+ <?php
+ foreach ($preset_urls_split as $pus) {
+ $pus_text = explode("\t", $pus);
+ if (empty($pus_text[0])) {
+ continue;
+ }
+ if (stristr($pus_text[0], php_uname("m")) !== false) {
+ $style = " style=\"font-weight: bold\"";
+ $yourarch = " (Current architecture)";
+ } else {
+ $style = "";
+ $yourarch = "";
+ }
+ echo "<option value='{$pus_text[1]}'{$style}>{$pus_text[0]}{$yourarch}</option>";
+ }
+ ?>
+ </select>
+ <br /><br /><?php echo sprintf(gettext("Entries denoted by \"Current architecture\" match the architecture of your current installation, such as %s. Changing architectures during an upgrade is not recommended, and may require a manual reboot after the update completes."), php_uname("m")); ?>
+ </td>
+ </tr>
+<?php endif; ?>
+ <tr>
+ <td valign="top" class="vncell"><?=gettext("Firmware Auto Update URL"); ?></td>
+ <td class="vtable">
+ <input name="alturlenable" type="checkbox" id="alturlenable" value="yes" onclick="enable_altfirmwareurl()" <?php if (isset($curcfg['alturl']['enable'])) echo "checked=\"checked\""; ?> /> <?=gettext("Use an unofficial server for firmware upgrades") ?><br />
+ <table summary="alternative Base URL">
+ <tr>
+ <td>
+ <?=gettext("Base URL:"); ?>
+ </td>
+ <td>
+ <input name="firmwareurl" type="text" class="formfld url" id="firmwareurl" size="64" value="<?php if ($curcfg['alturl']['firmwareurl']) echo htmlspecialchars($curcfg['alturl']['firmwareurl']); else echo $g['']; ?>" />
+ </td>
+ </tr>
+ </table>
+ <span class="vexpl">
+ <?=gettext("This is where"); ?> <?php echo $g['product_name'] ?> <?=gettext("will check for newer firmware versions when the"); ?> <a href="system_firmware_check.php"><?=gettext("System: Firmware: Auto Update"); ?></a> <?=gettext("page is viewed."); ?>
+ <br />
+ <b><?=gettext("NOTE:"); ?></b> <?php printf(gettext("When a custom URL is configured, the system will not verify the image has an official digital signature")); ?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Updates"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Unsigned images"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="allowinvalidsig" type="checkbox" id="allowinvalidsig" value="yes" <?php if (isset($curcfg['allowinvalidsig'])) echo "checked=\"checked\""; ?> />
+ <br />
+ <?=gettext("Allow auto-update firmware images with a missing or invalid digital signature to be used."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Dashboard check"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disablecheck" type="checkbox" id="disablecheck" value="yes" <?php if (isset($curcfg['disablecheck'])) echo "checked=\"checked\""; ?> />
+ <br />
+ <?=gettext("Disable the automatic dashboard auto-update check."); ?>
+ </td>
+ </tr>
+<?php
+ if (file_exists("/usr/local/bin/git") && $g['platform'] == "pfSense"):
+?>
+ <tr>
+ <td colspan="2" class="list" height="12">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Gitsync"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Auto sync on update"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="synconupgrade" type="checkbox" id="synconupgrade" value="yes" <?php if (isset($gitcfg['synconupgrade'])) echo "checked=\"checked\""; ?> />
+ <br />
+ <?=gettext("After updating, sync with the following repository/branch before reboot."); ?>
+ </td>
+ </tr>
+<?php
+ if (is_dir("/root/pfsense/pfSenseGITREPO/pfSenseGITREPO")) {
+ exec("cd /root/pfsense/pfSenseGITREPO/pfSenseGITREPO && git config remote.origin.url", $output_str);
+ if (is_array($output_str) && !empty($output_str[0])) {
+ $lastrepositoryurl = $output_str[0];
+ }
+ unset($output_str);
+ }
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Repository URL"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="repositoryurl" type="text" class="formfld url" id="repositoryurl" size="64" value="<?php if ($gitcfg['repositoryurl']) echo htmlspecialchars($gitcfg['repositoryurl']); ?>" />
+<?php
+ if ($lastrepositoryurl):
+?>
+ <br />
+ <?=sprintf(gettext("The most recently used repository was %s"), $lastrepositoryurl); ?>
+ <br />
+ <?=gettext("This will be used if the field is left blank."); ?>
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+<?php
+ if (is_dir("/root/pfsense/pfSenseGITREPO/pfSenseGITREPO")) {
+ exec("cd /root/pfsense/pfSenseGITREPO/pfSenseGITREPO && git branch", $output_str);
+ if (is_array($output_str)) {
+ foreach ($output_str as $output_line) {
+ if (strstr($output_line, '* ')) {
+ $lastbranch = substr($output_line, 2);
+ break;
+ }
+ }
+ }
+ unset($output_str);
+ }
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Branch name"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="branch" type="text" class="formfld unknown" id="branch" size="64" value="<?php if ($gitcfg['branch']) echo htmlspecialchars($gitcfg['branch']); ?>" />
+<?php
+ if ($lastbranch):
+?>
+ <br />
+ <?=sprintf(gettext("The most recently used branch was %s"), $lastbranch); ?>
+<?php
+ else:
+?>
+ <br />
+ <?=gettext("Usually the branch name is master"); ?>
+<?php
+ endif;
+?>
+ <br />
+ <?=gettext("Note: Sync will not be performed if a branch is not specified."); ?>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td>
+ <script type="text/javascript">
+ //<![CDATA[
+ enable_altfirmwareurl();
+ //]]>
+ </script>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_gateway_groups.php b/src/usr/local/www/system_gateway_groups.php
new file mode 100644
index 0000000..aeb0bad
--- /dev/null
+++ b/src/usr/local/www/system_gateway_groups.php
@@ -0,0 +1,235 @@
+<?php
+/* $Id$ */
+/*
+ system_gateway_groups.php
+ part of pfSense (https://www.pfsense.org)
+
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-system-gatewaygroups
+##|*NAME=System: Gateway Groups page
+##|*DESCR=Allow access to the 'System: Gateway Groups' page.
+##|*MATCH=system_gateway_groups.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("openvpn.inc");
+
+if (!is_array($config['gateways']['gateway_group'])) {
+ $config['gateways']['gateway_group'] = array();
+}
+
+$a_gateway_groups = &$config['gateways']['gateway_group'];
+$a_gateways = &$config['gateways']['gateway_item'];
+$changedesc = gettext("Gateway Groups") . ": ";
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+
+ $retval = 0;
+
+ $retval = system_routing_configure();
+ send_multiple_events(array("service reload dyndnsall", "service reload ipsecdns", "filter reload"));
+
+ /* reconfigure our gateway monitor */
+ setup_gateways_monitor();
+
+ $savemsg = get_std_save_message($retval);
+ if ($retval == 0) {
+ clear_subsystem_dirty('staticroutes');
+ }
+
+ foreach ($a_gateway_groups as $gateway_group) {
+ $gw_subsystem = 'gwgroup.' . $gateway_group['name'];
+ if (is_subsystem_dirty($gw_subsystem)) {
+ openvpn_resync_gwgroup($gateway_group['name']);
+ clear_subsystem_dirty($gw_subsystem);
+ }
+ }
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_gateway_groups[$_GET['id']]) {
+ $changedesc .= gettext("removed gateway group") . " {$_GET['id']}";
+ foreach ($config['filter']['rule'] as $idx => $rule) {
+ if ($rule['gateway'] == $a_gateway_groups[$_GET['id']]['name']) {
+ unset($config['filter']['rule'][$idx]['gateway']);
+ }
+ }
+ unset($a_gateway_groups[$_GET['id']]);
+ write_config($changedesc);
+ mark_subsystem_dirty('staticroutes');
+ header("Location: system_gateway_groups.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Gateway Groups"));
+$shortcut_section = "gateway-groups";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="system_gateway_groups.php" method="post">
+<input type="hidden" name="y1" value="1" />
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('staticroutes')): ?><br/>
+<?php print_info_box_np(sprintf(gettext("The gateway configuration has been changed.%sYou must apply the changes in order for them to take effect."), "<br />"));?><br /><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system groups">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Gateways"), false, "system_gateways.php");
+ $tab_array[1] = array(gettext("Routes"), false, "system_routes.php");
+ $tab_array[2] = array(gettext("Groups"), true, "system_gateway_groups.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <thead>
+ <tr>
+ <td width="15%" class="listhdrr"><?=gettext("Group Name");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Gateways");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Priority");?></td>
+ <td width="30%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td width="17"></td>
+ <td>
+ <a href="system_gateway_groups_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td width="17"></td>
+ <td>
+ <a href="system_gateway_groups_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+<?php
+ $i = 0;
+ foreach ($a_gateway_groups as $gateway_group):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='system_gateway_groups_edit.php?id=<?=$i;?>';">
+ <?php
+ echo $gateway_group['name'];
+ ?>
+ </td>
+ <td class="listr" ondblclick="document.location='system_gateway_groups_edit.php?id=<?=$i;?>';">
+ <?php
+ foreach ($gateway_group['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ echo htmlspecialchars(strtoupper($itemsplit[0])) . "<br />\n";
+ }
+ ?>
+ </td>
+ <td class="listr" ondblclick="document.location='system_gateway_groups_edit.php?id=<?=$i;?>';">
+ <?php
+ foreach ($gateway_group['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ echo "Tier ". htmlspecialchars($itemsplit[1]) . "<br />\n";
+ }
+ ?>
+ </td>
+ <td class="listbg" ondblclick="document.location='system_gateway_groups_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($gateway_group['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td>
+ <a href="system_gateway_groups_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" /></a>
+ </td>
+ <td>
+ <a href="system_gateway_groups.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this gateway group?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+ <tr>
+ <td width="17"></td>
+ <td>
+ <a href="system_gateway_groups_edit.php?dup=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="duplicate" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr style="display:none;">
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<p>
+ <b><?=gettext("Note:");?></b>
+ <?=gettext("Remember to use these Gateway Groups in firewall rules in order to enable load balancing, failover, or policy-based routing. Without rules directing traffic into the Gateway Groups, they will not be used.");?>
+</p>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_gateway_groups_edit.php b/src/usr/local/www/system_gateway_groups_edit.php
new file mode 100644
index 0000000..c5fcc3b
--- /dev/null
+++ b/src/usr/local/www/system_gateway_groups_edit.php
@@ -0,0 +1,378 @@
+<?php
+/* $Id$ */
+/*
+ system_gateway_groups_edit.php
+ part of pfSense (https://www.pfsense.org)
+
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-system-gateways-editgatewaygroups
+##|*NAME=System: Gateways: Edit Gateway Groups page
+##|*DESCR=Allow access to the 'System: Gateways: Edit Gateway Groups' page.
+##|*MATCH=system_gateway_groups_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_gateway_groups.php');
+}
+
+if (!is_array($config['gateways']['gateway_group'])) {
+ $config['gateways']['gateway_group'] = array();
+}
+
+$a_gateway_groups = &$config['gateways']['gateway_group'];
+$a_gateways = return_gateways_array();
+
+$categories = array(
+ 'down' => gettext("Member Down"),
+ 'downloss' => gettext("Packet Loss"),
+ 'downlatency' => gettext("High Latency"),
+ 'downlosslatency' => gettext("Packet Loss or High Latency"));
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ $id = $_GET['dup'];
+}
+
+if (isset($id) && $a_gateway_groups[$id]) {
+ $pconfig['name'] = $a_gateway_groups[$id]['name'];
+ $pconfig['item'] = &$a_gateway_groups[$id]['item'];
+ $pconfig['descr'] = $a_gateway_groups[$id]['descr'];
+ $pconfig['trigger'] = $a_gateway_groups[$id]['trigger'];
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ unset($id);
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "name");
+ $reqdfieldsn = explode(",", "Name");
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!isset($_POST['name'])) {
+ $input_errors[] = gettext("A valid gateway group name must be specified.");
+ }
+ if (!is_validaliasname($_POST['name'])) {
+ $input_errors[] = gettext("The gateway name must not contain invalid characters.");
+ }
+
+ if (isset($_POST['name'])) {
+ /* check for overlaps */
+ if (is_array($a_gateway_groups)) {
+ foreach ($a_gateway_groups as $gateway_group) {
+ if (isset($id) && ($a_gateway_groups[$id]) && ($a_gateway_groups[$id] === $gateway_group)) {
+ if ($gateway_group['name'] != $_POST['name']) {
+ $input_errors[] = gettext("Changing name on a gateway group is not allowed.");
+ }
+ continue;
+ }
+
+ if ($gateway_group['name'] == $_POST['name']) {
+ $input_errors[] = sprintf(gettext('A gateway group with this name "%s" already exists.'), $_POST['name']);
+ break;
+ }
+ }
+ }
+ }
+
+ /* Build list of items in group with priority */
+ $pconfig['item'] = array();
+ foreach ($a_gateways as $gwname => $gateway) {
+ if ($_POST[$gwname] > 0) {
+ $vipname = "{$gwname}_vip";
+ /* we have a priority above 0 (disabled), add item to list */
+ $pconfig['item'][] = "{$gwname}|{$_POST[$gwname]}|{$_POST[$vipname]}";
+ }
+ /* check for overlaps */
+ if ($_POST['name'] == $gwname) {
+ $input_errors[] = sprintf(gettext('A gateway group cannot have the same name with a gateway "%s" please choose another name.'), $_POST['name']);
+ }
+
+ }
+ if (count($pconfig['item']) == 0) {
+ $input_errors[] = gettext("No gateway(s) have been selected to be used in this group");
+ }
+
+ if (!$input_errors) {
+ $gateway_group = array();
+ $gateway_group['name'] = $_POST['name'];
+ $gateway_group['item'] = $pconfig['item'];
+ $gateway_group['trigger'] = $_POST['trigger'];
+ $gateway_group['descr'] = $_POST['descr'];
+
+ if (isset($id) && $a_gateway_groups[$id]) {
+ $a_gateway_groups[$id] = $gateway_group;
+ } else {
+ $a_gateway_groups[] = $gateway_group;
+ }
+
+ mark_subsystem_dirty('staticroutes');
+ mark_subsystem_dirty('gwgroup.' . $gateway_group['name']);
+
+ write_config();
+
+ header("Location: system_gateway_groups.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Gateways"), gettext("Edit gateway group"));
+$shortcut_section = "gateway-groups";
+
+function build_gateway_protocol_map (&$a_gateways) {
+ $result = array();
+ foreach ($a_gateways as $gwname => $gateway) {
+ $result[$gwname] = $gateway['ipprotocol'];
+ }
+ return $result;
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+
+<?php
+$gateway_protocol = build_gateway_protocol_map($a_gateways);
+$gateway_array = array_keys($a_gateways);
+$protocol_array = array_values($gateway_protocol);
+$protocol_array = array_values(array_unique($gateway_protocol));
+?>
+<script type="text/javascript">
+//<![CDATA[
+jQuery(function ($) {
+ var gateway_protocol = <?= json_encode($gateway_protocol) ?>;
+ var gateways = <?= json_encode($gateway_array) ?>;
+ var protocols = <?= json_encode($protocol_array) ?>;
+ if (protocols.length <= 1) { return; }
+
+ var update_gateway_visibilities = function () {
+ var which_protocol_to_show = undefined;
+ $.each(gateways, function (i, gateway) {
+ var $select = $("#" + gateway);
+ var value = $select.val();
+ var protocol = gateway_protocol[gateway];
+ if (value !== '0' /* i.e., an option is selected */) {
+ if (which_protocol_to_show === undefined) {
+ which_protocol_to_show = protocol;
+ } else if (which_protocol_to_show !== protocol) {
+ which_protocol_to_show = 'ALL OF THEM'; // this shouldn't happen
+ }
+ }
+ });
+ if (which_protocol_to_show !== undefined && which_protocol_to_show !== 'ALL OF THEM') {
+ $.each(gateways, function (i, gateway) {
+ var protocol = gateway_protocol[gateway];
+ var $row = $("tr.gateway_row#" + gateway + "_row");
+ if (protocol === which_protocol_to_show) {
+ if ($row.is(":hidden")) {
+ $row.fadeIn('slow');
+ }
+ } else {
+ if (!$row.is(":hidden")) {
+ $row.fadeOut('slow');
+ }
+ }
+ });
+ } else {
+ $("tr.gateway_row").each(function () {
+ if ($(this).is(":hidden")) {
+ $(this).fadeIn('slow');
+ }
+ });
+ }
+ };
+ $("select.gateway_tier_selector").change(update_gateway_visibilities);
+ update_gateway_visibilities();
+});
+//]]>
+</script>
+
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="system_gateway_groups_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="system groups edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit gateway group entry"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Group Name"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="name" type="text" class="formfld unknown" id="name" size="20" value="<?=htmlspecialchars($pconfig['name']);?>" />
+ <br /> <span class="vexpl"><?=gettext("Group Name"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Gateway Priority"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="6" cellspacing="0" summary="gateway priority">
+ <tr>
+ <td class="listhdrr">Gateway</td>
+ <td class="listhdrr">Tier</td>
+ <td class="listhdrr">Virtual IP</td>
+ <td class="listhdrr">Description</td>
+ </tr>
+ <?php
+ $carplist = get_configured_carp_interface_list($interface);
+ foreach ($a_gateways as $gwname => $gateway) {
+ if (!empty($pconfig['item'])) {
+ $af = explode("|", $pconfig['item'][0]);
+ $family = $a_gateways[$af[0]]['ipprotocol'];
+ if ($gateway['ipprotocol'] != $family) {
+ continue;
+ }
+ }
+ $interface = $gateway['friendlyiface'];
+ $selected = array();
+ foreach ((array)$pconfig['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ if ($itemsplit[0] == $gwname) {
+ $selected[$itemsplit[1]] = "selected=\"selected\"";
+ break;
+ } else {
+ $selected[0] = "selected=\"selected\"";
+ }
+ }
+ $tr_id = $gwname . "_row";
+ echo "<tr class='gateway_row' id='{$tr_id}'>\n";
+ echo "<td class='listlr'>";
+ echo "<strong>{$gateway['name']} </strong>";
+ echo "</td><td class='listr'>";
+ echo "<select name='{$gwname}' class='gateway_tier_selector formfldselect' id='{$gwname}'>\n";
+ echo "<option value='0' $selected[0] >" . gettext("Never") . "</option>\n";
+ echo "<option value='1' $selected[1] >" . gettext("Tier 1") . "</option>\n";
+ echo "<option value='2' $selected[2] >" . gettext("Tier 2") . "</option>\n";
+ echo "<option value='3' $selected[3] >" . gettext("Tier 3") . "</option>\n";
+ echo "<option value='4' $selected[4] >" . gettext("Tier 4") . "</option>\n";
+ echo "<option value='5' $selected[5] >" . gettext("Tier 5") . "</option>\n";
+ echo "</select>\n";
+ echo "</td>";
+
+ $selected = array();
+ foreach ((array)$pconfig['item'] as $item) {
+ $itemsplit = explode("|", $item);
+ if ($itemsplit[0] == $gwname) {
+ $selected[$itemsplit[2]] = "selected=\"selected\"";
+ break;
+ } else {
+ $selected['address'] = "selected=\"selected\"";
+ }
+ }
+ echo "<td class='listr'>";
+ echo "<select name='{$gwname}_vip' class='gateway_vip_selector formfldselect' id='{$gwname}_vip'>\n";
+ echo "<option value='address' {$selected['address']} >" . gettext("Interface Address") . "</option>\n";
+ foreach ($carplist as $vip => $address) {
+ echo "<!-- $vip - $address - $interface -->\n";
+ if (($gateway['ipprotocol'] == "inet") && (!is_ipaddrv4($address))) {
+ continue;
+ }
+ if (($gateway['ipprotocol'] == "inet6") && (!is_ipaddrv6($address))) {
+ continue;
+ }
+ echo "<option value='{$vip}' $selected[$vip] >$vip - $address</option>\n";
+ }
+ echo "</select></td>";
+ echo "<td class='listr'><strong>{$gateway['descr']}&nbsp;</strong>";
+ echo "</td></tr>";
+ }
+ ?>
+ </table>
+ <br /><span class="vexpl">
+ <strong><?=gettext("Link Priority"); ?></strong> <br />
+ <?=gettext("The priority selected here defines in what order failover and balancing of links will be done. " .
+ "Multiple links of the same priority will balance connections until all links in the priority will be exhausted. " .
+ "If all links in a priority level are exhausted we will use the next available link(s) in the next priority level.") ?>
+ <br />
+ <strong><?=gettext("Virtual IP"); ?></strong> <br />
+ <?=gettext("The virtual IP field selects what (virtual) IP should be used when this group applies to a local Dynamic DNS, IPsec or OpenVPN endpoint") ?>
+ </span><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Trigger Level"); ?></td>
+ <td width="78%" class="vtable">
+ <select name='trigger' class='formfldselect trigger_level_selector' id='trigger'>
+ <?php
+ foreach ($categories as $category => $categoryd) {
+ echo "<option value=\"$category\"";
+ if ($category == $pconfig['trigger']) {
+ echo " selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($categoryd) . "</option>\n";
+ }
+ ?>
+ </select>
+ <br /> <span class="vexpl"><?=gettext("When to trigger exclusion of a member"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br /> <span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_gateway_groups[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_gateways.php b/src/usr/local/www/system_gateways.php
new file mode 100644
index 0000000..850c5ba
--- /dev/null
+++ b/src/usr/local/www/system_gateways.php
@@ -0,0 +1,436 @@
+<?php
+/* $Id$ */
+/*
+ system_gateways.php
+ part of pfSense (https://www.pfsense.org)
+
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-system-gateways
+##|*NAME=System: Gateways page
+##|*DESCR=Allow access to the 'System: Gateways' page.
+##|*MATCH=system_gateways.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$a_gateways = return_gateways_array(true, false, true);
+$a_gateways_arr = array();
+foreach ($a_gateways as $gw) {
+ $a_gateways_arr[] = $gw;
+}
+$a_gateways = $a_gateways_arr;
+
+if (!is_array($config['gateways']['gateway_item'])) {
+ $config['gateways']['gateway_item'] = array();
+}
+
+$a_gateway_item = &$config['gateways']['gateway_item'];
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+
+ $retval = 0;
+
+ $retval = system_routing_configure();
+ $retval |= filter_configure();
+ /* reconfigure our gateway monitor */
+ setup_gateways_monitor();
+
+ $savemsg = get_std_save_message($retval);
+ if ($retval == 0) {
+ clear_subsystem_dirty('staticroutes');
+ }
+ }
+}
+
+function can_delete_disable_gateway_item($id, $disable = false) {
+ global $config, $input_errors, $a_gateways;
+
+ if (!isset($a_gateways[$id])) {
+ return false;
+ }
+
+ if (is_array($config['gateways']['gateway_group'])) {
+ foreach ($config['gateways']['gateway_group'] as $group) {
+ foreach ($group['item'] as $item) {
+ $items = explode("|", $item);
+ if ($items[0] == $a_gateways[$id]['name']) {
+ if (!$disable) {
+ $input_errors[] = sprintf(gettext("Gateway '%s' cannot be deleted because it is in use on Gateway Group '%s'"), $a_gateways[$id]['name'], $group['name']);
+ } else {
+ $input_errors[] = sprintf(gettext("Gateway '%s' cannot be disabled because it is in use on Gateway Group '%s'"), $a_gateways[$id]['name'], $group['name']);
+ }
+ }
+ }
+ }
+ }
+
+ if (is_array($config['staticroutes']['route'])) {
+ foreach ($config['staticroutes']['route'] as $route) {
+ if ($route['gateway'] == $a_gateways[$id]['name']) {
+ if (!$disable) {
+ // The user wants to delete this gateway, but there is a static route (enabled or disabled) that refers to the gateway.
+ $input_errors[] = sprintf(gettext("Gateway '%s' cannot be deleted because it is in use on Static Route '%s'"), $a_gateways[$id]['name'], $route['network']);
+ } else if (!isset($route['disabled'])) {
+ // The user wants to disable this gateway.
+ // But there is a static route that uses this gateway and is enabled (not disabled).
+ $input_errors[] = sprintf(gettext("Gateway '%s' cannot be disabled because it is in use on Static Route '%s'"), $a_gateways[$id]['name'], $route['network']);
+ }
+ }
+ }
+ }
+
+ if (isset($input_errors)) {
+ return false;
+ }
+
+ return true;
+}
+
+function delete_gateway_item($id) {
+ global $config, $a_gateways;
+
+ if (!isset($a_gateways[$id])) {
+ return;
+ }
+
+ /* NOTE: Cleanup static routes for the monitor ip if any */
+ if (!empty($a_gateways[$id]['monitor']) &&
+ $a_gateways[$id]['monitor'] != "dynamic" &&
+ is_ipaddr($a_gateways[$id]['monitor']) &&
+ $a_gateways[$id]['gateway'] != $a_gateways[$id]['monitor']) {
+ if (is_ipaddrv4($a_gateways[$id]['monitor'])) {
+ mwexec("/sbin/route delete " . escapeshellarg($a_gateways[$id]['monitor']));
+ } else {
+ mwexec("/sbin/route delete -inet6 " . escapeshellarg($a_gateways[$id]['monitor']));
+ }
+ }
+
+ if ($config['interfaces'][$a_gateways[$id]['friendlyiface']]['gateway'] == $a_gateways[$id]['name']) {
+ unset($config['interfaces'][$a_gateways[$id]['friendlyiface']]['gateway']);
+ }
+ unset($config['gateways']['gateway_item'][$a_gateways[$id]['attribute']]);
+}
+
+unset($input_errors);
+if ($_GET['act'] == "del") {
+ if (can_delete_disable_gateway_item($_GET['id'])) {
+ $realid = $a_gateways[$_GET['id']]['attribute'];
+ delete_gateway_item($_GET['id']);
+ write_config("Gateways: removed gateway {$realid}");
+ mark_subsystem_dirty('staticroutes');
+ header("Location: system_gateways.php");
+ exit;
+ }
+}
+
+if (isset($_POST['del_x'])) {
+ /* delete selected items */
+ if (is_array($_POST['rule']) && count($_POST['rule'])) {
+ foreach ($_POST['rule'] as $rulei) {
+ if (!can_delete_disable_gateway_item($rulei)) {
+ break;
+ }
+ }
+
+ if (!isset($input_errors)) {
+ $items_deleted = "";
+ foreach ($_POST['rule'] as $rulei) {
+ delete_gateway_item($rulei);
+ $items_deleted .= "{$rulei} ";
+ }
+ if (!empty($items_deleted)) {
+ write_config("Gateways: removed gateways {$items_deleted}");
+ mark_subsystem_dirty('staticroutes');
+ }
+ header("Location: system_gateways.php");
+ exit;
+ }
+ }
+
+} else if ($_GET['act'] == "toggle" && $a_gateways[$_GET['id']]) {
+ $realid = $a_gateways[$_GET['id']]['attribute'];
+ $disable_gw = !isset($a_gateway_item[$realid]['disabled']);
+ if ($disable_gw) {
+ // The user wants to disable the gateway, so check if that is OK.
+ $ok_to_toggle = can_delete_disable_gateway_item($_GET['id'], $disable_gw);
+ } else {
+ // The user wants to enable the gateway. That is always OK.
+ $ok_to_toggle = true;
+ }
+ if ($ok_to_toggle) {
+ if ($disable_gw) {
+ $a_gateway_item[$realid]['disabled'] = true;
+ } else {
+ unset($a_gateway_item[$realid]['disabled']);
+ }
+
+ if (write_config("Gateways: enable/disable")) {
+ mark_subsystem_dirty('staticroutes');
+ }
+
+ header("Location: system_gateways.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Gateways"));
+$shortcut_section = "gateways";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="system_gateways.php" method="post">
+<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('staticroutes')): ?><p>
+<?php print_info_box_np(gettext("The gateway configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));?><br /></p>
+<?php endif; ?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system gatewyas">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Gateways"), true, "system_gateways.php");
+ $tab_array[1] = array(gettext("Routes"), false, "system_routes.php");
+ $tab_array[2] = array(gettext("Groups"), false, "system_gateway_groups.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr id="frheader">
+ <td width="2%" class="list">&nbsp;</td>
+ <td width="2%" class="list">&nbsp;</td>
+ <td width="15%" class="listhdrr"><?=gettext("Name"); ?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Interface"); ?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Gateway"); ?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Monitor IP"); ?></td>
+ <td width="31%" class="listhdr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td>
+ <a href="system_gateways_edit.php">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $textse = "</span>";
+ $i = 0;
+ foreach ($a_gateways as $gateway):
+ if (isset($gateway['disabled']) || isset($gateway['inactive'])) {
+ $textss = "<span class=\"gray\">";
+ $iconfn = "pass_d";
+ } else {
+ $textss = "<span>";
+ $iconfn = "pass";
+ }
+?>
+ <tr valign="top" id="fr<?=$i;?>">
+ <td class="listt">
+<?php
+ if (is_numeric($gateway['attribute'])):
+?>
+ <input type="checkbox" id="frc<?=$i;?>" name="rule[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
+<?php
+ else:
+?>
+ &nbsp;
+<?php
+ endif;
+?>
+ </td>
+ <td class="listt" align="center">
+<?php
+ if (isset($gateway['inactive'])):
+?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_reject_d.gif" width="11" height="11" border="0"
+ title="<?=gettext("This gateway is inactive because interface is missing");?>" alt="icon" />
+<?php
+ elseif (is_numeric($gateway['attribute'])):
+?>
+ <a href="?act=toggle&amp;id=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
+ title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
+ </a>
+<?php
+ else:
+?>
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
+ title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
+<?php
+ endif;
+?>
+ </td>
+ <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ echo $gateway['name'];
+ if (isset($gateway['defaultgw'])) {
+ echo " <strong>(default)</strong>";
+ }
+ echo $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($gateway['friendlyiface']));
+ echo $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ echo $gateway['gateway'] . " ";
+ echo $textse;
+?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
+<?php
+ echo $textss;
+ echo htmlspecialchars($gateway['monitor']) . " ";
+ echo $textse;
+?>
+ </td>
+<?php
+ if (is_numeric($gateway['attribute'])):
+?>
+ <td class="listbg" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
+<?php
+ else:
+?>
+ <td class="listbgns" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
+<?php
+ endif;
+ echo $textss;
+ echo htmlspecialchars($gateway['descr']) . "&nbsp;";
+ echo $textse;
+?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td>
+ <a href="system_gateways_edit.php?id=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="edit" />
+ </a>
+ </td>
+<?php
+ if (is_numeric($gateway['attribute'])):
+?>
+ <td>
+ <a href="system_gateways.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this gateway?"); ?>')">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="delete" />
+ </a>
+ </td>
+<?php
+ else:
+?>
+ <td width='17'></td>
+<?php
+ endif;
+?>
+ </tr>
+ <tr>
+ <td width="17"></td>
+ <td>
+ <a href="system_gateways_edit.php?dup=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="7"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td>
+<?php
+ if ($i == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17"
+ title="<?=gettext("delete selected items");?>" border="0" alt="delete" />
+<?php
+ else:
+?>
+ <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
+ style="width:17;height:17" title="<?=gettext("delete selected items");?>"
+ onclick="return confirm('<?=gettext("Do you really want to delete the selected gateway items?");?>')" />
+<?php
+ endif;
+?>
+ </td>
+ <td>
+ <a href="system_gateways_edit.php">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="edit" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_gateways_edit.php b/src/usr/local/www/system_gateways_edit.php
new file mode 100644
index 0000000..af5e7cb
--- /dev/null
+++ b/src/usr/local/www/system_gateways_edit.php
@@ -0,0 +1,950 @@
+<?php
+/* $Id$ */
+/*
+ system_gateways_edit.php
+ part of pfSense (https://www.pfsense.org)
+
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-system-gateways-editgateway
+##|*NAME=System: Gateways: Edit Gateway page
+##|*DESCR=Allow access to the 'System: Gateways: Edit Gateway' page.
+##|*MATCH=system_gateways_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require("pkg-utils.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_gateways.php');
+}
+
+$a_gateways = return_gateways_array(true, false, true);
+$a_gateways_arr = array();
+foreach ($a_gateways as $gw) {
+ $a_gateways_arr[] = $gw;
+}
+$a_gateways = $a_gateways_arr;
+
+if (!is_array($config['gateways']['gateway_item'])) {
+ $config['gateways']['gateway_item'] = array();
+}
+
+$a_gateway_item = &$config['gateways']['gateway_item'];
+$apinger_default = return_apinger_defaults();
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ $id = $_GET['dup'];
+}
+
+if (isset($id) && $a_gateways[$id]) {
+ $pconfig = array();
+ $pconfig['name'] = $a_gateways[$id]['name'];
+ $pconfig['weight'] = $a_gateways[$id]['weight'];
+ $pconfig['interval'] = $a_gateways[$id]['interval'];
+ $pconfig['avg_delay_samples'] = $a_gateways[$id]['avg_delay_samples'];
+ $pconfig['avg_delay_samples_calculated'] = isset($a_gateways[$id]['avg_delay_samples_calculated']);
+ $pconfig['avg_loss_samples'] = $a_gateways[$id]['avg_loss_samples'];
+ $pconfig['avg_loss_samples_calculated'] = isset($a_gateways[$id]['avg_loss_samples_calculated']);
+ $pconfig['avg_loss_delay_samples'] = $a_gateways[$id]['avg_loss_delay_samples'];
+ $pconfig['avg_loss_delay_samples_calculated'] = isset($a_gateways[$id]['avg_loss_delay_samples_calculated']);
+ $pconfig['interface'] = $a_gateways[$id]['interface'];
+ $pconfig['friendlyiface'] = $a_gateways[$id]['friendlyiface'];
+ $pconfig['ipprotocol'] = $a_gateways[$id]['ipprotocol'];
+ if (isset($a_gateways[$id]['dynamic'])) {
+ $pconfig['dynamic'] = true;
+ }
+ $pconfig['gateway'] = $a_gateways[$id]['gateway'];
+ $pconfig['defaultgw'] = isset($a_gateways[$id]['defaultgw']);
+ $pconfig['force_down'] = isset($a_gateways[$id]['force_down']);
+ $pconfig['latencylow'] = $a_gateways[$id]['latencylow'];
+ $pconfig['latencyhigh'] = $a_gateways[$id]['latencyhigh'];
+ $pconfig['losslow'] = $a_gateways[$id]['losslow'];
+ $pconfig['losshigh'] = $a_gateways[$id]['losshigh'];
+ $pconfig['down'] = $a_gateways[$id]['down'];
+ $pconfig['monitor'] = $a_gateways[$id]['monitor'];
+ $pconfig['monitor_disable'] = isset($a_gateways[$id]['monitor_disable']);
+ $pconfig['descr'] = $a_gateways[$id]['descr'];
+ $pconfig['attribute'] = $a_gateways[$id]['attribute'];
+ $pconfig['disabled'] = isset($a_gateways[$id]['disabled']);
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ unset($id);
+ unset($pconfig['attribute']);
+}
+
+if (isset($id) && $a_gateways[$id]) {
+ $realid = $a_gateways[$id]['attribute'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+
+ /* input validation */
+ $reqdfields = explode(" ", "name interface");
+ $reqdfieldsn = array(gettext("Name"), gettext("Interface"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!isset($_POST['name'])) {
+ $input_errors[] = "A valid gateway name must be specified.";
+ }
+ if (!is_validaliasname($_POST['name'])) {
+ $input_errors[] = gettext("The gateway name must not contain invalid characters.");
+ } else if (isset($_POST['disabled'])) {
+ // We have a valid gateway name that the user wants to mark as disabled.
+ // Check if the gateway name is used in any gateway group.
+ if (is_array($config['gateways']['gateway_group'])) {
+ foreach ($config['gateways']['gateway_group'] as $group) {
+ foreach ($group['item'] as $item) {
+ $items = explode("|", $item);
+ if ($items[0] == $_POST['name']) {
+ $input_errors[] = sprintf(gettext("Gateway '%s' cannot be disabled because it is in use on Gateway Group '%s'"), $_POST['name'], $group['name']);
+ }
+ }
+ }
+ }
+
+ // Check if the gateway name is used in any enabled Static Route.
+ if (is_array($config['staticroutes']['route'])) {
+ foreach ($config['staticroutes']['route'] as $route) {
+ if ($route['gateway'] == $_POST['name']) {
+ if (!isset($route['disabled'])) {
+ // There is a static route that uses this gateway and is enabled (not disabled).
+ $input_errors[] = sprintf(gettext("Gateway '%s' cannot be disabled because it is in use on Static Route '%s'"), $_POST['name'], $route['network']);
+ }
+ }
+ }
+ }
+ }
+ /* skip system gateways which have been automatically added */
+ if (($_POST['gateway'] && (!is_ipaddr($_POST['gateway'])) && ($_POST['attribute'] !== "system")) && ($_POST['gateway'] != "dynamic")) {
+ $input_errors[] = gettext("A valid gateway IP address must be specified.");
+ }
+
+ if ($_POST['gateway'] && (is_ipaddr($_POST['gateway'])) && !$_REQUEST['isAjax']) {
+ if (is_ipaddrv4($_POST['gateway'])) {
+ $parent_ip = get_interface_ip($_POST['interface']);
+ $parent_sn = get_interface_subnet($_POST['interface']);
+ if (empty($parent_ip) || empty($parent_sn)) {
+ $input_errors[] = gettext("Cannot add IPv4 Gateway Address because no IPv4 address could be found on the interface.");
+ } else {
+ $subnets = array(gen_subnet($parent_ip, $parent_sn) . "/" . $parent_sn);
+ $vips = link_interface_to_vips($_POST['interface']);
+ if (is_array($vips)) {
+ foreach ($vips as $vip) {
+ if (!is_ipaddrv4($vip['subnet'])) {
+ continue;
+ }
+ $subnets[] = gen_subnet($vip['subnet'], $vip['subnet_bits']) . "/" . $vip['subnet_bits'];
+ }
+ }
+
+ $found = false;
+ foreach ($subnets as $subnet) {
+ if (ip_in_subnet($_POST['gateway'], $subnet)) {
+ $found = true;
+ break;
+ }
+ }
+
+ if ($found === false) {
+ $input_errors[] = sprintf(gettext("The gateway address %1\$s does not lie within one of the chosen interface's subnets."), $_POST['gateway']);
+ }
+ }
+ } else if (is_ipaddrv6($_POST['gateway'])) {
+ /* do not do a subnet match on a link local address, it's valid */
+ if (!is_linklocal($_POST['gateway'])) {
+ $parent_ip = get_interface_ipv6($_POST['interface']);
+ $parent_sn = get_interface_subnetv6($_POST['interface']);
+ if (empty($parent_ip) || empty($parent_sn)) {
+ $input_errors[] = gettext("Cannot add IPv6 Gateway Address because no IPv6 address could be found on the interface.");
+ } else {
+ $subnets = array(gen_subnetv6($parent_ip, $parent_sn) . "/" . $parent_sn);
+ $vips = link_interface_to_vips($_POST['interface']);
+ if (is_array($vips)) {
+ foreach ($vips as $vip) {
+ if (!is_ipaddrv6($vip['subnet'])) {
+ continue;
+ }
+ $subnets[] = gen_subnetv6($vip['subnet'], $vip['subnet_bits']) . "/" . $vip['subnet_bits'];
+ }
+ }
+
+ $found = false;
+ foreach ($subnets as $subnet) {
+ if (ip_in_subnet($_POST['gateway'], $subnet)) {
+ $found = true;
+ break;
+ }
+ }
+
+ if ($found === false) {
+ $input_errors[] = sprintf(gettext("The gateway address %1\$s does not lie within one of the chosen interface's subnets."), $_POST['gateway']);
+ }
+ }
+ }
+ }
+
+ if (!empty($config['interfaces'][$_POST['interface']]['ipaddr'])) {
+ if (is_ipaddr($config['interfaces'][$_POST['interface']]['ipaddr']) && (empty($_POST['gateway']) || $_POST['gateway'] == "dynamic")) {
+ $input_errors[] = gettext("Dynamic gateway values cannot be specified for interfaces with a static IPv4 configuration.");
+ }
+ }
+ if (!empty($config['interfaces'][$_POST['interface']]['ipaddrv6'])) {
+ if (is_ipaddr($config['interfaces'][$_POST['interface']]['ipaddrv6']) && (empty($_POST['gateway']) || $_POST['gateway'] == "dynamic")) {
+ $input_errors[] = gettext("Dynamic gateway values cannot be specified for interfaces with a static IPv6 configuration.");
+ }
+ }
+ }
+ if (($_POST['monitor'] <> "") && !is_ipaddr($_POST['monitor']) && $_POST['monitor'] != "dynamic") {
+ $input_errors[] = gettext("A valid monitor IP address must be specified.");
+ }
+ /* only allow correct IPv4 and IPv6 gateway addresses */
+ if (($_POST['gateway'] <> "") && is_ipaddr($_POST['gateway']) && $_POST['gateway'] != "dynamic") {
+ if (is_ipaddrv6($_POST['gateway']) && ($_POST['ipprotocol'] == "inet")) {
+ $input_errors[] = gettext("The IPv6 gateway address '{$_POST['gateway']}' can not be used as a IPv4 gateway'.");
+ }
+ if (is_ipaddrv4($_POST['gateway']) && ($_POST['ipprotocol'] == "inet6")) {
+ $input_errors[] = gettext("The IPv4 gateway address '{$_POST['gateway']}' can not be used as a IPv6 gateway'.");
+ }
+ }
+ /* only allow correct IPv4 and IPv6 monitor addresses */
+ if (($_POST['monitor'] <> "") && is_ipaddr($_POST['monitor']) && $_POST['monitor'] != "dynamic") {
+ if (is_ipaddrv6($_POST['monitor']) && ($_POST['ipprotocol'] == "inet")) {
+ $input_errors[] = gettext("The IPv6 monitor address '{$_POST['monitor']}' can not be used on a IPv4 gateway'.");
+ }
+ if (is_ipaddrv4($_POST['monitor']) && ($_POST['ipprotocol'] == "inet6")) {
+ $input_errors[] = gettext("The IPv4 monitor address '{$_POST['monitor']}' can not be used on a IPv6 gateway'.");
+ }
+ }
+
+ if (isset($_POST['name'])) {
+ /* check for overlaps */
+ foreach ($a_gateways as $gateway) {
+ if (isset($id) && ($a_gateways[$id]) && ($a_gateways[$id] === $gateway)) {
+ if ($gateway['name'] != $_POST['name']) {
+ $input_errors[] = gettext("Changing name on a gateway is not allowed.");
+ }
+ continue;
+ }
+ if ($_POST['name'] <> "") {
+ if (($gateway['name'] <> "") && ($_POST['name'] == $gateway['name']) && ($gateway['attribute'] !== "system")) {
+ $input_errors[] = sprintf(gettext('The gateway name "%s" already exists.'), $_POST['name']);
+ break;
+ }
+ }
+ if (is_ipaddr($_POST['gateway'])) {
+ if (($gateway['gateway'] <> "") && ($_POST['gateway'] == $gateway['gateway']) && ($gateway['attribute'] !== "system")) {
+ $input_errors[] = sprintf(gettext('The gateway IP address "%s" already exists.'), $_POST['gateway']);
+ break;
+ }
+ }
+ if (is_ipaddr($_POST['monitor'])) {
+ if (($gateway['monitor'] <> "") && ($_POST['monitor'] == $gateway['monitor']) && ($gateway['attribute'] !== "system")) {
+ $input_errors[] = sprintf(gettext('The monitor IP address "%s" is already in use. You must choose a different monitor IP.'), $_POST['monitor']);
+ break;
+ }
+ }
+ }
+ }
+
+ /* input validation of apinger advanced parameters */
+ if ($_POST['latencylow']) {
+ if (!is_numeric($_POST['latencylow'])) {
+ $input_errors[] = gettext("The low latency threshold needs to be a numeric value.");
+ } else {
+ if ($_POST['latencylow'] < 1) {
+ $input_errors[] = gettext("The low latency threshold needs to be positive.");
+ }
+ }
+ }
+
+ if ($_POST['latencyhigh']) {
+ if (!is_numeric($_POST['latencyhigh'])) {
+ $input_errors[] = gettext("The high latency threshold needs to be a numeric value.");
+ } else {
+ if ($_POST['latencyhigh'] < 1) {
+ $input_errors[] = gettext("The high latency threshold needs to be positive.");
+ }
+ }
+ }
+
+ if ($_POST['losslow']) {
+ if (!is_numeric($_POST['losslow'])) {
+ $input_errors[] = gettext("The low Packet Loss threshold needs to be a numeric value.");
+ } else {
+ if ($_POST['losslow'] < 1) {
+ $input_errors[] = gettext("The low Packet Loss threshold needs to be positive.");
+ }
+ if ($_POST['losslow'] >= 100) {
+ $input_errors[] = gettext("The low Packet Loss threshold needs to be less than 100.");
+ }
+ }
+ }
+
+ if ($_POST['losshigh']) {
+ if (!is_numeric($_POST['losshigh'])) {
+ $input_errors[] = gettext("The high Packet Loss threshold needs to be a numeric value.");
+ } else {
+ if ($_POST['losshigh'] < 1) {
+ $input_errors[] = gettext("The high Packet Loss threshold needs to be positive.");
+ }
+ if ($_POST['losshigh'] > 100) {
+ $input_errors[] = gettext("The high Packet Loss threshold needs to be 100 or less.");
+ }
+ }
+ }
+
+ if (($_POST['latencylow']) && ($_POST['latencyhigh'])) {
+ if ((is_numeric($_POST['latencylow'])) && (is_numeric($_POST['latencyhigh']))) {
+ if (($_POST['latencylow'] > $_POST['latencyhigh'])) {
+ $input_errors[] = gettext("The high latency threshold needs to be higher than the low latency threshold");
+ }
+ }
+ } else {
+ if ($_POST['latencylow']) {
+ if (is_numeric($_POST['latencylow'])) {
+ if ($_POST['latencylow'] > $apinger_default['latencyhigh']) {
+ $input_errors[] = gettext(sprintf("The low latency threshold needs to be less than the default high latency threshold (%d)", $apinger_default['latencyhigh']));
+ }
+ }
+ }
+ if ($_POST['latencyhigh']) {
+ if (is_numeric($_POST['latencyhigh'])) {
+ if ($_POST['latencyhigh'] < $apinger_default['latencylow']) {
+ $input_errors[] = gettext(sprintf("The high latency threshold needs to be higher than the default low latency threshold (%d)", $apinger_default['latencylow']));
+ }
+ }
+ }
+ }
+
+ if (($_POST['losslow']) && ($_POST['losshigh'])) {
+ if ((is_numeric($_POST['losslow'])) && (is_numeric($_POST['losshigh']))) {
+ if ($_POST['losslow'] > $_POST['losshigh']) {
+ $input_errors[] = gettext("The high Packet Loss threshold needs to be higher than the low Packet Loss threshold");
+ }
+ }
+ } else {
+ if ($_POST['losslow']) {
+ if (is_numeric($_POST['losslow'])) {
+ if ($_POST['losslow'] > $apinger_default['losshigh']) {
+ $input_errors[] = gettext(sprintf("The low Packet Loss threshold needs to be less than the default high Packet Loss threshold (%d)", $apinger_default['losshigh']));
+ }
+ }
+ }
+ if ($_POST['losshigh']) {
+ if (is_numeric($_POST['losshigh'])) {
+ if ($_POST['losshigh'] < $apinger_default['losslow']) {
+ $input_errors[] = gettext(sprintf("The high Packet Loss threshold needs to be higher than the default low Packet Loss threshold (%d)", $apinger_default['losslow']));
+ }
+ }
+ }
+ }
+
+ if ($_POST['interval']) {
+ if (!is_numeric($_POST['interval'])) {
+ $input_errors[] = gettext("The probe interval needs to be a numeric value.");
+ } else {
+ if ($_POST['interval'] < 1) {
+ $input_errors[] = gettext("The probe interval needs to be positive.");
+ }
+ }
+ }
+
+ if ($_POST['down']) {
+ if (!is_numeric($_POST['down'])) {
+ $input_errors[] = gettext("The down time setting needs to be a numeric value.");
+ } else {
+ if ($_POST['down'] < 1) {
+ $input_errors[] = gettext("The down time setting needs to be positive.");
+ }
+ }
+ }
+
+ if (($_POST['interval']) && ($_POST['down'])) {
+ if ((is_numeric($_POST['interval'])) && (is_numeric($_POST['down']))) {
+ if ($_POST['interval'] > $_POST['down']) {
+ $input_errors[] = gettext("The probe interval needs to be less than the down time setting.");
+ }
+ }
+ } else {
+ if ($_POST['interval']) {
+ if (is_numeric($_POST['interval'])) {
+ if ($_POST['interval'] > $apinger_default['down']) {
+ $input_errors[] = gettext(sprintf("The probe interval needs to be less than the default down time setting (%d)", $apinger_default['down']));
+ }
+ }
+ }
+ if ($_POST['down']) {
+ if (is_numeric($_POST['down'])) {
+ if ($_POST['down'] < $apinger_default['interval']) {
+ $input_errors[] = gettext(sprintf("The down time setting needs to be higher than the default probe interval (%d)", $apinger_default['interval']));
+ }
+ }
+ }
+ }
+
+ if ($_POST['avg_delay_samples']) {
+ if (!is_numeric($_POST['avg_delay_samples'])) {
+ $input_errors[] = gettext("The average delay replies qty needs to be a numeric value.");
+ } else {
+ if ($_POST['avg_delay_samples'] < 1) {
+ $input_errors[] = gettext("The average delay replies qty needs to be positive.");
+ }
+ }
+ }
+
+ if ($_POST['avg_loss_samples']) {
+ if (!is_numeric($_POST['avg_loss_samples'])) {
+ $input_errors[] = gettext("The average packet loss probes qty needs to be a numeric value.");
+ } else {
+ if ($_POST['avg_loss_samples'] < 1) {
+ $input_errors[] = gettext("The average packet loss probes qty needs to be positive.");
+ }
+ }
+ }
+
+ if ($_POST['avg_loss_delay_samples']) {
+ if (!is_numeric($_POST['avg_loss_delay_samples'])) {
+ $input_errors[] = gettext("The lost probe delay needs to be a numeric value.");
+ } else {
+ if ($_POST['avg_loss_delay_samples'] < 1) {
+ $input_errors[] = gettext("The lost probe delay needs to be positive.");
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ $reloadif = "";
+ $gateway = array();
+
+ if (empty($_POST['interface'])) {
+ $gateway['interface'] = $pconfig['friendlyiface'];
+ } else {
+ $gateway['interface'] = $_POST['interface'];
+ }
+ if (is_ipaddr($_POST['gateway'])) {
+ $gateway['gateway'] = $_POST['gateway'];
+ } else {
+ $gateway['gateway'] = "dynamic";
+ }
+ $gateway['name'] = $_POST['name'];
+ $gateway['weight'] = $_POST['weight'];
+ $gateway['ipprotocol'] = $_POST['ipprotocol'];
+ $gateway['interval'] = $_POST['interval'];
+
+ $gateway['avg_delay_samples'] = $_POST['avg_delay_samples'];
+ if ($_POST['avg_delay_samples_calculated'] == "yes" || $_POST['avg_delay_samples_calculated'] == "on") {
+ $gateway['avg_delay_samples_calculated'] = true;
+ }
+
+ $gateway['avg_loss_samples'] = $_POST['avg_loss_samples'];
+ if ($_POST['avg_loss_samples_calculated'] == "yes" || $_POST['avg_loss_samples_calculated'] == "on") {
+ $gateway['avg_loss_samples_calculated'] = true;
+ }
+
+ $gateway['avg_loss_delay_samples'] = $_POST['avg_loss_delay_samples'];
+ if ($_POST['avg_loss_delay_samples_calculated'] == "yes" || $_POST['avg_loss_delay_samples_calculated'] == "on") {
+ $gateway['avg_loss_delay_samples_calculated'] = true;
+ }
+
+ $gateway['descr'] = $_POST['descr'];
+ if ($_POST['monitor_disable'] == "yes") {
+ $gateway['monitor_disable'] = true;
+ }
+ if ($_POST['force_down'] == "yes") {
+ $gateway['force_down'] = true;
+ }
+ if (is_ipaddr($_POST['monitor'])) {
+ $gateway['monitor'] = $_POST['monitor'];
+ }
+
+ /* NOTE: If monitor ip is changed need to cleanup the old static route */
+ if ($_POST['monitor'] != "dynamic" && !empty($a_gateway_item[$realid]) && is_ipaddr($a_gateway_item[$realid]['monitor']) &&
+ $_POST['monitor'] != $a_gateway_item[$realid]['monitor'] && $gateway['gateway'] != $a_gateway_item[$realid]['monitor']) {
+ if (is_ipaddrv4($a_gateway_item[$realid]['monitor'])) {
+ mwexec("/sbin/route delete " . escapeshellarg($a_gateway_item[$realid]['monitor']));
+ } else {
+ mwexec("/sbin/route delete -inet6 " . escapeshellarg($a_gateway_item[$realid]['monitor']));
+ }
+ }
+
+ if ($_POST['defaultgw'] == "yes" || $_POST['defaultgw'] == "on") {
+ $i = 0;
+ /* remove the default gateway bits for all gateways with the same address family */
+ foreach ($a_gateway_item as $gw) {
+ if ($gateway['ipprotocol'] == $gw['ipprotocol']) {
+ unset($config['gateways']['gateway_item'][$i]['defaultgw']);
+ if ($gw['interface'] != $_POST['interface'] && $gw['defaultgw']) {
+ $reloadif = $gw['interface'];
+ }
+ }
+ $i++;
+ }
+ $gateway['defaultgw'] = true;
+ }
+
+ if ($_POST['latencylow']) {
+ $gateway['latencylow'] = $_POST['latencylow'];
+ }
+ if ($_POST['latencyhigh']) {
+ $gateway['latencyhigh'] = $_POST['latencyhigh'];
+ }
+ if ($_POST['losslow']) {
+ $gateway['losslow'] = $_POST['losslow'];
+ }
+ if ($_POST['losshigh']) {
+ $gateway['losshigh'] = $_POST['losshigh'];
+ }
+ if ($_POST['down']) {
+ $gateway['down'] = $_POST['down'];
+ }
+
+ if (isset($_POST['disabled'])) {
+ $gateway['disabled'] = true;
+ } else {
+ unset($gateway['disabled']);
+ }
+
+ /* when saving the manual gateway we use the attribute which has the corresponding id */
+ if (isset($realid) && $a_gateway_item[$realid]) {
+ $a_gateway_item[$realid] = $gateway;
+ } else {
+ $a_gateway_item[] = $gateway;
+ }
+
+ mark_subsystem_dirty('staticroutes');
+
+ write_config();
+
+ if ($_REQUEST['isAjax']) {
+ echo $_POST['name'];
+ exit;
+ } else if (!empty($reloadif)) {
+ send_event("interface reconfigure {$reloadif}");
+ }
+
+ header("Location: system_gateways.php");
+ exit;
+ } else {
+ if ($_REQUEST['isAjax']) {
+ header("HTTP/1.0 500 Internal Server Error");
+ header("Content-type: text/plain");
+ foreach ($input_errors as $error) {
+ echo("$error\n");
+ }
+ exit;
+ }
+
+ $pconfig = $_POST;
+ if (empty($_POST['friendlyiface'])) {
+ $pconfig['friendlyiface'] = $_POST['interface'];
+ }
+ }
+}
+
+
+$pgtitle = array(gettext("System"), gettext("Gateways"), gettext("Edit gateway"));
+$shortcut_section = "gateways";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+function show_advanced_gateway() {
+ document.getElementById("showadvgatewaybox").innerHTML='';
+ aodiv = document.getElementById('showgatewayadv');
+ aodiv.style.display = "block";
+}
+function monitor_change() {
+ document.iform.monitor.disabled = document.iform.monitor_disable.checked;
+}
+
+function interval_change(interval_obj) {
+ valid_value(interval_obj, 1, 86400);
+ calculate_state_change();
+
+ calculated_change(document.iform.avg_delay_samples_calculated, document.iform.avg_delay_samples);
+ calculated_change(document.iform.avg_loss_samples_calculated, document.iform.avg_loss_samples);
+ calculated_change(document.iform.avg_loss_delay_samples_calculated, document.iform.avg_loss_delay_samples);
+}
+
+function samples_change(calculated_obj, samples_obj) {
+ calculated_change(calculated_obj, samples_obj);
+}
+
+function calculated_change(calculated_obj, samples_obj) {
+ switch (samples_obj.name) {
+
+ case 'avg_delay_samples':
+ // How many replies should be used to compute average delay
+ // for controlling "delay" alarms.
+ // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60).
+ if (calculated_obj.checked && (document.iform.interval.value > 0)) {
+ samples_obj.value = 60 * (1/6) / Math.pow(document.iform.interval.value, 0.333); // Calculate & Round to Integer
+ }
+ valid_value(samples_obj, 1, 100);
+ break;
+
+ case 'avg_loss_samples':
+ // How many probes should be used to compute average loss.
+ // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60).
+ if (calculated_obj.checked && (document.iform.interval.value > 0)) {
+ samples_obj.value = 60 / document.iform.interval.value; // Calculate & Round to Integer
+ }
+ valid_value(samples_obj, 1, 1000);
+ break;
+
+ case 'avg_loss_delay_samples':
+ // The delay (in samples) after which loss is computed
+ // without this delays larger than interval would be treated as loss.
+ // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60).
+ if (calculated_obj.checked && (document.iform.interval.value > 0)) {
+ samples_obj.value = 60 * (1/3) / document.iform.interval.value; // Calculate & Round to Integer
+ }
+ valid_value(samples_obj, 1, 200);
+ break;
+ default:
+ }
+
+ calculate_state_change();
+}
+
+function valid_value(object, min, max) {
+ if (object.value) {
+ object.value = Math.round(object.value); // Round to integer
+ if (object.value < min) object.value = min; // Min Value
+ if (object.value > max) object.value = max; // Max Value
+ if (isNaN(object.value)) object.value = ''; // Empty Value
+ }
+}
+
+function calculate_state_change() {
+ if (document.iform.interval.value > 0) {
+ document.iform.avg_delay_samples_calculated.disabled = false;
+ document.iform.avg_loss_samples_calculated.disabled = false;
+ document.iform.avg_loss_delay_samples_calculated.disabled = false;
+
+ document.iform.avg_delay_samples.disabled = document.iform.avg_delay_samples_calculated.checked;
+ document.iform.avg_loss_samples.disabled = document.iform.avg_loss_samples_calculated.checked;
+ document.iform.avg_loss_delay_samples.disabled = document.iform.avg_loss_delay_samples_calculated.checked;
+ } else {
+ document.iform.avg_delay_samples_calculated.disabled = true;
+ document.iform.avg_loss_samples_calculated.disabled = true;
+ document.iform.avg_loss_delay_samples_calculated.disabled = true;
+ document.iform.interval.value = '';
+
+ document.iform.avg_delay_samples.disabled = false;
+ document.iform.avg_loss_samples.disabled = false;
+ document.iform.avg_loss_delay_samples.disabled = false;
+
+ document.iform.avg_delay_samples_calculated.checked = false;
+ document.iform.avg_loss_samples_calculated.checked = false;
+ document.iform.avg_loss_delay_samples_calculated.checked = false;
+ }
+}
+
+function enable_change() {
+ document.iform.avg_delay_samples.disabled = false;
+ document.iform.avg_loss_samples.disabled = false;
+ document.iform.avg_loss_delay_samples.disabled = false;
+}
+//]]>
+</script>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+ <form action="system_gateways_edit.php" method="post" name="iform" id="iform">
+ <?php
+
+ /* If this is a system gateway we need this var */
+ if (($pconfig['attribute'] == "system") || is_numeric($pconfig['attribute'])) {
+ echo "<input type='hidden' name='attribute' id='attribute' value=\"" . htmlspecialchars($pconfig['attribute']) . "\" />\n";
+ }
+ echo "<input type='hidden' name='friendlyiface' id='friendlyiface' value=\"" . htmlspecialchars($pconfig['friendlyiface']) . "\" />\n";
+ ?>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="system gateways edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit gateway"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled");?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable this gateway");?></strong><br />
+ <span class="vexpl"><?=gettext("Set this option to disable this gateway without removing it from the list.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name='interface' class='formselect'>
+ <?php
+ $interfaces = get_configured_interface_with_descr(false, true);
+ foreach ($interfaces as $iface => $ifacename) {
+ echo "<option value=\"{$iface}\"";
+ if ($iface == $pconfig['friendlyiface']) {
+ echo " selected='selected'";
+ }
+ echo ">" . htmlspecialchars($ifacename) . "</option>";
+ }
+ ?>
+ </select><br />
+ <span class="vexpl"><?=gettext("Choose which interface this gateway applies to."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Address Family"); ?></td>
+ <td width="78%" class="vtable">
+ <select name='ipprotocol' class='formselect' >
+ <?php
+ $options = array("inet" => "IPv4", "inet6" => "IPv6");
+ foreach ($options as $name => $string) {
+ echo "<option value=\"{$name}\"";
+ if ($name == $pconfig['ipprotocol']) {
+ echo " selected='selected'";
+ }
+ echo ">" . htmlspecialchars($string) . "</option>\n";
+ }
+ ?>
+ </select><br />
+ <span class="vexpl"><?=gettext("Choose the Internet Protocol this gateway uses."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="name" type="text" class="formfld unknown" id="name" size="20" value="<?=htmlspecialchars($pconfig['name']);?>" />
+ <br /><span class="vexpl"><?=gettext("Gateway name"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Gateway"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="gateway" type="text" class="formfld host" id="gateway" size="28" value="<?php if ($pconfig['dynamic']) echo "dynamic"; else echo htmlspecialchars($pconfig['gateway']); ?>" />
+ <br /><span class="vexpl"><?=gettext("Gateway IP address"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Default Gateway"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="defaultgw" type="checkbox" id="defaultgw" value="yes" <?php if ($pconfig['defaultgw'] == true) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Default Gateway"); ?></strong><br />
+ <?=gettext("This will select the above gateway as the default gateway"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable Gateway Monitoring"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="monitor_disable" type="checkbox" id="monitor_disable" value="yes" <?php if ($pconfig['monitor_disable'] == true) echo "checked=\"checked\""; ?> onclick="monitor_change()" />
+ <strong><?=gettext("Disable Gateway Monitoring"); ?></strong><br />
+ <?=gettext("This will consider this gateway as always being up"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Monitor IP"); ?></td>
+ <td width="78%" class="vtable">
+ <?php
+ if ($pconfig['gateway'] == $pconfig['monitor']) {
+ $monitor = "";
+ } else {
+ $monitor = htmlspecialchars($pconfig['monitor']);
+ }
+ ?>
+ <input name="monitor" type="text" id="monitor" value="<?php echo htmlspecialchars($monitor); ?>" size="28" />
+ <strong><?=gettext("Alternative monitor IP"); ?></strong> <br />
+ <?=gettext("Enter an alternative address here to be used to monitor the link. This is used for the " .
+ "quality RRD graphs as well as the load balancer entries. Use this if the gateway does not respond " .
+ "to ICMP echo requests (pings)"); ?>.
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Mark Gateway as Down"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="force_down" type="checkbox" id="force_down" value="yes" <?php if ($pconfig['force_down'] == true) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Mark Gateway as Down"); ?></strong><br />
+ <?=gettext("This will force this gateway to be considered Down"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Advanced");?></td>
+ <td width="78%" class="vtable">
+ <?php $showbutton = (!empty($pconfig['latencylow']) || !empty($pconfig['latencyhigh']) || !empty($pconfig['losslow']) || !empty($pconfig['losshigh']) || (isset($pconfig['weight']) && $pconfig['weight'] > 1) || (isset($pconfig['interval']) && ($pconfig['interval'] > $apinger_default['interval'])) || (isset($pconfig['down']) && !($pconfig['down'] == $apinger_default['down']))); ?>
+ <div id="showadvgatewaybox" <?php if ($showbutton) echo "style='display:none'"; ?>>
+ <input type="button" onclick="show_advanced_gateway()" value="Advanced" /><?=gettext(" - Show advanced option"); ?>
+ </div>
+ <div id="showgatewayadv" <?php if (!$showbutton) echo "style='display:none'"; ?>>
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="advanced options">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Weight");?></td>
+ <td width="78%" class="vtable">
+ <select name='weight' class='formfldselect' id='weight'>
+ <?php
+ for ($i = 1; $i < 6; $i++) {
+ $selected = "";
+ if ($pconfig['weight'] == $i) {
+ $selected = "selected='selected'";
+ }
+ echo "<option value='{$i}' {$selected} >{$i}</option>";
+ }
+ ?>
+ </select>
+ <br /><?=gettext("Weight for this gateway when used in a Gateway Group.");?> <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Latency thresholds");?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("From");?>
+ <input name="latencylow" type="text" class="formfld unknown" id="latencylow" size="2"
+ value="<?=htmlspecialchars($pconfig['latencylow']);?>" />
+ <?=gettext("To");?>
+ <input name="latencyhigh" type="text" class="formfld unknown" id="latencyhigh" size="2"
+ value="<?=htmlspecialchars($pconfig['latencyhigh']);?>" />
+ <br /><span class="vexpl"><?=gettext(sprintf("Low and high thresholds for latency in milliseconds. Default is %d/%d.", $apinger_default['latencylow'], $apinger_default['latencyhigh']));?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Packet Loss thresholds");?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("From");?>
+ <input name="losslow" type="text" class="formfld unknown" id="losslow" size="2"
+ value="<?=htmlspecialchars($pconfig['losslow']);?>" />
+ <?=gettext("To");?>
+ <input name="losshigh" type="text" class="formfld unknown" id="losshigh" size="2"
+ value="<?=htmlspecialchars($pconfig['losshigh']);?>" />
+ <br /><span class="vexpl"><?=gettext(sprintf("Low and high thresholds for packet loss in %%. Default is %d/%d.", $apinger_default['losslow'], $apinger_default['losshigh']));?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Probe Interval");?></td>
+ <td width="78%" class="vtable">
+ <input name="interval" type="text" class="formfld unknown" id="interval" size="2"
+ value="<?=htmlspecialchars($pconfig['interval']);?>" onchange="interval_change(this)" />
+ <br />
+ <span class="vexpl">
+ <?=gettext(sprintf("How often that an ICMP probe will be sent in seconds. Default is %d.", $apinger_default['interval']));?><br /><br />
+ <?=gettext("NOTE: The quality graph is averaged over seconds, not intervals, so as the probe interval is increased the accuracy of the quality graph is decreased.");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Down");?></td>
+ <td width="78%" class="vtable">
+ <input name="down" type="text" class="formfld unknown" id="down" size="2"
+ value="<?=htmlspecialchars($pconfig['down']);?>" />
+ <br /><span class="vexpl"><?=gettext(sprintf("The number of seconds of failed probes before the alarm will fire. Default is %d.", $apinger_default['down']));?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Average Delay Replies Qty");?></td>
+ <td width="78%" class="vtable">
+ <input name="avg_delay_samples" type="text" class="formfld unknown" id="avg_delay_samples" size="2"
+ value="<?=htmlspecialchars($pconfig['avg_delay_samples']);?>" onchange="samples_change(document.iform.avg_delay_samples_calculated, this)" />
+ <input name="avg_delay_samples_calculated" type="checkbox" id="avg_delay_samples_calculated" value="yes" <?php if ($pconfig['avg_delay_samples_calculated'] == true) echo "checked=\"checked\""; ?> onclick="calculated_change(this, document.iform.avg_delay_samples)" />
+ <?=gettext("Use calculated value."); ?>
+ <br /><span class="vexpl"><?=gettext(sprintf("How many replies should be used to compute average delay for controlling \"delay\" alarms? Default is %d.", $apinger_default['avg_delay_samples']));?><br /><br /></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Average Packet Loss Probes Qty");?></td>
+ <td width="78%" class="vtable">
+ <input name="avg_loss_samples" type="text" class="formfld unknown" id="avg_loss_samples" size="2"
+ value="<?=htmlspecialchars($pconfig['avg_loss_samples']);?>" onchange="samples_change(document.iform.avg_loss_samples_calculated, this)" />
+ <input name="avg_loss_samples_calculated" type="checkbox" id="avg_loss_samples_calculated" value="yes" <?php if ($pconfig['avg_loss_samples_calculated'] == true) echo "checked=\"checked\""; ?> onclick="calculated_change(this, document.iform.avg_loss_samples)" />
+ <?=gettext("Use calculated value."); ?>
+ <br /><span class="vexpl"><?=gettext(sprintf("How many probes should be useds to compute average packet loss? Default is %d.", $apinger_default['avg_loss_samples']));?><br /><br /></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Lost Probe Delay");?></td>
+ <td width="78%" class="vtable">
+ <input name="avg_loss_delay_samples" type="text" class="formfld unknown" id="avg_loss_delay_samples" size="2"
+ value="<?=htmlspecialchars($pconfig['avg_loss_delay_samples']);?>" onchange="samples_change(document.iform.avg_loss_delay_samples_calculated, this)" />
+ <input name="avg_loss_delay_samples_calculated" type="checkbox" id="avg_loss_delay_samples_calculated" value="yes" <?php if ($pconfig['avg_loss_delay_samples_calculated'] == true) echo "checked=\"checked\""; ?> onclick="calculated_change(this, document.iform.avg_loss_delay_samples)" />
+ <?=gettext("Use calculated value."); ?>
+ <br /><span class="vexpl"><?=gettext(sprintf("The delay (in qty of probe samples) after which loss is computed. Without this, delays longer than the probe interval would be treated as packet loss. Default is %d.", $apinger_default['avg_loss_delay_samples']));?><br /><br /></span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <?= gettext("The probe interval must be less than the down time, otherwise the gateway will seem to go down then come up again at the next probe."); ?><br /><br />
+ <?= gettext("The down time defines the length of time before the gateway is marked as down, but the accuracy is controlled by the probe interval. For example, if your down time is 40 seconds but on a 30 second probe interval, only one probe would have to fail before the gateway is marked down at the 40 second mark. By default, the gateway is considered down after 10 seconds, and the probe interval is 1 second, so 10 probes would have to fail before the gateway is marked down."); ?><br />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br /><span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change()" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_gateways[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+<?php include("fend.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+monitor_change();
+calculate_state_change();
+//]]>
+</script>
+</body>
+</html>
diff --git a/src/usr/local/www/system_groupmanager.php b/src/usr/local/www/system_groupmanager.php
new file mode 100644
index 0000000..17b0f73
--- /dev/null
+++ b/src/usr/local/www/system_groupmanager.php
@@ -0,0 +1,607 @@
+<?php
+/*
+ $Id: system_groupmanager.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ part of pfSense
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Copyright (C) 2008 Shrew Soft Inc.
+ All rights reserved.
+
+ Copyright (C) 2005 Paul Taylor <paultaylor@winn-dixie.com>.
+ All rights reserved.
+
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: auth
+*/
+
+##|+PRIV
+##|*IDENT=page-system-groupmanager
+##|*NAME=System: Group manager page
+##|*DESCR=Allow access to the 'System: Group manager' page.
+##|*MATCH=system_groupmanager.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$pgtitle = array(gettext("System"), gettext("Group manager"));
+
+if (!is_array($config['system']['group'])) {
+ $config['system']['group'] = array();
+}
+
+$a_group = &$config['system']['group'];
+
+unset($id);
+if (isset($_POST['groupid']) && is_numericint($_POST['groupid'])) {
+ $id = $_POST['groupid'];
+}
+
+$act = (isset($_POST['act']) ? $_POST['act'] : '');
+
+if ($act == "delgroup") {
+
+ if (!isset($id) || !isset($_POST['groupname']) || !isset($a_group[$id]) || ($_POST['groupname'] != $a_group[$id]['name'])) {
+ pfSenseHeader("system_groupmanager.php");
+ exit;
+ }
+
+ conf_mount_rw();
+ local_group_del($a_group[$id]);
+ conf_mount_ro();
+ $groupdeleted = $a_group[$id]['name'];
+ unset($a_group[$id]);
+ write_config();
+ $savemsg = gettext("Group") . " {$groupdeleted} " .
+ gettext("successfully deleted") . "<br />";
+}
+
+if ($act == "delpriv") {
+
+ if (!isset($id) || !isset($a_group[$id])) {
+ pfSenseHeader("system_groupmanager.php");
+ exit;
+ }
+
+ $privdeleted = $priv_list[$a_group[$id]['priv'][$_POST['privid']]]['name'];
+ unset($a_group[$id]['priv'][$_POST['privid']]);
+
+ if (is_array($a_group[$id]['member'])) {
+ foreach ($a_group[$id]['member'] as $uid) {
+ $user = getUserEntryByUID($uid);
+ if ($user) {
+ local_user_set($user);
+ }
+ }
+ }
+
+ write_config();
+ $act = "edit";
+ $savemsg = gettext("Privilege") . " {$privdeleted} " .
+ gettext("successfully deleted") . "<br />";
+}
+
+if ($act == "edit") {
+ if (isset($id) && isset($a_group[$id])) {
+ $pconfig['name'] = $a_group[$id]['name'];
+ $pconfig['gid'] = $a_group[$id]['gid'];
+ $pconfig['gtype'] = $a_group[$id]['scope'];
+ $pconfig['description'] = $a_group[$id]['description'];
+ $pconfig['members'] = $a_group[$id]['member'];
+ $pconfig['priv'] = $a_group[$id]['priv'];
+ }
+}
+
+if (isset($_POST['dellall_x'])) {
+
+ $del_groups = $_POST['delete_check'];
+
+ if (!empty($del_groups)) {
+ foreach ($del_groups as $groupid) {
+ if (isset($a_group[$groupid]) && $a_group[$groupid]['scope'] != "system") {
+ conf_mount_rw();
+ local_group_del($a_group[$groupid]);
+ conf_mount_ro();
+ unset($a_group[$groupid]);
+ }
+ }
+ $savemsg = gettext("Selected groups removed successfully!");
+ write_config($savemsg);
+ }
+}
+
+if (isset($_POST['save'])) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "groupname");
+ $reqdfieldsn = array(gettext("Group Name"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (preg_match("/[^a-zA-Z0-9\.\-_ ]/", $_POST['groupname'])) {
+ $input_errors[] = gettext("The group name contains invalid characters.");
+ }
+
+ if (strlen($_POST['groupname']) > 16) {
+ $input_errors[] = gettext("The group name is longer than 16 characters.");
+ }
+
+ if (!$input_errors && !(isset($id) && $a_group[$id])) {
+ /* make sure there are no dupes */
+ foreach ($a_group as $group) {
+ if ($group['name'] == $_POST['groupname']) {
+ $input_errors[] = gettext("Another entry with the same group name already exists.");
+ break;
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ $group = array();
+ if (isset($id) && $a_group[$id]) {
+ $group = $a_group[$id];
+ }
+
+ $group['name'] = $_POST['groupname'];
+ $group['description'] = $_POST['description'];
+
+ if (empty($_POST['members'])) {
+ unset($group['member']);
+ } else if ($group['gid'] != 1998) { // all group
+ $group['member'] = $_POST['members'];
+ }
+
+ if (isset($id) && $a_group[$id]) {
+ $a_group[$id] = $group;
+ } else {
+ $group['gid'] = $config['system']['nextgid']++;
+ $a_group[] = $group;
+ }
+
+ conf_mount_rw();
+ local_group_set($group);
+ conf_mount_ro();
+
+ /* Refresh users in this group since their privileges may have changed. */
+ if (is_array($group['member'])) {
+ $a_user = &$config['system']['user'];
+ foreach ($a_user as & $user) {
+ if (in_array($user['uid'], $group['member'])) {
+ local_user_set($user);
+ }
+ }
+ }
+
+ write_config();
+
+ header("Location: system_groupmanager.php");
+ exit;
+ }
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+
+function setall_selected(id) {
+ selbox = document.getElementById(id);
+ count = selbox.options.length;
+ for (index = 0; index<count; index++) {
+ selbox.options[index].selected = true;
+ }
+}
+
+function delete_empty(id) {
+ selbox = document.getElementById(id);
+ count = selbox.options.length;
+ for (index = 0; index<count; index++) {
+ if (selbox.options[index].value == '') {
+ selbox.remove(index);
+ }
+ }
+}
+
+function clear_selected(id) {
+ selbox = document.getElementById(id);
+ count = selbox.options.length;
+ for (index = 0; index<count; index++) {
+ selbox.options[index].selected = false;
+ }
+}
+
+function remove_selected(id) {
+ selbox = document.getElementById(id);
+ index = selbox.options.length - 1;
+ for (; index >= 0; index--) {
+ if (selbox.options[index].selected) {
+ selbox.remove(index);
+ }
+ }
+}
+
+function copy_selected(srcid, dstid) {
+ src_selbox = document.getElementById(srcid);
+ dst_selbox = document.getElementById(dstid);
+ count = dst_selbox.options.length;
+ for (index = count - 1; index >= 0; index--) {
+ if (dst_selbox.options[index].value == '') {
+ dst_selbox.remove(index);
+ }
+ }
+ count = src_selbox.options.length;
+ for (index = 0; index < count; index++) {
+ if (src_selbox.options[index].selected) {
+ option = document.createElement('option');
+ option.text = src_selbox.options[index].text;
+ option.value = src_selbox.options[index].value;
+ dst_selbox.add(option, null);
+ }
+ }
+}
+
+function move_selected(srcid, dstid) {
+ copy_selected(srcid, dstid);
+ remove_selected(srcid);
+}
+
+function presubmit() {
+ delete_empty('members');
+ delete_empty('notmembers');
+ clear_selected('notmembers');
+ setall_selected('members');
+}
+
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="group manager">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
+ $tab_array[] = array(gettext("Groups"), true, "system_groupmanager.php");
+ $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+ $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+
+<?php
+ if ($act == "new" || $act == "edit"):
+?>
+ <form action="system_groupmanager.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
+ <input type="hidden" id="act" name="act" value="" />
+ <input type="hidden" id="groupid" name="groupid" value="<?=(isset($id) ? $id : '');?>" />
+ <input type="hidden" id="privid" name="privid" value="" />
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+<?php
+ $ro = "";
+ if ($pconfig['gtype'] == "system") {
+ $ro = "readonly=\"readonly\"";
+ }
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Defined by");?></td>
+ <td width="78%" class="vtable">
+ <strong><?=strtoupper($pconfig['gtype']);?></strong>
+ <input name="gtype" type="hidden" value="<?=htmlspecialchars($pconfig['gtype'])?>"/>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Group name");?></td>
+ <td width="78%" class="vtable">
+ <input name="groupname" type="text" class="formfld group" id="groupname" size="20" maxlength="16" value="<?=htmlspecialchars($pconfig['name']);?>" <?=$ro;?> />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" class="vtable">
+ <input name="description" type="text" class="formfld unknown" id="description" size="20" value="<?=htmlspecialchars($pconfig['description']);?>" />
+ <br />
+ <?=gettext("Group description, for your own information only");?>
+ </td>
+ </tr>
+<?php
+ if ($pconfig['gid'] != 1998): // all users group
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Group Memberships");?></td>
+ <td width="78%" class="vtable" align="center">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="membership">
+ <tr>
+ <td align="center" width="50%">
+ <strong><?=gettext("Not Members");?></strong><br />
+ <br />
+ <select size="10" style="width: 75%" name="notmembers[]" class="formselect" id="notmembers" onchange="clear_selected('members')" multiple="multiple">
+<?php
+ $rowIndex = 0;
+ foreach ($config['system']['user'] as $user):
+ if (is_array($pconfig['members']) && in_array($user['uid'], $pconfig['members'])) {
+ continue;
+ }
+ $rowIndex++;
+?>
+ <option value="<?=$user['uid'];?>" <?=$selected;?>>
+ <?=htmlspecialchars($user['name']);?>
+ </option>
+<?php
+ endforeach;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+?>
+ </select>
+ <br />
+ </td>
+ <td>
+ <br />
+ <a href="javascript:move_selected('notmembers', 'members')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_right.gif" title="<?=gettext("Add Members");?>" alt="<?=gettext("Add Members");?>" width="17" height="17" border="0" />
+ </a>
+ <br /><br />
+ <a href="javascript:move_selected('members', 'notmembers')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_left.gif" title="<?=gettext("Remove Members");?>" alt="<?=gettext("Remove Members");?>" width="17" height="17" border="0" />
+ </a>
+ </td>
+ <td align="center" width="50%">
+ <strong><?=gettext("Members");?></strong><br />
+ <br />
+ <select size="10" style="width: 75%" name="members[]" class="formselect" id="members" onchange="clear_selected('notmembers')" multiple="multiple">
+<?php
+ $rowIndex = 0;
+ foreach ($config['system']['user'] as $user):
+ if (!(is_array($pconfig['members']) && in_array($user['uid'], $pconfig['members']))) {
+ continue;
+ }
+ $rowIndex++;
+?>
+ <option value="<?=$user['uid'];?>">
+ <?=htmlspecialchars($user['name']);?>
+ </option>
+<?php
+ endforeach;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+?>
+ </select>
+ <br />
+ </td>
+ </tr>
+ </table>
+ <?=gettext("Hold down CTRL (pc)/COMMAND (mac) key to select multiple items");?>
+ </td>
+ </tr>
+<?php
+ endif;
+ if ($act != "new"):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Assigned Privileges");?></td>
+ <td width="78%" class="vtable">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="privileges">
+ <tr>
+ <td width="40%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="60%" class="listhdrr"><?=gettext("Description");?></td>
+ <td class="list"></td>
+ </tr>
+<?php
+ if (is_array($pconfig['priv'])):
+ $i = 0;
+ foreach ($pconfig['priv'] as $priv):
+?>
+ <tr>
+ <td class="listr">
+ <?=htmlspecialchars($priv_list[$priv]['name']);?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($priv_list[$priv]['descr']);?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <input type="image" name="delpriv[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
+ onclick="document.getElementById('privid').value='<?=$i;?>';
+ document.getElementById('groupid').value='<?=$id;?>';
+ document.getElementById('act').value='<?php echo "delpriv";?>';
+ return confirm('<?=gettext("Do you really want to delete this privilege?");?>');"
+ title="<?=gettext("delete privilege");?>" />
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="2"></td>
+ <td class="list">
+ <a href="system_groupmanager_addprivs.php?groupid=<?=htmlspecialchars($id)?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
+ </a>
+
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+?>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='/system_groupmanager.php'" />
+ <?php if (isset($id) && $a_group[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <input name="gid" type="hidden" value="<?=htmlspecialchars($pconfig['gid']);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+<?php
+ else:
+?>
+ <form action="system_groupmanager.php" method="post" name="iform2" id="iform2">
+ <input type="hidden" id="act" name="act" value="" />
+ <input type="hidden" id="groupid" name="groupid" value="<?=(isset($id) ? $id : '');?>" />
+ <input type="hidden" id="groupname" name="groupname" value="" />
+ <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
+ <thead>
+ <tr>
+ <th width="5%" class="list">&nbsp;</th>
+ <th width="25%" class="listhdrr"><?=gettext("Group name");?></th>
+ <th width="25%" class="listhdrr"><?=gettext("Description");?></th>
+ <th width="30%" class="listhdrr"><?=gettext("Member Count");?></th>
+ <th width="10%" class="list"></th>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <input type="image" name="addcert" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_plus.gif"
+ onclick="document.getElementById('act').value='<?php echo "new";?>';"
+ title="<?=gettext("add group");?>" />
+ <input type="image" src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" name="dellall" title="<?=gettext('Delete selected groups')?>" onClick="return confirm('<?=gettext("Do you really want to delete selected groups?");?>')" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="4">
+ <p>
+ <?=gettext("Additional webConfigurator groups can be added here.
+ Group permissions can be assigned which are inherited by users who are members of the group.
+ An icon that appears grey indicates that it is a system defined object.
+ Some system object properties can be modified but they cannot be deleted.");?>
+ </p>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+<?php
+ $i = 0;
+ foreach ($a_group as $group):
+ if ($group['scope'] == "system") {
+ $grpimg = "/themes/{$g['theme']}/images/icons/icon_system-group-grey.png";
+ } else {
+ $grpimg = "/themes/{$g['theme']}/images/icons/icon_system-group.png";
+ }
+ $groupcount = count($group['member']);
+ if ($group["name"] == "all") {
+ $groupcount = count($config['system']['user']);
+ }
+?>
+ <tr ondblclick="document.getElementById('act').value='<?php echo "edit";?>';
+ document.getElementById('groupid').value='<?=$i;?>';
+ document.iform2.submit();" id="fr<?=$i?>">
+ <td class="list" id="frd<?=$i?>">
+ <?php if ($group['scope'] != "system") : ?>
+ <input type="checkbox" id="frc<?=$i?>" onclick="fr_bgcolor(<?=$i?>)" name="delete_check[]" value="<?=$i?>" />
+ <?php endif; ?>
+ </td>
+ <td class="listlr" id="frd<?=$i?>" onclick="fr_toggle(<?=$i?>)">
+ <table border="0" cellpadding="0" cellspacing="0" summary="">
+ <tr>
+ <td align="left" valign="middle">
+ <img src="<?=$grpimg;?>" alt="<?=gettext("User");?>" title="<?=gettext("User");?>" border="0" height="16" width="16" />
+ </td>
+ <td align="left" valign="middle">
+ <?=htmlspecialchars($group['name']); ?>&nbsp;
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td class="listr" id="frd<?=$i?>" onclick="fr_toggle(<?=$i?>)">
+ <?=htmlspecialchars($group['description']);?>&nbsp;
+ </td>
+ <td class="listbg" onclick="fr_toggle(<?=$i?>)">
+ <?=$groupcount;?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <input type="image" name="editgroup[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_e.gif"
+ onclick="document.getElementById('groupid').value='<?=$i;?>';
+ document.getElementById('act').value='<?php echo "edit";?>';"
+ title="<?=gettext("edit group");?>" />
+ &nbsp;
+<?php
+ if ($group['scope'] != "system"):
+?>
+ <input type="image" name="delgroup[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
+ onclick="document.getElementById('groupid').value='<?=$i;?>';
+ document.getElementById('groupname').value='<?=$group['name'];?>';
+ document.getElementById('act').value='<?php echo "delgroup";?>';
+ return confirm('<?=gettext("Do you really want to delete this group?");?>');"
+ title="<?=gettext("delete group");?>" />
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ </tbody>
+ </table>
+ </form>
+<?php
+ endif;
+?>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_groupmanager_addprivs.php b/src/usr/local/www/system_groupmanager_addprivs.php
new file mode 100644
index 0000000..830d025
--- /dev/null
+++ b/src/usr/local/www/system_groupmanager_addprivs.php
@@ -0,0 +1,255 @@
+<?php
+/* $Id$ */
+/*
+ system_groupmanager_addprivs.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2006 Daniel S. Haischt.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: auth
+*/
+
+##|+PRIV
+##|*IDENT=page-system-groupmanager-addprivs
+##|*NAME=System: Group Manager: Add Privileges page
+##|*DESCR=Allow access to the 'System: Group Manager: Add Privileges' page.
+##|*MATCH=system_groupmanager_addprivs.php*
+##|-PRIV
+
+function cpusercmp($a, $b) {
+ return strcasecmp($a['name'], $b['name']);
+}
+
+function admin_groups_sort() {
+ global $config;
+
+ if (!is_array($config['system']['group'])) {
+ return;
+ }
+
+ usort($config['system']['group'], "cpusercmp");
+}
+
+require("guiconfig.inc");
+
+$pgtitle = array(gettext("System"), gettext("Group manager"), gettext("Add privileges"));
+
+if (is_numericint($_GET['groupid'])) {
+ $groupid = $_GET['groupid'];
+}
+if (isset($_POST['groupid']) && is_numericint($_POST['groupid'])) {
+ $groupid = $_POST['groupid'];
+}
+
+$a_group = & $config['system']['group'][$groupid];
+
+if (!is_array($a_group)) {
+ pfSenseHeader("system_groupmanager.php?id={$groupid}");
+ exit;
+}
+
+if (!is_array($a_group['priv'])) {
+ $a_group['priv'] = array();
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "sysprivs");
+ $reqdfieldsn = array(gettext("Selected privileges"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if (!$input_errors) {
+
+ if (!is_array($pconfig['sysprivs'])) {
+ $pconfig['sysprivs'] = array();
+ }
+
+ if (!count($a_group['priv'])) {
+ $a_group['priv'] = $pconfig['sysprivs'];
+ } else {
+ $a_group['priv'] = array_merge($a_group['priv'], $pconfig['sysprivs']);
+ }
+
+ if (is_array($a_group['member'])) {
+ foreach ($a_group['member'] as $uid) {
+ $user = getUserEntryByUID($uid);
+ if ($user) {
+ local_user_set($user);
+ }
+ }
+ }
+
+ admin_groups_sort();
+
+ $retval = write_config();
+ $savemsg = get_std_save_message($retval);
+
+ pfSenseHeader("system_groupmanager.php?act=edit&amp;id={$groupid}");
+ exit;
+ }
+}
+
+/* if ajax is calling, give them an update message */
+if (isAjax()) {
+ print_info_box_np($savemsg);
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+<?php
+
+if (is_array($priv_list)) {
+ $id = 0;
+
+ $jdescs = "var descs = new Array();\n";
+ foreach ($priv_list as $pname => $pdata) {
+ if (in_array($pname, $a_group['priv'])) {
+ continue;
+ }
+ $desc = addslashes($pdata['descr']);
+ $jdescs .= "descs[{$id}] = '{$desc}';\n";
+ $id++;
+ }
+
+ echo $jdescs;
+}
+
+?>
+
+function update_description() {
+ var index = document.iform.sysprivs.selectedIndex;
+ document.getElementById("pdesc").innerHTML = descs[index];
+}
+
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="group manager add privileges">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
+ $tab_array[] = array(gettext("Groups"), true, "system_groupmanager.php");
+ $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+ $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <form action="system_groupmanager_addprivs.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("System Privileges");?></td>
+ <td width="78%" class="vtable">
+ <table>
+ <tr>
+ <td>
+ <select name="sysprivs[]" id="sysprivs" class="formselect" onchange="update_description();" multiple="multiple" size="35">
+ <?php
+ foreach ($priv_list as $pname => $pdata):
+ if (in_array($pname, $a_group['priv'])) {
+ continue;
+ }
+ ?>
+ <option value="<?=$pname;?>"><?=$pdata['name'];?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Hold down CTRL (pc)/COMMAND (mac) key to select multiple items");?>
+ </td>
+ <td>
+ <a href='#'onClick="selectAll();">Select all</a>
+ <script type="text/javascript">
+ //<![CDATA[
+ function selectAll() {
+ var options = jQuery('select#sysprivs option');
+ var len = options.length;
+ for (var i = 0; i < len; i++) {
+ options[i].selected = true;
+ }
+ }
+ selectAll();
+ //]]>
+ </script>
+ <br />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr height="60">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" valign="top" class="vtable" id="pdesc">
+ <em><?=gettext("Select a privilege from the list above for a description");?></em>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submitt" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input id="cancelbutton" class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()" />
+ <?php if (isset($groupid)): ?>
+ <input name="groupid" type="hidden" value="<?=htmlspecialchars($groupid);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_hasync.php b/src/usr/local/www/system_hasync.php
new file mode 100755
index 0000000..8ebde1f
--- /dev/null
+++ b/src/usr/local/www/system_hasync.php
@@ -0,0 +1,365 @@
+<?php
+/* $Id$ */
+/*
+ system_hasync.php
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2012 Darren Embry <dse@webonastick.com>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: system
+*/
+
+##|+PRIV
+##|*IDENT=page-system-hasync
+##|*NAME=System: High Availability Sync
+##|*DESCR=Allow access to the 'System: High Availability Sync' page.
+##|*MATCH=system_hasync.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_hasync.php');
+}
+
+if (!is_array($config['hasync'])) {
+ $config['hasync'] = array();
+}
+
+$a_hasync = &$config['hasync'];
+
+$checkbox_names = array(
+ 'pfsyncenabled',
+ 'synchronizeusers',
+ 'synchronizeauthservers',
+ 'synchronizecerts',
+ 'synchronizerules',
+ 'synchronizeschedules',
+ 'synchronizealiases',
+ 'synchronizenat',
+ 'synchronizeipsec',
+ 'synchronizeopenvpn',
+ 'synchronizedhcpd',
+ 'synchronizewol',
+ 'synchronizestaticroutes',
+ 'synchronizelb',
+ 'synchronizevirtualip',
+ 'synchronizetrafficshaper',
+ 'synchronizetrafficshaperlimiter',
+ 'synchronizetrafficshaperlayer7',
+ 'synchronizednsforwarder',
+ 'synchronizecaptiveportal');
+
+if ($_POST) {
+ $pconfig = $_POST;
+ foreach ($checkbox_names as $name) {
+ $a_hasync[$name] = $pconfig[$name] ? $pconfig[$name] : false;
+ }
+ $a_hasync['pfsyncpeerip'] = $pconfig['pfsyncpeerip'];
+ $a_hasync['pfsyncinterface'] = $pconfig['pfsyncinterface'];
+ $a_hasync['synchronizetoip'] = $pconfig['synchronizetoip'];
+ $a_hasync['username'] = $pconfig['username'];
+ $a_hasync['password'] = $pconfig['passwordfld'];
+ write_config("Updated High Availability Sync configuration");
+ interfaces_sync_setup();
+ header("Location: system_hasync.php");
+ exit();
+}
+
+foreach ($checkbox_names as $name) {
+ $pconfig[$name] = $a_hasync[$name];
+}
+$pconfig['pfsyncpeerip'] = $a_hasync['pfsyncpeerip'];
+$pconfig['pfsyncinterface'] = $a_hasync['pfsyncinterface'];
+$pconfig['synchronizetoip'] = $a_hasync['synchronizetoip'];
+$pconfig['username'] = $a_hasync['username'];
+$pconfig['passwordfld'] = $a_hasync['password'];
+
+$ifaces = get_configured_interface_with_descr();
+$ifaces["lo0"] = "loopback";
+
+$pgtitle = array(gettext("System"), gettext("High Availability Sync"));
+$shortcut_section = "carp";
+include("head.inc");
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<form action="system_hasync.php" method="post" name="iform" id="iform">
+<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="high availability sync">
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" class="listtopic">State Synchronization Settings (pfsync)</td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize States</td>
+ <td class="vtable">
+ <input id='pfsyncenabled' type='checkbox' name='pfsyncenabled' value='on' <?php if ($pconfig['pfsyncenabled'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ pfsync transfers state insertion, update, and deletion messages between firewalls. Each firewall sends these messages out via multicast on a specified interface, using the PFSYNC protocol (IP Protocol 240). It also listens on that interface for similar messages from other firewalls, and imports them into the local state table.<p>This setting should be enabled on all members of a failover group.</p><p>NOTE: Clicking save will force a configuration sync if it is enabled! (see Configuration Synchronization Settings below)</p>
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Interface</td>
+ <td class="vtable">
+ <select id='pfsyncinterface' name="pfsyncinterface">
+ <?php foreach ($ifaces as $ifname => $iface) { ?>
+ <?php $selected = ($pconfig['pfsyncinterface'] === $ifname) ? 'selected="selected"' : ''; ?>
+ <option value="<?= htmlentities($ifname); ?>" <?= $selected ?>><?= htmlentities($iface); ?></option>
+ <?php } ?>
+ </select>
+ <br />
+ If Synchronize States is enabled, it will utilize this interface for communication.<br />
+ <b>NOTE:</b> We recommend setting this to a interface other than LAN! A dedicated interface works the best.<br />
+ <b>NOTE:</b> You must define a IP on each machine participating in this failover group.<br />
+ <b>NOTE:</b> You must have an IP assigned to the interface on any participating sync nodes.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">pfsync Synchronize Peer IP</td>
+ <td class="vtable">
+ <input id='pfsyncpeerip' name='pfsyncpeerip' class='formfld unknown' value='<?= htmlentities($pconfig['pfsyncpeerip'], ENT_QUOTES | ENT_HTML401); ?>' />
+ <br />
+ Setting this option will force pfsync to synchronize its state table to this IP address. The default is directed multicast.
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2" class="listtopic">Configuration Synchronization Settings (XMLRPC Sync)</td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Config to IP</td>
+ <td class="vtable">
+ <input id='synchronizetoip' name='synchronizetoip' class='formfld unknown' value='<?= htmlentities($pconfig['synchronizetoip'], ENT_QUOTES | ENT_HTML401); ?>' />
+ <br />
+ Enter the IP address of the firewall to which the selected configuration sections should be synchronized.<br />
+ <br />
+ NOTE: XMLRPC sync is currently only supported over connections using the same protocol and port as this system - make sure the remote system's port and protocol are set accordingly!<br />
+ <br />
+ NOTE: <b>Do not use the Synchronize Config to IP and password option on backup cluster members!</b>
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Remote System Username</td>
+ <td class="vtable">
+ <input id='username' name='username' class='formfld unknown' value='<?= htmlentities($pconfig['username'], ENT_QUOTES | ENT_HTML401); ?>' />
+ <br />
+ Enter the webConfigurator username of the system entered above for synchronizing your configuration.<br />
+ <br />
+ NOTE: <b>Do not use the Synchronize Config to IP and username option on backup cluster members!</b>
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Remote System Password</td>
+ <td class="vtable">
+ <input id='passwordfld' type='password' name='passwordfld' class='formfld pwd' value='<?= htmlentities($pconfig['passwordfld'], ENT_QUOTES | ENT_HTML401); ?>' />
+ <br />
+ Enter the webConfigurator password of the system entered above for synchronizing your configuration.<br />
+ <br />
+ NOTE: <b>Do not use the Synchronize Config to IP and password option on backup cluster members!</b>
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Users and Groups</td>
+ <td class="vtable">
+ <input id='synchronizeusers' type='checkbox' name='synchronizeusers' value='on' <?php if ($pconfig['synchronizeusers'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the users and groups over to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Auth Servers</td>
+ <td class="vtable">
+ <input id='synchronizeauthservers' type='checkbox' name='synchronizeauthservers' value='on' <?php if ($pconfig['synchronizeauthservers'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the authentication servers (e.g. LDAP, RADIUS) over to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Certificates</td>
+ <td class="vtable">
+ <input id='synchronizecerts' type='checkbox' name='synchronizecerts' value='on' <?php if ($pconfig['synchronizecerts'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the Certificate Authorities, Certificates, and Certificate Revocation Lists over to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize rules</td>
+ <td class="vtable">
+ <input id='synchronizerules' type='checkbox' name='synchronizerules' value='on' <?php if ($pconfig['synchronizerules'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the firewall rules to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Firewall Schedules</td>
+ <td class="vtable">
+ <input id='synchronizeschedules' type='checkbox' name='synchronizeschedules' value='on' <?php if ($pconfig['synchronizeschedules'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the firewall schedules to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize aliases</td>
+ <td class="vtable">
+ <input id='synchronizealiases' type='checkbox' name='synchronizealiases' value='on' <?php if ($pconfig['synchronizealiases'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the aliases over to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize NAT</td>
+ <td class="vtable">
+ <input id='synchronizenat' type='checkbox' name='synchronizenat' value='on' <?php if ($pconfig['synchronizenat'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the NAT rules over to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize IPsec</td>
+ <td class="vtable">
+ <input id='synchronizeipsec' type='checkbox' name='synchronizeipsec' value='on' <?php if ($pconfig['synchronizeipsec'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the IPsec configuration to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize OpenVPN</td>
+ <td class="vtable">
+ <input id='synchronizeopenvpn' type='checkbox' name='synchronizeopenvpn' value='on' <?php if ($pconfig['synchronizeopenvpn'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the OpenVPN configuration to the other HA host when changes are made. Using this option implies "Synchronize Certificates" as they are required for OpenVPN.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize DHCPD</td>
+ <td class="vtable">
+ <input id='synchronizedhcpd' type='checkbox' name='synchronizedhcpd' value='on' <?php if ($pconfig['synchronizedhcpd'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the DHCP Server settings over to the other HA host when changes are made. This only applies to DHCP for IPv4.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Wake on LAN</td>
+ <td class="vtable">
+ <input id='synchronizewol' type='checkbox' name='synchronizewol' value='on' <?php if ($pconfig['synchronizewol'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the WoL configuration to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Static Routes</td>
+ <td class="vtable">
+ <input id='synchronizestaticroutes' type='checkbox' name='synchronizestaticroutes' value='on' <?php if ($pconfig['synchronizestaticroutes'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the Static Route configuration to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Load Balancer</td>
+ <td class="vtable">
+ <input id='synchronizelb' type='checkbox' name='synchronizelb' value='on' <?php if ($pconfig['synchronizelb'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the Load Balancer configuration to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Virtual IPs</td>
+ <td class="vtable">
+ <input id='synchronizevirtualip' type='checkbox' name='synchronizevirtualip' value='on' <?php if ($pconfig['synchronizevirtualip'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the CARP Virtual IPs to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize traffic shaper(queues)</td>
+ <td class="vtable">
+ <input id='synchronizetrafficshaper' type='checkbox' name='synchronizetrafficshaper' value='on' <?php if ($pconfig['synchronizetrafficshaper'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the traffic shaper configuration for queues to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize traffic shaper(limiter)</td>
+ <td class="vtable">
+ <input id='synchronizetrafficshaperlimiter' type='checkbox' name='synchronizetrafficshaperlimiter' value='on' <?php if ($pconfig['synchronizetrafficshaperlimiter'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the traffic shaper configuration for limiters to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize traffic shaper(layer7)</td>
+ <td class="vtable">
+ <input id='synchronizetrafficshaperlayer7' type='checkbox' name='synchronizetrafficshaperlayer7' value='on' <?php if ($pconfig['synchronizetrafficshaperlayer7'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the traffic shaper configuration for layer7 to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize DNS Forwarder / Resolver</td>
+ <td class="vtable">
+ <input id='synchronizednsforwarder' type='checkbox' name='synchronizednsforwarder' value='on' <?php if ($pconfig['synchronizednsforwarder'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the DNS Forwarder and DNS Resolver configuration to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr valign="top">
+ <td width="22%" class="vncell">Synchronize Captive Portal</td>
+ <td class="vtable">
+ <input id='synchronizecaptiveportal' type='checkbox' name='synchronizecaptiveportal' value='on' <?php if ($pconfig['synchronizecaptiveportal'] === "on") echo "checked='checked'"; ?> />
+ <br />
+ When this option is enabled, this system will automatically sync the Captive Portal configuration to the other HA host when changes are made.
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="id" type="hidden" value="0" />
+ <input name="Submit" type="submit" class="formbtn" value="Save" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_routes.php b/src/usr/local/www/system_routes.php
new file mode 100644
index 0000000..9443d40
--- /dev/null
+++ b/src/usr/local/www/system_routes.php
@@ -0,0 +1,407 @@
+<?php
+/* $Id$ */
+/*
+ system_routes.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ part of pfSense
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-system-staticroutes
+##|*NAME=System: Static Routes page
+##|*DESCR=Allow access to the 'System: Static Routes' page.
+##|*MATCH=system_routes.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+if (!is_array($config['staticroutes']['route'])) {
+ $config['staticroutes']['route'] = array();
+}
+
+$a_routes = &$config['staticroutes']['route'];
+$a_gateways = return_gateways_array(true, true, true);
+$changedesc_prefix = gettext("Static Routes") . ": ";
+unset($input_errors);
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+
+ $retval = 0;
+
+ if (file_exists("{$g['tmp_path']}/.system_routes.apply")) {
+ $toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.system_routes.apply"));
+ foreach ($toapplylist as $toapply) {
+ mwexec("{$toapply}");
+ }
+
+ @unlink("{$g['tmp_path']}/.system_routes.apply");
+ }
+
+ $retval = system_routing_configure();
+ $retval |= filter_configure();
+ /* reconfigure our gateway monitor */
+ setup_gateways_monitor();
+
+ $savemsg = get_std_save_message($retval);
+ if ($retval == 0) {
+ clear_subsystem_dirty('staticroutes');
+ }
+ }
+}
+
+function delete_static_route($id) {
+ global $config, $a_routes, $changedesc_prefix;
+
+ if (!isset($a_routes[$id])) {
+ return;
+ }
+
+ $targets = array();
+ if (is_alias($a_routes[$id]['network'])) {
+ foreach (filter_expand_alias_array($a_routes[$id]['network']) as $tgt) {
+ if (is_ipaddrv4($tgt)) {
+ $tgt .= "/32";
+ } else if (is_ipaddrv6($tgt)) {
+ $tgt .= "/128";
+ }
+ if (!is_subnet($tgt)) {
+ continue;
+ }
+ $targets[] = $tgt;
+ }
+ } else {
+ $targets[] = $a_routes[$id]['network'];
+ }
+
+ foreach ($targets as $tgt) {
+ $family = (is_subnetv6($tgt) ? "-inet6" : "-inet");
+ mwexec("/sbin/route delete {$family} " . escapeshellarg($tgt));
+ }
+
+ unset($targets);
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_routes[$_GET['id']]) {
+ $changedesc = $changedesc_prefix . gettext("removed route to") . " " . $a_routes[$_GET['id']]['network'];
+ delete_static_route($_GET['id']);
+ unset($a_routes[$_GET['id']]);
+ write_config($changedesc);
+ header("Location: system_routes.php");
+ exit;
+ }
+}
+
+if (isset($_POST['del_x'])) {
+ /* delete selected routes */
+ if (is_array($_POST['route']) && count($_POST['route'])) {
+ $changedesc = $changedesc_prefix . gettext("removed route to");
+ foreach ($_POST['route'] as $routei) {
+ $changedesc .= " " . $a_routes[$routei]['network'];
+ delete_static_route($routei);
+ unset($a_routes[$routei]);
+ }
+ write_config($changedesc);
+ header("Location: system_routes.php");
+ exit;
+ }
+
+} else if ($_GET['act'] == "toggle") {
+ if ($a_routes[$_GET['id']]) {
+ $do_update_config = true;
+ if (isset($a_routes[$_GET['id']]['disabled'])) {
+ // Do not enable a route whose gateway is disabled
+ if (isset($a_gateways[$a_routes[$_GET['id']]['gateway']]['disabled'])) {
+ $do_update_config = false;
+ $input_errors[] = $changedesc_prefix . gettext("gateway is disabled, cannot enable route to") . " " . $a_routes[$_GET['id']]['network'];
+ } else {
+ unset($a_routes[$_GET['id']]['disabled']);
+ $changedesc = $changedesc_prefix . gettext("enabled route to") . " " . $a_routes[$_GET['id']]['network'];
+ }
+ } else {
+ delete_static_route($_GET['id']);
+ $a_routes[$_GET['id']]['disabled'] = true;
+ $changedesc = $changedesc_prefix . gettext("disabled route to") . " " . $a_routes[$_GET['id']]['network'];
+ }
+
+ if ($do_update_config) {
+ if (write_config($changedesc)) {
+ mark_subsystem_dirty('staticroutes');
+ }
+ header("Location: system_routes.php");
+ exit;
+ }
+ }
+} else {
+ /* yuck - IE won't send value attributes for image buttons, while Mozilla does - so we use .x/.y to find move button clicks instead... */
+ unset($movebtn);
+ foreach ($_POST as $pn => $pd) {
+ if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
+ $movebtn = $matches[1];
+ break;
+ }
+ }
+ /* move selected routes before this route */
+ if (isset($movebtn) && is_array($_POST['route']) && count($_POST['route'])) {
+ $a_routes_new = array();
+
+ /* copy all routes < $movebtn and not selected */
+ for ($i = 0; $i < $movebtn; $i++) {
+ if (!in_array($i, $_POST['route'])) {
+ $a_routes_new[] = $a_routes[$i];
+ }
+ }
+
+ /* copy all selected routes */
+ for ($i = 0; $i < count($a_routes); $i++) {
+ if ($i == $movebtn) {
+ continue;
+ }
+ if (in_array($i, $_POST['route'])) {
+ $a_routes_new[] = $a_routes[$i];
+ }
+ }
+
+ /* copy $movebtn route */
+ if ($movebtn < count($a_routes)) {
+ $a_routes_new[] = $a_routes[$movebtn];
+ }
+
+ /* copy all routes > $movebtn and not selected */
+ for ($i = $movebtn+1; $i < count($a_routes); $i++) {
+ if (!in_array($i, $_POST['route'])) {
+ $a_routes_new[] = $a_routes[$i];
+ }
+ }
+ if (count($a_routes_new) > 0) {
+ $a_routes = $a_routes_new;
+ }
+
+ if (write_config()) {
+ mark_subsystem_dirty('staticroutes');
+ }
+ header("Location: system_routes.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Static Routes"));
+$shortcut_section = "routing";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="system_routes.php" method="post">
+<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('staticroutes')): ?><p>
+<?php print_info_box_np(sprintf(gettext("The static route configuration has been changed.%sYou must apply the changes in order for them to take effect."), "<br />"));?><br /></p>
+<?php endif; ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="system routes">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Gateways"), false, "system_gateways.php");
+ $tab_array[1] = array(gettext("Routes"), true, "system_routes.php");
+ $tab_array[2] = array(gettext("Groups"), false, "system_gateway_groups.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr id="frheader">
+ <td width="2%" class="list">&nbsp;</td>
+ <td width="2%" class="list">&nbsp;</td>
+ <td width="22%" class="listhdrr"><?=gettext("Network");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Gateway");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="29%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="10%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td><a href="system_routes_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ $i = 0;
+ foreach ($a_routes as $route):
+ ?>
+ <tr valign="top" id="fr<?=$i;?>">
+ <?php
+ $iconfn = "pass";
+ if (isset($route['disabled'])) {
+ $textss = "<span class=\"gray\">";
+ $textse = "</span>";
+ $iconfn .= "_d";
+ } else {
+ $textss = $textse = "";
+ }
+ ?>
+ <td class="listt">
+ <input type="checkbox" id="frc<?=$i;?>" name="route[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
+ </td>
+ <td class="listt" align="center">
+ <a href="?act=toggle&amp;id=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0"
+ title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" />
+ </a>
+ </td>
+ <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_routes_edit.php?id=<?=$i;?>';">
+ <?=$textss;?><?=strtolower($route['network']);?><?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_routes_edit.php?id=<?=$i;?>';">
+ <?=$textss;?>
+ <?php
+ echo htmlentities($a_gateways[$route['gateway']]['name']) . " - " . htmlentities($a_gateways[$route['gateway']]['gateway']);
+ ?>
+ <?=$textse;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='system_routes_edit.php?id=<?=$i;?>';">
+ <?=$textss;?>
+ <?php
+ echo convert_friendly_interface_to_friendly_descr($a_gateways[$route['gateway']]['friendlyiface']) . " ";
+ ?>
+ <?=$textse;?>
+ </td>
+ <td class="listbg" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='system_routes_edit.php?id=<?=$i;?>';">
+ <?=$textss;?><?=htmlspecialchars($route['descr']);?>&nbsp;<?=$textse;?>
+ </td>
+ <td class="list nowrap" valign="middle">
+ <table border="0" cellspacing="0" cellpadding="1" summary="move">
+ <tr>
+ <td>
+ <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>"
+ src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
+ title="<?=gettext("move selected routes before this route");?>"
+ type="image" style="height:17;width:17;border:0" />
+ </td>
+ <td>
+ <a href="system_routes_edit.php?id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit route");?>" alt="edit" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td align="center" valign="middle">
+ <a href="system_routes.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this route?");?>')">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete route");?>" alt="delete" />
+ </a>
+ </td>
+ <td>
+ <a href="system_routes_edit.php?dup=<?=$i;?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new route based on this one");?>" width="17" height="17" border="0" alt="duplicate" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr>
+ <td class="list" colspan="6"></td>
+ <td class="list nowrap" valign="middle">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td>
+<?php
+ if ($i == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17"
+ title="<?=gettext("move selected routes to end");?>" border="0" alt="move" />
+<?php
+ else:
+?>
+ <input name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
+ style="width:17;height:17;border:0" title="<?=gettext("move selected routes to end");?>" />
+<?php
+ endif;
+?>
+ </td>
+ <td>
+ <a href="system_routes_edit.php">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0"
+ title="<?=gettext("add new route");?>" alt="add" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+<?php
+ if ($i == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17"
+ title="<?=gettext("delete selected routes");?>" border="0" alt="delete" />
+<?php
+ else:
+?>
+ <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
+ style="width:17;height:17" title="<?=gettext("delete selected routes");?>"
+ onclick="return confirm('<?=gettext("Do you really want to delete the selected routes?");?>')" />
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<p><b><?=gettext("Note:");?></b> <?=gettext("Do not enter static routes for networks assigned on any interface of this firewall. Static routes are only used for networks reachable via a different router, and not reachable via your default gateway.");?></p>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_routes_edit.php b/src/usr/local/www/system_routes_edit.php
new file mode 100644
index 0000000..a64580b
--- /dev/null
+++ b/src/usr/local/www/system_routes_edit.php
@@ -0,0 +1,445 @@
+<?php
+/*
+ system_routes_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ part of pfSense
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2010 Scott Ullrich
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: routing
+*/
+
+##|+PRIV
+##|*IDENT=page-system-staticroutes-editroute
+##|*NAME=System: Static Routes: Edit route page
+##|*DESCR=Allow access to the 'System: Static Routes: Edit route' page.
+##|*MATCH=system_routes_edit.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("filter.inc");
+require_once("util.inc");
+require_once("gwlb.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_routes.php');
+}
+
+if (!is_array($config['staticroutes']['route'])) {
+ $config['staticroutes']['route'] = array();
+}
+
+$a_routes = &$config['staticroutes']['route'];
+$a_gateways = return_gateways_array(true, true);
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ $id = $_GET['dup'];
+}
+
+if (isset($id) && $a_routes[$id]) {
+ list($pconfig['network'], $pconfig['network_subnet']) =
+ explode('/', $a_routes[$id]['network']);
+ $pconfig['gateway'] = $a_routes[$id]['gateway'];
+ $pconfig['descr'] = $a_routes[$id]['descr'];
+ $pconfig['disabled'] = isset($a_routes[$id]['disabled']);
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ unset($id);
+}
+
+if ($_POST) {
+
+ global $aliastable;
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "network network_subnet gateway");
+ $reqdfieldsn = explode(",",
+ gettext("Destination network") . "," .
+ gettext("Destination network bit count") . "," .
+ gettext("Gateway"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_POST['network'] && !is_ipaddr($_POST['network']) && !is_alias($_POST['network']))) {
+ $input_errors[] = gettext("A valid IPv4 or IPv6 destination network must be specified.");
+ }
+ if (($_POST['network_subnet'] && !is_numeric($_POST['network_subnet']))) {
+ $input_errors[] = gettext("A valid destination network bit count must be specified.");
+ }
+ if (($_POST['gateway']) && is_ipaddr($_POST['network'])) {
+ if (!isset($a_gateways[$_POST['gateway']])) {
+ $input_errors[] = gettext("A valid gateway must be specified.");
+ } else if (isset($a_gateways[$_POST['gateway']]['disabled']) && !$_POST['disabled']) {
+ $input_errors[] = gettext("The gateway is disabled but the route is not. You must disable the route in order to choose a disabled gateway.");
+ } else {
+ // Note that the 3rd parameter "disabled" must be passed as explicitly true or false.
+ if (!validate_address_family($_POST['network'], $_POST['gateway'], $_POST['disabled'] ? true : false)) {
+ $input_errors[] = gettext("The gateway '{$a_gateways[$_POST['gateway']]['gateway']}' is a different Address Family than network '{$_POST['network']}'.");
+ }
+ }
+ }
+
+ /* check for overlaps */
+ $current_targets = get_staticroutes(true);
+ $new_targets = array();
+ if (is_ipaddrv6($_POST['network'])) {
+ $osn = gen_subnetv6($_POST['network'], $_POST['network_subnet']) . "/" . $_POST['network_subnet'];
+ $new_targets[] = $osn;
+ }
+ if (is_ipaddrv4($_POST['network'])) {
+ if ($_POST['network_subnet'] > 32) {
+ $input_errors[] = gettext("A IPv4 subnet can not be over 32 bits.");
+ } else {
+ $osn = gen_subnet($_POST['network'], $_POST['network_subnet']) . "/" . $_POST['network_subnet'];
+ $new_targets[] = $osn;
+ }
+ } elseif (is_alias($_POST['network'])) {
+ $osn = $_POST['network'];
+ foreach (preg_split('/\s+/', $aliastable[$osn]) as $tgt) {
+ if (is_ipaddrv4($tgt)) {
+ $tgt .= "/32";
+ }
+ if (is_ipaddrv6($tgt)) {
+ $tgt .= "/128";
+ }
+ if (!is_subnet($tgt)) {
+ continue;
+ }
+ if (!is_subnetv6($tgt)) {
+ continue;
+ }
+ $new_targets[] = $tgt;
+ }
+ }
+ if (!isset($id)) {
+ $id = count($a_routes);
+ }
+ $oroute = $a_routes[$id];
+ $old_targets = array();
+ if (!empty($oroute)) {
+ if (is_alias($oroute['network'])) {
+ foreach (filter_expand_alias_array($oroute['network']) as $tgt) {
+ if (is_ipaddrv4($tgt)) {
+ $tgt .= "/32";
+ } else if (is_ipaddrv6($tgt)) {
+ $tgt .= "/128";
+ }
+ if (!is_subnet($tgt)) {
+ continue;
+ }
+ $old_targets[] = $tgt;
+ }
+ } else {
+ $old_targets[] = $oroute['network'];
+ }
+ }
+
+ $overlaps = array_intersect($current_targets, $new_targets);
+ $overlaps = array_diff($overlaps, $old_targets);
+ if (count($overlaps)) {
+ $input_errors[] = gettext("A route to these destination networks already exists") . ": " . implode(", ", $overlaps);
+ }
+
+ if (is_array($config['interfaces'])) {
+ foreach ($config['interfaces'] as $if) {
+ if (is_ipaddrv4($_POST['network']) &&
+ isset($if['ipaddr']) && isset($if['subnet']) &&
+ is_ipaddrv4($if['ipaddr']) && is_numeric($if['subnet']) &&
+ ($_POST['network_subnet'] == $if['subnet']) &&
+ (gen_subnet($_POST['network'], $_POST['network_subnet']) == gen_subnet($if['ipaddr'], $if['subnet']))) {
+ $input_errors[] = sprintf(gettext("This network conflicts with address configured on interface %s."), $if['descr']);
+ } else if (is_ipaddrv6($_POST['network']) &&
+ isset($if['ipaddrv6']) && isset($if['subnetv6']) &&
+ is_ipaddrv6($if['ipaddrv6']) && is_numeric($if['subnetv6']) &&
+ ($_POST['network_subnet'] == $if['subnetv6']) &&
+ (gen_subnetv6($_POST['network'], $_POST['network_subnet']) == gen_subnetv6($if['ipaddrv6'], $if['subnetv6']))) {
+ $input_errors[] = sprintf(gettext("This network conflicts with address configured on interface %s."), $if['descr']);
+ }
+ }
+ }
+
+ if (!$input_errors) {
+ $route = array();
+ $route['network'] = $osn;
+ $route['gateway'] = $_POST['gateway'];
+ $route['descr'] = $_POST['descr'];
+ if ($_POST['disabled']) {
+ $route['disabled'] = true;
+ } else {
+ unset($route['disabled']);
+ }
+
+ if (file_exists("{$g['tmp_path']}/.system_routes.apply")) {
+ $toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.system_routes.apply"));
+ } else {
+ $toapplylist = array();
+ }
+ $a_routes[$id] = $route;
+
+ if (!empty($oroute)) {
+ $delete_targets = array_diff($old_targets, $new_targets);
+ if (count($delete_targets)) {
+ foreach ($delete_targets as $dts) {
+ if (is_ipaddrv6($dts)) {
+ $family = "-inet6";
+ }
+ $toapplylist[] = "/sbin/route delete {$family} {$dts}";
+ }
+ }
+ }
+ file_put_contents("{$g['tmp_path']}/.system_routes.apply", serialize($toapplylist));
+
+ mark_subsystem_dirty('staticroutes');
+
+ write_config();
+
+ header("Location: system_routes.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("System"), gettext("Static Routes"), gettext("Edit route"));
+$shortcut_section = "routing";
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
+<script type="text/javascript" src="/javascript/autosuggest.js?rev=1"></script>
+<script type="text/javascript" src="/javascript/suggestions.js"></script>
+<?php include("fbegin.inc");?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+ <form action="system_routes_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="system routes edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Edit route entry"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Destination network"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="network" type="text" class="formfldalias ipv4v6" id="network" size="20" value="<?=htmlspecialchars($pconfig['network']);?>" />
+ /
+ <select name="network_subnet" class="formselect ipv4v6" id="network_subnet">
+ <?php for ($i = 128; $i >= 1; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['network_subnet']) echo "selected=\"selected\""; ?>>
+ <?=$i;?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ <br /><span class="vexpl"><?=gettext("Destination network for this static route"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Gateway"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="gateway" id="gateway" class="formselect">
+ <?php
+ foreach ($a_gateways as $gateway) {
+ echo "<option value='{$gateway['name']}' ";
+ if ($gateway['name'] == $pconfig['gateway']) {
+ echo "selected=\"selected\"";
+ }
+ echo ">" . htmlspecialchars($gateway['name']) . " - " . htmlspecialchars($gateway['gateway']) . "</option>\n";
+ }
+ ?>
+ </select> <br />
+ <div id='addgwbox'>
+ <?=gettext("Choose which gateway this route applies to or"); ?> <a onclick="show_add_gateway();" href="#"><?=gettext("add a new one.");?></a>
+ </div>
+ <div id='notebox'>
+ </div>
+ <div style="display:none" id="status">
+ </div>
+ <div style="display:none" id="addgateway">
+ <table border="1" style="background:#990000; border-style: none none none none; width:225px;" summary="add gateway">
+ <tr>
+ <td>
+ <table bgcolor="#990000" cellpadding="1" cellspacing="1" summary="add">
+ <tr><td>&nbsp;</td></tr>
+ <tr>
+ <td colspan="2" align="center"><b><font color="white"><?=gettext("Add new gateway:"); ?></font></b></td>
+ </tr>
+ <tr><td>&nbsp;</td></tr>
+ <tr>
+ <td width="45%" align="right"><font color="white"><?=gettext("Default gateway:"); ?></font></td><td><input type="checkbox" id="defaultgw" name="defaultgw" /></td>
+ </tr>
+ <tr>
+ <td width="45%" align="right"><font color="white"><?=gettext("Interface:"); ?></font></td>
+ <td>
+ <select name="addinterfacegw" id="addinterfacegw">
+ <?php $gwifs = get_configured_interface_with_descr();
+ foreach ($gwifs as $fif => $dif) {
+ echo "<option value=\"{$fif}\">{$dif}</option>\n";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><font color="white"><?=gettext("Gateway Name:"); ?></font></td><td><input id="name" name="name" value="GW" /></td>
+ </tr>
+ <tr>
+ <td align="right"><font color="white"><?=gettext("Gateway IP:"); ?></font></td><td><input id="gatewayip" name="gatewayip" /></td>
+ </tr>
+ <tr>
+ <td align="right"><font color="white"><?=gettext("Description:"); ?></font></td><td><input id="gatewaydescr" name="gatewaydescr" /></td>
+ </tr>
+ <tr><td>&nbsp;</td></tr>
+ <tr>
+ <td colspan="2" align="center">
+ <div id='savebuttondiv'>
+ <input type="hidden" name="addrtype" id="addrtype" value="IPv4" />
+ <input id="gwsave" type="button" value="<?=gettext("Save Gateway"); ?>" onclick='hide_add_gatewaysave();' />
+ <input id="gwcancel" type="button" value="<?=gettext("Cancel"); ?>" onclick='hide_add_gateway();' />
+ </div>
+ </td>
+ </tr>
+ <tr><td>&nbsp;</td></tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disabled");?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable this static route");?></strong><br />
+ <span class="vexpl"><?=gettext("Set this option to disable this static route without removing it from the list.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br /><span class="vexpl"><?=gettext("You may enter a description here for your reference (not parsed)."); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="save" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <?php if (isset($id) && $a_routes[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ </td>
+ </tr>
+ </table>
+ </form>
+<script type="text/javascript">
+//<![CDATA[
+ var gatewayip;
+ var name;
+ function show_add_gateway() {
+ document.getElementById("addgateway").style.display = '';
+ document.getElementById("addgwbox").style.display = 'none';
+ document.getElementById("gateway").style.display = 'none';
+ document.getElementById("save").style.display = 'none';
+ document.getElementById("cancel").style.display = 'none';
+ document.getElementById("gwsave").style.display = '';
+ document.getElementById("gwcancel").style.display = '';
+ jQuery('#notebox').html("");
+ }
+ function hide_add_gateway() {
+ document.getElementById("addgateway").style.display = 'none';
+ document.getElementById("addgwbox").style.display = '';
+ document.getElementById("gateway").style.display = '';
+ document.getElementById("save").style.display = '';
+ document.getElementById("cancel").style.display = '';
+ document.getElementById("gwsave").style.display = '';
+ document.getElementById("gwcancel").style.display = '';
+ }
+ function hide_add_gatewaysave() {
+ document.getElementById("addgateway").style.display = 'none';
+ jQuery('#status').html('<img src="/themes/<?=$g['theme'];?>/images/misc/loader.gif"> One moment please...');
+ var iface = jQuery('#addinterfacegw').val();
+ name = jQuery('#name').val();
+ var descr = jQuery('#gatewaydescr').val();
+ gatewayip = jQuery('#gatewayip').val();
+ addrtype = jQuery('#addrtype').val();
+ var defaultgw = '';
+ if (jQuery('#defaultgw').checked) {
+ defaultgw = 'yes';
+ }
+ var url = "system_gateways_edit.php";
+ var pars = 'isAjax=true&defaultgw=' + escape(defaultgw) + '&interface=' + escape(iface) + '&name=' + escape(name) + '&descr=' + escape(descr) + '&gateway=' + escape(gatewayip) + '&type=' + escape(addrtype);
+ jQuery.ajax(
+ url,
+ {
+ type: 'post',
+ data: pars,
+ error: report_failure,
+ complete: save_callback
+ });
+ }
+ function addOption(selectbox, text, value) {
+ var optn = document.createElement("OPTION");
+ optn.text = text;
+ optn.value = value;
+ selectbox.append(optn);
+ selectbox.prop('selectedIndex', selectbox.children('option').length-1);
+ jQuery('#notebox').html("<p><strong><?=gettext("NOTE:");?><\/strong> <?php printf(gettext("You can manage Gateways %shere%s."), "<a target='_blank' href='system_gateways.php'>", "<\/a>");?> <\/strong><\/p>");
+ }
+ function report_failure() {
+ alert("<?=gettext("Sorry, we could not create your gateway at this time."); ?>");
+ hide_add_gateway();
+ }
+ function save_callback(transport) {
+ var response = transport.responseText;
+ if (response) {
+ document.getElementById("addgateway").style.display = 'none';
+ hide_add_gateway();
+ jQuery('#status').html('');
+ addOption(jQuery('#gateway'), name, name);
+ } else {
+ report_failure();
+ }
+ }
+ var addressarray = <?= json_encode(get_alias_list(array("host", "network"))) ?>;
+ var oTextbox1 = new AutoSuggestControl(document.getElementById("network"), new StateSuggestions(addressarray));
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_usermanager.php b/src/usr/local/www/system_usermanager.php
new file mode 100644
index 0000000..f08ce7c
--- /dev/null
+++ b/src/usr/local/www/system_usermanager.php
@@ -0,0 +1,1040 @@
+<?php
+/* $Id$ */
+/*
+ system_usermanager.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ part of pfSense
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Copyright (C) 2008 Shrew Soft Inc.
+ All rights reserved.
+
+ Copyright (C) 2005 Paul Taylor <paultaylor@winn-dixie.com>.
+ All rights reserved.
+
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES:
+ pfSense_MODULE: auth
+*/
+
+##|+PRIV
+##|*IDENT=page-system-usermanager
+##|*NAME=System: User Manager page
+##|*DESCR=Allow access to the 'System: User Manager' page.
+##|*MATCH=system_usermanager.php*
+##|-PRIV
+
+require("certs.inc");
+require("guiconfig.inc");
+
+// start admin user code
+$pgtitle = array(gettext("System"), gettext("User Manager"));
+
+if (isset($_POST['userid']) && is_numericint($_POST['userid'])) {
+ $id = $_POST['userid'];
+}
+
+if (!isset($config['system']['user']) || !is_array($config['system']['user'])) {
+ $config['system']['user'] = array();
+}
+
+$a_user = &$config['system']['user'];
+
+if (isset($_SERVER['HTTP_REFERER'])) {
+ $referer = $_SERVER['HTTP_REFERER'];
+} else {
+ $referer = '/system_usermanager.php';
+}
+
+if (isset($id) && $a_user[$id]) {
+ $pconfig['usernamefld'] = $a_user[$id]['name'];
+ $pconfig['descr'] = $a_user[$id]['descr'];
+ $pconfig['expires'] = $a_user[$id]['expires'];
+ $pconfig['groups'] = local_user_get_groups($a_user[$id]);
+ $pconfig['utype'] = $a_user[$id]['scope'];
+ $pconfig['uid'] = $a_user[$id]['uid'];
+ $pconfig['authorizedkeys'] = base64_decode($a_user[$id]['authorizedkeys']);
+ $pconfig['priv'] = $a_user[$id]['priv'];
+ $pconfig['ipsecpsk'] = $a_user[$id]['ipsecpsk'];
+ $pconfig['disabled'] = isset($a_user[$id]['disabled']);
+}
+
+if ($_POST['act'] == "deluser") {
+
+ if (!isset($_POST['username']) || !isset($a_user[$id]) || ($_POST['username'] != $a_user[$id]['name'])) {
+ pfSenseHeader("system_usermanager.php");
+ exit;
+ }
+
+ conf_mount_rw();
+ local_user_del($a_user[$id]);
+ conf_mount_ro();
+ $userdeleted = $a_user[$id]['name'];
+ unset($a_user[$id]);
+ write_config();
+ $savemsg = gettext("User") . " {$userdeleted} " . gettext("successfully deleted") . "<br />";
+} else if ($_POST['act'] == "delpriv") {
+
+ if (!$a_user[$id]) {
+ pfSenseHeader("system_usermanager.php");
+ exit;
+ }
+
+ $privdeleted = $priv_list[$a_user[$id]['priv'][$_POST['privid']]]['name'];
+ unset($a_user[$id]['priv'][$_POST['privid']]);
+ local_user_set($a_user[$id]);
+ write_config();
+ $_POST['act'] = "edit";
+ $savemsg = gettext("Privilege") . " {$privdeleted} " . gettext("successfully deleted"). "<br />";
+} else if ($_POST['act'] == "expcert") {
+
+ if (!$a_user[$id]) {
+ pfSenseHeader("system_usermanager.php");
+ exit;
+ }
+
+ $cert =& lookup_cert($a_user[$id]['cert'][$_POST['certid']]);
+
+ $exp_name = urlencode("{$a_user[$id]['name']}-{$cert['descr']}.crt");
+ $exp_data = base64_decode($cert['crt']);
+ $exp_size = strlen($exp_data);
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$exp_name}");
+ header("Content-Length: $exp_size");
+ echo $exp_data;
+ exit;
+} else if ($_POST['act'] == "expckey") {
+
+ if (!$a_user[$id]) {
+ pfSenseHeader("system_usermanager.php");
+ exit;
+ }
+
+ $cert =& lookup_cert($a_user[$id]['cert'][$_POST['certid']]);
+
+ $exp_name = urlencode("{$a_user[$id]['name']}-{$cert['descr']}.key");
+ $exp_data = base64_decode($cert['prv']);
+ $exp_size = strlen($exp_data);
+
+ header("Content-Type: application/octet-stream");
+ header("Content-Disposition: attachment; filename={$exp_name}");
+ header("Content-Length: $exp_size");
+ echo $exp_data;
+ exit;
+} else if ($_POST['act'] == "delcert") {
+
+ if (!$a_user[$id]) {
+ pfSenseHeader("system_usermanager.php");
+ exit;
+ }
+
+ $certdeleted = lookup_cert($a_user[$id]['cert'][$_POST['certid']]);
+ $certdeleted = $certdeleted['descr'];
+ unset($a_user[$id]['cert'][$_POST['certid']]);
+ write_config();
+ $_POST['act'] = "edit";
+ $savemsg = gettext("Certificate") . " {$certdeleted} " . gettext("association removed.") . "<br />";
+} else if ($_POST['act'] == "new") {
+ /*
+ * set this value cause the text field is read only
+ * and the user should not be able to mess with this
+ * setting.
+ */
+ $pconfig['utype'] = "user";
+ $pconfig['lifetime'] = 3650;
+}
+
+if (isset($_POST['dellall_x'])) {
+
+ $del_users = $_POST['delete_check'];
+
+ if (!empty($del_users)) {
+ foreach ($del_users as $userid) {
+ if (isset($a_user[$userid]) && $a_user[$userid]['scope'] != "system") {
+ conf_mount_rw();
+ local_user_del($a_user[$userid]);
+ conf_mount_ro();
+ unset($a_user[$userid]);
+ }
+ }
+ $savemsg = gettext("Selected users removed successfully!");
+ write_config($savemsg);
+ }
+}
+
+if ($_POST['save']) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if (isset($id) && ($a_user[$id])) {
+ $reqdfields = explode(" ", "usernamefld");
+ $reqdfieldsn = array(gettext("Username"));
+ } else {
+ if (empty($_POST['name'])) {
+ $reqdfields = explode(" ", "usernamefld passwordfld1");
+ $reqdfieldsn = array(
+ gettext("Username"),
+ gettext("Password"));
+ } else {
+ $reqdfields = explode(" ", "usernamefld passwordfld1 name caref keylen lifetime");
+ $reqdfieldsn = array(
+ gettext("Username"),
+ gettext("Password"),
+ gettext("Descriptive name"),
+ gettext("Certificate authority"),
+ gettext("Key length"),
+ gettext("Lifetime"));
+ }
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['usernamefld'])) {
+ $input_errors[] = gettext("The username contains invalid characters.");
+ }
+
+ if (strlen($_POST['usernamefld']) > 16) {
+ $input_errors[] = gettext("The username is longer than 16 characters.");
+ }
+
+ if (($_POST['passwordfld1']) && ($_POST['passwordfld1'] != $_POST['passwordfld2'])) {
+ $input_errors[] = gettext("The passwords do not match.");
+ }
+
+ if (isset($_POST['ipsecpsk']) && !preg_match('/^[[:ascii:]]*$/', $_POST['ipsecpsk'])) {
+ $input_errors[] = gettext("IPsec Pre-Shared Key contains invalid characters.");
+ }
+
+ if (isset($id) && $a_user[$id]) {
+ $oldusername = $a_user[$id]['name'];
+ } else {
+ $oldusername = "";
+ }
+ /* make sure this user name is unique */
+ if (!$input_errors) {
+ foreach ($a_user as $userent) {
+ if ($userent['name'] == $_POST['usernamefld'] && $oldusername != $_POST['usernamefld']) {
+ $input_errors[] = gettext("Another entry with the same username already exists.");
+ break;
+ }
+ }
+ }
+ /* also make sure it is not reserved */
+ if (!$input_errors) {
+ $system_users = explode("\n", file_get_contents("/etc/passwd"));
+ foreach ($system_users as $s_user) {
+ $ent = explode(":", $s_user);
+ if ($ent[0] == $_POST['usernamefld'] && $oldusername != $_POST['usernamefld']) {
+ $input_errors[] = gettext("That username is reserved by the system.");
+ break;
+ }
+ }
+ }
+
+ /*
+ * Check for a valid expiration date if one is set at all (valid means,
+ * DateTime puts out a time stamp so any DateTime compatible time
+ * format may be used. to keep it simple for the enduser, we only
+ * claim to accept MM/DD/YYYY as inputs. Advanced users may use inputs
+ * like "+1 day", which will be converted to MM/DD/YYYY based on "now".
+ * Otherwise such an entry would lead to an invalid expiration data.
+ */
+ if ($_POST['expires']) {
+ try {
+ $expdate = new DateTime($_POST['expires']);
+ //convert from any DateTime compatible date to MM/DD/YYYY
+ $_POST['expires'] = $expdate->format("m/d/Y");
+ } catch (Exception $ex) {
+ $input_errors[] = gettext("Invalid expiration date format; use MM/DD/YYYY instead.");
+ }
+ }
+
+ if (!empty($_POST['name'])) {
+ $ca = lookup_ca($_POST['caref']);
+ if (!$ca) {
+ $input_errors[] = gettext("Invalid internal Certificate Authority") . "\n";
+ }
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if (!$input_errors) {
+ conf_mount_rw();
+ $userent = array();
+ if (isset($id) && $a_user[$id]) {
+ $userent = $a_user[$id];
+ }
+
+ isset($_POST['utype']) ? $userent['scope'] = $_POST['utype'] : $userent['scope'] = "system";
+
+ /* the user name was modified */
+ if (!empty($_POST['oldusername']) && ($_POST['usernamefld'] <> $_POST['oldusername'])) {
+ $_SERVER['REMOTE_USER'] = $_POST['usernamefld'];
+ local_user_del($userent);
+ }
+
+ /* the user password was modified */
+ if ($_POST['passwordfld1']) {
+ local_user_set_password($userent, $_POST['passwordfld1']);
+ }
+
+ $userent['name'] = $_POST['usernamefld'];
+ $userent['descr'] = $_POST['descr'];
+ $userent['expires'] = $_POST['expires'];
+ $userent['authorizedkeys'] = base64_encode($_POST['authorizedkeys']);
+ $userent['ipsecpsk'] = $_POST['ipsecpsk'];
+
+ if ($_POST['disabled']) {
+ $userent['disabled'] = true;
+ } else {
+ unset($userent['disabled']);
+ }
+
+ if (isset($id) && $a_user[$id]) {
+ $a_user[$id] = $userent;
+ } else {
+ if (!empty($_POST['name'])) {
+ $cert = array();
+ $cert['refid'] = uniqid();
+ $userent['cert'] = array();
+
+ $cert['descr'] = $_POST['name'];
+
+ $subject = cert_get_subject_array($ca['crt']);
+
+ $dn = array(
+ 'countryName' => $subject[0]['v'],
+ 'stateOrProvinceName' => $subject[1]['v'],
+ 'localityName' => $subject[2]['v'],
+ 'organizationName' => $subject[3]['v'],
+ 'emailAddress' => $subject[4]['v'],
+ 'commonName' => $userent['name']);
+
+ cert_create($cert, $_POST['caref'], $_POST['keylen'],
+ (int)$_POST['lifetime'], $dn);
+
+ if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+ }
+ $config['cert'][] = $cert;
+ $userent['cert'][] = $cert['refid'];
+ }
+ $userent['uid'] = $config['system']['nextuid']++;
+ /* Add the user to All Users group. */
+ foreach ($config['system']['group'] as $gidx => $group) {
+ if ($group['name'] == "all") {
+ if (!is_array($config['system']['group'][$gidx]['member'])) {
+ $config['system']['group'][$gidx]['member'] = array();
+ }
+ $config['system']['group'][$gidx]['member'][] = $userent['uid'];
+ break;
+ }
+ }
+
+ $a_user[] = $userent;
+ }
+
+ local_user_set($userent);
+ local_user_set_groups($userent, $_POST['groups']);
+ write_config();
+
+ if (is_dir("/etc/inc/privhooks")) {
+ run_plugins("/etc/inc/privhooks");
+ }
+
+ conf_mount_ro();
+
+ pfSenseHeader("system_usermanager.php");
+ }
+}
+
+$closehead = false;
+include("head.inc");
+?>
+
+<link rel="stylesheet" type="text/css" href="/javascript/jquery-ui-timepicker-addon/css/jquery-ui-timepicker-addon.css" />
+<link rel="stylesheet" type="text/css" href="/javascript/jquery/jquery-ui-1.11.1.css" />
+
+<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+ jQuery(function() {
+ jQuery( "#expires" ).datepicker( { dateFormat: 'mm/dd/yy', changeYear: true, yearRange: "+0:+100" } );
+ });
+//]]>
+</script>
+</head>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+
+function setall_selected(id) {
+ selbox = document.getElementById(id);
+ count = selbox.options.length;
+ for (index = 0; index<count; index++) {
+ selbox.options[index].selected = true;
+ }
+}
+
+function delete_empty(id) {
+ selbox = document.getElementById(id);
+ count = selbox.options.length;
+ for (index = 0; index<count; index++) {
+ if (selbox.options[index].value == '') {
+ selbox.remove(index);
+ }
+ }
+}
+
+function clear_selected(id) {
+ selbox = document.getElementById(id);
+ count = selbox.options.length;
+ for (index = 0; index<count; index++) {
+ selbox.options[index].selected = false;
+ }
+}
+
+function remove_selected(id) {
+ selbox = document.getElementById(id);
+ index = selbox.options.length - 1;
+ for (; index >= 0; index--) {
+ if (selbox.options[index].selected) {
+ selbox.remove(index);
+ }
+ }
+}
+
+function copy_selected(srcid, dstid) {
+ src_selbox = document.getElementById(srcid);
+ dst_selbox = document.getElementById(dstid);
+ count = dst_selbox.options.length;
+ for (index = count - 1; index >= 0; index--) {
+ if (dst_selbox.options[index].value == '') {
+ dst_selbox.remove(index);
+ }
+ }
+ count = src_selbox.options.length;
+ for (index = 0; index < count; index++) {
+ if (src_selbox.options[index].selected) {
+ option = document.createElement('option');
+ option.text = src_selbox.options[index].text;
+ option.value = src_selbox.options[index].value;
+ dst_selbox.add(option, null);
+ }
+ }
+}
+
+function move_selected(srcid, dstid) {
+ copy_selected(srcid, dstid);
+ remove_selected(srcid);
+}
+
+function presubmit() {
+ delete_empty('groups');
+ delete_empty('notgroups');
+ clear_selected('notgroups');
+ setall_selected('groups');
+}
+
+function usercertClicked(obj) {
+ if (obj.checked) {
+ document.getElementById("usercertchck").style.display="none";
+ document.getElementById("usercert").style.display="";
+ } else {
+ document.getElementById("usercert").style.display="none";
+ document.getElementById("usercertchck").style.display="";
+ }
+}
+
+function sshkeyClicked(obj) {
+ if (obj.checked) {
+ document.getElementById("sshkeychck").style.display="none";
+ document.getElementById("sshkey").style.display="";
+ } else {
+ document.getElementById("sshkey").style.display="none";
+ document.getElementById("sshkeychck").style.display="";
+ }
+}
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="user manager">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Users"), true, "system_usermanager.php");
+ $tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
+ $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+ $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+<?php
+ if ($_POST['act'] == "new" || $_POST['act'] == "edit" || $input_errors):
+?>
+ <form action="system_usermanager.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
+ <input type="hidden" id="act" name="act" value="" />
+ <input type="hidden" id="userid" name="userid" value="<?=(isset($id) ? $id : '');?>" />
+ <input type="hidden" id="privid" name="privid" value="" />
+ <input type="hidden" id="certid" name="certid" value="" />
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+<?php
+ $ro = "";
+ if ($pconfig['utype'] == "system") {
+ $ro = "readonly=\"readonly\"";
+ }
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Defined by");?></td>
+ <td width="78%" class="vtable">
+ <strong><?=strtoupper(htmlspecialchars($pconfig['utype']));?></strong>
+ <input name="utype" type="hidden" value="<?=htmlspecialchars($pconfig['utype'])?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disabled");?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
+ <td width="78%" class="vtable">
+ <input name="usernamefld" type="text" class="formfld user" id="usernamefld" size="20" maxlength="16" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" <?=$ro;?> />
+ <input name="oldusername" type="hidden" id="oldusername" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq" rowspan="2"><?=gettext("Password");?></td>
+ <td width="78%" class="vtable">
+ <input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" value="" />
+ </td>
+ </tr>
+ <tr>
+ <td width="78%" class="vtable">
+ <input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" value="" />&nbsp;<?= gettext("(confirmation)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Full name");?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>" <?=$ro;?> />
+ <br />
+ <?=gettext("User's full name, for your own information only");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Expiration date"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="expires" type="text" class="formfld unknown" id="expires" size="10" value="<?=htmlspecialchars($pconfig['expires']);?>" />
+ <br />
+ <span class="vexpl"><?=gettext("Leave blank if the account shouldn't expire, otherwise enter the expiration date in the following format: mm/dd/yyyy"); ?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Group Memberships");?></td>
+ <td width="78%" class="vtable" align="center">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="group membership">
+ <tr>
+ <td align="center" width="50%">
+ <strong><?=gettext("Not Member Of"); ?></strong><br />
+ <br />
+ <select size="10" style="width: 75%" name="notgroups[]" class="formselect" id="notgroups" onchange="clear_selected('groups')" multiple="multiple">
+<?php
+ $rowIndex = 0;
+ foreach ($config['system']['group'] as $group):
+ if ($group['gid'] == 1998) { /* all users group */
+ continue;
+ }
+ if (is_array($pconfig['groups']) && in_array($group['name'], $pconfig['groups'])) {
+ continue;
+ }
+ $rowIndex++;
+?>
+ <option value="<?=$group['name'];?>" <?=$selected;?>>
+ <?=htmlspecialchars($group['name']);?>
+ </option>
+<?php
+ endforeach;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+?>
+ </select>
+ <br />
+ </td>
+ <td>
+ <br />
+ <a href="javascript:move_selected('notgroups', 'groups')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_right.gif" title="<?=gettext("Add Groups"); ?>" alt="<?=gettext("Add Groups"); ?>" width="17" height="17" border="0" />
+ </a>
+ <br /><br />
+ <a href="javascript:move_selected('groups', 'notgroups')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_left.gif" title="<?=gettext("Remove Groups"); ?>" alt="<?=gettext("Remove Groups"); ?>" width="17" height="17" border="0" />
+ </a>
+ </td>
+ <td align="center" width="50%">
+ <strong><?=gettext("Member Of"); ?></strong><br />
+ <br />
+ <select size="10" style="width: 75%" name="groups[]" class="formselect" id="groups" onchange="clear_selected('notgroups')" multiple="multiple">
+<?php
+ $rowIndex = 0;
+ if (is_array($pconfig['groups'])):
+ foreach ($config['system']['group'] as $group):
+ if ($group['gid'] == 1998) { /* all users group */
+ continue;
+ }
+ if (!in_array($group['name'], $pconfig['groups'])) {
+ continue;
+ }
+ $rowIndex++;
+?>
+ <option value="<?=$group['name'];?>">
+ <?=htmlspecialchars($group['name']);?>
+ </option>
+<?php
+ endforeach;
+ endif;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+?>
+ </select>
+ <br />
+ </td>
+ </tr>
+ </table>
+ <?=gettext("Hold down CTRL (pc)/COMMAND (mac) key to select multiple items");?>
+ </td>
+ </tr>
+<?php
+ if (isset($pconfig['uid'])):
+?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Effective Privileges");?></td>
+ <td width="78%" class="vtable">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="privileges">
+ <tr>
+ <td width="20%" class="listhdrr"><?=gettext("Inherited From");?></td>
+ <td width="30%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="40%" class="listhdrr"><?=gettext("Description");?></td>
+ <td class="list"></td>
+ </tr>
+<?php
+ $privdesc = get_user_privdesc($a_user[$id]);
+ if (is_array($privdesc)):
+ $i = 0;
+ foreach ($privdesc as $priv):
+ $group = false;
+ if ($priv['group']) {
+ $group = $priv['group'];
+ }
+?>
+ <tr>
+ <td class="listlr"><?=$group;?></td>
+ <td class="listr">
+ <?=htmlspecialchars($priv['name']);?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($priv['descr']);?>
+ </td>
+ <td valign="middle" class="list nowrap">
+<?php
+ if (!$group):
+?>
+ <input type="image" name="delpriv[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
+ onclick="document.getElementById('privid').value='<?=$i;?>';
+ document.getElementById('userid').value='<?=$id;?>';
+ document.getElementById('act').value='<?php echo "delpriv";?>';
+ return confirm('<?=gettext("Do you really want to delete this privilege?");?>');"
+ title="<?=gettext("delete privilege");?>" />
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+<?php
+ /* can only delete user priv indexes */
+ if (!$group) {
+ $i++;
+ }
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <a href="system_usermanager_addprivs.php?userid=<?=$id?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("User Certificates");?></td>
+ <td width="78%" class="vtable">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="certificates">
+ <tr>
+ <td width="45%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="45%" class="listhdrr"><?=gettext("CA");?></td>
+ <td class="list"></td>
+ </tr>
+<?php
+ $a_cert = $a_user[$id]['cert'];
+ if (is_array($a_cert)):
+ $i = 0;
+ foreach ($a_cert as $certref):
+ $cert = lookup_cert($certref);
+ $ca = lookup_ca($cert['caref']);
+?>
+ <tr>
+ <td class="listlr">
+ <?=htmlspecialchars($cert['descr']);?>
+<?php
+ if (is_cert_revoked($cert)):
+?>
+ (<b>Revoked</b>)
+<?php
+ endif;
+?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($ca['descr']);?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <input type="image" name="expckey[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_down.gif"
+ onclick="document.getElementById('certid').value='<?=$i;?>';
+ document.getElementById('userid').value='<?=$id;?>';
+ document.getElementById('act').value='<?php echo "expckey";?>';"
+ title="<?=gettext("export private key");?>" />
+ <input type="image" name="expcert[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_down.gif"
+ onclick="document.getElementById('certid').value='<?=$i;?>';
+ document.getElementById('userid').value='<?=$id;?>';
+ document.getElementById('act').value='<?php echo "expcert";?>';"
+ title="<?=gettext("export cert");?>" />
+ <input type="image" name="delcert[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
+ onclick="document.getElementById('certid').value='<?=$i;?>';
+ document.getElementById('userid').value='<?=$id;?>';
+ document.getElementById('act').value='<?php echo "delcert";?>';
+ return confirm('<?=gettext("Do you really want to remove this certificate association?") .'\n'. gettext("(Certificate will not be deleted)");?>')"
+ title="<?=gettext("delete cert");?>" />
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+ endif;
+?>
+ <tr>
+ <td class="list" colspan="2"></td>
+ <td class="list">
+ <a href="system_certmanager.php?act=new&amp;userid=<?=$id?>">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+<?php
+ else:
+ if (is_array($config['ca']) && count($config['ca']) > 0):
+ $i = 0;
+ foreach ($config['ca'] as $ca) {
+ if (!$ca['prv']) {
+ continue;
+ }
+ $i++;
+ }
+?>
+
+ <tr id="usercertchck">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Certificate");?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" onclick="javascript:usercertClicked(this)" /> <?=gettext("Click to create a user certificate."); ?>
+ </td>
+ </tr>
+
+<?php
+ if ($i > 0):
+?>
+ <tr id="usercert" style="display:none">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Certificate");?></td>
+ <td width="78%" class="vtable">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="certificate">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Descriptive name");?></td>
+ <td width="78%" class="vtable">
+ <input name="name" type="text" class="formfld unknown" id="name" size="20" value="<?=htmlspecialchars($pconfig['name']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Certificate authority");?></td>
+ <td width="78%" class="vtable">
+ <select name='caref' id='caref' class="formselect" onchange='internalca_change()'>
+<?php
+ $rowIndex = 0;
+ foreach ($config['ca'] as $ca):
+ if (!$ca['prv']) {
+ continue;
+ }
+ $rowIndex++;
+?>
+ <option value="<?=$ca['refid'];?>"><?=htmlspecialchars($ca['descr']);?></option>
+<?php
+ endforeach;
+ if ($rowIndex == 0) {
+ echo "<option></option>";
+ }
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Key length");?></td>
+ <td width="78%" class="vtable">
+ <select name='keylen' class="formselect">
+<?php
+ $cert_keylens = array("2048", "512", "1024", "4096");
+ foreach ($cert_keylens as $len):
+?>
+ <option value="<?=$len;?>"><?=$len;?></option>
+<?php
+ endforeach;
+ if (!count($cert_keylens)) {
+ echo "<option></option>";
+ }
+?>
+ </select>
+ bits
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Lifetime");?></td>
+ <td width="78%" class="vtable">
+ <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="5" value="<?=htmlspecialchars($pconfig['lifetime']);?>" />days
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ endif;
+ endif;
+ endif;
+?>
+ <tr id="sshkeychck" <?php if (!empty($pconfig['authorizedkeys'])) echo 'style="display:none"'; ?>>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Authorized keys");?></td>
+ <td width="78%" class="vtable">
+ <input type="checkbox" onclick="javascript:sshkeyClicked(this)" /> <?=gettext("Click to paste an authorized key."); ?>
+ </td>
+ </tr>
+ <tr id="sshkey" <?php if (empty($pconfig['authorizedkeys'])) echo 'style="display:none"'; ?>>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Authorized keys");?></td>
+ <td width="78%" class="vtable">
+ <script type="text/javascript">
+ //<![CDATA[
+ window.onload=function() {
+ document.getElementById("authorizedkeys").wrap='off';
+ }
+ //]]>
+ </script>
+ <textarea name="authorizedkeys" cols="65" rows="7" id="authorizedkeys" class="formfld_cert"><?=htmlspecialchars($pconfig['authorizedkeys']);?></textarea>
+ <br />
+ <?=gettext("Paste an authorized keys file here.");?>
+ </td>
+ </tr>
+ <tr id="ipsecpskrow">
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPsec Pre-Shared Key");?></td>
+ <td width="78%" class="vtable">
+ <input name="ipsecpsk" type="text" class="formfld unknown" id="ipsecpsk" size="65" value="<?=htmlspecialchars($pconfig['ipsecpsk']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <?php if (isset($id) && $a_user[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif;?>
+ </td>
+ </tr>
+ </table>
+ </form>
+<?php
+ else:
+?>
+ <form action="system_usermanager.php" method="post" name="iform2" id="iform2">
+ <input type="hidden" id="act" name="act" value="" />
+ <input type="hidden" id="userid" name="userid" value="<?=(isset($id) ? $id : '');?>" />
+ <input type="hidden" id="username" name="username" value="" />
+ <input type="hidden" id="privid" name="privid" value="" />
+ <input type="hidden" id="certid" name="certid" value="" />
+ <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
+ <thead>
+ <tr>
+ <th width="5%" class="list">&nbsp;</th>
+ <th width="25%" class="listhdrr"><?=gettext("Username"); ?></th>
+ <th width="25%" class="listhdrr"><?=gettext("Full name"); ?></th>
+ <th width="5%" class="listhdrr"><?=gettext("Disabled"); ?></th>
+ <th width="25%" class="listhdrr"><?=gettext("Groups"); ?></th>
+ <th width="10%" class="list"></th>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="5"></td>
+ <td class="list">
+ <input type="image" name="addcert" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_plus.gif"
+ onclick="document.getElementById('act').value='<?php echo "new";?>';"
+ title="<?=gettext("add user");?>" />
+ <input type="image" src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" name="dellall" title="<?=gettext('Delete selected users')?>" onClick="return confirm('<?=gettext("Do you really want to delete selected Users?");?>')" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="5">
+ <p>
+ <?=gettext("Additional users can be added here. User permissions for accessing " .
+ "the webConfigurator can be assigned directly or inherited from group memberships. " .
+ "An icon that appears grey indicates that it is a system defined object. " .
+ "Some system object properties can be modified but they cannot be deleted."); ?>
+ <br /><br />
+ <?=gettext("Accounts created here are also used for other parts of the system " .
+ "such as OpenVPN, IPsec, and Captive Portal.");?>
+ </p>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+<?php
+ $i = 0;
+ foreach ($a_user as $userent):
+?>
+ <tr ondblclick="document.getElementById('act').value='<?php echo "edit";?>';
+ document.getElementById('userid').value='<?=$i;?>';
+ document.iform2.submit();" id="fr<?=$i?>">
+ <td class="list" id="frd<?=$i?>">
+ <?php if ($userent['scope'] != "system") : ?>
+ <input type="checkbox" id="frc<?=$i?>" onclick="fr_bgcolor(<?=$i?>)" name="delete_check[]" value="<?=$i?>" />
+ <?php endif; ?>
+ </td>
+ <td class="listlr" id="frd<?=$i?>" onclick="fr_toggle('<?=$i;?>')">
+ <table border="0" cellpadding="0" cellspacing="0" summary="icons">
+ <tr>
+ <td align="left" valign="middle">
+<?php
+ if ($userent['scope'] != "user") {
+ $usrimg = "/themes/{$g['theme']}/images/icons/icon_system-user-grey.png";
+ } else {
+ $usrimg = "/themes/{$g['theme']}/images/icons/icon_system-user.png";
+ }
+?>
+ <img src="<?=$usrimg;?>" alt="<?=gettext("User"); ?>" title="<?=gettext("User"); ?>" border="0" height="16" width="16" />
+ </td>
+ <td align="left" valign="middle">
+ <?=htmlspecialchars($userent['name']);?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td class="listr" id="frd<?=$i?>" onclick="fr_toggle('<?=$i;?>')"><?=htmlspecialchars($userent['descr']);?>&nbsp;</td>
+ <td class="listr" id="frd<?=$i?>" onclick="fr_toggle('<?=$i;?>')"><?php if (isset($userent['disabled'])) echo "*"; ?></td>
+ <td class="listbg" onclick="fr_toggle('<?=$i;?>')">
+ <?=implode(",", local_user_get_groups($userent));?>
+ &nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <input type="image" name="edituser[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_e.gif"
+ onclick="document.getElementById('userid').value='<?=$i;?>';
+ document.getElementById('act').value='<?php echo "edit";?>';"
+ title="<?=gettext("edit user");?>" />
+<?php
+ if ($userent['scope'] != "system"):
+?>
+ &nbsp;
+ <input type="image" name="deluser[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif"
+ onclick="document.getElementById('userid').value='<?=$i;?>';
+ document.getElementById('username').value='<?=$userent['name'];?>';
+ document.getElementById('act').value='<?php echo "deluser";?>';
+ return confirm('<?=gettext("Do you really want to delete this user?");?>');"
+ title="<?=gettext("delete user");?>" />
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ </tbody>
+ </table>
+ </form>
+<?php
+ endif;
+?>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc");?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_usermanager_addprivs.php b/src/usr/local/www/system_usermanager_addprivs.php
new file mode 100644
index 0000000..40b11a6
--- /dev/null
+++ b/src/usr/local/www/system_usermanager_addprivs.php
@@ -0,0 +1,220 @@
+<?php
+/* $Id$ */
+/*
+ system_usermanager_addprivs.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Copyright (C) 2006 Daniel S. Haischt.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: auth
+*/
+
+##|+PRIV
+##|*IDENT=page-system-usermanager-addprivs
+##|*NAME=System: User Manager: Add Privileges page
+##|*DESCR=Allow access to the 'System: User Manager: Add Privileges' page.
+##|*MATCH=system_usermanager_addprivs.php*
+##|-PRIV
+
+function admusercmp($a, $b) {
+ return strcasecmp($a['name'], $b['name']);
+}
+
+require("guiconfig.inc");
+
+$pgtitle = array("System", "User manager", "Add privileges");
+
+if (is_numericint($_GET['userid'])) {
+ $userid = $_GET['userid'];
+}
+if (isset($_POST['userid']) && is_numericint($_POST['userid'])) {
+ $userid = $_POST['userid'];
+}
+
+if (!isset($config['system']['user'][$userid]) && !is_array($config['system']['user'][$userid])) {
+ pfSenseHeader("system_usermanager.php");
+ exit;
+}
+
+$a_user = & $config['system']['user'][$userid];
+
+if (!is_array($a_user['priv'])) {
+ $a_user['priv'] = array();
+}
+
+if ($_POST) {
+ conf_mount_rw();
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "sysprivs");
+ $reqdfieldsn = array(gettext("Selected privileges"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if (!$input_errors) {
+
+ if (!is_array($pconfig['sysprivs'])) {
+ $pconfig['sysprivs'] = array();
+ }
+
+ if (!count($a_user['priv'])) {
+ $a_user['priv'] = $pconfig['sysprivs'];
+ } else {
+ $a_user['priv'] = array_merge($a_user['priv'], $pconfig['sysprivs']);
+ }
+
+ $a_user['priv'] = sort_user_privs($a_user['priv']);
+ local_user_set($a_user);
+ $retval = write_config();
+ $savemsg = get_std_save_message($retval);
+ conf_mount_ro();
+
+ post_redirect("system_usermanager.php", array('act' => 'edit', 'userid' => $userid));
+
+ exit;
+ }
+ conf_mount_ro();
+}
+
+/* if ajax is calling, give them an update message */
+if (isAjax()) {
+ print_info_box_np($savemsg);
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+<?php
+
+if (is_array($priv_list)) {
+ $id = 0;
+
+ $jdescs = "var descs = new Array();\n";
+ foreach ($priv_list as $pname => $pdata) {
+ if (in_array($pname, $a_user['priv'])) {
+ continue;
+ }
+ $desc = addslashes(preg_replace("/pfSense/i", $g['product_name'], $pdata['descr']));
+ $jdescs .= "descs[{$id}] = '{$desc}';\n";
+ $id++;
+ }
+
+ echo $jdescs;
+}
+
+?>
+
+function update_description() {
+ var index = document.iform.sysprivs.selectedIndex;
+ document.getElementById("pdesc").innerHTML = descs[index];
+}
+
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="user manager add privileges">
+ <tr>
+ <td>
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Users"), true, "system_usermanager.php");
+ $tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
+ $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+ $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <form action="system_usermanager_addprivs.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("System Privileges");?></td>
+ <td width="78%" class="vtable">
+ <select name="sysprivs[]" id="sysprivs" class="formselect" onchange="update_description();" multiple="multiple" size="35">
+ <?php
+ foreach ($priv_list as $pname => $pdata):
+ if (in_array($pname, $a_user['priv'])) {
+ continue;
+ }
+ ?>
+ <option value="<?=$pname;?>"><?=$pdata['name'];?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Hold down CTRL (pc)/COMMAND (mac) key to select multiple items");?>
+ </td>
+ </tr>
+ <tr height="60">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
+ <td width="78%" valign="top" class="vtable" id="pdesc">
+ <em><?=gettext("Select a privilege from the list above for a description"); ?></em>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submitt" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input id="cancelbutton" class="formbtn" type="button" value="<?=gettext("Cancel");?>" onclick="history.back()" />
+ <?php if (isset($userid)): ?>
+ <input name="userid" type="hidden" value="<?=htmlspecialchars($userid);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_usermanager_passwordmg.php b/src/usr/local/www/system_usermanager_passwordmg.php
new file mode 100644
index 0000000..6d785ee
--- /dev/null
+++ b/src/usr/local/www/system_usermanager_passwordmg.php
@@ -0,0 +1,155 @@
+<?php
+/* $Id$ */
+/*
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2011 Ermal Luçi
+ system_usermanager_passwordmg.php
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES:
+ pfSense_MODULE: auth
+*/
+
+##|+PRIV
+##|*IDENT=page-system-usermanager-passwordmg
+##|*NAME=System: User Password Manager page
+##|*DESCR=Allow access to the 'System: User Password Manager' page.
+##|*MATCH=system_usermanager_passwordmg.php*
+##|-PRIV
+
+require_once("auth.inc");
+require_once("certs.inc");
+require_once("guiconfig.inc");
+
+$pgtitle = array(gettext("System"), gettext("User Password"));
+
+if (isset($_POST['save'])) {
+ unset($input_errors);
+ /* input validation */
+
+ $reqdfields = explode(" ", "passwordfld1");
+ $reqdfieldsn = array(gettext("Password"));
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($_POST['passwordfld1'] != $_POST['passwordfld2']) {
+ $input_errors[] = gettext("The passwords do not match.");
+ }
+
+ if (!$input_errors) {
+ if (!session_id()) {
+ session_start();
+ }
+ // all values are okay --> saving changes
+
+ $userent =& $config['system']['user'][$userindex[$_SESSION['Username']]];
+ local_user_set_password($userent, $_POST['passwordfld1']);
+ local_user_set($userent);
+ unset($userent);
+ session_commit();
+
+ write_config();
+
+ $savemsg = gettext("Password successfully changed") . "<br />";
+ }
+}
+
+if (!session_id()) {
+ session_start();
+}
+
+/* determine if user is not local to system */
+$islocal = false;
+foreach ($config['system']['user'] as $user) {
+ if ($user['name'] == $_SESSION['Username']) {
+ $islocal = true;
+ }
+}
+
+session_commit();
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php
+include("fbegin.inc");
+
+if ($input_errors) {
+ print_input_errors($input_errors);
+}
+if ($savemsg) {
+ print_info_box($savemsg);
+}
+
+if ($islocal == false) {
+ echo gettext("Sorry, you cannot change the password for a non-local user.");
+ include("fend.inc");
+ exit;
+}
+
+?>
+
+<div id="mainarea">
+ <div class="tabcont">
+ <form action="system_usermanager_passwordmg.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+<?php
+ if (!session_id()) {
+ session_start();
+ }
+?>
+ <td colspan="2" valign="top" class="listtopic"><?=$_SESSION['Username']?>'s <?=gettext("Password"); ?></td>
+<?php session_commit(); ?>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell" rowspan="2"><?=gettext("Password"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" />
+ </td>
+ </tr>
+ <tr>
+ <td width="78%" class="vtable">
+ <input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" />
+ &nbsp;<?=gettext("(confirmation)");?>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Select a new password");?>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+</div>
+<?php include("fend.inc");?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_usermanager_settings.php b/src/usr/local/www/system_usermanager_settings.php
new file mode 100644
index 0000000..cadfb08
--- /dev/null
+++ b/src/usr/local/www/system_usermanager_settings.php
@@ -0,0 +1,185 @@
+<?php
+/* $Id$ */
+/*
+ system_usermanager_settings.php
+
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2007 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2007 Bill Marquette <bill.marquette@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: auth
+*/
+
+##|+PRIV
+##|*IDENT=page-system-usermanager-settings
+##|*NAME=System: User Manager: settings page
+##|*DESCR=Allow access to the 'System: User Manager: settings' page.
+##|*MATCH=system_usermanager_settings.php*
+##|-PRIV
+
+require("guiconfig.inc");
+
+$pconfig['session_timeout'] = &$config['system']['webgui']['session_timeout'];
+$pconfig['authmode'] = &$config['system']['webgui']['authmode'];
+$pconfig['backend'] = &$config['system']['webgui']['backend'];
+
+// Page title for main admin
+$pgtitle = array(gettext("System"), gettext("User manager settings"));
+
+$save_and_test = false;
+if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (isset($_POST['session_timeout'])) {
+ $timeout = intval($_POST['session_timeout']);
+ if ($timeout != "" && (!is_numeric($timeout) || $timeout <= 0)) {
+ $input_errors[] = gettext("Session timeout must be an integer value.");
+ }
+ }
+
+ if (!$input_errors) {
+ if ($_POST['authmode'] != "local") {
+ $authsrv = auth_get_authserver($_POST['authmode']);
+ if ($_POST['savetest']) {
+ if ($authsrv['type'] == "ldap") {
+ $save_and_test = true;
+ } else {
+ $savemsg = gettext("The test was not performed because it is supported only for ldap based backends.");
+ }
+ }
+ }
+
+
+ if (isset($_POST['session_timeout']) && $_POST['session_timeout'] != "") {
+ $config['system']['webgui']['session_timeout'] = intval($_POST['session_timeout']);
+ } else {
+ unset($config['system']['webgui']['session_timeout']);
+ }
+
+ if ($_POST['authmode']) {
+ $config['system']['webgui']['authmode'] = $_POST['authmode'];
+ } else {
+ unset($config['system']['webgui']['authmode']);
+ }
+
+ write_config();
+
+ }
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc");?>
+<?php if ($input_errors) print_input_errors($input_errors);?>
+<?php if ($savemsg) print_info_box($savemsg);?>
+
+<?php
+ if ($save_and_test) {
+ echo "<script type=\"text/javascript\">\n";
+ echo "//<![CDATA[\n";
+ echo "myRef = window.open('system_usermanager_settings_test.php?authserver={$pconfig['authmode']}','mywin', ";
+ echo "'left=20,top=20,width=700,height=550,toolbar=1,resizable=0');\n";
+ echo "if (myRef==null || typeof(myRef)=='undefined') alert('" . gettext("Popup blocker detected. Action aborted.") ."');\n";
+ echo "//]]>\n";
+ echo "</script>\n";
+ }
+?>
+
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="user manager settings">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Users"), false, "system_usermanager.php");
+ $tab_array[] = array(gettext("Groups"), false, "system_groupmanager.php");
+ $tab_array[] = array(gettext("Settings"), true, "system_usermanager_settings.php");
+ $tab_array[] = array(gettext("Servers"), false, "system_authservers.php");
+ display_top_tabs($tab_array);
+
+ /* Default to pfsense backend type if none is defined */
+ if (!$pconfig['backend']) {
+ $pconfig['backend'] = "pfsense";
+ }
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <form id="iform" name="iform" action="system_usermanager_settings.php" method="post">
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="6" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Session Timeout"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="session_timeout" id="session_timeout" type="text" size="8" value="<?=htmlspecialchars($pconfig['session_timeout']);?>" />
+ <br />
+ <?=gettext("Time in minutes to expire idle management sessions. The default is 4 hours (240 minutes).");?><br />
+ <?=gettext("Enter 0 to never expire sessions. NOTE: This is a security risk!");?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Authentication Server"); ?></td>
+ <td width="78%" class="vtable">
+ <select name='authmode' id='authmode' class="formselect" >
+<?php
+ $auth_servers = auth_get_authserver_list();
+ foreach ($auth_servers as $auth_server):
+ $selected = "";
+ if ($auth_server['name'] == $pconfig['authmode']) {
+ $selected = "selected=\"selected\"";
+ }
+ if (!isset($pconfig['authmode']) && $auth_server['name'] == "Local Database") {
+ $selected = "selected=\"selected\"";
+ }
+?>
+ <option value="<?=$auth_server['name'];?>" <?=$selected;?>><?=$auth_server['name'];?></option>
+<?php
+ endforeach;
+?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="save" name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <input id="savetest" name="savetest" type="submit" class="formbtn" value="<?=gettext("Save and Test");?>" />
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+ </td>
+ </tr>
+ </table>
+<?php include("fend.inc");?>
+</body>
+</html>
diff --git a/src/usr/local/www/system_usermanager_settings_ldapacpicker.php b/src/usr/local/www/system_usermanager_settings_ldapacpicker.php
new file mode 100644
index 0000000..068142e
--- /dev/null
+++ b/src/usr/local/www/system_usermanager_settings_ldapacpicker.php
@@ -0,0 +1,131 @@
+<?php
+/* $Id$ */
+/*
+ system_usermanager_settings_ldapacpicker.php
+ part of pfSense (https://www.pfsense.org/)
+ Copyright (C) 2007 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: auth
+*/
+
+require("guiconfig.inc");
+require_once("auth.inc");
+
+$ous = array();
+
+if ($_GET) {
+ $authcfg = array();
+ $authcfg['ldap_port'] = $_GET['port'];
+ $authcfg['ldap_basedn'] = $_GET['basedn'];
+ $authcfg['host'] = $_GET['host'];
+ $authcfg['ldap_scope'] = $_GET['scope'];
+ $authcfg['ldap_binddn'] = $_GET['binddn'];
+ $authcfg['ldap_bindpw'] = $_GET['bindpw'];
+ $authcfg['ldap_urltype'] = $_GET['urltype'];
+ $authcfg['ldap_protver'] = $_GET['proto'];
+ $authcfg['ldap_authcn'] = explode(";", $_GET['authcn']);
+ $authcfg['ldap_caref'] = $_GET['cert'];
+ $ous = ldap_get_user_ous(true, $authcfg);
+}
+
+?>
+<html>
+ <head>
+ <STYLE type="text/css">
+ TABLE {
+ border-width: 1px 1px 1px 1px;
+ border-spacing: 0px;
+ border-style: solid solid solid solid;
+ border-color: gray gray gray gray;
+ border-collapse: separate;
+ background-color: collapse;
+ }
+ TD {
+ border-width: 0px 0px 0px 0px;
+ border-spacing: 0px;
+ border-style: solid solid solid solid;
+ border-color: gray gray gray gray;
+ border-collapse: collapse;
+ background-color: white;
+ }
+ </STYLE>
+ </head>
+<script type="text/javascript">
+function post_choices() {
+
+ var ous = <?php echo count($ous); ?>;
+ var i;
+ opener.document.forms[0].ldapauthcontainers.value="";
+ for (i = 0; i < ous; i++) {
+ if (document.forms[0].ou[i].checked) {
+ if (opener.document.forms[0].ldapauthcontainers.value != "") {
+ opener.document.forms[0].ldapauthcontainers.value+=";";
+ }
+ opener.document.forms[0].ldapauthcontainers.value+=document.forms[0].ou[i].value;
+ }
+ }
+ window.close();
+-->
+}
+</script>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" >
+<form method="post" action="system_usermanager_settings_ldapacpicker.php">
+<?php if (empty($ous)): ?>
+ <p><?=gettext("Could not connect to the LDAP server. Please check your LDAP configuration.");?></p>
+ <input type='button' value='<?=gettext("Close"); ?>' onClick="window.close();">
+<?php else: ?>
+ <b><?=gettext("Please select which containers to Authenticate against:");?></b>
+ <p/>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td class="tabnavtbl">
+ <table width="100%">
+<?php
+ if (is_array($ous)) {
+ foreach ($ous as $ou) {
+ if (in_array($ou, $authcfg['ldap_authcn'])) {
+ $CHECKED=" CHECKED";
+ } else {
+ $CHECKED="";
+ }
+ echo " <tr><td><input type='checkbox' value='{$ou}' id='ou' name='ou[]'{$CHECKED}> {$ou}<br /></td></tr>\n";
+ }
+ }
+?>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+ <p/>
+
+ <input type='button' value='<?=gettext("Save");?>' onClick="post_choices();">
+<?php endif; ?>
+</form>
+</body>
+</html>
diff --git a/src/usr/local/www/system_usermanager_settings_test.php b/src/usr/local/www/system_usermanager_settings_test.php
new file mode 100755
index 0000000..9076262
--- /dev/null
+++ b/src/usr/local/www/system_usermanager_settings_test.php
@@ -0,0 +1,134 @@
+<?php
+/* $Id$ */
+/*
+ system_usermanager_settings_test.php
+ part of pfSense (https://www.pfsense.org/)
+ Copyright (C) 2007 Scott Ullrich <sullrich@gmail.com>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2014 Silvio Giunge <desenvolvimento@bluepex.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: auth
+*/
+
+##|+PRIV
+##|*IDENT=page-system-usermanager-settings-testldap
+##|*NAME=System: User Manager: Settings: Test LDAP page
+##|*DESCR=Allow access to the 'System: User Manager: Settings: Test LDAP' page.
+##|*MATCH=system_usermanager_settings_test.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("auth.inc");
+
+if (isset($config['system']['authserver'][0]['host'])) {
+ $auth_server = $config['system']['authserver'][0]['host'];
+ $authserver = $_GET['authserver'];
+ $authcfg = auth_get_authserver($authserver);
+}
+
+?>
+
+<html>
+<HEAD>
+ <STYLE type="text/css">
+ TABLE {
+ border-width: 1px;
+ border-spacing: 0px;
+ border-style: solid solid solid solid;
+ border-color: gray gray gray gray;
+ border-collapse: separate;
+ background-color: collapse;
+ }
+ TD {
+ border-width: 1px 1px 1px 1px;
+ border-spacing: 0px;
+ border-style: solid solid solid solid;
+ border-color: gray gray gray gray;
+ border-collapse: collapse;
+ background-color: #dddddd;
+ }
+ </STYLE>
+</HEAD>
+<body>
+ <form method="post" name="iform" id="iform">
+
+<?php
+$theme = $config['theme'];
+
+if (!$authcfg) {
+ printf(gettext("Could not find settings for %s%s"), htmlspecialchars($authserver), "<p/>");
+} else {
+ if ($theme != "" && file_exists("/usr/local/www/themes/{$theme}/images/logo.gif")) {
+ echo "<p><img src='/themes/{$theme}/images/logo.gif' style='float: left'><br/><br/><br/></p>";
+ }
+ echo "<b>" . sprintf(gettext("Testing %s LDAP settings... One moment please..."), $g['product_name']) . "</b>";
+
+ echo "<table width='100%'>";
+
+ echo "<tr><td>" . gettext("Attempting connection to") . " " . "<td><center>$auth_server</b></center></td>";
+ if (ldap_test_connection($authcfg)) {
+ echo "<td><center><font color=green>OK</center></td></tr>";
+
+ echo "<tr><td>" . gettext("Attempting bind to") . " " . "<td><center>$auth_server</b></center></td>";
+ if (ldap_test_bind($authcfg)) {
+ echo "<td><center><font color=green>OK</center></td></tr>";
+
+ echo "<tr><td>" . gettext("Attempting to fetch Organizational Units from") . " " . "<td><center>$auth_server</b></center></td>";
+ $ous = ldap_get_user_ous(true, $authcfg);
+ if (count($ous)>1) {
+ echo "<td><center><font color=green>OK</center></td></tr>";
+ echo "</table>";
+ if (is_array($ous)) {
+ echo "<br/>";
+ echo "<b>" . gettext("Organization units found") . "</b>";
+ echo "<table width='100%'>";
+ foreach ($ous as $ou) {
+ echo "<tr><td onmouseover=\"this.style.backgroundColor='#ffffff';\" onmouseout=\"this.style.backgroundColor='#dddddd';\">" . $ou . "</td></tr>";
+ }
+ }
+ } else {
+ echo "<td><font color=red>" . gettext("failed") . "</td></tr>";
+ }
+
+ echo "</table><p/>";
+
+ } else {
+ echo "<td><font color=red>" . gettext("failed") . "</td></tr>";
+ echo "</table><p/>";
+ }
+ } else {
+ echo "<td><font color=red>" . gettext("failed") . "</td></tr>";
+ echo "</table><p/>";
+ }
+}
+
+?>
+ <p/>
+ <input type="Button" value="<?=gettext("Close"); ?>" onClick='Javascript:window.close();'>
+
+ </form>
+</body>
+</html>
diff --git a/src/usr/local/www/themes/_corporate/all.css b/src/usr/local/www/themes/_corporate/all.css
new file mode 100644
index 0000000..ea578fa
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/all.css
@@ -0,0 +1,1209 @@
+/*
+ * "corporate" theme by Guillaume Belanger <gbelanger@exosecurity.com>
+ * based on the original "metallic" theme */
+
+
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+}
+
+.nowrap { white-space: nowrap; }
+
+.addgatewaybox {
+ background-color: #990000;
+ border-style: none none none none;
+ width: 225px;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 11px;
+ font-family: "Trebuchet MS", sans-serif;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ background-color: #333333;
+ margin: 5px auto;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 815px;
+ margin: 5px auto;
+}
+
+#header {
+ background: url('images/header.gif') no-repeat;
+ background-position: 4px;
+ height: 102px;
+ width: 808px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.gif') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 28px;
+ left: 230px;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: bold;
+ font-family: Verdana;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 4px;
+ margin-top: 0px;
+ margin-left: 5px;
+ padding-top: 0px;
+ width: 800px;
+ background: url('images/horizontal.gif') repeat-y;
+}
+
+#left {
+ width: 800px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.gif') no-repeat;
+ top: -18px;
+ left: 7px;
+ width: 800px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 7px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -24px;
+ left: -2px;
+ width: 800px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ width: 7.75em;
+ height: 28px;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ background-color: #202020;
+ /* background: url("images/menu_footer.gif") no-repeat; */
+ background-position: bottom;
+
+ padding: 0em 0em 0em 0;
+ margin-top: 4px;
+ padding-top: 0em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #303030;
+ border-top: 0px;
+ width: 8.9em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background: url('images/metal_bgr.gif') repeat-x;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background: url('images/metal_bgr_red.gif') repeat-x;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/metallic/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/metallic/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/metallic/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/metallic/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/metallic/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/metallic/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/metallic/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/metallic/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/metallic/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/metallic/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/metallic/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/metallic/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/metallic/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/metallic/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/metallic/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/metallic/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/metallic/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/metallic/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #DDDDDD;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 6px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(/themes/metallic/images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password, #password2 {
+ font-size: small;
+ width: 60%;
+ padding-left: 19px;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+/* Widget CSS */
+.widgetsubheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #B1B1B1;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #000000;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetdiv{
+ margin:5px;
+ padding: 5px;
+ background:#CCCCCC;
+}
+.widgetconfigdiv{
+ background:#BBBBBB;
+ font-size: 11px;
+ color: #000000;
+ padding-right: 5px;
+ padding-left: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div#log div.log-entry-mini {
+ clear: both;
+}
+
+div#log div.log-entry-mini span {
+ padding: 2px 2px 2px 2px;
+ padding-left: 6px;
+}
+
+div#log span.log-action-mini-header,
+div#log span.log-time-mini-header,
+div#log span.log-interface-mini-header,
+div#log span.log-source-mini-header,
+div#log span.log-destination-mini-header,
+div#log span.log-protocol-mini-header {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 12px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-time-mini,
+div#log span.log-interface-mini,
+div#log span.log-source-mini,
+div#log span.log-destination-mini,
+div#log span.log-protocol-mini {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 11px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-action-mini-header {
+ width: 6%;
+}
+
+div#log span.log-time-mini,
+div#log span.log-time-mini-header {
+ width: 19%;
+}
+
+div#log span.log-interface-mini,
+div#log span.log-interface-mini-header {
+ width: 8%;
+}
+
+div#log span.log-source-mini,
+div#log span.log-source-mini-header {
+ width: 23%;
+}
+
+div#log span.log-destination-mini,
+div#log span.log-destination-mini-header {
+ width: 31%;
+}
+
+div#log span.log-protocol-mini,
+div#log span.log-protocol-mini-header {
+ width: 8%;
+ border-right: 1px solid #999;
+}
+
+/*thermal_sensors widget styles*/
+
+.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
+.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
+.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
+ background-color: LimeGreen;
+ border-top-width: 2px; border-top-color: Lime;
+ border-left-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 2px; border-bottom-color: Green;
+}
+.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
+.thermalSensorText { float: left; height: 20px; top: 3px; }
+.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
+
+.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+
+.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
+
+.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
+
+/* widget textarea styles - full width */
+.textarea_widget {
+ width: 100%;
+ resize:vertical;
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* IE 8+ */
+}
diff --git a/src/usr/local/www/themes/_corporate/bottom-loader.js b/src/usr/local/www/themes/_corporate/bottom-loader.js
new file mode 100644
index 0000000..a21f775
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/bottom-loader.js
@@ -0,0 +1,10 @@
+//<![CDATA[
+
+ NiftyCheck();
+ Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
+ Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
+ Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
+ Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
+ Rounded("div#topbox","all","#FFF","#990000","smooth");
+
+//]]>
diff --git a/src/usr/local/www/themes/_corporate/graphlink.css b/src/usr/local/www/themes/_corporate/graphlink.css
new file mode 100644
index 0000000..5bb1b4c
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/graphlink.css
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ $Id$
+
+ This file is part of the GraphLink software.
+ GraphLink is distributed under the MIT License.
+ Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
+*******************************************************************************/
+
+/**
+ * Defines the background image used for the graph, as well as the actual data
+ * locations.
+ * Use padding-left and padding-top to align the data area correctly with your
+ * background image.
+ * Width and height should same as the dimensions of the image, minus the
+ * padding values in both directions.
+ */
+div.GraphLink {
+ width: 212px;
+ height: 60px;
+ padding-left: 38px;
+ padding-top: 10px;
+ background-image: url(/themes/corporate/images/misc/graph.png);
+ overflow: hidden;
+}
+
+/**
+ * Defines the data display area. Modify to fit your background image.
+ */
+div.GraphLinkData {
+ width: 200px;
+ height: 50px;
+ overflow: hidden;
+}
+
+/**
+ * Defines the look of one bar. Nothing to change here other than the color.
+ */
+span.GraphLinkBar {
+ background-color: #990000;
+ height: 100%;
+ float: left;
+ overflow: hidden;
+}
diff --git a/src/usr/local/www/themes/_corporate/images/alert_bgr.gif b/src/usr/local/www/themes/_corporate/images/alert_bgr.gif
new file mode 100755
index 0000000..65498f1
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/alert_bgr.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/footer.gif b/src/usr/local/www/themes/_corporate/images/footer.gif
new file mode 100755
index 0000000..e516113
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/footer.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/header.gif b/src/usr/local/www/themes/_corporate/images/header.gif
new file mode 100755
index 0000000..aebc511
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/header.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/help.png b/src/usr/local/www/themes/_corporate/images/help.png
new file mode 100755
index 0000000..1de05e3
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/help.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/horizontal.gif b/src/usr/local/www/themes/_corporate/images/horizontal.gif
new file mode 100755
index 0000000..4ed7694
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/horizontal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/favicon.ico b/src/usr/local/www/themes/_corporate/images/icons/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_3g.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_3g.gif
new file mode 100755
index 0000000..46ccb92
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_3g.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_3g_inactive.gif
new file mode 100755
index 0000000..cf983e4
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_3g_inactive.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_advanced.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_advanced.gif
new file mode 100644
index 0000000..3ede1ff
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_advanced.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_advanced_s.gif
new file mode 100644
index 0000000..b233549
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_advanced_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alert.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alert.gif
new file mode 100755
index 0000000..7646941
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_host.gif
new file mode 100644
index 0000000..ad43e17
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_host.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_net.gif
new file mode 100644
index 0000000..abd1b8b
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_net.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_port.gif
new file mode 100644
index 0000000..4acf2aa
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_port.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url.gif
new file mode 100644
index 0000000..660571e
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url_reload.gif
new file mode 100644
index 0000000..55c1c4a
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_alias_url_reload.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_block.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_block.gif
new file mode 100755
index 0000000..670c968
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_block.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_block_add.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_block_add.gif
new file mode 100755
index 0000000..eb726d6
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_block_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_block_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_block_d.gif
new file mode 100755
index 0000000..e6345fe
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_block_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_cablenic.gif
new file mode 100755
index 0000000..a071c66
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_cablenic.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_cal.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_cal.gif
new file mode 100755
index 0000000..a9c7c87
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_cal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_cal_mo.gif
new file mode 100755
index 0000000..1647e2f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_cal_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_carp.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_carp.gif
new file mode 100755
index 0000000..9454a82
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_carp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_carp_d.gif
new file mode 100755
index 0000000..2ba8db2
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_carp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_chain.png b/src/usr/local/www/themes/_corporate/images/icons/icon_chain.png
new file mode 100644
index 0000000..12db07a
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_chain.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_check.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_check.gif
new file mode 100755
index 0000000..393674d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_check.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_clock_green.gif
new file mode 100755
index 0000000..e171ba8
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_clock_green.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_clock_grey.gif
new file mode 100755
index 0000000..00c865a
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_clock_grey.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_clock_red.gif
new file mode 100755
index 0000000..7b412ee
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_clock_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_close.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_close.gif
new file mode 100755
index 0000000..e0f86a7
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_close.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_configure.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_configure.gif
new file mode 100755
index 0000000..7182e0d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_configure.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_down.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_down.gif
new file mode 100755
index 0000000..b71a9c5
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_down_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_down_d.gif
new file mode 100755
index 0000000..70a7473
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_down_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_down_mo.gif
new file mode 100755
index 0000000..584587a
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_down_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_e.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_e.gif
new file mode 100755
index 0000000..2950800
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_e.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_e_mo.gif
new file mode 100755
index 0000000..9ba5738
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_e_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_error.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_error.gif
new file mode 100755
index 0000000..e0fa659
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_error.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_exclam.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_exclam.gif
new file mode 100755
index 0000000..36c2ec7
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_exclam.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_de.png b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_de.png
new file mode 100755
index 0000000..069cbbe
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_de.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_en.png b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_en.png
new file mode 100755
index 0000000..bd7f9a5
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_en.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_es.png b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_es.png
new file mode 100755
index 0000000..434776c
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_es.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_pt_BR.png
new file mode 100755
index 0000000..f786349
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_flag_pt_BR.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_cert.png
new file mode 100755
index 0000000..48a34b6
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_cert.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_file.png
new file mode 100755
index 0000000..48a9ed2
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_file.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_group.png
new file mode 100755
index 0000000..7d929c0
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_group.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_host.png
new file mode 100755
index 0000000..867ef2c
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_host.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_imp.png
new file mode 100755
index 0000000..f667cfc
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_imp.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_mail.png
new file mode 100755
index 0000000..d2d4548
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_mail.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_pwd.png
new file mode 100755
index 0000000..06b53a1
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_pwd.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_search.png
new file mode 100755
index 0000000..33de926
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_search.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_time.png
new file mode 100755
index 0000000..aa8300a
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_time.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_unknown.png
new file mode 100755
index 0000000..1857d0e
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_unknown.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_url.png
new file mode 100755
index 0000000..cf56792
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_url.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_user.png
new file mode 100755
index 0000000..e00eebe
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_frmfld_user.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_fw-update.gif
new file mode 100755
index 0000000..52c18ac
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_fw-update.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_help.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_help.gif
new file mode 100644
index 0000000..84c84db
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_help.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias.gif
new file mode 100644
index 0000000..0c569a7
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias_d.gif
new file mode 100644
index 0000000..faa84d4
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_ifalias_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_import_alias.gif
new file mode 100755
index 0000000..d11a5f0
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_import_alias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_in.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_in_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_info_pkg.gif
new file mode 100644
index 0000000..cd3a532
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_info_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_interface_down.gif
new file mode 100755
index 0000000..0626655
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_interface_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_interface_up.gif
new file mode 100755
index 0000000..1449513
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_interface_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_left.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_left.gif
new file mode 100755
index 0000000..8effefe
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_left_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_left_d.gif
new file mode 100755
index 0000000..c778014
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_left_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_left_mo.gif
new file mode 100755
index 0000000..84c6fa2
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_left_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_log.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_log.gif
new file mode 100755
index 0000000..4a1983a
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_log.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_log_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_log_d.gif
new file mode 100755
index 0000000..d31bd9b
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_log_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_log_s.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_log_s.gif
new file mode 100755
index 0000000..f9fda33
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_log_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_log_s_d.gif
new file mode 100755
index 0000000..fb2c05f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_log_s_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_logs.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_logs.gif
new file mode 100644
index 0000000..afe0104
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_logs.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_match.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_match.gif
new file mode 100644
index 0000000..215571f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_match.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_match_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_match_d.gif
new file mode 100644
index 0000000..6e4c364
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_match_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_minus.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_minus.gif
new file mode 100755
index 0000000..417544f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_minus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_open.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_open.gif
new file mode 100755
index 0000000..ac3da14
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_open.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_other.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_other.gif
new file mode 100755
index 0000000..e6f780f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_other.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_other_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_other_d.gif
new file mode 100755
index 0000000..b08d970
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_other_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_out.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_out_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_parp.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_parp.gif
new file mode 100755
index 0000000..96acaf3
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_parp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_parp_d.gif
new file mode 100755
index 0000000..7d7d00e
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_parp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_pass.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_pass.gif
new file mode 100755
index 0000000..fe1bb0d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_pass.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_pass_add.gif
new file mode 100755
index 0000000..f7f4c20
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_pass_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_pass_d.gif
new file mode 100755
index 0000000..6adc431
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_pass_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus.gif
new file mode 100755
index 0000000..2a94eeb
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_plus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl.gif
new file mode 100755
index 0000000..8dcd7c0
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl_p.gif
new file mode 100755
index 0000000..0c79849
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_bl_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_d.gif
new file mode 100755
index 0000000..ebc7457
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_mo.gif
new file mode 100755
index 0000000..1c7ca08
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_p.gif
new file mode 100755
index 0000000..eb41284
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_plus_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall.gif
new file mode 100755
index 0000000..d78b867
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_d.gif
new file mode 100755
index 0000000..13658f7
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_mo.gif
new file mode 100755
index 0000000..90b576e
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg.gif
new file mode 100755
index 0000000..9aebb03
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_d.gif
new file mode 100755
index 0000000..4ab4992
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_mo.gif
new file mode 100755
index 0000000..7025d20
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_pkg_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml.gif
new file mode 100755
index 0000000..4542432
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_d.gif
new file mode 100755
index 0000000..8d3a68d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_mo.gif
new file mode 100755
index 0000000..15e0aed
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reinstall_xml_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reject.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reject.gif
new file mode 100755
index 0000000..5565cd6
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reject.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_reject_d.gif
new file mode 100755
index 0000000..6c09fae
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_reject_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_right.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_right.gif
new file mode 100644
index 0000000..fdf2d8b
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart.gif
new file mode 100755
index 0000000..e49fbd7
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart_d.gif
new file mode 100755
index 0000000..a5d6d7c
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_service_restart_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_running.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_running.gif
new file mode 100644
index 0000000..543fd56
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_service_running.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_start.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_start.gif
new file mode 100755
index 0000000..09bb58f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_service_start.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_start_d.gif
new file mode 100755
index 0000000..f58f111
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_service_start_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_status.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_status.gif
new file mode 100644
index 0000000..a93bcfb
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_service_status.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop.gif
new file mode 100755
index 0000000..922addc
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop_d.gif
new file mode 100755
index 0000000..b4cfdea
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_service_stop_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_service_stopped.gif
new file mode 100644
index 0000000..f93a25d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_service_stopped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_services_restart_mo.gif
new file mode 100755
index 0000000..a092b40
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_services_restart_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_services_start_mo.gif
new file mode 100755
index 0000000..ecdb58f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_services_start_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_services_stop_mo.gif
new file mode 100755
index 0000000..c00e208
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_services_stop_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system-group-grey.png
new file mode 100644
index 0000000..d7b964d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_system-group-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system-group.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system-group.png
new file mode 100644
index 0000000..1c974f2
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_system-group.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system-user-grey.png
new file mode 100644
index 0000000..2f6047d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_system-user-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system-user.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system-user.png
new file mode 100644
index 0000000..ef82156
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_system-user.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system_lock_screen.png
new file mode 100644
index 0000000..30f306d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_system_lock_screen.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_system_logout.png b/src/usr/local/www/themes/_corporate/images/icons/icon_system_logout.png
new file mode 100755
index 0000000..9bbb6c7
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_system_logout.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_trapped.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_trapped.gif
new file mode 100755
index 0000000..ffeb2cd
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_trapped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_trapped_p.gif
new file mode 100755
index 0000000..6d46aaf
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_trapped_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule.gif
new file mode 100755
index 0000000..e15ab6c
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule_d.gif
new file mode 100755
index 0000000..f776281
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_ts_rule_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_up.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_up.gif
new file mode 100755
index 0000000..883c5a2
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_up_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_up_d.gif
new file mode 100755
index 0000000..0ddcce2
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_up_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_up_mo.gif
new file mode 100755
index 0000000..9f869a4
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_up_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wlan.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_wlan.gif
new file mode 100755
index 0000000..1f0addc
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_wlan.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_wlan_d.gif
new file mode 100755
index 0000000..35bf580
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_wlan_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_wol_all.gif
new file mode 100755
index 0000000..2d22182
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_wol_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_nsaved.png
new file mode 100644
index 0000000..21cb27d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_nsaved.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_saved.png
new file mode 100644
index 0000000..ab82946
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_wzd_saved.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_x.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_x.gif
new file mode 100755
index 0000000..24e4d49
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_x_d.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_x_d.gif
new file mode 100755
index 0000000..d2bfbc8
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_x_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_x_mo.gif
new file mode 100755
index 0000000..da7b57c
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_x_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/icon_x_p.gif b/src/usr/local/www/themes/_corporate/images/icons/icon_x_p.gif
new file mode 100755
index 0000000..8828fa6
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/icon_x_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/in.gif b/src/usr/local/www/themes/_corporate/images/icons/in.gif
new file mode 100644
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/in_d.gif b/src/usr/local/www/themes/_corporate/images/icons/in_d.gif
new file mode 100644
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/out.gif b/src/usr/local/www/themes/_corporate/images/icons/out.gif
new file mode 100644
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/icons/out_d.gif b/src/usr/local/www/themes/_corporate/images/icons/out_d.gif
new file mode 100644
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/icons/out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/log.png b/src/usr/local/www/themes/_corporate/images/log.png
new file mode 100755
index 0000000..762ba80
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/log.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/logo.gif b/src/usr/local/www/themes/_corporate/images/logo.gif
new file mode 100755
index 0000000..08638ff
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/logo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/menu_down.gif b/src/usr/local/www/themes/_corporate/images/menu_down.gif
new file mode 100755
index 0000000..137de8d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/menu_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/menu_footer.gif b/src/usr/local/www/themes/_corporate/images/menu_footer.gif
new file mode 100755
index 0000000..d06faa4
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/menu_footer.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/menu_right.gif b/src/usr/local/www/themes/_corporate/images/menu_right.gif
new file mode 100755
index 0000000..881327c
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/menu_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/metal_bgr.gif b/src/usr/local/www/themes/_corporate/images/metal_bgr.gif
new file mode 100755
index 0000000..a0ca6c8
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/metal_bgr.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/metal_bgr_red.gif b/src/usr/local/www/themes/_corporate/images/metal_bgr_red.gif
new file mode 100755
index 0000000..c4a1465
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/metal_bgr_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bar_blue.gif b/src/usr/local/www/themes/_corporate/images/misc/bar_blue.gif
new file mode 100755
index 0000000..953cde1
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/bar_blue.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bar_gray.gif b/src/usr/local/www/themes/_corporate/images/misc/bar_gray.gif
new file mode 100755
index 0000000..a82da78
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/bar_gray.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bar_left.gif b/src/usr/local/www/themes/_corporate/images/misc/bar_left.gif
new file mode 100755
index 0000000..ea98cec
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/bar_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bar_right.gif b/src/usr/local/www/themes/_corporate/images/misc/bar_right.gif
new file mode 100755
index 0000000..b5114b0
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/bar_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_minus.png
new file mode 100755
index 0000000..37db2fd
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_minus.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_plus.png
new file mode 100755
index 0000000..fba7af9
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/bullet_toggle_plus.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/button.gif b/src/usr/local/www/themes/_corporate/images/misc/button.gif
new file mode 100755
index 0000000..e85dbb3
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/button.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/key_128.gif b/src/usr/local/www/themes/_corporate/images/misc/key_128.gif
new file mode 100755
index 0000000..ea5ae34
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/key_128.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/key_152.gif b/src/usr/local/www/themes/_corporate/images/misc/key_152.gif
new file mode 100755
index 0000000..6c7fc03
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/key_152.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/key_256.gif b/src/usr/local/www/themes/_corporate/images/misc/key_256.gif
new file mode 100755
index 0000000..3e1c377
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/key_256.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/key_64.gif b/src/usr/local/www/themes/_corporate/images/misc/key_64.gif
new file mode 100755
index 0000000..87892bd
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/key_64.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/left_background.gif b/src/usr/local/www/themes/_corporate/images/misc/left_background.gif
new file mode 100755
index 0000000..529d827
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/left_background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/loader.gif b/src/usr/local/www/themes/_corporate/images/misc/loader.gif
new file mode 100755
index 0000000..5d10ac3
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/loader_tab.gif b/src/usr/local/www/themes/_corporate/images/misc/loader_tab.gif
new file mode 100755
index 0000000..05bb04c
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/loader_tab.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/logon.png b/src/usr/local/www/themes/_corporate/images/misc/logon.png
new file mode 100755
index 0000000..baf8a9d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/logon.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_0.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_0.gif
new file mode 100755
index 0000000..160b56d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_0.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_1.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_1.gif
new file mode 100755
index 0000000..50342d6
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_1.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_10.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_10.gif
new file mode 100755
index 0000000..06cba14
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_10.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_2.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_2.gif
new file mode 100755
index 0000000..9d10230
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_2.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_3.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_3.gif
new file mode 100755
index 0000000..1983f87
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_3.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_4.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_4.gif
new file mode 100755
index 0000000..f7158bd
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_4.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_5.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_5.gif
new file mode 100755
index 0000000..c7af593
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_5.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_6.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_6.gif
new file mode 100755
index 0000000..310eb22
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_6.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_7.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_7.gif
new file mode 100755
index 0000000..06bd2e8
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_7.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_8.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_8.gif
new file mode 100755
index 0000000..c6ef564
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_8.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/plogo_9.gif b/src/usr/local/www/themes/_corporate/images/misc/plogo_9.gif
new file mode 100755
index 0000000..4f0cd4d
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/plogo_9.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/progress_bar.gif b/src/usr/local/www/themes/_corporate/images/misc/progress_bar.gif
new file mode 100755
index 0000000..3b4aa52
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/progress_bar.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/tri_c.gif b/src/usr/local/www/themes/_corporate/images/misc/tri_c.gif
new file mode 100755
index 0000000..317b758
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/tri_c.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/tri_c_black.gif b/src/usr/local/www/themes/_corporate/images/misc/tri_c_black.gif
new file mode 100755
index 0000000..309846e
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/tri_c_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/tri_o.gif b/src/usr/local/www/themes/_corporate/images/misc/tri_o.gif
new file mode 100755
index 0000000..eb95c32
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/tri_o.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/tri_o_black.gif b/src/usr/local/www/themes/_corporate/images/misc/tri_o_black.gif
new file mode 100755
index 0000000..f818f3b
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/tri_o_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/misc/widget_loader.gif b/src/usr/local/www/themes/_corporate/images/misc/widget_loader.gif
new file mode 100755
index 0000000..fad101f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/misc/widget_loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/new_tab_menu.png b/src/usr/local/www/themes/_corporate/images/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/status.png b/src/usr/local/www/themes/_corporate/images/status.png
new file mode 100755
index 0000000..a3e368e
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/status.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/transparent.gif b/src/usr/local/www/themes/_corporate/images/transparent.gif
new file mode 100755
index 0000000..89c5530
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/transparent.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/images/transparent_pixel.gif b/src/usr/local/www/themes/_corporate/images/transparent_pixel.gif
new file mode 100755
index 0000000..35d42e8
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/images/transparent_pixel.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/blank.gif b/src/usr/local/www/themes/_corporate/javascript/ie7/blank.gif
new file mode 100755
index 0000000..a4fe2e6
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/blank.gif
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-box-model.js
new file mode 100644
index 0000000..45543f6
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-box-model.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-core.js
new file mode 100644
index 0000000..b11e2b1
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-core.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css-strict.js
new file mode 100644
index 0000000..4406d7a
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css-strict.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css2.js
new file mode 100644
index 0000000..7121c8e
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css2.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css3.js
new file mode 100644
index 0000000..86b24f5
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-css3.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-fixed.js
new file mode 100644
index 0000000..4321cda
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-fixed.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-html4.js
new file mode 100644
index 0000000..4d2baa9
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-html4.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-ie5.js
new file mode 100644
index 0000000..707fa56
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-ie5.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite-p.js
new file mode 100644
index 0000000..3a66d19
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite.js
new file mode 100644
index 0000000..88c764f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-lite.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-png.js
new file mode 100644
index 0000000..7b8f2cf
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-png.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-server.css
new file mode 100644
index 0000000..47c7edd
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-server.css
@@ -0,0 +1,43 @@
+body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
+body {margin: 8px; background: #333;}
+h1 {margin: 0;}
+h1 a:hover {background-color: transparent;}
+h2 {font-size: 1.75em;}
+h3 {font-size: 1.1em;}
+a:active {color: #ff0000;}
+a:link {color: #0a6cce;}
+a:visited {color: #0a6cce;}
+code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
+ padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
+code.box {display: block; padding: 10px; margin: 0.5em 0;}
+ul {list-style-type: square;}
+dd {margin: .2em 0 .5em 1em;}
+dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
+dl.library dd {font-style: italic; margin-left: 3em;}
+dt {font-weight: bold;}
+dt.pack {color: brown;}
+a img {border-style: none;}
+hr {height: 1px; color: #000; border-style: solid;}
+hr.short {height: 2px; width: 100px;}
+div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
+hr {border-bottom-width: 0px;}
+div.header hr {color: #0a6cce; background-color: #0a6cce;}
+div.content {min-height: 100px;}
+div.footer hr {color: #898e79; background-color: #898e79; }
+div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
+a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
+div.footer a:hover {background-color: transparent; text-decoration: none;}
+div.header .menu {text-align: right;}
+div.footer {font-size: x-small; margin-top: 8px;}
+div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
+#license {margin-top: 5px; font-size: xx-small;}
+table {border-top: 1px solid #000; border-left: 1px solid #000;}
+th {background-color: #fff; text-align: left;}
+th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
+th.small {width: 100px;}
+th.medium {width: 200px;}
+th.large {width: 270px;}
+th.x-large {width: 408px;}
+table.fixed {table-layout: fixed;}
+span.comment {color: #666;}
+
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard-p.js
new file mode 100644
index 0000000..73e99ac
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard.js
new file mode 100644
index 0000000..2109905
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/ie7-standard.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/_corporate/javascript/ie7/test-trans.png b/src/usr/local/www/themes/_corporate/javascript/ie7/test-trans.png
new file mode 100755
index 0000000..e187e2c
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/ie7/test-trans.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/javascript/niftyjsCode.js b/src/usr/local/www/themes/_corporate/javascript/niftyjsCode.js
new file mode 100644
index 0000000..75ef8b0
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/_corporate/loader.js b/src/usr/local/www/themes/_corporate/loader.js
new file mode 100644
index 0000000..4512d5e
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/loader.js
@@ -0,0 +1,29 @@
+//<![CDATA[
+var browser = '';
+var version = '';
+var entrance = '';
+var cond = '';
+
+// BROWSER?
+if (browser == '') {
+ if (navigator.appName.indexOf('Microsoft') != -1)
+ browser = 'IE';
+ else if (navigator.appName.indexOf('Netscape') != -1)
+ browser = 'Netscape';
+ else
+ browser = 'IE';
+}
+if (version == '') {
+ version= navigator.appVersion;
+ paren = version.indexOf('(');
+ whole_version = navigator.appVersion.substring(0,paren-1);
+ version = parseInt(whole_version);
+}
+
+if (version < 7) {
+ document.write('<script type="text/javascript" src="/themes/corporate/javascript/ie7/ie7-standard-p.js"></script>');
+}
+
+document.write('<script type="text/javascript" src="/themes/corporate/javascript/niftyjsCode.js"></script>');
+
+//]]>
diff --git a/src/usr/local/www/themes/_corporate/new_tab_menu.css b/src/usr/local/www/themes/_corporate/new_tab_menu.css
new file mode 100644
index 0000000..aae94e3
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/new_tab_menu.css
@@ -0,0 +1,101 @@
+/*
+ new_tab_menu.css
+ part of pfSense
+ Copyright (C) 2010-2011 Robert Zelaya
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
+ The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
+
+ <tr>
+ <td>
+ <?php
+ $tab_array_indent = 0; // move to the line in px
+ $tab_array_space = 1; // space betwen lines in px
+ $tab_array_char_limit = 82; // number or chr before the drop down box
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+
+*/
+
+.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
+
+.newtabmenu li{float:left; margin-right:2px; text-align: center;}
+.newtabmenu a:link, .newtabmenu a:visited{
+ background:url(imagesimages/new_tab_menu.png) right 45px;
+ color:#ffffff; /* noactive font */
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ font-weight:bold;
+ font-size:.9em;
+ height:20px;
+ line-height:20px;
+ text-decoration:none;
+}
+.newtabmenu a span{
+ background:url(images/new_tab_menu.png) left 45px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ height:20px;
+ margin-right:7px;
+ padding-left:7px;
+}
+.newtabmenu a:hover{
+ background:url(images/new_tab_menu.png) right 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ color:#ffffff; /* hover over font */
+}
+.newtabmenu a:hover span{
+ background:url(images/new_tab_menu.png) left 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+}
+
+/* -------------------------------- */
+/* ACTIVE ELEMENTS */
+.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
+ color:#000000; /* active font */
+ background:url(images/new_tab_menu.png) right 0 no-repeat;
+}
+.newtabmenu_active a span, .newtabmenu_active a:hover span{
+ background:url(images/new_tab_menu.png) left 0 no-repeat;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/_corporate/new_tab_menu.png b/src/usr/local/www/themes/_corporate/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/_corporate/rrdcolors.inc.php b/src/usr/local/www/themes/_corporate/rrdcolors.inc.php
new file mode 100644
index 0000000..dcb7a39
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/rrdcolors.inc.php
@@ -0,0 +1,89 @@
+<?php
+/* $Id$ */
+/*
+ rrdcolors.inc.php
+ Part of pfSense
+ Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* This file is included by the RRD graphing page and sets the colors */
+
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF','00E344','FF0000','000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333','a83c3c','999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+?>
diff --git a/src/usr/local/www/themes/_corporate/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/_corporate/styles/jquery-ui-1.11.1.css
new file mode 100644
index 0000000..8a8c54f
--- /dev/null
+++ b/src/usr/local/www/themes/_corporate/styles/jquery-ui-1.11.1.css
@@ -0,0 +1,1226 @@
+/*! jQuery UI - v1.11.1 - 2014-09-22
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 1em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+ background-color: #990000;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #bbbbbb;
+ /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
+ color: #444444;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #444444;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #3383bb;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #3383bb;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #bbbbbb;
+ background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #599fcf;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #599fcf;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #999999;
+ background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #ffffff;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
+ color: #444444;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #444444;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #c0402a;
+ background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
+ opacity: .8;
+ filter: Alpha(Opacity=80); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -4px 0 0 -4px;
+ padding: 4px;
+ background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .6;
+ filter: Alpha(Opacity=60); /* support: IE8 */
+ border-radius: 0pxdow;
+}
diff --git a/src/usr/local/www/themes/code-red/all.css b/src/usr/local/www/themes/code-red/all.css
new file mode 100644
index 0000000..c26ec3d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/all.css
@@ -0,0 +1,1301 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+.addgatewaybox {
+ background-color: #990000;
+ border-style: none none none none;
+ width: 225px;
+}
+
+.infobox {
+ width:100%;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 220px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 11px;
+ font-family: "Trebuchet MS", sans-serif;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background: url('images/background.gif') no-repeat;
+ background-position : center 0px;
+ background-color: #4a0203;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 29px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 22px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 15px;
+ left: 210px;
+ font-size: 14px;
+ color: #990000;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #990000;
+ text-align: right;
+ padding-right: 18px;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -5px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 82px;
+ color: #999999;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ position: relative;
+ top: -35px;
+ left: 3px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ width: 80px;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ /* top: 2em;
+ left: -2px; */
+ width: 120px;
+ font-weight: normal;
+ /* background: transparent bottom left no-repeat; */
+ /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020; */
+ /* background: url("images/menubgr_footer.png") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 5px;
+ padding-bottom: 10px;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 0px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+/* background-color: #990000; */
+ background: url(images/menubgr.png) repeat-y;
+ z-index: 2;
+/* color: #FFF; */
+}
+#navigation ul li ul li:hover {
+/* background-color: #666666; */
+ background-image: url(images/menubgr_highlight.png);
+ background-repeat: repeat-y;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 5px;
+ margin-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 10;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+
+#graph {
+ position: relative;
+ z-index: 10;
+}
+
+
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #999999;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listrborder {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-left: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ color: #FFFFFF;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #DDDDDD;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 6px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password, #password2 {
+ font-size: small;
+ width: 60%;
+ padding-left: 19px;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+/* Widget CSS */
+.widgetsubheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #B1B1B1;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #000000;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetdiv{
+ margin:5px;
+ padding: 5px;
+ background:#CCCCCC;
+}
+.widgetconfigdiv{
+ background:#BBBBBB;
+ font-size: 11px;
+ color: #000000;
+ padding-right: 5px;
+ padding-left: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div#log div.log-entry-mini {
+ clear: both;
+}
+
+div#log div.log-entry-mini span {
+ padding: 2px 2px 2px 2px;
+ padding-left: 6px;
+}
+
+div#log span.log-action-mini-header,
+div#log span.log-time-mini-header,
+div#log span.log-interface-mini-header,
+div#log span.log-source-mini-header,
+div#log span.log-destination-mini-header,
+div#log span.log-protocol-mini-header {
+ float: left;
+ text-align: left;
+ background-color: #B1B1B1;
+ font-size: 12px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-time-mini,
+div#log span.log-interface-mini,
+div#log span.log-source-mini,
+div#log span.log-destination-mini,
+div#log span.log-protocol-mini {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 11px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-action-mini-header {
+ width: 6%;
+}
+
+div#log span.log-time-mini,
+div#log span.log-time-mini-header {
+ width: 19%;
+}
+
+div#log span.log-interface-mini,
+div#log span.log-interface-mini-header {
+ width: 8%;
+}
+
+div#log span.log-source-mini,
+div#log span.log-source-mini-header {
+ width: 23%;
+}
+
+div#log span.log-destination-mini,
+div#log span.log-destination-mini-header {
+ width: 31%;
+}
+
+div#log span.log-protocol-mini,
+div#log span.log-protocol-mini-header {
+ width: 8%;
+ border-right: 1px solid #999;
+}
+
+/* Sortable tables */
+table.sortable thead {
+ background-color:#eee;
+ color:#666666;
+ font-weight: bold;
+ cursor: default;
+}
+
+/*thermal_sensors widget styles*/
+
+.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
+.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
+.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
+ background-color: LimeGreen;
+ border-top-width: 2px; border-top-color: Lime;
+ border-left-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 2px; border-bottom-color: Green;
+}
+.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
+.thermalSensorText { float: left; height: 20px; top: 3px; }
+.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
+
+.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+
+.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
+
+.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
+
+/* widget textarea styles - full width */
+.textarea_widget {
+ width: 100%;
+ resize:vertical;
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* IE 8+ */
+}
diff --git a/src/usr/local/www/themes/code-red/bottom-loader.js b/src/usr/local/www/themes/code-red/bottom-loader.js
new file mode 100755
index 0000000..a21f775
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/bottom-loader.js
@@ -0,0 +1,10 @@
+//<![CDATA[
+
+ NiftyCheck();
+ Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
+ Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
+ Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
+ Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
+ Rounded("div#topbox","all","#FFF","#990000","smooth");
+
+//]]>
diff --git a/src/usr/local/www/themes/code-red/favicon.ico b/src/usr/local/www/themes/code-red/favicon.ico
new file mode 100755
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/graphlink.css b/src/usr/local/www/themes/code-red/graphlink.css
new file mode 100755
index 0000000..13f65f0
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/graphlink.css
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ $Id$
+
+ This file is part of the GraphLink software.
+ GraphLink is distributed under the MIT License.
+ Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
+*******************************************************************************/
+
+/**
+ * Defines the background image used for the graph, as well as the actual data
+ * locations.
+ * Use padding-left and padding-top to align the data area correctly with your
+ * background image.
+ * Width and height should same as the dimensions of the image, minus the
+ * padding values in both directions.
+ */
+div.GraphLink {
+ width: 212px;
+ height: 60px;
+ padding-left: 38px;
+ padding-top: 10px;
+ background-image: url(/themes/nervecenter/images/misc/graph.png);
+ overflow: hidden;
+}
+
+/**
+ * Defines the data display area. Modify to fit your background image.
+ */
+div.GraphLinkData {
+ width: 200px;
+ height: 50px;
+ overflow: hidden;
+}
+
+/**
+ * Defines the look of one bar. Nothing to change here other than the color.
+ */
+span.GraphLinkBar {
+ background-color: #990000;
+ height: 100%;
+ float: left;
+ overflow: hidden;
+}
diff --git a/src/usr/local/www/themes/code-red/images/alert_bgr.png b/src/usr/local/www/themes/code-red/images/alert_bgr.png
new file mode 100755
index 0000000..f84afd4
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/alert_bgr.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/background.gif b/src/usr/local/www/themes/code-red/images/background.gif
new file mode 100755
index 0000000..3f0dc77
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/background.png b/src/usr/local/www/themes/code-red/images/background.png
new file mode 100755
index 0000000..e68893d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/background.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/button_left.gif b/src/usr/local/www/themes/code-red/images/button_left.gif
new file mode 100755
index 0000000..2e46d25
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/button_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/button_mid.gif b/src/usr/local/www/themes/code-red/images/button_mid.gif
new file mode 100755
index 0000000..4198d93
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/button_mid.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/button_right.gif b/src/usr/local/www/themes/code-red/images/button_right.gif
new file mode 100755
index 0000000..0faaa67
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/button_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/footer.png b/src/usr/local/www/themes/code-red/images/footer.png
new file mode 100755
index 0000000..e609b9d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/footer.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/header.png b/src/usr/local/www/themes/code-red/images/header.png
new file mode 100755
index 0000000..4525e61
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/header.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/help.png b/src/usr/local/www/themes/code-red/images/help.png
new file mode 100755
index 0000000..1de05e3
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/help.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/horizontal.gif b/src/usr/local/www/themes/code-red/images/horizontal.gif
new file mode 100755
index 0000000..a280dcb
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/horizontal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/favicon.ico b/src/usr/local/www/themes/code-red/images/icons/favicon.ico
new file mode 100755
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_3g.gif b/src/usr/local/www/themes/code-red/images/icons/icon_3g.gif
new file mode 100755
index 0000000..46ccb92
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_3g.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/code-red/images/icons/icon_3g_inactive.gif
new file mode 100755
index 0000000..cf983e4
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_3g_inactive.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_advanced.gif b/src/usr/local/www/themes/code-red/images/icons/icon_advanced.gif
new file mode 100644
index 0000000..3ede1ff
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_advanced.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/code-red/images/icons/icon_advanced_s.gif
new file mode 100644
index 0000000..b233549
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_advanced_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alert.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alert.gif
new file mode 100755
index 0000000..7646941
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_host.gif
new file mode 100755
index 0000000..ad43e17
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_alias_host.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_net.gif
new file mode 100755
index 0000000..abd1b8b
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_alias_net.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_port.gif
new file mode 100755
index 0000000..4acf2aa
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_alias_port.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_url.gif
new file mode 100755
index 0000000..660571e
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_alias_url.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/code-red/images/icons/icon_alias_url_reload.gif
new file mode 100755
index 0000000..55c1c4a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_alias_url_reload.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_block.gif b/src/usr/local/www/themes/code-red/images/icons/icon_block.gif
new file mode 100755
index 0000000..670c968
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_block.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_block_add.gif b/src/usr/local/www/themes/code-red/images/icons/icon_block_add.gif
new file mode 100755
index 0000000..eb726d6
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_block_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_block_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_block_d.gif
new file mode 100755
index 0000000..e6345fe
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_block_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/code-red/images/icons/icon_cablenic.gif
new file mode 100755
index 0000000..9173058
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_cablenic.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_cal.gif b/src/usr/local/www/themes/code-red/images/icons/icon_cal.gif
new file mode 100755
index 0000000..a9c7c87
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_cal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_cal_mo.gif
new file mode 100755
index 0000000..1647e2f
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_cal_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_carp.gif b/src/usr/local/www/themes/code-red/images/icons/icon_carp.gif
new file mode 100755
index 0000000..9454a82
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_carp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_carp_d.gif
new file mode 100755
index 0000000..2ba8db2
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_carp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_chain.png b/src/usr/local/www/themes/code-red/images/icons/icon_chain.png
new file mode 100644
index 0000000..12db07a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_chain.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_check.gif b/src/usr/local/www/themes/code-red/images/icons/icon_check.gif
new file mode 100755
index 0000000..393674d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_check.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/code-red/images/icons/icon_clock_green.gif
new file mode 100755
index 0000000..e171ba8
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_clock_green.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/code-red/images/icons/icon_clock_grey.gif
new file mode 100755
index 0000000..00c865a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_clock_grey.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/code-red/images/icons/icon_clock_red.gif
new file mode 100755
index 0000000..7b412ee
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_clock_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_close.gif b/src/usr/local/www/themes/code-red/images/icons/icon_close.gif
new file mode 100755
index 0000000..e0f86a7
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_close.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_configure.gif b/src/usr/local/www/themes/code-red/images/icons/icon_configure.gif
new file mode 100755
index 0000000..7182e0d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_configure.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_down.gif b/src/usr/local/www/themes/code-red/images/icons/icon_down.gif
new file mode 100755
index 0000000..b71a9c5
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_down_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_down_d.gif
new file mode 100755
index 0000000..70a7473
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_down_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_down_mo.gif
new file mode 100755
index 0000000..584587a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_down_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_e.gif b/src/usr/local/www/themes/code-red/images/icons/icon_e.gif
new file mode 100755
index 0000000..2950800
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_e.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_e_mo.gif
new file mode 100755
index 0000000..9ba5738
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_e_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_error.gif b/src/usr/local/www/themes/code-red/images/icons/icon_error.gif
new file mode 100755
index 0000000..e0fa659
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_error.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_exclam.gif b/src/usr/local/www/themes/code-red/images/icons/icon_exclam.gif
new file mode 100755
index 0000000..36c2ec7
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_exclam.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_flag_de.png b/src/usr/local/www/themes/code-red/images/icons/icon_flag_de.png
new file mode 100755
index 0000000..069cbbe
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_flag_de.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_flag_en.png b/src/usr/local/www/themes/code-red/images/icons/icon_flag_en.png
new file mode 100755
index 0000000..bd7f9a5
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_flag_en.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_flag_es.png b/src/usr/local/www/themes/code-red/images/icons/icon_flag_es.png
new file mode 100755
index 0000000..434776c
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_flag_es.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/code-red/images/icons/icon_flag_pt_BR.png
new file mode 100755
index 0000000..f786349
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_flag_pt_BR.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_cert.png
new file mode 100755
index 0000000..48a34b6
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_cert.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_file.png
new file mode 100755
index 0000000..48a9ed2
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_file.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_group.png
new file mode 100755
index 0000000..7d929c0
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_group.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_host.png
new file mode 100755
index 0000000..867ef2c
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_host.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_imp.png
new file mode 100755
index 0000000..f667cfc
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_imp.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_mail.png
new file mode 100755
index 0000000..d2d4548
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_mail.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_pwd.png
new file mode 100755
index 0000000..06b53a1
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_pwd.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_search.png
new file mode 100755
index 0000000..33de926
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_search.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_time.png
new file mode 100755
index 0000000..aa8300a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_time.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_unknown.png
new file mode 100755
index 0000000..1857d0e
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_unknown.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_url.png
new file mode 100755
index 0000000..cf56792
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_url.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_user.png
new file mode 100755
index 0000000..e00eebe
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_frmfld_user.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/code-red/images/icons/icon_fw-update.gif
new file mode 100755
index 0000000..52c18ac
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_fw-update.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_help.gif b/src/usr/local/www/themes/code-red/images/icons/icon_help.gif
new file mode 100644
index 0000000..84c84db
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_help.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/code-red/images/icons/icon_ifalias.gif
new file mode 100755
index 0000000..0c569a7
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_ifalias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_ifalias_d.gif
new file mode 100755
index 0000000..faa84d4
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_ifalias_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/code-red/images/icons/icon_import_alias.gif
new file mode 100755
index 0000000..d11a5f0
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_import_alias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_in.gif b/src/usr/local/www/themes/code-red/images/icons/icon_in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_in_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/code-red/images/icons/icon_info_pkg.gif
new file mode 100755
index 0000000..cd3a532
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_info_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/code-red/images/icons/icon_interface_down.gif
new file mode 100755
index 0000000..0626655
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_interface_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/code-red/images/icons/icon_interface_up.gif
new file mode 100755
index 0000000..1449513
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_interface_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_left.gif b/src/usr/local/www/themes/code-red/images/icons/icon_left.gif
new file mode 100755
index 0000000..8effefe
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_left_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_left_d.gif
new file mode 100755
index 0000000..c778014
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_left_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_left_mo.gif
new file mode 100755
index 0000000..84c6fa2
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_left_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_log.gif b/src/usr/local/www/themes/code-red/images/icons/icon_log.gif
new file mode 100755
index 0000000..4a1983a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_log.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_log_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_log_d.gif
new file mode 100755
index 0000000..d31bd9b
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_log_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_log_s.gif b/src/usr/local/www/themes/code-red/images/icons/icon_log_s.gif
new file mode 100755
index 0000000..f9fda33
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_log_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_log_s_d.gif
new file mode 100755
index 0000000..fb2c05f
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_log_s_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_logs.gif b/src/usr/local/www/themes/code-red/images/icons/icon_logs.gif
new file mode 100644
index 0000000..afe0104
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_logs.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_match.gif b/src/usr/local/www/themes/code-red/images/icons/icon_match.gif
new file mode 100644
index 0000000..215571f
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_match.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_match_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_match_d.gif
new file mode 100644
index 0000000..6e4c364
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_match_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_minus.gif b/src/usr/local/www/themes/code-red/images/icons/icon_minus.gif
new file mode 100755
index 0000000..417544f
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_minus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_open.gif b/src/usr/local/www/themes/code-red/images/icons/icon_open.gif
new file mode 100755
index 0000000..ac3da14
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_open.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_other.gif b/src/usr/local/www/themes/code-red/images/icons/icon_other.gif
new file mode 100755
index 0000000..e6f780f
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_other.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_other_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_other_d.gif
new file mode 100755
index 0000000..b08d970
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_other_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_out.gif b/src/usr/local/www/themes/code-red/images/icons/icon_out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_out_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_parp.gif b/src/usr/local/www/themes/code-red/images/icons/icon_parp.gif
new file mode 100755
index 0000000..96acaf3
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_parp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_parp_d.gif
new file mode 100755
index 0000000..7d7d00e
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_parp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_pass.gif b/src/usr/local/www/themes/code-red/images/icons/icon_pass.gif
new file mode 100755
index 0000000..fe1bb0d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_pass.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/code-red/images/icons/icon_pass_add.gif
new file mode 100755
index 0000000..f7f4c20
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_pass_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_pass_d.gif
new file mode 100755
index 0000000..6adc431
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_pass_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus.gif
new file mode 100755
index 0000000..2a94eeb
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_plus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl.gif
new file mode 100755
index 0000000..8dcd7c0
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl_p.gif
new file mode 100755
index 0000000..0c79849
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_plus_bl_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_d.gif
new file mode 100755
index 0000000..ebc7457
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_plus_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_mo.gif
new file mode 100755
index 0000000..1c7ca08
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_plus_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/code-red/images/icons/icon_plus_p.gif
new file mode 100755
index 0000000..eb41284
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_plus_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall.gif
new file mode 100755
index 0000000..d78b867
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_d.gif
new file mode 100755
index 0000000..13658f7
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_mo.gif
new file mode 100755
index 0000000..90b576e
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg.gif
new file mode 100755
index 0000000..9aebb03
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_d.gif
new file mode 100755
index 0000000..4ab4992
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_mo.gif
new file mode 100755
index 0000000..7025d20
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_pkg_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml.gif
new file mode 100755
index 0000000..4542432
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_d.gif
new file mode 100755
index 0000000..8d3a68d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_mo.gif
new file mode 100755
index 0000000..15e0aed
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reinstall_xml_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reject.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reject.gif
new file mode 100755
index 0000000..5565cd6
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reject.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_reject_d.gif
new file mode 100755
index 0000000..6c09fae
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_reject_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_right.gif b/src/usr/local/www/themes/code-red/images/icons/icon_right.gif
new file mode 100755
index 0000000..fdf2d8b
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_restart.gif
new file mode 100755
index 0000000..e49fbd7
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_service_restart.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_restart_d.gif
new file mode 100755
index 0000000..a5d6d7c
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_service_restart_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_running.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_running.gif
new file mode 100644
index 0000000..543fd56
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_service_running.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_start.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_start.gif
new file mode 100755
index 0000000..09bb58f
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_service_start.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_start_d.gif
new file mode 100755
index 0000000..f58f111
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_service_start_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_status.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_status.gif
new file mode 100644
index 0000000..a93bcfb
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_service_status.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_stop.gif
new file mode 100755
index 0000000..922addc
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_service_stop.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_stop_d.gif
new file mode 100755
index 0000000..b4cfdea
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_service_stop_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/code-red/images/icons/icon_service_stopped.gif
new file mode 100644
index 0000000..f93a25d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_service_stopped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_services_restart_mo.gif
new file mode 100755
index 0000000..a092b40
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_services_restart_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_services_start_mo.gif
new file mode 100755
index 0000000..ecdb58f
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_services_start_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_services_stop_mo.gif
new file mode 100755
index 0000000..c00e208
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_services_stop_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/code-red/images/icons/icon_system-group-grey.png
new file mode 100755
index 0000000..d7b964d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_system-group-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system-group.png b/src/usr/local/www/themes/code-red/images/icons/icon_system-group.png
new file mode 100755
index 0000000..1c974f2
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_system-group.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/code-red/images/icons/icon_system-user-grey.png
new file mode 100755
index 0000000..2f6047d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_system-user-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system-user.png b/src/usr/local/www/themes/code-red/images/icons/icon_system-user.png
new file mode 100755
index 0000000..ef82156
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_system-user.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/code-red/images/icons/icon_system_lock_screen.png
new file mode 100755
index 0000000..30f306d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_system_lock_screen.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_system_logout.png b/src/usr/local/www/themes/code-red/images/icons/icon_system_logout.png
new file mode 100755
index 0000000..9bbb6c7
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_system_logout.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_trapped.gif b/src/usr/local/www/themes/code-red/images/icons/icon_trapped.gif
new file mode 100755
index 0000000..ffeb2cd
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_trapped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/code-red/images/icons/icon_trapped_p.gif
new file mode 100755
index 0000000..6d46aaf
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_trapped_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule.gif
new file mode 100755
index 0000000..e15ab6c
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule_d.gif
new file mode 100755
index 0000000..f776281
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_ts_rule_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_up.gif b/src/usr/local/www/themes/code-red/images/icons/icon_up.gif
new file mode 100755
index 0000000..883c5a2
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_up_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_up_d.gif
new file mode 100755
index 0000000..0ddcce2
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_up_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_up_mo.gif
new file mode 100755
index 0000000..9f869a4
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_up_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wlan.gif b/src/usr/local/www/themes/code-red/images/icons/icon_wlan.gif
new file mode 100755
index 0000000..1f0addc
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_wlan.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_wlan_d.gif
new file mode 100755
index 0000000..35bf580
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_wlan_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/code-red/images/icons/icon_wol_all.gif
new file mode 100755
index 0000000..2d22182
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_wol_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/code-red/images/icons/icon_wzd_nsaved.png
new file mode 100755
index 0000000..21cb27d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_wzd_nsaved.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/code-red/images/icons/icon_wzd_saved.png
new file mode 100755
index 0000000..ab82946
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_wzd_saved.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_x.gif b/src/usr/local/www/themes/code-red/images/icons/icon_x.gif
new file mode 100755
index 0000000..24e4d49
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_x_d.gif b/src/usr/local/www/themes/code-red/images/icons/icon_x_d.gif
new file mode 100755
index 0000000..d2bfbc8
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_x_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/code-red/images/icons/icon_x_mo.gif
new file mode 100755
index 0000000..da7b57c
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_x_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/icon_x_p.gif b/src/usr/local/www/themes/code-red/images/icons/icon_x_p.gif
new file mode 100755
index 0000000..8828fa6
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/icon_x_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/in.gif b/src/usr/local/www/themes/code-red/images/icons/in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/in_d.gif b/src/usr/local/www/themes/code-red/images/icons/in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/out.gif b/src/usr/local/www/themes/code-red/images/icons/out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/icons/out_d.gif b/src/usr/local/www/themes/code-red/images/icons/out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/icons/out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/log.png b/src/usr/local/www/themes/code-red/images/log.png
new file mode 100755
index 0000000..762ba80
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/log.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/logo.gif b/src/usr/local/www/themes/code-red/images/logo.gif
new file mode 100755
index 0000000..3455d6b
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/logo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/logobig.jpg b/src/usr/local/www/themes/code-red/images/logobig.jpg
new file mode 100755
index 0000000..62922ce
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/logobig.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/logon-background.gif b/src/usr/local/www/themes/code-red/images/logon-background.gif
new file mode 100755
index 0000000..0176101
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/logon-background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menu_down.gif b/src/usr/local/www/themes/code-red/images/menu_down.gif
new file mode 100755
index 0000000..137de8d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/menu_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menu_footer.gif b/src/usr/local/www/themes/code-red/images/menu_footer.gif
new file mode 100755
index 0000000..d06faa4
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/menu_footer.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menu_right.gif b/src/usr/local/www/themes/code-red/images/menu_right.gif
new file mode 100755
index 0000000..881327c
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/menu_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menubgr.png b/src/usr/local/www/themes/code-red/images/menubgr.png
new file mode 100755
index 0000000..45e0ec7
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/menubgr.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menubgr_footer.png b/src/usr/local/www/themes/code-red/images/menubgr_footer.png
new file mode 100755
index 0000000..5d351e4
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/menubgr_footer.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/menubgr_highlight.png b/src/usr/local/www/themes/code-red/images/menubgr_highlight.png
new file mode 100755
index 0000000..f00582b
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/menubgr_highlight.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/metal_bgr.gif b/src/usr/local/www/themes/code-red/images/metal_bgr.gif
new file mode 100755
index 0000000..a0ca6c8
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/metal_bgr.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/metal_bgr_red.gif b/src/usr/local/www/themes/code-red/images/metal_bgr_red.gif
new file mode 100755
index 0000000..c4a1465
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/metal_bgr_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/background.gif b/src/usr/local/www/themes/code-red/images/misc/background.gif
new file mode 100755
index 0000000..87cceb3
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bar_blue.gif b/src/usr/local/www/themes/code-red/images/misc/bar_blue.gif
new file mode 100755
index 0000000..741186a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/bar_blue.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bar_gray.gif b/src/usr/local/www/themes/code-red/images/misc/bar_gray.gif
new file mode 100755
index 0000000..e86e245
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/bar_gray.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bar_left.gif b/src/usr/local/www/themes/code-red/images/misc/bar_left.gif
new file mode 100755
index 0000000..af751fa
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/bar_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bar_right.gif b/src/usr/local/www/themes/code-red/images/misc/bar_right.gif
new file mode 100755
index 0000000..ff12d9e
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/bar_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_minus.png
new file mode 100755
index 0000000..37db2fd
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_minus.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_plus.png
new file mode 100755
index 0000000..fba7af9
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/bullet_toggle_plus.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/button.gif b/src/usr/local/www/themes/code-red/images/misc/button.gif
new file mode 100755
index 0000000..e85dbb3
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/button.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/graph.png b/src/usr/local/www/themes/code-red/images/misc/graph.png
new file mode 100755
index 0000000..507ec75
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/graph.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/key_128.gif b/src/usr/local/www/themes/code-red/images/misc/key_128.gif
new file mode 100755
index 0000000..ea5ae34
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/key_128.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/key_152.gif b/src/usr/local/www/themes/code-red/images/misc/key_152.gif
new file mode 100755
index 0000000..6c7fc03
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/key_152.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/key_256.gif b/src/usr/local/www/themes/code-red/images/misc/key_256.gif
new file mode 100755
index 0000000..3e1c377
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/key_256.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/key_64.gif b/src/usr/local/www/themes/code-red/images/misc/key_64.gif
new file mode 100755
index 0000000..87892bd
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/key_64.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/left_background.gif b/src/usr/local/www/themes/code-red/images/misc/left_background.gif
new file mode 100755
index 0000000..529d827
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/left_background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/loader.gif b/src/usr/local/www/themes/code-red/images/misc/loader.gif
new file mode 100755
index 0000000..5d10ac3
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/loader_all.gif b/src/usr/local/www/themes/code-red/images/misc/loader_all.gif
new file mode 100755
index 0000000..cb6bc0c
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/loader_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/loader_filter.gif b/src/usr/local/www/themes/code-red/images/misc/loader_filter.gif
new file mode 100755
index 0000000..b838b17
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/loader_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/loader_tab.gif b/src/usr/local/www/themes/code-red/images/misc/loader_tab.gif
new file mode 100755
index 0000000..05bb04c
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/loader_tab.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/logon.png b/src/usr/local/www/themes/code-red/images/misc/logon.png
new file mode 100755
index 0000000..7921782
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/logon.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_0.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_0.gif
new file mode 100755
index 0000000..160b56d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_0.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_1.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_1.gif
new file mode 100755
index 0000000..50342d6
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_1.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_10.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_10.gif
new file mode 100755
index 0000000..06cba14
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_10.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_2.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_2.gif
new file mode 100755
index 0000000..9d10230
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_2.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_3.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_3.gif
new file mode 100755
index 0000000..1983f87
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_3.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_4.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_4.gif
new file mode 100755
index 0000000..f7158bd
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_4.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_5.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_5.gif
new file mode 100755
index 0000000..c7af593
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_5.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_6.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_6.gif
new file mode 100755
index 0000000..310eb22
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_6.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_7.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_7.gif
new file mode 100755
index 0000000..06bd2e8
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_7.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_8.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_8.gif
new file mode 100755
index 0000000..c6ef564
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_8.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/plogo_9.gif b/src/usr/local/www/themes/code-red/images/misc/plogo_9.gif
new file mode 100755
index 0000000..4f0cd4d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/plogo_9.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/progress_bar.gif b/src/usr/local/www/themes/code-red/images/misc/progress_bar.gif
new file mode 100755
index 0000000..3b4aa52
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/progress_bar.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/rrd_error.png b/src/usr/local/www/themes/code-red/images/misc/rrd_error.png
new file mode 100755
index 0000000..a79ecf3
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/rrd_error.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_alerter.gif b/src/usr/local/www/themes/code-red/images/misc/status_alerter.gif
new file mode 100755
index 0000000..7ff1e95
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/status_alerter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/code-red/images/misc/status_carpmaster.gif
new file mode 100755
index 0000000..2c32908
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/status_carpmaster.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_left.gif b/src/usr/local/www/themes/code-red/images/misc/status_left.gif
new file mode 100755
index 0000000..b5a2930
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/status_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_page_loading.gif b/src/usr/local/www/themes/code-red/images/misc/status_page_loading.gif
new file mode 100755
index 0000000..067ef18
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/status_page_loading.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_reload_all.gif b/src/usr/local/www/themes/code-red/images/misc/status_reload_all.gif
new file mode 100755
index 0000000..72de6bd
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/status_reload_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/code-red/images/misc/status_reload_filter.gif
new file mode 100755
index 0000000..d72761a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/status_reload_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/status_right.gif b/src/usr/local/www/themes/code-red/images/misc/status_right.gif
new file mode 100755
index 0000000..bf66fdb
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/status_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/tri_c.gif b/src/usr/local/www/themes/code-red/images/misc/tri_c.gif
new file mode 100755
index 0000000..317b758
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/tri_c.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/tri_c_black.gif b/src/usr/local/www/themes/code-red/images/misc/tri_c_black.gif
new file mode 100755
index 0000000..309846e
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/tri_c_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/tri_o.gif b/src/usr/local/www/themes/code-red/images/misc/tri_o.gif
new file mode 100755
index 0000000..eb95c32
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/tri_o.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/tri_o_black.gif b/src/usr/local/www/themes/code-red/images/misc/tri_o_black.gif
new file mode 100755
index 0000000..f818f3b
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/tri_o_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/misc/widget_loader.gif b/src/usr/local/www/themes/code-red/images/misc/widget_loader.gif
new file mode 100755
index 0000000..ca35e2a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/misc/widget_loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/new_tab_menu.png b/src/usr/local/www/themes/code-red/images/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/status.png b/src/usr/local/www/themes/code-red/images/status.png
new file mode 100755
index 0000000..a3e368e
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/status.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/transparent.gif b/src/usr/local/www/themes/code-red/images/transparent.gif
new file mode 100755
index 0000000..89c5530
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/transparent.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/images/transparent_pixel.gif b/src/usr/local/www/themes/code-red/images/transparent_pixel.gif
new file mode 100755
index 0000000..35d42e8
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/images/transparent_pixel.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/blank.gif b/src/usr/local/www/themes/code-red/javascript/ie7/blank.gif
new file mode 100755
index 0000000..a4fe2e6
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/blank.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-box-model.js
new file mode 100755
index 0000000..45543f6
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-box-model.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-core.js
new file mode 100755
index 0000000..b11e2b1
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-core.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css-strict.js
new file mode 100755
index 0000000..4406d7a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css-strict.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css2.js
new file mode 100755
index 0000000..7121c8e
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css2.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css3.js
new file mode 100755
index 0000000..86b24f5
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-css3.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-fixed.js
new file mode 100755
index 0000000..4321cda
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-fixed.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-html4.js
new file mode 100755
index 0000000..4d2baa9
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-html4.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-ie5.js
new file mode 100755
index 0000000..707fa56
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-ie5.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite-p.js
new file mode 100644
index 0000000..3a66d19
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite.js
new file mode 100755
index 0000000..88c764f
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-lite.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-png.js
new file mode 100755
index 0000000..7b8f2cf
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-png.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-server.css
new file mode 100755
index 0000000..47c7edd
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-server.css
@@ -0,0 +1,43 @@
+body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
+body {margin: 8px; background: #333;}
+h1 {margin: 0;}
+h1 a:hover {background-color: transparent;}
+h2 {font-size: 1.75em;}
+h3 {font-size: 1.1em;}
+a:active {color: #ff0000;}
+a:link {color: #0a6cce;}
+a:visited {color: #0a6cce;}
+code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
+ padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
+code.box {display: block; padding: 10px; margin: 0.5em 0;}
+ul {list-style-type: square;}
+dd {margin: .2em 0 .5em 1em;}
+dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
+dl.library dd {font-style: italic; margin-left: 3em;}
+dt {font-weight: bold;}
+dt.pack {color: brown;}
+a img {border-style: none;}
+hr {height: 1px; color: #000; border-style: solid;}
+hr.short {height: 2px; width: 100px;}
+div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
+hr {border-bottom-width: 0px;}
+div.header hr {color: #0a6cce; background-color: #0a6cce;}
+div.content {min-height: 100px;}
+div.footer hr {color: #898e79; background-color: #898e79; }
+div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
+a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
+div.footer a:hover {background-color: transparent; text-decoration: none;}
+div.header .menu {text-align: right;}
+div.footer {font-size: x-small; margin-top: 8px;}
+div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
+#license {margin-top: 5px; font-size: xx-small;}
+table {border-top: 1px solid #000; border-left: 1px solid #000;}
+th {background-color: #fff; text-align: left;}
+th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
+th.small {width: 100px;}
+th.medium {width: 200px;}
+th.large {width: 270px;}
+th.x-large {width: 408px;}
+table.fixed {table-layout: fixed;}
+span.comment {color: #666;}
+
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard-p.js
new file mode 100644
index 0000000..73e99ac
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard.js
new file mode 100755
index 0000000..2109905
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/ie7-standard.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/code-red/javascript/ie7/test-trans.png b/src/usr/local/www/themes/code-red/javascript/ie7/test-trans.png
new file mode 100755
index 0000000..e187e2c
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/ie7/test-trans.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/grey-40.png b/src/usr/local/www/themes/code-red/javascript/img/grey-40.png
new file mode 100755
index 0000000..758b716
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/img/grey-40.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/submenu-off.gif b/src/usr/local/www/themes/code-red/javascript/img/submenu-off.gif
new file mode 100755
index 0000000..ddcdcae
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/img/submenu-off.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/submenu-on.gif b/src/usr/local/www/themes/code-red/javascript/img/submenu-on.gif
new file mode 100755
index 0000000..7a58077
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/img/submenu-on.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/white-90.png b/src/usr/local/www/themes/code-red/javascript/img/white-90.png
new file mode 100755
index 0000000..efc84b4
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/img/white-90.png
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/img/x.gif b/src/usr/local/www/themes/code-red/javascript/img/x.gif
new file mode 100755
index 0000000..5bfd67a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/img/x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/code-red/javascript/niftyjsCode.js b/src/usr/local/www/themes/code-red/javascript/niftyjsCode.js
new file mode 100644
index 0000000..e71ea14
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/javascript/transmenu-body.php b/src/usr/local/www/themes/code-red/javascript/transmenu-body.php
new file mode 100755
index 0000000..6da8efc
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/transmenu-body.php
@@ -0,0 +1,53 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ transmenu-body.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetBodyJS() {
+ global $rootmenu;
+
+ if (isset($rootmenu)) {
+ return $rootmenu->getMenuJScript();
+ } else if (empty($rootmenu)) {
+ return "alert('No rootmenu object found.');";
+ } else {
+ return "alert('No JavaScript attached to rootmenu object.');";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/code-red/javascript/transmenu-head.php b/src/usr/local/www/themes/code-red/javascript/transmenu-head.php
new file mode 100755
index 0000000..7d72c30
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/transmenu-head.php
@@ -0,0 +1,87 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ transmenu-head.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetHeadJS() {
+ global $g, $rootmenu;
+
+ $transmenu_stub =<<<EOD
+ function tmenuinit() {
+ //==========================================================================================
+ // if supported, initialize TransMenus
+ //==========================================================================================
+ // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
+ // This is better than server-side checking because it will also catch browsers which would
+ // normally support the menus but have javascript disabled.
+ //
+ // If supported, call initialize() and then hook whatever image rollover code you need to do
+ // to the .onactivate and .ondeactivate events for each menu.
+ //==========================================================================================
+ if (TransMenu.isSupported()) {
+ TransMenu.initialize();
+
+ // hook all the highlight swapping of the main toolbar to menu activation/deactivation
+ // instead of simple rollover to get the effect where the button stays hightlit until
+ // the menu is closed.
+ @@CHILD_JSCRIPT@@
+ }
+ } // end function
+EOD;
+
+ if (empty($rootmenu)) {
+ require_once("menudef.inc");
+ }
+
+ $childJScript = "";
+ foreach ($rootmenu->getChildren() as $component) {
+ $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
+
+ $childJScript .=<<<EOD
+ {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
+ {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
+
+EOD;
+ }
+
+ $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
+
+ return $transmenu_stub;
+}
+
+?>
diff --git a/src/usr/local/www/themes/code-red/javascript/transmenu.org b/src/usr/local/www/themes/code-red/javascript/transmenu.org
new file mode 100755
index 0000000..6c9e353
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/transmenu.org
@@ -0,0 +1,785 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ *
+ * Customizable multi-level animated DHTML menus with transparency.
+ *
+ * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * =================================================================================================
+ * updates:
+ * 04.19.04 fixed cascade problem with menus nested greater than two levels.
+ * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
+ * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
+ * also made gecko check a little more strict by specifying build no.
+ * ============================================================================================== */
+
+
+
+//==================================================================================================
+// Configuration properties
+//==================================================================================================
+TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
+TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
+TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
+TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
+TransMenu.menuPadding = 5; // padding between menu border and items grid
+TransMenu.itemPadding = 3; // additional padding around each item
+TransMenu.shadowSize = 2; // size of shadow under menu
+TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
+TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
+TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
+TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
+TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
+TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
+TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
+
+
+//==================================================================================================
+// Internal use properties
+//==================================================================================================
+TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
+TransMenu.direction = {down:1,right:2};
+TransMenu.registry = [];
+TransMenu._maxZ = 100;
+
+
+
+//==================================================================================================
+// Static methods
+//==================================================================================================
+// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
+TransMenu.isSupported = function() {
+ var ua = navigator.userAgent.toLowerCase();
+ var pf = navigator.platform.toLowerCase();
+ var an = navigator.appName;
+ var r = false;
+
+ if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
+ else if (an == "Microsoft Internet Explorer") {
+ if (document.getElementById) { // ie5.1+ mac,win
+ if (pf.indexOf("mac") == 0) {
+ r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
+ }
+ else r = true;
+ }
+ }
+
+ return r;
+}
+
+// call this in onload once menus have been created
+TransMenu.initialize = function() {
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ menu.initialize();
+ }
+}
+
+// call this in document body to write out menu html
+TransMenu.renderAll = function() {
+ var aMenuHtml = [];
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ aMenuHtml[i] = menu.toString();
+ }
+ document.write(aMenuHtml.join(""));
+}
+
+//==================================================================================================
+// TransMenu constructor (only called internally)
+//==================================================================================================
+// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
+// reference to an HTML element, or a TransMenuItem from an existing menu.
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menu from actuator
+// iTop : Top pixel offset of menu from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+// parentMenuSet : Menuset this menu will be added to.
+//==================================================================================================
+function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
+ // public methods
+ this.addItem = addItem;
+ this.addMenu = addMenu;
+ this.toString = toString;
+ this.initialize = initialize;
+ this.isOpen = false;
+ this.show = show;
+ this.hide = hide;
+ this.items = [];
+
+ // events
+ this.onactivate = new Function(); // when the menu starts to slide open
+ this.ondeactivate = new Function(); // when the menu finishes sliding closed
+ this.onmouseover = new Function(); // when the menu has been moused over
+ this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
+ this.ondequeue = new Function();
+
+ // initialization
+ this.index = TransMenu.registry.length;
+ TransMenu.registry[this.index] = this;
+
+ var id = "TransMenu" + this.index;
+ var contentHeight = null;
+ var contentWidth = null;
+ var childMenuSet = null;
+ var animating = false;
+ var childMenus = [];
+ var slideAccel = -1;
+ var elmCache = null;
+ var ready = false;
+ var _this = this;
+ var a = null;
+
+ var pos = iDirection == TransMenu.direction.down ? "top" : "left";
+ var dim = null;
+
+ // private and public method implimentations
+ function addItem(sText, sUrl) {
+ var item = new TransMenuItem(sText, sUrl, this);
+ item._index = this.items.length;
+ this.items[item._index] = item;
+ }
+
+ function addMenu(oMenuItem) {
+ if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
+
+ if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
+
+ var m = childMenuSet.addMenu(oMenuItem);
+
+ childMenus[oMenuItem._index] = m;
+ m.onmouseover = child_mouseover;
+ m.ondeactivate = child_deactivate;
+ m.onqueue = child_queue;
+ m.ondequeue = child_dequeue;
+
+ return m;
+ }
+
+ function initialize() {
+ initCache();
+ initEvents();
+ initSize();
+ ready = true;
+ }
+
+ function show() {
+ //dbg_dump("show");
+ if (ready) {
+ _this.isOpen = true;
+ animating = true;
+ setContainerPos();
+ elmCache["clip"].style.visibility = "visible";
+ elmCache["clip"].style.zIndex = TransMenu._maxZ++;
+ //dbg_dump("maxZ: " + TransMenu._maxZ);
+ slideStart();
+ _this.onactivate();
+ }
+ }
+
+ function hide() {
+ if (ready) {
+ _this.isOpen = false;
+ animating = true;
+
+ for (var i = 0, item = null; item = elmCache.item[i]; i++)
+ dehighlight(item);
+
+ if (childMenuSet) childMenuSet.hide();
+
+ slideStart();
+ _this.ondeactivate();
+ }
+ }
+
+ function setContainerPos() {
+ var sub = oActuator.constructor == TransMenuItem;
+ var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
+ var el = act;
+
+ var x = 0;
+ var y = 0;
+
+
+ var minX = 0;
+ var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
+ var minY = 0;
+ var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
+
+ // add up all offsets... subtract any scroll offset
+ while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
+ x += el.offsetLeft;
+ y += el.offsetTop;
+
+ if (el.scrollLeft) x -= el.scrollLeft;
+ if (el.scrollTop) y -= el.scrollTop;
+
+ el = el.offsetParent;
+ }
+
+ if (oActuator.constructor == TransMenuItem) {
+ x += parseInt(el.parentNode.style.left);
+ y += parseInt(el.parentNode.style.top);
+ }
+
+ switch (iReferencePoint) {
+ case TransMenu.reference.topLeft:
+ break;
+ case TransMenu.reference.topRight:
+ x += act.offsetWidth;
+ break;
+ case TransMenu.reference.bottomLeft:
+ y += act.offsetHeight;
+ break;
+ case TransMenu.reference.bottomRight:
+ x += act.offsetWidth;
+ y += act.offsetHeight;
+ break;
+ }
+
+ x += iLeft;
+ y += iTop;
+
+ x = Math.max(Math.min(x, maxX), minX);
+ y = Math.max(Math.min(y, maxY), minY);
+
+ elmCache["clip"].style.left = x + "px";
+ elmCache["clip"].style.top = y + "px";
+ }
+
+ function slideStart() {
+ var x0 = parseInt(elmCache["content"].style[pos]);
+ var x1 = _this.isOpen ? 0 : -dim;
+
+ if (a != null) a.stop();
+ a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
+
+ a.onframe = slideFrame;
+ a.onend = slideEnd;
+
+ a.start();
+ }
+
+ function slideFrame(x) {
+ elmCache["content"].style[pos] = x + "px";
+ }
+
+ function slideEnd() {
+ if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
+ animating = false;
+ }
+
+ function initSize() {
+ // everything is based off the size of the items table...
+ var ow = elmCache["items"].offsetWidth;
+ var oh = elmCache["items"].offsetHeight;
+ var ua = navigator.userAgent.toLowerCase();
+
+ // clipping container should be ow/oh + the size of the shadow
+ elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
+ elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
+
+ // same with content...
+ elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
+ elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
+
+ contentHeight = oh + TransMenu.shadowSize;
+ contentWidth = ow + TransMenu.shadowSize;
+
+ dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
+
+ // set initially closed
+ elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
+ elmCache["clip"].style.visibility = "hidden";
+
+ // if *not* mac/ie 5
+ if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
+ // set background div to offset size
+ elmCache["background"].style.width = ow + "px";
+ elmCache["background"].style.height = oh + "px";
+ elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
+ elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
+ elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
+ }
+ // mac ie is a little different because we use a PNG for the transparency
+ else {
+ // set background div to offset size
+ elmCache["background"].firstChild.src = TransMenu.backgroundPng;
+ elmCache["background"].firstChild.width = ow;
+ elmCache["background"].firstChild.height = oh;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
+ elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
+ elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
+ }
+ }
+
+ function initCache() {
+ var menu = document.getElementById(id);
+ var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
+
+ elmCache = {};
+ elmCache["clip"] = menu;
+ elmCache["item"] = [];
+
+ for (var i = 0, elm = null; elm = all[i]; i++) {
+ switch (elm.className) {
+ case "items":
+ case "content":
+ case "background":
+ case "shadowRight":
+ case "shadowBottom":
+ elmCache[elm.className] = elm;
+ break;
+ case "item":
+ elm._index = elmCache["item"].length;
+ elmCache["item"][elm._index] = elm;
+ break;
+ }
+ }
+
+ // hack!
+ _this.elmCache = elmCache;
+ }
+
+ function initEvents() {
+ // hook item mouseover
+ for (var i = 0, item = null; item = elmCache.item[i]; i++) {
+ item.onmouseover = item_mouseover;
+ item.onmouseout = item_mouseout;
+ item.onclick = item_click;
+ }
+
+ // hook actuation
+ if (typeof oActuator.tagName != "undefined") {
+ oActuator.onmouseover = actuator_mouseover;
+ oActuator.onmouseout = actuator_mouseout;
+ }
+
+ // hook menu mouseover
+ elmCache["content"].onmouseover = content_mouseover;
+ elmCache["content"].onmouseout = content_mouseout;
+ }
+
+ function highlight(oRow) {
+ oRow.className = "item hover";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
+ }
+
+ function dehighlight(oRow) {
+ oRow.className = "item";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
+ }
+
+ function item_mouseover() {
+ if (!animating) {
+ highlight(this);
+
+ if (childMenus[this._index])
+ childMenuSet.showMenu(childMenus[this._index]);
+ else if (childMenuSet) childMenuSet.hide();
+ }
+ }
+
+ function item_mouseout() {
+ if (!animating) {
+ if (childMenus[this._index])
+ childMenuSet.hideMenu(childMenus[this._index]);
+ else // otherwise child_deactivate will do this
+ dehighlight(this);
+ }
+ }
+
+ function item_click() {
+ if (!animating) {
+ if (_this.items[this._index].url)
+ location.href = _this.items[this._index].url;
+ }
+ }
+
+ function actuator_mouseover() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function actuator_mouseout() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function content_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ _this.onmouseover();
+ }
+ }
+
+ function content_mouseout() {
+ if (!animating) {
+ parentMenuSet.hideMenu(_this);
+ }
+ }
+
+ function child_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ }
+ }
+
+ function child_deactivate() {
+ for (var i = 0; i < childMenus.length; i++) {
+ if (childMenus[i] == this) {
+ dehighlight(elmCache["item"][i]);
+ break;
+ }
+ }
+ }
+
+ function child_queue() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function child_dequeue() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function toString() {
+ var aHtml = [];
+ var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
+
+ for (var i = 0, item = null; item = this.items[i]; i++) {
+ aHtml[i] = item.toString(childMenus[i]);
+ }
+
+ return '<div id="' + id + '" class="' + sClassName + '">' +
+ '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
+ aHtml.join('') +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
+ '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '</div></div>';
+ }
+}
+
+
+//==================================================================================================
+// TransMenuSet
+//==================================================================================================
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menus from actuator
+// iTop : Top pixel offset of menus from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+//==================================================================================================
+TransMenuSet.registry = [];
+
+function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
+ // public methods
+ this.addMenu = addMenu;
+ this.showMenu = showMenu;
+ this.hideMenu = hideMenu;
+ this.hide = hide;
+ this.hideCurrent = hideCurrent;
+
+ // initialization
+ var menus = [];
+ var _this = this;
+ var current = null;
+
+ this.index = TransMenuSet.registry.length;
+ TransMenuSet.registry[this.index] = this;
+
+ // method implimentations...
+ function addMenu(oActuator) {
+ var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
+ menus[menus.length] = m;
+ return m;
+ }
+
+ function showMenu(oMenu) {
+ if (oMenu != current) {
+ // close currently open menu
+ if (current != null) hide(current);
+
+ // set current menu to this one
+ current = oMenu;
+
+ // if this menu is closed, open it
+ oMenu.show();
+ }
+ else {
+ // hide pending calls to close this menu
+ cancelHide(oMenu);
+ }
+ }
+
+ function hideMenu(oMenu) {
+ //dbg_dump("hideMenu a " + oMenu.index);
+ if (current == oMenu && oMenu.isOpen) {
+ //dbg_dump("hideMenu b " + oMenu.index);
+ if (!oMenu.hideTimer) scheduleHide(oMenu);
+ }
+ }
+
+ function scheduleHide(oMenu) {
+ //dbg_dump("scheduleHide " + oMenu.index);
+ oMenu.onqueue();
+ oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
+ }
+
+ function cancelHide(oMenu) {
+ //dbg_dump("cancelHide " + oMenu.index);
+ if (oMenu.hideTimer) {
+ oMenu.ondequeue();
+ window.clearTimeout(oMenu.hideTimer);
+ oMenu.hideTimer = null;
+ }
+ }
+
+ function hide(oMenu) {
+ if (!oMenu && current) oMenu = current;
+
+ if (oMenu && current == oMenu && oMenu.isOpen) {
+ hideCurrent();
+ }
+ }
+
+ function hideCurrent() {
+ if (null != current) {
+ cancelHide(current);
+ current.hideTimer = null;
+ current.hide();
+ current = null;
+ }
+ }
+}
+
+//==================================================================================================
+// TransMenuItem (internal)
+// represents an item in a dropdown
+//==================================================================================================
+// sText : The item display text
+// sUrl : URL to load when the item is clicked
+// oParent : Menu this item is a part of
+//==================================================================================================
+function TransMenuItem(sText, sUrl, oParent) {
+ this.toString = toString;
+ this.text = sText;
+ this.url = sUrl;
+ this.parentMenu = oParent;
+
+ function toString(bDingbat) {
+ var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
+ var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
+ var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
+ var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
+
+ return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
+ sText + '</td><td width="14" style="' + sPaddingRight + '">' +
+ '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
+ }
+}
+
+
+
+
+
+
+//=====================================================================
+// Accel[erated] [an]imation object
+// change a property of an object over time in an accelerated fashion
+//=====================================================================
+// obj : reference to the object whose property you'd like to animate
+// prop : property you would like to change eg: "left"
+// to : final value of prop
+// time : time the animation should take to run
+// zip : optional. specify the zippiness of the acceleration. pick a
+// number between -1 and 1 where -1 is full decelerated, 1 is
+// full accelerated, and 0 is linear (no acceleration). default
+// is 0.
+// unit : optional. specify the units for use with prop. default is
+// "px".
+//=====================================================================
+// bezier functions lifted from the lib_animation.js file in the
+// 13th Parallel API. www.13thparallel.org
+//=====================================================================
+
+function Accelimation(from, to, time, zip) {
+ if (typeof zip == "undefined") zip = 0;
+ if (typeof unit == "undefined") unit = "px";
+
+ this.x0 = from;
+ this.x1 = to;
+ this.dt = time;
+ this.zip = -zip;
+ this.unit = unit;
+ this.timer = null;
+ this.onend = new Function();
+ this.onframe = new Function();
+}
+
+
+
+//=====================================================================
+// public methods
+//=====================================================================
+
+// after you create an accelimation, you call this to start it-a runnin'
+Accelimation.prototype.start = function() {
+ this.t0 = new Date().getTime();
+ this.t1 = this.t0 + this.dt;
+ var dx = this.x1 - this.x0;
+ this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
+ this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
+ Accelimation._add(this);
+}
+
+// and if you need to stop it early for some reason...
+Accelimation.prototype.stop = function() {
+ Accelimation._remove(this);
+}
+
+
+
+//=====================================================================
+// private methods
+//=====================================================================
+
+// paints one frame. gets called by Accelimation._paintAll.
+Accelimation.prototype._paint = function(time) {
+ if (time < this.t1) {
+ var elapsed = time - this.t0;
+ this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
+ }
+ else this._end();
+}
+
+// ends the animation
+Accelimation.prototype._end = function() {
+ Accelimation._remove(this);
+ this.onframe(this.x1);
+ this.onend();
+}
+
+
+
+
+//=====================================================================
+// static methods (all private)
+//=====================================================================
+
+// add a function to the list of ones to call periodically
+Accelimation._add = function(o) {
+ var index = this.instances.length;
+ this.instances[index] = o;
+ // if this is the first one, start the engine
+ if (this.instances.length == 1) {
+ this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
+ }
+}
+
+// remove a function from the list
+Accelimation._remove = function(o) {
+ for (var i = 0; i < this.instances.length; i++) {
+ if (o == this.instances[i]) {
+ this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
+ break;
+ }
+ }
+ // if that was the last one, stop the engine
+ if (this.instances.length == 0) {
+ window.clearInterval(this.timerID);
+ this.timerID = null;
+ }
+}
+
+// "engine" - call each function in the list every so often
+Accelimation._paintAll = function() {
+ var now = new Date().getTime();
+ for (var i = 0; i < this.instances.length; i++) {
+ this.instances[i]._paint(now);
+ }
+}
+
+
+// Bezier functions:
+Accelimation._B1 = function(t) { return t*t*t }
+Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
+Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
+Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
+
+
+//Finds the coordinates of a point at a certain stage through a bezier curve
+Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
+ return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
+}
+
+
+//=====================================================================
+// static properties
+//=====================================================================
+
+Accelimation.instances = [];
+Accelimation.targetRes = 10;
+Accelimation.timerID = null;
+
+
+//=====================================================================
+// IE win memory cleanup
+//=====================================================================
+
+if (window.attachEvent) {
+ var cearElementProps = [
+ 'data',
+ 'onmouseover',
+ 'onmouseout',
+ 'onmousedown',
+ 'onmouseup',
+ 'ondblclick',
+ 'onclick',
+ 'onselectstart',
+ 'oncontextmenu'
+ ];
+
+ window.attachEvent("onunload", function() {
+ var el;
+ for(var d = document.all.length;d--;){
+ el = document.all[d];
+ for(var c = cearElementProps.length;c--;){
+ el[cearElementProps[c]] = null;
+ }
+ }
+ });
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/javascript/transmenuC.js b/src/usr/local/www/themes/code-red/javascript/transmenuC.js
new file mode 100755
index 0000000..88626c7
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/javascript/transmenuC.js
@@ -0,0 +1,86 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ * Customizable multi-level animated DHTML menus with transparency.
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * ============================================================================================== */
+TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
+else r=true;}}
+return r;}
+TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
+TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
+document.write(aMenuHtml.join(""));}
+function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
+function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
+function initialize(){initCache();initEvents();initSize();ready=true;}
+function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
+function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
+function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
+if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
+switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
+x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
+function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
+function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
+function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
+function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
+else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
+function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
+_this.elmCache=elmCache;}
+function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
+if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
+elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
+function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
+function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
+function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
+function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
+function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
+function actuator_mouseover(){parentMenuSet.showMenu(_this);}
+function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
+function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
+function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
+function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
+function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
+function child_queue(){parentMenuSet.hideMenu(_this);}
+function child_dequeue(){parentMenuSet.showMenu(_this);}
+function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
+return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
+TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
+function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
+else{cancelHide(oMenu);}}
+function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
+function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
+function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
+function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
+function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
+function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
+var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
+return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
+function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
+Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
+Accelimation.prototype.stop=function(){Accelimation._remove(this);}
+Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
+else this._end();}
+Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
+Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
+Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
+if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
+Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
+Accelimation._B1=function(t){return t*t*t}
+Accelimation._B2=function(t){return 3*t*t*(1-t)}
+Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
+Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
+Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
+Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
+if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/jsevents/body.def b/src/usr/local/www/themes/code-red/jsevents/body.def
new file mode 100755
index 0000000..501d548
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/jsevents/body.def
@@ -0,0 +1,7 @@
+# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
+# where: forbidden pages are those pages that should *not* use
+# the particular JavaScript function within the JS event
+# specified below.
+# $Id$
+#
+onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/loader.js b/src/usr/local/www/themes/code-red/loader.js
new file mode 100644
index 0000000..7f67dc0
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/loader.js
@@ -0,0 +1,29 @@
+//<![CDATA[
+var browser = '';
+var version = '';
+var entrance = '';
+var cond = '';
+
+// BROWSER?
+if (browser == '') {
+ if (navigator.appName.indexOf('Microsoft') != -1)
+ browser = 'IE';
+ else if (navigator.appName.indexOf('Netscape') != -1)
+ browser = 'Netscape';
+ else
+ browser = 'IE';
+}
+if (version == '') {
+ version= navigator.appVersion;
+ paren = version.indexOf('(');
+ whole_version = navigator.appVersion.substring(0,paren-1);
+ version = parseInt(whole_version);
+}
+
+if (browser == 'IE' && version < 7) {
+ document.write('<script type="text/javascript" src="/themes/code-red/javascript/ie7/ie7-standard-p.js"></script>');
+}
+
+document.write('<script type="text/javascript" src="/themes/code-red/javascript/niftyjsCode.js"></script>');
+
+//]]>
diff --git a/src/usr/local/www/themes/code-red/login.css b/src/usr/local/www/themes/code-red/login.css
new file mode 100755
index 0000000..6ccdd42
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/login.css
@@ -0,0 +1,1136 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background: url('images/logon-background.gif') no-repeat;
+ background-position : center 0px;
+ background-color: #4a0203;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 10;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+
+#graph {
+ position: relative;
+ z-index: 10;
+}
+
+
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+
+#login {
+/* background: #cccccc; */
+ background-color: transparent;
+ border: 0px solid #cccccc;
+ margin: 5em auto;
+ padding: 0em;
+ width: 400px;
+/* filter:alpha(opacity=60);
+ -moz-opacity:0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6; */
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+/* background: #ffffff; */
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 400px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: -40px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -390px;
+ left: 60px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ top: -300px; */
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ left: 10px;
+ top: -300px; */
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -20px;
+ left: 170px;
+}
+
+/* loginerror box follows */
+
+#login #inputerrors {
+ background-color: transparent;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ vertical-align: middle;
+ padding: 0em;
+ width: 330px;
+ height: 50px;
+ position: relative;
+ top: -112px;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/menu.inc b/src/usr/local/www/themes/code-red/menu.inc
new file mode 100755
index 0000000..a274410
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/menu.inc
@@ -0,0 +1,177 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ menu.inc
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+require("menu.inc");
+
+define("TMENU_STUB", "
+ // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
+ // but you can experiment with effect on loadtime.
+ if (TransMenu.isSupported()) {
+
+ //==================================================================================================
+ // create a set of dropdowns
+ //==================================================================================================
+ // the first param should always be down, as it is here
+ //
+ // The second and third param are the top and left offset positions of the menus from their actuators
+ // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
+ // something like -5, 5
+ //
+ // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
+ // of the actuator from which to measure the offset positions above. Here we are saying we want the
+ // menu to appear directly below the bottom left corner of the actuator
+ //==================================================================================================
+ var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
+
+ //==================================================================================================
+ // create a dropdown menu
+ //==================================================================================================
+ // the first parameter should be the HTML element which will act actuator for the menu
+ //==================================================================================================
+
+ @@MENU_DEFINITIONS@@
+
+ //==================================================================================================
+ // write drop downs into page
+ //==================================================================================================
+ // this method writes all the HTML for the menus into the page with document.write(). It must be
+ // called within the body of the HTML page.
+ //==================================================================================================
+ TransMenu.renderAll();
+ }
+");
+
+class NervecenterMenu extends Menu {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+ private $menuID = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $c);
+
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+ $this->menuID = $id;
+
+ if ($this->hasParent()) {
+ $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
+ }
+ } // end __construct
+
+ public function getMenuID() {
+ return $this->menuID;
+ }
+
+ public function setMenuID($myMenuID) {
+ $this->menuID = $myMenuID;
+ }
+
+ public function getMenuJScript() {
+ $childJScript = "";
+ foreach ($this->getChildren() as $component) {
+ $childJScript .= $component->getMenuJScript();
+ }
+
+ if (! $this->hasParent()) {
+ $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
+ } else {
+ $this->menuJScript .= "\n$childJScript\n";
+ }
+
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ if (! $this->hasParent()) {
+ $menuMarkup =<<<EOD
+ <div id="menu">
+ @@CHILD_ELEMENTS@@
+ </div>
+
+EOD;
+ } else {
+ $name = gettext($this->getID());
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+
+ $menuMarkup =<<<EOD
+ <a id="{$id}" href="#">{$name}</a>
+ @@CHILD_ELEMENTS@@
+EOD;
+ }
+
+ $childMarkup = "";
+ foreach ($this->getChildren() as $component) {
+ $childMarkup .= $component;
+ }
+
+ $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
+
+ return $menuMarkup;
+ }
+}
+
+class NervecenterMenuItem extends MenuItem {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $href, $c);
+
+ $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
+ $name = gettext($this->getID());
+ $file = $this->getFile();
+
+ $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
+ }
+
+ public function getMenuJScript() {
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ return "";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/code-red/new_tab_menu.css b/src/usr/local/www/themes/code-red/new_tab_menu.css
new file mode 100644
index 0000000..04c4cf2
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/new_tab_menu.css
@@ -0,0 +1,101 @@
+/*
+ new_tab_menu.css
+ part of pfSense
+ Copyright (C) 2010-2011 Robert Zelaya
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
+ The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
+
+ <tr>
+ <td>
+ <?php
+ $tab_array_indent = 0; // move to the line in px
+ $tab_array_space = 1; // space betwen lines in px
+ $tab_array_char_limit = 82; // number or chr before the drop down box
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+
+*/
+
+.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
+
+.newtabmenu li{float:left; margin-right:2px; text-align: center;}
+.newtabmenu a:link, .newtabmenu a:visited{
+ background:url(images/new_tab_menu.png) right 45px;
+ color:#ffffff; /* noactive font */
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ font-weight:bold;
+ font-size:.9em;
+ height:20px;
+ line-height:20px;
+ text-decoration:none;
+}
+.newtabmenu a span{
+ background:url(images/new_tab_menu.png) left 45px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ height:20px;
+ margin-right:7px;
+ padding-left:7px;
+}
+.newtabmenu a:hover{
+ background:url(images/new_tab_menu.png) right 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ color:#ffffff; /* hover over font */
+}
+.newtabmenu a:hover span{
+ background:url(images/new_tab_menu.png) left 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+}
+
+/* -------------------------------- */
+/* ACTIVE ELEMENTS */
+.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
+ color:#000000; /* active font */
+ background:url(images/new_tab_menu.png) right 0 no-repeat;
+}
+.newtabmenu_active a span, .newtabmenu_active a:hover span{
+ background:url(images/new_tab_menu.png) left 0 no-repeat;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/no_big_logo b/src/usr/local/www/themes/code-red/no_big_logo
new file mode 100755
index 0000000..6e5c70d
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/no_big_logo
@@ -0,0 +1 @@
+NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/rrdcolors.inc.php b/src/usr/local/www/themes/code-red/rrdcolors.inc.php
new file mode 100755
index 0000000..dcb7a39
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/rrdcolors.inc.php
@@ -0,0 +1,89 @@
+<?php
+/* $Id$ */
+/*
+ rrdcolors.inc.php
+ Part of pfSense
+ Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* This file is included by the RRD graphing page and sets the colors */
+
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF','00E344','FF0000','000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333','a83c3c','999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+?>
diff --git a/src/usr/local/www/themes/code-red/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/code-red/styles/jquery-ui-1.11.1.css
new file mode 100644
index 0000000..8a8c54f
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/styles/jquery-ui-1.11.1.css
@@ -0,0 +1,1226 @@
+/*! jQuery UI - v1.11.1 - 2014-09-22
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 1em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+ background-color: #990000;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #bbbbbb;
+ /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
+ color: #444444;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #444444;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #3383bb;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #3383bb;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #bbbbbb;
+ background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #599fcf;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #599fcf;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #999999;
+ background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #ffffff;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
+ color: #444444;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #444444;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #c0402a;
+ background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
+ opacity: .8;
+ filter: Alpha(Opacity=80); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -4px 0 0 -4px;
+ padding: 4px;
+ background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .6;
+ filter: Alpha(Opacity=60); /* support: IE8 */
+ border-radius: 0pxdow;
+}
diff --git a/src/usr/local/www/themes/code-red/styles/menustyles.css b/src/usr/local/www/themes/code-red/styles/menustyles.css
new file mode 100755
index 0000000..06b3c7a
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/styles/menustyles.css
@@ -0,0 +1,44 @@
+#navigation {
+ /* border:1px solid black; */
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ padding-top: 4px;
+ }
+
+#menu {
+ /* background: #990000; */
+ /* border-bottom:1px solid white; */
+ padding: 0 0 0 0;
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ }
+#menu a {
+ padding: 2px 28px 4px 28px;
+ text-decoration: none;
+ font-weight: bold;
+ font-size: 1.0em;
+ color: #FFFFFF;
+ width: 08%;
+ height: 16px;
+ }
+#menu a.hover {
+ background: #AF2020;
+ }
+#menu span {
+ display: none;
+ }
+
+#subnav {
+ font-size: 10px;
+ margin-bottom: 2em;
+ }
+#subnav a {
+ color: #FF0000; /* #FB3B00; */
+ margin-right: 1em;
+ }
+#subnav span {
+ color: silver;
+ margin-right: 1em;
+ }
diff --git a/src/usr/local/www/themes/code-red/styles/transmenu.css b/src/usr/local/www/themes/code-red/styles/transmenu.css
new file mode 100755
index 0000000..f683574
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/styles/transmenu.css
@@ -0,0 +1,75 @@
+/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
+.transMenu {
+ position:absolute;
+ overflow:hidden;
+ left:-1000px;
+ top:-1000px;
+ }
+
+/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
+.transMenu .content {
+ position:absolute;
+ }
+
+/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
+.transMenu .items {
+ position:relative;
+ left:0px; top:0px;
+ z-index:2;
+ }
+
+.transMenu.top .items {
+ border-top:none;
+ }
+
+/* each TR.item is one menu item */
+.transMenu .item {
+ color: #FFFFFF; /* #336; */
+ font-size: 1.1em;
+ font-weight: normal;
+ font-family:sans-serif;
+ text-decoration:none;
+ /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
+ border:none;
+ cursor:pointer;
+ cursor:hand;
+ }
+
+/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
+/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
+.transMenu .background {
+ position:absolute;
+ left:0px; top:0px;
+ z-index:1;
+ -moz-opacity:.8;
+ filter:alpha(opacity=80);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowRight {
+ position:absolute;
+ z-index:3;
+ top:3px; width:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowBottom {
+ position:absolute;
+ z-index:1;
+ left:3px; height:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
+.transMenu .item.hover {
+ background:#fdfdfd;
+ color:black;
+ }
+
+/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
+.transMenu .item img {
+ margin-left:10px;
+ } \ No newline at end of file
diff --git a/src/usr/local/www/themes/code-red/wizard.css b/src/usr/local/www/themes/code-red/wizard.css
new file mode 100755
index 0000000..c0a7546
--- /dev/null
+++ b/src/usr/local/www/themes/code-red/wizard.css
@@ -0,0 +1,1068 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #5f0406;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background: url('images/logon-background.gif') no-repeat;
+ background-position : center 0px;
+ background-color: #4a0203;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 10;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+
+#graph {
+ position: relative;
+ z-index: 10;
+}
+
+
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
diff --git a/src/usr/local/www/themes/metallic/all.css b/src/usr/local/www/themes/metallic/all.css
new file mode 100644
index 0000000..18a8c0b
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/all.css
@@ -0,0 +1,1269 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, sans-serif;
+ font-size: 0.9em;
+}
+
+.nowrap { white-space: nowrap; }
+
+.infobox {
+ width:100%;
+}
+
+.addgatewaybox {
+ background-color: #990000;
+ border-style: none none none none;
+ width: 225px;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 220px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 11px;
+ font-family: "Trebuchet MS", sans-serif;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ background-color: #333333;
+ margin: 5px auto;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 815px;
+ margin: 5px auto;
+}
+
+#header {
+ background: url('images/header.gif') no-repeat;
+ background-position: 4px;
+ height: 102px;
+ width: 808px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.gif') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: bold;
+ font-family: Verdana;
+ text-align: center;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 4px;
+ margin-top: 0px;
+ margin-left: 5px;
+ padding-top: 0px;
+ width: 800px;
+ background: url('images/horizontal.gif') repeat-y;
+}
+
+#left {
+ width: 800px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.gif') no-repeat;
+ top: -18px;
+ left: 7px;
+ width: 800px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ position: relative;
+ top: -24px;
+ left: -4px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ width: 80px;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #505050;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background: url('images/metal_bgr.gif') repeat-x;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background: url('images/metal_bgr_red.gif') repeat-x;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 5px;
+ margin-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/metallic/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/metallic/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/metallic/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/metallic/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/metallic/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/metallic/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/metallic/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/metallic/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/metallic/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/metallic/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/metallic/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/metallic/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/metallic/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/metallic/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/metallic/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/metallic/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/metallic/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/metallic/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listrborder {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-left: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ color: #FFFFFF;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #DDDDDD;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 6px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password, #password2 {
+ font-size: small;
+ width: 60%;
+ padding-left: 19px;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+
+/* Widget CSS */
+.widgetsubheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #B1B1B1;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #000000;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetdiv{
+ margin:5px;
+ padding: 5px;
+ background:#CCCCCC;
+}
+.widgetconfigdiv{
+ background:#BBBBBB;
+ font-size: 11px;
+ color: #000000;
+ padding-right: 5px;
+ padding-left: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div#log div.log-entry-mini {
+ clear: both;
+}
+
+div#log div.log-entry-mini span {
+ padding: 2px 2px 2px 2px;
+ padding-left: 6px;
+}
+
+div#log span.log-action-mini-header,
+div#log span.log-time-mini-header,
+div#log span.log-interface-mini-header,
+div#log span.log-source-mini-header,
+div#log span.log-destination-mini-header,
+div#log span.log-protocol-mini-header {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 12px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-time-mini,
+div#log span.log-interface-mini,
+div#log span.log-source-mini,
+div#log span.log-destination-mini,
+div#log span.log-protocol-mini {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 11px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-action-mini-header {
+ width: 6%;
+}
+
+div#log span.log-time-mini,
+div#log span.log-time-mini-header {
+ width: 19%;
+}
+
+div#log span.log-interface-mini,
+div#log span.log-interface-mini-header {
+ width: 8%;
+}
+
+div#log span.log-source-mini,
+div#log span.log-source-mini-header {
+ width: 23%;
+}
+
+div#log span.log-destination-mini,
+div#log span.log-destination-mini-header {
+ width: 31%;
+}
+
+div#log span.log-protocol-mini,
+div#log span.log-protocol-mini-header {
+ width: 8%;
+ border-right: 1px solid #999;
+}
+
+/* Sortable tables */
+table.sortable thead {
+ cursor: default;
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+
+/*thermal_sensors widget styles*/
+
+.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
+.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
+.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
+ background-color: LimeGreen;
+ border-top-width: 2px; border-top-color: Lime;
+ border-left-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 2px; border-bottom-color: Green;
+}
+.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
+.thermalSensorText { float: left; height: 20px; top: 3px; }
+.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
+
+.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+
+.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
+
+.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
+
+/* widget textarea styles - full width */
+.textarea_widget {
+ width: 100%;
+ resize:vertical;
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* IE 8+ */
+}
diff --git a/src/usr/local/www/themes/metallic/apple-touch-icon.png b/src/usr/local/www/themes/metallic/apple-touch-icon.png
new file mode 100755
index 0000000..7a4b975
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/apple-touch-icon.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/bottom-loader.js b/src/usr/local/www/themes/metallic/bottom-loader.js
new file mode 100644
index 0000000..a21f775
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/bottom-loader.js
@@ -0,0 +1,10 @@
+//<![CDATA[
+
+ NiftyCheck();
+ Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
+ Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
+ Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
+ Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
+ Rounded("div#topbox","all","#FFF","#990000","smooth");
+
+//]]>
diff --git a/src/usr/local/www/themes/metallic/images/alert_bgr.gif b/src/usr/local/www/themes/metallic/images/alert_bgr.gif
new file mode 100755
index 0000000..65498f1
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/alert_bgr.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/footer.gif b/src/usr/local/www/themes/metallic/images/footer.gif
new file mode 100755
index 0000000..f7c2af7
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/footer.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/header.gif b/src/usr/local/www/themes/metallic/images/header.gif
new file mode 100755
index 0000000..0a44068
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/header.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/help.png b/src/usr/local/www/themes/metallic/images/help.png
new file mode 100755
index 0000000..1de05e3
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/help.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/horizontal.gif b/src/usr/local/www/themes/metallic/images/horizontal.gif
new file mode 100755
index 0000000..a280dcb
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/horizontal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/favicon.ico b/src/usr/local/www/themes/metallic/images/icons/favicon.ico
new file mode 100755
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_3g.gif b/src/usr/local/www/themes/metallic/images/icons/icon_3g.gif
new file mode 100755
index 0000000..46ccb92
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_3g.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/metallic/images/icons/icon_3g_inactive.gif
new file mode 100755
index 0000000..cf983e4
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_3g_inactive.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_advanced.gif b/src/usr/local/www/themes/metallic/images/icons/icon_advanced.gif
new file mode 100755
index 0000000..3ede1ff
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_advanced.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/metallic/images/icons/icon_advanced_s.gif
new file mode 100755
index 0000000..b233549
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_advanced_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alert.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alert.gif
new file mode 100755
index 0000000..7646941
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_host.gif
new file mode 100755
index 0000000..ad43e17
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_alias_host.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_net.gif
new file mode 100755
index 0000000..abd1b8b
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_alias_net.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_port.gif
new file mode 100755
index 0000000..4acf2aa
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_alias_port.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_url.gif
new file mode 100755
index 0000000..660571e
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_alias_url.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/metallic/images/icons/icon_alias_url_reload.gif
new file mode 100755
index 0000000..55c1c4a
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_alias_url_reload.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_block.gif b/src/usr/local/www/themes/metallic/images/icons/icon_block.gif
new file mode 100755
index 0000000..670c968
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_block.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_block_add.gif b/src/usr/local/www/themes/metallic/images/icons/icon_block_add.gif
new file mode 100755
index 0000000..eb726d6
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_block_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_block_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_block_d.gif
new file mode 100755
index 0000000..e6345fe
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_block_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/metallic/images/icons/icon_cablenic.gif
new file mode 100755
index 0000000..a071c66
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_cablenic.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_cal.gif b/src/usr/local/www/themes/metallic/images/icons/icon_cal.gif
new file mode 100755
index 0000000..a9c7c87
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_cal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_cal_mo.gif
new file mode 100755
index 0000000..1647e2f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_cal_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_carp.gif b/src/usr/local/www/themes/metallic/images/icons/icon_carp.gif
new file mode 100755
index 0000000..9454a82
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_carp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_carp_d.gif
new file mode 100755
index 0000000..2ba8db2
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_carp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_chain.png b/src/usr/local/www/themes/metallic/images/icons/icon_chain.png
new file mode 100644
index 0000000..12db07a
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_chain.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_check.gif b/src/usr/local/www/themes/metallic/images/icons/icon_check.gif
new file mode 100755
index 0000000..393674d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_check.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/metallic/images/icons/icon_clock_green.gif
new file mode 100755
index 0000000..e171ba8
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_clock_green.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/metallic/images/icons/icon_clock_grey.gif
new file mode 100755
index 0000000..00c865a
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_clock_grey.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/metallic/images/icons/icon_clock_red.gif
new file mode 100755
index 0000000..7b412ee
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_clock_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_close.gif b/src/usr/local/www/themes/metallic/images/icons/icon_close.gif
new file mode 100755
index 0000000..e0f86a7
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_close.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_configure.gif b/src/usr/local/www/themes/metallic/images/icons/icon_configure.gif
new file mode 100755
index 0000000..7182e0d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_configure.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_down.gif b/src/usr/local/www/themes/metallic/images/icons/icon_down.gif
new file mode 100755
index 0000000..b71a9c5
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_down_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_down_d.gif
new file mode 100755
index 0000000..70a7473
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_down_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_down_mo.gif
new file mode 100755
index 0000000..584587a
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_down_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_e.gif b/src/usr/local/www/themes/metallic/images/icons/icon_e.gif
new file mode 100755
index 0000000..2950800
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_e.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_e_mo.gif
new file mode 100755
index 0000000..9ba5738
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_e_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_error.gif b/src/usr/local/www/themes/metallic/images/icons/icon_error.gif
new file mode 100755
index 0000000..e0fa659
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_error.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_exclam.gif b/src/usr/local/www/themes/metallic/images/icons/icon_exclam.gif
new file mode 100755
index 0000000..36c2ec7
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_exclam.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_flag_de.png b/src/usr/local/www/themes/metallic/images/icons/icon_flag_de.png
new file mode 100755
index 0000000..069cbbe
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_flag_de.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_flag_en.png b/src/usr/local/www/themes/metallic/images/icons/icon_flag_en.png
new file mode 100755
index 0000000..bd7f9a5
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_flag_en.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_flag_es.png b/src/usr/local/www/themes/metallic/images/icons/icon_flag_es.png
new file mode 100755
index 0000000..434776c
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_flag_es.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/metallic/images/icons/icon_flag_pt_BR.png
new file mode 100755
index 0000000..f786349
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_flag_pt_BR.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_cert.png
new file mode 100755
index 0000000..48a34b6
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_cert.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_file.png
new file mode 100755
index 0000000..48a9ed2
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_file.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_group.png
new file mode 100755
index 0000000..7d929c0
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_group.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_host.png
new file mode 100755
index 0000000..867ef2c
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_host.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_imp.png
new file mode 100755
index 0000000..f667cfc
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_imp.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_mail.png
new file mode 100755
index 0000000..d2d4548
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_mail.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_pwd.png
new file mode 100755
index 0000000..06b53a1
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_pwd.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_search.png
new file mode 100755
index 0000000..33de926
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_search.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_time.png
new file mode 100755
index 0000000..aa8300a
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_time.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_unknown.png
new file mode 100755
index 0000000..1857d0e
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_unknown.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_url.png
new file mode 100755
index 0000000..cf56792
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_url.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_user.png
new file mode 100755
index 0000000..e00eebe
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_frmfld_user.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/metallic/images/icons/icon_fw-update.gif
new file mode 100755
index 0000000..52c18ac
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_fw-update.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_help.gif b/src/usr/local/www/themes/metallic/images/icons/icon_help.gif
new file mode 100644
index 0000000..84c84db
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_help.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/metallic/images/icons/icon_ifalias.gif
new file mode 100755
index 0000000..0c569a7
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_ifalias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_ifalias_d.gif
new file mode 100755
index 0000000..faa84d4
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_ifalias_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/metallic/images/icons/icon_import_alias.gif
new file mode 100755
index 0000000..d11a5f0
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_import_alias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_in.gif b/src/usr/local/www/themes/metallic/images/icons/icon_in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_in_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/metallic/images/icons/icon_info_pkg.gif
new file mode 100755
index 0000000..cd3a532
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_info_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/metallic/images/icons/icon_interface_down.gif
new file mode 100755
index 0000000..0626655
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_interface_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/metallic/images/icons/icon_interface_up.gif
new file mode 100755
index 0000000..1449513
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_interface_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_left.gif b/src/usr/local/www/themes/metallic/images/icons/icon_left.gif
new file mode 100755
index 0000000..8effefe
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_left_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_left_d.gif
new file mode 100755
index 0000000..c778014
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_left_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_left_mo.gif
new file mode 100755
index 0000000..84c6fa2
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_left_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_log.gif b/src/usr/local/www/themes/metallic/images/icons/icon_log.gif
new file mode 100755
index 0000000..4a1983a
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_log.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_log_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_log_d.gif
new file mode 100755
index 0000000..d31bd9b
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_log_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_log_s.gif b/src/usr/local/www/themes/metallic/images/icons/icon_log_s.gif
new file mode 100755
index 0000000..f9fda33
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_log_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_log_s_d.gif
new file mode 100755
index 0000000..fb2c05f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_log_s_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_logs.gif b/src/usr/local/www/themes/metallic/images/icons/icon_logs.gif
new file mode 100644
index 0000000..afe0104
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_logs.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_match.gif b/src/usr/local/www/themes/metallic/images/icons/icon_match.gif
new file mode 100644
index 0000000..215571f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_match.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_match_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_match_d.gif
new file mode 100644
index 0000000..6e4c364
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_match_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_minus.gif b/src/usr/local/www/themes/metallic/images/icons/icon_minus.gif
new file mode 100755
index 0000000..417544f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_minus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_open.gif b/src/usr/local/www/themes/metallic/images/icons/icon_open.gif
new file mode 100755
index 0000000..ac3da14
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_open.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_other.gif b/src/usr/local/www/themes/metallic/images/icons/icon_other.gif
new file mode 100755
index 0000000..e6f780f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_other.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_other_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_other_d.gif
new file mode 100755
index 0000000..b08d970
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_other_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_out.gif b/src/usr/local/www/themes/metallic/images/icons/icon_out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_out_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_parp.gif b/src/usr/local/www/themes/metallic/images/icons/icon_parp.gif
new file mode 100755
index 0000000..96acaf3
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_parp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_parp_d.gif
new file mode 100755
index 0000000..7d7d00e
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_parp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_pass.gif b/src/usr/local/www/themes/metallic/images/icons/icon_pass.gif
new file mode 100755
index 0000000..fe1bb0d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_pass.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/metallic/images/icons/icon_pass_add.gif
new file mode 100755
index 0000000..f7f4c20
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_pass_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_pass_d.gif
new file mode 100755
index 0000000..6adc431
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_pass_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus.gif
new file mode 100755
index 0000000..2a94eeb
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_plus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl.gif
new file mode 100755
index 0000000..8dcd7c0
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl_p.gif
new file mode 100755
index 0000000..0c79849
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_plus_bl_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_d.gif
new file mode 100755
index 0000000..ebc7457
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_plus_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_mo.gif
new file mode 100755
index 0000000..1c7ca08
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_plus_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/metallic/images/icons/icon_plus_p.gif
new file mode 100755
index 0000000..eb41284
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_plus_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall.gif
new file mode 100755
index 0000000..d78b867
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_d.gif
new file mode 100755
index 0000000..13658f7
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_mo.gif
new file mode 100755
index 0000000..90b576e
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg.gif
new file mode 100755
index 0000000..9aebb03
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_d.gif
new file mode 100755
index 0000000..4ab4992
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_mo.gif
new file mode 100755
index 0000000..7025d20
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_pkg_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml.gif
new file mode 100755
index 0000000..4542432
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_d.gif
new file mode 100755
index 0000000..8d3a68d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_mo.gif
new file mode 100755
index 0000000..15e0aed
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reinstall_xml_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reject.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reject.gif
new file mode 100755
index 0000000..5565cd6
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reject.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_reject_d.gif
new file mode 100755
index 0000000..6c09fae
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_reject_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_right.gif b/src/usr/local/www/themes/metallic/images/icons/icon_right.gif
new file mode 100755
index 0000000..fdf2d8b
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_restart.gif
new file mode 100755
index 0000000..e49fbd7
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_service_restart.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_restart_d.gif
new file mode 100755
index 0000000..a5d6d7c
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_service_restart_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_running.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_running.gif
new file mode 100644
index 0000000..543fd56
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_service_running.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_start.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_start.gif
new file mode 100755
index 0000000..09bb58f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_service_start.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_start_d.gif
new file mode 100755
index 0000000..f58f111
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_service_start_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_status.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_status.gif
new file mode 100644
index 0000000..a93bcfb
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_service_status.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_stop.gif
new file mode 100755
index 0000000..922addc
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_service_stop.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_stop_d.gif
new file mode 100755
index 0000000..b4cfdea
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_service_stop_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/metallic/images/icons/icon_service_stopped.gif
new file mode 100644
index 0000000..f93a25d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_service_stopped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_services_restart_mo.gif
new file mode 100755
index 0000000..a092b40
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_services_restart_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_services_start_mo.gif
new file mode 100755
index 0000000..ecdb58f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_services_start_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_services_stop_mo.gif
new file mode 100755
index 0000000..c00e208
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_services_stop_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/metallic/images/icons/icon_system-group-grey.png
new file mode 100755
index 0000000..d7b964d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_system-group-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system-group.png b/src/usr/local/www/themes/metallic/images/icons/icon_system-group.png
new file mode 100755
index 0000000..1c974f2
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_system-group.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/metallic/images/icons/icon_system-user-grey.png
new file mode 100755
index 0000000..2f6047d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_system-user-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system-user.png b/src/usr/local/www/themes/metallic/images/icons/icon_system-user.png
new file mode 100755
index 0000000..ef82156
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_system-user.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/metallic/images/icons/icon_system_lock_screen.png
new file mode 100755
index 0000000..30f306d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_system_lock_screen.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_system_logout.png b/src/usr/local/www/themes/metallic/images/icons/icon_system_logout.png
new file mode 100755
index 0000000..9bbb6c7
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_system_logout.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_trapped.gif b/src/usr/local/www/themes/metallic/images/icons/icon_trapped.gif
new file mode 100755
index 0000000..ffeb2cd
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_trapped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/metallic/images/icons/icon_trapped_p.gif
new file mode 100755
index 0000000..6d46aaf
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_trapped_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule.gif
new file mode 100755
index 0000000..e15ab6c
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule_d.gif
new file mode 100755
index 0000000..f776281
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_ts_rule_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_up.gif b/src/usr/local/www/themes/metallic/images/icons/icon_up.gif
new file mode 100755
index 0000000..883c5a2
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_up_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_up_d.gif
new file mode 100755
index 0000000..0ddcce2
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_up_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_up_mo.gif
new file mode 100755
index 0000000..9f869a4
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_up_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wlan.gif b/src/usr/local/www/themes/metallic/images/icons/icon_wlan.gif
new file mode 100755
index 0000000..1f0addc
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_wlan.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_wlan_d.gif
new file mode 100755
index 0000000..35bf580
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_wlan_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/metallic/images/icons/icon_wol_all.gif
new file mode 100755
index 0000000..2d22182
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_wol_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/metallic/images/icons/icon_wzd_nsaved.png
new file mode 100755
index 0000000..21cb27d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_wzd_nsaved.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/metallic/images/icons/icon_wzd_saved.png
new file mode 100755
index 0000000..ab82946
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_wzd_saved.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_x.gif b/src/usr/local/www/themes/metallic/images/icons/icon_x.gif
new file mode 100755
index 0000000..24e4d49
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_x_d.gif b/src/usr/local/www/themes/metallic/images/icons/icon_x_d.gif
new file mode 100755
index 0000000..d2bfbc8
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_x_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/metallic/images/icons/icon_x_mo.gif
new file mode 100755
index 0000000..da7b57c
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_x_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/icon_x_p.gif b/src/usr/local/www/themes/metallic/images/icons/icon_x_p.gif
new file mode 100755
index 0000000..8828fa6
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/icon_x_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/in.gif b/src/usr/local/www/themes/metallic/images/icons/in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/in_d.gif b/src/usr/local/www/themes/metallic/images/icons/in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/out.gif b/src/usr/local/www/themes/metallic/images/icons/out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/icons/out_d.gif b/src/usr/local/www/themes/metallic/images/icons/out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/icons/out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/log.png b/src/usr/local/www/themes/metallic/images/log.png
new file mode 100755
index 0000000..762ba80
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/log.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/logo.gif b/src/usr/local/www/themes/metallic/images/logo.gif
new file mode 100755
index 0000000..08638ff
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/logo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/logobig.jpg b/src/usr/local/www/themes/metallic/images/logobig.jpg
new file mode 100755
index 0000000..2ef196d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/logobig.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/menu_down.gif b/src/usr/local/www/themes/metallic/images/menu_down.gif
new file mode 100755
index 0000000..137de8d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/menu_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/menu_footer.gif b/src/usr/local/www/themes/metallic/images/menu_footer.gif
new file mode 100755
index 0000000..d06faa4
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/menu_footer.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/menu_right.gif b/src/usr/local/www/themes/metallic/images/menu_right.gif
new file mode 100755
index 0000000..881327c
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/menu_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/metal_bgr.gif b/src/usr/local/www/themes/metallic/images/metal_bgr.gif
new file mode 100755
index 0000000..a0ca6c8
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/metal_bgr.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/metal_bgr_red.gif b/src/usr/local/www/themes/metallic/images/metal_bgr_red.gif
new file mode 100755
index 0000000..c4a1465
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/metal_bgr_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bar_blue.gif b/src/usr/local/www/themes/metallic/images/misc/bar_blue.gif
new file mode 100755
index 0000000..741186a
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/bar_blue.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bar_gray.gif b/src/usr/local/www/themes/metallic/images/misc/bar_gray.gif
new file mode 100755
index 0000000..e86e245
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/bar_gray.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bar_left.gif b/src/usr/local/www/themes/metallic/images/misc/bar_left.gif
new file mode 100755
index 0000000..af751fa
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/bar_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bar_right.gif b/src/usr/local/www/themes/metallic/images/misc/bar_right.gif
new file mode 100755
index 0000000..ff12d9e
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/bar_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_minus.png
new file mode 100755
index 0000000..37db2fd
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_minus.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_plus.png
new file mode 100755
index 0000000..fba7af9
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/bullet_toggle_plus.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/button.gif b/src/usr/local/www/themes/metallic/images/misc/button.gif
new file mode 100755
index 0000000..e85dbb3
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/button.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/graph.png b/src/usr/local/www/themes/metallic/images/misc/graph.png
new file mode 100755
index 0000000..507ec75
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/graph.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/key_128.gif b/src/usr/local/www/themes/metallic/images/misc/key_128.gif
new file mode 100755
index 0000000..ea5ae34
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/key_128.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/key_152.gif b/src/usr/local/www/themes/metallic/images/misc/key_152.gif
new file mode 100755
index 0000000..6c7fc03
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/key_152.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/key_256.gif b/src/usr/local/www/themes/metallic/images/misc/key_256.gif
new file mode 100755
index 0000000..3e1c377
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/key_256.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/key_64.gif b/src/usr/local/www/themes/metallic/images/misc/key_64.gif
new file mode 100755
index 0000000..87892bd
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/key_64.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/left_background.gif b/src/usr/local/www/themes/metallic/images/misc/left_background.gif
new file mode 100755
index 0000000..529d827
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/left_background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/loader.gif b/src/usr/local/www/themes/metallic/images/misc/loader.gif
new file mode 100755
index 0000000..5d10ac3
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/loader_all.gif b/src/usr/local/www/themes/metallic/images/misc/loader_all.gif
new file mode 100755
index 0000000..cb6bc0c
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/loader_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/loader_filter.gif b/src/usr/local/www/themes/metallic/images/misc/loader_filter.gif
new file mode 100755
index 0000000..b838b17
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/loader_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/loader_tab.gif b/src/usr/local/www/themes/metallic/images/misc/loader_tab.gif
new file mode 100755
index 0000000..05bb04c
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/loader_tab.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/logon.png b/src/usr/local/www/themes/metallic/images/misc/logon.png
new file mode 100755
index 0000000..baf8a9d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/logon.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/progress_bar.gif b/src/usr/local/www/themes/metallic/images/misc/progress_bar.gif
new file mode 100755
index 0000000..3b4aa52
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/progress_bar.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/rrd_error.png b/src/usr/local/www/themes/metallic/images/misc/rrd_error.png
new file mode 100755
index 0000000..a79ecf3
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/rrd_error.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_alerter.gif b/src/usr/local/www/themes/metallic/images/misc/status_alerter.gif
new file mode 100755
index 0000000..7ff1e95
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/status_alerter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/metallic/images/misc/status_carpmaster.gif
new file mode 100755
index 0000000..2c32908
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/status_carpmaster.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_left.gif b/src/usr/local/www/themes/metallic/images/misc/status_left.gif
new file mode 100755
index 0000000..b5a2930
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/status_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_page_loading.gif b/src/usr/local/www/themes/metallic/images/misc/status_page_loading.gif
new file mode 100755
index 0000000..067ef18
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/status_page_loading.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_reload_all.gif b/src/usr/local/www/themes/metallic/images/misc/status_reload_all.gif
new file mode 100755
index 0000000..72de6bd
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/status_reload_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/metallic/images/misc/status_reload_filter.gif
new file mode 100755
index 0000000..d72761a
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/status_reload_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/status_right.gif b/src/usr/local/www/themes/metallic/images/misc/status_right.gif
new file mode 100755
index 0000000..bf66fdb
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/status_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/tri_c.gif b/src/usr/local/www/themes/metallic/images/misc/tri_c.gif
new file mode 100755
index 0000000..317b758
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/tri_c.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/tri_c_black.gif b/src/usr/local/www/themes/metallic/images/misc/tri_c_black.gif
new file mode 100755
index 0000000..3d33d49
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/tri_c_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/tri_o.gif b/src/usr/local/www/themes/metallic/images/misc/tri_o.gif
new file mode 100755
index 0000000..eb95c32
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/tri_o.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/tri_o_black.gif b/src/usr/local/www/themes/metallic/images/misc/tri_o_black.gif
new file mode 100755
index 0000000..4ed30d1
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/tri_o_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/misc/widget_loader.gif b/src/usr/local/www/themes/metallic/images/misc/widget_loader.gif
new file mode 100755
index 0000000..fad101f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/misc/widget_loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/new_tab_menu.png b/src/usr/local/www/themes/metallic/images/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/status.png b/src/usr/local/www/themes/metallic/images/status.png
new file mode 100755
index 0000000..a3e368e
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/status.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/transparent.gif b/src/usr/local/www/themes/metallic/images/transparent.gif
new file mode 100755
index 0000000..89c5530
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/transparent.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/images/transparent_pixel.gif b/src/usr/local/www/themes/metallic/images/transparent_pixel.gif
new file mode 100755
index 0000000..35d42e8
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/images/transparent_pixel.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/blank.gif b/src/usr/local/www/themes/metallic/javascript/ie7/blank.gif
new file mode 100755
index 0000000..a4fe2e6
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/blank.gif
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-box-model.js
new file mode 100644
index 0000000..45543f6
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-box-model.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-core.js
new file mode 100644
index 0000000..b11e2b1
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-core.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css-strict.js
new file mode 100644
index 0000000..4406d7a
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css-strict.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css2.js
new file mode 100644
index 0000000..7121c8e
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css2.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css3.js
new file mode 100644
index 0000000..86b24f5
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-css3.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-fixed.js
new file mode 100644
index 0000000..4321cda
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-fixed.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-html4.js
new file mode 100644
index 0000000..4d2baa9
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-html4.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-ie5.js
new file mode 100644
index 0000000..707fa56
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-ie5.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite-p.js
new file mode 100644
index 0000000..3a66d19
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite.js
new file mode 100644
index 0000000..88c764f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-lite.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-png.js
new file mode 100644
index 0000000..7b8f2cf
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-png.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-server.css
new file mode 100644
index 0000000..47c7edd
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-server.css
@@ -0,0 +1,43 @@
+body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
+body {margin: 8px; background: #333;}
+h1 {margin: 0;}
+h1 a:hover {background-color: transparent;}
+h2 {font-size: 1.75em;}
+h3 {font-size: 1.1em;}
+a:active {color: #ff0000;}
+a:link {color: #0a6cce;}
+a:visited {color: #0a6cce;}
+code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
+ padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
+code.box {display: block; padding: 10px; margin: 0.5em 0;}
+ul {list-style-type: square;}
+dd {margin: .2em 0 .5em 1em;}
+dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
+dl.library dd {font-style: italic; margin-left: 3em;}
+dt {font-weight: bold;}
+dt.pack {color: brown;}
+a img {border-style: none;}
+hr {height: 1px; color: #000; border-style: solid;}
+hr.short {height: 2px; width: 100px;}
+div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
+hr {border-bottom-width: 0px;}
+div.header hr {color: #0a6cce; background-color: #0a6cce;}
+div.content {min-height: 100px;}
+div.footer hr {color: #898e79; background-color: #898e79; }
+div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
+a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
+div.footer a:hover {background-color: transparent; text-decoration: none;}
+div.header .menu {text-align: right;}
+div.footer {font-size: x-small; margin-top: 8px;}
+div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
+#license {margin-top: 5px; font-size: xx-small;}
+table {border-top: 1px solid #000; border-left: 1px solid #000;}
+th {background-color: #fff; text-align: left;}
+th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
+th.small {width: 100px;}
+th.medium {width: 200px;}
+th.large {width: 270px;}
+th.x-large {width: 408px;}
+table.fixed {table-layout: fixed;}
+span.comment {color: #666;}
+
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard-p.js
new file mode 100644
index 0000000..73e99ac
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard.js
new file mode 100644
index 0000000..2109905
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/ie7-standard.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/metallic/javascript/ie7/test-trans.png b/src/usr/local/www/themes/metallic/javascript/ie7/test-trans.png
new file mode 100755
index 0000000..e187e2c
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/ie7/test-trans.png
Binary files differ
diff --git a/src/usr/local/www/themes/metallic/javascript/niftyjsCode.js b/src/usr/local/www/themes/metallic/javascript/niftyjsCode.js
new file mode 100644
index 0000000..75ef8b0
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/loader.js b/src/usr/local/www/themes/metallic/loader.js
new file mode 100644
index 0000000..9b435d5
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/loader.js
@@ -0,0 +1,29 @@
+//<![CDATA[
+var browser = '';
+var version = '';
+var entrance = '';
+var cond = '';
+
+// BROWSER?
+if (browser == '') {
+ if (navigator.appName.indexOf('Microsoft') != -1)
+ browser = 'IE';
+ else if (navigator.appName.indexOf('Netscape') != -1)
+ browser = 'Netscape';
+ else
+ browser = 'IE';
+}
+if (version == '') {
+ version= navigator.appVersion;
+ paren = version.indexOf('(');
+ whole_version = navigator.appVersion.substring(0,paren-1);
+ version = parseInt(whole_version);
+}
+
+if (browser == 'IE' && version < 7) {
+ document.write('<script type="text/javascript" src="/themes/metallic/javascript/ie7/ie7-standard-p.js"></script>');
+}
+
+document.write('<script type="text/javascript" src="/themes/metallic/javascript/niftyjsCode.js"></script>');
+
+//]]>
diff --git a/src/usr/local/www/themes/metallic/login.css b/src/usr/local/www/themes/metallic/login.css
new file mode 100644
index 0000000..f8abdfc
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/login.css
@@ -0,0 +1,1127 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+
+#login {
+/* background: #cccccc; */
+ background-color: transparent;
+ border: 0px solid #cccccc;
+ margin: 5em auto;
+ padding: 0em;
+ width: 400px;
+/* filter:alpha(opacity=60);
+ -moz-opacity:0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6; */
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+/* background: #ffffff; */
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 400px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -420px;
+ left: 70px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ top: -300px; */
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ left: 10px;
+ top: -300px; */
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -20px;
+ left: 170px;
+}
+
+/* loginerror box follows */
+
+#login #inputerrors {
+ background-color: transparent;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ vertical-align: middle;
+ padding: 0em;
+ width: 330px;
+ height: 50px;
+ position: relative;
+ top: -370px;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/new_tab_menu.css b/src/usr/local/www/themes/metallic/new_tab_menu.css
new file mode 100644
index 0000000..04c4cf2
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/new_tab_menu.css
@@ -0,0 +1,101 @@
+/*
+ new_tab_menu.css
+ part of pfSense
+ Copyright (C) 2010-2011 Robert Zelaya
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
+ The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
+
+ <tr>
+ <td>
+ <?php
+ $tab_array_indent = 0; // move to the line in px
+ $tab_array_space = 1; // space betwen lines in px
+ $tab_array_char_limit = 82; // number or chr before the drop down box
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+
+*/
+
+.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
+
+.newtabmenu li{float:left; margin-right:2px; text-align: center;}
+.newtabmenu a:link, .newtabmenu a:visited{
+ background:url(images/new_tab_menu.png) right 45px;
+ color:#ffffff; /* noactive font */
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ font-weight:bold;
+ font-size:.9em;
+ height:20px;
+ line-height:20px;
+ text-decoration:none;
+}
+.newtabmenu a span{
+ background:url(images/new_tab_menu.png) left 45px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ height:20px;
+ margin-right:7px;
+ padding-left:7px;
+}
+.newtabmenu a:hover{
+ background:url(images/new_tab_menu.png) right 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ color:#ffffff; /* hover over font */
+}
+.newtabmenu a:hover span{
+ background:url(images/new_tab_menu.png) left 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+}
+
+/* -------------------------------- */
+/* ACTIVE ELEMENTS */
+.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
+ color:#000000; /* active font */
+ background:url(images/new_tab_menu.png) right 0 no-repeat;
+}
+.newtabmenu_active a span, .newtabmenu_active a:hover span{
+ background:url(images/new_tab_menu.png) left 0 no-repeat;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/no_big_logo b/src/usr/local/www/themes/metallic/no_big_logo
new file mode 100644
index 0000000..6e5c70d
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/no_big_logo
@@ -0,0 +1 @@
+NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/metallic/rrdcolors.inc.php b/src/usr/local/www/themes/metallic/rrdcolors.inc.php
new file mode 100644
index 0000000..dcb7a39
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/rrdcolors.inc.php
@@ -0,0 +1,89 @@
+<?php
+/* $Id$ */
+/*
+ rrdcolors.inc.php
+ Part of pfSense
+ Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* This file is included by the RRD graphing page and sets the colors */
+
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF','00E344','FF0000','000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333','a83c3c','999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+?>
diff --git a/src/usr/local/www/themes/metallic/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/metallic/styles/jquery-ui-1.11.1.css
new file mode 100644
index 0000000..8a8c54f
--- /dev/null
+++ b/src/usr/local/www/themes/metallic/styles/jquery-ui-1.11.1.css
@@ -0,0 +1,1226 @@
+/*! jQuery UI - v1.11.1 - 2014-09-22
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 1em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+ background-color: #990000;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #bbbbbb;
+ /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
+ color: #444444;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #444444;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #3383bb;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #3383bb;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #bbbbbb;
+ background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #599fcf;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #599fcf;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #999999;
+ background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #ffffff;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
+ color: #444444;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #444444;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #c0402a;
+ background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
+ opacity: .8;
+ filter: Alpha(Opacity=80); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -4px 0 0 -4px;
+ padding: 4px;
+ background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .6;
+ filter: Alpha(Opacity=60); /* support: IE8 */
+ border-radius: 0pxdow;
+}
diff --git a/src/usr/local/www/themes/nervecenter/all.css b/src/usr/local/www/themes/nervecenter/all.css
new file mode 100644
index 0000000..ba0a5e4
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/all.css
@@ -0,0 +1,1301 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+.infobox {
+ width:100%;
+}
+
+.addgatewaybox {
+ background-color: #990000;
+ border-style: none none none none;
+ width: 225px;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 220px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 11px;
+ font-family: "Trebuchet MS", sans-serif;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background: url('images/background.gif') no-repeat;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* style of disabled formelements */
+#wrap div {margin:1em 0}
+[disabled] {
+ color:#666666;
+ background:#eeeeee;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+ text-align: center;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ position: relative;
+ top: -25px;
+ left: 3px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ width: 80px;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 5px;
+ margin-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listrborder {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-left: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ color: #FFFFFF;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #DDDDDD;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+/* style of disabled formelements */
+[disabled] {
+ color:#666666;
+ background:#eeeeee;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 6px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password, #password2 {
+ font-size: small;
+ width: 60%;
+ padding-left: 19px;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+/* Widget CSS */
+.widgetsubheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #B1B1B1;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #000000;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetdiv{
+ margin:5px;
+ padding: 5px;
+ background:#CCCCCC;
+}
+.widgetconfigdiv{
+ background:#BBBBBB;
+ font-size: 11px;
+ color: #000000;
+ padding-right: 5px;
+ padding-left: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div#log div.log-entry-mini {
+ clear: both;
+}
+
+div#log div.log-entry-mini span {
+ padding: 2px 2px 2px 2px;
+ padding-left: 6px;
+}
+
+div#log span.log-action-mini-header,
+div#log span.log-time-mini-header,
+div#log span.log-interface-mini-header,
+div#log span.log-source-mini-header,
+div#log span.log-destination-mini-header,
+div#log span.log-protocol-mini-header {
+ float: left;
+ text-align: left;
+ background-color: #B1B1B1;
+ font-size: 12px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-time-mini,
+div#log span.log-interface-mini,
+div#log span.log-source-mini,
+div#log span.log-destination-mini,
+div#log span.log-protocol-mini {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 11px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-action-mini-header {
+ width: 6%;
+}
+
+div#log span.log-time-mini,
+div#log span.log-time-mini-header {
+ width: 19%;
+}
+
+div#log span.log-interface-mini,
+div#log span.log-interface-mini-header {
+ width: 8%;
+}
+
+div#log span.log-source-mini,
+div#log span.log-source-mini-header {
+ width: 23%;
+}
+
+div#log span.log-destination-mini,
+div#log span.log-destination-mini-header {
+ width: 31%;
+}
+
+div#log span.log-protocol-mini,
+div#log span.log-protocol-mini-header {
+ width: 8%;
+ border-right: 1px solid #999;
+}
+
+/* Sortable tables */
+table.sortable thead {
+ cursor: default;
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+
+/*thermal_sensors widget styles*/
+
+.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
+.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
+.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
+ background-color: LimeGreen;
+ border-top-width: 2px; border-top-color: Lime;
+ border-left-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 2px; border-bottom-color: Green;
+}
+.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
+.thermalSensorText { float: left; height: 20px; top: 3px; }
+.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
+
+.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+
+.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
+
+.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
+
+/* widget textarea styles - full width */
+.textarea_widget {
+ width: 100%;
+ resize:vertical;
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* IE 8+ */
+}
diff --git a/src/usr/local/www/themes/nervecenter/apple-touch-icon.png b/src/usr/local/www/themes/nervecenter/apple-touch-icon.png
new file mode 100755
index 0000000..7a4b975
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/apple-touch-icon.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/bottom-loader.js b/src/usr/local/www/themes/nervecenter/bottom-loader.js
new file mode 100644
index 0000000..a21f775
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/bottom-loader.js
@@ -0,0 +1,10 @@
+//<![CDATA[
+
+ NiftyCheck();
+ Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
+ Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
+ Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
+ Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
+ Rounded("div#topbox","all","#FFF","#990000","smooth");
+
+//]]>
diff --git a/src/usr/local/www/themes/nervecenter/favicon.ico b/src/usr/local/www/themes/nervecenter/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/graphlink.css b/src/usr/local/www/themes/nervecenter/graphlink.css
new file mode 100644
index 0000000..13f65f0
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/graphlink.css
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ $Id$
+
+ This file is part of the GraphLink software.
+ GraphLink is distributed under the MIT License.
+ Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
+*******************************************************************************/
+
+/**
+ * Defines the background image used for the graph, as well as the actual data
+ * locations.
+ * Use padding-left and padding-top to align the data area correctly with your
+ * background image.
+ * Width and height should same as the dimensions of the image, minus the
+ * padding values in both directions.
+ */
+div.GraphLink {
+ width: 212px;
+ height: 60px;
+ padding-left: 38px;
+ padding-top: 10px;
+ background-image: url(/themes/nervecenter/images/misc/graph.png);
+ overflow: hidden;
+}
+
+/**
+ * Defines the data display area. Modify to fit your background image.
+ */
+div.GraphLinkData {
+ width: 200px;
+ height: 50px;
+ overflow: hidden;
+}
+
+/**
+ * Defines the look of one bar. Nothing to change here other than the color.
+ */
+span.GraphLinkBar {
+ background-color: #990000;
+ height: 100%;
+ float: left;
+ overflow: hidden;
+}
diff --git a/src/usr/local/www/themes/nervecenter/images/alert_bgr.png b/src/usr/local/www/themes/nervecenter/images/alert_bgr.png
new file mode 100755
index 0000000..39901be
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/alert_bgr.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/background.gif b/src/usr/local/www/themes/nervecenter/images/background.gif
new file mode 100755
index 0000000..bdfa5b3
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/background.png b/src/usr/local/www/themes/nervecenter/images/background.png
new file mode 100755
index 0000000..e68893d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/background.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/footer.png b/src/usr/local/www/themes/nervecenter/images/footer.png
new file mode 100755
index 0000000..90b1022
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/footer.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/header.png b/src/usr/local/www/themes/nervecenter/images/header.png
new file mode 100755
index 0000000..3b38584
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/header.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/help.png b/src/usr/local/www/themes/nervecenter/images/help.png
new file mode 100755
index 0000000..1de05e3
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/help.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/horizontal.gif b/src/usr/local/www/themes/nervecenter/images/horizontal.gif
new file mode 100755
index 0000000..a280dcb
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/horizontal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/favicon.ico b/src/usr/local/www/themes/nervecenter/images/icons/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_3g.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_3g.gif
new file mode 100755
index 0000000..46ccb92
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_3g.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_3g_inactive.gif
new file mode 100755
index 0000000..cf983e4
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_3g_inactive.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced.gif
new file mode 100755
index 0000000..3ede1ff
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced_s.gif
new file mode 100755
index 0000000..b233549
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_advanced_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alert.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alert.gif
new file mode 100755
index 0000000..7646941
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_host.gif
new file mode 100755
index 0000000..ad43e17
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_host.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_net.gif
new file mode 100755
index 0000000..abd1b8b
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_net.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_port.gif
new file mode 100755
index 0000000..4acf2aa
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_port.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url.gif
new file mode 100755
index 0000000..660571e
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url_reload.gif
new file mode 100755
index 0000000..55c1c4a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_alias_url_reload.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_block.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_block.gif
new file mode 100755
index 0000000..670c968
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_block.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_block_add.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_block_add.gif
new file mode 100755
index 0000000..eb726d6
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_block_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_block_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_block_d.gif
new file mode 100755
index 0000000..e6345fe
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_block_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_cablenic.gif
new file mode 100755
index 0000000..a071c66
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_cablenic.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_cal.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_cal.gif
new file mode 100755
index 0000000..a9c7c87
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_cal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_cal_mo.gif
new file mode 100755
index 0000000..1647e2f
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_cal_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_carp.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_carp.gif
new file mode 100755
index 0000000..9454a82
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_carp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_carp_d.gif
new file mode 100755
index 0000000..2ba8db2
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_carp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_chain.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_chain.png
new file mode 100644
index 0000000..12db07a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_chain.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_check.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_check.gif
new file mode 100755
index 0000000..393674d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_check.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_green.gif
new file mode 100755
index 0000000..e171ba8
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_green.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_grey.gif
new file mode 100755
index 0000000..00c865a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_grey.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_red.gif
new file mode 100755
index 0000000..7b412ee
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_clock_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_close.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_close.gif
new file mode 100755
index 0000000..e0f86a7
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_close.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_configure.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_configure.gif
new file mode 100755
index 0000000..7182e0d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_configure.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_down.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_down.gif
new file mode 100755
index 0000000..b71a9c5
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_down_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_down_d.gif
new file mode 100755
index 0000000..70a7473
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_down_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_down_mo.gif
new file mode 100755
index 0000000..584587a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_down_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_e.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_e.gif
new file mode 100755
index 0000000..2950800
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_e.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_e_mo.gif
new file mode 100755
index 0000000..9ba5738
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_e_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_error.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_error.gif
new file mode 100755
index 0000000..e0fa659
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_error.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_exclam.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_exclam.gif
new file mode 100755
index 0000000..36c2ec7
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_exclam.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_de.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_de.png
new file mode 100755
index 0000000..069cbbe
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_de.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_en.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_en.png
new file mode 100755
index 0000000..bd7f9a5
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_en.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_es.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_es.png
new file mode 100755
index 0000000..434776c
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_es.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_pt_BR.png
new file mode 100755
index 0000000..f786349
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_flag_pt_BR.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_cert.png
new file mode 100755
index 0000000..48a34b6
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_cert.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_file.png
new file mode 100755
index 0000000..48a9ed2
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_file.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_group.png
new file mode 100755
index 0000000..7d929c0
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_group.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_host.png
new file mode 100755
index 0000000..867ef2c
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_host.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_imp.png
new file mode 100755
index 0000000..f667cfc
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_imp.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_mail.png
new file mode 100755
index 0000000..d2d4548
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_mail.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_pwd.png
new file mode 100755
index 0000000..06b53a1
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_pwd.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_search.png
new file mode 100755
index 0000000..33de926
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_search.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_time.png
new file mode 100755
index 0000000..aa8300a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_time.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_unknown.png
new file mode 100755
index 0000000..1857d0e
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_unknown.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_url.png
new file mode 100755
index 0000000..cf56792
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_url.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_user.png
new file mode 100755
index 0000000..e00eebe
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_frmfld_user.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_fw-update.gif
new file mode 100755
index 0000000..52c18ac
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_fw-update.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_help.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_help.gif
new file mode 100644
index 0000000..84c84db
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_help.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias.gif
new file mode 100755
index 0000000..0c569a7
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias_d.gif
new file mode 100755
index 0000000..faa84d4
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_ifalias_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_import_alias.gif
new file mode 100755
index 0000000..d11a5f0
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_import_alias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_in.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_in_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_info_pkg.gif
new file mode 100755
index 0000000..cd3a532
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_info_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_down.gif
new file mode 100755
index 0000000..0626655
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_up.gif
new file mode 100755
index 0000000..1449513
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_interface_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_left.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_left.gif
new file mode 100755
index 0000000..8effefe
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_left_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_left_d.gif
new file mode 100755
index 0000000..c778014
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_left_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_left_mo.gif
new file mode 100755
index 0000000..84c6fa2
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_left_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_log.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_log.gif
new file mode 100755
index 0000000..4a1983a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_log.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_log_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_log_d.gif
new file mode 100755
index 0000000..d31bd9b
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_log_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s.gif
new file mode 100755
index 0000000..f9fda33
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s_d.gif
new file mode 100755
index 0000000..fb2c05f
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_log_s_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_logs.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_logs.gif
new file mode 100644
index 0000000..afe0104
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_logs.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_match.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_match.gif
new file mode 100644
index 0000000..215571f
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_match.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_match_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_match_d.gif
new file mode 100644
index 0000000..6e4c364
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_match_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_minus.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_minus.gif
new file mode 100755
index 0000000..417544f
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_minus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_open.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_open.gif
new file mode 100755
index 0000000..ac3da14
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_open.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_other.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_other.gif
new file mode 100755
index 0000000..e6f780f
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_other.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_other_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_other_d.gif
new file mode 100755
index 0000000..b08d970
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_other_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_out.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_out_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_parp.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_parp.gif
new file mode 100755
index 0000000..96acaf3
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_parp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_parp_d.gif
new file mode 100755
index 0000000..7d7d00e
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_parp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_pass.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_pass.gif
new file mode 100755
index 0000000..fe1bb0d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_pass.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_add.gif
new file mode 100755
index 0000000..f7f4c20
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_d.gif
new file mode 100755
index 0000000..6adc431
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_pass_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus.gif
new file mode 100755
index 0000000..2a94eeb
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl.gif
new file mode 100755
index 0000000..8dcd7c0
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl_p.gif
new file mode 100755
index 0000000..0c79849
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_bl_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_d.gif
new file mode 100755
index 0000000..ebc7457
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_mo.gif
new file mode 100755
index 0000000..1c7ca08
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_p.gif
new file mode 100755
index 0000000..eb41284
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_plus_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall.gif
new file mode 100755
index 0000000..d78b867
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_d.gif
new file mode 100755
index 0000000..13658f7
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_mo.gif
new file mode 100755
index 0000000..90b576e
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg.gif
new file mode 100755
index 0000000..9aebb03
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_d.gif
new file mode 100755
index 0000000..4ab4992
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_mo.gif
new file mode 100755
index 0000000..7025d20
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_pkg_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml.gif
new file mode 100755
index 0000000..4542432
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_d.gif
new file mode 100755
index 0000000..8d3a68d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_mo.gif
new file mode 100755
index 0000000..15e0aed
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reinstall_xml_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reject.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reject.gif
new file mode 100755
index 0000000..5565cd6
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reject.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_reject_d.gif
new file mode 100755
index 0000000..6c09fae
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_reject_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_right.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_right.gif
new file mode 100755
index 0000000..fdf2d8b
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart.gif
new file mode 100755
index 0000000..e49fbd7
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart_d.gif
new file mode 100755
index 0000000..a5d6d7c
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_restart_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_running.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_running.gif
new file mode 100644
index 0000000..543fd56
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_running.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start.gif
new file mode 100755
index 0000000..09bb58f
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start_d.gif
new file mode 100755
index 0000000..f58f111
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_start_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_status.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_status.gif
new file mode 100644
index 0000000..a93bcfb
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_status.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop.gif
new file mode 100755
index 0000000..922addc
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop_d.gif
new file mode 100755
index 0000000..b4cfdea
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stop_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stopped.gif
new file mode 100644
index 0000000..f93a25d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_service_stopped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_services_restart_mo.gif
new file mode 100755
index 0000000..a092b40
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_services_restart_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_services_start_mo.gif
new file mode 100755
index 0000000..ecdb58f
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_services_start_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_services_stop_mo.gif
new file mode 100755
index 0000000..c00e208
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_services_stop_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group-grey.png
new file mode 100755
index 0000000..d7b964d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group.png
new file mode 100755
index 0000000..1c974f2
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-group.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user-grey.png
new file mode 100755
index 0000000..2f6047d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user.png
new file mode 100755
index 0000000..ef82156
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_system-user.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system_lock_screen.png
new file mode 100755
index 0000000..30f306d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_system_lock_screen.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_system_logout.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_system_logout.png
new file mode 100755
index 0000000..9bbb6c7
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_system_logout.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped.gif
new file mode 100755
index 0000000..ffeb2cd
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped_p.gif
new file mode 100755
index 0000000..6d46aaf
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_trapped_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule.gif
new file mode 100755
index 0000000..e15ab6c
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule_d.gif
new file mode 100755
index 0000000..f776281
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_ts_rule_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_up.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_up.gif
new file mode 100755
index 0000000..883c5a2
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_up_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_up_d.gif
new file mode 100755
index 0000000..0ddcce2
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_up_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_up_mo.gif
new file mode 100755
index 0000000..9f869a4
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_up_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan.gif
new file mode 100755
index 0000000..1f0addc
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan_d.gif
new file mode 100755
index 0000000..35bf580
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_wlan_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_wol_all.gif
new file mode 100755
index 0000000..2d22182
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_wol_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_nsaved.png
new file mode 100755
index 0000000..21cb27d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_nsaved.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_saved.png
new file mode 100755
index 0000000..ab82946
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_wzd_saved.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_x.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_x.gif
new file mode 100755
index 0000000..24e4d49
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_x_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_x_d.gif
new file mode 100755
index 0000000..d2bfbc8
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_x_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_x_mo.gif
new file mode 100755
index 0000000..da7b57c
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_x_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/icon_x_p.gif b/src/usr/local/www/themes/nervecenter/images/icons/icon_x_p.gif
new file mode 100755
index 0000000..8828fa6
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/icon_x_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/in.gif b/src/usr/local/www/themes/nervecenter/images/icons/in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/in_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/out.gif b/src/usr/local/www/themes/nervecenter/images/icons/out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/icons/out_d.gif b/src/usr/local/www/themes/nervecenter/images/icons/out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/icons/out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/log.png b/src/usr/local/www/themes/nervecenter/images/log.png
new file mode 100755
index 0000000..762ba80
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/log.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/logo.gif b/src/usr/local/www/themes/nervecenter/images/logo.gif
new file mode 100755
index 0000000..a71ce5a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/logo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/logobig.jpg b/src/usr/local/www/themes/nervecenter/images/logobig.jpg
new file mode 100755
index 0000000..2ef196d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/logobig.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/menu_down.gif b/src/usr/local/www/themes/nervecenter/images/menu_down.gif
new file mode 100755
index 0000000..137de8d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/menu_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/menu_footer.gif b/src/usr/local/www/themes/nervecenter/images/menu_footer.gif
new file mode 100755
index 0000000..d06faa4
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/menu_footer.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/menu_right.gif b/src/usr/local/www/themes/nervecenter/images/menu_right.gif
new file mode 100755
index 0000000..881327c
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/menu_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/metal_bgr.gif b/src/usr/local/www/themes/nervecenter/images/metal_bgr.gif
new file mode 100755
index 0000000..a0ca6c8
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/metal_bgr.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/metal_bgr_red.gif b/src/usr/local/www/themes/nervecenter/images/metal_bgr_red.gif
new file mode 100755
index 0000000..c4a1465
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/metal_bgr_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bar_blue.gif b/src/usr/local/www/themes/nervecenter/images/misc/bar_blue.gif
new file mode 100755
index 0000000..741186a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/bar_blue.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bar_gray.gif b/src/usr/local/www/themes/nervecenter/images/misc/bar_gray.gif
new file mode 100755
index 0000000..e86e245
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/bar_gray.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bar_left.gif b/src/usr/local/www/themes/nervecenter/images/misc/bar_left.gif
new file mode 100755
index 0000000..af751fa
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/bar_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bar_right.gif b/src/usr/local/www/themes/nervecenter/images/misc/bar_right.gif
new file mode 100755
index 0000000..ff12d9e
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/bar_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_minus.png
new file mode 100755
index 0000000..37db2fd
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_minus.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_plus.png
new file mode 100755
index 0000000..fba7af9
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/bullet_toggle_plus.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/button.gif b/src/usr/local/www/themes/nervecenter/images/misc/button.gif
new file mode 100755
index 0000000..e85dbb3
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/button.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/graph.png b/src/usr/local/www/themes/nervecenter/images/misc/graph.png
new file mode 100755
index 0000000..507ec75
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/graph.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/key_128.gif b/src/usr/local/www/themes/nervecenter/images/misc/key_128.gif
new file mode 100755
index 0000000..ea5ae34
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/key_128.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/key_152.gif b/src/usr/local/www/themes/nervecenter/images/misc/key_152.gif
new file mode 100755
index 0000000..6c7fc03
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/key_152.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/key_256.gif b/src/usr/local/www/themes/nervecenter/images/misc/key_256.gif
new file mode 100755
index 0000000..3e1c377
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/key_256.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/key_64.gif b/src/usr/local/www/themes/nervecenter/images/misc/key_64.gif
new file mode 100755
index 0000000..87892bd
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/key_64.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/left_background.gif b/src/usr/local/www/themes/nervecenter/images/misc/left_background.gif
new file mode 100755
index 0000000..529d827
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/left_background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/loader.gif b/src/usr/local/www/themes/nervecenter/images/misc/loader.gif
new file mode 100755
index 0000000..5d10ac3
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/loader_all.gif b/src/usr/local/www/themes/nervecenter/images/misc/loader_all.gif
new file mode 100755
index 0000000..cb6bc0c
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/loader_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/loader_filter.gif b/src/usr/local/www/themes/nervecenter/images/misc/loader_filter.gif
new file mode 100755
index 0000000..b838b17
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/loader_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/loader_tab.gif b/src/usr/local/www/themes/nervecenter/images/misc/loader_tab.gif
new file mode 100755
index 0000000..05bb04c
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/loader_tab.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/logon.png b/src/usr/local/www/themes/nervecenter/images/misc/logon.png
new file mode 100755
index 0000000..ec644ed
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/logon.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/progress_bar.gif b/src/usr/local/www/themes/nervecenter/images/misc/progress_bar.gif
new file mode 100755
index 0000000..3b4aa52
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/progress_bar.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/rrd_error.png b/src/usr/local/www/themes/nervecenter/images/misc/rrd_error.png
new file mode 100755
index 0000000..a79ecf3
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/rrd_error.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_alerter.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_alerter.gif
new file mode 100755
index 0000000..7ff1e95
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/status_alerter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_carpmaster.gif
new file mode 100755
index 0000000..2c32908
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/status_carpmaster.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_left.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_left.gif
new file mode 100755
index 0000000..b5a2930
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/status_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_page_loading.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_page_loading.gif
new file mode 100755
index 0000000..067ef18
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/status_page_loading.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_reload_all.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_reload_all.gif
new file mode 100755
index 0000000..72de6bd
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/status_reload_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_reload_filter.gif
new file mode 100755
index 0000000..d72761a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/status_reload_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/status_right.gif b/src/usr/local/www/themes/nervecenter/images/misc/status_right.gif
new file mode 100755
index 0000000..bf66fdb
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/status_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/tri_c.gif b/src/usr/local/www/themes/nervecenter/images/misc/tri_c.gif
new file mode 100755
index 0000000..317b758
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/tri_c.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/tri_c_black.gif b/src/usr/local/www/themes/nervecenter/images/misc/tri_c_black.gif
new file mode 100755
index 0000000..309846e
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/tri_c_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/tri_o.gif b/src/usr/local/www/themes/nervecenter/images/misc/tri_o.gif
new file mode 100755
index 0000000..eb95c32
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/tri_o.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/tri_o_black.gif b/src/usr/local/www/themes/nervecenter/images/misc/tri_o_black.gif
new file mode 100755
index 0000000..f818f3b
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/tri_o_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/misc/widget_loader.gif b/src/usr/local/www/themes/nervecenter/images/misc/widget_loader.gif
new file mode 100755
index 0000000..ca35e2a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/misc/widget_loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/new_tab_menu.png b/src/usr/local/www/themes/nervecenter/images/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/status.png b/src/usr/local/www/themes/nervecenter/images/status.png
new file mode 100755
index 0000000..a3e368e
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/status.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/transparent.gif b/src/usr/local/www/themes/nervecenter/images/transparent.gif
new file mode 100755
index 0000000..89c5530
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/transparent.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/images/transparent_pixel.gif b/src/usr/local/www/themes/nervecenter/images/transparent_pixel.gif
new file mode 100755
index 0000000..35d42e8
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/images/transparent_pixel.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/blank.gif b/src/usr/local/www/themes/nervecenter/javascript/ie7/blank.gif
new file mode 100755
index 0000000..a4fe2e6
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/blank.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-box-model.js
new file mode 100644
index 0000000..45543f6
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-box-model.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-core.js
new file mode 100644
index 0000000..b11e2b1
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-core.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css-strict.js
new file mode 100644
index 0000000..4406d7a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css-strict.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css2.js
new file mode 100644
index 0000000..7121c8e
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css2.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css3.js
new file mode 100644
index 0000000..86b24f5
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-css3.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-fixed.js
new file mode 100644
index 0000000..4321cda
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-fixed.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-html4.js
new file mode 100644
index 0000000..4d2baa9
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-html4.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-ie5.js
new file mode 100644
index 0000000..707fa56
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-ie5.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite-p.js
new file mode 100644
index 0000000..3a66d19
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite.js
new file mode 100644
index 0000000..88c764f
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-lite.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-png.js
new file mode 100644
index 0000000..7b8f2cf
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-png.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-server.css
new file mode 100644
index 0000000..47c7edd
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-server.css
@@ -0,0 +1,43 @@
+body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
+body {margin: 8px; background: #333;}
+h1 {margin: 0;}
+h1 a:hover {background-color: transparent;}
+h2 {font-size: 1.75em;}
+h3 {font-size: 1.1em;}
+a:active {color: #ff0000;}
+a:link {color: #0a6cce;}
+a:visited {color: #0a6cce;}
+code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
+ padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
+code.box {display: block; padding: 10px; margin: 0.5em 0;}
+ul {list-style-type: square;}
+dd {margin: .2em 0 .5em 1em;}
+dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
+dl.library dd {font-style: italic; margin-left: 3em;}
+dt {font-weight: bold;}
+dt.pack {color: brown;}
+a img {border-style: none;}
+hr {height: 1px; color: #000; border-style: solid;}
+hr.short {height: 2px; width: 100px;}
+div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
+hr {border-bottom-width: 0px;}
+div.header hr {color: #0a6cce; background-color: #0a6cce;}
+div.content {min-height: 100px;}
+div.footer hr {color: #898e79; background-color: #898e79; }
+div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
+a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
+div.footer a:hover {background-color: transparent; text-decoration: none;}
+div.header .menu {text-align: right;}
+div.footer {font-size: x-small; margin-top: 8px;}
+div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
+#license {margin-top: 5px; font-size: xx-small;}
+table {border-top: 1px solid #000; border-left: 1px solid #000;}
+th {background-color: #fff; text-align: left;}
+th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
+th.small {width: 100px;}
+th.medium {width: 200px;}
+th.large {width: 270px;}
+th.x-large {width: 408px;}
+table.fixed {table-layout: fixed;}
+span.comment {color: #666;}
+
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard-p.js
new file mode 100644
index 0000000..73e99ac
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard.js
new file mode 100644
index 0000000..2109905
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/ie7-standard.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/nervecenter/javascript/ie7/test-trans.png b/src/usr/local/www/themes/nervecenter/javascript/ie7/test-trans.png
new file mode 100755
index 0000000..e187e2c
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/ie7/test-trans.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/grey-40.png b/src/usr/local/www/themes/nervecenter/javascript/img/grey-40.png
new file mode 100755
index 0000000..758b716
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/img/grey-40.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/submenu-off.gif b/src/usr/local/www/themes/nervecenter/javascript/img/submenu-off.gif
new file mode 100755
index 0000000..ddcdcae
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/img/submenu-off.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/submenu-on.gif b/src/usr/local/www/themes/nervecenter/javascript/img/submenu-on.gif
new file mode 100755
index 0000000..7a58077
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/img/submenu-on.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/white-90.png b/src/usr/local/www/themes/nervecenter/javascript/img/white-90.png
new file mode 100755
index 0000000..efc84b4
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/img/white-90.png
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/img/x.gif b/src/usr/local/www/themes/nervecenter/javascript/img/x.gif
new file mode 100755
index 0000000..5bfd67a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/img/x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/nervecenter/javascript/niftyjsCode.js b/src/usr/local/www/themes/nervecenter/javascript/niftyjsCode.js
new file mode 100644
index 0000000..e71ea14
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/javascript/transmenu-body.php b/src/usr/local/www/themes/nervecenter/javascript/transmenu-body.php
new file mode 100644
index 0000000..eea9235
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/transmenu-body.php
@@ -0,0 +1,51 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ transmenu-body.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetBodyJS() {
+ global $rootmenu;
+
+ if (isset($rootmenu)) {
+ return $rootmenu->getMenuJScript();
+ } else if (empty($rootmenu)) {
+ return "alert('No rootmenu object found.');";
+ } else {
+ return "alert('No JavaScript attached to rootmenu object.');";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/nervecenter/javascript/transmenu-head.php b/src/usr/local/www/themes/nervecenter/javascript/transmenu-head.php
new file mode 100644
index 0000000..66e1952
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/transmenu-head.php
@@ -0,0 +1,85 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ transmenu-head.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetHeadJS() {
+ global $g, $rootmenu;
+
+ $transmenu_stub =<<<EOD
+ function tmenuinit() {
+ //==========================================================================================
+ // if supported, initialize TransMenus
+ //==========================================================================================
+ // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
+ // This is better than server-side checking because it will also catch browsers which would
+ // normally support the menus but have javascript disabled.
+ //
+ // If supported, call initialize() and then hook whatever image rollover code you need to do
+ // to the .onactivate and .ondeactivate events for each menu.
+ //==========================================================================================
+ if (TransMenu.isSupported()) {
+ TransMenu.initialize();
+
+ // hook all the highlight swapping of the main toolbar to menu activation/deactivation
+ // instead of simple rollover to get the effect where the button stays hightlit until
+ // the menu is closed.
+ @@CHILD_JSCRIPT@@
+ }
+ } // end function
+EOD;
+
+ if (empty($rootmenu)) {
+ require_once("menudef.inc");
+ }
+
+ $childJScript = "";
+ foreach ($rootmenu->getChildren() as $component) {
+ $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
+
+ $childJScript .=<<<EOD
+ {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
+ {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
+
+EOD;
+ }
+
+ $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
+
+ return $transmenu_stub;
+}
+
+?>
diff --git a/src/usr/local/www/themes/nervecenter/javascript/transmenu.org b/src/usr/local/www/themes/nervecenter/javascript/transmenu.org
new file mode 100644
index 0000000..6c9e353
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/transmenu.org
@@ -0,0 +1,785 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ *
+ * Customizable multi-level animated DHTML menus with transparency.
+ *
+ * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * =================================================================================================
+ * updates:
+ * 04.19.04 fixed cascade problem with menus nested greater than two levels.
+ * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
+ * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
+ * also made gecko check a little more strict by specifying build no.
+ * ============================================================================================== */
+
+
+
+//==================================================================================================
+// Configuration properties
+//==================================================================================================
+TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
+TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
+TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
+TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
+TransMenu.menuPadding = 5; // padding between menu border and items grid
+TransMenu.itemPadding = 3; // additional padding around each item
+TransMenu.shadowSize = 2; // size of shadow under menu
+TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
+TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
+TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
+TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
+TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
+TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
+TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
+
+
+//==================================================================================================
+// Internal use properties
+//==================================================================================================
+TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
+TransMenu.direction = {down:1,right:2};
+TransMenu.registry = [];
+TransMenu._maxZ = 100;
+
+
+
+//==================================================================================================
+// Static methods
+//==================================================================================================
+// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
+TransMenu.isSupported = function() {
+ var ua = navigator.userAgent.toLowerCase();
+ var pf = navigator.platform.toLowerCase();
+ var an = navigator.appName;
+ var r = false;
+
+ if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
+ else if (an == "Microsoft Internet Explorer") {
+ if (document.getElementById) { // ie5.1+ mac,win
+ if (pf.indexOf("mac") == 0) {
+ r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
+ }
+ else r = true;
+ }
+ }
+
+ return r;
+}
+
+// call this in onload once menus have been created
+TransMenu.initialize = function() {
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ menu.initialize();
+ }
+}
+
+// call this in document body to write out menu html
+TransMenu.renderAll = function() {
+ var aMenuHtml = [];
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ aMenuHtml[i] = menu.toString();
+ }
+ document.write(aMenuHtml.join(""));
+}
+
+//==================================================================================================
+// TransMenu constructor (only called internally)
+//==================================================================================================
+// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
+// reference to an HTML element, or a TransMenuItem from an existing menu.
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menu from actuator
+// iTop : Top pixel offset of menu from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+// parentMenuSet : Menuset this menu will be added to.
+//==================================================================================================
+function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
+ // public methods
+ this.addItem = addItem;
+ this.addMenu = addMenu;
+ this.toString = toString;
+ this.initialize = initialize;
+ this.isOpen = false;
+ this.show = show;
+ this.hide = hide;
+ this.items = [];
+
+ // events
+ this.onactivate = new Function(); // when the menu starts to slide open
+ this.ondeactivate = new Function(); // when the menu finishes sliding closed
+ this.onmouseover = new Function(); // when the menu has been moused over
+ this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
+ this.ondequeue = new Function();
+
+ // initialization
+ this.index = TransMenu.registry.length;
+ TransMenu.registry[this.index] = this;
+
+ var id = "TransMenu" + this.index;
+ var contentHeight = null;
+ var contentWidth = null;
+ var childMenuSet = null;
+ var animating = false;
+ var childMenus = [];
+ var slideAccel = -1;
+ var elmCache = null;
+ var ready = false;
+ var _this = this;
+ var a = null;
+
+ var pos = iDirection == TransMenu.direction.down ? "top" : "left";
+ var dim = null;
+
+ // private and public method implimentations
+ function addItem(sText, sUrl) {
+ var item = new TransMenuItem(sText, sUrl, this);
+ item._index = this.items.length;
+ this.items[item._index] = item;
+ }
+
+ function addMenu(oMenuItem) {
+ if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
+
+ if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
+
+ var m = childMenuSet.addMenu(oMenuItem);
+
+ childMenus[oMenuItem._index] = m;
+ m.onmouseover = child_mouseover;
+ m.ondeactivate = child_deactivate;
+ m.onqueue = child_queue;
+ m.ondequeue = child_dequeue;
+
+ return m;
+ }
+
+ function initialize() {
+ initCache();
+ initEvents();
+ initSize();
+ ready = true;
+ }
+
+ function show() {
+ //dbg_dump("show");
+ if (ready) {
+ _this.isOpen = true;
+ animating = true;
+ setContainerPos();
+ elmCache["clip"].style.visibility = "visible";
+ elmCache["clip"].style.zIndex = TransMenu._maxZ++;
+ //dbg_dump("maxZ: " + TransMenu._maxZ);
+ slideStart();
+ _this.onactivate();
+ }
+ }
+
+ function hide() {
+ if (ready) {
+ _this.isOpen = false;
+ animating = true;
+
+ for (var i = 0, item = null; item = elmCache.item[i]; i++)
+ dehighlight(item);
+
+ if (childMenuSet) childMenuSet.hide();
+
+ slideStart();
+ _this.ondeactivate();
+ }
+ }
+
+ function setContainerPos() {
+ var sub = oActuator.constructor == TransMenuItem;
+ var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
+ var el = act;
+
+ var x = 0;
+ var y = 0;
+
+
+ var minX = 0;
+ var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
+ var minY = 0;
+ var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
+
+ // add up all offsets... subtract any scroll offset
+ while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
+ x += el.offsetLeft;
+ y += el.offsetTop;
+
+ if (el.scrollLeft) x -= el.scrollLeft;
+ if (el.scrollTop) y -= el.scrollTop;
+
+ el = el.offsetParent;
+ }
+
+ if (oActuator.constructor == TransMenuItem) {
+ x += parseInt(el.parentNode.style.left);
+ y += parseInt(el.parentNode.style.top);
+ }
+
+ switch (iReferencePoint) {
+ case TransMenu.reference.topLeft:
+ break;
+ case TransMenu.reference.topRight:
+ x += act.offsetWidth;
+ break;
+ case TransMenu.reference.bottomLeft:
+ y += act.offsetHeight;
+ break;
+ case TransMenu.reference.bottomRight:
+ x += act.offsetWidth;
+ y += act.offsetHeight;
+ break;
+ }
+
+ x += iLeft;
+ y += iTop;
+
+ x = Math.max(Math.min(x, maxX), minX);
+ y = Math.max(Math.min(y, maxY), minY);
+
+ elmCache["clip"].style.left = x + "px";
+ elmCache["clip"].style.top = y + "px";
+ }
+
+ function slideStart() {
+ var x0 = parseInt(elmCache["content"].style[pos]);
+ var x1 = _this.isOpen ? 0 : -dim;
+
+ if (a != null) a.stop();
+ a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
+
+ a.onframe = slideFrame;
+ a.onend = slideEnd;
+
+ a.start();
+ }
+
+ function slideFrame(x) {
+ elmCache["content"].style[pos] = x + "px";
+ }
+
+ function slideEnd() {
+ if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
+ animating = false;
+ }
+
+ function initSize() {
+ // everything is based off the size of the items table...
+ var ow = elmCache["items"].offsetWidth;
+ var oh = elmCache["items"].offsetHeight;
+ var ua = navigator.userAgent.toLowerCase();
+
+ // clipping container should be ow/oh + the size of the shadow
+ elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
+ elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
+
+ // same with content...
+ elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
+ elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
+
+ contentHeight = oh + TransMenu.shadowSize;
+ contentWidth = ow + TransMenu.shadowSize;
+
+ dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
+
+ // set initially closed
+ elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
+ elmCache["clip"].style.visibility = "hidden";
+
+ // if *not* mac/ie 5
+ if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
+ // set background div to offset size
+ elmCache["background"].style.width = ow + "px";
+ elmCache["background"].style.height = oh + "px";
+ elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
+ elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
+ elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
+ }
+ // mac ie is a little different because we use a PNG for the transparency
+ else {
+ // set background div to offset size
+ elmCache["background"].firstChild.src = TransMenu.backgroundPng;
+ elmCache["background"].firstChild.width = ow;
+ elmCache["background"].firstChild.height = oh;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
+ elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
+ elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
+ }
+ }
+
+ function initCache() {
+ var menu = document.getElementById(id);
+ var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
+
+ elmCache = {};
+ elmCache["clip"] = menu;
+ elmCache["item"] = [];
+
+ for (var i = 0, elm = null; elm = all[i]; i++) {
+ switch (elm.className) {
+ case "items":
+ case "content":
+ case "background":
+ case "shadowRight":
+ case "shadowBottom":
+ elmCache[elm.className] = elm;
+ break;
+ case "item":
+ elm._index = elmCache["item"].length;
+ elmCache["item"][elm._index] = elm;
+ break;
+ }
+ }
+
+ // hack!
+ _this.elmCache = elmCache;
+ }
+
+ function initEvents() {
+ // hook item mouseover
+ for (var i = 0, item = null; item = elmCache.item[i]; i++) {
+ item.onmouseover = item_mouseover;
+ item.onmouseout = item_mouseout;
+ item.onclick = item_click;
+ }
+
+ // hook actuation
+ if (typeof oActuator.tagName != "undefined") {
+ oActuator.onmouseover = actuator_mouseover;
+ oActuator.onmouseout = actuator_mouseout;
+ }
+
+ // hook menu mouseover
+ elmCache["content"].onmouseover = content_mouseover;
+ elmCache["content"].onmouseout = content_mouseout;
+ }
+
+ function highlight(oRow) {
+ oRow.className = "item hover";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
+ }
+
+ function dehighlight(oRow) {
+ oRow.className = "item";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
+ }
+
+ function item_mouseover() {
+ if (!animating) {
+ highlight(this);
+
+ if (childMenus[this._index])
+ childMenuSet.showMenu(childMenus[this._index]);
+ else if (childMenuSet) childMenuSet.hide();
+ }
+ }
+
+ function item_mouseout() {
+ if (!animating) {
+ if (childMenus[this._index])
+ childMenuSet.hideMenu(childMenus[this._index]);
+ else // otherwise child_deactivate will do this
+ dehighlight(this);
+ }
+ }
+
+ function item_click() {
+ if (!animating) {
+ if (_this.items[this._index].url)
+ location.href = _this.items[this._index].url;
+ }
+ }
+
+ function actuator_mouseover() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function actuator_mouseout() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function content_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ _this.onmouseover();
+ }
+ }
+
+ function content_mouseout() {
+ if (!animating) {
+ parentMenuSet.hideMenu(_this);
+ }
+ }
+
+ function child_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ }
+ }
+
+ function child_deactivate() {
+ for (var i = 0; i < childMenus.length; i++) {
+ if (childMenus[i] == this) {
+ dehighlight(elmCache["item"][i]);
+ break;
+ }
+ }
+ }
+
+ function child_queue() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function child_dequeue() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function toString() {
+ var aHtml = [];
+ var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
+
+ for (var i = 0, item = null; item = this.items[i]; i++) {
+ aHtml[i] = item.toString(childMenus[i]);
+ }
+
+ return '<div id="' + id + '" class="' + sClassName + '">' +
+ '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
+ aHtml.join('') +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
+ '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '</div></div>';
+ }
+}
+
+
+//==================================================================================================
+// TransMenuSet
+//==================================================================================================
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menus from actuator
+// iTop : Top pixel offset of menus from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+//==================================================================================================
+TransMenuSet.registry = [];
+
+function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
+ // public methods
+ this.addMenu = addMenu;
+ this.showMenu = showMenu;
+ this.hideMenu = hideMenu;
+ this.hide = hide;
+ this.hideCurrent = hideCurrent;
+
+ // initialization
+ var menus = [];
+ var _this = this;
+ var current = null;
+
+ this.index = TransMenuSet.registry.length;
+ TransMenuSet.registry[this.index] = this;
+
+ // method implimentations...
+ function addMenu(oActuator) {
+ var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
+ menus[menus.length] = m;
+ return m;
+ }
+
+ function showMenu(oMenu) {
+ if (oMenu != current) {
+ // close currently open menu
+ if (current != null) hide(current);
+
+ // set current menu to this one
+ current = oMenu;
+
+ // if this menu is closed, open it
+ oMenu.show();
+ }
+ else {
+ // hide pending calls to close this menu
+ cancelHide(oMenu);
+ }
+ }
+
+ function hideMenu(oMenu) {
+ //dbg_dump("hideMenu a " + oMenu.index);
+ if (current == oMenu && oMenu.isOpen) {
+ //dbg_dump("hideMenu b " + oMenu.index);
+ if (!oMenu.hideTimer) scheduleHide(oMenu);
+ }
+ }
+
+ function scheduleHide(oMenu) {
+ //dbg_dump("scheduleHide " + oMenu.index);
+ oMenu.onqueue();
+ oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
+ }
+
+ function cancelHide(oMenu) {
+ //dbg_dump("cancelHide " + oMenu.index);
+ if (oMenu.hideTimer) {
+ oMenu.ondequeue();
+ window.clearTimeout(oMenu.hideTimer);
+ oMenu.hideTimer = null;
+ }
+ }
+
+ function hide(oMenu) {
+ if (!oMenu && current) oMenu = current;
+
+ if (oMenu && current == oMenu && oMenu.isOpen) {
+ hideCurrent();
+ }
+ }
+
+ function hideCurrent() {
+ if (null != current) {
+ cancelHide(current);
+ current.hideTimer = null;
+ current.hide();
+ current = null;
+ }
+ }
+}
+
+//==================================================================================================
+// TransMenuItem (internal)
+// represents an item in a dropdown
+//==================================================================================================
+// sText : The item display text
+// sUrl : URL to load when the item is clicked
+// oParent : Menu this item is a part of
+//==================================================================================================
+function TransMenuItem(sText, sUrl, oParent) {
+ this.toString = toString;
+ this.text = sText;
+ this.url = sUrl;
+ this.parentMenu = oParent;
+
+ function toString(bDingbat) {
+ var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
+ var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
+ var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
+ var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
+
+ return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
+ sText + '</td><td width="14" style="' + sPaddingRight + '">' +
+ '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
+ }
+}
+
+
+
+
+
+
+//=====================================================================
+// Accel[erated] [an]imation object
+// change a property of an object over time in an accelerated fashion
+//=====================================================================
+// obj : reference to the object whose property you'd like to animate
+// prop : property you would like to change eg: "left"
+// to : final value of prop
+// time : time the animation should take to run
+// zip : optional. specify the zippiness of the acceleration. pick a
+// number between -1 and 1 where -1 is full decelerated, 1 is
+// full accelerated, and 0 is linear (no acceleration). default
+// is 0.
+// unit : optional. specify the units for use with prop. default is
+// "px".
+//=====================================================================
+// bezier functions lifted from the lib_animation.js file in the
+// 13th Parallel API. www.13thparallel.org
+//=====================================================================
+
+function Accelimation(from, to, time, zip) {
+ if (typeof zip == "undefined") zip = 0;
+ if (typeof unit == "undefined") unit = "px";
+
+ this.x0 = from;
+ this.x1 = to;
+ this.dt = time;
+ this.zip = -zip;
+ this.unit = unit;
+ this.timer = null;
+ this.onend = new Function();
+ this.onframe = new Function();
+}
+
+
+
+//=====================================================================
+// public methods
+//=====================================================================
+
+// after you create an accelimation, you call this to start it-a runnin'
+Accelimation.prototype.start = function() {
+ this.t0 = new Date().getTime();
+ this.t1 = this.t0 + this.dt;
+ var dx = this.x1 - this.x0;
+ this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
+ this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
+ Accelimation._add(this);
+}
+
+// and if you need to stop it early for some reason...
+Accelimation.prototype.stop = function() {
+ Accelimation._remove(this);
+}
+
+
+
+//=====================================================================
+// private methods
+//=====================================================================
+
+// paints one frame. gets called by Accelimation._paintAll.
+Accelimation.prototype._paint = function(time) {
+ if (time < this.t1) {
+ var elapsed = time - this.t0;
+ this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
+ }
+ else this._end();
+}
+
+// ends the animation
+Accelimation.prototype._end = function() {
+ Accelimation._remove(this);
+ this.onframe(this.x1);
+ this.onend();
+}
+
+
+
+
+//=====================================================================
+// static methods (all private)
+//=====================================================================
+
+// add a function to the list of ones to call periodically
+Accelimation._add = function(o) {
+ var index = this.instances.length;
+ this.instances[index] = o;
+ // if this is the first one, start the engine
+ if (this.instances.length == 1) {
+ this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
+ }
+}
+
+// remove a function from the list
+Accelimation._remove = function(o) {
+ for (var i = 0; i < this.instances.length; i++) {
+ if (o == this.instances[i]) {
+ this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
+ break;
+ }
+ }
+ // if that was the last one, stop the engine
+ if (this.instances.length == 0) {
+ window.clearInterval(this.timerID);
+ this.timerID = null;
+ }
+}
+
+// "engine" - call each function in the list every so often
+Accelimation._paintAll = function() {
+ var now = new Date().getTime();
+ for (var i = 0; i < this.instances.length; i++) {
+ this.instances[i]._paint(now);
+ }
+}
+
+
+// Bezier functions:
+Accelimation._B1 = function(t) { return t*t*t }
+Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
+Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
+Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
+
+
+//Finds the coordinates of a point at a certain stage through a bezier curve
+Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
+ return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
+}
+
+
+//=====================================================================
+// static properties
+//=====================================================================
+
+Accelimation.instances = [];
+Accelimation.targetRes = 10;
+Accelimation.timerID = null;
+
+
+//=====================================================================
+// IE win memory cleanup
+//=====================================================================
+
+if (window.attachEvent) {
+ var cearElementProps = [
+ 'data',
+ 'onmouseover',
+ 'onmouseout',
+ 'onmousedown',
+ 'onmouseup',
+ 'ondblclick',
+ 'onclick',
+ 'onselectstart',
+ 'oncontextmenu'
+ ];
+
+ window.attachEvent("onunload", function() {
+ var el;
+ for(var d = document.all.length;d--;){
+ el = document.all[d];
+ for(var c = cearElementProps.length;c--;){
+ el[cearElementProps[c]] = null;
+ }
+ }
+ });
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/javascript/transmenuC.js b/src/usr/local/www/themes/nervecenter/javascript/transmenuC.js
new file mode 100644
index 0000000..88626c7
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/javascript/transmenuC.js
@@ -0,0 +1,86 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ * Customizable multi-level animated DHTML menus with transparency.
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * ============================================================================================== */
+TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
+else r=true;}}
+return r;}
+TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
+TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
+document.write(aMenuHtml.join(""));}
+function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
+function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
+function initialize(){initCache();initEvents();initSize();ready=true;}
+function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
+function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
+function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
+if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
+switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
+x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
+function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
+function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
+function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
+function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
+else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
+function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
+_this.elmCache=elmCache;}
+function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
+if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
+elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
+function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
+function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
+function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
+function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
+function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
+function actuator_mouseover(){parentMenuSet.showMenu(_this);}
+function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
+function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
+function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
+function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
+function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
+function child_queue(){parentMenuSet.hideMenu(_this);}
+function child_dequeue(){parentMenuSet.showMenu(_this);}
+function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
+return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
+TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
+function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
+else{cancelHide(oMenu);}}
+function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
+function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
+function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
+function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
+function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
+function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
+var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
+return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
+function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
+Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
+Accelimation.prototype.stop=function(){Accelimation._remove(this);}
+Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
+else this._end();}
+Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
+Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
+Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
+if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
+Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
+Accelimation._B1=function(t){return t*t*t}
+Accelimation._B2=function(t){return 3*t*t*(1-t)}
+Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
+Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
+Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
+Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
+if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/jsevents/body.def b/src/usr/local/www/themes/nervecenter/jsevents/body.def
new file mode 100644
index 0000000..501d548
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/jsevents/body.def
@@ -0,0 +1,7 @@
+# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
+# where: forbidden pages are those pages that should *not* use
+# the particular JavaScript function within the JS event
+# specified below.
+# $Id$
+#
+onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/loader.js b/src/usr/local/www/themes/nervecenter/loader.js
new file mode 100644
index 0000000..491e874
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/loader.js
@@ -0,0 +1,29 @@
+//<![CDATA[
+var browser = '';
+var version = '';
+var entrance = '';
+var cond = '';
+
+// BROWSER?
+if (browser == '') {
+ if (navigator.appName.indexOf('Microsoft') != -1)
+ browser = 'IE';
+ else if (navigator.appName.indexOf('Netscape') != -1)
+ browser = 'Netscape';
+ else
+ browser = 'IE';
+}
+if (version == '') {
+ version= navigator.appVersion;
+ paren = version.indexOf('(');
+ whole_version = navigator.appVersion.substring(0,paren-1);
+ version = parseInt(whole_version);
+}
+
+if (browser == 'IE' && version < 7) {
+ document.write('<script type="text/javascript" src="/themes/nervecenter/javascript/ie7/ie7-standard-p.js"></script>');
+}
+
+document.write('<script type="text/javascript" src="/themes/nervecenter/javascript/niftyjsCode.js"></script>');
+
+//]]>
diff --git a/src/usr/local/www/themes/nervecenter/login.css b/src/usr/local/www/themes/nervecenter/login.css
new file mode 100644
index 0000000..f8abdfc
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/login.css
@@ -0,0 +1,1127 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+
+#login {
+/* background: #cccccc; */
+ background-color: transparent;
+ border: 0px solid #cccccc;
+ margin: 5em auto;
+ padding: 0em;
+ width: 400px;
+/* filter:alpha(opacity=60);
+ -moz-opacity:0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6; */
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+/* background: #ffffff; */
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 400px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -420px;
+ left: 70px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ top: -300px; */
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ left: 10px;
+ top: -300px; */
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -20px;
+ left: 170px;
+}
+
+/* loginerror box follows */
+
+#login #inputerrors {
+ background-color: transparent;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ vertical-align: middle;
+ padding: 0em;
+ width: 330px;
+ height: 50px;
+ position: relative;
+ top: -370px;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/menu.inc b/src/usr/local/www/themes/nervecenter/menu.inc
new file mode 100644
index 0000000..a274410
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/menu.inc
@@ -0,0 +1,177 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ menu.inc
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+require("menu.inc");
+
+define("TMENU_STUB", "
+ // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
+ // but you can experiment with effect on loadtime.
+ if (TransMenu.isSupported()) {
+
+ //==================================================================================================
+ // create a set of dropdowns
+ //==================================================================================================
+ // the first param should always be down, as it is here
+ //
+ // The second and third param are the top and left offset positions of the menus from their actuators
+ // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
+ // something like -5, 5
+ //
+ // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
+ // of the actuator from which to measure the offset positions above. Here we are saying we want the
+ // menu to appear directly below the bottom left corner of the actuator
+ //==================================================================================================
+ var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
+
+ //==================================================================================================
+ // create a dropdown menu
+ //==================================================================================================
+ // the first parameter should be the HTML element which will act actuator for the menu
+ //==================================================================================================
+
+ @@MENU_DEFINITIONS@@
+
+ //==================================================================================================
+ // write drop downs into page
+ //==================================================================================================
+ // this method writes all the HTML for the menus into the page with document.write(). It must be
+ // called within the body of the HTML page.
+ //==================================================================================================
+ TransMenu.renderAll();
+ }
+");
+
+class NervecenterMenu extends Menu {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+ private $menuID = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $c);
+
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+ $this->menuID = $id;
+
+ if ($this->hasParent()) {
+ $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
+ }
+ } // end __construct
+
+ public function getMenuID() {
+ return $this->menuID;
+ }
+
+ public function setMenuID($myMenuID) {
+ $this->menuID = $myMenuID;
+ }
+
+ public function getMenuJScript() {
+ $childJScript = "";
+ foreach ($this->getChildren() as $component) {
+ $childJScript .= $component->getMenuJScript();
+ }
+
+ if (! $this->hasParent()) {
+ $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
+ } else {
+ $this->menuJScript .= "\n$childJScript\n";
+ }
+
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ if (! $this->hasParent()) {
+ $menuMarkup =<<<EOD
+ <div id="menu">
+ @@CHILD_ELEMENTS@@
+ </div>
+
+EOD;
+ } else {
+ $name = gettext($this->getID());
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+
+ $menuMarkup =<<<EOD
+ <a id="{$id}" href="#">{$name}</a>
+ @@CHILD_ELEMENTS@@
+EOD;
+ }
+
+ $childMarkup = "";
+ foreach ($this->getChildren() as $component) {
+ $childMarkup .= $component;
+ }
+
+ $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
+
+ return $menuMarkup;
+ }
+}
+
+class NervecenterMenuItem extends MenuItem {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $href, $c);
+
+ $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
+ $name = gettext($this->getID());
+ $file = $this->getFile();
+
+ $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
+ }
+
+ public function getMenuJScript() {
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ return "";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/nervecenter/new_tab_menu.css b/src/usr/local/www/themes/nervecenter/new_tab_menu.css
new file mode 100644
index 0000000..04c4cf2
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/new_tab_menu.css
@@ -0,0 +1,101 @@
+/*
+ new_tab_menu.css
+ part of pfSense
+ Copyright (C) 2010-2011 Robert Zelaya
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
+ The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
+
+ <tr>
+ <td>
+ <?php
+ $tab_array_indent = 0; // move to the line in px
+ $tab_array_space = 1; // space betwen lines in px
+ $tab_array_char_limit = 82; // number or chr before the drop down box
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+
+*/
+
+.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
+
+.newtabmenu li{float:left; margin-right:2px; text-align: center;}
+.newtabmenu a:link, .newtabmenu a:visited{
+ background:url(images/new_tab_menu.png) right 45px;
+ color:#ffffff; /* noactive font */
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ font-weight:bold;
+ font-size:.9em;
+ height:20px;
+ line-height:20px;
+ text-decoration:none;
+}
+.newtabmenu a span{
+ background:url(images/new_tab_menu.png) left 45px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ height:20px;
+ margin-right:7px;
+ padding-left:7px;
+}
+.newtabmenu a:hover{
+ background:url(images/new_tab_menu.png) right 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ color:#ffffff; /* hover over font */
+}
+.newtabmenu a:hover span{
+ background:url(images/new_tab_menu.png) left 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+}
+
+/* -------------------------------- */
+/* ACTIVE ELEMENTS */
+.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
+ color:#000000; /* active font */
+ background:url(images/new_tab_menu.png) right 0 no-repeat;
+}
+.newtabmenu_active a span, .newtabmenu_active a:hover span{
+ background:url(images/new_tab_menu.png) left 0 no-repeat;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/no_big_logo b/src/usr/local/www/themes/nervecenter/no_big_logo
new file mode 100644
index 0000000..6e5c70d
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/no_big_logo
@@ -0,0 +1 @@
+NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/rrdcolors.inc.php b/src/usr/local/www/themes/nervecenter/rrdcolors.inc.php
new file mode 100644
index 0000000..dcb7a39
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/rrdcolors.inc.php
@@ -0,0 +1,89 @@
+<?php
+/* $Id$ */
+/*
+ rrdcolors.inc.php
+ Part of pfSense
+ Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* This file is included by the RRD graphing page and sets the colors */
+
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF','00E344','FF0000','000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333','a83c3c','999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+?>
diff --git a/src/usr/local/www/themes/nervecenter/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/nervecenter/styles/jquery-ui-1.11.1.css
new file mode 100644
index 0000000..8a8c54f
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/styles/jquery-ui-1.11.1.css
@@ -0,0 +1,1226 @@
+/*! jQuery UI - v1.11.1 - 2014-09-22
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 1em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+ background-color: #990000;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #bbbbbb;
+ /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
+ color: #444444;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #444444;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #3383bb;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #3383bb;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #bbbbbb;
+ background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #599fcf;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #599fcf;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #999999;
+ background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #ffffff;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
+ color: #444444;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #444444;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #c0402a;
+ background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
+ opacity: .8;
+ filter: Alpha(Opacity=80); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -4px 0 0 -4px;
+ padding: 4px;
+ background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .6;
+ filter: Alpha(Opacity=60); /* support: IE8 */
+ border-radius: 0pxdow;
+}
diff --git a/src/usr/local/www/themes/nervecenter/styles/menustyles.css b/src/usr/local/www/themes/nervecenter/styles/menustyles.css
new file mode 100644
index 0000000..06b3c7a
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/styles/menustyles.css
@@ -0,0 +1,44 @@
+#navigation {
+ /* border:1px solid black; */
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ padding-top: 4px;
+ }
+
+#menu {
+ /* background: #990000; */
+ /* border-bottom:1px solid white; */
+ padding: 0 0 0 0;
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ }
+#menu a {
+ padding: 2px 28px 4px 28px;
+ text-decoration: none;
+ font-weight: bold;
+ font-size: 1.0em;
+ color: #FFFFFF;
+ width: 08%;
+ height: 16px;
+ }
+#menu a.hover {
+ background: #AF2020;
+ }
+#menu span {
+ display: none;
+ }
+
+#subnav {
+ font-size: 10px;
+ margin-bottom: 2em;
+ }
+#subnav a {
+ color: #FF0000; /* #FB3B00; */
+ margin-right: 1em;
+ }
+#subnav span {
+ color: silver;
+ margin-right: 1em;
+ }
diff --git a/src/usr/local/www/themes/nervecenter/styles/transmenu.css b/src/usr/local/www/themes/nervecenter/styles/transmenu.css
new file mode 100644
index 0000000..f683574
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/styles/transmenu.css
@@ -0,0 +1,75 @@
+/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
+.transMenu {
+ position:absolute;
+ overflow:hidden;
+ left:-1000px;
+ top:-1000px;
+ }
+
+/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
+.transMenu .content {
+ position:absolute;
+ }
+
+/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
+.transMenu .items {
+ position:relative;
+ left:0px; top:0px;
+ z-index:2;
+ }
+
+.transMenu.top .items {
+ border-top:none;
+ }
+
+/* each TR.item is one menu item */
+.transMenu .item {
+ color: #FFFFFF; /* #336; */
+ font-size: 1.1em;
+ font-weight: normal;
+ font-family:sans-serif;
+ text-decoration:none;
+ /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
+ border:none;
+ cursor:pointer;
+ cursor:hand;
+ }
+
+/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
+/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
+.transMenu .background {
+ position:absolute;
+ left:0px; top:0px;
+ z-index:1;
+ -moz-opacity:.8;
+ filter:alpha(opacity=80);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowRight {
+ position:absolute;
+ z-index:3;
+ top:3px; width:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowBottom {
+ position:absolute;
+ z-index:1;
+ left:3px; height:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
+.transMenu .item.hover {
+ background:#fdfdfd;
+ color:black;
+ }
+
+/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
+.transMenu .item img {
+ margin-left:10px;
+ } \ No newline at end of file
diff --git a/src/usr/local/www/themes/nervecenter/wizard.css b/src/usr/local/www/themes/nervecenter/wizard.css
new file mode 100644
index 0000000..a2d31d5
--- /dev/null
+++ b/src/usr/local/www/themes/nervecenter/wizard.css
@@ -0,0 +1,1060 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ /* background: url('images/background.png') no-repeat; */
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
diff --git a/src/usr/local/www/themes/pfsense-dropdown/all.css b/src/usr/local/www/themes/pfsense-dropdown/all.css
new file mode 100644
index 0000000..3fa0630
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/all.css
@@ -0,0 +1,1028 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+}
+
+.nowrap { white-space: nowrap; }
+
+.addgatewaybox {
+ background-color: #990000;
+ border-style: none none none none;
+ width: 225px;
+}
+
+.infobox {
+ width:100%;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+ text-align: center;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+
+form input {
+ font-size: 1.1em;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 220px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 11px;
+ font-family: "Trebuchet MS", sans-serif;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ background-color: #ffffff;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+
+}
+
+#header {
+ height: 70px;
+ width: 800px;
+}
+#header-left {
+ position: relative;
+ background: url('images/logo.gif') no-repeat;
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+ background-color: #fff;
+}
+#header-right {
+ position: relative;
+ background: url('images/header.gif') no-repeat;
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+
+#header-right .container .left {
+ position: relative;
+ top: 32px;
+ left: 9px;
+ font-size: 1.8em;
+}
+
+#header-right .container .right {
+ position: relative;
+ top: -8px;
+ left: 195px;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.gif') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+}
+
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: bold;
+ font: Verdana;
+ text-align: center;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+
+
+#content {
+ border-top: 1px solid #FFFFFF;
+ margin-top: 0px;
+ padding-top: 0px;
+ width: 800px;
+}
+
+#left {
+ width: 800px;
+ height: 25px;
+ margin-bottom: 5px;
+}
+#right {
+ width: 770px;
+ margin-left: 5px;
+ margin-right: 5px;
+ margin-top: 4px;
+ padding-top: 1px;
+ padding-bottom: 15px;
+ padding-left: 10px;
+ padding-right: 10px;
+ border-left: 1px solid #000000;
+ border-right: 1px solid #000000;
+}
+
+#footer {
+ position: relative;
+ top: 3px;
+ padding: 0px;
+ margin: 6px;
+ margin-left: 0px;
+ margin-top: 2px;
+ width: 800px;
+ background-color: #990000;
+ text-align: center;
+ color: #ffffff;
+ font-size: 0.75em;
+ clear: both;
+ margin-bottom: 20px;
+ z-index: 0;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ background: url('images/menu.gif') no-repeat;
+ /* width: 693px; */
+ width: 800px;
+ padding: 0px;
+ height: 28px;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+ z-index: 10;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ width: 6.2em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: 0px;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ padding: 0em 0 1em 0;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: hand;
+}
+#navigation ul li:hover {
+ cursor: hand;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: underline;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #000;
+ background-color: #000;
+ color: #FFF;
+}
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: underline;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listrborder {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-left: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ color: #FFFFFF;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #DDDDDD;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password, #password2 {
+ font-size: small;
+ width: 60%;
+ padding-left: 19px;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+
+/* Widget CSS */
+.widgetsubheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #B1B1B1;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #000000;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetdiv{
+ margin:5px;
+ padding: 5px;
+ background:#CCCCCC;
+}
+.widgetconfigdiv{
+ background:#BBBBBB;
+ font-size: 11px;
+ color: #000000;
+ padding-right: 5px;
+ padding-left: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div#log div.log-entry-mini {
+ clear: both;
+}
+
+div#log div.log-entry-mini span {
+ padding: 2px 2px 2px 2px;
+ padding-left: 6px;
+}
+
+div#log span.log-action-mini-header,
+div#log span.log-time-mini-header,
+div#log span.log-interface-mini-header,
+div#log span.log-source-mini-header,
+div#log span.log-destination-mini-header,
+div#log span.log-protocol-mini-header {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 12px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-time-mini,
+div#log span.log-interface-mini,
+div#log span.log-source-mini,
+div#log span.log-destination-mini,
+div#log span.log-protocol-mini {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 11px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-action-mini-header {
+ width: 6%;
+}
+
+div#log span.log-time-mini,
+div#log span.log-time-mini-header {
+ width: 19%;
+}
+
+div#log span.log-interface-mini,
+div#log span.log-interface-mini-header {
+ width: 8%;
+}
+
+div#log span.log-source-mini,
+div#log span.log-source-mini-header {
+ width: 23%;
+}
+
+div#log span.log-destination-mini,
+div#log span.log-destination-mini-header {
+ width: 31%;
+}
+
+div#log span.log-protocol-mini,
+div#log span.log-protocol-mini-header {
+ width: 8%;
+ border-right: 1px solid #999;
+}
+
+/* Sortable tables */
+table.sortable thead {
+ cursor: default;
+<!-- background-color: #EEEEEE;-->
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+/*thermal_sensors widget styles*/
+
+.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
+.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
+.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
+ background-color: LimeGreen;
+ border-top-width: 2px; border-top-color: Lime;
+ border-left-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 2px; border-bottom-color: Green;
+}
+.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
+.thermalSensorText { float: left; height: 20px; top: 3px; }
+.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
+
+.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+
+.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
+
+.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
+
+/* widget textarea styles - full width */
+.textarea_widget {
+ width: 100%;
+ resize:vertical;
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* IE 8+ */
+}
diff --git a/src/usr/local/www/themes/pfsense-dropdown/apple-touch-icon.png b/src/usr/local/www/themes/pfsense-dropdown/apple-touch-icon.png
new file mode 100755
index 0000000..7a4b975
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/apple-touch-icon.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/bottom-loader.js b/src/usr/local/www/themes/pfsense-dropdown/bottom-loader.js
new file mode 100644
index 0000000..fad206e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/bottom-loader.js
@@ -0,0 +1,11 @@
+//<![CDATA[
+
+NiftyCheck();
+Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
+Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
+Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
+Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
+Rounded("div#topbox","all","#FFF","#990000","smooth");
+Rounded("div#footer","bl br tl tr","#FFF","#990000","smooth");
+
+//]]>
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/alert_bgr.gif b/src/usr/local/www/themes/pfsense-dropdown/images/alert_bgr.gif
new file mode 100755
index 0000000..2a5c000
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/alert_bgr.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/header-alert.gif b/src/usr/local/www/themes/pfsense-dropdown/images/header-alert.gif
new file mode 100755
index 0000000..02eca2b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/header-alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/header.gif b/src/usr/local/www/themes/pfsense-dropdown/images/header.gif
new file mode 100755
index 0000000..6f29ec9
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/header.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/help.png b/src/usr/local/www/themes/pfsense-dropdown/images/help.png
new file mode 100755
index 0000000..1de05e3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/help.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/favicon.ico b/src/usr/local/www/themes/pfsense-dropdown/images/icons/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g.gif
new file mode 100755
index 0000000..46ccb92
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g_inactive.gif
new file mode 100755
index 0000000..cf983e4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_3g_inactive.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced.gif
new file mode 100755
index 0000000..3ede1ff
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced_s.gif
new file mode 100755
index 0000000..b233549
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_advanced_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alert.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alert.gif
new file mode 100755
index 0000000..2f69355
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_host.gif
new file mode 100644
index 0000000..ad43e17
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_host.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_net.gif
new file mode 100644
index 0000000..abd1b8b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_net.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_port.gif
new file mode 100644
index 0000000..4acf2aa
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_port.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url.gif
new file mode 100644
index 0000000..660571e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url_reload.gif
new file mode 100644
index 0000000..55c1c4a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_alias_url_reload.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block.gif
new file mode 100755
index 0000000..670c968
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_add.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_add.gif
new file mode 100755
index 0000000..eb726d6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_d.gif
new file mode 100755
index 0000000..e6345fe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_block_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cablenic.gif
new file mode 100755
index 0000000..a071c66
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cablenic.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal.gif
new file mode 100755
index 0000000..a9c7c87
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal_mo.gif
new file mode 100755
index 0000000..1647e2f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_cal_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp.gif
new file mode 100755
index 0000000..9454a82
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp_d.gif
new file mode 100755
index 0000000..2ba8db2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_carp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_chain.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_chain.png
new file mode 100644
index 0000000..12db07a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_chain.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_check.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_check.gif
new file mode 100755
index 0000000..393674d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_check.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_green.gif
new file mode 100755
index 0000000..e171ba8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_green.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_grey.gif
new file mode 100755
index 0000000..00c865a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_grey.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_red.gif
new file mode 100755
index 0000000..7b412ee
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_clock_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_close.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_close.gif
new file mode 100755
index 0000000..e0f86a7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_close.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_configure.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_configure.gif
new file mode 100755
index 0000000..7182e0d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_configure.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down.gif
new file mode 100755
index 0000000..b71a9c5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_d.gif
new file mode 100755
index 0000000..70a7473
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_mo.gif
new file mode 100755
index 0000000..584587a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_down_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e.gif
new file mode 100755
index 0000000..2950800
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e_mo.gif
new file mode 100755
index 0000000..9ba5738
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_e_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_error.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_error.gif
new file mode 100755
index 0000000..e0fa659
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_error.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_exclam.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_exclam.gif
new file mode 100755
index 0000000..36c2ec7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_exclam.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_de.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_de.png
new file mode 100644
index 0000000..069cbbe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_de.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_en.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_en.png
new file mode 100644
index 0000000..bd7f9a5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_en.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_es.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_es.png
new file mode 100644
index 0000000..434776c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_es.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_pt_BR.png
new file mode 100644
index 0000000..f786349
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_flag_pt_BR.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_cert.png
new file mode 100644
index 0000000..48a34b6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_cert.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_file.png
new file mode 100644
index 0000000..48a9ed2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_file.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_group.png
new file mode 100644
index 0000000..7d929c0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_group.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_host.png
new file mode 100644
index 0000000..867ef2c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_host.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_imp.png
new file mode 100644
index 0000000..f667cfc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_imp.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_mail.png
new file mode 100644
index 0000000..d2d4548
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_mail.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_pwd.png
new file mode 100644
index 0000000..06b53a1
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_pwd.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_search.png
new file mode 100644
index 0000000..33de926
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_search.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_time.png
new file mode 100644
index 0000000..aa8300a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_time.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_unknown.png
new file mode 100644
index 0000000..1857d0e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_unknown.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_url.png
new file mode 100644
index 0000000..cf56792
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_url.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_user.png
new file mode 100644
index 0000000..e00eebe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_frmfld_user.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_fw-update.gif
new file mode 100755
index 0000000..52c18ac
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_fw-update.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_help.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_help.gif
new file mode 100644
index 0000000..84c84db
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_help.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias.gif
new file mode 100644
index 0000000..0c569a7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias_d.gif
new file mode 100644
index 0000000..faa84d4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ifalias_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_import_alias.gif
new file mode 100755
index 0000000..d11a5f0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_import_alias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_info_pkg.gif
new file mode 100644
index 0000000..cd3a532
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_info_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_down.gif
new file mode 100755
index 0000000..0626655
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_up.gif
new file mode 100755
index 0000000..1449513
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_interface_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left.gif
new file mode 100755
index 0000000..8effefe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_d.gif
new file mode 100755
index 0000000..c778014
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_mo.gif
new file mode 100755
index 0000000..84c6fa2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_left_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log.gif
new file mode 100755
index 0000000..4a1983a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_d.gif
new file mode 100755
index 0000000..d31bd9b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s.gif
new file mode 100755
index 0000000..f9fda33
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s_d.gif
new file mode 100755
index 0000000..fb2c05f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_log_s_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_logs.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_logs.gif
new file mode 100644
index 0000000..afe0104
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_logs.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match.gif
new file mode 100644
index 0000000..215571f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match_d.gif
new file mode 100644
index 0000000..6e4c364
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_match_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_minus.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_minus.gif
new file mode 100755
index 0000000..417544f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_minus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_open.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_open.gif
new file mode 100755
index 0000000..ac3da14
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_open.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other.gif
new file mode 100755
index 0000000..e6f780f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other_d.gif
new file mode 100755
index 0000000..b08d970
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_other_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp.gif
new file mode 100755
index 0000000..96acaf3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp_d.gif
new file mode 100755
index 0000000..7d7d00e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_parp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass.gif
new file mode 100755
index 0000000..fe1bb0d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_add.gif
new file mode 100755
index 0000000..f7f4c20
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_d.gif
new file mode 100755
index 0000000..6adc431
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_pass_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus.gif
new file mode 100755
index 0000000..2a94eeb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl.gif
new file mode 100644
index 0000000..8dcd7c0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl_p.gif
new file mode 100644
index 0000000..0c79849
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_bl_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_d.gif
new file mode 100755
index 0000000..ebc7457
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_mo.gif
new file mode 100755
index 0000000..1c7ca08
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_p.gif
new file mode 100644
index 0000000..eb41284
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_plus_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall.gif
new file mode 100755
index 0000000..d78b867
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_d.gif
new file mode 100755
index 0000000..13658f7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_mo.gif
new file mode 100755
index 0000000..90b576e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg.gif
new file mode 100755
index 0000000..9aebb03
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_d.gif
new file mode 100755
index 0000000..4ab4992
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_mo.gif
new file mode 100755
index 0000000..7025d20
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_pkg_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml.gif
new file mode 100755
index 0000000..4542432
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_d.gif
new file mode 100755
index 0000000..8d3a68d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_mo.gif
new file mode 100755
index 0000000..15e0aed
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reinstall_xml_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject.gif
new file mode 100755
index 0000000..5565cd6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject_d.gif
new file mode 100755
index 0000000..6c09fae
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_reject_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_right.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_right.gif
new file mode 100755
index 0000000..fdf2d8b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart.gif
new file mode 100755
index 0000000..e49fbd7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart_d.gif
new file mode 100755
index 0000000..a5d6d7c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_restart_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_running.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_running.gif
new file mode 100644
index 0000000..543fd56
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_running.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start.gif
new file mode 100755
index 0000000..09bb58f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start_d.gif
new file mode 100755
index 0000000..f58f111
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_start_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_status.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_status.gif
new file mode 100644
index 0000000..a93bcfb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_status.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop.gif
new file mode 100755
index 0000000..922addc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop_d.gif
new file mode 100755
index 0000000..b4cfdea
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stop_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stopped.gif
new file mode 100644
index 0000000..f93a25d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_service_stopped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_restart_mo.gif
new file mode 100755
index 0000000..a092b40
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_restart_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_start_mo.gif
new file mode 100755
index 0000000..ecdb58f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_start_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_stop_mo.gif
new file mode 100755
index 0000000..c00e208
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_services_stop_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group-grey.png
new file mode 100644
index 0000000..d7b964d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group.png
new file mode 100644
index 0000000..1c974f2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-group.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user-grey.png
new file mode 100644
index 0000000..2f6047d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user.png
new file mode 100644
index 0000000..ef82156
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system-user.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_lock_screen.png
new file mode 100644
index 0000000..30f306d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_lock_screen.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_logout.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_logout.png
new file mode 100644
index 0000000..9bbb6c7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_system_logout.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped.gif
new file mode 100644
index 0000000..ffeb2cd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped_p.gif
new file mode 100755
index 0000000..6d46aaf
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_trapped_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule.gif
new file mode 100755
index 0000000..e15ab6c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule_d.gif
new file mode 100755
index 0000000..f776281
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_ts_rule_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up.gif
new file mode 100755
index 0000000..883c5a2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_d.gif
new file mode 100755
index 0000000..0ddcce2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_mo.gif
new file mode 100755
index 0000000..9f869a4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_up_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan.gif
new file mode 100755
index 0000000..1f0addc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan_d.gif
new file mode 100755
index 0000000..35bf580
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wlan_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wol_all.gif
new file mode 100755
index 0000000..c77a978
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wol_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_nsaved.png
new file mode 100644
index 0000000..21cb27d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_nsaved.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_saved.png
new file mode 100644
index 0000000..ab82946
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_wzd_saved.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x.gif
new file mode 100755
index 0000000..24e4d49
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_d.gif
new file mode 100755
index 0000000..d2bfbc8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_mo.gif
new file mode 100755
index 0000000..da7b57c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_p.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_p.gif
new file mode 100755
index 0000000..8828fa6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/icon_x_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/in.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/in.gif
new file mode 100644
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/in_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/in_d.gif
new file mode 100644
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/out.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/out.gif
new file mode 100644
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/icons/out_d.gif b/src/usr/local/www/themes/pfsense-dropdown/images/icons/out_d.gif
new file mode 100644
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/icons/out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/log.png b/src/usr/local/www/themes/pfsense-dropdown/images/log.png
new file mode 100755
index 0000000..762ba80
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/log.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/logo.gif b/src/usr/local/www/themes/pfsense-dropdown/images/logo.gif
new file mode 100755
index 0000000..553cbd5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/logo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/logobig.jpg b/src/usr/local/www/themes/pfsense-dropdown/images/logobig.jpg
new file mode 100755
index 0000000..2ef196d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/logobig.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/menu.gif b/src/usr/local/www/themes/pfsense-dropdown/images/menu.gif
new file mode 100755
index 0000000..7269210
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/menu.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_blue.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_blue.gif
new file mode 100755
index 0000000..741186a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_blue.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_gray.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_gray.gif
new file mode 100755
index 0000000..e86e245
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_gray.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_left.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_left.gif
new file mode 100755
index 0000000..af751fa
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_right.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_right.gif
new file mode 100755
index 0000000..ff12d9e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/bar_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/button.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/button.gif
new file mode 100755
index 0000000..e85dbb3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/button.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_128.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_128.gif
new file mode 100755
index 0000000..ea5ae34
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_128.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_152.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_152.gif
new file mode 100755
index 0000000..6c7fc03
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_152.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_256.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_256.gif
new file mode 100755
index 0000000..3e1c377
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_256.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_64.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_64.gif
new file mode 100755
index 0000000..87892bd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/key_64.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/left_background.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/left_background.gif
new file mode 100755
index 0000000..529d827
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/left_background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader.gif
new file mode 100755
index 0000000..5d10ac3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader_tab.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader_tab.gif
new file mode 100755
index 0000000..05bb04c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/loader_tab.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/logon.png b/src/usr/local/www/themes/pfsense-dropdown/images/misc/logon.png
new file mode 100755
index 0000000..baf8a9d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/logon.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/progress_bar.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/progress_bar.gif
new file mode 100755
index 0000000..3b4aa52
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/progress_bar.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/rrd_error.png b/src/usr/local/www/themes/pfsense-dropdown/images/misc/rrd_error.png
new file mode 100755
index 0000000..a79ecf3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/rrd_error.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c.gif
new file mode 100755
index 0000000..317b758
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c_black.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c_black.gif
new file mode 100755
index 0000000..309846e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_c_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o.gif
new file mode 100755
index 0000000..eb95c32
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o_black.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o_black.gif
new file mode 100755
index 0000000..f818f3b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/tri_o_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/misc/widget_loader.gif b/src/usr/local/www/themes/pfsense-dropdown/images/misc/widget_loader.gif
new file mode 100755
index 0000000..fad101f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/misc/widget_loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/new_tab_menu.png b/src/usr/local/www/themes/pfsense-dropdown/images/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/status.png b/src/usr/local/www/themes/pfsense-dropdown/images/status.png
new file mode 100755
index 0000000..a3e368e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/status.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/transparent.gif b/src/usr/local/www/themes/pfsense-dropdown/images/transparent.gif
new file mode 100755
index 0000000..89c5530
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/transparent.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/images/transparent_pixel.gif b/src/usr/local/www/themes/pfsense-dropdown/images/transparent_pixel.gif
new file mode 100755
index 0000000..35d42e8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/images/transparent_pixel.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/blank.gif b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/blank.gif
new file mode 100755
index 0000000..a4fe2e6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/blank.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-box-model.js
new file mode 100644
index 0000000..45543f6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-box-model.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-core.js
new file mode 100644
index 0000000..b11e2b1
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-core.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css-strict.js
new file mode 100644
index 0000000..4406d7a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css-strict.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css2.js
new file mode 100644
index 0000000..7121c8e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css2.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css3.js
new file mode 100644
index 0000000..86b24f5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-css3.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-fixed.js
new file mode 100644
index 0000000..4321cda
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-fixed.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-html4.js
new file mode 100644
index 0000000..4d2baa9
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-html4.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-ie5.js
new file mode 100644
index 0000000..707fa56
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-ie5.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite-p.js
new file mode 100644
index 0000000..3a66d19
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite.js
new file mode 100644
index 0000000..88c764f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-lite.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-png.js
new file mode 100644
index 0000000..7b8f2cf
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-png.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-server.css
new file mode 100644
index 0000000..47c7edd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-server.css
@@ -0,0 +1,43 @@
+body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
+body {margin: 8px; background: #333;}
+h1 {margin: 0;}
+h1 a:hover {background-color: transparent;}
+h2 {font-size: 1.75em;}
+h3 {font-size: 1.1em;}
+a:active {color: #ff0000;}
+a:link {color: #0a6cce;}
+a:visited {color: #0a6cce;}
+code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
+ padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
+code.box {display: block; padding: 10px; margin: 0.5em 0;}
+ul {list-style-type: square;}
+dd {margin: .2em 0 .5em 1em;}
+dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
+dl.library dd {font-style: italic; margin-left: 3em;}
+dt {font-weight: bold;}
+dt.pack {color: brown;}
+a img {border-style: none;}
+hr {height: 1px; color: #000; border-style: solid;}
+hr.short {height: 2px; width: 100px;}
+div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
+hr {border-bottom-width: 0px;}
+div.header hr {color: #0a6cce; background-color: #0a6cce;}
+div.content {min-height: 100px;}
+div.footer hr {color: #898e79; background-color: #898e79; }
+div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
+a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
+div.footer a:hover {background-color: transparent; text-decoration: none;}
+div.header .menu {text-align: right;}
+div.footer {font-size: x-small; margin-top: 8px;}
+div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
+#license {margin-top: 5px; font-size: xx-small;}
+table {border-top: 1px solid #000; border-left: 1px solid #000;}
+th {background-color: #fff; text-align: left;}
+th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
+th.small {width: 100px;}
+th.medium {width: 200px;}
+th.large {width: 270px;}
+th.x-large {width: 408px;}
+table.fixed {table-layout: fixed;}
+span.comment {color: #666;}
+
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js
new file mode 100644
index 0000000..73e99ac
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard.js
new file mode 100644
index 0000000..2109905
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/ie7-standard.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/test-trans.png b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/test-trans.png
new file mode 100755
index 0000000..e187e2c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/ie7/test-trans.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense-dropdown/javascript/niftyjsCode.js b/src/usr/local/www/themes/pfsense-dropdown/javascript/niftyjsCode.js
new file mode 100644
index 0000000..75ef8b0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/loader.js b/src/usr/local/www/themes/pfsense-dropdown/loader.js
new file mode 100644
index 0000000..e8612db
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/loader.js
@@ -0,0 +1,29 @@
+//<![CDATA[
+var browser = '';
+var version = '';
+var entrance = '';
+var cond = '';
+
+// BROWSER?
+if (browser == '') {
+ if (navigator.appName.indexOf('Microsoft') != -1)
+ browser = 'IE';
+ else if (navigator.appName.indexOf('Netscape') != -1)
+ browser = 'Netscape';
+ else
+ browser = 'IE';
+}
+if (version == '') {
+ version= navigator.appVersion;
+ paren = version.indexOf('(');
+ whole_version = navigator.appVersion.substring(0,paren-1);
+ version = parseInt(whole_version);
+}
+
+if (browser == 'IE' && version < 7) {
+ document.write('<script type="text/javascript" src="/themes/pfsense-dropdown/javascript/ie7/ie7-standard-p.js"></script>');
+}
+
+document.write('<script type="text/javascript" src="/themes/pfsense-dropdown/javascript/niftyjsCode.js"></script>');
+
+//]]>
diff --git a/src/usr/local/www/themes/pfsense-dropdown/login.css b/src/usr/local/www/themes/pfsense-dropdown/login.css
new file mode 100644
index 0000000..f8abdfc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/login.css
@@ -0,0 +1,1127 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+
+#login {
+/* background: #cccccc; */
+ background-color: transparent;
+ border: 0px solid #cccccc;
+ margin: 5em auto;
+ padding: 0em;
+ width: 400px;
+/* filter:alpha(opacity=60);
+ -moz-opacity:0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6; */
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+/* background: #ffffff; */
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 400px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -420px;
+ left: 70px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ top: -300px; */
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ left: 10px;
+ top: -300px; */
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -20px;
+ left: 170px;
+}
+
+/* loginerror box follows */
+
+#login #inputerrors {
+ background-color: transparent;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ vertical-align: middle;
+ padding: 0em;
+ width: 330px;
+ height: 50px;
+ position: relative;
+ top: -370px;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/new_tab_menu.css b/src/usr/local/www/themes/pfsense-dropdown/new_tab_menu.css
new file mode 100644
index 0000000..04c4cf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/new_tab_menu.css
@@ -0,0 +1,101 @@
+/*
+ new_tab_menu.css
+ part of pfSense
+ Copyright (C) 2010-2011 Robert Zelaya
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
+ The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
+
+ <tr>
+ <td>
+ <?php
+ $tab_array_indent = 0; // move to the line in px
+ $tab_array_space = 1; // space betwen lines in px
+ $tab_array_char_limit = 82; // number or chr before the drop down box
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+
+*/
+
+.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
+
+.newtabmenu li{float:left; margin-right:2px; text-align: center;}
+.newtabmenu a:link, .newtabmenu a:visited{
+ background:url(images/new_tab_menu.png) right 45px;
+ color:#ffffff; /* noactive font */
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ font-weight:bold;
+ font-size:.9em;
+ height:20px;
+ line-height:20px;
+ text-decoration:none;
+}
+.newtabmenu a span{
+ background:url(images/new_tab_menu.png) left 45px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ height:20px;
+ margin-right:7px;
+ padding-left:7px;
+}
+.newtabmenu a:hover{
+ background:url(images/new_tab_menu.png) right 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ color:#ffffff; /* hover over font */
+}
+.newtabmenu a:hover span{
+ background:url(images/new_tab_menu.png) left 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+}
+
+/* -------------------------------- */
+/* ACTIVE ELEMENTS */
+.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
+ color:#000000; /* active font */
+ background:url(images/new_tab_menu.png) right 0 no-repeat;
+}
+.newtabmenu_active a span, .newtabmenu_active a:hover span{
+ background:url(images/new_tab_menu.png) left 0 no-repeat;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense-dropdown/rrdcolors.inc.php b/src/usr/local/www/themes/pfsense-dropdown/rrdcolors.inc.php
new file mode 100644
index 0000000..dcb7a39
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/rrdcolors.inc.php
@@ -0,0 +1,89 @@
+<?php
+/* $Id$ */
+/*
+ rrdcolors.inc.php
+ Part of pfSense
+ Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* This file is included by the RRD graphing page and sets the colors */
+
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF','00E344','FF0000','000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333','a83c3c','999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+?>
diff --git a/src/usr/local/www/themes/pfsense-dropdown/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/pfsense-dropdown/styles/jquery-ui-1.11.1.css
new file mode 100644
index 0000000..8a8c54f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense-dropdown/styles/jquery-ui-1.11.1.css
@@ -0,0 +1,1226 @@
+/*! jQuery UI - v1.11.1 - 2014-09-22
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 1em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+ background-color: #990000;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #bbbbbb;
+ /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
+ color: #444444;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #444444;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #3383bb;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #3383bb;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #bbbbbb;
+ background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #599fcf;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #599fcf;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #999999;
+ background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #ffffff;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
+ color: #444444;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #444444;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #c0402a;
+ background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
+ opacity: .8;
+ filter: Alpha(Opacity=80); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -4px 0 0 -4px;
+ padding: 4px;
+ background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .6;
+ filter: Alpha(Opacity=60); /* support: IE8 */
+ border-radius: 0pxdow;
+}
diff --git a/src/usr/local/www/themes/pfsense/all.css b/src/usr/local/www/themes/pfsense/all.css
new file mode 100644
index 0000000..372c4b2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/all.css
@@ -0,0 +1,1036 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+}
+
+.nowrap { white-space: nowrap; }
+
+.addgatewaybox {
+ background-color: #990000;
+ border-style: none none none none;
+ width: 225px;
+}
+
+.infobox {
+ width:100%;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+ text-align: center;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+
+form input {
+ font-size: 1.1em;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 11px;
+ font-family: "Trebuchet MS", sans-serif;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ background-color: #ffffff;
+}
+
+/* ID Based CSS Definitions */
+
+#notices {
+ width: 795px;
+ background-color: #E1E4B8;
+ border: 1px solid #000000;
+ padding: 0px;
+ margin-bottom: 5px;
+}
+#notices ul {
+ margin: 0px;
+ padding: 5px;
+ padding-top: 3px;
+ list-style: none;
+}
+
+#header {
+ height: 70px;
+ width: 900px;
+}
+#header-left {
+ position: relative;
+ background: url('images/logo.gif') no-repeat;
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+ background-color: #fff;
+}
+#header-right {
+ position: relative;
+ background: url('images/header.gif') no-repeat;
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+
+#header-right .container .left {
+ position: relative;
+ top: 32px;
+ left: 9px;
+ font-size: 1.8em;
+}
+
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: -9px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.gif') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: bold;
+ font: Verdana;
+ text-align: center;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+
+
+
+#content {
+ border-top: 1px solid #FFFFFF;
+ margin-top: 0px;
+ padding-top: 0px;
+ width: 900px;
+}
+
+#footer {
+ position: relative;
+ top: 10px;
+ padding: 0px;
+ margin: 6px;
+ width: 900px;
+ background-color: #990000;
+ text-align: center;
+ color: #ffffff;
+ font-size: 0.75em;
+ clear: both;
+ margin-bottom: 20px;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+#left {
+ width: 150px;
+ float: left;
+}
+#right {
+ /*margin-left: 171px;*/
+ margin-left: 170px;
+ margin-top: 5px;
+ width: 720px;
+}
+
+
+
+#navigation {
+ position: relative;
+ background-color: #000000;
+ top: 0px;
+ left: 5px;
+ width: 157px;
+ padding-top: 6px;
+ margin-left: 1px;
+ color: #fff;
+ padding-bottom: 6px;
+ padding-right: 0px;
+}
+
+#navigation ul {
+ margin: 0px;
+ padding: 0px;
+ width: 100%;
+}
+
+#navigation ul li {
+ display: block;
+ padding-left: 10px;
+}
+
+#navigation ul li div {
+ margin-top: 2px;
+}
+
+#navigation ul li div {
+ font-weight: bold;
+}
+
+#navigation ul li div .small,
+#navigation ul li div .small:hover {
+ font-weight: normal;
+ font-size: 0.79em;
+}
+
+#navigation ul li a {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+ padding-top: 0.2em;
+ padding-bottom: 0.2em;
+ height: 1.2em;
+ line-height: 1.2em;
+ color: #fff;
+ text-decoration: none;
+ width: 61px;
+ font-size: 0.9em;
+ text-align: center;
+}
+
+#navigation ul li a:hover {
+ color: #fff;
+ text-decoration: underline;
+ font-size: 0.9em;
+}
+
+
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listrborder {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-left: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ color: #FFFFFF;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #DDDDDD;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+
+/* Widget CSS */
+.widgetsubheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #B1B1B1;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #000000;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetdiv{
+ margin:5px;
+ padding: 5px;
+ background:#CCCCCC;
+}
+.widgetconfigdiv{
+ background:#BBBBBB;
+ font-size: 11px;
+ color: #000000;
+ padding-right: 5px;
+ padding-left: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div#log div.log-entry-mini {
+ clear: both;
+}
+
+div#log div.log-entry-mini span {
+ padding: 2px 2px 2px 2px;
+ padding-left: 6px;
+}
+
+div#log span.log-action-mini-header,
+div#log span.log-time-mini-header,
+div#log span.log-interface-mini-header,
+div#log span.log-source-mini-header,
+div#log span.log-destination-mini-header,
+div#log span.log-protocol-mini-header {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 12px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-time-mini,
+div#log span.log-interface-mini,
+div#log span.log-source-mini,
+div#log span.log-destination-mini,
+div#log span.log-protocol-mini {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 11px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-action-mini-header {
+ width: 6%;
+}
+
+div#log span.log-time-mini,
+div#log span.log-time-mini-header {
+ width: 19%;
+}
+
+div#log span.log-interface-mini,
+div#log span.log-interface-mini-header {
+ width: 8%;
+}
+
+div#log span.log-source-mini,
+div#log span.log-source-mini-header {
+ width: 23%;
+}
+
+div#log span.log-destination-mini,
+div#log span.log-destination-mini-header {
+ width: 31%;
+}
+
+div#log span.log-protocol-mini,
+div#log span.log-protocol-mini-header {
+ width: 8%;
+ border-right: 1px solid #999;
+}
+
+/* loginscreen items follow */
+
+#login {
+/* background: #cccccc; */
+ background-color: #ffffff;
+ border-left: 4px dotted #990000;
+/* border: 0px solid #990000; */
+ margin: 5em auto;
+ padding: 0em;
+/* width: 300px; */
+ width: 300px;
+ height: 300px;
+/* filter:alpha(opacity=60);
+ -moz-opacity:0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6; */
+}
+
+#login h1 {
+ background: url(images/logo.gif) no-repeat top left;
+/* background: #ffffff; */
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 300px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -420px;
+/* left: 70px; */
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ top: -300px; */
+}
+
+#login #username, #password, #password2 {
+ font-size: small;
+ width: 60%;
+ padding-left: 19px;
+ padding: 3px;
+ margin: 0em;
+
+
+/* text-indent: 10px;
+ position: relative;
+ left: 10px;
+ top: -300px; */
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -20px;
+ left: 120px;
+}
+
+/* loginerror box follows */
+
+#login #inputerrors {
+ background-color: transparent;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ vertical-align: middle;
+ padding: 0em;
+ width: 300px;
+ height: 50px;
+ position: relative;
+ left: 0px;
+ top: -117px;
+}
+
+/* Sortable tables */
+table.sortable thead {
+ cursor: default;
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+/*thermal_sensors widget styles*/
+
+.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
+.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
+.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
+ background-color: LimeGreen;
+ border-top-width: 2px; border-top-color: Lime;
+ border-left-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 2px; border-bottom-color: Green;
+}
+.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
+.thermalSensorText { float: left; height: 20px; top: 3px; }
+.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
+
+.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+
+.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
+
+.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
+
+/* widget textarea styles - full width */
+.textarea_widget {
+ width: 100%;
+ resize:vertical;
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* IE 8+ */
+}
diff --git a/src/usr/local/www/themes/pfsense/apple-touch-icon.png b/src/usr/local/www/themes/pfsense/apple-touch-icon.png
new file mode 100755
index 0000000..7a4b975
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/apple-touch-icon.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/bottom-loader.js b/src/usr/local/www/themes/pfsense/bottom-loader.js
new file mode 100644
index 0000000..8251766
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/bottom-loader.js
@@ -0,0 +1,12 @@
+//<![CDATA[
+
+NiftyCheck();
+Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
+Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
+Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
+Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
+Rounded("div#topbox","all","#FFF","#990000","smooth");
+Rounded("div#navigation","top bottom","#FFFFFF","#000000","smooth");
+Rounded("div#footer","bl br tl tr]","#FFF","#990000","smooth");
+
+//]]>
diff --git a/src/usr/local/www/themes/pfsense/images/alert_bgr.gif b/src/usr/local/www/themes/pfsense/images/alert_bgr.gif
new file mode 100755
index 0000000..2a5c000
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/alert_bgr.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/header-alert.gif b/src/usr/local/www/themes/pfsense/images/header-alert.gif
new file mode 100755
index 0000000..02eca2b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/header-alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/header.gif b/src/usr/local/www/themes/pfsense/images/header.gif
new file mode 100755
index 0000000..01cfcef
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/header.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/help.png b/src/usr/local/www/themes/pfsense/images/help.png
new file mode 100755
index 0000000..1de05e3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/help.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/favicon.ico b/src/usr/local/www/themes/pfsense/images/icons/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_3g.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_3g.gif
new file mode 100755
index 0000000..46ccb92
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_3g.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_3g_inactive.gif
new file mode 100755
index 0000000..cf983e4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_3g_inactive.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_advanced.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_advanced.gif
new file mode 100755
index 0000000..3ede1ff
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_advanced.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_advanced_s.gif
new file mode 100755
index 0000000..b233549
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_advanced_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alert.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alert.gif
new file mode 100755
index 0000000..2f69355
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_host.gif
new file mode 100644
index 0000000..ad43e17
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_host.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_net.gif
new file mode 100644
index 0000000..abd1b8b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_net.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_port.gif
new file mode 100644
index 0000000..4acf2aa
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_port.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url.gif
new file mode 100644
index 0000000..660571e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url_reload.gif
new file mode 100644
index 0000000..55c1c4a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_alias_url_reload.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_block.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_block.gif
new file mode 100755
index 0000000..670c968
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_block.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_block_add.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_block_add.gif
new file mode 100755
index 0000000..eb726d6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_block_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_block_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_block_d.gif
new file mode 100755
index 0000000..e6345fe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_block_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_cablenic.gif
new file mode 100755
index 0000000..a071c66
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_cablenic.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_cal.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_cal.gif
new file mode 100755
index 0000000..a9c7c87
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_cal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_cal_mo.gif
new file mode 100755
index 0000000..1647e2f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_cal_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_carp.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_carp.gif
new file mode 100755
index 0000000..9454a82
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_carp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_carp_d.gif
new file mode 100755
index 0000000..2ba8db2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_carp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_chain.png b/src/usr/local/www/themes/pfsense/images/icons/icon_chain.png
new file mode 100644
index 0000000..12db07a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_chain.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_check.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_check.gif
new file mode 100755
index 0000000..393674d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_check.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_clock_green.gif
new file mode 100755
index 0000000..e171ba8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_clock_green.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_clock_grey.gif
new file mode 100755
index 0000000..00c865a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_clock_grey.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_clock_red.gif
new file mode 100755
index 0000000..7b412ee
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_clock_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_close.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_close.gif
new file mode 100755
index 0000000..e0f86a7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_close.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_configure.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_configure.gif
new file mode 100755
index 0000000..7182e0d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_configure.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_down.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_down.gif
new file mode 100755
index 0000000..b71a9c5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_down_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_down_d.gif
new file mode 100755
index 0000000..70a7473
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_down_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_down_mo.gif
new file mode 100755
index 0000000..584587a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_down_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_e.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_e.gif
new file mode 100755
index 0000000..2950800
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_e.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_e_mo.gif
new file mode 100755
index 0000000..9ba5738
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_e_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_error.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_error.gif
new file mode 100755
index 0000000..e0fa659
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_error.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_exclam.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_exclam.gif
new file mode 100755
index 0000000..36c2ec7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_exclam.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_de.png b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_de.png
new file mode 100644
index 0000000..069cbbe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_de.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_en.png b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_en.png
new file mode 100644
index 0000000..bd7f9a5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_en.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_es.png b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_es.png
new file mode 100644
index 0000000..434776c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_es.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_pt_BR.png
new file mode 100644
index 0000000..f786349
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_flag_pt_BR.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_cert.png
new file mode 100644
index 0000000..48a34b6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_cert.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_file.png
new file mode 100644
index 0000000..48a9ed2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_file.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_group.png
new file mode 100644
index 0000000..7d929c0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_group.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_host.png
new file mode 100644
index 0000000..867ef2c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_host.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_imp.png
new file mode 100644
index 0000000..f667cfc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_imp.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_mail.png
new file mode 100644
index 0000000..d2d4548
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_mail.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_pwd.png
new file mode 100644
index 0000000..06b53a1
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_pwd.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_search.png
new file mode 100644
index 0000000..33de926
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_search.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_time.png
new file mode 100644
index 0000000..aa8300a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_time.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_unknown.png
new file mode 100644
index 0000000..1857d0e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_unknown.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_url.png
new file mode 100644
index 0000000..cf56792
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_url.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_user.png
new file mode 100644
index 0000000..e00eebe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_frmfld_user.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_fw-update.gif
new file mode 100755
index 0000000..52c18ac
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_fw-update.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_help.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_help.gif
new file mode 100644
index 0000000..84c84db
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_help.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias.gif
new file mode 100644
index 0000000..0c569a7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias_d.gif
new file mode 100644
index 0000000..faa84d4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_ifalias_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_import_alias.gif
new file mode 100755
index 0000000..d11a5f0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_import_alias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_in.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_in_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_info_pkg.gif
new file mode 100755
index 0000000..cd3a532
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_info_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_interface_down.gif
new file mode 100755
index 0000000..0626655
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_interface_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_interface_up.gif
new file mode 100755
index 0000000..1449513
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_interface_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_left.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_left.gif
new file mode 100755
index 0000000..8effefe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_left_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_left_d.gif
new file mode 100755
index 0000000..c778014
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_left_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_left_mo.gif
new file mode 100755
index 0000000..84c6fa2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_left_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_log.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_log.gif
new file mode 100755
index 0000000..4a1983a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_log.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_log_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_log_d.gif
new file mode 100755
index 0000000..d31bd9b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_log_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_log_s.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_log_s.gif
new file mode 100755
index 0000000..f9fda33
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_log_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_log_s_d.gif
new file mode 100755
index 0000000..fb2c05f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_log_s_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_logs.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_logs.gif
new file mode 100644
index 0000000..afe0104
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_logs.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_match.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_match.gif
new file mode 100644
index 0000000..215571f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_match.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_match_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_match_d.gif
new file mode 100644
index 0000000..6e4c364
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_match_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_minus.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_minus.gif
new file mode 100755
index 0000000..417544f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_minus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_open.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_open.gif
new file mode 100755
index 0000000..ac3da14
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_open.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_other.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_other.gif
new file mode 100755
index 0000000..e6f780f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_other.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_other_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_other_d.gif
new file mode 100755
index 0000000..b08d970
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_other_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_out.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_out_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_parp.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_parp.gif
new file mode 100755
index 0000000..96acaf3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_parp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_parp_d.gif
new file mode 100755
index 0000000..7d7d00e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_parp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_pass.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_pass.gif
new file mode 100755
index 0000000..fe1bb0d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_pass.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_pass_add.gif
new file mode 100755
index 0000000..f7f4c20
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_pass_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_pass_d.gif
new file mode 100755
index 0000000..6adc431
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_pass_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus.gif
new file mode 100755
index 0000000..2a94eeb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_plus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl.gif
new file mode 100644
index 0000000..8dcd7c0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl_p.gif
new file mode 100644
index 0000000..0c79849
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_bl_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_d.gif
new file mode 100755
index 0000000..ebc7457
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_mo.gif
new file mode 100755
index 0000000..1c7ca08
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_p.gif
new file mode 100644
index 0000000..eb41284
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_plus_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall.gif
new file mode 100755
index 0000000..d78b867
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_d.gif
new file mode 100755
index 0000000..13658f7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_mo.gif
new file mode 100755
index 0000000..90b576e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg.gif
new file mode 100755
index 0000000..9aebb03
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_d.gif
new file mode 100755
index 0000000..4ab4992
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_mo.gif
new file mode 100755
index 0000000..7025d20
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_pkg_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml.gif
new file mode 100755
index 0000000..4542432
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_d.gif
new file mode 100755
index 0000000..8d3a68d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_mo.gif
new file mode 100755
index 0000000..15e0aed
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reinstall_xml_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reject.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reject.gif
new file mode 100755
index 0000000..5565cd6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reject.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_reject_d.gif
new file mode 100755
index 0000000..6c09fae
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_reject_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_right.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_right.gif
new file mode 100755
index 0000000..fdf2d8b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart.gif
new file mode 100755
index 0000000..e49fbd7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart_d.gif
new file mode 100755
index 0000000..a5d6d7c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_service_restart_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_running.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_running.gif
new file mode 100644
index 0000000..543fd56
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_service_running.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_start.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_start.gif
new file mode 100755
index 0000000..09bb58f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_service_start.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_start_d.gif
new file mode 100755
index 0000000..f58f111
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_service_start_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_status.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_status.gif
new file mode 100644
index 0000000..a93bcfb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_service_status.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop.gif
new file mode 100755
index 0000000..922addc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop_d.gif
new file mode 100755
index 0000000..b4cfdea
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_service_stop_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_service_stopped.gif
new file mode 100644
index 0000000..f93a25d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_service_stopped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_services_restart_mo.gif
new file mode 100755
index 0000000..a092b40
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_services_restart_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_services_start_mo.gif
new file mode 100755
index 0000000..ecdb58f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_services_start_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_services_stop_mo.gif
new file mode 100755
index 0000000..c00e208
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_services_stop_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system-group-grey.png
new file mode 100644
index 0000000..d7b964d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_system-group-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system-group.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system-group.png
new file mode 100644
index 0000000..1c974f2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_system-group.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system-user-grey.png
new file mode 100644
index 0000000..2f6047d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_system-user-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system-user.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system-user.png
new file mode 100644
index 0000000..ef82156
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_system-user.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system_lock_screen.png
new file mode 100644
index 0000000..30f306d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_system_lock_screen.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_system_logout.png b/src/usr/local/www/themes/pfsense/images/icons/icon_system_logout.png
new file mode 100644
index 0000000..9bbb6c7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_system_logout.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_trapped.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_trapped.gif
new file mode 100644
index 0000000..ffeb2cd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_trapped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_trapped_p.gif
new file mode 100755
index 0000000..6d46aaf
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_trapped_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule.gif
new file mode 100755
index 0000000..e15ab6c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule_d.gif
new file mode 100755
index 0000000..f776281
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_ts_rule_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_up.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_up.gif
new file mode 100755
index 0000000..883c5a2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_up_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_up_d.gif
new file mode 100755
index 0000000..0ddcce2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_up_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_up_mo.gif
new file mode 100755
index 0000000..9f869a4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_up_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wlan.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_wlan.gif
new file mode 100755
index 0000000..1f0addc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_wlan.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_wlan_d.gif
new file mode 100755
index 0000000..35bf580
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_wlan_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_wol_all.gif
new file mode 100755
index 0000000..2d22182
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_wol_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_nsaved.png
new file mode 100644
index 0000000..21cb27d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_nsaved.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_saved.png
new file mode 100644
index 0000000..ab82946
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_wzd_saved.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_x.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_x.gif
new file mode 100755
index 0000000..24e4d49
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_x_d.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_x_d.gif
new file mode 100755
index 0000000..d2bfbc8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_x_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_x_mo.gif
new file mode 100755
index 0000000..da7b57c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_x_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/icon_x_p.gif b/src/usr/local/www/themes/pfsense/images/icons/icon_x_p.gif
new file mode 100755
index 0000000..8828fa6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/icon_x_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/in.gif b/src/usr/local/www/themes/pfsense/images/icons/in.gif
new file mode 100644
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/in_d.gif b/src/usr/local/www/themes/pfsense/images/icons/in_d.gif
new file mode 100644
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/out.gif b/src/usr/local/www/themes/pfsense/images/icons/out.gif
new file mode 100644
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/icons/out_d.gif b/src/usr/local/www/themes/pfsense/images/icons/out_d.gif
new file mode 100644
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/icons/out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/log.png b/src/usr/local/www/themes/pfsense/images/log.png
new file mode 100755
index 0000000..762ba80
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/log.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/logo.gif b/src/usr/local/www/themes/pfsense/images/logo.gif
new file mode 100755
index 0000000..553cbd5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/logo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/logobig.jpg b/src/usr/local/www/themes/pfsense/images/logobig.jpg
new file mode 100755
index 0000000..2ef196d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/logobig.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/bar_blue.gif b/src/usr/local/www/themes/pfsense/images/misc/bar_blue.gif
new file mode 100755
index 0000000..741186a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/bar_blue.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/bar_gray.gif b/src/usr/local/www/themes/pfsense/images/misc/bar_gray.gif
new file mode 100755
index 0000000..e86e245
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/bar_gray.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/bar_left.gif b/src/usr/local/www/themes/pfsense/images/misc/bar_left.gif
new file mode 100755
index 0000000..af751fa
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/bar_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/bar_right.gif b/src/usr/local/www/themes/pfsense/images/misc/bar_right.gif
new file mode 100755
index 0000000..ff12d9e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/bar_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/button.gif b/src/usr/local/www/themes/pfsense/images/misc/button.gif
new file mode 100755
index 0000000..e85dbb3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/button.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/key_128.gif b/src/usr/local/www/themes/pfsense/images/misc/key_128.gif
new file mode 100755
index 0000000..ea5ae34
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/key_128.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/key_152.gif b/src/usr/local/www/themes/pfsense/images/misc/key_152.gif
new file mode 100755
index 0000000..6c7fc03
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/key_152.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/key_256.gif b/src/usr/local/www/themes/pfsense/images/misc/key_256.gif
new file mode 100755
index 0000000..3e1c377
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/key_256.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/key_64.gif b/src/usr/local/www/themes/pfsense/images/misc/key_64.gif
new file mode 100755
index 0000000..87892bd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/key_64.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/left_background.gif b/src/usr/local/www/themes/pfsense/images/misc/left_background.gif
new file mode 100755
index 0000000..529d827
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/left_background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/loader.gif b/src/usr/local/www/themes/pfsense/images/misc/loader.gif
new file mode 100755
index 0000000..5d10ac3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/loader_tab.gif b/src/usr/local/www/themes/pfsense/images/misc/loader_tab.gif
new file mode 100755
index 0000000..05bb04c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/loader_tab.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/logon.png b/src/usr/local/www/themes/pfsense/images/misc/logon.png
new file mode 100755
index 0000000..baf8a9d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/logon.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/progress_bar.gif b/src/usr/local/www/themes/pfsense/images/misc/progress_bar.gif
new file mode 100755
index 0000000..3b4aa52
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/progress_bar.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/rrd_error.png b/src/usr/local/www/themes/pfsense/images/misc/rrd_error.png
new file mode 100755
index 0000000..a79ecf3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/rrd_error.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/tri_c.gif b/src/usr/local/www/themes/pfsense/images/misc/tri_c.gif
new file mode 100755
index 0000000..317b758
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/tri_c.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/tri_c_black.gif b/src/usr/local/www/themes/pfsense/images/misc/tri_c_black.gif
new file mode 100755
index 0000000..309846e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/tri_c_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/tri_o.gif b/src/usr/local/www/themes/pfsense/images/misc/tri_o.gif
new file mode 100755
index 0000000..eb95c32
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/tri_o.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/tri_o_black.gif b/src/usr/local/www/themes/pfsense/images/misc/tri_o_black.gif
new file mode 100755
index 0000000..f818f3b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/tri_o_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/misc/widget_loader.gif b/src/usr/local/www/themes/pfsense/images/misc/widget_loader.gif
new file mode 100755
index 0000000..fad101f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/misc/widget_loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/new_tab_menu.png b/src/usr/local/www/themes/pfsense/images/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/status.png b/src/usr/local/www/themes/pfsense/images/status.png
new file mode 100755
index 0000000..a3e368e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/status.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/transparent.gif b/src/usr/local/www/themes/pfsense/images/transparent.gif
new file mode 100755
index 0000000..89c5530
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/transparent.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/images/transparent_pixel.gif b/src/usr/local/www/themes/pfsense/images/transparent_pixel.gif
new file mode 100755
index 0000000..35d42e8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/images/transparent_pixel.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense/javascript/niftyjsCode.js b/src/usr/local/www/themes/pfsense/javascript/niftyjsCode.js
new file mode 100644
index 0000000..75ef8b0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense/loader.js b/src/usr/local/www/themes/pfsense/loader.js
new file mode 100644
index 0000000..2fc9b78
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/loader.js
@@ -0,0 +1,30 @@
+//<![CDATA[
+var browser = '';
+var version = '';
+var entrance = '';
+var cond = '';
+
+// BROWSER?
+if (browser == '') {
+ if (navigator.appName.indexOf('Microsoft') != -1)
+ browser = 'IE';
+ else if (navigator.appName.indexOf('Netscape') != -1)
+ browser = 'Netscape';
+ else
+ browser = 'IE';
+}
+
+if (version == '') {
+ version= navigator.appVersion;
+ paren = version.indexOf('(');
+ whole_version = navigator.appVersion.substring(0,paren-1);
+ version = parseInt(whole_version);
+}
+
+if (browser == 'IE' && version < 7) {
+ document.write('<script type="text/javascript" src="/themes/metallic/javascript/ie7/ie7-standard-p.js"></script>');
+}
+
+document.write('<script type="text/javascript" src="/themes/pfsense/javascript/niftyjsCode.js"></script>');
+
+//]]>
diff --git a/src/usr/local/www/themes/pfsense/login.css b/src/usr/local/www/themes/pfsense/login.css
new file mode 100644
index 0000000..f8abdfc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/login.css
@@ -0,0 +1,1127 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+
+#login {
+/* background: #cccccc; */
+ background-color: transparent;
+ border: 0px solid #cccccc;
+ margin: 5em auto;
+ padding: 0em;
+ width: 400px;
+/* filter:alpha(opacity=60);
+ -moz-opacity:0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6; */
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+/* background: #ffffff; */
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 400px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -420px;
+ left: 70px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ top: -300px; */
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ left: 10px;
+ top: -300px; */
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -20px;
+ left: 170px;
+}
+
+/* loginerror box follows */
+
+#login #inputerrors {
+ background-color: transparent;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ vertical-align: middle;
+ padding: 0em;
+ width: 330px;
+ height: 50px;
+ position: relative;
+ top: -370px;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense/new_tab_menu.css b/src/usr/local/www/themes/pfsense/new_tab_menu.css
new file mode 100644
index 0000000..04c4cf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/new_tab_menu.css
@@ -0,0 +1,101 @@
+/*
+ new_tab_menu.css
+ part of pfSense
+ Copyright (C) 2010-2011 Robert Zelaya
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
+ The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
+
+ <tr>
+ <td>
+ <?php
+ $tab_array_indent = 0; // move to the line in px
+ $tab_array_space = 1; // space betwen lines in px
+ $tab_array_char_limit = 82; // number or chr before the drop down box
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+
+*/
+
+.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
+
+.newtabmenu li{float:left; margin-right:2px; text-align: center;}
+.newtabmenu a:link, .newtabmenu a:visited{
+ background:url(images/new_tab_menu.png) right 45px;
+ color:#ffffff; /* noactive font */
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ font-weight:bold;
+ font-size:.9em;
+ height:20px;
+ line-height:20px;
+ text-decoration:none;
+}
+.newtabmenu a span{
+ background:url(images/new_tab_menu.png) left 45px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ height:20px;
+ margin-right:7px;
+ padding-left:7px;
+}
+.newtabmenu a:hover{
+ background:url(images/new_tab_menu.png) right 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ color:#ffffff; /* hover over font */
+}
+.newtabmenu a:hover span{
+ background:url(images/new_tab_menu.png) left 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+}
+
+/* -------------------------------- */
+/* ACTIVE ELEMENTS */
+.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
+ color:#000000; /* active font */
+ background:url(images/new_tab_menu.png) right 0 no-repeat;
+}
+.newtabmenu_active a span, .newtabmenu_active a:hover span{
+ background:url(images/new_tab_menu.png) left 0 no-repeat;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense/rrdcolors.inc.php b/src/usr/local/www/themes/pfsense/rrdcolors.inc.php
new file mode 100644
index 0000000..dcb7a39
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/rrdcolors.inc.php
@@ -0,0 +1,89 @@
+<?php
+/* $Id$ */
+/*
+ rrdcolors.inc.php
+ Part of pfSense
+ Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* This file is included by the RRD graphing page and sets the colors */
+
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF','00E344','FF0000','000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333','a83c3c','999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+?>
diff --git a/src/usr/local/www/themes/pfsense/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/pfsense/styles/jquery-ui-1.11.1.css
new file mode 100644
index 0000000..8a8c54f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense/styles/jquery-ui-1.11.1.css
@@ -0,0 +1,1226 @@
+/*! jQuery UI - v1.11.1 - 2014-09-22
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 1em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+ background-color: #990000;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #bbbbbb;
+ /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
+ color: #444444;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #444444;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #3383bb;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #3383bb;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #bbbbbb;
+ background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #599fcf;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #599fcf;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #999999;
+ background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #ffffff;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
+ color: #444444;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #444444;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #c0402a;
+ background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
+ opacity: .8;
+ filter: Alpha(Opacity=80); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -4px 0 0 -4px;
+ padding: 4px;
+ background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .6;
+ filter: Alpha(Opacity=60); /* support: IE8 */
+ border-radius: 0pxdow;
+}
diff --git a/src/usr/local/www/themes/pfsense_ng/all.css b/src/usr/local/www/themes/pfsense_ng/all.css
new file mode 100644
index 0000000..39beb77
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/all.css
@@ -0,0 +1,1414 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+.addgatewaybox {
+ background-color: #990000;
+ border-style: none none none none;
+ width: 225px;
+}
+
+.infobox {
+ width:100%;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 220px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 11px;
+ font-family: "Trebuchet MS", sans-serif;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ align: left;
+ background: url('images/background.jpg') no-repeat;
+ background-position : left 0px;
+ background-attachment: fixed;
+ background-color: #7f7f7f;
+}
+a:link {
+ color: #550000;
+}
+
+a:visited {
+ color: #550000;
+}
+
+a:active {
+ color: #550000;
+}
+
+a:hover {
+ color: #550000;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* style of disabled formelements */
+#wrap div {margin:1em 0}
+[disabled] {
+ color:#666666;
+ background:#eeeeee;
+}
+
+/* ID Based CSS Definitions */
+/* margin: 0px auto makes the content centered, margin 0px 0px makes it aligned to the left */
+#wrapper {
+ width: 810px;
+ margin: 0px 0px;
+/* left: 0px; */
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 40px;
+ width: 810px;
+ position: fixed;
+ left: 0;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 40px;
+ width: 80px;
+ left: 0px;
+ top:0px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 0px;
+ left: 0px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 30px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+/* for forcing an alert run the following command from diagnostics>command, php command:
+file_notice("blah", "blah blah...testing my new theme...");
+*/
+
+#header-right .container .right #alerts {
+ position: fixed;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 40px;
+ width: 400px;
+ top: 0px;
+ left: 810px;
+ z-index: 2;
+ padding-top: 1px;
+ padding-left: 10px;
+ margin: 0px;
+}
+
+#header-right .container .right #hostname {
+ position: fixed;
+ background: url('images/hostname.png') no-repeat;
+ height: 40px;
+ width: 400px;
+ z-index: 1;
+ padding-right: 5px;
+ margin: 0px;
+ top: 0px;
+ left: 810px;
+ font-size: 12px;
+ color: #000000;
+ font-weight: bold;
+ padding-left: 40px;
+ padding-top: 2px;
+ text-align: left;
+}
+
+
+
+
+table#marquee {
+ position: relative;
+ top: -4px;
+ left: 15px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 350px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+/* font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff; */
+ font-size: 12px;
+ font-weight: normal;
+ font-style: italic;
+ color: #000000;
+ padding-left: 30px;
+ padding-top: 2px;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 330px;
+ height: 16px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+#content {
+ position: relative;
+ top: 0px;
+ left: 75px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 50px;
+ padding-left: 20px;
+ width: 840px;
+ background-color: #ffffff;
+ background: url('images/horizontal.png') repeat-y;
+}
+
+
+/* try to abuse left as a fadeout at the end of the page */
+#left {
+ width: 810px;
+ height: 1px;
+}
+
+#right {
+ position: relative;
+ top: -10px;
+ left: 0px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 20px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 90px;
+ min-height: 400px;
+
+}
+
+#footer {
+ position: relative;
+/* margin-bottom: 5px; */
+ background: url('images/footer.png') no-repeat;
+/* top: -100px; */
+ bottom: 0px;
+ left: 75px;
+/* width: 1210px; */
+ width: 840px;
+ height: 60px;
+ color: #000000;
+ text-align: center;
+ font-size: 0.9em;
+ padding-top: 10px;
+ padding-left: 10px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+
+}
+
+/* Style the List */
+#navigation {
+ position: fixed;
+ top: 0px;
+ left: 100px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+ margin-left: 10px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ padding-right: 20px;
+ top: 0px;
+}
+
+/* Text mainmenubar */
+#navigation ul li div {
+ background-image: url(images/mainmenu-right.gif);
+ background-position: 2% 50%;
+ background-repeat: no-repeat;
+ padding-top:0px;
+ font-size: 12px;
+ font-weight: normal;
+ color: #ffffff;
+ text-align: left;
+ padding-left: 13px;
+ height: 13px;
+}
+
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ font-weight: normal;
+ margin-top: 1px;
+ padding-top: 5px;
+ background: #850000;
+ border: 0px;
+ /* transparent */
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=95);
+ -moz-opacity: 0.95;
+ -khtml-opacity: 0.95;
+ opacity: 0.95;
+ /* borders */
+ border-bottom-right-radius: 0px;
+ border-bottom-left-radius: 6px;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ /* Mozilla */
+ -moz-border-radius-bottomright: 0px;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-topleft: 6px;
+ /* WebKit */
+ -webkit-border-bottom-right-radius: 0px;
+ -webkit-border-bottom-left-radius: 6px;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-top-left-radius: 6px;
+ /* Shadow Effect */
+ box-shadow: 5px 5px 10px #000000;
+ -webkit-box-shadow: 5px 5px 10px #000000;
+ -moz-box-shadow: 5px 5px 10px #000000;
+ /* Vertical menu max size */
+ /* max-height: 259px; /
+ /* Horizontal menu max size */
+ max-width: 128px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+ background-image: url(images/mainmenu-down.gif);
+ background-position: 5% 50%;
+ background-repeat: no-repeat;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #000000;
+}
+/* dropdownmenu */
+#navigation ul li ul li {
+ border: 0px solid #850000;
+ width: 128px;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #850000;
+ /* borders */
+ border-bottom-right-radius: 0px;
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+ /* Mozilla */
+ -moz-border-radius-bottomright: 0px;
+ -moz-border-radius-bottomleft: 3px;
+ -moz-border-radius-topright: 3px;
+ -moz-border-radius-topleft: 3px;
+ /* WebKit */
+ -webkit-border-bottom-right-radius: 0px;
+ -webkit-border-bottom-left-radius: 3px;
+ -webkit-border-top-right-radius: 3px;
+ -webkit-border-top-left-radius: 3px;
+}
+/* last element in dropdown menu*/
+#navigation ul li ul li:last-child {
+ margin-bottom: 5px;
+}
+#navigation ul li ul li:hover {
+ margin-left: 5px;
+ background-color: #666666;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=95);
+ -moz-opacity: 0.95;
+ -khtml-opacity: 0.95;
+ opacity: 0.95;
+}
+
+/* textcolor in dropdownmenu */
+#navigation li li a {
+ display: block;
+ padding-left: 8px;
+ padding-right: 8px;
+ color: #ffffff;
+ font-size: 11px;
+ font-weight: normal;
+ text-align: left;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+}
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+ background-color: transparent;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listrborder {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-left: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ color: #FFFFFF;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #DDDDDD;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+/* style of disabled formelements */
+[disabled] {
+ color:#666666;
+ background:#eeeeee;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 6px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password, #password2 {
+ font-size: small;
+ width: 60%;
+ padding-left: 19px;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+/* Widget CSS */
+.widgetsubheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #B1B1B1;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #000000;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetdiv{
+ margin:5px;
+ padding: 5px;
+ background:#CCCCCC;
+}
+.widgetconfigdiv{
+ background:#BBBBBB;
+ font-size: 11px;
+ color: #000000;
+ padding-right: 5px;
+ padding-left: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div#log div.log-entry-mini {
+ clear: both;
+}
+
+div#log div.log-entry-mini span {
+ padding: 2px 2px 2px 2px;
+ padding-left: 6px;
+}
+
+div#log span.log-action-mini-header,
+div#log span.log-time-mini-header,
+div#log span.log-interface-mini-header,
+div#log span.log-source-mini-header,
+div#log span.log-destination-mini-header,
+div#log span.log-protocol-mini-header {
+ float: left;
+ text-align: left;
+ background-color: #B1B1B1;
+ font-size: 12px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-time-mini,
+div#log span.log-interface-mini,
+div#log span.log-source-mini,
+div#log span.log-destination-mini,
+div#log span.log-protocol-mini {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 11px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-action-mini-header {
+ width: 6%;
+}
+
+div#log span.log-time-mini,
+div#log span.log-time-mini-header {
+ width: 19%;
+}
+
+div#log span.log-interface-mini,
+div#log span.log-interface-mini-header {
+ width: 8%;
+}
+
+div#log span.log-source-mini,
+div#log span.log-source-mini-header {
+ width: 23%;
+}
+
+div#log span.log-destination-mini,
+div#log span.log-destination-mini-header {
+ width: 31%;
+}
+
+div#log span.log-protocol-mini,
+div#log span.log-protocol-mini-header {
+ width: 8%;
+ border-right: 1px solid #999;
+}
+
+/* Sortable tables */
+table.sortable thead {
+ cursor: default;
+ /* background-color: #EEEEEE; this causing light gray rectangles to the right of many tables in gui */
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+
+/*thermal_sensors widget styles*/
+
+.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
+.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
+.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
+ background-color: LimeGreen;
+ border-top-width: 2px; border-top-color: Lime;
+ border-left-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 2px; border-bottom-color: Green;
+}
+.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
+.thermalSensorText { float: left; height: 20px; top: 3px; }
+.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
+
+.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+
+.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
+
+.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
+
+/* widget textarea styles - full width */
+.textarea_widget {
+ width: 100%;
+ resize:vertical;
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* IE 8+ */
+}
diff --git a/src/usr/local/www/themes/pfsense_ng/apple-touch-icon.png b/src/usr/local/www/themes/pfsense_ng/apple-touch-icon.png
new file mode 100755
index 0000000..7a4b975
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/apple-touch-icon.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/bottom-loader.js b/src/usr/local/www/themes/pfsense_ng/bottom-loader.js
new file mode 100644
index 0000000..a21f775
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/bottom-loader.js
@@ -0,0 +1,10 @@
+//<![CDATA[
+
+ NiftyCheck();
+ Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
+ Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
+ Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
+ Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
+ Rounded("div#topbox","all","#FFF","#990000","smooth");
+
+//]]>
diff --git a/src/usr/local/www/themes/pfsense_ng/favicon.ico b/src/usr/local/www/themes/pfsense_ng/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/graphlink.css b/src/usr/local/www/themes/pfsense_ng/graphlink.css
new file mode 100644
index 0000000..521059e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/graphlink.css
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ $Id: graphlink.css,v 1.2.2.1 2007/01/17 18:43:30 sullrich Exp $
+
+ This file is part of the GraphLink software.
+ GraphLink is distributed under the MIT License.
+ Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
+*******************************************************************************/
+
+/**
+ * Defines the background image used for the graph, as well as the actual data
+ * locations.
+ * Use padding-left and padding-top to align the data area correctly with your
+ * background image.
+ * Width and height should same as the dimensions of the image, minus the
+ * padding values in both directions.
+ */
+div.GraphLink {
+ width: 212px;
+ height: 60px;
+ padding-left: 38px;
+ padding-top: 10px;
+ background-image: url(/themes/nervecenter/images/misc/graph.png);
+ overflow: hidden;
+}
+
+/**
+ * Defines the data display area. Modify to fit your background image.
+ */
+div.GraphLinkData {
+ width: 200px;
+ height: 50px;
+ overflow: hidden;
+}
+
+/**
+ * Defines the look of one bar. Nothing to change here other than the color.
+ */
+span.GraphLinkBar {
+ background-color: #990000;
+ height: 100%;
+ float: left;
+ overflow: hidden;
+}
diff --git a/src/usr/local/www/themes/pfsense_ng/images/alert_bgr.png b/src/usr/local/www/themes/pfsense_ng/images/alert_bgr.png
new file mode 100755
index 0000000..5a8ac81
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/alert_bgr.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/alerter.png b/src/usr/local/www/themes/pfsense_ng/images/alerter.png
new file mode 100755
index 0000000..e026bfe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/alerter.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/background.jpg b/src/usr/local/www/themes/pfsense_ng/images/background.jpg
new file mode 100755
index 0000000..ebdff47
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/background.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/footer.png b/src/usr/local/www/themes/pfsense_ng/images/footer.png
new file mode 100755
index 0000000..b10002b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/footer.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/header.png b/src/usr/local/www/themes/pfsense_ng/images/header.png
new file mode 100755
index 0000000..6f8128c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/header.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/help.png b/src/usr/local/www/themes/pfsense_ng/images/help.png
new file mode 100755
index 0000000..1de05e3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/help.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/horizontal.png b/src/usr/local/www/themes/pfsense_ng/images/horizontal.png
new file mode 100755
index 0000000..f098bb3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/horizontal.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/hostname.png b/src/usr/local/www/themes/pfsense_ng/images/hostname.png
new file mode 100755
index 0000000..cd79f5c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/hostname.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/favicon.ico b/src/usr/local/www/themes/pfsense_ng/images/icons/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g.gif
new file mode 100755
index 0000000..46ccb92
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g_inactive.gif
new file mode 100755
index 0000000..cf983e4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_3g_inactive.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced.gif
new file mode 100755
index 0000000..3ede1ff
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced_s.gif
new file mode 100755
index 0000000..b233549
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_advanced_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alert.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alert.gif
new file mode 100755
index 0000000..7646941
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_host.gif
new file mode 100755
index 0000000..ad43e17
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_host.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_net.gif
new file mode 100755
index 0000000..abd1b8b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_net.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_port.gif
new file mode 100755
index 0000000..4acf2aa
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_port.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url.gif
new file mode 100755
index 0000000..660571e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url_reload.gif
new file mode 100755
index 0000000..55c1c4a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_alias_url_reload.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block.gif
new file mode 100755
index 0000000..670c968
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_add.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_add.gif
new file mode 100755
index 0000000..eb726d6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_d.gif
new file mode 100755
index 0000000..e6345fe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_block_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cablenic.gif
new file mode 100755
index 0000000..a071c66
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cablenic.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal.gif
new file mode 100755
index 0000000..a9c7c87
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal_mo.gif
new file mode 100755
index 0000000..1647e2f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_cal_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp.gif
new file mode 100755
index 0000000..9454a82
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp_d.gif
new file mode 100755
index 0000000..2ba8db2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_carp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_chain.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_chain.png
new file mode 100755
index 0000000..12db07a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_chain.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_check.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_check.gif
new file mode 100755
index 0000000..393674d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_check.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_green.gif
new file mode 100755
index 0000000..e171ba8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_green.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_grey.gif
new file mode 100755
index 0000000..00c865a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_grey.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_red.gif
new file mode 100755
index 0000000..7b412ee
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_clock_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_close.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_close.gif
new file mode 100755
index 0000000..e0f86a7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_close.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_configure.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_configure.gif
new file mode 100755
index 0000000..7182e0d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_configure.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down.gif
new file mode 100755
index 0000000..b71a9c5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_d.gif
new file mode 100755
index 0000000..70a7473
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_mo.gif
new file mode 100755
index 0000000..584587a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_down_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e.gif
new file mode 100755
index 0000000..2950800
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e_mo.gif
new file mode 100755
index 0000000..9ba5738
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_e_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_error.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_error.gif
new file mode 100755
index 0000000..e0fa659
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_error.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_exclam.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_exclam.gif
new file mode 100755
index 0000000..36c2ec7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_exclam.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_de.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_de.png
new file mode 100755
index 0000000..069cbbe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_de.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_en.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_en.png
new file mode 100755
index 0000000..bd7f9a5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_en.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_es.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_es.png
new file mode 100755
index 0000000..434776c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_es.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_pt_BR.png
new file mode 100755
index 0000000..f786349
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_flag_pt_BR.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_cert.png
new file mode 100755
index 0000000..48a34b6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_cert.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_file.png
new file mode 100755
index 0000000..48a9ed2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_file.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_group.png
new file mode 100755
index 0000000..7d929c0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_group.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_host.png
new file mode 100755
index 0000000..867ef2c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_host.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_imp.png
new file mode 100755
index 0000000..f667cfc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_imp.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_mail.png
new file mode 100755
index 0000000..d2d4548
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_mail.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_pwd.png
new file mode 100755
index 0000000..06b53a1
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_pwd.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_search.png
new file mode 100755
index 0000000..33de926
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_search.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_time.png
new file mode 100755
index 0000000..aa8300a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_time.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_unknown.png
new file mode 100755
index 0000000..1857d0e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_unknown.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_url.png
new file mode 100755
index 0000000..cf56792
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_url.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_user.png
new file mode 100755
index 0000000..e00eebe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_frmfld_user.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_fw-update.gif
new file mode 100755
index 0000000..52c18ac
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_fw-update.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_help.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_help.gif
new file mode 100644
index 0000000..84c84db
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_help.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias.gif
new file mode 100755
index 0000000..0c569a7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias_d.gif
new file mode 100755
index 0000000..faa84d4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ifalias_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_import_alias.gif
new file mode 100755
index 0000000..d11a5f0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_import_alias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_info_pkg.gif
new file mode 100755
index 0000000..cd3a532
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_info_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_down.gif
new file mode 100755
index 0000000..0626655
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_up.gif
new file mode 100755
index 0000000..1449513
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_interface_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left.gif
new file mode 100755
index 0000000..8effefe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_d.gif
new file mode 100755
index 0000000..c778014
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_mo.gif
new file mode 100755
index 0000000..84c6fa2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_left_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log.gif
new file mode 100755
index 0000000..4a1983a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_d.gif
new file mode 100755
index 0000000..d31bd9b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s.gif
new file mode 100755
index 0000000..f9fda33
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s_d.gif
new file mode 100755
index 0000000..fb2c05f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_log_s_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_logs.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_logs.gif
new file mode 100644
index 0000000..afe0104
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_logs.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match.gif
new file mode 100644
index 0000000..215571f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match_d.gif
new file mode 100644
index 0000000..6e4c364
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_match_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_minus.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_minus.gif
new file mode 100755
index 0000000..417544f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_minus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_open.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_open.gif
new file mode 100755
index 0000000..ac3da14
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_open.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other.gif
new file mode 100755
index 0000000..e6f780f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other_d.gif
new file mode 100755
index 0000000..b08d970
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_other_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp.gif
new file mode 100755
index 0000000..96acaf3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp_d.gif
new file mode 100755
index 0000000..7d7d00e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_parp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass.gif
new file mode 100755
index 0000000..fe1bb0d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_add.gif
new file mode 100755
index 0000000..f7f4c20
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_d.gif
new file mode 100755
index 0000000..6adc431
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_pass_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus.gif
new file mode 100755
index 0000000..2a94eeb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl.gif
new file mode 100755
index 0000000..8dcd7c0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl_p.gif
new file mode 100755
index 0000000..0c79849
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_bl_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_d.gif
new file mode 100755
index 0000000..ebc7457
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_mo.gif
new file mode 100755
index 0000000..1c7ca08
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_p.gif
new file mode 100755
index 0000000..eb41284
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_plus_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall.gif
new file mode 100755
index 0000000..d78b867
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_d.gif
new file mode 100755
index 0000000..13658f7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_mo.gif
new file mode 100755
index 0000000..90b576e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg.gif
new file mode 100755
index 0000000..9aebb03
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_d.gif
new file mode 100755
index 0000000..4ab4992
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_mo.gif
new file mode 100755
index 0000000..7025d20
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_pkg_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml.gif
new file mode 100755
index 0000000..4542432
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_d.gif
new file mode 100755
index 0000000..8d3a68d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_mo.gif
new file mode 100755
index 0000000..15e0aed
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reinstall_xml_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject.gif
new file mode 100755
index 0000000..5565cd6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject_d.gif
new file mode 100755
index 0000000..6c09fae
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_reject_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_right.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_right.gif
new file mode 100755
index 0000000..fdf2d8b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart.gif
new file mode 100755
index 0000000..e49fbd7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart_d.gif
new file mode 100755
index 0000000..a5d6d7c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_restart_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_running.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_running.gif
new file mode 100644
index 0000000..543fd56
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_running.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start.gif
new file mode 100755
index 0000000..09bb58f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start_d.gif
new file mode 100755
index 0000000..f58f111
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_start_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_status.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_status.gif
new file mode 100644
index 0000000..a93bcfb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_status.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop.gif
new file mode 100755
index 0000000..922addc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop_d.gif
new file mode 100755
index 0000000..b4cfdea
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stop_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stopped.gif
new file mode 100644
index 0000000..f93a25d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_service_stopped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_restart_mo.gif
new file mode 100755
index 0000000..a092b40
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_restart_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_start_mo.gif
new file mode 100755
index 0000000..ecdb58f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_start_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_stop_mo.gif
new file mode 100755
index 0000000..c00e208
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_services_stop_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group-grey.png
new file mode 100755
index 0000000..d7b964d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group.png
new file mode 100755
index 0000000..1c974f2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-group.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user-grey.png
new file mode 100755
index 0000000..2f6047d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user.png
new file mode 100755
index 0000000..ef82156
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system-user.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_lock_screen.png
new file mode 100755
index 0000000..30f306d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_lock_screen.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_logout.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_logout.png
new file mode 100755
index 0000000..9bbb6c7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_system_logout.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped.gif
new file mode 100755
index 0000000..ffeb2cd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped_p.gif
new file mode 100755
index 0000000..6d46aaf
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_trapped_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule.gif
new file mode 100755
index 0000000..e15ab6c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule_d.gif
new file mode 100755
index 0000000..f776281
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_ts_rule_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up.gif
new file mode 100755
index 0000000..883c5a2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_d.gif
new file mode 100755
index 0000000..0ddcce2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_mo.gif
new file mode 100755
index 0000000..9f869a4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_up_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan.gif
new file mode 100755
index 0000000..1f0addc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan_d.gif
new file mode 100755
index 0000000..35bf580
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wlan_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wol_all.gif
new file mode 100755
index 0000000..2d22182
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wol_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_nsaved.png
new file mode 100755
index 0000000..21cb27d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_nsaved.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_saved.png
new file mode 100755
index 0000000..ab82946
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_wzd_saved.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x.gif
new file mode 100755
index 0000000..24e4d49
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_d.gif
new file mode 100755
index 0000000..d2bfbc8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_mo.gif
new file mode 100755
index 0000000..da7b57c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_p.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_p.gif
new file mode 100755
index 0000000..8828fa6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/icon_x_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/in.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/in_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/out.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/icons/out_d.gif b/src/usr/local/www/themes/pfsense_ng/images/icons/out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/icons/out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/log.png b/src/usr/local/www/themes/pfsense_ng/images/log.png
new file mode 100755
index 0000000..762ba80
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/log.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/logo.gif b/src/usr/local/www/themes/pfsense_ng/images/logo.gif
new file mode 100755
index 0000000..e5da95c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/logo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/logobig.jpg b/src/usr/local/www/themes/pfsense_ng/images/logobig.jpg
new file mode 100755
index 0000000..2ef196d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/logobig.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/mainmenu-down.gif b/src/usr/local/www/themes/pfsense_ng/images/mainmenu-down.gif
new file mode 100755
index 0000000..e59432a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/mainmenu-down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/mainmenu-right.gif b/src/usr/local/www/themes/pfsense_ng/images/mainmenu-right.gif
new file mode 100755
index 0000000..14298a1
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/mainmenu-right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/mainmenuitem.gif b/src/usr/local/www/themes/pfsense_ng/images/mainmenuitem.gif
new file mode 100755
index 0000000..6e97478
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/mainmenuitem.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menu-dot.gif b/src/usr/local/www/themes/pfsense_ng/images/menu-dot.gif
new file mode 100755
index 0000000..c76609b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/menu-dot.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menu_footer.gif b/src/usr/local/www/themes/pfsense_ng/images/menu_footer.gif
new file mode 100755
index 0000000..d06faa4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/menu_footer.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menu_right.gif b/src/usr/local/www/themes/pfsense_ng/images/menu_right.gif
new file mode 100755
index 0000000..881327c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/menu_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menubgr.png b/src/usr/local/www/themes/pfsense_ng/images/menubgr.png
new file mode 100755
index 0000000..45e0ec7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/menubgr.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menubgr_footer.png b/src/usr/local/www/themes/pfsense_ng/images/menubgr_footer.png
new file mode 100755
index 0000000..fdff49f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/menubgr_footer.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/menubgr_highlight.png b/src/usr/local/www/themes/pfsense_ng/images/menubgr_highlight.png
new file mode 100755
index 0000000..05f4832
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/menubgr_highlight.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_blue.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_blue.gif
new file mode 100755
index 0000000..741186a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_blue.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_gray.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_gray.gif
new file mode 100755
index 0000000..e86e245
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_gray.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_left.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_left.gif
new file mode 100755
index 0000000..af751fa
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bar_right.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_right.gif
new file mode 100755
index 0000000..ff12d9e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/bar_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_minus.png
new file mode 100755
index 0000000..37db2fd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_minus.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_plus.png
new file mode 100755
index 0000000..fba7af9
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/bullet_toggle_plus.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/button.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/button.gif
new file mode 100755
index 0000000..e85dbb3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/button.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/graph.png b/src/usr/local/www/themes/pfsense_ng/images/misc/graph.png
new file mode 100755
index 0000000..507ec75
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/graph.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/key_128.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/key_128.gif
new file mode 100755
index 0000000..ea5ae34
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/key_128.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/key_152.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/key_152.gif
new file mode 100755
index 0000000..6c7fc03
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/key_152.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/key_256.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/key_256.gif
new file mode 100755
index 0000000..3e1c377
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/key_256.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/key_64.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/key_64.gif
new file mode 100755
index 0000000..87892bd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/key_64.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/left_background.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/left_background.gif
new file mode 100755
index 0000000..529d827
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/left_background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/loader.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/loader.gif
new file mode 100755
index 0000000..5d10ac3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/loader_all.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/loader_all.gif
new file mode 100755
index 0000000..cb6bc0c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/loader_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/loader_filter.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/loader_filter.gif
new file mode 100755
index 0000000..b838b17
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/loader_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/loader_tab.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/loader_tab.gif
new file mode 100755
index 0000000..05bb04c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/loader_tab.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/logon.png b/src/usr/local/www/themes/pfsense_ng/images/misc/logon.png
new file mode 100755
index 0000000..98aa37a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/logon.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/progress_bar.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/progress_bar.gif
new file mode 100755
index 0000000..3b4aa52
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/progress_bar.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/rrd_error.png b/src/usr/local/www/themes/pfsense_ng/images/misc/rrd_error.png
new file mode 100755
index 0000000..a79ecf3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/rrd_error.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_alerter.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_alerter.gif
new file mode 100755
index 0000000..7ff1e95
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/status_alerter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_carpmaster.gif
new file mode 100755
index 0000000..2c32908
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/status_carpmaster.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_left.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_left.gif
new file mode 100755
index 0000000..b5a2930
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/status_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_page_loading.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_page_loading.gif
new file mode 100755
index 0000000..067ef18
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/status_page_loading.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_all.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_all.gif
new file mode 100755
index 0000000..72de6bd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_filter.gif
new file mode 100755
index 0000000..d72761a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/status_reload_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/status_right.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/status_right.gif
new file mode 100755
index 0000000..bf66fdb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/status_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c.gif
new file mode 100755
index 0000000..317b758
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c_black.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c_black.gif
new file mode 100755
index 0000000..309846e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_c_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o.gif
new file mode 100755
index 0000000..eb95c32
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o_black.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o_black.gif
new file mode 100755
index 0000000..f818f3b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/tri_o_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/misc/widget_loader.gif b/src/usr/local/www/themes/pfsense_ng/images/misc/widget_loader.gif
new file mode 100755
index 0000000..ca35e2a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/misc/widget_loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/new_tab_menu.png b/src/usr/local/www/themes/pfsense_ng/images/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/status.png b/src/usr/local/www/themes/pfsense_ng/images/status.png
new file mode 100755
index 0000000..a3e368e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/status.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/transparent.gif b/src/usr/local/www/themes/pfsense_ng/images/transparent.gif
new file mode 100755
index 0000000..89c5530
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/transparent.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/images/transparent_pixel.gif b/src/usr/local/www/themes/pfsense_ng/images/transparent_pixel.gif
new file mode 100755
index 0000000..35d42e8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/images/transparent_pixel.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/blank.gif b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/blank.gif
new file mode 100755
index 0000000..a4fe2e6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/blank.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-box-model.js
new file mode 100644
index 0000000..45543f6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-box-model.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-core.js
new file mode 100644
index 0000000..b11e2b1
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-core.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css-strict.js
new file mode 100644
index 0000000..4406d7a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css-strict.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css2.js
new file mode 100644
index 0000000..7121c8e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css2.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css3.js
new file mode 100644
index 0000000..86b24f5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-css3.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-fixed.js
new file mode 100644
index 0000000..4321cda
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-fixed.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-html4.js
new file mode 100644
index 0000000..4d2baa9
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-html4.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-ie5.js
new file mode 100644
index 0000000..707fa56
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-ie5.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite-p.js
new file mode 100644
index 0000000..dd62a21
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite.js
new file mode 100644
index 0000000..88c764f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-lite.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-png.js
new file mode 100644
index 0000000..7b8f2cf
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-png.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-server.css
new file mode 100644
index 0000000..47c7edd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-server.css
@@ -0,0 +1,43 @@
+body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
+body {margin: 8px; background: #333;}
+h1 {margin: 0;}
+h1 a:hover {background-color: transparent;}
+h2 {font-size: 1.75em;}
+h3 {font-size: 1.1em;}
+a:active {color: #ff0000;}
+a:link {color: #0a6cce;}
+a:visited {color: #0a6cce;}
+code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
+ padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
+code.box {display: block; padding: 10px; margin: 0.5em 0;}
+ul {list-style-type: square;}
+dd {margin: .2em 0 .5em 1em;}
+dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
+dl.library dd {font-style: italic; margin-left: 3em;}
+dt {font-weight: bold;}
+dt.pack {color: brown;}
+a img {border-style: none;}
+hr {height: 1px; color: #000; border-style: solid;}
+hr.short {height: 2px; width: 100px;}
+div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
+hr {border-bottom-width: 0px;}
+div.header hr {color: #0a6cce; background-color: #0a6cce;}
+div.content {min-height: 100px;}
+div.footer hr {color: #898e79; background-color: #898e79; }
+div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
+a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
+div.footer a:hover {background-color: transparent; text-decoration: none;}
+div.header .menu {text-align: right;}
+div.footer {font-size: x-small; margin-top: 8px;}
+div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
+#license {margin-top: 5px; font-size: xx-small;}
+table {border-top: 1px solid #000; border-left: 1px solid #000;}
+th {background-color: #fff; text-align: left;}
+th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
+th.small {width: 100px;}
+th.medium {width: 200px;}
+th.large {width: 270px;}
+th.x-large {width: 408px;}
+table.fixed {table-layout: fixed;}
+span.comment {color: #666;}
+
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js
new file mode 100644
index 0000000..73e99ac
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard.js
new file mode 100644
index 0000000..2109905
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/ie7-standard.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/ie7/test-trans.png b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/test-trans.png
new file mode 100755
index 0000000..e187e2c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/ie7/test-trans.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/grey-40.png b/src/usr/local/www/themes/pfsense_ng/javascript/img/grey-40.png
new file mode 100755
index 0000000..758b716
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/img/grey-40.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-off.gif b/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-off.gif
new file mode 100755
index 0000000..ddcdcae
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-off.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-on.gif b/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-on.gif
new file mode 100755
index 0000000..7a58077
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/img/submenu-on.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/white-90.png b/src/usr/local/www/themes/pfsense_ng/javascript/img/white-90.png
new file mode 100755
index 0000000..efc84b4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/img/white-90.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/img/x.gif b/src/usr/local/www/themes/pfsense_ng/javascript/img/x.gif
new file mode 100755
index 0000000..5bfd67a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/img/x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/niftyjsCode.js b/src/usr/local/www/themes/pfsense_ng/javascript/niftyjsCode.js
new file mode 100644
index 0000000..e71ea14
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-body.php b/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-body.php
new file mode 100644
index 0000000..afb7090
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-body.php
@@ -0,0 +1,51 @@
+<?php
+/* $Id: transmenu-body.php,v 1.1.2.1 2007/01/17 18:43:47 sullrich Exp $ */
+/* ========================================================================== */
+/*
+ transmenu-body.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetBodyJS() {
+ global $rootmenu;
+
+ if (isset($rootmenu)) {
+ return $rootmenu->getMenuJScript();
+ } else if (empty($rootmenu)) {
+ return "alert('No rootmenu object found.');";
+ } else {
+ return "alert('No JavaScript attached to rootmenu object.');";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-head.php b/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-head.php
new file mode 100644
index 0000000..afc6402
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/transmenu-head.php
@@ -0,0 +1,85 @@
+<?php
+/* $Id: transmenu-head.php,v 1.2.2.1 2007/01/17 18:43:47 sullrich Exp $ */
+/* ========================================================================== */
+/*
+ transmenu-head.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetHeadJS() {
+ global $g, $rootmenu;
+
+ $transmenu_stub =<<<EOD
+ function tmenuinit() {
+ //==========================================================================================
+ // if supported, initialize TransMenus
+ //==========================================================================================
+ // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
+ // This is better than server-side checking because it will also catch browsers which would
+ // normally support the menus but have javascript disabled.
+ //
+ // If supported, call initialize() and then hook whatever image rollover code you need to do
+ // to the .onactivate and .ondeactivate events for each menu.
+ //==========================================================================================
+ if (TransMenu.isSupported()) {
+ TransMenu.initialize();
+
+ // hook all the highlight swapping of the main toolbar to menu activation/deactivation
+ // instead of simple rollover to get the effect where the button stays hightlit until
+ // the menu is closed.
+ @@CHILD_JSCRIPT@@
+ }
+ } // end function
+EOD;
+
+ if (empty($rootmenu)) {
+ require_once("menudef.inc");
+ }
+
+ $childJScript = "";
+ foreach ($rootmenu->getChildren() as $component) {
+ $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
+
+ $childJScript .=<<<EOD
+ {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
+ {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
+
+EOD;
+ }
+
+ $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
+
+ return $transmenu_stub;
+}
+
+?>
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/transmenu.org b/src/usr/local/www/themes/pfsense_ng/javascript/transmenu.org
new file mode 100644
index 0000000..6c9e353
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/transmenu.org
@@ -0,0 +1,785 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ *
+ * Customizable multi-level animated DHTML menus with transparency.
+ *
+ * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * =================================================================================================
+ * updates:
+ * 04.19.04 fixed cascade problem with menus nested greater than two levels.
+ * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
+ * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
+ * also made gecko check a little more strict by specifying build no.
+ * ============================================================================================== */
+
+
+
+//==================================================================================================
+// Configuration properties
+//==================================================================================================
+TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
+TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
+TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
+TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
+TransMenu.menuPadding = 5; // padding between menu border and items grid
+TransMenu.itemPadding = 3; // additional padding around each item
+TransMenu.shadowSize = 2; // size of shadow under menu
+TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
+TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
+TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
+TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
+TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
+TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
+TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
+
+
+//==================================================================================================
+// Internal use properties
+//==================================================================================================
+TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
+TransMenu.direction = {down:1,right:2};
+TransMenu.registry = [];
+TransMenu._maxZ = 100;
+
+
+
+//==================================================================================================
+// Static methods
+//==================================================================================================
+// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
+TransMenu.isSupported = function() {
+ var ua = navigator.userAgent.toLowerCase();
+ var pf = navigator.platform.toLowerCase();
+ var an = navigator.appName;
+ var r = false;
+
+ if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
+ else if (an == "Microsoft Internet Explorer") {
+ if (document.getElementById) { // ie5.1+ mac,win
+ if (pf.indexOf("mac") == 0) {
+ r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
+ }
+ else r = true;
+ }
+ }
+
+ return r;
+}
+
+// call this in onload once menus have been created
+TransMenu.initialize = function() {
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ menu.initialize();
+ }
+}
+
+// call this in document body to write out menu html
+TransMenu.renderAll = function() {
+ var aMenuHtml = [];
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ aMenuHtml[i] = menu.toString();
+ }
+ document.write(aMenuHtml.join(""));
+}
+
+//==================================================================================================
+// TransMenu constructor (only called internally)
+//==================================================================================================
+// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
+// reference to an HTML element, or a TransMenuItem from an existing menu.
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menu from actuator
+// iTop : Top pixel offset of menu from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+// parentMenuSet : Menuset this menu will be added to.
+//==================================================================================================
+function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
+ // public methods
+ this.addItem = addItem;
+ this.addMenu = addMenu;
+ this.toString = toString;
+ this.initialize = initialize;
+ this.isOpen = false;
+ this.show = show;
+ this.hide = hide;
+ this.items = [];
+
+ // events
+ this.onactivate = new Function(); // when the menu starts to slide open
+ this.ondeactivate = new Function(); // when the menu finishes sliding closed
+ this.onmouseover = new Function(); // when the menu has been moused over
+ this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
+ this.ondequeue = new Function();
+
+ // initialization
+ this.index = TransMenu.registry.length;
+ TransMenu.registry[this.index] = this;
+
+ var id = "TransMenu" + this.index;
+ var contentHeight = null;
+ var contentWidth = null;
+ var childMenuSet = null;
+ var animating = false;
+ var childMenus = [];
+ var slideAccel = -1;
+ var elmCache = null;
+ var ready = false;
+ var _this = this;
+ var a = null;
+
+ var pos = iDirection == TransMenu.direction.down ? "top" : "left";
+ var dim = null;
+
+ // private and public method implimentations
+ function addItem(sText, sUrl) {
+ var item = new TransMenuItem(sText, sUrl, this);
+ item._index = this.items.length;
+ this.items[item._index] = item;
+ }
+
+ function addMenu(oMenuItem) {
+ if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
+
+ if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
+
+ var m = childMenuSet.addMenu(oMenuItem);
+
+ childMenus[oMenuItem._index] = m;
+ m.onmouseover = child_mouseover;
+ m.ondeactivate = child_deactivate;
+ m.onqueue = child_queue;
+ m.ondequeue = child_dequeue;
+
+ return m;
+ }
+
+ function initialize() {
+ initCache();
+ initEvents();
+ initSize();
+ ready = true;
+ }
+
+ function show() {
+ //dbg_dump("show");
+ if (ready) {
+ _this.isOpen = true;
+ animating = true;
+ setContainerPos();
+ elmCache["clip"].style.visibility = "visible";
+ elmCache["clip"].style.zIndex = TransMenu._maxZ++;
+ //dbg_dump("maxZ: " + TransMenu._maxZ);
+ slideStart();
+ _this.onactivate();
+ }
+ }
+
+ function hide() {
+ if (ready) {
+ _this.isOpen = false;
+ animating = true;
+
+ for (var i = 0, item = null; item = elmCache.item[i]; i++)
+ dehighlight(item);
+
+ if (childMenuSet) childMenuSet.hide();
+
+ slideStart();
+ _this.ondeactivate();
+ }
+ }
+
+ function setContainerPos() {
+ var sub = oActuator.constructor == TransMenuItem;
+ var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
+ var el = act;
+
+ var x = 0;
+ var y = 0;
+
+
+ var minX = 0;
+ var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
+ var minY = 0;
+ var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
+
+ // add up all offsets... subtract any scroll offset
+ while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
+ x += el.offsetLeft;
+ y += el.offsetTop;
+
+ if (el.scrollLeft) x -= el.scrollLeft;
+ if (el.scrollTop) y -= el.scrollTop;
+
+ el = el.offsetParent;
+ }
+
+ if (oActuator.constructor == TransMenuItem) {
+ x += parseInt(el.parentNode.style.left);
+ y += parseInt(el.parentNode.style.top);
+ }
+
+ switch (iReferencePoint) {
+ case TransMenu.reference.topLeft:
+ break;
+ case TransMenu.reference.topRight:
+ x += act.offsetWidth;
+ break;
+ case TransMenu.reference.bottomLeft:
+ y += act.offsetHeight;
+ break;
+ case TransMenu.reference.bottomRight:
+ x += act.offsetWidth;
+ y += act.offsetHeight;
+ break;
+ }
+
+ x += iLeft;
+ y += iTop;
+
+ x = Math.max(Math.min(x, maxX), minX);
+ y = Math.max(Math.min(y, maxY), minY);
+
+ elmCache["clip"].style.left = x + "px";
+ elmCache["clip"].style.top = y + "px";
+ }
+
+ function slideStart() {
+ var x0 = parseInt(elmCache["content"].style[pos]);
+ var x1 = _this.isOpen ? 0 : -dim;
+
+ if (a != null) a.stop();
+ a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
+
+ a.onframe = slideFrame;
+ a.onend = slideEnd;
+
+ a.start();
+ }
+
+ function slideFrame(x) {
+ elmCache["content"].style[pos] = x + "px";
+ }
+
+ function slideEnd() {
+ if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
+ animating = false;
+ }
+
+ function initSize() {
+ // everything is based off the size of the items table...
+ var ow = elmCache["items"].offsetWidth;
+ var oh = elmCache["items"].offsetHeight;
+ var ua = navigator.userAgent.toLowerCase();
+
+ // clipping container should be ow/oh + the size of the shadow
+ elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
+ elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
+
+ // same with content...
+ elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
+ elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
+
+ contentHeight = oh + TransMenu.shadowSize;
+ contentWidth = ow + TransMenu.shadowSize;
+
+ dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
+
+ // set initially closed
+ elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
+ elmCache["clip"].style.visibility = "hidden";
+
+ // if *not* mac/ie 5
+ if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
+ // set background div to offset size
+ elmCache["background"].style.width = ow + "px";
+ elmCache["background"].style.height = oh + "px";
+ elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
+ elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
+ elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
+ }
+ // mac ie is a little different because we use a PNG for the transparency
+ else {
+ // set background div to offset size
+ elmCache["background"].firstChild.src = TransMenu.backgroundPng;
+ elmCache["background"].firstChild.width = ow;
+ elmCache["background"].firstChild.height = oh;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
+ elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
+ elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
+ }
+ }
+
+ function initCache() {
+ var menu = document.getElementById(id);
+ var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
+
+ elmCache = {};
+ elmCache["clip"] = menu;
+ elmCache["item"] = [];
+
+ for (var i = 0, elm = null; elm = all[i]; i++) {
+ switch (elm.className) {
+ case "items":
+ case "content":
+ case "background":
+ case "shadowRight":
+ case "shadowBottom":
+ elmCache[elm.className] = elm;
+ break;
+ case "item":
+ elm._index = elmCache["item"].length;
+ elmCache["item"][elm._index] = elm;
+ break;
+ }
+ }
+
+ // hack!
+ _this.elmCache = elmCache;
+ }
+
+ function initEvents() {
+ // hook item mouseover
+ for (var i = 0, item = null; item = elmCache.item[i]; i++) {
+ item.onmouseover = item_mouseover;
+ item.onmouseout = item_mouseout;
+ item.onclick = item_click;
+ }
+
+ // hook actuation
+ if (typeof oActuator.tagName != "undefined") {
+ oActuator.onmouseover = actuator_mouseover;
+ oActuator.onmouseout = actuator_mouseout;
+ }
+
+ // hook menu mouseover
+ elmCache["content"].onmouseover = content_mouseover;
+ elmCache["content"].onmouseout = content_mouseout;
+ }
+
+ function highlight(oRow) {
+ oRow.className = "item hover";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
+ }
+
+ function dehighlight(oRow) {
+ oRow.className = "item";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
+ }
+
+ function item_mouseover() {
+ if (!animating) {
+ highlight(this);
+
+ if (childMenus[this._index])
+ childMenuSet.showMenu(childMenus[this._index]);
+ else if (childMenuSet) childMenuSet.hide();
+ }
+ }
+
+ function item_mouseout() {
+ if (!animating) {
+ if (childMenus[this._index])
+ childMenuSet.hideMenu(childMenus[this._index]);
+ else // otherwise child_deactivate will do this
+ dehighlight(this);
+ }
+ }
+
+ function item_click() {
+ if (!animating) {
+ if (_this.items[this._index].url)
+ location.href = _this.items[this._index].url;
+ }
+ }
+
+ function actuator_mouseover() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function actuator_mouseout() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function content_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ _this.onmouseover();
+ }
+ }
+
+ function content_mouseout() {
+ if (!animating) {
+ parentMenuSet.hideMenu(_this);
+ }
+ }
+
+ function child_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ }
+ }
+
+ function child_deactivate() {
+ for (var i = 0; i < childMenus.length; i++) {
+ if (childMenus[i] == this) {
+ dehighlight(elmCache["item"][i]);
+ break;
+ }
+ }
+ }
+
+ function child_queue() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function child_dequeue() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function toString() {
+ var aHtml = [];
+ var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
+
+ for (var i = 0, item = null; item = this.items[i]; i++) {
+ aHtml[i] = item.toString(childMenus[i]);
+ }
+
+ return '<div id="' + id + '" class="' + sClassName + '">' +
+ '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
+ aHtml.join('') +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
+ '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '</div></div>';
+ }
+}
+
+
+//==================================================================================================
+// TransMenuSet
+//==================================================================================================
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menus from actuator
+// iTop : Top pixel offset of menus from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+//==================================================================================================
+TransMenuSet.registry = [];
+
+function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
+ // public methods
+ this.addMenu = addMenu;
+ this.showMenu = showMenu;
+ this.hideMenu = hideMenu;
+ this.hide = hide;
+ this.hideCurrent = hideCurrent;
+
+ // initialization
+ var menus = [];
+ var _this = this;
+ var current = null;
+
+ this.index = TransMenuSet.registry.length;
+ TransMenuSet.registry[this.index] = this;
+
+ // method implimentations...
+ function addMenu(oActuator) {
+ var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
+ menus[menus.length] = m;
+ return m;
+ }
+
+ function showMenu(oMenu) {
+ if (oMenu != current) {
+ // close currently open menu
+ if (current != null) hide(current);
+
+ // set current menu to this one
+ current = oMenu;
+
+ // if this menu is closed, open it
+ oMenu.show();
+ }
+ else {
+ // hide pending calls to close this menu
+ cancelHide(oMenu);
+ }
+ }
+
+ function hideMenu(oMenu) {
+ //dbg_dump("hideMenu a " + oMenu.index);
+ if (current == oMenu && oMenu.isOpen) {
+ //dbg_dump("hideMenu b " + oMenu.index);
+ if (!oMenu.hideTimer) scheduleHide(oMenu);
+ }
+ }
+
+ function scheduleHide(oMenu) {
+ //dbg_dump("scheduleHide " + oMenu.index);
+ oMenu.onqueue();
+ oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
+ }
+
+ function cancelHide(oMenu) {
+ //dbg_dump("cancelHide " + oMenu.index);
+ if (oMenu.hideTimer) {
+ oMenu.ondequeue();
+ window.clearTimeout(oMenu.hideTimer);
+ oMenu.hideTimer = null;
+ }
+ }
+
+ function hide(oMenu) {
+ if (!oMenu && current) oMenu = current;
+
+ if (oMenu && current == oMenu && oMenu.isOpen) {
+ hideCurrent();
+ }
+ }
+
+ function hideCurrent() {
+ if (null != current) {
+ cancelHide(current);
+ current.hideTimer = null;
+ current.hide();
+ current = null;
+ }
+ }
+}
+
+//==================================================================================================
+// TransMenuItem (internal)
+// represents an item in a dropdown
+//==================================================================================================
+// sText : The item display text
+// sUrl : URL to load when the item is clicked
+// oParent : Menu this item is a part of
+//==================================================================================================
+function TransMenuItem(sText, sUrl, oParent) {
+ this.toString = toString;
+ this.text = sText;
+ this.url = sUrl;
+ this.parentMenu = oParent;
+
+ function toString(bDingbat) {
+ var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
+ var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
+ var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
+ var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
+
+ return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
+ sText + '</td><td width="14" style="' + sPaddingRight + '">' +
+ '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
+ }
+}
+
+
+
+
+
+
+//=====================================================================
+// Accel[erated] [an]imation object
+// change a property of an object over time in an accelerated fashion
+//=====================================================================
+// obj : reference to the object whose property you'd like to animate
+// prop : property you would like to change eg: "left"
+// to : final value of prop
+// time : time the animation should take to run
+// zip : optional. specify the zippiness of the acceleration. pick a
+// number between -1 and 1 where -1 is full decelerated, 1 is
+// full accelerated, and 0 is linear (no acceleration). default
+// is 0.
+// unit : optional. specify the units for use with prop. default is
+// "px".
+//=====================================================================
+// bezier functions lifted from the lib_animation.js file in the
+// 13th Parallel API. www.13thparallel.org
+//=====================================================================
+
+function Accelimation(from, to, time, zip) {
+ if (typeof zip == "undefined") zip = 0;
+ if (typeof unit == "undefined") unit = "px";
+
+ this.x0 = from;
+ this.x1 = to;
+ this.dt = time;
+ this.zip = -zip;
+ this.unit = unit;
+ this.timer = null;
+ this.onend = new Function();
+ this.onframe = new Function();
+}
+
+
+
+//=====================================================================
+// public methods
+//=====================================================================
+
+// after you create an accelimation, you call this to start it-a runnin'
+Accelimation.prototype.start = function() {
+ this.t0 = new Date().getTime();
+ this.t1 = this.t0 + this.dt;
+ var dx = this.x1 - this.x0;
+ this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
+ this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
+ Accelimation._add(this);
+}
+
+// and if you need to stop it early for some reason...
+Accelimation.prototype.stop = function() {
+ Accelimation._remove(this);
+}
+
+
+
+//=====================================================================
+// private methods
+//=====================================================================
+
+// paints one frame. gets called by Accelimation._paintAll.
+Accelimation.prototype._paint = function(time) {
+ if (time < this.t1) {
+ var elapsed = time - this.t0;
+ this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
+ }
+ else this._end();
+}
+
+// ends the animation
+Accelimation.prototype._end = function() {
+ Accelimation._remove(this);
+ this.onframe(this.x1);
+ this.onend();
+}
+
+
+
+
+//=====================================================================
+// static methods (all private)
+//=====================================================================
+
+// add a function to the list of ones to call periodically
+Accelimation._add = function(o) {
+ var index = this.instances.length;
+ this.instances[index] = o;
+ // if this is the first one, start the engine
+ if (this.instances.length == 1) {
+ this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
+ }
+}
+
+// remove a function from the list
+Accelimation._remove = function(o) {
+ for (var i = 0; i < this.instances.length; i++) {
+ if (o == this.instances[i]) {
+ this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
+ break;
+ }
+ }
+ // if that was the last one, stop the engine
+ if (this.instances.length == 0) {
+ window.clearInterval(this.timerID);
+ this.timerID = null;
+ }
+}
+
+// "engine" - call each function in the list every so often
+Accelimation._paintAll = function() {
+ var now = new Date().getTime();
+ for (var i = 0; i < this.instances.length; i++) {
+ this.instances[i]._paint(now);
+ }
+}
+
+
+// Bezier functions:
+Accelimation._B1 = function(t) { return t*t*t }
+Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
+Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
+Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
+
+
+//Finds the coordinates of a point at a certain stage through a bezier curve
+Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
+ return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
+}
+
+
+//=====================================================================
+// static properties
+//=====================================================================
+
+Accelimation.instances = [];
+Accelimation.targetRes = 10;
+Accelimation.timerID = null;
+
+
+//=====================================================================
+// IE win memory cleanup
+//=====================================================================
+
+if (window.attachEvent) {
+ var cearElementProps = [
+ 'data',
+ 'onmouseover',
+ 'onmouseout',
+ 'onmousedown',
+ 'onmouseup',
+ 'ondblclick',
+ 'onclick',
+ 'onselectstart',
+ 'oncontextmenu'
+ ];
+
+ window.attachEvent("onunload", function() {
+ var el;
+ for(var d = document.all.length;d--;){
+ el = document.all[d];
+ for(var c = cearElementProps.length;c--;){
+ el[cearElementProps[c]] = null;
+ }
+ }
+ });
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/javascript/transmenuC.js b/src/usr/local/www/themes/pfsense_ng/javascript/transmenuC.js
new file mode 100644
index 0000000..88626c7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/javascript/transmenuC.js
@@ -0,0 +1,86 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ * Customizable multi-level animated DHTML menus with transparency.
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * ============================================================================================== */
+TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
+else r=true;}}
+return r;}
+TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
+TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
+document.write(aMenuHtml.join(""));}
+function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
+function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
+function initialize(){initCache();initEvents();initSize();ready=true;}
+function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
+function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
+function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
+if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
+switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
+x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
+function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
+function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
+function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
+function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
+else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
+function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
+_this.elmCache=elmCache;}
+function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
+if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
+elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
+function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
+function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
+function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
+function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
+function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
+function actuator_mouseover(){parentMenuSet.showMenu(_this);}
+function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
+function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
+function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
+function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
+function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
+function child_queue(){parentMenuSet.hideMenu(_this);}
+function child_dequeue(){parentMenuSet.showMenu(_this);}
+function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
+return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
+TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
+function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
+else{cancelHide(oMenu);}}
+function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
+function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
+function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
+function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
+function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
+function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
+var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
+return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
+function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
+Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
+Accelimation.prototype.stop=function(){Accelimation._remove(this);}
+Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
+else this._end();}
+Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
+Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
+Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
+if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
+Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
+Accelimation._B1=function(t){return t*t*t}
+Accelimation._B2=function(t){return 3*t*t*(1-t)}
+Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
+Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
+Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
+Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
+if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/jsevents/body.def b/src/usr/local/www/themes/pfsense_ng/jsevents/body.def
new file mode 100644
index 0000000..df461e2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/jsevents/body.def
@@ -0,0 +1,7 @@
+# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
+# where: forbidden pages are those pages that should *not* use
+# the particular JavaScript function within the JS event
+# specified below.
+# $Id: body.def,v 1.2.2.1 2007/01/17 18:43:52 sullrich Exp $
+#
+onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/loader.js b/src/usr/local/www/themes/pfsense_ng/loader.js
new file mode 100644
index 0000000..ee215f3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/loader.js
@@ -0,0 +1,36 @@
+//<![CDATA[
+var browser = '';
+var version = '';
+var entrance = '';
+var cond = '';
+
+// BROWSER?
+if (browser == '') {
+ if (navigator.appName.indexOf('Microsoft') != -1)
+ browser = 'IE';
+ else if (navigator.appName.indexOf('Netscape') != -1)
+ browser = 'Netscape';
+ else
+ browser = 'IE';
+}
+if (version == '') {
+ version= navigator.appVersion;
+ paren = version.indexOf('(');
+ whole_version = navigator.appVersion.substring(0,paren-1);
+ version = parseInt(whole_version);
+}
+
+if (browser == 'IE' && version < 7) {
+ document.write('<script type="text/javascript" src="/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js"></script>');
+}
+
+document.write('<script type="text/javascript" src="/themes/pfsense_ng/javascript/niftyjsCode.js"></script>');
+
+// jQuery function to define dropdown menu size
+jQuery(document).ready(function () {
+ var hwindow = '';
+ hwindow = (jQuery(window).height()-35);
+ // Force the size dropdown menu
+ jQuery('#navigation ul li ul').css('max-height', hwindow);
+});
+//]]>
diff --git a/src/usr/local/www/themes/pfsense_ng/login.css b/src/usr/local/www/themes/pfsense_ng/login.css
new file mode 100644
index 0000000..f8abdfc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/login.css
@@ -0,0 +1,1127 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+
+#login {
+/* background: #cccccc; */
+ background-color: transparent;
+ border: 0px solid #cccccc;
+ margin: 5em auto;
+ padding: 0em;
+ width: 400px;
+/* filter:alpha(opacity=60);
+ -moz-opacity:0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6; */
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+/* background: #ffffff; */
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 400px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -420px;
+ left: 70px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ top: -300px; */
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ left: 10px;
+ top: -300px; */
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -20px;
+ left: 170px;
+}
+
+/* loginerror box follows */
+
+#login #inputerrors {
+ background-color: transparent;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ vertical-align: middle;
+ padding: 0em;
+ width: 330px;
+ height: 50px;
+ position: relative;
+ top: -370px;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/menu.inc b/src/usr/local/www/themes/pfsense_ng/menu.inc
new file mode 100644
index 0000000..d703daf
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/menu.inc
@@ -0,0 +1,177 @@
+<?php
+/* $Id: menu.inc,v 1.3.2.1 2007/01/17 18:43:30 sullrich Exp $ */
+/* ========================================================================== */
+/*
+ menu.inc
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+require("menu.inc");
+
+define("TMENU_STUB", "
+ // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
+ // but you can experiment with effect on loadtime.
+ if (TransMenu.isSupported()) {
+
+ //==================================================================================================
+ // create a set of dropdowns
+ //==================================================================================================
+ // the first param should always be down, as it is here
+ //
+ // The second and third param are the top and left offset positions of the menus from their actuators
+ // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
+ // something like -5, 5
+ //
+ // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
+ // of the actuator from which to measure the offset positions above. Here we are saying we want the
+ // menu to appear directly below the bottom left corner of the actuator
+ //==================================================================================================
+ var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
+
+ //==================================================================================================
+ // create a dropdown menu
+ //==================================================================================================
+ // the first parameter should be the HTML element which will act actuator for the menu
+ //==================================================================================================
+
+ @@MENU_DEFINITIONS@@
+
+ //==================================================================================================
+ // write drop downs into page
+ //==================================================================================================
+ // this method writes all the HTML for the menus into the page with document.write(). It must be
+ // called within the body of the HTML page.
+ //==================================================================================================
+ TransMenu.renderAll();
+ }
+");
+
+class NervecenterMenu extends Menu {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+ private $menuID = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $c);
+
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+ $this->menuID = $id;
+
+ if ($this->hasParent()) {
+ $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
+ }
+ } // end __construct
+
+ public function getMenuID() {
+ return $this->menuID;
+ }
+
+ public function setMenuID($myMenuID) {
+ $this->menuID = $myMenuID;
+ }
+
+ public function getMenuJScript() {
+ $childJScript = "";
+ foreach ($this->getChildren() as $component) {
+ $childJScript .= $component->getMenuJScript();
+ }
+
+ if (! $this->hasParent()) {
+ $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
+ } else {
+ $this->menuJScript .= "\n$childJScript\n";
+ }
+
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ if (! $this->hasParent()) {
+ $menuMarkup =<<<EOD
+ <div id="menu">
+ @@CHILD_ELEMENTS@@
+ </div>
+
+EOD;
+ } else {
+ $name = gettext($this->getID());
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+
+ $menuMarkup =<<<EOD
+ <a id="{$id}" href="#">{$name}</a>
+ @@CHILD_ELEMENTS@@
+EOD;
+ }
+
+ $childMarkup = "";
+ foreach ($this->getChildren() as $component) {
+ $childMarkup .= $component;
+ }
+
+ $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
+
+ return $menuMarkup;
+ }
+}
+
+class NervecenterMenuItem extends MenuItem {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $href, $c);
+
+ $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
+ $name = gettext($this->getID());
+ $file = $this->getFile();
+
+ $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
+ }
+
+ public function getMenuJScript() {
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ return "";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/pfsense_ng/new_tab_menu.css b/src/usr/local/www/themes/pfsense_ng/new_tab_menu.css
new file mode 100644
index 0000000..04c4cf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/new_tab_menu.css
@@ -0,0 +1,101 @@
+/*
+ new_tab_menu.css
+ part of pfSense
+ Copyright (C) 2010-2011 Robert Zelaya
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
+ The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
+
+ <tr>
+ <td>
+ <?php
+ $tab_array_indent = 0; // move to the line in px
+ $tab_array_space = 1; // space betwen lines in px
+ $tab_array_char_limit = 82; // number or chr before the drop down box
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+
+*/
+
+.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
+
+.newtabmenu li{float:left; margin-right:2px; text-align: center;}
+.newtabmenu a:link, .newtabmenu a:visited{
+ background:url(images/new_tab_menu.png) right 45px;
+ color:#ffffff; /* noactive font */
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ font-weight:bold;
+ font-size:.9em;
+ height:20px;
+ line-height:20px;
+ text-decoration:none;
+}
+.newtabmenu a span{
+ background:url(images/new_tab_menu.png) left 45px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ height:20px;
+ margin-right:7px;
+ padding-left:7px;
+}
+.newtabmenu a:hover{
+ background:url(images/new_tab_menu.png) right 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ color:#ffffff; /* hover over font */
+}
+.newtabmenu a:hover span{
+ background:url(images/new_tab_menu.png) left 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+}
+
+/* -------------------------------- */
+/* ACTIVE ELEMENTS */
+.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
+ color:#000000; /* active font */
+ background:url(images/new_tab_menu.png) right 0 no-repeat;
+}
+.newtabmenu_active a span, .newtabmenu_active a:hover span{
+ background:url(images/new_tab_menu.png) left 0 no-repeat;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/no_big_logo b/src/usr/local/www/themes/pfsense_ng/no_big_logo
new file mode 100644
index 0000000..6e5c70d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/no_big_logo
@@ -0,0 +1 @@
+NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/rrdcolors.inc.php b/src/usr/local/www/themes/pfsense_ng/rrdcolors.inc.php
new file mode 100644
index 0000000..dcb7a39
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/rrdcolors.inc.php
@@ -0,0 +1,89 @@
+<?php
+/* $Id$ */
+/*
+ rrdcolors.inc.php
+ Part of pfSense
+ Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* This file is included by the RRD graphing page and sets the colors */
+
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF','00E344','FF0000','000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333','a83c3c','999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+?>
diff --git a/src/usr/local/www/themes/pfsense_ng/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/pfsense_ng/styles/jquery-ui-1.11.1.css
new file mode 100644
index 0000000..8a8c54f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/styles/jquery-ui-1.11.1.css
@@ -0,0 +1,1226 @@
+/*! jQuery UI - v1.11.1 - 2014-09-22
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 1em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+ background-color: #990000;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #bbbbbb;
+ /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
+ color: #444444;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #444444;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #3383bb;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #3383bb;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #bbbbbb;
+ background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #599fcf;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #599fcf;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #999999;
+ background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #ffffff;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
+ color: #444444;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #444444;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #c0402a;
+ background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
+ opacity: .8;
+ filter: Alpha(Opacity=80); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -4px 0 0 -4px;
+ padding: 4px;
+ background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .6;
+ filter: Alpha(Opacity=60); /* support: IE8 */
+ border-radius: 0pxdow;
+}
diff --git a/src/usr/local/www/themes/pfsense_ng/styles/menustyles.css b/src/usr/local/www/themes/pfsense_ng/styles/menustyles.css
new file mode 100644
index 0000000..06b3c7a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/styles/menustyles.css
@@ -0,0 +1,44 @@
+#navigation {
+ /* border:1px solid black; */
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ padding-top: 4px;
+ }
+
+#menu {
+ /* background: #990000; */
+ /* border-bottom:1px solid white; */
+ padding: 0 0 0 0;
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ }
+#menu a {
+ padding: 2px 28px 4px 28px;
+ text-decoration: none;
+ font-weight: bold;
+ font-size: 1.0em;
+ color: #FFFFFF;
+ width: 08%;
+ height: 16px;
+ }
+#menu a.hover {
+ background: #AF2020;
+ }
+#menu span {
+ display: none;
+ }
+
+#subnav {
+ font-size: 10px;
+ margin-bottom: 2em;
+ }
+#subnav a {
+ color: #FF0000; /* #FB3B00; */
+ margin-right: 1em;
+ }
+#subnav span {
+ color: silver;
+ margin-right: 1em;
+ }
diff --git a/src/usr/local/www/themes/pfsense_ng/styles/transmenu.css b/src/usr/local/www/themes/pfsense_ng/styles/transmenu.css
new file mode 100644
index 0000000..f683574
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/styles/transmenu.css
@@ -0,0 +1,75 @@
+/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
+.transMenu {
+ position:absolute;
+ overflow:hidden;
+ left:-1000px;
+ top:-1000px;
+ }
+
+/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
+.transMenu .content {
+ position:absolute;
+ }
+
+/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
+.transMenu .items {
+ position:relative;
+ left:0px; top:0px;
+ z-index:2;
+ }
+
+.transMenu.top .items {
+ border-top:none;
+ }
+
+/* each TR.item is one menu item */
+.transMenu .item {
+ color: #FFFFFF; /* #336; */
+ font-size: 1.1em;
+ font-weight: normal;
+ font-family:sans-serif;
+ text-decoration:none;
+ /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
+ border:none;
+ cursor:pointer;
+ cursor:hand;
+ }
+
+/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
+/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
+.transMenu .background {
+ position:absolute;
+ left:0px; top:0px;
+ z-index:1;
+ -moz-opacity:.8;
+ filter:alpha(opacity=80);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowRight {
+ position:absolute;
+ z-index:3;
+ top:3px; width:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowBottom {
+ position:absolute;
+ z-index:1;
+ left:3px; height:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
+.transMenu .item.hover {
+ background:#fdfdfd;
+ color:black;
+ }
+
+/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
+.transMenu .item img {
+ margin-left:10px;
+ } \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng/wizard.css b/src/usr/local/www/themes/pfsense_ng/wizard.css
new file mode 100644
index 0000000..f2c9f3e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng/wizard.css
@@ -0,0 +1,1117 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ /* background: url('images/background.png') no-repeat; */
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+.infobox {
+ width:100%;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/all.css b/src/usr/local/www/themes/pfsense_ng_fs/all.css
new file mode 100644
index 0000000..7286d1c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/all.css
@@ -0,0 +1,1375 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+.addgatewaybox {
+ background-color: #990000;
+ border-style: none none none none;
+ width: 225px;
+}
+
+.infobox {
+ width:100%;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 220px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 11px;
+ font-family: "Trebuchet MS", sans-serif;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+a:link {
+ color: #550000;
+}
+
+a:visited {
+ color: #550000;
+}
+
+a:active {
+ color: #550000;
+}
+
+a:hover {
+ color: #550000;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* style of disabled formelements */
+#wrap div {margin:1em 0}
+[disabled] {
+ color:#666666;
+ background:#eeeeee;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 40px;
+ width: 810px;
+ position: fixed;
+ left: 0;
+ margin-bottom: 5px;
+ z-index: 2;
+ top: 0;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 40px;
+ width: 80px;
+ left: 0px;
+ top:0px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 0px;
+ left: 0px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 30px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+/* for forcing an alert run the following command from diagnostics>command, php command:
+file_notice("blah", "blah blah...testing my new theme...");
+*/
+
+#header-right .container .right #alerts {
+ position: fixed;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 40px;
+ width: 400px;
+ top: 0px;
+ left: 810px;
+ z-index: 2;
+ padding-top: 1px;
+ padding-left: 10px;
+ margin: 0px;
+}
+
+#header-right .container .right #hostname {
+ position: fixed;
+ background: url('images/hostname.png') no-repeat;
+ height: 40px;
+ width: 400px;
+ z-index: 1;
+ padding-right: 5px;
+ margin: 0px;
+ top: 0px;
+ left: 810px;
+ font-size: 12px;
+ color: #000000;
+ font-weight: bold;
+ padding-left: 40px;
+ padding-top: 2px;
+ text-align: left;
+}
+
+
+
+
+table#marquee {
+ position: relative;
+ top: -4px;
+ left: 15px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 350px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+/* font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff; */
+ font-size: 12px;
+ font-weight: normal;
+ font-style: italic;
+ color: #000000;
+ padding-left: 30px;
+ padding-top: 2px;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 330px;
+ height: 16px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+#content {
+ padding-top: 50px;
+ padding-right: 40px;
+ padding-left: 40px;
+}
+
+
+/* try to abuse left as a fadeout at the end of the page */
+#left {
+ width: 810px;
+ height: 1px;
+}
+
+#right {
+ padding: 10px;
+ margin-bottom: 30px;
+ font-size: 12px;
+ font-weight: 200;
+ line-height: 12px;
+ color: inherit;
+ background-color: #eeeeee;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+
+#footer {
+ text-align: center;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+
+}
+
+/* Style the List */
+#navigation {
+ position: fixed;
+ top: 0px;
+ left: 100px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+ margin-left: 10px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ padding-right: 20px;
+ top: 0px;
+}
+
+/* Text mainmenubar */
+#navigation ul li div {
+ background-image: url(images/mainmenu-right.gif);
+ background-position: 2% 50%;
+ background-repeat: no-repeat;
+ padding-top:0px;
+ font-size: 12px;
+ font-weight: normal;
+ color: #ffffff;
+ text-align: left;
+ padding-left: 13px;
+ height: 13px;
+}
+
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ font-weight: normal;
+ margin-top: 1px;
+ padding-top: 5px;
+ background: #850000;
+ border: 0px;
+ /* transparent */
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=95);
+ -moz-opacity: 0.95;
+ -khtml-opacity: 0.95;
+ opacity: 0.95;
+ /* borders */
+ border-bottom-right-radius: 0px;
+ border-bottom-left-radius: 6px;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ /* Mozilla */
+ -moz-border-radius-bottomright: 0px;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-topleft: 6px;
+ /* WebKit */
+ -webkit-border-bottom-right-radius: 0px;
+ -webkit-border-bottom-left-radius: 6px;
+ -webkit-border-top-right-radius: 6px;
+ -webkit-border-top-left-radius: 6px;
+ /* Shadow Effect */
+ box-shadow: 5px 5px 10px #000000;
+ -webkit-box-shadow: 5px 5px 10px #000000;
+ -moz-box-shadow: 5px 5px 10px #000000;
+ /* Vertical menu max size */
+ /* max-height: 259px; /
+ /* Horizontal menu max size */
+ max-width: 128px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+ background-image: url(images/mainmenu-down.gif);
+ background-position: 5% 50%;
+ background-repeat: no-repeat;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #000000;
+}
+/* dropdownmenu */
+#navigation ul li ul li {
+ border: 0px solid #850000;
+ width: 128px;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #850000;
+ /* borders */
+ border-bottom-right-radius: 0px;
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+ /* Mozilla */
+ -moz-border-radius-bottomright: 0px;
+ -moz-border-radius-bottomleft: 3px;
+ -moz-border-radius-topright: 3px;
+ -moz-border-radius-topleft: 3px;
+ /* WebKit */
+ -webkit-border-bottom-right-radius: 0px;
+ -webkit-border-bottom-left-radius: 3px;
+ -webkit-border-top-right-radius: 3px;
+ -webkit-border-top-left-radius: 3px;
+}
+/* last element in dropdown menu*/
+#navigation ul li ul li:last-child {
+ margin-bottom: 5px;
+}
+#navigation ul li ul li:hover {
+ margin-left: 5px;
+ background-color: #666666;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=95);
+ -moz-opacity: 0.95;
+ -khtml-opacity: 0.95;
+ opacity: 0.95;
+}
+
+/* textcolor in dropdownmenu */
+#navigation li li a {
+ display: block;
+ padding-left: 8px;
+ padding-right: 8px;
+ color: #ffffff;
+ font-size: 11px;
+ font-weight: normal;
+ text-align: left;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+}
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+ background-color: transparent;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listrborder {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-left: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ color: #FFFFFF;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #DDDDDD;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+/* style of disabled formelements */
+[disabled] {
+ color:#666666;
+ background:#eeeeee;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 6px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password, #password2 {
+ font-size: small;
+ width: 60%;
+ padding-left: 19px;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+/* Widget CSS */
+.widgetsubheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #B1B1B1;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #000000;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetdiv{
+ margin:5px;
+ padding: 5px;
+ background:#CCCCCC;
+}
+.widgetconfigdiv{
+ background:#BBBBBB;
+ font-size: 11px;
+ color: #000000;
+ padding-right: 5px;
+ padding-left: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div#log div.log-entry-mini {
+ clear: both;
+}
+
+div#log div.log-entry-mini span {
+ padding: 2px 2px 2px 2px;
+ padding-left: 6px;
+}
+
+div#log span.log-action-mini-header,
+div#log span.log-time-mini-header,
+div#log span.log-interface-mini-header,
+div#log span.log-source-mini-header,
+div#log span.log-destination-mini-header,
+div#log span.log-protocol-mini-header {
+ float: left;
+ text-align: left;
+ background-color: #B1B1B1;
+ font-size: 12px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-time-mini,
+div#log span.log-interface-mini,
+div#log span.log-source-mini,
+div#log span.log-destination-mini,
+div#log span.log-protocol-mini {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 11px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-action-mini-header {
+ width: 6%;
+}
+
+div#log span.log-time-mini,
+div#log span.log-time-mini-header {
+ width: 19%;
+}
+
+div#log span.log-interface-mini,
+div#log span.log-interface-mini-header {
+ width: 8%;
+}
+
+div#log span.log-source-mini,
+div#log span.log-source-mini-header {
+ width: 23%;
+}
+
+div#log span.log-destination-mini,
+div#log span.log-destination-mini-header {
+ width: 31%;
+}
+
+div#log span.log-protocol-mini,
+div#log span.log-protocol-mini-header {
+ width: 8%;
+ border-right: 1px solid #999;
+}
+
+/* Sortable tables */
+table.sortable thead {
+ cursor: default;
+ /* background-color: #EEEEEE; this causing light gray rectangles to the right of many tables in gui */
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+
+/*thermal_sensors widget styles*/
+
+.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
+.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
+.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
+ background-color: LimeGreen;
+ border-top-width: 2px; border-top-color: Lime;
+ border-left-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 2px; border-bottom-color: Green;
+}
+.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
+.thermalSensorText { float: left; height: 20px; top: 3px; }
+.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
+
+.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+
+.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
+
+.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
+
+/* widget textarea styles - full width */
+.textarea_widget {
+ width: 100%;
+ resize:vertical;
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* IE 8+ */
+}
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/apple-touch-icon.png b/src/usr/local/www/themes/pfsense_ng_fs/apple-touch-icon.png
new file mode 100755
index 0000000..7a4b975
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/apple-touch-icon.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/bottom-loader.js b/src/usr/local/www/themes/pfsense_ng_fs/bottom-loader.js
new file mode 100644
index 0000000..a21f775
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/bottom-loader.js
@@ -0,0 +1,10 @@
+//<![CDATA[
+
+ NiftyCheck();
+ Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
+ Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
+ Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
+ Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
+ Rounded("div#topbox","all","#FFF","#990000","smooth");
+
+//]]>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/favicon.ico b/src/usr/local/www/themes/pfsense_ng_fs/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/graphlink.css b/src/usr/local/www/themes/pfsense_ng_fs/graphlink.css
new file mode 100644
index 0000000..521059e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/graphlink.css
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ $Id: graphlink.css,v 1.2.2.1 2007/01/17 18:43:30 sullrich Exp $
+
+ This file is part of the GraphLink software.
+ GraphLink is distributed under the MIT License.
+ Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
+*******************************************************************************/
+
+/**
+ * Defines the background image used for the graph, as well as the actual data
+ * locations.
+ * Use padding-left and padding-top to align the data area correctly with your
+ * background image.
+ * Width and height should same as the dimensions of the image, minus the
+ * padding values in both directions.
+ */
+div.GraphLink {
+ width: 212px;
+ height: 60px;
+ padding-left: 38px;
+ padding-top: 10px;
+ background-image: url(/themes/nervecenter/images/misc/graph.png);
+ overflow: hidden;
+}
+
+/**
+ * Defines the data display area. Modify to fit your background image.
+ */
+div.GraphLinkData {
+ width: 200px;
+ height: 50px;
+ overflow: hidden;
+}
+
+/**
+ * Defines the look of one bar. Nothing to change here other than the color.
+ */
+span.GraphLinkBar {
+ background-color: #990000;
+ height: 100%;
+ float: left;
+ overflow: hidden;
+}
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/alert_bgr.png b/src/usr/local/www/themes/pfsense_ng_fs/images/alert_bgr.png
new file mode 100755
index 0000000..5a8ac81
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/alert_bgr.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/alerter.png b/src/usr/local/www/themes/pfsense_ng_fs/images/alerter.png
new file mode 100755
index 0000000..e026bfe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/alerter.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/background.jpg b/src/usr/local/www/themes/pfsense_ng_fs/images/background.jpg
new file mode 100755
index 0000000..ebdff47
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/background.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/footer.png b/src/usr/local/www/themes/pfsense_ng_fs/images/footer.png
new file mode 100755
index 0000000..b10002b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/footer.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/header.png b/src/usr/local/www/themes/pfsense_ng_fs/images/header.png
new file mode 100755
index 0000000..6f8128c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/header.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/help.png b/src/usr/local/www/themes/pfsense_ng_fs/images/help.png
new file mode 100755
index 0000000..1de05e3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/help.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/horizontal.png b/src/usr/local/www/themes/pfsense_ng_fs/images/horizontal.png
new file mode 100755
index 0000000..f098bb3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/horizontal.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/hostname.png b/src/usr/local/www/themes/pfsense_ng_fs/images/hostname.png
new file mode 100755
index 0000000..cd79f5c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/hostname.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/favicon.ico b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g.gif
new file mode 100755
index 0000000..46ccb92
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g_inactive.gif
new file mode 100755
index 0000000..cf983e4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_3g_inactive.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced.gif
new file mode 100755
index 0000000..3ede1ff
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced_s.gif
new file mode 100755
index 0000000..b233549
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_advanced_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alert.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alert.gif
new file mode 100755
index 0000000..7646941
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_host.gif
new file mode 100755
index 0000000..ad43e17
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_host.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_net.gif
new file mode 100755
index 0000000..abd1b8b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_net.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_port.gif
new file mode 100755
index 0000000..4acf2aa
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_port.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url.gif
new file mode 100755
index 0000000..660571e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url_reload.gif
new file mode 100755
index 0000000..55c1c4a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_alias_url_reload.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block.gif
new file mode 100755
index 0000000..670c968
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_add.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_add.gif
new file mode 100755
index 0000000..eb726d6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_d.gif
new file mode 100755
index 0000000..e6345fe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_block_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cablenic.gif
new file mode 100755
index 0000000..a071c66
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cablenic.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal.gif
new file mode 100755
index 0000000..a9c7c87
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal_mo.gif
new file mode 100755
index 0000000..1647e2f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_cal_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp.gif
new file mode 100755
index 0000000..9454a82
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp_d.gif
new file mode 100755
index 0000000..2ba8db2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_carp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_chain.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_chain.png
new file mode 100755
index 0000000..12db07a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_chain.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_check.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_check.gif
new file mode 100755
index 0000000..393674d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_check.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_green.gif
new file mode 100755
index 0000000..e171ba8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_green.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_grey.gif
new file mode 100755
index 0000000..00c865a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_grey.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_red.gif
new file mode 100755
index 0000000..7b412ee
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_clock_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_close.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_close.gif
new file mode 100755
index 0000000..e0f86a7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_close.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_configure.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_configure.gif
new file mode 100755
index 0000000..7182e0d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_configure.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down.gif
new file mode 100755
index 0000000..b71a9c5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_d.gif
new file mode 100755
index 0000000..70a7473
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_mo.gif
new file mode 100755
index 0000000..584587a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_down_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e.gif
new file mode 100755
index 0000000..2950800
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e_mo.gif
new file mode 100755
index 0000000..9ba5738
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_e_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_error.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_error.gif
new file mode 100755
index 0000000..e0fa659
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_error.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_exclam.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_exclam.gif
new file mode 100755
index 0000000..36c2ec7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_exclam.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_de.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_de.png
new file mode 100755
index 0000000..069cbbe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_de.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_en.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_en.png
new file mode 100755
index 0000000..bd7f9a5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_en.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_es.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_es.png
new file mode 100755
index 0000000..434776c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_es.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_pt_BR.png
new file mode 100755
index 0000000..f786349
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_flag_pt_BR.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_cert.png
new file mode 100755
index 0000000..48a34b6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_cert.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_file.png
new file mode 100755
index 0000000..48a9ed2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_file.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_group.png
new file mode 100755
index 0000000..7d929c0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_group.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_host.png
new file mode 100755
index 0000000..867ef2c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_host.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_imp.png
new file mode 100755
index 0000000..f667cfc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_imp.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_mail.png
new file mode 100755
index 0000000..d2d4548
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_mail.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_pwd.png
new file mode 100755
index 0000000..06b53a1
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_pwd.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_search.png
new file mode 100755
index 0000000..33de926
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_search.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_time.png
new file mode 100755
index 0000000..aa8300a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_time.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_unknown.png
new file mode 100755
index 0000000..1857d0e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_unknown.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_url.png
new file mode 100755
index 0000000..cf56792
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_url.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_user.png
new file mode 100755
index 0000000..e00eebe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_frmfld_user.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_fw-update.gif
new file mode 100755
index 0000000..52c18ac
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_fw-update.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_help.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_help.gif
new file mode 100644
index 0000000..84c84db
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_help.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias.gif
new file mode 100755
index 0000000..0c569a7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias_d.gif
new file mode 100755
index 0000000..faa84d4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ifalias_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_import_alias.gif
new file mode 100755
index 0000000..d11a5f0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_import_alias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_info_pkg.gif
new file mode 100755
index 0000000..cd3a532
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_info_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_down.gif
new file mode 100755
index 0000000..0626655
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_up.gif
new file mode 100755
index 0000000..1449513
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_interface_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left.gif
new file mode 100755
index 0000000..8effefe
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_d.gif
new file mode 100755
index 0000000..c778014
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_mo.gif
new file mode 100755
index 0000000..84c6fa2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_left_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log.gif
new file mode 100755
index 0000000..4a1983a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_d.gif
new file mode 100755
index 0000000..d31bd9b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s.gif
new file mode 100755
index 0000000..f9fda33
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s_d.gif
new file mode 100755
index 0000000..fb2c05f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_log_s_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_logs.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_logs.gif
new file mode 100644
index 0000000..afe0104
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_logs.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match.gif
new file mode 100644
index 0000000..215571f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match_d.gif
new file mode 100644
index 0000000..6e4c364
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_match_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_minus.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_minus.gif
new file mode 100755
index 0000000..417544f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_minus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_open.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_open.gif
new file mode 100755
index 0000000..ac3da14
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_open.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other.gif
new file mode 100755
index 0000000..e6f780f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other_d.gif
new file mode 100755
index 0000000..b08d970
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_other_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp.gif
new file mode 100755
index 0000000..96acaf3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp_d.gif
new file mode 100755
index 0000000..7d7d00e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_parp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass.gif
new file mode 100755
index 0000000..fe1bb0d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_add.gif
new file mode 100755
index 0000000..f7f4c20
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_d.gif
new file mode 100755
index 0000000..6adc431
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_pass_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus.gif
new file mode 100755
index 0000000..2a94eeb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl.gif
new file mode 100755
index 0000000..8dcd7c0
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl_p.gif
new file mode 100755
index 0000000..0c79849
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_bl_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_d.gif
new file mode 100755
index 0000000..ebc7457
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_mo.gif
new file mode 100755
index 0000000..1c7ca08
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_p.gif
new file mode 100755
index 0000000..eb41284
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_plus_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall.gif
new file mode 100755
index 0000000..d78b867
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_d.gif
new file mode 100755
index 0000000..13658f7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_mo.gif
new file mode 100755
index 0000000..90b576e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg.gif
new file mode 100755
index 0000000..9aebb03
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_d.gif
new file mode 100755
index 0000000..4ab4992
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_mo.gif
new file mode 100755
index 0000000..7025d20
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_pkg_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml.gif
new file mode 100755
index 0000000..4542432
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_d.gif
new file mode 100755
index 0000000..8d3a68d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_mo.gif
new file mode 100755
index 0000000..15e0aed
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reinstall_xml_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject.gif
new file mode 100755
index 0000000..5565cd6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject_d.gif
new file mode 100755
index 0000000..6c09fae
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_reject_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_right.gif
new file mode 100755
index 0000000..fdf2d8b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart.gif
new file mode 100755
index 0000000..e49fbd7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart_d.gif
new file mode 100755
index 0000000..a5d6d7c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_restart_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_running.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_running.gif
new file mode 100644
index 0000000..543fd56
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_running.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start.gif
new file mode 100755
index 0000000..09bb58f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start_d.gif
new file mode 100755
index 0000000..f58f111
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_start_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_status.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_status.gif
new file mode 100644
index 0000000..a93bcfb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_status.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop.gif
new file mode 100755
index 0000000..922addc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop_d.gif
new file mode 100755
index 0000000..b4cfdea
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stop_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stopped.gif
new file mode 100644
index 0000000..f93a25d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_service_stopped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_restart_mo.gif
new file mode 100755
index 0000000..a092b40
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_restart_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_start_mo.gif
new file mode 100755
index 0000000..ecdb58f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_start_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_stop_mo.gif
new file mode 100755
index 0000000..c00e208
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_services_stop_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group-grey.png
new file mode 100755
index 0000000..d7b964d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group.png
new file mode 100755
index 0000000..1c974f2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-group.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user-grey.png
new file mode 100755
index 0000000..2f6047d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user.png
new file mode 100755
index 0000000..ef82156
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system-user.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_lock_screen.png
new file mode 100755
index 0000000..30f306d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_lock_screen.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_logout.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_logout.png
new file mode 100755
index 0000000..9bbb6c7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_system_logout.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped.gif
new file mode 100755
index 0000000..ffeb2cd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped_p.gif
new file mode 100755
index 0000000..6d46aaf
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_trapped_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule.gif
new file mode 100755
index 0000000..e15ab6c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule_d.gif
new file mode 100755
index 0000000..f776281
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_ts_rule_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up.gif
new file mode 100755
index 0000000..883c5a2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_d.gif
new file mode 100755
index 0000000..0ddcce2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_mo.gif
new file mode 100755
index 0000000..9f869a4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_up_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan.gif
new file mode 100755
index 0000000..1f0addc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan_d.gif
new file mode 100755
index 0000000..35bf580
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wlan_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wol_all.gif
new file mode 100755
index 0000000..2d22182
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wol_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_nsaved.png
new file mode 100755
index 0000000..21cb27d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_nsaved.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_saved.png
new file mode 100755
index 0000000..ab82946
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_wzd_saved.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x.gif
new file mode 100755
index 0000000..24e4d49
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_d.gif
new file mode 100755
index 0000000..d2bfbc8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_mo.gif
new file mode 100755
index 0000000..da7b57c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_p.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_p.gif
new file mode 100755
index 0000000..8828fa6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/icon_x_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out_d.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/icons/out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/log.png b/src/usr/local/www/themes/pfsense_ng_fs/images/log.png
new file mode 100755
index 0000000..762ba80
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/log.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/logo.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/logo.gif
new file mode 100755
index 0000000..e5da95c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/logo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/logobig.jpg b/src/usr/local/www/themes/pfsense_ng_fs/images/logobig.jpg
new file mode 100755
index 0000000..2ef196d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/logobig.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-down.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-down.gif
new file mode 100755
index 0000000..e59432a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-right.gif
new file mode 100755
index 0000000..14298a1
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenu-right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenuitem.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenuitem.gif
new file mode 100755
index 0000000..6e97478
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/mainmenuitem.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menu-dot.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/menu-dot.gif
new file mode 100755
index 0000000..c76609b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/menu-dot.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menu_footer.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/menu_footer.gif
new file mode 100755
index 0000000..d06faa4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/menu_footer.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menu_right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/menu_right.gif
new file mode 100755
index 0000000..881327c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/menu_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr.png b/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr.png
new file mode 100755
index 0000000..45e0ec7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_footer.png b/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_footer.png
new file mode 100755
index 0000000..fdff49f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_footer.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_highlight.png b/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_highlight.png
new file mode 100755
index 0000000..05f4832
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/menubgr_highlight.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_blue.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_blue.gif
new file mode 100755
index 0000000..741186a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_blue.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_gray.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_gray.gif
new file mode 100755
index 0000000..e86e245
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_gray.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_left.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_left.gif
new file mode 100755
index 0000000..af751fa
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_right.gif
new file mode 100755
index 0000000..ff12d9e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bar_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_minus.png
new file mode 100755
index 0000000..37db2fd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_minus.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_plus.png
new file mode 100755
index 0000000..fba7af9
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/bullet_toggle_plus.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/button.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/button.gif
new file mode 100755
index 0000000..e85dbb3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/button.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/graph.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/graph.png
new file mode 100755
index 0000000..507ec75
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/graph.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_128.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_128.gif
new file mode 100755
index 0000000..ea5ae34
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_128.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_152.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_152.gif
new file mode 100755
index 0000000..6c7fc03
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_152.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_256.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_256.gif
new file mode 100755
index 0000000..3e1c377
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_256.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_64.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_64.gif
new file mode 100755
index 0000000..87892bd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/key_64.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/left_background.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/left_background.gif
new file mode 100755
index 0000000..529d827
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/left_background.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader.gif
new file mode 100755
index 0000000..5d10ac3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_all.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_all.gif
new file mode 100755
index 0000000..cb6bc0c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_filter.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_filter.gif
new file mode 100755
index 0000000..b838b17
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_tab.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_tab.gif
new file mode 100755
index 0000000..05bb04c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/loader_tab.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/logon.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/logon.png
new file mode 100755
index 0000000..98aa37a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/logon.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/progress_bar.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/progress_bar.gif
new file mode 100755
index 0000000..3b4aa52
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/progress_bar.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/rrd_error.png b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/rrd_error.png
new file mode 100755
index 0000000..a79ecf3
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/rrd_error.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_alerter.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_alerter.gif
new file mode 100755
index 0000000..7ff1e95
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_alerter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_carpmaster.gif
new file mode 100755
index 0000000..2c32908
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_carpmaster.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_left.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_left.gif
new file mode 100755
index 0000000..b5a2930
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_page_loading.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_page_loading.gif
new file mode 100755
index 0000000..067ef18
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_page_loading.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_all.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_all.gif
new file mode 100755
index 0000000..72de6bd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_filter.gif
new file mode 100755
index 0000000..d72761a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_reload_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_right.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_right.gif
new file mode 100755
index 0000000..bf66fdb
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/status_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c.gif
new file mode 100755
index 0000000..317b758
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c_black.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c_black.gif
new file mode 100755
index 0000000..309846e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_c_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o.gif
new file mode 100755
index 0000000..eb95c32
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o_black.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o_black.gif
new file mode 100755
index 0000000..f818f3b
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/tri_o_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/misc/widget_loader.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/widget_loader.gif
new file mode 100755
index 0000000..ca35e2a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/misc/widget_loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/new_tab_menu.png b/src/usr/local/www/themes/pfsense_ng_fs/images/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/status.png b/src/usr/local/www/themes/pfsense_ng_fs/images/status.png
new file mode 100755
index 0000000..a3e368e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/status.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/transparent.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/transparent.gif
new file mode 100755
index 0000000..89c5530
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/transparent.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/images/transparent_pixel.gif b/src/usr/local/www/themes/pfsense_ng_fs/images/transparent_pixel.gif
new file mode 100755
index 0000000..35d42e8
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/images/transparent_pixel.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/blank.gif b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/blank.gif
new file mode 100755
index 0000000..a4fe2e6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/blank.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-box-model.js
new file mode 100644
index 0000000..45543f6
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-box-model.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-core.js
new file mode 100644
index 0000000..b11e2b1
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-core.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css-strict.js
new file mode 100644
index 0000000..4406d7a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css-strict.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css2.js
new file mode 100644
index 0000000..7121c8e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css2.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css3.js
new file mode 100644
index 0000000..86b24f5
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-css3.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-fixed.js
new file mode 100644
index 0000000..4321cda
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-fixed.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-html4.js
new file mode 100644
index 0000000..4d2baa9
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-html4.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-ie5.js
new file mode 100644
index 0000000..707fa56
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-ie5.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite-p.js
new file mode 100644
index 0000000..3a66d19
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite.js
new file mode 100644
index 0000000..88c764f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-lite.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-png.js
new file mode 100644
index 0000000..7b8f2cf
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-png.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-server.css
new file mode 100644
index 0000000..47c7edd
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-server.css
@@ -0,0 +1,43 @@
+body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
+body {margin: 8px; background: #333;}
+h1 {margin: 0;}
+h1 a:hover {background-color: transparent;}
+h2 {font-size: 1.75em;}
+h3 {font-size: 1.1em;}
+a:active {color: #ff0000;}
+a:link {color: #0a6cce;}
+a:visited {color: #0a6cce;}
+code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
+ padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
+code.box {display: block; padding: 10px; margin: 0.5em 0;}
+ul {list-style-type: square;}
+dd {margin: .2em 0 .5em 1em;}
+dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
+dl.library dd {font-style: italic; margin-left: 3em;}
+dt {font-weight: bold;}
+dt.pack {color: brown;}
+a img {border-style: none;}
+hr {height: 1px; color: #000; border-style: solid;}
+hr.short {height: 2px; width: 100px;}
+div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
+hr {border-bottom-width: 0px;}
+div.header hr {color: #0a6cce; background-color: #0a6cce;}
+div.content {min-height: 100px;}
+div.footer hr {color: #898e79; background-color: #898e79; }
+div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
+a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
+div.footer a:hover {background-color: transparent; text-decoration: none;}
+div.header .menu {text-align: right;}
+div.footer {font-size: x-small; margin-top: 8px;}
+div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
+#license {margin-top: 5px; font-size: xx-small;}
+table {border-top: 1px solid #000; border-left: 1px solid #000;}
+th {background-color: #fff; text-align: left;}
+th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
+th.small {width: 100px;}
+th.medium {width: 200px;}
+th.large {width: 270px;}
+th.x-large {width: 408px;}
+table.fixed {table-layout: fixed;}
+span.comment {color: #666;}
+
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard-p.js
new file mode 100644
index 0000000..73e99ac
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard.js
new file mode 100644
index 0000000..2109905
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/ie7-standard.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/test-trans.png b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/test-trans.png
new file mode 100755
index 0000000..e187e2c
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/ie7/test-trans.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/grey-40.png b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/grey-40.png
new file mode 100755
index 0000000..758b716
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/grey-40.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-off.gif b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-off.gif
new file mode 100755
index 0000000..ddcdcae
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-off.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-on.gif b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-on.gif
new file mode 100755
index 0000000..7a58077
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/submenu-on.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/white-90.png b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/white-90.png
new file mode 100755
index 0000000..efc84b4
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/white-90.png
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/x.gif b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/x.gif
new file mode 100755
index 0000000..5bfd67a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/img/x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/niftyjsCode.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/niftyjsCode.js
new file mode 100644
index 0000000..e71ea14
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-body.php b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-body.php
new file mode 100644
index 0000000..afb7090
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-body.php
@@ -0,0 +1,51 @@
+<?php
+/* $Id: transmenu-body.php,v 1.1.2.1 2007/01/17 18:43:47 sullrich Exp $ */
+/* ========================================================================== */
+/*
+ transmenu-body.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetBodyJS() {
+ global $rootmenu;
+
+ if (isset($rootmenu)) {
+ return $rootmenu->getMenuJScript();
+ } else if (empty($rootmenu)) {
+ return "alert('No rootmenu object found.');";
+ } else {
+ return "alert('No JavaScript attached to rootmenu object.');";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-head.php b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-head.php
new file mode 100644
index 0000000..afc6402
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu-head.php
@@ -0,0 +1,85 @@
+<?php
+/* $Id: transmenu-head.php,v 1.2.2.1 2007/01/17 18:43:47 sullrich Exp $ */
+/* ========================================================================== */
+/*
+ transmenu-head.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetHeadJS() {
+ global $g, $rootmenu;
+
+ $transmenu_stub =<<<EOD
+ function tmenuinit() {
+ //==========================================================================================
+ // if supported, initialize TransMenus
+ //==========================================================================================
+ // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
+ // This is better than server-side checking because it will also catch browsers which would
+ // normally support the menus but have javascript disabled.
+ //
+ // If supported, call initialize() and then hook whatever image rollover code you need to do
+ // to the .onactivate and .ondeactivate events for each menu.
+ //==========================================================================================
+ if (TransMenu.isSupported()) {
+ TransMenu.initialize();
+
+ // hook all the highlight swapping of the main toolbar to menu activation/deactivation
+ // instead of simple rollover to get the effect where the button stays hightlit until
+ // the menu is closed.
+ @@CHILD_JSCRIPT@@
+ }
+ } // end function
+EOD;
+
+ if (empty($rootmenu)) {
+ require_once("menudef.inc");
+ }
+
+ $childJScript = "";
+ foreach ($rootmenu->getChildren() as $component) {
+ $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
+
+ $childJScript .=<<<EOD
+ {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
+ {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
+
+EOD;
+ }
+
+ $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
+
+ return $transmenu_stub;
+}
+
+?>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu.org b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu.org
new file mode 100644
index 0000000..6c9e353
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenu.org
@@ -0,0 +1,785 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ *
+ * Customizable multi-level animated DHTML menus with transparency.
+ *
+ * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * =================================================================================================
+ * updates:
+ * 04.19.04 fixed cascade problem with menus nested greater than two levels.
+ * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
+ * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
+ * also made gecko check a little more strict by specifying build no.
+ * ============================================================================================== */
+
+
+
+//==================================================================================================
+// Configuration properties
+//==================================================================================================
+TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
+TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
+TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
+TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
+TransMenu.menuPadding = 5; // padding between menu border and items grid
+TransMenu.itemPadding = 3; // additional padding around each item
+TransMenu.shadowSize = 2; // size of shadow under menu
+TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
+TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
+TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
+TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
+TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
+TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
+TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
+
+
+//==================================================================================================
+// Internal use properties
+//==================================================================================================
+TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
+TransMenu.direction = {down:1,right:2};
+TransMenu.registry = [];
+TransMenu._maxZ = 100;
+
+
+
+//==================================================================================================
+// Static methods
+//==================================================================================================
+// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
+TransMenu.isSupported = function() {
+ var ua = navigator.userAgent.toLowerCase();
+ var pf = navigator.platform.toLowerCase();
+ var an = navigator.appName;
+ var r = false;
+
+ if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
+ else if (an == "Microsoft Internet Explorer") {
+ if (document.getElementById) { // ie5.1+ mac,win
+ if (pf.indexOf("mac") == 0) {
+ r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
+ }
+ else r = true;
+ }
+ }
+
+ return r;
+}
+
+// call this in onload once menus have been created
+TransMenu.initialize = function() {
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ menu.initialize();
+ }
+}
+
+// call this in document body to write out menu html
+TransMenu.renderAll = function() {
+ var aMenuHtml = [];
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ aMenuHtml[i] = menu.toString();
+ }
+ document.write(aMenuHtml.join(""));
+}
+
+//==================================================================================================
+// TransMenu constructor (only called internally)
+//==================================================================================================
+// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
+// reference to an HTML element, or a TransMenuItem from an existing menu.
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menu from actuator
+// iTop : Top pixel offset of menu from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+// parentMenuSet : Menuset this menu will be added to.
+//==================================================================================================
+function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
+ // public methods
+ this.addItem = addItem;
+ this.addMenu = addMenu;
+ this.toString = toString;
+ this.initialize = initialize;
+ this.isOpen = false;
+ this.show = show;
+ this.hide = hide;
+ this.items = [];
+
+ // events
+ this.onactivate = new Function(); // when the menu starts to slide open
+ this.ondeactivate = new Function(); // when the menu finishes sliding closed
+ this.onmouseover = new Function(); // when the menu has been moused over
+ this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
+ this.ondequeue = new Function();
+
+ // initialization
+ this.index = TransMenu.registry.length;
+ TransMenu.registry[this.index] = this;
+
+ var id = "TransMenu" + this.index;
+ var contentHeight = null;
+ var contentWidth = null;
+ var childMenuSet = null;
+ var animating = false;
+ var childMenus = [];
+ var slideAccel = -1;
+ var elmCache = null;
+ var ready = false;
+ var _this = this;
+ var a = null;
+
+ var pos = iDirection == TransMenu.direction.down ? "top" : "left";
+ var dim = null;
+
+ // private and public method implimentations
+ function addItem(sText, sUrl) {
+ var item = new TransMenuItem(sText, sUrl, this);
+ item._index = this.items.length;
+ this.items[item._index] = item;
+ }
+
+ function addMenu(oMenuItem) {
+ if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
+
+ if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
+
+ var m = childMenuSet.addMenu(oMenuItem);
+
+ childMenus[oMenuItem._index] = m;
+ m.onmouseover = child_mouseover;
+ m.ondeactivate = child_deactivate;
+ m.onqueue = child_queue;
+ m.ondequeue = child_dequeue;
+
+ return m;
+ }
+
+ function initialize() {
+ initCache();
+ initEvents();
+ initSize();
+ ready = true;
+ }
+
+ function show() {
+ //dbg_dump("show");
+ if (ready) {
+ _this.isOpen = true;
+ animating = true;
+ setContainerPos();
+ elmCache["clip"].style.visibility = "visible";
+ elmCache["clip"].style.zIndex = TransMenu._maxZ++;
+ //dbg_dump("maxZ: " + TransMenu._maxZ);
+ slideStart();
+ _this.onactivate();
+ }
+ }
+
+ function hide() {
+ if (ready) {
+ _this.isOpen = false;
+ animating = true;
+
+ for (var i = 0, item = null; item = elmCache.item[i]; i++)
+ dehighlight(item);
+
+ if (childMenuSet) childMenuSet.hide();
+
+ slideStart();
+ _this.ondeactivate();
+ }
+ }
+
+ function setContainerPos() {
+ var sub = oActuator.constructor == TransMenuItem;
+ var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
+ var el = act;
+
+ var x = 0;
+ var y = 0;
+
+
+ var minX = 0;
+ var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
+ var minY = 0;
+ var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
+
+ // add up all offsets... subtract any scroll offset
+ while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
+ x += el.offsetLeft;
+ y += el.offsetTop;
+
+ if (el.scrollLeft) x -= el.scrollLeft;
+ if (el.scrollTop) y -= el.scrollTop;
+
+ el = el.offsetParent;
+ }
+
+ if (oActuator.constructor == TransMenuItem) {
+ x += parseInt(el.parentNode.style.left);
+ y += parseInt(el.parentNode.style.top);
+ }
+
+ switch (iReferencePoint) {
+ case TransMenu.reference.topLeft:
+ break;
+ case TransMenu.reference.topRight:
+ x += act.offsetWidth;
+ break;
+ case TransMenu.reference.bottomLeft:
+ y += act.offsetHeight;
+ break;
+ case TransMenu.reference.bottomRight:
+ x += act.offsetWidth;
+ y += act.offsetHeight;
+ break;
+ }
+
+ x += iLeft;
+ y += iTop;
+
+ x = Math.max(Math.min(x, maxX), minX);
+ y = Math.max(Math.min(y, maxY), minY);
+
+ elmCache["clip"].style.left = x + "px";
+ elmCache["clip"].style.top = y + "px";
+ }
+
+ function slideStart() {
+ var x0 = parseInt(elmCache["content"].style[pos]);
+ var x1 = _this.isOpen ? 0 : -dim;
+
+ if (a != null) a.stop();
+ a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
+
+ a.onframe = slideFrame;
+ a.onend = slideEnd;
+
+ a.start();
+ }
+
+ function slideFrame(x) {
+ elmCache["content"].style[pos] = x + "px";
+ }
+
+ function slideEnd() {
+ if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
+ animating = false;
+ }
+
+ function initSize() {
+ // everything is based off the size of the items table...
+ var ow = elmCache["items"].offsetWidth;
+ var oh = elmCache["items"].offsetHeight;
+ var ua = navigator.userAgent.toLowerCase();
+
+ // clipping container should be ow/oh + the size of the shadow
+ elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
+ elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
+
+ // same with content...
+ elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
+ elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
+
+ contentHeight = oh + TransMenu.shadowSize;
+ contentWidth = ow + TransMenu.shadowSize;
+
+ dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
+
+ // set initially closed
+ elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
+ elmCache["clip"].style.visibility = "hidden";
+
+ // if *not* mac/ie 5
+ if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
+ // set background div to offset size
+ elmCache["background"].style.width = ow + "px";
+ elmCache["background"].style.height = oh + "px";
+ elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
+ elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
+ elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
+ }
+ // mac ie is a little different because we use a PNG for the transparency
+ else {
+ // set background div to offset size
+ elmCache["background"].firstChild.src = TransMenu.backgroundPng;
+ elmCache["background"].firstChild.width = ow;
+ elmCache["background"].firstChild.height = oh;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
+ elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
+ elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
+ }
+ }
+
+ function initCache() {
+ var menu = document.getElementById(id);
+ var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
+
+ elmCache = {};
+ elmCache["clip"] = menu;
+ elmCache["item"] = [];
+
+ for (var i = 0, elm = null; elm = all[i]; i++) {
+ switch (elm.className) {
+ case "items":
+ case "content":
+ case "background":
+ case "shadowRight":
+ case "shadowBottom":
+ elmCache[elm.className] = elm;
+ break;
+ case "item":
+ elm._index = elmCache["item"].length;
+ elmCache["item"][elm._index] = elm;
+ break;
+ }
+ }
+
+ // hack!
+ _this.elmCache = elmCache;
+ }
+
+ function initEvents() {
+ // hook item mouseover
+ for (var i = 0, item = null; item = elmCache.item[i]; i++) {
+ item.onmouseover = item_mouseover;
+ item.onmouseout = item_mouseout;
+ item.onclick = item_click;
+ }
+
+ // hook actuation
+ if (typeof oActuator.tagName != "undefined") {
+ oActuator.onmouseover = actuator_mouseover;
+ oActuator.onmouseout = actuator_mouseout;
+ }
+
+ // hook menu mouseover
+ elmCache["content"].onmouseover = content_mouseover;
+ elmCache["content"].onmouseout = content_mouseout;
+ }
+
+ function highlight(oRow) {
+ oRow.className = "item hover";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
+ }
+
+ function dehighlight(oRow) {
+ oRow.className = "item";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
+ }
+
+ function item_mouseover() {
+ if (!animating) {
+ highlight(this);
+
+ if (childMenus[this._index])
+ childMenuSet.showMenu(childMenus[this._index]);
+ else if (childMenuSet) childMenuSet.hide();
+ }
+ }
+
+ function item_mouseout() {
+ if (!animating) {
+ if (childMenus[this._index])
+ childMenuSet.hideMenu(childMenus[this._index]);
+ else // otherwise child_deactivate will do this
+ dehighlight(this);
+ }
+ }
+
+ function item_click() {
+ if (!animating) {
+ if (_this.items[this._index].url)
+ location.href = _this.items[this._index].url;
+ }
+ }
+
+ function actuator_mouseover() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function actuator_mouseout() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function content_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ _this.onmouseover();
+ }
+ }
+
+ function content_mouseout() {
+ if (!animating) {
+ parentMenuSet.hideMenu(_this);
+ }
+ }
+
+ function child_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ }
+ }
+
+ function child_deactivate() {
+ for (var i = 0; i < childMenus.length; i++) {
+ if (childMenus[i] == this) {
+ dehighlight(elmCache["item"][i]);
+ break;
+ }
+ }
+ }
+
+ function child_queue() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function child_dequeue() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function toString() {
+ var aHtml = [];
+ var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
+
+ for (var i = 0, item = null; item = this.items[i]; i++) {
+ aHtml[i] = item.toString(childMenus[i]);
+ }
+
+ return '<div id="' + id + '" class="' + sClassName + '">' +
+ '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
+ aHtml.join('') +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
+ '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '</div></div>';
+ }
+}
+
+
+//==================================================================================================
+// TransMenuSet
+//==================================================================================================
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menus from actuator
+// iTop : Top pixel offset of menus from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+//==================================================================================================
+TransMenuSet.registry = [];
+
+function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
+ // public methods
+ this.addMenu = addMenu;
+ this.showMenu = showMenu;
+ this.hideMenu = hideMenu;
+ this.hide = hide;
+ this.hideCurrent = hideCurrent;
+
+ // initialization
+ var menus = [];
+ var _this = this;
+ var current = null;
+
+ this.index = TransMenuSet.registry.length;
+ TransMenuSet.registry[this.index] = this;
+
+ // method implimentations...
+ function addMenu(oActuator) {
+ var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
+ menus[menus.length] = m;
+ return m;
+ }
+
+ function showMenu(oMenu) {
+ if (oMenu != current) {
+ // close currently open menu
+ if (current != null) hide(current);
+
+ // set current menu to this one
+ current = oMenu;
+
+ // if this menu is closed, open it
+ oMenu.show();
+ }
+ else {
+ // hide pending calls to close this menu
+ cancelHide(oMenu);
+ }
+ }
+
+ function hideMenu(oMenu) {
+ //dbg_dump("hideMenu a " + oMenu.index);
+ if (current == oMenu && oMenu.isOpen) {
+ //dbg_dump("hideMenu b " + oMenu.index);
+ if (!oMenu.hideTimer) scheduleHide(oMenu);
+ }
+ }
+
+ function scheduleHide(oMenu) {
+ //dbg_dump("scheduleHide " + oMenu.index);
+ oMenu.onqueue();
+ oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
+ }
+
+ function cancelHide(oMenu) {
+ //dbg_dump("cancelHide " + oMenu.index);
+ if (oMenu.hideTimer) {
+ oMenu.ondequeue();
+ window.clearTimeout(oMenu.hideTimer);
+ oMenu.hideTimer = null;
+ }
+ }
+
+ function hide(oMenu) {
+ if (!oMenu && current) oMenu = current;
+
+ if (oMenu && current == oMenu && oMenu.isOpen) {
+ hideCurrent();
+ }
+ }
+
+ function hideCurrent() {
+ if (null != current) {
+ cancelHide(current);
+ current.hideTimer = null;
+ current.hide();
+ current = null;
+ }
+ }
+}
+
+//==================================================================================================
+// TransMenuItem (internal)
+// represents an item in a dropdown
+//==================================================================================================
+// sText : The item display text
+// sUrl : URL to load when the item is clicked
+// oParent : Menu this item is a part of
+//==================================================================================================
+function TransMenuItem(sText, sUrl, oParent) {
+ this.toString = toString;
+ this.text = sText;
+ this.url = sUrl;
+ this.parentMenu = oParent;
+
+ function toString(bDingbat) {
+ var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
+ var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
+ var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
+ var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
+
+ return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
+ sText + '</td><td width="14" style="' + sPaddingRight + '">' +
+ '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
+ }
+}
+
+
+
+
+
+
+//=====================================================================
+// Accel[erated] [an]imation object
+// change a property of an object over time in an accelerated fashion
+//=====================================================================
+// obj : reference to the object whose property you'd like to animate
+// prop : property you would like to change eg: "left"
+// to : final value of prop
+// time : time the animation should take to run
+// zip : optional. specify the zippiness of the acceleration. pick a
+// number between -1 and 1 where -1 is full decelerated, 1 is
+// full accelerated, and 0 is linear (no acceleration). default
+// is 0.
+// unit : optional. specify the units for use with prop. default is
+// "px".
+//=====================================================================
+// bezier functions lifted from the lib_animation.js file in the
+// 13th Parallel API. www.13thparallel.org
+//=====================================================================
+
+function Accelimation(from, to, time, zip) {
+ if (typeof zip == "undefined") zip = 0;
+ if (typeof unit == "undefined") unit = "px";
+
+ this.x0 = from;
+ this.x1 = to;
+ this.dt = time;
+ this.zip = -zip;
+ this.unit = unit;
+ this.timer = null;
+ this.onend = new Function();
+ this.onframe = new Function();
+}
+
+
+
+//=====================================================================
+// public methods
+//=====================================================================
+
+// after you create an accelimation, you call this to start it-a runnin'
+Accelimation.prototype.start = function() {
+ this.t0 = new Date().getTime();
+ this.t1 = this.t0 + this.dt;
+ var dx = this.x1 - this.x0;
+ this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
+ this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
+ Accelimation._add(this);
+}
+
+// and if you need to stop it early for some reason...
+Accelimation.prototype.stop = function() {
+ Accelimation._remove(this);
+}
+
+
+
+//=====================================================================
+// private methods
+//=====================================================================
+
+// paints one frame. gets called by Accelimation._paintAll.
+Accelimation.prototype._paint = function(time) {
+ if (time < this.t1) {
+ var elapsed = time - this.t0;
+ this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
+ }
+ else this._end();
+}
+
+// ends the animation
+Accelimation.prototype._end = function() {
+ Accelimation._remove(this);
+ this.onframe(this.x1);
+ this.onend();
+}
+
+
+
+
+//=====================================================================
+// static methods (all private)
+//=====================================================================
+
+// add a function to the list of ones to call periodically
+Accelimation._add = function(o) {
+ var index = this.instances.length;
+ this.instances[index] = o;
+ // if this is the first one, start the engine
+ if (this.instances.length == 1) {
+ this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
+ }
+}
+
+// remove a function from the list
+Accelimation._remove = function(o) {
+ for (var i = 0; i < this.instances.length; i++) {
+ if (o == this.instances[i]) {
+ this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
+ break;
+ }
+ }
+ // if that was the last one, stop the engine
+ if (this.instances.length == 0) {
+ window.clearInterval(this.timerID);
+ this.timerID = null;
+ }
+}
+
+// "engine" - call each function in the list every so often
+Accelimation._paintAll = function() {
+ var now = new Date().getTime();
+ for (var i = 0; i < this.instances.length; i++) {
+ this.instances[i]._paint(now);
+ }
+}
+
+
+// Bezier functions:
+Accelimation._B1 = function(t) { return t*t*t }
+Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
+Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
+Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
+
+
+//Finds the coordinates of a point at a certain stage through a bezier curve
+Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
+ return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
+}
+
+
+//=====================================================================
+// static properties
+//=====================================================================
+
+Accelimation.instances = [];
+Accelimation.targetRes = 10;
+Accelimation.timerID = null;
+
+
+//=====================================================================
+// IE win memory cleanup
+//=====================================================================
+
+if (window.attachEvent) {
+ var cearElementProps = [
+ 'data',
+ 'onmouseover',
+ 'onmouseout',
+ 'onmousedown',
+ 'onmouseup',
+ 'ondblclick',
+ 'onclick',
+ 'onselectstart',
+ 'oncontextmenu'
+ ];
+
+ window.attachEvent("onunload", function() {
+ var el;
+ for(var d = document.all.length;d--;){
+ el = document.all[d];
+ for(var c = cearElementProps.length;c--;){
+ el[cearElementProps[c]] = null;
+ }
+ }
+ });
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenuC.js b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenuC.js
new file mode 100644
index 0000000..88626c7
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/javascript/transmenuC.js
@@ -0,0 +1,86 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ * Customizable multi-level animated DHTML menus with transparency.
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * ============================================================================================== */
+TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
+else r=true;}}
+return r;}
+TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
+TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
+document.write(aMenuHtml.join(""));}
+function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
+function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
+function initialize(){initCache();initEvents();initSize();ready=true;}
+function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
+function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
+function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
+if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
+switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
+x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
+function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
+function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
+function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
+function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
+else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
+function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
+_this.elmCache=elmCache;}
+function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
+if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
+elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
+function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
+function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
+function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
+function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
+function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
+function actuator_mouseover(){parentMenuSet.showMenu(_this);}
+function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
+function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
+function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
+function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
+function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
+function child_queue(){parentMenuSet.hideMenu(_this);}
+function child_dequeue(){parentMenuSet.showMenu(_this);}
+function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
+return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
+TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
+function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
+else{cancelHide(oMenu);}}
+function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
+function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
+function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
+function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
+function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
+function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
+var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
+return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
+function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
+Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
+Accelimation.prototype.stop=function(){Accelimation._remove(this);}
+Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
+else this._end();}
+Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
+Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
+Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
+if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
+Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
+Accelimation._B1=function(t){return t*t*t}
+Accelimation._B2=function(t){return 3*t*t*(1-t)}
+Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
+Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
+Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
+Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
+if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/jsevents/body.def b/src/usr/local/www/themes/pfsense_ng_fs/jsevents/body.def
new file mode 100644
index 0000000..df461e2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/jsevents/body.def
@@ -0,0 +1,7 @@
+# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
+# where: forbidden pages are those pages that should *not* use
+# the particular JavaScript function within the JS event
+# specified below.
+# $Id: body.def,v 1.2.2.1 2007/01/17 18:43:52 sullrich Exp $
+#
+onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/loader.js b/src/usr/local/www/themes/pfsense_ng_fs/loader.js
new file mode 100644
index 0000000..c8ebe60
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/loader.js
@@ -0,0 +1,294 @@
+//<![CDATA[
+var browser = '';
+var version = '';
+var entrance = '';
+var cond = '';
+
+// BROWSER?
+if (browser == '')
+{
+ if (navigator.appName.indexOf('Microsoft') != -1)
+ browser = 'IE';
+ else if (navigator.appName.indexOf('Netscape') != -1)
+ browser = 'Netscape';
+ else
+ browser = 'IE';
+}
+if (version == '')
+{
+ version= navigator.appVersion;
+ paren = version.indexOf('(');
+ whole_version = navigator.appVersion.substring(0,paren-1);
+ version = parseInt(whole_version);
+}
+
+if (browser == 'IE' && version < 7)
+ document.write('<script type="text/javascript" src="/themes/pfsense_ng/javascript/ie7/ie7-standard-p.js"></script>');
+
+document.write('<script type="text/javascript" src="/themes/pfsense_ng/javascript/niftyjsCode.js"></script>');
+
+///////////////////////////////////////////
+// jQuery code for columns / widgets part 1
+///////////////////////////////////////////
+
+var noCols = 2;
+var printed3 = false;
+var printed4 = false;
+var printed5 = false;
+var printed6 = false;
+var printed7 = false;
+var printed8 = false;
+var printed9 = false;
+var printed10 = false;
+var id;
+var noColsOnLoad = noCols; // holds a reference to the number of displayed columns on load
+var existing =[]; // array to hold each columns contents
+var specifiedColWidth = 350; // width of columns for resizing
+
+///////////////////////////////////////////
+// jQuery Widget functions
+///////////////////////////////////////////
+
+// function to connect all columns to each other to allow jQuery interaction (drag and droppable)
+function connectColumns()
+{
+ jQuery('.ui-sortable').sortable({connectWith: '.ui-sortable', dropOnEmpty: true, handle: '.widgetheader', change: showSave});
+}
+
+// function to add columns due to a window resize
+function resizeAddColumns()
+{
+ if(noColsOnLoad > noCols) // if a column has previously been deleted
+ {
+ var maxCols = maxColsToDisplay(); // the maximum we can display
+
+ if(noColsOnLoad < maxCols) // if the number of columns on load is less then the maximum number of columns we can display
+ maxCols = noColsOnLoad; // change the maximum number of columns as we do not want to display them all
+ if( (maxCols - noCols) > 0 ) // if we need to add more columns
+ {
+ replaceColumn();
+
+ for(var i=noCols; i<maxCols; i++)
+ {
+ var addCols = i +1;
+ jQuery('#col' + (i).toString() ).after("<div id=\"col" + addCols + "\" style=\"float: left; padding-bottom: 40px\" class=\"ui-sortable\"> </div>");
+ jQuery(existing[i]).appendTo('#col' + addCols ); // append onLoad contents
+ }
+ noCols = maxCols;
+ for(var i=noCols; i<noColsOnLoad ; i++)
+ {
+ jQuery(existing[i]).appendTo('#col' + maxCols ); // append widgets from stored array to columns
+ }
+ correctWidgetDisplay(noCols);
+ connectColumns();
+ showSave();
+ }
+ }
+}
+
+
+// function to remove columns due to a window resize
+function resizeRmColumns()
+{
+ if( noCols > 1 ) // keep at least 1 column displayed at all times
+ {
+ var maxCols = maxColsToDisplay();
+ var noColsToDel = noCols - maxCols;
+
+ if(noColsToDel>0) // if columns need deleteing
+ {
+ for(var i=(noCols-noColsToDel); i<noColsOnLoad; i++)
+ {
+ jQuery(existing[i]).appendTo('#col' + maxCols ); // append widgets from stored array to columns
+ }
+ for(var i=0; i<noColsToDel; i++ )
+ {
+ var del = noCols -i;
+ jQuery('#col' + del ).remove(); // remove columns
+ }
+ noCols = maxCols;
+ correctWidgetDisplay(noCols);
+ showSave();
+ }
+ }
+};
+
+
+// functions to removes the highest value column current displayed and replaces it with the same column number on load ie before any resizing took place
+function replaceColumn()
+{
+ var tmpReplace = noCols -1;
+ jQuery('#col' + noCols ).remove();
+
+ // prepend column1 as we can't add it AFTER a column as none will exist
+ if(tmpReplace==0)
+ jQuery("#niftyOutter").prepend("<div id=\"col1\" style=\"float: left; padding-bottom: 40px\" class=\"ui-sortable\"> </div>");
+ else
+ jQuery('#col' + (tmpReplace).toString() ).after("<div id=\"col" + noCols + "\" style=\"float: left; padding-bottom: 40px\" class=\"ui-sortable\"> </div>");
+ jQuery(existing[tmpReplace]).appendTo('#col' + noCols);
+}
+
+
+// function to calculate & return the maximum number of columns we can display
+function maxColsToDisplay()
+{
+ var niftyWidth = jQuery('#niftyOutter.fakeClass').width();
+ return Math.round(niftyWidth / specifiedColWidth);
+}
+
+// function to amend the widget width
+function correctWidgetDisplay(noCols)
+{
+ var percent = ( 100 / noCols ) - 0.1;
+ var percentStr = percent.toString() + '%';
+
+ // set all column widths
+ jQuery('.ui-sortable').width(percentStr);
+}
+
+// function to insert a new column we can place content into (from saved state)
+function printColumn(newNum)
+{
+ if(newNum > noCols)
+ {
+ noCols = newNum;
+ noColsOnLoad = noCols;
+ }
+
+ document.write("</div><div id=\"col" + newNum + "\" style=\"float:left; padding-bottom:40px\" class=\"ui-sortable\">");
+ correctWidgetDisplay(noCols);
+ connectColumns();
+}
+
+// function to create the columns
+function createColumn(colPos)
+{
+ if (colpos == "col3" && printed3 == false){
+ printColumn(3);
+ printed3=true;
+ }
+ else if (colpos == "col4" && printed4 == false){
+ printColumn(4);
+ printed4=true;
+ }
+ else if (colpos == "col5" && printed5 == false){
+ printColumn(5);
+ printed5=true;
+ }
+ else if (colpos == "col6" && printed6 == false){
+ printColumn(6);
+ printed6=true;
+ }
+ else if (colpos == "col7" && printed7 == false){
+ printColumn(7);
+ printed7=true;
+ }
+ else if (colpos == "col8" && printed8 == false){
+ printColumn(8);
+ printed8=true;
+ }
+ else if (colpos == "col9" && printed9 == false){
+ printColumn(9);
+ printed9=true;
+ }
+ else if (colpos == "col10" && printed10 == false){
+ printColumn(10);
+ printed10=true;
+ }
+}
+
+// function which is called when the broswer window is resized
+jQuery( window ).resize(function()
+{
+ // stop resize firing twice: http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing
+ clearTimeout(id);
+ id = setTimeout(finishedResizing, 500);
+});
+
+// function called after the browser has finished resizing
+function finishedResizing()
+{
+ var colWidth = jQuery("#col1").width();
+ if( colWidth < specifiedColWidth ) // Columns width is too small to display all the columns properly so we delete some columns and resize the remaining columns
+ resizeRmColumns(); // Check if we can delete any columns
+ else if( colWidth > specifiedColWidth ) // Columns width COULD display more columns properly
+ resizeAddColumns(); // Check if we can add any columns
+}
+
+///////////////// end widget code part 1 /////////////////////////
+
+// jQuery function to define dropdown menu size
+jQuery(document).ready(function ()
+{
+ var hwindow = '';
+ hwindow = (jQuery(window).height()-35);
+ // Force the size dropdown menu
+ jQuery('#navigation ul li ul').css('max-height', hwindow);
+
+ ///////////////////////////////////////////
+ // jQuery code for columns / widgets part 2
+ ///////////////////////////////////////////
+
+ // insert add/delete column buttons
+ jQuery('<br /><br /><div id=\"columnModifier\"><div style=\"float:left\"><div id =\"addCol\" style=\"float:left\"><img src=\"./themes/pfsense_ng_fs/images/icons/icon_plus.gif\" style=\"cursor:pointer\" alt=\"Click here to add a column\"/></div>&nbsp;Add column&nbsp;</div><div style=\"float:left\"><div id =\"delCol\" style=\"float:left\"><img src=\"./themes/pfsense_ng_fs/images/icons/icon_x.gif\" style=\"cursor:pointer\" alt=\"Click here to delete a column\"/></div>&nbsp;Delete column</div><div id=\"columnWarningText\" style=\"float:left; margin-left:5em\"></div><br /><br />').insertBefore('#niftyOutter.fakeClass');
+
+ if ( jQuery('#columnModifier').length > 0 ) // only perform resizing on the dashboard page
+ {
+ // correct the css for column 2
+ jQuery('#col2').css("float","left");
+
+ // Make a copy of the current state of columns on page load
+ for ( var i = 1; i <= noCols; i = i + 1 )
+ {
+ var contents = jQuery('#col' + i ).html();
+ existing.push( contents );
+ }
+
+ finishedResizing(); // on page load correct display of columns to fit
+ }
+
+ // on click add a new column and change column widths
+ jQuery('#addCol').click(function()
+ {
+ var maxCols = maxColsToDisplay();
+ if( (noCols < maxCols) && (noCols < 10) )
+ {
+ var colAfter = noCols;
+ noCols++;
+
+ // insert new column
+ jQuery('#col' + (colAfter).toString() ).after("<div id=\"col" + noCols + "\" style=\"float: left; padding-bottom: 40px\" class=\"ui-sortable\"> </div>");
+
+ correctWidgetDisplay(noCols);
+ connectColumns();
+ }
+ else
+ jQuery('#columnWarningText').html('<b>Maximum number of columns reached for the current window size</b>').show().delay(1000).fadeOut(1000);
+ });
+
+ // on click delete a columns and change column widths
+ jQuery('#delCol').click(function()
+ {
+ if( noCols > 1 )
+ {
+ var colToDel = noCols;
+ noCols -= 1;
+
+ correctWidgetDisplay(noCols);
+
+ // get column contents before deletion
+ var colContent = jQuery('#col' + colToDel ).html();
+
+ // remove column
+ jQuery('#col' + colToDel ).remove();
+
+ // append deleted columns content to preceeding column
+ jQuery(colContent).appendTo('#col' + noCols );
+
+ showSave();
+ }
+ else
+ jQuery('#columnWarningText').html('<b>Minimum number of columns reached for the current window size</b>').show().delay(1000).fadeOut(1000);
+ });
+});
+//]]>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/login.css b/src/usr/local/www/themes/pfsense_ng_fs/login.css
new file mode 100644
index 0000000..f8abdfc
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/login.css
@@ -0,0 +1,1127 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+
+#login {
+/* background: #cccccc; */
+ background-color: transparent;
+ border: 0px solid #cccccc;
+ margin: 5em auto;
+ padding: 0em;
+ width: 400px;
+/* filter:alpha(opacity=60);
+ -moz-opacity:0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6; */
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+/* background: #ffffff; */
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 400px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -420px;
+ left: 70px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ top: -300px; */
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ left: 10px;
+ top: -300px; */
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -20px;
+ left: 170px;
+}
+
+/* loginerror box follows */
+
+#login #inputerrors {
+ background-color: transparent;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ vertical-align: middle;
+ padding: 0em;
+ width: 330px;
+ height: 50px;
+ position: relative;
+ top: -370px;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/menu.inc b/src/usr/local/www/themes/pfsense_ng_fs/menu.inc
new file mode 100644
index 0000000..d703daf
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/menu.inc
@@ -0,0 +1,177 @@
+<?php
+/* $Id: menu.inc,v 1.3.2.1 2007/01/17 18:43:30 sullrich Exp $ */
+/* ========================================================================== */
+/*
+ menu.inc
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+require("menu.inc");
+
+define("TMENU_STUB", "
+ // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
+ // but you can experiment with effect on loadtime.
+ if (TransMenu.isSupported()) {
+
+ //==================================================================================================
+ // create a set of dropdowns
+ //==================================================================================================
+ // the first param should always be down, as it is here
+ //
+ // The second and third param are the top and left offset positions of the menus from their actuators
+ // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
+ // something like -5, 5
+ //
+ // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
+ // of the actuator from which to measure the offset positions above. Here we are saying we want the
+ // menu to appear directly below the bottom left corner of the actuator
+ //==================================================================================================
+ var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
+
+ //==================================================================================================
+ // create a dropdown menu
+ //==================================================================================================
+ // the first parameter should be the HTML element which will act actuator for the menu
+ //==================================================================================================
+
+ @@MENU_DEFINITIONS@@
+
+ //==================================================================================================
+ // write drop downs into page
+ //==================================================================================================
+ // this method writes all the HTML for the menus into the page with document.write(). It must be
+ // called within the body of the HTML page.
+ //==================================================================================================
+ TransMenu.renderAll();
+ }
+");
+
+class NervecenterMenu extends Menu {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+ private $menuID = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $c);
+
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+ $this->menuID = $id;
+
+ if ($this->hasParent()) {
+ $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
+ }
+ } // end __construct
+
+ public function getMenuID() {
+ return $this->menuID;
+ }
+
+ public function setMenuID($myMenuID) {
+ $this->menuID = $myMenuID;
+ }
+
+ public function getMenuJScript() {
+ $childJScript = "";
+ foreach ($this->getChildren() as $component) {
+ $childJScript .= $component->getMenuJScript();
+ }
+
+ if (! $this->hasParent()) {
+ $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
+ } else {
+ $this->menuJScript .= "\n$childJScript\n";
+ }
+
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ if (! $this->hasParent()) {
+ $menuMarkup =<<<EOD
+ <div id="menu">
+ @@CHILD_ELEMENTS@@
+ </div>
+
+EOD;
+ } else {
+ $name = gettext($this->getID());
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+
+ $menuMarkup =<<<EOD
+ <a id="{$id}" href="#">{$name}</a>
+ @@CHILD_ELEMENTS@@
+EOD;
+ }
+
+ $childMarkup = "";
+ foreach ($this->getChildren() as $component) {
+ $childMarkup .= $component;
+ }
+
+ $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
+
+ return $menuMarkup;
+ }
+}
+
+class NervecenterMenuItem extends MenuItem {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $href, $c);
+
+ $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
+ $name = gettext($this->getID());
+ $file = $this->getFile();
+
+ $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
+ }
+
+ public function getMenuJScript() {
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ return "";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/new_tab_menu.css b/src/usr/local/www/themes/pfsense_ng_fs/new_tab_menu.css
new file mode 100644
index 0000000..04c4cf2
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/new_tab_menu.css
@@ -0,0 +1,101 @@
+/*
+ new_tab_menu.css
+ part of pfSense
+ Copyright (C) 2010-2011 Robert Zelaya
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
+ The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
+
+ <tr>
+ <td>
+ <?php
+ $tab_array_indent = 0; // move to the line in px
+ $tab_array_space = 1; // space betwen lines in px
+ $tab_array_char_limit = 82; // number or chr before the drop down box
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+
+*/
+
+.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
+
+.newtabmenu li{float:left; margin-right:2px; text-align: center;}
+.newtabmenu a:link, .newtabmenu a:visited{
+ background:url(images/new_tab_menu.png) right 45px;
+ color:#ffffff; /* noactive font */
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ font-weight:bold;
+ font-size:.9em;
+ height:20px;
+ line-height:20px;
+ text-decoration:none;
+}
+.newtabmenu a span{
+ background:url(images/new_tab_menu.png) left 45px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ height:20px;
+ margin-right:7px;
+ padding-left:7px;
+}
+.newtabmenu a:hover{
+ background:url(images/new_tab_menu.png) right 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ color:#ffffff; /* hover over font */
+}
+.newtabmenu a:hover span{
+ background:url(images/new_tab_menu.png) left 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+}
+
+/* -------------------------------- */
+/* ACTIVE ELEMENTS */
+.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
+ color:#000000; /* active font */
+ background:url(images/new_tab_menu.png) right 0 no-repeat;
+}
+.newtabmenu_active a span, .newtabmenu_active a:hover span{
+ background:url(images/new_tab_menu.png) left 0 no-repeat;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/no_big_logo b/src/usr/local/www/themes/pfsense_ng_fs/no_big_logo
new file mode 100644
index 0000000..6e5c70d
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/no_big_logo
@@ -0,0 +1 @@
+NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/rrdcolors.inc.php b/src/usr/local/www/themes/pfsense_ng_fs/rrdcolors.inc.php
new file mode 100644
index 0000000..dcb7a39
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/rrdcolors.inc.php
@@ -0,0 +1,89 @@
+<?php
+/* $Id$ */
+/*
+ rrdcolors.inc.php
+ Part of pfSense
+ Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* This file is included by the RRD graphing page and sets the colors */
+
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF','00E344','FF0000','000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333','a83c3c','999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+?>
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/pfsense_ng_fs/styles/jquery-ui-1.11.1.css
new file mode 100644
index 0000000..8a8c54f
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/styles/jquery-ui-1.11.1.css
@@ -0,0 +1,1226 @@
+/*! jQuery UI - v1.11.1 - 2014-09-22
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 1em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+ background-color: #990000;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #bbbbbb;
+ /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
+ color: #444444;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #444444;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #3383bb;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #3383bb;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #bbbbbb;
+ background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #599fcf;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #599fcf;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #999999;
+ background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #ffffff;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
+ color: #444444;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #444444;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #c0402a;
+ background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
+ opacity: .8;
+ filter: Alpha(Opacity=80); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -4px 0 0 -4px;
+ padding: 4px;
+ background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .6;
+ filter: Alpha(Opacity=60); /* support: IE8 */
+ border-radius: 0pxdow;
+}
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/styles/menustyles.css b/src/usr/local/www/themes/pfsense_ng_fs/styles/menustyles.css
new file mode 100644
index 0000000..06b3c7a
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/styles/menustyles.css
@@ -0,0 +1,44 @@
+#navigation {
+ /* border:1px solid black; */
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ padding-top: 4px;
+ }
+
+#menu {
+ /* background: #990000; */
+ /* border-bottom:1px solid white; */
+ padding: 0 0 0 0;
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ }
+#menu a {
+ padding: 2px 28px 4px 28px;
+ text-decoration: none;
+ font-weight: bold;
+ font-size: 1.0em;
+ color: #FFFFFF;
+ width: 08%;
+ height: 16px;
+ }
+#menu a.hover {
+ background: #AF2020;
+ }
+#menu span {
+ display: none;
+ }
+
+#subnav {
+ font-size: 10px;
+ margin-bottom: 2em;
+ }
+#subnav a {
+ color: #FF0000; /* #FB3B00; */
+ margin-right: 1em;
+ }
+#subnav span {
+ color: silver;
+ margin-right: 1em;
+ }
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/styles/transmenu.css b/src/usr/local/www/themes/pfsense_ng_fs/styles/transmenu.css
new file mode 100644
index 0000000..f683574
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/styles/transmenu.css
@@ -0,0 +1,75 @@
+/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
+.transMenu {
+ position:absolute;
+ overflow:hidden;
+ left:-1000px;
+ top:-1000px;
+ }
+
+/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
+.transMenu .content {
+ position:absolute;
+ }
+
+/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
+.transMenu .items {
+ position:relative;
+ left:0px; top:0px;
+ z-index:2;
+ }
+
+.transMenu.top .items {
+ border-top:none;
+ }
+
+/* each TR.item is one menu item */
+.transMenu .item {
+ color: #FFFFFF; /* #336; */
+ font-size: 1.1em;
+ font-weight: normal;
+ font-family:sans-serif;
+ text-decoration:none;
+ /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
+ border:none;
+ cursor:pointer;
+ cursor:hand;
+ }
+
+/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
+/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
+.transMenu .background {
+ position:absolute;
+ left:0px; top:0px;
+ z-index:1;
+ -moz-opacity:.8;
+ filter:alpha(opacity=80);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowRight {
+ position:absolute;
+ z-index:3;
+ top:3px; width:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowBottom {
+ position:absolute;
+ z-index:1;
+ left:3px; height:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
+.transMenu .item.hover {
+ background:#fdfdfd;
+ color:black;
+ }
+
+/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
+.transMenu .item img {
+ margin-left:10px;
+ } \ No newline at end of file
diff --git a/src/usr/local/www/themes/pfsense_ng_fs/wizard.css b/src/usr/local/www/themes/pfsense_ng_fs/wizard.css
new file mode 100644
index 0000000..f2c9f3e
--- /dev/null
+++ b/src/usr/local/www/themes/pfsense_ng_fs/wizard.css
@@ -0,0 +1,1117 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ /* background: url('images/background.png') no-repeat; */
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+.infobox {
+ width:100%;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
diff --git a/src/usr/local/www/themes/the_wall/all.css b/src/usr/local/www/themes/the_wall/all.css
new file mode 100644
index 0000000..35ddbd4
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/all.css
@@ -0,0 +1,1308 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+.addgatewaybox {
+ background-color: #990000;
+ border-style: none none none none;
+ width: 225px;
+}
+
+.infobox {
+ width:100%;
+}
+
+.infoboxsave {
+ padding-right: 10px;
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+.inputerrorsleft {
+ background-color: #990000;
+ width: 36px;
+ text-align: center;
+}
+
+.inputerrorsright {
+ background-color: #FFD9D1;
+ color: #000000;
+ font-size: 11px;
+ padding-left: 8px;
+ padding-top: 6px;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 220px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 11px;
+ font-family: "Trebuchet MS", sans-serif;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background: url('images/background.jpg') repeat-x; background-attachment:fixed;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+a:link{color: #660000;}
+a:visited{color: #660000;}
+a:active{color: #660000;}
+a:hover{color: #660000;}
+
+
+
+
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 202px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 90px;
+ width: 190px;
+ z-index: 1;
+ top: 55px;
+ left: -5px;
+ padding-top: 45px;
+ padding-left: 0px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 128px;
+ left: 230px;
+ font-size: 14px;
+ color: #000000;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -21px;
+ left: -20px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 170px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.0em;
+ font-weight: normal;
+ font-family: Verdana;
+ font-weight: bold;
+ color: #000000;
+ padding-left: 5px;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 170px;
+ height: 16px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+#content {
+ position: relative;
+ top: -5px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background: url('images/horizontal.png') repeat-y;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -5px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ position: relative;
+ top: -25px;
+ left: 3px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 5px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ width: 80px;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+/* dropdownmenu mainitems textcolor */
+#navigation ul li {
+ background-color: transparent;
+ font-size:13px;
+ color: #000000;
+}
+/* dropdownmenubackground */
+#navigation ul li ul li {
+ border: 0px solid #999999;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #999999;
+ color: #FFF;
+ filter:alpha(opacity=90);
+ -moz-opacity:0.9;
+ -khtml-opacity: 0.9;
+ opacity: 0.9;
+}
+#navigation ul li ul li:hover {
+ background-color: #cccccc;
+}
+/* textcolor in dropdownmenu */
+#navigation li li a {
+ display: block;
+ padding-left: 5px;
+ margin-right: 10px;
+ color: #000000;
+}
+/* textcolor mouseover in dropdownmenu */
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+ color: #000000;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listrborder {
+ background-color: #FFFFFF;
+ border-left: 1px solid #999999;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ color: #FFFFFF;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 6px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #DDDDDD;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 6px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+ margin: 0px auto;
+ background: url('images/background.jpg') repeat-x; background-attachment:fixed;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password, #password2 {
+ font-size: small;
+ width: 60%;
+ padding-left: 19px;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+/* Widget CSS */
+.widgetsubheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #B1B1B1;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #000000;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetheader {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.widgetdiv{
+ margin:5px;
+ padding: 5px;
+ background:#CCCCCC;
+}
+.widgetconfigdiv{
+ background:#BBBBBB;
+ font-size: 11px;
+ color: #000000;
+ padding-right: 5px;
+ padding-left: 5px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div#log div.log-entry-mini {
+ clear: both;
+}
+
+div#log div.log-entry-mini span {
+ padding: 2px 2px 2px 2px;
+ padding-left: 6px;
+}
+
+div#log span.log-action-mini-header,
+div#log span.log-time-mini-header,
+div#log span.log-interface-mini-header,
+div#log span.log-source-mini-header,
+div#log span.log-destination-mini-header,
+div#log span.log-protocol-mini-header {
+ float: left;
+ text-align: left;
+ background-color: #B1B1B1;
+ font-size: 12px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-time-mini,
+div#log span.log-interface-mini,
+div#log span.log-source-mini,
+div#log span.log-destination-mini,
+div#log span.log-protocol-mini {
+ float: left;
+ text-align: left;
+ background-color: #FFFFFF;
+ font-size: 11px;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-action-mini,
+div#log span.log-action-mini-header {
+ width: 6%;
+}
+
+div#log span.log-time-mini,
+div#log span.log-time-mini-header {
+ width: 19%;
+}
+
+div#log span.log-interface-mini,
+div#log span.log-interface-mini-header {
+ width: 8%;
+}
+
+div#log span.log-source-mini,
+div#log span.log-source-mini-header {
+ width: 23%;
+}
+
+div#log span.log-destination-mini,
+div#log span.log-destination-mini-header {
+ width: 31%;
+}
+
+div#log span.log-protocol-mini,
+div#log span.log-protocol-mini-header {
+ width: 8%;
+ border-right: 1px solid #999;
+}
+
+/* Sortable tables */
+table.sortable thead {
+ cursor: default;
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+
+/*thermal_sensors widget styles*/
+
+.thermalSensorRow { width: 100%; border: 0px solid #ddd; padding: 1px; border-radius: 3px; }
+.thermalSensorBarShell { position: relative; width: 100%; height: 5px; border: 1px solid lightgray; border-radius: 3px; }
+.thermalSensorBar { position: absolute; width: 0%; height: 1px; z-index: 1; border-style: solid; border-radius: 3px;
+ background-color: LimeGreen;
+ border-top-width: 2px; border-top-color: Lime;
+ border-left-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 2px; border-bottom-color: Green;
+}
+.thermalSensorTextShell { height: 20px; width: 100%; top: 3px; }
+.thermalSensorText { float: left; height: 20px; top: 3px; }
+.thermalSensorValue { float: left; height: 20px; top: 3px; font-weight: bold; margin-left: 10px;}
+
+.thermalSensorWarnThresh { position: absolute; background-color: orange; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+.thermalSensorCritThresh { position: absolute; background-color: red; height: 16px; width: 2px; z-index: 2; margin-top: -8px; }
+
+.thermal_sensors_widget_scale000 { position: absolute; height: 5px; width: 1px; left: -1px; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale020 { position: absolute; height: 3px; width: 1px; left: 10%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale010 { position: absolute; height: 3px; width: 1px; left: 20%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale030 { position: absolute; height: 3px; width: 1px; left: 30%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale040 { position: absolute; height: 3px; width: 1px; left: 40%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale050 { position: absolute; height: 3px; width: 1px; left: 50%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale060 { position: absolute; height: 3px; width: 1px; left: 60%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale070 { position: absolute; height: 3px; width: 1px; left: 70%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale080 { position: absolute; height: 3px; width: 1px; left: 80%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale090 { position: absolute; height: 3px; width: 1px; left: 90%; margin-top: -4px; background-color: lightgray; z-index: 0; font-size: 0; }
+.thermal_sensors_widget_scale100 { position: absolute; height: 9px; width: 1px; left: 100%; margin-top: -6px; background-color: lightgray; z-index: 0; font-size: 0; }
+
+.thermal_sensors_widget_mark100 { position: absolute; width: 15px; left: 96%; margin-top: -12px; font: 6pt Arial, sans-serif; text-align: left; color: #575757; }
+
+/* widget textarea styles - full width */
+.textarea_widget {
+ width: 100%;
+ resize:vertical;
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* IE 8+ */
+}
diff --git a/src/usr/local/www/themes/the_wall/apple-touch-icon.png b/src/usr/local/www/themes/the_wall/apple-touch-icon.png
new file mode 100755
index 0000000..7a4b975
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/apple-touch-icon.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/bottom-loader.js b/src/usr/local/www/themes/the_wall/bottom-loader.js
new file mode 100644
index 0000000..a21f775
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/bottom-loader.js
@@ -0,0 +1,10 @@
+//<![CDATA[
+
+ NiftyCheck();
+ Rounded("div#niftyMenu","top bottom","#FFFFFF","#000000","smooth");
+ Rounded("div#mainarea","bl br tr","#FFF","#DDDDDD","smooth");
+ Rounded("div#boxarea","bl br tl tr","#FFF","#DDDDDD","smooth");
+ Rounded("tr#fend","bl br tl tr","#FFF","#990000","smooth");
+ Rounded("div#topbox","all","#FFF","#990000","smooth");
+
+//]]>
diff --git a/src/usr/local/www/themes/the_wall/favicon.ico b/src/usr/local/www/themes/the_wall/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/graphlink.css b/src/usr/local/www/themes/the_wall/graphlink.css
new file mode 100644
index 0000000..13f65f0
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/graphlink.css
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ $Id$
+
+ This file is part of the GraphLink software.
+ GraphLink is distributed under the MIT License.
+ Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
+*******************************************************************************/
+
+/**
+ * Defines the background image used for the graph, as well as the actual data
+ * locations.
+ * Use padding-left and padding-top to align the data area correctly with your
+ * background image.
+ * Width and height should same as the dimensions of the image, minus the
+ * padding values in both directions.
+ */
+div.GraphLink {
+ width: 212px;
+ height: 60px;
+ padding-left: 38px;
+ padding-top: 10px;
+ background-image: url(/themes/nervecenter/images/misc/graph.png);
+ overflow: hidden;
+}
+
+/**
+ * Defines the data display area. Modify to fit your background image.
+ */
+div.GraphLinkData {
+ width: 200px;
+ height: 50px;
+ overflow: hidden;
+}
+
+/**
+ * Defines the look of one bar. Nothing to change here other than the color.
+ */
+span.GraphLinkBar {
+ background-color: #990000;
+ height: 100%;
+ float: left;
+ overflow: hidden;
+}
diff --git a/src/usr/local/www/themes/the_wall/images/alert_bgr.png b/src/usr/local/www/themes/the_wall/images/alert_bgr.png
new file mode 100755
index 0000000..b186db0
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/alert_bgr.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/background.jpg b/src/usr/local/www/themes/the_wall/images/background.jpg
new file mode 100755
index 0000000..cdd1df6
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/background.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/footer.png b/src/usr/local/www/themes/the_wall/images/footer.png
new file mode 100755
index 0000000..399e0ff
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/footer.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/header.png b/src/usr/local/www/themes/the_wall/images/header.png
new file mode 100755
index 0000000..25b813c
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/header.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/help.png b/src/usr/local/www/themes/the_wall/images/help.png
new file mode 100755
index 0000000..1de05e3
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/help.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/horizontal.gif b/src/usr/local/www/themes/the_wall/images/horizontal.gif
new file mode 100755
index 0000000..a280dcb
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/horizontal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/horizontal.png b/src/usr/local/www/themes/the_wall/images/horizontal.png
new file mode 100755
index 0000000..e774028
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/horizontal.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/favicon.ico b/src/usr/local/www/themes/the_wall/images/icons/favicon.ico
new file mode 100644
index 0000000..3440bf2
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/favicon.ico
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_3g.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_3g.gif
new file mode 100755
index 0000000..46ccb92
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_3g.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_3g_inactive.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_3g_inactive.gif
new file mode 100755
index 0000000..cf983e4
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_3g_inactive.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_advanced.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_advanced.gif
new file mode 100755
index 0000000..3ede1ff
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_advanced.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_advanced_s.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_advanced_s.gif
new file mode 100755
index 0000000..b233549
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_advanced_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alert.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alert.gif
new file mode 100755
index 0000000..7646941
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_alert.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_host.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_host.gif
new file mode 100755
index 0000000..ad43e17
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_host.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_net.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_net.gif
new file mode 100755
index 0000000..abd1b8b
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_net.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_port.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_port.gif
new file mode 100755
index 0000000..4acf2aa
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_port.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url.gif
new file mode 100755
index 0000000..660571e
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url_reload.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url_reload.gif
new file mode 100755
index 0000000..55c1c4a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_alias_url_reload.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_block.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_block.gif
new file mode 100755
index 0000000..670c968
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_block.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_block_add.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_block_add.gif
new file mode 100755
index 0000000..eb726d6
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_block_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_block_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_block_d.gif
new file mode 100755
index 0000000..e6345fe
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_block_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_cablenic.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_cablenic.gif
new file mode 100755
index 0000000..a071c66
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_cablenic.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_cal.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_cal.gif
new file mode 100755
index 0000000..a9c7c87
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_cal.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_cal_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_cal_mo.gif
new file mode 100755
index 0000000..1647e2f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_cal_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_carp.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_carp.gif
new file mode 100755
index 0000000..9454a82
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_carp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_carp_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_carp_d.gif
new file mode 100755
index 0000000..2ba8db2
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_carp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_chain.png b/src/usr/local/www/themes/the_wall/images/icons/icon_chain.png
new file mode 100644
index 0000000..12db07a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_chain.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_check.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_check.gif
new file mode 100755
index 0000000..393674d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_check.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_clock_green.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_clock_green.gif
new file mode 100755
index 0000000..e171ba8
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_clock_green.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_clock_grey.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_clock_grey.gif
new file mode 100755
index 0000000..00c865a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_clock_grey.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_clock_red.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_clock_red.gif
new file mode 100755
index 0000000..7b412ee
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_clock_red.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_close.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_close.gif
new file mode 100755
index 0000000..e0f86a7
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_close.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_configure.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_configure.gif
new file mode 100755
index 0000000..7182e0d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_configure.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_down.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_down.gif
new file mode 100755
index 0000000..b71a9c5
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_down_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_down_d.gif
new file mode 100755
index 0000000..70a7473
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_down_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_down_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_down_mo.gif
new file mode 100755
index 0000000..584587a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_down_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_e.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_e.gif
new file mode 100755
index 0000000..2950800
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_e.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_e_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_e_mo.gif
new file mode 100755
index 0000000..9ba5738
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_e_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_error.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_error.gif
new file mode 100755
index 0000000..e0fa659
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_error.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_exclam.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_exclam.gif
new file mode 100755
index 0000000..36c2ec7
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_exclam.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_de.png b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_de.png
new file mode 100755
index 0000000..069cbbe
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_de.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_en.png b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_en.png
new file mode 100755
index 0000000..bd7f9a5
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_en.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_es.png b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_es.png
new file mode 100755
index 0000000..434776c
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_es.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_flag_pt_BR.png b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_pt_BR.png
new file mode 100755
index 0000000..f786349
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_flag_pt_BR.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_cert.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_cert.png
new file mode 100755
index 0000000..48a34b6
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_cert.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_file.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_file.png
new file mode 100755
index 0000000..48a9ed2
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_file.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_group.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_group.png
new file mode 100755
index 0000000..7d929c0
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_group.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_host.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_host.png
new file mode 100755
index 0000000..867ef2c
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_host.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_imp.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_imp.png
new file mode 100755
index 0000000..f667cfc
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_imp.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_mail.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_mail.png
new file mode 100755
index 0000000..d2d4548
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_mail.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_pwd.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_pwd.png
new file mode 100755
index 0000000..06b53a1
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_pwd.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_search.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_search.png
new file mode 100755
index 0000000..33de926
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_search.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_time.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_time.png
new file mode 100755
index 0000000..aa8300a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_time.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_unknown.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_unknown.png
new file mode 100755
index 0000000..1857d0e
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_unknown.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_url.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_url.png
new file mode 100755
index 0000000..cf56792
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_url.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_user.png b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_user.png
new file mode 100755
index 0000000..e00eebe
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_frmfld_user.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_fw-update.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_fw-update.gif
new file mode 100755
index 0000000..52c18ac
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_fw-update.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_help.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_help.gif
new file mode 100644
index 0000000..84c84db
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_help.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias.gif
new file mode 100755
index 0000000..0c569a7
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias_d.gif
new file mode 100755
index 0000000..faa84d4
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_ifalias_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_import_alias.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_import_alias.gif
new file mode 100755
index 0000000..d11a5f0
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_import_alias.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_in.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_in_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_info_pkg.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_info_pkg.gif
new file mode 100755
index 0000000..cd3a532
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_info_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_interface_down.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_interface_down.gif
new file mode 100755
index 0000000..0626655
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_interface_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_interface_up.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_interface_up.gif
new file mode 100755
index 0000000..1449513
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_interface_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_left.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_left.gif
new file mode 100755
index 0000000..8effefe
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_left_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_left_d.gif
new file mode 100755
index 0000000..c778014
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_left_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_left_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_left_mo.gif
new file mode 100755
index 0000000..84c6fa2
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_left_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_log.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_log.gif
new file mode 100755
index 0000000..4a1983a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_log.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_log_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_log_d.gif
new file mode 100755
index 0000000..d31bd9b
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_log_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_log_s.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_log_s.gif
new file mode 100755
index 0000000..f9fda33
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_log_s.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_log_s_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_log_s_d.gif
new file mode 100755
index 0000000..fb2c05f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_log_s_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_logs.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_logs.gif
new file mode 100644
index 0000000..afe0104
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_logs.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_match.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_match.gif
new file mode 100644
index 0000000..215571f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_match.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_match_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_match_d.gif
new file mode 100644
index 0000000..6e4c364
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_match_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_minus.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_minus.gif
new file mode 100755
index 0000000..417544f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_minus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_open.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_open.gif
new file mode 100755
index 0000000..ac3da14
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_open.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_other.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_other.gif
new file mode 100755
index 0000000..e6f780f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_other.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_other_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_other_d.gif
new file mode 100755
index 0000000..b08d970
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_other_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_out.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_out_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_parp.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_parp.gif
new file mode 100755
index 0000000..96acaf3
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_parp.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_parp_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_parp_d.gif
new file mode 100755
index 0000000..7d7d00e
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_parp_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_pass.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_pass.gif
new file mode 100755
index 0000000..fe1bb0d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_pass.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_pass_add.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_pass_add.gif
new file mode 100755
index 0000000..f7f4c20
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_pass_add.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_pass_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_pass_d.gif
new file mode 100755
index 0000000..6adc431
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_pass_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus.gif
new file mode 100755
index 0000000..2a94eeb
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_plus.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl.gif
new file mode 100755
index 0000000..8dcd7c0
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl_p.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl_p.gif
new file mode 100755
index 0000000..0c79849
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_bl_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_d.gif
new file mode 100755
index 0000000..ebc7457
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_mo.gif
new file mode 100755
index 0000000..1c7ca08
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_plus_p.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_p.gif
new file mode 100755
index 0000000..eb41284
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_plus_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall.gif
new file mode 100755
index 0000000..d78b867
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_d.gif
new file mode 100755
index 0000000..13658f7
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_mo.gif
new file mode 100755
index 0000000..90b576e
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg.gif
new file mode 100755
index 0000000..9aebb03
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_d.gif
new file mode 100755
index 0000000..4ab4992
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_mo.gif
new file mode 100755
index 0000000..7025d20
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_pkg_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml.gif
new file mode 100755
index 0000000..4542432
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_d.gif
new file mode 100755
index 0000000..8d3a68d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_mo.gif
new file mode 100755
index 0000000..15e0aed
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reinstall_xml_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reject.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reject.gif
new file mode 100755
index 0000000..5565cd6
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reject.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_reject_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_reject_d.gif
new file mode 100755
index 0000000..6c09fae
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_reject_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_right.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_right.gif
new file mode 100755
index 0000000..fdf2d8b
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart.gif
new file mode 100755
index 0000000..e49fbd7
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart_d.gif
new file mode 100755
index 0000000..a5d6d7c
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_service_restart_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_running.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_running.gif
new file mode 100644
index 0000000..543fd56
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_service_running.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_start.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_start.gif
new file mode 100755
index 0000000..09bb58f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_service_start.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_start_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_start_d.gif
new file mode 100755
index 0000000..f58f111
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_service_start_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_status.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_status.gif
new file mode 100644
index 0000000..a93bcfb
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_service_status.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop.gif
new file mode 100755
index 0000000..922addc
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop_d.gif
new file mode 100755
index 0000000..b4cfdea
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_service_stop_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_service_stopped.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_service_stopped.gif
new file mode 100644
index 0000000..f93a25d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_service_stopped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_services_restart_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_services_restart_mo.gif
new file mode 100755
index 0000000..a092b40
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_services_restart_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_services_start_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_services_start_mo.gif
new file mode 100755
index 0000000..ecdb58f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_services_start_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_services_stop_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_services_stop_mo.gif
new file mode 100755
index 0000000..c00e208
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_services_stop_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system-group-grey.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system-group-grey.png
new file mode 100755
index 0000000..d7b964d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_system-group-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system-group.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system-group.png
new file mode 100755
index 0000000..1c974f2
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_system-group.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system-user-grey.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system-user-grey.png
new file mode 100755
index 0000000..2f6047d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_system-user-grey.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system-user.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system-user.png
new file mode 100755
index 0000000..ef82156
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_system-user.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system_lock_screen.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system_lock_screen.png
new file mode 100755
index 0000000..30f306d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_system_lock_screen.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_system_logout.png b/src/usr/local/www/themes/the_wall/images/icons/icon_system_logout.png
new file mode 100755
index 0000000..9bbb6c7
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_system_logout.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_trapped.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_trapped.gif
new file mode 100755
index 0000000..ffeb2cd
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_trapped.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_trapped_p.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_trapped_p.gif
new file mode 100755
index 0000000..6d46aaf
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_trapped_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule.gif
new file mode 100755
index 0000000..e15ab6c
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule_d.gif
new file mode 100755
index 0000000..f776281
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_ts_rule_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_up.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_up.gif
new file mode 100755
index 0000000..883c5a2
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_up.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_up_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_up_d.gif
new file mode 100755
index 0000000..0ddcce2
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_up_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_up_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_up_mo.gif
new file mode 100755
index 0000000..9f869a4
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_up_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wlan.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_wlan.gif
new file mode 100755
index 0000000..1f0addc
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_wlan.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wlan_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_wlan_d.gif
new file mode 100755
index 0000000..35bf580
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_wlan_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wol_all.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_wol_all.gif
new file mode 100755
index 0000000..2d22182
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_wol_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_nsaved.png b/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_nsaved.png
new file mode 100755
index 0000000..21cb27d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_nsaved.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_saved.png b/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_saved.png
new file mode 100755
index 0000000..ab82946
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_wzd_saved.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_x.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_x.gif
new file mode 100755
index 0000000..24e4d49
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_x_d.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_x_d.gif
new file mode 100755
index 0000000..d2bfbc8
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_x_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_x_mo.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_x_mo.gif
new file mode 100755
index 0000000..da7b57c
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_x_mo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/icon_x_p.gif b/src/usr/local/www/themes/the_wall/images/icons/icon_x_p.gif
new file mode 100755
index 0000000..8828fa6
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/icon_x_p.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/in.gif b/src/usr/local/www/themes/the_wall/images/icons/in.gif
new file mode 100755
index 0000000..f1da771
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/in.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/in_d.gif b/src/usr/local/www/themes/the_wall/images/icons/in_d.gif
new file mode 100755
index 0000000..18e26be
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/in_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/out.gif b/src/usr/local/www/themes/the_wall/images/icons/out.gif
new file mode 100755
index 0000000..1a1d1d5
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/out.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/icons/out_d.gif b/src/usr/local/www/themes/the_wall/images/icons/out_d.gif
new file mode 100755
index 0000000..879f1da
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/icons/out_d.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/log.png b/src/usr/local/www/themes/the_wall/images/log.png
new file mode 100755
index 0000000..762ba80
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/log.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/logo.gif b/src/usr/local/www/themes/the_wall/images/logo.gif
new file mode 100755
index 0000000..a71ce5a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/logo.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/logobig.jpg b/src/usr/local/www/themes/the_wall/images/logobig.jpg
new file mode 100755
index 0000000..2ef196d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/logobig.jpg
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/menu_down.gif b/src/usr/local/www/themes/the_wall/images/menu_down.gif
new file mode 100755
index 0000000..137de8d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/menu_down.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/menu_right.gif b/src/usr/local/www/themes/the_wall/images/menu_right.gif
new file mode 100755
index 0000000..881327c
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/menu_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bar_blue.gif b/src/usr/local/www/themes/the_wall/images/misc/bar_blue.gif
new file mode 100755
index 0000000..741186a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/bar_blue.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bar_gray.gif b/src/usr/local/www/themes/the_wall/images/misc/bar_gray.gif
new file mode 100755
index 0000000..e86e245
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/bar_gray.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bar_left.gif b/src/usr/local/www/themes/the_wall/images/misc/bar_left.gif
new file mode 100755
index 0000000..af751fa
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/bar_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bar_right.gif b/src/usr/local/www/themes/the_wall/images/misc/bar_right.gif
new file mode 100755
index 0000000..ff12d9e
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/bar_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_minus.png b/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_minus.png
new file mode 100755
index 0000000..37db2fd
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_minus.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_plus.png b/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_plus.png
new file mode 100755
index 0000000..fba7af9
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/bullet_toggle_plus.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/button.gif b/src/usr/local/www/themes/the_wall/images/misc/button.gif
new file mode 100755
index 0000000..e85dbb3
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/button.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/graph.png b/src/usr/local/www/themes/the_wall/images/misc/graph.png
new file mode 100755
index 0000000..507ec75
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/graph.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/key_128.gif b/src/usr/local/www/themes/the_wall/images/misc/key_128.gif
new file mode 100755
index 0000000..ea5ae34
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/key_128.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/key_152.gif b/src/usr/local/www/themes/the_wall/images/misc/key_152.gif
new file mode 100755
index 0000000..6c7fc03
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/key_152.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/key_256.gif b/src/usr/local/www/themes/the_wall/images/misc/key_256.gif
new file mode 100755
index 0000000..3e1c377
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/key_256.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/key_64.gif b/src/usr/local/www/themes/the_wall/images/misc/key_64.gif
new file mode 100755
index 0000000..87892bd
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/key_64.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/loader.gif b/src/usr/local/www/themes/the_wall/images/misc/loader.gif
new file mode 100755
index 0000000..a98cf78
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/loader_all.gif b/src/usr/local/www/themes/the_wall/images/misc/loader_all.gif
new file mode 100755
index 0000000..cb6bc0c
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/loader_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/loader_filter.gif b/src/usr/local/www/themes/the_wall/images/misc/loader_filter.gif
new file mode 100755
index 0000000..b838b17
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/loader_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/loader_tab.gif b/src/usr/local/www/themes/the_wall/images/misc/loader_tab.gif
new file mode 100755
index 0000000..a98cf78
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/loader_tab.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/logon.png b/src/usr/local/www/themes/the_wall/images/misc/logon.png
new file mode 100755
index 0000000..acd388b
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/logon.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/progress_bar.gif b/src/usr/local/www/themes/the_wall/images/misc/progress_bar.gif
new file mode 100755
index 0000000..3b4aa52
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/progress_bar.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/rrd_error.png b/src/usr/local/www/themes/the_wall/images/misc/rrd_error.png
new file mode 100755
index 0000000..a79ecf3
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/rrd_error.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_alerter.gif b/src/usr/local/www/themes/the_wall/images/misc/status_alerter.gif
new file mode 100755
index 0000000..7ff1e95
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/status_alerter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_carpmaster.gif b/src/usr/local/www/themes/the_wall/images/misc/status_carpmaster.gif
new file mode 100755
index 0000000..2c32908
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/status_carpmaster.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_left.gif b/src/usr/local/www/themes/the_wall/images/misc/status_left.gif
new file mode 100755
index 0000000..b5a2930
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/status_left.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_page_loading.gif b/src/usr/local/www/themes/the_wall/images/misc/status_page_loading.gif
new file mode 100755
index 0000000..067ef18
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/status_page_loading.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_reload_all.gif b/src/usr/local/www/themes/the_wall/images/misc/status_reload_all.gif
new file mode 100755
index 0000000..72de6bd
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/status_reload_all.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_reload_filter.gif b/src/usr/local/www/themes/the_wall/images/misc/status_reload_filter.gif
new file mode 100755
index 0000000..d72761a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/status_reload_filter.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/status_right.gif b/src/usr/local/www/themes/the_wall/images/misc/status_right.gif
new file mode 100755
index 0000000..bf66fdb
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/status_right.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/tri_c.gif b/src/usr/local/www/themes/the_wall/images/misc/tri_c.gif
new file mode 100755
index 0000000..317b758
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/tri_c.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/tri_c_black.gif b/src/usr/local/www/themes/the_wall/images/misc/tri_c_black.gif
new file mode 100755
index 0000000..309846e
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/tri_c_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/tri_o.gif b/src/usr/local/www/themes/the_wall/images/misc/tri_o.gif
new file mode 100755
index 0000000..eb95c32
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/tri_o.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/tri_o_black.gif b/src/usr/local/www/themes/the_wall/images/misc/tri_o_black.gif
new file mode 100755
index 0000000..f818f3b
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/tri_o_black.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/widget_loader.gif b/src/usr/local/www/themes/the_wall/images/misc/widget_loader.gif
new file mode 100755
index 0000000..ca35e2a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/widget_loader.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/misc/widget_loader_old.gif b/src/usr/local/www/themes/the_wall/images/misc/widget_loader_old.gif
new file mode 100755
index 0000000..fad101f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/misc/widget_loader_old.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/new_tab_menu.png b/src/usr/local/www/themes/the_wall/images/new_tab_menu.png
new file mode 100755
index 0000000..4bdfcef
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/new_tab_menu.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/status.png b/src/usr/local/www/themes/the_wall/images/status.png
new file mode 100755
index 0000000..a3e368e
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/status.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/transparent.gif b/src/usr/local/www/themes/the_wall/images/transparent.gif
new file mode 100755
index 0000000..89c5530
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/transparent.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/images/transparent_pixel.gif b/src/usr/local/www/themes/the_wall/images/transparent_pixel.gif
new file mode 100755
index 0000000..35d42e8
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/images/transparent_pixel.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/blank.gif b/src/usr/local/www/themes/the_wall/javascript/ie7/blank.gif
new file mode 100755
index 0000000..a4fe2e6
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/blank.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-box-model.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-box-model.js
new file mode 100644
index 0000000..45543f6
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-box-model.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-core.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-core.js
new file mode 100644
index 0000000..b11e2b1
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-core.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css-strict.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css-strict.js
new file mode 100644
index 0000000..4406d7a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css-strict.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-strict",function(){if(!modules["ie7-css2"])return;var NONE=[],ID=/#/g,CLASS=/[:@\.]/g,TAG=/^\w|[\s>+~]\w/g;IE7.parser.parse=function(cssText){var DYNAMIC=new RegExp("(.*):("+dynamicPseudoClasses+")(.*)");function addRule(selector,cssText){var match=selector.match(DYNAMIC);if(match)new DynamicRule(selector,match[1],match[2],match[3],cssText);else new Rule(selector,cssText)};cssText=cssText.replace(IE7.PseudoElement.ALL,IE7.PseudoElement.ID);var RULE=/([^\{]+)\{(\d+)\}/g,match;while(match=RULE.exec(cssText)){addRule(match[1],match[2]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}IE7.classes.sort(Rule.compare);return IE7.classes.join("\n")};function Rule(selector,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.Class;this.inherit(selector)};Rule.prototype=new IE7.Class.ancestor;Rule.prototype.toString=function(){return "."+this.name+"{"+this.cssText+"}"};Rule.score=function(selector){return(selector.match(ID)||NONE).length*10000+(selector.match(CLASS)||NONE).length*100+(selector.match(TAG)||NONE).length};Rule.compare=function(rule1,rule2){return rule1.specificity-rule2.specificity};function DynamicRule(selector,attach,dynamicPseudoClass,target,cssText){this.cssText=cssText;this.specificity=Rule.score(selector);this.inherit=IE7.DynamicStyle;this.inherit(selector,attach,dynamicPseudoClass,target)};DynamicRule.prototype=new IE7.DynamicStyle.ancestor;DynamicRule.prototype.toString=Rule.prototype.toString});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css2.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css2.js
new file mode 100644
index 0000000..7121c8e
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css2.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([/()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css3.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css3.js
new file mode 100644
index 0000000..86b24f5
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-css3.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-css3",function(){if(!modules["ie7-css2"])return;selectors["~"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=from[i];while(adjacent=nextElement(adjacent)){if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}}};var documentElement=(isHTML)?document.documentElement:firstChildElement(document.body);pseudoClasses["root"]=function(element){return Boolean(element==documentElement||element==document.body)};pseudoClasses["empty"]=function(element){return!firstChildElement(element)&&!element.innerText};pseudoClasses["last-child"]=function(element){return!nextElement(element)};pseudoClasses["only-child"]=function(element){return(element.parentNode&&childElements(element.parentNode).length==1)};pseudoClasses["nth-child"]=function(element,filterArgs,step){return nthChild(element,filterArgs,previousElement)};pseudoClasses["nth-last-child"]=function(element,filterArgs){return nthChild(element,filterArgs,nextElement)};function nthChild(element,filterArgs,traverse){switch(filterArgs){case "n":return true;case "even":filterArgs="2n";break;case "odd":filterArgs="2n+1"}var children=childElements(element.parentNode);function checkIndex(index){index=(traverse==nextElement)?children.length-index:index-1;return children[index]==element};if(!isNaN(filterArgs))return checkIndex(filterArgs);filterArgs=filterArgs.split("n");var multiplier=parseInt(filterArgs[0]);var step=parseInt(filterArgs[1]);if(isNaN(multiplier)||(multiplier==1))return true;if(multiplier==0&&!isNaN(step))return checkIndex(step);if(isNaN(step))step=0;var count=1;while(element=traverse(element))count++;return((count%multiplier)==step)};function childElements(element){var childElements=[],i;for(i=0;i<element.childNodes.length;i++){if(isElement(element.childNodes[i]))push(childElements,element.childNodes[i])}return childElements};attributeTests["^="]=function(attribute,value){return "/^"+attributeTests.escape(value)+"/.test("+attribute+")"};attributeTests["$="]=function(attribute,value){return "/"+attributeTests.escape(value)+"$/.test("+attribute+")"};attributeTests["*="]=function(attribute,value){return "/"+attributeTests.escape(value)+"/.test("+attribute+")"}});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-fixed.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-fixed.js
new file mode 100644
index 0000000..4321cda
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-fixed.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-html4.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-html4.js
new file mode 100644
index 0000000..4d2baa9
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-html4.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true); \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-ie5.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-ie5.js
new file mode 100644
index 0000000..707fa56
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-ie5.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(isHTML){HEADER+="address,blockquote,body,dd,div,dl,dt,fieldset,form,frame,"+"frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,applet,center,"+"dir,hr,menu,pre{display:block;height:0cm}li,ol,ul{display:block}"}if(![].push)push=function(array,item){array[array.length]=item;return array.length};if(![].pop)pop=function(array){var item=array[array.length-1];array.length--;return item};if("i".replace(/i/,function(){return""})){var a=String.prototype.replace,b=function(r,w){var m,n="",s=this;while((m=r.exec(s))){n+=s.slice(0,m.index)+w(m[0],m[1],m[2],m[3],m[4]);s=s.slice(m.lastIndex)}return n+s};String.prototype.replace=function(r,w){this.replace=(typeof w=="function")?b:a;return this.replace(r,w)}} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite-p.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite-p.js
new file mode 100644
index 0000000..3a66d19
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[340]](e%a+161)};while(++r<474)l[r]=(r<378)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!ù.´)Ó £(){ÿ{ù.´=ª;¢ ¢Æ=ª.¢´=Ó ¤×;£ ¢©(){if(«.¢Ù)«.¢Ù.Í.¤Ö=¤þ};ª.Õ=£(){¤ ¤ÿ};¢ â=(¤Ù.±(¢î.£Ë))?£(£Ì){ù.â(´+¥¡+£Ì)}:¢Æ;¢ Å=¤Ñ.Å.¬(¤Ú)[1];if(¤Û.±(¢î.£Ë)||Å<5||!¤Ü.±(«.Ù.ü))¤ ¢©();¢ è=¢£(«.¤Í!=¥¢);¢ ë=(¤Ë «.£Ê==¥£)?!¤Ýi.±(¢î.¢Ç):¢£(«.£Ê!=¥¤);¢ ¢í=¥¥;¢ ¢ë=¢í;if(!ë)¢ë+=¥¦;¢ ¢¹;¢ Ù=«.Ù;¢ ó={};ª.¢´=£(£È,ô,£É){if(!ó)¤;if(¢«)¢¬(¥§+¢Î(ô));if(£É){ô();ô=¢Æ}ó[£È]=ô};¢ £Ç=¤Þ;£ ¢È(²,¹){if(£Ç.±(²))²=(¹||¥¨)+²;¤ ²};£ ¢Ä(²,¹){²=¢È(²,¹);¤ ².»(0,².£Ã(¥©)+1)};¢ ¹=¢Ä(«.£Æ[«.£Æ.­-1].¤Å);¢ ¢Ê=Ó ¤Ä(¥ª);£ ã(²,¹){ÿ{²=¢È(²,¹);¢Ê.¤Á(¥«,²,Þ);¢Ê.¤¿();¤ ¢Ê.¤¾}õ(¢à){â(¥¬+²);¤ ¥¨}};¢ ·=£(¢É,¢À){¤ ¢É.·(¢À)};¢ ¢½=£(¢É){¤ ¢É.¢½()};if(Å<5.5)¢¬(ã(¥­,¹));if(«.¢Í==¥®||!ë)«.¤¹();Ö «.¤¸(¥¯);ª.¶=«.É[«.É.­-1];ª.¶.§=¢í;ª.¶.Æ=×;¢ §={};£ £¿(¶,¹){¢ ¢§=¢È(¶.²,¹);if(§[¢§])¤ ¥¨;§[¢§]=(¶.ý)?¥¨:£Å(¢Ã(¶,¹),¢Ä(¶.²,¹));¤ §[¢§]};¢ ¢Ã=£(¶){¤ ¶.§};¢ £Ä=¤ßgi;£ £Å(§,¢Ç){¤ §.³(£Ä,¥°+¢Ç.»(0,¢Ç.£Ã(¥©)+1)+¥±)};ª.Ë=[];ª.£¾=¢Æ;¢ ä=Þ;£ _ã(){ÿ{ä=×;¢ £Á=¤ài;¢ É=«.É;¢ ¢ì=[];¢ ¢Å=«.£µ(¥²);¯(¢ i=¢Å.­-1;i>=0;i--){·(¢ì,¤á.±(¢Å[i].£Â)?¥¨:¢Å[i].£Â)}£ ¢Ã(¶,¹){¢ §=¥¨;if(£Á.±(¶.¤µ)){¯(¢ i=0;i<¶.£À.­;i++){§+=¢¡.¤´(¶.£À[i],¢Ä(¶.²,¹))}§+=((¶.²)?£¿(¶,¹):¢½(¢ì))}¤ §};´.§=¥¨;¯(i=0;i<É.­;i++)´.§+=¢Ã(É[i],¥¨);´.§=£´(´.§);¯(i in ó)ó[i]();£¦ ó;if(¢¹)¢¹.¢·();Ñ.¢·();´.£¾();´.¶.§=¢ë+£³(´.§);¯(i=0;i<É.­;i++){if(!É[i].ý&&!É[i].Æ)É[i].§=¥¨}´.¢Â();â(¥³)}õ(¢¨){â(¥´+¢¨.¢ï)}¢Ë{¢©()}};ª.¢Â=£(){Ñ.¢Â();¯(¢ i=0;i<ª.Ë.­;i++)ª.Ë[i]()};¢ Ñ=Ó £(){¢ Ç=[];ª.û=£(){·(Ç,¢¡)};¢ Ë=[];ª.Ú=£(á,¢Þ){¢ £½=Ó ¢æ(¥µ+á,¥¶);¢ §=´.§;á=[];Ê(¬=£½.¤²(§)){·(á,¬[1]);if(Å<5.5)§=§.»(¬.¤±)}if(á.­){á=á.Õ();·(Ë,¢¡)}};ª.¢·=£(){¯(¢ i=0;i<Ç.­;i++){´.§=´.§.³(Ç[i][0],Ç[i][1])}ª.Ú(¥·,é);ª.Ú(¥¸,£(¡){if(¡.¢².©.Ü==¥¹)é(¡.¢²)})};ª.¢Â=£(){¯(¢ i=0;i<Ë.­;i++){¢ î=¢¶(Ë[i][0]);¯(¢ j=0;j<î.­;j++)Ë[i][1](î[j])}};ª.û(¤âgi,¥º);if(Å<6)ª.û(¤ãgi,¥»);if(è){¢ à=¥¼.¢ç(¥½);¯(¢ i=0;i<à.­;i++)à[à[i]]=à[i-1]||¥¾;£ ³($,$1,$2,$3){¤ $1+à[$3]};ª.û(Ó ¢æ(¥¿+à.¢å(¥À)+¥Á,¥¶),³)}};¢ £¹=¤ä;¢ £¸=¤åg;¢ £·=¤æ;¢ £¼=¤çg;¢ £»=¥Â;¢ þ={};£ ¢¶(µ,¦){¢ ¢è=!¦;¢ ¢é=(¦)?(¦.¤§==¤¦)?¦:[¦]:[«];¢ ñ=µ.³(£¼,£»).¢ç(¥½);¢ ¬=[];¯(¢ i=0;i<ñ.­;i++){µ=£º(ñ[i]);if(µ.»(0,3).¢å(¥¨)==¥Ã){µ=µ.»(2);¦=£¶(¢é,µ[1])}Ö ¦=¢é;¢ j=0,ß,®,Á,ò=¥¨;Ê(j<µ.­){ß=µ[j++];®=µ[j++];ò+=ß+®;Á=¥¨;if(µ[j]==¥Ä){Ê(µ[j++]!=¥Á)Á+=µ[j];Á=Á.»(0,-1);ò+=¥Ä+Á+¥Á}¦=(¢è&&þ[ò])?þ[ò]:¢ß(¦,ß,®,Á);if(¢è)þ[ò]=¦}¬=¬.¤¥(¦)}¤ ¬};£ £º(µ){if(£¹.±(µ))µ=¥Å+µ;¤ µ.¬(£¸)};£ ¢ß(¦,ß,®,Á){¢ À=¥¨;if(£·.±(®)){®=®.¢ç(¥À);À=®[0];®=®[1]}¢ ¸=[];if(ñ[ß])ñ[ß](¸,¦,®,À||Á);¤ ¸};£ £¶(¦,id){¢ ¸=[],i,j;¯(i=0;i<¦.­;i++){¢ ¬=¦[i].ì.¢À(id);if(¬){if(¬.­==¤¤)·(¸,¬);Ö ¯(j=0;j<¬.­;j++)·(¸,¬[j])}}¤ ¸};¢ ñ={¥Å:£(¸,¦,®,À){¯(¢ i=0;i<¦.­;i++){¢ ¢¦=(®==¥Æ&&¦[i].ì)?¦[i].ì:¦[i].£µ(®);¯(¢ j=0;j<¢¦.­;j++){if(ï(¢¦[j])&&(!À||¢¦[j].À==À))·(¸,¢¦[j])}}},¥Ç:£(¸,¦,®){¯(¢ i=0;i<¦.­;i++)if(¦[i].id==®)·(¸,¦[i])},¥È:£(¸,¦,®){®=Ó ¢æ(¥É+®+¥Ê);¯(¢ i=0;i<¦.­;i++)if(®.±(¦[i].¤£))·(¸,¦[i])},¥Ë:£(¸,¦,®,Á){®=¢ä[®];if(®)¯(¢ i=0;i<¦.­;i++)if(®(¦[i],Á))·(¸,¦[i])}};¢ ¤¢=¥¨;¢ ¢ä={Õ:£(){¢ Õ=[];¯(¢ ð in ª){if(ð!=¥Ì&&ð!=¥Í){if(ª[ð].­>1)ð+=¥Î;·(Õ,ð)}}¤ Õ.¢å(¥À)},¥Ì:£(¡){¤ ¢£(¡.©[¥Ï]==¥Ì)},¥Í:£(¡){¤ ¢£(¡.©[¥Ï]==¥Í)}};¢ ¤¡={Õ:¢ä.Õ};£ £ÿ(¡,º,À){if(À&&¡.À!=À)¤ Þ;¤(º==¥Æ)?ï(¡):(ë)?(¡.º==º.¢ý()):(¡.º==º)};¢ ¢¾=[];£ £þ(¢¿){¤ ¢».±(¢¿)?¢¾[¢¿.»(1,-1)]:¢¿};¢ £´=£(§){¤ §.³(¤èg,£(¬){¤(¬.¢þ(0)==¥©)?¥¨:¥Ð+(·(¢¾,¬.»(1,-1))-1)+¥Ð}).³(¤ég,¥¨).³(¤êg,¥À).³(¤ëg,¥°)};£ £³(§){¤ §.³(¤æg,¥Ñ).³(¤ìg,£(¬,£²){¤ ¢¾[£²]})};¢ ¢¼=[];£ ö(¡,Ý,Ô){¡.£±(Ý,Ô);·(¢¼,¢¡)};£ £°(¡,Ý,Ô){ÿ{¡.£û(Ý,Ô)}õ(¢à){}};ù.£±(¥Ò,£(){Ê(¢¼.­){¢ Ô=¢½(¢¼);£°(Ô[0],Ô[1],Ô[2])}});¢ ¢³=(Å<6)?£(¡){¤ ¡.Ä}:£(¡){¤ ¡.©.¢³};£ é(¡){if(!¢³(¡)){¡.£ù=Þ;£¯(£«(¡))}};£ £¯(¡){Ê(¡){¡.°.£®=¡.©.£®;¡=¢â(¡)}};¢ ¢»=¤í;£ £ø(¥){¤(¢».±(¥))?¥:¥Ð+¥+¥Ð};£ £÷(¥){¤(¢».±(¥))?¥.»(1,-1):¥};£ £¡(º){¢ ¡=«.£ª(º||¥Ó);¡.Í.§=¥Ô;¤ ¡};£ ï(¢¢){¤ ¢£(¢¢&&¢¢.£ñ==1&&¢¢.º!=¥Õ&&!¢¢.£ð)};£ £ï(¡){Ê(¡&&(¡=¡.£î)&&!ï(¡))£¬;¤ ¡};£ ¢â(¡){Ê(¡&&(¡=¡.Ì)&&!ï(¡))£¬;¤ ¡};£ £«(¡){¡=¡.£í;¤(ï(¡))?¡:¢â(¡)};¢ ¢«=Þ;´.¢´(¥Ö,£(){if(ë)¢¹=Ó £(){¢ Ç=[];£ ¢Þ(¡){¢ ¢¸=«.£ª(¥×+¡.¢µ.»(1));if(¡.¢µ.»(-2)!=¥Ø){¢ £©=¥Ù+¡.º+¥Ú,Ì;Ê((Ì=¡.Ì)&&Ì.¢µ!=£©){¡.¢á.¢Ú(Ì);¢¸.¢Ï(Ì)}if(Ì)¡.¢á.¢Ú(Ì)}¡.¢á.£ë(¢¸,¡);¤ ¢¸};ª.í=£(){·(Ç,¢¡)};ª.¢·=£(){ÿ{if(Å>5)«.£ê.í(¥Û,¥Ü)}õ(¢à){}¢Ë{¯(¢ i=0;i<Ç.­;i++){¢ î=¢¶(Ç[i][0]);¯(¢ j=0;j<î.­;j++)Ç[i][1](î[j])}}};ª.í(¥Ý,£(¡){if(!¡.£§){¢ Ò=¢¶(¥Þ,¡)[0];if(Ò){if(!Ò.id)Ò.id=Ò.ü;¡.£§=Ò.id}}});ª.í(¥ß,£(¡){¢Þ(¡);£¦ þ[¥à]});ª.í(¥á,£(¡){if(¡.º==¥â){¢ ¬=¡.¢µ.¬(¤îi);¡.°.¥=(¬)?¬[1]:¥¨}if(¡.Ý==¥ã){ö(¡,¥ä,£(){¡.°.¢Ý=×;¢ª(¥å+¡.ü+¥æ,1)})}});ª.í(¥ç,£(¡){¢ ££=¤ï;ö(¡,¥è,£(){¯(¢ i=0;i<¡.­;i++){if(££.±(¡[i].Ý)&&!¡[i].ý&&!¡[i].°.¢Ý){¡[i].ý=×;¢ª(¥å+¡[i].ü+¥é,1)}Ö if(¡[i].º==¥â&&¡[i].Ý==¥ã){¢ª(¥å+¡[i].ü+¥ê+¡[i].¥+¥Ð,1);¡[i].¥=¡[i].°.¥}}})})}},×);´.¢´(¥ë,£(){¢ ¢¯=¥ì,¢û=¤ð,¢ñ=¤ñ,¢Ð=¤ò;¢ ¢ÿ=(Å<6)?¤ógi:¤ôgi;¢ ¢ö=(Å<5.5)?¤õ:¤ö;¢ Ã=£¡();·(´.Ë,£ ¢ò(){if(Ã.Î)Ã.Î.¢Ú(Ã)});Ñ.û(¢ÿ,£(¬){¤ ¬.»(0,3)+¬.¢þ(4).¢ý()+¬.»(5)});¢ ¢ü=(è)?«.¢Ù:Ù;£ ¢Ó(¡){¤ ¡.Í.Ü==¥í||¡.©.Ü==¥í};£ ¾(¡){¢ ¾=¡.¢²;Ê(¾&&!¢³(¾))¾=¾.¢²;if(!¾||¢Ó(¡))¾=¢ü;¤ ¾};£ å(¢ó){å=£(¡,¥){if(!¡.°.¿&&(!ë||¡.º!=¥î)){if(!¥)¥=¡.©.¨;¡.°.¿=(¢û.±(¥))?£Þ.ú(0,ê(¡,¥)):¥;¡.°.¨=¡.°.¿;é(¡)}};if(è)Ñ.Ú(¥ï,å);¢ ê=(è)?£(¡,¥){¤ ç(¡,¥)+¢Õ(¡)+¢Ô(¡)}:£(¡,¥){¤ ç(¡,¥)};£ ¢Õ(¡){¤ ¡.¢Ñ-¡.Ä};£ ¢Ô(¡){¤ ç(¡,¡.©.£Ý)+ç(¡,¡.©.£Ü)};£ ¢ô(¡){¤((¡.©.¢ù==¥ð)?0:÷(¡,¡.©.¢ù))+((¡.©.¢ø==¥ð)?0:÷(¡,¡.©.¢ø))};£ ¼(¡){¼[¼.Ï++]=¡;if(¡.©.¢÷==¥ð)¡.°.¢÷=0;å(¡);é(¡);¢®(¡)};¼.Ï=0;Ñ.Ú(¥ñ+¢¯,¼);¢¬(¢Î(¼).³(¤÷g,¥ò));Ð.Ï=0;Ñ.Ú(¥ó+¢¯,Ð);£ ¢®(¡){¢ ¢°=¡.¢õ();¢ ¨=¢°.æ-¢°.Â;if(¡.©.Ð&&¨>=ê(¡,¡.©.Ð))¡.°.¨=ê(¡,¡.©.Ð);Ö if(¡.©.¼&&¨<=ê(¡,¡.©.¼))¡.°.¨=ê(¡,¡.©.¼);Ö ¡.°.¨=¡.°.¿};£ Ø(¡){if((¡.©.Ü==¥ô||¡.©.Ü==¥í)&&¡.©.Â!=¥ð&&¡.©.æ!=¥ð&&¢ö.±(¡.©.¨)){Ø[Ø.Ï++]=¡;é(¡);¢Ò(¡)}};Ø.Ï=0;Ñ.Ú(¥õ+¢¯,Ø);£ ¢Ò(¡){¡.°.¨=¥¨;¢ Î=¾(¡);¢ Â=(¡.°.£Û)?¡.¢õ().Â-2:÷(¡,¡.©.Â);¢ ¨=Î.Ä-÷(¡,¡.©.æ)-Â-¢ô(¡);if(!è)¨-=¢Õ(¡)+¢Ô(¡);if(¨<0)¨=0;if(¢Ó(¡)||¢ó||¡.¢Ñ<¨){¡.°.¿=¨;¡.°.¨=¨}};¢ Ä=Ù.Ä;ö(ù,¥ö,£(){¢ i,ø=(Ä<Ù.Ä);Ä=Ù.Ä;¯(i=0;i<¼.Ï;i++){¢ ¡=¼[i];¢ ¿=(¡.°.¨==¡.©.¼);if(ø&&¿)¡.°.¨=¥¨;if(ø==¿)¢®(¡)}¯(i=0;i<Ð.Ï;i++){¢ ¡=Ð[i];¢ ¿=(¡.°.¨==¡.©.Ð);if(!ø&&¿)¡.°.¨=¥¨;if(ø!=¿)¢®(¡)}¯(i=0;i<Ø.Ï;i++)¢Ò(Ø[i]);¢ò()});£ ç(¡,¥){if(¢Ð.±(¥))¤ ¢­(¥);if(¢ñ.±(¥))¤ ¢­(£Ù(¥)/100*¾(¡).Ä);¢ Î=(¡.£Ø)?¡:¡.Î;Î.¢Ï(Ã);Ã.Í.¨=¥;¤ Ã.¢Ñ};£ ÷(¡,¥){if(¢­(¥)>0)¤ ç(¡,¥);if(¢Ð.±(¥))¤ ¢­(¥);¡.Î.¢Ï(Ã);Ã.Í.Â=¥;¤ Ã.£×}};¢¬(¢Î(å).³(¤øg,¥÷).³(¤ùg,¥ø).³(¤úg,¥ù).³(¤ûg,¥ú).³(¤üg,¥û).³(¤ýg,¥ü));å();£Î(×)});¢«=×;if(«.¢Í==¥®)_ã();Ö ö(«,¥ý,£(){if(!ä&&«.¢Í==¥®)¢ª(_ã,0)})}õ(¢¨){¢©();â(¥þ+¢¨.¢ï)}¢Ë{}}();',340,0,/./,String,95,'element`var`function`return`value`from`cssText`width`currentStyle`this`document`match`length`filter`for`runtimeStyle`test`href`replace`IE7`selector`styleSheet`push`filtered`path`tagName`slice`minWidth`x5cs`layoutParent`fixedWidth`scopeName`filterArgs`left`ie7_tmp`clientWidth`appVersion`ie7`fixes`link`styleSheets`while`recalcs`nextSibling`style`parentElement`count`maxWidth`CSSFixes`input`new`handler`toString`else`true`fixRight`documentElement`addRecalc`auto`position`type`false`token`SIZES`pattern`alert`load`complete`fixWidth`right`getPixelWidth`quirksMode`boxSizing`getFixedWidth`isHTML`all`add`elements`isElement`pseudoClass`selectors`cacheSelector`modules`script`catch`addEventHandler`getPixelLeft`wider`window`max`addFix`uniqueID`disabled`cssCache`try`arguments`node`Boolean`x5c`visited`subset`url`error`unHide`setTimeout`loaded`eval`parseInt`resizeWidth`NUMERIC`rect`min`offsetParent`hasLayout`addModule`outerHTML`cssQuery`apply`fixedElement`HTMLFixes`display`QUOTED`handlers`pop`strings`string`item`small`recalc`getCSSText`getPath`styles`DUMMY`pathname`makePath`array`httpRequest`finally`Error`readyState`String`appendChild`PIXEL`offsetWidth`resizeRight`isFixed`getPaddingWidth`getBorderWidth`fixed`absolute`x5cw`body`removeChild`box`submit`clicked`fix`select`ignore`parentNode`nextElement`x2f`pseudoClasses`join`RegExp`split`useCache`base`large`HEADER`inlineStyles`LINKS`location`description`height`PERCENT`removeTempElement`HEIGHT`getMarginWidth`getBoundingClientRect`AUTO`minHeight`marginRight`marginLeft`x5cd`UNIT`viewport`toUpperCase`charAt`MATCH`tmpElement`BUTTON`UNSUCCESSFUL`button`abbr`delete`htmlFor`HTML`endTag`createElement`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`decode`encode`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`parse`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`name`autoload`mimeType`search`message`onreadystatechange`fixHeight`bottom`Bottom`Right`top`Top`Left`Height`Width`offsetLeft`canHaveChildren`parseFloat`onresize`screenLeft`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`firstChild`previousSibling`previousElement`ie7_anon`nodeType`clip`none`border`padding`object`unquote`quote`contentEditable`onbeforeunload`detachEvent`import`namespace`getString`compareTagName`dynamicPseudoClasses`attributeTests`className`null`concat`Array`constructor`size`font`medium`list`inline`float`relative`content`sizing`lastIndex`exec`successfully`callee`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`Microsoft`ActiveXObject`src`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ms_`ie7_off`MSIE`navigator`ie7_debug`alpha`version`visible`visibility`Function`fromCharCode`¤Ò`¤Ð (\\d\\.\\d)`¤Ï`^¤Î`\\.¤É$`^[\\w\\.]+[^:]*$`(¢§\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¤·\\b|\\¤¶\\b|^$`Æ-È`(¤­\\s*:\\s*(Â|æ))`¢º\\s*:\\s*¤«-¢À`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢ã\\*[^\\*]*\\*+([^\\¢ã][^\\*]*\\*+)*\\¢ã)|(\x27[^\x27]*\x27)|("[^"]*")`@(£ý|£ü)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\¢¤:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ¥="([^"]*)"`^(¢Ü|£á|£¤)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(¢±|ú)-(¨|¢ð)\\s*:\\s*\\d`\\b(¢±|ú)-¨\\s*:\\s*\\d`^Û|0cm$`^Û$`¢±`£Ö`¨`£Ô`Â`£Ñ`æ`¤Õ`´ ¤Ô 0.7.3 (¤Ó)`\\n\\n`¤Ì`¤Ê`¤È ¤Ç`:È{Æ-È:È}:¢¥{Æ-È:¢¥}`*{¤Æ:0}`ô=``/`¤Ã.¤Â`¤À`¢Ì [1]: ¤½ ¤¼ ã ¤» `Æ-¤º.js`ä`<Í></Í>`$1`$2`Í`¢« ¤³`¢Ì [2]: `([^{}]*)\\¢¤{([^}]*[^\\¢Ø-])?`gi`¢Û-¤°\\½*:\\½*¤¯-¢Û`Ü\\½*:\\½*¢×`¤®`¢º:¤¬;$1`¢º:£­`xx-¢Á,x-¢Á,¢Á,¤ª,¢ê,x-¢ê,xx-¢ê`,`xx-¢Á`(¤©(-¤¨)?\\½*:\\½*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\½)`(\\½|$)`:`È`¢¥`\\¢¤([^)]*\\¢¤)`Æ-È`\x27`\\¢¤:`£ú`£ö`Ü:¢×;£õ:0;¢º:£­;£ô:£ó;£ò:¢°(0 0 0 0);Â:-9999`!`Æ-£ì`<£¨:`/>`</`>`£¨`£é://£è.w3.£ç/1999/£æ`£å`Ò,¢ß,£ä`£¥` £¥`£¤,Ò`£¢`¢Ü`£ã`«.ì.`.°.¢Ý=Þ`£â`£à`.ý=Þ`.¥=\x27`Æ-¢Û-£ß`\\½*:\\½*\\¢ú[\\¢Ø%]*`¢Ö`HR`¨\\½*:\\½*\\¢ú\\¢Ø*[^%]`Û`¢±-¨`ú`ú-¨`¢×`æ`£Ú`£Õ`¢ð`£Ó`£Ò`£Ð`£Ï`£Í`¢Ì [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite.js
new file mode 100644
index 0000000..88c764f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-lite.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-png.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-png.js
new file mode 100644
index 0000000..7b8f2cf
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-png.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(window.IE7)IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-server.css b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-server.css
new file mode 100644
index 0000000..47c7edd
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-server.css
@@ -0,0 +1,43 @@
+body, td, dd {font: 10pt Verdana, Arial, Helvetica, sans-serif; color: black;}
+body {margin: 8px; background: #333;}
+h1 {margin: 0;}
+h1 a:hover {background-color: transparent;}
+h2 {font-size: 1.75em;}
+h3 {font-size: 1.1em;}
+a:active {color: #ff0000;}
+a:link {color: #0a6cce;}
+a:visited {color: #0a6cce;}
+code, *.code {font-family: monospace; font-size: 100%; font-style: normal; white-space: nowrap;
+ padding: 0 1px; background: #f2f3f8; border: #d6d9e9 1px solid;}
+code.box {display: block; padding: 10px; margin: 0.5em 0;}
+ul {list-style-type: square;}
+dd {margin: .2em 0 .5em 1em;}
+dl.library dt {display: list-item; margin-left: 3em; list-style-type: square;}
+dl.library dd {font-style: italic; margin-left: 3em;}
+dt {font-weight: bold;}
+dt.pack {color: brown;}
+a img {border-style: none;}
+hr {height: 1px; color: #000; border-style: solid;}
+hr.short {height: 2px; width: 100px;}
+div.document {background: #eef; padding: 20px 20px 5px 20px; width: 600px; border: 1px solid black;}
+hr {border-bottom-width: 0px;}
+div.header hr {color: #0a6cce; background-color: #0a6cce;}
+div.content {min-height: 100px;}
+div.footer hr {color: #898e79; background-color: #898e79; }
+div.header, div.header a:link, div.header a:visited, h3 a:link, h3 a:visited {text-decoration: none;}
+a:hover {color: #fff; background-color: #0a6cce; text-decoration: none;}
+div.footer a:hover {background-color: transparent; text-decoration: none;}
+div.header .menu {text-align: right;}
+div.footer {font-size: x-small; margin-top: 8px;}
+div.footnote {font-family: "times new roman", times; font-style: italic; margin-top: 10px;}
+#license {margin-top: 5px; font-size: xx-small;}
+table {border-top: 1px solid #000; border-left: 1px solid #000;}
+th {background-color: #fff; text-align: left;}
+th, td {border-right: 1px solid #000; border-bottom: 1px solid #000;}
+th.small {width: 100px;}
+th.medium {width: 200px;}
+th.large {width: 270px;}
+th.x-large {width: 408px;}
+table.fixed {table-layout: fixed;}
+span.comment {color: #666;}
+
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard-p.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard-p.js
new file mode 100644
index 0000000..73e99ac
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard-p.js
@@ -0,0 +1,3 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+eval(function(A,r,s,e,n,a,l){s=function(e){return((e<a)?'':s(e/a))+n[l[493]](e%a+161)};while(++r<735)l[r]=(r<549)?'/'+l[r]+'/':'"'+l[r]+'"';while(--r>=0)A=A.replace(new RegExp(s(r),'g'),l[r]);return A}('if(!¢¡.ª)¶ ¢(){¢Æ{¢¡.ª=¤;£ ¢Ø=¤.¢©=¶ ¤¬;¢ ¢ì(){if(².ß)².ß.Ì.¦²=¦ë};¤.È=¢(){¥ ¦ì};£ ¢¶=(¦´.µ(¢ô.¤ì))?¢(¤í){¢¡.¢¶(ª+¦í+¤í)}:¢Ø;£ á=¤¥.á.§(¦µ)[1];if(¦¶.µ(¢ô.¤ì)||á<5||!¦·.µ(².ù.¢«))¥ ¢ì();£ ¢§=¢ê(².¦«!=¦î);£ ¢±=(¦© ².¤ë==¦ï)?!¦¸i.µ(¢ô.£»):¢ê(².¤ë!=¦ð);£ £ê=¦ñ;£ £¦=£ê;if(!¢±)£¦+=¦ò;£ ¢½;£ ù=².ù;£ ¢Ñ={};¤.¢©=¢(¢Ç,¢Ò,¤ê){if(!¢Ñ)¥;if(¢í)Ü(¦ó+¢ó(¢Ò));if(¤ê){¢Ò();¢Ò=¢Ø}¢Ñ[¢Ç]=¢Ò};£ ¤é=¦¹;¢ ¢À(¾,Á){if(¤é.µ(¾))¾=(Á||¦ô)+¾;¥ ¾};¢ £¹(¾,Á){¾=¢À(¾,Á);¥ ¾.Æ(0,¾.¤å(¦õ)+1)};£ Á=£¹(².¤è[².¤è.¯-1].î);£ £½=¶ ¦£(¦ö);¢ ê(¾,Á){¢Æ{¾=¢À(¾,Á);£½.¦¡(¦÷,¾,ë);£½.¥þ();¥ £½.¥ý}¢·(£¥){¢¶(¦ø+¾);¥ ¦ô}};£ ¸=¢(£¼,£·){¥ £¼.¸(£·)};£ £´=¢(£¼){¥ £¼.£´()};if(á<5.5)Ü(ê(¦ù,Á));if(².£À==¦ú||!¢±)².¥ø();Û ².¥÷(¦û);¤.¿=².é[².é.¯-1];¤.¿.¨=£ê;¤.¿.Î=Ö;£ ¨={};¢ ¤á(¿,Á){£ Ô=¢À(¿.¾,Á);if(¨[Ô])¥ ¦ô;¨[Ô]=(¿.¢ç)?¦ô:¤ç(¢ã(¿,Á),£¹(¿.¾,Á));¥ ¨[Ô]};£ ¢ã=¢(¿){¥ ¿.¨};£ ¤æ=¦ºgi;¢ ¤ç(¨,£»){¥ ¨.¬(¤æ,¦ü+£».Æ(0,£».¤å(¦õ)+1)+¦ý)};¤.ô=[];¤.¢â=¢Ø;£ ¢¸=ë;¢ _ê(){¢Æ{¢¸=Ö;£ ¤ã=¦»i;£ é=².é;£ £é=[];£ £º=².¤Ø(¦þ);®(£ i=£º.¯-1;i>=0;i--){¸(£é,¦¼.µ(£º[i].¤ä)?¦ô:£º[i].¤ä)}¢ ¢ã(¿,Á){£ ¨=¦ô;if(¤ã.µ(¿.¥ô)){®(£ i=0;i<¿.¤â.¯;i++){¨+=í.£ó(¿.¤â[i],£¹(¿.¾,Á))}¨+=((¿.¾)?¤á(¿,Á):£´(£é))}¥ ¨};ª.¨=¦ô;®(i=0;i<é.¯;i++)ª.¨+=¢ã(é[i],¦ô);ª.¨=£©(ª.¨);®(i in ¢Ñ)¢Ñ[i]();£Ö ¢Ñ;if(¢½)¢½.£°();à.£°();ª.¢â();ª.¿.¨=£¦+£§(ª.¨);®(i=0;i<é.¯;i++){if(!é[i].¢ç&&!é[i].Î)é[i].¨=¦ô}ª.Ø();¢¶(¦ÿ)}¢·(¢ë){¢¶(§¡+¢ë.£ë)}£¾{¢ì()}};¤.Ø=¢(){à.Ø();®(£ i=0;i<¤.ô.¯;i++)¤.ô[i]()};£ à=¶ ¢(){£ è=[];¤.¢¿=¢(){¸(è,í)};£ ô=[];¤.ï=¢(¢µ,£ä){£ ¤à=¶ ç(§¢+¢µ,§£);£ ¨=ª.¨;¢µ=[];Ý(§=¤à.¢ß(¨)){¸(¢µ,§[1]);if(á<5.5)¨=¨.Æ(§.¥ò)}if(¢µ.¯){¢µ=¢µ.È();¸(ô,í)}};¤.£°=¢(){®(£ i=0;i<è.¯;i++){ª.¨=ª.¨.¬(è[i][0],è[i][1])}¤.ï(§¤,¢Ê);¤.ï(§¥,¢(¡){if(¡.¢¥.«.³==§¦)¢Ê(¡.¢¥)})};¤.Ø=¢(){®(£ i=0;i<ô.¯;i++){£ ¢Í=ü(ô[i][0]);®(£ j=0;j<¢Í.¯;j++)ô[i][1](¢Í[j])}};¤.¢¿(¦½gi,§§);if(á<6)¤.¢¿(¦¾gi,§¨);if(¢§){£ ¢´=§©.£¨(§ª);®(£ i=0;i<¢´.¯;i++)¢´[¢´[i]]=¢´[i-1]||§«;¢ ¬($,$1,$2,$3){¥ $1+¢´[$3]};¤.¢¿(¶ ç(§¬+¢´.¢Ü(§­)+§®,§£),¬)}};£ ¤Ü=¦¿;£ ¤Û=¦Àg;£ ¤Ú=¦Á;£ ¤ß=¦Âg;£ ¤Þ=§¯;£ ¢è={};¢ ü(´,­){£ £æ=!­;£ £ç=(­)?(­.¥ê==¥é)?­:[­]:[²];£ ò=´.¬(¤ß,¤Þ).£¨(§ª);£ §=[];®(£ i=0;i<ò.¯;i++){´=¤Ý(ò[i]);if(´.Æ(0,3).¢Ü(¦ô)==§°){´=´.Æ(2);­=¤Ù(£ç,´[1])}Û ­=£ç;£ j=0,¢³,±,É,¢Ð=¦ô;Ý(j<´.¯){¢³=´[j++];±=´[j++];¢Ð+=¢³+±;É=¦ô;if(´[j]==§±){Ý(´[j++]!=§®)É+=´[j];É=É.Æ(0,-1);¢Ð+=§±+É+§®}­=(£æ&&¢è[¢Ð])?¢è[¢Ð]:£å(­,¢³,±,É);if(£æ)¢è[¢Ð]=­}§=§.¥è(­)}¥ §};¢ ¤Ý(´){if(¤Ü.µ(´))´=§²+´;¥ ´.§(¤Û)};¢ £å(­,¢³,±,É){£ Ê=¦ô;if(¤Ú.µ(±)){±=±.£¨(§­);Ê=±[0];±=±[1]}£ ¼=[];if(ò[¢³])ò[¢³](¼,­,±,Ê||É);¥ ¼};¢ ¤Ù(­,id){£ ¼=[],i,j;®(i=0;i<­.¯;i++){£ §=­[i].¢Ì.£·(id);if(§){if(§.¯==¢Þ)¸(¼,§);Û ®(j=0;j<§.¯;j++)¸(¼,§[j])}}¥ ¼};£ ò={§²:¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=(±==§³&&­[i].¢Ì)?­[i].¢Ì:­[i].¤Ø(±);®(£ j=0;j<ó.¯;j++){if(¢Î(ó[j])&&(!Ê||ó[j].Ê==Ê))¸(¼,ó[j])}}},§´:¢(¼,­,±){®(£ i=0;i<­.¯;i++)if(­[i].id==±)¸(¼,­[i])},§µ:¢(¼,­,±){±=¶ ç(§¶+±+§·);®(£ i=0;i<­.¯;i++)if(±.µ(­[i].¢Ý))¸(¼,­[i])},§¸:¢(¼,­,±,É){±=¢®[±];if(±)®(£ i=0;i<­.¯;i++)if(±(­[i],É))¸(¼,­[i])}};£ ¢¬=¦ô;£ ¢®={È:¢(){£ È=[];®(£ ¢Ï in ¤){if(¢Ï!=§¹&&¢Ï!=§º){if(¤[¢Ï].¯>1)¢Ï+=§»;¸(È,¢Ï)}}¥ È.¢Ü(§­)},§¹:¢(¡){¥ ¢ê(¡.«[§¼]==§¹)},§º:¢(¡){¥ ¢ê(¡.«[§¼]==§º)}};£ ¢­={È:¢®.È};¢ £Ù(¡,Ï,Ê){if(Ê&&¡.Ê!=Ê)¥ ë;¥(Ï==§³)?¢Î(¡):(¢±)?(¡.Ï==Ï.¤Ç()):(¡.Ï==Ï)};£ £µ=[];¢ ¢ö(£¶){¥ £².µ(£¶)?£µ[£¶.Æ(1,-1)]:£¶};£ £©=¢(¨){¥ ¨.¬(¦Ãg,¢(§){¥(§.¤È(0)==¦õ)?¦ô:§½+(¸(£µ,§.Æ(1,-1))-1)+§½}).¬(¦Äg,¦ô).¬(¦Åg,§­).¬(¦Æg,¦ü)};¢ £§(¨){¥ ¨.¬(¦Ág,§¾).¬(¦Çg,¢(§,¤×){¥ £µ[¤×]})};£ £³=[];¢ Ó(¡,Õ,þ){¡.¤Ö(Õ,þ);¸(£³,í)};¢ ¤Õ(¡,Õ,þ){¢Æ{¡.¥å(Õ,þ)}¢·(£¥){}};¢¡.¤Ö(§¿,¢(){Ý(£³.¯){£ þ=£´(£³);¤Õ(þ[0],þ[1],þ[2])}});£ £®=(á<6)?¢(¡){¥ ¡.Í}:¢(¡){¥ ¡.«.£®};¢ ¢Ê(¡){if(!£®(¡)){¡.¥ã=ë;¤Ô(¤Ð(¡))}};¢ ¤Ô(¡){Ý(¡){¡.¦.¤Ó=¡.«.¤Ó;¡=¢þ(¡)}};£ £²=¦È;¢ ¤ª(©){¥(£².µ(©))?©:§½+©+§½};¢ ¥â(©){¥(£².µ(©))?©.Æ(1,-1):©};¢ £Ï(Ï){£ ¡=².£Û(Ï||§À);¡.Ì.¨=§Á;¥ ¡};¢ ¢Î(¢é){¥ ¢ê(¢é&&¢é.¥Þ==1&&¢é.Ï!=§Â&&!¢é.¢ÿ)};¢ ¤²(¡){Ý(¡&&(¡=¡.¥Ý)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¢þ(¡){Ý(¡&&(¡=¡.õ)&&!¢Î(¡))¤Ñ;¥ ¡};¢ ¤Ð(¡){¡=¡.¤¹;¥(¢Î(¡))?¡:¢þ(¡)};£ ¢í=ë;ª.¢©(§Ã,¢(){if(¢±)¢½=¶ ¢(){£ è=[];¢ £ä(¡){£ £±=².£Û(§Ä+¡.£¯.Æ(1));if(¡.£¯.Æ(-2)!=§Å){£ ¤Ï=§Æ+¡.Ï+§Ç,õ;Ý((õ=¡.õ)&&õ.£¯!=¤Ï){¡.¢ü.¢Õ(õ);£±.¢»(õ)}if(õ)¡.¢ü.¢Õ(õ)}¡.¢ü.¥Û(£±,¡);¥ £±};¤.æ=¢(){¸(è,í)};¤.£°=¢(){¢Æ{if(á>5)².¥Ú.æ(§È,§É)}¢·(£¥){}£¾{®(£ i=0;i<è.¯;i++){£ ¢Í=ü(è[i][0]);®(£ j=0;j<¢Í.¯;j++)è[i][1](¢Í[j])}}};¤.æ(§Ê,¢(¡){if(!¡.¤Í){£ ð=ü(§Ë,¡)[0];if(ð){if(!ð.id)ð.id=ð.¢«;¡.¤Í=ð.id}}});¤.æ(§Ì,¢(¡){£ä(¡);£Ö ¢è[§Í]});¤.æ(§Î,¢(¡){if(¡.Ï==§Ï){£ §=¡.£¯.§(¦Éi);¡.¦.©=(§)?§[1]:¦ô}if(¡.Õ==§Ð){Ó(¡,§Ñ,¢(){¡.¦.£ã=Ö;¢Ó(§Ò+¡.¢«+§Ó,1)})}});¤.æ(§Ô,¢(¡){£ ¤Ê=¦Ê;Ó(¡,§Õ,¢(){®(£ i=0;i<¡.¯;i++){if(¤Ê.µ(¡[i].Õ)&&!¡[i].¢ç&&!¡[i].¦.£ã){¡[i].¢ç=Ö;¢Ó(§Ò+¡[i].¢«+§Ö,1)}Û if(¡[i].Ï==§Ï&&¡[i].Õ==§Ð){¢Ó(§Ò+¡[i].¢«+§×+¡[i].©+§½,1);¡[i].©=¡[i].¦.©}}})})}},Ö);ª.¢©(§Ø,¢(){£ £«=§Ù,¤Æ=¦Ë,¢Ö=¦Ì,£Ý=¦Í;£ ¢¾=(á<6)?¦Îgi:¦Ïgi;£ ¤Ã=(á<5.5)?¦Ð:¦Ñ;£ ¹=£Ï();¸(ª.ô,¢ ¤À(){if(¹.½)¹.½.¢Õ(¹)});à.¢¿(¢¾,¢(§){¥ §.Æ(0,3)+§.¤È(4).¤Ç()+§.Æ(5)});£ Þ=(¢§)?².ß:ù;¢ ö(¡){¥ ¡.Ì.³==§Ú||¡.«.³==§Ú};¢ ã(¡){£ ã=¡.¢¥;Ý(ã&&!£®(ã))ã=ã.¢¥;if(!ã||ö(¡))ã=Þ;¥ ã};¢ ì(¤Á){ì=¢(¡,©){if(!¡.¦.ä&&(!¢±||¡.Ï!=§Û)){if(!©)©=¡.«.°;¡.¦.ä=(¤Æ.µ(©))?¥Î.¢æ(0,¢Ë(¡,©)):©;¡.¦.°=¡.¦.ä;¢Ê(¡)}};if(¢§)à.ï(§Ü,ì);£ ¢Ë=(¢§)?¢(¡,©){¥ ¢É(¡,©)+£à(¡)+£ß(¡)}:¢(¡,©){¥ ¢É(¡,©)};¢ £à(¡){¥ ¡.¢¼-¡.Í};¢ £ß(¡){¥ ¢É(¡,¡.«.¥Í)+¢É(¡,¡.«.¥Ì)};¢ ¤Â(¡){¥((¡.«.¢ï==§Ý)?0:¢ä(¡,¡.«.¢ï))+((¡.«.¤Å==§Ý)?0:¢ä(¡,¡.«.¤Å))};¢ Ú(¡){Ú[Ú.Ë++]=¡;if(¡.«.¤Ä==§Ý)¡.¦.¤Ä=0;ì(¡);¢Ê(¡);£ª(¡)};Ú.Ë=0;à.ï(§Þ+£«,Ú);Ü(¢ó(Ú).¬(¦Òg,§ß));ý.Ë=0;à.ï(§à+£«,ý);¢ £ª(¡){£ £¬=¡.£É();£ °=£¬.×-£¬.À;if(¡.«.ý&&°>=¢Ë(¡,¡.«.ý))¡.¦.°=¢Ë(¡,¡.«.ý);Û if(¡.«.Ú&&°<=¢Ë(¡,¡.«.Ú))¡.¦.°=¢Ë(¡,¡.«.Ú);Û ¡.¦.°=¡.¦.ä};¢ ¢²(¡){if((¡.«.³==§á||¡.«.³==§Ú)&&¡.«.À!=§Ý&&¡.«.×!=§Ý&&¤Ã.µ(¡.«.°)){¢²[¢².Ë++]=¡;¢Ê(¡);£Þ(¡)}};¢².Ë=0;à.ï(§â+£«,¢²);¢ £Þ(¡){¡.¦.°=¦ô;£ ½=ã(¡);£ À=(¡.¦.¢Ô)?¡.£É().À-2:¢ä(¡,¡.«.À);£ °=½.Í-¢ä(¡,¡.«.×)-À-¤Â(¡);if(!¢§)°-=£à(¡)+£ß(¡);if(°<0)°=0;if(ö(¡)||¤Á||¡.¢¼<°){¡.¦.ä=°;¡.¦.°=°}};£ Í=ù.Í;Ó(¢¡,§ã,¢(){£ i,¢å=(Í<ù.Í);Í=ù.Í;®(i=0;i<Ú.Ë;i++){£ ¡=Ú[i];£ ä=(¡.¦.°==¡.«.Ú);if(¢å&&ä)¡.¦.°=¦ô;if(¢å==ä)£ª(¡)}®(i=0;i<ý.Ë;i++){£ ¡=ý[i];£ ä=(¡.¦.°==¡.«.ý);if(!¢å&&ä)¡.¦.°=¦ô;if(¢å!=ä)£ª(¡)}®(i=0;i<¢².Ë;i++)£Þ(¢²[i]);¤À()});¢ ¢É(¡,©){if(£Ý.µ(©))¥ ø(©);if(¢Ö.µ(©))¥ ø(£Æ(©)/100*ã(¡).Í);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);¹.Ì.°=©;¥ ¹.¢¼};¢ ¢ä(¡,©){if(ø(©)>0)¥ ¢É(¡,©);if(£Ý.µ(©))¥ ø(©);¡.½.¢»(¹);¹.Ì.À=©;¥ ¹.¢¤}};Ü(¢ó(ì).¬(¦Óg,§ä).¬(¦Ôg,§å).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦×g,§è).¬(¦Øg,§é));ì();¥É(Ö)});ª.¢©(§ê,¢(){£ ¤§=¦Ùg,¤½=¦Úi;ª.¢á=[];ª.¤¿=¶ ¤¾;ª.·=·;ª.Ò=Ò;ª.Ã=Ã;ª.¢â=¢(){¥Ç(¤.¤¿)¤.¨=£§(¢â(£©(¤.¨)));®(£ i=0;i<ª.¢á.¯;i++)ª.¢á[i].¢ß();®(i=0;i<£¡.¯;i++)£¡[i].¤º()};¢ã=¢(¿,Á){¥ ê(¿.¾,Á)};£ ££=[];¢ ¤¾(){¤.¢â=¢(¨){·.û=¶ ç(§ë+¢®+§ì,§í);·.¤¨=¶ ç(§î+¢®+§­+¢­+§ï,§í);Ò.û=¶ ç(§ð+¢­+§ñ,§í);¥ ¨.¬(Ã.û,Ã.ID).¬(Ò.û,Ò.ID).¬(·.û,·.ID)};¤.£©=¢(¨){ñ.û=¶ ç(§ò+¢¬+§ó+¢¬+§ô,§í);¥ ¨.¬(ñ.û,ñ.ID).¬(¦Ûg,¢($){¥ §õ+(¸(££,$)-1)+§ö}).¬(¦Üg,§¸).¬(¦Ýg,¢(§,À,×){¥ À.£¨(§ª).¢Ü(×)+×})};¤.£§=¢(¨){¥ ¨.¬(¦Þg,¢($,$1){¥ ££[$1]})}};¢ _·(){¤.È=¢(){¥ §µ+¤.¢Ç};¤.æ=¢(¡){¡.¢Ý+=§²+¤.¢Ç};¤.¤©=¢(¡){¡.¢Ý=¡.¢Ý.¬(¤.¢¾,¦ô)};¤.¢ß=¢(){£ §=ü(¤.´);®(£ i=0;i<§.¯;i++)¤.æ(§[i])}};¢ ·(´,¨){¤.id=ª.¢á.¯;¤.¢Ç=·.¢ø+¤.id;¤.´=´;¤.¢¾=¶ ç(§÷+¤.¢Ç+§ø,§í);¸(ª.¢á,¤)};·.£Ú=_·;·.¢ª=¶ _·;·.¢ø=§ù;·.ID=¢(§){¥ £Õ(§)+¶ ·(§)};¢ _Ò(){¤.¢ß=¢(){£ §=ü(¤.¢°);®(£ i=0;i<§.¯;i++){£ º=(¤.º)?ü(¤.º,§[i]):[§[i]];if(º)¤.¢¯(§[i],º,¤)}}};_Ò.¢ª=¶ _·;¢ Ò(´,¢°,¢¯,º){¤.¢°=¢°;¤.¢¯=¢­[¢¯];¤.º=º;¤.£¢=·;¤.£¢(´)};Ò.£Ú=_Ò;Ò.¢ª=¶ _Ò;Ò.ID=¢(§,¢°,¢¯,º){if(¢±&&¢¯!=§ú&&¤½.µ(¢°)&&!¦ß.µ(º))¥ §;¥ £Õ(§)+¶ Ò(§,¢°,¢¯,º)};£¦+=§û;£ ¤·=¦àg;¢ ¤¶(§,£Ü){¥ Ü(§ü+§ý.Æ(£Ü.¯)+£Ü+§½)};£ £¡=[];¢ _Ã(){¤.Å=¢Þ;¤.È=¢(){¥ ¦ô};¤.¥Ã=0;¢ ¤¸(¢Ä,Å,¨){£ ÿ=¥Â(¢(){¢Æ{if(!¢Ä.ê)¥;¢Ä.ê(¢Ä,Å,¨);¤»(ÿ)}¢·(£¥){¤»(ÿ)}},10)};¤.¤º=¢(){if(¤.Å==¢Þ)¥;®(£ i=0;i<¤.§.¯;i++){£ º=¤.§[i];£ ¢Å=º.¦[¤.³];if(¢Å){£ ½=º.£Ì?º:º.½;£ £¤=¦á.µ(¤.Å);£ ¡=².£Û(£¤?Ã.¤³:§Â);¡.¢ÿ=Ö;¡.¦.¨=¢Å.¨;if(!£¤)¡.¥Á=¢Å.Å;if(¤.³==§þ){½.¥À(¡,½.¤¹)}Û{½.¢»(¡)}if(£¤)¤¸(¡,¢Å.Å,¢Å.¨);º.¦[¤.³]=¢Þ}}};¤.¢ß=¢(){¤.§=ü(¤.´);®(£ i=0;i<¤.§.¯;i++){£ ¦=¤.§[i].¦;if(!¦[¤.³])¦[¤.³]={¨:¦ô};¦[¤.³].¨+=§ÿ+¤.¨;if(¤.Å!=¢Þ)¦[¤.³].Å=¤.Å}}};_Ã.¢ª=¶ _·;¢ Ã(´,³,¨){¤.³=³;¤.¨=££[¨].Æ(1,-1);£ Å=¤.¨.§(Ã.¤´);if(Å)¤.Å=¢ö(Å[1]).¬(¤·,¤¶);¤.£¢=·;¤.£¢(´);¸(£¡,¤)};Ã.£Ú=_Ã;Ã.¢ª=¶ _Ã;Ã.ID=¢(§,´,³,¨){¥ ¶ Ã(´,³,¨)};Ã.û=¦âg;Ã.¤´=¦ã;Ã.¤³=¨¡+¢À(¨¢,Á)+¨£;ò[§Ç]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ó=­[i].¥º;®(£ j=0;j<ó.¯;j++)if(£Ù(ó[j],±,Ê))¸(¼,ó[j])}};ò[¨¤]=¢(¼,­,±,Ê){®(£ i=0;i<­.¯;i++){£ ¢ý=¢þ(­[i]);if(¢ý&&£Ù(¢ý,±,Ê))¸(¼,¢ý)}};ò[¨¥]=¢(¼,­,±){±=¢ú[±];®(£ i=0;i<­.¯;i++)if(±(­[i]))¸(¼,­[i])};¢®[¨¦]=¢(¡){¥!¤²(¡)};¢®[¨§]=¢(¡,É){É=¶ ç(¨¨+É,¨©);Ý(¡&&!¡.£×(¨§))¡=¡.¢ü;¥ ¡&&É.µ(¡.£×(¨§))};¢­.¢Ù=¢(¡){£ Â=í;Ó(¡,¨ª,¢(){ª.Ð.¢Ù.¢Û(Â)});Ó(¡,¨«,¢(){ª.Ð.¢Ù.¢Ú(Â)})};¢­.¢÷=¢(¡){£ Â=í;Ó(¡,¨¬,¢(){ª.Ð.¢÷.¢Û(Â)})};¢­.¢Á=¢(¡){£ Â=í;Ó(¡,¨­,¢(){ª.Ð.¢Á.¢Û(Â)});Ó(¡,¨®,¢(){ª.Ð.¢Á.¢Ú(Â)});if(¡==².¥²){ª.Ð.¢Á.¢Û(Â)}};Ó(²,¨¯,¢(){£ ú=ª.Ð.¢÷;£ Ù=ú.Ù,i;®(i in Ù)ú.¢Ú(Ù[i]);ú=ª.Ð.¢Ù;Ù=ú.Ù;®(i in Ù)if(!Ù[i][0].£õ(£ü.¥°))ú.¢Ú(Ù[i])});£ ¢ú=[];£ ¤«=¦äg;¢ ñ(Ä,¢Â,©){©=¢ö(©);¤.id=¢ú.¯;£ò(Ä.¥¯()){¢¦ ¨°:Ä=¨±;¤­;¢¦ ¨²:Ä=¨³;¤­;£ñ:Ä=¨´+Ä+¨µ}¢Â=¢¬[¢Â];¸(¢ú,¶ ¤¬(¨¶,¨·+¢Â(Ä,©)))};ñ.ID=¢(§,Ä,¢Â,©){¥ ¶ ñ(Ä,¢Â,©)};ñ.¢ª.È=¢(){¥ ñ.¢ø+¤.id};¢¬={È:¢(){£ È=[];®(£ i in ¤)if(i&&i!=¨¸)¸(È,i);¥ È.¢Ü(¦ô).¬(¦åg,¦ô)},¢ù:¢(©){¥ ©.¬(¤«,¨¹)},¦ô:¢(Ä){¥ Ä},¨º:¢(Ä,©){¥ Ä+¨»+¤ª(©)},¨¼:¢(Ä,©){¥ ¨½+¢¬.¢ù(©)+¨¾+Ä+§®},¨¿:¢(Ä,©){¥ ¨À+¢¬.¢ù(©)+¨Á+Ä+§®}};ñ.¢ø=¨¥;¢ _ú(){¤.¢Û=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.æ(º[i]);¤.Ù[·.id+¡.¢«]=Â};¤.¢Ú=¢(Â){£ ¡=Â[0];£ º=Â[1];£ ·=Â[2];®(£ i=0;i<º.¯;i++)·.¤©(º[i]);£Ö ¤.Ù[·.id+¡.¢«]}};ª.Ð=¢(Õ){¤.Õ=Õ;¤.Ù={};ª.Ð[Õ]=¤};ª.Ð.¢ª=¶ _ú;¶ ª.Ð(¨Â);¶ ª.Ð(¨Ã);¶ ª.Ð(§ú);¢ £Õ(´){¥ ´.¬(·.¤¨,¦ô).¬(¤§,§²)}},Ö);ª.¢©(¨Ä,¢(){if(á<5.5)¥;£ £Ô=¨Å;£ £ý=(¦æ.µ(¤¥.¥©))?¢À(¨Æ,Á):¨Ç;£ £Ó=¶ ç((¢¡.¤ý||¨È)+¨É,¨©);¢ £þ(¡,î){¡.¦.±=£Ô.¬(¦ç,î)};£ ¢¾=¦ègi;à.¢¿(¢¾,¢ ¬(§,¢õ,¤¡,Ô,£ÿ){Ô=¢ö(Ô);¥ £Ó.µ(Ô)?¨Ê+£Ô.¬(¦é,¨Ë).¬(¦ç,Ô)+¨Ì+(¢õ||¦ô)+§¸+(¤¡||¦ô)+¨Í+(£ÿ||¦ô):§});if(¢½){¢ £Ò(¡){if(£Ó.µ(¡.î)){£ °=¡.°,÷=¡.÷;£þ(¡,¡.î);¡.î=£ý;¡.°=°;¡.÷=÷}Û ¡.¦.±=¦ô};¢½.æ(¨Î,¢(¡){if(¡.Ï==¨Ï&&¡.Õ!=¨Ð)¥;£Ò(¡);Ó(¡,¨Ñ,¢(){if(£ü.£Ê==¨Ò)£Ò(¡)})})}});ª.¢©(¨Ó,¢(){£ ¢Ö=¦Ì;à.ï(¨Ô,¢¢);à.ï(¨Õ,¢£);£ ß=².ß;£ Þ$=(¢§)?¨Ö:¨×;£ Þ=Ü(Þ$);¢ ¢ñ(){if(ß.«.£Î!=§Ú){if(ß.«.£Í==¨Í){ß.¦.£Í=¨Ø+¢ô.¤÷+§®}ß.¦.£Î=§Ú}¢ñ=¢Ø};£ ¹=£Ï(¨Ù);¢ ¢º(£ú){¥ ¢ó(£ú).¬(¦Õg,§æ).¬(¦Ög,§ç).¬(¦Óg,§ä).¬(¦êg,¨Ú)};¢ ¢£(¡){if(¡.«.£Î!=§Ú)¥;if(!¡.£õ(ß)){¢ñ();¢£[¢£.Ë++]=¡;£Ë(¡);¤ö(¡);£Â(¡)}};¢£.Ë=0;¢ £Â(¡){¹.î=¡.«.£Í.Æ(5,-2);£ ½=(¡.£Ì)?¡:¡.½;½.¢»(¹);£È(¡);¤õ(¡);½.¢Õ(¹)};¢ £Ë(¡){¡.Ì.¢×=¡.«.¢×;if(!ö(¡)){£ £ô=¨Û+Þ$+¨Ü;¡.¦.£ð(¨Ý,£ô)}};Ü(¢º(£Ë));¢ £È(¡){£ £Ê=ö(¡)?¨Ý:¨Þ;¡.¦[£Ê]=£Ç(¡,¡.Ì.¢×)-¡.£É().À-¡.¤ô};Ü(¢º(£È));¢ ö(¡){if(!¡)¥ ë;if(¡.Ì.³==§Ú||¡.«.³==§Ú)¥ Ö;¥ í.£ó(¡.½)};¢ £Ç(¡,³){£ò(³){¢¦ ¨ß:¢¦ §ç:¥ 0;¢¦ §â:¢¦ §é:¥ Þ.Í-¹.¢¼;¢¦ ¨à:¥(Þ.Í-¹.¢¼)/2;£ñ:if(¢Ö.µ(³)){¥ ø((Þ.Í-¹.¢¼)*£Æ(³)/100)}¹.Ì.À=³;¥ ¹.¢¤}};Ü(¢º(£Ç));¢ ¢¢(¡){if(¡.«.³!=§Ú)¥;¢ñ();¢¢[¢¢.Ë++]=¡;¡.Ì.³=§Ú;¡.¦.³=§á;£Á(¡)};¢¢.Ë=0;¢ £Á(¡,Ø){£Å(¡,Ø);¤ò(¡,Ø);if(!Ø||¡.¦.¤ñ){if(ø(¡.«.¢î)==0)¡.¦.¤ð++}};¢ £Å(¡,Ø){if(!Ø&&¢Ö.µ(¡.«.°))¡.¦.ì=¡.«.°;if(¡.¦.ì)¡.¦.°=ø(£Æ(¡.¦.ì)/100*Þ.Í);if(Ø){if(!¡.¦.£Ä)¥}Û{¡.¦.£Ä=¡.«.×!=§Ý&&¡.«.À==§Ý}¡.¦.À=¦ô;¡.¦.¢Ô=¢¹(¡);if(¡.«.¢ï!=§Ý){¡.½.¢»(¹);¹.Ì.À=¡.«.¢ï;¡.¦.¢Ô-=¹.¢¤;¡.½.¢Õ(¹)}if(ö(¡.¢¥))¡.¦.£ï=¡.¦.¢Ô;Û if(!Ø)¡.¦.£ð(¨á,¨â+Þ$+¨ã)};Ü(¢º(£Å).¬(¦Øg,§é).¬(¦Ôg,§å));¢ ¢¹(¡){£ ¢¹=¡.¢¤,£Ã=ë;£ Ç=ö(¡.¢¥)&&¡.¦.£Ä;Ý(¡=¡.¢¥){if(!Ç&&¡.«.³!=¨ä)£Ã=Ö;¢¹+=¡.¢¤*(£Ã?-1:1)}¥ ¢¹};Ü(¢º(¢¹));¢ £ì(){®(£ i=0;i<¢£.Ë;i++)£Â(¢£[i]);®(i=0;i<¢¢.Ë;i++)£Á(¢¢[i],Ö);ÿ=0};£ ÿ;Ó(¢¡,§ã,¢(){if(!ÿ)ÿ=¢Ó(£ì,10)})});¢í=Ö;if(².£À==¦ú)_ê();Û Ó(²,¨å,¢(){if(!¢¸&&².£À==¦ú)¢Ó(_ê,0)})}¢·(¢ë){¢ì();¢¶(¨æ+¢ë.£ë)}£¾{}}();',493,0,/./,String,95,'element`function`var`this`return`runtimeStyle`match`cssText`value`IE7`currentStyle`replace`from`for`length`width`filter`document`position`selector`test`new`Class`push`ie7_tmp`target`x5cs`filtered`parentElement`href`styleSheet`left`path`instance`PseudoElement`attribute`content`slice`fixed`toString`filterArgs`scopeName`count`style`clientWidth`ie7`tagName`Event`x5c`DynamicStyle`addEventHandler`url`type`true`right`recalc`instances`minWidth`else`eval`while`viewport`body`CSSFixes`appVersion`link`layoutParent`fixedWidth`auto`add`RegExp`fixes`styleSheets`load`false`fixWidth`arguments`src`addRecalc`input`AttributeSelector`selectors`subset`recalcs`nextSibling`isFixed`height`parseInt`documentElement`ie7Event`ALL`cssQuery`maxWidth`handler`timer`window`positionFixed`backgroundFixed`offsetLeft`offsetParent`case`quirksMode`x5cw`addModule`prototype`uniqueID`attributeTests`dynamicPseudoClasses`pseudoClasses`dynamicPseudoClass`attach`isHTML`fixRight`token`SIZES`pattern`alert`catch`complete`getScreenLeft`topFunction`appendChild`offsetWidth`HTMLFixes`MATCH`addFix`makePath`focus`compare`x5cd`object`pseudoElement`try`name`visited`getPixelWidth`boxSizing`getFixedWidth`all`elements`isElement`pseudoClass`cacheSelector`modules`script`setTimeout`screenLeft`removeChild`PERCENT`backgroundPositionX`DUMMY`hover`unregister`register`join`className`null`exec`display`classes`parse`getCSSText`getPixelLeft`wider`max`disabled`cssCache`node`Boolean`error`unHide`loaded`bottom`marginLeft`absolute`fixBackground`top`String`location`image`getString`active`PREFIX`escape`attributeSelectors`x2f`parentNode`adjacent`nextElement`ie7_anon`pseudoElements`inherit`encoded`isURL`ignore`HEADER`decode`split`encode`resizeWidth`NUMERIC`rect`min`hasLayout`outerHTML`apply`fixedElement`QUOTED`handlers`pop`strings`string`item`small`getPath`styles`pathname`array`httpRequest`finally`Error`readyState`foregroundPosition`backgroundPosition`nested`autoLeft`positionLeft`parseFloat`getOffsetLeft`setOffsetLeft`getBoundingClientRect`propertyName`backgroundLeft`canHaveChildren`backgroundImage`backgroundAttachment`tmpElement`none`background`fixImg`pngTest`FILTER`simpleSelector`delete`getAttribute`lang`compareTagName`ancestor`createElement`code`PIXEL`resizeRight`getPaddingWidth`getBorderWidth`box`submit`clicked`fix`select`useCache`base`large`inlineStyles`LINKS`description`resize`onresize`scrollLeft`pixelLeft`setExpression`default`switch`callee`expression`contains`Height`Width`Top`Left`leftFunction`img`event`NULL`addFilter`suffix`prefix`scale`png`define`navigator`Microsoft`CHILD`COMPLEX`remove`quote`ESCAPE`Function`break`ie7_`x5cb`class`ms_`previousElement`OBJECT`CONTENT`before`unicode`HEX`addTimer`firstChild`create`clearInterval`inline`ANCHOR`Parser`parser`removeTempElement`HEIGHT`getMarginWidth`AUTO`minHeight`marginRight`UNIT`toUpperCase`charAt`BUTTON`UNSUCCESSFUL`button`abbr`htmlFor`HTML`endTag`firstChildElement`continue`block`marginTop`fixMargins`removeEventHandler`attachEvent`key`getElementsByTagName`selectById`NAMESPACE`STREAM`STANDARD_SELECT`toStream`ASTERISK`IMPLIED_SELECTOR`reg`loadStyleSheet`imports`MEDIA`innerHTML`lastIndexOf`URL`fixUrls`scripts`RELATIVE`autoload`mimeType`search`message`onreadystatechange`static`screenTop`autoTop`positionTop`center`clientLeft`setOffsetTop`backgroundTop`protocol`onpropertychange`INPUT`zoom`crop`trans`IE7_PNG_SUFFIX`x00`x_bits`char`x5cnstatic`x_height`x5cn`x_width`javascript`gif`blank`userAgent`bSV1`sizingMethod`AlphaImageLoader`DXImageTransform`progid`toLowerCase`srcElement`onmouseup`activeElement`onblur`onfocus`onmousedown`onmouseout`onmouseover`child`first`children`scriptlet`text`htm`data`after`insertBefore`innerText`setInterval`specificity`x5cu`align`vertical`with`css2`fixHeight`Bottom`Right`paddingRight`paddingLeft`Math`model`onsubmit`reset`form`onclick`textarea`label`xhtml`org`www`http`namespaces`replaceChild`html4`previousSibling`nodeType`clip`border`padding`unquote`contentEditable`onbeforeunload`detachEvent`import`namespace`concat`Array`constructor`size`font`medium`list`float`relative`sizing`lastIndex`successfully`media`ball`bscreen`write`createStyleSheet`ie5`file`not`could`responseText`send`GET`open`XMLHTTP`ActiveXObject`margin`Document`XML`xml`unknown`typeof`CSS1Compat`compatMode`ie7_off`MSIE`ie7_debug`alpha`version`visible`visibility`fromCharCode`¦®`¦­ (\\d\\.\\d)`¦¬`^¤±`\\.¦§$`^[\\w\\.]+[^:]*$`(Ô\\([\x27"]?)([\\w\\.]+[^:\\)]*[\x27"]?\\))`\\¥ö\\b|\\¥õ\\b|^$`Î-â`(¥ï\\s*:\\s*(À|×))`¢à\\s*:\\s*¥î-£·`^[^>\\+~\\s]`[\\s>\\+~:@#\\.\\(\\)]|[^\\s>\\+~:@#\\.\\(\\)]+`\\|`([\\s>~\\,]|[^(]\\+|^)([\\.:#@])`(\\¢û\\*[^\\*]*\\*+([^\\¢û][^\\*]*\\*+)*\\¢û)|(\x27[^\x27]*\x27)|("[^"]*")`@(¥ç|¥æ)[^;\\n]+[;\\n]|<!\\-\\-|\\-\\->`\\Ñ:`^\\s+|\\s*([\\{\\}\\+\\,>~\\s;])\\s*|\\s+$`\x27(\\d+)\x27`(\x27[^\x27]*\x27)|("[^"]*")` ©="([^"]*)"`^(£â|¥Ñ|¤Ë)$`^\\d\\w*$`^\\d+%$`^\\d+(px)?$`\\b(£­|¢æ)-(°|÷)\\s*:\\s*\\d`\\b(£­|¢æ)-°\\s*:\\s*\\d`^å|0cm$`^å$`£­`£÷`°`£ù`À`¥Ë`×`>`(\\ba(\\.[\\w-]+)?)$`\\{[^\\}]*\\}`::`([^\\}\\s]*\\,[^\\{]*)(\\{\\d+\\})`\\{(\\d+)\\}`[+>~]`\\Ñ([a-fA-F\\d]+)`^Ô\\(.*\\)$`([^}]*):(¤µ|¥¿)[^{]*\\{([^}]*)\\}`Å\\s*:\\s*([^;]*)(;|$)`([\\¢û()[\\]?{}|*+])`=`\\¥ª\\b`%1`£Ñ(-¢õ)?\\s*:([^(};]*)Ô\\(([^\\)]+)\\)([^;}]*)`¤¢`X`¦±`ª ¦° 0.7.3 (¦¯)`\\n\\n`¦ª`¦¨`¦¦ ¦¥`:â{Î-â:â}:¢È{Î-â:¢È}`*{¦¤:0}`¢Ò=``/`¤¦.¦¢`¥ÿ`£¿ [1]: ¥ü ¥û ê ¥ú `Î-¥ù.js`¢¸`<Ì></Ì>`$1`$2`Ì`¢í ¥ó`£¿ [2]: `([^{}]*)\\Ñ{([^}]*[^\\¢¨-])?`gi`£á-¥ñ\\»*:\\»*Å-£á`³\\»*:\\»*¢ð`¥ð`¢à:¤¼;$1`¢à:¤Ò`xx-£¸,x-£¸,£¸,¥í,£è,x-£è,xx-£è`,`xx-£¸`(¥ì(-¥ë)?\\»*:\\»*)(`|`)`$1*$2` *#`(` `*`#`.`(^|\\»)`(\\»|$)`:`â`¢È`\\Ñ([^)]*\\Ñ)`Î-â`\x27`\\Ñ:`¥ä`¢Ä`³:¢ð;¥á:0;¢à:¤Ò;¥à:£Ð;¥ß:£¬(0 0 0 0);À:-9999`!`Î-¥Ü`<¤Î:`/>`</`>`¤Î`¥Ù://¥Ø.w3.¥×/1999/¥Ö`¥Õ`ð,£å,¥Ô`¤Ì` ¤Ì`¤Ë,ð`¤É`£â`¥Ó`².¢Ì.`.¦.£ã=ë`¥Ò`¥Ð`.¢ç=ë`.©=\x27`Î-£á-¥Ï`\\»*:\\»*\\¢Ã[\\¢¨%]*`Ç`HR`°\\»*:\\»*\\¢Ã\\¢¨*[^%]`å`£­-°`¢æ`¢æ-°`¢ð`×`£í`£ö`÷`£ø`¢ò`¥Ê`¢î`Î-¥È`[^},\\»]*([>+~][^:@,\\»{]+|:(`)|\\Ñ.[\\¢¨-]+\\Ñ.[\\¢¨-.]+|@[@\\¢Ã]+)`g`[^\\»(]+[+~]|@\\¢Ã+|:(â|¢È|`)|\\Ñ.[\\¢¨-.]+`([^}]*):(`)([^{]*)`\\Ñ[([^`=\\Ñ]]+)([`]?=?)([^\\Ñ]]+)?\\Ñ]`{`}`\\»`\\¤¯`¤®`¢Á`.¢ÿ{¥Æ-¥Å:¢ò;¢à:¤¼}`\x27\\¥Ä`0000`¤µ`;`<¢Ä ¤°=¢ÿ ¥¾=\x27`Î-Å.¥½`\x27 °=100% ÷=0 Õ=¥¼/x-¥»>`+`@`¥¹-¥¸`£Ø`^`i`¥·`¥¶`¥µ`¥´`¥³`¥±`id`¡.id.¬(/¤±\\¢Ã+/g,\x27\x27)`¤°`¡.¢Ý.¬(/\\¤¯\\»*¤®\\¢Ã+/g,\x27\x27)`¡.£×(\x27`\x27)`¡`¥ `¢ù`\\Ñ$1`=`==`~=`/(^|\\»)`(\\»|$)/.µ(`|=`/^`(-|$)/.µ(`¢Ù`¢÷`Î-¤£`¥®:¥­.¤¦.¥¬(î=%1,¥«=\x27¤¢\x27)`¥¨.¥§`¥¦:\x27#¤¤ ¥¥ 1\\¥¤#¤¤ ¥£ 1\\¥¢ ¥¡ ¤ÿ[]={0¤þ}\x27`-¤ü.¤£`$`±:`¤û`;¤ú:1;£Ñ`£Ð`£û,ð`¤ù`¢õ`¤ø`î`Î-Ç`³\\»*:\\»*Ç`£Ñ[\\¢¨\\»-]*:[^};]*Ç`ß`ù`Ô(`£û`Y`(ø(¦.¢¤)+².`.£î)||0`¢×`¢¤`À`¤ó`£ï`¦.¢Ô+².`.£î`¤ï`¤î`£¿ [0]: '.split('\x60')));
+/* packed with http://dean.edwards.name/packer/ */
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard.js b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard.js
new file mode 100644
index 0000000..2109905
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/ie7-standard.js
@@ -0,0 +1,2 @@
+/* IE7 version 0.7.3 (alpha) 2004/09/18 */
+if(!window.IE7)new function(){try{window.IE7=this;var DUMMY=this.addModule=new Function;function unHide(){if(document.body)document.body.style.visibility="visible"};this.toString=function(){return "IE7 version 0.7.3 (alpha)"};var alert=(/ie7_debug/.test(location.search))?function(message){window.alert(IE7+"\n\n"+message)}:DUMMY;var appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(location.search)||appVersion<5||!/^ms_/.test(document.documentElement.uniqueID))return unHide();var quirksMode=Boolean(document.compatMode!="CSS1Compat");var isHTML=(typeof document.mimeType=="unknown")?!/\.xml$/i.test(location.pathname):Boolean(document.mimeType!="XML Document");var LINKS=":link{ie7-link:link}:visited{ie7-link:visited}";var HEADER=LINKS;if(!isHTML)HEADER+="*{margin:0}";var HTMLFixes;var documentElement=document.documentElement;var modules={};this.addModule=function(name,script,autoload){if(!modules)return;if(loaded)eval("script="+String(script));if(autoload){script();script=DUMMY}modules[name]=script};var RELATIVE=/^[\w\.]+[^:]*$/;function makePath(href,path){if(RELATIVE.test(href))href=(path||"")+href;return href};function getPath(href,path){href=makePath(href,path);return href.slice(0,href.lastIndexOf("/")+1)};var path=getPath(document.scripts[document.scripts.length-1].src);var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");function load(href,path){try{href=makePath(href,path);httpRequest.open("GET",href,false);httpRequest.send();return httpRequest.responseText}catch(ignore){alert("Error [1]: could not load file "+href);return ""}};var push=function(array,item){return array.push(item)};var pop=function(array){return array.pop()};if(appVersion<5.5)eval(load("ie7-ie5.js",path));if(document.readyState=="complete"||!isHTML)document.createStyleSheet();else document.write("<style></style>");this.styleSheet=document.styleSheets[document.styleSheets.length-1];this.styleSheet.cssText=LINKS;this.styleSheet.ie7=true;var cssText={};function loadStyleSheet(styleSheet,path){var url=makePath(styleSheet.href,path);if(cssText[url])return "";cssText[url]=(styleSheet.disabled)?"":fixUrls(getCSSText(styleSheet,path),getPath(styleSheet.href,path));return cssText[url]};var getCSSText=function(styleSheet){return styleSheet.cssText};var URL=/(url\(['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function fixUrls(cssText,pathname){return cssText.replace(URL,"$1"+pathname.slice(0,pathname.lastIndexOf("/")+1)+"$2")};this.recalcs=[];this.parse=DUMMY;var complete=false;function _load(){try{complete=true;var MEDIA=/\bscreen\b|\ball\b|^$/i;var styleSheets=document.styleSheets;var inlineStyles=[];var styles=document.getElementsByTagName("style");for(var i=styles.length-1;i>=0;i--){push(inlineStyles,/ie7-link/.test(styles[i].innerHTML)?"":styles[i].innerHTML)}function getCSSText(styleSheet,path){var cssText="";if(MEDIA.test(styleSheet.media)){for(var i=0;i<styleSheet.imports.length;i++){cssText+=arguments.callee(styleSheet.imports[i],getPath(styleSheet.href,path))}cssText+=((styleSheet.href)?loadStyleSheet(styleSheet,path):pop(inlineStyles))}return cssText};IE7.cssText="";for(i=0;i<styleSheets.length;i++)IE7.cssText+=getCSSText(styleSheets[i],"");IE7.cssText=encode(IE7.cssText);for(i in modules)modules[i]();delete modules;if(HTMLFixes)HTMLFixes.apply();CSSFixes.apply();IE7.parse();IE7.styleSheet.cssText=HEADER+decode(IE7.cssText);for(i=0;i<styleSheets.length;i++){if(!styleSheets[i].disabled&&!styleSheets[i].ie7)styleSheets[i].cssText=""}IE7.recalc();alert("loaded successfully")}catch(error){alert("Error [2]: "+error.description)}finally{unHide()}};this.recalc=function(){CSSFixes.recalc();for(var i=0;i<this.recalcs.length;i++)this.recalcs[i]()};var CSSFixes=new function(){var fixes=[];this.addFix=function(){push(fixes,arguments)};var recalcs=[];this.addRecalc=function(pattern,fix){var reg=new RegExp("([^{}]*)\x5c{([^}]*[^\x5cw-])?"+pattern,"gi");var cssText=IE7.cssText;pattern=[];while(match=reg.exec(cssText)){push(pattern,match[1]);if(appVersion<5.5)cssText=cssText.slice(match.lastIndex)}if(pattern.length){pattern=pattern.toString();push(recalcs,arguments)}};this.apply=function(){for(var i=0;i<fixes.length;i++){IE7.cssText=IE7.cssText.replace(fixes[i][0],fixes[i][1])}this.addRecalc("box-sizing\x5cs*:\x5cs*content-box",boxSizing);this.addRecalc("position\x5cs*:\x5cs*absolute",function(element){if(element.offsetParent.currentStyle.position=="relative")boxSizing(element.offsetParent)})};this.recalc=function(){for(var i=0;i<recalcs.length;i++){var elements=cssQuery(recalcs[i][0]);for(var j=0;j<elements.length;j++)recalcs[i][1](elements[j])}};this.addFix(/(float\s*:\s*(left|right))/gi,"display:inline;$1");if(appVersion<6)this.addFix(/display\s*:\s*list-item/gi,"display:block");if(quirksMode){var SIZES="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var i=0;i<SIZES.length;i++)SIZES[SIZES[i]]=SIZES[i-1]||"xx-small";function replace($,$1,$2,$3){return $1+SIZES[$3]};this.addFix(new RegExp("(font(-size)?\x5cs*:\x5cs*)("+SIZES.join("|")+")","gi"),replace)}};var STANDARD_SELECT=/^[^>\+~\s]/;var STREAM=/[\s>\+~:@#\.\(\)]|[^\s>\+~:@#\.\(\)]+/g;var NAMESPACE=/\|/;var IMPLIED_SELECTOR=/([\s>~\,]|[^(]\+|^)([\.:#@])/g;var ASTERISK="$1*$2";var cssCache={};function cssQuery(selector,from){var useCache=!from;var base=(from)?(from.constructor==Array)?from:[from]:[document];var selectors=selector.replace(IMPLIED_SELECTOR,ASTERISK).split(",");var match=[];for(var i=0;i<selectors.length;i++){selector=toStream(selectors[i]);if(selector.slice(0,3).join("")==" *#"){selector=selector.slice(2);from=selectById(base,selector[1])}else from=base;var j=0,token,filter,filterArgs,cacheSelector="";while(j<selector.length){token=selector[j++];filter=selector[j++];cacheSelector+=token+filter;filterArgs="";if(selector[j]=="("){while(selector[j++]!=")")filterArgs+=selector[j];filterArgs=filterArgs.slice(0,-1);cacheSelector+="("+filterArgs+")"}from=(useCache&&cssCache[cacheSelector])?cssCache[cacheSelector]:select(from,token,filter,filterArgs);if(useCache)cssCache[cacheSelector]=from}match=match.concat(from)}return match};function toStream(selector){if(STANDARD_SELECT.test(selector))selector=" "+selector;return selector.match(STREAM)};function select(from,token,filter,filterArgs){var scopeName="";if(NAMESPACE.test(filter)){filter=filter.split("|");scopeName=filter[0];filter=filter[1]}var filtered=[];if(selectors[token])selectors[token](filtered,from,filter,scopeName||filterArgs);return filtered};function selectById(from,id){var filtered=[],i,j;for(i=0;i<from.length;i++){var match=from[i].all.item(id);if(match){if(match.length==null)push(filtered,match);else for(j=0;j<match.length;j++)push(filtered,match[j])}}return filtered};var selectors={" ":function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=(filter=="*"&&from[i].all)?from[i].all:from[i].getElementsByTagName(filter);for(var j=0;j<subset.length;j++){if(isElement(subset[j])&&(!scopeName||subset[j].scopeName==scopeName))push(filtered,subset[j])}}},"#":function(filtered,from,filter){for(var i=0;i<from.length;i++)if(from[i].id==filter)push(filtered,from[i])},".":function(filtered,from,filter){filter=new RegExp("(^|\x5cs)"+filter+"(\x5cs|$)");for(var i=0;i<from.length;i++)if(filter.test(from[i].className))push(filtered,from[i])},":":function(filtered,from,filter,filterArgs){filter=pseudoClasses[filter];if(filter)for(var i=0;i<from.length;i++)if(filter(from[i],filterArgs))push(filtered,from[i])}};var attributeTests="";var pseudoClasses={toString:function(){var toString=[];for(var pseudoClass in this){if(pseudoClass!="link"&&pseudoClass!="visited"){if(this[pseudoClass].length>1)pseudoClass+="\x5c([^)]*\x5c)";push(toString,pseudoClass)}}return toString.join("|")},"link":function(element){return Boolean(element.currentStyle["ie7-link"]=="link")},"visited":function(element){return Boolean(element.currentStyle["ie7-link"]=="visited")}};var dynamicPseudoClasses={toString:pseudoClasses.toString};function compareTagName(element,tagName,scopeName){if(scopeName&&element.scopeName!=scopeName)return false;return(tagName=="*")?isElement(element):(isHTML)?(element.tagName==tagName.toUpperCase()):(element.tagName==tagName)};var strings=[];function getString(string){return QUOTED.test(string)?strings[string.slice(1,-1)]:string};var encode=function(cssText){return cssText.replace(/(\x2f\*[^\*]*\*+([^\x2f][^\*]*\*+)*\x2f)|('[^']*')|("[^"]*")/g,function(match){return(match.charAt(0)=="/")?"":"'"+(push(strings,match.slice(1,-1))-1)+"'"}).replace(/@(namespace|import)[^;\n]+[;\n]|<!\-\-|\-\->/g,"").replace(/\x5c:/g,"|").replace(/^\s+|\s*([\{\}\+\,>~\s;])\s*|\s+$/g,"$1")};function decode(cssText){return cssText.replace(/\|/g,"\x5c:").replace(/'(\d+)'/g,function(match,key){return strings[key]})};var handlers=[];function addEventHandler(element,type,handler){element.attachEvent(type,handler);push(handlers,arguments)};function removeEventHandler(element,type,handler){try{element.detachEvent(type,handler)}catch(ignore){}};window.attachEvent("onbeforeunload",function(){while(handlers.length){var handler=pop(handlers);removeEventHandler(handler[0],handler[1],handler[2])}});var hasLayout=(appVersion<6)?function(element){return element.clientWidth}:function(element){return element.currentStyle.hasLayout};function boxSizing(element){if(!hasLayout(element)){element.contentEditable=false;fixMargins(firstChildElement(element))}};function fixMargins(element){while(element){element.runtimeStyle.marginTop=element.currentStyle.marginTop;element=nextElement(element)}};var QUOTED=/('[^']*')|("[^"]*")/;function quote(value){return(QUOTED.test(value))?value:"'"+value+"'"};function unquote(value){return(QUOTED.test(value))?value.slice(1,-1):value};function tmpElement(tagName){var element=document.createElement(tagName||"object");element.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";return element};function isElement(node){return Boolean(node&&node.nodeType==1&&node.tagName!="!"&&!node.ie7_anon)};function previousElement(element){while(element&&(element=element.previousSibling)&&!isElement(element))continue;return element};function nextElement(element){while(element&&(element=element.nextSibling)&&!isElement(element))continue;return element};function firstChildElement(element){element=element.firstChild;return(isElement(element))?element:nextElement(element)};var loaded=false;IE7.addModule("ie7-html4",function(){if(isHTML)HTMLFixes=new function(){var fixes=[];function fix(element){var fixedElement=document.createElement("<HTML:"+element.outerHTML.slice(1));if(element.outerHTML.slice(-2)!="/>"){var endTag="</"+element.tagName+">",nextSibling;while((nextSibling=element.nextSibling)&&nextSibling.outerHTML!=endTag){element.parentNode.removeChild(nextSibling);fixedElement.appendChild(nextSibling)}if(nextSibling)element.parentNode.removeChild(nextSibling)}element.parentNode.replaceChild(fixedElement,element);return fixedElement};this.add=function(){push(fixes,arguments)};this.apply=function(){try{if(appVersion>5)document.namespaces.add("HTML","http://www.w3.org/1999/xhtml")}catch(ignore){}finally{for(var i=0;i<fixes.length;i++){var elements=cssQuery(fixes[i][0]);for(var j=0;j<elements.length;j++)fixes[i][1](elements[j])}}};this.add("label",function(element){if(!element.htmlFor){var input=cssQuery("input,select,textarea",element)[0];if(input){if(!input.id)input.id=input.uniqueID;element.htmlFor=input.id}}});this.add("abbr",function(element){fix(element);delete cssCache[" abbr"]});this.add("button,input",function(element){if(element.tagName=="BUTTON"){var match=element.outerHTML.match(/ value="([^"]*)"/i);element.runtimeStyle.value=(match)?match[1]:""}if(element.type=="submit"){addEventHandler(element,"onclick",function(){element.runtimeStyle.clicked=true;setTimeout("document.all."+element.uniqueID+".runtimeStyle.clicked=false",1)})}});this.add("form",function(element){var UNSUCCESSFUL=/^(submit|reset|button)$/;addEventHandler(element,"onsubmit",function(){for(var i=0;i<element.length;i++){if(UNSUCCESSFUL.test(element[i].type)&&!element[i].disabled&&!element[i].runtimeStyle.clicked){element[i].disabled=true;setTimeout("document.all."+element[i].uniqueID+".disabled=false",1)}else if(element[i].tagName=="BUTTON"&&element[i].type=="submit"){setTimeout("document.all."+element[i].uniqueID+".value='"+element[i].value+"'",1);element[i].value=element[i].runtimeStyle.value}}})})}},true);IE7.addModule("ie7-box-model",function(){var NUMERIC="\x5cs*:\x5cs*\x5cd[\x5cw%]*",UNIT=/^\d\w*$/,PERCENT=/^\d+%$/,PIXEL=/^\d+(px)?$/;var MATCH=(appVersion<6)?/\b(min|max)-(width|height)\s*:\s*\d/gi:/\b(min|max)-width\s*:\s*\d/gi;var AUTO=(appVersion<5.5)?/^auto|0cm$/:/^auto$/;var ie7_tmp=tmpElement();push(IE7.recalcs,function removeTempElement(){if(ie7_tmp.parentElement)ie7_tmp.parentElement.removeChild(ie7_tmp)});CSSFixes.addFix(MATCH,function(match){return match.slice(0,3)+match.charAt(4).toUpperCase()+match.slice(5)});var viewport=(quirksMode)?document.body:documentElement;function isFixed(element){return element.style.position=="fixed"||element.currentStyle.position=="fixed"};function layoutParent(element){var layoutParent=element.offsetParent;while(layoutParent&&!hasLayout(layoutParent))layoutParent=layoutParent.offsetParent;if(!layoutParent||isFixed(element))layoutParent=viewport;return layoutParent};function fixWidth(HEIGHT){fixWidth=function(element,value){if(!element.runtimeStyle.fixedWidth&&(!isHTML||element.tagName!="HR")){if(!value)value=element.currentStyle.width;element.runtimeStyle.fixedWidth=(UNIT.test(value))?Math.max(0,getFixedWidth(element,value)):value;element.runtimeStyle.width=element.runtimeStyle.fixedWidth;boxSizing(element)}};if(quirksMode)CSSFixes.addRecalc("width\x5cs*:\x5cs*\x5cd\x5cw*[^%]",fixWidth);var getFixedWidth=(quirksMode)?function(element,value){return getPixelWidth(element,value)+getBorderWidth(element)+getPaddingWidth(element)}:function(element,value){return getPixelWidth(element,value)};function getBorderWidth(element){return element.offsetWidth-element.clientWidth};function getPaddingWidth(element){return getPixelWidth(element,element.currentStyle.paddingLeft)+getPixelWidth(element,element.currentStyle.paddingRight)};function getMarginWidth(element){return((element.currentStyle.marginLeft=="auto")?0:getPixelLeft(element,element.currentStyle.marginLeft))+((element.currentStyle.marginRight=="auto")?0:getPixelLeft(element,element.currentStyle.marginRight))};function minWidth(element){minWidth[minWidth.count++]=element;if(element.currentStyle.minHeight=="auto")element.runtimeStyle.minHeight=0;fixWidth(element);boxSizing(element);resizeWidth(element)};minWidth.count=0;CSSFixes.addRecalc("min-width"+NUMERIC,minWidth);eval(String(minWidth).replace(/min/g,"max"));maxWidth.count=0;CSSFixes.addRecalc("max-width"+NUMERIC,maxWidth);function resizeWidth(element){var rect=element.getBoundingClientRect();var width=rect.right-rect.left;if(element.currentStyle.maxWidth&&width>=getFixedWidth(element,element.currentStyle.maxWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.maxWidth);else if(element.currentStyle.minWidth&&width<=getFixedWidth(element,element.currentStyle.minWidth))element.runtimeStyle.width=getFixedWidth(element,element.currentStyle.minWidth);else element.runtimeStyle.width=element.runtimeStyle.fixedWidth};function fixRight(element){if((element.currentStyle.position=="absolute"||element.currentStyle.position=="fixed")&&element.currentStyle.left!="auto"&&element.currentStyle.right!="auto"&&AUTO.test(element.currentStyle.width)){fixRight[fixRight.count++]=element;boxSizing(element);resizeRight(element)}};fixRight.count=0;CSSFixes.addRecalc("right"+NUMERIC,fixRight);function resizeRight(element){element.runtimeStyle.width="";var parentElement=layoutParent(element);var left=(element.runtimeStyle.screenLeft)?element.getBoundingClientRect().left-2:getPixelLeft(element,element.currentStyle.left);var width=parentElement.clientWidth-getPixelLeft(element,element.currentStyle.right)-left-getMarginWidth(element);if(!quirksMode)width-=getBorderWidth(element)+getPaddingWidth(element);if(width<0)width=0;if(isFixed(element)||HEIGHT||element.offsetWidth<width){element.runtimeStyle.fixedWidth=width;element.runtimeStyle.width=width}};var clientWidth=documentElement.clientWidth;addEventHandler(window,"onresize",function(){var i,wider=(clientWidth<documentElement.clientWidth);clientWidth=documentElement.clientWidth;for(i=0;i<minWidth.count;i++){var element=minWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.minWidth);if(wider&&fixedWidth)element.runtimeStyle.width="";if(wider==fixedWidth)resizeWidth(element)}for(i=0;i<maxWidth.count;i++){var element=maxWidth[i];var fixedWidth=(element.runtimeStyle.width==element.currentStyle.maxWidth);if(!wider&&fixedWidth)element.runtimeStyle.width="";if(wider!=fixedWidth)resizeWidth(element)}for(i=0;i<fixRight.count;i++)resizeRight(fixRight[i]);removeTempElement()});function getPixelWidth(element,value){if(PIXEL.test(value))return parseInt(value);if(PERCENT.test(value))return parseInt(parseFloat(value)/100*layoutParent(element).clientWidth);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);ie7_tmp.style.width=value;return ie7_tmp.offsetWidth};function getPixelLeft(element,value){if(parseInt(value)>0)return getPixelWidth(element,value);if(PIXEL.test(value))return parseInt(value);element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=value;return ie7_tmp.offsetLeft}};eval(String(fixWidth).replace(/Width/g,"Height").replace(/width/g,"height").replace(/Left/g,"Top").replace(/left/g,"top").replace(/Right/g,"Bottom").replace(/right/g,"bottom"));fixWidth();fixHeight(true)});IE7.addModule("ie7-css2",function(){var CHILD=/>/g,ANCHOR=/(\ba(\.[\w-]+)?)$/i;IE7.classes=[];IE7.parser=new Parser;IE7.Class=Class;IE7.DynamicStyle=DynamicStyle;IE7.PseudoElement=PseudoElement;IE7.parse=function(){with(this.parser)this.cssText=decode(parse(encode(this.cssText)));for(var i=0;i<IE7.classes.length;i++)IE7.classes[i].exec();for(i=0;i<pseudoElements.length;i++)pseudoElements[i].create()};getCSSText=function(styleSheet,path){return load(styleSheet.href,path)};var encoded=[];function Parser(){this.parse=function(cssText){Class.ALL=new RegExp("[^},\x5cs]*([>+~][^:@,\x5cs{]+|:("+pseudoClasses+")|\x5c.[\x5cw-]+\x5c.[\x5cw-.]+|@[@\x5cd]+)","g");Class.COMPLEX=new RegExp("[^\x5cs(]+[+~]|@\x5cd+|:(link|visited|"+pseudoClasses+"|"+dynamicPseudoClasses+")|\x5c.[\x5cw-.]+","g");DynamicStyle.ALL=new RegExp("([^}]*):("+dynamicPseudoClasses+")([^{]*)","g");return cssText.replace(PseudoElement.ALL,PseudoElement.ID).replace(DynamicStyle.ALL,DynamicStyle.ID).replace(Class.ALL,Class.ID)};this.encode=function(cssText){AttributeSelector.ALL=new RegExp("\x5c[([^"+attributeTests+"=\x5c]]+)(["+attributeTests+"]?=?)([^\x5c]]+)?\x5c]","g");return cssText.replace(AttributeSelector.ALL,AttributeSelector.ID).replace(/\{[^\}]*\}/g,function($){return "{"+(push(encoded,$)-1)+"}"}).replace(/::/g,":").replace(/([^\}\s]*\,[^\{]*)(\{\d+\})/g,function(match,left,right){return left.split(",").join(right)+right})};this.decode=function(cssText){return cssText.replace(/\{(\d+)\}/g,function($,$1){return encoded[$1]})}};function _Class(){this.toString=function(){return "."+this.name};this.add=function(element){element.className+=" "+this.name};this.remove=function(element){element.className=element.className.replace(this.MATCH,"")};this.exec=function(){var match=cssQuery(this.selector);for(var i=0;i<match.length;i++)this.add(match[i])}};function Class(selector,cssText){this.id=IE7.classes.length;this.name=Class.PREFIX+this.id;this.selector=selector;this.MATCH=new RegExp("\x5cs"+this.name+"\x5cb","g");push(IE7.classes,this)};Class.ancestor=_Class;Class.prototype=new _Class;Class.PREFIX="ie7_";Class.ID=function(match){return simpleSelector(match)+new Class(match)};function _DynamicStyle(){this.exec=function(){var match=cssQuery(this.attach);for(var i=0;i<match.length;i++){var target=(this.target)?cssQuery(this.target,match[i]):[match[i]];if(target)this.dynamicPseudoClass(match[i],target,this)}}};_DynamicStyle.prototype=new _Class;function DynamicStyle(selector,attach,dynamicPseudoClass,target){this.attach=attach;this.dynamicPseudoClass=dynamicPseudoClasses[dynamicPseudoClass];this.target=target;this.inherit=Class;this.inherit(selector)};DynamicStyle.ancestor=_DynamicStyle;DynamicStyle.prototype=new _DynamicStyle;DynamicStyle.ID=function(match,attach,dynamicPseudoClass,target){if(isHTML&&dynamicPseudoClass!="focus"&&ANCHOR.test(attach)&&!/[+>~]/.test(target))return match;return simpleSelector(match)+new DynamicStyle(match,attach,dynamicPseudoClass,target)};HEADER+=".ie7_anon{vertical-align:top;display:inline}";var HEX=/\x5c([a-fA-F\d]+)/g;function unicode(match,code){return eval("'\x5cu"+"0000".slice(code.length)+code+"'")};var pseudoElements=[];function _PseudoElement(){this.content=null;this.toString=function(){return ""};this.specificity=0;function addTimer(object,content,cssText){var timer=setInterval(function(){try{if(!object.load)return;object.load(object,content,cssText);clearInterval(timer)}catch(ignore){clearInterval(timer)}},10)};this.create=function(){if(this.content==null)return;for(var i=0;i<this.match.length;i++){var target=this.match[i];var pseudoElement=target.runtimeStyle[this.position];if(pseudoElement){var parentElement=target.canHaveChildren?target:target.parentElement;var isURL=/^url\(.*\)$/.test(this.content);var element=document.createElement(isURL?PseudoElement.OBJECT:"!");element.ie7_anon=true;element.runtimeStyle.cssText=pseudoElement.cssText;if(!isURL)element.innerText=pseudoElement.content;if(this.position=="before"){parentElement.insertBefore(element,parentElement.firstChild)}else{parentElement.appendChild(element)}if(isURL)addTimer(element,pseudoElement.content,pseudoElement.cssText);target.runtimeStyle[this.position]=null}}};this.exec=function(){this.match=cssQuery(this.selector);for(var i=0;i<this.match.length;i++){var runtimeStyle=this.match[i].runtimeStyle;if(!runtimeStyle[this.position])runtimeStyle[this.position]={cssText:""};runtimeStyle[this.position].cssText+=";"+this.cssText;if(this.content!=null)runtimeStyle[this.position].content=this.content}}};_PseudoElement.prototype=new _Class;function PseudoElement(selector,position,cssText){this.position=position;this.cssText=encoded[cssText].slice(1,-1);var content=this.cssText.match(PseudoElement.CONTENT);if(content)this.content=getString(content[1]).replace(HEX,unicode);this.inherit=Class;this.inherit(selector);push(pseudoElements,this)};PseudoElement.ancestor=_PseudoElement;PseudoElement.prototype=new _PseudoElement;PseudoElement.ID=function(match,selector,position,cssText){return new PseudoElement(selector,position,cssText)};PseudoElement.ALL=/([^}]*):(before|after)[^{]*\{([^}]*)\}/g;PseudoElement.CONTENT=/content\s*:\s*([^;]*)(;|$)/;PseudoElement.OBJECT="<object class=ie7_anon data='"+makePath("ie7-content.htm",path)+"' width=100% height=0 type=text/x-scriptlet>";selectors[">"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var subset=from[i].children;for(var j=0;j<subset.length;j++)if(compareTagName(subset[j],filter,scopeName))push(filtered,subset[j])}};selectors["+"]=function(filtered,from,filter,scopeName){for(var i=0;i<from.length;i++){var adjacent=nextElement(from[i]);if(adjacent&&compareTagName(adjacent,filter,scopeName))push(filtered,adjacent)}};selectors["@"]=function(filtered,from,filter){filter=attributeSelectors[filter];for(var i=0;i<from.length;i++)if(filter(from[i]))push(filtered,from[i])};pseudoClasses["first-child"]=function(element){return!previousElement(element)};pseudoClasses["lang"]=function(element,filterArgs){filterArgs=new RegExp("^"+filterArgs,"i");while(element&&!element.getAttribute("lang"))element=element.parentNode;return element&&filterArgs.test(element.getAttribute("lang"))};dynamicPseudoClasses.hover=function(element){var instance=arguments;addEventHandler(element,"onmouseover",function(){IE7.Event.hover.register(instance)});addEventHandler(element,"onmouseout",function(){IE7.Event.hover.unregister(instance)})};dynamicPseudoClasses.active=function(element){var instance=arguments;addEventHandler(element,"onmousedown",function(){IE7.Event.active.register(instance)})};dynamicPseudoClasses.focus=function(element){var instance=arguments;addEventHandler(element,"onfocus",function(){IE7.Event.focus.register(instance)});addEventHandler(element,"onblur",function(){IE7.Event.focus.unregister(instance)});if(element==document.activeElement){IE7.Event.focus.register(instance)}};addEventHandler(document,"onmouseup",function(){var ie7Event=IE7.Event.active;var instances=ie7Event.instances,i;for(i in instances)ie7Event.unregister(instances[i]);ie7Event=IE7.Event.hover;instances=ie7Event.instances;for(i in instances)if(!instances[i][0].contains(event.srcElement))ie7Event.unregister(instances[i])});var attributeSelectors=[];var ESCAPE=/([\x2f()[\]?{}|*+])/g;function AttributeSelector(attribute,compare,value){value=getString(value);this.id=attributeSelectors.length;switch(attribute.toLowerCase()){case "id":attribute="element.id.replace(/ms_\x5cd+/g,'')";break;case "class":attribute="element.className.replace(/\x5cb\x5cs*ie7_\x5cd+/g,'')";break;default:attribute="element.getAttribute('"+attribute+"')"}compare=attributeTests[compare];push(attributeSelectors,new Function("element","return "+compare(attribute,value)))};AttributeSelector.ID=function(match,attribute,compare,value){return new AttributeSelector(attribute,compare,value)};AttributeSelector.prototype.toString=function(){return AttributeSelector.PREFIX+this.id};attributeTests={toString:function(){var toString=[];for(var i in this)if(i&&i!="escape")push(toString,i);return toString.join("").replace(/=/g,"")},escape:function(value){return value.replace(ESCAPE,"\x5c$1")},"":function(attribute){return attribute},"=":function(attribute,value){return attribute+"=="+quote(value)},"~=":function(attribute,value){return "/(^|\x5cs)"+attributeTests.escape(value)+"(\x5cs|$)/.test("+attribute+")"},"|=":function(attribute,value){return "/^"+attributeTests.escape(value)+"(-|$)/.test("+attribute+")"}};AttributeSelector.PREFIX="@";function _ie7Event(){this.register=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.add(target[i]);this.instances[Class.id+element.uniqueID]=instance};this.unregister=function(instance){var element=instance[0];var target=instance[1];var Class=instance[2];for(var i=0;i<target.length;i++)Class.remove(target[i]);delete this.instances[Class.id+element.uniqueID]}};IE7.Event=function(type){this.type=type;this.instances={};IE7.Event[type]=this};IE7.Event.prototype=new _ie7Event;new IE7.Event("hover");new IE7.Event("active");new IE7.Event("focus");function simpleSelector(selector){return selector.replace(Class.COMPLEX,"").replace(CHILD," ")}},true);IE7.addModule("ie7-png",function(){if(appVersion<5.5)return;var FILTER="progid:DXImageTransform.Microsoft.AlphaImageLoader(src=%1,sizingMethod='scale')";var NULL=(/\bSV1\b/.test(navigator.userAgent))?makePath("blank.gif",path):"javascript:'#define x_width 1\x5cn#define x_height 1\x5cnstatic char x_bits[]={0x00}'";var pngTest=new RegExp((window.IE7_PNG_SUFFIX||"-trans.png")+"$","i");function addFilter(element,src){element.runtimeStyle.filter=FILTER.replace(/%1/,src)};var MATCH=/background(-image)?\s*:([^(};]*)url\(([^\)]+)\)([^;}]*)/gi;CSSFixes.addFix(MATCH,function replace(match,image,prefix,url,suffix){url=getString(url);return pngTest.test(url)?"filter:"+FILTER.replace(/scale/,"crop").replace(/%1/,url)+";zoom:1;background"+(image||"")+":"+(prefix||"")+"none"+(suffix||""):match});if(HTMLFixes){function fixImg(element){if(pngTest.test(element.src)){var width=element.width,height=element.height;addFilter(element,element.src);element.src=NULL;element.width=width;element.height=height}else element.runtimeStyle.filter=""};HTMLFixes.add("img,input",function(element){if(element.tagName=="INPUT"&&element.type!="image")return;fixImg(element);addEventHandler(element,"onpropertychange",function(){if(event.propertyName=="src")fixImg(element)})})}});IE7.addModule("ie7-fixed",function(){var PERCENT=/^\d+%$/;CSSFixes.addRecalc("position\x5cs*:\x5cs*fixed",positionFixed);CSSFixes.addRecalc("background[\x5cw\x5cs-]*:[^};]*fixed",backgroundFixed);var body=document.body;var viewport$=(quirksMode)?"body":"documentElement";var viewport=eval(viewport$);function fixBackground(){if(body.currentStyle.backgroundAttachment!="fixed"){if(body.currentStyle.backgroundImage=="none"){body.runtimeStyle.backgroundImage="url("+location.protocol+")"}body.runtimeStyle.backgroundAttachment="fixed"}fixBackground=DUMMY};var ie7_tmp=tmpElement("img");function topFunction(leftFunction){return String(leftFunction).replace(/Left/g,"Top").replace(/left/g,"top").replace(/Width/g,"Height").replace(/X/g,"Y")};function backgroundFixed(element){if(element.currentStyle.backgroundAttachment!="fixed")return;if(!element.contains(body)){fixBackground();backgroundFixed[backgroundFixed.count++]=element;backgroundLeft(element);backgroundTop(element);backgroundPosition(element)}};backgroundFixed.count=0;function backgroundPosition(element){ie7_tmp.src=element.currentStyle.backgroundImage.slice(5,-2);var parentElement=(element.canHaveChildren)?element:element.parentElement;parentElement.appendChild(ie7_tmp);setOffsetLeft(element);setOffsetTop(element);parentElement.removeChild(ie7_tmp)};function backgroundLeft(element){element.style.backgroundPositionX=element.currentStyle.backgroundPositionX;if(!isFixed(element)){var expression="(parseInt(runtimeStyle.offsetLeft)+document."+viewport$+".scrollLeft)||0";element.runtimeStyle.setExpression("backgroundPositionX",expression)}};eval(topFunction(backgroundLeft));function setOffsetLeft(element){var propertyName=isFixed(element)?"backgroundPositionX":"offsetLeft";element.runtimeStyle[propertyName]=getOffsetLeft(element,element.style.backgroundPositionX)-element.getBoundingClientRect().left-element.clientLeft};eval(topFunction(setOffsetLeft));function isFixed(element){if(!element)return false;if(element.style.position=="fixed"||element.currentStyle.position=="fixed")return true;return arguments.callee(element.parentElement)};function getOffsetLeft(element,position){switch(position){case "left":case "top":return 0;case "right":case "bottom":return viewport.clientWidth-ie7_tmp.offsetWidth;case "center":return(viewport.clientWidth-ie7_tmp.offsetWidth)/2;default:if(PERCENT.test(position)){return parseInt((viewport.clientWidth-ie7_tmp.offsetWidth)*parseFloat(position)/100)}ie7_tmp.style.left=position;return ie7_tmp.offsetLeft}};eval(topFunction(getOffsetLeft));function positionFixed(element){if(element.currentStyle.position!="fixed")return;fixBackground();positionFixed[positionFixed.count++]=element;element.style.position="fixed";element.runtimeStyle.position="absolute";foregroundPosition(element)};positionFixed.count=0;function foregroundPosition(element,recalc){positionLeft(element,recalc);positionTop(element,recalc);if(!recalc||element.runtimeStyle.autoTop){if(parseInt(element.currentStyle.bottom)==0)element.runtimeStyle.screenTop++}};function positionLeft(element,recalc){if(!recalc&&PERCENT.test(element.currentStyle.width))element.runtimeStyle.fixWidth=element.currentStyle.width;if(element.runtimeStyle.fixWidth)element.runtimeStyle.width=parseInt(parseFloat(element.runtimeStyle.fixWidth)/100*viewport.clientWidth);if(recalc){if(!element.runtimeStyle.autoLeft)return}else{element.runtimeStyle.autoLeft=element.currentStyle.right!="auto"&&element.currentStyle.left=="auto"}element.runtimeStyle.left="";element.runtimeStyle.screenLeft=getScreenLeft(element);if(element.currentStyle.marginLeft!="auto"){element.parentElement.appendChild(ie7_tmp);ie7_tmp.style.left=element.currentStyle.marginLeft;element.runtimeStyle.screenLeft-=ie7_tmp.offsetLeft;element.parentElement.removeChild(ie7_tmp)}if(isFixed(element.offsetParent))element.runtimeStyle.pixelLeft=element.runtimeStyle.screenLeft;else if(!recalc)element.runtimeStyle.setExpression("pixelLeft","runtimeStyle.screenLeft+document."+viewport$+".scrollLeft")};eval(topFunction(positionLeft).replace(/right/g,"bottom").replace(/width/g,"height"));function getScreenLeft(element){var getScreenLeft=element.offsetLeft,nested=false;var fixed=isFixed(element.offsetParent)&&element.runtimeStyle.autoLeft;while(element=element.offsetParent){if(!fixed&&element.currentStyle.position!="static")nested=true;getScreenLeft+=element.offsetLeft*(nested?-1:1)}return getScreenLeft};eval(topFunction(getScreenLeft));function resize(){for(var i=0;i<backgroundFixed.count;i++)backgroundPosition(backgroundFixed[i]);for(i=0;i<positionFixed.count;i++)foregroundPosition(positionFixed[i],true);timer=0};var timer;addEventHandler(window,"onresize",function(){if(!timer)timer=setTimeout(resize,10)})});loaded=true;if(document.readyState=="complete")_load();else addEventHandler(document,"onreadystatechange",function(){if(!complete&&document.readyState=="complete")setTimeout(_load,0)})}catch(error){unHide();alert("Error [0]: "+error.description)}finally{}}();
diff --git a/src/usr/local/www/themes/the_wall/javascript/ie7/test-trans.png b/src/usr/local/www/themes/the_wall/javascript/ie7/test-trans.png
new file mode 100755
index 0000000..e187e2c
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/ie7/test-trans.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/grey-40.png b/src/usr/local/www/themes/the_wall/javascript/img/grey-40.png
new file mode 100755
index 0000000..758b716
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/img/grey-40.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/submenu-off.gif b/src/usr/local/www/themes/the_wall/javascript/img/submenu-off.gif
new file mode 100755
index 0000000..ddcdcae
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/img/submenu-off.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/submenu-on.gif b/src/usr/local/www/themes/the_wall/javascript/img/submenu-on.gif
new file mode 100755
index 0000000..7a58077
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/img/submenu-on.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/white-90.png b/src/usr/local/www/themes/the_wall/javascript/img/white-90.png
new file mode 100755
index 0000000..efc84b4
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/img/white-90.png
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/img/x.gif b/src/usr/local/www/themes/the_wall/javascript/img/x.gif
new file mode 100755
index 0000000..5bfd67a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/img/x.gif
Binary files differ
diff --git a/src/usr/local/www/themes/the_wall/javascript/niftyjsCode.js b/src/usr/local/www/themes/the_wall/javascript/niftyjsCode.js
new file mode 100644
index 0000000..e71ea14
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/niftyjsCode.js
@@ -0,0 +1,174 @@
+function NiftyCheck(){
+if(!document.getElementById || !document.createElement)
+ return(false);
+isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName);
+if(Array.prototype.push==null){Array.prototype.push=function(){
+ this[this.length]=arguments[0]; return(this.length);};}
+return(true);
+}
+
+function Rounded(selector,wich,bk,color,opt){
+var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false;
+
+if(color=="transparent"){
+ cn=cn+"x";
+ ecolor=bk;
+ bk="transparent";
+ }
+else if(opt && opt.indexOf("border")>=0){
+ var optar=opt.split(" ");
+ for(i=0;i<optar.length;i++)
+ if(optar[i].indexOf("#")>=0) ecolor=optar[i];
+ if(ecolor=="") ecolor="#666";
+ cn+="e";
+ edges=true;
+ }
+else if(opt && opt.indexOf("smooth")>=0){
+ cn+="a";
+ ecolor=Mix(bk,color);
+ }
+if(opt && opt.indexOf("small")>=0) cn+="s";
+prefixt=cn;
+prefixb=cn;
+if(wich.indexOf("all")>=0){t=true;b=true;}
+else if(wich.indexOf("top")>=0) t="true";
+else if(wich.indexOf("tl")>=0){
+ t="true";
+ if(wich.indexOf("tr")<0) prefixt+="l";
+ }
+else if(wich.indexOf("tr")>=0){
+ t="true";
+ prefixt+="r";
+ }
+if(wich.indexOf("bottom")>=0) b=true;
+else if(wich.indexOf("bl")>=0){
+ b="true";
+ if(wich.indexOf("br")<0) prefixb+="l";
+ }
+else if(wich.indexOf("br")>=0){
+ b="true";
+ prefixb+="r";
+ }
+var v=getElementsBySelector(selector);
+var l=v.length;
+for(i=0;i<l;i++){
+ if(edges) AddBorder(v[i],ecolor);
+ if(t) AddTop(v[i],bk,color,ecolor,prefixt);
+ if(b) AddBottom(v[i],bk,color,ecolor,prefixb);
+ }
+}
+
+function AddBorder(el,bc){
+var i;
+if(!el.passed){
+ if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
+ var t=el.firstChild.nodeValue;
+ el.removeChild(el.lastChild);
+ var d=CreateEl("span");
+ d.style.display="block";
+ d.appendChild(document.createTextNode(t));
+ el.appendChild(d);
+ }
+ for(i=0;i<el.childNodes.length;i++){
+ if(el.childNodes[i].nodeType==1){
+ el.childNodes[i].style.borderLeft="1px solid "+bc;
+ el.childNodes[i].style.borderRight="1px solid "+bc;
+ }
+ }
+ }
+el.passed=true;
+}
+
+function AddTop(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=1;i<=lim;i++){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingTop=0;
+el.insertBefore(d,el.firstChild);
+}
+
+function AddBottom(el,bk,color,bc,cn){
+var i,lim=4,d=CreateEl("b");
+
+if(cn.indexOf("s")>=0) lim=2;
+if(bc) d.className="artop";
+else d.className="rtop";
+d.style.backgroundColor=bk;
+for(i=lim;i>0;i--){
+ var x=CreateEl("b");
+ x.className=cn + i;
+ x.style.backgroundColor=color;
+ if(bc) x.style.borderColor=bc;
+ d.appendChild(x);
+ }
+el.style.paddingBottom=0;
+el.appendChild(d);
+}
+
+function CreateEl(x){
+if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x));
+else return(document.createElement(x));
+}
+
+function getElementsBySelector(selector){
+var i,selid="",selclass="",tag=selector,f,s=[],objlist=[];
+
+if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
+ s=selector.split(" ");
+ var fs=s[0].split("#");
+ if(fs.length==1) return(objlist);
+ f=document.getElementById(fs[1]);
+ if(f) return(f.getElementsByTagName(s[1]));
+ return(objlist);
+ }
+if(selector.indexOf("#")>0){ //id selector like "tag#id"
+ s=selector.split("#");
+ tag=s[0];
+ selid=s[1];
+ }
+if(selid!=""){
+ f=document.getElementById(selid);
+ if(f) objlist.push(f);
+ return(objlist);
+ }
+if(selector.indexOf(".")>0){ //class selector like "tag.class"
+ s=selector.split(".");
+ tag=s[0];
+ selclass=s[1];
+ }
+var v=document.getElementsByTagName(tag); // tag selector like "tag"
+if(selclass=="")
+ return(v);
+for(i=0;i<v.length;i++){
+ if(v[i].className.indexOf(selclass)>=0){
+ objlist.push(v[i]);
+ }
+ }
+return(objlist);
+}
+
+function Mix(c1,c2){
+var i,step1,step2,x,y,r=new Array(3);
+if(c1.length==4)step1=1;
+else step1=2;
+if(c2.length==4) step2=1;
+else step2=2;
+for(i=0;i<3;i++){
+ x=parseInt(c1.substr(1+step1*i,step1),16);
+ if(step1==1) x=16*x+x;
+ y=parseInt(c2.substr(1+step2*i,step2),16);
+ if(step2==1) y=16*y+y;
+ r[i]=Math.floor((x*50+y*50)/100);
+ }
+return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16));
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/javascript/transmenu-body.php b/src/usr/local/www/themes/the_wall/javascript/transmenu-body.php
new file mode 100644
index 0000000..eea9235
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/transmenu-body.php
@@ -0,0 +1,51 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ transmenu-body.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetBodyJS() {
+ global $rootmenu;
+
+ if (isset($rootmenu)) {
+ return $rootmenu->getMenuJScript();
+ } else if (empty($rootmenu)) {
+ return "alert('No rootmenu object found.');";
+ } else {
+ return "alert('No JavaScript attached to rootmenu object.');";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/the_wall/javascript/transmenu-head.php b/src/usr/local/www/themes/the_wall/javascript/transmenu-head.php
new file mode 100644
index 0000000..66e1952
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/transmenu-head.php
@@ -0,0 +1,85 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ transmenu-head.php
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function nervecenterTransmenuGetHeadJS() {
+ global $g, $rootmenu;
+
+ $transmenu_stub =<<<EOD
+ function tmenuinit() {
+ //==========================================================================================
+ // if supported, initialize TransMenus
+ //==========================================================================================
+ // Check isSupported() so that menus aren't accidentally sent to non-supporting browsers.
+ // This is better than server-side checking because it will also catch browsers which would
+ // normally support the menus but have javascript disabled.
+ //
+ // If supported, call initialize() and then hook whatever image rollover code you need to do
+ // to the .onactivate and .ondeactivate events for each menu.
+ //==========================================================================================
+ if (TransMenu.isSupported()) {
+ TransMenu.initialize();
+
+ // hook all the highlight swapping of the main toolbar to menu activation/deactivation
+ // instead of simple rollover to get the effect where the button stays hightlit until
+ // the menu is closed.
+ @@CHILD_JSCRIPT@@
+ }
+ } // end function
+EOD;
+
+ if (empty($rootmenu)) {
+ require_once("menudef.inc");
+ }
+
+ $childJScript = "";
+ foreach ($rootmenu->getChildren() as $component) {
+ $id = "mnua_" . str_replace(" ", "", strtolower($component->getID()));
+
+ $childJScript .=<<<EOD
+ {$id}.onactivate = function() { document.getElementById("{$id}").className = "hover"; };
+ {$id}.ondeactivate = function() { document.getElementById("{$id}").className = ""; };
+
+EOD;
+ }
+
+ $transmenu_stub = basename($_SERVER['PHP_SELF']) != "wizard.php" ? str_replace("@@CHILD_JSCRIPT@@", $childJScript, $transmenu_stub) : "";
+
+ return $transmenu_stub;
+}
+
+?>
diff --git a/src/usr/local/www/themes/the_wall/javascript/transmenu.org b/src/usr/local/www/themes/the_wall/javascript/transmenu.org
new file mode 100644
index 0000000..6c9e353
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/transmenu.org
@@ -0,0 +1,785 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ *
+ * Customizable multi-level animated DHTML menus with transparency.
+ *
+ * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * =================================================================================================
+ * updates:
+ * 04.19.04 fixed cascade problem with menus nested greater than two levels.
+ * 12.23.03 added hideCurrent for menu actuators with no menus. renamed to TransMenu.
+ * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
+ * also made gecko check a little more strict by specifying build no.
+ * ============================================================================================== */
+
+
+
+//==================================================================================================
+// Configuration properties
+//==================================================================================================
+TransMenu.spacerGif = "themes/nervecenter/javascript/img/x.gif"; // path to a transparent spacer gif
+TransMenu.dingbatOn = "themes/nervecenter/javascript/img/submenu-on.gif"; // path to the active sub menu dingbat
+TransMenu.dingbatOff = "themes/nervecenter/javascript/img/submenu-off.gif"; // path to the inactive sub menu dingbat
+TransMenu.dingbatSize = 14; // size of the dingbat (square shape assumed)
+TransMenu.menuPadding = 5; // padding between menu border and items grid
+TransMenu.itemPadding = 3; // additional padding around each item
+TransMenu.shadowSize = 2; // size of shadow under menu
+TransMenu.shadowOffset = 3; // distance shadow should be offset from leading edge
+TransMenu.shadowColor = "#FF0000"; // color of shadow (transparency is set in CSS)
+TransMenu.shadowPng = "themes/nervecenter/javascript/img/grey-40.png"; // a PNG graphic to serve as the shadow for mac IE5
+TransMenu.backgroundColor = "#990000"; // color of the background (transparency set in CSS)
+TransMenu.backgroundPng = "themes/nervecenter/javascript/img/white-90.png"; // a PNG graphic to server as the background for mac IE5
+TransMenu.hideDelay = 1000; // number of milliseconds to wait before hiding a menu
+TransMenu.slideTime = 400; // number of milliseconds it takes to open and close a menu
+
+
+//==================================================================================================
+// Internal use properties
+//==================================================================================================
+TransMenu.reference = {topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};
+TransMenu.direction = {down:1,right:2};
+TransMenu.registry = [];
+TransMenu._maxZ = 100;
+
+
+
+//==================================================================================================
+// Static methods
+//==================================================================================================
+// supporting win ie5+, mac ie5.1+ and gecko >= mozilla 1.0
+TransMenu.isSupported = function() {
+ var ua = navigator.userAgent.toLowerCase();
+ var pf = navigator.platform.toLowerCase();
+ var an = navigator.appName;
+ var r = false;
+
+ if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; // gecko >= moz 1.0
+ else if (an == "Microsoft Internet Explorer") {
+ if (document.getElementById) { // ie5.1+ mac,win
+ if (pf.indexOf("mac") == 0) {
+ r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;
+ }
+ else r = true;
+ }
+ }
+
+ return r;
+}
+
+// call this in onload once menus have been created
+TransMenu.initialize = function() {
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ menu.initialize();
+ }
+}
+
+// call this in document body to write out menu html
+TransMenu.renderAll = function() {
+ var aMenuHtml = [];
+ for (var i = 0, menu = null; menu = this.registry[i]; i++) {
+ aMenuHtml[i] = menu.toString();
+ }
+ document.write(aMenuHtml.join(""));
+}
+
+//==================================================================================================
+// TransMenu constructor (only called internally)
+//==================================================================================================
+// oActuator : The thing that causes the menu to be shown when it is mousedover. Either a
+// reference to an HTML element, or a TransMenuItem from an existing menu.
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menu from actuator
+// iTop : Top pixel offset of menu from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+// parentMenuSet : Menuset this menu will be added to.
+//==================================================================================================
+function TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) {
+ // public methods
+ this.addItem = addItem;
+ this.addMenu = addMenu;
+ this.toString = toString;
+ this.initialize = initialize;
+ this.isOpen = false;
+ this.show = show;
+ this.hide = hide;
+ this.items = [];
+
+ // events
+ this.onactivate = new Function(); // when the menu starts to slide open
+ this.ondeactivate = new Function(); // when the menu finishes sliding closed
+ this.onmouseover = new Function(); // when the menu has been moused over
+ this.onqueue = new Function(); // hack .. when the menu sets a timer to be closed a little while in the future
+ this.ondequeue = new Function();
+
+ // initialization
+ this.index = TransMenu.registry.length;
+ TransMenu.registry[this.index] = this;
+
+ var id = "TransMenu" + this.index;
+ var contentHeight = null;
+ var contentWidth = null;
+ var childMenuSet = null;
+ var animating = false;
+ var childMenus = [];
+ var slideAccel = -1;
+ var elmCache = null;
+ var ready = false;
+ var _this = this;
+ var a = null;
+
+ var pos = iDirection == TransMenu.direction.down ? "top" : "left";
+ var dim = null;
+
+ // private and public method implimentations
+ function addItem(sText, sUrl) {
+ var item = new TransMenuItem(sText, sUrl, this);
+ item._index = this.items.length;
+ this.items[item._index] = item;
+ }
+
+ function addMenu(oMenuItem) {
+ if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here");
+
+ if (childMenuSet == null) childMenuSet = new TransMenuSet(TransMenu.direction.right, -5, 2, TransMenu.reference.topRight);
+
+ var m = childMenuSet.addMenu(oMenuItem);
+
+ childMenus[oMenuItem._index] = m;
+ m.onmouseover = child_mouseover;
+ m.ondeactivate = child_deactivate;
+ m.onqueue = child_queue;
+ m.ondequeue = child_dequeue;
+
+ return m;
+ }
+
+ function initialize() {
+ initCache();
+ initEvents();
+ initSize();
+ ready = true;
+ }
+
+ function show() {
+ //dbg_dump("show");
+ if (ready) {
+ _this.isOpen = true;
+ animating = true;
+ setContainerPos();
+ elmCache["clip"].style.visibility = "visible";
+ elmCache["clip"].style.zIndex = TransMenu._maxZ++;
+ //dbg_dump("maxZ: " + TransMenu._maxZ);
+ slideStart();
+ _this.onactivate();
+ }
+ }
+
+ function hide() {
+ if (ready) {
+ _this.isOpen = false;
+ animating = true;
+
+ for (var i = 0, item = null; item = elmCache.item[i]; i++)
+ dehighlight(item);
+
+ if (childMenuSet) childMenuSet.hide();
+
+ slideStart();
+ _this.ondeactivate();
+ }
+ }
+
+ function setContainerPos() {
+ var sub = oActuator.constructor == TransMenuItem;
+ var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator;
+ var el = act;
+
+ var x = 0;
+ var y = 0;
+
+
+ var minX = 0;
+ var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width);
+ var minY = 0;
+ var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height);
+
+ // add up all offsets... subtract any scroll offset
+ while (sub ? el.parentNode.className.indexOf("transMenu") == -1 : el.offsetParent) {
+ x += el.offsetLeft;
+ y += el.offsetTop;
+
+ if (el.scrollLeft) x -= el.scrollLeft;
+ if (el.scrollTop) y -= el.scrollTop;
+
+ el = el.offsetParent;
+ }
+
+ if (oActuator.constructor == TransMenuItem) {
+ x += parseInt(el.parentNode.style.left);
+ y += parseInt(el.parentNode.style.top);
+ }
+
+ switch (iReferencePoint) {
+ case TransMenu.reference.topLeft:
+ break;
+ case TransMenu.reference.topRight:
+ x += act.offsetWidth;
+ break;
+ case TransMenu.reference.bottomLeft:
+ y += act.offsetHeight;
+ break;
+ case TransMenu.reference.bottomRight:
+ x += act.offsetWidth;
+ y += act.offsetHeight;
+ break;
+ }
+
+ x += iLeft;
+ y += iTop;
+
+ x = Math.max(Math.min(x, maxX), minX);
+ y = Math.max(Math.min(y, maxY), minY);
+
+ elmCache["clip"].style.left = x + "px";
+ elmCache["clip"].style.top = y + "px";
+ }
+
+ function slideStart() {
+ var x0 = parseInt(elmCache["content"].style[pos]);
+ var x1 = _this.isOpen ? 0 : -dim;
+
+ if (a != null) a.stop();
+ a = new Accelimation(x0, x1, TransMenu.slideTime, slideAccel);
+
+ a.onframe = slideFrame;
+ a.onend = slideEnd;
+
+ a.start();
+ }
+
+ function slideFrame(x) {
+ elmCache["content"].style[pos] = x + "px";
+ }
+
+ function slideEnd() {
+ if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden";
+ animating = false;
+ }
+
+ function initSize() {
+ // everything is based off the size of the items table...
+ var ow = elmCache["items"].offsetWidth;
+ var oh = elmCache["items"].offsetHeight;
+ var ua = navigator.userAgent.toLowerCase();
+
+ // clipping container should be ow/oh + the size of the shadow
+ elmCache["clip"].style.width = ow + TransMenu.shadowSize + 2 + "px";
+ elmCache["clip"].style.height = oh + TransMenu.shadowSize + 2 + "px";
+
+ // same with content...
+ elmCache["content"].style.width = ow + TransMenu.shadowSize + "px";
+ elmCache["content"].style.height = oh + TransMenu.shadowSize + "px";
+
+ contentHeight = oh + TransMenu.shadowSize;
+ contentWidth = ow + TransMenu.shadowSize;
+
+ dim = iDirection == TransMenu.direction.down ? contentHeight : contentWidth;
+
+ // set initially closed
+ elmCache["content"].style[pos] = -dim - TransMenu.shadowSize + "px";
+ elmCache["clip"].style.visibility = "hidden";
+
+ // if *not* mac/ie 5
+ if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) {
+ // set background div to offset size
+ elmCache["background"].style.width = ow + "px";
+ elmCache["background"].style.height = oh + "px";
+ elmCache["background"].style.backgroundColor = TransMenu.backgroundColor;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].style.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize) + "px";
+ elmCache["shadowRight"].style.backgroundColor = TransMenu.shadowColor;
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].style.width = ow - TransMenu.shadowOffset + "px";
+ elmCache["shadowBottom"].style.backgroundColor = TransMenu.shadowColor;
+ }
+ // mac ie is a little different because we use a PNG for the transparency
+ else {
+ // set background div to offset size
+ elmCache["background"].firstChild.src = TransMenu.backgroundPng;
+ elmCache["background"].firstChild.width = ow;
+ elmCache["background"].firstChild.height = oh;
+
+ // shadow left starts at offset left and is offsetHeight pixels high
+ elmCache["shadowRight"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowRight"].style.left = ow + "px";
+ elmCache["shadowRight"].firstChild.width = TransMenu.shadowSize;
+ elmCache["shadowRight"].firstChild.height = oh - (TransMenu.shadowOffset - TransMenu.shadowSize);
+
+ // shadow bottom starts at offset height and is offsetWidth - shadowOffset
+ // pixels wide (we don't want the bottom and right shadows to overlap or we
+ // get an extra bright bottom-right corner)
+ elmCache["shadowBottom"].firstChild.src = TransMenu.shadowPng;
+ elmCache["shadowBottom"].style.top = oh + "px";
+ elmCache["shadowBottom"].firstChild.height = TransMenu.shadowSize;
+ elmCache["shadowBottom"].firstChild.width = ow - TransMenu.shadowOffset;
+ }
+ }
+
+ function initCache() {
+ var menu = document.getElementById(id);
+ var all = menu.all ? menu.all : menu.getElementsByTagName("*"); // IE/win doesn't support * syntax, but does have the document.all thing
+
+ elmCache = {};
+ elmCache["clip"] = menu;
+ elmCache["item"] = [];
+
+ for (var i = 0, elm = null; elm = all[i]; i++) {
+ switch (elm.className) {
+ case "items":
+ case "content":
+ case "background":
+ case "shadowRight":
+ case "shadowBottom":
+ elmCache[elm.className] = elm;
+ break;
+ case "item":
+ elm._index = elmCache["item"].length;
+ elmCache["item"][elm._index] = elm;
+ break;
+ }
+ }
+
+ // hack!
+ _this.elmCache = elmCache;
+ }
+
+ function initEvents() {
+ // hook item mouseover
+ for (var i = 0, item = null; item = elmCache.item[i]; i++) {
+ item.onmouseover = item_mouseover;
+ item.onmouseout = item_mouseout;
+ item.onclick = item_click;
+ }
+
+ // hook actuation
+ if (typeof oActuator.tagName != "undefined") {
+ oActuator.onmouseover = actuator_mouseover;
+ oActuator.onmouseout = actuator_mouseout;
+ }
+
+ // hook menu mouseover
+ elmCache["content"].onmouseover = content_mouseover;
+ elmCache["content"].onmouseout = content_mouseout;
+ }
+
+ function highlight(oRow) {
+ oRow.className = "item hover";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOn;
+ }
+
+ function dehighlight(oRow) {
+ oRow.className = "item";
+ if (childMenus[oRow._index])
+ oRow.lastChild.firstChild.src = TransMenu.dingbatOff;
+ }
+
+ function item_mouseover() {
+ if (!animating) {
+ highlight(this);
+
+ if (childMenus[this._index])
+ childMenuSet.showMenu(childMenus[this._index]);
+ else if (childMenuSet) childMenuSet.hide();
+ }
+ }
+
+ function item_mouseout() {
+ if (!animating) {
+ if (childMenus[this._index])
+ childMenuSet.hideMenu(childMenus[this._index]);
+ else // otherwise child_deactivate will do this
+ dehighlight(this);
+ }
+ }
+
+ function item_click() {
+ if (!animating) {
+ if (_this.items[this._index].url)
+ location.href = _this.items[this._index].url;
+ }
+ }
+
+ function actuator_mouseover() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function actuator_mouseout() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function content_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ _this.onmouseover();
+ }
+ }
+
+ function content_mouseout() {
+ if (!animating) {
+ parentMenuSet.hideMenu(_this);
+ }
+ }
+
+ function child_mouseover() {
+ if (!animating) {
+ parentMenuSet.showMenu(_this);
+ }
+ }
+
+ function child_deactivate() {
+ for (var i = 0; i < childMenus.length; i++) {
+ if (childMenus[i] == this) {
+ dehighlight(elmCache["item"][i]);
+ break;
+ }
+ }
+ }
+
+ function child_queue() {
+ parentMenuSet.hideMenu(_this);
+ }
+
+ function child_dequeue() {
+ parentMenuSet.showMenu(_this);
+ }
+
+ function toString() {
+ var aHtml = [];
+ var sClassName = "transMenu" + (oActuator.constructor != TransMenuItem ? " top" : "");
+
+ for (var i = 0, item = null; item = this.items[i]; i++) {
+ aHtml[i] = item.toString(childMenus[i]);
+ }
+
+ return '<div id="' + id + '" class="' + sClassName + '">' +
+ '<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">' +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr>' +
+ aHtml.join('') +
+ '<tr><td colspan="2"><img src="' + TransMenu.spacerGif + '" width="1" height="' + TransMenu.menuPadding + '"></td></tr></table>' +
+ '<div class="shadowBottom"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="shadowRight"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '<div class="background"><img src="' + TransMenu.spacerGif + '" width="1" height="1"></div>' +
+ '</div></div>';
+ }
+}
+
+
+//==================================================================================================
+// TransMenuSet
+//==================================================================================================
+// iDirection : The direction to slide out. One of TransMenu.direction.
+// iLeft : Left pixel offset of menus from actuator
+// iTop : Top pixel offset of menus from actuator
+// iReferencePoint : Corner of actuator to measure from. One of TransMenu.referencePoint.
+//==================================================================================================
+TransMenuSet.registry = [];
+
+function TransMenuSet(iDirection, iLeft, iTop, iReferencePoint) {
+ // public methods
+ this.addMenu = addMenu;
+ this.showMenu = showMenu;
+ this.hideMenu = hideMenu;
+ this.hide = hide;
+ this.hideCurrent = hideCurrent;
+
+ // initialization
+ var menus = [];
+ var _this = this;
+ var current = null;
+
+ this.index = TransMenuSet.registry.length;
+ TransMenuSet.registry[this.index] = this;
+
+ // method implimentations...
+ function addMenu(oActuator) {
+ var m = new TransMenu(oActuator, iDirection, iLeft, iTop, iReferencePoint, this);
+ menus[menus.length] = m;
+ return m;
+ }
+
+ function showMenu(oMenu) {
+ if (oMenu != current) {
+ // close currently open menu
+ if (current != null) hide(current);
+
+ // set current menu to this one
+ current = oMenu;
+
+ // if this menu is closed, open it
+ oMenu.show();
+ }
+ else {
+ // hide pending calls to close this menu
+ cancelHide(oMenu);
+ }
+ }
+
+ function hideMenu(oMenu) {
+ //dbg_dump("hideMenu a " + oMenu.index);
+ if (current == oMenu && oMenu.isOpen) {
+ //dbg_dump("hideMenu b " + oMenu.index);
+ if (!oMenu.hideTimer) scheduleHide(oMenu);
+ }
+ }
+
+ function scheduleHide(oMenu) {
+ //dbg_dump("scheduleHide " + oMenu.index);
+ oMenu.onqueue();
+ oMenu.hideTimer = window.setTimeout("TransMenuSet.registry[" + _this.index + "].hide(TransMenu.registry[" + oMenu.index + "])", TransMenu.hideDelay);
+ }
+
+ function cancelHide(oMenu) {
+ //dbg_dump("cancelHide " + oMenu.index);
+ if (oMenu.hideTimer) {
+ oMenu.ondequeue();
+ window.clearTimeout(oMenu.hideTimer);
+ oMenu.hideTimer = null;
+ }
+ }
+
+ function hide(oMenu) {
+ if (!oMenu && current) oMenu = current;
+
+ if (oMenu && current == oMenu && oMenu.isOpen) {
+ hideCurrent();
+ }
+ }
+
+ function hideCurrent() {
+ if (null != current) {
+ cancelHide(current);
+ current.hideTimer = null;
+ current.hide();
+ current = null;
+ }
+ }
+}
+
+//==================================================================================================
+// TransMenuItem (internal)
+// represents an item in a dropdown
+//==================================================================================================
+// sText : The item display text
+// sUrl : URL to load when the item is clicked
+// oParent : Menu this item is a part of
+//==================================================================================================
+function TransMenuItem(sText, sUrl, oParent) {
+ this.toString = toString;
+ this.text = sText;
+ this.url = sUrl;
+ this.parentMenu = oParent;
+
+ function toString(bDingbat) {
+ var sDingbat = bDingbat ? TransMenu.dingbatOff : TransMenu.spacerGif;
+ var iEdgePadding = TransMenu.itemPadding + TransMenu.menuPadding;
+ var sPaddingLeft = "padding:" + TransMenu.itemPadding + "px; padding-left:" + iEdgePadding + "px;"
+ var sPaddingRight = "padding:" + TransMenu.itemPadding + "px; padding-right:" + iEdgePadding + "px;"
+
+ return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' +
+ sText + '</td><td width="14" style="' + sPaddingRight + '">' +
+ '<img src="' + sDingbat + '" width="14" height="14"></td></tr>';
+ }
+}
+
+
+
+
+
+
+//=====================================================================
+// Accel[erated] [an]imation object
+// change a property of an object over time in an accelerated fashion
+//=====================================================================
+// obj : reference to the object whose property you'd like to animate
+// prop : property you would like to change eg: "left"
+// to : final value of prop
+// time : time the animation should take to run
+// zip : optional. specify the zippiness of the acceleration. pick a
+// number between -1 and 1 where -1 is full decelerated, 1 is
+// full accelerated, and 0 is linear (no acceleration). default
+// is 0.
+// unit : optional. specify the units for use with prop. default is
+// "px".
+//=====================================================================
+// bezier functions lifted from the lib_animation.js file in the
+// 13th Parallel API. www.13thparallel.org
+//=====================================================================
+
+function Accelimation(from, to, time, zip) {
+ if (typeof zip == "undefined") zip = 0;
+ if (typeof unit == "undefined") unit = "px";
+
+ this.x0 = from;
+ this.x1 = to;
+ this.dt = time;
+ this.zip = -zip;
+ this.unit = unit;
+ this.timer = null;
+ this.onend = new Function();
+ this.onframe = new Function();
+}
+
+
+
+//=====================================================================
+// public methods
+//=====================================================================
+
+// after you create an accelimation, you call this to start it-a runnin'
+Accelimation.prototype.start = function() {
+ this.t0 = new Date().getTime();
+ this.t1 = this.t0 + this.dt;
+ var dx = this.x1 - this.x0;
+ this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
+ this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
+ Accelimation._add(this);
+}
+
+// and if you need to stop it early for some reason...
+Accelimation.prototype.stop = function() {
+ Accelimation._remove(this);
+}
+
+
+
+//=====================================================================
+// private methods
+//=====================================================================
+
+// paints one frame. gets called by Accelimation._paintAll.
+Accelimation.prototype._paint = function(time) {
+ if (time < this.t1) {
+ var elapsed = time - this.t0;
+ this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
+ }
+ else this._end();
+}
+
+// ends the animation
+Accelimation.prototype._end = function() {
+ Accelimation._remove(this);
+ this.onframe(this.x1);
+ this.onend();
+}
+
+
+
+
+//=====================================================================
+// static methods (all private)
+//=====================================================================
+
+// add a function to the list of ones to call periodically
+Accelimation._add = function(o) {
+ var index = this.instances.length;
+ this.instances[index] = o;
+ // if this is the first one, start the engine
+ if (this.instances.length == 1) {
+ this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
+ }
+}
+
+// remove a function from the list
+Accelimation._remove = function(o) {
+ for (var i = 0; i < this.instances.length; i++) {
+ if (o == this.instances[i]) {
+ this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
+ break;
+ }
+ }
+ // if that was the last one, stop the engine
+ if (this.instances.length == 0) {
+ window.clearInterval(this.timerID);
+ this.timerID = null;
+ }
+}
+
+// "engine" - call each function in the list every so often
+Accelimation._paintAll = function() {
+ var now = new Date().getTime();
+ for (var i = 0; i < this.instances.length; i++) {
+ this.instances[i]._paint(now);
+ }
+}
+
+
+// Bezier functions:
+Accelimation._B1 = function(t) { return t*t*t }
+Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
+Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
+Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }
+
+
+//Finds the coordinates of a point at a certain stage through a bezier curve
+Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
+ return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
+}
+
+
+//=====================================================================
+// static properties
+//=====================================================================
+
+Accelimation.instances = [];
+Accelimation.targetRes = 10;
+Accelimation.timerID = null;
+
+
+//=====================================================================
+// IE win memory cleanup
+//=====================================================================
+
+if (window.attachEvent) {
+ var cearElementProps = [
+ 'data',
+ 'onmouseover',
+ 'onmouseout',
+ 'onmousedown',
+ 'onmouseup',
+ 'ondblclick',
+ 'onclick',
+ 'onselectstart',
+ 'oncontextmenu'
+ ];
+
+ window.attachEvent("onunload", function() {
+ var el;
+ for(var d = document.all.length;d--;){
+ el = document.all[d];
+ for(var c = cearElementProps.length;c--;){
+ el[cearElementProps[c]] = null;
+ }
+ }
+ });
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/javascript/transmenuC.js b/src/usr/local/www/themes/the_wall/javascript/transmenuC.js
new file mode 100644
index 0000000..88626c7
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/javascript/transmenuC.js
@@ -0,0 +1,86 @@
+/* =================================================================================================
+ * TransMenu
+ * March, 2003
+ * Customizable multi-level animated DHTML menus with transparency.
+ * =================================================================================================
+ * "Can I use this?"
+ *
+ * Use of this library is governed by the Creative Commons Attribution 2.0 License. You can check it
+ * out at: http://creativecommons.org/licenses/by/2.0/
+ *
+ * Basically: You may copy, distribute, and eat this code as you wish. But you must give me credit
+ * for writing it. You may not misrepresent yourself as the author of this code.
+ * =================================================================================================
+ * "It's kinda hard to read, though"
+ *
+ * The uncompressed, commented version of this script can be found at:
+ * http://youngpup.net/projects/transMenus
+ * ============================================================================================== */
+TransMenu.spacerGif="themes/nervecenter/javascript/img/x.gif";TransMenu.dingbatOn="themes/nervecenter/javascript/img/submenu-on.gif";TransMenu.dingbatOff="themes/nervecenter/javascript/img/submenu-off.gif";TransMenu.dingbatSize=14;TransMenu.menuPadding=5;TransMenu.itemPadding=3;TransMenu.shadowSize=2;TransMenu.shadowOffset=3;TransMenu.shadowColor="#000000";TransMenu.shadowPng="themes/nervecenter/javascript/img/grey-40.png";TransMenu.backgroundColor="#990000";TransMenu.backgroundPng="themes/nervecenter/javascript/img/white-90.png";TransMenu.hideDelay=1000;TransMenu.slideTime=400;TransMenu.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4};TransMenu.direction={down:1,right:2};TransMenu.registry=[];TransMenu._maxZ=100;TransMenu.isSupported=function(){var ua=navigator.userAgent.toLowerCase();var pf=navigator.platform.toLowerCase();var an=navigator.appName;var r=false;if(ua.indexOf("gecko")>-1&&navigator.productSub>=20020605)r=true;else if(an=="Microsoft Internet Explorer"){if(document.getElementById){if(pf.indexOf("mac")==0){r=/msie (\d(.\d*)?)/.test(ua)&&Number(RegExp.$1)>=5.1;}
+else r=true;}}
+return r;}
+TransMenu.initialize=function(){for(var i=0,menu=null;menu=this.registry[i];i++){menu.initialize();}}
+TransMenu.renderAll=function(){var aMenuHtml=[];for(var i=0,menu=null;menu=this.registry[i];i++){aMenuHtml[i]=menu.toString();}
+document.write(aMenuHtml.join(""));}
+function TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,parentMenuSet){this.addItem=addItem;this.addMenu=addMenu;this.toString=toString;this.initialize=initialize;this.isOpen=false;this.show=show;this.hide=hide;this.items=[];this.onactivate=new Function();this.ondeactivate=new Function();this.onmouseover=new Function();this.onqueue=new Function();this.ondequeue=new Function();this.index=TransMenu.registry.length;TransMenu.registry[this.index]=this;var id="TransMenu"+this.index;var contentHeight=null;var contentWidth=null;var childMenuSet=null;var animating=false;var childMenus=[];var slideAccel=-1;var elmCache=null;var ready=false;var _this=this;var a=null;var pos=iDirection==TransMenu.direction.down?"top":"left";var dim=null;function addItem(sText,sUrl){var item=new TransMenuItem(sText,sUrl,this);item._index=this.items.length;this.items[item._index]=item;}
+function addMenu(oMenuItem){if(!oMenuItem.parentMenu==this)throw new Error("Cannot add a menu here");if(childMenuSet==null)childMenuSet=new TransMenuSet(TransMenu.direction.right,-5,2,TransMenu.reference.topRight);var m=childMenuSet.addMenu(oMenuItem);childMenus[oMenuItem._index]=m;m.onmouseover=child_mouseover;m.ondeactivate=child_deactivate;m.onqueue=child_queue;m.ondequeue=child_dequeue;return m;}
+function initialize(){initCache();initEvents();initSize();ready=true;}
+function show(){if(ready){_this.isOpen=true;animating=true;setContainerPos();elmCache["clip"].style.visibility="visible";elmCache["clip"].style.zIndex=TransMenu._maxZ++;slideStart();_this.onactivate();}}
+function hide(){if(ready){_this.isOpen=false;animating=true;for(var i=0,item=null;item=elmCache.item[i];i++)dehighlight(item);if(childMenuSet)childMenuSet.hide();slideStart();_this.ondeactivate();}}
+function setContainerPos(){var sub=oActuator.constructor==TransMenuItem;var act=sub?oActuator.parentMenu.elmCache["item"][oActuator._index]:oActuator;var el=act;var x=0;var y=0;var minX=0;var maxX=(window.innerWidth?window.innerWidth:document.body.clientWidth)-parseInt(elmCache["clip"].style.width);var minY=0;var maxY=(window.innerHeight?window.innerHeight:document.body.clientHeight)-parseInt(elmCache["clip"].style.height);while(sub?el.parentNode.className.indexOf("transMenu")==-1:el.offsetParent){x+=el.offsetLeft;y+=el.offsetTop;if(el.scrollLeft)x-=el.scrollLeft;if(el.scrollTop)y-=el.scrollTop;el=el.offsetParent;}
+if(oActuator.constructor==TransMenuItem){x+=parseInt(el.parentNode.style.left);y+=parseInt(el.parentNode.style.top);}
+switch(iReferencePoint){case TransMenu.reference.topLeft:break;case TransMenu.reference.topRight:x+=act.offsetWidth;break;case TransMenu.reference.bottomLeft:y+=act.offsetHeight;break;case TransMenu.reference.bottomRight:x+=act.offsetWidth;y+=act.offsetHeight;break;}
+x+=iLeft;y+=iTop;x=Math.max(Math.min(x,maxX),minX);y=Math.max(Math.min(y,maxY),minY);elmCache["clip"].style.left=x+"px";elmCache["clip"].style.top=y+"px";}
+function slideStart(){var x0=parseInt(elmCache["content"].style[pos]);var x1=_this.isOpen?0:-dim;if(a!=null)a.stop();a=new Accelimation(x0,x1,TransMenu.slideTime,slideAccel);a.onframe=slideFrame;a.onend=slideEnd;a.start();}
+function slideFrame(x){elmCache["content"].style[pos]=x+"px";}
+function slideEnd(){if(!_this.isOpen)elmCache["clip"].style.visibility="hidden";animating=false;}
+function initSize(){var ow=elmCache["items"].offsetWidth;var oh=elmCache["items"].offsetHeight;var ua=navigator.userAgent.toLowerCase();elmCache["clip"].style.width=ow+TransMenu.shadowSize+2+"px";elmCache["clip"].style.height=oh+TransMenu.shadowSize+2+"px";elmCache["content"].style.width=ow+TransMenu.shadowSize+"px";elmCache["content"].style.height=oh+TransMenu.shadowSize+"px";contentHeight=oh+TransMenu.shadowSize;contentWidth=ow+TransMenu.shadowSize;dim=iDirection==TransMenu.direction.down?contentHeight:contentWidth;elmCache["content"].style[pos]=-dim-TransMenu.shadowSize+"px";elmCache["clip"].style.visibility="hidden";if(ua.indexOf("mac")==-1||ua.indexOf("gecko")>-1){elmCache["background"].style.width=ow+"px";elmCache["background"].style.height=oh+"px";elmCache["background"].style.backgroundColor=TransMenu.backgroundColor;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].style.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize)+"px";elmCache["shadowRight"].style.backgroundColor=TransMenu.shadowColor;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].style.width=ow-TransMenu.shadowOffset+"px";elmCache["shadowBottom"].style.backgroundColor=TransMenu.shadowColor;}
+else{elmCache["background"].firstChild.src=TransMenu.backgroundPng;elmCache["background"].firstChild.width=ow;elmCache["background"].firstChild.height=oh;elmCache["shadowRight"].firstChild.src=TransMenu.shadowPng;elmCache["shadowRight"].style.left=ow+"px";elmCache["shadowRight"].firstChild.width=TransMenu.shadowSize;elmCache["shadowRight"].firstChild.height=oh-(TransMenu.shadowOffset-TransMenu.shadowSize);elmCache["shadowBottom"].firstChild.src=TransMenu.shadowPng;elmCache["shadowBottom"].style.top=oh+"px";elmCache["shadowBottom"].firstChild.height=TransMenu.shadowSize;elmCache["shadowBottom"].firstChild.width=ow-TransMenu.shadowOffset;}}
+function initCache(){var menu=document.getElementById(id);var all=menu.all?menu.all:menu.getElementsByTagName("*");elmCache={};elmCache["clip"]=menu;elmCache["item"]=[];for(var i=0,elm=null;elm=all[i];i++){switch(elm.className){case"items":case"content":case"background":case"shadowRight":case"shadowBottom":elmCache[elm.className]=elm;break;case"item":elm._index=elmCache["item"].length;elmCache["item"][elm._index]=elm;break;}}
+_this.elmCache=elmCache;}
+function initEvents(){for(var i=0,item=null;item=elmCache.item[i];i++){item.onmouseover=item_mouseover;item.onmouseout=item_mouseout;item.onclick=item_click;}
+if(typeof oActuator.tagName!="undefined"){oActuator.onmouseover=actuator_mouseover;oActuator.onmouseout=actuator_mouseout;}
+elmCache["content"].onmouseover=content_mouseover;elmCache["content"].onmouseout=content_mouseout;}
+function highlight(oRow){oRow.className="item hover";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOn;}
+function dehighlight(oRow){oRow.className="item";if(childMenus[oRow._index])oRow.lastChild.firstChild.src=TransMenu.dingbatOff;}
+function item_mouseover(){if(!animating){highlight(this);if(childMenus[this._index])childMenuSet.showMenu(childMenus[this._index]);else if(childMenuSet)childMenuSet.hide();}}
+function item_mouseout(){if(!animating){if(childMenus[this._index])childMenuSet.hideMenu(childMenus[this._index]);else dehighlight(this);}}
+function item_click(){if(!animating){if(_this.items[this._index].url)location.href=_this.items[this._index].url;}}
+function actuator_mouseover(){parentMenuSet.showMenu(_this);}
+function actuator_mouseout(){parentMenuSet.hideMenu(_this);}
+function content_mouseover(){if(!animating){parentMenuSet.showMenu(_this);_this.onmouseover();}}
+function content_mouseout(){if(!animating){parentMenuSet.hideMenu(_this);}}
+function child_mouseover(){if(!animating){parentMenuSet.showMenu(_this);}}
+function child_deactivate(){for(var i=0;i<childMenus.length;i++){if(childMenus[i]==this){dehighlight(elmCache["item"][i]);break;}}}
+function child_queue(){parentMenuSet.hideMenu(_this);}
+function child_dequeue(){parentMenuSet.showMenu(_this);}
+function toString(){var aHtml=[];var sClassName="transMenu"+(oActuator.constructor!=TransMenuItem?" top":"");for(var i=0,item=null;item=this.items[i];i++){aHtml[i]=item.toString(childMenus[i]);}
+return'<div id="'+id+'" class="'+sClassName+'">'+'<div class="content"><table class="items" cellpadding="0" cellspacing="0" border="0">'+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr>'+aHtml.join('')+'<tr><td colspan="2"><img src="'+TransMenu.spacerGif+'" width="1" height="'+TransMenu.menuPadding+'"></td></tr></table>'+'<div class="shadowBottom"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="shadowRight"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'<div class="background"><img src="'+TransMenu.spacerGif+'" width="1" height="1"></div>'+'</div></div>';}}
+TransMenuSet.registry=[];function TransMenuSet(iDirection,iLeft,iTop,iReferencePoint){this.addMenu=addMenu;this.showMenu=showMenu;this.hideMenu=hideMenu;this.hide=hide;this.hideCurrent=hideCurrent;var menus=[];var _this=this;var current=null;this.index=TransMenuSet.registry.length;TransMenuSet.registry[this.index]=this;function addMenu(oActuator){var m=new TransMenu(oActuator,iDirection,iLeft,iTop,iReferencePoint,this);menus[menus.length]=m;return m;}
+function showMenu(oMenu){if(oMenu!=current){if(current!=null)hide(current);current=oMenu;oMenu.show();}
+else{cancelHide(oMenu);}}
+function hideMenu(oMenu){if(current==oMenu&&oMenu.isOpen){if(!oMenu.hideTimer)scheduleHide(oMenu);}}
+function scheduleHide(oMenu){oMenu.onqueue();oMenu.hideTimer=window.setTimeout("TransMenuSet.registry["+_this.index+"].hide(TransMenu.registry["+oMenu.index+"])",TransMenu.hideDelay);}
+function cancelHide(oMenu){if(oMenu.hideTimer){oMenu.ondequeue();window.clearTimeout(oMenu.hideTimer);oMenu.hideTimer=null;}}
+function hide(oMenu){if(!oMenu&&current)oMenu=current;if(oMenu&&current==oMenu&&oMenu.isOpen){hideCurrent();}}
+function hideCurrent(){if (null != current){cancelHide(current);current.hideTimer=null;current.hide();current=null;}}}
+function TransMenuItem(sText,sUrl,oParent){this.toString=toString;this.text=sText;this.url=sUrl;this.parentMenu=oParent;function toString(bDingbat){var sDingbat=bDingbat?TransMenu.dingbatOff:TransMenu.spacerGif;var iEdgePadding=TransMenu.itemPadding+TransMenu.menuPadding;var sPaddingLeft="padding:"+TransMenu.itemPadding+"px; padding-left:"+iEdgePadding+"px;"
+var sPaddingRight="padding:"+TransMenu.itemPadding+"px; padding-right:"+iEdgePadding+"px;"
+return'<tr class="item"><td nowrap style="'+sPaddingLeft+'">'+sText+'</td><td width="14" style="'+sPaddingRight+'">'+'<img src="'+sDingbat+'" width="14" height="14"></td></tr>';}}
+function Accelimation(from,to,time,zip){if(typeof zip=="undefined")zip=0;if(typeof unit=="undefined")unit="px";this.x0=from;this.x1=to;this.dt=time;this.zip=-zip;this.unit=unit;this.timer=null;this.onend=new Function();this.onframe=new Function();}
+Accelimation.prototype.start=function(){this.t0=new Date().getTime();this.t1=this.t0+this.dt;var dx=this.x1-this.x0;this.c1=this.x0+((1+this.zip)*dx/3);this.c2=this.x0+((2+this.zip)*dx/3);Accelimation._add(this);}
+Accelimation.prototype.stop=function(){Accelimation._remove(this);}
+Accelimation.prototype._paint=function(time){if(time<this.t1){var elapsed=time-this.t0;this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));}
+else this._end();}
+Accelimation.prototype._end=function(){Accelimation._remove(this);this.onframe(this.x1);this.onend();}
+Accelimation._add=function(o){var index=this.instances.length;this.instances[index]=o;if(this.instances.length==1){this.timerID=window.setInterval("Accelimation._paintAll()",this.targetRes);}}
+Accelimation._remove=function(o){for(var i=0;i<this.instances.length;i++){if(o==this.instances[i]){this.instances=this.instances.slice(0,i).concat(this.instances.slice(i+1));break;}}
+if(this.instances.length==0){window.clearInterval(this.timerID);this.timerID=null;}}
+Accelimation._paintAll=function(){var now=new Date().getTime();for(var i=0;i<this.instances.length;i++){this.instances[i]._paint(now);}}
+Accelimation._B1=function(t){return t*t*t}
+Accelimation._B2=function(t){return 3*t*t*(1-t)}
+Accelimation._B3=function(t){return 3*t*(1-t)*(1-t)}
+Accelimation._B4=function(t){return(1-t)*(1-t)*(1-t)}
+Accelimation._getBezier=function(percent,startPos,endPos,control1,control2){return endPos*this._B1(percent)+control2*this._B2(percent)+control1*this._B3(percent)+startPos*this._B4(percent);}
+Accelimation.instances=[];Accelimation.targetRes=10;Accelimation.timerID=null;
+if(window.attachEvent){var cearElementProps=['data','onmouseover','onmouseout','onmousedown','onmouseup','ondblclick','onclick','onselectstart','oncontextmenu'];window.attachEvent("onunload", function() {var el;for(var d=document.all.length;d--;){el=document.all[d];for(var c=cearElementProps.length;c--;){el[cearElementProps[c]] = null;}}});} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/jsevents/body.def b/src/usr/local/www/themes/the_wall/jsevents/body.def
new file mode 100644
index 0000000..501d548
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/jsevents/body.def
@@ -0,0 +1,7 @@
+# Format: <event_name>=<jsfunction_name> !<forbidden_page_0>,<forbidden_page_1>...<forbidden_page_n>
+# where: forbidden pages are those pages that should *not* use
+# the particular JavaScript function within the JS event
+# specified below.
+# $Id$
+#
+onload=tmenuinit(); !wizard.php \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/loader.js b/src/usr/local/www/themes/the_wall/loader.js
new file mode 100644
index 0000000..20ecfbb
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/loader.js
@@ -0,0 +1,30 @@
+//<![CDATA[
+
+var browser = '';
+var version = '';
+var entrance = '';
+var cond = '';
+
+// BROWSER?
+if (browser == '') {
+ if (navigator.appName.indexOf('Microsoft') != -1)
+ browser = 'IE';
+ else if (navigator.appName.indexOf('Netscape') != -1)
+ browser = 'Netscape';
+ else
+ browser = 'IE';
+}
+if (version == '') {
+ version= navigator.appVersion;
+ paren = version.indexOf('(');
+ whole_version = navigator.appVersion.substring(0,paren-1);
+ version = parseInt(whole_version);
+}
+
+if (browser == 'IE' && version < 7) {
+ document.write('<script type="text/javascript" src="/themes/the_wall/javascript/ie7/ie7-standard-p.js"></script>');
+}
+
+document.write('<script type="text/javascript" src="/themes/the_wall/javascript/niftyjsCode.js"></script>');
+
+//]]>
diff --git a/src/usr/local/www/themes/the_wall/login.css b/src/usr/local/www/themes/the_wall/login.css
new file mode 100644
index 0000000..3c97a9a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/login.css
@@ -0,0 +1,1159 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.infoboxnptd2 {
+ width:100%;
+ color:white;
+ background-color:#990000;
+ padding-right: 10px;
+}
+
+.infoboxnptd {
+ width:8%;
+ background-color:#990000;
+}
+
+.infoboxnptable {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnptable2 {
+ height:32px;
+ width:100%;
+ background-color:#990000;
+}
+
+.infoboxnp {
+ background-color:#990000;
+ width:100%;
+}
+
+.infoboxnpimg {
+ vertical-align:middle;
+ width:28px;
+ height:32px;
+ background-color:#990000;
+}
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ background: url('images/background.jpg') repeat-x; background-attachment:fixed;
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 20px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+ text-align: center;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+/* background: #cccccc; */
+ background-color: transparent;
+ border: 0px solid #cccccc;
+ margin: 5em auto;
+ padding: 0em;
+ width: 400px;
+/* filter:alpha(opacity=60);
+ -moz-opacity:0.6;
+ -khtml-opacity: 0.6;
+ opacity: 0.6; */
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+/* background: #ffffff; */
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 400px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -420px;
+ left: 70px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ top: -300px; */
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px;
+ position: relative;
+ left: 10px;
+ top: -300px; */
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ text-align: center;
+ padding: 3px;
+ margin: 0em;
+/* text-indent: 10px; */
+ position: relative;
+ top: -20px;
+ left: 170px;
+}
+
+/* loginerror box follows */
+
+#login #inputerrors {
+ background-color: transparent;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ vertical-align: middle;
+ padding: 0em;
+ width: 330px;
+ height: 50px;
+ position: relative;
+ top: -370px;
+}
+/*
+#login #errortext {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 330px;
+ position: relative;
+ top: -350px;
+}
+
+#login #errordesc {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 330px;
+ position: relative;
+ top: -350px;
+}
+#login #errordesc h1 {
+ background: url(/images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+// position: relative;
+// top: -300px;
+}
+*/ \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/menu.inc b/src/usr/local/www/themes/the_wall/menu.inc
new file mode 100644
index 0000000..a274410
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/menu.inc
@@ -0,0 +1,177 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ menu.inc
+ Copyright (C) 2006 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Originally part of m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+require("menu.inc");
+
+define("TMENU_STUB", "
+ // set up drop downs anywhere in the body of the page. I think the bottom of the page is better..
+ // but you can experiment with effect on loadtime.
+ if (TransMenu.isSupported()) {
+
+ //==================================================================================================
+ // create a set of dropdowns
+ //==================================================================================================
+ // the first param should always be down, as it is here
+ //
+ // The second and third param are the top and left offset positions of the menus from their actuators
+ // respectively. To make a menu appear a little to the left and bottom of an actuator, you could use
+ // something like -5, 5
+ //
+ // The last parameter can be .topLeft, .bottomLeft, .topRight, or .bottomRight to inidicate the corner
+ // of the actuator from which to measure the offset positions above. Here we are saying we want the
+ // menu to appear directly below the bottom left corner of the actuator
+ //==================================================================================================
+ var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);
+
+ //==================================================================================================
+ // create a dropdown menu
+ //==================================================================================================
+ // the first parameter should be the HTML element which will act actuator for the menu
+ //==================================================================================================
+
+ @@MENU_DEFINITIONS@@
+
+ //==================================================================================================
+ // write drop downs into page
+ //==================================================================================================
+ // this method writes all the HTML for the menus into the page with document.write(). It must be
+ // called within the body of the HTML page.
+ //==================================================================================================
+ TransMenu.renderAll();
+ }
+");
+
+class NervecenterMenu extends Menu {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+ private $menuID = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $c);
+
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+ $this->menuID = $id;
+
+ if ($this->hasParent()) {
+ $this->menuJScript = "\tvar {$id} = ms.addMenu(document.getElementById('{$id}'));\n";
+ }
+ } // end __construct
+
+ public function getMenuID() {
+ return $this->menuID;
+ }
+
+ public function setMenuID($myMenuID) {
+ $this->menuID = $myMenuID;
+ }
+
+ public function getMenuJScript() {
+ $childJScript = "";
+ foreach ($this->getChildren() as $component) {
+ $childJScript .= $component->getMenuJScript();
+ }
+
+ if (! $this->hasParent()) {
+ $this->menuJScript = str_replace("@@MENU_DEFINITIONS@@", $childJScript, TMENU_STUB);
+ } else {
+ $this->menuJScript .= "\n$childJScript\n";
+ }
+
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ if (! $this->hasParent()) {
+ $menuMarkup =<<<EOD
+ <div id="menu">
+ @@CHILD_ELEMENTS@@
+ </div>
+
+EOD;
+ } else {
+ $name = gettext($this->getID());
+ $id = "mnua_" . str_replace(" ", "", strtolower($this->getID()));
+
+ $menuMarkup =<<<EOD
+ <a id="{$id}" href="#">{$name}</a>
+ @@CHILD_ELEMENTS@@
+EOD;
+ }
+
+ $childMarkup = "";
+ foreach ($this->getChildren() as $component) {
+ $childMarkup .= $component;
+ }
+
+ $menuMarkup = str_replace("@@CHILD_ELEMENTS@@", $childMarkup, $menuMarkup);
+
+ return $menuMarkup;
+ }
+}
+
+class NervecenterMenuItem extends MenuItem {
+ private $menuJScript = "NOT-SET";
+ private $menuJScriptEvents = "NOT-SET";
+
+ public function __construct($identification = "", $filename = "", $href = "", Component $c = NULL) {
+ parent::__construct($identification, $filename, $href, $c);
+
+ $href = $this->getHref() <> "" ? $this->getHref() : "{$this->getFile()}";
+ $name = gettext($this->getID());
+ $file = $this->getFile();
+
+ $this->menuJScript = $this->check_access("{$file}", "\t{$this->getParent()->getMenuID()}.addItem('{$name}', '{$href}');\n");
+ }
+
+ public function getMenuJScript() {
+ return $this->menuJScript;
+ }
+
+ public function getMenuJScriptEvents() {
+ return $this->menuJScriptEvents;
+ }
+
+ public function __toString() {
+ return "";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/themes/the_wall/new_tab_menu.css b/src/usr/local/www/themes/the_wall/new_tab_menu.css
new file mode 100644
index 0000000..04c4cf2
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/new_tab_menu.css
@@ -0,0 +1,101 @@
+/*
+ new_tab_menu.css
+ part of pfSense
+ Copyright (C) 2010-2011 Robert Zelaya
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+ Replace your old tab menu with the following code. To add a second tab menu line just cut and paste again.
+ The following code is dependent on new_tab_menu.css and images/new_tab_menu.png.
+
+ <tr>
+ <td>
+ <?php
+ $tab_array_indent = 0; // move to the line in px
+ $tab_array_space = 1; // space betwen lines in px
+ $tab_array_char_limit = 82; // number or chr before the drop down box
+ $tab_array = array();
+ $tab_array[] = array(gettext("Admin Access"), true, "system_advanced_admin.php");
+ $tab_array[] = array(gettext("Firewall / NAT"), false, "system_advanced_firewall.php");
+ $tab_array[] = array(gettext("Networking"), false, "system_advanced_network.php");
+ $tab_array[] = array(gettext("Miscellaneous"), false, "system_advanced_misc.php");
+ $tab_array[] = array(gettext("System Tunables"), false, "system_advanced_sysctl.php");
+ $tab_array[] = array(gettext("Notifications"), false, "system_advanced_notifications.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+
+*/
+
+.newtabmenu ul, li{border:0; margin:0; padding:0; list-style:none;}
+
+.newtabmenu li{float:left; margin-right:2px; text-align: center;}
+.newtabmenu a:link, .newtabmenu a:visited{
+ background:url(images/new_tab_menu.png) right 45px;
+ color:#ffffff; /* noactive font */
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ font-weight:bold;
+ font-size:.9em;
+ height:20px;
+ line-height:20px;
+ text-decoration:none;
+}
+.newtabmenu a span{
+ background:url(images/new_tab_menu.png) left 45px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ height:20px;
+ margin-right:7px;
+ padding-left:7px;
+}
+.newtabmenu a:hover{
+ background:url(images/new_tab_menu.png) right 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+ color:#ffffff; /* hover over font */
+}
+.newtabmenu a:hover span{
+ background:url(images/new_tab_menu.png) left 23px;
+ display:block;
+ /* fix for IE6 */
+ display: inline-block;
+ /* END */
+}
+
+/* -------------------------------- */
+/* ACTIVE ELEMENTS */
+.newtabmenu_active a:link, .newtabmenu_active a:visited, .newtabmenu_active a:visited, .newtabmenu_active a:hover{
+ color:#000000; /* active font */
+ background:url(images/new_tab_menu.png) right 0 no-repeat;
+}
+.newtabmenu_active a span, .newtabmenu_active a:hover span{
+ background:url(images/new_tab_menu.png) left 0 no-repeat;
+} \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/no_big_logo b/src/usr/local/www/themes/the_wall/no_big_logo
new file mode 100644
index 0000000..6e5c70d
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/no_big_logo
@@ -0,0 +1 @@
+NO! DONT! \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/rrdcolors.inc.php b/src/usr/local/www/themes/the_wall/rrdcolors.inc.php
new file mode 100644
index 0000000..dcb7a39
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/rrdcolors.inc.php
@@ -0,0 +1,89 @@
+<?php
+/* $Id$ */
+/*
+ rrdcolors.inc.php
+ Part of pfSense
+ Copyright (C) 2006 Seth Mos <seth.mos@xs4all.nl>
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* This file is included by the RRD graphing page and sets the colors */
+
+/* Traffic Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colortrafficup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Traffic Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colortrafficdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* Packets Outbound Out-P-4, Out-B-4, Out-P-6, Out-B-6 */
+$colorpacketsup = array('666666', 'CCCCCC', '2217AA', '625AE7');
+
+/* Packets Inbound In-P-4, In-B-4, In-P-6, In-B-6 */
+$colorpacketsdown = array('990000', 'CC0000', 'FFC875', 'FF9900');
+
+/* 95th Percentile Lines Out, In */
+$colortraffic95 = array('660000', 'FF0000');
+
+/* State Table pfrate, pfstates, pfnat, srcip, dstip */
+$colorstates = array('00AA00','990000','0000FF','000000','DD9B00');
+
+/* Processor Usage user, nice, system, int, processes */
+$colorprocessor = array('00AA00','990000','0000FF','DD9B00','000000');
+
+/* Memory Usage active, inact, free, cache, wire */
+$colormemory = array('00AA00','990000','0000FF','666666','DD9B00');
+
+/* MBUF Usage current, cache, total, max */
+$colormbuf = array('0080FF','00E344','FF0000','000000');
+
+/* Traffic Shaper Queues q1, q2, q3, q4, q5, q6, q7, q8, q9 */
+$colorqueuesup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+$colorqueuesdropup = array('000000','7B0000','0080FF','00E344','FF0000','2217AA','FFC875','FF9900','CC0000');
+$colorqueuesdropdown = array('000000','7B7B7B','999999','BBBBBB','CCCCCC','D9D9D9','EEEEEE','FFFFFF','CCCCCC');
+
+/* Quality Graph Delay >420, 180-420, 60-180, 20-60, <20, Delay Avg */
+$colorqualityrtt = array('990000','a83c3c','b36666','bd9090','cccccc','000000');
+/* Quality Graph Loss */
+$colorqualityloss = 'ee0000';
+
+/* Wireless Graph SNR, Rate, Channel*/
+/* Cellular Graph RSSI, */
+$colorwireless = array('333333','a83c3c','999999');
+
+/* SPAMD Times min area, avg area, max area, Time line */
+$colorspamdtime = array('DDDDFF', 'AAAAFF', 'DDDDFF', '000066');
+/* SPAMD Connections max area, min area, min line, max line, avg line */
+$colorspamdconn = array('AA00BB', 'FFFFFF', '660088', 'FFFF88', '006600');
+
+/* OpenVPN Users Online Users */
+$colorvpnusers = array('990000');
+
+/* Captive Portal Total Users Total Users */
+/* Captive Portal Concurrent Concurrent Users */
+$colorcaptiveportalusers = array('990000');
+
+?>
diff --git a/src/usr/local/www/themes/the_wall/styles/jquery-ui-1.11.1.css b/src/usr/local/www/themes/the_wall/styles/jquery-ui-1.11.1.css
new file mode 100644
index 0000000..8a8c54f
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/styles/jquery-ui-1.11.1.css
@@ -0,0 +1,1226 @@
+/*! jQuery UI - v1.11.1 - 2014-09-22
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2C%20Helvetica%2C%20Arial%2C%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=glass&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=inset_soft&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=glass&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=inset_hard&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=flat&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0); /* support: IE8 */
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-draggable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-sortable-handle {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin: 2px 0 0 0;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+ font-size: 100%;
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 45%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 20px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ position: relative;
+ margin: 0;
+ padding: 3px 1em 3px .4em;
+ cursor: pointer;
+ min-height: 0; /* support: IE7 */
+ /* support: IE10, see #8844 */
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px 0;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-state-focus,
+.ui-menu .ui-state-active {
+ margin: -1px;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item {
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: .2em;
+ margin: auto 0;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ left: auto;
+ right: 0;
+}
+.ui-progressbar {
+ height: 1em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+ background-color: #990000;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
+ height: 100%;
+ filter: alpha(opacity=25); /* support: IE8 */
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-selectmenu-menu {
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: none;
+}
+.ui-selectmenu-menu .ui-menu {
+ overflow: auto;
+ /* Support: IE7 */
+ overflow-x: hidden;
+ padding-bottom: 1px;
+}
+.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
+ font-size: 1em;
+ font-weight: bold;
+ line-height: 1.5;
+ padding: 2px 0.4em;
+ margin: 0.5em 0 0 0;
+ height: auto;
+ border: 0;
+}
+.ui-selectmenu-open {
+ display: block;
+}
+.ui-selectmenu-button {
+ display: inline-block;
+ overflow: hidden;
+ position: relative;
+ text-decoration: none;
+ cursor: pointer;
+}
+.ui-selectmenu-button span.ui-icon {
+ right: 0.5em;
+ left: auto;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+}
+.ui-selectmenu-button span.ui-selectmenu-text {
+ text-align: left;
+ padding: 0.4em 2.1em 0.4em 1em;
+ display: block;
+ line-height: 1.4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* support: IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to override default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertically center icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
+ cursor: text;
+}
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS, Helvetica, Arial, sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #c9c9c9 url("../../../javascript/jquery/images/ui-bg_inset-soft_50_c9c9c9_1x100.png") 50% bottom repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #bbbbbb;
+ /* background: #dddddd url("../../../javascript/jquery/images/ui-bg_glass_35_dddddd_1x400.png") 50% 50% repeat-x; */
+ color: #444444;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #444444;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_glass_60_eeeeee_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #3383bb;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #3383bb;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #bbbbbb;
+ background: #f8f8f8 url("../../../javascript/jquery/images/ui-bg_glass_100_f8f8f8_1x400.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #599fcf;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited,
+.ui-state-focus a,
+.ui-state-focus a:hover,
+.ui-state-focus a:link,
+.ui-state-focus a:visited {
+ color: #599fcf;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #999999;
+ background: #999999 url("../../../javascript/jquery/images/ui-bg_inset-hard_75_999999_1x100.png") 50% 50% repeat-x;
+ font-weight: bold;
+ color: #ffffff;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #ffffff;
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_55_eeeeee_40x100.png") 50% 50% repeat-x;
+ color: #444444;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #444444;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #c0402a;
+ background: #c0402a url("../../../javascript/jquery/images/ui-bg_flat_55_c0402a_40x100.png") 50% 50% repeat-x;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70); /* support: IE8 */
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35); /* support: IE8 */
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-widget-header .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_999999_256x240.png");
+}
+.ui-state-default .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_70b2e1_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-active .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_454545_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_3383bb_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url("../../../javascript/jquery/images/ui-icons_fbc856_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #eeeeee url("../../../javascript/jquery/images/ui-bg_flat_0_eeeeee_40x100.png") 50% 50% repeat-x;
+ opacity: .8;
+ filter: Alpha(Opacity=80); /* support: IE8 */
+}
+.ui-widget-shadow {
+ margin: -4px 0 0 -4px;
+ padding: 4px;
+ background: #aaaaaa url("../../../javascript/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
+ opacity: .6;
+ filter: Alpha(Opacity=60); /* support: IE8 */
+ border-radius: 0pxdow;
+}
diff --git a/src/usr/local/www/themes/the_wall/styles/menustyles.css b/src/usr/local/www/themes/the_wall/styles/menustyles.css
new file mode 100644
index 0000000..06b3c7a
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/styles/menustyles.css
@@ -0,0 +1,44 @@
+#navigation {
+ /* border:1px solid black; */
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ padding-top: 4px;
+ }
+
+#menu {
+ /* background: #990000; */
+ /* border-bottom:1px solid white; */
+ padding: 0 0 0 0;
+ width: 98%;
+ vertical-align: middle;
+ height: 16px;
+ }
+#menu a {
+ padding: 2px 28px 4px 28px;
+ text-decoration: none;
+ font-weight: bold;
+ font-size: 1.0em;
+ color: #FFFFFF;
+ width: 08%;
+ height: 16px;
+ }
+#menu a.hover {
+ background: #AF2020;
+ }
+#menu span {
+ display: none;
+ }
+
+#subnav {
+ font-size: 10px;
+ margin-bottom: 2em;
+ }
+#subnav a {
+ color: #FF0000; /* #FB3B00; */
+ margin-right: 1em;
+ }
+#subnav span {
+ color: silver;
+ margin-right: 1em;
+ }
diff --git a/src/usr/local/www/themes/the_wall/styles/transmenu.css b/src/usr/local/www/themes/the_wall/styles/transmenu.css
new file mode 100644
index 0000000..f683574
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/styles/transmenu.css
@@ -0,0 +1,75 @@
+/* this is the clipping region for the menu. it's width and height get set by script, depending on the size of the items table */
+.transMenu {
+ position:absolute;
+ overflow:hidden;
+ left:-1000px;
+ top:-1000px;
+ }
+
+/* this is the main container for the menu itself. it's width and height get set by script, depending on the size of the items table */
+.transMenu .content {
+ position:absolute;
+ }
+
+/* this table comprises all menu items. each TR is one item. It is relatively positioned so that the shadow and background transparent divs can be positioned underneath it */
+.transMenu .items {
+ position:relative;
+ left:0px; top:0px;
+ z-index:2;
+ }
+
+.transMenu.top .items {
+ border-top:none;
+ }
+
+/* each TR.item is one menu item */
+.transMenu .item {
+ color: #FFFFFF; /* #336; */
+ font-size: 1.1em;
+ font-weight: normal;
+ font-family:sans-serif;
+ text-decoration:none;
+ /* this is a hack for mac/ie5, whom incorrectly cascades the border properties of the parent table to each row */
+ border:none;
+ cursor:pointer;
+ cursor:hand;
+ }
+
+/* this DIV is the semi-transparent white background of each menu. the -moz-opacity is a proprietary way to get transparency in mozilla, the filter is for IE/windows 5.0+. */
+/* we set the background color in script because ie mac does not use it; that browser only uses a semi-transparent white PNG that the spacer gif inside this DIV is replaced by */
+.transMenu .background {
+ position:absolute;
+ left:0px; top:0px;
+ z-index:1;
+ -moz-opacity:.8;
+ filter:alpha(opacity=80);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the right of the menu. It's left, height, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowRight {
+ position:absolute;
+ z-index:3;
+ top:3px; width:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* same concept as .background, but this is the sliver of shadow on the bottom of the menu. It's top, width, and background are set by script. In IE5/mac, it uses a PNG */
+.transMenu .shadowBottom {
+ position:absolute;
+ z-index:1;
+ left:3px; height:2px;
+ -moz-opacity:.4;
+ filter:alpha(opacity=40);
+ }
+
+/* this is the class that is used when the mouse is over an item. script sets the row to this class when required. */
+.transMenu .item.hover {
+ background:#fdfdfd;
+ color:black;
+ }
+
+/* this is either the dingbat that indicates there is a submenu, or a spacer gif in it's place. We give it extra margin to create some space between the text and the dingbat */
+.transMenu .item img {
+ margin-left:10px;
+ } \ No newline at end of file
diff --git a/src/usr/local/www/themes/the_wall/wizard.css b/src/usr/local/www/themes/the_wall/wizard.css
new file mode 100644
index 0000000..a2d31d5
--- /dev/null
+++ b/src/usr/local/www/themes/the_wall/wizard.css
@@ -0,0 +1,1060 @@
+/* Element CSS Definitions */
+html, body, td, th, input, select {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.9em;
+
+}
+
+.nowrap { white-space: nowrap; }
+
+/* please adjust the bgcolor to be used together with niftycorners! */
+.rtop, .artop {
+ background-color: #999999;
+}
+
+div.GraphLink {
+ position: relative;
+}
+
+span.GraphLinkLine {
+ position: absolute;
+ background-color: #990000;
+ width: 100%;
+}
+
+/* DOM Tooltip CSS definitions */
+div.niceTitle
+{
+ background-color: #333333;
+ color: #FFFFFF;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ width: 250px;
+ left: 0;
+ top: 0;
+ padding: 4px;
+ position: absolute;
+ text-align: left;
+ z-index: 20;
+ -moz-border-radius: 0 10px 10px 10px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=87);
+ -moz-opacity: .87;
+ -khtml-opacity: .87;
+ opacity: .87;
+}
+div.niceTitle h1
+{
+ background: #990000;
+ border-bottom: 1px dotted #FFFFFF;
+ font-weight: bold;
+ font-size: 13px;
+ font-family: "Trebuchet MS", sans-serif;
+ margin: 3px;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 3px;
+ text-align: left;
+ left: 0;
+ top: 0;
+ -moz-border-radius: 0 8px 0 0;
+ -moz-opacity: 1;
+}
+div.niceTitle .contents
+{
+ margin: 0;
+ padding: 0 3px;
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+ -moz-opacity: 1;
+ -khtml-opacity: 1;
+ opacity: 1;
+}
+div.niceTitle p
+{
+ background: #FFFFFF;
+ border: 1px solid #990000;
+ color: #000000;
+ font-size: 9px;
+ padding: 5px;
+ margin: 3px;
+ text-align: left;
+ -moz-opacity: 1;
+ -moz-border-radius: 0 0 8px 8px;
+}
+
+body {
+ margin: 0px auto;
+ /* background: url('images/background.png') no-repeat; */
+ background-position : center 0px;
+ background-color: #999999;
+}
+
+form {
+ margin: 0px;
+}
+a {
+ text-decoration: none;
+}
+form input {
+ font-size: 1.1em;
+}
+
+iframe {
+ z-index: 1;
+ border: 1px dashed #990000;
+}
+.iframe {
+ background-color: #FFFFFF;
+}
+
+/* ID Based CSS Definitions */
+#wrapper {
+ width: 810px;
+ margin: 0px auto;
+}
+
+#header {
+ background: url('images/header.png') no-repeat;
+ background-position: 0px;
+ height: 102px;
+ width: 810px;
+ margin-bottom: 5px;
+ z-index: 2;
+}
+#header-left {
+ position: relative;
+ /* background: url('images/logo.gif') no-repeat; */
+ background-position: center;
+ height: 65px;
+ width: 145px;
+ left: 10px;
+ float: left;
+}
+#header-left #status-link {
+ position: relative;
+ top: 10px;
+ left: 6px;
+}
+#header-right {
+ position: relative;
+ /* background: url('images/header.gif') no-repeat; */
+ height: 70px;
+ color: #fff;
+ left: 0px;
+ margin-left: 165px;
+}
+#header-right .alert {
+ position: relative;
+ /* background: url('images/alert.gif') no-repeat; */
+ background-position: 4px 2px;
+ color: #fff;
+ height: 17px;
+ width: 500px;
+ padding: 4px;
+ padding-left: 27px;
+ float: left;
+}
+#header-right .container {
+ position: relative;
+}
+#header-right .container .left {
+ position: relative;
+ float: left;
+ font-size: 1.3em;
+ font-weight: bold;
+ top: 15px;
+ left: 4px;
+ display: none;
+}
+#header-right .container .right {
+ position: relative;
+ float: right;
+ top: 22px;
+ padding-right: 4px;
+ z-index: 1;
+}
+
+#header-right .container .right #alerts {
+ position: relative;
+ background: url('images/alert_bgr.png') no-repeat;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-top: 20px;
+ padding-left: 5px;
+ margin: 0px;
+}
+#header-right .container .right #hostname {
+ position: relative;
+ height: 39px;
+ width: 431px;
+ z-index: 1;
+ padding-left: 5px;
+ margin: 0px;
+ top: 25px;
+ left: 230px;
+ font-size: 14px;
+ color: #cccccc;
+ font-weight: bold;
+}
+
+
+
+table#marquee {
+ position: relative;
+ top: -6px;
+ left: -5px;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ width: 424px;
+ background-color: transparent;
+ padding: 2px;
+ border: 0px;
+}
+span#marquee-container {
+ position: absolute;
+ visibility: hidden;
+ top: -100px;
+ left: -10000px;
+}
+div#marquee-text {
+ font-size: 1.18em;
+ font-weight: normal;
+ font-family: Verdana;
+ color: #ffffff;
+}
+table#marquee div#container {
+ position: relative;
+ overflow: hidden;
+ width: 418px;
+ height: 20px;
+}
+table#marquee div#container div#scroller {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+}
+
+
+
+
+
+#content {
+ position: relative;
+ top: -15px;
+ left: 0px;
+ margin-top: 0px;
+ margin-left: 0px;
+ padding-top: 0px;
+ width: 810px;
+ background-color: #ffffff;
+}
+
+#left {
+ width: 810px;
+ height: 1px;
+}
+#right {
+ position: relative;
+ top: -10px;
+ width: 770px;
+ margin-top: 0px;
+ margin-left: 5px;
+ margin-right: 5px;
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 20px;
+ min-height: 400px;
+}
+
+#footer {
+ position: relative;
+ background: url('images/footer.png') no-repeat;
+ top: -18px;
+ left: 0px;
+ width: 810px;
+ height: 75px;
+ color: #ffffff;
+ text-align: center;;
+ font-size: 0.9em;
+ padding-top: 17px;
+ margin-bottom: 20px;
+ clear: both;
+}
+#footer p {
+ padding: 0px;
+ margin: 0px;
+}
+
+/* Style the List */
+#navigation {
+ /* background: url('images/menu.gif') no-repeat; */
+ /* width: 693px; */
+ position: relative;
+ top: -25px;
+ left: 3px;
+ width: 810px;
+ padding: 0px;
+ height: 28px;
+ z-index: 3;
+}
+#navigation ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center;
+}
+#navigation ul#menu {
+ padding-top: 3px;
+ padding-left: 5px;
+}
+
+/* Style the List Elements */
+#navigation ul li {
+ float: left;
+ position: relative;
+ /* width: 7.5em; */
+ width: 8.77em;
+}
+#navigation ul li div {
+ font-size: 1em;
+ font-weight: bold;
+}
+/* Make the List inside the List Elements */
+/* initially hidden with absolute position */
+#navigation ul li ul {
+ display: none;
+ position: absolute;
+ top: 2em;
+ left: -2px;
+ width: 9em;
+ font-weight: normal;
+ background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */
+ /* background-color: #202020;
+ background: url("images/menu_footer.gif") no-repeat;
+ background-position: bottom;
+ */
+ padding: 0em 0 0.4em 0;
+ padding-top: 0.3em;
+}
+/* to override top and left in browsers other than IE */
+/* which will position to the top right of the containing */
+/* li, rather than bottom left */
+#navigation ul li > ul {
+ top: auto;
+ left: auto;
+ left: -1px !important;
+}
+/* Show initial drop down upon mouse over, but do not show */
+/* nested side drop menus within listed elements */
+#navigation ul li:hover ul {
+ display: block;
+ cursor: pointer;
+}
+#navigation ul li:hover {
+ cursor: pointer;
+ cursor: pointer;
+}
+#navigation ul li:hover div {
+ text-decoration: none;
+}
+
+#navigation ul li {
+ background-color: transparent;
+ color: #FFF;
+}
+#navigation ul li ul li {
+ border: 1px solid #990000;
+ width: 8.8em;
+ height: 1.6em;
+ line-height: 1.6em;
+ background-color: #990000;
+ color: #FFF;
+}
+#navigation ul li ul li:hover {
+ background-color: #666666;
+}
+
+#navigation li li a {
+ display: block;
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#navigation ul li ul li a.navlnk:hover {
+ text-decoration: none;
+}
+#navigation ul li.first {
+ border-right: 0px;
+}
+#navigation ul li.middle {
+ border-right: 0px;
+}
+#navigation ul li.last {
+
+}
+
+#navigation ul li.dropfirst {
+ border-bottom: 0px;
+}
+#navigation ul li.dropmiddle {
+ border-bottom: 0px;
+}
+#navigation ul li.droplast {
+}
+
+#wzdtabcont {
+ float: left;
+ background-color: #FFFFFF;
+ color: #000000;
+ padding: 0;
+}
+
+ul#wzdnav {
+ font-size: 0.96em;
+ float: left;
+ width: 14.5em;
+ margin: 0;
+ padding-left: 18px;
+}
+
+ul#wzdnav li {
+ list-style: none;
+ margin: 0;
+ padding-bottom: 0.2em;
+ padding-left: 0;
+}
+
+ul#wzdnav a {
+ display: block;
+ padding: 0.3em;
+ font-weight: normal;
+}
+
+#wzdnavbold a {
+ display: block;
+ padding: 0.3em;
+ font-weight: bold ! important;
+}
+
+ul#wzdnav a:link {
+ color: black;
+ background-color: #eee;
+}
+
+ul#wzdnav a:visited {
+ color: #666;
+ background-color: #eee;
+}
+
+ul#wzdnav a:hover {
+ color: black;
+ background-color: white;
+}
+
+ul#wzdnav a:active {
+ color: white;
+ background-color: gray;
+}
+
+#graph {
+ position: relative;
+ z-index: 1;
+}
+
+#logoutbtn {
+ position: absolute;
+ left: 95%;
+ vertical-align: middle;
+}
+
+/* Class Based CSS Definitions */
+.pgtitle {
+ font-size: 18px;
+ color: #777777;
+ font-weight: bold;
+}
+.tfrtitle {
+ font-size: 18px;
+ color: #ffffff;
+ font-weight: bold;
+}
+.vncell {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ border-bottom: 1px solid #999999;
+}
+.formfld {
+ padding-left: 19px;
+ font-size: small;
+}
+.formselect {
+ font-size: 1.0em;
+}
+.langopt {
+ padding-left: 34px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.saved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_saved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_saved.png') ! important;
+}
+.notsaved {
+ /* background: url('/themes/nione/images/icons/icon_wzd_nsaved.png') no-repeat 0 1px #FFFFFF; */
+ list-style-image: url('/themes/nervecenter/images/icons/icon_wzd_nsaved.png') ! important;
+}
+.en {
+ background: url('/themes/nervecenter/images/icons/icon_flag_en.png') no-repeat 0 1px #FFFFFF;
+}
+.de {
+ background: url('/themes/nervecenter/images/icons/icon_flag_de.png') no-repeat 0 1px #FFFFFF;
+}
+.es {
+ background: url('/themes/nervecenter/images/icons/icon_flag_es.png') no-repeat 0 1px #FFFFFF;
+}
+.pt_BR {
+ background: url('/themes/nervecenter/images/icons/icon_flag_pt_BR.png') no-repeat 0 1px #FFFFFF;
+}
+.host {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_host.png') no-repeat 0 1px #FFFFFF;
+}
+.search {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_search.png') no-repeat 0 1px #FFFFFF;
+}
+.file {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_file.png') no-repeat 0 1px #FFFFFF;
+}
+.mail {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_mail.png') no-repeat 0 1px #FFFFFF;
+}
+.imp {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_imp.png') no-repeat 0 1px #FFFFFF;
+}
+.pwd {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_pwd.png') no-repeat 0 1px #FFFFFF;
+}
+.user {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_user.png') no-repeat 0 1px #FFFFFF ;
+}
+.group {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_group.png') no-repeat 0 1px #FFFFFF;
+}
+.url {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_url.png') no-repeat 0 1px #FFFFFF;
+}
+.time {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_time.png') no-repeat 0 1px #FFFFFF;
+}
+.unknown {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_unknown.png') no-repeat 0 1px #FFFFFF;
+}
+.formfld_cert {
+ background: url('/themes/nervecenter/images/icons/icon_frmfld_cert.png') no-repeat 0 1px #FFFFFF;
+ padding-left: 28px;
+ font-family: Courier New, Courier, monospaced;
+ font-size: 11px;
+}
+.formfldalias {
+ background-color: #990000;
+ color: #FFFFFF;
+}
+.formpre {
+ font-family: Courier New, Courier, monospaced;
+ font-size: 10px;
+}
+.formbtn {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+ font-weight: bold;
+}
+.formbtns {
+ font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+}
+.vvcell {
+ background-color: #FFFFC6;
+}
+.errmsg {
+ font-weight: bold;
+ color: #CC0000;
+}
+.red {
+ color: #CC0000;
+}
+.gray {
+ color: #A0A0A0;
+}
+.vexpl {
+ font-size: 11px;
+}
+.navlnk {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 13px;
+}
+.navlnks {
+ color: #FFFFFF;
+ text-decoration: none;
+ font-size: 11px;
+}
+.redlnk {
+ color: #990000;
+ text-decoration: none;
+}
+.tblnk {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+.vncellreq {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vncellt {
+ background-color: #DDDDDD;
+ padding-right: 20px;
+ padding-left: 8px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+}
+.vtable {
+ border-bottom: 1px solid #999999;
+}
+.vnsepcell {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.cpline {
+ font-size: 11px;
+ color: #FFFFFF;
+}
+.hostname {
+ font-size: 11px;
+ color: #990000;
+ font-weight: bold;
+}
+.vnsepcellr {
+ background-color: #BBBBBB;
+ padding-right: 20px;
+ padding-left: 8px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listrpad {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 10px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+.listn {
+ font-size: 11px;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbg {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listbggrey {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #999999;
+ padding-right: 16px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listhdr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdr a {
+ color: #000000;
+}
+.listhdrr {
+ background-color: #BBBBBB;
+ padding-right: 16px;
+ padding-left: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.listhdrr a {
+ color: #000000;
+}
+.listlr {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listlrns {
+ background-color: #FFFFFF;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ border-left: 1px solid #999999;
+ font-size: 11px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.list {
+ font-size: 11px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.listt {
+ font-size: 11px;
+ padding-top: 5px;
+}
+.listhdrrns {
+ background-color: #BBBBBB;
+ padding-left: 6px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 6px;
+ font-weight: bold;
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+}
+.listbgns {
+ border-right: 1px solid #999999;
+ border-bottom: 1px solid #999999;
+ font-size: 11px;
+ background-color: #D9DEE8;
+ padding-left: 6px;
+ padding-right: 4px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+.listtopic {
+ border-right: 1px solid #999999;
+ font-size: 11px;
+ background-color: #990000;
+ padding-right: 16px;
+ padding-left: 6px;
+ color: #FFFFFF;
+ font-weight: bold;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.optsect_t {
+ border-right: 1px solid #999999;
+ background-color: #990000;
+ padding-right: 6px;
+ padding-left: 6px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+}
+.optsect_s {
+ font-size: 11px;
+ color: #FFFFFF;
+ font-weight: bold;
+}
+.tabnavtbl {
+}
+
+
+/* MISC CSS Definitions */
+ul#tabnav {
+ font-size: 11px;
+ font-weight: bold;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+ul#tabnav li.tabinact1 {
+ float: left;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact {
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+ul#tabnav li.tabinact a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabinact1 a {
+ float: left;
+ display: block;
+ text-decoration: none;
+ padding: 5px 8px 5px 8px;
+ color: #FFFFFF;
+}
+ul#tabnav li.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabcont {
+ background-color: #EEEEEE;
+ padding-right: 12px;
+ padding-left: 12px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+}
+.tabact {
+ float: left;
+ background-color: #EEEEEE;
+ color: #000000;
+ padding: 5px 8px 5px 8px;
+ white-space: nowrap;
+}
+.tabinact {
+ font-weight: bold;
+ float: left;
+ border-left: 1px solid #999999;
+ background-color: #777777;
+ color: #FFFFFF;
+ padding: 0;
+ white-space: nowrap;
+}
+.menu {
+ background-color: #000000;
+ white-space: nowrap;
+ padding: 0px 5px 0px 5px;
+ width: 100%;
+ vertical-align: top;
+}
+
+
+/* Auto Complete Suggestions */
+div.suggestions {
+ -moz-box-sizing: border-box;
+ /* box-sizing: border-box; */
+ border: 1px solid black;
+ position: absolute;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div {
+ cursor: default;
+ padding: 0px 3px;
+ background-color: #990000;
+ color: #FFF;
+}
+
+div.suggestions div.current {
+ background-color: #3366cc;
+ color: #FFF;
+}
+/* End Auto Complete Suggestions */
+
+
+/* Nifty Corners Crap */
+.rtop,.artop{display:block}
+.rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px}
+.artop *{border-style: solid;border-width:0 1px}
+.r1,.rl1,.re1,.rel1{margin-left:5px}
+.r1,.rr1,.re1,.rer1{margin-right:5px}
+.r2,.rl2,.re2,.rel2,.ra1,.ral1{margin-left:3px}
+.r2,.rr2,.re2,.rer2,.ra1,.rar1{margin-right:3px}
+.r3,.rl3,.re3,.rel3,.ra2,.ral2,.rs1,.rsl1,.res1,.resl1{margin-left:2px}
+.r3,.rr3,.re3,.rer3,.ra2,.rar2,.rs1,.rsr1,.res1,.resr1{margin-right:2px}
+.r4,.rl4,.rs2,.rsl2,.re4,.rel4,.ra3,.ral3,.ras1,.rasl1,.res2,.resl2{margin-left:1px}
+.r4,.rr4,.rs2,.rsr2,.re4,.rer4,.ra3,.rar3,.ras1,.rasr1,.res2,.resr2{margin-right:1px}
+.rx1,.rxl1{border-left-width:5px}
+.rx1,.rxr1{border-right-width:5px}
+.rx2,.rxl2{border-left-width:3px}
+.rx2,.rxr2{border-right-width:3px}
+.re2,.rel2,.ra1,.ral1,.rx3,.rxl3,.rxs1,.rxsl1{border-left-width:2px}
+.re2,.rer2,.ra1,.rar1,.rx3,.rxr3,.rxs1,.rxsr1{border-right-width:2px}
+.rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0}
+.rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0}
+.r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px}
+.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px}
+/* End Nifty Corners Crap */
+
+
+
+/* CSS for Dynamic Log Viewer */
+/* Author: Erik Kristensen */
+div#log div.log-entry {
+ clear: both;
+}
+
+div#log div.log-entry span,
+div#log div.log-header span {
+ padding: 3px 2px 3px 2px;
+ padding-left: 8px;
+}
+
+div#log div.log-entry span.log-action {
+ padding-bottom: 6px;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+div#log div.log-header span {
+ border-top: 1px solid #999;
+ background-color: #bbb;
+ font-weight: bold;
+ text-align: left;
+}
+
+div#log span.log-action,
+div#log span.log-time,
+div#log span.log-interface,
+div#log span.log-source,
+div#log span.log-destination,
+div#log span.log-protocol {
+ float: left;
+ text-align: left;
+ border-left: 1px solid #999;
+ border-bottom: 1px solid #999;
+}
+
+div#log span.log-general {
+
+}
+
+div#log span.log-protocol {
+ border-right: 1px solid #999;
+}
+
+div#log span.log-action {
+ width: 2em;
+ text-align: center;
+}
+
+div#log span.log-time {
+ width: 12.5em;
+}
+
+div#log span.log-interface {
+ width: 5em;
+}
+
+div#log span.log-source,
+div#log span.log-destination {
+ width: 17.6em;
+}
+
+div#log span.log-protocol {
+ width: 5.5em;
+}
+/* END CSS FOR DYNAMIC LOG VIEWER */
+
+#login {
+ background: #cccccc;
+ border: 0px solid #666666;
+ margin: 5em auto;
+ padding: 0em;
+ width: 340px;
+}
+
+#login h1 {
+ background: url(images/misc/logon.png) no-repeat top left;
+ margin-top: 0;
+ display: block;
+ text-indent: -1000px;
+ height: 50px;
+ border-bottom: none;
+}
+
+#login p {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login span {
+ font-size: 1em;
+ font-weight: bold;
+ width: 20%;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login p#text {
+ font-size: 1em;
+ font-weight: normal;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
+
+#login #username, #password {
+ font-size: 1em;
+ width: 60%;
+ padding: 3px;
+ margin: 0em;
+}
+
+#login #submit {
+ font-size: 1em;
+ font-weight: bold;
+ padding: 3px;
+ margin: 0em;
+ text-indent: 10px;
+}
diff --git a/src/usr/local/www/tree-images/empty.gif b/src/usr/local/www/tree-images/empty.gif
new file mode 100755
index 0000000..b501ceb
--- /dev/null
+++ b/src/usr/local/www/tree-images/empty.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/join.gif b/src/usr/local/www/tree-images/join.gif
new file mode 100755
index 0000000..976ba7e
--- /dev/null
+++ b/src/usr/local/www/tree-images/join.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/joinbottom.gif b/src/usr/local/www/tree-images/joinbottom.gif
new file mode 100755
index 0000000..8552b66
--- /dev/null
+++ b/src/usr/local/www/tree-images/joinbottom.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/line.gif b/src/usr/local/www/tree-images/line.gif
new file mode 100755
index 0000000..976beda
--- /dev/null
+++ b/src/usr/local/www/tree-images/line.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/minus_.gif b/src/usr/local/www/tree-images/minus_.gif
new file mode 100755
index 0000000..7c3a143
--- /dev/null
+++ b/src/usr/local/www/tree-images/minus_.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/minus_up.gif b/src/usr/local/www/tree-images/minus_up.gif
new file mode 100755
index 0000000..16915d4
--- /dev/null
+++ b/src/usr/local/www/tree-images/minus_up.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/page.gif b/src/usr/local/www/tree-images/page.gif
new file mode 100755
index 0000000..531f133
--- /dev/null
+++ b/src/usr/local/www/tree-images/page.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/plus_.gif b/src/usr/local/www/tree-images/plus_.gif
new file mode 100755
index 0000000..34c1a5e
--- /dev/null
+++ b/src/usr/local/www/tree-images/plus_.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/plus_up.gif b/src/usr/local/www/tree-images/plus_up.gif
new file mode 100755
index 0000000..d095e07
--- /dev/null
+++ b/src/usr/local/www/tree-images/plus_up.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/plus_updown.gif b/src/usr/local/www/tree-images/plus_updown.gif
new file mode 100755
index 0000000..afc1753
--- /dev/null
+++ b/src/usr/local/www/tree-images/plus_updown.gif
Binary files differ
diff --git a/src/usr/local/www/tree-images/zone.gif b/src/usr/local/www/tree-images/zone.gif
new file mode 100755
index 0000000..f49d647
--- /dev/null
+++ b/src/usr/local/www/tree-images/zone.gif
Binary files differ
diff --git a/src/usr/local/www/tree/i-bottom.gif b/src/usr/local/www/tree/i-bottom.gif
new file mode 100755
index 0000000..f07fa99
--- /dev/null
+++ b/src/usr/local/www/tree/i-bottom.gif
Binary files differ
diff --git a/src/usr/local/www/tree/i-repeater.gif b/src/usr/local/www/tree/i-repeater.gif
new file mode 100755
index 0000000..d5ab089
--- /dev/null
+++ b/src/usr/local/www/tree/i-repeater.gif
Binary files differ
diff --git a/src/usr/local/www/tree/index.html b/src/usr/local/www/tree/index.html
new file mode 100644
index 0000000..f2c45d4
--- /dev/null
+++ b/src/usr/local/www/tree/index.html
@@ -0,0 +1,228 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
+
+ <head>
+ <title>SilverStripe Tree Control</title>
+ <link rel="stylesheet" type="text/css" media="all" href="tree.css" />
+ <script type="text/javascript" src="tree.js"></script>
+ <style>
+ html {
+ background-color: #DDD;
+ }
+ body {
+ font-size: 80%;
+ font-family: Arial, Helvetica, sans-serif;
+ width: 50em;
+ margin: 0 auto 3.5em auto;
+ padding: 1em;
+ background-color: white;
+ border-left: 1px #CCC solid;
+ border-right: 1px #CCC solid;
+ }
+ ul.tree a {
+ font-size: 0.8em;
+
+ }
+ code {
+ display: block;
+ font-size: 1.2em;
+ margin: 2em 5em;
+ padding: 0.5em;
+ border: 1px #CCC solid;
+ background-color: #EEE;
+ }
+ #version {
+ float: right;
+ font-style: italic;
+ margin-top: -4em;
+ }
+
+ dt {
+ margin: 1.2em 0 0.2em 0;
+ font-weight: bold;
+ font-size: 1.1em
+ }
+ dd {
+ margin: 0;
+ }
+ h2 {
+ margin-top: 4em;
+ border-bottom: 1px #CCC dotted;
+ }
+
+ #footer {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 3em;
+ }
+ #footer div {
+ margin: auto;
+ width: 52em;
+ height: 3em;
+ background-color: #777;
+ color: white;
+ }
+ #footer a {
+ color: white;
+ }
+ #footer p.left {
+ float: left;
+ margin: 0.75em 1em;
+ }
+ #footer p.right {
+ float: right;
+ margin: 0.75em 1em;
+ }
+
+ </style>
+ </head>
+
+<body>
+
+ <h1>SilverStripe Tree Control</h1>
+ <p>This tree control was put together by <a href="sam@silverstripe.com">Sam Minn&eacute;e</a> at
+ <a href="http://www.silverstripe.com/blog">SilverStripe</a> in New Zealand. We've put it out there
+ for everyone to enjoy. Check out <a href="http://www.silverstripe.com/blog">our blog</a> if you're
+ wondering what we're up to.</p>
+ <p>This file came from <a href="http://www.silverstripe.com/downloads/tree/">http://www.silverstripe.com/downloads/tree/</a>.
+ If you found this file elsewhere, check out that page: we might have posted an updated version.</p>
+
+ <p>
+ <b>Quick-links:</b>
+ <a href="#Demo">Demo</a> | <a href="#Usage">Usage</a> | <a href="#Download">Download</a> | <a href="#HowItWorks">How it Works</a>
+ </p>
+
+ <h2 id="Demo">Demo</h2>
+ <p>Here's a basic demo of the tree control. Our styling is fairly basic, but with updated CSS and
+ images you can do whatever you like. Just for fun, try changing the text size.</p>
+
+ <ul class="tree">
+ <li><a href="#">item 1</a>
+ <ul>
+ <li><a href="#">item 1.1</a></li>
+ <li class="closed"><a href="#">item 1.2</a>
+ <ul>
+ <li><a href="#">item 1.2.1</a></li>
+ <li><a href="#">item 1.2.2</a></li>
+ <li><a href="#">item 1.2.3</a></li>
+ </ul>
+ </li>
+ <li><a href="#">item 1.3</a></li>
+ </ul>
+ </li>
+ <li><a href="#">item 2</a>
+ <ul>
+ <li><a href="#">item 2.1</a></li>
+ <li><a href="#">item 2.2</a></li>
+ <li><a href="#">item 2.3</a></li>
+ </ul>
+ </li>
+ </ul>
+
+ <h2 id="Download">Download</h2>
+
+ <p><a href="../tree.zip">Download everything you need here</a> - tree.zip, 11kb</p>
+
+ <h2 id="Usage">Usage</h2>
+
+ <p>The first thing to do is include the appropriate JavaScript and CSS files:</p>
+
+ <code>
+ &lt;link rel="stylesheet" type="text/css" media="all" href="tree.css" /&gt;<br />
+ &lt;script type="text/javascript" src="tree.js"&gt;&lt;/script&gt;
+ </code>
+
+ <p>Then, create the HTML for you tree. This is basically a nested set of bullet pointed links. The
+ "tree" class at the top is what the script will look for. Note that you can make a tree ndoe closed
+ to begin with by adding class="closed".</p>
+
+ <p>Here's the HTML code that I inserted to create the demo tree above.</p>
+
+ <code>
+ &lt;ul class="tree"&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 1&lt;/a&gt;<br />
+ &lt;ul&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 1.1&lt;/a&gt;&lt;/li&gt;<br />
+ &lt;li class="closed"&gt;&lt;a href="#"&gt;item 1.2&lt;/a&gt;<br />
+ &lt;ul&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 1.2.1&lt;/a&gt;&lt;/li&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 1.2.2&lt;/a&gt;&lt;/li&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 1.2.3&lt;/a&gt;&lt;/li&gt;<br />
+ &lt;/ul&gt; <br />
+ &lt;/li&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 1.3&lt;/a&gt;&lt;/li&gt;<br />
+ &lt;/ul&gt; <br />
+ &lt;/li&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 2&lt;/a&gt;<br />
+ &lt;ul&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 2.1&lt;/a&gt;&lt;/li&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 2.2&lt;/a&gt;&lt;/li&gt;<br />
+ &lt;li&gt;&lt;a href="#"&gt;item 2.3&lt;/a&gt;&lt;/li&gt;<br />
+ &lt;/ul&gt; <br />
+ &lt;/li&gt;<br />
+ &lt;/ul&gt;
+ </code>
+
+ <p>Your tree is now complete!</p>
+
+ <h2 id="HowItWorks">How it works</h2>
+ <dl>
+ <dt>Starting the script</dt>
+ <dd>In simple situations, creating an auto-loading script is a simple matter of setting window.onload
+ to a function. But what if there's more than one script? To this end, we created an appendLoader()
+ function that will execute multiple loader functions, including a previously defined loader function</dd>
+
+ <dt>Finding the tree content</dt>
+ <dd>Rather than write a piece of script to define we're your tree is, we've tried to make the script
+ as automatic as possible - it finds all ULs with a class name containing "tree".</dd>
+
+ <dt>Augmenting the HTML</dt>
+ <dd>Unfortunately, an LI containing an A isn't sufficient for doing all of the necessary tree styling.
+ Rather than force people to put non-semantic HTML into their file, the script generates extra &lt;span&gt; tags.
+ So, the following HTML:
+
+ <code>
+ &lt;li&gt;&lt;a href="#"&gt;My item&lt;/a&gt;&lt;/li&gt;
+ </code>
+
+ Is turned into the more ungainly, and yet more easily styled:
+
+ <code>
+ &lt;li&gt;&lt;span class="a"&gt;&lt;span class="b"&gt;&lt;span class="c"&gt;&lt;a href="#"&gt;My item&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
+ </code>
+
+ Additionally, some helper classes are applied to the &lt;li&gt; and &lt;span class="a"&gt; elements:
+ <ul>
+ <li>"last" is applied to the last node of any subtree.</li>
+ <li>"children" is applied to any node that has children.</li>
+ </ul>
+ </dd>
+
+ <dt>Styling it up</dt>
+ <dd>Why the heck do we need 5 styling elements? Basically, because there are 5 background-images to apply:
+ <ul>
+ <li><b>li:</b> A repeating vertical line is shown. Nested &lt;li&gt; tags
+ give us the multiple vertical lines that we need.</li>
+ <li><b>span.a:</b> We overlay the vertical line with 'L' and 'T' elements as needed.</li>
+ <li><b>span.b:</b> We overlay '+' or '-' signs on nodes with children.</li>
+ <li><b>span.c:</b> This is needed to fix up the vertical line.</li>
+ <li><b>a:</b> Finally, we apply the page icon.</li>
+ </ul>
+ </dd>
+
+ <dt>Opening / closing nodes</dt>
+ <dd>Having come this far, the "dynamic" aspect of the tree control is very trivial. We set a "closed"
+ class on the &lt;li&gt; and &lt;span class="a"&gt; elements, and our CSS takes care of hiding the
+ children, changing the - to a + and changing the folder icon.</dd>
+ </dl>
+
+ <div id="footer">
+ <div>
+ <p class="left"><a href="http://www.silverstripe.com/downloads/tree">SilverStripe Tree Control</a>: v0.1, 30 Oct 2005</p>
+ <p class="right">Copyright &copy; 2005 <a href="http://www.silverstripe.com/blog">SilverStripe Limited</a></p>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/src/usr/local/www/tree/l.gif b/src/usr/local/www/tree/l.gif
new file mode 100755
index 0000000..1e8c707
--- /dev/null
+++ b/src/usr/local/www/tree/l.gif
Binary files differ
diff --git a/src/usr/local/www/tree/minus.gif b/src/usr/local/www/tree/minus.gif
new file mode 100755
index 0000000..7a7fd3b
--- /dev/null
+++ b/src/usr/local/www/tree/minus.gif
Binary files differ
diff --git a/src/usr/local/www/tree/page-file.png b/src/usr/local/www/tree/page-file.png
new file mode 100755
index 0000000..d3bb119
--- /dev/null
+++ b/src/usr/local/www/tree/page-file.png
Binary files differ
diff --git a/src/usr/local/www/tree/page-file_play.gif b/src/usr/local/www/tree/page-file_play.gif
new file mode 100755
index 0000000..0c8e9ff
--- /dev/null
+++ b/src/usr/local/www/tree/page-file_play.gif
Binary files differ
diff --git a/src/usr/local/www/tree/page-file_x.gif b/src/usr/local/www/tree/page-file_x.gif
new file mode 100755
index 0000000..504f06e
--- /dev/null
+++ b/src/usr/local/www/tree/page-file_x.gif
Binary files differ
diff --git a/src/usr/local/www/tree/page-foldericon.png b/src/usr/local/www/tree/page-foldericon.png
new file mode 100755
index 0000000..d26f2dc
--- /dev/null
+++ b/src/usr/local/www/tree/page-foldericon.png
Binary files differ
diff --git a/src/usr/local/www/tree/page-openfoldericon.png b/src/usr/local/www/tree/page-openfoldericon.png
new file mode 100755
index 0000000..8d00c39
--- /dev/null
+++ b/src/usr/local/www/tree/page-openfoldericon.png
Binary files differ
diff --git a/src/usr/local/www/tree/plus.gif b/src/usr/local/www/tree/plus.gif
new file mode 100755
index 0000000..3530f59
--- /dev/null
+++ b/src/usr/local/www/tree/plus.gif
Binary files differ
diff --git a/src/usr/local/www/tree/t.gif b/src/usr/local/www/tree/t.gif
new file mode 100755
index 0000000..a92da2a
--- /dev/null
+++ b/src/usr/local/www/tree/t.gif
Binary files differ
diff --git a/src/usr/local/www/tree/tree.css b/src/usr/local/www/tree/tree.css
new file mode 100644
index 0000000..31b7979
--- /dev/null
+++ b/src/usr/local/www/tree/tree.css
@@ -0,0 +1,136 @@
+/*
+ * CSS for Standard tree layout
+ * Copyright (C) 2005 SilverStripe Limited
+ * Feel free to use this on your websites, but please leave this message in the fies
+ * http://www.silverstripe.com/blog
+ */
+
+ul.tree{
+ width: auto;
+ padding-left : 0px;
+ margin-left : 0px;
+}
+
+ul.tree img{
+ border : none;
+}
+
+
+ul.tree, ul.tree ul {
+ padding-left: 0;
+}
+
+ul.tree ul {
+ margin-left: 16px;
+
+}
+ul.tree li.closed ul {
+ display: none;
+}
+
+
+ul.tree li {
+ list-style: none;
+ background: url(i-repeater.gif) 0 0 repeat-y;
+ display: block;
+ width: auto;
+ /* background-color:#FFFFFF; */
+}
+
+
+
+ul.tree li.last {
+ list-style: none;
+ background-image: none;
+}
+
+
+
+/* Span-A: I/L/I glpyhs */
+ul.tree span.a {
+ background: url(t.gif) 0 50% no-repeat;
+ display: block;
+}
+ul.tree span.a.last {
+ background: url(l.gif) 0 50% no-repeat;
+}
+
+/* Span-B: Plus/Minus icon */
+ul.tree span.b {
+}
+ul.tree span.a.children span.b {
+ background: url(minus.gif) 0 50% no-repeat;
+ cursor: pointer;
+}
+ul.tree li.closed span.a.children span.b {
+ background: url(plus.gif) 0 50% no-repeat;
+ cursor: pointer;
+}
+
+/* Span-C: Spacing and extending tree line below the icon */
+ul.tree span.c {
+ margin-left: 16px;
+}
+ul.tree span.a.children span.c {
+ background: url(i-bottom.gif) 0 50% no-repeat;
+}
+ul.tree span.a.spanClosed span.c {
+ background-image: none;
+}
+
+
+/* Anchor tag: Page icon */
+ul.tree a {
+ white-space: nowrap;
+ overflow: hidden;
+
+/* padding: 10px 0px 10px 18px; */
+ padding: 3px 0px 3px 18px;
+ line-height: 16px;
+
+/* background: url(page-file.png) 0 50% no-repeat; */
+ background: url(page-file.png) 0 0 no-repeat;
+}
+ul.tree span.a.children a {
+ background-image: url(page-openfoldericon.png);
+}
+ul.tree span.a.children.spanClosed a {
+ background-image: url(page-foldericon.png);
+}
+
+/* Unformatted tree */
+ul.tree.unformatted li {
+ background-image: none;
+ padding-left: 16px;
+}
+ul.tree.unformatted li li {
+ background-image: none;
+ padding-left: 0px;
+}
+
+/*
+ * Divs, by default store vertically aligned data
+ */
+
+ul.tree li div {
+ float: right;
+ clear: right;
+ height: 1em;
+ margin-top: -26px;
+}
+/* As inside DIVs should be treated normally */
+ul.tree div a {
+ padding: 0;
+ background-image: none;
+ min-height: auto;
+ height: auto;
+}
+
+ul.tree li A:link, ul.tree li A:hover, ul.tree li A:visited {
+ color : #111111;
+}
+
+
+ul.tree li .over{
+ background-color : pink;
+}
diff --git a/src/usr/local/www/tree/tree.js b/src/usr/local/www/tree/tree.js
new file mode 100644
index 0000000..8e9651e
--- /dev/null
+++ b/src/usr/local/www/tree/tree.js
@@ -0,0 +1,195 @@
+/*
+ * Content-separated javascript tree widget
+ * Copyright (C) 2005 SilverStripe Limited
+ * Feel free to use this on your websites, but please leave this message in the fies
+ * http://www.silverstripe.com/blog
+*/
+
+/*
+ * Initialise all trees identified by <ul class="tree">
+ */
+function autoInit_trees() {
+ var candidates = document.getElementsByTagName('ul');
+ for(var i=0;i<candidates.length;i++) {
+ if(candidates[i].className && candidates[i].className.indexOf('tree') != -1) {
+ initTree(candidates[i]);
+ candidates[i].className = candidates[i].className.replace(/ ?unformatted ?/, ' ');
+ }
+ }
+}
+
+/*
+ * Initialise a tree node, converting all its LIs appropriately
+ */
+function initTree(el) {
+ var i,j;
+ var spanA, spanB, spanC;
+ var startingPoint, stoppingPoint, childUL;
+
+ // Find all LIs to process
+ for(i=0;i<el.childNodes.length;i++) {
+ if(el.childNodes[i].tagName && el.childNodes[i].tagName.toLowerCase() == 'li') {
+ var li = el.childNodes[i];
+
+ // Create our extra spans
+ spanA = document.createElement('span');
+ spanB = document.createElement('span');
+ spanC = document.createElement('span');
+ spanA.appendChild(spanB);
+ spanB.appendChild(spanC);
+ spanA.className = 'a ' + li.className.replace('closed','spanClosed');
+ spanA.onMouseOver = function() {};
+ spanB.className = 'b';
+ spanB.onclick = treeToggle;
+ spanC.className = 'c';
+
+
+ // Find the UL within the LI, if it exists
+ stoppingPoint = li.childNodes.length;
+ startingPoint = 0;
+ childUL = null;
+ for(j=0;j<li.childNodes.length;j++) {
+ if(li.childNodes[j].tagName && li.childNodes[j].tagName.toLowerCase() == 'div') {
+ startingPoint = j + 1;
+ continue;
+ }
+
+ if(li.childNodes[j].tagName && li.childNodes[j].tagName.toLowerCase() == 'ul') {
+ childUL = li.childNodes[j];
+ stoppingPoint = j;
+ break;
+ }
+ }
+
+ // Move all the nodes up until that point into spanC
+ for(j=startingPoint;j<stoppingPoint;j++) {
+ spanC.appendChild(li.childNodes[startingPoint]);
+ }
+
+ // Insert the outermost extra span into the tree
+ if(li.childNodes.length > startingPoint) li.insertBefore(spanA, li.childNodes[startingPoint]);
+ else li.appendChild(spanA);
+
+ // Process the children
+ if(childUL != null) {
+ if(initTree(childUL)) {
+ addClass(li, 'children', 'closed');
+ addClass(spanA, 'children', 'spanClosed');
+ }
+ }
+ }
+ }
+
+ if(li) {
+ // li and spanA will still be set to the last item
+
+ addClass(li, 'last', 'closed');
+ addClass(spanA, 'last', 'spanClosed');
+ return true;
+ } else {
+ return false;
+ }
+
+}
+
+
+/*
+ * +/- toggle the tree, where el is the <span class="b"> node
+ * force, will force it to "open" or "close"
+ */
+function treeToggle(el, force) {
+ el = this;
+
+ while(el != null && (!el.tagName || el.tagName.toLowerCase() != "li")) el = el.parentNode;
+
+ // Get UL within the LI
+ var childSet = findChildWithTag(el, 'ul');
+ var topSpan = findChildWithTag(el, 'span');
+
+ if( force != null ){
+
+ if( force == "open"){
+ treeOpen( topSpan, el );
+ }
+ else if( force == "close" ){
+ treeClose( topSpan, el );
+ }
+
+ }
+
+ else if( childSet != null) {
+ // Is open, close it
+ if(!el.className.match(/(^| )closed($| )/)) {
+ treeClose( topSpan, el );
+ // Is closed, open it
+ } else {
+ treeOpen( topSpan, el );
+ }
+ }
+}
+
+
+function treeOpen( a, b ){
+ removeClass(a,'spanClosed');
+ removeClass(b,'closed');
+}
+
+
+function treeClose( a, b ){
+ addClass(a,'spanClosed');
+ addClass(b,'closed');
+}
+
+/*
+ * Find the a child of el of type tag
+ */
+function findChildWithTag(el, tag) {
+ for(var i=0;i<el.childNodes.length;i++) {
+ if(el.childNodes[i].tagName != null && el.childNodes[i].tagName.toLowerCase() == tag) return el.childNodes[i];
+ }
+ return null;
+}
+
+/*
+ * Functions to add and remove class names
+ * Mac IE hates unnecessary spaces
+ */
+function addClass(el, cls, forceBefore) {
+ if(forceBefore != null && el.className.match(new RegExp('(^| )' + forceBefore))) {
+ el.className = el.className.replace(new RegExp("( |^)" + forceBefore), '$1' + cls + ' ' + forceBefore);
+
+ } else if(!el.className.match(new RegExp('(^| )' + cls + '($| )'))) {
+ el.className += ' ' + cls;
+ el.className = el.className.replace(/(^ +)|( +$)/g, '');
+ }
+}
+function removeClass(el, cls) {
+ var old = el.className;
+ var newCls = ' ' + el.className + ' ';
+ newCls = newCls.replace(new RegExp(' (' + cls + ' +)+','g'), ' ');
+ el.className = newCls.replace(/(^ +)|( +$)/g, '');
+}
+
+/*
+ * Handlers for automated loading
+ */
+ _LOADERS = Array();
+
+function callAllLoaders() {
+ var i, loaderFunc;
+ for(i=0;i<_LOADERS.length;i++) {
+ loaderFunc = _LOADERS[i];
+ if(loaderFunc != callAllLoaders) loaderFunc();
+ }
+}
+
+function appendLoader(loaderFunc) {
+ if(window.onload && window.onload != callAllLoaders)
+ _LOADERS[_LOADERS.length] = window.onload;
+
+ window.onload = callAllLoaders;
+
+ _LOADERS[_LOADERS.length] = loaderFunc;
+}
+
+appendLoader(autoInit_trees);
diff --git a/src/usr/local/www/treeview.css b/src/usr/local/www/treeview.css
new file mode 100644
index 0000000..3cdf792
--- /dev/null
+++ b/src/usr/local/www/treeview.css
@@ -0,0 +1,48 @@
+.treeview {
+ border: 0px;
+ margin: 0px;
+ padding: 0px;
+ font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
+ font-size: 12px;
+ color: #333;
+ white-space: nowrap;
+ border: 0px;
+ vertical-align: middle;
+}
+.treeview img {
+ border: 0px;
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+.treeview a {
+ border: 0px;
+ margin: 0px;
+ padding: 0px;
+ color: #000;
+ text-decoration: none;
+ vertical-align: top;/* r3b*/
+}
+.treeview a.node {
+ border: 0px;
+ margin: 0px;
+ padding: 0px;
+ white-space: nowrap;
+ color: #00F;
+ height:16px;
+ width:auto;
+ overflow:hidden;
+ padding: 0px 0px 0px 0px;
+ vertical-align: top;
+}
+
+.treeview a.nodeSel {
+ border: 0px;
+ margin: 0px;
+ padding: 0px;
+
+}
+.treeview .clip {
+ overflow: hidden;
+
+}
diff --git a/src/usr/local/www/uploadconfig.php b/src/usr/local/www/uploadconfig.php
new file mode 100644
index 0000000..35e7c55
--- /dev/null
+++ b/src/usr/local/www/uploadconfig.php
@@ -0,0 +1,65 @@
+#!/usr/local/bin/php
+<?php
+/*
+ uploadconfig.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-hidden-uploadconfiguration
+##|*NAME=Hidden: Upload Configuration page
+##|*DESCR=Allow access to the 'Hidden: Upload Configuration' page.
+##|*MATCH=uploadconfig.php*
+##|-PRIV
+
+
+require("guiconfig.inc");
+
+header("Content-Type: text/plain");
+
+/* get config.xml in POST variable "config" */
+if ($_POST['config']) {
+ $fd = @fopen("{$g['tmp_path']}/config.xml", "w");
+ if (!$fd) {
+ echo gettext("ERR Could not save configuration.")."\n";
+ exit(0);
+ }
+ fwrite($fd, $_POST['config']);
+ fclose($fd);
+ if (config_install("{$g['tmp_path']}/config.xml") == 0) {
+ echo gettext("OK")."\n";
+ system_reboot();
+ } else {
+ echo gettext("ERR Could not install configuration.")."\n";
+ }
+} else {
+ echo gettext("ERR Invalid configuration received.")."\n";
+}
+
+exit(0);
+?>
diff --git a/src/usr/local/www/vpn_ipsec.php b/src/usr/local/www/vpn_ipsec.php
new file mode 100644
index 0000000..6ef6040
--- /dev/null
+++ b/src/usr/local/www/vpn_ipsec.php
@@ -0,0 +1,704 @@
+<?php
+/*
+ vpn_ipsec.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ part of pfSense
+
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-ipsec
+##|*NAME=VPN: IPsec page
+##|*DESCR=Allow access to the 'VPN: IPsec' page.
+##|*MATCH=vpn_ipsec.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+
+if (!is_array($config['ipsec']['phase1'])) {
+ $config['ipsec']['phase1'] = array();
+}
+
+if (!is_array($config['ipsec']['phase2'])) {
+ $config['ipsec']['phase2'] = array();
+}
+
+$a_phase1 = &$config['ipsec']['phase1'];
+$a_phase2 = &$config['ipsec']['phase2'];
+
+$pconfig['enable'] = isset($config['ipsec']['enable']);
+
+if ($_POST) {
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval = vpn_ipsec_configure();
+ /* reload the filter in the background */
+ filter_configure();
+ $savemsg = get_std_save_message($retval);
+ if ($retval >= 0) {
+ if (is_subsystem_dirty('ipsec')) {
+ clear_subsystem_dirty('ipsec');
+ }
+ }
+ } else if ($_POST['submit']) {
+ $pconfig = $_POST;
+
+ $config['ipsec']['enable'] = $_POST['enable'] ? true : false;
+
+ write_config();
+
+ $retval = vpn_ipsec_configure();
+ } else if (isset($_POST['del_x'])) {
+ /* delete selected p1 entries */
+ if (is_array($_POST['p1entry']) && count($_POST['p1entry'])) {
+ foreach ($_POST['p1entry'] as $p1entrydel) {
+ unset($a_phase1[$p1entrydel]);
+ }
+ if (write_config()) {
+ mark_subsystem_dirty('ipsec');
+ }
+ }
+ } else if (isset($_POST['delp2_x'])) {
+ /* delete selected p2 entries */
+ if (is_array($_POST['p2entry']) && count($_POST['p2entry'])) {
+ foreach ($_POST['p2entry'] as $p2entrydel) {
+ unset($a_phase2[$p2entrydel]);
+ }
+ if (write_config()) {
+ mark_subsystem_dirty('ipsec');
+ }
+ }
+ } else {
+ /* yuck - IE won't send value attributes for image buttons, while Mozilla does - so we use .x/.y to find move button clicks instead... */
+ unset($delbtn, $delbtnp2, $movebtn, $movebtnp2, $togglebtn, $togglebtnp2);
+ foreach ($_POST as $pn => $pd) {
+ if (preg_match("/del_(\d+)_x/", $pn, $matches)) {
+ $delbtn = $matches[1];
+ } else if (preg_match("/delp2_(\d+)_x/", $pn, $matches)) {
+ $delbtnp2 = $matches[1];
+ } else if (preg_match("/move_(\d+)_x/", $pn, $matches)) {
+ $movebtn = $matches[1];
+ } else if (preg_match("/movep2_(\d+)_x/", $pn, $matches)) {
+ $movebtnp2 = $matches[1];
+ } else if (preg_match("/toggle_(\d+)_x/", $pn, $matches)) {
+ $togglebtn = $matches[1];
+ } else if (preg_match("/togglep2_(\d+)_x/", $pn, $matches)) {
+ $togglebtnp2 = $matches[1];
+ }
+ }
+
+ $save = 1;
+
+ /* move selected p1 entries before this */
+ if (isset($movebtn) && is_array($_POST['p1entry']) && count($_POST['p1entry'])) {
+ $a_phase1_new = array();
+
+ /* copy all p1 entries < $movebtn and not selected */
+ for ($i = 0; $i < $movebtn; $i++) {
+ if (!in_array($i, $_POST['p1entry'])) {
+ $a_phase1_new[] = $a_phase1[$i];
+ }
+ }
+
+ /* copy all selected p1 entries */
+ for ($i = 0; $i < count($a_phase1); $i++) {
+ if ($i == $movebtn) {
+ continue;
+ }
+ if (in_array($i, $_POST['p1entry'])) {
+ $a_phase1_new[] = $a_phase1[$i];
+ }
+ }
+
+ /* copy $movebtn p1 entry */
+ if ($movebtn < count($a_phase1)) {
+ $a_phase1_new[] = $a_phase1[$movebtn];
+ }
+
+ /* copy all p1 entries > $movebtn and not selected */
+ for ($i = $movebtn+1; $i < count($a_phase1); $i++) {
+ if (!in_array($i, $_POST['p1entry'])) {
+ $a_phase1_new[] = $a_phase1[$i];
+ }
+ }
+ if (count($a_phase1_new) > 0) {
+ $a_phase1 = $a_phase1_new;
+ }
+
+ } else if (isset($movebtnp2) && is_array($_POST['p2entry']) && count($_POST['p2entry'])) {
+ /* move selected p2 entries before this */
+ $a_phase2_new = array();
+
+ /* copy all p2 entries < $movebtnp2 and not selected */
+ for ($i = 0; $i < $movebtnp2; $i++) {
+ if (!in_array($i, $_POST['p2entry'])) {
+ $a_phase2_new[] = $a_phase2[$i];
+ }
+ }
+
+ /* copy all selected p2 entries */
+ for ($i = 0; $i < count($a_phase2); $i++) {
+ if ($i == $movebtnp2) {
+ continue;
+ }
+ if (in_array($i, $_POST['p2entry'])) {
+ $a_phase2_new[] = $a_phase2[$i];
+ }
+ }
+
+ /* copy $movebtnp2 p2 entry */
+ if ($movebtnp2 < count($a_phase2)) {
+ $a_phase2_new[] = $a_phase2[$movebtnp2];
+ }
+
+ /* copy all p2 entries > $movebtnp2 and not selected */
+ for ($i = $movebtnp2+1; $i < count($a_phase2); $i++) {
+ if (!in_array($i, $_POST['p2entry'])) {
+ $a_phase2_new[] = $a_phase2[$i];
+ }
+ }
+ if (count($a_phase2_new) > 0) {
+ $a_phase2 = $a_phase2_new;
+ }
+
+ } else if (isset($togglebtn)) {
+ if (isset($a_phase1[$togglebtn]['disabled'])) {
+ unset($a_phase1[$togglebtn]['disabled']);
+ } else {
+ $a_phase1[$togglebtn]['disabled'] = true;
+ }
+ } else if (isset($togglebtnp2)) {
+ if (isset($a_phase2[$togglebtnp2]['disabled'])) {
+ unset($a_phase2[$togglebtnp2]['disabled']);
+ } else {
+ $a_phase2[$togglebtnp2]['disabled'] = true;
+ }
+ } else if (isset($delbtn)) {
+ /* remove static route if interface is not WAN */
+ if ($a_phase1[$delbtn]['interface'] <> "wan") {
+ mwexec("/sbin/route delete -host {$a_phase1[$delbtn]['remote-gateway']}");
+ }
+
+ /* remove all phase2 entries that match the ikeid */
+ $ikeid = $a_phase1[$delbtn]['ikeid'];
+ foreach ($a_phase2 as $p2index => $ph2tmp) {
+ if ($ph2tmp['ikeid'] == $ikeid) {
+ unset($a_phase2[$p2index]);
+ }
+ }
+ unset($a_phase1[$delbtn]);
+
+ } else if (isset($delbtnp2)) {
+ unset($a_phase2[$delbtnp2]);
+
+ } else {
+ $save = 0;
+ }
+
+ if ($save === 1) {
+ if (write_config()) {
+ mark_subsystem_dirty('ipsec');
+ }
+ }
+ }
+}
+
+$pgtitle = array(gettext("VPN"), gettext("IPsec"));
+$shortcut_section = "ipsec";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="vpn_ipsec.php" method="post">
+<script type="text/javascript" src="/javascript/row_toggle.js"></script>
+<?php
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+ if ($pconfig['enable'] && is_subsystem_dirty('ipsec')) {
+ print_info_box_np(gettext("The IPsec tunnel configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec">
+ <tr>
+ <td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
+ $tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
+ $tab_array[2] = array(gettext("Pre-Shared Keys"), false, "vpn_ipsec_keys.php");
+ $tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="enable">
+ <tr>
+ <td>
+ <input name="enable" type="checkbox" id="enable" value="yes" <?php if ($pconfig['enable']) echo "checked=\"checked\"";?> />
+ </td>
+ <td>
+ <strong><?=gettext("Enable IPsec"); ?></strong>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ </td>
+ </tr>
+ </table>
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="phase-1 entries">
+ <tr id="frheader">
+ <td class="list">&nbsp;</td>
+ <td class="list">&nbsp;</td>
+ <td class="listhdrr"><?=gettext("IKE"); ?></td>
+ <td class="listhdrr"><?=gettext("Remote Gateway"); ?></td>
+ <td class="listhdrr"><?=gettext("Mode"); ?></td>
+ <td class="listhdrr"><?=gettext("P1 Protocol"); ?></td>
+ <td class="listhdrr"><?=gettext("P1 Transforms"); ?></td>
+ <td class="listhdrr"><?=gettext("P1 Description"); ?></td>
+ <td class="list">
+ </td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_phase1 as $ph1ent):
+ $iconfn = "pass";
+ $spans = $spane = "";
+ if (isset($ph1ent['disabled'])) {
+ $spans = "<span class=\"gray\">";
+ $spane = "</span>";
+ $iconfn .= "_d";
+ }
+?>
+ <tr valign="top" id="fr<?=$i;?>" ondblclick="document.location='vpn_ipsec_phase1.php?p1index=<?=$i;?>'">
+ <td class="listt" align="center" valign="middle">
+ <input type="checkbox" id="frc<?=$i;?>" name="p1entry[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
+ </td>
+ <td class="listt" align="center" valign="middle">
+ <input name="toggle_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn?>.gif"
+ title="<?=gettext("click to toggle enabled/disabled status");?>"
+ type="image" style="height:11;width:11;border:0" />
+ </td>
+ <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
+ <?=$spans;?>
+<?php
+ if (empty($ph1ent['iketype']) || $ph1ent['iketype'] == "ikev1") {
+ echo "V1";
+ } else {
+ echo "V2";
+ }
+?>
+ <?=$spane;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
+ <?=$spans;?>
+<?php
+ if ($ph1ent['interface']) {
+ $iflabels = get_configured_interface_with_descr();
+
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip) {
+ $iflabels[$cif] = $carpip." (".get_vip_descr($carpip).")";
+ }
+
+ $aliaslist = get_configured_ip_aliases_list();
+ foreach ($aliaslist as $aliasip => $aliasif) {
+ $iflabels[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+ }
+
+ $grouplist = return_gateway_groups_array();
+ foreach ($grouplist as $name => $group) {
+ if ($group[0]['vip'] <> "") {
+ $vipif = $group[0]['vip'];
+ } else {
+ $vipif = $group[0]['int'];
+ }
+ $iflabels[$name] = "GW Group {$name}";
+ }
+ $if = htmlspecialchars($iflabels[$ph1ent['interface']]);
+ } else {
+ $if = "WAN";
+ }
+
+ if (!isset($ph1ent['mobile'])) {
+ echo $if."<br />".$ph1ent['remote-gateway'];
+ } else {
+ echo $if."<br /><strong>" . gettext("Mobile Client") . "</strong>";
+ }
+?>
+ <?=$spane;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
+ <?=$spans;?>
+ <?php
+ if (empty($ph1ent['iketype']) || $ph1ent['iketype'] == "ikev1") {
+ echo "{$ph1ent['mode']}";
+ }
+ ?>
+ <?=$spane;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
+ <?=$spans;?>
+ <?=$p1_ealgos[$ph1ent['encryption-algorithm']['name']]['name'];?>
+<?php
+ if ($ph1ent['encryption-algorithm']['keylen']) {
+ if ($ph1ent['encryption-algorithm']['keylen'] == "auto") {
+ echo " (" . gettext("auto") . ")";
+ } else {
+ echo " ({$ph1ent['encryption-algorithm']['keylen']} " . gettext("bits") . ")";
+ }
+ }
+?>
+ <?=$spane;?>
+ </td>
+ <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>">
+ <?=$spans;?>
+ <?=$p1_halgos[$ph1ent['hash-algorithm']];?>
+ <?=$spane;?>
+ </td>
+ <td class="listbg" onclick="fr_toggle(<?=$i;?>)">
+ <?=$spans;?>
+ <?=htmlspecialchars($ph1ent['descr']);?>&nbsp;
+ <?=$spane;?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td>
+ <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)"
+ name="move_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
+ title="<?=gettext("move selected entries before this");?>"
+ type="image" style="height:17;width:17;border:0" />
+ </td>
+ <td>
+ <a href="vpn_ipsec_phase1.php?p1index=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit phase1 entry"); ?>" width="17" height="17" border="0" alt="edit" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="del_<?=$i;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
+ title="<?=gettext("delete phase1 entry");?>"
+ type="image" style="height:17;width:17;border:0"
+ onclick="return confirm('<?=gettext("Do you really want to delete this phase1 and all associated phase2 entries?"); ?>')" />
+ </td>
+ <td>
+<?php
+ if (!isset($ph1ent['mobile'])):
+?>
+ <a href="vpn_ipsec_phase1.php?dup=<?=$i;?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("copy phase1 entry"); ?>" width="17" height="17" border="0" alt="add" />
+ </a>
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td class="listt">&nbsp;</td>
+ <td class="listt">&nbsp;</td>
+ <td class="listrborder" colspan="6">
+<?php
+ if (isset($_POST["tdph2-{$i}-visible"])) {
+ $tdph2_visible = htmlspecialchars($_POST["tdph2-{$i}-visible"]);
+ } else {
+ $tdph2_visible = 0;
+ }
+?>
+ <input type="hidden" name="tdph2-<?=$i;?>-visible" id="tdph2-<?=$i;?>-visible" value="<?=$tdph2_visible?>" />
+ <div id="shph2but-<?=$i?>" <?php echo ($tdph2_visible == '1' ? 'style="display:none"' : '');?>>
+<?php
+ $phase2count = 0;
+ foreach ($a_phase2 as $ph2ent) {
+ if ($ph2ent['ikeid'] != $ph1ent['ikeid']) {
+ continue;
+ }
+ $phase2count++;
+ }
+ $fr_prefix = "frp2{$i}";
+ $fr_header = $fr_prefix . "header";
+?>
+ <input type="button" onclick="show_phase2('tdph2-<?=$i?>', 'shph2but-<?=$i?>')" value="+" /> - <?php printf(gettext("Show %s Phase-2 entries"), $phase2count); ?>
+ </div>
+ <div id="tdph2-<?=$i?>" <?php echo ($tdph2_visible != '1' ? 'style="display:none"' : '');?>>
+ <table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="phase-2 entries">
+ <tr id="<?=$fr_header;?>">
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td class="listhdrr"><?=gettext("Mode"); ?></td>
+ <td class="listhdrr"><?=gettext("Local Subnet"); ?></td>
+ <td class="listhdrr"><?=gettext("Remote Subnet"); ?></td>
+ <td class="listhdrr"><?=gettext("P2 Protocol"); ?></td>
+ <td class="listhdrr"><?=gettext("P2 Transforms"); ?></td>
+ <td class="listhdrr"><?=gettext("P2 Auth Methods"); ?></td>
+ <td class ="list">&nbsp;</td>
+ </tr>
+<?php
+ $j = 0;
+ foreach ($a_phase2 as $ph2index => $ph2ent):
+ if ($ph2ent['ikeid'] != $ph1ent['ikeid']) {
+ continue;
+ }
+
+ $fr_c = $fr_prefix . "c" . $j;
+ $fr_d = $fr_prefix . "d" . $j;
+
+ $iconfn = "pass";
+ $spans = $spane = "";
+ if (isset($ph2ent['disabled']) || isset($ph1ent['disabled'])) {
+ $spans = "<span class=\"gray\">";
+ $spane = "</span>";
+ $iconfn .= "_d";
+ }
+?>
+ <tr valign="top" id="<?=$fr_prefix . $j;?>" ondblclick="document.location='vpn_ipsec_phase2.php?p2index=<?=$ph2ent['uniqid'];?>'">
+ <td class="listt" align="center" valign="middle">
+ <input type="checkbox" id="<?=$fr_c;?>" name="p2entry[]" value="<?=$ph2index;?>" onclick="fr_bgcolor('<?=$j;?>', '<?=$fr_prefix;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
+ </td>
+ <td class="listt" align="center" valign="middle">
+ <input name="togglep2_<?=$ph2index;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn?>.gif"
+ title="<?=gettext("click to toggle enabled/disabled status");?>"
+ type="image" style="height:11;width:11;border:0" />
+ </td>
+ <td class="listlr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
+ <?=$spans;?>
+ <?=$ph2ent['mode'];?>
+ <?=$spane;?>
+ </td>
+<?php
+ if (($ph2ent['mode'] == "tunnel") or ($ph2ent['mode'] == "tunnel6")):
+?>
+ <td class="listr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
+ <?=$spans;?>
+ <?=ipsec_idinfo_to_text($ph2ent['localid']); ?>
+ <?=$spane;?>
+ </td>
+ <td class="listr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
+ <?=$spans;?>
+ <?=ipsec_idinfo_to_text($ph2ent['remoteid']); ?>
+ <?=$spane;?>
+ </td>
+<?php
+ else:
+ echo "<td class=\"listr nowrap\">&nbsp;</td><td class=\"listr nowrap\">&nbsp;</td>";
+ endif;
+?>
+ <td class="listr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
+ <?=$spans;?>
+ <?php echo $p2_protos[$ph2ent['protocol']]; ?>
+ <?=$spane;?>
+ </td>
+ <td class="listr" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
+ <?=$spans;?>
+<?php
+ foreach ($ph2ent['encryption-algorithm-option'] as $k => $ph2ea) {
+ if ($k) {
+ echo ", ";
+ }
+ echo $p2_ealgos[$ph2ea['name']]['name'];
+ if ($ph2ea['keylen']) {
+ if ($ph2ea['keylen'] == "auto") {
+ echo " (" . gettext("auto") . ")";
+ } else {
+ echo " ({$ph2ea['keylen']} " . gettext("bits") . ")";
+ }
+ }
+ }
+?>
+ <?=$spane;?>
+ </td>
+ <td class="listr nowrap" id="<?=$fr_d;?>" onclick="fr_toggle('<?=$j;?>', '<?=$fr_prefix;?>')">
+ <?=$spans;?>
+<?php
+ if (!empty($ph2ent['hash-algorithm-option']) && is_array($ph2ent['hash-algorithm-option'])) {
+ foreach ($ph2ent['hash-algorithm-option'] as $k => $ph2ha) {
+ if ($k) {
+ echo ", ";
+ }
+ echo $p2_halgos[$ph2ha];
+ }
+ }
+?>
+ <?=$spane;?>
+ </td>
+ <td class="list nowrap" valign="middle">
+ <input onmouseover="fr_insline(<?=$j;?>, true, '<?=$fr_prefix;?>')" onmouseout="fr_insline(<?=$j;?>, false, '<?=$fr_prefix;?>')"
+ name="movep2_<?=$j;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif"
+ title="<?=gettext("move selected entries before this");?>"
+ type="image" style="height:17;width:17;border:0" />
+ <a href="vpn_ipsec_phase2.php?p2index=<?=$ph2ent['uniqid'];?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit phase2 entry"); ?>" width="17" height="17" border="0" alt="edit" />
+ </a>
+ <input name="delp2_<?=$ph2index;?>" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif"
+ title="<?=gettext("delete phase2 entry");?>"
+ type="image" style="height:17;width:17;border:0"
+ onclick="return confirm('<?=gettext("Do you really want to delete this phase2 entry?"); ?>')" />
+ <a href="vpn_ipsec_phase2.php?dup=<?=$ph2ent['uniqid'];?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new Phase 2 based on this one"); ?>" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+<?php
+ $j++;
+ endforeach;
+?>
+ <tr valign="top" id="<?=$fr_prefix . $j;?>">
+ <td class="list" colspan="8"></td>
+ <td class="list nowrap" valign="middle">
+<?php
+ if ($j == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected phase2 entries to end");?>" border="0" alt="move" />
+<?php
+ else:
+?>
+ <input onmouseover="fr_insline(<?=$j;?>, true, '<?=$fr_prefix;?>')" onmouseout="fr_insline(<?=$j;?>, false, '<?=$fr_prefix;?>')" name="movep2_<?=$j;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17;border:0" title="<?=gettext("move selected phase2 entries to end");?>" />
+<?php
+ endif;
+?>
+ <a href="vpn_ipsec_phase2.php?ikeid=<?=$ph1ent['ikeid'];?><?php if (isset($ph1ent['mobile'])) echo "&amp;mobile=true";?>">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add phase2 entry"); ?>" width="17" height="17" border="0" alt="add" />
+ </a>
+<?php
+ if ($j == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected phase2 entries");?>" border="0" alt="delete" />
+<?php
+ else:
+?>
+ <input name="delp2" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected phase2 entries");?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected phase2 entries?");?>')" />
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach; // $a_phase1 as $ph1ent
+?>
+ <tr valign="top" id="fr<?=$i;?>">
+ <td class="list" colspan="8"></td>
+ <td class="list nowrap" valign="middle">
+ <table border="0" cellspacing="0" cellpadding="1" summary="edit">
+ <tr>
+ <td>
+<?php
+ if ($i == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" title="<?=gettext("move selected phase1 entries to end");?>" border="0" alt="move" />
+<?php
+ else:
+?>
+ <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" style="width:17;height:17;border:0" title="<?=gettext("move selected phase1 entries to end");?>" />
+<?php
+ endif;
+?>
+ </td>
+ <td>
+ <a href="vpn_ipsec_phase1.php">
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add new phase1");?>" alt="add" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+<?php
+ if ($i == 0):
+?>
+ <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" title="<?=gettext("delete selected phase1 entries");?>" border="0" alt="delete" />
+<?php
+ else:
+?>
+ <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" style="width:17;height:17" title="<?=gettext("delete selected phase1 entries");?>" onclick="return confirm('<?=gettext("Do you really want to delete the selected phase1 entries?");?>')" />
+<?php
+ endif;
+?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="8">
+ <p>
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("Note"); ?>:<br /></strong>
+ </span>
+ <?=gettext("You can check your IPsec status at"); ?> <a href="diag_ipsec.php"><?=gettext("Status:IPsec"); ?></a>.<br />
+ <?=gettext("IPsec Debug Mode can be enabled at"); ?> <a href="vpn_ipsec_settings.php"><?=gettext("VPN:IPsec:Advanced Settings"); ?></a>.<br />
+ <?=gettext("IPsec can be set to prefer older SAs at"); ?> <a href="vpn_ipsec_settings.php"><?=gettext("VPN:IPsec:Advanced Settings"); ?></a>.
+ </span>
+ </p>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+function show_phase2(id, buttonid) {
+ document.getElementById(buttonid).innerHTML='';
+ document.getElementById(id).style.display = "block";
+ var visible = id + '-visible';
+ document.getElementById(visible).value = "1";
+}
+//]]>
+</script>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_ipsec_keys.php b/src/usr/local/www/vpn_ipsec_keys.php
new file mode 100644
index 0000000..8c30d6b
--- /dev/null
+++ b/src/usr/local/www/vpn_ipsec_keys.php
@@ -0,0 +1,230 @@
+<?php
+/*
+ vpn_ipsec_keys.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ part of pfSense
+
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-ipsec-listkeys
+##|*NAME=VPN: IPsec: Pre-Shared Keys List
+##|*DESCR=Allow access to the 'VPN: IPsec: Pre-Shared Keys List' page.
+##|*MATCH=vpn_ipsec_keys.php*
+##|-PRIV
+
+require("functions.inc");
+require("guiconfig.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+require_once("filter.inc");
+
+if (!is_array($config['ipsec']['mobilekey'])) {
+ $config['ipsec']['mobilekey'] = array();
+}
+ipsec_mobilekey_sort();
+$a_secret = &$config['ipsec']['mobilekey'];
+
+$userkeys = array();
+foreach ($config['system']['user'] as $id => $user) {
+ if (!empty($user['ipsecpsk'])) {
+ $userkeys[] = array('ident' => $user['name'], 'type' => 'PSK', 'pre-shared-key' => $user['ipsecpsk'], 'id' => $id);;
+ }
+}
+
+if (isset($_POST['apply'])) {
+ $retval = vpn_ipsec_configure();
+ /* reload the filter in the background */
+ filter_configure();
+ $savemsg = get_std_save_message($retval);
+ if (is_subsystem_dirty('ipsec')) {
+ clear_subsystem_dirty('ipsec');
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_secret[$_GET['id']]) {
+ unset($a_secret[$_GET['id']]);
+ write_config(gettext("Deleted IPsec Pre-Shared Key"));
+ mark_subsystem_dirty('ipsec');
+ header("Location: vpn_ipsec_keys.php");
+ exit;
+ }
+}
+
+$pgtitle = gettext("VPN: IPsec: Keys");
+$shortcut_section = "ipsec";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="vpn_ipsec_keys.php" method="post">
+<?php
+if ($savemsg) {
+ print_info_box($savemsg);
+}
+if (is_subsystem_dirty('ipsec')) {
+ print_info_box_np(gettext("The IPsec tunnel configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+}
+?>
+</form>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec keys">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Tunnels"), false, "vpn_ipsec.php");
+ $tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
+ $tab_array[2] = array(gettext("Pre-Shared Keys"), true, "vpn_ipsec_keys.php");
+ $tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
+ <tr>
+ <td class="listhdrr"><?=gettext("Identifier"); ?></td>
+ <td class="listhdrr"><?=gettext("Type"); ?></td>
+ <td class="listhdr"><?=gettext("Pre-Shared Key"); ?></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add key">
+ <tr>
+ <td width="20" height="17"></td>
+ <td>
+ <a href="vpn_ipsec_keys_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add key"); ?>" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($userkeys as $secretent):
+?>
+ <tr>
+ <td class="listlr gray">
+ <?php
+ if ($secretent['ident'] == 'allusers') {
+ echo gettext("ANY USER");
+ } else {
+ echo htmlspecialchars($secretent['ident']);
+ }
+ ?>
+ </td>
+ <td class="listlr gray">
+ <?php
+ if (empty($secretent['type'])) {
+ echo 'PSK';
+ } else {
+ echo htmlspecialchars($secretent['type']);
+ }
+ ?>
+ </td>
+ <td class="listr gray">
+ <?=htmlspecialchars($secretent['pre-shared-key']);?>
+ </td>
+ <td class="list nowrap">
+ <form action="system_usermanager.php" method="post" name="form_edit_key">
+ <input type="hidden" name="act" value="edit" />
+ <input type="hidden" name="userid" value="<?=$secretent['id'];?>" />
+ <input type="image" name="edituser[]" width="17" height="17" border="0"
+ src="/themes/<?=$g['theme'];?>/images/icons/icon_e.gif"
+ title="<?=gettext("edit");?>" />
+ </form>
+ &nbsp;
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+
+<?php
+ $i = 0;
+ foreach ($a_secret as $secretent):
+?>
+ <tr>
+ <td class="listlr">
+ <?=htmlspecialchars($secretent['ident']);?>
+ </td>
+ <td class="listlr">
+ <?php
+ if (empty($secretent['type'])) {
+ echo 'PSK';
+ } else {
+ echo htmlspecialchars($secretent['type']);
+ }
+ ?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($secretent['pre-shared-key']);?>
+ </td>
+ <td class="list nowrap"><a href="vpn_ipsec_keys_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit key"); ?>" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="vpn_ipsec_keys.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this Pre-Shared Key?"); ?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete key"); ?>" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add key">
+ <tr>
+ <td width="20" height="17"></td>
+ <td>
+ <a href="vpn_ipsec_keys_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add key"); ?>" width="17" height="17" border="0" alt="add" /></a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="4">
+ <p>
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("Note"); ?>:<br /></strong>
+ </span>
+ <?=gettext("PSK for any user can be set by using an identifier of any/ANY");?>
+ </span>
+ </p>
+ </td>
+ </tr>
+</table>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_ipsec_keys_edit.php b/src/usr/local/www/vpn_ipsec_keys_edit.php
new file mode 100644
index 0000000..6419a6b
--- /dev/null
+++ b/src/usr/local/www/vpn_ipsec_keys_edit.php
@@ -0,0 +1,199 @@
+<?php
+/*
+ vpn_ipsec_keys_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ part of pfSense
+
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-ipsec-editkeys
+##|*NAME=VPN: IPsec: Edit Pre-Shared Keys
+##|*DESCR=Allow access to the 'VPN: IPsec: Edit Pre-Shared Keys' page.
+##|*MATCH=vpn_ipsec_keys_edit.php*
+##|-PRIV
+
+require("functions.inc");
+require("guiconfig.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+
+if (!is_array($config['ipsec']['mobilekey'])) {
+ $config['ipsec']['mobilekey'] = array();
+}
+ipsec_mobilekey_sort();
+$a_secret = &$config['ipsec']['mobilekey'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_secret[$id]) {
+ $pconfig['ident'] = $a_secret[$id]['ident'];
+ $pconfig['type'] = $a_secret[$id]['type'];
+ $pconfig['psk'] = $a_secret[$id]['pre-shared-key'];
+}
+
+if ($_POST) {
+ $userids = array();
+ foreach ($config['system']['user'] as $uid => $user) {
+ $userids[$user['name']] = $uid;
+ }
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ $reqdfields = explode(" ", "ident psk");
+ $reqdfieldsn = array(gettext("Identifier"), gettext("Pre-Shared Key"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (preg_match("/[^a-zA-Z0-9@\.\-]/", $_POST['ident'])) {
+ $input_errors[] = gettext("The identifier contains invalid characters.");
+ }
+
+ if (array_key_exists($_POST['ident'], $userids)) {
+ $input_errors[] = gettext("A user with this name already exists. Add the key to the user instead.");
+ }
+ unset($userids);
+
+ if (isset($_POST['psk']) && !preg_match('/^[[:ascii:]]*$/', $_POST['psk'])) {
+ $input_errors[] = gettext("Pre-Shared Key contains invalid characters.");
+ }
+
+ if (!$input_errors && !(isset($id) && $a_secret[$id])) {
+ /* make sure there are no dupes */
+ foreach ($a_secret as $secretent) {
+ if ($secretent['ident'] == $_POST['ident']) {
+ $input_errors[] = gettext("Another entry with the same identifier already exists.");
+ break;
+ }
+ }
+ }
+
+ if (!$input_errors) {
+
+ if (isset($id) && $a_secret[$id]) {
+ $secretent = $a_secret[$id];
+ }
+
+ $secretent['ident'] = $_POST['ident'];
+ $secretent['type'] = $_POST['type'];
+ $secretent['pre-shared-key'] = $_POST['psk'];
+ $text = "";
+
+ if (isset($id) && $a_secret[$id]) {
+ $a_secret[$id] = $secretent;
+ $text = gettext("Edited");
+ } else {
+ $a_secret[] = $secretent;
+ $text = gettext("Added");
+ }
+
+ write_config("{$text} IPsec Pre-Shared Keys");
+ mark_subsystem_dirty('ipsec');
+
+ header("Location: vpn_ipsec_keys.php");
+ exit;
+ }
+}
+
+$pgtitle = gettext("VPN: IPsec: Edit Pre-Shared Key");
+$shortcut_section = "ipsec";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<form action="vpn_ipsec_keys_edit.php" method="post" name="iform" id="iform">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="vpn ipsec keys edit">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic">Edit pre-shared secret</td>
+ </tr>
+ <tr>
+ <td valign="top" class="vncellreq"><?=gettext("Identifier"); ?></td>
+ <td class="vtable">
+ <?=$mandfldhtml;?><input name="ident" type="text" class="formfld unknown" id="ident" size="30" value="<?=htmlspecialchars($pconfig['ident']);?>" />
+ <br />
+ <?=gettext("This can be either an IP address, fully qualified domain name or an e-mail address"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Secret type"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="type" class="formselect">
+ <?php
+ foreach ($ipsec_preshared_key_type as $value => $descr) {
+ echo "<option value='{$value}' ";
+ if ($pconfig['type'] == $value) {
+ echo "selected=\"selected\"";
+ }
+ echo ">{$descr}</option>";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Pre-Shared Key"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="psk" type="text" class="formfld unknown" id="psk" size="40" value="<?=htmlspecialchars($pconfig['psk']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <?php if (isset($id) && $a_secret[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="4">
+ <p>
+ <span class="vexpl">
+ <span class="red">
+ <strong><?=gettext("Note"); ?>:<br /></strong>
+ </span>
+ <?=gettext("PSK for any user can be set by using an identifier of any/ANY");?>
+ </span>
+ </p>
+ </td>
+ </tr>
+ </table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_ipsec_mobile.php b/src/usr/local/www/vpn_ipsec_mobile.php
new file mode 100644
index 0000000..bb1ef75
--- /dev/null
+++ b/src/usr/local/www/vpn_ipsec_mobile.php
@@ -0,0 +1,740 @@
+<?php
+/*
+ vpn_ipsec_mobile.php
+
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-ipsec-mobile
+##|*NAME=VPN: IPsec: Mobile page
+##|*DESCR=Allow access to the 'VPN: IPsec: Mobile' page.
+##|*MATCH=vpn_ipsec_mobile.php*
+##|-PRIV
+
+require("functions.inc");
+require("guiconfig.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+require_once("filter.inc");
+
+if (!is_array($config['ipsec']['phase1'])) {
+ $config['ipsec']['phase1'] = array();
+}
+
+$a_phase1 = &$config['ipsec']['phase1'];
+
+if (!is_array($config['ipsec']['client'])) {
+ $config['ipsec']['client'] = array();
+}
+
+$a_client = &$config['ipsec']['client'];
+
+if (count($a_client)) {
+
+ $pconfig['enable'] = $a_client['enable'];
+
+ $pconfig['user_source'] = $a_client['user_source'];
+ $pconfig['group_source'] = $a_client['group_source'];
+
+ $pconfig['pool_address'] = $a_client['pool_address'];
+ $pconfig['pool_netbits'] = $a_client['pool_netbits'];
+ $pconfig['net_list'] = $a_client['net_list'];
+ $pconfig['save_passwd'] = $a_client['save_passwd'];
+ $pconfig['dns_domain'] = $a_client['dns_domain'];
+ $pconfig['dns_split'] = $a_client['dns_split'];
+ $pconfig['dns_server1'] = $a_client['dns_server1'];
+ $pconfig['dns_server2'] = $a_client['dns_server2'];
+ $pconfig['dns_server3'] = $a_client['dns_server3'];
+ $pconfig['dns_server4'] = $a_client['dns_server4'];
+ $pconfig['wins_server1'] = $a_client['wins_server1'];
+ $pconfig['wins_server2'] = $a_client['wins_server2'];
+ $pconfig['pfs_group'] = $a_client['pfs_group'];
+ $pconfig['login_banner'] = $a_client['login_banner'];
+
+ if (isset($pconfig['enable'])) {
+ $pconfig['enable'] = true;
+ }
+
+ if ($pconfig['pool_address']&&$pconfig['pool_netbits']) {
+ $pconfig['pool_enable'] = true;
+ } else {
+ $pconfig['pool_netbits'] = 24;
+ }
+
+ if (isset($pconfig['net_list'])) {
+ $pconfig['net_list_enable'] = true;
+ }
+
+ if (isset($pconfig['save_passwd'])) {
+ $pconfig['save_passwd_enable'] = true;
+ }
+
+ if ($pconfig['dns_domain']) {
+ $pconfig['dns_domain_enable'] = true;
+ }
+
+ if ($pconfig['dns_split']) {
+ $pconfig['dns_split_enable'] = true;
+ }
+
+ if ($pconfig['dns_server1']||$pconfig['dns_server2']||$pconfig['dns_server3']||$pconfig['dns_server4']) {
+ $pconfig['dns_server_enable'] = true;
+ }
+
+ if ($pconfig['wins_server1']||$pconfig['wins_server2']) {
+ $pconfig['wins_server_enable'] = true;
+ }
+
+ if (isset($pconfig['pfs_group'])) {
+ $pconfig['pfs_group_enable'] = true;
+ }
+
+ if ($pconfig['login_banner']) {
+ $pconfig['login_banner_enable'] = true;
+ }
+}
+
+if ($_POST['create']) {
+ header("Location: vpn_ipsec_phase1.php?mobile=true");
+}
+
+if ($_POST['apply']) {
+ $retval = 0;
+ /* NOTE: #4353 Always restart ipsec when mobile clients settings change */
+ $retval = vpn_ipsec_configure(true);
+ $savemsg = get_std_save_message($retval);
+ if ($retval >= 0) {
+ if (is_subsystem_dirty('ipsec')) {
+ clear_subsystem_dirty('ipsec');
+ }
+ }
+}
+
+if ($_POST['submit']) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input consolidation */
+
+ /* input validation */
+
+ $reqdfields = explode(" ", "user_source group_source");
+ $reqdfieldsn = array(gettext("User Authentication Source"), gettext("Group Authentication Source"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if ($pconfig['pool_enable']) {
+ if (!is_ipaddr($pconfig['pool_address'])) {
+ $input_errors[] = gettext("A valid IP address for 'Virtual Address Pool Network' must be specified.");
+ }
+ }
+ if ($pconfig['dns_domain_enable']) {
+ if (!is_domain($pconfig['dns_domain'])) {
+ $input_errors[] = gettext("A valid value for 'DNS Default Domain' must be specified.");
+ }
+ }
+ if ($pconfig['dns_split_enable']) {
+ if (!empty($pconfig['dns_split'])) {
+ /* Replace multiple spaces by single */
+ $pconfig['dns_split'] = preg_replace('/\s+/', ' ', trim($pconfig['dns_split']));
+ $domain_array = explode(' ', $pconfig['dns_split']);
+ foreach ($domain_array as $curdomain) {
+ if (!is_domain($curdomain)) {
+ $input_errors[] = gettext("A valid split DNS domain list must be specified.");
+ break;
+ }
+ }
+ }
+ }
+
+ if ($pconfig['dns_server_enable']) {
+ if (!$pconfig['dns_server1'] && !$pconfig['dns_server2'] &&
+ !$pconfig['dns_server3'] && !$pconfig['dns_server4']) {
+ $input_errors[] = gettext("At least one DNS server must be specified to enable the DNS Server option.");
+ }
+ if ($pconfig['dns_server1'] && !is_ipaddr($pconfig['dns_server1'])) {
+ $input_errors[] = gettext("A valid IP address for 'DNS Server #1' must be specified.");
+ }
+ if ($pconfig['dns_server2'] && !is_ipaddr($pconfig['dns_server2'])) {
+ $input_errors[] = gettext("A valid IP address for 'DNS Server #2' must be specified.");
+ }
+ if ($pconfig['dns_server3'] && !is_ipaddr($pconfig['dns_server3'])) {
+ $input_errors[] = gettext("A valid IP address for 'DNS Server #3' must be specified.");
+ }
+ if ($pconfig['dns_server4'] && !is_ipaddr($pconfig['dns_server4'])) {
+ $input_errors[] = gettext("A valid IP address for 'DNS Server #4' must be specified.");
+ }
+ }
+
+ if ($pconfig['wins_server_enable']) {
+ if (!$pconfig['wins_server1'] && !$pconfig['wins_server2']) {
+ $input_errors[] = gettext("At least one WINS server must be specified to enable the DNS Server option.");
+ }
+ if ($pconfig['wins_server1'] && !is_ipaddr($pconfig['wins_server1'])) {
+ $input_errors[] = gettext("A valid IP address for 'WINS Server #1' must be specified.");
+ }
+ if ($pconfig['wins_server2'] && !is_ipaddr($pconfig['wins_server2'])) {
+ $input_errors[] = gettext("A valid IP address for 'WINS Server #2' must be specified.");
+ }
+ }
+
+ if ($pconfig['login_banner_enable']) {
+ if (!strlen($pconfig['login_banner'])) {
+ $input_errors[] = gettext("A valid value for 'Login Banner' must be specified.");
+ }
+ }
+
+ if (!$input_errors) {
+ $client = array();
+
+ if ($pconfig['enable']) {
+ $client['enable'] = true;
+ }
+
+ if (!empty($pconfig['user_source'])) {
+ $client['user_source'] = implode(",", $pconfig['user_source']);
+ }
+ $client['group_source'] = $pconfig['group_source'];
+
+ if ($pconfig['pool_enable']) {
+ $client['pool_address'] = $pconfig['pool_address'];
+ $client['pool_netbits'] = $pconfig['pool_netbits'];
+ }
+
+ if ($pconfig['net_list_enable']) {
+ $client['net_list'] = true;
+ }
+
+ if ($pconfig['save_passwd_enable']) {
+ $client['save_passwd'] = true;
+ }
+
+ if ($pconfig['dns_domain_enable']) {
+ $client['dns_domain'] = $pconfig['dns_domain'];
+ }
+
+ if ($pconfig['dns_split_enable']) {
+ $client['dns_split'] = $pconfig['dns_split'];
+ }
+
+ if ($pconfig['dns_server_enable']) {
+ $client['dns_server1'] = $pconfig['dns_server1'];
+ $client['dns_server2'] = $pconfig['dns_server2'];
+ $client['dns_server3'] = $pconfig['dns_server3'];
+ $client['dns_server4'] = $pconfig['dns_server4'];
+ }
+
+ if ($pconfig['wins_server_enable']) {
+ $client['wins_server1'] = $pconfig['wins_server1'];
+ $client['wins_server2'] = $pconfig['wins_server2'];
+ }
+
+ if ($pconfig['pfs_group_enable']) {
+ $client['pfs_group'] = $pconfig['pfs_group'];
+ }
+
+ if ($pconfig['login_banner_enable']) {
+ $client['login_banner'] = $pconfig['login_banner'];
+ }
+
+ $a_client = $client;
+
+ write_config();
+ mark_subsystem_dirty('ipsec');
+
+ header("Location: vpn_ipsec_mobile.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("VPN"), gettext("IPsec"), gettext("Mobile"));
+$shortcut_section = "ipsec";
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+
+function pool_change() {
+
+ if (document.iform.pool_enable.checked) {
+ document.iform.pool_address.disabled = 0;
+ document.iform.pool_netbits.disabled = 0;
+ } else {
+ document.iform.pool_address.disabled = 1;
+ document.iform.pool_netbits.disabled = 1;
+ }
+}
+
+function dns_domain_change() {
+
+ if (document.iform.dns_domain_enable.checked) {
+ document.iform.dns_domain.disabled = 0;
+ } else {
+ document.iform.dns_domain.disabled = 1;
+ }
+}
+
+function dns_split_change() {
+
+ if (document.iform.dns_split_enable.checked) {
+ document.iform.dns_split.disabled = 0;
+ } else {
+ document.iform.dns_split.disabled = 1;
+ }
+}
+
+function dns_server_change() {
+
+ if (document.iform.dns_server_enable.checked) {
+ document.iform.dns_server1.disabled = 0;
+ document.iform.dns_server2.disabled = 0;
+ document.iform.dns_server3.disabled = 0;
+ document.iform.dns_server4.disabled = 0;
+ } else {
+ document.iform.dns_server1.disabled = 1;
+ document.iform.dns_server2.disabled = 1;
+ document.iform.dns_server3.disabled = 1;
+ document.iform.dns_server4.disabled = 1;
+ }
+}
+
+function wins_server_change() {
+
+ if (document.iform.wins_server_enable.checked) {
+ document.iform.wins_server1.disabled = 0;
+ document.iform.wins_server2.disabled = 0;
+ } else {
+ document.iform.wins_server1.disabled = 1;
+ document.iform.wins_server2.disabled = 1;
+ }
+}
+
+function pfs_group_change() {
+
+ if (document.iform.pfs_group_enable.checked) {
+ document.iform.pfs_group.disabled = 0;
+ } else {
+ document.iform.pfs_group.disabled = 1;
+ }
+}
+
+function login_banner_change() {
+
+ if (document.iform.login_banner_enable.checked) {
+ document.iform.login_banner.disabled = 0;
+ } else {
+ document.iform.login_banner.disabled = 1;
+ }
+}
+
+//]]>
+</script>
+
+<form action="vpn_ipsec_mobile.php" method="post" name="iform" id="iform">
+
+<?php
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+ if (isset($config['ipsec']['enable']) && is_subsystem_dirty('ipsec')) {
+ print_info_box_np(gettext("The IPsec tunnel configuration has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));
+ }
+ foreach ($a_phase1 as $ph1ent) {
+ if (isset($ph1ent['mobile'])) {
+ $ph1found = true;
+ }
+ }
+ if ($pconfig['enable'] && !$ph1found) {
+ print_info_box_np(gettext("Support for IPsec Mobile clients is enabled but a Phase1 definition was not found") . ".<br />" . gettext("Please click Create to define one."), gettext("create"), gettext("Create Phase1"));
+ }
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec mobile">
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Tunnels"), false, "vpn_ipsec.php");
+ $tab_array[1] = array(gettext("Mobile clients"), true, "vpn_ipsec_mobile.php");
+ $tab_array[2] = array(gettext("Pre-Shared Key"), false, "vpn_ipsec_keys.php");
+ $tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("IKE Extensions"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="ike extensions">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['enable'], $chk); ?>
+ <input name="enable" type="checkbox" id="enable" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <strong><?=gettext("Enable IPsec Mobile Client Support"); ?></strong>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic">
+ <?=gettext("Extended Authentication (Xauth)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("User Authentication"); ?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("Source"); ?>:&nbsp;&nbsp;
+ <select name="user_source[]" class="formselect" id="user_source" multiple="multiple" size="3">
+ <?php
+ $authmodes = explode(",", $pconfig['user_source']);
+ $auth_servers = auth_get_authserver_list();
+ foreach ($auth_servers as $auth_server) {
+ $selected = "";
+ if (in_array($auth_server['name'], $authmodes)) {
+ $selected = "selected=\"selected\"";
+ }
+ echo "<option value='{$auth_server['name']}' {$selected}>{$auth_server['name']}</option>\n";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Group Authentication"); ?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("Source"); ?>:&nbsp;&nbsp;
+ <select name="group_source" class="formselect" id="group_source">
+ <option value="none"><?=gettext("none"); ?></option>
+ <option value="system" <?php if ($pconfig['group_source'] == "system") echo "selected=\"selected\""; ?> ><?=gettext("system"); ?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic">
+ <?=gettext("Client Configuration (mode-cfg)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Virtual Address Pool"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="enable pool">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['pool_enable'], $chk); ?>
+ <input name="pool_enable" type="checkbox" id="pool_enable" value="yes" <?=$chk;?> onclick="pool_change()" />
+ </td>
+ <td>
+ <?=gettext("Provide a virtual IP address to clients"); ?><br />
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="2" cellpadding="0" summary="virtual address pool">
+ <tr>
+ <td>
+ <?=gettext("Network"); ?>:&nbsp;
+ <input name="pool_address" type="text" class="formfld unknown" id="pool_address" size="20" value="<?=htmlspecialchars($pconfig['pool_address']);?>" />
+ /
+ <select name="pool_netbits" class="formselect" id="pool_netbits">
+ <?php for ($i = 32; $i >= 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if ($i == $pconfig['pool_netbits']) echo "selected=\"selected\""; ?>>
+ <?=$i;?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Network List"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="network list">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['net_list_enable'], $chk); ?>
+ <input name="net_list_enable" type="checkbox" id="net_list_enable" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <?=gettext("Provide a list of accessible networks to clients"); ?><br />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Save Xauth Password"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="password">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['save_passwd_enable'], $chk); ?>
+ <input name="save_passwd_enable" type="checkbox" id="save_passwd_enable" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <?=gettext("Allow clients to save Xauth passwords (Cisco VPN client only)."); ?><br />
+ <?=gettext("NOTE: With iPhone clients, this does not work when deployed via the iPhone configuration utility, only by manual entry."); ?><br />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS Default Domain"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="enable dns default domain">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['dns_domain_enable'], $chk); ?>
+ <input name="dns_domain_enable" type="checkbox" id="dns_domain_enable" value="yes" <?=$chk;?> onclick="dns_domain_change()" />
+ </td>
+ <td>
+ <?=gettext("Provide a default domain name to clients"); ?><br />
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="2" cellpadding="0" summary="dns default domain">
+ <tr>
+ <td>
+ <input name="dns_domain" type="text" class="formfld unknown" id="dns_domain" size="30" value="<?=htmlspecialchars($pconfig['dns_domain']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Split DNS"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="enable split dns">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['dns_split_enable'], $chk); ?>
+ <input name="dns_split_enable" type="checkbox" id="dns_split_enable" value="yes" <?=$chk;?> onclick="dns_split_change()" />
+ </td>
+ <td>
+ <?=gettext("Provide a list of split DNS domain names to clients. Enter a space separated list."); ?><br />
+ <?=gettext("NOTE: If left blank, and a default domain is set, it will be used for this value."); ?>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="2" cellpadding="0" summary="split dns">
+ <tr>
+ <td>
+ <input name="dns_split" type="text" class="formfld unknown" id="dns_split" size="30" value="<?=htmlspecialchars($pconfig['dns_split']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="enable dns servers">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['dns_server_enable'], $chk); ?>
+ <input name="dns_server_enable" type="checkbox" id="dns_server_enable" value="yes" <?=$chk;?> onclick="dns_server_change()" />
+ </td>
+ <td>
+ <?=gettext("Provide a DNS server list to clients"); ?><br />
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="2" cellpadding="0" summary="dns servers">
+ <tr>
+ <td>
+ <?=gettext("Server"); ?> #1:&nbsp;
+ <input name="dns_server1" type="text" class="formfld unknown" id="dns_server1" size="20" value="<?=htmlspecialchars($pconfig['dns_server1']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <?=gettext("Server"); ?> #2:&nbsp;
+ <input name="dns_server2" type="text" class="formfld unknown" id="dns_server2" size="20" value="<?=htmlspecialchars($pconfig['dns_server2']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <?=gettext("Server"); ?> #3:&nbsp;
+ <input name="dns_server3" type="text" class="formfld unknown" id="dns_server3" size="20" value="<?=htmlspecialchars($pconfig['dns_server3']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <?=gettext("Server"); ?> #4:&nbsp;
+ <input name="dns_server4" type="text" class="formfld unknown" id="dns_server4" size="20" value="<?=htmlspecialchars($pconfig['dns_server4']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("WINS Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="enable wins servers">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['wins_server_enable'], $chk); ?>
+ <input name="wins_server_enable" type="checkbox" id="wins_server_enable" value="yes" <?=$chk;?> onclick="wins_server_change()" />
+ </td>
+ <td>
+ <?=gettext("Provide a WINS server list to clients"); ?><br />
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="2" cellpadding="0" summary="wins servers">
+ <tr>
+ <td>
+ <?=gettext("Server"); ?> #1:&nbsp;
+ <input name="wins_server1" type="text" class="formfld unknown" id="wins_server1" size="20" value="<?=htmlspecialchars($pconfig['wins_server1']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <?=gettext("Server"); ?> #2:&nbsp;
+ <input name="wins_server2" type="text" class="formfld unknown" id="wins_server2" size="20" value="<?=htmlspecialchars($pconfig['wins_server2']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Phase2 PFS Group"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="enable pfs group">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['pfs_group_enable'], $chk); ?>
+ <input name="pfs_group_enable" type="checkbox" id="pfs_group_enable" value="yes" <?=$chk;?> onclick="pfs_group_change()" />
+ </td>
+ <td>
+ <?=gettext("Provide the Phase2 PFS group to clients ( overrides all mobile phase2 settings )"); ?><br />
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="2" cellpadding="0" summary="phase-2 pfs group">
+ <tr>
+ <td>
+ <?=gettext("Group"); ?>:&nbsp;&nbsp;
+ <select name="pfs_group" class="formselect" id="pfs_group">
+ <?php foreach ($p2_pfskeygroups as $keygroup => $keygroupname): ?>
+ <option value="<?=$keygroup;?>" <?php if ($pconfig['pfs_group'] == $keygroup) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($keygroupname);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Login Banner"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="2" cellpadding="0" summary="enable login banner">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['login_banner_enable'], $chk); ?>
+ <input name="login_banner_enable" type="checkbox" id="login_banner_enable" value="yes" <?=$chk;?> onclick="login_banner_change()" />
+ </td>
+ <td>
+ <?=gettext("Provide a login banner to clients"); ?><br />
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellspacing="2" cellpadding="0" summary="banner">
+ <tr>
+ <td>
+ <?php $banner = htmlspecialchars($pconfig['login_banner']); ?>
+ <textarea name="login_banner" cols="65" rows="7" id="login_banner" class="formpre"><?=htmlspecialchars($banner);?></textarea>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+pool_change();
+dns_domain_change();
+dns_split_change();
+dns_server_change();
+wins_server_change();
+pfs_group_change();
+login_banner_change();
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
+
+<?php
+
+/* local utility functions */
+
+function set_checked($var,& $chk) {
+ if ($var) {
+ $chk = "checked=\"checked\"";
+ } else {
+ $chk = "";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/vpn_ipsec_phase1.php b/src/usr/local/www/vpn_ipsec_phase1.php
new file mode 100644
index 0000000..11a2e90
--- /dev/null
+++ b/src/usr/local/www/vpn_ipsec_phase1.php
@@ -0,0 +1,1092 @@
+<?php
+/*
+ vpn_ipsec_phase1.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2014 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-ipsec-editphase1
+##|*NAME=VPN: IPsec: Edit Phase 1 page
+##|*DESCR=Allow access to the 'VPN: IPsec: Edit Phase 1' page.
+##|*MATCH=vpn_ipsec_phase1.php*
+##|-PRIV
+
+require("functions.inc");
+require("guiconfig.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+require_once("filter.inc");
+
+if (!is_array($config['ipsec']['phase1'])) {
+ $config['ipsec']['phase1'] = array();
+}
+
+if (!is_array($config['ipsec']['phase2'])) {
+ $config['ipsec']['phase2'] = array();
+}
+
+$a_phase1 = &$config['ipsec']['phase1'];
+$a_phase2 = &$config['ipsec']['phase2'];
+
+if (is_numericint($_GET['p1index'])) {
+ $p1index = $_GET['p1index'];
+}
+if (isset($_POST['p1index']) && is_numericint($_POST['p1index'])) {
+ $p1index = $_POST['p1index'];
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ $p1index = $_GET['dup'];
+}
+
+if (isset($p1index) && $a_phase1[$p1index]) {
+ // don't copy the ikeid on dup
+ if (!isset($_GET['dup']) || !is_numericint($_GET['dup'])) {
+ $pconfig['ikeid'] = $a_phase1[$p1index]['ikeid'];
+ }
+
+ $old_ph1ent = $a_phase1[$p1index];
+
+ $pconfig['disabled'] = isset($a_phase1[$p1index]['disabled']);
+
+ if ($a_phase1[$p1index]['interface']) {
+ $pconfig['interface'] = $a_phase1[$p1index]['interface'];
+ } else {
+ $pconfig['interface'] = "wan";
+ }
+
+ list($pconfig['remotenet'], $pconfig['remotebits']) = explode("/", $a_phase1[$p1index]['remote-subnet']);
+
+ if (isset($a_phase1[$p1index]['mobile'])) {
+ $pconfig['mobile'] = 'true';
+ } else {
+ $pconfig['remotegw'] = $a_phase1[$p1index]['remote-gateway'];
+ }
+
+ if (empty($a_phase1[$p1index]['iketype'])) {
+ $pconfig['iketype'] = "ikev1";
+ } else {
+ $pconfig['iketype'] = $a_phase1[$p1index]['iketype'];
+ }
+ $pconfig['mode'] = $a_phase1[$p1index]['mode'];
+ $pconfig['protocol'] = $a_phase1[$p1index]['protocol'];
+ $pconfig['myid_type'] = $a_phase1[$p1index]['myid_type'];
+ $pconfig['myid_data'] = $a_phase1[$p1index]['myid_data'];
+ $pconfig['peerid_type'] = $a_phase1[$p1index]['peerid_type'];
+ $pconfig['peerid_data'] = $a_phase1[$p1index]['peerid_data'];
+ $pconfig['ealgo'] = $a_phase1[$p1index]['encryption-algorithm'];
+ $pconfig['halgo'] = $a_phase1[$p1index]['hash-algorithm'];
+ $pconfig['dhgroup'] = $a_phase1[$p1index]['dhgroup'];
+ $pconfig['lifetime'] = $a_phase1[$p1index]['lifetime'];
+ $pconfig['authentication_method'] = $a_phase1[$p1index]['authentication_method'];
+
+ if (($pconfig['authentication_method'] == "pre_shared_key") ||
+ ($pconfig['authentication_method'] == "xauth_psk_server")) {
+ $pconfig['pskey'] = $a_phase1[$p1index]['pre-shared-key'];
+ } else {
+ $pconfig['certref'] = $a_phase1[$p1index]['certref'];
+ $pconfig['caref'] = $a_phase1[$p1index]['caref'];
+ }
+
+ $pconfig['descr'] = $a_phase1[$p1index]['descr'];
+ $pconfig['nat_traversal'] = $a_phase1[$p1index]['nat_traversal'];
+ $pconfig['mobike'] = $a_phase1[$p1index]['mobike'];
+
+ if (isset($a_phase1[$p1index]['reauth_enable'])) {
+ $pconfig['reauth_enable'] = true;
+ }
+ if (isset($a_phase1[$p1index]['rekey_enable'])) {
+ $pconfig['rekey_enable'] = true;
+ }
+ if (isset($a_phase1[$p1index]['responderonly'])) {
+ $pconfig['responderonly'] = true;
+ }
+
+ if ($a_phase1[$p1index]['dpd_delay'] && $a_phase1[$p1index]['dpd_maxfail']) {
+ $pconfig['dpd_enable'] = true;
+ $pconfig['dpd_delay'] = $a_phase1[$p1index]['dpd_delay'];
+ $pconfig['dpd_maxfail'] = $a_phase1[$p1index]['dpd_maxfail'];
+ }
+} else {
+ /* defaults */
+ $pconfig['interface'] = "wan";
+ if ($config['interfaces']['lan']) {
+ $pconfig['localnet'] = "lan";
+ }
+ $pconfig['mode'] = "main";
+ $pconfig['protocol'] = "inet";
+ $pconfig['myid_type'] = "myaddress";
+ $pconfig['peerid_type'] = "peeraddress";
+ $pconfig['authentication_method'] = "pre_shared_key";
+ $pconfig['ealgo'] = array(name => "aes");
+ $pconfig['halgo'] = "sha1";
+ $pconfig['dhgroup'] = "2";
+ $pconfig['lifetime'] = "28800";
+ $pconfig['nat_traversal'] = 'on';
+ $pconfig['mobike'] = 'off';
+ $pconfig['dpd_enable'] = true;
+ $pconfig['iketype'] = "ikev1";
+
+ /* mobile client */
+ if ($_GET['mobile']) {
+ $pconfig['mobile'] = true;
+ $pconfig['mode'] = "aggressive";
+ }
+}
+
+if (isset($_GET['dup']) && is_numericint($_GET['dup'])) {
+ unset($p1index);
+}
+
+if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+
+ $method = $pconfig['authentication_method'];
+ // Unset ca and cert if not required to avoid storing in config
+ if ($method == "pre_shared_key" || $method == "xauth_psk_server") {
+ unset($pconfig['caref']);
+ unset($pconfig['certref']);
+ }
+
+ // Only require PSK here for normal PSK tunnels (not mobile) or xauth.
+ // For RSA methods, require the CA/Cert.
+ switch ($method) {
+ case 'eap-mschapv2':
+ if ($pconfig['iketype'] != 'ikev2') {
+ $input_errors[] = gettext("EAP-MSChapv2 can only be used with IKEv2 type VPNs.");
+ }
+ break;
+ case "eap-tls":
+ if ($pconfig['iketype'] != 'ikev2') {
+ $input_errors[] = gettext("EAP-TLS can only be used with IKEv2 type VPNs.");
+ }
+ break;
+ case "eap-radius":
+ if ($pconfig['iketype'] != 'ikev2') {
+ $input_errors[] = gettext("EAP-RADIUS can only be used with IKEv2 type VPNs.");
+ }
+ break;
+ case "pre_shared_key":
+ // If this is a mobile PSK tunnel the user PSKs go on
+ // the PSK tab, not here, so skip the check.
+ if ($pconfig['mobile']) {
+ break;
+ }
+ case "xauth_psk_server":
+ $reqdfields = explode(" ", "pskey");
+ $reqdfieldsn = array(gettext("Pre-Shared Key"));
+ $validate_pskey = true;
+ break;
+ case "hybrid_rsa_server":
+ case "xauth_rsa_server":
+ case "rsasig":
+ $reqdfields = explode(" ", "caref certref");
+ $reqdfieldsn = array(gettext("Certificate Authority"), gettext("Certificate"));
+ break;
+ }
+ if (!$pconfig['mobile']) {
+ $reqdfields[] = "remotegw";
+ $reqdfieldsn[] = gettext("Remote gateway");
+ }
+
+ do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (isset($validate_pskey) && isset($pconfig['pskey']) && !preg_match('/^[[:ascii:]]*$/', $pconfig['pskey'])) {
+ unset($validate_pskey);
+ $input_errors[] = gettext("Pre-Shared Key contains invalid characters.");
+ }
+
+ if (($pconfig['lifetime'] && !is_numeric($pconfig['lifetime']))) {
+ $input_errors[] = gettext("The P1 lifetime must be an integer.");
+ }
+
+ if ($pconfig['remotegw']) {
+ if (!is_ipaddr($pconfig['remotegw']) && !is_domain($pconfig['remotegw'])) {
+ $input_errors[] = gettext("A valid remote gateway address or host name must be specified.");
+ } elseif (is_ipaddrv4($pconfig['remotegw']) && ($pconfig['protocol'] != "inet")) {
+ $input_errors[] = gettext("A valid remote gateway IPv4 address must be specified or you need to change protocol to IPv6");
+ } elseif (is_ipaddrv6($pconfig['remotegw']) && ($pconfig['protocol'] != "inet6")) {
+ $input_errors[] = gettext("A valid remote gateway IPv6 address must be specified or you need to change protocol to IPv4");
+ }
+ }
+
+ if ($pconfig['remotegw'] && is_ipaddr($pconfig['remotegw']) && !isset($pconfig['disabled'])) {
+ $t = 0;
+ foreach ($a_phase1 as $ph1tmp) {
+ if ($p1index <> $t) {
+ $tremotegw = $pconfig['remotegw'];
+ if (($ph1tmp['remote-gateway'] == $tremotegw) && !isset($ph1tmp['disabled'])) {
+ $input_errors[] = sprintf(gettext('The remote gateway "%1$s" is already used by phase1 "%2$s".'), $tremotegw, $ph1tmp['descr']);
+ }
+ }
+ $t++;
+ }
+ }
+
+ if (is_array($a_phase2) && (count($a_phase2))) {
+ foreach ($a_phase2 as $phase2) {
+ if ($phase2['ikeid'] == $pconfig['ikeid']) {
+ if (($pconfig['protocol'] == "inet") && ($phase2['mode'] == "tunnel6")) {
+ $input_errors[] = gettext("There is a Phase 2 using IPv6, you cannot use IPv4.");
+ break;
+ }
+ if (($pconfig['protocol'] == "inet6") && ($phase2['mode'] == "tunnel")) {
+ $input_errors[] = gettext("There is a Phase 2 using IPv4, you cannot use IPv6.");
+ break;
+ }
+ }
+ }
+ }
+
+ /* My identity */
+
+ if ($pconfig['myid_type'] == "myaddress") {
+ $pconfig['myid_data'] = "";
+ }
+
+ if ($pconfig['myid_type'] == "address" and $pconfig['myid_data'] == "") {
+ $input_errors[] = gettext("Please enter an address for 'My Identifier'");
+ }
+
+ if ($pconfig['myid_type'] == "keyid tag" and $pconfig['myid_data'] == "") {
+ $input_errors[] = gettext("Please enter a keyid tag for 'My Identifier'");
+ }
+
+ if ($pconfig['myid_type'] == "fqdn" and $pconfig['myid_data'] == "") {
+ $input_errors[] = gettext("Please enter a fully qualified domain name for 'My Identifier'");
+ }
+
+ if ($pconfig['myid_type'] == "user_fqdn" and $pconfig['myid_data'] == "") {
+ $input_errors[] = gettext("Please enter a user and fully qualified domain name for 'My Identifier'");
+ }
+
+ if ($pconfig['myid_type'] == "dyn_dns" and $pconfig['myid_data'] == "") {
+ $input_errors[] = gettext("Please enter a dynamic domain name for 'My Identifier'");
+ }
+
+ if (($pconfig['myid_type'] == "address") && !is_ipaddr($pconfig['myid_data'])) {
+ $input_errors[] = gettext("A valid IP address for 'My identifier' must be specified.");
+ }
+
+ if (($pconfig['myid_type'] == "fqdn") && !is_domain($pconfig['myid_data'])) {
+ $input_errors[] = gettext("A valid domain name for 'My identifier' must be specified.");
+ }
+
+ if ($pconfig['myid_type'] == "fqdn") {
+ if (is_domain($pconfig['myid_data']) == false) {
+ $input_errors[] = gettext("A valid FQDN for 'My identifier' must be specified.");
+ }
+ }
+
+ if ($pconfig['myid_type'] == "user_fqdn") {
+ $user_fqdn = explode("@", $pconfig['myid_data']);
+ if (is_domain($user_fqdn[1]) == false) {
+ $input_errors[] = gettext("A valid User FQDN in the form of user@my.domain.com for 'My identifier' must be specified.");
+ }
+ }
+
+ if ($pconfig['myid_type'] == "dyn_dns") {
+ if (is_domain($pconfig['myid_data']) == false) {
+ $input_errors[] = gettext("A valid Dynamic DNS address for 'My identifier' must be specified.");
+ }
+ }
+
+ /* Peer identity */
+
+ if ($pconfig['myid_type'] == "peeraddress") {
+ $pconfig['peerid_data'] = "";
+ }
+
+ // Only enforce peer ID if we are not dealing with a pure-psk mobile config.
+ if (!(($pconfig['authentication_method'] == "pre_shared_key") && ($pconfig['mobile']))) {
+ if ($pconfig['peerid_type'] == "address" and $pconfig['peerid_data'] == "") {
+ $input_errors[] = gettext("Please enter an address for 'Peer Identifier'");
+ }
+
+ if ($pconfig['peerid_type'] == "keyid tag" and $pconfig['peerid_data'] == "") {
+ $input_errors[] = gettext("Please enter a keyid tag for 'Peer Identifier'");
+ }
+
+ if ($pconfig['peerid_type'] == "fqdn" and $pconfig['peerid_data'] == "") {
+ $input_errors[] = gettext("Please enter a fully qualified domain name for 'Peer Identifier'");
+ }
+
+ if ($pconfig['peerid_type'] == "user_fqdn" and $pconfig['peerid_data'] == "") {
+ $input_errors[] = gettext("Please enter a user and fully qualified domain name for 'Peer Identifier'");
+ }
+
+ if ((($pconfig['peerid_type'] == "address") && !is_ipaddr($pconfig['peerid_data']))) {
+ $input_errors[] = gettext("A valid IP address for 'Peer identifier' must be specified.");
+ }
+
+ if ((($pconfig['peerid_type'] == "fqdn") && !is_domain($pconfig['peerid_data']))) {
+ $input_errors[] = gettext("A valid domain name for 'Peer identifier' must be specified.");
+ }
+
+ if ($pconfig['peerid_type'] == "fqdn") {
+ if (is_domain($pconfig['peerid_data']) == false) {
+ $input_errors[] = gettext("A valid FQDN for 'Peer identifier' must be specified.");
+ }
+ }
+
+ if ($pconfig['peerid_type'] == "user_fqdn") {
+ $user_fqdn = explode("@", $pconfig['peerid_data']);
+ if (is_domain($user_fqdn[1]) == false) {
+ $input_errors[] = gettext("A valid User FQDN in the form of user@my.domain.com for 'Peer identifier' must be specified.");
+ }
+ }
+ }
+
+ if ($pconfig['dpd_enable']) {
+ if (!is_numeric($pconfig['dpd_delay'])) {
+ $input_errors[] = gettext("A numeric value must be specified for DPD delay.");
+ }
+
+ if (!is_numeric($pconfig['dpd_maxfail'])) {
+ $input_errors[] = gettext("A numeric value must be specified for DPD retries.");
+ }
+ }
+
+ if (!empty($pconfig['iketype']) && $pconfig['iketype'] != "ikev1" && $pconfig['iketype'] != "ikev2") {
+ $input_errors[] = gettext("Valid arguments for IKE type is v1 or v2");
+ }
+
+ if (!empty($_POST['ealgo']) && isset($config['system']['crypto_hardware'])) {
+ if ($config['system']['crypto_hardware'] == "glxsb") {
+ if ($_POST['ealgo'] == "aes" && $_POST['ealgo_keylen'] != "128") {
+ $input_errors[] = gettext("Only 128 bit AES can be used where the glxsb crypto accelerator is enabled.");
+ }
+ }
+ }
+
+ /* build our encryption algorithms array */
+ $pconfig['ealgo'] = array();
+ $pconfig['ealgo']['name'] = $_POST['ealgo'];
+ if ($pconfig['ealgo_keylen']) {
+ $pconfig['ealgo']['keylen'] = $_POST['ealgo_keylen'];
+ }
+
+ if (!$input_errors) {
+ $ph1ent['ikeid'] = $pconfig['ikeid'];
+ $ph1ent['iketype'] = $pconfig['iketype'];
+ if ($pconfig['iketype'] != 'ikev1') {
+ unset($ph1ent['mode']);
+ } else {
+ $ph1ent['mode'] = $pconfig['mode'];
+ }
+ $ph1ent['disabled'] = $pconfig['disabled'] ? true : false;
+ $ph1ent['interface'] = $pconfig['interface'];
+ /* if the remote gateway changed and the interface is not WAN then remove route */
+ /* the vpn_ipsec_configure() handles adding the route */
+ if ($pconfig['interface'] <> "wan") {
+ if ($old_ph1ent['remote-gateway'] <> $pconfig['remotegw']) {
+ mwexec("/sbin/route delete -host {$old_ph1ent['remote-gateway']}");
+ }
+ }
+
+ if ($pconfig['mobile']) {
+ $ph1ent['mobile'] = true;
+ } else {
+ $ph1ent['remote-gateway'] = $pconfig['remotegw'];
+ }
+
+ $ph1ent['protocol'] = $pconfig['protocol'];
+
+ $ph1ent['myid_type'] = $pconfig['myid_type'];
+ $ph1ent['myid_data'] = $pconfig['myid_data'];
+ $ph1ent['peerid_type'] = $pconfig['peerid_type'];
+ $ph1ent['peerid_data'] = $pconfig['peerid_data'];
+
+ $ph1ent['encryption-algorithm'] = $pconfig['ealgo'];
+ $ph1ent['hash-algorithm'] = $pconfig['halgo'];
+ $ph1ent['dhgroup'] = $pconfig['dhgroup'];
+ $ph1ent['lifetime'] = $pconfig['lifetime'];
+ $ph1ent['pre-shared-key'] = $pconfig['pskey'];
+ $ph1ent['private-key'] = base64_encode($pconfig['privatekey']);
+ $ph1ent['certref'] = $pconfig['certref'];
+ $ph1ent['caref'] = $pconfig['caref'];
+ $ph1ent['authentication_method'] = $pconfig['authentication_method'];
+ $ph1ent['descr'] = $pconfig['descr'];
+ $ph1ent['nat_traversal'] = $pconfig['nat_traversal'];
+ $ph1ent['mobike'] = $pconfig['mobike'];
+
+ if (isset($pconfig['reauth_enable'])) {
+ $ph1ent['reauth_enable'] = true;
+ } else {
+ unset($ph1ent['reauth_enable']);
+ }
+ if (isset($pconfig['rekey_enable'])) {
+ $ph1ent['rekey_enable'] = true;
+ } else {
+ unset($ph1ent['rekey_enable']);
+ }
+
+ if (isset($pconfig['responderonly'])) {
+ $ph1ent['responderonly'] = true;
+ } else {
+ unset($ph1ent['responderonly']);
+ }
+
+ if (isset($pconfig['dpd_enable'])) {
+ $ph1ent['dpd_delay'] = $pconfig['dpd_delay'];
+ $ph1ent['dpd_maxfail'] = $pconfig['dpd_maxfail'];
+ }
+
+ /* generate unique phase1 ikeid */
+ if ($ph1ent['ikeid'] == 0) {
+ $ph1ent['ikeid'] = ipsec_ikeid_next();
+ }
+
+ if (isset($p1index) && $a_phase1[$p1index]) {
+ $a_phase1[$p1index] = $ph1ent;
+ } else {
+ $a_phase1[] = $ph1ent;
+ }
+
+ write_config();
+ mark_subsystem_dirty('ipsec');
+
+ header("Location: vpn_ipsec.php");
+ exit;
+ }
+}
+
+if ($pconfig['mobile']) {
+ $pgtitle = array(gettext("VPN"), gettext("IPsec"), gettext("Edit Phase 1"), gettext("Mobile Client"));
+} else {
+ $pgtitle = array(gettext("VPN"), gettext("IPsec"), gettext("Edit Phase 1"));
+}
+$shortcut_section = "ipsec";
+
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function myidsel_change() {
+ index = document.iform.myid_type.selectedIndex;
+ value = document.iform.myid_type.options[index].value;
+ if (value == 'myaddress') {
+ document.getElementById('myid_data').style.visibility = 'hidden';
+ } else {
+ document.getElementById('myid_data').style.visibility = 'visible';
+ }
+}
+
+function iketype_change() {
+ index = document.iform.iketype.selectedIndex;
+ value = document.iform.iketype.options[index].value;
+ if (value == 'ikev2') {
+ document.getElementById('negmode').style.display= 'none';
+ document.getElementById('mobike').style.display= '';
+ document.getElementById('natt').style.display= 'none';
+ document.getElementById('disablereauth').style.display= '';
+ } else {
+ document.getElementById('negmode').style.display = '';
+ document.getElementById('mobike').style.display = 'none';
+ document.getElementById('natt').style.display= '';
+ document.getElementById('disablereauth').style.display= 'none';
+ }
+}
+
+function peeridsel_change() {
+ index = document.iform.peerid_type.selectedIndex;
+ value = document.iform.peerid_type.options[index].value;
+ if (value == 'peeraddress') {
+ document.getElementById('peerid_data').style.visibility = 'hidden';
+ } else if (value == 'any') {
+ document.getElementById('peerid_data').style.visibility = 'hidden';
+ } else {
+ document.getElementById('peerid_data').style.visibility = 'visible';
+ }
+}
+
+function methodsel_change() {
+ index = document.iform.authentication_method.selectedIndex;
+ value = document.iform.authentication_method.options[index].value;
+
+ switch (value) {
+ case 'eap-mschapv2':
+ case 'eap-tls':
+ case 'eap-radius':
+ document.getElementById('opt_psk').style.display = 'none';
+ document.getElementById('opt_peerid').style.display = '';
+ document.getElementById('opt_cert').style.display = '';
+ document.getElementById('opt_ca').style.display = '';
+ document.getElementById('opt_cert').disabled = false;
+ document.getElementById('opt_ca').disabled = false;
+ break;
+ case 'hybrid_rsa_server':
+ document.getElementById('opt_psk').style.display = 'none';
+ document.getElementById('opt_peerid').style.display = '';
+ document.getElementById('opt_cert').style.display = '';
+ document.getElementById('opt_ca').style.display = '';
+ document.getElementById('opt_cert').disabled = false;
+ document.getElementById('opt_ca').disabled = false;
+ break;
+ case 'xauth_rsa_server':
+ case 'rsasig':
+ document.getElementById('opt_psk').style.display = 'none';
+ document.getElementById('opt_peerid').style.display = '';
+ document.getElementById('opt_cert').style.display = '';
+ document.getElementById('opt_ca').style.display = '';
+ document.getElementById('opt_cert').disabled = false;
+ document.getElementById('opt_ca').disabled = false;
+ break;
+<?php if ($pconfig['mobile']) { ?>
+ case 'pre_shared_key':
+ document.getElementById('opt_psk').style.display = 'none';
+ document.getElementById('opt_peerid').style.display = 'none';
+ document.getElementById('opt_cert').style.display = 'none';
+ document.getElementById('opt_ca').style.display = 'none';
+ document.getElementById('opt_cert').disabled = true;
+ document.getElementById('opt_ca').disabled = true;
+ break;
+<?php } ?>
+ default: /* psk modes*/
+ document.getElementById('opt_psk').style.display = '';
+ document.getElementById('opt_peerid').style.display = '';
+ document.getElementById('opt_cert').style.display = 'none';
+ document.getElementById('opt_ca').style.display = 'none';
+ document.getElementById('opt_cert').disabled = true;
+ document.getElementById('opt_ca').disabled = true;
+ break;
+ }
+}
+
+/* PHP generated java script for variable length keys */
+function ealgosel_change(bits) {
+ switch (document.iform.ealgo.selectedIndex) {
+<?php
+$i = 0;
+foreach ($p1_ealgos as $algo => $algodata) {
+ if (is_array($algodata['keysel'])) {
+ echo " case {$i}:\n";
+ echo " document.iform.ealgo_keylen.style.visibility = 'visible';\n";
+ echo " document.iform.ealgo_keylen.options.length = 0;\n";
+ // echo " document.iform.ealgo_keylen.options[document.iform.ealgo_keylen.options.length] = new Option( 'auto', 'auto' );\n";
+
+ $key_hi = $algodata['keysel']['hi'];
+ $key_lo = $algodata['keysel']['lo'];
+ $key_step = $algodata['keysel']['step'];
+
+ for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step) {
+ echo " document.iform.ealgo_keylen.options[document.iform.ealgo_keylen.options.length] = new Option( '{$keylen} bits', '{$keylen}' );\n";
+ }
+ echo " break;\n";
+ } else {
+ echo " case {$i}:\n";
+ echo " document.iform.ealgo_keylen.style.visibility = 'hidden';\n";
+ echo " document.iform.ealgo_keylen.options.length = 0;\n";
+ echo " break;\n";
+ }
+ $i++;
+}
+?>
+ }
+
+ if (bits) {
+ document.iform.ealgo_keylen.value = bits;
+ }
+}
+
+function dpdchkbox_change() {
+ if (document.iform.dpd_enable.checked) {
+ document.getElementById('opt_dpd').style.display = '';
+ } else {
+ document.getElementById('opt_dpd').style.display = 'none';
+ }
+
+ if (!document.iform.dpd_delay.value) {
+ document.iform.dpd_delay.value = "10";
+ }
+
+ if (!document.iform.dpd_maxfail.value) {
+ document.iform.dpd_maxfail.value = "5";
+ }
+}
+
+//]]>
+</script>
+
+<form action="vpn_ipsec_phase1.php" method="post" name="iform" id="iform">
+
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec phase-1">
+ <tr class="tabnavtbl">
+ <td id="tabnav">
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
+ $tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
+ $tab_array[2] = array(gettext("Pre-Shared Keys"), false, "vpn_ipsec_keys.php");
+ $tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("General information"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable this phase1 entry"); ?></strong><br />
+ <span class="vexpl">
+ <?=gettext("Set this option to disable this phase1 without removing it from the list"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Key Exchange version"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="iketype" class="formselect" onchange='iketype_change()'>
+ <?php
+ $keyexchange = array("ikev1" => "V1", "ikev2" => "V2");
+ foreach ($keyexchange as $kidx => $name):
+ ?>
+ <option value="<?=$kidx;?>" <?php if ($kidx == $pconfig['iketype']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($name);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Select the Internet Key Exchange protocol version to be used, IKEv1 or IKEv2"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Internet Protocol"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="protocol" class="formselect">
+ <?php
+ $protocols = array("inet" => "IPv4", "inet6" => "IPv6");
+ foreach ($protocols as $protocol => $name):
+ ?>
+ <option value="<?=$protocol;?>" <?php if ($protocol == $pconfig['protocol']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($name);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Select the Internet Protocol family from this dropdown"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect">
+ <?php
+ $interfaces = get_configured_interface_with_descr();
+
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip) {
+ $interfaces[$cif] = $carpip." (".get_vip_descr($carpip).")";
+ }
+
+ $aliaslist = get_configured_ip_aliases_list();
+ foreach ($aliaslist as $aliasip => $aliasif) {
+ $interfaces[$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+ }
+
+ $grouplist = return_gateway_groups_array();
+ foreach ($grouplist as $name => $group) {
+ if ($group[0]['vip'] <> "") {
+ $vipif = $group[0]['vip'];
+ } else {
+ $vipif = $group[0]['int'];
+ }
+ $interfaces[$name] = "GW Group {$name}";
+ }
+
+
+ foreach ($interfaces as $iface => $ifacename):
+ ?>
+ <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl"><?=gettext("Select the interface for the local endpoint of this phase1 entry"); ?>.</span>
+ </td>
+ </tr>
+
+ <?php if (!$pconfig['mobile']): ?>
+
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote gateway"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="remotegw" type="text" class="formfld unknown" id="remotegw" size="28" value="<?=htmlspecialchars($pconfig['remotegw']);?>" />
+ <br />
+ <?=gettext("Enter the public IP address or host name of the remote gateway"); ?>
+ </td>
+ </tr>
+
+ <?php endif; ?>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic">
+ <?=gettext("Phase 1 proposal (Authentication)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication method"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="authentication_method" class="formselect" onchange="methodsel_change()">
+ <?php
+ foreach ($p1_authentication_methods as $method_type => $method_params):
+ if (!$pconfig['mobile'] && $method_params['mobile']) {
+ continue;
+ }
+ ?>
+ <option value="<?=$method_type;?>" <?php if ($method_type == $pconfig['authentication_method']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($method_params['name']);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Must match the setting chosen on the remote side"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr id='negmode' >
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Negotiation mode"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="mode" class="formselect">
+ <?php
+ $modes = array("main" => "Main", "aggressive" => "Aggressive");
+ foreach ($modes as $mode => $mdescr):
+ ?>
+ <option value="<?=$mode;?>" <?php if ($mode == $pconfig['mode']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($mdescr);?>
+ </option>
+ <?php endforeach; ?>
+ </select> <br /> <span class="vexpl"><?=gettext("Aggressive is more flexible, but less secure"); ?>.</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("My identifier"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="myid_type" class="formselect" onchange="myidsel_change()">
+ <?php foreach ($my_identifier_list as $id_type => $id_params): ?>
+ <option value="<?=$id_type;?>" <?php if ($id_type == $pconfig['myid_type']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($id_params['desc']);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <input name="myid_data" type="text" class="formfld unknown" id="myid_data" size="30" value="<?=htmlspecialchars($pconfig['myid_data']);?>" />
+ </td>
+ </tr>
+ <tr id="opt_peerid">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Peer identifier"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="peerid_type" class="formselect" onchange="peeridsel_change()">
+ <?php
+ foreach ($peer_identifier_list as $id_type => $id_params):
+ if ($pconfig['mobile'] && !$id_params['mobile']) {
+ continue;
+ }
+ ?>
+ <option value="<?=$id_type;?>" <?php if ($id_type == $pconfig['peerid_type']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($id_params['desc']);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <input name="peerid_data" type="text" class="formfld unknown" id="peerid_data" size="30" value="<?=htmlspecialchars($pconfig['peerid_data']);?>" />
+ <?php if ($pconfig['mobile']) { ?>
+ <br /><br /><?=gettext("NOTE: This is known as the \"group\" setting on some VPN client implementations"); ?>.
+ <?php } ?>
+ </td>
+ </tr>
+ <tr id="opt_psk">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Pre-Shared Key"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?>
+ <input name="pskey" type="text" class="formfld unknown" id="pskey" size="40" value="<?=htmlspecialchars($pconfig['pskey']);?>" />
+ <span class="vexpl">
+ <br />
+ <?=gettext("Input your Pre-Shared Key string"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr id="opt_cert">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("My Certificate"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="certref" class="formselect">
+ <?php
+ foreach ($config['cert'] as $cert):
+ $selected = "";
+ if ($pconfig['certref'] == $cert['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$cert['refid'];?>" <?=$selected;?>><?=htmlspecialchars($cert['descr']);?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Select a certificate previously configured in the Certificate Manager"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr id="opt_ca">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("My Certificate Authority"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="caref" class="formselect">
+ <?php
+ foreach ($config['ca'] as $ca):
+ $selected = "";
+ if ($pconfig['caref'] == $ca['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Select a certificate authority previously configured in the Certificate Manager"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic">
+ <?=gettext("Phase 1 proposal (Algorithms)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Encryption algorithm"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="ealgo" class="formselect" onchange="ealgosel_change()">
+ <?php
+ foreach ($p1_ealgos as $algo => $algodata):
+ $selected = "";
+ if ($algo == $pconfig['ealgo']['name']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$algo;?>"<?=$selected?>>
+ <?=htmlspecialchars($algodata['name']);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <select name="ealgo_keylen" width="30" class="formselect">
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hash algorithm"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="halgo" class="formselect">
+ <?php foreach ($p1_halgos as $algo => $algoname): ?>
+ <option value="<?=$algo;?>" <?php if ($algo == $pconfig['halgo']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($algoname);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Must match the setting chosen on the remote side"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("DH key group"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="dhgroup" class="formselect">
+ <?php foreach ($p1_dhgroups as $keygroup => $keygroupname): ?>
+ <option value="<?=$keygroup;?>" <?php if ($keygroup == $pconfig['dhgroup']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($keygroupname);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Must match the setting chosen on the remote side"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Lifetime"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="20" value="<?=htmlspecialchars($pconfig['lifetime']);?>" />
+ <?=gettext("seconds"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced Options"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable Rekey");?></td>
+ <td width="78%" class="vtable">
+ <input name="rekey_enable" type="checkbox" id="rekey_enable" value="yes" <?php if (isset($pconfig['rekey_enable'])) echo "checked=\"checked\""; ?> />
+ <?=gettext("Whether a connection should be renegotiated when it is about to expire."); ?><br />
+ </td>
+ </tr>
+ <tr id='disablereauth'>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable Reauth");?></td>
+ <td width="78%" class="vtable">
+ <input name="reauth_enable" type="checkbox" id="reauth_enable" value="yes" <?php if (isset($pconfig['reauth_enable'])) echo "checked=\"checked\""; ?> />
+ <?=gettext("Whether rekeying of an IKE_SA should also reauthenticate the peer. In IKEv1, reauthentication is always done."); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Responder Only");?></td>
+ <td width="78%" class="vtable">
+ <input name="responderonly" type="checkbox" id="responderonly" value="yes" <?php if (isset($pconfig['responderonly'])) echo "checked=\"checked\""; ?> />
+ <?=gettext("Enable this option to never initiate this connection from this side, only respond to incoming requests."); ?><br />
+ </td>
+ </tr>
+ <tr id='natt'>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NAT Traversal"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="nat_traversal" class="formselect">
+ <option value="on" <?php if ($pconfig['nat_traversal'] != 'on') echo "selected=\"selected\""; ?>><?=gettext("Auto"); ?></option>
+ <option value="force" <?php if ($pconfig['nat_traversal'] == 'force') echo "selected=\"selected\""; ?>><?=gettext("Force"); ?></option>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set this option to enable the use of NAT-T (i.e. the encapsulation of ESP in UDP packets) if needed, " .
+ "which can help with clients that are behind restrictive firewalls"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr id='mobike'>
+ <td width="22%" valign="top" class="vncell"><?=gettext("MOBIKE"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="mobike" class="formselect">
+ <option value="on" <?php if ($pconfig['mobike'] == 'on') echo "selected=\"selected\""; ?>><?=gettext("Enable"); ?></option>
+ <option value="off" <?php if ($pconfig['mobike'] != 'on') echo "selected=\"selected\""; ?>><?=gettext("Disable"); ?></option>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set this option to control the use of MOBIKE"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Dead Peer Detection"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="dpd_enable" type="checkbox" id="dpd_enable" value="yes" <?php if (isset($pconfig['dpd_enable'])) echo "checked=\"checked\""; ?> onclick="dpdchkbox_change()" />
+ <?=gettext("Enable DPD"); ?><br />
+ <div id="opt_dpd">
+ <br />
+ <input name="dpd_delay" type="text" class="formfld unknown" id="dpd_delay" size="5" value="<?=htmlspecialchars($pconfig['dpd_delay']);?>" />
+ <?=gettext("seconds"); ?><br />
+ <span class="vexpl">
+ <?=gettext("Delay between requesting peer acknowledgement"); ?>.
+ </span><br />
+ <br />
+ <input name="dpd_maxfail" type="text" class="formfld unknown" id="dpd_maxfail" size="5" value="<?=htmlspecialchars($pconfig['dpd_maxfail']);?>" />
+ <?=gettext("retries"); ?><br />
+ <span class="vexpl">
+ <?=gettext("Number of consecutive failures allowed before disconnect"); ?>.
+ </span>
+ <br />
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <?php if (isset($p1index) && $a_phase1[$p1index]): ?>
+ <input name="p1index" type="hidden" value="<?=htmlspecialchars($p1index);?>" />
+ <?php endif; ?>
+ <?php if ($pconfig['mobile']): ?>
+ <input name="mobile" type="hidden" value="true" />
+ <?php endif; ?>
+ <input name="ikeid" type="hidden" value="<?=htmlspecialchars($pconfig['ikeid']);?>" />
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+
+<script type="text/javascript">
+//<![CDATA[
+<?php
+ /* determine if we should init the key length */
+ $keyset = '';
+ if (isset($pconfig['ealgo']['keylen'])) {
+ if (is_numeric($pconfig['ealgo']['keylen'])) {
+ $keyset = $pconfig['ealgo']['keylen'];
+ }
+ }
+?>
+myidsel_change();
+peeridsel_change();
+iketype_change();
+methodsel_change();
+ealgosel_change(<?=$keyset;?>);
+dpdchkbox_change();
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_ipsec_phase2.php b/src/usr/local/www/vpn_ipsec_phase2.php
new file mode 100644
index 0000000..f9a9805
--- /dev/null
+++ b/src/usr/local/www/vpn_ipsec_phase2.php
@@ -0,0 +1,983 @@
+<?php
+/*
+ vpn_ipsec_phase2.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2008 Shrew Soft Inc
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-ipsec-editphase2
+##|*NAME=VPN: IPsec: Edit Phase 2 page
+##|*DESCR=Allow access to the 'VPN: IPsec: Edit Phase 2' page.
+##|*MATCH=vpn_ipsec_phase2.php*
+##|-PRIV
+
+require("functions.inc");
+require("guiconfig.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+
+if (!is_array($config['ipsec']['client'])) {
+ $config['ipsec']['client'] = array();
+}
+
+$a_client = &$config['ipsec']['client'];
+
+if (!is_array($config['ipsec']['phase1'])) {
+ $config['ipsec']['phase1'] = array();
+}
+
+if (!is_array($config['ipsec']['phase2'])) {
+ $config['ipsec']['phase2'] = array();
+}
+
+$a_phase1 = &$config['ipsec']['phase1'];
+$a_phase2 = &$config['ipsec']['phase2'];
+
+if (!empty($_GET['p2index'])) {
+ $uindex = $_GET['p2index'];
+}
+if (!empty($_POST['uniqid'])) {
+ $uindex = $_POST['uniqid'];
+}
+
+if (!empty($_GET['dup'])) {
+ $uindex = $_GET['dup'];
+}
+
+$ph2found = false;
+if (isset($uindex)) {
+ foreach ($a_phase2 as $p2index => $ph2) {
+ if ($ph2['uniqid'] == $uindex) {
+ $ph2found = true;
+ break;
+ }
+ }
+}
+
+if ($ph2found === true) {
+ $pconfig['ikeid'] = $ph2['ikeid'];
+ $pconfig['disabled'] = isset($ph2['disabled']);
+ $pconfig['mode'] = $ph2['mode'];
+ $pconfig['descr'] = $ph2['descr'];
+ $pconfig['uniqid'] = $ph2['uniqid'];
+
+ if (!empty($ph2['natlocalid'])) {
+ idinfo_to_pconfig("natlocal", $ph2['natlocalid'], $pconfig);
+ }
+ idinfo_to_pconfig("local", $ph2['localid'], $pconfig);
+ idinfo_to_pconfig("remote", $ph2['remoteid'], $pconfig);
+
+ $pconfig['proto'] = $ph2['protocol'];
+ ealgos_to_pconfig($ph2['encryption-algorithm-option'], $pconfig);
+ $pconfig['halgos'] = $ph2['hash-algorithm-option'];
+ $pconfig['pfsgroup'] = $ph2['pfsgroup'];
+ $pconfig['lifetime'] = $ph2['lifetime'];
+ $pconfig['pinghost'] = $ph2['pinghost'];
+ $pconfig['reqid'] = $ph2['reqid'];
+
+ if (isset($ph2['mobile'])) {
+ $pconfig['mobile'] = true;
+ }
+} else {
+ $pconfig['ikeid'] = $_GET['ikeid'];
+
+ /* defaults */
+ $pconfig['localid_type'] = "lan";
+ $pconfig['remoteid_type'] = "network";
+ $pconfig['proto'] = "esp";
+ $pconfig['ealgos'] = explode(",", "aes");
+ $pconfig['halgos'] = explode(",", "hmac_sha1");
+ $pconfig['pfsgroup'] = "0";
+ $pconfig['lifetime'] = "3600";
+ $pconfig['uniqid'] = uniqid();
+
+ /* mobile client */
+ if ($_GET['mobile']) {
+ $pconfig['mobile']=true;
+ }
+}
+
+unset($ph2);
+if (!empty($_GET['dup'])) {
+ unset($uindex);
+ unset($p2index);
+ $pconfig['uniqid'] = uniqid();
+ $pconfig['reqid'] = ipsec_new_reqid();
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (!isset($_POST['ikeid'])) {
+ $input_errors[] = gettext("A valid ikeid must be specified.");
+ }
+
+ /* input validation */
+ $reqdfields = explode(" ", "localid_type uniqid");
+ $reqdfieldsn = array(gettext("Local network type"), gettext("Unique Identifier"));
+ if (!isset($pconfig['mobile'])) {
+ $reqdfields[] = "remoteid_type";
+ $reqdfieldsn[] = gettext("Remote network type");
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($pconfig['mode'] == "tunnel") || ($pconfig['mode'] == "tunnel6")) {
+ switch ($pconfig['localid_type']) {
+ case "network":
+ if (($pconfig['localid_netbits'] != 0 && !$pconfig['localid_netbits']) || !is_numeric($pconfig['localid_netbits'])) {
+ $input_errors[] = gettext("A valid local network bit count must be specified.");
+ }
+ case "address":
+ if (!$pconfig['localid_address'] || !is_ipaddr($pconfig['localid_address'])) {
+ $input_errors[] = gettext("A valid local network IP address must be specified.");
+ } elseif (is_ipaddrv4($pconfig['localid_address']) && ($pconfig['mode'] != "tunnel")) {
+ $input_errors[] = gettext("A valid local network IPv4 address must be specified or you need to change Mode to IPv6");
+ } elseif (is_ipaddrv6($pconfig['localid_address']) && ($pconfig['mode'] != "tunnel6")) {
+ $input_errors[] = gettext("A valid local network IPv6 address must be specified or you need to change Mode to IPv4");
+ }
+ break;
+ }
+ /* Check if the localid_type is an interface, to confirm if it has a valid subnet. */
+ if (is_array($config['interfaces'][$pconfig['localid_type']])) {
+ // Don't let an empty subnet into racoon.conf, it can cause parse errors. Ticket #2201.
+ $address = get_interface_ip($pconfig['localid_type']);
+ $netbits = get_interface_subnet($pconfig['localid_type']);
+
+ if (empty($address) || empty($netbits)) {
+ $input_errors[] = gettext("Invalid Local Network.") . " " . convert_friendly_interface_to_friendly_descr($pconfig['localid_type']) . " " . gettext("has no subnet.");
+ }
+ }
+
+ if (!empty($pconfig['natlocalid_address'])) {
+ switch ($pconfig['natlocalid_type']) {
+ case "network":
+ if (($pconfig['natlocalid_netbits'] != 0 && !$pconfig['natlocalid_netbits']) || !is_numeric($pconfig['natlocalid_netbits'])) {
+ $input_errors[] = gettext("A valid NAT local network bit count must be specified.");
+ }
+ if ($pconfig['localid_type'] == "address") {
+ $input_errors[] = gettext("You cannot configure a network type address for NAT while only an address type is selected for local source.");
+ }
+ case "address":
+ if (!empty($pconfig['natlocalid_address']) && !is_ipaddr($pconfig['natlocalid_address'])) {
+ $input_errors[] = gettext("A valid NAT local network IP address must be specified.");
+ } elseif (is_ipaddrv4($pconfig['natlocalid_address']) && ($pconfig['mode'] != "tunnel")) {
+ $input_errors[] = gettext("A valid NAT local network IPv4 address must be specified or you need to change Mode to IPv6");
+ } elseif (is_ipaddrv6($pconfig['natlocalid_address']) && ($pconfig['mode'] != "tunnel6")) {
+ $input_errors[] = gettext("A valid NAT local network IPv6 address must be specified or you need to change Mode to IPv4");
+ }
+ break;
+ }
+
+ if (is_array($config['interfaces'][$pconfig['natlocalid_type']])) {
+ // Don't let an empty subnet into racoon.conf, it can cause parse errors. Ticket #2201.
+ $address = get_interface_ip($pconfig['natlocalid_type']);
+ $netbits = get_interface_subnet($pconfig['natlocalid_type']);
+
+ if (empty($address) || empty($netbits)) {
+ $input_errors[] = gettext("Invalid Local Network.") . " " . convert_friendly_interface_to_friendly_descr($pconfig['natlocalid_type']) . " " . gettext("has no subnet.");
+ }
+ }
+ }
+
+ switch ($pconfig['remoteid_type']) {
+ case "network":
+ if (($pconfig['remoteid_netbits'] != 0 && !$pconfig['remoteid_netbits']) || !is_numeric($pconfig['remoteid_netbits'])) {
+ $input_errors[] = gettext("A valid remote network bit count must be specified.");
+ }
+ case "address":
+ if (!$pconfig['remoteid_address'] || !is_ipaddr($pconfig['remoteid_address'])) {
+ $input_errors[] = gettext("A valid remote network IP address must be specified.");
+ } elseif (is_ipaddrv4($pconfig['remoteid_address']) && ($pconfig['mode'] != "tunnel")) {
+ $input_errors[] = gettext("A valid remote network IPv4 address must be specified or you need to change Mode to IPv6");
+ } elseif (is_ipaddrv6($pconfig['remoteid_address']) && ($pconfig['mode'] != "tunnel6")) {
+ $input_errors[] = gettext("A valid remote network IPv6 address must be specified or you need to change Mode to IPv4");
+ }
+ break;
+ }
+ }
+ /* Validate enabled phase2's are not duplicates */
+ if (isset($pconfig['mobile'])) {
+ /* User is adding phase 2 for mobile phase1 */
+ foreach ($a_phase2 as $key => $name) {
+ if (isset($name['mobile']) && $name['uniqid'] != $pconfig['uniqid']) {
+ /* check duplicate localids only for mobile clents */
+ $localid_data = ipsec_idinfo_to_cidr($name['localid'], false, $name['mode']);
+ $entered = array();
+ $entered['type'] = $pconfig['localid_type'];
+ if (isset($pconfig['localid_address'])) $entered['address'] = $pconfig['localid_address'];
+ if (isset($pconfig['localid_netbits'])) $entered['netbits'] = $pconfig['localid_netbits'];
+ $entered_localid_data = ipsec_idinfo_to_cidr($entered, false, $pconfig['mode']);
+ if ($localid_data == $entered_localid_data) {
+ /* adding new p2 entry */
+ $input_errors[] = gettext("Phase2 with this Local Network is already defined for mobile clients.");
+ break;
+ }
+ }
+ }
+ } else {
+ /* User is adding phase 2 for site-to-site phase1 */
+ $input_error = 0;
+ foreach ($a_phase2 as $key => $name) {
+ if (!isset($name['mobile']) && $pconfig['ikeid'] == $name['ikeid'] && $pconfig['uniqid'] != $name['uniqid']) {
+ /* check duplicate subnets only for given phase1 */
+ $localid_data = ipsec_idinfo_to_cidr($name['localid'], false, $name['mode']);
+ $remoteid_data = ipsec_idinfo_to_cidr($name['remoteid'], false, $name['mode']);
+ $entered_local = array();
+ $entered_local['type'] = $pconfig['localid_type'];
+ if (isset($pconfig['localid_address'])) {
+ $entered_local['address'] = $pconfig['localid_address'];
+ }
+ if (isset($pconfig['localid_netbits'])) {
+ $entered_local['netbits'] = $pconfig['localid_netbits'];
+ }
+ $entered_localid_data = ipsec_idinfo_to_cidr($entered_local, false, $pconfig['mode']);
+ $entered_remote = array();
+ $entered_remote['type'] = $pconfig['remoteid_type'];
+ if (isset($pconfig['remoteid_address'])) {
+ $entered_remote['address'] = $pconfig['remoteid_address'];
+ }
+ if (isset($pconfig['remoteid_netbits'])) {
+ $entered_remote['netbits'] = $pconfig['remoteid_netbits'];
+ }
+ $entered_remoteid_data = ipsec_idinfo_to_cidr($entered_remote, false, $pconfig['mode']);
+ if ($localid_data == $entered_localid_data && $remoteid_data == $entered_remoteid_data) {
+ /* adding new p2 entry */
+ $input_errors[] = gettext("Phase2 with this Local/Remote networks combination is already defined for this Phase1.");
+ break;
+ }
+ }
+ }
+ foreach ($a_phase1 as $phase1) {
+ if ($phase1['ikeid'] == $pconfig['ikeid']) {
+ /* This is the P1 for this entry, validate its remote-gateway and local interface isn't within tunnel */
+ $entered_local = array();
+ $entered_local['type'] = $pconfig['localid_type'];
+ if (isset($pconfig['localid_address'])) {
+ $entered_local['address'] = $pconfig['localid_address'];
+ }
+ if (isset($pconfig['localid_netbits'])) {
+ $entered_local['netbits'] = $pconfig['localid_netbits'];
+ }
+ $entered_localid_data = ipsec_idinfo_to_cidr($entered_local, false, $pconfig['mode']);
+ list($entered_local_network, $entered_local_mask) = explode('/', $entered_localid_data);
+ $entered_remote = array();
+ $entered_remote['type'] = $pconfig['remoteid_type'];
+ if (isset($pconfig['remoteid_address'])) {
+ $entered_remote['address'] = $pconfig['remoteid_address'];
+ }
+ if (isset($pconfig['remoteid_netbits'])) {
+ $entered_remote['netbits'] = $pconfig['remoteid_netbits'];
+ }
+ $entered_remoteid_data = ipsec_idinfo_to_cidr($entered_remote, false, $pconfig['mode']);
+ list($entered_remote_network, $entered_remote_mask) = explode('/', $entered_remoteid_data);
+ if ($phase1['protocol'] == "inet6") {
+ $if = get_failover_interface($phase1['interface'], "inet6");
+ $interfaceip = get_interface_ipv6($if);
+ } else {
+ $if = get_failover_interface($phase1['interface']);
+ $interfaceip = get_interface_ip($if);
+ }
+ /* skip validation for hostnames, they're subject to change anyway */
+ if (is_ipaddr($phase1['remote-gateway'])) {
+ if ($pconfig['mode'] == "tunnel") {
+ if (check_subnets_overlap($interfaceip, 32, $entered_local_network, $entered_local_mask) && check_subnets_overlap($phase1['remote-gateway'], 32, $entered_remote_network, $entered_remote_mask)) {
+ $input_errors[] = gettext("The local and remote networks of a phase 2 entry cannot overlap the outside of the tunnel (interface and remote gateway) configured in its phase 1.");
+ break;
+ }
+ } else if ($pconfig['mode'] == "tunnel6") {
+ if (check_subnetsv6_overlap($interfaceip, 128, $entered_local_network, $entered_local_mask) && check_subnets_overlap($phase1['remote-gateway'], 128, $entered_remote_network, $entered_remote_mask)) {
+ $input_errors[] = gettext("The local and remote networks of a phase 2 entry cannot overlap the outside of the tunnel (interface and remote gateway) configured in its phase 1.");
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* For ESP protocol, handle encryption algorithms */
+ if ($pconfig['proto'] == "esp") {
+ $ealgos = pconfig_to_ealgos($pconfig);
+
+ if (!count($ealgos)) {
+ $input_errors[] = gettext("At least one encryption algorithm must be selected.");
+ } else {
+ foreach ($ealgos as $ealgo) {
+ if (isset($config['system']['crypto_hardware'])) {
+ if ($config['system']['crypto_hardware'] == "glxsb") {
+ if ($ealgo['name'] == "aes" && $ealgo['keylen'] != "128") {
+ $input_errors[] = gettext("Only 128 bit AES can be used where the glxsb crypto accelerator is enabled.");
+ }
+ }
+ }
+ if (empty($pconfig['halgos'])) {
+ if (!strpos($ealgo['name'], "gcm")) {
+ $input_errors[] = gettext("At least one hashing algorithm needs to be selected.");
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (($_POST['lifetime'] && !is_numeric($_POST['lifetime']))) {
+ $input_errors[] = gettext("The P2 lifetime must be an integer.");
+ }
+
+ if (!$input_errors) {
+
+ $ph2ent = array();
+ $ph2ent['ikeid'] = $pconfig['ikeid'];
+ $ph2ent['uniqid'] = $pconfig['uniqid'];
+ $ph2ent['mode'] = $pconfig['mode'];
+ $ph2ent['disabled'] = $pconfig['disabled'] ? true : false;
+ if (!isset($pconfig['reqid'])) {
+ $ph2ent['reqid'] = ipsec_new_reqid();
+ } else {
+ $ph2ent['reqid'] = $pconfig['reqid'];
+ }
+
+ if (($ph2ent['mode'] == "tunnel") || ($ph2ent['mode'] == "tunnel6")) {
+ if (!empty($pconfig['natlocalid_address'])) {
+ $ph2ent['natlocalid'] = pconfig_to_idinfo("natlocal", $pconfig);
+ }
+ $ph2ent['localid'] = pconfig_to_idinfo("local", $pconfig);
+ $ph2ent['remoteid'] = pconfig_to_idinfo("remote", $pconfig);
+ }
+
+ $ph2ent['protocol'] = $pconfig['proto'];
+ $ph2ent['encryption-algorithm-option'] = $ealgos;
+ if (!empty($pconfig['halgos'])) {
+ $ph2ent['hash-algorithm-option'] = $pconfig['halgos'];
+ } else {
+ unset($ph2ent['hash-algorithm-option']);
+ }
+ $ph2ent['pfsgroup'] = $pconfig['pfsgroup'];
+ $ph2ent['lifetime'] = $pconfig['lifetime'];
+ $ph2ent['pinghost'] = $pconfig['pinghost'];
+ $ph2ent['descr'] = $pconfig['descr'];
+
+ if (isset($pconfig['mobile'])) {
+ $ph2ent['mobile'] = true;
+ }
+
+ if ($ph2found === true && $a_phase2[$p2index]) {
+ $a_phase2[$p2index] = $ph2ent;
+ } else {
+ $a_phase2[] = $ph2ent;
+ }
+
+ write_config();
+ mark_subsystem_dirty('ipsec');
+
+ header("Location: vpn_ipsec.php");
+ exit;
+ }
+}
+
+if ($pconfig['mobile']) {
+ $pgtitle = array(gettext("VPN"), gettext("IPsec"), gettext("Edit Phase 2"), gettext("Mobile Client"));
+} else {
+ $pgtitle = array(gettext("VPN"), gettext("IPsec"), gettext("Edit Phase 2"));
+}
+$shortcut_section = "ipsec";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript" src="/javascript/jquery.ipv4v6ify.js"></script>
+<script type="text/javascript">
+//<![CDATA[
+
+function change_mode() {
+ index = document.iform.mode.selectedIndex;
+ value = document.iform.mode.options[index].value;
+ if ((value == 'tunnel') || (value == 'tunnel6')) {
+ document.getElementById('opt_localid').style.display = '';
+<?php if (!isset($pconfig['mobile'])): ?>
+ document.getElementById('opt_remoteid').style.display = '';
+<?php endif; ?>
+ } else {
+ document.getElementById('opt_localid').style.display = 'none';
+<?php if (!isset($pconfig['mobile'])): ?>
+ document.getElementById('opt_remoteid').style.display = 'none';
+<?php endif; ?>
+ }
+}
+
+function typesel_change_natlocal(bits) {
+ var value = document.iform.mode.options[index].value;
+ if (typeof(bits) === "undefined") {
+ if (value === "tunnel") {
+ bits = 24;
+ } else if (value === "tunnel6") {
+ bits = 64;
+ }
+ }
+ var address_is_blank = !/\S/.test(document.iform.natlocalid_address.value);
+ switch (document.iform.natlocalid_type.selectedIndex) {
+ case 0: /* single */
+ document.iform.natlocalid_address.disabled = 0;
+ if (address_is_blank) {
+ document.iform.natlocalid_netbits.value = 0;
+ }
+ document.iform.natlocalid_netbits.disabled = 1;
+ break;
+ case 1: /* network */
+ document.iform.natlocalid_address.disabled = 0;
+ if (address_is_blank) {
+ document.iform.natlocalid_netbits.value = bits;
+ }
+ document.iform.natlocalid_netbits.disabled = 0;
+ break;
+ case 3: /* none */
+ document.iform.natlocalid_address.disabled = 1;
+ document.iform.natlocalid_netbits.disabled = 1;
+ break;
+ default:
+ document.iform.natlocalid_address.value = "";
+ document.iform.natlocalid_address.disabled = 1;
+ if (address_is_blank) {
+ document.iform.natlocalid_netbits.value = 0;
+ }
+ document.iform.natlocalid_netbits.disabled = 1;
+ break;
+ }
+}
+
+function typesel_change_local(bits) {
+ var value = document.iform.mode.options[index].value;
+ if (typeof(bits) === "undefined") {
+ if (value === "tunnel") {
+ bits = 24;
+ } else if (value === "tunnel6") {
+ bits = 64;
+ }
+ }
+ var address_is_blank = !/\S/.test(document.iform.localid_address.value);
+ switch (document.iform.localid_type.selectedIndex) {
+ case 0: /* single */
+ document.iform.localid_address.disabled = 0;
+ if (address_is_blank) {
+ document.iform.localid_netbits.value = 0;
+ }
+ document.iform.localid_netbits.disabled = 1;
+ break;
+ case 1: /* network */
+ document.iform.localid_address.disabled = 0;
+ if (address_is_blank) {
+ document.iform.localid_netbits.value = bits;
+ }
+ document.iform.localid_netbits.disabled = 0;
+ break;
+ case 3: /* none */
+ document.iform.localid_address.disabled = 1;
+ document.iform.localid_netbits.disabled = 1;
+ break;
+ default:
+ document.iform.localid_address.value = "";
+ document.iform.localid_address.disabled = 1;
+ if (address_is_blank) {
+ document.iform.localid_netbits.value = 0;
+ }
+ document.iform.localid_netbits.disabled = 1;
+ break;
+ }
+}
+
+<?php if (!isset($pconfig['mobile'])): ?>
+
+function typesel_change_remote(bits) {
+ var value = document.iform.mode.options[index].value;
+ if (typeof(bits) === "undefined") {
+ if (value === "tunnel") {
+ bits = 24;
+ }
+ else if (value === "tunnel6") {
+ bits = 64;
+ }
+ }
+ var address_is_blank = !/\S/.test(document.iform.remoteid_address.value);
+ switch (document.iform.remoteid_type.selectedIndex) {
+ case 0: /* single */
+ document.iform.remoteid_address.disabled = 0;
+ if (address_is_blank) {
+ document.iform.remoteid_netbits.value = 0;
+ }
+ document.iform.remoteid_netbits.disabled = 1;
+ break;
+ case 1: /* network */
+ document.iform.remoteid_address.disabled = 0;
+ if (address_is_blank) {
+ document.iform.remoteid_netbits.value = bits;
+ }
+ document.iform.remoteid_netbits.disabled = 0;
+ break;
+ default:
+ document.iform.remoteid_address.value = "";
+ document.iform.remoteid_address.disabled = 1;
+ if (address_is_blank) {
+ document.iform.remoteid_netbits.value = 0;
+ }
+ document.iform.remoteid_netbits.disabled = 1;
+ break;
+ }
+}
+
+<?php endif; ?>
+
+function change_protocol() {
+ index = document.iform.proto.selectedIndex;
+ value = document.iform.proto.options[index].value;
+ if (value == 'esp')
+ document.getElementById('opt_enc').style.display = '';
+ else
+ document.getElementById('opt_enc').style.display = 'none';
+}
+
+//]]>
+</script>
+
+<form action="vpn_ipsec_phase2.php" method="post" name="iform" id="iform">
+
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec phase-2">
+ <tr class="tabnavtbl">
+ <td id="tabnav">
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Tunnels"), true, "vpn_ipsec.php");
+ $tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
+ $tab_array[2] = array(gettext("Pre-Shared Keys"), false, "vpn_ipsec_keys.php");
+ $tab_array[3] = array(gettext("Advanced Settings"), false, "vpn_ipsec_settings.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="disabled" type="checkbox" id="disabled" value="yes" <?php if ($pconfig['disabled']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable this phase2 entry"); ?></strong>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Set this option to disable this phase2 entry without removing it from the list"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Mode"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="mode" class="formselect" onchange="change_mode()">
+ <?php
+ foreach ($p2_modes as $name => $value):
+ $selected = "";
+ if ($name == $pconfig['mode']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>" <?=$selected;?>><?=$value;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr id="opt_localid">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Local Network"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="0" summary="local network">
+ <tr>
+ <td><?=gettext("Type"); ?>:&nbsp;&nbsp;</td>
+ <td></td>
+ <td>
+ <select name="localid_type" class="formselect" onchange="typesel_change_local()">
+ <option value="address" <?php if ($pconfig['localid_type'] == "address") echo "selected=\"selected\"";?>><?=gettext("Address"); ?></option>
+ <option value="network" <?php if ($pconfig['localid_type'] == "network") echo "selected=\"selected\"";?>><?=gettext("Network"); ?></option>
+ <?php
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $ifname => $ifdescr):
+ ?>
+ <option value="<?=$ifname; ?>" <?php if ($pconfig['localid_type'] == $ifname) echo "selected=\"selected\"";?>><?=sprintf(gettext("%s subnet"), $ifdescr); ?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
+ <td><?=$mandfldhtmlspc;?></td>
+ <td>
+ <input name="localid_address" type="text" class="formfld unknown ipv4v6" id="localid_address" size="28" value="<?=htmlspecialchars($pconfig['localid_address']);?>" />
+ /
+ <select name="localid_netbits" class="formselect ipv4v6" id="localid_netbits">
+ <?php for ($i = 128; $i >= 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if (isset($pconfig['localid_netbits']) && $i == $pconfig['localid_netbits']) echo "selected=\"selected\""; ?>>
+ <?=$i;?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <br />
+ <?php echo gettext("In case you need NAT/BINAT on this network specify the address to be translated"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Type"); ?>:&nbsp;&nbsp;</td>
+ <td></td>
+ <td>
+ <select name="natlocalid_type" class="formselect" onchange="typesel_change_natlocal()">
+ <option value="address" <?php if ($pconfig['natlocalid_type'] == "address") echo "selected=\"selected\"";?>><?=gettext("Address"); ?></option>
+ <option value="network" <?php if ($pconfig['natlocalid_type'] == "network") echo "selected=\"selected\"";?>><?=gettext("Network"); ?></option>
+ <?php
+ $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $ifname => $ifdescr):
+ ?>
+ <option value="<?=$ifname; ?>" <?php if ($pconfig['natlocalid_type'] == $ifname) echo "selected=\"selected\"";?>><?=sprintf(gettext("%s subnet"), $ifdescr); ?></option>
+ <?php endforeach; ?>
+ <option value="none" <?php if (empty($pconfig['natlocalid_type']) || $pconfig['natlocalid_type'] == "none") echo "selected=\"selected\"";?>><?=gettext("None"); ?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address:");?>&nbsp;&nbsp;</td>
+ <td><?=$mandfldhtmlspc;?></td>
+ <td>
+ <input name="natlocalid_address" type="text" class="formfld unknown ipv4v6" id="natlocalid_address" size="28" value="<?=htmlspecialchars($pconfig['natlocalid_address']);?>" />
+ /
+ <select name="natlocalid_netbits" class="formselect ipv4v6" id="natlocalid_netbits">
+ <?php for ($i = 128; $i >= 0; $i--): ?>
+ <option value="<?=$i;?>" <?php if (isset($pconfig['natlocalid_netbits']) && $i == $pconfig['natlocalid_netbits']) echo "selected=\"selected\""; ?>>
+ <?=$i;?>
+ </option>
+ <?php endfor; ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <?php if (!isset($pconfig['mobile'])): ?>
+
+ <tr id="opt_remoteid">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote Network"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="0" summary="remote network">
+ <tr>
+ <td><?=gettext("Type"); ?>:&nbsp;&nbsp;</td>
+ <td></td>
+ <td>
+ <select name="remoteid_type" class="formselect" onchange="typesel_change_remote()">
+ <option value="address" <?php if ($pconfig['remoteid_type'] == "address") echo "selected=\"selected\""; ?>><?=gettext("Address"); ?></option>
+ <option value="network" <?php if ($pconfig['remoteid_type'] == "network") echo "selected=\"selected\""; ?>><?=gettext("Network"); ?></option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td><?=gettext("Address"); ?>:&nbsp;&nbsp;</td>
+ <td><?=$mandfldhtmlspc;?></td>
+ <td>
+ <input name="remoteid_address" type="text" class="formfld unknown ipv4v6" id="remoteid_address" size="28" value="<?=htmlspecialchars($pconfig['remoteid_address']);?>" />
+ /
+ <select name="remoteid_netbits" class="formselect ipv4v6" id="remoteid_netbits">
+ <?php for ($i = 128; $i >= 0; $i--) {
+
+ echo "<option value=\"{$i}\"";
+ if (isset($pconfig['remoteid_netbits']) && $i == $pconfig['remoteid_netbits']) echo " selected=\"selected\"";
+ echo ">{$i}</option>\n";
+ } ?>
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <?php endif; ?>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ <span class="vexpl">
+ <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic">
+ <?=gettext("Phase 2 proposal (SA/Key Exchange)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="proto" class="formselect" onchange="change_protocol()">
+ <?php foreach ($p2_protos as $proto => $protoname): ?>
+ <option value="<?=$proto;?>" <?php if ($proto == $pconfig['proto']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($protoname);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <span class="vexpl">
+ <?=gettext("ESP is encryption, AH is authentication only"); ?>
+ </span>
+ </td>
+ </tr>
+ <tr id="opt_enc">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Encryption algorithms"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellspacing="0" cellpadding="0" summary="encryption">
+ <?php
+ foreach ($p2_ealgos as $algo => $algodata):
+ $checked = '';
+ if (is_array($pconfig['ealgos']) && in_array($algo, $pconfig['ealgos'])) {
+ $checked = " checked=\"checked\"";
+ }
+ ?>
+ <tr>
+ <td>
+ <input type="checkbox" name="ealgos[]" value="<?=$algo;?>"<?=$checked?> />
+ </td>
+ <td>
+ <?=htmlspecialchars($algodata['name']);?>
+ </td>
+ <td>
+ <?php if (is_array($algodata['keysel'])): ?>
+ &nbsp;&nbsp;
+ <select name="keylen_<?=$algo;?>" class="formselect">
+ <option value="auto"><?=gettext("auto"); ?></option>
+ <?php
+ $key_hi = $algodata['keysel']['hi'];
+ $key_lo = $algodata['keysel']['lo'];
+ $key_step = $algodata['keysel']['step'];
+ for ($keylen = $key_hi; $keylen >= $key_lo; $keylen -= $key_step):
+ $selected = "";
+ // if ($checked && in_array("keylen_".$algo, $pconfig))
+ if ($keylen == $pconfig["keylen_".$algo]) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$keylen;?>"<?=$selected;?>><?=$keylen;?> <?=gettext("bits"); ?></option>
+ <?php endfor; ?>
+ </select>
+ <?php endif; ?>
+ </td>
+ </tr>
+
+ <?php endforeach; ?>
+
+ </table>
+ <br />
+ <?=gettext("Hint: use 3DES for best compatibility or if you have a hardware " .
+ "crypto accelerator card. Blowfish is usually the fastest in " .
+ "software encryption"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hash algorithms"); ?></td>
+ <td width="78%" class="vtable">
+ <?php foreach ($p2_halgos as $algo => $algoname): ?>
+ <input type="checkbox" name="halgos[]" value="<?=$algo;?>" <?php if (in_array($algo, $pconfig['halgos'])) echo "checked=\"checked\""; ?> />
+ <?=htmlspecialchars($algoname);?>
+ <br />
+ <?php endforeach; ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("PFS key group"); ?></td>
+ <td width="78%" class="vtable">
+ <?php if (!isset($pconfig['mobile']) || !isset($a_client['pfs_group'])): ?>
+ <select name="pfsgroup" class="formselect">
+ <?php foreach ($p2_pfskeygroups as $keygroup => $keygroupname): ?>
+ <option value="<?=$keygroup;?>" <?php if ($keygroup == $pconfig['pfsgroup']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($keygroupname);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?php else: ?>
+
+ <select class="formselect" disabled="disabled">
+ <option selected="selected"><?=$p2_pfskeygroups[$a_client['pfs_group']];?></option>
+ </select>
+ <input name="pfsgroup" type="hidden" value="<?=htmlspecialchars($pconfig['pfsgroup']);?>" />
+ <br />
+ <span class="vexpl"><em><?=gettext("Set globally in mobile client options"); ?></em></span>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Lifetime"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="lifetime" type="text" class="formfld unknown" id="lifetime" size="20" value="<?=htmlspecialchars($pconfig['lifetime']);?>" />
+ <?=gettext("seconds"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced Options"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Automatically ping host"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="pinghost" type="text" class="formfld unknown" id="pinghost" size="28" value="<?=htmlspecialchars($pconfig['pinghost']);?>" />
+ <?=gettext("IP address"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <?php if ($pconfig['mobile']): ?>
+ <input name="mobile" type="hidden" value="true" />
+ <input name="remoteid_type" type="hidden" value="mobile" />
+ <?php endif; ?>
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input name="ikeid" type="hidden" value="<?=htmlspecialchars($pconfig['ikeid']);?>" />
+ <?php if (!empty($pconfig['reqid'])): ?>
+ <input name="reqid" type="hidden" value="<?=htmlspecialchars($pconfig['reqid']);?>" />
+ <?php endif; ?>
+ <input name="uniqid" type="hidden" value="<?=htmlspecialchars($pconfig['uniqid']);?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+change_mode('<?=htmlspecialchars($pconfig['mode'])?>');
+change_protocol('<?=htmlspecialchars($pconfig['proto'])?>');
+typesel_change_local(<?=htmlspecialchars($pconfig['localid_netbits'])?>);
+typesel_change_natlocal(<?=htmlspecialchars($pconfig['natlocalid_netbits'])?>);
+<?php if (!isset($pconfig['mobile'])): ?>
+typesel_change_remote(<?=htmlspecialchars($pconfig['remoteid_netbits'])?>);
+<?php endif; ?>
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
+
+<?php
+
+/* local utility functions */
+
+function pconfig_to_ealgos(& $pconfig) {
+ global $p2_ealgos;
+
+ $ealgos = array();
+ if (is_array($pconfig['ealgos'])) {
+ foreach ($p2_ealgos as $algo_name => $algo_data) {
+ if (in_array($algo_name, $pconfig['ealgos'])) {
+ $ealg = array();
+ $ealg['name'] = $algo_name;
+ if (is_array($algo_data['keysel'])) {
+ $ealg['keylen'] = $_POST["keylen_".$algo_name];
+ }
+ $ealgos[] = $ealg;
+ }
+ }
+ }
+
+ return $ealgos;
+}
+
+function ealgos_to_pconfig(& $ealgos,& $pconfig) {
+
+ $pconfig['ealgos'] = array();
+ foreach ($ealgos as $algo_data) {
+ $pconfig['ealgos'][] = $algo_data['name'];
+ if (isset($algo_data['keylen'])) {
+ $pconfig["keylen_".$algo_data['name']] = $algo_data['keylen'];
+ }
+ }
+
+ return $ealgos;
+}
+
+function pconfig_to_idinfo($prefix,& $pconfig) {
+
+ $type = $pconfig[$prefix."id_type"];
+ $address = $pconfig[$prefix."id_address"];
+ $netbits = $pconfig[$prefix."id_netbits"];
+
+ switch ($type) {
+ case "address":
+ return array('type' => $type, 'address' => $address);
+ case "network":
+ return array('type' => $type, 'address' => $address, 'netbits' => $netbits);
+ default:
+ return array('type' => $type);
+ }
+}
+
+function idinfo_to_pconfig($prefix,& $idinfo,& $pconfig) {
+
+ switch ($idinfo['type']) {
+ case "address":
+ $pconfig[$prefix."id_type"] = $idinfo['type'];
+ $pconfig[$prefix."id_address"] = $idinfo['address'];
+ break;
+ case "network":
+ $pconfig[$prefix."id_type"] = $idinfo['type'];
+ $pconfig[$prefix."id_address"] = $idinfo['address'];
+ $pconfig[$prefix."id_netbits"] = $idinfo['netbits'];
+ break;
+ default:
+ $pconfig[$prefix."id_type"] = $idinfo['type'];
+ break;
+ }
+}
+
+?>
diff --git a/src/usr/local/www/vpn_ipsec_settings.php b/src/usr/local/www/vpn_ipsec_settings.php
new file mode 100644
index 0000000..ac3fde9
--- /dev/null
+++ b/src/usr/local/www/vpn_ipsec_settings.php
@@ -0,0 +1,445 @@
+<?php
+/*
+ vpn_ipsec_settings.php
+
+ Copyright (C) 2015 Electric Sheep Fencing, LLC
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-ipsec-settings
+##|*NAME=VPN: IPsec: Settings page
+##|*DESCR=Allow access to the 'VPN: IPsec: Settings' page.
+##|*MATCH=vpn_ipsec_settings.php*
+##|-PRIV
+
+require("functions.inc");
+require("guiconfig.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+
+foreach ($ipsec_loglevels as $lkey => $ldescr) {
+ if (!empty($config['ipsec']["ipsec_{$lkey}"])) {
+ $pconfig["ipsec_{$lkey}"] = $config['ipsec']["ipsec_{$lkey}"];
+ }
+}
+$pconfig['unityplugin'] = isset($config['ipsec']['unityplugin']);
+$pconfig['strictcrlpolicy'] = isset($config['ipsec']['strictcrlpolicy']);
+$pconfig['makebeforebreak'] = isset($config['ipsec']['makebeforebreak']);
+$pconfig['noshuntlaninterfaces'] = isset($config['ipsec']['noshuntlaninterfaces']);
+$pconfig['compression'] = isset($config['ipsec']['compression']);
+$pconfig['enableinterfacesuse'] = isset($config['ipsec']['enableinterfacesuse']);
+$pconfig['acceptunencryptedmainmode'] = isset($config['ipsec']['acceptunencryptedmainmode']);
+$pconfig['maxmss_enable'] = isset($config['system']['maxmss_enable']);
+$pconfig['maxmss'] = $config['system']['maxmss'];
+$pconfig['uniqueids'] = $config['ipsec']['uniqueids'];
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (!in_array($pconfig['ipsec_dmn'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Daemon debug.";
+ }
+ if (!in_array($pconfig['ipsec_mgr'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for SA Manager debug.";
+ }
+ if (!in_array($pconfig['ipsec_ike'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for IKE SA debug.";
+ }
+ if (!in_array($pconfig['ipsec_chd'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for IKE Child SA debug.";
+ }
+ if (!in_array($pconfig['ipsec_job'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Job Processing debug.";
+ }
+ if (!in_array($pconfig['ipsec_cfg'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Configuration backend debug.";
+ }
+ if (!in_array($pconfig['ipsec_knl'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Kernel Interface debug.";
+ }
+ if (!in_array($pconfig['ipsec_net'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Networking debug.";
+ }
+ if (!in_array($pconfig['ipsec_asn'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for ASN Encoding debug.";
+ }
+ if (!in_array($pconfig['ipsec_enc'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Message encoding debug.";
+ }
+ if (!in_array($pconfig['ipsec_imc'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Integrity checker debug.";
+ }
+ if (!in_array($pconfig['ipsec_imv'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Integrity Verifier debug.";
+ }
+ if (!in_array($pconfig['ipsec_pts'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for Platform Trust Service debug.";
+ }
+ if (!in_array($pconfig['ipsec_tls'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for TLS Handler debug.";
+ }
+ if (!in_array($pconfig['ipsec_esp'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for IPsec Traffic debug.";
+ }
+ if (!in_array($pconfig['ipsec_lib'], array('0', '1', '2', '3', '4', '5'), true)) {
+ $input_errors[] = "A valid value must be specified for StrongSwan Lib debug.";
+ }
+ if (isset($pconfig['maxmss'])) {
+ if (!is_numericint($pconfig['maxmss']) && $pconfig['maxmss'] <> '') {
+ $input_errors[] = "An integer must be specified for Maximum MSS.";
+ }
+ if ($pconfig['maxmss'] <> '' && $pconfig['maxmss'] < 576 || $pconfig['maxmss'] > 65535) {
+ $input_errors[] = "An integer between 576 and 65535 must be specified for Maximum MSS";
+ }
+ }
+
+ if (!$input_errors) {
+
+ foreach ($ipsec_loglevels as $lkey => $ldescr) {
+ if (empty($_POST["ipsec_{$lkey}"])) {
+ if (isset($config['ipsec']["ipsec_{$lkey}"])) {
+ unset($config['ipsec']["ipsec_{$lkey}"]);
+ }
+ } else {
+ $config['ipsec']["ipsec_{$lkey}"] = $_POST["ipsec_{$lkey}"];
+ }
+ }
+
+ $needsrestart = false;
+
+ if ($_POST['compression'] == "yes") {
+ if (!isset($config['ipsec']['compression'])) {
+ $needsrestart = true;
+ }
+ $config['ipsec']['compression'] = true;
+ } elseif (isset($config['ipsec']['compression'])) {
+ $needsrestart = true;
+ unset($config['ipsec']['compression']);
+ }
+
+ if ($_POST['enableinterfacesuse'] == "yes") {
+ if (!isset($config['ipsec']['enableinterfacesuse'])) {
+ $needsrestart = true;
+ }
+ $config['ipsec']['enableinterfacesuse'] = true;
+ } elseif (isset($config['ipsec']['enableinterfacesuse'])) {
+ $needsrestart = true;
+ unset($config['ipsec']['enableinterfacesuse']);
+ }
+
+ if ($_POST['unityplugin'] == "yes") {
+ if (!isset($config['ipsec']['unityplugin'])) {
+ $needsrestart = true;
+ }
+ $config['ipsec']['unityplugin'] = true;
+ } elseif (isset($config['ipsec']['unityplugin'])) {
+ $needsrestart = true;
+ unset($config['ipsec']['unityplugin']);
+ }
+
+ if ($_POST['strictcrlpolicy'] == "yes") {
+ $config['ipsec']['strictcrlpolicy'] = true;
+ } elseif (isset($config['ipsec']['strictcrlpolicy'])) {
+ unset($config['ipsec']['strictcrlpolicy']);
+ }
+
+ if ($_POST['makebeforebreak'] == "yes") {
+ $config['ipsec']['makebeforebreak'] = true;
+ } elseif (isset($config['ipsec']['makebeforebreak'])) {
+ unset($config['ipsec']['makebeforebreak']);
+ }
+
+ if ($_POST['noshuntlaninterfaces'] == "yes") {
+ if (isset($config['ipsec']['noshuntlaninterfaces'])) {
+ unset($config['ipsec']['noshuntlaninterfaces']);
+ }
+ } else {
+ $config['ipsec']['noshuntlaninterfaces'] = true;
+ }
+
+ if ($_POST['acceptunencryptedmainmode'] == "yes") {
+ if (!isset($config['ipsec']['acceptunencryptedmainmode'])) {
+ $needsrestart = true;
+ }
+ $config['ipsec']['acceptunencryptedmainmode'] = true;
+ } elseif (isset($config['ipsec']['acceptunencryptedmainmode'])) {
+ $needsrestart = true;
+ unset($config['ipsec']['acceptunencryptedmainmode']);
+ }
+
+ if (!empty($_POST['uniqueids'])) {
+ $config['ipsec']['uniqueids'] = $_POST['uniqueids'];
+ } else if (isset($config['ipsec']['uniqueids'])) {
+ unset($config['ipsec']['uniqueids']);
+ }
+
+ if ($_POST['maxmss_enable'] == "yes") {
+ $config['system']['maxmss_enable'] = true;
+ $config['system']['maxmss'] = $_POST['maxmss'];
+ } else {
+ if (isset($config['system']['maxmss_enable'])) {
+ unset($config['system']['maxmss_enable']);
+ }
+ if (isset($config['system']['maxmss'])) {
+ unset($config['system']['maxmss']);
+ }
+ }
+
+ write_config();
+
+ $retval = 0;
+ $retval = filter_configure();
+ if (stristr($retval, "error") <> true) {
+ $savemsg = get_std_save_message(gettext($retval));
+ } else {
+ $savemsg = gettext($retval);
+ }
+
+ vpn_ipsec_configure($needsrestart);
+ vpn_ipsec_configure_loglevels();
+
+ header("Location: vpn_ipsec_settings.php");
+ return;
+ }
+
+ // The logic value sent by $POST is opposite to the way it is stored in the config.
+ // Reset the $pconfig value so it reflects the opposite of what was $POSTed.
+ if ($_POST['noshuntlaninterfaces'] == "yes") {
+ $pconfig['noshuntlaninterfaces'] = false;
+ } else {
+ $pconfig['noshuntlaninterfaces'] = true;
+ }
+}
+
+$pgtitle = array(gettext("VPN"), gettext("IPsec"), gettext("Settings"));
+$shortcut_section = "ipsec";
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+
+function maxmss_checked(obj) {
+ if (obj.checked) {
+ jQuery('#maxmss').attr('disabled', false);
+ } else {
+ jQuery('#maxmss').attr('disabled', 'true');
+ }
+}
+
+//]]>
+</script>
+
+<form action="vpn_ipsec_settings.php" method="post" name="iform" id="iform">
+
+<?php
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn ipsec settings">
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Tunnels"), false, "vpn_ipsec.php");
+ $tab_array[1] = array(gettext("Mobile clients"), false, "vpn_ipsec_mobile.php");
+ $tab_array[2] = array(gettext("Pre-Shared Key"), false, "vpn_ipsec_keys.php");
+ $tab_array[3] = array(gettext("Advanced Settings"), true, "vpn_ipsec_settings.php");
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td id="mainarea">
+ <div class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("IPsec Advanced Settings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPsec Debug"); ?></td>
+ <td width="78%" class="vtable">
+ <strong><?=gettext("Start IPsec in debug mode based on sections selected"); ?></strong>
+ <br />
+ <table summary="ipsec debug">
+ <?php foreach ($ipsec_loglevels as $lkey => $ldescr): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=$ldescr;?></td>
+ <td width="78%" valign="top" class="vncell">
+ <?php
+ echo "<select name=\"ipsec_{$lkey}\" id=\"ipsec_{$lkey}\">\n";
+ foreach (array("Silent", "Audit", "Control", "Diag", "Raw", "Highest") as $lidx => $lvalue) {
+ echo "<option value=\"{$lidx}\" ";
+ if ($pconfig["ipsec_{$lkey}"] == $lidx) {
+ echo "selected=\"selected\"";
+ }
+ echo ">{$lvalue}</option>\n";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ <tr style="display:none;">
+ <td></td>
+ </tr>
+ </table>
+ <br /><?=gettext("Launches IPsec in debug mode so that more verbose logs " .
+ "will be generated to aid in troubleshooting."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Unique IDs"); ?></td>
+ <td width="78%" class="vtable">
+ <strong><?=gettext("Configure Unique IDs as: "); ?></strong>
+ <?php
+ echo "<select name=\"uniqueids\" id=\"uniqueids\">\n";
+ foreach ($ipsec_idhandling as $value => $lvalue) {
+ echo "<option value=\"{$value}\" ";
+ if ($pconfig['uniqueids'] == $value) {
+ echo "selected=\"selected\"";
+ }
+ echo ">{$lvalue}</option>\n";
+ }
+ ?>
+ </select>
+ <br />
+ <?=gettext("whether a particular participant ID should be kept unique, with any new IKE_SA using an ID " .
+ "deemed to replace all old ones using that ID. Participant IDs normally are unique, so a new " .
+ "IKE_SA using the same ID is almost invariably intended to replace an old one. " .
+ "The difference between <b>no</b> and <b>never</b> is that the old IKE_SAs will be replaced when receiving an " .
+ "INITIAL_CONTACT notify if the option is no but will ignore these notifies if <b>never</b> is configured. " .
+ "The daemon also accepts the value <b>keep</b> to reject " .
+ "new IKE_SA setups and keep the duplicate established earlier. Defaults to Yes."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IP Compression"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="compression" type="checkbox" id="compression" value="yes" <?php if ($pconfig['compression']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable IPCompression"); ?></strong>
+ <br />
+ <?=gettext("IPComp compression of content is proposed on the connection."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Strict interface binding"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="enableinterfacesuse" type="checkbox" id="enableinterfacesuse" value="yes" <?php if ($pconfig['enableinterfacesuse']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable strict interface binding"); ?></strong>
+ <br />
+ <?=gettext("Enable strongSwan's interfaces_use option to bind specific interfaces only. This option is known to break IPsec with dynamic IP interfaces. This is not recommended at this time."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Unencrypted payloads in IKEv1 Main Mode"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="acceptunencryptedmainmode" type="checkbox" id="acceptunencryptedmainmode" value="yes" <?php if ($pconfig['acceptunencryptedmainmode']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Accept unencrypted ID and HASH payloads in IKEv1 Main Mode"); ?></strong>
+ <br />
+ <?=gettext("Some implementations send the third Main Mode message unencrypted, probably to find the PSKs for the specified ID for authentication." .
+ "This is very similar to Aggressive Mode, and has the same security implications: " .
+ "A passive attacker can sniff the negotiated Identity, and start brute forcing the PSK using the HASH payload." .
+ " It is recommended to keep this option to no, unless you know exactly what the implications are and require compatibility to such devices (for example, some SonicWall boxes).");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Maximum MSS"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="maxmss_enable" type="checkbox" id="maxmss_enable" value="yes" <?php if ($pconfig['maxmss_enable'] == true) echo "checked=\"checked\""; ?> onclick="maxmss_checked(this)" />
+ <strong><?=gettext("Enable MSS clamping on VPN traffic"); ?></strong>
+ <br />
+ <input name="maxmss" id="maxmss" value="<?php if ($pconfig['maxmss'] <> "") echo htmlspecialchars($pconfig['maxmss']); else "1400"; ?>" class="formfld unknown" <?php if ($pconfig['maxmss_enable'] == false) echo "disabled=\"disabled\""; ?> />
+ <br />
+ <?=gettext("Enable MSS clamping on TCP flows over VPN. " .
+ "This helps overcome problems with PMTUD on IPsec VPN links. If left blank, the default value is 1400 bytes. "); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable Cisco Extensions"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="unityplugin" type="checkbox" id="unityplugin" value="yes" <?php if ($pconfig['unityplugin'] == true) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Disable Unity Plugin"); ?></strong>
+ <br />
+ <?=gettext("Disable Unity Plugin which provides Cisco Extension support as Split-Include, Split-Exclude, Split-Dns, ..."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Strict CRL Checking"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="strictcrlpolicy" type="checkbox" id="strictcrlpolicy" value="yes" <?php if ($pconfig['strictcrlpolicy'] == true) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable strict Certificate Revocation List checking"); ?></strong>
+ <br />
+ <?=gettext("Check this to require availability of a fresh CRL for peer authentication based on RSA signatures to succeed."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Make before Break"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="makebeforebreak" type="checkbox" id="makebeforebreak" value="yes" <?php if ($pconfig['makebeforebreak'] == true) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Initiate IKEv2 reauthentication with a make-before-break"); ?></strong>
+ <br />
+ <?=gettext("instead of a break-before-make scheme. Make-before-break uses overlapping IKE and CHILD_SA during reauthentication " .
+ "by first recreating all new SAs before deleting the old ones. This behavior can be beneficial to avoid connectivity gaps " .
+ "during reauthentication, but requires support for overlapping SAs by the peer.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Auto-exclude LAN address"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="noshuntlaninterfaces" type="checkbox" id="noshuntlaninterfaces" value="yes" <?php if ($pconfig['noshuntlaninterfaces'] != true) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable bypass for LAN interface IP"); ?></strong>
+ <br />
+ <?=gettext("Exclude traffic from LAN subnet to LAN IP address from IPsec."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_l2tp.php b/src/usr/local/www/vpn_l2tp.php
new file mode 100644
index 0000000..88f4eae
--- /dev/null
+++ b/src/usr/local/www/vpn_l2tp.php
@@ -0,0 +1,493 @@
+<?php
+/*
+ vpn_l2tp.php
+ part of pfSense
+
+ Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-vpnl2tp
+##|*NAME=VPN: VPN L2TP page
+##|*DESCR=Allow access to the 'VPN: VPN L2TP' page.
+##|*MATCH=vpn_l2tp.php*
+##|-PRIV
+
+$pgtitle = array(gettext("VPN"), gettext("L2TP"), gettext("L2TP"));
+$shortcut_section = "l2tps";
+
+require("guiconfig.inc");
+require_once("vpn.inc");
+
+if (!is_array($config['l2tp']['radius'])) {
+ $config['l2tp']['radius'] = array();
+}
+$l2tpcfg = &$config['l2tp'];
+
+$pconfig['remoteip'] = $l2tpcfg['remoteip'];
+$pconfig['localip'] = $l2tpcfg['localip'];
+$pconfig['l2tp_subnet'] = $l2tpcfg['l2tp_subnet'];
+$pconfig['mode'] = $l2tpcfg['mode'];
+$pconfig['interface'] = $l2tpcfg['interface'];
+$pconfig['l2tp_dns1'] = $l2tpcfg['dns1'];
+$pconfig['l2tp_dns2'] = $l2tpcfg['dns2'];
+$pconfig['wins'] = $l2tpcfg['wins'];
+$pconfig['radiusenable'] = isset($l2tpcfg['radius']['enable']);
+$pconfig['radacct_enable'] = isset($l2tpcfg['radius']['accounting']);
+$pconfig['radiusserver'] = $l2tpcfg['radius']['server'];
+$pconfig['radiussecret'] = $l2tpcfg['radius']['secret'];
+$pconfig['radiusissueips'] = $l2tpcfg['radius']['radiusissueips'];
+$pconfig['n_l2tp_units'] = $l2tpcfg['n_l2tp_units'];
+$pconfig['paporchap'] = $l2tpcfg['paporchap'];
+$pconfig['secret'] = $l2tpcfg['secret'];
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['mode'] == "server") {
+ $reqdfields = explode(" ", "localip remoteip");
+ $reqdfieldsn = array(gettext("Server address"), gettext("Remote start address"));
+
+ if ($_POST['radiusenable']) {
+ $reqdfields = array_merge($reqdfields, explode(" ", "radiusserver radiussecret"));
+ $reqdfieldsn = array_merge($reqdfieldsn,
+ array(gettext("RADIUS server address"), gettext("RADIUS shared secret")));
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_POST['localip'] && !is_ipaddr($_POST['localip']))) {
+ $input_errors[] = gettext("A valid server address must be specified.");
+ }
+ if (is_ipaddr_configured($_POST['localip'])) {
+ $input_errors[] = gettext("'Server address' parameter should NOT be set to any IP address currently in use on this firewall.");
+ }
+ if (($_POST['l2tp_subnet'] && !is_ipaddr($_POST['remoteip']))) {
+ $input_errors[] = gettext("A valid remote start address must be specified.");
+ }
+ if (($_POST['radiusserver'] && !is_ipaddr($_POST['radiusserver']))) {
+ $input_errors[] = gettext("A valid RADIUS server address must be specified.");
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if (!$input_errors) {
+ $_POST['remoteip'] = $pconfig['remoteip'] = gen_subnet($_POST['remoteip'], $_POST['l2tp_subnet']);
+ $subnet_start = ip2ulong($_POST['remoteip']);
+ $subnet_end = ip2ulong($_POST['remoteip']) + $_POST['n_l2tp_units'] - 1;
+
+ if ((ip2ulong($_POST['localip']) >= $subnet_start) &&
+ (ip2ulong($_POST['localip']) <= $subnet_end)) {
+ $input_errors[] = gettext("The specified server address lies in the remote subnet.");
+ }
+ if ($_POST['localip'] == get_interface_ip("lan")) {
+ $input_errors[] = gettext("The specified server address is equal to the LAN interface address.");
+ }
+ }
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if (!$input_errors) {
+ $l2tpcfg['remoteip'] = $_POST['remoteip'];
+ $l2tpcfg['localip'] = $_POST['localip'];
+ $l2tpcfg['l2tp_subnet'] = $_POST['l2tp_subnet'];
+ $l2tpcfg['mode'] = $_POST['mode'];
+ $l2tpcfg['interface'] = $_POST['interface'];
+ $l2tpcfg['n_l2tp_units'] = $_POST['n_l2tp_units'];
+
+ $l2tpcfg['radius']['server'] = $_POST['radiusserver'];
+ $l2tpcfg['radius']['secret'] = $_POST['radiussecret'];
+ $l2tpcfg['secret'] = $_POST['secret'];
+
+ if ($_POST['wins']) {
+ $l2tpcfg['wins'] = $_POST['wins'];
+ } else {
+ unset($l2tpcfg['wins']);
+ }
+
+ $l2tpcfg['paporchap'] = $_POST['paporchap'];
+
+
+ if ($_POST['l2tp_dns1'] == "") {
+ if (isset($l2tpcfg['dns1'])) {
+ unset($l2tpcfg['dns1']);
+ }
+ } else {
+ $l2tpcfg['dns1'] = $_POST['l2tp_dns1'];
+ }
+
+ if ($_POST['l2tp_dns2'] == "") {
+ if (isset($l2tpcfg['dns2'])) {
+ unset($l2tpcfg['dns2']);
+ }
+ } else {
+ $l2tpcfg['dns2'] = $_POST['l2tp_dns2'];
+ }
+
+ if ($_POST['radiusenable'] == "yes") {
+ $l2tpcfg['radius']['enable'] = true;
+ } else {
+ unset($l2tpcfg['radius']['enable']);
+ }
+
+ if ($_POST['radacct_enable'] == "yes") {
+ $l2tpcfg['radius']['accounting'] = true;
+ } else {
+ unset($l2tpcfg['radius']['accounting']);
+ }
+
+ if ($_POST['radiusissueips'] == "yes") {
+ $l2tpcfg['radius']['radiusissueips'] = true;
+ } else {
+ unset($l2tpcfg['radius']['radiusissueips']);
+ }
+
+ write_config();
+
+ $retval = 0;
+ $retval = vpn_l2tp_configure();
+ $savemsg = get_std_save_message($retval);
+
+ /* if ajax is calling, give them an update message */
+ if (isAjax()) {
+ print_info_box_np($savemsg);
+ }
+ }
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+
+<script type="text/javascript">
+//<![CDATA[
+function get_radio_value(obj) {
+ for (i = 0; i < obj.length; i++) {
+ if (obj[i].checked) {
+ return obj[i].value;
+ }
+ }
+ return null;
+}
+
+function enable_change(enable_over) {
+ if ((get_radio_value(document.iform.mode) == "server") || enable_over) {
+ document.iform.remoteip.disabled = 0;
+ document.iform.localip.disabled = 0;
+ document.iform.l2tp_subnet.disabled = 0;
+ document.iform.radiusenable.disabled = 0;
+ document.iform.radiusissueips.disabled = 0;
+ document.iform.paporchap.disabled = 0;
+ document.iform.interface.disabled = 0;
+ document.iform.n_l2tp_units.disabled = 0;
+ document.iform.secret.disabled = 0;
+ document.iform.l2tp_dns1.disabled = 0;
+ document.iform.l2tp_dns2.disabled = 0;
+ /* fix colors */
+ document.iform.remoteip.style.backgroundColor = '#FFFFFF';
+ document.iform.localip.style.backgroundColor = '#FFFFFF';
+ document.iform.l2tp_subnet.style.backgroundColor = '#FFFFFF';
+ document.iform.radiusenable.style.backgroundColor = '#FFFFFF';
+ document.iform.radiusissueips.style.backgroundColor = '#FFFFFF';
+ document.iform.paporchap.style.backgroundColor = '#FFFFFF';
+ document.iform.interface.style.backgroundColor = '#FFFFFF';
+ document.iform.n_l2tp_units.style.backgroundColor = '#FFFFFF';
+ document.iform.secret.style.backgroundColor = '#FFFFFF';
+ if (document.iform.radiusenable.checked || enable_over) {
+ document.iform.radacct_enable.disabled = 0;
+ document.iform.radiusserver.disabled = 0;
+ document.iform.radiussecret.disabled = 0;
+ document.iform.radiusissueips.disabled = 0;
+ /* fix colors */
+ document.iform.radacct_enable.style.backgroundColor = '#FFFFFF';
+ document.iform.radiusserver.style.backgroundColor = '#FFFFFF';
+ document.iform.radiussecret.style.backgroundColor = '#FFFFFF';
+ document.iform.radiusissueips.style.backgroundColor = '#FFFFFF';
+ } else {
+ document.iform.radacct_enable.disabled = 1;
+ document.iform.radiusserver.disabled = 1;
+ document.iform.radiussecret.disabled = 1;
+ document.iform.radiusissueips.disabled = 1;
+ /* fix colors */
+ document.iform.radacct_enable.style.backgroundColor = '#D4D0C8';
+ document.iform.radiusserver.style.backgroundColor = '#D4D0C8';
+ document.iform.radiussecret.style.backgroundColor = '#D4D0C8';
+ document.iform.radiusissueips.style.backgroundColor = '#D4D0C8';
+ }
+ } else {
+ document.iform.interface.disabled = 1;
+ document.iform.n_l2tp_units.disabled = 1;
+ document.iform.l2tp_subnet.disabled = 1;
+ document.iform.l2tp_dns1.disabled = 1;
+ document.iform.l2tp_dns2.disabled = 1;
+ document.iform.paporchap.disabled = 1;
+ document.iform.remoteip.disabled = 1;
+ document.iform.localip.disabled = 1;
+ document.iform.radiusenable.disabled = 1;
+ document.iform.radacct_enable.disabled = 1;
+ document.iform.radiusserver.disabled = 1;
+ document.iform.radiussecret.disabled = 1;
+ document.iform.radiusissueips.disabled = 1;
+ document.iform.secret.disabled = 1;
+ /* fix colors */
+ document.iform.interface.style.backgroundColor = '#D4D0C8';
+ document.iform.n_l2tp_units.style.backgroundColor = '#D4D0C8';
+ document.iform.l2tp_subnet.style.backgroundColor = '#D4D0C8';
+ document.iform.paporchap.style.backgroundColor = '#D4D0C8';
+ document.iform.remoteip.style.backgroundColor = '#D4D0C8';
+ document.iform.localip.style.backgroundColor = '#D4D0C8';
+ document.iform.radiusenable.style.backgroundColor = '#D4D0C8';
+ document.iform.radacct_enable.style.backgroundColor = '#D4D0C8';
+ document.iform.radiusserver.style.backgroundColor = '#D4D0C8';
+ document.iform.radiussecret.style.backgroundColor = '#D4D0C8';
+ document.iform.radiusissueips.style.backgroundColor = '#D4D0C8';
+ document.iform.secret.style.backgroundColor = '#D4D0C8';
+ }
+}
+//]]>
+</script>
+<form action="vpn_l2tp.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<div id="inputerrors"></div>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn l2tp">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Configuration"), true, "vpn_l2tp.php");
+ $tab_array[1] = array(gettext("Users"), false, "vpn_l2tp_users.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="mode" type="radio" onclick="enable_change(false)" value="off"
+ <?php if (($pconfig['mode'] != "server") && ($pconfig['mode'] != "redir")) echo "checked=\"checked\"";?> />
+ <?=gettext("Off"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input type="radio" name="mode" value="server" onclick="enable_change(false)" <?php if ($pconfig['mode'] == "server") echo "checked=\"checked\""; ?> />
+ <?=gettext("Enable L2TP server"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><b><?=gettext("Interface");?></b></td>
+ <td width="78%" valign="top" class="vtable">
+ <select name="interface" class="formselect" id="interface">
+ <?php
+ $interfaces = get_configured_interface_with_descr();
+ foreach ($interfaces as $iface => $ifacename):
+ ?>
+ <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server Address");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="localip" type="text" class="formfld unknown" id="localip" size="20" value="<?=htmlspecialchars($pconfig['localip']);?>" />
+ <br />
+ <?=gettext("Enter the IP address the L2TP server should give to clients for use as their \"gateway\""); ?>.
+ <br />
+ <?=gettext("Typically this is set to an unused IP just outside of the client range"); ?>.
+ <br />
+ <br />
+ <?=gettext("NOTE: This should NOT be set to any IP address currently in use on this firewall"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote Address Range");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="remoteip" type="text" class="formfld unknown" id="remoteip" size="20" value="<?=htmlspecialchars($pconfig['remoteip']);?>" />
+ <br />
+ <?=gettext("Specify the starting address for the client IP address subnet.");?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet Mask"); ?></td>
+ <td width="78%" class="vtable">
+ <select id="l2tp_subnet" name="l2tp_subnet">
+ <?php
+ for ($x = 0; $x < 33; $x++) {
+ if ($x == $pconfig['l2tp_subnet']) {
+ $SELECTED = " selected=\"selected\"";
+ } else {
+ $SELECTED = "";
+ }
+ echo "<option value=\"{$x}\"{$SELECTED}>{$x}</option>\n";
+ }
+ ?>
+ </select>
+ <br /><?=gettext("Hint:"); ?> 24 <?=gettext("is"); ?> 255.255.255.0
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Number of L2TP users"); ?></td>
+ <td width="78%" class="vtable">
+ <select id="n_l2tp_units" name="n_l2tp_units">
+ <?php
+ for ($x = 0; $x < 255; $x++) {
+ if ($x == $pconfig['n_l2tp_units']) {
+ $SELECTED = " selected=\"selected\"";
+ } else {
+ $SELECTED = "";
+ }
+ echo "<option value=\"{$x}\"{$SELECTED}>{$x}</option>\n";
+ }
+ ?>
+ </select>
+ <br /><?=gettext("Hint:"); ?> 10 <?=gettext("is ten L2TP clients"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Secret");?></td>
+ <td width="78%" class="vtable">
+ <input type="password" name="secret" id="secret" class="formfld pwd" value="<?php echo htmlspecialchars($pconfig['secret']); ?>" />
+ <br />
+ <?=gettext("Specify optional secret shared between peers. Required on some devices/setups.");?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Authentication Type");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?>
+ <select name="paporchap" id="paporchap">
+ <option value='chap'<?php if ($pconfig['paporchap'] == "chap") echo " selected=\"selected\""; ?>><?=gettext("CHAP"); ?></option>
+ <option value='pap'<?php if ($pconfig['paporchap'] == "pap") echo " selected=\"selected\""; ?>><?=gettext("PAP"); ?></option>
+ </select>
+ <br />
+ <?=gettext("Specifies which protocol to use for authentication.");?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("L2TP DNS Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="l2tp_dns1" type="text" class="formfld unknown" id="l2tp_dns1" size="20" value="<?=htmlspecialchars($pconfig['l2tp_dns1']);?>" />
+ <br />
+ <input name="l2tp_dns2" type="text" class="formfld unknown" id="l2tp_dns2" size="20" value="<?=htmlspecialchars($pconfig['l2tp_dns2']);?>" />
+ <br />
+ <?=gettext("primary and secondary DNS servers assigned to L2TP clients"); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("WINS Server"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="wins" class="formfld unknown" id="wins" size="20" value="<?=htmlspecialchars($pconfig['wins']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="radiusenable" type="checkbox" id="radiusenable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radiusenable']) echo "checked=\"checked\""; ?> />
+ <strong> <?=gettext("Use a RADIUS server for authentication");?><br /></strong>
+ <?=gettext("When set, all users will be authenticated using the RADIUS server specified below. The local user database will not be used.");?><br />
+ <br />
+ <input name="radacct_enable" type="checkbox" id="radacct_enable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radacct_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable RADIUS accounting");?></strong><br />
+ <?=gettext("Sends accounting packets to the RADIUS server.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Server");?></td>
+ <td width="78%" class="vtable">
+ <input name="radiusserver" type="text" class="formfld unknown" id="radiusserver" size="20" value="<?=htmlspecialchars($pconfig['radiusserver']);?>" />
+ <br />
+ <?=gettext("Enter the IP address of the RADIUS server.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Shared Secret");?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="radiussecret" type="password" class="formfld pwd" id="radiussecret" size="20" value="<?=htmlspecialchars($pconfig['radiussecret']);?>" />
+ <br />
+ <?=gettext("Enter the shared secret that will be used to authenticate to the RADIUS server.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Issued IP's");?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="radiusissueips" value="yes" type="checkbox" class="formfld" id="radiusissueips"<?php if (isset($pconfig['radiusissueips'])) echo " checked=\"checked\""; ?> />
+ <br />
+ <?=gettext("Issue IP Addresses via RADIUS server.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <span class="vexpl">
+ <strong class="red"><?=gettext("Note:");?></strong><br />
+ <?=gettext("Don't forget to add a firewall rule to permit traffic from L2TP clients!");?>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+
+<script type="text/javascript">
+//<![CDATA[
+ enable_change(false);
+//]]>
+</script>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_l2tp_users.php b/src/usr/local/www/vpn_l2tp_users.php
new file mode 100644
index 0000000..7ffc969
--- /dev/null
+++ b/src/usr/local/www/vpn_l2tp_users.php
@@ -0,0 +1,146 @@
+<?php
+/*
+ vpn_l2tp_users.php
+ part of pfSense
+
+ Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-vpnl2tp-users
+##|*NAME=VPN: VPN L2TP : Users page
+##|*DESCR=Allow access to the 'VPN: VPN L2TP : Users' page.
+##|*MATCH=vpn_l2tp_users.php*
+##|-PRIV
+
+$pgtitle = array(gettext("VPN"), gettext("L2TP"), gettext("Users"));
+$shortcut_section = "l2tps";
+
+require("guiconfig.inc");
+require_once("vpn.inc");
+
+if (!is_array($config['l2tp']['user'])) {
+ $config['l2tp']['user'] = array();
+}
+$a_secret = &$config['l2tp']['user'];
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ if (!is_subsystem_dirty('rebootreq')) {
+ $retval = vpn_l2tp_configure();
+ }
+ $savemsg = get_std_save_message($retval);
+ if ($retval == 0) {
+ if (is_subsystem_dirty('l2tpusers')) {
+ clear_subsystem_dirty('l2tpusers');
+ }
+ }
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_secret[$_GET['id']]) {
+ unset($a_secret[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('l2tpusers');
+ pfSenseHeader("vpn_l2tp_users.php");
+ exit;
+ }
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<div id="inputerrors"></div>
+<form action="vpn_l2tp_users.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php
+if (isset($config['l2tp']['radius']['enable'])) {
+ print_info_box(gettext("Warning: RADIUS is enabled. The local user database will not be used."));
+}
+?>
+<?php if (is_subsystem_dirty('l2tpusers')): ?><br/>
+<?php print_info_box_np(gettext("The l2tp user list has been modified") . ".<br />" . gettext("You must apply the changes in order for them to take effect") . ".<br /><b>" . gettext("Warning: this will terminate all current l2tp sessions!") . "</b>");?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn l2pt users">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Configuration"), false, "vpn_l2tp.php");
+ $tab_array[1] = array(gettext("Users"), true, "vpn_l2tp_users.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td class="listhdrr"><?=gettext("Username");?></td>
+ <td class="listhdr"><?=gettext("IP address");?></td>
+ <td class="list"></td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_secret as $secretent):
+?>
+ <tr>
+ <td class="listlr">
+ <?=htmlspecialchars($secretent['name']);?>
+ </td>
+ <td class="listr">
+ <?php if ($secretent['ip'] == "") $secretent['ip'] = "Dynamic"; ?>
+ <?=htmlspecialchars($secretent['ip']);?>&nbsp;
+ </td>
+ <td class="list nowrap">
+ <a href="vpn_l2tp_users_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="edit user" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="vpn_l2tp_users.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this user?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete user"); ?>" width="17" height="17" border="0" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="2"></td>
+ <td class="list"> <a href="vpn_l2tp_users_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add user"); ?>" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_l2tp_users_edit.php b/src/usr/local/www/vpn_l2tp_users_edit.php
new file mode 100644
index 0000000..6cedc02
--- /dev/null
+++ b/src/usr/local/www/vpn_l2tp_users_edit.php
@@ -0,0 +1,212 @@
+<?php
+/*
+ vpn_l2tp_users_edit.php
+ part of pfSense
+
+ Copyright (C) 2006 Scott Ullrich (sullrich@gmail.com)
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-vpnl2tp-users-edit
+##|*NAME=VPN: VPN L2TP : Users : Edit page
+##|*DESCR=Allow access to the 'VPN: VPN L2TP : Users : Edit' page.
+##|*MATCH=vpn_l2tp_users_edit.php*
+##|-PRIV
+
+$pgtitle = array(gettext("VPN"), gettext("L2TP"), gettext("User"), gettext("Edit"));
+$shortcut_section = "l2tps";
+
+function l2tpusercmp($a, $b) {
+ return strcasecmp($a['name'], $b['name']);
+}
+
+function l2tp_users_sort() {
+ global $config;
+
+ if (!is_array($config['l2tp']['user'])) {
+ return;
+ }
+
+ usort($config['l2tp']['user'], "l2tpusercmp");
+}
+
+require("guiconfig.inc");
+require_once("vpn.inc");
+
+if (isset($_POST['referer'])) {
+ $referer = $_POST['referer'];
+} else {
+ $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/vpn_l2tp_users.php');
+}
+
+if (!is_array($config['l2tp']['user'])) {
+ $config['l2tp']['user'] = array();
+}
+$a_secret = &$config['l2tp']['user'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_secret[$id]) {
+ $pconfig['usernamefld'] = $a_secret[$id]['name'];
+ $pconfig['ip'] = $a_secret[$id]['ip'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if (isset($id) && ($a_secret[$id])) {
+ $reqdfields = explode(" ", "usernamefld");
+ $reqdfieldsn = array(gettext("Username"));
+ } else {
+ $reqdfields = explode(" ", "usernamefld passwordfld");
+ $reqdfieldsn = array(gettext("Username"), gettext("Password"));
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['usernamefld'])) {
+ $input_errors[] = gettext("The username contains invalid characters.");
+ }
+
+ if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['passwordfld'])) {
+ $input_errors[] = gettext("The password contains invalid characters.");
+ }
+
+ if (($_POST['passwordfld']) && ($_POST['passwordfld'] != $_POST['passwordfld2'])) {
+ $input_errors[] = gettext("The passwords do not match.");
+ }
+ if (($_POST['ip'] && !is_ipaddr($_POST['ip']))) {
+ $input_errors[] = gettext("The IP address entered is not valid.");
+ }
+
+ if (!$input_errors && !(isset($id) && $a_secret[$id])) {
+ /* make sure there are no dupes */
+ foreach ($a_secret as $secretent) {
+ if ($secretent['name'] == $_POST['usernamefld']) {
+ $input_errors[] = gettext("Another entry with the same username already exists.");
+ break;
+ }
+ }
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if (!$input_errors) {
+
+ if (isset($id) && $a_secret[$id]) {
+ $secretent = $a_secret[$id];
+ }
+
+ $secretent['name'] = $_POST['usernamefld'];
+ $secretent['ip'] = $_POST['ip'];
+
+ if ($_POST['passwordfld']) {
+ $secretent['password'] = $_POST['passwordfld'];
+ }
+
+ if (isset($id) && $a_secret[$id]) {
+ $a_secret[$id] = $secretent;
+ } else {
+ $a_secret[] = $secretent;
+ }
+ l2tp_users_sort();
+
+ write_config();
+
+ $retval = vpn_l2tp_configure();
+
+ pfSenseHeader("vpn_l2tp_users.php");
+
+ exit;
+ }
+}
+
+include("head.inc");
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<div id="inputerrors"></div>
+<form action="vpn_l2tp_users_edit.php" method="post" name="iform" id="iform">
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="vpn l2tp users edit">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="usernamefld" type="text" class="formfld user" id="usernamefld" size="20" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Password");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="passwordfld" type="password" class="formfld pwd" id="passwordfld" size="20" />
+ <br /><?=$mandfldhtml;?><input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" />
+ &nbsp;(<?=gettext("confirmation");?>)
+ <?php if (isset($id) && $a_secret[$id]): ?>
+ <br />
+ <span class="vexpl"><?=gettext("If you want to change the users password, enter it here twice.");?></span>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IP address");?></td>
+ <td width="78%" class="vtable">
+ <input name="ip" type="text" class="formfld unknown" id="ip" size="20" value="<?=htmlspecialchars($pconfig['ip']);?>" />
+ <br /><span class="vexpl"><?=gettext("If you want the user to be assigned a specific IP address, enter it here.");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="Submit" type="submit" class="formbtn" value="<?=gettext('Save');?>" />
+ <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
+ <input name="referer" type="hidden" value="<?=$referer;?>" />
+ <?php if (isset($id) && $a_secret[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </div>
+</form>
+
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_openvpn_client.php b/src/usr/local/www/vpn_openvpn_client.php
new file mode 100644
index 0000000..7a06c70
--- /dev/null
+++ b/src/usr/local/www/vpn_openvpn_client.php
@@ -0,0 +1,1271 @@
+<?php
+/*
+ vpn_openvpn_client.php
+
+ Copyright (C) 2008 Shrew Soft Inc.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-openvpn-client
+##|*NAME=OpenVPN: Client page
+##|*DESCR=Allow access to the 'OpenVPN: Client' page.
+##|*MATCH=vpn_openvpn_client.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("openvpn.inc");
+require_once("pkg-utils.inc");
+
+$pgtitle = array(gettext("OpenVPN"), gettext("Client"));
+$shortcut_section = "openvpn";
+
+if (!is_array($config['openvpn']['openvpn-client'])) {
+ $config['openvpn']['openvpn-client'] = array();
+}
+
+$a_client = &$config['openvpn']['openvpn-client'];
+
+if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+}
+
+$a_ca =& $config['ca'];
+
+if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+}
+
+$a_cert =& $config['cert'];
+
+if (!is_array($config['crl'])) {
+ $config['crl'] = array();
+}
+
+$a_crl =& $config['crl'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+$act = $_GET['act'];
+if (isset($_POST['act'])) {
+ $act = $_POST['act'];
+}
+
+if (isset($id) && $a_client[$id]) {
+ $vpnid = $a_client[$id]['vpnid'];
+} else {
+ $vpnid = 0;
+}
+
+if ($_GET['act'] == "del") {
+
+ if (!isset($a_client[$id])) {
+ pfSenseHeader("vpn_openvpn_client.php");
+ exit;
+ }
+ if (!empty($a_client[$id])) {
+ openvpn_delete('client', $a_client[$id]);
+ }
+ unset($a_client[$id]);
+ write_config();
+ $savemsg = gettext("Client successfully deleted")."<br />";
+}
+
+if ($_GET['act'] == "new") {
+ $pconfig['autokey_enable'] = "yes";
+ $pconfig['tlsauth_enable'] = "yes";
+ $pconfig['autotls_enable'] = "yes";
+ $pconfig['interface'] = "wan";
+ $pconfig['server_port'] = 1194;
+ $pconfig['verbosity_level'] = 1; // Default verbosity is 1
+ // OpenVPN Defaults to SHA1
+ $pconfig['digest'] = "SHA1";
+}
+
+global $simplefields;
+$simplefields = array('auth_user', 'auth_pass');
+
+if ($_GET['act'] == "edit") {
+
+ if (isset($id) && $a_client[$id]) {
+ foreach ($simplefields as $stat) {
+ $pconfig[$stat] = $a_client[$id][$stat];
+ }
+
+ $pconfig['disable'] = isset($a_client[$id]['disable']);
+ $pconfig['mode'] = $a_client[$id]['mode'];
+ $pconfig['protocol'] = $a_client[$id]['protocol'];
+ $pconfig['interface'] = $a_client[$id]['interface'];
+ if (!empty($a_client[$id]['ipaddr'])) {
+ $pconfig['interface'] = $pconfig['interface'] . '|' . $a_client[$id]['ipaddr'];
+ }
+ $pconfig['local_port'] = $a_client[$id]['local_port'];
+ $pconfig['server_addr'] = $a_client[$id]['server_addr'];
+ $pconfig['server_port'] = $a_client[$id]['server_port'];
+ $pconfig['resolve_retry'] = $a_client[$id]['resolve_retry'];
+ $pconfig['proxy_addr'] = $a_client[$id]['proxy_addr'];
+ $pconfig['proxy_port'] = $a_client[$id]['proxy_port'];
+ $pconfig['proxy_user'] = $a_client[$id]['proxy_user'];
+ $pconfig['proxy_passwd'] = $a_client[$id]['proxy_passwd'];
+ $pconfig['proxy_authtype'] = $a_client[$id]['proxy_authtype'];
+ $pconfig['description'] = $a_client[$id]['description'];
+ $pconfig['custom_options'] = $a_client[$id]['custom_options'];
+ $pconfig['ns_cert_type'] = $a_client[$id]['ns_cert_type'];
+ $pconfig['dev_mode'] = $a_client[$id]['dev_mode'];
+
+ if ($pconfig['mode'] != "p2p_shared_key") {
+ $pconfig['caref'] = $a_client[$id]['caref'];
+ $pconfig['certref'] = $a_client[$id]['certref'];
+ if ($a_client[$id]['tls']) {
+ $pconfig['tlsauth_enable'] = "yes";
+ $pconfig['tls'] = base64_decode($a_client[$id]['tls']);
+ }
+ } else {
+ $pconfig['shared_key'] = base64_decode($a_client[$id]['shared_key']);
+ }
+ $pconfig['crypto'] = $a_client[$id]['crypto'];
+ // OpenVPN Defaults to SHA1 if unset
+ $pconfig['digest'] = !empty($a_client[$id]['digest']) ? $a_client[$id]['digest'] : "SHA1";
+ $pconfig['engine'] = $a_client[$id]['engine'];
+
+ $pconfig['tunnel_network'] = $a_client[$id]['tunnel_network'];
+ $pconfig['tunnel_networkv6'] = $a_client[$id]['tunnel_networkv6'];
+ $pconfig['remote_network'] = $a_client[$id]['remote_network'];
+ $pconfig['remote_networkv6'] = $a_client[$id]['remote_networkv6'];
+ $pconfig['use_shaper'] = $a_client[$id]['use_shaper'];
+ $pconfig['compression'] = $a_client[$id]['compression'];
+ $pconfig['passtos'] = $a_client[$id]['passtos'];
+
+ // just in case the modes switch
+ $pconfig['autokey_enable'] = "yes";
+ $pconfig['autotls_enable'] = "yes";
+
+ $pconfig['no_tun_ipv6'] = $a_client[$id]['no_tun_ipv6'];
+ $pconfig['route_no_pull'] = $a_client[$id]['route_no_pull'];
+ $pconfig['route_no_exec'] = $a_client[$id]['route_no_exec'];
+ if (isset($a_client[$id]['verbosity_level'])) {
+ $pconfig['verbosity_level'] = $a_client[$id]['verbosity_level'];
+ } else {
+ $pconfig['verbosity_level'] = 1; // Default verbosity is 1
+ }
+ }
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (isset($id) && $a_client[$id]) {
+ $vpnid = $a_client[$id]['vpnid'];
+ } else {
+ $vpnid = 0;
+ }
+
+ list($iv_iface, $iv_ip) = explode ("|", $pconfig['interface']);
+ if (is_ipaddrv4($iv_ip) && (stristr($pconfig['protocol'], "6") !== false)) {
+ $input_errors[] = gettext("Protocol and IP address families do not match. You cannot select an IPv6 protocol and an IPv4 IP address.");
+ } elseif (is_ipaddrv6($iv_ip) && (stristr($pconfig['protocol'], "6") === false)) {
+ $input_errors[] = gettext("Protocol and IP address families do not match. You cannot select an IPv4 protocol and an IPv6 IP address.");
+ } elseif ((stristr($pconfig['protocol'], "6") === false) && !get_interface_ip($iv_iface) && ($pconfig['interface'] != "any")) {
+ $input_errors[] = gettext("An IPv4 protocol was selected, but the selected interface has no IPv4 address.");
+ } elseif ((stristr($pconfig['protocol'], "6") !== false) && !get_interface_ipv6($iv_iface) && ($pconfig['interface'] != "any")) {
+ $input_errors[] = gettext("An IPv6 protocol was selected, but the selected interface has no IPv6 address.");
+ }
+
+ if ($pconfig['mode'] != "p2p_shared_key") {
+ $tls_mode = true;
+ } else {
+ $tls_mode = false;
+ }
+
+ /* input validation */
+ if ($pconfig['local_port']) {
+
+ if ($result = openvpn_validate_port($pconfig['local_port'], 'Local port')) {
+ $input_errors[] = $result;
+ }
+
+ $portused = openvpn_port_used($pconfig['protocol'], $pconfig['interface'], $pconfig['local_port'], $vpnid);
+ if (($portused != $vpnid) && ($portused != 0)) {
+ $input_errors[] = gettext("The specified 'Local port' is in use. Please select another value");
+ }
+ }
+
+ if ($result = openvpn_validate_host($pconfig['server_addr'], 'Server host or address')) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_port($pconfig['server_port'], 'Server port')) {
+ $input_errors[] = $result;
+ }
+
+ if ($pconfig['proxy_addr']) {
+
+ if ($result = openvpn_validate_host($pconfig['proxy_addr'], 'Proxy host or address')) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_port($pconfig['proxy_port'], 'Proxy port')) {
+ $input_errors[] = $result;
+ }
+
+ if ($pconfig['proxy_authtype'] != "none") {
+ if (empty($pconfig['proxy_user']) || empty($pconfig['proxy_passwd'])) {
+ $input_errors[] = gettext("User name and password are required for proxy with authentication.");
+ }
+ }
+ }
+
+ if ($pconfig['tunnel_network']) {
+ if ($result = openvpn_validate_cidr($pconfig['tunnel_network'], 'IPv4 Tunnel Network', false, "ipv4")) {
+ $input_errors[] = $result;
+ }
+ }
+
+ if ($pconfig['tunnel_networkv6']) {
+ if ($result = openvpn_validate_cidr($pconfig['tunnel_networkv6'], 'IPv6 Tunnel Network', false, "ipv6")) {
+ $input_errors[] = $result;
+ }
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['remote_network'], 'IPv4 Remote Network', true, "ipv4")) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['remote_networkv6'], 'IPv6 Remote Network', true, "ipv6")) {
+ $input_errors[] = $result;
+ }
+
+ if (!empty($pconfig['use_shaper']) && (!is_numeric($pconfig['use_shaper']) || ($pconfig['use_shaper'] <= 0))) {
+ $input_errors[] = gettext("The bandwidth limit must be a positive numeric value.");
+ }
+
+ if ($pconfig['autokey_enable']) {
+ $pconfig['shared_key'] = openvpn_create_key();
+ }
+
+ if (!$tls_mode && !$pconfig['autokey_enable']) {
+ if (!strstr($pconfig['shared_key'], "-----BEGIN OpenVPN Static key V1-----") ||
+ !strstr($pconfig['shared_key'], "-----END OpenVPN Static key V1-----")) {
+ $input_errors[] = gettext("The field 'Shared Key' does not appear to be valid");
+ }
+ }
+
+ if ($tls_mode && $pconfig['tlsauth_enable'] && !$pconfig['autotls_enable']) {
+ if (!strstr($pconfig['tls'], "-----BEGIN OpenVPN Static key V1-----") ||
+ !strstr($pconfig['tls'], "-----END OpenVPN Static key V1-----")) {
+ $input_errors[] = gettext("The field 'TLS Authentication Key' does not appear to be valid");
+ }
+ }
+
+ /* If we are not in shared key mode, then we need the CA/Cert. */
+ if ($pconfig['mode'] != "p2p_shared_key") {
+ $reqdfields = explode(" ", "caref");
+ $reqdfieldsn = array(gettext("Certificate Authority"));
+ } elseif (!$pconfig['autokey_enable']) {
+ /* We only need the shared key filled in if we are in shared key mode and autokey is not selected. */
+ $reqdfields = array('shared_key');
+ $reqdfieldsn = array(gettext('Shared key'));
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($pconfig['mode'] != "p2p_shared_key") && empty($pconfig['certref']) && empty($pconfig['auth_user']) && empty($pconfig['auth_pass'])) {
+ $input_errors[] = gettext("If no Client Certificate is selected, a username and/or password must be entered.");
+ }
+
+ if (!$input_errors) {
+
+ $client = array();
+
+ foreach ($simplefields as $stat) {
+ update_if_changed($stat, $client[$stat], $_POST[$stat]);
+ }
+
+ if ($vpnid) {
+ $client['vpnid'] = $vpnid;
+ } else {
+ $client['vpnid'] = openvpn_vpnid_next();
+ }
+
+ if ($_POST['disable'] == "yes") {
+ $client['disable'] = true;
+ }
+ $client['protocol'] = $pconfig['protocol'];
+ $client['dev_mode'] = $pconfig['dev_mode'];
+ list($client['interface'], $client['ipaddr']) = explode ("|", $pconfig['interface']);
+ $client['local_port'] = $pconfig['local_port'];
+ $client['server_addr'] = $pconfig['server_addr'];
+ $client['server_port'] = $pconfig['server_port'];
+ $client['resolve_retry'] = $pconfig['resolve_retry'];
+ $client['proxy_addr'] = $pconfig['proxy_addr'];
+ $client['proxy_port'] = $pconfig['proxy_port'];
+ $client['proxy_authtype'] = $pconfig['proxy_authtype'];
+ $client['proxy_user'] = $pconfig['proxy_user'];
+ $client['proxy_passwd'] = $pconfig['proxy_passwd'];
+ $client['description'] = $pconfig['description'];
+ $client['mode'] = $pconfig['mode'];
+ $client['custom_options'] = str_replace("\r\n", "\n", $pconfig['custom_options']);
+
+ if ($tls_mode) {
+ $client['caref'] = $pconfig['caref'];
+ $client['certref'] = $pconfig['certref'];
+ if ($pconfig['tlsauth_enable']) {
+ if ($pconfig['autotls_enable']) {
+ $pconfig['tls'] = openvpn_create_key();
+ }
+ $client['tls'] = base64_encode($pconfig['tls']);
+ }
+ } else {
+ $client['shared_key'] = base64_encode($pconfig['shared_key']);
+ }
+ $client['crypto'] = $pconfig['crypto'];
+ $client['digest'] = $pconfig['digest'];
+ $client['engine'] = $pconfig['engine'];
+
+ $client['tunnel_network'] = $pconfig['tunnel_network'];
+ $client['tunnel_networkv6'] = $pconfig['tunnel_networkv6'];
+ $client['remote_network'] = $pconfig['remote_network'];
+ $client['remote_networkv6'] = $pconfig['remote_networkv6'];
+ $client['use_shaper'] = $pconfig['use_shaper'];
+ $client['compression'] = $pconfig['compression'];
+ $client['passtos'] = $pconfig['passtos'];
+
+ $client['no_tun_ipv6'] = $pconfig['no_tun_ipv6'];
+ $client['route_no_pull'] = $pconfig['route_no_pull'];
+ $client['route_no_exec'] = $pconfig['route_no_exec'];
+ $client['verbosity_level'] = $pconfig['verbosity_level'];
+
+ if (isset($id) && $a_client[$id]) {
+ $a_client[$id] = $client;
+ } else {
+ $a_client[] = $client;
+ }
+
+ openvpn_resync('client', $client);
+ write_config();
+
+ header("Location: vpn_openvpn_client.php");
+ exit;
+ }
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function mode_change() {
+ index = document.iform.mode.selectedIndex;
+ value = document.iform.mode.options[index].value;
+ switch (value) {
+ case "p2p_tls":
+ document.getElementById("tls").style.display="";
+ document.getElementById("tls_ca").style.display="";
+ document.getElementById("tls_cert").style.display="";
+ document.getElementById("userpass").style.display="";
+ document.getElementById("userpassheader").style.display="";
+ document.getElementById("psk").style.display="none";
+ break;
+ case "p2p_shared_key":
+ document.getElementById("tls").style.display="none";
+ document.getElementById("tls_ca").style.display="none";
+ document.getElementById("tls_cert").style.display="none";
+ document.getElementById("userpass").style.display="none";
+ document.getElementById("userpassheader").style.display="none";
+ document.getElementById("psk").style.display="";
+ break;
+ }
+}
+
+function dev_mode_change() {
+ index = document.iform.dev_mode.selectedIndex;
+ value = document.iform.dev_mode.options[index].value;
+ switch (value) {
+ case "tun":
+ document.getElementById("chkboxNoTunIPv6").style.display="";
+ break;
+ case "tap":
+ document.getElementById("chkboxNoTunIPv6").style.display="none";
+ break;
+ }
+}
+
+function autokey_change() {
+ if (document.iform.autokey_enable.checked) {
+ document.getElementById("autokey_opts").style.display="none";
+ } else {
+ document.getElementById("autokey_opts").style.display="";
+ }
+}
+
+function useproxy_changed() {
+
+ if (jQuery('#proxy_authtype').val() != 'none') {
+ jQuery('#proxy_authtype_opts').show();
+ } else {
+ jQuery('#proxy_authtype_opts').hide();
+ }
+}
+
+function tlsauth_change() {
+
+<?php if (!$pconfig['tls']): ?>
+ if (document.iform.tlsauth_enable.checked) {
+ document.getElementById("tlsauth_opts").style.display="";
+ } else {
+ document.getElementById("tlsauth_opts").style.display="none";
+ }
+<?php endif; ?>
+
+ autotls_change();
+}
+
+function autotls_change() {
+
+<?php if (!$pconfig['tls']): ?>
+ autocheck = document.iform.autotls_enable.checked;
+<?php else: ?>
+ autocheck = false;
+<?php endif; ?>
+
+ if (document.iform.tlsauth_enable.checked && !autocheck) {
+ document.getElementById("autotls_opts").style.display="";
+ } else {
+ document.getElementById("autotls_opts").style.display="none";
+ }
+}
+
+//]]>
+</script>
+<?php
+if (!$savemsg) {
+ $savemsg = "";
+}
+
+if ($input_errors) {
+ print_input_errors($input_errors);
+}
+if ($savemsg) {
+ print_info_box($savemsg);
+}
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn openvpn client">
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Server"), false, "vpn_openvpn_server.php");
+ $tab_array[] = array(gettext("Client"), true, "vpn_openvpn_client.php");
+ $tab_array[] = array(gettext("Client Specific Overrides"), false, "vpn_openvpn_csc.php");
+ $tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
+ add_package_tabs("openvpn-client-export", $tab_array);
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+
+ <?php if ($act == "new" || $act == "edit"): ?>
+
+ <form action="vpn_openvpn_client.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="general information">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("General information"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="0" cellspacing="0" summary="enable disable client">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['disable'], $chk); ?>
+ <input name="disable" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ &nbsp;
+ <span class="vexpl">
+ <strong><?=gettext("Disable this client"); ?></strong><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?=gettext("Set this option to disable this client without removing it from the list"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server Mode");?></td>
+ <td width="78%" class="vtable">
+ <select name="mode" id="mode" class="formselect" onchange="mode_change()">
+ <?php
+ foreach ($openvpn_client_modes as $name => $desc):
+ $selected = "";
+ if ($pconfig['mode'] == $name) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>" <?=$selected;?>><?=$desc;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
+ <td width="78%" class="vtable">
+ <select name='protocol' class="formselect">
+ <?php
+ foreach ($openvpn_prots as $prot):
+ $selected = "";
+ if ($pconfig['protocol'] == $prot) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$prot;?>" <?=$selected;?>><?=$prot;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Device mode");?></td>
+ <td width="78%" class="vtable">
+ <select name='dev_mode' class="formselect" onchange="dev_mode_change()">
+ <?php
+ foreach ($openvpn_dev_mode as $mode):
+ $selected = "";
+ if ($pconfig['dev_mode'] == $mode) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$mode;?>" <?=$selected;?>><?=$mode;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect">
+ <?php
+ $interfaces = get_configured_interface_with_descr();
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip) {
+ $interfaces[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
+ }
+ $aliaslist = get_configured_ip_aliases_list();
+ foreach ($aliaslist as $aliasip => $aliasif) {
+ $interfaces[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+ }
+ $grouplist = return_gateway_groups_array();
+ foreach ($grouplist as $name => $group) {
+ if ($group['ipprotocol'] != inet) {
+ continue;
+ }
+ if ($group[0]['vip'] <> "") {
+ $vipif = $group[0]['vip'];
+ } else {
+ $vipif = $group[0]['int'];
+ }
+ $interfaces[$name] = "GW Group {$name}";
+ }
+ $interfaces['lo0'] = "Localhost";
+ $interfaces['any'] = "any";
+ foreach ($interfaces as $iface => $ifacename):
+ $selected = "";
+ if ($iface == $pconfig['interface']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$iface;?>" <?=$selected;?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php endforeach; ?>
+ </select> <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Local port");?></td>
+ <td width="78%" class="vtable">
+ <input name="local_port" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['local_port']);?>" />
+ <br />
+ <?=gettext("Set this option if you would like to bind to a specific port. Leave this blank or enter 0 for a random dynamic port."); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server host or address");?></td>
+ <td width="78%" class="vtable">
+ <input name="server_addr" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['server_addr']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server port");?></td>
+ <td width="78%" class="vtable">
+ <input name="server_port" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['server_port']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Proxy host or address");?></td>
+ <td width="78%" class="vtable">
+ <input name="proxy_addr" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['proxy_addr']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Proxy port");?></td>
+ <td width="78%" class="vtable">
+ <input name="proxy_port" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['proxy_port']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Proxy authentication extra options");?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="proxy authentication">
+ <tr>
+ <td align="right" width="25%">
+ <span class="vexpl">
+ &nbsp;<?=gettext("Authentication method"); ?> :&nbsp;
+ </span>
+ </td>
+ <td>
+ <select name="proxy_authtype" id="proxy_authtype" class="formfld select" onchange="useproxy_changed()">
+ <option value="none" <?php if ($pconfig['proxy_authtype'] == "none") echo "selected=\"selected\""; ?>><?=gettext("none"); ?></option>
+ <option value="basic" <?php if ($pconfig['proxy_authtype'] == "basic") echo "selected=\"selected\""; ?>><?=gettext("basic"); ?></option>
+ <option value="ntlm" <?php if ($pconfig['proxy_authtype'] == "ntlm") echo "selected=\"selected\""; ?>><?=gettext("ntlm"); ?></option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <table border="0" cellpadding="2" cellspacing="0" id="proxy_authtype_opts" style="display:none" summary="proxy authentication options">
+ <tr>
+ <td align="right" width="25%">
+ <span class="vexpl">
+ &nbsp;<?=gettext("Username"); ?> :&nbsp;
+ </span>
+ </td>
+ <td>
+ <input name="proxy_user" id="proxy_user" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['proxy_user']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td align="right" width="25%">
+ <span class="vexpl">
+ &nbsp;<?=gettext("Password"); ?> :&nbsp;
+ </span>
+ </td>
+ <td>
+ <input name="proxy_passwd" id="proxy_passwd" type="password" class="formfld pwd" size="20" value="<?=htmlspecialchars($pconfig['proxy_passwd']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Server host name resolution"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="server host name resolution">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['resolve_retry'], $chk); ?>
+ <input name="resolve_retry" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Infinitely resolve server"); ?>
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?=gettext("Continuously attempt to resolve the server host " .
+ "name. Useful when communicating with a server " .
+ "that is not permanently connected to the Internet"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="description" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['description']);?>" />
+ <br />
+ <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr id='userpassheader'>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("User Authentication Settings"); ?></td>
+ </tr>
+ <tr id='userpass'>
+ <td width="22%" valign="top" class="vncell"><?=gettext("User name/pass"); ?></td>
+ <td width="78%" class="vtable">
+ <?=gettext("Leave empty when no user name and/or password are needed."); ?>
+ <br/>
+ <table border="0" cellpadding="2" cellspacing="0" summary="user name password">
+ <tr>
+ <td align="right" width="25%">
+ <span class="vexpl">
+ &nbsp;<?=gettext("Username"); ?> :&nbsp;
+ </span>
+ </td>
+ <td>
+ <input name="auth_user" id="auth_user" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['auth_user']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td align="right" width="25%">
+ <span class="vexpl">
+ &nbsp;<?=gettext("Password"); ?> :&nbsp;
+ </span>
+ </td>
+ <td>
+ <input name="auth_pass" id="auth_pass" type="password" class="formfld pwd" size="20" value="<?=htmlspecialchars($pconfig['auth_pass']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Cryptographic Settings"); ?></td>
+ </tr>
+ <tr id="tls">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("TLS Authentication"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="tls authentication">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['tlsauth_enable'], $chk); ?>
+ <input name="tlsauth_enable" id="tlsauth_enable" type="checkbox" value="yes" <?=$chk;?> onclick="tlsauth_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Enable authentication of TLS packets"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?php if (!$pconfig['tls']): ?>
+ <table border="0" cellpadding="2" cellspacing="0" id="tlsauth_opts" summary="tls authentication options">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['autotls_enable'], $chk); ?>
+ <input name="autotls_enable" id="autotls_enable" type="checkbox" value="yes" <?=$chk;?> onclick="autotls_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Automatically generate a shared TLS authentication key"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?php endif; ?>
+ <table border="0" cellpadding="2" cellspacing="0" id="autotls_opts" summary="tls authentication options">
+ <tr>
+ <td>
+ <textarea name="tls" cols="65" rows="7" class="formpre"><?=htmlspecialchars($pconfig['tls']);?></textarea>
+ <br />
+ <?=gettext("Paste your shared key here"); ?>.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="tls_ca">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Peer Certificate Authority"); ?></td>
+ <td width="78%" class="vtable">
+ <?php if (count($a_ca)): ?>
+ <select name='caref' class="formselect">
+ <?php
+ foreach ($a_ca as $ca):
+ $selected = "";
+ if ($pconfig['caref'] == $ca['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
+ <?php endforeach; ?>
+ </select>
+ <?php else: ?>
+ <b>No Certificate Authorities defined.</b> <br />Create one under <a href="system_camanager.php">System &gt; Cert Manager</a>.
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr id="tls_cert">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Client Certificate"); ?></td>
+ <td width="78%" class="vtable">
+ <select name='certref' class="formselect">
+ <?php
+ foreach ($a_cert as $cert):
+ $selected = "";
+ $caname = "";
+ $inuse = "";
+ $revoked = "";
+ $ca = lookup_ca($cert['caref']);
+ if ($ca) {
+ $caname = " (CA: " . htmlspecialchars($ca['descr']) . ")";
+ }
+ if ($pconfig['certref'] == $cert['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ if (cert_in_use($cert['refid'])) {
+ $inuse = " *In Use";
+ }
+ if (is_cert_revoked($cert)) {
+ $revoked = " *Revoked";
+ }
+ ?>
+ <option value="<?=$cert['refid'];?>" <?=$selected;?>><?=htmlspecialchars($cert['descr']) . $caname . $inuse . $revoked;?></option>
+ <?php endforeach; ?>
+ <option value="" <?PHP if (empty($pconfig['certref'])) echo "selected=\"selected\""; ?>>None (Username and/or Password required)</option>
+ </select>
+ <?php if (!count($a_cert)): ?>
+ <b>No Certificates defined.</b> <br />Create one under <a href="system_certmanager.php">System &gt; Cert Manager</a> if one is required for this connection.
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr id="psk">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Shared Key"); ?></td>
+ <td width="78%" class="vtable">
+ <?php if (!$pconfig['shared_key']): ?>
+ <table border="0" cellpadding="2" cellspacing="0" summary="shared key">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['autokey_enable'], $chk); ?>
+ <input name="autokey_enable" type="checkbox" value="yes" <?=$chk;?> onclick="autokey_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Automatically generate a shared key"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?php endif; ?>
+ <table border="0" cellpadding="2" cellspacing="0" id="autokey_opts" summary="shared key options">
+ <tr>
+ <td>
+ <textarea name="shared_key" cols="65" rows="7" class="formpre"><?=htmlspecialchars($pconfig['shared_key']);?></textarea>
+ <br />
+ <?=gettext("Paste your shared key here"); ?>.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Encryption algorithm"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="crypto" class="formselect">
+ <?php
+ $cipherlist = openvpn_get_cipherlist();
+ foreach ($cipherlist as $name => $desc):
+ $selected = "";
+ if ($name == $pconfig['crypto']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>"<?=$selected?>>
+ <?=htmlspecialchars($desc);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Auth Digest Algorithm"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="digest" class="formselect">
+ <?php
+ $digestlist = openvpn_get_digestlist();
+ foreach ($digestlist as $name => $desc):
+ $selected = "";
+ if ($name == $pconfig['digest']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>"<?=$selected?>>
+ <?=htmlspecialchars($desc);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br /><?PHP echo gettext("NOTE: Leave this set to SHA1 unless the server is set to match. SHA1 is the default for OpenVPN."); ?>
+ </td>
+ </tr>
+ <tr id="engine">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hardware Crypto"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="engine" class="formselect">
+ <?php
+ $engines = openvpn_get_engines();
+ foreach ($engines as $name => $desc):
+ $selected = "";
+ if ($name == $pconfig['engine']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>"<?=$selected?>>
+ <?=htmlspecialchars($desc);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Tunnel Settings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Tunnel Network"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="tunnel_network" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_network']);?>" />
+ <br />
+ <?=gettext("This is the virtual network used for private " .
+ "communications between this client and the " .
+ "server expressed using CIDR (eg. 10.0.8.0/24). " .
+ "The first network address is assumed to be the " .
+ "server address and the second network address " .
+ "will be assigned to the client virtual " .
+ "interface"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Tunnel Network"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="tunnel_networkv6" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_networkv6']);?>" />
+ <br />
+ <?=gettext("This is the IPv6 virtual network used for private " .
+ "communications between this client and the " .
+ "server expressed using CIDR (eg. fe80::/64). " .
+ "The first network address is assumed to be the " .
+ "server address and the second network address " .
+ "will be assigned to the client virtual " .
+ "interface"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Remote Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="remote_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_network']);?>" />
+ <br />
+ <?=gettext("These are the IPv4 networks that will be routed through " .
+ "the tunnel, so that a site-to-site VPN can be " .
+ "established without manually changing the routing tables. " .
+ "Expressed as a comma-separated list of one or more CIDR ranges. " .
+ "If this is a site-to-site VPN, enter the " .
+ "remote LAN/s here. You may leave this blank to " .
+ "only communicate with other clients"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Remote Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="remote_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_networkv6']);?>" />
+ <br />
+ <?=gettext("These are the IPv6 networks that will be routed through " .
+ "the tunnel, so that a site-to-site VPN can be " .
+ "established without manually changing the routing tables. " .
+ "Expressed as a comma-separated list of one or more IP/PREFIX. " .
+ "If this is a site-to-site VPN, enter the " .
+ "remote LAN/s here. You may leave this blank to " .
+ "only communicate with other clients"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Limit outgoing bandwidth");?></td>
+ <td width="78%" class="vtable">
+ <input name="use_shaper" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['use_shaper']);?>" />
+ <br />
+ <?=gettext("Maximum outgoing bandwidth for this tunnel. " .
+ "Leave empty for no limit. The input value has " .
+ "to be something between 100 bytes/sec and 100 " .
+ "Mbytes/sec (entered as bytes per second)"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Compression"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="compression" class="formselect">
+ <?php
+ foreach ($openvpn_compression_modes as $cmode => $cmodedesc):
+ $selected = "";
+ if ($cmode == $pconfig['compression']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?= $cmode ?>" <?= $selected ?>><?= $cmodedesc ?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Compress tunnel packets using the LZO algorithm. Adaptive compression will dynamically disable compression for a period of time if OpenVPN detects that the data in the packets is not being compressed efficiently."); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Type-of-Service"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="type-of-service">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['passtos'], $chk); ?>
+ <input name="passtos" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Set the TOS IP header value of tunnel packets to match the encapsulated packet value"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr id="chkboxNoTunIPv6">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable IPv6"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="disable-ipv6">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['no_tun_ipv6'], $chk); ?>
+ <input name="no_tun_ipv6" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Don't forward IPv6 traffic"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr id="chkboxRouteNoPull">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Don't pull routes"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="dont-pull-routes">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['route_no_pull'], $chk); ?>
+ <input name="route_no_pull" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("This option effectively bars the server from adding routes to the client's routing table, however note that this option still allows the server to set the TCP/IP properties of the client's TUN/TAP interface"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr id="chkboxRouteNoExec">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Don't add/remove routes"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="dont-exec-routes">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['route_no_exec'], $chk); ?>
+ <input name="route_no_exec" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Don't add or remove routes automatically. Instead pass routes to "); ?> <strong>--route-up</strong> <?=gettext("script using environmental variables"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="client_opts" summary="advance configuration">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Advanced"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="advance configuration">
+ <tr>
+ <td>
+ <textarea rows="6" cols="78" name="custom_options" id="custom_options"><?=htmlspecialchars($pconfig['custom_options']);?></textarea><br />
+ <?=gettext("Enter any additional options you would like to add to the OpenVPN client configuration here, separated by a semicolon"); ?><br />
+ <?=gettext("EXAMPLE:"); ?> <strong>remote server.example.com 1194;</strong> or <strong>remote 1.2.3.4 1194;</strong>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr id="comboboxVerbosityLevel">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Verbosity level");?></td>
+ <td width="78%" class="vtable">
+ <select name="verbosity_level" class="formselect">
+ <?php
+ foreach ($openvpn_verbosity_level as $verb_value => $verb_desc):
+ $selected = "";
+ if ($pconfig['verbosity_level'] == $verb_value) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$verb_value;?>" <?=$selected;?>><?=$verb_desc;?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Each level shows all info from the previous levels. Level 3 is recommended if you want a good summary of what's happening without being swamped by output"); ?>.<br /> <br />
+ <strong>none</strong> -- <?=gettext("No output except fatal errors"); ?>. <br />
+ <strong>default</strong>-<strong>4</strong> -- <?=gettext("Normal usage range"); ?>. <br />
+ <strong>5</strong> -- <?=gettext("Output R and W characters to the console for each packet read and write, uppercase is used for TCP/UDP packets and lowercase is used for TUN/TAP packets"); ?>. <br />
+ <strong>6</strong>-<strong>11</strong> -- <?=gettext("Debug info range"); ?>.
+ </td>
+ </tr>
+
+ </table>
+
+ <br />
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="icons">
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input name="act" type="hidden" value="<?=$act;?>" />
+ <?php if (isset($id) && $a_client[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+ <?php else: ?>
+
+ <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="list of openvpn clients">
+ <thead>
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Disabled"); ?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Protocol"); ?></td>
+ <td width="30%" class="listhdrr"><?=gettext("Server"); ?></td>
+ <td width="40%" class="listhdrr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <a href="vpn_openvpn_client.php?act=new"><img src="./themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add client"); ?>" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="4">
+ <p>
+ <?=gettext("Additional OpenVPN clients can be added here.");?>
+ </p>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+ <?php
+ $i = 0;
+ foreach ($a_client as $client):
+ $disabled = "NO";
+ if (isset($client['disable'])) {
+ $disabled = "YES";
+ }
+ $server = "{$client['server_addr']}:{$client['server_port']}";
+ ?>
+ <tr ondblclick="document.location='vpn_openvpn_client.php?act=edit&amp;id=<?=$i;?>'">
+ <td class="listlr">
+ <?=$disabled;?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($client['protocol']);?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($server);?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($client['description']);?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="vpn_openvpn_client.php?act=edit&amp;id=<?=$i;?>">
+ <img src="./themes/<?=$g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit client"); ?>" width="17" height="17" border="0" alt="edit" />
+ </a>
+ &nbsp;
+ <a href="vpn_openvpn_client.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this client?"); ?>')">
+ <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete client"); ?>" width="17" height="17" border="0" alt="delete" />
+ </a>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr style="display:none;"><td></td></tr>
+ </tbody>
+ </table>
+
+ <?php endif; ?>
+
+ </td>
+ </tr>
+</table>
+<script type="text/javascript">
+//<![CDATA[
+mode_change();
+autokey_change();
+tlsauth_change();
+useproxy_changed();
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
+
+<?php
+
+/* local utility functions */
+
+function set_checked($var, & $chk) {
+ if ($var) {
+ $chk = "checked=\"checked\"";
+ } else {
+ $chk = "";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/vpn_openvpn_csc.php b/src/usr/local/www/vpn_openvpn_csc.php
new file mode 100644
index 0000000..356db7f
--- /dev/null
+++ b/src/usr/local/www/vpn_openvpn_csc.php
@@ -0,0 +1,868 @@
+<?php
+/*
+ vpn_openvpn_csc.php
+
+ Copyright (C) 2008 Shrew Soft Inc.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-openvpn-csc
+##|*NAME=OpenVPN: Client Specific Override page
+##|*DESCR=Allow access to the 'OpenVPN: Client Specific Override' page.
+##|*MATCH=vpn_openvpn_csc.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("openvpn.inc");
+require_once("pkg-utils.inc");
+
+$pgtitle = array(gettext("OpenVPN"), gettext("Client Specific Override"));
+$shortcut_section = "openvpn";
+
+if (!is_array($config['openvpn']['openvpn-csc'])) {
+ $config['openvpn']['openvpn-csc'] = array();
+}
+
+$a_csc = &$config['openvpn']['openvpn-csc'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+$act = $_GET['act'];
+if (isset($_POST['act'])) {
+ $act = $_POST['act'];
+}
+
+if ($_GET['act'] == "del") {
+
+ if (!$a_csc[$id]) {
+ pfSenseHeader("vpn_openvpn_csc.php");
+ exit;
+ }
+
+ openvpn_delete_csc($a_csc[$id]);
+ unset($a_csc[$id]);
+ write_config();
+ $savemsg = gettext("Client Specific Override successfully deleted")."<br />";
+}
+
+if ($_GET['act'] == "edit") {
+
+ if (isset($id) && $a_csc[$id]) {
+ $pconfig['custom_options'] = $a_csc[$id]['custom_options'];
+ $pconfig['disable'] = isset($a_csc[$id]['disable']);
+ $pconfig['common_name'] = $a_csc[$id]['common_name'];
+ $pconfig['block'] = $a_csc[$id]['block'];
+ $pconfig['description'] = $a_csc[$id]['description'];
+
+ $pconfig['tunnel_network'] = $a_csc[$id]['tunnel_network'];
+ $pconfig['local_network'] = $a_csc[$id]['local_network'];
+ $pconfig['local_networkv6'] = $a_csc[$id]['local_networkv6'];
+ $pconfig['remote_network'] = $a_csc[$id]['remote_network'];
+ $pconfig['remote_networkv6'] = $a_csc[$id]['remote_networkv6'];
+ $pconfig['gwredir'] = $a_csc[$id]['gwredir'];
+
+ $pconfig['push_reset'] = $a_csc[$id]['push_reset'];
+
+ $pconfig['dns_domain'] = $a_csc[$id]['dns_domain'];
+ if ($pconfig['dns_domain']) {
+ $pconfig['dns_domain_enable'] = true;
+ }
+
+ $pconfig['dns_server1'] = $a_csc[$id]['dns_server1'];
+ $pconfig['dns_server2'] = $a_csc[$id]['dns_server2'];
+ $pconfig['dns_server3'] = $a_csc[$id]['dns_server3'];
+ $pconfig['dns_server4'] = $a_csc[$id]['dns_server4'];
+ if ($pconfig['dns_server1'] ||
+ $pconfig['dns_server2'] ||
+ $pconfig['dns_server3'] ||
+ $pconfig['dns_server4']) {
+ $pconfig['dns_server_enable'] = true;
+ }
+
+ $pconfig['ntp_server1'] = $a_csc[$id]['ntp_server1'];
+ $pconfig['ntp_server2'] = $a_csc[$id]['ntp_server2'];
+ if ($pconfig['ntp_server1'] ||
+ $pconfig['ntp_server2']) {
+ $pconfig['ntp_server_enable'] = true;
+ }
+
+ $pconfig['netbios_enable'] = $a_csc[$id]['netbios_enable'];
+ $pconfig['netbios_ntype'] = $a_csc[$id]['netbios_ntype'];
+ $pconfig['netbios_scope'] = $a_csc[$id]['netbios_scope'];
+
+ $pconfig['wins_server1'] = $a_csc[$id]['wins_server1'];
+ $pconfig['wins_server2'] = $a_csc[$id]['wins_server2'];
+ if ($pconfig['wins_server1'] ||
+ $pconfig['wins_server2']) {
+ $pconfig['wins_server_enable'] = true;
+ }
+
+ $pconfig['nbdd_server1'] = $a_csc[$id]['nbdd_server1'];
+ if ($pconfig['nbdd_server1']) {
+ $pconfig['nbdd_server_enable'] = true;
+ }
+ }
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($result = openvpn_validate_cidr($pconfig['tunnel_network'], 'Tunnel network')) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['local_network'], 'IPv4 Local Network', true, "ipv4")) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['local_networkv6'], 'IPv6 Local Network', true, "ipv6")) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['remote_network'], 'IPv4 Remote Network', true, "ipv4")) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['remote_networkv6'], 'IPv6 Remote Network', true, "ipv6")) {
+ $input_errors[] = $result;
+ }
+
+ if ($pconfig['dns_server_enable']) {
+ if (!empty($pconfig['dns_server1']) && !is_ipaddr(trim($pconfig['dns_server1']))) {
+ $input_errors[] = gettext("The field 'DNS Server #1' must contain a valid IP address");
+ }
+ if (!empty($pconfig['dns_server2']) && !is_ipaddr(trim($pconfig['dns_server2']))) {
+ $input_errors[] = gettext("The field 'DNS Server #2' must contain a valid IP address");
+ }
+ if (!empty($pconfig['dns_server3']) && !is_ipaddr(trim($pconfig['dns_server3']))) {
+ $input_errors[] = gettext("The field 'DNS Server #3' must contain a valid IP address");
+ }
+ if (!empty($pconfig['dns_server4']) && !is_ipaddr(trim($pconfig['dns_server4']))) {
+ $input_errors[] = gettext("The field 'DNS Server #4' must contain a valid IP address");
+ }
+ }
+
+ if ($pconfig['ntp_server_enable']) {
+ if (!empty($pconfig['ntp_server1']) && !is_ipaddr(trim($pconfig['ntp_server1']))) {
+ $input_errors[] = gettext("The field 'NTP Server #1' must contain a valid IP address");
+ }
+ if (!empty($pconfig['ntp_server2']) && !is_ipaddr(trim($pconfig['ntp_server2']))) {
+ $input_errors[] = gettext("The field 'NTP Server #2' must contain a valid IP address");
+ }
+ if (!empty($pconfig['ntp_server3']) && !is_ipaddr(trim($pconfig['ntp_server3']))) {
+ $input_errors[] = gettext("The field 'NTP Server #3' must contain a valid IP address");
+ }
+ if (!empty($pconfig['ntp_server4']) && !is_ipaddr(trim($pconfig['ntp_server4']))) {
+ $input_errors[] = gettext("The field 'NTP Server #4' must contain a valid IP address");
+ }
+ }
+
+ if ($pconfig['netbios_enable']) {
+ if ($pconfig['wins_server_enable']) {
+ if (!empty($pconfig['wins_server1']) && !is_ipaddr(trim($pconfig['wins_server1']))) {
+ $input_errors[] = gettext("The field 'WINS Server #1' must contain a valid IP address");
+ }
+ if (!empty($pconfig['wins_server2']) && !is_ipaddr(trim($pconfig['wins_server2']))) {
+ $input_errors[] = gettext("The field 'WINS Server #2' must contain a valid IP address");
+ }
+ }
+ if ($pconfig['nbdd_server_enable']) {
+ if (!empty($pconfig['nbdd_server1']) && !is_ipaddr(trim($pconfig['nbdd_server1']))) {
+ $input_errors[] = gettext("The field 'NetBIOS Data Distribution Server #1' must contain a valid IP address");
+ }
+ }
+ }
+
+ $reqdfields[] = 'common_name';
+ $reqdfieldsn[] = 'Common name';
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!$input_errors) {
+
+ $csc = array();
+
+ $csc['custom_options'] = $pconfig['custom_options'];
+ if ($_POST['disable'] == "yes") {
+ $csc['disable'] = true;
+ }
+ $csc['common_name'] = $pconfig['common_name'];
+ $csc['block'] = $pconfig['block'];
+ $csc['description'] = $pconfig['description'];
+
+ $csc['tunnel_network'] = $pconfig['tunnel_network'];
+ $csc['local_network'] = $pconfig['local_network'];
+ $csc['local_networkv6'] = $pconfig['local_networkv6'];
+ $csc['remote_network'] = $pconfig['remote_network'];
+ $csc['remote_networkv6'] = $pconfig['remote_networkv6'];
+ $csc['gwredir'] = $pconfig['gwredir'];
+
+ $csc['push_reset'] = $pconfig['push_reset'];
+
+ if ($pconfig['dns_domain_enable']) {
+ $csc['dns_domain'] = $pconfig['dns_domain'];
+ }
+
+ if ($pconfig['dns_server_enable']) {
+ $csc['dns_server1'] = $pconfig['dns_server1'];
+ $csc['dns_server2'] = $pconfig['dns_server2'];
+ $csc['dns_server3'] = $pconfig['dns_server3'];
+ $csc['dns_server4'] = $pconfig['dns_server4'];
+ }
+
+ if ($pconfig['ntp_server_enable']) {
+ $csc['ntp_server1'] = $pconfig['ntp_server1'];
+ $csc['ntp_server2'] = $pconfig['ntp_server2'];
+ }
+
+ $csc['netbios_enable'] = $pconfig['netbios_enable'];
+ $csc['netbios_ntype'] = $pconfig['netbios_ntype'];
+ $csc['netbios_scope'] = $pconfig['netbios_scope'];
+
+ if ($pconfig['netbios_enable']) {
+
+ if ($pconfig['wins_server_enable']) {
+ $csc['wins_server1'] = $pconfig['wins_server1'];
+ $csc['wins_server2'] = $pconfig['wins_server2'];
+ }
+
+ if ($pconfig['dns_server_enable']) {
+ $csc['nbdd_server1'] = $pconfig['nbdd_server1'];
+ }
+ }
+
+ if (isset($id) && $a_csc[$id]) {
+ $old_csc_cn = $a_csc[$id]['common_name'];
+ $a_csc[$id] = $csc;
+ } else {
+ $a_csc[] = $csc;
+ }
+
+ if (!empty($old_csc_cn)) {
+ openvpn_cleanup_csc($old_csc_cn);
+ }
+ openvpn_resync_csc($csc);
+ write_config();
+
+ header("Location: vpn_openvpn_csc.php");
+ exit;
+ }
+}
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function dns_domain_change() {
+
+ if (document.iform.dns_domain_enable.checked) {
+ document.getElementById("dns_domain_data").style.display="";
+ } else {
+ document.getElementById("dns_domain_data").style.display="none";
+ }
+}
+
+function dns_server_change() {
+
+ if (document.iform.dns_server_enable.checked) {
+ document.getElementById("dns_server_data").style.display="";
+ } else {
+ document.getElementById("dns_server_data").style.display="none";
+ }
+}
+
+function wins_server_change() {
+
+ if (document.iform.wins_server_enable.checked) {
+ document.getElementById("wins_server_data").style.display="";
+ } else {
+ document.getElementById("wins_server_data").style.display="none";
+ }
+}
+
+function ntp_server_change() {
+
+ if (document.iform.ntp_server_enable.checked) {
+ document.getElementById("ntp_server_data").style.display="";
+ } else {
+ document.getElementById("ntp_server_data").style.display="none";
+ }
+}
+
+function netbios_change() {
+
+ if (document.iform.netbios_enable.checked) {
+ document.getElementById("netbios_data").style.display="";
+ document.getElementById("wins_opts").style.display="";
+ } else {
+ document.getElementById("netbios_data").style.display="none";
+ document.getElementById("wins_opts").style.display="none";
+ }
+}
+
+//]]>
+</script>
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn openvpn csc">
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Server"), false, "vpn_openvpn_server.php");
+ $tab_array[] = array(gettext("Client"), false, "vpn_openvpn_client.php");
+ $tab_array[] = array(gettext("Client Specific Overrides"), true, "vpn_openvpn_csc.php");
+ $tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
+ add_package_tabs("openvpn-client-export", $tab_array);
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+
+ <?php if ($act == "new" || $act == "edit"): ?>
+
+ <form action="vpn_openvpn_csc.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="general information">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("General information"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="0" cellspacing="0" summary="enable disable">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['disable'], $chk); ?>
+ <input name="disable" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ &nbsp;
+ <span class="vexpl">
+ <strong><?=gettext("Disable this override"); ?></strong><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?=gettext("Set this option to disable this client-specific override without removing it from the list"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Common name"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="common_name" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['common_name']);?>" />
+ <br />
+ <?=gettext("Enter the client's X.509 common name here"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="description" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['description']);?>" />
+ <br />
+ <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Connection blocking"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="connection blocking">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['block'], $chk); ?>
+ <input name="block" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Block this client connection based on its common name"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?=gettext("Don't use this option to permanently disable a " .
+ "client due to a compromised key or password. " .
+ "Use a CRL (certificate revocation list) instead"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Tunnel Settings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Tunnel Network"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="tunnel_network" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_network']);?>" />
+ <br />
+ <?=gettext("This is the virtual network used for private " .
+ "communications between this client and the " .
+ "server expressed using CIDR (eg. 10.0.8.0/24). " .
+ "The first network address is assumed to be the " .
+ "server address and the second network address " .
+ "will be assigned to the client virtual " .
+ "interface"); ?>.
+ </td>
+ </tr>
+ <tr id="local_optsv4">
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Local Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="local_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['local_network']);?>" />
+ <br />
+ <?=gettext("These are the IPv4 networks that will be accessible " .
+ "from this particular client. Expressed as a comma-separated list of one or more CIDR ranges."); ?>
+ <br /><?=gettext("NOTE: You do not need to specify networks here if they have " .
+ "already been defined on the main server configuration.");?>
+ </td>
+ </tr>
+ <tr id="local_optsv6">
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Local Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="local_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['local_networkv6']);?>" />
+ <br />
+ <?=gettext("These are the IPv6 networks that will be accessible " .
+ "from this particular client. Expressed as a comma-separated list of one or more IP/PREFIX networks."); ?>
+ <br /><?=gettext("NOTE: You do not need to specify networks here if they have " .
+ "already been defined on the main server configuration.");?>
+ </td>
+ </tr>
+ <tr id="remote_optsv4">
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Remote Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="remote_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_network']);?>" />
+ <br />
+ <?=gettext("These are the IPv4 networks that will be routed " .
+ "to this client specifically using iroute, so that a site-to-site " .
+ "VPN can be established. " .
+ "Expressed as a comma-separated list of one or more CIDR ranges. " .
+ "You may leave this blank if there are no client-side networks to " .
+ "be routed"); ?>.
+ <br /><?=gettext("NOTE: Remember to add these subnets to the " .
+ "IPv4 Remote Networks list on the corresponding OpenVPN server settings.");?>
+ </td>
+ </tr>
+ <tr id="remote_optsv6">
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Remote Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="remote_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_networkv6']);?>" />
+ <br />
+ <?=gettext("These are the IPv6 networks that will be routed " .
+ "to this client specifically using iroute, so that a site-to-site " .
+ "VPN can be established. " .
+ "Expressed as a comma-separated list of one or more IP/PREFIX networks. " .
+ "You may leave this blank if there are no client-side networks to " .
+ "be routed"); ?>.
+ <br /><?=gettext("NOTE: Remember to add these subnets to the " .
+ "IPv6 Remote Networks list on the corresponding OpenVPN server settings.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Redirect Gateway"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="redirect gateway">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['gwredir'], $chk); ?>
+ <input name="gwredir" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Force all client generated traffic through the tunnel"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Client Settings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Server Definitions"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="server definitions">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['push_reset'], $chk); ?>
+ <input name="push_reset" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Prevent this client from receiving any server-defined client settings"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS Default Domain"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="dns default domain">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['dns_domain_enable'], $chk); ?>
+ <input name="dns_domain_enable" type="checkbox" id="dns_domain_enable" value="yes" <?=$chk;?> onclick="dns_domain_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Provide a default domain name to clients"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellpadding="2" cellspacing="0" id="dns_domain_data" summary="dns domain data">
+ <tr>
+ <td>
+ <input name="dns_domain" type="text" class="formfld unknown" id="dns_domain" size="30" value="<?=htmlspecialchars($pconfig['dns_domain']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="dns servers">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['dns_server_enable'], $chk); ?>
+ <input name="dns_server_enable" type="checkbox" id="dns_server_enable" value="yes" <?=$chk;?> onclick="dns_server_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Provide a DNS server list to clients"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellpadding="2" cellspacing="0" id="dns_server_data" summary="dns server list">
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #1:&nbsp;
+ </span>
+ <input name="dns_server1" type="text" class="formfld unknown" id="dns_server1" size="20" value="<?=htmlspecialchars($pconfig['dns_server1']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #2:&nbsp;
+ </span>
+ <input name="dns_server2" type="text" class="formfld unknown" id="dns_server2" size="20" value="<?=htmlspecialchars($pconfig['dns_server2']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #3:&nbsp;
+ </span>
+ <input name="dns_server3" type="text" class="formfld unknown" id="dns_server3" size="20" value="<?=htmlspecialchars($pconfig['dns_server3']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #4:&nbsp;
+ </span>
+ <input name="dns_server4" type="text" class="formfld unknown" id="dns_server4" size="20" value="<?=htmlspecialchars($pconfig['dns_server4']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NTP Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="ntp servers">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['ntp_server_enable'], $chk); ?>
+ <input name="ntp_server_enable" type="checkbox" id="ntp_server_enable" value="yes" <?=$chk;?> onclick="ntp_server_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Provide a NTP server list to clients"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellpadding="2" cellspacing="0" id="ntp_server_data" summary="ntp server list">
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #1:&nbsp;
+ </span>
+ <input name="ntp_server1" type="text" class="formfld unknown" id="ntp_server1" size="20" value="<?=htmlspecialchars($pconfig['ntp_server1']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #2:&nbsp;
+ </span>
+ <input name="ntp_server2" type="text" class="formfld unknown" id="ntp_server2" size="20" value="<?=htmlspecialchars($pconfig['ntp_server2']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NetBIOS Options"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="netbios options">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['netbios_enable'], $chk); ?>
+ <input name="netbios_enable" type="checkbox" id="netbios_enable" value="yes" <?=$chk;?> onclick="netbios_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Enable NetBIOS over TCP/IP"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?=gettext("If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) will be disabled"); ?>.
+ <br />
+ <table border="0" cellpadding="2" cellspacing="0" id="netbios_data" summary="netbios options">
+ <tr>
+ <td>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Node Type"); ?>:&nbsp;
+ </span>
+ <select name='netbios_ntype' class="formselect">
+ <?php
+ foreach ($netbios_nodetypes as $type => $name):
+ $selected = "";
+ if ($pconfig['netbios_ntype'] == $type) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$type;?>" <?=$selected;?>><?=$name;?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Possible options: b-node (broadcasts), p-node " .
+ "(point-to-point name queries to a WINS server), " .
+ "m-node (broadcast then query name server), and " .
+ "h-node (query name server, then broadcast)"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <br />
+ <span class="vexpl">
+ Scope ID:&nbsp;
+ </span>
+ <input name="netbios_scope" type="text" class="formfld unknown" id="netbios_scope" size="30" value="<?=htmlspecialchars($pconfig['netbios_scope']);?>" />
+ <br />
+ <?=gettext("A NetBIOS Scope ID provides an extended naming " .
+ "service for NetBIOS over TCP/IP. The NetBIOS " .
+ "scope ID isolates NetBIOS traffic on a single " .
+ "network to only those nodes with the same " .
+ "NetBIOS scope ID"); ?>.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="wins_opts">
+ <td width="22%" valign="top" class="vncell"><?=gettext("WINS Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="wins servers">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['wins_server_enable'], $chk); ?>
+ <input name="wins_server_enable" type="checkbox" id="wins_server_enable" value="yes" <?=$chk;?> onclick="wins_server_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Provide a WINS server list to clients"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellpadding="2" cellspacing="0" id="wins_server_data" summary="wins server list">
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #1:&nbsp;
+ </span>
+ <input name="wins_server1" type="text" class="formfld unknown" id="wins_server1" size="20" value="<?=htmlspecialchars($pconfig['wins_server1']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #2:&nbsp;
+ </span>
+ <input name="wins_server2" type="text" class="formfld unknown" id="wins_server2" size="20" value="<?=htmlspecialchars($pconfig['wins_server2']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Advanced"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="advanced">
+ <tr>
+ <td>
+ <textarea rows="6" cols="70" name="custom_options" id="custom_options"><?=$pconfig['custom_options'];?></textarea><br />
+ <?=gettext("Enter any additional options you would like to add for this client specific override, separated by a semicolon"); ?><br />
+ <?=gettext("EXAMPLE: push \"route 10.0.0.0 255.255.255.0\""); ?>;
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input name="act" type="hidden" value="<?=$act;?>" />
+ <?php if (isset($id) && $a_csc[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+ <?php else: ?>
+
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="list">
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Disabled"); ?></td>
+ <td width="40%" class="listhdrr"><?=gettext("Common Name"); ?></td>
+ <td width="40%" class="listhdrr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+ <?php
+ $i = 0;
+ foreach ($a_csc as $csc):
+ $disabled = "NO";
+ if (isset($csc['disable'])) {
+ $disabled = "YES";
+ }
+ ?>
+ <tr ondblclick="document.location='vpn_openvpn_csc.php?act=edit&amp;id=<?=$i;?>'">
+ <td class="listlr">
+ <?=$disabled;?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($csc['common_name']);?>
+ </td>
+ <td class="listbg">
+ <?=htmlspecialchars($csc['description']);?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="vpn_openvpn_csc.php?act=edit&amp;id=<?=$i;?>">
+ <img src="./themes/<?=$g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit csc"); ?>" width="17" height="17" border="0" alt="edit" />
+ </a>
+ &nbsp;
+ <a href="vpn_openvpn_csc.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this csc?"); ?>')">
+ <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete csc"); ?>" width="17" height="17" border="0" alt="delete" />
+ </a>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <a href="vpn_openvpn_csc.php?act=new"><img src="./themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add csc"); ?>" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <p>
+ <?=gettext("Additional OpenVPN client specific overrides can be added here.");?>
+ </p>
+ </td>
+ </tr>
+ </table>
+
+ <?php endif; ?>
+
+ </td>
+ </tr>
+</table>
+<script type="text/javascript">
+//<![CDATA[
+dns_domain_change();
+dns_server_change();
+wins_server_change();
+ntp_server_change();
+netbios_change();
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
+
+<?php
+
+/* local utility functions */
+
+function set_checked($var, & $chk) {
+ if ($var) {
+ $chk = "checked=\"checked\"";
+ } else {
+ $chk = "";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/vpn_openvpn_server.php b/src/usr/local/www/vpn_openvpn_server.php
new file mode 100644
index 0000000..a7ff4ce
--- /dev/null
+++ b/src/usr/local/www/vpn_openvpn_server.php
@@ -0,0 +1,2042 @@
+<?php
+/*
+ vpn_openvpn_server.php
+
+ Copyright (C) 2008 Shrew Soft Inc.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-openvpn-server
+##|*NAME=OpenVPN: Server page
+##|*DESCR=Allow access to the 'OpenVPN: Server' page.
+##|*MATCH=vpn_openvpn_server.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("openvpn.inc");
+require_once("pkg-utils.inc");
+
+if (!is_array($config['openvpn']['openvpn-server'])) {
+ $config['openvpn']['openvpn-server'] = array();
+}
+
+$a_server = &$config['openvpn']['openvpn-server'];
+
+if (!is_array($config['ca'])) {
+ $config['ca'] = array();
+}
+
+$a_ca =& $config['ca'];
+
+if (!is_array($config['cert'])) {
+ $config['cert'] = array();
+}
+
+$a_cert =& $config['cert'];
+
+if (!is_array($config['crl'])) {
+ $config['crl'] = array();
+}
+
+$a_crl =& $config['crl'];
+
+foreach ($a_crl as $cid => $acrl) {
+ if (!isset($acrl['refid'])) {
+ unset ($a_crl[$cid]);
+ }
+}
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+$act = $_GET['act'];
+if (isset($_POST['act'])) {
+ $act = $_POST['act'];
+}
+
+if (isset($id) && $a_server[$id]) {
+ $vpnid = $a_server[$id]['vpnid'];
+} else {
+ $vpnid = 0;
+}
+
+if ($_GET['act'] == "del") {
+
+ if (!isset($a_server[$id])) {
+ pfSenseHeader("vpn_openvpn_server.php");
+ exit;
+ }
+ if (!empty($a_server[$id])) {
+ openvpn_delete('server', $a_server[$id]);
+ }
+ unset($a_server[$id]);
+ write_config();
+ $savemsg = gettext("Server successfully deleted")."<br />";
+}
+
+if ($_GET['act'] == "new") {
+ $pconfig['autokey_enable'] = "yes";
+ $pconfig['tlsauth_enable'] = "yes";
+ $pconfig['autotls_enable'] = "yes";
+ $pconfig['dh_length'] = 1024;
+ $pconfig['dev_mode'] = "tun";
+ $pconfig['interface'] = "wan";
+ $pconfig['local_port'] = openvpn_port_next('UDP');
+ $pconfig['pool_enable'] = "yes";
+ $pconfig['cert_depth'] = 1;
+ $pconfig['verbosity_level'] = 1; // Default verbosity is 1
+ // OpenVPN Defaults to SHA1
+ $pconfig['digest'] = "SHA1";
+}
+
+if ($_GET['act'] == "edit") {
+
+ if (isset($id) && $a_server[$id]) {
+ $pconfig['disable'] = isset($a_server[$id]['disable']);
+ $pconfig['mode'] = $a_server[$id]['mode'];
+ $pconfig['protocol'] = $a_server[$id]['protocol'];
+ $pconfig['authmode'] = $a_server[$id]['authmode'];
+ $pconfig['dev_mode'] = $a_server[$id]['dev_mode'];
+ $pconfig['interface'] = $a_server[$id]['interface'];
+ if (!empty($a_server[$id]['ipaddr'])) {
+ $pconfig['interface'] = $pconfig['interface'] . '|' . $a_server[$id]['ipaddr'];
+ }
+ $pconfig['local_port'] = $a_server[$id]['local_port'];
+ $pconfig['description'] = $a_server[$id]['description'];
+ $pconfig['custom_options'] = $a_server[$id]['custom_options'];
+
+ if ($pconfig['mode'] != "p2p_shared_key") {
+ if ($a_server[$id]['tls']) {
+ $pconfig['tlsauth_enable'] = "yes";
+ $pconfig['tls'] = base64_decode($a_server[$id]['tls']);
+ }
+ $pconfig['caref'] = $a_server[$id]['caref'];
+ $pconfig['crlref'] = $a_server[$id]['crlref'];
+ $pconfig['certref'] = $a_server[$id]['certref'];
+ $pconfig['dh_length'] = $a_server[$id]['dh_length'];
+ if (isset($a_server[$id]['cert_depth'])) {
+ $pconfig['cert_depth'] = $a_server[$id]['cert_depth'];
+ } else {
+ $pconfig['cert_depth'] = 1;
+ }
+ if ($pconfig['mode'] == "server_tls_user") {
+ $pconfig['strictusercn'] = $a_server[$id]['strictusercn'];
+ }
+ } else {
+ $pconfig['shared_key'] = base64_decode($a_server[$id]['shared_key']);
+ }
+ $pconfig['crypto'] = $a_server[$id]['crypto'];
+ // OpenVPN Defaults to SHA1 if unset
+ $pconfig['digest'] = !empty($a_server[$id]['digest']) ? $a_server[$id]['digest'] : "SHA1";
+ $pconfig['engine'] = $a_server[$id]['engine'];
+
+ $pconfig['tunnel_network'] = $a_server[$id]['tunnel_network'];
+ $pconfig['tunnel_networkv6'] = $a_server[$id]['tunnel_networkv6'];
+
+ $pconfig['remote_network'] = $a_server[$id]['remote_network'];
+ $pconfig['remote_networkv6'] = $a_server[$id]['remote_networkv6'];
+ $pconfig['gwredir'] = $a_server[$id]['gwredir'];
+ $pconfig['local_network'] = $a_server[$id]['local_network'];
+ $pconfig['local_networkv6'] = $a_server[$id]['local_networkv6'];
+ $pconfig['maxclients'] = $a_server[$id]['maxclients'];
+ $pconfig['compression'] = $a_server[$id]['compression'];
+ $pconfig['passtos'] = $a_server[$id]['passtos'];
+ $pconfig['client2client'] = $a_server[$id]['client2client'];
+
+ $pconfig['dynamic_ip'] = $a_server[$id]['dynamic_ip'];
+ $pconfig['pool_enable'] = $a_server[$id]['pool_enable'];
+ $pconfig['topology_subnet'] = $a_server[$id]['topology_subnet'];
+
+ $pconfig['serverbridge_dhcp'] = $a_server[$id]['serverbridge_dhcp'];
+ $pconfig['serverbridge_interface'] = $a_server[$id]['serverbridge_interface'];
+ $pconfig['serverbridge_dhcp_start'] = $a_server[$id]['serverbridge_dhcp_start'];
+ $pconfig['serverbridge_dhcp_end'] = $a_server[$id]['serverbridge_dhcp_end'];
+
+ $pconfig['dns_domain'] = $a_server[$id]['dns_domain'];
+ if ($pconfig['dns_domain']) {
+ $pconfig['dns_domain_enable'] = true;
+ }
+
+ $pconfig['dns_server1'] = $a_server[$id]['dns_server1'];
+ $pconfig['dns_server2'] = $a_server[$id]['dns_server2'];
+ $pconfig['dns_server3'] = $a_server[$id]['dns_server3'];
+ $pconfig['dns_server4'] = $a_server[$id]['dns_server4'];
+ if ($pconfig['dns_server1'] ||
+ $pconfig['dns_server2'] ||
+ $pconfig['dns_server3'] ||
+ $pconfig['dns_server4']) {
+ $pconfig['dns_server_enable'] = true;
+ }
+
+ $pconfig['ntp_server1'] = $a_server[$id]['ntp_server1'];
+ $pconfig['ntp_server2'] = $a_server[$id]['ntp_server2'];
+ if ($pconfig['ntp_server1'] ||
+ $pconfig['ntp_server2']) {
+ $pconfig['ntp_server_enable'] = true;
+ }
+
+ $pconfig['netbios_enable'] = $a_server[$id]['netbios_enable'];
+ $pconfig['netbios_ntype'] = $a_server[$id]['netbios_ntype'];
+ $pconfig['netbios_scope'] = $a_server[$id]['netbios_scope'];
+
+ $pconfig['wins_server1'] = $a_server[$id]['wins_server1'];
+ $pconfig['wins_server2'] = $a_server[$id]['wins_server2'];
+ if ($pconfig['wins_server1'] ||
+ $pconfig['wins_server2']) {
+ $pconfig['wins_server_enable'] = true;
+ }
+
+ $pconfig['client_mgmt_port'] = $a_server[$id]['client_mgmt_port'];
+ if ($pconfig['client_mgmt_port']) {
+ $pconfig['client_mgmt_port_enable'] = true;
+ }
+
+ $pconfig['nbdd_server1'] = $a_server[$id]['nbdd_server1'];
+ if ($pconfig['nbdd_server1']) {
+ $pconfig['nbdd_server_enable'] = true;
+ }
+
+ // just in case the modes switch
+ $pconfig['autokey_enable'] = "yes";
+ $pconfig['autotls_enable'] = "yes";
+
+ $pconfig['duplicate_cn'] = isset($a_server[$id]['duplicate_cn']);
+
+ $pconfig['no_tun_ipv6'] = $a_server[$id]['no_tun_ipv6'];
+ if (isset($a_server[$id]['verbosity_level'])) {
+ $pconfig['verbosity_level'] = $a_server[$id]['verbosity_level'];
+ } else {
+ $pconfig['verbosity_level'] = 1; // Default verbosity is 1
+ }
+
+ $pconfig['push_register_dns'] = $a_server[$id]['push_register_dns'];
+ }
+}
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ if (isset($id) && $a_server[$id]) {
+ $vpnid = $a_server[$id]['vpnid'];
+ } else {
+ $vpnid = 0;
+ }
+
+ list($iv_iface, $iv_ip) = explode ("|", $pconfig['interface']);
+ if (is_ipaddrv4($iv_ip) && (stristr($pconfig['protocol'], "6") !== false)) {
+ $input_errors[] = gettext("Protocol and IP address families do not match. You cannot select an IPv6 protocol and an IPv4 IP address.");
+ } elseif (is_ipaddrv6($iv_ip) && (stristr($pconfig['protocol'], "6") === false)) {
+ $input_errors[] = gettext("Protocol and IP address families do not match. You cannot select an IPv4 protocol and an IPv6 IP address.");
+ } elseif ((stristr($pconfig['protocol'], "6") === false) && !get_interface_ip($iv_iface) && ($pconfig['interface'] != "any")) {
+ $input_errors[] = gettext("An IPv4 protocol was selected, but the selected interface has no IPv4 address.");
+ } elseif ((stristr($pconfig['protocol'], "6") !== false) && !get_interface_ipv6($iv_iface) && ($pconfig['interface'] != "any")) {
+ $input_errors[] = gettext("An IPv6 protocol was selected, but the selected interface has no IPv6 address.");
+ }
+
+ if ($pconfig['mode'] != "p2p_shared_key") {
+ $tls_mode = true;
+ } else {
+ $tls_mode = false;
+ }
+
+ if (empty($pconfig['authmode']) && (($pconfig['mode'] == "server_user") || ($pconfig['mode'] == "server_tls_user"))) {
+ $input_errors[] = gettext("You must select a Backend for Authentication if the server mode requires User Auth.");
+ }
+
+ /* input validation */
+ if ($result = openvpn_validate_port($pconfig['local_port'], 'Local port')) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['tunnel_network'], 'IPv4 Tunnel Network', false, "ipv4")) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['tunnel_networkv6'], 'IPv6 Tunnel Network', false, "ipv6")) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['remote_network'], 'IPv4 Remote Network', true, "ipv4")) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['remote_networkv6'], 'IPv6 Remote Network', true, "ipv6")) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['local_network'], 'IPv4 Local Network', true, "ipv4")) {
+ $input_errors[] = $result;
+ }
+
+ if ($result = openvpn_validate_cidr($pconfig['local_networkv6'], 'IPv6 Local Network', true, "ipv6")) {
+ $input_errors[] = $result;
+ }
+
+ $portused = openvpn_port_used($pconfig['protocol'], $pconfig['interface'], $pconfig['local_port'], $vpnid);
+ if (($portused != $vpnid) && ($portused != 0)) {
+ $input_errors[] = gettext("The specified 'Local port' is in use. Please select another value");
+ }
+
+ if ($pconfig['autokey_enable']) {
+ $pconfig['shared_key'] = openvpn_create_key();
+ }
+
+ if (!$tls_mode && !$pconfig['autokey_enable']) {
+ if (!strstr($pconfig['shared_key'], "-----BEGIN OpenVPN Static key V1-----") ||
+ !strstr($pconfig['shared_key'], "-----END OpenVPN Static key V1-----")) {
+ $input_errors[] = gettext("The field 'Shared Key' does not appear to be valid");
+ }
+ }
+
+ if ($tls_mode && $pconfig['tlsauth_enable'] && !$pconfig['autotls_enable']) {
+ if (!strstr($pconfig['tls'], "-----BEGIN OpenVPN Static key V1-----") ||
+ !strstr($pconfig['tls'], "-----END OpenVPN Static key V1-----")) {
+ $input_errors[] = gettext("The field 'TLS Authentication Key' does not appear to be valid");
+ }
+ }
+
+ if ($pconfig['dns_server_enable']) {
+ if (!empty($pconfig['dns_server1']) && !is_ipaddr(trim($pconfig['dns_server1']))) {
+ $input_errors[] = gettext("The field 'DNS Server #1' must contain a valid IP address");
+ }
+ if (!empty($pconfig['dns_server2']) && !is_ipaddr(trim($pconfig['dns_server2']))) {
+ $input_errors[] = gettext("The field 'DNS Server #2' must contain a valid IP address");
+ }
+ if (!empty($pconfig['dns_server3']) && !is_ipaddr(trim($pconfig['dns_server3']))) {
+ $input_errors[] = gettext("The field 'DNS Server #3' must contain a valid IP address");
+ }
+ if (!empty($pconfig['dns_server4']) && !is_ipaddr(trim($pconfig['dns_server4']))) {
+ $input_errors[] = gettext("The field 'DNS Server #4' must contain a valid IP address");
+ }
+ }
+
+ if ($pconfig['ntp_server_enable']) {
+ if (!empty($pconfig['ntp_server1']) && !is_ipaddr(trim($pconfig['ntp_server1']))) {
+ $input_errors[] = gettext("The field 'NTP Server #1' must contain a valid IP address");
+ }
+ if (!empty($pconfig['ntp_server2']) && !is_ipaddr(trim($pconfig['ntp_server2']))) {
+ $input_errors[] = gettext("The field 'NTP Server #2' must contain a valid IP address");
+ }
+ if (!empty($pconfig['ntp_server3']) && !is_ipaddr(trim($pconfig['ntp_server3']))) {
+ $input_errors[] = gettext("The field 'NTP Server #3' must contain a valid IP address");
+ }
+ if (!empty($pconfig['ntp_server4']) && !is_ipaddr(trim($pconfig['ntp_server4']))) {
+ $input_errors[] = gettext("The field 'NTP Server #4' must contain a valid IP address");
+ }
+ }
+
+ if ($pconfig['netbios_enable']) {
+ if ($pconfig['wins_server_enable']) {
+ if (!empty($pconfig['wins_server1']) && !is_ipaddr(trim($pconfig['wins_server1']))) {
+ $input_errors[] = gettext("The field 'WINS Server #1' must contain a valid IP address");
+ }
+ if (!empty($pconfig['wins_server2']) && !is_ipaddr(trim($pconfig['wins_server2']))) {
+ $input_errors[] = gettext("The field 'WINS Server #2' must contain a valid IP address");
+ }
+ }
+ if ($pconfig['nbdd_server_enable']) {
+ if (!empty($pconfig['nbdd_server1']) && !is_ipaddr(trim($pconfig['nbdd_server1']))) {
+ $input_errors[] = gettext("The field 'NetBIOS Data Distribution Server #1' must contain a valid IP address");
+ }
+ }
+ }
+
+ if ($pconfig['client_mgmt_port_enable']) {
+ if ($result = openvpn_validate_port($pconfig['client_mgmt_port'], 'Client management port')) {
+ $input_errors[] = $result;
+ }
+ }
+
+ if ($pconfig['maxclients'] && !is_numeric($pconfig['maxclients'])) {
+ $input_errors[] = gettext("The field 'Concurrent connections' must be numeric.");
+ }
+
+ /* If we are not in shared key mode, then we need the CA/Cert. */
+ if ($pconfig['mode'] != "p2p_shared_key") {
+ $reqdfields = explode(" ", "caref certref");
+ $reqdfieldsn = array(gettext("Certificate Authority"), gettext("Certificate"));
+ } elseif (!$pconfig['autokey_enable']) {
+ /* We only need the shared key filled in if we are in shared key mode and autokey is not selected. */
+ $reqdfields = array('shared_key');
+ $reqdfieldsn = array(gettext('Shared key'));
+ }
+
+ if ($pconfig['dev_mode'] != "tap") {
+ $reqdfields[] = 'tunnel_network';
+ $reqdfieldsn[] = gettext('Tunnel network');
+ } else {
+ if ($pconfig['serverbridge_dhcp'] && $pconfig['tunnel_network']) {
+ $input_errors[] = gettext("Using a tunnel network and server bridge settings together is not allowed.");
+ }
+ if (($pconfig['serverbridge_dhcp_start'] && !$pconfig['serverbridge_dhcp_end']) ||
+ (!$pconfig['serverbridge_dhcp_start'] && $pconfig['serverbridge_dhcp_end'])) {
+ $input_errors[] = gettext("Server Bridge DHCP Start and End must both be empty, or defined.");
+ }
+ if (($pconfig['serverbridge_dhcp_start'] && !is_ipaddrv4($pconfig['serverbridge_dhcp_start']))) {
+ $input_errors[] = gettext("Server Bridge DHCP Start must be an IPv4 address.");
+ }
+ if (($pconfig['serverbridge_dhcp_end'] && !is_ipaddrv4($pconfig['serverbridge_dhcp_end']))) {
+ $input_errors[] = gettext("Server Bridge DHCP End must be an IPv4 address.");
+ }
+ if (ip2ulong($pconfig['serverbridge_dhcp_start']) > ip2ulong($pconfig['serverbridge_dhcp_end'])) {
+ $input_errors[] = gettext("The Server Bridge DHCP range is invalid (start higher than end).");
+ }
+ }
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (!$input_errors) {
+
+ $server = array();
+
+ if ($id && $pconfig['dev_mode'] <> $a_server[$id]['dev_mode']) {
+ openvpn_delete('server', $a_server[$id]);// delete(rename) old interface so a new TUN or TAP interface can be created.
+ }
+
+ if ($vpnid) {
+ $server['vpnid'] = $vpnid;
+ } else {
+ $server['vpnid'] = openvpn_vpnid_next();
+ }
+
+ if ($_POST['disable'] == "yes") {
+ $server['disable'] = true;
+ }
+ $server['mode'] = $pconfig['mode'];
+ if (!empty($pconfig['authmode']) && (($pconfig['mode'] == "server_user") || ($pconfig['mode'] == "server_tls_user"))) {
+ $server['authmode'] = implode(",", $pconfig['authmode']);
+ }
+ $server['protocol'] = $pconfig['protocol'];
+ $server['dev_mode'] = $pconfig['dev_mode'];
+ list($server['interface'], $server['ipaddr']) = explode ("|", $pconfig['interface']);
+ $server['local_port'] = $pconfig['local_port'];
+ $server['description'] = $pconfig['description'];
+ $server['custom_options'] = str_replace("\r\n", "\n", $pconfig['custom_options']);
+
+ if ($tls_mode) {
+ if ($pconfig['tlsauth_enable']) {
+ if ($pconfig['autotls_enable']) {
+ $pconfig['tls'] = openvpn_create_key();
+ }
+ $server['tls'] = base64_encode($pconfig['tls']);
+ }
+ $server['caref'] = $pconfig['caref'];
+ $server['crlref'] = $pconfig['crlref'];
+ $server['certref'] = $pconfig['certref'];
+ $server['dh_length'] = $pconfig['dh_length'];
+ $server['cert_depth'] = $pconfig['cert_depth'];
+ if ($pconfig['mode'] == "server_tls_user") {
+ $server['strictusercn'] = $pconfig['strictusercn'];
+ }
+ } else {
+ $server['shared_key'] = base64_encode($pconfig['shared_key']);
+ }
+ $server['crypto'] = $pconfig['crypto'];
+ $server['digest'] = $pconfig['digest'];
+ $server['engine'] = $pconfig['engine'];
+
+ $server['tunnel_network'] = $pconfig['tunnel_network'];
+ $server['tunnel_networkv6'] = $pconfig['tunnel_networkv6'];
+ $server['remote_network'] = $pconfig['remote_network'];
+ $server['remote_networkv6'] = $pconfig['remote_networkv6'];
+ $server['gwredir'] = $pconfig['gwredir'];
+ $server['local_network'] = $pconfig['local_network'];
+ $server['local_networkv6'] = $pconfig['local_networkv6'];
+ $server['maxclients'] = $pconfig['maxclients'];
+ $server['compression'] = $pconfig['compression'];
+ $server['passtos'] = $pconfig['passtos'];
+ $server['client2client'] = $pconfig['client2client'];
+
+ $server['dynamic_ip'] = $pconfig['dynamic_ip'];
+ $server['pool_enable'] = $pconfig['pool_enable'];
+ $server['topology_subnet'] = $pconfig['topology_subnet'];
+
+ $server['serverbridge_dhcp'] = $pconfig['serverbridge_dhcp'];
+ $server['serverbridge_interface'] = $pconfig['serverbridge_interface'];
+ $server['serverbridge_dhcp_start'] = $pconfig['serverbridge_dhcp_start'];
+ $server['serverbridge_dhcp_end'] = $pconfig['serverbridge_dhcp_end'];
+
+ if ($pconfig['dns_domain_enable']) {
+ $server['dns_domain'] = $pconfig['dns_domain'];
+ }
+
+ if ($pconfig['dns_server_enable']) {
+ $server['dns_server1'] = $pconfig['dns_server1'];
+ $server['dns_server2'] = $pconfig['dns_server2'];
+ $server['dns_server3'] = $pconfig['dns_server3'];
+ $server['dns_server4'] = $pconfig['dns_server4'];
+ }
+
+ if ($pconfig['push_register_dns']) {
+ $server['push_register_dns'] = $pconfig['push_register_dns'];
+ }
+
+ if ($pconfig['ntp_server_enable']) {
+ $server['ntp_server1'] = $pconfig['ntp_server1'];
+ $server['ntp_server2'] = $pconfig['ntp_server2'];
+ }
+
+ $server['netbios_enable'] = $pconfig['netbios_enable'];
+ $server['netbios_ntype'] = $pconfig['netbios_ntype'];
+ $server['netbios_scope'] = $pconfig['netbios_scope'];
+
+ $server['no_tun_ipv6'] = $pconfig['no_tun_ipv6'];
+ $server['verbosity_level'] = $pconfig['verbosity_level'];
+
+ if ($pconfig['netbios_enable']) {
+
+ if ($pconfig['wins_server_enable']) {
+ $server['wins_server1'] = $pconfig['wins_server1'];
+ $server['wins_server2'] = $pconfig['wins_server2'];
+ }
+
+ if ($pconfig['dns_server_enable']) {
+ $server['nbdd_server1'] = $pconfig['nbdd_server1'];
+ }
+ }
+
+ if ($pconfig['client_mgmt_port_enable']) {
+ $server['client_mgmt_port'] = $pconfig['client_mgmt_port'];
+ }
+
+ if ($_POST['duplicate_cn'] == "yes") {
+ $server['duplicate_cn'] = true;
+ }
+
+ if (isset($id) && $a_server[$id]) {
+ $a_server[$id] = $server;
+ } else {
+ $a_server[] = $server;
+ }
+
+ openvpn_resync('server', $server);
+ write_config();
+
+ header("Location: vpn_openvpn_server.php");
+ exit;
+ }
+ if (!empty($pconfig['authmode'])) {
+ $pconfig['authmode'] = implode(",", $pconfig['authmode']);
+ }
+}
+$pgtitle = array(gettext("OpenVPN"), gettext("Server"));
+$shortcut_section = "openvpn";
+
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function mode_change() {
+ index = document.iform.mode.selectedIndex;
+ value = document.iform.mode.options[index].value;
+ switch (value) {
+ case "p2p_tls":
+ case "server_tls":
+ case "server_user":
+ document.getElementById("tls").style.display="";
+ document.getElementById("tls_ca").style.display="";
+ document.getElementById("tls_crl").style.display="";
+ document.getElementById("tls_cert").style.display="";
+ document.getElementById("tls_dh").style.display="";
+ document.getElementById("cert_depth").style.display="";
+ document.getElementById("strictusercn").style.display="none";
+ document.getElementById("psk").style.display="none";
+ break;
+ case "server_tls_user":
+ document.getElementById("tls").style.display="";
+ document.getElementById("tls_ca").style.display="";
+ document.getElementById("tls_crl").style.display="";
+ document.getElementById("tls_cert").style.display="";
+ document.getElementById("tls_dh").style.display="";
+ document.getElementById("cert_depth").style.display="";
+ document.getElementById("strictusercn").style.display="";
+ document.getElementById("psk").style.display="none";
+ break;
+ case "p2p_shared_key":
+ document.getElementById("tls").style.display="none";
+ document.getElementById("tls_ca").style.display="none";
+ document.getElementById("tls_crl").style.display="none";
+ document.getElementById("tls_cert").style.display="none";
+ document.getElementById("tls_dh").style.display="none";
+ document.getElementById("cert_depth").style.display="none";
+ document.getElementById("strictusercn").style.display="none";
+ document.getElementById("psk").style.display="";
+ break;
+ }
+ switch (value) {
+ case "p2p_shared_key":
+ document.getElementById("client_opts").style.display="none";
+ document.getElementById("remote_optsv4").style.display="";
+ document.getElementById("remote_optsv6").style.display="";
+ document.getElementById("gwredir_opts").style.display="none";
+ document.getElementById("local_optsv4").style.display="none";
+ document.getElementById("local_optsv6").style.display="none";
+ document.getElementById("authmodetr").style.display="none";
+ document.getElementById("inter_client_communication").style.display="none";
+ break;
+ case "p2p_tls":
+ document.getElementById("client_opts").style.display="none";
+ document.getElementById("remote_optsv4").style.display="";
+ document.getElementById("remote_optsv6").style.display="";
+ document.getElementById("gwredir_opts").style.display="";
+ document.getElementById("local_optsv4").style.display="";
+ document.getElementById("local_optsv6").style.display="";
+ document.getElementById("authmodetr").style.display="none";
+ document.getElementById("inter_client_communication").style.display="none";
+ break;
+ case "server_user":
+ case "server_tls_user":
+ document.getElementById("authmodetr").style.display="";
+ document.getElementById("client_opts").style.display="";
+ document.getElementById("remote_optsv4").style.display="none";
+ document.getElementById("remote_optsv6").style.display="none";
+ document.getElementById("gwredir_opts").style.display="";
+ document.getElementById("local_optsv4").style.display="";
+ document.getElementById("local_optsv6").style.display="";
+ document.getElementById("inter_client_communication").style.display="";
+ break;
+ case "server_tls":
+ document.getElementById("authmodetr").style.display="none";
+ default:
+ document.getElementById("client_opts").style.display="";
+ document.getElementById("remote_optsv4").style.display="none";
+ document.getElementById("remote_optsv6").style.display="none";
+ document.getElementById("gwredir_opts").style.display="";
+ document.getElementById("local_optsv4").style.display="";
+ document.getElementById("local_optsv6").style.display="";
+ document.getElementById("inter_client_communication").style.display="";
+ break;
+ }
+ gwredir_change();
+}
+
+function autokey_change() {
+
+ if ((document.iform.autokey_enable != null) && (document.iform.autokey_enable.checked)) {
+ document.getElementById("autokey_opts").style.display="none";
+ } else {
+ document.getElementById("autokey_opts").style.display="";
+ }
+}
+
+function tlsauth_change() {
+
+<?php if (!$pconfig['tls']): ?>
+ if (document.iform.tlsauth_enable.checked) {
+ document.getElementById("tlsauth_opts").style.display="";
+ } else {
+ document.getElementById("tlsauth_opts").style.display="none";
+ }
+<?php endif; ?>
+
+ autotls_change();
+}
+
+function autotls_change() {
+
+<?php if (!$pconfig['tls']): ?>
+ autocheck = document.iform.autotls_enable.checked;
+<?php else: ?>
+ autocheck = false;
+<?php endif; ?>
+
+ if (document.iform.tlsauth_enable.checked && !autocheck) {
+ document.getElementById("autotls_opts").style.display="";
+ } else {
+ document.getElementById("autotls_opts").style.display="none";
+ }
+}
+
+function gwredir_change() {
+
+ if (document.iform.gwredir.checked) {
+ document.getElementById("local_optsv4").style.display="none";
+ document.getElementById("local_optsv6").style.display="none";
+ } else {
+ document.getElementById("local_optsv4").style.display="";
+ document.getElementById("local_optsv6").style.display="";
+ }
+}
+
+function dns_domain_change() {
+
+ if (document.iform.dns_domain_enable.checked) {
+ document.getElementById("dns_domain_data").style.display="";
+ } else {
+ document.getElementById("dns_domain_data").style.display="none";
+ }
+}
+
+function dns_server_change() {
+
+ if (document.iform.dns_server_enable.checked) {
+ document.getElementById("dns_server_data").style.display="";
+ } else {
+ document.getElementById("dns_server_data").style.display="none";
+ }
+}
+
+function wins_server_change() {
+
+ if (document.iform.wins_server_enable.checked) {
+ document.getElementById("wins_server_data").style.display="";
+ } else {
+ document.getElementById("wins_server_data").style.display="none";
+ }
+}
+
+function client_mgmt_port_change() {
+
+ if (document.iform.client_mgmt_port_enable.checked) {
+ document.getElementById("client_mgmt_port_data").style.display="";
+ } else {
+ document.getElementById("client_mgmt_port_data").style.display="none";
+ }
+}
+
+function ntp_server_change() {
+
+ if (document.iform.ntp_server_enable.checked) {
+ document.getElementById("ntp_server_data").style.display="";
+ } else {
+ document.getElementById("ntp_server_data").style.display="none";
+ }
+}
+
+function netbios_change() {
+
+ if (document.iform.netbios_enable.checked) {
+ document.getElementById("netbios_data").style.display="";
+ document.getElementById("wins_opts").style.display="";
+ } else {
+ document.getElementById("netbios_data").style.display="none";
+ document.getElementById("wins_opts").style.display="none";
+ }
+}
+
+function tuntap_change() {
+
+ mindex = document.iform.mode.selectedIndex;
+ mvalue = document.iform.mode.options[mindex].value;
+
+ switch (mvalue) {
+ case "p2p_tls":
+ case "p2p_shared_key":
+ p2p = true;
+ break;
+ default:
+ p2p = false;
+ break;
+ }
+
+ index = document.iform.dev_mode.selectedIndex;
+ value = document.iform.dev_mode.options[index].value;
+ switch (value) {
+ case "tun":
+ document.getElementById("chkboxNoTunIPv6").style.display="";
+ document.getElementById("ipv4_tunnel_network").className="vncellreq";
+ document.getElementById("serverbridge_dhcp").style.display="none";
+ document.getElementById("serverbridge_interface").style.display="none";
+ document.getElementById("serverbridge_dhcp_start").style.display="none";
+ document.getElementById("serverbridge_dhcp_end").style.display="none";
+ document.getElementById("topology_subnet_opt").style.display="";
+ break;
+ case "tap":
+ document.getElementById("chkboxNoTunIPv6").style.display="none";
+ document.getElementById("ipv4_tunnel_network").className="vncell";
+ if (!p2p) {
+ document.getElementById("serverbridge_dhcp").style.display="";
+ document.getElementById("serverbridge_interface").style.display="";
+ document.getElementById("serverbridge_dhcp_start").style.display="";
+ document.getElementById("serverbridge_dhcp_end").style.display="";
+ document.getElementById("topology_subnet_opt").style.display="none";
+ document.iform.serverbridge_dhcp.disabled = false;
+ if (document.iform.serverbridge_dhcp.checked) {
+ document.iform.serverbridge_interface.disabled = false;
+ document.iform.serverbridge_dhcp_start.disabled = false;
+ document.iform.serverbridge_dhcp_end.disabled = false;
+ } else {
+ document.iform.serverbridge_interface.disabled = true;
+ document.iform.serverbridge_dhcp_start.disabled = true;
+ document.iform.serverbridge_dhcp_end.disabled = true;
+ }
+ } else {
+ document.getElementById("topology_subnet_opt").style.display="none";
+ document.iform.serverbridge_dhcp.disabled = true;
+ document.iform.serverbridge_interface.disabled = true;
+ document.iform.serverbridge_dhcp_start.disabled = true;
+ document.iform.serverbridge_dhcp_end.disabled = true;
+ }
+ break;
+ }
+}
+//]]>
+</script>
+<?php
+if (!$savemsg) {
+ $savemsg = "";
+}
+
+if ($input_errors) {
+ print_input_errors($input_errors);
+}
+if ($savemsg) {
+ print_info_box_np($savemsg);
+}
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn openvpn server">
+ <tr>
+ <td class="tabnavtbl">
+ <?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Server"), true, "vpn_openvpn_server.php");
+ $tab_array[] = array(gettext("Client"), false, "vpn_openvpn_client.php");
+ $tab_array[] = array(gettext("Client Specific Overrides"), false, "vpn_openvpn_csc.php");
+ $tab_array[] = array(gettext("Wizards"), false, "wizard.php?xml=openvpn_wizard.xml");
+ add_package_tabs("openvpn-client-export", $tab_array);
+ display_top_tabs($tab_array);
+ ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="tabcont">
+
+ <?php if ($act == "new" || $act == "edit"): ?>
+
+ <form action="vpn_openvpn_server.php" method="post" name="iform" id="iform" onsubmit="presubmit()">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="general information">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("General information"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Disabled"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="0" cellspacing="0" summary="enable disable server">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['disable'], $chk); ?>
+ <input name="disable" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ &nbsp;
+ <span class="vexpl">
+ <strong><?=gettext("Disable this server"); ?></strong><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?=gettext("Set this option to disable this server without removing it from the list"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server Mode");?></td>
+ <td width="78%" class="vtable">
+ <select name='mode' id='mode' class="formselect" onchange='mode_change(); tuntap_change()'>
+ <?php
+ foreach ($openvpn_server_modes as $name => $desc):
+ $selected = "";
+ if ($pconfig['mode'] == $name) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>" <?=$selected;?>><?=$desc;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr id="authmodetr" style="display:none">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Backend for authentication");?></td>
+ <td width="78%" class="vtable">
+ <select name='authmode[]' id='authmode' class="formselect" multiple="multiple" size="<?php echo count($auth_servers); ?>">
+ <?php
+ $authmodes = explode(",", $pconfig['authmode']);
+ $auth_servers = auth_get_authserver_list();
+ // If no authmodes set then default to selecting the first entry in auth_servers
+ if (empty($authmodes[0]) && !empty(key($auth_servers))) {
+ $authmodes[0] = key($auth_servers);
+ }
+
+ foreach ($auth_servers as $auth_server_key => $auth_server):
+ $selected = "";
+ if (in_array($auth_server_key, $authmodes)) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$auth_server_key;?>" <?=$selected;?>><?=$auth_server['name'];?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Protocol");?></td>
+ <td width="78%" class="vtable">
+ <select name='protocol' class="formselect">
+ <?php
+ foreach ($openvpn_prots as $prot):
+ $selected = "";
+ if ($pconfig['protocol'] == $prot) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$prot;?>" <?=$selected;?>><?=$prot;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Device Mode"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="dev_mode" class="formselect" onchange='tuntap_change()'>
+ <?php
+ foreach ($openvpn_dev_mode as $device):
+ $selected = "";
+ if (!empty($pconfig['dev_mode'])) {
+ if ($pconfig['dev_mode'] == $device) {
+ $selected = "selected=\"selected\"";
+ }
+ } else {
+ if ($device == "tun") {
+ $selected = "selected=\"selected\"";
+ }
+ }
+ ?>
+ <option value="<?=$device;?>" <?=$selected;?>><?=$device;?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="interface" class="formselect">
+ <?php
+ $interfaces = get_configured_interface_with_descr();
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip) {
+ $interfaces[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
+ }
+ $aliaslist = get_configured_ip_aliases_list();
+ foreach ($aliaslist as $aliasip => $aliasif) {
+ $interfaces[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+ }
+ $grouplist = return_gateway_groups_array();
+ foreach ($grouplist as $name => $group) {
+ if ($group['ipprotocol'] != inet) {
+ continue;
+ }
+ if ($group[0]['vip'] <> "") {
+ $vipif = $group[0]['vip'];
+ } else {
+ $vipif = $group[0]['int'];
+ }
+ $interfaces[$name] = "GW Group {$name}";
+ }
+ $interfaces['lo0'] = "Localhost";
+ $interfaces['any'] = "any";
+ foreach ($interfaces as $iface => $ifacename):
+ $selected = "";
+ if ($iface == $pconfig['interface']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$iface;?>" <?=$selected;?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php endforeach; ?>
+ </select> <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Local port");?></td>
+ <td width="78%" class="vtable">
+ <input name="local_port" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['local_port']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="description" type="text" class="formfld unknown" size="30" value="<?=htmlspecialchars($pconfig['description']);?>" />
+ <br />
+ <?=gettext("You may enter a description here for your reference (not parsed)"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Cryptographic Settings"); ?></td>
+ </tr>
+ <tr id="tls">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("TLS Authentication"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="tls authentication">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['tlsauth_enable'], $chk); ?>
+ <input name="tlsauth_enable" id="tlsauth_enable" type="checkbox" value="yes" <?=$chk;?> onclick="tlsauth_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Enable authentication of TLS packets"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?php if (!$pconfig['tls']): ?>
+ <table border="0" cellpadding="2" cellspacing="0" id="tlsauth_opts" summary="tls authentication options">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['autotls_enable'], $chk); ?>
+ <input name="autotls_enable" id="autotls_enable" type="checkbox" value="yes" <?=$chk;?> onclick="autotls_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Automatically generate a shared TLS authentication key"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?php endif; ?>
+ <table border="0" cellpadding="2" cellspacing="0" id="autotls_opts" summary="tls authentication key">
+ <tr>
+ <td>
+ <textarea name="tls" cols="65" rows="7" class="formpre"><?=htmlspecialchars($pconfig['tls']);?></textarea>
+ <br />
+ <?=gettext("Paste your shared key here"); ?>.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="tls_ca">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Peer Certificate Authority"); ?></td>
+ <td width="78%" class="vtable">
+ <?php if (count($a_ca)): ?>
+ <select name='caref' class="formselect">
+ <?php
+ foreach ($a_ca as $ca):
+ $selected = "";
+ if ($pconfig['caref'] == $ca['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$ca['refid'];?>" <?=$selected;?>><?=htmlspecialchars($ca['descr']);?></option>
+ <?php endforeach; ?>
+ </select>
+ <?php else: ?>
+ <b>No Certificate Authorities defined.</b> <br />Create one under <a href="system_camanager.php">System &gt; Cert Manager</a>.
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr id="tls_crl">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Peer Certificate Revocation List"); ?></td>
+ <td width="78%" class="vtable">
+ <?php if (count($a_crl)): ?>
+ <select name='crlref' class="formselect">
+ <option value="">None</option>
+ <?php
+ foreach ($a_crl as $crl):
+ $selected = "";
+ $caname = "";
+ $ca = lookup_ca($crl['caref']);
+ if ($ca) {
+ $caname = " (CA: " . htmlspecialchars($ca['descr']) . ")";
+ if ($pconfig['crlref'] == $crl['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ }
+ ?>
+ <option value="<?=$crl['refid'];?>" <?=$selected;?>><?=htmlspecialchars($crl['descr']) . $caname;?></option>
+ <?php endforeach; ?>
+ </select>
+ <?php else: ?>
+ <b>No Certificate Revocation Lists (CRLs) defined.</b> <br />Create one under <a href="system_crlmanager.php">System &gt; Cert Manager</a>.
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr id="tls_cert">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server Certificate"); ?></td>
+ <td width="78%" class="vtable">
+ <?php if (count($a_cert)): ?>
+ <select name='certref' class="formselect">
+ <?php
+ foreach ($a_cert as $cert):
+ $selected = "";
+ $caname = "";
+ $inuse = "";
+ $revoked = "";
+ $ca = lookup_ca($cert['caref']);
+ if ($ca) {
+ $caname = " (CA: " . htmlspecialchars($ca['descr']) . ")";
+ }
+ if ($pconfig['certref'] == $cert['refid']) {
+ $selected = "selected=\"selected\"";
+ }
+ if (cert_in_use($cert['refid'])) {
+ $inuse = " *In Use";
+ }
+ if (is_cert_revoked($cert)) {
+ $revoked = " *Revoked";
+ }
+ ?>
+ <option value="<?=$cert['refid'];?>" <?=$selected;?>><?=htmlspecialchars($cert['descr']) . $caname . $inuse . $revoked;?></option>
+ <?php endforeach; ?>
+ </select>
+ <?php else: ?>
+ <b>No Certificates defined.</b> <br />Create one under <a href="system_certmanager.php">System &gt; Cert Manager</a>.
+ <?php endif; ?>
+ </td>
+ </tr>
+ <tr id="tls_dh">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("DH Parameters Length"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="dh_length" class="formselect">
+ <?php
+ foreach ($openvpn_dh_lengths as $length):
+ $selected = "";
+ if ($length == $pconfig['dh_length']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option<?=$selected?>><?=$length;?></option>
+ <?php endforeach; ?>
+ </select>
+ <span class="vexpl">
+ <?=gettext("bits"); ?>
+ </span>
+ </td>
+ </tr>
+ <tr id="psk">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Shared Key"); ?></td>
+ <td width="78%" class="vtable">
+ <?php if (!$pconfig['shared_key']): ?>
+ <table border="0" cellpadding="2" cellspacing="0" summary="shared key">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['autokey_enable'], $chk); ?>
+ <input name="autokey_enable" type="checkbox" value="yes" <?=$chk;?> onclick="autokey_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Automatically generate a shared key"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?php endif; ?>
+ <table border="0" cellpadding="2" cellspacing="0" id="autokey_opts" summary="shared key">
+ <tr>
+ <td>
+ <textarea name="shared_key" cols="65" rows="7" class="formpre"><?=htmlspecialchars($pconfig['shared_key']);?></textarea>
+ <br />
+ <?=gettext("Paste your shared key here"); ?>.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Encryption algorithm"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="crypto" class="formselect">
+ <?php
+ $cipherlist = openvpn_get_cipherlist();
+ foreach ($cipherlist as $name => $desc):
+ $selected = "";
+ if ($name == $pconfig['crypto']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>"<?=$selected?>>
+ <?=htmlspecialchars($desc);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Auth Digest Algorithm"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="digest" class="formselect">
+ <?php
+ $digestlist = openvpn_get_digestlist();
+ foreach ($digestlist as $name => $desc):
+ $selected = "";
+ if ($name == $pconfig['digest']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>"<?=$selected?>>
+ <?=htmlspecialchars($desc);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ <br /><?PHP echo gettext("NOTE: Leave this set to SHA1 unless all clients are set to match. SHA1 is the default for OpenVPN."); ?>
+ </td>
+ </tr>
+ <tr id="engine">
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Hardware Crypto"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="engine" class="formselect">
+ <?php
+ $engines = openvpn_get_engines();
+ foreach ($engines as $name => $desc):
+ $selected = "";
+ if ($name == $pconfig['engine']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$name;?>"<?=$selected?>>
+ <?=htmlspecialchars($desc);?>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr id="cert_depth">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Certificate Depth"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="certificate depth">
+ <tr>
+ <td>
+ <select name="cert_depth" class="formselect">
+ <option value="">Do Not Check</option>
+ <?php
+ foreach ($openvpn_cert_depths as $depth => $depthdesc):
+ $selected = "";
+ if ($depth == $pconfig['cert_depth']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?= $depth ?>" <?= $selected ?>><?= $depthdesc ?></option>
+ <?php endforeach; ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("When a certificate-based client logs in, do not accept certificates below this depth. Useful for denying certificates made with intermediate CAs generated from the same CA as the server."); ?>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="strictusercn">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Strict User/CN Matching"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="strict user/cn matching">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['strictusercn'], $chk); ?>
+ <input name="strictusercn" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("When authenticating users, enforce a match between the common name of the client certificate and the username given at login."); ?>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Tunnel Settings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq" id="ipv4_tunnel_network"><?=gettext("IPv4 Tunnel Network"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="tunnel_network" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_network']);?>" />
+ <br />
+ <?=gettext("This is the IPv4 virtual network used for private " .
+ "communications between this server and client " .
+ "hosts expressed using CIDR (eg. 10.0.8.0/24). " .
+ "The first network address will be assigned to " .
+ "the server virtual interface. The remaining " .
+ "network addresses can optionally be assigned " .
+ "to connecting clients. (see Address Pool)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Tunnel Network"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="tunnel_networkv6" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['tunnel_networkv6']);?>" />
+ <br />
+ <?=gettext("This is the IPv6 virtual network used for private " .
+ "communications between this server and client " .
+ "hosts expressed using CIDR (eg. fe80::/64). " .
+ "The first network address will be assigned to " .
+ "the server virtual interface. The remaining " .
+ "network addresses can optionally be assigned " .
+ "to connecting clients. (see Address Pool)"); ?>
+ </td>
+ </tr>
+ <tr id="serverbridge_dhcp">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bridge DHCP"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="bridge dhcp">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['serverbridge_dhcp'], $chk); ?>
+ <input name="serverbridge_dhcp" type="checkbox" value="yes" <?=$chk;?> onchange="tuntap_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Allow clients on the bridge to obtain DHCP."); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="serverbridge_interface">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Bridge Interface"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="serverbridge_interface" class="formselect">
+ <?php
+ $serverbridge_interface['none'] = "none";
+ $serverbridge_interface = array_merge($serverbridge_interface, get_configured_interface_with_descr());
+ $carplist = get_configured_carp_interface_list();
+ foreach ($carplist as $cif => $carpip) {
+ $serverbridge_interface[$cif.'|'.$carpip] = $carpip." (".get_vip_descr($carpip).")";
+ }
+ $aliaslist = get_configured_ip_aliases_list();
+ foreach ($aliaslist as $aliasip => $aliasif) {
+ $serverbridge_interface[$aliasif.'|'.$aliasip] = $aliasip." (".get_vip_descr($aliasip).")";
+ }
+ foreach ($serverbridge_interface as $iface => $ifacename):
+ $selected = "";
+ if ($iface == $pconfig['serverbridge_interface']) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$iface;?>" <?=$selected;?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+ <?php endforeach; ?>
+ </select> <br />
+ <?=gettext("The interface to which this tap instance will be " .
+ "bridged. This is not done automatically. You must assign this " .
+ "interface and create the bridge separately. " .
+ "This setting controls which existing IP address and subnet " .
+ "mask are used by OpenVPN for the bridge. Setting this to " .
+ "'none' will cause the Server Bridge DHCP settings below to be ignored."); ?>
+ </td>
+ </tr>
+ <tr id="serverbridge_dhcp_start">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Server Bridge DHCP Start"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="serverbridge_dhcp_start" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['serverbridge_dhcp_start']);?>" />
+ <br />
+ <?=gettext("When using tap mode as a multi-point server, " .
+ "you may optionally supply a DHCP range to use on the " .
+ "interface to which this tap instance is bridged. " .
+ "If these settings are left blank, DHCP will be passed " .
+ "through to the LAN, and the interface setting above " .
+ "will be ignored."); ?>
+ </td>
+ </tr>
+ <tr id="serverbridge_dhcp_end">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Server Bridge DHCP End"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="serverbridge_dhcp_end" type="text" class="formfld unknown" size="20" value="<?=htmlspecialchars($pconfig['serverbridge_dhcp_end']);?>" />
+ <br />
+ </td>
+ </tr>
+ <tr id="gwredir_opts">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Redirect Gateway"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="redirect gateway">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['gwredir'], $chk); ?>
+ <input name="gwredir" type="checkbox" value="yes" <?=$chk;?> onclick="gwredir_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Force all client generated traffic through the tunnel"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="local_optsv4">
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Local Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="local_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['local_network']);?>" />
+ <br />
+ <?=gettext("These are the IPv4 networks that will be accessible " .
+ "from the remote endpoint. Expressed as a comma-separated list of one or more CIDR ranges. " .
+ "You may leave this blank if you don't " .
+ "want to add a route to the local network " .
+ "through this tunnel on the remote machine. " .
+ "This is generally set to your LAN network"); ?>.
+ </td>
+ </tr>
+ <tr id="local_optsv6">
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Local Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="local_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['local_networkv6']);?>" />
+ <br />
+ <?=gettext("These are the IPv6 networks that will be accessible " .
+ "from the remote endpoint. Expressed as a comma-separated list of one or more IP/PREFIX. " .
+ "You may leave this blank if you don't " .
+ "want to add a route to the local network " .
+ "through this tunnel on the remote machine. " .
+ "This is generally set to your LAN network"); ?>.
+ </td>
+ </tr>
+ <tr id="remote_optsv4">
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv4 Remote Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="remote_network" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_network']);?>" />
+ <br />
+ <?=gettext("These are the IPv4 networks that will be routed through " .
+ "the tunnel, so that a site-to-site VPN can be " .
+ "established without manually changing the routing tables. " .
+ "Expressed as a comma-separated list of one or more CIDR ranges. " .
+ "If this is a site-to-site VPN, enter the " .
+ "remote LAN/s here. You may leave this blank if " .
+ "you don't want a site-to-site VPN"); ?>.
+ </td>
+ </tr>
+ <tr id="remote_optsv6">
+ <td width="22%" valign="top" class="vncell"><?=gettext("IPv6 Remote Network/s"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="remote_networkv6" type="text" class="formfld unknown" size="40" value="<?=htmlspecialchars($pconfig['remote_networkv6']);?>" />
+ <br />
+ <?=gettext("These are the IPv6 networks that will be routed through " .
+ "the tunnel, so that a site-to-site VPN can be " .
+ "established without manually changing the routing tables. " .
+ "Expressed as a comma-separated list of one or more IP/PREFIX. " .
+ "If this is a site-to-site VPN, enter the " .
+ "remote LAN/s here. You may leave this blank if " .
+ "you don't want a site-to-site VPN"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Concurrent connections");?></td>
+ <td width="78%" class="vtable">
+ <input name="maxclients" type="text" class="formfld unknown" size="5" value="<?=htmlspecialchars($pconfig['maxclients']);?>" />
+ <br />
+ <?=gettext("Specify the maximum number of clients allowed to concurrently connect to this server"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Compression"); ?></td>
+ <td width="78%" class="vtable">
+ <select name="compression" class="formselect">
+ <?php
+ foreach ($openvpn_compression_modes as $cmode => $cmodedesc):
+ $selected = "";
+ if ($cmode == $pconfig['compression']) {
+ $selected = " selected=\"selected\"";
+ }
+ ?>
+ <option value="<?= $cmode ?>" <?= $selected ?>><?= $cmodedesc ?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Compress tunnel packets using the LZO algorithm. Adaptive compression will dynamically disable compression for a period of time if OpenVPN detects that the data in the packets is not being compressed efficiently"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Type-of-Service"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="type-of-service">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['passtos'], $chk); ?>
+ <input name="passtos" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Set the TOS IP header value of tunnel packets to match the encapsulated packet value"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="inter_client_communication">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Inter-client communication"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="inter-client communication">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['client2client'], $chk); ?>
+ <input name="client2client" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Allow communication between clients connected to this server"); ?>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="duplicate_cn">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Duplicate Connections"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="duplicate connection">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['duplicate_cn'], $chk); ?>
+ <input name="duplicate_cn" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Allow multiple concurrent connections from clients using the same Common Name.<br />NOTE: This is not generally recommended, but may be needed for some scenarios."); ?>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr id="chkboxNoTunIPv6">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Disable IPv6"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="disable-ipv6-srv">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['no_tun_ipv6'], $chk); ?>
+ <input name="no_tun_ipv6" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Don't forward IPv6 traffic"); ?>.
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="client_opts" summary="client settings">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Client Settings"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Dynamic IP"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="dynamic ip">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['dynamic_ip'], $chk); ?>
+ <input name="dynamic_ip" type="checkbox" id="dynamic_ip" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Allow connected clients to retain their connections if their IP address changes"); ?>.<br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Address Pool"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="address pool">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['pool_enable'], $chk); ?>
+ <input name="pool_enable" type="checkbox" id="pool_enable" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Provide a virtual adapter IP address to clients (see Tunnel Network)"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="topology_subnet_opt">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Topology"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="topology">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['topology_subnet'], $chk); ?>
+ <input name="topology_subnet" type="checkbox" id="topology_subnet" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Allocate only one IP per client (topology subnet), rather than an isolated subnet per client (topology net30)."); ?><br />
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>
+ <?=gettext("Relevant when supplying a virtual adapter IP address to clients when using tun mode on IPv4."); ?><br />
+ <?=gettext("Some clients may require this even for IPv6, such as OpenVPN Connect (iOS/Android). Others may break if it is present, such as older versions of OpenVPN or clients such as Yealink phones."); ?><br />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS Default Domain"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="dns default domain">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['dns_domain_enable'], $chk); ?>
+ <input name="dns_domain_enable" type="checkbox" id="dns_domain_enable" value="yes" <?=$chk;?> onclick="dns_domain_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Provide a default domain name to clients"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellpadding="2" cellspacing="0" id="dns_domain_data" summary="dns domain data">
+ <tr>
+ <td>
+ <input name="dns_domain" type="text" class="formfld unknown" id="dns_domain" size="30" value="<?=htmlspecialchars($pconfig['dns_domain']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="dns servers">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['dns_server_enable'], $chk); ?>
+ <input name="dns_server_enable" type="checkbox" id="dns_server_enable" value="yes" <?=$chk;?> onclick="dns_server_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Provide a DNS server list to clients"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellpadding="2" cellspacing="0" id="dns_server_data" summary="dns servers">
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #1:&nbsp;
+ </span>
+ <input name="dns_server1" type="text" class="formfld unknown" id="dns_server1" size="20" value="<?=htmlspecialchars($pconfig['dns_server1']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #2:&nbsp;
+ </span>
+ <input name="dns_server2" type="text" class="formfld unknown" id="dns_server2" size="20" value="<?=htmlspecialchars($pconfig['dns_server2']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #3:&nbsp;
+ </span>
+ <input name="dns_server3" type="text" class="formfld unknown" id="dns_server3" size="20" value="<?=htmlspecialchars($pconfig['dns_server3']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #4:&nbsp;
+ </span>
+ <input name="dns_server4" type="text" class="formfld unknown" id="dns_server4" size="20" value="<?=htmlspecialchars($pconfig['dns_server4']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr id="chkboxPushRegisterDNS">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Force DNS cache update"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="push register dns">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['push_register_dns'], $chk); ?>
+ <input name="push_register_dns" type="checkbox" value="yes" <?=$chk;?> />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Run ''net stop dnscache'', ''net start dnscache'', ''ipconfig /flushdns'' and ''ipconfig /registerdns'' on connection initiation. This is known to kick Windows into recognizing pushed DNS servers."); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NTP Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="ntp servers">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['ntp_server_enable'], $chk); ?>
+ <input name="ntp_server_enable" type="checkbox" id="ntp_server_enable" value="yes" <?=$chk;?> onclick="ntp_server_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Provide a NTP server list to clients"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellpadding="2" cellspacing="0" id="ntp_server_data" summary="ntp servers">
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #1:&nbsp;
+ </span>
+ <input name="ntp_server1" type="text" class="formfld unknown" id="ntp_server1" size="20" value="<?=htmlspecialchars($pconfig['ntp_server1']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #2:&nbsp;
+ </span>
+ <input name="ntp_server2" type="text" class="formfld unknown" id="ntp_server2" size="20" value="<?=htmlspecialchars($pconfig['ntp_server2']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("NetBIOS Options"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="netboios options">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['netbios_enable'], $chk); ?>
+ <input name="netbios_enable" type="checkbox" id="netbios_enable" value="yes" <?=$chk;?> onclick="netbios_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Enable NetBIOS over TCP/IP"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <?=gettext("If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) will be disabled"); ?>.
+ <br />
+ <table border="0" cellpadding="2" cellspacing="0" id="netbios_data" summary="netboios options">
+ <tr>
+ <td>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Node Type"); ?>:&nbsp;
+ </span>
+ <select name='netbios_ntype' class="formselect">
+ <?php
+ foreach ($netbios_nodetypes as $type => $name):
+ $selected = "";
+ if ($pconfig['netbios_ntype'] == $type) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$type;?>" <?=$selected;?>><?=$name;?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Possible options: b-node (broadcasts), p-node " .
+ "(point-to-point name queries to a WINS server), " .
+ "m-node (broadcast then query name server), and " .
+ "h-node (query name server, then broadcast)"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <br />
+ <span class="vexpl">
+ <?=gettext("Scope ID"); ?>:&nbsp;
+ </span>
+ <input name="netbios_scope" type="text" class="formfld unknown" id="netbios_scope" size="30" value="<?=htmlspecialchars($pconfig['netbios_scope']);?>" />
+ <br />
+ <?=gettext("A NetBIOS Scope ID provides an extended naming " .
+ "service for NetBIOS over TCP/IP. The NetBIOS " .
+ "scope ID isolates NetBIOS traffic on a single " .
+ "network to only those nodes with the same " .
+ "NetBIOS scope ID"); ?>.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr id="wins_opts">
+ <td width="22%" valign="top" class="vncell"><?=gettext("WINS Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="wins servers">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['wins_server_enable'], $chk); ?>
+ <input name="wins_server_enable" type="checkbox" id="wins_server_enable" value="yes" <?=$chk;?> onclick="wins_server_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Provide a WINS server list to clients"); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellpadding="2" cellspacing="0" id="wins_server_data" summary="wins servers">
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #1:&nbsp;
+ </span>
+ <input name="wins_server1" type="text" class="formfld unknown" id="wins_server1" size="20" value="<?=htmlspecialchars($pconfig['wins_server1']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Server"); ?> #2:&nbsp;
+ </span>
+ <input name="wins_server2" type="text" class="formfld unknown" id="wins_server2" size="20" value="<?=htmlspecialchars($pconfig['wins_server2']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Client Management Port"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="client management port">
+ <tr>
+ <td>
+ <?php set_checked($pconfig['client_mgmt_port_enable'], $chk); ?>
+ <input name="client_mgmt_port_enable" type="checkbox" id="client_mgmt_port_enable" value="yes" <?=$chk;?> onclick="client_mgmt_port_change()" />
+ </td>
+ <td>
+ <span class="vexpl">
+ <?=gettext("Use a different management port on clients. The default port is 166. Specify a different port if the client machines need to select from multiple OpenVPN links."); ?><br />
+ </span>
+ </td>
+ </tr>
+ </table>
+ <table border="0" cellpadding="2" cellspacing="0" id="client_mgmt_port_data" summary="client management port">
+ <tr>
+ <td>
+ <input name="client_mgmt_port" type="text" class="formfld unknown" id="client_mgmt_port" size="30" value="<?=htmlspecialchars($pconfig['client_mgmt_port']);?>" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" id="client_opts" summary="advance configuration">
+ <tr>
+ <td colspan="2" class="list" height="12"></td>
+ </tr>
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=gettext("Advanced configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Advanced"); ?></td>
+ <td width="78%" class="vtable">
+ <table border="0" cellpadding="2" cellspacing="0" summary="advance configuration">
+ <tr>
+ <td>
+ <textarea rows="6" cols="78" name="custom_options" id="custom_options"><?=htmlspecialchars($pconfig['custom_options']);?></textarea><br />
+ <?=gettext("Enter any additional options you would like to add to the OpenVPN server configuration here, separated by a semicolon"); ?><br />
+ <?=gettext("EXAMPLE: push \"route 10.0.0.0 255.255.255.0\""); ?>;
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr id="comboboxVerbosityLevel">
+ <td width="22%" valign="top" class="vncell"><?=gettext("Verbosity level");?></td>
+ <td width="78%" class="vtable">
+ <select name="verbosity_level" class="formselect">
+ <?php
+ foreach ($openvpn_verbosity_level as $verb_value => $verb_desc):
+ $selected = "";
+ if ($pconfig['verbosity_level'] == $verb_value) {
+ $selected = "selected=\"selected\"";
+ }
+ ?>
+ <option value="<?=$verb_value;?>" <?=$selected;?>><?=$verb_desc;?></option>
+ <?php endforeach; ?>
+ </select>
+ <br />
+ <?=gettext("Each level shows all info from the previous levels. Level 3 is recommended if you want a good summary of what's happening without being swamped by output"); ?>.<br /> <br />
+ <strong>none</strong> -- <?=gettext("No output except fatal errors"); ?>. <br />
+ <strong>default</strong>-<strong>4</strong> -- <?=gettext("Normal usage range"); ?>. <br />
+ <strong>5</strong> -- <?=gettext("Output R and W characters to the console for each packet read and write, uppercase is used for TCP/UDP packets and lowercase is used for TUN/TAP packets"); ?>. <br />
+ <strong>6</strong>-<strong>11</strong> -- <?=gettext("Debug info range"); ?>.
+ </td>
+ </tr>
+
+ </table>
+
+ <br />
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="icons">
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="save" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
+ <input name="act" type="hidden" value="<?=$act;?>" />
+ <?php if (isset($id) && $a_server[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </form>
+
+ <?php else: ?>
+
+ <table class="sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="list">
+ <thead>
+ <tr>
+ <td width="10%" class="listhdrr"><?=gettext("Disabled"); ?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Protocol / Port"); ?></td>
+ <td width="30%" class="listhdrr"><?=gettext("Tunnel Network"); ?></td>
+ <td width="40%" class="listhdrr"><?=gettext("Description"); ?></td>
+ <td width="10%" class="list"></td>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <a href="vpn_openvpn_server.php?act=new"><img src="./themes/<?=$g['theme'];?>/images/icons/icon_plus.gif" title="<?=gettext("add server"); ?>" width="17" height="17" border="0" alt="add" />
+ </a>
+ </td>
+ </tr>
+ </tfoot>
+ <tbody>
+ <?php
+ $i = 0;
+ foreach ($a_server as $server):
+ $disabled = "NO";
+ if (isset($server['disable'])) {
+ $disabled = "YES";
+ }
+ ?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>'">
+ <?=$disabled;?>
+ </td>
+ <td class="listr" ondblclick="document.location='vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>'">
+ <?=htmlspecialchars($server['protocol']);?> / <?=htmlspecialchars($server['local_port']);?>
+ </td>
+ <td class="listr" ondblclick="document.location='vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>'">
+ <?=htmlspecialchars($server['tunnel_network']);?><br />
+ <?=htmlspecialchars($server['tunnel_networkv6']);?><br />
+ </td>
+ <td class="listbg" ondblclick="document.location='vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>'">
+ <?=htmlspecialchars($server['description']);?>
+ </td>
+ <td valign="middle" class="list nowrap">
+ <a href="vpn_openvpn_server.php?act=edit&amp;id=<?=$i;?>">
+ <img src="./themes/<?=$g['theme'];?>/images/icons/icon_e.gif" title="<?=gettext("edit server"); ?>" width="17" height="17" border="0" alt="edit" />
+ </a>
+ &nbsp;
+ <a href="vpn_openvpn_server.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this server?"); ?>')">
+ <img src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" title="<?=gettext("delete server"); ?>" width="17" height="17" border="0" alt="delete" />
+ </a>
+ </td>
+ </tr>
+ <?php
+ $i++;
+ endforeach;
+ ?>
+ <tr style="display:none;"><td></td></tr>
+ </tbody>
+ </table>
+
+ <?=gettext("Additional OpenVPN servers can be added here.");?>
+
+ <?php endif; ?>
+
+ </td>
+ </tr>
+</table>
+<script type="text/javascript">
+//<![CDATA[
+mode_change();
+autokey_change();
+tlsauth_change();
+gwredir_change();
+dns_domain_change();
+dns_server_change();
+wins_server_change();
+client_mgmt_port_change();
+ntp_server_change();
+netbios_change();
+tuntap_change();
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
+<?php
+
+/* local utility functions */
+
+function set_checked($var,& $chk) {
+ if ($var) {
+ $chk = "checked=\"checked\"";
+ } else {
+ $chk = "";
+ }
+}
+
+?>
diff --git a/src/usr/local/www/vpn_pppoe.php b/src/usr/local/www/vpn_pppoe.php
new file mode 100644
index 0000000..4ad8d72
--- /dev/null
+++ b/src/usr/local/www/vpn_pppoe.php
@@ -0,0 +1,167 @@
+<?php
+/*
+ vpn_pppoe.php
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_MODULE: pppoe
+*/
+
+##|+PRIV
+##|*IDENT=page-services-pppoeserver
+##|*NAME=Services: PPPoE Server page
+##|*DESCR=Allow access to the 'Services: PPPoE Server' page.
+##|*MATCH=vpn_pppoe.php*
+##|-PRIV
+
+require_once("guiconfig.inc");
+require_once("filter.inc");
+require_once("vpn.inc");
+
+if (!is_array($config['pppoes']['pppoe'])) {
+ $config['pppoes']['pppoe'] = array();
+}
+
+$a_pppoes = &$config['pppoes']['pppoe'];
+
+if ($_POST) {
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ if (file_exists("{$g['tmp_path']}/.vpn_pppoe.apply")) {
+ $toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.vpn_pppoe.apply"));
+ foreach ($toapplylist as $pppoeid) {
+ if (!is_numeric($pppoeid)) {
+ continue;
+ }
+ if (is_array($config['pppoes']['pppoe'])) {
+ foreach ($config['pppoes']['pppoe'] as $pppoe) {
+ if ($pppoe['pppoeid'] == $pppoeid) {
+ vpn_pppoe_configure($pppoe);
+ break;
+ }
+ }
+ }
+ }
+ @unlink("{$g['tmp_path']}/.vpn_pppoe.apply");
+ }
+ $retval = 0;
+ $retval |= filter_configure();
+ $savemsg = get_std_save_message($retval);
+ clear_subsystem_dirty('vpnpppoe');
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_pppoes[$_GET['id']]) {
+ if ("{$g['varrun_path']}/pppoe" . $a_pppoes[$_GET['id']]['pppoeid'] . "-vpn.pid") {
+ killbypid("{$g['varrun_path']}/pppoe" . $a_pppoes[$_GET['id']]['pppoeid'] . "-vpn.pid");
+ }
+ if (is_dir("{$g['varetc_path']}/pppoe" . $a_pppoes[$_GET['id']]['pppoeid'])) {
+ mwexec("/bin/rm -r {$g['varetc_path']}/pppoe" . $a_pppoes[$_GET['id']]['pppoeid']);
+ }
+ unset($a_pppoes[$_GET['id']]);
+ write_config();
+ header("Location: vpn_pppoe.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("VPN"), gettext("PPPoE"));
+$shortcut_section = "pppoes";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="vpn_pppoe.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (is_subsystem_dirty('vpnpppoe')): ?><br/>
+<?php print_info_box_np(gettext("The PPPoE entry list has been changed") . ".<br />" . gettext("You must apply the changes in order for them to take effect."));?>
+<?php endif; ?>
+
+<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="15%" class="listhdrr"><?=gettext("Interface");?></td>
+ <td width="10%" class="listhdrr"><?=gettext("Local IP");?></td>
+ <td width="25%" class="listhdrr"><?=gettext("Number of users");?></td>
+ <td width="25%" class="listhdr"><?=gettext("Description");?></td>
+ <td width="5%" class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="pppoe server">
+ <tr>
+ <td valign="middle" width="17">&nbsp;</td>
+ <td valign="middle"><a href="vpn_pppoe_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new pppoe instance");?>" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i = 0;
+ foreach ($a_pppoes as $pppoe):
+?>
+ <tr>
+ <td class="listlr" ondblclick="document.location='vpn_pppoe_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($pppoe['interface']));?>
+ </td>
+ <td class="listlr" ondblclick="document.location='vpn_pppoe_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($pppoe['localip']);?>
+ </td>
+ <td class="listr" ondblclick="document.location='vpn_pppoe_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($pppoe['n_pppoe_units']);?>
+ </td>
+ <td class="listbg" ondblclick="document.location='vpn_pppoe_edit.php?id=<?=$i;?>';">
+ <?=htmlspecialchars($pppoe['descr']);?>&nbsp;
+ </td>
+ <td valign="middle" class="list nowrap">
+ <table border="0" cellspacing="0" cellpadding="1" summary="icons">
+ <tr>
+ <td valign="middle"><a href="vpn_pppoe_edit.php?id=<?=$i;?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit PPPoE instance"); ?>" alt="edit" /></a></td>
+ <td><a href="vpn_pppoe.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this entry? All elements that still use it will become invalid (e.g. filter rules)!");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete pppoe instance");?>" alt="delete" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+<?php
+ $i++;
+ endforeach;
+?>
+ <tr>
+ <td class="list" colspan="4"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td valign="middle" width="17">&nbsp;</td>
+ <td valign="middle"><a href="vpn_pppoe_edit.php"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add a new pppoe instance");?>" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_pppoe_edit.php b/src/usr/local/www/vpn_pppoe_edit.php
new file mode 100644
index 0000000..343c1f9
--- /dev/null
+++ b/src/usr/local/www/vpn_pppoe_edit.php
@@ -0,0 +1,671 @@
+<?php
+/*
+ vpn_pppoe_edit.php
+ part of pfSense
+
+ Copyright (C) 2005 Scott Ullrich (sullrich@gmail.com)
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-services-pppoeserver-edit
+##|*NAME=Services: PPPoE Server: Edit page
+##|*DESCR=Allow access to the 'Services: PPPoE Server: Edit' page.
+##|*MATCH=vpn_pppoe_edit.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("vpn.inc");
+
+function vpn_pppoe_get_id() {
+ global $config;
+
+ $vpnid = 1;
+ if (is_array($config['pppoes']['pppoe'])) {
+ foreach ($config['pppoes']['pppoe'] as $pppoe) {
+ if ($vpnid == $pppoe['pppoeid']) {
+ $vpnid++;
+ } else {
+ return $vpnid;
+ }
+ }
+ }
+
+ return $vpnid;
+}
+
+if (!is_array($config['pppoes']['pppoe'])) {
+ $config['pppoes']['pppoe'] = array();
+}
+$a_pppoes = &$config['pppoes']['pppoe'];
+
+if (is_numericint($_GET['id'])) {
+ $id = $_GET['id'];
+}
+if (isset($_POST['id']) && is_numericint($_POST['id'])) {
+ $id = $_POST['id'];
+}
+
+if (isset($id) && $a_pppoes[$id]) {
+ $pppoecfg =& $a_pppoes[$id];
+
+ $pconfig['remoteip'] = $pppoecfg['remoteip'];
+ $pconfig['localip'] = $pppoecfg['localip'];
+ $pconfig['mode'] = $pppoecfg['mode'];
+ $pconfig['interface'] = $pppoecfg['interface'];
+ $pconfig['n_pppoe_units'] = $pppoecfg['n_pppoe_units'];
+ $pconfig['pppoe_subnet'] = $pppoecfg['pppoe_subnet'];
+ $pconfig['pppoe_dns1'] = $pppoecfg['dns1'];
+ $pconfig['pppoe_dns2'] = $pppoecfg['dns2'];
+ $pconfig['descr'] = $pppoecfg['descr'];
+ $pconfig['username'] = $pppoecfg['username'];
+ $pconfig['pppoeid'] = $pppoecfg['pppoeid'];
+ if (is_array($pppoecfg['radius'])) {
+ $pconfig['radacct_enable'] = isset($pppoecfg['radius']['accounting']);
+ $pconfig['radiusissueips'] = isset($pppoecfg['radius']['radiusissueips']);
+ if (is_array($pppoecfg['radius']['server'])) {
+ $pconfig['radiusenable'] = isset($pppoecfg['radius']['server']['enable']);
+ $pconfig['radiusserver'] = $pppoecfg['radius']['server']['ip'];
+ $pconfig['radiusserverport'] = $pppoecfg['radius']['server']['port'];
+ $pconfig['radiusserveracctport'] = $pppoecfg['radius']['server']['acctport'];
+ $pconfig['radiussecret'] = $pppoecfg['radius']['server']['secret'];
+ }
+ if (is_array($pppoecfg['radius']['server2'])) {
+ $pconfig['radiussecenable'] = isset($pppoecfg['radius']['server2']['enable']);
+ $pconfig['radiusserver2'] = $pppoecfg['radius']['server2']['ip'];
+ $pconfig['radiusserver2port'] = $pppoecfg['radius']['server2']['port'];
+ $pconfig['radiusserver2acctport'] = $pppoecfg['radius']['server2']['acctport'];
+ $pconfig['radiussecret2'] = $pppoecfg['radius']['server2']['secret2'];
+ }
+ $pconfig['radius_nasip'] = $pppoecfg['radius']['nasip'];
+ $pconfig['radius_acct_update'] = $pppoecfg['radius']['acct_update'];
+ }
+}
+
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['mode'] == "server") {
+ $reqdfields = explode(" ", "localip remoteip");
+ $reqdfieldsn = array(gettext("Server address"), gettext("Remote start address"));
+
+ if ($_POST['radiusenable']) {
+ $reqdfields = array_merge($reqdfields, explode(" ", "radiusserver radiussecret"));
+ $reqdfieldsn = array_merge($reqdfieldsn,
+ array(gettext("RADIUS server address"), gettext("RADIUS shared secret")));
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_POST['localip'] && !is_ipaddr($_POST['localip']))) {
+ $input_errors[] = gettext("A valid server address must be specified.");
+ }
+ if (($_POST['pppoe_subnet'] && !is_ipaddr($_POST['remoteip']))) {
+ $input_errors[] = gettext("A valid remote start address must be specified.");
+ }
+ if (($_POST['radiusserver'] && !is_ipaddr($_POST['radiusserver']))) {
+ $input_errors[] = gettext("A valid RADIUS server address must be specified.");
+ }
+
+ $_POST['remoteip'] = $pconfig['remoteip'] = gen_subnet($_POST['remoteip'], $_POST['pppoe_subnet']);
+ $subnet_start = ip2ulong($_POST['remoteip']);
+ $subnet_end = ip2ulong($_POST['remoteip']) + $_POST['pppoe_subnet'] - 1;
+ if ((ip2ulong($_POST['localip']) >= $subnet_start) &&
+ (ip2ulong($_POST['localip']) <= $subnet_end)) {
+ $input_errors[] = gettext("The specified server address lies in the remote subnet.");
+ }
+ if ($_POST['localip'] == get_interface_ip($_POST['interface'])) {
+ $input_errors[] = gettext("The specified server address is equal to an interface ip address.");
+ }
+
+ for ($x = 0; $x < 4999; $x++) {
+ if ($_POST["username{$x}"]) {
+ if (empty($_POST["password{$x}"])) {
+ $input_errors[] = sprintf(gettext("No password specified for username %s"), $_POST["username{$x}"]);
+ }
+ if ($_POST["ip{$x}"] <> "" && !is_ipaddr($_POST["ip{$x}"])) {
+ $input_errors[] = sprintf(gettext("Incorrect ip address specified for username %s"), $_POST["username{$x}"]);
+ }
+ }
+ }
+ }
+
+ if ($_POST['pppoeid'] && !is_numeric($_POST['pppoeid'])) {
+ $input_errors[] = gettext("Wrong data submitted");
+ }
+
+ if (!$input_errors) {
+ $pppoecfg = array();
+
+ $pppoecfg['remoteip'] = $_POST['remoteip'];
+ $pppoecfg['localip'] = $_POST['localip'];
+ $pppoecfg['mode'] = $_POST['mode'];
+ $pppoecfg['interface'] = $_POST['interface'];
+ $pppoecfg['n_pppoe_units'] = $_POST['n_pppoe_units'];
+ $pppoecfg['pppoe_subnet'] = $_POST['pppoe_subnet'];
+ $pppoecfg['descr'] = $_POST['descr'];
+ if ($_POST['radiusserver'] || $_POST['radiusserver2']) {
+ $pppoecfg['radius'] = array();
+
+ $pppoecfg['radius']['nasip'] = $_POST['radius_nasip'];
+ $pppoecfg['radius']['acct_update'] = $_POST['radius_acct_update'];
+ }
+ if ($_POST['radiusserver']) {
+ $pppoecfg['radius']['server'] = array();
+
+ $pppoecfg['radius']['server']['ip'] = $_POST['radiusserver'];
+ $pppoecfg['radius']['server']['secret'] = $_POST['radiussecret'];
+ $pppoecfg['radius']['server']['port'] = $_POST['radiusserverport'];
+ $pppoecfg['radius']['server']['acctport'] = $_POST['radiusserveracctport'];
+ }
+ if ($_POST['radiusserver2']) {
+ $pppoecfg['radius']['server2'] = array();
+
+ $pppoecfg['radius']['server2']['ip'] = $_POST['radiusserver2'];
+ $pppoecfg['radius']['server2']['secret2'] = $_POST['radiussecret2'];
+ $pppoecfg['radius']['server2']['port'] = $_POST['radiusserver2port'];
+ $pppoecfg['radius']['server2']['acctport'] = $_POST['radiusserver2acctport'];
+ }
+
+ if ($_POST['pppoe_dns1'] <> "") {
+ $pppoecfg['dns1'] = $_POST['pppoe_dns1'];
+ }
+
+ if ($_POST['pppoe_dns2'] <> "") {
+ $pppoecfg['dns2'] = $_POST['pppoe_dns2'];
+ }
+
+ if ($_POST['radiusenable'] == "yes") {
+ $pppoecfg['radius']['server']['enable'] = true;
+ }
+
+ if ($_POST['radiussecenable'] == "yes") {
+ $pppoecfg['radius']['server2']['enable'] = true;
+ }
+
+ if ($_POST['radacct_enable'] == "yes") {
+ $pppoecfg['radius']['accounting'] = true;
+ }
+
+ if ($_POST['radiusissueips'] == "yes") {
+ $pppoecfg['radius']['radiusissueips'] = true;
+ }
+
+ if ($_POST['pppoeid']) {
+ $pppoecfg['pppoeid'] = $_POST['pppoeid'];
+ } else {
+ $pppoecfg['pppoeid'] = vpn_pppoe_get_id();
+ }
+
+ $users = array();
+ for ($x = 0; $x < 4999; $x++) {
+ if ($_POST["username{$x}"]) {
+ $usernam = $_POST["username{$x}"] . ":" . base64_encode($_POST["password{$x}"]);
+ if ($_POST["ip{$x}"]) {
+ $usernam .= ":" . $_POST["ip{$x}"];
+ }
+ $users[] = $usernam;
+ }
+ }
+ if (count($users) > 0) {
+ $pppoecfg['username'] = implode(" ", $users);
+ }
+
+ if (!isset($id)) {
+ $id = count($a_pppoes);
+ }
+ if (file_exists("{$g['tmp_path']}/.vpn_pppoe.apply")) {
+ $toapplylist = unserialize(file_get_contents("{$g['tmp_path']}/.vpn_pppoe.apply"));
+ } else {
+ $toapplylist = array();
+ }
+
+ $toapplylist[] = $pppoecfg['pppoeid'];
+ $a_pppoes[$id] = $pppoecfg;
+
+ write_config();
+ mark_subsystem_dirty('vpnpppoe');
+ file_put_contents("{$g['tmp_path']}/.vpn_pppoe.apply", serialize($toapplylist));
+ header("Location: vpn_pppoe.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("Services"), gettext("PPPoE Server"), gettext("Edit"));
+$shortcut_section = "pppoes";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript" src="/javascript/row_helper.js"></script>
+
+<input type='hidden' name='username' value='textbox' class="formfld unknown" />
+<input type='hidden' name='password' value='textbox' />
+<input type='hidden' name='ip' value='textbox' />
+
+<script type="text/javascript">
+ //<![CDATA[
+ rowname[0] = "username";
+ rowtype[0] = "textbox";
+ rowsize[0] = "20";
+
+ rowname[1] = "password";
+ rowtype[1] = "password";
+ rowsize[1] = "20";
+
+ rowname[2] = "ip";
+ rowtype[2] = "textbox";
+ rowsize[2] = "10";
+ //]]>
+</script>
+
+<script type="text/javascript">
+//<![CDATA[
+function get_radio_value(obj) {
+ for (i = 0; i < obj.length; i++) {
+ if (obj[i].checked) {
+ return obj[i].value;
+ }
+ }
+ return null;
+}
+
+function enable_change(enable_over) {
+ if ((get_radio_value(document.iform.mode) == "server") || enable_over) {
+ document.iform.remoteip.disabled = 0;
+ document.iform.descr.disabled = 0;
+ document.iform.localip.disabled = 0;
+ document.iform.radiusenable.disabled = 0;
+ document.iform.interface.disabled = 0;
+ document.iform.n_pppoe_units.disabled = 0;
+ document.iform.pppoe_subnet.disabled = 0;
+ document.iform.pppoe_dns1.disabled = 0;
+ document.iform.pppoe_dns2.disabled = 0;
+ if (document.iform.radiusenable.checked || enable_over) {
+ document.iform.radacct_enable.disabled = 0;
+ document.iform.radiusserver.disabled = 0;
+ document.iform.radiussecret.disabled = 0;
+ document.iform.radiusserverport.disabled = 0;
+ document.iform.radiusserveracctport.disabled = 0;
+ document.iform.radiusissueips.disabled = 0;
+ document.iform.radius_nasip.disabled = 0;
+ document.iform.radiusissueips.disabled = 0;
+ document.iform.radius_nasip.disabled = 0;
+ document.iform.radius_acct_update.disabled = 0;
+ document.iform.radiussecenable.disabled = 0;
+ if (document.iform.radiussecenable.checked || enable_over) {
+ document.iform.radiusserver2.disabled = 0;
+ document.iform.radiussecret2.disabled = 0;
+ document.iform.radiusserver2port.disabled = 0;
+ document.iform.radiusserver2acctport.disabled = 0;
+ } else {
+
+ document.iform.radiusserver2.disabled = 1;
+ document.iform.radiussecret2.disabled = 1;
+ document.iform.radiusserver2port.disabled = 1;
+ document.iform.radiusserver2acctport.disabled = 1;
+ }
+ } else {
+ document.iform.radacct_enable.disabled = 1;
+ document.iform.radiusserver.disabled = 1;
+ document.iform.radiussecret.disabled = 1;
+ document.iform.radiusserverport.disabled = 1;
+ document.iform.radiusserveracctport.disabled = 1;
+ document.iform.radiusissueips.disabled = 1;
+ document.iform.radius_nasip.disabled = 1;
+ document.iform.radius_acct_update.disabled = 1;
+ document.iform.radiussecenable.disabled = 1;
+ }
+ } else {
+ document.iform.interface.disabled = 1;
+ document.iform.n_pppoe_units.disabled = 1;
+ document.iform.pppoe_subnet.disabled = 1;
+ document.iform.remoteip.disabled = 1;
+ document.iform.descr.disabled = 1;
+ document.iform.localip.disabled = 1;
+ document.iform.pppoe_dns1.disabled = 1;
+ document.iform.pppoe_dns2.disabled = 1;
+ document.iform.radiusenable.disabled = 1;
+ document.iform.radiussecenable.disabled = 1;
+ document.iform.radacct_enable.disabled = 1;
+ document.iform.radiusserver.disabled = 1;
+ document.iform.radiussecret.disabled = 1;
+ document.iform.radiusserverport.disabled = 1;
+ document.iform.radiusserveracctport.disabled = 1;
+ document.iform.radiusserver2.disabled = 1;
+ document.iform.radiussecret2.disabled = 1;
+ document.iform.radiusserver2port.disabled = 1;
+ document.iform.radiusserver2acctport.disabled = 1;
+ document.iform.radiusissueips.disabled = 1;
+ document.iform.radius_nasip.disabled = 1;
+ document.iform.radius_acct_update.disabled = 1;
+ }
+}
+//]]>
+</script>
+<form action="vpn_pppoe_edit.php" method="post" name="iform" id="iform">
+<?php
+if ($input_errors) {
+ print_input_errors($input_errors);
+}
+if ($savemsg) {
+ print_info_box($savemsg);
+}
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="pppoe edit">
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td height="16" colspan="2" class="listtopic" valign="top"><?php echo gettext("PPPoE server configuration"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="mode" type="radio" onclick="enable_change(false)" value="off" <?php if ($pconfig['mode'] != "server") echo "checked=\"checked\"";?> />
+ <?=gettext("Off"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input type="radio" name="mode" value="server" onclick="enable_change(false)" <?php if ($pconfig['mode'] == "server") echo "checked=\"checked\""; ?> />
+ <?=gettext("Enable PPPoE server"); ?>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="22%" valign="top" class="vncell"><b><?=gettext("Interface"); ?></b></td>
+ <td width="78%" valign="top" class="vtable">
+
+ <select name="interface" class="formselect" id="interface">
+<?php
+ $interfaces = get_configured_interface_with_descr();
+ foreach ($interfaces as $iface => $ifacename):
+?>
+ <option value="<?=$iface;?>" <?php if ($iface == $pconfig['interface']) echo "selected=\"selected\""; ?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+<?php
+ endforeach;
+?>
+ </select> <br />
+
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet netmask"); ?></td>
+ <td width="78%" class="vtable">
+ <select id="pppoe_subnet" name="pppoe_subnet">
+<?php
+ for ($x = 0; $x < 33; $x++) {
+ if ($x == $pconfig['pppoe_subnet']) {
+ $selected = "selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ echo "<option value=\"{$x}\" {$selected}>{$x}</option>\n";
+ }
+?>
+ </select>
+ <br /><?=gettext("Hint"); ?>: 24 <?=gettext("is"); ?> 255.255.255.0
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("No. PPPoE users"); ?></td>
+ <td width="78%" class="vtable">
+ <select id="n_pppoe_units" name="n_pppoe_units">
+<?php
+ for ($x = 0; $x < 255; $x++) {
+ if ($x == $pconfig['n_pppoe_units']) {
+ $selected = "selected=\"selected\"";
+ } else {
+ $selected = "";
+ }
+ echo "<option value=\"{$x}\" {$selected}>{$x}</option>\n";
+ }
+?>
+ </select>
+ <br /><?=gettext("Hint: 10 is ten PPPoE clients"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server address"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="localip" type="text" class="formfld unknown" id="localip" size="20" value="<?=htmlspecialchars($pconfig['localip']);?>" />
+ <br />
+ <?=gettext("Enter the IP address the PPPoE server should give to clients for use as their \"gateway\""); ?>.
+ <br />
+ <?=gettext("Typically this is set to an unused IP just outside of the client range"); ?>.
+ <br />
+ <br />
+ <?=gettext("NOTE: This should NOT be set to any IP address currently in use on this firewall"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote address range"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="remoteip" type="text" class="formfld unknown" id="remoteip" size="20" value="<?=htmlspecialchars($pconfig['remoteip']);?>" />
+ <br />
+ <?=gettext("Specify the starting address for the client IP address subnet"); ?>.<br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
+ <br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("DNS servers"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="pppoe_dns1" type="text" class="formfld unknown" id="pppoe_dns1" size="20" value="<?=htmlspecialchars($pconfig['pppoe_dns1']);?>" />
+ <br />
+ <input name="pppoe_dns2" type="text" class="formfld unknown" id="pppoe_dns2" size="20" value="<?=htmlspecialchars($pconfig['pppoe_dns2']);?>" />
+ <br />
+ <?=gettext("If entered they will be given to all PPPoE clients, else LAN DNS and one WAN DNS will go to all clients"); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="radiusenable" type="checkbox" id="radiusenable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radiusenable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Use a RADIUS server for authentication"); ?><br />
+ </strong><?=gettext("When set, all users will be authenticated using " .
+ "the RADIUS server specified below. The local user database " .
+ "will not be used"); ?>.<br />
+ <br />
+ <input name="radacct_enable" type="checkbox" id="radacct_enable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radacct_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable RADIUS accounting"); ?> <br />
+ <br />
+ </strong><?=gettext("Sends accounting packets to the RADIUS server"); ?>.<br />
+ <input name="radiussecenable" type="checkbox" id="radiussecenable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radiussecenable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Use Backup RADIUS Server"); ?></strong><br />
+ <?=gettext("When set, if primary server fails all requests will be sent via backup server"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("NAS IP Address"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="radius_nasip" type="text" class="formfld unknown" id="radius_nasip" size="20" value="<?=htmlspecialchars($pconfig['radius_nasip']);?>" />
+ <br /><?=gettext("RADIUS server NAS IP Address"); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("RADIUS Accounting Update"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="radius_acct_update" type="text" class="formfld unknown" id="radius_acct_update" size="20" value="<?=htmlspecialchars($pconfig['radius_acct_update']);?>" />
+ <br /><?=gettext("RADIUS accounting update period in seconds"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS issued IPs"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="radiusissueips" value="yes" type="checkbox" class="formfld" id="radiusissueips" <?php if ($pconfig['radiusissueips']) echo "checked=\"checked\""; ?> />
+ <br /><?=gettext("Issue IP Addresses via RADIUS server"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS server Primary"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="radiusserver" type="text" class="formfld unknown" id="radiusserver" size="20" value="<?=htmlspecialchars($pconfig['radiusserver']);?>" />
+ <input name="radiusserverport" type="text" class="formfld unknown" id="radiusserverport" size="4" value="<?=htmlspecialchars($pconfig['radiusserverport']);?>" />
+ <input name="radiusserveracctport" type="text" class="formfld unknown" id="radiusserveracctport" size="4" value="<?=htmlspecialchars($pconfig['radiusserveracctport']);?>" />
+ <br /><?=gettext("Enter the IP address, authentication port and accounting port (optional) of the RADIUS server."); ?><br />
+ <br /> <?=gettext("standard port 1812 and 1813 accounting"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS primary shared secret"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="radiussecret" type="password" class="formfld pwd" id="radiussecret" size="20" value="<?=htmlspecialchars($pconfig['radiussecret']);?>" />
+ <br /><?=gettext("Enter the shared secret that will be used to authenticate " .
+ "to the RADIUS server"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS server Secondary"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="radiusserver2" type="text" class="formfld unknown" id="radiusserver2" size="20" value="<?=htmlspecialchars($pconfig['radiusserver2']);?>" />
+ <input name="radiusserver2port" type="text" class="formfld unknown" id="radiusserver2port" size="4" value="<?=htmlspecialchars($pconfig['radiusserver2port']);?>" />
+ <input name="radiusserver2acctport" type="text" class="formfld unknown" id="radiusserver2acctport" size="4" value="<?=htmlspecialchars($pconfig['radiusserver2acctport']);?>" />
+ <br /><?=gettext("Enter the IP address, authentication port and accounting port (optional) of the backup RADIUS server."); ?><br />
+ <br /> <?=gettext("standard port 1812 and 1813 accounting"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS secondary shared secret"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="radiussecret2" type="password" class="formfld pwd" id="radiussecret2" size="20" value="<?=htmlspecialchars($pconfig['radiussecret2']);?>" />
+ <br />
+ <?=gettext("Enter the shared secret that will be used to authenticate " .
+ "to the RADIUS server"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><div id="addressnetworkport"><?=gettext("User (s)");?></div></td>
+ <td width="78%" class="vtable">
+ <table id="usertable" summary="users">
+ <tbody>
+ <tr>
+ <td><div id="onecolumn"><?=gettext("Username");?></div></td>
+ <td><div id="twocolumn"><?=gettext("Password");?></div></td>
+ <td><div id="thirdcolumn"><?=gettext("IP");?></div></td>
+ </tr>
+<?php
+ $counter = 0;
+ $usernames = $pconfig['username'];
+ if ($usernames <> ""):
+ $item = explode(" ", $usernames);
+ foreach ($item as $ww):
+ $wws = explode(":", $ww);
+ $user = $wws[0];
+ $passwd = base64_decode($wws[1]);
+ $ip = $wws[2];
+ $tracker = $counter;
+?>
+ <tr>
+ <td>
+ <input name="username<?php echo $tracker; ?>" type="text" class="formfld unknown" id="username<?php echo $tracker; ?>" size="20" value="<?=htmlspecialchars($user);?>" />
+ </td>
+ <td>
+ <input name="password<?php echo $tracker; ?>" type="password" class="formfld pwd" id="password<?php echo $tracker; ?>" size="20" value="<?=htmlspecialchars($passwd);?>" />
+ </td>
+ <td>
+ <input name="ip<?php echo $tracker; ?>" type="text" class="formfld unknown" id="ip<?php echo $tracker; ?>" size="10" value="<?=htmlspecialchars($ip);?>" />
+ </td>
+ <td>
+ <a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" alt="delete" /></a>
+ </td>
+ </tr>
+<?php
+ $counter++;
+ endforeach;
+ endif;
+?>
+ </tbody>
+ </table>
+ <a onclick="javascript:addRowTo('usertable'); return false;" href="#">
+ <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td height="16" colspan="2" valign="top"></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+<?php
+ if (isset($id)) {
+ echo "<input type=\"hidden\" name=\"id\" id=\"id\" value=\"" . htmlspecialchars($id, ENT_QUOTES | ENT_HTML401) . "\" />";
+ }
+?>
+<?php
+ if (isset($pconfig['pppoeid'])) {
+ echo "<input type=\"hidden\" name=\"pppoeid\" id=\"pppoeid\" value=\"{$pppoeid}\" />";
+ }
+?>
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
+ <a href="vpn_pppoe.php"><input name="Cancel" type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" /></a>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <span class="vexpl">
+ <span class="red"><strong><?=gettext("Note"); ?>:<br /></strong></span>
+ <?=gettext("don't forget to add a firewall rule to permit traffic from PPPoE clients"); ?>!
+ </span>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+ //<![CDATA[
+ enable_change(false);
+
+ field_counter_js = 3;
+ rows = 1;
+ totalrows = <?php echo $counter; ?>;
+ loaded = <?php echo $counter; ?>;
+ //]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_pptp.php b/src/usr/local/www/vpn_pptp.php
new file mode 100644
index 0000000..b6ded68
--- /dev/null
+++ b/src/usr/local/www/vpn_pptp.php
@@ -0,0 +1,504 @@
+<?php
+/*
+ vpn_pptp.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-vpnpptp
+##|*NAME=VPN: VPN PPTP page
+##|*DESCR=Allow access to the 'VPN: VPN PPTP' page.
+##|*MATCH=vpn_pptp.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+require_once("vpn.inc");
+
+if (!is_array($config['pptpd']['radius'])) {
+ $config['pptpd']['radius'] = array();
+}
+$pptpcfg = &$config['pptpd'];
+
+$pconfig['remoteip'] = $pptpcfg['remoteip'];
+$pconfig['localip'] = $pptpcfg['localip'];
+$pconfig['redir'] = $pptpcfg['redir'];
+$pconfig['mode'] = $pptpcfg['mode'];
+$pconfig['wins'] = $pptpcfg['wins'];
+$pconfig['req128'] = isset($pptpcfg['req128']);
+$pconfig['n_pptp_units'] = $pptpcfg['n_pptp_units'];
+$pconfig['pptp_dns1'] = $pptpcfg['dns1'];
+$pconfig['pptp_dns2'] = $pptpcfg['dns2'];
+$pconfig['radiusenable'] = isset($pptpcfg['radius']['server']['enable']);
+$pconfig['radiusissueips'] = isset($pptpcfg['radius']['radiusissueips']);
+$pconfig['radiussecenable'] = isset($pptpcfg['radius']['server2']['enable']);
+$pconfig['radacct_enable'] = isset($pptpcfg['radius']['accounting']);
+$pconfig['radiusserver'] = $pptpcfg['radius']['server']['ip'];
+$pconfig['radiusserverport'] = $pptpcfg['radius']['server']['port'];
+$pconfig['radiusserveracctport'] = $pptpcfg['radius']['server']['acctport'];
+$pconfig['radiussecret'] = $pptpcfg['radius']['server']['secret'];
+$pconfig['radiusserver2'] = $pptpcfg['radius']['server2']['ip'];
+$pconfig['radiusserver2port'] = $pptpcfg['radius']['server2']['port'];
+$pconfig['radiusserver2acctport'] = $pptpcfg['radius']['server2']['acctport'];
+$pconfig['radiussecret2'] = $pptpcfg['radius']['server2']['secret2'];
+$pconfig['radius_acct_update'] = $pptpcfg['radius']['acct_update'];
+$pconfig['radius_nasip'] = $pptpcfg['radius']['nasip'];
+
+if ($_POST) {
+
+ if (isset($input_errors))
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if ($_POST['mode'] == "server") {
+ $reqdfields = explode(" ", "localip remoteip");
+ $reqdfieldsn = array(gettext("Server address"),gettext("Remote start address"));
+
+ if ($_POST['radiusenable']) {
+ $reqdfields = array_merge($reqdfields, explode(" ", "radiusserver radiussecret"));
+ $reqdfieldsn = array_merge($reqdfieldsn,
+ array(gettext("RADIUS server address"),gettext("RADIUS shared secret")));
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_POST['localip'] && !is_ipaddr($_POST['localip']))) {
+ $input_errors[] = gettext("A valid server address must be specified.");
+ }
+ if (is_ipaddr_configured($_POST['localip'])) {
+ $input_errors[] = gettext("'Server address' parameter should NOT be set to any IP address currently in use on this firewall.");
+ }
+ if (!is_ipaddr($_POST['remoteip'])) {
+ $input_errors[] = gettext("A valid remote start address must be specified.");
+ }
+ if (($_POST['radiusserver'] && !is_ipaddr($_POST['radiusserver']))) {
+ $input_errors[] = gettext("A valid RADIUS server address must be specified.");
+ }
+
+ if (!$input_errors) {
+ $subnet_start = ip2ulong($_POST['remoteip']);
+ $subnet_end = ip2ulong($_POST['remoteip']) + $_POST['n_pptp_units'] - 1;
+
+ if ((ip2ulong($_POST['localip']) >= $subnet_start) &&
+ (ip2ulong($_POST['localip']) <= $subnet_end)) {
+ $input_errors[] = gettext("The specified server address lies in the remote subnet.");
+ }
+ // TODO: Should this check be for any local IP address?
+ if ($_POST['localip'] == $config['interfaces']['lan']['ipaddr']) {
+ $input_errors[] = gettext("The specified server address is equal to the LAN interface address.");
+ }
+ }
+ } else if ($_POST['mode'] == "redir") {
+ $reqdfields = explode(" ", "redir");
+ $reqdfieldsn = array(gettext("PPTP redirection target address"));
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (($_POST['redir'] && !is_ipaddr($_POST['redir']))) {
+ $input_errors[] = gettext("A valid target address must be specified.");
+ }
+ } else if (isset($config['pptpd']['mode'])) {
+ unset($config['pptpd']['mode']);
+ }
+
+ if (!$input_errors) {
+ $pptpcfg['remoteip'] = $_POST['remoteip'];
+ $pptpcfg['redir'] = $_POST['redir'];
+ $pptpcfg['localip'] = $_POST['localip'];
+ $pptpcfg['mode'] = $_POST['mode'];
+ $pptpcfg['wins'] = $_POST['wins'];
+ $pptpcfg['n_pptp_units'] = $_POST['n_pptp_units'];
+ $pptpcfg['radius']['server']['ip'] = $_POST['radiusserver'];
+ $pptpcfg['radius']['server']['port'] = $_POST['radiusserverport'];
+ $pptpcfg['radius']['server']['acctport'] = $_POST['radiusserveracctport'];
+ $pptpcfg['radius']['server']['secret'] = $_POST['radiussecret'];
+ $pptpcfg['radius']['server2']['ip'] = $_POST['radiusserver2'];
+ $pptpcfg['radius']['server2']['port'] = $_POST['radiusserver2port'];
+ $pptpcfg['radius']['server2']['acctport'] = $_POST['radiusserver2acctport'];
+ $pptpcfg['radius']['server2']['secret2'] = $_POST['radiussecret2'];
+ $pptpcfg['radius']['nasip'] = $_POST['radius_nasip'];
+ $pptpcfg['radius']['acct_update'] = $_POST['radius_acct_update'];
+
+ if ($_POST['pptp_dns1'] == "") {
+ if (isset($pptpcfg['dns1']))
+ unset($pptpcfg['dns1']);
+ } else
+ $pptpcfg['dns1'] = $_POST['pptp_dns1'];
+
+ if ($_POST['pptp_dns2'] == "") {
+ if (isset($pptpcfg['dns2']))
+ unset($pptpcfg['dns2']);
+ } else
+ $pptpcfg['dns2'] = $_POST['pptp_dns2'];
+
+ if($_POST['req128'] == "yes")
+ $pptpcfg['req128'] = true;
+ else if (isset($pptpcfg['req128']))
+ unset($pptpcfg['req128']);
+
+ if($_POST['radiusenable'] == "yes")
+ $pptpcfg['radius']['server']['enable'] = true;
+ else if (isset($pptpcfg['radius']['server']['enable']))
+ unset($pptpcfg['radius']['server']['enable']);
+
+ if($_POST['radiussecenable'] == "yes")
+ $pptpcfg['radius']['server2']['enable'] = true;
+ else if (isset($pptpcfg['radius']['server2']['enable']))
+ unset($pptpcfg['radius']['server2']['enable']);
+
+ if($_POST['radacct_enable'] == "yes")
+ $pptpcfg['radius']['accounting'] = true;
+ else if (isset($pptpcfg['radius']['accounting']))
+ unset($pptpcfg['radius']['accounting']);
+
+ if($_POST['radiusissueips'] == "yes") {
+ $pptpcfg['radius']['radiusissueips'] = true;
+ } else if (isset($pptpcfg['radius']['radiusissueips']))
+ unset($pptpcfg['radius']['radiusissueips']);
+
+ write_config();
+
+ $retval = 0;
+ $retval = vpn_pptpd_configure();
+ $savemsg = get_std_save_message($retval);
+
+ filter_configure();
+ }
+}
+
+$pgtitle = array(gettext("VPN"),gettext("VPN PPTP"));
+$shortcut_section = "pptps";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<script type="text/javascript">
+//<![CDATA[
+function get_radio_value(obj)
+{
+ for (i = 0; i < obj.length; i++) {
+ if (obj[i].checked)
+ return obj[i].value;
+ }
+ return null;
+}
+
+function enable_change(enable_over) {
+ if ((get_radio_value(document.iform.mode) == "server") || enable_over) {
+ document.iform.remoteip.disabled = 0;
+ document.iform.localip.disabled = 0;
+ document.iform.req128.disabled = 0;
+ document.iform.radiusenable.disabled = 0;
+ document.iform.radiusissueips.disabled = 0;
+ document.iform.wins.disabled = 0;
+ document.iform.n_pptp_units.disabled = 0;
+ document.iform.pptp_dns1.disabled = 0;
+ document.iform.pptp_dns2.disabled = 0;
+
+ if (document.iform.radiusenable.checked || enable_over) {
+ document.iform.radiussecenable.disabled = 0;
+ document.iform.radacct_enable.disabled = 0;
+ document.iform.radiusserver.disabled = 0;
+ document.iform.radiusserverport.disabled = 0;
+ document.iform.radiusserveracctport.disabled = 0;
+ document.iform.radiussecret.disabled = 0;
+ document.iform.radius_nasip.disabled = 0;
+ document.iform.radius_acct_update.disabled = 0;
+ document.iform.radiusissueips.disabled = 0;
+ if (document.iform.radiussecenable.checked || enable_over) {
+ document.iform.radiusserver2.disabled = 0;
+ document.iform.radiussecret2.disabled = 0;
+ document.iform.radiusserver2port.disabled = 0;
+ document.iform.radiusserver2acctport.disabled = 0;
+ } else {
+
+ document.iform.radiusserver2.disabled = 1;
+ document.iform.radiussecret2.disabled = 1;
+ document.iform.radiusserver2port.disabled = 1;
+ document.iform.radiusserver2acctport.disabled = 1;
+ }
+ } else {
+ document.iform.radacct_enable.disabled = 1;
+ document.iform.radiusserver.disabled = 1;
+ document.iform.radiusserverport.disabled = 1;
+ document.iform.radiusissueips.disabled = 1;
+ document.iform.radiusserveracctport.disabled = 1;
+ document.iform.radiussecret.disabled = 1;
+ document.iform.radius_nasip.disabled = 1;
+ document.iform.radius_acct_update.disabled = 1;
+ document.iform.radiusissueips.disabled = 1;
+ document.iform.radiusserver2.disabled = 1;
+ document.iform.radiussecret2.disabled = 1;
+ document.iform.radiusserver2port.disabled = 1;
+ document.iform.radiusserver2acctport.disabled = 1;
+ }
+
+ } else {
+ document.iform.remoteip.disabled = 1;
+ document.iform.localip.disabled = 1;
+ document.iform.req128.disabled = 1;
+ document.iform.n_pptp_units.disabled = 1;
+ document.iform.pptp_dns1.disabled = 1;
+ document.iform.pptp_dns2.disabled = 1;
+ document.iform.radiusenable.disabled = 1;
+ document.iform.radacct_enable.disabled = 1;
+ document.iform.radiusserver.disabled = 1;
+ document.iform.radiusserverport.disabled = 1;
+ document.iform.radiusissueips.disabled = 1;
+ document.iform.radiusserveracctport.disabled = 1;
+ document.iform.radiussecret.disabled = 1;
+ document.iform.radius_nasip.disabled = 1;
+ document.iform.radius_acct_update.disabled = 1;
+ document.iform.radiussecenable.disabled = 1;
+ document.iform.radiusserver2.disabled = 1;
+ document.iform.radiusserver2port.disabled = 1;
+ document.iform.radiusserver2acctport.disabled = 1;
+ document.iform.radiussecret2.disabled = 1;
+ document.iform.wins.disabled = 1;
+ document.iform.radiusissueips.disabled = 1;
+ }
+ if ((get_radio_value(document.iform.mode) == "redir") || enable_over) {
+ document.iform.redir.disabled = 0;
+ } else {
+ document.iform.redir.disabled = 1;
+ }
+}
+//]]>
+</script>
+<form action="vpn_pptp.php" method="post" name="iform" id="iform">
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php print_info_box(gettext("PPTP is no longer considered a secure VPN technology because it relies upon MS-CHAPv2 which has been compromised. If you continue to use PPTP be aware that intercepted traffic can be decrypted by a third party, so it should be considered unencrypted. We advise migrating to another VPN type such as OpenVPN or IPsec.<br /><br /><a href=\"https://isc.sans.edu/diary/End+of+Days+for+MS-CHAPv2/13807\">Read More</a>")); ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn pptp">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Configuration"), true, "vpn_pptp.php");
+ $tab_array[1] = array(gettext("Users"), false, "vpn_pptp_users.php");
+ display_top_tabs($tab_array);
+?>
+ </td></tr>
+ <tr>
+ <td>
+<div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="mode" type="radio" onclick="enable_change(false)" value="off"
+ <?php if (($pconfig['mode'] != "server") && ($pconfig['mode'] != "redir")) echo "checked=\"checked\"";?> />
+ <?=gettext("Off"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+
+ <input type="radio" name="mode" value="redir" onclick="enable_change(false)" <?php if ($pconfig['mode'] == "redir") echo "checked=\"checked\"" ?> />
+ <?=gettext("Redirect incoming PPTP connections to");?>:</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("PPTP redirection");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="redir" type="text" class="formfld unknown" id="redir" size="20" value="<?=htmlspecialchars($pconfig['redir']);?>" />
+ <br />
+ <?=gettext("Enter the IP address of a host which will accept incoming " .
+ "PPTP connections"); ?>.</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vtable">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input type="radio" name="mode" value="server" onclick="enable_change(false)" <?php if ($pconfig['mode'] == "server") echo "checked=\"checked\""; ?> />
+ <?=gettext("Enable PPTP server"); ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("No. PPTP users"); ?></td>
+ <td width="78%" class="vtable">
+ <select id="n_pptp_units" name="n_pptp_units">
+ <?php
+ $toselect = ($pconfig['n_pptp_units'] > 0) ? $pconfig['n_pptp_units'] : 16;
+ for($x=1; $x<255; $x++) {
+ if($x == $toselect)
+ $SELECTED = " selected=\"selected\"";
+ else
+ $SELECTED = "";
+ echo "<option value=\"{$x}\"{$SELECTED}>{$x}</option>\n";
+ }
+ ?>
+ </select>
+ <br /><?=gettext("Hint: 10 is ten PPTP clients"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Server address"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="localip" type="text" class="formfld unknown" id="localip" size="20" value="<?=htmlspecialchars($pconfig['localip']);?>" />
+ <br />
+ <?=gettext("Enter the IP address the PPTP server should give to clients for use as their \"gateway\""); ?>.
+ <br />
+ <?=gettext("Typically this is set to an unused IP just outside of the client range"); ?>.
+ <br />
+ <br />
+ <?=gettext("NOTE: This should NOT be set to any IP address currently in use on this firewall"); ?>.</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Remote address " .
+ "range"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="remoteip" type="text" class="formfld unknown" id="remoteip" size="20" value="<?=htmlspecialchars($pconfig['remoteip']);?>" />
+ <br />
+ <?=gettext("Specify the starting address for the client IP subnet"); ?>.<br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("PPTP DNS Servers"); ?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="pptp_dns1" type="text" class="formfld unknown" id="pptp_dns1" size="20" value="<?=htmlspecialchars($pconfig['pptp_dns1']);?>" />
+ <br />
+ <input name="pptp_dns2" type="text" class="formfld unknown" id="pptp_dns2" size="20" value="<?=htmlspecialchars($pconfig['pptp_dns2']);?>" />
+ <br />
+ <?=gettext("primary and secondary DNS servers assigned to PPTP clients"); ?><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("WINS Server"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="wins" class="formfld unknown" id="wins" size="20" value="<?=htmlspecialchars($pconfig['wins']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS"); ?></td>
+ <td width="78%" class="vtable">
+ <input name="radiusenable" type="checkbox" id="radiusenable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radiusenable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Use a RADIUS server for authentication"); ?></strong><br />
+ <?=gettext("When set, all users will be authenticated using " .
+ "the RADIUS server specified below. The local user database " .
+ "will not be used"); ?>.<br />
+ <br />
+ <input name="radacct_enable" type="checkbox" id="radacct_enable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radacct_enable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Enable RADIUS accounting"); ?> <br />
+ </strong><?=gettext("Sends accounting packets to the RADIUS server"); ?>.<br />
+ <br />
+ <input name="radiussecenable" type="checkbox" id="radiussecenable" onclick="enable_change(false)" value="yes" <?php if ($pconfig['radiussecenable']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Secondary RADIUS server for failover authentication"); ?></strong><br />
+ <?=gettext("When set, all requests will go to the secondary server when primary fails"); ?><br />
+ <br />
+ <input name="radiusissueips" value="yes" type="checkbox" class="formfld" id="radiusissueips"<?php if($pconfig['radiusissueips']) echo " checked=\"checked\""; ?> />
+ <strong><?=gettext("RADIUS issued IPs"); ?></strong>
+ <br /><?=gettext("Issue IP addresses via RADIUS server"); ?>.
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS NAS IP"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="radius_nasip" class="formfld unknown" id="radius_nasip" size="20" value="<?=htmlspecialchars($pconfig['radius_nasip']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Accounting Update"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="radius_acct_update" class="formfld unknown" id="radius_acct_update" size="20" value="<?=htmlspecialchars($pconfig['radius_acct_update']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS Server"); ?> </td>
+ <td width="78%" class="vtable">
+ <input name="radiusserver" type="text" class="formfld unknown" id="radiusserver" size="20" value="<?=htmlspecialchars($pconfig['radiusserver']);?>" />
+ <input name="radiusserverport" type="text" class="formfld unknown" id="radiusserverport" size="4" value="<?=htmlspecialchars($pconfig['radiusserverport']);?>" />
+ <input name="radiusserveracctport" type="text" class="formfld unknown" id="radiusserveracctport" size="4" value="<?=htmlspecialchars($pconfig['radiusserveracctport']);?>" />
+ <br />
+ <?=gettext("Enter the IP address, RADIUS port, and RADIUS accounting port of the RADIUS server"); ?>.</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("RADIUS shared secret"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="radiussecret" type="password" class="formfld pwd" id="radiussecret" size="20" value="<?=htmlspecialchars($pconfig['radiussecret']);?>" />
+ <br />
+ <?=gettext("Enter the shared secret that will be used to authenticate " .
+ "to the RADIUS server"); ?>.</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Secondary RADIUS server"); ?> </td>
+ <td width="78%" class="vtable">
+ <input name="radiusserver2" type="text" class="formfld unknown" id="radiusserver2" size="20" value="<?=htmlspecialchars($pconfig['radiusserver2']);?>" />
+ <input name="radiusserver2port" type="text" class="formfld unknown" id="radiusserver2port" size="4" value="<?=htmlspecialchars($pconfig['radiusserver2port']);?>" />
+ <input name="radiusserver2acctport" type="text" class="formfld unknown" id="radiusserver2acctport" size="4" value="<?=htmlspecialchars($pconfig['radiusserver2acctport']);?>" />
+ <br />
+ <?=gettext("Enter the IP address, RADIUS port, and RADIUS accounting port of the RADIUS server"); ?>.</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Secondary RADIUS shared secret"); ?></td>
+ <td width="78%" valign="top" class="vtable">
+ <input name="radiussecret2" type="password" class="formfld pwd" id="radiussecret2" size="20" value="<?=htmlspecialchars($pconfig['radiussecret2']);?>" />
+ <br />
+ <?=gettext("Enter the shared secret that will be used to authenticate " .
+ "to the secondary RADIUS server"); ?>.</td>
+ </tr>
+ <tr>
+ <td height="16" colspan="2" valign="top"></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="middle">&nbsp;</td>
+ <td width="78%" class="vtable">
+ <input name="req128" type="checkbox" id="req128" value="yes" <?php if ($pconfig['req128']) echo "checked=\"checked\""; ?> />
+ <strong><?=gettext("Require 128-bit encryption"); ?></strong><br />
+ <?=gettext("When set, only 128-bit encryption will be accepted. Otherwise " .
+ "40-bit and 56-bit encryption will be accepted as well. Note that " .
+ "encryption will always be forced on PPTP connections (i.e. " .
+ "unencrypted connections will not be accepted)"); ?>.</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" onclick="enable_change(true)" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%"><span class="vexpl"><span class="red"><strong><?=gettext("Note");?>:<br />
+ </strong></span><?=gettext("don't forget to ");?><a href="firewall_rules.php?if=pptp"><?=gettext("add a firewall rule"); ?></a> <?=gettext("to permit ".
+ "traffic from PPTP clients");?>!</span></td>
+ </tr>
+ </table>
+</div>
+ </td>
+ </tr>
+</table>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+enable_change(false);
+//]]>
+</script>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_pptp_users.php b/src/usr/local/www/vpn_pptp_users.php
new file mode 100644
index 0000000..553888f
--- /dev/null
+++ b/src/usr/local/www/vpn_pptp_users.php
@@ -0,0 +1,142 @@
+<?php
+/*
+ vpn_pptp_users.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-vpnpptp-users
+##|*NAME=VPN: VPN PPTP: Users page
+##|*DESCR=Allow access to the 'VPN: VPN PPTP: Users' page.
+##|*MATCH=vpn_pptp_users.php*
+##|-PRIV
+
+require("guiconfig.inc");
+require_once("vpn.inc");
+
+if (!is_array($config['pptpd']['user'])) {
+ $config['pptpd']['user'] = array();
+}
+$a_secret = &$config['pptpd']['user'];
+
+if ($_POST) {
+
+ $pconfig = $_POST;
+
+ if ($_POST['apply']) {
+ $retval = 0;
+ $retval = vpn_setup();
+ $savemsg = get_std_save_message($retval);
+ if ($retval == 0) {
+ if (is_subsystem_dirty('pptpusers'))
+ clear_subsystem_dirty('pptpusers');
+ }
+ }
+}
+
+if ($_GET['act'] == "del") {
+ if ($a_secret[$_GET['id']]) {
+ unset($a_secret[$_GET['id']]);
+ write_config();
+ mark_subsystem_dirty('pptpusers');
+ header("Location: vpn_pptp_users.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("VPN"),gettext("VPN PPTP"),gettext("Users"));
+$shortcut_section = "pptps";
+include("head.inc");
+
+?>
+
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<form action="vpn_pptp_users.php" method="post">
+<?php if ($savemsg) print_info_box($savemsg); ?>
+<?php if (isset($config['pptpd']['radius']['enable']))
+ print_info_box(gettext("Warning: RADIUS is enabled. The local user database will not be used.")); ?>
+<?php if (is_subsystem_dirty('pptpusers')): ?><br/>
+<?php print_info_box_np(gettext("The PPTP user list has been modified").".<br />".gettext("You must apply the changes in order for them to take effect").".<br /></b><b>".gettext("Warning: this will terminate all current PPTP sessions")."!");?><br />
+<?php endif; ?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="vpn pptp users">
+ <tr><td class="tabnavtbl">
+<?php
+ $tab_array = array();
+ $tab_array[0] = array(gettext("Configuration"), false, "vpn_pptp.php");
+ $tab_array[1] = array(gettext("Users"), true, "vpn_pptp_users.php");
+ display_top_tabs($tab_array);
+?> </td></tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td class="listhdrr"><?=gettext("Username");?></td>
+ <td class="listhdr"><?=gettext("IP address");?></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td><a href="vpn_pptp_users_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add user");?>" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php $i = 0; foreach ($a_secret as $secretent): ?>
+ <tr>
+ <td class="listlr">
+ <?=htmlspecialchars($secretent['name']);?>
+ </td>
+ <td class="listr">
+ <?=htmlspecialchars($secretent['ip']);?>&nbsp;
+ </td>
+ <td class="list nowrap"><a href="vpn_pptp_users_edit.php?id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" title="<?=gettext("edit user");?>" width="17" height="17" border="0" alt="edit" /></a>
+ &nbsp;<a href="vpn_pptp_users.php?act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this user?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" title="<?=gettext("delete user");?>" width="17" height="17" border="0" alt="delete" /></a></td>
+ </tr>
+ <?php $i++; endforeach; ?>
+ <tr>
+ <td class="list" colspan="2"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1" summary="add">
+ <tr>
+ <td width="17"></td>
+ <td><a href="vpn_pptp_users_edit.php"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add user");?>" width="17" height="17" border="0" alt="add" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+</div>
+ </td>
+ </tr>
+</table>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/vpn_pptp_users_edit.php b/src/usr/local/www/vpn_pptp_users_edit.php
new file mode 100644
index 0000000..8b09a7f
--- /dev/null
+++ b/src/usr/local/www/vpn_pptp_users_edit.php
@@ -0,0 +1,184 @@
+<?php
+/*
+ vpn_pptp_users_edit.php
+ part of m0n0wall (http://m0n0.ch/wall)
+ part of pfSense
+
+ Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-vpn-vpnpptp-user-edit
+##|*NAME=VPN: VPN PPTP: User: Edit page
+##|*DESCR=Allow access to the 'VPN: VPN PPTP: User: Edit' page.
+##|*MATCH=vpn_pptp_users_edit.php*
+##|-PRIV
+
+function pptpusercmp($a, $b) {
+ return strcasecmp($a['name'], $b['name']);
+}
+
+function pptpd_users_sort() {
+ global $config;
+
+ if (!is_array($config['ppptpd']['user']))
+ return;
+
+ usort($config['pptpd']['user'], "pptpusercmp");
+}
+
+require("guiconfig.inc");
+require_once("vpn.inc");
+
+if (!is_array($config['pptpd']['user'])) {
+ $config['pptpd']['user'] = array();
+}
+$a_secret = &$config['pptpd']['user'];
+
+if (is_numericint($_GET['id']))
+ $id = $_GET['id'];
+if (isset($_POST['id']) && is_numericint($_POST['id']))
+ $id = $_POST['id'];
+
+if (isset($id) && $a_secret[$id]) {
+ $pconfig['username'] = $a_secret[$id]['name'];
+ $pconfig['ip'] = $a_secret[$id]['ip'];
+}
+
+if ($_POST) {
+
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if (isset($id) && ($a_secret[$id])) {
+ $reqdfields = explode(" ", "username");
+ $reqdfieldsn = array(gettext("Username"));
+ } else {
+ $reqdfields = explode(" ", "username passwordfld1");
+ $reqdfieldsn = array(gettext("Username"),gettext("Password"));
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
+
+ if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['username']))
+ $input_errors[] = gettext("The username contains invalid characters.");
+
+ if (preg_match("/^!/", $_POST['passwordfld1']))
+ $input_errors[] = gettext("The password cannot start with '!'.");
+
+ if (!preg_match("/^[\x20-\x7E]*$/", $_POST['passwordfld1']))
+ $input_errors[] = gettext("The password contains invalid characters.");
+
+ if (($_POST['passwordfld1']) && ($_POST['passwordfld1'] != $_POST['passwordfld2'])) {
+ $input_errors[] = gettext("The passwords do not match.");
+ }
+ if (($_POST['ip'] && !is_ipaddr($_POST['ip']))) {
+ $input_errors[] = gettext("The IP address entered is not valid.");
+ }
+
+ if (!$input_errors && !(isset($id) && $a_secret[$id])) {
+ /* make sure there are no dupes */
+ foreach ($a_secret as $secretent) {
+ if ($secretent['name'] == $_POST['username']) {
+ $input_errors[] = gettext("Another entry with the same username already exists.");
+ break;
+ }
+ }
+ }
+
+ if (!$input_errors) {
+
+ if (isset($id) && $a_secret[$id])
+ $secretent = $a_secret[$id];
+
+ $secretent['name'] = $_POST['username'];
+ $secretent['ip'] = $_POST['ip'];
+
+ if ($_POST['passwordfld1'])
+ $secretent['password'] = $_POST['passwordfld1'];
+
+ if (isset($id) && $a_secret[$id])
+ $a_secret[$id] = $secretent;
+ else
+ $a_secret[] = $secretent;
+ pptpd_users_sort();
+
+ write_config();
+ mark_subsystem_dirty('pptpusers');
+
+ header("Location: vpn_pptp_users.php");
+ exit;
+ }
+}
+
+$pgtitle = array(gettext("VPN"),gettext("VPN PPTP"),gettext("User"),gettext("Edit"));
+$shortcut_section = "pptps";
+include("head.inc");
+
+?>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
+<?php include("fbegin.inc"); ?>
+<?php if ($input_errors) print_input_errors($input_errors); ?>
+ <form action="vpn_pptp_users_edit.php" method="post" name="iform" id="iform">
+ <div id="mainarea">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="vpn pptp users edit">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="username" type="text" class="formfld user" id="username" size="20" value="<?=htmlspecialchars($pconfig['username']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Password");?></td>
+ <td width="78%" class="vtable">
+ <?=$mandfldhtml;?><input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" />
+ <br /><?=$mandfldhtml;?><input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" />
+ &nbsp;(<?=gettext("confirmation");?>)<?php if (isset($id) && $a_secret[$id]): ?><br />
+ <span class="vexpl"><?=gettext("If you want to change the users' password, ".
+ "enter it here twice.");?></span><?php endif; ?></td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("IP address");?></td>
+ <td width="78%" class="vtable">
+ <input name="ip" type="text" class="formfld unknown" id="ip" size="20" value="<?=htmlspecialchars($pconfig['ip']);?>" />
+ <br /><span class="vexpl"><?=gettext("If you want the user to be assigned a specific IP address, enter it here.");?></span></td>
+ </tr>
+ <tr>
+ <td class="vncell" width="22%" valign="top">&nbsp;</td>
+ <td class="vncell" width="78%">
+ <input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ <?php if (isset($id) && $a_secret[$id]): ?>
+ <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
+ <?php endif; ?>
+ </td>
+ </tr>
+ </table>
+ </div>
+</form>
+<?php include("fend.inc"); ?>
+</body>
+</html>
diff --git a/src/usr/local/www/widgets/include/captiveportal.inc b/src/usr/local/www/widgets/include/captiveportal.inc
new file mode 100644
index 0000000..3714209
--- /dev/null
+++ b/src/usr/local/www/widgets/include/captiveportal.inc
@@ -0,0 +1,4 @@
+<?php
+$captive_portal_status_title = "Captive Portal Status";
+$captive_portal_status_title_link = "status_captiveportal.php";
+?>
diff --git a/src/usr/local/www/widgets/include/carp_status.inc b/src/usr/local/www/widgets/include/carp_status.inc
new file mode 100644
index 0000000..79d3c03
--- /dev/null
+++ b/src/usr/local/www/widgets/include/carp_status.inc
@@ -0,0 +1,7 @@
+<?php
+
+//set variable for custom title
+$carp_status_title = "Carp Status";
+$carp_status_title_link = "carp_status.php";
+
+?>
diff --git a/src/usr/local/www/widgets/include/dyn_dns_status.inc b/src/usr/local/www/widgets/include/dyn_dns_status.inc
new file mode 100644
index 0000000..8116fe7
--- /dev/null
+++ b/src/usr/local/www/widgets/include/dyn_dns_status.inc
@@ -0,0 +1,7 @@
+<?php
+
+//set variable for custom title
+$dyn_dns_status_title = "Dyn DNS Status";
+$dyn_dns_status_title_link = "services_dyndns.php";
+
+?>
diff --git a/src/usr/local/www/widgets/include/gateways.inc b/src/usr/local/www/widgets/include/gateways.inc
new file mode 100644
index 0000000..4666689
--- /dev/null
+++ b/src/usr/local/www/widgets/include/gateways.inc
@@ -0,0 +1,5 @@
+<?php
+//set variable for custom title
+$gateways_title = "Gateways";
+$gateways_title_link = "status_gateways.php";
+?>
diff --git a/src/usr/local/www/widgets/include/gmirror_status.inc b/src/usr/local/www/widgets/include/gmirror_status.inc
new file mode 100644
index 0000000..6547d4d
--- /dev/null
+++ b/src/usr/local/www/widgets/include/gmirror_status.inc
@@ -0,0 +1,4 @@
+<?php
+$gmirror_status_title = "GEOM Mirror Status";
+$gmirror_status_title_link = "diag_gmirror.php";
+?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/include/installed_packages.inc b/src/usr/local/www/widgets/include/installed_packages.inc
new file mode 100644
index 0000000..a978191
--- /dev/null
+++ b/src/usr/local/www/widgets/include/installed_packages.inc
@@ -0,0 +1,7 @@
+<?php
+
+//set variable for custom title
+$installed_packages_title = "Installed Packages";
+$installed_packages_title_link = "pkg_mgr_installed.php";
+
+?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/include/interface_statistics.inc b/src/usr/local/www/widgets/include/interface_statistics.inc
new file mode 100644
index 0000000..c789418
--- /dev/null
+++ b/src/usr/local/www/widgets/include/interface_statistics.inc
@@ -0,0 +1,5 @@
+<?php
+//set variable for custom title
+$interface_statistics_title = "Interface Statistics";
+$interface_statistics_title_link = "status_interfaces.php";
+?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/include/interfaces.inc b/src/usr/local/www/widgets/include/interfaces.inc
new file mode 100644
index 0000000..6c19a6b
--- /dev/null
+++ b/src/usr/local/www/widgets/include/interfaces.inc
@@ -0,0 +1,6 @@
+<?php
+//set variable for custom title
+$interfaces_title = "Interfaces";
+$interfaces_title_link = "status_interfaces.php";
+
+?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/include/ipsec.inc b/src/usr/local/www/widgets/include/ipsec.inc
new file mode 100644
index 0000000..6df0a7c
--- /dev/null
+++ b/src/usr/local/www/widgets/include/ipsec.inc
@@ -0,0 +1,4 @@
+<?php
+$ipsec_title = "IPsec";
+$ipsec_title_link = "diag_ipsec.php";
+?>
diff --git a/src/usr/local/www/widgets/include/load_balancer.inc b/src/usr/local/www/widgets/include/load_balancer.inc
new file mode 100644
index 0000000..367ea46
--- /dev/null
+++ b/src/usr/local/www/widgets/include/load_balancer.inc
@@ -0,0 +1,4 @@
+<?php
+$load_balancer_status_title = "Load Balancer Status";
+$load_balancer_status_title_link = "status_lb_pool.php";
+?>
diff --git a/src/usr/local/www/widgets/include/log.inc b/src/usr/local/www/widgets/include/log.inc
new file mode 100644
index 0000000..7ad453a
--- /dev/null
+++ b/src/usr/local/www/widgets/include/log.inc
@@ -0,0 +1,6 @@
+<?php
+//set variable for custom title
+$log_title = "Firewall Logs";
+$log_title_link = "diag_logs_filter.php";
+
+?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/include/ntp_status.inc b/src/usr/local/www/widgets/include/ntp_status.inc
new file mode 100644
index 0000000..1115095
--- /dev/null
+++ b/src/usr/local/www/widgets/include/ntp_status.inc
@@ -0,0 +1,5 @@
+<?php
+//set variable for custom title
+$ntp_status_title = "NTP Status";
+$ntp_status_title_link = "status_ntpd.php";
+?>
diff --git a/src/usr/local/www/widgets/include/openvpn.inc b/src/usr/local/www/widgets/include/openvpn.inc
new file mode 100644
index 0000000..075d0e5
--- /dev/null
+++ b/src/usr/local/www/widgets/include/openvpn.inc
@@ -0,0 +1,4 @@
+<?php
+$openvpn_title = "OpenVPN";
+$openvpn_title_link = "status_openvpn.php";
+?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/include/services_status.inc b/src/usr/local/www/widgets/include/services_status.inc
new file mode 100644
index 0000000..685aee4
--- /dev/null
+++ b/src/usr/local/www/widgets/include/services_status.inc
@@ -0,0 +1,7 @@
+<?php
+
+//set variable for custom title
+$services_status_title = "Services Status";
+$services_status_title_link = "status_services.php";
+
+?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/include/smart_status.inc b/src/usr/local/www/widgets/include/smart_status.inc
new file mode 100644
index 0000000..bbfa274
--- /dev/null
+++ b/src/usr/local/www/widgets/include/smart_status.inc
@@ -0,0 +1,5 @@
+<?php
+//set variable for custom title
+$smart_status_title = "SMART Status";
+$smart_status_title_link = "diag_smart.php";
+?>
diff --git a/src/usr/local/www/widgets/include/thermal_sensors.inc b/src/usr/local/www/widgets/include/thermal_sensors.inc
new file mode 100644
index 0000000..a6e727a
--- /dev/null
+++ b/src/usr/local/www/widgets/include/thermal_sensors.inc
@@ -0,0 +1,27 @@
+<?php
+/*
+ $Id: thermal_sensors.inc
+ File location:
+ \usr\local\www\widgets\include\
+
+ Used by:
+ \usr\local\www\widgets\widgets\thermal_sensors.widget.php
+
+
+*/
+
+//set variable for custom title
+$thermal_sensors_widget_title = "Thermal Sensors";
+//$thermal_sensors_widget_link = "thermal_sensors.php";
+
+
+//returns core temp data (from coretemp.ko or amdtemp.ko driver) as "|"-delimited string.
+//NOTE: depends on proper config in System >> Advanced >> Miscellaneous tab >> Thermal Sensors section.
+function getThermalSensorsData() {
+
+ $_gb = exec("/sbin/sysctl -a | grep temperature", $dfout);
+ $thermalSensorsData = join("|", $dfout);
+ return $thermalSensorsData;
+
+}
+?>
diff --git a/src/usr/local/www/widgets/include/traffic_graph.inc b/src/usr/local/www/widgets/include/traffic_graph.inc
new file mode 100644
index 0000000..3901db6
--- /dev/null
+++ b/src/usr/local/www/widgets/include/traffic_graph.inc
@@ -0,0 +1,4 @@
+<?php
+$traffic_graphs_title = "Traffic Graphs";
+$traffic_graphs_title_link = "status_graph.php";
+?>
diff --git a/src/usr/local/www/widgets/include/wake_on_lan.inc b/src/usr/local/www/widgets/include/wake_on_lan.inc
new file mode 100644
index 0000000..af3229c
--- /dev/null
+++ b/src/usr/local/www/widgets/include/wake_on_lan.inc
@@ -0,0 +1,7 @@
+<?php
+
+//set variable for custom title
+$wake_on_lan_title = "Wake On Lan";
+$wake_on_lan_title_link = "services_wol.php";
+
+?> \ No newline at end of file
diff --git a/src/usr/local/www/widgets/javascript/cpu_graphs.js b/src/usr/local/www/widgets/javascript/cpu_graphs.js
new file mode 100644
index 0000000..1fc690a
--- /dev/null
+++ b/src/usr/local/www/widgets/javascript/cpu_graphs.js
@@ -0,0 +1,245 @@
+/******************************************************************************
+ $Id: graphlink.js,v 1.1 2006/12/21 17:10:25 dberlin Exp $
+
+ This file is part of the GraphLink software.
+ GraphLink is distributed under the MIT License.
+ Copyright (C) 2005-2006 Max Khitrov <max@mxsoft.org>
+ ******************************************************************************/
+
+/***** Global data ************************************************************/
+
+var gl_graphCount = 0; // Number of graphs on the current page
+
+/***** Constants **************************************************************/
+
+var GL_START = 0;
+var GL_END = 1;
+var GL_STATIC = 0;
+var GL_DYNAMIC = 1;
+
+/***** Public functions *******************************************************/
+
+/**
+ * Creates a graph and returns the graph data structure which can later be
+ * manipulated using the other graph functions.
+ *
+ * element_id - DOM element id (should be a DIV) that will contain the graph.
+ * width - The width of the graph in pixels.
+ * height - Height of the graph in pixels.
+ * bar_width - Width of each bar on the graph. This number should divide width
+ * evenly, or else width will be adjusted to meet this requirement.
+ * General formula to keep in mind:
+ * Smaller bar width = more bars = higher CPU usage on client-side.
+ *
+ * Returns graph data structure on success, false on error.
+ */
+function GraphInitialize(element_id, width, height, bar_width) {
+ // Find the page element which will contain the graph
+ var owner;
+ if((owner = jQuery('#' + element_id)) == null) {
+ alert("GraphLink Error: Element ID '" + element_id + "' not found.");
+ return false;
+ }
+
+ // Make sure width is divisible by bar_width
+ if(width / bar_width != Math.floor(width / bar_width))
+ width = Math.floor(width / bar_width) * bar_width;
+
+ var bar_count = width / bar_width;
+
+ // Create the graph data structure
+ var graph = new Array();
+ graph['id'] = gl_graphCount; // ID used to separate elements of one graph from those of another
+ graph['width'] = width; // Graph width
+ graph['height'] = height; // Graph height
+ graph['bar_count'] = bar_count; // Number of bars on the graph
+ graph['scale_type'] = GL_STATIC; // How the graph is scaled
+ graph['scale'] = 1; // Multiplier for the bar height
+ graph['max'] = 0; // Largest value currently on the graph
+ graph['vmax'] = height; // Virtual graph maximum
+ graph['spans'] = new Array(bar_count); // References to all the spans for each graph
+ graph['vals'] = new Array(bar_count); // The height of each bar on the graph, actually it's (graph height - bar height)
+ gl_graphCount++;
+
+ // Build the graph (x)html
+ var graph_html = '';
+ graph_html += '<div id="GraphLinkData' + graph['id'] + '" class="GraphLinkData">';
+
+ for(var i = 0; i < bar_count; i++) {
+ graph['vals'][i] = height;
+ graph_html += '<span id="GraphLinkBar' + graph['id'] + '_' + i + '" class="GraphLinkBar"></span>';
+ }
+
+ graph_html += '</div>';
+ owner.html(graph_html);
+ graph['element_id'] = jQuery('#GraphLinkData' + graph['id']);
+
+ for(i = 0; i < bar_count; i++) {
+ graph['spans'][i] = jQuery('#GraphLinkBar' + graph['id'] + '_' + i);
+ graph['spans'][i].css('width',bar_width + 'px');
+ graph['spans'][i].css('margin-top',height + 'px');
+ }
+
+ return graph;
+}
+
+/**
+ * Adds a new value to a graph.
+ *
+ * graph - Graph object to which to add the new value.
+ * value - Value to add.
+ * where - (optional) GL_START (0) or GL_END (1), depending on where you want
+ * the new value to appear. GL_START will add the value on the left
+ * of the graph, GL_END will add it on the right (default).
+ */
+function GraphValue(graph, value, where) {
+ if(typeof(where) == 'undefined')
+ where = GL_END;
+
+ var rescale = false;
+ var lost = 0;
+
+ if(value < 0)
+ value = 0;
+
+ if(graph['scale_type'] == GL_DYNAMIC && value > graph['max'])
+ rescale = true;
+
+ if(graph['scale_type'] == GL_STATIC) {
+ if(value > graph['vmax'])
+ value = graph['vmax'];
+ value = Math.round(value * graph['scale']);
+ }
+
+ if(where == GL_START) {
+ graph['vals'].unshift(graph['height'] - value);
+ lost = graph['vals'].pop();
+ }
+ else {
+ graph['vals'].push(graph['height'] - value);
+ lost = graph['vals'].shift();
+ }
+
+ if(graph['scale_type'] == GL_DYNAMIC && (graph['height'] - lost) == graph['max'])
+ rescale = true;
+
+ if(rescale)
+ GraphAdjustScale(graph)
+
+ GraphDraw(graph);
+}
+
+/**
+ * Sets a virtual maximum for the graph allowing you to have non-scaled graphs
+ * that can show a value greater then the graph height. This function will
+ * automatically set the graph to a static scale mode, meaning that no values
+ * above the maximum will be permitted. If you need to have a graph with no
+ * pre-defined maximum, make it dynamic. Also note that if you set a vmax on a
+ * graph that has data larger than vmax, that data will be reduced.
+ *
+ * graph - Graph object for which to set virtual max.
+ * vmax - The virtual maximum value for the graph.
+ */
+function GraphSetVMax(graph, vmax) {
+ graph['scale_type'] = GL_STATIC;
+ graph['vmax'] = vmax;
+
+ GraphAdjustScale(graph);
+ GraphDraw(graph);
+}
+
+/**
+ * This function instructs the graph to be scaled according to what the maximum
+ * value is. That value is used as the graph maximum and is reevaluated whenever
+ * a new value is added, or the current maximum is removed. Dynamic scaling is a
+ * good way of showing data for which you don't know what the maximum will be,
+ * but it also is a bit more resource-intensive then statically scaled graphs.
+ *
+ * graph - Graph object for which to enable dynamic scaling.
+ */
+function GraphDynamicScale(graph) {
+ graph['scale_type'] = GL_DYNAMIC;
+
+ GraphAdjustScale(graph);
+ GraphDraw(graph);
+}
+
+/***** Private functions ******************************************************/
+
+/**
+ * Checks if the current scale of the graph is still valid, or needs to be
+ * adjusted.
+ *
+ * graph - Graph object for which to check the scale.
+ */
+function GraphAdjustScale(graph) {
+ var limit = graph['bar_count'];
+ var new_max = 0;
+ var new_scale = 0;
+ var val = 0;
+
+ if(graph['scale_type'] == GL_STATIC) {
+ new_max = graph['vmax'];
+ new_scale = graph['height'] / new_max;
+
+ if(new_scale == graph['scale'])
+ return;
+ }
+
+ for(var i = 0; i < limit; i++) {
+ if(graph['scale_type'] == GL_STATIC) {
+ val = (graph['height'] - graph['vals'][i]) * graph['scale'];
+ val = val * new_scale;
+
+ if(val > new_max)
+ val = new_max;
+
+ graph['vals'][i] = graph['height'] - Math.round(val * new_scale);
+
+ }
+ else if((graph['height'] - graph['vals'][i]) > new_max) {
+ new_max = graph['height'] - graph['vals'][i];
+ }
+ }
+
+
+ if(graph['scale_type'] == GL_STATIC) {
+ graph['scale'] = new_scale;
+ }
+ else {
+ if(new_max == 0)
+ graph['scale'] = 1;
+ else
+ graph['scale'] = graph['height'] / new_max;
+
+ graph['max'] = new_max;
+ }
+}
+
+/**
+ * Redraws the graph on the screen.
+ *
+ * graph - Graph object which needs to be re-drawn.
+ */
+function GraphDraw(graph) {
+ var count = graph['bar_count'];
+
+ if(graph['scale_type'] == GL_STATIC)
+ var getMargin = function(i) {
+ return graph['vals'][i] + 'px';
+ };
+ else
+ var getMargin = function(i) {
+ var h = graph['height'];
+ var s = graph['scale'];
+ var v = graph['vals'][i];
+ return (h - Math.round((h - v) * s)) + 'px';
+ };
+
+ graph['spans'][count - 1].css("display", "none");
+
+ for(var i = 0; i < count; i++)
+ graph['spans'][i].css("marginTop", getMargin(i));
+
+// jQuery('#' + graph['spans'][count - 1]).fadeIn(500);
+}
diff --git a/src/usr/local/www/widgets/javascript/ipsec.js b/src/usr/local/www/widgets/javascript/ipsec.js
new file mode 100644
index 0000000..d38f6cd
--- /dev/null
+++ b/src/usr/local/www/widgets/javascript/ipsec.js
@@ -0,0 +1,9 @@
+function updateIpsec() {
+ selectIntLink = "ipsecDetailed";
+ ipsecsettings = "ipsecDetail=";
+ ipsecsettings += d.getElementById(selectIntLink).checked;
+
+ selectIntLink = "ipsec-config";
+ textlink = d.getElementById(selectIntLink);
+ textlink.value = ipsecsettings;
+} \ No newline at end of file
diff --git a/src/usr/local/www/widgets/javascript/thermal_sensors.js b/src/usr/local/www/widgets/javascript/thermal_sensors.js
new file mode 100644
index 0000000..7415b01
--- /dev/null
+++ b/src/usr/local/www/widgets/javascript/thermal_sensors.js
@@ -0,0 +1,296 @@
+/*
+ $Id: thermal_sensors.js
+ Description:
+ Javascript functions to get and show thermal sensors data in thermal_sensors.widget.php.
+ NOTE: depends on proper config in System >> Advanced >> Miscellaneous tab >> Thermal Sensors section.
+ File location:
+ \usr\local\www\widgets\javascript\
+ Used by:
+ \usr\local\www\widgets\widgets\thermal_sensors.widget.php
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+
+//should be called from "thermal_sensors.widget.php"
+function showThermalSensorsData() {
+
+ //get data from thermal_sensors.widget.php
+ url = "/widgets/widgets/thermal_sensors.widget.php?getThermalSensorsData=1"
+ //IE fix to disable cache when using http:// , just append timespan
+ + new Date().getTime();
+
+ jQuery.ajax(url, {
+ type: 'get',
+ success: function(data) {
+ var thermalSensorsData = data || "";
+ buildThermalSensorsData(thermalSensorsData);
+ },
+ error: function(jqXHR, status, error) {
+ buildThermalSensorsDataRaw(
+ "Error getting data from [thermal_sensors.widget.php] - |" +
+ "status: [" + (status || "") + "]|" +
+ "error: [" + (error || "") + "]");
+ }
+ });
+
+ //call itself in 11 seconds
+ window.setTimeout(showThermalSensorsData, 11000);
+}
+
+function buildThermalSensorsData(thermalSensorsData) {
+ //NOTE: variable thermal_sensors_widget_showRawOutput is declared/set in "thermal_sensors.widget.php"
+ if (thermal_sensors_widget_showRawOutput) {
+ buildThermalSensorsDataRaw(thermalSensorsData);
+ } else {
+ buildThermalSensorsDataGraph(thermalSensorsData);
+ }
+}
+
+function buildThermalSensorsDataRaw(thermalSensorsData) {
+
+ var thermalSensorsContent = "";
+
+ if (thermalSensorsData && thermalSensorsData != "") {
+ thermalSensorsContent = thermalSensorsData.replace(/\|/g, "<br />");
+ //rawData = thermalSensorsData.split("|").join("<br />");
+ }
+
+ loadThermalSensorsContainer(thermalSensorsContent);
+}
+
+function loadThermalSensorsContainer (thermalSensorsContent) {
+
+ if (thermalSensorsContent && thermalSensorsContent != "") {
+ //load generated graph (or raw data) into thermalSensorsContainer (thermalSensorsContainer DIV defined in "thermal_sensors.widget.php")
+ jQuery('#thermalSensorsContainer').html(thermalSensorsContent);
+ } else {
+ jQuery('#thermalSensorsContainer').html("No Thermal Sensors data available.<br /><br />");
+ jQuery('<div/>').html(
+ "<span>* You can configure a proper Thermal Sensor / Module under <br />" +
+ "&nbsp;&nbsp;&nbsp;<a href='system_advanced_misc.php'>System &gt; Advanced &gt; Miscellaneous : Thermal Sensors section</a>.</span>"
+ ).appendTo('#thermalSensorsContainer');
+ }
+}
+
+function buildThermalSensorsDataGraph(thermalSensorsData) {
+
+ //local constants
+ var normalColor = "LimeGreen";
+ var normalColorShadowTop = "Lime";
+ var normalColorShadowBottom = "Green";
+
+ var warningColor = "Orange";
+ var warningColorShadowBottom = "Chocolate";
+
+ var criticalColor = "Red";
+ var criticalColorShadowBottom = "DarkRed";
+
+ //local variables
+ var barBgColor = normalColor; //green/normal as default
+ var barBgColorShadowTop = normalColorShadowTop; //green/normal as default
+ var barBgColorShadowBottom = normalColorShadowBottom; //green/normal as default
+
+ var thermalSensorsArray = new Array();
+
+ if (thermalSensorsData && thermalSensorsData != "") {
+ thermalSensorsArray = thermalSensorsData.split("|");
+ }
+
+ var thermalSensorsHTMLContent = "";
+ var itemsToPulsate = new Array();
+
+ //generate graph for each temperature sensor and append to thermalSensorsHTMLContent string
+ for (var i = 0; i < thermalSensorsArray.length; i++) {
+
+ var sensorDataArray = thermalSensorsArray[i].split(":");
+ var sensorName = sensorDataArray[0].trim();
+ var thermalSensorValue = getThermalSensorValue(sensorDataArray[1]);
+
+ var pulsateTimes = 0;
+ var pulsateDuration = 0;
+
+ var warningTempThresholdPosition = 0;
+ var criticalTempThresholdPosition = 0;
+
+ //NOTE: the following variables are declared/set in "thermal_sensors.widget.php":
+ // thermal_sensors_widget_coreWarningTempThreshold, thermal_sensors_widget_coreCriticalTempThreshold,
+ // thermal_sensors_widget_zoneWarningTempThreshold, thermal_sensors_widget_zoneCriticalTempThreshold
+ // thermal_sensors_widget_pulsateWarning, thermal_sensors_widget_pulsateCritical
+
+ //set graph color and pulsate parameters
+ if (sensorName.indexOf("cpu") > -1) { //check CPU Threshold config settings
+
+ warningTempThresholdPosition = thermal_sensors_widget_coreWarningTempThreshold;
+ criticalTempThresholdPosition = thermal_sensors_widget_coreCriticalTempThreshold;
+
+ if (thermalSensorValue < thermal_sensors_widget_coreWarningTempThreshold) {
+ barBgColor = normalColor;
+ barBgColorShadowTop = normalColorShadowTop;
+ barBgColorShadowBottom = normalColorShadowBottom;
+ pulsateTimes = 0;
+ pulsateDuration = 0;
+ } else if (thermalSensorValue >= thermal_sensors_widget_coreWarningTempThreshold && thermalSensorValue < thermal_sensors_widget_coreCriticalTempThreshold) {
+ barBgColor = warningColor;
+ barBgColorShadowTop = warningColor;
+ barBgColorShadowBottom = warningColorShadowBottom;
+ pulsateTimes = thermal_sensors_widget_pulsateWarning ? 4 : 0;
+ pulsateDuration = thermal_sensors_widget_pulsateWarning ? 900 : 0;
+ } else { // thermalSensorValue > thermal_sensors_widget_coreCriticalTempThreshold
+ barBgColor = criticalColor;
+ barBgColorShadowTop = criticalColor;
+ barBgColorShadowBottom = criticalColorShadowBottom;
+ pulsateTimes = thermal_sensors_widget_pulsateCritical ? 7 : 0;
+ pulsateDuration = thermal_sensors_widget_pulsateCritical ? 900 : 0;
+ }
+ } else { //assuming sensor is for a zone, check Zone Threshold config settings
+
+ warningTempThresholdPosition = thermal_sensors_widget_zoneWarningTempThreshold;
+ criticalTempThresholdPosition = thermal_sensors_widget_zoneCriticalTempThreshold;
+
+ if (thermalSensorValue < thermal_sensors_widget_zoneWarningTempThreshold) {
+
+ barBgColor = normalColor;
+ barBgColorShadowTop = normalColorShadowTop;
+ barBgColorShadowBottom = normalColorShadowBottom;
+ pulsateTimes = 0;
+ pulsateDuration = 0;
+
+ } else if (thermalSensorValue >= thermal_sensors_widget_zoneWarningTempThreshold &&
+ thermalSensorValue < thermal_sensors_widget_zoneCriticalTempThreshold) {
+
+ barBgColor = warningColor;
+ barBgColorShadowTop = warningColor;
+ barBgColorShadowBottom = warningColorShadowBottom;
+ pulsateTimes = thermal_sensors_widget_pulsateWarning ? 4 : 0;
+ pulsateDuration = thermal_sensors_widget_pulsateWarning ? 900 : 0;
+
+ } else { // thermalSensorValue > thermal_sensors_widget_zoneCriticalTempThreshold
+
+ barBgColor = criticalColor;
+ barBgColorShadowTop = criticalColor;
+ barBgColorShadowBottom = criticalColorShadowBottom;
+ pulsateTimes = thermal_sensors_widget_pulsateCritical ? 7 : 0;
+ pulsateDuration = thermal_sensors_widget_pulsateCritical ? 900 : 0;
+ }
+ }
+
+ //NOTE: variable thermal_sensors_widget_showFullSensorName is declared/set in "thermal_sensors.widget.php"
+ if (!thermal_sensors_widget_showFullSensorName) {
+ sensorName = getSensorFriendlyName(sensorName);
+ }
+
+ //build temperature item/row for a sensor
+ //NOTE: additional styles are set in 'thermal_sensors.widget.php'
+ var thermalSensorRow = "<div class='thermalSensorRow' id='thermalSensorRow" + i + "' >" +
+ //sensor name and temperature value
+ " <div class='thermalSensorTextShell'><div class='thermalSensorText' id='thermalSensorText" + i + "'>" + sensorName + ": </div><div class='thermalSensorValue' id='thermalSensorValue" + i + "'>" + thermalSensorValue + " &deg;C</div></div>" +
+ //temperature bar
+ " <div class='thermalSensorBarShell' id='thermalSensorBarShell" + i + "' >" +
+ " <div class='thermalSensorBar' id='thermalSensorBar" + i + "' style='background-color: " + barBgColor + "; border-top-color: " + barBgColorShadowTop + "; border-bottom-color: " + barBgColorShadowBottom + "; width:" + thermalSensorValue + "%;' ></div>" +
+ //threshold targets (warning and critical)
+ " <div class='thermalSensorWarnThresh' id='thermalSensorWarnThresh" + i + "' style='left:" + warningTempThresholdPosition + "%;' ></div>" +
+ " <div class='thermalSensorCritThresh' id='thermalSensorCritThresh" + i + "' style='left:" + criticalTempThresholdPosition + "%;' ></div>" +
+ //temperature scale (max 100 C)
+ " <div class='thermal_sensors_widget_scale000'></div>" +
+ " <div class='thermal_sensors_widget_scale010'></div>" +
+ " <div class='thermal_sensors_widget_scale020'></div>" +
+ " <div class='thermal_sensors_widget_scale030'></div>" +
+ " <div class='thermal_sensors_widget_scale040'></div>" +
+ " <div class='thermal_sensors_widget_scale050'></div>" +
+ " <div class='thermal_sensors_widget_scale060'></div>" +
+ " <div class='thermal_sensors_widget_scale070'></div>" +
+ " <div class='thermal_sensors_widget_scale080'></div>" +
+ " <div class='thermal_sensors_widget_scale090'></div>" +
+ " <div class='thermal_sensors_widget_scale100'></div>" +
+ " <div class='thermal_sensors_widget_mark100'>100&deg;</div>" +
+ " </div>" +
+ "</div>";
+
+ //collect parameters for warning/critical items we need to pulsate
+ if (pulsateTimes > 0) {
+ var params = i + "|" + barBgColor + "|" + pulsateTimes + "|" + pulsateDuration;
+ itemsToPulsate.push(params);
+ }
+
+ //append HTML item
+ thermalSensorsHTMLContent = thermalSensorsHTMLContent + thermalSensorRow;
+ }
+
+ //load generated graph into thermalSensorsContainer (DIV defined in "thermal_sensors.widget.php")
+ loadThermalSensorsContainer(thermalSensorsHTMLContent);
+
+ if (itemsToPulsate.length > 0) {
+ //pulsate/flash warning/critical items we collected
+ pulsateThermalSensorsItems(itemsToPulsate);
+ }
+}
+
+function pulsateThermalSensorsItems(itemsToPulsate) {
+
+ //pulsate/flash warning/critical items we collected
+ for (var i = 0; i < itemsToPulsate.length; i++) {
+
+ var pulsateParams = itemsToPulsate[i].split("|");
+ var rowNum = parseInt(pulsateParams[0]);
+ //var textColor = pulsateParams[1];
+ var pulsateTimes = parseInt(pulsateParams[2]);
+ var pulsateDuration = parseInt(pulsateParams[3]);
+
+ //pulsate temp Value
+ var divThermalSensorValue = jQuery("#thermalSensorValue" + rowNum); //get temp value by id
+ divThermalSensorValue.effect("pulsate", {
+ times: pulsateTimes,
+ easing: 'linear' //'easeInExpo'
+ }, pulsateDuration);
+ ////set Temp Value color
+ //divThermalSensorValue.css({ color: textColor });
+
+ //pulsate temp Bar
+ var divThermalSensorBar = jQuery("#thermalSensorBar" + rowNum); //get temp bar by id
+ divThermalSensorBar.effect("pulsate", {
+ times: pulsateTimes,
+ easing: 'linear' //'easeInExpo'
+ }, pulsateDuration);
+
+ }
+}
+
+function getSensorFriendlyName(sensorFullName) {
+ var rzone = /^hw\.acpi\.thermal\.tz([0-9]+)\.temperature$/;
+ var rcore = /^dev\.cpu\.([0-9]+)\.temperature$/;
+
+ if (rzone.test(sensorFullName)) {
+ return "Zone " + rzone.exec(sensorFullName)[1];
+ }
+
+ if (rcore.test(sensorFullName)) {
+ return "Core " + rcore.exec(sensorFullName)[1];
+ }
+
+ return sensorFullName;
+}
+
+function getThermalSensorValue(stringValue) {
+ return (+parseFloat(stringValue) || 0).toFixed(1);
+}
diff --git a/src/usr/local/www/widgets/javascript/traffic_graph.js b/src/usr/local/www/widgets/javascript/traffic_graph.js
new file mode 100644
index 0000000..383a549
--- /dev/null
+++ b/src/usr/local/www/widgets/javascript/traffic_graph.js
@@ -0,0 +1,41 @@
+function trafficshowDiv(incDiv,ifDescription,refreshIntervalSec,swapButtons) {
+ // put the graph object HTML in the element and make it appear
+ selectedDiv = incDiv + "graphdiv";
+ jQuery('#' + selectedDiv).html(
+ '<object data="graph.php?ifnum=' + incDiv + '&amp;ifname=' + ifDescription + '&amp;timeint=' + refreshIntervalSec + '&amp;initdelay=0" height="100%" width="100%">' +
+ '<param name="id" value="graph" />' +
+ '<param name="type" value="image/svg+xml" />' +
+ '<param name="pluginspage" value="http://www.adobe.com/svg/viewer/install/auto" />' +
+ '</object>');
+ jQuery('#' + selectedDiv).effect('blind',{mode:'show'},1000);
+ d = document;
+ if (swapButtons) {
+ selectIntLink = selectedDiv + "-min";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+
+ selectIntLink = selectedDiv + "-open";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "none";
+ }
+ document.traffic_graphs_widget_iform["shown[" + incDiv + "]"].value = "show";
+}
+
+function trafficminimizeDiv(incDiv,swapButtons) {
+ // remove the graph object HTML from the element (so it does not keep using CPU) and fade
+ selectedDiv = incDiv + "graphdiv";
+ jQuery('#' + selectedDiv).html('');
+ jQuery('#' + selectedDiv).effect('blind',{mode:'hide'},1000);
+ d = document;
+ if (swapButtons) {
+ selectIntLink = selectedDiv + "-open";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+
+ selectIntLink = selectedDiv + "-min";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "none";
+ }
+ document.traffic_graphs_widget_iform["shown[" + incDiv + "]"].value = "hide";
+}
+
diff --git a/src/usr/local/www/widgets/widgets/captive_portal_status.widget.php b/src/usr/local/www/widgets/widgets/captive_portal_status.widget.php
new file mode 100644
index 0000000..21c44e3
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/captive_portal_status.widget.php
@@ -0,0 +1,146 @@
+<?php
+/*
+ captive_portal_status.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Copyright (C) 2007 Sam Wenham
+ All rights reserved.
+
+ status_captiveportal.php
+ part of m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("globals.inc");
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+require_once("captiveportal.inc");
+
+?>
+
+<?php
+
+if (!is_array($config['captiveportal'])) {
+ $config['captiveportal'] = array();
+}
+$a_cp =& $config['captiveportal'];
+
+$cpzone = $_GET['zone'];
+if (isset($_POST['zone'])) {
+ $cpzone = $_POST['zone'];
+}
+
+if (isset($cpzone) && !empty($cpzone) && isset($a_cp[$cpzone]['zoneid'])) {
+ $cpzoneid = $a_cp[$cpzone]['zoneid'];
+}
+
+if (($_GET['act'] == "del") && !empty($cpzone) && isset($cpzoneid)) {
+ captiveportal_disconnect_client($_GET['id']);
+}
+unset($cpzone);
+
+flush();
+
+function clientcmp($a, $b) {
+ global $order;
+ return strcmp($a[$order], $b[$order]);
+}
+
+$cpdb_all = array();
+
+$showact = isset($_GET['showact']) ? 1 : 0;
+
+foreach ($a_cp as $cpzone => $cp) {
+ $cpdb = captiveportal_read_db();
+ foreach ($cpdb as $cpent) {
+ $cpent[10] = $cpzone;
+ if ($showact == 1) {
+ $cpent[11] = captiveportal_get_last_activity($cpent[2], $cpentry[3]);
+ }
+ $cpdb_all[] = $cpent;
+ }
+}
+
+if ($_GET['order']) {
+ if ($_GET['order'] == "ip") {
+ $order = 2;
+ } else if ($_GET['order'] == "mac") {
+ $order = 3;
+ } else if ($_GET['order'] == "user") {
+ $order = 4;
+ } else if ($_GET['order'] == "lastact") {
+ $order = 5;
+ } else if ($_GET['order'] == "zone") {
+ $order = 10;
+ } else {
+ $order = 0;
+ }
+ usort($cpdb_all, "clientcmp");
+}
+?>
+<table class="sortable" id="sortabletable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="captive portal status">
+ <tr>
+ <td class="listhdrr"><a href="?order=ip&amp;showact=<?=$showact;?>">IP address</a></td>
+ <td class="listhdrr"><a href="?order=mac&amp;showact=<?=$showact;?>">MAC address</a></td>
+ <td class="listhdrr"><a href="?order=user&amp;showact=<?=$showact;?>"><?=gettext("Username");?></a></td>
+<?php
+ if ($showact == 1):
+?>
+ <td class="listhdrr"><a href="?order=start&amp;showact=<?=$showact;?>"><?=gettext("Session start");?></a></td>
+ <td class="listhdrr"><a href="?order=start&amp;showact=<?=$showact;?>"><?=gettext("Last activity");?></a></td>
+<?php
+ endif;
+?>
+ </tr>
+<?php
+foreach ($cpdb_all as $cpent):
+?>
+ <tr>
+ <td class="listlr"><?=$cpent[2];?></td>
+ <td class="listr"><?=$cpent[3];?>&nbsp;</td>
+ <td class="listr"><?=$cpent[4];?>&nbsp;</td>
+<?php
+ if ($showact == 1):
+?>
+ <td class="listr"><?=htmlspecialchars(date("m/d/Y H:i:s", $cpent[0]));?></td>
+ <td class="listr"><?php if ($cpent[11] && ($cpent[11] > 0)) echo htmlspecialchars(date("m/d/Y H:i:s", $cpent[11]));?></td>
+<?php
+ endif;
+?>
+ <td valign="middle" class="list nowrap">
+ <a href="?order=<?=htmlspecialchars($_GET['order']);?>&amp;showact=<?=$showact;?>&amp;act=del&amp;zone=<?=$cpent[10];?>&amp;id=<?=$cpent[5];?>" onclick="return confirm('Do you really want to disconnect this client?')">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="x" />
+ </a>
+ </td>
+ </tr>
+<?php
+endforeach;
+?>
+</table>
diff --git a/src/usr/local/www/widgets/widgets/carp_status.widget.php b/src/usr/local/www/widgets/widgets/carp_status.widget.php
new file mode 100644
index 0000000..bb68dbd
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/carp_status.widget.php
@@ -0,0 +1,85 @@
+<?php
+/*
+ $Id$
+ carp_status.widget.php
+ Copyright (C) 2007 Sam Wenham
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+require_once("/usr/local/www/widgets/include/carp_status.inc");
+
+$carp_enabled = get_carp_status();
+
+?>
+<table bgcolor="#990000" width="100%" border="0" cellspacing="0" cellpadding="0" summary="carp status">
+<?php
+ if (is_array($config['virtualip']['vip'])) {
+ $carpint=0;
+ foreach ($config['virtualip']['vip'] as $carp) {
+ if ($carp['mode'] != "carp") {
+ continue;
+ }
+ $ipaddress = $carp['subnet'];
+ $password = $carp['password'];
+ $netmask = $carp['subnet_bits'];
+ $vhid = $carp['vhid'];
+ $advskew = $carp['advskew'];
+ $status = get_carp_interface_status("_vip{$carp['uniqid']}");
+?>
+<tr>
+ <td class="vncellt" width="35%">
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_cablenic.gif" alt="cablenic" />&nbsp;
+ <strong><a href="/system_hasync.php">
+ <span style="color:#000000"><?=htmlspecialchars(convert_friendly_interface_to_friendly_descr($carp['interface']) . "@{$vhid}");?></span></a></strong>
+ </td>
+ <td width="65%" class="listr">
+<?php
+ if ($carp_enabled == false) {
+ $status = "DISABLED";
+ echo "<img src='/themes/".$g['theme']."/images/icons/icon_block.gif' title=\"$status\" alt=\"$status\" />";
+ } else {
+ if($status == "MASTER") {
+ echo "<img src='/themes/".$g['theme']."/images/icons/icon_pass.gif' title=\"$status\" alt=\"$status\" />";
+ } else if($status == "BACKUP") {
+ echo "<img src='/themes/".$g['theme']."/images/icons/icon_pass_d.gif' title=\"$status\" alt=\"$status\" />";
+ } else if($status == "INIT") {
+ echo "<img src='/themes/".$g['theme']."/images/icons/icon_log.gif' title=\"$status\" alt=\"$status\" />";
+ }
+ }
+ if ($ipaddress){ ?> &nbsp;
+ <?=htmlspecialchars($status);?> &nbsp;
+ <?=htmlspecialchars($ipaddress);}?>
+</td></tr><?php }
+ } else { ?>
+ <tr><td class="listr">No CARP Interfaces Defined. Click <a href="carp_status.php">here</a> to configure CARP.</td></tr>
+<?php } ?>
+</table>
diff --git a/src/usr/local/www/widgets/widgets/deactivated/cpu_graphs.widget.php b/src/usr/local/www/widgets/widgets/deactivated/cpu_graphs.widget.php
new file mode 100644
index 0000000..09723d7
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/deactivated/cpu_graphs.widget.php
@@ -0,0 +1,76 @@
+<?php
+/*
+ $Id$
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Copyright 2007 Scott Dale
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+?>
+<link href="/themes/<?=$g['theme'];?>/graphlink.css" rel="stylesheet" type="text/css" />
+<script src="/widgets/javascript/cpu_graphs.js" type="text/javascript"></script>
+<script type="text/javascript">
+ /* initialize the graph */
+ // --- Global Data --- //
+ var graphs; // An array that stores all created graphs
+ var graph_dir; // The direction in which each graph moves
+ var last_val; // An array of values for each graph
+ var last_val_span; // References to Last Value span tags for each graph
+ var pause; // Controls execution
+
+ var ajaxStarted = false;
+
+ /**
+ * Launches the GraphLink demo. It initializes the graph along with the ajax
+ * engine and starts the main execution loop.
+ */
+ graph = new Array();
+ graph_dir = new Array();
+ last_val = new Array();
+ last_val_span = new Array();
+</script>
+<div style='display: block; margin-left: auto; margin-right: auto' class="GraphLink" id="GraphOutput"></div>
+<script type="text/javascript">
+
+ // Graph 1
+ graph[0] = GraphInitialize('GraphOutput', 200, 50, 4);
+ graph_dir[0] = GL_END;
+ last_val[0] = Math.floor(Math.random() * 50);
+ last_val_span[0] = document.getElementById('LastValue0');
+
+ GraphSetVMax(graph[0], 100);
+ GraphDynamicScale(graph[0]);
+
+</script>
diff --git a/src/usr/local/www/widgets/widgets/dyn_dns_status.widget.php b/src/usr/local/www/widgets/widgets/dyn_dns_status.widget.php
new file mode 100644
index 0000000..c2eee76
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/dyn_dns_status.widget.php
@@ -0,0 +1,174 @@
+<?php
+/*
+ Original status page code from: services_dyndns.php
+ Copyright (C) 2008 Ermal Luçi
+ Edits to convert it to a widget: dyn_dns_status.widget.php
+ Copyright (C) 2013 Stanley P. Miller \ stan-qaz
+ All rights reserved.
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ pfSense_BUILDER_BINARIES: /usr/bin/host
+ pfSense_MODULE: dyndns
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+require_once("/usr/local/www/widgets/include/dyn_dns_status.inc");
+
+if (!is_array($config['dyndnses']['dyndns'])) {
+ $config['dyndnses']['dyndns'] = array();
+}
+
+$a_dyndns = &$config['dyndnses']['dyndns'];
+
+if ($_REQUEST['getdyndnsstatus']) {
+ $first_entry = true;
+ foreach ($a_dyndns as $dyndns) {
+ if ($first_entry) {
+ $first_entry = false;
+ } else {
+ // Put a vertical bar delimiter between the echoed HTML for each entry processed.
+ echo "|";
+ }
+
+ $filename = "{$g['conf_path']}/dyndns_{$dyndns['interface']}{$dyndns['type']}" . escapeshellarg($dyndns['host']) . "{$dyndns['id']}.cache";
+ if (file_exists($filename)) {
+ $ipaddr = dyndnsCheckIP($dyndns['interface']);
+ $cached_ip_s = explode(':', file_get_contents($filename));
+ $cached_ip = $cached_ip_s[0];
+ if ($ipaddr <> $cached_ip) {
+ echo "<font color='red'>";
+ } else {
+ echo "<font color='green'>";
+ }
+ echo htmlspecialchars($cached_ip);
+ echo "</font>";
+ } else {
+ echo "N/A " . date("H:i:s");
+ }
+ }
+ exit;
+}
+
+?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="5%" class="listhdrr"><?=gettext("Int.");?></td>
+ <td width="15%" class="listhdrr"><?=gettext("Service");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Hostname");?></td>
+ <td width="20%" class="listhdrr"><?=gettext("Cached IP");?></td>
+ </tr>
+ <?php $i = 0; foreach ($a_dyndns as $dyndns): ?>
+ <tr ondblclick="document.location='services_dyndns_edit.php?id=<?=$i;?>'">
+ <td class="listlr">
+ <?php $iflist = get_configured_interface_with_descr();
+ foreach ($iflist as $if => $ifdesc) {
+ if ($dyndns['interface'] == $if) {
+ if (!isset($dyndns['enable'])) {
+ echo "<span class=\"gray\">{$ifdesc}</span>";
+ } else {
+ echo "{$ifdesc}";
+ }
+ break;
+ }
+ }
+ $groupslist = return_gateway_groups_array();
+ foreach ($groupslist as $if => $group) {
+ if ($dyndns['interface'] == $if) {
+ if (!isset($dyndns['enable'])) {
+ echo "<span class=\"gray\">{$if}</span>";
+ } else {
+ echo "{$if}";
+ }
+ break;
+ }
+ }
+ ?>
+ </td>
+ <td class="listr">
+ <?php
+ $types = explode(",", DYNDNS_PROVIDER_DESCRIPTIONS);
+ $vals = explode(" ", DYNDNS_PROVIDER_VALUES);
+ for ($j = 0; $j < count($vals); $j++) {
+ if ($vals[$j] == $dyndns['type']) {
+ if (!isset($dyndns['enable'])) {
+ echo "<span class=\"gray\">".htmlspecialchars($types[$j])."</span>";
+ } else {
+ echo htmlspecialchars($types[$j]);
+ }
+ break;
+ }
+ }
+ ?>
+ </td>
+ <td class="listr">
+ <?php
+ if (!isset($dyndns['enable'])) {
+ echo "<span class=\"gray\">".htmlspecialchars($dyndns['host'])."</span>";
+ } else {
+ echo htmlspecialchars($dyndns['host']);
+ }
+ ?>
+ </td>
+ <td class="listr">
+ <div id='dyndnsstatus<?php echo $i; ?>'><?php echo gettext("Checking ..."); ?></div>
+ </td>
+ </tr>
+ <?php $i++; endforeach; ?>
+</table>
+<script type="text/javascript">
+//<![CDATA[
+ function dyndns_getstatus() {
+ scroll(0,0);
+ var url = "/widgets/widgets/dyn_dns_status.widget.php";
+ var pars = 'getdyndnsstatus=yes';
+ jQuery.ajax(
+ url,
+ {
+ type: 'get',
+ data: pars,
+ complete: dyndnscallback
+ });
+ // Refresh the status every 5 minutes
+ setTimeout('dyndns_getstatus()', 5*60*1000);
+ }
+ function dyndnscallback(transport) {
+ // The server returns a string of statuses separated by vertical bars
+ var responseStrings = transport.responseText.split("|");
+ for (var count=0; count<responseStrings.length; count++) {
+ var divlabel = '#dyndnsstatus' + count;
+ jQuery(divlabel).prop('innerHTML',responseStrings[count]);
+ }
+ }
+ // Do the first status check 2 seconds after the dashboard opens
+ setTimeout('dyndns_getstatus()', 2000);
+//]]>
+</script>
diff --git a/src/usr/local/www/widgets/widgets/gateways.widget.php b/src/usr/local/www/widgets/widgets/gateways.widget.php
new file mode 100644
index 0000000..26a6f4d
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/gateways.widget.php
@@ -0,0 +1,227 @@
+<?php
+/*
+ gateways.widget.php
+ Copyright 2008 Seth Mos
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+require_once("/usr/local/www/widgets/include/gateways.inc");
+
+if ($_POST) {
+ if (!is_array($config["widgets"]["gateways_widget"])) {
+ $config["widgets"]["gateways_widget"] = array();
+ }
+ if (isset($_POST["display_type"])) {
+ $config["widgets"]["gateways_widget"]["display_type"] = $_POST["display_type"];
+ }
+ write_config("Updated gateways widget settings via dashboard.");
+ header("Location: /");
+ exit(0);
+}
+
+if (isset($config["widgets"]["gateways_widget"]["display_type"])) {
+ $display_type = $config["widgets"]["gateways_widget"]["display_type"];
+} else {
+ $display_type = "gw_ip";
+}
+
+$a_gateways = return_gateways_array();
+$gateways_status = array();
+$gateways_status = return_gateways_status(true);
+
+$counter = 1;
+
+?>
+
+<input type="hidden" id="gateways-config" name="gateways-config" value="" />
+
+<div id="gateways-settings" class="widgetconfigdiv" style="display:none;">
+<form action="/widgets/widgets/gateways.widget.php" method="post" name="gateways_widget_iform" id="gateways_widget_iform">
+ Display:
+ <?php
+ $display_type_gw_ip="checked=\"checked\"";
+ $display_type_monitor_ip="";
+ $display_type_both_ip="";
+ if (isset($config["widgets"]["gateways_widget"]["display_type"])) {
+ $selected_radio = $config["widgets"]["gateways_widget"]["display_type"];
+ if ($selected_radio == "gw_ip") {
+ $display_type_gw_ip = "checked=\"checked\"";
+ $display_type_monitor_ip="";
+ $display_type_both_ip="";
+ } else if ($selected_radio == "monitor_ip") {
+ $display_type_gw_ip = "";
+ $display_type_monitor_ip="checked=\"checked\"";
+ $display_type_both_ip="";
+ } else if ($selected_radio == "both_ip") {
+ $display_type_gw_ip = "";
+ $display_type_monitor_ip="";
+ $display_type_both_ip="checked=\"checked\"";
+ }
+ }
+ ?>
+ <input name="display_type" class="radio" type="radio" id="display_type_gw_ip" value="gw_ip" <?php echo $display_type_gw_ip; ?> onchange="updateGatewayDisplays();" /> <span>Gateway IP</span>
+ <input name="display_type" class="radio" type="radio" id="display_type_monitor_ip" value="monitor_ip" <?php echo $display_type_monitor_ip; ?> onchange="updateGatewayDisplays();" /> <span>Monitor IP</span>
+ <input name="display_type" class="radio" type="radio" id="display_type_both_ip" value="both_ip" <?php echo $display_type_both_ip; ?> onchange="updateGatewayDisplays();" /> <span>Both</span>
+ <br /><br />
+ <input id="submit_settings" name="submit_settings" type="submit" onclick="return updatePref();" class="formbtn" value="Save Settings" />
+</form>
+</div>
+
+<script type="text/javascript">
+//<![CDATA[
+ d = document;
+ selectIntLink = "gateways-configure";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+//]]>
+</script>
+
+<table bgcolor="#990000" width="100%" border="0" cellspacing="0" cellpadding="0" summary="gateway status">
+ <tr>
+ <td class="listhdrr" id="gatewayname" align="center">Name</td>
+ <td class="listhdrr" align="center">RTT</td>
+ <td class="listhdrr" align="center">Loss</td>
+ <td class="listhdrr" align="center">Status</td>
+ </tr>
+ <?php foreach ($a_gateways as $gname => $gateway) { ?>
+ <tr>
+ <td class="listhdrr" id="gateway<?php echo $counter; ?>" rowspan="2" align="center">
+ <strong>
+ <?php echo htmlspecialchars($gateway['name']); ?>
+ </strong>
+ <?php $counter++; ?>
+ </td>
+ <td colspan="3" class="listr ellipsis" align="center">
+ <div id="gateway<?php echo $counter; ?>" style="display:inline"><b>
+ <?php
+ $monitor_address = "";
+ $monitor_address_disp = "";
+ if ($display_type == "monitor_ip" || $display_type == "both_ip") {
+ $monitor_address = $gateway['monitor'];
+ if ($monitor_address != "" && $display_type == "both_ip") {
+ $monitor_address_disp = " (" . $monitor_address . ")";
+ } else {
+ $monitor_address_disp = $monitor_address;
+ }
+ }
+ $if_gw = '';
+ // If the user asked to display Gateway IP or both IPs, or asked for just monitor IP but the monitor IP is blank
+ // then find the gateway IP (which is also the monitor IP if the monitor IP was not explicitly set).
+ if ($display_type == "gw_ip" || $display_type == "both_ip" || ($display_type == "monitor_ip" && $monitor_address == "")) {
+ if (is_ipaddr($gateway['gateway'])) {
+ $if_gw = htmlspecialchars($gateway['gateway']);
+ } else {
+ if ($gateway['ipprotocol'] == "inet") {
+ $if_gw = htmlspecialchars(get_interface_gateway($gateway['friendlyiface']));
+ }
+ if ($gateway['ipprotocol'] == "inet6") {
+ $if_gw = htmlspecialchars(get_interface_gateway_v6($gateway['friendlyiface']));
+ }
+ }
+ if ($if_gw == "") {
+ $if_gw = "~";
+ }
+ }
+ if ($monitor_address == $if_gw) {
+ $monitor_address_disp = "";
+ }
+ echo $if_gw . $monitor_address_disp;
+ unset ($if_gw);
+ unset ($monitor_address);
+ unset ($monitor_address_disp);
+ $counter++;
+ ?>
+ </b></div>
+ </td>
+ </tr>
+ <tr>
+ <td class="listr ellipsis" align="center" id="gateway<?php echo $counter; ?>">
+ <?php
+ if ($gateways_status[$gname]) {
+ echo htmlspecialchars($gateways_status[$gname]['delay']);
+ } else {
+ echo gettext("Pending");
+ }
+ ?>
+ <?php $counter++; ?>
+ </td>
+ <td class="listr ellipsis" align="center" id="gateway<?php echo $counter; ?>">
+ <?php
+ if ($gateways_status[$gname]) {
+ echo htmlspecialchars($gateways_status[$gname]['loss']);
+ } else {
+ echo gettext("Pending");
+ }
+ ?>
+ <?php $counter++; ?>
+ </td>
+ <?php
+ if ($gateways_status[$gname]) {
+ if (stristr($gateways_status[$gname]['status'], "force_down")) {
+ $online = "Offline (forced)";
+ $bgcolor = "#F08080"; // lightcoral
+ } elseif (stristr($gateways_status[$gname]['status'], "down")) {
+ $online = "Offline";
+ $bgcolor = "#F08080"; // lightcoral
+ } elseif (stristr($gateways_status[$gname]['status'], "loss")) {
+ $online = "Packetloss";
+ $bgcolor = "#F0E68C"; // khaki
+ } elseif (stristr($gateways_status[$gname]['status'], "delay")) {
+ $online = "Latency";
+ $bgcolor = "#F0E68C"; // khaki
+ } elseif ($gateways_status[$gname]['status'] == "none") {
+ $online = "Online";
+ $bgcolor = "#90EE90"; // lightgreen
+ } elseif ($gateways_status[$gname]['status'] == "") {
+ $online = "Pending";
+ $bgcolor = "#D3D3D3"; // lightgray
+ }
+ } else {
+ $online = gettext("Unknown");
+ $bgcolor = "#ADD8E6"; // lightblue
+ }
+ echo "<td class=\"listr ellipsis\" align=\"center\" id=\"gateway$counter\">$online</td>\n";
+ ?>
+ <td style="display:none;">
+ <script type="text/javascript">
+ //<![CDATA[
+ jQuery('#gateway<?php echo $counter;?>').css('background-color',"<?php echo $bgcolor;?>");
+ //]]>
+ </script>
+ </td>
+ <?php
+ $counter++;
+ ?>
+ </tr>
+ <?php } // foreach ?>
+</table>
diff --git a/src/usr/local/www/widgets/widgets/gmirror_status.widget.php b/src/usr/local/www/widgets/widgets/gmirror_status.widget.php
new file mode 100644
index 0000000..59e7f16
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/gmirror_status.widget.php
@@ -0,0 +1,52 @@
+<?php
+/*
+ gmirror_status.widget.php
+ Copyright (C) 2009-2010 Jim Pingle
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("gmirror.inc");
+
+if ($_GET['textonly'] == "true") {
+ header("Cache-Control: no-cache");
+ echo gmirror_html_status();
+ exit;
+}
+?>
+<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="gmirror status">
+ <tbody id="gmirror_status_table">
+ <?php echo gmirror_html_status(); ?>
+ </tbody>
+</table>
+
+<script type="text/javascript">
+//<![CDATA[
+ var gmirrorupdater = new Ajax.PeriodicalUpdater('gmirror_status_table', '/widgets/widgets/gmirror_status.widget.php?textonly=true',
+ { method: 'get', frequency: 5 } );
+//]]>
+</script>
diff --git a/src/usr/local/www/widgets/widgets/installed_packages.widget.php b/src/usr/local/www/widgets/widgets/installed_packages.widget.php
new file mode 100644
index 0000000..3190e1b
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/installed_packages.widget.php
@@ -0,0 +1,126 @@
+<?php
+/*
+ installed_packages.widget.php
+
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright 2007 Scott Dale
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+require_once("/usr/local/www/widgets/include/installed_packages.inc");
+require_once("pkg-utils.inc");
+
+if (is_array($config['installedpackages']['package'])) {
+ foreach ($config['installedpackages']['package'] as $instpkg) {
+ $tocheck[] = $instpkg['name'];
+ }
+ $currentvers = get_pkg_info($tocheck, array('version', 'xmlver'));
+}
+
+$updateavailable = false;
+?>
+
+<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="installed packages">
+ <tr>
+ <td width="15%" class="listhdrr">Package Name</td>
+ <td width="15%" class="listhdrr">Category</td>
+ <td width="30%" class="listhdrr">Package Version</td>
+ </tr>
+ <?php
+ if ($config['installedpackages']['package'] != "") {
+ $instpkgs = array();
+ foreach ($config['installedpackages']['package'] as $instpkg) {
+ $instpkgs[] = $instpkg['name'];
+ }
+ natcasesort($instpkgs);
+ $y=1;
+ foreach ($instpkgs as $index => $pkgname){
+
+ $pkg = $config['installedpackages']['package'][$index];
+ if ($pkg['name'] <> "") { ?>
+ <tr valign="top">
+ <td class="listlr">
+ <?= $pkg['name'] ?>
+ </td>
+ <td class="listr">
+ <?= $pkg['category'] ?>
+ </td>
+ <td class="listr">
+ <?php
+ $latest_package = $currentvers[$pkg['name']]['version'];
+ if ($latest_package == false) {
+ // We can't determine this package's version status.
+ echo "Current: Unknown.<br />Installed: " . $pkg['version'];
+ } elseif (strcmp($pkg['version'], $latest_package) > 0) {
+ /* we're running a newer version of the package */
+ echo "Current: {$latest_package}";
+ echo "<br />Installed: {$pkg['version']}";
+ } elseif (strcmp($pkg['version'], $latest_package) < 0) {
+ /* our package is out of date */
+ $updateavailable = true;
+ ?>
+ <div id="updatediv-<?php echo $y; ?>" style="color:red">
+ <b>Update Available!</b></div><div style="float:left">
+ Current: <?php echo $latest_package; ?><br />
+ Installed: <?php echo $pkg['version']; ?></div><div style="float:right">
+ <a href="pkg_mgr_install.php?mode=reinstallpkg&amp;pkg=<?= $pkg['name']; ?>"><img title="Update this package." src="./themes/<?= $g['theme']; ?>/images/icons/icon_reinstall_pkg.gif" width="17" height="17" border="0" alt="reinstall" /></a>
+ </div>
+ <?php
+ $y++;
+ } else {
+ echo $pkg['version'];
+ } ?>
+ </td>
+ </tr>
+ <?php }
+ }
+ } else {
+ echo "<tr><td colspan=\"5\" align=\"center\">There are no packages currently installed.</td></tr>";
+ }
+ ?>
+</table>
+
+<?php if ($updateavailable): ?>
+<script type="text/javascript">
+//<![CDATA[
+ window.onload = function(in_event)
+ {
+ for (y=1; y<=<?php echo $y;?>; y++) {
+ textID = "#updatediv-" + y;
+ jQuery(textID).effect('pulsate');
+ }
+ }
+//]]>
+</script>
+<?php endif; ?>
diff --git a/src/usr/local/www/widgets/widgets/interface_statistics.widget.php b/src/usr/local/www/widgets/widgets/interface_statistics.widget.php
new file mode 100644
index 0000000..a124ea3
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/interface_statistics.widget.php
@@ -0,0 +1,216 @@
+<?php
+/*
+ $Id: interface_statistics.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright 2007 Scott Dale
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+require_once("/usr/local/www/widgets/include/interface_statistics.inc");
+
+$ifdescrs = get_configured_interface_with_descr();
+
+$array_in_packets = array();
+$array_out_packets = array();
+$array_in_bytes = array();
+$array_out_bytes = array();
+$array_in_errors = array();
+$array_out_errors = array();
+$array_collisions = array();
+$array_interrupt = array();
+$interfacecounter = 0;
+
+//build data arrays
+foreach ($ifdescrs as $ifdescr => $ifname) {
+ $ifinfo = get_interface_info($ifdescr);
+ $interfacecounter++;
+ if ($ifinfo['status'] != "down") {
+ $array_in_packets[] = $ifinfo['inpkts'];
+ $array_out_packets[] = $ifinfo['outpkts'];
+ $array_in_bytes[] = format_bytes($ifinfo['inbytes']);
+ $array_out_bytes[] = format_bytes($ifinfo['outbytes']);
+ if (isset($ifinfo['inerrs'])) {
+ $array_in_errors[] = $ifinfo['inerrs'];
+ $array_out_errors[] = $ifinfo['outerrs'];
+ } else {
+ $array_in_errors[] = "n/a";
+ $array_out_errors[] = "n/a";
+ }
+ if (isset($ifinfo['collisions'])) {
+ $array_collisions[] = htmlspecialchars($ifinfo['collisions']);
+ } else {
+ $array_collisions[] = "n/a";
+ }
+ }
+} //end for
+
+
+
+
+?>
+ <div id="int_labels" style="float:left;width:32%">
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="interfaces statistics">
+ <tr>
+ <td class="widgetsubheader" style="height:25px">&nbsp;&nbsp;&nbsp;</td>
+ </tr>
+ <tr>
+ <td class="vncellt" style="height:25px">Packets In</td>
+ </tr>
+ <tr>
+ <td class="vncellt" style="height:25px">Packets Out</td>
+ </tr>
+ <tr>
+ <td class="vncellt" style="height:25px">Bytes In</td>
+ </tr>
+ <tr>
+ <td class="vncellt" style="height:25px">Bytes Out</td>
+ </tr>
+ <tr>
+ <td class="vncellt" style="height:25px">Errors In</td>
+ </tr>
+ <tr>
+ <td class="vncellt" style="height:25px">Errors Out</td>
+ </tr>
+ <tr>
+ <td class="vncellt" style="height:25px">Collisions</td>
+ </tr>
+ </table>
+ </div>
+ <div id="interfacestats" style="float:right;overflow: auto; width:68%">
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="the stats">
+ <tr>
+ <?php
+ $interface_names = array();
+ foreach ($ifdescrs as $ifdescr => $ifname):
+ $ifinfo = get_interface_info($ifdescr);
+ if ($ifinfo['status'] != "down") { ?>
+ <td class="widgetsubheader nowrap" style="height:25px">
+ <?=htmlspecialchars($ifname);?>
+ </td>
+ <?php
+ //build array of interface names
+ $interface_names[] = $ifname;
+ }
+ endforeach;
+ ?>
+ </tr>
+
+ <tr>
+ <?php
+ $counter = 1;
+ foreach ($array_in_packets as $data):
+ ?>
+ <td class="listr nowrap" id="stat<?php echo $counter?>" style="height:25px">
+ <?=htmlspecialchars($data);?>
+ </td>
+ <?php
+ $counter = $counter + 7;
+ endforeach;
+ ?>
+ </tr>
+
+ <tr>
+ <?php
+ $counter = 2;
+ foreach ($array_out_packets as $data): ?>
+ <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
+ <?=htmlspecialchars($data);?>
+ </td>
+ <?php
+ $counter = $counter + 7;
+ endforeach; ?>
+ </tr>
+
+ <tr>
+ <?php
+ $counter = 3;
+ foreach ($array_in_bytes as $data): ?>
+ <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
+ <?=htmlspecialchars($data);?>
+ </td>
+ <?php
+ $counter = $counter + 7;
+ endforeach; ?>
+ </tr>
+
+ <tr>
+ <?php
+ $counter = 4;
+ foreach ($array_out_bytes as $data): ?>
+ <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
+ <?=htmlspecialchars($data);?>
+ </td>
+ <?php
+ $counter = $counter + 7;
+ endforeach; ?>
+ </tr>
+
+ <tr>
+ <?php
+ $counter = 5;
+ foreach ($array_in_errors as $data): ?>
+ <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
+ <?=htmlspecialchars($data);?>
+ </td>
+ <?php
+ $counter = $counter + 7;
+ endforeach; ?>
+ </tr>
+
+ <tr>
+ <?php
+ $counter = 6;
+ foreach ($array_out_errors as $data): ?>
+ <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
+ <?=htmlspecialchars($data);?>
+ </td>
+ <?php
+ $counter = $counter + 7;
+ endforeach; ?>
+ </tr>
+
+ <tr>
+ <?php
+ $counter = 7;
+ foreach ($array_collisions as $data): ?>
+ <td class="listr nowrap" id="stat<?php echo $counter;?>" style="height:25px">
+ <?=htmlspecialchars($data);?>
+ </td>
+ <?php
+ $counter = $counter + 7;
+ endforeach; ?>
+ </tr>
+ </table>
+ </div>
diff --git a/src/usr/local/www/widgets/widgets/interfaces.widget.php b/src/usr/local/www/widgets/widgets/interfaces.widget.php
new file mode 100644
index 0000000..e49a030
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/interfaces.widget.php
@@ -0,0 +1,126 @@
+<?php
+/*
+ interfaces.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright 2007 Scott Dale
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+require_once("/usr/local/www/widgets/include/interfaces.inc");
+
+$ifdescrs = get_configured_interface_with_descr();
+?>
+
+<table bgcolor="#990000" width="100%" border="0" cellspacing="0" cellpadding="0" summary="interfaces">
+<?php
+foreach ($ifdescrs as $ifdescr => $ifname):
+ $ifinfo = get_interface_info($ifdescr);
+
+ if ($ifinfo['ppplink']) {
+ $icon = '3g';
+ } else if (is_interface_wireless($ifdescr)) {
+ if ($ifinfo['status'] == "associated") {
+ $icon = 'wlan';
+ } else {
+ $icon = 'wlan_d';
+ }
+ } else {
+ $icon = 'cablenic';
+ }
+
+ if ($ifinfo['status'] == "up" || $ifinfo['status'] == "associated") {
+ $known_status = true;
+ $up_display = "inline";
+ $down_display = "none";
+ $block_display = "none";
+ } elseif ($ifinfo['status'] == "no carrier") {
+ $known_status = true;
+ $up_display = "none";
+ $down_display = "inline";
+ $block_display = "none";
+ } elseif ($ifinfo['status'] == "down") {
+ $known_status = true;
+ $up_display = "none";
+ $down_display = "none";
+ $block_display = "inline";
+ } else {
+ $known_status = false;
+ }
+?>
+ <tr>
+ <td class="vncellt" rowspan="2">
+ <span onclick="location.href='/interfaces.php?if=<?=$ifdescr; ?>'" style="cursor:pointer; white-space:nowrap">
+ <img src="./themes/<?=$g['theme'];?>/images/icons/icon_<?=$icon;?>.gif" alt="<?=$icon;?>" />
+ <u><?=htmlspecialchars($ifname);?></u>
+ </span>
+<?php
+ if ($ifinfo['dhcplink']) {
+ echo "<br />(DHCP)";
+ }
+?>
+ </td>
+<?php
+ if ($known_status):
+?>
+ <td rowspan="2" class="listr" align="center">
+ <div id="<?php echo $ifname . "-up";?>" style="display:<?=$up_display;?>" >
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_interface_up.gif" title="<?=$ifname;?> is up" alt="up" />
+ </div>
+ <div id="<?php echo $ifname . "-down";?>" style="display:<?=$down_display;?>" >
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_interface_down.gif" title="<?=$ifname;?> is down" alt="down" />
+ </div>
+ <div id="<?php echo $ifname . "-block";?>" style="display:<?=$block_display;?>" >
+ <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_block.gif" title="<?=$ifname;?> is disabled" alt="block" />
+ </div>
+ </td>
+<?php
+ else:
+ echo htmlspecialchars($ifinfo['status']);
+ endif;
+?>
+ <td class="listr">
+ <div id="<?php echo $ifname;?>-media" style="display:inline"><?=htmlspecialchars($ifinfo['media']);?></div>
+ </td>
+ </tr>
+ <tr>
+ <td class="listr">
+ <div id="<?php echo $ifname;?>-ip" style="display:inline"><strong><?=htmlspecialchars($ifinfo['ipaddr']);?> </strong><?php if ($ifinfo['ipaddr']) echo "<br />";?></div>
+ <div id="<?php echo $ifname;?>-ipv6" style="display:inline"><strong><?=htmlspecialchars($ifinfo['ipaddrv6']);?> </strong></div>
+ </td>
+ </tr>
+<?php
+endforeach;
+?>
+</table>
diff --git a/src/usr/local/www/widgets/widgets/ipsec.widget.php b/src/usr/local/www/widgets/widgets/ipsec.widget.php
new file mode 100644
index 0000000..49250ce
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/ipsec.widget.php
@@ -0,0 +1,265 @@
+<?php
+/*
+ ipsec.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright 2007 Scott Dale
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("functions.inc");
+require_once("ipsec.inc");
+
+if (isset($config['ipsec']['phase1'])) {
+?>
+ <div>&nbsp;</div>
+<?php
+ $tab_array = array();
+ $tab_array[0] = array("Overview", true, "ipsec-Overview");
+ $tab_array[1] = array("Tunnels", false, "ipsec-tunnel");
+ $tab_array[2] = array("Mobile", false, "ipsec-mobile");
+ display_widget_tabs($tab_array);
+
+ $spd = ipsec_dump_spd();
+ $sad = ipsec_dump_sad();
+ $mobile = ipsec_dump_mobile();
+ $ipsec_status = ipsec_smp_dump_status();
+
+ $activecounter = 0;
+ $inactivecounter = 0;
+
+ if (!is_array($ipsec_status['query'])) {
+ $ipsec_status['query'] = array();
+ $ipsec_status['query']['ikesalist'] = array();
+ $ipsec_status['query']['ikesalist']['ikesa'] = array();
+ } else if (!is_array($ipsec_status['query']['ikesalist'])) {
+ $ipsec_status['query']['ikesalist'] = array();
+ $ipsec_status['query']['ikesalist']['ikesa'] = array();
+ } else if (!is_array($ipsec_status['query']['ikesalist']['ikesa'])) {
+ $ipsec_status['query']['ikesalist']['ikesa'] = array();
+ }
+
+ $ipsec_detail_array = array();
+ $ikenum = array();
+ if (isset($config['ipsec']['phase2'])) {
+ foreach ($config['ipsec']['phase2'] as $ph2ent) {
+ if (!ipsec_lookup_phase1($ph2ent,$ph1ent)) {
+ continue;
+ }
+
+ if ($ph2ent['remoteid']['type'] == "mobile" || isset($ph1ent['mobile'])) {
+ continue;
+ }
+ if (isset($ph1ent['disabled']) || isset($ph2ent['disabled'])) {
+ continue;
+ }
+
+ if (empty($ph1ent['iketype']) || $ph1ent['iketype'] == 'ikev1') {
+ if (!isset($ikenum[$ph1ent['ikeid']])) {
+ $ikenum[$ph1ent['ikeid']] = 0;
+ } else {
+ $ikenum[$ph1ent['ikeid']]++;
+ }
+ $ikeid = "con{$ph1ent['ikeid']}00" . $ikenum[$ph1ent['ikeid']];
+ } else {
+ if (isset($ikenum[$ph1ent['ikeid']])) {
+ continue;
+ }
+ $ikeid = "con{$ph1ent['ikeid']}";
+ $ikenum[$ph1ent['ikeid']] = true;
+ }
+
+ $found = false;
+ foreach ($ipsec_status['query']['ikesalist']['ikesa'] as $ikesa) {
+ if (isset($ikesa['childsalist']) && isset($ikesa['childsalist']['childsa'])) {
+ foreach ($ikesa['childsalist']['childsa'] as $childsa) {
+ if ($ikeid == $childsa['childconfig']) {
+ $found = true;
+ break;
+ }
+ }
+ } else if ($ikeid == $ikesa['peerconfig']) {
+ $found = true;
+ }
+
+ if ($found === true) {
+ if ($ikesa['status'] == 'established') {
+ /* tunnel is up */
+ $iconfn = "true";
+ $activecounter++;
+ } else {
+ /* tunnel is down */
+ $iconfn = "false";
+ $inactivecounter++;
+ }
+ break;
+ }
+ }
+
+ if ($found === false) {
+ /* tunnel is down */
+ $iconfn = "false";
+ $inactivecounter++;
+ }
+
+ $ipsec_detail_array[] = array('src' => convert_friendly_interface_to_friendly_descr($ph1ent['interface']),
+ 'dest' => $ph1ent['remote-gateway'],
+ 'remote-subnet' => ipsec_idinfo_to_text($ph2ent['remoteid']),
+ 'descr' => $ph2ent['descr'],
+ 'status' => $iconfn);
+ }
+ }
+ unset($ikenum);
+}
+
+if (isset($config['ipsec']['phase2'])) {
+?>
+
+<div id="ipsec-Overview" style="display:block;background-color:#EEEEEE;">
+ <div>
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0" summary="heading">
+ <tr>
+ <td class="listhdrr nowrap">Active Tunnels</td>
+ <td class="listhdrr nowrap">Inactive Tunnels</td>
+ <td class="listhdrr nowrap">Mobile Users</td>
+ </tr>
+ <tr>
+ <td class="listlr"><?php echo $activecounter; ?></td>
+ <td class="listr"><?php echo $inactivecounter; ?></td>
+ <td class="listr"><?php if (is_array($mobile['pool'])) echo htmlspecialchars($mobile['pool'][0]['usage']); else echo 0; ?></td>
+ </tr>
+ </table>
+ </div>
+</div>
+
+<div id="ipsec-tunnel" style="display:none;background-color:#EEEEEE;">
+ <div style="padding: 10px">
+ <div style="display:table-row;">
+ <div class="widgetsubheader" style="display:table-cell;width:40px">Source</div>
+ <div class="widgetsubheader" style="display:table-cell;width:100px">Destination</div>
+ <div class="widgetsubheader" style="display:table-cell;width:90px">Description</div>
+ <div class="widgetsubheader" style="display:table-cell;width:30px">Status</div>
+ </div>
+ <div style="max-height:105px;overflow:auto;">
+
+ <?php
+ foreach ($ipsec_detail_array as $ipsec) :
+ ?>
+
+ <div style="display:table-row;">
+ <div class="listlr" style="display:table-cell;width:39px">
+ <?php echo htmlspecialchars($ipsec['src']);?>
+ </div>
+ <div class="listr" style="display:table-cell;width:100px">
+ <?php echo $ipsec['remote-subnet'];?>
+ <br />
+ (<?php echo htmlspecialchars($ipsec['dest']);?>)
+ </div>
+ <div class="listr" style="display:table-cell;width:90px">
+ <?php echo htmlspecialchars($ipsec['descr']);?>
+ </div>
+ <div class="listr" style="display:table-cell;width:37px" align="center">
+ <?php
+ if ($ipsec['status'] == "true") {
+ /* tunnel is up */
+ $iconfn = "interface_up";
+ } else {
+ /* tunnel is down */
+ $iconfn = "interface_down";
+ }
+
+ echo "<img src ='/themes/{$g['theme']}/images/icons/icon_{$iconfn}.gif' alt='Tunnel status' width='11' height='11' />";
+ ?>
+ </div>
+ </div>
+ <?php
+ endforeach;
+ ?>
+ </div>
+ </div>
+</div>
+<div id="ipsec-mobile" style="display:none;background-color:#EEEEEE;">
+ <div style="padding: 10px">
+ <div style="display:table-row;">
+ <div class="widgetsubheader" style="display:table-cell;width:140px">User</div>
+ <div class="widgetsubheader" style="display:table-cell;width:130px">IP</div>
+ <div class="widgetsubheader" style="display:table-cell;width:30px">Status</div>
+ </div>
+ <div style="max-height:105px;overflow:auto;">
+<?php
+ if (is_array($mobile['pool'])):
+ foreach ($mobile['pool'] as $pool):
+ if (is_array($pool['lease'])):
+ foreach ($pool['lease'] as $muser) :
+?>
+ <div style="display:table-row;">
+ <div class="listlr" style="display:table-cell;width:139px">
+ <?php echo htmlspecialchars($muser['id']);?><br />
+ </div>
+ <div class="listr" style="display:table-cell;width:130px">
+ <?php echo htmlspecialchars($muser['host']);?><br />
+ </div>
+ <div class="listr" style="display:table-cell;width:30px">
+ <?php echo htmlspecialchars($muser['status']);?><br/>
+ </div>
+ </div>
+<?php
+ endforeach;
+ endif;
+ endforeach;
+ endif;
+?>
+ </div>
+ </div>
+</div>
+<?php // end if tunnels are configured, else show code below
+} else {
+?>
+<div style="display:block">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="note">
+ <tr>
+ <td colspan="4">
+ <span class="vexpl">
+ <span class="red">
+ <strong>
+ Note: There are no configured IPsec Tunnels<br />
+ </strong>
+ </span>
+ You can configure your IPsec <a href="vpn_ipsec.php">here</a>.
+ </span>
+ </td>
+ </tr>
+ </table>
+</div>
+<?php
+}
+?>
diff --git a/src/usr/local/www/widgets/widgets/load_balancer_status.widget.php b/src/usr/local/www/widgets/widgets/load_balancer_status.widget.php
new file mode 100644
index 0000000..f5ddda9
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/load_balancer_status.widget.php
@@ -0,0 +1,155 @@
+<?php
+/*
+ load_balancer_status.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright 2010 Jim Pingle
+ Portions copied from status_lb_pool.php, status_lb_vs.php, and vslb.inc:
+ Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
+ Copyright (C) 2005-2008 Bill Marquette
+
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+require_once("vslb.inc");
+
+$now = time();
+$year = date("Y");
+
+if (!is_array($config['load_balancer']['lbpool'])) {
+ $config['load_balancer']['lbpool'] = array();
+}
+if (!is_array($config['load_balancer']['virtual_server'])) {
+ $config['load_balancer']['virtual_server'] = array();
+}
+$a_vs = &$config['load_balancer']['virtual_server'];
+$a_pool = &$config['load_balancer']['lbpool'];
+$rdr_a = get_lb_redirects();
+$relay_hosts = get_lb_summary();
+
+$lb_logfile = "{$g['varlog_path']}/relayd.log";
+$nentries = $config['syslog']['nentries'];
+if (!$nentries) {
+ $nentries = 50;
+}
+
+?>
+
+<table bgcolor="#990000" width="100%" border="0" cellspacing="0" cellpadding="0" summary="load balancer">
+ <tr>
+ <td width="10%" class="listhdrr">Server</td>
+ <td width="10%" class="listhdrr">Pool</td>
+ <td width="30%" class="listhdr">Description</td>
+ </tr>
+<?php
+$i = 0;
+foreach ($a_vs as $vsent):
+?>
+ <tr>
+ <?php
+ switch (trim($rdr_a[$vsent['name']]['status'])) {
+ case 'active':
+ $bgcolor = "#90EE90"; // lightgreen
+ $rdr_a[$vsent['name']]['status'] = "Active";
+ break;
+ case 'down':
+ $bgcolor = "#F08080"; // lightcoral
+ $rdr_a[$vsent['name']]['status'] = "Down";
+ break;
+ default:
+ $bgcolor = "#D3D3D3"; // lightgray
+ $rdr_a[$vsent['name']]['status'] = 'Unknown - relayd not running?';
+ }
+ ?>
+ <td class="listlr">
+ <?=$vsent['name'];?><br />
+ <span style="background-color: <?=$bgcolor?>; display: block"><i><?=$rdr_a[$vsent['name']]['status']?></i></span>
+ <?=$vsent['ipaddr'].":".$vsent['port'];?><br />
+ </td>
+ <td class="listr" align="center" >
+ <table border="0" cellpadding="0" cellspacing="2" summary="status">
+ <?php
+ foreach ($a_pool as $pool) {
+ if ($pool['name'] == $vsent['poolname']) {
+ $pool_hosts=array();
+ foreach ((array) $pool['servers'] as $server) {
+ $svr['ip']['addr']=$server;
+ $svr['ip']['state']=$relay_hosts[$pool['name'].":".$pool['port']][$server]['state'];
+ $svr['ip']['avail']=$relay_hosts[$pool['name'].":".$pool['port']][$server]['avail'];
+ $pool_hosts[]=$svr;
+ }
+ foreach ((array) $pool['serversdisabled'] as $server) {
+ $svr['ip']['addr']="$server";
+ $svr['ip']['state']='disabled';
+ $svr['ip']['avail']='disabled';
+ $pool_hosts[]=$svr;
+ }
+ asort($pool_hosts);
+ foreach ((array) $pool_hosts as $server) {
+ if ($server['ip']['addr']!="") {
+ switch ($server['ip']['state']) {
+ case 'up':
+ $bgcolor = "#90EE90"; // lightgreen
+ $checked = "checked";
+ break;
+ case 'disabled':
+ $bgcolor = "#FFFFFF"; // white
+ $checked = "";
+ break;
+ default:
+ $bgcolor = "#F08080"; // lightcoral
+ $checked = "checked";
+ }
+ echo "<tr>";
+ echo "<td bgcolor=\"{$bgcolor}\">&nbsp;{$server['ip']['addr']}:{$pool['port']}&nbsp;</td><td bgcolor=\"{$bgcolor}\">&nbsp;";
+ if ($server['ip']['avail']) {
+ echo " ({$server['ip']['avail']}) ";
+ }
+ echo "&nbsp;</td></tr>";
+ }
+ }
+ }
+ }
+ ?>
+ </table>
+ </td>
+ <td class="listbg" >
+ <font color="#FFFFFF"><?=$vsent['descr'];?></font>
+ </td>
+ </tr>
+<?php
+ $i++;
+endforeach;
+?>
+</table>
diff --git a/src/usr/local/www/widgets/widgets/log.widget.php b/src/usr/local/www/widgets/widgets/log.widget.php
new file mode 100644
index 0000000..45205a4
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/log.widget.php
@@ -0,0 +1,281 @@
+<?php
+/*
+ log.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright 2007 Scott Dale
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+
+/* In an effort to reduce duplicate code, many shared functions have been moved here. */
+require_once("filter_log.inc");
+
+if (is_numeric($_POST['filterlogentries'])) {
+ $config['widgets']['filterlogentries'] = $_POST['filterlogentries'];
+
+ $acts = array();
+ if ($_POST['actpass']) {
+ $acts[] = "Pass";
+ }
+ if ($_POST['actblock']) {
+ $acts[] = "Block";
+ }
+ if ($_POST['actreject']) {
+ $acts[] = "Reject";
+ }
+
+ if (!empty($acts)) {
+ $config['widgets']['filterlogentriesacts'] = implode(" ", $acts);
+ } else {
+ unset($config['widgets']['filterlogentriesacts']);
+ }
+ unset($acts);
+
+ if (($_POST['filterlogentriesinterfaces']) and ($_POST['filterlogentriesinterfaces'] != "All")) {
+ $config['widgets']['filterlogentriesinterfaces'] = trim($_POST['filterlogentriesinterfaces']);
+ } else {
+ unset($config['widgets']['filterlogentriesinterfaces']);
+ }
+
+ write_config("Saved Filter Log Entries via Dashboard");
+ Header("Location: /");
+ exit(0);
+}
+
+$nentries = isset($config['widgets']['filterlogentries']) ? $config['widgets']['filterlogentries'] : 5;
+
+//set variables for log
+
+$nentriesacts = isset($config['widgets']['filterlogentriesacts']) ? $config['widgets']['filterlogentriesacts'] : 'All';
+$nentriesinterfaces = isset($config['widgets']['filterlogentriesinterfaces']) ? $config['widgets']['filterlogentriesinterfaces'] : 'All';
+
+$filterfieldsarray = array(
+ "act" => $nentriesacts,
+ "interface" => $nentriesinterfaces
+);
+
+$filter_logfile = "{$g['varlog_path']}/filter.log";
+$filterlog = conv_log_filter($filter_logfile, $nentries, 50, $filterfieldsarray); //Get log entries
+
+/* AJAX related routines */
+handle_ajax($nentries, $nentries + 20);
+
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+lastsawtime = '<?php echo time(); ?>';
+var lines = Array();
+var timer;
+var updateDelay = 30000;
+var isBusy = false;
+var isPaused = false;
+var nentries = <?php echo $nentries; ?>;
+
+<?php
+if (isset($config['syslog']['reverse'])) {
+ echo "var isReverse = true;\n";
+} else {
+ echo "var isReverse = false;\n";
+}
+?>
+
+/* Called by the AJAX updater */
+function format_log_line(row) {
+ var rrText = "<?php echo gettext("Reverse Resolve with DNS"); ?>";
+
+ if (row[8] == '6') {
+ srcIP = '[' + row[3] + ']';
+ dstIP = '[' + row[5] + ']';
+ } else {
+ srcIP = row[3];
+ dstIP = row[5];
+ }
+
+ if (row[4] == '') {
+ srcPort = '';
+ } else {
+ srcPort = ':' + row[4];
+ }
+ if (row[6] == '') {
+ dstPort = '';
+ } else {
+ dstPort = ':' + row[6];
+ }
+
+ var line = '<td class="listMRlr" align="center">' + row[0] + '</td>' +
+ '<td class="listMRr ellipsis" title="' + row[1] + '">' + row[1].slice(0,-3) + '</td>' +
+ '<td class="listMRr ellipsis" title="' + row[2] + '">' + row[2] + '</td>' +
+ '<td class="listMRr ellipsis" title="' + srcIP + srcPort + '"><a href="diag_dns.php?host=' + row[3] + '" title="' + rrText + '">' + srcIP + '</a></td>' +
+ '<td class="listMRr ellipsis" title="' + dstIP + dstPort + '"><a href="diag_dns.php?host=' + row[5] + '" title="' + rrText + '">' + dstIP + '</a>' + dstPort + '</td>';
+
+ var nentriesacts = "<?php echo $nentriesacts; ?>";
+ var nentriesinterfaces = "<?php echo $nentriesinterfaces; ?>";
+
+ var Action = row[0].match(/alt=.*?(pass|block|reject)/i).join("").match(/pass|block|reject/i).join("");
+ var Interface = row[2];
+
+ if (!(in_arrayi(Action, nentriesacts.replace (/\s+/g, ',').split(','))) && (nentriesacts != 'All')) {
+ return false;
+ }
+ if (!(in_arrayi(Interface, nentriesinterfaces.replace(/\s+/g, ',').split(','))) && (nentriesinterfaces != 'All')) {
+ return false;
+ }
+
+ return line;
+}
+//]]>
+</script>
+<script src="/javascript/filter_log.js" type="text/javascript"></script>
+<input type="hidden" id="log-config" name="log-config" value="" />
+
+<div id="log-settings" class="widgetconfigdiv" style="display:none;">
+ <form action="/widgets/widgets/log.widget.php" method="post" name="log_widget_iform">
+ Number of lines to display:
+ <select name="filterlogentries" class="formfld unknown" id="filterlogentries">
+ <?php for ($i = 1; $i <= 20; $i++) { ?>
+ <option value="<?php echo $i;?>" <?php if ($nentries == $i) echo "selected=\"selected\"";?>><?php echo $i;?></option>
+ <?php } ?>
+ </select>
+
+<?php
+ $Include_Act = explode(" ", $nentriesacts);
+ if ($nentriesinterfaces == "All") {
+ $nentriesinterfaces = "";
+ }
+?>
+ <input id="actpass" name="actpass" type="checkbox" value="Pass" <?php if (in_arrayi('Pass', $Include_Act)) echo "checked=\"checked\""; ?> /> Pass
+ <input id="actblock" name="actblock" type="checkbox" value="Block" <?php if (in_arrayi('Block', $Include_Act)) echo "checked=\"checked\""; ?> /> Block
+ <input id="actreject" name="actreject" type="checkbox" value="Reject" <?php if (in_arrayi('Reject', $Include_Act)) echo "checked=\"checked\""; ?> /> Reject
+ <br />
+ Interfaces:
+ <select id="filterlogentriesinterfaces" name="filterlogentriesinterfaces" class="formselect">
+ <option value="All">ALL</option>
+<?php
+ $interfaces = get_configured_interface_with_descr();
+ foreach ($interfaces as $iface => $ifacename):
+?>
+ <option value="<?=$iface;?>" <?php if ($nentriesinterfaces == $iface) echo "selected=\"selected\"";?>>
+ <?=htmlspecialchars($ifacename);?>
+ </option>
+<?php
+ endforeach;
+ unset($interfaces);
+ unset($Include_Act);
+?>
+ </select>
+
+ <input id="log_widget_submit" name="log_widget_submit" type="submit" class="formbtn" value="Save" />
+ </form>
+</div>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" style="table-layout: fixed;" summary="logs">
+ <colgroup>
+ <col style='width: 7%;' />
+ <col style='width: 23%;' />
+ <col style='width: 11%;' />
+ <col style='width: 28%;' />
+ <col style='width: 31%;' />
+ </colgroup>
+ <thead>
+ <tr>
+ <td class="listhdrr"><?=gettext("Act");?></td>
+ <td class="listhdrr"><?=gettext("Time");?></td>
+ <td class="listhdrr"><?=gettext("IF");?></td>
+ <td class="listhdrr"><?=gettext("Source");?></td>
+ <td class="listhdrr"><?=gettext("Destination");?></td>
+ </tr>
+ </thead>
+ <tbody id='filter-log-entries'>
+ <?php
+ $rowIndex = 0;
+ foreach ($filterlog as $filterent):
+ $evenRowClass = $rowIndex % 2 ? " listMReven" : " listMRodd";
+ $rowIndex++;
+ if ($filterent['version'] == '6') {
+ $srcIP = "[" . htmlspecialchars($filterent['srcip']) . "]";
+ $dstIP = "[" . htmlspecialchars($filterent['dstip']) . "]";
+ } else {
+ $srcIP = htmlspecialchars($filterent['srcip']);
+ $dstIP = htmlspecialchars($filterent['dstip']);
+ }
+
+ if ($filterent['srcport']) {
+ $srcPort = ":" . htmlspecialchars($filterent['srcport']);
+ } else {
+ $srcPort = "";
+ }
+
+ if ($filterent['dstport']) {
+ $dstPort = ":" . htmlspecialchars($filterent['dstport']);
+ } else {
+ $dstPort = "";
+ }
+
+ ?>
+ <tr class="<?=$evenRowClass?>">
+ <td class="listMRlr nowrap" align="center">
+ <a href="#" onclick="javascript:getURL('diag_logs_filter.php?getrulenum=<?php echo "{$filterent['rulenum']},{$filterent['tracker']},{$filterent['act']}"; ?>', outputrule);">
+ <img border="0" src="<?php echo find_action_image($filterent['act']);?>" width="11" height="11" alt="<?php echo $filterent['act'];?>" title="<?php echo $filterent['act'];?>" />
+ </a>
+ </td>
+ <td class="listMRr ellipsis nowrap" title="<?php echo htmlspecialchars($filterent['time']);?>"><?php echo substr(htmlspecialchars($filterent['time']),0,-3);?></td>
+ <td class="listMRr ellipsis nowrap" title="<?php echo htmlspecialchars($filterent['interface']);?>"><?php echo htmlspecialchars($filterent['interface']);?></td>
+ <td class="listMRr ellipsis nowrap" title="<?php echo $srcIP . $srcPort;?>">
+ <a href="diag_dns.php?host=<?php echo "{$filterent['srcip']}"; ?>" title="<?=gettext("Reverse Resolve with DNS");?>">
+ <?php echo $srcIP;?></a></td>
+ <td class="listMRr ellipsis nowrap" title="<?php echo $dstIP . $dstPort;?>">
+ <a href="diag_dns.php?host=<?php echo "{$filterent['dstip']}"; ?>" title="<?=gettext("Reverse Resolve with DNS");?>">
+ <?php echo $dstIP;?></a><?php echo $dstPort;?></td>
+ <?php
+ if ($filterent['proto'] == "TCP") {
+ $filterent['proto'] .= ":{$filterent['tcpflags']}";
+ }
+ ?>
+ </tr>
+ <?php
+ endforeach;
+ ?>
+ </tbody>
+</table>
+
+<!-- needed to display the widget settings menu -->
+<script type="text/javascript">
+//<![CDATA[
+ selectIntLink = "log-configure";
+ textlink = document.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+//]]>
+</script>
diff --git a/src/usr/local/www/widgets/widgets/ntp_status.widget.php b/src/usr/local/www/widgets/widgets/ntp_status.widget.php
new file mode 100644
index 0000000..64522be
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/ntp_status.widget.php
@@ -0,0 +1,515 @@
+<?php
+/*
+ ntp_status.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright 2007 Scott Dale
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+
+require_once("/usr/local/www/widgets/include/ntp_status.inc");
+
+if ($_REQUEST['updateme']) {
+//this block displays only on ajax refresh
+ if (isset($config['system']['ipv6allow'])) {
+ $inet_version = "";
+ } else {
+ $inet_version = " -4";
+ }
+
+ exec("/usr/local/sbin/ntpq -pn $inet_version | /usr/bin/tail +3", $ntpq_output);
+ $ntpq_counter = 0;
+ foreach ($ntpq_output as $line) {
+ if (substr($line, 0, 1) == "*") {
+ //Active NTP Peer
+ $line = substr($line, 1);
+ $peerinfo = preg_split("/[\s\t]+/", $line);
+ if ($peerinfo[2] == "1") {
+ $syncsource = $peerinfo[0] . " (stratum " . $peerinfo[2] . ", " . $peerinfo[1] . ")";
+ } else {
+ $syncsource = $peerinfo[0] . " (stratum " . $peerinfo[2] . ")";
+ }
+ $ntpq_counter++;
+ } elseif (substr($line, 0, 1) == "o") {
+ //Local PPS Peer
+ $line = substr($line, 1);
+ $peerinfo = preg_split("/[\s\t]+/", $line);
+ $syncsource = $peerinfo[1] . " (stratum " . $peerinfo[2] . ", PPS)";
+ $ntpq_counter++;
+ }
+ }
+
+ exec("/usr/local/sbin/ntpq -c clockvar $inet_version", $ntpq_clockvar_output);
+ foreach ($ntpq_clockvar_output as $line) {
+ if (substr($line, 0, 9) == "timecode=") {
+ $tmp = explode('"', $line);
+ $tmp = $tmp[1];
+ if (substr($tmp, 0, 6) == '$GPRMC') {
+ $gps_vars = explode(",", $tmp);
+ $gps_ok = ($gps_vars[2] == "A");
+ $gps_lat_deg = substr($gps_vars[3], 0, 2);
+ $gps_lat_min = substr($gps_vars[3], 2) / 60.0;
+ $gps_lon_deg = substr($gps_vars[5], 0, 3);
+ $gps_lon_min = substr($gps_vars[5], 3) / 60.0;
+ $gps_lat = $gps_lat_deg + $gps_lat_min;
+ $gps_lat = $gps_lat * (($gps_vars[4] == "N") ? 1 : -1);
+ $gps_lon = $gps_lon_deg + $gps_lon_min;
+ $gps_lon = $gps_lon * (($gps_vars[6] == "E") ? 1 : -1);
+ $gps_la = $gps_vars[4];
+ $gps_lo = $gps_vars[6];
+ } elseif (substr($tmp, 0, 6) == '$GPGGA') {
+ $gps_vars = explode(",", $tmp);
+ $gps_ok = $gps_vars[6];
+ $gps_lat_deg = substr($gps_vars[2], 0, 2);
+ $gps_lat_min = substr($gps_vars[2], 2) / 60.0;
+ $gps_lon_deg = substr($gps_vars[4], 0, 3);
+ $gps_lon_min = substr($gps_vars[4], 3) / 60.0;
+ $gps_lat = $gps_lat_deg + $gps_lat_min;
+ $gps_lat = $gps_lat * (($gps_vars[3] == "N") ? 1 : -1);
+ $gps_lon = $gps_lon_deg + $gps_lon_min;
+ $gps_lon = $gps_lon * (($gps_vars[5] == "E") ? 1 : -1);
+ $gps_alt = $gps_vars[9];
+ $gps_alt_unit = $gps_vars[10];
+ $gps_sat = $gps_vars[7];
+ $gps_la = $gps_vars[3];
+ $gps_lo = $gps_vars[5];
+ } elseif (substr($tmp, 0, 6) == '$GPGLL') {
+ $gps_vars = explode(",", $tmp);
+ $gps_ok = ($gps_vars[6] == "A");
+ $gps_lat_deg = substr($gps_vars[1], 0, 2);
+ $gps_lat_min = substr($gps_vars[1], 2) / 60.0;
+ $gps_lon_deg = substr($gps_vars[3], 0, 3);
+ $gps_lon_min = substr($gps_vars[3], 3) / 60.0;
+ $gps_lat = $gps_lat_deg + $gps_lat_min;
+ $gps_lat = $gps_lat * (($gps_vars[2] == "N") ? 1 : -1);
+ $gps_lon = $gps_lon_deg + $gps_lon_min;
+ $gps_lon = $gps_lon * (($gps_vars[4] == "E") ? 1 : -1);
+ $gps_la = $gps_vars[2];
+ $gps_lo = $gps_vars[4];
+ }
+ }
+ }
+
+ if (isset($config['ntpd']['gps']['type']) && ($config['ntpd']['gps']['type'] == 'SureGPS') && (isset($gps_ok))) {
+ //GSV message is only enabled by init commands in services_ntpd_gps.php for SureGPS board
+ $gpsport = fopen("/dev/gps0", "r+");
+ while ($gpsport) {
+ $buffer = fgets($gpsport);
+ if (substr($buffer, 0, 6)=='$GPGSV') {
+ //echo $buffer."\n";
+ $gpgsv = explode(',',$buffer);
+ $gps_satview = $gpgsv[3];
+ break;
+ }
+ }
+ }
+?>
+
+<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="clock">
+ <tbody>
+ <tr>
+ <td width="40%" class="vncellt">Sync Source</td>
+ <td width="60%" class="listr">
+ <?php if ($ntpq_counter == 0): ?>
+ No active peers available
+ <?php else: ?>
+ <?php echo $syncsource; ?>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php if (($gps_ok) && ($gps_lat) && ($gps_lon)): ?>
+ <tr>
+ <td width="40%" class="vncellt">Clock location</td>
+ <td width="60%" class="listr">
+ <a target="_gmaps" href="http://maps.google.com/?q=<?php echo $gps_lat; ?>,<?php echo $gps_lon; ?>">
+ <?php
+ echo sprintf("%.5f", $gps_lat) . " " . $gps_la . ", " . sprintf("%.5f", $gps_lon) . " " . $gps_lo;
+ ?>
+ </a>
+ <?php
+ if (isset($gps_alt)) {
+ echo " (" . $gps_alt . " " . $gps_alt_unit . " alt.)";
+ }
+ ?>
+ </td>
+ </tr>
+ <?php if (isset($gps_sat) || isset($gps_satview)): ?>
+ <tr>
+ <td width="40%" class="vncellt">Satellites</td>
+ <td width="60%" class="listr">
+ <?php
+ if (isset($gps_satview)) {
+ echo 'in view ' . intval($gps_satview);
+ }
+ if (isset($gps_sat) && isset($gps_satview)) {
+ echo ', ';
+ }
+ if (isset($gps_sat)) {
+ echo 'in use ' . $gps_sat;
+ }
+ ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php endif; ?>
+ </tbody>
+</table>
+<?php
+ exit;
+}
+
+/*** Clock -- beginning of server-side support code
+by Andrew Shearer, http://www.shearersoftware.com/
+v2.1.2-PHP, 2003-08-07. For updates and explanations, see
+<http://www.shearersoftware.com/software/web-tools/clock/>. ***/
+
+/* Prevent this page from being cached (though some browsers still
+ cache the page anyway, which is why we use cookies). This is
+ only important if the cookie is deleted while the page is still
+ cached (and for ancient browsers that don't know about Cache-Control).
+ If that's not an issue, you may be able to get away with
+ "Cache-Control: private" instead. */
+
+/* Grab the current server time. */
+$gDate = time();
+/* Are the seconds shown by default? When changing this, also change the
+ JavaScript client code's definition of clockShowsSeconds below to match. */
+$gClockShowsSeconds = true;
+
+function getServerDateItems($inDate) {
+ return date('Y,n,j,G,',$inDate).intval(date('i',$inDate)).','.intval(date('s',$inDate));
+ // year (4-digit),month,day,hours (0-23),minutes,seconds
+ // use intval to strip leading zero from minutes and seconds
+ // so JavaScript won't try to interpret them in octal
+ // (use intval instead of ltrim, which translates '00' to '')
+}
+
+function clockDateString($inDate) {
+ return date('Y. F j l',$inDate); // eg "Monday, January 1, 2002"
+}
+
+function clockTimeString($inDate, $showSeconds) {
+ return date($showSeconds ? 'G:i:s' : 'g:i',$inDate).' ';
+}
+/*** Clock -- end of server-side support code ***/
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+/* set up variables used to init clock in BODY's onLoad handler;
+ should be done as early as possible */
+var clockLocalStartTime = new Date();
+var clockServerStartTime = new Date(<?php echo(getServerDateItems($gDate))?>);
+
+/* stub functions for older browsers;
+ will be overridden by next JavaScript1.2 block */
+function clockInit() {
+}
+//]]>
+</script>
+
+
+<script type="text/javascript">
+//<![CDATA[
+/*** simpleFindObj, by Andrew Shearer
+
+Efficiently finds an object by name/id, using whichever of the IE,
+classic Netscape, or Netscape 6/W3C DOM methods is available.
+The optional inLayer argument helps Netscape 4 find objects in
+the named layer or floating DIV. */
+function simpleFindObj(name, inLayer) {
+ return document[name] || (document.all && document.all[name])
+ || (document.getElementById && document.getElementById(name))
+ || (document.layers && inLayer && document.layers[inLayer].document[name]);
+}
+
+/*** Beginning of Clock 2.1.2, by Andrew Shearer
+See: http://www.shearersoftware.com/software/web-tools/clock/
+Redistribution is permitted with the above notice intact.
+
+Client-side clock, based on computed time differential between browser &
+server. The server time is inserted by server-side JavaScript, and local
+time is subtracted from it by client-side JavaScript while the page is
+loading.
+
+Cookies: The local and remote times are saved in cookies named
+localClock and remoteClock, so that when the page is loaded from local
+cache (e.g. by the Back button) the clock will know that the embedded
+server time is stale compared to the local time, since it already
+matches its cookie. It can then base the calculations on both cookies,
+without reloading the page from the server. (IE 4 & 5 for Windows didn't
+respect Response.Expires = 0, so if cookies weren't used, the clock
+would be wrong after going to another page then clicking Back. Netscape
+& Mac IE were OK.)
+
+Every so often (by default, one hour) the clock will reload the page, to
+make sure the clock is in sync (as well as to update the rest of the
+page content).
+
+Compatibility: IE 4.x and 5.0, Netscape 4.x and 6.0, Mozilla 1.0. Mac & Windows.
+
+History: 1.0 2000-05-09 GIF-image digits
+ 2.0 2000-06-29 Uses text DIV layers (so 4.0 browsers req'd), &
+ cookies to work around Win IE stale-time bug
+ 2.1 2002-10-12 Noted Mozilla 1.0 compatibility; released PHP version.
+ 2.1.1 2002-10-20 Fixed octal bug in the PHP translation; the number of
+ minutes & seconds were misinterpreted when less than 10
+ 2.1.2 2003-08-07 The previous fix had introduced a bug when the
+ minutes or seconds were exactly 0. Thanks to Man Bui
+ for reporting the bug.
+*/
+var clockIncrementMillis = 1000;
+var localTime;
+var clockOffset;
+var clockExpirationLocal;
+var clockShowsSeconds = true;
+var clockTimerID = null;
+
+function clockInit(localDateObject, serverDateObject)
+{
+ var origRemoteClock = parseInt(clockGetCookieData("remoteClock"));
+ var origLocalClock = parseInt(clockGetCookieData("localClock"));
+ var newRemoteClock = serverDateObject.getTime();
+ // May be stale (WinIE); will check against cookie later
+ // Can't use the millisec. ctor here because of client inconsistencies.
+ var newLocalClock = localDateObject.getTime();
+ var maxClockAge = 60 * 60 * 1000; // get new time from server every 1hr
+
+ if (newRemoteClock != origRemoteClock) {
+ // new clocks are up-to-date (newer than any cookies)
+ document.cookie = "remoteClock=" + newRemoteClock;
+ document.cookie = "localClock=" + newLocalClock;
+ clockOffset = newRemoteClock - newLocalClock;
+ clockExpirationLocal = newLocalClock + maxClockAge;
+ localTime = newLocalClock; // to keep clockUpdate() happy
+ } else if (origLocalClock != origLocalClock) {
+ // error; localClock cookie is invalid (parsed as NaN)
+ clockOffset = null;
+ clockExpirationLocal = null;
+ } else {
+ // fall back to clocks in cookies
+ clockOffset = origRemoteClock - origLocalClock;
+ clockExpirationLocal = origLocalClock + maxClockAge;
+ localTime = origLocalClock;
+ // so clockUpdate() will reload if newLocalClock
+ // is earlier (clock was reset)
+ }
+ /* Reload page at server midnight to display the new date,
+ by expiring the clock then */
+ var nextDayLocal = (new Date(serverDateObject.getFullYear(),
+ serverDateObject.getMonth(),
+ serverDateObject.getDate() + 1)).getTime() - clockOffset;
+ if (nextDayLocal < clockExpirationLocal) {
+ clockExpirationLocal = nextDayLocal;
+ }
+}
+
+function clockOnLoad()
+{
+ clockUpdate();
+}
+
+function clockOnUnload() {
+ clockClearTimeout();
+}
+
+function clockClearTimeout() {
+ if (clockTimerID) {
+ clearTimeout(clockTimerID);
+ clockTimerID = null;
+ }
+}
+
+function clockToggleSeconds()
+{
+ clockClearTimeout();
+ if (clockShowsSeconds) {
+ clockShowsSeconds = false;
+ clockIncrementMillis = 60000;
+ } else {
+ clockShowsSeconds = true;
+ clockIncrementMillis = 1000;
+ }
+ clockUpdate();
+}
+
+function clockTimeString(inHours, inMinutes, inSeconds) {
+ return inHours
+ + (inMinutes < 10 ? ":0" : ":") + inMinutes
+ + (inSeconds < 10 ? ":0" : ":") + inSeconds;
+}
+
+function clockDisplayTime(inHours, inMinutes, inSeconds) {
+ clockWriteToDiv("ClockTime", clockTimeString(inHours, inMinutes, inSeconds));
+}
+
+function clockWriteToDiv(divName, newValue) // APS 6/29/00
+{
+ var divObject = simpleFindObj(divName);
+ newValue = '<b>' + newValue + '<' + '/b>';
+ if (divObject && divObject.innerHTML) {
+ divObject.innerHTML = newValue;
+ } else if (divObject && divObject.document) {
+ divObject.document.writeln(newValue);
+ divObject.document.close();
+ }
+ // else divObject wasn't found; it's only a clock, so don't bother complaining
+}
+
+function clockGetCookieData(label) {
+ /* find the value of the specified cookie in the document's
+ semicolon-delimited collection. For IE Win98 compatibility, search
+ from the end of the string (to find most specific host/path) and
+ don't require "=" between cookie name & empty cookie values. Returns
+ null if cookie not found. One remaining problem: Under IE 5 [Win98],
+ setting a cookie with no equals sign creates a cookie with no name,
+ just data, which is indistinguishable from a cookie with that name
+ but no data but can't be overwritten by any cookie with an equals
+ sign. */
+ var c = document.cookie;
+ if (c) {
+ var labelLen = label.length, cEnd = c.length;
+ while (cEnd > 0) {
+ var cStart = c.lastIndexOf(';',cEnd-1) + 1;
+ /* bug fix to Danny Goodman's code: calculate cEnd, to
+ prevent walking the string char-by-char & finding cookie
+ labels that contained the desired label as suffixes */
+ // skip leading spaces
+ while (cStart < cEnd && c.charAt(cStart)==" ") {
+ cStart++;
+ }
+ if (cStart + labelLen <= cEnd && c.substr(cStart,labelLen) == label) {
+ if (cStart + labelLen == cEnd) {
+ return ""; // empty cookie value, no "="
+ } else if (c.charAt(cStart+labelLen) == "=") {
+ // has "=" after label
+ return unescape(c.substring(cStart + labelLen + 1,cEnd));
+ }
+ }
+ cEnd = cStart - 1; // skip semicolon
+ }
+ }
+ return null;
+}
+
+/* Called regularly to update the clock display as well as onLoad (user
+ may have clicked the Back button to arrive here, so the clock would need
+ an immediate update) */
+function clockUpdate()
+{
+ var lastLocalTime = localTime;
+ localTime = (new Date()).getTime();
+
+ /* Sanity-check the diff. in local time between successive calls;
+ reload if user has reset system clock */
+ if (clockOffset == null) {
+ clockDisplayTime(null, null, null);
+ } else if (localTime < lastLocalTime || clockExpirationLocal < localTime) {
+ /* Clock expired, or time appeared to go backward (user reset
+ the clock). Reset cookies to prevent infinite reload loop if
+ server doesn't give a new time. */
+ document.cookie = 'remoteClock=-';
+ document.cookie = 'localClock=-';
+ location.reload(); // will refresh time values in cookies
+ } else {
+ // Compute what time would be on server
+ var serverTime = new Date(localTime + clockOffset);
+ clockDisplayTime(serverTime.getHours(), serverTime.getMinutes(),
+ serverTime.getSeconds());
+
+ // Reschedule this func to run on next even clockIncrementMillis boundary
+ clockTimerID = setTimeout("clockUpdate()",
+ clockIncrementMillis - (serverTime.getTime() % clockIncrementMillis));
+ }
+}
+
+/*** End of Clock ***/
+window.onload=clockInit(clockLocalStartTime, clockServerStartTime);clockOnLoad();
+window.onunload=clockOnUnload()
+clockUpdate();
+//]]>
+</script>
+
+
+<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="clock">
+ <tbody>
+ <tr>
+ <td width="40%" class="vncellt">Server Time</td>
+ <td width="60%" class="listr">
+ <div id="ClockTime">
+ <b><?php echo(clockTimeString($gDate,$gClockShowsSeconds));?></b>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+<div id='ntpstatus'>
+<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="clock">
+ <tbody>
+ <tr>
+ <td width="100%" class="listr">
+ Updating...
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<script type="text/javascript">
+//<![CDATA[
+ function ntp_getstatus() {
+ scroll(0,0);
+ var url = "/widgets/widgets/ntp_status.widget.php";
+ var pars = 'updateme=yes';
+ jQuery.ajax(
+ url,
+ {
+ type: 'get',
+ data: pars,
+ complete: ntpstatuscallback
+ });
+ // Refresh the status every 1 minute
+ setTimeout('ntp_getstatus()', 1*60*1000);
+ }
+ function ntpstatuscallback(transport) {
+ // The server returns formatted html code
+ var responseStringNtp = transport.responseText
+ jQuery('#ntpstatus').prop('innerHTML',responseStringNtp);
+ }
+ // Do the first status check 1 second after the dashboard opens
+ setTimeout('ntp_getstatus()', 1000);
+//]]>
+</script>
diff --git a/src/usr/local/www/widgets/widgets/openvpn.widget.php b/src/usr/local/www/widgets/widgets/openvpn.widget.php
new file mode 100644
index 0000000..6f813c5
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/openvpn.widget.php
@@ -0,0 +1,290 @@
+<?php
+
+/*
+ openvpn.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Part of pfSense widgets (https://www.pfsense.org)
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("openvpn.inc");
+
+/* Handle AJAX */
+if ($_GET['action']) {
+ if ($_GET['action'] == "kill") {
+ $port = $_GET['port'];
+ $remipp = $_GET['remipp'];
+ if (!empty($port) and !empty($remipp)) {
+ $retval = kill_client($port, $remipp);
+ echo htmlentities("|{$port}|{$remipp}|{$retval}|");
+ } else {
+ echo gettext("invalid input");
+ }
+ exit;
+ }
+}
+
+
+function kill_client($port, $remipp) {
+ global $g;
+
+ //$tcpsrv = "tcp://127.0.0.1:{$port}";
+ $tcpsrv = "unix://{$g['varetc_path']}/openvpn/{$port}.sock";
+ $errval;
+ $errstr;
+
+ /* open a tcp connection to the management port of each server */
+ $fp = @stream_socket_client($tcpsrv, $errval, $errstr, 1);
+ $killed = -1;
+ if ($fp) {
+ stream_set_timeout($fp, 1);
+ fputs($fp, "kill {$remipp}\n");
+ while (!feof($fp)) {
+ $line = fgets($fp, 1024);
+
+ $info = stream_get_meta_data($fp);
+ if ($info['timed_out']) {
+ break;
+ }
+
+ /* parse header list line */
+ if (strpos($line, "INFO:") !== false) {
+ continue;
+ }
+ if (strpos($line, "SUCCESS") !== false) {
+ $killed = 0;
+ }
+ break;
+ }
+ fclose($fp);
+ }
+ return $killed;
+}
+
+$servers = openvpn_get_active_servers();
+$sk_servers = openvpn_get_active_servers("p2p");
+$clients = openvpn_get_active_clients();
+?>
+
+<br />
+<script type="text/javascript">
+//<![CDATA[
+ function killClient(mport, remipp) {
+ var busy = function(index,icon) {
+ jQuery(icon).bind("onclick","");
+ jQuery(icon).attr('src',jQuery(icon).attr('src').replace("\.gif", "_d.gif"));
+ jQuery(icon).css("cursor","wait");
+ }
+
+ jQuery('img[name="i:' + mport + ":" + remipp + '"]').each(busy);
+
+ jQuery.ajax(
+ "<?=$_SERVER['SCRIPT_NAME'];?>" +
+ "?action=kill&port=" + mport + "&remipp=" + remipp,
+ { type: "get", complete: killComplete }
+ );
+ }
+
+ function killComplete(req) {
+ var values = req.responseText.split("|");
+ if (values[3] != "0") {
+ alert('<?=gettext("An error occurred.");?>' + ' (' + values[3] + ')');
+ return;
+ }
+
+ jQuery('tr[name="r:' + values[1] + ":" + values[2] + '"]').each(
+ function(index,row) { jQuery(row).fadeOut(1000); }
+ );
+ }
+//]]>
+</script>
+
+<?php foreach ($servers as $server): ?>
+
+<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td colspan="6" class="listtopic">
+ <?=$server['name'];?> Client connections
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0" sortableMultirow="2">
+ <tr>
+ <td class="listhdrr">Name/Time</td>
+ <td class="listhdrr">Real/Virtual IP</td>
+ </tr>
+ <?php
+ $rowIndex = 0;
+ foreach ($server['conns'] as $conn):
+ $evenRowClass = $rowIndex % 2 ? " listMReven" : " listMRodd";
+ $rowIndex++;
+ ?>
+ <tr name='<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>' class="<?=$evenRowClass?>">
+ <td class="listMRlr">
+ <?=$conn['common_name'];?>
+ </td>
+ <td class="listMRr">
+ <?=$conn['remote_host'];?>
+ </td>
+ <td class='listMR' rowspan="2">
+ <img src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif' height='17' width='17' border='0'
+ onclick="killClient('<?php echo $server['mgmt']; ?>', '<?php echo $conn['remote_host']; ?>');" style='cursor:pointer;'
+ name='<?php echo "i:{$server['mgmt']}:{$conn['remote_host']}"; ?>'
+ title='Kill client connection from <?php echo $conn['remote_host']; ?>' alt='' />
+ </td>
+ </tr>
+ <tr name='<?php echo "r:{$server['mgmt']}:{$conn['remote_host']}"; ?>' class="<?=$evenRowClass?>">
+ <td class="listMRlr">
+ <?=$conn['connect_time'];?>
+ </td>
+ <td class="listMRr">
+ <?=$conn['virtual_addr'];?>
+ </td>
+ </tr>
+
+ <?php endforeach; ?>
+ <tfoot>
+ <tr>
+ <td colspan="6" class="list" height="12"></td>
+ </tr>
+ </tfoot>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<?php endforeach; ?>
+<?php if (!empty($sk_servers)) { ?>
+<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td colspan="6" class="listtopic">
+ Peer to Peer Server Instance Statistics
+ </td>
+ </tr>
+ <tr>
+ <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td class="listhdrr">Name/Time</td>
+ <td class="listhdrr">Remote/Virtual IP</td>
+ </tr>
+
+<?php foreach ($sk_servers as $sk_server): ?>
+ <tr name='<?php echo "r:{$sk_server['port']}:{$sk_server['remote_host']}"; ?>'>
+ <td class="listlr">
+ <?=$sk_server['name'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['remote_host'];?>
+ </td>
+ <td rowspan="2" align="center">
+ <?php
+ if ($sk_server['status'] == "up") {
+ /* tunnel is up */
+ $iconfn = "interface_up";
+ } else {
+ /* tunnel is down */
+ $iconfn = "interface_down";
+ }
+ echo "<img src ='/themes/{$g['theme']}/images/icons/icon_{$iconfn}.gif' alt='' />";
+ ?>
+ </td>
+ </tr>
+ <tr name='<?php echo "r:{$sk_server['port']}:{$sk_server['remote_host']}"; ?>'>
+ <td class="listlr">
+ <?=$sk_server['connect_time'];?>
+ </td>
+ <td class="listr">
+ <?=$sk_server['virtual_addr'];?>
+ </td>
+ </tr>
+<?php endforeach; ?>
+ </table>
+ </tr>
+</table>
+
+<?php
+} ?>
+<?php if (!empty($clients)) { ?>
+<table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td colspan="6" class="listtopic">
+ Client Instance Statistics
+ </td>
+ </tr>
+ <tr>
+ <table style="padding-top:0px; padding-bottom:0px; padding-left:0px; padding-right:0px" class="tabcont sortable" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td class="listhdrr">Name/Time</td>
+ <td class="listhdrr">Remote/Virtual IP</td>
+ </tr>
+
+ <?php foreach ($clients as $client): ?>
+ <tr name='<?php echo "r:{$client['port']}:{$client['remote_host']}"; ?>'>
+ <td class="listlr">
+ <?=$client['name'];?>
+ </td>
+ <td class="listr">
+ <?=$client['remote_host'];?>
+ </td>
+ <td rowspan="2" align="center">
+ <?php
+ if ($client['status'] == "up") {
+ /* tunnel is up */
+ $iconfn = "interface_up";
+ } else {
+ /* tunnel is down */
+ $iconfn = "interface_down";
+ }
+ echo "<img src ='/themes/{$g['theme']}/images/icons/icon_{$iconfn}.gif' alt='' />";
+ ?>
+ </td>
+ </tr>
+ <tr name='<?php echo "r:{$client['port']}:{$client['remote_host']}"; ?>'>
+ <td class="listlr">
+ <?=$client['connect_time'];?>
+ </td>
+ <td class="listr">
+ <?=$client['virtual_addr'];?>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+ </tr>
+</table>
+
+<?php
+}
+
+if ($DisplayNote) {
+ echo "<br /><b>NOTE:</b> You need to bind each OpenVPN client to enable its management daemon: use 'Local port' setting in the OpenVPN client screen";
+}
+
+if ((empty($clients)) && (empty($servers)) && (empty($sk_servers))) {
+ echo "No OpenVPN instances defined";
+}
+?>
diff --git a/src/usr/local/www/widgets/widgets/picture.widget.php b/src/usr/local/www/widgets/widgets/picture.widget.php
new file mode 100644
index 0000000..02a002a
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/picture.widget.php
@@ -0,0 +1,96 @@
+<?php
+/*
+ picture.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright 2009 Scott Ullrich
+ Part of pfSense widgets (https://www.pfsense.org)
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+
+if ($_GET['getpic']=="true") {
+ $pic_type_s = explode(".", $config['widgets']['picturewidget_filename']);
+ $pic_type = $pic_type_s[1];
+ if ($config['widgets']['picturewidget']) {
+ $data = base64_decode($config['widgets']['picturewidget']);
+ }
+ header("Content-Disposition: inline; filename=\"{$config['widgets']['picturewidget_filename']}\"");
+ header("Content-Type: image/{$pic_type}");
+ header("Content-Length: " . strlen($data));
+ echo $data;
+ exit;
+}
+
+if ($_POST) {
+ if (is_uploaded_file($_FILES['pictfile']['tmp_name'])) {
+ /* read the file contents */
+ $fd_pic = fopen($_FILES['pictfile']['tmp_name'], "rb");
+ while (($buf=fread($fd_pic, 8192)) != '') {
+ // Here, $buf is guaranteed to contain data
+ $data .= $buf;
+ }
+ fclose($fd_pic);
+ if (!$data) {
+ log_error("Warning, could not read file " . $_FILES['pictfile']['tmp_name']);
+ die("Could not read temporary file");
+ } else {
+ $picname = basename($_FILES['uploadedfile']['name']);
+ $config['widgets']['picturewidget'] = base64_encode($data);
+ $config['widgets']['picturewidget_filename'] = $_FILES['pictfile']['name'];
+ write_config("Picture widget saved via Dashboard.");
+ header("Location: /index.php");
+ exit;
+ }
+ }
+}
+
+?>
+
+<input type="hidden" id="picture-config" name="picture-config" value="" />
+
+<div id="picture-settings" class="widgetconfigdiv" style="display:none;">
+ <form action="/widgets/widgets/picture.widget.php" method="post" name="picture_widget_iform" enctype="multipart/form-data">
+ <input name="pictfile" type="file" class="formbtn" id="pictfile" size="20" />
+ <input id="picture_widget_submit" name="picture_widget_submit" type="submit" class="formbtn" value="Upload" />
+ </form>
+</div>
+
+<div id="picture-widgets" style="padding: 5px">
+ <a href='/widgets/widgets/picture.widget.php?getpic=true' target='_blank'>
+ <img border="0" width="100%" height="100%" src="/widgets/widgets/picture.widget.php?getpic=true" alt="picture" />
+ </a>
+</div>
+
+<!-- needed to show the settings widget icon -->
+<script type="text/javascript">
+//<![CDATA[
+ selectIntLink = "picture-configure";
+ textlink = document.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+//]]>
+</script>
diff --git a/src/usr/local/www/widgets/widgets/rss.widget.php b/src/usr/local/www/widgets/widgets/rss.widget.php
new file mode 100644
index 0000000..0850039
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/rss.widget.php
@@ -0,0 +1,198 @@
+<?php
+/*
+ rss.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright 2009 Scott Ullrich
+ Part of pfSense widgets (https://www.pfsense.org)
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+
+if ($_POST['rssfeed']) {
+ $config['widgets']['rssfeed'] = str_replace("\n", ",", htmlspecialchars($_POST['rssfeed'], ENT_QUOTES | ENT_HTML401));
+ $config['widgets']['rssmaxitems'] = str_replace("\n", ",", htmlspecialchars($_POST['rssmaxitems'], ENT_QUOTES | ENT_HTML401));
+ $config['widgets']['rsswidgetheight'] = htmlspecialchars($_POST['rsswidgetheight'], ENT_QUOTES | ENT_HTML401);
+ $config['widgets']['rsswidgettextlength'] = htmlspecialchars($_POST['rsswidgettextlength'], ENT_QUOTES | ENT_HTML401);
+ write_config("Saved RSS Widget feed via Dashboard");
+ header("Location: /");
+}
+
+// Use saved feed and max items
+if ($config['widgets']['rssfeed']) {
+ $rss_feed_s = explode(",", $config['widgets']['rssfeed']);
+}
+
+if ($config['widgets']['rssmaxitems']) {
+ $max_items = $config['widgets']['rssmaxitems'];
+}
+
+if (is_numeric($config['widgets']['rsswidgetheight'])) {
+ $rsswidgetheight = $config['widgets']['rsswidgetheight'];
+}
+
+if (is_numeric($config['widgets']['rsswidgettextlength'])) {
+ $rsswidgettextlength = $config['widgets']['rsswidgettextlength'];
+}
+
+// Set a default feed if none exists
+if (!$rss_feed_s) {
+ $rss_feed_s = "https://blog.pfsense.org";
+ $config['widgets']['rssfeed'] = "https://blog.pfsense.org";
+}
+
+if (!$max_items) {
+ $max_items = 10;
+}
+
+if (!$rsswidgetheight) {
+ $rsswidgetheight = 300;
+}
+
+if (!$rsswidgettextlength) {
+ $rsswidgettextlength = 140; // oh twitter, how do we love thee?
+}
+
+if ($config['widgets']['rssfeed']) {
+ $textarea_txt = str_replace(",", "\n", $config['widgets']['rssfeed']);
+} else {
+ $textarea_txt = "";
+}
+
+?>
+
+<input type="hidden" id="rss-config" name="rss-config" value="" />
+
+<div id="rss-settings" class="widgetconfigdiv" style="display:none;">
+ <form action="/widgets/widgets/rss.widget.php" method="post" name="rss_widget_iform">
+ <textarea name="rssfeed" class="formfld unknown textarea_widget" id="rssfeed" cols="40" rows="3"><?=$textarea_txt;?></textarea>
+ <br />
+ <table summary="rss widget">
+ <tr>
+ <td align="right">
+ Display number of items:
+ </td>
+ <td>
+ <select name='rssmaxitems' id='rssmaxitems'>
+ <option value='<?= $max_items ?>'><?= $max_items ?></option>
+ <?php
+ for ($x=100; $x<5100; $x=$x+100) {
+ echo "<option value='{$x}'>{$x}</option>\n";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td align="right">
+ Widget height:
+ </td>
+ <td>
+ <select name='rsswidgetheight' id='rsswidgetheight'>
+ <option value='<?= $rsswidgetheight ?>'><?= $rsswidgetheight ?>px</option>
+ <?php
+ for ($x=100; $x<5100; $x=$x+100) {
+ echo "<option value='{$x}'>{$x}px</option>\n";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td align="right">
+ Show how many characters from story:
+ </td>
+ <td>
+ <select name='rsswidgettextlength' id='rsswidgettextlength'>
+ <option value='<?= $rsswidgettextlength ?>'><?= $rsswidgettextlength ?></option>
+ <?php
+ for ($x=10; $x<5100; $x=$x+10) {
+ echo "<option value='{$x}'>{$x}</option>\n";
+ }
+ ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+ <input id="rss_widget_submit" name="rss_widget_submit" type="submit" class="formbtn" value="Save" />
+ </td>
+ </tr>
+ </table>
+ </form>
+</div>
+
+<div id="rss-widgets" style="padding: 5px; height: <?=$rsswidgetheight?>px; overflow:scroll;">
+<?php
+ if (!is_dir("/tmp/simplepie")) {
+ mkdir("/tmp/simplepie");
+ mkdir("/tmp/simplepie/cache");
+ }
+ exec("chmod a+rw /tmp/simplepie/.");
+ exec("chmod a+rw /tmp/simplepie/cache/.");
+ require_once("simplepie/simplepie.inc");
+ function textLimit($string, $length, $replacer = '...') {
+ if (strlen($string) > $length) {
+ return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;
+ }
+ return $string;
+ }
+ $feed = new SimplePie();
+ $feed->set_cache_location("/tmp/simplepie/");
+ $feed->set_feed_url($rss_feed_s);
+ $feed->init();
+ $feed->handle_content_type();
+ $counter = 1;
+ foreach ($feed->get_items() as $item) {
+ $feed = $item->get_feed();
+ $feed->strip_htmltags();
+ echo "<a target='blank' href='" . $item->get_permalink() . "'>" . $item->get_title() . "</a><br />";
+ $content = $item->get_content();
+ $content = strip_tags($content);
+ echo textLimit($content, $rsswidgettextlength) . "<br />";
+ echo "Source: <a target='_blank' href='" . $item->get_permalink() . "'><img src='" . $feed->get_favicon() . "' alt='" . $feed->get_title() . "' title='" . $feed->get_title() . "' border='0' width='16' height='16' /></a><br />";
+ $counter++;
+ if ($counter > $max_items) {
+ break;
+ }
+ echo "<hr/>";
+ }
+?>
+</div>
+
+<!-- needed to display the widget settings menu -->
+<script type="text/javascript">
+//<![CDATA[
+ selectIntLink = "rss-configure";
+ textlink = document.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+//]]>
+</script>
diff --git a/src/usr/local/www/widgets/widgets/services_status.widget.php b/src/usr/local/www/widgets/widgets/services_status.widget.php
new file mode 100644
index 0000000..f4c3542
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/services_status.widget.php
@@ -0,0 +1,105 @@
+<?php
+/*
+ services_status.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright (C) 2004, 2005 Scott Ullrich
+ All rights reserved.
+
+ services_status.widget.php
+ Copyright (C) 2007 Sam Wenham
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("captiveportal.inc");
+require_once("service-utils.inc");
+require_once("ipsec.inc");
+require_once("vpn.inc");
+require_once("/usr/local/www/widgets/include/services_status.inc");
+
+$services = get_services();
+
+if (isset($_POST['servicestatusfilter'])) {
+ $config['widgets']['servicestatusfilter'] = htmlspecialchars($_POST['servicestatusfilter'], ENT_QUOTES | ENT_HTML401);
+ write_config("Saved Service Status Filter via Dashboard");
+ header("Location: ../../index.php");
+}
+?>
+<input type="hidden" id="services_status-config" name="services_status-config" value="" />
+<div id="services_status-settings" class="widgetconfigdiv" style="display:none;">
+ <form action="/widgets/widgets/services_status.widget.php" method="post" name="services_status_widget_iform">
+ Comma separated list of services to NOT display in the widget<br />
+ <input type="text" size="30" name="servicestatusfilter" class="formfld unknown" id="servicestatusfilter" value="<?= $config['widgets']['servicestatusfilter'] ?>" />
+ <input id="services_status_widget_submit" name="services_status_widget_submit" type="submit" class="formbtn" value="Save" />
+ </form>
+</div>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="services">
+ <tr>
+ <td class="widgetsubheader" align="center"><b>Service</b></td>
+ <td class="widgetsubheader" align="center"><b>Description</b></td>
+ <td class="widgetsubheader" align="center"><b>Status</b></td>
+ <td class="widgetsubheader">&nbsp;</td>
+ </tr>
+<?php
+$skipservices = explode(",", $config['widgets']['servicestatusfilter']);
+
+if (count($services) > 0) {
+ uasort($services, "service_name_compare");
+ foreach ($services as $service) {
+ if ((!$service['name']) || (in_array($service['name'], $skipservices)) || (!is_service_enabled($service['name']))) {
+ continue;
+ }
+ if (empty($service['description'])) {
+ $service['description'] = get_pkg_descr($service['name']);
+ }
+ $service_desc = explode(".",$service['description']);
+ echo "<tr><td class=\"listlr\">" . $service['name'] . "</td>\n";
+ echo "<td class=\"listr\">" . $service_desc[0] . "</td>\n";
+ // if service is running then listr else listbg
+ $bgclass = null;
+ if (get_service_status($service)) {
+ $bgclass = "listr";
+ } else {
+ $bgclass = "listbg";
+ }
+ echo "<td class=\"" . $bgclass . "\" align=\"center\">" . get_service_status_icon($service, false, true) . "</td>\n";
+ echo "<td valign=\"middle\" class=\"list nowrap\">" . get_service_control_links($service) . "</td></tr>\n";
+ }
+} else {
+ echo "<tr><td colspan=\"3\" align=\"center\">" . gettext("No services found") . " . </td></tr>\n";
+}
+?>
+</table>
+
+<!-- needed to display the widget settings menu -->
+<script type="text/javascript">
+//<![CDATA[
+ selectIntLink = "services_status-configure";
+ textlink = document.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+//]]>
+</script>
diff --git a/src/usr/local/www/widgets/widgets/smart_status.widget.php b/src/usr/local/www/widgets/widgets/smart_status.widget.php
new file mode 100644
index 0000000..87f0605
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/smart_status.widget.php
@@ -0,0 +1,76 @@
+<?php
+/*
+ smart_status.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright 2012 mkirbst @ pfSense Forum
+ Part of pfSense widgets (https://www.pfsense.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+require_once("/usr/local/www/widgets/include/smart_status.inc");
+?>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="smart status">
+ <tr>
+ <td class="widgetsubheader" align="center"><b><?php echo gettext("Drive") ?></b></td>
+ <td class="widgetsubheader" align="center"><b><?php echo gettext("Ident") ?></b></td>
+ <td class="widgetsubheader" align="center"><b><?php echo gettext("SMART Status") ?></b></td>
+ </tr>
+
+<?php
+$devs = array();
+## Get all adX, daX, and adaX (IDE, SCSI, and AHCI) devices currently installed
+$devs = get_smart_drive_list();
+
+if (count($devs) > 0) {
+ foreach ($devs as $dev) { ## for each found drive do
+ $dev_ident = exec("diskinfo -v /dev/$dev | grep ident | awk '{print $1}'"); ## get identifier from drive
+ $dev_state = trim(exec("smartctl -H /dev/$dev | awk -F: '/^SMART overall-health self-assessment test result/ {print $2;exit}
+/^SMART Health Status/ {print $2;exit}'")); ## get SMART state from drive
+ switch ($dev_state) {
+ case "PASSED":
+ case "OK":
+ $color = "#90EE90";
+ break;
+ case "":
+ $dev_state = "Unknown";
+ $color = "#C0B788";
+ break;
+ default:
+ $color = "#F08080";
+ break;
+ }
+?>
+ <tr>
+ <td class="listlr"><?php echo $dev; ?></td>
+ <td class="listr" align="center"><?php echo $dev_ident; ?></td>
+ <td class="listr" align="center"><span style="background-color:<?php echo $color; ?>">&nbsp;<?php echo $dev_state; ?>&nbsp;</span></td>
+ </tr>
+<?php }
+}
+?>
+</table>
diff --git a/src/usr/local/www/widgets/widgets/system_information.widget.php b/src/usr/local/www/widgets/widgets/system_information.widget.php
new file mode 100644
index 0000000..231f2ee
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/system_information.widget.php
@@ -0,0 +1,322 @@
+<?php
+/*
+ system_information.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright 2007 Scott Dale
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once("functions.inc");
+require_once("guiconfig.inc");
+require_once('notices.inc');
+include_once("includes/functions.inc.php");
+
+if ($_REQUEST['getupdatestatus']) {
+ if (isset($config['system']['firmware']['disablecheck'])) {
+ exit;
+ }
+ if (isset($config['system']['firmware']['alturl']['enable'])) {
+ $updater_url = "{$config['system']['firmware']['alturl']['firmwareurl']}";
+ } else {
+ $updater_url = $g['update_url'];
+ }
+
+ $nanosize = "";
+ if ($g['platform'] == "nanobsd") {
+ if (file_exists("/etc/nano_use_vga.txt")) {
+ $nanosize = "-nanobsd-vga-";
+ } else {
+ $nanosize = "-nanobsd-";
+ }
+ $nanosize .= strtolower(trim(file_get_contents("/etc/nanosize.txt")));
+ }
+
+ @unlink("/tmp/{$g['product_name']}_version");
+ if (download_file_with_progress_bar("{$updater_url}/version{$nanosize}", "/tmp/{$g['product_name']}_version", 'read_body', 5, 5) === true) {
+ $remote_version = trim(@file_get_contents("/tmp/{$g['product_name']}_version"));
+ }
+
+ if (empty($remote_version)) {
+ echo "<br /><br />Unable to check for updates.";
+ } else {
+ $current_installed_buildtime = trim(file_get_contents("/etc/version.buildtime"));
+
+ if (!$remote_version) {
+ echo "<br /><br />Unable to check for updates.";
+ } else {
+ $needs_system_upgrade = false;
+ if (pfs_version_compare($current_installed_buildtime, $g['product_version'], $remote_version) == -1) {
+ echo "<br /><span class=\"red\" id=\"updatealert\"><b>Update available. </b></span><a href=\"/system_firmware_check.php\">Click Here</a> to view update.";
+ echo "\n<script type=\"text/javascript\">\n";
+ echo "//<![CDATA[\n";
+ echo "jQuery('#updatealert').effect('pulsate',{times: 30},10000);\n";
+ echo "//]]>\n";
+ echo "</script>\n";
+ } else {
+ echo "<br />You are on the latest version.";
+ }
+ }
+ }
+ exit;
+}
+
+$curcfg = $config['system']['firmware'];
+
+$filesystems = get_mounted_filesystems();
+
+?>
+<script type="text/javascript">
+//<![CDATA[
+ jQuery(function() {
+ jQuery("#statePB").progressbar( { value: <?php echo get_pfstate(true); ?> } );
+ jQuery("#mbufPB").progressbar( { value: <?php echo get_mbuf(true); ?> } );
+ jQuery("#cpuPB").progressbar( { value:false } );
+ jQuery("#memUsagePB").progressbar( { value: <?php echo mem_usage(); ?> } );
+
+<?PHP $d = 0; ?>
+<?PHP foreach ($filesystems as $fs): ?>
+ jQuery("#diskUsagePB<?php echo $d++; ?>").progressbar( { value: <?php echo $fs['percent_used']; ?> } );
+<?PHP endforeach; ?>
+
+ <?php if ($showswap == true): ?>
+ jQuery("#swapUsagePB").progressbar( { value: <?php echo swap_usage(); ?> } );
+ <?php endif; ?>
+ <?php if (get_temp() != ""): ?>
+ jQuery("#tempPB").progressbar( { value: <?php echo get_temp(); ?> } );
+ <?php endif; ?>
+ });
+//]]>
+</script>
+
+<table width="100%" border="0" cellspacing="0" cellpadding="0" summary="system information">
+ <tbody>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Name");?></td>
+ <td width="75%" class="listr"><?php echo $config['system']['hostname'] . "." . $config['system']['domain']; ?></td>
+ </tr>
+ <tr>
+ <td width="25%" valign="top" class="vncellt"><?=gettext("Version");?></td>
+ <td width="75%" class="listr">
+ <strong><?=$g['product_version']?></strong>
+ (<?php echo php_uname("m"); ?>)
+ <br />
+ built on <?php readfile("/etc/version.buildtime"); ?>
+ <?php if (!$g['hideuname']): ?>
+ <br />
+ <div id="uname"><a href="#" onclick='swapuname(); return false;'><?php echo php_uname("s") . " " . php_uname("r"); ?></a></div>
+ <?php endif; ?>
+ <?php if (!isset($config['system']['firmware']['disablecheck'])): ?>
+ <div id='updatestatus'><br /><?php echo gettext("Obtaining update status"); ?> ...</div>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php if (!$g['hideplatform']): ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Platform");?></td>
+ <td width="75%" class="listr">
+ <?=htmlspecialchars($g['platform']);?>
+ <?php if (($g['platform'] == "nanobsd") && (file_exists("/etc/nanosize.txt"))) {
+ echo " (" . htmlspecialchars(trim(file_get_contents("/etc/nanosize.txt"))) . ")";
+ } ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php if ($g['platform'] == "nanobsd"): ?>
+ <?
+ global $SLICE, $OLDSLICE, $TOFLASH, $COMPLETE_PATH, $COMPLETE_BOOT_PATH;
+ global $GLABEL_SLICE, $UFS_ID, $OLD_UFS_ID, $BOOTFLASH;
+ global $BOOT_DEVICE, $REAL_BOOT_DEVICE, $BOOT_DRIVE, $ACTIVE_SLICE;
+ nanobsd_detect_slice_info();
+ $rw = is_writable("/") ? "(rw)" : "(ro)";
+ ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("NanoBSD Boot Slice");?></td>
+ <td width="75%" class="listr">
+ <?=htmlspecialchars(nanobsd_friendly_slice_name($BOOT_DEVICE));?> / <?=htmlspecialchars($BOOTFLASH);?> <?php echo $rw; ?>
+ <?php if ($BOOTFLASH != $ACTIVE_SLICE): ?>
+ <br /><br />Next Boot:<br />
+ <?=htmlspecialchars(nanobsd_friendly_slice_name($GLABEL_SLICE));?> / <?=htmlspecialchars($ACTIVE_SLICE);?>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("CPU Type");?></td>
+ <td width="75%" class="listr">
+ <?php
+ echo (htmlspecialchars(get_single_sysctl("hw.model")));
+ ?>
+ <div id="cpufreq"><?= get_cpufreq(); ?></div>
+ <?php
+ $cpucount = get_cpu_count();
+ if ($cpucount > 1): ?>
+ <div id="cpucount">
+ <?= htmlspecialchars($cpucount) ?> CPUs: <?= htmlspecialchars(get_cpu_count(true)); ?></div>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php if ($hwcrypto): ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Hardware crypto");?></td>
+ <td width="75%" class="listr"><?=htmlspecialchars($hwcrypto);?></td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Uptime");?></td>
+ <td width="75%" class="listr" id="uptime"><?= htmlspecialchars(get_uptime()); ?></td>
+ </tr>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Current date/time");?></td>
+ <td width="75%" class="listr">
+ <div id="datetime"><?= date("D M j G:i:s T Y"); ?></div>
+ </td>
+ </tr>
+ <tr>
+ <td width="30%" class="vncellt"><?=gettext("DNS server(s)");?></td>
+ <td width="70%" class="listr">
+ <?php
+ $dns_servers = get_dns_servers();
+ foreach ($dns_servers as $dns) {
+ echo "{$dns}<br />";
+ }
+ ?>
+ </td>
+ </tr>
+ <?php if ($config['revision']): ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Last config change");?></td>
+ <td width="75%" class="listr"><?= htmlspecialchars(date("D M j G:i:s T Y", intval($config['revision']['time'])));?></td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("State table size");?></td>
+ <td width="75%" class="listr">
+ <?php
+ $pfstatetext = get_pfstate();
+ $pfstateusage = get_pfstate(true);
+ ?>
+ <div id="statePB"></div>
+ <span id="pfstateusagemeter"><?= $pfstateusage.'%'; ?></span> (<span id="pfstate"><?= htmlspecialchars($pfstatetext); ?></span>)
+ <br />
+ <a href="diag_dump_states.php"><?=gettext("Show states");?></a>
+ </td>
+ </tr>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("MBUF Usage");?></td>
+ <td width="75%" class="listr">
+ <?php
+ $mbufstext = get_mbuf();
+ $mbufusage = get_mbuf(true);
+ ?>
+ <div id="mbufPB"></div>
+ <span id="mbufusagemeter"><?= $mbufusage.'%'; ?></span> (<span id="mbuf"><?= $mbufstext ?></span>)
+ </td>
+ </tr>
+ <?php if (get_temp() != ""): ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Temperature");?></td>
+ <td width="75%" class="listr">
+ <?php $TempMeter = $temp = get_temp(); ?>
+ <div id="tempPB"></div>
+ <span id="tempmeter"><?= $temp."&#176;C"; ?></span>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Load average");?></td>
+ <td width="75%" class="listr">
+ <div id="load_average" title="Last 1, 5 and 15 minutes"><?= get_load_average(); ?></div>
+ </td>
+ </tr>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("CPU usage");?></td>
+ <td width="75%" class="listr">
+ <div id="cpuPB"></div>
+ <span id="cpumeter">(Updating in 10 seconds)</span>
+ </td>
+ </tr>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Memory usage");?></td>
+ <td width="75%" class="listr">
+ <?php $memUsage = mem_usage(); ?>
+ <div id="memUsagePB"></div>
+ <span id="memusagemeter"><?= $memUsage.'%'; ?></span> of <?= sprintf("%.0f", get_single_sysctl('hw.physmem') / (1024*1024)) ?> MB
+ </td>
+ </tr>
+ <?php if ($showswap == true): ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("SWAP usage");?></td>
+ <td width="75%" class="listr">
+ <?php $swapusage = swap_usage(); ?>
+ <div id="swapUsagePB"></div>
+ <span id="swapusagemeter"><?= $swapusage.'%'; ?></span> of <?= sprintf("%.0f", `/usr/sbin/swapinfo -m | /usr/bin/grep -v Device | /usr/bin/awk '{ print $2;}'`) ?> MB
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="25%" class="vncellt"><?=gettext("Disk usage");?></td>
+ <td width="75%" class="listr">
+ <?php $d = 0; ?>
+ <?php foreach ($filesystems as $fs): ?>
+ <div id="diskUsagePB<?php echo $d; ?>"></div>
+ <?php if (substr(basename($fs['device']), 0, 2) == "md") $fs['type'] .= " in RAM"; ?>
+ <?php echo "{$fs['mountpoint']} ({$fs['type']})";?>: <span id="diskusagemeter<?php echo $d++ ?>"><?= $fs['percent_used'].'%'; ?></span> of <?PHP echo $fs['total_size'];?>
+ <br />
+ <?php endforeach; ?>
+ </td>
+ </tr>
+ </tbody>
+</table>
+<script type="text/javascript">
+//<![CDATA[
+ function swapuname() {
+ jQuery('#uname').html("<?php echo php_uname("a"); ?>");
+ }
+ <?php if (!isset($config['system']['firmware']['disablecheck'])): ?>
+ function getstatus() {
+ scroll(0,0);
+ var url = "/widgets/widgets/system_information.widget.php";
+ var pars = 'getupdatestatus=yes';
+ jQuery.ajax(
+ url,
+ {
+ type: 'get',
+ data: pars,
+ complete: activitycallback
+ });
+ }
+ function activitycallback(transport) {
+ // .html() method process all script tags contained in responseText,
+ // to avoid this we set the innerHTML property
+ jQuery('#updatestatus').prop('innerHTML',transport.responseText);
+ }
+ setTimeout('getstatus()', 4000);
+ <?php endif; ?>
+//]]>
+</script>
diff --git a/src/usr/local/www/widgets/widgets/thermal_sensors.widget.php b/src/usr/local/www/widgets/widgets/thermal_sensors.widget.php
new file mode 100644
index 0000000..0dac0cb
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/thermal_sensors.widget.php
@@ -0,0 +1,279 @@
+<?php
+/*
+ $Id: thermal_sensors.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Description: Thermal Sensors Widget.
+ NOTE: depends on proper config in System >> Advanced >> Miscellaneous tab >> Thermal Sensors section.
+
+ File location:
+ \usr\local\www\widgets\widgets\
+ Depends on:
+ \usr\local\www\widgets\javascript\thermal_sensors.js
+ \usr\local\www\widgets\include\thermal_sensors.inc
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+
+require_once("guiconfig.inc");
+require_once("/usr/local/www/widgets/include/thermal_sensors.inc");
+
+//=========================================================================
+//called by showThermalSensorsData() (jQuery Ajax call) in thermal_sensors.js
+if (isset($_GET["getThermalSensorsData"])) {
+ //get Thermal Sensors data and return
+ echo getThermalSensorsData();
+ return;
+}
+//=========================================================================
+
+
+const WIDGETS_CONFIG_SECTION_KEY = "widgets";
+const THERMAL_SENSORS_WIDGET_SUBSECTION_KEY = "thermal_sensors_widget";
+
+//default constants
+const DEFAULT_WARNING_THRESHOLD = 60; //60 C
+const DEFAULT_CRITICAL_THRESHOLD = 70; //70 C
+const MIN_THRESHOLD_VALUE = 1; //deg C
+const MAX_THRESHOLD_VALUE = 100; //deg C
+
+//NOTE: keys used in $_POST and $config should match text and checkbox inputs' IDs/names in HTML code section
+//=========================================================================
+//save widget config settings on POST
+if ($_POST) {
+ saveThresholdSettings($config, $_POST, "thermal_sensors_widget_zone_warning_threshold", "thermal_sensors_widget_zone_critical_threshold");
+ saveThresholdSettings($config, $_POST, "thermal_sensors_widget_core_warning_threshold", "thermal_sensors_widget_core_critical_threshold");
+
+ //handle checkboxes separately
+ saveGraphDisplaySettings($config, $_POST, "thermal_sensors_widget_show_raw_output");
+ saveGraphDisplaySettings($config, $_POST, "thermal_sensors_widget_show_full_sensor_name");
+ saveGraphDisplaySettings($config, $_POST, "thermal_sensors_widget_pulsate_warning");
+ saveGraphDisplaySettings($config, $_POST, "thermal_sensors_widget_pulsate_critical");
+
+ //write settings to config file
+ write_config("Saved thermal_sensors_widget settings via Dashboard.");
+ header("Location: ../../index.php");
+}
+
+function saveThresholdSettings(&$configArray, &$postArray, $warningValueKey, $criticalValueKey) {
+ $warningValue = 0;
+ $criticalValue = 0;
+
+ if (isset($postArray[$warningValueKey])) {
+ $warningValue = (int) $postArray[$warningValueKey];
+ }
+
+ if (isset($postArray[$criticalValueKey])) {
+ $criticalValue = (int) $postArray[$criticalValueKey];
+ }
+
+ if (($warningValue >= MIN_THRESHOLD_VALUE && $warningValue <= MAX_THRESHOLD_VALUE) &&
+ ($criticalValue >= MIN_THRESHOLD_VALUE && $criticalValue <= MAX_THRESHOLD_VALUE) &&
+ ($warningValue < $criticalValue)) {
+ //all validated ok, save to config array
+ $configArray[WIDGETS_CONFIG_SECTION_KEY][THERMAL_SENSORS_WIDGET_SUBSECTION_KEY][$warningValueKey] = $warningValue;
+ $configArray[WIDGETS_CONFIG_SECTION_KEY][THERMAL_SENSORS_WIDGET_SUBSECTION_KEY][$criticalValueKey] = $criticalValue;
+ }
+}
+
+function saveGraphDisplaySettings(&$configArray, &$postArray, $valueKey) {
+ $configArray[WIDGETS_CONFIG_SECTION_KEY][THERMAL_SENSORS_WIDGET_SUBSECTION_KEY][$valueKey] = isset($postArray[$valueKey]) ? 1 : 0;
+}
+
+//=========================================================================
+//get Threshold settings from config (apply defaults if missing)
+$thermal_sensors_widget_zoneWarningTempThreshold = getThresholdValueFromConfig($config, "thermal_sensors_widget_zone_warning_threshold", DEFAULT_WARNING_THRESHOLD);
+$thermal_sensors_widget_zoneCriticalTempThreshold = getThresholdValueFromConfig($config, "thermal_sensors_widget_zone_critical_threshold", DEFAULT_CRITICAL_THRESHOLD);
+$thermal_sensors_widget_coreWarningTempThreshold = getThresholdValueFromConfig($config, "thermal_sensors_widget_core_warning_threshold", DEFAULT_WARNING_THRESHOLD);
+$thermal_sensors_widget_coreCriticalTempThreshold = getThresholdValueFromConfig($config, "thermal_sensors_widget_core_critical_threshold", DEFAULT_CRITICAL_THRESHOLD);
+
+//get display settings from config (apply defaults if missing)
+$thermal_sensors_widget_showRawOutput = getBoolValueFromConfig($config, "thermal_sensors_widget_show_raw_output", false);
+$thermal_sensors_widget_showFullSensorName = getBoolValueFromConfig($config, "thermal_sensors_widget_show_full_sensor_name", false);
+$thermal_sensors_widget_pulsateWarning = getBoolValueFromConfig($config, "thermal_sensors_widget_pulsate_warning", true);
+$thermal_sensors_widget_pulsateCritical = getBoolValueFromConfig($config, "thermal_sensors_widget_pulsate_critical", true);
+
+function getThresholdValueFromConfig(&$configArray, $valueKey, $defaultValue) {
+
+ $thresholdValue = $defaultValue;
+
+ if (isset($configArray[WIDGETS_CONFIG_SECTION_KEY][THERMAL_SENSORS_WIDGET_SUBSECTION_KEY][$valueKey])) {
+ $thresholdValue = (int) $configArray[WIDGETS_CONFIG_SECTION_KEY][THERMAL_SENSORS_WIDGET_SUBSECTION_KEY][$valueKey];
+ }
+
+ if ($thresholdValue < MIN_THRESHOLD_VALUE || $thresholdValue > MAX_THRESHOLD_VALUE) {
+ //set to default if not in allowed range
+ $thresholdValue = $defaultValue;
+ }
+ return $thresholdValue;
+}
+
+function getBoolValueFromConfig(&$configArray, $valueKey, $defaultValue) {
+
+ $boolValue = false;
+
+ if (isset($configArray[WIDGETS_CONFIG_SECTION_KEY][THERMAL_SENSORS_WIDGET_SUBSECTION_KEY][$valueKey])) {
+ $boolValue = (bool) $configArray[WIDGETS_CONFIG_SECTION_KEY][THERMAL_SENSORS_WIDGET_SUBSECTION_KEY][$valueKey];
+ } else {
+ //set to default if not in allowed range
+ $boolValue = $defaultValue;
+ }
+ return $boolValue;
+}
+
+//=========================================================================
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+ //set Thresholds, to be used in thermal_sensors.js
+ var thermal_sensors_widget_zoneWarningTempThreshold = <?= $thermal_sensors_widget_zoneWarningTempThreshold; ?>;
+ var thermal_sensors_widget_zoneCriticalTempThreshold = <?= $thermal_sensors_widget_zoneCriticalTempThreshold; ?>;
+ var thermal_sensors_widget_coreWarningTempThreshold = <?= $thermal_sensors_widget_coreWarningTempThreshold; ?>;
+ var thermal_sensors_widget_coreCriticalTempThreshold = <?= $thermal_sensors_widget_coreCriticalTempThreshold; ?>;
+
+ //set Graph display settings, to be used in thermal_sensors.js
+ var thermal_sensors_widget_showRawOutput = <?= $thermal_sensors_widget_showRawOutput ? "true" : "false"; ?>;
+ var thermal_sensors_widget_showFullSensorName = <?= $thermal_sensors_widget_showFullSensorName ? "true" : "false"; ?>;
+ var thermal_sensors_widget_pulsateWarning = <?= $thermal_sensors_widget_pulsateWarning ? "true" : "false"; ?>;
+ var thermal_sensors_widget_pulsateCritical = <?= $thermal_sensors_widget_pulsateCritical ? "true" : "false"; ?>;
+
+ //start showing temp data
+ //NOTE: the refresh interval will be reset to a proper value in showThermalSensorsData() (thermal_sensors.js).
+ jQuery(document).ready(function() {
+ showThermalSensorsData();
+ });
+//]]>
+</script>
+
+<input type="hidden" id="thermal_sensors-config" name="thermal_sensors-config" value="" />
+<div id="thermal_sensors-settings" class="widgetconfigdiv" style="display:none;">
+ <form action="/widgets/widgets/thermal_sensors.widget.php" method="post" id="thermal_sensors_widget_iform" name="thermal_sensors_widget_iform">
+ <table width="100%" border="0" summary="thermal sensors widget">
+ <tr>
+ <td align="left" colspan="2">
+ <span style="font-weight: bold" >Thresholds in &deg;C (1 to 100):</span>
+ </td>
+ <td align="right" colspan="1">
+ <span style="font-weight: bold" >Display settings:</span>
+ </td>
+ </tr>
+ <tr>
+ <td align="right">
+ Zone Warning:
+ </td>
+ <td>
+ <input type="text" maxlength="3" size="3" class="formfld unknown"
+ name="thermal_sensors_widget_zone_warning_threshold"
+ id="thermal_sensors_widget_zone_warning_threshold"
+ value="<?= $thermal_sensors_widget_zoneWarningTempThreshold; ?>" />
+ </td>
+ <td align="right">
+ <label for="thermal_sensors_widget_show_raw_output">Show raw output (no graph): </label>
+ <input type="checkbox"
+ id="thermal_sensors_widget_show_raw_output"
+ name="thermal_sensors_widget_show_raw_output"
+ value="<?= $thermal_sensors_widget_showRawOutput; ?>" <?= ($thermal_sensors_widget_showRawOutput) ? " checked='checked'" : ""; ?> />
+ </td>
+ </tr>
+ <tr>
+ <td align="right">
+ Zone Critical:
+ </td>
+ <td>
+ <input type="text" maxlength="3" size="3" class="formfld unknown"
+ name="thermal_sensors_widget_zone_critical_threshold"
+ id="thermal_sensors_widget_zone_critical_threshold"
+ value="<?= $thermal_sensors_widget_zoneCriticalTempThreshold; ?>" />
+ </td>
+ <td align="right">
+ <label for="thermal_sensors_widget_show_full_sensor_name">Show full sensor name: </label>
+ <input type="checkbox"
+ id="thermal_sensors_widget_show_full_sensor_name"
+ name="thermal_sensors_widget_show_full_sensor_name"
+ value="<?= $thermal_sensors_widget_showFullSensorName; ?>" <?= ($thermal_sensors_widget_showFullSensorName) ? " checked='checked'" : ""; ?> />
+ </td>
+ </tr>
+ <tr>
+ <td align="right">
+ Core Warning:
+ </td>
+ <td>
+ <input type="text" maxlength="3" size="3" class="formfld unknown"
+ name="thermal_sensors_widget_core_warning_threshold"
+ id="thermal_sensors_widget_core_warning_threshold"
+ value="<?= $thermal_sensors_widget_coreWarningTempThreshold ?>" />
+ </td>
+ <td align="right">
+ <label for="thermal_sensors_widget_pulsate_warning">Pulsate Warning: </label>
+ <input type="checkbox"
+ id="thermal_sensors_widget_pulsate_warning"
+ name="thermal_sensors_widget_pulsate_warning"
+ value="<?= $thermal_sensors_widget_pulsateWarning; ?>" <?= ($thermal_sensors_widget_pulsateWarning) ? " checked='checked'" : ""; ?> />
+ </td>
+ </tr>
+ <tr>
+ <td align="right">
+ Core Critical:
+ </td>
+ <td>
+ <input type="text" maxlength="3" size="3" class="formfld unknown"
+ name="thermal_sensors_widget_core_critical_threshold"
+ id="thermal_sensors_widget_core_critical_threshold"
+ value="<?= $thermal_sensors_widget_coreCriticalTempThreshold ?>" />
+ </td>
+ <td align="right">
+ <label for="thermal_sensors_widget_pulsate_critical">Pulsate Critical: </label>
+ <input type="checkbox"
+ id="thermal_sensors_widget_pulsate_critical"
+ name="thermal_sensors_widget_pulsate_critical"
+ value="<?= $thermal_sensors_widget_pulsateCritical; ?>" <?= ($thermal_sensors_widget_pulsateCritical) ? " checked='checked'" : ""; ?> />
+ </td>
+ </tr>
+ <tr>
+ <td align="right" colspan="3">
+ <input type="submit" id="thermal_sensors_widget_submit" name="thermal_sensors_widget_submit" class="formbtn" value="Save" />
+ </td>
+ </tr>
+ <tr>
+ <td align="left" colspan="3">
+ <span>* You can configure a proper Thermal Sensor / Module under <br />
+ &nbsp;&nbsp;&nbsp;<a href="system_advanced_misc.php">System &gt; Advanced &gt; Miscellaneous : Thermal Sensors section</a>.</span>
+ </td>
+ </tr>
+ </table>
+ </form>
+</div>
+
+<div style="padding: 5px">
+ <div id="thermalSensorsContainer" class="listr">
+ (Updating...)<br /><br />
+ </div>
+</div>
+
+<!-- needed to display the widget settings menu -->
+<script type="text/javascript">
+//<![CDATA[
+ textlink = jQuery("#thermal_sensors-configure");
+ textlink.css({display: "inline"});
+//]]>
+</script>
diff --git a/src/usr/local/www/widgets/widgets/traffic_graphs.widget.php b/src/usr/local/www/widgets/widgets/traffic_graphs.widget.php
new file mode 100644
index 0000000..c5f6286
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/traffic_graphs.widget.php
@@ -0,0 +1,193 @@
+<?php
+/*
+ traffic_graphs.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright 2007 Scott Dale
+ Part of pfSense widgets (https://www.pfsense.org)
+ originally based on m0n0wall (http://m0n0.ch/wall)
+
+ Copyright (C) 2004-2005 T. Lechat <dev@lechat.org>, Manuel Kasper <mk@neon1.net>
+ and Jonathan Watt <jwatt@jwatt.org>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("pfsense-utils.inc");
+require_once("functions.inc");
+
+$first_time = false;
+if (!is_array($config["widgets"]["trafficgraphs"])) {
+ $first_time = true;
+ $config["widgets"]["trafficgraphs"] = array();
+}
+$a_config = &$config["widgets"]["trafficgraphs"];
+
+if (!is_array($a_config["shown"])) {
+ $a_config["shown"] = array();
+}
+if (!is_array($a_config["shown"]["item"])) {
+ $a_config["shown"]["item"] = array();
+}
+
+$ifdescrs = get_configured_interface_with_descr();
+if (isset($config['ipsec']['enable'])) {
+ $ifdescrs['enc0'] = "IPsec";
+}
+
+if ($_POST) {
+ if (isset($_POST["refreshinterval"])) {
+ $a_config["refreshinterval"] = $_POST["refreshinterval"];
+ }
+ if (isset($_POST["scale_type"])) {
+ $a_config["scale_type"] = $_POST["scale_type"];
+ }
+ $a_config["shown"]["item"] = array();
+ foreach ($ifdescrs as $ifname => $ifdescr) {
+ $state = $_POST["shown"][$ifname];
+ if ($state === "show") {
+ $a_config["shown"]["item"][] = $ifname;
+ }
+ }
+ write_config("Updated traffic graph settings via dashboard.");
+ header("Location: /");
+ exit(0);
+}
+
+$shown = array();
+foreach ($a_config["shown"]["item"] as $if) {
+ $shown[$if] = true;
+}
+if ($first_time) {
+ $keys = array_keys($ifdescrs);
+ $shown[$keys[0]] = true;
+}
+
+if (isset($a_config["refreshinterval"])) {
+ $refreshinterval = $a_config["refreshinterval"];
+} else {
+ $refreshinterval = 10;
+}
+
+if (isset($a_config["scale_type"])) {
+ $scale_type = $a_config["scale_type"];
+} else {
+ $scale_type = "up";
+}
+
+?>
+<input type="hidden" id="traffic_graphs-config" name="traffic_graphs-config" value="" />
+
+<div id="traffic_graphs-settings" class="widgetconfigdiv" style="display:none;">
+<form action="/widgets/widgets/traffic_graphs.widget.php" method="post" name="traffic_graphs_widget_iform" id="traffic_graphs_widget_iform">
+ <?php foreach ($ifdescrs as $ifname => $ifdescr) { ?>
+ <input type="hidden" name="shown[<?= $ifname ?>]" value="<?= $shown[$ifname] ? "show" : "hide" ?>" />
+ <?php } ?>
+ Default AutoScale:
+ <?php
+ $scale_type_up="checked=\"checked\"";
+ $scale_type_follow="";
+ if (isset($config["widgets"]["trafficgraphs"]["scale_type"])) {
+ $selected_radio = $config["widgets"]["trafficgraphs"]["scale_type"];
+ if ($selected_radio == "up") {
+ $scale_type_up = "checked=\"checked\"";
+ $scale_type_follow="";
+ } else if ($selected_radio == "follow") {
+ $scale_type_up="";
+ $scale_type_follow = "checked=\"checked\"";
+ }
+ }
+ ?>
+ <input name="scale_type" class="radio" type="radio" id="scale_type_up" value="up" <?php echo $scale_type_up; ?> onchange="updateGraphDisplays();" /> <span>up</span>
+ <input name="scale_type" class="radio" type="radio" id="scale_type_follow" value="follow" <?php echo $scale_type_follow; ?> onchange="updateGraphDisplays();" /> <span>follow</span><br /><br />
+ Refresh Interval:
+ <select name="refreshinterval" class="formfld" id="refreshinterval" onchange="updateGraphDisplays();">
+ <?php for ($i = 1; $i <= 10; $i += 1) { ?>
+ <option value="<?= $i ?>" <?php if ($refreshinterval == $i) echo "selected=\"selected\"";?>><?= $i ?></option>
+ <?php } ?>
+ </select>&nbsp; Seconds<br />&nbsp; &nbsp; &nbsp; <b>Note:</b> changing this setting will increase CPU utilization<br /><br />
+ <input id="traffic_graphs_widget_submit" name="traffic_graphs_widget_submit" type="submit" onclick="return updatePref();" class="formbtn" value="Save Settings" />
+</form>
+</div>
+
+<script type="text/javascript">
+//<![CDATA[
+ d = document;
+ selectIntLink = "traffic_graphs-configure";
+ textlink = d.getElementById(selectIntLink);
+ textlink.style.display = "inline";
+//]]>
+</script>
+
+<?php
+$graphcounter = 0;
+foreach ($ifdescrs as $ifname => $ifdescr) {
+ $ifinfo = get_interface_info($ifname);
+ if ($shown[$ifname]) {
+ $mingraphbutton = "inline";
+ $showgraphbutton = "none";
+ $graphdisplay = "inline";
+ $interfacevalue = "show";
+ $graphcounter++;
+ } else {
+ $mingraphbutton = "none";
+ $showgraphbutton = "inline";
+ $graphdisplay = "none";
+ $interfacevalue = "hide";
+ }
+ if ($ifinfo['status'] != "down") { ?>
+ <div id="<?=$ifname;?>trafficdiv" style="padding: 5px">
+ <div id="<?=$ifname;?>topic" class="widgetsubheader">
+ <div style="float:left;width:49%">
+ <span onclick="location.href='/status_graph.php?if=<?=$ifname;?>'" style="cursor:pointer">Current <?=$ifdescr;?> Traffic</span>
+ </div>
+ <div align="right" style="float:right;width:49%">
+ <div id="<?=$ifname;?>graphdiv-min" onclick='return trafficminimizeDiv("<?= $ifname ?>", true);'
+ style="display:<?php echo $mingraphbutton;?>; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_minus.gif" alt="Minimize <?=$ifname;?> traffic graph" /></div>
+ <div id="<?=$ifname;?>graphdiv-open" onclick='return trafficshowDiv("<?= $ifname ?>", "<?= rawurlencode($ifdescr); ?>", "<?= $refreshinterval ?>", true);'
+ style="display:<?php echo $showgraphbutton;?>; cursor:pointer" ><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_open.gif" alt="Show <?=$ifname;?> traffic graph" /></div>
+ </div>
+ <div style="clear:both;"></div>
+ </div>
+ <div id="<?=$ifname;?>graphdiv" style="display:<?php echo $graphdisplay;?>">
+<?php
+ // If the graph is already enabled by the config then put the object inside the div now.
+ // Otherwise the graph object is inserted by trafficshowDiv JS when the user opens it.
+ if ($graphdisplay == "inline") {
+?>
+ <object data="graph.php?ifnum=<?=$ifname;?>&amp;ifname=<?=rawurlencode($ifdescr);?>&amp;timeint=<?=$refreshinterval;?>&amp;initdelay=<?=$graphcounter * 2;?>" height="100%" width="100%">
+ <param name="id" value="graph" />
+ <param name="type" value="image/svg+xml" />
+ <param name="pluginspage" value="http://www.adobe.com/svg/viewer/install/auto" />
+ </object>
+<?php
+ }
+?>
+ </div>
+ </div>
+ <?php }
+}
+?>
diff --git a/src/usr/local/www/widgets/widgets/wake_on_lan.widget.php b/src/usr/local/www/widgets/widgets/wake_on_lan.widget.php
new file mode 100644
index 0000000..9cb760a
--- /dev/null
+++ b/src/usr/local/www/widgets/widgets/wake_on_lan.widget.php
@@ -0,0 +1,80 @@
+<?php
+/*
+ wake_on_lan.widget.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+
+ Copyright (C) 2010 Yehuda Katz
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INClUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+$nocsrf = true;
+
+require_once("guiconfig.inc");
+require_once("/usr/local/www/widgets/include/wake_on_lan.inc");
+
+if (is_array($config['wol']['wolentry'])) {
+ $wolcomputers = $config['wol']['wolentry'];
+} else {
+ $wolcomputers = array();
+}
+
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="wol status">
+ <tr>
+ <?php
+ echo '<td class="widgetsubheader" align="center">' . gettext("Computer / Device") . '</td>';
+ echo '<td class="widgetsubheader" align="center">' . gettext("Interface") . '</td>';
+ echo '<td class="widgetsubheader" align="center">' . gettext("Status") . '</td>';
+ ?>
+ <td class="widgetsubheader">&nbsp;</td>
+ </tr>
+<?php
+
+if (count($wolcomputers) > 0) {
+ foreach ($wolcomputers as $wolent) {
+ echo '<tr><td class="listlr">' . $wolent['descr'] . '<br />' . $wolent['mac'] . '</td>' . "\n";
+ echo '<td class="listr">' . convert_friendly_interface_to_friendly_descr($wolent['interface']) . '</td>' . "\n";
+
+ $is_active = exec("/usr/sbin/arp -an |/usr/bin/grep {$wolent['mac']}| /usr/bin/wc -l|/usr/bin/awk '{print $1;}'");
+ if ($is_active == 1) {
+ echo '<td class="listr" align="center">' . "\n";
+ echo "<img src=\"/themes/" . $g["theme"] . "/images/icons/icon_pass.gif\" alt=\"pass\" /> " . gettext("Online") . "</td>\n";
+ } else {
+ echo '<td class="listbg" align="center">' . "\n";
+ echo "<img src=\"/themes/" . $g["theme"] . "/images/icons/icon_block.gif\" alt=\"block\" />&nbsp;<font color=\"white\">" . gettext("Offline") . "</font></td>\n";
+ }
+ echo '<td valign="middle" class="list nowrap">';
+ /*if ($is_active) { */
+ /* Will always show wake-up button even if pfsense thinks it is awake */
+ /* } else { */
+ echo "<a href='services_wol.php?mac={$wolent['mac']}&amp;if={$wolent['interface']}'> ";
+ echo "<img title='" . gettext("Wake Up") . "' border='0' src='./themes/".$g['theme']."/images/icons/icon_wol_all.gif' alt='wol' /></a>\n";
+ /* } */
+ echo "</td></tr>\n";
+ }
+} else {
+ echo "<tr><td colspan=\"4\" align=\"center\">" . gettext("No saved WoL addresses") . ".</td></tr>\n";
+}
+?>
+</table>
+<center><a href="status_dhcp_leases.php" class="navlink">DHCP Leases Status</a></center>
diff --git a/src/usr/local/www/wizard.php b/src/usr/local/www/wizard.php
new file mode 100644
index 0000000..adab493
--- /dev/null
+++ b/src/usr/local/www/wizard.php
@@ -0,0 +1,1061 @@
+<?php
+/* $Id$ */
+/*
+ wizard.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2010 Ermal Luçi
+ Copyright (C) 2004 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-pfsensewizardsubsystem
+##|*NAME=pfSense wizard subsystem page
+##|*DESCR=Allow access to the 'pfSense wizard subsystem' page.
+##|*MATCH=wizard.php*
+##|-PRIV
+
+
+require("globals.inc");
+require("guiconfig.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("shaper.inc");
+require_once("rrd.inc");
+
+function gentitle_pkg($pgname) {
+ global $config;
+ return $config['system']['hostname'] . "." . $config['system']['domain'] . " - " . $pgname;
+}
+
+global $g;
+
+$stepid = htmlspecialchars($_GET['stepid']);
+if (isset($_POST['stepid'])) {
+ $stepid = htmlspecialchars($_POST['stepid']);
+}
+if (!$stepid) {
+ $stepid = "0";
+}
+
+$xml = htmlspecialchars($_GET['xml']);
+if ($_POST['xml']) {
+ $xml = htmlspecialchars($_POST['xml']);
+}
+
+if (empty($xml)) {
+ $xml = "not_defined";
+ print_info_box_np(sprintf(gettext("ERROR: Could not open %s."), $xml));
+ die;
+} else {
+ if (file_exists("{$g['www_path']}/wizards/{$xml}")) {
+ $pkg = parse_xml_config_pkg("{$g['www_path']}/wizards/" . $xml, "pfsensewizard");
+ } else {
+ print_info_box_np(sprintf(gettext("ERROR: Could not open %s."), $xml));
+ die;
+ }
+}
+
+if (!is_array($pkg)) {
+ print_info_box_np(sprintf(gettext("ERROR: Could not parse %s/wizards/%s file."), $g['www_path'], $xml));
+ die;
+}
+
+$title = preg_replace("/pfSense/i", $g['product_name'], $pkg['step'][$stepid]['title']);
+$description = preg_replace("/pfSense/i", $g['product_name'], $pkg['step'][$stepid]['description']);
+$totalsteps = $pkg['totalsteps'];
+
+if ($pkg['includefile']) {
+ require_once($pkg['includefile']);
+}
+
+if ($pkg['step'][$stepid]['includefile']) {
+ require_once($pkg['step'][$stepid]['includefile']);
+}
+
+if ($pkg['step'][$stepid]['stepsubmitbeforesave']) {
+ eval($pkg['step'][$stepid]['stepsubmitbeforesave']);
+}
+
+if ($_POST && !$input_errors) {
+ foreach ($pkg['step'][$stepid]['fields']['field'] as $field) {
+ if (!empty($field['bindstofield']) and $field['type'] <> "submit") {
+ $fieldname = $field['name'];
+ $fieldname = str_replace(" ", "", $fieldname);
+ $fieldname = strtolower($fieldname);
+ // update field with posted values.
+ if ($field['unsetfield'] <> "") {
+ $unset_fields = "yes";
+ } else {
+ $unset_fields = "";
+ }
+ if ($field['arraynum'] <> "") {
+ $arraynum = $field['arraynum'];
+ } else {
+ $arraynum = "";
+ }
+
+ update_config_field($field['bindstofield'], $_POST[$fieldname], $unset_fields, $arraynum, $field['type']);
+ }
+
+ }
+ // run custom php code embedded in xml config.
+ if ($pkg['step'][$stepid]['stepsubmitphpaction'] <> "") {
+ eval($pkg['step'][$stepid]['stepsubmitphpaction']);
+ }
+ if (!$input_errors) {
+ write_config();
+ }
+ $stepid++;
+ if ($stepid > $totalsteps) {
+ $stepid = $totalsteps;
+ }
+}
+
+function update_config_field($field, $updatetext, $unset, $arraynum, $field_type) {
+ global $config;
+ $field_split = explode("->", $field);
+ foreach ($field_split as $f) {
+ $field_conv .= "['" . $f . "']";
+ }
+ if ($field_conv == "") {
+ return;
+ }
+ if ($arraynum <> "") {
+ $field_conv .= "[" . $arraynum . "]";
+ }
+ if (($field_type == "checkbox" and $updatetext <> "on") || $updatetext == "") {
+ /*
+ * item is a checkbox, it should have the value "on"
+ * if it was checked
+ */
+ $var = "\$config{$field_conv}";
+ $text = "if (isset({$var})) unset({$var});";
+ eval($text);
+ return;
+ }
+
+ if ($field_type == "interfaces_selection") {
+ $var = "\$config{$field_conv}";
+ $text = "if (isset({$var})) unset({$var});";
+ $text .= "\$config" . $field_conv . " = \"" . $updatetext . "\";";
+ eval($text);
+ return;
+ }
+
+ if ($unset == "yes") {
+ $text = "unset(\$config" . $field_conv . ");";
+ eval($text);
+ }
+ $text = "\$config" . $field_conv . " = \"" . addslashes($updatetext) . "\";";
+ eval($text);
+}
+
+$title = preg_replace("/pfSense/i", $g['product_name'], $pkg['step'][$stepid]['title']);
+$description = preg_replace("/pfSense/i", $g['product_name'], $pkg['step'][$stepid]['description']);
+
+// handle before form display event.
+do {
+ $oldstepid = $stepid;
+ if ($pkg['step'][$stepid]['stepbeforeformdisplay'] <> "") {
+ eval($pkg['step'][$stepid]['stepbeforeformdisplay']);
+ }
+} while ($oldstepid != $stepid);
+
+$closehead = false;
+$pgtitle = array($title);
+include("head.inc");
+
+if (file_exists("/usr/local/www/themes/{$g['theme']}/wizard.css")) {
+ echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/wizard.css\" media=\"all\" />\n";
+} else {
+ echo "<link type=\"text/css\" rel=\"stylesheet\" href=\"/themes/{$g['theme']}/all.css\" media=\"all\" />";
+}
+?>
+</head>
+<body link="#0000CC" vlink="#0000CC" alink="#0000CC" >
+
+<?php if ($pkg['step'][$stepid]['fields']['field'] <> "") { ?>
+<script type="text/javascript">
+//<![CDATA[
+
+function FieldValidate(userinput, regexp, message) {
+ if (!userinput.match(regexp)) {
+ alert(message);
+ }
+}
+
+function enablechange() {
+<?php
+ foreach ($pkg['step'][$stepid]['fields']['field'] as $field) {
+ if (isset($field['enablefields']) or isset($field['checkenablefields'])) {
+ print "\t" . 'if (document.iform.' . strtolower($field['name']) . '.checked) {' . "\n";
+ if (isset($field['enablefields'])) {
+ $enablefields = explode(',', $field['enablefields']);
+ foreach ($enablefields as $enablefield) {
+ $enablefield = strtolower($enablefield);
+ print "\t\t" . 'document.iform.' . $enablefield . '.disabled = 0;' . "\n";
+ }
+ }
+ if (isset($field['checkenablefields'])) {
+ $checkenablefields = explode(',', $field['checkenablefields']);
+ foreach ($checkenablefields as $checkenablefield) {
+ $checkenablefield = strtolower($checkenablefield);
+ print "\t\t" . 'document.iform.' . $checkenablefield . '.checked = 0;' . "\n";
+ }
+ }
+ print "\t" . '} else {' . "\n";
+ if (isset($field['enablefields'])) {
+ $enablefields = explode(',', $field['enablefields']);
+ foreach ($enablefields as $enablefield) {
+ $enablefield = strtolower($enablefield);
+ print "\t\t" . 'document.iform.' . $enablefield . '.disabled = 1;' . "\n";
+ }
+ }
+ if (isset($field['checkenablefields'])) {
+ $checkenablefields = explode(',', $field['checkenablefields']);
+ foreach ($checkenablefields as $checkenablefield) {
+ $checkenablefield = strtolower($checkenablefield);
+ print "\t\t" . 'document.iform.' . $checkenablefield . '.checked = 1;' . "\n";
+ }
+ }
+ print "\t" . '}' . "\n";
+ }
+ }
+?>
+}
+
+function disablechange() {
+<?php
+ foreach ($pkg['step'][$stepid]['fields']['field'] as $field) {
+ if (isset($field['disablefields']) or isset($field['checkdisablefields'])) {
+ print "\t" . 'if (document.iform.' . strtolower($field['name']) . '.checked) {' . "\n";
+ if (isset($field['disablefields'])) {
+ $enablefields = explode(',', $field['disablefields']);
+ foreach ($enablefields as $enablefield) {
+ $enablefield = strtolower($enablefield);
+ print "\t\t" . 'document.iform.' . $enablefield . '.disabled = 1;' . "\n";
+ }
+ }
+ if (isset($field['checkdisablefields'])) {
+ $checkenablefields = explode(',', $field['checkdisablefields']);
+ foreach ($checkenablefields as $checkenablefield) {
+ $checkenablefield = strtolower($checkenablefield);
+ print "\t\t" . 'document.iform.' . $checkenablefield . '.checked = 1;' . "\n";
+ }
+ }
+ print "\t" . '} else {' . "\n";
+ if (isset($field['disablefields'])) {
+ $enablefields = explode(',', $field['disablefields']);
+ foreach ($enablefields as $enablefield) {
+ $enablefield = strtolower($enablefield);
+ print "\t\t" . 'document.iform.' . $enablefield . '.disabled = 0;' . "\n";
+ }
+ }
+ if (isset($field['checkdisablefields'])) {
+ $checkenablefields = explode(',', $field['checkdisablefields']);
+ foreach ($checkenablefields as $checkenablefield) {
+ $checkenablefield = strtolower($checkenablefield);
+ print "\t\t" . 'document.iform.' . $checkenablefield . '.checked = 0;' . "\n";
+ }
+ }
+ print "\t" . '}' . "\n";
+ }
+ }
+?>
+}
+
+function showchange() {
+<?php
+ foreach ($pkg['step'][$stepid]['fields']['field'] as $field) {
+ if (isset($field['showfields'])) {
+ print "\t" . 'if (document.iform.' . strtolower($field['name']) . '.checked == false) {' . "\n";
+ if (isset($field['showfields'])) {
+ $showfields = explode(',', $field['showfields']);
+ foreach ($showfields as $showfield) {
+ $showfield = strtolower($showfield);
+ //print "\t\t" . 'document.iform.' . $showfield . ".display =\"none\";\n";
+ print "\t\t jQuery('#". $showfield . "').hide();";
+ }
+ }
+ print "\t" . '} else {' . "\n";
+ if (isset($field['showfields'])) {
+ $showfields = explode(',', $field['showfields']);
+ foreach ($showfields as $showfield) {
+ $showfield = strtolower($showfield);
+ #print "\t\t" . 'document.iform.' . $showfield . ".display =\"\";\n";
+ print "\t\t jQuery('#". $showfield . "').show();";
+ }
+ }
+ print "\t" . '}' . "\n";
+ }
+ }
+?>
+}
+//]]>
+</script>
+<?php } ?>
+
+<form action="wizard.php" method="post" name="iform" id="iform">
+<input type="hidden" name="xml" value="<?= htmlspecialchars($xml) ?>" />
+<input type="hidden" name="stepid" value="<?= htmlspecialchars($stepid) ?>" />
+
+<center>
+
+&nbsp;<br />
+
+<?php
+ if ($title == "Reload in progress") {
+ $ip = fixup_string("\$myurl");
+ } else {
+ $ip = "/";
+ }
+ echo "<a href='$ip'>";
+?>
+<img border="0" src="./themes/<?= $g['theme']; ?>/images/logo.gif" alt="logo" /></a>
+<p>&nbsp;</p>
+<div style="width:800px;background-color:#ffffff" id="roundme">
+<?php
+ if ($input_errors) {
+ print_input_errors($input_errors);
+ }
+ if ($savemsg) {
+ print_info_box($savemsg);
+ }
+ if ($_GET['message'] != "") {
+ print_info_box(htmlspecialchars($_GET['message']));
+ }
+ if ($_POST['message'] != "") {
+ print_info_box(htmlspecialchars($_POST['message']));
+ }
+?>
+<table bgcolor="#ffffff" width="95%" border="0" cellspacing="0" cellpadding="2" summary="wizard">
+ <!-- wizard goes here -->
+ <tr><td>&nbsp;</td></tr>
+ <tr>
+ <td class="tabcont">
+ <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area">
+ <tr>
+ <td colspan="2" align="center"><font size="2"><b><?= fixup_string($description) ?></b></font></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ </tr>
+<?php
+ if (!$pkg['step'][$stepid]['disableheader']) {
+ echo "<tr><td colspan=\"2\" class=\"listtopic\">" . fixup_string($title) . "</td></tr>";
+ }
+?>
+
+<?php
+ $inputaliases = array();
+ if ($pkg['step'][$stepid]['fields']['field'] <> "") {
+ foreach ($pkg['step'][$stepid]['fields']['field'] as $field) {
+
+ $value = $field['value'];
+ $name = $field['name'];
+
+ $name = preg_replace("/\s+/", "", $name);
+ $name = strtolower($name);
+
+ if ($field['bindstofield'] <> "") {
+ $arraynum = "";
+ $field_conv = "";
+ $field_split = explode("->", $field['bindstofield']);
+ // arraynum is used in cases where there is an array of the same field
+ // name such as dnsserver (2 of them)
+ if ($field['arraynum'] <> "") {
+ $arraynum = "[" . $field['arraynum'] . "]";
+ }
+ foreach ($field_split as $f) {
+ $field_conv .= "['" . $f . "']";
+ }
+ if ($field['type'] == "checkbox") {
+ $toeval = "if (isset(\$config" . $field_conv . $arraynum . ")) { \$value = \$config" . $field_conv . $arraynum . "; if (empty(\$value)) \$value = true; }";
+ } else {
+ $toeval = "if (isset(\$config" . $field_conv . $arraynum . ")) \$value = \$config" . $field_conv . $arraynum . ";";
+ }
+ eval($toeval);
+ }
+
+ if (!$field['combinefieldsend']) {
+ echo "<tr>";
+ }
+
+ switch ($field['type']) {
+ case "input":
+ if ($field['displayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo $field['displayname'];
+ echo ":</td>\n";
+ } else if (!$field['dontdisplayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['name']);
+ echo ":</td>\n";
+ }
+ if (!$field['dontcombinecells']) {
+ echo "<td class=\"vtable\">\n";
+ }
+
+ echo "<input class='formfld unknown' id='" . $name . "' name='" . $name . "' value=\"" . htmlspecialchars($value) . "\"";
+ if ($field['size']) {
+ echo " size='" . $field['size'] . "' ";
+ }
+ if ($field['validate']) {
+ echo " onchange='FieldValidate(this.value, \"{$field['validate']}\", \"{$field['message']}\");'";
+ }
+ echo " />\n";
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+ break;
+ case "text":
+ echo "<td colspan=\"2\" align=\"center\" class=\"vncell\">\n";
+ if ($field['description'] <> "") {
+ echo "<center><br /> " . $field['description'] . "</center>";
+ }
+ break;
+ case "inputalias":
+ if ($field['displayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo $field['displayname'];
+ echo ":</td>\n";
+ } else if (!$field['dontdisplayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['name']);
+ echo ":</td>\n";
+ }
+ if (!$field['dontcombinecells']) {
+ echo "<td class=\"vtable\">\n";
+ }
+
+ $inputaliases[] = $name;
+ echo "<input class='formfldalias' autocomplete='off' id='" . $name . "' name='" . $name . "' value=\"" . htmlspecialchars($value) . "\"";
+ if ($field['size']) {
+ echo " size='" . $field['size'] . "' ";
+ }
+ if ($field['validate']) {
+ echo " onchange='FieldValidate(this.value, \"{$field['validate']}\", \"{$field['message']}\");'";
+ }
+ echo " />\n";
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+ break;
+ case "interfaces_selection":
+ case "interface_select":
+ $size = "";
+ $multiple = "";
+ $name = strtolower($name);
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['displayname'] ? $field['displayname'] : $field['name']) . ":\n";
+ echo "</td>";
+ echo "<td class=\"vtable\">\n";
+ if ($field['size'] <> "") {
+ $size = "size=\"{$field['size']}\"";
+ }
+ if ($field['multiple'] <> "" and $field['multiple'] <> "0") {
+ $multiple = "multiple=\"multiple\"";
+ $name .= "[]";
+ }
+ echo "<select class='formselect' id='{$name}' name='{$name}' {$size} {$multiple}>\n";
+ if ($field['add_to_interfaces_selection'] <> "") {
+ $SELECTED = "";
+ if ($field['add_to_interfaces_selection'] == $value) {
+ $SELECTED = " selected=\"selected\"";
+ }
+ echo "<option value='" . $field['add_to_interfaces_selection'] . "'" . $SELECTED . ">" . $field['add_to_interfaces_selection'] . "</option>\n";
+ }
+ if ($field['type'] == "interface_select") {
+ $interfaces = get_interface_list();
+ } else {
+ $interfaces = get_configured_interface_with_descr();
+ }
+ foreach ($interfaces as $ifname => $iface) {
+ if ($field['type'] == "interface_select") {
+ $iface = $ifname;
+ if ($iface['mac']) {
+ $iface .= " ({$iface['mac']})";
+ }
+ }
+ $SELECTED = "";
+ if ($value == $ifname) $SELECTED = " selected=\"selected\"";
+ $to_echo = "<option value='" . $ifname . "'" . $SELECTED . ">" . $iface . "</option>\n";
+ $to_echo .= "<!-- {$value} -->";
+ $canecho = 0;
+ if ($field['interface_filter'] <> "") {
+ if (stristr($ifname, $field['interface_filter']) == true) {
+ $canecho = 1;
+ }
+ } else {
+ $canecho = 1;
+ }
+ if ($canecho == 1) {
+ echo $to_echo;
+ }
+ }
+ echo "</select>\n";
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+
+ break;
+ case "password":
+ if ($field['displayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo $field['displayname'];
+ echo ":</td>\n";
+ } else if (!$field['dontdisplayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['name']);
+ echo ":</td>\n";
+ }
+ if (!$field['dontcombinecells']) {
+ echo "<td class=\"vtable\">";
+ }
+ echo "<input class='formfld pwd' id='" . $name . "' name='" . $name . "' value=\"" . htmlspecialchars($value) . "\" type='password' ";
+ if ($field['size']) {
+ echo " size='" . $field['size'] . "' ";
+ }
+ echo " />\n";
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+
+ break;
+ case "certca_selection":
+ $size = "";
+ $multiple = "";
+ $name = strtolower($name);
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['displayname'] ? $field['displayname'] : $field['name']) . ":\n";
+ echo "</td>";
+ echo "<td class=\"vtable\">\n";
+ if ($field['size'] <> "") {
+ $size = "size=\"{$field['size']}\"";
+ }
+ echo "<select id='{$name}' name='{$name}' {$size}>\n";
+ if ($field['add_to_certca_selection'] <> "") {
+ $SELECTED = "";
+ if ($field['add_to_certca_selection'] == $value) {
+ $SELECTED = " selected=\"selected\"";
+ }
+ echo "<option value='" . $field['add_to_certca_selection'] . "'" . $SELECTED . ">" . $field['add_to_certca_selection'] . "</option>\n";
+ }
+ foreach ($config['ca'] as $ca) {
+ $name = htmlspecialchars($ca['descr']);
+ $SELECTED = "";
+ if ($value == $name) $SELECTED = " selected=\"selected\"";
+ $to_echo = "<option value='" . $ca['refid'] . "'" . $SELECTED . ">" . $name . "</option>\n";
+ $to_echo .= "<!-- {$value} -->";
+ $canecho = 0;
+ if ($field['certca_filter'] <> "") {
+ if (stristr($name, $field['certca_filter']) == true) {
+ $canecho = 1;
+ }
+ } else {
+ $canecho = 1;
+ }
+ if ($canecho == 1) {
+ echo $to_echo;
+ }
+ }
+ echo "</select>\n";
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+
+ break;
+ case "cert_selection":
+ $size = "";
+ $multiple = "";
+ $name = strtolower($name);
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['displayname'] ? $field['displayname'] : $field['name']) . ":\n";
+ echo "</td>";
+ echo "<td class=\"vtable\">\n";
+ if ($field['size'] <> "") {
+ $size = "size=\"{$field['size']}\"";
+ }
+ echo "<select id='{$name}' name='{$name}' {$size}>\n";
+ if ($field['add_to_cert_selection'] <> "") {
+ $SELECTED = "";
+ if ($field['add_to_cert_selection'] == $value) {
+ $SELECTED = " selected=\"selected\"";
+ }
+ echo "<option value='" . $field['add_to_cert_selection'] . "'" . $SELECTED . ">" . $field['add_to_cert_selection'] . "</option>\n";
+ }
+ foreach ($config['cert'] as $ca) {
+ if (stristr($ca['descr'], "webconf")) {
+ continue;
+ }
+ $name = htmlspecialchars($ca['descr']);
+ $SELECTED = "";
+ if ($value == $name) {
+ $SELECTED = " selected=\"selected\"";
+ }
+ $to_echo = "<option value='" . $ca['refid'] . "'" . $SELECTED . ">" . $name . "</option>\n";
+ $to_echo .= "<!-- {$value} -->";
+ $canecho = 0;
+ if ($field['cert_filter'] <> "") {
+ if (stristr($name, $field['cert_filter']) == true) {
+ $canecho = 1;
+ }
+ } else {
+ $canecho = 1;
+ }
+ if ($canecho == 1) {
+ echo $to_echo;
+ }
+ }
+ echo "</select>\n";
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+
+ break;
+ case "select":
+ if ($field['displayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo $field['displayname'];
+ echo ":</td>\n";
+ } else if (!$field['dontdisplayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['name']);
+ echo ":</td>\n";
+ }
+ if ($field['size']) {
+ $size = " size='" . $field['size'] . "' ";
+ }
+ if ($field['multiple'] == "yes") {
+ $multiple = "multiple=\"multiple\" ";
+ }
+ if (!$field['dontcombinecells']) {
+ echo "<td class=\"vtable\">\n";
+ }
+ $onchange = "";
+ foreach ($field['options']['option'] as $opt) {
+ if ($opt['enablefields'] <> "") {
+ $onchange = "onchange=\"enableitems(this.selectedIndex);\" ";
+ }
+ }
+ echo "<select class='formselect' " . $onchange . $multiple . $size . "id='" . $name . "' name='" . $name . "'>\n";
+ foreach ($field['options']['option'] as $opt) {
+ $selected = "";
+ if ($value == $opt['value']) {
+ $selected = " selected=\"selected\"";
+ }
+ echo "\t<option value='" . $opt['value'] . "'" . $selected . ">";
+ if ($opt['displayname']) {
+ echo $opt['displayname'];
+ } else {
+ echo $opt['name'];
+ }
+ echo "</option>\n";
+ }
+ echo "</select>\n";
+ echo "<!-- {$value} -->\n";
+
+ if ($field['description'] <> "") {
+ echo $field['description'];
+ }
+
+ break;
+ case "textarea":
+ if ($field['displayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo $field['displayname'];
+ echo ":</td>\n";
+ } else if (!$field['dontdisplayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['name']);
+ echo ":</td>";
+ }
+ if (!$field['dontcombinecells']) {
+ echo "<td class=\"vtable\">";
+ }
+ echo "<textarea class='formpre' id='" . $name . "' name='" . $name . "'";
+ if ($field['rows']) {
+ echo " rows='" . $field['rows'] . "' ";
+ }
+ if ($field['cols']) {
+ echo " cols='" . $field['cols'] . "' ";
+ }
+ echo ">" . $value . "</textarea>\n";
+
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+
+ break;
+ case "submit":
+ echo "<td>&nbsp;<br /></td></tr>";
+ echo "<tr><td colspan=\"2\" align=\"center\">";
+ echo "<input type='submit' name='" . $name . "' value=\"" . htmlspecialchars($field['name']) . "\" />\n";
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+
+ break;
+ case "listtopic":
+ echo "<td>&nbsp;</td></tr>";
+ echo "<tr><td colspan=\"2\" class=\"listtopic\">" . $field['name'] . "<br />\n";
+
+ break;
+ case "subnet_select":
+ if ($field['displayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo $field['displayname'];
+ echo ":</td>\n";
+ } else if (!$field['dontdisplayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['name']);
+ echo ":</td>";
+ }
+ if (!$field['dontcombinecells']) {
+ echo "<td class=\"vtable\">";
+ }
+ echo "<select class='formselect' name='{$name}'>\n";
+ for ($x=1; $x<33; $x++) {
+ $CHECKED = "";
+ if ($value == $x) {
+ $CHECKED = " selected=\"selected\"";
+ }
+ if ($x <> 31) {
+ echo "<option value='{$x}' {$CHECKED}>{$x}</option>\n";
+ }
+ }
+ echo "</select>\n";
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+
+ break;
+ case "timezone_select":
+ exec('/usr/bin/tar -tzf /usr/share/zoneinfo.tgz', $timezonelist);
+ $timezonelist = array_filter($timezonelist, 'is_timezone');
+ sort($timezonelist);
+
+ /* kill carriage returns */
+ for ($x = 0; $x < count($timezonelist); $x++) {
+ $timezonelist[$x] = str_replace("\n", "", $timezonelist[$x]);
+ }
+
+ if ($field['displayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo $field['displayname'];
+ echo ":</td>\n";
+ } else if (!$field['dontdisplayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo fixup_string($field['name']);
+ echo ":</td>";
+ }
+ if (!$field['dontcombinecells']) {
+ echo "<td class=\"vtable\">";
+ }
+ echo "<select class='formselect' name='{$name}'>\n";
+ foreach ($timezonelist as $tz) {
+ if (strstr($tz, "GMT")) {
+ continue;
+ }
+ $SELECTED = "";
+ if ($value == $tz) {
+ $SELECTED = " selected=\"selected\"";
+ }
+ echo "<option value=\"" . htmlspecialchars($tz) . "\" {$SELECTED}>";
+ echo htmlspecialchars($tz);
+ echo "</option>\n";
+ }
+ echo "</select>\n";
+
+ if ($field['description'] <> "") {
+ echo "<br /> " . $field['description'];
+ }
+
+ break;
+ case "checkbox":
+ if ($field['displayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo $field['displayname'];
+ echo ":</td>\n";
+ } else if (!$field['dontdisplayname']) {
+ echo "<td width=\"22%\" align=\"right\" class=\"vncellreq\">\n";
+ echo $field['name'];
+ echo ":</td>";
+ }
+ $checked = "";
+ if ($value <> "") {
+ $checked = " checked=\"checked\"";
+ }
+ echo "<td class=\"vtable\"><input value=\"on\" type='checkbox' id='" . $name . "' name='" . $name . "' " . $checked;
+ if (isset($field['enablefields']) or isset($field['checkenablefields'])) {
+ echo " onclick=\"enablechange()\"";
+ } else if (isset($field['disablefields']) or isset($field['checkdisablefields'])) {
+ echo " onclick=\"disablechange()\"";
+ }
+ echo " />\n";
+
+ if ($field['description'] <> "") {
+ echo $field['description'];
+ }
+
+ break;
+ }
+
+ if ($field['typehint'] <> "") {
+ echo $field['typehint'];
+ }
+ if ($field['warning'] <> "") {
+ echo "<br /><b><font color=\"red\">" . $field['warning'] . "</font></b>";
+ }
+
+ if (!$field['combinefieldsbegin']) {
+ if (!$field['dontcombinecells']) {
+ echo "</td>";
+ }
+
+ echo "</tr>\n";
+ }
+
+ }
+ }
+?>
+ </table>
+ </td>
+ </tr>
+</table>
+<br />&nbsp;
+</div>
+</center>
+</form>
+<script type="text/javascript">
+//<![CDATA[
+ if (typeof ext_change != 'undefined') {
+ ext_change();
+ }
+ if (typeof proto_change != 'undefined') {
+ ext_change();
+ }
+ if (typeof proto_change != 'undefined') {
+ proto_change();
+ }
+
+<?php
+ $isfirst = 0;
+ $aliases = "";
+ $addrisfirst = 0;
+ $aliasesaddr = "";
+ if ($config['aliases']['alias'] <> "" and is_array($config['aliases']['alias'])) {
+ foreach ($config['aliases']['alias'] as $alias_name) {
+ if ($isfirst == 1) {
+ $aliases .= ",";
+ }
+ $aliases .= "'" . $alias_name['name'] . "'";
+ $isfirst = 1;
+ }
+ }
+?>
+
+ var customarray=new Array(<?php echo $aliases; ?>);
+
+ window.onload = function () {
+
+<?php
+ $counter = 0;
+ foreach ($inputaliases as $alias) {
+ echo "var oTextbox$counter = new AutoSuggestControl(document.getElementById(\"$alias\"), new StateSuggestions(customarray));\n";
+ $counter++;
+ }
+?>
+
+ }
+
+//]]>
+</script>
+
+<?php
+
+$fieldnames_array = Array();
+if ($pkg['step'][$stepid]['disableallfieldsbydefault'] <> "") {
+ // create a fieldname loop that can be used with javascript
+ // hide and enable features.
+ echo "\n<script type=\"text/javascript\">\n";
+ echo "//<![CDATA[\n";
+ echo "function disableall() {\n";
+ foreach ($pkg['step'][$stepid]['fields']['field'] as $field) {
+ if ($field['type'] <> "submit" and $field['type'] <> "listtopic") {
+ if (!$field['donotdisable'] <> "") {
+ array_push($fieldnames_array, $field['name']);
+ $fieldname = preg_replace("/\s+/", "", $field['name']);
+ $fieldname = strtolower($fieldname);
+ echo "\tdocument.forms[0]." . $fieldname . ".disabled = 1;\n";
+ }
+ }
+ }
+ echo "}\ndisableall();\n";
+ echo "function enableitems(selectedindex) {\n";
+ echo "disableall();\n";
+ $idcounter = 0;
+ if ($pkg['step'][$stepid]['fields']['field'] <> "") {
+ echo "\tswitch (selectedindex) {\n";
+ foreach ($pkg['step'][$stepid]['fields']['field'] as $field) {
+ if ($field['options']['option'] <> "") {
+ foreach ($field['options']['option'] as $opt) {
+ if ($opt['enablefields'] <> "") {
+ echo "\t\tcase " . $idcounter . ":\n";
+ $enablefields_split = explode(",", $opt['enablefields']);
+ foreach ($enablefields_split as $efs) {
+ $fieldname = preg_replace("/\s+/", "", $efs);
+ $fieldname = strtolower($fieldname);
+ if ($fieldname <> "") {
+ $onchange = "\t\t\tdocument.forms[0]." . $fieldname . ".disabled = 0; \n";
+ echo $onchange;
+ }
+ }
+ echo "\t\t\tbreak;\n";
+ }
+ $idcounter = $idcounter + 1;
+ }
+ }
+ }
+ echo "\t}\n";
+ }
+ echo "}\n";
+ echo "//]]>\n";
+ echo "</script>\n\n";
+}
+?>
+
+<script type="text/javascript">
+//<![CDATA[
+NiftyCheck();
+var bgcolor = document.getElementsByTagName("body")[0].style.backgroundColor;
+Rounded("div#roundme","all",bgcolor,"#FFFFFF","smooth");
+enablechange();
+disablechange();
+showchange();
+//]]>
+</script>
+
+<?php
+if ($pkg['step'][$stepid]['stepafterformdisplay'] <> "") {
+ // handle after form display event.
+ eval($pkg['step'][$stepid]['stepafterformdisplay']);
+}
+
+if ($pkg['step'][$stepid]['javascriptafterformdisplay'] <> "") {
+ // handle after form display event.
+ echo "\n<script type=\"text/javascript\">\n";
+ echo "//<![CDATA[\n";
+ echo $pkg['step'][$stepid]['javascriptafterformdisplay'] . "\n";
+ echo "//]]>\n";
+ echo "</script>\n\n";
+}
+
+/*
+ * HELPER FUNCTIONS
+ */
+
+function fixup_string($string) {
+ global $config, $g, $myurl, $title;
+ $newstring = $string;
+ // fixup #1: $myurl -> http[s]://ip_address:port/
+ switch ($config['system']['webgui']['protocol']) {
+ case "http":
+ $proto = "http";
+ break;
+ case "https":
+ $proto = "https";
+ break;
+ default:
+ $proto = "http";
+ break;
+ }
+ $port = $config['system']['webgui']['port'];
+ if ($port != "") {
+ if (($port == "443" and $proto != "https") or ($port == "80" and $proto != "http")) {
+ $urlport = ":" . $port;
+ } elseif ($port != "80" and $port != "443") {
+ $urlport = ":" . $port;
+ } else {
+ $urlport = "";
+ }
+ }
+ $http_host = $_SERVER['SERVER_NAME'];
+ $urlhost = $http_host;
+ // If finishing the setup wizard, check if accessing on a LAN or WAN address that changed
+ if ($title == "Reload in progress") {
+ if (is_ipaddr($urlhost)) {
+ $host_if = find_ip_interface($urlhost);
+ if ($host_if) {
+ $host_if = convert_real_interface_to_friendly_interface_name($host_if);
+ if ($host_if && is_ipaddr($config['interfaces'][$host_if]['ipaddr'])) {
+ $urlhost = $config['interfaces'][$host_if]['ipaddr'];
+ }
+ }
+ } else if ($urlhost == $config['system']['hostname']) {
+ $urlhost = $config['wizardtemp']['system']['hostname'];
+ } else if ($urlhost == $config['system']['hostname'] . '.' . $config['system']['domain']) {
+ $urlhost = $config['wizardtemp']['system']['hostname'] . '.' . $config['wizardtemp']['system']['domain'];
+ }
+ }
+ if ($urlhost != $http_host) {
+ file_put_contents("{$g['tmp_path']}/setupwizard_lastreferrer", $proto . "://" . $http_host . $urlport . $_SERVER['REQUEST_URI']);
+ }
+ $myurl = $proto . "://" . $urlhost . $urlport . "/";
+
+ if (strstr($newstring, "\$myurl")) {
+ $newstring = str_replace("\$myurl", $myurl, $newstring);
+ }
+ // fixup #2: $wanip
+ if (strstr($newstring, "\$wanip")) {
+ $curwanip = get_interface_ip();
+ $newstring = str_replace("\$wanip", $curwanip, $newstring);
+ }
+ // fixup #3: $lanip
+ if (strstr($newstring, "\$lanip")) {
+ $lanip = get_interface_ip("lan");
+ $newstring = str_replace("\$lanip", $lanip, $newstring);
+ }
+ // fixup #4: fix'r'up here.
+ return $newstring;
+}
+
+function is_timezone($elt) {
+ return !preg_match("/\/$/", $elt);
+}
+
+?>
+
+</body>
+</html>
diff --git a/src/usr/local/www/wizards/openvpn_wizard.inc b/src/usr/local/www/wizards/openvpn_wizard.inc
new file mode 100644
index 0000000..ee530a2
--- /dev/null
+++ b/src/usr/local/www/wizards/openvpn_wizard.inc
@@ -0,0 +1,676 @@
+<?php
+/*
+ Copyright (C) 2010 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ pfSense_MODULE: openvpn
+*/
+require_once("openvpn.inc");
+
+function has_special_chars($text) {
+ return preg_match('/[^A-Za-z0-9 _-]/', $text);
+}
+
+function step1_submitphpaction() {
+ global $stepid, $config;
+ if ($_POST['authtype'] == "local") {
+ $stepid = 4;
+ $config['ovpnserver']['step1']['type'] = "local";
+ } else if ($_POST['authtype'] == "ldap") {
+ $stepid = 0;
+ } else if ($_POST['authtype'] == "radius") {
+ $stepid = 2;
+ $config['ovpnserver']['step1']['type'] = "radius";
+ unset($config['ovpnserver']['step1']['uselist']);
+ }
+}
+
+function step2_stepbeforeformdisplay() {
+ global $pkg, $stepid;
+
+ $fields =& $pkg['step'][1]['fields']['field'];
+
+ $found = false;
+ $authlist = auth_get_authserver_list();
+ $fields[1]['options']['option'] = array();
+ foreach ($authlist as $i => $auth) {
+ if ($auth['type'] != "ldap")
+ continue;
+ $found = true;
+ $opts = array();
+ $opts['name'] = $auth['name'];
+ $opts['value'] = $auth['name'];
+ $fields[1]['options']['option'][] = $opts;
+ }
+ if ($found == false) {
+ $stepid = 2;
+ }
+}
+
+function step2_submitphpaction() {
+ global $stepid;
+
+ if (isset($_POST['next'])) {
+ $_POST['uselist'] = "";
+ $stepid +=3;
+ }
+}
+
+function step3_submitphpaction() {
+ global $stepid, $savemsg, $config;
+
+ /* Default LDAP port is 389 for TCP and 636 for SSL */
+ if (empty($_POST['port'])) {
+ if ($_POST['transport'] == "tcp")
+ $config['ovpnserver']['step2']['port'] = 389;
+ elseif ($_POST['transport'] == "ssl")
+ $config['ovpnserver']['step2']['port'] = 636;
+ } elseif (!is_port($_POST['port'])) {
+ $stepid--;
+ $savemsg = "Please enter a valid port number.";
+ }
+
+ if (empty($_POST['name']) || empty($_POST['ip']) ||empty($_POST['transport']) ||
+ empty($_POST['scope']) || empty($_POST['basedn']) || empty($_POST['authscope']) || empty($_POST['nameattr'])) {
+ $stepid--;
+ $savemsg = "Please enter all information for authentication server.";
+ } else if (count(($authcfg = auth_get_authserver($_POST['name']))) > 0) {
+ $stepid--;
+ $savemsg = "Please choose a different name because an authentication server with this name already exists.";
+ } elseif (!is_fqdn($_POST['ip']) && !is_ipaddr($_POST['ip'])) {
+ $stepid--;
+ $savemsg = "Please enter a valid IP address or hostname for the authentication server.";
+ } else {
+ $config['ovpnserver']['step2']['uselist'] = "on";
+ $_POST['uselist'] = "on";
+ $stepid += 2;
+ }
+}
+
+function step4_stepbeforeformdisplay() {
+ global $pkg, $stepid;
+
+ $fields =& $pkg['step'][3]['fields']['field'];
+
+ $found = false;
+ $authlist = auth_get_authserver_list();
+ $fields[1]['options']['option'] = array();
+ foreach ($authlist as $i => $auth) {
+ if ($auth['type'] != "radius")
+ continue;
+ $found = true;
+ $opts = array();
+ $opts['name'] = $auth['name'];
+ $opts['value'] = $auth['name'];
+ $fields[1]['options']['option'][] = $opts;
+ }
+ if ($found == false)
+ $stepid = 4;
+}
+
+function step4_submitphpaction() {
+ global $stepid;
+
+ if (isset($_POST['next'])) {
+ $_POST['uselist'] = "";
+ $stepid++;
+ }
+}
+
+function step5_submitphpaction() {
+ global $stepid, $savemsg, $config;
+
+ /* Default RADIUS Auth port = 1812 */
+ if (empty($_POST['port'])) {
+ $config['ovpnserver']['step2']['port'] = 1812;
+ } elseif (!is_port($_POST['port'])) {
+ $stepid--;
+ $savemsg = "Please enter a valid port number.";
+ }
+
+ if (empty($_POST['name']) || empty($_POST['ip']) || empty($_POST['secret'])) {
+ $stepid--;
+ $savemsg = "Please enter all information for authentication server.";
+ } else if (count(($authcfg = auth_get_authserver($_POST['name']))) > 0) {
+ $stepid--;
+ $savemsg = "Please choose a different name because an authentication server with this name already exists.";
+ } elseif (!is_fqdn($_POST['ip']) && !is_ipaddr($_POST['ip'])) {
+ $stepid--;
+ $savemsg = "Please enter a valid IP address or hostname for the authentication server.";
+ } else {
+ $config['ovpnserver']['step2']['uselist'] = "on";
+ $_POST['uselist'] = "on";
+ }
+}
+
+function step6_stepbeforeformdisplay() {
+ global $stepid, $config;
+
+ if (count($config['ca']) < 1) {
+ $stepid++;
+ }
+}
+
+function step6_submitphpaction() {
+ global $stepid, $config;
+
+ if (isset($_POST['next'])) {
+ $_POST['uselist'] = "";
+ unset($config['ovpnserver']['step6']['uselist']);
+ $stepid++;
+ } else {
+ $config['ovpnserver']['step6']['uselist'] = "on";
+ $_POST['uselist'] = "on";
+ }
+}
+
+function step7_submitphpaction() {
+ global $input_errors, $stepid, $savemsg, $_POST, $config;
+
+ $canames = array();
+ $cacns = array();
+ if (is_array($config['ca'])) {
+ foreach($config['ca'] as $ca) {
+ $canames[] = $ca['descr'];
+ $cainfo = cert_get_subject_hash($ca['crt']);
+ $cacns[] = $cainfo["CN"];
+ }
+ }
+
+ if (preg_match("/[\?\>\<\&\/\\\"\']/", $_POST['descr'])) {
+ $input_errors[] = "The field 'Descriptive Name' contains invalid characters.";
+ }
+
+ if (empty($_POST['descr']) || empty($_POST['keylength']) || empty($_POST['lifetime']) ||
+ empty($_POST['country']) || empty($_POST['state']) || empty($_POST['city']) ||
+ empty($_POST['organization']) || empty($_POST['email'])) {
+ $stepid--;
+ $savemsg = "Please enter all information for the new Certificate Authority.";
+ } elseif (has_special_chars($_POST['country']) || has_special_chars($_POST['state']) ||
+ has_special_chars($_POST['city']) || has_special_chars($_POST['organization'])) {
+ $stepid--;
+ $input_errors[] = "Please do not use special characters in Certificate field names.";
+ } elseif (in_array($_POST['descr'], $canames) || in_array($_POST['descr'], $cacns)) {
+ $stepid--;
+ $savemsg = "Please enter a different name for the Certificate Authority. A Certificate Authority with that name already exists.";
+ } elseif (strlen($_POST['country']) != 2) {
+ $stepid--;
+ $savemsg = "Please enter only a two-letter ISO country code";
+ } else {
+ $config['ovpnserver']['step6']['uselist'] = "on";
+ $_POST['uselist'] = "on";
+ }
+}
+
+function step8_stepbeforeformdisplay() {
+ global $stepid, $config;
+
+ if (count($config['cert']) < 1 ||
+ (count($config['cert']) == 1 && stristr($config['cert'][0]['descr'], "webconf"))) {
+ $stepid++;
+ }
+}
+
+function step8_submitphpaction() {
+ global $stepid, $config, $_POST;
+
+ if (isset($_POST['next'])) {
+ $_POST['uselist'] = "";
+ unset($config['ovpnserver']['step9']['uselist']);
+ $stepid++;
+ } else {
+ $config['ovpnserver']['step6']['uselist'] = "on";
+ $_POST['uselist'] = "on";
+ }
+}
+
+function step9_stepbeforeformdisplay() {
+ global $config, $pkg, $stepid;
+
+ $pconfig = $config['ovpnserver'];
+
+ if (isset($pconfig['step6']['uselist'])) {
+ $country = $pconfig['step6']['country'];
+ $state = $pconfig['step6']['state'];
+ $city = $pconfig['step6']['city'];
+ $org = $pconfig['step6']['organization'];
+ $email = $pconfig['step6']['email'];
+ } else {
+ $ca = lookup_ca($pconfig['step6']['authcertca']);
+ $cavl = cert_get_subject_array($ca['crt']);
+ $country = $cavl[0]['v'];
+ $state = $cavl[1]['v'];
+ $city = $cavl[2]['v'];
+ $org = $cavl[3]['v'];
+ $email = $cavl[4]['v'];
+ }
+ $fields =& $pkg['step'][$stepid]['fields']['field'];
+
+ foreach ($fields as $idx => $field) {
+ switch ($field['name']) {
+ case 'country':
+ $fields[$idx]['value'] = $country;
+ break;
+ case 'state':
+ $fields[$idx]['value'] = $state;
+ break;
+ case 'city':
+ $fields[$idx]['value'] = $city;
+ break;
+ case 'organization':
+ $fields[$idx]['value'] = $org;
+ break;
+ case 'email':
+ $fields[$idx]['value'] = $email;
+ break;
+ }
+ }
+}
+
+function step9_submitphpaction() {
+ global $input_errors, $stepid, $savemsg, $_POST, $config;
+
+ $certnames = array();
+ $certcns = array();
+ if (is_array($config['cert'])) {
+ foreach($config['cert'] as $cert) {
+ $certnames[] = $cert['descr'];
+ $certinfo = cert_get_subject_hash($cert['crt']);
+ $certcns[] = $certinfo["CN"];
+ }
+ }
+
+ if (preg_match("/[\?\>\<\&\/\\\"\']/", $_POST['descr'])) {
+ $input_errors[] = "The field 'Descriptive Name' contains invalid characters.";
+ }
+
+ if (empty($_POST['descr']) || empty($_POST['keylength']) || empty($_POST['lifetime']) ||
+ empty($_POST['country']) || empty($_POST['state']) || empty($_POST['city']) ||
+ empty($_POST['organization']) || empty($_POST['email'])) {
+ $stepid--;
+ $savemsg = "Please enter all information for the new certificate.";
+ } elseif (has_special_chars($_POST['country']) || has_special_chars($_POST['state']) ||
+ has_special_chars($_POST['city']) || has_special_chars($_POST['organization'])) {
+ $stepid--;
+ $input_errors[] = "Please do not use special characters in Certificate field names.";
+ } elseif (in_array($_POST['descr'], $certnames) || in_array($_POST['descr'], $certcns)) {
+ $stepid--;
+ $savemsg = "Please enter a different name for the Certificate. A Certificate with that name/common name already exists.";
+ } elseif (strlen($_POST['country']) != 2) {
+ $stepid--;
+ $savemsg = "Please enter only a two-letter ISO country code";
+ } else {
+ $config['ovpnserver']['step9']['uselist'] = "on";
+ $_POST['uselist'] = "on";
+ }
+}
+
+function step10_stepbeforeformdisplay() {
+ global $pkg, $stepid, $netbios_nodetypes;
+
+ foreach ($pkg['step'][$stepid]['fields']['field'] as $idx => $field) {
+ if ($field['name'] == "crypto") {
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'] = array();
+ $cipherlist = openvpn_get_cipherlist();
+ foreach ($cipherlist as $name => $desc) {
+ $opt = array();
+ $opt['name'] = $desc;
+ $opt['value'] = $name;
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'][] = $opt;
+ }
+ } else if ($field['name'] == "digest") {
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'] = array();
+ $digestlist = openvpn_get_digestlist();
+ foreach ($digestlist as $name => $desc) {
+ $opt = array();
+ $opt['name'] = $desc;
+ $opt['value'] = $name;
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'][] = $opt;
+ }
+ } else if ($field['name'] == "compression") {
+ global $openvpn_compression_modes;
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'] = array();
+ foreach ($openvpn_compression_modes as $name => $desc) {
+ $opt = array();
+ $opt['name'] = $desc;
+ $opt['value'] = $name;
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'][] = $opt;
+ }
+ } else if ($field['name'] == "engine") {
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'] = array();
+ $engines = openvpn_get_engines();
+ foreach ($engines as $name => $desc) {
+ $opt = array();
+ $opt['name'] = $desc;
+ $opt['value'] = $name;
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'][] = $opt;
+ }
+ } else if ($field['name'] == "nbttype") {
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'] = array();
+ foreach ($netbios_nodetypes as $type => $name) {
+ $opt = array();
+ $opt['name'] = $name;
+ $opt['value'] = $type;
+ $pkg['step'][$stepid]['fields']['field'][$idx]['options']['option'][] = $opt;
+ }
+ } else if ($field['name'] == "localport") {
+ $pkg['step'][$stepid]['fields']['field'][$idx]['value'] = openvpn_port_next('UDP');
+ }
+ }
+}
+
+function step10_submitphpaction() {
+ global $savemsg, $stepid;
+
+ /* Default OpenVPN port to next available port if left empty. */
+ if (empty($_POST['localport']))
+ $pconfig["step10"]["localport"] = openvpn_port_next('UDP');
+
+ /* input validation */
+ if ($result = openvpn_validate_port($_POST['localport'], 'Local port'))
+ $input_errors[] = $result;
+
+ if ($result = openvpn_validate_cidr($_POST['tunnelnet'], 'Tunnel Network', false, "ipv4"))
+ $input_errors[] = $result;
+
+ if ($result = openvpn_validate_cidr($_POST['localnet'], 'Local Network', true, "ipv4"))
+ $input_errors[] = $result;
+
+ $portused = openvpn_port_used($_POST['protocol'], $_POST['interface'], $_POST['localport']);
+ if ($portused != 0)
+ $input_errors[] = "The specified 'Local port' is in use. Please enter a port not already in use.";
+
+ if (!isset($_POST['generatetlskey']) && isset($_POST['tlsauthentication']))
+ if (!strstr($_POST['tlssharedkey'], "-----BEGIN OpenVPN Static key V1-----") ||
+ !strstr($_POST['tlssharedkey'], "-----END OpenVPN Static key V1-----"))
+ $input_errors[] = "The field 'TLS Authentication Key' does not appear to be valid";
+
+ if (!empty($_POST['dnsserver1']) && !is_ipaddr(trim($_POST['dnsserver1'])))
+ $input_errors[] = "The field 'DNS Server #1' must contain a valid IP address";
+ if (!empty($_POST['dnsserver2']) && !is_ipaddr(trim($_POST['dnsserver2'])))
+ $input_errors[] = "The field 'DNS Server #2' must contain a valid IP address";
+ if (!empty($_POST['dnsserver3']) && !is_ipaddr(trim($_POST['dnsserver3'])))
+ $input_errors[] = "The field 'DNS Server #3' must contain a valid IP address";
+ if (!empty($_POST['dnsserver4']) && !is_ipaddr(trim($_POST['dnsserver4'])))
+ $input_errors[] = "The field 'DNS Server #4' must contain a valid IP address";
+
+ if (!empty($_POST['ntpserver1']) && !is_ipaddr(trim($_POST['ntpserver1'])))
+ $input_errors[] = "The field 'NTP Server #1' must contain a valid IP address";
+ if (!empty($_POST['ntpserver2']) && !is_ipaddr(trim($_POST['ntpserver2'])))
+ $input_errors[] = "The field 'NTP Server #2' must contain a valid IP address";
+
+ if (!empty($_POST['winsserver1']) && !is_ipaddr(trim($_POST['winsserver1'])))
+ $input_errors[] = "The field 'WINS Server #1' must contain a valid IP address";
+ if (!empty($_POST['winsserver2']) && !is_ipaddr(trim($_POST['winsserver2'])))
+ $input_errors[] = "The field 'WINS Server #2' must contain a valid IP address";
+
+ if ($_POST['concurrentcon'] && !is_numeric($_POST['concurrentcon']))
+ $input_errors[] = "The field 'Concurrent connections' must be numeric.";
+
+ if (empty($_POST['tunnelnet']))
+ $input_errors[] = "You must specify a 'Tunnel network'.";
+
+ if (count($input_errors) > 0) {
+ $savemsg = $input_errors[0];
+ $stepid = $stepid - 1;
+ }
+}
+
+function step12_submitphpaction() {
+ global $config;
+
+ $pconfig = $config['ovpnserver'];
+
+ if (!is_array($config['ovpnserver'])) {
+ $message = "No configuration found, please try again.";
+ header("Location:wizard.php?xml=openvpn_wizard.xml&stepid=1&message={$message}");
+ exit;
+ }
+
+ if ($pconfig['step1']['type'] == "local") {
+ $auth = array();
+ $auth['name'] = "Local Database";
+ $auth['type'] = "local";
+ } else if (isset($pconfig['step2']['uselist'])) {
+ $auth = array();
+ $auth['type'] = $pconfig['step1']['type'];
+ $auth['refid'] = uniqid();
+ $auth['name'] = $pconfig['step2']['authtype'];
+
+ if ($auth['type'] == "ldap") {
+ $auth['host'] = $pconfig['step2']['ip'];
+ $auth['ldap_port'] = $pconfig['step2']['port'];
+ if ($pconfig['step1']['transport'] == "tcp")
+ $auth['ldap_urltype'] = 'TCP - Standard';
+ else
+ $auth['ldap_urltype'] = 'SSL - Encrypted';
+ $auth['ldap_protver'] = 3;
+ $auth['ldap_scope'] = $pconfig['step2']['scope'];
+ $auth['ldap_basedn'] = $pconfig['step2']['basedn'];
+ $auth['ldap_authcn'] = $pconfig['step2']['authscope'];
+ $auth['ldap_binddn'] = $pconfig['step2']['userdn'];
+ $auth['ldap_bindpw'] = $pconfig['step2']['passdn'];
+ $auth['ldap_attr_user'] = $pconfig['step1']['nameattr'];
+ $auth['ldap_attr_member'] = $pconfig['step1']['memberattr'];
+ $auth['ldap_attr_group'] = $pconfig['step1']['groupattr'];
+ } else if ($auth['type'] == "radius") {
+ $auth['host'] = $pconfig['step2']['ip'];
+ $auth['radius_auth_port'] = $pconfig['step2']['port'];
+ $auth['radius_secret'] = $pconfig['step2']['password'];
+ $auth['radius_srvcs'] = "auth";
+ }
+ if (!is_array($config['system']['authserver']))
+ $config['system']['authserver'] = array();
+
+ $config['system']['authserver'][] = $auth;
+ } else if (!isset($pconfig['step2']['uselist']) && empty($pconfig['step2']['authserv'])) {
+ $message = "Please choose an authentication server .";
+ header("Location:wizard.php?xml=openvpn_wizard.xml&stepid=1&message={$message}");
+ exit;
+ } else if (!($auth = auth_get_authserver($pconfig['step2']['authserv']))) {
+ $message = "An invalid authentication server has been specified.";
+ header("Location:wizard.php?xml=openvpn_wizard.xml&stepid=1&message={$message}");
+ exit;
+ }
+
+ if (isset($pconfig['step6']['uselist']) && !empty($pconfig['step6']['certca'])) {
+ $ca = array();
+ $ca['refid'] = uniqid();
+ $ca['descr'] = $pconfig['step6']['certca'];
+ $dn = array(
+ 'countryName' => $pconfig['step6']['country'],
+ 'stateOrProvinceName' => $pconfig['step6']['state'],
+ 'localityName' => $pconfig['step6']['city'],
+ 'organizationName' => $pconfig['step6']['organization'],
+ 'emailAddress' => $pconfig['step6']['email'],
+ 'commonName' => $pconfig['step6']['certca']);
+
+ ca_create($ca, $pconfig['step6']['keylength'], $pconfig['step6']['lifetime'], $dn, "sha256");
+ if (!is_array($config['ca']))
+ $config['ca'] = array();
+
+ $config['ca'][] = $ca;
+ } else if (!isset($pconfig['step6']['uselist']) && empty($pconfig['step6']['authcertca'])) {
+ $message = "Please choose a Certificate Authority.";
+ header("Location:wizard.php?xml=openvpn_wizard.xml&stepid=5&message={$message}");
+ exit;
+ } else if (!($ca = lookup_ca($pconfig['step6']['authcertca']))) {
+ $message = "An invalid Certificate Authority has been specified.";
+ header("Location:wizard.php?xml=openvpn_wizard.xml&stepid=5&message={$message}");
+ exit;
+ }
+
+ if (isset($pconfig['step9']['uselist'])) {
+ $cert = array();
+ $cert['refid'] = uniqid();
+ $cert['descr'] = $pconfig['step9']['certname'];
+ $dn = array(
+ 'countryName' => $pconfig['step9']['country'],
+ 'stateOrProvinceName' => $pconfig['step9']['state'],
+ 'localityName' => $pconfig['step9']['city'],
+ 'organizationName' => $pconfig['step9']['organization'],
+ 'emailAddress' => $pconfig['step9']['email'],
+ 'commonName' => $pconfig['step9']['certname']);
+
+ cert_create($cert, $ca['refid'], $pconfig['step9']['keylength'], $pconfig['step9']['lifetime'], $dn, 'server', "sha256");
+ if (!is_array($config['cert']))
+ $config['cert'] = array();
+
+ $config['cert'][] = $cert;
+ } else if (!isset($pconfig['step9']['uselist']) && empty($pconfig['step9']['authcertname'])) {
+ $message = "Please choose a Certificate.";
+ header("Location:wizard.php?xml=openvpn_wizard.xml&stepid=7&message={$message}");
+ exit;
+ } else if (!($cert = lookup_cert($pconfig['step9']['authcertname']))) {
+ $message = "An invalid Certificate has been specified.";
+ header("Location:wizard.php?xml=openvpn_wizard.xml&stepid=7&message={$message}");
+ exit;
+ }
+ $server = array();
+ $server['vpnid'] = openvpn_vpnid_next();
+ switch ($auth['type']) {
+ case "ldap":
+ $server['authmode'] = $auth['name'];
+ $server['mode'] = "server_user";
+ break;
+ case "radius":
+ $server['authmode'] = $auth['name'];
+ $server['mode'] = "server_user";
+ break;
+ default:
+ $server['authmode'] = "Local Database";
+ $server['mode'] = "server_tls_user";
+ break;
+ }
+ $server['caref'] = $ca['refid'];
+ $server['certref'] = $cert['refid'];
+ $server['protocol'] = $pconfig['step10']['protocol'];
+ $server['interface'] = $pconfig['step10']['interface'];
+ if (isset($pconfig['step10']['localport']))
+ $server['local_port'] = $pconfig['step10']['localport'];
+
+ if (strlen($pconfig['step10']['descr']) > 30)
+ $pconfig['step10']['descr'] = substr($pconfig['step10']['descr'], 0, 30);
+ $server['description'] = $pconfig['step10']['descr'];
+ $server['custom_options'] = $pconfig['step10']['advanced'];
+ if (isset($pconfig['step10']['tlsauth'])) {
+ if (isset($pconfig['step10']['gentlskey']))
+ $tlskey = openvpn_create_key();
+ else
+ $tlskey = $pconfig['step10']['tlskey'];
+ $server['tls'] = base64_encode($tlskey);
+ }
+ $server['dh_length'] = $pconfig['step10']['dhkey'];
+ $server['tunnel_network'] = $pconfig['step10']['tunnelnet'];
+ if (isset($pconfig['step10']['rdrgw']))
+ $server['gwredir'] = $pconfig['step10']['rdrgw'];
+ if (isset($pconfig['step10']['localnet']))
+ $server['local_network'] = $pconfig['step10']['localnet'];
+ if (isset($pconfig['step10']['concurrentcon']))
+ $server['maxclients'] = $pconfig['step10']['concurrentcon'];
+ if (isset($pconfig['step10']['compression']))
+ $server['compression'] = $pconfig['step10']['compression'];
+ if (isset($pconfig['step10']['tos']))
+ $server['passtos'] = $pconfig['step10']['tos'];
+ if (isset($pconfig['step10']['interclient']))
+ $server['client2client'] = $pconfig['step10']['interclient'];
+ if (isset($pconfig['step10']['duplicate_cn']))
+ $server['duplicate_cn'] = $pconfig['step10']['duplicate_cn'];
+ if (isset($pconfig['step10']['dynip']))
+ $server['dynamic_ip'] = $pconfig['step10']['dynip'];
+ if (isset($pconfig['step10']['addrpool']))
+ $server['pool_enable'] = $pconfig['step10']['addrpool'];
+ if (isset($pconfig['step10']['defaultdomain']))
+ $server['dns_domain'] = $pconfig['step10']['defaultdomain'];
+ if (isset($pconfig['step10']['dns1']))
+ $server['dns_server1'] = $pconfig['step10']['dns1'];
+ if (isset($pconfig['step10']['dns2']))
+ $server['dns_server2'] = $pconfig['step10']['dns2'];
+ if (isset($pconfig['step10']['dns3']))
+ $server['dns_server3'] = $pconfig['step10']['dns3'];
+ if (isset($pconfig['step10']['dns4']))
+ $server['dns_server4'] = $pconfig['step10']['dns4'];
+ if (isset($pconfig['step10']['ntp1']))
+ $server['ntp_server1'] = $pconfig['step10']['ntp1'];
+ if (isset($pconfig['step10']['ntp2']))
+ $server['ntp_server2'] = $pconfig['step10']['ntp2'];
+ if (isset($pconfig['step10']['wins1']))
+ $server['wins_server1'] = $pconfig['step10']['wins1'];
+ if (isset($pconfig['step10']['wins2']))
+ $server['wins_server2'] = $pconfig['step10']['wins2'];
+ if (isset($pconfig['step10']['nbtenable'])) {
+ $server['netbios_ntype'] = $pconfig['step10']['nbttype'];
+ if (isset($pconfig['step10']['nbtscope']))
+ $server['netbios_scope'] = $pconfig['step10']['nbtscope'];
+ $server['netbios_enable'] = $pconfig['step10']['nbtenable'];
+ }
+ $server['crypto'] = $pconfig['step10']['crypto'];
+ $server['digest'] = $pconfig['step10']['digest'];
+ $server['engine'] = $pconfig['step10']['engine'];
+
+ if (isset($pconfig['step11']['ovpnrule'])) {
+ $rule = array();
+ $rule['descr'] = sprintf(gettext("OpenVPN %s wizard"),$server['description']);
+ /* Ensure the rule descr is not too long for pf to handle */
+ if (strlen($rule['descr']) > 52)
+ $rule['descr'] = substr($rule['descr'], 0, 52);
+ $rule['direction'] = "in";
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['network'] = $server['interface'] . "ip";
+ $rule['destination']['port'] = $server['local_port'];
+ $rule['interface'] = $server['interface'];
+ $rule['protocol'] = strtolower($server['protocol']);
+ $rule['type'] = "pass";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("OpenVPN Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+ if (isset($pconfig['step11']['ovpnallow'])) {
+ $rule = array();
+ $rule['descr'] = sprintf(gettext("OpenVPN %s wizard"),$server['description']);
+ /* Ensure the rule descr is not too long for pf to handle */
+ if (strlen($rule['descr']) > 52)
+ $rule['descr'] = substr($rule['descr'], 0, 52);
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['any'] = TRUE;
+ $rule['interface'] = "openvpn";
+ //$rule['protocol'] = $server['protocol'];
+ $rule['type'] = "pass";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("OpenVPN Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+
+ if (!is_array($config['openvpn']['openvpn-server']))
+ $config['openvpn']['openvpn-server'] = array();
+
+ $config['openvpn']['openvpn-server'][] = $server;
+
+ openvpn_resync('server', $server);
+ write_config();
+ header("Location: vpn_openvpn_server.php");
+ exit;
+}
+
+?>
diff --git a/src/usr/local/www/wizards/openvpn_wizard.xml b/src/usr/local/www/wizards/openvpn_wizard.xml
new file mode 100644
index 0000000..6aea7fd
--- /dev/null
+++ b/src/usr/local/www/wizards/openvpn_wizard.xml
@@ -0,0 +1,987 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<pfsensewizard>
+<copyright>
+/*
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2010 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+</copyright>
+<totalsteps>12</totalsteps>
+<step>
+ <id>1</id>
+ <title>OpenVPN Wizard: Authentication Type Selection</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>Select an Authentication Backend Type</name>
+ </field>
+ <field>
+ <type>select</type>
+ <displayname>Type of Server</displayname>
+ <name>authtype</name>
+ <description>&lt;br/&gt;&lt;b&gt;NOTE:&lt;/b&gt; If you are unsure, leave this set to "Local User Access."</description>
+ <bindstofield>ovpnserver->step1->type</bindstofield>
+ <options>
+ <option>
+ <name>Local User Access</name>
+ <value>local</value>
+ </option>
+ <option>
+ <name>LDAP</name>
+ <value>ldap</value>
+ </option>
+ <option>
+ <name>Radius</name>
+ <value>radius</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step1_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+<step>
+ <id>2</id>
+ <title>OpenVPN Wizard: LDAP Server Selection</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>LDAP Authentication Server List</name>
+ </field>
+ <field>
+ <name>authserv</name>
+ <displayname>LDAP servers</displayname>
+ <type>select</type>
+ <bindstofield>ovpnserver->step2->authserv</bindstofield>
+ <options>
+ <option>
+ <name>dummy</name>
+ <value>dummy</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <type>submit</type>
+ <name>Add new LDAP server</name>
+ </field>
+ <field>
+ <type>submit</type>
+ <name>Next</name>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step2_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step2_submitphpaction();</stepsubmitphpaction>
+ <javascriptafterformdisplay>enablechange();</javascriptafterformdisplay>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+<step>
+ <id>3</id>
+ <title>OpenVPN Wizard: Add LDAP Server</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>LDAP Authentication Server Parameters</name>
+ </field>
+ <field>
+ <name>name</name>
+ <displayname>Name</displayname>
+ <type>input</type>
+ <bindstofield>ovpnserver->step2->authtype</bindstofield>
+ <size>30</size>
+ <description>Descriptive server name, for your own reference.</description>
+ </field>
+ <field>
+ <name>ip</name>
+ <displayname>Hostname or IP address</displayname>
+ <type>input</type>
+ <bindstofield>ovpnserver->step2->ip</bindstofield>
+ <description>Address of the LDAP server.</description>
+ </field>
+ <field>
+ <name>port</name>
+ <displayname>Port</displayname>
+ <type>input</type>
+ <size>8</size>
+ <bindstofield>ovpnserver->step2->port</bindstofield>
+ <description>LDAP Server port, leave blank for the default (389 for TCP, 636 for SSL).</description>
+ </field>
+ <field>
+ <name>transport</name>
+ <displayname>Transport</displayname>
+ <type>select</type>
+ <bindstofield>ovpnserver->step2->transport</bindstofield>
+ <options>
+ <option>
+ <name>TCP - Standard</name>
+ <value>tcp</value>
+ </option>
+ <option>
+ <name>SSL - Encrypted</name>
+ <value>ssl</value>
+ </option>
+ </options>
+ <description>&lt;br/&gt;The protocol used by your LDAP server. It can either be standard TCP or SSL encrypted.</description>
+ </field>
+ <field>
+ <name>scope</name>
+ <displayname>Search Scope Level</displayname>
+ <type>select</type>
+ <options>
+ <option>
+ <name>One Level</name>
+ <value>one</value>
+ </option>
+ <option>
+ <name>Entire Subtree</name>
+ <value>subtree</value>
+ </option>
+ </options>
+ <bindstofield>ovpnserver->step2->scope</bindstofield>
+ </field>
+ <field>
+ <name>basedn</name>
+ <displayname>Search Scope Base DN</displayname>
+ <type>input</type>
+ <size>40</size>
+ <bindstofield>ovpnserver->step2->basedn</bindstofield>
+ </field>
+ <field>
+ <name>authscope</name>
+ <displayname>Authentication Containers</displayname>
+ <type>input</type>
+ <size>40</size>
+ <bindstofield>ovpnserver->step2->authscope</bindstofield>
+ <description>Semi-Colon separated. This will be prepended to the search base dn above or you can specify full container path.&lt;br/&gt;EXAMPLE: CN=Users;DC=example&lt;br/&gt;EXAMPLE: CN=Users,DC=example,DC=com;OU=OtherUsers,DC=example,DC=com </description>
+ </field>
+ <field>
+ <name>userdn</name>
+ <displayname>LDAP Bind User DN</displayname>
+ <type>input</type>
+ <size>20</size>
+ <description>If left blank, an anonymous bind will be done.</description>
+ <bindstofield>ovpnserver->step2->userdn</bindstofield>
+ </field>
+ <field>
+ <name>passdn</name>
+ <displayname>LDAP Bind Password</displayname>
+ <type>password</type>
+ <size>20</size>
+ <bindstofield>ovpnserver->step2->passdn</bindstofield>
+ <description>If a user DN was supplied above, this password will also be used when performing a bind operation.</description>
+ </field>
+ <field>
+ <name>nameattr</name>
+ <displayname>User Naming Attribute</displayname>
+ <type>input</type>
+ <bindstofield>ovpnserver->step2->nameattr</bindstofield>
+ <description>Typically "cn" (OpenLDAP, Novell eDirectory), "samAccountName" (Microsoft AD)</description>
+ </field>
+ <field>
+ <name>groupattr</name>
+ <displayname>Group Naming Attribute</displayname>
+ <type>input</type>
+ <bindstofield>ovpnserver->step2->groupattr</bindstofield>
+ <description>Typically "cn" (OpenLDAP, Microsoft AD, and Novell eDirectory)</description>
+ </field>
+ <field>
+ <name>memberattr</name>
+ <displayname>Member Naming Attribute</displayname>
+ <type>input</type>
+ <bindstofield>ovpnserver->step2->memberattr</bindstofield>
+ <description>Typically "member" (OpenLDAP), "memberOf" (Microsoft AD), "uniqueMember" (Novell eDirectory)</description>
+ </field>
+ <field>
+ <type>submit</type>
+ <name>Add new Server</name>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step3_submitphpaction();</stepsubmitphpaction>
+ <javascriptafterformdisplay>enablechange();</javascriptafterformdisplay>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+<step>
+ <id>4</id>
+ <title>OpenVPN Wizard: RADIUS Server Selection</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>RADIUS Authentication Server List</name>
+ </field>
+ <field>
+ <name>authserv</name>
+ <displayname>RADIUS servers</displayname>
+ <type>select</type>
+ <bindstofield>ovpnserver->step2->authserv</bindstofield>
+ <options>
+ <option>
+ <name>dummy</name>
+ <value>dummy</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <type>submit</type>
+ <name>Add new RADIUS server</name>
+ </field>
+ <field>
+ <type>submit</type>
+ <name>Next</name>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step4_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step4_submitphpaction();</stepsubmitphpaction>
+ <javascriptafterformdisplay>enablechange();</javascriptafterformdisplay>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+<step>
+ <id>5</id>
+ <title>OpenVPN Wizard: Add RADIUS Server</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>RADIUS Authentication Server Parameters</name>
+ </field>
+ <field>
+ <name>name</name>
+ <displayname>Name</displayname>
+ <type>input</type>
+ <bindstofield>ovpnserver->step2->authtype</bindstofield>
+ <size>20</size>
+ <description>Descriptive name for the RADIUS server, for your reference.</description>
+ </field>
+ <field>
+ <name>ip</name>
+ <displayname>Hostname or IP address</displayname>
+ <type>input</type>
+ <bindstofield>ovpnserver->step2->ip</bindstofield>
+ <description>Address of the RADIUS server.</description>
+ </field>
+ <field>
+ <name>port</name>
+ <displayname>Authentication Port</displayname>
+ <type>input</type>
+ <size>8</size>
+ <bindstofield>ovpnserver->step2->port</bindstofield>
+ <description>Port used by the RADIUS server for accepting Authentication requests, typically 1812.</description>
+ </field>
+ <field>
+ <name>secret</name>
+ <displayname>Shared Secret</displayname>
+ <type>password</type>
+ <size>20</size>
+ <bindstofield>ovpnserver->step2->password</bindstofield>
+ <description></description>
+ </field>
+ <field>
+ <name>Add new Server</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step5_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+<step>
+ <id>6</id>
+ <title>OpenVPN Wizard: Certificate Authority Selection</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <name>Choose a Certificate Authority (CA)</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <type>certca_selection</type>
+ <name>certca</name>
+ <displayname>Certificate Authority</displayname>
+ <bindstofield>ovpnserver->step6->authcertca</bindstofield>
+ </field>
+ <field>
+ <type>submit</type>
+ <name>Add new CA</name>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step6_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step6_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+<step>
+ <id>7</id>
+ <title>OpenVPN Wizard: Add Certificate Authority</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <name>Create a New Certificate Authority (CA) Certificate</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>descr</name>
+ <displayname>Descriptive name</displayname>
+ <description>A name for your reference, to identify this certificate. This is the same as common-name field for other Certificates.</description>
+ <type>input</type>
+ <size>20</size>
+ <bindstofield>ovpnserver->step6->certca</bindstofield>
+ </field>
+ <field>
+ <name>keylength</name>
+ <displayname>Key length</displayname>
+ <description>&lt;br/&gt;Size of the key which will be generated. The larger the key, the more security it offers, but larger keys are generally slower to use.</description>
+ <type>select</type>
+ <value>2048</value>
+ <bindstofield>ovpnserver->step6->keylength</bindstofield>
+ <options>
+ <option>
+ <name>512 bit</name>
+ <value>512</value>
+ </option>
+ <option>
+ <name>1024 bit</name>
+ <value>1024</value>
+ </option>
+ <option>
+ <name>2048 bit</name>
+ <value>2048</value>
+ </option>
+ <option>
+ <name>4096 bit</name>
+ <value>4096</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <name>lifetime</name>
+ <displayname>Lifetime</displayname>
+ <type>input</type>
+ <size>10</size>
+ <value>3650</value>
+ <description>Lifetime in days. This is commonly set to 3650 (Approximately 10 years.)</description>
+ <bindstofield>ovpnserver->step6->lifetime</bindstofield>
+ </field>
+ <field>
+ <name>country</name>
+ <displayname>Country Code</displayname>
+ <description>Two-letter ISO country code (e.g. US, AU, CA) </description>
+ <type>input</type>
+ <size>5</size>
+ <bindstofield>ovpnserver->step6->country</bindstofield>
+ </field>
+ <field>
+ <name>state</name>
+ <displayname>State or Province</displayname>
+ <description>Full State or Province name, not abbreviated (e.g. Kentucky, Indiana, Ontario).</description>
+ <type>input</type>
+ <size>30</size>
+ <bindstofield>ovpnserver->step6->state</bindstofield>
+ </field>
+ <field>
+ <name>city</name>
+ <displayname>City</displayname>
+ <description>City or other Locality name (e.g. Louisville, Indianapolis, Toronto).</description>
+ <type>input</type>
+ <size>30</size>
+ <bindstofield>ovpnserver->step6->city</bindstofield>
+ </field>
+ <field>
+ <name>organization</name>
+ <displayname>Organization</displayname>
+ <description>Organization name, often the Company or Group name.</description>
+ <type>input</type>
+ <size>30</size>
+ <bindstofield>ovpnserver->step6->organization</bindstofield>
+ </field>
+ <field>
+ <name>email</name>
+ <displayname>E-mail</displayname>
+ <description>E-mail address for the Certificate contact. Often the e-mail of the person generating the certificate (i.e. You.)</description>
+ <type>input</type>
+ <size>30</size>
+ <bindstofield>ovpnserver->step6->email</bindstofield>
+ </field>
+ <field>
+ <name>Add new CA</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step7_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+ <javascriptafterformdisplay>enablechange();</javascriptafterformdisplay>
+</step>
+<step>
+ <id>8</id>
+ <title>OpenVPN Wizard: Server Certificate Selection</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <name>Choose a Server Certificate</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <type>cert_selection</type>
+ <name>certname</name>
+ <displayname>Certificate</displayname>
+ <bindstofield>ovpnserver->step9->authcertname</bindstofield>
+ </field>
+ <field>
+ <type>submit</type>
+ <name>Add new Certificate</name>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step8_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step8_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+<step>
+ <id>9</id>
+ <title>OpenVPN Wizard: Add a Server Certificate</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <name>Create a New Server Certificate</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>descr</name>
+ <displayname>Descriptive name</displayname>
+ <description>A name for your reference, to identify this certificate. This is also known as the certificate's "Common Name."</description>
+ <type>input</type>
+ <size>20</size>
+ <bindstofield>ovpnserver->step9->certname</bindstofield>
+ </field>
+ <field>
+ <name>keylength</name>
+ <displayname>Key length</displayname>
+ <description>&lt;br/&gt;Size of the key which will be generated. The larger the key, the more security it offers, but larger keys are generally slower to use.</description>
+ <type>select</type>
+ <value>2048</value>
+ <bindstofield>ovpnserver->step9->keylength</bindstofield>
+ <options>
+ <option>
+ <name>512 bits</name>
+ <value>512</value>
+ </option>
+ <option>
+ <name>1024 bits</name>
+ <value>1024</value>
+ </option>
+ <option>
+ <name>2048 bits</name>
+ <value>2048</value>
+ </option>
+ <option>
+ <name>4096 bits</name>
+ <value>4096</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <name>lifetime</name>
+ <displayname>Lifetime</displayname>
+ <description>Lifetime in days. This is commonly set to 3650 (Approximately 10 years.)</description>
+ <type>input</type>
+ <size>10</size>
+ <value>3650</value>
+ <bindstofield>ovpnserver->step9->lifetime</bindstofield>
+ </field>
+ <field>
+ <name>country</name>
+ <displayname>Country Code</displayname>
+ <description>Two-letter ISO country code (e.g. US, AU, CA) </description>
+ <type>input</type>
+ <size>5</size>
+ <bindstofield>ovpnserver->step9->country</bindstofield>
+ </field>
+ <field>
+ <name>state</name>
+ <displayname>State or Province</displayname>
+ <description>Full State of Province name, not abbreviated (e.g. Kentucky, Indiana, Ontario).</description>
+ <type>input</type>
+ <size>30</size>
+ <bindstofield>ovpnserver->step9->state</bindstofield>
+ </field>
+ <field>
+ <name>city</name>
+ <displayname>City</displayname>
+ <description>City or other Locality name (e.g. Louisville, Indianapolis, Toronto).</description>
+ <type>input</type>
+ <size>30</size>
+ <bindstofield>ovpnserver->step9->city</bindstofield>
+ </field>
+ <field>
+ <name>organization</name>
+ <displayname>Organization</displayname>
+ <description>Organization name, often the Company or Group name.</description>
+ <type>input</type>
+ <size>30</size>
+ <bindstofield>ovpnserver->step9->organization</bindstofield>
+ </field>
+ <field>
+ <name>email</name>
+ <displayname>E-mail</displayname>
+ <description>E-mail address for the Certificate contact. Often the e-mail of the person generating the certificate (i.e. You.)</description>
+ <type>input</type>
+ <size>30</size>
+ <bindstofield>ovpnserver->step9->email</bindstofield>
+ </field>
+ <field>
+ <name>Create new Certificate</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step9_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step9_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+<step>
+ <id>10</id>
+ <title>OpenVPN Wizard: Server Setup</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>General OpenVPN Server Information</name>
+ </field>
+ <field>
+ <name>interface</name>
+ <type>interfaces_selection</type>
+ <description>The interface where OpenVPN will listen for incoming connections (typically WAN.)</description>
+ <displayname>Interface</displayname>
+ <bindstofield>ovpnserver->step10->interface</bindstofield>
+ </field>
+ <field>
+ <name>Protocol</name>
+ <type>select</type>
+ <bindstofield>ovpnserver->step10->protocol</bindstofield>
+ <options>
+ <option>
+ <name>UDP</name>
+ <value>UDP</value>
+ </option>
+ <option>
+ <name>TCP</name>
+ <value>TCP</value>
+ </option>
+ </options>
+ <description>&lt;br/&gt;Protocol to use for OpenVPN connections. If you are unsure, leave this set to UDP.</description>
+ </field>
+ <field>
+ <name>localport</name>
+ <displayname>Local Port</displayname>
+ <description>Local port upon which OpenVPN will listen for connections. The default port is 1194. This can be left at its default unless you need to use a different port.</description>
+ <type>input</type>
+ <size>10</size>
+ <bindstofield>ovpnserver->step10->localport</bindstofield>
+ </field>
+ <field>
+ <name>description</name>
+ <displayname>Description</displayname>
+ <description>A name for this OpenVPN instance, for your reference. It can be set however you like, but is often used to distinguish the purpose of the service (e.g. "Remote Technical Staff"). It is also used by OpenVPN Client Export to identify this VPN on clients.</description>
+ <type>input</type>
+ <size>30</size>
+ <bindstofield>ovpnserver->step10->descr</bindstofield>
+ </field>
+ <field>
+ <type>listtopic</type>
+ <name>Cryptographic Settings</name>
+ </field>
+ <field>
+ <name>TLS Authentication</name>
+ <type>checkbox</type>
+ <value>on</value>
+ <description>Enable authentication of TLS packets.</description>
+ <bindstofield>ovpnserver->step10->tlsauth</bindstofield>
+ </field>
+ <field>
+ <displayname>Generate TLS Key</displayname>
+ <name>generatetlskey</name>
+ <disablefields>tlssharedkey</disablefields>
+ <value>on</value>
+ <type>checkbox</type>
+ <description>Automatically generate a shared TLS authentication key.</description>
+ <bindstofield>ovpnserver->step10->gentlskey</bindstofield>
+ </field>
+ <field>
+ <displayname>TLS Shared Key</displayname>
+ <name>tlssharedkey</name>
+ <description>Paste in a shared TLS key if one has already been generated.</description>
+ <type>textarea</type>
+ <cols>30</cols>
+ <rows>5</rows>
+ <bindstofield>ovpnserver->step10->tlskey</bindstofield>
+ </field>
+ <field>
+ <displayname>DH Parameters Length</displayname>
+ <name>dhparameters</name>
+ <type>select</type>
+ <value>2048</value>
+ <bindstofield>ovpnserver->step10->dhkey</bindstofield>
+ <options>
+ <option>
+ <name>1024 bit</name>
+ <value>1024</value>
+ </option>
+ <option>
+ <name>2048 bit</name>
+ <value>2048</value>
+ </option>
+ <option>
+ <name>4096 bit</name>
+ <value>4096</value>
+ </option>
+ </options>
+ <description>&lt;br/&gt;Length of Diffie-Hellman (DH) key exchange parameters, used for establishing a secure communications channel. As with other such settings, the larger values are more secure, but may be slower in operation.</description>
+ </field>
+ <field>
+ <name>crypto</name>
+ <type>select</type>
+ <displayname>Encryption Algorithm</displayname>
+ <bindstofield>ovpnserver->step10->crypto</bindstofield>
+ <value>AES-256-CBC</value>
+ <options>
+ <option>
+ <name>dummy</name>
+ <value>dummy</value>
+ </option>
+ </options>
+ <description>&lt;br/&gt;The algorithm used to encrypt traffic between endpoints. This setting must match on the client and server side, but is otherwise set however you like. Certain algorithms will perform better on different hardware, depending on the availability of supported VPN accelerator chips.</description>
+ </field>
+ <field>
+ <name>digest</name>
+ <type>select</type>
+ <displayname>Auth Digest Algorithm</displayname>
+ <bindstofield>ovpnserver->step10->digest</bindstofield>
+ <options>
+ <option>
+ <name>dummy</name>
+ <value>dummy</value>
+ </option>
+ </options>
+ <value>SHA1</value>
+ <description>&lt;br/&gt;The method used to authenticate traffic between endpoints. This setting must match on the client and server side, but is otherwise set however you like.</description>
+ </field>
+ <field>
+ <name>engine</name>
+ <type>select</type>
+ <displayname>Hardware Crypto</displayname>
+ <bindstofield>ovpnserver->step10->engine</bindstofield>
+ <options>
+ <option>
+ <name>dummy</name>
+ <value>dummy</value>
+ </option>
+ </options>
+ <description>&lt;br/&gt;The hardware cryptographic accelerator to use for this VPN connection, if any.</description>
+ </field>
+ <field>
+ <type>listtopic</type>
+ <name>Tunnel Settings</name>
+ </field>
+ <field>
+ <displayname>Tunnel Network</displayname>
+ <name>tunnelnet</name>
+ <type>input</type>
+ <size>20</size>
+ <bindstofield>ovpnserver->step10->tunnelnet</bindstofield>
+ <description>This is the virtual network used for private communications between this server and client hosts expressed using CIDR notation (eg. 10.0.8.0/24). The first network address will be assigned to the server virtual interface. The remaining network addresses can optionally be assigned to connecting clients. (see Address Pool)</description>
+ </field>
+ <field>
+ <displayname>Redirect Gateway</displayname>
+ <name>redirectgw</name>
+ <type>checkbox</type>
+ <description>Force all client generated traffic through the tunnel.</description>
+ <bindstofield>ovpnserver->step10->rdrgw</bindstofield>
+ </field>
+ <field>
+ <displayname>Local Network</displayname>
+ <name>localnet</name>
+ <type>input</type>
+ <size>20</size>
+ <bindstofield>ovpnserver->step10->localnet</bindstofield>
+ <description>This is the network that will be accessible from the remote endpoint, expressed as a CIDR range. You may leave this blank if you don't want to add a route to the local network through this tunnel on the remote machine. This is generally set to your LAN network.</description>
+ </field>
+ <field>
+ <displayname>Concurrent Connections</displayname>
+ <name>concurrentcon</name>
+ <description>Specify the maximum number of clients allowed to concurrently connect to this server.</description>
+ <type>input</type>
+ <size>10</size>
+ <bindstofield>ovpnserver->step10->concurrentcon</bindstofield>
+ </field>
+ <field>
+ <displayname>Compression</displayname>
+ <name>compression</name>
+ <description>&lt;br/&gt;Compress tunnel packets using the LZO algorithm. Adaptive compression will dynamically disable compression for a period of time if OpenVPN detects that the data in the packets is not being compressed efficiently.</description>
+ <bindstofield>ovpnserver->step10->compression</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>dummy</name>
+ <value>dummy</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <displayname>Type-of-Service</displayname>
+ <name>tos</name>
+ <type>checkbox</type>
+ <description>Set the TOS IP header value of tunnel packets to match the encapsulated packet's TOS value.</description>
+ <bindstofield>ovpnserver->step10->tos</bindstofield>
+ </field>
+ <field>
+ <displayname>Inter-Client Communication</displayname>
+ <name>interclient</name>
+ <type>checkbox</type>
+ <description>Allow communication between clients connected to this server.</description>
+ <bindstofield>ovpnserver->step10->interclient</bindstofield>
+ </field>
+ <field>
+ <displayname>Duplicate Connections</displayname>
+ <name>duplicate_cn</name>
+ <type>checkbox</type>
+ <description>Allow multiple concurrent connections from clients using the same Common Name.&lt;br/&gt;NOTE: This is not generally recommended, but may be needed for some scenarios.</description>
+ <bindstofield>ovpnserver->step10->duplicate_cn</bindstofield>
+ </field>
+ <field>
+ <type>listtopic</type>
+ <name>Client Settings</name>
+ </field>
+ <field>
+ <displayname>Dynamic IP</displayname>
+ <name>dynip</name>
+ <type>checkbox</type>
+ <value>on</value>
+ <description>Allow connected clients to retain their connections if their IP address changes.</description>
+ <bindstofield>ovpnserver->step10->dynip</bindstofield>
+ </field>
+ <field>
+ <displayname>Address Pool</displayname>
+ <name>addrpool</name>
+ <type>checkbox</type>
+ <value>on</value>
+ <description>Provide a virtual adapter IP address to clients (see Tunnel Network).</description>
+ <bindstofield>ovpnserver->step10->addrpool</bindstofield>
+ </field>
+ <field>
+ <displayname>DNS Default Domain</displayname>
+ <name>defaultdomain</name>
+ <type>input</type>
+ <description>Provide a default domain name to clients.</description>
+ <bindstofield>ovpnserver->step10->defaultdomain</bindstofield>
+ </field>
+ <field>
+ <displayname>DNS Server 1</displayname>
+ <name>dnsserver1</name>
+ <type>input</type>
+ <bindstofield>ovpnserver->step10->dns1</bindstofield>
+ <description>DNS server IP to provide to connecting clients.</description>
+ </field>
+ <field>
+ <displayname>DNS Server 2</displayname>
+ <name>dnserver2</name>
+ <type>input</type>
+ <bindstofield>ovpnserver->step10->dns2</bindstofield>
+ <description>DNS server IP to provide to connecting clients.</description>
+ </field>
+ <field>
+ <displayname>DNS Server 3</displayname>
+ <name>dnserver3</name>
+ <type>input</type>
+ <bindstofield>ovpnserver->step10->dns3</bindstofield>
+ <description>DNS server IP to provide to connecting clients.</description>
+ </field>
+ <field>
+ <displayname>DNS Server 4</displayname>
+ <name>dnserver4</name>
+ <type>input</type>
+ <bindstofield>ovpnserver->step10->dns4</bindstofield>
+ <description>DNS server IP to provide to connecting clients.</description>
+ </field>
+ <field>
+ <displayname>NTP Server</displayname>
+ <name>ntpserver1</name>
+ <type>input</type>
+ <bindstofield>ovpnserver->step10->ntp1</bindstofield>
+ <description>Network Time Protocol server to provide to connecting clients.</description>
+ </field>
+ <field>
+ <displayname>NTP Server 2</displayname>
+ <name>ntpserver2</name>
+ <type>input</type>
+ <bindstofield>ovpnserver->step10->ntp2</bindstofield>
+ <description>Network Time Protocol server to provide to connecting clients.</description>
+ </field>
+ <field>
+ <name>nbtenable</name>
+ <type>checkbox</type>
+ <displayname>NetBIOS Options</displayname>
+ <bindstofield>ovpnserver->step10->nbtenable</bindstofield>
+ <description>Enable NetBIOS over TCP/IP. &lt;br/&gt;If this option is not set, all NetBIOS-over-TCP/IP options (including WINS) will be disabled. </description>
+ </field>
+ <field>
+ <displayname>NetBIOS Node Type</displayname>
+ <name>nbttype</name>
+ <type>select</type>
+ <bindstofield>ovpnserver->step10->nbttype</bindstofield>
+ <options>
+ <option>
+ <name>dummy</name>
+ <value>dummy</value>
+ </option>
+ </options>
+ <description>&lt;br/&gt;Possible options: b-node (broadcasts), p-node (point-to-point name queries to a WINS server), m-node (broadcast then query name server), and h-node (query name server, then broadcast).</description>
+ </field>
+ <field>
+ <displayname>NetBIOS Scope ID</displayname>
+ <name>nbtscope</name>
+ <type>input</type>
+ <bindstofield>ovpnserver->step10->nbtscope</bindstofield>
+ <description>A NetBIOS Scope ID provides an extended naming service for NetBIOS over TCP/IP. The NetBIOS scope ID isolates NetBIOS traffic on a single network to only those nodes with the same NetBIOS scope ID.</description>
+ </field>
+ <field>
+ <displayname>WINS Server 1</displayname>
+ <name>winsserver1</name>
+ <type>input</type>
+ <bindstofield>ovpnserver->step10->wins1</bindstofield>
+ <description>A Windows Internet Name Service (WINS) server IP to provide to connecting clients. Not desirable in most all modern networks.</description>
+ </field>
+ <field>
+ <displayname>WINS Server 2</displayname>
+ <name>winsserver2</name>
+ <type>input</type>
+ <bindstofield>ovpnserver->step10->wins2</bindstofield>
+ <description>A Windows Internet Name Service (WINS) server IP to provide to connecting clients. Not desirable in most all modern networks.</description>
+ </field>
+ <field>
+ <name>Advanced</name>
+ <type>textarea</type>
+ <cols>30</cols>
+ <rows>5</rows>
+ <description>Enter any additional options you would like to add to the OpenVPN server configuration here, separated by a semicolon. EXAMPLE: push "route 10.0.0.0 255.255.255.0"</description>
+ <bindstofield>ovpnserver->step10->advanced</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step10_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step10_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+<step>
+ <id>11</id>
+ <title>OpenVPN Wizard: Firewall Rule Configuration</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>Firewall Rule Configuration</name>
+ </field>
+ <field>
+ <type>text</type>
+ <description>Firewall rules control what network traffic is permitted. You must add rules to allow traffic to the OpenVPN server's IP and port, as well as allowing traffic from connected clients through the tunnel. These rules can be automatically added here, or configured manually after completing the wizard.</description>
+ </field>
+ <field>
+ <type>listtopic</type>
+ <name>Traffic from clients to server</name>
+ </field>
+ <field>
+ <name>ovpnrule</name>
+ <displayname>Firewall Rule</displayname>
+ <description>Add a rule to permit connections to this OpenVPN server process from clients anywhere on the Internet.</description>
+ <type>checkbox</type>
+ <bindstofield>ovpnserver->step11->ovpnrule</bindstofield>
+ </field>
+ <field>
+ <type>listtopic</type>
+ <name>Traffic from clients through VPN</name>
+ </field>
+ <field>
+ <name>ovpnallow</name>
+ <displayname>OpenVPN rule</displayname>
+ <description>Add a rule to allow all traffic from connected clients to pass inside the VPN tunnel.</description>
+ <type>checkbox</type>
+ <bindstofield>ovpnserver->step11->ovpnallow</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+</step>
+<step>
+ <id>12</id>
+ <title>OpenVPN Wizard: Finished!</title>
+ <description>OpenVPN Remote Access Server Setup Wizard</description>
+ <disableheader>on</disableheader>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>Configuration Complete!</name>
+ </field>
+ <field>
+ <type>text</type>
+ <description>Your configuration is now complete.</description>
+ </field>
+ <field>
+ <type>text</type>
+ <description>To be able to export client configurations, browse to System->Packages and install the OpenVPN Client Export package.</description>
+ </field>
+ <field>
+ <type>submit</type>
+ <name>Finish</name>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step12_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/openvpn_wizard.inc</includefile>
+</step>
+</pfsensewizard> \ No newline at end of file
diff --git a/src/usr/local/www/wizards/setup_wizard.xml b/src/usr/local/www/wizards/setup_wizard.xml
new file mode 100644
index 0000000..9da0509
--- /dev/null
+++ b/src/usr/local/www/wizards/setup_wizard.xml
@@ -0,0 +1,703 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<pfsensewizard>
+<copyright>
+/* $Id$ */
+/*
+ setup_wizard.xml
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2004, 2005 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+</copyright>
+<totalsteps>10</totalsteps>
+<step>
+ <id>1</id>
+ <title>pfSense Setup Wizard</title>
+ <disableheader>true</disableheader>
+ <description>This wizard will guide you through the initial configuration of pfSense.&lt;br/&gt;&lt;br/&gt; The wizard may be stopped at any time by clicking the logo image at the top of the screen.</description>
+ <fields>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>
+ conf_mount_rw();
+ unlink_if_exists('/conf/trigger_initial_wizard');
+ conf_mount_ro();
+ </stepbeforeformdisplay>
+</step>
+<step>
+ <id>2</id>
+ <title>Bling your pfSense with pfSense Gold</title>
+ <disableheader>true</disableheader>
+ <description>Feel the power of a pfSense Gold subscription. Receive special benefits while supporting ongoing development of the Open Source pfSense project.&lt;br/&gt; &lt;br/&gt; Benefits include access to our AutoConfigBackup secure cloud based backup service for up to 10 hosts, pre-publication access to the updated pfSense: The Definitive Guide book in PDF, fully updated for the pfSense 2.1 release, and a monthly online MeetUp! Video conference to discuss and demonstrate advanced features and architectures using pfSense. &lt;br/&gt; &lt;br/&gt; Go to &lt;a href="https://www.pfsense.org/gold" target="_blank"&gt; pfSense Gold Subscriptions&lt;/a&gt; to sign up now &lt;br/&gt; &lt;br/&gt; </description>
+ <fields>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+</step>
+<step>
+ <id>3</id>
+ <title>General Information</title>
+ <description>On this screen you will set the general pfSense parameters.</description>
+ <fields>
+ <field>
+ <name>Hostname</name>
+ <type>input</type>
+ <bindstofield>wizardtemp->system->hostname</bindstofield>
+ <description>EXAMPLE: myserver</description>
+ <validate>^[a-zA-Z0-9-]+$</validate>
+ <message>Invalid Hostname</message>
+ </field>
+ <field>
+ <name>Domain</name>
+ <type>input</type>
+ <bindstofield>wizardtemp->system->domain</bindstofield>
+ <description>EXAMPLE: mydomain.com</description>
+ <validate>^[a-zA-Z0-9.-]+$</validate>
+ <message>Domain name field is invalid</message>
+ </field>
+ <field>
+ <name>DNS Resolver Behavior</name>
+ <type>text</type>
+ <description>The default behavior of the DNS Resolver will ignore manually configured DNS servers for client queries and query root DNS servers directly. To use the manually configured DNS servers below for client queries, visit Services &gt; DNS Resolver and enable DNS Query Forwarding after completing the wizard.</description>
+ </field>
+ <field>
+ <name>Primary DNS Server</name>
+ <type>input</type>
+ <bindstofield>system->dnsserver</bindstofield>
+ <!-- we must unset the fields because this is an array. -->
+ <unsetfield>yes</unsetfield>
+ <arraynum>0</arraynum>
+ <validate>^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$</validate>
+ <message>Primary DNS Server field is invalid</message>
+ </field>
+ <field>
+ <name>Secondary DNS Server</name>
+ <type>input</type>
+ <bindstofield>system->dnsserver</bindstofield>
+ <arraynum>1</arraynum>
+ <validate>^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$</validate>
+ <message>Secondary DNS Server field is invalid</message>
+ </field>
+ <field>
+ <name>Override DNS</name>
+ <description>Allow DNS servers to be overridden by DHCP/PPP on WAN</description>
+ <type>checkbox</type>
+ <bindstofield>system->dnsallowoverride</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>
+ <![CDATA[
+ $config['wizardtemp'] = array();
+ $config['wizardtemp']['system'] = array();
+ $config['wizardtemp']['system']['hostname'] = $config['system']['hostname'];
+ $config['wizardtemp']['system']['domain'] = $config['system']['domain'];
+ ]]>
+ </stepbeforeformdisplay>
+ <stepsubmitphpaction>
+ <![CDATA[
+ if(empty($_POST['hostname']) || !is_unqualified_hostname($_POST['hostname'])) {
+ print_info_box_np("Hostname is invalid. Please press back in your browser window and correct.");
+ die;
+ }
+ if(empty($_POST['domain']) || !is_domain($_POST['domain'])) {
+ print_info_box_np("Domain is invalid. Please press back in your browser window and correct.");
+ die;
+ }
+ if(!empty($_POST['primarydnsserver']) && !is_ipaddr($_POST['primarydnsserver'])) {
+ print_info_box_np("Primary DNS server is invalid. Please press back in your browser window and correct.");
+ die;
+ }
+ if(!empty($_POST['secondarydnsserver']) && !is_ipaddr($_POST['secondarydnsserver'])) {
+ print_info_box_np("Second DNS server is invalid. Please press back in your browser window and correct.");
+ die;
+ }
+ ]]>
+ </stepsubmitphpaction>
+</step>
+<step>
+ <id>4</id>
+ <title>Time Server Information</title>
+ <description>Please enter the time, date and time zone.</description>
+ <fields>
+ <field>
+ <name>Time server hostname</name>
+ <description>Enter the hostname (FQDN) of the time server.</description>
+ <type>input</type>
+ <bindstofield>system->timeservers</bindstofield>
+ </field>
+ <field>
+ <name>Timezone</name>
+ <type>timezone_select</type>
+ <bindstofield>system->timezone</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>
+ <![CDATA[
+ foreach (explode(' ', $_POST['timeserverhostname']) as $ts) {
+ if (!is_domain($ts)) {
+ print_info_box_np(gettext("NTP Time Server names may only contain the characters a-z, 0-9, '-' and '.'. Entries may be separated by spaces. Please press back in your browser window and correct."));
+ die;
+ }
+ }
+ ]]>
+ </stepsubmitphpaction>
+</step>
+<step>
+ <id>5</id>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <title>Configure WAN Interface</title>
+ <description>On this screen we will configure the Wide Area Network information.</description>
+ <javascriptafterformdisplay>
+ var selectedItem = 0;
+ if(document.forms[0].ipaddress.value == 'dhcp') {
+ selectedItem = 1;
+ document.forms[0].ipaddress.value = '';
+ } else if(document.forms[0].ipaddress.value == 'pppoe') {
+ selectedItem = 2;
+ document.forms[0].ipaddress.value = '';
+ } else if(document.forms[0].ipaddress.value == 'pptp') {
+ selectedItem = 3;
+ document.forms[0].ipaddress.value = '';
+ } else if(document.forms[0].ipaddress.value == 'ppp' || document.forms[0].ipaddress.value == 'l2tp') {
+ document.forms[0].ipaddress.value = '';
+ } else {
+ selectedItem = 0;
+ }
+ document.forms[0].selectedtype.selectedIndex = selectedItem;
+ enableitems(selectedItem);
+ </javascriptafterformdisplay>
+ <fields>
+ <field>
+ <name>SelectedType</name>
+ <type>select</type>
+ <donotdisable>true</donotdisable>
+ <options>
+ <option>
+ <name>Static</name>
+ <value>Static</value>
+ <enablefields>ipaddress,subnetmask,upstreamgateway</enablefields>
+ </option>
+ <option>
+ <name>DHCP</name>
+ <value>dhcp</value>
+ <enablefields>dhcphostname</enablefields>
+ </option>
+ <option>
+ <name>PPPoE</name>
+ <value>pppoe</value>
+ <enablefields>pppoeusername,pppoepassword,pppoeservicename,pppoedialondemand,pppoeidletimeout</enablefields>
+ </option>
+ <option>
+ <name>PPTP</name>
+ <value>pptp</value>
+ <enablefields>pptpusername,pptppassword,pptplocalipaddress,pptplocalsubnet,pptpremoteipaddress,pptpdialondemand,pptpidletimeout
+ </enablefields>
+ </option>
+ </options>
+ </field>
+ <field>
+ <name>General configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>MAC Address</name>
+ <bindstofield>interfaces->wan->spoofmac</bindstofield>
+ <type>input</type>
+ <description> This field can be used to modify ("spoof") the MAC address of the WAN interface (may be required with some cable connections). Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx or leave blank.</description>
+ <validate>^([0-9a-f]{2}([:-]||$)){6}$</validate>
+ <message>MAC Address field is invalid</message>
+ </field>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>MTU</name>
+ <type>input</type>
+ <bindstofield>interfaces->wan->mtu</bindstofield>
+ <description> Set the MTU of the WAN interface. If you leave this field blank, an MTU of 1492 bytes for PPPoE and 1500 bytes for all other connection types will be assumed.</description>
+ </field>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>MSS</name>
+ <type>input</type>
+ <bindstofield>interfaces->wan->mss</bindstofield>
+ <description> If you enter a value in this field, then MSS clamping for TCP connections to the value entered above minus 40 (TCP/IP header size) will be in effect. If you leave this field blank, an MSS of 1492 bytes for PPPoE and 1500 bytes for all other connection types will be assumed. This should match the above MTU value in most all cases.</description>
+ </field>
+ <field>
+ <name>Static IP Configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>IP Address</name>
+ <bindstofield>interfaces->wan->ipaddr</bindstofield>
+ <type>input</type>
+ <typehint> / </typehint>
+ <combinefieldsbegin>true</combinefieldsbegin>
+ <validate>^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$</validate>
+ <message>IP Address field is invalid</message>
+ </field>
+ <field>
+ <combinefieldsend>true</combinefieldsend>
+ <dontdisplayname>true</dontdisplayname>
+ <dontcombinecells>true</dontcombinecells>
+ <name>Subnet Mask</name>
+ <bindstofield>interfaces->wan->subnet</bindstofield>
+ <type>subnet_select</type>
+ </field>
+ <field>
+ <name>Upstream Gateway</name>
+ <bindstofield>wizardtemp->wangateway</bindstofield>
+ <type>input</type>
+ <validate>^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$</validate>
+ <message>Gateway IP Address field is invalid</message>
+ </field>
+ <field>
+ <name>DHCP client configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>DHCP Hostname</name>
+ <type>input</type>
+ <bindstofield>interfaces->wan->dhcphostname</bindstofield>
+ <description> The value in this field is sent as the DHCP client identifier and hostname when requesting a DHCP lease. Some ISPs may require this (for client identification).</description>
+ </field>
+ <field>
+ <name>PPPoE configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>PPPoE Username</name>
+ <type>input</type>
+ <bindstofield>wizardtemp->wan->username</bindstofield>
+ </field>
+ <field>
+ <name>PPPoE Password</name>
+ <type>input</type>
+ <bindstofield>wizardtemp->wan->password</bindstofield>
+ </field>
+ <field>
+ <name>PPPoE Service name</name>
+ <type>input</type>
+ <description>Hint: this field can usually be left empty</description>
+ <bindstofield>wizardtemp->wan->provider</bindstofield>
+ </field>
+ <field>
+ <name>PPPoE Dial on demand</name>
+ <typehint>Enable Dial-On-Demand mode</typehint>
+ <type>checkbox</type>
+ <description>This option causes the interface to operate in dial-on-demand mode, allowing you to have a virtual full time connection. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected.</description>
+ <bindstofield>wizardtemp->wan->ondemand</bindstofield>
+ </field>
+ <field>
+ <name>PPPoE Idle timeout</name>
+ <type>input</type>
+ <description>If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. An idle timeout of zero disables this feature.</description>
+ <bindstofield>wizardtemp->wan->idletimeout</bindstofield>
+ </field>
+ <field>
+ <name>PPTP configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>PPTP Username</name>
+ <type>input</type>
+ <bindstofield>wizardtemp->wan->pptpusername</bindstofield>
+ </field>
+ <field>
+ <name>PPTP Password</name>
+ <type>input</type>
+ <bindstofield>wizardtemp->wan->pptppassword</bindstofield>
+ </field>
+ <field>
+ <combinefieldsbegin>true</combinefieldsbegin>
+ <name>PPTP Local IP Address</name>
+ <type>input</type>
+ <typehint> / </typehint>
+ <bindstofield>wizardtemp->wan->localip</bindstofield>
+ <validate>^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$</validate>
+ <message>PPTP Local IP Address field is invalid</message>
+ </field>
+ <field>
+ <combinefieldsend>true</combinefieldsend>
+ <dontdisplayname>true</dontdisplayname>
+ <dontcombinecells>true</dontcombinecells>
+ <name>pptplocalsubnet</name>
+ <bindstofield>wizardtemp->wan->subnet</bindstofield>
+ <type>subnet_select</type>
+ </field>
+ <field>
+ <name>PPTP Remote IP Address</name>
+ <bindstofield>wizardtemp->wan->gateway</bindstofield>
+ <type>input</type>
+ <validate>^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$</validate>
+ <message>PPTP Remote IP Address field is invalid</message>
+ </field>
+ <field>
+ <name>PPTP Dial on demand</name>
+ <typehint>Enable Dial-On-Demand mode</typehint>
+ <type>checkbox</type>
+ <bindstofield>wizardtemp->wan->pptpondemand</bindstofield>
+ <description>This option causes the interface to operate in dial-on-demand mode, allowing you to have a virtual full time connection. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected.</description>
+ </field>
+ <field>
+ <name>PPTP Idle timeout</name>
+ <type>input</type>
+ <bindstofield>wizardtemp->wan->pptpidletimeout</bindstofield>
+ <description>If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. An idle timeout of zero disables this feature.</description>
+ </field>
+ <field>
+ <name>RFC1918 Networks</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>Block RFC1918 Private Networks</name>
+ <description> When set, this option blocks traffic from IP addresses that are reserved for private networks as per RFC 1918 (10/8, 172.16/12, 192.168/16) as well as loopback addresses (127/8). You should generally leave this option turned on, unless your WAN network lies in such a private address space, too.</description>
+ <type>checkbox</type>
+ <bindstofield>interfaces->wan->blockpriv</bindstofield>
+ <typehint>Block private networks from entering via WAN</typehint>
+ </field>
+ <field>
+ <name>Block bogon networks</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>Block bogon networks</name>
+ <description>When set, this option blocks traffic from IP addresses that are reserved (but not RFC 1918) or not yet assigned by IANA. Bogons are prefixes that should never appear in the Internet routing table, and obviously should not appear as the source address in any packets you receive.</description>
+ <type>checkbox</type>
+ <bindstofield>interfaces->wan->blockbogons</bindstofield>
+ <typehint>Block non-Internet routed networks from entering via WAN</typehint>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>
+ <![CDATA[
+ if (empty($config['interfaces']['wan']['gateway'])) {
+ $wangw_name = "WANGW";
+ } else {
+ $wangw_name = $config['interfaces']['wan']['gateway'];
+ }
+ if (is_array($config['gateways']['gateway_item']))
+ foreach ($config['gateways']['gateway_item'] as $gw)
+ if ($gw['name'] == $wangw_name || (!empty($config['wizardtemp']['wangateway']) && $gw['gateway'] == $config['wizardtemp']['wangateway']))
+ $config['wizardtemp']['wangateway'] = $gw['gateway'];
+ ]]>
+ </stepbeforeformdisplay>
+ <stepsubmitphpaction>
+ <![CDATA[
+ if(!empty($_POST['mtu']) && ($_POST['mtu'] < 576)) {
+ print_info_box_np("MTU Must be at least 576 (Per RFC 791). Please press back in your browser window and correct.");
+ die;
+ }
+ if(!empty($_POST['macaddress']) && !is_macaddr($_POST['macaddress'])) {
+ print_info_box_np("Invalid MAC Address. Please press back in your browser window and correct.");
+ die;
+ }
+ if(!empty($_POST['ipaddress']) && ($_POST['selectedtype'] == "Static")) {
+ if (!is_ipaddr($_POST['ipaddress'])) {
+ print_info_box_np("Invalid WAN IP Address. Please press back in your browser window and correct.");
+ die;
+ }
+ if ($_POST['subnetmask'] < 31 &&
+ ($_POST['ipaddress'] == gen_subnet($_POST['ipaddress'], $_POST['subnetmask']) ||
+ $_POST['ipaddress'] == gen_subnet_max($_POST['ipaddress'], $_POST['subnetmask']))) {
+ print_info_box_np("Invalid WAN IP Address. Please press back in your browser window and correct.");
+ die;
+ }
+ }
+ if(!empty($_POST['dhcphostname']) && !is_hostname($_POST['dhcphostname'])) {
+ print_info_box_np("Invalid DHCP Hostname. Please press back in your browser window and correct.");
+ die;
+ }
+ if(!empty($_POST['pptplocalipaddress']) && !is_ipaddr($_POST['pptplocalipaddress'])) {
+ print_info_box_np("Invalid PPTP Local IP Address. Please press back in your browser window and correct.");
+ die;
+ }
+ if(!empty($_POST['pptpremoteipaddress']) && !is_ipaddr($_POST['pptpremoteipaddress'])) {
+ print_info_box_np("Invalid PPTP Remote IP Address. Please press back in your browser window and correct.");
+ die;
+ }
+ $type = $_POST['selectedtype'];
+
+ if (!is_array($config['ppps']['ppp']))
+ $config['ppps']['ppp'] = array();
+ if (count($config['ppps']['ppp'])) {
+ foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
+ if ($ppp['ptpid'] == "0") {
+ if ((substr($config['interfaces']['wan']['if'],0,5) == "pppoe") || (substr($config['interfaces']['wan']['if'],0,4) == "pptp")) {
+ $oldif = explode(",", $ppp['ports']);
+ $config['interfaces']['wan']['if'] = $oldif[0];
+ }
+ if ($type == "pppoe" || $type == "pptp")
+ unset($config['ppps']['ppp'][$pppid]);
+ }
+ }
+ }
+
+ if ($type == "pppoe" || $type == "pptp") {
+ if ($type == "pptp") {
+ $config['wizardtemp']['wan']['username'] = $config['wizardtemp']['wan']['pptpusername'];
+ $config['wizardtemp']['wan']['password'] = $config['wizardtemp']['wan']['pptppassword'];
+ $config['wizardtemp']['wan']['ondemand'] = $config['wizardtemp']['wan']['pptpondemand'];
+ $config['wizardtemp']['wan']['idletimeout'] = $config['wizardtemp']['wan']['pptpidletimeout'];
+ unset($config['wizardtemp']['wan']['pptpusername']);
+ unset($config['wizardtemp']['wan']['pptppassword']);
+ unset($config['wizardtemp']['wan']['pptpondemand']);
+ unset($config['wizardtemp']['wan']['pptpidletimeout']);
+ }
+ $config['wizardtemp']['wan']['password'] = base64_encode($config['wizardtemp']['wan']['password']);
+ $tmp = array();
+ $tmp['ptpid'] = "0";
+ $tmp['type'] = $type;
+ $tmp['if'] = $type . "0";
+ $tmp['ports'] = $config['interfaces']['wan']['if'];
+ $config['ppps']['ppp'][] = array_merge($tmp, $config['wizardtemp']['wan']);
+ unset($tmp);
+ $config['interfaces']['wan']['if'] = $type."0";
+ }
+ unset($config['wizardtemp']['wan']);
+ ]]>
+ </stepsubmitphpaction>
+ <stepsubmitbeforesave>
+ <![CDATA[
+ if($_POST['selectedtype'] == "Static") {
+
+ } else {
+ $_POST['ipaddress'] = $_POST['selectedtype'];
+ $config['interfaces']['wan']['ipaddr'] = $_POST['selectedtype'];
+ write_config();
+ if(!$config['interfaces']['lan'])
+ header("Location: /wizard.php?xml=setup_wizard.xml&stepid=6&next=Next");
+ }
+ ]]>
+ </stepsubmitbeforesave>
+</step>
+<step>
+ <id>6</id>
+ <title>Configure LAN Interface</title>
+ <description>On this screen we will configure the Local Area Network information.</description>
+ <fields>
+ <field>
+ <name>LAN IP Address</name>
+ <type>input</type>
+ <bindstofield>interfaces->lan->ipaddr</bindstofield>
+ <description>Type dhcp if this interface uses DHCP to obtain its IP address.</description>
+ <validate>^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$</validate>
+ <message>LAN IP Address field is invalid</message>
+ </field>
+ <field>
+ <name>Subnet Mask</name>
+ <type>subnet_select</type>
+ <bindstofield>interfaces->lan->subnet</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>
+ <![CDATA[
+ if(empty($_POST['lanipaddress']) || !is_ipaddr($_POST['lanipaddress'])) {
+ print_info_box_np("Invalid LAN IP Address. Please press back in your browser window and correct.");
+ die;
+ }
+
+ $lowestip = gen_subnet($_POST['lanipaddress'], $_POST['subnetmask']);
+ $highestip = gen_subnet_max($_POST['lanipaddress'], $_POST['subnetmask']);
+
+ if ($_POST['subnetmask'] < 31) {
+ if ($_POST['lanipaddress'] == $lowestip) {
+ print_info_box_np("LAN IP Address equals subnet network address. This is not allowed. Please press back in your browser window and correct.");
+ die;
+ }
+ if ($_POST['lanipaddress'] == $highestip) {
+ print_info_box_np("LAN IP Address equals subnet broadcast address. This is not allowed. Please press back in your browser window and correct.");
+ die;
+ }
+ } else {
+ print_info_box_np("Invalid subnet mask, choose a mask less than 31. Please press back in your browser window and correct.");
+ die;
+ }
+
+ $ipaddresses_before = ip_range_size_v4($lowestip, $_POST['lanipaddress']);
+ $ipaddresses_after = ip_range_size_v4($_POST['lanipaddress'], $highestip);
+
+ if ($ipaddresses_after >= $ipaddresses_before) {
+ // The LAN IP is in the 1st half of the subnet, so put DHCP in the 2nd half.
+ if ($ipaddresses_after > 30) {
+ // There is reasonable space in the subnet, use a smaller chunk of the space for DHCP
+ // This case will work out like the old defaults if the user has specified the ".1" address.
+ // The range will be something like ".10" to ".245"
+ $config['dhcpd']['lan']['range']['from'] = ip_after($_POST['lanipaddress'], 9);
+ $config['dhcpd']['lan']['range']['to'] = ip_before($highestip, 10);
+ } else {
+ // There is not much space in the subnet, so allocate everything above the LAN IP to DHCP.
+ $config['dhcpd']['lan']['range']['from'] = ip_after($_POST['lanipaddress']);
+ $config['dhcpd']['lan']['range']['to'] = ip_before($highestip);
+ }
+ } else {
+ // The LAN IP is in the 2nd half of the subnet, so put DHCP in the 1st half.
+ if ($ipaddresses_before > 30) {
+ // There is reasonable space in the subnet, use a smaller chunk of the space for DHCP
+ $config['dhcpd']['lan']['range']['from'] = ip_after($lowestip, 10);
+ $config['dhcpd']['lan']['range']['to'] = ip_before($_POST['lanipaddress'], 9);
+ } else {
+ // There is not much space in the subnet, so allocate everything below the LAN IP to DHCP.
+ $config['dhcpd']['lan']['range']['from'] = ip_after($lowestip);
+ $config['dhcpd']['lan']['range']['to'] = ip_before($_POST['lanipaddress']);
+ }
+ }
+ ]]>
+ </stepsubmitphpaction>
+</step>
+<step>
+ <id>7</id>
+ <title>Set Admin WebGUI Password</title>
+ <description>On this screen we will set the admin password, which is used to access the WebGUI and also SSH services if you wish to enable them.</description>
+ <fields>
+ <field>
+ <name>Admin Password</name>
+ <type>password</type>
+ </field>
+ <field>
+ <name>Admin Password AGAIN</name>
+ <type>password</type>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>
+ if($_POST['adminpassword'] != "") {
+ if($_POST['adminpassword'] == $_POST['adminpasswordagain']) {
+ $admin_user =&amp; getUserEntryByUID(0);
+ local_user_set_password($admin_user, $_POST['adminpassword']);
+ local_user_set($admin_user);
+ write_config();
+ } else {
+ print_info_box_np("Passwords do not match! Please press back in your browser window and correct.");
+ die;
+ }
+ }
+ </stepsubmitphpaction>
+</step>
+<step>
+ <id>8</id>
+ <title>Reload configuration</title>
+ <disableheader>true</disableheader>
+ <description>Click 'Reload' to reload pfSense with new changes.</description>
+ <fields>
+ <field>
+ <name>Reload</name>
+ <type>submit</type>
+ </field>
+ </fields>
+</step>
+<step>
+ <id>9</id>
+ <title>Reload in progress</title>
+ <description>
+ A reload is now in progress. Please wait. &lt;p&gt;
+ &lt;meta http-equiv="refresh" content="5; url=wizard.php?xml=setup_wizard.xml&amp;stepid=9" &gt;
+ &lt;p&gt;
+ The wizard will redirect to the next step once the reload is completed.
+ </description>
+ <stepafterformdisplay>
+ <![CDATA[
+ $config['system']['hostname'] = $config['wizardtemp']['system']['hostname'];
+ $config['system']['domain'] = $config['wizardtemp']['system']['domain'];
+ if (!empty($config['wizardtemp']['wangateway'])) {
+ if (!is_array($config['gateways']['gateway_item']))
+ $config['gateways']['gateway_item'] = array();
+ $found = false;
+ $defaultgw_found = false;
+ foreach ($config['gateways']['gateway_item'] as & $gw) {
+ if ($gw['interface'] != "wan")
+ continue;
+ if (isset($gw['defaultgw']))
+ $defaultgw_found = true;
+ if ($gw['name'] == 'WANGW' || (!empty($config['wizardtemp']['wangateway']) && $gw['gateway'] == $config['wizardtemp']['wangateway'])) {
+ $found = true;
+ $gw['gateway'] = $config['wizardtemp']['wangateway'];
+ $config['interfaces']['wan']['gateway'] = $gw['name'];
+ }
+ }
+ if (!$found) {
+ $newgw = array();
+ $newgw['interface'] = "wan";
+ $newgw['gateway'] = $config['wizardtemp']['wangateway'];
+ $newgw['name'] = "WANGW";
+ $newgw['weight'] = 1;
+ $newgw['descr'] = "WAN Gateway";
+ $newgw['defaultgw'] = !$defaultgw_found;
+ $config['gateways']['gateway_item'][] = $newgw;
+ $config['interfaces']['wan']['gateway'] = "WANGW";
+ }
+ }
+ unset($config['wizardtemp']);
+ write_config();
+ reload_all();
+ mwexec_bg("/etc/rc.update_bogons.sh now");
+ ]]>
+ </stepafterformdisplay>
+</step>
+<step>
+ <id>10</id>
+ <title>Wizard completed.</title>
+ <stepbeforeformdisplay>
+ <![CDATA[
+ if($g['product_name'] <> 'pfSense') {
+ header("Location: " . fixup_string("\$myurl"));
+ exit;
+ }
+ ]]>
+ </stepbeforeformdisplay>
+ <description>
+ <![CDATA[
+ Congratulations! pfSense is now configured.<p/>
+ Please consider contributing back to the project!<p/>
+ Click <a target='_new' href='https://www.pfsense.org/get-involved/index.html'>here</a> to purchase services offered by the pfSense team and find other ways to contribute.<p/>
+ Click <a href='$myurl'>here</a> to continue on to pfSense webConfigurator.
+ ]]>
+ </description>
+</step>
+</pfsensewizard>
diff --git a/src/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc b/src/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc
new file mode 100644
index 0000000..d984fed
--- /dev/null
+++ b/src/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc
@@ -0,0 +1,1664 @@
+<?php
+/*
+ traffic_shaper_wizard_dedicated.inc
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2006 Bill Marquette - bill.marquette@gmail.com.
+ Copyright (C) 2006 Scott Ullrich - sullrich@pfsense.com.
+ Copyright (C) 2008-2010 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+function step1_stepbeforeformdisplay() {
+ global $stepid, $savemsg, $pkg;
+
+ $fields =& $pkg['step'][0]['fields']['field'];
+
+ $wans = 0;
+ $lans = 0;
+
+ $iflisttmp = get_configured_interface_with_descr();
+ foreach ($iflisttmp as $if => $ifdesc) {
+ if (!is_altq_capable(get_real_interface($if)))
+ continue;
+ if (interface_has_gateway($if) || interface_has_gatewayv6($if))
+ $wans++;
+ else
+ $lans++;
+ }
+
+ foreach ($fields as &$field)
+ if ($field['name'] == 'numberofconnections')
+ $field['value'] = ($wans < $lans ? $wans : $lans);
+}
+
+function step1_submitphpaction() {
+ global $stepid, $savemsg;
+
+ if (!isset($_POST['numberofconnections'])) {
+ $savemsg=gettext("You need to specify the number of connections.");
+ $stepid--;
+ return;
+ }
+ if (intval($_POST['numberofconnections']) < 1) {
+ $savemsg=gettext("The number of connections should be greater than 1.");
+ $stepid--;
+ return;
+ }
+}
+
+function step2_stepbeforeformdisplay() {
+ global $config, $pkg;
+ global $stepid, $savemsg;
+
+ $wans = 0;
+ $lans = 0;
+ $iflist = array();
+ $iflisttmp = get_configured_interface_with_descr();
+ foreach ($iflisttmp as $if => $ifdesc) {
+ if (!is_altq_capable(get_real_interface($if)))
+ continue;
+ if (interface_has_gateway($if) || interface_has_gatewayv6($if))
+ $wans++;
+ else
+ $lans++;
+ $iflist[$if] = $ifdesc;
+ }
+ $numberofconnections = intval($config['ezshaper']['step1']['numberofconnections']);
+ if ($numberofconnections > ($wans < $lans ? $wans : $lans)) {
+ $savemsg=gettext("You have less interfaces than number of connections!");
+ $stepid--;
+ return;
+ }
+
+ $cfgname = "traffic_shaper_wizard_dedicated.xml";
+
+ $fields =& $pkg['step'][1]['fields']['field'];
+
+ /*
+ unset($config['ezshaper']['step2']);
+ $config['ezshaper']['step2'] = array();
+ write_config();
+ */
+ $fields = array();
+
+ for ($i = 0; $i < $numberofconnections; $i++) {
+ $field = array();
+ $linknum = $i+1;
+ $ifsel = ($i * 2);
+ $field['name'] = "Connection #{$linknum} parameters";
+ $field['type'] = "listtopic";
+ $fields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Local interface";
+ $field['name'] = "local{$i}interface";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $ifcnt = 0;
+ foreach ($iflist as $ifname => $ifdescr) {
+ // Skip wan interfaces here
+ if (interface_has_gateway($ifname) || interface_has_gatewayv6($ifname))
+ continue;
+ if ($ifcnt == ($ifsel + 1))
+ $field['value'] = $ifname;
+ $opts = array();
+ $opts['displayname'] = $ifdescr;
+ $opts['name'] = $ifname;
+ $opts['value'] = $ifname;
+ $field['options']['option'][] = $opts;
+ $ifcnt++;
+ }
+ $field['combinefieldsbegin'] = "true";
+ $field['bindstofield'] = "ezshaper->step2->local{$i}interface";
+ $fields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "local{$i}downloadscheduler";
+ $field['type'] = "select";
+ $field['typehint'] = "Queueing discipline to apply on the download of this connection.";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['name'] = "HFSC";
+ $opts['value'] = "HFSC";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "CBQ";
+ $opts['value'] = "CBQ";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "PRIQ";
+ $opts['value'] = "PRIQ";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step2->local{$i}downloadscheduler";
+ $fields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "WAN Interface";
+ $field['name'] = "conn{$i}interface";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $ifcnt = 0;
+ foreach ($iflist as $ifname => $ifdescr) {
+ // Skip lan interfaces here
+ if (!interface_has_gateway($ifname) && !interface_has_gatewayv6($ifname))
+ continue;
+ if ($ifcnt == $ifsel)
+ $field['value'] = $ifname;
+ $opts = array();
+ $opts['displayname'] = $ifdescr;
+ $opts['name'] = $ifname;
+ $opts['value'] = $ifname;
+ $field['options']['option'][] = $opts;
+ $ifcnt++;
+ }
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}interface";
+ $field['combinefieldsbegin'] = "true";
+ $fields[] = $field;
+
+ $field = array();
+ $field['name'] = "conn{$i}uploadscheduler";
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['type'] = "select";
+ $field['typehint'] = "Queueing discipline to apply on the upload of this connection.";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['name'] = "HFSC";
+ $opts['value'] = "HFSC";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "CBQ";
+ $opts['value'] = "CBQ";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "PRIQ";
+ $opts['value'] = "PRIQ";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}uploadscheduler";
+ $fields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Upload";
+ $field['name'] = "conn{$i}upload";
+ $field['type'] = "input";
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}upload";
+ $field['combinefieldsbegin'] = "true";
+ $fields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "conn{$i}uploadspeed";
+ $field['typehint'] = "Upload bandwidth on this connection.";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['value'] = "Kb";
+ $opts['name'] = "Kbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Mb";
+ $opts['name'] = "Mbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Gb";
+ $opts['name'] = "Gbit/s";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}uploadspeed";
+ $fields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Download";
+ $field['name'] = "conn{$i}download";
+ $field['type'] = "input";
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}download";
+ $field['combinefieldsbegin'] = "true";
+ $fields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "conn{$i}downloadspeed";
+ $field['typehint'] = "Download bandwidth on this connection.";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['value'] = "Kb";
+ $opts['name'] = "Kbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Mb";
+ $opts['name'] = "Mbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Gb";
+ $opts['name'] = "Gbit/s";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}downloadspeed";
+ $fields[] = $field;
+ }
+ $field = array();
+ $field['name'] = "Next";
+ $field['type'] = "submit";
+ $fields[] = $field;
+}
+
+function step2_stepsubmitphpaction() {
+ global $config;
+ global $stepid, $savemsg;
+ $sumdownloads = 0;
+
+ /* Input Validation */
+ $steps = intval($config['ezshaper']['step1']['numberofconnections']);
+ for ($i = 0; $i < $steps; $i++) {
+ for ($j = $i + 1; $j <= $steps; $j++) {
+ if ($_POST["conn{$i}interface"] == $_POST["conn{$j}interface"] || $_POST["conn{$i}interface"] == $_POST["local{$j}interface"]) {
+ $savemsg=gettext("You cannot select the same interface for connections {$i} and {$j}.");
+ $stepid--;
+ return;
+ }
+ if (trim($_POST["conn{$i}uploadscheduler"]) != "PRIQ") {
+ if (!is_numeric($_POST["conn{$i}upload"])) {
+ $savemsg = gettext("Upload bandwidth of connection {$i} is not valid.");
+ $stepid--;
+ return;
+ }
+ if (!is_numeric($_POST["conn{$i}download"])) {
+ $savemsg = gettext("Download bandwidth of connection {$i} is not valid.");
+ $stepid--;
+ return;
+ }
+ $upbw = $_POST["conn{$i}upload"];
+ $downbw = $_POST["conn{$i}download"];
+ if ($upbw < 1 || $downbw < 1) {
+ $savemsg = gettext("You cannot specify bandwidth smaller than 1!");
+ $stepid--;
+ return;
+ }
+ if (intval($upbw) < 128 && $_POST["conn{$i}uploadspeed"] == "Kb" && trim($_POST["conn{$i}uploadscheduler"]) == "CBQ") {
+ $savemsg=gettext("Uploads smaller than 128Kbit/s is not supported for connection {$i} on CBQ scheduler.");
+ $stepid--;
+ return;
+ }
+ }
+ if ($_POST["local{$i}interface"] == $_POST["conn{$j}interface"] || $_POST["local{$i}interface"] == $_POST["local{$j}interface"]) {
+ $savemsg=gettext("You cannot select the same interface for local and outside.");
+ $stepid--;
+ return;
+ }
+ }
+ }
+
+ /* This is necessary since the wizard expects predefined fields. */
+ unset($config['ezshaper']['step2']);
+ $config['ezshaper']['step2'] = array();
+
+ for ($i = 0; $i < $steps; $i++) {
+ $config['ezshaper']['step2']["local{$i}downloadscheduler"] = $_POST["local{$i}downloadscheduler"];
+ $config['ezshaper']['step2']["local{$i}interface"] = $_POST["local{$i}interface"];
+ $config['ezshaper']['step2']["conn{$i}uploadscheduler"] = $_POST["conn{$i}uploadscheduler"];
+ $config['ezshaper']['step2']["conn{$i}upload"] = $_POST["conn{$i}upload"];
+ $config['ezshaper']['step2']["conn{$i}uploadspeed"] = $_POST["conn{$i}uploadspeed"];
+ $config['ezshaper']['step2']["conn{$i}download"] = $_POST["conn{$i}download"];
+ $config['ezshaper']['step2']["conn{$i}downloadspeed"] = $_POST["conn{$i}downloadspeed"];
+ $config['ezshaper']['step2']["conn${i}interface"] = $_POST["conn{$i}interface"];
+ }
+}
+
+function step3_stepbeforeformdisplay() {
+ global $config, $pkg;
+ global $stepid, $savemsg;
+
+ $cfgname = "traffic_shaper_wizard_dedicated.xml";
+
+ $numberofconnections = intval($config['ezshaper']['step1']['numberofconnections']);
+
+ $fields =& $pkg['step'][1]['fields']['field'];
+
+ $voipfields =& $pkg['step'][2]['fields']['field'];
+
+ $voipfields = array();
+ $enablefields = array();
+
+ $field = array();
+ $field['name'] = "Enable";
+ $field['type'] = "checkbox";
+ $field['typehint'] = "Prioritize Voice over IP traffic.";
+ $field['bindstofield'] = "ezshaper->step3->enable";
+ $field['descritpion'] = "This will raise the priority of VOIP traffic above all other traffic.";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['name'] = "Next";
+ $field['type'] = "submit";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['name'] = "VOIP specific settings";
+ $field['type'] = "listtopic";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['name'] = "Provider";
+ $enablefields[] = "Provider";
+ $field['type'] = "select";
+ $field['description'] = "Choose Generic if your provider isn't listed.";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['name'] = "Generic (lowdelay)";
+ $opts['value'] = "Generic";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "VoicePulse";
+ $opts['value'] = "VoicePulse";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "Asterisk/Vonage";
+ $opts['value'] = "Asterisk";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "PanasonicTDA";
+ $opts['value'] = "Panasonic";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step3->provider";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Upstream SIP Server";
+ $field['name'] = "upstream_sip_server";
+ $enablefields[] = "upstream_sip_server";
+ $field['type'] = "inputalias";
+ $field['description'] = "(Optional) If this is chosen, the provider field will be overridden. This allows you to provide the IP address of the <strong>remote</strong> PBX or SIP Trunk to prioritize. <br />NOTE: You can also use a Firewall Alias in this location.";
+ $field['message'] = "IP Address field is non-blank and doesn't look like an IP address.";
+ $field['bindstofield'] = "ezshaper->step3->address";
+ $voipfields[] = $field;
+
+ for ($i = 0; $i < $numberofconnections; $i++) {
+ $connum = $i + 1;
+ $field = array();
+ $field['name'] = "Connection #{$connum} parameters";
+ $field['type'] = "listtopic";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Upload";
+ $field['name'] = "conn{$i}upload";
+ $enablefields[] = "conn{$i}upload";
+ $field['type'] = "input";
+ $field['bindstofield'] = "ezshaper->step3->conn{$i}upload";
+ $field['combinefieldsbegin'] = "true";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "conn{$i}uploadspeed";
+ $enablefields[] = "conn{$i}uploadspeed";
+ $field['typehint'] = "Upload bandwidth guarantee for VOIP phone(s) on connection {$i}.";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['value'] = "Kb";
+ $opts['name'] = "Kbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Mb";
+ $opts['name'] = "Mbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Gb";
+ $opts['name'] = "Gbit/s";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step3->conn{$i}uploadspeed";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Download";
+ $field['name'] = "local{$i}download";
+ $enablefields[] = "local{$i}download";
+ $field['type'] = "input";
+ $field['bindstofield'] = "ezshaper->step3->local{$i}download";
+ $field['combinefieldsbegin'] = "true";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "local{$i}downloadspeed";
+ $enablefields[] = "local{$i}downloadspeed";
+ $field['typehint'] = "Download bandwidth guarantee for VOIP phone(s) on connections.";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['value'] = "Kb";
+ $opts['name'] = "Kbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Mb";
+ $opts['name'] = "Mbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Gb";
+ $opts['name'] = "Gbit/s";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step3->local{$i}downloadspeed";
+ $voipfields[] = $field;
+ }
+
+ $field = array();
+ $field['name'] = "Next";
+ $field['type'] = "submit";
+ $voipfields[] = $field;
+ $voipfields[0]['enablefields'] = implode(",", $enablefields);
+}
+
+function step3_stepsubmitphpaction() {
+ global $config;
+ global $stepid, $savemsg;
+
+ if (!$_POST['enable'])
+ return;
+
+ if($_POST['upstream_sip_server']) {
+ if(!is_ipaddroralias($_POST['upstream_sip_server'])) {
+ /* item is not an ip or alias. error out */
+ $savemsg=gettext("Address must be a valid IP address or Firewall Alias. Please correct this value to continue.");
+ $stepid--;
+ return;
+ }
+ }
+
+ $steps = intval($config['ezshaper']['step1']['numberofconnections']);
+ for ($i = 0; $i < $steps; $i++) {
+ if ($config['ezshaper']['step2']["conn{$i}uploadscheduler"] != "PRIQ") {
+ if (!is_numeric($_POST["conn{$i}upload"])) {
+ $savemsg = gettext("Upload bandwidth of connection {$i} is not valid.");
+ $stepid--;
+ return;
+ }
+ if ($_POST["conn{$i}uploadspeed"] == "%") {
+ if (intval($_POST["conn{$i}upload"]) > 80) {
+ $savemsg=gettext("You cannot set the VoIP upload bandwidth on connection {$i} higher than 80% of the connection.");
+ $stepid--;
+ return;
+ }
+ } else {
+ $factor = wizard_get_bandwidthtype_scale($config['ezshaper']['step2']["conn{$i}uploadspeed"]);
+ $ifbw = $factor * floatval($config['ezshaper']['step2']["conn{$i}upload"]);
+ $factor = wizard_get_bandwidthtype_scale($_POST["conn{$i}uploadspeed"]);
+ $input_bw = $factor * floatval($_POST["conn{$i}upload"]);
+ if ((0.8 * $ifbw) < $input_bw) {
+ $savemsg=gettext("You cannot set the VoIP upload bandwidth on connection {$i} higher than 80% of the connection.");
+ $stepid--;
+ return;
+ }
+ }
+ }
+
+ if ($config['ezshaper']['step2']["local{$i}downloadscheduler"] != "PRIQ") {
+ if (!is_numeric($_POST["local{$i}download"])) {
+ $savemsg = gettext("Download bandwidth of connection {$i} is not valid.");
+ $stepid--;
+ return;
+ }
+ if ($_POST["local{$i}downloadspeed"] == "%") {
+ if (intval($_POST["local{$i}download"]) > 80) {
+ $savemsg=gettext("You cannot set the VoIP upload bandwidth on connection {$i} higher than 80% of the connection.");
+ $stepid--;
+ return;
+ }
+ } else {
+ $factor = wizard_get_bandwidthtype_scale($config['ezshaper']['step2']["conn{$i}downloadspeed"]);
+ $ifbw = $factor * floatval($config['ezshaper']['step2']["conn{$i}download"]);
+ $factor = wizard_get_bandwidthtype_scale($_POST["local{$i}downloadspeed"]);
+ $input_bw = $factor * floatval($_POST["local{$i}download"]);
+ if ((0.8 * $ifbw) < $input_bw) {
+ $savemsg=gettext("You cannot set the VoIP download bandwidth on connection {$i} higher than 80% of the connection.");
+ $stepid--;
+ return;
+ }
+ }
+ }
+ }
+
+ /* This is necessary since the wizard expects predefined fields. */
+ unset($config['ezshaper']['step3']);
+ $config['ezshaper']['step3'] = array();
+
+ if (!empty($_POST['upstream_sip_server']))
+ $config['ezshaper']['step3']['address'] = $_POST['upstream_sip_server'];
+ if ($_POST['enable'] == 'on')
+ $config['ezshaper']['step3']['enable'] = 'on';
+ for ($i = 0; $i < $steps; $i++) {
+ $config['ezshaper']['step3']["local{$i}download"] = $_POST["local{$i}download"];
+ $config['ezshaper']['step3']["local{$i}downloadspeed"] = $_POST["local{$i}downloadspeed"];
+ $config['ezshaper']['step3']["conn{$i}upload"] = $_POST["conn{$i}upload"];
+ $config['ezshaper']['step3']["conn{$i}uploadspeed"] = $_POST["conn{$i}uploadspeed"];
+ }
+}
+
+function step4_stepsubmitphpaction() {
+ global $config;
+ global $stepid, $savemsg;
+
+ if ( $_POST['enable'] ) {
+ if(!$_POST['bandwidth']) {
+ $savemsg="You need to specify a value for bandwidth!";
+ $stepid--;
+ return;
+ }
+ if(!is_numeric($_POST['bandwidth'])) {
+ $savemsg="The posted value is not a valid bandwidth.";
+ $stepid--;
+ return;
+ }
+
+ if ($_POST['bandwidthspeed'] <> "%") {
+ $savemsg = gettext("Only percentage bandwidth specification is allowed.");
+ $stepid--;
+ return;
+ }
+ $bw = $_POST['bandwidth'];
+ if($bw > 15 || $bw < 2) {
+ $savemsg="Values should be between 2% and 15%!";
+ $stepid--;
+ return;
+ }
+ if($_POST['address'] <> "" && !is_ipaddroralias($_POST['address'])) {
+ /* item is not an ip or alias. error out */
+ $savemsg=gettext("Address must be a valid IP address or Firewall Alias. Please correct this value to continue.");
+ $stepid--;
+ }
+ }
+}
+
+function step5_stepsubmitphpaction() {
+ global $stepid, $savemsg;
+
+ if ( $_POST['enable'] ) {
+ if ($_POST['p2pcatchall']) {
+ if(!is_numeric($_POST['bandwidth'])) {
+ $savemsg="Posted value is not a valid bandwidth.";
+ $stepid--;
+ return;
+ }
+ if ($_POST['bandwidthspeed'] <> "%") {
+ $savemsg = gettext("Only percentage bandwidth specification is allowed.");
+ $stepid--;
+ return;
+ }
+ $bw = $_POST['bandwidth'];
+ if($bw > 15 || $bw < 2) {
+ $savemsg="Values should be between 2% and 15%!";
+ $stepid--;
+ return;
+ }
+ }
+ }
+}
+
+function step8_stepsubmitphpaction() {
+ global $g, $config;
+
+ /* save the new configuration */
+ apply_all_chosen_items();
+
+ /* reset rrd queues */
+ system("rm -f /var/db/rrd/*queuedrops.rrd");
+ system("rm -f /var/db/rrd/*queues.rrd");
+ enable_rrd_graphing();
+
+ /* apply the new configuration to the system */
+ filter_configure();
+
+ /* And we're no longer dirty! */
+ clear_subsystem_dirty('shaper');
+
+ update_filter_reload_status("Initializing");
+ header("Location: status_filter_reload.php");
+ exit;
+}
+
+function apply_all_chosen_items() {
+ global $config, $g, $altq_list_queues, $gamesplist, $voiplist, $othersplist, $p2plist;
+
+ require_once("wizardapp.inc");
+
+ /*
+ * Wipe previous config.
+ * Doing it here makes sense since we can wipe the previous config only after
+ * the user decides to do so, finishing the wizard.
+ */
+ if(isset($config['shaper']['queue']))
+ unset($config['shaper']['queue']);
+ /* XXX: This is redundant, because this should be handled by converter at startup. */
+ if(isset($config['shaper']['rule']))
+ unset($config['shaper']['rule']);
+ foreach ($config['filter']['rule'] as $key => $rule)
+ if ($rule['wizard'] == "yes")
+ unset($config['filter']['rule'][$key]);
+
+ /* restart the cached config */
+ unset($altq_list_queues);
+ $altq_list_queues = array();
+
+ $steps = intval($config['ezshaper']['step1']['numberofconnections']);
+
+ $interfacelist = array();
+
+ for ($i = 0; $i < $steps; $i++) {
+
+ $tmppath = array();
+ $altq =& new altq_root_queue();
+
+ $altq->SetInterface($config['ezshaper']['step2']["conn{$i}interface"]);
+ $interfacelist[] = $config['ezshaper']['step2']["conn{$i}interface"];
+ $altq->SetScheduler($config['ezshaper']['step2']["conn{$i}uploadscheduler"]);
+ $altq->SetBandwidth(floatval($config['ezshaper']['step2']["conn{$i}upload"]));
+ $altq->SetBwscale($config['ezshaper']['step2']["conn{$i}uploadspeed"]);
+ $altq->SetEnabled("on");
+ $altq_list_queues[$altq->GetQname()] =& $altq;
+ array_push($tmppath, $config['ezshaper']['step2']["conn{$i}interface"]);
+ $altq->SetLink($tmppath);
+ $altq->wconfig();
+
+ $sched = $config['ezshaper']['step2']["conn{$i}uploadscheduler"];
+ $voipbw =0;
+ $voipbwunit = "Kb";
+ $voip = false;
+ $penalty = false;
+ $penaltybw = 0;
+ $penaltybwunit = "Kb";
+ $p2p = false;
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ $p2pcatchbwunit = "%";
+ $games = false;
+ $otherpriority = false;
+ $remainbw = 0;
+ $factor = 0;
+ $upfactor = wizard_get_bandwidthtype_scale($config['ezshaper']['step2']["conn{$i}uploadspeed"]);
+ $upbw = floatval($config['ezshaper']['step2']["conn{$i}upload"]) * $upfactor;
+
+ if ($config['ezshaper']['step3']['enable']) {
+ $voip = true;
+ $voipbw = $config['ezshaper']['step3']["conn{$i}upload"];
+ $voipbwunit = $config['ezshaper']['step3']["conn{$i}uploadspeed"];
+ if ($voipbwunit == "%")
+ $factor = $upbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($voipbwunit);
+ $remainbw += $voipbw * $factor;
+ }
+ if ($config['ezshaper']['step4']['enable']) {
+ $penalty = true;
+ $penaltybw = $config['ezshaper']['step4']['bandwidth'];
+ $penaltybwunit = $config['ezshaper']['step4']['bandwidthunit'];
+ if ($penaltybwunit == "%")
+ $factor = $upbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($penaltybwunit);
+ $remainbw += $penaltybw * $factor;
+ } else {
+ $penalty = false;
+ $penaltybw = 0;
+ }
+ if ($config['ezshaper']['step5']['enable']) {
+ $p2p = true;
+ if ($config['ezshaper']['step5']['p2pcatchall']) {
+ $p2pcatchall = true;
+ $p2pcatchbw = $config['ezshaper']['step5']['bandwidth'];
+ $p2pcatchbwunit = $config['ezshaper']['step5']['bandwidthunit'];
+ if ($p2pcatchbwunit == "%")
+ $factor = $upbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($p2pcatchbwunit);
+ $remainbw += $p2pcatchbw * $factor;
+ } else {
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ }
+ } else {
+ $p2p = false;
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ }
+ if ($config['ezshaper']['step6']['enable']) {
+ $games = true;
+ } else {
+ $games = false;
+ }
+
+ if ($config['ezshaper']['step7']['enable']) {
+ $otherpriority = true;
+ } else {
+ $otherpriority = false;
+ }
+ $remainbw = round($remainbw / $upbw * 100, 2);
+
+ if (intval($remainbw) > 0 && intval($remainbw) > 30) {
+ $savemsg=gettext("Custom Bandwidths are greater than 30%. Please lower them for the wizard to continue.");
+ header("Location: wizard.php?xml=traffic_shaper_wizard_dedicated.xml&stepid=2&message={$savemsg}");
+ exit;
+ } else {
+ $remainbw = 100 - $remainbw;
+ }
+
+ if ($sched != "PRIQ") {
+ if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qInternet";
+ //$tmpcf['priority'] = 6;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ If ($sched == "CBQ") {
+ $tmpcf['bandwidth'] = floatval($config['ezshaper']['step2']["conn{$i}upload"]);
+ $tmpcf['bandwidthtype'] = $config['ezshaper']['step2']["conn{$i}uploadspeed"];
+ }
+ else if ($sched == "HFSC") {
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] =
+ floatval($config['ezshaper']['step2']["conn{$i}upload"]) . $config['ezshaper']['step2']["conn{$i}uploadspeed"];
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = floatval($config['ezshaper']['step2']["conn{$i}upload"]) . $config['ezshaper']['step2']["conn{$i}uploadspeed"];
+ $tmpcf['bandwidth'] = floatval($config['ezshaper']['step2']["conn{$i}upload"]);
+ $tmpcf['bandwidthtype'] = $config['ezshaper']['step2']["conn{$i}uploadspeed"];
+ }
+ array_push($tmppath, "qInternet");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ //array_pop($tmppath);
+ //echo "qInternet <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ $altq =& $qtmp;
+ }
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qACK";
+ $tmpcf['priority'] = 6;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ If ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.2;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ else if ($sched == "HFSC") {
+ $lkbw = 0.20 * $remainbw;
+ $tmpcf['linkshare3'] = "{$lkbw}%";
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['bandwidth'] = $lkbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qACK");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qACK <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ if ($p2pcatchall)
+ $tmpcf['name'] = "qOthersDefault";
+ else
+ $tmpcf['name'] = "qDefault";
+ $tmpcf['priority'] = 3;
+ $tmpcf['enabled'] = "on";
+ if (!$p2pcatchall)
+ $tmpcf['default'] = "on";
+ $tmpcf['ecn'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpcf['bandwidth'] = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, $tmpcf['name']);
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qDefault <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+ if ($p2p) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qP2P";
+ $tmpcf['priority'] = 1;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($p2pcatchall) {
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $p2pcatchbw;
+ $tmpcf['bandwidthtype'] = $p2pcatchbwunit;
+ } else if ($sched == "HFSC") {
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$p2pcatchbw}{$p2pcatchbwunit}";
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] = "{$p2pcatchbw}{$p2pcatchbwunit}";
+ $tmpcf['bandwidth'] = $p2pcatchbw;
+ $tmpcf['bandwidthtype'] = $p2pcatchbwunit;
+ }
+ $tmpcf['default'] = "on";
+
+ } else {
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpbw = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$tmpbw}%";
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] = "{$tmpbw}%";
+ $tmpcf['bandwidth'] = $tmpbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ }
+ array_push($tmppath, "qP2P");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qP2P <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($voip) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qVoIP";
+ $tmpcf['priority'] = 7;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ if ($voipbw > 0) {
+ $tmpcf['bandwidth'] = $voipbw;
+ $tmpcf['bandwidthtype'] = $voipbwunit;
+ } else {
+ $tmpcf['bandwidth'] = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ } else if ($sched == "HFSC") {
+ if ($voipbw > 0) {
+ $tmpcf['realtime3'] = "{$voipbw}{$voipbwunit}";
+ } else {
+ $voipbw = $remainbw * 0.20; /* 20% bandwidth */
+ $tmpcf['realtime3'] = "{$voipbw}%";
+ }
+ $tmpcf['realtime'] = "on";
+ $tmpcf['bandwidth'] = 32;
+ $tmpcf['bandwidthtype'] = "Kb";
+ }
+ array_push($tmppath, "qVoIP");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qVoIP <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($games) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qGames";
+ $tmpcf['priority'] = 5;
+ $tmpcf['enabled'] = "on";
+ $tmpcf['ecn'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $gamesbw = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$gamesbw}%";
+ $tmpcf['bandwidth'] = "{$gamesbw}";
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qGames");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qGames <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($otherpriority) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qOthersHigh";
+ $tmpcf['priority'] = 4;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpcf['linkshare'] = "on";
+ $otherbw = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['linkshare3'] = "{$otherbw}%";
+ $tmpcf['bandwidth'] = $otherbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qOthersHigh");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qHigh <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qOthersLow";
+ $tmpcf['priority'] = 2;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ if ($penalty) {
+ $tmpcf['bandwidthtype'] = $penaltybwunit;
+ $tmpcf['bandwidth'] = $penaltybw;
+ } else {
+ $tmpcf['bandwidth'] = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ } else if ($sched == "HFSC") {
+ if ($penalty) {
+ $tmpcf['linkshare3'] = "{$penaltybw}{$penaltybwunit}";
+ $tmpcf['bandwidth'] = $penaltybw;
+ $tmpcf['bandwidthtype'] = $penaltybwunit;
+ } else {
+ $lsbw = $remainbw * 0.05;
+ $tmpcf['linkshare3'] = "{$lsbw}%"; /* 5% bandwidth */
+ $tmpcf['bandwidth'] = $lsbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ $tmpcf['linkshare'] = "on";
+ }
+ array_push($tmppath, "qOthersLow");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qLow <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+ array_pop($tmppath);
+
+ $downfactor = wizard_get_bandwidthtype_scale($config['ezshaper']['step2']["conn{$i}downloadspeed"]);
+ $downbw = floatval($config['ezshaper']['step2']["conn{$i}download"]) * $downfactor;
+
+ $tmppath = array();
+ $altq =& new altq_root_queue();
+
+ $altq->SetInterface($config['ezshaper']['step2']["local{$i}interface"]);
+ $altq->SetScheduler($config['ezshaper']['step2']["local{$i}downloadscheduler"]);
+ //$altq->SetBandwidth($config['ezshaper']['step2']["conn{$i}download"]);
+ //$altq->SetBwscale($config['ezshaper']['step2']["conn{$i}downloadspeed"]);
+ $altq->SetEnabled("on");
+ $altq_list_queues[$altq->GetQname()] =& $altq;
+ array_push($tmppath, $config['ezshaper']['step2']["local{$i}interface"]);
+ $altq->SetLink($tmppath);
+ //var_dump($input_errors);
+ $altq->wconfig();
+
+ $sched = $config['ezshaper']['step2']["local{$i}downloadscheduler"];
+ $voipbw =0;
+ $voipbwunit = "%";
+ $voip = false;
+ $penalty = false;
+ $penaltybw = 0;
+ $penaltybwunit = "%";
+ $p2p = false;
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ $games = false;
+ $otherpriority = false;
+ $remainbw = 0;
+
+ if ($config['ezshaper']['step3']['enable']) {
+ $voip = true;
+ $voipbw = $config['ezshaper']['step3']["local{$i}download"];
+ $voipbwunit = $config['ezshaper']['step3']["local{$i}downloadspeed"];
+ if ($sched != HFSC) {
+ if ($voipbwunit == "%")
+ $factor = $downbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($voipbwunit);
+ $remainbw += floatval($voipbw) * $factor;
+ } else
+ $remainbw += 32000; /* 32Kbit/s reserved for HFSC link sharing */
+ }
+ if ($config['ezshaper']['step4']['enable']) {
+ $penalty = true;
+ $penaltybw = $config['ezshaper']['step4']['bandwidth'];
+ $penaltybwunit = $config['ezshaper']['step4']['bandwidthunit'];
+ if ($penaltybwunit == "%")
+ $factor = $downbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($penaltybwunit);
+ $remainbw += floatval($penaltybw) * $factor;
+ } else {
+ $penalty = false;
+ $penaltybw = 0;
+ }
+ if ($config['ezshaper']['step5']['enable']) {
+ $p2p = true;
+ if ($config['ezshaper']['step5']['p2pcatchall']) {
+ $p2pcatchall = true;
+ $p2pcatchbw = $config['ezshaper']['step5']['bandwidth'];
+ $p2pcatchbwunit = $config['ezshaper']['step5']['bandwidthunit'];
+ if ($p2pcatchbwunit == "%")
+ $factor = $downbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($p2pcatchbwunit);
+ $remainbw += floatval($p2pcatchbw) * $factor;
+ } else {
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ }
+ } else {
+ $p2p = false;
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ }
+ if ($config['ezshaper']['step6']['enable']) {
+ $games = true;
+ } else {
+ $games = false;
+ }
+
+ if ($config['ezshaper']['step7']['enable']) {
+ $otherpriority = true;
+ } else {
+ $otherpriority = false;
+ }
+ $remainbw = round($remainbw / $downbw * 100, 2);
+ if (intval($remainbw) > 0 && intval($remainbw) > 40) {
+ $savemsg=gettext("Custom Bandwidths are greater than 40%. Please lower them for the wizard to continue.");
+ header("Location: wizard.php?xml=traffic_shaper_wizard_dedicated.xml&stepid=2&message={$savemsg}");
+ exit;
+ } else {
+ $remainbw = 100 - $remainbw;
+ }
+
+ if (!$p2pcatchall) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qLink";
+ $tmpcf['priority'] = 2;
+ $tmpcf['enabled'] = "on";
+ $tmpcf['default'] = "on";
+ $tmpcf['qlimit'] = 500;
+ $tmpcf['ecn'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = 20; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpcf['bandwidth'] = 20; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, $tmpcf['name']);
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qDefault <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($sched != "PRIQ") {
+ if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qInternet";
+ //$tmpcf['priority'] = 6;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ If ($sched == "CBQ") {
+ $tmpcf['bandwidth'] = floatval($config['ezshaper']['step2']["conn{$i}download"]);
+ $tmpcf['bandwidthtype'] = $config['ezshaper']['step2']["conn{$i}downloadspeed"];
+ }
+ else if ($sched == "HFSC") {
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] = floatval($config['ezshaper']['step2']["conn{$i}download"]) . $config['ezshaper']['step2']["conn{$i}downloadspeed"];
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = floatval($config['ezshaper']['step2']["conn{$i}download"]) . $config['ezshaper']['step2']["conn{$i}downloadspeed"];
+ $tmpcf['bandwidth'] = floatval($config['ezshaper']['step2']["conn{$i}download"]);
+ $tmpcf['bandwidthtype'] = $config['ezshaper']['step2']["conn{$i}downloadspeed"];
+ }
+ array_push($tmppath, "qInternet");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ //array_pop($tmppath);
+ //echo "qInternet <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ $altq =& $qtmp;
+ }
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qACK";
+ $tmpcf['priority'] = 6;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ If ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.2;
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $lkbw = 0.20 * $remainbw;
+ $tmpcf['linkshare3'] = "{$lkbw}%";
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['bandwidth'] = $lkbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qACK");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qACK $remainbw <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+ if ($p2p) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qP2P";
+ $tmpcf['priority'] = 1;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($p2pcatchall) {
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $p2pcatchbw;
+ $tmpcf['bandwidthtype'] = $p2pcatchbwunit;
+ } else if ($sched == "HFSC") {
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$p2pcatchbw}{$p2pcatchbwunit}";
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] = "{$p2pcatchbw}{$p2pcatchbwunit}";
+ $tmpcf['bandwidth'] = $p2pcatchbw;
+ $tmpcf['bandwidthtype'] = $p2pcatchbwunit;
+ }
+ $tmpcf['default'] = "on";
+ $tmpcf['qlimit'] = 500;
+ } else {
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpbw = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$tmpbw}%";
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] = "{$tmpbw}%";
+ $tmpcf['bandwidth'] = $tmpbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ }
+ array_push($tmppath, "qP2P");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qP2P <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($voip) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qVoIP";
+ $tmpcf['priority'] = 7;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ if ($voipbw > 0) {
+ $tmpcf['bandwidth'] = $voipbw;
+ $tmpcf['bandwidthtype'] = $voipbwunit;
+ } else {
+ $tmpcf['bandwidth'] = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ } else if ($sched == "HFSC") {
+ if ($voipbw > 0) {
+ $tmpcf['realtime3'] = "{$voipbw}{$voipbwunit}";
+ } else {
+ $voipbw = $remainbw * 0.20; /* 20% bandwidth */
+ $tmpcf['realtime3'] = "{$voipbw}%";
+ }
+ $tmpcf['realtime'] = "on";
+ $tmpcf['bandwidth'] = 32;
+ $tmpcf['bandwidthtype'] = "Kb";
+ }
+ array_push($tmppath, "qVoIP");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qVoIP <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($games) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qGames";
+ $tmpcf['priority'] = 5;
+ $tmpcf['enabled'] = "on";
+ $tmpcf['ecn'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $gamesbw = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$gamesbw}%";
+ $tmpcf['bandwidth'] = "{$gamesbw}";
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qGames");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qGames <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($otherpriority) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qOthersHigh";
+ $tmpcf['priority'] = 4;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpcf['linkshare'] = "on";
+ $otherbw = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['linkshare3'] = "{$otherbw}%";
+ $tmpcf['bandwidth'] = $otherbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qOthersHigh");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qHigh <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qOthersLow";
+ $tmpcf['priority'] = 3;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ if ($penalty) {
+ $tmpcf['bandwidth'] = $penaltybw;
+ $tmpcf['bandwidthtype'] = $penaltybwunit;
+ } else {
+ $tmpcf['bandwidthtype'] = "%";
+ $tmpcf['bandwidth'] = $remainbw * 0.05; /* 5% bandwidth */
+ }
+ } else if ($sched == "HFSC") {
+ if ($penalty) {
+ $tmpcf['linkshare3'] = "{$penaltybw}{$penaltybwunit}";
+ $tmpcf['bandwidth'] = $penaltybw;
+ $tmpcf['bandwidthtype'] = $penaltybwunit;
+ } else {
+ $lsbw = $remainbw * 0.05;
+ $tmpcf['linkshare3'] = "{$lsbw}%"; /* 5% bandwidth */
+ $tmpcf['bandwidth'] = $lsbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ $tmpcf['linkshare'] = "on";
+ }
+ array_push($tmppath, "qOthersLow");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qLow <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+ array_pop($tmppath);
+ }
+
+ if (!is_array($config['filter']['rule']))
+ $config['filter']['rule'] = array();
+
+ $interfacelist = implode(",", $interfacelist);
+
+ /* Rules */
+ if ($penalty) {
+ if( is_ipaddr($config['ezshaper']['step4']['address']) || is_alias($config['ezshaper']['step4']['address'])) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['descr'] = gettext("Penalty Box");
+ $rule['defaultqueue'] = "qOthersLow";
+ $rule['source']['address'] = $config['ezshaper']['step4']['address'];
+ $rule['destination']['any'] = TRUE;
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+ }
+
+ /* If user specifies an IP, we don't bother with providers */
+ if ($voip) {
+ if( is_ipaddr($config['ezshaper']['step3']['address']) || is_alias($config['ezshaper']['step3']['address'])) {
+ /* create VOIP rules */
+ $rule = array();
+ $rule['type'] = "match";
+ //$rule['interface'] = $interfacelist;
+ $rule['descr'] = gettext("Connections From Upstream SIP Server");
+ $rule['protocol'] = "udp";
+ $rule['defaultqueue'] = "qVoIP";
+ $rule['source']['address'] = $config['ezshaper']['step3']['address'];
+ $rule['destination']['any'] = TRUE;
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+
+ $rule = array();
+ $rule['type'] = "match";
+ //$rule['interface'] = $interfacelist;
+ $rule['descr'] = gettext("Connections To Upstream SIP Server");
+ $rule['protocol'] = "udp";
+ $rule['defaultqueue'] = "qVoIP";
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['address'] = $config['ezshaper']['step3']['address'];
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+
+ } elseif( $config['ezshaper']['step3']['provider'] == "Generic" ) {
+ /* create VOIP rules */
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['descr'] = "DiffServ/Lowdelay/Upload";
+ $rule['protocol'] = "udp";
+ $rule['source']['any'] = TRUE;
+ $rule['defaultqueue'] = "qVoIP";
+ $rule['destination']['any'] = TRUE;
+ $rule['iptos'] = "lowdelay";
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+
+ } else {
+ /* loop through voiplist[] */
+ foreach ($voiplist[$config['ezshaper']['step3']['provider']] as $voip) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['defaultqueue'] = 'qVoIP';
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['any'] = TRUE;
+ $rule['descr'] = "m_voip {$voip[0]} outbound";
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['destination']['port'] = $voip[2]."-".$voip[3];
+ if($voip[1] != '')
+ $rule['protocol'] = $voip[1];
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+ }
+ }
+
+ /* loop through p2plist[] */
+ if ($p2p) {
+ foreach($config['ezshaper']['step5'] as $key => $val) {
+ if (!is_array($p2plist[$key]))
+ continue;
+ foreach ($p2plist[$key] as $p2pclient) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['defaultqueue'] = 'qP2P';
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['any'] = TRUE;
+ $rule['descr'] = "m_P2P {$p2pclient[0]} outbound";
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['destination']['port'] = $p2pclient[2]."-".$p2pclient[3];
+ if($p2pclient[1] != '')
+ $rule['protocol'] = $p2pclient[1];
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+ }
+ }
+
+ /* loop through gamesplist[] */
+ if ($games) {
+ foreach($config['ezshaper']['step6'] as $key => $val) {
+ if (!is_array($gamesplist[$key]))
+ continue;
+ foreach ($gamesplist[$key] as $Gameclient) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['defaultqueue'] = 'qGames';
+ if ($Gameclient[1] == "tcp")
+ $rule['ackqueue'] = 'qACK';
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['any'] = TRUE;
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['descr'] = "m_Game {$Gameclient[0]} outbound";
+ $rule['destination']['port'] = $Gameclient[2]."-".$Gameclient[3];
+ if($Gameclient[1] != '')
+ $rule['protocol'] = $Gameclient[1];
+ $config['filter']['rule'][] = $rule;
+ }
+ }
+ }
+
+ /* loop through othersplist[] */
+ if ($otherpriority) {
+ foreach($config['ezshaper']['step7'] as $key => $val) {
+ if (!is_array($othersplist[$key]))
+ continue;
+ foreach ($othersplist[$key] as $otherclient) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ switch ($val) {
+ case "H":
+ $rule['defaultqueue'] = 'qOthersHigh'; /* posted value H or L */
+ if ($otherclient[1] == "tcp")
+ $rule['ackqueue'] = 'qACK';
+ $loop = 0;
+ break;
+ case "L":
+ $rule['defaultqueue'] = 'qOthersLow'; /* posted value H or L */
+ if ($otherclient[1] == "tcp")
+ $rule['ackqueue'] = 'qACK';
+ $loop = 0;
+ break;
+ case "D":
+ if ($p2pcatchall) {
+ $loop = 0;
+ $rule['defaultqueue'] = 'qOthersDefault';
+ if ($otherclient[1] == "tcp")
+ $rule['ackqueue'] = 'qACK';
+ } else
+ $loop = 1; /* It automatically goes to default queue */
+ break;
+ default:
+ $loop = 1;
+ }
+ if (!$loop) {
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['any'] = TRUE;
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['descr'] = "m_Other {$otherclient[0]} outbound";
+
+ if($otherclient[2] or $otherclient[3]) {
+ $rule['destination']['port'] = $otherclient[2]."-".$otherclient[3];
+ }
+ if($otherclient[1] != '')
+ $rule['protocol'] = $otherclient[1];
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+ }
+ }
+ }
+ write_config();
+}
+
+function wizard_get_bandwidthtype_scale($type = "b") {
+ switch ($type) {
+ case "Gb":
+ $factor = 1024 * 1024 * 1024;
+ break;
+ case "Mb":
+ $factor = 1024 * 1024;
+ break;
+ case "Kb":
+ $factor = 1024;
+ break;
+ case "b":
+ default:
+ $factor = 1;
+ break;
+ }
+ return intval($factor);
+}
+
+?>
diff --git a/src/usr/local/www/wizards/traffic_shaper_wizard_dedicated.xml b/src/usr/local/www/wizards/traffic_shaper_wizard_dedicated.xml
new file mode 100755
index 0000000..c86a72a
--- /dev/null
+++ b/src/usr/local/www/wizards/traffic_shaper_wizard_dedicated.xml
@@ -0,0 +1,1649 @@
+<?xml version="1.0"?>
+<pfsensewizard>
+ <copyright><![CDATA[
+ /*
+ traffic_shaper_wizard_dedicated.xml
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2005 Bill Marquette - bill.marquette@gmail.com.
+ Copyright (C) 2008-2010 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */]]></copyright>
+
+ <totalsteps>9</totalsteps>
+ <step>
+ <id>1</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <disableheader>true</disableheader>
+ <description>This wizard will guide you through setting up the pfSense traffic shaper.
+ Please be aware that Custom Bandwidths should not exceed 30% of the interface/link bandwidth. Keep this in mind during the wizard.
+ </description>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>Traffic shaper Wizard</name>
+ </field>
+ <field>
+ <displayname>Enter number of WAN type connections</displayname>
+ <name>numberofconnections</name>
+ <type>input</type>
+ <validate>^[0-9]+$</validate>
+ <description>Number of connections you have</description>
+ <bindstofield>ezshaper->step1->numberofconnections</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step1_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step1_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc</includefile>
+ </step>
+ <step>
+ <id>2</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <description>Shaper configuration</description>
+ <javascriptafterformdisplay/>
+ <stepbeforeformdisplay>step2_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step2_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc</includefile>
+ <fields>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ </step>
+ <step>
+ <id>3</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <description>Voice over IP</description>
+ <fields>
+ <field>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Prioritize Voice over IP traffic</typehint>
+ <description>This will raise the priority of VOIP traffic above all other traffic.</description>
+ <bindstofield>ezshaper-&gt;step3-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>VOIP specific settings</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>Provider</name>
+ <type>select</type>
+ <description>Choose Generic if your provider isn't listed.</description>
+ <bindstofield>ezshaper-&gt;step3-&gt;provider</bindstofield>
+ <options>
+ <option>
+ <name>Generic (lowdelay)</name>
+ <value>Generic</value>
+ </option>
+ <option>
+ <name>VoicePulse</name>
+ <value>VoicePulse</value>
+ </option>
+ <option>
+ <name>Asterisk/Vonage</name>
+ <value>Asterisk</value>
+ </option>
+ <option>
+ <name>PanasonicTDA</name>
+ <value>Panasonic</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <displayname>Upstream SIP Server</displayname>
+ <name>upstream_sip_server</name>
+ <type>inputalias</type>
+ <description>(Optional) If this is chosen, the provider field will be overridden. This allows you to provide the IP address of the &lt;strong&gt;remote&lt;/strong&gt; PBX or SIP Trunk to prioritize. &lt;br /&gt;NOTE: You can also use a Firewall Alias in this location.</description>
+ <bindstofield>ezshaper-&gt;step3-&gt;address</bindstofield>
+ <message>IP Address field is non-blank and doesn't look like an IP address.</message>
+ </field>
+ <field>
+ <name>Bandwidth</name>
+ <type>input</type>
+ <validate>^[0-9]*$</validate>
+ <typehint>Total bandwidth in percentage(%)(should be between 5 and 40) guarantee for VOIP traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step3-&gt;bandwidth</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step3_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step3_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc</includefile>
+ </step>
+ <step>
+ <id>4</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <description>Penalty Box</description>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <fields>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Penalize IP or Alias</typehint>
+ <description>This will lower the priority of traffic from this IP or alias.</description>
+ <enablefields>Address,Bandwidth,BandwidthSpeed</enablefields>
+ <bindstofield>ezshaper-&gt;step4-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>PenaltyBox specific settings</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>Address</name>
+ <type>inputalias</type>
+ <description>This allows you to just provide the IP address of the computer(s) to penalize. NOTE: You can also use a Firewall Alias in this location.</description>
+ <bindstofield>ezshaper-&gt;step4-&gt;address</bindstofield>
+ <message>IP Address field is non-blank and doesn't look like an IP address.</message>
+ </field>
+ <field>
+ <name>Bandwidth</name>
+ <type>input</type>
+ <validate>^[0-9]*$</validate>
+ <message>Speed must be numerical.</message>
+ <bindstofield>ezshaper-&gt;step4-&gt;bandwidth</bindstofield>
+ <combinefieldsbegin>true</combinefieldsbegin>
+ </field>
+ <field>
+ <combinefieldsend>true</combinefieldsend>
+ <dontdisplayname>true</dontdisplayname>
+ <dontcombinecells>true</dontcombinecells>
+ <donotdisable>true</donotdisable>
+ <name>BandwidthSpeed</name>
+ <description>The limit you want to apply.</description>
+ <type>select</type>
+ <options>
+ <option>
+ <name>%</name>
+ <value>%</value>
+ </option>
+ <option>
+ <name>bit/s</name>
+ <value>b</value>
+ </option>
+ <option>
+ <name>Kilobit/s</name>
+ <value>Kb</value>
+ </option>
+ <option>
+ <name>Megabit/s</name>
+ <value>Mb</value>
+ </option>
+ <option>
+ <name>Gigabit/s</name>
+ <value>Gb</value>
+ </option>
+ </options>
+ <bindstofield>ezshaper->step4->bandwidthunit</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step4_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc</includefile>
+ </step>
+ <step>
+ <id>5</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <description>Peer to Peer networking</description>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <fields>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Lower priority of Peer-to-Peer traffic</typehint>
+ <description>This will lower the priority of P2P traffic below all other traffic. Please check the items that you would like to prioritize lower than normal traffic.</description>
+ <enablefields>p2pCatchAll,Bandwidth,BandwidthSpeed,Aimster,BitTorrent,BuddyShare,CuteMX,DCplusplus,dcc,DirectConnect,DirectFileExpress,EDonkey2000,FastTrack,Gnutella,grouper,hotComm,HotlineConnect,iMesh,Napster,OpenNap,Scour,Shareaza,SongSpy,WinMX</enablefields>
+ <bindstofield>ezshaper-&gt;step5-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>p2p Catch all</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>p2pCatchAll</name>
+ <type>checkbox</type>
+ <typehint>When enabled, all uncategorized traffic is fed to the p2p queue.</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;p2pcatchall</bindstofield>
+ </field>
+ <field>
+ <name>Bandwidth</name>
+ <type>input</type>
+ <validate>^[0-9]*$</validate>
+ <message>Speed must be numerical.</message>
+ <bindstofield>ezshaper-&gt;step5-&gt;bandwidth</bindstofield>
+ <combinefieldsbegin>true</combinefieldsbegin>
+ </field>
+ <field>
+ <combinefieldsend>true</combinefieldsend>
+ <dontdisplayname>true</dontdisplayname>
+ <dontcombinecells>true</dontcombinecells>
+ <donotdisable>true</donotdisable>
+ <name>BandwidthSpeed</name>
+ <description>The limit you want to apply.</description>
+ <type>select</type>
+ <options>
+ <option>
+ <name>%</name>
+ <value>%</value>
+ </option>
+ <option>
+ <name>bit/s</name>
+ <value>b</value>
+ </option>
+ <option>
+ <name>Kilobit/s</name>
+ <value>Kb</value>
+ </option>
+ <option>
+ <name>Megabit/s</name>
+ <value>Mb</value>
+ </option>
+ <option>
+ <name>Gigabit/s</name>
+ <value>Gb</value>
+ </option>
+ </options>
+ <bindstofield>ezshaper->step5->bandwidthunit</bindstofield>
+ </field>
+ <field>
+ <name>Enable/Disable specific P2P protocols</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>Aimster</name>
+ <type>checkbox</type>
+ <typehint>Aimster and other P2P using the Aimster protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;aimster</bindstofield>
+ </field>
+ <field>
+ <name>BitTorrent</name>
+ <type>checkbox</type>
+ <typehint>Bittorrent and other P2P using the Torrent protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;bittorrent</bindstofield>
+ </field>
+ <field>
+ <name>BuddyShare</name>
+ <type>checkbox</type>
+ <typehint>BuddyShare and other P2P using the BuddyShare protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;buddyshare</bindstofield>
+ </field>
+ <field>
+ <name>CuteMX</name>
+ <type>checkbox</type>
+ <typehint>CuteMX and other P2P using the CuteMX protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;cutemx</bindstofield>
+ </field>
+ <field>
+ <name>DCplusplus</name>
+ <type>checkbox</type>
+ <typehint>DC++ and other P2P using the DC++ protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;dcplusplus</bindstofield>
+ </field>
+ <field>
+ <name>DCC</name>
+ <type>checkbox</type>
+ <typehint>irc DCC file transfers</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;dcc</bindstofield>
+ </field>
+ <field>
+ <name>DirectConnect</name>
+ <type>checkbox</type>
+ <typehint>DirectConnect and other P2P using the DirectConnect protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;directconnect</bindstofield>
+ </field>
+ <field>
+ <name>DirectFileExpress</name>
+ <type>checkbox</type>
+ <typehint>DirectFileExpress and other P2P using the DirectFileExpress protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;directfileexpress</bindstofield>
+ </field>
+ <field>
+ <name>eDonkey2000</name>
+ <type>checkbox</type>
+ <typehint>eDonkey and other P2P using the eDonkey protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;edonkey2000</bindstofield>
+ </field>
+ <field>
+ <name>FastTrack</name>
+ <type>checkbox</type>
+ <typehint>FastTrack and other P2P using the FastTrack protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;fasttrack</bindstofield>
+ </field>
+ <field>
+ <name>Gnutella</name>
+ <type>checkbox</type>
+ <typehint>Gnutella and other P2P using the Gnutella protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;gnutella</bindstofield>
+ </field>
+ <field>
+ <name>grouper</name>
+ <type>checkbox</type>
+ <typehint>grouper and other P2P using the grouper protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;grouper</bindstofield>
+ </field>
+ <field>
+ <name>hotComm</name>
+ <type>checkbox</type>
+ <typehint>hotComm and other P2P using the hotComm protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;hotcomm</bindstofield>
+ </field>
+ <field>
+ <name>HotlineConnect</name>
+ <type>checkbox</type>
+ <typehint>HotlineConnect and other P2P using the HotlineConnect protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;hotlineconnect</bindstofield>
+ </field>
+ <field>
+ <name>iMesh</name>
+ <type>checkbox</type>
+ <typehint>iMesh and other P2P using the iMesh protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;imesh</bindstofield>
+ </field>
+ <field>
+ <name>Napster</name>
+ <type>checkbox</type>
+ <typehint>Napster and other P2P using the Napster protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;napster</bindstofield>
+ </field>
+ <field>
+ <name>OpenNap</name>
+ <type>checkbox</type>
+ <typehint>OpenNap and other P2P using the OpenNap protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;opennap</bindstofield>
+ </field>
+ <field>
+ <name>Scour</name>
+ <type>checkbox</type>
+ <typehint>Scour and other P2P using the Scour protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;scour</bindstofield>
+ </field>
+ <field>
+ <name>Shareaza</name>
+ <type>checkbox</type>
+ <typehint>Shareaza and other P2P using the Shareaza protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;shareaza</bindstofield>
+ </field>
+ <field>
+ <name>SongSpy</name>
+ <type>checkbox</type>
+ <typehint>SongSpy and other P2P using the SongSpy protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;songspy</bindstofield>
+ </field>
+ <field>
+ <name>WinMX</name>
+ <type>checkbox</type>
+ <typehint>WinMX and other P2P using the WinMX protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;winmx</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step5_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc</includefile>
+ </step>
+ <step>
+ <id>6</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <description>Network Games</description>
+ <fields>
+ <field>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Prioritize network gaming traffic</typehint>
+ <description>This will raise the priority of gaming traffic to higher than most traffic.</description>
+ <enablefields>BattleNET,EAOrigin,GameForWindowsLive,PlayStationConsoles,Steam,WiiConsoles,XboxConsoles,ARMA2,ARMA3,Battlefield2,Battlefield3,BattlefieldBC2,Borderlands,CallOfDuty,Counterstrike,Crysis2,Crysis3,DeltaForce,DeadSpace2,DeadSpace3,Dirt3,DOOM3,DragonAge2,EmpireEarth,EveOnline,Everquest,Everquest2,FarCry,FarCry2,FarCry3,GunZOnline,HalfLife,LeagueofLegends,Lineage2,MassEffect3,MechwarriorOnline,Minecraft,OperationFlashpointDR,PlanetSide,PlanetSide2,QuakeIII,QuakeIV,StarWarsTOR,TigerWoods2004PS2,TribesAscend,UnrealTournament,WolfensteinEnemyTerritory,WorldOfWarcraft</enablefields>
+ <donotdisable>true</donotdisable>
+ <bindstofield>ezshaper-&gt;step6-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>Enable/Disable specific game consoles and services</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>BattleNET</name>
+ <type>checkbox</type>
+ <typehint>Battle.net - Virtually every game from Blizzard publishing should match this. This includes the following game series: Starcraft, Diablo, Warcraft. Guild Wars also uses this port.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;battlenet</bindstofield>
+ </field>
+ <field>
+ <name>EAOrigin</name>
+ <type>checkbox</type>
+ <typehint>EA Origin Client - Some PC games by EA use this.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;eaorigin</bindstofield>
+ </field>
+ <field>
+ <name>GameForWindowsLive</name>
+ <type>checkbox</type>
+ <typehint>Games for Windows Live</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;gamesforwindowslive</bindstofield>
+ </field>
+ <field>
+ <name>PlayStationConsoles</name>
+ <type>checkbox</type>
+ <typehint>PlayStation Consoles - This should cover all ports required for the Playstation 4, Playstation, PS Vita</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;playstationconsoles</bindstofield>
+ </field>
+ <field>
+ <name>Steam</name>
+ <type>checkbox</type>
+ <typehint>Steam Game Client (Includes: America's Army 3, Counter-Strike: Source, Counter-Strike: Global Offensive, Half-Life 2, COD: Black Ops Series, Borderlands 2, Natural Selection 2, Left 4 Dead Series, Portal 2 and many other games on the Steam)</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;steam</bindstofield>
+ </field>
+ <field>
+ <name>WiiConsoles</name>
+ <type>checkbox</type>
+ <typehint>Wii Consoles - Wii, Wii U, DS and 3DS</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;wiiconsoles</bindstofield>
+ </field>
+ <field>
+ <name>XboxConsoles</name>
+ <type>checkbox</type>
+ <typehint>Xbox Consoles - Xbox 360 and Xbox One</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;xboxconsoles</bindstofield>
+ </field>
+ <field>
+ <name>Enable/Disable specific games</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>ARMA2</name>
+ <type>checkbox</type>
+ <typehint>ARMA 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;arma2</bindstofield>
+ </field>
+ <field>
+ <name>ARMA3</name>
+ <type>checkbox</type>
+ <typehint>ARMA 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;arma3</bindstofield>
+ </field>
+ <field>
+ <name>Battlefield2</name>
+ <type>checkbox</type>
+ <typehint>Battlefield 2 - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;battlefield2</bindstofield>
+ </field>
+ <field>
+ <name>Battlefield3</name>
+ <type>checkbox</type>
+ <typehint>Battlefield 3 and 4 - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;battlefield3</bindstofield>
+ </field>
+ <field>
+ <name>BattlefieldBC2</name>
+ <type>checkbox</type>
+ <typehint>Battlefield: Bad Company 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;battlefieldbc2</bindstofield>
+ </field>
+ <field>
+ <name>Borderlands</name>
+ <type>checkbox</type>
+ <typehint>Borderlands</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;borderlands</bindstofield>
+ </field>
+ <field>
+ <name>CallOfDuty</name>
+ <type>checkbox</type>
+ <typehint>Call Of Duty (United Offensive)</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;callofduty</bindstofield>
+ </field>
+ <field>
+ <name>Counterstrike</name>
+ <type>checkbox</type>
+ <typehint>Counterstrike. The ultimate 1st person shooter.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;counterstrike</bindstofield>
+ </field>
+ <field>
+ <name>Crysis2</name>
+ <type>checkbox</type>
+ <typehint>Crysis 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;crysis2</bindstofield>
+ </field>
+ <field>
+ <name>Crysis3</name>
+ <type>checkbox</type>
+ <typehint>Crysis 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;crysis3</bindstofield>
+ </field>
+ <field>
+ <name>DeadSpace2</name>
+ <type>checkbox</type>
+ <typehint>Dead Space2 - this game uses a HUGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;deadspace2</bindstofield>
+ </field>
+ <field>
+ <name>DeadSpace3</name>
+ <type>checkbox</type>
+ <typehint>Dead Space 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;deadspace3</bindstofield>
+ </field>
+ <field>
+ <name>DeltaForce</name>
+ <type>checkbox</type>
+ <typehint>Delta Force</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;deltaforce</bindstofield>
+ </field>
+ <field>
+ <name>Dirt3</name>
+ <type>checkbox</type>
+ <typehint>Dirt 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;dirt3</bindstofield>
+ </field>
+ <field>
+ <name>DOOM3</name>
+ <type>checkbox</type>
+ <typehint>DOOM3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;doom3</bindstofield>
+ </field>
+ <field>
+ <name>DragonAge2</name>
+ <type>checkbox</type>
+ <typehint>Dragon Age 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;dragonage2</bindstofield>
+ </field>
+ <field>
+ <name>EmpireEarth</name>
+ <type>checkbox</type>
+ <typehint>Empire Earth</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;empireearth</bindstofield>
+ </field>
+ <field>
+ <name>EveOnline</name>
+ <type>checkbox</type>
+ <typehint>EVE Online</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;eveonline</bindstofield>
+ </field>
+ <field>
+ <name>Everquest</name>
+ <type>checkbox</type>
+ <typehint>Everquest - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;everquest</bindstofield>
+ </field>
+ <field>
+ <name>Everquest2</name>
+ <type>checkbox</type>
+ <typehint>Everquest II</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;everquest2</bindstofield>
+ </field>
+ <field>
+ <name>FarCry</name>
+ <type>checkbox</type>
+ <typehint>Far Cry</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;farcry</bindstofield>
+ </field>
+ <field>
+ <name>FarCry2</name>
+ <type>checkbox</type>
+ <typehint>Far Cry 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;farcry2</bindstofield>
+ </field>
+ <field>
+ <name>FarCry3</name>
+ <type>checkbox</type>
+ <typehint>Far Cry 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;farcry3</bindstofield>
+ </field>
+ <field>
+ <name>GunZOnline</name>
+ <type>checkbox</type>
+ <typehint>GunZ Online</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;gunzonline</bindstofield>
+ </field>
+ <field>
+ <name>HalfLife</name>
+ <type>checkbox</type>
+ <typehint>Half-Life</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;halflife</bindstofield>
+ </field>
+ <field>
+ <name>LeagueofLegends</name>
+ <type>checkbox</type>
+ <typehint>League of Legends - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;leagueoflegends</bindstofield>
+ </field>
+ <field>
+ <name>Lineage2</name>
+ <type>checkbox</type>
+ <typehint>Lineage II</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;lineage2</bindstofield>
+ </field>
+ <field>
+ <name>MassEffect3</name>
+ <type>checkbox</type>
+ <typehint>Mass Effect 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;masseffect3</bindstofield>
+ </field>
+ <field>
+ <name>MechwarriorOnline</name>
+ <type>checkbox</type>
+ <typehint>MechWarrior: Online - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;mechwarrioronline</bindstofield>
+ </field>
+ <field>
+ <name>Minecraft</name>
+ <type>checkbox</type>
+ <typehint>Minecraft</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;minecraft</bindstofield>
+ </field>
+ <field>
+ <name>PlanetSide</name>
+ <type>checkbox</type>
+ <typehint>PlanetSide</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;planetside</bindstofield>
+ </field>
+ <field>
+ <name>PlanetSide2</name>
+ <type>checkbox</type>
+ <typehint>PlanetSide 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;planetside2</bindstofield>
+ </field>
+ <field>
+ <name>OperationFlashpointDR</name>
+ <type>checkbox</type>
+ <typehint>Operation Flashpoint: Dragon Rising</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;operationflashpoint-dr</bindstofield>
+ </field>
+ <field>
+ <name>QuakeIII</name>
+ <type>checkbox</type>
+ <typehint>Quake III</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;quakeiii</bindstofield>
+ </field>
+ <field>
+ <name>QuakeIV</name>
+ <type>checkbox</type>
+ <typehint>Quake IV</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;quakeiv</bindstofield>
+ </field>
+ <field>
+ <name>StarWarsTOR</name>
+ <type>checkbox</type>
+ <typehint>StarWars: The Old Republic - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;starwarstor</bindstofield>
+ </field>
+ <field>
+ <name>TigerWoods2004PS2</name>
+ <type>checkbox</type>
+ <typehint>Tiger Woods 2004 for PS2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;tigerwoods2004ps2</bindstofield>
+ </field>
+ <field>
+ <name>TribesAscend</name>
+ <type>checkbox</type>
+ <typehint>Tribes Ascend</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;tribesascend</bindstofield>
+ </field>
+ <field>
+ <name>UnrealTournament</name>
+ <type>checkbox</type>
+ <typehint>Unreal Tournament Series</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;unrealtournament</bindstofield>
+ </field>
+ <field>
+ <name>WolfensteinEnemyTerritory</name>
+ <type>checkbox</type>
+ <typehint>Wolfenstein Enemy Territory</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;wolfet</bindstofield>
+ </field>
+ <field>
+ <name>WorldOfWarcraft</name>
+ <type>checkbox</type>
+ <typehint>World of Warcraft</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;wow</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc</includefile>
+ </step>
+ <step>
+ <id>7</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <description>Raise or lower other Applications</description>
+ <fields>
+ <field>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Other networking protocols</typehint>
+ <description>This will help raise or lower the priority of other protocols higher than most traffic.</description>
+ <enablefields>AppleRemoteDesktop,MSRDP,PCAnywhere,VNC,AIM,Facetime,GoogleHangouts,ICQ,IRC,Jabber,MSN,TeamSpeak,TeamSpeak3,Ventrilo,PPTP,IPSEC,iTunesRadio,StreamingMP3,RTSP,RTMP,HTTP,IMAP,LotusNotes,POP3,SMTP,BattleNETDownloader,SteamDownloader,APNS,AppleMobileSync,CrashPlan,CVSUP,DNS,GIT,HBCI,ICMP,MySqlServer,NNTP,Slingbox,SMB,SNMP,Subversion</enablefields>
+ <donotdisable>true</donotdisable>
+ <bindstofield>ezshaper-&gt;step7-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>Remote Service / Terminal emulation</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>AppleRemoteDesktop</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;appleremotedesktop</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Apple Remote Desktop</typehint>
+ </field>
+ <field>
+ <name>MSRDP</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;msrdp</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Microsoft Remote Desktop Protocol</typehint>
+ </field>
+ <field>
+ <name>PCAnywhere</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;pcanywhere</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Symantec PC Anywhere</typehint>
+ </field>
+ <field>
+ <name>VNC</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;vnc</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Virtual Network Computing</typehint>
+ </field>
+ <field>
+ <name>Messengers</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>AIM</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;aolinstantmessenger</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>AOL Instant Messenger</typehint>
+ </field>
+ <field>
+ <name>Facetime</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;facetime</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Facetime</typehint>
+ </field>
+ <field>
+ <name>ICQ</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;icq</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>ICQ</typehint>
+ </field>
+ <field>
+ <name>IRC</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;irc</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Internet Relay Chat</typehint>
+ </field>
+ <field>
+ <name>Jabber</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;jabber</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Jabber instant messenger</typehint>
+ </field>
+ <field>
+ <name>GoogleHangouts</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;googlehangouts</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Google Hangouts</typehint>
+ </field>
+ <field>
+ <name>MSN</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;msnmessenger</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>MSN Messenger</typehint>
+ </field>
+ <field>
+ <name>Teamspeak</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;teamspeak</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>TeamSpeak</typehint>
+ </field>
+ <field>
+ <name>Teamspeak3</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;teamspeak3</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>TeamSpeak 3</typehint>
+ </field>
+ <field>
+ <name>Ventrilo</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;ventrilo</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Ventrilo</typehint>
+ </field>
+ <field>
+ <name>VPN</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>PPTP</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;pptp</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Microsoft Point to Point tunneling protocol</typehint>
+ </field>
+ <field>
+ <name>IPSEC</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;ipsec</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>IPSEC VPN traffic</typehint>
+ </field>
+ <field>
+ <name>Multimedia/Streaming</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>iTunesRadio</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;itunesradio</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>iTunes Radio - this rule uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ </field>
+ <field>
+ <name>StreamingMP3</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;streamingmp3</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Streaming Media</typehint>
+ </field>
+ <field>
+ <name>RTSP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;rtsp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>RealTime streaming protocol</typehint>
+ </field>
+ <field>
+ <name>RTMP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;rtmp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Real-Time Messaging Protocol - Used by video streaming services such as Twitch.tv.</typehint>
+ </field>
+ <field>
+ <name>Web</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>HTTP</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;http</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>HTTP and HTTPS aka Web Traffic</typehint>
+ </field>
+ <field>
+ <name>Mail</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>SMTP</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;smtp</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Mail Protocol</typehint>
+ </field>
+ <field>
+ <name>POP3</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;pop3</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>POP3 Protocol</typehint>
+ </field>
+ <field>
+ <name>IMAP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;imap</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>IMAP Protocol</typehint>
+ </field>
+ <field>
+ <name>LotusNotes</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;lotusnotes</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Lotus Notes</typehint>
+ </field>
+ <field>
+ <name>Game Downloader</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>BattleNetDownloader</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;battlenetdownloader</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Battle.NET Downloader</typehint>
+ </field>
+ <field>
+ <name>SteamDownloader</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;steamdownloader</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Steam Downloader</typehint>
+ </field>
+ <field>
+ <name>Miscellaneous</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>APNS</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;apns</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Apple Push Notification Service</typehint>
+ </field>
+ <field>
+ <name>AppleMobileSync</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;applemobilesync</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Apple Mobile Sync</typehint>
+ </field>
+ <field>
+ <name>CrashPlan</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;crashplan</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>CrashPlan</typehint>
+ </field>
+ <field>
+ <name>CVSUP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;cvsup</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>CVSUP</typehint>
+ </field>
+ <field>
+ <name>DNS</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;dns</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Domain Name Services</typehint>
+ </field>
+ <field>
+ <name>Git</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;git</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Git Server</typehint>
+ </field>
+ <field>
+ <name>HBCI</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;hbci</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>HBCI</typehint>
+ </field>
+ <field>
+ <name>ICMP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;icmp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>ICMP Protocol</typehint>
+ </field>
+ <field>
+ <name>SMB</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;smb</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Microsoft SMB Protocol and friends</typehint>
+ </field>
+ <field>
+ <name>SNMP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;snmp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Simple Network Management Protocol</typehint>
+ </field>
+ <field>
+ <name>MySQLServer</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;mysqlserver</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>MySQL Server</typehint>
+ </field>
+ <field>
+ <name>NNTP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;nntp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Internet News</typehint>
+ </field>
+ <field>
+ <name>Slingbox</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;slingbox</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Slingbox</typehint>
+ </field>
+ <field>
+ <name>Subversion</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;subversion</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Subversion Server</typehint>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc</includefile>
+ </step>
+ <step>
+ <id>8</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <field>
+ <name>Reload profile notice</name>
+ <type>listtopic</type>
+ </field>
+ <description> After pressing Finish the system will load the new profile.&lt;br/&gt; Please note that this may take a moment.&lt;br/&gt; Also note that the traffic shaper is stateful meaning that only new connections will be shaped.&lt;br/&gt; If this is an issue please reset the state table after loading the profile.&lt;br/&gt;</description>
+ <fields>
+ <field>
+ <name>Finish</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step8_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_dedicated.inc</includefile>
+ </step>
+</pfsensewizard>
diff --git a/src/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc b/src/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc
new file mode 100644
index 0000000..3f68869
--- /dev/null
+++ b/src/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc
@@ -0,0 +1,1741 @@
+<?php
+/*
+ traffic_shaper_wizard_multi_all.inc
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2006 Bill Marquette - bill.marquette@gmail.com.
+ Copyright (C) 2006 Scott Ullrich - sullrich@pfsense.com.
+ Copyright (C) 2008-2010 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+function step1_stepbeforeformdisplay() {
+ global $stepid, $savemsg, $pkg;
+
+ $fields =& $pkg['step'][0]['fields']['field'];
+
+ $lans = 0;
+ $wans = 0;
+
+ $iflisttmp = get_configured_interface_with_descr();
+ foreach ($iflisttmp as $if => $ifdesc) {
+ if (!is_altq_capable(get_real_interface($if)))
+ continue;
+ if (interface_has_gateway($if) || interface_has_gatewayv6($if))
+ $wans++;
+ else
+ $lans++;
+ }
+
+ foreach ($fields as &$field) {
+ if ($field['name'] == 'numberofconnections')
+ $field['value'] = $wans;
+ else if ($field['name'] == 'numberoflocalinterfaces')
+ $field['value'] = $lans;
+ }
+}
+
+function step1_submitphpaction() {
+ global $stepid, $savemsg;
+
+ if (!isset($_POST['numberofconnections'])) {
+ $savemsg=gettext("You need to specify the number of connections.");
+ $stepid--;
+ return;
+ }
+ if (intval($_POST['numberofconnections']) < 1) {
+ $savemsg=gettext("The number of connections should be greater than 1.");
+ $stepid--;
+ return;
+ }
+
+ if (!isset($_POST['numberoflocalinterfaces'])) {
+ $savemsg=gettext("You need to specify the number of LAN type interfaces.");
+ $stepid--;
+ return;
+ }
+ if (intval($_POST['numberoflocalinterfaces']) < 1) {
+ $savemsg=gettext("The number of LAN type interfaces should be greater than 1.");
+ $stepid--;
+ return;
+ }
+}
+
+function step2_stepbeforeformdisplay() {
+ global $config, $pkg;
+ global $stepid, $savemsg;
+
+ $wans = 0;
+ $lans = 0;
+ $iflist = array();
+ $iflisttmp = get_configured_interface_with_descr();
+ foreach ($iflisttmp as $if => $ifdesc) {
+ if (!is_altq_capable(get_real_interface($if)))
+ continue;
+ if (interface_has_gateway($if) || interface_has_gatewayv6($if))
+ $wans++;
+ else
+ $lans++;
+ $iflist[$if] = $ifdesc;
+ }
+ $numberofconnections = intval($config['ezshaper']['step1']['numberofconnections']);
+ if ($numberofconnections > $wans) {
+ $savemsg=gettext("You have less interfaces than number of connections!");
+ $stepid--;
+ return;
+ }
+
+ $numberoflocalinterfaces = intval($config['ezshaper']['step1']['numberoflocalinterfaces']);
+ if ($numberoflocalinterfaces > $lans) {
+ $savemsg=gettext("You have less interfaces than number of connections!");
+ $stepid--;
+ return;
+ }
+ $cfgname = "traffic_shaper_wizard_multi_all.xml";
+
+ $fields =& $pkg['step'][1]['fields']['field'];
+
+ /*
+ unset($config['ezshaper']['step2']);
+ $config['ezshaper']['step2'] = array();
+ write_config();
+ */
+ $fields = array();
+
+ for ($i = 0; $i < $numberoflocalinterfaces; $i++) {
+ $field = array();
+ $interface_friendly = $i+1;
+ $field['name'] = "Setup connection speed and scheduler information for interface LAN #{$interface_friendly}";
+ $field['type'] = "listtopic";
+ $fields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Interface & Scheduler";
+ $field['name'] = "local{$i}interface";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ foreach ($iflist as $ifname => $ifdescr) {
+ // Skip wan interfaces here
+ if (interface_has_gateway($ifname) || interface_has_gatewayv6($ifname))
+ continue;
+ $opts = array();
+ $opts['displayname'] = $ifdescr;
+ $opts['name'] = $ifname;
+ $opts['value'] = $ifname;
+ $field['options']['option'][] = $opts;
+ }
+ $field['combinefieldsbegin'] = "true";
+ $field['bindstofield'] = "ezshaper->step2->local{$i}interface";
+ $fields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "local{$i}downloadscheduler";
+ $field['type'] = "select";
+ $field['typehint'] = "Queueing discipline to apply on this local interface.";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['name'] = "HFSC";
+ $opts['value'] = "HFSC";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "CBQ";
+ $opts['value'] = "CBQ";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "PRIQ";
+ $opts['value'] = "PRIQ";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step2->local{$i}downloadscheduler";
+ $fields[] = $field;
+ }
+
+ for ($i = 0; $i < $numberofconnections; $i++) {
+ $field = array();
+ $interface_friendly = $i+1;
+ $field['name'] = "Setup connection speed and scheduler information for interface WAN#{$interface_friendly}";
+ $field['type'] = "listtopic";
+ $fields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Interface & Scheduler";
+ $field['name'] = "conn{$i}interface";
+ $field['type'] = "select";
+ $interface_real = $i+1;
+ $field['options']['option'] = array();
+ foreach ($iflist as $ifname => $ifdescr) {
+ // Skip lan interfaces here
+ if (!interface_has_gateway($ifname) && !interface_has_gatewayv6($ifname))
+ continue;
+ $opts = array();
+ $opts['displayname'] = $ifdescr;
+ $opts['name'] = $ifname;
+ $opts['value'] = $ifname;
+ $field['options']['option'][] = $opts;
+ }
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}interface";
+ $field['combinefieldsbegin'] = "true";
+ $fields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "conn{$i}uploadscheduler";
+ $field['type'] = "select";
+ $field['typehint'] = "Queueing discipline to apply on the upload of this connection.";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['name'] = "HFSC";
+ $opts['value'] = "HFSC";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "CBQ";
+ $opts['value'] = "CBQ";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "PRIQ";
+ $opts['value'] = "PRIQ";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}uploadscheduler";
+ $fields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Upload";
+ $field['name'] = "conn{$i}upload";
+ $field['type'] = "input";
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}upload";
+ $field['combinefieldsbegin'] = "true";
+ $fields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "conn{$i}uploadspeed";
+ $field['typehint'] = "Upload bandwidth on this connection.";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['value'] = "Kb";
+ $opts['name'] = "Kbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Mb";
+ $opts['name'] = "Mbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Gb";
+ $opts['name'] = "Gbit/s";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}uploadspeed";
+ $fields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Download";
+ $field['name'] = "conn{$i}download";
+ $field['type'] = "input";
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}download";
+ $field['combinefieldsbegin'] = "true";
+ $fields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "conn{$i}downloadspeed";
+ $field['typehint'] = "Download bandwidth on this connection.";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['value'] = "Kb";
+ $opts['name'] = "Kbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Mb";
+ $opts['name'] = "Mbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Gb";
+ $opts['name'] = "Gbit/s";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step2->conn{$i}downloadspeed";
+ $fields[] = $field;
+ }
+ $field = array();
+ $field['name'] = "Next";
+ $field['type'] = "submit";
+ $fields[] = $field;
+}
+
+function step2_stepsubmitphpaction() {
+ global $config;
+ global $stepid, $savemsg;
+ $sumdownloads = 0;
+
+ /* Input Validation */
+ $steps = intval($config['ezshaper']['step1']['numberofconnections']);
+ $localint = intval($config['ezshaper']['step1']['numberoflocalinterfaces']);
+ for ($i = 0; $i < $steps; $i++) {
+ for ($j = $i + 1; $j <= $steps; $j++) {
+ if ($_POST["conn{$i}interface"] == $_POST["conn{$j}interface"]) {
+ $savemsg=gettext("You cannot select the same interface for connections {$i} and {$j}.");
+ $stepid--;
+ return;
+ }
+ if (trim($_POST["conn{$i}uploadscheduler"]) != "PRIQ") {
+ if (!is_numeric($_POST["conn{$i}upload"])) {
+ $savemsg = gettext("Upload bandwidth of connection {$i} is not valid.");
+ $stepid--;
+ return;
+ }
+ if (!is_numeric($_POST["conn{$i}download"])) {
+ $savemsg = gettext("Download bandwidth of connection {$i} is not valid.");
+ $stepid--;
+ return;
+ }
+ $upbw = $_POST["conn{$i}upload"];
+ $downbw = $_POST["conn{$i}download"];
+ if ($upbw < 1 || $downbw < 1) {
+ $savemsg = gettext("You cannot specify 0 bandwidth!");
+ $stepid--;
+ return;
+ }
+ if (intval($upbw) < 128 && $_POST["conn{$i}uploadspeed"] == "Kb" && trim($_POST["conn{$i}uploadscheduler"]) == "CBQ") {
+ $savemsg=gettext("Uploads smaller than 128Kbit/s is not supported for connection {$i} on CBQ scheduler.");
+ $stepid--;
+ return;
+ }
+ }
+ }
+ for ($j = 0; $j < $localint; $j++) {
+ if ($_POST["conn{$i}interface"] == $_POST["local{$j}interface"]) {
+ $savemsg=gettext("You cannot select the same interface for local and outside.");
+ $stepid--;
+ return;
+ }
+ }
+ }
+ for ($i = 0; $i < $localint; $i++) {
+ for ($j = $i + 1; $j < $localint; $j++) {
+ if ($_POST["local{$i}interface"] == $_POST["local{$j}interface"]) {
+ $savemsg=gettext("You cannot select the same interface twice on local interfaces.");
+ $stepid--;
+ return;
+ }
+ }
+ }
+
+ /* This is necessary since the wizard expects predefined fields. */
+ unset($config['ezshaper']['step2']);
+ $config['ezshaper']['step2'] = array();
+
+ for ($i = 0; $i < $localint; $i++) {
+ $config['ezshaper']['step2']["local{$i}downloadscheduler"] = $_POST["local{$i}downloadscheduler"];
+ $config['ezshaper']['step2']["local{$i}interface"] = $_POST["local{$i}interface"];
+ }
+
+ for ($i = 0; $i < $steps; $i++) {
+ $config['ezshaper']['step2']["conn{$i}uploadscheduler"] = $_POST["conn{$i}uploadscheduler"];
+ $config['ezshaper']['step2']["conn{$i}upload"] = $_POST["conn{$i}upload"];
+ $config['ezshaper']['step2']["conn{$i}uploadspeed"] = $_POST["conn{$i}uploadspeed"];
+ $config['ezshaper']['step2']["conn{$i}download"] = $_POST["conn{$i}download"];
+ $config['ezshaper']['step2']["conn{$i}downloadspeed"] = $_POST["conn{$i}downloadspeed"];
+ $config['ezshaper']['step2']["conn${i}interface"] = $_POST["conn{$i}interface"];
+ }
+}
+
+function step3_stepbeforeformdisplay() {
+ global $config, $pkg;
+ global $stepid, $savemsg;
+
+ $cfgname = "traffic_shaper_wizard_multi_all.xml";
+
+ $numberofconnections = intval($config['ezshaper']['step1']['numberofconnections']);
+ $numberoflocalinterfaces = intval($config['ezshaper']['step1']['numberoflocalinterfaces']);
+
+ $fields =& $pkg['step'][1]['fields']['field'];
+
+ $voipfields =& $pkg['step'][2]['fields']['field'];
+
+ $voipfields = array();
+ $enablefields = array();
+
+ $field = array();
+ $field['name'] = "enable";
+ $field['type'] = "checkbox";
+ $field['typehint'] = "Prioritize Voice over IP traffic.";
+ $field['bindstofield'] = "ezshaper->step3->enable";
+ $field['descritpion'] = "This will raise the priority of VOIP traffic above all other traffic.";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['name'] = "Next";
+ $field['type'] = "submit";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['name'] = "VOIP specific settings";
+ $field['type'] = "listtopic";
+ $voipfields[] = $field;
+
+ $field['name'] = "Provider";
+ $enablefields[] = "Provider";
+ $field['type'] = "select";
+ $field['description'] = "Choose Generic if your provider isn't listed.";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['name'] = "Generic (lowdelay)";
+ $opts['value'] = "Generic";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "VoicePulse";
+ $opts['value'] = "VoicePulse";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "Asterisk/Vonage";
+ $opts['value'] = "Asterisk";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['name'] = "PanasonicTDA";
+ $opts['value'] = "Panasonic";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step3->provider";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Upstream SIP Server";
+ $field['name'] = "upstream_sip_server";
+ $enablefields[] = "upstream_sip_server";
+ $field['type'] = "inputalias";
+ $field['description'] = "(Optional) If this is chosen, the provider field will be overridden. This allows you to provide the IP address of the <strong>remote</strong> PBX or SIP Trunk to prioritize. <br />NOTE: You can also use a Firewall Alias in this location.";
+ $field['message'] = "IP Address field is non-blank and doesn't look like an IP address.";
+ $field['bindstofield'] = "ezshaper->step3->address";
+ $voipfields[] = $field;
+
+ for ($i = 0; $i < $numberofconnections; $i++) {
+ $field = array();
+ $interface_friendly = $i+1;
+ $field['name'] = "Connection WAN #{$interface_friendly}";
+ $field['type'] = "listtopic";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Upload";
+ $field['name'] = "conn{$i}upload";
+ $enablefields[] = "conn{$i}upload";
+ $field['type'] = "input";
+ $field['bindstofield'] = "ezshaper->step3->conn{$i}upload";
+ $field['combinefieldsbegin'] = "true";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "conn{$i}uploadspeed";
+ $enablefields[] = "conn{$i}uploadspeed";
+ $field['typehint'] = "Upload bandwidth guarantee for VOIP phone(s) on connection {$i}.";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['value'] = "Kb";
+ $opts['name'] = "Kbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Mb";
+ $opts['name'] = "Mbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Gb";
+ $opts['name'] = "Gbit/s";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step3->conn{$i}uploadspeed";
+ $voipfields[] = $field;
+ }
+
+ for ($i = 0; $i < $numberoflocalinterfaces; $i++) {
+ $field = array();
+ $interface_friendly = $i+1;
+ $field['name'] = "Connection LAN #{$interface_friendly}";
+ $field['type'] = "listtopic";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['displayname'] = "Download";
+ $field['name'] = "local{$i}download";
+ $enablefields[] = "local{$i}download";
+ $field['type'] = "input";
+ $field['bindstofield'] = "ezshaper->step3->local{$i}download";
+ $field['combinefieldsbegin'] = "true";
+ $voipfields[] = $field;
+
+ $field = array();
+ $field['combinefieldsend'] = "true";
+ $field['dontdisplayname'] = "true";
+ $field['dontcombinecells'] = "true";
+ $field['name'] = "local{$i}downloadspeed";
+ $enablefields[] = "local{$i}downloadspeed";
+ $field['typehint'] = "Download bandwidth guarantee for VOIP phone(s) on connections.";
+ $field['type'] = "select";
+ $field['options']['option'] = array();
+ $opts = array();
+ $opts['value'] = "Kb";
+ $opts['name'] = "Kbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Mb";
+ $opts['name'] = "Mbit/s";
+ $field['options']['option'][] = $opts;
+ $opts = array();
+ $opts['value'] = "Gb";
+ $opts['name'] = "Gbit/s";
+ $field['options']['option'][] = $opts;
+ $field['bindstofield'] = "ezshaper->step3->local{$i}downloadspeed";
+ $voipfields[] = $field;
+ }
+
+ $field = array();
+ $field['name'] = "Next";
+ $field['type'] = "submit";
+ $voipfields[] = $field;
+ $voipfields[0]['enablefields'] = implode(",", $enablefields);
+}
+
+function step3_stepsubmitphpaction() {
+ global $config;
+ global $stepid, $savemsg;
+
+ if (!$_POST['enable'])
+ return;
+
+ if($_POST['upstream_sip_server']) {
+ if(!is_ipaddroralias($_POST['upstream_sip_server'])) {
+ /* item is not an ip or alias. error out */
+ $savemsg=gettext("Address must be a valid IP address or Firewall Alias. Please correct this value to continue.");
+ $stepid--;
+ return;
+ }
+ }
+
+ $steps = intval($config['ezshaper']['step1']['numberofconnections']);
+ for ($i = 0; $i < $steps; $i++) {
+ if ($config['ezshaper']['step2']["conn{$i}uploadscheduler"] == "PRIQ")
+ continue;
+ if (!is_numeric($_POST["conn{$i}upload"])) {
+ $savemsg = gettext("Upload bandwidth of connection {$i} is not valid.");
+ $stepid--;
+ return;
+ }
+ if ($_POST["conn{$i}uploadspeed"] == "%") {
+ if (intval($_POST["conn{$i}upload"]) > 80) {
+ $savemsg=gettext("You cannot set the VoIP upload bandwidth on connection {$i} higher than 80% of the connection.");
+ $stepid--;
+ return;
+ }
+ } else {
+ $factor = wizard_get_bandwidthtype_scale($config['ezshaper']['step2']["conn{$i}uploadspeed"]);
+ $ifbw = $factor * floatval($config['ezshaper']['step2']["conn{$i}upload"]);
+ $factor = wizard_get_bandwidthtype_scale($_POST["conn{$i}uploadspeed"]);
+ $input_bw = $factor * floatval($_POST["conn{$i}upload"]);
+ if ((0.8 * $ifbw) < $input_bw) {
+ $savemsg=gettext("You cannot set the VoIP upload bandwidth on connection {$i} higher than 80% of the connection.");
+ $stepid--;
+ return;
+ }
+ }
+ }
+
+ $localint = intval($config['ezshaper']['step1']['numberoflocalinterfaces']);
+ for ($i = 0; $i < $localint; $i++) {
+ if ($config['ezshaper']['step2']["local{$i}downloadscheduler"] == "PRIQ")
+ continue;
+ if (!is_numeric($_POST["local{$i}download"])) {
+ $savemsg = gettext("Download bandwidth of connection {$i} is not valid.");
+ $stepid--;
+ return;
+ }
+ if ($_POST["local{$i}downloadspeed"] == "%") {
+ if (intval($_POST["local{$i}download"]) > 80) {
+ $savemsg=gettext("You cannot set the VoIP download bandwidth on connection {$i} higher than 80% of the connection.");
+ $stepid--;
+ return;
+ }
+ } else {
+ for ($j = 0; $j < $steps; $j++) {
+ $factor = wizard_get_bandwidthtype_scale($config['ezshaper']['step2']["conn{$j}downloadspeed"]);
+ $ifbw = $factor * floatval($config['ezshaper']['step2']["conn{$j}download"]);
+ $factor = wizard_get_bandwidthtype_scale($_POST["local{$i}downloadspeed"]);
+ $input_bw = $factor * floatval($_POST["local{$i}download"]);
+ if ((0.8 * $ifbw) < $input_bw) {
+ $savemsg=gettext("You cannot set the VoIP download bandwidth on connection {$j} higher than 80% of the connection.");
+ $stepid--;
+ return;
+ }
+ }
+ }
+ }
+
+ /* This is necessary since the wizard expects predefined fields. */
+ unset($config['ezshaper']['step3']);
+ $config['ezshaper']['step3'] = array();
+
+ if (!empty($_POST['upstream_sip_server']))
+ $config['ezshaper']['step3']['address'] = $_POST['upstream_sip_server'];
+ if ($_POST['enable'] == 'on')
+ $config['ezshaper']['step3']['enable'] = 'on';
+ if (!empty($_POST['provider'])) {
+ $VoIPproviders = array("Generic", "VoicePulse", "Asterisk", "Panasonic");
+ if (in_array($_POST['provider'], $VoIPproviders)) {
+ $config['ezshaper']['step3']['provider'] = $_POST['provider'];
+ }
+ }
+ for ($i = 0; $i < $localint; $i++) {
+ $config['ezshaper']['step3']["local{$i}download"] = $_POST["local{$i}download"];
+ $config['ezshaper']['step3']["local{$i}downloadspeed"] = $_POST["local{$i}downloadspeed"];
+ }
+
+ for ($i = 0; $i < $steps; $i++) {
+ $config['ezshaper']['step3']["conn{$i}upload"] = $_POST["conn{$i}upload"];
+ $config['ezshaper']['step3']["conn{$i}uploadspeed"] = $_POST["conn{$i}uploadspeed"];
+ }
+}
+
+function step4_stepsubmitphpaction() {
+ global $config;
+ global $stepid, $savemsg;
+
+ if ( $_POST['enable'] ) {
+ if(!$_POST['bandwidth']) {
+ $savemsg="You need to specify a value for bandwidth!";
+ $stepid--;
+ return;
+ }
+ if(!is_numeric($_POST['bandwidth'])) {
+ $savemsg="The posted value is not a valid bandwidth.";
+ $stepid--;
+ return;
+ }
+ if ($_POST['bandwidthspeed'] <> "%") {
+ $savemsg = gettext("Only percentage bandwidth specification is allowed.");
+ $stepid--;
+ return;
+ }
+ $bw = $_POST['bandwidth'];
+ if($bw > 15 || $bw < 2) {
+ $savemsg="Values should be between 2% and 15%!";
+ $stepid--;
+ return;
+ }
+ if($_POST['address'] <> "" && !is_ipaddroralias($_POST['address'])) {
+ /* item is not an ip or alias. error out */
+ $savemsg=gettext("Address must be a valid IP address or Firewall Alias. Please correct this value to continue.");
+ $stepid--;
+ }
+ }
+}
+
+function step5_stepsubmitphpaction() {
+ global $stepid, $savemsg;
+ if ( $_POST['enable'] ) {
+ if ($_POST['p2pcatchall']) {
+ if(!is_numeric($_POST['bandwidth'])) {
+ $savemsg="Posted value is not a valid bandwidth.";
+ $stepid--;
+ }
+ if ($_POST['bandwidthspeed'] <> "%") {
+ $savemsg = gettext("Only percentage bandwidth specification is allowed.");
+ $stepid--;
+ return;
+ }
+ $bw = $_POST['bandwidth'];
+ if($bw > 15 || $bw < 2) {
+ $savemsg="Values should be between 2% and 15%!";
+ $stepid--;
+ return;
+ }
+ }
+ }
+}
+
+function step8_stepsubmitphpaction() {
+ global $g, $config;
+
+ /* save the new configuration */
+ apply_all_chosen_items();
+
+ /* reset rrd queues */
+ system("rm -f /var/db/rrd/*queuedrops.rrd");
+ system("rm -f /var/db/rrd/*queues.rrd");
+ enable_rrd_graphing();
+
+ /* apply the new configuration to the system */
+ filter_configure();
+
+ /* And we're no longer dirty! */
+ clear_subsystem_dirty('shaper');
+
+ update_filter_reload_status("Initializing");
+ header("Location: status_filter_reload.php");
+ exit;
+}
+
+function apply_all_chosen_items() {
+ global $config, $g, $altq_list_queues, $gamesplist, $voiplist, $othersplist, $p2plist;
+
+ require_once("wizardapp.inc");
+
+ /*
+ * Wipe previous config.
+ * Doing it here makes sense since we can wipe the previous config only after
+ * the user decides to do so, finishing the wizard.
+ */
+ if(isset($config['shaper']['queue']))
+ unset($config['shaper']['queue']);
+ /* XXX: This is redundant, because this should be handled by converter at startup. */
+ if(isset($config['shaper']['rule']))
+ unset($config['shaper']['rule']);
+ foreach ($config['filter']['rule'] as $key => $rule)
+ if ($rule['wizard'] == "yes")
+ unset($config['filter']['rule'][$key]);
+
+ /* restart the cached config */
+ unset($altq_list_queues);
+ $altq_list_queues = array();
+
+ $steps = intval($config['ezshaper']['step1']['numberofconnections']);
+
+ $interfacelist = array();
+
+ for ($i = 0; $i < $steps; $i++) {
+
+ $tmppath = array();
+ $altq =& new altq_root_queue();
+
+ $altq->SetInterface($config['ezshaper']['step2']["conn{$i}interface"]);
+ $interfacelist[] = $config['ezshaper']['step2']["conn{$i}interface"];
+ $altq->SetScheduler($config['ezshaper']['step2']["conn{$i}uploadscheduler"]);
+ $altq->SetBandwidth(floatval($config['ezshaper']['step2']["conn{$i}upload"]));
+ $altq->SetBwscale($config['ezshaper']['step2']["conn{$i}uploadspeed"]);
+ $altq->SetEnabled("on");
+ $altq_list_queues[$altq->GetQname()] =& $altq;
+ array_push($tmppath, $config['ezshaper']['step2']["conn{$i}interface"]);
+ $altq->SetLink($tmppath);
+ $altq->wconfig();
+
+ $sched = $config['ezshaper']['step2']["conn{$i}uploadscheduler"];
+ $voipbw =0;
+ $voipbwunit = "Kb";
+ $voip = false;
+ $penalty = false;
+ $penaltybw = 0;
+ $penaltybwunit = "Kb";
+ $p2p = false;
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ $p2pcatchbwunit = "%";
+ $games = false;
+ $otherpriority = false;
+ $remainbw = 0;
+ $factor = 0;
+ $upfactor = wizard_get_bandwidthtype_scale($config['ezshaper']['step2']["conn{$i}uploadspeed"]);
+ $upbw = floatval($config['ezshaper']['step2']["conn{$i}upload"]) * $upfactor;
+
+ if ($config['ezshaper']['step3']['enable']) {
+ $voip = true;
+ $voipbw = $config['ezshaper']['step3']["conn{$i}upload"];
+ $voipbwunit = $config['ezshaper']['step3']["conn{$i}uploadspeed"];
+ if ($voipbwunit == "%")
+ $factor = $upbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($voipbwunit);
+ $remainbw += $voipbw * $factor;
+ }
+ if ($config['ezshaper']['step4']['enable']) {
+ $penalty = true;
+ $penaltybw = $config['ezshaper']['step4']['bandwidth'];
+ $penaltybwunit = $config['ezshaper']['step4']['bandwidthunit'];
+ if ($penaltybwunit == "%")
+ $factor = $upbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($penaltybwunit);
+ $remainbw += $penaltybw * $factor;
+ } else {
+ $penalty = false;
+ $penaltybw = 0;
+ }
+ if ($config['ezshaper']['step5']['enable']) {
+ $p2p = true;
+ if ($config['ezshaper']['step5']['p2pcatchall']) {
+ $p2pcatchall = true;
+ $p2pcatchbw = $config['ezshaper']['step5']['bandwidth'];
+ $p2pcatchbwunit = $config['ezshaper']['step5']['bandwidthunit'];
+ if ($p2pcatchbwunit == "%")
+ $factor = $upbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($p2pcatchbwunit);
+ $remainbw += $p2pcatchbw * $factor;
+ } else {
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ }
+ } else {
+ $p2p = false;
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ }
+ if ($config['ezshaper']['step6']['enable']) {
+ $games = true;
+ } else {
+ $games = false;
+ }
+
+ if ($config['ezshaper']['step7']['enable']) {
+ $otherpriority = true;
+ } else {
+ $otherpriority = false;
+ }
+
+ $remainbw = round($remainbw / $upbw * 100, 2);
+
+ if (intval($remainbw) > 0 && intval($remainbw) > 30) {
+ $savemsg=gettext("Custom Bandwidths are greater than 30%. Please lower them for the wizard to continue.");
+ header("Location: wizard.php?xml=traffic_shaper_wizard_multi_all.xml&stepid=2&message={$savemsg}");
+ exit;
+ } else {
+ $remainbw = 100 - $remainbw;
+ }
+
+ if ($sched != "PRIQ") {
+ if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qInternet";
+ //$tmpcf['priority'] = 6;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ If ($sched == "CBQ") {
+ $tmpcf['bandwidth'] = floatval($config['ezshaper']['step2']["conn{$i}upload"]);
+ $tmpcf['bandwidthtype'] = $config['ezshaper']['step2']["conn{$i}uploadspeed"];
+ }
+ else if ($sched == "HFSC") {
+ $tmpcf['linkshare3'] =
+ floatval($config['ezshaper']['step2']["conn{$i}upload"]) . $config['ezshaper']['step2']["conn{$i}uploadspeed"];
+ $tmpcf['upperlimit3'] =
+ floatval($config['ezshaper']['step2']["conn{$i}upload"]) . $config['ezshaper']['step2']["conn{$i}uploadspeed"];
+ $tmpcf['upperlimit'] = "on";
+
+
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['bandwidth'] = floatval($config['ezshaper']['step2']["conn{$i}upload"]);
+ $tmpcf['bandwidthtype'] = $config['ezshaper']['step2']["conn{$i}uploadspeed"];
+ }
+ array_push($tmppath, "qInternet");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ //array_pop($tmppath);
+ //echo "qInternet <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ $altq =& $qtmp;
+ }
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qACK";
+ $tmpcf['priority'] = 6;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ If ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.2;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ else if ($sched == "HFSC") {
+ $lkbw = 0.20 * $remainbw;
+ $tmpcf['linkshare3'] = "{$lkbw}%";
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['bandwidth'] = $lkbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qACK");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qACK <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ if ($p2pcatchall)
+ $tmpcf['name'] = "qOthersDefault";
+ else
+ $tmpcf['name'] = "qDefault";
+ $tmpcf['priority'] = 3;
+ $tmpcf['enabled'] = "on";
+ if (!$p2pcatchall)
+ $tmpcf['default'] = "on";
+ $tmpcf['ecn'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpcf['bandwidth'] = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, $tmpcf['name']);
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qDefault <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+ if ($p2p) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qP2P";
+ $tmpcf['priority'] = 1;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($p2pcatchall) {
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $p2pcatchbw;
+ $tmpcf['bandwidthtype'] = $p2pcatchbwunit;
+ } else if ($sched == "HFSC") {
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$p2pcatchbw}{$p2pcatchbwunit}";
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] = "{$p2pcatchbw}{$p2pcatchbwunit}";
+ $tmpcf['bandwidth'] = $p2pcatchbw;
+ $tmpcf['bandwidthtype'] = $p2pcatchbwunit;
+ }
+ $tmpcf['default'] = "on";
+
+ } else {
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpbw = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$tmpbw}%";
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] = "{$tmpbw}%";
+ $tmpcf['bandwidth'] = $tmpbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ }
+ array_push($tmppath, "qP2P");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qP2P <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($voip) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qVoIP";
+ $tmpcf['priority'] = 7;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ if ($voipbw > 0) {
+ $tmpcf['bandwidth'] = $voipbw;
+ $tmpcf['bandwidthtype'] = $voipbwunit;
+ } else {
+ $tmpcf['bandwidth'] = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ } else if ($sched == "HFSC") {
+ if ($voipbw > 0) {
+ $tmpcf['realtime3'] = "{$voipbw}{$voipbwunit}";
+ } else {
+ $voipbw = $remainbw * 0.20; /* 20% bandwidth */
+ $tmpcf['realtime3'] = "{$voipbw}%";
+ }
+ $tmpcf['realtime'] = "on";
+ $tmpcf['bandwidth'] = 32;
+ $tmpcf['bandwidthtype'] = "Kb";
+ }
+ array_push($tmppath, "qVoIP");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qVoIP <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($games) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qGames";
+ $tmpcf['priority'] = 5;
+ $tmpcf['enabled'] = "on";
+ $tmpcf['ecn'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $gamesbw = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$gamesbw}%";
+ $tmpcf['bandwidth'] = "{$gamesbw}";
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qGames");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qGames <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($otherpriority) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qOthersHigh";
+ $tmpcf['priority'] = 4;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpcf['linkshare'] = "on";
+ $otherbw = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['linkshare3'] = "{$otherbw}%";
+ $tmpcf['bandwidth'] = $otherbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qOthersHigh");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qHigh <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qOthersLow";
+ $tmpcf['priority'] = 2;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ if ($penalty) {
+ $tmpcf['bandwidthtype'] = $penaltybwunit;
+ $tmpcf['bandwidth'] = $penaltybw;
+ } else {
+ $tmpcf['bandwidth'] = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ } else if ($sched == "HFSC") {
+ if ($penalty) {
+ $tmpcf['linkshare3'] = "{$penaltybw}{$penaltybwunit}";
+ $tmpcf['bandwidth'] = $penaltybw;
+ $tmpcf['bandwidthtype'] = $penaltybwunit;
+ } else {
+ $lsbw = $remainbw * 0.05;
+ $tmpcf['linkshare3'] = "{$lsbw}%"; /* 5% bandwidth */
+ $tmpcf['bandwidth'] = $lsbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ $tmpcf['linkshare'] = "on";
+ }
+ array_push($tmppath, "qOthersLow");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qLow <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+ array_pop($tmppath);
+ }
+
+ /* LAN bandwidth ----------------------------------------------------------------------------------------- */
+ $localint = intval($config['ezshaper']['step1']['numberoflocalinterfaces']);
+ $lanbw = 0;
+ for ($i = 0; $i < $steps; $i++) {
+ $down = wizard_get_bandwidthtype_scale($config['ezshaper']['step2']["conn{$i}downloadspeed"]);
+ $input_bw = floatval($config['ezshaper']['step2']["conn{$i}download"]) * $down;
+ $lanbw += $input_bw;
+ }
+
+ for ($i = 0; $i < $localint; $i++) {
+
+ $tmppath = array();
+ $altq =& new altq_root_queue();
+
+ $altq->SetInterface($config['ezshaper']['step2']["local{$i}interface"]);
+ $altq->SetScheduler($config['ezshaper']['step2']["local{$i}downloadscheduler"]);
+ //$altq->SetBandwidth($lanbw/1000);
+ //$altq->SetBwscale("Kb");
+ $altq->SetEnabled("on");
+ $altq_list_queues[$altq->GetQname()] =& $altq;
+ array_push($tmppath, $config['ezshaper']['step2']["local{$i}interface"]);
+ $altq->SetLink($tmppath);
+ //var_dump($input_errors);
+ $altq->wconfig();
+
+ $sched = $config['ezshaper']['step2']["local{$i}downloadscheduler"];
+ $voipbw =0;
+ $voipbwunit = "%";
+ $voip = false;
+ $penalty = false;
+ $penaltybw = 0;
+ $penaltybwunit = "%";
+ $p2p = false;
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ $games = false;
+ $otherpriority = false;
+ $remainbw = 0;
+
+
+ if ($config['ezshaper']['step3']['enable']) {
+ $voip = true;
+ $voipbw = $config['ezshaper']['step3']["local{$i}download"];
+ $voipbwunit = $config['ezshaper']['step3']["local{$i}downloadspeed"];
+ if ($sched != HFSC) {
+ if ($voipbwunit == "%")
+ $factor = $lanbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($voipbwunit);
+ $remainbw += floatval($voipbw) * $factor;
+ } else
+ $remainbw += 32000; /* 32Kbit/s reserved for HFSC link sharing */
+ }
+ if ($config['ezshaper']['step4']['enable']) {
+ $penalty = true;
+ $penaltybw = $config['ezshaper']['step4']['bandwidth'];
+ $penaltybwunit = $config['ezshaper']['step4']['bandwidthunit'];
+ if ($penaltybwunit == "%")
+ $factor = $lanbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($penaltybwunit);
+ $remainbw += floatval($penaltybw) * $factor;
+ } else {
+ $penalty = false;
+ $penaltybw = 0;
+ }
+ if ($config['ezshaper']['step5']['enable']) {
+ $p2p = true;
+ if ($config['ezshaper']['step5']['p2pcatchall']) {
+ $p2pcatchall = true;
+ $p2pcatchbw = $config['ezshaper']['step5']['bandwidth'];
+ $p2pcatchbwunit = $config['ezshaper']['step5']['bandwidthunit'];
+ if ($p2pcatchbwunit == "%")
+ $factor = $upbw/100;
+ else
+ $factor = wizard_get_bandwidthtype_scale($p2pcatchbwunit);
+ $remainbw += floatval($p2pcatchbw) * $factor;
+ } else {
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ }
+ } else {
+ $p2p = false;
+ $p2pcatchall = false;
+ $p2pcatchbw = 0;
+ }
+ if ($config['ezshaper']['step6']['enable']) {
+ $games = true;
+ } else {
+ $games = false;
+ }
+
+ if ($config['ezshaper']['step7']['enable']) {
+ $otherpriority = true;
+ } else {
+ $otherpriority = false;
+ }
+ $remainbw = round($remainbw / $lanbw * 100, 2);
+
+ if (intval($remainbw) > 0 && intval($remainbw) > 40) {
+ $savemsg=gettext("Custom Bandwidths are greater than 40%. Please lower them for the wizard to continue.");
+ header("Location: wizard.php?xml=traffic_shaper_wizard_multi_all.xml&stepid=2&message={$savemsg}");
+ exit;
+ } else {
+ $remainbw = 100 - $remainbw;
+ }
+
+ if (!$p2pcatchall) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qLink";
+ $tmpcf['priority'] = 2;
+ $tmpcf['enabled'] = "on";
+ $tmpcf['default'] = "on";
+ $tmpcf['qlimit'] = 500;
+ $tmpcf['ecn'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = 20; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpcf['bandwidth'] = 20; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, $tmpcf['name']);
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qDefault <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($sched != "PRIQ") {
+ if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qInternet";
+ //$tmpcf['priority'] = 6;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ If ($sched == "CBQ") {
+ $tmpcf['bandwidth'] = $lanbw/1000;
+ $tmpcf['bandwidthtype'] = "Kb";
+ }
+ else if ($sched == "HFSC") {
+ $tmpcf['linkshare3'] = $lanbw/1000 . "Kb";
+ $tmpcf['upperlimit3'] = $lanbw/1000 . "Kb";
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['bandwidth'] = $lanbw/1000;
+ $tmpcf['bandwidthtype'] = "Kb";
+ }
+ array_push($tmppath, "qInternet");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ //array_pop($tmppath);
+ //echo "qInternet <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ $altq =& $qtmp;
+ }
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qACK";
+ $tmpcf['priority'] = 6;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ If ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.2;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ else if ($sched == "HFSC") {
+ $lkbw = 0.20 * $remainbw;
+ $tmpcf['linkshare3'] = "{$lkbw}%";
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['bandwidth'] = $lkbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qACK");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qACK <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+ if ($p2p) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qP2P";
+ $tmpcf['priority'] = 1;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($p2pcatchall) {
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $p2pcatchbw;
+ $tmpcf['bandwidthtype'] = $p2pcatchbwunit;
+ } else if ($sched == "HFSC") {
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$p2pcatchbw}{$p2pcatchbwunit}";
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] = "{$p2pcatchbw}{$p2pcatchbwunit}";
+ $tmpcf['bandwidth'] = $p2pcatchbw;
+ $tmpcf['bandwidthtype'] = $p2pcatchbwunit;
+ }
+ $tmpcf['default'] = "on";
+ $tmpcf['qlimit'] = 500;
+ } else {
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpbw = $remainbw * 0.05; /* 5% bandwidth */
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$tmpbw}%";
+ $tmpcf['upperlimit'] = "on";
+ $tmpcf['upperlimit3'] = "{$tmpbw}%";
+ $tmpcf['bandwidth'] = $tmpbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ }
+ array_push($tmppath, "qP2P");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qP2P <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($voip) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qVoIP";
+ $tmpcf['priority'] = 7;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ if ($voipbw > 0) {
+ $tmpcf['bandwidth'] = $voipbw;
+ $tmpcf['bandwidthtype'] = $voipbwunit;
+ } else {
+ $tmpcf['bandwidth'] = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ } else if ($sched == "HFSC") {
+ if ($voipbw > 0) {
+ $tmpcf['realtime3'] = "{$voipbw}{$voipbwunit}";
+ } else {
+ $voipbw = $remainbw * 0.20; /* 20% bandwidth */
+ $tmpcf['realtime3'] = "{$voipbw}%";
+ }
+ $tmpcf['realtime'] = "on";
+ $tmpcf['bandwidth'] = 32;
+ $tmpcf['bandwidthtype'] = "Kb";
+ }
+ array_push($tmppath, "qVoIP");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qVoIP <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($games) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qGames";
+ $tmpcf['priority'] = 5;
+ $tmpcf['enabled'] = "on";
+ $tmpcf['ecn'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $gamesbw = $remainbw * 0.2; /* 20% bandwidth */
+ $tmpcf['linkshare'] = "on";
+ $tmpcf['linkshare3'] = "{$gamesbw}%";
+ $tmpcf['bandwidth'] = "{$gamesbw}";
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qGames");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qGames <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+
+ if ($otherpriority) {
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qOthersHigh";
+ $tmpcf['priority'] = 4;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ $tmpcf['bandwidth'] = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['bandwidthtype'] = "%";
+ } else if ($sched == "HFSC") {
+ $tmpcf['linkshare'] = "on";
+ $otherbw = $remainbw * 0.1; /* 10% bandwidth */
+ $tmpcf['linkshare3'] = "{$otherbw}%";
+ $tmpcf['bandwidth'] = $otherbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ array_push($tmppath, "qOthersHigh");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qHigh <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+
+
+ if ($sched == "PRIQ")
+ $q =& new priq_queue();
+ else if ($sched == "CBQ")
+ $q =& new cbq_queue();
+ else if ($sched == "HFSC")
+ $q =& new hfsc_queue();
+ $tmpcf = array();
+ $tmpcf['name'] = "qOthersLow";
+ $tmpcf['priority'] = 3;
+ $tmpcf['ecn'] = "on";
+ $tmpcf['enabled'] = "on";
+ if ($sched == "CBQ") {
+ $tmpcf['borrow'] = "on";
+ if ($penalty) {
+ $tmpcf['bandwidth'] = $penaltybw;
+ $tmpcf['bandwidthtype'] = $penaltybwunit;
+ } else {
+ $tmpcf['bandwidthtype'] = "%";
+ $tmpcf['bandwidth'] = $remainbw * 0.05; /* 5% bandwidth */
+ }
+ } else if ($sched == "HFSC") {
+ if ($penalty) {
+ $tmpcf['linkshare3'] = "{$penaltybw}{$penaltybwunit}";
+ $tmpcf['bandwidth'] = $penaltybw;
+ $tmpcf['bandwidthtype'] = $penaltybwunit;
+ } else {
+ $lsbw = $remainbw * 0.05;
+ $tmpcf['linkshare3'] = "{$lsbw}%"; /* 5% bandwidth */
+ $tmpcf['bandwidth'] = $lsbw;
+ $tmpcf['bandwidthtype'] = "%";
+ }
+ $tmpcf['linkshare'] = "on";
+ }
+ array_push($tmppath, "qOthersLow");
+ $qtmp =& $altq->add_queue($q, $tmpcf, $tmppath, $input_errors);
+ array_pop($tmppath);
+ //echo "qLow <br />";
+ //var_dump($input_errors);
+ $qtmp->wconfig();
+ }
+ array_pop($tmppath);
+ }
+
+/* End LAN bandwidth ------------------------------------------------------------------------------------- */
+
+
+
+ if (!is_array($config['filter']['rule']))
+ $config['filter']['rule'] = array();
+
+ $interfacelist = implode(",", $interfacelist);
+
+ /* Rules */
+ if ($penalty) {
+ if( is_ipaddr($config['ezshaper']['step4']['address']) || is_alias($config['ezshaper']['step4']['address'])) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['descr'] = gettext("Penalty Box");
+ $rule['defaultqueue'] = "qOthersLow";
+ $rule['source']['address'] = $config['ezshaper']['step4']['address'];
+ $rule['destination']['any'] = TRUE;
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+
+ }
+ }
+
+ /* If user specifies an IP, we don't bother with providers */
+ if ($voip) {
+ if( is_ipaddr($config['ezshaper']['step3']['address']) || is_alias($config['ezshaper']['step3']['address'])) {
+ /* create VOIP rules */
+ $rule = array();
+ $rule['type'] = "match";
+ //$rule['interface'] = $interfacelist;
+ $rule['descr'] = gettext("Connections From Upstream SIP Server");
+ $rule['protocol'] = "udp";
+ $rule['defaultqueue'] = "qVoIP";
+ $rule['source']['address'] = $config['ezshaper']['step3']['address'];
+ $rule['destination']['any'] = TRUE;
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+
+ $rule = array();
+ $rule['type'] = "match";
+ //$rule['interface'] = $interfacelist;
+ $rule['descr'] = gettext("Connections To Upstream SIP Server");
+ $rule['protocol'] = "udp";
+ $rule['defaultqueue'] = "qVoIP";
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['address'] = $config['ezshaper']['step3']['address'];
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+
+ } elseif( $config['ezshaper']['step3']['provider'] == "Generic" ) {
+ /* create VOIP rules */
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['descr'] = "DiffServ/Lowdelay/Upload";
+ $rule['protocol'] = "udp";
+ $rule['source']['any'] = TRUE;
+ $rule['defaultqueue'] = "qVoIP";
+ $rule['destination']['any'] = TRUE;
+ $rule['iptos'] = "lowdelay";
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+
+ } else {
+ /* loop through voiplist[] */
+ foreach ($voiplist[$config['ezshaper']['step3']['provider']] as $voip) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['defaultqueue'] = 'qVoIP';
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['any'] = TRUE;
+ $rule['descr'] = "m_voip {$voip[0]} outbound";
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['destination']['port'] = $voip[2]."-".$voip[3];
+ if($voip[1] != '')
+ $rule['protocol'] = $voip[1];
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+ }
+ }
+
+ /* loop through p2plist[] */
+ if ($p2p) {
+ foreach($config['ezshaper']['step5'] as $key => $val) {
+ if (!is_array($p2plist[$key]))
+ continue;
+ foreach ($p2plist[$key] as $p2pclient) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['defaultqueue'] = 'qP2P';
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['any'] = TRUE;
+ $rule['descr'] = "m_P2P {$p2pclient[0]} outbound";
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['destination']['port'] = $p2pclient[2]."-".$p2pclient[3];
+ if($p2pclient[1] != '')
+ $rule['protocol'] = $p2pclient[1];
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+ }
+ }
+
+ /* loop through gamesplist[] */
+ if ($games) {
+ foreach($config['ezshaper']['step6'] as $key => $val) {
+ if (!is_array($gamesplist[$key]))
+ continue;
+ foreach ($gamesplist[$key] as $Gameclient) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ $rule['defaultqueue'] = 'qGames';
+ if ($Gameclient[1] == "tcp")
+ $rule['ackqueue'] = 'qACK';
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['any'] = TRUE;
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['descr'] = "m_Game {$Gameclient[0]} outbound";
+ $rule['destination']['port'] = $Gameclient[2]."-".$Gameclient[3];
+ if($Gameclient[1] != '')
+ $rule['protocol'] = $Gameclient[1];
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+ }
+ }
+
+ /* loop through othersplist[] */
+ if ($otherpriority) {
+ foreach($config['ezshaper']['step7'] as $key => $val) {
+ if (!is_array($othersplist[$key]))
+ continue;
+ foreach ($othersplist[$key] as $otherclient) {
+ $rule = array();
+ $rule['type'] = "match";
+ $rule['interface'] = $interfacelist;
+ switch ($val) {
+ case "H":
+ $rule['defaultqueue'] = 'qOthersHigh'; /* posted value H or L */
+ if ($otherclient[1] == "tcp")
+ $rule['ackqueue'] = 'qACK';
+ $loop = 0;
+ break;
+ case "L":
+ $rule['defaultqueue'] = 'qOthersLow'; /* posted value H or L */
+ if ($otherclient[1] == "tcp")
+ $rule['ackqueue'] = 'qACK';
+ $loop = 0;
+ break;
+ case "D":
+ if ($p2pcatchall) {
+ $loop = 0;
+ $rule['defaultqueue'] = 'qOthersDefault';
+ if ($otherclient[1] == "tcp")
+ $rule['ackqueue'] = 'qACK';
+ } else
+ $loop = 1; /* It automatically goes to default queue */
+ break;
+ default:
+ $loop = 1;
+ }
+ if (!$loop) {
+ $rule['source']['any'] = TRUE;
+ $rule['destination']['any'] = TRUE;
+ $rule['floating'] = "yes";
+ $rule['wizard'] = "yes";
+ $rule['enabled'] = "on";
+ $rule['descr'] = "m_Other {$otherclient[0]} outbound";
+
+ if($otherclient[2] or $otherclient[3]) {
+ $rule['destination']['port'] = $otherclient[2]."-".$otherclient[3];
+ }
+ if($otherclient[1] != '')
+ $rule['protocol'] = $otherclient[1];
+ $rule['created'] = make_config_revision_entry(null, gettext("Traffic Shaper Wizard"));
+ $config['filter']['rule'][] = $rule;
+ }
+ }
+ }
+ }
+ write_config();
+}
+
+function wizard_get_bandwidthtype_scale($type = "b") {
+ switch ($type) {
+ case "Gb":
+ $factor = 1024 * 1024 * 1024;
+ break;
+ case "Mb":
+ $factor = 1024 * 1024;
+ break;
+ case "Kb":
+ $factor = 1024;
+ break;
+ case "b":
+ default:
+ $factor = 1;
+ break;
+ }
+ return intval($factor);
+}
+
+?>
diff --git a/src/usr/local/www/wizards/traffic_shaper_wizard_multi_all.xml b/src/usr/local/www/wizards/traffic_shaper_wizard_multi_all.xml
new file mode 100755
index 0000000..e94256b
--- /dev/null
+++ b/src/usr/local/www/wizards/traffic_shaper_wizard_multi_all.xml
@@ -0,0 +1,1657 @@
+<?xml version="1.0"?>
+<pfsensewizard>
+ <copyright><![CDATA[
+ /*
+ traffic_shaper_wizard_multi_all.xml
+ part of pfSense (https://www.pfsense.org/)
+
+ Copyright (C) 2005 Bill Marquette - bill.marquette@gmail.com.
+ Copyright (C) 2008-2010 Ermal Luçi
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */]]></copyright>
+
+ <totalsteps>9</totalsteps>
+ <step>
+ <id>1</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <disableheader>true</disableheader>
+ <description>This wizard will guide you through setting up the pfSense traffic shaper.
+ Please be aware that Custom Bandwidths should not exceed 30% of the interface/link bandwidth. Keep this in mind during the wizard.
+ </description>
+ <fields>
+ <field>
+ <type>listtopic</type>
+ <name>Traffic shaper Wizard</name>
+ </field>
+ <field>
+ <displayname>Enter number of WAN type connections</displayname>
+ <name>numberofconnections</name>
+ <type>input</type>
+ <validate>^[0-9]+$</validate>
+ <description>Number of connections you have</description>
+ <bindstofield>ezshaper->step1->numberofconnections</bindstofield>
+ </field>
+ <field>
+ <displayname>Enter number of LAN type interfaces</displayname>
+ <name>numberoflocalinterfaces</name>
+ <type>input</type>
+ <validate>^[0-9]+$</validate>
+ <description>Number of local interfaces you have</description>
+ <bindstofield>ezshaper->step1->numberoflocalinterfaces</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step1_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step1_submitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc</includefile>
+ </step>
+ <step>
+ <id>2</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <description>Shaper configuration</description>
+ <javascriptafterformdisplay/>
+ <stepbeforeformdisplay>step2_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step2_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc</includefile>
+ <fields>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ </step>
+ <step>
+ <id>3</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <description>Voice over IP</description>
+ <fields>
+ <field>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Prioritize Voice over IP traffic</typehint>
+ <description>This will raise the priority of VOIP traffic above all other traffic.</description>
+ <bindstofield>ezshaper-&gt;step3-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>VOIP specific settings</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>Provider</name>
+ <type>select</type>
+ <description>Choose Generic if your provider isn't listed.</description>
+ <bindstofield>ezshaper-&gt;step3-&gt;provider</bindstofield>
+ <options>
+ <option>
+ <name>Generic (lowdelay)</name>
+ <value>Generic</value>
+ </option>
+ <option>
+ <name>VoicePulse</name>
+ <value>VoicePulse</value>
+ </option>
+ <option>
+ <name>Asterisk/Vonage</name>
+ <value>Asterisk</value>
+ </option>
+ <option>
+ <name>PanasonicTDA</name>
+ <value>Panasonic</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <displayname>Upstream SIP Server</displayname>
+ <name>upstream_sip_server</name>
+ <type>inputalias</type>
+ <description>(Optional) If this is chosen, the provider field will be overridden. This allows you to provide the IP address of the &lt;strong&gt;remote&lt;/strong&gt; PBX or SIP Trunk to prioritize. &lt;br /&gt;NOTE: You can also use a Firewall Alias in this location.</description>
+ <bindstofield>ezshaper-&gt;step3-&gt;address</bindstofield>
+ <message>IP Address field is non-blank and doesn't look like an IP address.</message>
+ </field>
+ <field>
+ <name>Bandwidth</name>
+ <type>input</type>
+ <validate>^[0-9]*$</validate>
+ <typehint>Total bandwidth in percentage(%)(should be between 5 and 40) guarantee for VOIP traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step3-&gt;bandwidth</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepbeforeformdisplay>step3_stepbeforeformdisplay();</stepbeforeformdisplay>
+ <stepsubmitphpaction>step3_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc</includefile>
+ </step>
+ <step>
+ <id>4</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <description>Penalty Box</description>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <fields>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Penalize IP or Alias</typehint>
+ <description>This will lower the priority of traffic from this IP or alias.</description>
+ <enablefields>Address,Bandwidth,BandwidthSpeed</enablefields>
+ <bindstofield>ezshaper-&gt;step4-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>PenaltyBox specific settings</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>Address</name>
+ <type>inputalias</type>
+ <description>This allows you to just provide the IP address of the computer(s) to penalize. NOTE: You can also use a Firewall Alias in this location.</description>
+ <bindstofield>ezshaper-&gt;step4-&gt;address</bindstofield>
+ <message>IP Address field is non-blank and doesn't look like an IP address.</message>
+ </field>
+ <field>
+ <name>Bandwidth</name>
+ <type>input</type>
+ <validate>^[0-9]*$</validate>
+ <message>Speed must be numerical.</message>
+ <bindstofield>ezshaper-&gt;step4-&gt;bandwidth</bindstofield>
+ <combinefieldsbegin>true</combinefieldsbegin>
+ </field>
+ <field>
+ <combinefieldsend>true</combinefieldsend>
+ <dontdisplayname>true</dontdisplayname>
+ <dontcombinecells>true</dontcombinecells>
+ <donotdisable>true</donotdisable>
+ <name>BandwidthSpeed</name>
+ <description>The limit you want to apply.</description>
+ <type>select</type>
+ <options>
+ <option>
+ <name>%</name>
+ <value>%</value>
+ </option>
+ <option>
+ <name>bit/s</name>
+ <value>b</value>
+ </option>
+ <option>
+ <name>Kilobit/s</name>
+ <value>Kb</value>
+ </option>
+ <option>
+ <name>Megabit/s</name>
+ <value>Mb</value>
+ </option>
+ <option>
+ <name>Gigabit/s</name>
+ <value>Gb</value>
+ </option>
+ </options>
+ <bindstofield>ezshaper->step4->bandwidthunit</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step4_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc</includefile>
+ </step>
+ <step>
+ <id>5</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <description>Peer to Peer networking</description>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <fields>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Lower priority of Peer-to-Peer traffic</typehint>
+ <description>This will lower the priority of P2P traffic below all other traffic. Please check the items that you would like to prioritize lower than normal traffic.</description>
+ <enablefields>p2pCatchAll,Bandwidth,BandwidthSpeed,Aimster,BitTorrent,BuddyShare,CuteMX,DCplusplus,dcc,DirectConnect,DirectFileExpress,EDonkey2000,FastTrack,Gnutella,grouper,hotComm,HotlineConnect,iMesh,Napster,OpenNap,Scour,Shareaza,SongSpy,WinMX</enablefields>
+ <bindstofield>ezshaper-&gt;step5-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>p2p Catch all</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>p2pCatchAll</name>
+ <type>checkbox</type>
+ <typehint>When enabled, all uncategorized traffic is fed to the p2p queue.</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;p2pcatchall</bindstofield>
+ </field>
+ <field>
+ <name>Bandwidth</name>
+ <type>input</type>
+ <validate>^[0-9]*$</validate>
+ <message>Speed must be numerical.</message>
+ <bindstofield>ezshaper-&gt;step5-&gt;bandwidth</bindstofield>
+ <combinefieldsbegin>true</combinefieldsbegin>
+ </field>
+ <field>
+ <combinefieldsend>true</combinefieldsend>
+ <dontdisplayname>true</dontdisplayname>
+ <dontcombinecells>true</dontcombinecells>
+ <donotdisable>true</donotdisable>
+ <name>BandwidthSpeed</name>
+ <description>The limit you want to apply.</description>
+ <type>select</type>
+ <options>
+ <option>
+ <name>%</name>
+ <value>%</value>
+ </option>
+ <option>
+ <name>bit/s</name>
+ <value>b</value>
+ </option>
+ <option>
+ <name>Kilobit/s</name>
+ <value>Kb</value>
+ </option>
+ <option>
+ <name>Megabit/s</name>
+ <value>Mb</value>
+ </option>
+ <option>
+ <name>Gigabit/s</name>
+ <value>Gb</value>
+ </option>
+ </options>
+ <bindstofield>ezshaper->step5->bandwidthunit</bindstofield>
+ </field>
+ <field>
+ <name>Enable/Disable specific P2P protocols</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>Aimster</name>
+ <type>checkbox</type>
+ <typehint>Aimster and other P2P using the Aimster protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;aimster</bindstofield>
+ </field>
+ <field>
+ <name>BitTorrent</name>
+ <type>checkbox</type>
+ <typehint>Bittorrent and other P2P using the Torrent protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;bittorrent</bindstofield>
+ </field>
+ <field>
+ <name>BuddyShare</name>
+ <type>checkbox</type>
+ <typehint>BuddyShare and other P2P using the BuddyShare protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;buddyshare</bindstofield>
+ </field>
+ <field>
+ <name>CuteMX</name>
+ <type>checkbox</type>
+ <typehint>CuteMX and other P2P using the CuteMX protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;cutemx</bindstofield>
+ </field>
+ <field>
+ <name>DCplusplus</name>
+ <type>checkbox</type>
+ <typehint>DC++ and other P2P using the DC++ protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;dcplusplus</bindstofield>
+ </field>
+ <field>
+ <name>DCC</name>
+ <type>checkbox</type>
+ <typehint>irc DCC file transfers</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;dcc</bindstofield>
+ </field>
+ <field>
+ <name>DirectConnect</name>
+ <type>checkbox</type>
+ <typehint>DirectConnect and other P2P using the DirectConnect protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;directconnect</bindstofield>
+ </field>
+ <field>
+ <name>DirectFileExpress</name>
+ <type>checkbox</type>
+ <typehint>DirectFileExpress and other P2P using the DirectFileExpress protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;directfileexpress</bindstofield>
+ </field>
+ <field>
+ <name>eDonkey2000</name>
+ <type>checkbox</type>
+ <typehint>eDonkey and other P2P using the eDonkey protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;edonkey2000</bindstofield>
+ </field>
+ <field>
+ <name>FastTrack</name>
+ <type>checkbox</type>
+ <typehint>FastTrack and other P2P using the FastTrack protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;fasttrack</bindstofield>
+ </field>
+ <field>
+ <name>Gnutella</name>
+ <type>checkbox</type>
+ <typehint>Gnutella and other P2P using the Gnutella protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;gnutella</bindstofield>
+ </field>
+ <field>
+ <name>grouper</name>
+ <type>checkbox</type>
+ <typehint>grouper and other P2P using the grouper protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;grouper</bindstofield>
+ </field>
+ <field>
+ <name>hotComm</name>
+ <type>checkbox</type>
+ <typehint>hotComm and other P2P using the hotComm protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;hotcomm</bindstofield>
+ </field>
+ <field>
+ <name>HotlineConnect</name>
+ <type>checkbox</type>
+ <typehint>HotlineConnect and other P2P using the HotlineConnect protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;hotlineconnect</bindstofield>
+ </field>
+ <field>
+ <name>iMesh</name>
+ <type>checkbox</type>
+ <typehint>iMesh and other P2P using the iMesh protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;imesh</bindstofield>
+ </field>
+ <field>
+ <name>Napster</name>
+ <type>checkbox</type>
+ <typehint>Napster and other P2P using the Napster protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;napster</bindstofield>
+ </field>
+ <field>
+ <name>OpenNap</name>
+ <type>checkbox</type>
+ <typehint>OpenNap and other P2P using the OpenNap protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;opennap</bindstofield>
+ </field>
+ <field>
+ <name>Scour</name>
+ <type>checkbox</type>
+ <typehint>Scour and other P2P using the Scour protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;scour</bindstofield>
+ </field>
+ <field>
+ <name>Shareaza</name>
+ <type>checkbox</type>
+ <typehint>Shareaza and other P2P using the Shareaza protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;shareaza</bindstofield>
+ </field>
+ <field>
+ <name>SongSpy</name>
+ <type>checkbox</type>
+ <typehint>SongSpy and other P2P using the SongSpy protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;songspy</bindstofield>
+ </field>
+ <field>
+ <name>WinMX</name>
+ <type>checkbox</type>
+ <typehint>WinMX and other P2P using the WinMX protocol and ports</typehint>
+ <bindstofield>ezshaper-&gt;step5-&gt;winmx</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step5_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc</includefile>
+ </step>
+ <step>
+ <id>6</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <description>Network Games</description>
+ <fields>
+ <field>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Prioritize network gaming traffic</typehint>
+ <description>This will raise the priority of gaming traffic to higher than most traffic.</description>
+ <enablefields>BattleNET,EAOrigin,GameForWindowsLive,PlayStationConsoles,Steam,WiiConsoles,XboxConsoles,ARMA2,ARMA3,Battlefield2,Battlefield3,BattlefieldBC2,Borderlands,CallOfDuty,Counterstrike,Crysis2,Crysis3,DeltaForce,DeadSpace2,DeadSpace3,Dirt3,DOOM3,DragonAge2,EmpireEarth,EveOnline,Everquest,Everquest2,FarCry,FarCry2,FarCry3,GunZOnline,HalfLife,LeagueofLegends,Lineage2,MassEffect3,MechwarriorOnline,Minecraft,OperationFlashpointDR,PlanetSide,PlanetSide2,QuakeIII,QuakeIV,StarWarsTOR,TigerWoods2004PS2,TribesAscend,UnrealTournament,WolfensteinEnemyTerritory,WorldOfWarcraft</enablefields>
+ <donotdisable>true</donotdisable>
+ <bindstofield>ezshaper-&gt;step6-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>Enable/Disable specific game consoles and services</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>BattleNET</name>
+ <type>checkbox</type>
+ <typehint>Battle.net - Virtually every game from Blizzard publishing should match this. This includes the following game series: Starcraft, Diablo, Warcraft. Guild Wars also uses this port.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;battlenet</bindstofield>
+ </field>
+ <field>
+ <name>EAOrigin</name>
+ <type>checkbox</type>
+ <typehint>EA Origin Client - Some PC games by EA use this.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;eaorigin</bindstofield>
+ </field>
+ <field>
+ <name>GameForWindowsLive</name>
+ <type>checkbox</type>
+ <typehint>Games for Windows Live</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;gamesforwindowslive</bindstofield>
+ </field>
+ <field>
+ <name>PlayStationConsoles</name>
+ <type>checkbox</type>
+ <typehint>PlayStation Consoles - This should cover all ports required for the Playstation 4, Playstation, PS Vita</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;playstationconsoles</bindstofield>
+ </field>
+ <field>
+ <name>Steam</name>
+ <type>checkbox</type>
+ <typehint>Steam Game Client (Includes: America's Army 3, Counter-Strike: Source, Counter-Strike: Global Offensive, Half-Life 2, COD: Black Ops Series, Borderlands 2, Natural Selection 2, Left 4 Dead Series, Portal 2 and many other games on the Steam)</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;steam</bindstofield>
+ </field>
+ <field>
+ <name>WiiConsoles</name>
+ <type>checkbox</type>
+ <typehint>Wii Consoles - Wii, Wii U, DS and 3DS</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;wiiconsoles</bindstofield>
+ </field>
+ <field>
+ <name>XboxConsoles</name>
+ <type>checkbox</type>
+ <typehint>Xbox Consoles - Xbox 360 and Xbox One</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;xboxconsoles</bindstofield>
+ </field>
+ <field>
+ <name>Enable/Disable specific games</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>ARMA2</name>
+ <type>checkbox</type>
+ <typehint>ARMA 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;arma2</bindstofield>
+ </field>
+ <field>
+ <name>ARMA3</name>
+ <type>checkbox</type>
+ <typehint>ARMA 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;arma3</bindstofield>
+ </field>
+ <field>
+ <name>Battlefield2</name>
+ <type>checkbox</type>
+ <typehint>Battlefield 2 - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;battlefield2</bindstofield>
+ </field>
+ <field>
+ <name>Battlefield3</name>
+ <type>checkbox</type>
+ <typehint>Battlefield 3 and 4 - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;battlefield3</bindstofield>
+ </field>
+ <field>
+ <name>BattlefieldBC2</name>
+ <type>checkbox</type>
+ <typehint>Battlefield: Bad Company 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;battlefieldbc2</bindstofield>
+ </field>
+ <field>
+ <name>Borderlands</name>
+ <type>checkbox</type>
+ <typehint>Borderlands</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;borderlands</bindstofield>
+ </field>
+ <field>
+ <name>CallOfDuty</name>
+ <type>checkbox</type>
+ <typehint>Call Of Duty (United Offensive)</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;callofduty</bindstofield>
+ </field>
+ <field>
+ <name>Counterstrike</name>
+ <type>checkbox</type>
+ <typehint>Counterstrike. The ultimate 1st person shooter.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;counterstrike</bindstofield>
+ </field>
+ <field>
+ <name>Crysis2</name>
+ <type>checkbox</type>
+ <typehint>Crysis 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;crysis2</bindstofield>
+ </field>
+ <field>
+ <name>Crysis3</name>
+ <type>checkbox</type>
+ <typehint>Crysis 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;crysis3</bindstofield>
+ </field>
+ <field>
+ <name>DeadSpace2</name>
+ <type>checkbox</type>
+ <typehint>Dead Space2 - this game uses a HUGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;deadspace2</bindstofield>
+ </field>
+ <field>
+ <name>DeadSpace3</name>
+ <type>checkbox</type>
+ <typehint>Dead Space 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;deadspace3</bindstofield>
+ </field>
+ <field>
+ <name>DeltaForce</name>
+ <type>checkbox</type>
+ <typehint>Delta Force</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;deltaforce</bindstofield>
+ </field>
+ <field>
+ <name>Dirt3</name>
+ <type>checkbox</type>
+ <typehint>Dirt 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;dirt3</bindstofield>
+ </field>
+ <field>
+ <name>DOOM3</name>
+ <type>checkbox</type>
+ <typehint>DOOM3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;doom3</bindstofield>
+ </field>
+ <field>
+ <name>DragonAge2</name>
+ <type>checkbox</type>
+ <typehint>Dragon Age 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;dragonage2</bindstofield>
+ </field>
+ <field>
+ <name>EmpireEarth</name>
+ <type>checkbox</type>
+ <typehint>Empire Earth</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;empireearth</bindstofield>
+ </field>
+ <field>
+ <name>EveOnline</name>
+ <type>checkbox</type>
+ <typehint>EVE Online</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;eveonline</bindstofield>
+ </field>
+ <field>
+ <name>Everquest</name>
+ <type>checkbox</type>
+ <typehint>Everquest - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;everquest</bindstofield>
+ </field>
+ <field>
+ <name>Everquest2</name>
+ <type>checkbox</type>
+ <typehint>Everquest II</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;everquest2</bindstofield>
+ </field>
+ <field>
+ <name>FarCry</name>
+ <type>checkbox</type>
+ <typehint>Far Cry</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;farcry</bindstofield>
+ </field>
+ <field>
+ <name>FarCry2</name>
+ <type>checkbox</type>
+ <typehint>Far Cry 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;farcry2</bindstofield>
+ </field>
+ <field>
+ <name>FarCry3</name>
+ <type>checkbox</type>
+ <typehint>Far Cry 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;farcry3</bindstofield>
+ </field>
+ <field>
+ <name>GunZOnline</name>
+ <type>checkbox</type>
+ <typehint>GunZ Online</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;gunzonline</bindstofield>
+ </field>
+ <field>
+ <name>HalfLife</name>
+ <type>checkbox</type>
+ <typehint>Half-Life</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;halflife</bindstofield>
+ </field>
+ <field>
+ <name>LeagueofLegends</name>
+ <type>checkbox</type>
+ <typehint>League of Legends - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;leagueoflegends</bindstofield>
+ </field>
+ <field>
+ <name>Lineage2</name>
+ <type>checkbox</type>
+ <typehint>Lineage II</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;lineage2</bindstofield>
+ </field>
+ <field>
+ <name>MassEffect3</name>
+ <type>checkbox</type>
+ <typehint>Mass Effect 3</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;masseffect3</bindstofield>
+ </field>
+ <field>
+ <name>MechwarriorOnline</name>
+ <type>checkbox</type>
+ <typehint>MechWarrior: Online - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;mechwarrioronline</bindstofield>
+ </field>
+ <field>
+ <name>Minecraft</name>
+ <type>checkbox</type>
+ <typehint>Minecraft</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;minecraft</bindstofield>
+ </field>
+ <field>
+ <name>PlanetSide</name>
+ <type>checkbox</type>
+ <typehint>PlanetSide</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;planetside</bindstofield>
+ </field>
+ <field>
+ <name>PlanetSide2</name>
+ <type>checkbox</type>
+ <typehint>PlanetSide 2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;planetside2</bindstofield>
+ </field>
+ <field>
+ <name>OperationFlashpointDR</name>
+ <type>checkbox</type>
+ <typehint>Operation Flashpoint: Dragon Rising</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;operationflashpoint-dr</bindstofield>
+ </field>
+ <field>
+ <name>QuakeIII</name>
+ <type>checkbox</type>
+ <typehint>Quake III</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;quakeiii</bindstofield>
+ </field>
+ <field>
+ <name>QuakeIV</name>
+ <type>checkbox</type>
+ <typehint>Quake IV</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;quakeiv</bindstofield>
+ </field>
+ <field>
+ <name>StarWarsTOR</name>
+ <type>checkbox</type>
+ <typehint>StarWars: The Old Republic - this game uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;starwarstor</bindstofield>
+ </field>
+ <field>
+ <name>TigerWoods2004PS2</name>
+ <type>checkbox</type>
+ <typehint>Tiger Woods 2004 for PS2</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;tigerwoods2004ps2</bindstofield>
+ </field>
+ <field>
+ <name>TribesAscend</name>
+ <type>checkbox</type>
+ <typehint>Tribes Ascend</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;tribesascend</bindstofield>
+ </field>
+ <field>
+ <name>UnrealTournament</name>
+ <type>checkbox</type>
+ <typehint>Unreal Tournament Series</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;unrealtournament</bindstofield>
+ </field>
+ <field>
+ <name>WolfensteinEnemyTerritory</name>
+ <type>checkbox</type>
+ <typehint>Wolfenstein Enemy Territory</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;wolfet</bindstofield>
+ </field>
+ <field>
+ <name>WorldOfWarcraft</name>
+ <type>checkbox</type>
+ <typehint>World of Warcraft</typehint>
+ <bindstofield>ezshaper-&gt;step6-&gt;wow</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc</includefile>
+ </step>
+ <step>
+ <id>7</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <description>Raise or lower other Applications</description>
+ <fields>
+ <field>
+ <name>Enable</name>
+ <type>checkbox</type>
+ <typehint>Other networking protocols</typehint>
+ <description>This will help raise or lower the priority of other protocols higher than most traffic.</description>
+ <enablefields>AppleRemoteDesktop,MSRDP,PCAnywhere,VNC,AIM,Facetime,GoogleHangouts,ICQ,IRC,Jabber,MSN,TeamSpeak,TeamSpeak3,Ventrilo,PPTP,IPSEC,iTunesRadio,StreamingMP3,RTSP,RTMP,HTTP,IMAP,LotusNotes,POP3,SMTP,BattleNETDownloader,SteamDownloader,APNS,AppleMobileSync,CrashPlan,CVSUP,DNS,GIT,HBCI,ICMP,MySqlServer,NNTP,Slingbox,SMB,SNMP,Subversion</enablefields>
+ <donotdisable>true</donotdisable>
+ <bindstofield>ezshaper-&gt;step7-&gt;enable</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ <field>
+ <name>Remote Service / Terminal emulation</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>AppleRemoteDesktop</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;appleremotedesktop</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Apple Remote Desktop</typehint>
+ </field>
+ <field>
+ <name>MSRDP</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;msrdp</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Microsoft Remote Desktop Protocol</typehint>
+ </field>
+ <field>
+ <name>PCAnywhere</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;pcanywhere</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Symantec PC Anywhere</typehint>
+ </field>
+ <field>
+ <name>VNC</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;vnc</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Virtual Network Computing</typehint>
+ </field>
+ <field>
+ <name>Messengers</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>AIM</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;aolinstantmessenger</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>AOL Instant Messenger</typehint>
+ </field>
+ <field>
+ <name>Facetime</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;facetime</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Facetime</typehint>
+ </field>
+ <field>
+ <name>ICQ</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;icq</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>ICQ</typehint>
+ </field>
+ <field>
+ <name>IRC</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;irc</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Internet Relay Chat</typehint>
+ </field>
+ <field>
+ <name>Jabber</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;jabber</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Jabber instant messenger</typehint>
+ </field>
+ <field>
+ <name>GoogleHangouts</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;googlehangouts</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Google Hangouts</typehint>
+ </field>
+ <field>
+ <name>MSN</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;msnmessenger</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>MSN Messenger</typehint>
+ </field>
+ <field>
+ <name>Teamspeak</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;teamspeak</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>TeamSpeak</typehint>
+ </field>
+ <field>
+ <name>Teamspeak3</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;teamspeak3</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>TeamSpeak 3</typehint>
+ </field>
+ <field>
+ <name>Ventrilo</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;ventrilo</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Ventrilo</typehint>
+ </field>
+ <field>
+ <name>VPN</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>PPTP</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;pptp</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Microsoft Point to Point tunneling protocol</typehint>
+ </field>
+ <field>
+ <name>IPSEC</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;ipsec</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>IPSEC VPN traffic</typehint>
+ </field>
+ <field>
+ <name>Multimedia/Streaming</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>iTunesRadio</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;itunesradio</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>iTunes Radio - this rule uses a LARGE port range, be aware that you may need to manually rearrange the resulting rules to correctly prioritize other traffic.</typehint>
+ </field>
+ <field>
+ <name>StreamingMP3</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;streamingmp3</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Streaming Media</typehint>
+ </field>
+ <field>
+ <name>RTSP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;rtsp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>RealTime streaming protocol</typehint>
+ </field>
+ <field>
+ <name>RTMP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;rtmp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Real-Time Messaging Protocol - Used by video streaming services such as Twitch.tv.</typehint>
+ </field>
+ <field>
+ <name>Web</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>HTTP</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;http</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>HTTP and HTTPS aka Web Traffic</typehint>
+ </field>
+ <field>
+ <name>Mail</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>SMTP</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;smtp</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Mail Protocol</typehint>
+ </field>
+ <field>
+ <name>POP3</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;pop3</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>POP3 Protocol</typehint>
+ </field>
+ <field>
+ <name>IMAP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;imap</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>IMAP Protocol</typehint>
+ </field>
+ <field>
+ <name>LotusNotes</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;lotusnotes</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Lotus Notes</typehint>
+ </field>
+ <field>
+ <name>Game Downloader</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>BattleNetDownloader</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;battlenetdownloader</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Battle.NET Downloader</typehint>
+ </field>
+ <field>
+ <name>SteamDownloader</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;steamdownloader</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Steam Downloader</typehint>
+ </field>
+ <field>
+ <name>Miscellaneous</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>APNS</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;apns</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Apple Push Notification Service</typehint>
+ </field>
+ <field>
+ <name>AppleMobileSync</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;applemobilesync</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Apple Mobile Sync</typehint>
+ </field>
+ <field>
+ <name>CrashPlan</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;crashplan</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>CrashPlan</typehint>
+ </field>
+ <field>
+ <name>CVSUP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;cvsup</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>CVSUP</typehint>
+ </field>
+ <field>
+ <name>DNS</name>
+ <type>select</type>
+ <bindstofield>ezshaper-&gt;step7-&gt;dns</bindstofield>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Domain Name Services</typehint>
+ </field>
+ <field>
+ <name>Git</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;git</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Git Server</typehint>
+ </field>
+ <field>
+ <name>HBCI</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;hbci</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>HBCI</typehint>
+ </field>
+ <field>
+ <name>ICMP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;icmp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>ICMP Protocol</typehint>
+ </field>
+ <field>
+ <name>SMB</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;smb</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Microsoft SMB Protocol and friends</typehint>
+ </field>
+ <field>
+ <name>SNMP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;snmp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Simple Network Management Protocol</typehint>
+ </field>
+ <field>
+ <name>MySQLServer</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;mysqlserver</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>MySQL Server</typehint>
+ </field>
+ <field>
+ <name>NNTP</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;nntp</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Internet News</typehint>
+ </field>
+ <field>
+ <name>Slingbox</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;slingbox</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Slingbox</typehint>
+ </field>
+ <field>
+ <name>Subversion</name>
+ <bindstofield>ezshaper-&gt;step7-&gt;subversion</bindstofield>
+ <type>select</type>
+ <options>
+ <option>
+ <name>Default priority</name>
+ <value>D</value>
+ </option>
+ <option>
+ <name>Higher priority</name>
+ <value>H</value>
+ </option>
+ <option>
+ <name>Lower priority</name>
+ <value>L</value>
+ </option>
+ </options>
+ <typehint>Subversion Server</typehint>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc</includefile>
+ </step>
+ <step>
+ <id>8</id>
+ <title>pfSense Traffic Shaper Wizard</title>
+ <field>
+ <name>Reload profile notice</name>
+ <type>listtopic</type>
+ </field>
+ <description> After pressing Finish the system will load the new profile.&lt;br/&gt; Please note that this may take a moment.&lt;br/&gt; Also note that the traffic shaper is stateful meaning that only new connections will be shaped.&lt;br/&gt; If this is an issue please reset the state table after loading the profile.&lt;br/&gt;</description>
+ <fields>
+ <field>
+ <name>Finish</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>step8_stepsubmitphpaction();</stepsubmitphpaction>
+ <includefile>/usr/local/www/wizards/traffic_shaper_wizard_multi_all.inc</includefile>
+ </step>
+</pfsensewizard>
diff --git a/src/usr/local/www/xmlrpc.php b/src/usr/local/www/xmlrpc.php
new file mode 100755
index 0000000..5fd022a
--- /dev/null
+++ b/src/usr/local/www/xmlrpc.php
@@ -0,0 +1,592 @@
+<?php
+/*
+ xmlrpc.php
+ Copyright (C) 2013-2015 Electric Sheep Fencing, LP
+ Copyright (C) 2009, 2010 Scott Ullrich
+ Copyright (C) 2005 Colin Smith
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/
+
+##|+PRIV
+##|*IDENT=page-xmlrpclibrary
+##|*NAME=XMLRPC Library page
+##|*DESCR=Allow access to the 'XMLRPC Library' page.
+##|*MATCH=xmlrpc.php*
+##|-PRIV
+
+require("config.inc");
+require("functions.inc");
+require_once("filter.inc");
+require("ipsec.inc");
+require("vpn.inc");
+require("shaper.inc");
+require("xmlrpc_server.inc");
+require("xmlrpc.inc");
+
+function xmlrpc_loop_detect() {
+ global $config;
+
+ /* grab sync to ip if enabled */
+ if ($config['hasync']) {
+ $synchronizetoip = $config['hasync']['synchronizetoip'];
+ }
+ if ($synchronizetoip) {
+ if ($synchronizetoip == $_SERVER['REMOTE_ADDR']) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+$xmlrpc_g = array(
+ "return" => array(
+ "true" => new XML_RPC_Response(new XML_RPC_Value(true, $XML_RPC_Boolean)),
+ "false" => new XML_RPC_Response(new XML_RPC_Value(false, $XML_RPC_Boolean)),
+ "authfail" => new XML_RPC_Response(new XML_RPC_Value(gettext("Authentication failed"), $XML_RPC_String))
+ )
+);
+
+/*
+ * pfSense XMLRPC errors
+ * $XML_RPC_erruser + 1 = Auth failure
+ */
+$XML_RPC_erruser = 200;
+
+/* EXPOSED FUNCTIONS */
+$exec_php_doc = gettext("XMLRPC wrapper for eval(). This method must be called with two parameters: a string containing the local system\'s password followed by the PHP code to evaluate.");
+$exec_php_sig = array(
+ array(
+ $XML_RPC_Boolean, // First signature element is return value.
+ $XML_RPC_String, // password
+ $XML_RPC_String, // shell code to exec
+ )
+);
+
+function xmlrpc_authfail() {
+ log_auth("webConfigurator authentication error for 'admin' from {$_SERVER['REMOTE_ADDR']}");
+}
+
+function exec_php_xmlrpc($raw_params) {
+ global $config, $xmlrpc_g;
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ $exec_php = $params[0];
+ eval($exec_php);
+ if ($toreturn) {
+ $response = XML_RPC_encode($toreturn);
+ return new XML_RPC_Response($response);
+ } else {
+ return $xmlrpc_g['return']['true'];
+ }
+}
+
+/*****************************/
+$exec_shell_doc = gettext("XMLRPC wrapper for mwexec(). This method must be called with two parameters: a string containing the local system\'s password followed by an shell command to execute.");
+$exec_shell_sig = array(
+ array(
+ $XML_RPC_Boolean, // First signature element is return value.
+ $XML_RPC_String, // password
+ $XML_RPC_String, // shell code to exec
+ )
+);
+
+function exec_shell_xmlrpc($raw_params) {
+ global $config, $xmlrpc_g;
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ $shell_cmd = $params[0];
+ mwexec($shell_cmd);
+
+ return $xmlrpc_g['return']['true'];
+}
+
+/*****************************/
+$backup_config_section_doc = gettext("XMLRPC wrapper for backup_config_section. This method must be called with two parameters: a string containing the local system\'s password followed by an array containing the keys to be backed up.");
+$backup_config_section_sig = array(
+ array(
+ $XML_RPC_Struct, // First signature element is return value.
+ $XML_RPC_String,
+ $XML_RPC_Array
+ )
+);
+
+function backup_config_section_xmlrpc($raw_params) {
+ global $config, $xmlrpc_g;
+
+ if (xmlrpc_loop_detect()) {
+ log_error("Disallowing CARP sync loop");
+ return;
+ }
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ $val = array_intersect_key($config, array_flip($params[0]));
+
+ return new XML_RPC_Response(XML_RPC_encode($val));
+}
+
+/*****************************/
+$restore_config_section_doc = gettext("XMLRPC wrapper for restore_config_section. This method must be called with two parameters: a string containing the local system\'s password and an array to merge into the system\'s config. This function returns true upon completion.");
+$restore_config_section_sig = array(
+ array(
+ $XML_RPC_Boolean,
+ $XML_RPC_String,
+ $XML_RPC_Struct
+ )
+);
+
+function restore_config_section_xmlrpc($raw_params) {
+ global $config, $xmlrpc_g;
+
+ $old_config = $config;
+
+ if (xmlrpc_loop_detect()) {
+ log_error("Disallowing CARP sync loop");
+ return;
+ }
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+
+ /*
+ * Make sure it doesn't end up with both dnsmasq and unbound enabled
+ * simultaneously in secondary
+ * */
+ if (isset($params[0]['unbound']['enable']) && isset($config['dnsmasq']['enable'])) {
+ unset($config['dnsmasq']['enable']);
+ services_dnsmasq_configure();
+ } else if (isset($params[0]['dnsmasq']['enable']) && isset($config['unbound']['enable'])) {
+ unset($config['unbound']['enable']);
+ services_unbound_configure();
+ }
+
+ // Some sections should just be copied and not merged or we end
+ // up unable to sync the deletion of the last item in a section
+ $sync_full = array('dnsmasq', 'unbound', 'ipsec', 'aliases', 'wol', 'load_balancer', 'openvpn', 'cert', 'ca', 'crl', 'schedules', 'filter', 'nat', 'dhcpd', 'dhcpv6');
+ $sync_full_done = array();
+ foreach ($sync_full as $syncfull) {
+ if (isset($params[0][$syncfull])) {
+ $config[$syncfull] = $params[0][$syncfull];
+ unset($params[0][$syncfull]);
+ $sync_full_done[] = $syncfull;
+ }
+ }
+
+ $vipbackup = array();
+ $oldvips = array();
+ if (isset($params[0]['virtualip'])) {
+ if (is_array($config['virtualip']['vip'])) {
+ foreach ($config['virtualip']['vip'] as $vipindex => $vip) {
+ if ($vip['mode'] == "carp") {
+ $oldvips["{$vip['interface']}_vip{$vip['vhid']}"]['content'] = "{$vip['password']}{$vip['advskew']}{$vip['subnet']}{$vip['subnet_bits']}{$vip['advbase']}";
+ $oldvips["{$vip['interface']}_vip{$vip['vhid']}"]['interface'] = $vip['interface'];
+ $oldvips["{$vip['interface']}_vip{$vip['vhid']}"]['subnet'] = $vip['subnet'];
+ } else if ($vip['mode'] == "ipalias" && (substr($vip['interface'], 0, 4) == '_vip' || strpos($vip['interface'], "lo0"))) {
+ $oldvips[$vip['subnet']]['content'] = "{$vip['interface']}{$vip['subnet']}{$vip['subnet_bits']}";
+ $oldvips[$vip['subnet']]['interface'] = $vip['interface'];
+ $oldvips[$vip['subnet']]['subnet'] = $vip['subnet'];
+ } else if (($vip['mode'] == "ipalias" || $vip['mode'] == 'proxyarp') && !(substr($vip['interface'], 0, 4) == '_vip') || strpos($vip['interface'], "lo0")) {
+ $vipbackup[] = $vip;
+ }
+ }
+ }
+ }
+
+ // For vip section, first keep items sent from the master
+ $config = array_merge_recursive_unique($config, $params[0]);
+
+ /* Then add ipalias and proxyarp types already defined on the backup */
+ if (is_array($vipbackup) && !empty($vipbackup)) {
+ if (!is_array($config['virtualip'])) {
+ $config['virtualip'] = array();
+ }
+ if (!is_array($config['virtualip']['vip'])) {
+ $config['virtualip']['vip'] = array();
+ }
+ foreach ($vipbackup as $vip) {
+ array_unshift($config['virtualip']['vip'], $vip);
+ }
+ }
+
+ /* Log what happened */
+ $mergedkeys = implode(",", array_merge(array_keys($params[0]), $sync_full_done));
+ write_config(sprintf(gettext("Merged in config (%s sections) from XMLRPC client."), $mergedkeys));
+
+ /*
+ * The real work on handling the vips specially
+ * This is a copy of intefaces_vips_configure with addition of not reloading existing/not changed carps
+ */
+ if (isset($params[0]['virtualip']) && is_array($config['virtualip']) && is_array($config['virtualip']['vip'])) {
+ $carp_setuped = false;
+ $anyproxyarp = false;
+ foreach ($config['virtualip']['vip'] as $vip) {
+ if ($vip['mode'] == "carp" && isset($oldvips["{$vip['interface']}_vip{$vip['vhid']}"])) {
+ if ($oldvips["{$vip['interface']}_vip{$vip['vhid']}"]['content'] == "{$vip['password']}{$vip['advskew']}{$vip['subnet']}{$vip['subnet_bits']}{$vip['advbase']}") {
+ if (does_vip_exist($vip)) {
+ unset($oldvips["{$vip['interface']}_vip{$vip['vhid']}"]);
+ continue; // Skip reconfiguring this vips since nothing has changed.
+ }
+ }
+ } else if ($vip['mode'] == "ipalias" && strstr($vip['interface'], "_vip") && isset($oldvips[$vip['subnet']])) {
+ if ($oldvips[$vip['subnet']]['content'] == "{$vip['interface']}{$vip['subnet']}{$vip['subnet_bits']}") {
+ if (does_vip_exist($vip)) {
+ unset($oldvips[$vip['subnet']]);
+ continue; // Skip reconfiguring this vips since nothing has changed.
+ }
+ }
+ unset($oldvips[$vip['subnet']]);
+ }
+
+ switch ($vip['mode']) {
+ case "proxyarp":
+ $anyproxyarp = true;
+ break;
+ case "ipalias":
+ interface_ipalias_configure($vip);
+ break;
+ case "carp":
+ if ($carp_setuped == false) {
+ $carp_setuped = true;
+ }
+ interface_carp_configure($vip);
+ break;
+ }
+ }
+ /* Cleanup remaining old carps */
+ foreach ($oldvips as $oldvipar) {
+ $oldvipif = get_real_interface($oldvipar['interface']);
+ if (!empty($oldvipif)) {
+ if (is_ipaddrv6($oldvipar['subnet'])) {
+ mwexec("/sbin/ifconfig " . escapeshellarg($oldvipif) . " inet6 " . escapeshellarg($oldvipar['subnet']) . " delete");
+ } else {
+ pfSense_interface_deladdress($oldvipif, $oldvipar['subnet']);
+ }
+ }
+ }
+ if ($carp_setuped == true) {
+ interfaces_sync_setup();
+ }
+ if ($anyproxyarp == true) {
+ interface_proxyarp_configure();
+ }
+ }
+
+ if (isset($old_config['ipsec']['enable']) !== isset($config['ipsec']['enable'])) {
+ vpn_ipsec_configure();
+ }
+
+ unset($old_config);
+
+ return $xmlrpc_g['return']['true'];
+}
+
+/*****************************/
+$merge_config_section_doc = gettext("XMLRPC wrapper for merging package sections. This method must be called with two parameters: a string containing the local system\'s password and an array to merge into the system\'s config. This function returns true upon completion.");
+$merge_config_section_sig = array(
+ array(
+ $XML_RPC_Boolean,
+ $XML_RPC_String,
+ $XML_RPC_Struct
+ )
+);
+
+function merge_installedpackages_section_xmlrpc($raw_params) {
+ global $config, $xmlrpc_g;
+
+ if (xmlrpc_loop_detect()) {
+ log_error("Disallowing CARP sync loop");
+ return;
+ }
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ $config['installedpackages'] = array_merge($config['installedpackages'], $params[0]);
+ $mergedkeys = implode(",", array_keys($params[0]));
+ write_config(sprintf(gettext("Merged in config (%s sections) from XMLRPC client."), $mergedkeys));
+
+ return $xmlrpc_g['return']['true'];
+}
+
+/*****************************/
+$merge_config_section_doc = gettext("XMLRPC wrapper for merge_config_section. This method must be called with two parameters: a string containing the local system\'s password and an array to merge into the system\'s config. This function returns true upon completion.");
+$merge_config_section_sig = array(
+ array(
+ $XML_RPC_Boolean,
+ $XML_RPC_String,
+ $XML_RPC_Struct
+ )
+);
+
+function merge_config_section_xmlrpc($raw_params) {
+ global $config, $xmlrpc_g;
+
+ if (xmlrpc_loop_detect()) {
+ log_error("Disallowing CARP sync loop");
+ return;
+ }
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ $config_new = array_overlay($config, $params[0]);
+ $config = $config_new;
+ $mergedkeys = implode(",", array_keys($params[0]));
+ write_config(sprintf(gettext("Merged in config (%s sections) from XMLRPC client."), $mergedkeys));
+ return $xmlrpc_g['return']['true'];
+}
+
+/*****************************/
+$filter_configure_doc = gettext("Basic XMLRPC wrapper for filter_configure. This method must be called with one parameter: a string containing the local system\'s password. This function returns true upon completion.");
+$filter_configure_sig = array(
+ array(
+ $XML_RPC_Boolean,
+ $XML_RPC_String
+ )
+);
+
+function filter_configure_xmlrpc($raw_params) {
+ global $xmlrpc_g, $config;
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ filter_configure();
+ system_routing_configure();
+ setup_gateways_monitor();
+ relayd_configure();
+ require_once("openvpn.inc");
+ openvpn_resync_all();
+ if (isset($config['dnsmasq']['enable'])) {
+ services_dnsmasq_configure();
+ } elseif (isset($config['unbound']['enable'])) {
+ services_unbound_configure();
+ } else {
+ # Both calls above run services_dhcpd_configure(), then we just
+ # need to call it when they are not called to avoid restarting dhcpd
+ # twice, as described on ticket #3797
+ services_dhcpd_configure();
+ }
+ local_sync_accounts();
+
+ return $xmlrpc_g['return']['true'];
+}
+
+/*****************************/
+$carp_configure_doc = gettext("Basic XMLRPC wrapper for configuring CARP interfaces.");
+$carp_configure_sig = array(
+ array(
+ $XML_RPC_Boolean,
+ $XML_RPC_String
+ )
+);
+
+function interfaces_carp_configure_xmlrpc($raw_params) {
+ global $xmlrpc_g;
+
+ if (xmlrpc_loop_detect()) {
+ log_error("Disallowing CARP sync loop");
+ return;
+ }
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ interfaces_vips_configure();
+
+ return $xmlrpc_g['return']['true'];
+}
+
+/*****************************/
+$check_firmware_version_doc = gettext("Basic XMLRPC wrapper for check_firmware_version. This function will return the output of check_firmware_version upon completion.");
+
+$check_firmware_version_sig = array(
+ array(
+ $XML_RPC_String,
+ $XML_RPC_String
+ )
+);
+
+function check_firmware_version_xmlrpc($raw_params) {
+ global $xmlrpc_g, $XML_RPC_String;
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ return new XML_RPC_Response(new XML_RPC_Value(check_firmware_version(false), $XML_RPC_String));
+}
+
+/*****************************/
+$pfsense_firmware_version_doc = gettext("Basic XMLRPC wrapper for check_firmware_version. This function will return the output of check_firmware_version upon completion.");
+
+$pfsense_firmware_version_sig = array (
+ array (
+ $XML_RPC_Struct,
+ $XML_RPC_String
+ )
+);
+
+function pfsense_firmware_version_xmlrpc($raw_params) {
+ global $xmlrpc_g;
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ return new XML_RPC_Response(XML_RPC_encode(host_firmware_version()));
+}
+
+/*****************************/
+$reboot_doc = gettext("Basic XMLRPC wrapper for rc.reboot.");
+$reboot_sig = array(array($XML_RPC_Boolean, $XML_RPC_String));
+function reboot_xmlrpc($raw_params) {
+ global $xmlrpc_g;
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ mwexec_bg("/etc/rc.reboot");
+
+ return $xmlrpc_g['return']['true'];
+}
+
+/*****************************/
+$get_notices_sig = array(
+ array(
+ $XML_RPC_Array,
+ $XML_RPC_String
+ ),
+ array(
+ $XML_RPC_Array
+ )
+);
+
+function get_notices_xmlrpc($raw_params) {
+ global $g, $xmlrpc_g;
+
+ $params = xmlrpc_params_to_php($raw_params);
+ if (!xmlrpc_auth($params)) {
+ xmlrpc_authfail();
+ return $xmlrpc_g['return']['authfail'];
+ }
+ if (!function_exists("get_notices")) {
+ require("notices.inc");
+ }
+ if (!$params) {
+ $toreturn = get_notices();
+ } else {
+ $toreturn = get_notices($params);
+ }
+ $response = new XML_RPC_Response(XML_RPC_encode($toreturn));
+
+ return $response;
+}
+
+$xmlrpclockkey = lock('xmlrpc', LOCK_EX);
+
+/*****************************/
+$server = new XML_RPC_Server(
+ array(
+ 'pfsense.exec_shell' => array('function' => 'exec_shell_xmlrpc',
+ 'signature' => $exec_shell_sig,
+ 'docstring' => $exec_shell_doc),
+ 'pfsense.exec_php' => array('function' => 'exec_php_xmlrpc',
+ 'signature' => $exec_php_sig,
+ 'docstring' => $exec_php_doc),
+ 'pfsense.filter_configure' => array('function' => 'filter_configure_xmlrpc',
+ 'signature' => $filter_configure_sig,
+ 'docstring' => $filter_configure_doc),
+ 'pfsense.interfaces_carp_configure' => array('function' => 'interfaces_carp_configure_xmlrpc',
+ 'docstring' => $carp_configure_sig),
+ 'pfsense.backup_config_section' => array('function' => 'backup_config_section_xmlrpc',
+ 'signature' => $backup_config_section_sig,
+ 'docstring' => $backup_config_section_doc),
+ 'pfsense.restore_config_section' => array('function' => 'restore_config_section_xmlrpc',
+ 'signature' => $restore_config_section_sig,
+ 'docstring' => $restore_config_section_doc),
+ 'pfsense.merge_config_section' => array('function' => 'merge_config_section_xmlrpc',
+ 'signature' => $merge_config_section_sig,
+ 'docstring' => $merge_config_section_doc),
+ 'pfsense.merge_installedpackages_section_xmlrpc' => array('function' => 'merge_installedpackages_section_xmlrpc',
+ 'signature' => $merge_config_section_sig,
+ 'docstring' => $merge_config_section_doc),
+ 'pfsense.check_firmware_version' => array('function' => 'check_firmware_version_xmlrpc',
+ 'signature' => $check_firmware_version_sig,
+ 'docstring' => $check_firmware_version_doc),
+ 'pfsense.host_firmware_version' => array('function' => 'pfsense_firmware_version_xmlrpc',
+ 'signature' => $pfsense_firmware_version_sig,
+ 'docstring' => $host_firmware_version_doc),
+ 'pfsense.reboot' => array('function' => 'reboot_xmlrpc',
+ 'signature' => $reboot_sig,
+ 'docstring' => $reboot_doc),
+ 'pfsense.get_notices' => array('function' => 'get_notices_xmlrpc',
+ 'signature' => $get_notices_sig)
+ )
+);
+
+unlock($xmlrpclockkey);
+
+function array_overlay($a1, $a2) {
+ foreach ($a1 as $k => $v) {
+ if (!array_key_exists($k, $a2)) {
+ continue;
+ }
+ if (is_array($v) && is_array($a2[$k])) {
+ $a1[$k] = array_overlay($v, $a2[$k]);
+ } else {
+ $a1[$k] = $a2[$k];
+ }
+ }
+ return $a1;
+}
+
+?>
diff --git a/src/usr/share/doc/legal/intel_ipw/LICENSE b/src/usr/share/doc/legal/intel_ipw/LICENSE
new file mode 100644
index 0000000..a3e83f5
--- /dev/null
+++ b/src/usr/share/doc/legal/intel_ipw/LICENSE
@@ -0,0 +1,207 @@
+ TERMS AND CONDITIONS
+ IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+
+Do not use or load this firmware (the "Software") until you have carefully read
+the following terms and conditions. By loading or using the Software, you agree
+to the terms of this Agreement. If you do not wish to so agree, do not install
+or use the Software.
+
+LICENSEES:
+
+Please note:
+
+* If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ applies.
+* If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ applies
+
+--------------------------------------------------------------------------------
+
+For OEMs, IHVs, and ISVs:
+
+LICENSE. This Software is licensed for use only in conjunction with Intel
+component products. Use of the Software in conjunction with non-Intel component
+products is not licensed hereunder. Subject to the terms of this Agreement,
+Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+license under Intel's copyrights to: (i) copy the Software internally for your
+own development and maintenance purposes; (ii) copy and distribute the Software
+to your end-users, but only under a license agreement with terms at least as
+restrictive as those contained in Intel's Final, Single User License Agreement,
+attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+documentation which may accompany the Software, but only in association with
+the Software.
+
+If you are not the final manufacturer or vendor of a computer system or software
+program incorporating the Software, then you may transfer a copy of the
+Software, including any related documentation (modified or unmodified) to your
+recipient for use in accordance with the terms of this Agreement, provided such
+recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+assign, sublicense, lease, or in any other way transfer or disclose Software to
+any third party. You may not, nor may you assist any other person or entity to
+modify, translate, convert to another programming language, decompile, reverse
+engineer, or disassemble any portion of the Software or otherwise attempt to
+derive source code from any object code modules of the Software or any internal
+data files generated by the Software. Your rights to redistribute the Software
+shall be contingent upon your installation of this Agreement in its entirety in
+the same directory as the Software.
+
+CONFIDENTIALITY. If you wish to have a third party consultant or subcontractor
+("Contractor") perform work on your behalf which involves access to or use of
+Software, you shall obtain a written confidentiality agreement from the
+Contractor which contains provisions with respect to access to or use of the
+Software no less restrictive than those set forth in this Agreement and
+excluding any distribution rights, and use for any other purpose. Except as
+expressly provided herein, you shall not disclose the terms or existence of
+this Agreement or use Intel's name in any publications, advertisements, or
+other announcements without Intel's prior written consent. You do not have any
+rights to use any Intel trademarks or logos.
+
+OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+any, are owned by Intel or its suppliers and licensors and may be protected by
+copyright, trademark, patent and trade secret law and international treaties.
+Any rights, express or implied, in the intellectual property embodied in the
+foregoing, other than those specified in this Agreement, are reserved by Intel
+and its suppliers and licensors or otherwise as set forth in any applicable
+open source license agreement. You will keep the Software free of liens,
+attachments, and other encumbrances. You agree not to remove any proprietary
+notices and/or any labels from the Software and accompanying materials without
+prior written approval by Intel
+
+LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+(INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+
+EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+or assume responsibility for the accuracy or completeness of any information,
+text, graphics, links or other items contained within the Software. You assume
+all liability, financial or otherwise, associated with Your use or disposition
+of the Software.
+
+APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+laws of State of California], excluding its principles of conflict of laws and
+the United Nations Convention on Contracts for the Sale of Goods.
+
+WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+this Agreement shall be effective unless in writing and signed by an officer of
+Intel. No failure or delay in exercising any right, power, or remedy under
+this Agreement shall operate as a waiver of any such right, power or remedy.
+Without limiting the foregoing, terms and conditions on any purchase orders or
+similar materials submitted by you to Intel, and any terms contained in Intel’s
+standard acknowledgment form that are in conflict with these terms, shall be of
+no force or effect.
+
+SEVERABILITY. If any provision of this Agreement is held by a court of
+competent jurisdiction to be contrary to law, such provision shall be changed
+and interpreted so as to best accomplish the objectives of the original
+provision to the fullest extent allowed by law and the remaining provisions of
+this Agreement shall remain in full force and effect.
+
+EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+applicable import and export regulations of the United States and of the
+countries in which each party transacts business, specifically including U.S.
+Export Administration Act and Export Administration Regulations. Each party
+shall comply with such laws and regulations, as well as all other laws and
+regulations applicable to the Software. Without limiting the generality of the
+foregoing, each party agrees that it will not export, re-export, transfer or
+divert any of the Software or the direct programs thereof to any restricted
+place or party in accordance with U.S. export regulations. Note that Software
+containing encryption may be subject to additional restrictions.
+
+GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+Use, duplication, or disclosure by the Government is subject to restrictions as
+set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+of the Software by the Government constitutes acknowledgment of Intel's
+proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+2200 Mission College Blvd., Santa Clara, CA 95052.
+
+TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+its terms. Upon termination, you will immediately destroy the Software or
+return all copies of the Software to Intel.
+
+--------------------------------------------------------------------------------
+
+EXHIBIT "A"
+
+SOFTWARE LICENSE AGREEMENT (Final, Single User)
+
+IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+
+Do not use or load this firmware image (the "Software") until you have carefully
+read the following terms and conditions. By loading or using the Software, you
+agree to the terms of this Agreement. If you do not wish to so agree, do not
+install or use the Software.
+
+LICENSE. You may copy and use the Software, subject to these conditions:
+1. This Software is licensed for use only in conjunction with Intel component
+ products. Use of the Software in conjunction with non-Intel component
+ products is not licensed hereunder.
+2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ Software except as provided in this Agreement, and you agree to prevent
+ unauthorized copying of the Software.
+3. You may not reverse engineer, decompile, or disassemble the Software.
+4. You may not sublicense the Software.
+5. The Software may contain the software or other property of third party
+ suppliers.
+
+OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+remains with Intel or its suppliers. The Software is copyrighted and protected
+by the laws of the United States and other countries, and international treaty
+provisions. You may not remove any copyright notices from the Software. Intel
+may make changes to the Software, or items referenced therein, at any time
+without notice, but is not obligated to support or update the Software. Except
+as otherwise expressly provided, Intel grants no express or implied right under
+Intel patents, copyrights, trademarks, or other intellectual property rights.
+You may transfer the Software only if a copy of this license accompanies the
+Software and the recipient agrees to be fully bound by these terms.
+
+EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+"AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+completeness of any information, text, graphics, links or other items contained
+within the Software.
+
+LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+BETWEEN JURISDICTIONS.
+
+TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+you violate its terms. Upon termination, you will immediately destroy the
+Software.
+
+APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+laws of California, excluding its principles of conflict of laws and the United
+Nations Convention on Contracts for the Sale of Goods. You may not export the
+Software in violation of applicable export laws and regulations. Intel is not
+obligated under any other agreements unless they are in writing and signed by
+an authorized representative
+of Intel.
+
+GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+Use, duplication, or disclosure by the Government is subject to restrictions as
+set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+of the Software by the Government constitutes acknowledgment of Intel's
+proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+2200 Mission College Blvd., Santa Clara, CA 95052.
+
+
+
+
+
diff --git a/src/usr/share/doc/legal/intel_iwi/LICENSE b/src/usr/share/doc/legal/intel_iwi/LICENSE
new file mode 100644
index 0000000..fa26c67
--- /dev/null
+++ b/src/usr/share/doc/legal/intel_iwi/LICENSE
@@ -0,0 +1,210 @@
+ TERMS AND CONDITIONS
+ IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+
+Do not use or load this firmware (the "Software") until you have carefully read
+the following terms and conditions. By loading or using the Software, you agree
+to the terms of this Agreement. If you do not wish to so agree, do not install
+or use the Software.
+
+LICENSEES:
+
+Please note:
+
+* If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ applies.
+* If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ applies
+
+--------------------------------------------------------------------------------
+
+For OEMs, IHVs, and ISVs:
+
+LICENSE. This Software is licensed for use only in conjunction with Intel
+component products. Use of the Software in conjunction with non-Intel component
+products is not licensed hereunder. Subject to the terms of this Agreement,
+Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+license under Intel's copyrights to: (i) copy the Software internally for your
+own development and maintenance purposes; (ii) copy and distribute the Software
+to your end-users, but only under a license agreement with terms at least as
+restrictive as those contained in Intel's Final, Single User License Agreement,
+attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+documentation which may accompany the Software, but only in association with
+the Software.
+
+If you are not the final manufacturer or vendor of a computer system or software
+program incorporating the Software, then you may transfer a copy of the
+Software, including any related documentation (modified or unmodified) to your
+recipient for use in accordance with the terms of this Agreement, provided such
+recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+assign, sublicense, lease, or in any other way transfer or disclose Software to
+any third party. You may not, nor may you assist any other person or entity to
+modify, translate, convert to another programming language, decompile, reverse
+engineer, or disassemble any portion of the Software or otherwise attempt to
+derive source code from any object code modules of the Software or any internal
+data files generated by the Software. Your rights to redistribute the Software
+shall be contingent upon your installation of this Agreement in its entirety in
+the same directory as the Software.
+
+CONTRACTORS. For the purpose of this Agreement, and notwithstanding anything
+to the contrary hereunder, solely with respect to the requirements for
+compliance with the terms hereunder, any contractors or consultants that You
+use to perform the work or otherwise assist You in the development or products
+using this Software shall be deemed to be End Users and accordingly, upon
+receipt of the Software, shall be bound by the terms of Exhibit A, Software
+License Agreement. No additional agreement between You and such consultants or
+contractors is required under this Agreement to detail such compliance.
+
+TRADEMARKS. Except as expressly provided herein, you shall not use Intel's
+name in any publications, advertisements, or other announcements without
+Intel's prior written consent. You do not have any rights to use any Intel
+trademarks or logos.
+
+OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+any, are owned by Intel or its suppliers and licensors and may be protected by
+copyright, trademark, patent and trade secret law and international treaties.
+Any rights, express or implied, in the intellectual property embodied in the
+foregoing, other than those specified in this Agreement, are reserved by Intel
+and its suppliers and licensors or otherwise as set forth in any applicable
+open source license agreement. You will keep the Software free of liens,
+attachments, and other encumbrances. You agree not to remove any proprietary
+notices and/or any labels from the Software and accompanying materials without
+prior written approval by Intel
+
+LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+(INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+
+EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+or assume responsibility for the accuracy or completeness of any information,
+text, graphics, links or other items contained within the Software. You assume
+all liability, financial or otherwise, associated with Your use or disposition
+of the Software.
+
+APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+laws of State of California], excluding its principles of conflict of laws and
+the United Nations Convention on Contracts for the Sale of Goods.
+
+WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+this Agreement shall be effective unless in writing and signed by an officer of
+Intel. No failure or delay in exercising any right, power, or remedy under
+this Agreement shall operate as a waiver of any such right, power or remedy.
+Without limiting the foregoing, terms and conditions on any purchase orders or
+similar materials submitted by you to Intel, and any terms contained in Intel’s
+standard acknowledgment form that are in conflict with these terms, shall be of
+no force or effect.
+
+SEVERABILITY. If any provision of this Agreement is held by a court of
+competent jurisdiction to be contrary to law, such provision shall be changed
+and interpreted so as to best accomplish the objectives of the original
+provision to the fullest extent allowed by law and the remaining provisions of
+this Agreement shall remain in full force and effect.
+
+EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+applicable import and export regulations of the United States and of the
+countries in which each party transacts business, specifically including U.S.
+Export Administration Act and Export Administration Regulations. Each party
+shall comply with such laws and regulations, as well as all other laws and
+regulations applicable to the Software. Without limiting the generality of the
+foregoing, each party agrees that it will not export, re-export, transfer or
+divert any of the Software or the direct programs thereof to any restricted
+place or party in accordance with U.S. export regulations. Note that Software
+containing encryption may be subject to additional restrictions.
+
+GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+Use, duplication, or disclosure by the Government is subject to restrictions as
+set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+of the Software by the Government constitutes acknowledgment of Intel's
+proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+2200 Mission College Blvd., Santa Clara, CA 95052.
+
+TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+its terms. Upon termination, you will immediately destroy the Software or
+return all copies of the Software to Intel.
+
+--------------------------------------------------------------------------------
+
+EXHIBIT "A"
+
+SOFTWARE LICENSE AGREEMENT (Final, Single User)
+
+IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+
+Do not use or load this firmware image (the "Software") until you have carefully
+read the following terms and conditions. By loading or using the Software, you
+agree to the terms of this Agreement. If you do not wish to so agree, do not
+install or use the Software.
+
+LICENSE. You may copy and use the Software, subject to these conditions:
+1. This Software is licensed for use only in conjunction with Intel component
+ products. Use of the Software in conjunction with non-Intel component
+ products is not licensed hereunder.
+2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ Software except as provided in this Agreement, and you agree to prevent
+ unauthorized copying of the Software.
+3. You may not reverse engineer, decompile, or disassemble the Software.
+4. You may not sublicense the Software.
+5. The Software may contain the software or other property of third party
+ suppliers.
+
+OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+remains with Intel or its suppliers. The Software is copyrighted and protected
+by the laws of the United States and other countries, and international treaty
+provisions. You may not remove any copyright notices from the Software. Intel
+may make changes to the Software, or items referenced therein, at any time
+without notice, but is not obligated to support or update the Software. Except
+as otherwise expressly provided, Intel grants no express or implied right under
+Intel patents, copyrights, trademarks, or other intellectual property rights.
+You may transfer the Software only if a copy of this license accompanies the
+Software and the recipient agrees to be fully bound by these terms.
+
+EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+"AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+completeness of any information, text, graphics, links or other items contained
+within the Software.
+
+LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+BETWEEN JURISDICTIONS.
+
+TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+you violate its terms. Upon termination, you will immediately destroy the
+Software.
+
+APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+laws of California, excluding its principles of conflict of laws and the United
+Nations Convention on Contracts for the Sale of Goods. You may not export the
+Software in violation of applicable export laws and regulations. Intel is not
+obligated under any other agreements unless they are in writing and signed by
+an authorized representative
+of Intel.
+
+GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+Use, duplication, or disclosure by the Government is subject to restrictions as
+set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+of the Software by the Government constitutes acknowledgment of Intel's
+proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+2200 Mission College Blvd., Santa Clara, CA 95052.
+
+
+
+
+
diff --git a/src/usr/share/doc/legal/intel_wpi/LICENSE b/src/usr/share/doc/legal/intel_wpi/LICENSE
new file mode 100644
index 0000000..c2a84d4
--- /dev/null
+++ b/src/usr/share/doc/legal/intel_wpi/LICENSE
@@ -0,0 +1,39 @@
+Copyright (c) 2006, Intel Corporation.
+All rights reserved.
+
+Redistribution. Redistribution and use in binary form, without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions must reproduce the above copyright notice and the
+ following disclaimer in the documentation and/or other materials
+ provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its suppliers
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+* No reverse engineering, decompilation, or disassembly of this software
+ is permitted.
+
+Limited patent license. Intel Corporation grants a world-wide,
+royalty-free, non-exclusive license under patents it now or hereafter
+owns or controls to make, have made, use, import, offer to sell and
+sell ("Utilize") this software, but solely to the extent that any
+such patent is necessary to Utilize the software alone, or in
+combination with an operating system licensed under an approved Open
+Source license as listed by the Open Source Initiative at
+http://opensource.org/licenses. The patent license shall not apply to
+any other combinations which include this software. No hardware per
+se is licensed hereunder.
+
+DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
diff --git a/src/usr/share/zoneinfo.tgz b/src/usr/share/zoneinfo.tgz
new file mode 100644
index 0000000..410a41f
--- /dev/null
+++ b/src/usr/share/zoneinfo.tgz
Binary files differ
OpenPOWER on IntegriCloud